ZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL0FuZHJvaWQubWsgYi9saWIvb3BlbnNzbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTEyM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsOSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitzdWJkaXJzIDo9ICQoYWRkcHJlZml4ICQoTE9DQUxfUEFUSCkvLCQoYWRkc3VmZml4IC9BbmRyb2lkLm1rLCBcCisJCWNyeXB0byBcCisJCXNzbCBcCisJCWFwcHMgXAorCSkpCisKK2luY2x1ZGUgJChzdWJkaXJzKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvQ2xlYW5TcGVjLm1rIGIvbGliL29wZW5zc2wvQ2xlYW5TcGVjLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNTUxODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9DbGVhblNwZWMubWsKQEAgLTAsMCArMSw1NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyBJZiB5b3UgZG9uJ3QgbmVlZCB0byBkbyBhIGZ1bGwgY2xlYW4gYnVpbGQgYnV0IHdvdWxkIGxpa2UgdG8gdG91Y2gKKyMgYSBmaWxlIG9yIGRlbGV0ZSBzb21lIGludGVybWVkaWF0ZSBmaWxlcywgYWRkIGEgY2xlYW4gc3RlcCB0byB0aGUgZW5kCisjIG9mIHRoZSBsaXN0LiAgVGhlc2Ugc3RlcHMgd2lsbCBvbmx5IGJlIHJ1biBvbmNlLCBpZiB0aGV5IGhhdmVuJ3QgYmVlbgorIyBydW4gYmVmb3JlLgorIworIyBFLmcuOgorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCB0b3VjaCAtYyBleHRlcm5hbC9zcWxpdGUvc3FsaXRlMy5oKQorIyAgICAgJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliel9pbnRlcm1lZGlhdGVzKQorIworIyBBbHdheXMgdXNlICJ0b3VjaCAtYyIgYW5kICJybSAtZiIgb3IgInJtIC1yZiIgdG8gZ3JhY2VmdWxseSBkZWFsIHdpdGgKKyMgZmlsZXMgdGhhdCBhcmUgbWlzc2luZyBvciBoYXZlIGJlZW4gbW92ZWQuCisjCisjIFVzZSAkKFBST0RVQ1RfT1VUKSB0byBnZXQgdG8gdGhlICJvdXQvdGFyZ2V0L3Byb2R1Y3QvYmxhaC8iIGRpcmVjdG9yeS4KKyMgVXNlICQoT1VUX0RJUikgdG8gcmVmZXIgdG8gdGhlICJvdXQiIGRpcmVjdG9yeS4KKyMKKyMgSWYgeW91IG5lZWQgdG8gcmUtZG8gc29tZXRoaW5nIHRoYXQncyBhbHJlYWR5IG1lbnRpb25lZCwganVzdCBjb3B5CisjIHRoZSBjb21tYW5kIGFuZCBhZGQgaXQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgbGlzdC4gIEUuZy4sIGlmIGEgY2hhbmdlCisjIHRoYXQgeW91IG1hZGUgbGFzdCB3ZWVrIHJlcXVpcmVkIHRvdWNoaW5nIGEgZmlsZSBhbmQgYSBjaGFuZ2UgeW91CisjIG1hZGUgdG9kYXkgcmVxdWlyZXMgdG91Y2hpbmcgdGhlIHNhbWUgZmlsZSwganVzdCBjb3B5IHRoZSBvbGQKKyMgdG91Y2ggc3RlcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisjCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyMgRm9yIGV4YW1wbGU6CisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChPVVRfRElSKS90YXJnZXQvY29tbW9uL29iai9BUFBTL0FuZHJvaWRUZXN0c19pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY29yZV9pbnRlcm1lZGlhdGVzKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgZmluZCAkKE9VVF9ESVIpIC10eXBlIGYgLW5hbWUgIklHVGFsa1Nlc3Npb24qIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYpCisjJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvZGF0YS8qKQorJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvb2JqL0VYRUNVVEFCTEVTL29wZW5zc2xfaW50ZXJtZWRpYXRlcykKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9FWEVDVVRBQkxFUy9vcGVuc3NsX2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJjcnlwdG9faW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJzc2xfaW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovRVhFQ1VUQUJMRVMvb3BlbnNzbF9pbnRlcm1lZGlhdGVzICQoUFJPRFVDVF9PVVQpL29iai9FWEVDVVRBQkxFUy9zc2x0ZXN0X2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJjcnlwdG9faW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJzc2xfaW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovRVhFQ1VUQUJMRVMvb3BlbnNzbF9pbnRlcm1lZGlhdGVzICQoUFJPRFVDVF9PVVQpL29iai9FWEVDVVRBQkxFUy9zc2x0ZXN0X2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJjcnlwdG9faW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJzc2xfaW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovRVhFQ1VUQUJMRVMvb3BlbnNzbF9pbnRlcm1lZGlhdGVzICQoUFJPRFVDVF9PVVQpL29iai9FWEVDVVRBQkxFUy9zc2x0ZXN0X2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJjcnlwdG9faW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJzc2xfaW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovRVhFQ1VUQUJMRVMvb3BlbnNzbF9pbnRlcm1lZGlhdGVzICQoUFJPRFVDVF9PVVQpL29iai9FWEVDVVRBQkxFUy9zc2x0ZXN0X2ludGVybWVkaWF0ZXMpCiskKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJjcnlwdG9faW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovU0hBUkVEX0xJQlJBUklFUy9saWJzc2xfaW50ZXJtZWRpYXRlcyAkKFBST0RVQ1RfT1VUKS9vYmovRVhFQ1VUQUJMRVMvb3BlbnNzbF9pbnRlcm1lZGlhdGVzICQoUFJPRFVDVF9PVVQpL29iai9FWEVDVVRBQkxFUy9zc2x0ZXN0X2ludGVybWVkaWF0ZXMpCisKKyMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIE5FV0VSIENMRUFOIFNURVBTIE1VU1QgQkUgQVQgVEhFIEVORCBPRiBUSEUgTElTVAorIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFIGIvbGliL29wZW5zc2wvTU9EVUxFX0xJQ0VOU0VfQlNEX0xJS0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9OT1RJQ0UgYi9saWIvb3BlbnNzbC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJjNGFkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL05PVElDRQpAQCAtMCwwICsxLDEyNyBAQAorCisgIExJQ0VOU0UgSVNTVUVTCisgID09PT09PT09PT09PT09CisKKyAgVGhlIE9wZW5TU0wgdG9vbGtpdCBzdGF5cyB1bmRlciBhIGR1YWwgbGljZW5zZSwgaS5lLiBib3RoIHRoZSBjb25kaXRpb25zIG9mCisgIHRoZSBPcGVuU1NMIExpY2Vuc2UgYW5kIHRoZSBvcmlnaW5hbCBTU0xlYXkgbGljZW5zZSBhcHBseSB0byB0aGUgdG9vbGtpdC4KKyAgU2VlIGJlbG93IGZvciB0aGUgYWN0dWFsIGxpY2Vuc2UgdGV4dHMuIEFjdHVhbGx5IGJvdGggbGljZW5zZXMgYXJlIEJTRC1zdHlsZQorICBPcGVuIFNvdXJjZSBsaWNlbnNlcy4gSW4gY2FzZSBvZiBhbnkgbGljZW5zZSBpc3N1ZXMgcmVsYXRlZCB0byBPcGVuU1NMCisgIHBsZWFzZSBjb250YWN0IG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKworICBPcGVuU1NMIExpY2Vuc2UKKyAgLS0tLS0tLS0tLS0tLS0tCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisgT3JpZ2luYWwgU1NMZWF5IExpY2Vuc2UKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL1JFQURNRS5hbmRyb2lkIGIvbGliL29wZW5zc2wvUkVBRE1FLmFuZHJvaWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5ZTk2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL1JFQURNRS5hbmRyb2lkCkBAIC0wLDAgKzEsOTEgQEAKK09wZW5TU0wgb24gdGhlIEFuZHJvaWQgcGxhdGZvcm0uCistLS0KKworVGhlIGNvZGUgaW4gdGhpcyBkaXJlY3RvcnkgaXMgYmFzZWQgb24gJE9QRU5TU0xfVkVSU0lPTiBpbiB0aGUgZmlsZQorb3BlbnNzbC52ZXJzaW9uLiBTZWUgcGF0Y2hlcy9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRoZQorY29kZSBkaWZmZXJzIGZyb20gJE9QRU5TU0xfVkVSU0lPTi4KKworUG9ydGluZyBOZXcgVmVyc2lvbnMgb2YgT3BlblNTTC4KKy0tCisKK1RoZSBmb2xsb3dpbmcgc3RlcHMgYXJlIHJlY29tbWVuZGVkIGZvciBwb3J0aW5nIG5ldyBPcGVuU1NMIHZlcnNpb25zLgorCisxKSBSZXRyaWV2ZSB0aGUgYXBwcm9wcmlhdGUgdmVyc2lvbiBvZiB0aGUgT3BlblNTTCBzb3VyY2UgZnJvbQorICAgd3d3Lm9wZW5zc2wub3JnL3NvdXJjZSAoaW4gb3BlbnNzbC0qLnRhci5neiBmaWxlKS4gQ2hlY2sgdGhlIFBHUAorICAgc2lnbmF0dXJlIChmb3VuZCBpbiBtYXRjaGluZyBvcGVuc3NsLSoudGFyLmd6LmFzYyBmaWxlKSB3aXRoOgorCisgICAgIGdwZyBvcGVuc3NsLSoudGFyLmd6LmFzYworCisgICBJZiB0aGUgcHVibGljIGtleSBpcyBub3QgZm91bmQsIGltcG9ydCB0aGUgdGhlIG9uZSB3aXRoIHRoZQorICAgbWF0Y2hpbmcgUlNBIGtleSBJRCBmcm9tIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvYWJvdXQvLCB1c2luZzoKKworICAgICBncGcgLS1pbXBvcnQgIyBwYXN0ZSBQR1AgcHVibGljIGtleSBibG9jayBvbiBzdGRpbgorCisyKSBVcGRhdGUgdGhlIHZhcmlhYmxlcyBpbiBvcGVuc3NsLmNvbmZpZyBhbmQgb3BlbnNzbC52ZXJzaW9uIGFzIGFwcHJvcHJpYXRlLgorICAgQXQgdGhlIHZlcnkgbGVhc3QgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlIG9wZW5zc2wudmVyc2lvbi4KKworMykgUnVuOgorCisgICAgIC4vaW1wb3J0X29wZW5zc2wuc2ggaW1wb3J0IG9wZW5zc2wtKi50YXIuZ3oKKworNCkgSWYgdGhlcmUgYXJlIGFueSBlcnJvcnMsIHRoZW4gbW9kaWZ5IG9wZW5zc2wuY29uZmlnLCBvcGVuc3NsLnZlcnNpb24KKyAgIGFuZCBwYXRjaGVzIGluIHBhdGNoZXMvIGFzIGFwcHJvcHJpYXRlLiAgWW91IG1pZ2h0IHdhbnQgdG8gdXNlOgorCisgICAgIC4vaW1wb3J0X29wZW5zc2wuc2ggcmVnZW5lcmF0ZSBwYXRjaGVzLyoucGF0Y2gKKworICAgUmVwZWF0IHN0ZXAgMy4KKworNSkgQ2xlYW51cCBiZWZvcmUgYnVpbGRpbmcgd2l0aDoKKworICAgICBtIC1qMTYgY2xlYW4tbGliY3J5cHRvIGNsZWFuLWxpYnNzbCBjbGVhbi1vcGVuc3NsIGNsZWFuLXNzbHRlc3QKKworNikgQnVpbGQgb3BlbnNzbCBmcm9tIHRoZSBleHRlcm5hbC9vcGVuc3NsIGRpcmVjdG9yeSB3aXRoOgorCisgICAgIG1tIC1qMTYgc25vZCAmJiBhZGIgc3luYyBzeXN0ZW0KKworICAgSWYgdGhlcmUgYXJlIGJ1aWxkIGVycm9ycywgdGhlbiBwYXRjaGVzLyoubWssIG9wZW5zc2wuY29uZmlnLCBvcgorICAgYW5kcm9pZC1jb25maWcubWsgbWF5IG5lZWQgdXBkYXRpbmcuCisKKzcpIFJ1biB0ZXN0cyB0byBtYWtlIHN1cmUgdGhpbmdzIGFyZSB3b3JraW5nOgorCisgICAgICMgUnVuIGxvY2FsIG9wZW5zc2wgdGVzdHMKKyAgICAgKGNkIGFuZHJvaWQudGVzdHNzbC8gJiYgLi90ZXN0c3NsLnNoKQorICAgICAjIEJ1aWxkIGFuZCBzeW5jIGxpYmNvcmUgdGVzdHMKKyAgICAgKGNyb290ICYmIGNkIGxpYmNvcmUgJiYgbW0gLWoxNiBzbm9kICYmIGFkYiByZW1vdW50ICYmIGFkYiBzeW5jKQorICAgICAjIFJ1biB0ZXN0cyBmcm9tIGxpYmNvcmUKKyAgICAgKGNyb290ICYmIHZvZ2FyIC0tY2xhc3NwYXRoIG91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9jb3JlLXRlc3RzLXN1cHBvcnRfaW50ZXJtZWRpYXRlcy9jbGFzc2VzLmphciAtLWNsYXNzcGF0aCBvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvY29yZS10ZXN0c19pbnRlcm1lZGlhdGVzL2NsYXNzZXMuamFyIGphdmF4Lm5ldC5zc2wgdGVzdHMuYXBpLmphdmF4Lm5ldCkKKyAgICAgIyBSdW4gdGVzdHMgZnJvbSBIYXJtb255CisgICAgIChjcm9vdCAmJiB2b2dhciAtLWNsYXNzcGF0aCBoYXJtb255X3Rlc3RzLmphciB0ZXN0cy5hcGkuamF2YS5tYXRoLkJpZ0ludGVnZXJUZXN0IG9yZy5hcGFjaGUuaGFybW9ueS50ZXN0cy5qYXZhLm1hdGgpCisgICAgICMgdHJ5IGFuIGh0dHBzIHdlYnNpdGUKKyAgICAgYWRiIHNoZWxsIGFtIHN0YXJ0IGh0dHBzOi8vb25saW5lLmNpdGliYW5rLmNvbSAjIGNvbmZpcm0gcmVzdWx0IGluIGJyb3dzZXIKKworICAgICBUaGUgdm9nYXIgdG9vbCBjYW4gYmUgZm91bmQgZXh0ZXJuYWxseSBhdCBodHRwOi8vY29kZS5nb29nbGUuY29tL3Avdm9nYXIvCisgICAgIFdpdGhpbiBHb29nbGUgaXQgY2FuIGJlIHJ1biB3aXRoIH5kYWx2aWstcHJlYnVpbGQvdm9nYXIvYmluL3ZvZ2FyCisKKyAgICAgaGFybW9ueV90ZXN0cy5qYXIgaXMgYnVpbHQgZnJvbSBTdWJ2ZXJzaW9uIGh0dHA6Ly9oYXJtb255LmFwYWNoZS5vcmcvCisgICAgIFdpdGhpbiBHb29nbGUgaXQgY2FuIGJlIGZvdW5kIGF0IH5kYWx2aWstcHJlYnVpbGQvYmluL2hhcm1vbnlfdGVzdHMuamFyCisKKyAgICAgIyBZb3UgY2FuIGFsc28gcnVuIG9wZW5zc2wgc19zZXJ2ZXIgYXMgYSB0ZXN0IHNlcnZlciBvbiB0aGUgZGV2aWNlOgorICAgICBhZGIgcHVzaCAuL2FuZHJvaWQudGVzdHNzbC9DQXNzLmNuZiAvc2RjYXJkL0NBc3MuY25mCisgICAgIGFkYiBzaGVsbCBvcGVuc3NsIHJlcSAtY29uZmlnIC9zZGNhcmQvQ0Fzcy5jbmYgLXg1MDkgLW5vZGVzIC1kYXlzIDM2NSAtc3ViaiAnL0M9VVMvU1Q9Q2FsaWZvcm5pYS9MPU1vdW50YWluIFZpZXcvQ049bG9jYWxob3N0JyAtbmV3a2V5IHJzYToxMDI0IC1rZXlvdXQgL3NkY2FyZC9zZXJ2ZXIucGVtIC1vdXQgL3NkY2FyZC9zZXJ2ZXIucGVtCisgICAgIGFkYiBzaGVsbCBvcGVuc3NsIHNfc2VydmVyIC1jZXJ0IC9zZGNhcmQvc2VydmVyLnBlbSAtd3d3IC12ZXJpZnkgMQorICAgICBhZGIgc2hlbGwgYW0gc3RhcnQgaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzMyAjIGNvbmZpcm0gcmVzdWx0IGluIGJyb3dzZXIKKworOCkgRG8gYSBmdWxsIGJ1aWxkIGJlZm9yZSBjaGVja2luZyBpbjoKKworICAgICBtIC1qMTYKKworT3B0aW9uYWxseSwgY2hlY2sgd2hldGhlciBidWlsZCBmbGFncyAobG9jYXRlZCBpbiBhbmRyb2lkLWNvbmZpZy5taworbmVlZCB0byBiZSB1cGRhdGVkLiAgRG9pbmcgdGhpcyBzdGVwIHdpbGwgaGVscCBlbnN1cmUgdGhhdCB0aGUKK2NvbXBpbGVkIGxpYnJhcnkgaXMgYXBwcm9wcmlhdGVseSBvcHRpbWl6ZWQgZm9yIHNwZWVkIGFuZCBzaXplLiAgVG8KK3VwZGF0ZSBidWlsZCBmbGFnczoKKworYSkgc291cmNlIG9wZW5zc2wuY29uZmlnCitiKSB0YXIgLXp4ZiBvcGVuc3NsLSoudGFyLmd6CitjKSBjZCBvcGVuc3NsLSovCitkKSAuL0NvbmZpZ3VyZSAkQ09ORklHVVJFX0FSR1MKK2UpIGV4YW1pbmUgTWFrZWZpbGUgYW5kIGNvbXBhcmUgd2l0aCAuLi9hbmRyb2lkLWNvbmZpZy5taworZikgbW9kaWZ5IC4uL29wZW5zc2wuY29uZmlnIGFzIGFwcHJvcHJpYXRlIGFuZCBnbyB0byBzdGVwIDMpIGFib3ZlLgorCitBbHRlcm5hdGl2ZWx5LCAuIi9pbXBvcnRfb3BlbnNzbC5zaCBpbXBvcnQiIG5vdyBwcmludHMgdGhlCitwb3N0LUNvbmZpZ3VyZSBNYWtlZmlsZSBmb3IgcmV2aWV3IGJlZm9yZSBkZWxldGluZyBpbiBvbiBpbXBvcnQuCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9UaGlyZFBhcnR5UHJvamVjdC5wcm9wIGIvbGliL29wZW5zc2wvVGhpcmRQYXJ0eVByb2plY3QucHJvcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTY1MGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvVGhpcmRQYXJ0eVByb2plY3QucHJvcApAQCAtMCwwICsxLDEwIEBACisjIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjRnJpIEp1bCAxNiAxMDowMzowOSBQRFQgMjAxMAorY3VycmVudFZlcnNpb249MS4wLjBhCit2ZXJzaW9uPTEuMC4wYQoraXNOYXRpdmU9dHJ1ZQorZmVlZHVybD1odHRwXDovL3d3dy5vcGVuc3NsLm9yZy8KK25hbWU9b3BlbnNzbAora2V5d29yZHM9b3BlbnNzbAorb25EZXZpY2U9dHJ1ZQoraG9tZXBhZ2U9aHR0cFw6Ly93d3cub3BlbnNzbC5vcmcvCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hbmRyb2lkLWNvbmZpZy5tayBiL2xpYi9vcGVuc3NsL2FuZHJvaWQtY29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NmQ2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hbmRyb2lkLWNvbmZpZy5tawpAQCAtMCwwICsxLDE3IEBACisjCisjIFRoZXNlIGZsYWdzIHJlcHJlc2VudCB0aGUgYnVpbGQtdGltZSBjb25maWd1cmF0aW9uIG9mIG9wZW5zc2wgZm9yIGFuZHJvaWQKKyMKKyMgVGhleSB3ZXJlIHBydW5lZCBmcm9tIHRoZSAiTWFrZWZpbGUiIGdlbmVyYXRlZCBieSBydW5uaW5nIC4vQ29uZmlndXJlIGZyb20gaW1wb3J0X29wZW5zc2wuc2gKKyMKKworIyBGcm9tIENMRkFHPQkKK0xPQ0FMX0NGTEFHUyArPSAtRE9QRU5TU0xfVEhSRUFEUyAtRF9SRUVOVFJBTlQgLUREU09fRExGQ04gLURIQVZFX0RMRkNOX0ggLURMX0VORElBTiAjLURURVJNSU8KKworIyBGcm9tIERFUEZMQUc9CitMT0NBTF9DRkxBR1MgKz0gLURPUEVOU1NMX05PX0NBTUVMTElBIC1ET1BFTlNTTF9OT19DQVBJRU5HIC1ET1BFTlNTTF9OT19DQVNUIC1ET1BFTlNTTF9OT19DTVMgLURPUEVOU1NMX05PX0dNUCAtRE9QRU5TU0xfTk9fSURFQSAtRE9QRU5TU0xfTk9fSlBBS0UgLURPUEVOU1NMX05PX01EMiAtRE9QRU5TU0xfTk9fTURDMiAtRE9QRU5TU0xfTk9fUkM1IC1ET1BFTlNTTF9OT19TSEEwIC1ET1BFTlNTTF9OT19SRkMzNzc5IC1ET1BFTlNTTF9OT19TRUVEIC1ET1BFTlNTTF9OT19TVE9SRSAtRE9QRU5TU0xfTk9fV0hJUkxQT09MCisKKyMgRXh0cmEKK0xPQ0FMX0NGTEFHUyArPSAtRE9QRU5TU0xfTk9fSFcgLURPUEVOU1NMX05PX0VOR0lORSAtRFpMSUIKKworIyBEZWJ1ZworIyBMT0NBTF9DRkxBR1MgKz0gLURDSVBIRVJfREVCVUcKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FuZHJvaWQudGVzdHNzbC9DQXNzLmNuZiBiL2xpYi9vcGVuc3NsL2FuZHJvaWQudGVzdHNzbC9DQXNzLmNuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTczYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYW5kcm9pZC50ZXN0c3NsL0NBc3MuY25mCkBAIC0wLDAgKzEsNzYgQEAKKyMKKyMgU1NMZWF5IGV4YW1wbGUgY29uZmlndXJhdGlvbiBmaWxlLgorIyBUaGlzIGlzIG1vc3RseSBiZWluZyB1c2VkIGZvciBnZW5lcmF0aW9uIG9mIGNlcnRpZmljYXRlIHJlcXVlc3RzLgorIworCitSQU5ERklMRQkJPSAvc2RjYXJkL2FuZHJvaWQudGVzdHNzbC8ucm5kCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitbIHJlcSBdCitkZWZhdWx0X2JpdHMJCT0gNTEyCitkZWZhdWx0X2tleWZpbGUgCT0ga2V5U1MucGVtCitkaXN0aW5ndWlzaGVkX25hbWUJPSByZXFfZGlzdGluZ3Vpc2hlZF9uYW1lCitlbmNyeXB0X3JzYV9rZXkJCT0gbm8KK2RlZmF1bHRfbWQJCT0gc2hhMQorCitbIHJlcV9kaXN0aW5ndWlzaGVkX25hbWUgXQorY291bnRyeU5hbWUJCQk9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkKK2NvdW50cnlOYW1lX2RlZmF1bHQJCT0gQVUKK2NvdW50cnlOYW1lX3ZhbHVlCQk9IEFVCisKK29yZ2FuaXphdGlvbk5hbWUJCT0gT3JnYW5pemF0aW9uIE5hbWUgKGVnLCBjb21wYW55KQorb3JnYW5pemF0aW9uTmFtZV92YWx1ZQkJPSBEb2RneSBCcm90aGVycworCitjb21tb25OYW1lCQkJPSBDb21tb24gTmFtZSAoZWcsIFlPVVIgbmFtZSkKK2NvbW1vbk5hbWVfdmFsdWUJCT0gRG9kZ3kgQ0EKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1sgY2EgXQorZGVmYXVsdF9jYQk9IENBX2RlZmF1bHQJCSMgVGhlIGRlZmF1bHQgY2Egc2VjdGlvbgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworWyBDQV9kZWZhdWx0IF0KKworZGlyCQk9IC4vZGVtb0NBCQkjIFdoZXJlIGV2ZXJ5dGhpbmcgaXMga2VwdAorY2VydHMJCT0gJGRpci9jZXJ0cwkJIyBXaGVyZSB0aGUgaXNzdWVkIGNlcnRzIGFyZSBrZXB0CitjcmxfZGlyCQk9ICRkaXIvY3JsCQkjIFdoZXJlIHRoZSBpc3N1ZWQgY3JsIGFyZSBrZXB0CitkYXRhYmFzZQk9ICRkaXIvaW5kZXgudHh0CSMgZGF0YWJhc2UgaW5kZXggZmlsZS4KKyN1bmlxdWVfc3ViamVjdAk9IG5vCQkJIyBTZXQgdG8gJ25vJyB0byBhbGxvdyBjcmVhdGlvbiBvZgorCQkJCQkjIHNldmVyYWwgY3RpZmljYXRlcyB3aXRoIHNhbWUgc3ViamVjdC4KK25ld19jZXJ0c19kaXIJPSAkZGlyL25ld2NlcnRzCQkjIGRlZmF1bHQgcGxhY2UgZm9yIG5ldyBjZXJ0cy4KKworY2VydGlmaWNhdGUJPSAkZGlyL2NhY2VydC5wZW0gCSMgVGhlIENBIGNlcnRpZmljYXRlCitzZXJpYWwJCT0gJGRpci9zZXJpYWwgCQkjIFRoZSBjdXJyZW50IHNlcmlhbCBudW1iZXIKK2NybAkJPSAkZGlyL2NybC5wZW0gCQkjIFRoZSBjdXJyZW50IENSTAorcHJpdmF0ZV9rZXkJPSAkZGlyL3ByaXZhdGUvY2FrZXkucGVtIyBUaGUgcHJpdmF0ZSBrZXkKK1JBTkRGSUxFCT0gJGRpci9wcml2YXRlLy5yYW5kCSMgcHJpdmF0ZSByYW5kb20gbnVtYmVyIGZpbGUKKworeDUwOV9leHRlbnNpb25zCT0gdjNfY2EJCQkjIFRoZSBleHRlbnRpb25zIHRvIGFkZCB0byB0aGUgY2VydAorCituYW1lX29wdCAJPSBjYV9kZWZhdWx0CQkjIFN1YmplY3QgTmFtZSBvcHRpb25zCitjZXJ0X29wdCAJPSBjYV9kZWZhdWx0CQkjIENlcnRpZmljYXRlIGZpZWxkIG9wdGlvbnMKKworZGVmYXVsdF9kYXlzCT0gMzY1CQkJIyBob3cgbG9uZyB0byBjZXJ0aWZ5IGZvcgorZGVmYXVsdF9jcmxfZGF5cz0gMzAJCQkjIGhvdyBsb25nIGJlZm9yZSBuZXh0IENSTAorZGVmYXVsdF9tZAk9IG1kNQkJCSMgd2hpY2ggbWQgdG8gdXNlLgorcHJlc2VydmUJPSBubwkJCSMga2VlcCBwYXNzZWQgRE4gb3JkZXJpbmcKKworcG9saWN5CQk9IHBvbGljeV9hbnl0aGluZworCitbIHBvbGljeV9hbnl0aGluZyBdCitjb3VudHJ5TmFtZQkJPSBvcHRpb25hbAorc3RhdGVPclByb3ZpbmNlTmFtZQk9IG9wdGlvbmFsCitsb2NhbGl0eU5hbWUJCT0gb3B0aW9uYWwKK29yZ2FuaXphdGlvbk5hbWUJPSBvcHRpb25hbAorb3JnYW5pemF0aW9uYWxVbml0TmFtZQk9IG9wdGlvbmFsCitjb21tb25OYW1lCQk9IHN1cHBsaWVkCitlbWFpbEFkZHJlc3MJCT0gb3B0aW9uYWwKKworCisKK1sgdjNfY2EgXQorc3ViamVjdEtleUlkZW50aWZpZXI9aGFzaAorYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZDphbHdheXMsaXNzdWVyOmFsd2F5cworYmFzaWNDb25zdHJhaW50cyA9IENBOnRydWUscGF0aGxlbjoxCitrZXlVc2FnZSA9IGNSTFNpZ24sIGtleUNlcnRTaWduCitpc3N1ZXJBbHROYW1lPWlzc3Vlcjpjb3B5CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hbmRyb2lkLnRlc3Rzc2wvVXNzLmNuZiBiL2xpYi9vcGVuc3NsL2FuZHJvaWQudGVzdHNzbC9Vc3MuY25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZGNkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hbmRyb2lkLnRlc3Rzc2wvVXNzLmNuZgpAQCAtMCwwICsxLDM2IEBACisjCisjIFNTTGVheSBleGFtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyMgVGhpcyBpcyBtb3N0bHkgYmVpbmcgdXNlZCBmb3IgZ2VuZXJhdGlvbiBvZiBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4KKyMKKworUkFOREZJTEUJCT0gL3NkY2FyZC9hbmRyb2lkLnRlc3Rzc2wvLnJuZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworWyByZXEgXQorZGVmYXVsdF9iaXRzCQk9IDUxMgorZGVmYXVsdF9rZXlmaWxlIAk9IGtleVNTLnBlbQorZGlzdGluZ3Vpc2hlZF9uYW1lCT0gcmVxX2Rpc3Rpbmd1aXNoZWRfbmFtZQorZW5jcnlwdF9yc2Ffa2V5CQk9IG5vCitkZWZhdWx0X21kCQk9IG1kMgorCitbIHJlcV9kaXN0aW5ndWlzaGVkX25hbWUgXQorY291bnRyeU5hbWUJCQk9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkKK2NvdW50cnlOYW1lX2RlZmF1bHQJCT0gQVUKK2NvdW50cnlOYW1lX3ZhbHVlCQk9IEFVCisKK29yZ2FuaXphdGlvbk5hbWUgICAgICAgICAgICAgICAgPSBPcmdhbml6YXRpb24gTmFtZSAoZWcsIGNvbXBhbnkpCitvcmdhbml6YXRpb25OYW1lX3ZhbHVlICAgICAgICAgID0gRG9kZ3kgQnJvdGhlcnMKKworMC5jb21tb25OYW1lCQkJPSBDb21tb24gTmFtZSAoZWcsIFlPVVIgbmFtZSkKKzAuY29tbW9uTmFtZV92YWx1ZQkJPSBCcm90aGVyIDEKKworMS5jb21tb25OYW1lCQkJPSBDb21tb24gTmFtZSAoZWcsIFlPVVIgbmFtZSkKKzEuY29tbW9uTmFtZV92YWx1ZQkJPSBCcm90aGVyIDIKKworWyB2M19lZSBdCitzdWJqZWN0S2V5SWRlbnRpZmllcj1oYXNoCithdXRob3JpdHlLZXlJZGVudGlmaWVyPWtleWlkLGlzc3VlcjphbHdheXMKK2Jhc2ljQ29uc3RyYWludHMgPSBDQTpmYWxzZQora2V5VXNhZ2UgPSBub25SZXB1ZGlhdGlvbiwgZGlnaXRhbFNpZ25hdHVyZSwga2V5RW5jaXBoZXJtZW50Citpc3N1ZXJBbHROYW1lPWlzc3Vlcjpjb3B5CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FuZHJvaWQudGVzdHNzbC9zZXJ2ZXIyLnBlbSBiL2xpYi9vcGVuc3NsL2FuZHJvaWQudGVzdHNzbC9zZXJ2ZXIyLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI2NjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYW5kcm9pZC50ZXN0c3NsL3NlcnZlcjIucGVtCkBAIC0wLDAgKzEsMzc2IEBACitpc3N1ZXI9IC9DPUFVL1NUPVF1ZWVuc2xhbmQvTz1DcnlwdFNvZnQgUHR5IEx0ZC9DTj1UZXN0IENBICgxMDI0IGJpdCkKK3N1YmplY3Q9L0M9QVUvU1Q9UXVlZW5zbGFuZC9PPUNyeXB0U29mdCBQdHkgTHRkL0NOPVNlcnZlciB0ZXN0IGNlcnQgKDEwMjQgYml0KQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDTGpDQ0FaY0NBUUV3RFFZSktvWklodmNOQVFFRUJRQXdXekVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WCitCQWdUQ2xGMVpXVnVjMnhoYm1ReEdqQVlCZ05WQkFvVEVVTnllWEIwVTI5bWRDQlFkSGtnVEhSa01Sc3dHUVlECitWUVFERXhKVVpYTjBJRU5CSUNneE1ESTBJR0pwZENrd0hoY05PVGN3TmpBNU1UTTFOelUwV2hjTk9UZ3dOakE1CitNVE0xTnpVMFdqQmtNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERWFNQmdHCitBMVVFQ2hNUlEzSjVjSFJUYjJaMElGQjBlU0JNZEdReEpEQWlCZ05WQkFNVEcxTmxjblpsY2lCMFpYTjBJR05sCitjblFnS0RFd01qUWdZbWwwS1RDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXN4SDFQQlBtCitSa3hyUjExZVY0YnpOaTROOW4xMUNJOG5WMjkrQVJsVDErcURlL21qVlV2WGxtc3Ixdi92ZjcxRzlHZ3FvcFNhCis2UlhySUNMVmRrL0ZZWVl6aFB2bDFNK09yamFYREZPOEJ6QkFGMUxuejZjN2FSWnZHUkpOclJTcjJuWkVrcURmCitKVzlkWTdyMlZaRXBENVFldWFSWVVudUVDa3FlaWVCNjVHTUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRUUZBQU9CCitnUUNXc090YTZDMHdpVnpYejh3UG1KS3lUcnVyTWxnVXNzMmlTdVc5MzY2aXdvZlpkZHNOZzdGWG5pTXprSWY2CitkcDdqbm1XWndLWjljWHNOVVMybzRPTDA3cU9rMkhPeXdDMFlzTlpRc09CdTFDQlRZWWtJZWZEaUtGTDF6UUhoCis4bHd3TmQ0TlArT0UzTnpVTmtDZmg0RG5GZmc5V0hrWFVsRDVVcHhOUko0Z0pBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNYZ0lCQUFLQmdRQ3pFZlU4RStaR1RHdEhYVjVYaHZNMkxnMzJmWFVJanlkWGIzNEJHVlBYNm9ONythTlYKK1M5ZVdheXZXLys5L3ZVYjBhQ3FpbEpycEZlc2dJdFYyVDhWaGhqT0UrK1hVejQ2dU5wY01VN3dITUVBWFV1ZlAKK3B6dHBGbThaRWsydEZLdmFka1NTb044bGIxMWp1dlpWa1NrUGxCNjVwRmhTZTRRS1NwNko0SHJrWXdJREFRQUIKK0FvR0JBS3k4anZiMEx6Ynk4cTExeU5MZjcrNzh3Q1ZkWWk3dWdNSGNZQTFKVkZLOCt6YjFXZlNtNDRGTFFvLzAKK2RTQ2hBamd6MzZUVGV4ZUxPRFBZeGxlSm5kalZjT01WenNMSmpTTThkTHBYc1RTNEZDZU1iaHcyczJ1K3hxS1kKK2JiUFdmaytIT1R5SmpmbmtjQzVOYmc0NGVPbXJ1cTBnU21CZVVYVk01VW50bFRueEFrRUE3VEdDQTNoN2t4NUUKK0JsNHpsMnBjM2dQQUd0K2R5Zms1UG85bUdKVVVYaEY1cDJ6dWVHbVlXVzc0VG1PV0Ixa3p0NFFSZFlNekZlUHEKK3pmRE5YRWExQ3dKQkFNRkVyZFkweHAwVUoxM1d3QmJVVGs4cnVqcVFkSHRqdzBrbGhwYnVLa2p4dTJoTjB3d00KKzZwMEQ5cXhGN0pIYWdocVZSSTBmQVcvRUUwT3pkSE1SOVFrQ1FRRE5SMjZkTUZYS3NvUHUrdkl0bGpqL1VFR2YKK1FHN2dFUmlRNHl4YUZCUEhnZHBHbzBrVDMxZWg5eDloUUdEa3hUZTBHTkcvWVNnQ1J2bTgrQzNUTWNLWEFrQkQKK2RoR24zNndrVUZDZGRNU0FNNE5TSjFWTjgvWjB5NUh6Q21JOGRNM1Z3R3RHTVVRbHhLeHdPbDMwTEVRemRTNU0KKzBTV29qTllYaVQyZ09CZkJ3dGJoQWtFQWhhZmw1UUVPSWdVeitYYXpTL0lsWjhnb05LZERWZllnSzNtSEhqdnYKK25ZNUcrQXVHZWJkTmtYSnI0S1NXeERjTitDMmk0N3p1ajRRWEExNk1BT2FuZEE9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KK3N1YmplY3Q9L0M9VVMvTz1BVCZUIEJlbGwgTGFib3JhdG9yaWVzL09VPVByb3RvdHlwZSBSZXNlYXJjaCBDQQoraXNzdWVyPSAvQz1VUy9PPUFUJlQgQmVsbCBMYWJvcmF0b3JpZXMvT1U9UHJvdG90eXBlIFJlc2VhcmNoIENBCitub3RCZWZvcmU9OTUwNDEzMjEwNjU2Wgorbm90QWZ0ZXIgPTk3MDQxMjIxMDY1NloKKy0tLS0tQkVHSU4gWDUwOSBDRVJUSUZJQ0FURS0tLS0tCisKK01JSUNDRENDQVhFQ0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd1RqRUxNQWtHQTFVRUJoTUNWVk14SHpBZEJnTlYKK0JBb1VGa0ZVSmxRZ1FtVnNiQ0JNWVdKdmNtRjBiM0pwWlhNeEhqQWNCZ05WQkFzVUZWQnliM1J2ZEhsd1pTQlMKK1pYTmxZWEpqYUNCRFFUQWVGdzA1TlRBME1UTXlNVEEyTlRaYUZ3MDVOekEwTVRJeU1UQTJOVFphTUU0eEN6QUoKK0JnTlZCQVlUQWxWVE1SOHdIUVlEVlFRS0ZCWkJWQ1pVSUVKbGJHd2dUR0ZpYjNKaGRHOXlhV1Z6TVI0d0hBWUQKK1ZRUUxGQlZRY205MGIzUjVjR1VnVW1WelpXRnlZMmdnUTBFd2dad3dEUVlKS29aSWh2Y05BUUVCQlFBRGdZb0EKK01JR0dBb0dBZWJPbWd0U0NsK3dDWVpjODZVR1llVExZOGNqbVcyUDBGTjhUb1QvdTJwRUNDb0Zkcmx5Y1gwT1IKKzN3dDBaaHBGWExWTmVEbkh3RUU5dmVOVWloN3BDTDJaQkZxb0lvUWtCMWxabVhSaVZ0akdvbno4QkxtL3FyRk0KK1lIYjBsbWUvT2wrczExOG13S1Z4bm42YlNBZUkvT1hLaExhVmRZWldrK2FFYXhFRGtWa0NBUTh3RFFZSktvWkkKK2h2Y05BUUVFQlFBRGdZRUFBWk1HMTRsWm1aOGJhaGthSGFUVjlkUWY0cDJGWmlRVEZ3SFA5WnlHc1hQQytMVDUKK2RHNWlUYVJteWpOSUpkUFdvaFpEbDk3a0FjaTc5YUJuZHZ1RXZSS09qTEhzM1dSR0JJd0VSbkFjblk5TXo4dS8KK3pJSEsyM1BqWVZ4R0dhWmQ2NjlPSndEMENZeXFIMjJISDluRlVHYW9KZHN2MzlDaFcwTlJkTEU5K3k4PQorLS0tLS1FTkQgWDUwOSBDRVJUSUZJQ0FURS0tLS0tCitpc3N1ZXI9IC9DPUFVL1NUPVF1ZWVuc2xhbmQvTz1DcnlwdFNvZnQgUHR5IEx0ZC9DTj1UZXN0IFBDQSAoMTAyNCBiaXQpCitzdWJqZWN0PS9DPUFVL1NUPVF1ZWVuc2xhbmQvTz1DcnlwdFNvZnQgUHR5IEx0ZC9DTj1UZXN0IENBICgxMDI0IGJpdCkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0pqQ0NBWThDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3WERFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVgorQkFnVENsRjFaV1Z1YzJ4aGJtUXhHakFZQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNUnd3R2dZRAorVlFRREV4TlVaWE4wSUZCRFFTQW9NVEF5TkNCaWFYUXBNQjRYRFRrM01EWXdPVEV6TlRjME0xb1hEVEF4TURZdworT1RFek5UYzBNMW93V3pFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbEYxWldWdWMyeGhibVF4R2pBWQorQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNUnN3R1FZRFZRUURFeEpVWlhOMElFTkJJQ2d4TURJMAorSUdKcGRDa3dnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBS083bzh0MTE2VlA2Y2d5YlRzWgorRENaaHI5NW5ZbFp1eWEzYUNpMUlLb3p0cXdXbmpibURGSXJpT3FHRlByWlErbW9NRVRDOUQ1OWlSVy9kRlhTdgorMUY2NWthL1hZMmhMaDlleENDbzdYdVVjRHM1M1FwM2JJM0FtTXFIamd6RThvTzNhanlKQXpKa1RUT1VlY1FVMgorbXcvZ0k0dE1NMExxV01RUzdsdVR5NCt4QWdNQkFBRXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFNN2FjaHYzdgoraExRSmN2LzY1ZUdFcEJYTTQwWkRWb0ZRRkZKV2FZNXA4ODNIVHFMQjF4NEZkenNYSEgwUUtCVGNLcFd3cXl1NAorWURtM2ZiOG9EdWd3NzJiQ3pmeVpLL3pWWlBSL2hWbHFJL2Z2VTEwOVFvYys3b1B2SVhXa3k3MUhmY0s2WkJDQQorcTMwS0lxR00vdW9NNjBJTnE5N3FqRG1DSmFwYWdjTkJHUXM9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWFFJQkFBS0JnUUNqdTZQTGRkZWxUK25JTW0wN0dRd21ZYS9lWjJKV2JzbXQyZ290U0NxTTdhc0ZwNDI1CitneFNLNGpxaGhUNjJVUHBxREJFd3ZRK2ZZa1Z2M1JWMHI5UmV1Wkd2MTJOb1M0ZlhzUWdxTzE3bEhBN09kMEtkCisyeU53SmpLaDQ0TXhQS0R0Mm84aVFNeVpFMHpsSG5FRk5wc1A0Q09MVEROQzZsakVFdTViazh1UHNRSURBUUFCCitBb0dBVlptcEZac0RaZnIwbDJTOXRMTHdwalJXTk9sS0FUUWtubzZxMldlc1QwZUdMUXVmVGNpWStjOHlwZlU2CitoeWlvOHI1aVVsL1ZoaGRqaEF0S3gxbVJwaW90ZnRIby9lWWY4cnRzcm5wck9uV0cwYldqTGp0SW9NYmN4R24yCitKM2JONkxKbWJKTWpEczBlSjNLblR1NjQ2RjNuRFV3Mm9HQXdtcHpLWEExS0FQMENRUURSdlFoeGsyRDNQZWhzCitIdkc2NjV1MnBCNWlwWVFuZ0VGbFpPN1JISlp6Sk9aRVdTTHV1TXFhRi83cFRmQTVqaUJ2V3FDZ0plQ1JSSW5MCisyMXJ1NGRsUEFrRUF4OWpqN0JnS241VFluTW9CU1NlMGFmanNWOW9BcFZwTjFOYWNiMVlEdEN3eStzY3AzKytzCituRnhsdjk4d3hJbFNkcHdNVW4rQVVXZmppV1I3VHUvRy93SkJBSi9LandaSXJGVnhld1AweDJJTFlzVFJZTHp6CitNUzRQRHNPN0ZCK0kwaTdEYkJPaWZYUzJvTlNwZDNJMENOTXdyeEZuVUh6eW5wYk9TdFZmTjNaTDV3MENRUUNhCitwd0ZhaHhCUmhrSktzeGhqb0ZKQlg5eWw3NUpvWTRXdm01VGJvOWloNlVKYVJ4M2txZmtOMTRMMkJLWWNzWmdiCitLWTl2bURPWXk2aU5makRlV1RmSkFrQmtmUFViOG9USi9uU1A1ek42c3FHeFNZNGtyYzR4THhwUm14b0o4SEwyCitYZmhxWGtUemJVMTNSWDlKSi9OWjh2UU45Vm0yTmh4UkdKb2NRa21jZFZ0SgorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KKy0tLS0tQkVHSU4gWDUwOSBDRVJUSUZJQ0FURS0tLS0tCitNSUlDWURDQ0FpQUNBZ0VvTUFrR0JTc09Bd0lOQlFBd2ZERUxNQWtHQTFVRUJoTUNWVk14TmpBMEJnTlZCQW9UCitMVTVoZEdsdmJtRnNJRUZsY205dVlYVjBhV056SUdGdVpDQlRjR0ZqWlNCQlpHMXBibWx6ZEhKaGRHbHZiakVaCitNQmNHQTFVRUN4TVFWR1Z6ZENCRmJuWnBjbTl1YldWdWRERWFNQmdHQTFVRUN4TVJSRk5UTFU1QlUwRXRVR2xzCitiM1F0UTBFd0hoY05PVFl3TWpJMk1UWXpNalExV2hjTk9UY3dNakkxTVRZek1qUTFXakI4TVFzd0NRWURWUVFHCitFd0pWVXpFMk1EUUdBMVVFQ2hNdFRtRjBhVzl1WVd3Z1FXVnliMjVoZFhScFkzTWdZVzVrSUZOd1lXTmxJRUZrCitiV2x1YVhOMGNtRjBhVzl1TVJrd0Z3WURWUVFMRXhCVVpYTjBJRVZ1ZG1seWIyNXRaVzUwTVJvd0dBWURWUVFMCitFeEZFVTFNdFRrRlRRUzFRYVd4dmRDMURRVENCOGpBSkJnVXJEZ01DREFVQUE0SGtBRENCNEFKQkFNQS9zc0tiCitoUE5VRzdabEFTZlZ3RUpVMjFPNU95Ri9peUJ6Z0hJMU84ZU9oSkdVWU84Y2M4d0RNalI1MDhNcjljcDZVaGwvCitaQjdGVjVHa0xORW5SSFlDUVFEVUVhU2c0NVAycXJEd2l4VFJoRmhtV3o1TnZjNGxSRlEvNDJYUGNjaGlKQkxiCitibjNRSzc0VDJJeFkxeVkra0NOcThYcklxZjVmSkp6SUgwSi94VVAzQWhVQXNnMndzUUhmREdZay9CT1N1bFgzCitmVmQwZ2VVQ1FRQ3pDRlVRQWgrWmtFbXA1ODA0Y3M2WldCaHJVQWZucmE4bEpJdFlvOXhQY1hnZElmTGZpYmNYCitSNzFVc3lPNzdNUkQ3QjArQWcydHE3OTRJbGVDVmNFRU1Ba0dCU3NPQXdJTkJRQURMd0F3TEFJVVVheURmcmVSCitZaDJXZVU4Ni9wSE5ka1VDMUlnQ0ZFZnhlMWYwb01weEp5cko1WEl4VGk3dkdkb0sKKy0tLS0tRU5EIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBYNTA5IENFUlRJRklDQVRFLS0tLS0KKworTUlJQ0dUQ0NBZGdDQXdDcVREQUpCZ1VyRGdNQ0RRVUFNSHd4Q3pBSkJnTlZCQVlUQWxWVE1UWXdOQVlEVlFRSworRXkxT1lYUnBiMjVoYkNCQlpYSnZibUYxZEdsamN5QmhibVFnVTNCaFkyVWdRV1J0YVc1cGMzUnlZWFJwYjI0eAorR1RBWEJnTlZCQXNURUZSbGMzUWdSVzUyYVhKdmJtMWxiblF4R2pBWUJnTlZCQXNURVVSVFV5MU9RVk5CTFZCcAorYkc5MExVTkJNQjRYRFRrMk1EVXhOREUzTURFME1Wb1hEVGszTURVeE5ERTNNREUwTVZvd016RUxNQWtHQTFVRQorQmhNQ1FWVXhEekFOQmdOVkJBb1RCazFwYm1OdmJURVRNQkVHQTFVRUF4TUtSWEpwWXlCWmIzVnVaekNCOGpBSgorQmdVckRnTUNEQVVBQTRIa0FEQ0I0QUpCQUtiZkh6NnZFNnBYWE1UcHN3dEdVZWMydHZuZkxKVXNveEU5cXM0KworT2JaWDdMbUx2cmFnTlBVZWlUSng3VU9XWjVEZkJqNmJYTGM4ZVluZTBsUDFnM0FDUVFEVUVhU2c0NVAycXJEdworaXhUUmhGaG1XejVOdmM0bFJGUS80MlhQY2NoaUpCTGJibjNRSzc0VDJJeFkxeVkra0NOcThYcklxZjVmSkp6SQorSDBKL3hVUDNBaFVBc2cyd3NRSGZER1lrL0JPU3VsWDNmVmQwZ2VVQ1FRQ3pDRlVRQWgrWmtFbXA1ODA0Y3M2WgorV0JoclVBZm5yYThsSkl0WW85eFBjWGdkSWZMZmliY1hSNzFVc3lPNzdNUkQ3QjArQWcydHE3OTRJbGVDVmNFRQorTUFrR0JTc09Bd0lOQlFBRE1BQXdMUUlVV3N1dUpSRTNWVDR1ZVdrV01BSk1KYVpqajFFQ0ZRQ1lZMHpYNGJ6TQorTEM3b2JzckhEOFhBSEcrWlJHPT0KKy0tLS0tRU5EIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDVFRDQ0FiYWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVFGQURCTU1Rc3dDUVlEVlFRR0V3SkhRakVNCitNQW9HQTFVRUNoTURWVU5NTVJnd0ZnWURWUVFMRXc5SlEwVXRWRVZNSUZCeWIycGxZM1F4RlRBVEJnTlZCQU1UCitERlJ5ZFhOMFJtRmpkRzl5ZVRBZUZ3MDVOekEwTWpJeE5ETTVNVFJhRncwNU9EQTBNakl4TkRNNU1UUmFNRXd4CitDekFKQmdOVkJBWVRBa2RDTVF3d0NnWURWUVFLRXdOVlEwd3hHREFXQmdOVkJBc1REMGxEUlMxVVJVd2dVSEp2CithbVZqZERFVk1CTUdBMVVFQXhNTVZISjFjM1JHWVdOMGIzSjVNSUdjTUFvR0JGVUlBUUVDQWdRQUE0R05BRENCCitpUUtCZ1FDRWllUjhOY1hrVVcxZjBHNmFDNnUwaThxLzk4SnFTNlJ4SzVZbUhJR0tDa3VUV0FVanpMZlVhNGR0CitVOWlnR0NqVHV4YURxbHpFaW0rdC8wMnBtaUJaVDlIYVgrKzM1TWpRUFVXbXNDaGNZVTVXeXpHRXJYaStyUWF3Cit6bHdTNzN6TThxaVBqLzk3bFhZeWNXaGdMMFZhaURTUHhSWEVVZFdvYUdydW9tNG1OUUlEQVFBQm8wSXdRREFkCitCZ05WSFE0RUZnUVVIYWwxTFpyN29WZzV6NmxZenJoVGdaUkNtY1V3RGdZRFZSMFBBUUgvQkFRREFnSDJNQThHCitBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQWZhZ2dmbDZGWm9pb2VjanYwZHE4CisvRFhvL3UxMWlNWnZYbjA4Z2pYL3psMmI0d3RQYlNoT1NZNUZoa1NtOEdleVNhc3orL053Yi91emZuSWhva1dpCitsZlBaSHRsQ1d0WGJJeS9UTjUxZUp5cTA0Y2VEQ1FEV3ZMQzJlblZnOUtCK0dKMzRiNWM1VmFQUnpxOE1CeHNBCitTN0VMdVlHdG1ZZ1ltOU5aT0lyN3lVMD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQjZqQ0NBWlFDQWdFdE1BMEdDU3FHU0liM0RRRUJCQVVBTUlHQU1Rc3dDUVlEVlFRR0V3SlZVekUyTURRRworQTFVRUNoTXRUbUYwYVc5dVlXd2dRV1Z5YjI1aGRYUnBZM01nWVc1a0lGTndZV05sSUVGa2JXbHVhWE4wY21GMAorYVc5dU1Sa3dGd1lEVlFRTEV4QlVaWE4wSUVWdWRtbHliMjV0Wlc1ME1SNHdIQVlEVlFRTEV4Vk5SRFV0VWxOQgorTFU1QlUwRXRVR2xzYjNRdFEwRXdIaGNOT1RZd05ETXdNakl3TlRBd1doY05PVGN3TkRNd01qSXdOVEF3V2pDQgorZ0RFTE1Ba0dBMVVFQmhNQ1ZWTXhOakEwQmdOVkJBb1RMVTVoZEdsdmJtRnNJRUZsY205dVlYVjBhV056SUdGdQorWkNCVGNHRmpaU0JCWkcxcGJtbHpkSEpoZEdsdmJqRVpNQmNHQTFVRUN4TVFWR1Z6ZENCRmJuWnBjbTl1YldWdQorZERFZU1Cd0dBMVVFQ3hNVlRVUTFMVkpUUVMxT1FWTkJMVkJwYkc5MExVTkJNRmt3Q2dZRVZRZ0JBUUlDQWdBRAorU3dBd1NBSkJBTG1tWDUrR3FBdmNyV0sxM3JmRHJOWDlVZmVBN2YraWp5QmdlRlFqWVVvRHBGcWFwdzRuelFCTAorYkFYdWc4cEtrUndhMlpoOFlPRGhYc1JXdTJGL1Vja0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRUUZBQU5CQUg5YQorT0JBK1FDc2p4WGduU3FIeDA0Z2NVOFM0OURWVWIxZjJYVm9MbkhsSWI4Um5YMGs1TzZtcEhUNWV0aTliTGtpVworR0pOTUo0TDBBSi9hYytTbUhaYz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ2FqQ0NBZE1DQkRHQTBRVXdEUVlKS29aSWh2Y05BUUVFQlFBd2ZURUxNQWtHQTFVRUJoTUNRMkV4RHpBTgorQmdOVkJBY1RCazVsY0dWaGJqRWVNQndHQTFVRUN4TVZUbThnVEdsaFltbHNhWFI1SUVGalkyVndkR1ZrTVI4dworSFFZRFZRUUtFeFpHYjNJZ1JHVnRieUJRZFhKd2IzTmxjeUJQYm14NU1Sd3dHZ1lEVlFRREV4TkZiblJ5ZFhOMAorSUVSbGJXOGdWMlZpSUVOQk1CNFhEVGsyTURReU5qRXpNelV3TVZvWERUQTJNRFF5TmpFek16VXdNVm93ZlRFTAorTUFrR0ExVUVCaE1DUTJFeER6QU5CZ05WQkFjVEJrNWxjR1ZoYmpFZU1Cd0dBMVVFQ3hNVlRtOGdUR2xoWW1scworYVhSNUlFRmpZMlZ3ZEdWa01SOHdIUVlEVlFRS0V4WkdiM0lnUkdWdGJ5QlFkWEp3YjNObGN5QlBibXg1TVJ3dworR2dZRFZRUURFeE5GYm5SeWRYTjBJRVJsYlc4Z1YyVmlJRU5CTUlHZE1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTAorQURDQmh3S0JnUUNhcm9TN08xREEwaG00SWVmTllVMWN4L25xT216RW5rMjkxZDFYcXpuRGVGNHdFZ2FrYmtDYworelRLeEs3OTF5TnBYRzVSbW5ncUg3Y3lnRFJUSFpKNm1mQ1JuMHdHQytBSTAwRjJ2WVRHcVBHUlFMMU4zbFpUMAorWURLRkMwU1FlTU1qRklaMWFlUWlncm9GUW5IbzBWQjN6V0lNcE5ra2E4UFk5bHhIWkFtV3dRSUJBekFOQmdrcQoraGtpRzl3MEJBUVFGQUFPQmdRQkF4MFVNVkExczU0bE1ReVhqTVg1a2o5OUZKTjVpdGI4YksxUmsrY2VnUFFQRgorY1dPOVNFV3lFampCaklramp6QXdCa2FFc3pGc05HeGVteHRYdndqSW0xeEVVTVRWbFBFV1RzMnFuRHZBVUE5VworWXFoV2JoSDB0b0dUMzYyMzZRQXNxQ1o3NnJiVFJWU1NYMkJIeUp3Sk1HMnRDUnY3a1JKLy9OSWd4ajNINHc9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCitpc3N1ZXI9IC9DPUFVL1NUPVF1ZWVuc2xhbmQvTz1DcnlwdFNvZnQgUHR5IEx0ZC9DTj1UZXN0IFBDQSAoMTAyNCBiaXQpCitzdWJqZWN0PS9DPUFVL1NUPVF1ZWVuc2xhbmQvTz1DcnlwdFNvZnQgUHR5IEx0ZC9DTj1UZXN0IFBDQSAoMTAyNCBiaXQpCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNKekNDQVpBQ0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd1hERUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlYKK0JBZ1RDbEYxWldWdWMyeGhibVF4R2pBWUJnTlZCQW9URVVOeWVYQjBVMjltZENCUWRIa2dUSFJrTVJ3d0dnWUQKK1ZRUURFeE5VWlhOMElGQkRRU0FvTVRBeU5DQmlhWFFwTUI0WERUazNNRFl3T1RFek5UY3pOMW9YRFRBeE1EWXcKK09URXpOVGN6TjFvd1hERUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEdqQVkKK0JnTlZCQW9URVVOeWVYQjBVMjltZENCUWRIa2dUSFJrTVJ3d0dnWURWUVFERXhOVVpYTjBJRkJEUVNBb01UQXkKK05DQmlhWFFwTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDZG9Xay8zK1djTWxmaklya2cKKzQwa2V0bW5RYUVvZ1FlMUxMY3VPSlY2cktmVVNBc1Bnd2dzYWJKL3duOFR4QTF5eTNlS0piRmwzT2lVWE1Sc3AKKzIySnA4NVBtZW1pRHp5VUlTdHdrNzJxaHAxaW1iQU5admxtbENGS2lRcmpVeXVEZnU0VEFCbW4ra2t0M3ZSMVkKK0JFT0d0K0lGeWUxVUJWU0FUVmRSSjJVVmh3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkJBVUFBNEdCQUJOQTF1L1MKK0NnL0xKWldiN0dsaWlLSnN2dWh4bEU0RTVKeFFGMnpNdWIvQ1NOYkY5Ny8vdFlTeWo5NnN4ZUZReFpYYmNqbTkKK3h0Nm1yL3hOTEE0c3pOUU1KNFArTDdiNWUvakM1RFNxbHdTK0NVWUpnYUZzL1NQK3FKb0NTdTFiUjNJTTlYV08KK2NSQnBEbWNCYllMa1N5QjkyV1VSdnNaMUx0akVjbitjZFFWSQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQ1hBSUJBQUtCZ1FDZG9Xay8zK1djTWxmaklya2c0MGtldG1uUWFFb2dRZTFMTGN1T0pWNnJLZlVTQXNQZword2dzYWJKL3duOFR4QTF5eTNlS0piRmwzT2lVWE1Sc3AyMkpwODVQbWVtaUR6eVVJU3R3azcycWhwMWltYkFOWgordmxtbENGS2lRcmpVeXVEZnU0VEFCbW4ra2t0M3ZSMVlCRU9HdCtJRnllMVVCVlNBVFZkUkoyVVZod0lEQVFBQgorQW9HQWJhNGZUdHVhcDVsNy84WnNiRTdaMU8zMktKWTRaY09adWtMT0xVVWhYeFhkdVQrRlRnR1d1amMwL3JnYworejlxWUNMbE5aSE9vdU1ZVGd0U2ZZdnVNdUxaMTFWSXQwR1lIK25SaW9MU2hFNTlZeSt6Q1J5QytnUGlnUzFregoreHZvMTRBc09JUFlWMTRUay9Tc0h5cTZFMGVUazdWemFJRTE5N2dpaUlOVUVSUEVDUVFEU0ttdFBUaC9sUkt3NworSFNaU00wSTFtRlduLzF6cXJBYm9udFJRWTV3OThRV0lPZTVxbXpZeUZiUFhZVDNkOUJ6bHNNeWhnaVJOb0JiRAoreXZvaFNIWEpBa0VBd0FIeDZlekFaZVdXekQ1eVhEMzZueWpwa1ZDdzdUazdUU21PY2VMSk1XdDFRY3JDZnFsUworeEE1ampwUTZaOHN1VTVEZHRXQXJ5TTJzQWlyMVdpc1l6d0pBZDZaY3g1Nmp2QVEzeGNQWHNFNnNjQlRWRnpyagorN0ZxWjZFK2NjbFB6ZkxRK1FRc3lPQkU3YnBJNmUvRkpwcFkyNlhHWlhvM1lHelY4SUdYcnQ0MG9PUUpBTEVURworaDg2RUZYbzNxR09GYm1zRHk0cGRQNW5CRVJDdThYMXhVQ1NmaW50aUQ0YzJESW54Z1M1b0djbG5KZU1jalR2TAorUWpRb0pDWDNVSkNpL09VTzFRSkJBS2djREhXak12dCtsMXBqSkJzU0VaMEhYOUFBSUlWeDBSUW1iRkdTK0YyUQoraGh1NWw3N1dublpPUTl2dmhWNXU3TlBDVUY5bmhVM2poNjBxV1dPOG1rYz0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCitzdWJqZWN0PS9DPVVTL089UlNBIERhdGEgU2VjdXJpdHksIEluYy4vT1U9Q29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQoraXNzdWVyPSAvQz1VUy9PPVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuL09VPUNvbW1lcmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKK25vdEJlZm9yZT05NDExMDQxODU4MzRaCitub3RBZnRlciA9OTkxMTAzMTg1ODM0WgorLS0tLS1CRUdJTiBYNTA5IENFUlRJRklDQVRFLS0tLS0KKworTUlJQ0l6Q0NBWkFDQlFKQkFBQVdNQTBHQ1NxR1NJYjNEUUVCQWdVQU1Gd3hDekFKQmdOVkJBWVRBbFZUTVNBdworSGdZRFZRUUtFeGRTVTBFZ1JHRjBZU0JUWldOMWNtbDBlU3dnU1c1akxqRXJNQ2tHQTFVRUN4TWlRMjl0YldWeQorWTJsaGJDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MDVOREV4TURReE9EVTRNelJhRncwNQorT1RFeE1ETXhPRFU0TXpSYU1Gd3hDekFKQmdOVkJBWVRBbFZUTVNBd0hnWURWUVFLRXhkU1UwRWdSR0YwWVNCVAorWldOMWNtbDBlU3dnU1c1akxqRXJNQ2tHQTFVRUN4TWlRMjl0YldWeVkybGhiQ0JEWlhKMGFXWnBZMkYwYVc5dQorSUVGMWRHaHZjbWwwZVRDQm16QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmlRQXdnWVVDZmdDays0RmllODRRSjkzbworOTc1c2JzWndtZHU0MVFVRGFTaUNuSEovbGorTzdLd3BraitLRlBoQ2RyNjlYUU81a05UUXZBYXlVVE5meE1LLwordG91UG1iWmlJbURkMjk4Z2dyVEtvaTh0VU8yVU10N2dWWTNVYU9MZ1ROTE5CUll1bFdaY1lWSTRIbEdvZ3FIRQorN3lYcEN1YUxLNDR4WnRuNDJmMjlPMm5aNndJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQUEzNEFkclcyRVA0agorOS9kWllrdXdYNXpCYUx4SnU3TkpieUZIWFN1ZFZNUUFLRCtZdWZLS2c1dGdmK3RReDZzRkVDMDk3VGdDd2FWSQorMHY1bG9NQzg2cVlqRm1ac0d5U3A4K3g1TlJoUEpzampyMUJLeDZjeGE5QjhHSjFRdjZrbStpWXJScHdVcWJ0YgorTUpoQ0tMVkxVN3REQ1pKQXVxaXFXcVRHdG90WFRjVT0KKy0tLS0tRU5EIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorc3ViamVjdD0vQz1VUy9PPVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuL09VPVNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKK2lzc3Vlcj0gL0M9VVMvTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLi9PVT1TZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Citub3RCZWZvcmU9OTQxMTA5MjM1NDE3Wgorbm90QWZ0ZXIgPTk5MTIzMTIzNTQxN1oKKy0tLS0tQkVHSU4gWDUwOSBDRVJUSUZJQ0FURS0tLS0tCisKK01JSUNLVENDQVpZQ0JRSkJBQUFCTUEwR0NTcUdTSWIzRFFFQkFnVUFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1TQXcKK0hnWURWUVFLRXhkU1UwRWdSR0YwWVNCVFpXTjFjbWwwZVN3Z1NXNWpMakV1TUN3R0ExVUVDeE1sVTJWamRYSmwKK0lGTmxjblpsY2lCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwNU5ERXhNRGt5TXpVME1UZGEKK0Z3MDVPVEV5TXpFeU16VTBNVGRhTUY4eEN6QUpCZ05WQkFZVEFsVlRNU0F3SGdZRFZRUUtFeGRTVTBFZ1JHRjAKK1lTQlRaV04xY21sMGVTd2dTVzVqTGpFdU1Dd0dBMVVFQ3hNbFUyVmpkWEpsSUZObGNuWmxjaUJEWlhKMGFXWnAKK1kyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQm16QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmlRQXdnWVVDZmdDU3puckIKK3JvTStXcXFKZzFlc0pRRjJESzJ1aml3M3p1czFlR1JVQStXRVFGSEp2NDhJNG9xQ0NOSVdoamRWNmJFaEFxMTIKK2FJR2FCYUpMeVVzbFppSldiSWdIai9lQldXMkVCMlZ3RTNGMlBwdDNUT05RaVZhWVNMa2RweWthRXk1S0VWbWMKK0hoWFZTVlFzY3pwcGdyR1hPWnh0Y0dkSTVkMHQxc2dlZXdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQUEzNEEKK2lOSFJlU0hPNG92bytNRjlORk0vWVlQWnRnczRGN2JvdmlHTmp3QzRpMU4rUkdjZUlyMlhKK0NjaGN4SzlvVTcKK3N1SytrdFBsRGVtdlhBNE1ScFgvb1J4ZVB1ZzJXSHB6cGdyNEloRnJ3d2s0ZmlhN2MrOEF2UUtrOHhRTk1EOWgKK2NIc2cvaktqbjdQMFoxTGN0TzZFakpZMklONkJDSU54SVlvUG5xaz0KKy0tLS0tRU5EIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorc3ViamVjdD0vQz1aQS9TUD1XZXN0ZXJuIENhcGUvTD1DYXBlIFRvd24vTz1UaGF3dGUgQ29uc3VsdGluZyBjYworCS9PVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uL0NOPVRoYXd0ZSBTZXJ2ZXIgQ0EKKwkvRW1haWw9c2VydmVyLWNlcnRzQHRoYXd0ZS5jb20KK2lzc3Vlcj0gL0M9WkEvU1A9V2VzdGVybiBDYXBlL0w9Q2FwZSBUb3duL089VGhhd3RlIENvbnN1bHRpbmcgY2MKKwkvT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi9DTj1UaGF3dGUgU2VydmVyIENBCisJL0VtYWlsPXNlcnZlci1jZXJ0c0B0aGF3dGUuY29tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUMrVENDQW1JQ0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd2djUXhDekFKQmdOVkJBWVRBbHBCTVJVd0V3WUQKK1ZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWRNQnNHQTFVRUNoTVUKK1ZHaGhkM1JsSUVOdmJuTjFiSFJwYm1jZ1kyTXhLREFtQmdOVkJBc1RIME5sY25ScFptbGpZWFJwYjI0Z1UyVnkKK2RtbGpaWE1nUkdsMmFYTnBiMjR4R1RBWEJnTlZCQU1URUZSb1lYZDBaU0JUWlhKMlpYSWdRMEV4SmpBa0Jna3EKK2hraUc5dzBCQ1FFV0YzTmxjblpsY2kxalpYSjBjMEIwYUdGM2RHVXVZMjl0TUI0WERUazJNRGN5TnpFNE1EYzEKK04xb1hEVGs0TURjeU56RTRNRGMxTjFvd2djUXhDekFKQmdOVkJBWVRBbHBCTVJVd0V3WURWUVFJRXd4WFpYTjAKK1pYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWRNQnNHQTFVRUNoTVVWR2hoZDNSbElFTnYKK2JuTjFiSFJwYm1jZ1kyTXhLREFtQmdOVkJBc1RIME5sY25ScFptbGpZWFJwYjI0Z1UyVnlkbWxqWlhNZ1JHbDIKK2FYTnBiMjR4R1RBWEJnTlZCQU1URUZSb1lYZDBaU0JUWlhKMlpYSWdRMEV4SmpBa0Jna3Foa2lHOXcwQkNRRVcKK0YzTmxjblpsY2kxalpYSjBjMEIwYUdGM2RHVXVZMjl0TUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0IKK2lRS0JnUURUcEZCdXlQOVdhK2JQWGJicURHaDFSNktxd3RxRUpmeW85RWRSMm9XMUlIU1VoaDRQZGNucENHSDEKK0JtMHdiaFVaQXVsU3dHTGJUWm1lNG1vTVJEak4vcjdqWkFsd3hmNnhheW0yTDBuSU85UW5CQ1VRbHkvbmtHM0EKK0tFS1oxMHhEM3NQMUlXMVVuMTNEV09IQTVObGJzTGpjdEh2Zk5qckN0V1lpRXRhSERRSURBUUFCTUEwR0NTcUcKK1NJYjNEUUVCQkFVQUE0R0JBSXN2bjdpZlgzUlVJcnZZWHRwSTRET2ZBUmtUb2d3bTZvN093VmRsOTN5RmhEY1gKKzdoNXQwWFoxMU1VQU16aUtkZGUzcm1UdnpVWUlVQ1lvWTViMDMySXdHTVR2ZGljbEsrU1RONk5QMm01bnZGQU0KK3FKVDVnQzVPK2ovakJ1WlJRNGkwQU1ZUXI1RjRsVDhvQkpuaGdhZnc2UEw4YURZMnZNSEdTUGw5Kzd1ZgorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUREVENDQW5ZQ0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd2djNHhDekFKQmdOVkJBWVRBbHBCTVJVd0V3WUQKK1ZRUUlFd3hYWlhOMFpYSnVJRU5oY0dVeEVqQVFCZ05WQkFjVENVTmhjR1VnVkc5M2JqRWRNQnNHQTFVRUNoTVUKK1ZHaGhkM1JsSUVOdmJuTjFiSFJwYm1jZ1kyTXhLREFtQmdOVkJBc1RIME5sY25ScFptbGpZWFJwYjI0Z1UyVnkKK2RtbGpaWE1nUkdsMmFYTnBiMjR4SVRBZkJnTlZCQU1UR0ZSb1lYZDBaU0JRY21WdGFYVnRJRk5sY25abGNpQkQKK1FURW9NQ1lHQ1NxR1NJYjNEUUVKQVJZWmNISmxiV2wxYlMxelpYSjJaWEpBZEdoaGQzUmxMbU52YlRBZUZ3MDUKK05qQTNNamN4T0RBM01UUmFGdzA1T0RBM01qY3hPREEzTVRSYU1JSE9NUXN3Q1FZRFZRUUdFd0phUVRFVk1CTUcKK0ExVUVDQk1NVjJWemRHVnliaUJEWVhCbE1SSXdFQVlEVlFRSEV3bERZWEJsSUZSdmQyNHhIVEFiQmdOVkJBb1QKK0ZGUm9ZWGQwWlNCRGIyNXpkV3gwYVc1bklHTmpNU2d3SmdZRFZRUUxFeDlEWlhKMGFXWnBZMkYwYVc5dUlGTmwKK2NuWnBZMlZ6SUVScGRtbHphVzl1TVNFd0h3WURWUVFERXhoVWFHRjNkR1VnVUhKbGJXbDFiU0JUWlhKMlpYSWcKK1EwRXhLREFtQmdrcWhraUc5dzBCQ1FFV0dYQnlaVzFwZFcwdGMyVnlkbVZ5UUhSb1lYZDBaUzVqYjIwd2daOHcKK0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU5JMk5tcUwxOEpibnRxQlFXS1BPTzVKQkZYVzBPOGMKK0c1VVdSKzhZU0RVNlV2UXJhZ2FQT3kvcVZ1T3ZobzJlRi9lZXRHVjFBazN2eXdtaUlWSFltOUJuMExvTmtnWVUKK2M5U1R5NWNxQUp4Y1RneTgraFZTL1BKRWJ0b1JTbTRJbnk4dDQvbXFPb1p6dGtaVFdNaUpCYjJERWJoelA2b0gKK2pmUkNUZWRBblJ3M0FnTUJBQUV3RFFZSktvWklodmNOQVFFRUJRQURnWUVBdXRGSWdUUlpWWWVySVpmTDlsdlIKK3c5RWlmdnZvNUtUWjNoK0JqK1Z6Tm55dzRRYy9JeVhrUE91NlNJaUg5TFEzc0NtV0JkeHBlK3FyNGw3N3JMajIKK0dZdU10RVNGZm4xWFZBTHprWWdDN0pjUHVUT2pNZklpTUJ5dCt1RmY4QVY4eDBJVy9Ra3V2K2hFUWN5TTl2eEsKKzNWWmRMYkNWSWhOb0VzeXNyeENweGNJPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorVGltcyB0ZXN0IEdDSSBDQQorCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUI4RENDQVpvQ0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd2dZSXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWUQKK1ZRUUlFd3BSZFdWbGJuTnNZVzVrTVJFd0R3WURWUVFIRXdoQ2NtbHpZbUZ1WlRFYU1CZ0dBMVVFQ2hNUlEzSjUKK2NIUlRiMlowSUZCMGVTQk1kR1F4RkRBU0JnTlZCQXNUQzJSbGRtVnNiM0J0Wlc1ME1Sa3dGd1lEVlFRREV4QkQKK2NubHdkRk52Wm5RZ1JHVjJJRU5CTUI0WERUazNNRE15TWpFek16UXdORm9YRFRrNE1ETXlNakV6TXpRd05Gb3cKK2dZSXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aEMKK2NtbHpZbUZ1WlRFYU1CZ0dBMVVFQ2hNUlEzSjVjSFJUYjJaMElGQjBlU0JNZEdReEZEQVNCZ05WQkFzVEMyUmwKK2RtVnNiM0J0Wlc1ME1Sa3dGd1lEVlFRREV4QkRjbmx3ZEZOdlpuUWdSR1YySUVOQk1Gd3dEUVlKS29aSWh2Y04KK0FRRUJCUUFEU3dBd1NBSkJBT0FPQXFvZ0c1UXdBbUxoenlPNENvUm54L3dWeTROWlA0ZHhKeTgzTzFFbkwwcncKK09kc2FtSkt2UE9MSGdTWG8zZ0R1OXVWeXZDZi9RSm1aQW1DNW1sOENBd0VBQVRBTkJna3Foa2lHOXcwQkFRUUYKK0FBTkJBRFJSUy9HVmRkN3JBcVJXNlNkbWdMSmR1T1UyeXEzYXZCdTk5a1JxYnA5QS9kTHU2cjZqVStlUDRvT0EKK1RmZGJGWnRBQUQySHg5alV0WTN0ZmRySk9iOD0gCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1ZqQ0NBZ0FDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3Z2JVeEN6QUpCZ05WQkFZVEFrRlZNUk13RVFZRAorVlFRSUV3cFJkV1ZsYm5Oc1lXNWtNUkV3RHdZRFZRUUhFd2hDY21selltRnVaVEVhTUJnR0ExVUVDaE1SUTNKNQorY0hSVGIyWjBJRkIwZVNCTWRHUXhMREFxQmdOVkJBc1RJMWRQVWxSSVRFVlRVeUJEUlZKVVNVWkpRMEZVU1U5TworSUVGVlZFaFBVa2xVU1VWVE1UUXdNZ1lEVlFRREV5dGFSVkpQSUZaQlRGVkZJRU5CSUMwZ1JFVk5UMDVUVkZKQgorVkVsUFRpQlFWVkpRVDFORlV5QlBUa3haTUI0WERUazNNRFF3TXpFek1qSTFORm9YRFRrNE1EUXdNekV6TWpJMQorTkZvd2diVXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSAorRXdoQ2NtbHpZbUZ1WlRFYU1CZ0dBMVVFQ2hNUlEzSjVjSFJUYjJaMElGQjBlU0JNZEdReExEQXFCZ05WQkFzVAorSTFkUFVsUklURVZUVXlCRFJWSlVTVVpKUTBGVVNVOU9JRUZWVkVoUFVrbFVTVVZUTVRRd01nWURWUVFERXl0YQorUlZKUElGWkJURlZGSUVOQklDMGdSRVZOVDA1VFZGSkJWRWxQVGlCUVZWSlFUMU5GVXlCUFRreFpNRnd3RFFZSgorS29aSWh2Y05BUUVCQlFBRFN3QXdTQUpCQU9aN1Q3eXFQL3R5c3Bja28zeVBZMXkwQ20yRW13TnZ6VzRRZ1ZYUgorRmpzM0htSjR4dFNwWGRvNm13Y0dlekwzQWJ0L2FRWGF4djlQVTh4dCtKcjBPRlVDQXdFQUFUQU5CZ2txaGtpRworOXcwQkFRUUZBQU5CQU9RcFltR2d5Q3FDeTFPbGpnSmhDcVFPdTYyN29WbEh6SzFMK3Q5dkJhTWZuNDBBVlVSNAorV3pRVldPMzFLVGdpNXZUSzFVKzNoNDZmZ1VXcVEwaCs2clU9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JQXdnS0FEQWdFQ0FnRUFNQTBHQ1NxR1NJYjNEUUVCQkFVQU1HSXhFVEFQQmdOVkJBY1RDRWx1ZEdWeWJtVjAKK01SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFME1ESUdBMVVFQ3hNclZtVnlhVk5wWjI0Z1EyeGgKK2MzTWdNU0JEUVNBdElFbHVaR2wyYVdSMVlXd2dVM1ZpYzJOeWFXSmxjakFlRncwNU5qQTBNRGd4TURJd01qZGEKK0Z3MDVOekEwTURneE1ESXdNamRhTUdJeEVUQVBCZ05WQkFjVENFbHVkR1Z5Ym1WME1SY3dGUVlEVlFRS0V3NVcKK1pYSnBVMmxuYml3Z1NXNWpMakUwTURJR0ExVUVDeE1yVm1WeWFWTnBaMjRnUTJ4aGMzTWdNU0JEUVNBdElFbHUKK1pHbDJhV1IxWVd3Z1UzVmljMk55YVdKbGNqQ0FNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQzIKK0ZLYlBUZEFGRGRqS0k5QnZxclFwa21PT0xQaHZsdGN1blhaTEViRTJqVmZKdy8wY3hycitIZ2k2TThxVjZyN2oKK1c4MEdxTGQ1SFVRcTdYUHlzVktEYUJCd1pKSFhQbXY1OTEyZEZFT2JicGRGbUlGSDBTM0wzYnR5MTB3L2NhcmkKK1FQSlVPYndXN3M5ODdMcmJQMndxc3hheGhoS2RycE0wMWJqVjBQYytxUUlEQVFBQkFBQUFBREFOQmdrcWhraUcKKzl3MEJBUVFGQUFPQmdRQSsxbkpyeU50OFZCUmpScjA3QXJEQVYvM2pBSDdHakRjOWpzcnhaUzY4b3N0OXYwNkMKK1R2VE5LR0wrTElTTm1GTFhsK0pYaGdHQjBKWjlmdnlZek5nSFE0NkhCVW5nMUg2dm9hbGZKZ1MyS2RFbzUwd1cKKzhFRlpZTURrVDFrNHV5bndKcWtWTjJRSksvMnE0L0EvVkNvdjVoNlNsTThBZmZnMlcrMVRMcXZxa3dBQQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCisgc3ViamVjdD0vTD1JbnRlcm5ldC9PPVZlcmlTaWduLCBJbmMuL09VPVZlcmlTaWduIENsYXNzIDIgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXIKKyBpc3N1ZXI9IC9MPUludGVybmV0L089VmVyaVNpZ24sIEluYy4vT1U9VmVyaVNpZ24gQ2xhc3MgMiBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcgorCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVrekNDQS95Z0F3SUJBZ0lSQU5EVFVwU1JMM25URmVNck1heUZTUEF3RFFZSktvWklodmNOQVFFQ0JRQXcKK1lqRVJNQThHQTFVRUJ4TUlTVzUwWlhKdVpYUXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UUXcKK01nWURWUVFMRXl0V1pYSnBVMmxuYmlCRGJHRnpjeUF5SUVOQklDMGdTVzVrYVhacFpIVmhiQ0JUZFdKelkzSnAKK1ltVnlNQjRYRFRrMk1EWXdOREF3TURBd01Gb1hEVGs0TURZd05ESXpOVGsxT1Zvd1lqRVJNQThHQTFVRUJ4TUkKK1NXNTBaWEp1WlhReEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVRRd01nWURWUVFMRXl0V1pYSnAKK1UybG5iaUJEYkdGemN5QXlJRU5CSUMwZ1NXNWthWFpwWkhWaGJDQlRkV0p6WTNKcFltVnlNSUdmTUEwR0NTcUcKK1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQzZBKzJjektHUmNZTWZtOGdkbmsrMGRlOTlURER6c3FvMHY1bmIKK1JzYlVtTWNkUlE3bnNNYlJXZTBTQWIvOVFvTFRaL2NKMGlPQnFkcmt6N1VwcXFLYXJWb1RTZGxTTVZNOTJ0V3AKKzNiSm5jWkhRRDF0NHhkNmxRVmRJMS9UNlIrNUowVDF1a09kc0k5Sm1mK0YyOFM2ZzNSM0wxU0Z3aUhLZVpLWnYKK3orNzkzd0lEQVFBQm80SUNSekNDQWtNd2dnSXBCZ05WSFFNQkFmOEVnZ0lkTUlJQ0dUQ0NBaFV3Z2dJUkJndGcKK2hrZ0JodmhGQVFjQkFUQ0NBZ0FXZ2dHclZHaHBjeUJqWlhKMGFXWnBZMkYwWlNCcGJtTnZjbkJ2Y21GMFpYTWcKK1lua2djbVZtWlhKbGJtTmxMQ0JoYm1RZ2FYUnpJSFZ6WlNCcGN5QnpkSEpwWTNSc2VTQnpkV0pxWldOMElIUnYKK0xDQjBhR1VnVm1WeWFWTnBaMjRnUTJWeWRHbG1hV05oZEdsdmJpQlFjbUZqZEdsalpTQlRkR0YwWlcxbGJuUWcKK0tFTlFVeWtzSUdGMllXbHNZV0pzWlNCaGREb2dhSFIwY0hNNkx5OTNkM2N1ZG1WeWFYTnBaMjR1WTI5dEwwTlEKK1V5MHhMakE3SUdKNUlFVXRiV0ZwYkNCaGRDQkRVRk10Y21WeGRXVnpkSE5BZG1WeWFYTnBaMjR1WTI5dE95QnYKK2NpQmllU0J0WVdsc0lHRjBJRlpsY21sVGFXZHVMQ0JKYm1NdUxDQXlOVGt6SUVOdllYTjBJRUYyWlM0c0lFMXYKK2RXNTBZV2x1SUZacFpYY3NJRU5CSURrME1EUXpJRlZUUVNCVVpXd3VJQ3N4SUNnME1UVXBJRGsyTVMwNE9ETXcKK0lFTnZjSGx5YVdkb2RDQW9ZeWtnTVRrNU5pQldaWEpwVTJsbmJpd2dTVzVqTGlBZ1FXeHNJRkpwWjJoMGN5QlMKK1pYTmxjblpsWkM0Z1EwVlNWRUZKVGlCWFFWSlNRVTVVU1VWVElFUkpVME5NUVVsTlJVUWdZVzVrSUV4SlFVSkoKK1RFbFVXU0JNU1UxSlZFVkVMcUFPQmd4Z2hrZ0JodmhGQVFjQkFRR2hEZ1lNWUlaSUFZYjRSUUVIQVFFQ01DOHcKK0xSWXJhSFIwY0hNNkx5OTNkM2N1ZG1WeWFYTnBaMjR1WTI5dEwzSmxjRzl6YVhSdmNua3ZRMUJUTFRFdU1EQVUKK0JnbGdoa2dCaHZoQ0FRRUJBZjhFQkFNQ0FnUXdEUVlKS29aSWh2Y05BUUVDQlFBRGdZRUFwUkpSa05CcUxMZ3MKKzUzSVIvZDE4T0RkTE9XTVRaK1FPT3hCcnE0NjBpQkVkVXdnRjh2bVBSWDFrdTdVaURlTnphTGx1ckU2ZUZxSHEKKzJ6UHlLNWo2MHpmVExWSk1XS2NRV3dUSkxqSHRYclc4cHhoTnRGYzZGZHZ5NVprSG5DLzlOSWw3L3Q0VTZXcUIKK3A0eStwN1NkTUlrRXdJWmZkczBWYm5ReVg1TVJVSlk9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKKyBzdWJqZWN0PS9DPVVTL089VmVyaVNpZ24sIEluYy4vT1U9Q2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorIGlzc3Vlcj0gL0M9VVMvTz1WZXJpU2lnbiwgSW5jLi9PVT1DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNNVENDQVpvQ0JRS2hBQUFCTUEwR0NTcUdTSWIzRFFFQkFnVUFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1SY3cKK0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aGMzTWdNeUJRZFdKc2FXTWcKK1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwNU5qQXhNamt3TURBd01EQmEKK0Z3MDVPVEV5TXpFeU16VTVOVGxhTUY4eEN6QUpCZ05WQkFZVEFsVlRNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG4KK2Jpd2dTVzVqTGpFM01EVUdBMVVFQ3hNdVEyeGhjM01nTXlCUWRXSnNhV01nVUhKcGJXRnllU0JEWlhKMGFXWnAKK1kyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQXlWeFoKK252SWJpZ0VVdEJEZkJFRGI0MWV2YWtWQWo0UU1DOUV6MmRrUnorNENXQjhsOXlxb1JBV3E3QU1mZUgrZWs3bWEKK0FLb2pmZGFzaGFKalJjZHlKOHowVE1aMWNkSTU3MDlDOEhYZkNwREdqaUJ2bUEvNHJDTmZjQ2sycE1tRzU3R2EKK0lNdFRwWVhuUGI1OW12NGtSVFBjZGhYdEQ2SnhaRXhsTG9Gb1JhY0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRSUYKK0FBT0JnUUIxWm13KzBjMkIyN1g0THpaUnR2ZEN2TTFDcjl3TytoVnMrR2VUVnpycnRwTG90Z0hLakxlT1E3UkoKK1pmays3cjExUmk3Si9DVmRxTWN2aTV1UGFNKzBuSmNZd0Uzdkg5bXZnclBtWkxpRVhJcWFCMUpEWWZ0MG5sczYKK052eE1zdndhUHhVdXBWczhHNURzaUNua1dSYjV6Z2V0N09uZDJ0SXhpay9XMk84WGpRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKyBzdWJqZWN0PS9DPVVTL089VmVyaVNpZ24sIEluYy4vT1U9Q2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorIGlzc3Vlcj0gL0M9VVMvTz1WZXJpU2lnbiwgSW5jLi9PVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNNVENDQVpvQ0JRS21BQUFCTUEwR0NTcUdTSWIzRFFFQkFnVUFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1SY3cKK0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aGMzTWdOQ0JRZFdKc2FXTWcKK1VISnBiV0Z5ZVNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwNU5qQXhNamt3TURBd01EQmEKK0Z3MDVPVEV5TXpFeU16VTVOVGxhTUY4eEN6QUpCZ05WQkFZVEFsVlRNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG4KK2Jpd2dTVzVqTGpFM01EVUdBMVVFQ3hNdVEyeGhjM01nTkNCUWRXSnNhV01nVUhKcGJXRnllU0JEWlhKMGFXWnAKK1kyRjBhVzl1SUVGMWRHaHZjbWwwZVRDQm56QU5CZ2txaGtpRzl3MEJBUUVGQUFPQmpRQXdnWWtDZ1lFQTBMSjEKKzlualFybHBROU9sUXFaK00xKytSbEhEbzBpU1Fkb21GMXQrczVnRVhNb0R3blpOSHZKcGxuUitYcnIvcGhuVmoKK0lJbTlnRmlkQkF5ZHFNRWs2UXZsTVhpOS9DME1OMnFlZUlEcFJuWDU3YVA3RTN2SXdVelNvKy8xUExCaWowcGQKK085MlZaNDhUdWNFODFxY21tK3pETzNyWlRieHRtK2dWQWVQd1I2a0NBd0VBQVRBTkJna3Foa2lHOXcwQkFRSUYKK0FBT0JnUUJUM2RQd25DUitRS3JpL0FBYTE5b00vREpodUJVTmx2UDZWeHQvTTN5djZaaWFZY2g2czdmL3NkeVoKK2c5eXNFdnh3eVI4NFF1MUU5b0F1VzJzemFheWMwMXpuWDFvWXg3RXRlUVNXUVpHWlFiRThEYnFFT2NZN2wvQW0KK3lZN3V2Y3hDbGY4ZXh3SS9WQXg0OWJ5cVlId0NhZWpjck9JQ2RtSEVQZ1BxMG9vazBRPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FuZHJvaWQudGVzdHNzbC90ZXN0c3NsIGIvbGliL29wZW5zc2wvYW5kcm9pZC50ZXN0c3NsL3Rlc3Rzc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyNGIxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FuZHJvaWQudGVzdHNzbC90ZXN0c3NsCkBAIC0wLDAgKzEsMTYzIEBACisjIS9iaW4vc2gKKworaWYgWyAiJDEiID0gIiIgXTsgdGhlbgorICBrZXk9Li4vYXBwcy9zZXJ2ZXIucGVtCitlbHNlCisgIGtleT0iJDEiCitmaQoraWYgWyAiJDIiID0gIiIgXTsgdGhlbgorICBjZXJ0PS4uL2FwcHMvc2VydmVyLnBlbQorZWxzZQorICBjZXJ0PSIkMiIKK2ZpCitzc2x0ZXN0PSJhZGIgc2hlbGwgL3N5c3RlbS9iaW4vc3NsdGVzdCAta2V5ICRrZXkgLWNlcnQgJGNlcnQgLWNfa2V5ICRrZXkgLWNfY2VydCAkY2VydCIKKworaWYgYWRiIHNoZWxsIC9zeXN0ZW0vYmluL29wZW5zc2wgeDUwOSAtaW4gJGNlcnQgLXRleHQgLW5vb3V0IHwgZmdyZXAgJ0RTQSBQdWJsaWMgS2V5JyA+L2Rldi9udWxsOyB0aGVuCisgIGRzYV9jZXJ0PVlFUworZWxzZQorICBkc2FfY2VydD1OTworZmkKKworaWYgWyAiJDMiID0gIiIgXTsgdGhlbgorICBDQT0iLUNBcGF0aCAuLi9jZXJ0cyIKK2Vsc2UKKyAgQ0E9Ii1DQWZpbGUgJDMiCitmaQorCitpZiBbICIkNCIgPSAiIiBdOyB0aGVuCisgIGV4dHJhPSIiCitlbHNlCisgIGV4dHJhPSIkNCIKK2ZpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2VjaG8gdGVzdCBzc2x2MgorJHNzbHRlc3QgLXNzbDIgJGV4dHJhIHx8IGV4aXQgMQorCitlY2hvIHRlc3Qgc3NsdjIgd2l0aCBzZXJ2ZXIgYXV0aGVudGljYXRpb24KKyRzc2x0ZXN0IC1zc2wyIC1zZXJ2ZXJfYXV0aCAkQ0EgJGV4dHJhIHx8IGV4aXQgMQorCitpZiBbICRkc2FfY2VydCA9IE5PIF07IHRoZW4KKyAgZWNobyB0ZXN0IHNzbHYyIHdpdGggY2xpZW50IGF1dGhlbnRpY2F0aW9uCisgICRzc2x0ZXN0IC1zc2wyIC1jbGllbnRfYXV0aCAkQ0EgJGV4dHJhIHx8IGV4aXQgMQorCisgIGVjaG8gdGVzdCBzc2x2MiB3aXRoIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRpb24KKyAgJHNzbHRlc3QgLXNzbDIgLXNlcnZlcl9hdXRoIC1jbGllbnRfYXV0aCAkQ0EgJGV4dHJhIHx8IGV4aXQgMQorZmkKKworZWNobyB0ZXN0IHNzbHYzCiskc3NsdGVzdCAtc3NsMyAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2MyB3aXRoIHNlcnZlciBhdXRoZW50aWNhdGlvbgorJHNzbHRlc3QgLXNzbDMgLXNlcnZlcl9hdXRoICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2MyB3aXRoIGNsaWVudCBhdXRoZW50aWNhdGlvbgorJHNzbHRlc3QgLXNzbDMgLWNsaWVudF9hdXRoICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2MyB3aXRoIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRpb24KKyRzc2x0ZXN0IC1zc2wzIC1zZXJ2ZXJfYXV0aCAtY2xpZW50X2F1dGggJENBICRleHRyYSB8fCBleGl0IDEKKworZWNobyB0ZXN0IHNzbHYyL3NzbHYzCiskc3NsdGVzdCAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3aXRoIHNlcnZlciBhdXRoZW50aWNhdGlvbgorJHNzbHRlc3QgLXNlcnZlcl9hdXRoICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3aXRoIGNsaWVudCBhdXRoZW50aWNhdGlvbgorJHNzbHRlc3QgLWNsaWVudF9hdXRoICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3aXRoIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRpb24KKyRzc2x0ZXN0IC1zZXJ2ZXJfYXV0aCAtY2xpZW50X2F1dGggJENBICRleHRyYSB8fCBleGl0IDEKKworZWNobyB0ZXN0IHNzbHYyL3NzbHYzIHdpdGggYm90aCBjbGllbnQgYW5kIHNlcnZlciBhdXRoZW50aWNhdGlvbiBhbmQgc21hbGwgY2xpZW50IGJ1ZmZlcnMKKyRzc2x0ZXN0IC1zZXJ2ZXJfYXV0aCAtY2xpZW50X2F1dGggLWNfc21hbGxfcmVjb3JkcyAkQ0EgJGV4dHJhIHx8IGV4aXQgMQorCitlY2hvIHRlc3Qgc3NsdjIvc3NsdjMgd2l0aCBib3RoIGNsaWVudCBhbmQgc2VydmVyIGF1dGhlbnRpY2F0aW9uIGFuZCBzbWFsbCBzZXJ2ZXIgYnVmZmVycworJHNzbHRlc3QgLXNlcnZlcl9hdXRoIC1jbGllbnRfYXV0aCAtc19zbWFsbF9yZWNvcmRzICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3aXRoIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRpb24gYW5kIHNtYWxsIGNsaWVudCBhbmQgc2VydmVyIGJ1ZmZlcnMKKyRzc2x0ZXN0IC1zZXJ2ZXJfYXV0aCAtY2xpZW50X2F1dGggLWNfc21hbGxfcmVjb3JkcyAtc19zbWFsbF9yZWNvcmRzICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3aXRoIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRpb24gYW5kIGhhbmRzaGFrZSBjdXR0aHJvdWdoCiskc3NsdGVzdCAtc2VydmVyX2F1dGggLWNsaWVudF9hdXRoIC1jdXR0aHJvdWdoICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2MiB2aWEgQklPIHBhaXIKKyRzc2x0ZXN0IC1iaW9fcGFpciAtc3NsMiAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2MiB3aXRoIHNlcnZlciBhdXRoZW50aWNhdGlvbiB2aWEgQklPIHBhaXIKKyRzc2x0ZXN0IC1iaW9fcGFpciAtc3NsMiAtc2VydmVyX2F1dGggJENBICRleHRyYSB8fCBleGl0IDEKKworaWYgWyAkZHNhX2NlcnQgPSBOTyBdOyB0aGVuCisgIGVjaG8gdGVzdCBzc2x2MiB3aXRoIGNsaWVudCBhdXRoZW50aWNhdGlvbiB2aWEgQklPIHBhaXIKKyAgJHNzbHRlc3QgLWJpb19wYWlyIC1zc2wyIC1jbGllbnRfYXV0aCAkQ0EgJGV4dHJhIHx8IGV4aXQgMQorCisgIGVjaG8gdGVzdCBzc2x2MiB3aXRoIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRpb24gdmlhIEJJTyBwYWlyCisgICRzc2x0ZXN0IC1iaW9fcGFpciAtc3NsMiAtc2VydmVyX2F1dGggLWNsaWVudF9hdXRoICRDQSAkZXh0cmEgfHwgZXhpdCAxCitmaQorCitlY2hvIHRlc3Qgc3NsdjMgdmlhIEJJTyBwYWlyCiskc3NsdGVzdCAtYmlvX3BhaXIgLXNzbDMgJGV4dHJhIHx8IGV4aXQgMQorCitlY2hvIHRlc3Qgc3NsdjMgd2l0aCBzZXJ2ZXIgYXV0aGVudGljYXRpb24gdmlhIEJJTyBwYWlyCiskc3NsdGVzdCAtYmlvX3BhaXIgLXNzbDMgLXNlcnZlcl9hdXRoICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2MyB3aXRoIGNsaWVudCBhdXRoZW50aWNhdGlvbiB2aWEgQklPIHBhaXIKKyRzc2x0ZXN0IC1iaW9fcGFpciAtc3NsMyAtY2xpZW50X2F1dGggJENBICRleHRyYSB8fCBleGl0IDEKKworZWNobyB0ZXN0IHNzbHYzIHdpdGggYm90aCBjbGllbnQgYW5kIHNlcnZlciBhdXRoZW50aWNhdGlvbiB2aWEgQklPIHBhaXIKKyRzc2x0ZXN0IC1iaW9fcGFpciAtc3NsMyAtc2VydmVyX2F1dGggLWNsaWVudF9hdXRoICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB2aWEgQklPIHBhaXIKKyRzc2x0ZXN0ICRleHRyYSB8fCBleGl0IDEKKworaWYgWyAkZHNhX2NlcnQgPSBOTyBdOyB0aGVuCisgIGVjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3L28gREhFIHZpYSBCSU8gcGFpcgorICAkc3NsdGVzdCAtYmlvX3BhaXIgLW5vX2RoZSAkZXh0cmEgfHwgZXhpdCAxCitmaQorCitlY2hvIHRlc3Qgc3NsdjIvc3NsdjMgd2l0aCAxMDI0Yml0IERIRSB2aWEgQklPIHBhaXIKKyRzc2x0ZXN0IC1iaW9fcGFpciAtZGhlMTAyNGRzYSAtdiAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3aXRoIHNlcnZlciBhdXRoZW50aWNhdGlvbgorJHNzbHRlc3QgLWJpb19wYWlyIC1zZXJ2ZXJfYXV0aCAkQ0EgJGV4dHJhIHx8IGV4aXQgMQorCitlY2hvIHRlc3Qgc3NsdjIvc3NsdjMgd2l0aCBjbGllbnQgYXV0aGVudGljYXRpb24gdmlhIEJJTyBwYWlyCiskc3NsdGVzdCAtYmlvX3BhaXIgLWNsaWVudF9hdXRoICRDQSAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3aXRoIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRpb24gdmlhIEJJTyBwYWlyCiskc3NsdGVzdCAtYmlvX3BhaXIgLXNlcnZlcl9hdXRoIC1jbGllbnRfYXV0aCAkQ0EgJGV4dHJhIHx8IGV4aXQgMQorCitlY2hvIHRlc3Qgc3NsdjIvc3NsdjMgd2l0aCBib3RoIGNsaWVudCBhbmQgc2VydmVyIGF1dGhlbnRpY2F0aW9uIHZpYSBCSU8gcGFpciBhbmQgYXBwIHZlcmlmeQorJHNzbHRlc3QgLWJpb19wYWlyIC1zZXJ2ZXJfYXV0aCAtY2xpZW50X2F1dGggLWFwcF92ZXJpZnkgJENBICRleHRyYSB8fCBleGl0IDEKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgWyBgYWRiIHNoZWxsIC9zeXN0ZW0vYmluL29wZW5zc2wgbm8tZGhgID0gbm8tZGggXTsgdGhlbgorICBlY2hvIHNraXBwaW5nIGFub255bW91cyBESCB0ZXN0cworZWxzZQorICBlY2hvIHRlc3QgdGxzMSB3aXRoIDEwMjRiaXQgYW5vbnltb3VzIERILCBtdWx0aXBsZSBoYW5kc2hha2VzCisgICRzc2x0ZXN0IC12IC1iaW9fcGFpciAtdGxzMSAtY2lwaGVyIEFESCAtZGhlMTAyNGRzYSAtbnVtIDEwIC1mIC10aW1lICRleHRyYSB8fCBleGl0IDEKK2ZpCisKK2lmIFsgYGFkYiBzaGVsbCAvc3lzdGVtL2Jpbi9vcGVuc3NsIG5vLXJzYWAgPSBuby1kaCBdOyB0aGVuCisgIGVjaG8gc2tpcHBpbmcgUlNBIHRlc3RzCitlbHNlCisgIGVjaG8gdGVzdCB0bHMxIHdpdGggMTAyNGJpdCBSU0EsIG5vIERIRSwgbXVsdGlwbGUgaGFuZHNoYWtlcworICBhZGIgc2hlbGwgL3N5c3RlbS9iaW4vc3NsdGVzdCAtdiAtYmlvX3BhaXIgLXRsczEgLWNlcnQgL3NkY2FyZC9hbmRyb2lkLnRlc3Rzc2wvc2VydmVyMi5wZW0gLW5vX2RoZSAtbnVtIDEwIC1mIC10aW1lICRleHRyYSB8fCBleGl0IDEKKworICBpZiBbIGBhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCBuby1kaGAgPSBuby1kaCBdOyB0aGVuCisgICAgZWNobyBza2lwcGluZyBSU0ErREhFIHRlc3RzCisgIGVsc2UKKyAgICBlY2hvIHRlc3QgdGxzMSB3aXRoIDEwMjRiaXQgUlNBLCAxMDI0Yml0IERIRSwgbXVsdGlwbGUgaGFuZHNoYWtlcworICAgIGFkYiBzaGVsbCAvc3lzdGVtL2Jpbi9zc2x0ZXN0IC12IC1iaW9fcGFpciAtdGxzMSAtY2VydCAvc2RjYXJkL2FuZHJvaWQudGVzdHNzbC9zZXJ2ZXIyLnBlbSAtZGhlMTAyNGRzYSAtbnVtIDEwIC1mIC10aW1lICRleHRyYSB8fCBleGl0IDEKKyAgZmkKK2ZpCisKK2VjaG8gdGVzdCB0bHMxIHdpdGggUFNLCiskc3NsdGVzdCAtdGxzMSAtY2lwaGVyIFBTSyAtcHNrIGFiYzEyMyAkZXh0cmEgfHwgZXhpdCAxCisKK2VjaG8gdGVzdCB0bHMxIHdpdGggUFNLIHZpYSBCSU8gcGFpcgorJHNzbHRlc3QgLWJpb19wYWlyIC10bHMxIC1jaXBoZXIgUFNLIC1wc2sgYWJjMTIzICRleHRyYSB8fCBleGl0IDEKKworZXhpdCAwCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hbmRyb2lkLnRlc3Rzc2wvdGVzdHNzbC5zaCBiL2xpYi9vcGVuc3NsL2FuZHJvaWQudGVzdHNzbC90ZXN0c3NsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNTYwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hbmRyb2lkLnRlc3Rzc2wvdGVzdHNzbC5zaApAQCAtMCwwICsxLDc3IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBBbmRyb2lkIHRlc3Rzc2wuc2ggZHJpdmVyIHNjcmlwdCBmb3Igb3BlbnNzbCdzIHRlc3Rzc2wKKyMKKyMgYmFzZWQgb24gb3BlbnNzbCdzIHRlc3QvdGVzdHNzIHNjcmlwdCBhbmQgdGVzdC9NYWtlZmlsZSdzIHRlc3Rfc3NsIHRhcmdldAorIworCitzZXQgLWUKK3RyYXAgImVjaG8gRXhpdGluZyBvbiB1bmV4cGVjdGVkIGVycm9yLiIgRVJSCisKK2RldmljZT0vc2RjYXJkL2FuZHJvaWQudGVzdHNzbAorCitkaWdlc3Q9Jy1zaGExJworcmVxY21kPSJhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCByZXEiCit4NTA5Y21kPSJhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCB4NTA5ICRkaWdlc3QiCisKK0NBa2V5PSIkZGV2aWNlL2tleUNBLnNzIgorQ0FjZXJ0PSIkZGV2aWNlL2NlcnRDQS5zcyIKK0NBcmVxPSIkZGV2aWNlL3JlcUNBLnNzIgorQ0Fjb25mPSIkZGV2aWNlL0NBc3MuY25mIgorCitVY29uZj0iJGRldmljZS9Vc3MuY25mIgorVXJlcT0iJGRldmljZS9yZXFVLnNzIgorVWtleT0iJGRldmljZS9rZXlVLnNzIgorVWNlcnQ9IiRkZXZpY2UvY2VydFUuc3MiCisKK2VjaG8KK2VjaG8gInNldHRpbmcgdXAiCithZGIgcmVtb3VudAorYWRiIHNoZWxsIHJtIC1yICRkZXZpY2UKK2FkYiBzaGVsbCBta2RpciAkZGV2aWNlCisKK2VjaG8KK2VjaG8gInB1c2hpbmcgdGVzdCBmaWxlcyB0byBkZXZpY2UiCithZGIgcHVzaCAuICRkZXZpY2UKKworZWNobworZWNobyAibWFrZSBhIGNlcnRpZmljYXRlIHJlcXVlc3QgdXNpbmcgJ3JlcSciCithZGIgc2hlbGwgImVjaG8gXCJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHlcIiA+PiAkZGV2aWNlLy5ybmQiCityZXFfbmV3PSctbmV3JworJHJlcWNtZCAtY29uZmlnICRDQWNvbmYgLW91dCAkQ0FyZXEgLWtleW91dCAkQ0FrZXkgJHJlcV9uZXcKKworZWNobworZWNobyAiY29udmVydCB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCBpbnRvIGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgdXNpbmcgJ3g1MDknIgorJHg1MDljbWQgLUNBY3JlYXRlc2VyaWFsIC1pbiAkQ0FyZXEgLWRheXMgMzAgLXJlcSAtb3V0ICRDQWNlcnQgLXNpZ25rZXkgJENBa2V5IC1leHRmaWxlICRDQWNvbmYgLWV4dGVuc2lvbnMgdjNfY2EKKworZWNobworZWNobyAibWFrZSBhIHVzZXIgY2VydGlmaWNhdGUgcmVxdWVzdCB1c2luZyAncmVxJyIKKyRyZXFjbWQgLWNvbmZpZyAkVWNvbmYgLW91dCAkVXJlcSAta2V5b3V0ICRVa2V5ICRyZXFfbmV3CisKK2VjaG8KK2VjaG8gInNpZ24gdXNlciBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHdpdGggdGhlIGp1c3QgY3JlYXRlZCBDQSB2aWEgJ3g1MDknIgorJHg1MDljbWQgLUNBY3JlYXRlc2VyaWFsIC1pbiAkVXJlcSAtZGF5cyAzMCAtcmVxIC1vdXQgJFVjZXJ0IC1DQSAkQ0FjZXJ0IC1DQWtleSAkQ0FrZXkgLWV4dGZpbGUgJFVjb25mIC1leHRlbnNpb25zIHYzX2VlCisKK2VjaG8KK2VjaG8gInJ1bm5pbmcgdGVzdHNzbCIKKy4vdGVzdHNzbCAkVWtleSAkVWNlcnQgJENBY2VydAorCitlY2hvCitlY2hvICJjbGVhbmluZyB1cCIKK2FkYiBzaGVsbCBybSAtciAkZGV2aWNlCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL0FuZHJvaWQubWsgYi9saWIvb3BlbnNzbC9hcHBzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlMDdhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDc5IEBACisjIENvcHlyaWdodCAyMDA2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCWFwcF9yYW5kLmMgXAorCWFwcHMuYyBcCisJYXNuMXBhcnMuYyBcCisJY2EuYyBcCisJY2lwaGVycy5jIFwKKwljcmwuYyBcCisJY3JsMnA3LmMgXAorCWRnc3QuYyBcCisJZGguYyBcCisJZGhwYXJhbS5jIFwKKwlkc2EuYyBcCisJZHNhcGFyYW0uYyBcCisJZWNwYXJhbS5jIFwKKwllYy5jIFwKKwllbmMuYyBcCisJZW5naW5lLmMgXAorCWVycnN0ci5jIFwKKwlnZW5kaC5jIFwKKwlnZW5kc2EuYyBcCisJZ2VucGtleS5jIFwKKwlnZW5yc2EuYyBcCisJbnNlcS5jIFwKKwlvY3NwLmMgXAorCW9wZW5zc2wuYyBcCisJcGFzc3dkLmMgXAorCXBrY3MxMi5jIFwKKwlwa2NzNy5jIFwKKwlwa2NzOC5jIFwKKwlwa2V5LmMgXAorCXBrZXlwYXJhbS5jIFwKKwlwa2V5dXRsLmMgXAorCXByaW1lLmMgXAorCXJhbmQuYyBcCisJcmVxLmMgXAorCXJzYS5jIFwKKwlyc2F1dGwuYyBcCisJc19jYi5jIFwKKwlzX2NsaWVudC5jIFwKKwlzX3NlcnZlci5jIFwKKwlzX3NvY2tldC5jIFwKKwlzX3RpbWUuYyBcCisJc2Vzc19pZC5jIFwKKwlzbWltZS5jIFwKKwlzcGVlZC5jIFwKKwlzcGthYy5jIFwKKwl2ZXJpZnkuYyBcCisJdmVyc2lvbi5jIFwKKwl4NTA5LmMKKworIyAgIGNtcy5jIGVjLmMgc19zZXJ2ZXIuYworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJzc2wgXAorCWxpYmNyeXB0byAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJZXh0ZXJuYWwvb3BlbnNzbCBcCisJZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyA6PSAtRE1PTk9MSVRICisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi9hbmRyb2lkLWNvbmZpZy5taworCisjIFRoZXNlIGZsYWdzIG9taXQgd2hvbGUgZmVhdHVyZXMgZnJvbSB0aGUgY29tbWFuZGxpbmUgIm9wZW5zc2wiLgorIyBIb3dldmVyLCBwb3J0aW9ucyBvZiB0aGVzZSBmZWF0dXJlcyBhcmUgYWN0dWFsbHkgdHVybmVkIG9uLgorTE9DQUxfQ0ZMQUdTICs9IC1ET1BFTlNTTF9OT19EVExTMQorCisKK0xPQ0FMX01PRFVMRTo9IG9wZW5zc2wKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL0NBLmNvbSBiL2xpYi9vcGVuc3NsL2FwcHMvQ0EuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjdiYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL0NBLmNvbQpAQCAtMCwwICsxLDIyMCBAQAorJCEgQ0EgLSB3cmFwcGVyIGFyb3VuZCBjYSB0byBtYWtlIGl0IGVhc2llciB0byB1c2UgLi4uIGJhc2ljYWxseSBjYSByZXF1aXJlcworJCEgICAgICBzb21lIHNldHVwIHN0dWZmIHRvIGJlIGRvbmUgYmVmb3JlIHlvdSBjYW4gdXNlIGl0IGFuZCB0aGlzIG1ha2VzCiskISAgICAgIHRoaW5ncyBlYXNpZXIgYmV0d2VlbiBub3cgYW5kIHdoZW4gRXJpYyBpcyBjb252aW5jZWQgdG8gZml4IGl0IDotKQorJCEKKyQhIENBIC1uZXdjYSAuLi4gd2lsbCBzZXR1cCB0aGUgcmlnaHQgc3R1ZmYKKyQhIENBIC1uZXdyZXEgLi4uIHdpbGwgZ2VuZXJhdGUgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IAorJCEgQ0EgLXNpZ24gLi4uIHdpbGwgc2lnbiB0aGUgZ2VuZXJhdGVkIHJlcXVlc3QgYW5kIG91dHB1dCAKKyQhCiskISBBdCB0aGUgZW5kIG9mIHRoYXQgZ3JhYiBuZXdyZXEucGVtIGFuZCBuZXdjZXJ0LnBlbSAob25lIGhhcyB0aGUga2V5IAorJCEgYW5kIHRoZSBvdGhlciB0aGUgY2VydGlmaWNhdGUpIGFuZCBjYXQgdGhlbSB0b2dldGhlciBhbmQgdGhhdCBpcyB3aGF0CiskISB5b3Ugd2FudC9uZWVkIC4uLiBJJ2xsIG1ha2UgZXZlbiB0aGlzIGEgbGl0dGxlIGNsZWFuZXIgbGF0ZXIuCiskIQorJCEKKyQhIDEyLUphbi05NiB0amggICAgQWRkZWQgbW9yZSB0aGluZ3MgLi4uIGluY2x1ZGluZyBDQSAtc2lnbmNlcnQgd2hpY2gKKyQhICAgICAgICAgICAgICAgICAgY29udmVydHMgYSBjZXJ0aWZpY2F0ZSB0byBhIHJlcXVlc3QgYW5kIHRoZW4gc2lnbnMgaXQuCiskISAxMC1KYW4tOTYgZWF5ICAgIEZpeGVkIGEgZmV3IG1vcmUgYnVncyBhbmQgYWRkZWQgdGhlIFNTTEVBWV9DT05GSUcKKyQhICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSBzbyB0aGlzIGNhbiBiZSBkcml2ZW4gZnJvbQorJCEgICAgICAgICAgICAgICAgIGEgc2NyaXB0LgorJCEgMjUtSnVsLTk2IGVheSAgICBDbGVhbmVkIHVwIGZpbGVuYW1lcyBzb21lIG1vcmUuCiskISAxMS1KdW4tOTYgZWF5ICAgIEZpeGVkIGEgZmV3IGZpbGVuYW1lIG1pc3NtYXRjaGVzLgorJCEgMDMtTWF5LTk2IGVheSAgICBNb2RpZmllZCB0byB1c2UgJ29wZW5zc2wgY21kJyBpbnN0ZWFkIG9mICdjbWQnLgorJCEgMTgtQXByLTk2IHRqaCAgICBPcmlnaW5hbCBoYWNraW5nCiskIQorJCEgVGltIEh1ZHNvbgorJCEgdGpoQGNyeXB0c29mdC5jb20KKyQhCiskIQorJCEgZGVmYXVsdCBzc2xlYXkuY25mIGZpbGUgaGFzIHNldHVwIGFzIHBlciB0aGUgZm9sbG93aW5nCiskISBkZW1vQ0EgLi4uIHdoZXJlIGV2ZXJ5dGhpbmcgaXMgc3RvcmVkCiskCiskIElGIEYkVFlQRShTU0xFQVlfQ09ORklHKSAuRVFTLiAiIiBUSEVOIFNTTEVBWV9DT05GSUcgOj0gU1NMTElCOlNTTEVBWS5DTkYKKyQKKyQgREFZUyAgID0gIi1kYXlzIDM2NSIKKyQgUkVRICAgID0gb3BlbnNzbCArICIgcmVxICIgKyBTU0xFQVlfQ09ORklHCiskIENBICAgICA9IG9wZW5zc2wgKyAiIGNhICIgKyBTU0xFQVlfQ09ORklHCiskIFZFUklGWSA9IG9wZW5zc2wgKyAiIHZlcmlmeSIKKyQgWDUwOSAgID0gb3BlbnNzbCArICIgeDUwOSIKKyQgUEtDUzEyID0gb3BlbnNzbCArICIgcGtjczEyIgorJCBlY2hvICAgPSAid3JpdGUgc3lzJE91dHB1dCIKKyQhCiskIHMgPSBGJFBBUlNFKEYkRU5WSVJPTk1FTlQoIkRFRkFVTFQiKSwiW10iKSAtICJdLjsiCiskIENBVE9QICA6PSAncycuZGVtb0NBCiskIENBS0VZICA6PSBdY2FrZXkucGVtCiskIENBQ0VSVCA6PSBdY2FjZXJ0LnBlbQorJAorJCBfX0lOUFVUIDo9IFNZUyRDT01NQU5ECiskIFJFVCA9IDEKKyQhCiskIGkgPSAxCiskb3B0X2xvb3A6CiskIGlmIGkgLmd0LiA4IHRoZW4gZ290byBvcHRfbG9vcF9lbmQKKyQKKyQgcHJvZ19vcHQgPSBGJEVESVQoUCdpJywibG93ZXJjYXNlIikKKyQKKyQgSUYgKHByb2dfb3B0IC5FUVMuICI/IiAuT1IuIHByb2dfb3B0IC5FUVMuICItaCIgLk9SLiBwcm9nX29wdCAuRVFTLiAiLWhlbHAiKSAKKyQgVEhFTgorJCAgIGVjaG8gInVzYWdlOiBDQSAtbmV3Y2VydHwtbmV3cmVxfC1uZXdjYXwtc2lnbnwtdmVyaWZ5IiAKKyQgICBleGl0CiskIEVORElGCiskIQorJCBJRiAocHJvZ19vcHQgLkVRUy4gIi1pbnB1dCIpCiskIFRIRU4KKyQgICAhIEdldCBpbnB1dCBmcm9tIHNvbWV3aGVyZSBvdGhlciB0aGFuIFNZUyRDT01NQU5ECiskICAgaSA9IGkgKyAxCiskICAgX19JTlBVVCA9IFAnaScKKyQgICBHT1RPIG9wdF9sb29wX2NvbnRpbnVlCiskIEVORElGCiskIQorJCBJRiAocHJvZ19vcHQgLkVRUy4gIi1uZXdjZXJ0IikKKyQgVEhFTgorJCAgICEgQ3JlYXRlIGEgY2VydGlmaWNhdGUuCiskICAgREVGSU5FL1VTRVIgU1lTJElOUFVUICdfX0lOUFVUJworJCAgIFJFUSAtbmV3IC14NTA5IC1rZXlvdXQgbmV3cmVxLnBlbSAtb3V0IG5ld3JlcS5wZW0gJ0RBWVMnCiskICAgUkVUPSRTVEFUVVMKKyQgICBlY2hvICJDZXJ0aWZpY2F0ZSAoYW5kIHByaXZhdGUga2V5KSBpcyBpbiBuZXdyZXEucGVtIgorJCAgIEdPVE8gb3B0X2xvb3BfY29udGludWUKKyQgRU5ESUYKKyQhCiskIElGIChwcm9nX29wdCAuRVFTLiAiLW5ld3JlcSIpCiskIFRIRU4KKyQgICAhIENyZWF0ZSBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKyQgICBERUZJTkUvVVNFUiBTWVMkSU5QVVQgJ19fSU5QVVQnCiskICAgUkVRIC1uZXcgLWtleW91dCBuZXdyZXEucGVtIC1vdXQgbmV3cmVxLnBlbSAnREFZUycKKyQgICBSRVQ9JFNUQVRVUworJCAgIGVjaG8gIlJlcXVlc3QgKGFuZCBwcml2YXRlIGtleSkgaXMgaW4gbmV3cmVxLnBlbSIKKyQgICBHT1RPIG9wdF9sb29wX2NvbnRpbnVlCiskIEVORElGCiskIQorJCBJRiAocHJvZ19vcHQgLkVRUy4gIi1uZXdjYSIpCiskIFRIRU4KKyQgICAhIElmIGV4cGxpY2l0bHkgYXNrZWQgZm9yIG9yIGl0IGRvZXNuJ3QgZXhpc3QgdGhlbiBzZXR1cCB0aGUgZGlyZWN0b3J5CiskICAgISBzdHJ1Y3R1cmUgdGhhdCBFcmljIGxpa2VzIHRvIG1hbmFnZSB0aGluZ3MuCiskICAgSUYgRiRTRUFSQ0goQ0FUT1ArIl1zZXJpYWwuIikgLkVRUy4gIiIKKyQgICBUSEVOCiskICAgICBDUkVBVEUgL0RJUiAvUFJPVEVDVElPTj1PV05FUjpSV0VEICdDQVRPUCddCiskICAgICBDUkVBVEUgL0RJUiAvUFJPVEVDVElPTj1PV05FUjpSV0VEICdDQVRPUCcuY2VydHNdCiskICAgICBDUkVBVEUgL0RJUiAvUFJPVEVDVElPTj1PV05FUjpSV0VEICdDQVRPUCcuY3JsXQorJCAgICAgQ1JFQVRFIC9ESVIgL1BST1RFQ1RJT049T1dORVI6UldFRCAnQ0FUT1AnLm5ld2NlcnRzXQorJCAgICAgQ1JFQVRFIC9ESVIgL1BST1RFQ1RJT049T1dORVI6UldFRCAnQ0FUT1AnLnByaXZhdGVdCiskCiskICAgICBPUEVOICAgL1dSSVRFIHNlcl9maWxlICdDQVRPUCddc2VyaWFsLiAKKyQgICAgIFdSSVRFIHNlcl9maWxlICIwMSIKKyQgICAgIENMT1NFIHNlcl9maWxlCiskICAgICBBUFBFTkQvTkVXIE5MOiAnQ0FUT1AnXWluZGV4LnR4dAorJAorJCAgICAgISBUaGUgZm9sbG93aW5nIGlzIHRvIG1ha2Ugc3VyZSBhY2Nlc3MoKSBkb2Vzbid0IGdldCBjb25mdXNlZC4gIEl0CiskICAgICAhIHJlYWxseSBuZWVkcyBvbmUgZmlsZSBpbiB0aGUgZGlyZWN0b3J5IHRvIGdpdmUgY29ycmVjdCBhbnN3ZXJzLi4uCiskICAgICBDT1BZIE5MQTA6ICdDQVRPUCcuY2VydHNdLjsKKyQgICAgIENPUFkgTkxBMDogJ0NBVE9QJy5jcmxdLjsKKyQgICAgIENPUFkgTkxBMDogJ0NBVE9QJy5uZXdjZXJ0c10uOworJCAgICAgQ09QWSBOTEEwOiAnQ0FUT1AnLnByaXZhdGVdLjsKKyQgICBFTkRJRgorJCEKKyQgICBJRiBGJFNFQVJDSChDQVRPUCsiLnByaXZhdGUiK0NBS0VZKSAuRVFTLiAiIgorJCAgIFRIRU4KKyQgICAgIFJFQUQgJ19fSU5QVVQnIEZJTEUgLQorCSAgIC9QUk9NUFQ9IkNBIGNlcnRpZmljYXRlIGZpbGVuYW1lIChvciBlbnRlciB0byBjcmVhdGUpIgorJCAgICAgSUYgKEZJTEUgLk5FUy4gIiIpIC5BTkQuIChGJFNFQVJDSChGSUxFKSAuTkVTLiAiIikKKyQgICAgIFRIRU4KKyQgICAgICAgQ09QWSAnRklMRScgJ0NBVE9QJy5wcml2YXRlJ0NBS0VZJworJAlSRVQ9JFNUQVRVUworJCAgICAgRUxTRQorJCAgICAgICBlY2hvICJNYWtpbmcgQ0EgY2VydGlmaWNhdGUgLi4uIgorJCAgICAgICBERUZJTkUvVVNFUiBTWVMkSU5QVVQgJ19fSU5QVVQnCiskICAgICAgIFJFUSAtbmV3IC14NTA5IC1rZXlvdXQgJ0NBVE9QJy5wcml2YXRlJ0NBS0VZJyAtCisJCSAgICAgICAtb3V0ICdDQVRPUCcnQ0FDRVJUJyAnREFZUycKKyQJUkVUPSRTVEFUVVMKKyQgICAgIEVORElGCiskICAgRU5ESUYKKyQgICBHT1RPIG9wdF9sb29wX2NvbnRpbnVlCiskIEVORElGCiskIQorJCBJRiAocHJvZ19vcHQgLkVRUy4gIi1wa2NzMTIiKQorJCBUSEVOCiskICAgaSA9IGkgKyAxCiskICAgY25hbWUgPSBQJ2knCiskICAgSUYgY25hbWUgLkVRUy4gIiIgVEhFTiBjbmFtZSA9ICJNeSBjZXJ0aWZpY2F0ZSIKKyQgICBQS0NTMTIgLWluIG5ld2NlcnQucGVtIC1pbmtleSBuZXdyZXEucGVtIC1jZXJ0ZmlsZSAnQ0FUT1AnJ0NBQ0VSVCAtCisJICAgLW91dCBuZXdjZXJ0LnAxMiAtZXhwb3J0IC1uYW1lICInJ2NuYW1lJyIKKyQgICBSRVQ9JFNUQVRVUworJCAgIGV4aXQgUkVUCiskIEVORElGCiskIQorJCBJRiAocHJvZ19vcHQgLkVRUy4gIi14c2lnbiIpCiskIFRIRU4KKyQhCiskICAgREVGSU5FL1VTRVIgU1lTJElOUFVUICdfX0lOUFVUJworJCAgIENBIC1wb2xpY3kgcG9saWN5X2FueXRoaW5nIC1pbmZpbGVzIG5ld3JlcS5wZW0KKyQgICBSRVQ9JFNUQVRVUworJCAgIEdPVE8gb3B0X2xvb3BfY29udGludWUKKyQgRU5ESUYKKyQhCiskIElGICgocHJvZ19vcHQgLkVRUy4gIi1zaWduIikgLk9SLiAocHJvZ19vcHQgLkVRUy4gIi1zaWducmVxIikpCiskIFRIRU4KKyQhICAgCiskICAgREVGSU5FL1VTRVIgU1lTJElOUFVUICdfX0lOUFVUJworJCAgIENBIC1wb2xpY3kgcG9saWN5X2FueXRoaW5nIC1vdXQgbmV3Y2VydC5wZW0gLWluZmlsZXMgbmV3cmVxLnBlbQorJCAgIFJFVD0kU1RBVFVTCiskICAgdHlwZSBuZXdjZXJ0LnBlbQorJCAgIGVjaG8gIlNpZ25lZCBjZXJ0aWZpY2F0ZSBpcyBpbiBuZXdjZXJ0LnBlbSIKKyQgICBHT1RPIG9wdF9sb29wX2NvbnRpbnVlCiskIEVORElGCiskIQorJCBJRiAocHJvZ19vcHQgLkVRUy4gIi1zaWduY2VydCIpCiskICBUSEVOCiskISAgIAorJCAgIGVjaG8gIkNlcnQgcGFzc3BocmFzZSB3aWxsIGJlIHJlcXVlc3RlZCB0d2ljZSAtIGJ1Zz8iCiskICAgREVGSU5FL1VTRVIgU1lTJElOUFVUICdfX0lOUFVUJworJCAgIFg1MDkgLXg1MDl0b3JlcSAtaW4gbmV3cmVxLnBlbSAtc2lnbmtleSBuZXdyZXEucGVtIC1vdXQgdG1wLnBlbQorJCAgIERFRklORS9VU0VSIFNZUyRJTlBVVCAnX19JTlBVVCcKKyQgICBDQSAtcG9saWN5IHBvbGljeV9hbnl0aGluZyAtb3V0IG5ld2NlcnQucGVtIC1pbmZpbGVzIHRtcC5wZW0KK3kKK3kKKyQgICB0eXBlIG5ld2NlcnQucGVtCiskICAgZWNobyAiU2lnbmVkIGNlcnRpZmljYXRlIGlzIGluIG5ld2NlcnQucGVtIgorJCAgIEdPVE8gb3B0X2xvb3BfY29udGludWUKKyQgRU5ESUYKKyQhCiskIElGIChwcm9nX29wdCAuRVFTLiAiLXZlcmlmeSIpCiskIFRIRU4KKyQhICAgCiskICAgaSA9IGkgKyAxCiskICAgSUYgKHAnaScgLkVRUy4gIiIpCiskICAgVEhFTgorJCAgICAgREVGSU5FL1VTRVIgU1lTJElOUFVUICdfX0lOUFVUJworJCAgICAgVkVSSUZZICItQ0FmaWxlIiAnQ0FUT1AnJ0NBQ0VSVCcgbmV3Y2VydC5wZW0KKyQgICBFTFNFCiskICAgICBqID0gaQorJCAgICB2ZXJpZnlfb3B0X2xvb3A6CiskICAgICBJRiBqIC5HVC4gOCBUSEVOIEdPVE8gdmVyaWZ5X29wdF9sb29wX2VuZAorJCAgICAgSUYgcCdqJyAuTkVTLiAiIgorJCAgICAgVEhFTiAKKyQgICAgICAgREVGSU5FL1VTRVIgU1lTJElOUFVUICdfX0lOUFVUJworJCAgICAgICBfX3RtcCA9IHAnaicKKyQgICAgICAgVkVSSUZZICItQ0FmaWxlIiAnQ0FUT1AnJ0NBQ0VSVCcgJ19fdG1wJworJCAgICAgICB0bXA9JFNUQVRVUworJCAgICAgICBJRiB0bXAgLk5FLiAwIFRIRU4gUkVUPXRtcAorJCAgICAgRU5ESUYKKyQgICAgIGogPSBqICsgMQorJCAgICAgR09UTyB2ZXJpZnlfb3B0X2xvb3AKKyQgICAgdmVyaWZ5X29wdF9sb29wX2VuZDoKKyQgICBFTkRJRgorJCAgIAorJCAgIEdPVE8gb3B0X2xvb3BfZW5kCiskIEVORElGCiskIQorJCBJRiAocHJvZ19vcHQgLk5FUy4gIiIpCiskIFRIRU4KKyQhICAgCiskICAgZWNobyAiVW5rbm93biBhcmd1bWVudCAnJ3Byb2dfb3B0JyIKKyQgICAKKyQgICBFWElUIDMKKyQgRU5ESUYKKyQKKyRvcHRfbG9vcF9jb250aW51ZToKKyQgaSA9IGkgKyAxCiskIEdPVE8gb3B0X2xvb3AKKyQKKyRvcHRfbG9vcF9lbmQ6CiskIEVYSVQgJ1JFVCcKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvQ0EucGwgYi9saWIvb3BlbnNzbC9hcHBzL0NBLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTY1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL0NBLnBsCkBAIC0wLDAgKzEsMTg5IEBACisjIS91c3IvYmluL3BlcmwKKyMKKyMgQ0EgLSB3cmFwcGVyIGFyb3VuZCBjYSB0byBtYWtlIGl0IGVhc2llciB0byB1c2UgLi4uIGJhc2ljYWxseSBjYSByZXF1aXJlcworIyAgICAgIHNvbWUgc2V0dXAgc3R1ZmYgdG8gYmUgZG9uZSBiZWZvcmUgeW91IGNhbiB1c2UgaXQgYW5kIHRoaXMgbWFrZXMKKyMgICAgICB0aGluZ3MgZWFzaWVyIGJldHdlZW4gbm93IGFuZCB3aGVuIEVyaWMgaXMgY29udmluY2VkIHRvIGZpeCBpdCA6LSkKKyMKKyMgQ0EgLW5ld2NhIC4uLiB3aWxsIHNldHVwIHRoZSByaWdodCBzdHVmZgorIyBDQSAtbmV3cmVxWy1ub2Rlc10gLi4uIHdpbGwgZ2VuZXJhdGUgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IAorIyBDQSAtc2lnbiAuLi4gd2lsbCBzaWduIHRoZSBnZW5lcmF0ZWQgcmVxdWVzdCBhbmQgb3V0cHV0IAorIworIyBBdCB0aGUgZW5kIG9mIHRoYXQgZ3JhYiBuZXdyZXEucGVtIGFuZCBuZXdjZXJ0LnBlbSAob25lIGhhcyB0aGUga2V5IAorIyBhbmQgdGhlIG90aGVyIHRoZSBjZXJ0aWZpY2F0ZSkgYW5kIGNhdCB0aGVtIHRvZ2V0aGVyIGFuZCB0aGF0IGlzIHdoYXQKKyMgeW91IHdhbnQvbmVlZCAuLi4gSSdsbCBtYWtlIGV2ZW4gdGhpcyBhIGxpdHRsZSBjbGVhbmVyIGxhdGVyLgorIworIworIyAxMi1KYW4tOTYgdGpoICAgIEFkZGVkIG1vcmUgdGhpbmdzIC4uLiBpbmNsdWRpbmcgQ0EgLXNpZ25jZXJ0IHdoaWNoCisjICAgICAgICAgICAgICAgICAgY29udmVydHMgYSBjZXJ0aWZpY2F0ZSB0byBhIHJlcXVlc3QgYW5kIHRoZW4gc2lnbnMgaXQuCisjIDEwLUphbi05NiBlYXkgICAgRml4ZWQgYSBmZXcgbW9yZSBidWdzIGFuZCBhZGRlZCB0aGUgU1NMRUFZX0NPTkZJRworIwkJICAgZW52aXJvbm1lbnQgdmFyaWFibGUgc28gdGhpcyBjYW4gYmUgZHJpdmVuIGZyb20KKyMJCSAgIGEgc2NyaXB0LgorIyAyNS1KdWwtOTYgZWF5ICAgIENsZWFuZWQgdXAgZmlsZW5hbWVzIHNvbWUgbW9yZS4KKyMgMTEtSnVuLTk2IGVheSAgICBGaXhlZCBhIGZldyBmaWxlbmFtZSBtaXNzbWF0Y2hlcy4KKyMgMDMtTWF5LTk2IGVheSAgICBNb2RpZmllZCB0byB1c2UgJ3NzbGVheSBjbWQnIGluc3RlYWQgb2YgJ2NtZCcuCisjIDE4LUFwci05NiB0amggICAgT3JpZ2luYWwgaGFja2luZworIworIyBUaW0gSHVkc29uCisjIHRqaEBjcnlwdHNvZnQuY29tCisjCisKKyMgMjctQXByLTk4IHNuaCAgICBUcmFuc2xhdGlvbiBpbnRvIHBlcmwsIGZpeCBleGlzdGluZyBDQSBidWcuCisjCisjCisjIFN0ZXZlIEhlbnNvbgorIyBzaGVuc29uQGJpZ2Zvb3QuY29tCisKKyMgZGVmYXVsdCBvcGVuc3NsLmNuZiBmaWxlIGhhcyBzZXR1cCBhcyBwZXIgdGhlIGZvbGxvd2luZworIyBkZW1vQ0EgLi4uIHdoZXJlIGV2ZXJ5dGhpbmcgaXMgc3RvcmVkCisKK215ICRvcGVuc3NsOworaWYoZGVmaW5lZCAkRU5We09QRU5TU0x9KSB7CisJJG9wZW5zc2wgPSAkRU5We09QRU5TU0x9OworfSBlbHNlIHsKKwkkb3BlbnNzbCA9ICJvcGVuc3NsIjsKKwkkRU5We09QRU5TU0x9ID0gJG9wZW5zc2w7Cit9CisKKyRTU0xFQVlfQ09ORklHPSRFTlZ7IlNTTEVBWV9DT05GSUcifTsKKyREQVlTPSItZGF5cyAzNjUiOwkjIDEgeWVhcgorJENBREFZUz0iLWRheXMgMTA5NSI7CSMgMyB5ZWFycworJFJFUT0iJG9wZW5zc2wgcmVxICRTU0xFQVlfQ09ORklHIjsKKyRDQT0iJG9wZW5zc2wgY2EgJFNTTEVBWV9DT05GSUciOworJFZFUklGWT0iJG9wZW5zc2wgdmVyaWZ5IjsKKyRYNTA5PSIkb3BlbnNzbCB4NTA5IjsKKyRQS0NTMTI9IiRvcGVuc3NsIHBrY3MxMiI7CisKKyRDQVRPUD0iLi9kZW1vQ0EiOworJENBS0VZPSJjYWtleS5wZW0iOworJENBUkVRPSJjYXJlcS5wZW0iOworJENBQ0VSVD0iY2FjZXJ0LnBlbSI7CisKKyRESVJNT0RFID0gMDc3NzsKKworJFJFVCA9IDA7CisKK2ZvcmVhY2ggKEBBUkdWKSB7CisJaWYgKCAvXigtXD98LWh8LWhlbHApJC8gKSB7CisJICAgIHByaW50IFNUREVSUiAidXNhZ2U6IENBIC1uZXdjZXJ0fC1uZXdyZXF8LW5ld3JlcS1ub2Rlc3wtbmV3Y2F8LXNpZ258LXZlcmlmeVxuIjsKKwkgICAgZXhpdCAwOworCX0gZWxzaWYgKC9eLW5ld2NlcnQkLykgeworCSAgICAjIGNyZWF0ZSBhIGNlcnRpZmljYXRlCisJICAgIHN5c3RlbSAoIiRSRVEgLW5ldyAteDUwOSAta2V5b3V0IG5ld2tleS5wZW0gLW91dCBuZXdjZXJ0LnBlbSAkREFZUyIpOworCSAgICAkUkVUPSQ/OworCSAgICBwcmludCAiQ2VydGlmaWNhdGUgaXMgaW4gbmV3Y2VydC5wZW0sIHByaXZhdGUga2V5IGlzIGluIG5ld2tleS5wZW1cbiIKKwl9IGVsc2lmICgvXi1uZXdyZXEkLykgeworCSAgICAjIGNyZWF0ZSBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKwkgICAgc3lzdGVtICgiJFJFUSAtbmV3IC1rZXlvdXQgbmV3a2V5LnBlbSAtb3V0IG5ld3JlcS5wZW0gJERBWVMiKTsKKwkgICAgJFJFVD0kPzsKKwkgICAgcHJpbnQgIlJlcXVlc3QgaXMgaW4gbmV3cmVxLnBlbSwgcHJpdmF0ZSBrZXkgaXMgaW4gbmV3a2V5LnBlbVxuIjsKKwl9IGVsc2lmICgvXi1uZXdyZXEtbm9kZXMkLykgeworCSAgICAjIGNyZWF0ZSBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKwkgICAgc3lzdGVtICgiJFJFUSAtbmV3IC1ub2RlcyAta2V5b3V0IG5ld2tleS5wZW0gLW91dCBuZXdyZXEucGVtICREQVlTIik7CisJICAgICRSRVQ9JD87CisJICAgIHByaW50ICJSZXF1ZXN0IGlzIGluIG5ld3JlcS5wZW0sIHByaXZhdGUga2V5IGlzIGluIG5ld2tleS5wZW1cbiI7CisJfSBlbHNpZiAoL14tbmV3Y2EkLykgeworCQkjIGlmIGV4cGxpY2l0bHkgYXNrZWQgZm9yIG9yIGl0IGRvZXNuJ3QgZXhpc3QgdGhlbiBzZXR1cCB0aGUKKwkJIyBkaXJlY3Rvcnkgc3RydWN0dXJlIHRoYXQgRXJpYyBsaWtlcyB0byBtYW5hZ2UgdGhpbmdzIAorCSAgICAkTkVXPSIxIjsKKwkgICAgaWYgKCAiJE5FVyIgfHwgISAtZiAiJHtDQVRPUH0vc2VyaWFsIiApIHsKKwkJIyBjcmVhdGUgdGhlIGRpcmVjdG9yeSBoaWVyYXJjaHkKKwkJbWtkaXIgJENBVE9QLCAkRElSTU9ERTsKKwkJbWtkaXIgIiR7Q0FUT1B9L2NlcnRzIiwgJERJUk1PREU7CisJCW1rZGlyICIke0NBVE9QfS9jcmwiLCAkRElSTU9ERSA7CisJCW1rZGlyICIke0NBVE9QfS9uZXdjZXJ0cyIsICRESVJNT0RFOworCQlta2RpciAiJHtDQVRPUH0vcHJpdmF0ZSIsICRESVJNT0RFOworCQlvcGVuIE9VVCwgIj4ke0NBVE9QfS9pbmRleC50eHQiOworCQljbG9zZSBPVVQ7CisJCW9wZW4gT1VULCAiPiR7Q0FUT1B9L2NybG51bWJlciI7CisJCXByaW50IE9VVCAiMDFcbiI7CisJCWNsb3NlIE9VVDsKKwkgICAgfQorCSAgICBpZiAoICEgLWYgIiR7Q0FUT1B9L3ByaXZhdGUvJENBS0VZIiApIHsKKwkJcHJpbnQgIkNBIGNlcnRpZmljYXRlIGZpbGVuYW1lIChvciBlbnRlciB0byBjcmVhdGUpXG4iOworCQkkRklMRSA9IDxTVERJTj47CisKKwkJY2hvcCAkRklMRTsKKworCQkjIGFzayB1c2VyIGZvciBleGlzdGluZyBDQSBjZXJ0aWZpY2F0ZQorCQlpZiAoJEZJTEUpIHsKKwkJICAgIGNwX3BlbSgkRklMRSwiJHtDQVRPUH0vcHJpdmF0ZS8kQ0FLRVkiLCAiUFJJVkFURSIpOworCQkgICAgY3BfcGVtKCRGSUxFLCIke0NBVE9QfS8kQ0FDRVJUIiwgIkNFUlRJRklDQVRFIik7CisJCSAgICAkUkVUPSQ/OworCQl9IGVsc2UgeworCQkgICAgcHJpbnQgIk1ha2luZyBDQSBjZXJ0aWZpY2F0ZSAuLi5cbiI7CisJCSAgICBzeXN0ZW0gKCIkUkVRIC1uZXcgLWtleW91dCAiIC4KKwkJCSIke0NBVE9QfS9wcml2YXRlLyRDQUtFWSAtb3V0ICR7Q0FUT1B9LyRDQVJFUSIpOworCQkgICAgc3lzdGVtICgiJENBIC1jcmVhdGVfc2VyaWFsICIgLgorCQkJIi1vdXQgJHtDQVRPUH0vJENBQ0VSVCAkQ0FEQVlTIC1iYXRjaCAiIC4gCisJCQkiLWtleWZpbGUgJHtDQVRPUH0vcHJpdmF0ZS8kQ0FLRVkgLXNlbGZzaWduICIgLgorCQkJIi1leHRlbnNpb25zIHYzX2NhICIgLgorCQkJIi1pbmZpbGVzICR7Q0FUT1B9LyRDQVJFUSAiKTsKKwkJICAgICRSRVQ9JD87CisJCX0KKwkgICAgfQorCX0gZWxzaWYgKC9eLXBrY3MxMiQvKSB7CisJICAgIG15ICRjbmFtZSA9ICRBUkdWWzFdOworCSAgICAkY25hbWUgPSAiTXkgQ2VydGlmaWNhdGUiIHVubGVzcyBkZWZpbmVkICRjbmFtZTsKKwkgICAgc3lzdGVtICgiJFBLQ1MxMiAtaW4gbmV3Y2VydC5wZW0gLWlua2V5IG5ld2tleS5wZW0gIiAuCisJCQkiLWNlcnRmaWxlICR7Q0FUT1B9LyRDQUNFUlQgLW91dCBuZXdjZXJ0LnAxMiAiIC4KKwkJCSItZXhwb3J0IC1uYW1lIFwiJGNuYW1lXCIiKTsKKwkgICAgJFJFVD0kPzsKKwkgICAgcHJpbnQgIlBLQ1MgIzEyIGZpbGUgaXMgaW4gbmV3Y2VydC5wMTJcbiI7CisJICAgIGV4aXQgJFJFVDsKKwl9IGVsc2lmICgvXi14c2lnbiQvKSB7CisJICAgIHN5c3RlbSAoIiRDQSAtcG9saWN5IHBvbGljeV9hbnl0aGluZyAtaW5maWxlcyBuZXdyZXEucGVtIik7CisJICAgICRSRVQ9JD87CisJfSBlbHNpZiAoL14oLXNpZ258LXNpZ25yZXEpJC8pIHsKKwkgICAgc3lzdGVtICgiJENBIC1wb2xpY3kgcG9saWN5X2FueXRoaW5nIC1vdXQgbmV3Y2VydC5wZW0gIiAuCisJCQkJCQkJIi1pbmZpbGVzIG5ld3JlcS5wZW0iKTsKKwkgICAgJFJFVD0kPzsKKwkgICAgcHJpbnQgIlNpZ25lZCBjZXJ0aWZpY2F0ZSBpcyBpbiBuZXdjZXJ0LnBlbVxuIjsKKwl9IGVsc2lmICgvXigtc2lnbkNBKSQvKSB7CisJICAgIHN5c3RlbSAoIiRDQSAtcG9saWN5IHBvbGljeV9hbnl0aGluZyAtb3V0IG5ld2NlcnQucGVtICIgLgorCQkJCQkiLWV4dGVuc2lvbnMgdjNfY2EgLWluZmlsZXMgbmV3cmVxLnBlbSIpOworCSAgICAkUkVUPSQ/OworCSAgICBwcmludCAiU2lnbmVkIENBIGNlcnRpZmljYXRlIGlzIGluIG5ld2NlcnQucGVtXG4iOworCX0gZWxzaWYgKC9eLXNpZ25jZXJ0JC8pIHsKKwkgICAgc3lzdGVtICgiJFg1MDkgLXg1MDl0b3JlcSAtaW4gbmV3cmVxLnBlbSAtc2lnbmtleSBuZXdyZXEucGVtICIgLgorCQkJCQkJCQkiLW91dCB0bXAucGVtIik7CisJICAgIHN5c3RlbSAoIiRDQSAtcG9saWN5IHBvbGljeV9hbnl0aGluZyAtb3V0IG5ld2NlcnQucGVtICIgLgorCQkJCQkJCSItaW5maWxlcyB0bXAucGVtIik7CisJICAgICRSRVQgPSAkPzsKKwkgICAgcHJpbnQgIlNpZ25lZCBjZXJ0aWZpY2F0ZSBpcyBpbiBuZXdjZXJ0LnBlbVxuIjsKKwl9IGVsc2lmICgvXi12ZXJpZnkkLykgeworCSAgICBpZiAoc2hpZnQpIHsKKwkJZm9yZWFjaCAkaiAoQEFSR1YpIHsKKwkJICAgIHN5c3RlbSAoIiRWRVJJRlkgLUNBZmlsZSAkQ0FUT1AvJENBQ0VSVCAkaiIpOworCQkgICAgJFJFVD0kPyBpZiAoJD8gIT0gMCk7CisJCX0KKwkJZXhpdCAkUkVUOworCSAgICB9IGVsc2UgeworCQkgICAgc3lzdGVtICgiJFZFUklGWSAtQ0FmaWxlICRDQVRPUC8kQ0FDRVJUIG5ld2NlcnQucGVtIik7CisJCSAgICAkUkVUPSQ/OworCSAgICAJICAgIGV4aXQgMDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHByaW50IFNUREVSUiAiVW5rbm93biBhcmcgJF9cbiI7CisJICAgIHByaW50IFNUREVSUiAidXNhZ2U6IENBIC1uZXdjZXJ0fC1uZXdyZXF8LW5ld3JlcS1ub2Rlc3wtbmV3Y2F8LXNpZ258LXZlcmlmeVxuIjsKKwkgICAgZXhpdCAxOworCX0KK30KKworZXhpdCAkUkVUOworCitzdWIgY3BfcGVtIHsKK215ICgkaW5maWxlLCAkb3V0ZmlsZSwgJGJvdW5kKSA9IEBfOworb3BlbiBJTiwgJGluZmlsZTsKK29wZW4gT1VULCAiPiRvdXRmaWxlIjsKK215ICRmbGFnID0gMDsKK3doaWxlICg8SU4+KSB7CisJJGZsYWcgPSAxIGlmICgvXi0tLS0tQkVHSU4uKiRib3VuZC8pIDsKKwlwcmludCBPVVQgJF8gaWYgKCRmbGFnKTsKKwlpZiAoL14tLS0tLUVORC4qJGJvdW5kLykgeworCQljbG9zZSBJTjsKKwkJY2xvc2UgT1VUOworCQlyZXR1cm47CisJfQorfQorfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL0NBLnBsLmluIGIvbGliL29wZW5zc2wvYXBwcy9DQS5wbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzgzYTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9DQS5wbC5pbgpAQCAtMCwwICsxLDE4OSBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisjCisjIENBIC0gd3JhcHBlciBhcm91bmQgY2EgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdXNlIC4uLiBiYXNpY2FsbHkgY2EgcmVxdWlyZXMKKyMgICAgICBzb21lIHNldHVwIHN0dWZmIHRvIGJlIGRvbmUgYmVmb3JlIHlvdSBjYW4gdXNlIGl0IGFuZCB0aGlzIG1ha2VzCisjICAgICAgdGhpbmdzIGVhc2llciBiZXR3ZWVuIG5vdyBhbmQgd2hlbiBFcmljIGlzIGNvbnZpbmNlZCB0byBmaXggaXQgOi0pCisjCisjIENBIC1uZXdjYSAuLi4gd2lsbCBzZXR1cCB0aGUgcmlnaHQgc3R1ZmYKKyMgQ0EgLW5ld3JlcVstbm9kZXNdIC4uLiB3aWxsIGdlbmVyYXRlIGEgY2VydGlmaWNhdGUgcmVxdWVzdCAKKyMgQ0EgLXNpZ24gLi4uIHdpbGwgc2lnbiB0aGUgZ2VuZXJhdGVkIHJlcXVlc3QgYW5kIG91dHB1dCAKKyMKKyMgQXQgdGhlIGVuZCBvZiB0aGF0IGdyYWIgbmV3cmVxLnBlbSBhbmQgbmV3Y2VydC5wZW0gKG9uZSBoYXMgdGhlIGtleSAKKyMgYW5kIHRoZSBvdGhlciB0aGUgY2VydGlmaWNhdGUpIGFuZCBjYXQgdGhlbSB0b2dldGhlciBhbmQgdGhhdCBpcyB3aGF0CisjIHlvdSB3YW50L25lZWQgLi4uIEknbGwgbWFrZSBldmVuIHRoaXMgYSBsaXR0bGUgY2xlYW5lciBsYXRlci4KKyMKKyMKKyMgMTItSmFuLTk2IHRqaCAgICBBZGRlZCBtb3JlIHRoaW5ncyAuLi4gaW5jbHVkaW5nIENBIC1zaWduY2VydCB3aGljaAorIyAgICAgICAgICAgICAgICAgIGNvbnZlcnRzIGEgY2VydGlmaWNhdGUgdG8gYSByZXF1ZXN0IGFuZCB0aGVuIHNpZ25zIGl0LgorIyAxMC1KYW4tOTYgZWF5ICAgIEZpeGVkIGEgZmV3IG1vcmUgYnVncyBhbmQgYWRkZWQgdGhlIFNTTEVBWV9DT05GSUcKKyMJCSAgIGVudmlyb25tZW50IHZhcmlhYmxlIHNvIHRoaXMgY2FuIGJlIGRyaXZlbiBmcm9tCisjCQkgICBhIHNjcmlwdC4KKyMgMjUtSnVsLTk2IGVheSAgICBDbGVhbmVkIHVwIGZpbGVuYW1lcyBzb21lIG1vcmUuCisjIDExLUp1bi05NiBlYXkgICAgRml4ZWQgYSBmZXcgZmlsZW5hbWUgbWlzc21hdGNoZXMuCisjIDAzLU1heS05NiBlYXkgICAgTW9kaWZpZWQgdG8gdXNlICdzc2xlYXkgY21kJyBpbnN0ZWFkIG9mICdjbWQnLgorIyAxOC1BcHItOTYgdGpoICAgIE9yaWdpbmFsIGhhY2tpbmcKKyMKKyMgVGltIEh1ZHNvbgorIyB0amhAY3J5cHRzb2Z0LmNvbQorIworCisjIDI3LUFwci05OCBzbmggICAgVHJhbnNsYXRpb24gaW50byBwZXJsLCBmaXggZXhpc3RpbmcgQ0EgYnVnLgorIworIworIyBTdGV2ZSBIZW5zb24KKyMgc2hlbnNvbkBiaWdmb290LmNvbQorCisjIGRlZmF1bHQgb3BlbnNzbC5jbmYgZmlsZSBoYXMgc2V0dXAgYXMgcGVyIHRoZSBmb2xsb3dpbmcKKyMgZGVtb0NBIC4uLiB3aGVyZSBldmVyeXRoaW5nIGlzIHN0b3JlZAorCitteSAkb3BlbnNzbDsKK2lmKGRlZmluZWQgJEVOVntPUEVOU1NMfSkgeworCSRvcGVuc3NsID0gJEVOVntPUEVOU1NMfTsKK30gZWxzZSB7CisJJG9wZW5zc2wgPSAib3BlbnNzbCI7CisJJEVOVntPUEVOU1NMfSA9ICRvcGVuc3NsOworfQorCiskU1NMRUFZX0NPTkZJRz0kRU5WeyJTU0xFQVlfQ09ORklHIn07CiskREFZUz0iLWRheXMgMzY1IjsJIyAxIHllYXIKKyRDQURBWVM9Ii1kYXlzIDEwOTUiOwkjIDMgeWVhcnMKKyRSRVE9IiRvcGVuc3NsIHJlcSAkU1NMRUFZX0NPTkZJRyI7CiskQ0E9IiRvcGVuc3NsIGNhICRTU0xFQVlfQ09ORklHIjsKKyRWRVJJRlk9IiRvcGVuc3NsIHZlcmlmeSI7CiskWDUwOT0iJG9wZW5zc2wgeDUwOSI7CiskUEtDUzEyPSIkb3BlbnNzbCBwa2NzMTIiOworCiskQ0FUT1A9Ii4vZGVtb0NBIjsKKyRDQUtFWT0iY2FrZXkucGVtIjsKKyRDQVJFUT0iY2FyZXEucGVtIjsKKyRDQUNFUlQ9ImNhY2VydC5wZW0iOworCiskRElSTU9ERSA9IDA3Nzc7CisKKyRSRVQgPSAwOworCitmb3JlYWNoIChAQVJHVikgeworCWlmICggL14oLVw/fC1ofC1oZWxwKSQvICkgeworCSAgICBwcmludCBTVERFUlIgInVzYWdlOiBDQSAtbmV3Y2VydHwtbmV3cmVxfC1uZXdyZXEtbm9kZXN8LW5ld2NhfC1zaWdufC12ZXJpZnlcbiI7CisJICAgIGV4aXQgMDsKKwl9IGVsc2lmICgvXi1uZXdjZXJ0JC8pIHsKKwkgICAgIyBjcmVhdGUgYSBjZXJ0aWZpY2F0ZQorCSAgICBzeXN0ZW0gKCIkUkVRIC1uZXcgLXg1MDkgLWtleW91dCBuZXdrZXkucGVtIC1vdXQgbmV3Y2VydC5wZW0gJERBWVMiKTsKKwkgICAgJFJFVD0kPzsKKwkgICAgcHJpbnQgIkNlcnRpZmljYXRlIGlzIGluIG5ld2NlcnQucGVtLCBwcml2YXRlIGtleSBpcyBpbiBuZXdrZXkucGVtXG4iCisJfSBlbHNpZiAoL14tbmV3cmVxJC8pIHsKKwkgICAgIyBjcmVhdGUgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0CisJICAgIHN5c3RlbSAoIiRSRVEgLW5ldyAta2V5b3V0IG5ld2tleS5wZW0gLW91dCBuZXdyZXEucGVtICREQVlTIik7CisJICAgICRSRVQ9JD87CisJICAgIHByaW50ICJSZXF1ZXN0IGlzIGluIG5ld3JlcS5wZW0sIHByaXZhdGUga2V5IGlzIGluIG5ld2tleS5wZW1cbiI7CisJfSBlbHNpZiAoL14tbmV3cmVxLW5vZGVzJC8pIHsKKwkgICAgIyBjcmVhdGUgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0CisJICAgIHN5c3RlbSAoIiRSRVEgLW5ldyAtbm9kZXMgLWtleW91dCBuZXdrZXkucGVtIC1vdXQgbmV3cmVxLnBlbSAkREFZUyIpOworCSAgICAkUkVUPSQ/OworCSAgICBwcmludCAiUmVxdWVzdCBpcyBpbiBuZXdyZXEucGVtLCBwcml2YXRlIGtleSBpcyBpbiBuZXdrZXkucGVtXG4iOworCX0gZWxzaWYgKC9eLW5ld2NhJC8pIHsKKwkJIyBpZiBleHBsaWNpdGx5IGFza2VkIGZvciBvciBpdCBkb2Vzbid0IGV4aXN0IHRoZW4gc2V0dXAgdGhlCisJCSMgZGlyZWN0b3J5IHN0cnVjdHVyZSB0aGF0IEVyaWMgbGlrZXMgdG8gbWFuYWdlIHRoaW5ncyAKKwkgICAgJE5FVz0iMSI7CisJICAgIGlmICggIiRORVciIHx8ICEgLWYgIiR7Q0FUT1B9L3NlcmlhbCIgKSB7CisJCSMgY3JlYXRlIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5CisJCW1rZGlyICRDQVRPUCwgJERJUk1PREU7CisJCW1rZGlyICIke0NBVE9QfS9jZXJ0cyIsICRESVJNT0RFOworCQlta2RpciAiJHtDQVRPUH0vY3JsIiwgJERJUk1PREUgOworCQlta2RpciAiJHtDQVRPUH0vbmV3Y2VydHMiLCAkRElSTU9ERTsKKwkJbWtkaXIgIiR7Q0FUT1B9L3ByaXZhdGUiLCAkRElSTU9ERTsKKwkJb3BlbiBPVVQsICI+JHtDQVRPUH0vaW5kZXgudHh0IjsKKwkJY2xvc2UgT1VUOworCQlvcGVuIE9VVCwgIj4ke0NBVE9QfS9jcmxudW1iZXIiOworCQlwcmludCBPVVQgIjAxXG4iOworCQljbG9zZSBPVVQ7CisJICAgIH0KKwkgICAgaWYgKCAhIC1mICIke0NBVE9QfS9wcml2YXRlLyRDQUtFWSIgKSB7CisJCXByaW50ICJDQSBjZXJ0aWZpY2F0ZSBmaWxlbmFtZSAob3IgZW50ZXIgdG8gY3JlYXRlKVxuIjsKKwkJJEZJTEUgPSA8U1RESU4+OworCisJCWNob3AgJEZJTEU7CisKKwkJIyBhc2sgdXNlciBmb3IgZXhpc3RpbmcgQ0EgY2VydGlmaWNhdGUKKwkJaWYgKCRGSUxFKSB7CisJCSAgICBjcF9wZW0oJEZJTEUsIiR7Q0FUT1B9L3ByaXZhdGUvJENBS0VZIiwgIlBSSVZBVEUiKTsKKwkJICAgIGNwX3BlbSgkRklMRSwiJHtDQVRPUH0vJENBQ0VSVCIsICJDRVJUSUZJQ0FURSIpOworCQkgICAgJFJFVD0kPzsKKwkJfSBlbHNlIHsKKwkJICAgIHByaW50ICJNYWtpbmcgQ0EgY2VydGlmaWNhdGUgLi4uXG4iOworCQkgICAgc3lzdGVtICgiJFJFUSAtbmV3IC1rZXlvdXQgIiAuCisJCQkiJHtDQVRPUH0vcHJpdmF0ZS8kQ0FLRVkgLW91dCAke0NBVE9QfS8kQ0FSRVEiKTsKKwkJICAgIHN5c3RlbSAoIiRDQSAtY3JlYXRlX3NlcmlhbCAiIC4KKwkJCSItb3V0ICR7Q0FUT1B9LyRDQUNFUlQgJENBREFZUyAtYmF0Y2ggIiAuIAorCQkJIi1rZXlmaWxlICR7Q0FUT1B9L3ByaXZhdGUvJENBS0VZIC1zZWxmc2lnbiAiIC4KKwkJCSItZXh0ZW5zaW9ucyB2M19jYSAiIC4KKwkJCSItaW5maWxlcyAke0NBVE9QfS8kQ0FSRVEgIik7CisJCSAgICAkUkVUPSQ/OworCQl9CisJICAgIH0KKwl9IGVsc2lmICgvXi1wa2NzMTIkLykgeworCSAgICBteSAkY25hbWUgPSAkQVJHVlsxXTsKKwkgICAgJGNuYW1lID0gIk15IENlcnRpZmljYXRlIiB1bmxlc3MgZGVmaW5lZCAkY25hbWU7CisJICAgIHN5c3RlbSAoIiRQS0NTMTIgLWluIG5ld2NlcnQucGVtIC1pbmtleSBuZXdrZXkucGVtICIgLgorCQkJIi1jZXJ0ZmlsZSAke0NBVE9QfS8kQ0FDRVJUIC1vdXQgbmV3Y2VydC5wMTIgIiAuCisJCQkiLWV4cG9ydCAtbmFtZSBcIiRjbmFtZVwiIik7CisJICAgICRSRVQ9JD87CisJICAgIHByaW50ICJQS0NTICMxMiBmaWxlIGlzIGluIG5ld2NlcnQucDEyXG4iOworCSAgICBleGl0ICRSRVQ7CisJfSBlbHNpZiAoL14teHNpZ24kLykgeworCSAgICBzeXN0ZW0gKCIkQ0EgLXBvbGljeSBwb2xpY3lfYW55dGhpbmcgLWluZmlsZXMgbmV3cmVxLnBlbSIpOworCSAgICAkUkVUPSQ/OworCX0gZWxzaWYgKC9eKC1zaWdufC1zaWducmVxKSQvKSB7CisJICAgIHN5c3RlbSAoIiRDQSAtcG9saWN5IHBvbGljeV9hbnl0aGluZyAtb3V0IG5ld2NlcnQucGVtICIgLgorCQkJCQkJCSItaW5maWxlcyBuZXdyZXEucGVtIik7CisJICAgICRSRVQ9JD87CisJICAgIHByaW50ICJTaWduZWQgY2VydGlmaWNhdGUgaXMgaW4gbmV3Y2VydC5wZW1cbiI7CisJfSBlbHNpZiAoL14oLXNpZ25DQSkkLykgeworCSAgICBzeXN0ZW0gKCIkQ0EgLXBvbGljeSBwb2xpY3lfYW55dGhpbmcgLW91dCBuZXdjZXJ0LnBlbSAiIC4KKwkJCQkJIi1leHRlbnNpb25zIHYzX2NhIC1pbmZpbGVzIG5ld3JlcS5wZW0iKTsKKwkgICAgJFJFVD0kPzsKKwkgICAgcHJpbnQgIlNpZ25lZCBDQSBjZXJ0aWZpY2F0ZSBpcyBpbiBuZXdjZXJ0LnBlbVxuIjsKKwl9IGVsc2lmICgvXi1zaWduY2VydCQvKSB7CisJICAgIHN5c3RlbSAoIiRYNTA5IC14NTA5dG9yZXEgLWluIG5ld3JlcS5wZW0gLXNpZ25rZXkgbmV3cmVxLnBlbSAiIC4KKwkJCQkJCQkJIi1vdXQgdG1wLnBlbSIpOworCSAgICBzeXN0ZW0gKCIkQ0EgLXBvbGljeSBwb2xpY3lfYW55dGhpbmcgLW91dCBuZXdjZXJ0LnBlbSAiIC4KKwkJCQkJCQkiLWluZmlsZXMgdG1wLnBlbSIpOworCSAgICAkUkVUID0gJD87CisJICAgIHByaW50ICJTaWduZWQgY2VydGlmaWNhdGUgaXMgaW4gbmV3Y2VydC5wZW1cbiI7CisJfSBlbHNpZiAoL14tdmVyaWZ5JC8pIHsKKwkgICAgaWYgKHNoaWZ0KSB7CisJCWZvcmVhY2ggJGogKEBBUkdWKSB7CisJCSAgICBzeXN0ZW0gKCIkVkVSSUZZIC1DQWZpbGUgJENBVE9QLyRDQUNFUlQgJGoiKTsKKwkJICAgICRSRVQ9JD8gaWYgKCQ/ICE9IDApOworCQl9CisJCWV4aXQgJFJFVDsKKwkgICAgfSBlbHNlIHsKKwkJICAgIHN5c3RlbSAoIiRWRVJJRlkgLUNBZmlsZSAkQ0FUT1AvJENBQ0VSVCBuZXdjZXJ0LnBlbSIpOworCQkgICAgJFJFVD0kPzsKKwkgICAgCSAgICBleGl0IDA7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBwcmludCBTVERFUlIgIlVua25vd24gYXJnICRfXG4iOworCSAgICBwcmludCBTVERFUlIgInVzYWdlOiBDQSAtbmV3Y2VydHwtbmV3cmVxfC1uZXdyZXEtbm9kZXN8LW5ld2NhfC1zaWdufC12ZXJpZnlcbiI7CisJICAgIGV4aXQgMTsKKwl9Cit9CisKK2V4aXQgJFJFVDsKKworc3ViIGNwX3BlbSB7CitteSAoJGluZmlsZSwgJG91dGZpbGUsICRib3VuZCkgPSBAXzsKK29wZW4gSU4sICRpbmZpbGU7CitvcGVuIE9VVCwgIj4kb3V0ZmlsZSI7CitteSAkZmxhZyA9IDA7Cit3aGlsZSAoPElOPikgeworCSRmbGFnID0gMSBpZiAoL14tLS0tLUJFR0lOLiokYm91bmQvKSA7CisJcHJpbnQgT1VUICRfIGlmICgkZmxhZyk7CisJaWYgKC9eLS0tLS1FTkQuKiRib3VuZC8pIHsKKwkJY2xvc2UgSU47CisJCWNsb3NlIE9VVDsKKwkJcmV0dXJuOworCX0KK30KK30KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9DQS5zaCBiL2xpYi9vcGVuc3NsL2FwcHMvQ0Euc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkNmI4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvQ0Euc2gKQEAgLTAsMCArMSwxOTggQEAKKyMhL2Jpbi9zaAorIworIyBDQSAtIHdyYXBwZXIgYXJvdW5kIGNhIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHVzZSAuLi4gYmFzaWNhbGx5IGNhIHJlcXVpcmVzCisjICAgICAgc29tZSBzZXR1cCBzdHVmZiB0byBiZSBkb25lIGJlZm9yZSB5b3UgY2FuIHVzZSBpdCBhbmQgdGhpcyBtYWtlcworIyAgICAgIHRoaW5ncyBlYXNpZXIgYmV0d2VlbiBub3cgYW5kIHdoZW4gRXJpYyBpcyBjb252aW5jZWQgdG8gZml4IGl0IDotKQorIworIyBDQSAtbmV3Y2EgLi4uIHdpbGwgc2V0dXAgdGhlIHJpZ2h0IHN0dWZmCisjIENBIC1uZXdyZXEgLi4uIHdpbGwgZ2VuZXJhdGUgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0CisjIENBIC1zaWduIC4uLiB3aWxsIHNpZ24gdGhlIGdlbmVyYXRlZCByZXF1ZXN0IGFuZCBvdXRwdXQKKyMKKyMgQXQgdGhlIGVuZCBvZiB0aGF0IGdyYWIgbmV3cmVxLnBlbSBhbmQgbmV3Y2VydC5wZW0gKG9uZSBoYXMgdGhlIGtleQorIyBhbmQgdGhlIG90aGVyIHRoZSBjZXJ0aWZpY2F0ZSkgYW5kIGNhdCB0aGVtIHRvZ2V0aGVyIGFuZCB0aGF0IGlzIHdoYXQKKyMgeW91IHdhbnQvbmVlZCAuLi4gSSdsbCBtYWtlIGV2ZW4gdGhpcyBhIGxpdHRsZSBjbGVhbmVyIGxhdGVyLgorIworIworIyAxMi1KYW4tOTYgdGpoICAgIEFkZGVkIG1vcmUgdGhpbmdzIC4uLiBpbmNsdWRpbmcgQ0EgLXNpZ25jZXJ0IHdoaWNoCisjICAgICAgICAgICAgICAgICAgY29udmVydHMgYSBjZXJ0aWZpY2F0ZSB0byBhIHJlcXVlc3QgYW5kIHRoZW4gc2lnbnMgaXQuCisjIDEwLUphbi05NiBlYXkgICAgRml4ZWQgYSBmZXcgbW9yZSBidWdzIGFuZCBhZGRlZCB0aGUgU1NMRUFZX0NPTkZJRworIyAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlIHNvIHRoaXMgY2FuIGJlIGRyaXZlbiBmcm9tCisjICAgICAgICAgICAgICAgICAgYSBzY3JpcHQuCisjIDI1LUp1bC05NiBlYXkgICAgQ2xlYW5lZCB1cCBmaWxlbmFtZXMgc29tZSBtb3JlLgorIyAxMS1KdW4tOTYgZWF5ICAgIEZpeGVkIGEgZmV3IGZpbGVuYW1lIG1pc3NtYXRjaGVzLgorIyAwMy1NYXktOTYgZWF5ICAgIE1vZGlmaWVkIHRvIHVzZSAnc3NsZWF5IGNtZCcgaW5zdGVhZCBvZiAnY21kJy4KKyMgMTgtQXByLTk2IHRqaCAgICBPcmlnaW5hbCBoYWNraW5nCisjCisjIFRpbSBIdWRzb24KKyMgdGpoQGNyeXB0c29mdC5jb20KKyMKKworIyBkZWZhdWx0IG9wZW5zc2wuY25mIGZpbGUgaGFzIHNldHVwIGFzIHBlciB0aGUgZm9sbG93aW5nCisjIGRlbW9DQSAuLi4gd2hlcmUgZXZlcnl0aGluZyBpcyBzdG9yZWQKK2NwX3BlbSgpIHsKKyAgICBpbmZpbGU9JDEKKyAgICBvdXRmaWxlPSQyCisgICAgYm91bmQ9JDMKKyAgICBmbGFnPTAKKyAgICBleGVjIDwkaW5maWxlOworICAgIHdoaWxlIHJlYWQgbGluZTsgZG8KKwlpZiBbICRmbGFnIC1lcSAxIF07IHRoZW4KKwkJZWNobyAkbGluZXxncmVwICJeLS0tLS1FTkQuKiRib3VuZCIgIDI+L2Rldi9udWxsIDE+L2Rldi9udWxsCisJCWlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKwkJCWVjaG8gJGxpbmUgPj4kb3V0ZmlsZQorCQkJYnJlYWsKKwkJZWxzZQorCQkJZWNobyAkbGluZSA+PiRvdXRmaWxlCisJCWZpCisJZmkKKworCWVjaG8gJGxpbmV8Z3JlcCAiXi0tLS0tQkVHSU4uKiRib3VuZCIgIDI+L2Rldi9udWxsIDE+L2Rldi9udWxsCisJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCWVjaG8gJGxpbmUgPiRvdXRmaWxlCisJCWZsYWc9MQorCWZpCisgICAgZG9uZQorfQorCit1c2FnZSgpIHsKKyBlY2hvICJ1c2FnZTogJDAgLW5ld2NlcnR8LW5ld3JlcXwtbmV3cmVxLW5vZGVzfC1uZXdjYXwtc2lnbnwtdmVyaWZ5IiA+JjIKK30KKworaWYgWyAteiAiJE9QRU5TU0wiIF07IHRoZW4gT1BFTlNTTD1vcGVuc3NsOyBmaQorCitpZiBbIC16ICIkREFZUyIgXSA7IHRoZW4gREFZUz0iLWRheXMgMzY1IiA7IGZpCSMgMSB5ZWFyCitDQURBWVM9Ii1kYXlzIDEwOTUiCSMgMyB5ZWFycworUkVRPSIkT1BFTlNTTCByZXEgJFNTTEVBWV9DT05GSUciCitDQT0iJE9QRU5TU0wgY2EgJFNTTEVBWV9DT05GSUciCitWRVJJRlk9IiRPUEVOU1NMIHZlcmlmeSIKK1g1MDk9IiRPUEVOU1NMIHg1MDkiCitQS0NTMTI9Im9wZW5zc2wgcGtjczEyIgorCitpZiBbIC16ICIkQ0FUT1AiIF0gOyB0aGVuIENBVE9QPS4vZGVtb0NBIDsgZmkKK0NBS0VZPS4vY2FrZXkucGVtCitDQVJFUT0uL2NhcmVxLnBlbQorQ0FDRVJUPS4vY2FjZXJ0LnBlbQorCitSRVQ9MAorCit3aGlsZSBbICIkMSIgIT0gIiIgXSA7IGRvCitjYXNlICQxIGluCistXD98LWh8LWhlbHApCisgICAgdXNhZ2UKKyAgICBleGl0IDAKKyAgICA7OworLW5ld2NlcnQpCisgICAgIyBjcmVhdGUgYSBjZXJ0aWZpY2F0ZQorICAgICRSRVEgLW5ldyAteDUwOSAta2V5b3V0IG5ld2tleS5wZW0gLW91dCBuZXdjZXJ0LnBlbSAkREFZUworICAgIFJFVD0kPworICAgIGVjaG8gIkNlcnRpZmljYXRlIGlzIGluIG5ld2NlcnQucGVtLCBwcml2YXRlIGtleSBpcyBpbiBuZXdrZXkucGVtIgorICAgIDs7CistbmV3cmVxKQorICAgICMgY3JlYXRlIGEgY2VydGlmaWNhdGUgcmVxdWVzdAorICAgICRSRVEgLW5ldyAta2V5b3V0IG5ld2tleS5wZW0gLW91dCBuZXdyZXEucGVtICREQVlTCisgICAgUkVUPSQ/CisgICAgZWNobyAiUmVxdWVzdCBpcyBpbiBuZXdyZXEucGVtLCBwcml2YXRlIGtleSBpcyBpbiBuZXdrZXkucGVtIgorICAgIDs7CistbmV3cmVxLW5vZGVzKSAKKyAgICAjIGNyZWF0ZSBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKyAgICAkUkVRIC1uZXcgLW5vZGVzIC1rZXlvdXQgbmV3cmVxLnBlbSAtb3V0IG5ld3JlcS5wZW0gJERBWVMKKyAgICBSRVQ9JD8KKyAgICBlY2hvICJSZXF1ZXN0IChhbmQgcHJpdmF0ZSBrZXkpIGlzIGluIG5ld3JlcS5wZW0iCisgICAgOzsKKy1uZXdjYSkKKyAgICAjIGlmIGV4cGxpY2l0bHkgYXNrZWQgZm9yIG9yIGl0IGRvZXNuJ3QgZXhpc3QgdGhlbiBzZXR1cCB0aGUgZGlyZWN0b3J5CisgICAgIyBzdHJ1Y3R1cmUgdGhhdCBFcmljIGxpa2VzIHRvIG1hbmFnZSB0aGluZ3MKKyAgICBORVc9IjEiCisgICAgaWYgWyAiJE5FVyIgLW8gISAtZiAke0NBVE9QfS9zZXJpYWwgXTsgdGhlbgorCSMgY3JlYXRlIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5CisJbWtkaXIgLXAgJHtDQVRPUH0KKwlta2RpciAtcCAke0NBVE9QfS9jZXJ0cworCW1rZGlyIC1wICR7Q0FUT1B9L2NybAorCW1rZGlyIC1wICR7Q0FUT1B9L25ld2NlcnRzCisJbWtkaXIgLXAgJHtDQVRPUH0vcHJpdmF0ZQorCXRvdWNoICR7Q0FUT1B9L2luZGV4LnR4dAorICAgIGZpCisgICAgaWYgWyAhIC1mICR7Q0FUT1B9L3ByaXZhdGUvJENBS0VZIF07IHRoZW4KKwllY2hvICJDQSBjZXJ0aWZpY2F0ZSBmaWxlbmFtZSAob3IgZW50ZXIgdG8gY3JlYXRlKSIKKwlyZWFkIEZJTEUKKworCSMgYXNrIHVzZXIgZm9yIGV4aXN0aW5nIENBIGNlcnRpZmljYXRlCisJaWYgWyAiJEZJTEUiIF07IHRoZW4KKwkgICAgY3BfcGVtICRGSUxFICR7Q0FUT1B9L3ByaXZhdGUvJENBS0VZIFBSSVZBVEUKKwkgICAgY3BfcGVtICRGSUxFICR7Q0FUT1B9LyRDQUNFUlQgQ0VSVElGSUNBVEUKKwkgICAgUkVUPSQ/CisJICAgIGlmIFsgISAtZiAiJHtDQVRPUH0vc2VyaWFsIiBdOyB0aGVuCisJCSRYNTA5IC1pbiAke0NBVE9QfS8kQ0FDRVJUIC1ub291dCAtbmV4dF9zZXJpYWwgXAorCQkgICAgICAtb3V0ICR7Q0FUT1B9L3NlcmlhbAorCSAgICBmaQorCWVsc2UKKwkgICAgZWNobyAiTWFraW5nIENBIGNlcnRpZmljYXRlIC4uLiIKKwkgICAgJFJFUSAtbmV3IC1rZXlvdXQgJHtDQVRPUH0vcHJpdmF0ZS8kQ0FLRVkgXAorCQkJICAgLW91dCAke0NBVE9QfS8kQ0FSRVEKKwkgICAgJENBIC1jcmVhdGVfc2VyaWFsIC1vdXQgJHtDQVRPUH0vJENBQ0VSVCAkQ0FEQVlTIC1iYXRjaCBcCisJCQkgICAta2V5ZmlsZSAke0NBVE9QfS9wcml2YXRlLyRDQUtFWSAtc2VsZnNpZ24gXAorCQkJICAgLWV4dGVuc2lvbnMgdjNfY2EgXAorCQkJICAgLWluZmlsZXMgJHtDQVRPUH0vJENBUkVRCisJICAgIFJFVD0kPworCWZpCisgICAgZmkKKyAgICA7OworLXhzaWduKQorICAgICRDQSAtcG9saWN5IHBvbGljeV9hbnl0aGluZyAtaW5maWxlcyBuZXdyZXEucGVtCisgICAgUkVUPSQ/CisgICAgOzsKKy1wa2NzMTIpCisgICAgaWYgWyAteiAiJDIiIF0gOyB0aGVuCisJQ05BTUU9Ik15IENlcnRpZmljYXRlIgorICAgIGVsc2UKKwlDTkFNRT0iJDIiCisgICAgZmkKKyAgICAkUEtDUzEyIC1pbiBuZXdjZXJ0LnBlbSAtaW5rZXkgbmV3cmVxLnBlbSAtY2VydGZpbGUgJHtDQVRPUH0vJENBQ0VSVCBcCisJICAgIC1vdXQgbmV3Y2VydC5wMTIgLWV4cG9ydCAtbmFtZSAiJENOQU1FIgorICAgIFJFVD0kPworICAgIGV4aXQgJFJFVAorICAgIDs7Cistc2lnbnwtc2lnbnJlcSkKKyAgICAkQ0EgLXBvbGljeSBwb2xpY3lfYW55dGhpbmcgLW91dCBuZXdjZXJ0LnBlbSAtaW5maWxlcyBuZXdyZXEucGVtCisgICAgUkVUPSQ/CisgICAgY2F0IG5ld2NlcnQucGVtCisgICAgZWNobyAiU2lnbmVkIGNlcnRpZmljYXRlIGlzIGluIG5ld2NlcnQucGVtIgorICAgIDs7Cistc2lnbkNBKQorICAgICRDQSAtcG9saWN5IHBvbGljeV9hbnl0aGluZyAtb3V0IG5ld2NlcnQucGVtIC1leHRlbnNpb25zIHYzX2NhIC1pbmZpbGVzIG5ld3JlcS5wZW0KKyAgICBSRVQ9JD8KKyAgICBlY2hvICJTaWduZWQgQ0EgY2VydGlmaWNhdGUgaXMgaW4gbmV3Y2VydC5wZW0iCisgICAgOzsKKy1zaWduY2VydCkKKyAgICBlY2hvICJDZXJ0IHBhc3NwaHJhc2Ugd2lsbCBiZSByZXF1ZXN0ZWQgdHdpY2UgLSBidWc/IgorICAgICRYNTA5IC14NTA5dG9yZXEgLWluIG5ld3JlcS5wZW0gLXNpZ25rZXkgbmV3cmVxLnBlbSAtb3V0IHRtcC5wZW0KKyAgICAkQ0EgLXBvbGljeSBwb2xpY3lfYW55dGhpbmcgLW91dCBuZXdjZXJ0LnBlbSAtaW5maWxlcyB0bXAucGVtCisgICAgUkVUPSQ/CisgICAgY2F0IG5ld2NlcnQucGVtCisgICAgZWNobyAiU2lnbmVkIGNlcnRpZmljYXRlIGlzIGluIG5ld2NlcnQucGVtIgorICAgIDs7CistdmVyaWZ5KQorICAgIHNoaWZ0CisgICAgaWYgWyAteiAiJDEiIF07IHRoZW4KKwkgICAgJFZFUklGWSAtQ0FmaWxlICRDQVRPUC8kQ0FDRVJUIG5ld2NlcnQucGVtCisJICAgIFJFVD0kPworICAgIGVsc2UKKwlmb3IgagorCWRvCisJICAgICRWRVJJRlkgLUNBZmlsZSAkQ0FUT1AvJENBQ0VSVCAkagorCSAgICBpZiBbICQ/ICE9IDAgXTsgdGhlbgorCQkgICAgUkVUPSQ/CisJICAgIGZpCisJZG9uZQorICAgIGZpCisgICAgZXhpdCAkUkVUCisgICAgOzsKKyopCisgICAgZWNobyAiVW5rbm93biBhcmcgJGkiID4mMgorICAgIHVzYWdlCisgICAgZXhpdCAxCisgICAgOzsKK2VzYWMKK3NoaWZ0Citkb25lCitleGl0ICRSRVQKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvYXBwX3JhbmQuYyBiL2xpYi9vcGVuc3NsL2FwcHMvYXBwX3JhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2I2MTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9hcHBfcmFuZC5jCkBAIC0wLDAgKzEsMjE4IEBACisvKiBhcHBzL2FwcF9yYW5kLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjZGVmaW5lIE5PTl9NQUlOCisjaW5jbHVkZSAiYXBwcy5oIgorI3VuZGVmIE5PTl9NQUlOCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworCitzdGF0aWMgaW50IHNlZWRlZCA9IDA7CitzdGF0aWMgaW50IGVnZHNvY2tldCA9IDA7CisKK2ludCBhcHBfUkFORF9sb2FkX2ZpbGUoY29uc3QgY2hhciAqZmlsZSwgQklPICpiaW9fZSwgaW50IGRvbnRfd2FybikKKwl7CisJaW50IGNvbnNpZGVyX3JhbmRmaWxlID0gKGZpbGUgPT0gTlVMTCk7CisJY2hhciBidWZmZXJbMjAwXTsKKwkKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU5ET1dTCisJQklPX3ByaW50ZihiaW9fZSwiTG9hZGluZyAnc2NyZWVuJyBpbnRvIHJhbmRvbSBzdGF0ZSAtIik7CisJQklPX2ZsdXNoKGJpb19lKTsKKwlSQU5EX3NjcmVlbigpOworCUJJT19wcmludGYoYmlvX2UsIiBkb25lXG4iKTsKKyNlbmRpZgorCisJaWYgKGZpbGUgPT0gTlVMTCkKKwkJZmlsZSA9IFJBTkRfZmlsZV9uYW1lKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlcik7CisJZWxzZSBpZiAoUkFORF9lZ2QoZmlsZSkgPiAwKQorCQl7CisJCS8qIHdlIHRyeSBpZiB0aGUgZ2l2ZW4gZmlsZW5hbWUgaXMgYW4gRUdEIHNvY2tldC4KKwkJICAgaWYgaXQgaXMsIHdlIGRvbid0IHdyaXRlIGFueXRoaW5nIGJhY2sgdG8gdGhlIGZpbGUuICovCisJCWVnZHNvY2tldCA9IDE7CisJCXJldHVybiAxOworCQl9CisJaWYgKGZpbGUgPT0gTlVMTCB8fCAhUkFORF9sb2FkX2ZpbGUoZmlsZSwgLTEpKQorCQl7CisJCWlmIChSQU5EX3N0YXR1cygpID09IDApCisJCQl7CisJCQlpZiAoIWRvbnRfd2FybikKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZSwidW5hYmxlIHRvIGxvYWQgJ3JhbmRvbSBzdGF0ZSdcbiIpOworCQkJCUJJT19wcmludGYoYmlvX2UsIlRoaXMgbWVhbnMgdGhhdCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaGFzIG5vdCBiZWVuIHNlZWRlZFxuIik7CisJCQkJQklPX3ByaW50ZihiaW9fZSwid2l0aCBtdWNoIHJhbmRvbSBkYXRhLlxuIik7CisJCQkJaWYgKGNvbnNpZGVyX3JhbmRmaWxlKSAvKiBleHBsYW5hdGlvbiBkb2VzIG5vdCBhcHBseSB3aGVuIGEgZmlsZSBpcyBleHBsaWNpdGx5IG5hbWVkICovCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fZSwiQ29uc2lkZXIgc2V0dGluZyB0aGUgUkFOREZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgYXQgYSBmaWxlIHRoYXRcbiIpOworCQkJCQlCSU9fcHJpbnRmKGJpb19lLCIncmFuZG9tJyBkYXRhIGNhbiBiZSBrZXB0IGluICh0aGUgZmlsZSB3aWxsIGJlIG92ZXJ3cml0dGVuKS5cbiIpOworCQkJCQl9CisJCQkJfQorCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlzZWVkZWQgPSAxOworCXJldHVybiAxOworCX0KKworbG9uZyBhcHBfUkFORF9sb2FkX2ZpbGVzKGNoYXIgKm5hbWUpCisJeworCWNoYXIgKnAsKm47CisJaW50IGxhc3Q7CisJbG9uZyB0b3Q9MDsKKwlpbnQgZWdkOworCQorCWZvciAoOzspCisJCXsKKwkJbGFzdD0wOworCQlmb3IgKHA9bmFtZTsgKCgqcCAhPSAnXDAnKSAmJiAoKnAgIT0gTElTVF9TRVBBUkFUT1JfQ0hBUikpOyBwKyspOworCQlpZiAoKnAgPT0gJ1wwJykgbGFzdD0xOworCQkqcD0nXDAnOworCQluPW5hbWU7CisJCW5hbWU9cCsxOworCQlpZiAoKm4gPT0gJ1wwJykgYnJlYWs7CisKKwkJZWdkPVJBTkRfZWdkKG4pOworCQlpZiAoZWdkID4gMCkKKwkJCXRvdCs9ZWdkOworCQllbHNlCisJCQl0b3QrPVJBTkRfbG9hZF9maWxlKG4sLTEpOworCQlpZiAobGFzdCkgYnJlYWs7CisJCX0KKwlpZiAodG90ID4gNTEyKQorCQlhcHBfUkFORF9hbGxvd193cml0ZV9maWxlKCk7CisJcmV0dXJuKHRvdCk7CisJfQorCitpbnQgYXBwX1JBTkRfd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlLCBCSU8gKmJpb19lKQorCXsKKwljaGFyIGJ1ZmZlclsyMDBdOworCQorCWlmIChlZ2Rzb2NrZXQgfHwgIXNlZWRlZCkKKwkJLyogSWYgd2UgZGlkIG5vdCBtYW5hZ2UgdG8gcmVhZCB0aGUgc2VlZCBmaWxlLAorCQkgKiB3ZSBzaG91bGQgbm90IHdyaXRlIGEgbG93LWVudHJvcHkgc2VlZCBmaWxlIGJhY2sgLS0KKwkJICogaXQgd291bGQgc3VwcHJlc3MgYSBjcnVjaWFsIHdhcm5pbmcgdGhlIG5leHQgdGltZQorCQkgKiB3ZSB3YW50IHRvIHVzZSBpdC4gKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoZmlsZSA9PSBOVUxMKQorCQlmaWxlID0gUkFORF9maWxlX25hbWUoYnVmZmVyLCBzaXplb2YgYnVmZmVyKTsKKwlpZiAoZmlsZSA9PSBOVUxMIHx8ICFSQU5EX3dyaXRlX2ZpbGUoZmlsZSkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZSwidW5hYmxlIHRvIHdyaXRlICdyYW5kb20gc3RhdGUnXG4iKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgYXBwX1JBTkRfYWxsb3dfd3JpdGVfZmlsZSh2b2lkKQorCXsKKwlzZWVkZWQgPSAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvYXBwcy5jIGIvbGliL29wZW5zc2wvYXBwcy9hcHBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjNTBkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvYXBwcy5jCkBAIC0wLDAgKzEsMzAxMyBAQAorLyogYXBwcy9hcHBzLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIF9QT1NJWF9DX1NPVVJDRQorI2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMgkvKiBPbiBWTVMsIHlvdSBuZWVkIHRvIGRlZmluZSB0aGlzIHRvIGdldAorCQkJCSAgIHRoZSBkZWNsYXJhdGlvbiBvZiBmaWxlbm8oKS4gIFRoZSB2YWx1ZQorCQkJCSAgIDIgaXMgdG8gbWFrZSBzdXJlIG5vIGZ1bmN0aW9uIGRlZmluZWQKKwkJCQkgICBpbiBQT1NJWC0yIGlzIGxlZnQgdW5kZWZpbmVkLiAqLworI2VuZGlmCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfV0lOMzIpICYmICFkZWZpbmVkKE5FVFdBUkVfQ0xJQikKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3VpLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zYWZlc3RhY2suaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19KUEFLRQorI2luY2x1ZGUgPG9wZW5zc2wvanBha2UuaD4KKyNlbmRpZgorCisjZGVmaW5lIE5PTl9NQUlOCisjaW5jbHVkZSAiYXBwcy5oIgorI3VuZGVmIE5PTl9NQUlOCisKKyNpZmRlZiBfV0lOMzIKK3N0YXRpYyBpbnQgV0lOMzJfcmVuYW1lKGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvKTsKKyNkZWZpbmUgcmVuYW1lKGZyb20sdG8pIFdJTjMyX3JlbmFtZSgoZnJvbSksKHRvKSkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJdW5zaWduZWQgbG9uZyBtYXNrOworfSBOQU1FX0VYX1RCTDsKKworc3RhdGljIFVJX01FVEhPRCAqdWlfbWV0aG9kID0gTlVMTDsKKworc3RhdGljIGludCBzZXRfdGFibGVfb3B0cyh1bnNpZ25lZCBsb25nICpmbGFncywgY29uc3QgY2hhciAqYXJnLCBjb25zdCBOQU1FX0VYX1RCTCAqaW5fdGJsKTsKK3N0YXRpYyBpbnQgc2V0X211bHRpX29wdHModW5zaWduZWQgbG9uZyAqZmxhZ3MsIGNvbnN0IGNoYXIgKmFyZywgY29uc3QgTkFNRV9FWF9UQkwgKmluX3RibCk7CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1JDNCkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19SU0EpCisvKiBMb29rcyBsaWtlIHRoaXMgc3R1ZmYgaXMgd29ydGggbW92aW5nIGludG8gc2VwYXJhdGUgZnVuY3Rpb24gKi8KK3N0YXRpYyBFVlBfUEtFWSAqCitsb2FkX25ldHNjYXBlX2tleShCSU8gKmVyciwgQklPICprZXksIGNvbnN0IGNoYXIgKmZpbGUsCisJCWNvbnN0IGNoYXIgKmtleV9kZXNjcmlwLCBpbnQgZm9ybWF0KTsKKyNlbmRpZgorCitpbnQgYXBwX2luaXQobG9uZyBtZXNnd2luKTsKKyNpZmRlZiB1bmRlZiAvKiBuZXZlciBmaW5pc2hlZCAtIHByb2JhYmx5IG5ldmVyIHdpbGwgYmUgOi0pICovCitpbnQgYXJnc19mcm9tX2ZpbGUoY2hhciAqZmlsZSwgaW50ICphcmdjLCBjaGFyICoqYXJndltdKQorCXsKKwlGSUxFICpmcDsKKwlpbnQgbnVtLGk7CisJdW5zaWduZWQgaW50IGxlbjsKKwlzdGF0aWMgY2hhciAqYnVmPU5VTEw7CisJc3RhdGljIGNoYXIgKiphcmc9TlVMTDsKKwljaGFyICpwOworCisJZnA9Zm9wZW4oZmlsZSwiciIpOworCWlmIChmcCA9PSBOVUxMKQorCQlyZXR1cm4oMCk7CisKKwlpZiAoZnNlZWsoZnAsMCxTRUVLX0VORCk9PTApCisJCWxlbj1mdGVsbChmcCksIHJld2luZChmcCk7CisJZWxzZQlsZW49LTE7CisJaWYgKGxlbjw9MCkKKwkJeworCQlmY2xvc2UoZnApOworCQlyZXR1cm4oMCk7CisJCX0KKworCSphcmdjPTA7CisJKmFyZ3Y9TlVMTDsKKworCWlmIChidWYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGJ1Zik7CisJYnVmPShjaGFyICopT1BFTlNTTF9tYWxsb2MobGVuKzEpOworCWlmIChidWYgPT0gTlVMTCkgcmV0dXJuKDApOworCisJbGVuPWZyZWFkKGJ1ZiwxLGxlbixmcCk7CisJaWYgKGxlbiA8PSAxKSByZXR1cm4oMCk7CisJYnVmW2xlbl09J1wwJzsKKworCWk9MDsKKwlmb3IgKHA9YnVmOyAqcDsgcCsrKQorCQlpZiAoKnAgPT0gJ1xuJykgaSsrOworCWlmIChhcmcgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGFyZyk7CisJYXJnPShjaGFyICoqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihjaGFyICopKihpKjIpKTsKKworCSphcmd2PWFyZzsKKwludW09MDsKKwlwPWJ1ZjsKKwlmb3IgKDs7KQorCQl7CisJCWlmICghKnApIGJyZWFrOworCQlpZiAoKnAgPT0gJyMnKSAvKiBjb21tZW50IGxpbmUgKi8KKwkJCXsKKwkJCXdoaWxlICgqcCAmJiAoKnAgIT0gJ1xuJykpIHArKzsKKwkJCWNvbnRpbnVlOworCQkJfQorCQkvKiBlbHNlIHdlIGhhdmUgYSBsaW5lICovCisJCSooYXJnKyspPXA7CisJCW51bSsrOworCQl3aGlsZSAoKnAgJiYgKCgqcCAhPSAnICcpICYmICgqcCAhPSAnXHQnKSAmJiAoKnAgIT0gJ1xuJykpKQorCQkJcCsrOworCQlpZiAoISpwKSBicmVhazsKKwkJaWYgKCpwID09ICdcbicpCisJCQl7CisJCQkqKHArKyk9J1wwJzsKKwkJCWNvbnRpbnVlOworCQkJfQorCQkvKiBlbHNlIGl0IGlzIGEgdGFiIG9yIHNwYWNlICovCisJCXArKzsKKwkJd2hpbGUgKCpwICYmICgoKnAgPT0gJyAnKSB8fCAoKnAgPT0gJ1x0JykgfHwgKCpwID09ICdcbicpKSkKKwkJCXArKzsKKwkJaWYgKCEqcCkgYnJlYWs7CisJCWlmICgqcCA9PSAnXG4nKQorCQkJeworCQkJcCsrOworCQkJY29udGludWU7CisJCQl9CisJCSooYXJnKyspPXArKzsKKwkJbnVtKys7CisJCXdoaWxlICgqcCAmJiAoKnAgIT0gJ1xuJykpIHArKzsKKwkJaWYgKCEqcCkgYnJlYWs7CisJCS8qIGVsc2UgKnAgPT0gJ1xuJyAqLworCQkqKHArKyk9J1wwJzsKKwkJfQorCSphcmdjPW51bTsKKwlyZXR1cm4oMSk7CisJfQorI2VuZGlmCisKK2ludCBzdHIyZm10KGNoYXIgKnMpCisJeworCWlmIAkoKCpzID09ICdEJykgfHwgKCpzID09ICdkJykpCisJCXJldHVybihGT1JNQVRfQVNOMSk7CisJZWxzZSBpZiAoKCpzID09ICdUJykgfHwgKCpzID09ICd0JykpCisJCXJldHVybihGT1JNQVRfVEVYVCk7CisgIAllbHNlIGlmICgoKnMgPT0gJ04nKSB8fCAoKnMgPT0gJ24nKSkKKyAgCQlyZXR1cm4oRk9STUFUX05FVFNDQVBFKTsKKyAgCWVsc2UgaWYgKCgqcyA9PSAnUycpIHx8ICgqcyA9PSAncycpKQorICAJCXJldHVybihGT1JNQVRfU01JTUUpOworIAllbHNlIGlmICgoKnMgPT0gJ00nKSB8fCAoKnMgPT0gJ20nKSkKKyAJCXJldHVybihGT1JNQVRfTVNCTE9CKTsKKwllbHNlIGlmICgoKnMgPT0gJzEnKQorCQl8fCAoc3RyY21wKHMsIlBLQ1MxMiIpID09IDApIHx8IChzdHJjbXAocywicGtjczEyIikgPT0gMCkKKwkJfHwgKHN0cmNtcChzLCJQMTIiKSA9PSAwKSB8fCAoc3RyY21wKHMsInAxMiIpID09IDApKQorCQlyZXR1cm4oRk9STUFUX1BLQ1MxMik7CisJZWxzZSBpZiAoKCpzID09ICdFJykgfHwgKCpzID09ICdlJykpCisJCXJldHVybihGT1JNQVRfRU5HSU5FKTsKKwllbHNlIGlmICgoKnMgPT0gJ1AnKSB8fCAoKnMgPT0gJ3AnKSkKKyAJCXsKKyAJCWlmIChzWzFdID09ICdWJyB8fCBzWzFdID09ICd2JykKKyAJCQlyZXR1cm4gRk9STUFUX1BWSzsKKyAJCWVsc2UKKyAgCQkJcmV0dXJuKEZPUk1BVF9QRU0pOworIAkJfQorCWVsc2UKKwkJcmV0dXJuKEZPUk1BVF9VTkRFRik7CisJfQorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4xNikgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKQordm9pZCBwcm9ncmFtX25hbWUoY2hhciAqaW4sIGNoYXIgKm91dCwgaW50IHNpemUpCisJeworCWludCBpLG47CisJY2hhciAqcD1OVUxMOworCisJbj1zdHJsZW4oaW4pOworCS8qIGZpbmQgdGhlIGxhc3QgJy8nLCAnXCcgb3IgJzonICovCisJZm9yIChpPW4tMTsgaT4wOyBpLS0pCisJCXsKKwkJaWYgKChpbltpXSA9PSAnLycpIHx8IChpbltpXSA9PSAnXFwnKSB8fCAoaW5baV0gPT0gJzonKSkKKwkJCXsKKwkJCXA9ICYoaW5baSsxXSk7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCWlmIChwID09IE5VTEwpCisJCXA9aW47CisJbj1zdHJsZW4ocCk7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisgICAvKiBzdHJpcCBvZmYgdHJhaWxpbmcgLm5sbSBpZiBwcmVzZW50LiAqLworICAgaWYgKChuID4gNCkgJiYgKHBbbi00XSA9PSAnLicpICYmCisgICAgICAoKHBbbi0zXSA9PSAnbicpIHx8IChwW24tM10gPT0gJ04nKSkgJiYKKyAgICAgICgocFtuLTJdID09ICdsJykgfHwgKHBbbi0yXSA9PSAnTCcpKSAmJgorICAgICAgKChwW24tMV0gPT0gJ20nKSB8fCAocFtuLTFdID09ICdNJykpKQorICAgICAgbi09NDsKKyNlbHNlCisJLyogc3RyaXAgb2ZmIHRyYWlsaW5nIC5leGUgaWYgcHJlc2VudC4gKi8KKwlpZiAoKG4gPiA0KSAmJiAocFtuLTRdID09ICcuJykgJiYKKwkJKChwW24tM10gPT0gJ2UnKSB8fCAocFtuLTNdID09ICdFJykpICYmCisJCSgocFtuLTJdID09ICd4JykgfHwgKHBbbi0yXSA9PSAnWCcpKSAmJgorCQkoKHBbbi0xXSA9PSAnZScpIHx8IChwW24tMV0gPT0gJ0UnKSkpCisJCW4tPTQ7CisjZW5kaWYKKworCWlmIChuID4gc2l6ZS0xKQorCQluPXNpemUtMTsKKworCWZvciAoaT0wOyBpPG47IGkrKykKKwkJeworCQlpZiAoKHBbaV0gPj0gJ0EnKSAmJiAocFtpXSA8PSAnWicpKQorCQkJb3V0W2ldPXBbaV0tJ0EnKydhJzsKKwkJZWxzZQorCQkJb3V0W2ldPXBbaV07CisJCX0KKwlvdXRbbl09J1wwJzsKKwl9CisjZWxzZQorI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUwordm9pZCBwcm9ncmFtX25hbWUoY2hhciAqaW4sIGNoYXIgKm91dCwgaW50IHNpemUpCisJeworCWNoYXIgKnA9aW4sICpxOworCWNoYXIgKmNoYXJzPSI6XT4iOworCisJd2hpbGUoKmNoYXJzICE9ICdcMCcpCisJCXsKKwkJcT1zdHJyY2hyKHAsKmNoYXJzKTsKKwkJaWYgKHEgPiBwKQorCQkJcCA9IHEgKyAxOworCQljaGFycysrOworCQl9CisKKwlxPXN0cnJjaHIocCwnLicpOworCWlmIChxID09IE5VTEwpCisJCXEgPSBwICsgc3RybGVuKHApOworCXN0cm5jcHkob3V0LHAsc2l6ZS0xKTsKKwlpZiAocS1wID49IHNpemUpCisJCXsKKwkJb3V0W3NpemUtMV09J1wwJzsKKwkJfQorCWVsc2UKKwkJeworCQlvdXRbcS1wXT0nXDAnOworCQl9CisJfQorI2Vsc2UKK3ZvaWQgcHJvZ3JhbV9uYW1lKGNoYXIgKmluLCBjaGFyICpvdXQsIGludCBzaXplKQorCXsKKwljaGFyICpwOworCisJcD1zdHJyY2hyKGluLCcvJyk7CisJaWYgKHAgIT0gTlVMTCkKKwkJcCsrOworCWVsc2UKKwkJcD1pbjsKKwlCVUZfc3RybGNweShvdXQscCxzaXplKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorCitpbnQgY2hvcHVwX2FyZ3MoQVJHUyAqYXJnLCBjaGFyICpidWYsIGludCAqYXJnYywgY2hhciAqKmFyZ3ZbXSkKKwl7CisJaW50IG51bSxsZW4saTsKKwljaGFyICpwOworCisJKmFyZ2M9MDsKKwkqYXJndj1OVUxMOworCisJbGVuPXN0cmxlbihidWYpOworCWk9MDsKKwlpZiAoYXJnLT5jb3VudCA9PSAwKQorCQl7CisJCWFyZy0+Y291bnQ9MjA7CisJCWFyZy0+ZGF0YT0oY2hhciAqKilPUEVOU1NMX21hbGxvYyhzaXplb2YoY2hhciAqKSphcmctPmNvdW50KTsKKwkJfQorCWZvciAoaT0wOyBpPGFyZy0+Y291bnQ7IGkrKykKKwkJYXJnLT5kYXRhW2ldPU5VTEw7CisKKwludW09MDsKKwlwPWJ1ZjsKKwlmb3IgKDs7KQorCQl7CisJCS8qIGZpcnN0IHNjYW4gb3ZlciB3aGl0ZSBzcGFjZSAqLworCQlpZiAoISpwKSBicmVhazsKKwkJd2hpbGUgKCpwICYmICgoKnAgPT0gJyAnKSB8fCAoKnAgPT0gJ1x0JykgfHwgKCpwID09ICdcbicpKSkKKwkJCXArKzsKKwkJaWYgKCEqcCkgYnJlYWs7CisKKwkJLyogVGhlIHN0YXJ0IG9mIHNvbWV0aGluZyBnb29kIDotKSAqLworCQlpZiAobnVtID49IGFyZy0+Y291bnQpCisJCQl7CisJCQljaGFyICoqdG1wX3A7CisJCQlpbnQgdGxlbiA9IGFyZy0+Y291bnQgKyAyMDsKKwkJCXRtcF9wID0gKGNoYXIgKiopT1BFTlNTTF9yZWFsbG9jKGFyZy0+ZGF0YSwKKwkJCQlzaXplb2YoY2hhciAqKSp0bGVuKTsKKwkJCWlmICh0bXBfcCA9PSBOVUxMKQorCQkJCXJldHVybiAwOworCQkJYXJnLT5kYXRhICA9IHRtcF9wOworCQkJYXJnLT5jb3VudCA9IHRsZW47CisJCQkvKiBpbml0aWFsaXplIG5ld2x5IGFsbG9jYXRlZCBkYXRhICovCisJCQlmb3IgKGkgPSBudW07IGkgPCBhcmctPmNvdW50OyBpKyspCisJCQkJYXJnLT5kYXRhW2ldID0gTlVMTDsKKwkJCX0KKwkJYXJnLT5kYXRhW251bSsrXT1wOworCisJCS8qIG5vdyBsb29rIGZvciB0aGUgZW5kIG9mIHRoaXMgKi8KKwkJaWYgKCgqcCA9PSAnXCcnKSB8fCAoKnAgPT0gJ1wiJykpIC8qIHNjYW4gZm9yIGNsb3NpbmcgcXVvdGUgKi8KKwkJCXsKKwkJCWk9ICoocCsrKTsKKwkJCWFyZy0+ZGF0YVtudW0tMV0rKzsgLyoganVtcCBvdmVyIHF1b3RlICovCisJCQl3aGlsZSAoKnAgJiYgKCpwICE9IGkpKQorCQkJCXArKzsKKwkJCSpwPSdcMCc7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXdoaWxlICgqcCAmJiAoKCpwICE9ICcgJykgJiYKKwkJCQkoKnAgIT0gJ1x0JykgJiYgKCpwICE9ICdcbicpKSkKKwkJCQlwKys7CisKKwkJCWlmICgqcCA9PSAnXDAnKQorCQkJCXAtLTsKKwkJCWVsc2UKKwkJCQkqcD0nXDAnOworCQkJfQorCQlwKys7CisJCX0KKwkqYXJnYz1udW07CisJKmFyZ3Y9YXJnLT5kYXRhOworCXJldHVybigxKTsKKwl9CisKKyNpZm5kZWYgQVBQX0lOSVQKK2ludCBhcHBfaW5pdChsb25nIG1lc2d3aW4pCisJeworCXJldHVybigxKTsKKwl9CisjZW5kaWYKKworCitpbnQgZHVtcF9jZXJ0X3RleHQgKEJJTyAqb3V0LCBYNTA5ICp4KQoreworCWNoYXIgKnA7CisKKwlwPVg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSxOVUxMLDApOworCUJJT19wdXRzKG91dCwic3ViamVjdD0iKTsKKwlCSU9fcHV0cyhvdXQscCk7CisJT1BFTlNTTF9mcmVlKHApOworCisJcD1YNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZSh4KSxOVUxMLDApOworCUJJT19wdXRzKG91dCwiXG5pc3N1ZXI9Iik7CisJQklPX3B1dHMob3V0LHApOworCUJJT19wdXRzKG91dCwiXG4iKTsKKwlPUEVOU1NMX2ZyZWUocCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1aV9vcGVuKFVJICp1aSkKKwl7CisJcmV0dXJuIFVJX21ldGhvZF9nZXRfb3BlbmVyKFVJX09wZW5TU0woKSkodWkpOworCX0KK3N0YXRpYyBpbnQgdWlfcmVhZChVSSAqdWksIFVJX1NUUklORyAqdWlzKQorCXsKKwlpZiAoVUlfZ2V0X2lucHV0X2ZsYWdzKHVpcykgJiBVSV9JTlBVVF9GTEFHX0RFRkFVTFRfUFdECisJCSYmIFVJX2dldDBfdXNlcl9kYXRhKHVpKSkKKwkJeworCQlzd2l0Y2goVUlfZ2V0X3N0cmluZ190eXBlKHVpcykpCisJCQl7CisJCWNhc2UgVUlUX1BST01QVDoKKwkJY2FzZSBVSVRfVkVSSUZZOgorCQkJeworCQkJY29uc3QgY2hhciAqcGFzc3dvcmQgPQorCQkJCSgoUFdfQ0JfREFUQSAqKVVJX2dldDBfdXNlcl9kYXRhKHVpKSktPnBhc3N3b3JkOworCQkJaWYgKHBhc3N3b3JkICYmIHBhc3N3b3JkWzBdICE9ICdcMCcpCisJCQkJeworCQkJCVVJX3NldF9yZXN1bHQodWksIHVpcywgcGFzc3dvcmQpOworCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQkJfQorCQl9CisJcmV0dXJuIFVJX21ldGhvZF9nZXRfcmVhZGVyKFVJX09wZW5TU0woKSkodWksIHVpcyk7CisJfQorc3RhdGljIGludCB1aV93cml0ZShVSSAqdWksIFVJX1NUUklORyAqdWlzKQorCXsKKwlpZiAoVUlfZ2V0X2lucHV0X2ZsYWdzKHVpcykgJiBVSV9JTlBVVF9GTEFHX0RFRkFVTFRfUFdECisJCSYmIFVJX2dldDBfdXNlcl9kYXRhKHVpKSkKKwkJeworCQlzd2l0Y2goVUlfZ2V0X3N0cmluZ190eXBlKHVpcykpCisJCQl7CisJCWNhc2UgVUlUX1BST01QVDoKKwkJY2FzZSBVSVRfVkVSSUZZOgorCQkJeworCQkJY29uc3QgY2hhciAqcGFzc3dvcmQgPQorCQkJCSgoUFdfQ0JfREFUQSAqKVVJX2dldDBfdXNlcl9kYXRhKHVpKSktPnBhc3N3b3JkOworCQkJaWYgKHBhc3N3b3JkICYmIHBhc3N3b3JkWzBdICE9ICdcMCcpCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJCX0KKwkJfQorCXJldHVybiBVSV9tZXRob2RfZ2V0X3dyaXRlcihVSV9PcGVuU1NMKCkpKHVpLCB1aXMpOworCX0KK3N0YXRpYyBpbnQgdWlfY2xvc2UoVUkgKnVpKQorCXsKKwlyZXR1cm4gVUlfbWV0aG9kX2dldF9jbG9zZXIoVUlfT3BlblNTTCgpKSh1aSk7CisJfQoraW50IHNldHVwX3VpX21ldGhvZCh2b2lkKQorCXsKKwl1aV9tZXRob2QgPSBVSV9jcmVhdGVfbWV0aG9kKCJPcGVuU1NMIGFwcGxpY2F0aW9uIHVzZXIgaW50ZXJmYWNlIik7CisJVUlfbWV0aG9kX3NldF9vcGVuZXIodWlfbWV0aG9kLCB1aV9vcGVuKTsKKwlVSV9tZXRob2Rfc2V0X3JlYWRlcih1aV9tZXRob2QsIHVpX3JlYWQpOworCVVJX21ldGhvZF9zZXRfd3JpdGVyKHVpX21ldGhvZCwgdWlfd3JpdGUpOworCVVJX21ldGhvZF9zZXRfY2xvc2VyKHVpX21ldGhvZCwgdWlfY2xvc2UpOworCXJldHVybiAwOworCX0KK3ZvaWQgZGVzdHJveV91aV9tZXRob2Qodm9pZCkKKwl7CisJaWYodWlfbWV0aG9kKQorCQl7CisJCVVJX2Rlc3Ryb3lfbWV0aG9kKHVpX21ldGhvZCk7CisJCXVpX21ldGhvZCA9IE5VTEw7CisJCX0KKwl9CitpbnQgcGFzc3dvcmRfY2FsbGJhY2soY2hhciAqYnVmLCBpbnQgYnVmc2l6LCBpbnQgdmVyaWZ5LAorCVBXX0NCX0RBVEEgKmNiX3RtcCkKKwl7CisJVUkgKnVpID0gTlVMTDsKKwlpbnQgcmVzID0gMDsKKwljb25zdCBjaGFyICpwcm9tcHRfaW5mbyA9IE5VTEw7CisJY29uc3QgY2hhciAqcGFzc3dvcmQgPSBOVUxMOworCVBXX0NCX0RBVEEgKmNiX2RhdGEgPSAoUFdfQ0JfREFUQSAqKWNiX3RtcDsKKworCWlmIChjYl9kYXRhKQorCQl7CisJCWlmIChjYl9kYXRhLT5wYXNzd29yZCkKKwkJCXBhc3N3b3JkID0gY2JfZGF0YS0+cGFzc3dvcmQ7CisJCWlmIChjYl9kYXRhLT5wcm9tcHRfaW5mbykKKwkJCXByb21wdF9pbmZvID0gY2JfZGF0YS0+cHJvbXB0X2luZm87CisJCX0KKworCWlmIChwYXNzd29yZCkKKwkJeworCQlyZXMgPSBzdHJsZW4ocGFzc3dvcmQpOworCQlpZiAocmVzID4gYnVmc2l6KQorCQkJcmVzID0gYnVmc2l6OworCQltZW1jcHkoYnVmLCBwYXNzd29yZCwgcmVzKTsKKwkJcmV0dXJuIHJlczsKKwkJfQorCisJdWkgPSBVSV9uZXdfbWV0aG9kKHVpX21ldGhvZCk7CisJaWYgKHVpKQorCQl7CisJCWludCBvayA9IDA7CisJCWNoYXIgKmJ1ZmYgPSBOVUxMOworCQlpbnQgdWlfZmxhZ3MgPSAwOworCQljaGFyICpwcm9tcHQgPSBOVUxMOworCisJCXByb21wdCA9IFVJX2NvbnN0cnVjdF9wcm9tcHQodWksICJwYXNzIHBocmFzZSIsCisJCQlwcm9tcHRfaW5mbyk7CisKKwkJdWlfZmxhZ3MgfD0gVUlfSU5QVVRfRkxBR19ERUZBVUxUX1BXRDsKKwkJVUlfY3RybCh1aSwgVUlfQ1RSTF9QUklOVF9FUlJPUlMsIDEsIDAsIDApOworCisJCWlmIChvayA+PSAwKQorCQkJb2sgPSBVSV9hZGRfaW5wdXRfc3RyaW5nKHVpLHByb21wdCx1aV9mbGFncyxidWYsCisJCQkJUFdfTUlOX0xFTkdUSCxCVUZTSVotMSk7CisJCWlmIChvayA+PSAwICYmIHZlcmlmeSkKKwkJCXsKKwkJCWJ1ZmYgPSAoY2hhciAqKU9QRU5TU0xfbWFsbG9jKGJ1ZnNpeik7CisJCQlvayA9IFVJX2FkZF92ZXJpZnlfc3RyaW5nKHVpLHByb21wdCx1aV9mbGFncyxidWZmLAorCQkJCVBXX01JTl9MRU5HVEgsQlVGU0laLTEsIGJ1Zik7CisJCQl9CisJCWlmIChvayA+PSAwKQorCQkJZG8KKwkJCQl7CisJCQkJb2sgPSBVSV9wcm9jZXNzKHVpKTsKKwkJCQl9CisJCQl3aGlsZSAob2sgPCAwICYmIFVJX2N0cmwodWksIFVJX0NUUkxfSVNfUkVET0FCTEUsIDAsIDAsIDApKTsKKworCQlpZiAoYnVmZikKKwkJCXsKKwkJCU9QRU5TU0xfY2xlYW5zZShidWZmLCh1bnNpZ25lZCBpbnQpYnVmc2l6KTsKKwkJCU9QRU5TU0xfZnJlZShidWZmKTsKKwkJCX0KKworCQlpZiAob2sgPj0gMCkKKwkJCXJlcyA9IHN0cmxlbihidWYpOworCQlpZiAob2sgPT0gLTEpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJVc2VyIGludGVyZmFjZSBlcnJvclxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJT1BFTlNTTF9jbGVhbnNlKGJ1ZiwodW5zaWduZWQgaW50KWJ1ZnNpeik7CisJCQlyZXMgPSAwOworCQkJfQorCQlpZiAob2sgPT0gLTIpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImFib3J0ZWQhXG4iKTsKKwkJCU9QRU5TU0xfY2xlYW5zZShidWYsKHVuc2lnbmVkIGludClidWZzaXopOworCQkJcmVzID0gMDsKKwkJCX0KKwkJVUlfZnJlZSh1aSk7CisJCU9QRU5TU0xfZnJlZShwcm9tcHQpOworCQl9CisJcmV0dXJuIHJlczsKKwl9CisKK3N0YXRpYyBjaGFyICphcHBfZ2V0X3Bhc3MoQklPICplcnIsIGNoYXIgKmFyZywgaW50IGtlZXBiaW8pOworCitpbnQgYXBwX3Bhc3N3ZChCSU8gKmVyciwgY2hhciAqYXJnMSwgY2hhciAqYXJnMiwgY2hhciAqKnBhc3MxLCBjaGFyICoqcGFzczIpCit7CisJaW50IHNhbWU7CisJaWYoIWFyZzIgfHwgIWFyZzEgfHwgc3RyY21wKGFyZzEsIGFyZzIpKSBzYW1lID0gMDsKKwllbHNlIHNhbWUgPSAxOworCWlmKGFyZzEpIHsKKwkJKnBhc3MxID0gYXBwX2dldF9wYXNzKGVyciwgYXJnMSwgc2FtZSk7CisJCWlmKCEqcGFzczEpIHJldHVybiAwOworCX0gZWxzZSBpZihwYXNzMSkgKnBhc3MxID0gTlVMTDsKKwlpZihhcmcyKSB7CisJCSpwYXNzMiA9IGFwcF9nZXRfcGFzcyhlcnIsIGFyZzIsIHNhbWUgPyAyIDogMCk7CisJCWlmKCEqcGFzczIpIHJldHVybiAwOworCX0gZWxzZSBpZihwYXNzMikgKnBhc3MyID0gTlVMTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNoYXIgKmFwcF9nZXRfcGFzcyhCSU8gKmVyciwgY2hhciAqYXJnLCBpbnQga2VlcGJpbykKK3sKKwljaGFyICp0bXAsIHRwYXNzW0FQUF9QQVNTX0xFTl07CisJc3RhdGljIEJJTyAqcHdkYmlvID0gTlVMTDsKKwlpbnQgaTsKKwlpZighc3RybmNtcChhcmcsICJwYXNzOiIsIDUpKSByZXR1cm4gQlVGX3N0cmR1cChhcmcgKyA1KTsKKwlpZighc3RybmNtcChhcmcsICJlbnY6IiwgNCkpIHsKKwkJdG1wID0gZ2V0ZW52KGFyZyArIDQpOworCQlpZighdG1wKSB7CisJCQlCSU9fcHJpbnRmKGVyciwgIkNhbid0IHJlYWQgZW52aXJvbm1lbnQgdmFyaWFibGUgJXNcbiIsIGFyZyArIDQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0dXJuIEJVRl9zdHJkdXAodG1wKTsKKwl9CisJaWYoIWtlZXBiaW8gfHwgIXB3ZGJpbykgeworCQlpZighc3RybmNtcChhcmcsICJmaWxlOiIsIDUpKSB7CisJCQlwd2RiaW8gPSBCSU9fbmV3X2ZpbGUoYXJnICsgNSwgInIiKTsKKwkJCWlmKCFwd2RiaW8pIHsKKwkJCQlCSU9fcHJpbnRmKGVyciwgIkNhbid0IG9wZW4gZmlsZSAlc1xuIiwgYXJnICsgNSk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisjaWYgIWRlZmluZWQoX1dJTjMyKQorCQkvKgorCQkgKiBVbmRlciBfV0lOMzIsIHdoaWNoIGNvdmVycyBldmVuIFdpbjY0IGFuZCBDRSwgZmlsZQorCQkgKiBkZXNjcmlwdG9ycyByZWZlcmVuY2VkIGJ5IEJJT19zX2ZkIGFyZSBub3QgaW5oZXJpdGVkCisJCSAqIGJ5IGNoaWxkIHByb2Nlc3MgYW5kIHRoZXJlZm9yZSBiZWxvdyBpcyBub3QgYW4gb3B0aW9uLgorCQkgKiBJdCBjb3VsZCBoYXZlIGJlZW4gYW4gb3B0aW9uIGlmIGJzc19mZC5jIHdhcyBvcGVyYXRpbmcKKwkJICogb24gcmVhbCBXaW5kb3dzIGRlc2NyaXB0b3JzLCBzdWNoIGFzIHRob3NlIG9idGFpbmVkCisJCSAqIHdpdGggQ3JlYXRlRmlsZS4KKwkJICovCisJCX0gZWxzZSBpZighc3RybmNtcChhcmcsICJmZDoiLCAzKSkgeworCQkJQklPICpidG1wOworCQkJaSA9IGF0b2koYXJnICsgMyk7CisJCQlpZihpID49IDApIHB3ZGJpbyA9IEJJT19uZXdfZmQoaSwgQklPX05PQ0xPU0UpOworCQkJaWYoKGkgPCAwKSB8fCAhcHdkYmlvKSB7CisJCQkJQklPX3ByaW50ZihlcnIsICJDYW4ndCBhY2Nlc3MgZmlsZSBkZXNjcmlwdG9yICVzXG4iLCBhcmcgKyAzKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCS8qIENhbid0IGRvIEJJT19nZXRzIG9uIGFuIGZkIEJJTyBzbyBhZGQgYSBidWZmZXJpbmcgQklPICovCisJCQlidG1wID0gQklPX25ldyhCSU9fZl9idWZmZXIoKSk7CisJCQlwd2RiaW8gPSBCSU9fcHVzaChidG1wLCBwd2RiaW8pOworI2VuZGlmCisJCX0gZWxzZSBpZighc3RyY21wKGFyZywgInN0ZGluIikpIHsKKwkJCXB3ZGJpbyA9IEJJT19uZXdfZnAoc3RkaW4sIEJJT19OT0NMT1NFKTsKKwkJCWlmKCFwd2RiaW8pIHsKKwkJCQlCSU9fcHJpbnRmKGVyciwgIkNhbid0IG9wZW4gQklPIGZvciBzdGRpblxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlCSU9fcHJpbnRmKGVyciwgIkludmFsaWQgcGFzc3dvcmQgYXJndW1lbnQgXCIlc1wiXG4iLCBhcmcpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaSA9IEJJT19nZXRzKHB3ZGJpbywgdHBhc3MsIEFQUF9QQVNTX0xFTik7CisJaWYoa2VlcGJpbyAhPSAxKSB7CisJCUJJT19mcmVlX2FsbChwd2RiaW8pOworCQlwd2RiaW8gPSBOVUxMOworCX0KKwlpZihpIDw9IDApIHsKKwkJQklPX3ByaW50ZihlcnIsICJFcnJvciByZWFkaW5nIHBhc3N3b3JkIGZyb20gQklPXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXRtcCA9IHN0cmNocih0cGFzcywgJ1xuJyk7CisJaWYodG1wKSAqdG1wID0gMDsKKwlyZXR1cm4gQlVGX3N0cmR1cCh0cGFzcyk7Cit9CisKK2ludCBhZGRfb2lkX3NlY3Rpb24oQklPICplcnIsIENPTkYgKmNvbmYpCit7CQorCWNoYXIgKnA7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNrdG1wOworCUNPTkZfVkFMVUUgKmNuZjsKKwlpbnQgaTsKKwlpZighKHA9TkNPTkZfZ2V0X3N0cmluZyhjb25mLE5VTEwsIm9pZF9zZWN0aW9uIikpKQorCQl7CisJCUVSUl9jbGVhcl9lcnJvcigpOworCQlyZXR1cm4gMTsKKwkJfQorCWlmKCEoc2t0bXAgPSBOQ09ORl9nZXRfc2VjdGlvbihjb25mLCBwKSkpIHsKKwkJQklPX3ByaW50ZihlcnIsICJwcm9ibGVtIGxvYWRpbmcgb2lkIHNlY3Rpb24gJXNcbiIsIHApOworCQlyZXR1cm4gMDsKKwl9CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0oc2t0bXApOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZShza3RtcCwgaSk7CisJCWlmKE9CSl9jcmVhdGUoY25mLT52YWx1ZSwgY25mLT5uYW1lLCBjbmYtPm5hbWUpID09IE5JRF91bmRlZikgeworCQkJQklPX3ByaW50ZihlcnIsICJwcm9ibGVtIGNyZWF0aW5nIG9iamVjdCAlcz0lc1xuIiwKKwkJCQkJCQkgY25mLT5uYW1lLCBjbmYtPnZhbHVlKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxvYWRfcGtjczEyKEJJTyAqZXJyLCBCSU8gKmluLCBjb25zdCBjaGFyICpkZXNjLAorCQlwZW1fcGFzc3dvcmRfY2IgKnBlbV9jYiwgIHZvaWQgKmNiX2RhdGEsCisJCUVWUF9QS0VZICoqcGtleSwgWDUwOSAqKmNlcnQsIFNUQUNLX09GKFg1MDkpICoqY2EpCisJeworIAljb25zdCBjaGFyICpwYXNzOworCWNoYXIgdHBhc3NbUEVNX0JVRlNJWkVdOworCWludCBsZW4sIHJldCA9IDA7CisJUEtDUzEyICpwMTI7CisJcDEyID0gZDJpX1BLQ1MxMl9iaW8oaW4sIE5VTEwpOworCWlmIChwMTIgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGVyciwgIkVycm9yIGxvYWRpbmcgUEtDUzEyIGZpbGUgZm9yICVzXG4iLCBkZXNjKTsJCisJCWdvdG8gZGllOworCQl9CisJLyogU2VlIGlmIGFuIGVtcHR5IHBhc3N3b3JkIHdpbGwgZG8gKi8KKwlpZiAoUEtDUzEyX3ZlcmlmeV9tYWMocDEyLCAiIiwgMCkgfHwgUEtDUzEyX3ZlcmlmeV9tYWMocDEyLCBOVUxMLCAwKSkKKwkJcGFzcyA9ICIiOworCWVsc2UKKwkJeworCQlpZiAoIXBlbV9jYikKKwkJCXBlbV9jYiA9IChwZW1fcGFzc3dvcmRfY2IgKilwYXNzd29yZF9jYWxsYmFjazsKKwkJbGVuID0gcGVtX2NiKHRwYXNzLCBQRU1fQlVGU0laRSwgMCwgY2JfZGF0YSk7CisJCWlmIChsZW4gPCAwKSAKKwkJCXsKKwkJCUJJT19wcmludGYoZXJyLCAiUGFzc3BoYXJzZSBjYWxsYmFjayBlcnJvciBmb3IgJXNcbiIsCisJCQkJCWRlc2MpOworCQkJZ290byBkaWU7CisJCQl9CisJCWlmIChsZW4gPCBQRU1fQlVGU0laRSkKKwkJCXRwYXNzW2xlbl0gPSAwOworCQlpZiAoIVBLQ1MxMl92ZXJpZnlfbWFjKHAxMiwgdHBhc3MsIGxlbikpCisJCQl7CisJCQlCSU9fcHJpbnRmKGVyciwKKwkiTWFjIHZlcmlmeSBlcnJvciAod3JvbmcgcGFzc3dvcmQ/KSBpbiBQS0NTMTIgZmlsZSBmb3IgJXNcbiIsIGRlc2MpOwkKKwkJCWdvdG8gZGllOworCQkJfQorCQlwYXNzID0gdHBhc3M7CisJCX0KKwlyZXQgPSBQS0NTMTJfcGFyc2UocDEyLCBwYXNzLCBwa2V5LCBjZXJ0LCBjYSk7CisJZGllOgorCWlmIChwMTIpCisJCVBLQ1MxMl9mcmVlKHAxMik7CisJcmV0dXJuIHJldDsKKwl9CisKK1g1MDkgKmxvYWRfY2VydChCSU8gKmVyciwgY29uc3QgY2hhciAqZmlsZSwgaW50IGZvcm1hdCwKKwljb25zdCBjaGFyICpwYXNzLCBFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmNlcnRfZGVzY3JpcCkKKwl7CisJWDUwOSAqeD1OVUxMOworCUJJTyAqY2VydDsKKworCWlmICgoY2VydD1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhlcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGZpbGUgPT0gTlVMTCkKKwkJeworI2lmZGVmIF9JT05CRgorCQlzZXR2YnVmKHN0ZGluLCBOVUxMLCBfSU9OQkYsIDApOworI2VuZGlmCisJCUJJT19zZXRfZnAoY2VydCxzdGRpbixCSU9fTk9DTE9TRSk7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGNlcnQsZmlsZSkgPD0gMCkKKwkJCXsKKwkJCUJJT19wcmludGYoZXJyLCAiRXJyb3Igb3BlbmluZyAlcyAlc1xuIiwKKwkJCQljZXJ0X2Rlc2NyaXAsIGZpbGUpOworCQkJRVJSX3ByaW50X2Vycm9ycyhlcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmIAkoZm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQl4PWQyaV9YNTA5X2JpbyhjZXJ0LE5VTEwpOworCWVsc2UgaWYgKGZvcm1hdCA9PSBGT1JNQVRfTkVUU0NBUEUpCisJCXsKKwkJTkVUU0NBUEVfWDUwOSAqbng7CisJCW54PUFTTjFfaXRlbV9kMmlfYmlvKEFTTjFfSVRFTV9ycHRyKE5FVFNDQVBFX1g1MDkpLGNlcnQsTlVMTCk7CisJCWlmIChueCA9PSBOVUxMKQorCQkJCWdvdG8gZW5kOworCisJCWlmICgoc3RybmNtcChORVRTQ0FQRV9DRVJUX0hEUiwoY2hhciAqKW54LT5oZWFkZXItPmRhdGEsCisJCQlueC0+aGVhZGVyLT5sZW5ndGgpICE9IDApKQorCQkJeworCQkJTkVUU0NBUEVfWDUwOV9mcmVlKG54KTsKKwkJCUJJT19wcmludGYoZXJyLCJFcnJvciByZWFkaW5nIGhlYWRlciBvbiBjZXJ0aWZpY2F0ZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJeD1ueC0+Y2VydDsKKwkJbngtPmNlcnQgPSBOVUxMOworCQlORVRTQ0FQRV9YNTA5X2ZyZWUobngpOworCQl9CisJZWxzZSBpZiAoZm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCXg9UEVNX3JlYWRfYmlvX1g1MDlfQVVYKGNlcnQsTlVMTCwKKwkJCShwZW1fcGFzc3dvcmRfY2IgKilwYXNzd29yZF9jYWxsYmFjaywgTlVMTCk7CisJZWxzZSBpZiAoZm9ybWF0ID09IEZPUk1BVF9QS0NTMTIpCisJCXsKKwkJaWYgKCFsb2FkX3BrY3MxMihlcnIsIGNlcnQsY2VydF9kZXNjcmlwLCBOVUxMLCBOVUxMLAorCQkJCQlOVUxMLCAmeCwgTlVMTCkpCisJCQlnb3RvIGVuZDsKKwkJfQorCWVsc2UJeworCQlCSU9fcHJpbnRmKGVyciwiYmFkIGlucHV0IGZvcm1hdCBzcGVjaWZpZWQgZm9yICVzXG4iLAorCQkJY2VydF9kZXNjcmlwKTsKKwkJZ290byBlbmQ7CisJCX0KK2VuZDoKKwlpZiAoeCA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoZXJyLCJ1bmFibGUgdG8gbG9hZCBjZXJ0aWZpY2F0ZVxuIik7CisJCUVSUl9wcmludF9lcnJvcnMoZXJyKTsKKwkJfQorCWlmIChjZXJ0ICE9IE5VTEwpIEJJT19mcmVlKGNlcnQpOworCXJldHVybih4KTsKKwl9CisKK0VWUF9QS0VZICpsb2FkX2tleShCSU8gKmVyciwgY29uc3QgY2hhciAqZmlsZSwgaW50IGZvcm1hdCwgaW50IG1heWJlX3N0ZGluLAorCWNvbnN0IGNoYXIgKnBhc3MsIEVOR0lORSAqZSwgY29uc3QgY2hhciAqa2V5X2Rlc2NyaXApCisJeworCUJJTyAqa2V5PU5VTEw7CisJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKwlQV19DQl9EQVRBIGNiX2RhdGE7CisKKwljYl9kYXRhLnBhc3N3b3JkID0gcGFzczsKKwljYl9kYXRhLnByb21wdF9pbmZvID0gZmlsZTsKKworCWlmIChmaWxlID09IE5VTEwgJiYgKCFtYXliZV9zdGRpbiB8fCBmb3JtYXQgPT0gRk9STUFUX0VOR0lORSkpCisJCXsKKwkJQklPX3ByaW50ZihlcnIsIm5vIGtleWZpbGUgc3BlY2lmaWVkXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoZm9ybWF0ID09IEZPUk1BVF9FTkdJTkUpCisJCXsKKwkJaWYgKCFlKQorCQkJQklPX3ByaW50ZihlcnIsIm5vIGVuZ2luZSBzcGVjaWZpZWRcbiIpOworCQllbHNlCisJCQl7CisJCQlwa2V5ID0gRU5HSU5FX2xvYWRfcHJpdmF0ZV9rZXkoZSwgZmlsZSwKKwkJCQl1aV9tZXRob2QsICZjYl9kYXRhKTsKKwkJCWlmICghcGtleSkgCisJCQkJeworCQkJCUJJT19wcmludGYoZXJyLCJjYW5ub3QgbG9hZCAlcyBmcm9tIGVuZ2luZVxuIixrZXlfZGVzY3JpcCk7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhlcnIpOworCQkJCX0JCisJCQl9CisJCWdvdG8gZW5kOworCQl9CisjZW5kaWYKKwlrZXk9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChrZXkgPT0gTlVMTCkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGVycik7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKGZpbGUgPT0gTlVMTCAmJiBtYXliZV9zdGRpbikKKwkJeworI2lmZGVmIF9JT05CRgorCQlzZXR2YnVmKHN0ZGluLCBOVUxMLCBfSU9OQkYsIDApOworI2VuZGlmCisJCUJJT19zZXRfZnAoa2V5LHN0ZGluLEJJT19OT0NMT1NFKTsKKwkJfQorCWVsc2UKKwkJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGtleSxmaWxlKSA8PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihlcnIsICJFcnJvciBvcGVuaW5nICVzICVzXG4iLAorCQkJCWtleV9kZXNjcmlwLCBmaWxlKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCWlmIChmb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCXsKKwkJcGtleT1kMmlfUHJpdmF0ZUtleV9iaW8oa2V5LCBOVUxMKTsKKwkJfQorCWVsc2UgaWYgKGZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQl7CisJCXBrZXk9UEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkoa2V5LE5VTEwsCisJCQkocGVtX3Bhc3N3b3JkX2NiICopcGFzc3dvcmRfY2FsbGJhY2ssICZjYl9kYXRhKTsKKwkJfQorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fUkM0KSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1JTQSkKKwllbHNlIGlmIChmb3JtYXQgPT0gRk9STUFUX05FVFNDQVBFIHx8IGZvcm1hdCA9PSBGT1JNQVRfSUlTU0dDKQorCQlwa2V5ID0gbG9hZF9uZXRzY2FwZV9rZXkoZXJyLCBrZXksIGZpbGUsIGtleV9kZXNjcmlwLCBmb3JtYXQpOworI2VuZGlmCisJZWxzZSBpZiAoZm9ybWF0ID09IEZPUk1BVF9QS0NTMTIpCisJCXsKKwkJaWYgKCFsb2FkX3BrY3MxMihlcnIsIGtleSwga2V5X2Rlc2NyaXAsCisJCQkJKHBlbV9wYXNzd29yZF9jYiAqKXBhc3N3b3JkX2NhbGxiYWNrLCAmY2JfZGF0YSwKKwkJCQkmcGtleSwgTlVMTCwgTlVMTCkpCisJCQlnb3RvIGVuZDsKKwkJfQorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fUlNBKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0RTQSkgJiYgIWRlZmluZWQgKE9QRU5TU0xfTk9fUkM0KQorCWVsc2UgaWYgKGZvcm1hdCA9PSBGT1JNQVRfTVNCTE9CKQorCQlwa2V5ID0gYjJpX1ByaXZhdGVLZXlfYmlvKGtleSk7CisJZWxzZSBpZiAoZm9ybWF0ID09IEZPUk1BVF9QVkspCisJCXBrZXkgPSBiMmlfUFZLX2JpbyhrZXksIChwZW1fcGFzc3dvcmRfY2IgKilwYXNzd29yZF9jYWxsYmFjaywKKwkJCQkJCQkJJmNiX2RhdGEpOworI2VuZGlmCisJZWxzZQorCQl7CisJCUJJT19wcmludGYoZXJyLCJiYWQgaW5wdXQgZm9ybWF0IHNwZWNpZmllZCBmb3Iga2V5IGZpbGVcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorIGVuZDoKKwlpZiAoa2V5ICE9IE5VTEwpIEJJT19mcmVlKGtleSk7CisJaWYgKHBrZXkgPT0gTlVMTCkgCisJCXsKKwkJQklPX3ByaW50ZihlcnIsInVuYWJsZSB0byBsb2FkICVzXG4iLCBrZXlfZGVzY3JpcCk7CisJCUVSUl9wcmludF9lcnJvcnMoZXJyKTsKKwkJfQkKKwlyZXR1cm4ocGtleSk7CisJfQorCitFVlBfUEtFWSAqbG9hZF9wdWJrZXkoQklPICplcnIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBmb3JtYXQsIGludCBtYXliZV9zdGRpbiwKKwljb25zdCBjaGFyICpwYXNzLCBFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmtleV9kZXNjcmlwKQorCXsKKwlCSU8gKmtleT1OVUxMOworCUVWUF9QS0VZICpwa2V5PU5VTEw7CisJUFdfQ0JfREFUQSBjYl9kYXRhOworCisJY2JfZGF0YS5wYXNzd29yZCA9IHBhc3M7CisJY2JfZGF0YS5wcm9tcHRfaW5mbyA9IGZpbGU7CisKKwlpZiAoZmlsZSA9PSBOVUxMICYmICghbWF5YmVfc3RkaW4gfHwgZm9ybWF0ID09IEZPUk1BVF9FTkdJTkUpKQorCQl7CisJCUJJT19wcmludGYoZXJyLCJubyBrZXlmaWxlIHNwZWNpZmllZFxuIik7CisJCWdvdG8gZW5kOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYgKGZvcm1hdCA9PSBGT1JNQVRfRU5HSU5FKQorCQl7CisJCWlmICghZSkKKwkJCUJJT19wcmludGYoYmlvX2Vyciwibm8gZW5naW5lIHNwZWNpZmllZFxuIik7CisJCWVsc2UKKwkJCXBrZXkgPSBFTkdJTkVfbG9hZF9wdWJsaWNfa2V5KGUsIGZpbGUsCisJCQkJdWlfbWV0aG9kLCAmY2JfZGF0YSk7CisJCWdvdG8gZW5kOworCQl9CisjZW5kaWYKKwlrZXk9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChrZXkgPT0gTlVMTCkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGVycik7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKGZpbGUgPT0gTlVMTCAmJiBtYXliZV9zdGRpbikKKwkJeworI2lmZGVmIF9JT05CRgorCQlzZXR2YnVmKHN0ZGluLCBOVUxMLCBfSU9OQkYsIDApOworI2VuZGlmCisJCUJJT19zZXRfZnAoa2V5LHN0ZGluLEJJT19OT0NMT1NFKTsKKwkJfQorCWVsc2UKKwkJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGtleSxmaWxlKSA8PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihlcnIsICJFcnJvciBvcGVuaW5nICVzICVzXG4iLAorCQkJCWtleV9kZXNjcmlwLCBmaWxlKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoZXJyKTsKKwkJCWdvdG8gZW5kOworCQl9CisJaWYgKGZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJeworCQlwa2V5PWQyaV9QVUJLRVlfYmlvKGtleSwgTlVMTCk7CisJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwllbHNlIGlmIChmb3JtYXQgPT0gRk9STUFUX0FTTjFSU0EpCisJCXsKKwkJUlNBICpyc2E7CisJCXJzYSA9IGQyaV9SU0FQdWJsaWNLZXlfYmlvKGtleSwgTlVMTCk7CisJCWlmIChyc2EpCisJCQl7CisJCQlwa2V5ID0gRVZQX1BLRVlfbmV3KCk7CisJCQlpZiAocGtleSkKKwkJCQlFVlBfUEtFWV9zZXQxX1JTQShwa2V5LCByc2EpOworCQkJUlNBX2ZyZWUocnNhKTsKKwkJCX0KKwkJZWxzZQorCQkJcGtleSA9IE5VTEw7CisJCX0KKwllbHNlIGlmIChmb3JtYXQgPT0gRk9STUFUX1BFTVJTQSkKKwkJeworCQlSU0EgKnJzYTsKKwkJcnNhID0gUEVNX3JlYWRfYmlvX1JTQVB1YmxpY0tleShrZXksIE5VTEwsIAorCQkJKHBlbV9wYXNzd29yZF9jYiAqKXBhc3N3b3JkX2NhbGxiYWNrLCAmY2JfZGF0YSk7CisJCWlmIChyc2EpCisJCQl7CisJCQlwa2V5ID0gRVZQX1BLRVlfbmV3KCk7CisJCQlpZiAocGtleSkKKwkJCQlFVlBfUEtFWV9zZXQxX1JTQShwa2V5LCByc2EpOworCQkJUlNBX2ZyZWUocnNhKTsKKwkJCX0KKwkJZWxzZQorCQkJcGtleSA9IE5VTEw7CisJCX0KKyNlbmRpZgorCWVsc2UgaWYgKGZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQl7CisJCXBrZXk9UEVNX3JlYWRfYmlvX1BVQktFWShrZXksTlVMTCwKKwkJCShwZW1fcGFzc3dvcmRfY2IgKilwYXNzd29yZF9jYWxsYmFjaywgJmNiX2RhdGEpOworCQl9CisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19SQzQpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fUlNBKQorCWVsc2UgaWYgKGZvcm1hdCA9PSBGT1JNQVRfTkVUU0NBUEUgfHwgZm9ybWF0ID09IEZPUk1BVF9JSVNTR0MpCisJCXBrZXkgPSBsb2FkX25ldHNjYXBlX2tleShlcnIsIGtleSwgZmlsZSwga2V5X2Rlc2NyaXAsIGZvcm1hdCk7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1JTQSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19EU0EpCisJZWxzZSBpZiAoZm9ybWF0ID09IEZPUk1BVF9NU0JMT0IpCisJCXBrZXkgPSBiMmlfUHVibGljS2V5X2JpbyhrZXkpOworI2VuZGlmCisJZWxzZQorCQl7CisJCUJJT19wcmludGYoZXJyLCJiYWQgaW5wdXQgZm9ybWF0IHNwZWNpZmllZCBmb3Iga2V5IGZpbGVcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorIGVuZDoKKwlpZiAoa2V5ICE9IE5VTEwpIEJJT19mcmVlKGtleSk7CisJaWYgKHBrZXkgPT0gTlVMTCkKKwkJQklPX3ByaW50ZihlcnIsInVuYWJsZSB0byBsb2FkICVzXG4iLCBrZXlfZGVzY3JpcCk7CisJcmV0dXJuKHBrZXkpOworCX0KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fUkM0KSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1JTQSkKK3N0YXRpYyBFVlBfUEtFWSAqCitsb2FkX25ldHNjYXBlX2tleShCSU8gKmVyciwgQklPICprZXksIGNvbnN0IGNoYXIgKmZpbGUsCisJCWNvbnN0IGNoYXIgKmtleV9kZXNjcmlwLCBpbnQgZm9ybWF0KQorCXsKKwlFVlBfUEtFWSAqcGtleTsKKwlCVUZfTUVNICpidWY7CisJUlNBCSpyc2E7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgc2l6ZSwgaTsKKworCWJ1Zj1CVUZfTUVNX25ldygpOworCXBrZXkgPSBFVlBfUEtFWV9uZXcoKTsKKwlzaXplID0gMDsKKwlpZiAoYnVmID09IE5VTEwgfHwgcGtleSA9PSBOVUxMKQorCQlnb3RvIGVycm9yOworCWZvciAoOzspCisJCXsKKwkJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLHNpemUrMTAyNCoxMCkpCisJCQlnb3RvIGVycm9yOworCQlpID0gQklPX3JlYWQoa2V5LCAmKGJ1Zi0+ZGF0YVtzaXplXSksIDEwMjQqMTApOworCQlzaXplICs9IGk7CisJCWlmIChpID09IDApCisJCQlicmVhazsKKwkJaWYgKGkgPCAwKQorCQkJeworCQkJCUJJT19wcmludGYoZXJyLCAiRXJyb3IgcmVhZGluZyAlcyAlcyIsCisJCQkJCWtleV9kZXNjcmlwLCBmaWxlKTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJcD0odW5zaWduZWQgY2hhciAqKWJ1Zi0+ZGF0YTsKKwlyc2EgPSBkMmlfUlNBX05FVChOVUxMLCZwLChsb25nKXNpemUsTlVMTCwKKwkJKGZvcm1hdCA9PSBGT1JNQVRfSUlTU0dDID8gMSA6IDApKTsKKwlpZiAocnNhID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisJQlVGX01FTV9mcmVlKGJ1Zik7CisJRVZQX1BLRVlfc2V0MV9SU0EocGtleSwgcnNhKTsKKwlyZXR1cm4gcGtleTsKK2Vycm9yOgorCUJVRl9NRU1fZnJlZShidWYpOworCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmIC8qIG5kZWYgT1BFTlNTTF9OT19SQzQgKi8KKworc3RhdGljIGludCBsb2FkX2NlcnRzX2NybHMoQklPICplcnIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBmb3JtYXQsCisJY29uc3QgY2hhciAqcGFzcywgRU5HSU5FICplLCBjb25zdCBjaGFyICpkZXNjLAorCVNUQUNLX09GKFg1MDkpICoqcGNlcnRzLCBTVEFDS19PRihYNTA5X0NSTCkgKipwY3JscykKKwl7CisJaW50IGk7CisJQklPICpiaW87CisJU1RBQ0tfT0YoWDUwOV9JTkZPKSAqeGlzID0gTlVMTDsKKwlYNTA5X0lORk8gKnhpOworCVBXX0NCX0RBVEEgY2JfZGF0YTsKKwlpbnQgcnYgPSAwOworCisJY2JfZGF0YS5wYXNzd29yZCA9IHBhc3M7CisJY2JfZGF0YS5wcm9tcHRfaW5mbyA9IGZpbGU7CisKKwlpZiAoZm9ybWF0ICE9IEZPUk1BVF9QRU0pCisJCXsKKwkJQklPX3ByaW50ZihlcnIsImJhZCBpbnB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciAlc1xuIiwgZGVzYyk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoZmlsZSA9PSBOVUxMKQorCQliaW8gPSBCSU9fbmV3X2ZwKHN0ZGluLEJJT19OT0NMT1NFKTsKKwllbHNlCisJCWJpbyA9IEJJT19uZXdfZmlsZShmaWxlLCAiciIpOworCisJaWYgKGJpbyA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoZXJyLCAiRXJyb3Igb3BlbmluZyAlcyAlc1xuIiwKKwkJCQlkZXNjLCBmaWxlID8gZmlsZSA6ICJzdGRpbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGVycik7CisJCXJldHVybiAwOworCQl9CisKKwl4aXMgPSBQRU1fWDUwOV9JTkZPX3JlYWRfYmlvKGJpbywgTlVMTCwKKwkJCQkocGVtX3Bhc3N3b3JkX2NiICopcGFzc3dvcmRfY2FsbGJhY2ssICZjYl9kYXRhKTsKKworCUJJT19mcmVlKGJpbyk7CisKKwlpZiAocGNlcnRzKQorCQl7CisJCSpwY2VydHMgPSBza19YNTA5X25ld19udWxsKCk7CisJCWlmICghKnBjZXJ0cykKKwkJCWdvdG8gZW5kOworCQl9CisKKwlpZiAocGNybHMpCisJCXsKKwkJKnBjcmxzID0gc2tfWDUwOV9DUkxfbmV3X251bGwoKTsKKwkJaWYgKCEqcGNybHMpCisJCQlnb3RvIGVuZDsKKwkJfQorCisJZm9yKGkgPSAwOyBpIDwgc2tfWDUwOV9JTkZPX251bSh4aXMpOyBpKyspCisJCXsKKwkJeGkgPSBza19YNTA5X0lORk9fdmFsdWUgKHhpcywgaSk7CisJCWlmICh4aS0+eDUwOSAmJiBwY2VydHMpCisJCQl7CisJCQlpZiAoIXNrX1g1MDlfcHVzaCgqcGNlcnRzLCB4aS0+eDUwOSkpCisJCQkJZ290byBlbmQ7CisJCQl4aS0+eDUwOSA9IE5VTEw7CisJCQl9CisJCWlmICh4aS0+Y3JsICYmIHBjcmxzKQorCQkJeworCQkJaWYgKCFza19YNTA5X0NSTF9wdXNoKCpwY3JscywgeGktPmNybCkpCisJCQkJZ290byBlbmQ7CisJCQl4aS0+Y3JsID0gTlVMTDsKKwkJCX0KKwkJfQorCisJaWYgKHBjZXJ0cyAmJiBza19YNTA5X251bSgqcGNlcnRzKSA+IDApCisJCXJ2ID0gMTsKKworCWlmIChwY3JscyAmJiBza19YNTA5X0NSTF9udW0oKnBjcmxzKSA+IDApCisJCXJ2ID0gMTsKKworCWVuZDoKKworCWlmICh4aXMpCisJCXNrX1g1MDlfSU5GT19wb3BfZnJlZSh4aXMsIFg1MDlfSU5GT19mcmVlKTsKKworCWlmIChydiA9PSAwKQorCQl7CisJCWlmIChwY2VydHMpCisJCQl7CisJCQlza19YNTA5X3BvcF9mcmVlKCpwY2VydHMsIFg1MDlfZnJlZSk7CisJCQkqcGNlcnRzID0gTlVMTDsKKwkJCX0KKwkJaWYgKHBjcmxzKQorCQkJeworCQkJc2tfWDUwOV9DUkxfcG9wX2ZyZWUoKnBjcmxzLCBYNTA5X0NSTF9mcmVlKTsKKwkJCSpwY3JscyA9IE5VTEw7CisJCQl9CisJCUJJT19wcmludGYoZXJyLCJ1bmFibGUgdG8gbG9hZCAlc1xuIiwKKwkJCQlwY2VydHMgPyAiY2VydGlmaWNhdGVzIiA6ICJDUkxzIik7CisJCUVSUl9wcmludF9lcnJvcnMoZXJyKTsKKwkJfQorCXJldHVybiBydjsKKwl9CisKK1NUQUNLX09GKFg1MDkpICpsb2FkX2NlcnRzKEJJTyAqZXJyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgZm9ybWF0LAorCWNvbnN0IGNoYXIgKnBhc3MsIEVOR0lORSAqZSwgY29uc3QgY2hhciAqZGVzYykKKwl7CisJU1RBQ0tfT0YoWDUwOSkgKmNlcnRzOworCWxvYWRfY2VydHNfY3JscyhlcnIsIGZpbGUsIGZvcm1hdCwgcGFzcywgZSwgZGVzYywgJmNlcnRzLCBOVUxMKTsKKwlyZXR1cm4gY2VydHM7CisJfQkKKworU1RBQ0tfT0YoWDUwOV9DUkwpICpsb2FkX2NybHMoQklPICplcnIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBmb3JtYXQsCisJY29uc3QgY2hhciAqcGFzcywgRU5HSU5FICplLCBjb25zdCBjaGFyICpkZXNjKQorCXsKKwlTVEFDS19PRihYNTA5X0NSTCkgKmNybHM7CisJbG9hZF9jZXJ0c19jcmxzKGVyciwgZmlsZSwgZm9ybWF0LCBwYXNzLCBlLCBkZXNjLCBOVUxMLCAmY3Jscyk7CisJcmV0dXJuIGNybHM7CisJfQkKKworI2RlZmluZSBYNTA5VjNfRVhUX1VOS05PV05fTUFTSwkJKDB4ZkwgPDwgMTYpCisvKiBSZXR1cm4gZXJyb3IgZm9yIHVua25vd24gZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYNTA5VjNfRVhUX0RFRkFVTFQJCTAKKy8qIFByaW50IGVycm9yIGZvciB1bmtub3duIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDUwOVYzX0VYVF9FUlJPUl9VTktOT1dOCSgxTCA8PCAxNikKKy8qIEFTTjEgcGFyc2UgdW5rbm93biBleHRlbnNpb25zICovCisjZGVmaW5lIFg1MDlWM19FWFRfUEFSU0VfVU5LTk9XTgkoMkwgPDwgMTYpCisvKiBCSU9fZHVtcCB1bmtub3duIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDUwOVYzX0VYVF9EVU1QX1VOS05PV04JCSgzTCA8PCAxNikKKworI2RlZmluZSBYNTA5X0ZMQUdfQ0EgKFg1MDlfRkxBR19OT19JU1NVRVIgfCBYNTA5X0ZMQUdfTk9fUFVCS0VZIHwgXAorCQkJIFg1MDlfRkxBR19OT19IRUFERVIgfCBYNTA5X0ZMQUdfTk9fVkVSU0lPTikKKworaW50IHNldF9jZXJ0X2V4KHVuc2lnbmVkIGxvbmcgKmZsYWdzLCBjb25zdCBjaGFyICphcmcpCit7CisJc3RhdGljIGNvbnN0IE5BTUVfRVhfVEJMIGNlcnRfdGJsW10gPSB7CisJCXsgImNvbXBhdGlibGUiLCBYNTA5X0ZMQUdfQ09NUEFULCAweGZmZmZmZmZmbH0sCisJCXsgImNhX2RlZmF1bHQiLCBYNTA5X0ZMQUdfQ0EsIDB4ZmZmZmZmZmZsfSwKKwkJeyAibm9faGVhZGVyIiwgWDUwOV9GTEFHX05PX0hFQURFUiwgMH0sCisJCXsgIm5vX3ZlcnNpb24iLCBYNTA5X0ZMQUdfTk9fVkVSU0lPTiwgMH0sCisJCXsgIm5vX3NlcmlhbCIsIFg1MDlfRkxBR19OT19TRVJJQUwsIDB9LAorCQl7ICJub19zaWduYW1lIiwgWDUwOV9GTEFHX05PX1NJR05BTUUsIDB9LAorCQl7ICJub192YWxpZGl0eSIsIFg1MDlfRkxBR19OT19WQUxJRElUWSwgMH0sCisJCXsgIm5vX3N1YmplY3QiLCBYNTA5X0ZMQUdfTk9fU1VCSkVDVCwgMH0sCisJCXsgIm5vX2lzc3VlciIsIFg1MDlfRkxBR19OT19JU1NVRVIsIDB9LAorCQl7ICJub19wdWJrZXkiLCBYNTA5X0ZMQUdfTk9fUFVCS0VZLCAwfSwKKwkJeyAibm9fZXh0ZW5zaW9ucyIsIFg1MDlfRkxBR19OT19FWFRFTlNJT05TLCAwfSwKKwkJeyAibm9fc2lnZHVtcCIsIFg1MDlfRkxBR19OT19TSUdEVU1QLCAwfSwKKwkJeyAibm9fYXV4IiwgWDUwOV9GTEFHX05PX0FVWCwgMH0sCisJCXsgIm5vX2F0dHJpYnV0ZXMiLCBYNTA5X0ZMQUdfTk9fQVRUUklCVVRFUywgMH0sCisJCXsgImV4dF9kZWZhdWx0IiwgWDUwOVYzX0VYVF9ERUZBVUxULCBYNTA5VjNfRVhUX1VOS05PV05fTUFTS30sCisJCXsgImV4dF9lcnJvciIsIFg1MDlWM19FWFRfRVJST1JfVU5LTk9XTiwgWDUwOVYzX0VYVF9VTktOT1dOX01BU0t9LAorCQl7ICJleHRfcGFyc2UiLCBYNTA5VjNfRVhUX1BBUlNFX1VOS05PV04sIFg1MDlWM19FWFRfVU5LTk9XTl9NQVNLfSwKKwkJeyAiZXh0X2R1bXAiLCBYNTA5VjNfRVhUX0RVTVBfVU5LTk9XTiwgWDUwOVYzX0VYVF9VTktOT1dOX01BU0t9LAorCQl7IE5VTEwsIDAsIDB9CisJfTsKKwlyZXR1cm4gc2V0X211bHRpX29wdHMoZmxhZ3MsIGFyZywgY2VydF90YmwpOworfQorCitpbnQgc2V0X25hbWVfZXgodW5zaWduZWQgbG9uZyAqZmxhZ3MsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlzdGF0aWMgY29uc3QgTkFNRV9FWF9UQkwgZXhfdGJsW10gPSB7CisJCXsgImVzY18yMjUzIiwgQVNOMV9TVFJGTEdTX0VTQ18yMjUzLCAwfSwKKwkJeyAiZXNjX2N0cmwiLCBBU04xX1NUUkZMR1NfRVNDX0NUUkwsIDB9LAorCQl7ICJlc2NfbXNiIiwgQVNOMV9TVFJGTEdTX0VTQ19NU0IsIDB9LAorCQl7ICJ1c2VfcXVvdGUiLCBBU04xX1NUUkZMR1NfRVNDX1FVT1RFLCAwfSwKKwkJeyAidXRmOCIsIEFTTjFfU1RSRkxHU19VVEY4X0NPTlZFUlQsIDB9LAorCQl7ICJpZ25vcmVfdHlwZSIsIEFTTjFfU1RSRkxHU19JR05PUkVfVFlQRSwgMH0sCisJCXsgInNob3dfdHlwZSIsIEFTTjFfU1RSRkxHU19TSE9XX1RZUEUsIDB9LAorCQl7ICJkdW1wX2FsbCIsIEFTTjFfU1RSRkxHU19EVU1QX0FMTCwgMH0sCisJCXsgImR1bXBfbm9zdHIiLCBBU04xX1NUUkZMR1NfRFVNUF9VTktOT1dOLCAwfSwKKwkJeyAiZHVtcF9kZXIiLCBBU04xX1NUUkZMR1NfRFVNUF9ERVIsIDB9LAorCQl7ICJjb21wYXQiLCBYTl9GTEFHX0NPTVBBVCwgMHhmZmZmZmZmZkx9LAorCQl7ICJzZXBfY29tbWFfcGx1cyIsIFhOX0ZMQUdfU0VQX0NPTU1BX1BMVVMsIFhOX0ZMQUdfU0VQX01BU0t9LAorCQl7ICJzZXBfY29tbWFfcGx1c19zcGFjZSIsIFhOX0ZMQUdfU0VQX0NQTFVTX1NQQywgWE5fRkxBR19TRVBfTUFTS30sCisJCXsgInNlcF9zZW1pX3BsdXNfc3BhY2UiLCBYTl9GTEFHX1NFUF9TUExVU19TUEMsIFhOX0ZMQUdfU0VQX01BU0t9LAorCQl7ICJzZXBfbXVsdGlsaW5lIiwgWE5fRkxBR19TRVBfTVVMVElMSU5FLCBYTl9GTEFHX1NFUF9NQVNLfSwKKwkJeyAiZG5fcmV2IiwgWE5fRkxBR19ETl9SRVYsIDB9LAorCQl7ICJub2ZuYW1lIiwgWE5fRkxBR19GTl9OT05FLCBYTl9GTEFHX0ZOX01BU0t9LAorCQl7ICJzbmFtZSIsIFhOX0ZMQUdfRk5fU04sIFhOX0ZMQUdfRk5fTUFTS30sCisJCXsgImxuYW1lIiwgWE5fRkxBR19GTl9MTiwgWE5fRkxBR19GTl9NQVNLfSwKKwkJeyAiYWxpZ24iLCBYTl9GTEFHX0ZOX0FMSUdOLCAwfSwKKwkJeyAib2lkIiwgWE5fRkxBR19GTl9PSUQsIFhOX0ZMQUdfRk5fTUFTS30sCisJCXsgInNwYWNlX2VxIiwgWE5fRkxBR19TUENfRVEsIDB9LAorCQl7ICJkdW1wX3Vua25vd24iLCBYTl9GTEFHX0RVTVBfVU5LTk9XTl9GSUVMRFMsIDB9LAorCQl7ICJSRkMyMjUzIiwgWE5fRkxBR19SRkMyMjUzLCAweGZmZmZmZmZmTH0sCisJCXsgIm9uZWxpbmUiLCBYTl9GTEFHX09ORUxJTkUsIDB4ZmZmZmZmZmZMfSwKKwkJeyAibXVsdGlsaW5lIiwgWE5fRkxBR19NVUxUSUxJTkUsIDB4ZmZmZmZmZmZMfSwKKwkJeyAiY2FfZGVmYXVsdCIsIFhOX0ZMQUdfTVVMVElMSU5FLCAweGZmZmZmZmZmTH0sCisJCXsgTlVMTCwgMCwgMH0KKwl9OworCXJldHVybiBzZXRfbXVsdGlfb3B0cyhmbGFncywgYXJnLCBleF90YmwpOworfQorCitpbnQgc2V0X2V4dF9jb3B5KGludCAqY29weV90eXBlLCBjb25zdCBjaGFyICphcmcpCit7CisJaWYgKCFzdHJjYXNlY21wKGFyZywgIm5vbmUiKSkKKwkJKmNvcHlfdHlwZSA9IEVYVF9DT1BZX05PTkU7CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJnLCAiY29weSIpKQorCQkqY29weV90eXBlID0gRVhUX0NPUFlfQUREOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZywgImNvcHlhbGwiKSkKKwkJKmNvcHlfdHlwZSA9IEVYVF9DT1BZX0FMTDsKKwllbHNlCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgY29weV9leHRlbnNpb25zKFg1MDkgKngsIFg1MDlfUkVRICpyZXEsIGludCBjb3B5X3R5cGUpCit7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRzID0gTlVMTDsKKwlYNTA5X0VYVEVOU0lPTiAqZXh0LCAqdG1wZXh0OworCUFTTjFfT0JKRUNUICpvYmo7CisJaW50IGksIGlkeCwgcmV0ID0gMDsKKwlpZiAoIXggfHwgIXJlcSB8fCAoY29weV90eXBlID09IEVYVF9DT1BZX05PTkUpKQorCQlyZXR1cm4gMTsKKwlleHRzID0gWDUwOV9SRVFfZ2V0X2V4dGVuc2lvbnMocmVxKTsKKworCWZvcihpID0gMDsgaSA8IHNrX1g1MDlfRVhURU5TSU9OX251bShleHRzKTsgaSsrKSB7CisJCWV4dCA9IHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKGV4dHMsIGkpOworCQlvYmogPSBYNTA5X0VYVEVOU0lPTl9nZXRfb2JqZWN0KGV4dCk7CisJCWlkeCA9IFg1MDlfZ2V0X2V4dF9ieV9PQkooeCwgb2JqLCAtMSk7CisJCS8qIERvZXMgZXh0ZW5zaW9uIGV4aXN0PyAqLworCQlpZiAoaWR4ICE9IC0xKSB7CisJCQkvKiBJZiBub3JtYWwgY29weSBkb24ndCBvdmVycmlkZSBleGlzdGluZyBleHRlbnNpb24gKi8KKwkJCWlmIChjb3B5X3R5cGUgPT0gRVhUX0NPUFlfQUREKQorCQkJCWNvbnRpbnVlOworCQkJLyogRGVsZXRlIGFsbCBleHRlbnNpb25zIG9mIHNhbWUgdHlwZSAqLworCQkJZG8geworCQkJCXRtcGV4dCA9IFg1MDlfZ2V0X2V4dCh4LCBpZHgpOworCQkJCVg1MDlfZGVsZXRlX2V4dCh4LCBpZHgpOworCQkJCVg1MDlfRVhURU5TSU9OX2ZyZWUodG1wZXh0KTsKKwkJCQlpZHggPSBYNTA5X2dldF9leHRfYnlfT0JKKHgsIG9iaiwgLTEpOworCQkJfSB3aGlsZSAoaWR4ICE9IC0xKTsKKwkJfQorCQlpZiAoIVg1MDlfYWRkX2V4dCh4LCBleHQsIC0xKSkKKwkJCWdvdG8gZW5kOworCX0KKworCXJldCA9IDE7CisKKwllbmQ6CisKKwlza19YNTA5X0VYVEVOU0lPTl9wb3BfZnJlZShleHRzLCBYNTA5X0VYVEVOU0lPTl9mcmVlKTsKKworCXJldHVybiByZXQ7Cit9CisJCQorCQkKKwkJCQorCitzdGF0aWMgaW50IHNldF9tdWx0aV9vcHRzKHVuc2lnbmVkIGxvbmcgKmZsYWdzLCBjb25zdCBjaGFyICphcmcsIGNvbnN0IE5BTUVfRVhfVEJMICppbl90YmwpCit7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnZhbHM7CisJQ09ORl9WQUxVRSAqdmFsOworCWludCBpLCByZXQgPSAxOworCWlmKCFhcmcpIHJldHVybiAwOworCXZhbHMgPSBYNTA5VjNfcGFyc2VfbGlzdChhcmcpOworCWZvciAoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWxzKTsgaSsrKSB7CisJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUodmFscywgaSk7CisJCWlmICghc2V0X3RhYmxlX29wdHMoZmxhZ3MsIHZhbC0+bmFtZSwgaW5fdGJsKSkKKwkJCXJldCA9IDA7CisJfQorCXNrX0NPTkZfVkFMVUVfcG9wX2ZyZWUodmFscywgWDUwOVYzX2NvbmZfZnJlZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzZXRfdGFibGVfb3B0cyh1bnNpZ25lZCBsb25nICpmbGFncywgY29uc3QgY2hhciAqYXJnLCBjb25zdCBOQU1FX0VYX1RCTCAqaW5fdGJsKQoreworCWNoYXIgYzsKKwljb25zdCBOQU1FX0VYX1RCTCAqcHRibDsKKwljID0gYXJnWzBdOworCisJaWYoYyA9PSAnLScpIHsKKwkJYyA9IDA7CisJCWFyZysrOworCX0gZWxzZSBpZiAoYyA9PSAnKycpIHsKKwkJYyA9IDE7CisJCWFyZysrOworCX0gZWxzZSBjID0gMTsKKworCWZvcihwdGJsID0gaW5fdGJsOyBwdGJsLT5uYW1lOyBwdGJsKyspIHsKKwkJaWYoIXN0cmNhc2VjbXAoYXJnLCBwdGJsLT5uYW1lKSkgeworCQkJKmZsYWdzICY9IH5wdGJsLT5tYXNrOworCQkJaWYoYykgKmZsYWdzIHw9IHB0YmwtPmZsYWc7CisJCQllbHNlICpmbGFncyAmPSB+cHRibC0+ZmxhZzsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCit2b2lkIHByaW50X25hbWUoQklPICpvdXQsIGNvbnN0IGNoYXIgKnRpdGxlLCBYNTA5X05BTUUgKm5tLCB1bnNpZ25lZCBsb25nIGxmbGFncykKK3sKKwljaGFyICpidWY7CisJY2hhciBtbGluZSA9IDA7CisJaW50IGluZGVudCA9IDA7CisKKwlpZih0aXRsZSkgQklPX3B1dHMob3V0LCB0aXRsZSk7CisJaWYoKGxmbGFncyAmIFhOX0ZMQUdfU0VQX01BU0spID09IFhOX0ZMQUdfU0VQX01VTFRJTElORSkgeworCQltbGluZSA9IDE7CisJCWluZGVudCA9IDQ7CisJfQorCWlmKGxmbGFncyA9PSBYTl9GTEFHX0NPTVBBVCkgeworCQlidWYgPSBYNTA5X05BTUVfb25lbGluZShubSwgMCwgMCk7CisJCUJJT19wdXRzKG91dCwgYnVmKTsKKwkJQklPX3B1dHMob3V0LCAiXG4iKTsKKwkJT1BFTlNTTF9mcmVlKGJ1Zik7CisJfSBlbHNlIHsKKwkJaWYobWxpbmUpIEJJT19wdXRzKG91dCwgIlxuIik7CisJCVg1MDlfTkFNRV9wcmludF9leChvdXQsIG5tLCBpbmRlbnQsIGxmbGFncyk7CisJCUJJT19wdXRzKG91dCwgIlxuIik7CisJfQorfQorCitYNTA5X1NUT1JFICpzZXR1cF92ZXJpZnkoQklPICpicCwgY2hhciAqQ0FmaWxlLCBjaGFyICpDQXBhdGgpCit7CisJWDUwOV9TVE9SRSAqc3RvcmU7CisJWDUwOV9MT09LVVAgKmxvb2t1cDsKKwlpZighKHN0b3JlID0gWDUwOV9TVE9SRV9uZXcoKSkpIGdvdG8gZW5kOworCWxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoc3RvcmUsWDUwOV9MT09LVVBfZmlsZSgpKTsKKwlpZiAobG9va3VwID09IE5VTEwpIGdvdG8gZW5kOworCWlmIChDQWZpbGUpIHsKKwkJaWYoIVg1MDlfTE9PS1VQX2xvYWRfZmlsZShsb29rdXAsQ0FmaWxlLFg1MDlfRklMRVRZUEVfUEVNKSkgeworCQkJQklPX3ByaW50ZihicCwgIkVycm9yIGxvYWRpbmcgZmlsZSAlc1xuIiwgQ0FmaWxlKTsKKwkJCWdvdG8gZW5kOworCQl9CisJfSBlbHNlIFg1MDlfTE9PS1VQX2xvYWRfZmlsZShsb29rdXAsTlVMTCxYNTA5X0ZJTEVUWVBFX0RFRkFVTFQpOworCQkKKwlsb29rdXA9WDUwOV9TVE9SRV9hZGRfbG9va3VwKHN0b3JlLFg1MDlfTE9PS1VQX2hhc2hfZGlyKCkpOworCWlmIChsb29rdXAgPT0gTlVMTCkgZ290byBlbmQ7CisJaWYgKENBcGF0aCkgeworCQlpZighWDUwOV9MT09LVVBfYWRkX2Rpcihsb29rdXAsQ0FwYXRoLFg1MDlfRklMRVRZUEVfUEVNKSkgeworCQkJQklPX3ByaW50ZihicCwgIkVycm9yIGxvYWRpbmcgZGlyZWN0b3J5ICVzXG4iLCBDQXBhdGgpOworCQkJZ290byBlbmQ7CisJCX0KKwl9IGVsc2UgWDUwOV9MT09LVVBfYWRkX2Rpcihsb29rdXAsTlVMTCxYNTA5X0ZJTEVUWVBFX0RFRkFVTFQpOworCisJRVJSX2NsZWFyX2Vycm9yKCk7CisJcmV0dXJuIHN0b3JlOworCWVuZDoKKwlYNTA5X1NUT1JFX2ZyZWUoc3RvcmUpOworCXJldHVybiBOVUxMOworfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisvKiBUcnkgdG8gbG9hZCBhbiBlbmdpbmUgaW4gYSBzaGFyZWFibGUgbGlicmFyeSAqLworc3RhdGljIEVOR0lORSAqdHJ5X2xvYWRfZW5naW5lKEJJTyAqZXJyLCBjb25zdCBjaGFyICplbmdpbmUsIGludCBkZWJ1ZykKKwl7CisJRU5HSU5FICplID0gRU5HSU5FX2J5X2lkKCJkeW5hbWljIik7CisJaWYgKGUpCisJCXsKKwkJaWYgKCFFTkdJTkVfY3RybF9jbWRfc3RyaW5nKGUsICJTT19QQVRIIiwgZW5naW5lLCAwKQorCQkJfHwgIUVOR0lORV9jdHJsX2NtZF9zdHJpbmcoZSwgIkxPQUQiLCBOVUxMLCAwKSkKKwkJCXsKKwkJCUVOR0lORV9mcmVlKGUpOworCQkJZSA9IE5VTEw7CisJCQl9CisJCX0KKwlyZXR1cm4gZTsKKwl9CisKK0VOR0lORSAqc2V0dXBfZW5naW5lKEJJTyAqZXJyLCBjb25zdCBjaGFyICplbmdpbmUsIGludCBkZWJ1ZykKKyAgICAgICAgeworICAgICAgICBFTkdJTkUgKmUgPSBOVUxMOworCisgICAgICAgIGlmIChlbmdpbmUpCisgICAgICAgICAgICAgICAgeworCQlpZihzdHJjbXAoZW5naW5lLCAiYXV0byIpID09IDApCisJCQl7CisJCQlCSU9fcHJpbnRmKGVyciwiZW5hYmxpbmcgYXV0byBFTkdJTkUgc3VwcG9ydFxuIik7CisJCQlFTkdJTkVfcmVnaXN0ZXJfYWxsX2NvbXBsZXRlKCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJaWYoKGUgPSBFTkdJTkVfYnlfaWQoZW5naW5lKSkgPT0gTlVMTAorCQkJJiYgKGUgPSB0cnlfbG9hZF9lbmdpbmUoZXJyLCBlbmdpbmUsIGRlYnVnKSkgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoZXJyLCJpbnZhbGlkIGVuZ2luZSBcIiVzXCJcbiIsIGVuZ2luZSk7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGVycik7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJaWYgKGRlYnVnKQorCQkJeworCQkJRU5HSU5FX2N0cmwoZSwgRU5HSU5FX0NUUkxfU0VUX0xPR1NUUkVBTSwKKwkJCQkwLCBlcnIsIDApOworCQkJfQorICAgICAgICAgICAgICAgIEVOR0lORV9jdHJsX2NtZChlLCAiU0VUX1VTRVJfSU5URVJGQUNFIiwgMCwgdWlfbWV0aG9kLCAwLCAxKTsKKwkJaWYoIUVOR0lORV9zZXRfZGVmYXVsdChlLCBFTkdJTkVfTUVUSE9EX0FMTCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGVyciwiY2FuJ3QgdXNlIHRoYXQgZW5naW5lXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoZXJyKTsKKwkJCUVOR0lORV9mcmVlKGUpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisKKwkJQklPX3ByaW50ZihlcnIsImVuZ2luZSBcIiVzXCIgc2V0LlxuIiwgRU5HSU5FX2dldF9pZChlKSk7CisKKwkJLyogRnJlZSBvdXIgInN0cnVjdHVyYWwiIHJlZmVyZW5jZS4gKi8KKwkJRU5HSU5FX2ZyZWUoZSk7CisJCX0KKyAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIH0KKyNlbmRpZgorCitpbnQgbG9hZF9jb25maWcoQklPICplcnIsIENPTkYgKmNuZikKKwl7CisJc3RhdGljIGludCBsb2FkX2NvbmZpZ19jYWxsZWQgPSAwOworCWlmIChsb2FkX2NvbmZpZ19jYWxsZWQpCisJCXJldHVybiAxOworCWxvYWRfY29uZmlnX2NhbGxlZCA9IDE7CisJaWYgKCFjbmYpCisJCWNuZiA9IGNvbmZpZzsKKwlpZiAoIWNuZikKKwkJcmV0dXJuIDE7CisKKwlPUEVOU1NMX2xvYWRfYnVpbHRpbl9tb2R1bGVzKCk7CisKKwlpZiAoQ09ORl9tb2R1bGVzX2xvYWQoY25mLCBOVUxMLCAwKSA8PSAwKQorCQl7CisJCUJJT19wcmludGYoZXJyLCAiRXJyb3IgY29uZmlndXJpbmcgT3BlblNTTFxuIik7CisJCUVSUl9wcmludF9lcnJvcnMoZXJyKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2NoYXIgKm1ha2VfY29uZmlnX25hbWUoKQorCXsKKwljb25zdCBjaGFyICp0PVg1MDlfZ2V0X2RlZmF1bHRfY2VydF9hcmVhKCk7CisJc2l6ZV90IGxlbjsKKwljaGFyICpwOworCisJbGVuPXN0cmxlbih0KStzdHJsZW4oT1BFTlNTTF9DT05GKSsyOworCXA9T1BFTlNTTF9tYWxsb2MobGVuKTsKKwlCVUZfc3RybGNweShwLHQsbGVuKTsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisJQlVGX3N0cmxjYXQocCwiLyIsbGVuKTsKKyNlbmRpZgorCUJVRl9zdHJsY2F0KHAsT1BFTlNTTF9DT05GLGxlbik7CisKKwlyZXR1cm4gcDsKKwl9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluZGV4X3NlcmlhbF9oYXNoKGNvbnN0IE9QRU5TU0xfQ1NUUklORyAqYSkKKwl7CisJY29uc3QgY2hhciAqbjsKKworCW49YVtEQl9zZXJpYWxdOworCXdoaWxlICgqbiA9PSAnMCcpIG4rKzsKKwlyZXR1cm4obGhfc3RyaGFzaChuKSk7CisJfQorCitzdGF0aWMgaW50IGluZGV4X3NlcmlhbF9jbXAoY29uc3QgT1BFTlNTTF9DU1RSSU5HICphLCBjb25zdCBPUEVOU1NMX0NTVFJJTkcgKmIpCisJeworCWNvbnN0IGNoYXIgKmFhLCpiYjsKKworCWZvciAoYWE9YVtEQl9zZXJpYWxdOyAqYWEgPT0gJzAnOyBhYSsrKTsKKwlmb3IgKGJiPWJbREJfc2VyaWFsXTsgKmJiID09ICcwJzsgYmIrKyk7CisJcmV0dXJuKHN0cmNtcChhYSxiYikpOworCX0KKworc3RhdGljIGludCBpbmRleF9uYW1lX3F1YWwoY2hhciAqKmEpCisJeyByZXR1cm4oYVswXVswXSA9PSAnVicpOyB9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluZGV4X25hbWVfaGFzaChjb25zdCBPUEVOU1NMX0NTVFJJTkcgKmEpCisJeyByZXR1cm4obGhfc3RyaGFzaChhW0RCX25hbWVdKSk7IH0KKworaW50IGluZGV4X25hbWVfY21wKGNvbnN0IE9QRU5TU0xfQ1NUUklORyAqYSwgY29uc3QgT1BFTlNTTF9DU1RSSU5HICpiKQorCXsgcmV0dXJuKHN0cmNtcChhW0RCX25hbWVdLCBiW0RCX25hbWVdKSk7IH0KKworc3RhdGljIElNUExFTUVOVF9MSEFTSF9IQVNIX0ZOKGluZGV4X3NlcmlhbCwgT1BFTlNTTF9DU1RSSU5HKQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9DT01QX0ZOKGluZGV4X3NlcmlhbCwgT1BFTlNTTF9DU1RSSU5HKQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9IQVNIX0ZOKGluZGV4X25hbWUsIE9QRU5TU0xfQ1NUUklORykKK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfQ09NUF9GTihpbmRleF9uYW1lLCBPUEVOU1NMX0NTVFJJTkcpCisKKyN1bmRlZiBCU0laRQorI2RlZmluZSBCU0laRSAyNTYKKworQklHTlVNICpsb2FkX3NlcmlhbChjaGFyICpzZXJpYWxmaWxlLCBpbnQgY3JlYXRlLCBBU04xX0lOVEVHRVIgKipyZXRhaSkKKwl7CisJQklPICppbj1OVUxMOworCUJJR05VTSAqcmV0PU5VTEw7CisJTVNfU1RBVElDIGNoYXIgYnVmWzEwMjRdOworCUFTTjFfSU5URUdFUiAqYWk9TlVMTDsKKworCWFpPUFTTjFfSU5URUdFUl9uZXcoKTsKKwlpZiAoYWkgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoKGluPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLHNlcmlhbGZpbGUpIDw9IDApCisJCXsKKwkJaWYgKCFjcmVhdGUpCisJCQl7CisJCQlwZXJyb3Ioc2VyaWFsZmlsZSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJcmV0PUJOX25ldygpOworCQkJaWYgKHJldCA9PSBOVUxMIHx8ICFyYW5kX3NlcmlhbChyZXQsIGFpKSkKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIWEyaV9BU04xX0lOVEVHRVIoaW4sYWksYnVmLDEwMjQpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gbG9hZCBudW1iZXIgZnJvbSAlc1xuIiwKKwkJCQlzZXJpYWxmaWxlKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlyZXQ9QVNOMV9JTlRFR0VSX3RvX0JOKGFpLE5VTEwpOworCQlpZiAocmV0ID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIGNvbnZlcnRpbmcgbnVtYmVyIGZyb20gYmluIHRvIEJJR05VTVxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJaWYgKHJldCAmJiByZXRhaSkKKwkJeworCQkqcmV0YWkgPSBhaTsKKwkJYWkgPSBOVUxMOworCQl9CisgZXJyOgorCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJaWYgKGFpICE9IE5VTEwpIEFTTjFfSU5URUdFUl9mcmVlKGFpKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBzYXZlX3NlcmlhbChjaGFyICpzZXJpYWxmaWxlLCBjaGFyICpzdWZmaXgsIEJJR05VTSAqc2VyaWFsLCBBU04xX0lOVEVHRVIgKipyZXRhaSkKKwl7CisJY2hhciBidWZbMV1bQlNJWkVdOworCUJJTyAqb3V0ID0gTlVMTDsKKwlpbnQgcmV0PTA7CisJQVNOMV9JTlRFR0VSICphaT1OVUxMOworCWludCBqOworCisJaWYgKHN1ZmZpeCA9PSBOVUxMKQorCQlqID0gc3RybGVuKHNlcmlhbGZpbGUpOworCWVsc2UKKwkJaiA9IHN0cmxlbihzZXJpYWxmaWxlKSArIHN0cmxlbihzdWZmaXgpICsgMTsKKwlpZiAoaiA+PSBCU0laRSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImZpbGUgbmFtZSB0b28gbG9uZ1xuIik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoc3VmZml4ID09IE5VTEwpCisJCUJVRl9zdHJsY3B5KGJ1ZlswXSwgc2VyaWFsZmlsZSwgQlNJWkUpOworCWVsc2UKKwkJeworI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJaiA9IEJJT19zbnByaW50ZihidWZbMF0sIHNpemVvZiBidWZbMF0sICIlcy4lcyIsIHNlcmlhbGZpbGUsIHN1ZmZpeCk7CisjZWxzZQorCQlqID0gQklPX3NucHJpbnRmKGJ1ZlswXSwgc2l6ZW9mIGJ1ZlswXSwgIiVzLSVzIiwgc2VyaWFsZmlsZSwgc3VmZml4KTsKKyNlbmRpZgorCQl9CisjaWZkZWYgUkxfREVCVUcKKwlCSU9fcHJpbnRmKGJpb19lcnIsICJERUJVRzogd3JpdGluZyBcIiVzXCJcbiIsIGJ1ZlswXSk7CisjZW5kaWYKKwlvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChvdXQgPT0gTlVMTCkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChCSU9fd3JpdGVfZmlsZW5hbWUob3V0LGJ1ZlswXSkgPD0gMCkKKwkJeworCQlwZXJyb3Ioc2VyaWFsZmlsZSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoKGFpPUJOX3RvX0FTTjFfSU5URUdFUihzZXJpYWwsTlVMTCkpID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciBjb252ZXJ0aW5nIHNlcmlhbCB0byBBU04uMSBmb3JtYXRcbiIpOworCQlnb3RvIGVycjsKKwkJfQorCWkyYV9BU04xX0lOVEVHRVIob3V0LGFpKTsKKwlCSU9fcHV0cyhvdXQsIlxuIik7CisJcmV0PTE7CisJaWYgKHJldGFpKQorCQl7CisJCSpyZXRhaSA9IGFpOworCQlhaSA9IE5VTEw7CisJCX0KK2VycjoKKwlpZiAob3V0ICE9IE5VTEwpIEJJT19mcmVlX2FsbChvdXQpOworCWlmIChhaSAhPSBOVUxMKSBBU04xX0lOVEVHRVJfZnJlZShhaSk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgcm90YXRlX3NlcmlhbChjaGFyICpzZXJpYWxmaWxlLCBjaGFyICpuZXdfc3VmZml4LCBjaGFyICpvbGRfc3VmZml4KQorCXsKKwljaGFyIGJ1Zls1XVtCU0laRV07CisJaW50IGksajsKKworCWkgPSBzdHJsZW4oc2VyaWFsZmlsZSkgKyBzdHJsZW4ob2xkX3N1ZmZpeCk7CisJaiA9IHN0cmxlbihzZXJpYWxmaWxlKSArIHN0cmxlbihuZXdfc3VmZml4KTsKKwlpZiAoaSA+IGopIGogPSBpOworCWlmIChqICsgMSA+PSBCU0laRSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImZpbGUgbmFtZSB0b28gbG9uZ1xuIik7CisJCWdvdG8gZXJyOworCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisJaiA9IEJJT19zbnByaW50ZihidWZbMF0sIHNpemVvZiBidWZbMF0sICIlcy4lcyIsCisJCXNlcmlhbGZpbGUsIG5ld19zdWZmaXgpOworI2Vsc2UKKwlqID0gQklPX3NucHJpbnRmKGJ1ZlswXSwgc2l6ZW9mIGJ1ZlswXSwgIiVzLSVzIiwKKwkJc2VyaWFsZmlsZSwgbmV3X3N1ZmZpeCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisJaiA9IEJJT19zbnByaW50ZihidWZbMV0sIHNpemVvZiBidWZbMV0sICIlcy4lcyIsCisJCXNlcmlhbGZpbGUsIG9sZF9zdWZmaXgpOworI2Vsc2UKKwlqID0gQklPX3NucHJpbnRmKGJ1ZlsxXSwgc2l6ZW9mIGJ1ZlsxXSwgIiVzLSVzIiwKKwkJc2VyaWFsZmlsZSwgb2xkX3N1ZmZpeCk7CisjZW5kaWYKKyNpZmRlZiBSTF9ERUJVRworCUJJT19wcmludGYoYmlvX2VyciwgIkRFQlVHOiByZW5hbWluZyBcIiVzXCIgdG8gXCIlc1wiXG4iLAorCQlzZXJpYWxmaWxlLCBidWZbMV0pOworI2VuZGlmCisJaWYgKHJlbmFtZShzZXJpYWxmaWxlLGJ1ZlsxXSkgPCAwICYmIGVycm5vICE9IEVOT0VOVAorI2lmZGVmIEVOT1RESVIKKwkJCSYmIGVycm5vICE9IEVOT1RESVIKKyNlbmRpZgorCSAgICkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkidW5hYmxlIHRvIHJlbmFtZSAlcyB0byAlc1xuIiwKKwkJCQlzZXJpYWxmaWxlLCBidWZbMV0pOworCQkJcGVycm9yKCJyZWFzb24iKTsKKwkJCWdvdG8gZXJyOworCQkJfQorI2lmZGVmIFJMX0RFQlVHCisJQklPX3ByaW50ZihiaW9fZXJyLCAiREVCVUc6IHJlbmFtaW5nIFwiJXNcIiB0byBcIiVzXCJcbiIsCisJCWJ1ZlswXSxzZXJpYWxmaWxlKTsKKyNlbmRpZgorCWlmIChyZW5hbWUoYnVmWzBdLHNlcmlhbGZpbGUpIDwgMCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkidW5hYmxlIHRvIHJlbmFtZSAlcyB0byAlc1xuIiwKKwkJCWJ1ZlswXSxzZXJpYWxmaWxlKTsKKwkJcGVycm9yKCJyZWFzb24iKTsKKwkJcmVuYW1lKGJ1ZlsxXSxzZXJpYWxmaWxlKTsKKwkJZ290byBlcnI7CisJCX0KKwlyZXR1cm4gMTsKKyBlcnI6CisJcmV0dXJuIDA7CisJfQorCitpbnQgcmFuZF9zZXJpYWwoQklHTlVNICpiLCBBU04xX0lOVEVHRVIgKmFpKQorCXsKKwlCSUdOVU0gKmJ0bXA7CisJaW50IHJldCA9IDA7CisJaWYgKGIpCisJCWJ0bXAgPSBiOworCWVsc2UKKwkJYnRtcCA9IEJOX25ldygpOworCisJaWYgKCFidG1wKQorCQlyZXR1cm4gMDsKKworCWlmICghQk5fcHNldWRvX3JhbmQoYnRtcCwgU0VSSUFMX1JBTkRfQklUUywgMCwgMCkpCisJCWdvdG8gZXJyb3I7CisJaWYgKGFpICYmICFCTl90b19BU04xX0lOVEVHRVIoYnRtcCwgYWkpKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gMTsKKwkKKwllcnJvcjoKKworCWlmICghYikKKwkJQk5fZnJlZShidG1wKTsKKwkKKwlyZXR1cm4gcmV0OworCX0KKworQ0FfREIgKmxvYWRfaW5kZXgoY2hhciAqZGJmaWxlLCBEQl9BVFRSICpkYl9hdHRyKQorCXsKKwlDQV9EQiAqcmV0ZGIgPSBOVUxMOworCVRYVF9EQiAqdG1wZGIgPSBOVUxMOworCUJJTyAqaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJQ09ORiAqZGJhdHRyX2NvbmYgPSBOVUxMOworCWNoYXIgYnVmWzFdW0JTSVpFXTsKKwlsb25nIGVycm9ybGluZT0gLTE7CisKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChCSU9fcmVhZF9maWxlbmFtZShpbixkYmZpbGUpIDw9IDApCisJCXsKKwkJcGVycm9yKGRiZmlsZSk7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIG9wZW4gJyVzJ1xuIixkYmZpbGUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmICgodG1wZGIgPSBUWFRfREJfcmVhZChpbixEQl9OVU1CRVIpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKwlCSU9fc25wcmludGYoYnVmWzBdLCBzaXplb2YgYnVmWzBdLCAiJXMuYXR0ciIsIGRiZmlsZSk7CisjZWxzZQorCUJJT19zbnByaW50ZihidWZbMF0sIHNpemVvZiBidWZbMF0sICIlcy1hdHRyIiwgZGJmaWxlKTsKKyNlbmRpZgorCWRiYXR0cl9jb25mID0gTkNPTkZfbmV3KE5VTEwpOworCWlmIChOQ09ORl9sb2FkKGRiYXR0cl9jb25mLGJ1ZlswXSwmZXJyb3JsaW5lKSA8PSAwKQorCQl7CisJCWlmIChlcnJvcmxpbmUgPiAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSJlcnJvciBvbiBsaW5lICVsZCBvZiBkYiBhdHRyaWJ1dGUgZmlsZSAnJXMnXG4iCisJCQkJLGVycm9ybGluZSxidWZbMF0pOworCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCU5DT05GX2ZyZWUoZGJhdHRyX2NvbmYpOworCQkJZGJhdHRyX2NvbmYgPSBOVUxMOworCQkJfQorCQl9CisKKwlpZiAoKHJldGRiID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENBX0RCKSkpID09IE5VTEwpCisJCXsKKwkJZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlcnI7CisJCX0KKworCXJldGRiLT5kYiA9IHRtcGRiOworCXRtcGRiID0gTlVMTDsKKwlpZiAoZGJfYXR0cikKKwkJcmV0ZGItPmF0dHJpYnV0ZXMgPSAqZGJfYXR0cjsKKwllbHNlCisJCXsKKwkJcmV0ZGItPmF0dHJpYnV0ZXMudW5pcXVlX3N1YmplY3QgPSAxOworCQl9CisKKwlpZiAoZGJhdHRyX2NvbmYpCisJCXsKKwkJY2hhciAqcCA9IE5DT05GX2dldF9zdHJpbmcoZGJhdHRyX2NvbmYsTlVMTCwidW5pcXVlX3N1YmplY3QiKTsKKwkJaWYgKHApCisJCQl7CisjaWZkZWYgUkxfREVCVUcKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkRFQlVHW2xvYWRfaW5kZXhdOiB1bmlxdWVfc3ViamVjdCA9IFwiJXNcIlxuIiwgcCk7CisjZW5kaWYKKwkJCXJldGRiLT5hdHRyaWJ1dGVzLnVuaXF1ZV9zdWJqZWN0ID0gcGFyc2VfeWVzbm8ocCwxKTsKKwkJCX0KKwkJfQorCisgZXJyOgorCWlmIChkYmF0dHJfY29uZikgTkNPTkZfZnJlZShkYmF0dHJfY29uZik7CisJaWYgKHRtcGRiKSBUWFRfREJfZnJlZSh0bXBkYik7CisJaWYgKGluKSBCSU9fZnJlZV9hbGwoaW4pOworCXJldHVybiByZXRkYjsKKwl9CisKK2ludCBpbmRleF9pbmRleChDQV9EQiAqZGIpCisJeworCWlmICghVFhUX0RCX2NyZWF0ZV9pbmRleChkYi0+ZGIsIERCX3NlcmlhbCwgTlVMTCwKKwkJCQlMSEFTSF9IQVNIX0ZOKGluZGV4X3NlcmlhbCksCisJCQkJTEhBU0hfQ09NUF9GTihpbmRleF9zZXJpYWwpKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCSAgImVycm9yIGNyZWF0aW5nIHNlcmlhbCBudW1iZXIgaW5kZXg6KCVsZCwlbGQsJWxkKVxuIiwKKwkJICAJCQlkYi0+ZGItPmVycm9yLGRiLT5kYi0+YXJnMSxkYi0+ZGItPmFyZzIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCWlmIChkYi0+YXR0cmlidXRlcy51bmlxdWVfc3ViamVjdAorCQkmJiAhVFhUX0RCX2NyZWF0ZV9pbmRleChkYi0+ZGIsIERCX25hbWUsIGluZGV4X25hbWVfcXVhbCwKKwkJCUxIQVNIX0hBU0hfRk4oaW5kZXhfbmFtZSksCisJCQlMSEFTSF9DT01QX0ZOKGluZGV4X25hbWUpKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIGNyZWF0aW5nIG5hbWUgaW5kZXg6KCVsZCwlbGQsJWxkKVxuIiwKKwkJCWRiLT5kYi0+ZXJyb3IsZGItPmRiLT5hcmcxLGRiLT5kYi0+YXJnMik7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCitpbnQgc2F2ZV9pbmRleChjb25zdCBjaGFyICpkYmZpbGUsIGNvbnN0IGNoYXIgKnN1ZmZpeCwgQ0FfREIgKmRiKQorCXsKKwljaGFyIGJ1ZlszXVtCU0laRV07CisJQklPICpvdXQgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaW50IGo7CisKKwlpZiAob3V0ID09IE5VTEwpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlcnI7CisJCX0KKworCWogPSBzdHJsZW4oZGJmaWxlKSArIHN0cmxlbihzdWZmaXgpOworCWlmIChqICsgNiA+PSBCU0laRSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImZpbGUgbmFtZSB0b28gbG9uZ1xuIik7CisJCWdvdG8gZXJyOworCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisJaiA9IEJJT19zbnByaW50ZihidWZbMl0sIHNpemVvZiBidWZbMl0sICIlcy5hdHRyIiwgZGJmaWxlKTsKKyNlbHNlCisJaiA9IEJJT19zbnByaW50ZihidWZbMl0sIHNpemVvZiBidWZbMl0sICIlcy1hdHRyIiwgZGJmaWxlKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKwlqID0gQklPX3NucHJpbnRmKGJ1ZlsxXSwgc2l6ZW9mIGJ1ZlsxXSwgIiVzLmF0dHIuJXMiLCBkYmZpbGUsIHN1ZmZpeCk7CisjZWxzZQorCWogPSBCSU9fc25wcmludGYoYnVmWzFdLCBzaXplb2YgYnVmWzFdLCAiJXMtYXR0ci0lcyIsIGRiZmlsZSwgc3VmZml4KTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKwlqID0gQklPX3NucHJpbnRmKGJ1ZlswXSwgc2l6ZW9mIGJ1ZlswXSwgIiVzLiVzIiwgZGJmaWxlLCBzdWZmaXgpOworI2Vsc2UKKwlqID0gQklPX3NucHJpbnRmKGJ1ZlswXSwgc2l6ZW9mIGJ1ZlswXSwgIiVzLSVzIiwgZGJmaWxlLCBzdWZmaXgpOworI2VuZGlmCisjaWZkZWYgUkxfREVCVUcKKwlCSU9fcHJpbnRmKGJpb19lcnIsICJERUJVRzogd3JpdGluZyBcIiVzXCJcbiIsIGJ1ZlswXSk7CisjZW5kaWYKKwlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxidWZbMF0pIDw9IDApCisJCXsKKwkJcGVycm9yKGRiZmlsZSk7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIG9wZW4gJyVzJ1xuIiwgZGJmaWxlKTsKKwkJZ290byBlcnI7CisJCX0KKwlqPVRYVF9EQl93cml0ZShvdXQsZGItPmRiKTsKKwlpZiAoaiA8PSAwKSBnb3RvIGVycjsKKwkJCQorCUJJT19mcmVlKG91dCk7CisKKwlvdXQgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisjaWZkZWYgUkxfREVCVUcKKwlCSU9fcHJpbnRmKGJpb19lcnIsICJERUJVRzogd3JpdGluZyBcIiVzXCJcbiIsIGJ1ZlsxXSk7CisjZW5kaWYKKwlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxidWZbMV0pIDw9IDApCisJCXsKKwkJcGVycm9yKGJ1ZlsyXSk7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIG9wZW4gJyVzJ1xuIiwgYnVmWzJdKTsKKwkJZ290byBlcnI7CisJCX0KKwlCSU9fcHJpbnRmKG91dCwidW5pcXVlX3N1YmplY3QgPSAlc1xuIiwKKwkJZGItPmF0dHJpYnV0ZXMudW5pcXVlX3N1YmplY3QgPyAieWVzIiA6ICJubyIpOworCUJJT19mcmVlKG91dCk7CisKKwlyZXR1cm4gMTsKKyBlcnI6CisJcmV0dXJuIDA7CisJfQorCitpbnQgcm90YXRlX2luZGV4KGNvbnN0IGNoYXIgKmRiZmlsZSwgY29uc3QgY2hhciAqbmV3X3N1ZmZpeCwgY29uc3QgY2hhciAqb2xkX3N1ZmZpeCkKKwl7CisJY2hhciBidWZbNV1bQlNJWkVdOworCWludCBpLGo7CisKKwlpID0gc3RybGVuKGRiZmlsZSkgKyBzdHJsZW4ob2xkX3N1ZmZpeCk7CisJaiA9IHN0cmxlbihkYmZpbGUpICsgc3RybGVuKG5ld19zdWZmaXgpOworCWlmIChpID4gaikgaiA9IGk7CisJaWYgKGogKyA2ID49IEJTSVpFKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiZmlsZSBuYW1lIHRvbyBsb25nXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKwlqID0gQklPX3NucHJpbnRmKGJ1Zls0XSwgc2l6ZW9mIGJ1Zls0XSwgIiVzLmF0dHIiLCBkYmZpbGUpOworI2Vsc2UKKwlqID0gQklPX3NucHJpbnRmKGJ1Zls0XSwgc2l6ZW9mIGJ1Zls0XSwgIiVzLWF0dHIiLCBkYmZpbGUpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfU1lTX1ZNUworCWogPSBCSU9fc25wcmludGYoYnVmWzJdLCBzaXplb2YgYnVmWzJdLCAiJXMuYXR0ci4lcyIsCisJCWRiZmlsZSwgbmV3X3N1ZmZpeCk7CisjZWxzZQorCWogPSBCSU9fc25wcmludGYoYnVmWzJdLCBzaXplb2YgYnVmWzJdLCAiJXMtYXR0ci0lcyIsCisJCWRiZmlsZSwgbmV3X3N1ZmZpeCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisJaiA9IEJJT19zbnByaW50ZihidWZbMF0sIHNpemVvZiBidWZbMF0sICIlcy4lcyIsCisJCWRiZmlsZSwgbmV3X3N1ZmZpeCk7CisjZWxzZQorCWogPSBCSU9fc25wcmludGYoYnVmWzBdLCBzaXplb2YgYnVmWzBdLCAiJXMtJXMiLAorCQlkYmZpbGUsIG5ld19zdWZmaXgpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfU1lTX1ZNUworCWogPSBCSU9fc25wcmludGYoYnVmWzFdLCBzaXplb2YgYnVmWzFdLCAiJXMuJXMiLAorCQlkYmZpbGUsIG9sZF9zdWZmaXgpOworI2Vsc2UKKwlqID0gQklPX3NucHJpbnRmKGJ1ZlsxXSwgc2l6ZW9mIGJ1ZlsxXSwgIiVzLSVzIiwKKwkJZGJmaWxlLCBvbGRfc3VmZml4KTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKwlqID0gQklPX3NucHJpbnRmKGJ1ZlszXSwgc2l6ZW9mIGJ1ZlszXSwgIiVzLmF0dHIuJXMiLAorCQlkYmZpbGUsIG9sZF9zdWZmaXgpOworI2Vsc2UKKwlqID0gQklPX3NucHJpbnRmKGJ1ZlszXSwgc2l6ZW9mIGJ1ZlszXSwgIiVzLWF0dHItJXMiLAorCQlkYmZpbGUsIG9sZF9zdWZmaXgpOworI2VuZGlmCisjaWZkZWYgUkxfREVCVUcKKwlCSU9fcHJpbnRmKGJpb19lcnIsICJERUJVRzogcmVuYW1pbmcgXCIlc1wiIHRvIFwiJXNcIlxuIiwKKwkJZGJmaWxlLCBidWZbMV0pOworI2VuZGlmCisJaWYgKHJlbmFtZShkYmZpbGUsYnVmWzFdKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UCisjaWZkZWYgRU5PVERJUgorCQkmJiBlcnJubyAhPSBFTk9URElSCisjZW5kaWYKKwkgICApCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJInVuYWJsZSB0byByZW5hbWUgJXMgdG8gJXNcbiIsCisJCQkJZGJmaWxlLCBidWZbMV0pOworCQkJcGVycm9yKCJyZWFzb24iKTsKKwkJCWdvdG8gZXJyOworCQkJfQorI2lmZGVmIFJMX0RFQlVHCisJQklPX3ByaW50ZihiaW9fZXJyLCAiREVCVUc6IHJlbmFtaW5nIFwiJXNcIiB0byBcIiVzXCJcbiIsCisJCWJ1ZlswXSxkYmZpbGUpOworI2VuZGlmCisJaWYgKHJlbmFtZShidWZbMF0sZGJmaWxlKSA8IDApCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJInVuYWJsZSB0byByZW5hbWUgJXMgdG8gJXNcbiIsCisJCQlidWZbMF0sZGJmaWxlKTsKKwkJcGVycm9yKCJyZWFzb24iKTsKKwkJcmVuYW1lKGJ1ZlsxXSxkYmZpbGUpOworCQlnb3RvIGVycjsKKwkJfQorI2lmZGVmIFJMX0RFQlVHCisJQklPX3ByaW50ZihiaW9fZXJyLCAiREVCVUc6IHJlbmFtaW5nIFwiJXNcIiB0byBcIiVzXCJcbiIsCisJCWJ1Zls0XSxidWZbM10pOworI2VuZGlmCisJaWYgKHJlbmFtZShidWZbNF0sYnVmWzNdKSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UCisjaWZkZWYgRU5PVERJUgorCQkmJiBlcnJubyAhPSBFTk9URElSCisjZW5kaWYKKwkgICApCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJInVuYWJsZSB0byByZW5hbWUgJXMgdG8gJXNcbiIsCisJCQkJYnVmWzRdLCBidWZbM10pOworCQkJcGVycm9yKCJyZWFzb24iKTsKKwkJCXJlbmFtZShkYmZpbGUsYnVmWzBdKTsKKwkJCXJlbmFtZShidWZbMV0sZGJmaWxlKTsKKwkJCWdvdG8gZXJyOworCQkJfQorI2lmZGVmIFJMX0RFQlVHCisJQklPX3ByaW50ZihiaW9fZXJyLCAiREVCVUc6IHJlbmFtaW5nIFwiJXNcIiB0byBcIiVzXCJcbiIsCisJCWJ1ZlsyXSxidWZbNF0pOworI2VuZGlmCisJaWYgKHJlbmFtZShidWZbMl0sYnVmWzRdKSA8IDApCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJInVuYWJsZSB0byByZW5hbWUgJXMgdG8gJXNcbiIsCisJCQlidWZbMl0sYnVmWzRdKTsKKwkJcGVycm9yKCJyZWFzb24iKTsKKwkJcmVuYW1lKGJ1ZlszXSxidWZbNF0pOworCQlyZW5hbWUoZGJmaWxlLGJ1ZlswXSk7CisJCXJlbmFtZShidWZbMV0sZGJmaWxlKTsKKwkJZ290byBlcnI7CisJCX0KKwlyZXR1cm4gMTsKKyBlcnI6CisJcmV0dXJuIDA7CisJfQorCit2b2lkIGZyZWVfaW5kZXgoQ0FfREIgKmRiKQorCXsKKwlpZiAoZGIpCisJCXsKKwkJaWYgKGRiLT5kYikgVFhUX0RCX2ZyZWUoZGItPmRiKTsKKwkJT1BFTlNTTF9mcmVlKGRiKTsKKwkJfQorCX0KKworaW50IHBhcnNlX3llc25vKGNvbnN0IGNoYXIgKnN0ciwgaW50IGRlZikKKwl7CisJaW50IHJldCA9IGRlZjsKKwlpZiAoc3RyKQorCQl7CisJCXN3aXRjaCAoKnN0cikKKwkJCXsKKwkJY2FzZSAnZic6IC8qIGZhbHNlICovCisJCWNhc2UgJ0YnOiAvKiBGQUxTRSAqLworCQljYXNlICduJzogLyogbm8gKi8KKwkJY2FzZSAnTic6IC8qIE5PICovCisJCWNhc2UgJzAnOiAvKiAwICovCisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOiAvKiB0cnVlICovCisJCWNhc2UgJ1QnOiAvKiBUUlVFICovCisJCWNhc2UgJ3knOiAvKiB5ZXMgKi8KKwkJY2FzZSAnWSc6IC8qIFlFUyAqLworCQljYXNlICcxJzogLyogMSAqLworCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gZGVmOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworLyoKKyAqIHN1YmplY3QgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGZvcm1hdCAvdHlwZTA9dmFsdWUwL3R5cGUxPXZhbHVlMS90eXBlMj0uLi4KKyAqIHdoZXJlIGNoYXJhY3RlcnMgbWF5IGJlIGVzY2FwZWQgYnkgXAorICovCitYNTA5X05BTUUgKnBhcnNlX25hbWUoY2hhciAqc3ViamVjdCwgbG9uZyBjaHR5cGUsIGludCBtdWx0aXJkbikKKwl7CisJc2l6ZV90IGJ1ZmxlbiA9IHN0cmxlbihzdWJqZWN0KSsxOyAvKiB0byBjb3B5IHRoZSB0eXBlcyBhbmQgdmFsdWVzIGludG8uIGR1ZSB0byBlc2NhcGluZywgdGhlIGNvcHkgY2FuIG9ubHkgYmVjb21lIHNob3J0ZXIgKi8KKwljaGFyICpidWYgPSBPUEVOU1NMX21hbGxvYyhidWZsZW4pOworCXNpemVfdCBtYXhfbmUgPSBidWZsZW4gLyAyICsgMTsgLyogbWF4aW11bSBudW1iZXIgb2YgbmFtZSBlbGVtZW50cyAqLworCWNoYXIgKipuZV90eXBlcyA9IE9QRU5TU0xfbWFsbG9jKG1heF9uZSAqIHNpemVvZiAoY2hhciAqKSk7CisJY2hhciAqKm5lX3ZhbHVlcyA9IE9QRU5TU0xfbWFsbG9jKG1heF9uZSAqIHNpemVvZiAoY2hhciAqKSk7CisJaW50ICptdmFsID0gT1BFTlNTTF9tYWxsb2MgKG1heF9uZSAqIHNpemVvZiAoaW50KSk7CisKKwljaGFyICpzcCA9IHN1YmplY3QsICpicCA9IGJ1ZjsKKwlpbnQgaSwgbmVfbnVtID0gMDsKKworCVg1MDlfTkFNRSAqbiA9IE5VTEw7CisJaW50IG5pZDsKKworCWlmICghYnVmIHx8ICFuZV90eXBlcyB8fCAhbmVfdmFsdWVzKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIm1hbGxvYyBlcnJvclxuIik7CisJCWdvdG8gZXJyb3I7CisJCX0JCisKKwlpZiAoKnN1YmplY3QgIT0gJy8nKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIlN1YmplY3QgZG9lcyBub3Qgc3RhcnQgd2l0aCAnLycuXG4iKTsKKwkJZ290byBlcnJvcjsKKwkJfQorCXNwKys7IC8qIHNraXAgbGVhZGluZyAvICovCisKKwkvKiBubyBtdWx0aXZhbHVlZCBSRE4gYnkgZGVmYXVsdCAqLworCW12YWxbbmVfbnVtXSA9IDA7CisKKwl3aGlsZSAoKnNwKQorCQl7CisJCS8qIGNvbGxlY3QgdHlwZSAqLworCQluZV90eXBlc1tuZV9udW1dID0gYnA7CisJCXdoaWxlICgqc3ApCisJCQl7CisJCQlpZiAoKnNwID09ICdcXCcpIC8qIGlzIHRoZXJlIGFueXRoaW5nIHRvIGVzY2FwZSBpbiB0aGUgdHlwZS4uLj8gKi8KKwkJCQl7CisJCQkJaWYgKCorK3NwKQorCQkJCQkqYnArKyA9ICpzcCsrOworCQkJCWVsc2UJCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiZXNjYXBlIGNoYXJhY3RlciBhdCBlbmQgb2Ygc3RyaW5nXG4iKTsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCX0JCisJCQllbHNlIGlmICgqc3AgPT0gJz0nKQorCQkJCXsKKwkJCQlzcCsrOworCQkJCSpicCsrID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCQl9CisJCQllbHNlCisJCQkJKmJwKysgPSAqc3ArKzsKKwkJCX0KKwkJaWYgKCEqc3ApCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJlbmQgb2Ygc3RyaW5nIGVuY291bnRlcmVkIHdoaWxlIHByb2Nlc3NpbmcgdHlwZSBvZiBzdWJqZWN0IG5hbWUgZWxlbWVudCAjJWRcbiIsIG5lX251bSk7CisJCQlnb3RvIGVycm9yOworCQkJfQorCQluZV92YWx1ZXNbbmVfbnVtXSA9IGJwOworCQl3aGlsZSAoKnNwKQorCQkJeworCQkJaWYgKCpzcCA9PSAnXFwnKQorCQkJCXsKKwkJCQlpZiAoKisrc3ApCisJCQkJCSpicCsrID0gKnNwKys7CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwgImVzY2FwZSBjaGFyYWN0ZXIgYXQgZW5kIG9mIHN0cmluZ1xuIik7CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlIGlmICgqc3AgPT0gJy8nKQorCQkJCXsKKwkJCQlzcCsrOworCQkJCS8qIG5vIG11bHRpdmFsdWVkIFJETiBieSBkZWZhdWx0ICovCisJCQkJbXZhbFtuZV9udW0rMV0gPSAwOworCQkJCWJyZWFrOworCQkJCX0KKwkJCWVsc2UgaWYgKCpzcCA9PSAnKycgJiYgbXVsdGlyZG4pCisJCQkJeworCQkJCS8qIGEgbm90IGVzY2FwZWQgKyBzaWduYWxzIGEgbXV0bGl2YWx1ZWQgUkROICovCisJCQkJc3ArKzsKKwkJCQltdmFsW25lX251bSsxXSA9IC0xOworCQkJCWJyZWFrOworCQkJCX0KKwkJCWVsc2UKKwkJCQkqYnArKyA9ICpzcCsrOworCQkJfQorCQkqYnArKyA9ICdcMCc7CisJCW5lX251bSsrOworCQl9CQorCisJaWYgKCEobiA9IFg1MDlfTkFNRV9uZXcoKSkpCisJCWdvdG8gZXJyb3I7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmVfbnVtOyBpKyspCisJCXsKKwkJaWYgKChuaWQ9T0JKX3R4dDJuaWQobmVfdHlwZXNbaV0pKSA9PSBOSURfdW5kZWYpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJTdWJqZWN0IEF0dHJpYnV0ZSAlcyBoYXMgbm8ga25vd24gTklELCBza2lwcGVkXG4iLCBuZV90eXBlc1tpXSk7CisJCQljb250aW51ZTsKKwkJCX0KKworCQlpZiAoISpuZV92YWx1ZXNbaV0pCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJObyB2YWx1ZSBwcm92aWRlZCBmb3IgU3ViamVjdCBBdHRyaWJ1dGUgJXMsIHNraXBwZWRcbiIsIG5lX3R5cGVzW2ldKTsKKwkJCWNvbnRpbnVlOworCQkJfQorCisJCWlmICghWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV9OSUQobiwgbmlkLCBjaHR5cGUsICh1bnNpZ25lZCBjaGFyKiluZV92YWx1ZXNbaV0sIC0xLC0xLG12YWxbaV0pKQorCQkJZ290byBlcnJvcjsKKwkJfQorCisJT1BFTlNTTF9mcmVlKG5lX3ZhbHVlcyk7CisJT1BFTlNTTF9mcmVlKG5lX3R5cGVzKTsKKwlPUEVOU1NMX2ZyZWUoYnVmKTsKKwlyZXR1cm4gbjsKKworZXJyb3I6CisJWDUwOV9OQU1FX2ZyZWUobik7CisJaWYgKG5lX3ZhbHVlcykKKwkJT1BFTlNTTF9mcmVlKG5lX3ZhbHVlcyk7CisJaWYgKG5lX3R5cGVzKQorCQlPUEVOU1NMX2ZyZWUobmVfdHlwZXMpOworCWlmIChidWYpCisJCU9QRU5TU0xfZnJlZShidWYpOworCXJldHVybiBOVUxMOworfQorCitpbnQgYXJnc192ZXJpZnkoY2hhciAqKipwYXJncywgaW50ICpwYXJnYywKKwkJCWludCAqYmFkYXJnLCBCSU8gKmVyciwgWDUwOV9WRVJJRllfUEFSQU0gKipwbSkKKwl7CisJQVNOMV9PQkpFQ1QgKm90bXAgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCBpOworCWludCBwdXJwb3NlID0gMCwgZGVwdGggPSAtMTsKKwljaGFyICoqb2xkYXJncyA9ICpwYXJnczsKKwljaGFyICphcmcgPSAqKnBhcmdzLCAqYXJnbiA9ICgqcGFyZ3MpWzFdOworCWlmICghc3RyY21wKGFyZywgIi1wb2xpY3kiKSkKKwkJeworCQlpZiAoIWFyZ24pCisJCQkqYmFkYXJnID0gMTsKKwkJZWxzZQorCQkJeworCQkJb3RtcCA9IE9CSl90eHQyb2JqKGFyZ24sIDApOworCQkJaWYgKCFvdG1wKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGVyciwgIkludmFsaWQgUG9saWN5IFwiJXNcIlxuIiwKKwkJCQkJCQkJCWFyZ24pOworCQkJCSpiYWRhcmcgPSAxOworCQkJCX0KKwkJCX0KKwkJKCpwYXJncykrKzsKKwkJfQorCWVsc2UgaWYgKHN0cmNtcChhcmcsIi1wdXJwb3NlIikgPT0gMCkKKwkJeworCQlYNTA5X1BVUlBPU0UgKnhwdG1wOworCQlpZiAoIWFyZ24pCisJCQkqYmFkYXJnID0gMTsKKwkJZWxzZQorCQkJeworCQkJaSA9IFg1MDlfUFVSUE9TRV9nZXRfYnlfc25hbWUoYXJnbik7CisJCQlpZihpIDwgMCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihlcnIsICJ1bnJlY29nbml6ZWQgcHVycG9zZVxuIik7CisJCQkJKmJhZGFyZyA9IDE7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQl4cHRtcCA9IFg1MDlfUFVSUE9TRV9nZXQwKGkpOworCQkJCXB1cnBvc2UgPSBYNTA5X1BVUlBPU0VfZ2V0X2lkKHhwdG1wKTsKKwkJCQl9CisJCQl9CisJCSgqcGFyZ3MpKys7CisJCX0KKwllbHNlIGlmIChzdHJjbXAoYXJnLCItdmVyaWZ5X2RlcHRoIikgPT0gMCkKKwkJeworCQlpZiAoIWFyZ24pCisJCQkqYmFkYXJnID0gMTsKKwkJZWxzZQorCQkJeworCQkJZGVwdGggPSBhdG9pKGFyZ24pOworCQkJaWYoZGVwdGggPCAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGVyciwgImludmFsaWQgZGVwdGhcbiIpOworCQkJCSpiYWRhcmcgPSAxOworCQkJCX0KKwkJCX0KKwkJKCpwYXJncykrKzsKKwkJfQorCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLWlnbm9yZV9jcml0aWNhbCIpKQorCQlmbGFncyB8PSBYNTA5X1ZfRkxBR19JR05PUkVfQ1JJVElDQUw7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItaXNzdWVyX2NoZWNrcyIpKQorCQlmbGFncyB8PSBYNTA5X1ZfRkxBR19DQl9JU1NVRVJfQ0hFQ0s7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItY3JsX2NoZWNrIikpCisJCWZsYWdzIHw9ICBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0s7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItY3JsX2NoZWNrX2FsbCIpKQorCQlmbGFncyB8PSBYNTA5X1ZfRkxBR19DUkxfQ0hFQ0t8WDUwOV9WX0ZMQUdfQ1JMX0NIRUNLX0FMTDsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi1wb2xpY3lfY2hlY2siKSkKKwkJZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfUE9MSUNZX0NIRUNLOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLWV4cGxpY2l0X3BvbGljeSIpKQorCQlmbGFncyB8PSBYNTA5X1ZfRkxBR19FWFBMSUNJVF9QT0xJQ1k7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItaW5oaWJpdF9hbnkiKSkKKwkJZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfSU5ISUJJVF9BTlk7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItaW5oaWJpdF9tYXAiKSkKKwkJZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfSU5ISUJJVF9NQVA7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICIteDUwOV9zdHJpY3QiKSkKKwkJZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfWDUwOV9TVFJJQ1Q7CisJZWxzZSBpZiAoIXN0cmNtcChhcmcsICItZXh0ZW5kZWRfY3JsIikpCisJCWZsYWdzIHw9IFg1MDlfVl9GTEFHX0VYVEVOREVEX0NSTF9TVVBQT1JUOworCWVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiLXVzZV9kZWx0YXMiKSkKKwkJZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfVVNFX0RFTFRBUzsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi1wb2xpY3lfcHJpbnQiKSkKKwkJZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfTk9USUZZX1BPTElDWTsKKwllbHNlIGlmICghc3RyY21wKGFyZywgIi1jaGVja19zc19zaWciKSkKKwkJZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfQ0hFQ0tfU1NfU0lHTkFUVVJFOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoKmJhZGFyZykKKwkJeworCQlpZiAoKnBtKQorCQkJWDUwOV9WRVJJRllfUEFSQU1fZnJlZSgqcG0pOworCQkqcG0gPSBOVUxMOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKCEqcG0gJiYgISgqcG0gPSBYNTA5X1ZFUklGWV9QQVJBTV9uZXcoKSkpCisJCXsKKwkJKmJhZGFyZyA9IDE7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAob3RtcCkKKwkJWDUwOV9WRVJJRllfUEFSQU1fYWRkMF9wb2xpY3koKnBtLCBvdG1wKTsKKwlpZiAoZmxhZ3MpCisJCVg1MDlfVkVSSUZZX1BBUkFNX3NldF9mbGFncygqcG0sIGZsYWdzKTsKKworCWlmIChwdXJwb3NlKQorCQlYNTA5X1ZFUklGWV9QQVJBTV9zZXRfcHVycG9zZSgqcG0sIHB1cnBvc2UpOworCisJaWYgKGRlcHRoID49IDApCisJCVg1MDlfVkVSSUZZX1BBUkFNX3NldF9kZXB0aCgqcG0sIGRlcHRoKTsKKworCWVuZDoKKworCSgqcGFyZ3MpKys7CisKKwlpZiAocGFyZ2MpCisJCSpwYXJnYyAtPSAqcGFyZ3MgLSBvbGRhcmdzOworCisJcmV0dXJuIDE7CisKKwl9CisKKy8qIFJlYWQgd2hvbGUgY29udGVudHMgb2YgYSBCSU8gaW50byBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJ1ZmZlciBhbmQKKyAqIHJldHVybiBpdC4KKyAqLworCitpbnQgYmlvX3RvX21lbSh1bnNpZ25lZCBjaGFyICoqb3V0LCBpbnQgbWF4bGVuLCBCSU8gKmluKQorCXsKKwlCSU8gKm1lbTsKKwlpbnQgbGVuLCByZXQ7CisJdW5zaWduZWQgY2hhciB0YnVmWzEwMjRdOworCW1lbSA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworCWlmICghbWVtKQorCQlyZXR1cm4gLTE7CisJZm9yKDs7KQorCQl7CisJCWlmICgobWF4bGVuICE9IC0xKSAmJiBtYXhsZW4gPCAxMDI0KQorCQkJbGVuID0gbWF4bGVuOworCQllbHNlCisJCQlsZW4gPSAxMDI0OworCQlsZW4gPSBCSU9fcmVhZChpbiwgdGJ1ZiwgbGVuKTsKKwkJaWYgKGxlbiA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChCSU9fd3JpdGUobWVtLCB0YnVmLCBsZW4pICE9IGxlbikKKwkJCXsKKwkJCUJJT19mcmVlKG1lbSk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCW1heGxlbiAtPSBsZW47CisKKwkJaWYgKG1heGxlbiA9PSAwKQorCQkJYnJlYWs7CisJCX0KKwlyZXQgPSBCSU9fZ2V0X21lbV9kYXRhKG1lbSwgKGNoYXIgKiopb3V0KTsKKwlCSU9fc2V0X2ZsYWdzKG1lbSwgQklPX0ZMQUdTX01FTV9SRE9OTFkpOworCUJJT19mcmVlKG1lbSk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBwa2V5X2N0cmxfc3RyaW5nKEVWUF9QS0VZX0NUWCAqY3R4LCBjaGFyICp2YWx1ZSkKKwl7CisJaW50IHJ2OworCWNoYXIgKnN0bXAsICp2dG1wID0gTlVMTDsKKwlzdG1wID0gQlVGX3N0cmR1cCh2YWx1ZSk7CisJaWYgKCFzdG1wKQorCQlyZXR1cm4gLTE7CisJdnRtcCA9IHN0cmNocihzdG1wLCAnOicpOworCWlmICh2dG1wKQorCQl7CisJCSp2dG1wID0gMDsKKwkJdnRtcCsrOworCQl9CisJcnYgPSBFVlBfUEtFWV9DVFhfY3RybF9zdHIoY3R4LCBzdG1wLCB2dG1wKTsKKwlPUEVOU1NMX2ZyZWUoc3RtcCk7CisJcmV0dXJuIHJ2OworCX0KKworc3RhdGljIHZvaWQgbm9kZXNfcHJpbnQoQklPICpvdXQsIGNvbnN0IGNoYXIgKm5hbWUsCisJU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKm5vZGVzKQorCXsKKwlYNTA5X1BPTElDWV9OT0RFICpub2RlOworCWludCBpOworCUJJT19wcmludGYob3V0LCAiJXMgUG9saWNpZXM6IiwgbmFtZSk7CisJaWYgKG5vZGVzKQorCQl7CisJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X1BPTElDWV9OT0RFX251bShub2Rlcyk7IGkrKykKKwkJCXsKKwkJCW5vZGUgPSBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKG5vZGVzLCBpKTsKKwkJCVg1MDlfUE9MSUNZX05PREVfcHJpbnQob3V0LCBub2RlLCAyKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJQklPX3B1dHMob3V0LCAiIDxlbXB0eT5cbiIpOworCX0KKwordm9pZCBwb2xpY2llc19wcmludChCSU8gKm91dCwgWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZTsKKwlpbnQgZXhwbGljaXRfcG9saWN5OworCWludCBmcmVlX291dCA9IDA7CisJaWYgKG91dCA9PSBOVUxMKQorCQl7CisJCW91dCA9IEJJT19uZXdfZnAoc3RkZXJyLCBCSU9fTk9DTE9TRSk7CisJCWZyZWVfb3V0ID0gMTsKKwkJfQorCXRyZWUgPSBYNTA5X1NUT1JFX0NUWF9nZXQwX3BvbGljeV90cmVlKGN0eCk7CisJZXhwbGljaXRfcG9saWN5ID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2V4cGxpY2l0X3BvbGljeShjdHgpOworCisJQklPX3ByaW50ZihvdXQsICJSZXF1aXJlIGV4cGxpY2l0IFBvbGljeTogJXNcbiIsCisJCQkJZXhwbGljaXRfcG9saWN5ID8gIlRydWUiIDogIkZhbHNlIik7CisKKwlub2Rlc19wcmludChvdXQsICJBdXRob3JpdHkiLCBYNTA5X3BvbGljeV90cmVlX2dldDBfcG9saWNpZXModHJlZSkpOworCW5vZGVzX3ByaW50KG91dCwgIlVzZXIiLCBYNTA5X3BvbGljeV90cmVlX2dldDBfdXNlcl9wb2xpY2llcyh0cmVlKSk7CisJaWYgKGZyZWVfb3V0KQorCQlCSU9fZnJlZShvdXQpOworCX0KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fSlBBS0UpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fUFNLKQorCitzdGF0aWMgSlBBS0VfQ1RYICpqcGFrZV9pbml0KGNvbnN0IGNoYXIgKnVzLCBjb25zdCBjaGFyICp0aGVtLAorCQkJCQkJCSBjb25zdCBjaGFyICpzZWNyZXQpCisJeworCUJJR05VTSAqcCA9IE5VTEw7CisJQklHTlVNICpnID0gTlVMTDsKKwlCSUdOVU0gKnEgPSBOVUxMOworCUJJR05VTSAqYm5zZWNyZXQgPSBCTl9uZXcoKTsKKwlKUEFLRV9DVFggKmN0eDsKKworCS8qIFVzZSBhIHNhZmUgcHJpbWUgZm9yIHAgKHRoYXQgd2UgZm91bmQgZWFybGllcikgKi8KKwlCTl9oZXgyYm4oJnAsICJGOUU1QjM2NTY2NUVBN0EwNUE5QzUzNDUwMjc4MEZFRTZGMUFCNUJENEY0OTk0N0ZEMDM2REJEN0U5MDUyNjlBRjQ2RUYyOEIwRkMwNzQ4N0VFNEY1RDIwRkIzQzBBRjhFNzAwRjNBMkZBMzQxNDk3MENCRUQ0NEZFREZGODBDRTc4RDgwMEYxODRCQjgyNDM1RDEzN0FBREEyQzZDMTY1MjMyNDc5MzBBNjNCODU2NjFEMUZDODE3QTUxQUNEOTYxNjhFOTU4OThBMUY4M0E3OUZGQjUyOTM2OEFBNzgzM0FCRDFCMEMzQUVEREIxNEQyRTFBMkY3MUQ5OUY3NjNGIik7CisJZyA9IEJOX25ldygpOworCUJOX3NldF93b3JkKGcsIDIpOworCXEgPSBCTl9uZXcoKTsKKwlCTl9yc2hpZnQxKHEsIHApOworCisJQk5fYmluMmJuKChjb25zdCB1bnNpZ25lZCBjaGFyICopc2VjcmV0LCBzdHJsZW4oc2VjcmV0KSwgYm5zZWNyZXQpOworCisJY3R4ID0gSlBBS0VfQ1RYX25ldyh1cywgdGhlbSwgcCwgZywgcSwgYm5zZWNyZXQpOworCUJOX2ZyZWUoYm5zZWNyZXQpOworCUJOX2ZyZWUocSk7CisJQk5fZnJlZShnKTsKKwlCTl9mcmVlKHApOworCisJcmV0dXJuIGN0eDsKKwl9CisKK3N0YXRpYyB2b2lkIGpwYWtlX3NlbmRfcGFydChCSU8gKmNvbm4sIGNvbnN0IEpQQUtFX1NURVBfUEFSVCAqcCkKKwl7CisJQk5fcHJpbnQoY29ubiwgcC0+Z3gpOworCUJJT19wdXRzKGNvbm4sICJcbiIpOworCUJOX3ByaW50KGNvbm4sIHAtPnprcHguZ3IpOworCUJJT19wdXRzKGNvbm4sICJcbiIpOworCUJOX3ByaW50KGNvbm4sIHAtPnprcHguYik7CisJQklPX3B1dHMoY29ubiwgIlxuIik7CisJfQorCitzdGF0aWMgdm9pZCBqcGFrZV9zZW5kX3N0ZXAxKEJJTyAqYmNvbm4sIEpQQUtFX0NUWCAqY3R4KQorCXsKKwlKUEFLRV9TVEVQMSBzMTsKKworCUpQQUtFX1NURVAxX2luaXQoJnMxKTsKKwlKUEFLRV9TVEVQMV9nZW5lcmF0ZSgmczEsIGN0eCk7CisJanBha2Vfc2VuZF9wYXJ0KGJjb25uLCAmczEucDEpOworCWpwYWtlX3NlbmRfcGFydChiY29ubiwgJnMxLnAyKTsKKwkodm9pZClCSU9fZmx1c2goYmNvbm4pOworCUpQQUtFX1NURVAxX3JlbGVhc2UoJnMxKTsKKwl9CisKK3N0YXRpYyB2b2lkIGpwYWtlX3NlbmRfc3RlcDIoQklPICpiY29ubiwgSlBBS0VfQ1RYICpjdHgpCisJeworCUpQQUtFX1NURVAyIHMyOworCisJSlBBS0VfU1RFUDJfaW5pdCgmczIpOworCUpQQUtFX1NURVAyX2dlbmVyYXRlKCZzMiwgY3R4KTsKKwlqcGFrZV9zZW5kX3BhcnQoYmNvbm4sICZzMik7CisJKHZvaWQpQklPX2ZsdXNoKGJjb25uKTsKKwlKUEFLRV9TVEVQMl9yZWxlYXNlKCZzMik7CisJfQorCitzdGF0aWMgdm9pZCBqcGFrZV9zZW5kX3N0ZXAzYShCSU8gKmJjb25uLCBKUEFLRV9DVFggKmN0eCkKKwl7CisJSlBBS0VfU1RFUDNBIHMzYTsKKworCUpQQUtFX1NURVAzQV9pbml0KCZzM2EpOworCUpQQUtFX1NURVAzQV9nZW5lcmF0ZSgmczNhLCBjdHgpOworCUJJT193cml0ZShiY29ubiwgczNhLmhoaywgc2l6ZW9mIHMzYS5oaGspOworCSh2b2lkKUJJT19mbHVzaChiY29ubik7CisJSlBBS0VfU1RFUDNBX3JlbGVhc2UoJnMzYSk7CisJfQorCitzdGF0aWMgdm9pZCBqcGFrZV9zZW5kX3N0ZXAzYihCSU8gKmJjb25uLCBKUEFLRV9DVFggKmN0eCkKKwl7CisJSlBBS0VfU1RFUDNCIHMzYjsKKworCUpQQUtFX1NURVAzQl9pbml0KCZzM2IpOworCUpQQUtFX1NURVAzQl9nZW5lcmF0ZSgmczNiLCBjdHgpOworCUJJT193cml0ZShiY29ubiwgczNiLmhrLCBzaXplb2YgczNiLmhrKTsKKwkodm9pZClCSU9fZmx1c2goYmNvbm4pOworCUpQQUtFX1NURVAzQl9yZWxlYXNlKCZzM2IpOworCX0KKworc3RhdGljIHZvaWQgcmVhZGJuKEJJR05VTSAqKmJuLCBCSU8gKmJjb25uKQorCXsKKwljaGFyIGJ1ZlsxMDI0MF07CisJaW50IGw7CisKKwlsID0gQklPX2dldHMoYmNvbm4sIGJ1Ziwgc2l6ZW9mIGJ1Zik7CisJYXNzZXJ0KGwgPiAwKTsKKwlhc3NlcnQoYnVmW2wtMV0gPT0gJ1xuJyk7CisJYnVmW2wtMV0gPSAnXDAnOworCUJOX2hleDJibihibiwgYnVmKTsKKwl9CisKK3N0YXRpYyB2b2lkIGpwYWtlX3JlY2VpdmVfcGFydChKUEFLRV9TVEVQX1BBUlQgKnAsIEJJTyAqYmNvbm4pCisJeworCXJlYWRibigmcC0+Z3gsIGJjb25uKTsKKwlyZWFkYm4oJnAtPnprcHguZ3IsIGJjb25uKTsKKwlyZWFkYm4oJnAtPnprcHguYiwgYmNvbm4pOworCX0KKworc3RhdGljIHZvaWQganBha2VfcmVjZWl2ZV9zdGVwMShKUEFLRV9DVFggKmN0eCwgQklPICpiY29ubikKKwl7CisJSlBBS0VfU1RFUDEgczE7CisKKwlKUEFLRV9TVEVQMV9pbml0KCZzMSk7CisJanBha2VfcmVjZWl2ZV9wYXJ0KCZzMS5wMSwgYmNvbm4pOworCWpwYWtlX3JlY2VpdmVfcGFydCgmczEucDIsIGJjb25uKTsKKwlpZighSlBBS0VfU1RFUDFfcHJvY2VzcyhjdHgsICZzMSkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZXhpdCgxKTsKKwkJfQorCUpQQUtFX1NURVAxX3JlbGVhc2UoJnMxKTsKKwl9CisKK3N0YXRpYyB2b2lkIGpwYWtlX3JlY2VpdmVfc3RlcDIoSlBBS0VfQ1RYICpjdHgsIEJJTyAqYmNvbm4pCisJeworCUpQQUtFX1NURVAyIHMyOworCisJSlBBS0VfU1RFUDJfaW5pdCgmczIpOworCWpwYWtlX3JlY2VpdmVfcGFydCgmczIsIGJjb25uKTsKKwlpZighSlBBS0VfU1RFUDJfcHJvY2VzcyhjdHgsICZzMikpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZXhpdCgxKTsKKwkJfQorCUpQQUtFX1NURVAyX3JlbGVhc2UoJnMyKTsKKwl9CisKK3N0YXRpYyB2b2lkIGpwYWtlX3JlY2VpdmVfc3RlcDNhKEpQQUtFX0NUWCAqY3R4LCBCSU8gKmJjb25uKQorCXsKKwlKUEFLRV9TVEVQM0EgczNhOworCWludCBsOworCisJSlBBS0VfU1RFUDNBX2luaXQoJnMzYSk7CisJbCA9IEJJT19yZWFkKGJjb25uLCBzM2EuaGhrLCBzaXplb2YgczNhLmhoayk7CisJYXNzZXJ0KGwgPT0gc2l6ZW9mIHMzYS5oaGspOworCWlmKCFKUEFLRV9TVEVQM0FfcHJvY2VzcyhjdHgsICZzM2EpKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWV4aXQoMSk7CisJCX0KKwlKUEFLRV9TVEVQM0FfcmVsZWFzZSgmczNhKTsKKwl9CisKK3N0YXRpYyB2b2lkIGpwYWtlX3JlY2VpdmVfc3RlcDNiKEpQQUtFX0NUWCAqY3R4LCBCSU8gKmJjb25uKQorCXsKKwlKUEFLRV9TVEVQM0IgczNiOworCWludCBsOworCisJSlBBS0VfU1RFUDNCX2luaXQoJnMzYik7CisJbCA9IEJJT19yZWFkKGJjb25uLCBzM2IuaGssIHNpemVvZiBzM2IuaGspOworCWFzc2VydChsID09IHNpemVvZiBzM2IuaGspOworCWlmKCFKUEFLRV9TVEVQM0JfcHJvY2VzcyhjdHgsICZzM2IpKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWV4aXQoMSk7CisJCX0KKwlKUEFLRV9TVEVQM0JfcmVsZWFzZSgmczNiKTsKKwl9CisKK3ZvaWQganBha2VfY2xpZW50X2F1dGgoQklPICpvdXQsIEJJTyAqY29ubiwgY29uc3QgY2hhciAqc2VjcmV0KQorCXsKKwlKUEFLRV9DVFggKmN0eDsKKwlCSU8gKmJjb25uOworCisJQklPX3B1dHMob3V0LCAiQXV0aGVudGljYXRpbmcgd2l0aCBKUEFLRVxuIik7CisKKwljdHggPSBqcGFrZV9pbml0KCJjbGllbnQiLCAic2VydmVyIiwgc2VjcmV0KTsKKworCWJjb25uID0gQklPX25ldyhCSU9fZl9idWZmZXIoKSk7CisJQklPX3B1c2goYmNvbm4sIGNvbm4pOworCisJanBha2Vfc2VuZF9zdGVwMShiY29ubiwgY3R4KTsKKwlqcGFrZV9yZWNlaXZlX3N0ZXAxKGN0eCwgYmNvbm4pOworCWpwYWtlX3NlbmRfc3RlcDIoYmNvbm4sIGN0eCk7CisJanBha2VfcmVjZWl2ZV9zdGVwMihjdHgsIGJjb25uKTsKKwlqcGFrZV9zZW5kX3N0ZXAzYShiY29ubiwgY3R4KTsKKwlqcGFrZV9yZWNlaXZlX3N0ZXAzYihjdHgsIGJjb25uKTsKKworCUJJT19wdXRzKG91dCwgIkpQQUtFIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRlZCwgc2V0dGluZyBQU0tcbiIpOworCisJcHNrX2tleSA9IEJOX2JuMmhleChKUEFLRV9nZXRfc2hhcmVkX2tleShjdHgpKTsKKworCUJJT19wb3AoYmNvbm4pOworCUJJT19mcmVlKGJjb25uKTsKKworCUpQQUtFX0NUWF9mcmVlKGN0eCk7CisJfQorCit2b2lkIGpwYWtlX3NlcnZlcl9hdXRoKEJJTyAqb3V0LCBCSU8gKmNvbm4sIGNvbnN0IGNoYXIgKnNlY3JldCkKKwl7CisJSlBBS0VfQ1RYICpjdHg7CisJQklPICpiY29ubjsKKworCUJJT19wdXRzKG91dCwgIkF1dGhlbnRpY2F0aW5nIHdpdGggSlBBS0VcbiIpOworCisJY3R4ID0ganBha2VfaW5pdCgic2VydmVyIiwgImNsaWVudCIsIHNlY3JldCk7CisKKwliY29ubiA9IEJJT19uZXcoQklPX2ZfYnVmZmVyKCkpOworCUJJT19wdXNoKGJjb25uLCBjb25uKTsKKworCWpwYWtlX3JlY2VpdmVfc3RlcDEoY3R4LCBiY29ubik7CisJanBha2Vfc2VuZF9zdGVwMShiY29ubiwgY3R4KTsKKwlqcGFrZV9yZWNlaXZlX3N0ZXAyKGN0eCwgYmNvbm4pOworCWpwYWtlX3NlbmRfc3RlcDIoYmNvbm4sIGN0eCk7CisJanBha2VfcmVjZWl2ZV9zdGVwM2EoY3R4LCBiY29ubik7CisJanBha2Vfc2VuZF9zdGVwM2IoYmNvbm4sIGN0eCk7CisKKwlCSU9fcHV0cyhvdXQsICJKUEFLRSBhdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQsIHNldHRpbmcgUFNLXG4iKTsKKworCXBza19rZXkgPSBCTl9ibjJoZXgoSlBBS0VfZ2V0X3NoYXJlZF9rZXkoY3R4KSk7CisKKwlCSU9fcG9wKGJjb25uKTsKKwlCSU9fZnJlZShiY29ubik7CisKKwlKUEFLRV9DVFhfZnJlZShjdHgpOworCX0KKworI2VuZGlmCisKKy8qCisgKiBQbGF0Zm9ybS1zcGVjaWZpYyBzZWN0aW9ucworICovCisjaWYgZGVmaW5lZChfV0lOMzIpCisjIGlmZGVmIGZpbGVubworIyAgdW5kZWYgZmlsZW5vCisjICBkZWZpbmUgZmlsZW5vKGEpIChpbnQpX2ZpbGVubyhhKQorIyBlbmRpZgorCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgaW5jbHVkZSA8dGNoYXIuaD4KKworc3RhdGljIGludCBXSU4zMl9yZW5hbWUoY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8pCisJeworCVRDSEFSICAqdGZyb209TlVMTCwqdHRvOworCURXT1JECWVycjsKKwlpbnQJcmV0PTA7CisKKwlpZiAoc2l6ZW9mKFRDSEFSKSA9PSAxKQorCQl7CisJCXRmcm9tID0gKFRDSEFSICopZnJvbTsKKwkJdHRvICAgPSAoVENIQVIgKil0bzsKKwkJfQorCWVsc2UJLyogVU5JQ09ERSBwYXRoICovCisJCXsKKwkJc2l6ZV90IGksZmxlbj1zdHJsZW4oZnJvbSkrMSx0bGVuPXN0cmxlbih0bykrMTsKKwkJdGZyb20gPSAoVENIQVIgKiltYWxsb2Moc2l6ZW9mKFRDSEFSKSooZmxlbit0bGVuKSk7CisJCWlmICh0ZnJvbT09TlVMTCkgZ290byBlcnI7CisJCXR0bz10ZnJvbStmbGVuOworI2lmICFkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IF9XSU4zMl9XQ0U+PTEwMQorCQlpZiAoIU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLDAsZnJvbSxmbGVuLChXQ0hBUiAqKXRmcm9tLGZsZW4pKQorI2VuZGlmCisJCQlmb3IgKGk9MDtpPGZsZW47aSsrKQl0ZnJvbVtpXT0oVENIQVIpZnJvbVtpXTsKKyNpZiAhZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBfV0lOMzJfV0NFPj0xMDEKKwkJaWYgKCFNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwwLHRvLCAgdGxlbiwoV0NIQVIgKil0dG8sICB0bGVuKSkKKyNlbmRpZgorCQkJZm9yIChpPTA7aTx0bGVuO2krKykJdHRvW2ldICA9KFRDSEFSKXRvW2ldOworCQl9CisKKwlpZiAoTW92ZUZpbGUodGZyb20sdHRvKSkJZ290byBvazsKKwllcnI9R2V0TGFzdEVycm9yKCk7CisJaWYgKGVycj09RVJST1JfQUxSRUFEWV9FWElTVFMgfHwgZXJyPT1FUlJPUl9GSUxFX0VYSVNUUykKKwkJeworCQlpZiAoRGVsZXRlRmlsZSh0dG8pICYmIE1vdmVGaWxlKHRmcm9tLHR0bykpCisJCQlnb3RvIG9rOworCQllcnI9R2V0TGFzdEVycm9yKCk7CisJCX0KKwlpZiAoZXJyPT1FUlJPUl9GSUxFX05PVF9GT1VORCB8fCBlcnI9PUVSUk9SX1BBVEhfTk9UX0ZPVU5EKQorCQllcnJubyA9IEVOT0VOVDsKKwllbHNlIGlmIChlcnI9PUVSUk9SX0FDQ0VTU19ERU5JRUQpCisJCWVycm5vID0gRUFDQ0VTOworCWVsc2UKKwkJZXJybm8gPSBFSU5WQUw7CS8qIHdlIGNvdWxkIG1hcCBtb3JlIGNvZGVzLi4uICovCitlcnI6CisJcmV0PS0xOworb2s6CisJaWYgKHRmcm9tIT1OVUxMICYmIHRmcm9tIT0oVENIQVIgKilmcm9tKQlmcmVlKHRmcm9tKTsKKwlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCisvKiBhcHBfdG1pbnRlcnZhbCBzZWN0aW9uICovCisjaWYgZGVmaW5lZChfV0lOMzIpCitkb3VibGUgYXBwX3RtaW50ZXJ2YWwoaW50IHN0b3AsaW50IHVzZXJ0aW1lKQorCXsKKwlGSUxFVElNRQkJbm93OworCWRvdWJsZQkJCXJldD0wOworCXN0YXRpYyBVTEFSR0VfSU5URUdFUgl0bXN0YXJ0OworCXN0YXRpYyBpbnQJCXdhcm5pbmc9MTsKKyNpZmRlZiBfV0lOMzJfV0lOTlQKKwlzdGF0aWMgSEFORExFCQlwcm9jPU5VTEw7CisKKwlpZiAocHJvYz09TlVMTCkKKwkJeworCQlpZiAoR2V0VmVyc2lvbigpIDwgMHg4MDAwMDAwMCkKKwkJCXByb2MgPSBPcGVuUHJvY2VzcyhQUk9DRVNTX1FVRVJZX0lORk9STUFUSU9OLEZBTFNFLAorCQkJCQkJR2V0Q3VycmVudFByb2Nlc3NJZCgpKTsKKwkJaWYgKHByb2M9PU5VTEwpIHByb2MgPSAoSEFORExFKS0xOworCQl9CisKKwlpZiAodXNlcnRpbWUgJiYgcHJvYyE9KEhBTkRMRSktMSkKKwkJeworCQlGSUxFVElNRSBqdW5rOworCQlHZXRQcm9jZXNzVGltZXMocHJvYywmanVuaywmanVuaywmanVuaywmbm93KTsKKwkJfQorCWVsc2UKKyNlbmRpZgorCQl7CisJCVNZU1RFTVRJTUUgc3lzdGltZTsKKworCQlpZiAodXNlcnRpbWUgJiYgd2FybmluZykKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiVG8gZ2V0IG1lYW5pbmdmdWwgcmVzdWx0cywgcnVuICIKKwkJCQkJICAgInRoaXMgcHJvZ3JhbSBvbiBpZGxlIHN5c3RlbS5cbiIpOworCQkJd2FybmluZz0wOworCQkJfQorCQlHZXRTeXN0ZW1UaW1lKCZzeXN0aW1lKTsKKwkJU3lzdGVtVGltZVRvRmlsZVRpbWUoJnN5c3RpbWUsJm5vdyk7CisJCX0KKworCWlmIChzdG9wPT1UTV9TVEFSVCkKKwkJeworCQl0bXN0YXJ0LnUuTG93UGFydCAgPSBub3cuZHdMb3dEYXRlVGltZTsKKwkJdG1zdGFydC51LkhpZ2hQYXJ0ID0gbm93LmR3SGlnaERhdGVUaW1lOworCQl9CisJZWxzZQl7CisJCVVMQVJHRV9JTlRFR0VSIHRtc3RvcDsKKworCQl0bXN0b3AudS5Mb3dQYXJ0ICAgPSBub3cuZHdMb3dEYXRlVGltZTsKKwkJdG1zdG9wLnUuSGlnaFBhcnQgID0gbm93LmR3SGlnaERhdGVUaW1lOworCisJCXJldCA9IChfX2ludDY0KSh0bXN0b3AuUXVhZFBhcnQgLSB0bXN0YXJ0LlF1YWRQYXJ0KSoxZS03OworCQl9CisKKwlyZXR1cm4gKHJldCk7CisJfQorCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisjaW5jbHVkZSA8dGltZS5oPgorCitkb3VibGUgYXBwX3RtaW50ZXJ2YWwoaW50IHN0b3AsaW50IHVzZXJ0aW1lKQorCXsKKwlkb3VibGUJCXJldD0wOworCXN0YXRpYyBjbG9ja190CXRtc3RhcnQ7CisJc3RhdGljIGludAl3YXJuaW5nPTE7CisKKwlpZiAodXNlcnRpbWUgJiYgd2FybmluZykKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlRvIGdldCBtZWFuaW5nZnVsIHJlc3VsdHMsIHJ1biAiCisJCQkJICAgInRoaXMgcHJvZ3JhbSBvbiBpZGxlIHN5c3RlbS5cbiIpOworCQl3YXJuaW5nPTA7CisJCX0KKworCWlmIChzdG9wPT1UTV9TVEFSVCkJdG1zdGFydCA9IGNsb2NrKCk7CisJZWxzZQkJCXJldCAgICAgPSAoY2xvY2soKS10bXN0YXJ0KS8oZG91YmxlKUNMT0NLU19QRVJfU0VDOworCisJcmV0dXJuIChyZXQpOworCX0KKworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU1RFTV9WWFdPUktTKQorI2luY2x1ZGUgPHRpbWUuaD4KKworZG91YmxlIGFwcF90bWludGVydmFsKGludCBzdG9wLGludCB1c2VydGltZSkKKwl7CisJZG91YmxlIHJldD0wOworI2lmZGVmIENMT0NLX1JFQUxUSU1FCisJc3RhdGljIHN0cnVjdCB0aW1lc3BlYwl0bXN0YXJ0OworCXN0cnVjdCB0aW1lc3BlYwkJbm93OworI2Vsc2UKKwlzdGF0aWMgdW5zaWduZWQgbG9uZwl0bXN0YXJ0OworCXVuc2lnbmVkIGxvbmcJCW5vdzsKKyNlbmRpZgorCXN0YXRpYyBpbnQgd2FybmluZz0xOworCisJaWYgKHVzZXJ0aW1lICYmIHdhcm5pbmcpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJUbyBnZXQgbWVhbmluZ2Z1bCByZXN1bHRzLCBydW4gIgorCQkJCSAgICJ0aGlzIHByb2dyYW0gb24gaWRsZSBzeXN0ZW0uXG4iKTsKKwkJd2FybmluZz0wOworCQl9CisKKyNpZmRlZiBDTE9DS19SRUFMVElNRQorCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsJm5vdyk7CisJaWYgKHN0b3A9PVRNX1NUQVJUKQl0bXN0YXJ0ID0gbm93OworCWVsc2UJcmV0ID0gKCAobm93LnR2X3NlYytub3cudHZfbnNlYyoxZS05KQorCQkJLSAodG1zdGFydC50dl9zZWMrdG1zdGFydC50dl9uc2VjKjFlLTkpICk7CisjZWxzZQorCW5vdyA9IHRpY2tHZXQoKTsKKwlpZiAoc3RvcD09VE1fU1RBUlQpCXRtc3RhcnQgPSBub3c7CisJZWxzZQkJCXJldCA9IChub3cgLSB0bXN0YXJ0KS8oZG91YmxlKXN5c0Nsa1JhdGVHZXQoKTsKKyNlbmRpZgorCXJldHVybiAocmV0KTsKKwl9CisKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNURU1fVk1TKQorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx0aW1lcy5oPgorCitkb3VibGUgYXBwX3RtaW50ZXJ2YWwoaW50IHN0b3AsaW50IHVzZXJ0aW1lKQorCXsKKwlzdGF0aWMgY2xvY2tfdAl0bXN0YXJ0OworCWRvdWJsZQkJcmV0ID0gMDsKKwljbG9ja190CQlub3c7CisjaWZkZWYgX19UTVMKKwlzdHJ1Y3QgdG1zCXJ1czsKKworCW5vdyA9IHRpbWVzKCZydXMpOworCWlmICh1c2VydGltZSkJbm93ID0gcnVzLnRtc191dGltZTsKKyNlbHNlCisJaWYgKHVzZXJ0aW1lKQorCQlub3cgPSBjbG9jaygpOyAvKiBzdW0gb2YgdXNlciBhbmQga2VybmVsIHRpbWVzICovCisJZWxzZQl7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlnZXR0aW1lb2ZkYXkoJnR2LE5VTEwpOworCQlub3cgPSAoY2xvY2tfdCkoCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXR2LnR2X3NlYypDTEtfVENLICsKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdHYudHZfdXNlYyooMTAwMDAwMC9DTEtfVENLKQorCQkJKTsKKwkJfQorI2VuZGlmCisJaWYgKHN0b3A9PVRNX1NUQVJUKQl0bXN0YXJ0ID0gbm93OworCWVsc2UJCQlyZXQgPSAobm93IC0gdG1zdGFydCkvKGRvdWJsZSkoQ0xLX1RDSyk7CisKKwlyZXR1cm4gKHJldCk7CisJfQorCisjZWxpZiBkZWZpbmVkKF9TQ19DTEtfVENLKQkvKiBieSBtZWFucyBvZiB1bmlzdGQuaCAqLworI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorCitkb3VibGUgYXBwX3RtaW50ZXJ2YWwoaW50IHN0b3AsaW50IHVzZXJ0aW1lKQorCXsKKwlkb3VibGUJCXJldCA9IDA7CisJc3RydWN0IHRtcwlydXM7CisJY2xvY2tfdAkJbm93ID0gdGltZXMoJnJ1cyk7CisJc3RhdGljIGNsb2NrX3QJdG1zdGFydDsKKworCWlmICh1c2VydGltZSkJCW5vdyA9IHJ1cy50bXNfdXRpbWU7CisKKwlpZiAoc3RvcD09VE1fU1RBUlQpCXRtc3RhcnQgPSBub3c7CisJZWxzZQorCQl7CisJCWxvbmcgaW50IHRjayA9IHN5c2NvbmYoX1NDX0NMS19UQ0spOworCQlyZXQgPSAobm93IC0gdG1zdGFydCkvKGRvdWJsZSl0Y2s7CisJCX0KKworCXJldHVybiAocmV0KTsKKwl9CisKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKworZG91YmxlIGFwcF90bWludGVydmFsKGludCBzdG9wLGludCB1c2VydGltZSkKKwl7CisJZG91YmxlCQlyZXQgPSAwOworCXN0cnVjdCBydXNhZ2UJcnVzOworCXN0cnVjdCB0aW1ldmFsCW5vdzsKKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwgdG1zdGFydDsKKworCWlmICh1c2VydGltZSkJCWdldHJ1c2FnZShSVVNBR0VfU0VMRiwmcnVzKSwgbm93ID0gcnVzLnJ1X3V0aW1lOworCWVsc2UJCQlnZXR0aW1lb2ZkYXkoJm5vdyxOVUxMKTsKKworCWlmIChzdG9wPT1UTV9TVEFSVCkJdG1zdGFydCA9IG5vdzsKKwllbHNlCQkJcmV0ID0gKCAobm93LnR2X3NlYytub3cudHZfdXNlYyoxZS02KQorCQkJCQktICh0bXN0YXJ0LnR2X3NlYyt0bXN0YXJ0LnR2X3VzZWMqMWUtNikgKTsKKworCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKy8qIGFwcF9pc2RpciBzZWN0aW9uICovCisjaWZkZWYgX1dJTjMyCitpbnQgYXBwX2lzZGlyKGNvbnN0IGNoYXIgKm5hbWUpCisJeworCUhBTkRMRQkJaExpc3Q7CisJV0lOMzJfRklORF9EQVRBCUZpbGVEYXRhOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKwlzaXplX3QgaSwgbGVuXzAgPSBzdHJsZW4obmFtZSkrMTsKKworCWlmIChsZW5fMCA+IHNpemVvZihGaWxlRGF0YS5jRmlsZU5hbWUpL3NpemVvZihGaWxlRGF0YS5jRmlsZU5hbWVbMF0pKQorCQlyZXR1cm4gLTE7CisKKyNpZiAhZGVmaW5lZChfV0lOMzJfV0NFKSB8fCBfV0lOMzJfV0NFPj0xMDEKKwlpZiAoIU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLDAsbmFtZSxsZW5fMCxGaWxlRGF0YS5jRmlsZU5hbWUsbGVuXzApKQorI2VuZGlmCisJCWZvciAoaT0wO2k8bGVuXzA7aSsrKQorCQkJRmlsZURhdGEuY0ZpbGVOYW1lW2ldID0gKFdDSEFSKW5hbWVbaV07CisKKwloTGlzdCA9IEZpbmRGaXJzdEZpbGUoRmlsZURhdGEuY0ZpbGVOYW1lLCZGaWxlRGF0YSk7CisjZWxzZQorCWhMaXN0ID0gRmluZEZpcnN0RmlsZShuYW1lLCZGaWxlRGF0YSk7CisjZW5kaWYKKwlpZiAoaExpc3QgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCXJldHVybiAtMTsKKwlGaW5kQ2xvc2UoaExpc3QpOworCXJldHVybiAoKEZpbGVEYXRhLmR3RmlsZUF0dHJpYnV0ZXMmRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSE9MCk7CisJfQorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2lmbmRlZiBTX0lTRElSCisjIGlmIGRlZmluZWQoX1NfSUZNVCkgJiYgZGVmaW5lZChfU19JRkRJUikKKyMgIGRlZmluZSBTX0lTRElSKGEpICAgKCgoYSkgJiBfU19JRk1UKSA9PSBfU19JRkRJUikKKyMgZWxzZSAKKyMgIGRlZmluZSBTX0lTRElSKGEpICAgKCgoYSkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjIGVuZGlmIAorI2VuZGlmIAorCitpbnQgYXBwX2lzZGlyKGNvbnN0IGNoYXIgKm5hbWUpCisJeworI2lmIGRlZmluZWQoU19JU0RJUikKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzdGF0KG5hbWUsJnN0KT09MCkJcmV0dXJuIFNfSVNESVIoc3Quc3RfbW9kZSk7CisJZWxzZQkJCXJldHVybiAtMTsKKyNlbHNlCisJcmV0dXJuIC0xOworI2VuZGlmCisJfQorI2VuZGlmCisKKy8qIHJhd19yZWFkfHdyaXRlIHNlY3Rpb24gKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChTVERfSU5QVVRfSEFORExFKQoraW50IHJhd19yZWFkX3N0ZGluKHZvaWQgKmJ1ZixpbnQgc2l6KQorCXsKKwlEV09SRCBuOworCWlmIChSZWFkRmlsZShHZXRTdGRIYW5kbGUoU1REX0lOUFVUX0hBTkRMRSksYnVmLHNpeiwmbixOVUxMKSkKKwkJcmV0dXJuIChuKTsKKwllbHNlCXJldHVybiAoLTEpOworCX0KKyNlbHNlCitpbnQgcmF3X3JlYWRfc3RkaW4odm9pZCAqYnVmLGludCBzaXopCisJewlyZXR1cm4gcmVhZChmaWxlbm8oc3RkaW4pLGJ1ZixzaXopOwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKFNURF9PVVRQVVRfSEFORExFKQoraW50IHJhd193cml0ZV9zdGRvdXQoY29uc3Qgdm9pZCAqYnVmLGludCBzaXopCisJeworCURXT1JEIG47CisJaWYgKFdyaXRlRmlsZShHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpLGJ1ZixzaXosJm4sTlVMTCkpCisJCXJldHVybiAobik7CisJZWxzZQlyZXR1cm4gKC0xKTsKKwl9CisjZWxzZQoraW50IHJhd193cml0ZV9zdGRvdXQoY29uc3Qgdm9pZCAqYnVmLGludCBzaXopCisJewlyZXR1cm4gd3JpdGUoZmlsZW5vKHN0ZG91dCksYnVmLHNpeik7CX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9hcHBzLmggYi9saWIvb3BlbnNzbC9hcHBzL2FwcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTZhMzlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9hcHBzLmgKQEAgLTAsMCArMSwzNjAgQEAKKy8qIGFwcHMvYXBwcy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfQVBQU19ICisjZGVmaW5lIEhFQURFUl9BUFBTX0gKKworI2luY2x1ZGUgImVfb3MuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdHh0X2RiLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX09DU1AKKyNpbmNsdWRlIDxvcGVuc3NsL29jc3AuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKworaW50IGFwcF9SQU5EX2xvYWRfZmlsZShjb25zdCBjaGFyICpmaWxlLCBCSU8gKmJpb19lLCBpbnQgZG9udF93YXJuKTsKK2ludCBhcHBfUkFORF93cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGUsIEJJTyAqYmlvX2UpOworLyogV2hlbiBgZmlsZScgaXMgTlVMTCwgdXNlIGRlZmF1bHRzLgorICogYGJpb19lJyBpcyBmb3IgZXJyb3IgbWVzc2FnZXMuICovCit2b2lkIGFwcF9SQU5EX2FsbG93X3dyaXRlX2ZpbGUodm9pZCk7Citsb25nIGFwcF9SQU5EX2xvYWRfZmlsZXMoY2hhciAqZmlsZSk7IC8qIGBmaWxlJyBpcyBhIGxpc3Qgb2YgZmlsZXMgdG8gcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2VwYXJhdGVkIGJ5IExJU1RfU0VQQVJBVE9SX0NIQVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKHNlZSBlX29zLmgpLiAgVGhlIHN0cmluZyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkZXN0cm95ZWQhICovCisKKyNpZm5kZWYgTU9OT0xJVEgKKworI2RlZmluZSBNQUlOKGEsdikJbWFpbihhLHYpCisKKyNpZm5kZWYgTk9OX01BSU4KK0NPTkYgKmNvbmZpZz1OVUxMOworQklPICpiaW9fZXJyPU5VTEw7CisjZWxzZQorZXh0ZXJuIENPTkYgKmNvbmZpZzsKK2V4dGVybiBCSU8gKmJpb19lcnI7CisjZW5kaWYKKworI2Vsc2UKKworI2RlZmluZSBNQUlOKGEsdikJUFJPRyhhLHYpCitleHRlcm4gQ09ORiAqY29uZmlnOworZXh0ZXJuIGNoYXIgKmRlZmF1bHRfY29uZmlnX2ZpbGU7CitleHRlcm4gQklPICpiaW9fZXJyOworCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2lmZGVmIFNJR1BJUEUKKyNkZWZpbmUgZG9fcGlwZV9zaWcoKQlzaWduYWwoU0lHUElQRSxTSUdfSUdOKQorI2Vsc2UKKyNkZWZpbmUgZG9fcGlwZV9zaWcoKQorI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX05PX0NPTVAKKyNkZWZpbmUgemxpYl9jbGVhbnVwKCkgCisjZWxzZQorI2RlZmluZSB6bGliX2NsZWFudXAoKSBDT01QX3psaWJfY2xlYW51cCgpCisjZW5kaWYKKworI2lmIGRlZmluZWQoTU9OT0xJVEgpICYmICFkZWZpbmVkKE9QRU5TU0xfQykKKyMgIGRlZmluZSBhcHBzX3N0YXJ0dXAoKSBcCisJCWRvX3BpcGVfc2lnKCkKKyMgIGRlZmluZSBhcHBzX3NodXRkb3duKCkKKyNlbHNlCisjICBpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyMgICAgZGVmaW5lIGFwcHNfc3RhcnR1cCgpIFwKKwkJCWRvIHsgZG9fcGlwZV9zaWcoKTsgQ1JZUFRPX21hbGxvY19pbml0KCk7IFwKKwkJCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7IE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7IFwKKwkJCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOyBzZXR1cF91aV9tZXRob2QoKTsgfSB3aGlsZSgwKQorIyAgICBkZWZpbmUgYXBwc19zaHV0ZG93bigpIFwKKwkJCWRvIHsgQ09ORl9tb2R1bGVzX3VubG9hZCgxKTsgZGVzdHJveV91aV9tZXRob2QoKTsgXAorCQkJT0JKX2NsZWFudXAoKTsgRVZQX2NsZWFudXAoKTsgRU5HSU5FX2NsZWFudXAoKTsgXAorCQkJQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsgRVJSX3JlbW92ZV90aHJlYWRfc3RhdGUoTlVMTCk7IFwKKwkJCUVSUl9mcmVlX3N0cmluZ3MoKTsgemxpYl9jbGVhbnVwKCk7fSB3aGlsZSgwKQorIyAgZWxzZQorIyAgICBkZWZpbmUgYXBwc19zdGFydHVwKCkgXAorCQkJZG8geyBkb19waXBlX3NpZygpOyBDUllQVE9fbWFsbG9jX2luaXQoKTsgXAorCQkJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsgXAorCQkJc2V0dXBfdWlfbWV0aG9kKCk7IH0gd2hpbGUoMCkKKyMgICAgZGVmaW5lIGFwcHNfc2h1dGRvd24oKSBcCisJCQlkbyB7IENPTkZfbW9kdWxlc191bmxvYWQoMSk7IGRlc3Ryb3lfdWlfbWV0aG9kKCk7IFwKKwkJCU9CSl9jbGVhbnVwKCk7IEVWUF9jbGVhbnVwKCk7IFwKKwkJCUNSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7IEVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKE5VTEwpOyBcCisJCQlFUlJfZnJlZV9zdHJpbmdzKCk7IHpsaWJfY2xlYW51cCgpOyB9IHdoaWxlKDApCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfV0lOMzIKKyMgIGRlZmluZSBvcGVuc3NsX2Zkc2V0KGEsYikgRkRfU0VUKCh1bnNpZ25lZCBpbnQpYSwgYikKKyNlbHNlCisjICBkZWZpbmUgb3BlbnNzbF9mZHNldChhLGIpIEZEX1NFVChhLCBiKQorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgYXJnc19zdAorCXsKKwljaGFyICoqZGF0YTsKKwlpbnQgY291bnQ7CisJfSBBUkdTOworCisjZGVmaW5lIFBXX01JTl9MRU5HVEggNAordHlwZWRlZiBzdHJ1Y3QgcHdfY2JfZGF0YQorCXsKKwljb25zdCB2b2lkICpwYXNzd29yZDsKKwljb25zdCBjaGFyICpwcm9tcHRfaW5mbzsKKwl9IFBXX0NCX0RBVEE7CisKK2ludCBwYXNzd29yZF9jYWxsYmFjayhjaGFyICpidWYsIGludCBidWZzaXosIGludCB2ZXJpZnksCisJUFdfQ0JfREFUQSAqY2JfZGF0YSk7CisKK2ludCBzZXR1cF91aV9tZXRob2Qodm9pZCk7Cit2b2lkIGRlc3Ryb3lfdWlfbWV0aG9kKHZvaWQpOworCitpbnQgc2hvdWxkX3JldHJ5KGludCBpKTsKK2ludCBhcmdzX2Zyb21fZmlsZShjaGFyICpmaWxlLCBpbnQgKmFyZ2MsIGNoYXIgKiphcmd2W10pOworaW50IHN0cjJmbXQoY2hhciAqcyk7Cit2b2lkIHByb2dyYW1fbmFtZShjaGFyICppbixjaGFyICpvdXQsaW50IHNpemUpOworaW50IGNob3B1cF9hcmdzKEFSR1MgKmFyZyxjaGFyICpidWYsIGludCAqYXJnYywgY2hhciAqKmFyZ3ZbXSk7CisjaWZkZWYgSEVBREVSX1g1MDlfSAoraW50IGR1bXBfY2VydF90ZXh0KEJJTyAqb3V0LCBYNTA5ICp4KTsKK3ZvaWQgcHJpbnRfbmFtZShCSU8gKm91dCwgY29uc3QgY2hhciAqdGl0bGUsIFg1MDlfTkFNRSAqbm0sIHVuc2lnbmVkIGxvbmcgbGZsYWdzKTsKKyNlbmRpZgoraW50IHNldF9jZXJ0X2V4KHVuc2lnbmVkIGxvbmcgKmZsYWdzLCBjb25zdCBjaGFyICphcmcpOworaW50IHNldF9uYW1lX2V4KHVuc2lnbmVkIGxvbmcgKmZsYWdzLCBjb25zdCBjaGFyICphcmcpOworaW50IHNldF9leHRfY29weShpbnQgKmNvcHlfdHlwZSwgY29uc3QgY2hhciAqYXJnKTsKK2ludCBjb3B5X2V4dGVuc2lvbnMoWDUwOSAqeCwgWDUwOV9SRVEgKnJlcSwgaW50IGNvcHlfdHlwZSk7CitpbnQgYXBwX3Bhc3N3ZChCSU8gKmVyciwgY2hhciAqYXJnMSwgY2hhciAqYXJnMiwgY2hhciAqKnBhc3MxLCBjaGFyICoqcGFzczIpOworaW50IGFkZF9vaWRfc2VjdGlvbihCSU8gKmVyciwgQ09ORiAqY29uZik7CitYNTA5ICpsb2FkX2NlcnQoQklPICplcnIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBmb3JtYXQsCisJY29uc3QgY2hhciAqcGFzcywgRU5HSU5FICplLCBjb25zdCBjaGFyICpjZXJ0X2Rlc2NyaXApOworRVZQX1BLRVkgKmxvYWRfa2V5KEJJTyAqZXJyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgZm9ybWF0LCBpbnQgbWF5YmVfc3RkaW4sCisJY29uc3QgY2hhciAqcGFzcywgRU5HSU5FICplLCBjb25zdCBjaGFyICprZXlfZGVzY3JpcCk7CitFVlBfUEtFWSAqbG9hZF9wdWJrZXkoQklPICplcnIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBmb3JtYXQsIGludCBtYXliZV9zdGRpbiwKKwljb25zdCBjaGFyICpwYXNzLCBFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmtleV9kZXNjcmlwKTsKK1NUQUNLX09GKFg1MDkpICpsb2FkX2NlcnRzKEJJTyAqZXJyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgZm9ybWF0LAorCWNvbnN0IGNoYXIgKnBhc3MsIEVOR0lORSAqZSwgY29uc3QgY2hhciAqY2VydF9kZXNjcmlwKTsKK1NUQUNLX09GKFg1MDlfQ1JMKSAqbG9hZF9jcmxzKEJJTyAqZXJyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgZm9ybWF0LAorCWNvbnN0IGNoYXIgKnBhc3MsIEVOR0lORSAqZSwgY29uc3QgY2hhciAqY2VydF9kZXNjcmlwKTsKK1g1MDlfU1RPUkUgKnNldHVwX3ZlcmlmeShCSU8gKmJwLCBjaGFyICpDQWZpbGUsIGNoYXIgKkNBcGF0aCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitFTkdJTkUgKnNldHVwX2VuZ2luZShCSU8gKmVyciwgY29uc3QgY2hhciAqZW5naW5lLCBpbnQgZGVidWcpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19PQ1NQCitPQ1NQX1JFU1BPTlNFICpwcm9jZXNzX3Jlc3BvbmRlcihCSU8gKmVyciwgT0NTUF9SRVFVRVNUICpyZXEsCisJCQljaGFyICpob3N0LCBjaGFyICpwYXRoLCBjaGFyICpwb3J0LCBpbnQgdXNlX3NzbCwKKwkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpoZWFkZXJzLAorCQkJaW50IHJlcV90aW1lb3V0KTsKKyNlbmRpZgorCitpbnQgbG9hZF9jb25maWcoQklPICplcnIsIENPTkYgKmNuZik7CitjaGFyICptYWtlX2NvbmZpZ19uYW1lKHZvaWQpOworCisvKiBGdW5jdGlvbnMgZGVmaW5lZCBpbiBjYS5jIGFuZCBhbHNvIHVzZWQgaW4gb2NzcC5jICovCitpbnQgdW5wYWNrX3JldmluZm8oQVNOMV9USU1FICoqcHJldnRtLCBpbnQgKnByZWFzb24sIEFTTjFfT0JKRUNUICoqcGhvbGQsCisJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqKnBpbnZ0bSwgY29uc3QgY2hhciAqc3RyKTsKKworI2RlZmluZSBEQl90eXBlICAgICAgICAgMAorI2RlZmluZSBEQl9leHBfZGF0ZSAgICAgMQorI2RlZmluZSBEQl9yZXZfZGF0ZSAgICAgMgorI2RlZmluZSBEQl9zZXJpYWwgICAgICAgMyAgICAgICAvKiBpbmRleCAtIHVuaXF1ZSAqLworI2RlZmluZSBEQl9maWxlICAgICAgICAgNCAgICAgICAKKyNkZWZpbmUgREJfbmFtZSAgICAgICAgIDUgICAgICAgLyogaW5kZXggLSB1bmlxdWUgd2hlbiBhY3RpdmUgYW5kIG5vdCBkaXNhYmxlZCAqLworI2RlZmluZSBEQl9OVU1CRVIgICAgICAgNgorCisjZGVmaW5lIERCX1RZUEVfUkVWCSdSJworI2RlZmluZSBEQl9UWVBFX0VYUAknRScKKyNkZWZpbmUgREJfVFlQRV9WQUwJJ1YnCisKK3R5cGVkZWYgc3RydWN0IGRiX2F0dHJfc3QKKwl7CisJaW50IHVuaXF1ZV9zdWJqZWN0OworCX0gREJfQVRUUjsKK3R5cGVkZWYgc3RydWN0IGNhX2RiX3N0CisJeworCURCX0FUVFIgYXR0cmlidXRlczsKKwlUWFRfREIgKmRiOworCX0gQ0FfREI7CisKK0JJR05VTSAqbG9hZF9zZXJpYWwoY2hhciAqc2VyaWFsZmlsZSwgaW50IGNyZWF0ZSwgQVNOMV9JTlRFR0VSICoqcmV0YWkpOworaW50IHNhdmVfc2VyaWFsKGNoYXIgKnNlcmlhbGZpbGUsIGNoYXIgKnN1ZmZpeCwgQklHTlVNICpzZXJpYWwsIEFTTjFfSU5URUdFUiAqKnJldGFpKTsKK2ludCByb3RhdGVfc2VyaWFsKGNoYXIgKnNlcmlhbGZpbGUsIGNoYXIgKm5ld19zdWZmaXgsIGNoYXIgKm9sZF9zdWZmaXgpOworaW50IHJhbmRfc2VyaWFsKEJJR05VTSAqYiwgQVNOMV9JTlRFR0VSICphaSk7CitDQV9EQiAqbG9hZF9pbmRleChjaGFyICpkYmZpbGUsIERCX0FUVFIgKmRiYXR0cik7CitpbnQgaW5kZXhfaW5kZXgoQ0FfREIgKmRiKTsKK2ludCBzYXZlX2luZGV4KGNvbnN0IGNoYXIgKmRiZmlsZSwgY29uc3QgY2hhciAqc3VmZml4LCBDQV9EQiAqZGIpOworaW50IHJvdGF0ZV9pbmRleChjb25zdCBjaGFyICpkYmZpbGUsIGNvbnN0IGNoYXIgKm5ld19zdWZmaXgsIGNvbnN0IGNoYXIgKm9sZF9zdWZmaXgpOwordm9pZCBmcmVlX2luZGV4KENBX0RCICpkYik7CisjZGVmaW5lIGluZGV4X25hbWVfY21wX25vY29uc3QoYSwgYikgXAorCWluZGV4X25hbWVfY21wKChjb25zdCBPUEVOU1NMX0NTVFJJTkcgKilDSEVDS0VEX1BUUl9PRihPUEVOU1NMX1NUUklORywgYSksIFwKKwkoY29uc3QgT1BFTlNTTF9DU1RSSU5HICopQ0hFQ0tFRF9QVFJfT0YoT1BFTlNTTF9TVFJJTkcsIGIpKQoraW50IGluZGV4X25hbWVfY21wKGNvbnN0IE9QRU5TU0xfQ1NUUklORyAqYSwgY29uc3QgT1BFTlNTTF9DU1RSSU5HICpiKTsKK2ludCBwYXJzZV95ZXNubyhjb25zdCBjaGFyICpzdHIsIGludCBkZWYpOworCitYNTA5X05BTUUgKnBhcnNlX25hbWUoY2hhciAqc3RyLCBsb25nIGNodHlwZSwgaW50IG11bHRpcmRuKTsKK2ludCBhcmdzX3ZlcmlmeShjaGFyICoqKnBhcmdzLCBpbnQgKnBhcmdjLAorCQkJaW50ICpiYWRhcmcsIEJJTyAqZXJyLCBYNTA5X1ZFUklGWV9QQVJBTSAqKnBtKTsKK3ZvaWQgcG9saWNpZXNfcHJpbnQoQklPICpvdXQsIFg1MDlfU1RPUkVfQ1RYICpjdHgpOworaW50IGJpb190b19tZW0odW5zaWduZWQgY2hhciAqKm91dCwgaW50IG1heGxlbiwgQklPICppbik7CitpbnQgcGtleV9jdHJsX3N0cmluZyhFVlBfUEtFWV9DVFggKmN0eCwgY2hhciAqdmFsdWUpOworaW50IGluaXRfZ2VuX3N0cihCSU8gKmVyciwgRVZQX1BLRVlfQ1RYICoqcGN0eCwKKwkJCWNvbnN0IGNoYXIgKmFsZ25hbWUsIEVOR0lORSAqZSwgaW50IGRvX3BhcmFtKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKK2V4dGVybiBjaGFyICpwc2tfa2V5OworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSlBBS0UKK3ZvaWQganBha2VfY2xpZW50X2F1dGgoQklPICpvdXQsIEJJTyAqY29ubiwgY29uc3QgY2hhciAqc2VjcmV0KTsKK3ZvaWQganBha2Vfc2VydmVyX2F1dGgoQklPICpvdXQsIEJJTyAqY29ubiwgY29uc3QgY2hhciAqc2VjcmV0KTsKKyNlbmRpZgorCisjZGVmaW5lIEZPUk1BVF9VTkRFRiAgICAwCisjZGVmaW5lIEZPUk1BVF9BU04xICAgICAxCisjZGVmaW5lIEZPUk1BVF9URVhUICAgICAyCisjZGVmaW5lIEZPUk1BVF9QRU0gICAgICAzCisjZGVmaW5lIEZPUk1BVF9ORVRTQ0FQRSA0CisjZGVmaW5lIEZPUk1BVF9QS0NTMTIgICA1CisjZGVmaW5lIEZPUk1BVF9TTUlNRSAgICA2CisjZGVmaW5lIEZPUk1BVF9FTkdJTkUgICA3CisjZGVmaW5lIEZPUk1BVF9JSVNTR0MJOAkvKiBYWFggdGhpcyBzdHVwaWQgbWFjcm8gaGVscHMgdXMgdG8gYXZvaWQKKwkJCQkgKiBhZGRpbmcgeWV0IGFub3RoZXIgcGFyYW0gdG8gbG9hZF8qa2V5KCkgKi8KKyNkZWZpbmUgRk9STUFUX1BFTVJTQQk5CS8qIFBFTSBSU0FQdWJpY0tleSBmb3JtYXQgKi8KKyNkZWZpbmUgRk9STUFUX0FTTjFSU0EJMTAJLyogREVSIFJTQVB1YmljS2V5IGZvcm1hdCAqLworI2RlZmluZSBGT1JNQVRfTVNCTE9CCTExCS8qIE1TIEtleSBibG9iIGZvcm1hdCAqLworI2RlZmluZSBGT1JNQVRfUFZLCTEyCS8qIE1TIFBWSyBmaWxlIGZvcm1hdCAqLworCisjZGVmaW5lIEVYVF9DT1BZX05PTkUJMAorI2RlZmluZSBFWFRfQ09QWV9BREQJMQorI2RlZmluZSBFWFRfQ09QWV9BTEwJMgorCisjZGVmaW5lIE5FVFNDQVBFX0NFUlRfSERSCSJjZXJ0aWZpY2F0ZSIKKworI2RlZmluZSBBUFBfUEFTU19MRU4JMTAyNAorCisjZGVmaW5lIFNFUklBTF9SQU5EX0JJVFMJNjQKKworaW50IGFwcF9pc2Rpcihjb25zdCBjaGFyICopOworaW50IHJhd19yZWFkX3N0ZGluKHZvaWQgKixpbnQpOworaW50IHJhd193cml0ZV9zdGRvdXQoY29uc3Qgdm9pZCAqLGludCk7CisKKyNkZWZpbmUgVE1fU1RBUlQJMAorI2RlZmluZSBUTV9TVE9QCQkxCitkb3VibGUgYXBwX3RtaW50ZXJ2YWwgKGludCBzdG9wLGludCB1c2VydGltZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvYXNuMXBhcnMuYyBiL2xpYi9vcGVuc3NsL2FwcHMvYXNuMXBhcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQ2NWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9hc24xcGFycy5jCkBAIC0wLDAgKzEsNDQ0IEBACisvKiBhcHBzL2FzbjFwYXJzLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogQSBuaWNlIGFkZGl0aW9uIGZyb20gRHIgU3RlcGhlbiBIZW5zb24gPHN0ZXZlQG9wZW5zc2wub3JnPiB0byAKKyAqIGFkZCB0aGUgLXN0cnBhcnNlIG9wdGlvbiB3aGljaCBwYXJzZXMgbmVzdGVkIGJpbmFyeSBzdHJ1Y3R1cmVzCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisvKiAtaW5mb3JtIGFyZwktIGlucHV0IGZvcm1hdCAtIGRlZmF1bHQgUEVNIChERVIgb3IgUEVNKQorICogLWluIGFyZwktIGlucHV0IGZpbGUgLSBkZWZhdWx0IHN0ZGluCisgKiAtaQkJLSBpbmRlbnQgdGhlIGRldGFpbHMgYnkgZGVwdGgKKyAqIC1vZmZzZXQJLSB3aGVyZSBpbiB0aGUgZmlsZSB0byBzdGFydAorICogLWxlbmd0aAktIGhvdyBtYW55IGJ5dGVzIHRvIHVzZQorICogLW9pZCBmaWxlCS0gZXh0cmEgb2lkIGRlc2NyaXB0aW9uIGZpbGUKKyAqLworCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCWFzbjFwYXJzZV9tYWluCisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK3N0YXRpYyBpbnQgZG9fZ2VuZXJhdGUoQklPICpiaW8sIGNoYXIgKmdlbnN0ciwgY2hhciAqZ2VuY29uZiwgQlVGX01FTSAqYnVmKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlpbnQgaSxiYWRvcHM9MCxvZmZzZXQ9MCxyZXQ9MSxqOworCXVuc2lnbmVkIGludCBsZW5ndGg9MDsKKwlsb25nIG51bSx0bXBsZW47CisJQklPICppbj1OVUxMLCpvdXQ9TlVMTCwqYjY0PU5VTEwsICpkZXJvdXQgPSBOVUxMOworCWludCBpbmZvcm1hdCxpbmRlbnQ9MCwgbm9vdXQgPSAwLCBkdW1wID0gMDsKKwljaGFyICppbmZpbGU9TlVMTCwqc3RyPU5VTEwsKnByb2csKm9pZGZpbGU9TlVMTCwgKmRlcmZpbGU9TlVMTDsKKwljaGFyICpnZW5zdHI9TlVMTCwgKmdlbmNvbmY9TlVMTDsKKwl1bnNpZ25lZCBjaGFyICp0bXBidWY7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY3RtcGJ1ZjsKKwlCVUZfTUVNICpidWY9TlVMTDsKKwlTVEFDS19PRihPUEVOU1NMX1NUUklORykgKm9zaz1OVUxMOworCUFTTjFfVFlQRSAqYXQ9TlVMTDsKKworCWluZm9ybWF0PUZPUk1BVF9QRU07CisKKwlhcHBzX3N0YXJ0dXAoKTsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJcHJvZz1hcmd2WzBdOworCWFyZ2MtLTsKKwlhcmd2Kys7CisJaWYgKChvc2s9c2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKSkgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCXdoaWxlIChhcmdjID49IDEpCisJCXsKKwkJaWYgCShzdHJjbXAoKmFyZ3YsIi1pbmZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5mb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWRlcmZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaSIpID09IDApCisJCQl7CisJCQlpbmRlbnQ9MTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbm9vdXQiKSA9PSAwKSBub291dCA9IDE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW9pZCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvaWRmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW9mZnNldCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvZmZzZXQ9IGF0b2koKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbGVuZ3RoIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWxlbmd0aD0gYXRvaSgqKCsrYXJndikpOworCQkJaWYgKGxlbmd0aCA9PSAwKSBnb3RvIGJhZDsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZHVtcCIpID09IDApCisJCQl7CisJCQlkdW1wPSAtMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZGxpbWl0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWR1bXA9IGF0b2koKigrK2FyZ3YpKTsKKwkJCWlmIChkdW1wIDw9IDApIGdvdG8gYmFkOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zdHJwYXJzZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKG9zaywqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1nZW5zdHIiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZ2Vuc3RyPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWdlbmNvbmYiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZ2VuY29uZj0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVua25vd24gb3B0aW9uICVzXG4iLCphcmd2KTsKKwkJCWJhZG9wcz0xOworCQkJYnJlYWs7CisJCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQl9CisKKwlpZiAoYmFkb3BzKQorCQl7CitiYWQ6CisJCUJJT19wcmludGYoYmlvX2VyciwiJXMgW29wdGlvbnNdIDxpbmZpbGVcbiIscHJvZyk7CisJCUJJT19wcmludGYoYmlvX2Vyciwid2hlcmUgb3B0aW9ucyBhcmVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaW5mb3JtIGFyZyAgIGlucHV0IGZvcm1hdCAtIG9uZSBvZiBERVIgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluIGFyZyAgICAgICBpbnB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dCBhcmcgICAgICBvdXRwdXQgZmlsZSAob3V0cHV0IGZvcm1hdCBpcyBhbHdheXMgREVSXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vb3V0IGFyZyAgICBkb24ndCBwcm9kdWNlIGFueSBvdXRwdXRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtb2Zmc2V0IGFyZyAgIG9mZnNldCBpbnRvIGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbGVuZ3RoIGFyZyAgIGxlbmd0aCBvZiBzZWN0aW9uIGluIGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaSAgICAgICAgICAgIGluZGVudCBlbnRyaWVzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWR1bXAgICAgICAgICBkdW1wIHVua25vd24gZGF0YSBpbiBoZXggZm9ybVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1kbGltaXQgYXJnICAgZHVtcCB0aGUgZmlyc3QgYXJnIGJ5dGVzIG9mIHVua25vd24gZGF0YSBpbiBoZXggZm9ybVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vaWQgZmlsZSAgICAgZmlsZSBvZiBleHRyYSBvaWQgZGVmaW5pdGlvbnNcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtc3RycGFyc2Ugb2Zmc2V0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICBhIHNlcmllcyBvZiB0aGVzZSBjYW4gYmUgdXNlZCB0byAnZGlnJyBpbnRvIG11bHRpcGxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICBBU04xIGJsb2Igd3JhcHBpbmdzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWdlbnN0ciBzdHIgICBzdHJpbmcgdG8gZ2VuZXJhdGUgQVNOMSBzdHJ1Y3R1cmUgZnJvbVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1nZW5jb25mIGZpbGUgZmlsZSB0byBnZW5lcmF0ZSBBU04xIHN0cnVjdHVyZSBmcm9tXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAoKGluID09IE5VTEwpIHx8IChvdXQgPT0gTlVMTCkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKwlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCXsKKwlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJfQorI2VuZGlmCisKKwlpZiAob2lkZmlsZSAhPSBOVUxMKQorCQl7CisJCWlmIChCSU9fcmVhZF9maWxlbmFtZShpbixvaWRmaWxlKSA8PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJwcm9ibGVtcyBvcGVuaW5nICVzXG4iLG9pZGZpbGUpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlPQkpfY3JlYXRlX29iamVjdHMoaW4pOworCQl9CisKKwlpZiAoaW5maWxlID09IE5VTEwpCisJCUJJT19zZXRfZnAoaW4sc3RkaW4sQklPX05PQ0xPU0UpOworCWVsc2UKKwkJeworCQlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4saW5maWxlKSA8PSAwKQorCQkJeworCQkJcGVycm9yKGluZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJaWYgKGRlcmZpbGUpIHsKKwkJaWYoIShkZXJvdXQgPSBCSU9fbmV3X2ZpbGUoZGVyZmlsZSwgIndiIikpKSB7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInByb2JsZW1zIG9wZW5pbmcgJXNcbiIsZGVyZmlsZSk7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisKKwlpZiAoKGJ1Zj1CVUZfTUVNX25ldygpKSA9PSBOVUxMKSBnb3RvIGVuZDsKKwlpZiAoIUJVRl9NRU1fZ3JvdyhidWYsQlVGU0laKjgpKSBnb3RvIGVuZDsgLyogUHJlLWFsbG9jYXRlIDotKSAqLworCisJaWYgKGdlbnN0ciB8fCBnZW5jb25mKQorCQl7CisJCW51bSA9IGRvX2dlbmVyYXRlKGJpb19lcnIsIGdlbnN0ciwgZ2VuY29uZiwgYnVmKTsKKwkJaWYgKG51bSA8IDApCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWVsc2UKKwkJeworCisJCWlmIChpbmZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQkJeworCQkJQklPICp0bXA7CisKKwkJCWlmICgoYjY0PUJJT19uZXcoQklPX2ZfYmFzZTY0KCkpKSA9PSBOVUxMKQorCQkJCWdvdG8gZW5kOworCQkJQklPX3B1c2goYjY0LGluKTsKKwkJCXRtcD1pbjsKKwkJCWluPWI2NDsKKwkJCWI2ND10bXA7CisJCQl9CisKKwkJbnVtPTA7CisJCWZvciAoOzspCisJCQl7CisJCQlpZiAoIUJVRl9NRU1fZ3JvdyhidWYsKGludCludW0rQlVGU0laKSkgZ290byBlbmQ7CisJCQlpPUJJT19yZWFkKGluLCYoYnVmLT5kYXRhW251bV0pLEJVRlNJWik7CisJCQlpZiAoaSA8PSAwKSBicmVhazsKKwkJCW51bSs9aTsKKwkJCX0KKwkJfQorCXN0cj1idWYtPmRhdGE7CisKKwkvKiBJZiBhbnkgc3RydWN0cyB0byBwYXJzZSBnbyB0aHJvdWdoIGluIHNlcXVlbmNlICovCisKKwlpZiAoc2tfT1BFTlNTTF9TVFJJTkdfbnVtKG9zaykpCisJCXsKKwkJdG1wYnVmPSh1bnNpZ25lZCBjaGFyICopc3RyOworCQl0bXBsZW49bnVtOworCQlmb3IgKGk9MDsgaTxza19PUEVOU1NMX1NUUklOR19udW0ob3NrKTsgaSsrKQorCQkJeworCQkJQVNOMV9UWVBFICphdG1wOworCQkJaW50IHR5cDsKKwkJCWo9YXRvaShza19PUEVOU1NMX1NUUklOR192YWx1ZShvc2ssaSkpOworCQkJaWYgKGogPT0gMCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCInJXMnIGlzIGFuIGludmFsaWQgbnVtYmVyXG4iLHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKG9zayxpKSk7CisJCQkJY29udGludWU7CisJCQkJfQorCQkJdG1wYnVmKz1qOworCQkJdG1wbGVuLT1qOworCQkJYXRtcCA9IGF0OworCQkJY3RtcGJ1ZiA9IHRtcGJ1ZjsKKwkJCWF0ID0gZDJpX0FTTjFfVFlQRShOVUxMLCZjdG1wYnVmLHRtcGxlbik7CisJCQlBU04xX1RZUEVfZnJlZShhdG1wKTsKKwkJCWlmKCFhdCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJFcnJvciBwYXJzaW5nIHN0cnVjdHVyZVxuIik7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl0eXAgPSBBU04xX1RZUEVfZ2V0KGF0KTsKKwkJCWlmICgodHlwID09IFZfQVNOMV9PQkpFQ1QpCisJCQkJfHwgKHR5cCA9PSBWX0FTTjFfTlVMTCkpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkNhbid0IHBhcnNlICVzIHR5cGVcbiIsCisJCQkJCXR5cCA9PSBWX0FTTjFfTlVMTCA/ICJOVUxMIiA6ICJPQkpFQ1QiKTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCS8qIGhtbS4uLiB0aGlzIGlzIGEgbGl0dGxlIGV2aWwgYnV0IGl0IHdvcmtzICovCisJCQl0bXBidWY9YXQtPnZhbHVlLmFzbjFfc3RyaW5nLT5kYXRhOworCQkJdG1wbGVuPWF0LT52YWx1ZS5hc24xX3N0cmluZy0+bGVuZ3RoOworCQkJfQorCQlzdHI9KGNoYXIgKil0bXBidWY7CisJCW51bT10bXBsZW47CisJCX0KKworCWlmIChvZmZzZXQgPj0gbnVtKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yOiBvZmZzZXQgdG9vIGxhcmdlXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCW51bSAtPSBvZmZzZXQ7CisKKwlpZiAoKGxlbmd0aCA9PSAwKSB8fCAoKGxvbmcpbGVuZ3RoID4gbnVtKSkgbGVuZ3RoPSh1bnNpZ25lZCBpbnQpbnVtOworCWlmKGRlcm91dCkgeworCQlpZihCSU9fd3JpdGUoZGVyb3V0LCBzdHIgKyBvZmZzZXQsIGxlbmd0aCkgIT0gKGludClsZW5ndGgpIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHdyaXRpbmcgb3V0cHV0XG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKwlpZiAoIW5vb3V0ICYmCisJICAgICFBU04xX3BhcnNlX2R1bXAob3V0LCh1bnNpZ25lZCBjaGFyICopJihzdHJbb2Zmc2V0XSksbGVuZ3RoLAorCQkgICAgaW5kZW50LGR1bXApKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisJcmV0PTA7CitlbmQ6CisJQklPX2ZyZWUoZGVyb3V0KTsKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCWlmIChvdXQgIT0gTlVMTCkgQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKGI2NCAhPSBOVUxMKSBCSU9fZnJlZShiNjQpOworCWlmIChyZXQgIT0gMCkKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwlpZiAoYnVmICE9IE5VTEwpIEJVRl9NRU1fZnJlZShidWYpOworCWlmIChhdCAhPSBOVUxMKSBBU04xX1RZUEVfZnJlZShhdCk7CisJaWYgKG9zayAhPSBOVUxMKSBza19PUEVOU1NMX1NUUklOR19mcmVlKG9zayk7CisJT0JKX2NsZWFudXAoKTsKKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQorCitzdGF0aWMgaW50IGRvX2dlbmVyYXRlKEJJTyAqYmlvLCBjaGFyICpnZW5zdHIsIGNoYXIgKmdlbmNvbmYsIEJVRl9NRU0gKmJ1ZikKKwl7CisJQ09ORiAqY25mID0gTlVMTDsKKwlpbnQgbGVuOworCWxvbmcgZXJybGluZTsKKwl1bnNpZ25lZCBjaGFyICpwOworCUFTTjFfVFlQRSAqYXR5cCA9IE5VTEw7CisKKwlpZiAoZ2VuY29uZikKKwkJeworCQljbmYgPSBOQ09ORl9uZXcoTlVMTCk7CisJCWlmICghTkNPTkZfbG9hZChjbmYsIGdlbmNvbmYsICZlcnJsaW5lKSkKKwkJCWdvdG8gY29uZmVycjsKKwkJaWYgKCFnZW5zdHIpCisJCQlnZW5zdHIgPSBOQ09ORl9nZXRfc3RyaW5nKGNuZiwgImRlZmF1bHQiLCAiYXNuMSIpOworCQlpZiAoIWdlbnN0cikKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvLCAiQ2FuJ3QgZmluZCAnYXNuMScgaW4gJyVzJ1xuIiwgZ2VuY29uZik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJYXR5cCA9IEFTTjFfZ2VuZXJhdGVfbmNvbmYoZ2Vuc3RyLCBjbmYpOworCU5DT05GX2ZyZWUoY25mKTsKKworCWlmICghYXR5cCkKKwkJcmV0dXJuIC0xOworCisJbGVuID0gaTJkX0FTTjFfVFlQRShhdHlwLCBOVUxMKTsKKworCWlmIChsZW4gPD0gMCkKKwkJZ290byBlcnI7CisKKwlpZiAoIUJVRl9NRU1fZ3JvdyhidWYsbGVuKSkKKwkJZ290byBlcnI7CisKKwlwPSh1bnNpZ25lZCBjaGFyICopYnVmLT5kYXRhOworCisJaTJkX0FTTjFfVFlQRShhdHlwLCAmcCk7CisKKwlBU04xX1RZUEVfZnJlZShhdHlwKTsKKwlyZXR1cm4gbGVuOworCisJY29uZmVycjoKKworCWlmIChlcnJsaW5lID4gMCkKKwkJQklPX3ByaW50ZihiaW8sICJFcnJvciBvbiBsaW5lICVsZCBvZiBjb25maWcgZmlsZSAnJXMnXG4iLAorCQkJCQkJCWVycmxpbmUsIGdlbmNvbmYpOworCWVsc2UKKwkJQklPX3ByaW50ZihiaW8sICJFcnJvciBsb2FkaW5nIGNvbmZpZyBmaWxlICclcydcbiIsIGdlbmNvbmYpOworCisJZXJyOgorCU5DT05GX2ZyZWUoY25mKTsKKwlBU04xX1RZUEVfZnJlZShhdHlwKTsKKworCXJldHVybiAtMTsKKworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvY2EtY2VydC5zcmwgYi9saWIvb3BlbnNzbC9hcHBzL2NhLWNlcnQuc3JsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNzQ1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2NhLWNlcnQuc3JsCkBAIC0wLDAgKzEgQEAKKzA3CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2NhLWtleS5wZW0gYi9saWIvb3BlbnNzbC9hcHBzL2NhLWtleS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1MjBiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvY2Eta2V5LnBlbQpAQCAtMCwwICsxLDE1IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWFFJQkFBS0JnUUNqdTZQTGRkZWxUK25JTW0wN0dRd21ZYS9lWjJKV2JzbXQyZ290U0NxTTdhc0ZwNDI1CitneFNLNGpxaGhUNjJVUHBxREJFd3ZRK2ZZa1Z2M1JWMHI5UmV1Wkd2MTJOb1M0ZlhzUWdxTzE3bEhBN09kMEtkCisyeU53SmpLaDQ0TXhQS0R0Mm84aVFNeVpFMHpsSG5FRk5wc1A0Q09MVEROQzZsakVFdTViazh1UHNRSURBUUFCCitBb0dBVlptcEZac0RaZnIwbDJTOXRMTHdwalJXTk9sS0FUUWtubzZxMldlc1QwZUdMUXVmVGNpWStjOHlwZlU2CitoeWlvOHI1aVVsL1ZoaGRqaEF0S3gxbVJwaW90ZnRIby9lWWY4cnRzcm5wck9uV0cwYldqTGp0SW9NYmN4R24yCitKM2JONkxKbWJKTWpEczBlSjNLblR1NjQ2RjNuRFV3Mm9HQXdtcHpLWEExS0FQMENRUURSdlFoeGsyRDNQZWhzCitIdkc2NjV1MnBCNWlwWVFuZ0VGbFpPN1JISlp6Sk9aRVdTTHV1TXFhRi83cFRmQTVqaUJ2V3FDZ0plQ1JSSW5MCisyMXJ1NGRsUEFrRUF4OWpqN0JnS241VFluTW9CU1NlMGFmanNWOW9BcFZwTjFOYWNiMVlEdEN3eStzY3AzKytzCituRnhsdjk4d3hJbFNkcHdNVW4rQVVXZmppV1I3VHUvRy93SkJBSi9LandaSXJGVnhld1AweDJJTFlzVFJZTHp6CitNUzRQRHNPN0ZCK0kwaTdEYkJPaWZYUzJvTlNwZDNJMENOTXdyeEZuVUh6eW5wYk9TdFZmTjNaTDV3MENRUUNhCitwd0ZhaHhCUmhrSktzeGhqb0ZKQlg5eWw3NUpvWTRXdm01VGJvOWloNlVKYVJ4M2txZmtOMTRMMkJLWWNzWmdiCitLWTl2bURPWXk2aU5makRlV1RmSkFrQmtmUFViOG9USi9uU1A1ek42c3FHeFNZNGtyYzR4THhwUm14b0o4SEwyCitYZmhxWGtUemJVMTNSWDlKSi9OWjh2UU45Vm0yTmh4UkdKb2NRa21jZFZ0SgorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvY2EtcmVxLnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvY2EtcmVxLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2JmN2VjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9jYS1yZXEucGVtCkBAIC0wLDAgKzEsMTEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCitNSUlCbVRDQ0FRSUNBUUF3V3pFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbEYxWldWdWMyeGhibVF4CitHakFZQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNUnN3R1FZRFZRUURFeEpVWlhOMElFTkJJQ2d4CitNREkwSUdKcGRDa3dnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBS083bzh0MTE2VlA2Y2d5CitiVHNaRENaaHI5NW5ZbFp1eWEzYUNpMUlLb3p0cXdXbmpibURGSXJpT3FHRlByWlErbW9NRVRDOUQ1OWlSVy9kCitGWFN2MUY2NWthL1hZMmhMaDlleENDbzdYdVVjRHM1M1FwM2JJM0FtTXFIamd6RThvTzNhanlKQXpKa1RUT1VlCitjUVUybXcvZ0k0dE1NMExxV01RUzdsdVR5NCt4QWdNQkFBRXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFLbGs3CitjeHU5Z0NKTjMvaVFGeUpYUTZZcGhhaVFBVDVWQlhUeDlmdFJyUUlqQTN2eGxEelBXR0R5K1Y1VHFhN2g4UHRSCis1Qm4wMEpTaElJMnpmMGhqeWpLaWxzNngvVWtXbWpFaXdTaUZwNGhSNzBpRThYd1NORUhZMlA2ajZuUUVJcGdXCitrYmZnbW1VcWs3ZGwyVitvc3NUSjgwQjhTQnBFaHJuODFWL2NIeEE9CistLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvY2EuYyBiL2xpYi9vcGVuc3NsL2FwcHMvY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjhiMGVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9jYS5jCkBAIC0wLDAgKzEsMjk4NSBAQAorLyogYXBwcy9jYS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIFRoZSBQUEtJIHN0dWZmIGhhcyBiZWVuIGRvbmF0ZWQgYnkgSmVmZiBCYXJiZXIgPGplZmZiQGlzc2wuYXRsLmhwLmNvbT4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdHh0X2RiLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2NzcC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKyNpZm5kZWYgV19PSworIyAgaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisjICAgIGlmIGRlZmluZWQoX19ERUNDKQorIyAgICAgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgICBlbHNlCisjICAgICAgaW5jbHVkZSA8dW5peGxpYi5oPgorIyAgICBlbmRpZgorIyAgZWxpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19WWFdPUktTKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKQorIyAgICBpbmNsdWRlIDxzeXMvZmlsZS5oPgorIyAgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAiYXBwcy5oIgorCisjaWZuZGVmIFdfT0sKKyMgIGRlZmluZSBGX09LIDAKKyMgIGRlZmluZSBYX09LIDEKKyMgIGRlZmluZSBXX09LIDIKKyMgIGRlZmluZSBSX09LIDQKKyNlbmRpZgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HIGNhX21haW4KKworI2RlZmluZSBCQVNFX1NFQ1RJT04JImNhIgorI2RlZmluZSBDT05GSUdfRklMRSAib3BlbnNzbC5jbmYiCisKKyNkZWZpbmUgRU5WX0RFRkFVTFRfQ0EJCSJkZWZhdWx0X2NhIgorCisjZGVmaW5lIFNUUklOR19NQVNLCSJzdHJpbmdfbWFzayIKKyNkZWZpbmUgVVRGOF9JTgkJCSJ1dGY4IgorCisjZGVmaW5lIEVOVl9ESVIJCQkiZGlyIgorI2RlZmluZSBFTlZfQ0VSVFMJCSJjZXJ0cyIKKyNkZWZpbmUgRU5WX0NSTF9ESVIJCSJjcmxfZGlyIgorI2RlZmluZSBFTlZfQ0FfREIJCSJDQV9EQiIKKyNkZWZpbmUgRU5WX05FV19DRVJUU19ESVIJIm5ld19jZXJ0c19kaXIiCisjZGVmaW5lIEVOVl9DRVJUSUZJQ0FURSAJImNlcnRpZmljYXRlIgorI2RlZmluZSBFTlZfU0VSSUFMCQkic2VyaWFsIgorI2RlZmluZSBFTlZfQ1JMTlVNQkVSCQkiY3JsbnVtYmVyIgorI2RlZmluZSBFTlZfQ1JMCQkJImNybCIKKyNkZWZpbmUgRU5WX1BSSVZBVEVfS0VZCQkicHJpdmF0ZV9rZXkiCisjZGVmaW5lIEVOVl9SQU5ERklMRQkJIlJBTkRGSUxFIgorI2RlZmluZSBFTlZfREVGQVVMVF9EQVlTIAkiZGVmYXVsdF9kYXlzIgorI2RlZmluZSBFTlZfREVGQVVMVF9TVEFSVERBVEUgCSJkZWZhdWx0X3N0YXJ0ZGF0ZSIKKyNkZWZpbmUgRU5WX0RFRkFVTFRfRU5EREFURSAJImRlZmF1bHRfZW5kZGF0ZSIKKyNkZWZpbmUgRU5WX0RFRkFVTFRfQ1JMX0RBWVMgCSJkZWZhdWx0X2NybF9kYXlzIgorI2RlZmluZSBFTlZfREVGQVVMVF9DUkxfSE9VUlMgCSJkZWZhdWx0X2NybF9ob3VycyIKKyNkZWZpbmUgRU5WX0RFRkFVTFRfTUQJCSJkZWZhdWx0X21kIgorI2RlZmluZSBFTlZfREVGQVVMVF9FTUFJTF9ETgkiZW1haWxfaW5fZG4iCisjZGVmaW5lIEVOVl9QUkVTRVJWRQkJInByZXNlcnZlIgorI2RlZmluZSBFTlZfUE9MSUNZICAgICAgCSJwb2xpY3kiCisjZGVmaW5lIEVOVl9FWFRFTlNJT05TICAgICAgCSJ4NTA5X2V4dGVuc2lvbnMiCisjZGVmaW5lIEVOVl9DUkxFWFQgICAgICAJImNybF9leHRlbnNpb25zIgorI2RlZmluZSBFTlZfTVNJRV9IQUNLCQkibXNpZV9oYWNrIgorI2RlZmluZSBFTlZfTkFNRU9QVAkJIm5hbWVfb3B0IgorI2RlZmluZSBFTlZfQ0VSVE9QVAkJImNlcnRfb3B0IgorI2RlZmluZSBFTlZfRVhUQ09QWQkJImNvcHlfZXh0ZW5zaW9ucyIKKyNkZWZpbmUgRU5WX1VOSVFVRV9TVUJKRUNUCSJ1bmlxdWVfc3ViamVjdCIKKworI2RlZmluZSBFTlZfREFUQUJBU0UJCSJkYXRhYmFzZSIKKworLyogQWRkaXRpb25hbCByZXZvY2F0aW9uIGluZm9ybWF0aW9uIHR5cGVzICovCisKKyNkZWZpbmUgUkVWX05PTkUJCTAJLyogTm8gYWRkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUkVWX0NSTF9SRUFTT04JCTEJLyogVmFsdWUgaXMgQ1JMIHJlYXNvbiBjb2RlICovCisjZGVmaW5lIFJFVl9IT0xECQkyCS8qIFZhbHVlIGlzIGhvbGQgaW5zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgUkVWX0tFWV9DT01QUk9NSVNFCTMJLyogVmFsdWUgaXMgY2VydCBrZXkgY29tcHJvbWlzZSB0aW1lICovCisjZGVmaW5lIFJFVl9DQV9DT01QUk9NSVNFCTQJLyogVmFsdWUgaXMgQ0Ega2V5IGNvbXByb21pc2UgdGltZSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqY2FfdXNhZ2VbXT17CisidXNhZ2U6IGNhIGFyZ3NcbiIsCisiXG4iLAorIiAtdmVyYm9zZSAgICAgICAgLSBUYWxrIGFsb3Qgd2hpbGUgZG9pbmcgdGhpbmdzXG4iLAorIiAtY29uZmlnIGZpbGUgICAgLSBBIGNvbmZpZyBmaWxlXG4iLAorIiAtbmFtZSBhcmcgICAgICAgLSBUaGUgcGFydGljdWxhciBDQSBkZWZpbml0aW9uIHRvIHVzZVxuIiwKKyIgLWdlbmNybCAgICAgICAgIC0gR2VuZXJhdGUgYSBuZXcgQ1JMXG4iLAorIiAtY3JsZGF5cyBkYXlzICAgLSBEYXlzIGlzIHdoZW4gdGhlIG5leHQgQ1JMIGlzIGR1ZVxuIiwKKyIgLWNybGhvdXJzIGhvdXJzIC0gSG91cnMgaXMgd2hlbiB0aGUgbmV4dCBDUkwgaXMgZHVlXG4iLAorIiAtc3RhcnRkYXRlIFlZTU1EREhITU1TU1ogIC0gY2VydGlmaWNhdGUgdmFsaWRpdHkgbm90QmVmb3JlXG4iLAorIiAtZW5kZGF0ZSBZWU1NRERISE1NU1NaICAgIC0gY2VydGlmaWNhdGUgdmFsaWRpdHkgbm90QWZ0ZXIgKG92ZXJyaWRlcyAtZGF5cylcbiIsCisiIC1kYXlzIGFyZyAgICAgICAtIG51bWJlciBvZiBkYXlzIHRvIGNlcnRpZnkgdGhlIGNlcnRpZmljYXRlIGZvclxuIiwKKyIgLW1kIGFyZyAgICAgICAgIC0gbWQgdG8gdXNlLCBvbmUgb2YgbWQyLCBtZDUsIHNoYSBvciBzaGExXG4iLAorIiAtcG9saWN5IGFyZyAgICAgLSBUaGUgQ0EgJ3BvbGljeScgdG8gc3VwcG9ydFxuIiwKKyIgLWtleWZpbGUgYXJnICAgIC0gcHJpdmF0ZSBrZXkgZmlsZVxuIiwKKyIgLWtleWZvcm0gYXJnICAgIC0gcHJpdmF0ZSBrZXkgZmlsZSBmb3JtYXQgKFBFTSBvciBFTkdJTkUpXG4iLAorIiAta2V5IGFyZyAgICAgICAgLSBrZXkgdG8gZGVjb2RlIHRoZSBwcml2YXRlIGtleSBpZiBpdCBpcyBlbmNyeXB0ZWRcbiIsCisiIC1jZXJ0IGZpbGUgICAgICAtIFRoZSBDQSBjZXJ0aWZpY2F0ZVxuIiwKKyIgLXNlbGZzaWduICAgICAgIC0gc2lnbiBhIGNlcnRpZmljYXRlIHdpdGggdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggaXRcbiIsCisiIC1pbiBmaWxlICAgICAgICAtIFRoZSBpbnB1dCBQRU0gZW5jb2RlZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0KHMpXG4iLAorIiAtb3V0IGZpbGUgICAgICAgLSBXaGVyZSB0byBwdXQgdGhlIG91dHB1dCBmaWxlKHMpXG4iLAorIiAtb3V0ZGlyIGRpciAgICAgLSBXaGVyZSB0byBwdXQgb3V0cHV0IGNlcnRpZmljYXRlc1xuIiwKKyIgLWluZmlsZXMgLi4uLiAgIC0gVGhlIGxhc3QgYXJndW1lbnQsIHJlcXVlc3RzIHRvIHByb2Nlc3NcbiIsCisiIC1zcGthYyBmaWxlICAgICAtIEZpbGUgY29udGFpbnMgRE4gYW5kIHNpZ25lZCBwdWJsaWMga2V5IGFuZCBjaGFsbGVuZ2VcbiIsCisiIC1zc19jZXJ0IGZpbGUgICAtIEZpbGUgY29udGFpbnMgYSBzZWxmIHNpZ25lZCBjZXJ0IHRvIHNpZ25cbiIsCisiIC1wcmVzZXJ2ZUROICAgICAtIERvbid0IHJlLW9yZGVyIHRoZSBETlxuIiwKKyIgLW5vZW1haWxETiAgICAgIC0gRG9uJ3QgYWRkIHRoZSBFTUFJTCBmaWVsZCBpbnRvIGNlcnRpZmljYXRlJyBzdWJqZWN0XG4iLAorIiAtYmF0Y2ggICAgICAgICAgLSBEb24ndCBhc2sgcXVlc3Rpb25zXG4iLAorIiAtbXNpZV9oYWNrICAgICAgLSBtc2llIG1vZGlmaWNhdGlvbnMgdG8gaGFuZGxlIGFsbCB0aG9zZSB1bml2ZXJzYWwgc3RyaW5nc1xuIiwKKyIgLXJldm9rZSBmaWxlICAgIC0gUmV2b2tlIGEgY2VydGlmaWNhdGUgKGdpdmVuIGluIGZpbGUpXG4iLAorIiAtc3ViaiBhcmcgICAgICAgLSBVc2UgYXJnIGluc3RlYWQgb2YgcmVxdWVzdCdzIHN1YmplY3RcbiIsCisiIC11dGY4ICAgICAgICAgICAtIGlucHV0IGNoYXJhY3RlcnMgYXJlIFVURjggKGRlZmF1bHQgQVNDSUkpXG4iLAorIiAtbXVsdGl2YWx1ZS1yZG4gLSBlbmFibGUgc3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgUkROc1xuIiwKKyIgLWV4dGVuc2lvbnMgLi4gIC0gRXh0ZW5zaW9uIHNlY3Rpb24gKG92ZXJyaWRlIHZhbHVlIGluIGNvbmZpZyBmaWxlKVxuIiwKKyIgLWV4dGZpbGUgZmlsZSAgIC0gQ29uZmlndXJhdGlvbiBmaWxlIHdpdGggWDUwOXYzIGV4dGVudGlvbnMgdG8gYWRkXG4iLAorIiAtY3JsZXh0cyAuLiAgICAgLSBDUkwgZXh0ZW5zaW9uIHNlY3Rpb24gKG92ZXJyaWRlIHZhbHVlIGluIGNvbmZpZyBmaWxlKVxuIiwKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyIgLWVuZ2luZSBlICAgICAgIC0gdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIsCisjZW5kaWYKKyIgLXN0YXR1cyBzZXJpYWwgIC0gU2hvd3MgY2VydGlmaWNhdGUgc3RhdHVzIGdpdmVuIHRoZSBzZXJpYWwgbnVtYmVyXG4iLAorIiAtdXBkYXRlZGIgICAgICAgLSBVcGRhdGVzIGRiIGZvciBleHBpcmVkIGNlcnRpZmljYXRlc1xuIiwKK05VTEwKK307CisKKyNpZmRlZiBFRkVOQ0UKK2V4dGVybiBpbnQgRUZfUFJPVEVDVF9GUkVFOworZXh0ZXJuIGludCBFRl9QUk9URUNUX0JFTE9XOworZXh0ZXJuIGludCBFRl9BTElHTk1FTlQ7CisjZW5kaWYKKworc3RhdGljIHZvaWQgbG9va3VwX2ZhaWwoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdGFnKTsKK3N0YXRpYyBpbnQgY2VydGlmeShYNTA5ICoqeHJldCwgY2hhciAqaW5maWxlLEVWUF9QS0VZICpwa2V5LFg1MDkgKng1MDksCisJCSAgIGNvbnN0IEVWUF9NRCAqZGdzdCxTVEFDS19PRihDT05GX1ZBTFVFKSAqcG9saWN5LENBX0RCICpkYiwKKwkJICAgQklHTlVNICpzZXJpYWwsIGNoYXIgKnN1YmosdW5zaWduZWQgbG9uZyBjaHR5cGUsIGludCBtdWx0aXJkbiwgaW50IGVtYWlsX2RuLCBjaGFyICpzdGFydGRhdGUsCisJCSAgIGNoYXIgKmVuZGRhdGUsIGxvbmcgZGF5cywgaW50IGJhdGNoLCBjaGFyICpleHRfc2VjdCwgQ09ORiAqY29uZiwKKwkJICAgaW50IHZlcmJvc2UsIHVuc2lnbmVkIGxvbmcgY2VydG9wdCwgdW5zaWduZWQgbG9uZyBuYW1lb3B0LAorCQkgICBpbnQgZGVmYXVsdF9vcCwgaW50IGV4dF9jb3B5LCBpbnQgc2VsZnNpZ24pOworc3RhdGljIGludCBjZXJ0aWZ5X2NlcnQoWDUwOSAqKnhyZXQsIGNoYXIgKmluZmlsZSxFVlBfUEtFWSAqcGtleSxYNTA5ICp4NTA5LAorCQkJY29uc3QgRVZQX01EICpkZ3N0LFNUQUNLX09GKENPTkZfVkFMVUUpICpwb2xpY3ksCisJCQlDQV9EQiAqZGIsIEJJR05VTSAqc2VyaWFsLCBjaGFyICpzdWJqLHVuc2lnbmVkIGxvbmcgY2h0eXBlLCBpbnQgbXVsdGlyZG4sIGludCBlbWFpbF9kbiwKKwkJCWNoYXIgKnN0YXJ0ZGF0ZSwgY2hhciAqZW5kZGF0ZSwgbG9uZyBkYXlzLCBpbnQgYmF0Y2gsCisJCQljaGFyICpleHRfc2VjdCwgQ09ORiAqY29uZixpbnQgdmVyYm9zZSwgdW5zaWduZWQgbG9uZyBjZXJ0b3B0LAorCQkJdW5zaWduZWQgbG9uZyBuYW1lb3B0LCBpbnQgZGVmYXVsdF9vcCwgaW50IGV4dF9jb3B5LAorCQkJRU5HSU5FICplKTsKK3N0YXRpYyBpbnQgY2VydGlmeV9zcGthYyhYNTA5ICoqeHJldCwgY2hhciAqaW5maWxlLEVWUF9QS0VZICpwa2V5LFg1MDkgKng1MDksCisJCQkgY29uc3QgRVZQX01EICpkZ3N0LFNUQUNLX09GKENPTkZfVkFMVUUpICpwb2xpY3ksCisJCQkgQ0FfREIgKmRiLCBCSUdOVU0gKnNlcmlhbCxjaGFyICpzdWJqLHVuc2lnbmVkIGxvbmcgY2h0eXBlLCBpbnQgbXVsdGlyZG4sIGludCBlbWFpbF9kbiwKKwkJCSBjaGFyICpzdGFydGRhdGUsIGNoYXIgKmVuZGRhdGUsIGxvbmcgZGF5cywgY2hhciAqZXh0X3NlY3QsCisJCQkgQ09ORiAqY29uZiwgaW50IHZlcmJvc2UsIHVuc2lnbmVkIGxvbmcgY2VydG9wdCwgCisJCQkgdW5zaWduZWQgbG9uZyBuYW1lb3B0LCBpbnQgZGVmYXVsdF9vcCwgaW50IGV4dF9jb3B5KTsKK3N0YXRpYyB2b2lkIHdyaXRlX25ld19jZXJ0aWZpY2F0ZShCSU8gKmJwLCBYNTA5ICp4LCBpbnQgb3V0cHV0X2RlciwgaW50IG5vdGV4dCk7CitzdGF0aWMgaW50IGRvX2JvZHkoWDUwOSAqKnhyZXQsIEVWUF9QS0VZICpwa2V5LCBYNTA5ICp4NTA5LCBjb25zdCBFVlBfTUQgKmRnc3QsCisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnBvbGljeSwgQ0FfREIgKmRiLCBCSUdOVU0gKnNlcmlhbCxjaGFyICpzdWJqLHVuc2lnbmVkIGxvbmcgY2h0eXBlLCBpbnQgbXVsdGlyZG4sCisJaW50IGVtYWlsX2RuLCBjaGFyICpzdGFydGRhdGUsIGNoYXIgKmVuZGRhdGUsIGxvbmcgZGF5cywgaW50IGJhdGNoLAorICAgICAgIAlpbnQgdmVyYm9zZSwgWDUwOV9SRVEgKnJlcSwgY2hhciAqZXh0X3NlY3QsIENPTkYgKmNvbmYsCisJdW5zaWduZWQgbG9uZyBjZXJ0b3B0LCB1bnNpZ25lZCBsb25nIG5hbWVvcHQsIGludCBkZWZhdWx0X29wLAorCWludCBleHRfY29weSwgaW50IHNlbGZzaWduKTsKK3N0YXRpYyBpbnQgZG9fcmV2b2tlKFg1MDkgKng1MDksIENBX0RCICpkYiwgaW50IGV4dCwgY2hhciAqZXh0dmFsKTsKK3N0YXRpYyBpbnQgZ2V0X2NlcnRpZmljYXRlX3N0YXR1cyhjb25zdCBjaGFyICpzZXJfc3RhdHVzLCBDQV9EQiAqZGIpOworc3RhdGljIGludCBkb191cGRhdGVkYihDQV9EQiAqZGIpOworc3RhdGljIGludCBjaGVja190aW1lX2Zvcm1hdChjb25zdCBjaGFyICpzdHIpOworY2hhciAqbWFrZV9yZXZvY2F0aW9uX3N0cihpbnQgcmV2X3R5cGUsIGNoYXIgKnJldl9hcmcpOworaW50IG1ha2VfcmV2b2tlZChYNTA5X1JFVk9LRUQgKnJldiwgY29uc3QgY2hhciAqc3RyKTsKK2ludCBvbGRfZW50cnlfcHJpbnQoQklPICpicCwgQVNOMV9PQkpFQ1QgKm9iaiwgQVNOMV9TVFJJTkcgKnN0cik7CitzdGF0aWMgQ09ORiAqY29uZj1OVUxMOworc3RhdGljIENPTkYgKmV4dGNvbmY9TlVMTDsKK3N0YXRpYyBjaGFyICpzZWN0aW9uPU5VTEw7CisKK3N0YXRpYyBpbnQgcHJlc2VydmU9MDsKK3N0YXRpYyBpbnQgbXNpZV9oYWNrPTA7CisKKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlFTkdJTkUgKmUgPSBOVUxMOworCWNoYXIgKmtleT1OVUxMLCpwYXNzYXJnaW49TlVMTDsKKwlpbnQgY3JlYXRlX3NlciA9IDA7CisJaW50IGZyZWVfa2V5ID0gMDsKKwlpbnQgdG90YWw9MDsKKwlpbnQgdG90YWxfZG9uZT0wOworCWludCBiYWRvcHM9MDsKKwlpbnQgcmV0PTE7CisJaW50IGVtYWlsX2RuPTE7CisJaW50IHJlcT0wOworCWludCB2ZXJib3NlPTA7CisJaW50IGdlbmNybD0wOworCWludCBkb3Jldm9rZT0wOworCWludCBkb3VwZGF0ZWRiPTA7CisJbG9uZyBjcmxkYXlzPTA7CisJbG9uZyBjcmxob3Vycz0wOworCWxvbmcgY3Jsc2VjPTA7CisJbG9uZyBlcnJvcmxpbmU9IC0xOworCWNoYXIgKmNvbmZpZ2ZpbGU9TlVMTDsKKwljaGFyICptZD1OVUxMOworCWNoYXIgKnBvbGljeT1OVUxMOworCWNoYXIgKmtleWZpbGU9TlVMTDsKKwljaGFyICpjZXJ0ZmlsZT1OVUxMOworCWludCBrZXlmb3JtPUZPUk1BVF9QRU07CisJY2hhciAqaW5maWxlPU5VTEw7CisJY2hhciAqc3BrYWNfZmlsZT1OVUxMOworCWNoYXIgKnNzX2NlcnRfZmlsZT1OVUxMOworCWNoYXIgKnNlcl9zdGF0dXM9TlVMTDsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCWludCBvdXRwdXRfZGVyID0gMDsKKwljaGFyICpvdXRmaWxlPU5VTEw7CisJY2hhciAqb3V0ZGlyPU5VTEw7CisJY2hhciAqc2VyaWFsZmlsZT1OVUxMOworCWNoYXIgKmNybG51bWJlcmZpbGU9TlVMTDsKKwljaGFyICpleHRlbnNpb25zPU5VTEw7CisJY2hhciAqZXh0ZmlsZT1OVUxMOworCWNoYXIgKnN1Ymo9TlVMTDsKKwl1bnNpZ25lZCBsb25nIGNodHlwZSA9IE1CU1RSSU5HX0FTQzsKKwlpbnQgbXVsdGlyZG4gPSAwOworCWNoYXIgKnRtcF9lbWFpbF9kbj1OVUxMOworCWNoYXIgKmNybF9leHQ9TlVMTDsKKwlpbnQgcmV2X3R5cGUgPSBSRVZfTk9ORTsKKwljaGFyICpyZXZfYXJnID0gTlVMTDsKKwlCSUdOVU0gKnNlcmlhbD1OVUxMOworCUJJR05VTSAqY3JsbnVtYmVyPU5VTEw7CisJY2hhciAqc3RhcnRkYXRlPU5VTEw7CisJY2hhciAqZW5kZGF0ZT1OVUxMOworCWxvbmcgZGF5cz0wOworCWludCBiYXRjaD0wOworCWludCBub3RleHQ9MDsKKwl1bnNpZ25lZCBsb25nIG5hbWVvcHQgPSAwLCBjZXJ0b3B0ID0gMDsKKwlpbnQgZGVmYXVsdF9vcCA9IDE7CisJaW50IGV4dF9jb3B5ID0gRVhUX0NPUFlfTk9ORTsKKwlpbnQgc2VsZnNpZ24gPSAwOworCVg1MDkgKng1MDk9TlVMTCwgKng1MDlwID0gTlVMTDsKKwlYNTA5ICp4PU5VTEw7CisJQklPICppbj1OVUxMLCpvdXQ9TlVMTCwqU291dD1OVUxMLCpDb3V0PU5VTEw7CisJY2hhciAqZGJmaWxlPU5VTEw7CisJQ0FfREIgKmRiPU5VTEw7CisJWDUwOV9DUkwgKmNybD1OVUxMOworCVg1MDlfUkVWT0tFRCAqcj1OVUxMOworCUFTTjFfVElNRSAqdG1wdG07CisJQVNOMV9JTlRFR0VSICp0bXBzZXI7CisJY2hhciAqZjsKKwljb25zdCBjaGFyICpwOworCWNoYXIgKiBjb25zdCAqcHA7CisJaW50IGksajsKKwljb25zdCBFVlBfTUQgKmRnc3Q9TlVMTDsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqYXR0cmlicz1OVUxMOworCVNUQUNLX09GKFg1MDkpICpjZXJ0X3NrPU5VTEw7CisjdW5kZWYgQlNJWkUKKyNkZWZpbmUgQlNJWkUgMjU2CisJTVNfU1RBVElDIGNoYXIgYnVmWzNdW0JTSVpFXTsKKwljaGFyICpyYW5kZmlsZT1OVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWNoYXIgKmVuZ2luZSA9IE5VTEw7CisjZW5kaWYKKwljaGFyICp0b2ZyZWU9TlVMTDsKKwlEQl9BVFRSIGRiX2F0dHI7CisKKyNpZmRlZiBFRkVOQ0UKK0VGX1BST1RFQ1RfRlJFRT0xOworRUZfUFJPVEVDVF9CRUxPVz0xOworRUZfQUxJR05NRU5UPTA7CisjZW5kaWYKKworCWFwcHNfc3RhcnR1cCgpOworCisJY29uZiA9IE5VTEw7CisJa2V5ID0gTlVMTDsKKwlzZWN0aW9uID0gTlVMTDsKKworCXByZXNlcnZlPTA7CisJbXNpZV9oYWNrPTA7CisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJaWYgKChiaW9fZXJyPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoYmlvX2VycixzdGRlcnIsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmCShzdHJjbXAoKmFyZ3YsIi12ZXJib3NlIikgPT0gMCkKKwkJCXZlcmJvc2U9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItY29uZmlnIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWNvbmZpZ2ZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbmFtZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzZWN0aW9uPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXN1YmoiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc3Viaj0gKigrK2FyZ3YpOworCQkJLyogcHJlc2VydmU9MTsgKi8KKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdXRmOCIpID09IDApCisJCQljaHR5cGUgPSBNQlNUUklOR19VVEY4OworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jcmVhdGVfc2VyaWFsIikgPT0gMCkKKwkJCWNyZWF0ZV9zZXIgPSAxOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1tdWx0aXZhbHVlLXJkbiIpID09IDApCisJCQltdWx0aXJkbj0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zdGFydGRhdGUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc3RhcnRkYXRlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVuZGRhdGUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZW5kZGF0ZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1kYXlzIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWRheXM9YXRvaSgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1tZCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQltZD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wb2xpY3kiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcG9saWN5PSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWtleWZpbGUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJa2V5ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1rZXlmb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWtleWZvcm09c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wYXNzaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZ2luPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWtleSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlrZXk9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY2VydCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQljZXJ0ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zZWxmc2lnbiIpID09IDApCisJCQlzZWxmc2lnbj0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZpbGU9ICooKythcmd2KTsKKwkJCXJlcT0xOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXRkaXIiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0ZGlyPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vdGV4dCIpID09IDApCisJCQlub3RleHQ9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItYmF0Y2giKSA9PSAwKQorCQkJYmF0Y2g9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHJlc2VydmVETiIpID09IDApCisJCQlwcmVzZXJ2ZT0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub2VtYWlsRE4iKSA9PSAwKQorCQkJZW1haWxfZG49MDsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZ2VuY3JsIikgPT0gMCkKKwkJCWdlbmNybD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1tc2llX2hhY2siKSA9PSAwKQorCQkJbXNpZV9oYWNrPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNybGRheXMiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJY3JsZGF5cz0gYXRvbCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jcmxob3VycyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQljcmxob3Vycz0gYXRvbCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jcmxzZWMiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJY3Jsc2VjID0gYXRvbCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pbmZpbGVzIikgPT0gMCkKKwkJCXsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCXJlcT0xOworCQkJYnJlYWs7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1zc19jZXJ0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNzX2NlcnRfZmlsZSA9ICooKythcmd2KTsKKwkJCXJlcT0xOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItc3BrYWMiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc3BrYWNfZmlsZSA9ICooKythcmd2KTsKKwkJCXJlcT0xOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1yZXZva2UiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5maWxlPSAqKCsrYXJndik7CisJCQlkb3Jldm9rZT0xOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1leHRlbnNpb25zIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWV4dGVuc2lvbnM9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZXh0ZmlsZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlleHRmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXN0YXR1cyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzZXJfc3RhdHVzPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXVwZGF0ZWRiIikgPT0gMCkKKwkJCXsKKwkJCWRvdXBkYXRlZGI9MTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY3JsZXh0cyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQljcmxfZXh0PSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNybF9yZWFzb24iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcmV2X2FyZyA9ICooKythcmd2KTsKKwkJCXJldl90eXBlID0gUkVWX0NSTF9SRUFTT047CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNybF9ob2xkIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXJldl9hcmcgPSAqKCsrYXJndik7CisJCQlyZXZfdHlwZSA9IFJFVl9IT0xEOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jcmxfY29tcHJvbWlzZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlyZXZfYXJnID0gKigrK2FyZ3YpOworCQkJcmV2X3R5cGUgPSBSRVZfS0VZX0NPTVBST01JU0U7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNybF9DQV9jb21wcm9taXNlIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXJldl9hcmcgPSAqKCsrYXJndik7CisJCQlyZXZfdHlwZSA9IFJFVl9DQV9DT01QUk9NSVNFOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1lbmdpbmUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZW5naW5lPSAqKCsrYXJndik7CisJCQl9CisjZW5kaWYKKwkJZWxzZQorCQkJeworYmFkOgorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmtub3duIG9wdGlvbiAlc1xuIiwqYXJndik7CisJCQliYWRvcHM9MTsKKwkJCWJyZWFrOworCQkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCisJaWYgKGJhZG9wcykKKwkJeworCQljb25zdCBjaGFyICoqcHAyOworCisJCWZvciAocHAyPWNhX3VzYWdlOyAoKnBwMiAhPSBOVUxMKTsgcHAyKyspCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIiwqcHAyKTsKKwkJZ290byBlcnI7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJdG9mcmVlPU5VTEw7CisJaWYgKGNvbmZpZ2ZpbGUgPT0gTlVMTCkgY29uZmlnZmlsZSA9IGdldGVudigiT1BFTlNTTF9DT05GIik7CisJaWYgKGNvbmZpZ2ZpbGUgPT0gTlVMTCkgY29uZmlnZmlsZSA9IGdldGVudigiU1NMRUFZX0NPTkYiKTsKKwlpZiAoY29uZmlnZmlsZSA9PSBOVUxMKQorCQl7CisJCWNvbnN0IGNoYXIgKnM9WDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2FyZWEoKTsKKwkJc2l6ZV90IGxlbjsKKworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQlsZW4gPSBzdHJsZW4ocykrc2l6ZW9mKENPTkZJR19GSUxFKTsKKwkJdG9mcmVlPU9QRU5TU0xfbWFsbG9jKGxlbik7CisJCXN0cmNweSh0b2ZyZWUscyk7CisjZWxzZQorCQlsZW4gPSBzdHJsZW4ocykrc2l6ZW9mKENPTkZJR19GSUxFKSsxOworCQl0b2ZyZWU9T1BFTlNTTF9tYWxsb2MobGVuKTsKKwkJQlVGX3N0cmxjcHkodG9mcmVlLHMsbGVuKTsKKwkJQlVGX3N0cmxjYXQodG9mcmVlLCIvIixsZW4pOworI2VuZGlmCisJCUJVRl9zdHJsY2F0KHRvZnJlZSxDT05GSUdfRklMRSxsZW4pOworCQljb25maWdmaWxlPXRvZnJlZTsKKwkJfQorCisJQklPX3ByaW50ZihiaW9fZXJyLCJVc2luZyBjb25maWd1cmF0aW9uIGZyb20gJXNcbiIsY29uZmlnZmlsZSk7CisJY29uZiA9IE5DT05GX25ldyhOVUxMKTsKKwlpZiAoTkNPTkZfbG9hZChjb25mLGNvbmZpZ2ZpbGUsJmVycm9ybGluZSkgPD0gMCkKKwkJeworCQlpZiAoZXJyb3JsaW5lIDw9IDApCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIGxvYWRpbmcgdGhlIGNvbmZpZyBmaWxlICclcydcbiIsCisJCQkJY29uZmlnZmlsZSk7CisJCWVsc2UKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZXJyb3Igb24gbGluZSAlbGQgb2YgY29uZmlnIGZpbGUgJyVzJ1xuIgorCQkJCSxlcnJvcmxpbmUsY29uZmlnZmlsZSk7CisJCWdvdG8gZXJyOworCQl9CisJaWYodG9mcmVlKQorCQl7CisJCU9QRU5TU0xfZnJlZSh0b2ZyZWUpOworCQl0b2ZyZWUgPSBOVUxMOworCQl9CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIGNvbmYpKQorCQlnb3RvIGVycjsKKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWUgPSBzZXR1cF9lbmdpbmUoYmlvX2VyciwgZW5naW5lLCAwKTsKKyNlbmRpZgorCisJLyogTGV0cyBnZXQgdGhlIGNvbmZpZyBzZWN0aW9uIHdlIGFyZSB1c2luZyAqLworCWlmIChzZWN0aW9uID09IE5VTEwpCisJCXsKKwkJc2VjdGlvbj1OQ09ORl9nZXRfc3RyaW5nKGNvbmYsQkFTRV9TRUNUSU9OLEVOVl9ERUZBVUxUX0NBKTsKKwkJaWYgKHNlY3Rpb24gPT0gTlVMTCkKKwkJCXsKKwkJCWxvb2t1cF9mYWlsKEJBU0VfU0VDVElPTixFTlZfREVGQVVMVF9DQSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJaWYgKGNvbmYgIT0gTlVMTCkKKwkJeworCQlwPU5DT05GX2dldF9zdHJpbmcoY29uZixOVUxMLCJvaWRfZmlsZSIpOworCQlpZiAocCA9PSBOVUxMKQorCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCWlmIChwICE9IE5VTEwpCisJCQl7CisJCQlCSU8gKm9pZF9iaW87CisKKwkJCW9pZF9iaW89QklPX25ld19maWxlKHAsInIiKTsKKwkJCWlmIChvaWRfYmlvID09IE5VTEwpIAorCQkJCXsKKwkJCQkvKgorCQkJCUJJT19wcmludGYoYmlvX2VyciwicHJvYmxlbXMgb3BlbmluZyAlcyBmb3IgZXh0cmEgb2lkJ3NcbiIscCk7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkqLworCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJT0JKX2NyZWF0ZV9vYmplY3RzKG9pZF9iaW8pOworCQkJCUJJT19mcmVlKG9pZF9iaW8pOworCQkJCX0KKwkJCX0KKwkJaWYgKCFhZGRfb2lkX3NlY3Rpb24oYmlvX2Vycixjb25mKSkgCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCXJhbmRmaWxlID0gTkNPTkZfZ2V0X3N0cmluZyhjb25mLCBCQVNFX1NFQ1RJT04sICJSQU5ERklMRSIpOworCWlmIChyYW5kZmlsZSA9PSBOVUxMKQorCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwlhcHBfUkFORF9sb2FkX2ZpbGUocmFuZGZpbGUsIGJpb19lcnIsIDApOworCisJZiA9IE5DT05GX2dldF9zdHJpbmcoY29uZiwgc2VjdGlvbiwgU1RSSU5HX01BU0spOworCWlmICghZikKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisKKwlpZihmICYmICFBU04xX1NUUklOR19zZXRfZGVmYXVsdF9tYXNrX2FzYyhmKSkgeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJJbnZhbGlkIGdsb2JhbCBzdHJpbmcgbWFzayBzZXR0aW5nICVzXG4iLCBmKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGNodHlwZSAhPSBNQlNUUklOR19VVEY4KXsKKwkJZiA9IE5DT05GX2dldF9zdHJpbmcoY29uZiwgc2VjdGlvbiwgVVRGOF9JTik7CisJCWlmICghZikKKwkJCUVSUl9jbGVhcl9lcnJvcigpOworCQllbHNlIGlmICghc3RyY21wKGYsICJ5ZXMiKSkKKwkJCWNodHlwZSA9IE1CU1RSSU5HX1VURjg7CisJfQorCisJZGJfYXR0ci51bmlxdWVfc3ViamVjdCA9IDE7CisJcCA9IE5DT05GX2dldF9zdHJpbmcoY29uZiwgc2VjdGlvbiwgRU5WX1VOSVFVRV9TVUJKRUNUKTsKKwlpZiAocCkKKwkJeworI2lmZGVmIFJMX0RFQlVHCisJCUJJT19wcmludGYoYmlvX2VyciwgIkRFQlVHOiB1bmlxdWVfc3ViamVjdCA9IFwiJXNcIlxuIiwgcCk7CisjZW5kaWYKKwkJZGJfYXR0ci51bmlxdWVfc3ViamVjdCA9IHBhcnNlX3llc25vKHAsMSk7CisJCX0KKwllbHNlCisJCUVSUl9jbGVhcl9lcnJvcigpOworI2lmZGVmIFJMX0RFQlVHCisJaWYgKCFwKQorCQlCSU9fcHJpbnRmKGJpb19lcnIsICJERUJVRzogdW5pcXVlX3N1YmplY3QgdW5kZWZpbmVkXG4iLCBwKTsKKyNlbmRpZgorI2lmZGVmIFJMX0RFQlVHCisJQklPX3ByaW50ZihiaW9fZXJyLCAiREVCVUc6IGNvbmZpZ3VyZWQgdW5pcXVlX3N1YmplY3QgaXMgJWRcbiIsCisJCWRiX2F0dHIudW5pcXVlX3N1YmplY3QpOworI2VuZGlmCisJCisJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCW91dD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJU291dD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJQ291dD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKChpbiA9PSBOVUxMKSB8fCAob3V0ID09IE5VTEwpIHx8IChTb3V0ID09IE5VTEwpIHx8IChDb3V0ID09IE5VTEwpKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogcmVwb3J0IHN0YXR1cyBvZiBjZXJ0IHdpdGggc2VyaWFsIG51bWJlciBnaXZlbiBvbiBjb21tYW5kIGxpbmUgKi8KKwlpZiAoc2VyX3N0YXR1cykKKwl7CisJCWlmICgoZGJmaWxlPU5DT05GX2dldF9zdHJpbmcoY29uZixzZWN0aW9uLEVOVl9EQVRBQkFTRSkpID09IE5VTEwpCisJCQl7CisJCQlsb29rdXBfZmFpbChzZWN0aW9uLEVOVl9EQVRBQkFTRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJZGIgPSBsb2FkX2luZGV4KGRiZmlsZSwmZGJfYXR0cik7CisJCWlmIChkYiA9PSBOVUxMKSBnb3RvIGVycjsKKworCQlpZiAoIWluZGV4X2luZGV4KGRiKSkgZ290byBlcnI7CisKKwkJaWYgKGdldF9jZXJ0aWZpY2F0ZV9zdGF0dXMoc2VyX3N0YXR1cyxkYikgIT0gMSkKKwkJCUJJT19wcmludGYoYmlvX2VyciwiRXJyb3IgdmVyaWZ5aW5nIHNlcmlhbCAlcyFcbiIsCisJCQkJIHNlcl9zdGF0dXMpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogd2UgZGVmaW5pdGVseSBuZWVkIGEgcHJpdmF0ZSBrZXksIHNvIGxldCdzIGdldCBpdCAqLworCisJaWYgKChrZXlmaWxlID09IE5VTEwpICYmICgoa2V5ZmlsZT1OQ09ORl9nZXRfc3RyaW5nKGNvbmYsCisJCXNlY3Rpb24sRU5WX1BSSVZBVEVfS0VZKSkgPT0gTlVMTCkpCisJCXsKKwkJbG9va3VwX2ZhaWwoc2VjdGlvbixFTlZfUFJJVkFURV9LRVkpOworCQlnb3RvIGVycjsKKwkJfQorCWlmICgha2V5KQorCQl7CisJCWZyZWVfa2V5ID0gMTsKKwkJaWYgKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmdpbiwgTlVMTCwgJmtleSwgTlVMTCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkVycm9yIGdldHRpbmcgcGFzc3dvcmRcbiIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlwa2V5ID0gbG9hZF9rZXkoYmlvX2Vyciwga2V5ZmlsZSwga2V5Zm9ybSwgMCwga2V5LCBlLCAKKwkJIkNBIHByaXZhdGUga2V5Iik7CisJaWYgKGtleSkgT1BFTlNTTF9jbGVhbnNlKGtleSxzdHJsZW4oa2V5KSk7CisJaWYgKHBrZXkgPT0gTlVMTCkKKwkJeworCQkvKiBsb2FkX2tleSgpIGhhcyBhbHJlYWR5IHByaW50ZWQgYW4gYXBwcm9wcmlhdGUgbWVzc2FnZSAqLworCQlnb3RvIGVycjsKKwkJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIHdlIG5lZWQgYSBjZXJ0aWZpY2F0ZSAqLworCWlmICghc2VsZnNpZ24gfHwgc3BrYWNfZmlsZSB8fCBzc19jZXJ0X2ZpbGUgfHwgZ2VuY3JsKQorCQl7CisJCWlmICgoY2VydGZpbGUgPT0gTlVMTCkKKwkJCSYmICgoY2VydGZpbGU9TkNPTkZfZ2V0X3N0cmluZyhjb25mLAorCQkJCSAgICAgc2VjdGlvbixFTlZfQ0VSVElGSUNBVEUpKSA9PSBOVUxMKSkKKwkJCXsKKwkJCWxvb2t1cF9mYWlsKHNlY3Rpb24sRU5WX0NFUlRJRklDQVRFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl4NTA5PWxvYWRfY2VydChiaW9fZXJyLCBjZXJ0ZmlsZSwgRk9STUFUX1BFTSwgTlVMTCwgZSwKKwkJCSJDQSBjZXJ0aWZpY2F0ZSIpOworCQlpZiAoeDUwOSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisKKwkJaWYgKCFYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KHg1MDkscGtleSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkNBIGNlcnRpZmljYXRlIGFuZCBDQSBwcml2YXRlIGtleSBkbyBub3QgbWF0Y2hcbiIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlpZiAoIXNlbGZzaWduKSB4NTA5cCA9IHg1MDk7CisKKwlmPU5DT05GX2dldF9zdHJpbmcoY29uZixCQVNFX1NFQ1RJT04sRU5WX1BSRVNFUlZFKTsKKwlpZiAoZiA9PSBOVUxMKQorCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwlpZiAoKGYgIT0gTlVMTCkgJiYgKCgqZiA9PSAneScpIHx8ICgqZiA9PSAnWScpKSkKKwkJcHJlc2VydmU9MTsKKwlmPU5DT05GX2dldF9zdHJpbmcoY29uZixCQVNFX1NFQ1RJT04sRU5WX01TSUVfSEFDSyk7CisJaWYgKGYgPT0gTlVMTCkKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJaWYgKChmICE9IE5VTEwpICYmICgoKmYgPT0gJ3knKSB8fCAoKmYgPT0gJ1knKSkpCisJCW1zaWVfaGFjaz0xOworCisJZj1OQ09ORl9nZXRfc3RyaW5nKGNvbmYsc2VjdGlvbixFTlZfTkFNRU9QVCk7CisKKwlpZiAoZikKKwkJeworCQlpZiAoIXNldF9uYW1lX2V4KCZuYW1lb3B0LCBmKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkludmFsaWQgbmFtZSBvcHRpb25zOiBcIiVzXCJcbiIsIGYpOworCQkJZ290byBlcnI7CisJCQl9CisJCWRlZmF1bHRfb3AgPSAwOworCQl9CisJZWxzZQorCQlFUlJfY2xlYXJfZXJyb3IoKTsKKworCWY9TkNPTkZfZ2V0X3N0cmluZyhjb25mLHNlY3Rpb24sRU5WX0NFUlRPUFQpOworCisJaWYgKGYpCisJCXsKKwkJaWYgKCFzZXRfY2VydF9leCgmY2VydG9wdCwgZikpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJJbnZhbGlkIGNlcnRpZmljYXRlIG9wdGlvbnM6IFwiJXNcIlxuIiwgZik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJZGVmYXVsdF9vcCA9IDA7CisJCX0KKwllbHNlCisJCUVSUl9jbGVhcl9lcnJvcigpOworCisJZj1OQ09ORl9nZXRfc3RyaW5nKGNvbmYsc2VjdGlvbixFTlZfRVhUQ09QWSk7CisKKwlpZiAoZikKKwkJeworCQlpZiAoIXNldF9leHRfY29weSgmZXh0X2NvcHksIGYpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiSW52YWxpZCBleHRlbnNpb24gY29weSBvcHRpb246IFwiJXNcIlxuIiwgZik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogbG9va3VwIHdoZXJlIHRvIHdyaXRlIG5ldyBjZXJ0aWZpY2F0ZXMgKi8KKwlpZiAoKG91dGRpciA9PSBOVUxMKSAmJiAocmVxKSkKKwkJeworCisJCWlmICgob3V0ZGlyPU5DT05GX2dldF9zdHJpbmcoY29uZixzZWN0aW9uLEVOVl9ORVdfQ0VSVFNfRElSKSkKKwkJCT09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInRoZXJlIG5lZWRzIHRvIGJlIGRlZmluZWQgYSBkaXJlY3RvcnkgZm9yIG5ldyBjZXJ0aWZpY2F0ZSB0byBiZSBwbGFjZWQgaW5cbiIpOworCQkJZ290byBlcnI7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfU1lTX1ZNUworCSAgICAvKiBvdXRkaXIgaXMgYSBkaXJlY3Rvcnkgc3BlYywgYnV0IGFjY2VzcygpIGZvciBWTVMgZGVtYW5kcyBhCisJICAgICAgIGZpbGVuYW1lLiAgSW4gYW55IGNhc2UsIHN0YXQoKSwgYmVsb3csIHdpbGwgY2F0Y2ggdGhlIHByb2JsZW0KKwkgICAgICAgaWYgb3V0ZGlyIGlzIG5vdCBhIGRpcmVjdG9yeSBzcGVjLCBhbmQgdGhlIGZvcGVuKCkgb3Igb3BlbigpCisJICAgICAgIHdpbGwgY2F0Y2ggYW4gZXJyb3IgaWYgdGhlcmUgaXMgbm8gd3JpdGUgYWNjZXNzLgorCisJICAgICAgIFByZXN1bWFibHksIHRoaXMgcHJvYmxlbSBjb3VsZCBhbHNvIGJlIHNvbHZlZCBieSB1c2luZyB0aGUgREVDCisJICAgICAgIEMgcm91dGluZXMgdG8gY29udmVydCB0aGUgZGlyZWN0b3J5IHN5bnRheCB0byBVbml4bHksIGFuZCBnaXZlCisJICAgICAgIHRoYXQgdG8gYWNjZXNzKCkuICBIb3dldmVyLCB0aW1lJ3MgdG9vIHNob3J0IHRvIGRvIHRoYXQganVzdAorCSAgICAgICBub3cuCisJICAgICovCisjaWZuZGVmIF9XSU4zMgorCQlpZiAoYWNjZXNzKG91dGRpcixSX09LfFdfT0t8WF9PSykgIT0gMCkKKyNlbHNlCisJCWlmIChfYWNjZXNzKG91dGRpcixSX09LfFdfT0t8WF9PSykgIT0gMCkKKyNlbmRpZgorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJJIGFtIHVuYWJsZSB0byBhY2Nlc3MgdGhlICVzIGRpcmVjdG9yeVxuIixvdXRkaXIpOworCQkJcGVycm9yKG91dGRpcik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlpZiAoYXBwX2lzZGlyKG91dGRpcik8PTApCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIG5lZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIsb3V0ZGlyKTsKKwkJCXBlcnJvcihvdXRkaXIpOworCQkJZ290byBlcnI7CisJCQl9CisjZW5kaWYKKwkJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIHdlIG5lZWQgdG8gbG9hZCB0aGUgZGF0YWJhc2UgZmlsZSAqLworCWlmICgoZGJmaWxlPU5DT05GX2dldF9zdHJpbmcoY29uZixzZWN0aW9uLEVOVl9EQVRBQkFTRSkpID09IE5VTEwpCisJCXsKKwkJbG9va3VwX2ZhaWwoc2VjdGlvbixFTlZfREFUQUJBU0UpOworCQlnb3RvIGVycjsKKwkJfQorCWRiID0gbG9hZF9pbmRleChkYmZpbGUsICZkYl9hdHRyKTsKKwlpZiAoZGIgPT0gTlVMTCkgZ290byBlcnI7CisKKwkvKiBMZXRzIGNoZWNrIHNvbWUgZmllbGRzICovCisJZm9yIChpPTA7IGk8c2tfT1BFTlNTTF9QU1RSSU5HX251bShkYi0+ZGItPmRhdGEpOyBpKyspCisJCXsKKwkJcHA9c2tfT1BFTlNTTF9QU1RSSU5HX3ZhbHVlKGRiLT5kYi0+ZGF0YSxpKTsKKwkJaWYgKChwcFtEQl90eXBlXVswXSAhPSBEQl9UWVBFX1JFVikgJiYKKwkJCShwcFtEQl9yZXZfZGF0ZV1bMF0gIT0gJ1wwJykpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVudHJ5ICVkOiBub3QgcmV2b2tlZCB5ZXQsIGJ1dCBoYXMgYSByZXZvY2F0aW9uIGRhdGVcbiIsaSsxKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoKHBwW0RCX3R5cGVdWzBdID09IERCX1RZUEVfUkVWKSAmJgorCQkJIW1ha2VfcmV2b2tlZChOVUxMLCBwcFtEQl9yZXZfZGF0ZV0pKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIgaW4gZW50cnkgJWRcbiIsIGkrMSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKCFjaGVja190aW1lX2Zvcm1hdCgoY2hhciAqKXBwW0RCX2V4cF9kYXRlXSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVudHJ5ICVkOiBpbnZhbGlkIGV4cGlyeSBkYXRlXG4iLGkrMSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcD1wcFtEQl9zZXJpYWxdOworCQlqPXN0cmxlbihwKTsKKwkJaWYgKCpwID09ICctJykKKwkJCXsKKwkJCXArKzsKKwkJCWotLTsKKwkJCX0KKwkJaWYgKChqJjEpIHx8IChqIDwgMikpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVudHJ5ICVkOiBiYWQgc2VyaWFsIG51bWJlciBsZW5ndGggKCVkKVxuIixpKzEsaik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJd2hpbGUgKCpwKQorCQkJeworCQkJaWYgKCEoCSgoKnAgPj0gJzAnKSAmJiAoKnAgPD0gJzknKSkgfHwKKwkJCQkoKCpwID49ICdBJykgJiYgKCpwIDw9ICdGJykpIHx8CisJCQkJKCgqcCA+PSAnYScpICYmICgqcCA8PSAnZicpKSkgICkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJlbnRyeSAlZDogYmFkIHNlcmlhbCBudW1iZXIgY2hhcmFjdGVycywgY2hhciBwb3MgJWxkLCBjaGFyIGlzICclYydcbiIsaSsxLChsb25nKShwLXBwW0RCX3NlcmlhbF0pLCpwKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlwKys7CisJCQl9CisJCX0KKwlpZiAodmVyYm9zZSkKKwkJeworCQlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOyAvKiBjYW5ub3QgZmFpbCAqLworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQl7CisJCUJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCX0KKyNlbmRpZgorCQlUWFRfREJfd3JpdGUob3V0LGRiLT5kYik7CisJCUJJT19wcmludGYoYmlvX2VyciwiJWQgZW50cmllcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2VcbiIsCisJCQkgICBza19PUEVOU1NMX1BTVFJJTkdfbnVtKGRiLT5kYi0+ZGF0YSkpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsImdlbmVyYXRpbmcgaW5kZXhcbiIpOworCQl9CisJCisJaWYgKCFpbmRleF9pbmRleChkYikpIGdvdG8gZXJyOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCS8qIFVwZGF0ZSB0aGUgZGIgZmlsZSBmb3IgZXhwaXJlZCBjZXJ0aWZpY2F0ZXMgKi8KKwlpZiAoZG91cGRhdGVkYikKKwkJeworCQlpZiAodmVyYm9zZSkKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIlVwZGF0aW5nICVzIC4uLlxuIiwKKwkJCQkJCQlkYmZpbGUpOworCisJCWkgPSBkb191cGRhdGVkYihkYik7CisJCWlmIChpID09IC0xKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJNYWxsb2MgZmFpbHVyZVxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSBpZiAoaSA9PSAwKQorCQkJeworCQkJaWYgKHZlcmJvc2UpIEJJT19wcmludGYoYmlvX2VyciwKKwkJCQkJIk5vIGVudHJpZXMgZm91bmQgdG8gbWFyayBleHBpcmVkXG4iKTsgCisJCQl9CisJICAgIAllbHNlCisJCQl7CisJCQlpZiAoIXNhdmVfaW5kZXgoZGJmaWxlLCJuZXciLGRiKSkgZ290byBlcnI7CisJCQkJCisJCQlpZiAoIXJvdGF0ZV9pbmRleChkYmZpbGUsIm5ldyIsIm9sZCIpKSBnb3RvIGVycjsKKwkJCQkKKwkJCWlmICh2ZXJib3NlKSBCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJIkRvbmUuICVkIGVudHJpZXMgbWFya2VkIGFzIGV4cGlyZWRcbiIsaSk7IAorCSAgICAgIAkJfQorCSAgCX0KKworIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisJLyogUmVhZCBleHRlbnRpb25zIGNvbmZpZyBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlmIChleHRmaWxlKQorCQl7CisJCWV4dGNvbmYgPSBOQ09ORl9uZXcoTlVMTCk7CisJCWlmIChOQ09ORl9sb2FkKGV4dGNvbmYsZXh0ZmlsZSwmZXJyb3JsaW5lKSA8PSAwKQorCQkJeworCQkJaWYgKGVycm9ybGluZSA8PSAwKQorCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkVSUk9SOiBsb2FkaW5nIHRoZSBjb25maWcgZmlsZSAnJXMnXG4iLAorCQkJCQlleHRmaWxlKTsKKwkJCWVsc2UKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFUlJPUjogb24gbGluZSAlbGQgb2YgY29uZmlnIGZpbGUgJyVzJ1xuIiwKKwkJCQkJZXJyb3JsaW5lLGV4dGZpbGUpOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmICh2ZXJib3NlKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiU3VjY2Vzc2Z1bGx5IGxvYWRlZCBleHRlbnNpb25zIGZpbGUgJXNcbiIsIGV4dGZpbGUpOworCisJCS8qIFdlIGNhbiBoYXZlIHNlY3Rpb25zIGluIHRoZSBleHQgZmlsZSAqLworCQlpZiAoIWV4dGVuc2lvbnMgJiYgIShleHRlbnNpb25zID0gTkNPTkZfZ2V0X3N0cmluZyhleHRjb25mLCAiZGVmYXVsdCIsICJleHRlbnNpb25zIikpKQorCQkJZXh0ZW5zaW9ucyA9ICJkZWZhdWx0IjsKKwkJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWlmIChyZXEgfHwgZ2VuY3JsKQorCQl7CisJCWlmIChvdXRmaWxlICE9IE5VTEwpCisJCQl7CisJCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKFNvdXQsb3V0ZmlsZSkgPD0gMCkKKwkJCQl7CisJCQkJcGVycm9yKG91dGZpbGUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQklPX3NldF9mcChTb3V0LHN0ZG91dCxCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCQl7CisJCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJCVNvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIFNvdXQpOworCQkJfQorI2VuZGlmCisJCQl9CisJCX0KKworCWlmICgobWQgPT0gTlVMTCkgJiYgKChtZD1OQ09ORl9nZXRfc3RyaW5nKGNvbmYsCisJCXNlY3Rpb24sRU5WX0RFRkFVTFRfTUQpKSA9PSBOVUxMKSkKKwkJeworCQlsb29rdXBfZmFpbChzZWN0aW9uLEVOVl9ERUZBVUxUX01EKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICghc3RyY21wKG1kLCAiZGVmYXVsdCIpKQorCQl7CisJCWludCBkZWZfbmlkOworCQlpZiAoRVZQX1BLRVlfZ2V0X2RlZmF1bHRfZGlnZXN0X25pZChwa2V5LCAmZGVmX25pZCkgPD0gMCkKKwkJCXsKKwkJCUJJT19wdXRzKGJpb19lcnIsIm5vIGRlZmF1bHQgZGlnZXN0XG4iKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQltZCA9IChjaGFyICopT0JKX25pZDJzbihkZWZfbmlkKTsKKwkJfQorCisJaWYgKChkZ3N0PUVWUF9nZXRfZGlnZXN0YnluYW1lKG1kKSkgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIGlzIGFuIHVuc3VwcG9ydGVkIG1lc3NhZ2UgZGlnZXN0IHR5cGVcbiIsbWQpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHJlcSkKKwkJeworCQlpZiAoKGVtYWlsX2RuID09IDEpICYmICgodG1wX2VtYWlsX2RuPU5DT05GX2dldF9zdHJpbmcoY29uZiwKKwkJCXNlY3Rpb24sRU5WX0RFRkFVTFRfRU1BSUxfRE4pKSAhPSBOVUxMICkpCisJCQl7CisJCQlpZihzdHJjbXAodG1wX2VtYWlsX2RuLCJubyIpID09IDApCisJCQkJZW1haWxfZG49MDsKKwkJCX0KKwkJaWYgKHZlcmJvc2UpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm1lc3NhZ2UgZGlnZXN0IGlzICVzXG4iLAorCQkJCU9CSl9uaWQybG4oZGdzdC0+dHlwZSkpOworCQlpZiAoKHBvbGljeSA9PSBOVUxMKSAmJiAoKHBvbGljeT1OQ09ORl9nZXRfc3RyaW5nKGNvbmYsCisJCQlzZWN0aW9uLEVOVl9QT0xJQ1kpKSA9PSBOVUxMKSkKKwkJCXsKKwkJCWxvb2t1cF9mYWlsKHNlY3Rpb24sRU5WX1BPTElDWSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKHZlcmJvc2UpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInBvbGljeSBpcyAlc1xuIixwb2xpY3kpOworCisJCWlmICgoc2VyaWFsZmlsZT1OQ09ORl9nZXRfc3RyaW5nKGNvbmYsc2VjdGlvbixFTlZfU0VSSUFMKSkKKwkJCT09IE5VTEwpCisJCQl7CisJCQlsb29rdXBfZmFpbChzZWN0aW9uLEVOVl9TRVJJQUwpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKCFleHRjb25mKQorCQkJeworCQkJLyogbm8gJy1leHRmaWxlJyBvcHRpb24sIHNvIHdlIGxvb2sgZm9yIGV4dGVuc2lvbnMKKwkJCSAqIGluIHRoZSBtYWluIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworCQkJaWYgKCFleHRlbnNpb25zKQorCQkJCXsKKwkJCQlleHRlbnNpb25zPU5DT05GX2dldF9zdHJpbmcoY29uZixzZWN0aW9uLAorCQkJCQkJCQlFTlZfRVhURU5TSU9OUyk7CisJCQkJaWYgKCFleHRlbnNpb25zKQorCQkJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCQl9CisJCQlpZiAoZXh0ZW5zaW9ucykKKwkJCQl7CisJCQkJLyogQ2hlY2sgc3ludGF4IG9mIGZpbGUgKi8KKwkJCQlYNTA5VjNfQ1RYIGN0eDsKKwkJCQlYNTA5VjNfc2V0X2N0eF90ZXN0KCZjdHgpOworCQkJCVg1MDlWM19zZXRfbmNvbmYoJmN0eCwgY29uZik7CisJCQkJaWYgKCFYNTA5VjNfRVhUX2FkZF9uY29uZihjb25mLCAmY3R4LCBleHRlbnNpb25zLAorCQkJCQkJCQlOVUxMKSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJIAkiRXJyb3IgTG9hZGluZyBleHRlbnNpb24gc2VjdGlvbiAlc1xuIiwKKwkJCQkJCQkJIGV4dGVuc2lvbnMpOworCQkJCQlyZXQgPSAxOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQlpZiAoc3RhcnRkYXRlID09IE5VTEwpCisJCQl7CisJCQlzdGFydGRhdGU9TkNPTkZfZ2V0X3N0cmluZyhjb25mLHNlY3Rpb24sCisJCQkJRU5WX0RFRkFVTFRfU1RBUlREQVRFKTsKKwkJCWlmIChzdGFydGRhdGUgPT0gTlVMTCkKKwkJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCX0KKwkJaWYgKHN0YXJ0ZGF0ZSAmJiAhQVNOMV9USU1FX3NldF9zdHJpbmcoTlVMTCwgc3RhcnRkYXRlKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2Vyciwic3RhcnQgZGF0ZSBpcyBpbnZhbGlkLCBpdCBzaG91bGQgYmUgWVlNTURESEhNTVNTWiBvciBZWVlZTU1EREhITU1TU1pcbiIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmIChzdGFydGRhdGUgPT0gTlVMTCkgc3RhcnRkYXRlPSJ0b2RheSI7CisKKwkJaWYgKGVuZGRhdGUgPT0gTlVMTCkKKwkJCXsKKwkJCWVuZGRhdGU9TkNPTkZfZ2V0X3N0cmluZyhjb25mLHNlY3Rpb24sCisJCQkJRU5WX0RFRkFVTFRfRU5EREFURSk7CisJCQlpZiAoZW5kZGF0ZSA9PSBOVUxMKQorCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJfQorCQlpZiAoZW5kZGF0ZSAmJiAhQVNOMV9USU1FX3NldF9zdHJpbmcoTlVMTCwgZW5kZGF0ZSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVuZCBkYXRlIGlzIGludmFsaWQsIGl0IHNob3VsZCBiZSBZWU1NRERISE1NU1NaIG9yIFlZWVlNTURESEhNTVNTWlxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlpZiAoZGF5cyA9PSAwKQorCQkJeworCQkJaWYoIU5DT05GX2dldF9udW1iZXIoY29uZixzZWN0aW9uLCBFTlZfREVGQVVMVF9EQVlTLCAmZGF5cykpCisJCQkJZGF5cyA9IDA7CisJCQl9CisJCWlmICghZW5kZGF0ZSAmJiAoZGF5cyA9PSAwKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiY2Fubm90IGxvb2t1cCBob3cgbWFueSBkYXlzIHRvIGNlcnRpZnkgZm9yXG4iKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmICgoc2VyaWFsPWxvYWRfc2VyaWFsKHNlcmlhbGZpbGUsIGNyZWF0ZV9zZXIsIE5VTEwpKSA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciB3aGlsZSBsb2FkaW5nIHNlcmlhbCBudW1iZXJcbiIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmICh2ZXJib3NlKQorCQkJeworCQkJaWYgKEJOX2lzX3plcm8oc2VyaWFsKSkKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5leHQgc2VyaWFsIG51bWJlciBpcyAwMFxuIik7CisJCQllbHNlCisJCQkJeworCQkJCWlmICgoZj1CTl9ibjJoZXgoc2VyaWFsKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJuZXh0IHNlcmlhbCBudW1iZXIgaXMgJXNcbiIsZik7CisJCQkJT1BFTlNTTF9mcmVlKGYpOworCQkJCX0KKwkJCX0KKworCQlpZiAoKGF0dHJpYnM9TkNPTkZfZ2V0X3NlY3Rpb24oY29uZixwb2xpY3kpKSA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gZmluZCAnc2VjdGlvbicgZm9yICVzXG4iLHBvbGljeSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlpZiAoKGNlcnRfc2s9c2tfWDUwOV9uZXdfbnVsbCgpKSA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoc3BrYWNfZmlsZSAhPSBOVUxMKQorCQkJeworCQkJdG90YWwrKzsKKwkJCWo9Y2VydGlmeV9zcGthYygmeCxzcGthY19maWxlLHBrZXkseDUwOSxkZ3N0LGF0dHJpYnMsZGIsCisJCQkJc2VyaWFsLHN1YmosY2h0eXBlLG11bHRpcmRuLGVtYWlsX2RuLHN0YXJ0ZGF0ZSxlbmRkYXRlLGRheXMsZXh0ZW5zaW9ucywKKwkJCQljb25mLHZlcmJvc2UsY2VydG9wdCxuYW1lb3B0LGRlZmF1bHRfb3AsZXh0X2NvcHkpOworCQkJaWYgKGogPCAwKSBnb3RvIGVycjsKKwkJCWlmIChqID4gMCkKKwkJCQl7CisJCQkJdG90YWxfZG9uZSsrOworCQkJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJCQlpZiAoIUJOX2FkZF93b3JkKHNlcmlhbCwxKSkgZ290byBlcnI7CisJCQkJaWYgKCFza19YNTA5X3B1c2goY2VydF9zayx4KSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWlmIChvdXRmaWxlKQorCQkJCQl7CisJCQkJCW91dHB1dF9kZXIgPSAxOworCQkJCQliYXRjaCA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCWlmIChzc19jZXJ0X2ZpbGUgIT0gTlVMTCkKKwkJCXsKKwkJCXRvdGFsKys7CisJCQlqPWNlcnRpZnlfY2VydCgmeCxzc19jZXJ0X2ZpbGUscGtleSx4NTA5LGRnc3QsYXR0cmlicywKKwkJCQlkYixzZXJpYWwsc3ViaixjaHR5cGUsbXVsdGlyZG4sZW1haWxfZG4sc3RhcnRkYXRlLGVuZGRhdGUsZGF5cyxiYXRjaCwKKwkJCQlleHRlbnNpb25zLGNvbmYsdmVyYm9zZSwgY2VydG9wdCwgbmFtZW9wdCwKKwkJCQlkZWZhdWx0X29wLCBleHRfY29weSwgZSk7CisJCQlpZiAoaiA8IDApIGdvdG8gZXJyOworCQkJaWYgKGogPiAwKQorCQkJCXsKKwkJCQl0b3RhbF9kb25lKys7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJcbiIpOworCQkJCWlmICghQk5fYWRkX3dvcmQoc2VyaWFsLDEpKSBnb3RvIGVycjsKKwkJCQlpZiAoIXNrX1g1MDlfcHVzaChjZXJ0X3NrLHgpKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJfQorCQkJfQorCQlpZiAoaW5maWxlICE9IE5VTEwpCisJCQl7CisJCQl0b3RhbCsrOworCQkJaj1jZXJ0aWZ5KCZ4LGluZmlsZSxwa2V5LHg1MDlwLGRnc3QsYXR0cmlicyxkYiwKKwkJCQlzZXJpYWwsc3ViaixjaHR5cGUsbXVsdGlyZG4sZW1haWxfZG4sc3RhcnRkYXRlLGVuZGRhdGUsZGF5cyxiYXRjaCwKKwkJCQlleHRlbnNpb25zLGNvbmYsdmVyYm9zZSwgY2VydG9wdCwgbmFtZW9wdCwKKwkJCQlkZWZhdWx0X29wLCBleHRfY29weSwgc2VsZnNpZ24pOworCQkJaWYgKGogPCAwKSBnb3RvIGVycjsKKwkJCWlmIChqID4gMCkKKwkJCQl7CisJCQkJdG90YWxfZG9uZSsrOworCQkJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJCQlpZiAoIUJOX2FkZF93b3JkKHNlcmlhbCwxKSkgZ290byBlcnI7CisJCQkJaWYgKCFza19YNTA5X3B1c2goY2VydF9zayx4KSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJZm9yIChpPTA7IGk8YXJnYzsgaSsrKQorCQkJeworCQkJdG90YWwrKzsKKwkJCWo9Y2VydGlmeSgmeCxhcmd2W2ldLHBrZXkseDUwOXAsZGdzdCxhdHRyaWJzLGRiLAorCQkJCXNlcmlhbCxzdWJqLGNodHlwZSxtdWx0aXJkbixlbWFpbF9kbixzdGFydGRhdGUsZW5kZGF0ZSxkYXlzLGJhdGNoLAorCQkJCWV4dGVuc2lvbnMsY29uZix2ZXJib3NlLCBjZXJ0b3B0LCBuYW1lb3B0LAorCQkJCWRlZmF1bHRfb3AsIGV4dF9jb3B5LCBzZWxmc2lnbik7CisJCQlpZiAoaiA8IDApIGdvdG8gZXJyOworCQkJaWYgKGogPiAwKQorCQkJCXsKKwkJCQl0b3RhbF9kb25lKys7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJcbiIpOworCQkJCWlmICghQk5fYWRkX3dvcmQoc2VyaWFsLDEpKSBnb3RvIGVycjsKKwkJCQlpZiAoIXNrX1g1MDlfcHVzaChjZXJ0X3NrLHgpKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJfQorCQkJfQkKKwkJLyogd2UgaGF2ZSBhIHN0YWNrIG9mIG5ld2x5IGNlcnRpZmllZCBjZXJ0aWZpY2F0ZXMKKwkJICogYW5kIGEgZGF0YSBiYXNlIGFuZCBzZXJpYWwgbnVtYmVyIHRoYXQgbmVlZAorCQkgKiB1cGRhdGluZyAqLworCisJCWlmIChza19YNTA5X251bShjZXJ0X3NrKSA+IDApCisJCQl7CisJCQlpZiAoIWJhdGNoKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuJWQgb3V0IG9mICVkIGNlcnRpZmljYXRlIHJlcXVlc3RzIGNlcnRpZmllZCwgY29tbWl0PyBbeS9uXSIsdG90YWxfZG9uZSx0b3RhbCk7CisJCQkJKHZvaWQpQklPX2ZsdXNoKGJpb19lcnIpOworCQkJCWJ1ZlswXVswXT0nXDAnOworCQkJCWlmICghZmdldHMoYnVmWzBdLDEwLHN0ZGluKSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkNFUlRJRklDQVRJT04gQ0FOQ0VMRUQ6IEkvTyBlcnJvclxuIik7IAorCQkJCQlyZXQ9MDsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlpZiAoKGJ1ZlswXVswXSAhPSAneScpICYmIChidWZbMF1bMF0gIT0gJ1knKSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkNFUlRJRklDQVRJT04gQ0FOQ0VMRURcbiIpOyAKKwkJCQkJcmV0PTA7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJfQorCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIldyaXRlIG91dCBkYXRhYmFzZSB3aXRoICVkIG5ldyBlbnRyaWVzXG4iLHNrX1g1MDlfbnVtKGNlcnRfc2spKTsKKworCQkJaWYgKCFzYXZlX3NlcmlhbChzZXJpYWxmaWxlLCJuZXciLHNlcmlhbCxOVUxMKSkgZ290byBlcnI7CisKKwkJCWlmICghc2F2ZV9pbmRleChkYmZpbGUsICJuZXciLCBkYikpIGdvdG8gZXJyOworCQkJfQorCQorCQlpZiAodmVyYm9zZSkKKwkJCUJJT19wcmludGYoYmlvX2Vyciwid3JpdGluZyBuZXcgY2VydGlmaWNhdGVzXG4iKTsKKwkJZm9yIChpPTA7IGk8c2tfWDUwOV9udW0oY2VydF9zayk7IGkrKykKKwkJCXsKKwkJCWludCBrOworCQkJY2hhciAqbjsKKworCQkJeD1za19YNTA5X3ZhbHVlKGNlcnRfc2ssaSk7CisKKwkJCWo9eC0+Y2VydF9pbmZvLT5zZXJpYWxOdW1iZXItPmxlbmd0aDsKKwkJCXA9KGNvbnN0IGNoYXIgKil4LT5jZXJ0X2luZm8tPnNlcmlhbE51bWJlci0+ZGF0YTsKKwkJCQorCQkJaWYoc3RybGVuKG91dGRpcikgPj0gKHNpemVfdCkoaiA/IEJTSVpFLWoqMi02IDogQlNJWkUtOCkpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwiY2VydGlmaWNhdGUgZmlsZSBuYW1lIHRvbyBsb25nXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCXN0cmNweShidWZbMl0sb3V0ZGlyKTsKKworI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJCUJVRl9zdHJsY2F0KGJ1ZlsyXSwiLyIsc2l6ZW9mKGJ1ZlsyXSkpOworI2VuZGlmCisKKwkJCW49KGNoYXIgKikmKGJ1ZlsyXVtzdHJsZW4oYnVmWzJdKV0pOworCQkJaWYgKGogPiAwKQorCQkJCXsKKwkJCQlmb3IgKGs9MDsgazxqOyBrKyspCisJCQkJCXsKKwkJCQkJaWYgKG4gPj0gJihidWZbMl1bc2l6ZW9mKGJ1ZlsyXSldKSkKKwkJCQkJCWJyZWFrOworCQkJCQlCSU9fc25wcmludGYobiwKKwkJCQkJCSAgICAgJmJ1ZlsyXVswXSArIHNpemVvZihidWZbMl0pIC0gbiwKKwkJCQkJCSAgICAgIiUwMlgiLCh1bnNpZ25lZCBjaGFyKSoocCsrKSk7CisJCQkJCW4rPTI7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCSoobisrKT0nMCc7CisJCQkJKihuKyspPScwJzsKKwkJCQl9CisJCQkqKG4rKyk9Jy4nOyAqKG4rKyk9J3AnOyAqKG4rKyk9J2UnOyAqKG4rKyk9J20nOworCQkJKm49J1wwJzsKKwkJCWlmICh2ZXJib3NlKQorCQkJCUJJT19wcmludGYoYmlvX2Vyciwid3JpdGluZyAlc1xuIixidWZbMl0pOworCisJCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKENvdXQsYnVmWzJdKSA8PSAwKQorCQkJCXsKKwkJCQlwZXJyb3IoYnVmWzJdKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl3cml0ZV9uZXdfY2VydGlmaWNhdGUoQ291dCx4LCAwLCBub3RleHQpOworCQkJd3JpdGVfbmV3X2NlcnRpZmljYXRlKFNvdXQseCwgb3V0cHV0X2Rlciwgbm90ZXh0KTsKKwkJCX0KKworCQlpZiAoc2tfWDUwOV9udW0oY2VydF9zaykpCisJCQl7CisJCQkvKiBSZW5hbWUgdGhlIGRhdGFiYXNlIGFuZCB0aGUgc2VyaWFsIGZpbGUgKi8KKwkJCWlmICghcm90YXRlX3NlcmlhbChzZXJpYWxmaWxlLCJuZXciLCJvbGQiKSkgZ290byBlcnI7CisKKwkJCWlmICghcm90YXRlX2luZGV4KGRiZmlsZSwibmV3Iiwib2xkIikpIGdvdG8gZXJyOworCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkRhdGEgQmFzZSBVcGRhdGVkXG4iKTsKKwkJCX0KKwkJfQorCQorCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoZ2VuY3JsKQorCQl7CisJCWludCBjcmxfdjIgPSAwOworCQlpZiAoIWNybF9leHQpCisJCQl7CisJCQljcmxfZXh0PU5DT05GX2dldF9zdHJpbmcoY29uZixzZWN0aW9uLEVOVl9DUkxFWFQpOworCQkJaWYgKCFjcmxfZXh0KQorCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJfQorCQlpZiAoY3JsX2V4dCkKKwkJCXsKKwkJCS8qIENoZWNrIHN5bnRheCBvZiBmaWxlICovCisJCQlYNTA5VjNfQ1RYIGN0eDsKKwkJCVg1MDlWM19zZXRfY3R4X3Rlc3QoJmN0eCk7CisJCQlYNTA5VjNfc2V0X25jb25mKCZjdHgsIGNvbmYpOworCQkJaWYgKCFYNTA5VjNfRVhUX2FkZF9uY29uZihjb25mLCAmY3R4LCBjcmxfZXh0LCBOVUxMKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSAiRXJyb3IgTG9hZGluZyBDUkwgZXh0ZW5zaW9uIHNlY3Rpb24gJXNcbiIsCisJCQkJCQkJCSBjcmxfZXh0KTsKKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKworCQlpZiAoKGNybG51bWJlcmZpbGU9TkNPTkZfZ2V0X3N0cmluZyhjb25mLHNlY3Rpb24sRU5WX0NSTE5VTUJFUikpCisJCQkhPSBOVUxMKQorCQkJaWYgKChjcmxudW1iZXI9bG9hZF9zZXJpYWwoY3JsbnVtYmVyZmlsZSwwLE5VTEwpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHdoaWxlIGxvYWRpbmcgQ1JMIG51bWJlclxuIik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCWlmICghY3JsZGF5cyAmJiAhY3JsaG91cnMgJiYgIWNybHNlYykKKwkJCXsKKwkJCWlmICghTkNPTkZfZ2V0X251bWJlcihjb25mLHNlY3Rpb24sCisJCQkJRU5WX0RFRkFVTFRfQ1JMX0RBWVMsICZjcmxkYXlzKSkKKwkJCQljcmxkYXlzID0gMDsKKwkJCWlmICghTkNPTkZfZ2V0X251bWJlcihjb25mLHNlY3Rpb24sCisJCQkJRU5WX0RFRkFVTFRfQ1JMX0hPVVJTLCAmY3JsaG91cnMpKQorCQkJCWNybGhvdXJzID0gMDsKKwkJCX0KKwkJaWYgKChjcmxkYXlzID09IDApICYmIChjcmxob3VycyA9PSAwKSAmJiAoY3Jsc2VjID09IDApKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJjYW5ub3QgbG9va3VwIGhvdyBsb25nIHVudGlsIHRoZSBuZXh0IENSTCBpcyBpc3N1ZWRcbiIpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKHZlcmJvc2UpIEJJT19wcmludGYoYmlvX2VyciwibWFraW5nIENSTFxuIik7CisJCWlmICgoY3JsPVg1MDlfQ1JMX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJaWYgKCFYNTA5X0NSTF9zZXRfaXNzdWVyX25hbWUoY3JsLCBYNTA5X2dldF9zdWJqZWN0X25hbWUoeDUwOSkpKSBnb3RvIGVycjsKKworCQl0bXB0bSA9IEFTTjFfVElNRV9uZXcoKTsKKwkJaWYgKCF0bXB0bSkgZ290byBlcnI7CisJCVg1MDlfZ210aW1lX2Fkaih0bXB0bSwwKTsKKwkJWDUwOV9DUkxfc2V0X2xhc3RVcGRhdGUoY3JsLCB0bXB0bSk7CQorCQlpZiAoIVg1MDlfdGltZV9hZGpfZXgodG1wdG0sIGNybGRheXMsIGNybGhvdXJzKjYwKjYwICsgY3Jsc2VjLAorCQkJTlVMTCkpCisJCQl7CisJCQlCSU9fcHV0cyhiaW9fZXJyLCAiZXJyb3Igc2V0dGluZyBDUkwgbmV4dFVwZGF0ZVxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJWDUwOV9DUkxfc2V0X25leHRVcGRhdGUoY3JsLCB0bXB0bSk7CQorCisJCUFTTjFfVElNRV9mcmVlKHRtcHRtKTsKKworCQlmb3IgKGk9MDsgaTxza19PUEVOU1NMX1BTVFJJTkdfbnVtKGRiLT5kYi0+ZGF0YSk7IGkrKykKKwkJCXsKKwkJCXBwPXNrX09QRU5TU0xfUFNUUklOR192YWx1ZShkYi0+ZGItPmRhdGEsaSk7CisJCQlpZiAocHBbREJfdHlwZV1bMF0gPT0gREJfVFlQRV9SRVYpCisJCQkJeworCQkJCWlmICgocj1YNTA5X1JFVk9LRURfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWogPSBtYWtlX3Jldm9rZWQociwgcHBbREJfcmV2X2RhdGVdKTsKKwkJCQlpZiAoIWopIGdvdG8gZXJyOworCQkJCWlmIChqID09IDIpIGNybF92MiA9IDE7CisJCQkJaWYgKCFCTl9oZXgyYm4oJnNlcmlhbCwgcHBbREJfc2VyaWFsXSkpCisJCQkJCWdvdG8gZXJyOworCQkJCXRtcHNlciA9IEJOX3RvX0FTTjFfSU5URUdFUihzZXJpYWwsIE5VTEwpOworCQkJCUJOX2ZyZWUoc2VyaWFsKTsKKwkJCQlzZXJpYWwgPSBOVUxMOworCQkJCWlmICghdG1wc2VyKQorCQkJCQlnb3RvIGVycjsKKwkJCQlYNTA5X1JFVk9LRURfc2V0X3NlcmlhbE51bWJlcihyLCB0bXBzZXIpOworCQkJCUFTTjFfSU5URUdFUl9mcmVlKHRtcHNlcik7CisJCQkJWDUwOV9DUkxfYWRkMF9yZXZva2VkKGNybCxyKTsKKwkJCQl9CisJCQl9CisKKwkJLyogc29ydCB0aGUgZGF0YSBzbyBpdCB3aWxsIGJlIHdyaXR0ZW4gaW4gc2VyaWFsCisJCSAqIG51bWJlciBvcmRlciAqLworCQlYNTA5X0NSTF9zb3J0KGNybCk7CisKKwkJLyogd2Ugbm93IGhhdmUgYSBDUkwgKi8KKwkJaWYgKHZlcmJvc2UpIEJJT19wcmludGYoYmlvX2Vyciwic2lnbmluZyBDUkxcbiIpOworCisJCS8qIEFkZCBhbnkgZXh0ZW5zaW9ucyBhc2tlZCBmb3IgKi8KKworCQlpZiAoY3JsX2V4dCB8fCBjcmxudW1iZXJmaWxlICE9IE5VTEwpCisJCQl7CisJCQlYNTA5VjNfQ1RYIGNybGN0eDsKKwkJCVg1MDlWM19zZXRfY3R4KCZjcmxjdHgsIHg1MDksIE5VTEwsIE5VTEwsIGNybCwgMCk7CisJCQlYNTA5VjNfc2V0X25jb25mKCZjcmxjdHgsIGNvbmYpOworCisJCQlpZiAoY3JsX2V4dCkKKwkJCQlpZiAoIVg1MDlWM19FWFRfQ1JMX2FkZF9uY29uZihjb25mLCAmY3JsY3R4LAorCQkJCQljcmxfZXh0LCBjcmwpKSBnb3RvIGVycjsKKwkJCWlmIChjcmxudW1iZXJmaWxlICE9IE5VTEwpCisJCQkJeworCQkJCXRtcHNlciA9IEJOX3RvX0FTTjFfSU5URUdFUihjcmxudW1iZXIsIE5VTEwpOworCQkJCWlmICghdG1wc2VyKSBnb3RvIGVycjsKKwkJCQlYNTA5X0NSTF9hZGQxX2V4dF9pMmQoY3JsLE5JRF9jcmxfbnVtYmVyLHRtcHNlciwwLDApOworCQkJCUFTTjFfSU5URUdFUl9mcmVlKHRtcHNlcik7CisJCQkJY3JsX3YyID0gMTsKKwkJCQlpZiAoIUJOX2FkZF93b3JkKGNybG51bWJlciwxKSkgZ290byBlcnI7CisJCQkJfQorCQkJfQorCQlpZiAoY3JsX2V4dCB8fCBjcmxfdjIpCisJCQl7CisJCQlpZiAoIVg1MDlfQ1JMX3NldF92ZXJzaW9uKGNybCwgMSkpCisJCQkJZ290byBlcnI7IC8qIHZlcnNpb24gMiBDUkwgKi8KKwkJCX0KKworCQkKKwkJaWYgKGNybG51bWJlcmZpbGUgIT0gTlVMTCkJLyogd2UgaGF2ZSBhIENSTCBudW1iZXIgdGhhdCBuZWVkIHVwZGF0aW5nICovCisJCQlpZiAoIXNhdmVfc2VyaWFsKGNybG51bWJlcmZpbGUsIm5ldyIsY3JsbnVtYmVyLE5VTEwpKSBnb3RvIGVycjsKKworCQlpZiAoY3JsbnVtYmVyKQorCQkJeworCQkJQk5fZnJlZShjcmxudW1iZXIpOworCQkJY3JsbnVtYmVyID0gTlVMTDsKKwkJCX0KKworCQlpZiAoIVg1MDlfQ1JMX3NpZ24oY3JsLHBrZXksZGdzdCkpIGdvdG8gZXJyOworCisJCVBFTV93cml0ZV9iaW9fWDUwOV9DUkwoU291dCxjcmwpOworCisJCWlmIChjcmxudW1iZXJmaWxlICE9IE5VTEwpCS8qIFJlbmFtZSB0aGUgY3JsbnVtYmVyIGZpbGUgKi8KKwkJCWlmICghcm90YXRlX3NlcmlhbChjcmxudW1iZXJmaWxlLCJuZXciLCJvbGQiKSkgZ290byBlcnI7CisKKwkJfQorCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoZG9yZXZva2UpCisJCXsKKwkJaWYgKGluZmlsZSA9PSBOVUxMKSAKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2Vyciwibm8gaW5wdXQgZmlsZXNcbiIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCVg1MDkgKnJldmNlcnQ7CisJCQlyZXZjZXJ0PWxvYWRfY2VydChiaW9fZXJyLCBpbmZpbGUsIEZPUk1BVF9QRU0sCisJCQkJTlVMTCwgZSwgaW5maWxlKTsKKwkJCWlmIChyZXZjZXJ0ID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCQlqPWRvX3Jldm9rZShyZXZjZXJ0LGRiLCByZXZfdHlwZSwgcmV2X2FyZyk7CisJCQlpZiAoaiA8PSAwKSBnb3RvIGVycjsKKwkJCVg1MDlfZnJlZShyZXZjZXJ0KTsKKworCQkJaWYgKCFzYXZlX2luZGV4KGRiZmlsZSwgIm5ldyIsIGRiKSkgZ290byBlcnI7CisKKwkJCWlmICghcm90YXRlX2luZGV4KGRiZmlsZSwgIm5ldyIsICJvbGQiKSkgZ290byBlcnI7CisKKwkJCUJJT19wcmludGYoYmlvX2VyciwiRGF0YSBCYXNlIFVwZGF0ZWRcbiIpOyAKKwkJCX0KKwkJfQorCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlyZXQ9MDsKK2VycjoKKwlpZih0b2ZyZWUpCisJCU9QRU5TU0xfZnJlZSh0b2ZyZWUpOworCUJJT19mcmVlX2FsbChDb3V0KTsKKwlCSU9fZnJlZV9hbGwoU291dCk7CisJQklPX2ZyZWVfYWxsKG91dCk7CisJQklPX2ZyZWVfYWxsKGluKTsKKworCWlmIChjZXJ0X3NrKQorCQlza19YNTA5X3BvcF9mcmVlKGNlcnRfc2ssWDUwOV9mcmVlKTsKKworCWlmIChyZXQpIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJYXBwX1JBTkRfd3JpdGVfZmlsZShyYW5kZmlsZSwgYmlvX2Vycik7CisJaWYgKGZyZWVfa2V5ICYmIGtleSkKKwkJT1BFTlNTTF9mcmVlKGtleSk7CisJQk5fZnJlZShzZXJpYWwpOworCUJOX2ZyZWUoY3JsbnVtYmVyKTsKKwlmcmVlX2luZGV4KGRiKTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCWlmICh4NTA5KSBYNTA5X2ZyZWUoeDUwOSk7CisJWDUwOV9DUkxfZnJlZShjcmwpOworCU5DT05GX2ZyZWUoY29uZik7CisJTkNPTkZfZnJlZShleHRjb25mKTsKKwlPQkpfY2xlYW51cCgpOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQocmV0KTsKKwl9CisKK3N0YXRpYyB2b2lkIGxvb2t1cF9mYWlsKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnRhZykKKwl7CisJQklPX3ByaW50ZihiaW9fZXJyLCJ2YXJpYWJsZSBsb29rdXAgZmFpbGVkIGZvciAlczo6JXNcbiIsbmFtZSx0YWcpOworCX0KKworc3RhdGljIGludCBjZXJ0aWZ5KFg1MDkgKip4cmV0LCBjaGFyICppbmZpbGUsIEVWUF9QS0VZICpwa2V5LCBYNTA5ICp4NTA5LAorCSAgICAgY29uc3QgRVZQX01EICpkZ3N0LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqcG9saWN5LCBDQV9EQiAqZGIsCisJICAgICBCSUdOVU0gKnNlcmlhbCwgY2hhciAqc3Viaix1bnNpZ25lZCBsb25nIGNodHlwZSwgaW50IG11bHRpcmRuLCBpbnQgZW1haWxfZG4sIGNoYXIgKnN0YXJ0ZGF0ZSwgY2hhciAqZW5kZGF0ZSwKKwkgICAgIGxvbmcgZGF5cywgaW50IGJhdGNoLCBjaGFyICpleHRfc2VjdCwgQ09ORiAqbGNvbmYsIGludCB2ZXJib3NlLAorCSAgICAgdW5zaWduZWQgbG9uZyBjZXJ0b3B0LCB1bnNpZ25lZCBsb25nIG5hbWVvcHQsIGludCBkZWZhdWx0X29wLAorCSAgICAgaW50IGV4dF9jb3B5LCBpbnQgc2VsZnNpZ24pCisJeworCVg1MDlfUkVRICpyZXE9TlVMTDsKKwlCSU8gKmluPU5VTEw7CisJRVZQX1BLRVkgKnBrdG1wPU5VTEw7CisJaW50IG9rPSAtMSxpOworCisJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCisJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGluZmlsZSkgPD0gMCkKKwkJeworCQlwZXJyb3IoaW5maWxlKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoKHJlcT1QRU1fcmVhZF9iaW9fWDUwOV9SRVEoaW4sTlVMTCxOVUxMLE5VTEwpKSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiRXJyb3IgcmVhZGluZyBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGluICVzXG4iLAorCQkJaW5maWxlKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAodmVyYm9zZSkKKwkJWDUwOV9SRVFfcHJpbnQoYmlvX2VycixyZXEpOworCisJQklPX3ByaW50ZihiaW9fZXJyLCJDaGVjayB0aGF0IHRoZSByZXF1ZXN0IG1hdGNoZXMgdGhlIHNpZ25hdHVyZVxuIik7CisKKwlpZiAoc2VsZnNpZ24gJiYgIVg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5KHJlcSxwa2V5KSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIkNlcnRpZmljYXRlIHJlcXVlc3QgYW5kIENBIHByaXZhdGUga2V5IGRvIG5vdCBtYXRjaFxuIik7CisJCW9rPTA7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKChwa3RtcD1YNTA5X1JFUV9nZXRfcHVia2V5KHJlcSkpID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciB1bnBhY2tpbmcgcHVibGljIGtleVxuIik7CisJCWdvdG8gZXJyOworCQl9CisJaT1YNTA5X1JFUV92ZXJpZnkocmVxLHBrdG1wKTsKKwlFVlBfUEtFWV9mcmVlKHBrdG1wKTsKKwlpZiAoaSA8IDApCisJCXsKKwkJb2s9MDsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJTaWduYXR1cmUgdmVyaWZpY2F0aW9uIHByb2JsZW1zLi4uLlxuIik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKGkgPT0gMCkKKwkJeworCQlvaz0wOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlNpZ25hdHVyZSBkaWQgbm90IG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0XG4iKTsKKwkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCUJJT19wcmludGYoYmlvX2VyciwiU2lnbmF0dXJlIG9rXG4iKTsKKworCW9rPWRvX2JvZHkoeHJldCxwa2V5LHg1MDksZGdzdCxwb2xpY3ksZGIsc2VyaWFsLHN1YmosY2h0eXBlLG11bHRpcmRuLCBlbWFpbF9kbiwKKwkJc3RhcnRkYXRlLGVuZGRhdGUsZGF5cyxiYXRjaCx2ZXJib3NlLHJlcSxleHRfc2VjdCxsY29uZiwKKwkJY2VydG9wdCwgbmFtZW9wdCwgZGVmYXVsdF9vcCwgZXh0X2NvcHksIHNlbGZzaWduKTsKKworZXJyOgorCWlmIChyZXEgIT0gTlVMTCkgWDUwOV9SRVFfZnJlZShyZXEpOworCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJcmV0dXJuKG9rKTsKKwl9CisKK3N0YXRpYyBpbnQgY2VydGlmeV9jZXJ0KFg1MDkgKip4cmV0LCBjaGFyICppbmZpbGUsIEVWUF9QS0VZICpwa2V5LCBYNTA5ICp4NTA5LAorCSAgICAgY29uc3QgRVZQX01EICpkZ3N0LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqcG9saWN5LCBDQV9EQiAqZGIsCisJICAgICBCSUdOVU0gKnNlcmlhbCwgY2hhciAqc3ViaiwgdW5zaWduZWQgbG9uZyBjaHR5cGUsIGludCBtdWx0aXJkbiwgaW50IGVtYWlsX2RuLCBjaGFyICpzdGFydGRhdGUsIGNoYXIgKmVuZGRhdGUsCisJICAgICBsb25nIGRheXMsIGludCBiYXRjaCwgY2hhciAqZXh0X3NlY3QsIENPTkYgKmxjb25mLCBpbnQgdmVyYm9zZSwKKwkgICAgIHVuc2lnbmVkIGxvbmcgY2VydG9wdCwgdW5zaWduZWQgbG9uZyBuYW1lb3B0LCBpbnQgZGVmYXVsdF9vcCwKKwkgICAgIGludCBleHRfY29weSwgRU5HSU5FICplKQorCXsKKwlYNTA5ICpyZXE9TlVMTDsKKwlYNTA5X1JFUSAqcnJlcT1OVUxMOworCUVWUF9QS0VZICpwa3RtcD1OVUxMOworCWludCBvaz0gLTEsaTsKKworCWlmICgocmVxPWxvYWRfY2VydChiaW9fZXJyLCBpbmZpbGUsIEZPUk1BVF9QRU0sIE5VTEwsIGUsIGluZmlsZSkpID09IE5VTEwpCisJCWdvdG8gZXJyOworCWlmICh2ZXJib3NlKQorCQlYNTA5X3ByaW50KGJpb19lcnIscmVxKTsKKworCUJJT19wcmludGYoYmlvX2VyciwiQ2hlY2sgdGhhdCB0aGUgcmVxdWVzdCBtYXRjaGVzIHRoZSBzaWduYXR1cmVcbiIpOworCisJaWYgKChwa3RtcD1YNTA5X2dldF9wdWJrZXkocmVxKSkgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHVucGFja2luZyBwdWJsaWMga2V5XG4iKTsKKwkJZ290byBlcnI7CisJCX0KKwlpPVg1MDlfdmVyaWZ5KHJlcSxwa3RtcCk7CisJRVZQX1BLRVlfZnJlZShwa3RtcCk7CisJaWYgKGkgPCAwKQorCQl7CisJCW9rPTA7CisJCUJJT19wcmludGYoYmlvX2VyciwiU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBwcm9ibGVtcy4uLi5cbiIpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChpID09IDApCisJCXsKKwkJb2s9MDsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJTaWduYXR1cmUgZGlkIG5vdCBtYXRjaCB0aGUgY2VydGlmaWNhdGVcbiIpOworCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJTaWduYXR1cmUgb2tcbiIpOworCisJaWYgKChycmVxPVg1MDlfdG9fWDUwOV9SRVEocmVxLE5VTEwsRVZQX21kNSgpKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlvaz1kb19ib2R5KHhyZXQscGtleSx4NTA5LGRnc3QscG9saWN5LGRiLHNlcmlhbCxzdWJqLGNodHlwZSxtdWx0aXJkbixlbWFpbF9kbixzdGFydGRhdGUsZW5kZGF0ZSwKKwkJZGF5cyxiYXRjaCx2ZXJib3NlLHJyZXEsZXh0X3NlY3QsbGNvbmYsIGNlcnRvcHQsIG5hbWVvcHQsIGRlZmF1bHRfb3AsCisJCWV4dF9jb3B5LCAwKTsKKworZXJyOgorCWlmIChycmVxICE9IE5VTEwpIFg1MDlfUkVRX2ZyZWUocnJlcSk7CisJaWYgKHJlcSAhPSBOVUxMKSBYNTA5X2ZyZWUocmVxKTsKKwlyZXR1cm4ob2spOworCX0KKworc3RhdGljIGludCBkb19ib2R5KFg1MDkgKip4cmV0LCBFVlBfUEtFWSAqcGtleSwgWDUwOSAqeDUwOSwgY29uc3QgRVZQX01EICpkZ3N0LAorCSAgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnBvbGljeSwgQ0FfREIgKmRiLCBCSUdOVU0gKnNlcmlhbCwgY2hhciAqc3ViaiwKKwkgICAgIHVuc2lnbmVkIGxvbmcgY2h0eXBlLCBpbnQgbXVsdGlyZG4sCisJICAgICBpbnQgZW1haWxfZG4sIGNoYXIgKnN0YXJ0ZGF0ZSwgY2hhciAqZW5kZGF0ZSwgbG9uZyBkYXlzLCBpbnQgYmF0Y2gsCisJICAgICBpbnQgdmVyYm9zZSwgWDUwOV9SRVEgKnJlcSwgY2hhciAqZXh0X3NlY3QsIENPTkYgKmxjb25mLAorCSAgICAgdW5zaWduZWQgbG9uZyBjZXJ0b3B0LCB1bnNpZ25lZCBsb25nIG5hbWVvcHQsIGludCBkZWZhdWx0X29wLAorCSAgICAgaW50IGV4dF9jb3B5LCBpbnQgc2VsZnNpZ24pCisJeworCVg1MDlfTkFNRSAqbmFtZT1OVUxMLCpDQW5hbWU9TlVMTCwqc3ViamVjdD1OVUxMLCAqZG5fc3ViamVjdD1OVUxMOworCUFTTjFfVVRDVElNRSAqdG0sKnRtcHRtOworCUFTTjFfU1RSSU5HICpzdHIsKnN0cjI7CisJQVNOMV9PQkpFQ1QgKm9iajsKKwlYNTA5ICpyZXQ9TlVMTDsKKwlYNTA5X0NJTkYgKmNpOworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJWDUwOV9OQU1FX0VOVFJZICp0bmUsKnB1c2g7CisJRVZQX1BLRVkgKnBrdG1wOworCWludCBvaz0gLTEsaSxqLGxhc3QsbmlkOworCWNvbnN0IGNoYXIgKnA7CisJQ09ORl9WQUxVRSAqY3Y7CisJT1BFTlNTTF9TVFJJTkcgcm93W0RCX05VTUJFUl07CisJT1BFTlNTTF9TVFJJTkcgKmlyb3c9TlVMTDsKKwlPUEVOU1NMX1NUUklORyAqcnJvdz1OVUxMOworCWNoYXIgYnVmWzI1XTsKKworCXRtcHRtPUFTTjFfVVRDVElNRV9uZXcoKTsKKwlpZiAodG1wdG0gPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIm1hbGxvYyBlcnJvclxuIik7CisJCXJldHVybigwKTsKKwkJfQorCisJZm9yIChpPTA7IGk8REJfTlVNQkVSOyBpKyspCisJCXJvd1tpXT1OVUxMOworCisJaWYgKHN1YmopCisJCXsKKwkJWDUwOV9OQU1FICpuID0gcGFyc2VfbmFtZShzdWJqLCBjaHR5cGUsIG11bHRpcmRuKTsKKworCQlpZiAoIW4pCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlcnI7CisJCQl9CisJCVg1MDlfUkVRX3NldF9zdWJqZWN0X25hbWUocmVxLG4pOworCQlyZXEtPnJlcV9pbmZvLT5lbmMubW9kaWZpZWQgPSAxOworCQlYNTA5X05BTUVfZnJlZShuKTsKKwkJfQorCisJaWYgKGRlZmF1bHRfb3ApCisJCUJJT19wcmludGYoYmlvX2VyciwiVGhlIFN1YmplY3QncyBEaXN0aW5ndWlzaGVkIE5hbWUgaXMgYXMgZm9sbG93c1xuIik7CisKKwluYW1lPVg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUocmVxKTsKKwlmb3IgKGk9MDsgaTxYNTA5X05BTUVfZW50cnlfY291bnQobmFtZSk7IGkrKykKKwkJeworCQluZT0gWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLGkpOworCQlzdHI9WDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKG5lKTsKKwkJb2JqPVg1MDlfTkFNRV9FTlRSWV9nZXRfb2JqZWN0KG5lKTsKKworCQlpZiAobXNpZV9oYWNrKQorCQkJeworCQkJLyogYXNzdW1lIGFsbCB0eXBlIHNob3VsZCBiZSBzdHJpbmdzICovCisJCQluaWQ9T0JKX29iajJuaWQobmUtPm9iamVjdCk7CisKKwkJCWlmIChzdHItPnR5cGUgPT0gVl9BU04xX1VOSVZFUlNBTFNUUklORykKKwkJCQlBU04xX1VOSVZFUlNBTFNUUklOR190b19zdHJpbmcoc3RyKTsKKworCQkJaWYgKChzdHItPnR5cGUgPT0gVl9BU04xX0lBNVNUUklORykgJiYKKwkJCQkobmlkICE9IE5JRF9wa2NzOV9lbWFpbEFkZHJlc3MpKQorCQkJCXN0ci0+dHlwZT1WX0FTTjFfVDYxU1RSSU5HOworCisJCQlpZiAoKG5pZCA9PSBOSURfcGtjczlfZW1haWxBZGRyZXNzKSAmJgorCQkJCShzdHItPnR5cGUgPT0gVl9BU04xX1BSSU5UQUJMRVNUUklORykpCisJCQkJc3RyLT50eXBlPVZfQVNOMV9JQTVTVFJJTkc7CisJCQl9CisKKwkJLyogSWYgbm8gRU1BSUwgaXMgd2FudGVkIGluIHRoZSBzdWJqZWN0ICovCisJCWlmICgoT0JKX29iajJuaWQob2JqKSA9PSBOSURfcGtjczlfZW1haWxBZGRyZXNzKSAmJiAoIWVtYWlsX2RuKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGNoZWNrIHNvbWUgdGhpbmdzICovCisJCWlmICgoT0JKX29iajJuaWQob2JqKSA9PSBOSURfcGtjczlfZW1haWxBZGRyZXNzKSAmJgorCQkJKHN0ci0+dHlwZSAhPSBWX0FTTjFfSUE1U1RSSU5HKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiXG5lbWFpbEFkZHJlc3MgdHlwZSBuZWVkcyB0byBiZSBvZiB0eXBlIElBNVNUUklOR1xuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKChzdHItPnR5cGUgIT0gVl9BU04xX0JNUFNUUklORykgJiYgKHN0ci0+dHlwZSAhPSBWX0FTTjFfVVRGOFNUUklORykpCisJCQl7CisJCQlqPUFTTjFfUFJJTlRBQkxFX3R5cGUoc3RyLT5kYXRhLHN0ci0+bGVuZ3RoKTsKKwkJCWlmICgJKChqID09IFZfQVNOMV9UNjFTVFJJTkcpICYmCisJCQkJIChzdHItPnR5cGUgIT0gVl9BU04xX1Q2MVNUUklORykpIHx8CisJCQkJKChqID09IFZfQVNOMV9JQTVTVFJJTkcpICYmCisJCQkJIChzdHItPnR5cGUgPT0gVl9BU04xX1BSSU5UQUJMRVNUUklORykpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuVGhlIHN0cmluZyBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgYXJlIGlsbGVnYWwgZm9yIHRoZSBBU04uMSB0eXBlXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisKKwkJaWYgKGRlZmF1bHRfb3ApCisJCQlvbGRfZW50cnlfcHJpbnQoYmlvX2Vyciwgb2JqLCBzdHIpOworCQl9CisKKwkvKiBPaywgbm93IHdlIGNoZWNrIHRoZSAncG9saWN5JyBzdHVmZi4gKi8KKwlpZiAoKHN1YmplY3Q9WDUwOV9OQU1FX25ldygpKSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiB0YWtlIGEgY29weSBvZiB0aGUgaXNzdWVyIG5hbWUgYmVmb3JlIHdlIG1lc3Mgd2l0aCBpdC4gKi8KKwlpZiAoc2VsZnNpZ24pCisJCUNBbmFtZT1YNTA5X05BTUVfZHVwKG5hbWUpOworCWVsc2UKKwkJQ0FuYW1lPVg1MDlfTkFNRV9kdXAoeDUwOS0+Y2VydF9pbmZvLT5zdWJqZWN0KTsKKwlpZiAoQ0FuYW1lID09IE5VTEwpIGdvdG8gZXJyOworCXN0cj1zdHIyPU5VTEw7CisKKwlmb3IgKGk9MDsgaTxza19DT05GX1ZBTFVFX251bShwb2xpY3kpOyBpKyspCisJCXsKKwkJY3Y9c2tfQ09ORl9WQUxVRV92YWx1ZShwb2xpY3ksaSk7IC8qIGdldCB0aGUgb2JqZWN0IGlkICovCisJCWlmICgoaj1PQkpfdHh0Mm5pZChjdi0+bmFtZSkpID09IE5JRF91bmRlZikKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJXM6dW5rbm93biBvYmplY3QgdHlwZSBpbiAncG9saWN5JyBjb25maWd1cmF0aW9uXG4iLGN2LT5uYW1lKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlvYmo9T0JKX25pZDJvYmooaik7CisKKwkJbGFzdD0gLTE7CisJCWZvciAoOzspCisJCQl7CisJCQkvKiBsb29rdXAgdGhlIG9iamVjdCBpbiB0aGUgc3VwcGxpZWQgbmFtZSBsaXN0ICovCisJCQlqPVg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfT0JKKG5hbWUsb2JqLGxhc3QpOworCQkJaWYgKGogPCAwKQorCQkJCXsKKwkJCQlpZiAobGFzdCAhPSAtMSkgYnJlYWs7CisJCQkJdG5lPU5VTEw7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQl0bmU9WDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLGopOworCQkJCX0KKwkJCWxhc3Q9ajsKKworCQkJLyogZGVwZW5kaW5nIG9uIHRoZSAncG9saWN5JywgZGVjaWRlIHdoYXQgdG8gZG8uICovCisJCQlwdXNoPU5VTEw7CisJCQlpZiAoc3RyY21wKGN2LT52YWx1ZSwib3B0aW9uYWwiKSA9PSAwKQorCQkJCXsKKwkJCQlpZiAodG5lICE9IE5VTEwpCisJCQkJCXB1c2g9dG5lOworCQkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChjdi0+dmFsdWUsInN1cHBsaWVkIikgPT0gMCkKKwkJCQl7CisJCQkJaWYgKHRuZSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwiVGhlICVzIGZpZWxkIG5lZWRlZCB0byBiZSBzdXBwbGllZCBhbmQgd2FzIG1pc3NpbmdcbiIsY3YtPm5hbWUpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJcHVzaD10bmU7CisJCQkJfQorCQkJZWxzZSBpZiAoc3RyY21wKGN2LT52YWx1ZSwibWF0Y2giKSA9PSAwKQorCQkJCXsKKwkJCQlpbnQgbGFzdDI7CisKKwkJCQlpZiAodG5lID09IE5VTEwpCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJUaGUgbWFuZGF0b3J5ICVzIGZpZWxkIHdhcyBtaXNzaW5nXG4iLGN2LT5uYW1lKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKworCQkJCWxhc3QyPSAtMTsKKworYWdhaW4yOgorCQkJCWo9WDUwOV9OQU1FX2dldF9pbmRleF9ieV9PQkooQ0FuYW1lLG9iaixsYXN0Mik7CisJCQkJaWYgKChqIDwgMCkgJiYgKGxhc3QyID09IC0xKSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlRoZSAlcyBmaWVsZCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ0EgY2VydGlmaWNhdGUsXG50aGUgJ3BvbGljeScgaXMgbWlzY29uZmlndXJlZFxuIixjdi0+bmFtZSk7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJaWYgKGogPj0gMCkKKwkJCQkJeworCQkJCQlwdXNoPVg1MDlfTkFNRV9nZXRfZW50cnkoQ0FuYW1lLGopOworCQkJCQlzdHI9WDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKHRuZSk7CisJCQkJCXN0cjI9WDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKHB1c2gpOworCQkJCQlsYXN0Mj1qOworCQkJCQlpZiAoQVNOMV9TVFJJTkdfY21wKHN0cixzdHIyKSAhPSAwKQorCQkJCQkJZ290byBhZ2FpbjI7CisJCQkJCX0KKwkJCQlpZiAoaiA8IDApCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJUaGUgJXMgZmllbGQgbmVlZGVkIHRvIGJlIHRoZSBzYW1lIGluIHRoZVxuQ0EgY2VydGlmaWNhdGUgKCVzKSBhbmQgdGhlIHJlcXVlc3QgKCVzKVxuIixjdi0+bmFtZSwoKHN0cjIgPT0gTlVMTCk/Ik5VTEwiOihjaGFyICopc3RyMi0+ZGF0YSksKChzdHIgPT0gTlVMTCk/Ik5VTEwiOihjaGFyICopc3RyLT5kYXRhKSk7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzOmludmFsaWQgdHlwZSBpbiAncG9saWN5JyBjb25maWd1cmF0aW9uXG4iLGN2LT52YWx1ZSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQlpZiAocHVzaCAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIVg1MDlfTkFNRV9hZGRfZW50cnkoc3ViamVjdCxwdXNoLCAtMSwgMCkpCisJCQkJCXsKKwkJCQkJaWYgKHB1c2ggIT0gTlVMTCkKKwkJCQkJCVg1MDlfTkFNRV9FTlRSWV9mcmVlKHB1c2gpOworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCWlmIChqIDwgMCkgYnJlYWs7CisJCQl9CisJCX0KKworCWlmIChwcmVzZXJ2ZSkKKwkJeworCQlYNTA5X05BTUVfZnJlZShzdWJqZWN0KTsKKwkJLyogc3ViamVjdD1YNTA5X05BTUVfZHVwKFg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUocmVxKSk7ICovCisJCXN1YmplY3Q9WDUwOV9OQU1FX2R1cChuYW1lKTsKKwkJaWYgKHN1YmplY3QgPT0gTlVMTCkgZ290byBlcnI7CisJCX0KKworCWlmICh2ZXJib3NlKQorCQlCSU9fcHJpbnRmKGJpb19lcnIsIlRoZSBzdWJqZWN0IG5hbWUgYXBwZWFycyB0byBiZSBvaywgY2hlY2tpbmcgZGF0YSBiYXNlIGZvciBjbGFzaGVzXG4iKTsKKworCS8qIEJ1aWxkIHRoZSBjb3JyZWN0IFN1YmplY3QgaWYgbm8gZS1tYWlsIGlzIHdhbnRlZCBpbiB0aGUgc3ViamVjdCAqLworCS8qIGFuZCBhZGQgaXQgbGF0ZXIgb24gYmVjYXVzZSBvZiB0aGUgbWV0aG9kIGV4dGVuc2lvbnMgYXJlIGFkZGVkIChhbHROYW1lKSAqLworCSAKKwlpZiAoZW1haWxfZG4pCisJCWRuX3N1YmplY3QgPSBzdWJqZWN0OworCWVsc2UKKwkJeworCQlYNTA5X05BTUVfRU5UUlkgKnRtcG5lOworCQkvKiBJdHMgYmVzdCB0byBkdXAgdGhlIHN1YmplY3QgRE4gYW5kIHRoZW4gZGVsZXRlIGFueSBlbWFpbAorCQkgKiBhZGRyZXNzZXMgYmVjYXVzZSB0aGlzIHJldGFpbnMgaXRzIHN0cnVjdHVyZS4KKwkJICovCisJCWlmICghKGRuX3N1YmplY3QgPSBYNTA5X05BTUVfZHVwKHN1YmplY3QpKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJd2hpbGUoKGkgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChkbl9zdWJqZWN0LAorCQkJCQlOSURfcGtjczlfZW1haWxBZGRyZXNzLCAtMSkpID49IDApCisJCQl7CisJCQl0bXBuZSA9IFg1MDlfTkFNRV9nZXRfZW50cnkoZG5fc3ViamVjdCwgaSk7CisJCQlYNTA5X05BTUVfZGVsZXRlX2VudHJ5KGRuX3N1YmplY3QsIGkpOworCQkJWDUwOV9OQU1FX0VOVFJZX2ZyZWUodG1wbmUpOworCQkJfQorCQl9CisKKwlpZiAoQk5faXNfemVybyhzZXJpYWwpKQorCQlyb3dbREJfc2VyaWFsXT1CVUZfc3RyZHVwKCIwMCIpOworCWVsc2UKKwkJcm93W0RCX3NlcmlhbF09Qk5fYm4yaGV4KHNlcmlhbCk7CisJaWYgKHJvd1tEQl9zZXJpYWxdID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChkYi0+YXR0cmlidXRlcy51bmlxdWVfc3ViamVjdCkKKwkJeworCQlPUEVOU1NMX1NUUklORyAqY3Jvdz1yb3c7CisKKwkJcnJvdz1UWFRfREJfZ2V0X2J5X2luZGV4KGRiLT5kYixEQl9uYW1lLGNyb3cpOworCQlpZiAocnJvdyAhPSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSJFUlJPUjpUaGVyZSBpcyBhbHJlYWR5IGEgY2VydGlmaWNhdGUgZm9yICVzXG4iLAorCQkJCXJvd1tEQl9uYW1lXSk7CisJCQl9CisJCX0KKwlpZiAocnJvdyA9PSBOVUxMKQorCQl7CisJCXJyb3c9VFhUX0RCX2dldF9ieV9pbmRleChkYi0+ZGIsREJfc2VyaWFsLHJvdyk7CisJCWlmIChycm93ICE9IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkVSUk9SOlNlcmlhbCBudW1iZXIgJXMgaGFzIGFscmVhZHkgYmVlbiBpc3N1ZWQsXG4iLAorCQkJCXJvd1tEQl9zZXJpYWxdKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgY2hlY2sgdGhlIGRhdGFiYXNlL3NlcmlhbF9maWxlIGZvciBjb3JydXB0aW9uXG4iKTsKKwkJCX0KKwkJfQorCisJaWYgKHJyb3cgIT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkiVGhlIG1hdGNoaW5nIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIGRldGFpbHNcbiIpOworCQlpZiAocnJvd1tEQl90eXBlXVswXSA9PSAnRScpCisJCQlwPSJFeHBpcmVkIjsKKwkJZWxzZSBpZiAocnJvd1tEQl90eXBlXVswXSA9PSAnUicpCisJCQlwPSJSZXZva2VkIjsKKwkJZWxzZSBpZiAocnJvd1tEQl90eXBlXVswXSA9PSAnVicpCisJCQlwPSJWYWxpZCI7CisJCWVsc2UKKwkJCXA9IlxuaW52YWxpZCB0eXBlLCBEYXRhIGJhc2UgZXJyb3JcbiI7CisJCUJJT19wcmludGYoYmlvX2VyciwiVHlwZQkgIDolc1xuIixwKTs7CisJCWlmIChycm93W0RCX3R5cGVdWzBdID09ICdSJykKKwkJCXsKKwkJCXA9cnJvd1tEQl9leHBfZGF0ZV07IGlmIChwID09IE5VTEwpIHA9InVuZGVmIjsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiV2FzIHJldm9rZWQgb246JXNcbiIscCk7CisJCQl9CisJCXA9cnJvd1tEQl9leHBfZGF0ZV07IGlmIChwID09IE5VTEwpIHA9InVuZGVmIjsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJFeHBpcmVzIG9uICAgIDolc1xuIixwKTsKKwkJcD1ycm93W0RCX3NlcmlhbF07IGlmIChwID09IE5VTEwpIHA9InVuZGVmIjsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJTZXJpYWwgTnVtYmVyIDolc1xuIixwKTsKKwkJcD1ycm93W0RCX2ZpbGVdOyBpZiAocCA9PSBOVUxMKSBwPSJ1bmRlZiI7CisJCUJJT19wcmludGYoYmlvX2VyciwiRmlsZSBuYW1lICAgICA6JXNcbiIscCk7CisJCXA9cnJvd1tEQl9uYW1lXTsgaWYgKHAgPT0gTlVMTCkgcD0idW5kZWYiOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlN1YmplY3QgTmFtZSAgOiVzXG4iLHApOworCQlvaz0gLTE7IC8qIFRoaXMgaXMgbm93IGEgJ2JhZCcgZXJyb3IuICovCisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBXZSBhcmUgbm93IHRvdGFsbHkgaGFwcHksIGxldHMgbWFrZSBhbmQgc2lnbiB0aGUgY2VydGlmaWNhdGUgKi8KKwlpZiAodmVyYm9zZSkKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJFdmVyeXRoaW5nIGFwcGVhcnMgdG8gYmUgb2ssIGNyZWF0aW5nIGFuZCBzaWduaW5nIHRoZSBjZXJ0aWZpY2F0ZVxuIik7CisKKwlpZiAoKHJldD1YNTA5X25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwljaT1yZXQtPmNlcnRfaW5mbzsKKworI2lmZGVmIFg1MDlfVjMKKwkvKiBNYWtlIGl0IGFuIFg1MDkgdjMgY2VydGlmaWNhdGUuICovCisJaWYgKCFYNTA5X3NldF92ZXJzaW9uKHJldCwyKSkgZ290byBlcnI7CisjZW5kaWYKKworCWlmIChCTl90b19BU04xX0lOVEVHRVIoc2VyaWFsLGNpLT5zZXJpYWxOdW1iZXIpID09IE5VTEwpCisJCWdvdG8gZXJyOworCWlmIChzZWxmc2lnbikKKwkJeworCQlpZiAoIVg1MDlfc2V0X2lzc3Vlcl9uYW1lKHJldCxzdWJqZWN0KSkKKwkJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghWDUwOV9zZXRfaXNzdWVyX25hbWUocmV0LFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4NTA5KSkpCisJCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHN0cmNtcChzdGFydGRhdGUsInRvZGF5IikgPT0gMCkKKwkJWDUwOV9nbXRpbWVfYWRqKFg1MDlfZ2V0X25vdEJlZm9yZShyZXQpLDApOworCWVsc2UgQVNOMV9USU1FX3NldF9zdHJpbmcoWDUwOV9nZXRfbm90QmVmb3JlKHJldCksc3RhcnRkYXRlKTsKKworCWlmIChlbmRkYXRlID09IE5VTEwpCisJCVg1MDlfdGltZV9hZGpfZXgoWDUwOV9nZXRfbm90QWZ0ZXIocmV0KSxkYXlzLCAwLCBOVUxMKTsKKwllbHNlIEFTTjFfVElNRV9zZXRfc3RyaW5nKFg1MDlfZ2V0X25vdEFmdGVyKHJldCksZW5kZGF0ZSk7CisKKwlpZiAoIVg1MDlfc2V0X3N1YmplY3RfbmFtZShyZXQsc3ViamVjdCkpIGdvdG8gZXJyOworCisJcGt0bXA9WDUwOV9SRVFfZ2V0X3B1YmtleShyZXEpOworCWkgPSBYNTA5X3NldF9wdWJrZXkocmV0LHBrdG1wKTsKKwlFVlBfUEtFWV9mcmVlKHBrdG1wKTsKKwlpZiAoIWkpIGdvdG8gZXJyOworCisJLyogTGV0cyBhZGQgdGhlIGV4dGVuc2lvbnMsIGlmIHRoZXJlIGFyZSBhbnkgKi8KKwlpZiAoZXh0X3NlY3QpCisJCXsKKwkJWDUwOVYzX0NUWCBjdHg7CisJCWlmIChjaS0+dmVyc2lvbiA9PSBOVUxMKQorCQkJaWYgKChjaS0+dmVyc2lvbj1BU04xX0lOVEVHRVJfbmV3KCkpID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCUFTTjFfSU5URUdFUl9zZXQoY2ktPnZlcnNpb24sMik7IC8qIHZlcnNpb24gMyBjZXJ0aWZpY2F0ZSAqLworCisJCS8qIEZyZWUgdGhlIGN1cnJlbnQgZW50cmllcyBpZiBhbnksIHRoZXJlIHNob3VsZCBub3QKKwkJICogYmUgYW55IEkgYmVsaWV2ZSAqLworCQlpZiAoY2ktPmV4dGVuc2lvbnMgIT0gTlVMTCkKKwkJCXNrX1g1MDlfRVhURU5TSU9OX3BvcF9mcmVlKGNpLT5leHRlbnNpb25zLAorCQkJCQkJICAgWDUwOV9FWFRFTlNJT05fZnJlZSk7CisKKwkJY2ktPmV4dGVuc2lvbnMgPSBOVUxMOworCisJCS8qIEluaXRpYWxpemUgdGhlIGNvbnRleHQgc3RydWN0dXJlICovCisJCWlmIChzZWxmc2lnbikKKwkJCVg1MDlWM19zZXRfY3R4KCZjdHgsIHJldCwgcmV0LCByZXEsIE5VTEwsIDApOworCQllbHNlCisJCQlYNTA5VjNfc2V0X2N0eCgmY3R4LCB4NTA5LCByZXQsIHJlcSwgTlVMTCwgMCk7CisKKwkJaWYgKGV4dGNvbmYpCisJCQl7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFeHRyYSBjb25maWd1cmF0aW9uIGZpbGUgZm91bmRcbiIpOworIAorCQkJLyogVXNlIHRoZSBleHRjb25mIGNvbmZpZ3VyYXRpb24gZGIgTEhBU0ggKi8KKwkJCVg1MDlWM19zZXRfbmNvbmYoJmN0eCwgZXh0Y29uZik7CisgCisJCQkvKiBUZXN0IHRoZSBzdHJ1Y3R1cmUgKG5lZWRlZD8pICovCisJCQkvKiBYNTA5VjNfc2V0X2N0eF90ZXN0KCZjdHgpOyAqLworCisJCQkvKiBBZGRzIGV4dHMgY29udGFpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgKi8KKwkJCWlmICghWDUwOVYzX0VYVF9hZGRfbmNvbmYoZXh0Y29uZiwgJmN0eCwgZXh0X3NlY3QscmV0KSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSAgICAiRVJST1I6IGFkZGluZyBleHRlbnNpb25zIGluIHNlY3Rpb24gJXNcbiIsCisJCQkJCQkJCWV4dF9zZWN0KTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmICh2ZXJib3NlKQorCQkJCUJJT19wcmludGYoYmlvX2VyciwgIlN1Y2Nlc3NmdWxseSBhZGRlZCBleHRlbnNpb25zIGZyb20gZmlsZS5cbiIpOworCQkJfQorCQllbHNlIGlmIChleHRfc2VjdCkKKwkJCXsKKwkJCS8qIFdlIGZvdW5kIGV4dGVuc2lvbnMgdG8gYmUgc2V0IGZyb20gY29uZmlnIGZpbGUgKi8KKwkJCVg1MDlWM19zZXRfbmNvbmYoJmN0eCwgbGNvbmYpOworCisJCQlpZighWDUwOVYzX0VYVF9hZGRfbmNvbmYobGNvbmYsICZjdHgsIGV4dF9zZWN0LCByZXQpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFUlJPUjogYWRkaW5nIGV4dGVuc2lvbnMgaW4gc2VjdGlvbiAlc1xuIiwgZXh0X3NlY3QpOworCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQlpZiAodmVyYm9zZSkgCisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiU3VjY2Vzc2Z1bGx5IGFkZGVkIGV4dGVuc2lvbnMgZnJvbSBjb25maWdcbiIpOworCQkJfQorCQl9CisKKwkvKiBDb3B5IGV4dGVuc2lvbnMgZnJvbSByZXF1ZXN0IChpZiBhbnkpICovCisKKwlpZiAoIWNvcHlfZXh0ZW5zaW9ucyhyZXQsIHJlcSwgZXh0X2NvcHkpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVSUk9SOiBhZGRpbmcgZXh0ZW5zaW9ucyBmcm9tIHJlcXVlc3RcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogU2V0IHRoZSByaWdodCB2YWx1ZSBmb3IgdGhlIG5vZW1haWxETiBvcHRpb24gKi8KKwlpZiggZW1haWxfZG4gPT0gMCApCisJCXsKKwkJaWYgKCFYNTA5X3NldF9zdWJqZWN0X25hbWUocmV0LGRuX3N1YmplY3QpKSBnb3RvIGVycjsKKwkJfQorCisJaWYgKCFkZWZhdWx0X29wKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkNlcnRpZmljYXRlIERldGFpbHM6XG4iKTsKKwkJLyogTmV2ZXIgcHJpbnQgc2lnbmF0dXJlIGRldGFpbHMgYmVjYXVzZSBzaWduYXR1cmUgbm90IHByZXNlbnQgKi8KKwkJY2VydG9wdCB8PSBYNTA5X0ZMQUdfTk9fU0lHRFVNUCB8IFg1MDlfRkxBR19OT19TSUdOQU1FOworCQlYNTA5X3ByaW50X2V4KGJpb19lcnIsIHJldCwgbmFtZW9wdCwgY2VydG9wdCk7IAorCQl9CisKKwlCSU9fcHJpbnRmKGJpb19lcnIsIkNlcnRpZmljYXRlIGlzIHRvIGJlIGNlcnRpZmllZCB1bnRpbCAiKTsKKwlBU04xX1RJTUVfcHJpbnQoYmlvX2VycixYNTA5X2dldF9ub3RBZnRlcihyZXQpKTsKKwlpZiAoZGF5cykgQklPX3ByaW50ZihiaW9fZXJyLCIgKCVsZCBkYXlzKSIsZGF5cyk7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiXG4iKTsKKworCWlmICghYmF0Y2gpCisJCXsKKworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlNpZ24gdGhlIGNlcnRpZmljYXRlPyBbeS9uXToiKTsKKwkJKHZvaWQpQklPX2ZsdXNoKGJpb19lcnIpOworCQlidWZbMF09J1wwJzsKKwkJaWYgKCFmZ2V0cyhidWYsc2l6ZW9mKGJ1ZiktMSxzdGRpbikpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkNFUlRJRklDQVRFIFdJTEwgTk9UIEJFIENFUlRJRklFRDogSS9PIGVycm9yXG4iKTsKKwkJCW9rPTA7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKCEoKGJ1ZlswXSA9PSAneScpIHx8IChidWZbMF0gPT0gJ1knKSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkNFUlRJRklDQVRFIFdJTEwgTk9UIEJFIENFUlRJRklFRFxuIik7CisJCQlvaz0wOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCXBrdG1wPVg1MDlfZ2V0X3B1YmtleShyZXQpOworCWlmIChFVlBfUEtFWV9taXNzaW5nX3BhcmFtZXRlcnMocGt0bXApICYmCisJCSFFVlBfUEtFWV9taXNzaW5nX3BhcmFtZXRlcnMocGtleSkpCisJCUVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhwa3RtcCxwa2V5KTsKKwlFVlBfUEtFWV9mcmVlKHBrdG1wKTsKKworCWlmICghWDUwOV9zaWduKHJldCxwa2V5LGRnc3QpKQorCQlnb3RvIGVycjsKKworCS8qIFdlIG5vdyBqdXN0IGFkZCBpdCB0byB0aGUgZGF0YWJhc2UgKi8KKwlyb3dbREJfdHlwZV09KGNoYXIgKilPUEVOU1NMX21hbGxvYygyKTsKKworCXRtPVg1MDlfZ2V0X25vdEFmdGVyKHJldCk7CisJcm93W0RCX2V4cF9kYXRlXT0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKHRtLT5sZW5ndGgrMSk7CisJbWVtY3B5KHJvd1tEQl9leHBfZGF0ZV0sdG0tPmRhdGEsdG0tPmxlbmd0aCk7CisJcm93W0RCX2V4cF9kYXRlXVt0bS0+bGVuZ3RoXT0nXDAnOworCisJcm93W0RCX3Jldl9kYXRlXT1OVUxMOworCisJLyogcm93W0RCX3NlcmlhbF0gZG9uZSBhbHJlYWR5ICovCisJcm93W0RCX2ZpbGVdPShjaGFyICopT1BFTlNTTF9tYWxsb2MoOCk7CisJcm93W0RCX25hbWVdPVg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShyZXQpLE5VTEwsMCk7CisKKwlpZiAoKHJvd1tEQl90eXBlXSA9PSBOVUxMKSB8fCAocm93W0RCX2V4cF9kYXRlXSA9PSBOVUxMKSB8fAorCQkocm93W0RCX2ZpbGVdID09IE5VTEwpIHx8IChyb3dbREJfbmFtZV0gPT0gTlVMTCkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKwlCVUZfc3RybGNweShyb3dbREJfZmlsZV0sInVua25vd24iLDgpOworCXJvd1tEQl90eXBlXVswXT0nVic7CisJcm93W0RCX3R5cGVdWzFdPSdcMCc7CisKKwlpZiAoKGlyb3c9KGNoYXIgKiopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKGNoYXIgKikqKERCX05VTUJFUisxKSkpID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKworCWZvciAoaT0wOyBpPERCX05VTUJFUjsgaSsrKQorCQl7CisJCWlyb3dbaV09cm93W2ldOworCQlyb3dbaV09TlVMTDsKKwkJfQorCWlyb3dbREJfTlVNQkVSXT1OVUxMOworCisJaWYgKCFUWFRfREJfaW5zZXJ0KGRiLT5kYixpcm93KSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImZhaWxlZCB0byB1cGRhdGUgZGF0YWJhc2VcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlRYVF9EQiBlcnJvciBudW1iZXIgJWxkXG4iLGRiLT5kYi0+ZXJyb3IpOworCQlnb3RvIGVycjsKKwkJfQorCW9rPTE7CitlcnI6CisJZm9yIChpPTA7IGk8REJfTlVNQkVSOyBpKyspCisJCWlmIChyb3dbaV0gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHJvd1tpXSk7CisKKwlpZiAoQ0FuYW1lICE9IE5VTEwpCisJCVg1MDlfTkFNRV9mcmVlKENBbmFtZSk7CisJaWYgKHN1YmplY3QgIT0gTlVMTCkKKwkJWDUwOV9OQU1FX2ZyZWUoc3ViamVjdCk7CisJaWYgKChkbl9zdWJqZWN0ICE9IE5VTEwpICYmICFlbWFpbF9kbikKKwkJWDUwOV9OQU1FX2ZyZWUoZG5fc3ViamVjdCk7CisJaWYgKHRtcHRtICE9IE5VTEwpCisJCUFTTjFfVVRDVElNRV9mcmVlKHRtcHRtKTsKKwlpZiAob2sgPD0gMCkKKwkJeworCQlpZiAocmV0ICE9IE5VTEwpIFg1MDlfZnJlZShyZXQpOworCQlyZXQ9TlVMTDsKKwkJfQorCWVsc2UKKwkJKnhyZXQ9cmV0OworCXJldHVybihvayk7CisJfQorCitzdGF0aWMgdm9pZCB3cml0ZV9uZXdfY2VydGlmaWNhdGUoQklPICpicCwgWDUwOSAqeCwgaW50IG91dHB1dF9kZXIsIGludCBub3RleHQpCisJeworCisJaWYgKG91dHB1dF9kZXIpCisJCXsKKwkJKHZvaWQpaTJkX1g1MDlfYmlvKGJwLHgpOworCQlyZXR1cm47CisJCX0KKyNpZiAwCisJLyogPz8/IE5vdCBuZWVkZWQgc2luY2UgWDUwOV9wcmludCBwcmludHMgYWxsIHRoaXMgc3R1ZmYgYW55d2F5ICovCisJZj1YNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9pc3N1ZXJfbmFtZSh4KSxidWYsMjU2KTsKKwlCSU9fcHJpbnRmKGJwLCJpc3N1ZXIgOiVzXG4iLGYpOworCisJZj1YNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoeCksYnVmLDI1Nik7CisJQklPX3ByaW50ZihicCwic3ViamVjdDolc1xuIixmKTsKKworCUJJT19wdXRzKGJwLCJzZXJpYWwgOiIpOworCWkyYV9BU04xX0lOVEVHRVIoYnAseC0+Y2VydF9pbmZvLT5zZXJpYWxOdW1iZXIpOworCUJJT19wdXRzKGJwLCJcblxuIik7CisjZW5kaWYKKwlpZiAoIW5vdGV4dClYNTA5X3ByaW50KGJwLHgpOworCVBFTV93cml0ZV9iaW9fWDUwOShicCx4KTsKKwl9CisKK3N0YXRpYyBpbnQgY2VydGlmeV9zcGthYyhYNTA5ICoqeHJldCwgY2hhciAqaW5maWxlLCBFVlBfUEtFWSAqcGtleSwgWDUwOSAqeDUwOSwKKwkgICAgIGNvbnN0IEVWUF9NRCAqZGdzdCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnBvbGljeSwgQ0FfREIgKmRiLAorCSAgICAgQklHTlVNICpzZXJpYWwsIGNoYXIgKnN1YmosdW5zaWduZWQgbG9uZyBjaHR5cGUsIGludCBtdWx0aXJkbiwgaW50IGVtYWlsX2RuLCBjaGFyICpzdGFydGRhdGUsIGNoYXIgKmVuZGRhdGUsCisJICAgICBsb25nIGRheXMsIGNoYXIgKmV4dF9zZWN0LCBDT05GICpsY29uZiwgaW50IHZlcmJvc2UsIHVuc2lnbmVkIGxvbmcgY2VydG9wdCwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbmFtZW9wdCwgaW50IGRlZmF1bHRfb3AsIGludCBleHRfY29weSkKKwl7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNrPU5VTEw7CisJTEhBU0hfT0YoQ09ORl9WQUxVRSkgKnBhcm1zPU5VTEw7CisJWDUwOV9SRVEgKnJlcT1OVUxMOworCUNPTkZfVkFMVUUgKmN2PU5VTEw7CisJTkVUU0NBUEVfU1BLSSAqc3BraSA9IE5VTEw7CisJWDUwOV9SRVFfSU5GTyAqcmk7CisJY2hhciAqdHlwZSwqYnVmOworCUVWUF9QS0VZICpwa3RtcD1OVUxMOworCVg1MDlfTkFNRSAqbj1OVUxMOworCVg1MDlfTkFNRV9FTlRSWSAqbmU9TlVMTDsKKwlpbnQgb2s9IC0xLGksajsKKwlsb25nIGVycmxpbmU7CisJaW50IG5pZDsKKworCS8qCisJICogTG9hZCBpbnB1dCBmaWxlIGludG8gYSBoYXNoIHRhYmxlLiAgKFRoaXMgaXMganVzdCBhbiBlYXN5CisJICogd2F5IHRvIHJlYWQgYW5kIHBhcnNlIHRoZSBmaWxlLCB0aGVuIHB1dCBpdCBpbnRvIGEgY29udmVuaWVudAorCSAqIFNUQUNLIGZvcm1hdCkuCisJICovCisJcGFybXM9Q09ORl9sb2FkKE5VTEwsaW5maWxlLCZlcnJsaW5lKTsKKwlpZiAocGFybXMgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIG9uIGxpbmUgJWxkIG9mICVzXG4iLGVycmxpbmUsaW5maWxlKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlcnI7CisJCX0KKworCXNrPUNPTkZfZ2V0X3NlY3Rpb24ocGFybXMsICJkZWZhdWx0Iik7CisJaWYgKHNrX0NPTkZfVkFMVUVfbnVtKHNrKSA9PSAwKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIm5vIG5hbWUvdmFsdWUgcGFpcnMgZm91bmQgaW4gJXNcbiIsIGluZmlsZSk7CisJCUNPTkZfZnJlZShwYXJtcyk7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKgorCSAqIE5vdyBjcmVhdGUgYSBkdW1teSBYNTA5IHJlcXVlc3Qgc3RydWN0dXJlLiAgV2UgZG9uJ3QgYWN0dWFsbHkKKwkgKiBoYXZlIGFuIFg1MDkgcmVxdWVzdCwgYnV0IHdlIGhhdmUgbWFueSBvZiB0aGUgY29tcG9uZW50cworCSAqIChhIHB1YmxpYyBrZXksIHZhcmlvdXMgRE4gY29tcG9uZW50cykuICBUaGUgaWRlYSBpcyB0aGF0IHdlCisJICogcHV0IHRoZXNlIGNvbXBvbmVudHMgaW50byB0aGUgcmlnaHQgWDUwOSByZXF1ZXN0IHN0cnVjdHVyZQorCSAqIGFuZCB3ZSBjYW4gdXNlIHRoZSBzYW1lIGNvZGUgYXMgaWYgeW91IGhhZCBhIHJlYWwgWDUwOSByZXF1ZXN0LgorCSAqLworCXJlcT1YNTA5X1JFUV9uZXcoKTsKKwlpZiAocmVxID09IE5VTEwpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qCisJICogQnVpbGQgdXAgdGhlIHN1YmplY3QgbmFtZSBzZXQuCisJICovCisJcmk9cmVxLT5yZXFfaW5mbzsKKwluID0gcmktPnN1YmplY3Q7CisKKwlmb3IgKGkgPSAwOyA7IGkrKykKKwkJeworCQlpZiAoc2tfQ09ORl9WQUxVRV9udW0oc2spIDw9IGkpIGJyZWFrOworCisJCWN2PXNrX0NPTkZfVkFMVUVfdmFsdWUoc2ssaSk7CisJCXR5cGU9Y3YtPm5hbWU7CisJCS8qIFNraXAgcGFzdCBhbnkgbGVhZGluZyBYLiBYOiBYLCBldGMgdG8gYWxsb3cgZm9yCisJCSAqIG11bHRpcGxlIGluc3RhbmNlcworCQkgKi8KKwkJZm9yIChidWYgPSBjdi0+bmFtZTsgKmJ1ZiA7IGJ1ZisrKQorCQkJaWYgKCgqYnVmID09ICc6JykgfHwgKCpidWYgPT0gJywnKSB8fCAoKmJ1ZiA9PSAnLicpKQorCQkJCXsKKwkJCQlidWYrKzsKKwkJCQlpZiAoKmJ1ZikgdHlwZSA9IGJ1ZjsKKwkJCQlicmVhazsKKwkJCQl9CisKKwkJYnVmPWN2LT52YWx1ZTsKKwkJaWYgKChuaWQ9T0JKX3R4dDJuaWQodHlwZSkpID09IE5JRF91bmRlZikKKwkJCXsKKwkJCWlmIChzdHJjbXAodHlwZSwgIlNQS0FDIikgPT0gMCkKKwkJCQl7CisJCQkJc3BraSA9IE5FVFNDQVBFX1NQS0lfYjY0X2RlY29kZShjdi0+dmFsdWUsIC0xKTsKKwkJCQlpZiAoc3BraSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGxvYWQgTmV0c2NhcGUgU1BLQUMgc3RydWN0dXJlXG4iKTsKKwkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisJCQljb250aW51ZTsKKwkJCX0KKworCQlpZiAoIVg1MDlfTkFNRV9hZGRfZW50cnlfYnlfTklEKG4sIG5pZCwgY2h0eXBlLAorCQkJCSh1bnNpZ25lZCBjaGFyICopYnVmLCAtMSwgLTEsIDApKQorCQkJZ290byBlcnI7CisJCX0KKwlpZiAoc3BraSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiTmV0c2NhcGUgU1BLQUMgc3RydWN0dXJlIG5vdCBmb3VuZCBpbiAlc1xuIiwKKwkJCWluZmlsZSk7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKgorCSAqIE5vdyBleHRyYWN0IHRoZSBrZXkgZnJvbSB0aGUgU1BLSSBzdHJ1Y3R1cmUuCisJICovCisKKwlCSU9fcHJpbnRmKGJpb19lcnIsIkNoZWNrIHRoYXQgdGhlIFNQS0FDIHJlcXVlc3QgbWF0Y2hlcyB0aGUgc2lnbmF0dXJlXG4iKTsKKworCWlmICgocGt0bXA9TkVUU0NBUEVfU1BLSV9nZXRfcHVia2V5KHNwa2kpKSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiZXJyb3IgdW5wYWNraW5nIFNQS0FDIHB1YmxpYyBrZXlcbiIpOworCQlnb3RvIGVycjsKKwkJfQorCisJaiA9IE5FVFNDQVBFX1NQS0lfdmVyaWZ5KHNwa2ksIHBrdG1wKTsKKwlpZiAoaiA8PSAwKQorCQl7CisJCUJJT19wcmludGYoYmlvX2Vyciwic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQgb24gU1BLQUMgcHVibGljIGtleVxuIik7CisJCWdvdG8gZXJyOworCQl9CisJQklPX3ByaW50ZihiaW9fZXJyLCJTaWduYXR1cmUgb2tcbiIpOworCisJWDUwOV9SRVFfc2V0X3B1YmtleShyZXEscGt0bXApOworCUVWUF9QS0VZX2ZyZWUocGt0bXApOworCW9rPWRvX2JvZHkoeHJldCxwa2V5LHg1MDksZGdzdCxwb2xpY3ksZGIsc2VyaWFsLHN1YmosY2h0eXBlLG11bHRpcmRuLGVtYWlsX2RuLHN0YXJ0ZGF0ZSxlbmRkYXRlLAorCQkgICBkYXlzLDEsdmVyYm9zZSxyZXEsZXh0X3NlY3QsbGNvbmYsIGNlcnRvcHQsIG5hbWVvcHQsIGRlZmF1bHRfb3AsCisJCQlleHRfY29weSwgMCk7CitlcnI6CisJaWYgKHJlcSAhPSBOVUxMKSBYNTA5X1JFUV9mcmVlKHJlcSk7CisJaWYgKHBhcm1zICE9IE5VTEwpIENPTkZfZnJlZShwYXJtcyk7CisJaWYgKHNwa2kgIT0gTlVMTCkgTkVUU0NBUEVfU1BLSV9mcmVlKHNwa2kpOworCWlmIChuZSAhPSBOVUxMKSBYNTA5X05BTUVfRU5UUllfZnJlZShuZSk7CisKKwlyZXR1cm4ob2spOworCX0KKworc3RhdGljIGludCBjaGVja190aW1lX2Zvcm1hdChjb25zdCBjaGFyICpzdHIpCisJeworCXJldHVybiBBU04xX1RJTUVfc2V0X3N0cmluZyhOVUxMLCBzdHIpOworCX0KKworc3RhdGljIGludCBkb19yZXZva2UoWDUwOSAqeDUwOSwgQ0FfREIgKmRiLCBpbnQgdHlwZSwgY2hhciAqdmFsdWUpCisJeworCUFTTjFfVVRDVElNRSAqdG09TlVMTDsKKwljaGFyICpyb3dbREJfTlVNQkVSXSwqKnJyb3csKippcm93OworCWNoYXIgKnJldl9zdHIgPSBOVUxMOworCUJJR05VTSAqYm4gPSBOVUxMOworCWludCBvaz0tMSxpOworCisJZm9yIChpPTA7IGk8REJfTlVNQkVSOyBpKyspCisJCXJvd1tpXT1OVUxMOworCXJvd1tEQl9uYW1lXT1YNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoeDUwOSksTlVMTCwwKTsKKwlibiA9IEFTTjFfSU5URUdFUl90b19CTihYNTA5X2dldF9zZXJpYWxOdW1iZXIoeDUwOSksTlVMTCk7CisJaWYgKCFibikKKwkJZ290byBlcnI7CisJaWYgKEJOX2lzX3plcm8oYm4pKQorCQlyb3dbREJfc2VyaWFsXT1CVUZfc3RyZHVwKCIwMCIpOworCWVsc2UKKwkJcm93W0RCX3NlcmlhbF09Qk5fYm4yaGV4KGJuKTsKKwlCTl9mcmVlKGJuKTsKKwlpZiAoKHJvd1tEQl9uYW1lXSA9PSBOVUxMKSB8fCAocm93W0RCX3NlcmlhbF0gPT0gTlVMTCkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKwkvKiBXZSBoYXZlIHRvIGxvb2t1cCBieSBzZXJpYWwgbnVtYmVyIGJlY2F1c2UgbmFtZSBsb29rdXAKKwkgKiBza2lwcyByZXZva2VkIGNlcnRzCisgCSAqLworCXJyb3c9VFhUX0RCX2dldF9ieV9pbmRleChkYi0+ZGIsREJfc2VyaWFsLHJvdyk7CisJaWYgKHJyb3cgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIkFkZGluZyBFbnRyeSB3aXRoIHNlcmlhbCBudW1iZXIgJXMgdG8gREIgZm9yICVzXG4iLCByb3dbREJfc2VyaWFsXSwgcm93W0RCX25hbWVdKTsKKworCQkvKiBXZSBub3cganVzdCBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlICovCisJCXJvd1tEQl90eXBlXT0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKDIpOworCisJCXRtPVg1MDlfZ2V0X25vdEFmdGVyKHg1MDkpOworCQlyb3dbREJfZXhwX2RhdGVdPShjaGFyICopT1BFTlNTTF9tYWxsb2ModG0tPmxlbmd0aCsxKTsKKwkJbWVtY3B5KHJvd1tEQl9leHBfZGF0ZV0sdG0tPmRhdGEsdG0tPmxlbmd0aCk7CisJCXJvd1tEQl9leHBfZGF0ZV1bdG0tPmxlbmd0aF09J1wwJzsKKworCQlyb3dbREJfcmV2X2RhdGVdPU5VTEw7CisKKwkJLyogcm93W0RCX3NlcmlhbF0gZG9uZSBhbHJlYWR5ICovCisJCXJvd1tEQl9maWxlXT0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKDgpOworCisJCS8qIHJvd1tEQl9uYW1lXSBkb25lIGFscmVhZHkgKi8KKworCQlpZiAoKHJvd1tEQl90eXBlXSA9PSBOVUxMKSB8fCAocm93W0RCX2V4cF9kYXRlXSA9PSBOVUxMKSB8fAorCQkJKHJvd1tEQl9maWxlXSA9PSBOVUxMKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJQlVGX3N0cmxjcHkocm93W0RCX2ZpbGVdLCJ1bmtub3duIiw4KTsKKwkJcm93W0RCX3R5cGVdWzBdPSdWJzsKKwkJcm93W0RCX3R5cGVdWzFdPSdcMCc7CisKKwkJaWYgKChpcm93PShjaGFyICoqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihjaGFyICopKihEQl9OVU1CRVIrMSkpKSA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWZvciAoaT0wOyBpPERCX05VTUJFUjsgaSsrKQorCQkJeworCQkJaXJvd1tpXT1yb3dbaV07CisJCQlyb3dbaV09TlVMTDsKKwkJCX0KKwkJaXJvd1tEQl9OVU1CRVJdPU5VTEw7CisKKwkJaWYgKCFUWFRfREJfaW5zZXJ0KGRiLT5kYixpcm93KSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZmFpbGVkIHRvIHVwZGF0ZSBkYXRhYmFzZVxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlRYVF9EQiBlcnJvciBudW1iZXIgJWxkXG4iLGRiLT5kYi0+ZXJyb3IpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJLyogUmV2b2tlIENlcnRpZmljYXRlICovCisJCW9rID0gZG9fcmV2b2tlKHg1MDksZGIsIHR5cGUsIHZhbHVlKTsKKworCQlnb3RvIGVycjsKKworCQl9CisJZWxzZSBpZiAoaW5kZXhfbmFtZV9jbXBfbm9jb25zdChyb3csIHJyb3cpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiRVJST1I6bmFtZSBkb2VzIG5vdCBtYXRjaCAlc1xuIiwKKwkJCSAgIHJvd1tEQl9uYW1lXSk7CisJCWdvdG8gZXJyOworCQl9CisJZWxzZSBpZiAocnJvd1tEQl90eXBlXVswXT09J1InKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiRVJST1I6QWxyZWFkeSByZXZva2VkLCBzZXJpYWwgbnVtYmVyICVzXG4iLAorCQkJICAgcm93W0RCX3NlcmlhbF0pOworCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlJldm9raW5nIENlcnRpZmljYXRlICVzLlxuIiwgcnJvd1tEQl9zZXJpYWxdKTsKKwkJcmV2X3N0ciA9IG1ha2VfcmV2b2NhdGlvbl9zdHIodHlwZSwgdmFsdWUpOworCQlpZiAoIXJldl9zdHIpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBpbiByZXZvY2F0aW9uIGFyZ3VtZW50c1xuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcnJvd1tEQl90eXBlXVswXT0nUic7CisJCXJyb3dbREJfdHlwZV1bMV09J1wwJzsKKwkJcnJvd1tEQl9yZXZfZGF0ZV0gPSByZXZfc3RyOworCQl9CisJb2s9MTsKK2VycjoKKwlmb3IgKGk9MDsgaTxEQl9OVU1CRVI7IGkrKykKKwkJeworCQlpZiAocm93W2ldICE9IE5VTEwpIAorCQkJT1BFTlNTTF9mcmVlKHJvd1tpXSk7CisJCX0KKwlyZXR1cm4ob2spOworCX0KKworc3RhdGljIGludCBnZXRfY2VydGlmaWNhdGVfc3RhdHVzKGNvbnN0IGNoYXIgKnNlcmlhbCwgQ0FfREIgKmRiKQorCXsKKwljaGFyICpyb3dbREJfTlVNQkVSXSwqKnJyb3c7CisJaW50IG9rPS0xLGk7CisKKwkvKiBGcmVlIFJlc291cmNlcyAqLworCWZvciAoaT0wOyBpPERCX05VTUJFUjsgaSsrKQorCQlyb3dbaV09TlVMTDsKKworCS8qIE1hbGxvYyBuZWVkZWQgY2hhciBzcGFjZXMgKi8KKwlyb3dbREJfc2VyaWFsXSA9IE9QRU5TU0xfbWFsbG9jKHN0cmxlbihzZXJpYWwpICsgMik7CisJaWYgKHJvd1tEQl9zZXJpYWxdID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJNYWxsb2MgZmFpbHVyZVxuIik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoc3RybGVuKHNlcmlhbCkgJSAyKQorCQl7CisJCS8qIFNldCB0aGUgZmlyc3QgY2hhciB0byAwICovOworCQlyb3dbREJfc2VyaWFsXVswXT0nMCc7CisKKwkJLyogQ29weSBTdHJpbmcgZnJvbSBzZXJpYWwgdG8gcm93W0RCX3NlcmlhbF0gKi8KKwkJbWVtY3B5KHJvd1tEQl9zZXJpYWxdKzEsIHNlcmlhbCwgc3RybGVuKHNlcmlhbCkpOworCQlyb3dbREJfc2VyaWFsXVtzdHJsZW4oc2VyaWFsKSsxXT0nXDAnOworCQl9CisJZWxzZQorCQl7CisJCS8qIENvcHkgU3RyaW5nIGZyb20gc2VyaWFsIHRvIHJvd1tEQl9zZXJpYWxdICovCisJCW1lbWNweShyb3dbREJfc2VyaWFsXSwgc2VyaWFsLCBzdHJsZW4oc2VyaWFsKSk7CisJCXJvd1tEQl9zZXJpYWxdW3N0cmxlbihzZXJpYWwpXT0nXDAnOworCQl9CisJCQkKKwkvKiBNYWtlIGl0IFVwcGVyIENhc2UgKi8KKwlmb3IgKGk9MDsgcm93W0RCX3NlcmlhbF1baV0gIT0gJ1wwJzsgaSsrKQorCQlyb3dbREJfc2VyaWFsXVtpXSA9IHRvdXBwZXIocm93W0RCX3NlcmlhbF1baV0pOworCQorCisJb2s9MTsKKworCS8qIFNlYXJjaCBmb3IgdGhlIGNlcnRpZmljYXRlICovCisJcnJvdz1UWFRfREJfZ2V0X2J5X2luZGV4KGRiLT5kYixEQl9zZXJpYWwscm93KTsKKwlpZiAocnJvdyA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiU2VyaWFsICVzIG5vdCBwcmVzZW50IGluIGRiLlxuIiwKKwkJCQkgcm93W0RCX3NlcmlhbF0pOworCQlvaz0tMTsKKwkJZ290byBlcnI7CisJCX0KKwllbHNlIGlmIChycm93W0RCX3R5cGVdWzBdPT0nVicpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlcz1WYWxpZCAoJWMpXG4iLAorCQkJcm93W0RCX3NlcmlhbF0sIHJyb3dbREJfdHlwZV1bMF0pOworCQlnb3RvIGVycjsKKwkJfQorCWVsc2UgaWYgKHJyb3dbREJfdHlwZV1bMF09PSdSJykKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzPVJldm9rZWQgKCVjKVxuIiwKKwkJCXJvd1tEQl9zZXJpYWxdLCBycm93W0RCX3R5cGVdWzBdKTsKKwkJZ290byBlcnI7CisJCX0KKwllbHNlIGlmIChycm93W0RCX3R5cGVdWzBdPT0nRScpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlcz1FeHBpcmVkICglYylcbiIsCisJCQlyb3dbREJfc2VyaWFsXSwgcnJvd1tEQl90eXBlXVswXSk7CisJCWdvdG8gZXJyOworCQl9CisJZWxzZSBpZiAocnJvd1tEQl90eXBlXVswXT09J1MnKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiJXM9U3VzcGVuZGVkICglYylcbiIsCisJCQlyb3dbREJfc2VyaWFsXSwgcnJvd1tEQl90eXBlXVswXSk7CisJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiJXM9VW5rbm93biAoJWMpLlxuIiwKKwkJCXJvd1tEQl9zZXJpYWxdLCBycm93W0RCX3R5cGVdWzBdKTsKKwkJb2s9LTE7CisJCX0KK2VycjoKKwlmb3IgKGk9MDsgaTxEQl9OVU1CRVI7IGkrKykKKwkJeworCQlpZiAocm93W2ldICE9IE5VTEwpCisJCQlPUEVOU1NMX2ZyZWUocm93W2ldKTsKKwkJfQorCXJldHVybihvayk7CisJfQorCitzdGF0aWMgaW50IGRvX3VwZGF0ZWRiIChDQV9EQiAqZGIpCisJeworCUFTTjFfVVRDVElNRQkqYV90bSA9IE5VTEw7CisJaW50IGksIGNudCA9IDA7CisJaW50IGRiX3kyaywgYV95Mms7ICAvKiBmbGFncyA9IDEgaWYgeSA+PSAyMDAwICovIAorCWNoYXIgKipycm93LCAqYV90bV9zOworCisJYV90bSA9IEFTTjFfVVRDVElNRV9uZXcoKTsKKworCS8qIGdldCBhY3R1YWwgdGltZSBhbmQgbWFrZSBhIHN0cmluZyAqLworCWFfdG0gPSBYNTA5X2dtdGltZV9hZGooYV90bSwgMCk7CisJYV90bV9zID0gKGNoYXIgKikgT1BFTlNTTF9tYWxsb2MoYV90bS0+bGVuZ3RoKzEpOworCWlmIChhX3RtX3MgPT0gTlVMTCkKKwkJeworCQljbnQgPSAtMTsKKwkJZ290byBlcnI7CisJCX0KKworCW1lbWNweShhX3RtX3MsIGFfdG0tPmRhdGEsIGFfdG0tPmxlbmd0aCk7CisJYV90bV9zW2FfdG0tPmxlbmd0aF0gPSAnXDAnOworCisJaWYgKHN0cm5jbXAoYV90bV9zLCAiNDkiLCAyKSA8PSAwKQorCQlhX3kyayA9IDE7CisJZWxzZQorCQlhX3kyayA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfT1BFTlNTTF9QU1RSSU5HX251bShkYi0+ZGItPmRhdGEpOyBpKyspCisJCXsKKwkJcnJvdyA9IHNrX09QRU5TU0xfUFNUUklOR192YWx1ZShkYi0+ZGItPmRhdGEsIGkpOworCisJCWlmIChycm93W0RCX3R5cGVdWzBdID09ICdWJykKKwkJIAl7CisJCQkvKiBpZ25vcmUgZW50cmllcyB0aGF0IGFyZSBub3QgdmFsaWQgKi8KKwkJCWlmIChzdHJuY21wKHJyb3dbREJfZXhwX2RhdGVdLCAiNDkiLCAyKSA8PSAwKQorCQkJCWRiX3kyayA9IDE7CisJCQllbHNlCisJCQkJZGJfeTJrID0gMDsKKworCQkJaWYgKGRiX3kyayA9PSBhX3kyaykKKwkJCQl7CisJCQkJLyogYWxsIG9uIHRoZSBzYW1lIHkyayBzaWRlICovCisJCQkJaWYgKHN0cmNtcChycm93W0RCX2V4cF9kYXRlXSwgYV90bV9zKSA8PSAwKQorCQkJCSAgICAgICAJeworCQkJCSAgICAgICAJcnJvd1tEQl90eXBlXVswXSAgPSAnRSc7CisJCQkJICAgICAgIAlycm93W0RCX3R5cGVdWzFdICA9ICdcMCc7CisJICAJCQkJY250Kys7CisKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiJXM9RXhwaXJlZFxuIiwKKwkJCQkJCQlycm93W0RCX3NlcmlhbF0pOworCQkJCQl9CisJCQkJfQorCQkJZWxzZSBpZiAoZGJfeTJrIDwgYV95MmspCisJCQkJeworCQkgIAkJcnJvd1tEQl90eXBlXVswXSAgPSAnRSc7CisJCSAgCQlycm93W0RCX3R5cGVdWzFdICA9ICdcMCc7CisJICAJCQljbnQrKzsKKworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIiVzPUV4cGlyZWRcbiIsCisJCQkJCQkJcnJvd1tEQl9zZXJpYWxdKTsKKwkJCQl9CisKKwkJCX0KKyAgICAJCX0KKworZXJyOgorCisJQVNOMV9VVENUSU1FX2ZyZWUoYV90bSk7CisJT1BFTlNTTF9mcmVlKGFfdG1fcyk7CisKKwlyZXR1cm4gKGNudCk7CisJfQorCitzdGF0aWMgY29uc3QgY2hhciAqY3JsX3JlYXNvbnNbXSA9IHsKKwkvKiBDUkwgcmVhc29uIHN0cmluZ3MgKi8KKwkidW5zcGVjaWZpZWQiLAorCSJrZXlDb21wcm9taXNlIiwKKwkiQ0FDb21wcm9taXNlIiwKKwkiYWZmaWxpYXRpb25DaGFuZ2VkIiwKKwkic3VwZXJzZWRlZCIsIAorCSJjZXNzYXRpb25PZk9wZXJhdGlvbiIsCisJImNlcnRpZmljYXRlSG9sZCIsCisJInJlbW92ZUZyb21DUkwiLAorCS8qIEFkZGl0aW9uYWwgcHNldWRvIHJlYXNvbnMgKi8KKwkiaG9sZEluc3RydWN0aW9uIiwKKwkia2V5VGltZSIsCisJIkNBa2V5VGltZSIKK307CisKKyNkZWZpbmUgTlVNX1JFQVNPTlMgKHNpemVvZihjcmxfcmVhc29ucykgLyBzaXplb2YoY2hhciAqKSkKKworLyogR2l2ZW4gcmV2b2NhdGlvbiBpbmZvcm1hdGlvbiBjb252ZXJ0IHRvIGEgREIgc3RyaW5nLgorICogVGhlIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzOgorICogcmV2dGltZVsscmVhc29uLGV4dHJhXS4gV2hlcmUgJ3JldnRpbWUnIGlzIHRoZQorICogcmV2b2NhdGlvbiB0aW1lICh0aGUgY3VycmVudCB0aW1lKS4gJ3JlYXNvbicgaXMgdGhlCisgKiBvcHRpb25hbCBDUkwgcmVhc29uIGFuZCAnZXh0cmEnIGlzIGFueSBhZGRpdGlvbmFsCisgKiBhcmd1bWVudAorICovCisKK2NoYXIgKm1ha2VfcmV2b2NhdGlvbl9zdHIoaW50IHJldl90eXBlLCBjaGFyICpyZXZfYXJnKQorCXsKKwljaGFyICpvdGhlciA9IE5VTEwsICpzdHI7CisJY29uc3QgY2hhciAqcmVhc29uID0gTlVMTDsKKwlBU04xX09CSkVDVCAqb3RtcDsKKwlBU04xX1VUQ1RJTUUgKnJldnRtID0gTlVMTDsKKwlpbnQgaTsKKwlzd2l0Y2ggKHJldl90eXBlKQorCQl7CisJY2FzZSBSRVZfTk9ORToKKwkJYnJlYWs7CisKKwljYXNlIFJFVl9DUkxfUkVBU09OOgorCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJeworCQkJaWYgKCFzdHJjYXNlY21wKHJldl9hcmcsIGNybF9yZWFzb25zW2ldKSkKKwkJCQl7CisJCQkJcmVhc29uID0gY3JsX3JlYXNvbnNbaV07CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlpZiAocmVhc29uID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJVbmtub3duIENSTCByZWFzb24gJXNcbiIsIHJldl9hcmcpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCWJyZWFrOworCisJY2FzZSBSRVZfSE9MRDoKKwkJLyogQXJndW1lbnQgaXMgYW4gT0lEICovCisKKwkJb3RtcCA9IE9CSl90eHQyb2JqKHJldl9hcmcsIDApOworCQlBU04xX09CSkVDVF9mcmVlKG90bXApOworCisJCWlmIChvdG1wID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJJbnZhbGlkIG9iamVjdCBpZGVudGlmaWVyICVzXG4iLCByZXZfYXJnKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCisJCXJlYXNvbiA9ICJob2xkSW5zdHJ1Y3Rpb24iOworCQlvdGhlciA9IHJldl9hcmc7CisJCWJyZWFrOworCQkKKwljYXNlIFJFVl9LRVlfQ09NUFJPTUlTRToKKwljYXNlIFJFVl9DQV9DT01QUk9NSVNFOgorCisJCS8qIEFyZ3VtZW50IGlzIHRoZSBrZXkgY29tcHJvbWlzZSB0aW1lICAqLworCQlpZiAoIUFTTjFfR0VORVJBTElaRURUSU1FX3NldF9zdHJpbmcoTlVMTCwgcmV2X2FyZykpCisJCQl7CQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiSW52YWxpZCB0aW1lIGZvcm1hdCAlcy4gTmVlZCBZWVlZTU1EREhITU1TU1pcbiIsIHJldl9hcmcpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCW90aGVyID0gcmV2X2FyZzsKKwkJaWYgKHJldl90eXBlID09IFJFVl9LRVlfQ09NUFJPTUlTRSkKKwkJCXJlYXNvbiA9ICJrZXlUaW1lIjsKKwkJZWxzZSAKKwkJCXJlYXNvbiA9ICJDQWtleVRpbWUiOworCisJCWJyZWFrOworCisJCX0KKworCXJldnRtID0gWDUwOV9nbXRpbWVfYWRqKE5VTEwsIDApOworCisJaSA9IHJldnRtLT5sZW5ndGggKyAxOworCisJaWYgKHJlYXNvbikgaSArPSBzdHJsZW4ocmVhc29uKSArIDE7CisJaWYgKG90aGVyKSBpICs9IHN0cmxlbihvdGhlcikgKyAxOworCisJc3RyID0gT1BFTlNTTF9tYWxsb2MoaSk7CisKKwlpZiAoIXN0cikgcmV0dXJuIE5VTEw7CisKKwlCVUZfc3RybGNweShzdHIsIChjaGFyICopcmV2dG0tPmRhdGEsIGkpOworCWlmIChyZWFzb24pCisJCXsKKwkJQlVGX3N0cmxjYXQoc3RyLCAiLCIsIGkpOworCQlCVUZfc3RybGNhdChzdHIsIHJlYXNvbiwgaSk7CisJCX0KKwlpZiAob3RoZXIpCisJCXsKKwkJQlVGX3N0cmxjYXQoc3RyLCAiLCIsIGkpOworCQlCVUZfc3RybGNhdChzdHIsIG90aGVyLCBpKTsKKwkJfQorCUFTTjFfVVRDVElNRV9mcmVlKHJldnRtKTsKKwlyZXR1cm4gc3RyOworCX0KKworLyogQ29udmVydCByZXZvY2F0aW9uIGZpZWxkIHRvIFg1MDlfUkVWT0tFRCBlbnRyeSAKKyAqIHJldHVybiBjb2RlOgorICogMCBlcnJvcgorICogMSBPSworICogMiBPSyBhbmQgc29tZSBleHRlbnNpb25zIGFkZGVkIChpLmUuIFYyIENSTCkKKyAqLworCisKK2ludCBtYWtlX3Jldm9rZWQoWDUwOV9SRVZPS0VEICpyZXYsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJY2hhciAqdG1wID0gTlVMTDsKKwlpbnQgcmVhc29uX2NvZGUgPSAtMTsKKwlpbnQgaSwgcmV0ID0gMDsKKwlBU04xX09CSkVDVCAqaG9sZCA9IE5VTEw7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKmNvbXBfdGltZSA9IE5VTEw7CisJQVNOMV9FTlVNRVJBVEVEICpydG1wID0gTlVMTDsKKworCUFTTjFfVElNRSAqcmV2RGF0ZSA9IE5VTEw7CisKKwlpID0gdW5wYWNrX3JldmluZm8oJnJldkRhdGUsICZyZWFzb25fY29kZSwgJmhvbGQsICZjb21wX3RpbWUsIHN0cik7CisKKwlpZiAoaSA9PSAwKQorCQlnb3RvIGVycjsKKworCWlmIChyZXYgJiYgIVg1MDlfUkVWT0tFRF9zZXRfcmV2b2NhdGlvbkRhdGUocmV2LCByZXZEYXRlKSkKKwkJZ290byBlcnI7CisKKwlpZiAocmV2ICYmIChyZWFzb25fY29kZSAhPSBPQ1NQX1JFVk9LRURfU1RBVFVTX05PU1RBVFVTKSkKKwkJeworCQlydG1wID0gQVNOMV9FTlVNRVJBVEVEX25ldygpOworCQlpZiAoIXJ0bXAgfHwgIUFTTjFfRU5VTUVSQVRFRF9zZXQocnRtcCwgcmVhc29uX2NvZGUpKQorCQkJZ290byBlcnI7CisJCWlmICghWDUwOV9SRVZPS0VEX2FkZDFfZXh0X2kyZChyZXYsIE5JRF9jcmxfcmVhc29uLCBydG1wLCAwLCAwKSkKKwkJCWdvdG8gZXJyOworCQl9CisKKwlpZiAocmV2ICYmIGNvbXBfdGltZSkKKwkJeworCQlpZiAoIVg1MDlfUkVWT0tFRF9hZGQxX2V4dF9pMmQocmV2LCBOSURfaW52YWxpZGl0eV9kYXRlLCBjb21wX3RpbWUsIDAsIDApKQorCQkJZ290byBlcnI7CisJCX0KKwlpZiAocmV2ICYmIGhvbGQpCisJCXsKKwkJaWYgKCFYNTA5X1JFVk9LRURfYWRkMV9leHRfaTJkKHJldiwgTklEX2hvbGRfaW5zdHJ1Y3Rpb25fY29kZSwgaG9sZCwgMCwgMCkpCisJCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHJlYXNvbl9jb2RlICE9IE9DU1BfUkVWT0tFRF9TVEFUVVNfTk9TVEFUVVMpCisJCXJldCA9IDI7CisJZWxzZSByZXQgPSAxOworCisJZXJyOgorCisJaWYgKHRtcCkgT1BFTlNTTF9mcmVlKHRtcCk7CisJQVNOMV9PQkpFQ1RfZnJlZShob2xkKTsKKwlBU04xX0dFTkVSQUxJWkVEVElNRV9mcmVlKGNvbXBfdGltZSk7CisJQVNOMV9FTlVNRVJBVEVEX2ZyZWUocnRtcCk7CisJQVNOMV9USU1FX2ZyZWUocmV2RGF0ZSk7CisKKwlyZXR1cm4gcmV0OworCX0KKworaW50IG9sZF9lbnRyeV9wcmludChCSU8gKmJwLCBBU04xX09CSkVDVCAqb2JqLCBBU04xX1NUUklORyAqc3RyKQorCXsKKwljaGFyIGJ1ZlsyNV0sKnBidWYsICpwOworCWludCBqOworCWo9aTJhX0FTTjFfT0JKRUNUKGJwLG9iaik7CisJcGJ1Zj1idWY7CisJZm9yIChqPTIyLWo7IGo+MDsgai0tKQorCQkqKHBidWYrKyk9JyAnOworCSoocGJ1ZisrKT0nOic7CisJKihwYnVmKyspPSdcMCc7CisJQklPX3B1dHMoYnAsYnVmKTsKKworCWlmIChzdHItPnR5cGUgPT0gVl9BU04xX1BSSU5UQUJMRVNUUklORykKKwkJQklPX3ByaW50ZihicCwiUFJJTlRBQkxFOiciKTsKKwllbHNlIGlmIChzdHItPnR5cGUgPT0gVl9BU04xX1Q2MVNUUklORykKKwkJQklPX3ByaW50ZihicCwiVDYxU1RSSU5HOiciKTsKKwllbHNlIGlmIChzdHItPnR5cGUgPT0gVl9BU04xX0lBNVNUUklORykKKwkJQklPX3ByaW50ZihicCwiSUE1U1RSSU5HOiciKTsKKwllbHNlIGlmIChzdHItPnR5cGUgPT0gVl9BU04xX1VOSVZFUlNBTFNUUklORykKKwkJQklPX3ByaW50ZihicCwiVU5JVkVSU0FMU1RSSU5HOiciKTsKKwllbHNlCisJCUJJT19wcmludGYoYnAsIkFTTi4xICUyZDonIixzdHItPnR5cGUpOworCQkJCisJcD0oY2hhciAqKXN0ci0+ZGF0YTsKKwlmb3IgKGo9c3RyLT5sZW5ndGg7IGo+MDsgai0tKQorCQl7CisJCWlmICgoKnAgPj0gJyAnKSAmJiAoKnAgPD0gJ34nKSkKKwkJCUJJT19wcmludGYoYnAsIiVjIiwqcCk7CisJCWVsc2UgaWYgKCpwICYgMHg4MCkKKwkJCUJJT19wcmludGYoYnAsIlxcMHglMDJYIiwqcCk7CisJCWVsc2UgaWYgKCh1bnNpZ25lZCBjaGFyKSpwID09IDB4ZjcpCisJCQlCSU9fcHJpbnRmKGJwLCJePyIpOworCQllbHNlCUJJT19wcmludGYoYnAsIl4lYyIsKnArJ0AnKTsKKwkJcCsrOworCQl9CisJQklPX3ByaW50ZihicCwiJ1xuIik7CisJcmV0dXJuIDE7CisJfQorCitpbnQgdW5wYWNrX3JldmluZm8oQVNOMV9USU1FICoqcHJldnRtLCBpbnQgKnByZWFzb24sIEFTTjFfT0JKRUNUICoqcGhvbGQsIEFTTjFfR0VORVJBTElaRURUSU1FICoqcGludnRtLCBjb25zdCBjaGFyICpzdHIpCisJeworCWNoYXIgKnRtcCA9IE5VTEw7CisJY2hhciAqcnRpbWVfc3RyLCAqcmVhc29uX3N0ciA9IE5VTEwsICphcmdfc3RyID0gTlVMTCwgKnA7CisJaW50IHJlYXNvbl9jb2RlID0gLTE7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisJQVNOMV9PQkpFQ1QgKmhvbGQgPSBOVUxMOworCUFTTjFfR0VORVJBTElaRURUSU1FICpjb21wX3RpbWUgPSBOVUxMOworCXRtcCA9IEJVRl9zdHJkdXAoc3RyKTsKKworCXAgPSBzdHJjaHIodG1wLCAnLCcpOworCisJcnRpbWVfc3RyID0gdG1wOworCisJaWYgKHApCisJCXsKKwkJKnAgPSAnXDAnOworCQlwKys7CisJCXJlYXNvbl9zdHIgPSBwOworCQlwID0gc3RyY2hyKHAsICcsJyk7CisJCWlmIChwKQorCQkJeworCQkJKnAgPSAnXDAnOworCQkJYXJnX3N0ciA9IHAgKyAxOworCQkJfQorCQl9CisKKwlpZiAocHJldnRtKQorCQl7CisJCSpwcmV2dG0gPSBBU04xX1VUQ1RJTUVfbmV3KCk7CisJCWlmICghQVNOMV9VVENUSU1FX3NldF9zdHJpbmcoKnByZXZ0bSwgcnRpbWVfc3RyKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgImludmFsaWQgcmV2b2NhdGlvbiBkYXRlICVzXG4iLCBydGltZV9zdHIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlpZiAocmVhc29uX3N0cikKKwkJeworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JFQVNPTlM7IGkrKykKKwkJCXsKKwkJCWlmKCFzdHJjYXNlY21wKHJlYXNvbl9zdHIsIGNybF9yZWFzb25zW2ldKSkKKwkJCQl7CisJCQkJcmVhc29uX2NvZGUgPSBpOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJaWYgKHJlYXNvbl9jb2RlID09IE9DU1BfUkVWT0tFRF9TVEFUVVNfTk9TVEFUVVMpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJpbnZhbGlkIHJlYXNvbiBjb2RlICVzXG4iLCByZWFzb25fc3RyKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChyZWFzb25fY29kZSA9PSA3KQorCQkJcmVhc29uX2NvZGUgPSBPQ1NQX1JFVk9LRURfU1RBVFVTX1JFTU9WRUZST01DUkw7CisJCWVsc2UgaWYgKHJlYXNvbl9jb2RlID09IDgpCQkvKiBIb2xkIGluc3RydWN0aW9uICovCisJCQl7CisJCQlpZiAoIWFyZ19zdHIpCisJCQkJewkKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJtaXNzaW5nIGhvbGQgaW5zdHJ1Y3Rpb25cbiIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXJlYXNvbl9jb2RlID0gT0NTUF9SRVZPS0VEX1NUQVRVU19DRVJUSUZJQ0FURUhPTEQ7CisJCQlob2xkID0gT0JKX3R4dDJvYmooYXJnX3N0ciwgMCk7CisKKwkJCWlmICghaG9sZCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiaW52YWxpZCBvYmplY3QgaWRlbnRpZmllciAlc1xuIiwgYXJnX3N0cik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaWYgKHBob2xkKSAqcGhvbGQgPSBob2xkOworCQkJfQorCQllbHNlIGlmICgocmVhc29uX2NvZGUgPT0gOSkgfHwgKHJlYXNvbl9jb2RlID09IDEwKSkKKwkJCXsKKwkJCWlmICghYXJnX3N0cikKKwkJCQl7CQorCQkJCUJJT19wcmludGYoYmlvX2VyciwgIm1pc3NpbmcgY29tcHJvbWlzZWQgdGltZVxuIik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJY29tcF90aW1lID0gQVNOMV9HRU5FUkFMSVpFRFRJTUVfbmV3KCk7CisJCQlpZiAoIUFTTjFfR0VORVJBTElaRURUSU1FX3NldF9zdHJpbmcoY29tcF90aW1lLCBhcmdfc3RyKSkKKwkJCQl7CQorCQkJCUJJT19wcmludGYoYmlvX2VyciwgImludmFsaWQgY29tcHJvbWlzZWQgdGltZSAlc1xuIiwgYXJnX3N0cik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaWYgKHJlYXNvbl9jb2RlID09IDkpCisJCQkJcmVhc29uX2NvZGUgPSBPQ1NQX1JFVk9LRURfU1RBVFVTX0tFWUNPTVBST01JU0U7CisJCQllbHNlCisJCQkJcmVhc29uX2NvZGUgPSBPQ1NQX1JFVk9LRURfU1RBVFVTX0NBQ09NUFJPTUlTRTsKKwkJCX0KKwkJfQorCisJaWYgKHByZWFzb24pICpwcmVhc29uID0gcmVhc29uX2NvZGU7CisJaWYgKHBpbnZ0bSkgKnBpbnZ0bSA9IGNvbXBfdGltZTsKKwllbHNlIEFTTjFfR0VORVJBTElaRURUSU1FX2ZyZWUoY29tcF90aW1lKTsKKworCXJldCA9IDE7CisKKwllcnI6CisKKwlpZiAodG1wKSBPUEVOU1NMX2ZyZWUodG1wKTsKKwlpZiAoIXBob2xkKSBBU04xX09CSkVDVF9mcmVlKGhvbGQpOworCWlmICghcGludnRtKSBBU04xX0dFTkVSQUxJWkVEVElNRV9mcmVlKGNvbXBfdGltZSk7CisKKwlyZXR1cm4gcmV0OworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvY2VydC5wZW0gYi9saWIvb3BlbnNzbC9hcHBzL2NlcnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNGE3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2NlcnQucGVtCkBAIC0wLDAgKzEsMTEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQm9EQ0NBVW9DQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3WXpFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVgorQkFnVENsRjFaV1Z1YzJ4aGJtUXhHakFZQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNU013SVFZRAorVlFRREV4cFRaWEoyWlhJZ2RHVnpkQ0JqWlhKMElDZzFNVElnWW1sMEtUQWVGdzA1TnpBNU1Ea3dNelF4TWpaYQorRncwNU56RXdNRGt3TXpReE1qWmFNRjR4Q3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSUV3cFRiMjFsTFZOMAorWVhSbE1TRXdId1lEVlFRS0V4aEpiblJsY201bGRDQlhhV1JuYVhSeklGQjBlU0JNZEdReEZ6QVZCZ05WQkFNVAorRGtWeWFXTWdkR2hsSUZsdmRXNW5NRkV3Q1FZRkt3NERBZ3dGQUFORUFBSkJBTFZFcVBPRG5wSTRyU2hsWThTNwordEI3MTNKTnZhYnZuNkduZWQ3enlsd0xMaVhRQW8vUEFUNm1mZFdQVHlDWDlSbElkL0Fyb2gxb3U4OTNCQTMyUQorc2dnd0RRWUpLb1pJaHZjTkFRRUVCUUFEUVFDVTVTU2dhcEpTZFJYSm9YK0NwQ3ZGeStKVmg5SHBTakNwU05LTworMTlyYUh2OThoS0FVSnVQOUh5TStTVXNmZk82bUFJZ2l0VWFxVzgvd0RNZVBoRUMzCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2NpcGhlcnMuYyBiL2xpYi9vcGVuc3NsL2FwcHMvY2lwaGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNGM2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2NpcGhlcnMuYwpAQCAtMCwwICsxLDIzMSBAQAorLyogYXBwcy9jaXBoZXJzLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWZkZWYgT1BFTlNTTF9OT19TVERJTworI2RlZmluZSBBUFBTX1dJTjE2CisjZW5kaWYKKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCWNpcGhlcnNfbWFpbgorCitzdGF0aWMgY29uc3QgY2hhciAqY2lwaGVyc191c2FnZVtdPXsKKyJ1c2FnZTogY2lwaGVycyBhcmdzXG4iLAorIiAtdiAgICAgICAgICAtIHZlcmJvc2UgbW9kZSwgYSB0ZXh0dWFsIGxpc3Rpbmcgb2YgdGhlIFNTTC9UTFMgY2lwaGVycyBpbiBPcGVuU1NMXG4iLAorIiAtViAgICAgICAgICAtIGV2ZW4gbW9yZSB2ZXJib3NlXG4iLAorIiAtc3NsMiAgICAgICAtIFNTTDIgbW9kZVxuIiwKKyIgLXNzbDMgICAgICAgLSBTU0wzIG1vZGVcbiIsCisiIC10bHMxICAgICAgIC0gVExTMSBtb2RlXG4iLAorTlVMTAorfTsKKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlpbnQgcmV0PTEsaTsKKwlpbnQgdmVyYm9zZT0wLFZlcmJvc2U9MDsKKwljb25zdCBjaGFyICoqcHA7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgYmFkb3BzPTA7CisJU1NMX0NUWCAqY3R4PU5VTEw7CisJU1NMICpzc2w9TlVMTDsKKwljaGFyICpjaXBoZXJzPU5VTEw7CisJY29uc3QgU1NMX01FVEhPRCAqbWV0aD1OVUxMOworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpzazsKKwljaGFyIGJ1Zls1MTJdOworCUJJTyAqU1REb3V0PU5VTEw7CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykKKwltZXRoPVNTTHYyM19zZXJ2ZXJfbWV0aG9kKCk7CisjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDMpCisJbWV0aD1TU0x2M19zZXJ2ZXJfbWV0aG9kKCk7CisjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpCisJbWV0aD1TU0x2Ml9zZXJ2ZXJfbWV0aG9kKCk7CisjZW5kaWYKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJYmlvX2Vycj1CSU9fbmV3X2ZwKHN0ZGVycixCSU9fTk9DTE9TRSk7CisJU1REb3V0PUJJT19uZXdfZnAoc3Rkb3V0LEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwl7CisJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJU1REb3V0ID0gQklPX3B1c2godG1wYmlvLCBTVERvdXQpOworCX0KKyNlbmRpZgorCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmIChzdHJjbXAoKmFyZ3YsIi12IikgPT0gMCkKKwkJCXZlcmJvc2U9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItViIpID09IDApCisJCQl2ZXJib3NlPVZlcmJvc2U9MTsKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXNzbDIiKSA9PSAwKQorCQkJbWV0aD1TU0x2Ml9jbGllbnRfbWV0aG9kKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXNzbDMiKSA9PSAwKQorCQkJbWV0aD1TU0x2M19jbGllbnRfbWV0aG9kKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFMxCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXRsczEiKSA9PSAwKQorCQkJbWV0aD1UTFN2MV9jbGllbnRfbWV0aG9kKCk7CisjZW5kaWYKKwkJZWxzZSBpZiAoKHN0cm5jbXAoKmFyZ3YsIi1oIiwyKSA9PSAwKSB8fAorCQkJIChzdHJjbXAoKmFyZ3YsIi0/IikgPT0gMCkpCisJCQl7CisJCQliYWRvcHM9MTsKKwkJCWJyZWFrOworCQkJfQorCQllbHNlCisJCQl7CisJCQljaXBoZXJzPSAqYXJndjsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKworCWlmIChiYWRvcHMpCisJCXsKKwkJZm9yIChwcD1jaXBoZXJzX3VzYWdlOyAoKnBwICE9IE5VTEwpOyBwcCsrKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlcyIsKnBwKTsKKwkJZ290byBlbmQ7CisJCX0KKworCU9wZW5TU0xfYWRkX3NzbF9hbGdvcml0aG1zKCk7CisKKwljdHg9U1NMX0NUWF9uZXcobWV0aCk7CisJaWYgKGN0eCA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoY2lwaGVycyAhPSBOVUxMKSB7CisJCWlmKCFTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChjdHgsY2lwaGVycykpIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGluIGNpcGhlciBsaXN0XG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCXNzbD1TU0xfbmV3KGN0eCk7CisJaWYgKHNzbCA9PSBOVUxMKSBnb3RvIGVycjsKKworCisJaWYgKCF2ZXJib3NlKQorCQl7CisJCWZvciAoaT0wOyA7IGkrKykKKwkJCXsKKwkJCXA9U1NMX2dldF9jaXBoZXJfbGlzdChzc2wsaSk7CisJCQlpZiAocCA9PSBOVUxMKSBicmVhazsKKwkJCWlmIChpICE9IDApIEJJT19wcmludGYoU1REb3V0LCI6Iik7CisJCQlCSU9fcHJpbnRmKFNURG91dCwiJXMiLHApOworCQkJfQorCQlCSU9fcHJpbnRmKFNURG91dCwiXG4iKTsKKwkJfQorCWVsc2UgLyogdmVyYm9zZSAqLworCQl7CisJCXNrPVNTTF9nZXRfY2lwaGVycyhzc2wpOworCisJCWZvciAoaT0wOyBpPHNrX1NTTF9DSVBIRVJfbnVtKHNrKTsgaSsrKQorCQkJeworCQkJU1NMX0NJUEhFUiAqYzsKKworCQkJYyA9IHNrX1NTTF9DSVBIRVJfdmFsdWUoc2ssaSk7CisJCQkKKwkJCWlmIChWZXJib3NlKQorCQkJCXsKKwkJCQl1bnNpZ25lZCBsb25nIGlkID0gYy0+aWQ7CisJCQkJaW50IGlkMCA9IChpbnQpKGlkID4+IDI0KTsKKwkJCQlpbnQgaWQxID0gKGludCkoKGlkID4+IDE2KSAmIDB4ZmZMKTsKKwkJCQlpbnQgaWQyID0gKGludCkoKGlkID4+IDgpICYgMHhmZkwpOworCQkJCWludCBpZDMgPSAoaW50KShpZCAmIDB4ZmZMKTsKKwkJCQkKKwkJCQlpZiAoKGlkICYgMHhmZjAwMDAwMEwpID09IDB4MDIwMDAwMDBMKQorCQkJCQlCSU9fcHJpbnRmKFNURG91dCwgIiAgICAgMHglMDJYLDB4JTAyWCwweCUwMlggLSAiLCBpZDEsIGlkMiwgaWQzKTsgLyogU1NMMiBjaXBoZXIgKi8KKwkJCQllbHNlIGlmICgoaWQgJiAweGZmMDAwMDAwTCkgPT0gMHgwMzAwMDAwMEwpCisJCQkJCUJJT19wcmludGYoU1REb3V0LCAiICAgICAgICAgIDB4JTAyWCwweCUwMlggLSAiLCBpZDIsIGlkMyk7IC8qIFNTTDMgY2lwaGVyICovCisJCQkJZWxzZQorCQkJCQlCSU9fcHJpbnRmKFNURG91dCwgIjB4JTAyWCwweCUwMlgsMHglMDJYLDB4JTAyWCAtICIsIGlkMCwgaWQxLCBpZDIsIGlkMyk7IC8qIHdoYXRldmVyICovCisJCQkJfQorCisJCQlCSU9fcHV0cyhTVERvdXQsU1NMX0NJUEhFUl9kZXNjcmlwdGlvbihjLGJ1ZixzaXplb2YgYnVmKSk7CisJCQl9CisJCX0KKworCXJldD0wOworCWlmICgwKQorCQl7CitlcnI6CisJCVNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJfQorZW5kOgorCWlmIChjdHggIT0gTlVMTCkgU1NMX0NUWF9mcmVlKGN0eCk7CisJaWYgKHNzbCAhPSBOVUxMKSBTU0xfZnJlZShzc2wpOworCWlmIChTVERvdXQgIT0gTlVMTCkgQklPX2ZyZWVfYWxsKFNURG91dCk7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9jbGllbnQucGVtIGIvbGliL29wZW5zc2wvYXBwcy9jbGllbnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNzkxMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2NsaWVudC5wZW0KQEAgLTAsMCArMSwyNCBAQAoraXNzdWVyPSAvQz1BVS9TVD1RdWVlbnNsYW5kL089Q3J5cHRTb2Z0IFB0eSBMdGQvQ049VGVzdCBDQSAoMTAyNCBiaXQpCitzdWJqZWN0PS9DPUFVL1NUPVF1ZWVuc2xhbmQvTz1DcnlwdFNvZnQgUHR5IEx0ZC9DTj1DbGllbnQgdGVzdCBjZXJ0ICg1MTIgYml0KQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlCNlRDQ0FWSUNBUUl3RFFZSktvWklodmNOQVFFRUJRQXdXekVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WCitCQWdUQ2xGMVpXVnVjMnhoYm1ReEdqQVlCZ05WQkFvVEVVTnllWEIwVTI5bWRDQlFkSGtnVEhSa01Sc3dHUVlECitWUVFERXhKVVpYTjBJRU5CSUNneE1ESTBJR0pwZENrd0hoY05PVGN3TmpBNU1UTTFOelUyV2hjTk9UZ3dOakE1CitNVE0xTnpVMldqQmpNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERWFNQmdHCitBMVVFQ2hNUlEzSjVjSFJUYjJaMElGQjBlU0JNZEdReEl6QWhCZ05WQkFNVEdrTnNhV1Z1ZENCMFpYTjBJR05sCitjblFnS0RVeE1pQmlhWFFwTUZ3d0RRWUpLb1pJaHZjTkFRRUJCUUFEU3dBd1NBSkJBTHR2NTVReXpHNmkyUGx3CitaMXBhaDcrK0d2OEw1ajZIbnlyL3VUWkUxTkxHMEFCRERleG1xL1I0S2VkTGpGRUlZam9jRHVpK0lYczYyTk50CitYclQ4b2RrQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUJ3dE1tSTdvR1VHOG5LbWZ0UXNzQVRWaUg1CitOUlJ0b0V3MDdEeEpwL0xmYXRIZHJocVFCNzNlR2RMNVdJTFpKWGs0Nlh6MmU5V01TVWpWQ1NZaGRLeHRmbFUzCitVUjJBanYxT28wc1ROZGZ6MHdEcUpOaXJMTnR6eWhoc2FxOHFNVHJMd1hyQ1AzMVZ4QmlpZ0ZTUVNVRm5aeVRFCis5VEt3aFM0R2x3YnRDZnhTS1E9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQk93SUJBQUpCQUx0djU1UXl6RzZpMlBsd1oxcGFoNysrR3Y4TDVqNkhueXIvdVRaRTFOTEcwQUJERGV4bQorcS9SNEtlZExqRkVJWWpvY0R1aStJWHM2Mk5OdFhyVDhvZGtDQXdFQUFRSkFid1hxMHZKLyt1eUV2c05neExrbworL1Y4Nm1HWFEvS3JTa2VLbEwwcjRFTnhqY3llTUFHb0t1Nko5eU1ZNytYOStabTRueFNoTmZUc2YvK0ZyZW9lMQorSFFJaEFQT1NtNVExWUkrS0lzSUkyR2VWSngxVTY5K3duZDcxT2FzSVBha1MxTDFYQWlFQXhRQVcrSjMvSldFMAorZnRFWWFrYmhVT0tMOHREMU9hRlpTNzEvNUdkRzdFOENJUUNlZlVNbXlTU3Z3ZDZrQzBWbEFUU1diVytkK2pwLworbldtTTFLdnFuQW81dVFJaEFMcUVBRHU1VTFXdnQ4VU44VURHQlJQUXVsSFdOeWN1TlY0NWQzbm5za1dQQWlBdwordWVUeXI2V3NaNStTRDhnL0h5M3h1dkYzblBtSlJIK3J3dlZpaGxjRk9nPT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2Ntcy5jIGIvbGliL29wZW5zc2wvYXBwcy9jbXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjlhODg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9jbXMuYwpAQCAtMCwwICsxLDEzNjIgQEAKKy8qIGFwcHMvY21zLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBDTVMgdXRpbGl0eSBmdW5jdGlvbiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOV92ZnkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY21zLmg+CisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cgY21zX21haW4KK3N0YXRpYyBpbnQgc2F2ZV9jZXJ0cyhjaGFyICpzaWduZXJmaWxlLCBTVEFDS19PRihYNTA5KSAqc2lnbmVycyk7CitzdGF0aWMgaW50IGNtc19jYihpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpjdHgpOworc3RhdGljIHZvaWQgcmVjZWlwdF9yZXF1ZXN0X3ByaW50KEJJTyAqb3V0LCBDTVNfQ29udGVudEluZm8gKmNtcyk7CitzdGF0aWMgQ01TX1JlY2VpcHRSZXF1ZXN0ICptYWtlX3JlY2VpcHRfcmVxdWVzdChTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnJyX3RvLAorCQkJCQkJaW50IHJyX2FsbG9yZmlyc3QsCisJCQkJCVNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqcnJfZnJvbSk7CisKKyNkZWZpbmUgU01JTUVfT1AJMHgxMAorI2RlZmluZSBTTUlNRV9JUAkweDIwCisjZGVmaW5lIFNNSU1FX1NJR05FUlMJMHg0MAorI2RlZmluZSBTTUlNRV9FTkNSWVBUCQkoMSB8IFNNSU1FX09QKQorI2RlZmluZSBTTUlNRV9ERUNSWVBUCQkoMiB8IFNNSU1FX0lQKQorI2RlZmluZSBTTUlNRV9TSUdOCQkoMyB8IFNNSU1FX09QIHwgU01JTUVfU0lHTkVSUykKKyNkZWZpbmUgU01JTUVfVkVSSUZZCQkoNCB8IFNNSU1FX0lQKQorI2RlZmluZSBTTUlNRV9DTVNPVVQJCSg1IHwgU01JTUVfSVAgfCBTTUlNRV9PUCkKKyNkZWZpbmUgU01JTUVfUkVTSUdOCQkoNiB8IFNNSU1FX0lQIHwgU01JTUVfT1AgfCBTTUlNRV9TSUdORVJTKQorI2RlZmluZSBTTUlNRV9EQVRBT1VUCQkoNyB8IFNNSU1FX0lQKQorI2RlZmluZSBTTUlNRV9EQVRBX0NSRUFURQkoOCB8IFNNSU1FX09QKQorI2RlZmluZSBTTUlNRV9ESUdFU1RfVkVSSUZZCSg5IHwgU01JTUVfSVApCisjZGVmaW5lIFNNSU1FX0RJR0VTVF9DUkVBVEUJKDEwIHwgU01JTUVfT1ApCisjZGVmaW5lIFNNSU1FX1VOQ09NUFJFU1MJKDExIHwgU01JTUVfSVApCisjZGVmaW5lIFNNSU1FX0NPTVBSRVNTCQkoMTIgfCBTTUlNRV9PUCkKKyNkZWZpbmUgU01JTUVfRU5DUllQVEVEX0RFQ1JZUFQJKDEzIHwgU01JTUVfSVApCisjZGVmaW5lIFNNSU1FX0VOQ1JZUFRFRF9FTkNSWVBUCSgxNCB8IFNNSU1FX09QKQorI2RlZmluZSBTTUlNRV9TSUdOX1JFQ0VJUFQJKDE1IHwgU01JTUVfSVAgfCBTTUlNRV9PUCkKKyNkZWZpbmUgU01JTUVfVkVSSUZZX1JFQ0VJUFQJKDE2IHwgU01JTUVfSVApCisKK2ludCB2ZXJpZnlfZXJyID0gMDsKKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlFTkdJTkUgKmUgPSBOVUxMOworCWludCBvcGVyYXRpb24gPSAwOworCWludCByZXQgPSAwOworCWNoYXIgKiphcmdzOworCWNvbnN0IGNoYXIgKmlubW9kZSA9ICJyIiwgKm91dG1vZGUgPSAidyI7CisJY2hhciAqaW5maWxlID0gTlVMTCwgKm91dGZpbGUgPSBOVUxMLCAqcmN0ZmlsZSA9IE5VTEw7CisJY2hhciAqc2lnbmVyZmlsZSA9IE5VTEwsICpyZWNpcGZpbGUgPSBOVUxMOworCVNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqc2tzaWduZXJzID0gTlVMTCwgKnNra2V5cyA9IE5VTEw7CisJY2hhciAqY2VydGZpbGUgPSBOVUxMLCAqa2V5ZmlsZSA9IE5VTEwsICpjb250ZmlsZT1OVUxMOworCWNoYXIgKmNlcnRzb3V0ZmlsZSA9IE5VTEw7CisJY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyID0gTlVMTDsKKwlDTVNfQ29udGVudEluZm8gKmNtcyA9IE5VTEwsICpyY21zID0gTlVMTDsKKwlYNTA5X1NUT1JFICpzdG9yZSA9IE5VTEw7CisJWDUwOSAqY2VydCA9IE5VTEwsICpyZWNpcCA9IE5VTEwsICpzaWduZXIgPSBOVUxMOworCUVWUF9QS0VZICprZXkgPSBOVUxMOworCVNUQUNLX09GKFg1MDkpICplbmNlcnRzID0gTlVMTCwgKm90aGVyID0gTlVMTDsKKwlCSU8gKmluID0gTlVMTCwgKm91dCA9IE5VTEwsICppbmRhdGEgPSBOVUxMLCAqcmN0aW4gPSBOVUxMOworCWludCBiYWRhcmcgPSAwOworCWludCBmbGFncyA9IENNU19ERVRBQ0hFRCwgbm9vdXQgPSAwLCBwcmludCA9IDA7CisJaW50IHZlcmlmeV9yZXRjb2RlID0gMDsKKwlpbnQgcnJfcHJpbnQgPSAwLCBycl9hbGxvcmZpcnN0ID0gLTE7CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpycl90byA9IE5VTEwsICpycl9mcm9tID0gTlVMTDsKKwlDTVNfUmVjZWlwdFJlcXVlc3QgKnJyID0gTlVMTDsKKwljaGFyICp0byA9IE5VTEwsICpmcm9tID0gTlVMTCwgKnN1YmplY3QgPSBOVUxMOworCWNoYXIgKkNBZmlsZSA9IE5VTEwsICpDQXBhdGggPSBOVUxMOworCWNoYXIgKnBhc3NhcmdpbiA9IE5VTEwsICpwYXNzaW4gPSBOVUxMOworCWNoYXIgKmlucmFuZCA9IE5VTEw7CisJaW50IG5lZWRfcmFuZCA9IDA7CisJY29uc3QgRVZQX01EICpzaWduX21kID0gTlVMTDsKKwlpbnQgaW5mb3JtYXQgPSBGT1JNQVRfU01JTUUsIG91dGZvcm1hdCA9IEZPUk1BVF9TTUlNRTsKKyAgICAgICAgaW50IHJjdGZvcm1hdCA9IEZPUk1BVF9TTUlNRSwga2V5Zm9ybSA9IEZPUk1BVF9QRU07CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lPU5VTEw7CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyICpzZWNyZXRfa2V5ID0gTlVMTCwgKnNlY3JldF9rZXlpZCA9IE5VTEw7CisJc2l6ZV90IHNlY3JldF9rZXlsZW4gPSAwLCBzZWNyZXRfa2V5aWRsZW4gPSAwOworCisJQVNOMV9PQkpFQ1QgKmVjb250ZW50X3R5cGUgPSBOVUxMOworCisJWDUwOV9WRVJJRllfUEFSQU0gKnZwbSA9IE5VTEw7CisKKwlhcmdzID0gYXJndiArIDE7CisJcmV0ID0gMTsKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJeworCQlpZiAoKGJpb19lcnIgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsIHN0ZGVyciwgQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCQl9CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKworCXdoaWxlICghYmFkYXJnICYmICphcmdzICYmICphcmdzWzBdID09ICctJykKKwkJeworCQlpZiAoIXN0cmNtcCAoKmFyZ3MsICItZW5jcnlwdCIpKQorCQkJb3BlcmF0aW9uID0gU01JTUVfRU5DUllQVDsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItZGVjcnlwdCIpKQorCQkJb3BlcmF0aW9uID0gU01JTUVfREVDUllQVDsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItc2lnbiIpKQorCQkJb3BlcmF0aW9uID0gU01JTUVfU0lHTjsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItc2lnbl9yZWNlaXB0IikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9TSUdOX1JFQ0VJUFQ7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXJlc2lnbiIpKQorCQkJb3BlcmF0aW9uID0gU01JTUVfUkVTSUdOOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi12ZXJpZnkiKSkKKwkJCW9wZXJhdGlvbiA9IFNNSU1FX1ZFUklGWTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItdmVyaWZ5X3JldGNvZGUiKSkKKwkJCXZlcmlmeV9yZXRjb2RlID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLXZlcmlmeV9yZWNlaXB0IikpCisJCQl7CisJCQlvcGVyYXRpb24gPSBTTUlNRV9WRVJJRllfUkVDRUlQVDsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCWFyZ3MrKzsKKwkJCXJjdGZpbGUgPSAqYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItY21zb3V0IikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9DTVNPVVQ7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWRhdGFfb3V0IikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9EQVRBT1VUOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1kYXRhX2NyZWF0ZSIpKQorCQkJb3BlcmF0aW9uID0gU01JTUVfREFUQV9DUkVBVEU7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWRpZ2VzdF92ZXJpZnkiKSkKKwkJCW9wZXJhdGlvbiA9IFNNSU1FX0RJR0VTVF9WRVJJRlk7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWRpZ2VzdF9jcmVhdGUiKSkKKwkJCW9wZXJhdGlvbiA9IFNNSU1FX0RJR0VTVF9DUkVBVEU7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWNvbXByZXNzIikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9DT01QUkVTUzsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItdW5jb21wcmVzcyIpKQorCQkJb3BlcmF0aW9uID0gU01JTUVfVU5DT01QUkVTUzsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItRW5jcnlwdGVkRGF0YV9kZWNyeXB0IikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9FTkNSWVBURURfREVDUllQVDsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItRW5jcnlwdGVkRGF0YV9lbmNyeXB0IikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9FTkNSWVBURURfRU5DUllQVDsKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItZGVzMyIpKSAKKwkJCQljaXBoZXIgPSBFVlBfZGVzX2VkZTNfY2JjKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWRlcyIpKSAKKwkJCQljaXBoZXIgPSBFVlBfZGVzX2NiYygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1zZWVkIikpIAorCQkJCWNpcGhlciA9IEVWUF9zZWVkX2NiYygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkMyCisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXJjMi00MCIpKSAKKwkJCQljaXBoZXIgPSBFVlBfcmMyXzQwX2NiYygpOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1yYzItMTI4IikpIAorCQkJCWNpcGhlciA9IEVWUF9yYzJfY2JjKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXJjMi02NCIpKSAKKwkJCQljaXBoZXIgPSBFVlBfcmMyXzY0X2NiYygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1hZXMxMjgiKSkKKwkJCQljaXBoZXIgPSBFVlBfYWVzXzEyOF9jYmMoKTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLWFlczE5MiIpKQorCQkJCWNpcGhlciA9IEVWUF9hZXNfMTkyX2NiYygpOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItYWVzMjU2IikpCisJCQkJY2lwaGVyID0gRVZQX2Flc18yNTZfY2JjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItY2FtZWxsaWExMjgiKSkKKwkJCQljaXBoZXIgPSBFVlBfY2FtZWxsaWFfMTI4X2NiYygpOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItY2FtZWxsaWExOTIiKSkKKwkJCQljaXBoZXIgPSBFVlBfY2FtZWxsaWFfMTkyX2NiYygpOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItY2FtZWxsaWEyNTYiKSkKKwkJCQljaXBoZXIgPSBFVlBfY2FtZWxsaWFfMjU2X2NiYygpOworI2VuZGlmCisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXRleHQiKSkgCisJCQkJZmxhZ3MgfD0gQ01TX1RFWFQ7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vaW50ZXJuIikpIAorCQkJCWZsYWdzIHw9IENNU19OT0lOVEVSTjsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm92ZXJpZnkiKSAKKwkJCXx8ICFzdHJjbXAgKCphcmdzLCAiLW5vX3NpZ25lcl9jZXJ0X3ZlcmlmeSIpKSAKKwkJCQlmbGFncyB8PSBDTVNfTk9fU0lHTkVSX0NFUlRfVkVSSUZZOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub2NlcnRzIikpIAorCQkJCWZsYWdzIHw9IENNU19OT0NFUlRTOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub2F0dHIiKSkgCisJCQkJZmxhZ3MgfD0gQ01TX05PQVRUUjsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9kZXRhY2giKSkgCisJCQkJZmxhZ3MgJj0gfkNNU19ERVRBQ0hFRDsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9zbWltZWNhcCIpKQorCQkJCWZsYWdzIHw9IENNU19OT1NNSU1FQ0FQOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1iaW5hcnkiKSkKKwkJCQlmbGFncyB8PSBDTVNfQklOQVJZOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1rZXlpZCIpKQorCQkJCWZsYWdzIHw9IENNU19VU0VfS0VZSUQ7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vc2lncyIpKQorCQkJCWZsYWdzIHw9IENNU19OT1NJR1M7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vX2NvbnRlbnRfdmVyaWZ5IikpCisJCQkJZmxhZ3MgfD0gQ01TX05PX0NPTlRFTlRfVkVSSUZZOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub19hdHRyX3ZlcmlmeSIpKQorCQkJCWZsYWdzIHw9IENNU19OT19BVFRSX1ZFUklGWTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItc3RyZWFtIikpCisJCQkJZmxhZ3MgfD0gQ01TX1NUUkVBTTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItaW5kZWYiKSkKKwkJCQlmbGFncyB8PSBDTVNfU1RSRUFNOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub2luZGVmIikpCisJCQkJZmxhZ3MgJj0gfkNNU19TVFJFQU07CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vb2xkbWltZSIpKQorCQkJCWZsYWdzIHw9IENNU19OT09MRE1JTUVUWVBFOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1jcmxmZW9sIikpCisJCQkJZmxhZ3MgfD0gQ01TX0NSTEZFT0w7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vb3V0IikpCisJCQkJbm9vdXQgPSAxOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1yZWNlaXB0X3JlcXVlc3RfcHJpbnQiKSkKKwkJCQlycl9wcmludCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXJlY2VpcHRfcmVxdWVzdF9hbGwiKSkKKwkJCQlycl9hbGxvcmZpcnN0ID0gMDsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItcmVjZWlwdF9yZXF1ZXN0X2ZpcnN0IikpCisJCQkJcnJfYWxsb3JmaXJzdCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1yZWNlaXB0X3JlcXVlc3RfZnJvbSIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJYXJncysrOworCQkJaWYgKCFycl9mcm9tKQorCQkJCXJyX2Zyb20gPSBza19PUEVOU1NMX1NUUklOR19uZXdfbnVsbCgpOworCQkJc2tfT1BFTlNTTF9TVFJJTkdfcHVzaChycl9mcm9tLCAqYXJncyk7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1yZWNlaXB0X3JlcXVlc3RfdG8iKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCWFyZ3MrKzsKKwkJCWlmICghcnJfdG8pCisJCQkJcnJfdG8gPSBza19PUEVOU1NMX1NUUklOR19uZXdfbnVsbCgpOworCQkJc2tfT1BFTlNTTF9TVFJJTkdfcHVzaChycl90bywgKmFyZ3MpOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1wcmludCIpKQorCQkJCXsKKwkJCQlub291dCA9IDE7CisJCQkJcHJpbnQgPSAxOworCQkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLXNlY3JldGtleSIpKQorCQkJeworCQkJbG9uZyBsdG1wOworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJYXJncysrOworCQkJc2VjcmV0X2tleSA9IHN0cmluZ190b19oZXgoKmFyZ3MsICZsdG1wKTsKKwkJCWlmICghc2VjcmV0X2tleSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiSW52YWxpZCBrZXkgJXNcbiIsICphcmdzKTsKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCQl9CisJCQlzZWNyZXRfa2V5bGVuID0gKHNpemVfdClsdG1wOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItc2VjcmV0a2V5aWQiKSkKKwkJCXsKKwkJCWxvbmcgbHRtcDsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCWFyZ3MrKzsKKwkJCXNlY3JldF9rZXlpZCA9IHN0cmluZ190b19oZXgoKmFyZ3MsICZsdG1wKTsKKwkJCWlmICghc2VjcmV0X2tleWlkKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJJbnZhbGlkIGlkICVzXG4iLCAqYXJncyk7CisJCQkJZ290byBhcmdlcnI7CisJCQkJfQorCQkJc2VjcmV0X2tleWlkbGVuID0gKHNpemVfdClsdG1wOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItZWNvbnRlbnRfdHlwZSIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJYXJncysrOworCQkJZWNvbnRlbnRfdHlwZSA9IE9CSl90eHQyb2JqKCphcmdzLCAwKTsKKwkJCWlmICghZWNvbnRlbnRfdHlwZSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiSW52YWxpZCBPSUQgJXNcbiIsICphcmdzKTsKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1yYW5kIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQlhcmdzKys7CisJCQlpbnJhbmQgPSAqYXJnczsKKwkJCW5lZWRfcmFuZCA9IDE7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1lbmdpbmUiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCWVuZ2luZSA9ICorK2FyZ3M7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLXBhc3NpbiIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJcGFzc2FyZ2luID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItdG8iKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCXRvID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItZnJvbSIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJZnJvbSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXN1YmplY3QiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCXN1YmplY3QgPSAqKythcmdzOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1zaWduZXIiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCS8qIElmIHByZXZpb3VzIC1zaWduZXIgYXJndW1lbnQgYWRkIHNpZ25lciB0byBsaXN0ICovCisKKwkJCWlmIChzaWduZXJmaWxlKQorCQkJCXsKKwkJCQlpZiAoIXNrc2lnbmVycykKKwkJCQkJc2tzaWduZXJzID0gc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKTsKKwkJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKHNrc2lnbmVycywgc2lnbmVyZmlsZSk7CisJCQkJaWYgKCFrZXlmaWxlKQorCQkJCQlrZXlmaWxlID0gc2lnbmVyZmlsZTsKKwkJCQlpZiAoIXNra2V5cykKKwkJCQkJc2trZXlzID0gc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKTsKKwkJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKHNra2V5cywga2V5ZmlsZSk7CisJCQkJa2V5ZmlsZSA9IE5VTEw7CisJCQkJfQorCQkJc2lnbmVyZmlsZSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXJlY2lwIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQlyZWNpcGZpbGUgPSAqKythcmdzOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1jZXJ0c291dCIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJY2VydHNvdXRmaWxlID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbWQiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCXNpZ25fbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgqKythcmdzKTsKKwkJCWlmIChzaWduX21kID09IE5VTEwpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIlVua25vd24gZGlnZXN0ICVzXG4iLAorCQkJCQkJCSphcmdzKTsKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWlua2V5IikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCQorCQkJCWdvdG8gYXJnZXJyOworCQkJLyogSWYgcHJldmlvdXMgLWlua2V5IGFydW1lbnQgYWRkIHNpZ25lciB0byBsaXN0ICovCisJCQlpZiAoa2V5ZmlsZSkKKwkJCQl7CisJCQkJaWYgKCFzaWduZXJmaWxlKQorCQkJCQl7CisJCQkJCUJJT19wdXRzKGJpb19lcnIsICJJbGxlZ2FsIC1pbmtleSB3aXRob3V0IC1zaWduZXJcbiIpOworCQkJCQlnb3RvIGFyZ2VycjsKKwkJCQkJfQorCQkJCWlmICghc2tzaWduZXJzKQorCQkJCQlza3NpZ25lcnMgPSBza19PUEVOU1NMX1NUUklOR19uZXdfbnVsbCgpOworCQkJCXNrX09QRU5TU0xfU1RSSU5HX3B1c2goc2tzaWduZXJzLCBzaWduZXJmaWxlKTsKKwkJCQlzaWduZXJmaWxlID0gTlVMTDsKKwkJCQlpZiAoIXNra2V5cykKKwkJCQkJc2trZXlzID0gc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKTsKKwkJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKHNra2V5cywga2V5ZmlsZSk7CisJCQkJfQorCQkJa2V5ZmlsZSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWtleWZvcm0iKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCWtleWZvcm0gPSBzdHIyZm10KCorK2FyZ3MpOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1yY3Rmb3JtIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQlyY3Rmb3JtYXQgPSBzdHIyZm10KCorK2FyZ3MpOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1jZXJ0ZmlsZSIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJY2VydGZpbGUgPSAqKythcmdzOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1DQWZpbGUiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCUNBZmlsZSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLUNBcGF0aCIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJQ0FwYXRoID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItaW4iKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCWluZmlsZSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWluZm9ybSIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJaW5mb3JtYXQgPSBzdHIyZm10KCorK2FyZ3MpOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1vdXRmb3JtIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQlvdXRmb3JtYXQgPSBzdHIyZm10KCorK2FyZ3MpOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1vdXQiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCW91dGZpbGUgPSAqKythcmdzOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1jb250ZW50IikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQljb250ZmlsZSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKGFyZ3NfdmVyaWZ5KCZhcmdzLCBOVUxMLCAmYmFkYXJnLCBiaW9fZXJyLCAmdnBtKSkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmICgoY2lwaGVyID0gRVZQX2dldF9jaXBoZXJieW5hbWUoKmFyZ3MgKyAxKSkgPT0gTlVMTCkKKwkJCWJhZGFyZyA9IDE7CisJCWFyZ3MrKzsKKwkJfQorCisJaWYgKCgocnJfYWxsb3JmaXJzdCAhPSAtMSkgfHwgcnJfZnJvbSkgJiYgIXJyX3RvKQorCQl7CisJCUJJT19wdXRzKGJpb19lcnIsICJObyBTaWduZWQgUmVjZWlwdHMgUmVjaXBpZW50c1xuIik7CisJCWdvdG8gYXJnZXJyOworCQl9CisKKwlpZiAoIShvcGVyYXRpb24gJiBTTUlNRV9TSUdORVJTKSAgJiYgKHJyX3RvIHx8IHJyX2Zyb20pKQorCQl7CisJCUJJT19wdXRzKGJpb19lcnIsICJTaWduZWQgcmVjZWlwdHMgb25seSBhbGxvd2VkIHdpdGggLXNpZ25cbiIpOworCQlnb3RvIGFyZ2VycjsKKwkJfQorCWlmICghKG9wZXJhdGlvbiAmIFNNSU1FX1NJR05FUlMpICYmIChza2tleXMgfHwgc2tzaWduZXJzKSkKKwkJeworCQlCSU9fcHV0cyhiaW9fZXJyLCAiTXVsdGlwbGUgc2lnbmVycyBvciBrZXlzIG5vdCBhbGxvd2VkXG4iKTsKKwkJZ290byBhcmdlcnI7CisJCX0KKworCWlmIChvcGVyYXRpb24gJiBTTUlNRV9TSUdORVJTKQorCQl7CisJCWlmIChrZXlmaWxlICYmICFzaWduZXJmaWxlKQorCQkJeworCQkJQklPX3B1dHMoYmlvX2VyciwgIklsbGVnYWwgLWlua2V5IHdpdGhvdXQgLXNpZ25lclxuIik7CisJCQlnb3RvIGFyZ2VycjsKKwkJCX0KKwkJLyogQ2hlY2sgdG8gc2VlIGlmIGFueSBmaW5hbCBzaWduZXIgbmVlZHMgdG8gYmUgYXBwZW5kZWQgKi8KKwkJaWYgKHNpZ25lcmZpbGUpCisJCQl7CisJCQlpZiAoIXNrc2lnbmVycykKKwkJCQlza3NpZ25lcnMgPSBza19PUEVOU1NMX1NUUklOR19uZXdfbnVsbCgpOworCQkJc2tfT1BFTlNTTF9TVFJJTkdfcHVzaChza3NpZ25lcnMsIHNpZ25lcmZpbGUpOworCQkJaWYgKCFza2tleXMpCisJCQkJc2trZXlzID0gc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKTsKKwkJCWlmICgha2V5ZmlsZSkKKwkJCQlrZXlmaWxlID0gc2lnbmVyZmlsZTsKKwkJCXNrX09QRU5TU0xfU1RSSU5HX3B1c2goc2trZXlzLCBrZXlmaWxlKTsKKwkJCX0KKwkJaWYgKCFza3NpZ25lcnMpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJObyBzaWduZXIgY2VydGlmaWNhdGUgc3BlY2lmaWVkXG4iKTsKKwkJCWJhZGFyZyA9IDE7CisJCQl9CisJCXNpZ25lcmZpbGUgPSBOVUxMOworCQlrZXlmaWxlID0gTlVMTDsKKwkJbmVlZF9yYW5kID0gMTsKKwkJfQorCisJZWxzZSBpZiAob3BlcmF0aW9uID09IFNNSU1FX0RFQ1JZUFQpCisJCXsKKwkJaWYgKCFyZWNpcGZpbGUgJiYgIWtleWZpbGUgJiYgIXNlY3JldF9rZXkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJObyByZWNpcGllbnQgY2VydGlmaWNhdGUgb3Iga2V5IHNwZWNpZmllZFxuIik7CisJCQliYWRhcmcgPSAxOworCQkJfQorCQl9CisJZWxzZSBpZiAob3BlcmF0aW9uID09IFNNSU1FX0VOQ1JZUFQpCisJCXsKKwkJaWYgKCEqYXJncyAmJiAhc2VjcmV0X2tleSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIk5vIHJlY2lwaWVudChzKSBjZXJ0aWZpY2F0ZShzKSBzcGVjaWZpZWRcbiIpOworCQkJYmFkYXJnID0gMTsKKwkJCX0KKwkJbmVlZF9yYW5kID0gMTsKKwkJfQorCWVsc2UgaWYgKCFvcGVyYXRpb24pCisJCWJhZGFyZyA9IDE7CisKKwlpZiAoYmFkYXJnKQorCQl7CisJCWFyZ2VycjoKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIlVzYWdlIGNtcyBbb3B0aW9uc10gY2VydC5wZW0gLi4uXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIndoZXJlIG9wdGlvbnMgYXJlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1lbmNyeXB0ICAgICAgIGVuY3J5cHQgbWVzc2FnZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItZGVjcnlwdCAgICAgICBkZWNyeXB0IGVuY3J5cHRlZCBtZXNzYWdlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1zaWduICAgICAgICAgIHNpZ24gbWVzc2FnZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItdmVyaWZ5ICAgICAgICB2ZXJpZnkgc2lnbmVkIG1lc3NhZ2VcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNtc291dCAgICAgICAgb3V0cHV0IENNUyBzdHJ1Y3R1cmVcbiIpOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWRlczMgICAgICAgICAgZW5jcnlwdCB3aXRoIHRyaXBsZSBERVNcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWRlcyAgICAgICAgICAgZW5jcnlwdCB3aXRoIERFU1xuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisJCUJJT19wcmludGYgKGJpb19lcnIsICItc2VlZCAgICAgICAgICBlbmNyeXB0IHdpdGggU0VFRFxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzIKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yYzItNDAgICAgICAgIGVuY3J5cHQgd2l0aCBSQzItNDAgKGRlZmF1bHQpXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yYzItNjQgICAgICAgIGVuY3J5cHQgd2l0aCBSQzItNjRcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXJjMi0xMjggICAgICAgZW5jcnlwdCB3aXRoIFJDMi0xMjhcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJCUJJT19wcmludGYgKGJpb19lcnIsICItYWVzMTI4LCAtYWVzMTkyLCAtYWVzMjU2XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIiAgICAgICAgICAgICAgIGVuY3J5cHQgUEVNIG91dHB1dCB3aXRoIGNiYyBhZXNcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1jYW1lbGxpYTEyOCwgLWNhbWVsbGlhMTkyLCAtY2FtZWxsaWEyNTZcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiICAgICAgICAgICAgICAgZW5jcnlwdCBQRU0gb3V0cHV0IHdpdGggY2JjIGNhbWVsbGlhXG4iKTsKKyNlbmRpZgorCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vaW50ZXJuICAgICAgZG9uJ3Qgc2VhcmNoIGNlcnRpZmljYXRlcyBpbiBtZXNzYWdlIGZvciBzaWduZXJcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vc2lncyAgICAgICAgZG9uJ3QgdmVyaWZ5IG1lc3NhZ2Ugc2lnbmF0dXJlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub3ZlcmlmeSAgICAgIGRvbid0IHZlcmlmeSBzaWduZXJzIGNlcnRpZmljYXRlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub2NlcnRzICAgICAgIGRvbid0IGluY2x1ZGUgc2lnbmVycyBjZXJ0aWZpY2F0ZSB3aGVuIHNpZ25pbmdcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vZGV0YWNoICAgICAgdXNlIG9wYXF1ZSBzaWduaW5nXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub2F0dHIgICAgICAgIGRvbid0IGluY2x1ZGUgYW55IHNpZ25lZCBhdHRyaWJ1dGVzXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1iaW5hcnkgICAgICAgIGRvbid0IHRyYW5zbGF0ZSBtZXNzYWdlIHRvIHRleHRcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNlcnRmaWxlIGZpbGUgb3RoZXIgY2VydGlmaWNhdGVzIGZpbGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNlcnRzb3V0IGZpbGUgY2VydGlmaWNhdGUgb3V0cHV0IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXNpZ25lciBmaWxlICAgc2lnbmVyIGNlcnRpZmljYXRlIGZpbGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXJlY2lwICBmaWxlICAgcmVjaXBpZW50IGNlcnRpZmljYXRlIGZpbGUgZm9yIGRlY3J5cHRpb25cbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXNrZXlpZCAgICAgICAgdXNlIHN1YmplY3Qga2V5IGlkZW50aWZpZXJcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWluIGZpbGUgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItaW5mb3JtIGFyZyAgICBpbnB1dCBmb3JtYXQgU01JTUUgKGRlZmF1bHQpLCBQRU0gb3IgREVSXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1pbmtleSBmaWxlICAgIGlucHV0IHByaXZhdGUga2V5IChpZiBub3Qgc2lnbmVyIG9yIHJlY2lwaWVudClcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWtleWZvcm0gYXJnICAgaW5wdXQgcHJpdmF0ZSBrZXkgZm9ybWF0IChQRU0gb3IgRU5HSU5FKVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItb3V0IGZpbGUgICAgICBvdXRwdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItb3V0Zm9ybSBhcmcgICBvdXRwdXQgZm9ybWF0IFNNSU1FIChkZWZhdWx0KSwgUEVNIG9yIERFUlxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItY29udGVudCBmaWxlICBzdXBwbHkgb3Igb3ZlcnJpZGUgY29udGVudCBmb3IgZGV0YWNoZWQgc2lnbmF0dXJlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi10byBhZGRyICAgICAgIHRvIGFkZHJlc3NcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWZyb20gYWQgICAgICAgZnJvbSBhZGRyZXNzXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1zdWJqZWN0IHMgICAgIHN1YmplY3RcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXRleHQgICAgICAgICAgaW5jbHVkZSBvciBkZWxldGUgdGV4dCBNSU1FIGhlYWRlcnNcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLUNBcGF0aCBkaXIgICAgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgZGlyZWN0b3J5XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1DQWZpbGUgZmlsZSAgIHRydXN0ZWQgY2VydGlmaWNhdGVzIGZpbGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNybF9jaGVjayAgICAgY2hlY2sgcmV2b2NhdGlvbiBzdGF0dXMgb2Ygc2lnbmVyJ3MgY2VydGlmaWNhdGUgdXNpbmcgQ1JMc1xuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItY3JsX2NoZWNrX2FsbCBjaGVjayByZXZvY2F0aW9uIHN0YXR1cyBvZiBzaWduZXIncyBjZXJ0aWZpY2F0ZSBjaGFpbiB1c2luZyBDUkxzXG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1lbmdpbmUgZSAgICAgIHVzZSBlbmdpbmUgZSwgcG9zc2libHkgYSBoYXJkd2FyZSBkZXZpY2UuXG4iKTsKKyNlbmRpZgorCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXBhc3NpbiBhcmcgICAgaW5wdXQgZmlsZSBwYXNzIHBocmFzZSBzb3VyY2VcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICAiLXJhbmQgZmlsZSVjZmlsZSVjLi4uXG4iLCBMSVNUX1NFUEFSQVRPUl9DSEFSLCBMSVNUX1NFUEFSQVRPUl9DSEFSKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAgIiAgICAgICAgICAgICAgIGxvYWQgdGhlIGZpbGUgKG9yIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5KSBpbnRvXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAgIiAgICAgICAgICAgICAgIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICJjZXJ0LnBlbSAgICAgICByZWNpcGllbnQgY2VydGlmaWNhdGUocykgZm9yIGVuY3J5cHRpb25cbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgICAgIGUgPSBzZXR1cF9lbmdpbmUoYmlvX2VyciwgZW5naW5lLCAwKTsKKyNlbmRpZgorCisJaWYgKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmdpbiwgTlVMTCwgJnBhc3NpbiwgTlVMTCkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgZ2V0dGluZyBwYXNzd29yZFxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAobmVlZF9yYW5kKQorCQl7CisJCWFwcF9SQU5EX2xvYWRfZmlsZShOVUxMLCBiaW9fZXJyLCAoaW5yYW5kICE9IE5VTEwpKTsKKwkJaWYgKGlucmFuZCAhPSBOVUxMKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlbGQgc2VtaS1yYW5kb20gYnl0ZXMgbG9hZGVkXG4iLAorCQkJCWFwcF9SQU5EX2xvYWRfZmlsZXMoaW5yYW5kKSk7CisJCX0KKworCXJldCA9IDI7CisKKwlpZiAoIShvcGVyYXRpb24gJiBTTUlNRV9TSUdORVJTKSkKKwkJZmxhZ3MgJj0gfkNNU19ERVRBQ0hFRDsKKworCWlmIChvcGVyYXRpb24gJiBTTUlNRV9PUCkKKwkJeworCQlpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJb3V0bW9kZSA9ICJ3YiI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGZsYWdzICYgQ01TX0JJTkFSWSkKKwkJCW91dG1vZGUgPSAid2IiOworCQl9CisKKwlpZiAob3BlcmF0aW9uICYgU01JTUVfSVApCisJCXsKKwkJaWYgKGluZm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJaW5tb2RlID0gInJiIjsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoZmxhZ3MgJiBDTVNfQklOQVJZKQorCQkJaW5tb2RlID0gInJiIjsKKwkJfQorCisJaWYgKG9wZXJhdGlvbiA9PSBTTUlNRV9FTkNSWVBUKQorCQl7CisJCWlmICghY2lwaGVyKQorCQkJeworI2lmbmRlZiBPUEVOU1NMX05PX0RFUwkJCQorCQkJY2lwaGVyID0gRVZQX2Rlc19lZGUzX2NiYygpOworI2Vsc2UKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIk5vIGNpcGhlciBzZWxlY3RlZFxuIik7CisJCQlnb3RvIGVuZDsKKyNlbmRpZgorCQkJfQorCisJCWlmIChzZWNyZXRfa2V5ICYmICFzZWNyZXRfa2V5aWQpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJObyBzZWNyZXQga2V5IGlkXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCWlmICgqYXJncykKKwkJCWVuY2VydHMgPSBza19YNTA5X25ld19udWxsKCk7CisJCXdoaWxlICgqYXJncykKKwkJCXsKKwkJCWlmICghKGNlcnQgPSBsb2FkX2NlcnQoYmlvX2VyciwqYXJncyxGT1JNQVRfUEVNLAorCQkJCU5VTEwsIGUsICJyZWNpcGllbnQgY2VydGlmaWNhdGUgZmlsZSIpKSkKKwkJCQlnb3RvIGVuZDsKKwkJCXNrX1g1MDlfcHVzaChlbmNlcnRzLCBjZXJ0KTsKKwkJCWNlcnQgPSBOVUxMOworCQkJYXJncysrOworCQkJfQorCQl9CisKKwlpZiAoY2VydGZpbGUpCisJCXsKKwkJaWYgKCEob3RoZXIgPSBsb2FkX2NlcnRzKGJpb19lcnIsY2VydGZpbGUsRk9STUFUX1BFTSwgTlVMTCwKKwkJCWUsICJjZXJ0aWZpY2F0ZSBmaWxlIikpKQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAocmVjaXBmaWxlICYmIChvcGVyYXRpb24gPT0gU01JTUVfREVDUllQVCkpCisJCXsKKwkJaWYgKCEocmVjaXAgPSBsb2FkX2NlcnQoYmlvX2VycixyZWNpcGZpbGUsRk9STUFUX1BFTSxOVUxMLAorCQkJZSwgInJlY2lwaWVudCBjZXJ0aWZpY2F0ZSBmaWxlIikpKQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAob3BlcmF0aW9uID09IFNNSU1FX1NJR05fUkVDRUlQVCkKKwkJeworCQlpZiAoIShzaWduZXIgPSBsb2FkX2NlcnQoYmlvX2VycixzaWduZXJmaWxlLEZPUk1BVF9QRU0sTlVMTCwKKwkJCWUsICJyZWNlaXB0IHNpZ25lciBjZXJ0aWZpY2F0ZSBmaWxlIikpKQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAob3BlcmF0aW9uID09IFNNSU1FX0RFQ1JZUFQpCisJCXsKKwkJaWYgKCFrZXlmaWxlKQorCQkJa2V5ZmlsZSA9IHJlY2lwZmlsZTsKKwkJfQorCWVsc2UgaWYgKChvcGVyYXRpb24gPT0gU01JTUVfU0lHTikgfHwgKG9wZXJhdGlvbiA9PSBTTUlNRV9TSUdOX1JFQ0VJUFQpKQorCQl7CisJCWlmICgha2V5ZmlsZSkKKwkJCWtleWZpbGUgPSBzaWduZXJmaWxlOworCQl9CisJZWxzZSBrZXlmaWxlID0gTlVMTDsKKworCWlmIChrZXlmaWxlKQorCQl7CisJCWtleSA9IGxvYWRfa2V5KGJpb19lcnIsIGtleWZpbGUsIGtleWZvcm0sIDAsIHBhc3NpbiwgZSwKKwkJCSAgICAgICAic2lnbmluZyBrZXkgZmlsZSIpOworCQlpZiAoIWtleSkKKwkJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoaW5maWxlKQorCQl7CisJCWlmICghKGluID0gQklPX25ld19maWxlKGluZmlsZSwgaW5tb2RlKSkpCisJCQl7CisJCQlCSU9fcHJpbnRmIChiaW9fZXJyLAorCQkJCSAiQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBpbmZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCWluID0gQklPX25ld19mcChzdGRpbiwgQklPX05PQ0xPU0UpOworCisJaWYgKG9wZXJhdGlvbiAmIFNNSU1FX0lQKQorCQl7CisJCWlmIChpbmZvcm1hdCA9PSBGT1JNQVRfU01JTUUpIAorCQkJY21zID0gU01JTUVfcmVhZF9DTVMoaW4sICZpbmRhdGEpOworCQllbHNlIGlmIChpbmZvcm1hdCA9PSBGT1JNQVRfUEVNKSAKKwkJCWNtcyA9IFBFTV9yZWFkX2Jpb19DTVMoaW4sIE5VTEwsIE5VTEwsIE5VTEwpOworCQllbHNlIGlmIChpbmZvcm1hdCA9PSBGT1JNQVRfQVNOMSkgCisJCQljbXMgPSBkMmlfQ01TX2JpbyhpbiwgTlVMTCk7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkJhZCBpbnB1dCBmb3JtYXQgZm9yIENNUyBmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCWlmICghY21zKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgcmVhZGluZyBTL01JTUUgbWVzc2FnZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKGNvbnRmaWxlKQorCQkJeworCQkJQklPX2ZyZWUoaW5kYXRhKTsKKwkJCWlmICghKGluZGF0YSA9IEJJT19uZXdfZmlsZShjb250ZmlsZSwgInJiIikpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJDYW4ndCByZWFkIGNvbnRlbnQgZmlsZSAlc1xuIiwgY29udGZpbGUpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJaWYgKGNlcnRzb3V0ZmlsZSkKKwkJCXsKKwkJCVNUQUNLX09GKFg1MDkpICphbGxjZXJ0czsKKwkJCWFsbGNlcnRzID0gQ01TX2dldDFfY2VydHMoY21zKTsKKwkJCWlmICghc2F2ZV9jZXJ0cyhjZXJ0c291dGZpbGUsIGFsbGNlcnRzKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkJIkVycm9yIHdyaXRpbmcgY2VydHMgdG8gJXNcbiIsCisJCQkJCQkJCWNlcnRzb3V0ZmlsZSk7CisJCQkJcmV0ID0gNTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlza19YNTA5X3BvcF9mcmVlKGFsbGNlcnRzLCBYNTA5X2ZyZWUpOworCQkJfQorCQl9CisKKwlpZiAocmN0ZmlsZSkKKwkJeworCQljaGFyICpyY3Rtb2RlID0gKHJjdGZvcm1hdCA9PSBGT1JNQVRfQVNOMSkgPyAicmIiIDogInIiOworCQlpZiAoIShyY3RpbiA9IEJJT19uZXdfZmlsZShyY3RmaWxlLCByY3Rtb2RlKSkpCisJCQl7CisJCQlCSU9fcHJpbnRmIChiaW9fZXJyLAorCQkJCSAiQ2FuJ3Qgb3BlbiByZWNlaXB0IGZpbGUgJXNcbiIsIHJjdGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCQorCQlpZiAocmN0Zm9ybWF0ID09IEZPUk1BVF9TTUlNRSkgCisJCQlyY21zID0gU01JTUVfcmVhZF9DTVMocmN0aW4sIE5VTEwpOworCQllbHNlIGlmIChyY3Rmb3JtYXQgPT0gRk9STUFUX1BFTSkgCisJCQlyY21zID0gUEVNX3JlYWRfYmlvX0NNUyhyY3RpbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWVsc2UgaWYgKHJjdGZvcm1hdCA9PSBGT1JNQVRfQVNOMSkgCisJCQlyY21zID0gZDJpX0NNU19iaW8ocmN0aW4sIE5VTEwpOworCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJCYWQgaW5wdXQgZm9ybWF0IGZvciByZWNlaXB0XG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCWlmICghcmNtcykKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHJlYWRpbmcgcmVjZWlwdFxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJaWYgKG91dGZpbGUpCisJCXsKKwkJaWYgKCEob3V0ID0gQklPX25ld19maWxlKG91dGZpbGUsIG91dG1vZGUpKSkKKwkJCXsKKwkJCUJJT19wcmludGYgKGJpb19lcnIsCisJCQkJICJDYW4ndCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRmaWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCW91dCA9IEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJICAgIEJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQkgICAgb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwkJfQorCisJaWYgKChvcGVyYXRpb24gPT0gU01JTUVfVkVSSUZZKSB8fCAob3BlcmF0aW9uID09IFNNSU1FX1ZFUklGWV9SRUNFSVBUKSkKKwkJeworCQlpZiAoIShzdG9yZSA9IHNldHVwX3ZlcmlmeShiaW9fZXJyLCBDQWZpbGUsIENBcGF0aCkpKQorCQkJZ290byBlbmQ7CisJCVg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYihzdG9yZSwgY21zX2NiKTsKKwkJaWYgKHZwbSkKKwkJCVg1MDlfU1RPUkVfc2V0MV9wYXJhbShzdG9yZSwgdnBtKTsKKwkJfQorCisKKwlyZXQgPSAzOworCisJaWYgKG9wZXJhdGlvbiA9PSBTTUlNRV9EQVRBX0NSRUFURSkKKwkJeworCQljbXMgPSBDTVNfZGF0YV9jcmVhdGUoaW4sIGZsYWdzKTsKKwkJfQorCWVsc2UgaWYgKG9wZXJhdGlvbiA9PSBTTUlNRV9ESUdFU1RfQ1JFQVRFKQorCQl7CisJCWNtcyA9IENNU19kaWdlc3RfY3JlYXRlKGluLCBzaWduX21kLCBmbGFncyk7CisJCX0KKwllbHNlIGlmIChvcGVyYXRpb24gPT0gU01JTUVfQ09NUFJFU1MpCisJCXsKKwkJY21zID0gQ01TX2NvbXByZXNzKGluLCAtMSwgZmxhZ3MpOworCQl9CisJZWxzZSBpZiAob3BlcmF0aW9uID09IFNNSU1FX0VOQ1JZUFQpCisJCXsKKwkJZmxhZ3MgfD0gQ01TX1BBUlRJQUw7CisJCWNtcyA9IENNU19lbmNyeXB0KGVuY2VydHMsIGluLCBjaXBoZXIsIGZsYWdzKTsKKwkJaWYgKCFjbXMpCisJCQlnb3RvIGVuZDsKKwkJaWYgKHNlY3JldF9rZXkpCisJCQl7CisJCQlpZiAoIUNNU19hZGQwX3JlY2lwaWVudF9rZXkoY21zLCBOSURfdW5kZWYsIAorCQkJCQkJc2VjcmV0X2tleSwgc2VjcmV0X2tleWxlbiwKKwkJCQkJCXNlY3JldF9rZXlpZCwgc2VjcmV0X2tleWlkbGVuLAorCQkJCQkJTlVMTCwgTlVMTCwgTlVMTCkpCisJCQkJZ290byBlbmQ7CisJCQkvKiBOVUxMIHRoZXNlIGJlY2F1c2UgY2FsbCBhYnNvcmJzIHRoZW0gKi8KKwkJCXNlY3JldF9rZXkgPSBOVUxMOworCQkJc2VjcmV0X2tleWlkID0gTlVMTDsKKwkJCX0KKwkJaWYgKCEoZmxhZ3MgJiBDTVNfU1RSRUFNKSkKKwkJCXsKKwkJCWlmICghQ01TX2ZpbmFsKGNtcywgaW4sIE5VTEwsIGZsYWdzKSkKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCWVsc2UgaWYgKG9wZXJhdGlvbiA9PSBTTUlNRV9FTkNSWVBURURfRU5DUllQVCkKKwkJeworCQljbXMgPSBDTVNfRW5jcnlwdGVkRGF0YV9lbmNyeXB0KGluLCBjaXBoZXIsCisJCQkJCQlzZWNyZXRfa2V5LCBzZWNyZXRfa2V5bGVuLAorCQkJCQkJZmxhZ3MpOworCisJCX0KKwllbHNlIGlmIChvcGVyYXRpb24gPT0gU01JTUVfU0lHTl9SRUNFSVBUKQorCQl7CisJCUNNU19Db250ZW50SW5mbyAqc3JjbXMgPSBOVUxMOworCQlTVEFDS19PRihDTVNfU2lnbmVySW5mbykgKnNpczsKKwkJQ01TX1NpZ25lckluZm8gKnNpOworCQlzaXMgPSBDTVNfZ2V0MF9TaWduZXJJbmZvcyhjbXMpOworCQlpZiAoIXNpcykKKwkJCWdvdG8gZW5kOworCQlzaSA9IHNrX0NNU19TaWduZXJJbmZvX3ZhbHVlKHNpcywgMCk7CisJCXNyY21zID0gQ01TX3NpZ25fcmVjZWlwdChzaSwgc2lnbmVyLCBrZXksIG90aGVyLCBmbGFncyk7CisJCWlmICghc3JjbXMpCisJCQlnb3RvIGVuZDsKKwkJQ01TX0NvbnRlbnRJbmZvX2ZyZWUoY21zKTsKKwkJY21zID0gc3JjbXM7CisJCX0KKwllbHNlIGlmIChvcGVyYXRpb24gJiBTTUlNRV9TSUdORVJTKQorCQl7CisJCWludCBpOworCQkvKiBJZiBkZXRhY2hlZCBkYXRhIGNvbnRlbnQgd2UgZW5hYmxlIHN0cmVhbWluZyBpZgorCQkgKiBTL01JTUUgb3V0cHV0IGZvcm1hdC4KKwkJICovCisJCWlmIChvcGVyYXRpb24gPT0gU01JTUVfU0lHTikKKwkJCXsKKwkJCQkKKwkJCWlmIChmbGFncyAmIENNU19ERVRBQ0hFRCkKKwkJCQl7CisJCQkJaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfU01JTUUpCisJCQkJCWZsYWdzIHw9IENNU19TVFJFQU07CisJCQkJfQorCQkJZmxhZ3MgfD0gQ01TX1BBUlRJQUw7CisJCQljbXMgPSBDTVNfc2lnbihOVUxMLCBOVUxMLCBvdGhlciwgaW4sIGZsYWdzKTsKKwkJCWlmICghY21zKQorCQkJCWdvdG8gZW5kOworCQkJaWYgKGVjb250ZW50X3R5cGUpCisJCQkJQ01TX3NldDFfZUNvbnRlbnRUeXBlKGNtcywgZWNvbnRlbnRfdHlwZSk7CisKKwkJCWlmIChycl90bykKKwkJCQl7CisJCQkJcnIgPSBtYWtlX3JlY2VpcHRfcmVxdWVzdChycl90bywgcnJfYWxsb3JmaXJzdCwKKwkJCQkJCQkJcnJfZnJvbSk7CisJCQkJaWYgKCFycikKKwkJCQkJeworCQkJCQlCSU9fcHV0cyhiaW9fZXJyLAorCQkJCSJTaWduZWQgUmVjZWlwdCBSZXF1ZXN0IENyZWF0aW9uIEVycm9yXG4iKTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCWZsYWdzIHw9IENNU19SRVVTRV9ESUdFU1Q7CisJCWZvciAoaSA9IDA7IGkgPCBza19PUEVOU1NMX1NUUklOR19udW0oc2tzaWduZXJzKTsgaSsrKQorCQkJeworCQkJQ01TX1NpZ25lckluZm8gKnNpOworCQkJc2lnbmVyZmlsZSA9IHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKHNrc2lnbmVycywgaSk7CisJCQlrZXlmaWxlID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoc2trZXlzLCBpKTsKKwkJCXNpZ25lciA9IGxvYWRfY2VydChiaW9fZXJyLCBzaWduZXJmaWxlLEZPUk1BVF9QRU0sIE5VTEwsCisJCQkJCWUsICJzaWduZXIgY2VydGlmaWNhdGUiKTsKKwkJCWlmICghc2lnbmVyKQorCQkJCWdvdG8gZW5kOworCQkJa2V5ID0gbG9hZF9rZXkoYmlvX2Vyciwga2V5ZmlsZSwga2V5Zm9ybSwgMCwgcGFzc2luLCBlLAorCQkJICAgICAgICJzaWduaW5nIGtleSBmaWxlIik7CisJCQlpZiAoIWtleSkKKwkJCQlnb3RvIGVuZDsKKwkJCXNpID0gQ01TX2FkZDFfc2lnbmVyKGNtcywgc2lnbmVyLCBrZXksIHNpZ25fbWQsIGZsYWdzKTsKKwkJCWlmICghc2kpCisJCQkJZ290byBlbmQ7CisJCQlpZiAocnIgJiYgIUNNU19hZGQxX1JlY2VpcHRSZXF1ZXN0KHNpLCBycikpCisJCQkJZ290byBlbmQ7CisJCQlYNTA5X2ZyZWUoc2lnbmVyKTsKKwkJCXNpZ25lciA9IE5VTEw7CisJCQlFVlBfUEtFWV9mcmVlKGtleSk7CisJCQlrZXkgPSBOVUxMOworCQkJfQorCQkvKiBJZiBub3Qgc3RyZWFtaW5nIG9yIHJlc2lnbmluZyBmaW5hbGl6ZSBzdHJ1Y3R1cmUgKi8KKwkJaWYgKChvcGVyYXRpb24gPT0gU01JTUVfU0lHTikgJiYgIShmbGFncyAmIENNU19TVFJFQU0pKQorCQkJeworCQkJaWYgKCFDTVNfZmluYWwoY21zLCBpbiwgTlVMTCwgZmxhZ3MpKQorCQkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAoIWNtcykKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBjcmVhdGluZyBDTVMgc3RydWN0dXJlXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCXJldCA9IDQ7CisJaWYgKG9wZXJhdGlvbiA9PSBTTUlNRV9ERUNSWVBUKQorCQl7CisKKwkJaWYgKHNlY3JldF9rZXkpCisJCQl7CisJCQlpZiAoIUNNU19kZWNyeXB0X3NldDFfa2V5KGNtcywKKwkJCQkJCXNlY3JldF9rZXksIHNlY3JldF9rZXlsZW4sCisJCQkJCQlzZWNyZXRfa2V5aWQsIHNlY3JldF9rZXlpZGxlbikpCisJCQkJeworCQkJCUJJT19wdXRzKGJpb19lcnIsCisJCQkJCSJFcnJvciBkZWNyeXB0aW5nIENNUyB1c2luZyBzZWNyZXQga2V5XG4iKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisKKwkJaWYgKGtleSkKKwkJCXsKKwkJCWlmICghQ01TX2RlY3J5cHRfc2V0MV9wa2V5KGNtcywga2V5LCByZWNpcCkpCisJCQkJeworCQkJCUJJT19wdXRzKGJpb19lcnIsCisJCQkJCSJFcnJvciBkZWNyeXB0aW5nIENNUyB1c2luZyBwcml2YXRlIGtleVxuIik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCisJCWlmICghQ01TX2RlY3J5cHQoY21zLCBOVUxMLCBOVUxMLCBpbmRhdGEsIG91dCwgZmxhZ3MpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgZGVjcnlwdGluZyBDTVMgc3RydWN0dXJlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJZWxzZSBpZiAob3BlcmF0aW9uID09IFNNSU1FX0RBVEFPVVQpCisJCXsKKwkJaWYgKCFDTVNfZGF0YShjbXMsIG91dCwgZmxhZ3MpKQorCQkJZ290byBlbmQ7CisJCX0KKwllbHNlIGlmIChvcGVyYXRpb24gPT0gU01JTUVfVU5DT01QUkVTUykKKwkJeworCQlpZiAoIUNNU191bmNvbXByZXNzKGNtcywgaW5kYXRhLCBvdXQsIGZsYWdzKSkKKwkJCWdvdG8gZW5kOworCQl9CisJZWxzZSBpZiAob3BlcmF0aW9uID09IFNNSU1FX0RJR0VTVF9WRVJJRlkpCisJCXsKKwkJaWYgKENNU19kaWdlc3RfdmVyaWZ5KGNtcywgaW5kYXRhLCBvdXQsIGZsYWdzKSA+IDApCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJWZXJpZmljYXRpb24gc3VjY2Vzc2Z1bFxuIik7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIlZlcmlmaWNhdGlvbiBmYWlsdXJlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJZWxzZSBpZiAob3BlcmF0aW9uID09IFNNSU1FX0VOQ1JZUFRFRF9ERUNSWVBUKQorCQl7CisJCWlmICghQ01TX0VuY3J5cHRlZERhdGFfZGVjcnlwdChjbXMsIHNlY3JldF9rZXksIHNlY3JldF9rZXlsZW4sCisJCQkJCQlpbmRhdGEsIG91dCwgZmxhZ3MpKQorCQkJZ290byBlbmQ7CisJCX0KKwllbHNlIGlmIChvcGVyYXRpb24gPT0gU01JTUVfVkVSSUZZKQorCQl7CisJCWlmIChDTVNfdmVyaWZ5KGNtcywgb3RoZXIsIHN0b3JlLCBpbmRhdGEsIG91dCwgZmxhZ3MpID4gMCkKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIlZlcmlmaWNhdGlvbiBzdWNjZXNzZnVsXG4iKTsKKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiVmVyaWZpY2F0aW9uIGZhaWx1cmVcbiIpOworCQkJaWYgKHZlcmlmeV9yZXRjb2RlKQorCQkJCXJldCA9IHZlcmlmeV9lcnIgKyAzMjsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoc2lnbmVyZmlsZSkKKwkJCXsKKwkJCVNUQUNLX09GKFg1MDkpICpzaWduZXJzOworCQkJc2lnbmVycyA9IENNU19nZXQwX3NpZ25lcnMoY21zKTsKKwkJCWlmICghc2F2ZV9jZXJ0cyhzaWduZXJmaWxlLCBzaWduZXJzKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkJIkVycm9yIHdyaXRpbmcgc2lnbmVycyB0byAlc1xuIiwKKwkJCQkJCQkJc2lnbmVyZmlsZSk7CisJCQkJcmV0ID0gNTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlza19YNTA5X2ZyZWUoc2lnbmVycyk7CisJCQl9CisJCWlmIChycl9wcmludCkKKwkJCXJlY2VpcHRfcmVxdWVzdF9wcmludChiaW9fZXJyLCBjbXMpOworCQkJCQkKKwkJfQorCWVsc2UgaWYgKG9wZXJhdGlvbiA9PSBTTUlNRV9WRVJJRllfUkVDRUlQVCkKKwkJeworCQlpZiAoQ01TX3ZlcmlmeV9yZWNlaXB0KHJjbXMsIGNtcywgb3RoZXIsIHN0b3JlLCBmbGFncykgPiAwKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWxcbiIpOworCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJWZXJpZmljYXRpb24gZmFpbHVyZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpZiAobm9vdXQpCisJCQl7CisJCQlpZiAocHJpbnQpCisJCQkJQ01TX0NvbnRlbnRJbmZvX3ByaW50X2N0eChvdXQsIGNtcywgMCwgTlVMTCk7CisJCQl9CisJCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfU01JTUUpCisJCQl7CisJCQlpZiAodG8pCisJCQkJQklPX3ByaW50ZihvdXQsICJUbzogJXNcbiIsIHRvKTsKKwkJCWlmIChmcm9tKQorCQkJCUJJT19wcmludGYob3V0LCAiRnJvbTogJXNcbiIsIGZyb20pOworCQkJaWYgKHN1YmplY3QpCisJCQkJQklPX3ByaW50ZihvdXQsICJTdWJqZWN0OiAlc1xuIiwgc3ViamVjdCk7CisJCQlpZiAob3BlcmF0aW9uID09IFNNSU1FX1JFU0lHTikKKwkJCQlyZXQgPSBTTUlNRV93cml0ZV9DTVMob3V0LCBjbXMsIGluZGF0YSwgZmxhZ3MpOworCQkJZWxzZQorCQkJCXJldCA9IFNNSU1FX3dyaXRlX0NNUyhvdXQsIGNtcywgaW4sIGZsYWdzKTsKKwkJCX0KKwkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pIAorCQkJcmV0ID0gUEVNX3dyaXRlX2Jpb19DTVNfc3RyZWFtKG91dCwgY21zLCBpbiwgZmxhZ3MpOworCQllbHNlIGlmIChvdXRmb3JtYXQgPT0gRk9STUFUX0FTTjEpIAorCQkJcmV0ID0gaTJkX0NNU19iaW9fc3RyZWFtKG91dCxjbXMsIGluLCBmbGFncyk7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkJhZCBvdXRwdXQgZm9ybWF0IGZvciBDTVMgZmlsZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKHJldCA8PSAwKQorCQkJeworCQkJcmV0ID0gNjsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJcmV0ID0gMDsKK2VuZDoKKwlpZiAocmV0KQorCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCWlmIChuZWVkX3JhbmQpCisJCWFwcF9SQU5EX3dyaXRlX2ZpbGUoTlVMTCwgYmlvX2Vycik7CisJc2tfWDUwOV9wb3BfZnJlZShlbmNlcnRzLCBYNTA5X2ZyZWUpOworCXNrX1g1MDlfcG9wX2ZyZWUob3RoZXIsIFg1MDlfZnJlZSk7CisJaWYgKHZwbSkKKwkJWDUwOV9WRVJJRllfUEFSQU1fZnJlZSh2cG0pOworCWlmIChza3NpZ25lcnMpCisJCXNrX09QRU5TU0xfU1RSSU5HX2ZyZWUoc2tzaWduZXJzKTsKKwlpZiAoc2trZXlzKQorCQlza19PUEVOU1NMX1NUUklOR19mcmVlKHNra2V5cyk7CisJaWYgKHNlY3JldF9rZXkpCisJCU9QRU5TU0xfZnJlZShzZWNyZXRfa2V5KTsKKwlpZiAoc2VjcmV0X2tleWlkKQorCQlPUEVOU1NMX2ZyZWUoc2VjcmV0X2tleWlkKTsKKwlpZiAoZWNvbnRlbnRfdHlwZSkKKwkJQVNOMV9PQkpFQ1RfZnJlZShlY29udGVudF90eXBlKTsKKwlpZiAocnIpCisJCUNNU19SZWNlaXB0UmVxdWVzdF9mcmVlKHJyKTsKKwlpZiAocnJfdG8pCisJCXNrX09QRU5TU0xfU1RSSU5HX2ZyZWUocnJfdG8pOworCWlmIChycl9mcm9tKQorCQlza19PUEVOU1NMX1NUUklOR19mcmVlKHJyX2Zyb20pOworCVg1MDlfU1RPUkVfZnJlZShzdG9yZSk7CisJWDUwOV9mcmVlKGNlcnQpOworCVg1MDlfZnJlZShyZWNpcCk7CisJWDUwOV9mcmVlKHNpZ25lcik7CisJRVZQX1BLRVlfZnJlZShrZXkpOworCUNNU19Db250ZW50SW5mb19mcmVlKGNtcyk7CisJQ01TX0NvbnRlbnRJbmZvX2ZyZWUocmNtcyk7CisJQklPX2ZyZWUocmN0aW4pOworCUJJT19mcmVlKGluKTsKKwlCSU9fZnJlZShpbmRhdGEpOworCUJJT19mcmVlX2FsbChvdXQpOworCWlmIChwYXNzaW4pIE9QRU5TU0xfZnJlZShwYXNzaW4pOworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGludCBzYXZlX2NlcnRzKGNoYXIgKnNpZ25lcmZpbGUsIFNUQUNLX09GKFg1MDkpICpzaWduZXJzKQorCXsKKwlpbnQgaTsKKwlCSU8gKnRtcDsKKwlpZiAoIXNpZ25lcmZpbGUpCisJCXJldHVybiAxOworCXRtcCA9IEJJT19uZXdfZmlsZShzaWduZXJmaWxlLCAidyIpOworCWlmICghdG1wKSByZXR1cm4gMDsKKwlmb3IoaSA9IDA7IGkgPCBza19YNTA5X251bShzaWduZXJzKTsgaSsrKQorCQlQRU1fd3JpdGVfYmlvX1g1MDkodG1wLCBza19YNTA5X3ZhbHVlKHNpZ25lcnMsIGkpKTsKKwlCSU9fZnJlZSh0bXApOworCXJldHVybiAxOworCX0KKwkKKworLyogTWluaW1hbCBjYWxsYmFjayBqdXN0IHRvIG91dHB1dCBwb2xpY3kgaW5mbyAoaWYgYW55KSAqLworCitzdGF0aWMgaW50IGNtc19jYihpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCWludCBlcnJvcjsKKworCWVycm9yID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKGN0eCk7CisKKwl2ZXJpZnlfZXJyID0gZXJyb3I7CisKKwlpZiAoKGVycm9yICE9IFg1MDlfVl9FUlJfTk9fRVhQTElDSVRfUE9MSUNZKQorCQkmJiAoKGVycm9yICE9IFg1MDlfVl9PSykgfHwgKG9rICE9IDIpKSkKKwkJcmV0dXJuIG9rOworCisJcG9saWNpZXNfcHJpbnQoTlVMTCwgY3R4KTsKKworCXJldHVybiBvazsKKworCX0KKworc3RhdGljIHZvaWQgZ25hbWVzX3N0YWNrX3ByaW50KEJJTyAqb3V0LCBTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqZ25zKQorCXsKKwlTVEFDS19PRihHRU5FUkFMX05BTUUpICpnZW5zOworCUdFTkVSQUxfTkFNRSAqZ2VuOworCWludCBpLCBqOworCWZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVTX251bShnbnMpOyBpKyspCisJCXsKKwkJZ2VucyA9IHNrX0dFTkVSQUxfTkFNRVNfdmFsdWUoZ25zLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZ2Vucyk7IGorKykKKwkJCXsKKwkJCWdlbiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShnZW5zLCBqKTsKKwkJCUJJT19wdXRzKG91dCwgIiAgICAiKTsKKwkJCUdFTkVSQUxfTkFNRV9wcmludChvdXQsIGdlbik7CisJCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCQkJfQorCQl9CisJcmV0dXJuOworCX0KKworc3RhdGljIHZvaWQgcmVjZWlwdF9yZXF1ZXN0X3ByaW50KEJJTyAqb3V0LCBDTVNfQ29udGVudEluZm8gKmNtcykKKwl7CisJU1RBQ0tfT0YoQ01TX1NpZ25lckluZm8pICpzaXM7CisJQ01TX1NpZ25lckluZm8gKnNpOworCUNNU19SZWNlaXB0UmVxdWVzdCAqcnI7CisJaW50IGFsbG9yZmlyc3Q7CisJU1RBQ0tfT0YoR0VORVJBTF9OQU1FUykgKnJ0bywgKnJsaXN0OworCUFTTjFfU1RSSU5HICpzY2lkOworCWludCBpLCBydjsKKwlzaXMgPSBDTVNfZ2V0MF9TaWduZXJJbmZvcyhjbXMpOworCWZvciAoaSA9IDA7IGkgPCBza19DTVNfU2lnbmVySW5mb19udW0oc2lzKTsgaSsrKQorCQl7CisJCXNpID0gc2tfQ01TX1NpZ25lckluZm9fdmFsdWUoc2lzLCBpKTsKKwkJcnYgPSBDTVNfZ2V0MV9SZWNlaXB0UmVxdWVzdChzaSwgJnJyKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiU2lnbmVyICVkOlxuIiwgaSArIDEpOworCQlpZiAocnYgPT0gMCkKKwkJCUJJT19wdXRzKGJpb19lcnIsICIgIE5vIFJlY2VpcHQgUmVxdWVzdFxuIik7CisJCWVsc2UgaWYgKHJ2IDwgMCkKKwkJCXsKKwkJCUJJT19wdXRzKGJpb19lcnIsICIgIFJlY2VpcHQgUmVxdWVzdCBQYXJzZSBFcnJvclxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJfQorCQllbHNlCisJCQl7CisJCQljaGFyICppZDsKKwkJCWludCBpZGxlbjsKKwkJCUNNU19SZWNlaXB0UmVxdWVzdF9nZXQwX3ZhbHVlcyhyciwgJnNjaWQsICZhbGxvcmZpcnN0LAorCQkJCQkJCSZybGlzdCwgJnJ0byk7CisJCQlCSU9fcHV0cyhvdXQsICIgIFNpZ25lZCBDb250ZW50IElEOlxuIik7CisJCQlpZGxlbiA9IEFTTjFfU1RSSU5HX2xlbmd0aChzY2lkKTsKKwkJCWlkID0gKGNoYXIgKilBU04xX1NUUklOR19kYXRhKHNjaWQpOworCQkJQklPX2R1bXBfaW5kZW50KG91dCwgaWQsIGlkbGVuLCA0KTsKKwkJCUJJT19wdXRzKG91dCwgIiAgUmVjZWlwdHMgRnJvbSIpOworCQkJaWYgKHJsaXN0KQorCQkJCXsKKwkJCQlCSU9fcHV0cyhvdXQsICIgTGlzdDpcbiIpOworCQkJCWduYW1lc19zdGFja19wcmludChvdXQsIHJsaXN0KTsKKwkJCQl9CisJCQllbHNlIGlmIChhbGxvcmZpcnN0ID09IDEpCisJCQkJQklPX3B1dHMob3V0LCAiOiBGaXJzdCBUaWVyXG4iKTsKKwkJCWVsc2UgaWYgKGFsbG9yZmlyc3QgPT0gMCkKKwkJCQlCSU9fcHV0cyhvdXQsICI6IEFsbFxuIik7CisJCQllbHNlCisJCQkJQklPX3ByaW50ZihvdXQsICIgVW5rbm93biAoJWQpXG4iLCBhbGxvcmZpcnN0KTsKKwkJCUJJT19wdXRzKG91dCwgIiAgUmVjZWlwdHMgVG86XG4iKTsKKwkJCWduYW1lc19zdGFja19wcmludChvdXQsIHJ0byk7CisJCQl9CisJCWlmIChycikKKwkJCUNNU19SZWNlaXB0UmVxdWVzdF9mcmVlKHJyKTsKKwkJfQorCX0KKworc3RhdGljIFNUQUNLX09GKEdFTkVSQUxfTkFNRVMpICptYWtlX25hbWVzX3N0YWNrKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqbnMpCisJeworCWludCBpOworCVNUQUNLX09GKEdFTkVSQUxfTkFNRVMpICpyZXQ7CisJR0VORVJBTF9OQU1FUyAqZ2VucyA9IE5VTEw7CisJR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworCXJldCA9IHNrX0dFTkVSQUxfTkFNRVNfbmV3X251bGwoKTsKKwlpZiAoIXJldCkKKwkJZ290byBlcnI7CisJZm9yIChpID0gMDsgaSA8IHNrX09QRU5TU0xfU1RSSU5HX251bShucyk7IGkrKykKKwkJeworCQljaGFyICpzdHIgPSBza19PUEVOU1NMX1NUUklOR192YWx1ZShucywgaSk7CisJCWdlbiA9IGEyaV9HRU5FUkFMX05BTUUoTlVMTCwgTlVMTCwgTlVMTCwgR0VOX0VNQUlMLCBzdHIsIDApOworCQlpZiAoIWdlbikKKwkJCWdvdG8gZXJyOworCQlnZW5zID0gR0VORVJBTF9OQU1FU19uZXcoKTsKKwkJaWYgKCFnZW5zKQorCQkJZ290byBlcnI7CisJCWlmICghc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKSkKKwkJCWdvdG8gZXJyOworCQlnZW4gPSBOVUxMOworCQlpZiAoIXNrX0dFTkVSQUxfTkFNRVNfcHVzaChyZXQsIGdlbnMpKQorCQkJZ290byBlcnI7CisJCWdlbnMgPSBOVUxMOworCQl9CisKKwlyZXR1cm4gcmV0OworCisJZXJyOgorCWlmIChyZXQpCisJCXNrX0dFTkVSQUxfTkFNRVNfcG9wX2ZyZWUocmV0LCBHRU5FUkFMX05BTUVTX2ZyZWUpOworCWlmIChnZW5zKQorCQlHRU5FUkFMX05BTUVTX2ZyZWUoZ2Vucyk7CisJaWYgKGdlbikKKwkJR0VORVJBTF9OQU1FX2ZyZWUoZ2VuKTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKKworc3RhdGljIENNU19SZWNlaXB0UmVxdWVzdCAqbWFrZV9yZWNlaXB0X3JlcXVlc3QoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpycl90bywKKwkJCQkJCWludCBycl9hbGxvcmZpcnN0LAorCQkJCQkJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpycl9mcm9tKQorCXsKKwlTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqcmN0X3RvLCAqcmN0X2Zyb207CisJQ01TX1JlY2VpcHRSZXF1ZXN0ICpycjsKKwlyY3RfdG8gPSBtYWtlX25hbWVzX3N0YWNrKHJyX3RvKTsKKwlpZiAoIXJjdF90bykKKwkJZ290byBlcnI7CisJaWYgKHJyX2Zyb20pCisJCXsKKwkJcmN0X2Zyb20gPSBtYWtlX25hbWVzX3N0YWNrKHJyX2Zyb20pOworCQlpZiAoIXJjdF9mcm9tKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCXJjdF9mcm9tID0gTlVMTDsKKwlyciA9IENNU19SZWNlaXB0UmVxdWVzdF9jcmVhdGUwKE5VTEwsIC0xLCBycl9hbGxvcmZpcnN0LCByY3RfZnJvbSwKKwkJCQkJCXJjdF90byk7CisJcmV0dXJuIHJyOworCWVycjoKKwlyZXR1cm4gTlVMTDsKKwl9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9jcmwuYyBiL2xpYi9vcGVuc3NsL2FwcHMvY3JsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5NWIyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvY3JsLmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qIGFwcHMvY3JsLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cJY3JsX21haW4KKworI3VuZGVmIFBPU1RGSVgKKyNkZWZpbmUJUE9TVEZJWAkiLnJ2ayIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNybF91c2FnZVtdPXsKKyJ1c2FnZTogY3JsIGFyZ3NcbiIsCisiXG4iLAorIiAtaW5mb3JtIGFyZyAgICAgLSBpbnB1dCBmb3JtYXQgLSBkZWZhdWx0IFBFTSAoREVSIG9yIFBFTSlcbiIsCisiIC1vdXRmb3JtIGFyZyAgICAtIG91dHB1dCBmb3JtYXQgLSBkZWZhdWx0IFBFTVxuIiwKKyIgLXRleHQgICAgICAgICAgIC0gcHJpbnQgb3V0IGEgdGV4dCBmb3JtYXQgdmVyc2lvblxuIiwKKyIgLWluIGFyZyAgICAgICAgIC0gaW5wdXQgZmlsZSAtIGRlZmF1bHQgc3RkaW5cbiIsCisiIC1vdXQgYXJnICAgICAgICAtIG91dHB1dCBmaWxlIC0gZGVmYXVsdCBzdGRvdXRcbiIsCisiIC1oYXNoICAgICAgICAgICAtIHByaW50IGhhc2ggdmFsdWVcbiIsCisiIC1maW5nZXJwcmludCAgICAtIHByaW50IHRoZSBjcmwgZmluZ2VycHJpbnRcbiIsCisiIC1pc3N1ZXIgICAgICAgICAtIHByaW50IGlzc3VlciBETlxuIiwKKyIgLWxhc3R1cGRhdGUgICAgIC0gbGFzdFVwZGF0ZSBmaWVsZFxuIiwKKyIgLW5leHR1cGRhdGUgICAgIC0gbmV4dFVwZGF0ZSBmaWVsZFxuIiwKKyIgLWNybG51bWJlciAgICAgIC0gcHJpbnQgQ1JMIG51bWJlclxuIiwKKyIgLW5vb3V0ICAgICAgICAgIC0gbm8gQ1JMIG91dHB1dFxuIiwKKyIgLUNBZmlsZSAgbmFtZSAgIC0gdmVyaWZ5IENSTCB1c2luZyBjZXJ0aWZpY2F0ZXMgaW4gZmlsZSBcIm5hbWVcIlxuIiwKKyIgLUNBcGF0aCAgZGlyICAgIC0gdmVyaWZ5IENSTCB1c2luZyBjZXJ0aWZpY2F0ZXMgaW4gXCJkaXJcIlxuIiwKKyIgLW5hbWVvcHQgYXJnICAgIC0gdmFyaW91cyBjZXJ0aWZpY2F0ZSBuYW1lIG9wdGlvbnNcbiIsCitOVUxMCit9OworCitzdGF0aWMgWDUwOV9DUkwgKmxvYWRfY3JsKGNoYXIgKmZpbGUsIGludCBmb3JtYXQpOworc3RhdGljIEJJTyAqYmlvX291dD1OVUxMOworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCXVuc2lnbmVkIGxvbmcgbm1mbGFnID0gMDsKKwlYNTA5X0NSTCAqeD1OVUxMOworCWNoYXIgKkNBZmlsZSA9IE5VTEwsICpDQXBhdGggPSBOVUxMOworCWludCByZXQ9MSxpLG51bSxiYWRvcHM9MDsKKwlCSU8gKm91dD1OVUxMOworCWludCBpbmZvcm1hdCxvdXRmb3JtYXQ7CisJY2hhciAqaW5maWxlPU5VTEwsKm91dGZpbGU9TlVMTDsKKwlpbnQgaGFzaD0wLGlzc3Vlcj0wLGxhc3R1cGRhdGU9MCxuZXh0dXBkYXRlPTAsbm9vdXQ9MCx0ZXh0PTA7CisJaW50IGZpbmdlcnByaW50ID0gMCwgY3JsbnVtYmVyID0gMDsKKwljb25zdCBjaGFyICoqcHA7CisJWDUwOV9TVE9SRSAqc3RvcmUgPSBOVUxMOworCVg1MDlfU1RPUkVfQ1RYIGN0eDsKKwlYNTA5X0xPT0tVUCAqbG9va3VwID0gTlVMTDsKKwlYNTA5X09CSkVDVCB4b2JqOworCUVWUF9QS0VZICpwa2V5OworCWludCBkb192ZXIgPSAwOworCWNvbnN0IEVWUF9NRCAqbWRfYWxnLCpkaWdlc3Q9RVZQX3NoYTEoKTsKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJaWYgKChiaW9fZXJyPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoYmlvX2VycixzdGRlcnIsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisKKwlpZiAoYmlvX291dCA9PSBOVUxMKQorCQlpZiAoKGJpb19vdXQ9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJeworCQkJQklPX3NldF9mcChiaW9fb3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCQl7CisJCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJCWJpb19vdXQgPSBCSU9fcHVzaCh0bXBiaW8sIGJpb19vdXQpOworCQkJfQorI2VuZGlmCisJCQl9CisKKwlpbmZvcm1hdD1GT1JNQVRfUEVNOworCW91dGZvcm1hdD1GT1JNQVRfUEVNOworCisJYXJnYy0tOworCWFyZ3YrKzsKKwludW09MDsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisjaWZkZWYgdW5kZWYKKwkJaWYJKHN0cmNtcCgqYXJndiwiLXAiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaWYgKCFhcmdzX2Zyb21fZmlsZSgrK2FyZ3YsTmFyZ2MsTmFyZ3YpKSB7IGdvdG8gZW5kOyB9Ki8KKwkJCX0KKyNlbmRpZgorCQlpZiAJKHN0cmNtcCgqYXJndiwiLWluZm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dGZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0Zm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5maWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUNBcGF0aCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlDQXBhdGggPSAqKCsrYXJndik7CisJCQlkb192ZXIgPSAxOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1DQWZpbGUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJQ0FmaWxlID0gKigrK2FyZ3YpOworCQkJZG9fdmVyID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdmVyaWZ5IikgPT0gMCkKKwkJCWRvX3ZlciA9IDE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXRleHQiKSA9PSAwKQorCQkJdGV4dCA9IDE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWhhc2giKSA9PSAwKQorCQkJaGFzaD0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5hbWVvcHQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaWYgKCFzZXRfbmFtZV9leCgmbm1mbGFnLCAqKCsrYXJndikpKSBnb3RvIGJhZDsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaXNzdWVyIikgPT0gMCkKKwkJCWlzc3Vlcj0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWxhc3R1cGRhdGUiKSA9PSAwKQorCQkJbGFzdHVwZGF0ZT0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5leHR1cGRhdGUiKSA9PSAwKQorCQkJbmV4dHVwZGF0ZT0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vb3V0IikgPT0gMCkKKwkJCW5vb3V0PSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZmluZ2VycHJpbnQiKSA9PSAwKQorCQkJZmluZ2VycHJpbnQ9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jcmxudW1iZXIiKSA9PSAwKQorCQkJY3JsbnVtYmVyPSArK251bTsKKwkJZWxzZSBpZiAoKG1kX2FsZz1FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgqYXJndiArIDEpKSkKKwkJCXsKKwkJCS8qIG9rICovCisJCQlkaWdlc3Q9bWRfYWxnOworCQkJfQorCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVua25vd24gb3B0aW9uICVzXG4iLCphcmd2KTsKKwkJCWJhZG9wcz0xOworCQkJYnJlYWs7CisJCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQl9CisKKwlpZiAoYmFkb3BzKQorCQl7CitiYWQ6CisJCWZvciAocHA9Y3JsX3VzYWdlOyAoKnBwICE9IE5VTEwpOyBwcCsrKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlcyIsKnBwKTsKKwkJZ290byBlbmQ7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisJeD1sb2FkX2NybChpbmZpbGUsaW5mb3JtYXQpOworCWlmICh4ID09IE5VTEwpIHsgZ290byBlbmQ7IH0KKworCWlmKGRvX3ZlcikgeworCQlzdG9yZSA9IFg1MDlfU1RPUkVfbmV3KCk7CisJCWxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoc3RvcmUsWDUwOV9MT09LVVBfZmlsZSgpKTsKKwkJaWYgKGxvb2t1cCA9PSBOVUxMKSBnb3RvIGVuZDsKKwkJaWYgKCFYNTA5X0xPT0tVUF9sb2FkX2ZpbGUobG9va3VwLENBZmlsZSxYNTA5X0ZJTEVUWVBFX1BFTSkpCisJCQlYNTA5X0xPT0tVUF9sb2FkX2ZpbGUobG9va3VwLE5VTEwsWDUwOV9GSUxFVFlQRV9ERUZBVUxUKTsKKwkJCQorCQlsb29rdXA9WDUwOV9TVE9SRV9hZGRfbG9va3VwKHN0b3JlLFg1MDlfTE9PS1VQX2hhc2hfZGlyKCkpOworCQlpZiAobG9va3VwID09IE5VTEwpIGdvdG8gZW5kOworCQlpZiAoIVg1MDlfTE9PS1VQX2FkZF9kaXIobG9va3VwLENBcGF0aCxYNTA5X0ZJTEVUWVBFX1BFTSkpCisJCQlYNTA5X0xPT0tVUF9hZGRfZGlyKGxvb2t1cCxOVUxMLFg1MDlfRklMRVRZUEVfREVGQVVMVCk7CisJCUVSUl9jbGVhcl9lcnJvcigpOworCisJCWlmKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZjdHgsIHN0b3JlLCBOVUxMLCBOVUxMKSkgeworCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSJFcnJvciBpbml0aWFsaXNpbmcgWDUwOSBzdG9yZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCisJCWkgPSBYNTA5X1NUT1JFX2dldF9ieV9zdWJqZWN0KCZjdHgsIFg1MDlfTFVfWDUwOSwgCisJCQkJCVg1MDlfQ1JMX2dldF9pc3N1ZXIoeCksICZ4b2JqKTsKKwkJaWYoaSA8PSAwKSB7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJIkVycm9yIGdldHRpbmcgQ1JMIGlzc3VlciBjZXJ0aWZpY2F0ZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCQlwa2V5ID0gWDUwOV9nZXRfcHVia2V5KHhvYmouZGF0YS54NTA5KTsKKwkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmeG9iaik7CisJCWlmKCFwa2V5KSB7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJIkVycm9yIGdldHRpbmcgQ1JMIGlzc3VlciBwdWJsaWMga2V5XG4iKTsKKwkJCWdvdG8gZW5kOworCQl9CisJCWkgPSBYNTA5X0NSTF92ZXJpZnkoeCwgcGtleSk7CisJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCWlmKGkgPCAwKSBnb3RvIGVuZDsKKwkJaWYoaSA9PSAwKSBCSU9fcHJpbnRmKGJpb19lcnIsICJ2ZXJpZnkgZmFpbHVyZVxuIik7CisJCWVsc2UgQklPX3ByaW50ZihiaW9fZXJyLCAidmVyaWZ5IE9LXG4iKTsKKwl9CisKKwlpZiAobnVtKQorCQl7CisJCWZvciAoaT0xOyBpPD1udW07IGkrKykKKwkJCXsKKwkJCWlmIChpc3N1ZXIgPT0gaSkKKwkJCQl7CisJCQkJcHJpbnRfbmFtZShiaW9fb3V0LCAiaXNzdWVyPSIsIFg1MDlfQ1JMX2dldF9pc3N1ZXIoeCksIG5tZmxhZyk7CisJCQkJfQorCQkJaWYgKGNybG51bWJlciA9PSBpKQorCQkJCXsKKwkJCQlBU04xX0lOVEVHRVIgKmNybG51bTsKKwkJCQljcmxudW0gPSBYNTA5X0NSTF9nZXRfZXh0X2QyaSh4LCBOSURfY3JsX251bWJlciwKKwkJCQkJCQkgICAgICBOVUxMLCBOVUxMKTsKKwkJCQlCSU9fcHJpbnRmKGJpb19vdXQsImNybE51bWJlcj0iKTsKKwkJCQlpZiAoY3JsbnVtKQorCQkJCQl7CisJCQkJCWkyYV9BU04xX0lOVEVHRVIoYmlvX291dCwgY3JsbnVtKTsKKwkJCQkJQVNOMV9JTlRFR0VSX2ZyZWUoY3JsbnVtKTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJQklPX3B1dHMoYmlvX291dCwgIjxOT05FPiIpOworCQkJCUJJT19wcmludGYoYmlvX291dCwiXG4iKTsKKwkJCQl9CisJCQlpZiAoaGFzaCA9PSBpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19vdXQsIiUwOGx4XG4iLAorCQkJCQlYNTA5X05BTUVfaGFzaChYNTA5X0NSTF9nZXRfaXNzdWVyKHgpKSk7CisJCQkJfQorCQkJaWYgKGxhc3R1cGRhdGUgPT0gaSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fb3V0LCJsYXN0VXBkYXRlPSIpOworCQkJCUFTTjFfVElNRV9wcmludChiaW9fb3V0LAorCQkJCQkJWDUwOV9DUkxfZ2V0X2xhc3RVcGRhdGUoeCkpOworCQkJCUJJT19wcmludGYoYmlvX291dCwiXG4iKTsKKwkJCQl9CisJCQlpZiAobmV4dHVwZGF0ZSA9PSBpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19vdXQsIm5leHRVcGRhdGU9Iik7CisJCQkJaWYgKFg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKHgpKSAKKwkJCQkJQVNOMV9USU1FX3ByaW50KGJpb19vdXQsCisJCQkJCQlYNTA5X0NSTF9nZXRfbmV4dFVwZGF0ZSh4KSk7CisJCQkJZWxzZQorCQkJCQlCSU9fcHJpbnRmKGJpb19vdXQsIk5PTkUiKTsKKwkJCQlCSU9fcHJpbnRmKGJpb19vdXQsIlxuIik7CisJCQkJfQorCQkJaWYgKGZpbmdlcnByaW50ID09IGkpCisJCQkJeworCQkJCWludCBqOworCQkJCXVuc2lnbmVkIGludCBuOworCQkJCXVuc2lnbmVkIGNoYXIgbWRbRVZQX01BWF9NRF9TSVpFXTsKKworCQkJCWlmICghWDUwOV9DUkxfZGlnZXN0KHgsZGlnZXN0LG1kLCZuKSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm91dCBvZiBtZW1vcnlcbiIpOworCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCUJJT19wcmludGYoYmlvX291dCwiJXMgRmluZ2VycHJpbnQ9IiwKKwkJCQkJCU9CSl9uaWQyc24oRVZQX01EX3R5cGUoZGlnZXN0KSkpOworCQkJCWZvciAoaj0wOyBqPChpbnQpbjsgaisrKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX291dCwiJTAyWCVjIixtZFtqXSwKKwkJCQkJCShqKzEgPT0gKGludCluKQorCQkJCQkJPydcbic6JzonKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAob3V0ID09IE5VTEwpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChvdXRmaWxlID09IE5VTEwpCisJCXsKKwkJQklPX3NldF9mcChvdXQsc3Rkb3V0LEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJeworCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxvdXRmaWxlKSA8PSAwKQorCQkJeworCQkJcGVycm9yKG91dGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmICh0ZXh0KSBYNTA5X0NSTF9wcmludChvdXQsIHgpOworCisJaWYgKG5vb3V0KSAKKwkJeworCQlyZXQgPSAwOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgCShvdXRmb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCWk9KGludClpMmRfWDUwOV9DUkxfYmlvKG91dCx4KTsKKwllbHNlIGlmIChvdXRmb3JtYXQgPT0gRk9STUFUX1BFTSkKKwkJaT1QRU1fd3JpdGVfYmlvX1g1MDlfQ1JMKG91dCx4KTsKKwllbHNlCQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBvdXRmaWxlXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAoIWkpIHsgQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gd3JpdGUgQ1JMXG4iKTsgZ290byBlbmQ7IH0KKwlyZXQ9MDsKK2VuZDoKKwlCSU9fZnJlZV9hbGwob3V0KTsKKwlCSU9fZnJlZV9hbGwoYmlvX291dCk7CisJYmlvX291dD1OVUxMOworCVg1MDlfQ1JMX2ZyZWUoeCk7CisJaWYoc3RvcmUpIHsKKwkJWDUwOV9TVE9SRV9DVFhfY2xlYW51cCgmY3R4KTsKKwkJWDUwOV9TVE9SRV9mcmVlKHN0b3JlKTsKKwl9CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKworc3RhdGljIFg1MDlfQ1JMICpsb2FkX2NybChjaGFyICppbmZpbGUsIGludCBmb3JtYXQpCisJeworCVg1MDlfQ1JMICp4PU5VTEw7CisJQklPICppbj1OVUxMOworCisJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChpbiA9PSBOVUxMKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoaW5maWxlID09IE5VTEwpCisJCUJJT19zZXRfZnAoaW4sc3RkaW4sQklPX05PQ0xPU0UpOworCWVsc2UKKwkJeworCQlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4saW5maWxlKSA8PSAwKQorCQkJeworCQkJcGVycm9yKGluZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCWlmIAkoZm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQl4PWQyaV9YNTA5X0NSTF9iaW8oaW4sTlVMTCk7CisJZWxzZSBpZiAoZm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCXg9UEVNX3JlYWRfYmlvX1g1MDlfQ1JMKGluLE5VTEwsTlVMTCxOVUxMKTsKKwllbHNlCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJiYWQgaW5wdXQgZm9ybWF0IHNwZWNpZmllZCBmb3IgaW5wdXQgY3JsXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAoeCA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGxvYWQgQ1JMXG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKwkKK2VuZDoKKwlCSU9fZnJlZShpbik7CisJcmV0dXJuKHgpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9jcmwycDcuYyBiL2xpYi9vcGVuc3NsL2FwcHMvY3JsMnA3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjODM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvY3JsMnA3LmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qIGFwcHMvY3JsMnA3LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogVGhpcyB3YXMgd3JpdHRlbiBieSBHb3Jkb24gQ2hhZmZlZSA8Y2hhZmZlZUBwbGF0ZWF1LmNzLmJlcmtlbGV5LmVkdT4KKyAqIGFuZCBkb25hdGVkICd0byB0aGUgY2F1c2UnIGFsb25nIHdpdGggbG90cyBhbmQgbG90cyBvZiBvdGhlciBmaXhlcyB0bworICogdGhlIGxpYnJhcnkuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzNy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKK3N0YXRpYyBpbnQgYWRkX2NlcnRzX2Zyb21fZmlsZShTVEFDS19PRihYNTA5KSAqc3RhY2ssIGNoYXIgKmNlcnRmaWxlKTsKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cJY3JsMnBrY3M3X21haW4KKworLyogLWluZm9ybSBhcmcJLSBpbnB1dCBmb3JtYXQgLSBkZWZhdWx0IFBFTSAoREVSIG9yIFBFTSkKKyAqIC1vdXRmb3JtIGFyZyAtIG91dHB1dCBmb3JtYXQgLSBkZWZhdWx0IFBFTQorICogLWluIGFyZwktIGlucHV0IGZpbGUgLSBkZWZhdWx0IHN0ZGluCisgKiAtb3V0IGFyZwktIG91dHB1dCBmaWxlIC0gZGVmYXVsdCBzdGRvdXQKKyAqLworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCWludCBpLGJhZG9wcz0wOworCUJJTyAqaW49TlVMTCwqb3V0PU5VTEw7CisJaW50IGluZm9ybWF0LG91dGZvcm1hdDsKKwljaGFyICppbmZpbGUsKm91dGZpbGUsKnByb2csKmNlcnRmaWxlOworCVBLQ1M3ICpwNyA9IE5VTEw7CisJUEtDUzdfU0lHTkVEICpwN3MgPSBOVUxMOworCVg1MDlfQ1JMICpjcmw9TlVMTDsKKwlTVEFDS19PRihPUEVOU1NMX1NUUklORykgKmNlcnRmbHN0PU5VTEw7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICpjcmxfc3RhY2s9TlVMTDsKKwlTVEFDS19PRihYNTA5KSAqY2VydF9zdGFjaz1OVUxMOworCWludCByZXQ9MSxub2NybD0wOworCisJYXBwc19zdGFydHVwKCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQlpZiAoKGJpb19lcnI9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fZXJyLHN0ZGVycixCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisKKwlpbmZpbGU9TlVMTDsKKwlvdXRmaWxlPU5VTEw7CisJaW5mb3JtYXQ9Rk9STUFUX1BFTTsKKwlvdXRmb3JtYXQ9Rk9STUFUX1BFTTsKKworCXByb2c9YXJndlswXTsKKwlhcmdjLS07CisJYXJndisrOworCXdoaWxlIChhcmdjID49IDEpCisJCXsKKwkJaWYgCShzdHJjbXAoKmFyZ3YsIi1pbmZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5mb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXRmb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWluIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWluZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub2NybCIpID09IDApCisJCQl7CisJCQlub2NybD0xOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jZXJ0ZmlsZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpZighY2VydGZsc3QpIGNlcnRmbHN0ID0gc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKTsKKwkJCXNrX09QRU5TU0xfU1RSSU5HX3B1c2goY2VydGZsc3QsKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmtub3duIG9wdGlvbiAlc1xuIiwqYXJndik7CisJCQliYWRvcHM9MTsKKwkJCWJyZWFrOworCQkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCisJaWYgKGJhZG9wcykKKwkJeworYmFkOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIFtvcHRpb25zXSA8aW5maWxlID5vdXRmaWxlXG4iLHByb2cpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIndoZXJlIG9wdGlvbnMgYXJlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluZm9ybSBhcmcgICAgaW5wdXQgZm9ybWF0IC0gREVSIG9yIFBFTVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vdXRmb3JtIGFyZyAgIG91dHB1dCBmb3JtYXQgLSBERVIgb3IgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluIGFyZyAgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vdXQgYXJnICAgICAgIG91dHB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNlcnRmaWxlIGFyZyAgY2VydGlmaWNhdGVzIGZpbGUgb2YgY2hhaW4gdG8gYSB0cnVzdGVkIENBXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICAgKGNhbiBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlKVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1ub2NybCAgICAgICAgIG5vIGNybCB0byBsb2FkLCBqdXN0IGNlcnRzIGZyb20gJy1jZXJ0ZmlsZSdcbiIpOworCQlyZXQgPSAxOworCQlnb3RvIGVuZDsKKwkJfQorCisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworCWluPUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmICgoaW4gPT0gTlVMTCkgfHwgKG91dCA9PSBOVUxMKSkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKCFub2NybCkKKwkJeworCQlpZiAoaW5maWxlID09IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGluLHN0ZGluLEJJT19OT0NMT1NFKTsKKwkJZWxzZQorCQkJeworCQkJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGluZmlsZSkgPD0gMCkKKwkJCQl7CisJCQkJcGVycm9yKGluZmlsZSk7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCisJCWlmIAkoaW5mb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCQljcmw9ZDJpX1g1MDlfQ1JMX2JpbyhpbixOVUxMKTsKKwkJZWxzZSBpZiAoaW5mb3JtYXQgPT0gRk9STUFUX1BFTSkKKwkJCWNybD1QRU1fcmVhZF9iaW9fWDUwOV9DUkwoaW4sTlVMTCxOVUxMLE5VTEwpOworCQllbHNlCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIGlucHV0IGZvcm1hdCBzcGVjaWZpZWQgZm9yIGlucHV0IGNybFxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKGNybCA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gbG9hZCBDUkxcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJCisJaWYgKChwNz1QS0NTN19uZXcoKSkgPT0gTlVMTCkgZ290byBlbmQ7CisJaWYgKChwN3M9UEtDUzdfU0lHTkVEX25ldygpKSA9PSBOVUxMKSBnb3RvIGVuZDsKKwlwNy0+dHlwZT1PQkpfbmlkMm9iaihOSURfcGtjczdfc2lnbmVkKTsKKwlwNy0+ZC5zaWduPXA3czsKKwlwN3MtPmNvbnRlbnRzLT50eXBlPU9CSl9uaWQyb2JqKE5JRF9wa2NzN19kYXRhKTsKKworCWlmICghQVNOMV9JTlRFR0VSX3NldChwN3MtPnZlcnNpb24sMSkpIGdvdG8gZW5kOworCWlmICgoY3JsX3N0YWNrPXNrX1g1MDlfQ1JMX25ld19udWxsKCkpID09IE5VTEwpIGdvdG8gZW5kOworCXA3cy0+Y3JsPWNybF9zdGFjazsKKwlpZiAoY3JsICE9IE5VTEwpCisJCXsKKwkJc2tfWDUwOV9DUkxfcHVzaChjcmxfc3RhY2ssY3JsKTsKKwkJY3JsPU5VTEw7IC8qIG5vdyBwYXJ0IG9mIHA3IGZvciBPUEVOU1NMX2ZyZWVpbmcgKi8KKwkJfQorCisJaWYgKChjZXJ0X3N0YWNrPXNrX1g1MDlfbmV3X251bGwoKSkgPT0gTlVMTCkgZ290byBlbmQ7CisJcDdzLT5jZXJ0PWNlcnRfc3RhY2s7CisKKwlpZihjZXJ0ZmxzdCkgZm9yKGkgPSAwOyBpIDwgc2tfT1BFTlNTTF9TVFJJTkdfbnVtKGNlcnRmbHN0KTsgaSsrKSB7CisJCWNlcnRmaWxlID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoY2VydGZsc3QsIGkpOworCQlpZiAoYWRkX2NlcnRzX2Zyb21fZmlsZShjZXJ0X3N0YWNrLGNlcnRmaWxlKSA8IDApCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJlcnJvciBsb2FkaW5nIGNlcnRpZmljYXRlc1xuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJfQorCisJc2tfT1BFTlNTTF9TVFJJTkdfZnJlZShjZXJ0ZmxzdCk7CisKKwlpZiAob3V0ZmlsZSA9PSBOVUxMKQorCQl7CisJCUJJT19zZXRfZnAob3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCW91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJfQorI2VuZGlmCisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEJJT193cml0ZV9maWxlbmFtZShvdXQsb3V0ZmlsZSkgPD0gMCkKKwkJCXsKKwkJCXBlcnJvcihvdXRmaWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAJKG91dGZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJaT1pMmRfUEtDUzdfYmlvKG91dCxwNyk7CisJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCWk9UEVNX3dyaXRlX2Jpb19QS0NTNyhvdXQscDcpOworCWVsc2UJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBvdXRwdXQgZm9ybWF0IHNwZWNpZmllZCBmb3Igb3V0ZmlsZVxuIik7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKCFpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIHdyaXRlIHBrY3M3IG9iamVjdFxuIik7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisJcmV0PTA7CitlbmQ6CisJaWYgKGluICE9IE5VTEwpIEJJT19mcmVlKGluKTsKKwlpZiAob3V0ICE9IE5VTEwpIEJJT19mcmVlX2FsbChvdXQpOworCWlmIChwNyAhPSBOVUxMKSBQS0NTN19mcmVlKHA3KTsKKwlpZiAoY3JsICE9IE5VTEwpIFg1MDlfQ1JMX2ZyZWUoY3JsKTsKKworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQocmV0KTsKKwl9CisKKy8qCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGludCBhZGRfY2VydHNfZnJvbV9maWxlCisgKgorICoJUmVhZCBhIGxpc3Qgb2YgY2VydGlmaWNhdGVzIHRvIGJlIGNoZWNrZWQgZnJvbSBhIGZpbGUuCisgKgorICogUmVzdWx0czoKKyAqCW51bWJlciBvZiBjZXJ0cyBhZGRlZCBpZiBzdWNjZXNzZnVsLCAtMSBpZiBub3QuCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIGludCBhZGRfY2VydHNfZnJvbV9maWxlKFNUQUNLX09GKFg1MDkpICpzdGFjaywgY2hhciAqY2VydGZpbGUpCisJeworCUJJTyAqaW49TlVMTDsKKwlpbnQgY291bnQ9MDsKKwlpbnQgcmV0PSAtMTsKKwlTVEFDS19PRihYNTA5X0lORk8pICpzaz1OVUxMOworCVg1MDlfSU5GTyAqeGk7CisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKChpbiA9PSBOVUxMKSB8fCAoQklPX3JlYWRfZmlsZW5hbWUoaW4sY2VydGZpbGUpIDw9IDApKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiZXJyb3Igb3BlbmluZyB0aGUgZmlsZSwgJXNcbiIsY2VydGZpbGUpOworCQlnb3RvIGVuZDsKKwkJfQorCisJLyogVGhpcyBsb2FkcyBmcm9tIGEgZmlsZSwgYSBzdGFjayBvZiB4NTA5L2NybC9wa2V5IHNldHMgKi8KKwlzaz1QRU1fWDUwOV9JTkZPX3JlYWRfYmlvKGluLE5VTEwsTlVMTCxOVUxMKTsKKwlpZiAoc2sgPT0gTlVMTCkgeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHJlYWRpbmcgdGhlIGZpbGUsICVzXG4iLGNlcnRmaWxlKTsKKwkJZ290byBlbmQ7CisJfQorCisJLyogc2NhbiBvdmVyIGl0IGFuZCBwdWxsIG91dCB0aGUgQ1JMJ3MgKi8KKwl3aGlsZSAoc2tfWDUwOV9JTkZPX251bShzaykpCisJCXsKKwkJeGk9c2tfWDUwOV9JTkZPX3NoaWZ0KHNrKTsKKwkJaWYgKHhpLT54NTA5ICE9IE5VTEwpCisJCQl7CisJCQlza19YNTA5X3B1c2goc3RhY2sseGktPng1MDkpOworCQkJeGktPng1MDk9TlVMTDsKKwkJCWNvdW50Kys7CisJCQl9CisJCVg1MDlfSU5GT19mcmVlKHhpKTsKKwkJfQorCisJcmV0PWNvdW50OworZW5kOgorIAkvKiBuZXZlciBuZWVkIHRvIE9QRU5TU0xfZnJlZSB4ICovCisJaWYgKGluICE9IE5VTEwpIEJJT19mcmVlKGluKTsKKwlpZiAoc2sgIT0gTlVMTCkgc2tfWDUwOV9JTkZPX2ZyZWUoc2spOworCXJldHVybihyZXQpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9kZ3N0LmMgYi9saWIvb3BlbnNzbC9hcHBzL2Rnc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmYzOGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9kZ3N0LmMKQEAgLTAsMCArMSw2MzIgQEAKKy8qIGFwcHMvZGdzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorCisjdW5kZWYgQlVGU0laRQorI2RlZmluZSBCVUZTSVpFCTEwMjQqOAorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCWRnc3RfbWFpbgorCitpbnQgZG9fZnAoQklPICpvdXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgQklPICpicCwgaW50IHNlcCwgaW50IGJpbm91dCwKKwkgIEVWUF9QS0VZICprZXksIHVuc2lnbmVkIGNoYXIgKnNpZ2luLCBpbnQgc2lnbGVuLAorCSAgY29uc3QgY2hhciAqc2lnX25hbWUsIGNvbnN0IGNoYXIgKm1kX25hbWUsCisJICBjb25zdCBjaGFyICpmaWxlLEJJTyAqYm1kKTsKKworc3RhdGljIHZvaWQgbGlzdF9tZF9mbihjb25zdCBFVlBfTUQgKm0sCisJCQljb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywgdm9pZCAqYXJnKQorCXsKKwljb25zdCBjaGFyICptbmFtZTsKKwkvKiBTa2lwIGFsaWFzZXMgKi8KKwlpZiAoIW0pCisJCXJldHVybjsKKwltbmFtZSA9IE9CSl9uaWQybG4oRVZQX01EX3R5cGUobSkpOworCS8qIFNraXAgc2hvcnRuYW1lcyAqLworCWlmIChzdHJjbXAoZnJvbSwgbW5hbWUpKQorCQlyZXR1cm47CisJLyogU2tpcCBjbG9uZXMgKi8KKwlpZiAoRVZQX01EX2ZsYWdzKG0pICYgRVZQX01EX0ZMQUdfUEtFWV9ESUdFU1QpCisJCXJldHVybjsKKwlpZiAoc3RyY2hyKG1uYW1lLCAnICcpKQorCQltbmFtZT0gRVZQX01EX25hbWUobSk7CisJQklPX3ByaW50ZihhcmcsICItJS0xNHMgdG8gdXNlIHRoZSAlcyBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG1cbiIsCisJCQltbmFtZSwgbW5hbWUpOworCX0KKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlFTkdJTkUgKmUgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmJ1Zj1OVUxMOworCWludCBpLGVycj0xOworCWNvbnN0IEVWUF9NRCAqbWQ9TlVMTCwqbTsKKwlCSU8gKmluPU5VTEwsKmlucDsKKwlCSU8gKmJtZD1OVUxMOworCUJJTyAqb3V0ID0gTlVMTDsKKyNkZWZpbmUgUFJPR19OQU1FX1NJWkUgIDM5CisJY2hhciBwbmFtZVtQUk9HX05BTUVfU0laRSsxXTsKKwlpbnQgc2VwYXJhdG9yPTA7CisJaW50IGRlYnVnPTA7CisJaW50IGtleWZvcm09Rk9STUFUX1BFTTsKKwljb25zdCBjaGFyICpvdXRmaWxlID0gTlVMTCwgKmtleWZpbGUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnNpZ2ZpbGUgPSBOVUxMLCAqcmFuZGZpbGUgPSBOVUxMOworCWludCBvdXRfYmluID0gLTEsIHdhbnRfcHViID0gMCwgZG9fdmVyaWZ5ID0gMDsKKwlFVlBfUEtFWSAqc2lna2V5ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpzaWdidWYgPSBOVUxMOworCWludCBzaWdsZW4gPSAwOworCWNoYXIgKnBhc3NhcmdpbiA9IE5VTEwsICpwYXNzaW4gPSBOVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWNoYXIgKmVuZ2luZT1OVUxMOworI2VuZGlmCisJY2hhciAqaG1hY19rZXk9TlVMTDsKKwljaGFyICptYWNfbmFtZT1OVUxMOworCVNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqc2lnb3B0cyA9IE5VTEwsICptYWNvcHRzID0gTlVMTDsKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKChidWY9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhCVUZTSVpFKSkgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIm91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJLyogZmlyc3QgY2hlY2sgdGhlIHByb2dyYW0gbmFtZSAqLworCXByb2dyYW1fbmFtZShhcmd2WzBdLHBuYW1lLHNpemVvZiBwbmFtZSk7CisKKwltZD1FVlBfZ2V0X2RpZ2VzdGJ5bmFtZShwbmFtZSk7CisKKwlhcmdjLS07CisJYXJndisrOworCXdoaWxlIChhcmdjID4gMCkKKwkJeworCQlpZiAoKCphcmd2KVswXSAhPSAnLScpIGJyZWFrOworCQlpZiAoc3RyY21wKCphcmd2LCItYyIpID09IDApCisJCQlzZXBhcmF0b3I9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItciIpID09IDApCisJCQlzZXBhcmF0b3I9MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcmFuZCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYnJlYWs7CisJCQlyYW5kZmlsZT0qKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYnJlYWs7CisJCQlvdXRmaWxlPSooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItc2lnbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYnJlYWs7CisJCQlrZXlmaWxlPSooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwiLXBhc3NpbiIpKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpCisJCQkJYnJlYWs7CisJCQlwYXNzYXJnaW49KisrYXJndjsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdmVyaWZ5IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBicmVhazsKKwkJCWtleWZpbGU9KigrK2FyZ3YpOworCQkJd2FudF9wdWIgPSAxOworCQkJZG9fdmVyaWZ5ID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHJ2ZXJpZnkiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGJyZWFrOworCQkJa2V5ZmlsZT0qKCsrYXJndik7CisJCQlkb192ZXJpZnkgPSAxOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zaWduYXR1cmUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGJyZWFrOworCQkJc2lnZmlsZT0qKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWtleWZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGJyZWFrOworCQkJa2V5Zm9ybT1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVuZ2luZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYnJlYWs7CisJCQllbmdpbmU9ICooKythcmd2KTsKKyAgICAgICAgCQllID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaGV4IikgPT0gMCkKKwkJCW91dF9iaW4gPSAwOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1iaW5hcnkiKSA9PSAwKQorCQkJb3V0X2JpbiA9IDE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWQiKSA9PSAwKQorCQkJZGVidWc9MTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwiLWhtYWMiKSkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKQorCQkJCWJyZWFrOworCQkJaG1hY19rZXk9KisrYXJndjsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwiLW1hYyIpKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpCisJCQkJYnJlYWs7CisJCQltYWNfbmFtZT0qKythcmd2OworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zaWdvcHQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpCisJCQkJYnJlYWs7CisJCQlpZiAoIXNpZ29wdHMpCisJCQkJc2lnb3B0cyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisJCQlpZiAoIXNpZ29wdHMgfHwgIXNrX09QRU5TU0xfU1RSSU5HX3B1c2goc2lnb3B0cywgKigrK2FyZ3YpKSkKKwkJCQlicmVhazsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbWFjb3B0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKQorCQkJCWJyZWFrOworCQkJaWYgKCFtYWNvcHRzKQorCQkJCW1hY29wdHMgPSBza19PUEVOU1NMX1NUUklOR19uZXdfbnVsbCgpOworCQkJaWYgKCFtYWNvcHRzIHx8ICFza19PUEVOU1NMX1NUUklOR19wdXNoKG1hY29wdHMsICooKythcmd2KSkpCisJCQkJYnJlYWs7CisJCQl9CisJCWVsc2UgaWYgKChtPUVWUF9nZXRfZGlnZXN0YnluYW1lKCYoKCphcmd2KVsxXSkpKSAhPSBOVUxMKQorCQkJbWQ9bTsKKwkJZWxzZQorCQkJYnJlYWs7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQl9CisKKworCWlmKGRvX3ZlcmlmeSAmJiAhc2lnZmlsZSkgeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJObyBzaWduYXR1cmUgdG8gdmVyaWZ5OiB1c2UgdGhlIC1zaWduYXR1cmUgb3B0aW9uXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKChhcmdjID4gMCkgJiYgKGFyZ3ZbMF1bMF0gPT0gJy0nKSkgLyogYmFkIG9wdGlvbiAqLworCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJyVzJ1xuIiwqYXJndik7CisJCUJJT19wcmludGYoYmlvX2Vyciwib3B0aW9ucyBhcmVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIi1jICAgICAgICAgICAgICB0byBvdXRwdXQgdGhlIGRpZ2VzdCB3aXRoIHNlcGFyYXRpbmcgY29sb25zXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCItciAgICAgICAgICAgICAgdG8gb3V0cHV0IHRoZSBkaWdlc3QgaW4gY29yZXV0aWxzIGZvcm1hdFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiLWQgICAgICAgICAgICAgIHRvIG91dHB1dCBkZWJ1ZyBpbmZvXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCItaGV4ICAgICAgICAgICAgb3V0cHV0IGFzIGhleCBkdW1wXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCItYmluYXJ5ICAgICAgICAgb3V0cHV0IGluIGJpbmFyeSBmb3JtXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCItc2lnbiAgIGZpbGUgICAgc2lnbiBkaWdlc3QgdXNpbmcgcHJpdmF0ZSBrZXkgaW4gZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiLXZlcmlmeSBmaWxlICAgIHZlcmlmeSBhIHNpZ25hdHVyZSB1c2luZyBwdWJsaWMga2V5IGluIGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIi1wcnZlcmlmeSBmaWxlICB2ZXJpZnkgYSBzaWduYXR1cmUgdXNpbmcgcHJpdmF0ZSBrZXkgaW4gZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiLWtleWZvcm0gYXJnICAgIGtleSBmaWxlIGZvcm1hdCAoUEVNIG9yIEVOR0lORSlcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIi1vdXQgZmlsZW5hbWUgICBvdXRwdXQgdG8gZmlsZW5hbWUgcmF0aGVyIHRoYW4gc3Rkb3V0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCItc2lnbmF0dXJlIGZpbGUgc2lnbmF0dXJlIHRvIHZlcmlmeVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiLXNpZ29wdCBubTp2ICAgIHNpZ25hdHVyZSBwYXJhbWV0ZXJcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIi1obWFjIGtleSAgICAgICBjcmVhdGUgaGFzaGVkIE1BQyB3aXRoIGtleVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiLW1hYyBhbGdvcml0aG0gIGNyZWF0ZSBNQUMgKG5vdCBuZWNjZXNzYXJpbHkgSE1BQylcbiIpOyAKKwkJQklPX3ByaW50ZihiaW9fZXJyLCItbWFjb3B0IG5tOnYgICAgTUFDIGFsZ29yaXRobSBwYXJhbWV0ZXJzIG9yIGtleVxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYoYmlvX2VyciwiLWVuZ2luZSBlICAgICAgIHVzZSBlbmdpbmUgZSwgcG9zc2libHkgYSBoYXJkd2FyZSBkZXZpY2UuXG4iKTsKKyNlbmRpZgorCisJCUVWUF9NRF9kb19hbGxfc29ydGVkKGxpc3RfbWRfZm4sIGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCWJtZD1CSU9fbmV3KEJJT19mX21kKCkpOworCWlmIChkZWJ1ZykKKwkJeworCQlCSU9fc2V0X2NhbGxiYWNrKGluLEJJT19kZWJ1Z19jYWxsYmFjayk7CisJCS8qIG5lZWRlZCBmb3Igd2luZG93cyAzLjEgKi8KKwkJQklPX3NldF9jYWxsYmFja19hcmcoaW4sKGNoYXIgKiliaW9fZXJyKTsKKwkJfQorCisJaWYoIWFwcF9wYXNzd2QoYmlvX2VyciwgcGFzc2FyZ2luLCBOVUxMLCAmcGFzc2luLCBOVUxMKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBnZXR0aW5nIHBhc3N3b3JkXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmICgoaW4gPT0gTlVMTCkgfHwgKGJtZCA9PSBOVUxMKSkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYob3V0X2JpbiA9PSAtMSkgeworCQlpZihrZXlmaWxlKQorCQkJb3V0X2JpbiA9IDE7CisJCWVsc2UKKwkJCW91dF9iaW4gPSAwOworCX0KKworCWlmKHJhbmRmaWxlKQorCQlhcHBfUkFORF9sb2FkX2ZpbGUocmFuZGZpbGUsIGJpb19lcnIsIDApOworCisJaWYob3V0ZmlsZSkgeworCQlpZihvdXRfYmluKQorCQkJb3V0ID0gQklPX25ld19maWxlKG91dGZpbGUsICJ3YiIpOworCQllbHNlICAgIG91dCA9IEJJT19uZXdfZmlsZShvdXRmaWxlLCAidyIpOworCX0gZWxzZSB7CisJCW91dCA9IEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCW91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJfQorI2VuZGlmCisJfQorCisJaWYoIW91dCkgeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlICVzXG4iLCAKKwkJCQkJb3V0ZmlsZSA/IG91dGZpbGUgOiAiKHN0ZG91dCkiKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJfQorCWlmICgoISFtYWNfbmFtZSArICEha2V5ZmlsZSArICEhaG1hY19rZXkpID4gMSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJNQUMgYW5kIFNpZ25pbmcga2V5IGNhbm5vdCBib3RoIGJlIHNwZWNpZmllZFxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZihrZXlmaWxlKQorCQl7CisJCWlmICh3YW50X3B1YikKKwkJCXNpZ2tleSA9IGxvYWRfcHVia2V5KGJpb19lcnIsIGtleWZpbGUsIGtleWZvcm0sIDAsIE5VTEwsCisJCQkJZSwgImtleSBmaWxlIik7CisJCWVsc2UKKwkJCXNpZ2tleSA9IGxvYWRfa2V5KGJpb19lcnIsIGtleWZpbGUsIGtleWZvcm0sIDAsIHBhc3NpbiwKKwkJCQllLCAia2V5IGZpbGUiKTsKKwkJaWYgKCFzaWdrZXkpCisJCQl7CisJCQkvKiBsb2FkX1twdWJda2V5KCkgaGFzIGFscmVhZHkgcHJpbnRlZCBhbiBhcHByb3ByaWF0ZQorCQkJICAgbWVzc2FnZSAqLworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmIChtYWNfbmFtZSkKKwkJeworCQlFVlBfUEtFWV9DVFggKm1hY19jdHggPSBOVUxMOworCQlpbnQgciA9IDA7CisJCWlmICghaW5pdF9nZW5fc3RyKGJpb19lcnIsICZtYWNfY3R4LCBtYWNfbmFtZSxlLCAwKSkKKwkJCWdvdG8gbWFjX2VuZDsKKwkJaWYgKG1hY29wdHMpCisJCQl7CisJCQljaGFyICptYWNvcHQ7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2tfT1BFTlNTTF9TVFJJTkdfbnVtKG1hY29wdHMpOyBpKyspCisJCQkJeworCQkJCW1hY29wdCA9IHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKG1hY29wdHMsIGkpOworCQkJCWlmIChwa2V5X2N0cmxfc3RyaW5nKG1hY19jdHgsIG1hY29wdCkgPD0gMCkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCQkiTUFDIHBhcmFtZXRlciBlcnJvciBcIiVzXCJcbiIsCisJCQkJCQltYWNvcHQpOworCQkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCQlnb3RvIG1hY19lbmQ7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCWlmIChFVlBfUEtFWV9rZXlnZW4obWFjX2N0eCwgJnNpZ2tleSkgPD0gMCkKKwkJCXsKKwkJCUJJT19wdXRzKGJpb19lcnIsICJFcnJvciBnZW5lcmF0aW5nIGtleVxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBtYWNfZW5kOworCQkJfQorCQlyID0gMTsKKwkJbWFjX2VuZDoKKwkJaWYgKG1hY19jdHgpCisJCQlFVlBfUEtFWV9DVFhfZnJlZShtYWNfY3R4KTsKKwkJaWYgKHIgPT0gMCkKKwkJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoaG1hY19rZXkpCisJCXsKKwkJc2lna2V5ID0gRVZQX1BLRVlfbmV3X21hY19rZXkoRVZQX1BLRVlfSE1BQywgZSwKKwkJCQkJKHVuc2lnbmVkIGNoYXIgKilobWFjX2tleSwgLTEpOworCQlpZiAoIXNpZ2tleSkKKwkJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoc2lna2V5KQorCQl7CisJCUVWUF9NRF9DVFggKm1jdHggPSBOVUxMOworCQlFVlBfUEtFWV9DVFggKnBjdHggPSBOVUxMOworCQlpbnQgcjsKKwkJaWYgKCFCSU9fZ2V0X21kX2N0eChibWQsICZtY3R4KSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgY29udGV4dFxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWlmIChkb192ZXJpZnkpCisJCQlyID0gRVZQX0RpZ2VzdFZlcmlmeUluaXQobWN0eCwgJnBjdHgsIG1kLCBlLCBzaWdrZXkpOworCQllbHNlCisJCQlyID0gRVZQX0RpZ2VzdFNpZ25Jbml0KG1jdHgsICZwY3R4LCBtZCwgZSwgc2lna2V5KTsKKwkJaWYgKCFyKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3Igc2V0dGluZyBjb250ZXh0XG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKHNpZ29wdHMpCisJCQl7CisJCQljaGFyICpzaWdvcHQ7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2tfT1BFTlNTTF9TVFJJTkdfbnVtKHNpZ29wdHMpOyBpKyspCisJCQkJeworCQkJCXNpZ29wdCA9IHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKHNpZ29wdHMsIGkpOworCQkJCWlmIChwa2V5X2N0cmxfc3RyaW5nKHBjdHgsIHNpZ29wdCkgPD0gMCkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCQkicGFyYW1ldGVyIGVycm9yIFwiJXNcIlxuIiwKKwkJCQkJCXNpZ29wdCk7CisJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJLyogd2UgdXNlIG1kIGFzIGEgZmlsdGVyLCByZWFkaW5nIGZyb20gJ2luJyAqLworCWVsc2UKKwkJeworCQlpZiAobWQgPT0gTlVMTCkKKwkJCW1kID0gRVZQX21kNSgpOyAKKwkJaWYgKCFCSU9fc2V0X21kKGJtZCxtZCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBzZXR0aW5nIGRpZ2VzdCAlc1xuIiwgcG5hbWUpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZihzaWdmaWxlICYmIHNpZ2tleSkgeworCQlCSU8gKnNpZ2JpbzsKKwkJc2lnYmlvID0gQklPX25ld19maWxlKHNpZ2ZpbGUsICJyYiIpOworCQlzaWdsZW4gPSBFVlBfUEtFWV9zaXplKHNpZ2tleSk7CisJCXNpZ2J1ZiA9IE9QRU5TU0xfbWFsbG9jKHNpZ2xlbik7CisJCWlmKCFzaWdiaW8pIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIG9wZW5pbmcgc2lnbmF0dXJlIGZpbGUgJXNcbiIsCisJCQkJCQkJCXNpZ2ZpbGUpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQl9CisJCXNpZ2xlbiA9IEJJT19yZWFkKHNpZ2Jpbywgc2lnYnVmLCBzaWdsZW4pOworCQlCSU9fZnJlZShzaWdiaW8pOworCQlpZihzaWdsZW4gPD0gMCkgeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgcmVhZGluZyBzaWduYXR1cmUgZmlsZSAlc1xuIiwKKwkJCQkJCQkJc2lnZmlsZSk7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisJaW5wPUJJT19wdXNoKGJtZCxpbik7CisKKwlpZiAobWQgPT0gTlVMTCkKKwkJeworCQlFVlBfTURfQ1RYICp0Y3R4OworCQlCSU9fZ2V0X21kX2N0eChibWQsICZ0Y3R4KTsKKwkJbWQgPSBFVlBfTURfQ1RYX21kKHRjdHgpOworCQl9CisKKwlpZiAoYXJnYyA9PSAwKQorCQl7CisJCUJJT19zZXRfZnAoaW4sc3RkaW4sQklPX05PQ0xPU0UpOworCQllcnI9ZG9fZnAob3V0LCBidWYsaW5wLHNlcGFyYXRvciwgb3V0X2Jpbiwgc2lna2V5LCBzaWdidWYsCisJCQkgIHNpZ2xlbixOVUxMLE5VTEwsInN0ZGluIixibWQpOworCQl9CisJZWxzZQorCQl7CisJCWNvbnN0IGNoYXIgKm1kX25hbWUgPSBOVUxMLCAqc2lnX25hbWUgPSBOVUxMOworCQlpZighb3V0X2JpbikKKwkJCXsKKwkJCWlmIChzaWdrZXkpCisJCQkJeworCQkJCWNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aDsKKwkJCQlhbWV0aCA9IEVWUF9QS0VZX2dldDBfYXNuMShzaWdrZXkpOworCQkJCWlmIChhbWV0aCkKKwkJCQkJRVZQX1BLRVlfYXNuMV9nZXQwX2luZm8oTlVMTCwgTlVMTCwKKwkJCQkJCU5VTEwsIE5VTEwsICZzaWdfbmFtZSwgYW1ldGgpOworCQkJCX0KKwkJCW1kX25hbWUgPSBFVlBfTURfbmFtZShtZCk7CisJCQl9CisJCWVyciA9IDA7CisJCWZvciAoaT0wOyBpPGFyZ2M7IGkrKykKKwkJCXsKKwkJCWludCByOworCQkJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGFyZ3ZbaV0pIDw9IDApCisJCQkJeworCQkJCXBlcnJvcihhcmd2W2ldKTsKKwkJCQllcnIrKzsKKwkJCQljb250aW51ZTsKKwkJCQl9CisJCQllbHNlCisJCQlyPWRvX2ZwKG91dCxidWYsaW5wLHNlcGFyYXRvcixvdXRfYmluLHNpZ2tleSxzaWdidWYsCisJCQkJc2lnbGVuLHNpZ19uYW1lLG1kX25hbWUsIGFyZ3ZbaV0sYm1kKTsKKwkJCWlmKHIpCisJCQkgICAgZXJyPXI7CisJCQkodm9pZClCSU9fcmVzZXQoYm1kKTsKKwkJCX0KKwkJfQorZW5kOgorCWlmIChidWYgIT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX2NsZWFuc2UoYnVmLEJVRlNJWkUpOworCQlPUEVOU1NMX2ZyZWUoYnVmKTsKKwkJfQorCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJaWYgKHBhc3NpbikKKwkJT1BFTlNTTF9mcmVlKHBhc3Npbik7CisJQklPX2ZyZWVfYWxsKG91dCk7CisJRVZQX1BLRVlfZnJlZShzaWdrZXkpOworCWlmIChzaWdvcHRzKQorCQlza19PUEVOU1NMX1NUUklOR19mcmVlKHNpZ29wdHMpOworCWlmIChtYWNvcHRzKQorCQlza19PUEVOU1NMX1NUUklOR19mcmVlKG1hY29wdHMpOworCWlmKHNpZ2J1ZikgT1BFTlNTTF9mcmVlKHNpZ2J1Zik7CisJaWYgKGJtZCAhPSBOVUxMKSBCSU9fZnJlZShibWQpOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQoZXJyKTsKKwl9CisKK2ludCBkb19mcChCSU8gKm91dCwgdW5zaWduZWQgY2hhciAqYnVmLCBCSU8gKmJwLCBpbnQgc2VwLCBpbnQgYmlub3V0LAorCSAgRVZQX1BLRVkgKmtleSwgdW5zaWduZWQgY2hhciAqc2lnaW4sIGludCBzaWdsZW4sCisJICBjb25zdCBjaGFyICpzaWdfbmFtZSwgY29uc3QgY2hhciAqbWRfbmFtZSwKKwkgIGNvbnN0IGNoYXIgKmZpbGUsQklPICpibWQpCisJeworCXNpemVfdCBsZW47CisJaW50IGk7CisKKwlmb3IgKDs7KQorCQl7CisJCWk9QklPX3JlYWQoYnAsKGNoYXIgKilidWYsQlVGU0laRSk7CisJCWlmKGkgPCAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiUmVhZCBFcnJvciBpbiAlc1xuIixmaWxlKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJaWYgKGkgPT0gMCkgYnJlYWs7CisJCX0KKwlpZihzaWdpbikKKwkJeworCQlFVlBfTURfQ1RYICpjdHg7CisJCUJJT19nZXRfbWRfY3R4KGJwLCAmY3R4KTsKKwkJaSA9IEVWUF9EaWdlc3RWZXJpZnlGaW5hbChjdHgsIHNpZ2luLCAodW5zaWduZWQgaW50KXNpZ2xlbik7IAorCQlpZihpID4gMCkKKwkJCUJJT19wcmludGYob3V0LCAiVmVyaWZpZWQgT0tcbiIpOworCQllbHNlIGlmKGkgPT0gMCkKKwkJCXsKKwkJCUJJT19wcmludGYob3V0LCAiVmVyaWZpY2F0aW9uIEZhaWx1cmVcbiIpOworCQkJcmV0dXJuIDE7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIFZlcmlmeWluZyBEYXRhXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJcmV0dXJuIDA7CisJCX0KKwlpZihrZXkpCisJCXsKKwkJRVZQX01EX0NUWCAqY3R4OworCQlCSU9fZ2V0X21kX2N0eChicCwgJmN0eCk7CisJCWxlbiA9IEJVRlNJWkU7CisJCWlmKCFFVlBfRGlnZXN0U2lnbkZpbmFsKGN0eCwgYnVmLCAmbGVuKSkgCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBTaWduaW5nIERhdGFcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCXJldHVybiAxOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWxlbj1CSU9fZ2V0cyhicCwoY2hhciAqKWJ1ZixCVUZTSVpFKTsKKwkJaWYgKChpbnQpbGVuIDwwKQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCXJldHVybiAxOworCQkJfQorCQl9CisKKwlpZihiaW5vdXQpIEJJT193cml0ZShvdXQsIGJ1ZiwgbGVuKTsKKwllbHNlIGlmIChzZXAgPT0gMikKKwkJeworCQlmb3IgKGk9MDsgaTwoaW50KWxlbjsgaSsrKQorCQkJQklPX3ByaW50ZihvdXQsICIlMDJ4IixidWZbaV0pOworCQlCSU9fcHJpbnRmKG91dCwgIiAqJXNcbiIsIGZpbGUpOworCQl9CisJZWxzZSAKKwkJeworCQlpZiAoc2lnX25hbWUpCisJCQlCSU9fcHJpbnRmKG91dCwgIiVzLSVzKCVzKT0gIiwgc2lnX25hbWUsIG1kX25hbWUsIGZpbGUpOworCQllbHNlIGlmIChtZF9uYW1lKQorCQkJQklPX3ByaW50ZihvdXQsICIlcyglcyk9ICIsIG1kX25hbWUsIGZpbGUpOworCQllbHNlCisJCQlCSU9fcHJpbnRmKG91dCwgIiglcyk9ICIsIGZpbGUpOworCQlmb3IgKGk9MDsgaTwoaW50KWxlbjsgaSsrKQorCQkJeworCQkJaWYgKHNlcCAmJiAoaSAhPSAwKSkKKwkJCQlCSU9fcHJpbnRmKG91dCwgIjoiKTsKKwkJCUJJT19wcmludGYob3V0LCAiJTAyeCIsYnVmW2ldKTsKKwkJCX0KKwkJQklPX3ByaW50ZihvdXQsICJcbiIpOworCQl9CisJcmV0dXJuIDA7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2RoLmMgYi9saWIvb3BlbnNzbC9hcHBzL2RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2MDlkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvZGguYwpAQCAtMCwwICsxLDM1OCBAQAorLyogYXBwcy9kaC5jICovCisvKiBvYnNvbGV0ZWQgYnkgZGhwYXJhbS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CS8qIGZvciBPUEVOU1NMX05PX0RIICovCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRwlkaF9tYWluCisKKy8qIC1pbmZvcm0gYXJnCS0gaW5wdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0gKERFUiBvciBQRU0pCisgKiAtb3V0Zm9ybSBhcmcgLSBvdXRwdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0KKyAqIC1pbiBhcmcJLSBpbnB1dCBmaWxlIC0gZGVmYXVsdCBzdGRpbgorICogLW91dCBhcmcJLSBvdXRwdXQgZmlsZSAtIGRlZmF1bHQgc3Rkb3V0CisgKiAtY2hlY2sJLSBjaGVjayB0aGUgcGFyYW1ldGVycyBhcmUgb2sKKyAqIC1ub291dAorICogLXRleHQKKyAqIC1DCisgKi8KKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUgKmUgPSBOVUxMOworI2VuZGlmCisJREggKmRoPU5VTEw7CisJaW50IGksYmFkb3BzPTAsdGV4dD0wOworCUJJTyAqaW49TlVMTCwqb3V0PU5VTEw7CisJaW50IGluZm9ybWF0LG91dGZvcm1hdCxjaGVjaz0wLG5vb3V0PTAsQz0wLHJldD0xOworCWNoYXIgKmluZmlsZSwqb3V0ZmlsZSwqcHJvZzsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwljaGFyICplbmdpbmU7CisjZW5kaWYKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJaWYgKChiaW9fZXJyPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoYmlvX2VycixzdGRlcnIsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwllbmdpbmU9TlVMTDsKKyNlbmRpZgorCWluZmlsZT1OVUxMOworCW91dGZpbGU9TlVMTDsKKwlpbmZvcm1hdD1GT1JNQVRfUEVNOworCW91dGZvcm1hdD1GT1JNQVRfUEVNOworCisJcHJvZz1hcmd2WzBdOworCWFyZ2MtLTsKKwlhcmd2Kys7CisJd2hpbGUgKGFyZ2MgPj0gMSkKKwkJeworCQlpZiAJKHN0cmNtcCgqYXJndiwiLWluZm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dGZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0Zm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5maWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmaWxlPSAqKCsrYXJndik7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVuZ2luZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQllbmdpbmU9ICooKythcmd2KTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jaGVjayIpID09IDApCisJCQljaGVjaz0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi10ZXh0IikgPT0gMCkKKwkJCXRleHQ9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItQyIpID09IDApCisJCQlDPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vb3V0IikgPT0gMCkKKwkJCW5vb3V0PTE7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJXNcbiIsKmFyZ3YpOworCQkJYmFkb3BzPTE7CisJCQlicmVhazsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKworCWlmIChiYWRvcHMpCisJCXsKK2JhZDoKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlcyBbb3B0aW9uc10gPGluZmlsZSA+b3V0ZmlsZVxuIixwcm9nKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ3aGVyZSBvcHRpb25zIGFyZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1pbmZvcm0gYXJnICAgaW5wdXQgZm9ybWF0IC0gb25lIG9mIERFUiBQRU1cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtb3V0Zm9ybSBhcmcgIG91dHB1dCBmb3JtYXQgLSBvbmUgb2YgREVSIFBFTVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1pbiBhcmcgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vdXQgYXJnICAgICAgb3V0cHV0IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtY2hlY2sgICAgICAgIGNoZWNrIHRoZSBESCBwYXJhbWV0ZXJzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXRleHQgICAgICAgICBwcmludCBhIHRleHQgZm9ybSBvZiB0aGUgREggcGFyYW1ldGVyc1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1DICAgICAgICAgICAgT3V0cHV0IEMgY29kZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1ub291dCAgICAgICAgbm8gb3V0cHV0XG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWVuZ2luZSBlICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJZ290byBlbmQ7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyAgICAgICAgZSA9IHNldHVwX2VuZ2luZShiaW9fZXJyLCBlbmdpbmUsIDApOworI2VuZGlmCisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAoKGluID09IE5VTEwpIHx8IChvdXQgPT0gTlVMTCkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChpbmZpbGUgPT0gTlVMTCkKKwkJQklPX3NldF9mcChpbixzdGRpbixCSU9fTk9DTE9TRSk7CisJZWxzZQorCQl7CisJCWlmIChCSU9fcmVhZF9maWxlbmFtZShpbixpbmZpbGUpIDw9IDApCisJCQl7CisJCQlwZXJyb3IoaW5maWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJaWYgKG91dGZpbGUgPT0gTlVMTCkKKwkJeworCQlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQl7CisJCUJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCX0KKyNlbmRpZgorCQl9CisJZWxzZQorCQl7CisJCWlmIChCSU9fd3JpdGVfZmlsZW5hbWUob3V0LG91dGZpbGUpIDw9IDApCisJCQl7CisJCQlwZXJyb3Iob3V0ZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJaWYJKGluZm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQlkaD1kMmlfREhwYXJhbXNfYmlvKGluLE5VTEwpOworCWVsc2UgaWYgKGluZm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCWRoPVBFTV9yZWFkX2Jpb19ESHBhcmFtcyhpbixOVUxMLE5VTEwsTlVMTCk7CisJZWxzZQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIGlucHV0IGZvcm1hdCBzcGVjaWZpZWRcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmIChkaCA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGxvYWQgREggcGFyYW1ldGVyc1xuIik7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwkKKworCWlmICh0ZXh0KQorCQl7CisJCURIcGFyYW1zX3ByaW50KG91dCxkaCk7CisjaWZkZWYgdW5kZWYKKwkJcHJpbnRmKCJwPSIpOworCQlCTl9wcmludChzdGRvdXQsZGgtPnApOworCQlwcmludGYoIlxuZz0iKTsKKwkJQk5fcHJpbnQoc3Rkb3V0LGRoLT5nKTsKKwkJcHJpbnRmKCJcbiIpOworCQlpZiAoZGgtPmxlbmd0aCAhPSAwKQorCQkJcHJpbnRmKCJyZWNvbW1lbmRlZCBwcml2YXRlIGxlbmd0aD0lbGRcbiIsZGgtPmxlbmd0aCk7CisjZW5kaWYKKwkJfQorCQorCWlmIChjaGVjaykKKwkJeworCQlpZiAoIURIX2NoZWNrKGRoLCZpKSkKKwkJCXsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKGkgJiBESF9DSEVDS19QX05PVF9QUklNRSkKKwkJCXByaW50ZigicCB2YWx1ZSBpcyBub3QgcHJpbWVcbiIpOworCQlpZiAoaSAmIERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUpCisJCQlwcmludGYoInAgdmFsdWUgaXMgbm90IGEgc2FmZSBwcmltZVxuIik7CisJCWlmIChpICYgREhfVU5BQkxFX1RPX0NIRUNLX0dFTkVSQVRPUikKKwkJCXByaW50ZigidW5hYmxlIHRvIGNoZWNrIHRoZSBnZW5lcmF0b3IgdmFsdWVcbiIpOworCQlpZiAoaSAmIERIX05PVF9TVUlUQUJMRV9HRU5FUkFUT1IpCisJCQlwcmludGYoInRoZSBnIHZhbHVlIGlzIG5vdCBhIGdlbmVyYXRvclxuIik7CisJCWlmIChpID09IDApCisJCQlwcmludGYoIkRIIHBhcmFtZXRlcnMgYXBwZWFyIHRvIGJlIG9rLlxuIik7CisJCX0KKwlpZiAoQykKKwkJeworCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQlpbnQgbGVuLGwsYml0czsKKworCQlsZW49Qk5fbnVtX2J5dGVzKGRoLT5wKTsKKwkJYml0cz1CTl9udW1fYml0cyhkaC0+cCk7CisJCWRhdGE9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhsZW4pOworCQlpZiAoZGF0YSA9PSBOVUxMKQorCQkJeworCQkJcGVycm9yKCJPUEVOU1NMX21hbGxvYyIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWw9Qk5fYm4yYmluKGRoLT5wLGRhdGEpOworCQlwcmludGYoInN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoJWRfcFtdPXsiLGJpdHMpOworCQlmb3IgKGk9MDsgaTxsOyBpKyspCisJCQl7CisJCQlpZiAoKGklMTIpID09IDApIHByaW50ZigiXG5cdCIpOworCQkJcHJpbnRmKCIweCUwMlgsIixkYXRhW2ldKTsKKwkJCX0KKwkJcHJpbnRmKCJcblx0fTtcbiIpOworCisJCWw9Qk5fYm4yYmluKGRoLT5nLGRhdGEpOworCQlwcmludGYoInN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoJWRfZ1tdPXsiLGJpdHMpOworCQlmb3IgKGk9MDsgaTxsOyBpKyspCisJCQl7CisJCQlpZiAoKGklMTIpID09IDApIHByaW50ZigiXG5cdCIpOworCQkJcHJpbnRmKCIweCUwMlgsIixkYXRhW2ldKTsKKwkJCX0KKwkJcHJpbnRmKCJcblx0fTtcblxuIik7CisKKwkJcHJpbnRmKCJESCAqZ2V0X2RoJWQoKVxuXHR7XG4iLGJpdHMpOworCQlwcmludGYoIlx0REggKmRoO1xuXG4iKTsKKwkJcHJpbnRmKCJcdGlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTtcbiIpOworCQlwcmludGYoIlx0ZGgtPnA9Qk5fYmluMmJuKGRoJWRfcCxzaXplb2YoZGglZF9wKSxOVUxMKTtcbiIsCisJCQliaXRzLGJpdHMpOworCQlwcmludGYoIlx0ZGgtPmc9Qk5fYmluMmJuKGRoJWRfZyxzaXplb2YoZGglZF9nKSxOVUxMKTtcbiIsCisJCQliaXRzLGJpdHMpOworCQlwcmludGYoIlx0aWYgKChkaC0+cCA9PSBOVUxMKSB8fCAoZGgtPmcgPT0gTlVMTCkpXG4iKTsKKwkJcHJpbnRmKCJcdFx0cmV0dXJuKE5VTEwpO1xuIik7CisJCXByaW50ZigiXHRyZXR1cm4oZGgpO1xuXHR9XG4iKTsKKwkJT1BFTlNTTF9mcmVlKGRhdGEpOworCQl9CisKKworCWlmICghbm9vdXQpCisJCXsKKwkJaWYgCShvdXRmb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCQlpPWkyZF9ESHBhcmFtc19iaW8ob3V0LGRoKTsKKwkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCQlpPVBFTV93cml0ZV9iaW9fREhwYXJhbXMob3V0LGRoKTsKKwkJZWxzZQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBvdXRwdXQgZm9ybWF0IHNwZWNpZmllZCBmb3Igb3V0ZmlsZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKCFpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gd3JpdGUgREggcGFyYW1ldGVyc1xuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwlyZXQ9MDsKK2VuZDoKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCWlmIChvdXQgIT0gTlVMTCkgQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKGRoICE9IE5VTEwpIERIX2ZyZWUoZGgpOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQocmV0KTsKKwl9CisjZWxzZSAvKiAhT1BFTlNTTF9OT19ESCAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZGgxMDI0LnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvZGgxMDI0LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFlY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9kaDEwMjQucGVtCkBAIC0wLDAgKzEsMTAgQEAKKy0tLS0tQkVHSU4gREggUEFSQU1FVEVSUy0tLS0tCitNSUdIQW9HQkFQU0kvVmhPU2R2TklMU2Q1SkVITm1zemJEZ05SUjBQZklpekhIeGJMWTcyODhrandFUHdwVnNZCitqWTY3Vll5NFhUalROUDE4RjFkRG94MFliTjR6SVN5MUt2ODg0YkVwUUJnUmpYeUVwd3B5MW9iRUF4bklCeWw2Cit5cFVNMlphZnE5QUtVSnNDUnRNSVBXYWtYVUdmbkh5OWlVc2lHU2E2cTZKZXcxWHBMM2pIQWdFQworLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCisKK1RoZXNlIGFyZSB0aGUgMTAyNCBiaXQgREggcGFyYW1ldGVycyBmcm9tICJBc3NpZ25lZCBOdW1iZXIgZm9yIFNLSVAgUHJvdG9jb2xzIgorKGh0dHA6Ly93d3cuc2tpcC12cG4ub3JnL3NwZWMvbnVtYmVycy5odG1sKS4KK1NlZSB0aGVyZSBmb3IgaG93IHRoZXkgd2VyZSBnZW5lcmF0ZWQuCitOb3RlIHRoYXQgZyBpcyBub3QgYSBnZW5lcmF0b3IsIGJ1dCB0aGlzIGlzIG5vdCBhIHByb2JsZW0gc2luY2UgcCBpcyBhIHNhZmUgcHJpbWUuCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2RoMjA0OC5wZW0gYi9saWIvb3BlbnNzbC9hcHBzL2RoMjA0OC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkMGI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvZGgyMDQ4LnBlbQpAQCAtMCwwICsxLDEyIEBACistLS0tLUJFR0lOIERIIFBBUkFNRVRFUlMtLS0tLQorTUlJQkNBS0NBUUVBOWtKWHR3aC9DQmR5b3JyV3FVTHpCZWo1VXhFNVQ3YnhicmxMT0NEYUFhZFdveFRwajBCVgorODlBSHhzdERxWlN0OTB4a2hrbjRESU85WmVrWDFLSFRVUGoxV1YvY2RsSlBQVDJOMjg2WjRWZVNXYzM5dUs1MAorVDhYOGRyeUR4VWN3WWM1OHlXYi9GZm03L1pGZXh3R3EwMXVlamFDbGNqclVHdkMvUmdCWUsrWDBpUDFZVGtuYgorelNDMG5lU1JCelpyTTJ3NERVVWREM3lJc3h4OFd5Mk85dlBKSThCRDhLVmJHSTJPdTFXTXVGMDQwelQ5ZkJkWAorUTZNZEdHemVNeUVzdFNyL1BPR3hLVUFZRVkxOGhLY0tjdGFHeEFNWnlBY3Blc3FWRE5tV242dlFDbENiQWtiVAorQ0QxbXBGMUJuNXg4dllsTEloa211cXVpWHNOVjZUSUxPd0lCQWc9PQorLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCisKK1RoZXNlIGFyZSB0aGUgMjA0OCBiaXQgREggcGFyYW1ldGVycyBmcm9tICJBc3NpZ25lZCBOdW1iZXIgZm9yIFNLSVAgUHJvdG9jb2xzIgorKGh0dHA6Ly93d3cuc2tpcC12cG4ub3JnL3NwZWMvbnVtYmVycy5odG1sKS4KK1NlZSB0aGVyZSBmb3IgaG93IHRoZXkgd2VyZSBnZW5lcmF0ZWQuCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2RoNDA5Ni5wZW0gYi9saWIvb3BlbnNzbC9hcHBzL2RoNDA5Ni5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzNWFkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvZGg0MDk2LnBlbQpAQCAtMCwwICsxLDE4IEBACistLS0tLUJFR0lOIERIIFBBUkFNRVRFUlMtLS0tLQorTUlJQ0NBS0NBZ0VBK2hSeVVzRk40VnBKMU84SkxjQ28vVldyMTlrM0JDZ0o0dWsrZCtLaGVoamRScU5ETnlPUQorbC9NT3lRTlFmV1hQZUdLbU9tSWlnNkV2L25tNk5mOVoyQjFoM1I0aEV4Zit6VGlIbnZWUGVSQmhqZFFpODFydAorWGVvaDZUTnJTQklLSUhmVUpXQmgzdmEwVHh4alFJczZJWk9MZVZOUkxNcXpleWxXcU1mNDlIc0lYcWJjb2tVUworVnQxQmt2TGRXNDhqOFBQdjVEc0tSTjN0bG9UeHFESkdvOXRLdmoxRnVrNzRBK1hkYTFrTmhCN0tGbHFNeU45OAorVkVURUo2YzdLcGZPbzMwbW5LMzB3cXczUzhPdGFJUi9tYVlYNzJ0R09ubzJlaEZEa3EzcG5QdEViRDJDU2N4YworYWxKQytFTDdSUGs1Yy90Z2VUdkNuZ3ZjMUtabjkyWS8vRUk3Rzl0UFp0eWxqMmI1NnNIdE1mdElvWUo5K09ETQorc2NjRDVQaXovcmVqRTNPbWU4RU9PY2VVU0NZQWhYbjhiM3F2eFZJMWRkZDFwRUQ2RkhSaEZ2THJaeEZ2QkVNOQorRVJSTXA1UXFPYUhKa00rRHh2OENqNk1xckNiZkM0dStaRXJ4b2R6dXVzZ0RndlppTEYyMnV4TVpib2JGV3l0ZQorT3ZPektHdHdjVHFPLzF3VjVnS2t6dTFaVnN3VlVRZDVHZzhsSmljd3FSV3l5TlJjekREb0c5alZEeG1vZ0tUSAorQWFxTHVsTzdSOElmYTFTd0YyRHRlU0dWdGdXRU44Z0RwTjNSQm1tUFREbmd5RjJESGI1cW1wbnpud3RGS2RUTAorS1didUhuNDkxeE5PMjVDUVdNdGVtODB1S3crcFRuaXNCUkYvNDU0bjFKbmh1YjE0NFlSQm9OOENBUUk9CistLS0tLUVORCBESCBQQVJBTUVURVJTLS0tLS0KKworVGhlc2UgYXJlIHRoZSA0MDk2IGJpdCBESCBwYXJhbWV0ZXJzIGZyb20gIkFzc2lnbmVkIE51bWJlciBmb3IgU0tJUCBQcm90b2NvbHMiCisoaHR0cDovL3d3dy5za2lwLXZwbi5vcmcvc3BlYy9udW1iZXJzLmh0bWwpLgorU2VlIHRoZXJlIGZvciBob3cgdGhleSB3ZXJlIGdlbmVyYXRlZC4KK05vdGUgdGhhdCBnIGlzIG5vdCBhIGdlbmVyYXRvciwgYnV0IHRoaXMgaXMgbm90IGEgcHJvYmxlbSBzaW5jZSBwIGlzIGEgc2FmZSBwcmltZS4KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZGg1MTIucGVtIGIvbGliL29wZW5zc2wvYXBwcy9kaDUxMi5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwZDE2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvZGg1MTIucGVtCkBAIC0wLDAgKzEsOSBAQAorLS0tLS1CRUdJTiBESCBQQVJBTUVURVJTLS0tLS0KK01FWUNRUUQxS3Y4ODRiRXBRQmdSalh5RXB3cHkxb2JFQXhuSUJ5bDZ5cFVNMlphZnE5QUtVSnNDUnRNSVBXYWsKK1hVR2ZuSHk5aVVzaUdTYTZxNkpldzFYcEtnVmZBZ0VDCistLS0tLUVORCBESCBQQVJBTUVURVJTLS0tLS0KKworVGhlc2UgYXJlIHRoZSA1MTIgYml0IERIIHBhcmFtZXRlcnMgZnJvbSAiQXNzaWduZWQgTnVtYmVyIGZvciBTS0lQIFByb3RvY29scyIKKyhodHRwOi8vd3d3LnNraXAtdnBuLm9yZy9zcGVjL251bWJlcnMuaHRtbCkuCitTZWUgdGhlcmUgZm9yIGhvdyB0aGV5IHdlcmUgZ2VuZXJhdGVkLgorTm90ZSB0aGF0IGcgaXMgbm90IGEgZ2VuZXJhdG9yLCBidXQgdGhpcyBpcyBub3QgYSBwcm9ibGVtIHNpbmNlIHAgaXMgYSBzYWZlIHByaW1lLgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9kaHBhcmFtLmMgYi9saWIvb3BlbnNzbC9hcHBzL2RocGFyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFiMjllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9kaHBhcmFtLmMKQEAgLTAsMCArMSw1NjMgQEAKKy8qIGFwcHMvZGhwYXJhbS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4JLyogZm9yIE9QRU5TU0xfTk9fREggKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNlbmRpZgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCWRocGFyYW1fbWFpbgorCisjZGVmaW5lIERFRkJJVFMJNTEyCisKKy8qIC1pbmZvcm0gYXJnCS0gaW5wdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0gKERFUiBvciBQRU0pCisgKiAtb3V0Zm9ybSBhcmcgLSBvdXRwdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0KKyAqIC1pbiBhcmcJLSBpbnB1dCBmaWxlIC0gZGVmYXVsdCBzdGRpbgorICogLW91dCBhcmcJLSBvdXRwdXQgZmlsZSAtIGRlZmF1bHQgc3Rkb3V0CisgKiAtZHNhcGFyYW0gIC0gcmVhZCBvciBnZW5lcmF0ZSBEU0EgcGFyYW1ldGVycywgY29udmVydCB0byBESAorICogLWNoZWNrCS0gY2hlY2sgdGhlIHBhcmFtZXRlcnMgYXJlIG9rCisgKiAtbm9vdXQKKyAqIC10ZXh0CisgKiAtQworICovCisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZGhfY2IoaW50IHAsIGludCBuLCBCTl9HRU5DQiAqY2IpOworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCUVOR0lORSAqZSA9IE5VTEw7CisjZW5kaWYKKwlESCAqZGg9TlVMTDsKKwlpbnQgaSxiYWRvcHM9MCx0ZXh0PTA7CisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJaW50IGRzYXBhcmFtPTA7CisjZW5kaWYKKwlCSU8gKmluPU5VTEwsKm91dD1OVUxMOworCWludCBpbmZvcm1hdCxvdXRmb3JtYXQsY2hlY2s9MCxub291dD0wLEM9MCxyZXQ9MTsKKwljaGFyICppbmZpbGUsKm91dGZpbGUsKnByb2c7CisJY2hhciAqaW5yYW5kPU5VTEw7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lPU5VTEw7CisjZW5kaWYKKwlpbnQgbnVtID0gMCwgZyA9IDA7CisKKwlhcHBzX3N0YXJ0dXAoKTsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJaW5maWxlPU5VTEw7CisJb3V0ZmlsZT1OVUxMOworCWluZm9ybWF0PUZPUk1BVF9QRU07CisJb3V0Zm9ybWF0PUZPUk1BVF9QRU07CisKKwlwcm9nPWFyZ3ZbMF07CisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmIAkoc3RyY21wKCphcmd2LCItaW5mb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWluZm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0Zm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZpbGU9ICooKythcmd2KTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWVuZ2luZT0gKigrK2FyZ3YpOworCQkJfQorI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNoZWNrIikgPT0gMCkKKwkJCWNoZWNrPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXRleHQiKSA9PSAwKQorCQkJdGV4dD0xOworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1kc2FwYXJhbSIpID09IDApCisJCQlkc2FwYXJhbT0xOworI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUMiKSA9PSAwKQorCQkJQz0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub291dCIpID09IDApCisJCQlub291dD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi0yIikgPT0gMCkKKwkJCWc9MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItNSIpID09IDApCisJCQlnPTU7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXJhbmQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5yYW5kPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKCgoc3NjYW5mKCphcmd2LCIlZCIsJm51bSkgPT0gMCkgfHwgKG51bSA8PSAwKSkpCisJCQlnb3RvIGJhZDsKKwkJYXJndisrOworCQlhcmdjLS07CisJCX0KKworCWlmIChiYWRvcHMpCisJCXsKK2JhZDoKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlcyBbb3B0aW9uc10gW251bWJpdHNdXG4iLHByb2cpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIndoZXJlIG9wdGlvbnMgYXJlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluZm9ybSBhcmcgICBpbnB1dCBmb3JtYXQgLSBvbmUgb2YgREVSIFBFTVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vdXRmb3JtIGFyZyAgb3V0cHV0IGZvcm1hdCAtIG9uZSBvZiBERVIgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluIGFyZyAgICAgICBpbnB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dCBhcmcgICAgICBvdXRwdXQgZmlsZVxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1kc2FwYXJhbSAgICAgcmVhZCBvciBnZW5lcmF0ZSBEU0EgcGFyYW1ldGVycywgY29udmVydCB0byBESFxuIik7CisjZW5kaWYKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNoZWNrICAgICAgICBjaGVjayB0aGUgREggcGFyYW1ldGVyc1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC10ZXh0ICAgICAgICAgcHJpbnQgYSB0ZXh0IGZvcm0gb2YgdGhlIERIIHBhcmFtZXRlcnNcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtQyAgICAgICAgICAgIE91dHB1dCBDIGNvZGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtMiAgICAgICAgICAgIGdlbmVyYXRlIHBhcmFtZXRlcnMgdXNpbmcgIDIgYXMgdGhlIGdlbmVyYXRvciB2YWx1ZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC01ICAgICAgICAgICAgZ2VuZXJhdGUgcGFyYW1ldGVycyB1c2luZyAgNSBhcyB0aGUgZ2VuZXJhdG9yIHZhbHVlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgbnVtYml0cyAgICAgICBudW1iZXIgb2YgYml0cyBpbiB0byBnZW5lcmF0ZSAoZGVmYXVsdCA1MTIpXG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWVuZ2luZSBlICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXJhbmQgZmlsZSVjZmlsZSVjLi4uXG4iLCBMSVNUX1NFUEFSQVRPUl9DSEFSLCBMSVNUX1NFUEFSQVRPUl9DSEFSKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICAtIGxvYWQgdGhlIGZpbGUgKG9yIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5KSBpbnRvXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbm9vdXQgICAgICAgIG5vIG91dHB1dFxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgICAgIGUgPSBzZXR1cF9lbmdpbmUoYmlvX2VyciwgZW5naW5lLCAwKTsKKyNlbmRpZgorCisJaWYgKGcgJiYgIW51bSkKKwkJbnVtID0gREVGQklUUzsKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCWlmIChkc2FwYXJhbSkKKwkJeworCQlpZiAoZykKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgImdlbmVyYXRvciBtYXkgbm90IGJlIGNob3NlbiBmb3IgRFNBIHBhcmFtZXRlcnNcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisjZW5kaWYKKwkJeworCQkvKiBESCBwYXJhbWV0ZXJzICovCisJCWlmIChudW0gJiYgIWcpCisJCQlnID0gMjsKKwkJfQorCisJaWYobnVtKSB7CisKKwkJQk5fR0VOQ0IgY2I7CisJCUJOX0dFTkNCX3NldCgmY2IsIGRoX2NiLCBiaW9fZXJyKTsKKwkJaWYgKCFhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgMSkgJiYgaW5yYW5kID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIndhcm5pbmcsIG5vdCBtdWNoIGV4dHJhIHJhbmRvbSBkYXRhLCBjb25zaWRlciB1c2luZyB0aGUgLXJhbmQgb3B0aW9uXG4iKTsKKwkJCX0KKwkJaWYgKGlucmFuZCAhPSBOVUxMKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlbGQgc2VtaS1yYW5kb20gYnl0ZXMgbG9hZGVkXG4iLAorCQkJCWFwcF9SQU5EX2xvYWRfZmlsZXMoaW5yYW5kKSk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkJaWYgKGRzYXBhcmFtKQorCQkJeworCQkJRFNBICpkc2EgPSBEU0FfbmV3KCk7CisJCQkKKwkJCUJJT19wcmludGYoYmlvX2VyciwiR2VuZXJhdGluZyBEU0EgcGFyYW1ldGVycywgJWQgYml0IGxvbmcgcHJpbWVcbiIsbnVtKTsKKwkJCWlmKCFkc2EgfHwgIURTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4KGRzYSwgbnVtLAorCQkJCQkJTlVMTCwgMCwgTlVMTCwgTlVMTCwgJmNiKSkKKwkJCQl7CisJCQkJaWYoZHNhKSBEU0FfZnJlZShkc2EpOworCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCisJCQlkaCA9IERTQV9kdXBfREgoZHNhKTsKKwkJCURTQV9mcmVlKGRzYSk7CisJCQlpZiAoZGggPT0gTlVMTCkKKwkJCQl7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisJCWVsc2UKKyNlbmRpZgorCQkJeworCQkJZGggPSBESF9uZXcoKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiR2VuZXJhdGluZyBESCBwYXJhbWV0ZXJzLCAlZCBiaXQgbG9uZyBzYWZlIHByaW1lLCBnZW5lcmF0b3IgJWRcbiIsbnVtLGcpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJUaGlzIGlzIGdvaW5nIHRvIHRha2UgYSBsb25nIHRpbWVcbiIpOworCQkJaWYoIWRoIHx8ICFESF9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4KGRoLCBudW0sIGcsICZjYikpCisJCQkJeworCQkJCWlmKGRoKSBESF9mcmVlKGRoKTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKworCQlhcHBfUkFORF93cml0ZV9maWxlKE5VTEwsIGJpb19lcnIpOworCX0gZWxzZSB7CisKKwkJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCQlpZiAoaW4gPT0gTlVMTCkKKwkJCXsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKGluZmlsZSA9PSBOVUxMKQorCQkJQklPX3NldF9mcChpbixzdGRpbixCSU9fTk9DTE9TRSk7CisJCWVsc2UKKwkJCXsKKwkJCWlmIChCSU9fcmVhZF9maWxlbmFtZShpbixpbmZpbGUpIDw9IDApCisJCQkJeworCQkJCXBlcnJvcihpbmZpbGUpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKworCQlpZgkoaW5mb3JtYXQgIT0gRk9STUFUX0FTTjEgJiYgaW5mb3JtYXQgIT0gRk9STUFUX1BFTSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIGlucHV0IGZvcm1hdCBzcGVjaWZpZWRcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkJaWYgKGRzYXBhcmFtKQorCQkJeworCQkJRFNBICpkc2E7CisJCQkKKwkJCWlmIChpbmZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJCQlkc2E9ZDJpX0RTQXBhcmFtc19iaW8oaW4sTlVMTCk7CisJCQllbHNlIC8qIGluZm9ybWF0ID09IEZPUk1BVF9QRU0gKi8KKwkJCQlkc2E9UEVNX3JlYWRfYmlvX0RTQXBhcmFtcyhpbixOVUxMLE5VTEwsTlVMTCk7CisJCQkKKwkJCWlmIChkc2EgPT0gTlVMTCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gbG9hZCBEU0EgcGFyYW1ldGVyc1xuIik7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQkKKwkJCWRoID0gRFNBX2R1cF9ESChkc2EpOworCQkJRFNBX2ZyZWUoZHNhKTsKKwkJCWlmIChkaCA9PSBOVUxMKQorCQkJCXsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJZWxzZQorI2VuZGlmCisJCQl7CisJCQlpZiAoaW5mb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCQkJZGg9ZDJpX0RIcGFyYW1zX2JpbyhpbixOVUxMKTsKKwkJCWVsc2UgLyogaW5mb3JtYXQgPT0gRk9STUFUX1BFTSAqLworCQkJCWRoPVBFTV9yZWFkX2Jpb19ESHBhcmFtcyhpbixOVUxMLE5VTEwsTlVMTCk7CisJCQkKKwkJCWlmIChkaCA9PSBOVUxMKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVuYWJsZSB0byBsb2FkIERIIHBhcmFtZXRlcnNcbiIpOworCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCQkKKwkJLyogZGggIT0gTlVMTCAqLworCX0KKwkKKwlvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChvdXQgPT0gTlVMTCkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmIChvdXRmaWxlID09IE5VTEwpCisJCXsKKwkJQklPX3NldF9mcChvdXQsc3Rkb3V0LEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJeworCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxvdXRmaWxlKSA8PSAwKQorCQkJeworCQkJcGVycm9yKG91dGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCisJaWYgKHRleHQpCisJCXsKKwkJREhwYXJhbXNfcHJpbnQob3V0LGRoKTsKKwkJfQorCQorCWlmIChjaGVjaykKKwkJeworCQlpZiAoIURIX2NoZWNrKGRoLCZpKSkKKwkJCXsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKGkgJiBESF9DSEVDS19QX05PVF9QUklNRSkKKwkJCXByaW50ZigicCB2YWx1ZSBpcyBub3QgcHJpbWVcbiIpOworCQlpZiAoaSAmIERIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUpCisJCQlwcmludGYoInAgdmFsdWUgaXMgbm90IGEgc2FmZSBwcmltZVxuIik7CisJCWlmIChpICYgREhfVU5BQkxFX1RPX0NIRUNLX0dFTkVSQVRPUikKKwkJCXByaW50ZigidW5hYmxlIHRvIGNoZWNrIHRoZSBnZW5lcmF0b3IgdmFsdWVcbiIpOworCQlpZiAoaSAmIERIX05PVF9TVUlUQUJMRV9HRU5FUkFUT1IpCisJCQlwcmludGYoInRoZSBnIHZhbHVlIGlzIG5vdCBhIGdlbmVyYXRvclxuIik7CisJCWlmIChpID09IDApCisJCQlwcmludGYoIkRIIHBhcmFtZXRlcnMgYXBwZWFyIHRvIGJlIG9rLlxuIik7CisJCX0KKwlpZiAoQykKKwkJeworCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQlpbnQgbGVuLGwsYml0czsKKworCQlsZW49Qk5fbnVtX2J5dGVzKGRoLT5wKTsKKwkJYml0cz1CTl9udW1fYml0cyhkaC0+cCk7CisJCWRhdGE9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhsZW4pOworCQlpZiAoZGF0YSA9PSBOVUxMKQorCQkJeworCQkJcGVycm9yKCJPUEVOU1NMX21hbGxvYyIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCXByaW50ZigiI2lmbmRlZiBIRUFERVJfREhfSFxuIgorCQkgICAgICAgIiNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+XG4iCisJCSAgICAgICAiI2VuZGlmXG4iKTsKKwkJcHJpbnRmKCJESCAqZ2V0X2RoJWQoKVxuXHR7XG4iLGJpdHMpOworCisJCWw9Qk5fYm4yYmluKGRoLT5wLGRhdGEpOworCQlwcmludGYoIlx0c3RhdGljIHVuc2lnbmVkIGNoYXIgZGglZF9wW109eyIsYml0cyk7CisJCWZvciAoaT0wOyBpPGw7IGkrKykKKwkJCXsKKwkJCWlmICgoaSUxMikgPT0gMCkgcHJpbnRmKCJcblx0XHQiKTsKKwkJCXByaW50ZigiMHglMDJYLCIsZGF0YVtpXSk7CisJCQl9CisJCXByaW50ZigiXG5cdFx0fTtcbiIpOworCisJCWw9Qk5fYm4yYmluKGRoLT5nLGRhdGEpOworCQlwcmludGYoIlx0c3RhdGljIHVuc2lnbmVkIGNoYXIgZGglZF9nW109eyIsYml0cyk7CisJCWZvciAoaT0wOyBpPGw7IGkrKykKKwkJCXsKKwkJCWlmICgoaSUxMikgPT0gMCkgcHJpbnRmKCJcblx0XHQiKTsKKwkJCXByaW50ZigiMHglMDJYLCIsZGF0YVtpXSk7CisJCQl9CisJCXByaW50ZigiXG5cdFx0fTtcbiIpOworCisJCXByaW50ZigiXHRESCAqZGg7XG5cbiIpOworCQlwcmludGYoIlx0aWYgKChkaD1ESF9uZXcoKSkgPT0gTlVMTCkgcmV0dXJuKE5VTEwpO1xuIik7CisJCXByaW50ZigiXHRkaC0+cD1CTl9iaW4yYm4oZGglZF9wLHNpemVvZihkaCVkX3ApLE5VTEwpO1xuIiwKKwkJCWJpdHMsYml0cyk7CisJCXByaW50ZigiXHRkaC0+Zz1CTl9iaW4yYm4oZGglZF9nLHNpemVvZihkaCVkX2cpLE5VTEwpO1xuIiwKKwkJCWJpdHMsYml0cyk7CisJCXByaW50ZigiXHRpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSlcbiIpOworCQlwcmludGYoIlx0XHR7IERIX2ZyZWUoZGgpOyByZXR1cm4oTlVMTCk7IH1cbiIpOworCQlpZiAoZGgtPmxlbmd0aCkKKwkJCXByaW50ZigiXHRkaC0+bGVuZ3RoID0gJWxkO1xuIiwgZGgtPmxlbmd0aCk7CisJCXByaW50ZigiXHRyZXR1cm4oZGgpO1xuXHR9XG4iKTsKKwkJT1BFTlNTTF9mcmVlKGRhdGEpOworCQl9CisKKworCWlmICghbm9vdXQpCisJCXsKKwkJaWYgCShvdXRmb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCQlpPWkyZF9ESHBhcmFtc19iaW8ob3V0LGRoKTsKKwkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCQlpPVBFTV93cml0ZV9iaW9fREhwYXJhbXMob3V0LGRoKTsKKwkJZWxzZQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBvdXRwdXQgZm9ybWF0IHNwZWNpZmllZCBmb3Igb3V0ZmlsZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKCFpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gd3JpdGUgREggcGFyYW1ldGVyc1xuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwlyZXQ9MDsKK2VuZDoKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCWlmIChvdXQgIT0gTlVMTCkgQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKGRoICE9IE5VTEwpIERIX2ZyZWUoZGgpOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQocmV0KTsKKwl9CisKKy8qIGRoX2NiIGlzIGlkZW50aWNhbCB0byBkc2FfY2IgaW4gYXBwcy9kc2FwYXJhbS5jICovCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGRoX2NiKGludCBwLCBpbnQgbiwgQk5fR0VOQ0IgKmNiKQorCXsKKwljaGFyIGM9JyonOworCisJaWYgKHAgPT0gMCkgYz0nLic7CisJaWYgKHAgPT0gMSkgYz0nKyc7CisJaWYgKHAgPT0gMikgYz0nKic7CisJaWYgKHAgPT0gMykgYz0nXG4nOworCUJJT193cml0ZShjYi0+YXJnLCZjLDEpOworCSh2b2lkKUJJT19mbHVzaChjYi0+YXJnKTsKKyNpZmRlZiBMSU5UCisJcD1uOworI2VuZGlmCisJcmV0dXJuIDE7CisJfQorCisjZWxzZSAvKiAhT1BFTlNTTF9OT19ESCAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZHNhLWNhLnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvZHNhLWNhLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2NjMTQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9kc2EtY2EucGVtCkBAIC0wLDAgKzEsNDAgQEAKKy0tLS0tQkVHSU4gRFNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUJ1Z0lCQUFLQmdRQ25QMjZGdjBGcUtYM3duMGNaTUpDYUNSM2Fhak1leFQyR2xyTVY0Rk11aitCWmduT1EKK1BuVXhtVWQ2VXZ1RjVObW1lemliYUlxRW00ZkdIclYraGt0VFcxblBjV1VaaUc3T1pxNXJpRGI3N0NqY3d0ZWwKK3UrVXNPU1pMMnBwd0dKVTNsUkJXSS9ZVjdib0VYdDQ1VC8yM1F4KzFwR1Z2ellBUjVIQ1ZXMUROU1FJVkFQY0gKK01lMzZiQVlEMVlXS0hLeWNaZWRRWm1WdkFvR0FUZDlNQTZhUml2VVpiMUJHSlpubGFHOHc0Mm5oNWJOZG1Mc28KK2hrajgzcGtFUDErSURKeHpKQTBnWGJrcW1qOFlsaWZrWW9mQmUzUmlVL3hoSjZoNmtRbWR0dkZObkZRUFdBYnUKK1NYUUh6bFYrSTg0VzlzcmNXbUVCZnNseHRVMzIzRFFwaDJqMlhpQ1RzOXYxNUFsc1FSZVZrdXNCdFhPbGFuN1kKK011ME9BcmdDZ1lBYXBsbDZpcXo5WHJaRmxrMkdDVmNCK0tpaHhXbkg3SXVIdlNMdzlZVXJKYWhjQkhtYnB2dDQKKzk0bEY0Z0M1dzNXUE0rdlhKb2ZidXNrNEdvUUVFc1FOTURhYWg0bTQ5dVVxQXlsT1ZGSkpKWHVpclZKK28rMFQKK3RPRkRJVEVBbCtZWlphcmlYT0Q3dGRPU09sOVJMTVBDNitkYUhLUzllNjh1M2VueGhxbkRHUUlVQjc4ZGhXNzcKK0o2enNGYlNFSGFRR1VtZlNlb009CistLS0tLUVORCBEU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KK01JSUNVakNDQWhFQ0FRQXdVakVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WQkFnVENsTnZiV1V0VTNSaGRHVXgKK0lUQWZCZ05WQkFvVEdFbHVkR1Z5Ym1WMElGZHBaR2RwZEhNZ1VIUjVJRXgwWkRFTE1Ba0dBMVVFQXhNQ1EwRXcKK2dnRzBNSUlCS1FZRkt3NERBZ3d3Z2dFZUFvR0JBS2MvYm9XL1FXb3BmZkNmUnhrd2tKb0pIZHBxTXg3RlBZYVcKK3N4WGdVeTZQNEZtQ2M1QStkVEdaUjNwUys0WGsyYVo3T0p0b2lvU2JoOFlldFg2R1MxTmJXYzl4WlJtSWJzNW0KK3JtdUlOdnZzS056QzE2Vzc1U3c1Smt2YW1uQVlsVGVWRUZZajloWHR1Z1JlM2psUC9iZERIN1drWlcvTmdCSGsKK2NKVmJVTTFKQWhVQTl3Y3g3ZnBzQmdQVmhZb2NySnhsNTFCbVpXOENnWUJOMzB3RHBwR0s5Umx2VUVZbG1lVm8KK2J6RGphZUhsczEyWXV5aUdTUHplbVFRL1g0Z01uSE1rRFNCZHVTcWFQeGlXSitSaWg4RjdkR0pUL0dFbnFIcVIKK0NaMjI4VTJjVkE5WUJ1NUpkQWZPVlg0anpoYjJ5dHhhWVFGK3lYRzFUZmJjTkNtSGFQWmVJSk96Mi9Ya0NXeEIKK0Y1V1M2d0cxYzZWcWZ0Z3k3UTRDdUFPQmhBQUNnWUFhcGxsNmlxejlYclpGbGsyR0NWY0IrS2loeFduSDdJdUgKK3ZTTHc5WVVySmFoY0JIbWJwdnQ0OTRsRjRnQzV3M1dQTSt2WEpvZmJ1c2s0R29RRUVzUU5NRGFhaDRtNDl1VXEKK0F5bE9WRkpKSlh1aXJWSitvKzBUdE9GRElURUFsK1laWmFyaVhPRDd0ZE9TT2w5UkxNUEM2K2RhSEtTOWU2OHUKKzNlbnhocW5ER2FBQU1Ba0dCU3NPQXdJYkJRQURNQUF3TFFJVkFKR1Z1RnNHLzBEQnVTWjBqRjd5cGRVMC9HMHYKK0FoUWZlRjVCb01NRGJYL2tpZFVWcFE2Z2FkUGxaQT09CistLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQnJqQ0NBV3dDQVFzd0NRWUZLdzREQWhzRkFEQlRNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNSworVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2hNWVNXNTBaWEp1WlhRZ1YybGtaMmwwY3lCUWRIa2dUSFJrTVF3dworQ2dZRFZRUURFd05RUTBFd0hoY05PVGN3TmpFMU1ESXhOREk1V2hjTk9UY3dOekUxTURJeE5ESTVXakJTTVFzdworQ1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNS1UyOXRaUzFUZEdGMFpURWhNQjhHQTFVRUNoTVlTVzUwWlhKdQorWlhRZ1YybGtaMmwwY3lCUWRIa2dUSFJrTVFzd0NRWURWUVFERXdKRFFUQ0JrakFKQmdVckRnTUNEQVVBQTRHRQorQUFLQmdCcW1XWHFLclAxZXRrV1dUWVlKVndINHFLSEZhY2ZzaTRlOUl2RDFoU3NscUZ3RWVadW0rM2ozaVVYaQorQUxuRGRZOHo2OWNtaDl1NnlUZ2FoQVFTeEEwd05wcUhpYmoyNVNvREtVNVVVa2tsZTZLdFVuNmo3Uk8wNFVNaAorTVFDWDVobGxxdUpjNFB1MTA1STZYMUVzdzhMcjUxb2NwTDE3cnk3ZDZmR0dxY01aTUFrR0JTc09Bd0liQlFBRAorTVFBd0xnSVZBSjR3dFFzQU5QeEhvN1E0SVFaWXNMMTJTS2RiQWhVQWpKOW4zOHp4VCtpYWkyMTY0eFMrTElmYQorQzFRPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2RzYS1wY2EucGVtIGIvbGliL29wZW5zc2wvYXBwcy9kc2EtcGNhLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjM3NzRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9kc2EtcGNhLnBlbQpAQCAtMCwwICsxLDQ2IEBACistLS0tLUJFR0lOIERTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlCdkFJQkFBS0JnUUNuUDI2RnYwRnFLWDN3bjBjWk1KQ2FDUjNhYWpNZXhUMkdsck1WNEZNdWorQlpnbk9RCitQblV4bVVkNlV2dUY1Tm1tZXppYmFJcUVtNGZHSHJWK2hrdFRXMW5QY1dVWmlHN09acTVyaURiNzdDamN3dGVsCit1K1VzT1NaTDJwcHdHSlUzbFJCV0kvWVY3Ym9FWHQ0NVQvMjNReCsxcEdWdnpZQVI1SENWVzFETlNRSVZBUGNICitNZTM2YkFZRDFZV0tIS3ljWmVkUVptVnZBb0dBVGQ5TUE2YVJpdlVaYjFCR0pabmxhRzh3NDJuaDViTmRtTHNvCitoa2o4M3BrRVAxK0lESnh6SkEwZ1hia3FtajhZbGlma1lvZkJlM1JpVS94aEo2aDZrUW1kdHZGTm5GUVBXQWJ1CitTWFFIemxWK0k4NFc5c3JjV21FQmZzbHh0VTMyM0RRcGgyajJYaUNUczl2MTVBbHNRUmVWa3VzQnRYT2xhbjdZCitNdTBPQXJnQ2dZRUFwdTI1SGtCMWI0Z0tNSVY3YUxHTlNJa25NellnckI3bzFrUXhlRGYzNGREVlJNOU9aOHRrCit1bXo2dGwraVVjTmU1RW94ZHNZVjFJWFNkZGpPaTA4TE9Mc1pxN0FRbE5uS3ZidGxtTURVTHBxa1pKRDBiTzdBCisyOW5pc0pmS3kxVVJxQUJMdzVEZ2ZjUGgxWkxYdG1EZlVnSnZtamdUbXZUUFQyajlUUGpxN1JVQ0ZRRE52ckJ6Cis2VGljZkltVTdVRlJuOWgwMGowbEpRPT0KKy0tLS0tRU5EIERTQSBQUklWQVRFIEtFWS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQorTUlJQ1ZUQ0NBaE1DQVFBd1V6RUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xOdmJXVXRVM1JoZEdVeAorSVRBZkJnTlZCQW9UR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaREVNTUFvR0ExVUVBeE1EVUVOQgorTUlJQnRUQ0NBU2tHQlNzT0F3SU1NSUlCSGdLQmdRQ25QMjZGdjBGcUtYM3duMGNaTUpDYUNSM2Fhak1leFQyRworbHJNVjRGTXVqK0JaZ25PUVBuVXhtVWQ2VXZ1RjVObW1lemliYUlxRW00ZkdIclYraGt0VFcxblBjV1VaaUc3TworWnE1cmlEYjc3Q2pjd3RlbHUrVXNPU1pMMnBwd0dKVTNsUkJXSS9ZVjdib0VYdDQ1VC8yM1F4KzFwR1Z2ellBUgorNUhDVlcxRE5TUUlWQVBjSE1lMzZiQVlEMVlXS0hLeWNaZWRRWm1WdkFvR0FUZDlNQTZhUml2VVpiMUJHSlpubAorYUc4dzQybmg1Yk5kbUxzb2hrajgzcGtFUDErSURKeHpKQTBnWGJrcW1qOFlsaWZrWW9mQmUzUmlVL3hoSjZoNgora1FtZHR2Rk5uRlFQV0FidVNYUUh6bFYrSTg0VzlzcmNXbUVCZnNseHRVMzIzRFFwaDJqMlhpQ1RzOXYxNUFscworUVJlVmt1c0J0WE9sYW43WU11ME9BcmdEZ1lVQUFvR0JBS2J0dVI1QWRXK0lDakNGZTJpeGpVaUpKek0ySUt3ZQorNk5aRU1YZzM5K0hRMVVUUFRtZkxaTHBzK3JaZm9sSERYdVJLTVhiR0ZkU0YwblhZem90UEN6aTdHYXV3RUpUWgoreXIyN1paakExQzZhcEdTUTlHenV3TnZaNHJDWHlzdFZFYWdBUzhPUTRIM0Q0ZFdTMTdaZzMxSUNiNW80RTVyMAorejA5by9VejQ2dTBWb0FBd0NRWUZLdzREQWhzRkFBTXhBREF1QWhVQXJSdWJUeHNiSVh5M0FodGpROTQzQWJOQgorblNJQ0ZRQ3UrZzFpVzNqd0YrZ09jYnJvRDRTL1pjdkIzdz09CistLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQzB6Q0NBcEVDQVFBd0NRWUZLdzREQWhzRkFEQlRNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNSworVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2hNWVNXNTBaWEp1WlhRZ1YybGtaMmwwY3lCUWRIa2dUSFJrTVF3dworQ2dZRFZRUURFd05RUTBFd0hoY05PVGN3TmpFME1qSTFORFExV2hjTk9UY3dOekUwTWpJMU5EUTFXakJUTVFzdworQ1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNS1UyOXRaUzFUZEdGMFpURWhNQjhHQTFVRUNoTVlTVzUwWlhKdQorWlhRZ1YybGtaMmwwY3lCUWRIa2dUSFJrTVF3d0NnWURWUVFERXdOUVEwRXdnZ0cxTUlJQktRWUZLdzREQWd3dworZ2dFZUFvR0JBS2MvYm9XL1FXb3BmZkNmUnhrd2tKb0pIZHBxTXg3RlBZYVdzeFhnVXk2UDRGbUNjNUErZFRHWgorUjNwUys0WGsyYVo3T0p0b2lvU2JoOFlldFg2R1MxTmJXYzl4WlJtSWJzNW1ybXVJTnZ2c0tOekMxNlc3NVN3NQorSmt2YW1uQVlsVGVWRUZZajloWHR1Z1JlM2psUC9iZERIN1drWlcvTmdCSGtjSlZiVU0xSkFoVUE5d2N4N2ZwcworQmdQVmhZb2NySnhsNTFCbVpXOENnWUJOMzB3RHBwR0s5Umx2VUVZbG1lVm9iekRqYWVIbHMxMll1eWlHU1B6ZQorbVFRL1g0Z01uSE1rRFNCZHVTcWFQeGlXSitSaWg4RjdkR0pUL0dFbnFIcVJDWjIyOFUyY1ZBOVlCdTVKZEFmTworVlg0anpoYjJ5dHhhWVFGK3lYRzFUZmJjTkNtSGFQWmVJSk96Mi9Ya0NXeEJGNVdTNndHMWM2VnFmdGd5N1E0QwordUFPQmhRQUNnWUVBcHUyNUhrQjFiNGdLTUlWN2FMR05TSWtuTXpZZ3JCN28xa1F4ZURmMzRkRFZSTTlPWjh0awordW16NnRsK2lVY05lNUVveGRzWVYxSVhTZGRqT2kwOExPTHNacTdBUWxObkt2YnRsbU1EVUxwcWtaSkQwYk83QQorMjluaXNKZkt5MVVScUFCTHc1RGdmY1BoMVpMWHRtRGZVZ0p2bWpnVG12VFBUMmo5VFBqcTdSVXdDUVlGS3c0RAorQWhzRkFBTXhBREF1QWhVQXZ0djZBa01vbGl4MUp2eTNVblZFSVVxZENVSUNGUUMranE4UDQ5bXdyWTlvSjI0bgorNXJLVWpOQmhTZz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZHNhLmMgYi9saWIvb3BlbnNzbC9hcHBzL2RzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMjI0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2RzYS5jCkBAIC0wLDAgKzEsMzc2IEBACisvKiBhcHBzL2RzYS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CS8qIGZvciBPUEVOU1NMX05PX0RTQSAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCWRzYV9tYWluCisKKy8qIC1pbmZvcm0gYXJnCS0gaW5wdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0gKG9uZSBvZiBERVIsIE5FVCBvciBQRU0pCisgKiAtb3V0Zm9ybSBhcmcgLSBvdXRwdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0KKyAqIC1pbiBhcmcJLSBpbnB1dCBmaWxlIC0gZGVmYXVsdCBzdGRpbgorICogLW91dCBhcmcJLSBvdXRwdXQgZmlsZSAtIGRlZmF1bHQgc3Rkb3V0CisgKiAtZGVzCQktIGVuY3J5cHQgb3V0cHV0IGlmIFBFTSBmb3JtYXQgd2l0aCBERVMgaW4gY2JjIG1vZGUKKyAqIC1kZXMzCS0gZW5jcnlwdCBvdXRwdXQgaWYgUEVNIGZvcm1hdAorICogLWlkZWEJLSBlbmNyeXB0IG91dHB1dCBpZiBQRU0gZm9ybWF0CisgKiAtYWVzMTI4CS0gZW5jcnlwdCBvdXRwdXQgaWYgUEVNIGZvcm1hdAorICogLWFlczE5MgktIGVuY3J5cHQgb3V0cHV0IGlmIFBFTSBmb3JtYXQKKyAqIC1hZXMyNTYJLSBlbmNyeXB0IG91dHB1dCBpZiBQRU0gZm9ybWF0CisgKiAtY2FtZWxsaWExMjggLSBlbmNyeXB0IG91dHB1dCBpZiBQRU0gZm9ybWF0CisgKiAtY2FtZWxsaWExOTIgLSBlbmNyeXB0IG91dHB1dCBpZiBQRU0gZm9ybWF0CisgKiAtY2FtZWxsaWEyNTYgLSBlbmNyeXB0IG91dHB1dCBpZiBQRU0gZm9ybWF0CisgKiAtc2VlZCAgICAgICAgLSBlbmNyeXB0IG91dHB1dCBpZiBQRU0gZm9ybWF0CisgKiAtdGV4dAktIHByaW50IGEgdGV4dCB2ZXJzaW9uCisgKiAtbW9kdWx1cwktIHByaW50IHRoZSBEU0EgcHVibGljIGtleQorICovCisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJRU5HSU5FICplID0gTlVMTDsKKwlpbnQgcmV0PTE7CisJRFNBICpkc2E9TlVMTDsKKwlpbnQgaSxiYWRvcHM9MDsKKwljb25zdCBFVlBfQ0lQSEVSICplbmM9TlVMTDsKKwlCSU8gKmluPU5VTEwsKm91dD1OVUxMOworCWludCBpbmZvcm1hdCxvdXRmb3JtYXQsdGV4dD0wLG5vb3V0PTA7CisJaW50IHB1YmluID0gMCwgcHVib3V0ID0gMDsKKwljaGFyICppbmZpbGUsKm91dGZpbGUsKnByb2c7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lOworI2VuZGlmCisJY2hhciAqcGFzc2FyZ2luID0gTlVMTCwgKnBhc3NhcmdvdXQgPSBOVUxMOworCWNoYXIgKnBhc3NpbiA9IE5VTEwsICpwYXNzb3V0ID0gTlVMTDsKKwlpbnQgbW9kdWx1cz0wOworCisJaW50IHB2a19lbmNyID0gMjsKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJaWYgKChiaW9fZXJyPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoYmlvX2VycixzdGRlcnIsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwllbmdpbmU9TlVMTDsKKyNlbmRpZgorCWluZmlsZT1OVUxMOworCW91dGZpbGU9TlVMTDsKKwlpbmZvcm1hdD1GT1JNQVRfUEVNOworCW91dGZvcm1hdD1GT1JNQVRfUEVNOworCisJcHJvZz1hcmd2WzBdOworCWFyZ2MtLTsKKwlhcmd2Kys7CisJd2hpbGUgKGFyZ2MgPj0gMSkKKwkJeworCQlpZiAJKHN0cmNtcCgqYXJndiwiLWluZm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dGZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0Zm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5maWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBhc3NpbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwYXNzYXJnaW49ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcGFzc291dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwYXNzYXJnb3V0PSAqKCsrYXJndik7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVuZ2luZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQllbmdpbmU9ICooKythcmd2KTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wdmstc3Ryb25nIikgPT0gMCkKKwkJCXB2a19lbmNyPTI7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXB2ay13ZWFrIikgPT0gMCkKKwkJCXB2a19lbmNyPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXB2ay1ub25lIikgPT0gMCkKKwkJCXB2a19lbmNyPTA7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vb3V0IikgPT0gMCkKKwkJCW5vb3V0PTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXRleHQiKSA9PSAwKQorCQkJdGV4dD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1tb2R1bHVzIikgPT0gMCkKKwkJCW1vZHVsdXM9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHViaW4iKSA9PSAwKQorCQkJcHViaW49MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHVib3V0IikgPT0gMCkKKwkJCXB1Ym91dD0xOworCQllbHNlIGlmICgoZW5jPUVWUF9nZXRfY2lwaGVyYnluYW1lKCYoYXJndlswXVsxXSkpKSA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmtub3duIG9wdGlvbiAlc1xuIiwqYXJndik7CisJCQliYWRvcHM9MTsKKwkJCWJyZWFrOworCQkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCisJaWYgKGJhZG9wcykKKwkJeworYmFkOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIFtvcHRpb25zXSA8aW5maWxlID5vdXRmaWxlXG4iLHByb2cpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIndoZXJlIG9wdGlvbnMgYXJlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluZm9ybSBhcmcgICAgIGlucHV0IGZvcm1hdCAtIERFUiBvciBQRU1cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtb3V0Zm9ybSBhcmcgICAgb3V0cHV0IGZvcm1hdCAtIERFUiBvciBQRU1cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaW4gYXJnICAgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1wYXNzaW4gYXJnICAgICBpbnB1dCBmaWxlIHBhc3MgcGhyYXNlIHNvdXJjZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vdXQgYXJnICAgICAgICBvdXRwdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1wYXNzb3V0IGFyZyAgICBvdXRwdXQgZmlsZSBwYXNzIHBocmFzZSBzb3VyY2VcbiIpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtZW5naW5lIGUgICAgICAgdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIpOworI2VuZGlmCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1kZXMgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgZGVzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWRlczMgICAgICAgICAgIGVuY3J5cHQgUEVNIG91dHB1dCB3aXRoIGVkZSBjYmMgZGVzIHVzaW5nIDE2OCBiaXQga2V5XG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1pZGVhICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgaWRlYVxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWFlczEyOCwgLWFlczE5MiwgLWFlczI1NlxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgYWVzXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1jYW1lbGxpYTEyOCwgLWNhbWVsbGlhMTkyLCAtY2FtZWxsaWEyNTZcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgZW5jcnlwdCBQRU0gb3V0cHV0IHdpdGggY2JjIGNhbWVsbGlhXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXNlZWQgICAgICAgICAgIGVuY3J5cHQgUEVNIG91dHB1dCB3aXRoIGNiYyBzZWVkXG4iKTsKKyNlbmRpZgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtdGV4dCAgICAgICAgICAgcHJpbnQgdGhlIGtleSBpbiB0ZXh0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vb3V0ICAgICAgICAgIGRvbid0IHByaW50IGtleSBvdXRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbW9kdWx1cyAgICAgICAgcHJpbnQgdGhlIERTQSBwdWJsaWMgdmFsdWVcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmdpbiwgcGFzc2FyZ291dCwgJnBhc3NpbiwgJnBhc3NvdXQpKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgcGFzc3dvcmRzXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCW91dD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKChpbiA9PSBOVUxMKSB8fCAob3V0ID09IE5VTEwpKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoaW5maWxlID09IE5VTEwpCisJCUJJT19zZXRfZnAoaW4sc3RkaW4sQklPX05PQ0xPU0UpOworCWVsc2UKKwkJeworCQlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4saW5maWxlKSA8PSAwKQorCQkJeworCQkJcGVycm9yKGluZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJQklPX3ByaW50ZihiaW9fZXJyLCJyZWFkIERTQSBrZXlcbiIpOworCisJCXsKKwkJRVZQX1BLRVkJKnBrZXk7CisKKwkJaWYgKHB1YmluKQorCQkJcGtleSA9IGxvYWRfcHVia2V5KGJpb19lcnIsIGluZmlsZSwgaW5mb3JtYXQsIDEsCisJCQkJcGFzc2luLCBlLCAiUHVibGljIEtleSIpOworCQllbHNlCisJCQlwa2V5ID0gbG9hZF9rZXkoYmlvX2VyciwgaW5maWxlLCBpbmZvcm1hdCwgMSwKKwkJCQlwYXNzaW4sIGUsICJQcml2YXRlIEtleSIpOworCisJCWlmIChwa2V5KQorCQkJeworCQkJZHNhID0gRVZQX1BLRVlfZ2V0MV9EU0EocGtleSk7CisJCQlFVlBfUEtFWV9mcmVlKHBrZXkpOworCQkJfQorCQl9CisJaWYgKGRzYSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGxvYWQgS2V5XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChvdXRmaWxlID09IE5VTEwpCisJCXsKKwkJQklPX3NldF9mcChvdXQsc3Rkb3V0LEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJeworCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxvdXRmaWxlKSA8PSAwKQorCQkJeworCQkJcGVycm9yKG91dGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmICh0ZXh0KSAKKwkJaWYgKCFEU0FfcHJpbnQob3V0LGRzYSwwKSkKKwkJCXsKKwkJCXBlcnJvcihvdXRmaWxlKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCWlmIChtb2R1bHVzKQorCQl7CisJCWZwcmludGYoc3Rkb3V0LCJQdWJsaWMgS2V5PSIpOworCQlCTl9wcmludChvdXQsZHNhLT5wdWJfa2V5KTsKKwkJZnByaW50ZihzdGRvdXQsIlxuIik7CisJCX0KKworCWlmIChub291dCkgZ290byBlbmQ7CisJQklPX3ByaW50ZihiaW9fZXJyLCJ3cml0aW5nIERTQSBrZXlcbiIpOworCWlmIAkob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKSB7CisJCWlmKHB1YmluIHx8IHB1Ym91dCkgaT1pMmRfRFNBX1BVQktFWV9iaW8ob3V0LGRzYSk7CisJCWVsc2UgaT1pMmRfRFNBUHJpdmF0ZUtleV9iaW8ob3V0LGRzYSk7CisJfSBlbHNlIGlmIChvdXRmb3JtYXQgPT0gRk9STUFUX1BFTSkgeworCQlpZihwdWJpbiB8fCBwdWJvdXQpCisJCQlpPVBFTV93cml0ZV9iaW9fRFNBX1BVQktFWShvdXQsZHNhKTsKKwkJZWxzZSBpPVBFTV93cml0ZV9iaW9fRFNBUHJpdmF0ZUtleShvdXQsZHNhLGVuYywKKwkJCQkJCQlOVUxMLDAsTlVMTCwgcGFzc291dCk7CisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19SU0EpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fUkM0KQorCX0gZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9NU0JMT0IgfHwgb3V0Zm9ybWF0ID09IEZPUk1BVF9QVkspIHsKKwkJRVZQX1BLRVkgKnBrOworCQlwayA9IEVWUF9QS0VZX25ldygpOworCQlFVlBfUEtFWV9zZXQxX0RTQShwaywgZHNhKTsKKwkJaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUFZLKQorCQkJaSA9IGkyYl9QVktfYmlvKG91dCwgcGssIHB2a19lbmNyLCAwLCBwYXNzb3V0KTsKKwkJZWxzZSBpZiAocHViaW4gfHwgcHVib3V0KQorCQkJaSA9IGkyYl9QdWJsaWNLZXlfYmlvKG91dCwgcGspOworCQllbHNlCisJCQlpID0gaTJiX1ByaXZhdGVLZXlfYmlvKG91dCwgcGspOworCQlFVlBfUEtFWV9mcmVlKHBrKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBvdXRmaWxlXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAoaSA8PSAwKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIHdyaXRlIHByaXZhdGUga2V5XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJfQorCWVsc2UKKwkJcmV0PTA7CitlbmQ6CisJaWYoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCWlmKG91dCAhPSBOVUxMKSBCSU9fZnJlZV9hbGwob3V0KTsKKwlpZihkc2EgIT0gTlVMTCkgRFNBX2ZyZWUoZHNhKTsKKwlpZihwYXNzaW4pIE9QRU5TU0xfZnJlZShwYXNzaW4pOworCWlmKHBhc3NvdXQpIE9QRU5TU0xfZnJlZShwYXNzb3V0KTsKKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQorI2Vsc2UgLyogIU9QRU5TU0xfTk9fRFNBICovCisKKyMgaWYgUEVEQU5USUMKK3N0YXRpYyB2b2lkICpkdW1teT0mZHVtbXk7CisjIGVuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9kc2ExMDI0LnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvZHNhMTAyNC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyZGVjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvZHNhMTAyNC5wZW0KQEAgLTAsMCArMSw5IEBACistLS0tLUJFR0lOIERTQSBQQVJBTUVURVJTLS0tLS0KK01JSUJIZ0tCZ1FDblAyNkZ2MEZxS1gzd24wY1pNSkNhQ1IzYWFqTWV4VDJHbHJNVjRGTXVqK0JaZ25PUVBuVXgKK21VZDZVdnVGNU5tbWV6aWJhSXFFbTRmR0hyVitoa3RUVzFuUGNXVVppRzdPWnE1cmlEYjc3Q2pjd3RlbHUrVXMKK09TWkwycHB3R0pVM2xSQldJL1lWN2JvRVh0NDVULzIzUXgrMXBHVnZ6WUFSNUhDVlcxRE5TUUlWQVBjSE1lMzYKK2JBWUQxWVdLSEt5Y1plZFFabVZ2QW9HQVRkOU1BNmFSaXZVWmIxQkdKWm5sYUc4dzQybmg1Yk5kbUxzb2hrajgKKzNwa0VQMStJREp4ekpBMGdYYmtxbWo4WWxpZmtZb2ZCZTNSaVUveGhKNmg2a1FtZHR2Rk5uRlFQV0FidVNYUUgKK3psVitJODRXOXNyY1dtRUJmc2x4dFUzMjNEUXBoMmoyWGlDVHM5djE1QWxzUVJlVmt1c0J0WE9sYW43WU11ME8KK0FyZz0KKy0tLS0tRU5EIERTQSBQQVJBTUVURVJTLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZHNhNTEyLnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvZHNhNTEyLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjg2ZDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9kc2E1MTIucGVtCkBAIC0wLDAgKzEsNiBAQAorLS0tLS1CRUdJTiBEU0EgUEFSQU1FVEVSUy0tLS0tCitNSUdkQWtFQW5SdHBqaWJiOGlzUmNCbUc5aG5JK0JueUdGT1VSZ2JRWWxBelN3SThVakFEaXp2NVg5RWtCazk3CitUTHFxUUp2OWx1UTNNN3N0V3RkYUVVQm1vblo5TVFJVkFQdFQ3MUMwUUpJeFZvWlRldWlMSXBwSiszR1BBa0VBCitnejZJNWNXSmM4NDdiQUZKdjdQSG53cnFSSkhsTUtyWnZsdGZ0eERYaWJlT2RQdlBLUjdycUN4VVViZ1EzcURPCitMOHdrYTVCMzNxSm9wbElTb2dPZElBPT0KKy0tLS0tRU5EIERTQSBQQVJBTUVURVJTLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZHNhcC5wZW0gYi9saWIvb3BlbnNzbC9hcHBzL2RzYXAucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGZkYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2RzYXAucGVtCkBAIC0wLDAgKzEsNiBAQAorLS0tLS1CRUdJTiBEU0EgUEFSQU1FVEVSUy0tLS0tCitNSUdjQWtFQStaaUtFdlptYzlNdG5hRlpoNE5pWjNvWlM0SjFQSHZQcm05TVhqNW50VmhlRFBrZG1CRFRuY3lhCitHQUpjTWp3c3lCL0d2TERHZDZ5R0N3LzhlRiswOXdJVkFLM1ZhZ094R2QvUTRBZjVOYnhSNUZCN0NYRWpBa0EyCit0L3E3SGdWTGkwS2VLdmNERzhCUmwzd3V5N2JDdnBqZ3RXaUpjL3RwdmN1emV1QWF5SDg5VW9makFHdWVLalhECitBRGlSZmZ2U2Rock53NWRrcWRxbAorLS0tLS1FTkQgRFNBIFBBUkFNRVRFUlMtLS0tLQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9kc2FwYXJhbS5jIGIvbGliL29wZW5zc2wvYXBwcy9kc2FwYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMDVhNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2RzYXBhcmFtLmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qIGFwcHMvZHNhcGFyYW0uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgkvKiBmb3IgT1BFTlNTTF9OT19EU0EgKi8KKy8qIFVudGlsIHRoZSBrZXktZ2VuIGNhbGxiYWNrcyBhcmUgbW9kaWZpZWQgdG8gdXNlIG5ld2VyIHByb3RvdHlwZXMsIHdlIGFsbG93CisgKiBkZXByZWNhdGVkIGZ1bmN0aW9ucyBmb3Igb3BlbnNzbC1pbnRlcm5hbCBjb2RlICovCisjaWZkZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjdW5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRwlkc2FwYXJhbV9tYWluCisKKy8qIC1pbmZvcm0gYXJnCS0gaW5wdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0gKERFUiBvciBQRU0pCisgKiAtb3V0Zm9ybSBhcmcgLSBvdXRwdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0KKyAqIC1pbiBhcmcJLSBpbnB1dCBmaWxlIC0gZGVmYXVsdCBzdGRpbgorICogLW91dCBhcmcJLSBvdXRwdXQgZmlsZSAtIGRlZmF1bHQgc3Rkb3V0CisgKiAtbm9vdXQKKyAqIC10ZXh0CisgKiAtQworICogLW5vb3V0CisgKiAtZ2Vua2V5CisgKiAgI2lmZGVmIEdFTkNCX1RFU1QKKyAqIC10aW1lYm9tYiBuICAtIGludGVycnVwdCBrZXlnZW4gYWZ0ZXIgPG4+IHNlY29uZHMKKyAqICAjZW5kaWYKKyAqLworCisjaWZkZWYgR0VOQ0JfVEVTVAorCitzdGF0aWMgaW50IHN0b3Bfa2V5Z2VuX2ZsYWcgPSAwOworCitzdGF0aWMgdm9pZCB0aW1lYm9tYl9zaWdhbGFybShpbnQgZm9vKQorCXsKKwlzdG9wX2tleWdlbl9mbGFnID0gMTsKKwl9CisKKyNlbmRpZgorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGRzYV9jYihpbnQgcCwgaW50IG4sIEJOX0dFTkNCICpjYik7CisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJRU5HSU5FICplID0gTlVMTDsKKyNlbmRpZgorCURTQSAqZHNhPU5VTEw7CisJaW50IGksYmFkb3BzPTAsdGV4dD0wOworCUJJTyAqaW49TlVMTCwqb3V0PU5VTEw7CisJaW50IGluZm9ybWF0LG91dGZvcm1hdCxub291dD0wLEM9MCxyZXQ9MTsKKwljaGFyICppbmZpbGUsKm91dGZpbGUsKnByb2csKmlucmFuZD1OVUxMOworCWludCBudW1iaXRzPSAtMSxudW0sZ2Vua2V5PTA7CisJaW50IG5lZWRfcmFuZD0wOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWNoYXIgKmVuZ2luZT1OVUxMOworI2VuZGlmCisjaWZkZWYgR0VOQ0JfVEVTVAorCWludCB0aW1lYm9tYj0wOworI2VuZGlmCisKKwlhcHBzX3N0YXJ0dXAoKTsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJaW5maWxlPU5VTEw7CisJb3V0ZmlsZT1OVUxMOworCWluZm9ybWF0PUZPUk1BVF9QRU07CisJb3V0Zm9ybWF0PUZPUk1BVF9QRU07CisKKwlwcm9nPWFyZ3ZbMF07CisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmIAkoc3RyY21wKCphcmd2LCItaW5mb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWluZm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0Zm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZpbGU9ICooKythcmd2KTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJZWxzZSBpZihzdHJjbXAoKmFyZ3YsICItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWVuZ2luZSA9ICooKythcmd2KTsKKwkJCX0KKyNlbmRpZgorI2lmZGVmIEdFTkNCX1RFU1QKKwkJZWxzZSBpZihzdHJjbXAoKmFyZ3YsICItdGltZWJvbWIiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJdGltZWJvbWIgPSBhdG9pKCooKythcmd2KSk7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdGV4dCIpID09IDApCisJCQl0ZXh0PTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUMiKSA9PSAwKQorCQkJQz0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1nZW5rZXkiKSA9PSAwKQorCQkJeworCQkJZ2Vua2V5PTE7CisJCQluZWVkX3JhbmQ9MTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcmFuZCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbnJhbmQ9ICooKythcmd2KTsKKwkJCW5lZWRfcmFuZD0xOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub291dCIpID09IDApCisJCQlub291dD0xOworCQllbHNlIGlmIChzc2NhbmYoKmFyZ3YsIiVkIiwmbnVtKSA9PSAxKQorCQkJeworCQkJLyogZ2VuZXJhdGUgYSBrZXkgKi8KKwkJCW51bWJpdHM9bnVtOworCQkJbmVlZF9yYW5kPTE7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJXNcbiIsKmFyZ3YpOworCQkJYmFkb3BzPTE7CisJCQlicmVhazsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKworCWlmIChiYWRvcHMpCisJCXsKK2JhZDoKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlcyBbb3B0aW9uc10gW2JpdHNdIDxpbmZpbGUgPm91dGZpbGVcbiIscHJvZyk7CisJCUJJT19wcmludGYoYmlvX2Vyciwid2hlcmUgb3B0aW9ucyBhcmVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaW5mb3JtIGFyZyAgIGlucHV0IGZvcm1hdCAtIERFUiBvciBQRU1cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtb3V0Zm9ybSBhcmcgIG91dHB1dCBmb3JtYXQgLSBERVIgb3IgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluIGFyZyAgICAgICBpbnB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dCBhcmcgICAgICBvdXRwdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC10ZXh0ICAgICAgICAgcHJpbnQgYXMgdGV4dFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1DICAgICAgICAgICAgT3V0cHV0IEMgY29kZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1ub291dCAgICAgICAgbm8gb3V0cHV0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWdlbmtleSAgICAgICBnZW5lcmF0ZSBhIERTQSBrZXlcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcmFuZCAgICAgICAgIGZpbGVzIHRvIHVzZSBmb3IgcmFuZG9tIG51bWJlciBpbnB1dFxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1lbmdpbmUgZSAgICAgdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIpOworI2VuZGlmCisjaWZkZWYgR0VOQ0JfVEVTVAorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtdGltZWJvbWIgbiAgIGludGVycnVwdCBrZXlnZW4gYWZ0ZXIgPG4+IHNlY29uZHNcbiIpOworI2VuZGlmCisJCUJJT19wcmludGYoYmlvX2VyciwiIG51bWJlciAgICAgICAgbnVtYmVyIG9mIGJpdHMgdG8gdXNlIGZvciBnZW5lcmF0aW5nIHByaXZhdGUga2V5XG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAoKGluID09IE5VTEwpIHx8IChvdXQgPT0gTlVMTCkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChpbmZpbGUgPT0gTlVMTCkKKwkJQklPX3NldF9mcChpbixzdGRpbixCSU9fTk9DTE9TRSk7CisJZWxzZQorCQl7CisJCWlmIChCSU9fcmVhZF9maWxlbmFtZShpbixpbmZpbGUpIDw9IDApCisJCQl7CisJCQlwZXJyb3IoaW5maWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJaWYgKG91dGZpbGUgPT0gTlVMTCkKKwkJeworCQlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQl7CisJCUJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCX0KKyNlbmRpZgorCQl9CisJZWxzZQorCQl7CisJCWlmIChCSU9fd3JpdGVfZmlsZW5hbWUob3V0LG91dGZpbGUpIDw9IDApCisJCQl7CisJCQlwZXJyb3Iob3V0ZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgICAgIGUgPSBzZXR1cF9lbmdpbmUoYmlvX2VyciwgZW5naW5lLCAwKTsKKyNlbmRpZgorCisJaWYgKG5lZWRfcmFuZCkKKwkJeworCQlhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgKGlucmFuZCAhPSBOVUxMKSk7CisJCWlmIChpbnJhbmQgIT0gTlVMTCkKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJWxkIHNlbWktcmFuZG9tIGJ5dGVzIGxvYWRlZFxuIiwKKwkJCQlhcHBfUkFORF9sb2FkX2ZpbGVzKGlucmFuZCkpOworCQl9CisKKwlpZiAobnVtYml0cyA+IDApCisJCXsKKwkJQk5fR0VOQ0IgY2I7CisJCUJOX0dFTkNCX3NldCgmY2IsIGRzYV9jYiwgYmlvX2Vycik7CisJCWFzc2VydChuZWVkX3JhbmQpOworCQlkc2EgPSBEU0FfbmV3KCk7CisJCWlmKCFkc2EpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkVycm9yIGFsbG9jYXRpbmcgRFNBIG9iamVjdFxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJQklPX3ByaW50ZihiaW9fZXJyLCJHZW5lcmF0aW5nIERTQSBwYXJhbWV0ZXJzLCAlZCBiaXQgbG9uZyBwcmltZVxuIixudW0pOworCSAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJUaGlzIGNvdWxkIHRha2Ugc29tZSB0aW1lXG4iKTsKKyNpZmRlZiBHRU5DQl9URVNUCisJCWlmKHRpbWVib21iID4gMCkKKwl7CisJCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCQlhY3Quc2FfaGFuZGxlciA9IHRpbWVib21iX3NpZ2FsYXJtOworCQlhY3Quc2FfZmxhZ3MgPSAwOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIih0aG91Z2ggSSdsbCBzdG9wIGl0IGlmIG5vdCBkb25lIHdpdGhpbiAlZCBzZWNzKVxuIiwKKwkJCQl0aW1lYm9tYik7CisJCWlmKHNpZ2FjdGlvbihTSUdBTFJNLCAmYWN0LCBOVUxMKSAhPSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJFcnJvciwgY291bGRuJ3Qgc2V0IFNJR0FMUk0gaGFuZGxlclxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJYWxhcm0odGltZWJvbWIpOworCX0KKyNlbmRpZgorCSAgICAgICAgaWYoIURTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4KGRzYSxudW0sTlVMTCwwLE5VTEwsTlVMTCwgJmNiKSkKKwkJCXsKKyNpZmRlZiBHRU5DQl9URVNUCisJCQlpZihzdG9wX2tleWdlbl9mbGFnKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkRTQSBrZXkgZ2VuZXJhdGlvbiB0aW1lLXN0b3BwZWRcbiIpOworCQkJCS8qIFRoaXMgaXMgYW4gYXNrZWQtZm9yIGJlaGF2aW91ciEgKi8KKwkJCQlyZXQgPSAwOworCQkJCWdvdG8gZW5kOworCQkJCX0KKyNlbmRpZgorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJFcnJvciwgRFNBIGtleSBnZW5lcmF0aW9uIGZhaWxlZFxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCWVsc2UgaWYJKGluZm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQlkc2E9ZDJpX0RTQXBhcmFtc19iaW8oaW4sTlVMTCk7CisJZWxzZSBpZiAoaW5mb3JtYXQgPT0gRk9STUFUX1BFTSkKKwkJZHNhPVBFTV9yZWFkX2Jpb19EU0FwYXJhbXMoaW4sTlVMTCxOVUxMLE5VTEwpOworCWVsc2UKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBpbnB1dCBmb3JtYXQgc3BlY2lmaWVkXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAoZHNhID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gbG9hZCBEU0EgcGFyYW1ldGVyc1xuIik7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAodGV4dCkKKwkJeworCQlEU0FwYXJhbXNfcHJpbnQob3V0LGRzYSk7CisJCX0KKwkKKwlpZiAoQykKKwkJeworCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQlpbnQgbCxsZW4sYml0c19wLGJpdHNfcSxiaXRzX2c7CisKKwkJbGVuPUJOX251bV9ieXRlcyhkc2EtPnApOworCQliaXRzX3A9Qk5fbnVtX2JpdHMoZHNhLT5wKTsKKwkJYml0c19xPUJOX251bV9iaXRzKGRzYS0+cSk7CisJCWJpdHNfZz1CTl9udW1fYml0cyhkc2EtPmcpOworCQlkYXRhPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MobGVuKzIwKTsKKwkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCXsKKwkJCXBlcnJvcigiT1BFTlNTTF9tYWxsb2MiKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlsPUJOX2JuMmJpbihkc2EtPnAsZGF0YSk7CisJCXByaW50Zigic3RhdGljIHVuc2lnbmVkIGNoYXIgZHNhJWRfcFtdPXsiLGJpdHNfcCk7CisJCWZvciAoaT0wOyBpPGw7IGkrKykKKwkJCXsKKwkJCWlmICgoaSUxMikgPT0gMCkgcHJpbnRmKCJcblx0Iik7CisJCQlwcmludGYoIjB4JTAyWCwiLGRhdGFbaV0pOworCQkJfQorCQlwcmludGYoIlxuXHR9O1xuIik7CisKKwkJbD1CTl9ibjJiaW4oZHNhLT5xLGRhdGEpOworCQlwcmludGYoInN0YXRpYyB1bnNpZ25lZCBjaGFyIGRzYSVkX3FbXT17IixiaXRzX3ApOworCQlmb3IgKGk9MDsgaTxsOyBpKyspCisJCQl7CisJCQlpZiAoKGklMTIpID09IDApIHByaW50ZigiXG5cdCIpOworCQkJcHJpbnRmKCIweCUwMlgsIixkYXRhW2ldKTsKKwkJCX0KKwkJcHJpbnRmKCJcblx0fTtcbiIpOworCisJCWw9Qk5fYm4yYmluKGRzYS0+ZyxkYXRhKTsKKwkJcHJpbnRmKCJzdGF0aWMgdW5zaWduZWQgY2hhciBkc2ElZF9nW109eyIsYml0c19wKTsKKwkJZm9yIChpPTA7IGk8bDsgaSsrKQorCQkJeworCQkJaWYgKChpJTEyKSA9PSAwKSBwcmludGYoIlxuXHQiKTsKKwkJCXByaW50ZigiMHglMDJYLCIsZGF0YVtpXSk7CisJCQl9CisJCXByaW50ZigiXG5cdH07XG5cbiIpOworCisJCXByaW50ZigiRFNBICpnZXRfZHNhJWQoKVxuXHR7XG4iLGJpdHNfcCk7CisJCXByaW50ZigiXHREU0EgKmRzYTtcblxuIik7CisJCXByaW50ZigiXHRpZiAoKGRzYT1EU0FfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTtcbiIpOworCQlwcmludGYoIlx0ZHNhLT5wPUJOX2JpbjJibihkc2ElZF9wLHNpemVvZihkc2ElZF9wKSxOVUxMKTtcbiIsCisJCQliaXRzX3AsYml0c19wKTsKKwkJcHJpbnRmKCJcdGRzYS0+cT1CTl9iaW4yYm4oZHNhJWRfcSxzaXplb2YoZHNhJWRfcSksTlVMTCk7XG4iLAorCQkJYml0c19wLGJpdHNfcCk7CisJCXByaW50ZigiXHRkc2EtPmc9Qk5fYmluMmJuKGRzYSVkX2csc2l6ZW9mKGRzYSVkX2cpLE5VTEwpO1xuIiwKKwkJCWJpdHNfcCxiaXRzX3ApOworCQlwcmludGYoIlx0aWYgKChkc2EtPnAgPT0gTlVMTCkgfHwgKGRzYS0+cSA9PSBOVUxMKSB8fCAoZHNhLT5nID09IE5VTEwpKVxuIik7CisJCXByaW50ZigiXHRcdHsgRFNBX2ZyZWUoZHNhKTsgcmV0dXJuKE5VTEwpOyB9XG4iKTsKKwkJcHJpbnRmKCJcdHJldHVybihkc2EpO1xuXHR9XG4iKTsKKwkJfQorCisKKwlpZiAoIW5vb3V0KQorCQl7CisJCWlmIAkob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJaT1pMmRfRFNBcGFyYW1zX2JpbyhvdXQsZHNhKTsKKwkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCQlpPVBFTV93cml0ZV9iaW9fRFNBcGFyYW1zKG91dCxkc2EpOworCQllbHNlCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBvdXRmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoIWkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVuYWJsZSB0byB3cml0ZSBEU0EgcGFyYW1ldGVyc1xuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwlpZiAoZ2Vua2V5KQorCQl7CisJCURTQSAqZHNha2V5OworCisJCWFzc2VydChuZWVkX3JhbmQpOworCQlpZiAoKGRzYWtleT1EU0FwYXJhbXNfZHVwKGRzYSkpID09IE5VTEwpIGdvdG8gZW5kOworCQlpZiAoIURTQV9nZW5lcmF0ZV9rZXkoZHNha2V5KSkgZ290byBlbmQ7CisJCWlmIAkob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJaT1pMmRfRFNBUHJpdmF0ZUtleV9iaW8ob3V0LGRzYWtleSk7CisJCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQkJaT1QRU1fd3JpdGVfYmlvX0RTQVByaXZhdGVLZXkob3V0LGRzYWtleSxOVUxMLE5VTEwsMCxOVUxMLE5VTEwpOworCQllbHNlCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBvdXRmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlEU0FfZnJlZShkc2FrZXkpOworCQl9CisJaWYgKG5lZWRfcmFuZCkKKwkJYXBwX1JBTkRfd3JpdGVfZmlsZShOVUxMLCBiaW9fZXJyKTsKKwlyZXQ9MDsKK2VuZDoKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCWlmIChvdXQgIT0gTlVMTCkgQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKGRzYSAhPSBOVUxMKSBEU0FfZnJlZShkc2EpOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZHNhX2NiKGludCBwLCBpbnQgbiwgQk5fR0VOQ0IgKmNiKQorCXsKKwljaGFyIGM9JyonOworCisJaWYgKHAgPT0gMCkgYz0nLic7CisJaWYgKHAgPT0gMSkgYz0nKyc7CisJaWYgKHAgPT0gMikgYz0nKic7CisJaWYgKHAgPT0gMykgYz0nXG4nOworCUJJT193cml0ZShjYi0+YXJnLCZjLDEpOworCSh2b2lkKUJJT19mbHVzaChjYi0+YXJnKTsKKyNpZmRlZiBMSU5UCisJcD1uOworI2VuZGlmCisjaWZkZWYgR0VOQ0JfVEVTVAorCWlmKHN0b3Bfa2V5Z2VuX2ZsYWcpCisJCXJldHVybiAwOworI2VuZGlmCisJcmV0dXJuIDE7CisJfQorI2Vsc2UgLyogIU9QRU5TU0xfTk9fRFNBICovCisKKyMgaWYgUEVEQU5USUMKK3N0YXRpYyB2b2lkICpkdW1teT0mZHVtbXk7CisjIGVuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9lYy5jIGIvbGliL29wZW5zc2wvYXBwcy9lYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMTk0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2VjLmMKQEAgLTAsMCArMSw0MDkgQEAKKy8qIGFwcHMvZWMuYyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgTmlscyBMYXJzY2ggZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRwllY19tYWluCisKKy8qIC1pbmZvcm0gYXJnICAgIC0gaW5wdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0gKG9uZSBvZiBERVIsIE5FVCBvciBQRU0pCisgKiAtb3V0Zm9ybSBhcmcgICAtIG91dHB1dCBmb3JtYXQgLSBkZWZhdWx0IFBFTQorICogLWluIGFyZyAgICAgICAgLSBpbnB1dCBmaWxlIC0gZGVmYXVsdCBzdGRpbgorICogLW91dCBhcmcgICAgICAgLSBvdXRwdXQgZmlsZSAtIGRlZmF1bHQgc3Rkb3V0CisgKiAtZGVzICAgICAgICAgICAtIGVuY3J5cHQgb3V0cHV0IGlmIFBFTSBmb3JtYXQgd2l0aCBERVMgaW4gY2JjIG1vZGUKKyAqIC10ZXh0ICAgICAgICAgIC0gcHJpbnQgYSB0ZXh0IHZlcnNpb24KKyAqIC1wYXJhbV9vdXQgICAgIC0gcHJpbnQgdGhlIGVsbGlwdGljIGN1cnZlIHBhcmFtZXRlcnMKKyAqIC1jb252X2Zvcm0gYXJnIC0gc3BlY2lmaWVzIHRoZSBwb2ludCBlbmNvZGluZyBmb3JtCisgKiAtcGFyYW1fZW5jIGFyZyAtIHNwZWNpZmllcyB0aGUgcGFyYW1ldGVyIGVuY29kaW5nCisgKi8KKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCUVOR0lORSAJKmUgPSBOVUxMOworI2VuZGlmCisJaW50IAlyZXQgPSAxOworCUVDX0tFWSAJKmVja2V5ID0gTlVMTDsKKwljb25zdCBFQ19HUk9VUCAqZ3JvdXA7CisJaW50IAlpLCBiYWRvcHMgPSAwOworCWNvbnN0IEVWUF9DSVBIRVIgKmVuYyA9IE5VTEw7CisJQklPIAkqaW4gPSBOVUxMLCAqb3V0ID0gTlVMTDsKKwlpbnQgCWluZm9ybWF0LCBvdXRmb3JtYXQsIHRleHQ9MCwgbm9vdXQ9MDsKKwlpbnQgIAlwdWJpbiA9IDAsIHB1Ym91dCA9IDAsIHBhcmFtX291dCA9IDA7CisJY2hhciAJKmluZmlsZSwgKm91dGZpbGUsICpwcm9nLCAqZW5naW5lOworCWNoYXIgCSpwYXNzYXJnaW4gPSBOVUxMLCAqcGFzc2FyZ291dCA9IE5VTEw7CisJY2hhciAJKnBhc3NpbiA9IE5VTEwsICpwYXNzb3V0ID0gTlVMTDsKKwlwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtID0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQ7CisJaW50CW5ld19mb3JtID0gMDsKKwlpbnQJYXNuMV9mbGFnID0gT1BFTlNTTF9FQ19OQU1FRF9DVVJWRTsKKwlpbnQgCW5ld19hc24xX2ZsYWcgPSAwOworCisJYXBwc19zdGFydHVwKCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQlpZiAoKGJpb19lcnI9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fZXJyLCBzdGRlcnIsIEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJZW5naW5lID0gTlVMTDsKKwlpbmZpbGUgPSBOVUxMOworCW91dGZpbGUgPSBOVUxMOworCWluZm9ybWF0ID0gRk9STUFUX1BFTTsKKwlvdXRmb3JtYXQgPSBGT1JNQVRfUEVNOworCisJcHJvZyA9IGFyZ3ZbMF07CisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmIChzdHJjbXAoKmFyZ3YsIi1pbmZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5mb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXRmb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWluIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWluZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wYXNzaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZ2luPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBhc3NvdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZ291dD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWVuZ2luZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItbm9vdXQiKSA9PSAwKQorCQkJbm9vdXQgPSAxOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItdGV4dCIpID09IDApCisJCQl0ZXh0ID0gMTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWNvbnZfZm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkKKwkJCQlnb3RvIGJhZDsKKwkJCSsrYXJndjsKKwkJCW5ld19mb3JtID0gMTsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJjb21wcmVzc2VkIikgPT0gMCkKKwkJCQlmb3JtID0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAidW5jb21wcmVzc2VkIikgPT0gMCkKKwkJCQlmb3JtID0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQ7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoeWJyaWQiKSA9PSAwKQorCQkJCWZvcm0gPSBQT0lOVF9DT05WRVJTSU9OX0hZQlJJRDsKKwkJCWVsc2UKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXBhcmFtX2VuYyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkKKwkJCQlnb3RvIGJhZDsKKwkJCSsrYXJndjsKKwkJCW5ld19hc24xX2ZsYWcgPSAxOworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm5hbWVkX2N1cnZlIikgPT0gMCkKKwkJCQlhc24xX2ZsYWcgPSBPUEVOU1NMX0VDX05BTUVEX0NVUlZFOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiZXhwbGljaXQiKSA9PSAwKQorCQkJCWFzbjFfZmxhZyA9IDA7CisJCQllbHNlCisJCQkJZ290byBiYWQ7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1wYXJhbV9vdXQiKSA9PSAwKQorCQkJcGFyYW1fb3V0ID0gMTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXB1YmluIikgPT0gMCkKKwkJCXB1YmluPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1wdWJvdXQiKSA9PSAwKQorCQkJcHVib3V0PTE7CisJCWVsc2UgaWYgKChlbmM9RVZQX2dldF9jaXBoZXJieW5hbWUoJihhcmd2WzBdWzFdKSkpID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJ1bmtub3duIG9wdGlvbiAlc1xuIiwgKmFyZ3YpOworCQkJYmFkb3BzPTE7CisJCQlicmVhazsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKworCWlmIChiYWRvcHMpCisJCXsKK2JhZDoKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiJXMgW29wdGlvbnNdIDxpbmZpbGUgPm91dGZpbGVcbiIsIHByb2cpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJ3aGVyZSBvcHRpb25zIGFyZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAtaW5mb3JtIGFyZyAgICAgaW5wdXQgZm9ybWF0IC0gIgorCQkJCSJERVIgb3IgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1vdXRmb3JtIGFyZyAgICBvdXRwdXQgZm9ybWF0IC0gIgorCQkJCSJERVIgb3IgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1pbiBhcmcgICAgICAgICBpbnB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1wYXNzaW4gYXJnICAgICBpbnB1dCBmaWxlIHBhc3MgIgorCQkJCSJwaHJhc2Ugc291cmNlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1vdXQgYXJnICAgICAgICBvdXRwdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAtcGFzc291dCBhcmcgICAgb3V0cHV0IGZpbGUgcGFzcyAiCisJCQkJInBocmFzZSBzb3VyY2VcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgLWVuZ2luZSBlICAgICAgIHVzZSBlbmdpbmUgZSwgIgorCQkJCSJwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgLWRlcyAgICAgICAgICAgIGVuY3J5cHQgUEVNIG91dHB1dCwgIgorCQkJCSJpbnN0ZWFkIG9mICdkZXMnIGV2ZXJ5IG90aGVyIFxuIgorCQkJCSIgICAgICAgICAgICAgICAgIGNpcGhlciAiCisJCQkJInN1cHBvcnRlZCBieSBPcGVuU1NMIGNhbiBiZSB1c2VkXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC10ZXh0ICAgICAgICAgICBwcmludCB0aGUga2V5XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1ub291dCAgICAgICAgICBkb24ndCBwcmludCBrZXkgb3V0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1wYXJhbV9vdXQgICAgICBwcmludCB0aGUgZWxsaXB0aWMgIgorCQkJCSJjdXJ2ZSBwYXJhbWV0ZXJzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1jb252X2Zvcm0gYXJnICBzcGVjaWZpZXMgdGhlICIKKwkJCQkicG9pbnQgY29udmVyc2lvbiBmb3JtIFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAgICAgICAgICAgICAgICAgcG9zc2libGUgdmFsdWVzOiIKKwkJCQkiIGNvbXByZXNzZWRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisJCQkJIiB1bmNvbXByZXNzZWQgKGRlZmF1bHQpXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKwkJCQkiIGh5YnJpZFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAtcGFyYW1fZW5jIGFyZyAgc3BlY2lmaWVzIHRoZSB3YXkiCisJCQkJIiB0aGUgZWMgcGFyYW1ldGVycyBhcmUgZW5jb2RlZFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAgICAgICAgICAgICAgICAgaW4gdGhlIGFzbjEgZGVyICIKKwkJCQkiZW5jb2RpbmdcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHZhbHVlczoiCisJCQkJIiBuYW1lZF9jdXJ2ZSAoZGVmYXVsdClcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisJCQkJImV4cGxpY2l0XG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyAgICAgICAgZSA9IHNldHVwX2VuZ2luZShiaW9fZXJyLCBlbmdpbmUsIDApOworI2VuZGlmCisKKwlpZighYXBwX3Bhc3N3ZChiaW9fZXJyLCBwYXNzYXJnaW4sIHBhc3NhcmdvdXQsICZwYXNzaW4sICZwYXNzb3V0KSkgCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgZ2V0dGluZyBwYXNzd29yZHNcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaW4gPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJb3V0ID0gQklPX25ldyhCSU9fc19maWxlKCkpOworCWlmICgoaW4gPT0gTlVMTCkgfHwgKG91dCA9PSBOVUxMKSkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGluZmlsZSA9PSBOVUxMKQorCQlCSU9fc2V0X2ZwKGluLCBzdGRpbiwgQklPX05PQ0xPU0UpOworCWVsc2UKKwkJeworCQlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4sIGluZmlsZSkgPD0gMCkKKwkJCXsKKwkJCXBlcnJvcihpbmZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCUJJT19wcmludGYoYmlvX2VyciwgInJlYWQgRUMga2V5XG4iKTsKKwlpZiAoaW5mb3JtYXQgPT0gRk9STUFUX0FTTjEpIAorCQl7CisJCWlmIChwdWJpbikgCisJCQllY2tleSA9IGQyaV9FQ19QVUJLRVlfYmlvKGluLCBOVUxMKTsKKwkJZWxzZSAKKwkJCWVja2V5ID0gZDJpX0VDUHJpdmF0ZUtleV9iaW8oaW4sIE5VTEwpOworCQl9IAorCWVsc2UgaWYgKGluZm9ybWF0ID09IEZPUk1BVF9QRU0pIAorCQl7CisJCWlmIChwdWJpbikgCisJCQllY2tleSA9IFBFTV9yZWFkX2Jpb19FQ19QVUJLRVkoaW4sIE5VTEwsIE5VTEwsIAorCQkJCU5VTEwpOworCQllbHNlIAorCQkJZWNrZXkgPSBQRU1fcmVhZF9iaW9fRUNQcml2YXRlS2V5KGluLCBOVUxMLCBOVUxMLAorCQkJCXBhc3Npbik7CisJCX0gCisJZWxzZQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgImJhZCBpbnB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBrZXlcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmIChlY2tleSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGxvYWQgS2V5XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChvdXRmaWxlID09IE5VTEwpCisJCXsKKwkJQklPX3NldF9mcChvdXQsIHN0ZG91dCwgQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQkJeworCQkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCwgb3V0ZmlsZSkgPD0gMCkKKwkJCXsKKwkJCXBlcnJvcihvdXRmaWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVja2V5KTsKKworCWlmIChuZXdfZm9ybSkKKwkJRUNfS0VZX3NldF9jb252X2Zvcm0oZWNrZXksIGZvcm0pOworCisJaWYgKG5ld19hc24xX2ZsYWcpCisJCUVDX0tFWV9zZXRfYXNuMV9mbGFnKGVja2V5LCBhc24xX2ZsYWcpOworCisJaWYgKHRleHQpIAorCQlpZiAoIUVDX0tFWV9wcmludChvdXQsIGVja2V5LCAwKSkKKwkJCXsKKwkJCXBlcnJvcihvdXRmaWxlKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCWlmIChub291dCkgCisJCXsKKwkJcmV0ID0gMDsKKwkJZ290byBlbmQ7CisJCX0KKworCUJJT19wcmludGYoYmlvX2VyciwgIndyaXRpbmcgRUMga2V5XG4iKTsKKwlpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKSAKKwkJeworCQlpZiAocGFyYW1fb3V0KQorCQkJaSA9IGkyZF9FQ1BLUGFyYW1ldGVyc19iaW8ob3V0LCBncm91cCk7CisJCWVsc2UgaWYgKHB1YmluIHx8IHB1Ym91dCkgCisJCQlpID0gaTJkX0VDX1BVQktFWV9iaW8ob3V0LCBlY2tleSk7CisJCWVsc2UgCisJCQlpID0gaTJkX0VDUHJpdmF0ZUtleV9iaW8ob3V0LCBlY2tleSk7CisJCX0gCisJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pIAorCQl7CisJCWlmIChwYXJhbV9vdXQpCisJCQlpID0gUEVNX3dyaXRlX2Jpb19FQ1BLUGFyYW1ldGVycyhvdXQsIGdyb3VwKTsKKwkJZWxzZSBpZiAocHViaW4gfHwgcHVib3V0KQorCQkJaSA9IFBFTV93cml0ZV9iaW9fRUNfUFVCS0VZKG91dCwgZWNrZXkpOworCQllbHNlIAorCQkJaSA9IFBFTV93cml0ZV9iaW9fRUNQcml2YXRlS2V5KG91dCwgZWNrZXksIGVuYywKKwkJCQkJCU5VTEwsIDAsIE5VTEwsIHBhc3NvdXQpOworCQl9IAorCWVsc2UgCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciAiCisJCQkib3V0ZmlsZVxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoIWkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAidW5hYmxlIHRvIHdyaXRlIHByaXZhdGUga2V5XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJfQorCWVsc2UKKwkJcmV0PTA7CitlbmQ6CisJaWYgKGluKQorCQlCSU9fZnJlZShpbik7CisJaWYgKG91dCkKKwkJQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKGVja2V5KQorCQlFQ19LRVlfZnJlZShlY2tleSk7CisJaWYgKHBhc3NpbikKKwkJT1BFTlNTTF9mcmVlKHBhc3Npbik7CisJaWYgKHBhc3NvdXQpCisJCU9QRU5TU0xfZnJlZShwYXNzb3V0KTsKKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7Cit9CisjZWxzZSAvKiAhT1BFTlNTTF9OT19FQyAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZWNwYXJhbS5jIGIvbGliL29wZW5zc2wvYXBwcy9lY3BhcmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhYTBhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvZWNwYXJhbS5jCkBAIC0wLDAgKzEsNzM0IEBACisvKiBhcHBzL2VjcGFyYW0uYyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgTmlscyBMYXJzY2ggZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGVsbGlwdGljIGN1cnZlIGJpbmFyeSBwb2x5bm9taWFsIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSAKKyAqIFNoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYSBvZiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FQworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCWVjcGFyYW1fbWFpbgorCisvKiAtaW5mb3JtIGFyZyAgICAgIC0gaW5wdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0gKERFUiBvciBQRU0pCisgKiAtb3V0Zm9ybSBhcmcgICAgIC0gb3V0cHV0IGZvcm1hdCAtIGRlZmF1bHQgUEVNCisgKiAtaW4gIGFyZyAgICAgICAgIC0gaW5wdXQgZmlsZSAgLSBkZWZhdWx0IHN0ZGluCisgKiAtb3V0IGFyZyAgICAgICAgIC0gb3V0cHV0IGZpbGUgLSBkZWZhdWx0IHN0ZG91dAorICogLW5vb3V0ICAgICAgICAgICAtIGRvIG5vdCBwcmludCB0aGUgZWMgcGFyYW1ldGVyCisgKiAtdGV4dCAgICAgICAgICAgIC0gcHJpbnQgdGhlIGVjIHBhcmFtZXRlcnMgaW4gdGV4dCBmb3JtCisgKiAtY2hlY2sgICAgICAgICAgIC0gdmFsaWRhdGUgdGhlIGVjIHBhcmFtZXRlcnMKKyAqIC1DICAgICAgICAgICAgICAgLSBwcmludCBhICdDJyBmdW5jdGlvbiBjcmVhdGluZyB0aGUgcGFyYW1ldGVycworICogLW5hbWUgYXJnICAgICAgICAtIHVzZSB0aGUgZWMgcGFyYW1ldGVycyB3aXRoICdzaG9ydCBuYW1lJyBuYW1lCisgKiAtbGlzdF9jdXJ2ZXMgICAgIC0gcHJpbnRzIGEgbGlzdCBvZiBhbGwgY3VycmVudGx5IGF2YWlsYWJsZSBjdXJ2ZSAnc2hvcnQgbmFtZXMnCisgKiAtY29udl9mb3JtIGFyZyAgIC0gc3BlY2lmaWVzIHRoZSBwb2ludCBjb252ZXJzaW9uIGZvcm0gCisgKiAgICAgICAgICAgICAgICAgIC0gcG9zc2libGUgdmFsdWVzOiBjb21wcmVzc2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgKGRlZmF1bHQpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeWJyaWQKKyAqIC1wYXJhbV9lbmMgYXJnICAgLSBzcGVjaWZpZXMgdGhlIHdheSB0aGUgZWMgcGFyYW1ldGVycyBhcmUgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBhc24xIGRlciBlbmNvZGluZworICogICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHZhbHVlczogbmFtZWRfY3VydmUgKGRlZmF1bHQpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsaWNpdAorICogLW5vX3NlZWQgICAgICAgICAtIGlmICdleHBsaWNpdCcgcGFyYW1ldGVycyBhcmUgY2hvb3NlbiBkbyBub3QgdXNlIHRoZSBzZWVkCisgKiAtZ2Vua2V5ICAgICAgICAgIC0gZ2VuZXJhdGUgZWMga2V5CisgKiAtcmFuZCBmaWxlICAgICAgIC0gZmlsZXMgdG8gdXNlIGZvciByYW5kb20gbnVtYmVyIGlucHV0CisgKiAtZW5naW5lIGUgICAgICAgIC0gdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZQorICovCisKKworc3RhdGljIGludCBlY3BhcmFtX3ByaW50X3ZhcihCSU8gKixCSUdOVU0gKixjb25zdCBjaGFyICosaW50LHVuc2lnbmVkIGNoYXIgKik7CisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJRUNfR1JPVVAgKmdyb3VwID0gTlVMTDsKKwlwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtID0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQ7IAorCWludCAJbmV3X2Zvcm0gPSAwOworCWludCAJYXNuMV9mbGFnID0gT1BFTlNTTF9FQ19OQU1FRF9DVVJWRTsKKwlpbnQgCW5ld19hc24xX2ZsYWcgPSAwOworCWNoYXIgCSpjdXJ2ZV9uYW1lID0gTlVMTCwgKmlucmFuZCA9IE5VTEw7CisJaW50CWxpc3RfY3VydmVzID0gMCwgbm9fc2VlZCA9IDAsIGNoZWNrID0gMCwKKwkJYmFkb3BzID0gMCwgdGV4dCA9IDAsIGksIG5lZWRfcmFuZCA9IDAsIGdlbmtleSA9IDA7CisJY2hhcgkqaW5maWxlID0gTlVMTCwgKm91dGZpbGUgPSBOVUxMLCAqcHJvZzsKKwlCSU8gCSppbiA9IE5VTEwsICpvdXQgPSBOVUxMOworCWludCAJaW5mb3JtYXQsIG91dGZvcm1hdCwgbm9vdXQgPSAwLCBDID0gMCwgcmV0ID0gMTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUJKmUgPSBOVUxMOworI2VuZGlmCisJY2hhcgkqZW5naW5lID0gTlVMTDsKKworCUJJR05VTQkqZWNfcCA9IE5VTEwsICplY19hID0gTlVMTCwgKmVjX2IgPSBOVUxMLAorCQkqZWNfZ2VuID0gTlVMTCwgKmVjX29yZGVyID0gTlVMTCwgKmVjX2NvZmFjdG9yID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBOVUxMOworCisJYXBwc19zdGFydHVwKCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQlpZiAoKGJpb19lcnI9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fZXJyLHN0ZGVycixCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKworCWluZm9ybWF0PUZPUk1BVF9QRU07CisJb3V0Zm9ybWF0PUZPUk1BVF9QRU07CisKKwlwcm9nPWFyZ3ZbMF07CisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmIAkoc3RyY21wKCphcmd2LCItaW5mb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWluZm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0Zm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdGV4dCIpID09IDApCisJCQl0ZXh0ID0gMTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItQyIpID09IDApCisJCQlDID0gMTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY2hlY2siKSA9PSAwKQorCQkJY2hlY2sgPSAxOworCQllbHNlIGlmIChzdHJjbXAgKCphcmd2LCAiLW5hbWUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpCisJCQkJZ290byBiYWQ7CisJCQljdXJ2ZV9uYW1lID0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItbGlzdF9jdXJ2ZXMiKSA9PSAwKQorCQkJbGlzdF9jdXJ2ZXMgPSAxOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItY29udl9mb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKQorCQkJCWdvdG8gYmFkOworCQkJKythcmd2OworCQkJbmV3X2Zvcm0gPSAxOworCQkJaWYgKHN0cmNtcCgqYXJndiwgImNvbXByZXNzZWQiKSA9PSAwKQorCQkJCWZvcm0gPSBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQ7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ1bmNvbXByZXNzZWQiKSA9PSAwKQorCQkJCWZvcm0gPSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRDsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImh5YnJpZCIpID09IDApCisJCQkJZm9ybSA9IFBPSU5UX0NPTlZFUlNJT05fSFlCUklEOworCQkJZWxzZQorCQkJCWdvdG8gYmFkOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItcGFyYW1fZW5jIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKQorCQkJCWdvdG8gYmFkOworCQkJKythcmd2OworCQkJbmV3X2FzbjFfZmxhZyA9IDE7CisJCQlpZiAoc3RyY21wKCphcmd2LCAibmFtZWRfY3VydmUiKSA9PSAwKQorCQkJCWFzbjFfZmxhZyA9IE9QRU5TU0xfRUNfTkFNRURfQ1VSVkU7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJleHBsaWNpdCIpID09IDApCisJCQkJYXNuMV9mbGFnID0gMDsKKwkJCWVsc2UKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLW5vX3NlZWQiKSA9PSAwKQorCQkJbm9fc2VlZCA9IDE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1ub291dCIpID09IDApCisJCQlub291dD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1nZW5rZXkiKSA9PSAwKQorCQkJeworCQkJZ2Vua2V5PTE7CisJCQluZWVkX3JhbmQ9MTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLXJhbmQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5yYW5kPSAqKCsrYXJndik7CisJCQluZWVkX3JhbmQ9MTsKKwkJCX0KKwkJZWxzZSBpZihzdHJjbXAoKmFyZ3YsICItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWVuZ2luZSA9ICooKythcmd2KTsKKwkJCX0JCisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJXNcbiIsKmFyZ3YpOworCQkJYmFkb3BzPTE7CisJCQlicmVhazsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKworCWlmIChiYWRvcHMpCisJCXsKK2JhZDoKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiJXMgW29wdGlvbnNdIDxpbmZpbGUgPm91dGZpbGVcbiIscHJvZyk7CisJCUJJT19wcmludGYoYmlvX2VyciwgIndoZXJlIG9wdGlvbnMgYXJlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1pbmZvcm0gYXJnICAgICAgIGlucHV0IGZvcm1hdCAtICIKKwkJCQkiZGVmYXVsdCBQRU0gKERFUiBvciBQRU0pXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1vdXRmb3JtIGFyZyAgICAgIG91dHB1dCBmb3JtYXQgLSAiCisJCQkJImRlZmF1bHQgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1pbiAgYXJnICAgICAgICAgIGlucHV0IGZpbGUgIC0gIgorCQkJCSJkZWZhdWx0IHN0ZGluXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1vdXQgYXJnICAgICAgICAgIG91dHB1dCBmaWxlIC0gIgorCQkJCSJkZWZhdWx0IHN0ZG91dFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAtbm9vdXQgICAgICAgICAgICBkbyBub3QgcHJpbnQgdGhlICIKKwkJCQkiZWMgcGFyYW1ldGVyXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC10ZXh0ICAgICAgICAgICAgIHByaW50IHRoZSBlYyAiCisJCQkJInBhcmFtZXRlcnMgaW4gdGV4dCBmb3JtXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1jaGVjayAgICAgICAgICAgIHZhbGlkYXRlIHRoZSBlYyAiCisJCQkJInBhcmFtZXRlcnNcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgLUMgICAgICAgICAgICAgICAgcHJpbnQgYSAnQycgIgorCQkJCSJmdW5jdGlvbiBjcmVhdGluZyB0aGUgcGFyYW1ldGVyc1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAtbmFtZSBhcmcgICAgICAgICB1c2UgdGhlICIKKwkJCQkiZWMgcGFyYW1ldGVycyB3aXRoICdzaG9ydCBuYW1lJyBuYW1lXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1saXN0X2N1cnZlcyAgICAgIHByaW50cyBhIGxpc3Qgb2YgIgorCQkJCSJhbGwgY3VycmVudGx5IGF2YWlsYWJsZSBjdXJ2ZSAnc2hvcnQgbmFtZXMnXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiIC1jb252X2Zvcm0gYXJnICAgIHNwZWNpZmllcyB0aGUgIgorCQkJCSJwb2ludCBjb252ZXJzaW9uIGZvcm0gXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHZhbHVlczoiCisJCQkJIiBjb21wcmVzc2VkXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisJCQkJIiB1bmNvbXByZXNzZWQgKGRlZmF1bHQpXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisJCQkJIiBoeWJyaWRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgLXBhcmFtX2VuYyBhcmcgICAgc3BlY2lmaWVzIHRoZSB3YXkiCisJCQkJIiB0aGUgZWMgcGFyYW1ldGVycyBhcmUgZW5jb2RlZFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAgICAgICAgICAgICAgICAgICBpbiB0aGUgYXNuMSBkZXIgIgorCQkJCSJlbmNvZGluZ1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSB2YWx1ZXM6IgorCQkJCSIgbmFtZWRfY3VydmUgKGRlZmF1bHQpXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCisJCQkJIiBleHBsaWNpdFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIiAtbm9fc2VlZCAgICAgICAgICBpZiAnZXhwbGljaXQnIgorCQkJCSIgcGFyYW1ldGVycyBhcmUgY2hvb3NlbiBkbyBub3QiCisJCQkJIiB1c2UgdGhlIHNlZWRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgLWdlbmtleSAgICAgICAgICAgZ2VuZXJhdGUgZWMiCisJCQkJIiBrZXlcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgLXJhbmQgZmlsZSAgICAgICAgZmlsZXMgdG8gdXNlIGZvciIKKwkJCQkiIHJhbmRvbSBudW1iZXIgaW5wdXRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICIgLWVuZ2luZSBlICAgICAgICAgdXNlIGVuZ2luZSBlLCAiCisJCQkJInBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAoKGluID09IE5VTEwpIHx8IChvdXQgPT0gTlVMTCkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChpbmZpbGUgPT0gTlVMTCkKKwkJQklPX3NldF9mcChpbixzdGRpbixCSU9fTk9DTE9TRSk7CisJZWxzZQorCQl7CisJCWlmIChCSU9fcmVhZF9maWxlbmFtZShpbixpbmZpbGUpIDw9IDApCisJCQl7CisJCQlwZXJyb3IoaW5maWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJaWYgKG91dGZpbGUgPT0gTlVMTCkKKwkJeworCQlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQl7CisJCUJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCX0KKyNlbmRpZgorCQl9CisJZWxzZQorCQl7CisJCWlmIChCSU9fd3JpdGVfZmlsZW5hbWUob3V0LG91dGZpbGUpIDw9IDApCisJCQl7CisJCQlwZXJyb3Iob3V0ZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJZSA9IHNldHVwX2VuZ2luZShiaW9fZXJyLCBlbmdpbmUsIDApOworI2VuZGlmCisKKwlpZiAobGlzdF9jdXJ2ZXMpCisJCXsKKwkJRUNfYnVpbHRpbl9jdXJ2ZSAqY3VydmVzID0gTlVMTDsKKwkJc2l6ZV90IGNydl9sZW4gPSAwOworCQlzaXplX3QgbiA9IDA7CisKKwkJY3J2X2xlbiA9IEVDX2dldF9idWlsdGluX2N1cnZlcyhOVUxMLCAwKTsKKworCQljdXJ2ZXMgPSBPUEVOU1NMX21hbGxvYygoaW50KShzaXplb2YoRUNfYnVpbHRpbl9jdXJ2ZSkgKiBjcnZfbGVuKSk7CisKKwkJaWYgKGN1cnZlcyA9PSBOVUxMKQorCQkJZ290byBlbmQ7CisKKwkJaWYgKCFFQ19nZXRfYnVpbHRpbl9jdXJ2ZXMoY3VydmVzLCBjcnZfbGVuKSkKKwkJCXsKKwkJCU9QRU5TU0xfZnJlZShjdXJ2ZXMpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJCisJCWZvciAobiA9IDA7IG4gPCBjcnZfbGVuOyBuKyspCisJCQl7CisJCQljb25zdCBjaGFyICpjb21tZW50OworCQkJY29uc3QgY2hhciAqc25hbWU7CisJCQljb21tZW50ID0gY3VydmVzW25dLmNvbW1lbnQ7CisJCQlzbmFtZSAgID0gT0JKX25pZDJzbihjdXJ2ZXNbbl0ubmlkKTsKKwkJCWlmIChjb21tZW50ID09IE5VTEwpCisJCQkJY29tbWVudCA9ICJDVVJWRSBERVNDUklQVElPTiBOT1QgQVZBSUxBQkxFIjsKKwkJCWlmIChzbmFtZSA9PSBOVUxMKQorCQkJCXNuYW1lID0gIiI7CisKKwkJCUJJT19wcmludGYob3V0LCAiICAlLTEwczogIiwgc25hbWUpOworCQkJQklPX3ByaW50ZihvdXQsICIlc1xuIiwgY29tbWVudCk7CisJCQl9IAorCisJCU9QRU5TU0xfZnJlZShjdXJ2ZXMpOworCQlyZXQgPSAwOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGN1cnZlX25hbWUgIT0gTlVMTCkKKwkJeworCQlpbnQgbmlkOworCisJCS8qIHdvcmthcm91bmQgZm9yIHRoZSBTRUNHIGN1cnZlIG5hbWVzIHNlY3AxOTJyMQorCQkgKiBhbmQgc2VjcDI1NnIxICh3aGljaCBhcmUgdGhlIHNhbWUgYXMgdGhlIGN1cnZlcworCQkgKiBwcmltZTE5MnYxIGFuZCBwcmltZTI1NnYxIGRlZmluZWQgaW4gWDkuNjIpCisJCSAqLworCQlpZiAoIXN0cmNtcChjdXJ2ZV9uYW1lLCAic2VjcDE5MnIxIikpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJ1c2luZyBjdXJ2ZSBuYW1lIHByaW1lMTkydjEgIgorCQkJCSJpbnN0ZWFkIG9mIHNlY3AxOTJyMVxuIik7CisJCQluaWQgPSBOSURfWDlfNjJfcHJpbWUxOTJ2MTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcChjdXJ2ZV9uYW1lLCAic2VjcDI1NnIxIikpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJ1c2luZyBjdXJ2ZSBuYW1lIHByaW1lMjU2djEgIgorCQkJCSJpbnN0ZWFkIG9mIHNlY3AyNTZyMVxuIik7CisJCQluaWQgPSBOSURfWDlfNjJfcHJpbWUyNTZ2MTsKKwkJCX0KKwkJZWxzZQorCQkJbmlkID0gT0JKX3NuMm5pZChjdXJ2ZV9uYW1lKTsKKwkKKwkJaWYgKG5pZCA9PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAidW5rbm93biBjdXJ2ZSBuYW1lICglcylcbiIsIAorCQkJCWN1cnZlX25hbWUpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJZ3JvdXAgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworCQlpZiAoZ3JvdXAgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgInVuYWJsZSB0byBjcmVhdGUgY3VydmUgKCVzKVxuIiwgCisJCQkJY3VydmVfbmFtZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJRUNfR1JPVVBfc2V0X2FzbjFfZmxhZyhncm91cCwgYXNuMV9mbGFnKTsKKwkJRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShncm91cCwgZm9ybSk7CisJCX0KKwllbHNlIGlmIChpbmZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJeworCQlncm91cCA9IGQyaV9FQ1BLUGFyYW1ldGVyc19iaW8oaW4sIE5VTEwpOworCQl9CisJZWxzZSBpZiAoaW5mb3JtYXQgPT0gRk9STUFUX1BFTSkKKwkJeworCQlncm91cCA9IFBFTV9yZWFkX2Jpb19FQ1BLUGFyYW1ldGVycyhpbixOVUxMLE5VTEwsTlVMTCk7CisJCX0KKwllbHNlCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiYmFkIGlucHV0IGZvcm1hdCBzcGVjaWZpZWRcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGdyb3VwID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAKKwkJCSJ1bmFibGUgdG8gbG9hZCBlbGxpcHRpYyBjdXJ2ZSBwYXJhbWV0ZXJzXG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChuZXdfZm9ybSkKKwkJRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShncm91cCwgZm9ybSk7CisKKwlpZiAobmV3X2FzbjFfZmxhZykKKwkJRUNfR1JPVVBfc2V0X2FzbjFfZmxhZyhncm91cCwgYXNuMV9mbGFnKTsKKworCWlmIChub19zZWVkKQorCQl7CisJCUVDX0dST1VQX3NldF9zZWVkKGdyb3VwLCBOVUxMLCAwKTsKKwkJfQorCisJaWYgKHRleHQpCisJCXsKKwkJaWYgKCFFQ1BLUGFyYW1ldGVyc19wcmludChvdXQsIGdyb3VwLCAwKSkKKwkJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoY2hlY2spCisJCXsKKwkJaWYgKGdyb3VwID09IE5VTEwpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJubyBlbGxpcHRpYyBjdXJ2ZSBwYXJhbWV0ZXJzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiY2hlY2tpbmcgZWxsaXB0aWMgY3VydmUgcGFyYW1ldGVyczogIik7CisJCWlmICghRUNfR1JPVVBfY2hlY2soZ3JvdXAsIE5VTEwpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiZmFpbGVkXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQl9CisJCWVsc2UKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIm9rXG4iKTsKKwkJCQorCQl9CisKKwlpZiAoQykKKwkJeworCQlzaXplX3QJYnVmX2xlbiA9IDAsIHRtcF9sZW4gPSAwOworCQljb25zdCBFQ19QT0lOVCAqcG9pbnQ7CisJCWludAlpc19wcmltZSwgbGVuID0gMDsKKwkJY29uc3QgRUNfTUVUSE9EICptZXRoID0gRUNfR1JPVVBfbWV0aG9kX29mKGdyb3VwKTsKKworCQlpZiAoKGVjX3AgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fCAoZWNfYSA9IEJOX25ldygpKSA9PSBOVUxMIHx8CisJCSAgICAoZWNfYiA9IEJOX25ldygpKSA9PSBOVUxMIHx8IChlY19nZW4gPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAorCQkgICAgKGVjX29yZGVyID0gQk5fbmV3KCkpID09IE5VTEwgfHwgCisJCSAgICAoZWNfY29mYWN0b3IgPSBCTl9uZXcoKSkgPT0gTlVMTCApCisJCQl7CisJCQlwZXJyb3IoIk9QRU5TU0xfbWFsbG9jIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQlpc19wcmltZSA9IChFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUobWV0aCkgPT0gCisJCQlOSURfWDlfNjJfcHJpbWVfZmllbGQpOworCisJCWlmIChpc19wcmltZSkKKwkJCXsKKwkJCWlmICghRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcChncm91cCwgZWNfcCwgZWNfYSwKKwkJCQllY19iLCBOVUxMKSkKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJLyogVE9ETyAqLworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJaWYgKChwb2ludCA9IEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGdyb3VwKSkgPT0gTlVMTCkKKwkJCWdvdG8gZW5kOworCQlpZiAoIUVDX1BPSU5UX3BvaW50MmJuKGdyb3VwLCBwb2ludCwgCisJCQlFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKGdyb3VwKSwgZWNfZ2VuLCAKKwkJCU5VTEwpKQorCQkJZ290byBlbmQ7CisJCWlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBlY19vcmRlciwgTlVMTCkpCisJCQlnb3RvIGVuZDsKKwkJaWYgKCFFQ19HUk9VUF9nZXRfY29mYWN0b3IoZ3JvdXAsIGVjX2NvZmFjdG9yLCBOVUxMKSkKKwkJCWdvdG8gZW5kOworCisJCWlmICghZWNfcCB8fCAhZWNfYSB8fCAhZWNfYiB8fCAhZWNfZ2VuIHx8IAorCQkJIWVjX29yZGVyIHx8ICFlY19jb2ZhY3RvcikKKwkJCWdvdG8gZW5kOworCisJCWxlbiA9IEJOX251bV9iaXRzKGVjX29yZGVyKTsKKworCQlpZiAoKHRtcF9sZW4gPSAoc2l6ZV90KUJOX251bV9ieXRlcyhlY19wKSkgPiBidWZfbGVuKQorCQkJYnVmX2xlbiA9IHRtcF9sZW47CisJCWlmICgodG1wX2xlbiA9IChzaXplX3QpQk5fbnVtX2J5dGVzKGVjX2EpKSA+IGJ1Zl9sZW4pCisJCQlidWZfbGVuID0gdG1wX2xlbjsKKwkJaWYgKCh0bXBfbGVuID0gKHNpemVfdClCTl9udW1fYnl0ZXMoZWNfYikpID4gYnVmX2xlbikKKwkJCWJ1Zl9sZW4gPSB0bXBfbGVuOworCQlpZiAoKHRtcF9sZW4gPSAoc2l6ZV90KUJOX251bV9ieXRlcyhlY19nZW4pKSA+IGJ1Zl9sZW4pCisJCQlidWZfbGVuID0gdG1wX2xlbjsKKwkJaWYgKCh0bXBfbGVuID0gKHNpemVfdClCTl9udW1fYnl0ZXMoZWNfb3JkZXIpKSA+IGJ1Zl9sZW4pCisJCQlidWZfbGVuID0gdG1wX2xlbjsKKwkJaWYgKCh0bXBfbGVuID0gKHNpemVfdClCTl9udW1fYnl0ZXMoZWNfY29mYWN0b3IpKSA+IGJ1Zl9sZW4pCisJCQlidWZfbGVuID0gdG1wX2xlbjsKKworCQlidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4pOworCisJCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJCXsKKwkJCXBlcnJvcigiT1BFTlNTTF9tYWxsb2MiKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCWVjcGFyYW1fcHJpbnRfdmFyKG91dCwgZWNfcCwgImVjX3AiLCBsZW4sIGJ1ZmZlcik7CisJCWVjcGFyYW1fcHJpbnRfdmFyKG91dCwgZWNfYSwgImVjX2EiLCBsZW4sIGJ1ZmZlcik7CisJCWVjcGFyYW1fcHJpbnRfdmFyKG91dCwgZWNfYiwgImVjX2IiLCBsZW4sIGJ1ZmZlcik7CisJCWVjcGFyYW1fcHJpbnRfdmFyKG91dCwgZWNfZ2VuLCAiZWNfZ2VuIiwgbGVuLCBidWZmZXIpOworCQllY3BhcmFtX3ByaW50X3ZhcihvdXQsIGVjX29yZGVyLCAiZWNfb3JkZXIiLCBsZW4sIGJ1ZmZlcik7CisJCWVjcGFyYW1fcHJpbnRfdmFyKG91dCwgZWNfY29mYWN0b3IsICJlY19jb2ZhY3RvciIsIGxlbiwgCisJCQlidWZmZXIpOworCisJCUJJT19wcmludGYob3V0LCAiXG5cbiIpOworCisJCUJJT19wcmludGYob3V0LCAiRUNfR1JPVVAgKmdldF9lY19ncm91cF8lZCh2b2lkKVxuXHR7XG4iLCBsZW4pOworCQlCSU9fcHJpbnRmKG91dCwgIlx0aW50IG9rPTA7XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdEVDX0dST1VQICpncm91cCA9IE5VTEw7XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdEVDX1BPSU5UICpwb2ludCA9IE5VTEw7XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdEJJR05VTSAgICp0bXBfMSA9IE5VTEwsICp0bXBfMiA9IE5VTEwsICIKKwkJCQkiKnRtcF8zID0gTlVMTDtcblxuIik7CisJCUJJT19wcmludGYob3V0LCAiXHRpZiAoKHRtcF8xID0gQk5fYmluMmJuKGVjX3BfJWQsICIKKwkJCQkic2l6ZW9mKGVjX3BfJWQpLCBOVUxMKSkgPT0gTlVMTClcblx0XHQiCisJCQkJImdvdG8gZXJyO1xuIiwgbGVuLCBsZW4pOworCQlCSU9fcHJpbnRmKG91dCwgIlx0aWYgKCh0bXBfMiA9IEJOX2JpbjJibihlY19hXyVkLCAiCisJCQkJInNpemVvZihlY19hXyVkKSwgTlVMTCkpID09IE5VTEwpXG5cdFx0IgorCQkJCSJnb3RvIGVycjtcbiIsIGxlbiwgbGVuKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdGlmICgodG1wXzMgPSBCTl9iaW4yYm4oZWNfYl8lZCwgIgorCQkJCSJzaXplb2YoZWNfYl8lZCksIE5VTEwpKSA9PSBOVUxMKVxuXHRcdCIKKwkJCQkiZ290byBlcnI7XG4iLCBsZW4sIGxlbik7CisJCWlmIChpc19wcmltZSkKKwkJCXsKKwkJCUJJT19wcmludGYob3V0LCAiXHRpZiAoKGdyb3VwID0gRUNfR1JPVVBfbmV3X2N1cnZlXyIKKwkJCQkiR0ZwKHRtcF8xLCB0bXBfMiwgdG1wXzMsIE5VTEwpKSA9PSBOVUxMKSIKKwkJCQkiXG5cdFx0Z290byBlcnI7XG5cbiIpOworCQkJfQorCQllbHNlCisJCQl7CisJCQkvKiBUT0RPICovCisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJQklPX3ByaW50ZihvdXQsICJcdC8qIGJ1aWxkIGdlbmVyYXRvciAqL1xuIik7CisJCUJJT19wcmludGYob3V0LCAiXHRpZiAoKHRtcF8xID0gQk5fYmluMmJuKGVjX2dlbl8lZCwgIgorCQkJCSJzaXplb2YoZWNfZ2VuXyVkKSwgdG1wXzEpKSA9PSBOVUxMKSIKKwkJCQkiXG5cdFx0Z290byBlcnI7XG4iLCBsZW4sIGxlbik7CisJCUJJT19wcmludGYob3V0LCAiXHRwb2ludCA9IEVDX1BPSU5UX2JuMnBvaW50KGdyb3VwLCB0bXBfMSwgIgorCQkJCSJOVUxMLCBOVUxMKTtcbiIpOworCQlCSU9fcHJpbnRmKG91dCwgIlx0aWYgKHBvaW50ID09IE5VTEwpXG5cdFx0Z290byBlcnI7XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdGlmICgodG1wXzIgPSBCTl9iaW4yYm4oZWNfb3JkZXJfJWQsICIKKwkJCQkic2l6ZW9mKGVjX29yZGVyXyVkKSwgdG1wXzIpKSA9PSBOVUxMKSIKKwkJCQkiXG5cdFx0Z290byBlcnI7XG4iLCBsZW4sIGxlbik7CisJCUJJT19wcmludGYob3V0LCAiXHRpZiAoKHRtcF8zID0gQk5fYmluMmJuKGVjX2NvZmFjdG9yXyVkLCAiCisJCQkJInNpemVvZihlY19jb2ZhY3Rvcl8lZCksIHRtcF8zKSkgPT0gTlVMTCkiCisJCQkJIlxuXHRcdGdvdG8gZXJyO1xuIiwgbGVuLCBsZW4pOworCQlCSU9fcHJpbnRmKG91dCwgIlx0aWYgKCFFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKGdyb3VwLCBwb2ludCwiCisJCQkJIiB0bXBfMiwgdG1wXzMpKVxuXHRcdGdvdG8gZXJyO1xuIik7CisJCUJJT19wcmludGYob3V0LCAiXG5cdG9rPTE7XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJlcnI6XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdGlmICh0bXBfMSlcblx0XHRCTl9mcmVlKHRtcF8xKTtcbiIpOworCQlCSU9fcHJpbnRmKG91dCwgIlx0aWYgKHRtcF8yKVxuXHRcdEJOX2ZyZWUodG1wXzIpO1xuIik7CisJCUJJT19wcmludGYob3V0LCAiXHRpZiAodG1wXzMpXG5cdFx0Qk5fZnJlZSh0bXBfMyk7XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdGlmIChwb2ludClcblx0XHRFQ19QT0lOVF9mcmVlKHBvaW50KTtcbiIpOworCQlCSU9fcHJpbnRmKG91dCwgIlx0aWYgKCFvaylcbiIpOworCQlCSU9fcHJpbnRmKG91dCwgIlx0XHR7XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdFx0RUNfR1JPVVBfZnJlZShncm91cCk7XG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJcdFx0Z3JvdXAgPSBOVUxMO1xuIik7CisJCUJJT19wcmludGYob3V0LCAiXHRcdH1cbiIpOworCQlCSU9fcHJpbnRmKG91dCwgIlx0cmV0dXJuKGdyb3VwKTtcblx0fVxuIik7CisJfQorCisJaWYgKCFub291dCkKKwkJeworCQlpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJaSA9IGkyZF9FQ1BLUGFyYW1ldGVyc19iaW8ob3V0LCBncm91cCk7CisJCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQkJaSA9IFBFTV93cml0ZV9iaW9fRUNQS1BhcmFtZXRlcnMob3V0LCBncm91cCk7CisJCWVsc2UJCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBvdXRwdXQgZm9ybWF0IHNwZWNpZmllZCBmb3IiCisJCQkJIiBvdXRmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoIWkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJ1bmFibGUgdG8gd3JpdGUgZWxsaXB0aWMgIgorCQkJCSJjdXJ2ZSBwYXJhbWV0ZXJzXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCQorCWlmIChuZWVkX3JhbmQpCisJCXsKKwkJYXBwX1JBTkRfbG9hZF9maWxlKE5VTEwsIGJpb19lcnIsIChpbnJhbmQgIT0gTlVMTCkpOworCQlpZiAoaW5yYW5kICE9IE5VTEwpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVsZCBzZW1pLXJhbmRvbSBieXRlcyBsb2FkZWRcbiIsCisJCQkJYXBwX1JBTkRfbG9hZF9maWxlcyhpbnJhbmQpKTsKKwkJfQorCisJaWYgKGdlbmtleSkKKwkJeworCQlFQ19LRVkgKmVja2V5ID0gRUNfS0VZX25ldygpOworCisJCWlmIChlY2tleSA9PSBOVUxMKQorCQkJZ290byBlbmQ7CisKKwkJYXNzZXJ0KG5lZWRfcmFuZCk7CisKKwkJaWYgKEVDX0tFWV9zZXRfZ3JvdXAoZWNrZXksIGdyb3VwKSA9PSAwKQorCQkJZ290byBlbmQ7CisJCQorCQlpZiAoIUVDX0tFWV9nZW5lcmF0ZV9rZXkoZWNrZXkpKQorCQkJeworCQkJRUNfS0VZX2ZyZWUoZWNrZXkpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWlmIChvdXRmb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCQlpID0gaTJkX0VDUHJpdmF0ZUtleV9iaW8ob3V0LCBlY2tleSk7CisJCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQkJaSA9IFBFTV93cml0ZV9iaW9fRUNQcml2YXRlS2V5KG91dCwgZWNrZXksIE5VTEwsCisJCQkJTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisJCWVsc2UJCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJiYWQgb3V0cHV0IGZvcm1hdCBzcGVjaWZpZWQgIgorCQkJCSJmb3Igb3V0ZmlsZVxuIik7CisJCQlFQ19LRVlfZnJlZShlY2tleSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJRUNfS0VZX2ZyZWUoZWNrZXkpOworCQl9CisKKwlpZiAobmVlZF9yYW5kKQorCQlhcHBfUkFORF93cml0ZV9maWxlKE5VTEwsIGJpb19lcnIpOworCisJcmV0PTA7CitlbmQ6CisJaWYgKGVjX3ApCisJCUJOX2ZyZWUoZWNfcCk7CisJaWYgKGVjX2EpCisJCUJOX2ZyZWUoZWNfYSk7CisJaWYgKGVjX2IpCisJCUJOX2ZyZWUoZWNfYik7CisJaWYgKGVjX2dlbikKKwkJQk5fZnJlZShlY19nZW4pOworCWlmIChlY19vcmRlcikKKwkJQk5fZnJlZShlY19vcmRlcik7CisJaWYgKGVjX2NvZmFjdG9yKQorCQlCTl9mcmVlKGVjX2NvZmFjdG9yKTsKKwlpZiAoYnVmZmVyKQorCQlPUEVOU1NMX2ZyZWUoYnVmZmVyKTsKKwlpZiAoaW4gIT0gTlVMTCkKKwkJQklPX2ZyZWUoaW4pOworCWlmIChvdXQgIT0gTlVMTCkKKwkJQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKGdyb3VwICE9IE5VTEwpCisJCUVDX0dST1VQX2ZyZWUoZ3JvdXApOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQocmV0KTsKK30KKworc3RhdGljIGludCBlY3BhcmFtX3ByaW50X3ZhcihCSU8gKm91dCwgQklHTlVNICppbiwgY29uc3QgY2hhciAqdmFyLAorCWludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcikKKwl7CisJQklPX3ByaW50ZihvdXQsICJzdGF0aWMgdW5zaWduZWQgY2hhciAlc18lZFtdID0geyIsIHZhciwgbGVuKTsKKwlpZiAoQk5faXNfemVybyhpbikpCisJCUJJT19wcmludGYob3V0LCAiXG5cdDB4MDAiKTsKKwllbHNlIAorCQl7CisJCWludCBpLCBsOworCisJCWwgPSBCTl9ibjJiaW4oaW4sIGJ1ZmZlcik7CisJCWZvciAoaT0wOyBpPGwtMTsgaSsrKQorCQkJeworCQkJaWYgKChpJTEyKSA9PSAwKSAKKwkJCQlCSU9fcHJpbnRmKG91dCwgIlxuXHQiKTsKKwkJCUJJT19wcmludGYob3V0LCAiMHglMDJYLCIsIGJ1ZmZlcltpXSk7CisJCQl9CisJCWlmICgoaSUxMikgPT0gMCkgCisJCQlCSU9fcHJpbnRmKG91dCwgIlxuXHQiKTsKKwkJQklPX3ByaW50ZihvdXQsICIweCUwMlgiLCBidWZmZXJbaV0pOworCQl9CisJQklPX3ByaW50ZihvdXQsICJcblx0fTtcblxuIik7CisJcmV0dXJuIDE7CisJfQorI2Vsc2UgLyogIU9QRU5TU0xfTk9fRUMgKi8KKworIyBpZiBQRURBTlRJQworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyMgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2VuYy5jIGIvbGliL29wZW5zc2wvYXBwcy9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJjOTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9lbmMuYwpAQCAtMCwwICsxLDcyMyBAQAorLyogYXBwcy9lbmMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbXAuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCitpbnQgc2V0X2hleChjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsaW50IHNpemUpOworI3VuZGVmIFNJWkUKKyN1bmRlZiBCU0laRQorI3VuZGVmIFBST0cKKworI2RlZmluZSBTSVpFCSg1MTIpCisjZGVmaW5lIEJTSVpFCSg4KjEwMjQpCisjZGVmaW5lCVBST0cJZW5jX21haW4KKworc3RhdGljIHZvaWQgc2hvd19jaXBoZXJzKGNvbnN0IE9CSl9OQU1FICpuYW1lLHZvaWQgKmJpb18pCisJeworCUJJTyAqYmlvPWJpb187CisJc3RhdGljIGludCBuOworCisJaWYoIWlzbG93ZXIoKHVuc2lnbmVkIGNoYXIpKm5hbWUtPm5hbWUpKQorCQlyZXR1cm47CisKKwlCSU9fcHJpbnRmKGJpbywiLSUtMjVzIixuYW1lLT5uYW1lKTsKKwlpZigrK24gPT0gMykKKwkJeworCQlCSU9fcHJpbnRmKGJpbywiXG4iKTsKKwkJbj0wOworCQl9CisJZWxzZQorCQlCSU9fcHJpbnRmKGJpbywiICIpOworCX0KKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUgKmUgPSBOVUxMOworI2VuZGlmCisJc3RhdGljIGNvbnN0IGNoYXIgbWFnaWNbXT0iU2FsdGVkX18iOworCWNoYXIgbWJ1ZltzaXplb2YgbWFnaWMtMV07CisJY2hhciAqc3RyYnVmPU5VTEw7CisJdW5zaWduZWQgY2hhciAqYnVmZj1OVUxMLCpidWZzaXplPU5VTEw7CisJaW50IGJzaXplPUJTSVpFLHZlcmJvc2U9MDsKKwlpbnQgcmV0PTEsaW5sOworCWludCBub3BhZCA9IDA7CisJdW5zaWduZWQgY2hhciBrZXlbRVZQX01BWF9LRVlfTEVOR1RIXSxpdltFVlBfTUFYX0lWX0xFTkdUSF07CisJdW5zaWduZWQgY2hhciBzYWx0W1BLQ1M1X1NBTFRfTEVOXTsKKwljaGFyICpzdHI9TlVMTCwgKnBhc3NhcmcgPSBOVUxMLCAqcGFzcyA9IE5VTEw7CisJY2hhciAqaGtleT1OVUxMLCpoaXY9TlVMTCwqaHNhbHQgPSBOVUxMOworCWNoYXIgKm1kPU5VTEw7CisJaW50IGVuYz0xLHByaW50a2V5PTAsaSxiYXNlNjQ9MDsKKyNpZmRlZiBaTElCCisJaW50IGRvX3psaWI9MDsKKwlCSU8gKmJ6bCA9IE5VTEw7CisjZW5kaWYKKwlpbnQgZGVidWc9MCxvbGI2ND0wLG5vc2FsdD0wOworCWNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcj1OVUxMLCpjOworCUVWUF9DSVBIRVJfQ1RYICpjdHggPSBOVUxMOworCWNoYXIgKmluZj1OVUxMLCpvdXRmPU5VTEw7CisJQklPICppbj1OVUxMLCpvdXQ9TlVMTCwqYjY0PU5VTEwsKmJlbmM9TlVMTCwqcmJpbz1OVUxMLCp3YmlvPU5VTEw7CisjZGVmaW5lIFBST0dfTkFNRV9TSVpFICAzOQorCWNoYXIgcG5hbWVbUFJPR19OQU1FX1NJWkUrMV07CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lID0gTlVMTDsKKyNlbmRpZgorCWNvbnN0IEVWUF9NRCAqZGdzdD1OVUxMOworCisJYXBwc19zdGFydHVwKCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQlpZiAoKGJpb19lcnI9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fZXJyLHN0ZGVycixCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKworCS8qIGZpcnN0IGNoZWNrIHRoZSBwcm9ncmFtIG5hbWUgKi8KKwlwcm9ncmFtX25hbWUoYXJndlswXSxwbmFtZSxzaXplb2YgcG5hbWUpOworCWlmIChzdHJjbXAocG5hbWUsImJhc2U2NCIpID09IDApCisJCWJhc2U2ND0xOworI2lmZGVmIFpMSUIKKwlpZiAoc3RyY21wKHBuYW1lLCJ6bGliIikgPT0gMCkKKwkJZG9femxpYj0xOworI2VuZGlmCisKKwljaXBoZXI9RVZQX2dldF9jaXBoZXJieW5hbWUocG5hbWUpOworI2lmZGVmIFpMSUIKKwlpZiAoIWRvX3psaWIgJiYgIWJhc2U2NCAmJiAoY2lwaGVyID09IE5VTEwpCisJCQkJJiYgKHN0cmNtcChwbmFtZSwiZW5jIikgIT0gMCkpCisjZWxzZQorCWlmICghYmFzZTY0ICYmIChjaXBoZXIgPT0gTlVMTCkgJiYgKHN0cmNtcChwbmFtZSwiZW5jIikgIT0gMCkpCisjZW5kaWYKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIGlzIGFuIHVua25vd24gY2lwaGVyXG4iLHBuYW1lKTsKKwkJZ290byBiYWQ7CisJCX0KKworCWFyZ2MtLTsKKwlhcmd2Kys7CisJd2hpbGUgKGFyZ2MgPj0gMSkKKwkJeworCQlpZgkoc3RyY21wKCphcmd2LCItZSIpID09IDApCisJCQllbmM9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5mPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBhc3MiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZz0gKigrK2FyZ3YpOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1lbmdpbmUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZW5naW5lPSAqKCsrYXJndik7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItZCIpID09IDApCisJCQllbmM9MDsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcCIpID09IDApCisJCQlwcmludGtleT0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi12IikgPT0gMCkKKwkJCXZlcmJvc2U9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbm9wYWQiKSA9PSAwKQorCQkJbm9wYWQ9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItc2FsdCIpID09IDApCisJCQlub3NhbHQ9MDsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbm9zYWx0IikgPT0gMCkKKwkJCW5vc2FsdD0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1kZWJ1ZyIpID09IDApCisJCQlkZWJ1Zz0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1QIikgPT0gMCkKKwkJCXByaW50a2V5PTI7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLUEiKSA9PSAwKQorCQkJb2xiNjQ9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItYSIpID09IDApCisJCQliYXNlNjQ9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItYmFzZTY0IikgPT0gMCkKKwkJCWJhc2U2ND0xOworI2lmZGVmIFpMSUIKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCIteiIpID09IDApCisJCQlkb196bGliPTE7CisjZW5kaWYKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItYnVmc2l6ZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlidWZzaXplPSh1bnNpZ25lZCBjaGFyICopKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1rIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXN0cj0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1rZmlsZSIpID09IDApCisJCQl7CisJCQlzdGF0aWMgY2hhciBidWZbMTI4XTsKKwkJCUZJTEUgKmluZmlsZTsKKwkJCWNoYXIgKmZpbGU7CisKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWZpbGU9ICooKythcmd2KTsKKwkJCWluZmlsZT1mb3BlbihmaWxlLCJyIik7CisJCQlpZiAoaW5maWxlID09IE5VTEwpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIHJlYWQga2V5IGZyb20gJyVzJ1xuIiwKKwkJCQkJZmlsZSk7CisJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJYnVmWzBdPSdcMCc7CisJCQlpZiAoIWZnZXRzKGJ1ZixzaXplb2YgYnVmLGluZmlsZSkpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIHJlYWQga2V5IGZyb20gJyVzJ1xuIiwKKwkJCQkJZmlsZSk7CisJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJZmNsb3NlKGluZmlsZSk7CisJCQlpPXN0cmxlbihidWYpOworCQkJaWYgKChpID4gMCkgJiYKKwkJCQkoKGJ1ZltpLTFdID09ICdcbicpIHx8IChidWZbaS0xXSA9PSAnXHInKSkpCisJCQkJYnVmWy0taV09J1wwJzsKKwkJCWlmICgoaSA+IDApICYmCisJCQkJKChidWZbaS0xXSA9PSAnXG4nKSB8fCAoYnVmW2ktMV0gPT0gJ1xyJykpKQorCQkJCWJ1ZlstLWldPSdcMCc7CisJCQlpZiAoaSA8IDEpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwiemVybyBsZW5ndGggcGFzc3dvcmRcbiIpOworCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCXN0cj1idWY7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUsiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaGtleT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1TIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWhzYWx0PSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWl2IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWhpdj0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1tZCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQltZD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCSgoYXJndlswXVswXSA9PSAnLScpICYmCisJCQkoKGM9RVZQX2dldF9jaXBoZXJieW5hbWUoJihhcmd2WzBdWzFdKSkpICE9IE5VTEwpKQorCQkJeworCQkJY2lwaGVyPWM7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vbmUiKSA9PSAwKQorCQkJY2lwaGVyPU5VTEw7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJyVzJ1xuIiwqYXJndik7CitiYWQ6CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm9wdGlvbnMgYXJlXG4iKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJS0xNHMgaW5wdXQgZmlsZVxuIiwiLWluIDxmaWxlPiIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyBvdXRwdXQgZmlsZVxuIiwiLW91dCA8ZmlsZT4iKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJS0xNHMgcGFzcyBwaHJhc2Ugc291cmNlXG4iLCItcGFzcyA8YXJnPiIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyBlbmNyeXB0XG4iLCItZSIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyBkZWNyeXB0XG4iLCItZCIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyBiYXNlNjQgZW5jb2RlL2RlY29kZSwgZGVwZW5kaW5nIG9uIGVuY3J5cHRpb24gZmxhZ1xuIiwiLWEvLWJhc2U2NCIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyBwYXNzcGhyYXNlIGlzIHRoZSBuZXh0IGFyZ3VtZW50XG4iLCItayIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyBwYXNzcGhyYXNlIGlzIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBmaWxlIGFyZ3VtZW50XG4iLCIta2ZpbGUiKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJS0xNHMgdGhlIG5leHQgYXJndW1lbnQgaXMgdGhlIG1kIHRvIHVzZSB0byBjcmVhdGUgYSBrZXlcbiIsIi1tZCIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyAgIGZyb20gYSBwYXNzcGhyYXNlLiAgT25lIG9mIG1kMiwgbWQ1LCBzaGEgb3Igc2hhMVxuIiwiIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIiUtMTRzIHNhbHQgaW4gaGV4IGlzIHRoZSBuZXh0IGFyZ3VtZW50XG4iLCItUyIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyBrZXkvaXYgaW4gaGV4IGlzIHRoZSBuZXh0IGFyZ3VtZW50XG4iLCItSy8taXYiKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJS0xNHMgcHJpbnQgdGhlIGl2L2tleSAodGhlbiBleGl0IGlmIC1QKVxuIiwiLVtwUF0iKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJS0xNHMgYnVmZmVyIHNpemVcbiIsIi1idWZzaXplIDxuPiIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyBkaXNhYmxlIHN0YW5kYXJkIGJsb2NrIHBhZGRpbmdcbiIsIi1ub3BhZCIpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE0cyB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIiwiLWVuZ2luZSBlIik7CisjZW5kaWYKKworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJDaXBoZXIgVHlwZXNcbiIpOworCQkJT0JKX05BTUVfZG9fYWxsX3NvcnRlZChPQkpfTkFNRV9UWVBFX0NJUEhFUl9NRVRILAorCQkJCQkgICAgICAgc2hvd19jaXBoZXJzLAorCQkJCQkgICAgICAgYmlvX2Vycik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuIik7CisKKwkJCWdvdG8gZW5kOworCQkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgICAgIGUgPSBzZXR1cF9lbmdpbmUoYmlvX2VyciwgZW5naW5lLCAwKTsKKyNlbmRpZgorCisJaWYgKG1kICYmIChkZ3N0PUVWUF9nZXRfZGlnZXN0YnluYW1lKG1kKSkgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIGlzIGFuIHVuc3VwcG9ydGVkIG1lc3NhZ2UgZGlnZXN0IHR5cGVcbiIsbWQpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGRnc3QgPT0gTlVMTCkKKwkJeworCQlkZ3N0ID0gRVZQX21kNSgpOworCQl9CisKKwlpZiAoYnVmc2l6ZSAhPSBOVUxMKQorCQl7CisJCXVuc2lnbmVkIGxvbmcgbjsKKworCQlmb3IgKG49MDsgKmJ1ZnNpemU7IGJ1ZnNpemUrKykKKwkJCXsKKwkJCWk9ICpidWZzaXplOworCQkJaWYgKChpIDw9ICc5JykgJiYgKGkgPj0gJzAnKSkKKwkJCQluPW4qMTAraS0nMCc7CisJCQllbHNlIGlmIChpID09ICdrJykKKwkJCQl7CisJCQkJbio9MTAyNDsKKwkJCQlidWZzaXplKys7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlpZiAoKmJ1ZnNpemUgIT0gJ1wwJykKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiaW52YWxpZCAnYnVmc2l6ZScgc3BlY2lmaWVkLlxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQkvKiBJdCBtdXN0IGJlIGxhcmdlIGVub3VnaCBmb3IgYSBiYXNlNjQgZW5jb2RlZCBsaW5lICovCisJCWlmIChiYXNlNjQgJiYgbiA8IDgwKSBuPTgwOworCisJCWJzaXplPShpbnQpbjsKKwkJaWYgKHZlcmJvc2UpIEJJT19wcmludGYoYmlvX2VyciwiYnVmc2l6ZT0lZFxuIixic2l6ZSk7CisJCX0KKworCXN0cmJ1Zj1PUEVOU1NMX21hbGxvYyhTSVpFKTsKKwlidWZmPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoRVZQX0VOQ09ERV9MRU5HVEgoYnNpemUpKTsKKwlpZiAoKGJ1ZmYgPT0gTlVMTCkgfHwgKHN0cmJ1ZiA9PSBOVUxMKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIk9QRU5TU0xfbWFsbG9jIGZhaWx1cmUgJWxkXG4iLChsb25nKUVWUF9FTkNPREVfTEVOR1RIKGJzaXplKSk7CisJCWdvdG8gZW5kOworCQl9CisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAoKGluID09IE5VTEwpIHx8IChvdXQgPT0gTlVMTCkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAoZGVidWcpCisJCXsKKwkJQklPX3NldF9jYWxsYmFjayhpbixCSU9fZGVidWdfY2FsbGJhY2spOworCQlCSU9fc2V0X2NhbGxiYWNrKG91dCxCSU9fZGVidWdfY2FsbGJhY2spOworCQlCSU9fc2V0X2NhbGxiYWNrX2FyZyhpbiwoY2hhciAqKWJpb19lcnIpOworCQlCSU9fc2V0X2NhbGxiYWNrX2FyZyhvdXQsKGNoYXIgKiliaW9fZXJyKTsKKwkJfQorCisJaWYgKGluZiA9PSBOVUxMKQorCSAgICAgICAgeworCQlpZiAoYnVmc2l6ZSAhPSBOVUxMKQorCQkJc2V0dmJ1ZihzdGRpbiwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIDApOworCQlCSU9fc2V0X2ZwKGluLHN0ZGluLEJJT19OT0NMT1NFKTsKKwkgICAgICAgIH0KKwllbHNlCisJCXsKKwkJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGluZikgPD0gMCkKKwkJCXsKKwkJCXBlcnJvcihpbmYpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmKCFzdHIgJiYgcGFzc2FyZykgeworCQlpZighYXBwX3Bhc3N3ZChiaW9fZXJyLCBwYXNzYXJnLCBOVUxMLCAmcGFzcywgTlVMTCkpIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgcGFzc3dvcmRcbiIpOworCQkJZ290byBlbmQ7CisJCX0KKwkJc3RyID0gcGFzczsKKwl9CisKKwlpZiAoKHN0ciA9PSBOVUxMKSAmJiAoY2lwaGVyICE9IE5VTEwpICYmIChoa2V5ID09IE5VTEwpKQorCQl7CisJCWZvciAoOzspCisJCQl7CisJCQljaGFyIGJ1ZlsyMDBdOworCisJCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsImVudGVyICVzICVzIHBhc3N3b3JkOiIsCisJCQkJICAgICBPQkpfbmlkMmxuKEVWUF9DSVBIRVJfbmlkKGNpcGhlcikpLAorCQkJCSAgICAgKGVuYyk/ImVuY3J5cHRpb24iOiJkZWNyeXB0aW9uIik7CisJCQlzdHJidWZbMF09J1wwJzsKKwkJCWk9RVZQX3JlYWRfcHdfc3RyaW5nKChjaGFyICopc3RyYnVmLFNJWkUsYnVmLGVuYyk7CisJCQlpZiAoaSA9PSAwKQorCQkJCXsKKwkJCQlpZiAoc3RyYnVmWzBdID09ICdcMCcpCisJCQkJCXsKKwkJCQkJcmV0PTE7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJc3RyPXN0cmJ1ZjsKKwkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoaSA8IDApCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIHBhc3N3b3JkIHJlYWRcbiIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJfQorCisKKwlpZiAob3V0ZiA9PSBOVUxMKQorCQl7CisJCUJJT19zZXRfZnAob3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisJCWlmIChidWZzaXplICE9IE5VTEwpCisJCQlzZXR2YnVmKHN0ZG91dCwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIDApOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQl7CisJCUJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCX0KKyNlbmRpZgorCQl9CisJZWxzZQorCQl7CisJCWlmIChCSU9fd3JpdGVfZmlsZW5hbWUob3V0LG91dGYpIDw9IDApCisJCQl7CisJCQlwZXJyb3Iob3V0Zik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJcmJpbz1pbjsKKwl3YmlvPW91dDsKKworI2lmZGVmIFpMSUIKKworCWlmIChkb196bGliKQorCQl7CisJCWlmICgoYnpsPUJJT19uZXcoQklPX2ZfemxpYigpKSkgPT0gTlVMTCkKKwkJCWdvdG8gZW5kOworCQlpZiAoZW5jKQorCQkJd2Jpbz1CSU9fcHVzaChiemwsd2Jpbyk7CisJCWVsc2UKKwkJCXJiaW89QklPX3B1c2goYnpsLHJiaW8pOworCQl9CisjZW5kaWYKKworCWlmIChiYXNlNjQpCisJCXsKKwkJaWYgKChiNjQ9QklPX25ldyhCSU9fZl9iYXNlNjQoKSkpID09IE5VTEwpCisJCQlnb3RvIGVuZDsKKwkJaWYgKGRlYnVnKQorCQkJeworCQkJQklPX3NldF9jYWxsYmFjayhiNjQsQklPX2RlYnVnX2NhbGxiYWNrKTsKKwkJCUJJT19zZXRfY2FsbGJhY2tfYXJnKGI2NCwoY2hhciAqKWJpb19lcnIpOworCQkJfQorCQlpZiAob2xiNjQpCisJCQlCSU9fc2V0X2ZsYWdzKGI2NCxCSU9fRkxBR1NfQkFTRTY0X05PX05MKTsKKwkJaWYgKGVuYykKKwkJCXdiaW89QklPX3B1c2goYjY0LHdiaW8pOworCQllbHNlCisJCQlyYmlvPUJJT19wdXNoKGI2NCxyYmlvKTsKKwkJfQorCisJaWYgKGNpcGhlciAhPSBOVUxMKQorCQl7CisJCS8qIE5vdGUgdGhhdCBzdHIgaXMgTlVMTCBpZiBhIGtleSB3YXMgcGFzc2VkIG9uIHRoZSBjb21tYW5kCisJCSAqIGxpbmUsIHNvIHdlIGdldCBubyBzYWx0IGluIHRoYXQgY2FzZS4gSXMgdGhpcyBhIGJ1Zz8KKwkJICovCisJCWlmIChzdHIgIT0gTlVMTCkKKwkJCXsKKwkJCS8qIFNhbHQgaGFuZGxpbmc6IGlmIGVuY3J5cHRpbmcgZ2VuZXJhdGUgYSBzYWx0IGFuZAorCQkJICogd3JpdGUgdG8gb3V0cHV0IEJJTy4gSWYgZGVjcnlwdGluZyByZWFkIHNhbHQgZnJvbQorCQkJICogaW5wdXQgQklPLgorCQkJICovCisJCQl1bnNpZ25lZCBjaGFyICpzcHRyOworCQkJaWYobm9zYWx0KSBzcHRyID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCWlmKGVuYykgeworCQkJCQlpZihoc2FsdCkgeworCQkJCQkJaWYoIXNldF9oZXgoaHNhbHQsc2FsdCxzaXplb2Ygc2FsdCkpIHsKKwkJCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCQkJCSJpbnZhbGlkIGhleCBzYWx0IHZhbHVlXG4iKTsKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChSQU5EX3BzZXVkb19ieXRlcyhzYWx0LCBzaXplb2Ygc2FsdCkgPCAwKQorCQkJCQkJZ290byBlbmQ7CisJCQkJCS8qIElmIC1QIG9wdGlvbiB0aGVuIGRvbid0IGJvdGhlciB3cml0aW5nICovCisJCQkJCWlmKChwcmludGtleSAhPSAyKQorCQkJCQkgICAmJiAoQklPX3dyaXRlKHdiaW8sbWFnaWMsCisJCQkJCQkJIHNpemVvZiBtYWdpYy0xKSAhPSBzaXplb2YgbWFnaWMtMQorCQkJCQkgICAgICAgfHwgQklPX3dyaXRlKHdiaW8sCisJCQkJCQkJICAgIChjaGFyICopc2FsdCwKKwkJCQkJCQkgICAgc2l6ZW9mIHNhbHQpICE9IHNpemVvZiBzYWx0KSkgeworCQkJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciB3cml0aW5nIG91dHB1dCBmaWxlXG4iKTsKKwkJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJfSBlbHNlIGlmKEJJT19yZWFkKHJiaW8sbWJ1ZixzaXplb2YgbWJ1ZikgIT0gc2l6ZW9mIG1idWYKKwkJCQkJICB8fCBCSU9fcmVhZChyYmlvLAorCQkJCQkJICAgICAgKHVuc2lnbmVkIGNoYXIgKilzYWx0LAorCQkJCSAgICBzaXplb2Ygc2FsdCkgIT0gc2l6ZW9mIHNhbHQpIHsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciByZWFkaW5nIGlucHV0IGZpbGVcbiIpOworCQkJCQlnb3RvIGVuZDsKKwkJCQl9IGVsc2UgaWYobWVtY21wKG1idWYsbWFnaWMsc2l6ZW9mIG1hZ2ljLTEpKSB7CisJCQkJICAgIEJJT19wcmludGYoYmlvX2VyciwiYmFkIG1hZ2ljIG51bWJlclxuIik7CisJCQkJICAgIGdvdG8gZW5kOworCQkJCX0KKworCQkJCXNwdHIgPSBzYWx0OworCQkJfQorCisJCQlFVlBfQnl0ZXNUb0tleShjaXBoZXIsZGdzdCxzcHRyLAorCQkJCSh1bnNpZ25lZCBjaGFyICopc3RyLAorCQkJCXN0cmxlbihzdHIpLDEsa2V5LGl2KTsKKwkJCS8qIHplcm8gdGhlIGNvbXBsZXRlIGJ1ZmZlciBvciB0aGUgc3RyaW5nCisJCQkgKiBwYXNzZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lCisJCQkgKiBidWcgcGlja2VkIHVwIGJ5CisJCQkgKiBMYXJyeSBKLiBIdWdoZXMgSnIuIDxodWdoZXNAaW5kaWFuYS5lZHU+ICovCisJCQlpZiAoc3RyID09IHN0cmJ1ZikKKwkJCQlPUEVOU1NMX2NsZWFuc2Uoc3RyLFNJWkUpOworCQkJZWxzZQorCQkJCU9QRU5TU0xfY2xlYW5zZShzdHIsc3RybGVuKHN0cikpOworCQkJfQorCQlpZiAoKGhpdiAhPSBOVUxMKSAmJiAhc2V0X2hleChoaXYsaXYsc2l6ZW9mIGl2KSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiaW52YWxpZCBoZXggaXYgdmFsdWVcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWlmICgoaGl2ID09IE5VTEwpICYmIChzdHIgPT0gTlVMTCkKKwkJICAgICYmIEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNpcGhlcikgIT0gMCkKKwkJCXsKKwkJCS8qIE5vIElWIHdhcyBleHBsaWNpdGx5IHNldCBhbmQgbm8gSVYgd2FzIGdlbmVyYXRlZAorCQkJICogZHVyaW5nIEVWUF9CeXRlc1RvS2V5LiBIZW5jZSB0aGUgSVYgaXMgdW5kZWZpbmVkLAorCQkJICogbWFraW5nIGNvcnJlY3QgZGVjcnlwdGlvbiBpbXBvc3NpYmxlLiAqLworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiaXYgdW5kZWZpbmVkXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoKGhrZXkgIT0gTlVMTCkgJiYgIXNldF9oZXgoaGtleSxrZXksc2l6ZW9mIGtleSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImludmFsaWQgaGV4IGtleSB2YWx1ZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQlpZiAoKGJlbmM9QklPX25ldyhCSU9fZl9jaXBoZXIoKSkpID09IE5VTEwpCisJCQlnb3RvIGVuZDsKKworCQkvKiBTaW5jZSB3ZSBtYXkgYmUgY2hhbmdpbmcgcGFyYW1ldGVycyB3b3JrIG9uIHRoZSBlbmNyeXB0aW9uCisJCSAqIGNvbnRleHQgcmF0aGVyIHRoYW4gY2FsbGluZyBCSU9fc2V0X2NpcGhlcigpLgorCQkgKi8KKworCQlCSU9fZ2V0X2NpcGhlcl9jdHgoYmVuYywgJmN0eCk7CisJCWlmICghRVZQX0NpcGhlckluaXRfZXgoY3R4LCBjaXBoZXIsIE5VTEwsIE5VTEwsIE5VTEwsIGVuYykpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBzZXR0aW5nIGNpcGhlciAlc1xuIiwKKwkJCQlFVlBfQ0lQSEVSX25hbWUoY2lwaGVyKSk7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJaWYgKG5vcGFkKQorCQkJRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoY3R4LCAwKTsKKworCQlpZiAoIUVWUF9DaXBoZXJJbml0X2V4KGN0eCwgTlVMTCwgTlVMTCwga2V5LCBpdiwgZW5jKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHNldHRpbmcgY2lwaGVyICVzXG4iLAorCQkJCUVWUF9DSVBIRVJfbmFtZShjaXBoZXIpKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQlpZiAoZGVidWcpCisJCQl7CisJCQlCSU9fc2V0X2NhbGxiYWNrKGJlbmMsQklPX2RlYnVnX2NhbGxiYWNrKTsKKwkJCUJJT19zZXRfY2FsbGJhY2tfYXJnKGJlbmMsKGNoYXIgKiliaW9fZXJyKTsKKwkJCX0KKworCQlpZiAocHJpbnRrZXkpCisJCQl7CisJCQlpZiAoIW5vc2FsdCkKKwkJCQl7CisJCQkJcHJpbnRmKCJzYWx0PSIpOworCQkJCWZvciAoaT0wOyBpPChpbnQpc2l6ZW9mKHNhbHQpOyBpKyspCisJCQkJCXByaW50ZigiJTAyWCIsc2FsdFtpXSk7CisJCQkJcHJpbnRmKCJcbiIpOworCQkJCX0KKwkJCWlmIChjaXBoZXItPmtleV9sZW4gPiAwKQorCQkJCXsKKwkJCQlwcmludGYoImtleT0iKTsKKwkJCQlmb3IgKGk9MDsgaTxjaXBoZXItPmtleV9sZW47IGkrKykKKwkJCQkJcHJpbnRmKCIlMDJYIixrZXlbaV0pOworCQkJCXByaW50ZigiXG4iKTsKKwkJCQl9CisJCQlpZiAoY2lwaGVyLT5pdl9sZW4gPiAwKQorCQkJCXsKKwkJCQlwcmludGYoIml2ID0iKTsKKwkJCQlmb3IgKGk9MDsgaTxjaXBoZXItPml2X2xlbjsgaSsrKQorCQkJCQlwcmludGYoIiUwMlgiLGl2W2ldKTsKKwkJCQlwcmludGYoIlxuIik7CisJCQkJfQorCQkJaWYgKHByaW50a2V5ID09IDIpCisJCQkJeworCQkJCXJldD0wOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJfQorCisJLyogT25seSBlbmNyeXB0L2RlY3J5cHQgYXMgd2Ugd3JpdGUgdGhlIGZpbGUgKi8KKwlpZiAoYmVuYyAhPSBOVUxMKQorCQl3YmlvPUJJT19wdXNoKGJlbmMsd2Jpbyk7CisKKwlmb3IgKDs7KQorCQl7CisJCWlubD1CSU9fcmVhZChyYmlvLChjaGFyICopYnVmZixic2l6ZSk7CisJCWlmIChpbmwgPD0gMCkgYnJlYWs7CisJCWlmIChCSU9fd3JpdGUod2JpbywoY2hhciAqKWJ1ZmYsaW5sKSAhPSBpbmwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHdyaXRpbmcgb3V0cHV0IGZpbGVcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwlpZiAoIUJJT19mbHVzaCh3YmlvKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBkZWNyeXB0XG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCXJldD0wOworCWlmICh2ZXJib3NlKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiYnl0ZXMgcmVhZCAgIDolOGxkXG4iLEJJT19udW1iZXJfcmVhZChpbikpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsImJ5dGVzIHdyaXR0ZW46JThsZFxuIixCSU9fbnVtYmVyX3dyaXR0ZW4ob3V0KSk7CisJCX0KK2VuZDoKKwlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCWlmIChzdHJidWYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHN0cmJ1Zik7CisJaWYgKGJ1ZmYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGJ1ZmYpOworCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJaWYgKG91dCAhPSBOVUxMKSBCSU9fZnJlZV9hbGwob3V0KTsKKwlpZiAoYmVuYyAhPSBOVUxMKSBCSU9fZnJlZShiZW5jKTsKKwlpZiAoYjY0ICE9IE5VTEwpIEJJT19mcmVlKGI2NCk7CisjaWZkZWYgWkxJQgorCWlmIChiemwgIT0gTlVMTCkgQklPX2ZyZWUoYnpsKTsKKyNlbmRpZgorCWlmKHBhc3MpIE9QRU5TU0xfZnJlZShwYXNzKTsKKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQorCitpbnQgc2V0X2hleChjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgc2l6ZSkKKwl7CisJaW50IGksbjsKKwl1bnNpZ25lZCBjaGFyIGo7CisKKwluPXN0cmxlbihpbik7CisJaWYgKG4gPiAoc2l6ZSoyKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImhleCBzdHJpbmcgaXMgdG9vIGxvbmdcbiIpOworCQlyZXR1cm4oMCk7CisJCX0KKwltZW1zZXQob3V0LDAsc2l6ZSk7CisJZm9yIChpPTA7IGk8bjsgaSsrKQorCQl7CisJCWo9KHVuc2lnbmVkIGNoYXIpKmluOworCQkqKGluKyspPSdcMCc7CisJCWlmIChqID09IDApIGJyZWFrOworCQlpZiAoKGogPj0gJzAnKSAmJiAoaiA8PSAnOScpKQorCQkJai09JzAnOworCQllbHNlIGlmICgoaiA+PSAnQScpICYmIChqIDw9ICdGJykpCisJCQlqPWotJ0EnKzEwOworCQllbHNlIGlmICgoaiA+PSAnYScpICYmIChqIDw9ICdmJykpCisJCQlqPWotJ2EnKzEwOworCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vbi1oZXggZGlnaXRcbiIpOworCQkJcmV0dXJuKDApOworCQkJfQorCQlpZiAoaSYxKQorCQkJb3V0W2kvMl18PWo7CisJCWVsc2UKKwkJCW91dFtpLzJdPShqPDw0KTsKKwkJfQorCXJldHVybigxKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2VuZ2luZS5jIGIvbGliL29wZW5zc2wvYXBwcy9lbmdpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTAyOTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9lbmdpbmUuYwpAQCAtMCwwICsxLDU0OSBAQAorLyogYXBwcy9lbmdpbmUuYyAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPiBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIE9QRU5TU0xfTk9fU1RESU8KKyNkZWZpbmUgQVBQU19XSU4xNgorI2VuZGlmCisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCWVuZ2luZV9tYWluCisKK3N0YXRpYyBjb25zdCBjaGFyICplbmdpbmVfdXNhZ2VbXT17CisidXNhZ2U6IGVuZ2luZSBvcHRzIFtlbmdpbmUgLi4uXVxuIiwKKyIgLXZbdlt2W3ZdXV0gLSB2ZXJib3NlIG1vZGUsIGZvciBlYWNoIGVuZ2luZSwgbGlzdCBpdHMgJ2NvbnRyb2wgY29tbWFuZHMnXG4iLAorIiAgICAgICAgICAgICAgIC12diB3aWxsIGFkZGl0aW9uYWxseSBkaXNwbGF5IGVhY2ggY29tbWFuZCdzIGRlc2NyaXB0aW9uXG4iLAorIiAgICAgICAgICAgICAgIC12dnYgd2lsbCBhbHNvIGFkZCB0aGUgaW5wdXQgZmxhZ3MgZm9yIGVhY2ggY29tbWFuZFxuIiwKKyIgICAgICAgICAgICAgICAtdnZ2diB3aWxsIGFsc28gc2hvdyBpbnRlcm5hbCBpbnB1dCBmbGFnc1xuIiwKKyIgLWMgICAgICAgICAgLSBmb3IgZWFjaCBlbmdpbmUsIGFsc28gbGlzdCB0aGUgY2FwYWJpbGl0aWVzXG4iLAorIiAtdFt0XSAgICAgICAtIGZvciBlYWNoIGVuZ2luZSwgY2hlY2sgdGhhdCB0aGV5IGFyZSByZWFsbHkgYXZhaWxhYmxlXG4iLAorIiAgICAgICAgICAgICAgIC10dCB3aWxsIGRpc3BsYXkgZXJyb3IgdHJhY2UgZm9yIHVuYXZhaWxhYmxlIGVuZ2luZXNcbiIsCisiIC1wcmUgPGNtZD4gIC0gcnVucyBjb21tYW5kICdjbWQnIGFnYWluc3QgdGhlIEVOR0lORSBiZWZvcmUgYW55IGF0dGVtcHRzXG4iLAorIiAgICAgICAgICAgICAgIHRvIGxvYWQgaXQgKGlmIC10IGlzIHVzZWQpXG4iLAorIiAtcG9zdCA8Y21kPiAtIHJ1bnMgY29tbWFuZCAnY21kJyBhZ2FpbnN0IHRoZSBFTkdJTkUgYWZ0ZXIgbG9hZGluZyBpdFxuIiwKKyIgICAgICAgICAgICAgICAob25seSB1c2VkIGlmIC10IGlzIGFsc28gcHJvdmlkZWQpXG4iLAorIiBOQjogLXByZSBhbmQgLXBvc3Qgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBFTkdJTkVzIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kXG4iLAorIiBsaW5lLCBvciBhbGwgc3VwcG9ydGVkIEVOR0lORXMgaWYgbm9uZSBhcmUgc3BlY2lmaWVkLlxuIiwKKyIgRWcuICctcHJlIFwiU09fUEFUSDovbGliL2xpYmRyaXZlci5zb1wiJyBjYWxscyBjb21tYW5kIFwiU09fUEFUSFwiIHdpdGhcbiIsCisiIGFyZ3VtZW50IFwiL2xpYi9saWJkcml2ZXIuc29cIi5cbiIsCitOVUxMCit9OworCitzdGF0aWMgdm9pZCBpZGVudGl0eShjaGFyICpwdHIpCisJeworCXJldHVybjsKKwl9CisKK3N0YXRpYyBpbnQgYXBwZW5kX2J1ZihjaGFyICoqYnVmLCBjb25zdCBjaGFyICpzLCBpbnQgKnNpemUsIGludCBzdGVwKQorCXsKKwlpbnQgbCA9IHN0cmxlbihzKTsKKworCWlmICgqYnVmID09IE5VTEwpCisJCXsKKwkJKnNpemUgPSBzdGVwOworCQkqYnVmID0gT1BFTlNTTF9tYWxsb2MoKnNpemUpOworCQlpZiAoKmJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCSoqYnVmID0gJ1wwJzsKKwkJfQorCisJaWYgKCoqYnVmICE9ICdcMCcpCisJCWwgKz0gMjsJCS8qICIsICIgKi8KKworCWlmIChzdHJsZW4oKmJ1ZikgKyBzdHJsZW4ocykgPj0gKHVuc2lnbmVkIGludCkqc2l6ZSkKKwkJeworCQkqc2l6ZSArPSBzdGVwOworCQkqYnVmID0gT1BFTlNTTF9yZWFsbG9jKCpidWYsICpzaXplKTsKKwkJfQorCisJaWYgKCpidWYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKipidWYgIT0gJ1wwJykKKwkJQlVGX3N0cmxjYXQoKmJ1ZiwgIiwgIiwgKnNpemUpOworCUJVRl9zdHJsY2F0KCpidWYsIHMsICpzaXplKTsKKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCB1dGlsX2ZsYWdzKEJJTyAqYmlvX291dCwgdW5zaWduZWQgaW50IGZsYWdzLCBjb25zdCBjaGFyICppbmRlbnQpCisJeworCWludCBzdGFydGVkID0gMCwgZXJyID0gMDsKKwkvKiBJbmRlbnQgYmVmb3JlIGRpc3BsYXlpbmcgaW5wdXQgZmxhZ3MgKi8KKwlCSU9fcHJpbnRmKGJpb19vdXQsICIlcyVzKGlucHV0IGZsYWdzKTogIiwgaW5kZW50LCBpbmRlbnQpOworCWlmKGZsYWdzID09IDApCisJCXsKKwkJQklPX3ByaW50ZihiaW9fb3V0LCAiPG5vIGZsYWdzPlxuIik7CisJCXJldHVybiAxOworCQl9CisgICAgICAgIC8qIElmIHRoZSBvYmplY3QgaXMgaW50ZXJuYWwsIG1hcmsgaXQgaW4gYSB3YXkgdGhhdCBzaG93cyBpbnN0ZWFkIG9mCisgICAgICAgICAqIGhhdmluZyBpdCBwYXJ0IG9mIGFsbCB0aGUgb3RoZXIgZmxhZ3MsIGV2ZW4gaWYgaXQgcmVhbGx5IGlzLiAqLworCWlmKGZsYWdzICYgRU5HSU5FX0NNRF9GTEFHX0lOVEVSTkFMKQorCQl7CisJCUJJT19wcmludGYoYmlvX291dCwgIltJbnRlcm5hbF0gIik7CisJCX0KKworCWlmKGZsYWdzICYgRU5HSU5FX0NNRF9GTEFHX05VTUVSSUMpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fb3V0LCAiTlVNRVJJQyIpOworCQlzdGFydGVkID0gMTsKKwkJfQorCS8qIE5vdyB3ZSBjaGVjayB0aGF0IG5vIGNvbWJpbmF0aW9ucyBvZiB0aGUgbXV0dWFsbHkgZXhjbHVzaXZlIE5VTUVSSUMsCisJICogU1RSSU5HLCBhbmQgTk9fSU5QVVQgZmxhZ3MgaGF2ZSBiZWVuIHVzZWQuIEZ1dHVyZSBmbGFncyB0aGF0IGNhbiBiZQorCSAqIE9SJ2QgdG9nZXRoZXIgd2l0aCB0aGVzZSB3b3VsZCBuZWVkIHRvIGFkZGVkIGFmdGVyIHRoZXNlIHRvIHByZXNlcnZlCisJICogdGhlIHRlc3RpbmcgbG9naWMuICovCisJaWYoZmxhZ3MgJiBFTkdJTkVfQ01EX0ZMQUdfU1RSSU5HKQorCQl7CisJCWlmKHN0YXJ0ZWQpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19vdXQsICJ8Iik7CisJCQllcnIgPSAxOworCQkJfQorCQlCSU9fcHJpbnRmKGJpb19vdXQsICJTVFJJTkciKTsKKwkJc3RhcnRlZCA9IDE7CisJCX0KKwlpZihmbGFncyAmIEVOR0lORV9DTURfRkxBR19OT19JTlBVVCkKKwkJeworCQlpZihzdGFydGVkKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fb3V0LCAifCIpOworCQkJZXJyID0gMTsKKwkJCX0KKwkJQklPX3ByaW50ZihiaW9fb3V0LCAiTk9fSU5QVVQiKTsKKwkJc3RhcnRlZCA9IDE7CisJCX0KKwkvKiBDaGVjayBmb3IgdW5rbm93biBmbGFncyAqLworCWZsYWdzID0gZmxhZ3MgJiB+RU5HSU5FX0NNRF9GTEFHX05VTUVSSUMgJgorCQkJfkVOR0lORV9DTURfRkxBR19TVFJJTkcgJgorCQkJfkVOR0lORV9DTURfRkxBR19OT19JTlBVVCAmCisJCQl+RU5HSU5FX0NNRF9GTEFHX0lOVEVSTkFMOworCWlmKGZsYWdzKQorCQl7CisJCWlmKHN0YXJ0ZWQpIEJJT19wcmludGYoYmlvX291dCwgInwiKTsKKwkJQklPX3ByaW50ZihiaW9fb3V0LCAiPDB4JTA0WD4iLCBmbGFncyk7CisJCX0KKwlpZihlcnIpCisJCUJJT19wcmludGYoYmlvX291dCwgIiAgPGlsbGVnYWwgZmxhZ3MhPiIpOworCUJJT19wcmludGYoYmlvX291dCwgIlxuIik7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IHV0aWxfdmVyYm9zZShFTkdJTkUgKmUsIGludCB2ZXJib3NlLCBCSU8gKmJpb19vdXQsIGNvbnN0IGNoYXIgKmluZGVudCkKKwl7CisJc3RhdGljIGNvbnN0IGludCBsaW5lX3dyYXAgPSA3ODsKKwlpbnQgbnVtOworCWludCByZXQgPSAwOworCWNoYXIgKm5hbWUgPSBOVUxMOworCWNoYXIgKmRlc2MgPSBOVUxMOworCWludCBmbGFnczsKKwlpbnQgeHBvcyA9IDA7CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpjbWRzID0gTlVMTDsKKwlpZighRU5HSU5FX2N0cmwoZSwgRU5HSU5FX0NUUkxfSEFTX0NUUkxfRlVOQ1RJT04sIDAsIE5VTEwsIE5VTEwpIHx8CisJCQkoKG51bSA9IEVOR0lORV9jdHJsKGUsIEVOR0lORV9DVFJMX0dFVF9GSVJTVF9DTURfVFlQRSwKKwkJCQkJMCwgTlVMTCwgTlVMTCkpIDw9IDApKQorCQl7CisjaWYgMAorCQlCSU9fcHJpbnRmKGJpb19vdXQsICIlczxubyBjb250cm9sIGNvbW1hbmRzPlxuIiwgaW5kZW50KTsKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwkJfQorCisJY21kcyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisKKwlpZighY21kcykKKwkJZ290byBlcnI7CisJZG8geworCQlpbnQgbGVuOworCQkvKiBHZXQgdGhlIGNvbW1hbmQgaW5wdXQgZmxhZ3MgKi8KKwkJaWYoKGZsYWdzID0gRU5HSU5FX2N0cmwoZSwgRU5HSU5FX0NUUkxfR0VUX0NNRF9GTEFHUywgbnVtLAorCQkJCQlOVUxMLCBOVUxMKSkgPCAwKQorCQkJZ290byBlcnI7CisgICAgICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiBFTkdJTkVfQ01EX0ZMQUdfSU5URVJOQUwpIHx8IHZlcmJvc2UgPj0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgY29tbWFuZCBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZigobGVuID0gRU5HSU5FX2N0cmwoZSwgRU5HSU5FX0NUUkxfR0VUX05BTUVfTEVOX0ZST01fQ01ELCBudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKChuYW1lID0gT1BFTlNTTF9tYWxsb2MobGVuICsgMSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoRU5HSU5FX2N0cmwoZSwgRU5HSU5FX0NUUkxfR0VUX05BTUVfRlJPTV9DTUQsIG51bSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGNvbW1hbmQgZGVzY3JpcHRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKChsZW4gPSBFTkdJTkVfY3RybChlLCBFTkdJTkVfQ1RSTF9HRVRfREVTQ19MRU5fRlJPTV9DTUQsIG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChkZXNjID0gT1BFTlNTTF9tYWxsb2MobGVuICsgMSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKEVOR0lORV9jdHJsKGUsIEVOR0lORV9DVFJMX0dFVF9ERVNDX0ZST01fQ01ELCBudW0sIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogTm93IGRlY2lkZSBvbiB0aGUgb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZih4cG9zID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIGFuIGluZGVudCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cG9zID0gQklPX3B1dHMoYmlvX291dCwgaW5kZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3RoZXJ3aXNlIHByZXBlbmQgYSAiLCAiICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwb3MgKz0gQklPX3ByaW50ZihiaW9fb3V0LCAiLCAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKHZlcmJvc2UgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBqdXN0IGxpc3RpbmcgbmFtZXMsIGNvbW1hLWRlbGltaXRlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigoeHBvcyA+IChpbnQpc3RybGVuKGluZGVudCkpICYmCisJCQkJCSh4cG9zICsgKGludClzdHJsZW4obmFtZSkgPiBsaW5lX3dyYXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19vdXQsICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwb3MgPSBCSU9fcHV0cyhiaW9fb3V0LCBpbmRlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvcyArPSBCSU9fcHJpbnRmKGJpb19vdXQsICIlcyIsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgbGlzdGluZyBuYW1lcyBwbHVzIGRlc2NyaXB0aW9ucyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19vdXQsICIlczogJXNcbiIsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MgPT0gTlVMTCkgPyAiPG5vIGRlc2NyaXB0aW9uPiIgOiBkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4uIGFuZCBzb21ldGltZXMgaW5wdXQgZmxhZ3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoKHZlcmJvc2UgPj0gMykgJiYgIXV0aWxfZmxhZ3MoYmlvX291dCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJT1BFTlNTTF9mcmVlKG5hbWUpOyBuYW1lID0gTlVMTDsKKwkJaWYoZGVzYykgeyBPUEVOU1NMX2ZyZWUoZGVzYyk7IGRlc2MgPSBOVUxMOyB9CisJCS8qIE1vdmUgdG8gdGhlIG5leHQgY29tbWFuZCAqLworCQludW0gPSBFTkdJTkVfY3RybChlLCBFTkdJTkVfQ1RSTF9HRVRfTkVYVF9DTURfVFlQRSwKKwkJCQkJbnVtLCBOVUxMLCBOVUxMKTsKKwkJfSB3aGlsZShudW0gPiAwKTsKKwlpZih4cG9zID4gMCkKKwkJQklPX3ByaW50ZihiaW9fb3V0LCAiXG4iKTsKKwlyZXQgPSAxOworZXJyOgorCWlmKGNtZHMpIHNrX09QRU5TU0xfU1RSSU5HX3BvcF9mcmVlKGNtZHMsIGlkZW50aXR5KTsKKwlpZihuYW1lKSBPUEVOU1NMX2ZyZWUobmFtZSk7CisJaWYoZGVzYykgT1BFTlNTTF9mcmVlKGRlc2MpOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgdm9pZCB1dGlsX2RvX2NtZHMoRU5HSU5FICplLCBTVEFDS19PRihPUEVOU1NMX1NUUklORykgKmNtZHMsCisJCQlCSU8gKmJpb19vdXQsIGNvbnN0IGNoYXIgKmluZGVudCkKKwl7CisJaW50IGxvb3AsIHJlcywgbnVtID0gc2tfT1BFTlNTTF9TVFJJTkdfbnVtKGNtZHMpOworCisJaWYobnVtIDwgMCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19vdXQsICJbRXJyb3JdOiBpbnRlcm5hbCBzdGFjayBlcnJvclxuIik7CisJCXJldHVybjsKKwkJfQorCWZvcihsb29wID0gMDsgbG9vcCA8IG51bTsgbG9vcCsrKQorCQl7CisJCWNoYXIgYnVmWzI1Nl07CisJCWNvbnN0IGNoYXIgKmNtZCwgKmFyZzsKKwkJY21kID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoY21kcywgbG9vcCk7CisJCXJlcyA9IDE7IC8qIGFzc3VtZSBzdWNjZXNzICovCisJCS8qIENoZWNrIGlmIHRoaXMgY29tbWFuZCBoYXMgbm8gIjphcmciICovCisJCWlmKChhcmcgPSBzdHJzdHIoY21kLCAiOiIpKSA9PSBOVUxMKQorCQkJeworCQkJaWYoIUVOR0lORV9jdHJsX2NtZF9zdHJpbmcoZSwgY21kLCBOVUxMLCAwKSkKKwkJCQlyZXMgPSAwOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZigoaW50KShhcmcgLSBjbWQpID4gMjU0KQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19vdXQsIltFcnJvcl06IGNvbW1hbmQgbmFtZSB0b28gbG9uZ1xuIik7CisJCQkJcmV0dXJuOworCQkJCX0KKwkJCW1lbWNweShidWYsIGNtZCwgKGludCkoYXJnIC0gY21kKSk7CisJCQlidWZbYXJnLWNtZF0gPSAnXDAnOworCQkJYXJnKys7IC8qIE1vdmUgcGFzdCB0aGUgIjoiICovCisJCQkvKiBDYWxsIHRoZSBjb21tYW5kIHdpdGggdGhlIGFyZ3VtZW50ICovCisJCQlpZighRU5HSU5FX2N0cmxfY21kX3N0cmluZyhlLCBidWYsIGFyZywgMCkpCisJCQkJcmVzID0gMDsKKwkJCX0KKwkJaWYocmVzKQorCQkJQklPX3ByaW50ZihiaW9fb3V0LCAiW1N1Y2Nlc3NdOiAlc1xuIiwgY21kKTsKKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fb3V0LCAiW0ZhaWx1cmVdOiAlc1xuIiwgY21kKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX291dCk7CisJCQl9CisJCX0KKwl9CisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJaW50IHJldD0xLGk7CisJY29uc3QgY2hhciAqKnBwOworCWludCB2ZXJib3NlPTAsIGxpc3RfY2FwPTAsIHRlc3RfYXZhaWw9MCwgdGVzdF9hdmFpbF9ub2lzZSA9IDA7CisJRU5HSU5FICplOworCVNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqZW5naW5lcyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpwcmVfY21kcyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpwb3N0X2NtZHMgPSBza19PUEVOU1NMX1NUUklOR19uZXdfbnVsbCgpOworCWludCBiYWRvcHM9MTsKKwlCSU8gKmJpb19vdXQ9TlVMTDsKKwljb25zdCBjaGFyICppbmRlbnQgPSAiICAgICAiOworCisJYXBwc19zdGFydHVwKCk7CisJU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJYmlvX2Vycj1CSU9fbmV3X2ZwKHN0ZGVycixCSU9fTk9DTE9TRSk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKwliaW9fb3V0PUJJT19uZXdfZnAoc3Rkb3V0LEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwl7CisJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJYmlvX291dCA9IEJJT19wdXNoKHRtcGJpbywgYmlvX291dCk7CisJfQorI2VuZGlmCisKKwlhcmdjLS07CisJYXJndisrOworCXdoaWxlIChhcmdjID49IDEpCisJCXsKKwkJaWYgKHN0cm5jbXAoKmFyZ3YsIi12IiwyKSA9PSAwKQorCQkJeworCQkJaWYoc3Ryc3BuKCphcmd2ICsgMSwgInYiKSA8IHN0cmxlbigqYXJndiArIDEpKQorCQkJCWdvdG8gc2tpcF9hcmdfbG9vcDsKKwkJCWlmKCh2ZXJib3NlPXN0cmxlbigqYXJndiArIDEpKSA+IDQpCisJCQkJZ290byBza2lwX2FyZ19sb29wOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jIikgPT0gMCkKKwkJCWxpc3RfY2FwPTE7CisJCWVsc2UgaWYgKHN0cm5jbXAoKmFyZ3YsIi10IiwyKSA9PSAwKQorCQkJeworCQkJdGVzdF9hdmFpbD0xOworCQkJaWYoc3Ryc3BuKCphcmd2ICsgMSwgInQiKSA8IHN0cmxlbigqYXJndiArIDEpKQorCQkJCWdvdG8gc2tpcF9hcmdfbG9vcDsKKwkJCWlmKCh0ZXN0X2F2YWlsX25vaXNlID0gc3RybGVuKCphcmd2ICsgMSkgLSAxKSA+IDEpCisJCQkJZ290byBza2lwX2FyZ19sb29wOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wcmUiKSA9PSAwKQorCQkJeworCQkJYXJnYy0tOyBhcmd2Kys7CisJCQlpZiAoYXJnYyA9PSAwKQorCQkJCWdvdG8gc2tpcF9hcmdfbG9vcDsKKwkJCXNrX09QRU5TU0xfU1RSSU5HX3B1c2gocHJlX2NtZHMsKmFyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wb3N0IikgPT0gMCkKKwkJCXsKKwkJCWFyZ2MtLTsgYXJndisrOworCQkJaWYgKGFyZ2MgPT0gMCkKKwkJCQlnb3RvIHNraXBfYXJnX2xvb3A7CisJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKHBvc3RfY21kcywqYXJndik7CisJCQl9CisJCWVsc2UgaWYgKChzdHJuY21wKCphcmd2LCItaCIsMikgPT0gMCkgfHwKKwkJCQkoc3RyY21wKCphcmd2LCItPyIpID09IDApKQorCQkJZ290byBza2lwX2FyZ19sb29wOworCQllbHNlCisJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKGVuZ2luZXMsKmFyZ3YpOworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCS8qIExvb2tzIGxpa2UgZXZlcnl0aGluZyB3ZW50IE9LICovCisJYmFkb3BzID0gMDsKK3NraXBfYXJnX2xvb3A6CisKKwlpZiAoYmFkb3BzKQorCQl7CisJCWZvciAocHA9ZW5naW5lX3VzYWdlOyAoKnBwICE9IE5VTEwpOyBwcCsrKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlcyIsKnBwKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChza19PUEVOU1NMX1NUUklOR19udW0oZW5naW5lcykgPT0gMCkKKwkJeworCQlmb3IoZSA9IEVOR0lORV9nZXRfZmlyc3QoKTsgZSAhPSBOVUxMOyBlID0gRU5HSU5FX2dldF9uZXh0KGUpKQorCQkJeworCQkJc2tfT1BFTlNTTF9TVFJJTkdfcHVzaChlbmdpbmVzLChjaGFyICopRU5HSU5FX2dldF9pZChlKSk7CisJCQl9CisJCX0KKworCWZvciAoaT0wOyBpPHNrX09QRU5TU0xfU1RSSU5HX251bShlbmdpbmVzKTsgaSsrKQorCQl7CisJCWNvbnN0IGNoYXIgKmlkID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoZW5naW5lcyxpKTsKKwkJaWYgKChlID0gRU5HSU5FX2J5X2lkKGlkKSkgIT0gTlVMTCkKKwkJCXsKKwkJCWNvbnN0IGNoYXIgKm5hbWUgPSBFTkdJTkVfZ2V0X25hbWUoZSk7CisJCQkvKiBEbyAiaWQiIGZpcnN0LCB0aGVuICJuYW1lIi4gRWFzaWVyIHRvIGF1dG8tcGFyc2UuICovCisJCQlCSU9fcHJpbnRmKGJpb19vdXQsICIoJXMpICVzXG4iLCBpZCwgbmFtZSk7CisJCQl1dGlsX2RvX2NtZHMoZSwgcHJlX2NtZHMsIGJpb19vdXQsIGluZGVudCk7CisJCQlpZiAoc3RyY21wKEVOR0lORV9nZXRfaWQoZSksIGlkKSAhPSAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19vdXQsICJMb2FkZWQ6ICglcykgJXNcbiIsCisJCQkJCUVOR0lORV9nZXRfaWQoZSksIEVOR0lORV9nZXRfbmFtZShlKSk7CisJCQkJfQorCQkJaWYgKGxpc3RfY2FwKQorCQkJCXsKKwkJCQlpbnQgY2FwX3NpemUgPSAyNTY7CisJCQkJY2hhciAqY2FwX2J1ZiA9IE5VTEw7CisJCQkJaW50IGssbjsKKwkJCQljb25zdCBpbnQgKm5pZHM7CisJCQkJRU5HSU5FX0NJUEhFUlNfUFRSIGZuX2M7CisJCQkJRU5HSU5FX0RJR0VTVFNfUFRSIGZuX2Q7CisJCQkJRU5HSU5FX1BLRVlfTUVUSFNfUFRSIGZuX3BrOworCisJCQkJaWYgKEVOR0lORV9nZXRfUlNBKGUpICE9IE5VTEwKKwkJCQkJJiYgIWFwcGVuZF9idWYoJmNhcF9idWYsICJSU0EiLAorCQkJCQkJJmNhcF9zaXplLCAyNTYpKQorCQkJCQlnb3RvIGVuZDsKKwkJCQlpZiAoRU5HSU5FX2dldF9EU0EoZSkgIT0gTlVMTAorCQkJCQkmJiAhYXBwZW5kX2J1ZigmY2FwX2J1ZiwgIkRTQSIsCisJCQkJCQkmY2FwX3NpemUsIDI1NikpCisJCQkJCWdvdG8gZW5kOworCQkJCWlmIChFTkdJTkVfZ2V0X0RIKGUpICE9IE5VTEwKKwkJCQkJJiYgIWFwcGVuZF9idWYoJmNhcF9idWYsICJESCIsCisJCQkJCQkmY2FwX3NpemUsIDI1NikpCisJCQkJCWdvdG8gZW5kOworCQkJCWlmIChFTkdJTkVfZ2V0X1JBTkQoZSkgIT0gTlVMTAorCQkJCQkmJiAhYXBwZW5kX2J1ZigmY2FwX2J1ZiwgIlJBTkQiLAorCQkJCQkJJmNhcF9zaXplLCAyNTYpKQorCQkJCQlnb3RvIGVuZDsKKworCQkJCWZuX2MgPSBFTkdJTkVfZ2V0X2NpcGhlcnMoZSk7CisJCQkJaWYoIWZuX2MpIGdvdG8gc2tpcF9jaXBoZXJzOworCQkJCW4gPSBmbl9jKGUsIE5VTEwsICZuaWRzLCAwKTsKKwkJCQlmb3Ioaz0wIDsgayA8IG4gOyArK2spCisJCQkJCWlmKCFhcHBlbmRfYnVmKCZjYXBfYnVmLAorCQkJCQkJICAgICAgIE9CSl9uaWQyc24obmlkc1trXSksCisJCQkJCQkgICAgICAgJmNhcF9zaXplLCAyNTYpKQorCQkJCQkJZ290byBlbmQ7CisKK3NraXBfY2lwaGVyczoKKwkJCQlmbl9kID0gRU5HSU5FX2dldF9kaWdlc3RzKGUpOworCQkJCWlmKCFmbl9kKSBnb3RvIHNraXBfZGlnZXN0czsKKwkJCQluID0gZm5fZChlLCBOVUxMLCAmbmlkcywgMCk7CisJCQkJZm9yKGs9MCA7IGsgPCBuIDsgKytrKQorCQkJCQlpZighYXBwZW5kX2J1ZigmY2FwX2J1ZiwKKwkJCQkJCSAgICAgICBPQkpfbmlkMnNuKG5pZHNba10pLAorCQkJCQkJICAgICAgICZjYXBfc2l6ZSwgMjU2KSkKKwkJCQkJCWdvdG8gZW5kOworCitza2lwX2RpZ2VzdHM6CisJCQkJZm5fcGsgPSBFTkdJTkVfZ2V0X3BrZXlfbWV0aHMoZSk7CisJCQkJaWYoIWZuX3BrKSBnb3RvIHNraXBfcG1ldGhzOworCQkJCW4gPSBmbl9wayhlLCBOVUxMLCAmbmlkcywgMCk7CisJCQkJZm9yKGs9MCA7IGsgPCBuIDsgKytrKQorCQkJCQlpZighYXBwZW5kX2J1ZigmY2FwX2J1ZiwKKwkJCQkJCSAgICAgICBPQkpfbmlkMnNuKG5pZHNba10pLAorCQkJCQkJICAgICAgICZjYXBfc2l6ZSwgMjU2KSkKKwkJCQkJCWdvdG8gZW5kOworc2tpcF9wbWV0aHM6CisJCQkJaWYgKGNhcF9idWYgJiYgKCpjYXBfYnVmICE9ICdcMCcpKQorCQkJCQlCSU9fcHJpbnRmKGJpb19vdXQsICIgWyVzXVxuIiwgY2FwX2J1Zik7CisKKwkJCQlPUEVOU1NMX2ZyZWUoY2FwX2J1Zik7CisJCQkJfQorCQkJaWYodGVzdF9hdmFpbCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fb3V0LCAiJXMiLCBpbmRlbnQpOworCQkJCWlmIChFTkdJTkVfaW5pdChlKSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19vdXQsICJbIGF2YWlsYWJsZSBdXG4iKTsKKwkJCQkJdXRpbF9kb19jbWRzKGUsIHBvc3RfY21kcywgYmlvX291dCwgaW5kZW50KTsKKwkJCQkJRU5HSU5FX2ZpbmlzaChlKTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19vdXQsICJbIHVuYXZhaWxhYmxlIF1cbiIpOworCQkJCQlpZih0ZXN0X2F2YWlsX25vaXNlKQorCQkJCQkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRvdXQpOworCQkJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCQkJfQorCQkJCX0KKwkJCWlmKCh2ZXJib3NlID4gMCkgJiYgIXV0aWxfdmVyYm9zZShlLCB2ZXJib3NlLCBiaW9fb3V0LCBpbmRlbnQpKQorCQkJCWdvdG8gZW5kOworCQkJRU5HSU5FX2ZyZWUoZSk7CisJCQl9CisJCWVsc2UKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCX0KKworCXJldD0wOworZW5kOgorCisJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwlza19PUEVOU1NMX1NUUklOR19wb3BfZnJlZShlbmdpbmVzLCBpZGVudGl0eSk7CisJc2tfT1BFTlNTTF9TVFJJTkdfcG9wX2ZyZWUocHJlX2NtZHMsIGlkZW50aXR5KTsKKwlza19PUEVOU1NMX1NUUklOR19wb3BfZnJlZShwb3N0X2NtZHMsIGlkZW50aXR5KTsKKwlpZiAoYmlvX291dCAhPSBOVUxMKSBCSU9fZnJlZV9hbGwoYmlvX291dCk7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKyNlbHNlCisKKyMgaWYgUEVEQU5USUMKK3N0YXRpYyB2b2lkICpkdW1teT0mZHVtbXk7CisjIGVuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9lcnJzdHIuYyBiL2xpYi9vcGVuc3NsL2FwcHMvZXJyc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzYjk4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvZXJyc3RyLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qIGFwcHMvZXJyc3RyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRwllcnJzdHJfbWFpbgorCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCWludCBpLHJldD0wOworCWNoYXIgYnVmWzI1Nl07CisJdW5zaWduZWQgbG9uZyBsOworCisJYXBwc19zdGFydHVwKCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQlpZiAoKGJpb19lcnI9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fZXJyLHN0ZGVycixCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisKKwlTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisKKwlpZiAoKGFyZ2MgPiAxKSAmJiAoc3RyY21wKGFyZ3ZbMV0sIi1zdGF0cyIpID09IDApKQorCQl7CisJCUJJTyAqb3V0PU5VTEw7CisKKwkJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwkJaWYgKChvdXQgIT0gTlVMTCkgJiYgQklPX3NldF9mcChvdXQsc3Rkb3V0LEJJT19OT0NMT1NFKSkKKwkJCXsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJCXsKKwkJCUJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQkJfQorI2VuZGlmCisJCQlsaF9FUlJfU1RSSU5HX0RBVEFfbm9kZV9zdGF0c19iaW8oCisJCQkJCQkgIEVSUl9nZXRfc3RyaW5nX3RhYmxlKCksIG91dCk7CisJCQlsaF9FUlJfU1RSSU5HX0RBVEFfc3RhdHNfYmlvKEVSUl9nZXRfc3RyaW5nX3RhYmxlKCksCisJCQkJCQkgICAgIG91dCk7CisJCQlsaF9FUlJfU1RSSU5HX0RBVEFfbm9kZV91c2FnZV9zdGF0c19iaW8oCisJCQkJCQkgICAgRVJSX2dldF9zdHJpbmdfdGFibGUoKSxvdXQpOworCQkJfQorCQlpZiAob3V0ICE9IE5VTEwpIEJJT19mcmVlX2FsbChvdXQpOworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCisJZm9yIChpPTE7IGk8YXJnYzsgaSsrKQorCQl7CisJCWlmIChzc2NhbmYoYXJndltpXSwiJWx4IiwmbCkpCisJCQl7CisJCQlFUlJfZXJyb3Jfc3RyaW5nX24obCwgYnVmLCBzaXplb2YgYnVmKTsKKwkJCXByaW50ZigiJXNcbiIsYnVmKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJcHJpbnRmKCIlczogYmFkIGVycm9yIGNvZGVcbiIsYXJndltpXSk7CisJCQlwcmludGYoInVzYWdlOiBlcnJzdHIgWy1zdGF0c10gPGVycm5vPiAuLi5cbiIpOworCQkJcmV0Kys7CisJCQl9CisJCX0KKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9nZW5kaC5jIGIvbGliL29wZW5zc2wvYXBwcy9nZW5kaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTczMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2dlbmRoLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qIGFwcHMvZ2VuZGguYyAqLworLyogb2Jzb2xldGVkIGJ5IGRocGFyYW0uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorLyogVW50aWwgdGhlIGtleS1nZW4gY2FsbGJhY2tzIGFyZSBtb2RpZmllZCB0byB1c2UgbmV3ZXIgcHJvdG90eXBlcywgd2UgYWxsb3cKKyAqIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGZvciBvcGVuc3NsLWludGVybmFsIGNvZGUgKi8KKyNpZmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyN1bmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKyNkZWZpbmUgREVGQklUUwk1MTIKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cgZ2VuZGhfbWFpbgorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGRoX2NiKGludCBwLCBpbnQgbiwgQk5fR0VOQ0IgKmNiKTsKKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlCTl9HRU5DQiBjYjsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUgKmUgPSBOVUxMOworI2VuZGlmCisJREggKmRoPU5VTEw7CisJaW50IHJldD0xLG51bT1ERUZCSVRTOworCWludCBnPTI7CisJY2hhciAqb3V0ZmlsZT1OVUxMOworCWNoYXIgKmlucmFuZD1OVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWNoYXIgKmVuZ2luZT1OVUxMOworI2VuZGlmCisJQklPICpvdXQ9TlVMTDsKKworCWFwcHNfc3RhcnR1cCgpOworCisJQk5fR0VOQ0Jfc2V0KCZjYiwgZGhfY2IsIGJpb19lcnIpOworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJYXJndisrOworCWFyZ2MtLTsKKwlmb3IgKDs7KQorCQl7CisJCWlmIChhcmdjIDw9IDApIGJyZWFrOworCQlpZiAoc3RyY21wKCphcmd2LCItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItMiIpID09IDApCisJCQlnPTI7CisJLyoJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItMyIpID09IDApCisJCQlnPTM7ICovCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLTUiKSA9PSAwKQorCQkJZz01OworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1lbmdpbmUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZW5naW5lPSAqKCsrYXJndik7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcmFuZCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbnJhbmQ9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJCWFyZ3YrKzsKKwkJYXJnYy0tOworCQl9CisJaWYgKChhcmdjID49IDEpICYmICgoc3NjYW5mKCphcmd2LCIlZCIsJm51bSkgPT0gMCkgfHwgKG51bSA8IDApKSkKKwkJeworYmFkOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsInVzYWdlOiBnZW5kaCBbYXJnc10gW251bWJpdHNdXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dCBmaWxlIC0gb3V0cHV0IHRoZSBrZXkgdG8gJ2ZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtMiAgICAgICAgLSB1c2UgMiBhcyB0aGUgZ2VuZXJhdG9yIHZhbHVlXG4iKTsKKwkvKglCSU9fcHJpbnRmKGJpb19lcnIsIiAtMyAgICAgICAgLSB1c2UgMyBhcyB0aGUgZ2VuZXJhdG9yIHZhbHVlXG4iKTsgKi8KKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLTUgICAgICAgIC0gdXNlIDUgYXMgdGhlIGdlbmVyYXRvciB2YWx1ZVxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1lbmdpbmUgZSAtIHVzZSBlbmdpbmUgZSwgcG9zc2libHkgYSBoYXJkd2FyZSBkZXZpY2UuXG4iKTsKKyNlbmRpZgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcmFuZCBmaWxlJWNmaWxlJWMuLi5cbiIsIExJU1RfU0VQQVJBVE9SX0NIQVIsIExJU1RfU0VQQVJBVE9SX0NIQVIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgLSBsb2FkIHRoZSBmaWxlIChvciB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSkgaW50b1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuIik7CisJCWdvdG8gZW5kOworCQl9CisJCQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCW91dD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKG91dCA9PSBOVUxMKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAob3V0ZmlsZSA9PSBOVUxMKQorCQl7CisJCUJJT19zZXRfZnAob3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCW91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJfQorI2VuZGlmCisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEJJT193cml0ZV9maWxlbmFtZShvdXQsb3V0ZmlsZSkgPD0gMCkKKwkJCXsKKwkJCXBlcnJvcihvdXRmaWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAoIWFwcF9SQU5EX2xvYWRfZmlsZShOVUxMLCBiaW9fZXJyLCAxKSAmJiBpbnJhbmQgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIndhcm5pbmcsIG5vdCBtdWNoIGV4dHJhIHJhbmRvbSBkYXRhLCBjb25zaWRlciB1c2luZyB0aGUgLXJhbmQgb3B0aW9uXG4iKTsKKwkJfQorCWlmIChpbnJhbmQgIT0gTlVMTCkKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlbGQgc2VtaS1yYW5kb20gYnl0ZXMgbG9hZGVkXG4iLAorCQkJYXBwX1JBTkRfbG9hZF9maWxlcyhpbnJhbmQpKTsKKworCUJJT19wcmludGYoYmlvX2VyciwiR2VuZXJhdGluZyBESCBwYXJhbWV0ZXJzLCAlZCBiaXQgbG9uZyBzYWZlIHByaW1lLCBnZW5lcmF0b3IgJWRcbiIsbnVtLGcpOworCUJJT19wcmludGYoYmlvX2VyciwiVGhpcyBpcyBnb2luZyB0byB0YWtlIGEgbG9uZyB0aW1lXG4iKTsKKworCWlmKCgoZGggPSBESF9uZXcoKSkgPT0gTlVMTCkgfHwgIURIX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoZGgsIG51bSwgZywgJmNiKSkKKwkJZ290byBlbmQ7CisJCQorCWFwcF9SQU5EX3dyaXRlX2ZpbGUoTlVMTCwgYmlvX2Vycik7CisKKwlpZiAoIVBFTV93cml0ZV9iaW9fREhwYXJhbXMob3V0LGRoKSkKKwkJZ290byBlbmQ7CisJcmV0PTA7CitlbmQ6CisJaWYgKHJldCAhPSAwKQorCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCWlmIChvdXQgIT0gTlVMTCkgQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKGRoICE9IE5VTEwpIERIX2ZyZWUoZGgpOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZGhfY2IoaW50IHAsIGludCBuLCBCTl9HRU5DQiAqY2IpCisJeworCWNoYXIgYz0nKic7CisKKwlpZiAocCA9PSAwKSBjPScuJzsKKwlpZiAocCA9PSAxKSBjPScrJzsKKwlpZiAocCA9PSAyKSBjPScqJzsKKwlpZiAocCA9PSAzKSBjPSdcbic7CisJQklPX3dyaXRlKGNiLT5hcmcsJmMsMSk7CisJKHZvaWQpQklPX2ZsdXNoKGNiLT5hcmcpOworI2lmZGVmIExJTlQKKwlwPW47CisjZW5kaWYKKwlyZXR1cm4gMTsKKwl9CisjZWxzZSAvKiAhT1BFTlNTTF9OT19ESCAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZ2VuZHNhLmMgYi9saWIvb3BlbnNzbC9hcHBzL2dlbmRzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzM5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL2dlbmRzYS5jCkBAIC0wLDAgKzEsMjg4IEBACisvKiBhcHBzL2dlbmRzYS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CS8qIGZvciBPUEVOU1NMX05PX0RTQSAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKyNkZWZpbmUgREVGQklUUwk1MTIKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cgZ2VuZHNhX21haW4KKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUgKmUgPSBOVUxMOworI2VuZGlmCisJRFNBICpkc2E9TlVMTDsKKwlpbnQgcmV0PTE7CisJY2hhciAqb3V0ZmlsZT1OVUxMOworCWNoYXIgKmlucmFuZD1OVUxMLCpkc2FwYXJhbXM9TlVMTDsKKwljaGFyICpwYXNzYXJnb3V0ID0gTlVMTCwgKnBhc3NvdXQgPSBOVUxMOworCUJJTyAqb3V0PU5VTEwsKmluPU5VTEw7CisJY29uc3QgRVZQX0NJUEhFUiAqZW5jPU5VTEw7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lPU5VTEw7CisjZW5kaWYKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJaWYgKChiaW9fZXJyPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoYmlvX2VycixzdGRlcnIsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisKKwlhcmd2Kys7CisJYXJnYy0tOworCWZvciAoOzspCisJCXsKKwkJaWYgKGFyZ2MgPD0gMCkgYnJlYWs7CisJCWlmIChzdHJjbXAoKmFyZ3YsIi1vdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wYXNzb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXBhc3NhcmdvdXQ9ICooKythcmd2KTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWVuZ2luZT0gKigrK2FyZ3YpOworCQkJfQorI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXJhbmQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5yYW5kPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLSIpID09IDApCisJCQlnb3RvIGJhZDsKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZGVzIikgPT0gMCkKKwkJCWVuYz1FVlBfZGVzX2NiYygpOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1kZXMzIikgPT0gMCkKKwkJCWVuYz1FVlBfZGVzX2VkZTNfY2JjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWlkZWEiKSA9PSAwKQorCQkJZW5jPUVWUF9pZGVhX2NiYygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zZWVkIikgPT0gMCkKKwkJCWVuYz1FVlBfc2VlZF9jYmMoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1hZXMxMjgiKSA9PSAwKQorCQkJZW5jPUVWUF9hZXNfMTI4X2NiYygpOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1hZXMxOTIiKSA9PSAwKQorCQkJZW5jPUVWUF9hZXNfMTkyX2NiYygpOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1hZXMyNTYiKSA9PSAwKQorCQkJZW5jPUVWUF9hZXNfMjU2X2NiYygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY2FtZWxsaWExMjgiKSA9PSAwKQorCQkJZW5jPUVWUF9jYW1lbGxpYV8xMjhfY2JjKCk7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNhbWVsbGlhMTkyIikgPT0gMCkKKwkJCWVuYz1FVlBfY2FtZWxsaWFfMTkyX2NiYygpOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jYW1lbGxpYTI1NiIpID09IDApCisJCQllbmM9RVZQX2NhbWVsbGlhXzI1Nl9jYmMoKTsKKyNlbmRpZgorCQllbHNlIGlmICgqKmFyZ3YgIT0gJy0nICYmIGRzYXBhcmFtcyA9PSBOVUxMKQorCQkJeworCQkJZHNhcGFyYW1zID0gKmFyZ3Y7CisJCQl9CisJCWVsc2UKKwkJCWdvdG8gYmFkOworCQlhcmd2Kys7CisJCWFyZ2MtLTsKKwkJfQorCisJaWYgKGRzYXBhcmFtcyA9PSBOVUxMKQorCQl7CitiYWQ6CisJCUJJT19wcmludGYoYmlvX2VyciwidXNhZ2U6IGdlbmRzYSBbYXJnc10gZHNhcGFyYW0tZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vdXQgZmlsZSAtIG91dHB1dCB0aGUga2V5IHRvICdmaWxlJ1xuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1kZXMgICAgICAtIGVuY3J5cHQgdGhlIGdlbmVyYXRlZCBrZXkgd2l0aCBERVMgaW4gY2JjIG1vZGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtZGVzMyAgICAgLSBlbmNyeXB0IHRoZSBnZW5lcmF0ZWQga2V5IHdpdGggREVTIGluIGVkZSBjYmMgbW9kZSAoMTY4IGJpdCBrZXkpXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWlkZWEgICAgIC0gZW5jcnlwdCB0aGUgZ2VuZXJhdGVkIGtleSB3aXRoIElERUEgaW4gY2JjIG1vZGVcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtc2VlZFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgc2VlZFxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWFlczEyOCwgLWFlczE5MiwgLWFlczI1NlxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgYWVzXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1jYW1lbGxpYTEyOCwgLWNhbWVsbGlhMTkyLCAtY2FtZWxsaWEyNTZcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgZW5jcnlwdCBQRU0gb3V0cHV0IHdpdGggY2JjIGNhbWVsbGlhXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtZW5naW5lIGUgLSB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXJhbmQgZmlsZSVjZmlsZSVjLi4uXG4iLCBMSVNUX1NFUEFSQVRPUl9DSEFSLCBMSVNUX1NFUEFSQVRPUl9DSEFSKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgIC0gbG9hZCB0aGUgZmlsZSAob3IgdGhlIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkpIGludG9cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiBkc2FwYXJhbS1maWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgIC0gYSBEU0EgcGFyYW1ldGVyIGZpbGUgYXMgZ2VuZXJhdGVkIGJ5IHRoZSBkc2FwYXJhbSBjb21tYW5kXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmKCFhcHBfcGFzc3dkKGJpb19lcnIsIE5VTEwsIHBhc3NhcmdvdXQsIE5VTEwsICZwYXNzb3V0KSkgeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBnZXR0aW5nIHBhc3N3b3JkXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKCEoQklPX3JlYWRfZmlsZW5hbWUoaW4sZHNhcGFyYW1zKSkpCisJCXsKKwkJcGVycm9yKGRzYXBhcmFtcyk7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoKGRzYT1QRU1fcmVhZF9iaW9fRFNBcGFyYW1zKGluLE5VTEwsTlVMTCxOVUxMKSkgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsInVuYWJsZSB0byBsb2FkIERTQSBwYXJhbWV0ZXIgZmlsZVxuIik7CisJCWdvdG8gZW5kOworCQl9CisJQklPX2ZyZWUoaW4pOworCWluID0gTlVMTDsKKwkJCisJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAob3V0ID09IE5VTEwpIGdvdG8gZW5kOworCisJaWYgKG91dGZpbGUgPT0gTlVMTCkKKwkJeworCQlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQl7CisJCUJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCX0KKyNlbmRpZgorCQl9CisJZWxzZQorCQl7CisJCWlmIChCSU9fd3JpdGVfZmlsZW5hbWUob3V0LG91dGZpbGUpIDw9IDApCisJCQl7CisJCQlwZXJyb3Iob3V0ZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJaWYgKCFhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgMSkgJiYgaW5yYW5kID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ3YXJuaW5nLCBub3QgbXVjaCBleHRyYSByYW5kb20gZGF0YSwgY29uc2lkZXIgdXNpbmcgdGhlIC1yYW5kIG9wdGlvblxuIik7CisJCX0KKwlpZiAoaW5yYW5kICE9IE5VTEwpCisJCUJJT19wcmludGYoYmlvX2VyciwiJWxkIHNlbWktcmFuZG9tIGJ5dGVzIGxvYWRlZFxuIiwKKwkJCWFwcF9SQU5EX2xvYWRfZmlsZXMoaW5yYW5kKSk7CisKKwlCSU9fcHJpbnRmKGJpb19lcnIsIkdlbmVyYXRpbmcgRFNBIGtleSwgJWQgYml0c1xuIiwKKwkJCQkJCQlCTl9udW1fYml0cyhkc2EtPnApKTsKKwlpZiAoIURTQV9nZW5lcmF0ZV9rZXkoZHNhKSkgZ290byBlbmQ7CisKKwlhcHBfUkFORF93cml0ZV9maWxlKE5VTEwsIGJpb19lcnIpOworCisJaWYgKCFQRU1fd3JpdGVfYmlvX0RTQVByaXZhdGVLZXkob3V0LGRzYSxlbmMsTlVMTCwwLE5VTEwsIHBhc3NvdXQpKQorCQlnb3RvIGVuZDsKKwlyZXQ9MDsKK2VuZDoKKwlpZiAocmV0ICE9IDApCisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJaWYgKGluICE9IE5VTEwpIEJJT19mcmVlKGluKTsKKwlpZiAob3V0ICE9IE5VTEwpIEJJT19mcmVlX2FsbChvdXQpOworCWlmIChkc2EgIT0gTlVMTCkgRFNBX2ZyZWUoZHNhKTsKKwlpZihwYXNzb3V0KSBPUEVOU1NMX2ZyZWUocGFzc291dCk7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKyNlbHNlIC8qICFPUEVOU1NMX05PX0RTQSAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvZ2VucGtleS5jIGIvbGliL29wZW5zc2wvYXBwcy9nZW5wa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmZGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvZ2VucGtleS5jCkBAIC0wLDAgKzEsNDQwIEBACisvKiBhcHBzL2dlbnBrZXkuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKworc3RhdGljIGludCBpbml0X2tleWdlbl9maWxlKEJJTyAqZXJyLCBFVlBfUEtFWV9DVFggKipwY3R4LAorCQkJCWNvbnN0IGNoYXIgKmZpbGUsIEVOR0lORSAqZSk7CitzdGF0aWMgaW50IGdlbnBrZXlfY2IoRVZQX1BLRVlfQ1RYICpjdHgpOworCisjZGVmaW5lIFBST0cgZ2VucGtleV9tYWluCisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJRU5HSU5FICplID0gTlVMTDsKKwljaGFyICoqYXJncywgKm91dGZpbGUgPSBOVUxMOworCWNoYXIgKnBhc3NhcmcgPSBOVUxMOworCUJJTyAqaW4gPSBOVUxMLCAqb3V0ID0gTlVMTDsKKwljb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIgPSBOVUxMOworCWludCBvdXRmb3JtYXQ7CisJaW50IHRleHQgPSAwOworCUVWUF9QS0VZICpwa2V5PU5VTEw7CisJRVZQX1BLRVlfQ1RYICpjdHggPSBOVUxMOworCWNoYXIgKnBhc3MgPSBOVUxMOworCWludCBiYWRhcmcgPSAwOworCWludCByZXQgPSAxLCBydjsKKworCWludCBkb19wYXJhbSA9IDA7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQliaW9fZXJyID0gQklPX25ld19mcCAoc3RkZXJyLCBCSU9fTk9DTE9TRSk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKworCW91dGZvcm1hdD1GT1JNQVRfUEVNOworCisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKwlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOworCWFyZ3MgPSBhcmd2ICsgMTsKKwl3aGlsZSAoIWJhZGFyZyAmJiAqYXJncyAmJiAqYXJnc1swXSA9PSAnLScpCisJCXsKKwkJaWYgKCFzdHJjbXAoKmFyZ3MsIi1vdXRmb3JtIikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCW91dGZvcm1hdD1zdHIyZm10KCphcmdzKTsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1wYXNzIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pIGdvdG8gYmFkOworCQkJcGFzc2FyZz0gKigrK2FyZ3MpOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3MsIi1lbmdpbmUiKSA9PSAwKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYmFkOworICAgICAgICAJCWUgPSBzZXR1cF9lbmdpbmUoYmlvX2VyciwgKigrK2FyZ3MpLCAwKTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1wYXJhbWZpbGUiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGJhZDsKKwkJCWFyZ3MrKzsKKwkJCWlmIChkb19wYXJhbSA9PSAxKQorCQkJCWdvdG8gYmFkOworCQkJaWYgKCFpbml0X2tleWdlbl9maWxlKGJpb19lcnIsICZjdHgsICphcmdzLCBlKSkKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItb3V0IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCW91dGZpbGUgPSAqYXJnczsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJncywiLWFsZ29yaXRobSIpID09IDApCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBiYWQ7CisJCQlpZiAoIWluaXRfZ2VuX3N0cihiaW9fZXJyLCAmY3R4LCAqKCsrYXJncyksZSwgZG9fcGFyYW0pKQorCQkJCWdvdG8gZW5kOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3MsIi1wa2V5b3B0IikgPT0gMCkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGJhZDsKKwkJCWlmICghY3R4KQorCQkJCXsKKwkJCQlCSU9fcHV0cyhiaW9fZXJyLCAiTm8ga2V5dHlwZSBzcGVjaWZpZWRcbiIpOworCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCWVsc2UgaWYgKHBrZXlfY3RybF9zdHJpbmcoY3R4LCAqKCsrYXJncykpIDw9IDApCisJCQkJeworCQkJCUJJT19wdXRzKGJpb19lcnIsICJwYXJhbWV0ZXIgc2V0dGluZyBlcnJvclxuIik7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJncywiLWdlbnBhcmFtIikgPT0gMCkKKwkJCXsKKwkJCWlmIChjdHgpCisJCQkJZ290byBiYWQ7CisJCQlkb19wYXJhbSA9IDE7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJncywiLXRleHQiKSA9PSAwKQorCQkJdGV4dD0xOworCQllbHNlCisJCQl7CisJCQljaXBoZXIgPSBFVlBfZ2V0X2NpcGhlcmJ5bmFtZSgqYXJncyArIDEpOworCQkJaWYgKCFjaXBoZXIpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIlVua25vd24gY2lwaGVyICVzXG4iLAorCQkJCQkJCQkqYXJncyArIDEpOworCQkJCWJhZGFyZyA9IDE7CisJCQkJfQorCQkJaWYgKGRvX3BhcmFtID09IDEpCisJCQkJYmFkYXJnID0gMTsKKwkJCX0KKwkJYXJncysrOworCQl9CisKKwlpZiAoIWN0eCkKKwkJYmFkYXJnID0gMTsKKworCWlmIChiYWRhcmcpCisJCXsKKwkJYmFkOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsICJVc2FnZTogZ2VucGtleSBbb3B0aW9uc11cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJ3aGVyZSBvcHRpb25zIG1heSBiZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1vdXQgZmlsZSAgICAgICAgICBvdXRwdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1vdXRmb3JtIFggICAgICAgICBvdXRwdXQgZm9ybWF0IChERVIgb3IgUEVNKVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1wYXNzIGFyZyAgICAgICAgICBvdXRwdXQgZmlsZSBwYXNzIHBocmFzZSBzb3VyY2VcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItPGNpcGhlcj4gICAgICAgICAgdXNlIGNpcGhlciA8Y2lwaGVyPiB0byBlbmNyeXB0IHRoZSBrZXlcbiIpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQlCSU9fcHJpbnRmKGJpb19lcnIsICItZW5naW5lIGUgICAgICAgICAgdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIpOworI2VuZGlmCisJCUJJT19wcmludGYoYmlvX2VyciwgIi1wYXJhbWZpbGUgZmlsZSAgICBwYXJhbWV0ZXJzIGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItYWxnb3JpdGhtIGFsZyAgICAgdGhlIHB1YmxpYyBrZXkgYWxnb3JpdGhtXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLXBrZXlvcHQgb3B0OnZhbHVlIHNldCB0aGUgcHVibGljIGtleSBhbGdvcml0aG0gb3B0aW9uIDxvcHQ+XG4iCisJCQkJICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICB0byB2YWx1ZSA8dmFsdWU+XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLWdlbnBhcmFtICAgICAgICAgIGdlbmVyYXRlIHBhcmFtZXRlcnMsIG5vdCBrZXlcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItdGV4dCAgICAgICAgICAgICAgcHJpbnQgdGhlIGluIHRleHRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJOQjogb3B0aW9ucyBvcmRlciBtYXkgYmUgaW1wb3J0YW50ISAgU2VlIHRoZSBtYW51YWwgcGFnZS5cbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmcsIE5VTEwsICZwYXNzLCBOVUxMKSkKKwkJeworCQlCSU9fcHV0cyhiaW9fZXJyLCAiRXJyb3IgZ2V0dGluZyBwYXNzd29yZFxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAob3V0ZmlsZSkKKwkJeworCQlpZiAoIShvdXQgPSBCSU9fbmV3X2ZpbGUgKG91dGZpbGUsICJ3YiIpKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJb3V0ID0gQklPX25ld19mcCAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCQl7CisJCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJCW91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwlFVlBfUEtFWV9DVFhfc2V0X2NiKGN0eCwgZ2VucGtleV9jYik7CisJRVZQX1BLRVlfQ1RYX3NldF9hcHBfZGF0YShjdHgsIGJpb19lcnIpOworCisJaWYgKGRvX3BhcmFtKQorCQl7CisJCWlmIChFVlBfUEtFWV9wYXJhbWdlbihjdHgsICZwa2V5KSA8PSAwKQorCQkJeworCQkJQklPX3B1dHMoYmlvX2VyciwgIkVycm9yIGdlbmVyYXRpbmcgcGFyYW1ldGVyc1xuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEVWUF9QS0VZX2tleWdlbihjdHgsICZwa2V5KSA8PSAwKQorCQkJeworCQkJQklPX3B1dHMoYmlvX2VyciwgIkVycm9yIGdlbmVyYXRpbmcga2V5XG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJaWYgKGRvX3BhcmFtKQorCQlydiA9IFBFTV93cml0ZV9iaW9fUGFyYW1ldGVycyhvdXQsIHBrZXkpOworCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKSAKKwkJcnYgPSBQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkob3V0LCBwa2V5LCBjaXBoZXIsIE5VTEwsIDAsCisJCQkJCQkJCU5VTEwsIHBhc3MpOworCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJcnYgPSBpMmRfUHJpdmF0ZUtleV9iaW8ob3V0LCBwa2V5KTsKKwllbHNlCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiQmFkIGZvcm1hdCBzcGVjaWZpZWQgZm9yIGtleVxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAocnYgPD0gMCkKKwkJeworCQlCSU9fcHV0cyhiaW9fZXJyLCAiRXJyb3Igd3JpdGluZyBrZXlcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQl9CisKKwlpZiAodGV4dCkKKwkJeworCQlpZiAoZG9fcGFyYW0pCisJCQlydiA9IEVWUF9QS0VZX3ByaW50X3BhcmFtcyhvdXQsIHBrZXksIDAsIE5VTEwpOworCQllbHNlCisJCQlydiA9IEVWUF9QS0VZX3ByaW50X3ByaXZhdGUob3V0LCBwa2V5LCAwLCBOVUxMKTsKKworCQlpZiAocnYgPD0gMCkKKwkJCXsKKwkJCUJJT19wdXRzKGJpb19lcnIsICJFcnJvciBwcmludGluZyBrZXlcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCX0KKwkJfQorCisJcmV0ID0gMDsKKworCWVuZDoKKwlpZiAocGtleSkKKwkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlpZiAoY3R4KQorCQlFVlBfUEtFWV9DVFhfZnJlZShjdHgpOworCWlmIChvdXQpCisJCUJJT19mcmVlX2FsbChvdXQpOworCUJJT19mcmVlKGluKTsKKwlpZiAocGFzcykKKwkJT1BFTlNTTF9mcmVlKHBhc3MpOworCisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgaW5pdF9rZXlnZW5fZmlsZShCSU8gKmVyciwgRVZQX1BLRVlfQ1RYICoqcGN0eCwKKwkJCQljb25zdCBjaGFyICpmaWxlLCBFTkdJTkUgKmUpCisJeworCUJJTyAqcGJpbzsKKwlFVlBfUEtFWSAqcGtleSA9IE5VTEw7CisJRVZQX1BLRVlfQ1RYICpjdHggPSBOVUxMOworCWlmICgqcGN0eCkKKwkJeworCQlCSU9fcHV0cyhlcnIsICJQYXJhbWV0ZXJzIGFscmVhZHkgc2V0IVxuIik7CisJCXJldHVybiAwOworCQl9CisKKwlwYmlvID0gQklPX25ld19maWxlKGZpbGUsICJyIik7CisJaWYgKCFwYmlvKQorCQl7CisJCUJJT19wcmludGYoZXJyLCAiQ2FuJ3Qgb3BlbiBwYXJhbWV0ZXIgZmlsZSAlc1xuIiwgZmlsZSk7CisJCXJldHVybiAwOworCQl9CisKKwlwa2V5ID0gUEVNX3JlYWRfYmlvX1BhcmFtZXRlcnMocGJpbywgTlVMTCk7CisJQklPX2ZyZWUocGJpbyk7CisKKwlpZiAoIXBrZXkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgcmVhZGluZyBwYXJhbWV0ZXIgZmlsZSAlc1xuIiwgZmlsZSk7CisJCXJldHVybiAwOworCQl9CisKKwljdHggPSBFVlBfUEtFWV9DVFhfbmV3KHBrZXksIGUpOworCWlmICghY3R4KQorCQlnb3RvIGVycjsKKwlpZiAoRVZQX1BLRVlfa2V5Z2VuX2luaXQoY3R4KSA8PSAwKQorCQlnb3RvIGVycjsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCSpwY3R4ID0gY3R4OworCXJldHVybiAxOworCisJZXJyOgorCUJJT19wdXRzKGVyciwgIkVycm9yIGluaXRpYWxpemluZyBjb250ZXh0XG4iKTsKKwlFUlJfcHJpbnRfZXJyb3JzKGVycik7CisJaWYgKGN0eCkKKwkJRVZQX1BLRVlfQ1RYX2ZyZWUoY3R4KTsKKwlpZiAocGtleSkKKwkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlyZXR1cm4gMDsKKworCX0KKworaW50IGluaXRfZ2VuX3N0cihCSU8gKmVyciwgRVZQX1BLRVlfQ1RYICoqcGN0eCwKKwkJCWNvbnN0IGNoYXIgKmFsZ25hbWUsIEVOR0lORSAqZSwgaW50IGRvX3BhcmFtKQorCXsKKwlFVlBfUEtFWV9DVFggKmN0eCA9IE5VTEw7CisJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCUVOR0lORSAqdG1wZW5nID0gTlVMTDsKKwlpbnQgcGtleV9pZDsKKworCWlmICgqcGN0eCkKKwkJeworCQlCSU9fcHV0cyhlcnIsICJBbGdvcml0aG0gYWxyZWFkeSBzZXQhXG4iKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kX3N0cigmdG1wZW5nLCBhbGduYW1lLCAtMSk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoIWFtZXRoICYmIGUpCisJCWFtZXRoID0gRU5HSU5FX2dldF9wa2V5X2FzbjFfbWV0aF9zdHIoZSwgYWxnbmFtZSwgLTEpOworI2VuZGlmCisKKwlpZiAoIWFtZXRoKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkFsZ29yaXRobSAlcyBub3QgZm91bmRcbiIsIGFsZ25hbWUpOworCQlyZXR1cm4gMDsKKwkJfQorCisJRVJSX2NsZWFyX2Vycm9yKCk7CisKKwlFVlBfUEtFWV9hc24xX2dldDBfaW5mbygmcGtleV9pZCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgYW1ldGgpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmICh0bXBlbmcpCisJCUVOR0lORV9maW5pc2godG1wZW5nKTsKKyNlbmRpZgorCWN0eCA9IEVWUF9QS0VZX0NUWF9uZXdfaWQocGtleV9pZCwgZSk7CisKKwlpZiAoIWN0eCkKKwkJZ290byBlcnI7CisJaWYgKGRvX3BhcmFtKQorCQl7CisJCWlmIChFVlBfUEtFWV9wYXJhbWdlbl9pbml0KGN0eCkgPD0gMCkKKwkJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmIChFVlBfUEtFWV9rZXlnZW5faW5pdChjdHgpIDw9IDApCisJCQlnb3RvIGVycjsKKwkJfQorCisJKnBjdHggPSBjdHg7CisJcmV0dXJuIDE7CisKKwllcnI6CisJQklPX3ByaW50ZihlcnIsICJFcnJvciBpbml0aWFsaXppbmcgJXMgY29udGV4dFxuIiwgYWxnbmFtZSk7CisJRVJSX3ByaW50X2Vycm9ycyhlcnIpOworCWlmIChjdHgpCisJCUVWUF9QS0VZX0NUWF9mcmVlKGN0eCk7CisJcmV0dXJuIDA7CisKKwl9CisKK3N0YXRpYyBpbnQgZ2VucGtleV9jYihFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJY2hhciBjPScqJzsKKwlCSU8gKmIgPSBFVlBfUEtFWV9DVFhfZ2V0X2FwcF9kYXRhKGN0eCk7CisJaW50IHA7CisJcCA9IEVWUF9QS0VZX0NUWF9nZXRfa2V5Z2VuX2luZm8oY3R4LCAwKTsKKwlpZiAocCA9PSAwKSBjPScuJzsKKwlpZiAocCA9PSAxKSBjPScrJzsKKwlpZiAocCA9PSAyKSBjPScqJzsKKwlpZiAocCA9PSAzKSBjPSdcbic7CisJQklPX3dyaXRlKGIsJmMsMSk7CisJKHZvaWQpQklPX2ZsdXNoKGIpOworI2lmZGVmIExJTlQKKwlwPW47CisjZW5kaWYKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2dlbnJzYS5jIGIvbGliL29wZW5zc2wvYXBwcy9nZW5yc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2U5MzEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9nZW5yc2EuYwpAQCAtMCwwICsxLDMzNSBAQAorLyogYXBwcy9nZW5yc2EuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorLyogVW50aWwgdGhlIGtleS1nZW4gY2FsbGJhY2tzIGFyZSBtb2RpZmllZCB0byB1c2UgbmV3ZXIgcHJvdG90eXBlcywgd2UgYWxsb3cKKyAqIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGZvciBvcGVuc3NsLWludGVybmFsIGNvZGUgKi8KKyNpZmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyN1bmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCisjZGVmaW5lIERFRkJJVFMJNTEyCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HIGdlbnJzYV9tYWluCisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZ2VucnNhX2NiKGludCBwLCBpbnQgbiwgQk5fR0VOQ0IgKmNiKTsKKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlCTl9HRU5DQiBjYjsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUgKmUgPSBOVUxMOworI2VuZGlmCisJaW50IHJldD0xOworCWludCBpLG51bT1ERUZCSVRTOworCWxvbmcgbDsKKwljb25zdCBFVlBfQ0lQSEVSICplbmM9TlVMTDsKKwl1bnNpZ25lZCBsb25nIGY0PVJTQV9GNDsKKwljaGFyICpvdXRmaWxlPU5VTEw7CisJY2hhciAqcGFzc2FyZ291dCA9IE5VTEwsICpwYXNzb3V0ID0gTlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwljaGFyICplbmdpbmU9TlVMTDsKKyNlbmRpZgorCWNoYXIgKmlucmFuZD1OVUxMOworCUJJTyAqb3V0PU5VTEw7CisJQklHTlVNICpibiA9IEJOX25ldygpOworCVJTQSAqcnNhID0gTlVMTDsKKworCWlmKCFibikgZ290byBlcnI7CisKKwlhcHBzX3N0YXJ0dXAoKTsKKwlCTl9HRU5DQl9zZXQoJmNiLCBnZW5yc2FfY2IsIGJpb19lcnIpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJaWYgKChiaW9fZXJyPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoYmlvX2VycixzdGRlcnIsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlcnI7CisJaWYgKChvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGNyZWF0ZSBCSU8gZm9yIG91dHB1dFxuIik7CisJCWdvdG8gZXJyOworCQl9CisKKwlhcmd2Kys7CisJYXJnYy0tOworCWZvciAoOzspCisJCXsKKwkJaWYgKGFyZ2MgPD0gMCkgYnJlYWs7CisJCWlmIChzdHJjbXAoKmFyZ3YsIi1vdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi0zIikgPT0gMCkKKwkJCWY0PTM7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUY0IikgPT0gMCB8fCBzdHJjbXAoKmFyZ3YsIi1mNCIpID09IDApCisJCQlmND1SU0FfRjQ7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVuZ2luZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQllbmdpbmU9ICooKythcmd2KTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1yYW5kIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWlucmFuZD0gKigrK2FyZ3YpOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1kZXMiKSA9PSAwKQorCQkJZW5jPUVWUF9kZXNfY2JjKCk7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWRlczMiKSA9PSAwKQorCQkJZW5jPUVWUF9kZXNfZWRlM19jYmMoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaWRlYSIpID09IDApCisJCQllbmM9RVZQX2lkZWFfY2JjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXNlZWQiKSA9PSAwKQorCQkJZW5jPUVWUF9zZWVkX2NiYygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWFlczEyOCIpID09IDApCisJCQllbmM9RVZQX2Flc18xMjhfY2JjKCk7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWFlczE5MiIpID09IDApCisJCQllbmM9RVZQX2Flc18xOTJfY2JjKCk7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWFlczI1NiIpID09IDApCisJCQllbmM9RVZQX2Flc18yNTZfY2JjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jYW1lbGxpYTEyOCIpID09IDApCisJCQllbmM9RVZQX2NhbWVsbGlhXzEyOF9jYmMoKTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY2FtZWxsaWExOTIiKSA9PSAwKQorCQkJZW5jPUVWUF9jYW1lbGxpYV8xOTJfY2JjKCk7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNhbWVsbGlhMjU2IikgPT0gMCkKKwkJCWVuYz1FVlBfY2FtZWxsaWFfMjU2X2NiYygpOworI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBhc3NvdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZ291dD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlCisJCQlicmVhazsKKwkJYXJndisrOworCQlhcmdjLS07CisJCX0KKwlpZiAoKGFyZ2MgPj0gMSkgJiYgKChzc2NhbmYoKmFyZ3YsIiVkIiwmbnVtKSA9PSAwKSB8fCAobnVtIDwgMCkpKQorCQl7CitiYWQ6CisJCUJJT19wcmludGYoYmlvX2VyciwidXNhZ2U6IGdlbnJzYSBbYXJnc10gW251bWJpdHNdXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWRlcyAgICAgICAgICAgIGVuY3J5cHQgdGhlIGdlbmVyYXRlZCBrZXkgd2l0aCBERVMgaW4gY2JjIG1vZGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtZGVzMyAgICAgICAgICAgZW5jcnlwdCB0aGUgZ2VuZXJhdGVkIGtleSB3aXRoIERFUyBpbiBlZGUgY2JjIG1vZGUgKDE2OCBiaXQga2V5KVxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaWRlYSAgICAgICAgICAgZW5jcnlwdCB0aGUgZ2VuZXJhdGVkIGtleSB3aXRoIElERUEgaW4gY2JjIG1vZGVcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtc2VlZFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgc2VlZFxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWFlczEyOCwgLWFlczE5MiwgLWFlczI1NlxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgYWVzXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1jYW1lbGxpYTEyOCwgLWNhbWVsbGlhMTkyLCAtY2FtZWxsaWEyNTZcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgZW5jcnlwdCBQRU0gb3V0cHV0IHdpdGggY2JjIGNhbWVsbGlhXG4iKTsKKyNlbmRpZgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtb3V0IGZpbGUgICAgICAgb3V0cHV0IHRoZSBrZXkgdG8gJ2ZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcGFzc291dCBhcmcgICAgb3V0cHV0IGZpbGUgcGFzcyBwaHJhc2Ugc291cmNlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWY0ICAgICAgICAgICAgIHVzZSBGNCAoMHgxMDAwMSkgZm9yIHRoZSBFIHZhbHVlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLTMgICAgICAgICAgICAgIHVzZSAzIGZvciB0aGUgRSB2YWx1ZVxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1lbmdpbmUgZSAgICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXJhbmQgZmlsZSVjZmlsZSVjLi4uXG4iLCBMSVNUX1NFUEFSQVRPUl9DSEFSLCBMSVNUX1NFUEFSQVRPUl9DSEFSKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICAgIGxvYWQgdGhlIGZpbGUgKG9yIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5KSBpbnRvXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICAgIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuIik7CisJCWdvdG8gZXJyOworCQl9CisJCQorCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKwlpZighYXBwX3Bhc3N3ZChiaW9fZXJyLCBOVUxMLCBwYXNzYXJnb3V0LCBOVUxMLCAmcGFzc291dCkpIHsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgZ2V0dGluZyBwYXNzd29yZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmIChvdXRmaWxlID09IE5VTEwpCisJCXsKKwkJQklPX3NldF9mcChvdXQsc3Rkb3V0LEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJeworCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxvdXRmaWxlKSA8PSAwKQorCQkJeworCQkJcGVycm9yKG91dGZpbGUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCWlmICghYXBwX1JBTkRfbG9hZF9maWxlKE5VTEwsIGJpb19lcnIsIDEpICYmIGlucmFuZCA9PSBOVUxMCisJCSYmICFSQU5EX3N0YXR1cygpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2Vyciwid2FybmluZywgbm90IG11Y2ggZXh0cmEgcmFuZG9tIGRhdGEsIGNvbnNpZGVyIHVzaW5nIHRoZSAtcmFuZCBvcHRpb25cbiIpOworCQl9CisJaWYgKGlucmFuZCAhPSBOVUxMKQorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVsZCBzZW1pLXJhbmRvbSBieXRlcyBsb2FkZWRcbiIsCisJCQlhcHBfUkFORF9sb2FkX2ZpbGVzKGlucmFuZCkpOworCisJQklPX3ByaW50ZihiaW9fZXJyLCJHZW5lcmF0aW5nIFJTQSBwcml2YXRlIGtleSwgJWQgYml0IGxvbmcgbW9kdWx1c1xuIiwKKwkJbnVtKTsKKyNpZmRlZiBPUEVOU1NMX05PX0VOR0lORQorCXJzYSA9IFJTQV9uZXcoKTsKKyNlbHNlCisJcnNhID0gUlNBX25ld19tZXRob2QoZSk7CisjZW5kaWYKKwlpZiAoIXJzYSkKKwkJZ290byBlcnI7CisKKwlpZighQk5fc2V0X3dvcmQoYm4sIGY0KSB8fCAhUlNBX2dlbmVyYXRlX2tleV9leChyc2EsIG51bSwgYm4sICZjYikpCisJCWdvdG8gZXJyOworCQkKKwlhcHBfUkFORF93cml0ZV9maWxlKE5VTEwsIGJpb19lcnIpOworCisJLyogV2UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nIGZvciB3aGVuIHRoZSBiYXNlIG51bWJlciBzaXplIGlzIDwKKwkgKiBsb25nLCBlc3Agd2luZG93cyAzLjEgOi0oLiAqLworCWw9MEw7CisJZm9yIChpPTA7IGk8cnNhLT5lLT50b3A7IGkrKykKKwkJeworI2lmbmRlZiBTSVhUWV9GT1VSX0JJVAorCQlsPDw9Qk5fQklUUzQ7CisJCWw8PD1CTl9CSVRTNDsKKyNlbmRpZgorCQlsKz1yc2EtPmUtPmRbaV07CisJCX0KKwlCSU9fcHJpbnRmKGJpb19lcnIsImUgaXMgJWxkICgweCVsWClcbiIsbCxsKTsKKwl7CisJUFdfQ0JfREFUQSBjYl9kYXRhOworCWNiX2RhdGEucGFzc3dvcmQgPSBwYXNzb3V0OworCWNiX2RhdGEucHJvbXB0X2luZm8gPSBvdXRmaWxlOworCWlmICghUEVNX3dyaXRlX2Jpb19SU0FQcml2YXRlS2V5KG91dCxyc2EsZW5jLE5VTEwsMCwKKwkJKHBlbV9wYXNzd29yZF9jYiAqKXBhc3N3b3JkX2NhbGxiYWNrLCZjYl9kYXRhKSkKKwkJZ290byBlcnI7CisJfQorCisJcmV0PTA7CitlcnI6CisJaWYgKGJuKSBCTl9mcmVlKGJuKTsKKwlpZiAocnNhKSBSU0FfZnJlZShyc2EpOworCWlmIChvdXQpIEJJT19mcmVlX2FsbChvdXQpOworCWlmKHBhc3NvdXQpIE9QRU5TU0xfZnJlZShwYXNzb3V0KTsKKwlpZiAocmV0ICE9IDApCisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKworc3RhdGljIGludCBNU19DQUxMQkFDSyBnZW5yc2FfY2IoaW50IHAsIGludCBuLCBCTl9HRU5DQiAqY2IpCisJeworCWNoYXIgYz0nKic7CisKKwlpZiAocCA9PSAwKSBjPScuJzsKKwlpZiAocCA9PSAxKSBjPScrJzsKKwlpZiAocCA9PSAyKSBjPScqJzsKKwlpZiAocCA9PSAzKSBjPSdcbic7CisJQklPX3dyaXRlKGNiLT5hcmcsJmMsMSk7CisJKHZvaWQpQklPX2ZsdXNoKGNiLT5hcmcpOworI2lmZGVmIExJTlQKKwlwPW47CisjZW5kaWYKKwlyZXR1cm4gMTsKKwl9CisjZWxzZSAvKiAhT1BFTlNTTF9OT19SU0EgKi8KKworIyBpZiBQRURBTlRJQworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyMgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL2luc3RhbGwuY29tIGIvbGliL29wZW5zc2wvYXBwcy9pbnN0YWxsLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTgyMWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9pbnN0YWxsLmNvbQpAQCAtMCwwICsxLDY1IEBACiskISBJTlNUQUxMLkNPTSAtLSBJbnN0YWxscyB0aGUgZmlsZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnkgdHJlZQorJCEKKyQhIEF1dGhvcjogUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPgorJCEgVGltZSBvZiBjcmVhdGlvbjogMjItTUFZLTE5OTggMTA6MTMKKyQhCiskISBQMQlyb290IG9mIHRoZSBkaXJlY3RvcnkgdHJlZQorJCEKKyQKKyQJSUYgUDEgLkVRUy4gIiIKKyQJVEhFTgorJAkgICAgV1JJVEUgU1lTJE9VVFBVVCAiRmlyc3QgYXJndW1lbnQgbWlzc2luZy4iCiskCSAgICBXUklURSBTWVMkT1VUUFVUIC0KKwkJICAiU2hvdWxkIGJlIHRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91IHdhbnQgdGhpbmdzIGluc3RhbGxlZC4iCiskCSAgICBFWElUCiskCUVORElGCiskCiskCUlGIChGJEdFVFNZSSgiQ1BVIikuTFQuMTI4KQorJAlUSEVOCiskCSAgICBBUkNIIDo9IFZBWAorJAlFTFNFCiskCSAgICBBUkNIID0gRiRFRElUKCBGJEdFVFNZSSggIkFSQ0hfTkFNRSIpLCAiVVBDQVNFIikKKyQJICAgIElGIChBUkNIIC5FUVMuICIiKSBUSEVOIEFSQ0ggPSAiVU5LIgorJAlFTkRJRgorJAorJAlST09UID0gRiRQQVJTRShQMSwiW11BLjswIiwsLCJTWU5UQVhfT05MWSxOT19DT05DRUFMIikgLSAiQS47MCIKKyQJUk9PVF9ERVYgPSBGJFBBUlNFKFJPT1QsLCwiREVWSUNFIiwiU1lOVEFYX09OTFkiKQorJAlST09UX0RJUiA9IEYkUEFSU0UoUk9PVCwsLCJESVJFQ1RPUlkiLCJTWU5UQVhfT05MWSIpIC0KKwkJICAgLSAiWzAwMDAwMC4iIC0gIl1bIiAtICJbIiAtICJdIgorJAlST09UID0gUk9PVF9ERVYgKyAiWyIgKyBST09UX0RJUgorJAorJAlERUZJTkUvTk9MT0cgV1JLX1NTTFJPT1QgJ1JPT1QnLl0gL1RSQU5TPUNPTkMKKyQJREVGSU5FL05PTE9HIFdSS19TU0xFWEUgV1JLX1NTTFJPT1Q6WydBUkNIJ19FWEVdCiskCiskCUlGIEYkUEFSU0UoIldSS19TU0xST09UOlswMDAwMDBdIikgLkVRUy4gIiIgVEhFTiAtCisJICAgQ1JFQVRFL0RJUi9MT0cgV1JLX1NTTFJPT1Q6WzAwMDAwMF0KKyQJSUYgRiRQQVJTRSgiV1JLX1NTTEVYRToiKSAuRVFTLiAiIiBUSEVOIC0KKwkgICBDUkVBVEUvRElSL0xPRyBXUktfU1NMRVhFOgorJAorJAlFWEUgOj0gb3BlbnNzbAorJAorJAlFWEVfRElSIDo9IFstLidBUkNIJy5FWEUuQVBQU10KKyQKKyQJSSA9IDAKKyQgTE9PUF9FWEU6IAorJAlFID0gRiRFRElUKEYkRUxFTUVOVChJLCAiLCIsIEVYRSksIlRSSU0iKQorJAlJID0gSSArIDEKKyQJSUYgRSAuRVFTLiAiLCIgVEhFTiBHT1RPIExPT1BfRVhFX0VORAorJAlTRVQgTk9PTgorJAlJRiBGJFNFQVJDSChFWEVfRElSK0UrIi5FWEUiKSAuTkVTLiAiIgorJAlUSEVOCiskCSAgQ09QWSAnRVhFX0RJUicnRScuRVhFIFdSS19TU0xFWEU6J0UnLkVYRS9sb2cKKyQJICBTRVQgRklMRS9QUk9UPVc6UkUgV1JLX1NTTEVYRTonRScuRVhFCiskCUVORElGCiskCVNFVCBPTgorJAlHT1RPIExPT1BfRVhFCiskIExPT1BfRVhFX0VORDoKKyQKKyQJU0VUIE5PT04KKyQJQ09QWSBDQS5DT00gV1JLX1NTTEVYRTpDQS5DT00vTE9HCiskCVNFVCBGSUxFL1BST1Q9VzpSRSBXUktfU1NMRVhFOkNBLkNPTQorJAlDT1BZIE9QRU5TU0wtVk1TLkNORiBXUktfU1NMUk9PVDpbMDAwMDAwXU9QRU5TU0wuQ05GL0xPRworJAlTRVQgRklMRS9QUk9UPVc6UiBXUktfU1NMUk9PVDpbMDAwMDAwXU9QRU5TU0wuQ05GCiskCVNFVCBPTgorJAorJAlFWElUCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL21ha2VhcHBzLmNvbSBiL2xpYi9vcGVuc3NsL2FwcHMvbWFrZWFwcHMuY29tCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZjI4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL21ha2VhcHBzLmNvbQpAQCAtMCwwICsxLDk5NyBAQAorJCEKKyQhICBNQUtFQVBQUy5DT00KKyQhICBXcml0dGVuIEJ5OiAgUm9iZXJ0IEJ5ZXIKKyQhICAgICAgICAgICAgICAgVmljZS1QcmVzaWRlbnQKKyQhICAgICAgICAgICAgICAgQS1Db20gQ29tcHV0aW5nLCBJbmMuCiskISAgICAgICAgICAgICAgIGJ5ZXJAbWFpbC5hbGwtbmV0Lm5ldAorJCEKKyQhICBDaGFuZ2VzIGJ5IFJpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz4KKyQhICAgICAgICAgICAgIFpvbHRhbiBBcnBhZGZmeSA8em9saUBwb2xhcmhvbWUuY29tPiAgIAorJCEKKyQhICBUaGlzIGNvbW1hbmQgZmlsZXMgY29tcGlsZXMgYW5kIGNyZWF0ZXMgYWxsIHRoZSB2YXJpb3VzIGRpZmZlcmVudAorJCEgICJhcHBsaWNhdGlvbiIgcHJvZ3JhbXMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZW5jcnlwdGlvbiBmb3IgT3BlblNTTC4KKyQhICBUaGUgRVhFJ3MgYXJlIHBsYWNlZCBpbiB0aGUgZGlyZWN0b3J5IFsueHh4LkVYRS5BUFBTXSB3aGVyZSAieHh4IiBkZW5vdGVzCiskISAgQUxQSEEsIElBNjQgb3IgVkFYLCBkZXBlbmRpbmcgb24geW91ciBtYWNoaW5lIGFyY2hpdGVjdHVyZS4KKyQhCiskISAgSXQgd2FzIHdyaXR0ZW4gc28gaXQgd291bGQgdHJ5IHRvIGRldGVybWluZSB3aGF0ICJDIiBjb21waWxlciB0bworJCEgIHVzZSBvciB5b3UgY2FuIHNwZWNpZnkgd2hpY2ggIkMiIGNvbXBpbGVyIHRvIHVzZS4KKyQhCiskISAgU3BlY2lmeSBERUJVRyBvciBOT0RFQlVHIGFzIFAxIHRvIGNvbXBpbGUgd2l0aCBvciB3aXRob3V0IGRlYnVnZ2VyCiskISAgaW5mb3JtYXRpb24uCiskIQorJCEgIFNwZWNpZnkgd2hpY2ggY29tcGlsZXIgYXQgUDIgdG8gdHJ5IHRvIGNvbXBpbGUgdW5kZXIuCiskIQorJCEJICAgVkFYQwkgRm9yIFZBWCBDLgorJCEJICAgREVDQwkgRm9yIERFQyBDLgorJCEJICAgR05VQwkgRm9yIEdOVSBDLgorJCEKKyQhICBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSBhIGNvbXBpbGVyLCBpdCB3aWxsIHRyeSB0byBkZXRlcm1pbmUgd2hpY2gKKyQhICAiQyIgY29tcGlsZXIgdG8gdXNlLgorJCEKKyQhICBQMywgaWYgZGVmaW5lZCwgc2V0cyBhIFRDUC9JUCBsaWJyYXJ5IHRvIHVzZSwgdGhyb3VnaCBvbmUgb2YgdGhlIGZvbGxvd2luZworJCEgIGtleXdvcmRzOgorJCEKKyQhCVVDWAkJZm9yIFVDWAorJCEJU09DS0VUU0hSCWZvciBTT0NLRVRTSFIrTkVUTElCCiskIQlUQ1BJUAkJZm9yIFRDUElQIChwb3N0IFVDWCkKKyQhCiskISAgUDQsIGlmIGRlZmluZWQsIHNldHMgYSBjb21waWxlciB0aHJlYWQgTk9UIG5lZWRlZCBvbiBPcGVuVk1TIDcuMSAoYW5kIHVwKQorJCEKKyQhICBQNSwgaWYgZGVmaW5lZCwgc2V0cyBhIGNob2ljZSBvZiBwcm9ncmFtcyB0byBjb21waWxlLgorJCEKKyQhCiskISBEZWZpbmUgQSBUQ1AvSVAgTGlicmFyeSBUaGF0IFdlIFdpbGwgTmVlZCBUbyBMaW5rIFRvLgorJCEgKFRoYXQgSXMsIElmIFdlIE5lZWQgVG8gTGluayBUbyBPbmUuKQorJCEKKyQgVENQSVBfTElCID0gIiIKKyQhCiskISBDaGVjayBXaGF0IEFyY2hpdGVjdHVyZSBXZSBBcmUgVXNpbmcuCiskIQorJCBJRiAoRiRHRVRTWUkoIkNQVSIpLkxULjEyOCkKKyQgVEhFTgorJCEKKyQhICBUaGUgQXJjaGl0ZWN0dXJlIElzIFZBWC4KKyQhCiskICAgQVJDSCA9ICJWQVgiCiskIQorJCEgRWxzZS4uLgorJCEKKyQgRUxTRQorJCEKKyQhICBUaGUgQXJjaGl0ZWN0dXJlIElzIEFscGhhLCBJQTY0IG9yIHdoYXRldmVyIGNvbWVzIGluIHRoZSBmdXR1cmUuCiskIQorJCAgIEFSQ0ggPSBGJEVESVQoIEYkR0VUU1lJKCAiQVJDSF9OQU1FIiksICJVUENBU0UiKQorJCAgIElGIChBUkNIIC5FUVMuICIiKSBUSEVOIEFSQ0ggPSAiVU5LIgorJCEKKyQhIEVuZCBUaGUgQXJjaGl0ZWN0dXJlIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBEZWZpbmUgd2hhdCBwcm9ncmFtcyBzaG91bGQgYmUgY29tcGlsZWQKKyQhCiskIFBST0dSQU1TIDo9IE9QRU5TU0wKKyQhCiskISBEZWZpbmUgVGhlIENSWVBUTyBMaWJyYXJ5LgorJCEKKyQgQ1JZUFRPX0xJQiA6PSBTWVMkRElTSzpbLS4nQVJDSCcuRVhFLkNSWVBUT11MSUJDUllQVE8uT0xCCiskIQorJCEgRGVmaW5lIFRoZSBTU0wgTGlicmFyeS4KKyQhCiskIFNTTF9MSUIgOj0gU1lTJERJU0s6Wy0uJ0FSQ0gnLkVYRS5TU0xdTElCU1NMLk9MQgorJCEKKyQhIERlZmluZSBUaGUgT0JKIERpcmVjdG9yeS4KKyQhCiskIE9CSl9ESVIgOj0gU1lTJERJU0s6Wy0uJ0FSQ0gnLk9CSi5BUFBTXQorJCEKKyQhIERlZmluZSBUaGUgRVhFIERpcmVjdG9yeS4KKyQhCiskIEVYRV9ESVIgOj0gU1lTJERJU0s6Wy0uJ0FSQ0gnLkVYRS5BUFBTXQorJCEKKyQhIENoZWNrIFRvIE1ha2UgU3VyZSBXZSBIYXZlIFZhbGlkIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzLgorJCEKKyQgR09TVUIgQ0hFQ0tfT1BUSU9OUworJCEKKyQhIEluaXRpYWxpc2UgbG9naWNhbCBuYW1lcyBhbmQgc3VjaAorJCEKKyQgR09TVUIgSU5JVElBTElTRQorJCEKKyQhIFRlbGwgVGhlIFVzZXIgV2hhdCBLaW5kIG9mIE1hY2hpbmUgV2UgUnVuIE9uLgorJCEKKyQgV1JJVEUgU1lTJE9VVFBVVCAiQ29tcGlsaW5nIE9uIEEgIixBUkNILCIgTWFjaGluZS4iCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFRoZSBPQkogRGlyZWN0b3J5IEV4aXN0cy4KKyQhCiskIElGIChGJFBBUlNFKE9CSl9ESVIpLkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBJdCBEb3Nlbid0IEV4aXN0LCBTbyBDcmVhdGUgSXQuCiskIQorJCAgIENSRUFURS9ESVJFQ1RPUlkgJ09CSl9ESVInCiskIQorJCEgRW5kIFRoZSBPQkogRGlyZWN0b3J5IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgVGhlIEVYRSBEaXJlY3RvcnkgRXhpc3RzLgorJCEKKyQgSUYgKEYkUEFSU0UoRVhFX0RJUikuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIEl0IERvc2VuJ3QgRXhpc3QsIFNvIENyZWF0ZSBJdC4KKyQhCiskICAgQ1JFQVRFL0RJUkVDVE9SWSAnRVhFX0RJUicKKyQhCiskISBFbmQgVGhlIEVYRSBEaXJlY3RvcnkgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIFRoZSBQcm9wZXIgTGlicmFyaWVzLgorJCEKKyQgR09TVUIgTElCX0NIRUNLCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgQSBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCBHT1NVQiBDSEVDS19PUFRfRklMRQorJCEKKyQhIERlZmluZSBUaGUgQXBwbGljYXRpb24gRmlsZXMuCiskISBOT1RFOiBTb21lIG1pZ2h0IHRoaW5rIHRoaXMgbGlzdCB1Z2x5LiAgSG93ZXZlciwgaXQncyBtYWRlIHRoaXMgd2F5IHRvCiskISByZWZsZWN0IHRoZSBFX09CSiB2YXJpYWJsZSBpbiBNYWtlZmlsZSBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLCB0aGVyZWJ5CiskISBtYWtpbmcgaXQgZmFpcmx5IGVhc3kgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpc3RzIGFyZSB0aGUgc2FtZS4KKyQhCiskIExJQl9PUEVOU1NMID0gIlZFUklGWSxBU04xUEFSUyxSRVEsREdTVCxESCxESFBBUkFNLEVOQyxQQVNTV0QsR0VOREgsRVJSU1RSLCIrLQorCSAgICAgCSJDQSxQS0NTNyxDUkwyUDcsQ1JMLCIrLQorCSAgICAgIAkiUlNBLFJTQVVUTCxEU0EsRFNBUEFSQU0sRUMsRUNQQVJBTSwiKy0KKwkgICAgICAJIlg1MDksR0VOUlNBLEdFTkRTQSxHRU5QS0VZLFNfU0VSVkVSLFNfQ0xJRU5ULFNQRUVELCIrLQorCSAgICAgIAkiU19USU1FLEFQUFMsU19DQixTX1NPQ0tFVCxBUFBfUkFORCxWRVJTSU9OLFNFU1NfSUQsIistCisJICAgICAgCSJDSVBIRVJTLE5TRVEsUEtDUzEyLFBLQ1M4LFBLRVksUEtFWVBBUkFNLFBLRVlVVEwsIisgLQorCSAgICAgIAkiU1BLQUMsU01JTUUsQ01TLFJBTkQsRU5HSU5FLE9DU1AsUFJJTUUsVFMiCiskIFRDUElQX1BST0dSQU1TID0gIiwsIgorJCBJRiBDT01QSUxFUiAuRVFTLiAiVkFYQyIgVEhFTiAtCisgICAgIFRDUElQX1BST0dSQU1TID0gIixPUEVOU1NMLCIKKyQhCiskISBTZXR1cCBleGNlcHRpb25hbCBjb21waWxhdGlvbnMKKyQhCiskIENPTVBJTEVXSVRIX0NDMiA9ICIsU19TT0NLRVQsU19TRVJWRVIsU19DTElFTlQsIgorJCEKKyQgUEhBU0UgOj0gTElCCiskIQorJCBSRVNUQVJUOiAKKyQhCiskISAgRGVmaW5lIEFuIEFwcCBDb3VudGVyIEFuZCBTZXQgSXQgVG8gIjAiLgorJCEKKyQgQVBQX0NPVU5URVIgPSAwCiskIQorJCEgIFRvcCBPZiBUaGUgQXBwIExvb3AuCiskIQorJCBORVhUX0FQUDoKKyQhCiskISAgTWFrZSBUaGUgQXBwbGljYXRpb24gRmlsZSBOYW1lCiskIQorJCBDVVJSRU5UX0FQUCA9IEYkRURJVChGJEVMRU1FTlQoQVBQX0NPVU5URVIsIiwiLFBST0dSQU1TKSwiVFJJTSIpCiskIQorJCEgIENyZWF0ZSBUaGUgRXhlY3V0YWJsZSBGaWxlIE5hbWUuCiskIQorJCAgIEVYRV9GSUxFID0gRVhFX0RJUiArIENVUlJFTlRfQVBQICsgIi5FWEUiCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgQXQgVGhlIEVuZCBPZiBUaGUgRmlsZSBMaXN0LgorJCEKKyQgSUYgKENVUlJFTlRfQVBQLkVRUy4iLCIpCiskIFRIRU4KKyQgICBJRiAoUEhBU0UuRVFTLiJMSUIiKQorJCAgIFRIRU4KKyQgICAgIFBIQVNFIDo9IEFQUAorJCAgICAgR09UTyBSRVNUQVJUCiskICAgRUxTRQorJCAgICAgR09UTyBBUFBfRE9ORQorJCAgIEVORElGCiskIEVORElGCiskIQorJCEgIEluY3JlbWVudCBUaGUgQ291bnRlci4KKyQhCiskIEFQUF9DT1VOVEVSID0gQVBQX0NPVU5URVIgKyAxCiskIQorJCEgIERlY2lkZSBpZiB3ZSdyZSBidWlsZGluZyB0aGUgb2JqZWN0IGZpbGVzIG9yIG5vdC4KKyQhCiskIElGIChQSEFTRS5FUVMuIkxJQiIpCiskIFRIRU4KKyQhCiskISAgRGVmaW5lIEEgTGlicmFyeSBGaWxlIENvdW50ZXIgQW5kIFNldCBJdCBUbyAiLTEiLgorJCEgIC0xIE1lYW5zIFRoZSBBcHBsaWNhdGlvbiBGaWxlIE5hbWUgSXMgVG8gQmUgVXNlZC4KKyQhCiskICAgTElCX0NPVU5URVIgPSAtMQorJCEKKyQhICBDcmVhdGUgYSAuT1BUIGZpbGUgZm9yIHRoZSBvYmplY3QgZmlsZXMKKyQhCiskICAgT1BFTi9XUklURSBPQkpFQ1RTICdFWEVfRElSJydDVVJSRU5UX0FQUCcuT1BUCiskIQorJCEgIFRvcCBPZiBUaGUgRmlsZSBMb29wLgorJCEKKyQgIE5FWFRfTElCOgorJCEKKyQhICBPLkssIEV4dHJhY3QgVGhlIEZpbGUgTmFtZSBGcm9tIFRoZSBGaWxlIExpc3QuCiskIQorJCAgIElGIExJQl9DT1VOVEVSIC5HRS4gMAorJCAgIFRIRU4KKyQgICAgIEZJTEVfTkFNRSA9IEYkRURJVChGJEVMRU1FTlQoTElCX0NPVU5URVIsIiwiLExJQl8nQ1VSUkVOVF9BUFAnKSwiVFJJTSIpCiskICAgRUxTRQorJCAgICAgRklMRV9OQU1FID0gQ1VSUkVOVF9BUFAKKyQgICBFTkRJRgorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgV2UgQXJlIEF0IFRoZSBFbmQgT2YgVGhlIEZpbGUgTGlzdC4KKyQhCiskICAgSUYgKEZJTEVfTkFNRS5FUVMuIiwiKQorJCAgIFRIRU4KKyQgICAgIENMT1NFIE9CSkVDVFMKKyQgICAgIEdPVE8gTkVYVF9BUFAKKyQgICBFTkRJRgorJCEKKyQhICBJbmNyZW1lbnQgVGhlIENvdW50ZXIuCiskIQorJCAgIExJQl9DT1VOVEVSID0gTElCX0NPVU5URVIgKyAxCiskIQorJCEgIENyZWF0ZSBUaGUgU291cmNlIEZpbGUgTmFtZS4KKyQhCiskICAgU09VUkNFX0ZJTEUgPSAiU1lTJERJU0s6W10iICsgRklMRV9OQU1FICsgIi5DIgorJCEKKyQhICBDcmVhdGUgVGhlIE9iamVjdCBGaWxlIE5hbWUuCiskIQorJCAgIE9CSkVDVF9GSUxFID0gT0JKX0RJUiArIEZJTEVfTkFNRSArICIuT0JKIgorJCAgIE9OIFdBUk5JTkcgVEhFTiBHT1RPIE5FWFRfTElCCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBUaGUgRmlsZSBXZSBXYW50IFRvIENvbXBpbGUgQWN0dWFsbHkgRXhpc3RzLgorJCEKKyQgICBJRiAoRiRTRUFSQ0goU09VUkNFX0ZJTEUpLkVRUy4iIikKKyQgICBUSEVOCiskIQorJCEgICAgVGVsbCBUaGUgVXNlciBUaGF0IFRoZSBGaWxlIERvc2VuJ3QgRXhpc3QuCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIEZpbGUgIixTT1VSQ0VfRklMRSwiIERvc2VuJ3QgRXhpc3QuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICAgIEV4aXQgVGhlIEJ1aWxkLgorJCEKKyQgICAgIEdPVE8gRVhJVAorJCEKKyQhICBFbmQgVGhlIEZpbGUgRXhpc3QgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgV2hhdCBXZSBBcmUgQnVpbGRpbmcuCiskIQorJCAgIElGIChQSEFTRS5FUVMuIkxJQiIpCiskICAgVEhFTgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiQ29tcGlsaW5nIFRoZSAiLEZJTEVfTkFNRSwiLkMgRmlsZS4iCiskICAgRUxTRQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiQnVpbGRpbmcgVGhlICIsRklMRV9OQU1FLCIgQXBwbGljYXRpb24gUHJvZ3JhbS4iCiskICAgRU5ESUYKKyQhCiskISAgQ29tcGlsZSBUaGUgRmlsZS4KKyQhCiskICAgT04gRVJST1IgVEhFTiBHT1RPIE5FWFRfTElCCiskICAgSUYgQ09NUElMRVdJVEhfQ0MyIC0gRklMRV9OQU1FIC5ORVMuIENPTVBJTEVXSVRIX0NDMgorJCAgIFRIRU4KKyQgICAgIENDMi9PQkpFQ1Q9J09CSkVDVF9GSUxFJyAnU09VUkNFX0ZJTEUnCiskICAgRUxTRQorJCAgICAgQ0MvT0JKRUNUPSdPQkpFQ1RfRklMRScgJ1NPVVJDRV9GSUxFJworJCAgIEVORElGCiskICAgV1JJVEUgT0JKRUNUUyBPQkpFQ1RfRklMRQorJCEKKyQgICBHT1RPIE5FWFRfTElCCiskIEVORElGCiskIQorJCEgIENoZWNrIGlmIHRoaXMgcHJvZ3JhbSB3b3JrcyB3ZWxsIHdpdGhvdXQgYSBUQ1BJUCBsaWJyYXJ5CiskIQorJCBJRiBUQ1BJUF9MSUIgLkVRUy4gIiIgLkFORC4gVENQSVBfUFJPR1JBTVMgLSBDVVJSRU5UX0FQUCAuTkVTLiBUQ1BJUF9QUk9HUkFNUworJCBUSEVOCiskICAgV1JJVEUgU1lTJE9VVFBVVCBDVVJSRU5UX0FQUCwiIG5lZWRzIGEgVENQL0lQIGxpYnJhcnkuICBDYW4ndCBsaW5rLiAgU2tpcHBpbmcuLi4iCiskICAgR09UTyBORVhUX0FQUAorJCBFTkRJRgorJCEKKyQhIExpbmsgVGhlIFByb2dyYW0uCiskISBDaGVjayBUbyBTZWUgSWYgV2UgQXJlIFRvIExpbmsgV2l0aCBBIFNwZWNpZmljIFRDUC9JUCBMaWJyYXJ5LgorJCEKKyQgT04gV0FSTklORyBUSEVOIEdPVE8gTkVYVF9BUFAKKyQhCiskIElGIChUQ1BJUF9MSUIuTkVTLiIiKQorJCBUSEVOCiskIQorJCEgRG9uJ3QgTGluayBXaXRoIFRoZSBSU0FSRUYgUm91dGluZXMgQW5kIFRDUC9JUCBMaWJyYXJ5LgorJCEKKyQgICBMSU5LLydERUJVR0dFUicvJ1RSQUNFQkFDSycgL0VYRT0nRVhFX0ZJTEUnIC0KKwknRVhFX0RJUicnQ1VSUkVOVF9BUFAnLk9QVC9PUFRJT04sIC0KKyAgICAgICAgJ1NTTF9MSUInL0xJQlJBUlksJ0NSWVBUT19MSUInL0xJQlJBUlksIC0KKyAgICAgICAgJ1RDUElQX0xJQicsJ09QVF9GSUxFJy9PUFRJT04KKyQhCiskISBFbHNlLi4uCiskIQorJCBFTFNFCiskIQorJCEgRG9uJ3QgTGluayBXaXRoIFRoZSBSU0FSRUYgUm91dGluZXMgQW5kIExpbmsgV2l0aCBBIFRDUC9JUCBMaWJyYXJ5LgorJCEKKyQgICBMSU5LLydERUJVR0dFUicvJ1RSQUNFQkFDSycgL0VYRT0nRVhFX0ZJTEUnIC0KKwknRVhFX0RJUicnQ1VSUkVOVF9BUFAnLk9QVC9PUFRJT04sIC0KKyAgICAgICAgJ1NTTF9MSUInL0xJQlJBUlksJ0NSWVBUT19MSUInL0xJQlJBUlksIC0KKyAgICAgICAgJ09QVF9GSUxFJy9PUFRJT04KKyQhCiskISBFbmQgVGhlIFRDUC9JUCBMaWJyYXJ5IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBHbyBCYWNrIEFuZCBEbyBJdCBBZ2Fpbi4KKyQhCiskIEdPVE8gTkVYVF9BUFAKKyQhCiskISBBbGwgRG9uZSBXaXRoIFRoaXMgRmlsZS4KKyQhCiskIEFQUF9ET05FOgorJCBFWElUOgorJCEKKyQhIEFsbCBEb25lLCBUaW1lIFRvIENsZWFuIFVwIEFuZCBFeGl0LgorJCEKKyQgR09TVUIgQ0xFQU5VUAorJCBFWElUCiskIQorJCEgQ2hlY2sgRm9yIFRoZSBMaW5rIE9wdGlvbiBGSWxlLgorJCEKKyQgQ0hFQ0tfT1BUX0ZJTEU6CiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIE5lZWQgVG8gTWFrZSBBIFZBWCBDIE9wdGlvbiBGaWxlLgorJCEKKyQgSUYgKENPTVBJTEVSLkVRUy4iVkFYQyIpCiskIFRIRU4KKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFscmVhZHkgSGF2ZSBBIFZBWCBDIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskICAgSUYgKEYkU0VBUkNIKE9QVF9GSUxFKS5FUVMuIiIpCiskICAgVEhFTgorJCEKKyQhICAgIFdlIE5lZWQgQSBWQVggQyBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgICAgQ1JFQVRFICdPUFRfRklMRScKKyRERUNLCishCishIERlZmF1bHQgU3lzdGVtIE9wdGlvbnMgRmlsZSBUbyBMaW5rIEFnaWFuc3QgCishIFRoZSBTaGFyYWJsZSBWQVggQyBSdW50aW1lIExpYnJhcnkuCishCitTWVMkU0hBUkU6VkFYQ1JUTC5FWEUvU0hBUkUKKyRFT0QKKyQhCiskISAgRW5kIFRoZSBPcHRpb24gRmlsZSBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISBFbmQgVGhlIFZBWEMgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBOZWVkIEEgR05VIEMgT3B0aW9uIEZpbGUuCiskIQorJCBJRiAoQ09NUElMRVIuRVFTLiJHTlVDIikKKyQgVEhFTgorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgV2UgQWxyZWFkeSBIYXZlIEEgR05VIEMgTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICBJRiAoRiRTRUFSQ0goT1BUX0ZJTEUpLkVRUy4iIikKKyQgICBUSEVOCiskIQorJCEgICAgV2UgTmVlZCBBIEdOVSBDIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskICAgICBDUkVBVEUgJ09QVF9GSUxFJworJERFQ0sKKyEKKyEgRGVmYXVsdCBTeXN0ZW0gT3B0aW9ucyBGaWxlIFRvIExpbmsgQWdpYW5zdCAKKyEgVGhlIFNoYXJhYmxlIEMgUnVudGltZSBMaWJyYXJ5LgorIQorR05VX0NDOlswMDAwMDBdR0NDTElCL0xJQlJBUlkKK1NZUyRTSEFSRTpWQVhDUlRML1NIQVJFCiskRU9ECiskIQorJCEgIEVuZCBUaGUgT3B0aW9uIEZpbGUgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBHTlUgQyBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIE5lZWQgQSBERUMgQyBPcHRpb24gRmlsZS4KKyQhCiskIElGIChDT01QSUxFUi5FUVMuIkRFQ0MiKQorJCBUSEVOCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBbHJlYWR5IEhhdmUgQSBERUMgQyBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgIElGIChGJFNFQVJDSChPUFRfRklMRSkuRVFTLiIiKQorJCAgIFRIRU4KKyQhCiskISAgICBGaWd1cmUgT3V0IElmIFdlIE5lZWQgQW4gQVhQIE9yIEEgVkFYIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskICAgICBJRiBBUkNILkVRUy4iVkFYIgorJCAgICAgVEhFTgorJCEKKyQhICAgICAgV2UgTmVlZCBBIERFQyBDIExpbmtlciBPcHRpb24gRmlsZSBGb3IgVkFYLgorJCEKKyQgICAgICAgQ1JFQVRFICdPUFRfRklMRScKKyRERUNLCishCishIERlZmF1bHQgU3lzdGVtIE9wdGlvbnMgRmlsZSBUbyBMaW5rIEFnaWFuc3QgCishIFRoZSBTaGFyYWJsZSBERUMgQyBSdW50aW1lIExpYnJhcnkuCishCitTWVMkU0hBUkU6REVDQyRTSFIuRVhFL1NIQVJFCiskRU9ECiskIQorJCEgICAgRWxzZS4uLgorJCEKKyQgICAgIEVMU0UKKyQhCiskISAgICAgIENyZWF0ZSBUaGUgbm9uLVZBWCBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgICAgICBDUkVBVEUgJ09QVF9GSUxFJworJERFQ0sKKyEKKyEgRGVmYXVsdCBTeXN0ZW0gT3B0aW9ucyBGaWxlIEZvciBub24tVkFYIFRvIExpbmsgQWdpYW5zdCAKKyEgVGhlIFNoYXJhYmxlIEMgUnVudGltZSBMaWJyYXJ5LgorIQorU1lTJFNIQVJFOkNNQSRPUEVOX0xJQl9TSFIvU0hBUkUKK1NZUyRTSEFSRTpDTUEkT1BFTl9SVEwvU0hBUkUKKyRFT0QKKyQhCiskISAgICBFbmQgVGhlIERFQyBDIE9wdGlvbiBGaWxlIENoZWNrLgorJCEKKyQgICAgIEVORElGCiskIQorJCEgIEVuZCBUaGUgT3B0aW9uIEZpbGUgU2VhcmNoLgorJCEKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgREVDIEMgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhICBUZWxsIFRoZSBVc2VyIFdoYXQgTGlua2VyIE9wdGlvbiBGaWxlIFdlIEFyZSBVc2luZy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIExpbmtlciBPcHRpb24gRmlsZSAiLE9QVF9GSUxFLCIuIgkKKyQhCiskISBUaW1lIFRvIFJFVFVSTi4KKyQhCiskIFJFVFVSTgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIFRoZSBBcHByb3BpYXRlIExpYnJhcmllcy4KKyQhCiskIExJQl9DSEVDSzoKKyQhCiskISBMb29rIEZvciBUaGUgTGlicmFyeSBMSUJDUllQVE8uT0xCLgorJCEKKyQgSUYgKEYkU0VBUkNIKENSWVBUT19MSUIpLkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBUZWxsIFRoZSBVc2VyIFdlIENhbid0IEZpbmQgVGhlIExJQkNSWVBUTy5PTEIgTGlicmFyeS4KKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIkNhbid0IEZpbmQgVGhlIExpYnJhcnkgIixDUllQVE9fTElCLCIuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIldlIENhbid0IExpbmsgV2l0aG91dCBJdC4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBTaW5jZSBXZSBDYW4ndCBMaW5rIFdpdGhvdXQgSXQsIEV4aXQuCiskIQorJCAgIEVYSVQKKyQhCiskISBFbmQgVGhlIENyeXB0byBMaWJyYXJ5IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBMb29rIEZvciBUaGUgTGlicmFyeSBMSUJTU0wuT0xCLgorJCEKKyQgSUYgKEYkU0VBUkNIKFNTTF9MSUIpLkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBUZWxsIFRoZSBVc2VyIFdlIENhbid0IEZpbmQgVGhlIExJQlNTTC5PTEIgTGlicmFyeS4KKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIkNhbid0IEZpbmQgVGhlIExpYnJhcnkgIixTU0xfTElCLCIuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIlNvbWUgT2YgVGhlIFRlc3QgUHJvZ3JhbXMgTmVlZCBUbyBMaW5rIFRvIEl0LiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskIQorJCEgIFNpbmNlIFdlIENhbid0IExpbmsgV2l0aG91dCBJdCwgRXhpdC4KKyQhCiskICAgRVhJVAorJCEKKyQhIEVuZCBUaGUgU1NMIExpYnJhcnkgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIFRpbWUgVG8gUmV0dXJuLgorJCEKKyQgUkVUVVJOCiskIQorJCEgQ2hlY2sgVGhlIFVzZXIncyBPcHRpb25zLgorJCEKKyQgQ0hFQ0tfT1BUSU9OUzoKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgUDEgSXMgQmxhbmsuCiskIQorJCBJRiAoUDEuRVFTLiJOT0RFQlVHIikKKyQgVEhFTgorJCEKKyQhICAgUDEgSXMgTk9ERUJVRywgU28gQ29tcGlsZSBXaXRob3V0IERlYnVnZ2VyIEluZm9ybWF0aW9uLgorJCEKKyQgICAgREVCVUdHRVIgID0gIk5PREVCVUciCiskICAgIFRSQUNFQkFDSyA9ICJOT1RSQUNFQkFDSyIgCiskICAgIEdDQ19PUFRJTUlaRSA9ICJPUFRJTUlaRSIKKyQgICAgQ0NfT1BUSU1JWkUgPSAiT1BUSU1JWkUiCiskICAgIFdSSVRFIFNZUyRPVVRQVVQgIk5vIERlYnVnZ2VyIEluZm9ybWF0aW9uIFdpbGwgQmUgUHJvZHVjZWQgRHVyaW5nIENvbXBpbGUuIgorJCAgICBXUklURSBTWVMkT1VUUFVUICJDb21waWxpbmcgV2l0aCBDb21waWxlciBPcHRpbWl6YXRpb24uIgorJCEKKyQhIEVsc2UuLi4KKyQhCiskIEVMU0UKKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFyZSBUbyBDb21waWxlIFdpdGggRGVidWdnZXIgSW5mb3JtYXRpb24uCiskIQorJCAgIElGIChQMS5FUVMuIkRFQlVHIikKKyQgICBUSEVOCiskIQorJCEgICAgQ29tcGlsZSBXaXRoIERlYnVnZ2VyIEluZm9ybWF0aW9uLgorJCEKKyQgICAgIERFQlVHR0VSICA9ICJERUJVRyIKKyQgICAgIFRSQUNFQkFDSyA9ICJUUkFDRUJBQ0siCiskICAgICBHQ0NfT1BUSU1JWkUgPSAiTk9PUFRJTUlaRSIKKyQgICAgIENDX09QVElNSVpFID0gIk5PT1BUSU1JWkUiCiskICAgICBXUklURSBTWVMkT1VUUFVUICJEZWJ1Z2dlciBJbmZvcm1hdGlvbiBXaWxsIEJlIFByb2R1Y2VkIER1cmluZyBDb21waWxlLiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIkNvbXBpbGluZyBXaXRob3V0IENvbXBpbGVyIE9wdGltaXphdGlvbi4iCiskICAgRUxTRQorJCEKKyQhICAgIFRlbGwgVGhlIFVzZXIgRW50ZXJlZCBBbiBJbnZhbGlkIE9wdGlvbi4uCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIE9wdGlvbiAiLFAxLCIgSXMgSW52YWxpZC4gIFRoZSBWYWxpZCBPcHRpb25zIEFyZToiCiskICAgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgICAgREVCVUcgICAgOiAgQ29tcGlsZSBXaXRoIFRoZSBEZWJ1Z2dlciBJbmZvcm1hdGlvbi4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgICAgTk9ERUJVRyAgOiAgQ29tcGlsZSBXaXRob3V0IFRoZSBEZWJ1Z2dlciBJbmZvcm1hdGlvbi4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICIiCiskIQorJCEgICAgVGltZSBUbyBFWElULgorJCEKKyQgICAgIEVYSVQKKyQhCiskISAgRW5kIFRoZSBWYWxpZCBBcmd1bWVudCBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISBFbmQgVGhlIFAxIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgUDIgSXMgQmxhbmsuCiskIQorJCBJRiAoUDIuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIE8uSy4sIFRoZSBVc2VyIERpZG4ndCBTcGVjaWZ5IEEgQ29tcGlsZXIsIExldCdzIFRyeSBUbworJCEgIEZpbmQgT3V0IFdoaWNoIE9uZSBUbyBVc2UuCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIEdOVSBDLgorJCEKKyQgICBJRiAoRiRUUk5MTk0oIkdOVV9DQyIpLk5FUy4iIikKKyQgICBUSEVOCiskIQorJCEgICAgTG9va3MgTGlrZSBHTlVDLCBTZXQgVG8gVXNlIEdOVUMuCiskIQorJCAgICAgUDIgPSAiR05VQyIKKyQhCiskISAgRWxzZS4uLgorJCEKKyQgICBFTFNFCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIFZBWEMgT3IgREVDQy4KKyQhCiskICAgICBJRiAoQVJDSC5ORVMuIlZBWCIpLk9SLihGJFRSTkxOTSgiREVDQyRDQ19ERUZBVUxUIikuTkVTLiIiKQorJCAgICAgVEhFTiAKKyQhCiskISAgICAgIExvb2tzIExpa2UgREVDQywgU2V0IFRvIFVzZSBERUNDLgorJCEKKyQgICAgICAgUDIgPSAiREVDQyIKKyQhCiskISAgICBFbHNlLi4uCiskIQorJCAgICAgRUxTRQorJCEKKyQhICAgICAgTG9va3MgTGlrZSBWQVhDLCBTZXQgVG8gVXNlIFZBWEMuCiskIQorJCAgICAgICBQMiA9ICJWQVhDIgorJCEKKyQhICAgIEVuZCBUaGUgVkFYQyBDb21waWxlciBDaGVjay4KKyQhCiskICAgICBFTkRJRgorJCEKKyQhICBFbmQgVGhlIERFQ0MgJiBWQVhDIENvbXBpbGVyIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhICBFbmQgVGhlIENvbXBpbGVyIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgSGF2ZSBBIE9wdGlvbiBGb3IgUDMuCiskIQorJCBJRiAoUDMuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIEZpbmQgb3V0IHdoYXQgc29ja2V0IGxpYnJhcnkgd2UgaGF2ZSBhdmFpbGFibGUKKyQhCiskICAgSUYgRiRQQVJTRSgiU09DS0VUU0hSOiIpIC5ORVMuICIiCiskICAgVEhFTgorJCEKKyQhICAgIFdlIGhhdmUgU09DS0VUU0hSLCBhbmQgaXQgaXMgbXkgb3BpbmlvbiB0aGF0IGl0J3MgdGhlIGJlc3QgdG8gdXNlLgorJCEKKyQgICAgIFAzID0gIlNPQ0tFVFNIUiIKKyQhCiskISAgICBUZWxsIHRoZSB1c2VyCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVXNpbmcgU09DS0VUU0hSIGZvciBUQ1AvSVAiCiskIQorJCEgICAgRWxzZSwgbGV0J3MgbG9vayBmb3Igc29tZXRoaW5nIGVsc2UKKyQhCiskICAgRUxTRQorJCEKKyQhICAgIExpa2UgVUNYICh0aGUgcmVhc29uIHRvIGRvIHRoaXMgYmVmb3JlIE11bHRpbmV0IGlzIHRoYXQgdGhlIFVDWAorJCEgICAgZW11bGF0aW9uIGlzIGVhc2llciB0byB1c2UuLi4pCiskIQorJCAgICAgSUYgRiRUUk5MTk0oIlVDWCRJUENfU0hSIikgLk5FUy4gIiIgLQorCSAuT1IuIEYkUEFSU0UoIlNZUyRTSEFSRTpVQ1gkSVBDX1NIUi5FWEUiKSAuTkVTLiAiIiAtCisJIC5PUi4gRiRQQVJTRSgiU1lTJExJQlJBUlk6VUNYJElQQy5PTEIiKSAuTkVTLiAiIgorJCAgICAgVEhFTgorJCEKKyQhCUxhc3QgcmVzb3J0OiBhIFVDWCBvciBVQ1gtY29tcGF0aWJsZSBsaWJyYXJ5CiskIQorJAlQMyA9ICJVQ1giCiskIQorJCEgICAgICBUZWxsIHRoZSB1c2VyCiskIQorJCAgICAgICBXUklURSBTWVMkT1VUUFVUICJVc2luZyBVQ1ggb3IgYW4gZW11bGF0aW9uIHRoZXJlb2YgZm9yIFRDUC9JUCIKKyQhCiskIQlUaGF0IHdhcyBhbGwuLi4KKyQhCiskICAgICBFTkRJRgorJCAgIEVORElGCiskIEVORElGCiskIQorJCEgU2V0IFVwIEluaXRpYWwgQ0MgRGVmaW5pdGlvbnMsIFBvc3NpYmx5IFdpdGggVXNlciBPbmVzCiskIQorJCBDQ0RFRlMgPSAiTU9OT0xJVEgiCiskIElGIEYkVFlQRShVU0VSX0NDREVGUykgLk5FUy4gIiIgVEhFTiBDQ0RFRlMgPSBDQ0RFRlMgKyAiLCIgKyBVU0VSX0NDREVGUworJCBDQ0VYVFJBRkxBR1MgPSAiIgorJCBJRiBGJFRZUEUoVVNFUl9DQ0ZMQUdTKSAuTkVTLiAiIiBUSEVOIENDRVhUUkFGTEFHUyA9IFVTRVJfQ0NGTEFHUworJCBDQ0RJU0FCTEVXQVJOSU5HUyA9ICJMT05HTE9OR1RZUEUsTE9OR0xPTkdTVUZYLEZPVU5EQ1IiCiskIElGIEYkVFlQRShVU0VSX0NDRElTQUJMRVdBUk5JTkdTKSAuTkVTLiAiIiBUSEVOIC0KKwlDQ0RJU0FCTEVXQVJOSU5HUyA9IENDRElTQUJMRVdBUk5JTkdTICsgIiwiICsgVVNFUl9DQ0RJU0FCTEVXQVJOSU5HUworJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgVGhlIFVzZXIgRW50ZXJlZCBBIFZhbGlkIFBhcmFtdGVyLgorJCEKKyQgSUYgKFAyLkVRUy4iVkFYQyIpLk9SLihQMi5FUVMuIkRFQ0MiKS5PUi4oUDIuRVFTLiJHTlVDIikKKyQgVEhFTgorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgVGhlIFVzZXIgV2FudGVkIERFQ0MuCiskIQorJCAgIElGIChQMi5FUVMuIkRFQ0MiKQorJCAgIFRIRU4KKyQhCiskISAgICBMb29rcyBMaWtlIERFQ0MsIFNldCBUbyBVc2UgREVDQy4KKyQhCiskICAgICBDT01QSUxFUiA9ICJERUNDIgorJCEKKyQhICAgIFRlbGwgVGhlIFVzZXIgV2UgQXJlIFVzaW5nIERFQ0MuCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVXNpbmcgREVDQyAnQycgQ29tcGlsZXIuIgorJCEKKyQhICAgIFVzZSBERUNDLi4uCiskIQorJCAgICAgQ0MgPSAiQ0MiCiskICAgICBJRiBBUkNILkVRUy4iVkFYIiAuQU5ELiBGJFRSTkxOTSgiREVDQyRDQ19ERUZBVUxUIikuTkVTLiIvREVDQyIgLQorCSBUSEVOIENDID0gIkNDL0RFQ0MiCiskICAgICBDQyA9IENDICsgIi8nJ0NDX09QVElNSVpFJy8nJ0RFQlVHR0VSJy9TVEFOREFSRD1BTlNJODkiICsgLQorICAgICAgICAgICAiL05PTElTVC9QUkVGSVg9QUxMIiArIC0KKwkgICAiL0lOQ0xVREU9KFNZUyRESVNLOlstXSxTWVMkRElTSzpbLS5DUllQVE9dKSIgKyBDQ0VYVFJBRkxBR1MKKyQhCiskISAgICBEZWZpbmUgVGhlIExpbmtlciBPcHRpb25zIEZpbGUgTmFtZS4KKyQhCiskICAgICBPUFRfRklMRSA9ICInJ0VYRV9ESVInVkFYX0RFQ0NfT1BUSU9OUy5PUFQiCiskIQorJCEgIEVuZCBERUNDIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgV2UgQXJlIFRvIFVzZSBWQVhDLgorJCEKKyQgICBJRiAoUDIuRVFTLiJWQVhDIikKKyQgICBUSEVOCiskIQorJCEgICAgTG9va3MgTGlrZSBWQVhDLCBTZXQgVG8gVXNlIFZBWEMuCiskIQorJCAgICAgQ09NUElMRVIgPSAiVkFYQyIKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIFdlIEFyZSBVc2luZyBWQVggQy4KKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIFZBWEMgJ0MnIENvbXBpbGVyLiIKKyQhCiskISAgICBDb21waWxlIFVzaW5nIFZBWEMuCiskIQorJCAgICAgQ0MgPSAiQ0MiCiskICAgICBJRiBBUkNILk5FUy4iVkFYIgorJCAgICAgVEhFTgorJAlXUklURSBTWVMkT1VUUFVUICJUaGVyZSBpcyBubyBWQVggQyBvbiAnJ0FSQ0gnISIKKyQJRVhJVAorJCAgICAgRU5ESUYKKyQgICAgIElGIEYkVFJOTE5NKCJERUNDJENDX0RFRkFVTFQiKS5FUVMuIi9ERUNDIiBUSEVOIENDID0gIkNDL1ZBWEMiCiskICAgICBDQyA9IENDICsgIi8nJ0NDX09QVElNSVpFJy8nJ0RFQlVHR0VSJy9OT0xJU1QiICsgLQorCSAgICIvSU5DTFVERT0oU1lTJERJU0s6Wy1dLFNZUyRESVNLOlstLkNSWVBUT10pIiArIENDRVhUUkFGTEFHUworJCAgICAgQ0NERUZTID0gQ0NERUZTICsgIiwiIlZBWEMiIiIKKyQhCiskISAgICBEZWZpbmUgPHN5cz4gQXMgU1lTJENPTU1PTjpbU1lTTElCXQorJCEKKyQgICAgIERFRklORS9OT0xPRyBTWVMgU1lTJENPTU1PTjpbU1lTTElCXQorJCEKKyQhICAgIERlZmluZSBUaGUgTGlua2VyIE9wdGlvbnMgRmlsZSBOYW1lLgorJCEKKyQgICAgIE9QVF9GSUxFID0gIicnRVhFX0RJUidWQVhfVkFYQ19PUFRJT05TLk9QVCIKKyQhCiskISAgRW5kIFZBWEMgQ2hlY2sKKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFyZSBUbyBVc2UgR05VIEMuCiskIQorJCAgIElGIChQMi5FUVMuIkdOVUMiKQorJCAgIFRIRU4KKyQhCiskISAgICBMb29rcyBMaWtlIEdOVUMsIFNldCBUbyBVc2UgR05VQy4KKyQhCiskICAgICBDT01QSUxFUiA9ICJHTlVDIgorJCEKKyQhICAgIFRlbGwgVGhlIFVzZXIgV2UgQXJlIFVzaW5nIEdOVUMuCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVXNpbmcgR05VICdDJyBDb21waWxlci4iCiskIQorJCEgICAgVXNlIEdOVSBDLi4uCiskIQorJCAgICAgSUYgRiRUWVBFKEdDQykgLkVRUy4gIiIgVEhFTiBHQ0MgOj0gR0NDCiskICAgICBDQyA9IEdDQysiL05PQ0FTRV9IQUNLLycnR0NDX09QVElNSVpFJy8nJ0RFQlVHR0VSJy9OT0xJU1QiICsgLQorCSAgICIvSU5DTFVERT0oU1lTJERJU0s6Wy1dLFNZUyRESVNLOlstLkNSWVBUT10pIiArIENDRVhUUkFGTEFHUworJCEKKyQhICAgIERlZmluZSBUaGUgTGlua2VyIE9wdGlvbnMgRmlsZSBOYW1lLgorJCEKKyQgICAgIE9QVF9GSUxFID0gIicnRVhFX0RJUidWQVhfR05VQ19PUFRJT05TLk9QVCIKKyQhCiskISAgRW5kIFRoZSBHTlUgQyBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISAgU2V0IHVwIGRlZmF1bHQgZGVmaW5lcworJCEKKyQgICBDQ0RFRlMgPSAiIiJGTEFUX0lOQz0xIiIsIiArIENDREVGUworJCEKKyQhICBFbHNlIFRoZSBVc2VyIEVudGVyZWQgQW4gSW52YWxpZCBBcmd1bWVudC4KKyQhCiskIEVMU0UKKyQhCiskISAgVGVsbCBUaGUgVXNlciBXZSBEb24ndCBLbm93IFdoYXQgVGhleSBXYW50LgorJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIE9wdGlvbiAiLFAyLCIgSXMgSW52YWxpZC4gIFRoZSBWYWxpZCBPcHRpb25zIEFyZToiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBWQVhDICA6ICBUbyBDb21waWxlIFdpdGggVkFYIEMuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBERUNDICA6ICBUbyBDb21waWxlIFdpdGggREVDIEMuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBHTlVDICA6ICBUbyBDb21waWxlIFdpdGggR05VIEMuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQhCiskISAgVGltZSBUbyBFWElULgorJCEKKyQgICBFWElUCiskIEVORElGCiskIQorJCEgVGltZSB0byBjaGVjayB0aGUgY29udGVudHMsIGFuZCB0byBtYWtlIHN1cmUgd2UgZ2V0IHRoZSBjb3JyZWN0IGxpYnJhcnkuCiskIQorJCBJRiBQMy5FUVMuIlNPQ0tFVFNIUiIgLk9SLiBQMy5FUVMuIk1VTFRJTkVUIiAuT1IuIFAzLkVRUy4iVUNYIiAtCisgICAgIC5PUi4gUDMuRVFTLiJUQ1BJUCIgLk9SLiBQMy5FUVMuIk5PTkUiCiskIFRIRU4KKyQhCiskISAgQ2hlY2sgdG8gc2VlIGlmIFNPQ0tFVFNIUiB3YXMgY2hvc2VuCiskIQorJCAgIElGIFAzLkVRUy4iU09DS0VUU0hSIgorJCAgIFRIRU4KKyQhCiskISAgICBTZXQgdGhlIGxpYnJhcnkgdG8gdXNlIFNPQ0tFVFNIUgorJCEKKyQgICAgIFRDUElQX0xJQiA9ICJTWVMkRElTSzpbLS5WTVNdU09DS0VUU0hSX1NIUi5PUFQvT1BUIgorJCEKKyQhICAgIERvbmUgd2l0aCBTT0NLRVRTSFIKKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgdG8gc2VlIGlmIE1VTFRJTkVUIHdhcyBjaG9zZW4KKyQhCiskICAgSUYgUDMuRVFTLiJNVUxUSU5FVCIKKyQgICBUSEVOCiskIQorJCEgICAgU2V0IHRoZSBsaWJyYXJ5IHRvIHVzZSBVQ1ggZW11bGF0aW9uLgorJCEKKyQgICAgIFAzID0gIlVDWCIKKyQhCiskISAgICBEb25lIHdpdGggTVVMVElORVQKKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgdG8gc2VlIGlmIFVDWCB3YXMgY2hvc2VuCiskIQorJCAgIElGIFAzLkVRUy4iVUNYIgorJCAgIFRIRU4KKyQhCiskISAgICBTZXQgdGhlIGxpYnJhcnkgdG8gdXNlIFVDWC4KKyQhCiskICAgICBUQ1BJUF9MSUIgPSAiU1lTJERJU0s6Wy0uVk1TXVVDWF9TSFJfREVDQy5PUFQvT1BUIgorJCAgICAgSUYgRiRUUk5MTk0oIlVDWCRJUENfU0hSIikgLk5FUy4gIiIKKyQgICAgIFRIRU4KKyQgICAgICAgVENQSVBfTElCID0gIlNZUyRESVNLOlstLlZNU11VQ1hfU0hSX0RFQ0NfTE9HLk9QVC9PUFQiCiskICAgICBFTFNFCiskICAgICAgIElGIENPTVBJTEVSIC5ORVMuICJERUNDIiAuQU5ELiBBUkNIIC5FUVMuICJWQVgiIFRIRU4gLQorCSAgVENQSVBfTElCID0gIlNZUyRESVNLOlstLlZNU11VQ1hfU0hSX1ZBWEMuT1BUL09QVCIKKyQgICAgIEVORElGCiskIQorJCEgICAgRG9uZSB3aXRoIFVDWAorJCEKKyQgICBFTkRJRgorJCEKKyQhICBDaGVjayB0byBzZWUgaWYgVENQSVAgKHBvc3QgVUNYKSB3YXMgY2hvc2VuCiskIQorJCAgIElGIFAzLkVRUy4iVENQSVAiCiskICAgVEhFTgorJCEKKyQhICAgIFNldCB0aGUgbGlicmFyeSB0byB1c2UgVENQSVAuCiskIQorJCAgICAgVENQSVBfTElCID0gIlNZUyRESVNLOlstLlZNU11UQ1BJUF9TSFJfREVDQy5PUFQvT1BUIgorJCEKKyQhICAgIERvbmUgd2l0aCBUQ1BJUAorJCEKKyQgICBFTkRJRgorJCEKKyQhICBDaGVjayB0byBzZWUgaWYgTk9ORSB3YXMgY2hvc2VuCiskIQorJCAgIElGIFAzLkVRUy4iTk9ORSIKKyQgICBUSEVOCiskIQorJCEgICAgRG8gbm90IHVzZSBUQ1BJUC4KKyQhCiskICAgICBUQ1BJUF9MSUIgPSAiIgorJCEKKyQhICAgIERvbmUgd2l0aCBUQ1BJUAorJCEKKyQgICBFTkRJRgorJCEKKyQhICBBZGQgVENQL0lQIHR5cGUgdG8gQ0MgZGVmaW5pdGlvbnMuCiskIQorJCAgIENDREVGUyA9IENDREVGUyArICIsVENQSVBfVFlQRV8nJ1AzJyIKKyQhCiskISAgUHJpbnQgaW5mbworJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICJUQ1AvSVAgbGlicmFyeSBzcGVjOiAiLCBUQ1BJUF9MSUIKKyQhCiskISAgRWxzZSBUaGUgVXNlciBFbnRlcmVkIEFuIEludmFsaWQgQXJndW1lbnQuCiskIQorJCBFTFNFCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgV2UgRG9uJ3QgS25vdyBXaGF0IFRoZXkgV2FudC4KKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIlRoZSBPcHRpb24gIixQMywiIElzIEludmFsaWQuICBUaGUgVmFsaWQgT3B0aW9ucyBBcmU6IgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgU09DS0VUU0hSICA6ICBUbyBsaW5rIHdpdGggU09DS0VUU0hSIFRDUC9JUCBsaWJyYXJ5LiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgVUNYICAgICAgICA6ICBUbyBsaW5rIHdpdGggVUNYIFRDUC9JUCBsaWJyYXJ5LiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgVENQSVAgICAgICA6ICBUbyBsaW5rIHdpdGggVENQSVAgKHBvc3QgVUNYKSBUQ1AvSVAgbGlicmFyeS4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBUaW1lIFRvIEVYSVQuCiskIQorJCAgIEVYSVQKKyQhCiskISAgRG9uZSB3aXRoIFRDUC9JUCBsaWJyYXJpZXMKKyQhCiskIEVORElGCiskIQorJCEgRmluaXNoIHVwIHRoZSBkZWZpbml0aW9uIG9mIENDLgorJCEKKyQgSUYgQ09NUElMRVIgLkVRUy4gIkRFQ0MiCiskIFRIRU4KKyQgICBJRiBDQ0RJU0FCTEVXQVJOSU5HUyAuTkVTLiAiIgorJCAgIFRIRU4KKyQgICAgIENDRElTQUJMRVdBUk5JTkdTID0gIi9XQVJOSU5HPShESVNBQkxFPSgiICsgQ0NESVNBQkxFV0FSTklOR1MgKyAiKSkiCiskICAgRU5ESUYKKyQgRUxTRQorJCAgIENDRElTQUJMRVdBUk5JTkdTID0gIiIKKyQgRU5ESUYKKyQgQ0MyID0gQ0MgKyAiL0RFRklORT0oIiArIENDREVGUyArICIsX1BPU0lYX0NfU09VUkNFKSIgKyBDQ0RJU0FCTEVXQVJOSU5HUworJCBDQyA9IENDICsgIi9ERUZJTkU9KCIgKyBDQ0RFRlMgKyAiKSIgKyBDQ0RJU0FCTEVXQVJOSU5HUworJCEKKyQhIFNob3cgdXNlciB0aGUgcmVzdWx0CiskIQorJCBXUklURS9TWU1CT0wgU1lTJE9VVFBVVCAiTWFpbiBDb21waWxpbmcgQ29tbWFuZDogIixDQworJCEKKyQhIFNwZWNpYWwgVGhyZWFkcyBGb3IgT3BlblZNUyB2Ny4xIE9yIExhdGVyCiskIQorJCEgV3JpdHRlbiBCeTogIFJpY2hhcmQgTGV2aXR0ZQorJCEgICAgICAgICAgICAgIHJpY2hhcmRAbGV2aXR0ZS5vcmcKKyQhCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgQSBPcHRpb24gRm9yIFA0LgorJCEKKyQgSUYgKFA0LkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBHZXQgVGhlIFZlcnNpb24gT2YgVk1TIFdlIEFyZSBVc2luZy4KKyQhCiskICAgSVNTRVZFTiA6PQorJCAgIFRNUCA9IEYkRUxFTUVOVCgwLCItIixGJEVYVFJBQ1QoMSw0LEYkR0VUU1lJKCJWRVJTSU9OIikpKQorJCAgIFRNUCA9IEYkSU5URUdFUihGJEVMRU1FTlQoMCwiLiIsVE1QKStGJEVMRU1FTlQoMSwiLiIsVE1QKSkKKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFRoZSBWTVMgVmVyc2lvbiBJcyB2Ny4xIE9yIExhdGVyLgorJCEKKyQgICBJRiAoVE1QLkdFLjcxKQorJCAgIFRIRU4KKyQhCiskISAgICBXZSBIYXZlIE9wZW5WTVMgdjcuMSBPciBMYXRlciwgU28gVXNlIFRoZSBTcGVjaWFsIFRocmVhZHMuCiskIQorJCAgICAgSVNTRVZFTiA6PSAsUFRIUkVBRF9VU0VfRDQKKyQhCiskISAgRW5kIFRoZSBWTVMgVmVyc2lvbiBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISBFbmQgVGhlIFA0IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBDaGVjayBpZiB0aGUgdXNlciB3YW50ZWQgdG8gY29tcGlsZSBqdXN0IGEgc3Vic2V0IG9mIGFsbCB0aGUgcHJvZ3JhbXMuCiskIQorJCBJRiBQNSAuTkVTLiAiIgorJCBUSEVOCiskICAgUFJPR1JBTVMgPSBQNQorJCBFTkRJRgorJCEKKyQhICBUaW1lIFRvIFJFVFVSTi4uLgorJCEKKyQgUkVUVVJOCiskIQorJCBJTklUSUFMSVNFOgorJCEKKyQhIFNhdmUgb2xkIHZhbHVlIG9mIHRoZSBsb2dpY2FsIG5hbWUgT1BFTlNTTAorJCEKKyQgX19TQVZFX09QRU5TU0wgPSBGJFRSTkxOTSgiT1BFTlNTTCIsIkxOTSRQUk9DRVNTX1RBQkxFIikKKyQhCiskISBTYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorJCEKKyQgX19IRVJFID0gRiRQQVJTRShGJFBBUlNFKCJBLjsiLEYkRU5WSVJPTk1FTlQoIlBST0NFRFVSRSIpKS0iQS47IiwiW11BLjsiKSAtICJBLjsiCiskIF9fSEVSRSA9IEYkRURJVChfX0hFUkUsIlVQQ0FTRSIpCiskIF9fVE9QID0gX19IRVJFIC0gIkFQUFNdIgorJCBfX0lOQ0xVREUgPSBfX1RPUCArICJJTkNMVURFLk9QRU5TU0xdIgorJCEKKyQhIFNldCB1cCB0aGUgbG9naWNhbCBuYW1lIE9QRU5TU0wgdG8gcG9pbnQgYXQgdGhlIGluY2x1ZGUgZGlyZWN0b3J5CiskIQorJCBERUZJTkUgT1BFTlNTTC9OT0xPRyAnX19JTkNMVURFJworJCEKKyQhIERvbmUKKyQhCiskIFJFVFVSTgorJCEKKyQgQ0xFQU5VUDoKKyQhCiskISBSZXN0b3JlIHRoZSBsb2dpY2FsIG5hbWUgT1BFTlNTTCBpZiBpdCBoYWQgYSB2YWx1ZQorJCEKKyQgSUYgX19TQVZFX09QRU5TU0wgLkVRUy4gIiIKKyQgVEhFTgorJCAgIERFQVNTSUdOIE9QRU5TU0wKKyQgRUxTRQorJCAgIERFRklORS9OT0xPRyBPUEVOU1NMICdfX1NBVkVfT1BFTlNTTCcKKyQgRU5ESUYKKyQhCiskISBEb25lCiskIQorJCBSRVRVUk4KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvbWQ0LmMgYi9saWIvb3BlbnNzbC9hcHBzL21kNC5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjdmNDU3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL21kNC5jCkBAIC0wLDAgKzEgQEAKKy4uL2NyeXB0by9tZDQvbWQ0LmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL25zZXEuYyBiL2xpYi9vcGVuc3NsL2FwcHMvbnNlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzRkYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL25zZXEuYwpAQCAtMCwwICsxLDE2NyBAQAorLyogbnNlcS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HIG5zZXFfbWFpbgorCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKmFyZ3MsICppbmZpbGUgPSBOVUxMLCAqb3V0ZmlsZSA9IE5VTEw7CisJQklPICppbiA9IE5VTEwsICpvdXQgPSBOVUxMOworCWludCB0b3NlcSA9IDA7CisJWDUwOSAqeDUwOSA9IE5VTEw7CisJTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSAqc2VxID0gTlVMTDsKKwlpbnQgaSwgcmV0ID0gMTsKKwlpbnQgYmFkYXJnID0gMDsKKwlpZiAoYmlvX2VyciA9PSBOVUxMKSBiaW9fZXJyID0gQklPX25ld19mcCAoc3RkZXJyLCBCSU9fTk9DTE9TRSk7CisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKwlhcmdzID0gYXJndiArIDE7CisJd2hpbGUgKCFiYWRhcmcgJiYgKmFyZ3MgJiYgKmFyZ3NbMF0gPT0gJy0nKSB7CisJCWlmICghc3RyY21wICgqYXJncywgIi10b3NlcSIpKSB0b3NlcSA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWluIikpIHsKKwkJCWlmIChhcmdzWzFdKSB7CisJCQkJYXJncysrOworCQkJCWluZmlsZSA9ICphcmdzOworCQkJfSBlbHNlIGJhZGFyZyA9IDE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItb3V0IikpIHsKKwkJCWlmIChhcmdzWzFdKSB7CisJCQkJYXJncysrOworCQkJCW91dGZpbGUgPSAqYXJnczsKKwkJCX0gZWxzZSBiYWRhcmcgPSAxOworCQl9IGVsc2UgYmFkYXJnID0gMTsKKwkJYXJncysrOworCX0KKworCWlmIChiYWRhcmcpIHsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIk5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlIHV0aWxpdHlcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiVXNhZ2UgbnNlcSBbb3B0aW9uc11cbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAid2hlcmUgb3B0aW9ucyBhcmVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWluIGZpbGUgIGlucHV0IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW91dCBmaWxlIG91dHB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi10b3NlcSAgICBvdXRwdXQgTlMgU2VxdWVuY2UgZmlsZVxuIik7CisJCU9QRU5TU0xfRVhJVCgxKTsKKwl9CisKKwlpZiAoaW5maWxlKSB7CisJCWlmICghKGluID0gQklPX25ld19maWxlIChpbmZpbGUsICJyIikpKSB7CisJCQlCSU9fcHJpbnRmIChiaW9fZXJyLAorCQkJCSAiQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBpbmZpbGUpOworCQkJZ290byBlbmQ7CisJCX0KKwl9IGVsc2UgaW4gPSBCSU9fbmV3X2ZwKHN0ZGluLCBCSU9fTk9DTE9TRSk7CisKKwlpZiAob3V0ZmlsZSkgeworCQlpZiAoIShvdXQgPSBCSU9fbmV3X2ZpbGUgKG91dGZpbGUsICJ3IikpKSB7CisJCQlCSU9fcHJpbnRmIChiaW9fZXJyLAorCQkJCSAiQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgb3V0ZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0gZWxzZSB7CisJCW91dCA9IEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCW91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJfQorI2VuZGlmCisJfQorCWlmICh0b3NlcSkgeworCQlzZXEgPSBORVRTQ0FQRV9DRVJUX1NFUVVFTkNFX25ldygpOworCQlzZXEtPmNlcnRzID0gc2tfWDUwOV9uZXdfbnVsbCgpOworCQl3aGlsZSgoeDUwOSA9IFBFTV9yZWFkX2Jpb19YNTA5KGluLCBOVUxMLCBOVUxMLCBOVUxMKSkpIAorCQkgICAgc2tfWDUwOV9wdXNoKHNlcS0+Y2VydHMseDUwOSk7CisKKwkJaWYoIXNrX1g1MDlfbnVtKHNlcS0+Y2VydHMpKQorCQl7CisJCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiRXJyb3IgcmVhZGluZyBjZXJ0cyBmaWxlICVzXG4iLCBpbmZpbGUpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQl9CisJCVBFTV93cml0ZV9iaW9fTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRShvdXQsIHNlcSk7CisJCXJldCA9IDA7CisJCWdvdG8gZW5kOworCX0KKworCWlmICghKHNlcSA9IFBFTV9yZWFkX2Jpb19ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFKGluLCBOVUxMLCBOVUxMLCBOVUxMKSkpIHsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIkVycm9yIHJlYWRpbmcgc2VxdWVuY2UgZmlsZSAlc1xuIiwgaW5maWxlKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgc2tfWDUwOV9udW0oc2VxLT5jZXJ0cyk7IGkrKykgeworCQl4NTA5ID0gc2tfWDUwOV92YWx1ZShzZXEtPmNlcnRzLCBpKTsKKwkJZHVtcF9jZXJ0X3RleHQob3V0LCB4NTA5KTsKKwkJUEVNX3dyaXRlX2Jpb19YNTA5KG91dCwgeDUwOSk7CisJfQorCXJldCA9IDA7CitlbmQ6CisJQklPX2ZyZWUoaW4pOworCUJJT19mcmVlX2FsbChvdXQpOworCU5FVFNDQVBFX0NFUlRfU0VRVUVOQ0VfZnJlZShzZXEpOworCisJT1BFTlNTTF9FWElUKHJldCk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvb2NzcC5jIGIvbGliL29wZW5zc2wvYXBwcy9vY3NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4NDdkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvb2NzcC5jCkBAIC0wLDAgKzEsMTQyMSBAQAorLyogb2NzcC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2lmbmRlZiBPUEVOU1NMX05PX09DU1AKKworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworI2RlZmluZSBfWE9QRU5fU09VUkNFX0VYVEVOREVECS8qIFNvIGZkX3NldCBhbmQgZnJpZW5kcyBnZXQgcHJvcGVybHkgZGVmaW5lZAorCQkJCSAgIG9uIE9wZW5WTVMgKi8KKyNlbmRpZgorCisjZGVmaW5lIFVTRV9TT0NLRVRTCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJhcHBzLmgiIC8qIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGJlZm9yZSB0aGUgb3BlbnNzbCBoZWFkZXJzISAqLworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaWYgZGVmaW5lZChORVRXQVJFX0NMSUIpCisjICBpZmRlZiBORVRXQVJFX0JTRFNPQ0sKKyMgICAgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyAgICBpbmNsdWRlIDxzeXMvYnNkc2t0Lmg+CisjICBlbHNlCisjICAgIGluY2x1ZGUgPG5vdnNvY2syLmg+CisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChORVRXQVJFX0xJQkMpCisjICBpZmRlZiBORVRXQVJFX0JTRFNPQ0sKKyMgICAgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorIyAgZWxzZQorIyAgICBpbmNsdWRlIDxub3Zzb2NrMi5oPgorIyAgZW5kaWYKKyNlbmRpZgorICAKKy8qIE1heGltdW0gbGVld2F5IGluIHZhbGlkaXR5IHBlcmlvZDogZGVmYXVsdCA1IG1pbnV0ZXMgKi8KKyNkZWZpbmUgTUFYX1ZBTElESVRZX1BFUklPRAkoNSAqIDYwKQorCitzdGF0aWMgaW50IGFkZF9vY3NwX2NlcnQoT0NTUF9SRVFVRVNUICoqcmVxLCBYNTA5ICpjZXJ0LCBjb25zdCBFVlBfTUQgKmNlcnRfaWRfbWQsIFg1MDkgKmlzc3VlciwKKwkJCQlTVEFDS19PRihPQ1NQX0NFUlRJRCkgKmlkcyk7CitzdGF0aWMgaW50IGFkZF9vY3NwX3NlcmlhbChPQ1NQX1JFUVVFU1QgKipyZXEsIGNoYXIgKnNlcmlhbCwgY29uc3QgRVZQX01EICogY2VydF9pZF9tZCwgWDUwOSAqaXNzdWVyLAorCQkJCVNUQUNLX09GKE9DU1BfQ0VSVElEKSAqaWRzKTsKK3N0YXRpYyBpbnQgcHJpbnRfb2NzcF9zdW1tYXJ5KEJJTyAqb3V0LCBPQ1NQX0JBU0lDUkVTUCAqYnMsIE9DU1BfUkVRVUVTVCAqcmVxLAorCQkJICAgICAgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpuYW1lcywKKwkJCSAgICAgIFNUQUNLX09GKE9DU1BfQ0VSVElEKSAqaWRzLCBsb25nIG5zZWMsCisJCQkgICAgICBsb25nIG1heGFnZSk7CisKK3N0YXRpYyBpbnQgbWFrZV9vY3NwX3Jlc3BvbnNlKE9DU1BfUkVTUE9OU0UgKipyZXNwLCBPQ1NQX1JFUVVFU1QgKnJlcSwgQ0FfREIgKmRiLAorCQkJWDUwOSAqY2EsIFg1MDkgKnJjZXJ0LCBFVlBfUEtFWSAqcmtleSwKKwkJCVNUQUNLX09GKFg1MDkpICpyb3RoZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQlpbnQgbm1pbiwgaW50IG5kYXlzKTsKKworc3RhdGljIGNoYXIgKipsb29rdXBfc2VyaWFsKENBX0RCICpkYiwgQVNOMV9JTlRFR0VSICpzZXIpOworc3RhdGljIEJJTyAqaW5pdF9yZXNwb25kZXIoY2hhciAqcG9ydCk7CitzdGF0aWMgaW50IGRvX3Jlc3BvbmRlcihPQ1NQX1JFUVVFU1QgKipwcmVxLCBCSU8gKipwY2JpbywgQklPICphY2JpbywgY2hhciAqcG9ydCk7CitzdGF0aWMgaW50IHNlbmRfb2NzcF9yZXNwb25zZShCSU8gKmNiaW8sIE9DU1BfUkVTUE9OU0UgKnJlc3ApOworc3RhdGljIE9DU1BfUkVTUE9OU0UgKnF1ZXJ5X3Jlc3BvbmRlcihCSU8gKmVyciwgQklPICpjYmlvLCBjaGFyICpwYXRoLAorCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpoZWFkZXJzLAorCQkJCU9DU1BfUkVRVUVTVCAqcmVxLCBpbnQgcmVxX3RpbWVvdXQpOworCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HIG9jc3BfbWFpbgorCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCUVOR0lORSAqZSA9IE5VTEw7CisJY2hhciAqKmFyZ3M7CisJY2hhciAqaG9zdCA9IE5VTEwsICpwb3J0ID0gTlVMTCwgKnBhdGggPSAiLyI7CisJY2hhciAqcmVxaW4gPSBOVUxMLCAqcmVzcGluID0gTlVMTDsKKwljaGFyICpyZXFvdXQgPSBOVUxMLCAqcmVzcG91dCA9IE5VTEw7CisJY2hhciAqc2lnbmZpbGUgPSBOVUxMLCAqa2V5ZmlsZSA9IE5VTEw7CisJY2hhciAqcnNpZ25maWxlID0gTlVMTCwgKnJrZXlmaWxlID0gTlVMTDsKKwljaGFyICpvdXRmaWxlID0gTlVMTDsKKwlpbnQgYWRkX25vbmNlID0gMSwgbm92ZXJpZnkgPSAwLCB1c2Vfc3NsID0gLTE7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmhlYWRlcnMgPSBOVUxMOworCU9DU1BfUkVRVUVTVCAqcmVxID0gTlVMTDsKKwlPQ1NQX1JFU1BPTlNFICpyZXNwID0gTlVMTDsKKwlPQ1NQX0JBU0lDUkVTUCAqYnMgPSBOVUxMOworCVg1MDkgKmlzc3VlciA9IE5VTEwsICpjZXJ0ID0gTlVMTDsKKwlYNTA5ICpzaWduZXIgPSBOVUxMLCAqcnNpZ25lciA9IE5VTEw7CisJRVZQX1BLRVkgKmtleSA9IE5VTEwsICpya2V5ID0gTlVMTDsKKwlCSU8gKmFjYmlvID0gTlVMTCwgKmNiaW8gPSBOVUxMOworCUJJTyAqZGVyYmlvID0gTlVMTDsKKwlCSU8gKm91dCA9IE5VTEw7CisJaW50IHJlcV90aW1lb3V0ID0gLTE7CisJaW50IHJlcV90ZXh0ID0gMCwgcmVzcF90ZXh0ID0gMDsKKwlsb25nIG5zZWMgPSBNQVhfVkFMSURJVFlfUEVSSU9ELCBtYXhhZ2UgPSAtMTsKKwljaGFyICpDQWZpbGUgPSBOVUxMLCAqQ0FwYXRoID0gTlVMTDsKKwlYNTA5X1NUT1JFICpzdG9yZSA9IE5VTEw7CisJU1RBQ0tfT0YoWDUwOSkgKnNpZ25fb3RoZXIgPSBOVUxMLCAqdmVyaWZ5X290aGVyID0gTlVMTCwgKnJvdGhlciA9IE5VTEw7CisJY2hhciAqc2lnbl9jZXJ0ZmlsZSA9IE5VTEwsICp2ZXJpZnlfY2VydGZpbGUgPSBOVUxMLCAqcmNlcnRmaWxlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHNpZ25fZmxhZ3MgPSAwLCB2ZXJpZnlfZmxhZ3MgPSAwLCByZmxhZ3MgPSAwOworCWludCByZXQgPSAxOworCWludCBhY2NlcHRfY291bnQgPSAtMTsKKwlpbnQgYmFkYXJnID0gMDsKKwlpbnQgaTsKKwlpbnQgaWdub3JlX2VyciA9IDA7CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpyZXFuYW1lcyA9IE5VTEw7CisJU1RBQ0tfT0YoT0NTUF9DRVJUSUQpICppZHMgPSBOVUxMOworCisJWDUwOSAqcmNhX2NlcnQgPSBOVUxMOworCWNoYXIgKnJpZHhfZmlsZW5hbWUgPSBOVUxMOworCWNoYXIgKnJjYV9maWxlbmFtZSA9IE5VTEw7CisJQ0FfREIgKnJkYiA9IE5VTEw7CisJaW50IG5taW4gPSAwLCBuZGF5cyA9IC0xOworCWNvbnN0IEVWUF9NRCAqY2VydF9pZF9tZCA9IE5VTEw7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKSBiaW9fZXJyID0gQklPX25ld19mcChzdGRlcnIsIEJJT19OT0NMT1NFKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCVNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKwlPcGVuU1NMX2FkZF9zc2xfYWxnb3JpdGhtcygpOworCWFyZ3MgPSBhcmd2ICsgMTsKKwlyZXFuYW1lcyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisJaWRzID0gc2tfT0NTUF9DRVJUSURfbmV3X251bGwoKTsKKwl3aGlsZSAoIWJhZGFyZyAmJiAqYXJncyAmJiAqYXJnc1swXSA9PSAnLScpCisJCXsKKwkJaWYgKCFzdHJjbXAoKmFyZ3MsICItb3V0IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCW91dGZpbGUgPSAqYXJnczsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItdGltZW91dCIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlyZXFfdGltZW91dCA9IGF0b2woKmFyZ3MpOworCQkJCWlmIChyZXFfdGltZW91dCA8IDApCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkJIklsbGVnYWwgdGltZW91dCB2YWx1ZSAlc1xuIiwKKwkJCQkJCSphcmdzKTsKKwkJCQkJYmFkYXJnID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi11cmwiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJaWYgKCFPQ1NQX3BhcnNlX3VybCgqYXJncywgJmhvc3QsICZwb3J0LCAmcGF0aCwgJnVzZV9zc2wpKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHBhcnNpbmcgVVJMXG4iKTsKKwkJCQkJYmFkYXJnID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1ob3N0IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCWhvc3QgPSAqYXJnczsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItcG9ydCIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlwb3J0ID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLWhlYWRlciIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0gJiYgYXJnc1syXSkKKwkJCQl7CisJCQkJaWYgKCFYNTA5VjNfYWRkX3ZhbHVlKGFyZ3NbMV0sIGFyZ3NbMl0sICZoZWFkZXJzKSkKKwkJCQkJZ290byBlbmQ7CisJCQkJYXJncyArPSAyOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1pZ25vcmVfZXJyIikpCisJCQlpZ25vcmVfZXJyID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1ub3ZlcmlmeSIpKQorCQkJbm92ZXJpZnkgPSAxOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLW5vbmNlIikpCisJCQlhZGRfbm9uY2UgPSAyOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLW5vX25vbmNlIikpCisJCQlhZGRfbm9uY2UgPSAwOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLXJlc3Bfbm9fY2VydHMiKSkKKwkJCXJmbGFncyB8PSBPQ1NQX05PQ0VSVFM7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItcmVzcF9rZXlfaWQiKSkKKwkJCXJmbGFncyB8PSBPQ1NQX1JFU1BJRF9LRVk7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItbm9fY2VydHMiKSkKKwkJCXNpZ25fZmxhZ3MgfD0gT0NTUF9OT0NFUlRTOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLW5vX3NpZ25hdHVyZV92ZXJpZnkiKSkKKwkJCXZlcmlmeV9mbGFncyB8PSBPQ1NQX05PU0lHUzsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1ub19jZXJ0X3ZlcmlmeSIpKQorCQkJdmVyaWZ5X2ZsYWdzIHw9IE9DU1BfTk9WRVJJRlk7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItbm9fY2hhaW4iKSkKKwkJCXZlcmlmeV9mbGFncyB8PSBPQ1NQX05PQ0hBSU47CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItbm9fY2VydF9jaGVja3MiKSkKKwkJCXZlcmlmeV9mbGFncyB8PSBPQ1NQX05PQ0hFQ0tTOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLW5vX2V4cGxpY2l0IikpCisJCQl2ZXJpZnlfZmxhZ3MgfD0gT0NTUF9OT0VYUExJQ0lUOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLXRydXN0X290aGVyIikpCisJCQl2ZXJpZnlfZmxhZ3MgfD0gT0NTUF9UUlVTVE9USEVSOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLW5vX2ludGVybiIpKQorCQkJdmVyaWZ5X2ZsYWdzIHw9IE9DU1BfTk9JTlRFUk47CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItdGV4dCIpKQorCQkJeworCQkJcmVxX3RleHQgPSAxOworCQkJcmVzcF90ZXh0ID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1yZXFfdGV4dCIpKQorCQkJcmVxX3RleHQgPSAxOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLXJlc3BfdGV4dCIpKQorCQkJcmVzcF90ZXh0ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1yZXFpbiIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlyZXFpbiA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1yZXNwaW4iKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJcmVzcGluID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLXNpZ25lciIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlzaWduZmlsZSA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItVkFmaWxlIikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCXZlcmlmeV9jZXJ0ZmlsZSA9ICphcmdzOworCQkJCXZlcmlmeV9mbGFncyB8PSBPQ1NQX1RSVVNUT1RIRVI7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLXNpZ25fb3RoZXIiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJc2lnbl9jZXJ0ZmlsZSA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi12ZXJpZnlfb3RoZXIiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJdmVyaWZ5X2NlcnRmaWxlID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1DQWZpbGUiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJQ0FmaWxlID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1DQXBhdGgiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJQ0FwYXRoID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi12YWxpZGl0eV9wZXJpb2QiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJbnNlYyA9IGF0b2woKmFyZ3MpOworCQkJCWlmIChuc2VjIDwgMCkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCQkiSWxsZWdhbCB2YWxpZGl0eSBwZXJpb2QgJXNcbiIsCisJCQkJCQkqYXJncyk7CisJCQkJCWJhZGFyZyA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXN0YXR1c19hZ2UiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJbWF4YWdlID0gYXRvbCgqYXJncyk7CisJCQkJaWYgKG1heGFnZSA8IDApCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkJIklsbGVnYWwgdmFsaWRpdHkgYWdlICVzXG4iLAorCQkJCQkJKmFyZ3MpOworCQkJCQliYWRhcmcgPSAxOworCQkJCQl9CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQkgZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1zaWdua2V5IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCWtleWZpbGUgPSAqYXJnczsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItcmVxb3V0IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCXJlcW91dCA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1yZXNwb3V0IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCXJlc3BvdXQgPSAqYXJnczsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCSBlbHNlIGlmICghc3RyY21wKCphcmdzLCAiLXBhdGgiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJcGF0aCA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1pc3N1ZXIiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJWDUwOV9mcmVlKGlzc3Vlcik7CisJCQkJaXNzdWVyID0gbG9hZF9jZXJ0KGJpb19lcnIsICphcmdzLCBGT1JNQVRfUEVNLAorCQkJCQlOVUxMLCBlLCAiaXNzdWVyIGNlcnRpZmljYXRlIik7CisJCQkJaWYoIWlzc3VlcikgZ290byBlbmQ7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1jZXJ0IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCVg1MDlfZnJlZShjZXJ0KTsKKwkJCQljZXJ0ID0gbG9hZF9jZXJ0KGJpb19lcnIsICphcmdzLCBGT1JNQVRfUEVNLAorCQkJCQlOVUxMLCBlLCAiY2VydGlmaWNhdGUiKTsKKwkJCQlpZighY2VydCkgZ290byBlbmQ7CisJCQkJaWYgKCFjZXJ0X2lkX21kKSBjZXJ0X2lkX21kID0gRVZQX3NoYTEoKTsKKwkJCQlpZighYWRkX29jc3BfY2VydCgmcmVxLCBjZXJ0LCBjZXJ0X2lkX21kLCBpc3N1ZXIsIGlkcykpCisJCQkJCWdvdG8gZW5kOworCQkJCWlmKCFza19PUEVOU1NMX1NUUklOR19wdXNoKHJlcW5hbWVzLCAqYXJncykpCisJCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1zZXJpYWwiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJaWYgKCFjZXJ0X2lkX21kKSBjZXJ0X2lkX21kID0gRVZQX3NoYTEoKTsKKwkJCQlpZighYWRkX29jc3Bfc2VyaWFsKCZyZXEsICphcmdzLCBjZXJ0X2lkX21kLCBpc3N1ZXIsIGlkcykpCisJCQkJCWdvdG8gZW5kOworCQkJCWlmKCFza19PUEVOU1NMX1NUUklOR19wdXNoKHJlcW5hbWVzLCAqYXJncykpCisJCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1pbmRleCIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlyaWR4X2ZpbGVuYW1lID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLUNBIikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCXJjYV9maWxlbmFtZSA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm1pbiIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlubWluID0gYXRvbCgqYXJncyk7CisJCQkJaWYgKG5taW4gPCAwKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkJCSJJbGxlZ2FsIHVwZGF0ZSBwZXJpb2QgJXNcbiIsCisJCQkJCQkqYXJncyk7CisJCQkJCWJhZGFyZyA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKG5kYXlzID09IC0xKQorCQkJCQluZGF5cyA9IDA7CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5yZXF1ZXN0IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCWFjY2VwdF9jb3VudCA9IGF0b2woKmFyZ3MpOworCQkJCWlmIChhY2NlcHRfY291bnQgPCAwKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkJCSJJbGxlZ2FsIGFjY2VwdCBjb3VudCAlc1xuIiwKKwkJCQkJCSphcmdzKTsKKwkJCQkJYmFkYXJnID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbmRheXMiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJbmRheXMgPSBhdG9sKCphcmdzKTsKKwkJCQlpZiAobmRheXMgPCAwKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkJCSJJbGxlZ2FsIHVwZGF0ZSBwZXJpb2QgJXNcbiIsCisJCQkJCQkqYXJncyk7CisJCQkJCWJhZGFyZyA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItcnNpZ25lciIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlyc2lnbmZpbGUgPSAqYXJnczsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsICItcmtleSIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlya2V5ZmlsZSA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywgIi1yb3RoZXIiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJcmNlcnRmaWxlID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICgoY2VydF9pZF9tZCA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKCgqYXJncykrMSkpPT1OVUxMKQorCQkJeworCQkJYmFkYXJnID0gMTsKKwkJCX0KKwkJYXJncysrOworCQl9CisKKwkvKiBIYXZlIHdlIGFueXRoaW5nIHRvIGRvPyAqLworCWlmICghcmVxICYmICFyZXFpbiAmJiAhcmVzcGluICYmICEocG9ydCAmJiByaWR4X2ZpbGVuYW1lKSkgYmFkYXJnID0gMTsKKworCWlmIChiYWRhcmcpCisJCXsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIk9DU1AgdXRpbGl0eVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICJVc2FnZSBvY3NwIFtvcHRpb25zXVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICJ3aGVyZSBvcHRpb25zIGFyZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItb3V0IGZpbGUgICAgICAgICAgb3V0cHV0IGZpbGVuYW1lXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1pc3N1ZXIgZmlsZSAgICAgICBpc3N1ZXIgY2VydGlmaWNhdGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNlcnQgZmlsZSAgICAgICAgIGNlcnRpZmljYXRlIHRvIGNoZWNrXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1zZXJpYWwgbiAgICAgICAgICBzZXJpYWwgbnVtYmVyIHRvIGNoZWNrXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1zaWduZXIgZmlsZSAgICAgICBjZXJ0aWZpY2F0ZSB0byBzaWduIE9DU1AgcmVxdWVzdCB3aXRoXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1zaWdua2V5IGZpbGUgICAgICBwcml2YXRlIGtleSB0byBzaWduIE9DU1AgcmVxdWVzdCB3aXRoXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1zaWduX290aGVyIGZpbGUgICBhZGRpdGlvbmFsIGNlcnRpZmljYXRlcyB0byBpbmNsdWRlIGluIHNpZ25lZCByZXF1ZXN0XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub19jZXJ0cyAgICAgICAgICBkb24ndCBpbmNsdWRlIGFueSBjZXJ0aWZpY2F0ZXMgaW4gc2lnbmVkIHJlcXVlc3RcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXJlcV90ZXh0ICAgICAgICAgIHByaW50IHRleHQgZm9ybSBvZiByZXF1ZXN0XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yZXNwX3RleHQgICAgICAgICBwcmludCB0ZXh0IGZvcm0gb2YgcmVzcG9uc2VcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXRleHQgICAgICAgICAgICAgIHByaW50IHRleHQgZm9ybSBvZiByZXF1ZXN0IGFuZCByZXNwb25zZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItcmVxb3V0IGZpbGUgICAgICAgd3JpdGUgREVSIGVuY29kZWQgT0NTUCByZXF1ZXN0IHRvIFwiZmlsZVwiXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yZXNwb3V0IGZpbGUgICAgICB3cml0ZSBERVIgZW5jb2RlZCBPQ1NQIHJlcG9uc2UgdG8gXCJmaWxlXCJcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXJlcWluIGZpbGUgICAgICAgIHJlYWQgREVSIGVuY29kZWQgT0NTUCByZXF1ZXN0IGZyb20gXCJmaWxlXCJcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXJlc3BpbiBmaWxlICAgICAgIHJlYWQgREVSIGVuY29kZWQgT0NTUCByZXBvbnNlIGZyb20gXCJmaWxlXCJcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vbmNlICAgICAgICAgICAgIGFkZCBPQ1NQIG5vbmNlIHRvIHJlcXVlc3RcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vX25vbmNlICAgICAgICAgIGRvbid0IGFkZCBPQ1NQIG5vbmNlIHRvIHJlcXVlc3RcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXVybCBVUkwgICAgICAgICAgIE9DU1AgcmVzcG9uZGVyIFVSTFxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItaG9zdCBob3N0Om4gICAgICAgc2VuZCBPQ1NQIHJlcXVlc3QgdG8gaG9zdCBvbiBwb3J0IG5cbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXBhdGggICAgICAgICAgICAgIHBhdGggdG8gdXNlIGluIE9DU1AgcmVxdWVzdFxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItQ0FwYXRoIGRpciAgICAgICAgdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgZGlyZWN0b3J5XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1DQWZpbGUgZmlsZSAgICAgICB0cnVzdGVkIGNlcnRpZmljYXRlcyBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1WQWZpbGUgZmlsZSAgICAgICB2YWxpZGF0b3IgY2VydGlmaWNhdGVzIGZpbGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXZhbGlkaXR5X3BlcmlvZCBuIG1heGltdW0gdmFsaWRpdHkgZGlzY3JlcGFuY3kgaW4gc2Vjb25kc1xuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItc3RhdHVzX2FnZSBuICAgICAgbWF4aW11bSBzdGF0dXMgYWdlIGluIHNlY29uZHNcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vdmVyaWZ5ICAgICAgICAgIGRvbid0IHZlcmlmeSByZXNwb25zZSBhdCBhbGxcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXZlcmlmeV9vdGhlciBmaWxlIGFkZGl0aW9uYWwgY2VydGlmaWNhdGVzIHRvIHNlYXJjaCBmb3Igc2lnbmVyXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi10cnVzdF9vdGhlciAgICAgICBkb24ndCB2ZXJpZnkgYWRkaXRpb25hbCBjZXJ0aWZpY2F0ZXNcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vX2ludGVybiAgICAgICAgIGRvbid0IHNlYXJjaCBjZXJ0aWZpY2F0ZXMgY29udGFpbmVkIGluIHJlc3BvbnNlIGZvciBzaWduZXJcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vX3NpZ25hdHVyZV92ZXJpZnkgZG9uJ3QgY2hlY2sgc2lnbmF0dXJlIG9uIHJlc3BvbnNlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub19jZXJ0X3ZlcmlmeSAgICBkb24ndCBjaGVjayBzaWduaW5nIGNlcnRpZmljYXRlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub19jaGFpbiAgICAgICAgICBkb24ndCBjaGFpbiB2ZXJpZnkgcmVzcG9uc2VcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vX2NlcnRfY2hlY2tzICAgIGRvbid0IGRvIGFkZGl0aW9uYWwgY2hlY2tzIG9uIHNpZ25pbmcgY2VydGlmaWNhdGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXBvcnQgbnVtCQkgcG9ydCB0byBydW4gcmVzcG9uZGVyIG9uXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1pbmRleCBmaWxlCSBjZXJ0aWZpY2F0ZSBzdGF0dXMgaW5kZXggZmlsZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItQ0EgZmlsZQkJIENBIGNlcnRpZmljYXRlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yc2lnbmVyIGZpbGUJIHJlc3BvbmRlciBjZXJ0aWZpY2F0ZSB0byBzaWduIHJlc3BvbnNlcyB3aXRoXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ya2V5IGZpbGUJIHJlc3BvbmRlciBrZXkgdG8gc2lnbiByZXNwb25zZXMgd2l0aFxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItcm90aGVyIGZpbGUJIG90aGVyIGNlcnRpZmljYXRlcyB0byBpbmNsdWRlIGluIHJlc3BvbnNlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yZXNwX25vX2NlcnRzICAgICBkb24ndCBpbmNsdWRlIGFueSBjZXJ0aWZpY2F0ZXMgaW4gcmVzcG9uc2VcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5taW4gbgkgCSBudW1iZXIgb2YgbWludXRlcyBiZWZvcmUgbmV4dCB1cGRhdGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5kYXlzIG4JIAkgbnVtYmVyIG9mIGRheXMgYmVmb3JlIG5leHQgdXBkYXRlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yZXNwX2tleV9pZCAgICAgICBpZGVudGlmeSByZXBvbnNlIGJ5IHNpZ25pbmcgY2VydGlmaWNhdGUga2V5IElEXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ucmVxdWVzdCBuICAgICAgICBudW1iZXIgb2YgcmVxdWVzdHMgdG8gYWNjZXB0IChkZWZhdWx0IHVubGltaXRlZClcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLTxkZ3N0IGFsZz4gICAgIHVzZSBzcGVjaWZpZWQgZGlnZXN0IGluIHRoZSByZXF1ZXN0Iik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZihvdXRmaWxlKSBvdXQgPSBCSU9fbmV3X2ZpbGUob3V0ZmlsZSwgInciKTsKKwllbHNlIG91dCA9IEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisKKwlpZighb3V0KQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGVcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKCFyZXEgJiYgKGFkZF9ub25jZSAhPSAyKSkgYWRkX25vbmNlID0gMDsKKworCWlmICghcmVxICYmIHJlcWluKQorCQl7CisJCWRlcmJpbyA9IEJJT19uZXdfZmlsZShyZXFpbiwgInJiIik7CisJCWlmICghZGVyYmlvKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgT3BlbmluZyBPQ1NQIHJlcXVlc3QgZmlsZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJcmVxID0gZDJpX09DU1BfUkVRVUVTVF9iaW8oZGVyYmlvLCBOVUxMKTsKKwkJQklPX2ZyZWUoZGVyYmlvKTsKKwkJaWYoIXJlcSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHJlYWRpbmcgT0NTUCByZXF1ZXN0XG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAoIXJlcSAmJiBwb3J0KQorCQl7CisJCWFjYmlvID0gaW5pdF9yZXNwb25kZXIocG9ydCk7CisJCWlmICghYWNiaW8pCisJCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKHJzaWduZmlsZSAmJiAhcmRiKQorCQl7CisJCWlmICghcmtleWZpbGUpIHJrZXlmaWxlID0gcnNpZ25maWxlOworCQlyc2lnbmVyID0gbG9hZF9jZXJ0KGJpb19lcnIsIHJzaWduZmlsZSwgRk9STUFUX1BFTSwKKwkJCU5VTEwsIGUsICJyZXNwb25kZXIgY2VydGlmaWNhdGUiKTsKKwkJaWYgKCFyc2lnbmVyKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgbG9hZGluZyByZXNwb25kZXIgY2VydGlmaWNhdGVcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCXJjYV9jZXJ0ID0gbG9hZF9jZXJ0KGJpb19lcnIsIHJjYV9maWxlbmFtZSwgRk9STUFUX1BFTSwKKwkJCU5VTEwsIGUsICJDQSBjZXJ0aWZpY2F0ZSIpOworCQlpZiAocmNlcnRmaWxlKQorCQkJeworCQkJcm90aGVyID0gbG9hZF9jZXJ0cyhiaW9fZXJyLCByY2VydGZpbGUsIEZPUk1BVF9QRU0sCisJCQkJTlVMTCwgZSwgInJlc3BvbmRlciBvdGhlciBjZXJ0aWZpY2F0ZXMiKTsKKwkJCWlmICghcm90aGVyKSBnb3RvIGVuZDsKKwkJCX0KKwkJcmtleSA9IGxvYWRfa2V5KGJpb19lcnIsIHJrZXlmaWxlLCBGT1JNQVRfUEVNLCAwLCBOVUxMLCBOVUxMLAorCQkJInJlc3BvbmRlciBwcml2YXRlIGtleSIpOworCQlpZiAoIXJrZXkpCisJCQlnb3RvIGVuZDsKKwkJfQorCWlmKGFjYmlvKQorCQlCSU9fcHJpbnRmKGJpb19lcnIsICJXYWl0aW5nIGZvciBPQ1NQIGNsaWVudCBjb25uZWN0aW9ucy4uLlxuIik7CisKKwlyZWRvX2FjY2VwdDoKKworCWlmIChhY2JpbykKKwkJeworCQlpZiAoIWRvX3Jlc3BvbmRlcigmcmVxLCAmY2JpbywgYWNiaW8sIHBvcnQpKQorCQkJZ290byBlbmQ7CisJCWlmICghcmVxKQorCQkJeworCQkJcmVzcCA9IE9DU1BfcmVzcG9uc2VfY3JlYXRlKE9DU1BfUkVTUE9OU0VfU1RBVFVTX01BTEZPUk1FRFJFUVVFU1QsIE5VTEwpOworCQkJc2VuZF9vY3NwX3Jlc3BvbnNlKGNiaW8sIHJlc3ApOworCQkJZ290byBkb25lX3Jlc3A7CisJCQl9CisJCX0KKworCWlmICghcmVxICYmIChzaWduZmlsZSB8fCByZXFvdXQgfHwgaG9zdCB8fCBhZGRfbm9uY2UgfHwgcmlkeF9maWxlbmFtZSkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiTmVlZCBhbiBPQ1NQIHJlcXVlc3QgZm9yIHRoaXMgb3BlcmF0aW9uIVxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAocmVxICYmIGFkZF9ub25jZSkgT0NTUF9yZXF1ZXN0X2FkZDFfbm9uY2UocmVxLCBOVUxMLCAtMSk7CisKKwlpZiAoc2lnbmZpbGUpCisJCXsKKwkJaWYgKCFrZXlmaWxlKSBrZXlmaWxlID0gc2lnbmZpbGU7CisJCXNpZ25lciA9IGxvYWRfY2VydChiaW9fZXJyLCBzaWduZmlsZSwgRk9STUFUX1BFTSwKKwkJCU5VTEwsIGUsICJzaWduZXIgY2VydGlmaWNhdGUiKTsKKwkJaWYgKCFzaWduZXIpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBsb2FkaW5nIHNpZ25lciBjZXJ0aWZpY2F0ZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKHNpZ25fY2VydGZpbGUpCisJCQl7CisJCQlzaWduX290aGVyID0gbG9hZF9jZXJ0cyhiaW9fZXJyLCBzaWduX2NlcnRmaWxlLCBGT1JNQVRfUEVNLAorCQkJCU5VTEwsIGUsICJzaWduZXIgY2VydGlmaWNhdGVzIik7CisJCQlpZiAoIXNpZ25fb3RoZXIpIGdvdG8gZW5kOworCQkJfQorCQlrZXkgPSBsb2FkX2tleShiaW9fZXJyLCBrZXlmaWxlLCBGT1JNQVRfUEVNLCAwLCBOVUxMLCBOVUxMLAorCQkJInNpZ25lciBwcml2YXRlIGtleSIpOworCQlpZiAoIWtleSkKKwkJCWdvdG8gZW5kOworCisJCWlmICghT0NTUF9yZXF1ZXN0X3NpZ24ocmVxLCBzaWduZXIsIGtleSwgTlVMTCwgc2lnbl9vdGhlciwgc2lnbl9mbGFncykpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBzaWduaW5nIE9DU1AgcmVxdWVzdFxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJaWYgKHJlcV90ZXh0ICYmIHJlcSkgT0NTUF9SRVFVRVNUX3ByaW50KG91dCwgcmVxLCAwKTsKKworCWlmIChyZXFvdXQpCisJCXsKKwkJZGVyYmlvID0gQklPX25ld19maWxlKHJlcW91dCwgIndiIik7CisJCWlmKCFkZXJiaW8pCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBvcGVuaW5nIGZpbGUgJXNcbiIsIHJlcW91dCk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaTJkX09DU1BfUkVRVUVTVF9iaW8oZGVyYmlvLCByZXEpOworCQlCSU9fZnJlZShkZXJiaW8pOworCQl9CisKKwlpZiAocmlkeF9maWxlbmFtZSAmJiAoIXJrZXkgfHwgIXJzaWduZXIgfHwgIXJjYV9jZXJ0KSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJOZWVkIGEgcmVzcG9uZGVyIGNlcnRpZmljYXRlLCBrZXkgYW5kIENBIGZvciB0aGlzIG9wZXJhdGlvbiFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKHJpZHhfZmlsZW5hbWUgJiYgIXJkYikKKwkJeworCQlyZGIgPSBsb2FkX2luZGV4KHJpZHhfZmlsZW5hbWUsIE5VTEwpOworCQlpZiAoIXJkYikgZ290byBlbmQ7CisJCWlmICghaW5kZXhfaW5kZXgocmRiKSkgZ290byBlbmQ7CisJCX0KKworCWlmIChyZGIpCisJCXsKKwkJaSA9IG1ha2Vfb2NzcF9yZXNwb25zZSgmcmVzcCwgcmVxLCByZGIsIHJjYV9jZXJ0LCByc2lnbmVyLCBya2V5LCByb3RoZXIsIHJmbGFncywgbm1pbiwgbmRheXMpOworCQlpZiAoY2JpbykKKwkJCXNlbmRfb2NzcF9yZXNwb25zZShjYmlvLCByZXNwKTsKKwkJfQorCWVsc2UgaWYgKGhvc3QpCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19TT0NLCisJCXJlc3AgPSBwcm9jZXNzX3Jlc3BvbmRlcihiaW9fZXJyLCByZXEsIGhvc3QsIHBhdGgsCisJCQkJCXBvcnQsIHVzZV9zc2wsIGhlYWRlcnMsIHJlcV90aW1lb3V0KTsKKwkJaWYgKCFyZXNwKQorCQkJZ290byBlbmQ7CisjZWxzZQorCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBjcmVhdGluZyBjb25uZWN0IEJJTyAtIHNvY2tldHMgbm90IHN1cHBvcnRlZC5cbiIpOworCQlnb3RvIGVuZDsKKyNlbmRpZgorCQl9CisJZWxzZSBpZiAocmVzcGluKQorCQl7CisJCWRlcmJpbyA9IEJJT19uZXdfZmlsZShyZXNwaW4sICJyYiIpOworCQlpZiAoIWRlcmJpbykKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIE9wZW5pbmcgT0NTUCByZXNwb25zZSBmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlyZXNwID0gZDJpX09DU1BfUkVTUE9OU0VfYmlvKGRlcmJpbywgTlVMTCk7CisJCUJJT19mcmVlKGRlcmJpbyk7CisJCWlmKCFyZXNwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgcmVhZGluZyBPQ1NQIHJlc3BvbnNlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQorCQl9CisJZWxzZQorCQl7CisJCXJldCA9IDA7CisJCWdvdG8gZW5kOworCQl9CisKKwlkb25lX3Jlc3A6CisKKwlpZiAocmVzcG91dCkKKwkJeworCQlkZXJiaW8gPSBCSU9fbmV3X2ZpbGUocmVzcG91dCwgIndiIik7CisJCWlmKCFkZXJiaW8pCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBvcGVuaW5nIGZpbGUgJXNcbiIsIHJlc3BvdXQpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWkyZF9PQ1NQX1JFU1BPTlNFX2JpbyhkZXJiaW8sIHJlc3ApOworCQlCSU9fZnJlZShkZXJiaW8pOworCQl9CisKKwlpID0gT0NTUF9yZXNwb25zZV9zdGF0dXMocmVzcCk7CisKKwlpZiAoaSAhPSBPQ1NQX1JFU1BPTlNFX1NUQVRVU19TVUNDRVNTRlVMKQorCQl7CisJCUJJT19wcmludGYob3V0LCAiUmVzcG9uZGVyIEVycm9yOiAlcyAoJWQpXG4iLAorCQkJCU9DU1BfcmVzcG9uc2Vfc3RhdHVzX3N0cihpKSwgaSk7CisJCWlmIChpZ25vcmVfZXJyKQorCQkJZ290byByZWRvX2FjY2VwdDsKKwkJcmV0ID0gMDsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChyZXNwX3RleHQpIE9DU1BfUkVTUE9OU0VfcHJpbnQob3V0LCByZXNwLCAwKTsKKworCS8qIElmIHJ1bm5pbmcgYXMgcmVzcG9uZGVyIGRvbid0IHZlcmlmeSBvdXIgb3duIHJlc3BvbnNlICovCisJaWYgKGNiaW8pCisJCXsKKwkJaWYgKGFjY2VwdF9jb3VudCA+IDApCisJCQlhY2NlcHRfY291bnQtLTsKKwkJLyogUmVkbyBpZiBtb3JlIGNvbm5lY3Rpb25zIG5lZWRlZCAqLworCQlpZiAoYWNjZXB0X2NvdW50KQorCQkJeworCQkJQklPX2ZyZWVfYWxsKGNiaW8pOworCQkJY2JpbyA9IE5VTEw7CisJCQlPQ1NQX1JFUVVFU1RfZnJlZShyZXEpOworCQkJcmVxID0gTlVMTDsKKwkJCU9DU1BfUkVTUE9OU0VfZnJlZShyZXNwKTsKKwkJCXJlc3AgPSBOVUxMOworCQkJZ290byByZWRvX2FjY2VwdDsKKwkJCX0KKwkJZ290byBlbmQ7CisJCX0KKworCWlmICghc3RvcmUpCisJCXN0b3JlID0gc2V0dXBfdmVyaWZ5KGJpb19lcnIsIENBZmlsZSwgQ0FwYXRoKTsKKwlpZiAoIXN0b3JlKQorCQlnb3RvIGVuZDsKKwlpZiAodmVyaWZ5X2NlcnRmaWxlKQorCQl7CisJCXZlcmlmeV9vdGhlciA9IGxvYWRfY2VydHMoYmlvX2VyciwgdmVyaWZ5X2NlcnRmaWxlLCBGT1JNQVRfUEVNLAorCQkJTlVMTCwgZSwgInZhbGlkYXRvciBjZXJ0aWZpY2F0ZSIpOworCQlpZiAoIXZlcmlmeV9vdGhlcikgZ290byBlbmQ7CisJCX0KKworCWJzID0gT0NTUF9yZXNwb25zZV9nZXQxX2Jhc2ljKHJlc3ApOworCisJaWYgKCFicykKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBwYXJzaW5nIHJlc3BvbnNlXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmICghbm92ZXJpZnkpCisJCXsKKwkJaWYgKHJlcSAmJiAoKGkgPSBPQ1NQX2NoZWNrX25vbmNlKHJlcSwgYnMpKSA8PSAwKSkKKwkJCXsKKwkJCWlmIChpID09IC0xKQorCQkJCUJJT19wcmludGYoYmlvX2VyciwgIldBUk5JTkc6IG5vIG5vbmNlIGluIHJlc3BvbnNlXG4iKTsKKwkJCWVsc2UKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiTm9uY2UgVmVyaWZ5IGVycm9yXG4iKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisKKwkJaSA9IE9DU1BfYmFzaWNfdmVyaWZ5KGJzLCB2ZXJpZnlfb3RoZXIsIHN0b3JlLCB2ZXJpZnlfZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChpIDwgMCkgaSA9IE9DU1BfYmFzaWNfdmVyaWZ5KGJzLCBOVUxMLCBzdG9yZSwgMCk7CisKKwkJaWYoaSA8PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiUmVzcG9uc2UgVmVyaWZ5IEZhaWx1cmVcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCX0KKwkJZWxzZQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiUmVzcG9uc2UgdmVyaWZ5IE9LXG4iKTsKKworCQl9CisKKwlpZiAoIXByaW50X29jc3Bfc3VtbWFyeShvdXQsIGJzLCByZXEsIHJlcW5hbWVzLCBpZHMsIG5zZWMsIG1heGFnZSkpCisJCWdvdG8gZW5kOworCisJcmV0ID0gMDsKKworZW5kOgorCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJWDUwOV9mcmVlKHNpZ25lcik7CisJWDUwOV9TVE9SRV9mcmVlKHN0b3JlKTsKKwlFVlBfUEtFWV9mcmVlKGtleSk7CisJRVZQX1BLRVlfZnJlZShya2V5KTsKKwlYNTA5X2ZyZWUoaXNzdWVyKTsKKwlYNTA5X2ZyZWUoY2VydCk7CisJWDUwOV9mcmVlKHJzaWduZXIpOworCVg1MDlfZnJlZShyY2FfY2VydCk7CisJZnJlZV9pbmRleChyZGIpOworCUJJT19mcmVlX2FsbChjYmlvKTsKKwlCSU9fZnJlZV9hbGwoYWNiaW8pOworCUJJT19mcmVlKG91dCk7CisJT0NTUF9SRVFVRVNUX2ZyZWUocmVxKTsKKwlPQ1NQX1JFU1BPTlNFX2ZyZWUocmVzcCk7CisJT0NTUF9CQVNJQ1JFU1BfZnJlZShicyk7CisJc2tfT1BFTlNTTF9TVFJJTkdfZnJlZShyZXFuYW1lcyk7CisJc2tfT0NTUF9DRVJUSURfZnJlZShpZHMpOworCXNrX1g1MDlfcG9wX2ZyZWUoc2lnbl9vdGhlciwgWDUwOV9mcmVlKTsKKwlza19YNTA5X3BvcF9mcmVlKHZlcmlmeV9vdGhlciwgWDUwOV9mcmVlKTsKKwlza19DT05GX1ZBTFVFX3BvcF9mcmVlKGhlYWRlcnMsIFg1MDlWM19jb25mX2ZyZWUpOworCisJaWYgKHVzZV9zc2wgIT0gLTEpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGhvc3QpOworCQlPUEVOU1NMX2ZyZWUocG9ydCk7CisJCU9QRU5TU0xfZnJlZShwYXRoKTsKKwkJfQorCisJT1BFTlNTTF9FWElUKHJldCk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX29jc3BfY2VydChPQ1NQX1JFUVVFU1QgKipyZXEsIFg1MDkgKmNlcnQsIGNvbnN0IEVWUF9NRCAqY2VydF9pZF9tZCxYNTA5ICppc3N1ZXIsCisJCQkJU1RBQ0tfT0YoT0NTUF9DRVJUSUQpICppZHMpCisJeworCU9DU1BfQ0VSVElEICppZDsKKwlpZighaXNzdWVyKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIk5vIGlzc3VlciBjZXJ0aWZpY2F0ZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmKCEqcmVxKSAqcmVxID0gT0NTUF9SRVFVRVNUX25ldygpOworCWlmKCEqcmVxKSBnb3RvIGVycjsKKwlpZCA9IE9DU1BfY2VydF90b19pZChjZXJ0X2lkX21kLCBjZXJ0LCBpc3N1ZXIpOworCWlmKCFpZCB8fCAhc2tfT0NTUF9DRVJUSURfcHVzaChpZHMsIGlkKSkgZ290byBlcnI7CisJaWYoIU9DU1BfcmVxdWVzdF9hZGQwX2lkKCpyZXEsIGlkKSkgZ290byBlcnI7CisJcmV0dXJuIDE7CisKKwllcnI6CisJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgQ3JlYXRpbmcgT0NTUCByZXF1ZXN0XG4iKTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgYWRkX29jc3Bfc2VyaWFsKE9DU1BfUkVRVUVTVCAqKnJlcSwgY2hhciAqc2VyaWFsLGNvbnN0IEVWUF9NRCAqY2VydF9pZF9tZCwgWDUwOSAqaXNzdWVyLAorCQkJCVNUQUNLX09GKE9DU1BfQ0VSVElEKSAqaWRzKQorCXsKKwlPQ1NQX0NFUlRJRCAqaWQ7CisJWDUwOV9OQU1FICppbmFtZTsKKwlBU04xX0JJVF9TVFJJTkcgKmlrZXk7CisJQVNOMV9JTlRFR0VSICpzbm87CisJaWYoIWlzc3VlcikKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJObyBpc3N1ZXIgY2VydGlmaWNhdGUgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZighKnJlcSkgKnJlcSA9IE9DU1BfUkVRVUVTVF9uZXcoKTsKKwlpZighKnJlcSkgZ290byBlcnI7CisJaW5hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoaXNzdWVyKTsKKwlpa2V5ID0gWDUwOV9nZXQwX3B1YmtleV9iaXRzdHIoaXNzdWVyKTsKKwlzbm8gPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIHNlcmlhbCk7CisJaWYoIXNubykKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBjb252ZXJ0aW5nIHNlcmlhbCBudW1iZXIgJXNcbiIsIHNlcmlhbCk7CisJCXJldHVybiAwOworCQl9CisJaWQgPSBPQ1NQX2NlcnRfaWRfbmV3KGNlcnRfaWRfbWQsIGluYW1lLCBpa2V5LCBzbm8pOworCUFTTjFfSU5URUdFUl9mcmVlKHNubyk7CisJaWYoIWlkIHx8ICFza19PQ1NQX0NFUlRJRF9wdXNoKGlkcywgaWQpKSBnb3RvIGVycjsKKwlpZighT0NTUF9yZXF1ZXN0X2FkZDBfaWQoKnJlcSwgaWQpKSBnb3RvIGVycjsKKwlyZXR1cm4gMTsKKworCWVycjoKKwlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBDcmVhdGluZyBPQ1NQIHJlcXVlc3RcbiIpOworCXJldHVybiAwOworCX0KKworc3RhdGljIGludCBwcmludF9vY3NwX3N1bW1hcnkoQklPICpvdXQsIE9DU1BfQkFTSUNSRVNQICpicywgT0NTUF9SRVFVRVNUICpyZXEsCisJCQkgICAgICBTVEFDS19PRihPUEVOU1NMX1NUUklORykgKm5hbWVzLAorCQkJICAgICAgU1RBQ0tfT0YoT0NTUF9DRVJUSUQpICppZHMsIGxvbmcgbnNlYywKKwkJCSAgICAgIGxvbmcgbWF4YWdlKQorCXsKKwlPQ1NQX0NFUlRJRCAqaWQ7CisJY2hhciAqbmFtZTsKKwlpbnQgaTsKKworCWludCBzdGF0dXMsIHJlYXNvbjsKKworCUFTTjFfR0VORVJBTElaRURUSU1FICpyZXYsICp0aGlzdXBkLCAqbmV4dHVwZDsKKworCWlmICghYnMgfHwgIXJlcSB8fCAhc2tfT1BFTlNTTF9TVFJJTkdfbnVtKG5hbWVzKSB8fCAhc2tfT0NTUF9DRVJUSURfbnVtKGlkcykpCisJCXJldHVybiAxOworCisJZm9yIChpID0gMDsgaSA8IHNrX09DU1BfQ0VSVElEX251bShpZHMpOyBpKyspCisJCXsKKwkJaWQgPSBza19PQ1NQX0NFUlRJRF92YWx1ZShpZHMsIGkpOworCQluYW1lID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUobmFtZXMsIGkpOworCQlCSU9fcHJpbnRmKG91dCwgIiVzOiAiLCBuYW1lKTsKKworCQlpZighT0NTUF9yZXNwX2ZpbmRfc3RhdHVzKGJzLCBpZCwgJnN0YXR1cywgJnJlYXNvbiwKKwkJCQkJJnJldiwgJnRoaXN1cGQsICZuZXh0dXBkKSkKKwkJCXsKKwkJCUJJT19wdXRzKG91dCwgIkVSUk9SOiBObyBTdGF0dXMgZm91bmQuXG4iKTsKKwkJCWNvbnRpbnVlOworCQkJfQorCisJCS8qIENoZWNrIHZhbGlkaXR5OiBpZiBpbnZhbGlkIHdyaXRlIHRvIG91dHB1dCBCSU8gc28gd2UKKwkJICoga25vdyB3aGljaCByZXNwb25zZSB0aGlzIHJlZmVycyB0by4KKwkJICovCisJCWlmICghT0NTUF9jaGVja192YWxpZGl0eSh0aGlzdXBkLCBuZXh0dXBkLCBuc2VjLCBtYXhhZ2UpKQorCQkJeworCQkJQklPX3B1dHMob3V0LCAiV0FSTklORzogU3RhdHVzIHRpbWVzIGludmFsaWQuXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMob3V0KTsKKwkJCX0KKwkJQklPX3ByaW50ZihvdXQsICIlc1xuIiwgT0NTUF9jZXJ0X3N0YXR1c19zdHIoc3RhdHVzKSk7CisKKwkJQklPX3B1dHMob3V0LCAiXHRUaGlzIFVwZGF0ZTogIik7CisJCUFTTjFfR0VORVJBTElaRURUSU1FX3ByaW50KG91dCwgdGhpc3VwZCk7CisJCUJJT19wdXRzKG91dCwgIlxuIik7CisKKwkJaWYobmV4dHVwZCkKKwkJCXsKKwkJCUJJT19wdXRzKG91dCwgIlx0TmV4dCBVcGRhdGU6ICIpOworCQkJQVNOMV9HRU5FUkFMSVpFRFRJTUVfcHJpbnQob3V0LCBuZXh0dXBkKTsKKwkJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCQl9CisKKwkJaWYgKHN0YXR1cyAhPSBWX09DU1BfQ0VSVFNUQVRVU19SRVZPS0VEKQorCQkJY29udGludWU7CisKKwkJaWYgKHJlYXNvbiAhPSAtMSkKKwkJCUJJT19wcmludGYob3V0LCAiXHRSZWFzb246ICVzXG4iLAorCQkJCU9DU1BfY3JsX3JlYXNvbl9zdHIocmVhc29uKSk7CisKKwkJQklPX3B1dHMob3V0LCAiXHRSZXZvY2F0aW9uIFRpbWU6ICIpOworCQlBU04xX0dFTkVSQUxJWkVEVElNRV9wcmludChvdXQsIHJldik7CisJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCX0KKworCXJldHVybiAxOworCX0KKworCitzdGF0aWMgaW50IG1ha2Vfb2NzcF9yZXNwb25zZShPQ1NQX1JFU1BPTlNFICoqcmVzcCwgT0NTUF9SRVFVRVNUICpyZXEsIENBX0RCICpkYiwKKwkJCVg1MDkgKmNhLCBYNTA5ICpyY2VydCwgRVZQX1BLRVkgKnJrZXksCisJCQlTVEFDS19PRihYNTA5KSAqcm90aGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJaW50IG5taW4sIGludCBuZGF5cykKKwl7CisJQVNOMV9USU1FICp0aGlzdXBkID0gTlVMTCwgKm5leHR1cGQgPSBOVUxMOworCU9DU1BfQ0VSVElEICpjaWQsICpjYV9pZCA9IE5VTEw7CisJT0NTUF9CQVNJQ1JFU1AgKmJzID0gTlVMTDsKKwlpbnQgaSwgaWRfY291bnQsIHJldCA9IDE7CisKKwlpZF9jb3VudCA9IE9DU1BfcmVxdWVzdF9vbmVyZXFfY291bnQocmVxKTsKKworCWlmIChpZF9jb3VudCA8PSAwKQorCQl7CisJCSpyZXNwID0gT0NTUF9yZXNwb25zZV9jcmVhdGUoT0NTUF9SRVNQT05TRV9TVEFUVVNfTUFMRk9STUVEUkVRVUVTVCwgTlVMTCk7CisJCWdvdG8gZW5kOworCQl9CisKKworCWJzID0gT0NTUF9CQVNJQ1JFU1BfbmV3KCk7CisJdGhpc3VwZCA9IFg1MDlfZ210aW1lX2FkaihOVUxMLCAwKTsKKwlpZiAobmRheXMgIT0gLTEpCisJCW5leHR1cGQgPSBYNTA5X2dtdGltZV9hZGooTlVMTCwgbm1pbiAqIDYwICsgbmRheXMgKiAzNjAwICogMjQgKTsKKworCS8qIEV4YW1pbmUgZWFjaCBjZXJ0aWZpY2F0ZSBpZCBpbiB0aGUgcmVxdWVzdCAqLworCWZvciAoaSA9IDA7IGkgPCBpZF9jb3VudDsgaSsrKQorCQl7CisJCU9DU1BfT05FUkVRICpvbmU7CisJCUFTTjFfSU5URUdFUiAqc2VyaWFsOworCQljaGFyICoqaW5mOworCQlBU04xX09CSkVDVCAqY2VydF9pZF9tZF9vaWQ7CisJCWNvbnN0IEVWUF9NRCAqY2VydF9pZF9tZDsKKwkJb25lID0gT0NTUF9yZXF1ZXN0X29uZXJlcV9nZXQwKHJlcSwgaSk7CisJCWNpZCA9IE9DU1Bfb25lcmVxX2dldDBfaWQob25lKTsKKworCQlPQ1NQX2lkX2dldDBfaW5mbyhOVUxMLCZjZXJ0X2lkX21kX29pZCwgTlVMTCxOVUxMLCBjaWQpOworCisJCWNlcnRfaWRfbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5b2JqKGNlcnRfaWRfbWRfb2lkKTsJCisJCWlmICghIGNlcnRfaWRfbWQpIAorCQkJeworCQkJKnJlc3AgPSBPQ1NQX3Jlc3BvbnNlX2NyZWF0ZShPQ1NQX1JFU1BPTlNFX1NUQVRVU19JTlRFUk5BTEVSUk9SLAorCQkJCU5VTEwpOworCQkJCWdvdG8gZW5kOworCQkJfQkKKwkJaWYgKGNhX2lkKSBPQ1NQX0NFUlRJRF9mcmVlKGNhX2lkKTsKKwkJY2FfaWQgPSBPQ1NQX2NlcnRfdG9faWQoY2VydF9pZF9tZCwgTlVMTCwgY2EpOworCisJCS8qIElzIHRoaXMgcmVxdWVzdCBhYm91dCBvdXIgQ0E/ICovCisJCWlmIChPQ1NQX2lkX2lzc3Vlcl9jbXAoY2FfaWQsIGNpZCkpCisJCQl7CisJCQlPQ1NQX2Jhc2ljX2FkZDFfc3RhdHVzKGJzLCBjaWQsCisJCQkJCQlWX09DU1BfQ0VSVFNUQVRVU19VTktOT1dOLAorCQkJCQkJMCwgTlVMTCwKKwkJCQkJCXRoaXN1cGQsIG5leHR1cGQpOworCQkJY29udGludWU7CisJCQl9CisJCU9DU1BfaWRfZ2V0MF9pbmZvKE5VTEwsIE5VTEwsIE5VTEwsICZzZXJpYWwsIGNpZCk7CisJCWluZiA9IGxvb2t1cF9zZXJpYWwoZGIsIHNlcmlhbCk7CisJCWlmICghaW5mKQorCQkJT0NTUF9iYXNpY19hZGQxX3N0YXR1cyhicywgY2lkLAorCQkJCQkJVl9PQ1NQX0NFUlRTVEFUVVNfVU5LTk9XTiwKKwkJCQkJCTAsIE5VTEwsCisJCQkJCQl0aGlzdXBkLCBuZXh0dXBkKTsKKwkJZWxzZSBpZiAoaW5mW0RCX3R5cGVdWzBdID09IERCX1RZUEVfVkFMKQorCQkJT0NTUF9iYXNpY19hZGQxX3N0YXR1cyhicywgY2lkLAorCQkJCQkJVl9PQ1NQX0NFUlRTVEFUVVNfR09PRCwKKwkJCQkJCTAsIE5VTEwsCisJCQkJCQl0aGlzdXBkLCBuZXh0dXBkKTsKKwkJZWxzZSBpZiAoaW5mW0RCX3R5cGVdWzBdID09IERCX1RZUEVfUkVWKQorCQkJeworCQkJQVNOMV9PQkpFQ1QgKmluc3QgPSBOVUxMOworCQkJQVNOMV9USU1FICpyZXZ0bSA9IE5VTEw7CisJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqaW52dG0gPSBOVUxMOworCQkJT0NTUF9TSU5HTEVSRVNQICpzaW5nbGU7CisJCQlpbnQgcmVhc29uID0gLTE7CisJCQl1bnBhY2tfcmV2aW5mbygmcmV2dG0sICZyZWFzb24sICZpbnN0LCAmaW52dG0sIGluZltEQl9yZXZfZGF0ZV0pOworCQkJc2luZ2xlID0gT0NTUF9iYXNpY19hZGQxX3N0YXR1cyhicywgY2lkLAorCQkJCQkJVl9PQ1NQX0NFUlRTVEFUVVNfUkVWT0tFRCwKKwkJCQkJCXJlYXNvbiwgcmV2dG0sCisJCQkJCQl0aGlzdXBkLCBuZXh0dXBkKTsKKwkJCWlmIChpbnZ0bSkKKwkJCQlPQ1NQX1NJTkdMRVJFU1BfYWRkMV9leHRfaTJkKHNpbmdsZSwgTklEX2ludmFsaWRpdHlfZGF0ZSwgaW52dG0sIDAsIDApOworCQkJZWxzZSBpZiAoaW5zdCkKKwkJCQlPQ1NQX1NJTkdMRVJFU1BfYWRkMV9leHRfaTJkKHNpbmdsZSwgTklEX2hvbGRfaW5zdHJ1Y3Rpb25fY29kZSwgaW5zdCwgMCwgMCk7CisJCQlBU04xX09CSkVDVF9mcmVlKGluc3QpOworCQkJQVNOMV9USU1FX2ZyZWUocmV2dG0pOworCQkJQVNOMV9HRU5FUkFMSVpFRFRJTUVfZnJlZShpbnZ0bSk7CisJCQl9CisJCX0KKworCU9DU1BfY29weV9ub25jZShicywgcmVxKTsKKwkKKwlPQ1NQX2Jhc2ljX3NpZ24oYnMsIHJjZXJ0LCBya2V5LCBOVUxMLCByb3RoZXIsIGZsYWdzKTsKKworCSpyZXNwID0gT0NTUF9yZXNwb25zZV9jcmVhdGUoT0NTUF9SRVNQT05TRV9TVEFUVVNfU1VDQ0VTU0ZVTCwgYnMpOworCisJZW5kOgorCUFTTjFfVElNRV9mcmVlKHRoaXN1cGQpOworCUFTTjFfVElNRV9mcmVlKG5leHR1cGQpOworCU9DU1BfQ0VSVElEX2ZyZWUoY2FfaWQpOworCU9DU1BfQkFTSUNSRVNQX2ZyZWUoYnMpOworCXJldHVybiByZXQ7CisKKwl9CisKK3N0YXRpYyBjaGFyICoqbG9va3VwX3NlcmlhbChDQV9EQiAqZGIsIEFTTjFfSU5URUdFUiAqc2VyKQorCXsKKwlpbnQgaTsKKwlCSUdOVU0gKmJuID0gTlVMTDsKKwljaGFyICppdG1wLCAqcm93W0RCX05VTUJFUl0sKipycm93OworCWZvciAoaSA9IDA7IGkgPCBEQl9OVU1CRVI7IGkrKykgcm93W2ldID0gTlVMTDsKKwlibiA9IEFTTjFfSU5URUdFUl90b19CTihzZXIsTlVMTCk7CisJT1BFTlNTTF9hc3NlcnQoYm4pOyAvKiBGSVhNRTogc2hvdWxkIHJlcG9ydCBhbiBlcnJvciBhdCB0aGlzIHBvaW50IGFuZCBhYm9ydCAqLworCWlmIChCTl9pc196ZXJvKGJuKSkKKwkJaXRtcCA9IEJVRl9zdHJkdXAoIjAwIik7CisJZWxzZQorCQlpdG1wID0gQk5fYm4yaGV4KGJuKTsKKwlyb3dbREJfc2VyaWFsXSA9IGl0bXA7CisJQk5fZnJlZShibik7CisJcnJvdz1UWFRfREJfZ2V0X2J5X2luZGV4KGRiLT5kYixEQl9zZXJpYWwscm93KTsKKwlPUEVOU1NMX2ZyZWUoaXRtcCk7CisJcmV0dXJuIHJyb3c7CisJfQorCisvKiBRdWljayBhbmQgZGlydHkgT0NTUCBzZXJ2ZXI6IHJlYWQgaW4gYW5kIHBhcnNlIGlucHV0IHJlcXVlc3QgKi8KKworc3RhdGljIEJJTyAqaW5pdF9yZXNwb25kZXIoY2hhciAqcG9ydCkKKwl7CisJQklPICphY2JpbyA9IE5VTEwsICpidWZiaW8gPSBOVUxMOworCWJ1ZmJpbyA9IEJJT19uZXcoQklPX2ZfYnVmZmVyKCkpOworCWlmICghYnVmYmlvKSAKKwkJZ290byBlcnI7CisjaWZuZGVmIE9QRU5TU0xfTk9fU09DSworCWFjYmlvID0gQklPX25ld19hY2NlcHQocG9ydCk7CisjZWxzZQorCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHNldHRpbmcgdXAgYWNjZXB0IEJJTyAtIHNvY2tldHMgbm90IHN1cHBvcnRlZC5cbiIpOworI2VuZGlmCisJaWYgKCFhY2JpbykKKwkJZ290byBlcnI7CisJQklPX3NldF9hY2NlcHRfYmlvcyhhY2JpbywgYnVmYmlvKTsKKwlidWZiaW8gPSBOVUxMOworCisJaWYgKEJJT19kb19hY2NlcHQoYWNiaW8pIDw9IDApCisJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHNldHRpbmcgdXAgYWNjZXB0IEJJT1xuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlcnI7CisJCX0KKworCXJldHVybiBhY2JpbzsKKworCWVycjoKKwlCSU9fZnJlZV9hbGwoYWNiaW8pOworCUJJT19mcmVlKGJ1ZmJpbyk7CisJcmV0dXJuIE5VTEw7CisJfQorCitzdGF0aWMgaW50IGRvX3Jlc3BvbmRlcihPQ1NQX1JFUVVFU1QgKipwcmVxLCBCSU8gKipwY2JpbywgQklPICphY2JpbywgY2hhciAqcG9ydCkKKwl7CisJaW50IGhhdmVfcG9zdCA9IDAsIGxlbjsKKwlPQ1NQX1JFUVVFU1QgKnJlcSA9IE5VTEw7CisJY2hhciBpbmJ1ZlsxMDI0XTsKKwlCSU8gKmNiaW8gPSBOVUxMOworCisJaWYgKEJJT19kb19hY2NlcHQoYWNiaW8pIDw9IDApCisJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGFjY2VwdGluZyBjb25uZWN0aW9uXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJY2JpbyA9IEJJT19wb3AoYWNiaW8pOworCSpwY2JpbyA9IGNiaW87CisKKwlmb3IoOzspCisJCXsKKwkJbGVuID0gQklPX2dldHMoY2JpbywgaW5idWYsIHNpemVvZiBpbmJ1Zik7CisJCWlmIChsZW4gPD0gMCkKKwkJCXJldHVybiAxOworCQkvKiBMb29rIGZvciAiUE9TVCIgc2lnbmFsbGluZyBzdGFydCBvZiBxdWVyeSAqLworCQlpZiAoIWhhdmVfcG9zdCkKKwkJCXsKKwkJCWlmKHN0cm5jbXAoaW5idWYsICJQT1NUIiwgNCkpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkludmFsaWQgcmVxdWVzdFxuIik7CisJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJaGF2ZV9wb3N0ID0gMTsKKwkJCX0KKwkJLyogTG9vayBmb3IgZW5kIG9mIGhlYWRlcnMgKi8KKwkJaWYgKChpbmJ1ZlswXSA9PSAnXHInKSB8fCAoaW5idWZbMF0gPT0gJ1xuJykpCisJCQlicmVhazsKKwkJfQorCisJLyogVHJ5IHRvIHJlYWQgT0NTUCByZXF1ZXN0ICovCisKKwlyZXEgPSBkMmlfT0NTUF9SRVFVRVNUX2JpbyhjYmlvLCBOVUxMKTsKKworCWlmICghcmVxKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHBhcnNpbmcgT0NTUCByZXF1ZXN0XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJfQorCisJKnByZXEgPSByZXE7CisKKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIGludCBzZW5kX29jc3BfcmVzcG9uc2UoQklPICpjYmlvLCBPQ1NQX1JFU1BPTlNFICpyZXNwKQorCXsKKwljaGFyIGh0dHBfcmVzcFtdID0gCisJCSJIVFRQLzEuMCAyMDAgT0tcclxuQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi9vY3NwLXJlc3BvbnNlXHJcbiIKKwkJIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG5cclxuIjsKKwlpZiAoIWNiaW8pCisJCXJldHVybiAwOworCUJJT19wcmludGYoY2JpbywgaHR0cF9yZXNwLCBpMmRfT0NTUF9SRVNQT05TRShyZXNwLCBOVUxMKSk7CisJaTJkX09DU1BfUkVTUE9OU0VfYmlvKGNiaW8sIHJlc3ApOworCSh2b2lkKUJJT19mbHVzaChjYmlvKTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBPQ1NQX1JFU1BPTlNFICpxdWVyeV9yZXNwb25kZXIoQklPICplcnIsIEJJTyAqY2JpbywgY2hhciAqcGF0aCwKKwkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqaGVhZGVycywKKwkJCQlPQ1NQX1JFUVVFU1QgKnJlcSwgaW50IHJlcV90aW1lb3V0KQorCXsKKwlpbnQgZmQ7CisJaW50IHJ2OworCWludCBpOworCU9DU1BfUkVRX0NUWCAqY3R4ID0gTlVMTDsKKwlPQ1NQX1JFU1BPTlNFICpyc3AgPSBOVUxMOworCWZkX3NldCBjb25mZHM7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlpZiAocmVxX3RpbWVvdXQgIT0gLTEpCisJCUJJT19zZXRfbmJpbyhjYmlvLCAxKTsKKworCXJ2ID0gQklPX2RvX2Nvbm5lY3QoY2Jpbyk7CisKKwlpZiAoKHJ2IDw9IDApICYmICgocmVxX3RpbWVvdXQgPT0gLTEpIHx8ICFCSU9fc2hvdWxkX3JldHJ5KGNiaW8pKSkKKwkJeworCQlCSU9fcHV0cyhlcnIsICJFcnJvciBjb25uZWN0aW5nIEJJT1xuIik7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAoQklPX2dldF9mZChjYmlvLCAmZmQpIDw9IDApCisJCXsKKwkJQklPX3B1dHMoZXJyLCAiQ2FuJ3QgZ2V0IGNvbm5lY3Rpb24gZmRcbiIpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHJlcV90aW1lb3V0ICE9IC0xICYmIHJ2IDw9IDApCisJCXsKKwkJRkRfWkVSTygmY29uZmRzKTsKKwkJb3BlbnNzbF9mZHNldChmZCwgJmNvbmZkcyk7CisJCXR2LnR2X3VzZWMgPSAwOworCQl0di50dl9zZWMgPSByZXFfdGltZW91dDsKKwkJcnYgPSBzZWxlY3QoZmQgKyAxLCBOVUxMLCAodm9pZCAqKSZjb25mZHMsIE5VTEwsICZ0dik7CisJCWlmIChydiA9PSAwKQorCQkJeworCQkJQklPX3B1dHMoZXJyLCAiVGltZW91dCBvbiBjb25uZWN0XG4iKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKworCWN0eCA9IE9DU1Bfc2VuZHJlcV9uZXcoY2JpbywgcGF0aCwgTlVMTCwgLTEpOworCWlmICghY3R4KQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShoZWFkZXJzKTsgaSsrKQorCQl7CisJCUNPTkZfVkFMVUUgKmhkciA9IHNrX0NPTkZfVkFMVUVfdmFsdWUoaGVhZGVycywgaSk7CisJCWlmICghT0NTUF9SRVFfQ1RYX2FkZDFfaGVhZGVyKGN0eCwgaGRyLT5uYW1lLCBoZHItPnZhbHVlKSkKKwkJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoIU9DU1BfUkVRX0NUWF9zZXQxX3JlcShjdHgsIHJlcSkpCisJCWdvdG8gZXJyOworCQorCWZvciAoOzspCisJCXsKKwkJcnYgPSBPQ1NQX3NlbmRyZXFfbmJpbygmcnNwLCBjdHgpOworCQlpZiAocnYgIT0gLTEpCisJCQlicmVhazsKKwkJaWYgKHJlcV90aW1lb3V0ID09IC0xKQorCQkJY29udGludWU7CisJCUZEX1pFUk8oJmNvbmZkcyk7CisJCW9wZW5zc2xfZmRzZXQoZmQsICZjb25mZHMpOworCQl0di50dl91c2VjID0gMDsKKwkJdHYudHZfc2VjID0gcmVxX3RpbWVvdXQ7CisJCWlmIChCSU9fc2hvdWxkX3JlYWQoY2JpbykpCisJCQlydiA9IHNlbGVjdChmZCArIDEsICh2b2lkICopJmNvbmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKwkJZWxzZSBpZiAoQklPX3Nob3VsZF93cml0ZShjYmlvKSkKKwkJCXJ2ID0gc2VsZWN0KGZkICsgMSwgTlVMTCwgKHZvaWQgKikmY29uZmRzLCBOVUxMLCAmdHYpOworCQllbHNlCisJCQl7CisJCQlCSU9fcHV0cyhlcnIsICJVbmV4cGVjdGVkIHJldHJ5IGNvbmRpdGlvblxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKHJ2ID09IDApCisJCQl7CisJCQlCSU9fcHV0cyhlcnIsICJUaW1lb3V0IG9uIHJlcXVlc3RcbiIpOworCQkJYnJlYWs7CisJCQl9CisJCWlmIChydiA9PSAtMSkKKwkJCXsKKwkJCUJJT19wdXRzKGVyciwgIlNlbGVjdCBlcnJvclxuIik7CisJCQlicmVhazsKKwkJCX0KKworCQl9CisJZXJyOgorCWlmIChjdHgpCisJCU9DU1BfUkVRX0NUWF9mcmVlKGN0eCk7CisKKwlyZXR1cm4gcnNwOworCX0KKworT0NTUF9SRVNQT05TRSAqcHJvY2Vzc19yZXNwb25kZXIoQklPICplcnIsIE9DU1BfUkVRVUVTVCAqcmVxLAorCQkJY2hhciAqaG9zdCwgY2hhciAqcGF0aCwgY2hhciAqcG9ydCwgaW50IHVzZV9zc2wsCisJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqaGVhZGVycywKKwkJCWludCByZXFfdGltZW91dCkKKwl7CisJQklPICpjYmlvID0gTlVMTDsKKwlTU0xfQ1RYICpjdHggPSBOVUxMOworCU9DU1BfUkVTUE9OU0UgKnJlc3AgPSBOVUxMOworCWNiaW8gPSBCSU9fbmV3X2Nvbm5lY3QoaG9zdCk7CisJaWYgKCFjYmlvKQorCQl7CisJCUJJT19wcmludGYoZXJyLCAiRXJyb3IgY3JlYXRpbmcgY29ubmVjdCBCSU9cbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmIChwb3J0KSBCSU9fc2V0X2Nvbm5fcG9ydChjYmlvLCBwb3J0KTsKKwlpZiAodXNlX3NzbCA9PSAxKQorCQl7CisJCUJJTyAqc2JpbzsKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykKKwkJY3R4ID0gU1NMX0NUWF9uZXcoU1NMdjIzX2NsaWVudF9tZXRob2QoKSk7CisjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDMpCisJCWN0eCA9IFNTTF9DVFhfbmV3KFNTTHYzX2NsaWVudF9tZXRob2QoKSk7CisjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpCisJCWN0eCA9IFNTTF9DVFhfbmV3KFNTTHYyX2NsaWVudF9tZXRob2QoKSk7CisjZWxzZQorCQlCSU9fcHJpbnRmKGVyciwgIlNTTCBpcyBkaXNhYmxlZFxuIik7CisJCQlnb3RvIGVuZDsKKyNlbmRpZgorCQlpZiAoY3R4ID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGVyciwgIkVycm9yIGNyZWF0aW5nIFNTTCBjb250ZXh0LlxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJU1NMX0NUWF9zZXRfbW9kZShjdHgsIFNTTF9NT0RFX0FVVE9fUkVUUlkpOworCQlzYmlvID0gQklPX25ld19zc2woY3R4LCAxKTsKKwkJY2JpbyA9IEJJT19wdXNoKHNiaW8sIGNiaW8pOworCQl9CisJcmVzcCA9IHF1ZXJ5X3Jlc3BvbmRlcihlcnIsIGNiaW8sIHBhdGgsIGhlYWRlcnMsIHJlcSwgcmVxX3RpbWVvdXQpOworCWlmICghcmVzcCkKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgcXVlcnlpbmcgT0NTUCByZXNwb25zZGVyXG4iKTsKKwllbmQ6CisJaWYgKGNiaW8pCisJCUJJT19mcmVlX2FsbChjYmlvKTsKKwlpZiAoY3R4KQorCQlTU0xfQ1RYX2ZyZWUoY3R4KTsKKwlyZXR1cm4gcmVzcDsKKwl9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9vaWQuY25mIGIvbGliL29wZW5zc2wvYXBwcy9vaWQuY25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZjQyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL29pZC5jbmYKQEAgLTAsMCArMSw2IEBACisyLjk5OTk5LjEgICAgICAgU0VULmV4MSAgICAgICAgIFNFVCB4NTA5djMgZXh0ZW5zaW9uIDEKKzIuOTk5OTkuMiAgICAgICBTRVQuZXgyICAgICAgICAgU0VUIHg1MDl2MyBleHRlbnNpb24gMgorMi45OTk5OS4zICAgICAgIFNFVC5leDMgICAgICAgICBTRVQgeDUwOXYzIGV4dGVuc2lvbiAzCisyLjk5OTk5LjQgICAgICAgU0VULmV4NCAgICAgICAgIFNFVCB4NTA5djMgZXh0ZW5zaW9uIDQKKzIuOTk5OTkuNSAgICAgICBTRVQuZXg1ICAgICAgICAgU0VUIHg1MDl2MyBleHRlbnNpb24gNQorMi45OTk5OS42ICAgICAgIFNFVC5leDYgICAgICAgICBTRVQgeDUwOXYzIGV4dGVuc2lvbiA2CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL29wZW5zc2wtdm1zLmNuZiBiL2xpYi9vcGVuc3NsL2FwcHMvb3BlbnNzbC12bXMuY25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZWQ2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL29wZW5zc2wtdm1zLmNuZgpAQCAtMCwwICsxLDM1MCBAQAorIworIyBPcGVuU1NMIGV4YW1wbGUgY29uZmlndXJhdGlvbiBmaWxlLgorIyBUaGlzIGlzIG1vc3RseSBiZWluZyB1c2VkIGZvciBnZW5lcmF0aW9uIG9mIGNlcnRpZmljYXRlIHJlcXVlc3RzLgorIworCisjIFRoaXMgZGVmaW5pdGlvbiBzdG9wcyB0aGUgZm9sbG93aW5nIGxpbmVzIGNob2tpbmcgaWYgSE9NRSBpc24ndAorIyBkZWZpbmVkLgorSE9NRQkJCT0gLgorUkFOREZJTEUJCT0gJEVOVjo6SE9NRS8ucm5kCisKKyMgRXh0cmEgT0JKRUNUIElERU5USUZJRVIgaW5mbzoKKyNvaWRfZmlsZQkJPSAkRU5WOjpIT01FLy5vaWQKK29pZF9zZWN0aW9uCQk9IG5ld19vaWRzCisKKyMgVG8gdXNlIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIHdpdGggdGhlICItZXh0ZmlsZSIgb3B0aW9uIG9mIHRoZQorIyAib3BlbnNzbCB4NTA5IiB1dGlsaXR5LCBuYW1lIGhlcmUgdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUKKyMgWC41MDl2MyBleHRlbnNpb25zIHRvIHVzZToKKyMgZXh0ZW5zaW9ucwkJPSAKKyMgKEFsdGVybmF0aXZlbHksIHVzZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IGhhcyBvbmx5CisjIFguNTA5djMgZXh0ZW5zaW9ucyBpbiBpdHMgbWFpbiBbPSBkZWZhdWx0XSBzZWN0aW9uLikKKworWyBuZXdfb2lkcyBdCisKKyMgV2UgY2FuIGFkZCBuZXcgT0lEcyBpbiBoZXJlIGZvciB1c2UgYnkgJ2NhJywgJ3JlcScgYW5kICd0cycuCisjIEFkZCBhIHNpbXBsZSBPSUQgbGlrZSB0aGlzOgorIyB0ZXN0b2lkMT0xLjIuMy40CisjIE9yIHVzZSBjb25maWcgZmlsZSBzdWJzdGl0dXRpb24gbGlrZSB0aGlzOgorIyB0ZXN0b2lkMj0ke3Rlc3RvaWQxfS41LjYKKworIyBQb2xpY2llcyB1c2VkIGJ5IHRoZSBUU0EgZXhhbXBsZXMuCit0c2FfcG9saWN5MSA9IDEuMi4zLjQuMQordHNhX3BvbGljeTIgPSAxLjIuMy40LjUuNgordHNhX3BvbGljeTMgPSAxLjIuMy40LjUuNworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworWyBjYSBdCitkZWZhdWx0X2NhCT0gQ0FfZGVmYXVsdAkJIyBUaGUgZGVmYXVsdCBjYSBzZWN0aW9uCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitbIENBX2RlZmF1bHQgXQorCitkaXIJCT0gc3lzXCRkaXNrOlsuZGVtb0NBCQkjIFdoZXJlIGV2ZXJ5dGhpbmcgaXMga2VwdAorY2VydHMJCT0gJGRpci5jZXJ0c10JCSMgV2hlcmUgdGhlIGlzc3VlZCBjZXJ0cyBhcmUga2VwdAorY3JsX2RpcgkJPSAkZGlyLmNybF0JCSMgV2hlcmUgdGhlIGlzc3VlZCBjcmwgYXJlIGtlcHQKK2RhdGFiYXNlCT0gJGRpcl1pbmRleC50eHQJIyBkYXRhYmFzZSBpbmRleCBmaWxlLgorI3VuaXF1ZV9zdWJqZWN0CT0gbm8JCQkjIFNldCB0byAnbm8nIHRvIGFsbG93IGNyZWF0aW9uIG9mCisJCQkJCSMgc2V2ZXJhbCBjdGlmaWNhdGVzIHdpdGggc2FtZSBzdWJqZWN0LgorbmV3X2NlcnRzX2Rpcgk9ICRkaXIubmV3Y2VydHNdCQkjIGRlZmF1bHQgcGxhY2UgZm9yIG5ldyBjZXJ0cy4KKworY2VydGlmaWNhdGUJPSAkZGlyXWNhY2VydC5wZW0gCSMgVGhlIENBIGNlcnRpZmljYXRlCitzZXJpYWwJCT0gJGRpcl1zZXJpYWwuIAkJIyBUaGUgY3VycmVudCBzZXJpYWwgbnVtYmVyCitjcmxudW1iZXIJPSAkZGlyXWNybG51bWJlci4JIyB0aGUgY3VycmVudCBjcmwgbnVtYmVyCisJCQkJCSMgbXVzdCBiZSBjb21tZW50ZWQgb3V0IHRvIGxlYXZlIGEgVjEgQ1JMCitjcmwJCT0gJGRpcl1jcmwucGVtIAkJIyBUaGUgY3VycmVudCBDUkwKK3ByaXZhdGVfa2V5CT0gJGRpci5wcml2YXRlXWNha2V5LnBlbSMgVGhlIHByaXZhdGUga2V5CitSQU5ERklMRQk9ICRkaXIucHJpdmF0ZV0ucmFuZAkjIHByaXZhdGUgcmFuZG9tIG51bWJlciBmaWxlCisKK3g1MDlfZXh0ZW5zaW9ucwk9IHVzcl9jZXJ0CQkjIFRoZSBleHRlbnRpb25zIHRvIGFkZCB0byB0aGUgY2VydAorCisjIENvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGZvciB0aGUgInRyYWRpdGlvbmFsIgorIyAoYW5kIGhpZ2hseSBicm9rZW4pIGZvcm1hdC4KK25hbWVfb3B0IAk9IGNhX2RlZmF1bHQJCSMgU3ViamVjdCBOYW1lIG9wdGlvbnMKK2NlcnRfb3B0IAk9IGNhX2RlZmF1bHQJCSMgQ2VydGlmaWNhdGUgZmllbGQgb3B0aW9ucworCisjIEV4dGVuc2lvbiBjb3B5aW5nIG9wdGlvbjogdXNlIHdpdGggY2F1dGlvbi4KKyMgY29weV9leHRlbnNpb25zID0gY29weQorCisjIEV4dGVuc2lvbnMgdG8gYWRkIHRvIGEgQ1JMLiBOb3RlOiBOZXRzY2FwZSBjb21tdW5pY2F0b3IgY2hva2VzIG9uIFYyIENSTHMKKyMgc28gdGhpcyBpcyBjb21tZW50ZWQgb3V0IGJ5IGRlZmF1bHQgdG8gbGVhdmUgYSBWMSBDUkwuCisjIGNybG51bWJlciBtdXN0IGFsc28gYmUgY29tbWVudGVkIG91dCB0byBsZWF2ZSBhIFYxIENSTC4KKyMgY3JsX2V4dGVuc2lvbnMJPSBjcmxfZXh0CisKK2RlZmF1bHRfZGF5cwk9IDM2NQkJCSMgaG93IGxvbmcgdG8gY2VydGlmeSBmb3IKK2RlZmF1bHRfY3JsX2RheXM9IDMwCQkJIyBob3cgbG9uZyBiZWZvcmUgbmV4dCBDUkwKK2RlZmF1bHRfbWQJPSBkZWZhdWx0CQkjIHVzZSBwdWJsaWMga2V5IGRlZmF1bHQgTUQKK3ByZXNlcnZlCT0gbm8JCQkjIGtlZXAgcGFzc2VkIEROIG9yZGVyaW5nCisKKyMgQSBmZXcgZGlmZmVyZW5jZSB3YXkgb2Ygc3BlY2lmeWluZyBob3cgc2ltaWxhciB0aGUgcmVxdWVzdCBzaG91bGQgbG9vaworIyBGb3IgdHlwZSBDQSwgdGhlIGxpc3RlZCBhdHRyaWJ1dGVzIG11c3QgYmUgdGhlIHNhbWUsIGFuZCB0aGUgb3B0aW9uYWwKKyMgYW5kIHN1cHBsaWVkIGZpZWxkcyBhcmUganVzdCB0aGF0IDotKQorcG9saWN5CQk9IHBvbGljeV9tYXRjaAorCisjIEZvciB0aGUgQ0EgcG9saWN5CitbIHBvbGljeV9tYXRjaCBdCitjb3VudHJ5TmFtZQkJPSBtYXRjaAorc3RhdGVPclByb3ZpbmNlTmFtZQk9IG1hdGNoCitvcmdhbml6YXRpb25OYW1lCT0gbWF0Y2gKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJPSBvcHRpb25hbAorY29tbW9uTmFtZQkJPSBzdXBwbGllZAorZW1haWxBZGRyZXNzCQk9IG9wdGlvbmFsCisKKyMgRm9yIHRoZSAnYW55dGhpbmcnIHBvbGljeQorIyBBdCB0aGlzIHBvaW50IGluIHRpbWUsIHlvdSBtdXN0IGxpc3QgYWxsIGFjY2VwdGFibGUgJ29iamVjdCcKKyMgdHlwZXMuCitbIHBvbGljeV9hbnl0aGluZyBdCitjb3VudHJ5TmFtZQkJPSBvcHRpb25hbAorc3RhdGVPclByb3ZpbmNlTmFtZQk9IG9wdGlvbmFsCitsb2NhbGl0eU5hbWUJCT0gb3B0aW9uYWwKK29yZ2FuaXphdGlvbk5hbWUJPSBvcHRpb25hbAorb3JnYW5pemF0aW9uYWxVbml0TmFtZQk9IG9wdGlvbmFsCitjb21tb25OYW1lCQk9IHN1cHBsaWVkCitlbWFpbEFkZHJlc3MJCT0gb3B0aW9uYWwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1sgcmVxIF0KK2RlZmF1bHRfYml0cwkJPSAxMDI0CitkZWZhdWx0X2tleWZpbGUgCT0gcHJpdmtleS5wZW0KK2Rpc3Rpbmd1aXNoZWRfbmFtZQk9IHJlcV9kaXN0aW5ndWlzaGVkX25hbWUKK2F0dHJpYnV0ZXMJCT0gcmVxX2F0dHJpYnV0ZXMKK3g1MDlfZXh0ZW5zaW9ucwk9IHYzX2NhCSMgVGhlIGV4dGVudGlvbnMgdG8gYWRkIHRvIHRoZSBzZWxmIHNpZ25lZCBjZXJ0CisKKyMgUGFzc3dvcmRzIGZvciBwcml2YXRlIGtleXMgaWYgbm90IHByZXNlbnQgdGhleSB3aWxsIGJlIHByb21wdGVkIGZvcgorIyBpbnB1dF9wYXNzd29yZCA9IHNlY3JldAorIyBvdXRwdXRfcGFzc3dvcmQgPSBzZWNyZXQKKworIyBUaGlzIHNldHMgYSBtYXNrIGZvciBwZXJtaXR0ZWQgc3RyaW5nIHR5cGVzLiBUaGVyZSBhcmUgc2V2ZXJhbCBvcHRpb25zLiAKKyMgZGVmYXVsdDogUHJpbnRhYmxlU3RyaW5nLCBUNjFTdHJpbmcsIEJNUFN0cmluZy4KKyMgcGtpeAkgOiBQcmludGFibGVTdHJpbmcsIEJNUFN0cmluZyAoUEtJWCByZWNvbW1lbmRhdGlvbiBiZWZvcmUgMjAwNCkKKyMgdXRmOG9ubHk6IG9ubHkgVVRGOFN0cmluZ3MgKFBLSVggcmVjb21tZW5kYXRpb24gYWZ0ZXIgMjAwNCkuCisjIG5vbWJzdHIgOiBQcmludGFibGVTdHJpbmcsIFQ2MVN0cmluZyAobm8gQk1QU3RyaW5ncyBvciBVVEY4U3RyaW5ncykuCisjIE1BU0s6WFhYWCBhIGxpdGVyYWwgbWFzayB2YWx1ZS4KKyMgV0FSTklORzogYW5jaWVudCB2ZXJzaW9ucyBvZiBOZXRzY2FwZSBjcmFzaCBvbiBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzLgorc3RyaW5nX21hc2sgPSB1dGY4b25seQorCisjIHJlcV9leHRlbnNpb25zID0gdjNfcmVxICMgVGhlIGV4dGVuc2lvbnMgdG8gYWRkIHRvIGEgY2VydGlmaWNhdGUgcmVxdWVzdAorCitbIHJlcV9kaXN0aW5ndWlzaGVkX25hbWUgXQorY291bnRyeU5hbWUJCQk9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkKK2NvdW50cnlOYW1lX2RlZmF1bHQJCT0gQVUKK2NvdW50cnlOYW1lX21pbgkJCT0gMgorY291bnRyeU5hbWVfbWF4CQkJPSAyCisKK3N0YXRlT3JQcm92aW5jZU5hbWUJCT0gU3RhdGUgb3IgUHJvdmluY2UgTmFtZSAoZnVsbCBuYW1lKQorc3RhdGVPclByb3ZpbmNlTmFtZV9kZWZhdWx0CT0gU29tZS1TdGF0ZQorCitsb2NhbGl0eU5hbWUJCQk9IExvY2FsaXR5IE5hbWUgKGVnLCBjaXR5KQorCiswLm9yZ2FuaXphdGlvbk5hbWUJCT0gT3JnYW5pemF0aW9uIE5hbWUgKGVnLCBjb21wYW55KQorMC5vcmdhbml6YXRpb25OYW1lX2RlZmF1bHQJPSBJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQKKworIyB3ZSBjYW4gZG8gdGhpcyBidXQgaXQgaXMgbm90IG5lZWRlZCBub3JtYWxseSA6LSkKKyMxLm9yZ2FuaXphdGlvbk5hbWUJCT0gU2Vjb25kIE9yZ2FuaXphdGlvbiBOYW1lIChlZywgY29tcGFueSkKKyMxLm9yZ2FuaXphdGlvbk5hbWVfZGVmYXVsdAk9IFdvcmxkIFdpZGUgV2ViIFB0eSBMdGQKKworb3JnYW5pemF0aW9uYWxVbml0TmFtZQkJPSBPcmdhbml6YXRpb25hbCBVbml0IE5hbWUgKGVnLCBzZWN0aW9uKQorI29yZ2FuaXphdGlvbmFsVW5pdE5hbWVfZGVmYXVsdAk9CisKK2NvbW1vbk5hbWUJCQk9IENvbW1vbiBOYW1lIChlZywgWU9VUiBuYW1lKQorY29tbW9uTmFtZV9tYXgJCQk9IDY0CisKK2VtYWlsQWRkcmVzcwkJCT0gRW1haWwgQWRkcmVzcworZW1haWxBZGRyZXNzX21heAkJPSA2NAorCisjIFNFVC1leDMJCQk9IFNFVCBleHRlbnNpb24gbnVtYmVyIDMKKworWyByZXFfYXR0cmlidXRlcyBdCitjaGFsbGVuZ2VQYXNzd29yZAkJPSBBIGNoYWxsZW5nZSBwYXNzd29yZAorY2hhbGxlbmdlUGFzc3dvcmRfbWluCQk9IDQKK2NoYWxsZW5nZVBhc3N3b3JkX21heAkJPSAyMAorCit1bnN0cnVjdHVyZWROYW1lCQk9IEFuIG9wdGlvbmFsIGNvbXBhbnkgbmFtZQorCitbIHVzcl9jZXJ0IF0KKworIyBUaGVzZSBleHRlbnNpb25zIGFyZSBhZGRlZCB3aGVuICdjYScgc2lnbnMgYSByZXF1ZXN0LgorCisjIFRoaXMgZ29lcyBhZ2FpbnN0IFBLSVggZ3VpZGVsaW5lcyBidXQgc29tZSBDQXMgZG8gaXQgYW5kIHNvbWUgc29mdHdhcmUKKyMgcmVxdWlyZXMgdGhpcyB0byBhdm9pZCBpbnRlcnByZXRpbmcgYW4gZW5kIHVzZXIgY2VydGlmaWNhdGUgYXMgYSBDQS4KKworYmFzaWNDb25zdHJhaW50cz1DQTpGQUxTRQorCisjIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdGhlIHVzYWdlIG9mIG5zQ2VydFR5cGUuIElmIGl0IGlzIG9taXR0ZWQKKyMgdGhlIGNlcnRpZmljYXRlIGNhbiBiZSB1c2VkIGZvciBhbnl0aGluZyAqZXhjZXB0KiBvYmplY3Qgc2lnbmluZy4KKworIyBUaGlzIGlzIE9LIGZvciBhbiBTU0wgc2VydmVyLgorIyBuc0NlcnRUeXBlCQkJPSBzZXJ2ZXIKKworIyBGb3IgYW4gb2JqZWN0IHNpZ25pbmcgY2VydGlmaWNhdGUgdGhpcyB3b3VsZCBiZSB1c2VkLgorIyBuc0NlcnRUeXBlID0gb2Jqc2lnbgorCisjIEZvciBub3JtYWwgY2xpZW50IHVzZSB0aGlzIGlzIHR5cGljYWwKKyMgbnNDZXJ0VHlwZSA9IGNsaWVudCwgZW1haWwKKworIyBhbmQgZm9yIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIG9iamVjdCBzaWduaW5nOgorIyBuc0NlcnRUeXBlID0gY2xpZW50LCBlbWFpbCwgb2Jqc2lnbgorCisjIFRoaXMgaXMgdHlwaWNhbCBpbiBrZXlVc2FnZSBmb3IgYSBjbGllbnQgY2VydGlmaWNhdGUuCisjIGtleVVzYWdlID0gbm9uUmVwdWRpYXRpb24sIGRpZ2l0YWxTaWduYXR1cmUsIGtleUVuY2lwaGVybWVudAorCisjIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gTmV0c2NhcGUncyBjb21tZW50IGxpc3Rib3guCituc0NvbW1lbnQJCQk9ICJPcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZSIKKworIyBQS0lYIHJlY29tbWVuZGF0aW9ucyBoYXJtbGVzcyBpZiBpbmNsdWRlZCBpbiBhbGwgY2VydGlmaWNhdGVzLgorc3ViamVjdEtleUlkZW50aWZpZXI9aGFzaAorYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZCxpc3N1ZXIKKworIyBUaGlzIHN0dWZmIGlzIGZvciBzdWJqZWN0QWx0TmFtZSBhbmQgaXNzdWVyQWx0bmFtZS4KKyMgSW1wb3J0IHRoZSBlbWFpbCBhZGRyZXNzLgorIyBzdWJqZWN0QWx0TmFtZT1lbWFpbDpjb3B5CisjIEFuIGFsdGVybmF0aXZlIHRvIHByb2R1Y2UgY2VydGlmaWNhdGVzIHRoYXQgYXJlbid0CisjIGRlcHJlY2F0ZWQgYWNjb3JkaW5nIHRvIFBLSVguCisjIHN1YmplY3RBbHROYW1lPWVtYWlsOm1vdmUKKworIyBDb3B5IHN1YmplY3QgZGV0YWlscworIyBpc3N1ZXJBbHROYW1lPWlzc3Vlcjpjb3B5CisKKyNuc0NhUmV2b2NhdGlvblVybAkJPSBodHRwOi8vd3d3LmRvbWFpbi5kb20vY2EtY3JsLnBlbQorI25zQmFzZVVybAorI25zUmV2b2NhdGlvblVybAorI25zUmVuZXdhbFVybAorI25zQ2FQb2xpY3lVcmwKKyNuc1NzbFNlcnZlck5hbWUKKworIyBUaGlzIGlzIHJlcXVpcmVkIGZvciBUU0EgY2VydGlmaWNhdGVzLgorIyBleHRlbmRlZEtleVVzYWdlID0gY3JpdGljYWwsdGltZVN0YW1waW5nCisKK1sgdjNfcmVxIF0KKworIyBFeHRlbnNpb25zIHRvIGFkZCB0byBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKworYmFzaWNDb25zdHJhaW50cyA9IENBOkZBTFNFCitrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKKworWyB2M19jYSBdCisKKworIyBFeHRlbnNpb25zIGZvciBhIHR5cGljYWwgQ0EKKworCisjIFBLSVggcmVjb21tZW5kYXRpb24uCisKK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKKworYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZDphbHdheXMsaXNzdWVyCisKKyMgVGhpcyBpcyB3aGF0IFBLSVggcmVjb21tZW5kcyBidXQgc29tZSBicm9rZW4gc29mdHdhcmUgY2hva2VzIG9uIGNyaXRpY2FsCisjIGV4dGVuc2lvbnMuCisjYmFzaWNDb25zdHJhaW50cyA9IGNyaXRpY2FsLENBOnRydWUKKyMgU28gd2UgZG8gdGhpcyBpbnN0ZWFkLgorYmFzaWNDb25zdHJhaW50cyA9IENBOnRydWUKKworIyBLZXkgdXNhZ2U6IHRoaXMgaXMgdHlwaWNhbCBmb3IgYSBDQSBjZXJ0aWZpY2F0ZS4gSG93ZXZlciBzaW5jZSBpdCB3aWxsCisjIHByZXZlbnQgaXQgYmVpbmcgdXNlZCBhcyBhbiB0ZXN0IHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGl0IGlzIGJlc3QKKyMgbGVmdCBvdXQgYnkgZGVmYXVsdC4KKyMga2V5VXNhZ2UgPSBjUkxTaWduLCBrZXlDZXJ0U2lnbgorCisjIFNvbWUgbWlnaHQgd2FudCB0aGlzIGFsc28KKyMgbnNDZXJ0VHlwZSA9IHNzbENBLCBlbWFpbENBCisKKyMgSW5jbHVkZSBlbWFpbCBhZGRyZXNzIGluIHN1YmplY3QgYWx0IG5hbWU6IGFub3RoZXIgUEtJWCByZWNvbW1lbmRhdGlvbgorIyBzdWJqZWN0QWx0TmFtZT1lbWFpbDpjb3B5CisjIENvcHkgaXNzdWVyIGRldGFpbHMKKyMgaXNzdWVyQWx0TmFtZT1pc3N1ZXI6Y29weQorCisjIERFUiBoZXggZW5jb2Rpbmcgb2YgYW4gZXh0ZW5zaW9uOiBiZXdhcmUgZXhwZXJ0cyBvbmx5IQorIyBvYmo9REVSOjAyOjAzCisjIFdoZXJlICdvYmonIGlzIGEgc3RhbmRhcmQgb3IgYWRkZWQgb2JqZWN0CisjIFlvdSBjYW4gZXZlbiBvdmVycmlkZSBhIHN1cHBvcnRlZCBleHRlbnNpb246CisjIGJhc2ljQ29uc3RyYWludHM9IGNyaXRpY2FsLCBERVI6MzA6MDM6MDE6MDE6RkYKKworWyBjcmxfZXh0IF0KKworIyBDUkwgZXh0ZW5zaW9ucy4KKyMgT25seSBpc3N1ZXJBbHROYW1lIGFuZCBhdXRob3JpdHlLZXlJZGVudGlmaWVyIG1ha2UgYW55IHNlbnNlIGluIGEgQ1JMLgorCisjIGlzc3VlckFsdE5hbWU9aXNzdWVyOmNvcHkKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQ6YWx3YXlzCisKK1sgcHJveHlfY2VydF9leHQgXQorIyBUaGVzZSBleHRlbnNpb25zIHNob3VsZCBiZSBhZGRlZCB3aGVuIGNyZWF0aW5nIGEgcHJveHkgY2VydGlmaWNhdGUKKworIyBUaGlzIGdvZXMgYWdhaW5zdCBQS0lYIGd1aWRlbGluZXMgYnV0IHNvbWUgQ0FzIGRvIGl0IGFuZCBzb21lIHNvZnR3YXJlCisjIHJlcXVpcmVzIHRoaXMgdG8gYXZvaWQgaW50ZXJwcmV0aW5nIGFuIGVuZCB1c2VyIGNlcnRpZmljYXRlIGFzIGEgQ0EuCisKK2Jhc2ljQ29uc3RyYWludHM9Q0E6RkFMU0UKKworIyBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHRoZSB1c2FnZSBvZiBuc0NlcnRUeXBlLiBJZiBpdCBpcyBvbWl0dGVkCisjIHRoZSBjZXJ0aWZpY2F0ZSBjYW4gYmUgdXNlZCBmb3IgYW55dGhpbmcgKmV4Y2VwdCogb2JqZWN0IHNpZ25pbmcuCisKKyMgVGhpcyBpcyBPSyBmb3IgYW4gU1NMIHNlcnZlci4KKyMgbnNDZXJ0VHlwZQkJCT0gc2VydmVyCisKKyMgRm9yIGFuIG9iamVjdCBzaWduaW5nIGNlcnRpZmljYXRlIHRoaXMgd291bGQgYmUgdXNlZC4KKyMgbnNDZXJ0VHlwZSA9IG9ianNpZ24KKworIyBGb3Igbm9ybWFsIGNsaWVudCB1c2UgdGhpcyBpcyB0eXBpY2FsCisjIG5zQ2VydFR5cGUgPSBjbGllbnQsIGVtYWlsCisKKyMgYW5kIGZvciBldmVyeXRoaW5nIGluY2x1ZGluZyBvYmplY3Qgc2lnbmluZzoKKyMgbnNDZXJ0VHlwZSA9IGNsaWVudCwgZW1haWwsIG9ianNpZ24KKworIyBUaGlzIGlzIHR5cGljYWwgaW4ga2V5VXNhZ2UgZm9yIGEgY2xpZW50IGNlcnRpZmljYXRlLgorIyBrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKKworIyBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGluIE5ldHNjYXBlJ3MgY29tbWVudCBsaXN0Ym94LgorbnNDb21tZW50CQkJPSAiT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUiCisKKyMgUEtJWCByZWNvbW1lbmRhdGlvbnMgaGFybWxlc3MgaWYgaW5jbHVkZWQgaW4gYWxsIGNlcnRpZmljYXRlcy4KK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQsaXNzdWVyCisKKyMgVGhpcyBzdHVmZiBpcyBmb3Igc3ViamVjdEFsdE5hbWUgYW5kIGlzc3VlckFsdG5hbWUuCisjIEltcG9ydCB0aGUgZW1haWwgYWRkcmVzcy4KKyMgc3ViamVjdEFsdE5hbWU9ZW1haWw6Y29weQorIyBBbiBhbHRlcm5hdGl2ZSB0byBwcm9kdWNlIGNlcnRpZmljYXRlcyB0aGF0IGFyZW4ndAorIyBkZXByZWNhdGVkIGFjY29yZGluZyB0byBQS0lYLgorIyBzdWJqZWN0QWx0TmFtZT1lbWFpbDptb3ZlCisKKyMgQ29weSBzdWJqZWN0IGRldGFpbHMKKyMgaXNzdWVyQWx0TmFtZT1pc3N1ZXI6Y29weQorCisjbnNDYVJldm9jYXRpb25VcmwJCT0gaHR0cDovL3d3dy5kb21haW4uZG9tL2NhLWNybC5wZW0KKyNuc0Jhc2VVcmwKKyNuc1Jldm9jYXRpb25VcmwKKyNuc1JlbmV3YWxVcmwKKyNuc0NhUG9saWN5VXJsCisjbnNTc2xTZXJ2ZXJOYW1lCisKKyMgVGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgaW4gcGxhY2UgZm9yIGl0IHRvIGJlIGEgcHJveHkgY2VydGlmaWNhdGUuCitwcm94eUNlcnRJbmZvPWNyaXRpY2FsLGxhbmd1YWdlOmlkLXBwbC1hbnlMYW5ndWFnZSxwYXRobGVuOjMscG9saWN5OmZvbworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworWyB0c2EgXQorCitkZWZhdWx0X3RzYSA9IHRzYV9jb25maWcxCSMgdGhlIGRlZmF1bHQgVFNBIHNlY3Rpb24KKworWyB0c2FfY29uZmlnMSBdCisKKyMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIFRTQSByZXBseSBnZW5lcmF0aW9uIG9ubHkuCitkaXIJCT0gc3lzXCRkaXNrOlsuZGVtb0NBCQkjIFRTQSByb290IGRpcmVjdG9yeQorc2VyaWFsCQk9ICRkaXJddHNhc2VyaWFsLgkjIFRoZSBjdXJyZW50IHNlcmlhbCBudW1iZXIgKG1hbmRhdG9yeSkKK2NyeXB0b19kZXZpY2UJPSBidWlsdGluCQkjIE9wZW5TU0wgZW5naW5lIHRvIHVzZSBmb3Igc2lnbmluZworc2lnbmVyX2NlcnQJPSAkZGlyL3RzYWNlcnQucGVtIAkjIFRoZSBUU0Egc2lnbmluZyBjZXJ0aWZpY2F0ZQorCQkJCQkjIChvcHRpb25hbCkKK2NlcnRzCQk9ICRkaXIuY2FjZXJ0LnBlbV0JIyBDZXJ0aWZpY2F0ZSBjaGFpbiB0byBpbmNsdWRlIGluIHJlcGx5CisJCQkJCSMgKG9wdGlvbmFsKQorc2lnbmVyX2tleQk9ICRkaXIvcHJpdmF0ZS90c2FrZXkucGVtICMgVGhlIFRTQSBwcml2YXRlIGtleSAob3B0aW9uYWwpCisKK2RlZmF1bHRfcG9saWN5CT0gdHNhX3BvbGljeTEJCSMgUG9saWN5IGlmIHJlcXVlc3QgZGlkIG5vdCBzcGVjaWZ5IGl0CisJCQkJCSMgKG9wdGlvbmFsKQorb3RoZXJfcG9saWNpZXMJPSB0c2FfcG9saWN5MiwgdHNhX3BvbGljeTMJIyBhY2NlcHRhYmxlIHBvbGljaWVzIChvcHRpb25hbCkKK2RpZ2VzdHMJCT0gbWQ1LCBzaGExCQkjIEFjY2VwdGFibGUgbWVzc2FnZSBkaWdlc3RzIChtYW5kYXRvcnkpCithY2N1cmFjeQk9IHNlY3M6MSwgbWlsbGlzZWNzOjUwMCwgbWljcm9zZWNzOjEwMAkjIChvcHRpb25hbCkKK2Nsb2NrX3ByZWNpc2lvbl9kaWdpdHMgID0gMAkjIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgZG90LiAob3B0aW9uYWwpCitvcmRlcmluZwkJPSB5ZXMJIyBJcyBvcmRlcmluZyBkZWZpbmVkIGZvciB0aW1lc3RhbXBzPworCQkJCSMgKG9wdGlvbmFsLCBkZWZhdWx0OiBubykKK3RzYV9uYW1lCQk9IHllcwkjIE11c3QgdGhlIFRTQSBuYW1lIGJlIGluY2x1ZGVkIGluIHRoZSByZXBseT8KKwkJCQkjIChvcHRpb25hbCwgZGVmYXVsdDogbm8pCitlc3NfY2VydF9pZF9jaGFpbgk9IG5vCSMgTXVzdCB0aGUgRVNTIGNlcnQgaWQgY2hhaW4gYmUgaW5jbHVkZWQ/CisJCQkJIyAob3B0aW9uYWwsIGRlZmF1bHQ6IG5vKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9vcGVuc3NsLmMgYi9saWIvb3BlbnNzbC9hcHBzL29wZW5zc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTM3ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9vcGVuc3NsLmMKQEAgLTAsMCArMSw2NTQgQEAKKy8qIGFwcHMvb3BlbnNzbC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgT1BFTlNTTF9DIC8qIHRlbGxzIGFwcHMuaCB0byB1c2UgY29tcGxldGUgYXBwc19zdGFydHVwKCkgKi8KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorI2RlZmluZSBVU0VfU09DS0VUUyAvKiBuZWVkZWQgZm9yIHRoZSBfT19CSU5BUlkgZGVmcyBpbiB0aGUgTVMgd29ybGQgKi8KKyNpbmNsdWRlICJwcm9ncy5oIgorI2luY2x1ZGUgInNfYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKy8qIFRoZSBMSEFTSCBjYWxsYmFja3MgKCJoYXNoIiAmICJjbXAiKSBoYXZlIGJlZW4gcmVwbGFjZWQgYnkgZnVuY3Rpb25zIHdpdGggdGhlCisgKiBiYXNlIHByb3RvdHlwZXMgKHdlIGNhc3QgZWFjaCB2YXJpYWJsZSBpbnNpZGUgdGhlIGZ1bmN0aW9uIHRvIHRoZSByZXF1aXJlZAorICogdHlwZSBvZiAiRlVOQ1RJT04qIikuIFRoaXMgcmVtb3ZlcyB0aGUgbmVjZXNzaXR5IGZvciBtYWNyby1nZW5lcmF0ZWQgd3JhcHBlcgorICogZnVuY3Rpb25zLiAqLworCitzdGF0aWMgTEhBU0hfT0YoRlVOQ1RJT04pICpwcm9nX2luaXQodm9pZCApOworc3RhdGljIGludCBkb19jbWQoTEhBU0hfT0YoRlVOQ1RJT04pICpwcm9nLGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitzdGF0aWMgdm9pZCBsaXN0X3BrZXkoQklPICpvdXQpOworc3RhdGljIHZvaWQgbGlzdF9jaXBoZXIoQklPICpvdXQpOworc3RhdGljIHZvaWQgbGlzdF9tZChCSU8gKm91dCk7CitjaGFyICpkZWZhdWx0X2NvbmZpZ19maWxlPU5VTEw7CisKKy8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSB3aGVuIE1PTk9MSVRIIGlzIGRlZmluZWQgKi8KKyNpZmRlZiBNT05PTElUSAorQ09ORiAqY29uZmlnPU5VTEw7CitCSU8gKmJpb19lcnI9TlVMTDsKKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGxvY2tfZGJnX2NiKGludCBtb2RlLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisJeworCXN0YXRpYyBpbnQgbW9kZXNbQ1JZUFRPX05VTV9MT0NLU107IC8qID0gezAsIDAsIC4uLiB9ICovCisJY29uc3QgY2hhciAqZXJyc3RyID0gTlVMTDsKKwlpbnQgcnc7CisJCisJcncgPSBtb2RlICYgKENSWVBUT19SRUFEfENSWVBUT19XUklURSk7CisJaWYgKCEoKHJ3ID09IENSWVBUT19SRUFEKSB8fCAocncgPT0gQ1JZUFRPX1dSSVRFKSkpCisJCXsKKwkJZXJyc3RyID0gImludmFsaWQgbW9kZSI7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBDUllQVE9fTlVNX0xPQ0tTKQorCQl7CisJCWVycnN0ciA9ICJ0eXBlIG91dCBvZiBib3VuZHMiOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKwkJeworCQlpZiAobW9kZXNbdHlwZV0pCisJCQl7CisJCQllcnJzdHIgPSAiYWxyZWFkeSBsb2NrZWQiOworCQkJLyogbXVzdCBub3QgaGFwcGVuIGluIGEgc2luZ2xlLXRocmVhZGVkIHByb2dyYW0KKwkJCSAqICh3b3VsZCBkZWFkbG9jaykgKi8KKwkJCWdvdG8gZXJyOworCQkJfQorCisJCW1vZGVzW3R5cGVdID0gcnc7CisJCX0KKwllbHNlIGlmIChtb2RlICYgQ1JZUFRPX1VOTE9DSykKKwkJeworCQlpZiAoIW1vZGVzW3R5cGVdKQorCQkJeworCQkJZXJyc3RyID0gIm5vdCBsb2NrZWQiOworCQkJZ290byBlcnI7CisJCQl9CisJCQorCQlpZiAobW9kZXNbdHlwZV0gIT0gcncpCisJCQl7CisJCQllcnJzdHIgPSAocncgPT0gQ1JZUFRPX1JFQUQpID8KKwkJCQkiQ1JZUFRPX3JfdW5sb2NrIG9uIHdyaXRlIGxvY2siIDoKKwkJCQkiQ1JZUFRPX3dfdW5sb2NrIG9uIHJlYWQgbG9jayI7CisJCQl9CisKKwkJbW9kZXNbdHlwZV0gPSAwOworCQl9CisJZWxzZQorCQl7CisJCWVycnN0ciA9ICJpbnZhbGlkIG1vZGUiOworCQlnb3RvIGVycjsKKwkJfQorCisgZXJyOgorCWlmIChlcnJzdHIpCisJCXsKKwkJLyogd2UgY2Fubm90IHVzZSBiaW9fZXJyIGhlcmUgKi8KKwkJZnByaW50ZihzdGRlcnIsICJvcGVuc3NsIChsb2NrX2RiZ19jYik6ICVzIChtb2RlPSVkLCB0eXBlPSVkKSBhdCAlczolZFxuIiwKKwkJCWVycnN0ciwgbW9kZSwgdHlwZSwgZmlsZSwgbGluZSk7CisJCX0KKwl9CisKKworaW50IG1haW4oaW50IEFyZ2MsIGNoYXIgKkFyZ3ZbXSkKKwl7CisJQVJHUyBhcmc7CisjZGVmaW5lIFBST0dfTkFNRV9TSVpFCTM5CisJY2hhciBwbmFtZVtQUk9HX05BTUVfU0laRSsxXTsKKwlGVU5DVElPTiBmLCpmcDsKKwlNU19TVEFUSUMgY29uc3QgY2hhciAqcHJvbXB0OworCU1TX1NUQVRJQyBjaGFyIGJ1ZlsxMDI0XTsKKwljaGFyICp0b19mcmVlPU5VTEw7CisJaW50IG4saSxyZXQ9MDsKKwlpbnQgYXJnYzsKKwljaGFyICoqYXJndiwqcDsKKwlMSEFTSF9PRihGVU5DVElPTikgKnByb2c9TlVMTDsKKwlsb25nIGVycmxpbmU7CisgCisJYXJnLmRhdGE9TlVMTDsKKwlhcmcuY291bnQ9MDsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmIChnZXRlbnYoIk9QRU5TU0xfREVCVUdfTUVNT1JZIikgIT0gTlVMTCkgLyogaWYgbm90IGRlZmluZWQsIHVzZSBjb21waWxlZC1pbiBsaWJyYXJ5IGRlZmF1bHRzICovCisJCXsKKwkJaWYgKCEoMCA9PSBzdHJjbXAoZ2V0ZW52KCJPUEVOU1NMX0RFQlVHX01FTU9SWSIpLCAib2ZmIikpKQorCQkJeworCQkJQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCk7CisJCQlDUllQVE9fc2V0X21lbV9kZWJ1Z19vcHRpb25zKFZfQ1JZUFRPX01ERUJVR19BTEwpOworCQkJfQorCQllbHNlCisJCQl7CisJCQkvKiBPUEVOU1NMX0RFQlVHX01FTU9SWT1vZmYgKi8KKwkJCUNSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygwLCAwLCAwLCAwLCAwKTsKKwkJCX0KKwkJfQorCUNSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09OKTsKKworI2lmIDAKKwlpZiAoZ2V0ZW52KCJPUEVOU1NMX0RFQlVHX0xPQ0tJTkciKSAhPSBOVUxMKQorI2VuZGlmCisJCXsKKwkJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGxvY2tfZGJnX2NiKTsKKwkJfQorCisJYXBwc19zdGFydHVwKCk7CisKKwkvKiBMZXRzIGxvYWQgdXAgb3VyIGVudmlyb25tZW50IGEgbGl0dGxlICovCisJcD1nZXRlbnYoIk9QRU5TU0xfQ09ORiIpOworCWlmIChwID09IE5VTEwpCisJCXA9Z2V0ZW52KCJTU0xFQVlfQ09ORiIpOworCWlmIChwID09IE5VTEwpCisJCXA9dG9fZnJlZT1tYWtlX2NvbmZpZ19uYW1lKCk7CisKKwlkZWZhdWx0X2NvbmZpZ19maWxlPXA7CisKKwljb25maWc9TkNPTkZfbmV3KE5VTEwpOworCWk9TkNPTkZfbG9hZChjb25maWcscCwmZXJybGluZSk7CisJaWYgKGkgPT0gMCkKKwkJeworCQlpZiAoRVJSX0dFVF9SRUFTT04oRVJSX3BlZWtfbGFzdF9lcnJvcigpKQorCQkgICAgPT0gQ09ORl9SX05PX1NVQ0hfRklMRSkKKwkJCXsKKyNpZiAwIC8qIEFORFJPSUQgKi8KKwkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkgICAiV0FSTklORzogY2FuJ3Qgb3BlbiBjb25maWcgZmlsZTogJXNcbiIscCk7CisjZW5kaWYKKwkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJTkNPTkZfZnJlZShjb25maWcpOworCQkJY29uZmlnID0gTlVMTDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCU5DT05GX2ZyZWUoY29uZmlnKTsKKwkJCWV4aXQoMSk7CisJCQl9CisJCX0KKworCXByb2c9cHJvZ19pbml0KCk7CisKKwkvKiBmaXJzdCBjaGVjayB0aGUgcHJvZ3JhbSBuYW1lICovCisJcHJvZ3JhbV9uYW1lKEFyZ3ZbMF0scG5hbWUsc2l6ZW9mIHBuYW1lKTsKKworCWYubmFtZT1wbmFtZTsKKwlmcD1saF9GVU5DVElPTl9yZXRyaWV2ZShwcm9nLCZmKTsKKwlpZiAoZnAgIT0gTlVMTCkKKwkJeworCQlBcmd2WzBdPXBuYW1lOworCQlyZXQ9ZnAtPmZ1bmMoQXJnYyxBcmd2KTsKKwkJZ290byBlbmQ7CisJCX0KKworCS8qIG9rLCBub3cgY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm90IGFyZ3VtZW50cywgaWYgdGhlcmUgYXJlLAorCSAqIHJ1biB3aXRoIHRoZW0sIHNoaWZ0aW5nIHRoZSBzc2xlYXkgb2ZmIHRoZSBmcm9udCAqLworCWlmIChBcmdjICE9IDEpCisJCXsKKwkJQXJnYy0tOworCQlBcmd2Kys7CisJCXJldD1kb19jbWQocHJvZyxBcmdjLEFyZ3YpOworCQlpZiAocmV0IDwgMCkgcmV0PTA7CisJCWdvdG8gZW5kOworCQl9CisKKwkvKiBvaywgbGV0cyBlbnRlciB0aGUgb2xkICdPcGVuU1NMPicgbW9kZSAqLworCQorCWZvciAoOzspCisJCXsKKwkJcmV0PTA7CisJCXA9YnVmOworCQluPXNpemVvZiBidWY7CisJCWk9MDsKKwkJZm9yICg7OykKKwkJCXsKKwkJCXBbMF09J1wwJzsKKwkJCWlmIChpKyspCisJCQkJcHJvbXB0PSI+IjsKKwkJCWVsc2UJcHJvbXB0PSJPcGVuU1NMPiAiOworCQkJZnB1dHMocHJvbXB0LHN0ZG91dCk7CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCWlmICghZmdldHMocCxuLHN0ZGluKSkKKwkJCQlnb3RvIGVuZDsKKwkJCWlmIChwWzBdID09ICdcMCcpIGdvdG8gZW5kOworCQkJaT1zdHJsZW4ocCk7CisJCQlpZiAoaSA8PSAxKSBicmVhazsKKwkJCWlmIChwW2ktMl0gIT0gJ1xcJykgYnJlYWs7CisJCQlpLT0yOworCQkJcCs9aTsKKwkJCW4tPWk7CisJCQl9CisJCWlmICghY2hvcHVwX2FyZ3MoJmFyZyxidWYsJmFyZ2MsJmFyZ3YpKSBicmVhazsKKworCQlyZXQ9ZG9fY21kKHByb2csYXJnYyxhcmd2KTsKKwkJaWYgKHJldCA8IDApCisJCQl7CisJCQlyZXQ9MDsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAocmV0ICE9IDApCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIGluICVzXG4iLGFyZ3ZbMF0pOworCQkodm9pZClCSU9fZmx1c2goYmlvX2Vycik7CisJCX0KKwlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBleGl0XG4iKTsKKwlyZXQ9MTsKK2VuZDoKKwlpZiAodG9fZnJlZSkKKwkJT1BFTlNTTF9mcmVlKHRvX2ZyZWUpOworCWlmIChjb25maWcgIT0gTlVMTCkKKwkJeworCQlOQ09ORl9mcmVlKGNvbmZpZyk7CisJCWNvbmZpZz1OVUxMOworCQl9CisJaWYgKHByb2cgIT0gTlVMTCkgbGhfRlVOQ1RJT05fZnJlZShwcm9nKTsKKwlpZiAoYXJnLmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGFyZy5kYXRhKTsKKworCWFwcHNfc2h1dGRvd24oKTsKKworCUNSWVBUT19tZW1fbGVha3MoYmlvX2Vycik7CisJaWYgKGJpb19lcnIgIT0gTlVMTCkKKwkJeworCQlCSU9fZnJlZShiaW9fZXJyKTsKKwkJYmlvX2Vycj1OVUxMOworCQl9CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQorCisjZGVmaW5lIExJU1RfU1RBTkRBUkRfQ09NTUFORFMgImxpc3Qtc3RhbmRhcmQtY29tbWFuZHMiCisjZGVmaW5lIExJU1RfTUVTU0FHRV9ESUdFU1RfQ09NTUFORFMgImxpc3QtbWVzc2FnZS1kaWdlc3QtY29tbWFuZHMiCisjZGVmaW5lIExJU1RfTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNUyAibGlzdC1tZXNzYWdlLWRpZ2VzdC1hbGdvcml0aG1zIgorI2RlZmluZSBMSVNUX0NJUEhFUl9DT01NQU5EUyAibGlzdC1jaXBoZXItY29tbWFuZHMiCisjZGVmaW5lIExJU1RfQ0lQSEVSX0FMR09SSVRITVMgImxpc3QtY2lwaGVyLWFsZ29yaXRobXMiCisjZGVmaW5lIExJU1RfUFVCTElDX0tFWV9BTEdPUklUSE1TICJsaXN0LXB1YmxpYy1rZXktYWxnb3JpdGhtcyIKKworCitzdGF0aWMgaW50IGRvX2NtZChMSEFTSF9PRihGVU5DVElPTikgKnByb2csIGludCBhcmdjLCBjaGFyICphcmd2W10pCisJeworCUZVTkNUSU9OIGYsKmZwOworCWludCBpLHJldD0xLHRwLG5sOworCisJaWYgKChhcmdjIDw9IDApIHx8IChhcmd2WzBdID09IE5VTEwpKQorCQl7IHJldD0wOyBnb3RvIGVuZDsgfQorCWYubmFtZT1hcmd2WzBdOworCWZwPWxoX0ZVTkNUSU9OX3JldHJpZXZlKHByb2csJmYpOworCWlmIChmcCA9PSBOVUxMKQorCQl7CisJCWlmIChFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShhcmd2WzBdKSkKKwkJCXsKKwkJCWYudHlwZSA9IEZVTkNfVFlQRV9NRDsKKwkJCWYuZnVuYyA9IGRnc3RfbWFpbjsKKwkJCWZwID0gJmY7CisJCQl9CisJCWVsc2UgaWYgKEVWUF9nZXRfY2lwaGVyYnluYW1lKGFyZ3ZbMF0pKQorCQkJeworCQkJZi50eXBlID0gRlVOQ19UWVBFX0NJUEhFUjsKKwkJCWYuZnVuYyA9IGVuY19tYWluOworCQkJZnAgPSAmZjsKKwkJCX0KKwkJfQorCWlmIChmcCAhPSBOVUxMKQorCQl7CisJCXJldD1mcC0+ZnVuYyhhcmdjLGFyZ3YpOworCQl9CisJZWxzZSBpZiAoKHN0cm5jbXAoYXJndlswXSwibm8tIiwzKSkgPT0gMCkKKwkJeworCQlCSU8gKmJpb19zdGRvdXQgPSBCSU9fbmV3X2ZwKHN0ZG91dCxCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCWJpb19zdGRvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIGJpb19zdGRvdXQpOworCQl9CisjZW5kaWYKKwkJZi5uYW1lPWFyZ3ZbMF0rMzsKKwkJcmV0ID0gKGxoX0ZVTkNUSU9OX3JldHJpZXZlKHByb2csJmYpICE9IE5VTEwpOworCQlpZiAoIXJldCkKKwkJCUJJT19wcmludGYoYmlvX3N0ZG91dCwgIiVzXG4iLCBhcmd2WzBdKTsKKwkJZWxzZQorCQkJQklPX3ByaW50ZihiaW9fc3Rkb3V0LCAiJXNcbiIsIGFyZ3ZbMF0rMyk7CisJCUJJT19mcmVlX2FsbChiaW9fc3Rkb3V0KTsKKwkJZ290byBlbmQ7CisJCX0KKwllbHNlIGlmICgoc3RyY21wKGFyZ3ZbMF0sInF1aXQiKSA9PSAwKSB8fAorCQkoc3RyY21wKGFyZ3ZbMF0sInEiKSA9PSAwKSB8fAorCQkoc3RyY21wKGFyZ3ZbMF0sImV4aXQiKSA9PSAwKSB8fAorCQkoc3RyY21wKGFyZ3ZbMF0sImJ5ZSIpID09IDApKQorCQl7CisJCXJldD0gLTE7CisJCWdvdG8gZW5kOworCQl9CisJZWxzZSBpZiAoKHN0cmNtcChhcmd2WzBdLExJU1RfU1RBTkRBUkRfQ09NTUFORFMpID09IDApIHx8CisJCShzdHJjbXAoYXJndlswXSxMSVNUX01FU1NBR0VfRElHRVNUX0NPTU1BTkRTKSA9PSAwKSB8fAorCQkoc3RyY21wKGFyZ3ZbMF0sTElTVF9NRVNTQUdFX0RJR0VTVF9BTEdPUklUSE1TKSA9PSAwKSB8fAorCQkoc3RyY21wKGFyZ3ZbMF0sTElTVF9DSVBIRVJfQ09NTUFORFMpID09IDApIHx8CisJCShzdHJjbXAoYXJndlswXSxMSVNUX0NJUEhFUl9BTEdPUklUSE1TKSA9PSAwKSB8fAorCQkoc3RyY21wKGFyZ3ZbMF0sTElTVF9QVUJMSUNfS0VZX0FMR09SSVRITVMpID09IDApKQorCQl7CisJCWludCBsaXN0X3R5cGU7CisJCUJJTyAqYmlvX3N0ZG91dDsKKworCQlpZiAoc3RyY21wKGFyZ3ZbMF0sTElTVF9TVEFOREFSRF9DT01NQU5EUykgPT0gMCkKKwkJCWxpc3RfdHlwZSA9IEZVTkNfVFlQRV9HRU5FUkFMOworCQllbHNlIGlmIChzdHJjbXAoYXJndlswXSxMSVNUX01FU1NBR0VfRElHRVNUX0NPTU1BTkRTKSA9PSAwKQorCQkJbGlzdF90eXBlID0gRlVOQ19UWVBFX01EOworCQllbHNlIGlmIChzdHJjbXAoYXJndlswXSxMSVNUX01FU1NBR0VfRElHRVNUX0FMR09SSVRITVMpID09IDApCisJCQlsaXN0X3R5cGUgPSBGVU5DX1RZUEVfTURfQUxHOworCQllbHNlIGlmIChzdHJjbXAoYXJndlswXSxMSVNUX1BVQkxJQ19LRVlfQUxHT1JJVEhNUykgPT0gMCkKKwkJCWxpc3RfdHlwZSA9IEZVTkNfVFlQRV9QS0VZOworCQllbHNlIGlmIChzdHJjbXAoYXJndlswXSxMSVNUX0NJUEhFUl9BTEdPUklUSE1TKSA9PSAwKQorCQkJbGlzdF90eXBlID0gRlVOQ19UWVBFX0NJUEhFUl9BTEc7CisJCWVsc2UgLyogc3RyY21wKGFyZ3ZbMF0sTElTVF9DSVBIRVJfQ09NTUFORFMpID09IDAgKi8KKwkJCWxpc3RfdHlwZSA9IEZVTkNfVFlQRV9DSVBIRVI7CisJCWJpb19zdGRvdXQgPSBCSU9fbmV3X2ZwKHN0ZG91dCxCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCWJpb19zdGRvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIGJpb19zdGRvdXQpOworCQl9CisjZW5kaWYKKworCQlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQkJZ290byBlbmQ7CisKKwkJaWYgKGxpc3RfdHlwZSA9PSBGVU5DX1RZUEVfUEtFWSkKKwkJCWxpc3RfcGtleShiaW9fc3Rkb3V0KTsJCisJCWlmIChsaXN0X3R5cGUgPT0gRlVOQ19UWVBFX01EX0FMRykKKwkJCWxpc3RfbWQoYmlvX3N0ZG91dCk7CQorCQlpZiAobGlzdF90eXBlID09IEZVTkNfVFlQRV9DSVBIRVJfQUxHKQorCQkJbGlzdF9jaXBoZXIoYmlvX3N0ZG91dCk7CQorCQllbHNlCisJCQl7CisJCQlmb3IgKGZwPWZ1bmN0aW9uczsgZnAtPm5hbWUgIT0gTlVMTDsgZnArKykKKwkJCQlpZiAoZnAtPnR5cGUgPT0gbGlzdF90eXBlKQorCQkJCQlCSU9fcHJpbnRmKGJpb19zdGRvdXQsICIlc1xuIiwKKwkJCQkJCQkJZnAtPm5hbWUpOworCQkJfQorCQlCSU9fZnJlZV9hbGwoYmlvX3N0ZG91dCk7CisJCXJldD0wOworCQlnb3RvIGVuZDsKKwkJfQorCWVsc2UKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIm9wZW5zc2w6RXJyb3I6ICclcycgaXMgYW4gaW52YWxpZCBjb21tYW5kLlxuIiwKKwkJCWFyZ3ZbMF0pOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJcblN0YW5kYXJkIGNvbW1hbmRzIik7CisJCWk9MDsKKwkJdHA9MDsKKwkJZm9yIChmcD1mdW5jdGlvbnM7IGZwLT5uYW1lICE9IE5VTEw7IGZwKyspCisJCQl7CisJCQlubD0wOworI2lmZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKwkJCWlmICgoKGkrKykgJSA1KSA9PSAwKQorI2Vsc2UKKwkJCWlmICgoKGkrKykgJSA0KSA9PSAwKQorI2VuZGlmCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJCQlubD0xOworCQkJCX0KKwkJCWlmIChmcC0+dHlwZSAhPSB0cCkKKwkJCQl7CisJCQkJdHA9ZnAtPnR5cGU7CisJCQkJaWYgKCFubCkgQklPX3ByaW50ZihiaW9fZXJyLCJcbiIpOworCQkJCWlmICh0cCA9PSBGVU5DX1RZUEVfTUQpCisJCQkJCXsKKwkJCQkJaT0xOworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCQkiXG5NZXNzYWdlIERpZ2VzdCBjb21tYW5kcyAoc2VlIHRoZSBgZGdzdCcgY29tbWFuZCBmb3IgbW9yZSBkZXRhaWxzKVxuIik7CisJCQkJCX0KKwkJCQllbHNlIGlmICh0cCA9PSBGVU5DX1RZUEVfQ0lQSEVSKQorCQkJCQl7CisJCQkJCWk9MTsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJcbkNpcGhlciBjb21tYW5kcyAoc2VlIHRoZSBgZW5jJyBjb21tYW5kIGZvciBtb3JlIGRldGFpbHMpXG4iKTsKKwkJCQkJfQorCQkJCX0KKyNpZmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIiUtMTVzIixmcC0+bmFtZSk7CisjZWxzZQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlLTE4cyIsZnAtPm5hbWUpOworI2VuZGlmCisJCQl9CisJCUJJT19wcmludGYoYmlvX2VyciwiXG5cbiIpOworCQlyZXQ9MDsKKwkJfQorZW5kOgorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBTb3J0Rm5CeU5hbWUoY29uc3Qgdm9pZCAqX2YxLGNvbnN0IHZvaWQgKl9mMikKKyAgICB7CisgICAgY29uc3QgRlVOQ1RJT04gKmYxPV9mMTsKKyAgICBjb25zdCBGVU5DVElPTiAqZjI9X2YyOworCisgICAgaWYoZjEtPnR5cGUgIT0gZjItPnR5cGUpCisJcmV0dXJuIGYxLT50eXBlLWYyLT50eXBlOworICAgIHJldHVybiBzdHJjbXAoZjEtPm5hbWUsZjItPm5hbWUpOworICAgIH0KKworc3RhdGljIHZvaWQgbGlzdF9wa2V5KEJJTyAqb3V0KQorCXsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgRVZQX1BLRVlfYXNuMV9nZXRfY291bnQoKTsgaSsrKQorCQl7CisJCWNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aDsKKwkJaW50IHBrZXlfaWQsIHBrZXlfYmFzZV9pZCwgcGtleV9mbGFnczsKKwkJY29uc3QgY2hhciAqcGluZm8sICpwZW1fc3RyOworCQlhbWV0aCA9IEVWUF9QS0VZX2FzbjFfZ2V0MChpKTsKKwkJRVZQX1BLRVlfYXNuMV9nZXQwX2luZm8oJnBrZXlfaWQsICZwa2V5X2Jhc2VfaWQsICZwa2V5X2ZsYWdzLAorCQkJCQkJJnBpbmZvLCAmcGVtX3N0ciwgYW1ldGgpOworCQlpZiAocGtleV9mbGFncyAmIEFTTjFfUEtFWV9BTElBUykKKwkJCXsKKwkJCUJJT19wcmludGYob3V0LCAiTmFtZTogJXNcbiIsIAorCQkJCQlPQkpfbmlkMmxuKHBrZXlfaWQpKTsKKwkJCUJJT19wcmludGYob3V0LCAiXHRUeXBlOiBBbGlhcyB0byAlc1xuIiwKKwkJCQkJT0JKX25pZDJsbihwa2V5X2Jhc2VfaWQpKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihvdXQsICJOYW1lOiAlc1xuIiwgcGluZm8pOworCQkJQklPX3ByaW50ZihvdXQsICJcdFR5cGU6ICVzIEFsZ29yaXRobVxuIiwgCisJCQkJcGtleV9mbGFncyAmIEFTTjFfUEtFWV9EWU5BTUlDID8KKwkJCQkJIkV4dGVybmFsIiA6ICJCdWlsdGluIik7CisJCQlCSU9fcHJpbnRmKG91dCwgIlx0T0lEOiAlc1xuIiwgT0JKX25pZDJsbihwa2V5X2lkKSk7CisJCQlpZiAocGVtX3N0ciA9PSBOVUxMKQorCQkJCXBlbV9zdHIgPSAiKG5vbmUpIjsKKwkJCUJJT19wcmludGYob3V0LCAiXHRQRU0gc3RyaW5nOiAlc1xuIiwgcGVtX3N0cik7CisJCQl9CisJCQkJCQorCQl9CisJfQorCitzdGF0aWMgdm9pZCBsaXN0X2NpcGhlcl9mbihjb25zdCBFVlBfQ0lQSEVSICpjLAorCQkJY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8sIHZvaWQgKmFyZykKKwl7CisJaWYgKGMpCisJCUJJT19wcmludGYoYXJnLCAiJXNcbiIsIEVWUF9DSVBIRVJfbmFtZShjKSk7CisJZWxzZQorCQl7CisJCWlmICghZnJvbSkKKwkJCWZyb20gPSAiPHVuZGVmaW5lZD4iOworCQlpZiAoIXRvKQorCQkJdG8gPSAiPHVuZGVmaW5lZD4iOworCQlCSU9fcHJpbnRmKGFyZywgIiVzID0+ICVzXG4iLCBmcm9tLCB0byk7CisJCX0KKwl9CisKK3N0YXRpYyB2b2lkIGxpc3RfY2lwaGVyKEJJTyAqb3V0KQorCXsKKwlFVlBfQ0lQSEVSX2RvX2FsbF9zb3J0ZWQobGlzdF9jaXBoZXJfZm4sIG91dCk7CisJfQorCitzdGF0aWMgdm9pZCBsaXN0X21kX2ZuKGNvbnN0IEVWUF9NRCAqbSwKKwkJCWNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvLCB2b2lkICphcmcpCisJeworCWlmIChtKQorCQlCSU9fcHJpbnRmKGFyZywgIiVzXG4iLCBFVlBfTURfbmFtZShtKSk7CisJZWxzZQorCQl7CisJCWlmICghZnJvbSkKKwkJCWZyb20gPSAiPHVuZGVmaW5lZD4iOworCQlpZiAoIXRvKQorCQkJdG8gPSAiPHVuZGVmaW5lZD4iOworCQlCSU9fcHJpbnRmKGFyZywgIiVzID0+ICVzXG4iLCBmcm9tLCB0byk7CisJCX0KKwl9CisKK3N0YXRpYyB2b2lkIGxpc3RfbWQoQklPICpvdXQpCisJeworCUVWUF9NRF9kb19hbGxfc29ydGVkKGxpc3RfbWRfZm4sIG91dCk7CisJfQorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZ1bmN0aW9uX2NtcChjb25zdCBGVU5DVElPTiAqYSwgY29uc3QgRlVOQ1RJT04gKmIpCisJeworCXJldHVybiBzdHJuY21wKGEtPm5hbWUsYi0+bmFtZSw4KTsKKwl9CitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0NPTVBfRk4oZnVuY3Rpb24sIEZVTkNUSU9OKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBNU19DQUxMQkFDSyBmdW5jdGlvbl9oYXNoKGNvbnN0IEZVTkNUSU9OICphKQorCXsKKwlyZXR1cm4gbGhfc3RyaGFzaChhLT5uYW1lKTsKKwl9CQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9IQVNIX0ZOKGZ1bmN0aW9uLCBGVU5DVElPTikKKworc3RhdGljIExIQVNIX09GKEZVTkNUSU9OKSAqcHJvZ19pbml0KHZvaWQpCisJeworCUxIQVNIX09GKEZVTkNUSU9OKSAqcmV0OworCUZVTkNUSU9OICpmOworCXNpemVfdCBpOworCisJLyogUHVyZWx5IHNvIGl0IGxvb2tzIG5pY2Ugd2hlbiB0aGUgdXNlciBoaXRzID8gKi8KKwlmb3IoaT0wLGY9ZnVuY3Rpb25zIDsgZi0+bmFtZSAhPSBOVUxMIDsgKytmLCsraSkKKwkgICAgOworCXFzb3J0KGZ1bmN0aW9ucyxpLHNpemVvZiAqZnVuY3Rpb25zLFNvcnRGbkJ5TmFtZSk7CisKKwlpZiAoKHJldD1saF9GVU5DVElPTl9uZXcoKSkgPT0gTlVMTCkKKwkJcmV0dXJuKE5VTEwpOworCisJZm9yIChmPWZ1bmN0aW9uczsgZi0+bmFtZSAhPSBOVUxMOyBmKyspCisJCSh2b2lkKWxoX0ZVTkNUSU9OX2luc2VydChyZXQsZik7CisJcmV0dXJuKHJldCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL29wZW5zc2wuY25mIGIvbGliL29wZW5zc2wvYXBwcy9vcGVuc3NsLmNuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJjZDViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9vcGVuc3NsLmNuZgpAQCAtMCwwICsxLDM1MCBAQAorIworIyBPcGVuU1NMIGV4YW1wbGUgY29uZmlndXJhdGlvbiBmaWxlLgorIyBUaGlzIGlzIG1vc3RseSBiZWluZyB1c2VkIGZvciBnZW5lcmF0aW9uIG9mIGNlcnRpZmljYXRlIHJlcXVlc3RzLgorIworCisjIFRoaXMgZGVmaW5pdGlvbiBzdG9wcyB0aGUgZm9sbG93aW5nIGxpbmVzIGNob2tpbmcgaWYgSE9NRSBpc24ndAorIyBkZWZpbmVkLgorSE9NRQkJCT0gLgorUkFOREZJTEUJCT0gJEVOVjo6SE9NRS8ucm5kCisKKyMgRXh0cmEgT0JKRUNUIElERU5USUZJRVIgaW5mbzoKKyNvaWRfZmlsZQkJPSAkRU5WOjpIT01FLy5vaWQKK29pZF9zZWN0aW9uCQk9IG5ld19vaWRzCisKKyMgVG8gdXNlIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlIHdpdGggdGhlICItZXh0ZmlsZSIgb3B0aW9uIG9mIHRoZQorIyAib3BlbnNzbCB4NTA5IiB1dGlsaXR5LCBuYW1lIGhlcmUgdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUKKyMgWC41MDl2MyBleHRlbnNpb25zIHRvIHVzZToKKyMgZXh0ZW5zaW9ucwkJPSAKKyMgKEFsdGVybmF0aXZlbHksIHVzZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0IGhhcyBvbmx5CisjIFguNTA5djMgZXh0ZW5zaW9ucyBpbiBpdHMgbWFpbiBbPSBkZWZhdWx0XSBzZWN0aW9uLikKKworWyBuZXdfb2lkcyBdCisKKyMgV2UgY2FuIGFkZCBuZXcgT0lEcyBpbiBoZXJlIGZvciB1c2UgYnkgJ2NhJywgJ3JlcScgYW5kICd0cycuCisjIEFkZCBhIHNpbXBsZSBPSUQgbGlrZSB0aGlzOgorIyB0ZXN0b2lkMT0xLjIuMy40CisjIE9yIHVzZSBjb25maWcgZmlsZSBzdWJzdGl0dXRpb24gbGlrZSB0aGlzOgorIyB0ZXN0b2lkMj0ke3Rlc3RvaWQxfS41LjYKKworIyBQb2xpY2llcyB1c2VkIGJ5IHRoZSBUU0EgZXhhbXBsZXMuCit0c2FfcG9saWN5MSA9IDEuMi4zLjQuMQordHNhX3BvbGljeTIgPSAxLjIuMy40LjUuNgordHNhX3BvbGljeTMgPSAxLjIuMy40LjUuNworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworWyBjYSBdCitkZWZhdWx0X2NhCT0gQ0FfZGVmYXVsdAkJIyBUaGUgZGVmYXVsdCBjYSBzZWN0aW9uCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitbIENBX2RlZmF1bHQgXQorCitkaXIJCT0gLi9kZW1vQ0EJCSMgV2hlcmUgZXZlcnl0aGluZyBpcyBrZXB0CitjZXJ0cwkJPSAkZGlyL2NlcnRzCQkjIFdoZXJlIHRoZSBpc3N1ZWQgY2VydHMgYXJlIGtlcHQKK2NybF9kaXIJCT0gJGRpci9jcmwJCSMgV2hlcmUgdGhlIGlzc3VlZCBjcmwgYXJlIGtlcHQKK2RhdGFiYXNlCT0gJGRpci9pbmRleC50eHQJIyBkYXRhYmFzZSBpbmRleCBmaWxlLgorI3VuaXF1ZV9zdWJqZWN0CT0gbm8JCQkjIFNldCB0byAnbm8nIHRvIGFsbG93IGNyZWF0aW9uIG9mCisJCQkJCSMgc2V2ZXJhbCBjdGlmaWNhdGVzIHdpdGggc2FtZSBzdWJqZWN0LgorbmV3X2NlcnRzX2Rpcgk9ICRkaXIvbmV3Y2VydHMJCSMgZGVmYXVsdCBwbGFjZSBmb3IgbmV3IGNlcnRzLgorCitjZXJ0aWZpY2F0ZQk9ICRkaXIvY2FjZXJ0LnBlbSAJIyBUaGUgQ0EgY2VydGlmaWNhdGUKK3NlcmlhbAkJPSAkZGlyL3NlcmlhbCAJCSMgVGhlIGN1cnJlbnQgc2VyaWFsIG51bWJlcgorY3JsbnVtYmVyCT0gJGRpci9jcmxudW1iZXIJIyB0aGUgY3VycmVudCBjcmwgbnVtYmVyCisJCQkJCSMgbXVzdCBiZSBjb21tZW50ZWQgb3V0IHRvIGxlYXZlIGEgVjEgQ1JMCitjcmwJCT0gJGRpci9jcmwucGVtIAkJIyBUaGUgY3VycmVudCBDUkwKK3ByaXZhdGVfa2V5CT0gJGRpci9wcml2YXRlL2Nha2V5LnBlbSMgVGhlIHByaXZhdGUga2V5CitSQU5ERklMRQk9ICRkaXIvcHJpdmF0ZS8ucmFuZAkjIHByaXZhdGUgcmFuZG9tIG51bWJlciBmaWxlCisKK3g1MDlfZXh0ZW5zaW9ucwk9IHVzcl9jZXJ0CQkjIFRoZSBleHRlbnRpb25zIHRvIGFkZCB0byB0aGUgY2VydAorCisjIENvbW1lbnQgb3V0IHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzIGZvciB0aGUgInRyYWRpdGlvbmFsIgorIyAoYW5kIGhpZ2hseSBicm9rZW4pIGZvcm1hdC4KK25hbWVfb3B0IAk9IGNhX2RlZmF1bHQJCSMgU3ViamVjdCBOYW1lIG9wdGlvbnMKK2NlcnRfb3B0IAk9IGNhX2RlZmF1bHQJCSMgQ2VydGlmaWNhdGUgZmllbGQgb3B0aW9ucworCisjIEV4dGVuc2lvbiBjb3B5aW5nIG9wdGlvbjogdXNlIHdpdGggY2F1dGlvbi4KKyMgY29weV9leHRlbnNpb25zID0gY29weQorCisjIEV4dGVuc2lvbnMgdG8gYWRkIHRvIGEgQ1JMLiBOb3RlOiBOZXRzY2FwZSBjb21tdW5pY2F0b3IgY2hva2VzIG9uIFYyIENSTHMKKyMgc28gdGhpcyBpcyBjb21tZW50ZWQgb3V0IGJ5IGRlZmF1bHQgdG8gbGVhdmUgYSBWMSBDUkwuCisjIGNybG51bWJlciBtdXN0IGFsc28gYmUgY29tbWVudGVkIG91dCB0byBsZWF2ZSBhIFYxIENSTC4KKyMgY3JsX2V4dGVuc2lvbnMJPSBjcmxfZXh0CisKK2RlZmF1bHRfZGF5cwk9IDM2NQkJCSMgaG93IGxvbmcgdG8gY2VydGlmeSBmb3IKK2RlZmF1bHRfY3JsX2RheXM9IDMwCQkJIyBob3cgbG9uZyBiZWZvcmUgbmV4dCBDUkwKK2RlZmF1bHRfbWQJPSBkZWZhdWx0CQkjIHVzZSBwdWJsaWMga2V5IGRlZmF1bHQgTUQKK3ByZXNlcnZlCT0gbm8JCQkjIGtlZXAgcGFzc2VkIEROIG9yZGVyaW5nCisKKyMgQSBmZXcgZGlmZmVyZW5jZSB3YXkgb2Ygc3BlY2lmeWluZyBob3cgc2ltaWxhciB0aGUgcmVxdWVzdCBzaG91bGQgbG9vaworIyBGb3IgdHlwZSBDQSwgdGhlIGxpc3RlZCBhdHRyaWJ1dGVzIG11c3QgYmUgdGhlIHNhbWUsIGFuZCB0aGUgb3B0aW9uYWwKKyMgYW5kIHN1cHBsaWVkIGZpZWxkcyBhcmUganVzdCB0aGF0IDotKQorcG9saWN5CQk9IHBvbGljeV9tYXRjaAorCisjIEZvciB0aGUgQ0EgcG9saWN5CitbIHBvbGljeV9tYXRjaCBdCitjb3VudHJ5TmFtZQkJPSBtYXRjaAorc3RhdGVPclByb3ZpbmNlTmFtZQk9IG1hdGNoCitvcmdhbml6YXRpb25OYW1lCT0gbWF0Y2gKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJPSBvcHRpb25hbAorY29tbW9uTmFtZQkJPSBzdXBwbGllZAorZW1haWxBZGRyZXNzCQk9IG9wdGlvbmFsCisKKyMgRm9yIHRoZSAnYW55dGhpbmcnIHBvbGljeQorIyBBdCB0aGlzIHBvaW50IGluIHRpbWUsIHlvdSBtdXN0IGxpc3QgYWxsIGFjY2VwdGFibGUgJ29iamVjdCcKKyMgdHlwZXMuCitbIHBvbGljeV9hbnl0aGluZyBdCitjb3VudHJ5TmFtZQkJPSBvcHRpb25hbAorc3RhdGVPclByb3ZpbmNlTmFtZQk9IG9wdGlvbmFsCitsb2NhbGl0eU5hbWUJCT0gb3B0aW9uYWwKK29yZ2FuaXphdGlvbk5hbWUJPSBvcHRpb25hbAorb3JnYW5pemF0aW9uYWxVbml0TmFtZQk9IG9wdGlvbmFsCitjb21tb25OYW1lCQk9IHN1cHBsaWVkCitlbWFpbEFkZHJlc3MJCT0gb3B0aW9uYWwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK1sgcmVxIF0KK2RlZmF1bHRfYml0cwkJPSAxMDI0CitkZWZhdWx0X2tleWZpbGUgCT0gcHJpdmtleS5wZW0KK2Rpc3Rpbmd1aXNoZWRfbmFtZQk9IHJlcV9kaXN0aW5ndWlzaGVkX25hbWUKK2F0dHJpYnV0ZXMJCT0gcmVxX2F0dHJpYnV0ZXMKK3g1MDlfZXh0ZW5zaW9ucwk9IHYzX2NhCSMgVGhlIGV4dGVudGlvbnMgdG8gYWRkIHRvIHRoZSBzZWxmIHNpZ25lZCBjZXJ0CisKKyMgUGFzc3dvcmRzIGZvciBwcml2YXRlIGtleXMgaWYgbm90IHByZXNlbnQgdGhleSB3aWxsIGJlIHByb21wdGVkIGZvcgorIyBpbnB1dF9wYXNzd29yZCA9IHNlY3JldAorIyBvdXRwdXRfcGFzc3dvcmQgPSBzZWNyZXQKKworIyBUaGlzIHNldHMgYSBtYXNrIGZvciBwZXJtaXR0ZWQgc3RyaW5nIHR5cGVzLiBUaGVyZSBhcmUgc2V2ZXJhbCBvcHRpb25zLiAKKyMgZGVmYXVsdDogUHJpbnRhYmxlU3RyaW5nLCBUNjFTdHJpbmcsIEJNUFN0cmluZy4KKyMgcGtpeAkgOiBQcmludGFibGVTdHJpbmcsIEJNUFN0cmluZyAoUEtJWCByZWNvbW1lbmRhdGlvbiBiZWZvcmUgMjAwNCkKKyMgdXRmOG9ubHk6IG9ubHkgVVRGOFN0cmluZ3MgKFBLSVggcmVjb21tZW5kYXRpb24gYWZ0ZXIgMjAwNCkuCisjIG5vbWJzdHIgOiBQcmludGFibGVTdHJpbmcsIFQ2MVN0cmluZyAobm8gQk1QU3RyaW5ncyBvciBVVEY4U3RyaW5ncykuCisjIE1BU0s6WFhYWCBhIGxpdGVyYWwgbWFzayB2YWx1ZS4KKyMgV0FSTklORzogYW5jaWVudCB2ZXJzaW9ucyBvZiBOZXRzY2FwZSBjcmFzaCBvbiBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzLgorc3RyaW5nX21hc2sgPSB1dGY4b25seQorCisjIHJlcV9leHRlbnNpb25zID0gdjNfcmVxICMgVGhlIGV4dGVuc2lvbnMgdG8gYWRkIHRvIGEgY2VydGlmaWNhdGUgcmVxdWVzdAorCitbIHJlcV9kaXN0aW5ndWlzaGVkX25hbWUgXQorY291bnRyeU5hbWUJCQk9IENvdW50cnkgTmFtZSAoMiBsZXR0ZXIgY29kZSkKK2NvdW50cnlOYW1lX2RlZmF1bHQJCT0gQVUKK2NvdW50cnlOYW1lX21pbgkJCT0gMgorY291bnRyeU5hbWVfbWF4CQkJPSAyCisKK3N0YXRlT3JQcm92aW5jZU5hbWUJCT0gU3RhdGUgb3IgUHJvdmluY2UgTmFtZSAoZnVsbCBuYW1lKQorc3RhdGVPclByb3ZpbmNlTmFtZV9kZWZhdWx0CT0gU29tZS1TdGF0ZQorCitsb2NhbGl0eU5hbWUJCQk9IExvY2FsaXR5IE5hbWUgKGVnLCBjaXR5KQorCiswLm9yZ2FuaXphdGlvbk5hbWUJCT0gT3JnYW5pemF0aW9uIE5hbWUgKGVnLCBjb21wYW55KQorMC5vcmdhbml6YXRpb25OYW1lX2RlZmF1bHQJPSBJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQKKworIyB3ZSBjYW4gZG8gdGhpcyBidXQgaXQgaXMgbm90IG5lZWRlZCBub3JtYWxseSA6LSkKKyMxLm9yZ2FuaXphdGlvbk5hbWUJCT0gU2Vjb25kIE9yZ2FuaXphdGlvbiBOYW1lIChlZywgY29tcGFueSkKKyMxLm9yZ2FuaXphdGlvbk5hbWVfZGVmYXVsdAk9IFdvcmxkIFdpZGUgV2ViIFB0eSBMdGQKKworb3JnYW5pemF0aW9uYWxVbml0TmFtZQkJPSBPcmdhbml6YXRpb25hbCBVbml0IE5hbWUgKGVnLCBzZWN0aW9uKQorI29yZ2FuaXphdGlvbmFsVW5pdE5hbWVfZGVmYXVsdAk9CisKK2NvbW1vbk5hbWUJCQk9IENvbW1vbiBOYW1lIChlZywgWU9VUiBuYW1lKQorY29tbW9uTmFtZV9tYXgJCQk9IDY0CisKK2VtYWlsQWRkcmVzcwkJCT0gRW1haWwgQWRkcmVzcworZW1haWxBZGRyZXNzX21heAkJPSA2NAorCisjIFNFVC1leDMJCQk9IFNFVCBleHRlbnNpb24gbnVtYmVyIDMKKworWyByZXFfYXR0cmlidXRlcyBdCitjaGFsbGVuZ2VQYXNzd29yZAkJPSBBIGNoYWxsZW5nZSBwYXNzd29yZAorY2hhbGxlbmdlUGFzc3dvcmRfbWluCQk9IDQKK2NoYWxsZW5nZVBhc3N3b3JkX21heAkJPSAyMAorCit1bnN0cnVjdHVyZWROYW1lCQk9IEFuIG9wdGlvbmFsIGNvbXBhbnkgbmFtZQorCitbIHVzcl9jZXJ0IF0KKworIyBUaGVzZSBleHRlbnNpb25zIGFyZSBhZGRlZCB3aGVuICdjYScgc2lnbnMgYSByZXF1ZXN0LgorCisjIFRoaXMgZ29lcyBhZ2FpbnN0IFBLSVggZ3VpZGVsaW5lcyBidXQgc29tZSBDQXMgZG8gaXQgYW5kIHNvbWUgc29mdHdhcmUKKyMgcmVxdWlyZXMgdGhpcyB0byBhdm9pZCBpbnRlcnByZXRpbmcgYW4gZW5kIHVzZXIgY2VydGlmaWNhdGUgYXMgYSBDQS4KKworYmFzaWNDb25zdHJhaW50cz1DQTpGQUxTRQorCisjIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdGhlIHVzYWdlIG9mIG5zQ2VydFR5cGUuIElmIGl0IGlzIG9taXR0ZWQKKyMgdGhlIGNlcnRpZmljYXRlIGNhbiBiZSB1c2VkIGZvciBhbnl0aGluZyAqZXhjZXB0KiBvYmplY3Qgc2lnbmluZy4KKworIyBUaGlzIGlzIE9LIGZvciBhbiBTU0wgc2VydmVyLgorIyBuc0NlcnRUeXBlCQkJPSBzZXJ2ZXIKKworIyBGb3IgYW4gb2JqZWN0IHNpZ25pbmcgY2VydGlmaWNhdGUgdGhpcyB3b3VsZCBiZSB1c2VkLgorIyBuc0NlcnRUeXBlID0gb2Jqc2lnbgorCisjIEZvciBub3JtYWwgY2xpZW50IHVzZSB0aGlzIGlzIHR5cGljYWwKKyMgbnNDZXJ0VHlwZSA9IGNsaWVudCwgZW1haWwKKworIyBhbmQgZm9yIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIG9iamVjdCBzaWduaW5nOgorIyBuc0NlcnRUeXBlID0gY2xpZW50LCBlbWFpbCwgb2Jqc2lnbgorCisjIFRoaXMgaXMgdHlwaWNhbCBpbiBrZXlVc2FnZSBmb3IgYSBjbGllbnQgY2VydGlmaWNhdGUuCisjIGtleVVzYWdlID0gbm9uUmVwdWRpYXRpb24sIGRpZ2l0YWxTaWduYXR1cmUsIGtleUVuY2lwaGVybWVudAorCisjIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gTmV0c2NhcGUncyBjb21tZW50IGxpc3Rib3guCituc0NvbW1lbnQJCQk9ICJPcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZpY2F0ZSIKKworIyBQS0lYIHJlY29tbWVuZGF0aW9ucyBoYXJtbGVzcyBpZiBpbmNsdWRlZCBpbiBhbGwgY2VydGlmaWNhdGVzLgorc3ViamVjdEtleUlkZW50aWZpZXI9aGFzaAorYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZCxpc3N1ZXIKKworIyBUaGlzIHN0dWZmIGlzIGZvciBzdWJqZWN0QWx0TmFtZSBhbmQgaXNzdWVyQWx0bmFtZS4KKyMgSW1wb3J0IHRoZSBlbWFpbCBhZGRyZXNzLgorIyBzdWJqZWN0QWx0TmFtZT1lbWFpbDpjb3B5CisjIEFuIGFsdGVybmF0aXZlIHRvIHByb2R1Y2UgY2VydGlmaWNhdGVzIHRoYXQgYXJlbid0CisjIGRlcHJlY2F0ZWQgYWNjb3JkaW5nIHRvIFBLSVguCisjIHN1YmplY3RBbHROYW1lPWVtYWlsOm1vdmUKKworIyBDb3B5IHN1YmplY3QgZGV0YWlscworIyBpc3N1ZXJBbHROYW1lPWlzc3Vlcjpjb3B5CisKKyNuc0NhUmV2b2NhdGlvblVybAkJPSBodHRwOi8vd3d3LmRvbWFpbi5kb20vY2EtY3JsLnBlbQorI25zQmFzZVVybAorI25zUmV2b2NhdGlvblVybAorI25zUmVuZXdhbFVybAorI25zQ2FQb2xpY3lVcmwKKyNuc1NzbFNlcnZlck5hbWUKKworIyBUaGlzIGlzIHJlcXVpcmVkIGZvciBUU0EgY2VydGlmaWNhdGVzLgorIyBleHRlbmRlZEtleVVzYWdlID0gY3JpdGljYWwsdGltZVN0YW1waW5nCisKK1sgdjNfcmVxIF0KKworIyBFeHRlbnNpb25zIHRvIGFkZCB0byBhIGNlcnRpZmljYXRlIHJlcXVlc3QKKworYmFzaWNDb25zdHJhaW50cyA9IENBOkZBTFNFCitrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKKworWyB2M19jYSBdCisKKworIyBFeHRlbnNpb25zIGZvciBhIHR5cGljYWwgQ0EKKworCisjIFBLSVggcmVjb21tZW5kYXRpb24uCisKK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKKworYXV0aG9yaXR5S2V5SWRlbnRpZmllcj1rZXlpZDphbHdheXMsaXNzdWVyCisKKyMgVGhpcyBpcyB3aGF0IFBLSVggcmVjb21tZW5kcyBidXQgc29tZSBicm9rZW4gc29mdHdhcmUgY2hva2VzIG9uIGNyaXRpY2FsCisjIGV4dGVuc2lvbnMuCisjYmFzaWNDb25zdHJhaW50cyA9IGNyaXRpY2FsLENBOnRydWUKKyMgU28gd2UgZG8gdGhpcyBpbnN0ZWFkLgorYmFzaWNDb25zdHJhaW50cyA9IENBOnRydWUKKworIyBLZXkgdXNhZ2U6IHRoaXMgaXMgdHlwaWNhbCBmb3IgYSBDQSBjZXJ0aWZpY2F0ZS4gSG93ZXZlciBzaW5jZSBpdCB3aWxsCisjIHByZXZlbnQgaXQgYmVpbmcgdXNlZCBhcyBhbiB0ZXN0IHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGl0IGlzIGJlc3QKKyMgbGVmdCBvdXQgYnkgZGVmYXVsdC4KKyMga2V5VXNhZ2UgPSBjUkxTaWduLCBrZXlDZXJ0U2lnbgorCisjIFNvbWUgbWlnaHQgd2FudCB0aGlzIGFsc28KKyMgbnNDZXJ0VHlwZSA9IHNzbENBLCBlbWFpbENBCisKKyMgSW5jbHVkZSBlbWFpbCBhZGRyZXNzIGluIHN1YmplY3QgYWx0IG5hbWU6IGFub3RoZXIgUEtJWCByZWNvbW1lbmRhdGlvbgorIyBzdWJqZWN0QWx0TmFtZT1lbWFpbDpjb3B5CisjIENvcHkgaXNzdWVyIGRldGFpbHMKKyMgaXNzdWVyQWx0TmFtZT1pc3N1ZXI6Y29weQorCisjIERFUiBoZXggZW5jb2Rpbmcgb2YgYW4gZXh0ZW5zaW9uOiBiZXdhcmUgZXhwZXJ0cyBvbmx5IQorIyBvYmo9REVSOjAyOjAzCisjIFdoZXJlICdvYmonIGlzIGEgc3RhbmRhcmQgb3IgYWRkZWQgb2JqZWN0CisjIFlvdSBjYW4gZXZlbiBvdmVycmlkZSBhIHN1cHBvcnRlZCBleHRlbnNpb246CisjIGJhc2ljQ29uc3RyYWludHM9IGNyaXRpY2FsLCBERVI6MzA6MDM6MDE6MDE6RkYKKworWyBjcmxfZXh0IF0KKworIyBDUkwgZXh0ZW5zaW9ucy4KKyMgT25seSBpc3N1ZXJBbHROYW1lIGFuZCBhdXRob3JpdHlLZXlJZGVudGlmaWVyIG1ha2UgYW55IHNlbnNlIGluIGEgQ1JMLgorCisjIGlzc3VlckFsdE5hbWU9aXNzdWVyOmNvcHkKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQ6YWx3YXlzCisKK1sgcHJveHlfY2VydF9leHQgXQorIyBUaGVzZSBleHRlbnNpb25zIHNob3VsZCBiZSBhZGRlZCB3aGVuIGNyZWF0aW5nIGEgcHJveHkgY2VydGlmaWNhdGUKKworIyBUaGlzIGdvZXMgYWdhaW5zdCBQS0lYIGd1aWRlbGluZXMgYnV0IHNvbWUgQ0FzIGRvIGl0IGFuZCBzb21lIHNvZnR3YXJlCisjIHJlcXVpcmVzIHRoaXMgdG8gYXZvaWQgaW50ZXJwcmV0aW5nIGFuIGVuZCB1c2VyIGNlcnRpZmljYXRlIGFzIGEgQ0EuCisKK2Jhc2ljQ29uc3RyYWludHM9Q0E6RkFMU0UKKworIyBIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHRoZSB1c2FnZSBvZiBuc0NlcnRUeXBlLiBJZiBpdCBpcyBvbWl0dGVkCisjIHRoZSBjZXJ0aWZpY2F0ZSBjYW4gYmUgdXNlZCBmb3IgYW55dGhpbmcgKmV4Y2VwdCogb2JqZWN0IHNpZ25pbmcuCisKKyMgVGhpcyBpcyBPSyBmb3IgYW4gU1NMIHNlcnZlci4KKyMgbnNDZXJ0VHlwZQkJCT0gc2VydmVyCisKKyMgRm9yIGFuIG9iamVjdCBzaWduaW5nIGNlcnRpZmljYXRlIHRoaXMgd291bGQgYmUgdXNlZC4KKyMgbnNDZXJ0VHlwZSA9IG9ianNpZ24KKworIyBGb3Igbm9ybWFsIGNsaWVudCB1c2UgdGhpcyBpcyB0eXBpY2FsCisjIG5zQ2VydFR5cGUgPSBjbGllbnQsIGVtYWlsCisKKyMgYW5kIGZvciBldmVyeXRoaW5nIGluY2x1ZGluZyBvYmplY3Qgc2lnbmluZzoKKyMgbnNDZXJ0VHlwZSA9IGNsaWVudCwgZW1haWwsIG9ianNpZ24KKworIyBUaGlzIGlzIHR5cGljYWwgaW4ga2V5VXNhZ2UgZm9yIGEgY2xpZW50IGNlcnRpZmljYXRlLgorIyBrZXlVc2FnZSA9IG5vblJlcHVkaWF0aW9uLCBkaWdpdGFsU2lnbmF0dXJlLCBrZXlFbmNpcGhlcm1lbnQKKworIyBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGluIE5ldHNjYXBlJ3MgY29tbWVudCBsaXN0Ym94LgorbnNDb21tZW50CQkJPSAiT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUiCisKKyMgUEtJWCByZWNvbW1lbmRhdGlvbnMgaGFybWxlc3MgaWYgaW5jbHVkZWQgaW4gYWxsIGNlcnRpZmljYXRlcy4KK3N1YmplY3RLZXlJZGVudGlmaWVyPWhhc2gKK2F1dGhvcml0eUtleUlkZW50aWZpZXI9a2V5aWQsaXNzdWVyCisKKyMgVGhpcyBzdHVmZiBpcyBmb3Igc3ViamVjdEFsdE5hbWUgYW5kIGlzc3VlckFsdG5hbWUuCisjIEltcG9ydCB0aGUgZW1haWwgYWRkcmVzcy4KKyMgc3ViamVjdEFsdE5hbWU9ZW1haWw6Y29weQorIyBBbiBhbHRlcm5hdGl2ZSB0byBwcm9kdWNlIGNlcnRpZmljYXRlcyB0aGF0IGFyZW4ndAorIyBkZXByZWNhdGVkIGFjY29yZGluZyB0byBQS0lYLgorIyBzdWJqZWN0QWx0TmFtZT1lbWFpbDptb3ZlCisKKyMgQ29weSBzdWJqZWN0IGRldGFpbHMKKyMgaXNzdWVyQWx0TmFtZT1pc3N1ZXI6Y29weQorCisjbnNDYVJldm9jYXRpb25VcmwJCT0gaHR0cDovL3d3dy5kb21haW4uZG9tL2NhLWNybC5wZW0KKyNuc0Jhc2VVcmwKKyNuc1Jldm9jYXRpb25VcmwKKyNuc1JlbmV3YWxVcmwKKyNuc0NhUG9saWN5VXJsCisjbnNTc2xTZXJ2ZXJOYW1lCisKKyMgVGhpcyByZWFsbHkgbmVlZHMgdG8gYmUgaW4gcGxhY2UgZm9yIGl0IHRvIGJlIGEgcHJveHkgY2VydGlmaWNhdGUuCitwcm94eUNlcnRJbmZvPWNyaXRpY2FsLGxhbmd1YWdlOmlkLXBwbC1hbnlMYW5ndWFnZSxwYXRobGVuOjMscG9saWN5OmZvbworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworWyB0c2EgXQorCitkZWZhdWx0X3RzYSA9IHRzYV9jb25maWcxCSMgdGhlIGRlZmF1bHQgVFNBIHNlY3Rpb24KKworWyB0c2FfY29uZmlnMSBdCisKKyMgVGhlc2UgYXJlIHVzZWQgYnkgdGhlIFRTQSByZXBseSBnZW5lcmF0aW9uIG9ubHkuCitkaXIJCT0gLi9kZW1vQ0EJCSMgVFNBIHJvb3QgZGlyZWN0b3J5CitzZXJpYWwJCT0gJGRpci90c2FzZXJpYWwJIyBUaGUgY3VycmVudCBzZXJpYWwgbnVtYmVyIChtYW5kYXRvcnkpCitjcnlwdG9fZGV2aWNlCT0gYnVpbHRpbgkJIyBPcGVuU1NMIGVuZ2luZSB0byB1c2UgZm9yIHNpZ25pbmcKK3NpZ25lcl9jZXJ0CT0gJGRpci90c2FjZXJ0LnBlbSAJIyBUaGUgVFNBIHNpZ25pbmcgY2VydGlmaWNhdGUKKwkJCQkJIyAob3B0aW9uYWwpCitjZXJ0cwkJPSAkZGlyL2NhY2VydC5wZW0JIyBDZXJ0aWZpY2F0ZSBjaGFpbiB0byBpbmNsdWRlIGluIHJlcGx5CisJCQkJCSMgKG9wdGlvbmFsKQorc2lnbmVyX2tleQk9ICRkaXIvcHJpdmF0ZS90c2FrZXkucGVtICMgVGhlIFRTQSBwcml2YXRlIGtleSAob3B0aW9uYWwpCisKK2RlZmF1bHRfcG9saWN5CT0gdHNhX3BvbGljeTEJCSMgUG9saWN5IGlmIHJlcXVlc3QgZGlkIG5vdCBzcGVjaWZ5IGl0CisJCQkJCSMgKG9wdGlvbmFsKQorb3RoZXJfcG9saWNpZXMJPSB0c2FfcG9saWN5MiwgdHNhX3BvbGljeTMJIyBhY2NlcHRhYmxlIHBvbGljaWVzIChvcHRpb25hbCkKK2RpZ2VzdHMJCT0gbWQ1LCBzaGExCQkjIEFjY2VwdGFibGUgbWVzc2FnZSBkaWdlc3RzIChtYW5kYXRvcnkpCithY2N1cmFjeQk9IHNlY3M6MSwgbWlsbGlzZWNzOjUwMCwgbWljcm9zZWNzOjEwMAkjIChvcHRpb25hbCkKK2Nsb2NrX3ByZWNpc2lvbl9kaWdpdHMgID0gMAkjIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgZG90LiAob3B0aW9uYWwpCitvcmRlcmluZwkJPSB5ZXMJIyBJcyBvcmRlcmluZyBkZWZpbmVkIGZvciB0aW1lc3RhbXBzPworCQkJCSMgKG9wdGlvbmFsLCBkZWZhdWx0OiBubykKK3RzYV9uYW1lCQk9IHllcwkjIE11c3QgdGhlIFRTQSBuYW1lIGJlIGluY2x1ZGVkIGluIHRoZSByZXBseT8KKwkJCQkjIChvcHRpb25hbCwgZGVmYXVsdDogbm8pCitlc3NfY2VydF9pZF9jaGFpbgk9IG5vCSMgTXVzdCB0aGUgRVNTIGNlcnQgaWQgY2hhaW4gYmUgaW5jbHVkZWQ/CisJCQkJIyAob3B0aW9uYWwsIGRlZmF1bHQ6IG5vKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9wYXNzd2QuYyBiL2xpYi9vcGVuc3NsL2FwcHMvcGFzc3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhMjVkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvcGFzc3dkLmMKQEAgLTAsMCArMSw1MTIgQEAKKy8qIGFwcHMvcGFzc3dkLmMgKi8KKworI2lmIGRlZmluZWQgT1BFTlNTTF9OT19NRDUgfHwgZGVmaW5lZCBDSEFSU0VUX0VCQ0RJQworIyBkZWZpbmUgTk9fTUQ1Q1JZUFRfMQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0RFUykgfHwgIWRlZmluZWQoTk9fTUQ1Q1JZUFRfMSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXBwcy5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisjIGluY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjZW5kaWYKKyNpZm5kZWYgTk9fTUQ1Q1JZUFRfMQorIyBpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2VuZGlmCisKKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRyBwYXNzd2RfbWFpbgorCisKK3N0YXRpYyB1bnNpZ25lZCBjb25zdCBjaGFyIGNvdl8yY2hhcls2NF09eworCS8qIGZyb20gY3J5cHRvL2Rlcy9mY3J5cHQuYyAqLworCTB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKKwkweDM2LDB4MzcsMHgzOCwweDM5LDB4NDEsMHg0MiwweDQzLDB4NDQsCisJMHg0NSwweDQ2LDB4NDcsMHg0OCwweDQ5LDB4NEEsMHg0QiwweDRDLAorCTB4NEQsMHg0RSwweDRGLDB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NCwKKwkweDU1LDB4NTYsMHg1NywweDU4LDB4NTksMHg1QSwweDYxLDB4NjIsCisJMHg2MywweDY0LDB4NjUsMHg2NiwweDY3LDB4NjgsMHg2OSwweDZBLAorCTB4NkIsMHg2QywweDZELDB4NkUsMHg2RiwweDcwLDB4NzEsMHg3MiwKKwkweDczLDB4NzQsMHg3NSwweDc2LDB4NzcsMHg3OCwweDc5LDB4N0EKK307CisKK3N0YXRpYyBpbnQgZG9fcGFzc3dkKGludCBwYXNzZWRfc2FsdCwgY2hhciAqKnNhbHRfcCwgY2hhciAqKnNhbHRfbWFsbG9jX3AsCisJY2hhciAqcGFzc3dkLCBCSU8gKm91dCwgaW50IHF1aWV0LCBpbnQgdGFibGUsIGludCByZXZlcnNlLAorCXNpemVfdCBwd19tYXhsZW4sIGludCB1c2VjcnlwdCwgaW50IHVzZTEsIGludCB1c2VhcHIxKTsKKworLyogLWNyeXB0ICAgICAgICAtIHN0YW5kYXJkIFVuaXggcGFzc3dvcmQgYWxnb3JpdGhtIChkZWZhdWx0KQorICogLTEgICAgICAgICAgICAtIE1ENS1iYXNlZCBwYXNzd29yZCBhbGdvcml0aG0KKyAqIC1hcHIxICAgICAgICAgLSBNRDUtYmFzZWQgcGFzc3dvcmQgYWxnb3JpdGhtLCBBcGFjaGUgdmFyaWFudAorICogLXNhbHQgc3RyaW5nICAtIHNhbHQKKyAqIC1pbiBmaWxlICAgICAgLSByZWFkIHBhc3N3b3JkcyBmcm9tIGZpbGUKKyAqIC1zdGRpbiAgICAgICAgLSByZWFkIHBhc3N3b3JkcyBmcm9tIHN0ZGluCisgKiAtbm92ZXJpZnkgICAgIC0gbmV2ZXIgdmVyaWZ5IHdoZW4gcmVhZGluZyBwYXNzd29yZCBmcm9tIHRlcm1pbmFsCisgKiAtcXVpZXQgICAgICAgIC0gbm8gd2FybmluZ3MKKyAqIC10YWJsZSAgICAgICAgLSBmb3JtYXQgb3V0cHV0IGFzIHRhYmxlCisgKiAtcmV2ZXJzZSAgICAgIC0gc3dpdGNoIHRhYmxlIGNvbHVtbnMKKyAqLworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCWludCByZXQgPSAxOworCWNoYXIgKmluZmlsZSA9IE5VTEw7CisJaW50IGluX3N0ZGluID0gMDsKKwlpbnQgaW5fbm92ZXJpZnkgPSAwOworCWNoYXIgKnNhbHQgPSBOVUxMLCAqcGFzc3dkID0gTlVMTCwgKipwYXNzd2RzID0gTlVMTDsKKwljaGFyICpzYWx0X21hbGxvYyA9IE5VTEwsICpwYXNzd2RfbWFsbG9jID0gTlVMTDsKKwlzaXplX3QgcGFzc3dkX21hbGxvY19zaXplID0gMDsKKwlpbnQgcHdfc291cmNlX2RlZmluZWQgPSAwOworCUJJTyAqaW4gPSBOVUxMLCAqb3V0ID0gTlVMTDsKKwlpbnQgaSwgYmFkb3B0LCBvcHRfZG9uZTsKKwlpbnQgcGFzc2VkX3NhbHQgPSAwLCBxdWlldCA9IDAsIHRhYmxlID0gMCwgcmV2ZXJzZSA9IDA7CisJaW50IHVzZWNyeXB0ID0gMCwgdXNlMSA9IDAsIHVzZWFwcjEgPSAwOworCXNpemVfdCBwd19tYXhsZW4gPSAwOworCisJYXBwc19zdGFydHVwKCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQlpZiAoKGJpb19lcnI9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fZXJyLHN0ZGVycixCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVycjsKKwlvdXQgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKG91dCA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlCSU9fc2V0X2ZwKG91dCwgc3Rkb3V0LCBCSU9fTk9DTE9TRSB8IEJJT19GUF9URVhUKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwl7CisJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCX0KKyNlbmRpZgorCisJYmFkb3B0ID0gMCwgb3B0X2RvbmUgPSAwOworCWkgPSAwOworCXdoaWxlICghYmFkb3B0ICYmICFvcHRfZG9uZSAmJiBhcmd2WysraV0gIT0gTlVMTCkKKwkJeworCQlpZiAoc3RyY21wKGFyZ3ZbaV0sICItY3J5cHQiKSA9PSAwKQorCQkJdXNlY3J5cHQgPSAxOworCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi0xIikgPT0gMCkKKwkJCXVzZTEgPSAxOworCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1hcHIxIikgPT0gMCkKKwkJCXVzZWFwcjEgPSAxOworCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1zYWx0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgoYXJndltpKzFdICE9IE5VTEwpICYmIChzYWx0ID09IE5VTEwpKQorCQkJCXsKKwkJCQlwYXNzZWRfc2FsdCA9IDE7CisJCQkJc2FsdCA9IGFyZ3ZbKytpXTsKKwkJCQl9CisJCQllbHNlCisJCQkJYmFkb3B0ID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKChhcmd2W2krMV0gIT0gTlVMTCkgJiYgIXB3X3NvdXJjZV9kZWZpbmVkKQorCQkJCXsKKwkJCQlwd19zb3VyY2VfZGVmaW5lZCA9IDE7CisJCQkJaW5maWxlID0gYXJndlsrK2ldOworCQkJCX0KKwkJCWVsc2UKKwkJCQliYWRvcHQgPSAxOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1zdGRpbiIpID09IDApCisJCQl7CisJCQlpZiAoIXB3X3NvdXJjZV9kZWZpbmVkKQorCQkJCXsKKwkJCQlwd19zb3VyY2VfZGVmaW5lZCA9IDE7CisJCQkJaW5fc3RkaW4gPSAxOworCQkJCX0KKwkJCWVsc2UKKwkJCQliYWRvcHQgPSAxOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1ub3ZlcmlmeSIpID09IDApCisJCQlpbl9ub3ZlcmlmeSA9IDE7CisJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCAiLXF1aWV0IikgPT0gMCkKKwkJCXF1aWV0ID0gMTsKKwkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItdGFibGUiKSA9PSAwKQorCQkJdGFibGUgPSAxOworCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1yZXZlcnNlIikgPT0gMCkKKwkJCXJldmVyc2UgPSAxOworCQllbHNlIGlmIChhcmd2W2ldWzBdID09ICctJykKKwkJCWJhZG9wdCA9IDE7CisJCWVsc2UgaWYgKCFwd19zb3VyY2VfZGVmaW5lZCkKKwkJCS8qIG5vbi1vcHRpb24gYXJndW1lbnRzLCB1c2UgYXMgcGFzc3dvcmRzICovCisJCQl7CisJCQlwd19zb3VyY2VfZGVmaW5lZCA9IDE7CisJCQlwYXNzd2RzID0gJmFyZ3ZbaV07CisJCQlvcHRfZG9uZSA9IDE7CisJCQl9CisJCWVsc2UKKwkJCWJhZG9wdCA9IDE7CisJCX0KKworCWlmICghdXNlY3J5cHQgJiYgIXVzZTEgJiYgIXVzZWFwcjEpIC8qIHVzZSBkZWZhdWx0ICovCisJCXVzZWNyeXB0ID0gMTsKKwlpZiAodXNlY3J5cHQgKyB1c2UxICsgdXNlYXByMSA+IDEpIC8qIGNvbmZsaWN0ICovCisJCWJhZG9wdCA9IDE7CisKKwkvKiByZWplY3QgdW5zdXBwb3J0ZWQgYWxnb3JpdGhtcyAqLworI2lmZGVmIE9QRU5TU0xfTk9fREVTCisJaWYgKHVzZWNyeXB0KSBiYWRvcHQgPSAxOworI2VuZGlmCisjaWZkZWYgTk9fTUQ1Q1JZUFRfMQorCWlmICh1c2UxIHx8IHVzZWFwcjEpIGJhZG9wdCA9IDE7CisjZW5kaWYKKworCWlmIChiYWRvcHQpIAorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIlVzYWdlOiBwYXNzd2QgW29wdGlvbnNdIFtwYXNzd29yZHNdXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAid2hlcmUgb3B0aW9ucyBhcmVcbiIpOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItY3J5cHQgICAgICAgICAgICAgc3RhbmRhcmQgVW5peCBwYXNzd29yZCBhbGdvcml0aG0gKGRlZmF1bHQpXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBOT19NRDVDUllQVF8xCisJCUJJT19wcmludGYoYmlvX2VyciwgIi0xICAgICAgICAgICAgICAgICBNRDUtYmFzZWQgcGFzc3dvcmQgYWxnb3JpdGhtXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLWFwcjEgICAgICAgICAgICAgIE1ENS1iYXNlZCBwYXNzd29yZCBhbGdvcml0aG0sIEFwYWNoZSB2YXJpYW50XG4iKTsKKyNlbmRpZgorCQlCSU9fcHJpbnRmKGJpb19lcnIsICItc2FsdCBzdHJpbmcgICAgICAgdXNlIHByb3ZpZGVkIHNhbHRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItaW4gZmlsZSAgICAgICAgICAgcmVhZCBwYXNzd29yZHMgZnJvbSBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLXN0ZGluICAgICAgICAgICAgIHJlYWQgcGFzc3dvcmRzIGZyb20gc3RkaW5cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItbm92ZXJpZnkgICAgICAgICAgbmV2ZXIgdmVyaWZ5IHdoZW4gcmVhZGluZyBwYXNzd29yZCBmcm9tIHRlcm1pbmFsXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLXF1aWV0ICAgICAgICAgICAgIG5vIHdhcm5pbmdzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLXRhYmxlICAgICAgICAgICAgIGZvcm1hdCBvdXRwdXQgYXMgdGFibGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItcmV2ZXJzZSAgICAgICAgICAgc3dpdGNoIHRhYmxlIGNvbHVtbnNcbiIpOworCQkKKwkJZ290byBlcnI7CisJCX0KKworCWlmICgoaW5maWxlICE9IE5VTEwpIHx8IGluX3N0ZGluKQorCQl7CisJCWluID0gQklPX25ldyhCSU9fc19maWxlKCkpOworCQlpZiAoaW4gPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQlpZiAoaW5maWxlICE9IE5VTEwpCisJCQl7CisJCQlhc3NlcnQoaW5fc3RkaW4gPT0gMCk7CisJCQlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4sIGluZmlsZSkgPD0gMCkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJYXNzZXJ0KGluX3N0ZGluKTsKKwkJCUJJT19zZXRfZnAoaW4sIHN0ZGluLCBCSU9fTk9DTE9TRSk7CisJCQl9CisJCX0KKwkKKwlpZiAodXNlY3J5cHQpCisJCXB3X21heGxlbiA9IDg7CisJZWxzZSBpZiAodXNlMSB8fCB1c2VhcHIxKQorCQlwd19tYXhsZW4gPSAyNTY7IC8qIGFyYml0cmFyeSBsaW1pdCwgc2hvdWxkIGJlIGVub3VnaCBmb3IgbW9zdCBwYXNzd29yZHMgKi8KKworCWlmIChwYXNzd2RzID09IE5VTEwpCisJCXsKKwkJLyogbm8gcGFzc3dvcmRzIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKworCQlwYXNzd2RfbWFsbG9jX3NpemUgPSBwd19tYXhsZW4gKyAyOworCQkvKiBsb25nZXIgdGhhbiBuZWNlc3Nhcnkgc28gdGhhdCB3ZSBjYW4gd2FybiBhYm91dCB0cnVuY2F0aW9uICovCisJCXBhc3N3ZCA9IHBhc3N3ZF9tYWxsb2MgPSBPUEVOU1NMX21hbGxvYyhwYXNzd2RfbWFsbG9jX3NpemUpOworCQlpZiAocGFzc3dkX21hbGxvYyA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCX0KKworCWlmICgoaW4gPT0gTlVMTCkgJiYgKHBhc3N3ZHMgPT0gTlVMTCkpCisJCXsKKwkJLyogYnVpbGQgYSBudWxsLXRlcm1pbmF0ZWQgbGlzdCAqLworCQlzdGF0aWMgY2hhciAqcGFzc3dkc19zdGF0aWNbMl0gPSB7TlVMTCwgTlVMTH07CisJCQorCQlwYXNzd2RzID0gcGFzc3dkc19zdGF0aWM7CisJCWlmIChpbiA9PSBOVUxMKQorCQkJaWYgKEVWUF9yZWFkX3B3X3N0cmluZyhwYXNzd2RfbWFsbG9jLCBwYXNzd2RfbWFsbG9jX3NpemUsICJQYXNzd29yZDogIiwgIShwYXNzZWRfc2FsdCB8fCBpbl9ub3ZlcmlmeSkpICE9IDApCisJCQkJZ290byBlcnI7CisJCXBhc3N3ZHNbMF0gPSBwYXNzd2RfbWFsbG9jOworCQl9CisKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlhc3NlcnQocGFzc3dkcyAhPSBOVUxMKTsKKwkJYXNzZXJ0KCpwYXNzd2RzICE9IE5VTEwpOworCQkKKwkJZG8gLyogbG9vcCBvdmVyIGxpc3Qgb2YgcGFzc3dvcmRzICovCisJCQl7CisJCQlwYXNzd2QgPSAqcGFzc3dkcysrOworCQkJaWYgKCFkb19wYXNzd2QocGFzc2VkX3NhbHQsICZzYWx0LCAmc2FsdF9tYWxsb2MsIHBhc3N3ZCwgb3V0LAorCQkJCXF1aWV0LCB0YWJsZSwgcmV2ZXJzZSwgcHdfbWF4bGVuLCB1c2VjcnlwdCwgdXNlMSwgdXNlYXByMSkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCXdoaWxlICgqcGFzc3dkcyAhPSBOVUxMKTsKKwkJfQorCWVsc2UKKwkJLyogaW4gIT0gTlVMTCAqLworCQl7CisJCWludCBkb25lOworCisJCWFzc2VydCAocGFzc3dkICE9IE5VTEwpOworCQlkbworCQkJeworCQkJaW50IHIgPSBCSU9fZ2V0cyhpbiwgcGFzc3dkLCBwd19tYXhsZW4gKyAxKTsKKwkJCWlmIChyID4gMCkKKwkJCQl7CisJCQkJY2hhciAqYyA9IChzdHJjaHIocGFzc3dkLCAnXG4nKSkgOworCQkJCWlmIChjICE9IE5VTEwpCisJCQkJCSpjID0gMDsgLyogdHJ1bmNhdGUgYXQgbmV3bGluZSAqLworCQkJCWVsc2UKKwkJCQkJeworCQkJCQkvKiBpZ25vcmUgcmVzdCBvZiBsaW5lICovCisJCQkJCWNoYXIgdHJhc2hbQlVGU0laXTsKKwkJCQkJZG8KKwkJCQkJCXIgPSBCSU9fZ2V0cyhpbiwgdHJhc2gsIHNpemVvZiB0cmFzaCk7CisJCQkJCXdoaWxlICgociA+IDApICYmICghc3RyY2hyKHRyYXNoLCAnXG4nKSkpOworCQkJCQl9CisJCQkJCisJCQkJaWYgKCFkb19wYXNzd2QocGFzc2VkX3NhbHQsICZzYWx0LCAmc2FsdF9tYWxsb2MsIHBhc3N3ZCwgb3V0LAorCQkJCQlxdWlldCwgdGFibGUsIHJldmVyc2UsIHB3X21heGxlbiwgdXNlY3J5cHQsIHVzZTEsIHVzZWFwcjEpKQorCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlkb25lID0gKHIgPD0gMCk7CisJCQl9CisJCXdoaWxlICghZG9uZSk7CisJCX0KKwlyZXQgPSAwOworCitlcnI6CisJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwlpZiAoc2FsdF9tYWxsb2MpCisJCU9QRU5TU0xfZnJlZShzYWx0X21hbGxvYyk7CisJaWYgKHBhc3N3ZF9tYWxsb2MpCisJCU9QRU5TU0xfZnJlZShwYXNzd2RfbWFsbG9jKTsKKwlpZiAoaW4pCisJCUJJT19mcmVlKGluKTsKKwlpZiAob3V0KQorCQlCSU9fZnJlZV9hbGwob3V0KTsKKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQorCisKKyNpZm5kZWYgTk9fTUQ1Q1JZUFRfMQorLyogTUQ1LWJhc2VkIHBhc3N3b3JkIGFsZ29yaXRobSAoc2hvdWxkIHByb2JhYmx5IGJlIGF2YWlsYWJsZSBhcyBhIGxpYnJhcnkKKyAqIGZ1bmN0aW9uOyB0aGVuIHRoZSBzdGF0aWMgYnVmZmVyIHdvdWxkIG5vdCBiZSBhY2NlcHRhYmxlKS4KKyAqIEZvciBtYWdpYyBzdHJpbmcgIjEiLCB0aGlzIHNob3VsZCBiZSBjb21wYXRpYmxlIHRvIHRoZSBNRDUtYmFzZWQgQlNECisgKiBwYXNzd29yZCBhbGdvcml0aG0uCisgKiBGb3IgJ21hZ2ljJyBzdHJpbmcgImFwcjEiLCB0aGlzIGlzIGNvbXBhdGlibGUgdG8gdGhlIE1ENS1iYXNlZCBBcGFjaGUKKyAqIHBhc3N3b3JkIGFsZ29yaXRobS4KKyAqIChBcHBhcmVudGx5LCB0aGUgQXBhY2hlIHBhc3N3b3JkIGFsZ29yaXRobSBpcyBpZGVudGljYWwgZXhjZXB0IHRoYXQgdGhlCisgKiAnbWFnaWMnIHN0cmluZyB3YXMgY2hhbmdlZCAtLSB0aGUgbGF6aWVzdCBhcHBsaWNhdGlvbiBvZiB0aGUgTklIIHByaW5jaXBsZQorICogSSd2ZSBldmVyIGVuY291bnRlcmVkLikKKyAqLworc3RhdGljIGNoYXIgKm1kNWNyeXB0KGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgY2hhciAqbWFnaWMsIGNvbnN0IGNoYXIgKnNhbHQpCisJeworCXN0YXRpYyBjaGFyIG91dF9idWZbNiArIDkgKyAyNCArIDJdOyAvKiAiJGFwcjEkLi5zYWx0Li4kLi4uLi4uLm1kNWhhc2guLi4uLi4uLi4uXDAiICovCisJdW5zaWduZWQgY2hhciBidWZbTUQ1X0RJR0VTVF9MRU5HVEhdOworCWNoYXIgKnNhbHRfb3V0OworCWludCBuOworCXVuc2lnbmVkIGludCBpOworCUVWUF9NRF9DVFggbWQsbWQyOworCXNpemVfdCBwYXNzd2RfbGVuLCBzYWx0X2xlbjsKKworCXBhc3N3ZF9sZW4gPSBzdHJsZW4ocGFzc3dkKTsKKwlvdXRfYnVmWzBdID0gJyQnOworCW91dF9idWZbMV0gPSAwOworCWFzc2VydChzdHJsZW4obWFnaWMpIDw9IDQpOyAvKiAiMSIgb3IgImFwcjEiICovCisJc3RybmNhdChvdXRfYnVmLCBtYWdpYywgNCk7CisJc3RybmNhdChvdXRfYnVmLCAiJCIsIDEpOworCXN0cm5jYXQob3V0X2J1Ziwgc2FsdCwgOCk7CisJYXNzZXJ0KHN0cmxlbihvdXRfYnVmKSA8PSA2ICsgOCk7IC8qICIkYXByMSQuLnNhbHQuLiIgKi8KKwlzYWx0X291dCA9IG91dF9idWYgKyAyICsgc3RybGVuKG1hZ2ljKTsKKwlzYWx0X2xlbiA9IHN0cmxlbihzYWx0X291dCk7CisJYXNzZXJ0KHNhbHRfbGVuIDw9IDgpOworCQorCUVWUF9NRF9DVFhfaW5pdCgmbWQpOworCUVWUF9EaWdlc3RJbml0X2V4KCZtZCxFVlBfbWQ1KCksIE5VTEwpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBwYXNzd2QsIHBhc3N3ZF9sZW4pOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCAiJCIsIDEpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBtYWdpYywgc3RybGVuKG1hZ2ljKSk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsICIkIiwgMSk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIHNhbHRfb3V0LCBzYWx0X2xlbik7CisJCisJRVZQX01EX0NUWF9pbml0KCZtZDIpOworCUVWUF9EaWdlc3RJbml0X2V4KCZtZDIsRVZQX21kNSgpLCBOVUxMKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZtZDIsIHBhc3N3ZCwgcGFzc3dkX2xlbik7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQyLCBzYWx0X291dCwgc2FsdF9sZW4pOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kMiwgcGFzc3dkLCBwYXNzd2RfbGVuKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgoJm1kMiwgYnVmLCBOVUxMKTsKKworCWZvciAoaSA9IHBhc3N3ZF9sZW47IGkgPiBzaXplb2YgYnVmOyBpIC09IHNpemVvZiBidWYpCisJCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBidWYsIHNpemVvZiBidWYpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCBidWYsIGkpOworCQorCW4gPSBwYXNzd2RfbGVuOworCXdoaWxlIChuKQorCQl7CisJCUVWUF9EaWdlc3RVcGRhdGUoJm1kLCAobiAmIDEpID8gIlwwIiA6IHBhc3N3ZCwgMSk7CisJCW4gPj49IDE7CisJCX0KKwlFVlBfRGlnZXN0RmluYWxfZXgoJm1kLCBidWYsIE5VTEwpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkJeworCQlFVlBfRGlnZXN0SW5pdF9leCgmbWQyLEVWUF9tZDUoKSwgTlVMTCk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJm1kMiwgKGkgJiAxKSA/ICh1bnNpZ25lZCBjb25zdCBjaGFyICopIHBhc3N3ZCA6IGJ1ZiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAoaSAmIDEpID8gcGFzc3dkX2xlbiA6IHNpemVvZiBidWYpOworCQlpZiAoaSAlIDMpCisJCQlFVlBfRGlnZXN0VXBkYXRlKCZtZDIsIHNhbHRfb3V0LCBzYWx0X2xlbik7CisJCWlmIChpICUgNykKKwkJCUVWUF9EaWdlc3RVcGRhdGUoJm1kMiwgcGFzc3dkLCBwYXNzd2RfbGVuKTsKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQyLCAoaSAmIDEpID8gYnVmIDogKHVuc2lnbmVkIGNvbnN0IGNoYXIgKikgcGFzc3dkLAorCQkgICAgICAgICAgICAgICAgICAgICAgIChpICYgMSkgPyBzaXplb2YgYnVmIDogcGFzc3dkX2xlbik7CisJCUVWUF9EaWdlc3RGaW5hbF9leCgmbWQyLCBidWYsIE5VTEwpOworCQl9CisJRVZQX01EX0NUWF9jbGVhbnVwKCZtZDIpOworCQorCSB7CisJCS8qIHRyYW5zZm9ybSBidWYgaW50byBvdXRwdXQgc3RyaW5nICovCisJCisJCXVuc2lnbmVkIGNoYXIgYnVmX3Blcm1bc2l6ZW9mIGJ1Zl07CisJCWludCBkZXN0LCBzb3VyY2U7CisJCWNoYXIgKm91dHB1dDsKKworCQkvKiBzaWxseSBvdXRwdXQgcGVybXV0YXRpb24gKi8KKwkJZm9yIChkZXN0ID0gMCwgc291cmNlID0gMDsgZGVzdCA8IDE0OyBkZXN0KyssIHNvdXJjZSA9IChzb3VyY2UgKyA2KSAlIDE3KQorCQkJYnVmX3Blcm1bZGVzdF0gPSBidWZbc291cmNlXTsKKwkJYnVmX3Blcm1bMTRdID0gYnVmWzVdOworCQlidWZfcGVybVsxNV0gPSBidWZbMTFdOworI2lmbmRlZiBQRURBTlRJQyAvKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGdlbmVyYXRlcyBhICJubyBlZmZlY3QiIHdhcm5pbmcgKi8KKwkJYXNzZXJ0KDE2ID09IHNpemVvZiBidWZfcGVybSk7CisjZW5kaWYKKwkJCisJCW91dHB1dCA9IHNhbHRfb3V0ICsgc2FsdF9sZW47CisJCWFzc2VydChvdXRwdXQgPT0gb3V0X2J1ZiArIHN0cmxlbihvdXRfYnVmKSk7CisJCQorCQkqb3V0cHV0KysgPSAnJCc7CisKKwkJZm9yIChpID0gMDsgaSA8IDE1OyBpICs9IDMpCisJCQl7CisJCQkqb3V0cHV0KysgPSBjb3ZfMmNoYXJbYnVmX3Blcm1baSsyXSAmIDB4M2ZdOworCQkJKm91dHB1dCsrID0gY292XzJjaGFyWygoYnVmX3Blcm1baSsxXSAmIDB4ZikgPDwgMikgfAorCQkJCSAgICAgICAgICAgICAgICAgIChidWZfcGVybVtpKzJdID4+IDYpXTsKKwkJCSpvdXRwdXQrKyA9IGNvdl8yY2hhclsoKGJ1Zl9wZXJtW2ldICYgMykgPDwgNCkgfAorCQkJCSAgICAgICAgICAgICAgICAgIChidWZfcGVybVtpKzFdID4+IDQpXTsKKwkJCSpvdXRwdXQrKyA9IGNvdl8yY2hhcltidWZfcGVybVtpXSA+PiAyXTsKKwkJCX0KKwkJYXNzZXJ0KGkgPT0gMTUpOworCQkqb3V0cHV0KysgPSBjb3ZfMmNoYXJbYnVmX3Blcm1baV0gJiAweDNmXTsKKwkJKm91dHB1dCsrID0gY292XzJjaGFyW2J1Zl9wZXJtW2ldID4+IDZdOworCQkqb3V0cHV0ID0gMDsKKwkJYXNzZXJ0KHN0cmxlbihvdXRfYnVmKSA8IHNpemVvZihvdXRfYnVmKSk7CisJIH0KKwlFVlBfTURfQ1RYX2NsZWFudXAoJm1kKTsKKworCXJldHVybiBvdXRfYnVmOworCX0KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgZG9fcGFzc3dkKGludCBwYXNzZWRfc2FsdCwgY2hhciAqKnNhbHRfcCwgY2hhciAqKnNhbHRfbWFsbG9jX3AsCisJY2hhciAqcGFzc3dkLCBCSU8gKm91dCwJaW50IHF1aWV0LCBpbnQgdGFibGUsIGludCByZXZlcnNlLAorCXNpemVfdCBwd19tYXhsZW4sIGludCB1c2VjcnlwdCwgaW50IHVzZTEsIGludCB1c2VhcHIxKQorCXsKKwljaGFyICpoYXNoID0gTlVMTDsKKworCWFzc2VydChzYWx0X3AgIT0gTlVMTCk7CisJYXNzZXJ0KHNhbHRfbWFsbG9jX3AgIT0gTlVMTCk7CisKKwkvKiBmaXJzdCBtYWtlIHN1cmUgd2UgaGF2ZSBhIHNhbHQgKi8KKwlpZiAoIXBhc3NlZF9zYWx0KQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJCWlmICh1c2VjcnlwdCkKKwkJCXsKKwkJCWlmICgqc2FsdF9tYWxsb2NfcCA9PSBOVUxMKQorCQkJCXsKKwkJCQkqc2FsdF9wID0gKnNhbHRfbWFsbG9jX3AgPSBPUEVOU1NMX21hbGxvYygzKTsKKwkJCQlpZiAoKnNhbHRfbWFsbG9jX3AgPT0gTlVMTCkKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKCh1bnNpZ25lZCBjaGFyICopKnNhbHRfcCwgMikgPCAwKQorCQkJCWdvdG8gZXJyOworCQkJKCpzYWx0X3ApWzBdID0gY292XzJjaGFyWygqc2FsdF9wKVswXSAmIDB4M2ZdOyAvKiA2IGJpdHMgKi8KKwkJCSgqc2FsdF9wKVsxXSA9IGNvdl8yY2hhclsoKnNhbHRfcClbMV0gJiAweDNmXTsgLyogNiBiaXRzICovCisJCQkoKnNhbHRfcClbMl0gPSAwOworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCQlhc2NpaTJlYmNkaWMoKnNhbHRfcCwgKnNhbHRfcCwgMik7IC8qIGRlc19jcnlwdCB3aWxsIGNvbnZlcnQKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmFjayB0byBBU0NJSSAqLworI2VuZGlmCisJCQl9CisjZW5kaWYgLyogIU9QRU5TU0xfTk9fREVTICovCisKKyNpZm5kZWYgTk9fTUQ1Q1JZUFRfMQorCQlpZiAodXNlMSB8fCB1c2VhcHIxKQorCQkJeworCQkJaW50IGk7CisJCQkKKwkJCWlmICgqc2FsdF9tYWxsb2NfcCA9PSBOVUxMKQorCQkJCXsKKwkJCQkqc2FsdF9wID0gKnNhbHRfbWFsbG9jX3AgPSBPUEVOU1NMX21hbGxvYyg5KTsKKwkJCQlpZiAoKnNhbHRfbWFsbG9jX3AgPT0gTlVMTCkKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKCh1bnNpZ25lZCBjaGFyICopKnNhbHRfcCwgOCkgPCAwKQorCQkJCWdvdG8gZXJyOworCQkJCisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJCSgqc2FsdF9wKVtpXSA9IGNvdl8yY2hhclsoKnNhbHRfcClbaV0gJiAweDNmXTsgLyogNiBiaXRzICovCisJCQkoKnNhbHRfcClbOF0gPSAwOworCQkJfQorI2VuZGlmIC8qICFOT19NRDVDUllQVF8xICovCisJCX0KKwkKKwlhc3NlcnQoKnNhbHRfcCAhPSBOVUxMKTsKKwkKKwkvKiB0cnVuY2F0ZSBwYXNzd29yZCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoKHN0cmxlbihwYXNzd2QpID4gcHdfbWF4bGVuKSkKKwkJeworCQlpZiAoIXF1aWV0KQorCQkJLyogWFhYOiByZWFsbHkgd2Ugc2hvdWxkIGtub3cgaG93IHRvIHByaW50IGEgc2l6ZV90LCBub3QgY2FzdCBpdCAqLworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiV2FybmluZzogdHJ1bmNhdGluZyBwYXNzd29yZCB0byAldSBjaGFyYWN0ZXJzXG4iLCAodW5zaWduZWQpcHdfbWF4bGVuKTsKKwkJcGFzc3dkW3B3X21heGxlbl0gPSAwOworCQl9CisJYXNzZXJ0KHN0cmxlbihwYXNzd2QpIDw9IHB3X21heGxlbik7CisJCisJLyogbm93IGNvbXB1dGUgcGFzc3dvcmQgaGFzaCAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCWlmICh1c2VjcnlwdCkKKwkJaGFzaCA9IERFU19jcnlwdChwYXNzd2QsICpzYWx0X3ApOworI2VuZGlmCisjaWZuZGVmIE5PX01ENUNSWVBUXzEKKwlpZiAodXNlMSB8fCB1c2VhcHIxKQorCQloYXNoID0gbWQ1Y3J5cHQocGFzc3dkLCAodXNlMSA/ICIxIiA6ICJhcHIxIiksICpzYWx0X3ApOworI2VuZGlmCisJYXNzZXJ0KGhhc2ggIT0gTlVMTCk7CisKKwlpZiAodGFibGUgJiYgIXJldmVyc2UpCisJCUJJT19wcmludGYob3V0LCAiJXNcdCVzXG4iLCBwYXNzd2QsIGhhc2gpOworCWVsc2UgaWYgKHRhYmxlICYmIHJldmVyc2UpCisJCUJJT19wcmludGYob3V0LCAiJXNcdCVzXG4iLCBoYXNoLCBwYXNzd2QpOworCWVsc2UKKwkJQklPX3ByaW50ZihvdXQsICIlc1xuIiwgaGFzaCk7CisJcmV0dXJuIDE7CisJCitlcnI6CisJcmV0dXJuIDA7CisJfQorI2Vsc2UKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlmcHV0cygiUHJvZ3JhbSBub3QgYXZhaWxhYmxlLlxuIiwgc3RkZXJyKQorCU9QRU5TU0xfRVhJVCgxKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcGNhLWNlcnQuc3JsIGIvbGliL29wZW5zc2wvYXBwcy9wY2EtY2VydC5zcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM3NDU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvcGNhLWNlcnQuc3JsCkBAIC0wLDAgKzEgQEAKKzA3CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3BjYS1rZXkucGVtIGIvbGliL29wZW5zc2wvYXBwcy9wY2Eta2V5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDAyOWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9wY2Eta2V5LnBlbQpAQCAtMCwwICsxLDE1IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWEFJQkFBS0JnUUNkb1drLzMrV2NNbGZqSXJrZzQwa2V0bW5RYUVvZ1FlMUxMY3VPSlY2cktmVVNBc1BnCit3Z3NhYkovd244VHhBMXl5M2VLSmJGbDNPaVVYTVJzcDIySnA4NVBtZW1pRHp5VUlTdHdrNzJxaHAxaW1iQU5aCit2bG1sQ0ZLaVFyalV5dURmdTRUQUJtbitra3QzdlIxWUJFT0d0K0lGeWUxVUJWU0FUVmRSSjJVVmh3SURBUUFCCitBb0dBYmE0ZlR0dWFwNWw3Lzhac2JFN1oxTzMyS0pZNFpjT1p1a0xPTFVVaFh4WGR1VCtGVGdHV3VqYzAvcmdjCit6OXFZQ0xsTlpIT291TVlUZ3RTZll2dU11TFoxMVZJdDBHWUgrblJpb0xTaEU1OVl5K3pDUnlDK2dQaWdTMWt6Cit4dm8xNEFzT0lQWVYxNFRrL1NzSHlxNkUwZVRrN1Z6YUlFMTk3Z2lpSU5VRVJQRUNRUURTS210UFRoL2xSS3c3CitIU1pTTTBJMW1GV24vMXpxckFib250UlFZNXc5OFFXSU9lNXFtell5RmJQWFlUM2Q5Qnpsc015aGdpUk5vQmJECit5dm9oU0hYSkFrRUF3QUh4NmV6QVplV1d6RDV5WEQzNm55anBrVkN3N1RrN1RTbU9jZUxKTVd0MVFjckNmcWxTCit4QTVqanBRNlo4c3VVNURkdFdBcnlNMnNBaXIxV2lzWXp3SkFkNlpjeDU2anZBUTN4Y1BYc0U2c2NCVFZGenJqCis3RnFaNkUrY2NsUHpmTFErUVFzeU9CRTdicEk2ZS9GSnBwWTI2WEdaWG8zWUd6VjhJR1hydDQwb09RSkFMRVRHCitoODZFRlhvM3FHT0ZibXNEeTRwZFA1bkJFUkN1OFgxeFVDU2ZpbnRpRDRjMkRJbnhnUzVvR2NsbkplTWNqVHZMCitRalFvSkNYM1VKQ2kvT1VPMVFKQkFLZ2NESFdqTXZ0K2wxcGpKQnNTRVowSFg5QUFJSVZ4MFJRbWJGR1MrRjJRCitoaHU1bDc3V25uWk9ROXZ2aFY1dTdOUENVRjluaFUzamg2MHFXV084bWtjPQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcGNhLXJlcS5wZW0gYi9saWIvb3BlbnNzbC9hcHBzL3BjYS1yZXEucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjE1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3BjYS1yZXEucGVtCkBAIC0wLDAgKzEsMTEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCitNSUlCbWpDQ0FRTUNBUUF3WERFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbEYxWldWdWMyeGhibVF4CitHakFZQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNUnd3R2dZRFZRUURFeE5VWlhOMElGQkRRU0FvCitNVEF5TkNCaWFYUXBNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUNkb1drLzMrV2NNbGZqCitJcmtnNDBrZXRtblFhRW9nUWUxTExjdU9KVjZyS2ZVU0FzUGd3Z3NhYkovd244VHhBMXl5M2VLSmJGbDNPaVVYCitNUnNwMjJKcDg1UG1lbWlEenlVSVN0d2s3MnFocDFpbWJBTlp2bG1sQ0ZLaVFyalV5dURmdTRUQUJtbitra3QzCit2UjFZQkVPR3QrSUZ5ZTFVQlZTQVRWZFJKMlVWaHdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBRXp6CitJRzhObmZwblBUUVNDTjV6SmhPZnk2cDlBY0R5UXp1SmlyWXYxSFIvcW9ZV2FsUGgvVTJ1aUswbEFpbTdxTWN2Cit3T2xLM0k3QThCNy80ZExxdklxZ3RVajliMVdUOHpJcm53ZHZKSTRvc0xJMkJZK2MxcFZscDE3NERITE1vbDFMCitDbDFlM041QlRtN2xDaXRUWWp1VWhzdzZoaUE4SWNkTktEbzZza3RWCistLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcGtjczEyLmMgYi9saWIvb3BlbnNzbC9hcHBzL3BrY3MxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNGEwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3BrY3MxMi5jCkBAIC0wLDAgKzEsOTc3IEBACisvKiBwa2NzMTIuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0RFUykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEExKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KKworI2RlZmluZSBQUk9HIHBrY3MxMl9tYWluCisKK2NvbnN0IEVWUF9DSVBIRVIgKmVuYzsKKworCisjZGVmaW5lIE5PS0VZUwkJMHgxCisjZGVmaW5lIE5PQ0VSVFMgCTB4MgorI2RlZmluZSBJTkZPCQkweDQKKyNkZWZpbmUgQ0xDRVJUUwkJMHg4CisjZGVmaW5lIENBQ0VSVFMJCTB4MTAKKworaW50IGdldF9jZXJ0X2NoYWluIChYNTA5ICpjZXJ0LCBYNTA5X1NUT1JFICpzdG9yZSwgU1RBQ0tfT0YoWDUwOSkgKipjaGFpbik7CitpbnQgZHVtcF9jZXJ0c19rZXlzX3AxMihCSU8gKm91dCwgUEtDUzEyICpwMTIsIGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLCBpbnQgb3B0aW9ucywgY2hhciAqcGVtcGFzcyk7CitpbnQgZHVtcF9jZXJ0c19wa2V5c19iYWdzKEJJTyAqb3V0LCBTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKmJhZ3MsIGNoYXIgKnBhc3MsCisJCQkgIGludCBwYXNzbGVuLCBpbnQgb3B0aW9ucywgY2hhciAqcGVtcGFzcyk7CitpbnQgZHVtcF9jZXJ0c19wa2V5c19iYWcoQklPICpvdXQsIFBLQ1MxMl9TQUZFQkFHICpiYWdzLCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwgaW50IG9wdGlvbnMsIGNoYXIgKnBlbXBhc3MpOworaW50IHByaW50X2F0dHJpYnMoQklPICpvdXQsIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqYXR0cmxzdCxjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgaGV4X3ByaW4oQklPICpvdXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7CitpbnQgYWxnX3ByaW50KEJJTyAqeCwgWDUwOV9BTEdPUiAqYWxnKTsKK2ludCBjZXJ0X2xvYWQoQklPICppbiwgU1RBQ0tfT0YoWDUwOSkgKnNrKTsKK3N0YXRpYyBpbnQgc2V0X3BiZShCSU8gKmVyciwgaW50ICpwcGJlLCBjb25zdCBjaGFyICpzdHIpOworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgRU5HSU5FICplID0gTlVMTDsKKyAgICBjaGFyICppbmZpbGU9TlVMTCwgKm91dGZpbGU9TlVMTCwgKmtleW5hbWUgPSBOVUxMOwkKKyAgICBjaGFyICpjZXJ0ZmlsZT1OVUxMOworICAgIEJJTyAqaW49TlVMTCwgKm91dCA9IE5VTEw7CisgICAgY2hhciAqKmFyZ3M7CisgICAgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgY2hhciAqY3NwX25hbWUgPSBOVUxMOworICAgIGludCBhZGRfbG1rID0gMDsKKyAgICBQS0NTMTIgKnAxMiA9IE5VTEw7CisgICAgY2hhciBwYXNzWzUwXSwgbWFjcGFzc1s1MF07CisgICAgaW50IGV4cG9ydF9jZXJ0ID0gMDsKKyAgICBpbnQgb3B0aW9ucyA9IDA7CisgICAgaW50IGNoYWluID0gMDsKKyAgICBpbnQgYmFkYXJnID0gMDsKKyAgICBpbnQgaXRlciA9IFBLQ1MxMl9ERUZBVUxUX0lURVI7CisgICAgaW50IG1hY2l0ZXIgPSBQS0NTMTJfREVGQVVMVF9JVEVSOworICAgIGludCB0d29wYXNzID0gMDsKKyAgICBpbnQga2V5dHlwZSA9IDA7CisgICAgaW50IGNlcnRfcGJlID0gTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQzsKKyAgICBpbnQga2V5X3BiZSA9IE5JRF9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDOworICAgIGludCByZXQgPSAxOworICAgIGludCBtYWN2ZXIgPSAxOworICAgIGludCBub3Byb21wdCA9IDA7CisgICAgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpjYW5hbWVzID0gTlVMTDsKKyAgICBjaGFyICpjcGFzcyA9IE5VTEwsICptcGFzcyA9IE5VTEw7CisgICAgY2hhciAqcGFzc2FyZ2luID0gTlVMTCwgKnBhc3NhcmdvdXQgPSBOVUxMLCAqcGFzc2FyZyA9IE5VTEw7CisgICAgY2hhciAqcGFzc2luID0gTlVMTCwgKnBhc3NvdXQgPSBOVUxMOworICAgIGNoYXIgKmlucmFuZCA9IE5VTEw7CisgICAgY2hhciAqbWFjYWxnID0gTlVMTDsKKyAgICBjaGFyICpDQXBhdGggPSBOVUxMLCAqQ0FmaWxlID0gTlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyAgICBjaGFyICplbmdpbmU9TlVMTDsKKyNlbmRpZgorCisgICAgYXBwc19zdGFydHVwKCk7CisKKyAgICBlbmMgPSBFVlBfZGVzX2VkZTNfY2JjKCk7CisgICAgaWYgKGJpb19lcnIgPT0gTlVMTCApIGJpb19lcnIgPSBCSU9fbmV3X2ZwIChzdGRlcnIsIEJJT19OT0NMT1NFKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisgICAgYXJncyA9IGFyZ3YgKyAxOworCisKKyAgICB3aGlsZSAoKmFyZ3MpIHsKKwlpZiAoKmFyZ3NbMF0gPT0gJy0nKSB7CisJCWlmICghc3RyY21wICgqYXJncywgIi1ub2tleXMiKSkgb3B0aW9ucyB8PSBOT0tFWVM7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWtleWV4IikpIGtleXR5cGUgPSBLRVlfRVg7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWtleXNpZyIpKSBrZXl0eXBlID0gS0VZX1NJRzsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9jZXJ0cyIpKSBvcHRpb25zIHw9IE5PQ0VSVFM7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWNsY2VydHMiKSkgb3B0aW9ucyB8PSBDTENFUlRTOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1jYWNlcnRzIikpIG9wdGlvbnMgfD0gQ0FDRVJUUzsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9vdXQiKSkgb3B0aW9ucyB8PSAoTk9LRVlTfE5PQ0VSVFMpOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1pbmZvIikpIG9wdGlvbnMgfD0gSU5GTzsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItY2hhaW4iKSkgY2hhaW4gPSAxOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi10d29wYXNzIikpIHR3b3Bhc3MgPSAxOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub21hY3ZlciIpKSBtYWN2ZXIgPSAwOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1kZXNjZXJ0IikpCisgICAgCQkJY2VydF9wYmUgPSBOSURfcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQzsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItZXhwb3J0IikpIGV4cG9ydF9jZXJ0ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItZGVzIikpIGVuYz1FVlBfZGVzX2NiYygpOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1kZXMzIikpIGVuYyA9IEVWUF9kZXNfZWRlM19jYmMoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWlkZWEiKSkgZW5jPUVWUF9pZGVhX2NiYygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCAiLXNlZWQiKSkgZW5jPUVWUF9zZWVkX2NiYygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1hZXMxMjgiKSkgZW5jPUVWUF9hZXNfMTI4X2NiYygpOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItYWVzMTkyIikpIGVuYz1FVlBfYWVzXzE5Ml9jYmMoKTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLWFlczI1NiIpKSBlbmM9RVZQX2Flc18yNTZfY2JjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItY2FtZWxsaWExMjgiKSkgZW5jPUVWUF9jYW1lbGxpYV8xMjhfY2JjKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1jYW1lbGxpYTE5MiIpKSBlbmM9RVZQX2NhbWVsbGlhXzE5Ml9jYmMoKTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLWNhbWVsbGlhMjU2IikpIGVuYz1FVlBfY2FtZWxsaWFfMjU2X2NiYygpOworI2VuZGlmCisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vaXRlciIpKSBpdGVyID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbWFjaXRlciIpKQorCQkJCQkgbWFjaXRlciA9IFBLQ1MxMl9ERUZBVUxUX0lURVI7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vbWFjaXRlciIpKQorCQkJCQkgbWFjaXRlciA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vbWFjIikpCisJCQkJCSBtYWNpdGVyID0gLTE7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW1hY2FsZyIpKQorCQkgICAgaWYgKGFyZ3NbMV0pIHsKKwkJCWFyZ3MrKzsJCisJCQltYWNhbGcgPSAqYXJnczsKKwkJICAgIH0gZWxzZSBiYWRhcmcgPSAxOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub2RlcyIpKSBlbmM9TlVMTDsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItY2VydHBiZSIpKSB7CisJCQlpZiAoIXNldF9wYmUoYmlvX2VyciwgJmNlcnRfcGJlLCAqKythcmdzKSkKKwkJCQliYWRhcmcgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWtleXBiZSIpKSB7CisJCQlpZiAoIXNldF9wYmUoYmlvX2VyciwgJmtleV9wYmUsICorK2FyZ3MpKQorCQkJCWJhZGFyZyA9IDE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItcmFuZCIpKSB7CisJCSAgICBpZiAoYXJnc1sxXSkgeworCQkJYXJncysrOwkKKwkJCWlucmFuZCA9ICphcmdzOworCQkgICAgfSBlbHNlIGJhZGFyZyA9IDE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItaW5rZXkiKSkgeworCQkgICAgaWYgKGFyZ3NbMV0pIHsKKwkJCWFyZ3MrKzsJCisJCQlrZXluYW1lID0gKmFyZ3M7CisJCSAgICB9IGVsc2UgYmFkYXJnID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wICgqYXJncywgIi1jZXJ0ZmlsZSIpKSB7CisJCSAgICBpZiAoYXJnc1sxXSkgeworCQkJYXJncysrOwkKKwkJCWNlcnRmaWxlID0gKmFyZ3M7CisJCSAgICB9IGVsc2UgYmFkYXJnID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wICgqYXJncywgIi1uYW1lIikpIHsKKwkJICAgIGlmIChhcmdzWzFdKSB7CisJCQlhcmdzKys7CQorCQkJbmFtZSA9ICphcmdzOworCQkgICAgfSBlbHNlIGJhZGFyZyA9IDE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItTE1LIikpCisJCQlhZGRfbG1rID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItQ1NQIikpIHsKKwkJICAgIGlmIChhcmdzWzFdKSB7CisJCQlhcmdzKys7CQorCQkJY3NwX25hbWUgPSAqYXJnczsKKwkJICAgIH0gZWxzZSBiYWRhcmcgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWNhbmFtZSIpKSB7CisJCSAgICBpZiAoYXJnc1sxXSkgeworCQkJYXJncysrOwkKKwkJCWlmICghY2FuYW1lcykgY2FuYW1lcyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKGNhbmFtZXMsICphcmdzKTsKKwkJICAgIH0gZWxzZSBiYWRhcmcgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWluIikpIHsKKwkJICAgIGlmIChhcmdzWzFdKSB7CisJCQlhcmdzKys7CQorCQkJaW5maWxlID0gKmFyZ3M7CisJCSAgICB9IGVsc2UgYmFkYXJnID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wICgqYXJncywgIi1vdXQiKSkgeworCQkgICAgaWYgKGFyZ3NbMV0pIHsKKwkJCWFyZ3MrKzsJCisJCQlvdXRmaWxlID0gKmFyZ3M7CisJCSAgICB9IGVsc2UgYmFkYXJnID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKCphcmdzLCItcGFzc2luIikpIHsKKwkJICAgIGlmIChhcmdzWzFdKSB7CisJCQlhcmdzKys7CQorCQkJcGFzc2FyZ2luID0gKmFyZ3M7CisJCSAgICB9IGVsc2UgYmFkYXJnID0gMTsKKwkJfSBlbHNlIGlmICghc3RyY21wKCphcmdzLCItcGFzc291dCIpKSB7CisJCSAgICBpZiAoYXJnc1sxXSkgeworCQkJYXJncysrOwkKKwkJCXBhc3NhcmdvdXQgPSAqYXJnczsKKwkJICAgIH0gZWxzZSBiYWRhcmcgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXBhc3N3b3JkIikpIHsKKwkJICAgIGlmIChhcmdzWzFdKSB7CisJCQlhcmdzKys7CQorCQkJcGFzc2FyZyA9ICphcmdzOworCQkgICAgCW5vcHJvbXB0ID0gMTsKKwkJICAgIH0gZWxzZSBiYWRhcmcgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1DQXBhdGgiKSkgeworCQkgICAgaWYgKGFyZ3NbMV0pIHsKKwkJCWFyZ3MrKzsJCisJCQlDQXBhdGggPSAqYXJnczsKKwkJICAgIH0gZWxzZSBiYWRhcmcgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1DQWZpbGUiKSkgeworCQkgICAgaWYgKGFyZ3NbMV0pIHsKKwkJCWFyZ3MrKzsJCisJCQlDQWZpbGUgPSAqYXJnczsKKwkJICAgIH0gZWxzZSBiYWRhcmcgPSAxOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1lbmdpbmUiKSkgeworCQkgICAgaWYgKGFyZ3NbMV0pIHsKKwkJCWFyZ3MrKzsJCisJCQllbmdpbmUgPSAqYXJnczsKKwkJICAgIH0gZWxzZSBiYWRhcmcgPSAxOworI2VuZGlmCisJCX0gZWxzZSBiYWRhcmcgPSAxOworCisJfSBlbHNlIGJhZGFyZyA9IDE7CisJYXJncysrOworICAgIH0KKworICAgIGlmIChiYWRhcmcpIHsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiVXNhZ2U6IHBrY3MxMiBbb3B0aW9uc11cbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICJ3aGVyZSBvcHRpb25zIGFyZVxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1leHBvcnQgICAgICAgb3V0cHV0IFBLQ1MxMiBmaWxlXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNoYWluICAgICAgICBhZGQgY2VydGlmaWNhdGUgY2hhaW5cbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItaW5rZXkgZmlsZSAgIHByaXZhdGUga2V5IGlmIG5vdCBpbmZpbGVcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItY2VydGZpbGUgZiAgIGFkZCBhbGwgY2VydHMgaW4gZlxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1DQXBhdGggYXJnICAgLSBQRU0gZm9ybWF0IGRpcmVjdG9yeSBvZiBDQSdzXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLUNBZmlsZSBhcmcgICAtIFBFTSBmb3JtYXQgZmlsZSBvZiBDQSdzXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5hbWUgXCJuYW1lXCIgIHVzZSBuYW1lIGFzIGZyaWVuZGx5IG5hbWVcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItY2FuYW1lIFwibm1cIiAgdXNlIG5tIGFzIENBIGZyaWVuZGx5IG5hbWUgKGNhbiBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlKS5cbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItaW4gIGluZmlsZSAgIGlucHV0IGZpbGVuYW1lXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW91dCBvdXRmaWxlICBvdXRwdXQgZmlsZW5hbWVcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItbm9vdXQgICAgICAgIGRvbid0IG91dHB1dCBhbnl0aGluZywganVzdCB2ZXJpZnkuXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vbWFjdmVyICAgICBkb24ndCB2ZXJpZnkgTUFDLlxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub2NlcnRzICAgICAgZG9uJ3Qgb3V0cHV0IGNlcnRpZmljYXRlcy5cbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItY2xjZXJ0cyAgICAgIG9ubHkgb3V0cHV0IGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNhY2VydHMgICAgICBvbmx5IG91dHB1dCBDQSBjZXJ0aWZpY2F0ZXMuXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5va2V5cyAgICAgICBkb24ndCBvdXRwdXQgcHJpdmF0ZSBrZXlzLlxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1pbmZvICAgICAgICAgZ2l2ZSBpbmZvIGFib3V0IFBLQ1MjMTIgc3RydWN0dXJlLlxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1kZXMgICAgICAgICAgZW5jcnlwdCBwcml2YXRlIGtleXMgd2l0aCBERVNcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItZGVzMyAgICAgICAgIGVuY3J5cHQgcHJpdmF0ZSBrZXlzIHdpdGggdHJpcGxlIERFUyAoZGVmYXVsdClcbiIpOworI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWlkZWEgICAgICAgICBlbmNyeXB0IHByaXZhdGUga2V5cyB3aXRoIGlkZWFcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCUJJT19wcmludGYgKGJpb19lcnIsICItc2VlZCAgICAgICAgIGVuY3J5cHQgcHJpdmF0ZSBrZXlzIHdpdGggc2VlZFxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWFlczEyOCwgLWFlczE5MiwgLWFlczI1NlxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIiAgICAgICAgICAgICAgZW5jcnlwdCBQRU0gb3V0cHV0IHdpdGggY2JjIGFlc1xuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCUJJT19wcmludGYgKGJpb19lcnIsICItY2FtZWxsaWExMjgsIC1jYW1lbGxpYTE5MiwgLWNhbWVsbGlhMjU2XG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiICAgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgY2FtZWxsaWFcbiIpOworI2VuZGlmCisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub2RlcyAgICAgICAgZG9uJ3QgZW5jcnlwdCBwcml2YXRlIGtleXNcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItbm9pdGVyICAgICAgIGRvbid0IHVzZSBlbmNyeXB0aW9uIGl0ZXJhdGlvblxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub21hY2l0ZXIgICAgZG9uJ3QgdXNlIE1BQyBpdGVyYXRpb25cbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItbWFjaXRlciAgICAgIHVzZSBNQUMgaXRlcmF0aW9uXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW5vbWFjICAgICAgICBkb24ndCBnZW5lcmF0ZSBNQUNcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItdHdvcGFzcyAgICAgIHNlcGFyYXRlIE1BQywgZW5jcnlwdGlvbiBwYXNzd29yZHNcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItZGVzY2VydCAgICAgIGVuY3J5cHQgUEtDUyMxMiBjZXJ0aWZpY2F0ZXMgd2l0aCB0cmlwbGUgREVTIChkZWZhdWx0IFJDMi00MClcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItY2VydHBiZSBhbGcgIHNwZWNpZnkgY2VydGlmaWNhdGUgUEJFIGFsZ29yaXRobSAoZGVmYXVsdCBSQzItNDApXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWtleXBiZSBhbGcgICBzcGVjaWZ5IHByaXZhdGUga2V5IFBCRSBhbGdvcml0aG0gKGRlZmF1bHQgM0RFUylcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICItbWFjYWxnIGFsZyAgIGRpZ2VzdCBhbGdvcml0aG0gdXNlZCBpbiBNQUMgKGRlZmF1bHQgU0hBMSlcbiIpOworCUJJT19wcmludGYgKGJpb19lcnIsICIta2V5ZXggICAgICAgIHNldCBNUyBrZXkgZXhjaGFuZ2UgdHlwZVxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1rZXlzaWcgICAgICAgc2V0IE1TIGtleSBzaWduYXR1cmUgdHlwZVxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1wYXNzd29yZCBwICAgc2V0IGltcG9ydC9leHBvcnQgcGFzc3dvcmQgc291cmNlXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXBhc3NpbiBwICAgICBpbnB1dCBmaWxlIHBhc3MgcGhyYXNlIHNvdXJjZVxuIik7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1wYXNzb3V0IHAgICAgb3V0cHV0IGZpbGUgcGFzcyBwaHJhc2Ugc291cmNlXG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWVuZ2luZSBlICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwlCSU9fcHJpbnRmKGJpb19lcnIsICAiLXJhbmQgZmlsZSVjZmlsZSVjLi4uXG4iLCBMSVNUX1NFUEFSQVRPUl9DSEFSLCBMSVNUX1NFUEFSQVRPUl9DSEFSKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICAiICAgICAgICAgICAgICBsb2FkIHRoZSBmaWxlIChvciB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSkgaW50b1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAgIiAgICAgICAgICAgICAgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICAiLUNTUCBuYW1lICAgICBNaWNyb3NvZnQgQ1NQIG5hbWVcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgICItTE1LICAgICAgICAgIEFkZCBsb2NhbCBtYWNoaW5lIGtleXNldCBhdHRyaWJ1dGUgdG8gcHJpdmF0ZSBrZXlcbiIpOworICAgIAlnb3RvIGVuZDsKKyAgICB9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworICAgIGlmKHBhc3NhcmcpIHsKKwlpZihleHBvcnRfY2VydCkgcGFzc2FyZ291dCA9IHBhc3Nhcmc7CisJZWxzZSBwYXNzYXJnaW4gPSBwYXNzYXJnOworICAgIH0KKworICAgIGlmKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmdpbiwgcGFzc2FyZ291dCwgJnBhc3NpbiwgJnBhc3NvdXQpKSB7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgZ2V0dGluZyBwYXNzd29yZHNcbiIpOworCWdvdG8gZW5kOworICAgIH0KKworICAgIGlmKCFjcGFzcykgeworICAgIAlpZihleHBvcnRfY2VydCkgY3Bhc3MgPSBwYXNzb3V0OworICAgIAllbHNlIGNwYXNzID0gcGFzc2luOworICAgIH0KKworICAgIGlmKGNwYXNzKSB7CisJbXBhc3MgPSBjcGFzczsKKwlub3Byb21wdCA9IDE7CisgICAgfSBlbHNlIHsKKwljcGFzcyA9IHBhc3M7CisJbXBhc3MgPSBtYWNwYXNzOworICAgIH0KKworICAgIGlmKGV4cG9ydF9jZXJ0IHx8IGlucmFuZCkgeworICAgIAlhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgKGlucmFuZCAhPSBOVUxMKSk7CisgICAgICAgIGlmIChpbnJhbmQgIT0gTlVMTCkKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlbGQgc2VtaS1yYW5kb20gYnl0ZXMgbG9hZGVkXG4iLAorCQkJYXBwX1JBTkRfbG9hZF9maWxlcyhpbnJhbmQpKTsKKyAgICB9CisgICAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworI2lmZGVmIENSWVBUT19NREVCVUcKKyAgICBDUllQVE9fcHVzaF9pbmZvKCJyZWFkIGZpbGVzIik7CisjZW5kaWYKKworICAgIGlmICghaW5maWxlKSBpbiA9IEJJT19uZXdfZnAoc3RkaW4sIEJJT19OT0NMT1NFKTsKKyAgICBlbHNlIGluID0gQklPX25ld19maWxlKGluZmlsZSwgInJiIik7CisgICAgaWYgKCFpbikgeworCSAgICBCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBvcGVuaW5nIGlucHV0IGZpbGUgJXNcbiIsCisJCQkJCQlpbmZpbGUgPyBpbmZpbGUgOiAiPHN0ZGluPiIpOworCSAgICBwZXJyb3IgKGluZmlsZSk7CisJICAgIGdvdG8gZW5kOworICAgfQorCisjaWZkZWYgQ1JZUFRPX01ERUJVRworICAgIENSWVBUT19wb3BfaW5mbygpOworICAgIENSWVBUT19wdXNoX2luZm8oIndyaXRlIGZpbGVzIik7CisjZW5kaWYKKworICAgIGlmICghb3V0ZmlsZSkgeworCW91dCA9IEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJeworCSAgICBCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkgICAgb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCX0KKyNlbmRpZgorICAgIH0gZWxzZSBvdXQgPSBCSU9fbmV3X2ZpbGUob3V0ZmlsZSwgIndiIik7CisgICAgaWYgKCFvdXQpIHsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlICVzXG4iLAorCQkJCQkJb3V0ZmlsZSA/IG91dGZpbGUgOiAiPHN0ZG91dD4iKTsKKwlwZXJyb3IgKG91dGZpbGUpOworCWdvdG8gZW5kOworICAgIH0KKyAgICBpZiAodHdvcGFzcykgeworI2lmZGVmIENSWVBUT19NREVCVUcKKyAgICBDUllQVE9fcHVzaF9pbmZvKCJyZWFkIE1BQyBwYXNzd29yZCIpOworI2VuZGlmCisJaWYoRVZQX3JlYWRfcHdfc3RyaW5nIChtYWNwYXNzLCBzaXplb2YgbWFjcGFzcywgIkVudGVyIE1BQyBQYXNzd29yZDoiLCBleHBvcnRfY2VydCkpCisJeworICAgIAkgICAgQklPX3ByaW50ZiAoYmlvX2VyciwgIkNhbid0IHJlYWQgUGFzc3dvcmRcbiIpOworICAgIAkgICAgZ290byBlbmQ7CisgICAgICAgCX0KKyNpZmRlZiBDUllQVE9fTURFQlVHCisgICAgQ1JZUFRPX3BvcF9pbmZvKCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAoZXhwb3J0X2NlcnQpIHsKKwlFVlBfUEtFWSAqa2V5ID0gTlVMTDsKKwlYNTA5ICp1Y2VydCA9IE5VTEwsICp4ID0gTlVMTDsKKwlTVEFDS19PRihYNTA5KSAqY2VydHM9TlVMTDsKKwljb25zdCBFVlBfTUQgKm1hY21kID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpjYXRtcCA9IE5VTEw7CisJaW50IGk7CisKKwlpZiAoKG9wdGlvbnMgJiAoTk9DRVJUU3xOT0tFWVMpKSA9PSAoTk9DRVJUU3xOT0tFWVMpKQorCQl7CQorCQlCSU9fcHJpbnRmKGJpb19lcnIsICJOb3RoaW5nIHRvIGRvIVxuIik7CisJCWdvdG8gZXhwb3J0X2VuZDsKKwkJfQorCisJaWYgKG9wdGlvbnMgJiBOT0NFUlRTKQorCQljaGFpbiA9IDA7CisKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJQ1JZUFRPX3B1c2hfaW5mbygicHJvY2VzcyAtZXhwb3J0X2NlcnQiKTsKKwlDUllQVE9fcHVzaF9pbmZvKCJyZWFkaW5nIHByaXZhdGUga2V5Iik7CisjZW5kaWYKKwlpZiAoIShvcHRpb25zICYgTk9LRVlTKSkKKwkJeworCQlrZXkgPSBsb2FkX2tleShiaW9fZXJyLCBrZXluYW1lID8ga2V5bmFtZSA6IGluZmlsZSwKKwkJCQlGT1JNQVRfUEVNLCAxLCBwYXNzaW4sIGUsICJwcml2YXRlIGtleSIpOworCQlpZiAoIWtleSkKKwkJCWdvdG8gZXhwb3J0X2VuZDsKKwkJfQorCisjaWZkZWYgQ1JZUFRPX01ERUJVRworCUNSWVBUT19wb3BfaW5mbygpOworCUNSWVBUT19wdXNoX2luZm8oInJlYWRpbmcgY2VydHMgZnJvbSBpbnB1dCIpOworI2VuZGlmCisKKwkvKiBMb2FkIGluIGFsbCBjZXJ0cyBpbiBpbnB1dCBmaWxlICovCisJaWYoIShvcHRpb25zICYgTk9DRVJUUykpCisJCXsKKwkJY2VydHMgPSBsb2FkX2NlcnRzKGJpb19lcnIsIGluZmlsZSwgRk9STUFUX1BFTSwgTlVMTCwgZSwKKwkJCQkJCQkiY2VydGlmaWNhdGVzIik7CisJCWlmICghY2VydHMpCisJCQlnb3RvIGV4cG9ydF9lbmQ7CisKKwkJaWYgKGtleSkKKwkJCXsKKwkJCS8qIExvb2sgZm9yIG1hdGNoaW5nIHByaXZhdGUga2V5ICovCisJCQlmb3IoaSA9IDA7IGkgPCBza19YNTA5X251bShjZXJ0cyk7IGkrKykKKwkJCQl7CisJCQkJeCA9IHNrX1g1MDlfdmFsdWUoY2VydHMsIGkpOworCQkJCWlmKFg1MDlfY2hlY2tfcHJpdmF0ZV9rZXkoeCwga2V5KSkKKwkJCQkJeworCQkJCQl1Y2VydCA9IHg7CisJCQkJCS8qIFplcm8ga2V5aWQgYW5kIGFsaWFzICovCisJCQkJCVg1MDlfa2V5aWRfc2V0MSh1Y2VydCwgTlVMTCwgMCk7CisJCQkJCVg1MDlfYWxpYXNfc2V0MSh1Y2VydCwgTlVMTCwgMCk7CisJCQkJCS8qIFJlbW92ZSBmcm9tIGxpc3QgKi8KKwkJCQkJKHZvaWQpc2tfWDUwOV9kZWxldGUoY2VydHMsIGkpOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCWlmICghdWNlcnQpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIk5vIGNlcnRpZmljYXRlIG1hdGNoZXMgcHJpdmF0ZSBrZXlcbiIpOworCQkJCWdvdG8gZXhwb3J0X2VuZDsKKwkJCQl9CisJCQl9CisKKwkJfQorCisjaWZkZWYgQ1JZUFRPX01ERUJVRworCUNSWVBUT19wb3BfaW5mbygpOworCUNSWVBUT19wdXNoX2luZm8oInJlYWRpbmcgY2VydHMgZnJvbSBpbnB1dCAyIik7CisjZW5kaWYKKworCS8qIEFkZCBhbnkgbW9yZSBjZXJ0aWZpY2F0ZXMgYXNrZWQgZm9yICovCisJaWYoY2VydGZpbGUpCisJCXsKKwkJU1RBQ0tfT0YoWDUwOSkgKm1vcmVjZXJ0cz1OVUxMOworCQlpZighKG1vcmVjZXJ0cyA9IGxvYWRfY2VydHMoYmlvX2VyciwgY2VydGZpbGUsIEZPUk1BVF9QRU0sCisJCQkJCSAgICBOVUxMLCBlLAorCQkJCQkgICAgImNlcnRpZmljYXRlcyBmcm9tIGNlcnRmaWxlIikpKQorCQkJZ290byBleHBvcnRfZW5kOworCQl3aGlsZShza19YNTA5X251bShtb3JlY2VydHMpID4gMCkKKwkJCXNrX1g1MDlfcHVzaChjZXJ0cywgc2tfWDUwOV9zaGlmdChtb3JlY2VydHMpKTsKKwkJc2tfWDUwOV9mcmVlKG1vcmVjZXJ0cyk7CisgCQl9CisKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJQ1JZUFRPX3BvcF9pbmZvKCk7CisJQ1JZUFRPX3B1c2hfaW5mbygicmVhZGluZyBjZXJ0cyBmcm9tIGNlcnRmaWxlIik7CisjZW5kaWYKKworI2lmZGVmIENSWVBUT19NREVCVUcKKwlDUllQVE9fcG9wX2luZm8oKTsKKwlDUllQVE9fcHVzaF9pbmZvKCJidWlsZGluZyBjaGFpbiIpOworI2VuZGlmCisKKwkvKiBJZiBjaGFpbmluZyBnZXQgY2hhaW4gZnJvbSB1c2VyIGNlcnQgKi8KKwlpZiAoY2hhaW4pIHsKKyAgICAgICAgCWludCB2cmV0OworCQlTVEFDS19PRihYNTA5KSAqY2hhaW4yOworCQlYNTA5X1NUT1JFICpzdG9yZSA9IFg1MDlfU1RPUkVfbmV3KCk7CisJCWlmICghc3RvcmUpCisJCQl7CisJCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOworCQkJZ290byBleHBvcnRfZW5kOworCQkJfQorCQlpZiAoIVg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMoc3RvcmUsIENBZmlsZSwgQ0FwYXRoKSkKKwkJCVg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMgKHN0b3JlKTsKKworCQl2cmV0ID0gZ2V0X2NlcnRfY2hhaW4gKHVjZXJ0LCBzdG9yZSwgJmNoYWluMik7CisJCVg1MDlfU1RPUkVfZnJlZShzdG9yZSk7CisKKwkJaWYgKCF2cmV0KSB7CisJCSAgICAvKiBFeGNsdWRlIHZlcmlmaWVkIGNlcnRpZmljYXRlICovCisJCSAgICBmb3IgKGkgPSAxOyBpIDwgc2tfWDUwOV9udW0gKGNoYWluMikgOyBpKyspIAorCQkJc2tfWDUwOV9wdXNoKGNlcnRzLCBza19YNTA5X3ZhbHVlIChjaGFpbjIsIGkpKTsKKwkJICAgIC8qIEZyZWUgZmlyc3QgY2VydGlmaWNhdGUgKi8KKwkJICAgIFg1MDlfZnJlZShza19YNTA5X3ZhbHVlKGNoYWluMiwgMCkpOworCQkgICAgc2tfWDUwOV9mcmVlKGNoYWluMik7CisJCX0gZWxzZSB7CisJCQlpZiAodnJldCA+PSAwKQorCQkJCUJJT19wcmludGYgKGJpb19lcnIsICJFcnJvciAlcyBnZXR0aW5nIGNoYWluLlxuIiwKKwkJCQkJWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcodnJldCkpOworCQkJZWxzZQorCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGV4cG9ydF9lbmQ7CisJCX0JCQkKKyAgICAJfQorCisJLyogQWRkIGFueSBDQSBuYW1lcyAqLworCisJZm9yIChpID0gMDsgaSA8IHNrX09QRU5TU0xfU1RSSU5HX251bShjYW5hbWVzKTsgaSsrKQorCQl7CisJCWNhdG1wID0gKHVuc2lnbmVkIGNoYXIgKilza19PUEVOU1NMX1NUUklOR192YWx1ZShjYW5hbWVzLCBpKTsKKwkJWDUwOV9hbGlhc19zZXQxKHNrX1g1MDlfdmFsdWUoY2VydHMsIGkpLCBjYXRtcCwgLTEpOworCQl9CisKKwlpZiAoY3NwX25hbWUgJiYga2V5KQorCQlFVlBfUEtFWV9hZGQxX2F0dHJfYnlfTklEKGtleSwgTklEX21zX2NzcF9uYW1lLAorCQkJCU1CU1RSSU5HX0FTQywgKHVuc2lnbmVkIGNoYXIgKiljc3BfbmFtZSwgLTEpOworCisJaWYgKGFkZF9sbWsgJiYga2V5KQorCQlFVlBfUEtFWV9hZGQxX2F0dHJfYnlfTklEKGtleSwgTklEX0xvY2FsS2V5U2V0LCAwLCBOVUxMLCAtMSk7CisKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJQ1JZUFRPX3BvcF9pbmZvKCk7CisJQ1JZUFRPX3B1c2hfaW5mbygicmVhZGluZyBwYXNzd29yZCIpOworI2VuZGlmCisKKwlpZighbm9wcm9tcHQgJiYKKwkJRVZQX3JlYWRfcHdfc3RyaW5nKHBhc3MsIHNpemVvZiBwYXNzLCAiRW50ZXIgRXhwb3J0IFBhc3N3b3JkOiIsIDEpKQorCQl7CisJICAgIAlCSU9fcHJpbnRmIChiaW9fZXJyLCAiQ2FuJ3QgcmVhZCBQYXNzd29yZFxuIik7CisJICAgIAlnb3RvIGV4cG9ydF9lbmQ7CisgICAgICAgIAl9CisJaWYgKCF0d29wYXNzKSBCVUZfc3RybGNweShtYWNwYXNzLCBwYXNzLCBzaXplb2YgbWFjcGFzcyk7CisKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJQ1JZUFRPX3BvcF9pbmZvKCk7CisJQ1JZUFRPX3B1c2hfaW5mbygiY3JlYXRpbmcgUEtDUyMxMiBzdHJ1Y3R1cmUiKTsKKyNlbmRpZgorCisJcDEyID0gUEtDUzEyX2NyZWF0ZShjcGFzcywgbmFtZSwga2V5LCB1Y2VydCwgY2VydHMsCisJCQkJa2V5X3BiZSwgY2VydF9wYmUsIGl0ZXIsIC0xLCBrZXl0eXBlKTsKKworCWlmICghcDEyKQorCQl7CisJICAgIAlFUlJfcHJpbnRfZXJyb3JzIChiaW9fZXJyKTsKKwkJZ290byBleHBvcnRfZW5kOworCQl9CisKKwlpZiAobWFjYWxnKQorCQl7CisJCW1hY21kID0gRVZQX2dldF9kaWdlc3RieW5hbWUobWFjYWxnKTsKKwkJaWYgKCFtYWNtZCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIlVua25vd24gZGlnZXN0IGFsZ29yaXRobSAlc1xuIiwgCisJCQkJCQltYWNhbGcpOworCQkJfQorCQl9CisKKwlpZiAobWFjaXRlciAhPSAtMSkKKwkJUEtDUzEyX3NldF9tYWMocDEyLCBtcGFzcywgLTEsIE5VTEwsIDAsIG1hY2l0ZXIsIG1hY21kKTsKKworI2lmZGVmIENSWVBUT19NREVCVUcKKwlDUllQVE9fcG9wX2luZm8oKTsKKwlDUllQVE9fcHVzaF9pbmZvKCJ3cml0aW5nIHBrY3MxMiIpOworI2VuZGlmCisKKwlpMmRfUEtDUzEyX2JpbyhvdXQsIHAxMik7CisKKwlyZXQgPSAwOworCisgICAgZXhwb3J0X2VuZDoKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJQ1JZUFRPX3BvcF9pbmZvKCk7CisJQ1JZUFRPX3BvcF9pbmZvKCk7CisJQ1JZUFRPX3B1c2hfaW5mbygicHJvY2VzcyAtZXhwb3J0X2NlcnQ6IGZyZWVpbmciKTsKKyNlbmRpZgorCisJaWYgKGtleSkgRVZQX1BLRVlfZnJlZShrZXkpOworCWlmIChjZXJ0cykgc2tfWDUwOV9wb3BfZnJlZShjZXJ0cywgWDUwOV9mcmVlKTsKKwlpZiAodWNlcnQpIFg1MDlfZnJlZSh1Y2VydCk7CisKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJQ1JZUFRPX3BvcF9pbmZvKCk7CisjZW5kaWYKKwlnb3RvIGVuZDsKKwkKKyAgICB9CisKKyAgICBpZiAoIShwMTIgPSBkMmlfUEtDUzEyX2JpbyAoaW4sIE5VTEwpKSkgeworCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJZ290byBlbmQ7CisgICAgfQorCisjaWZkZWYgQ1JZUFRPX01ERUJVRworICAgIENSWVBUT19wdXNoX2luZm8oInJlYWQgaW1wb3J0IHBhc3N3b3JkIik7CisjZW5kaWYKKyAgICBpZighbm9wcm9tcHQgJiYgRVZQX3JlYWRfcHdfc3RyaW5nKHBhc3MsIHNpemVvZiBwYXNzLCAiRW50ZXIgSW1wb3J0IFBhc3N3b3JkOiIsIDApKSB7CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIkNhbid0IHJlYWQgUGFzc3dvcmRcbiIpOworCWdvdG8gZW5kOworICAgIH0KKyNpZmRlZiBDUllQVE9fTURFQlVHCisgICAgQ1JZUFRPX3BvcF9pbmZvKCk7CisjZW5kaWYKKworICAgIGlmICghdHdvcGFzcykgQlVGX3N0cmxjcHkobWFjcGFzcywgcGFzcywgc2l6ZW9mIG1hY3Bhc3MpOworCisgICAgaWYgKG9wdGlvbnMgJiBJTkZPKSBCSU9fcHJpbnRmIChiaW9fZXJyLCAiTUFDIEl0ZXJhdGlvbiAlbGRcbiIsIHAxMi0+bWFjLT5pdGVyID8gQVNOMV9JTlRFR0VSX2dldCAocDEyLT5tYWMtPml0ZXIpIDogMSk7CisgICAgaWYobWFjdmVyKSB7CisjaWZkZWYgQ1JZUFRPX01ERUJVRworICAgIENSWVBUT19wdXNoX2luZm8oInZlcmlmeSBNQUMiKTsKKyNlbmRpZgorCS8qIElmIHdlIGVudGVyIGVtcHR5IHBhc3N3b3JkIHRyeSBubyBwYXNzd29yZCBmaXJzdCAqLworCWlmKCFtcGFzc1swXSAmJiBQS0NTMTJfdmVyaWZ5X21hYyhwMTIsIE5VTEwsIDApKSB7CisJCS8qIElmIG1hYyBhbmQgY3J5cHRvIHBhc3MgdGhlIHNhbWUgc2V0IGl0IHRvIE5VTEwgdG9vICovCisJCWlmKCF0d29wYXNzKSBjcGFzcyA9IE5VTEw7CisJfSBlbHNlIGlmICghUEtDUzEyX3ZlcmlmeV9tYWMocDEyLCBtcGFzcywgLTEpKSB7CisJICAgIEJJT19wcmludGYgKGJpb19lcnIsICJNYWMgdmVyaWZ5IGVycm9yOiBpbnZhbGlkIHBhc3N3b3JkP1xuIik7CisJICAgIEVSUl9wcmludF9lcnJvcnMgKGJpb19lcnIpOworCSAgICBnb3RvIGVuZDsKKwl9CisJQklPX3ByaW50ZiAoYmlvX2VyciwgIk1BQyB2ZXJpZmllZCBPS1xuIik7CisjaWZkZWYgQ1JZUFRPX01ERUJVRworICAgIENSWVBUT19wb3BfaW5mbygpOworI2VuZGlmCisgICAgfQorCisjaWZkZWYgQ1JZUFRPX01ERUJVRworICAgIENSWVBUT19wdXNoX2luZm8oIm91dHB1dCBrZXlzIGFuZCBjZXJ0aWZpY2F0ZXMiKTsKKyNlbmRpZgorICAgIGlmICghZHVtcF9jZXJ0c19rZXlzX3AxMiAob3V0LCBwMTIsIGNwYXNzLCAtMSwgb3B0aW9ucywgcGFzc291dCkpIHsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBvdXRwdXR0aW5nIGtleXMgYW5kIGNlcnRpZmljYXRlc1xuIik7CisJRVJSX3ByaW50X2Vycm9ycyAoYmlvX2Vycik7CisJZ290byBlbmQ7CisgICAgfQorI2lmZGVmIENSWVBUT19NREVCVUcKKyAgICBDUllQVE9fcG9wX2luZm8oKTsKKyNlbmRpZgorICAgIHJldCA9IDA7CisgZW5kOgorICAgIGlmIChwMTIpIFBLQ1MxMl9mcmVlKHAxMik7CisgICAgaWYoZXhwb3J0X2NlcnQgfHwgaW5yYW5kKSBhcHBfUkFORF93cml0ZV9maWxlKE5VTEwsIGJpb19lcnIpOworI2lmZGVmIENSWVBUT19NREVCVUcKKyAgICBDUllQVE9fcmVtb3ZlX2FsbF9pbmZvKCk7CisjZW5kaWYKKyAgICBCSU9fZnJlZShpbik7CisgICAgQklPX2ZyZWVfYWxsKG91dCk7CisgICAgaWYgKGNhbmFtZXMpIHNrX09QRU5TU0xfU1RSSU5HX2ZyZWUoY2FuYW1lcyk7CisgICAgaWYocGFzc2luKSBPUEVOU1NMX2ZyZWUocGFzc2luKTsKKyAgICBpZihwYXNzb3V0KSBPUEVOU1NMX2ZyZWUocGFzc291dCk7CisgICAgYXBwc19zaHV0ZG93bigpOworICAgIE9QRU5TU0xfRVhJVChyZXQpOworfQorCitpbnQgZHVtcF9jZXJ0c19rZXlzX3AxMiAoQklPICpvdXQsIFBLQ1MxMiAqcDEyLCBjaGFyICpwYXNzLAorCSAgICAgaW50IHBhc3NsZW4sIGludCBvcHRpb25zLCBjaGFyICpwZW1wYXNzKQoreworCVNUQUNLX09GKFBLQ1M3KSAqYXNhZmVzID0gTlVMTDsKKwlTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKmJhZ3M7CisJaW50IGksIGJhZ25pZDsKKwlpbnQgcmV0ID0gMDsKKwlQS0NTNyAqcDc7CisKKwlpZiAoISggYXNhZmVzID0gUEtDUzEyX3VucGFja19hdXRoc2FmZXMocDEyKSkpIHJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBza19QS0NTN19udW0gKGFzYWZlcyk7IGkrKykgeworCQlwNyA9IHNrX1BLQ1M3X3ZhbHVlIChhc2FmZXMsIGkpOworCQliYWduaWQgPSBPQkpfb2JqMm5pZCAocDctPnR5cGUpOworCQlpZiAoYmFnbmlkID09IE5JRF9wa2NzN19kYXRhKSB7CisJCQliYWdzID0gUEtDUzEyX3VucGFja19wN2RhdGEocDcpOworCQkJaWYgKG9wdGlvbnMgJiBJTkZPKSBCSU9fcHJpbnRmIChiaW9fZXJyLCAiUEtDUzcgRGF0YVxuIik7CisJCX0gZWxzZSBpZiAoYmFnbmlkID09IE5JRF9wa2NzN19lbmNyeXB0ZWQpIHsKKwkJCWlmIChvcHRpb25zICYgSU5GTykgeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIlBLQ1M3IEVuY3J5cHRlZCBkYXRhOiAiKTsKKwkJCQlhbGdfcHJpbnQoYmlvX2VyciwgCisJCQkJCXA3LT5kLmVuY3J5cHRlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobSk7CisJCQl9CisJCQliYWdzID0gUEtDUzEyX3VucGFja19wN2VuY2RhdGEocDcsIHBhc3MsIHBhc3NsZW4pOworCQl9IGVsc2UgY29udGludWU7CisJCWlmICghYmFncykgZ290byBlcnI7CisJICAgIAlpZiAoIWR1bXBfY2VydHNfcGtleXNfYmFncyAob3V0LCBiYWdzLCBwYXNzLCBwYXNzbGVuLCAKKwkJCQkJCSBvcHRpb25zLCBwZW1wYXNzKSkgeworCQkJc2tfUEtDUzEyX1NBRkVCQUdfcG9wX2ZyZWUgKGJhZ3MsIFBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCQkJZ290byBlcnI7CisJCX0KKwkJc2tfUEtDUzEyX1NBRkVCQUdfcG9wX2ZyZWUgKGJhZ3MsIFBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCQliYWdzID0gTlVMTDsKKwl9CisJcmV0ID0gMTsKKworCWVycjoKKworCWlmIChhc2FmZXMpCisJCXNrX1BLQ1M3X3BvcF9mcmVlIChhc2FmZXMsIFBLQ1M3X2ZyZWUpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBkdW1wX2NlcnRzX3BrZXlzX2JhZ3MgKEJJTyAqb3V0LCBTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKmJhZ3MsCisJCQkgICBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwgaW50IG9wdGlvbnMsIGNoYXIgKnBlbXBhc3MpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNrX1BLQ1MxMl9TQUZFQkFHX251bSAoYmFncyk7IGkrKykgeworCQlpZiAoIWR1bXBfY2VydHNfcGtleXNfYmFnIChvdXQsCisJCQkJCSAgIHNrX1BLQ1MxMl9TQUZFQkFHX3ZhbHVlIChiYWdzLCBpKSwKKwkJCQkJICAgcGFzcywgcGFzc2xlbiwKKwkJCQkJICAgb3B0aW9ucywgcGVtcGFzcykpCisJCSAgICByZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludCBkdW1wX2NlcnRzX3BrZXlzX2JhZyAoQklPICpvdXQsIFBLQ1MxMl9TQUZFQkFHICpiYWcsIGNoYXIgKnBhc3MsCisJICAgICBpbnQgcGFzc2xlbiwgaW50IG9wdGlvbnMsIGNoYXIgKnBlbXBhc3MpCit7CisJRVZQX1BLRVkgKnBrZXk7CisJUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDg7CisJWDUwOSAqeDUwOTsKKwkKKwlzd2l0Y2ggKE1fUEtDUzEyX2JhZ190eXBlKGJhZykpCisJeworCWNhc2UgTklEX2tleUJhZzoKKwkJaWYgKG9wdGlvbnMgJiBJTkZPKSBCSU9fcHJpbnRmIChiaW9fZXJyLCAiS2V5IGJhZ1xuIik7CisJCWlmIChvcHRpb25zICYgTk9LRVlTKSByZXR1cm4gMTsKKwkJcHJpbnRfYXR0cmlicyAob3V0LCBiYWctPmF0dHJpYiwgIkJhZyBBdHRyaWJ1dGVzIik7CisJCXA4ID0gYmFnLT52YWx1ZS5rZXliYWc7CisJCWlmICghKHBrZXkgPSBFVlBfUEtDUzgyUEtFWSAocDgpKSkgcmV0dXJuIDA7CisJCXByaW50X2F0dHJpYnMgKG91dCwgcDgtPmF0dHJpYnV0ZXMsICJLZXkgQXR0cmlidXRlcyIpOworCQlQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkgKG91dCwgcGtleSwgZW5jLCBOVUxMLCAwLCBOVUxMLCBwZW1wYXNzKTsKKwkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlicmVhazsKKworCWNhc2UgTklEX3BrY3M4U2hyb3VkZWRLZXlCYWc6CisJCWlmIChvcHRpb25zICYgSU5GTykgeworCQkJQklPX3ByaW50ZiAoYmlvX2VyciwgIlNocm91ZGVkIEtleWJhZzogIik7CisJCQlhbGdfcHJpbnQgKGJpb19lcnIsIGJhZy0+dmFsdWUuc2hrZXliYWctPmFsZ29yKTsKKwkJfQorCQlpZiAob3B0aW9ucyAmIE5PS0VZUykgcmV0dXJuIDE7CisJCXByaW50X2F0dHJpYnMgKG91dCwgYmFnLT5hdHRyaWIsICJCYWcgQXR0cmlidXRlcyIpOworCQlpZiAoIShwOCA9IFBLQ1MxMl9kZWNyeXB0X3NrZXkoYmFnLCBwYXNzLCBwYXNzbGVuKSkpCisJCQkJcmV0dXJuIDA7CisJCWlmICghKHBrZXkgPSBFVlBfUEtDUzgyUEtFWSAocDgpKSkgeworCQkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4KTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50X2F0dHJpYnMgKG91dCwgcDgtPmF0dHJpYnV0ZXMsICJLZXkgQXR0cmlidXRlcyIpOworCQlQS0NTOF9QUklWX0tFWV9JTkZPX2ZyZWUocDgpOworCQlQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkgKG91dCwgcGtleSwgZW5jLCBOVUxMLCAwLCBOVUxMLCBwZW1wYXNzKTsKKwkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlicmVhazsKKworCWNhc2UgTklEX2NlcnRCYWc6CisJCWlmIChvcHRpb25zICYgSU5GTykgQklPX3ByaW50ZiAoYmlvX2VyciwgIkNlcnRpZmljYXRlIGJhZ1xuIik7CisJCWlmIChvcHRpb25zICYgTk9DRVJUUykgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgaWYgKFBLQ1MxMl9nZXRfYXR0cihiYWcsIE5JRF9sb2NhbEtleUlEKSkgeworCQkJaWYgKG9wdGlvbnMgJiBDQUNFUlRTKSByZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChvcHRpb25zICYgQ0xDRVJUUykgcmV0dXJuIDE7CisJCXByaW50X2F0dHJpYnMgKG91dCwgYmFnLT5hdHRyaWIsICJCYWcgQXR0cmlidXRlcyIpOworCQlpZiAoTV9QS0NTMTJfY2VydF9iYWdfdHlwZShiYWcpICE9IE5JRF94NTA5Q2VydGlmaWNhdGUgKQorCQkJCQkJCQkgcmV0dXJuIDE7CisJCWlmICghKHg1MDkgPSBQS0NTMTJfY2VydGJhZzJ4NTA5KGJhZykpKSByZXR1cm4gMDsKKwkJZHVtcF9jZXJ0X3RleHQgKG91dCwgeDUwOSk7CisJCVBFTV93cml0ZV9iaW9fWDUwOSAob3V0LCB4NTA5KTsKKwkJWDUwOV9mcmVlKHg1MDkpOworCWJyZWFrOworCisJY2FzZSBOSURfc2FmZUNvbnRlbnRzQmFnOgorCQlpZiAob3B0aW9ucyAmIElORk8pIEJJT19wcmludGYgKGJpb19lcnIsICJTYWZlIENvbnRlbnRzIGJhZ1xuIik7CisJCXByaW50X2F0dHJpYnMgKG91dCwgYmFnLT5hdHRyaWIsICJCYWcgQXR0cmlidXRlcyIpOworCQlyZXR1cm4gZHVtcF9jZXJ0c19wa2V5c19iYWdzIChvdXQsIGJhZy0+dmFsdWUuc2FmZXMsIHBhc3MsCisJCQkJCQkJICAgIHBhc3NsZW4sIG9wdGlvbnMsIHBlbXBhc3MpOworCQkJCQkKKwlkZWZhdWx0OgorCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiV2FybmluZyB1bnN1cHBvcnRlZCBiYWcgdHlwZTogIik7CisJCWkyYV9BU04xX09CSkVDVCAoYmlvX2VyciwgYmFnLT50eXBlKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIlxuIik7CisJCXJldHVybiAxOworCWJyZWFrOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogR2l2ZW4gYSBzaW5nbGUgY2VydGlmaWNhdGUgcmV0dXJuIGEgdmVyaWZpZWQgY2hhaW4gb3IgTlVMTCBpZiBlcnJvciAqLworCisvKiBIb3BlIHRoaXMgaXMgT0sgLi4uLiAqLworCitpbnQgZ2V0X2NlcnRfY2hhaW4gKFg1MDkgKmNlcnQsIFg1MDlfU1RPUkUgKnN0b3JlLCBTVEFDS19PRihYNTA5KSAqKmNoYWluKQoreworCVg1MDlfU1RPUkVfQ1RYIHN0b3JlX2N0eDsKKwlTVEFDS19PRihYNTA5KSAqY2huOworCWludCBpID0gMDsKKworCS8qIEZJWE1FOiBTaG91bGQgcmVhbGx5IGNoZWNrIHRoZSByZXR1cm4gc3RhdHVzIG9mIFg1MDlfU1RPUkVfQ1RYX2luaXQKKwkgKiBmb3IgYW4gZXJyb3IsIGJ1dCBob3cgdGhhdCBmaXRzIGludG8gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzCisJICogZnVuY3Rpb24gaXMgbGVzcyBvYnZpb3VzLiAqLworCVg1MDlfU1RPUkVfQ1RYX2luaXQoJnN0b3JlX2N0eCwgc3RvcmUsIGNlcnQsIE5VTEwpOworCWlmIChYNTA5X3ZlcmlmeV9jZXJ0KCZzdG9yZV9jdHgpIDw9IDApIHsKKwkJaSA9IFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvciAoJnN0b3JlX2N0eCk7CisJCWlmIChpID09IDApCisJCQkvKiBhdm9pZCByZXR1cm5pbmcgMCBpZiBYNTA5X3ZlcmlmeV9jZXJ0KCkgZGlkIG5vdAorCQkJICogc2V0IGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIGluIHRoZSBjb250ZXh0ICovCisJCQlpID0gLTE7CisJCWNobiA9IE5VTEw7CisJCWdvdG8gZXJyOworCX0gZWxzZQorCQljaG4gPSBYNTA5X1NUT1JFX0NUWF9nZXQxX2NoYWluKCZzdG9yZV9jdHgpOworZXJyOgorCVg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJnN0b3JlX2N0eCk7CisJKmNoYWluID0gY2huOworCQorCXJldHVybiBpOworfQkKKworaW50IGFsZ19wcmludCAoQklPICp4LCBYNTA5X0FMR09SICphbGcpCit7CisJUEJFUEFSQU0gKnBiZTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXAgPSBhbGctPnBhcmFtZXRlci0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisJcGJlID0gZDJpX1BCRVBBUkFNKE5VTEwsICZwLCBhbGctPnBhcmFtZXRlci0+dmFsdWUuc2VxdWVuY2UtPmxlbmd0aCk7CisJaWYgKCFwYmUpCisJCXJldHVybiAxOworCUJJT19wcmludGYgKGJpb19lcnIsICIlcywgSXRlcmF0aW9uICVsZFxuIiwgCisJCU9CSl9uaWQybG4oT0JKX29iajJuaWQoYWxnLT5hbGdvcml0aG0pKSwKKwkJQVNOMV9JTlRFR0VSX2dldChwYmUtPml0ZXIpKTsKKwlQQkVQQVJBTV9mcmVlIChwYmUpOworCXJldHVybiAxOworfQorCisvKiBMb2FkIGFsbCBjZXJ0aWZpY2F0ZXMgZnJvbSBhIGdpdmVuIGZpbGUgKi8KKworaW50IGNlcnRfbG9hZChCSU8gKmluLCBTVEFDS19PRihYNTA5KSAqc2spCit7CisJaW50IHJldDsKKwlYNTA5ICpjZXJ0OworCXJldCA9IDA7CisjaWZkZWYgQ1JZUFRPX01ERUJVRworCUNSWVBUT19wdXNoX2luZm8oImNlcnRfbG9hZCgpOiByZWFkaW5nIG9uZSBjZXJ0Iik7CisjZW5kaWYKKwl3aGlsZSgoY2VydCA9IFBFTV9yZWFkX2Jpb19YNTA5KGluLCBOVUxMLCBOVUxMLCBOVUxMKSkpIHsKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJCUNSWVBUT19wb3BfaW5mbygpOworI2VuZGlmCisJCXJldCA9IDE7CisJCXNrX1g1MDlfcHVzaChzaywgY2VydCk7CisjaWZkZWYgQ1JZUFRPX01ERUJVRworCQlDUllQVE9fcHVzaF9pbmZvKCJjZXJ0X2xvYWQoKTogcmVhZGluZyBvbmUgY2VydCIpOworI2VuZGlmCisJfQorI2lmZGVmIENSWVBUT19NREVCVUcKKwlDUllQVE9fcG9wX2luZm8oKTsKKyNlbmRpZgorCWlmKHJldCkgRVJSX2NsZWFyX2Vycm9yKCk7CisJcmV0dXJuIHJldDsKK30KKworLyogR2VuZXJhbGlzZWQgYXR0cmlidXRlIHByaW50OiBoYW5kbGUgUEtDUyM4IGFuZCBiYWcgYXR0cmlidXRlcyAqLworCitpbnQgcHJpbnRfYXR0cmlicyAoQklPICpvdXQsIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqYXR0cmxzdCxjb25zdCBjaGFyICpuYW1lKQoreworCVg1MDlfQVRUUklCVVRFICphdHRyOworCUFTTjFfVFlQRSAqYXY7CisJY2hhciAqdmFsdWU7CisJaW50IGksIGF0dHJfbmlkOworCWlmKCFhdHRybHN0KSB7CisJCUJJT19wcmludGYob3V0LCAiJXM6IDxObyBBdHRyaWJ1dGVzPlxuIiwgbmFtZSk7CisJCXJldHVybiAxOworCX0KKwlpZighc2tfWDUwOV9BVFRSSUJVVEVfbnVtKGF0dHJsc3QpKSB7CisJCUJJT19wcmludGYob3V0LCAiJXM6IDxFbXB0eSBBdHRyaWJ1dGVzPlxuIiwgbmFtZSk7CisJCXJldHVybiAxOworCX0KKwlCSU9fcHJpbnRmKG91dCwgIiVzXG4iLCBuYW1lKTsKKwlmb3IoaSA9IDA7IGkgPCBza19YNTA5X0FUVFJJQlVURV9udW0oYXR0cmxzdCk7IGkrKykgeworCQlhdHRyID0gc2tfWDUwOV9BVFRSSUJVVEVfdmFsdWUoYXR0cmxzdCwgaSk7CisJCWF0dHJfbmlkID0gT0JKX29iajJuaWQoYXR0ci0+b2JqZWN0KTsKKwkJQklPX3ByaW50ZihvdXQsICIgICAgIik7CisJCWlmKGF0dHJfbmlkID09IE5JRF91bmRlZikgeworCQkJaTJhX0FTTjFfT0JKRUNUIChvdXQsIGF0dHItPm9iamVjdCk7CisJCQlCSU9fcHJpbnRmKG91dCwgIjogIik7CisJCX0gZWxzZSBCSU9fcHJpbnRmKG91dCwgIiVzOiAiLCBPQkpfbmlkMmxuKGF0dHJfbmlkKSk7CisKKwkJaWYoc2tfQVNOMV9UWVBFX251bShhdHRyLT52YWx1ZS5zZXQpKSB7CisJCQlhdiA9IHNrX0FTTjFfVFlQRV92YWx1ZShhdHRyLT52YWx1ZS5zZXQsIDApOworCQkJc3dpdGNoKGF2LT50eXBlKSB7CisJCQkJY2FzZSBWX0FTTjFfQk1QU1RSSU5HOgorICAgICAgICAJCQl2YWx1ZSA9IE9QRU5TU0xfdW5pMmFzYyhhdi0+dmFsdWUuYm1wc3RyaW5nLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgIGF2LT52YWx1ZS5ibXBzdHJpbmctPmxlbmd0aCk7CisJCQkJQklPX3ByaW50ZihvdXQsICIlc1xuIiwgdmFsdWUpOworCQkJCU9QRU5TU0xfZnJlZSh2YWx1ZSk7CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIFZfQVNOMV9PQ1RFVF9TVFJJTkc6CisJCQkJaGV4X3ByaW4ob3V0LCBhdi0+dmFsdWUub2N0ZXRfc3RyaW5nLT5kYXRhLAorCQkJCQlhdi0+dmFsdWUub2N0ZXRfc3RyaW5nLT5sZW5ndGgpOworCQkJCUJJT19wcmludGYob3V0LCAiXG4iKTsJCisJCQkJYnJlYWs7CisKKwkJCQljYXNlIFZfQVNOMV9CSVRfU1RSSU5HOgorCQkJCWhleF9wcmluKG91dCwgYXYtPnZhbHVlLmJpdF9zdHJpbmctPmRhdGEsCisJCQkJCWF2LT52YWx1ZS5iaXRfc3RyaW5nLT5sZW5ndGgpOworCQkJCUJJT19wcmludGYob3V0LCAiXG4iKTsJCisJCQkJYnJlYWs7CisKKwkJCQlkZWZhdWx0OgorCQkJCQlCSU9fcHJpbnRmKG91dCwgIjxVbnN1cHBvcnRlZCB0YWcgJWQ+XG4iLCBhdi0+dHlwZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBCSU9fcHJpbnRmKG91dCwgIjxObyBWYWx1ZXM+XG4iKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgaGV4X3ByaW4oQklPICpvdXQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIEJJT19wcmludGYgKG91dCwgIiUwMlggIiwgYnVmW2ldKTsKK30KKworc3RhdGljIGludCBzZXRfcGJlKEJJTyAqZXJyLCBpbnQgKnBwYmUsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJaWYgKCFzdHIpCisJCXJldHVybiAwOworCWlmICghc3RyY21wKHN0ciwgIk5PTkUiKSkKKwkJeworCQkqcHBiZSA9IC0xOworCQlyZXR1cm4gMTsKKwkJfQorCSpwcGJlPU9CSl90eHQybmlkKHN0cik7CisJaWYgKCpwcGJlID09IE5JRF91bmRlZikKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJVbmtub3duIFBCRSBhbGdvcml0aG0gJXNcbiIsIHN0cik7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCQkJCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcGtjczcuYyBiL2xpYi9vcGVuc3NsL2FwcHMvcGtjczcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmQzMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9wa2NzNy5jCkBAIC0wLDAgKzEsMzIzIEBACisvKiBhcHBzL3BrY3M3LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzNy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cJcGtjczdfbWFpbgorCisvKiAtaW5mb3JtIGFyZwktIGlucHV0IGZvcm1hdCAtIGRlZmF1bHQgUEVNIChERVIgb3IgUEVNKQorICogLW91dGZvcm0gYXJnIC0gb3V0cHV0IGZvcm1hdCAtIGRlZmF1bHQgUEVNCisgKiAtaW4gYXJnCS0gaW5wdXQgZmlsZSAtIGRlZmF1bHQgc3RkaW4KKyAqIC1vdXQgYXJnCS0gb3V0cHV0IGZpbGUgLSBkZWZhdWx0IHN0ZG91dAorICogLXByaW50X2NlcnRzCisgKi8KKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUgKmUgPSBOVUxMOworI2VuZGlmCisJUEtDUzcgKnA3PU5VTEw7CisJaW50IGksYmFkb3BzPTA7CisJQklPICppbj1OVUxMLCpvdXQ9TlVMTDsKKwlpbnQgaW5mb3JtYXQsb3V0Zm9ybWF0OworCWNoYXIgKmluZmlsZSwqb3V0ZmlsZSwqcHJvZzsKKwlpbnQgcHJpbnRfY2VydHM9MCx0ZXh0PTAsbm9vdXQ9MCxwN19wcmludD0wOworCWludCByZXQ9MTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwljaGFyICplbmdpbmU9TlVMTDsKKyNlbmRpZgorCisJYXBwc19zdGFydHVwKCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQlpZiAoKGJpb19lcnI9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fZXJyLHN0ZGVycixCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKworCWluZmlsZT1OVUxMOworCW91dGZpbGU9TlVMTDsKKwlpbmZvcm1hdD1GT1JNQVRfUEVNOworCW91dGZvcm1hdD1GT1JNQVRfUEVNOworCisJcHJvZz1hcmd2WzBdOworCWFyZ2MtLTsKKwlhcmd2Kys7CisJd2hpbGUgKGFyZ2MgPj0gMSkKKwkJeworCQlpZiAJKHN0cmNtcCgqYXJndiwiLWluZm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dGZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0Zm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5maWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vb3V0IikgPT0gMCkKKwkJCW5vb3V0PTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXRleHQiKSA9PSAwKQorCQkJdGV4dD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wcmludCIpID09IDApCisJCQlwN19wcmludD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wcmludF9jZXJ0cyIpID09IDApCisJCQlwcmludF9jZXJ0cz0xOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1lbmdpbmUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZW5naW5lPSAqKCsrYXJndik7CisJCQl9CisjZW5kaWYKKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmtub3duIG9wdGlvbiAlc1xuIiwqYXJndik7CisJCQliYWRvcHM9MTsKKwkJCWJyZWFrOworCQkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCisJaWYgKGJhZG9wcykKKwkJeworYmFkOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIFtvcHRpb25zXSA8aW5maWxlID5vdXRmaWxlXG4iLHByb2cpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIndoZXJlIG9wdGlvbnMgYXJlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluZm9ybSBhcmcgICBpbnB1dCBmb3JtYXQgLSBERVIgb3IgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dGZvcm0gYXJnICBvdXRwdXQgZm9ybWF0IC0gREVSIG9yIFBFTVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1pbiBhcmcgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vdXQgYXJnICAgICAgb3V0cHV0IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcHJpbnRfY2VydHMgIHByaW50IGFueSBjZXJ0cyBvciBjcmwgaW4gdGhlIGlucHV0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXRleHQgICAgICAgICBwcmludCBmdWxsIGRldGFpbHMgb2YgY2VydGlmaWNhdGVzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vb3V0ICAgICAgICBkb24ndCBvdXRwdXQgZW5jb2RlZCBkYXRhXG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWVuZ2luZSBlICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJcmV0ID0gMTsKKwkJZ290byBlbmQ7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyAgICAgICAgZSA9IHNldHVwX2VuZ2luZShiaW9fZXJyLCBlbmdpbmUsIDApOworI2VuZGlmCisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAoKGluID09IE5VTEwpIHx8IChvdXQgPT0gTlVMTCkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisKKwlpZiAoaW5maWxlID09IE5VTEwpCisJCUJJT19zZXRfZnAoaW4sc3RkaW4sQklPX05PQ0xPU0UpOworCWVsc2UKKwkJeworCQlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4saW5maWxlKSA8PSAwKQorCQlpZiAoaW4gPT0gTlVMTCkKKwkJCXsKKwkJCXBlcnJvcihpbmZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmCShpbmZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJcDc9ZDJpX1BLQ1M3X2JpbyhpbixOVUxMKTsKKwllbHNlIGlmIChpbmZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQlwNz1QRU1fcmVhZF9iaW9fUEtDUzcoaW4sTlVMTCxOVUxMLE5VTEwpOworCWVsc2UKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBpbnB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBwa2NzNyBvYmplY3RcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmIChwNyA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGxvYWQgUEtDUzcgb2JqZWN0XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChvdXRmaWxlID09IE5VTEwpCisJCXsKKwkJQklPX3NldF9mcChvdXQsc3Rkb3V0LEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJeworCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxvdXRmaWxlKSA8PSAwKQorCQkJeworCQkJcGVycm9yKG91dGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmIChwN19wcmludCkKKwkJUEtDUzdfcHJpbnRfY3R4KG91dCwgcDcsIDAsIE5VTEwpOworCisJaWYgKHByaW50X2NlcnRzKQorCQl7CisJCVNUQUNLX09GKFg1MDkpICpjZXJ0cz1OVUxMOworCQlTVEFDS19PRihYNTA5X0NSTCkgKmNybHM9TlVMTDsKKworCQlpPU9CSl9vYmoybmlkKHA3LT50eXBlKTsKKwkJc3dpdGNoIChpKQorCQkJeworCQljYXNlIE5JRF9wa2NzN19zaWduZWQ6CisJCQljZXJ0cz1wNy0+ZC5zaWduLT5jZXJ0OworCQkJY3Jscz1wNy0+ZC5zaWduLT5jcmw7CisJCQlicmVhazsKKwkJY2FzZSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkOgorCQkJY2VydHM9cDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPmNlcnQ7CisJCQljcmxzPXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5jcmw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQkJfQorCisJCWlmIChjZXJ0cyAhPSBOVUxMKQorCQkJeworCQkJWDUwOSAqeDsKKworCQkJZm9yIChpPTA7IGk8c2tfWDUwOV9udW0oY2VydHMpOyBpKyspCisJCQkJeworCQkJCXg9c2tfWDUwOV92YWx1ZShjZXJ0cyxpKTsKKwkJCQlpZih0ZXh0KSBYNTA5X3ByaW50KG91dCwgeCk7CisJCQkJZWxzZSBkdW1wX2NlcnRfdGV4dChvdXQsIHgpOworCisJCQkJaWYoIW5vb3V0KSBQRU1fd3JpdGVfYmlvX1g1MDkob3V0LHgpOworCQkJCUJJT19wdXRzKG91dCwiXG4iKTsKKwkJCQl9CisJCQl9CisJCWlmIChjcmxzICE9IE5VTEwpCisJCQl7CisJCQlYNTA5X0NSTCAqY3JsOworCisJCQlmb3IgKGk9MDsgaTxza19YNTA5X0NSTF9udW0oY3Jscyk7IGkrKykKKwkJCQl7CisJCQkJY3JsPXNrX1g1MDlfQ1JMX3ZhbHVlKGNybHMsaSk7CisKKwkJCQlYNTA5X0NSTF9wcmludChvdXQsIGNybCk7CisKKwkJCQlpZighbm9vdXQpUEVNX3dyaXRlX2Jpb19YNTA5X0NSTChvdXQsY3JsKTsKKwkJCQlCSU9fcHV0cyhvdXQsIlxuIik7CisJCQkJfQorCQkJfQorCisJCXJldD0wOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYoIW5vb3V0KSB7CisJCWlmIAkob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJaT1pMmRfUEtDUzdfYmlvKG91dCxwNyk7CisJCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQkJaT1QRU1fd3JpdGVfYmlvX1BLQ1M3KG91dCxwNyk7CisJCWVsc2UJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJiYWQgb3V0cHV0IGZvcm1hdCBzcGVjaWZpZWQgZm9yIG91dGZpbGVcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJaWYgKCFpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gd3JpdGUgcGtjczcgb2JqZWN0XG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwl9CisJcmV0PTA7CitlbmQ6CisJaWYgKHA3ICE9IE5VTEwpIFBLQ1M3X2ZyZWUocDcpOworCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJaWYgKG91dCAhPSBOVUxMKSBCSU9fZnJlZV9hbGwob3V0KTsKKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9wa2NzOC5jIGIvbGliL29wZW5zc2wvYXBwcy9wa2NzOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZGViMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3BrY3M4LmMKQEAgLTAsMCArMSw0MzkgQEAKKy8qIHBrY3M4LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LTIwMDQuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCisjZGVmaW5lIFBST0cgcGtjczhfbWFpbgorCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCUVOR0lORSAqZSA9IE5VTEw7CisJY2hhciAqKmFyZ3MsICppbmZpbGUgPSBOVUxMLCAqb3V0ZmlsZSA9IE5VTEw7CisJY2hhciAqcGFzc2FyZ2luID0gTlVMTCwgKnBhc3NhcmdvdXQgPSBOVUxMOworCUJJTyAqaW4gPSBOVUxMLCAqb3V0ID0gTlVMTDsKKwlpbnQgdG9wazggPSAwOworCWludCBwYmVfbmlkID0gLTE7CisJY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyID0gTlVMTDsKKwlpbnQgaXRlciA9IFBLQ1MxMl9ERUZBVUxUX0lURVI7CisJaW50IGluZm9ybWF0LCBvdXRmb3JtYXQ7CisJaW50IHA4X2Jyb2tlbiA9IFBLQ1M4X09LOworCWludCBub2NyeXB0ID0gMDsKKwlYNTA5X1NJRyAqcDggPSBOVUxMOworCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mID0gTlVMTDsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCWNoYXIgcGFzc1s1MF0sICpwYXNzaW4gPSBOVUxMLCAqcGFzc291dCA9IE5VTEwsICpwOHBhc3MgPSBOVUxMOworCWludCBiYWRhcmcgPSAwOworCWludCByZXQgPSAxOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWNoYXIgKmVuZ2luZT1OVUxMOworI2VuZGlmCisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKSBiaW9fZXJyID0gQklPX25ld19mcCAoc3RkZXJyLCBCSU9fTk9DTE9TRSk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKworCWluZm9ybWF0PUZPUk1BVF9QRU07CisJb3V0Zm9ybWF0PUZPUk1BVF9QRU07CisKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisJYXJncyA9IGFyZ3YgKyAxOworCXdoaWxlICghYmFkYXJnICYmICphcmdzICYmICphcmdzWzBdID09ICctJykKKwkJeworCQlpZiAoIXN0cmNtcCgqYXJncywiLXYyIikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCWNpcGhlcj1FVlBfZ2V0X2NpcGhlcmJ5bmFtZSgqYXJncyk7CisJCQkJaWYgKCFjaXBoZXIpCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkJICJVbmtub3duIGNpcGhlciAlc1xuIiwgKmFyZ3MpOworCQkJCQliYWRhcmcgPSAxOworCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCWJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi12MSIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlwYmVfbmlkPU9CSl90eHQybmlkKCphcmdzKTsKKwkJCQlpZiAocGJlX25pZCA9PSBOSURfdW5kZWYpCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkJICJVbmtub3duIFBCRSBhbGdvcml0aG0gJXNcbiIsICphcmdzKTsKKwkJCQkJYmFkYXJnID0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UKKwkJCQliYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItaW5mb3JtIikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCWluZm9ybWF0PXN0cjJmbXQoKmFyZ3MpOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLW91dGZvcm0iKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJb3V0Zm9ybWF0PXN0cjJmbXQoKmFyZ3MpOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItdG9wazgiKSkKKwkJCXRvcGs4ID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9pdGVyIikpCisJCQlpdGVyID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9jcnlwdCIpKQorCQkJbm9jcnlwdCA9IDE7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vb2N0IikpCisJCQlwOF9icm9rZW4gPSBQS0NTOF9OT19PQ1RFVDsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbnNkYiIpKQorCQkJcDhfYnJva2VuID0gUEtDUzhfTlNfREI7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWVtYmVkIikpCisJCQlwOF9icm9rZW4gPSBQS0NTOF9FTUJFRERFRF9QQVJBTTsKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLXBhc3NpbiIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKSBnb3RvIGJhZDsKKwkJCXBhc3Nhcmdpbj0gKigrK2FyZ3MpOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItcGFzc291dCIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKSBnb3RvIGJhZDsKKwkJCXBhc3NhcmdvdXQ9ICooKythcmdzKTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJZWxzZSBpZiAoc3RyY21wKCphcmdzLCItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkgZ290byBiYWQ7CisJCQllbmdpbmU9ICooKythcmdzKTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1pbiIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlpbmZpbGUgPSAqYXJnczsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW91dCIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlvdXRmaWxlID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGJhZGFyZyA9IDE7CisJCWFyZ3MrKzsKKwkJfQorCisJaWYgKGJhZGFyZykKKwkJeworCQliYWQ6CisJCUJJT19wcmludGYoYmlvX2VyciwgIlVzYWdlIHBrY3M4IFtvcHRpb25zXVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIndoZXJlIG9wdGlvbnMgYXJlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLWluIGZpbGUgICAgICAgIGlucHV0IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItaW5mb3JtIFggICAgICAgaW5wdXQgZm9ybWF0IChERVIgb3IgUEVNKVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1wYXNzaW4gYXJnICAgICBpbnB1dCBmaWxlIHBhc3MgcGhyYXNlIHNvdXJjZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1vdXRmb3JtIFggICAgICBvdXRwdXQgZm9ybWF0IChERVIgb3IgUEVNKVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1vdXQgZmlsZSAgICAgICBvdXRwdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1wYXNzb3V0IGFyZyAgICBvdXRwdXQgZmlsZSBwYXNzIHBocmFzZSBzb3VyY2VcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItdG9wazggICAgICAgICAgb3V0cHV0IFBLQ1M4IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItbm9vY3QgICAgICAgICAgdXNlIChub25zdGFuZGFyZCkgbm8gb2N0ZXQgZm9ybWF0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLWVtYmVkICAgICAgICAgIHVzZSAobm9uc3RhbmRhcmQpIGVtYmVkZGVkIERTQSBwYXJhbWV0ZXJzIGZvcm1hdFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1uc2RiICAgICAgICAgICB1c2UgKG5vbnN0YW5kYXJkKSBEU0EgTmV0c2NhcGUgREIgZm9ybWF0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLW5vaXRlciAgICAgICAgIHVzZSAxIGFzIGl0ZXJhdGlvbiBjb3VudFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1ub2NyeXB0ICAgICAgICB1c2Ugb3IgZXhwZWN0IHVuZW5jcnlwdGVkIHByaXZhdGUga2V5XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLXYyIGFsZyAgICAgICAgIHVzZSBQS0NTIzUgdjIuMCBhbmQgY2lwaGVyIFwiYWxnXCJcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItdjEgb2JqICAgICAgICAgdXNlIFBLQ1MjNSB2MS41IGFuZCBjaXBoZXIgXCJhbGdcIlxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1lbmdpbmUgZSAgICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJZ290byBlbmQ7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmICghYXBwX3Bhc3N3ZChiaW9fZXJyLCBwYXNzYXJnaW4sIHBhc3NhcmdvdXQsICZwYXNzaW4sICZwYXNzb3V0KSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBnZXR0aW5nIHBhc3N3b3Jkc1xuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoKHBiZV9uaWQgPT0gLTEpICYmICFjaXBoZXIpCisJCXBiZV9uaWQgPSBOSURfcGJlV2l0aE1ENUFuZERFU19DQkM7CisKKwlpZiAoaW5maWxlKQorCQl7CisJCWlmICghKGluID0gQklPX25ld19maWxlKGluZmlsZSwgInJiIikpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSAiQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBpbmZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCWluID0gQklPX25ld19mcCAoc3RkaW4sIEJJT19OT0NMT1NFKTsKKworCWlmIChvdXRmaWxlKQorCQl7CisJCWlmICghKG91dCA9IEJJT19uZXdfZmlsZSAob3V0ZmlsZSwgIndiIikpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSAiQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAlc1xuIiwgb3V0ZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlvdXQgPSBCSU9fbmV3X2ZwIChzdGRvdXQsIEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJCXsKKwkJCUJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQkJfQorI2VuZGlmCisJCX0KKwlpZiAodG9wazgpCisJCXsKKwkJcGtleSA9IGxvYWRfa2V5KGJpb19lcnIsIGluZmlsZSwgaW5mb3JtYXQsIDEsCisJCQlwYXNzaW4sIGUsICJrZXkiKTsKKwkJaWYgKCFwa2V5KQorCQkJZ290byBlbmQ7CisJCWlmICghKHA4aW5mID0gRVZQX1BLRVkyUEtDUzhfYnJva2VuKHBrZXksIHA4X2Jyb2tlbikpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgY29udmVydGluZyBrZXlcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAobm9jcnlwdCkKKwkJCXsKKwkJCWlmIChvdXRmb3JtYXQgPT0gRk9STUFUX1BFTSkgCisJCQkJUEVNX3dyaXRlX2Jpb19QS0NTOF9QUklWX0tFWV9JTkZPKG91dCwgcDhpbmYpOworCQkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJCWkyZF9QS0NTOF9QUklWX0tFWV9JTkZPX2JpbyhvdXQsIHA4aW5mKTsKKwkJCWVsc2UKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiQmFkIGZvcm1hdCBzcGVjaWZpZWQgZm9yIGtleVxuIik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAocGFzc291dCkKKwkJCQlwOHBhc3MgPSBwYXNzb3V0OworCQkJZWxzZQorCQkJCXsKKwkJCQlwOHBhc3MgPSBwYXNzOworCQkJCWlmIChFVlBfcmVhZF9wd19zdHJpbmcocGFzcywgc2l6ZW9mIHBhc3MsICJFbnRlciBFbmNyeXB0aW9uIFBhc3N3b3JkOiIsIDEpKQorCQkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgMCk7CisJCQlpZiAoIShwOCA9IFBLQ1M4X2VuY3J5cHQocGJlX25pZCwgY2lwaGVyLAorCQkJCQlwOHBhc3MsIHN0cmxlbihwOHBhc3MpLAorCQkJCQlOVUxMLCAwLCBpdGVyLCBwOGluZikpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBlbmNyeXB0aW5nIGtleVxuIik7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlhcHBfUkFORF93cml0ZV9maWxlKE5VTEwsIGJpb19lcnIpOworCQkJaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKSAKKwkJCQlQRU1fd3JpdGVfYmlvX1BLQ1M4KG91dCwgcDgpOworCQkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJCWkyZF9QS0NTOF9iaW8ob3V0LCBwOCk7CisJCQllbHNlCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkJhZCBmb3JtYXQgc3BlY2lmaWVkIGZvciBrZXlcbiIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKworCQlyZXQgPSAwOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKG5vY3J5cHQpCisJCXsKKwkJaWYgKGluZm9ybWF0ID09IEZPUk1BVF9QRU0pIAorCQkJcDhpbmYgPSBQRU1fcmVhZF9iaW9fUEtDUzhfUFJJVl9LRVlfSU5GTyhpbixOVUxMLE5VTEwsIE5VTEwpOworCQllbHNlIGlmIChpbmZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJCXA4aW5mID0gZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk9fYmlvKGluLCBOVUxMKTsKKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiQmFkIGZvcm1hdCBzcGVjaWZpZWQgZm9yIGtleVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpZiAoaW5mb3JtYXQgPT0gRk9STUFUX1BFTSkgCisJCQlwOCA9IFBFTV9yZWFkX2Jpb19QS0NTOChpbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWVsc2UgaWYgKGluZm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJcDggPSBkMmlfUEtDUzhfYmlvKGluLCBOVUxMKTsKKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiQmFkIGZvcm1hdCBzcGVjaWZpZWQgZm9yIGtleVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQlpZiAoIXA4KQorCQkJeworCQkJQklPX3ByaW50ZiAoYmlvX2VyciwgIkVycm9yIHJlYWRpbmcga2V5XG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKHBhc3NpbikKKwkJCXA4cGFzcyA9IHBhc3NpbjsKKwkJZWxzZQorCQkJeworCQkJcDhwYXNzID0gcGFzczsKKwkJCUVWUF9yZWFkX3B3X3N0cmluZyhwYXNzLCBzaXplb2YgcGFzcywgIkVudGVyIFBhc3N3b3JkOiIsIDApOworCQkJfQorCQlwOGluZiA9IFBLQ1M4X2RlY3J5cHQocDgsIHA4cGFzcywgc3RybGVuKHA4cGFzcykpOworCQl9CisKKwlpZiAoIXA4aW5mKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGRlY3J5cHRpbmcga2V5XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmICghKHBrZXkgPSBFVlBfUEtDUzgyUEtFWShwOGluZikpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGNvbnZlcnRpbmcga2V5XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKwkKKwlpZiAocDhpbmYtPmJyb2tlbikKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJXYXJuaW5nOiBicm9rZW4ga2V5IGVuY29kaW5nOiAiKTsKKwkJc3dpdGNoIChwOGluZi0+YnJva2VuKQorCQkJeworCQkJY2FzZSBQS0NTOF9OT19PQ1RFVDoKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIk5vIE9jdGV0IFN0cmluZyBpbiBQcml2YXRlS2V5XG4iKTsKKwkJCWJyZWFrOworCisJCQljYXNlIFBLQ1M4X0VNQkVEREVEX1BBUkFNOgorCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRFNBIHBhcmFtZXRlcnMgaW5jbHVkZWQgaW4gUHJpdmF0ZUtleVxuIik7CisJCQlicmVhazsKKworCQkJY2FzZSBQS0NTOF9OU19EQjoKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkRTQSBwdWJsaWMga2V5IGluY2x1ZGUgaW4gUHJpdmF0ZUtleVxuIik7CisJCQlicmVhazsKKworCQkJY2FzZSBQS0NTOF9ORUdfUFJJVktFWToKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkRTQSBwcml2YXRlIGtleSB2YWx1ZSBpcyBuZWdhdGl2ZVxuIik7CisJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIlVua25vd24gYnJva2VuIHR5cGVcbiIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJCisJaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKSAKKwkJUEVNX3dyaXRlX2Jpb19Qcml2YXRlS2V5KG91dCwgcGtleSwgTlVMTCwgTlVMTCwgMCwgTlVMTCwgcGFzc291dCk7CisJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQlpMmRfUHJpdmF0ZUtleV9iaW8ob3V0LCBwa2V5KTsKKwllbHNlCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiQmFkIGZvcm1hdCBzcGVjaWZpZWQgZm9yIGtleVxuIik7CisJCQlnb3RvIGVuZDsKKwkJfQorCXJldCA9IDA7CisKKwllbmQ6CisJWDUwOV9TSUdfZnJlZShwOCk7CisJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCUJJT19mcmVlX2FsbChvdXQpOworCUJJT19mcmVlKGluKTsKKwlpZiAocGFzc2luKQorCQlPUEVOU1NMX2ZyZWUocGFzc2luKTsKKwlpZiAocGFzc291dCkKKwkJT1BFTlNTTF9mcmVlKHBhc3NvdXQpOworCisJcmV0dXJuIHJldDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3BrZXkuYyBiL2xpYi9vcGVuc3NsL2FwcHMvcGtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZTY3MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3BrZXkuYwpAQCAtMCwwICsxLDI4NCBAQAorLyogYXBwcy9wa2V5LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA2CisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2RlZmluZSBQUk9HIHBrZXlfbWFpbgorCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCUVOR0lORSAqZSA9IE5VTEw7CisJY2hhciAqKmFyZ3MsICppbmZpbGUgPSBOVUxMLCAqb3V0ZmlsZSA9IE5VTEw7CisJY2hhciAqcGFzc2FyZ2luID0gTlVMTCwgKnBhc3NhcmdvdXQgPSBOVUxMOworCUJJTyAqaW4gPSBOVUxMLCAqb3V0ID0gTlVMTDsKKwljb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIgPSBOVUxMOworCWludCBpbmZvcm1hdCwgb3V0Zm9ybWF0OworCWludCBwdWJpbiA9IDAsIHB1Ym91dCA9IDAsIHB1YnRleHQgPSAwLCB0ZXh0ID0gMCwgbm9vdXQgPSAwOworCUVWUF9QS0VZICpwa2V5PU5VTEw7CisJY2hhciAqcGFzc2luID0gTlVMTCwgKnBhc3NvdXQgPSBOVUxMOworCWludCBiYWRhcmcgPSAwOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWNoYXIgKmVuZ2luZT1OVUxMOworI2VuZGlmCisJaW50IHJldCA9IDE7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQliaW9fZXJyID0gQklPX25ld19mcCAoc3RkZXJyLCBCSU9fTk9DTE9TRSk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKworCWluZm9ybWF0PUZPUk1BVF9QRU07CisJb3V0Zm9ybWF0PUZPUk1BVF9QRU07CisKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisJYXJncyA9IGFyZ3YgKyAxOworCXdoaWxlICghYmFkYXJnICYmICphcmdzICYmICphcmdzWzBdID09ICctJykKKwkJeworCQlpZiAoIXN0cmNtcCgqYXJncywiLWluZm9ybSIpKQorCQkJeworCQkJaWYgKGFyZ3NbMV0pCisJCQkJeworCQkJCWFyZ3MrKzsKKwkJCQlpbmZvcm1hdD1zdHIyZm10KCphcmdzKTsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1vdXRmb3JtIikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCW91dGZvcm1hdD1zdHIyZm10KCphcmdzKTsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1wYXNzaW4iKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkgZ290byBiYWQ7CisJCQlwYXNzYXJnaW49ICooKythcmdzKTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLXBhc3NvdXQiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkgZ290byBiYWQ7CisJCQlwYXNzYXJnb3V0PSAqKCsrYXJncyk7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJncywiLWVuZ2luZSIpID09IDApCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pIGdvdG8gYmFkOworCQkJZW5naW5lPSAqKCsrYXJncyk7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItaW4iKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJaW5maWxlID0gKmFyZ3M7CisJCQkJfQorCQkJZWxzZSBiYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1vdXQiKSkKKwkJCXsKKwkJCWlmIChhcmdzWzFdKQorCQkJCXsKKwkJCQlhcmdzKys7CisJCQkJb3V0ZmlsZSA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmdzLCItcHViaW4iKSA9PSAwKQorCQkJeworCQkJcHViaW49MTsKKwkJCXB1Ym91dD0xOworCQkJcHVidGV4dD0xOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3MsIi1wdWJvdXQiKSA9PSAwKQorCQkJcHVib3V0PTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJncywiLXRleHRfcHViIikgPT0gMCkKKwkJCXsKKwkJCXB1YnRleHQ9MTsKKwkJCXRleHQ9MTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmdzLCItdGV4dCIpID09IDApCisJCQl0ZXh0PTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJncywiLW5vb3V0IikgPT0gMCkKKwkJCW5vb3V0PTE7CisJCWVsc2UKKwkJCXsKKwkJCWNpcGhlciA9IEVWUF9nZXRfY2lwaGVyYnluYW1lKCphcmdzICsgMSk7CisJCQlpZiAoIWNpcGhlcikKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiVW5rbm93biBjaXBoZXIgJXNcbiIsCisJCQkJCQkJCSphcmdzICsgMSk7CisJCQkJYmFkYXJnID0gMTsKKwkJCQl9CisJCQl9CisJCWFyZ3MrKzsKKwkJfQorCisJaWYgKGJhZGFyZykKKwkJeworCQliYWQ6CisJCUJJT19wcmludGYoYmlvX2VyciwgIlVzYWdlIHBrZXkgW29wdGlvbnNdXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAid2hlcmUgb3B0aW9ucyBhcmVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItaW4gZmlsZSAgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1pbmZvcm0gWCAgICAgICBpbnB1dCBmb3JtYXQgKERFUiBvciBQRU0pXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLXBhc3NpbiBhcmcgICAgIGlucHV0IGZpbGUgcGFzcyBwaHJhc2Ugc291cmNlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLW91dGZvcm0gWCAgICAgIG91dHB1dCBmb3JtYXQgKERFUiBvciBQRU0pXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLW91dCBmaWxlICAgICAgIG91dHB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLXBhc3NvdXQgYXJnICAgIG91dHB1dCBmaWxlIHBhc3MgcGhyYXNlIHNvdXJjZVxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYoYmlvX2VyciwgIi1lbmdpbmUgZSAgICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmICghYXBwX3Bhc3N3ZChiaW9fZXJyLCBwYXNzYXJnaW4sIHBhc3NhcmdvdXQsICZwYXNzaW4sICZwYXNzb3V0KSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBnZXR0aW5nIHBhc3N3b3Jkc1xuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAob3V0ZmlsZSkKKwkJeworCQlpZiAoIShvdXQgPSBCSU9fbmV3X2ZpbGUgKG91dGZpbGUsICJ3YiIpKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJb3V0ID0gQklPX25ld19mcCAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCQl7CisJCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJCW91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwlpZiAocHViaW4pCisJCXBrZXkgPSBsb2FkX3B1YmtleShiaW9fZXJyLCBpbmZpbGUsIGluZm9ybWF0LCAxLAorCQkJcGFzc2luLCBlLCAiUHVibGljIEtleSIpOworCWVsc2UKKwkJcGtleSA9IGxvYWRfa2V5KGJpb19lcnIsIGluZmlsZSwgaW5mb3JtYXQsIDEsCisJCQlwYXNzaW4sIGUsICJrZXkiKTsKKwlpZiAoIXBrZXkpCisJCWdvdG8gZW5kOworCisJaWYgKCFub291dCkKKwkJeworCQlpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pIAorCQkJeworCQkJaWYgKHB1Ym91dCkKKwkJCQlQRU1fd3JpdGVfYmlvX1BVQktFWShvdXQscGtleSk7CisJCQllbHNlCisJCQkJUEVNX3dyaXRlX2Jpb19Qcml2YXRlS2V5KG91dCwgcGtleSwgY2lwaGVyLAorCQkJCQkJCU5VTEwsIDAsIE5VTEwsIHBhc3NvdXQpOworCQkJfQorCQllbHNlIGlmIChvdXRmb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCQl7CisJCQlpZiAocHVib3V0KQorCQkJCWkyZF9QVUJLRVlfYmlvKG91dCwgcGtleSk7CisJCQllbHNlCisJCQkJaTJkX1ByaXZhdGVLZXlfYmlvKG91dCwgcGtleSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkJhZCBmb3JtYXQgc3BlY2lmaWVkIGZvciBrZXlcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJfQorCisJaWYgKHRleHQpCisJCXsKKwkJaWYgKHB1YnRleHQpCisJCQlFVlBfUEtFWV9wcmludF9wdWJsaWMob3V0LCBwa2V5LCAwLCBOVUxMKTsKKwkJZWxzZQorCQkJRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZShvdXQsIHBrZXksIDAsIE5VTEwpOworCQl9CisKKwlyZXQgPSAwOworCisJZW5kOgorCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJQklPX2ZyZWVfYWxsKG91dCk7CisJQklPX2ZyZWUoaW4pOworCWlmIChwYXNzaW4pCisJCU9QRU5TU0xfZnJlZShwYXNzaW4pOworCWlmIChwYXNzb3V0KQorCQlPUEVOU1NMX2ZyZWUocGFzc291dCk7CisKKwlyZXR1cm4gcmV0OworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcGtleXBhcmFtLmMgYi9saWIvb3BlbnNzbC9hcHBzL3BrZXlwYXJhbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTgwMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3BrZXlwYXJhbS5jCkBAIC0wLDAgKzEsMjAxIEBACisvKiBhcHBzL3BrZXlwYXJhbS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNkZWZpbmUgUFJPRyBwa2V5cGFyYW1fbWFpbgorCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCWNoYXIgKiphcmdzLCAqaW5maWxlID0gTlVMTCwgKm91dGZpbGUgPSBOVUxMOworCUJJTyAqaW4gPSBOVUxMLCAqb3V0ID0gTlVMTDsKKwlpbnQgdGV4dCA9IDAsIG5vb3V0ID0gMDsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCWludCBiYWRhcmcgPSAwOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCUVOR0lORSAqZSA9IE5VTEw7CisJY2hhciAqZW5naW5lPU5VTEw7CisjZW5kaWYKKwlpbnQgcmV0ID0gMTsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWJpb19lcnIgPSBCSU9fbmV3X2ZwIChzdGRlcnIsIEJJT19OT0NMT1NFKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKwlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOworCWFyZ3MgPSBhcmd2ICsgMTsKKwl3aGlsZSAoIWJhZGFyZyAmJiAqYXJncyAmJiAqYXJnc1swXSA9PSAnLScpCisJCXsKKwkJaWYgKCFzdHJjbXAgKCphcmdzLCAiLWluIikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCWluZmlsZSA9ICphcmdzOworCQkJCX0KKwkJCWVsc2UgYmFkYXJnID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItb3V0IikpCisJCQl7CisJCQlpZiAoYXJnc1sxXSkKKwkJCQl7CisJCQkJYXJncysrOworCQkJCW91dGZpbGUgPSAqYXJnczsKKwkJCQl9CisJCQllbHNlIGJhZGFyZyA9IDE7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJncywiLWVuZ2luZSIpID09IDApCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pIGdvdG8gYmFkOworCQkJZW5naW5lPSAqKCsrYXJncyk7CisJCQl9CisjZW5kaWYKKworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3MsIi10ZXh0IikgPT0gMCkKKwkJCXRleHQ9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmdzLCItbm9vdXQiKSA9PSAwKQorCQkJbm9vdXQ9MTsKKwkJYXJncysrOworCQl9CisKKwlpZiAoYmFkYXJnKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWJhZDoKKyNlbmRpZgorCQlCSU9fcHJpbnRmKGJpb19lcnIsICJVc2FnZSBwa2V5cGFyYW0gW29wdGlvbnNdXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAid2hlcmUgb3B0aW9ucyBhcmVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItaW4gZmlsZSAgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1vdXQgZmlsZSAgICAgICBvdXRwdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi10ZXh0ICAgICAgICAgICBwcmludCBwYXJhbWV0ZXJzIGFzIHRleHRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItbm9vdXQgICAgICAgICAgZG9uJ3Qgb3V0cHV0IGVuY29kZWQgcGFyYW1ldGVyc1xuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYoYmlvX2VyciwgIi1lbmdpbmUgZSAgICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIDE7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmIChpbmZpbGUpCisJCXsKKwkJaWYgKCEoaW4gPSBCSU9fbmV3X2ZpbGUgKGluZmlsZSwgInIiKSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJICJDYW4ndCBvcGVuIGlucHV0IGZpbGUgJXNcbiIsIGluZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJaW4gPSBCSU9fbmV3X2ZwIChzdGRpbiwgQklPX05PQ0xPU0UpOworCisJaWYgKG91dGZpbGUpCisJCXsKKwkJaWYgKCEob3V0ID0gQklPX25ld19maWxlIChvdXRmaWxlLCAidyIpKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJb3V0ID0gQklPX25ld19mcCAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCQl7CisJCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJCW91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwlwa2V5ID0gUEVNX3JlYWRfYmlvX1BhcmFtZXRlcnMoaW4sIE5VTEwpOworCWlmICghcGtleSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciByZWFkaW5nIHBhcmFtZXRlcnNcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKCFub291dCkKKwkJUEVNX3dyaXRlX2Jpb19QYXJhbWV0ZXJzKG91dCxwa2V5KTsKKworCWlmICh0ZXh0KQorCQlFVlBfUEtFWV9wcmludF9wYXJhbXMob3V0LCBwa2V5LCAwLCBOVUxMKTsKKworCXJldCA9IDA7CisKKwllbmQ6CisJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlCSU9fZnJlZV9hbGwob3V0KTsKKwlCSU9fZnJlZShpbik7CisKKwlyZXR1cm4gcmV0OworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcGtleXV0bC5jIGIvbGliL29wZW5zc2wvYXBwcy9wa2V5dXRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhNmM0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvcGtleXV0bC5jCkBAIC0wLDAgKzEsNTcwIEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNkZWZpbmUgS0VZX1BSSVZLRVkJMQorI2RlZmluZSBLRVlfUFVCS0VZCTIKKyNkZWZpbmUgS0VZX0NFUlQJMworCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKTsKKworI3VuZGVmIFBST0cKKworI2RlZmluZSBQUk9HIHBrZXl1dGxfbWFpbgorCitzdGF0aWMgRVZQX1BLRVlfQ1RYICppbml0X2N0eChpbnQgKnBrZXlzaXplLAorCQkJCWNoYXIgKmtleWZpbGUsIGludCBrZXlmb3JtLCBpbnQga2V5X3R5cGUsCisJCQkJY2hhciAqcGFzc2FyZ2luLCBpbnQgcGtleV9vcCwgRU5HSU5FICplKTsKKworc3RhdGljIGludCBzZXR1cF9wZWVyKEJJTyAqZXJyLCBFVlBfUEtFWV9DVFggKmN0eCwgaW50IHBlZXJmb3JtLAorCQkJCQkJCWNvbnN0IGNoYXIgKmZpbGUpOworCitzdGF0aWMgaW50IGRvX2tleW9wKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgcGtleV9vcCwKKwkJdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgKnBvdXRsZW4sCisJCXVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlCSU8gKmluID0gTlVMTCwgKm91dCA9IE5VTEw7CisJY2hhciAqaW5maWxlID0gTlVMTCwgKm91dGZpbGUgPSBOVUxMLCAqc2lnZmlsZSA9IE5VTEw7CisJRU5HSU5FICplID0gTlVMTDsKKwlpbnQgcGtleV9vcCA9IEVWUF9QS0VZX09QX1NJR04sIGtleV90eXBlID0gS0VZX1BSSVZLRVk7CisJaW50IGtleWZvcm0gPSBGT1JNQVRfUEVNLCBwZWVyZm9ybSA9IEZPUk1BVF9QRU07CisJY2hhciBiYWRhcmcgPSAwLCByZXYgPSAwOworCWNoYXIgaGV4ZHVtcCA9IDAsIGFzbjFwYXJzZSA9IDA7CisJRVZQX1BLRVlfQ1RYICpjdHggPSBOVUxMOworCWNoYXIgKnBhc3NhcmdpbiA9IE5VTEw7CisJaW50IGtleXNpemUgPSAtMTsKKworCXVuc2lnbmVkIGNoYXIgKmJ1Zl9pbiA9IE5VTEwsICpidWZfb3V0ID0gTlVMTCwgKnNpZyA9IE5VTEw7CisJc2l6ZV90IGJ1Zl9vdXRsZW47CisJaW50IGJ1Zl9pbmxlbiA9IDAsIHNpZ2xlbiA9IC0xOworCisJaW50IHJldCA9IDEsIHJ2ID0gLTE7CisKKwlhcmdjLS07CisJYXJndisrOworCisJaWYoIWJpb19lcnIpIGJpb19lcnIgPSBCSU9fbmV3X2ZwKHN0ZGVyciwgQklPX05PQ0xPU0UpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKwlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOworCQorCXdoaWxlKGFyZ2MgPj0gMSkKKwkJeworCQlpZiAoIXN0cmNtcCgqYXJndiwiLWluIikpCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYmFkYXJnID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCItb3V0IikpCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYmFkYXJnID0gMTsKKwkJCW91dGZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwiLXNpZ2ZpbGUiKSkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBiYWRhcmcgPSAxOworCQkJc2lnZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItaW5rZXkiKSkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKQorCQkJCWJhZGFyZyA9IDE7CisJCQllbHNlCisJCQkJeworCQkJCWN0eCA9IGluaXRfY3R4KCZrZXlzaXplLAorCQkJCQkJKigrK2FyZ3YpLCBrZXlmb3JtLCBrZXlfdHlwZSwKKwkJCQkJCXBhc3NhcmdpbiwgcGtleV9vcCwgZSk7CisJCQkJaWYgKCFjdHgpCisJCQkJCXsKKwkJCQkJQklPX3B1dHMoYmlvX2VyciwKKwkJCQkJCSJFcnJvciBpbml0aWFsaXppbmcgY29udGV4dFxuIik7CisJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJCWJhZGFyZyA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsIi1wZWVya2V5IikpCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkKKwkJCQliYWRhcmcgPSAxOworCQkJZWxzZSBpZiAoIXNldHVwX3BlZXIoYmlvX2VyciwgY3R4LCBwZWVyZm9ybSwgKigrK2FyZ3YpKSkKKwkJCQliYWRhcmcgPSAxOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKCphcmd2LCItcGFzc2luIikpCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYmFkYXJnID0gMTsKKwkJCXBhc3Nhcmdpbj0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wZWVyZm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYmFkYXJnID0gMTsKKwkJCXBlZXJmb3JtPXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCIta2V5Zm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgYmFkYXJnID0gMTsKKwkJCWtleWZvcm09c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItZW5naW5lIikpCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkKKwkJCQliYWRhcmcgPSAxOworCQkJZWxzZQorCQkJCWUgPSBzZXR1cF9lbmdpbmUoYmlvX2VyciwgKigrK2FyZ3YpLCAwKTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItcHViaW4iKSkKKwkJCWtleV90eXBlID0gS0VZX1BVQktFWTsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLWNlcnRpbiIpKQorCQkJa2V5X3R5cGUgPSBLRVlfQ0VSVDsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLWFzbjFwYXJzZSIpKQorCQkJYXNuMXBhcnNlID0gMTsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLWhleGR1bXAiKSkKKwkJCWhleGR1bXAgPSAxOworCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItc2lnbiIpKQorCQkJcGtleV9vcCA9IEVWUF9QS0VZX09QX1NJR047CisJCWVsc2UgaWYoIXN0cmNtcCgqYXJndiwgIi12ZXJpZnkiKSkKKwkJCXBrZXlfb3AgPSBFVlBfUEtFWV9PUF9WRVJJRlk7CisJCWVsc2UgaWYoIXN0cmNtcCgqYXJndiwgIi12ZXJpZnlyZWNvdmVyIikpCisJCQlwa2V5X29wID0gRVZQX1BLRVlfT1BfVkVSSUZZUkVDT1ZFUjsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLXJldiIpKQorCQkJcmV2ID0gMTsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLWVuY3J5cHQiKSkKKwkJCXBrZXlfb3AgPSBFVlBfUEtFWV9PUF9FTkNSWVBUOworCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItZGVjcnlwdCIpKQorCQkJcGtleV9vcCA9IEVWUF9QS0VZX09QX0RFQ1JZUFQ7CisJCWVsc2UgaWYoIXN0cmNtcCgqYXJndiwgIi1kZXJpdmUiKSkKKwkJCXBrZXlfb3AgPSBFVlBfUEtFWV9PUF9ERVJJVkU7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBrZXlvcHQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpCisJCQkJYmFkYXJnID0gMTsKKwkJCWVsc2UgaWYgKCFjdHgpCisJCQkJeworCQkJCUJJT19wdXRzKGJpb19lcnIsCisJCQkJCSItcGtleW9wdCBjb21tYW5kIGJlZm9yZSAtaW5rZXlcbiIpOworCQkJCWJhZGFyZyA9IDE7CisJCQkJfQorCQkJZWxzZSBpZiAocGtleV9jdHJsX3N0cmluZyhjdHgsICooKythcmd2KSkgPD0gMCkKKwkJCQl7CisJCQkJQklPX3B1dHMoYmlvX2VyciwgInBhcmFtZXRlciBzZXR0aW5nIGVycm9yXG4iKTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJZWxzZSBiYWRhcmcgPSAxOworCQlpZihiYWRhcmcpCisJCQl7CisJCQl1c2FnZSgpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQl9CisKKwlpZiAoIWN0eCkKKwkJeworCQl1c2FnZSgpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKHNpZ2ZpbGUgJiYgKHBrZXlfb3AgIT0gRVZQX1BLRVlfT1BfVkVSSUZZKSkKKwkJeworCQlCSU9fcHV0cyhiaW9fZXJyLCAiU2lnbmF0dXJlIGZpbGUgc3BlY2lmaWVkIGZvciBub24gdmVyaWZ5XG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmICghc2lnZmlsZSAmJiAocGtleV9vcCA9PSBFVlBfUEtFWV9PUF9WRVJJRlkpKQorCQl7CisJCUJJT19wdXRzKGJpb19lcnIsICJObyBzaWduYXR1cmUgZmlsZSBzcGVjaWZpZWQgZm9yIHZlcmlmeVxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKy8qIEZJWE1FOiBzZWVkIFBSTkcgb25seSBpZiBuZWVkZWQgKi8KKwlhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgMCk7CisKKwlpZiAocGtleV9vcCAhPSBFVlBfUEtFWV9PUF9ERVJJVkUpCisJCXsKKwkJaWYoaW5maWxlKQorCQkJeworCQkJaWYoIShpbiA9IEJJT19uZXdfZmlsZShpbmZpbGUsICJyYiIpKSkKKwkJCQl7CisJCQkJQklPX3B1dHMoYmlvX2VyciwKKwkJCQkJIkVycm9yIE9wZW5pbmcgSW5wdXQgRmlsZVxuIik7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsJCisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQlpbiA9IEJJT19uZXdfZnAoc3RkaW4sIEJJT19OT0NMT1NFKTsKKwkJfQorCisJaWYob3V0ZmlsZSkKKwkJeworCQlpZighKG91dCA9IEJJT19uZXdfZmlsZShvdXRmaWxlLCAid2IiKSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBDcmVhdGluZyBPdXRwdXQgRmlsZVxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOwkKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCW91dCA9IEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJICAgIEJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQkgICAgb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwl9CisKKwlpZiAoc2lnZmlsZSkKKwkJeworCQlCSU8gKnNpZ2JpbyA9IEJJT19uZXdfZmlsZShzaWdmaWxlLCAicmIiKTsKKwkJaWYgKCFzaWdiaW8pCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJDYW4ndCBvcGVuIHNpZ25hdHVyZSBmaWxlICVzXG4iLAorCQkJCQkJCQlzaWdmaWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlzaWdsZW4gPSBiaW9fdG9fbWVtKCZzaWcsIGtleXNpemUgKiAxMCwgc2lnYmlvKTsKKwkJQklPX2ZyZWUoc2lnYmlvKTsKKwkJaWYgKHNpZ2xlbiA8PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgcmVhZGluZyBzaWduYXR1cmUgZGF0YVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCQorCWlmIChpbikKKwkJeworCQkvKiBSZWFkIHRoZSBpbnB1dCBkYXRhICovCisJCWJ1Zl9pbmxlbiA9IGJpb190b19tZW0oJmJ1Zl9pbiwga2V5c2l6ZSAqIDEwLCBpbik7CisJCWlmKGJ1Zl9pbmxlbiA8PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgcmVhZGluZyBpbnB1dCBEYXRhXG4iKTsKKwkJCWV4aXQoMSk7CisJCQl9CisJCWlmKHJldikKKwkJCXsKKwkJCXNpemVfdCBpOworCQkJdW5zaWduZWQgY2hhciBjdG1wOworCQkJc2l6ZV90IGwgPSAoc2l6ZV90KWJ1Zl9pbmxlbjsKKwkJCWZvcihpID0gMDsgaSA8IGwvMjsgaSsrKQorCQkJCXsKKwkJCQljdG1wID0gYnVmX2luW2ldOworCQkJCWJ1Zl9pbltpXSA9IGJ1Zl9pbltsIC0gMSAtIGldOworCQkJCWJ1Zl9pbltsIC0gMSAtIGldID0gY3RtcDsKKwkJCQl9CisJCQl9CisJCX0KKworCWlmKHBrZXlfb3AgPT0gRVZQX1BLRVlfT1BfVkVSSUZZKQorCQl7CisJCXJ2ICA9IEVWUF9QS0VZX3ZlcmlmeShjdHgsIHNpZywgKHNpemVfdClzaWdsZW4sCisJCQkJICAgICAgYnVmX2luLCAoc2l6ZV90KWJ1Zl9pbmxlbik7CisJCWlmIChydiA9PSAwKQorCQkJQklPX3B1dHMob3V0LCAiU2lnbmF0dXJlIFZlcmlmaWNhdGlvbiBGYWlsdXJlXG4iKTsKKwkJZWxzZSBpZiAocnYgPT0gMSkKKwkJCUJJT19wdXRzKG91dCwgIlNpZ25hdHVyZSBWZXJpZmllZCBTdWNjZXNzZnVsbHlcbiIpOworCQlpZiAocnYgPj0gMCkKKwkJCWdvdG8gZW5kOworCQl9CisJZWxzZQorCQl7CQorCQlydiA9IGRvX2tleW9wKGN0eCwgcGtleV9vcCwgTlVMTCwgKHNpemVfdCAqKSZidWZfb3V0bGVuLAorCQkJICAgICAgYnVmX2luLCAoc2l6ZV90KWJ1Zl9pbmxlbik7CisJCWlmIChydiA+IDApCisJCQl7CisJCQlidWZfb3V0ID0gT1BFTlNTTF9tYWxsb2MoYnVmX291dGxlbik7CisJCQlpZiAoIWJ1Zl9vdXQpCisJCQkJcnYgPSAtMTsKKwkJCWVsc2UKKwkJCQlydiA9IGRvX2tleW9wKGN0eCwgcGtleV9vcCwKKwkJCQkJCWJ1Zl9vdXQsIChzaXplX3QgKikmYnVmX291dGxlbiwKKwkJCQkJCWJ1Zl9pbiwgKHNpemVfdClidWZfaW5sZW4pOworCQkJfQorCQl9CisKKwlpZihydiA8PSAwKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIlB1YmxpYyBLZXkgb3BlcmF0aW9uIGVycm9yXG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKwlyZXQgPSAwOworCWlmKGFzbjFwYXJzZSkKKwkJeworCQlpZighQVNOMV9wYXJzZV9kdW1wKG91dCwgYnVmX291dCwgYnVmX291dGxlbiwgMSwgLTEpKQorCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJfQorCWVsc2UgaWYoaGV4ZHVtcCkKKwkJQklPX2R1bXAob3V0LCAoY2hhciAqKWJ1Zl9vdXQsIGJ1Zl9vdXRsZW4pOworCWVsc2UKKwkJQklPX3dyaXRlKG91dCwgYnVmX291dCwgYnVmX291dGxlbik7CisKKwllbmQ6CisJaWYgKGN0eCkKKwkJRVZQX1BLRVlfQ1RYX2ZyZWUoY3R4KTsKKwlCSU9fZnJlZShpbik7CisJQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKGJ1Zl9pbikKKwkJT1BFTlNTTF9mcmVlKGJ1Zl9pbik7CisJaWYgKGJ1Zl9vdXQpCisJCU9QRU5TU0xfZnJlZShidWZfb3V0KTsKKwlpZiAoc2lnKQorCQlPUEVOU1NMX2ZyZWUoc2lnKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB1c2FnZSgpCit7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiVXNhZ2U6IHBrZXl1dGwgW29wdGlvbnNdXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICItaW4gZmlsZSAgICAgICAgaW5wdXQgZmlsZVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLW91dCBmaWxlICAgICAgIG91dHB1dCBmaWxlXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICItc2lnZmlsZSBmaWxlIHNpZ25hdHVyZSBmaWxlICh2ZXJpZnkgb3BlcmF0aW9uIG9ubHkpXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICItaW5rZXkgZmlsZSAgICAgaW5wdXQga2V5XG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICIta2V5Zm9ybSBhcmcgICAgcHJpdmF0ZSBrZXkgZm9ybWF0IC0gZGVmYXVsdCBQRU1cbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgIi1wdWJpbiAgICAgICAgICBpbnB1dCBpcyBhIHB1YmxpYyBrZXlcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgIi1jZXJ0aW4gICAgICAgICBpbnB1dCBpcyBhIGNlcnRpZmljYXRlIGNhcnJ5aW5nIGEgcHVibGljIGtleVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLXBrZXlvcHQgWDpZICAgIHB1YmxpYyBrZXkgb3B0aW9uc1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLXNpZ24gICAgICAgICAgIHNpZ24gd2l0aCBwcml2YXRlIGtleVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLXZlcmlmeSAgICAgICAgIHZlcmlmeSB3aXRoIHB1YmxpYyBrZXlcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgIi12ZXJpZnlyZWNvdmVyICB2ZXJpZnkgd2l0aCBwdWJsaWMga2V5LCByZWNvdmVyIG9yaWdpbmFsIGRhdGFcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgIi1lbmNyeXB0ICAgICAgICBlbmNyeXB0IHdpdGggcHVibGljIGtleVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWRlY3J5cHQgICAgICAgIGRlY3J5cHQgd2l0aCBwcml2YXRlIGtleVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWRlcml2ZSAgICAgICAgIGRlcml2ZSBzaGFyZWQgc2VjcmV0XG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICItaGV4ZHVtcCAgICAgICAgaGV4IGR1bXAgb3V0cHV0XG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlCSU9fcHJpbnRmKGJpb19lcnIsICItZW5naW5lIGUgICAgICAgdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIpOworI2VuZGlmCisJQklPX3ByaW50ZihiaW9fZXJyLCAiLXBhc3NpbiBhcmcgICAgIHBhc3MgcGhyYXNlIHNvdXJjZVxuIik7CisKK30KKworc3RhdGljIEVWUF9QS0VZX0NUWCAqaW5pdF9jdHgoaW50ICpwa2V5c2l6ZSwKKwkJCQljaGFyICprZXlmaWxlLCBpbnQga2V5Zm9ybSwgaW50IGtleV90eXBlLAorCQkJCWNoYXIgKnBhc3NhcmdpbiwgaW50IHBrZXlfb3AsIEVOR0lORSAqZSkKKwl7CisJRVZQX1BLRVkgKnBrZXkgPSBOVUxMOworCUVWUF9QS0VZX0NUWCAqY3R4ID0gTlVMTDsKKwljaGFyICpwYXNzaW4gPSBOVUxMOworCWludCBydiA9IC0xOworCVg1MDkgKng7CisJaWYoKChwa2V5X29wID09IEVWUF9QS0VZX09QX1NJR04pIHx8IChwa2V5X29wID09IEVWUF9QS0VZX09QX0RFQ1JZUFQpIAorCQl8fCAocGtleV9vcCA9PSBFVlBfUEtFWV9PUF9ERVJJVkUpKQorCQkmJiAoa2V5X3R5cGUgIT0gS0VZX1BSSVZLRVkpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkEgcHJpdmF0ZSBrZXkgaXMgbmVlZGVkIGZvciB0aGlzIG9wZXJhdGlvblxuIik7CisJCWdvdG8gZW5kOworCQl9CisJaWYoIWFwcF9wYXNzd2QoYmlvX2VyciwgcGFzc2FyZ2luLCBOVUxMLCAmcGFzc2luLCBOVUxMKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBnZXR0aW5nIHBhc3N3b3JkXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKwlzd2l0Y2goa2V5X3R5cGUpCisJCXsKKwkJY2FzZSBLRVlfUFJJVktFWToKKwkJcGtleSA9IGxvYWRfa2V5KGJpb19lcnIsIGtleWZpbGUsIGtleWZvcm0sIDAsCisJCQlwYXNzaW4sIGUsICJQcml2YXRlIEtleSIpOworCQlicmVhazsKKworCQljYXNlIEtFWV9QVUJLRVk6CisJCXBrZXkgPSBsb2FkX3B1YmtleShiaW9fZXJyLCBrZXlmaWxlLCBrZXlmb3JtLCAwLAorCQkJTlVMTCwgZSwgIlB1YmxpYyBLZXkiKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBLRVlfQ0VSVDoKKwkJeCA9IGxvYWRfY2VydChiaW9fZXJyLCBrZXlmaWxlLCBrZXlmb3JtLAorCQkJTlVMTCwgZSwgIkNlcnRpZmljYXRlIik7CisJCWlmKHgpCisJCQl7CisJCQlwa2V5ID0gWDUwOV9nZXRfcHVia2V5KHgpOworCQkJWDUwOV9mcmVlKHgpOworCQkJfQorCQlicmVhazsKKworCQl9CisKKwkqcGtleXNpemUgPSBFVlBfUEtFWV9zaXplKHBrZXkpOworCisJaWYgKCFwa2V5KQorCQlnb3RvIGVuZDsKKworCWN0eCA9IEVWUF9QS0VZX0NUWF9uZXcocGtleSwgZSk7CisKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCisJaWYgKCFjdHgpCisJCWdvdG8gZW5kOworCisJc3dpdGNoKHBrZXlfb3ApCisJCXsKKwkJY2FzZSBFVlBfUEtFWV9PUF9TSUdOOgorCQlydiA9IEVWUF9QS0VZX3NpZ25faW5pdChjdHgpOworCQlicmVhazsKKworCQljYXNlIEVWUF9QS0VZX09QX1ZFUklGWToKKwkJcnYgPSBFVlBfUEtFWV92ZXJpZnlfaW5pdChjdHgpOworCQlicmVhazsKKworCQljYXNlIEVWUF9QS0VZX09QX1ZFUklGWVJFQ09WRVI6CisJCXJ2ID0gRVZQX1BLRVlfdmVyaWZ5X3JlY292ZXJfaW5pdChjdHgpOworCQlicmVhazsKKworCQljYXNlIEVWUF9QS0VZX09QX0VOQ1JZUFQ6CisJCXJ2ID0gRVZQX1BLRVlfZW5jcnlwdF9pbml0KGN0eCk7CisJCWJyZWFrOworCisJCWNhc2UgRVZQX1BLRVlfT1BfREVDUllQVDoKKwkJcnYgPSBFVlBfUEtFWV9kZWNyeXB0X2luaXQoY3R4KTsKKwkJYnJlYWs7CisKKwkJY2FzZSBFVlBfUEtFWV9PUF9ERVJJVkU6CisJCXJ2ID0gRVZQX1BLRVlfZGVyaXZlX2luaXQoY3R4KTsKKwkJYnJlYWs7CisJCX0KKworCWlmIChydiA8PSAwKQorCQl7CisJCUVWUF9QS0VZX0NUWF9mcmVlKGN0eCk7CisJCWN0eCA9IE5VTEw7CisJCX0KKworCWVuZDoKKworCWlmIChwYXNzaW4pCisJCU9QRU5TU0xfZnJlZShwYXNzaW4pOworCisJcmV0dXJuIGN0eDsKKworCisJfQorCitzdGF0aWMgaW50IHNldHVwX3BlZXIoQklPICplcnIsIEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgcGVlcmZvcm0sCisJCQkJCQkJY29uc3QgY2hhciAqZmlsZSkKKwl7CisJRVZQX1BLRVkgKnBlZXIgPSBOVUxMOworCWludCByZXQ7CisJaWYgKCFjdHgpCisJCXsKKwkJQklPX3B1dHMoZXJyLCAiLXBlZXJrZXkgY29tbWFuZCBiZWZvcmUgLWlua2V5XG4iKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkJCisJcGVlciA9IGxvYWRfcHVia2V5KGJpb19lcnIsIGZpbGUsIHBlZXJmb3JtLCAwLCBOVUxMLCBOVUxMLCAiUGVlciBLZXkiKTsKKworCWlmICghcGVlcikKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciByZWFkaW5nIHBlZXIga2V5ICVzXG4iLCBmaWxlKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhlcnIpOworCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0ID0gRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyKGN0eCwgcGVlcik7CisKKwlFVlBfUEtFWV9mcmVlKHBlZXIpOworCWlmIChyZXQgPD0gMCkKKwkJRVJSX3ByaW50X2Vycm9ycyhlcnIpOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGRvX2tleW9wKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgcGtleV9vcCwKKwkJdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgKnBvdXRsZW4sCisJCXVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pCisJeworCWludCBydiA9IDA7CisJc3dpdGNoKHBrZXlfb3ApCisJCXsKKwkJY2FzZSBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSOgorCQlydiAgPSBFVlBfUEtFWV92ZXJpZnlfcmVjb3ZlcihjdHgsIG91dCwgcG91dGxlbiwgaW4sIGlubGVuKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBFVlBfUEtFWV9PUF9TSUdOOgorCQlydiAgPSBFVlBfUEtFWV9zaWduKGN0eCwgb3V0LCBwb3V0bGVuLCBpbiwgaW5sZW4pOworCQlicmVhazsKKworCQljYXNlIEVWUF9QS0VZX09QX0VOQ1JZUFQ6CisJCXJ2ICA9IEVWUF9QS0VZX2VuY3J5cHQoY3R4LCBvdXQsIHBvdXRsZW4sIGluLCBpbmxlbik7CisJCWJyZWFrOworCisJCWNhc2UgRVZQX1BLRVlfT1BfREVDUllQVDoKKwkJcnYgID0gRVZQX1BLRVlfZGVjcnlwdChjdHgsIG91dCwgcG91dGxlbiwgaW4sIGlubGVuKTsKKwkJYnJlYWs7IAorCisJCWNhc2UgRVZQX1BLRVlfT1BfREVSSVZFOgorCQlydiAgPSBFVlBfUEtFWV9kZXJpdmUoY3R4LCBvdXQsIHBvdXRsZW4pOworCQlicmVhazsKKworCQl9CisJcmV0dXJuIHJ2OworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcHJpbWUuYyBiL2xpYi9vcGVuc3NsL2FwcHMvcHJpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWFhZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9wcmltZS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRyBwcmltZV9tYWluCisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAgICB7CisgICAgaW50IGhleD0wOworICAgIGludCBjaGVja3M9MjA7CisgICAgaW50IGdlbmVyYXRlPTA7CisgICAgaW50IGJpdHM9MDsKKyAgICBpbnQgc2FmZT0wOworICAgIEJJR05VTSAqYm49TlVMTDsKKyAgICBCSU8gKmJpb19vdXQ7CisKKyAgICBhcHBzX3N0YXJ0dXAoKTsKKworICAgIGlmIChiaW9fZXJyID09IE5VTEwpCisJaWYgKChiaW9fZXJyPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkgICAgQklPX3NldF9mcChiaW9fZXJyLHN0ZGVycixCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisKKyAgICAtLWFyZ2M7CisgICAgKythcmd2OworICAgIHdoaWxlIChhcmdjID49IDEgJiYgKiphcmd2ID09ICctJykKKwl7CisJaWYoIXN0cmNtcCgqYXJndiwiLWhleCIpKQorCSAgICBoZXg9MTsKKwllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsIi1nZW5lcmF0ZSIpKQorCSAgICBnZW5lcmF0ZT0xOworCWVsc2UgaWYoIXN0cmNtcCgqYXJndiwiLWJpdHMiKSkKKwkgICAgaWYoLS1hcmdjIDwgMSkKKwkJZ290byBiYWQ7CisJICAgIGVsc2UKKwkJYml0cz1hdG9pKCorK2FyZ3YpOworCWVsc2UgaWYoIXN0cmNtcCgqYXJndiwiLXNhZmUiKSkKKwkgICAgc2FmZT0xOworCWVsc2UgaWYoIXN0cmNtcCgqYXJndiwiLWNoZWNrcyIpKQorCSAgICBpZigtLWFyZ2MgPCAxKQorCQlnb3RvIGJhZDsKKwkgICAgZWxzZQorCQljaGVja3M9YXRvaSgqKythcmd2KTsKKwllbHNlCisJICAgIHsKKwkgICAgQklPX3ByaW50ZihiaW9fZXJyLCJVbmtub3duIG9wdGlvbiAnJXMnXG4iLCphcmd2KTsKKwkgICAgZ290byBiYWQ7CisJICAgIH0KKwktLWFyZ2M7CisJKythcmd2OworCX0KKworICAgIGlmIChhcmd2WzBdID09IE5VTEwgJiYgIWdlbmVyYXRlKQorCXsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIk5vIHByaW1lIHNwZWNpZmllZFxuIik7CisJZ290byBiYWQ7CisJfQorCisgICAgaWYgKChiaW9fb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwl7CisJQklPX3NldF9mcChiaW9fb3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJICAgIHsKKwkgICAgQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJICAgIGJpb19vdXQgPSBCSU9fcHVzaCh0bXBiaW8sIGJpb19vdXQpOworCSAgICB9CisjZW5kaWYKKwl9CisKKyAgICBpZihnZW5lcmF0ZSkKKwl7CisJY2hhciAqczsKKworCWlmKCFiaXRzKQorCSAgICB7CisJICAgIEJJT19wcmludGYoYmlvX2VyciwiU3BlY2lmaXkgdGhlIG51bWJlciBvZiBiaXRzLlxuIik7CisJICAgIHJldHVybiAxOworCSAgICB9CisJYm49Qk5fbmV3KCk7CisJQk5fZ2VuZXJhdGVfcHJpbWVfZXgoYm4sYml0cyxzYWZlLE5VTEwsTlVMTCxOVUxMKTsKKwlzPWhleCA/IEJOX2JuMmhleChibikgOiBCTl9ibjJkZWMoYm4pOworCUJJT19wcmludGYoYmlvX291dCwiJXNcbiIscyk7CisJT1BFTlNTTF9mcmVlKHMpOworCX0KKyAgICBlbHNlCisJeworCWlmKGhleCkKKwkgICAgQk5faGV4MmJuKCZibixhcmd2WzBdKTsKKwllbHNlCisJICAgIEJOX2RlYzJibigmYm4sYXJndlswXSk7CisKKwlCTl9wcmludChiaW9fb3V0LGJuKTsKKwlCSU9fcHJpbnRmKGJpb19vdXQsIiBpcyAlc3ByaW1lXG4iLAorCQkgICBCTl9pc19wcmltZV9leChibixjaGVja3MsTlVMTCxOVUxMKSA/ICIiIDogIm5vdCAiKTsKKwl9CisKKyAgICBCTl9mcmVlKGJuKTsKKyAgICBCSU9fZnJlZV9hbGwoYmlvX291dCk7CisKKyAgICByZXR1cm4gMDsKKworICAgIGJhZDoKKyAgICBCSU9fcHJpbnRmKGJpb19lcnIsIm9wdGlvbnMgYXJlXG4iKTsKKyAgICBCSU9fcHJpbnRmKGJpb19lcnIsIiUtMTRzIGhleFxuIiwiLWhleCIpOworICAgIEJJT19wcmludGYoYmlvX2VyciwiJS0xNHMgbnVtYmVyIG9mIGNoZWNrc1xuIiwiLWNoZWNrcyA8bj4iKTsKKyAgICByZXR1cm4gMTsKKyAgICB9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3ByaXZrZXkucGVtIGIvbGliL29wZW5zc2wvYXBwcy9wcml2a2V5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWY0NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9wcml2a2V5LnBlbQpAQCAtMCwwICsxLDE4IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitQcm9jLVR5cGU6IDQsRU5DUllQVEVECitERUstSW5mbzogREVTLUVERTMtQ0JDLEJBMjYyMjlBMTY1M0I3RkYKKworNm5oV0c4UEtoVFBPL3MzWnZqVWE2MjI2TmxLZHZQRFpGc05YT09vU1VzOWVqeHBiL2FqNWh1aHM2cVJZenN6OQorWWVhcjQ3dWFBWlloR0QwdkFhZ25OaUJuWW1qV0VwTjlHL3dReEc3cGdaVGhLMVp4RGk2M3FuOGFROFVqdUdIbworRjZScG5uQlFJQW5XVFdxci9Rc3lidGM1RW9Oa3JqL0NweDBPZmJTcjZnWnNGQkN4d1gxUjFoVDMvbWhKNDVmMworWE1vZlkzMlZkZng5L3Z0dzFPN0htbEhYUW5YYXFuYmQ5L25uMUVwdkZKRzkrVWpQb1c3Z1Y0akNPTHVSNGRlRQoralM4aG0rY3Brd1htRnRrM1ZHalQ5dFFYUHBNdjNKcFlmQnFnR1FvTUFKNVRvcTBEV2NIaTZXZzA4UHNEOGxneQordm1UaW9Qc1JnK0pHa0prSjhHbnVzZ0xwUWRsUUpianpkN3dHRTZFbFVGTGZPeExvOGJMbFJIb3JpSE5kV1loaAorSmpZMEx5ZVRrb3ZjbVd4VmpJbWM2WnlCejVMeTR0MEJZZjFncTNPa2pzVjkxUTF0YUJ4bmhpYXZmaXpxTUNBZgorUFBCM3NMUW5sWEc3N1RPWGtOeHBxYlpmRVlyVlpXMk5zcXFkbjhzMDdVajRJTU9OWnlxMm9kWUtXRlBNSkJpTQorUE9Zd1hqTUFPY21GTVRIWXNWbGhjVUp1VjZMT3VpcHcvRkViVHRQSC9NWU14TGU0eng2NWRZbzFyYjRpTEtMUworZ010QjBvL1dsNFhubzNaWGgxdWNpY1luVjJKN05wVmNqVnErM1NGaUNSdTJTclNrWkhaMjNFUFMxM0VjNmZjegorOFgvWUdBMnZUSjhNQU9vekF6UVV3SFFZdkxrN2JJb1FWZWtxRHE0cDBBWlFiaGRzcEhwQXJDazBJZnFxemcvdgorVXlreS96WmlRWWFuekRlblRTUlZJLzh3YWMzb2x4cFU4UXZieVN4WXFtYmtncTZiVHBYSmZZRlFmbkF0dEVzQworZEE0UzVVRmd5T1BabHV4Q0FNNHlhSkYzRnQ2bmV1dE53ZnR1SlFNYmdDVWk5dllnMnRHZFN3PT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3Byb2dzLmggYi9saWIvb3BlbnNzbC9hcHBzL3Byb2dzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4YmI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvcHJvZ3MuaApAQCAtMCwwICsxLDM2NCBAQAorLyogYXBwcy9wcm9ncy5oICovCisvKiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBwcm9ncy5wbCBmb3Igb3BlbnNzbC5jICovCisKK2V4dGVybiBpbnQgdmVyaWZ5X21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgYXNuMXBhcnNlX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgcmVxX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgZGdzdF9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IGRoX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgZGhwYXJhbV9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IGVuY19tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IHBhc3N3ZF9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IGdlbmRoX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgZXJyc3RyX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgY2FfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBjcmxfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCByc2FfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCByc2F1dGxfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBkc2FfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBkc2FwYXJhbV9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IGVjX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgZWNwYXJhbV9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IHg1MDlfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBnZW5yc2FfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBnZW5kc2FfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBnZW5wa2V5X21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgc19zZXJ2ZXJfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBzX2NsaWVudF9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IHNwZWVkX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgc190aW1lX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgdmVyc2lvbl9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IHBrY3M3X21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgY21zX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgY3JsMnBrY3M3X21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgc2Vzc19pZF9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IGNpcGhlcnNfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBuc2VxX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgcGtjczEyX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgcGtjczhfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCBwa2V5X21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgcGtleXBhcmFtX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgcGtleXV0bF9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IHNwa2FjX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgc21pbWVfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworZXh0ZXJuIGludCByYW5kX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgZW5naW5lX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgb2NzcF9tYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSk7CitleHRlcm4gaW50IHByaW1lX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTsKK2V4dGVybiBpbnQgdHNfbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pOworCisjZGVmaW5lIEZVTkNfVFlQRV9HRU5FUkFMCTEKKyNkZWZpbmUgRlVOQ19UWVBFX01ECQkyCisjZGVmaW5lIEZVTkNfVFlQRV9DSVBIRVIJMworI2RlZmluZSBGVU5DX1RZUEVfUEtFWQkJNAorI2RlZmluZSBGVU5DX1RZUEVfTURfQUxHCTUKKyNkZWZpbmUgRlVOQ19UWVBFX0NJUEhFUl9BTEcJNgorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHR5cGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpmdW5jKShpbnQgYXJnYyxjaGFyICphcmd2W10pOworCX0gRlVOQ1RJT047CitERUNMQVJFX0xIQVNIX09GKEZVTkNUSU9OKTsKKworRlVOQ1RJT04gZnVuY3Rpb25zW10gPSB7CisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJ2ZXJpZnkiLHZlcmlmeV9tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsImFzbjFwYXJzZSIsYXNuMXBhcnNlX21haW59LAorCXtGVU5DX1RZUEVfR0VORVJBTCwicmVxIixyZXFfbWFpbn0sCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJkZ3N0IixkZ3N0X21haW59LAorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJkaCIsZGhfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCXtGVU5DX1RZUEVfR0VORVJBTCwiZGhwYXJhbSIsZGhwYXJhbV9tYWlufSwKKyNlbmRpZgorCXtGVU5DX1RZUEVfR0VORVJBTCwiZW5jIixlbmNfbWFpbn0sCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJwYXNzd2QiLHBhc3N3ZF9tYWlufSwKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCXtGVU5DX1RZUEVfR0VORVJBTCwiZ2VuZGgiLGdlbmRoX21haW59LAorI2VuZGlmCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJlcnJzdHIiLGVycnN0cl9tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsImNhIixjYV9tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsImNybCIsY3JsX21haW59LAorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXtGVU5DX1RZUEVfR0VORVJBTCwicnNhIixyc2FfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwl7RlVOQ19UWVBFX0dFTkVSQUwsInJzYXV0bCIscnNhdXRsX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJkc2EiLGRzYV9tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCXtGVU5DX1RZUEVfR0VORVJBTCwiZHNhcGFyYW0iLGRzYXBhcmFtX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKwl7RlVOQ19UWVBFX0dFTkVSQUwsImVjIixlY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJlY3BhcmFtIixlY3BhcmFtX21haW59LAorI2VuZGlmCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJ4NTA5Iix4NTA5X21haW59LAorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXtGVU5DX1RZUEVfR0VORVJBTCwiZ2VucnNhIixnZW5yc2FfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwl7RlVOQ19UWVBFX0dFTkVSQUwsImdlbmRzYSIsZ2VuZHNhX21haW59LAorI2VuZGlmCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJnZW5wa2V5IixnZW5wa2V5X21haW59LAorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fU09DSykgJiYgIShkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMikgJiYgZGVmaW5lZChPUEVOU1NMX05PX1NTTDMpKQorCXtGVU5DX1RZUEVfR0VORVJBTCwic19zZXJ2ZXIiLHNfc2VydmVyX21haW59LAorI2VuZGlmCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TT0NLKSAmJiAhKGRlZmluZWQoT1BFTlNTTF9OT19TU0wyKSAmJiBkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykpCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJzX2NsaWVudCIsc19jbGllbnRfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TUEVFRAorCXtGVU5DX1RZUEVfR0VORVJBTCwic3BlZWQiLHNwZWVkX21haW59LAorI2VuZGlmCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TT0NLKSAmJiAhKGRlZmluZWQoT1BFTlNTTF9OT19TU0wyKSAmJiBkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykpCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJzX3RpbWUiLHNfdGltZV9tYWlufSwKKyNlbmRpZgorCXtGVU5DX1RZUEVfR0VORVJBTCwidmVyc2lvbiIsdmVyc2lvbl9tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsInBrY3M3Iixwa2NzN19tYWlufSwKKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKwl7RlVOQ19UWVBFX0dFTkVSQUwsImNtcyIsY21zX21haW59LAorI2VuZGlmCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJjcmwycGtjczciLGNybDJwa2NzN19tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsInNlc3NfaWQiLHNlc3NfaWRfbWFpbn0sCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TT0NLKSAmJiAhKGRlZmluZWQoT1BFTlNTTF9OT19TU0wyKSAmJiBkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykpCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJjaXBoZXJzIixjaXBoZXJzX21haW59LAorI2VuZGlmCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJuc2VxIixuc2VxX21haW59LAorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fREVTKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQTEpCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJwa2NzMTIiLHBrY3MxMl9tYWlufSwKKyNlbmRpZgorCXtGVU5DX1RZUEVfR0VORVJBTCwicGtjczgiLHBrY3M4X21haW59LAorCXtGVU5DX1RZUEVfR0VORVJBTCwicGtleSIscGtleV9tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsInBrZXlwYXJhbSIscGtleXBhcmFtX21haW59LAorCXtGVU5DX1RZUEVfR0VORVJBTCwicGtleXV0bCIscGtleXV0bF9tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsInNwa2FjIixzcGthY19tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsInNtaW1lIixzbWltZV9tYWlufSwKKwl7RlVOQ19UWVBFX0dFTkVSQUwsInJhbmQiLHJhbmRfbWFpbn0sCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJe0ZVTkNfVFlQRV9HRU5FUkFMLCJlbmdpbmUiLGVuZ2luZV9tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX09DU1AKKwl7RlVOQ19UWVBFX0dFTkVSQUwsIm9jc3AiLG9jc3BfbWFpbn0sCisjZW5kaWYKKwl7RlVOQ19UWVBFX0dFTkVSQUwsInByaW1lIixwcmltZV9tYWlufSwKKyNpZiAwIC8qIEFORFJPSUQgKi8KKwl7RlVOQ19UWVBFX0dFTkVSQUwsInRzIix0c19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01EMgorCXtGVU5DX1RZUEVfTUQsIm1kMiIsZGdzdF9tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01ENAorCXtGVU5DX1RZUEVfTUQsIm1kNCIsZGdzdF9tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01ENQorCXtGVU5DX1RZUEVfTUQsIm1kNSIsZGdzdF9tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorCXtGVU5DX1RZUEVfTUQsInNoYSIsZGdzdF9tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTEKKwl7RlVOQ19UWVBFX01ELCJzaGExIixkZ3N0X21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTURDMgorCXtGVU5DX1RZUEVfTUQsIm1kYzIiLGRnc3RfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19STUQxNjAKKwl7RlVOQ19UWVBFX01ELCJybWQxNjAiLGRnc3RfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwl7RlVOQ19UWVBFX0NJUEhFUiwiYWVzLTEyOC1jYmMiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCXtGVU5DX1RZUEVfQ0lQSEVSLCJhZXMtMTI4LWVjYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImFlcy0xOTItY2JjIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwl7RlVOQ19UWVBFX0NJUEhFUiwiYWVzLTE5Mi1lY2IiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCXtGVU5DX1RZUEVfQ0lQSEVSLCJhZXMtMjU2LWNiYyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImFlcy0yNTYtZWNiIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYW1lbGxpYS0xMjgtY2JjIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYW1lbGxpYS0xMjgtZWNiIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYW1lbGxpYS0xOTItY2JjIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYW1lbGxpYS0xOTItZWNiIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYW1lbGxpYS0yNTYtY2JjIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYW1lbGxpYS0yNTYtZWNiIixlbmNfbWFpbn0sCisjZW5kaWYKKwl7RlVOQ19UWVBFX0NJUEhFUiwiYmFzZTY0IixlbmNfbWFpbn0sCisjaWZkZWYgWkxJQgorCXtGVU5DX1RZUEVfQ0lQSEVSLCJ6bGliIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwl7RlVOQ19UWVBFX0NJUEhFUiwiZGVzIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwl7RlVOQ19UWVBFX0NJUEhFUiwiZGVzMyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImRlc3giLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKwl7RlVOQ19UWVBFX0NJUEhFUiwiaWRlYSIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCXtGVU5DX1RZUEVfQ0lQSEVSLCJzZWVkIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKwl7RlVOQ19UWVBFX0NJUEhFUiwicmM0IixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKwl7RlVOQ19UWVBFX0NJUEhFUiwicmM0LTQwIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzIKKwl7RlVOQ19UWVBFX0NJUEhFUiwicmMyIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CRgorCXtGVU5DX1RZUEVfQ0lQSEVSLCJiZiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FTVAorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYXN0IixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKKwl7RlVOQ19UWVBFX0NJUEhFUiwicmM1IixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwl7RlVOQ19UWVBFX0NJUEhFUiwiZGVzLWVjYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImRlcy1lZGUiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCXtGVU5DX1RZUEVfQ0lQSEVSLCJkZXMtZWRlMyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImRlcy1jYmMiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCXtGVU5DX1RZUEVfQ0lQSEVSLCJkZXMtZWRlLWNiYyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImRlcy1lZGUzLWNiYyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImRlcy1jZmIiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCXtGVU5DX1RZUEVfQ0lQSEVSLCJkZXMtZWRlLWNmYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImRlcy1lZGUzLWNmYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImRlcy1vZmIiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCXtGVU5DX1RZUEVfQ0lQSEVSLCJkZXMtZWRlLW9mYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJe0ZVTkNfVFlQRV9DSVBIRVIsImRlcy1lZGUzLW9mYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJpZGVhLWNiYyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJpZGVhLWVjYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJpZGVhLWNmYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJpZGVhLW9mYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCXtGVU5DX1RZUEVfQ0lQSEVSLCJzZWVkLWNiYyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCXtGVU5DX1RZUEVfQ0lQSEVSLCJzZWVkLWVjYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCXtGVU5DX1RZUEVfQ0lQSEVSLCJzZWVkLWNmYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCXtGVU5DX1RZUEVfQ0lQSEVSLCJzZWVkLW9mYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkMyCisJe0ZVTkNfVFlQRV9DSVBIRVIsInJjMi1jYmMiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorCXtGVU5DX1RZUEVfQ0lQSEVSLCJyYzItZWNiIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzIKKwl7RlVOQ19UWVBFX0NJUEhFUiwicmMyLWNmYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkMyCisJe0ZVTkNfVFlQRV9DSVBIRVIsInJjMi1vZmIiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorCXtGVU5DX1RZUEVfQ0lQSEVSLCJyYzItNjQtY2JjIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzIKKwl7RlVOQ19UWVBFX0NJUEhFUiwicmMyLTQwLWNiYyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQkYKKwl7RlVOQ19UWVBFX0NJUEhFUiwiYmYtY2JjIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CRgorCXtGVU5DX1RZUEVfQ0lQSEVSLCJiZi1lY2IiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JGCisJe0ZVTkNfVFlQRV9DSVBIRVIsImJmLWNmYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQkYKKwl7RlVOQ19UWVBFX0NJUEhFUiwiYmYtb2ZiIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQVNUCisJe0ZVTkNfVFlQRV9DSVBIRVIsImNhc3Q1LWNiYyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FTVAorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYXN0NS1lY2IiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKKwl7RlVOQ19UWVBFX0NJUEhFUiwiY2FzdDUtY2ZiIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQVNUCisJe0ZVTkNfVFlQRV9DSVBIRVIsImNhc3Q1LW9mYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FTVAorCXtGVU5DX1RZUEVfQ0lQSEVSLCJjYXN0LWNiYyIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM1CisJe0ZVTkNfVFlQRV9DSVBIRVIsInJjNS1jYmMiLGVuY19tYWlufSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDNQorCXtGVU5DX1RZUEVfQ0lQSEVSLCJyYzUtZWNiIixlbmNfbWFpbn0sCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKKwl7RlVOQ19UWVBFX0NJUEhFUiwicmM1LWNmYiIsZW5jX21haW59LAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM1CisJe0ZVTkNfVFlQRV9DSVBIRVIsInJjNS1vZmIiLGVuY19tYWlufSwKKyNlbmRpZgorCXswLE5VTEwsTlVMTH0KKwl9OwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9wcm9ncy5wbCBiL2xpYi9vcGVuc3NsL2FwcHMvcHJvZ3MucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2ZmRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvcHJvZ3MucGwKQEAgLTAsMCArMSwxMDIgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorCitwcmludCAiLyogYXBwcy9wcm9ncy5oICovXG4iOworcHJpbnQgIi8qIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHByb2dzLnBsIGZvciBvcGVuc3NsLmMgKi9cblxuIjsKKworZ3JlcChzL15hc24xcGFycyQvYXNuMXBhcnNlLyxAQVJHVik7CisKK2ZvcmVhY2ggKEBBUkdWKQorCXsgcHJpbnRmICJleHRlcm4gaW50ICVzX21haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKTtcbiIsJF87IH0KKworcHJpbnQgPDwnRU9GJzsKKworI2RlZmluZSBGVU5DX1RZUEVfR0VORVJBTAkxCisjZGVmaW5lIEZVTkNfVFlQRV9NRAkJMgorI2RlZmluZSBGVU5DX1RZUEVfQ0lQSEVSCTMKKyNkZWZpbmUgRlVOQ19UWVBFX1BLRVkJCTQKKyNkZWZpbmUgRlVOQ19UWVBFX01EX0FMRwk1CisjZGVmaW5lIEZVTkNfVFlQRV9DSVBIRVJfQUxHCTYKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCB0eXBlOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqZnVuYykoaW50IGFyZ2MsY2hhciAqYXJndltdKTsKKwl9IEZVTkNUSU9OOworREVDTEFSRV9MSEFTSF9PRihGVU5DVElPTik7CisKK0ZVTkNUSU9OIGZ1bmN0aW9uc1tdID0geworRU9GCisKK2ZvcmVhY2ggKEBBUkdWKQorCXsKKwlwdXNoKEBmaWxlcywkXyk7CisJJHN0cj0iXHR7RlVOQ19UWVBFX0dFTkVSQUwsXCIkX1wiLCR7X31fbWFpbn0sXG4iOworCWlmICgoJF8gPX4gL15zXy8pIHx8ICgkXyA9fiAvXmNpcGhlcnMkLykpCisJCXsgcHJpbnQgIiNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NPQ0spICYmICEoZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpICYmIGRlZmluZWQoT1BFTlNTTF9OT19TU0wzKSlcbiR7c3RyfSNlbmRpZlxuIjsgfSAKKwllbHNpZiAoICgkXyA9fiAvXnNwZWVkJC8pKQorCQl7IHByaW50ICIjaWZuZGVmIE9QRU5TU0xfTk9fU1BFRURcbiR7c3RyfSNlbmRpZlxuIjsgfQorCWVsc2lmICggKCRfID1+IC9eZW5naW5lJC8pKQorCQl7IHByaW50ICIjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FXG4ke3N0cn0jZW5kaWZcbiI7IH0KKwllbHNpZiAoICgkXyA9fiAvXnJzYSQvKSB8fCAoJF8gPX4gL15nZW5yc2EkLykgfHwgKCRfID1+IC9ecnNhdXRsJC8pKSAKKwkJeyBwcmludCAiI2lmbmRlZiBPUEVOU1NMX05PX1JTQVxuJHtzdHJ9I2VuZGlmXG4iOyAgfQorCWVsc2lmICggKCRfID1+IC9eZHNhJC8pIHx8ICgkXyA9fiAvXmdlbmRzYSQvKSB8fCAoJF8gPX4gL15kc2FwYXJhbSQvKSkKKwkJeyBwcmludCAiI2lmbmRlZiBPUEVOU1NMX05PX0RTQVxuJHtzdHJ9I2VuZGlmXG4iOyB9CisJZWxzaWYgKCAoJF8gPX4gL15lYyQvKSB8fCAoJF8gPX4gL15lY3BhcmFtJC8pKQorCQl7IHByaW50ICIjaWZuZGVmIE9QRU5TU0xfTk9fRUNcbiR7c3RyfSNlbmRpZlxuIjt9CisJZWxzaWYgKCAoJF8gPX4gL15kaCQvKSB8fCAoJF8gPX4gL15nZW5kaCQvKSB8fCAoJF8gPX4gL15kaHBhcmFtJC8pKQorCQl7IHByaW50ICIjaWZuZGVmIE9QRU5TU0xfTk9fREhcbiR7c3RyfSNlbmRpZlxuIjsgfQorCWVsc2lmICggKCRfID1+IC9ecGtjczEyJC8pKQorCQl7IHByaW50ICIjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19ERVMpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0hBMSlcbiR7c3RyfSNlbmRpZlxuIjsgfQorCWVsc2lmICggKCRfID1+IC9eY21zJC8pKQorCQl7IHByaW50ICIjaWZuZGVmIE9QRU5TU0xfTk9fQ01TXG4ke3N0cn0jZW5kaWZcbiI7IH0KKwllbHNpZiAoICgkXyA9fiAvXm9jc3AkLykpCisJCXsgcHJpbnQgIiNpZm5kZWYgT1BFTlNTTF9OT19PQ1NQXG4ke3N0cn0jZW5kaWZcbiI7IH0KKwllbHNlCisJCXsgcHJpbnQgJHN0cjsgfQorCX0KKworZm9yZWFjaCAoIm1kMiIsIm1kNCIsIm1kNSIsInNoYSIsInNoYTEiLCJtZGMyIiwicm1kMTYwIikKKwl7CisJcHVzaChAZmlsZXMsJF8pOworCXByaW50ZiAiI2lmbmRlZiBPUEVOU1NMX05PXyIudWMoJF8pLiJcblx0e0ZVTkNfVFlQRV9NRCxcIiIuJF8uIlwiLGRnc3RfbWFpbn0sXG4jZW5kaWZcbiI7CisJfQorCitmb3JlYWNoICgKKwkiYWVzLTEyOC1jYmMiLCAiYWVzLTEyOC1lY2IiLAorCSJhZXMtMTkyLWNiYyIsICJhZXMtMTkyLWVjYiIsCisJImFlcy0yNTYtY2JjIiwgImFlcy0yNTYtZWNiIiwKKwkiY2FtZWxsaWEtMTI4LWNiYyIsICJjYW1lbGxpYS0xMjgtZWNiIiwKKwkiY2FtZWxsaWEtMTkyLWNiYyIsICJjYW1lbGxpYS0xOTItZWNiIiwKKwkiY2FtZWxsaWEtMjU2LWNiYyIsICJjYW1lbGxpYS0yNTYtZWNiIiwKKwkiYmFzZTY0IiwgInpsaWIiLAorCSJkZXMiLCAiZGVzMyIsICJkZXN4IiwgImlkZWEiLCAic2VlZCIsICJyYzQiLCAicmM0LTQwIiwKKwkicmMyIiwgImJmIiwgImNhc3QiLCAicmM1IiwKKwkiZGVzLWVjYiIsICJkZXMtZWRlIiwgICAgImRlcy1lZGUzIiwKKwkiZGVzLWNiYyIsICJkZXMtZWRlLWNiYyIsImRlcy1lZGUzLWNiYyIsCisJImRlcy1jZmIiLCAiZGVzLWVkZS1jZmIiLCJkZXMtZWRlMy1jZmIiLAorCSJkZXMtb2ZiIiwgImRlcy1lZGUtb2ZiIiwiZGVzLWVkZTMtb2ZiIiwKKwkiaWRlYS1jYmMiLCJpZGVhLWVjYiIsICAgICJpZGVhLWNmYiIsICJpZGVhLW9mYiIsCisJInNlZWQtY2JjIiwic2VlZC1lY2IiLCAgICAic2VlZC1jZmIiLCAic2VlZC1vZmIiLAorCSJyYzItY2JjIiwgInJjMi1lY2IiLCAicmMyLWNmYiIsInJjMi1vZmIiLCAicmMyLTY0LWNiYyIsICJyYzItNDAtY2JjIiwKKwkiYmYtY2JjIiwgICJiZi1lY2IiLCAgICAgImJmLWNmYiIsICAgImJmLW9mYiIsCisJImNhc3Q1LWNiYyIsImNhc3Q1LWVjYiIsICJjYXN0NS1jZmIiLCJjYXN0NS1vZmIiLAorCSJjYXN0LWNiYyIsICJyYzUtY2JjIiwgICAicmM1LWVjYiIsICAicmM1LWNmYiIsICAicmM1LW9mYiIpCisJeworCXB1c2goQGZpbGVzLCRfKTsKKworCSR0PXNwcmludGYoIlx0e0ZVTkNfVFlQRV9DSVBIRVIsXCIlc1wiLGVuY19tYWlufSxcbiIsJF8pOworCWlmICAgICgkXyA9fiAvZGVzLykgIHsgJHQ9IiNpZm5kZWYgT1BFTlNTTF9OT19ERVNcbiR7dH0jZW5kaWZcbiI7IH0KKwllbHNpZiAoJF8gPX4gL2Flcy8pICB7ICR0PSIjaWZuZGVmIE9QRU5TU0xfTk9fQUVTXG4ke3R9I2VuZGlmXG4iOyB9CisJZWxzaWYgKCRfID1+IC9jYW1lbGxpYS8pICB7ICR0PSIjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUFcbiR7dH0jZW5kaWZcbiI7IH0KKwllbHNpZiAoJF8gPX4gL2lkZWEvKSB7ICR0PSIjaWZuZGVmIE9QRU5TU0xfTk9fSURFQVxuJHt0fSNlbmRpZlxuIjsgfQorCWVsc2lmICgkXyA9fiAvc2VlZC8pIHsgJHQ9IiNpZm5kZWYgT1BFTlNTTF9OT19TRUVEXG4ke3R9I2VuZGlmXG4iOyB9CisJZWxzaWYgKCRfID1+IC9yYzQvKSAgeyAkdD0iI2lmbmRlZiBPUEVOU1NMX05PX1JDNFxuJHt0fSNlbmRpZlxuIjsgfQorCWVsc2lmICgkXyA9fiAvcmMyLykgIHsgJHQ9IiNpZm5kZWYgT1BFTlNTTF9OT19SQzJcbiR7dH0jZW5kaWZcbiI7IH0KKwllbHNpZiAoJF8gPX4gL2JmLykgICB7ICR0PSIjaWZuZGVmIE9QRU5TU0xfTk9fQkZcbiR7dH0jZW5kaWZcbiI7IH0KKwllbHNpZiAoJF8gPX4gL2Nhc3QvKSB7ICR0PSIjaWZuZGVmIE9QRU5TU0xfTk9fQ0FTVFxuJHt0fSNlbmRpZlxuIjsgfQorCWVsc2lmICgkXyA9fiAvcmM1LykgIHsgJHQ9IiNpZm5kZWYgT1BFTlNTTF9OT19SQzVcbiR7dH0jZW5kaWZcbiI7IH0KKwllbHNpZiAoJF8gPX4gL3psaWIvKSAgeyAkdD0iI2lmZGVmIFpMSUJcbiR7dH0jZW5kaWZcbiI7IH0KKwlwcmludCAkdDsKKwl9CisKK3ByaW50ICJcdHswLE5VTEwsTlVMTH1cblx0fTtcbiI7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3JhbmQuYyBiL2xpYi9vcGVuc3NsL2FwcHMvcmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YTFkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3JhbmQuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogYXBwcy9yYW5kLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiYXBwcy5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HIHJhbmRfbWFpbgorCisvKiAtb3V0IGZpbGUgICAgICAgICAtIHdyaXRlIHRvIGZpbGUKKyAqIC1yYW5kIGZpbGU6ZmlsZSAgIC0gUFJORyBzZWVkIGZpbGVzCisgKiAtYmFzZTY0ICAgICAgICAgICAtIGJhc2U2NCBlbmNvZGUgb3V0cHV0CisgKiAtaGV4ICAgICAgICAgICAgICAtIGhleCBlbmNvZGUgb3V0cHV0CisgKiBudW0gICAgICAgICAgICAgICAtIHdyaXRlICdudW0nIGJ5dGVzCisgKi8KKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUgKmUgPSBOVUxMOworI2VuZGlmCisJaW50IGksIHIsIHJldCA9IDE7CisJaW50IGJhZG9wdDsKKwljaGFyICpvdXRmaWxlID0gTlVMTDsKKwljaGFyICppbnJhbmQgPSBOVUxMOworCWludCBiYXNlNjQgPSAwOworCWludCBoZXggPSAwOworCUJJTyAqb3V0ID0gTlVMTDsKKwlpbnQgbnVtID0gLTE7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lPU5VTEw7CisjZW5kaWYKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJaWYgKChiaW9fZXJyID0gQklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fZXJyLCBzdGRlcnIsIEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZXJyOworCisJYmFkb3B0ID0gMDsKKwlpID0gMDsKKwl3aGlsZSAoIWJhZG9wdCAmJiBhcmd2WysraV0gIT0gTlVMTCkKKwkJeworCQlpZiAoc3RyY21wKGFyZ3ZbaV0sICItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgoYXJndltpKzFdICE9IE5VTEwpICYmIChvdXRmaWxlID09IE5VTEwpKQorCQkJCW91dGZpbGUgPSBhcmd2WysraV07CisJCQllbHNlCisJCQkJYmFkb3B0ID0gMTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgoYXJndltpKzFdICE9IE5VTEwpICYmIChlbmdpbmUgPT0gTlVMTCkpCisJCQkJZW5naW5lID0gYXJndlsrK2ldOworCQkJZWxzZQorCQkJCWJhZG9wdCA9IDE7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICItcmFuZCIpID09IDApCisJCQl7CisJCQlpZiAoKGFyZ3ZbaSsxXSAhPSBOVUxMKSAmJiAoaW5yYW5kID09IE5VTEwpKQorCQkJCWlucmFuZCA9IGFyZ3ZbKytpXTsKKwkJCWVsc2UKKwkJCQliYWRvcHQgPSAxOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1iYXNlNjQiKSA9PSAwKQorCQkJeworCQkJaWYgKCFiYXNlNjQpCisJCQkJYmFzZTY0ID0gMTsKKwkJCWVsc2UKKwkJCQliYWRvcHQgPSAxOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1oZXgiKSA9PSAwKQorCQkJeworCQkJaWYgKCFoZXgpCisJCQkJaGV4ID0gMTsKKwkJCWVsc2UKKwkJCQliYWRvcHQgPSAxOworCQkJfQorCQllbHNlIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWFyZ3ZbaV1bMF0pKQorCQkJeworCQkJaWYgKG51bSA8IDApCisJCQkJeworCQkJCXIgPSBzc2NhbmYoYXJndltpXSwgIiVkIiwgJm51bSk7CisJCQkJaWYgKHIgPT0gMCB8fCBudW0gPCAwKQorCQkJCQliYWRvcHQgPSAxOworCQkJCX0KKwkJCWVsc2UKKwkJCQliYWRvcHQgPSAxOworCQkJfQorCQllbHNlCisJCQliYWRvcHQgPSAxOworCQl9CisKKwlpZiAoaGV4ICYmIGJhc2U2NCkKKwkJYmFkb3B0ID0gMTsKKworCWlmIChudW0gPCAwKQorCQliYWRvcHQgPSAxOworCQorCWlmIChiYWRvcHQpIAorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIlVzYWdlOiByYW5kIFtvcHRpb25zXSBudW1cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJ3aGVyZSBvcHRpb25zIGFyZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1vdXQgZmlsZSAgICAgICAgICAgICAtIHdyaXRlIHRvIGZpbGVcbiIpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQlCSU9fcHJpbnRmKGJpb19lcnIsICItZW5naW5lIGUgICAgICAgICAgICAgLSB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiLXJhbmQgZmlsZSVjZmlsZSVjLi4uIC0gc2VlZCBQUk5HIGZyb20gZmlsZXNcbiIsIExJU1RfU0VQQVJBVE9SX0NIQVIsIExJU1RfU0VQQVJBVE9SX0NIQVIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsICItYmFzZTY0ICAgICAgICAgICAgICAgLSBiYXNlNjQgZW5jb2RlIG91dHB1dFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgIi1oZXggICAgICAgICAgICAgICAgICAtIGhleCBlbmNvZGUgb3V0cHV0XG4iKTsKKwkJZ290byBlcnI7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWFwcF9SQU5EX2xvYWRfZmlsZShOVUxMLCBiaW9fZXJyLCAoaW5yYW5kICE9IE5VTEwpKTsKKwlpZiAoaW5yYW5kICE9IE5VTEwpCisJCUJJT19wcmludGYoYmlvX2VyciwiJWxkIHNlbWktcmFuZG9tIGJ5dGVzIGxvYWRlZFxuIiwKKwkJCWFwcF9SQU5EX2xvYWRfZmlsZXMoaW5yYW5kKSk7CisKKwlvdXQgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKG91dCA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAob3V0ZmlsZSAhPSBOVUxMKQorCQlyID0gQklPX3dyaXRlX2ZpbGVuYW1lKG91dCwgb3V0ZmlsZSk7CisJZWxzZQorCQl7CisJCXIgPSBCSU9fc2V0X2ZwKG91dCwgc3Rkb3V0LCBCSU9fTk9DTE9TRSB8IEJJT19GUF9URVhUKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJeworCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwkJfQorCWlmIChyIDw9IDApCisJCWdvdG8gZXJyOworCisJaWYgKGJhc2U2NCkKKwkJeworCQlCSU8gKmI2NCA9IEJJT19uZXcoQklPX2ZfYmFzZTY0KCkpOworCQlpZiAoYjY0ID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJb3V0ID0gQklPX3B1c2goYjY0LCBvdXQpOworCQl9CisJCisJd2hpbGUgKG51bSA+IDApIAorCQl7CisJCXVuc2lnbmVkIGNoYXIgYnVmWzQwOTZdOworCQlpbnQgY2h1bms7CisKKwkJY2h1bmsgPSBudW07CisJCWlmIChjaHVuayA+IChpbnQpc2l6ZW9mKGJ1ZikpCisJCQljaHVuayA9IHNpemVvZiBidWY7CisJCXIgPSBSQU5EX2J5dGVzKGJ1ZiwgY2h1bmspOworCQlpZiAociA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmICghaGV4KSAKKwkJCUJJT193cml0ZShvdXQsIGJ1ZiwgY2h1bmspOworCQllbHNlCisJCQl7CisJCQlmb3IgKGkgPSAwOyBpIDwgY2h1bms7IGkrKykKKwkJCQlCSU9fcHJpbnRmKG91dCwgIiUwMngiLCBidWZbaV0pOworCQkJfQorCQludW0gLT0gY2h1bms7CisJCX0KKwlpZiAoaGV4KQorCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJYXBwX1JBTkRfd3JpdGVfZmlsZShOVUxMLCBiaW9fZXJyKTsKKwlyZXQgPSAwOworCQorZXJyOgorCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJaWYgKG91dCkKKwkJQklPX2ZyZWVfYWxsKG91dCk7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcmVxLmMgYi9saWIvb3BlbnNzbC9hcHBzL3JlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMGNkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3JlcS5jCkBAIC0wLDAgKzEsMTc1OCBAQAorLyogYXBwcy9yZXEuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBVbnRpbCB0aGUga2V5LWdlbiBjYWxsYmFja3MgYXJlIG1vZGlmaWVkIHRvIHVzZSBuZXdlciBwcm90b3R5cGVzLCB3ZSBhbGxvdworICogZGVwcmVjYXRlZCBmdW5jdGlvbnMgZm9yIG9wZW5zc2wtaW50ZXJuYWwgY29kZSAqLworI2lmZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI3VuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBPUEVOU1NMX05PX1NURElPCisjZGVmaW5lIEFQUFNfV0lOMTYKKyNlbmRpZgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2VuZGlmCisKKyNkZWZpbmUgU0VDVElPTgkJInJlcSIKKworI2RlZmluZSBCSVRTCQkiZGVmYXVsdF9iaXRzIgorI2RlZmluZSBLRVlGSUxFCQkiZGVmYXVsdF9rZXlmaWxlIgorI2RlZmluZSBQUk9NUFQJCSJwcm9tcHQiCisjZGVmaW5lIERJU1RJTkdVSVNIRURfTkFNRQkiZGlzdGluZ3Vpc2hlZF9uYW1lIgorI2RlZmluZSBBVFRSSUJVVEVTCSJhdHRyaWJ1dGVzIgorI2RlZmluZSBWM19FWFRFTlNJT05TCSJ4NTA5X2V4dGVuc2lvbnMiCisjZGVmaW5lIFJFUV9FWFRFTlNJT05TCSJyZXFfZXh0ZW5zaW9ucyIKKyNkZWZpbmUgU1RSSU5HX01BU0sJInN0cmluZ19tYXNrIgorI2RlZmluZSBVVEY4X0lOCQkidXRmOCIKKworI2RlZmluZSBERUZBVUxUX0tFWV9MRU5HVEgJNTEyCisjZGVmaW5lIE1JTl9LRVlfTEVOR1RICQkzODQKKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRwlyZXFfbWFpbgorCisvKiAtaW5mb3JtIGFyZwktIGlucHV0IGZvcm1hdCAtIGRlZmF1bHQgUEVNIChERVIgb3IgUEVNKQorICogLW91dGZvcm0gYXJnIC0gb3V0cHV0IGZvcm1hdCAtIGRlZmF1bHQgUEVNCisgKiAtaW4gYXJnCS0gaW5wdXQgZmlsZSAtIGRlZmF1bHQgc3RkaW4KKyAqIC1vdXQgYXJnCS0gb3V0cHV0IGZpbGUgLSBkZWZhdWx0IHN0ZG91dAorICogLXZlcmlmeQktIGNoZWNrIHJlcXVlc3Qgc2lnbmF0dXJlCisgKiAtbm9vdXQJLSBkb24ndCBwcmludCBzdHVmZiBvdXQuCisgKiAtdGV4dAktIHByaW50IG91dCBodW1hbiByZWFkYWJsZSB0ZXh0LgorICogLW5vZGVzCS0gbm8gZGVzIGVuY3J5cHRpb24KKyAqIC1jb25maWcgZmlsZQktIExvYWQgY29uZmlndXJhdGlvbiBmaWxlLgorICogLWtleSBmaWxlCS0gbWFrZSBhIHJlcXVlc3QgdXNpbmcga2V5IGluIGZpbGUgKG9yIHVzZSBpdCBmb3IgdmVyaWZpY2F0aW9uKS4KKyAqIC1rZXlmb3JtIGFyZwktIGtleSBmaWxlIGZvcm1hdC4KKyAqIC1yYW5kIGZpbGUocykgLSBsb2FkIHRoZSBmaWxlKHMpIGludG8gdGhlIFBSTkcuCisgKiAtbmV3a2V5CS0gbWFrZSBhIGtleSBhbmQgYSByZXF1ZXN0LgorICogLW1vZHVsdXMJLSBwcmludCBSU0EgbW9kdWx1cy4KKyAqIC1wdWJrZXkJLSBvdXRwdXQgUHVibGljIEtleS4KKyAqIC14NTA5CS0gb3V0cHV0IGEgc2VsZiBzaWduZWQgWDUwOSBzdHJ1Y3R1cmUgaW5zdGVhZC4KKyAqIC1hc24xLWtsdWRnZQktIG91dHB1dCBuZXcgY2VydGlmaWNhdGUgcmVxdWVzdCBpbiBhIGZvcm1hdCB0aGF0IHNvbWUgQ0EncworICoJCSAgcmVxdWlyZS4gIFRoaXMgZm9ybWF0IGlzIHdyb25nCisgKi8KKworc3RhdGljIGludCBtYWtlX1JFUShYNTA5X1JFUSAqcmVxLEVWUF9QS0VZICpwa2V5LGNoYXIgKmRuLGludCBtdXRsaXJkbiwKKwkJaW50IGF0dHJpYnMsdW5zaWduZWQgbG9uZyBjaHR5cGUpOworc3RhdGljIGludCBidWlsZF9zdWJqZWN0KFg1MDlfUkVRICpyZXEsIGNoYXIgKnN1YmosIHVuc2lnbmVkIGxvbmcgY2h0eXBlLAorCQlpbnQgbXVsdGlyZG4pOworc3RhdGljIGludCBwcm9tcHRfaW5mbyhYNTA5X1JFUSAqcmVxLAorCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqZG5fc2ssIGNoYXIgKmRuX3NlY3QsCisJCVNUQUNLX09GKENPTkZfVkFMVUUpICphdHRyX3NrLCBjaGFyICphdHRyX3NlY3QsIGludCBhdHRyaWJzLAorCQl1bnNpZ25lZCBsb25nIGNodHlwZSk7CitzdGF0aWMgaW50IGF1dG9faW5mbyhYNTA5X1JFUSAqcmVxLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqc2ssCisJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmF0dHIsIGludCBhdHRyaWJzLAorCQkJCXVuc2lnbmVkIGxvbmcgY2h0eXBlKTsKK3N0YXRpYyBpbnQgYWRkX2F0dHJpYnV0ZV9vYmplY3QoWDUwOV9SRVEgKnJlcSwgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqZGVmLAorCQkJCWNoYXIgKnZhbHVlLCBpbnQgbmlkLCBpbnQgbl9taW4sCisJCQkJaW50IG5fbWF4LCB1bnNpZ25lZCBsb25nIGNodHlwZSk7CitzdGF0aWMgaW50IGFkZF9ETl9vYmplY3QoWDUwOV9OQU1FICpuLCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICpkZWYsIGNoYXIgKnZhbHVlLAorCWludCBuaWQsaW50IG5fbWluLGludCBuX21heCwgdW5zaWduZWQgbG9uZyBjaHR5cGUsIGludCBtdmFsKTsKK3N0YXRpYyBpbnQgZ2VucGtleV9jYihFVlBfUEtFWV9DVFggKmN0eCk7CitzdGF0aWMgaW50IHJlcV9jaGVja19sZW4oaW50IGxlbixpbnQgbl9taW4saW50IG5fbWF4KTsKK3N0YXRpYyBpbnQgY2hlY2tfZW5kKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZW5kKTsKK3N0YXRpYyBFVlBfUEtFWV9DVFggKnNldF9rZXlnZW5fY3R4KEJJTyAqZXJyLCBjb25zdCBjaGFyICpnc3RyLCBpbnQgKnBrZXlfdHlwZSwKKwkJCQkJbG9uZyAqcGtleWxlbiwgY2hhciAqKnBhbGduYW0sCisJCQkJCUVOR0lORSAqa2V5Z2VuX2VuZ2luZSk7CisjaWZuZGVmIE1PTk9MSVRICitzdGF0aWMgY2hhciAqZGVmYXVsdF9jb25maWdfZmlsZT1OVUxMOworI2VuZGlmCitzdGF0aWMgQ09ORiAqcmVxX2NvbmY9TlVMTDsKK3N0YXRpYyBpbnQgYmF0Y2g9MDsKKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlFTkdJTkUgKmUgPSBOVUxMLCAqZ2VuX2VuZyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBubWZsYWcgPSAwLCByZXFmbGFnID0gMDsKKwlpbnQgZXg9MSx4NTA5PTAsZGF5cz0zMDsKKwlYNTA5ICp4NTA5c3M9TlVMTDsKKwlYNTA5X1JFUSAqcmVxPU5VTEw7CisJRVZQX1BLRVlfQ1RYICpnZW5jdHggPSBOVUxMOworCWNvbnN0IGNoYXIgKmtleWFsZyA9IE5VTEw7CisJY2hhciAqa2V5YWxnc3RyID0gTlVMTDsKKwlTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnBrZXlvcHRzID0gTlVMTDsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCWludCBpPTAsYmFkb3BzPTAsbmV3cmVxPTAsdmVyYm9zZT0wLHBrZXlfdHlwZT0tMTsKKwlsb25nIG5ld2tleSA9IC0xOworCUJJTyAqaW49TlVMTCwqb3V0PU5VTEw7CisJaW50IGluZm9ybWF0LG91dGZvcm1hdCx2ZXJpZnk9MCxub291dD0wLHRleHQ9MCxrZXlmb3JtPUZPUk1BVF9QRU07CisJaW50IG5vZGVzPTAsa2x1ZGdlPTAsbmV3aGRyPTAsc3ViamVjdD0wLHB1YmtleT0wOworCWNoYXIgKmluZmlsZSwqb3V0ZmlsZSwqcHJvZywqa2V5ZmlsZT1OVUxMLCp0ZW1wbGF0ZT1OVUxMLCprZXlvdXQ9TlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwljaGFyICplbmdpbmU9TlVMTDsKKyNlbmRpZgorCWNoYXIgKmV4dGVuc2lvbnMgPSBOVUxMOworCWNoYXIgKnJlcV9leHRzID0gTlVMTDsKKwljb25zdCBFVlBfQ0lQSEVSICpjaXBoZXI9TlVMTDsKKwlBU04xX0lOVEVHRVIgKnNlcmlhbCA9IE5VTEw7CisJaW50IG1vZHVsdXM9MDsKKwljaGFyICppbnJhbmQ9TlVMTDsKKwljaGFyICpwYXNzYXJnaW4gPSBOVUxMLCAqcGFzc2FyZ291dCA9IE5VTEw7CisJY2hhciAqcGFzc2luID0gTlVMTCwgKnBhc3NvdXQgPSBOVUxMOworCWNoYXIgKnA7CisJY2hhciAqc3ViaiA9IE5VTEw7CisJaW50IG11bHRpcmRuID0gMDsKKwljb25zdCBFVlBfTUQgKm1kX2FsZz1OVUxMLCpkaWdlc3Q9TlVMTDsKKwl1bnNpZ25lZCBsb25nIGNodHlwZSA9IE1CU1RSSU5HX0FTQzsKKyNpZm5kZWYgTU9OT0xJVEgKKwljaGFyICp0b19mcmVlOworCWxvbmcgZXJybGluZTsKKyNlbmRpZgorCisJcmVxX2NvbmYgPSBOVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCWNpcGhlcj1FVlBfZGVzX2VkZTNfY2JjKCk7CisjZW5kaWYKKwlhcHBzX3N0YXJ0dXAoKTsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWluZmlsZT1OVUxMOworCW91dGZpbGU9TlVMTDsKKwlpbmZvcm1hdD1GT1JNQVRfUEVNOworCW91dGZvcm1hdD1GT1JNQVRfUEVNOworCisJcHJvZz1hcmd2WzBdOworCWFyZ2MtLTsKKwlhcmd2Kys7CisJd2hpbGUgKGFyZ2MgPj0gMSkKKwkJeworCQlpZiAJKHN0cmNtcCgqYXJndiwiLWluZm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dGZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0Zm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWVuZ2luZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1rZXlnZW5fZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWdlbl9lbmcgPSBFTkdJTkVfYnlfaWQoKigrK2FyZ3YpKTsKKwkJCWlmIChnZW5fZW5nID09IE5VTEwpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkNhbid0IGZpbmQga2V5Z2VuIGVuZ2luZSAlc1xuIiwgKmFyZ3YpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1rZXkiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJa2V5ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wdWJrZXkiKSA9PSAwKQorCQkJeworCQkJcHVia2V5PTE7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5ldyIpID09IDApCisJCQl7CisJCQluZXdyZXE9MTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY29uZmlnIikgPT0gMCkKKwkJCXsJCisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQl0ZW1wbGF0ZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1rZXlmb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWtleWZvcm09c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCIta2V5b3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWtleW91dD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wYXNzaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZ2luPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBhc3NvdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZ291dD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1yYW5kIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWlucmFuZD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1uZXdrZXkiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpCisJCQkJZ290byBiYWQ7CisJCQlrZXlhbGcgPSAqKCsrYXJndik7CisJCQluZXdyZXE9MTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcGtleW9wdCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkKKwkJCQlnb3RvIGJhZDsKKwkJCWlmICghcGtleW9wdHMpCisJCQkJcGtleW9wdHMgPSBza19PUEVOU1NMX1NUUklOR19uZXdfbnVsbCgpOworCQkJaWYgKCFwa2V5b3B0cyB8fCAhc2tfT1BFTlNTTF9TVFJJTkdfcHVzaChwa2V5b3B0cywgKigrK2FyZ3YpKSkKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItYmF0Y2giKSA9PSAwKQorCQkJYmF0Y2g9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbmV3aGRyIikgPT0gMCkKKwkJCW5ld2hkcj0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1tb2R1bHVzIikgPT0gMCkKKwkJCW1vZHVsdXM9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdmVyaWZ5IikgPT0gMCkKKwkJCXZlcmlmeT0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub2RlcyIpID09IDApCisJCQlub2Rlcz0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub291dCIpID09IDApCisJCQlub291dD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi12ZXJib3NlIikgPT0gMCkKKwkJCXZlcmJvc2U9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdXRmOCIpID09IDApCisJCQljaHR5cGUgPSBNQlNUUklOR19VVEY4OworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1uYW1lb3B0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWlmICghc2V0X25hbWVfZXgoJm5tZmxhZywgKigrK2FyZ3YpKSkgZ290byBiYWQ7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXJlcW9wdCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpZiAoIXNldF9jZXJ0X2V4KCZyZXFmbGFnLCAqKCsrYXJndikpKSBnb3RvIGJhZDsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItc3ViamVjdCIpID09IDApCisJCQlzdWJqZWN0PTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXRleHQiKSA9PSAwKQorCQkJdGV4dD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi14NTA5IikgPT0gMCkKKwkJCXg1MDk9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItYXNuMS1rbHVkZ2UiKSA9PSAwKQorCQkJa2x1ZGdlPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vLWFzbjEta2x1ZGdlIikgPT0gMCkKKwkJCWtsdWRnZT0wOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zdWJqIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXN1Ymo9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbXVsdGl2YWx1ZS1yZG4iKSA9PSAwKQorCQkJbXVsdGlyZG49MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZGF5cyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlkYXlzPSBhdG9pKCooKythcmd2KSk7CisJCQlpZiAoZGF5cyA9PSAwKSBkYXlzPTMwOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zZXRfc2VyaWFsIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNlcmlhbCA9IHMyaV9BU04xX0lOVEVHRVIoTlVMTCwgKigrK2FyZ3YpKTsKKwkJCWlmICghc2VyaWFsKSBnb3RvIGJhZDsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZXh0ZW5zaW9ucyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlleHRlbnNpb25zID0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1yZXFleHRzIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXJlcV9leHRzID0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmICgobWRfYWxnPUVWUF9nZXRfZGlnZXN0YnluYW1lKCYoKCphcmd2KVsxXSkpKSAhPSBOVUxMKQorCQkJeworCQkJLyogb2sgKi8KKwkJCWRpZ2VzdD1tZF9hbGc7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJXNcbiIsKmFyZ3YpOworCQkJYmFkb3BzPTE7CisJCQlicmVhazsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKworCWlmIChiYWRvcHMpCisJCXsKK2JhZDoKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlcyBbb3B0aW9uc10gPGluZmlsZSA+b3V0ZmlsZVxuIixwcm9nKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ3aGVyZSBvcHRpb25zICBhcmVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaW5mb3JtIGFyZyAgICBpbnB1dCBmb3JtYXQgLSBERVIgb3IgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dGZvcm0gYXJnICAgb3V0cHV0IGZvcm1hdCAtIERFUiBvciBQRU1cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaW4gYXJnICAgICAgICBpbnB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dCBhcmcgICAgICAgb3V0cHV0IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtdGV4dCAgICAgICAgICB0ZXh0IGZvcm0gb2YgcmVxdWVzdFxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1wdWJrZXkgICAgICAgIG91dHB1dCBwdWJsaWMga2V5XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vb3V0ICAgICAgICAgZG8gbm90IG91dHB1dCBSRVFcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtdmVyaWZ5ICAgICAgICB2ZXJpZnkgc2lnbmF0dXJlIG9uIFJFUVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1tb2R1bHVzICAgICAgIFJTQSBtb2R1bHVzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vZGVzICAgICAgICAgZG9uJ3QgZW5jcnlwdCB0aGUgb3V0cHV0IGtleVxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1lbmdpbmUgZSAgICAgIHVzZSBlbmdpbmUgZSwgcG9zc2libHkgYSBoYXJkd2FyZSBkZXZpY2VcbiIpOworI2VuZGlmCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1zdWJqZWN0ICAgICAgIG91dHB1dCB0aGUgcmVxdWVzdCdzIHN1YmplY3RcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcGFzc2luICAgICAgICBwcml2YXRlIGtleSBwYXNzd29yZCBzb3VyY2VcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAta2V5IGZpbGUgICAgICB1c2UgdGhlIHByaXZhdGUga2V5IGNvbnRhaW5lZCBpbiBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWtleWZvcm0gYXJnICAga2V5IGZpbGUgZm9ybWF0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWtleW91dCBhcmcgICAgZmlsZSB0byBzZW5kIHRoZSBrZXkgdG9cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcmFuZCBmaWxlJWNmaWxlJWMuLi5cbiIsIExJU1RfU0VQQVJBVE9SX0NIQVIsIExJU1RfU0VQQVJBVE9SX0NIQVIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICBsb2FkIHRoZSBmaWxlIChvciB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSkgaW50b1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvclxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1uZXdrZXkgcnNhOmJpdHMgZ2VuZXJhdGUgYSBuZXcgUlNBIGtleSBvZiAnYml0cycgaW4gc2l6ZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1uZXdrZXkgZHNhOmZpbGUgZ2VuZXJhdGUgYSBuZXcgRFNBIGtleSwgcGFyYW1ldGVycyB0YWtlbiBmcm9tIENBIGluICdmaWxlJ1xuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5ld2tleSBlYzpmaWxlIGdlbmVyYXRlIGEgbmV3IEVDIGtleSwgcGFyYW1ldGVycyB0YWtlbiBmcm9tIENBIGluICdmaWxlJ1xuIik7CisjZW5kaWYKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLVtkaWdlc3RdICAgICAgRGlnZXN0IHRvIHNpZ24gd2l0aCAobWQ1LCBzaGExLCBtZDIsIG1kYzIsIG1kNClcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtY29uZmlnIGZpbGUgICByZXF1ZXN0IHRlbXBsYXRlIGZpbGUuXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXN1YmogYXJnICAgICAgc2V0IG9yIG1vZGlmeSByZXF1ZXN0IHN1YmplY3RcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbXVsdGl2YWx1ZS1yZG4gZW5hYmxlIHN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIFJETnNcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbmV3ICAgICAgICAgICBuZXcgcmVxdWVzdC5cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtYmF0Y2ggICAgICAgICBkbyBub3QgYXNrIGFueXRoaW5nIGR1cmluZyByZXF1ZXN0IGdlbmVyYXRpb25cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAteDUwOSAgICAgICAgICBvdXRwdXQgYSB4NTA5IHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGEgY2VydC4gcmVxLlxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1kYXlzICAgICAgICAgIG51bWJlciBvZiBkYXlzIGEgY2VydGlmaWNhdGUgZ2VuZXJhdGVkIGJ5IC14NTA5IGlzIHZhbGlkIGZvci5cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtc2V0X3NlcmlhbCAgICBzZXJpYWwgbnVtYmVyIHRvIHVzZSBmb3IgYSBjZXJ0aWZpY2F0ZSBnZW5lcmF0ZWQgYnkgLXg1MDkuXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5ld2hkciAgICAgICAgb3V0cHV0IFwiTkVXXCIgaW4gdGhlIGhlYWRlciBsaW5lc1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1hc24xLWtsdWRnZSAgIE91dHB1dCB0aGUgJ3JlcXVlc3QnIGluIGEgZm9ybWF0IHRoYXQgaXMgd3JvbmcgYnV0IHNvbWUgQ0Enc1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgIGhhdmUgYmVlbiByZXBvcnRlZCBhcyByZXF1aXJpbmdcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtZXh0ZW5zaW9ucyAuLiBzcGVjaWZ5IGNlcnRpZmljYXRlIGV4dGVuc2lvbiBzZWN0aW9uIChvdmVycmlkZSB2YWx1ZSBpbiBjb25maWcgZmlsZSlcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcmVxZXh0cyAuLiAgICBzcGVjaWZ5IHJlcXVlc3QgZXh0ZW5zaW9uIHNlY3Rpb24gKG92ZXJyaWRlIHZhbHVlIGluIGNvbmZpZyBmaWxlKVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC11dGY4ICAgICAgICAgIGlucHV0IGNoYXJhY3RlcnMgYXJlIFVURjggKGRlZmF1bHQgQVNDSUkpXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5hbWVvcHQgYXJnICAgIC0gdmFyaW91cyBjZXJ0aWZpY2F0ZSBuYW1lIG9wdGlvbnNcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcmVxb3B0IGFyZyAgICAtIHZhcmlvdXMgcmVxdWVzdCB0ZXh0IG9wdGlvbnNcblxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCWlmKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmdpbiwgcGFzc2FyZ291dCwgJnBhc3NpbiwgJnBhc3NvdXQpKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgcGFzc3dvcmRzXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisjaWZuZGVmIE1PTk9MSVRIIC8qIGVsc2UgdGhpcyBoYXMgaGFwcGVuZWQgaW4gb3BlbnNzbC5jIChnbG9iYWwgYGNvbmZpZycpICovCisJLyogTGV0cyBsb2FkIHVwIG91ciBlbnZpcm9ubWVudCBhIGxpdHRsZSAqLworCXA9Z2V0ZW52KCJPUEVOU1NMX0NPTkYiKTsKKwlpZiAocCA9PSBOVUxMKQorCQlwPWdldGVudigiU1NMRUFZX0NPTkYiKTsKKwlpZiAocCA9PSBOVUxMKQorCQlwPXRvX2ZyZWU9bWFrZV9jb25maWdfbmFtZSgpOworCWRlZmF1bHRfY29uZmlnX2ZpbGU9cDsKKwljb25maWc9TkNPTkZfbmV3KE5VTEwpOworCWk9TkNPTkZfbG9hZChjb25maWcsIHAsICZlcnJsaW5lKTsKKyNlbmRpZgorCisJaWYgKHRlbXBsYXRlICE9IE5VTEwpCisJCXsKKwkJbG9uZyBlcnJsaW5lID0gLTE7CisKKwkJaWYoIHZlcmJvc2UgKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJVc2luZyBjb25maWd1cmF0aW9uIGZyb20gJXNcbiIsdGVtcGxhdGUpOworCQlyZXFfY29uZj1OQ09ORl9uZXcoTlVMTCk7CisJCWk9TkNPTkZfbG9hZChyZXFfY29uZix0ZW1wbGF0ZSwmZXJybGluZSk7CisJCWlmIChpID09IDApCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIG9uIGxpbmUgJWxkIG9mICVzXG4iLGVycmxpbmUsdGVtcGxhdGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJcmVxX2NvbmY9Y29uZmlnOworCisJCWlmIChyZXFfY29uZiA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJVbmFibGUgdG8gbG9hZCBjb25maWcgaW5mbyBmcm9tICVzXG4iLCBkZWZhdWx0X2NvbmZpZ19maWxlKTsKKwkJCWlmIChuZXdyZXEpCisJCQkJZ290byBlbmQ7CisJCQl9CisJCWVsc2UgaWYoIHZlcmJvc2UgKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJVc2luZyBjb25maWd1cmF0aW9uIGZyb20gJXNcbiIsCisJCQlkZWZhdWx0X2NvbmZpZ19maWxlKTsKKwkJfQorCisJaWYgKHJlcV9jb25mICE9IE5VTEwpCisJCXsKKwkJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCByZXFfY29uZikpCisJCQlnb3RvIGVuZDsKKwkJcD1OQ09ORl9nZXRfc3RyaW5nKHJlcV9jb25mLE5VTEwsIm9pZF9maWxlIik7CisJCWlmIChwID09IE5VTEwpCisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJaWYgKHAgIT0gTlVMTCkKKwkJCXsKKwkJCUJJTyAqb2lkX2JpbzsKKworCQkJb2lkX2Jpbz1CSU9fbmV3X2ZpbGUocCwiciIpOworCQkJaWYgKG9pZF9iaW8gPT0gTlVMTCkgCisJCQkJeworCQkJCS8qCisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJwcm9ibGVtcyBvcGVuaW5nICVzIGZvciBleHRyYSBvaWQnc1xuIixwKTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCSovCisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlPQkpfY3JlYXRlX29iamVjdHMob2lkX2Jpbyk7CisJCQkJQklPX2ZyZWUob2lkX2Jpbyk7CisJCQkJfQorCQkJfQorCQl9CisJaWYoIWFkZF9vaWRfc2VjdGlvbihiaW9fZXJyLCByZXFfY29uZikpIGdvdG8gZW5kOworCisJaWYgKG1kX2FsZyA9PSBOVUxMKQorCQl7CisJCXA9TkNPTkZfZ2V0X3N0cmluZyhyZXFfY29uZixTRUNUSU9OLCJkZWZhdWx0X21kIik7CisJCWlmIChwID09IE5VTEwpCisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJaWYgKHAgIT0gTlVMTCkKKwkJCXsKKwkJCWlmICgobWRfYWxnPUVWUF9nZXRfZGlnZXN0YnluYW1lKHApKSAhPSBOVUxMKQorCQkJCWRpZ2VzdD1tZF9hbGc7CisJCQl9CisJCX0KKworCWlmICghZXh0ZW5zaW9ucykKKwkJeworCQlleHRlbnNpb25zID0gTkNPTkZfZ2V0X3N0cmluZyhyZXFfY29uZiwgU0VDVElPTiwgVjNfRVhURU5TSU9OUyk7CisJCWlmICghZXh0ZW5zaW9ucykKKwkJCUVSUl9jbGVhcl9lcnJvcigpOworCQl9CisJaWYgKGV4dGVuc2lvbnMpIHsKKwkJLyogQ2hlY2sgc3ludGF4IG9mIGZpbGUgKi8KKwkJWDUwOVYzX0NUWCBjdHg7CisJCVg1MDlWM19zZXRfY3R4X3Rlc3QoJmN0eCk7CisJCVg1MDlWM19zZXRfbmNvbmYoJmN0eCwgcmVxX2NvbmYpOworCQlpZighWDUwOVYzX0VYVF9hZGRfbmNvbmYocmVxX2NvbmYsICZjdHgsIGV4dGVuc2lvbnMsIE5VTEwpKSB7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkgIkVycm9yIExvYWRpbmcgZXh0ZW5zaW9uIHNlY3Rpb24gJXNcbiIsIGV4dGVuc2lvbnMpOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisKKwlpZighcGFzc2luKQorCQl7CisJCXBhc3NpbiA9IE5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsIFNFQ1RJT04sICJpbnB1dF9wYXNzd29yZCIpOworCQlpZiAoIXBhc3NpbikKKwkJCUVSUl9jbGVhcl9lcnJvcigpOworCQl9CisJCisJaWYoIXBhc3NvdXQpCisJCXsKKwkJcGFzc291dCA9IE5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsIFNFQ1RJT04sICJvdXRwdXRfcGFzc3dvcmQiKTsKKwkJaWYgKCFwYXNzb3V0KQorCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCX0KKworCXAgPSBOQ09ORl9nZXRfc3RyaW5nKHJlcV9jb25mLCBTRUNUSU9OLCBTVFJJTkdfTUFTSyk7CisJaWYgKCFwKQorCQlFUlJfY2xlYXJfZXJyb3IoKTsKKworCWlmKHAgJiYgIUFTTjFfU1RSSU5HX3NldF9kZWZhdWx0X21hc2tfYXNjKHApKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkludmFsaWQgZ2xvYmFsIHN0cmluZyBtYXNrIHNldHRpbmcgJXNcbiIsIHApOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoY2h0eXBlICE9IE1CU1RSSU5HX1VURjgpCisJCXsKKwkJcCA9IE5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsIFNFQ1RJT04sIFVURjhfSU4pOworCQlpZiAoIXApCisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChwLCAieWVzIikpCisJCQljaHR5cGUgPSBNQlNUUklOR19VVEY4OworCQl9CisKKworCWlmKCFyZXFfZXh0cykKKwkJeworCQlyZXFfZXh0cyA9IE5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsIFNFQ1RJT04sIFJFUV9FWFRFTlNJT05TKTsKKwkJaWYgKCFyZXFfZXh0cykKKwkJCUVSUl9jbGVhcl9lcnJvcigpOworCQl9CisJaWYocmVxX2V4dHMpIHsKKwkJLyogQ2hlY2sgc3ludGF4IG9mIGZpbGUgKi8KKwkJWDUwOVYzX0NUWCBjdHg7CisJCVg1MDlWM19zZXRfY3R4X3Rlc3QoJmN0eCk7CisJCVg1MDlWM19zZXRfbmNvbmYoJmN0eCwgcmVxX2NvbmYpOworCQlpZighWDUwOVYzX0VYVF9hZGRfbmNvbmYocmVxX2NvbmYsICZjdHgsIHJlcV9leHRzLCBOVUxMKSkgeworCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJICJFcnJvciBMb2FkaW5nIHJlcXVlc3QgZXh0ZW5zaW9uIHNlY3Rpb24gJXNcbiIsCisJCQkJCQkJCXJlcV9leHRzKTsKKwkJCWdvdG8gZW5kOworCQl9CisJfQorCisJaW49QklPX25ldyhCSU9fc19maWxlKCkpOworCW91dD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKChpbiA9PSBOVUxMKSB8fCAob3V0ID09IE5VTEwpKQorCQlnb3RvIGVuZDsKKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmIChrZXlmaWxlICE9IE5VTEwpCisJCXsKKwkJcGtleSA9IGxvYWRfa2V5KGJpb19lcnIsIGtleWZpbGUsIGtleWZvcm0sIDAsIHBhc3NpbiwgZSwKKwkJCSJQcml2YXRlIEtleSIpOworCQlpZiAoIXBrZXkpCisJCQl7CisJCQkvKiBsb2FkX2tleSgpIGhhcyBhbHJlYWR5IHByaW50ZWQgYW4gYXBwcm9wcmlhdGUKKwkJCSAgIG1lc3NhZ2UgKi8KKwkJCWdvdG8gZW5kOworCQkJfQorCQllbHNlCisJCQl7CisJCQljaGFyICpyYW5kZmlsZSA9IE5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsU0VDVElPTiwiUkFOREZJTEUiKTsKKwkJCWlmIChyYW5kZmlsZSA9PSBOVUxMKQorCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJYXBwX1JBTkRfbG9hZF9maWxlKHJhbmRmaWxlLCBiaW9fZXJyLCAwKTsKKwkJCX0KKwkJfQorCisJaWYgKG5ld3JlcSAmJiAocGtleSA9PSBOVUxMKSkKKwkJeworCQljaGFyICpyYW5kZmlsZSA9IE5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsU0VDVElPTiwiUkFOREZJTEUiKTsKKwkJaWYgKHJhbmRmaWxlID09IE5VTEwpCisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJYXBwX1JBTkRfbG9hZF9maWxlKHJhbmRmaWxlLCBiaW9fZXJyLCAwKTsKKwkJaWYgKGlucmFuZCkKKwkJCWFwcF9SQU5EX2xvYWRfZmlsZXMoaW5yYW5kKTsKKworCQlpZiAoa2V5YWxnKQorCQkJeworCQkJZ2VuY3R4ID0gc2V0X2tleWdlbl9jdHgoYmlvX2Vyciwga2V5YWxnLCAmcGtleV90eXBlLCAmbmV3a2V5LAorCQkJCQkJCSZrZXlhbGdzdHIsIGdlbl9lbmcpOworCQkJaWYgKCFnZW5jdHgpCisJCQkJZ290byBlbmQ7CisJCQl9CisJCisJCWlmIChuZXdrZXkgPD0gMCkKKwkJCXsKKwkJCWlmICghTkNPTkZfZ2V0X251bWJlcihyZXFfY29uZixTRUNUSU9OLEJJVFMsICZuZXdrZXkpKQorCQkJCW5ld2tleT1ERUZBVUxUX0tFWV9MRU5HVEg7CisJCQl9CisKKwkJaWYgKG5ld2tleSA8IE1JTl9LRVlfTEVOR1RIICYmIChwa2V5X3R5cGUgPT0gRVZQX1BLRVlfUlNBIHx8IHBrZXlfdHlwZSA9PSBFVlBfUEtFWV9EU0EpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJwcml2YXRlIGtleSBsZW5ndGggaXMgdG9vIHNob3J0LFxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIml0IG5lZWRzIHRvIGJlIGF0IGxlYXN0ICVkIGJpdHMsIG5vdCAlbGRcbiIsTUlOX0tFWV9MRU5HVEgsbmV3a2V5KTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCWlmICghZ2VuY3R4KQorCQkJeworCQkJZ2VuY3R4ID0gc2V0X2tleWdlbl9jdHgoYmlvX2VyciwgTlVMTCwgJnBrZXlfdHlwZSwgJm5ld2tleSwKKwkJCQkJCQkma2V5YWxnc3RyLCBnZW5fZW5nKTsKKwkJCWlmICghZ2VuY3R4KQorCQkJCWdvdG8gZW5kOworCQkJfQorCisJCWlmIChwa2V5b3B0cykKKwkJCXsKKwkJCWNoYXIgKmdlbm9wdDsKKwkJCWZvciAoaSA9IDA7IGkgPCBza19PUEVOU1NMX1NUUklOR19udW0ocGtleW9wdHMpOyBpKyspCisJCQkJeworCQkJCWdlbm9wdCA9IHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKHBrZXlvcHRzLCBpKTsKKwkJCQlpZiAocGtleV9jdHJsX3N0cmluZyhnZW5jdHgsIGdlbm9wdCkgPD0gMCkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCQkicGFyYW1ldGVyIGVycm9yIFwiJXNcIlxuIiwKKwkJCQkJCWdlbm9wdCk7CisJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCUJJT19wcmludGYoYmlvX2VyciwiR2VuZXJhdGluZyBhICVsZCBiaXQgJXMgcHJpdmF0ZSBrZXlcbiIsCisJCQkJbmV3a2V5LCBrZXlhbGdzdHIpOworCisJCUVWUF9QS0VZX0NUWF9zZXRfY2IoZ2VuY3R4LCBnZW5wa2V5X2NiKTsKKwkJRVZQX1BLRVlfQ1RYX3NldF9hcHBfZGF0YShnZW5jdHgsIGJpb19lcnIpOworCisJCWlmIChFVlBfUEtFWV9rZXlnZW4oZ2VuY3R4LCAmcGtleSkgPD0gMCkKKwkJCXsKKwkJCUJJT19wdXRzKGJpb19lcnIsICJFcnJvciBHZW5lcmF0aW5nIEtleVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQlFVlBfUEtFWV9DVFhfZnJlZShnZW5jdHgpOworCQlnZW5jdHggPSBOVUxMOworCisJCWFwcF9SQU5EX3dyaXRlX2ZpbGUocmFuZGZpbGUsIGJpb19lcnIpOworCisJCWlmIChrZXlvdXQgPT0gTlVMTCkKKwkJCXsKKwkJCWtleW91dD1OQ09ORl9nZXRfc3RyaW5nKHJlcV9jb25mLFNFQ1RJT04sS0VZRklMRSk7CisJCQlpZiAoa2V5b3V0ID09IE5VTEwpCisJCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQl9CisJCQorCQlpZiAoa2V5b3V0ID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIndyaXRpbmcgbmV3IHByaXZhdGUga2V5IHRvIHN0ZG91dFxuIik7CisJCQlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQkJeworCQkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCQl9CisjZW5kaWYKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ3cml0aW5nIG5ldyBwcml2YXRlIGtleSB0byAnJXMnXG4iLGtleW91dCk7CisJCQlpZiAoQklPX3dyaXRlX2ZpbGVuYW1lKG91dCxrZXlvdXQpIDw9IDApCisJCQkJeworCQkJCXBlcnJvcihrZXlvdXQpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKworCQlwPU5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsU0VDVElPTiwiZW5jcnlwdF9yc2Ffa2V5Iik7CisJCWlmIChwID09IE5VTEwpCisJCQl7CisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCXA9TkNPTkZfZ2V0X3N0cmluZyhyZXFfY29uZixTRUNUSU9OLCJlbmNyeXB0X2tleSIpOworCQkJaWYgKHAgPT0gTlVMTCkKKwkJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCX0KKwkJaWYgKChwICE9IE5VTEwpICYmIChzdHJjbXAocCwibm8iKSA9PSAwKSkKKwkJCWNpcGhlcj1OVUxMOworCQlpZiAobm9kZXMpIGNpcGhlcj1OVUxMOworCQkKKwkJaT0wOworbG9vcDoKKwkJaWYgKCFQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkob3V0LHBrZXksY2lwaGVyLAorCQkJTlVMTCwwLE5VTEwscGFzc291dCkpCisJCQl7CisJCQlpZiAoKEVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2Vycm9yKCkpID09CisJCQkJUEVNX1JfUFJPQkxFTVNfR0VUVElOR19QQVNTV09SRCkgJiYgKGkgPCAzKSkKKwkJCQl7CisJCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQkJaSsrOworCQkJCWdvdG8gbG9vcDsKKwkJCQl9CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJQklPX3ByaW50ZihiaW9fZXJyLCItLS0tLVxuIik7CisJCX0KKworCWlmICghbmV3cmVxKQorCQl7CisJCS8qIFNpbmNlIHdlIGFyZSB1c2luZyBhIHByZS1leGlzdGluZyBjZXJ0aWZpY2F0ZQorCQkgKiByZXF1ZXN0LCB0aGUga2x1ZGdlICdmb3JtYXQnIGluZm8gc2hvdWxkIG5vdCBiZQorCQkgKiBjaGFuZ2VkLiAqLworCQlrbHVkZ2U9IC0xOworCQlpZiAoaW5maWxlID09IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGluLHN0ZGluLEJJT19OT0NMT1NFKTsKKwkJZWxzZQorCQkJeworCQkJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGluZmlsZSkgPD0gMCkKKwkJCQl7CisJCQkJcGVycm9yKGluZmlsZSk7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCisJCWlmCShpbmZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJCXJlcT1kMmlfWDUwOV9SRVFfYmlvKGluLE5VTEwpOworCQllbHNlIGlmIChpbmZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQkJcmVxPVBFTV9yZWFkX2Jpb19YNTA5X1JFUShpbixOVUxMLE5VTEwsTlVMTCk7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIGlucHV0IGZvcm1hdCBzcGVjaWZpZWQgZm9yIFg1MDkgcmVxdWVzdFxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKHJlcSA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gbG9hZCBYNTA5IHJlcXVlc3RcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmIChuZXdyZXEgfHwgeDUwOSkKKwkJeworCQlpZiAocGtleSA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ5b3UgbmVlZCB0byBzcGVjaWZ5IGEgcHJpdmF0ZSBrZXlcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJaWYgKHJlcSA9PSBOVUxMKQorCQkJeworCQkJcmVxPVg1MDlfUkVRX25ldygpOworCQkJaWYgKHJlcSA9PSBOVUxMKQorCQkJCXsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisKKwkJCWk9bWFrZV9SRVEocmVxLHBrZXksc3ViaixtdWx0aXJkbiwheDUwOSwgY2h0eXBlKTsKKwkJCXN1Ymo9TlVMTDsgLyogZG9uZSBwcm9jZXNzaW5nICctc3Viaicgb3B0aW9uICovCisJCQlpZiAoKGtsdWRnZSA+IDApICYmICFza19YNTA5X0FUVFJJQlVURV9udW0ocmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcykpCisJCQkJeworCQkJCXNrX1g1MDlfQVRUUklCVVRFX2ZyZWUocmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcyk7CisJCQkJcmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcyA9IE5VTEw7CisJCQkJfQorCQkJaWYgKCFpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsInByb2JsZW1zIG1ha2luZyBDZXJ0aWZpY2F0ZSBSZXF1ZXN0XG4iKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisJCWlmICh4NTA5KQorCQkJeworCQkJRVZQX1BLRVkgKnRtcHBrZXk7CisJCQlYNTA5VjNfQ1RYIGV4dF9jdHg7CisJCQlpZiAoKHg1MDlzcz1YNTA5X25ldygpKSA9PSBOVUxMKSBnb3RvIGVuZDsKKworCQkJLyogU2V0IHZlcnNpb24gdG8gVjMgKi8KKwkJCWlmKGV4dGVuc2lvbnMgJiYgIVg1MDlfc2V0X3ZlcnNpb24oeDUwOXNzLCAyKSkgZ290byBlbmQ7CisJCQlpZiAoc2VyaWFsKQorCQkJCXsKKwkJCQlpZiAoIVg1MDlfc2V0X3NlcmlhbE51bWJlcih4NTA5c3MsIHNlcmlhbCkpIGdvdG8gZW5kOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKCFyYW5kX3NlcmlhbChOVUxMLAorCQkJCQlYNTA5X2dldF9zZXJpYWxOdW1iZXIoeDUwOXNzKSkpCisJCQkJCQlnb3RvIGVuZDsKKwkJCQl9CisKKwkJCWlmICghWDUwOV9zZXRfaXNzdWVyX25hbWUoeDUwOXNzLCBYNTA5X1JFUV9nZXRfc3ViamVjdF9uYW1lKHJlcSkpKSBnb3RvIGVuZDsKKwkJCWlmICghWDUwOV9nbXRpbWVfYWRqKFg1MDlfZ2V0X25vdEJlZm9yZSh4NTA5c3MpLDApKSBnb3RvIGVuZDsKKwkJCWlmICghWDUwOV90aW1lX2Fkal9leChYNTA5X2dldF9ub3RBZnRlcih4NTA5c3MpLCBkYXlzLCAwLCBOVUxMKSkgZ290byBlbmQ7CisJCQlpZiAoIVg1MDlfc2V0X3N1YmplY3RfbmFtZSh4NTA5c3MsIFg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUocmVxKSkpIGdvdG8gZW5kOworCQkJdG1wcGtleSA9IFg1MDlfUkVRX2dldF9wdWJrZXkocmVxKTsKKwkJCWlmICghdG1wcGtleSB8fCAhWDUwOV9zZXRfcHVia2V5KHg1MDlzcyx0bXBwa2V5KSkgZ290byBlbmQ7CisJCQlFVlBfUEtFWV9mcmVlKHRtcHBrZXkpOworCisJCQkvKiBTZXQgdXAgVjMgY29udGV4dCBzdHJ1Y3QgKi8KKworCQkJWDUwOVYzX3NldF9jdHgoJmV4dF9jdHgsIHg1MDlzcywgeDUwOXNzLCBOVUxMLCBOVUxMLCAwKTsKKwkJCVg1MDlWM19zZXRfbmNvbmYoJmV4dF9jdHgsIHJlcV9jb25mKTsKKworCQkJLyogQWRkIGV4dGVuc2lvbnMgKi8KKwkJCWlmKGV4dGVuc2lvbnMgJiYgIVg1MDlWM19FWFRfYWRkX25jb25mKHJlcV9jb25mLCAKKwkJCQkgCSZleHRfY3R4LCBleHRlbnNpb25zLCB4NTA5c3MpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCSJFcnJvciBMb2FkaW5nIGV4dGVuc2lvbiBzZWN0aW9uICVzXG4iLAorCQkJCQlleHRlbnNpb25zKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQkKKwkJCWlmICghKGk9WDUwOV9zaWduKHg1MDlzcyxwa2V5LGRpZ2VzdCkpKQorCQkJCXsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJWDUwOVYzX0NUWCBleHRfY3R4OworCisJCQkvKiBTZXQgdXAgVjMgY29udGV4dCBzdHJ1Y3QgKi8KKworCQkJWDUwOVYzX3NldF9jdHgoJmV4dF9jdHgsIE5VTEwsIE5VTEwsIHJlcSwgTlVMTCwgMCk7CisJCQlYNTA5VjNfc2V0X25jb25mKCZleHRfY3R4LCByZXFfY29uZik7CisKKwkJCS8qIEFkZCBleHRlbnNpb25zICovCisJCQlpZihyZXFfZXh0cyAmJiAhWDUwOVYzX0VYVF9SRVFfYWRkX25jb25mKHJlcV9jb25mLCAKKwkJCQkgCSZleHRfY3R4LCByZXFfZXh0cywgcmVxKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkiRXJyb3IgTG9hZGluZyBleHRlbnNpb24gc2VjdGlvbiAlc1xuIiwKKwkJCQkJcmVxX2V4dHMpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWlmICghKGk9WDUwOV9SRVFfc2lnbihyZXEscGtleSxkaWdlc3QpKSkKKwkJCQl7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisJCX0KKworCWlmIChzdWJqICYmIHg1MDkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiQ2Fubm90IG1vZGlmaXkgY2VydGlmaWNhdGUgc3ViamVjdFxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoc3ViaiAmJiAheDUwOSkKKwkJeworCQlpZiAodmVyYm9zZSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIk1vZGlmeWluZyBSZXF1ZXN0J3MgU3ViamVjdFxuIik7CisJCQlwcmludF9uYW1lKGJpb19lcnIsICJvbGQgc3ViamVjdD0iLCBYNTA5X1JFUV9nZXRfc3ViamVjdF9uYW1lKHJlcSksIG5tZmxhZyk7CisJCQl9CisKKwkJaWYgKGJ1aWxkX3N1YmplY3QocmVxLCBzdWJqLCBjaHR5cGUsIG11bHRpcmRuKSA9PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRVJST1I6IGNhbm5vdCBtb2RpZnkgc3ViamVjdFxuIik7CisJCQlleD0xOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJcmVxLT5yZXFfaW5mby0+ZW5jLm1vZGlmaWVkID0gMTsKKworCQlpZiAodmVyYm9zZSkKKwkJCXsKKwkJCXByaW50X25hbWUoYmlvX2VyciwgIm5ldyBzdWJqZWN0PSIsIFg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUocmVxKSwgbm1mbGFnKTsKKwkJCX0KKwkJfQorCisJaWYgKHZlcmlmeSAmJiAheDUwOSkKKwkJeworCQlpbnQgdG1wPTA7CisKKwkJaWYgKHBrZXkgPT0gTlVMTCkKKwkJCXsKKwkJCXBrZXk9WDUwOV9SRVFfZ2V0X3B1YmtleShyZXEpOworCQkJdG1wPTE7CisJCQlpZiAocGtleSA9PSBOVUxMKSBnb3RvIGVuZDsKKwkJCX0KKworCQlpPVg1MDlfUkVRX3ZlcmlmeShyZXEscGtleSk7CisJCWlmICh0bXApIHsKKwkJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCQlwa2V5PU5VTEw7CisJCX0KKworCQlpZiAoaSA8IDApCisJCQl7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJZWxzZSBpZiAoaSA9PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ2ZXJpZnkgZmFpbHVyZVxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJfQorCQllbHNlIC8qIGlmIChpID4gMCkgKi8KKwkJCUJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IE9LXG4iKTsKKwkJfQorCisJaWYgKG5vb3V0ICYmICF0ZXh0ICYmICFtb2R1bHVzICYmICFzdWJqZWN0ICYmICFwdWJrZXkpCisJCXsKKwkJZXg9MDsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChvdXRmaWxlID09IE5VTEwpCisJCXsKKwkJQklPX3NldF9mcChvdXQsc3Rkb3V0LEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJeworCQlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwkJb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoKGtleW91dCAhPSBOVUxMKSAmJiAoc3RyY21wKG91dGZpbGUsa2V5b3V0KSA9PSAwKSkKKwkJCWk9KGludClCSU9fYXBwZW5kX2ZpbGVuYW1lKG91dCxvdXRmaWxlKTsKKwkJZWxzZQorCQkJaT0oaW50KUJJT193cml0ZV9maWxlbmFtZShvdXQsb3V0ZmlsZSk7CisJCWlmICghaSkKKwkJCXsKKwkJCXBlcnJvcihvdXRmaWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAocHVia2V5KQorCQl7CisJCUVWUF9QS0VZICp0cHVia2V5OyAKKwkJdHB1YmtleT1YNTA5X1JFUV9nZXRfcHVia2V5KHJlcSk7CisJCWlmICh0cHVia2V5ID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkVycm9yIGdldHRpbmcgcHVibGljIGtleVxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCVBFTV93cml0ZV9iaW9fUFVCS0VZKG91dCwgdHB1YmtleSk7CisJCUVWUF9QS0VZX2ZyZWUodHB1YmtleSk7CisJCX0KKworCWlmICh0ZXh0KQorCQl7CisJCWlmICh4NTA5KQorCQkJWDUwOV9wcmludF9leChvdXQsIHg1MDlzcywgbm1mbGFnLCByZXFmbGFnKTsKKwkJZWxzZQkKKwkJCVg1MDlfUkVRX3ByaW50X2V4KG91dCwgcmVxLCBubWZsYWcsIHJlcWZsYWcpOworCQl9CisKKwlpZihzdWJqZWN0KSAKKwkJeworCQlpZih4NTA5KQorCQkJcHJpbnRfbmFtZShvdXQsICJzdWJqZWN0PSIsIFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4NTA5c3MpLCBubWZsYWcpOworCQllbHNlCisJCQlwcmludF9uYW1lKG91dCwgInN1YmplY3Q9IiwgWDUwOV9SRVFfZ2V0X3N1YmplY3RfbmFtZShyZXEpLCBubWZsYWcpOworCQl9CisKKwlpZiAobW9kdWx1cykKKwkJeworCQlFVlBfUEtFWSAqdHB1YmtleTsKKworCQlpZiAoeDUwOSkKKwkJCXRwdWJrZXk9WDUwOV9nZXRfcHVia2V5KHg1MDlzcyk7CisJCWVsc2UKKwkJCXRwdWJrZXk9WDUwOV9SRVFfZ2V0X3B1YmtleShyZXEpOworCQlpZiAodHB1YmtleSA9PSBOVUxMKQorCQkJeworCQkJZnByaW50ZihzdGRvdXQsIk1vZHVsdXM9dW5hdmFpbGFibGVcbiIpOworCQkJZ290byBlbmQ7IAorCQkJfQorCQlmcHJpbnRmKHN0ZG91dCwiTW9kdWx1cz0iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkJaWYgKEVWUF9QS0VZX2Jhc2VfaWQodHB1YmtleSkgPT0gRVZQX1BLRVlfUlNBKQorCQkJQk5fcHJpbnQob3V0LHRwdWJrZXktPnBrZXkucnNhLT5uKTsKKwkJZWxzZQorI2VuZGlmCisJCQlmcHJpbnRmKHN0ZG91dCwiV3JvbmcgQWxnb3JpdGhtIHR5cGUiKTsKKwkJRVZQX1BLRVlfZnJlZSh0cHVia2V5KTsKKwkJZnByaW50ZihzdGRvdXQsIlxuIik7CisJCX0KKworCWlmICghbm9vdXQgJiYgIXg1MDkpCisJCXsKKwkJaWYgCShvdXRmb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCQlpPWkyZF9YNTA5X1JFUV9iaW8ob3V0LHJlcSk7CisJCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKSB7CisJCQlpZihuZXdoZHIpIGk9UEVNX3dyaXRlX2Jpb19YNTA5X1JFUV9ORVcob3V0LHJlcSk7CisJCQllbHNlIGk9UEVNX3dyaXRlX2Jpb19YNTA5X1JFUShvdXQscmVxKTsKKwkJfSBlbHNlIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBvdXRmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoIWkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVuYWJsZSB0byB3cml0ZSBYNTA5IHJlcXVlc3RcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwlpZiAoIW5vb3V0ICYmIHg1MDkgJiYgKHg1MDlzcyAhPSBOVUxMKSkKKwkJeworCQlpZiAJKG91dGZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJCWk9aTJkX1g1MDlfYmlvKG91dCx4NTA5c3MpOworCQllbHNlIGlmIChvdXRmb3JtYXQgPT0gRk9STUFUX1BFTSkKKwkJCWk9UEVNX3dyaXRlX2Jpb19YNTA5KG91dCx4NTA5c3MpOworCQllbHNlCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBvdXRmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoIWkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVuYWJsZSB0byB3cml0ZSBYNTA5IGNlcnRpZmljYXRlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJZXg9MDsKK2VuZDoKKyNpZm5kZWYgTU9OT0xJVEgKKwlpZih0b19mcmVlKQorCQlPUEVOU1NMX2ZyZWUodG9fZnJlZSk7CisjZW5kaWYKKwlpZiAoZXgpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJfQorCWlmICgocmVxX2NvbmYgIT0gTlVMTCkgJiYgKHJlcV9jb25mICE9IGNvbmZpZykpIE5DT05GX2ZyZWUocmVxX2NvbmYpOworCUJJT19mcmVlKGluKTsKKwlCSU9fZnJlZV9hbGwob3V0KTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCWlmIChnZW5jdHgpCisJCUVWUF9QS0VZX0NUWF9mcmVlKGdlbmN0eCk7CisJaWYgKHBrZXlvcHRzKQorCQlza19PUEVOU1NMX1NUUklOR19mcmVlKHBrZXlvcHRzKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoZ2VuX2VuZykKKwkJRU5HSU5FX2ZyZWUoZ2VuX2VuZyk7CisjZW5kaWYKKwlpZiAoa2V5YWxnc3RyKQorCQlPUEVOU1NMX2ZyZWUoa2V5YWxnc3RyKTsKKwlYNTA5X1JFUV9mcmVlKHJlcSk7CisJWDUwOV9mcmVlKHg1MDlzcyk7CisJQVNOMV9JTlRFR0VSX2ZyZWUoc2VyaWFsKTsKKwlpZihwYXNzYXJnaW4gJiYgcGFzc2luKSBPUEVOU1NMX2ZyZWUocGFzc2luKTsKKwlpZihwYXNzYXJnb3V0ICYmIHBhc3NvdXQpIE9QRU5TU0xfZnJlZShwYXNzb3V0KTsKKwlPQkpfY2xlYW51cCgpOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQoZXgpOworCX0KKworc3RhdGljIGludCBtYWtlX1JFUShYNTA5X1JFUSAqcmVxLCBFVlBfUEtFWSAqcGtleSwgY2hhciAqc3ViaiwgaW50IG11bHRpcmRuLAorCQkJaW50IGF0dHJpYnMsIHVuc2lnbmVkIGxvbmcgY2h0eXBlKQorCXsKKwlpbnQgcmV0PTAsaTsKKwljaGFyIG5vX3Byb21wdCA9IDA7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmRuX3NrLCAqYXR0cl9zayA9IE5VTEw7CisJY2hhciAqdG1wLCAqZG5fc2VjdCwqYXR0cl9zZWN0OworCisJdG1wPU5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsU0VDVElPTixQUk9NUFQpOworCWlmICh0bXAgPT0gTlVMTCkKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJaWYoKHRtcCAhPSBOVUxMKSAmJiAhc3RyY21wKHRtcCwgIm5vIikpIG5vX3Byb21wdCA9IDE7CisKKwlkbl9zZWN0PU5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsU0VDVElPTixESVNUSU5HVUlTSEVEX05BTUUpOworCWlmIChkbl9zZWN0ID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gZmluZCAnJXMnIGluIGNvbmZpZ1xuIiwKKwkJCURJU1RJTkdVSVNIRURfTkFNRSk7CisJCWdvdG8gZXJyOworCQl9CisJZG5fc2s9TkNPTkZfZ2V0X3NlY3Rpb24ocmVxX2NvbmYsZG5fc2VjdCk7CisJaWYgKGRuX3NrID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gZ2V0ICclcycgc2VjdGlvblxuIixkbl9zZWN0KTsKKwkJZ290byBlcnI7CisJCX0KKworCWF0dHJfc2VjdD1OQ09ORl9nZXRfc3RyaW5nKHJlcV9jb25mLFNFQ1RJT04sQVRUUklCVVRFUyk7CisJaWYgKGF0dHJfc2VjdCA9PSBOVUxMKQorCQl7CisJCUVSUl9jbGVhcl9lcnJvcigpOwkJCisJCWF0dHJfc2s9TlVMTDsKKwkJfQorCWVsc2UKKwkJeworCQlhdHRyX3NrPU5DT05GX2dldF9zZWN0aW9uKHJlcV9jb25mLGF0dHJfc2VjdCk7CisJCWlmIChhdHRyX3NrID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVuYWJsZSB0byBnZXQgJyVzJyBzZWN0aW9uXG4iLGF0dHJfc2VjdCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJLyogc2V0dXAgdmVyc2lvbiBudW1iZXIgKi8KKwlpZiAoIVg1MDlfUkVRX3NldF92ZXJzaW9uKHJlcSwwTCkpIGdvdG8gZXJyOyAvKiB2ZXJzaW9uIDEgKi8KKworCWlmIChub19wcm9tcHQpIAorCQlpID0gYXV0b19pbmZvKHJlcSwgZG5fc2ssIGF0dHJfc2ssIGF0dHJpYnMsIGNodHlwZSk7CisJZWxzZSAKKwkJeworCQlpZiAoc3ViaikKKwkJCWkgPSBidWlsZF9zdWJqZWN0KHJlcSwgc3ViaiwgY2h0eXBlLCBtdWx0aXJkbik7CisJCWVsc2UKKwkJCWkgPSBwcm9tcHRfaW5mbyhyZXEsIGRuX3NrLCBkbl9zZWN0LCBhdHRyX3NrLCBhdHRyX3NlY3QsIGF0dHJpYnMsIGNodHlwZSk7CisJCX0KKwlpZighaSkgZ290byBlcnI7CisKKwlpZiAoIVg1MDlfUkVRX3NldF9wdWJrZXkocmVxLHBrZXkpKSBnb3RvIGVycjsKKworCXJldD0xOworZXJyOgorCXJldHVybihyZXQpOworCX0KKworLyoKKyAqIHN1YmplY3QgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gdGhlIGZvcm1hdCAvdHlwZTA9dmFsdWUwL3R5cGUxPXZhbHVlMS90eXBlMj0uLi4KKyAqIHdoZXJlIGNoYXJhY3RlcnMgbWF5IGJlIGVzY2FwZWQgYnkgXAorICovCitzdGF0aWMgaW50IGJ1aWxkX3N1YmplY3QoWDUwOV9SRVEgKnJlcSwgY2hhciAqc3ViamVjdCwgdW5zaWduZWQgbG9uZyBjaHR5cGUsIGludCBtdWx0aXJkbikKKwl7CisJWDUwOV9OQU1FICpuOworCisJaWYgKCEobiA9IHBhcnNlX25hbWUoc3ViamVjdCwgY2h0eXBlLCBtdWx0aXJkbikpKQorCQlyZXR1cm4gMDsKKworCWlmICghWDUwOV9SRVFfc2V0X3N1YmplY3RfbmFtZShyZXEsIG4pKQorCQl7CisJCVg1MDlfTkFNRV9mcmVlKG4pOworCQlyZXR1cm4gMDsKKwkJfQorCVg1MDlfTkFNRV9mcmVlKG4pOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgcHJvbXB0X2luZm8oWDUwOV9SRVEgKnJlcSwKKwkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmRuX3NrLCBjaGFyICpkbl9zZWN0LAorCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqYXR0cl9zaywgY2hhciAqYXR0cl9zZWN0LCBpbnQgYXR0cmlicywKKwkJdW5zaWduZWQgbG9uZyBjaHR5cGUpCisJeworCWludCBpOworCWNoYXIgKnAsKnE7CisJY2hhciBidWZbMTAwXTsKKwlpbnQgbmlkLCBtdmFsOworCWxvbmcgbl9taW4sbl9tYXg7CisJY2hhciAqdHlwZSwgKnZhbHVlOworCWNvbnN0IGNoYXIgKmRlZjsKKwlDT05GX1ZBTFVFICp2OworCVg1MDlfTkFNRSAqc3ViajsKKwlzdWJqID0gWDUwOV9SRVFfZ2V0X3N1YmplY3RfbmFtZShyZXEpOworCisJaWYoIWJhdGNoKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiWW91IGFyZSBhYm91dCB0byBiZSBhc2tlZCB0byBlbnRlciBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgaW5jb3Jwb3JhdGVkXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJpbnRvIHlvdXIgY2VydGlmaWNhdGUgcmVxdWVzdC5cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIldoYXQgeW91IGFyZSBhYm91dCB0byBlbnRlciBpcyB3aGF0IGlzIGNhbGxlZCBhIERpc3Rpbmd1aXNoZWQgTmFtZSBvciBhIEROLlxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiVGhlcmUgYXJlIHF1aXRlIGEgZmV3IGZpZWxkcyBidXQgeW91IGNhbiBsZWF2ZSBzb21lIGJsYW5rXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJGb3Igc29tZSBmaWVsZHMgdGhlcmUgd2lsbCBiZSBhIGRlZmF1bHQgdmFsdWUsXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJJZiB5b3UgZW50ZXIgJy4nLCB0aGUgZmllbGQgd2lsbCBiZSBsZWZ0IGJsYW5rLlxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiLS0tLS1cbiIpOworCQl9CisKKworCWlmIChza19DT05GX1ZBTFVFX251bShkbl9zaykpCisJCXsKKwkJaT0gLTE7CitzdGFydDoJCWZvciAoOzspCisJCQl7CisJCQlpKys7CisJCQlpZiAoc2tfQ09ORl9WQUxVRV9udW0oZG5fc2spIDw9IGkpIGJyZWFrOworCisJCQl2PXNrX0NPTkZfVkFMVUVfdmFsdWUoZG5fc2ssaSk7CisJCQlwPXE9TlVMTDsKKwkJCXR5cGU9di0+bmFtZTsKKwkJCWlmKCFjaGVja19lbmQodHlwZSwiX21pbiIpIHx8ICFjaGVja19lbmQodHlwZSwiX21heCIpIHx8CisJCQkJIWNoZWNrX2VuZCh0eXBlLCJfZGVmYXVsdCIpIHx8CisJCQkJCSAhY2hlY2tfZW5kKHR5cGUsIl92YWx1ZSIpKSBjb250aW51ZTsKKwkJCS8qIFNraXAgcGFzdCBhbnkgbGVhZGluZyBYLiBYOiBYLCBldGMgdG8gYWxsb3cgZm9yCisJCQkgKiBtdWx0aXBsZSBpbnN0YW5jZXMgCisJCQkgKi8KKwkJCWZvcihwID0gdi0+bmFtZTsgKnAgOyBwKyspIAorCQkJCWlmICgoKnAgPT0gJzonKSB8fCAoKnAgPT0gJywnKSB8fAorCQkJCQkJCSAoKnAgPT0gJy4nKSkgeworCQkJCQlwKys7CisJCQkJCWlmKCpwKSB0eXBlID0gcDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJaWYgKCp0eXBlID09ICcrJykKKwkJCQl7CisJCQkJbXZhbCA9IC0xOworCQkJCXR5cGUrKzsKKwkJCQl9CisJCQllbHNlCisJCQkJbXZhbCA9IDA7CisJCQkvKiBJZiBPQkogbm90IHJlY29nbmlzZWQgaWdub3JlIGl0ICovCisJCQlpZiAoKG5pZD1PQkpfdHh0Mm5pZCh0eXBlKSkgPT0gTklEX3VuZGVmKSBnb3RvIHN0YXJ0OworCQkJaWYgKEJJT19zbnByaW50ZihidWYsc2l6ZW9mIGJ1ZiwiJXNfZGVmYXVsdCIsdi0+bmFtZSkKKwkJCQk+PSAoaW50KXNpemVvZihidWYpKQorCQkJICAgeworCQkJICAgQklPX3ByaW50ZihiaW9fZXJyLCJOYW1lICclcycgdG9vIGxvbmdcbiIsdi0+bmFtZSk7CisJCQkgICByZXR1cm4gMDsKKwkJCSAgIH0KKworCQkJaWYgKChkZWY9TkNPTkZfZ2V0X3N0cmluZyhyZXFfY29uZixkbl9zZWN0LGJ1ZikpID09IE5VTEwpCisJCQkJeworCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCWRlZj0iIjsKKwkJCQl9CisJCQkJCisJCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsIiVzX3ZhbHVlIix2LT5uYW1lKTsKKwkJCWlmICgodmFsdWU9TkNPTkZfZ2V0X3N0cmluZyhyZXFfY29uZixkbl9zZWN0LGJ1ZikpID09IE5VTEwpCisJCQkJeworCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCXZhbHVlPU5VTEw7CisJCQkJfQorCisJCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsIiVzX21pbiIsdi0+bmFtZSk7CisJCQlpZiAoIU5DT05GX2dldF9udW1iZXIocmVxX2NvbmYsZG5fc2VjdCxidWYsICZuX21pbikpCisJCQkJeworCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCW5fbWluID0gLTE7CisJCQkJfQorCisJCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsIiVzX21heCIsdi0+bmFtZSk7CisJCQlpZiAoIU5DT05GX2dldF9udW1iZXIocmVxX2NvbmYsZG5fc2VjdCxidWYsICZuX21heCkpCisJCQkJeworCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCW5fbWF4ID0gLTE7CisJCQkJfQorCisJCQlpZiAoIWFkZF9ETl9vYmplY3Qoc3Viaix2LT52YWx1ZSxkZWYsdmFsdWUsbmlkLAorCQkJCW5fbWluLG5fbWF4LCBjaHR5cGUsIG12YWwpKQorCQkJCXJldHVybiAwOworCQkJfQorCQlpZiAoWDUwOV9OQU1FX2VudHJ5X2NvdW50KHN1YmopID09IDApCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yLCBubyBvYmplY3RzIHNwZWNpZmllZCBpbiBjb25maWcgZmlsZVxuIik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQlpZiAoYXR0cmlicykKKwkJCXsKKwkJCWlmICgoYXR0cl9zayAhPSBOVUxMKSAmJiAoc2tfQ09ORl9WQUxVRV9udW0oYXR0cl9zaykgPiAwKSAmJiAoIWJhdGNoKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJcblBsZWFzZSBlbnRlciB0aGUgZm9sbG93aW5nICdleHRyYScgYXR0cmlidXRlc1xuIik7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ0byBiZSBzZW50IHdpdGggeW91ciBjZXJ0aWZpY2F0ZSByZXF1ZXN0XG4iKTsKKwkJCQl9CisKKwkJCWk9IC0xOworc3RhcnQyOgkJCWZvciAoOzspCisJCQkJeworCQkJCWkrKzsKKwkJCQlpZiAoKGF0dHJfc2sgPT0gTlVMTCkgfHwKKwkJCQkJICAgIChza19DT05GX1ZBTFVFX251bShhdHRyX3NrKSA8PSBpKSkKKwkJCQkJYnJlYWs7CisKKwkJCQl2PXNrX0NPTkZfVkFMVUVfdmFsdWUoYXR0cl9zayxpKTsKKwkJCQl0eXBlPXYtPm5hbWU7CisJCQkJaWYgKChuaWQ9T0JKX3R4dDJuaWQodHlwZSkpID09IE5JRF91bmRlZikKKwkJCQkJZ290byBzdGFydDI7CisKKwkJCQlpZiAoQklPX3NucHJpbnRmKGJ1ZixzaXplb2YgYnVmLCIlc19kZWZhdWx0Iix0eXBlKQorCQkJCQk+PSAoaW50KXNpemVvZihidWYpKQorCQkJCSAgIHsKKwkJCQkgICBCSU9fcHJpbnRmKGJpb19lcnIsIk5hbWUgJyVzJyB0b28gbG9uZ1xuIix2LT5uYW1lKTsKKwkJCQkgICByZXR1cm4gMDsKKwkJCQkgICB9CisKKwkJCQlpZiAoKGRlZj1OQ09ORl9nZXRfc3RyaW5nKHJlcV9jb25mLGF0dHJfc2VjdCxidWYpKQorCQkJCQk9PSBOVUxMKQorCQkJCQl7CisJCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCQlkZWY9IiI7CisJCQkJCX0KKwkJCQkKKwkJCQkKKwkJCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsIiVzX3ZhbHVlIix0eXBlKTsKKwkJCQlpZiAoKHZhbHVlPU5DT05GX2dldF9zdHJpbmcocmVxX2NvbmYsYXR0cl9zZWN0LGJ1ZikpCisJCQkJCT09IE5VTEwpCisJCQkJCXsKKwkJCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQkJCXZhbHVlPU5VTEw7CisJCQkJCX0KKworCQkJCUJJT19zbnByaW50ZihidWYsc2l6ZW9mIGJ1ZiwiJXNfbWluIix0eXBlKTsKKwkJCQlpZiAoIU5DT05GX2dldF9udW1iZXIocmVxX2NvbmYsYXR0cl9zZWN0LGJ1ZiwgJm5fbWluKSkKKwkJCQkJeworCQkJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCQkJbl9taW4gPSAtMTsKKwkJCQkJfQorCisJCQkJQklPX3NucHJpbnRmKGJ1ZixzaXplb2YgYnVmLCIlc19tYXgiLHR5cGUpOworCQkJCWlmICghTkNPTkZfZ2V0X251bWJlcihyZXFfY29uZixhdHRyX3NlY3QsYnVmLCAmbl9tYXgpKQorCQkJCQl7CisJCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCQluX21heCA9IC0xOworCQkJCQl9CisKKwkJCQlpZiAoIWFkZF9hdHRyaWJ1dGVfb2JqZWN0KHJlcSwKKwkJCQkJdi0+dmFsdWUsZGVmLHZhbHVlLG5pZCxuX21pbixuX21heCwgY2h0eXBlKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJZWxzZQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiTm8gdGVtcGxhdGUsIHBsZWFzZSBzZXQgb25lIHVwLlxuIik7CisJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIGludCBhdXRvX2luZm8oWDUwOV9SRVEgKnJlcSwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmRuX3NrLAorCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmF0dHJfc2ssIGludCBhdHRyaWJzLCB1bnNpZ25lZCBsb25nIGNodHlwZSkKKwl7CisJaW50IGk7CisJY2hhciAqcCwqcTsKKwljaGFyICp0eXBlOworCUNPTkZfVkFMVUUgKnY7CisJWDUwOV9OQU1FICpzdWJqOworCisJc3ViaiA9IFg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUocmVxKTsKKworCWZvciAoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShkbl9zayk7IGkrKykKKwkJeworCQlpbnQgbXZhbDsKKwkJdj1za19DT05GX1ZBTFVFX3ZhbHVlKGRuX3NrLGkpOworCQlwPXE9TlVMTDsKKwkJdHlwZT12LT5uYW1lOworCQkvKiBTa2lwIHBhc3QgYW55IGxlYWRpbmcgWC4gWDogWCwgZXRjIHRvIGFsbG93IGZvcgorCQkgKiBtdWx0aXBsZSBpbnN0YW5jZXMgCisJCSAqLworCQlmb3IocCA9IHYtPm5hbWU7ICpwIDsgcCsrKSAKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJCWlmICgoKnAgPT0gJzonKSB8fCAoKnAgPT0gJywnKSB8fCAoKnAgPT0gJy4nKSkgeworI2Vsc2UKKwkJCWlmICgoKnAgPT0gb3NfdG9hc2NpaVsnOiddKSB8fCAoKnAgPT0gb3NfdG9hc2NpaVsnLCddKSB8fCAoKnAgPT0gb3NfdG9hc2NpaVsnLiddKSkgeworI2VuZGlmCisJCQkJcCsrOworCQkJCWlmKCpwKSB0eXBlID0gcDsKKwkJCQlicmVhazsKKwkJCX0KKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJaWYgKCpwID09ICcrJykKKyNlbHNlCisJCWlmICgqcCA9PSBvc190b2FzY2lpWycrJ10pCisjZW5kaWYKKwkJCXsKKwkJCXArKzsKKwkJCW12YWwgPSAtMTsKKwkJCX0KKwkJZWxzZQorCQkJbXZhbCA9IDA7CisJCWlmICghWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQoc3Viaix0eXBlLCBjaHR5cGUsCisJCQkJKHVuc2lnbmVkIGNoYXIgKikgdi0+dmFsdWUsLTEsLTEsbXZhbCkpIHJldHVybiAwOworCisJCX0KKworCQlpZiAoIVg1MDlfTkFNRV9lbnRyeV9jb3VudChzdWJqKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZXJyb3IsIG5vIG9iamVjdHMgc3BlY2lmaWVkIGluIGNvbmZpZyBmaWxlXG4iKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlpZiAoYXR0cmlicykKKwkJCXsKKwkJCWZvciAoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShhdHRyX3NrKTsgaSsrKQorCQkJCXsKKwkJCQl2PXNrX0NPTkZfVkFMVUVfdmFsdWUoYXR0cl9zayxpKTsKKwkJCQlpZighWDUwOV9SRVFfYWRkMV9hdHRyX2J5X3R4dChyZXEsIHYtPm5hbWUsIGNodHlwZSwKKwkJCQkJKHVuc2lnbmVkIGNoYXIgKil2LT52YWx1ZSwgLTEpKSByZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJcmV0dXJuIDE7CisJfQorCisKK3N0YXRpYyBpbnQgYWRkX0ROX29iamVjdChYNTA5X05BTUUgKm4sIGNoYXIgKnRleHQsIGNvbnN0IGNoYXIgKmRlZiwgY2hhciAqdmFsdWUsCisJICAgICBpbnQgbmlkLCBpbnQgbl9taW4sIGludCBuX21heCwgdW5zaWduZWQgbG9uZyBjaHR5cGUsIGludCBtdmFsKQorCXsKKwlpbnQgaSxyZXQ9MDsKKwlNU19TVEFUSUMgY2hhciBidWZbMTAyNF07CitzdGFydDoKKwlpZiAoIWJhdGNoKSBCSU9fcHJpbnRmKGJpb19lcnIsIiVzIFslc106Iix0ZXh0LGRlZik7CisJKHZvaWQpQklPX2ZsdXNoKGJpb19lcnIpOworCWlmKHZhbHVlICE9IE5VTEwpCisJCXsKKwkJQlVGX3N0cmxjcHkoYnVmLHZhbHVlLHNpemVvZiBidWYpOworCQlCVUZfc3RybGNhdChidWYsIlxuIixzaXplb2YgYnVmKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlc1xuIix2YWx1ZSk7CisJCX0KKwllbHNlCisJCXsKKwkJYnVmWzBdPSdcMCc7CisJCWlmICghYmF0Y2gpCisJCQl7CisJCQlpZiAoIWZnZXRzKGJ1ZixzaXplb2YgYnVmLHN0ZGluKSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJYnVmWzBdID0gJ1xuJzsKKwkJCWJ1ZlsxXSA9ICdcMCc7CisJCQl9CisJCX0KKworCWlmIChidWZbMF0gPT0gJ1wwJykgcmV0dXJuKDApOworCWVsc2UgaWYgKGJ1ZlswXSA9PSAnXG4nKQorCQl7CisJCWlmICgoZGVmID09IE5VTEwpIHx8IChkZWZbMF0gPT0gJ1wwJykpCisJCQlyZXR1cm4oMSk7CisJCUJVRl9zdHJsY3B5KGJ1ZixkZWYsc2l6ZW9mIGJ1Zik7CisJCUJVRl9zdHJsY2F0KGJ1ZiwiXG4iLHNpemVvZiBidWYpOworCQl9CisJZWxzZSBpZiAoKGJ1ZlswXSA9PSAnLicpICYmIChidWZbMV0gPT0gJ1xuJykpIHJldHVybigxKTsKKworCWk9c3RybGVuKGJ1Zik7CisJaWYgKGJ1ZltpLTFdICE9ICdcbicpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ3ZWlyZCBpbnB1dCA6LShcbiIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlidWZbLS1pXT0nXDAnOworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJZWJjZGljMmFzY2lpKGJ1ZiwgYnVmLCBpKTsKKyNlbmRpZgorCWlmKCFyZXFfY2hlY2tfbGVuKGksIG5fbWluLCBuX21heCkpIGdvdG8gc3RhcnQ7CisJaWYgKCFYNTA5X05BTUVfYWRkX2VudHJ5X2J5X05JRChuLG5pZCwgY2h0eXBlLAorCQkJCSh1bnNpZ25lZCBjaGFyICopIGJ1ZiwgLTEsLTEsbXZhbCkpIGdvdG8gZXJyOworCXJldD0xOworZXJyOgorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBhZGRfYXR0cmlidXRlX29iamVjdChYNTA5X1JFUSAqcmVxLCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICpkZWYsCisJCQkJY2hhciAqdmFsdWUsIGludCBuaWQsIGludCBuX21pbiwKKwkJCQlpbnQgbl9tYXgsIHVuc2lnbmVkIGxvbmcgY2h0eXBlKQorCXsKKwlpbnQgaTsKKwlzdGF0aWMgY2hhciBidWZbMTAyNF07CisKK3N0YXJ0OgorCWlmICghYmF0Y2gpIEJJT19wcmludGYoYmlvX2VyciwiJXMgWyVzXToiLHRleHQsZGVmKTsKKwkodm9pZClCSU9fZmx1c2goYmlvX2Vycik7CisJaWYgKHZhbHVlICE9IE5VTEwpCisJCXsKKwkJQlVGX3N0cmxjcHkoYnVmLHZhbHVlLHNpemVvZiBidWYpOworCQlCVUZfc3RybGNhdChidWYsIlxuIixzaXplb2YgYnVmKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlc1xuIix2YWx1ZSk7CisJCX0KKwllbHNlCisJCXsKKwkJYnVmWzBdPSdcMCc7CisJCWlmICghYmF0Y2gpCisJCQl7CisJCQlpZiAoIWZnZXRzKGJ1ZixzaXplb2YgYnVmLHN0ZGluKSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJYnVmWzBdID0gJ1xuJzsKKwkJCWJ1ZlsxXSA9ICdcMCc7CisJCQl9CisJCX0KKworCWlmIChidWZbMF0gPT0gJ1wwJykgcmV0dXJuKDApOworCWVsc2UgaWYgKGJ1ZlswXSA9PSAnXG4nKQorCQl7CisJCWlmICgoZGVmID09IE5VTEwpIHx8IChkZWZbMF0gPT0gJ1wwJykpCisJCQlyZXR1cm4oMSk7CisJCUJVRl9zdHJsY3B5KGJ1ZixkZWYsc2l6ZW9mIGJ1Zik7CisJCUJVRl9zdHJsY2F0KGJ1ZiwiXG4iLHNpemVvZiBidWYpOworCQl9CisJZWxzZSBpZiAoKGJ1ZlswXSA9PSAnLicpICYmIChidWZbMV0gPT0gJ1xuJykpIHJldHVybigxKTsKKworCWk9c3RybGVuKGJ1Zik7CisJaWYgKGJ1ZltpLTFdICE9ICdcbicpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ3ZWlyZCBpbnB1dCA6LShcbiIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlidWZbLS1pXT0nXDAnOworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJZWJjZGljMmFzY2lpKGJ1ZiwgYnVmLCBpKTsKKyNlbmRpZgorCWlmKCFyZXFfY2hlY2tfbGVuKGksIG5fbWluLCBuX21heCkpIGdvdG8gc3RhcnQ7CisKKwlpZighWDUwOV9SRVFfYWRkMV9hdHRyX2J5X05JRChyZXEsIG5pZCwgY2h0eXBlLAorCQkJCQkodW5zaWduZWQgY2hhciAqKWJ1ZiwgLTEpKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGFkZGluZyBhdHRyaWJ1dGVcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4oMSk7CitlcnI6CisJcmV0dXJuKDApOworCX0KKworc3RhdGljIGludCByZXFfY2hlY2tfbGVuKGludCBsZW4sIGludCBuX21pbiwgaW50IG5fbWF4KQorCXsKKwlpZiAoKG5fbWluID4gMCkgJiYgKGxlbiA8IG5fbWluKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsInN0cmluZyBpcyB0b28gc2hvcnQsIGl0IG5lZWRzIHRvIGJlIGF0IGxlYXN0ICVkIGJ5dGVzIGxvbmdcbiIsbl9taW4pOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoKG5fbWF4ID49IDApICYmIChsZW4gPiBuX21heCkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJzdHJpbmcgaXMgdG9vIGxvbmcsIGl0IG5lZWRzIHRvIGJlIGxlc3MgdGhhbiAgJWQgYnl0ZXMgbG9uZ1xuIixuX21heCk7CisJCXJldHVybigwKTsKKwkJfQorCXJldHVybigxKTsKKwl9CisKKy8qIENoZWNrIGlmIHRoZSBlbmQgb2YgYSBzdHJpbmcgbWF0Y2hlcyAnZW5kJyAqLworc3RhdGljIGludCBjaGVja19lbmQoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICplbmQpCit7CisJaW50IGVsZW4sIHNsZW47CQorCWNvbnN0IGNoYXIgKnRtcDsKKwllbGVuID0gc3RybGVuKGVuZCk7CisJc2xlbiA9IHN0cmxlbihzdHIpOworCWlmKGVsZW4gPiBzbGVuKSByZXR1cm4gMTsKKwl0bXAgPSBzdHIgKyBzbGVuIC0gZWxlbjsKKwlyZXR1cm4gc3RyY21wKHRtcCwgZW5kKTsKK30KKworc3RhdGljIEVWUF9QS0VZX0NUWCAqc2V0X2tleWdlbl9jdHgoQklPICplcnIsIGNvbnN0IGNoYXIgKmdzdHIsIGludCAqcGtleV90eXBlLAorCQkJCQlsb25nICpwa2V5bGVuLCBjaGFyICoqcGFsZ25hbSwKKwkJCQkJRU5HSU5FICprZXlnZW5fZW5naW5lKQorCXsKKwlFVlBfUEtFWV9DVFggKmdjdHggPSBOVUxMOworCUVWUF9QS0VZICpwYXJhbSA9IE5VTEw7CisJbG9uZyBrZXlsZW4gPSAtMTsKKwlCSU8gKnBiaW8gPSBOVUxMOworCWNvbnN0IGNoYXIgKnBhcmFtZmlsZSA9IE5VTEw7CisKKwlpZiAoZ3N0ciA9PSBOVUxMKQorCQl7CisJCSpwa2V5X3R5cGUgPSBFVlBfUEtFWV9SU0E7CisJCWtleWxlbiA9ICpwa2V5bGVuOworCQl9CisJZWxzZSBpZiAoZ3N0clswXSA+PSAnMCcgJiYgZ3N0clswXSA8PSAnOScpCisJCXsKKwkJKnBrZXlfdHlwZSA9IEVWUF9QS0VZX1JTQTsKKwkJa2V5bGVuID0gYXRvbChnc3RyKTsKKwkJKnBrZXlsZW4gPSBrZXlsZW47CisJCX0KKwllbHNlIGlmICghc3RybmNtcChnc3RyLCAicGFyYW06IiwgNikpCisJCXBhcmFtZmlsZSA9IGdzdHIgKyA2OworCWVsc2UKKwkJeworCQljb25zdCBjaGFyICpwID0gc3RyY2hyKGdzdHIsICc6Jyk7CisJCWludCBsZW47CisJCUVOR0lORSAqdG1wZW5nOworCQljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisKKwkJaWYgKHApCisJCQlsZW4gPSBwIC0gZ3N0cjsKKwkJZWxzZQorCQkJbGVuID0gc3RybGVuKGdzdHIpOworCQkvKiBUaGUgbG9va3VwIG9mIGEgdGhlIHN0cmluZyB3aWxsIGNvdmVyIGFsbCBlbmdpbmVzIHNvCisJCSAqIGtlZXAgYSBub3RlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbi4KKwkJICovCisKKwkJYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmRfc3RyKCZ0bXBlbmcsIGdzdHIsIGxlbik7CisKKwkJaWYgKCFhbWV0aCkKKwkJCXsKKwkJCUJJT19wcmludGYoZXJyLCAiVW5rbm93biBhbGdvcml0aG0gJS4qc1xuIiwgbGVuLCBnc3RyKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCisJCUVWUF9QS0VZX2FzbjFfZ2V0MF9pbmZvKE5VTEwsIHBrZXlfdHlwZSwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJCQkJCWFtZXRoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJaWYgKHRtcGVuZykKKwkJCUVOR0lORV9maW5pc2godG1wZW5nKTsKKyNlbmRpZgorCQlpZiAoKnBrZXlfdHlwZSA9PSBFVlBfUEtFWV9SU0EpCisJCQl7CisJCQlpZiAocCkKKwkJCQl7CisJCQkJa2V5bGVuID0gYXRvbChwICsgMSk7CisJCQkJKnBrZXlsZW4gPSBrZXlsZW47CisJCQkJfQorCQkJfQorCQllbHNlIGlmIChwKQorCQkJcGFyYW1maWxlID0gcCArIDE7CisJCX0KKworCWlmIChwYXJhbWZpbGUpCisJCXsKKwkJcGJpbyA9IEJJT19uZXdfZmlsZShwYXJhbWZpbGUsICJyIik7CisJCWlmICghcGJpbykKKwkJCXsKKwkJCUJJT19wcmludGYoZXJyLCAiQ2FuJ3Qgb3BlbiBwYXJhbWV0ZXIgZmlsZSAlc1xuIiwKKwkJCQkJcGFyYW1maWxlKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQlwYXJhbSA9IFBFTV9yZWFkX2Jpb19QYXJhbWV0ZXJzKHBiaW8sIE5VTEwpOworCisJCWlmICghcGFyYW0pCisJCQl7CisJCQlYNTA5ICp4OworCQkJKHZvaWQpQklPX3Jlc2V0KHBiaW8pOworCQkJeCA9IFBFTV9yZWFkX2Jpb19YNTA5KHBiaW8sIE5VTEwsIE5VTEwsIE5VTEwpOworCQkJaWYgKHgpCisJCQkJeworCQkJCXBhcmFtID0gWDUwOV9nZXRfcHVia2V5KHgpOworCQkJCVg1MDlfZnJlZSh4KTsKKwkJCQl9CisJCQl9CisKKwkJQklPX2ZyZWUocGJpbyk7CisKKwkJaWYgKCFwYXJhbSkKKwkJCXsKKwkJCUJJT19wcmludGYoZXJyLCAiRXJyb3IgcmVhZGluZyBwYXJhbWV0ZXIgZmlsZSAlc1xuIiwKKwkJCQkJcGFyYW1maWxlKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQlpZiAoKnBrZXlfdHlwZSA9PSAtMSkKKwkJCSpwa2V5X3R5cGUgPSBFVlBfUEtFWV9pZChwYXJhbSk7CisJCWVsc2UgaWYgKCpwa2V5X3R5cGUgIT0gRVZQX1BLRVlfYmFzZV9pZChwYXJhbSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGVyciwgIktleSBUeXBlIGRvZXMgbm90IG1hdGNoIHBhcmFtZXRlcnNcbiIpOworCQkJRVZQX1BLRVlfZnJlZShwYXJhbSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJaWYgKHBhbGduYW0pCisJCXsKKwkJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCQlFTkdJTkUgKnRtcGVuZzsKKwkJY29uc3QgY2hhciAqYW5hbTsKKwkJYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmQoJnRtcGVuZywgKnBrZXlfdHlwZSk7CisJCWlmICghYW1ldGgpCisJCQl7CisJCQlCSU9fcHV0cyhlcnIsICJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgZmluZCBrZXkgYWxnb3JpdGhtXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQlFVlBfUEtFWV9hc24xX2dldDBfaW5mbyhOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmYW5hbSwgYW1ldGgpOworCQkqcGFsZ25hbSA9IEJVRl9zdHJkdXAoYW5hbSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWlmICh0bXBlbmcpCisJCQlFTkdJTkVfZmluaXNoKHRtcGVuZyk7CisjZW5kaWYKKwkJfQorCisJaWYgKHBhcmFtKQorCQl7CisJCWdjdHggPSBFVlBfUEtFWV9DVFhfbmV3KHBhcmFtLCBrZXlnZW5fZW5naW5lKTsKKwkJKnBrZXlsZW4gPSBFVlBfUEtFWV9iaXRzKHBhcmFtKTsKKwkJRVZQX1BLRVlfZnJlZShwYXJhbSk7CisJCX0KKwllbHNlCisJCWdjdHggPSBFVlBfUEtFWV9DVFhfbmV3X2lkKCpwa2V5X3R5cGUsIGtleWdlbl9lbmdpbmUpOworCisJaWYgKCFnY3R4KQorCQl7CisJCUJJT19wdXRzKGVyciwgIkVycm9yIGFsbG9jYXRpbmcga2V5Z2VuIGNvbnRleHRcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGVycik7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAoRVZQX1BLRVlfa2V5Z2VuX2luaXQoZ2N0eCkgPD0gMCkKKwkJeworCQlCSU9fcHV0cyhlcnIsICJFcnJvciBpbml0aWFsaXppbmcga2V5Z2VuIGNvbnRleHRcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGVycik7CisJCXJldHVybiBOVUxMOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJaWYgKCgqcGtleV90eXBlID09IEVWUF9QS0VZX1JTQSkgJiYgKGtleWxlbiAhPSAtMSkpCisJCXsKKwkJaWYgKEVWUF9QS0VZX0NUWF9zZXRfcnNhX2tleWdlbl9iaXRzKGdjdHgsIGtleWxlbikgPD0gMCkKKwkJCXsKKwkJCUJJT19wdXRzKGVyciwgIkVycm9yIHNldHRpbmcgUlNBIGtleXNpemVcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhlcnIpOworCQkJRVZQX1BLRVlfQ1RYX2ZyZWUoZ2N0eCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwlyZXR1cm4gZ2N0eDsKKwl9CisKK3N0YXRpYyBpbnQgZ2VucGtleV9jYihFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJY2hhciBjPScqJzsKKwlCSU8gKmIgPSBFVlBfUEtFWV9DVFhfZ2V0X2FwcF9kYXRhKGN0eCk7CisJaW50IHA7CisJcCA9IEVWUF9QS0VZX0NUWF9nZXRfa2V5Z2VuX2luZm8oY3R4LCAwKTsKKwlpZiAocCA9PSAwKSBjPScuJzsKKwlpZiAocCA9PSAxKSBjPScrJzsKKwlpZiAocCA9PSAyKSBjPScqJzsKKwlpZiAocCA9PSAzKSBjPSdcbic7CisJQklPX3dyaXRlKGIsJmMsMSk7CisJKHZvaWQpQklPX2ZsdXNoKGIpOworI2lmZGVmIExJTlQKKwlwPW47CisjZW5kaWYKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3JlcS5wZW0gYi9saWIvb3BlbnNzbC9hcHBzL3JlcS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzN2RmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvcmVxLnBlbQpAQCAtMCwwICsxLDExIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQorTUlJQmx6Q0NBVmNDQVFBd1hqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xOdmJXVXRVM1JoZEdVeAorSVRBZkJnTlZCQW9UR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaREVYTUJVR0ExVUVBeE1PUlhKcAorWXlCMGFHVWdXVzkxYm1jd2dlOHdnYVlHQlNzT0F3SU1NSUdjQWtFQStaaUtFdlptYzlNdG5hRlpoNE5pWjNvWgorUzRKMVBIdlBybTlNWGo1bnRWaGVEUGtkbUJEVG5jeWFHQUpjTWp3c3lCL0d2TERHZDZ5R0N3LzhlRiswOXdJVgorQUszVmFnT3hHZC9RNEFmNU5ieFI1RkI3Q1hFakFrQTJ0L3E3SGdWTGkwS2VLdmNERzhCUmwzd3V5N2JDdnBqZwordFdpSmMvdHB2Y3V6ZXVBYXlIODlVb2ZqQUd1ZUtqWERBRGlSZmZ2U2Rock53NWRrcWRxbEEwUUFBa0VBdFVTbworODRPZWtqaXRLR1ZqeEx1MEh2WGNrMjlwdStmb2FkNTN2UEtYQXN1SmRBQ2o4OEJQcVo5MVk5UElKZjFHVWgzOAorQ3VpSFdpN3ozY0VEZlpDeUNLQUFNQWtHQlNzT0F3SWJCUUFETHdBd0xBSVVUZzhhbUtWQkU5b3FDNUI3NWREUQorQ2h5M0xkUUNGSEtvZEdFajNManVUemRtL1JUZTJLWkw5VXpmCistLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcnNhLmMgYi9saWIvb3BlbnNzbC9hcHBzL3JzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNzcwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3JzYS5jCkBAIC0wLDAgKzEsNDUwIEBACisvKiBhcHBzL3JzYS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cJcnNhX21haW4KKworLyogLWluZm9ybSBhcmcJLSBpbnB1dCBmb3JtYXQgLSBkZWZhdWx0IFBFTSAob25lIG9mIERFUiwgTkVUIG9yIFBFTSkKKyAqIC1vdXRmb3JtIGFyZyAtIG91dHB1dCBmb3JtYXQgLSBkZWZhdWx0IFBFTQorICogLWluIGFyZwktIGlucHV0IGZpbGUgLSBkZWZhdWx0IHN0ZGluCisgKiAtb3V0IGFyZwktIG91dHB1dCBmaWxlIC0gZGVmYXVsdCBzdGRvdXQKKyAqIC1kZXMJCS0gZW5jcnlwdCBvdXRwdXQgaWYgUEVNIGZvcm1hdCB3aXRoIERFUyBpbiBjYmMgbW9kZQorICogLWRlczMJLSBlbmNyeXB0IG91dHB1dCBpZiBQRU0gZm9ybWF0CisgKiAtaWRlYQktIGVuY3J5cHQgb3V0cHV0IGlmIFBFTSBmb3JtYXQKKyAqIC1zZWVkCS0gZW5jcnlwdCBvdXRwdXQgaWYgUEVNIGZvcm1hdAorICogLWFlczEyOAktIGVuY3J5cHQgb3V0cHV0IGlmIFBFTSBmb3JtYXQKKyAqIC1hZXMxOTIJLSBlbmNyeXB0IG91dHB1dCBpZiBQRU0gZm9ybWF0CisgKiAtYWVzMjU2CS0gZW5jcnlwdCBvdXRwdXQgaWYgUEVNIGZvcm1hdAorICogLWNhbWVsbGlhMTI4IC0gZW5jcnlwdCBvdXRwdXQgaWYgUEVNIGZvcm1hdAorICogLWNhbWVsbGlhMTkyIC0gZW5jcnlwdCBvdXRwdXQgaWYgUEVNIGZvcm1hdAorICogLWNhbWVsbGlhMjU2IC0gZW5jcnlwdCBvdXRwdXQgaWYgUEVNIGZvcm1hdAorICogLXRleHQJLSBwcmludCBhIHRleHQgdmVyc2lvbgorICogLW1vZHVsdXMJLSBwcmludCB0aGUgUlNBIGtleSBtb2R1bHVzCisgKiAtY2hlY2sJLSB2ZXJpZnkga2V5IGNvbnNpc3RlbmN5CisgKiAtcHViaW4JLSBFeHBlY3QgYSBwdWJsaWMga2V5IGluIGlucHV0IGZpbGUuCisgKiAtcHVib3V0CS0gT3V0cHV0IGEgcHVibGljIGtleS4KKyAqLworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCUVOR0lORSAqZSA9IE5VTEw7CisJaW50IHJldD0xOworCVJTQSAqcnNhPU5VTEw7CisJaW50IGksYmFkb3BzPTAsIHNnY2tleT0wOworCWNvbnN0IEVWUF9DSVBIRVIgKmVuYz1OVUxMOworCUJJTyAqb3V0PU5VTEw7CisJaW50IGluZm9ybWF0LG91dGZvcm1hdCx0ZXh0PTAsY2hlY2s9MCxub291dD0wOworCWludCBwdWJpbiA9IDAsIHB1Ym91dCA9IDA7CisJY2hhciAqaW5maWxlLCpvdXRmaWxlLCpwcm9nOworCWNoYXIgKnBhc3NhcmdpbiA9IE5VTEwsICpwYXNzYXJnb3V0ID0gTlVMTDsKKwljaGFyICpwYXNzaW4gPSBOVUxMLCAqcGFzc291dCA9IE5VTEw7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lPU5VTEw7CisjZW5kaWYKKwlpbnQgbW9kdWx1cz0wOworCisJaW50IHB2a19lbmNyID0gMjsKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJaWYgKChiaW9fZXJyPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoYmlvX2VycixzdGRlcnIsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisKKwlpbmZpbGU9TlVMTDsKKwlvdXRmaWxlPU5VTEw7CisJaW5mb3JtYXQ9Rk9STUFUX1BFTTsKKwlvdXRmb3JtYXQ9Rk9STUFUX1BFTTsKKworCXByb2c9YXJndlswXTsKKwlhcmdjLS07CisJYXJndisrOworCXdoaWxlIChhcmdjID49IDEpCisJCXsKKwkJaWYgCShzdHJjbXAoKmFyZ3YsIi1pbmZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5mb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXRmb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWluIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWluZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wYXNzaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZ2luPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBhc3NvdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJcGFzc2FyZ291dD0gKigrK2FyZ3YpOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1lbmdpbmUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZW5naW5lPSAqKCsrYXJndik7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItc2dja2V5IikgPT0gMCkKKwkJCXNnY2tleT0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wdWJpbiIpID09IDApCisJCQlwdWJpbj0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wdWJvdXQiKSA9PSAwKQorCQkJcHVib3V0PTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLVJTQVB1YmxpY0tleV9pbiIpID09IDApCisJCQlwdWJpbiA9IDI7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLVJTQVB1YmxpY0tleV9vdXQiKSA9PSAwKQorCQkJcHVib3V0ID0gMjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHZrLXN0cm9uZyIpID09IDApCisJCQlwdmtfZW5jcj0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wdmstd2VhayIpID09IDApCisJCQlwdmtfZW5jcj0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wdmstbm9uZSIpID09IDApCisJCQlwdmtfZW5jcj0wOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub291dCIpID09IDApCisJCQlub291dD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi10ZXh0IikgPT0gMCkKKwkJCXRleHQ9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbW9kdWx1cyIpID09IDApCisJCQltb2R1bHVzPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNoZWNrIikgPT0gMCkKKwkJCWNoZWNrPTE7CisJCWVsc2UgaWYgKChlbmM9RVZQX2dldF9jaXBoZXJieW5hbWUoJihhcmd2WzBdWzFdKSkpID09IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVua25vd24gb3B0aW9uICVzXG4iLCphcmd2KTsKKwkJCWJhZG9wcz0xOworCQkJYnJlYWs7CisJCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQl9CisKKwlpZiAoYmFkb3BzKQorCQl7CitiYWQ6CisJCUJJT19wcmludGYoYmlvX2VyciwiJXMgW29wdGlvbnNdIDxpbmZpbGUgPm91dGZpbGVcbiIscHJvZyk7CisJCUJJT19wcmludGYoYmlvX2Vyciwid2hlcmUgb3B0aW9ucyBhcmVcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaW5mb3JtIGFyZyAgICAgaW5wdXQgZm9ybWF0IC0gb25lIG9mIERFUiBORVQgUEVNXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dGZvcm0gYXJnICAgIG91dHB1dCBmb3JtYXQgLSBvbmUgb2YgREVSIE5FVCBQRU1cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaW4gYXJnICAgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1zZ2NrZXkgICAgICAgICBVc2UgSUlTIFNHQyBrZXkgZm9ybWF0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXBhc3NpbiBhcmcgICAgIGlucHV0IGZpbGUgcGFzcyBwaHJhc2Ugc291cmNlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW91dCBhcmcgICAgICAgIG91dHB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXBhc3NvdXQgYXJnICAgIG91dHB1dCBmaWxlIHBhc3MgcGhyYXNlIHNvdXJjZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1kZXMgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgZGVzXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWRlczMgICAgICAgICAgIGVuY3J5cHQgUEVNIG91dHB1dCB3aXRoIGVkZSBjYmMgZGVzIHVzaW5nIDE2OCBiaXQga2V5XG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1pZGVhICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgaWRlYVxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisJCUJJT19wcmludGYoYmlvX2VyciwiIC1zZWVkICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgc2VlZFxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWFlczEyOCwgLWFlczE5MiwgLWFlczI1NlxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgYWVzXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJCUJJT19wcmludGYoYmlvX2VyciwiIC1jYW1lbGxpYTEyOCwgLWNhbWVsbGlhMTkyLCAtY2FtZWxsaWEyNTZcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgZW5jcnlwdCBQRU0gb3V0cHV0IHdpdGggY2JjIGNhbWVsbGlhXG4iKTsKKyNlbmRpZgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtdGV4dCAgICAgICAgICAgcHJpbnQgdGhlIGtleSBpbiB0ZXh0XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vb3V0ICAgICAgICAgIGRvbid0IHByaW50IGtleSBvdXRcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbW9kdWx1cyAgICAgICAgcHJpbnQgdGhlIFJTQSBrZXkgbW9kdWx1c1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1jaGVjayAgICAgICAgICB2ZXJpZnkga2V5IGNvbnNpc3RlbmN5XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXB1YmluICAgICAgICAgIGV4cGVjdCBhIHB1YmxpYyBrZXkgaW4gaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1wdWJvdXQgICAgICAgICBvdXRwdXQgYSBwdWJsaWMga2V5XG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWVuZ2luZSBlICAgICAgIHVzZSBlbmdpbmUgZSwgcG9zc2libHkgYSBoYXJkd2FyZSBkZXZpY2UuXG4iKTsKKyNlbmRpZgorCQlnb3RvIGVuZDsKKwkJfQorCisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmdpbiwgcGFzc2FyZ291dCwgJnBhc3NpbiwgJnBhc3NvdXQpKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgcGFzc3dvcmRzXG4iKTsKKwkJZ290byBlbmQ7CisJfQorCisJaWYoY2hlY2sgJiYgcHViaW4pIHsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiT25seSBwcml2YXRlIGtleXMgY2FuIGJlIGNoZWNrZWRcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpOworCisJeworCQlFVlBfUEtFWQkqcGtleTsKKworCQlpZiAocHViaW4pCisJCQl7CisJCQlpbnQgdG1wZm9ybWF0PS0xOworCQkJaWYgKHB1YmluID09IDIpCisJCQkJeworCQkJCWlmIChpbmZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQkJCQl0bXBmb3JtYXQgPSBGT1JNQVRfUEVNUlNBOworCQkJCWVsc2UgaWYgKGluZm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJCQl0bXBmb3JtYXQgPSBGT1JNQVRfQVNOMVJTQTsKKwkJCQl9CisJCQllbHNlIGlmIChpbmZvcm1hdCA9PSBGT1JNQVRfTkVUU0NBUEUgJiYgc2dja2V5KQorCQkJCXRtcGZvcm1hdCA9IEZPUk1BVF9JSVNTR0M7CisJCQllbHNlCisJCQkJdG1wZm9ybWF0ID0gaW5mb3JtYXQ7CisJCQkJCQorCQkJcGtleSA9IGxvYWRfcHVia2V5KGJpb19lcnIsIGluZmlsZSwgdG1wZm9ybWF0LCAxLAorCQkJCXBhc3NpbiwgZSwgIlB1YmxpYyBLZXkiKTsKKwkJCX0KKwkJZWxzZQorCQkJcGtleSA9IGxvYWRfa2V5KGJpb19lcnIsIGluZmlsZSwKKwkJCQkoaW5mb3JtYXQgPT0gRk9STUFUX05FVFNDQVBFICYmIHNnY2tleSA/CisJCQkJCUZPUk1BVF9JSVNTR0MgOiBpbmZvcm1hdCksIDEsCisJCQkJcGFzc2luLCBlLCAiUHJpdmF0ZSBLZXkiKTsKKworCQlpZiAocGtleSAhPSBOVUxMKQorCQkJcnNhID0gRVZQX1BLRVlfZ2V0MV9SU0EocGtleSk7CisJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJfQorCisJaWYgKHJzYSA9PSBOVUxMKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAob3V0ZmlsZSA9PSBOVUxMKQorCQl7CisJCUJJT19zZXRfZnAob3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCW91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJfQorI2VuZGlmCisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEJJT193cml0ZV9maWxlbmFtZShvdXQsb3V0ZmlsZSkgPD0gMCkKKwkJCXsKKwkJCXBlcnJvcihvdXRmaWxlKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAodGV4dCkgCisJCWlmICghUlNBX3ByaW50KG91dCxyc2EsMCkpCisJCQl7CisJCQlwZXJyb3Iob3V0ZmlsZSk7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwlpZiAobW9kdWx1cykKKwkJeworCQlCSU9fcHJpbnRmKG91dCwiTW9kdWx1cz0iKTsKKwkJQk5fcHJpbnQob3V0LHJzYS0+bik7CisJCUJJT19wcmludGYob3V0LCJcbiIpOworCQl9CisKKwlpZiAoY2hlY2spCisJCXsKKwkJaW50IHIgPSBSU0FfY2hlY2tfa2V5KHJzYSk7CisKKwkJaWYgKHIgPT0gMSkKKwkJCUJJT19wcmludGYob3V0LCJSU0Ega2V5IG9rXG4iKTsKKwkJZWxzZSBpZiAociA9PSAwKQorCQkJeworCQkJdW5zaWduZWQgbG9uZyBlcnI7CisKKwkJCXdoaWxlICgoZXJyID0gRVJSX3BlZWtfZXJyb3IoKSkgIT0gMCAmJgorCQkJCUVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9SU0EgJiYKKwkJCQlFUlJfR0VUX0ZVTkMoZXJyKSA9PSBSU0FfRl9SU0FfQ0hFQ0tfS0VZICYmCisJCQkJRVJSX0dFVF9SRUFTT04oZXJyKSAhPSBFUlJfUl9NQUxMT0NfRkFJTFVSRSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihvdXQsICJSU0Ega2V5IGVycm9yOiAlc1xuIiwgRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZXJyKSk7CisJCQkJRVJSX2dldF9lcnJvcigpOyAvKiByZW1vdmUgZSBmcm9tIGVycm9yIHN0YWNrICovCisJCQkJfQorCQkJfQorCQkKKwkJaWYgKHIgPT0gLTEgfHwgRVJSX3BlZWtfZXJyb3IoKSAhPSAwKSAvKiBzaG91bGQgaGFwcGVuIG9ubHkgaWYgciA9PSAtMSAqLworCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJCQorCWlmIChub291dCkKKwkJeworCQlyZXQgPSAwOworCQlnb3RvIGVuZDsKKwkJfQorCUJJT19wcmludGYoYmlvX2Vyciwid3JpdGluZyBSU0Ega2V5XG4iKTsKKwlpZiAJKG91dGZvcm1hdCA9PSBGT1JNQVRfQVNOMSkgeworCQlpZihwdWJvdXQgfHwgcHViaW4pIAorCQkJeworCQkJaWYgKHB1Ym91dCA9PSAyKQorCQkJCWk9aTJkX1JTQVB1YmxpY0tleV9iaW8ob3V0LHJzYSk7CisJCQllbHNlCisJCQkJaT1pMmRfUlNBX1BVQktFWV9iaW8ob3V0LHJzYSk7CisJCQl9CisJCWVsc2UgaT1pMmRfUlNBUHJpdmF0ZUtleV9iaW8ob3V0LHJzYSk7CisJfQorI2lmbmRlZiBPUEVOU1NMX05PX1JDNAorCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfTkVUU0NBUEUpCisJCXsKKwkJdW5zaWduZWQgY2hhciAqcCwqcHA7CisJCWludCBzaXplOworCisJCWk9MTsKKwkJc2l6ZT1pMmRfUlNBX05FVChyc2EsTlVMTCxOVUxMLCBzZ2NrZXkpOworCQlpZiAoKHA9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhzaXplKSkgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJcHA9cDsKKwkJaTJkX1JTQV9ORVQocnNhLCZwLE5VTEwsIHNnY2tleSk7CisJCUJJT193cml0ZShvdXQsKGNoYXIgKilwcCxzaXplKTsKKwkJT1BFTlNTTF9mcmVlKHBwKTsKKwkJfQorI2VuZGlmCisJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pIHsKKwkJaWYocHVib3V0IHx8IHB1YmluKQorCQkJeworCQkJaWYgKHB1Ym91dCA9PSAyKQorCQkgICAgCQlpPVBFTV93cml0ZV9iaW9fUlNBUHVibGljS2V5KG91dCxyc2EpOworCQkJZWxzZQorCQkgICAgCQlpPVBFTV93cml0ZV9iaW9fUlNBX1BVQktFWShvdXQscnNhKTsKKwkJCX0KKwkJZWxzZSBpPVBFTV93cml0ZV9iaW9fUlNBUHJpdmF0ZUtleShvdXQscnNhLAorCQkJCQkJZW5jLE5VTEwsMCxOVUxMLHBhc3NvdXQpOworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fRFNBKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1JDNCkKKwl9IGVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfTVNCTE9CIHx8IG91dGZvcm1hdCA9PSBGT1JNQVRfUFZLKSB7CisJCUVWUF9QS0VZICpwazsKKwkJcGsgPSBFVlBfUEtFWV9uZXcoKTsKKwkJRVZQX1BLRVlfc2V0MV9SU0EocGssIHJzYSk7CisJCWlmIChvdXRmb3JtYXQgPT0gRk9STUFUX1BWSykKKwkJCWkgPSBpMmJfUFZLX2JpbyhvdXQsIHBrLCBwdmtfZW5jciwgMCwgcGFzc291dCk7CisJCWVsc2UgaWYgKHB1YmluIHx8IHB1Ym91dCkKKwkJCWkgPSBpMmJfUHVibGljS2V5X2JpbyhvdXQsIHBrKTsKKwkJZWxzZQorCQkJaSA9IGkyYl9Qcml2YXRlS2V5X2JpbyhvdXQsIHBrKTsKKwkJRVZQX1BLRVlfZnJlZShwayk7CisjZW5kaWYKKwl9IGVsc2UJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBvdXRwdXQgZm9ybWF0IHNwZWNpZmllZCBmb3Igb3V0ZmlsZVxuIik7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKGkgPD0gMCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsInVuYWJsZSB0byB3cml0ZSBrZXlcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQl9CisJZWxzZQorCQlyZXQ9MDsKK2VuZDoKKwlpZihvdXQgIT0gTlVMTCkgQklPX2ZyZWVfYWxsKG91dCk7CisJaWYocnNhICE9IE5VTEwpIFJTQV9mcmVlKHJzYSk7CisJaWYocGFzc2luKSBPUEVOU1NMX2ZyZWUocGFzc2luKTsKKwlpZihwYXNzb3V0KSBPUEVOU1NMX2ZyZWUocGFzc291dCk7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKyNlbHNlIC8qICFPUEVOU1NMX05PX1JTQSAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvcnNhODE5Mi5wZW0gYi9saWIvb3BlbnNzbC9hcHBzL3JzYTgxOTIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NmE2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3JzYTgxOTIucGVtCkBAIC0wLDAgKzEsMTAxIEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCisKK01JSVNLQUlCQUFLQ0JBRUFpUTJmMVg2QnRlMURLRDBPb0NCS0Vpa3pQVys1dzNvWGszV3duRTk3V3h6eTZ3SloKK2ViYlpDM0NaS0tCbkplQk1yeXNQZitsSys5K2ZQNlZtOGJwMXd2YmNTSUE1OUJEclg2aXJGU3VNL2JkbmtidUYKK01GbERqdCt1VnJ4d295cWZQaTJJUG90MUhRZzNsNW1keUJxY1RXdmJPblUyTDlIWnhKZlBVQ2pmemRUTVByTVkKKzU1L0EyMFhMN3RsVjJvcEVmd2h5M3VWbHZlUUJNMERuWjNNVVFmcmsrbFJSTld2N3lFNFNjYk9mRVI5Zmp2T20KK3lKYzNaYk9hM2UrQU1HR1U5T3FKL2Z5T2wwU0dZeVAyazIzb215L2lkQlY0dU9zOFFXZG5BdnE4VU96RGR1YTMKK3R1ZjVUbjE3WEJ1clBKOGp1d3lQQk5pc3Brd3duOEJqeEFaVlBod1VJY3hGQmczMzlJeEo5Y1cwV2RWeTRuTkEKK0xXby84QWhsZitrWk5uRk5HQ1BGeXRVOWdHTUxNaGFiOXcvckxyd2E5cU5lNEw4Rm11MUp4T05uMVdmaE1PS0UKK2FGbXljZjJvbEpzWUxnVUlHWVpyam5ZdTBwLzdQM3loVE92OEpJaG1LK1N6bUEvSTB4aVFvRjg0cnBhUXpIMmQKK1B2eElDT0E5b1FTb3dvdTBnTHVCU1pXbTZMaVhpcmcxRFpDemlVNDZ2MzNFclFsV00xZFN5TmFVU3ppaGNWNTkKK21WRDBubXpib1hINzVsR2l5aVpscDhjTGJvenpvQ3d2azlyWXFwVUdTQnpiQXkwRUNDcGFiR3B6TzJVZytvRGkKKzcxZTV6NFdNcGVvUjRJUzhNYU9HL0dzSm53YVhoaUIvZ05ZZksrOHBSQURWazVTdEVBWkRFMmFsU3VDYkRzMHoKK2Q5ellyNC9lbTVUOVZac0xldHhSRTdwbS9Fczl5RUx1Vml6OC9UbTAvOE1WZG1OWWMveFpVMXQ2cVlZRmR5UTIKK3dsR0RUaU5Qc2pSOHlYQ2ttQmpLd3FudWxldTFYNkxhWnUzVlBoRWtYR2N5RkFxdVFVa1NpTXYwWXU3NHFBZTAKK2JRMnYrampaelA2QU05TFVvODljVzRLZDhTR0Q5NkJkTmxBVlBOTVhvQmNJT3NaQndzT3RFVEJkNEtBeXZrWEUKK09iMTd1K1BMbDRVUG5TeG05eXBLWnVuVU5GUlB4dEtVeWp5U1ludmxHTCtrVGpBWHJJclp3S0pxSW4wdWhuZmEKK0NrM283YlU2eVZNSzIyT0R4eTIvVmkzRTBQNms1Skx3bnJGMFZJT0JxR2h0czY2cW82bVdEUDhsNk1aSEFSRmQKK3BVK25vZnNzVm1yOHRMS21NbWpZR01NNUdtS0lYUk5CczBrc1R3Rm5LUnM5QW1wRTVvd0M4dFRTVmRUQWtHdVMKK29zN1F3THZ5dk56cTdCR0ppVnIwSXkzRGhzbDF2elIzNWFjTk9yQ3NEbDNEY0NRT05LSjJzVlhWNHBEM2RCYWgKK21HM3NSL2pIZ2phc2ZmSkozNXVpR29BdWE5ZGJUN0hHLytEMHoxU0hZYVZxSDh6TzRWWlNPbkdKaC9QOXJ0eHgKK2Nja0ZEYmlhZy9KTVdpZzJsYm5DamViVHRwL0JjVXNLM1ROYURPYjd2YjBMdmJBZVJKYWRkMUVGdTZQU2xIM0sKK0x5a1NVUG00VWVkdlVVM2NXanFrU1k1bElURkprVmFJWU92L0Vsall0SzdwN2tGWkZUYUV3TUFXeGdzWFUzcFEKK3RUelZtcTFnWjR2WFB3Y1VxMHpLNTBGcnEwRjdTUWMyMVpzdW53SURBUUFCQW9JRUFEdVFBa0RFcEJhdXNKc1MKK1BnTDFSWHV6RUNQSkpKQ0J4VEUrMnF4MEZvWTRoSklDQ1dUT1JIR21VOG5HUEUzSHQwd0JpTkRzVUx3NktYbDkKK3BzbXpZVzZEM3FSYnBkUWVia3k2ZnUvS1o1SDBYVHlHcEpHb21hWEVMSDVoa3dvMmdkS0I4MDVMU1hCK203cDAKKzlvOTZrU2RNa3BCTFZHdGY1aVo4VzRyWTJMc1ptbEk5Zjd0YVFIU0xWdC9NOEhUejFtVG5CUlU5MlFPM3paVzYKK3hWYStPcldhRmwxOHUzWmVJYVNoMlg0MHRCSzY4Y3FzdFhWRDByMk9XdVhOS29iY1FlSlc4L1hBQnpCU2haMGMKK2loTDBsenlxaU40dVhyTHUrTmJyMjJiK0ZVMk9PRHk2ZEdrM1U2LzY5TnZJNHBpTUNQbEhzZmhIT25GamQxWlcKK1JJVnl3eVVsQ3RMTmRjbjExQ2NodVJybyswSjNjMkJhK2k5Q2w5cjNxelQxMXhGRUdGOC9YTHlVQkJDQit1R2YKKzFkUi94SlFoQ0E3Y1hXV0xYeUkvc2VteGN2VGFHcEltUDZraUlsMU1BakhqWFpUU2R2eXc0Sm1mWHlZR2hTakkKK1AwbXczWG43Rlh4Si9vczlnT2ZOS3oyblpIanIwcTRzZ1dSWU8rNHZsbGtlTDBHdGVacmc0b1ZhVnBtWmI3TEgKKzc3YWZob2RMeWxoaWpsRXRWNXNrZmtQdWpiQkxRazZFNUV6M1UvaHVFdDJOTGc2Z3VBRG13eE14ZkJSbGlaTzQKKzRFeC90ZDRjdWdncEVqM0ZHSlY3NHFSdmR2ai9NRi91RjdJeEMvM1dhcFBJc0ZCRkg0enJKc1VZdDZ1M0w2OEkKKy9LQy9iZmlvRGVVUi84QU53MUROaCtVc25QVjNHSkl3RGtJSktkcHBpMnVYUGFoSnlKUVE4SW5wczUzbm44R2cKK0dpZlMrSG5PWE5nTW9LT0puWjlJREdqWHBmaklzOGRKTnJHZkRIRjBtSDMwTjJXQVJxMnYvYTNjTlVDK2Y4QnEKK0hTS1E5WXJab3BrdE11bnN1dDh1N1pZYlRtaklxSnBYQ2FNMENDclNselNNVERIRlNqMnR6TGs2K3FueGVHeEIKK1p3SWRTaGJkZUsrMEVURzkxbEUxZTlSUFFzL3VYUVA5K3VDSEpWMFlwcVFjQTZwa0NMWUpmWXBvU011L0JhZnkKK0FnZlZaejZsNXR5RW5WMHdDY2JvcHNRU2hjMWs5eHRUYllORjFoOUFRSGtuajZ6ZURXNGlaTXZtVmVoM1JvdlQKKzUyT0EyUjhvTHlhdUYrUWFHNngyd1VqRXgxM1NKbGFCYXJKWjRzZVpJT0orYTgrb056S3NiZ29rWGMyY3lDOXAKKzVGQVp6MU9zT2I2OG85M3FEMVh2bDdiWTk3ZnEycTU1TDdHMVhIUFBMdFpFNWxHaUxHRHRuQXV3WThVUHJkcHIKKzdNdjJ5SXhCN3hWR3VyWHlIYjVQdnVzUjg4WEVENkhNUGZMQkcvNTVFTkhUYWw3RzVtUml4K0lXU0JBSWt4QTUKK0taMGo4cjVOZzQrd0VMWmhxRlFhaTM5Nzk5YklBeWlWNkNFejRreURYbG8wa1NTZXhwOG80aXo1c1BxNXZwNmgKK2NDYjdyZFJ3N3VSbmJYckhtWGFoeG9CK2liWGF1cmdWLzZCMnl1cnJVL1VGb3hFcDJzSHA4TFhaR2ZGNnp0WTEKK2RNaFNRQUFDSzJ2R3k1eU5hZ2JrVEhMZ1ZhSGljRzV6YXZKQnF6Q0UrbGJQbENxaE9VUVBkT0l3dmpITmpkUy8KK0RMM1dWL0VDZ2dJQkFNYlc2NXdQay9pNDNuU3llWmVZd2NIdFIxU1VKcURYYXZZZkJQQzBWUmhLeis3RFZNRncKK053bm9jbjZnSVRBQmM0NDVXMXlsN1UzdXd3K0xHdURsU2xGbmQ4V3VpWHBWWXVkOS9qZU51Nk11NHd2TnNuV3IKK2Y0ZjR1YThDY1MwM0dtcW1jYlJPRDJaNmJ5MUFibENaMlVMMWt2OWNVWDFGTFZqUFAxRVNBR0tvZVB0M0JtWlEKK0oxdUpmSzhIaWxOVDhkY1Vsai81Q0JpMnVIeHR0RGhvRzBzeFhFL1NWc0c5T0QvUGptZTBtajdnZHpjNlp0ZCsKK1RBTHV2cE5RUjRwUnpmbzVYV0RaQmNFWW50Y0VFM1B4WUpCMSt2blo4NTA5ZXc1L3lMSFRiTGpGeEljeDcxelkKK2ZoSDBnTTM2U3o3bXozN3IwK0UvUWtSa2M1YlZJREM0TERuV21qcEFkZTZRVXgwZDIxOFNoTng2c0pvNGt0NWMKK0RkN3RFVng4bnVYOEFJWllnd3NPYjM4MmFuTHlGUmtrbUVkSzNnUnZ3UTZTV1IzNkV6NUw3L21IV09EcExBWDUKK21WQktTRzQvY2NGYmM2MzMvZzB4SHcwTndhamlyL2tsY2tkYWt1WVBsd0YweUF4SlNLRExobU5jdERoUm14akMKK1lQK2ZJU2tsNW9UdkZSekpINkhFeU51OE0zeWJSdm1wUElqTTVKNUpwbkIySVlib2hZQlIrVDYvOTdDMURLcmQKK216TDVQamxyV20wYzEvZDdMbERvUDY1Zk9TaERNbWoyekNpQkFISE9NMEFsb2t4K3Y1TG1NZDhOSnVtWkl3R0oKK1J0NU9wZU1PaG93ejZqMUFqWXhZZ1Y3UG1KTDZPdnBmYjc3NW9kL2FMYVViYndIejJ1V0l2ZkY3QW9JQ0FRQ3cKK2M3TmFPN29KVkxKQ2xoWXc2T0N2alQ2b3F0Z05WV2Flbm5uRGlKZ3pZOWx2NUhFZ1YwTUFHMGVZdUIzaHZqK3cKK1kxUDlESnhQMUQrUitjc2hZckFGZzh5VS8za2FZVk5JMEJsM3lnWDBlVzFiLzBIWlRkb2NzKzhrTS85UFpRRFIKK1dyS1FvVTVsSHZxUnQ5OWRYbEQ0TldHSTJZUXR6ZFo4aWV0OVFMcW5qd1JaYWJnRTk2bUYwMXFLaXNNbkZjc2gKK0tqVDdpZWhlVTRKMTVUWmovbWRaUk5LMTI2ZDdlM3Evck5qNzNlNUVKOXRrWUxjb2xTcjRncGtuVU1KVUxTRWkKK0pIMS9ReDdDL21UQU1Sc041U2tPdGhuR3EwZGpDTldmUHYvM0pWMEg2N1VmNWtyRmxud0xlYnJnZlRZb1BQZG8KK3lPN2lCVU5KenY2UWgyMm1hbExwNFA4Z3pBQ2tEN0RHbFNUbm9CNWNMd2NqbURHZytpOVdyVUJiT2lWVGVRZloKK2tPajFvK1R6MzVuZHBxL0REVVZscWxpQjlrcmN4dmErUUhlSlBINTNFR0krWVZnMW5EK3MvdlVEWjNtUU1HWDkKK0RRb3UyTDh1VTZSbldOdi9CaWhHY0w4UXZTNFR5NlF5UE9VUHBEM3pjNzBKUUFFY1FrOUJ4UU5hRUxnSlgwSU4KKzIyY1luMjJ0WXZFbGV3OUc0MU9wRHF6QlJjZmJkSm1LWFEySGNyb1NodXRZSlFSR1VwQVhIazI0Znk2SlZrSVUKK29qRjVVNmN3ZXh0TWphMVpJSVpnaDlldWdJUlVlSUU3MzE5blFORHp1WFdqUkNjb0JMQTI1UDd3bnBIV0RScHoKK0Q5b3ZYQ0l2ZGphNzRsTDVwc3FvYlY2TDUrZmJMUGtTZ1hvSW1LUjBMUUtDQWdBSUM5Sms4a3h1bUN5SVZHQ1AKK1BlTTVVYnk5TTNHTXVLcmZZc24wWTVlOTcra1NKRjFkcG9qVG9kQmdSMktRYXI2ZVZydlh0Kzh1WkNjSWpmeDgKK2RVclltSE5FVUpmSGw0VDFFU2drWDF2a2NwVkZlUUZydVpEams3RVAzKzFzZ3ZwU3JvR1Raa1ZCUkZzVFhiUVoKK0Z1Q3YwUGd0MVRLRyt6R21rbHhoajNUc2lSeThNRWpXQXhCVXArK2Z0WkpuWk5JNGZlREduZkV4N3RMd1ZoQWcKKzZEV1NpV0RPNmhnUXB2T0x3WDVsdSsweDlpdGMxTVFzbkRPL09xSURuQkFKRE41azdjVlZrZktscWJWanhncHoKK2VxVUpzM3lBZDgxZjQ0a0RRVENCNGFoWW9jZ2VJR3NyT3FkL1dvR0wxRUVQUG8vTzl3UVA3VnRsSVJ0OFV3dUcKK2JTMTgrYTRzQlVmQWE1NnhZdS9wblBvN1ljdWJzZ1pmY1NJdWp6RlFxTXBWVENsSlJuT25FdUo0SjErUFh6UnoKK1hBTzlmczRWSitDTUVtZ0F5b25VejRYYWR4dWxua25sdy8vc085VktnTTY5b0ZIQ0RITC9YYW1BQWJxQWR3dmYKKzdSLyt1eStPbDdyb21DMHdNaGI2U3NJWmF6cnZ2SDJtTnRkdUFLWjYzOG5BUDF4L1diUXArNmlWRzd5Sm9rN3cKKzgyUTd0TzdiYU9lUFRYaDEyUnJ0NG1OUG9yMEhMWXhocmE0R0ZnZnFrdW1KMk16MGVzdVpBb3p4SlhGT3E4bHkKK2JlbzlDVnRYUDV6YlQ2cU5wZU5pc21YNlBMSUNhZXY4dCsxaU9aU0U1NldTTHRlZnV1ai9jT1ZyVE1ORHoxUnIKK3BVa0VWVjJ6alVTamxjU2NNNTM4QTlpTDJRS0NBZ0JMYkJrMHI2VDBpaFJzSzlVdWNNeGhuWUV6L1ZxK1VFdTkKKzcwVmkxQWNpcUVKdjluaDRkM1EzSG5IN0VIQU5aeEc0SnF6bTFEWVlWVVFhOUdma1RGZXE4OHhGdi9HVzJoVU0KK1lZOFJTZlJEckllWE5FT0VUQ2UzN3gyQUh3MjVkUlhsWnR3K3dBUlBhdTkxeTkrWS9GQ2wxOE5xQ0hmY1VFaW4KK0VSanNmL2VJMmJQbE9EQWxSMnRadlo3TTYwVkJkcXBOOGNtVjN6dkkzZTg4ejQzeExmUWxEeXIxK3Y3YTVFdnkKK2xFSm5YbFNUSTJvK3ZLeHRsMTAzdmpNU3dBMWdoNjNLOTBnQlZzSldYUURadWVPemk4bUI5VXFOUmZjTW1PRWUKKzRZSHR0VFhQeGV1MHgrNGNDUmZhbTl6S1Noc1ZGZ0kyOHZSUS9pamw2cW1iUTVnVjh3cWYxOEdWMWoxTDR6MFAKK2xQNmlWeW5EQTRNTXJ1Zy93OURxUHNIc2ZLMHB3ZWtlRVRmU2o0eTB4Vlh5aldaQmZIRzJaQnJTNm1EVGYrUkcKK0xDNHNKZ1IwaGpkSUxMblVxSVg3UHp1aGllQkhScmpCY29wd3ZjcnlWV1JIbkk3a3NsQVMwK3lIamlXYzVvVzMKK3g1bXRsdW00SHplbE5ZdUQ5Y0FFLzk1UDZDZVNNZnA5Q3lJRS9LU1g0VnZzUm02Z1FWa29RUktNeG5RSUZRM3cKK081Z2wxbDg4dmhqb28ySHhZU2NnQ3A3MEJzRHdpVU5UcUlSM05NK1pCSFlGd2VWZjNHd3o1THpIWlQyckVadEQKKzZWWFJQNzVRLzJ3T0xucUNPNGJLNEJVczZzcXhjUVptT2xkcnVQa1B5bnJZMG9QZkhIRXhqeFpEdlF1NC9yODAKK0xzM24wTDh5dlFLQ0FnRUFuWVdTNkVpa3dhUU5wSkVmaVVuT2xnbGdGejRFRTFlVmtyRGJCWTRKM29QVStkb3oKK0RycW1zdmdwU1pJQWZkMk1VYmtONHBPTXNNVGpiZUlZV0RuWkRhMVJvY3RLczNGaHdGUEh3QWpRcHpuYWI0bW4KK0JwODFGTUhNNDBxeWIwTmFOdUZSd2doZFh2b1F2QkJYMXA4b0VuRnpEUnZUaXVTL3ZUUFRBOEtEWThJZVJwOFIKK29HektIcGZ6aU53cS9VUnBxajdwd2k5b2ROakdadlIySXdZdzlqQ0xQSXFhRWJNb1NPZEkwbWc0TW9ZeXFQNHEKK25tN2Q0d3FTRHdyWXhpWFo2ZjNuWXBraEVZMWxiMFdia3NwMWlnOHNLU0Y0bkRaUkdLMVJTZkUrNmdqQnA5NEgKK1gvV29nNlpiNk5DOVpwdXNUaURMdnVJVVhjeVVKdm1IaVdqU05xaVR2OGp1cmx3RXNnU3doemlFUWZxTHJ0ZFYKK1FJM1BSTW9sQmtEMWlDaytIRkU1M3IwNUxNZjFicDNyNE1TK25hYVFyTGJJcmwxa2dETkd3VmRnUytTQ003QmcKK1R3RWdFNjdpT2IyaUlvVXBvbi9OeVA0TGVzTXp2ZHBzdTJKRmxmejEzUG1tUTM0bUZJN3RXdk9iM05BNURQM2MKKzQ2QzZTYVdJMFREOUIxMW5KYkhHVFlOM1NpOW4wRUJnb0RKRVhVS2VoM2ttOU80N2RndmtTdWc0V3poWXN2ckUKK3JNbE1MdEtmcDJ3OEhsTVpwc1VsVG9OQ3g2Q0krdEpyb2h6Y3MzQkFWQWJqRkFYUktXR2lqQjFyeHd5RGRIUHYKK0krL3dKVE5hUk5QUTFNMFN3dEVML3pKZDIxeTNLU1BuNGVMK0dQM2VmaGxEU2p0bER2WnFrZEFVc1U4PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9yc2F1dGwuYyBiL2xpYi9vcGVuc3NsL2FwcHMvcnNhdXRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxZjAwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvcnNhdXRsLmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qIHJzYXV0bC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCisjZGVmaW5lIFJTQV9TSUdOIAkxCisjZGVmaW5lIFJTQV9WRVJJRlkgCTIKKyNkZWZpbmUgUlNBX0VOQ1JZUFQgCTMKKyNkZWZpbmUgUlNBX0RFQ1JZUFQgCTQKKworI2RlZmluZSBLRVlfUFJJVktFWQkxCisjZGVmaW5lIEtFWV9QVUJLRVkJMgorI2RlZmluZSBLRVlfQ0VSVAkzCisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpOworCisjdW5kZWYgUFJPRworCisjZGVmaW5lIFBST0cgcnNhdXRsX21haW4KKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJRU5HSU5FICplID0gTlVMTDsKKwlCSU8gKmluID0gTlVMTCwgKm91dCA9IE5VTEw7CisJY2hhciAqaW5maWxlID0gTlVMTCwgKm91dGZpbGUgPSBOVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWNoYXIgKmVuZ2luZSA9IE5VTEw7CisjZW5kaWYKKwljaGFyICprZXlmaWxlID0gTlVMTDsKKwljaGFyIHJzYV9tb2RlID0gUlNBX1ZFUklGWSwga2V5X3R5cGUgPSBLRVlfUFJJVktFWTsKKwlpbnQga2V5Zm9ybSA9IEZPUk1BVF9QRU07CisJY2hhciBuZWVkX3ByaXYgPSAwLCBiYWRhcmcgPSAwLCByZXYgPSAwOworCWNoYXIgaGV4ZHVtcCA9IDAsIGFzbjFwYXJzZSA9IDA7CisJWDUwOSAqeDsKKwlFVlBfUEtFWSAqcGtleSA9IE5VTEw7CisJUlNBICpyc2EgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKnJzYV9pbiA9IE5VTEwsICpyc2Ffb3V0ID0gTlVMTCwgcGFkOworCWNoYXIgKnBhc3NhcmdpbiA9IE5VTEwsICpwYXNzaW4gPSBOVUxMOworCWludCByc2FfaW5sZW4sIHJzYV9vdXRsZW4gPSAwOworCWludCBrZXlzaXplOworCisJaW50IHJldCA9IDE7CisKKwlhcmdjLS07CisJYXJndisrOworCisJaWYoIWJpb19lcnIpIGJpb19lcnIgPSBCSU9fbmV3X2ZwKHN0ZGVyciwgQklPX05PQ0xPU0UpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKwlPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpOworCXBhZCA9IFJTQV9QS0NTMV9QQURESU5HOworCQorCXdoaWxlKGFyZ2MgPj0gMSkKKwl7CisJCWlmICghc3RyY21wKCphcmd2LCItaW4iKSkgeworCQkJaWYgKC0tYXJnYyA8IDEpCisJCQkJYmFkYXJnID0gMTsKKwkJCWVsc2UKKwkJCQlpbmZpbGU9ICooKythcmd2KTsKKwkJfSBlbHNlIGlmICghc3RyY21wKCphcmd2LCItb3V0IikpIHsKKwkJCWlmICgtLWFyZ2MgPCAxKQorCQkJCWJhZGFyZyA9IDE7CisJCQllbHNlCisJCQkJb3V0ZmlsZT0gKigrK2FyZ3YpOworCQl9IGVsc2UgaWYoIXN0cmNtcCgqYXJndiwgIi1pbmtleSIpKSB7CisJCQlpZiAoLS1hcmdjIDwgMSkKKwkJCQliYWRhcmcgPSAxOworCQkJZWxzZQorCQkJCWtleWZpbGUgPSAqKCsrYXJndik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwiLXBhc3NpbiIpKSB7CisJCQlpZiAoLS1hcmdjIDwgMSkKKwkJCQliYWRhcmcgPSAxOworCQkJZWxzZQorCQkJCXBhc3Nhcmdpbj0gKigrK2FyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWtleWZvcm0iKSA9PSAwKSB7CisJCQlpZiAoLS1hcmdjIDwgMSkKKwkJCQliYWRhcmcgPSAxOworCQkJZWxzZQorCQkJCWtleWZvcm09c3RyMmZtdCgqKCsrYXJndikpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQl9IGVsc2UgaWYoIXN0cmNtcCgqYXJndiwgIi1lbmdpbmUiKSkgeworCQkJaWYgKC0tYXJnYyA8IDEpCisJCQkJYmFkYXJnID0gMTsKKwkJCWVsc2UKKwkJCQllbmdpbmUgPSAqKCsrYXJndik7CisjZW5kaWYKKwkJfSBlbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItcHViaW4iKSkgeworCQkJa2V5X3R5cGUgPSBLRVlfUFVCS0VZOworCQl9IGVsc2UgaWYoIXN0cmNtcCgqYXJndiwgIi1jZXJ0aW4iKSkgeworCQkJa2V5X3R5cGUgPSBLRVlfQ0VSVDsKKwkJfSAKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLWFzbjFwYXJzZSIpKSBhc24xcGFyc2UgPSAxOworCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItaGV4ZHVtcCIpKSBoZXhkdW1wID0gMTsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLXJhdyIpKSBwYWQgPSBSU0FfTk9fUEFERElORzsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLW9hZXAiKSkgcGFkID0gUlNBX1BLQ1MxX09BRVBfUEFERElORzsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLXNzbCIpKSBwYWQgPSBSU0FfU1NMVjIzX1BBRERJTkc7CisJCWVsc2UgaWYoIXN0cmNtcCgqYXJndiwgIi1wa2NzIikpIHBhZCA9IFJTQV9QS0NTMV9QQURESU5HOworCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICIteDkzMSIpKSBwYWQgPSBSU0FfWDkzMV9QQURESU5HOworCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItc2lnbiIpKSB7CisJCQlyc2FfbW9kZSA9IFJTQV9TSUdOOworCQkJbmVlZF9wcml2ID0gMTsKKwkJfSBlbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItdmVyaWZ5IikpIHJzYV9tb2RlID0gUlNBX1ZFUklGWTsKKwkJZWxzZSBpZighc3RyY21wKCphcmd2LCAiLXJldiIpKSByZXYgPSAxOworCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItZW5jcnlwdCIpKSByc2FfbW9kZSA9IFJTQV9FTkNSWVBUOworCQllbHNlIGlmKCFzdHJjbXAoKmFyZ3YsICItZGVjcnlwdCIpKSB7CisJCQlyc2FfbW9kZSA9IFJTQV9ERUNSWVBUOworCQkJbmVlZF9wcml2ID0gMTsKKwkJfSBlbHNlIGJhZGFyZyA9IDE7CisJCWlmKGJhZGFyZykgeworCQkJdXNhZ2UoKTsKKwkJCWdvdG8gZW5kOworCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCX0KKworCWlmKG5lZWRfcHJpdiAmJiAoa2V5X3R5cGUgIT0gS0VZX1BSSVZLRVkpKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkEgcHJpdmF0ZSBrZXkgaXMgbmVlZGVkIGZvciB0aGlzIG9wZXJhdGlvblxuIik7CisJCWdvdG8gZW5kOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKwlpZighYXBwX3Bhc3N3ZChiaW9fZXJyLCBwYXNzYXJnaW4sIE5VTEwsICZwYXNzaW4sIE5VTEwpKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgcGFzc3dvcmRcbiIpOworCQlnb3RvIGVuZDsKKwl9CisKKy8qIEZJWE1FOiBzZWVkIFBSTkcgb25seSBpZiBuZWVkZWQgKi8KKwlhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgMCk7CisJCisJc3dpdGNoKGtleV90eXBlKSB7CisJCWNhc2UgS0VZX1BSSVZLRVk6CisJCXBrZXkgPSBsb2FkX2tleShiaW9fZXJyLCBrZXlmaWxlLCBrZXlmb3JtLCAwLAorCQkJcGFzc2luLCBlLCAiUHJpdmF0ZSBLZXkiKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBLRVlfUFVCS0VZOgorCQlwa2V5ID0gbG9hZF9wdWJrZXkoYmlvX2Vyciwga2V5ZmlsZSwga2V5Zm9ybSwgMCwKKwkJCU5VTEwsIGUsICJQdWJsaWMgS2V5Iik7CisJCWJyZWFrOworCisJCWNhc2UgS0VZX0NFUlQ6CisJCXggPSBsb2FkX2NlcnQoYmlvX2Vyciwga2V5ZmlsZSwga2V5Zm9ybSwKKwkJCU5VTEwsIGUsICJDZXJ0aWZpY2F0ZSIpOworCQlpZih4KSB7CisJCQlwa2V5ID0gWDUwOV9nZXRfcHVia2V5KHgpOworCQkJWDUwOV9mcmVlKHgpOworCQl9CisJCWJyZWFrOworCX0KKworCWlmKCFwa2V5KSB7CisJCXJldHVybiAxOworCX0KKworCXJzYSA9IEVWUF9QS0VZX2dldDFfUlNBKHBrZXkpOworCUVWUF9QS0VZX2ZyZWUocGtleSk7CisKKwlpZighcnNhKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgUlNBIGtleVxuIik7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCX0KKworCisJaWYoaW5maWxlKSB7CisJCWlmKCEoaW4gPSBCSU9fbmV3X2ZpbGUoaW5maWxlLCAicmIiKSkpIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIFJlYWRpbmcgSW5wdXQgRmlsZVxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOwkKKwkJCWdvdG8gZW5kOworCQl9CisJfSBlbHNlIGluID0gQklPX25ld19mcChzdGRpbiwgQklPX05PQ0xPU0UpOworCisJaWYob3V0ZmlsZSkgeworCQlpZighKG91dCA9IEJJT19uZXdfZmlsZShvdXRmaWxlLCAid2IiKSkpIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIFJlYWRpbmcgT3V0cHV0IEZpbGVcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsJCisJCQlnb3RvIGVuZDsKKwkJfQorCX0gZWxzZSB7CisJCW91dCA9IEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJICAgIEJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQkgICAgb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwl9CisKKwlrZXlzaXplID0gUlNBX3NpemUocnNhKTsKKworCXJzYV9pbiA9IE9QRU5TU0xfbWFsbG9jKGtleXNpemUgKiAyKTsKKwlyc2Ffb3V0ID0gT1BFTlNTTF9tYWxsb2Moa2V5c2l6ZSk7CisKKwkvKiBSZWFkIHRoZSBpbnB1dCBkYXRhICovCisJcnNhX2lubGVuID0gQklPX3JlYWQoaW4sIHJzYV9pbiwga2V5c2l6ZSAqIDIpOworCWlmKHJzYV9pbmxlbiA8PSAwKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHJlYWRpbmcgaW5wdXQgRGF0YVxuIik7CisJCWV4aXQoMSk7CisJfQorCWlmKHJldikgeworCQlpbnQgaTsKKwkJdW5zaWduZWQgY2hhciBjdG1wOworCQlmb3IoaSA9IDA7IGkgPCByc2FfaW5sZW4vMjsgaSsrKSB7CisJCQljdG1wID0gcnNhX2luW2ldOworCQkJcnNhX2luW2ldID0gcnNhX2luW3JzYV9pbmxlbiAtIDEgLSBpXTsKKwkJCXJzYV9pbltyc2FfaW5sZW4gLSAxIC0gaV0gPSBjdG1wOworCQl9CisJfQorCXN3aXRjaChyc2FfbW9kZSkgeworCisJCWNhc2UgUlNBX1ZFUklGWToKKwkJCXJzYV9vdXRsZW4gID0gUlNBX3B1YmxpY19kZWNyeXB0KHJzYV9pbmxlbiwgcnNhX2luLCByc2Ffb3V0LCByc2EsIHBhZCk7CisJCWJyZWFrOworCisJCWNhc2UgUlNBX1NJR046CisJCQlyc2Ffb3V0bGVuICA9IFJTQV9wcml2YXRlX2VuY3J5cHQocnNhX2lubGVuLCByc2FfaW4sIHJzYV9vdXQsIHJzYSwgcGFkKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBSU0FfRU5DUllQVDoKKwkJCXJzYV9vdXRsZW4gID0gUlNBX3B1YmxpY19lbmNyeXB0KHJzYV9pbmxlbiwgcnNhX2luLCByc2Ffb3V0LCByc2EsIHBhZCk7CisJCWJyZWFrOworCisJCWNhc2UgUlNBX0RFQ1JZUFQ6CisJCQlyc2Ffb3V0bGVuICA9IFJTQV9wcml2YXRlX2RlY3J5cHQocnNhX2lubGVuLCByc2FfaW4sIHJzYV9vdXQsIHJzYSwgcGFkKTsKKwkJYnJlYWs7CisKKwl9CisKKwlpZihyc2Ffb3V0bGVuIDw9IDApIHsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiUlNBIG9wZXJhdGlvbiBlcnJvclxuIik7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCX0KKwlyZXQgPSAwOworCWlmKGFzbjFwYXJzZSkgeworCQlpZighQVNOMV9wYXJzZV9kdW1wKG91dCwgcnNhX291dCwgcnNhX291dGxlbiwgMSwgLTEpKSB7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQl9CisJfSBlbHNlIGlmKGhleGR1bXApIEJJT19kdW1wKG91dCwgKGNoYXIgKilyc2Ffb3V0LCByc2Ffb3V0bGVuKTsKKwllbHNlIEJJT193cml0ZShvdXQsIHJzYV9vdXQsIHJzYV9vdXRsZW4pOworCWVuZDoKKwlSU0FfZnJlZShyc2EpOworCUJJT19mcmVlKGluKTsKKwlCSU9fZnJlZV9hbGwob3V0KTsKKwlpZihyc2FfaW4pIE9QRU5TU0xfZnJlZShyc2FfaW4pOworCWlmKHJzYV9vdXQpIE9QRU5TU0xfZnJlZShyc2Ffb3V0KTsKKwlpZihwYXNzaW4pIE9QRU5TU0xfZnJlZShwYXNzaW4pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVzYWdlKCkKK3sKKwlCSU9fcHJpbnRmKGJpb19lcnIsICJVc2FnZTogcnNhdXRsIFtvcHRpb25zXVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWluIGZpbGUgICAgICAgIGlucHV0IGZpbGVcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgIi1vdXQgZmlsZSAgICAgICBvdXRwdXQgZmlsZVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWlua2V5IGZpbGUgICAgIGlucHV0IGtleVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWtleWZvcm0gYXJnICAgIHByaXZhdGUga2V5IGZvcm1hdCAtIGRlZmF1bHQgUEVNXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsICItcHViaW4gICAgICAgICAgaW5wdXQgaXMgYW4gUlNBIHB1YmxpY1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWNlcnRpbiAgICAgICAgIGlucHV0IGlzIGEgY2VydGlmaWNhdGUgY2FycnlpbmcgYW4gUlNBIHB1YmxpYyBrZXlcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgIi1zc2wgICAgICAgICAgICB1c2UgU1NMIHYyIHBhZGRpbmdcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgIi1yYXcgICAgICAgICAgICB1c2Ugbm8gcGFkZGluZ1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLXBrY3MgICAgICAgICAgIHVzZSBQS0NTIzEgdjEuNSBwYWRkaW5nIChkZWZhdWx0KVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLW9hZXAgICAgICAgICAgIHVzZSBQS0NTIzEgT0FFUFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLXNpZ24gICAgICAgICAgIHNpZ24gd2l0aCBwcml2YXRlIGtleVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLXZlcmlmeSAgICAgICAgIHZlcmlmeSB3aXRoIHB1YmxpYyBrZXlcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwgIi1lbmNyeXB0ICAgICAgICBlbmNyeXB0IHdpdGggcHVibGljIGtleVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWRlY3J5cHQgICAgICAgIGRlY3J5cHQgd2l0aCBwcml2YXRlIGtleVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWhleGR1bXAgICAgICAgIGhleCBkdW1wIG91dHB1dFxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJQklPX3ByaW50ZihiaW9fZXJyLCAiLWVuZ2luZSBlICAgICAgIHVzZSBlbmdpbmUgZSwgcG9zc2libHkgYSBoYXJkd2FyZSBkZXZpY2UuXG4iKTsKKwlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXBhc3NpbiBhcmcgICAgcGFzcyBwaHJhc2Ugc291cmNlXG4iKTsKKyNlbmRpZgorCit9CisKKyNlbHNlIC8qICFPUEVOU1NMX05PX1JTQSAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvczEwMjRrZXkucGVtIGIvbGliL29wZW5zc2wvYXBwcy9zMTAyNGtleS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllMDQwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvczEwMjRrZXkucGVtCkBAIC0wLDAgKzEsMTUgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNYZ0lCQUFLQmdRQ3pFZlU4RStaR1RHdEhYVjVYaHZNMkxnMzJmWFVJanlkWGIzNEJHVlBYNm9ONythTlYKK1M5ZVdheXZXLys5L3ZVYjBhQ3FpbEpycEZlc2dJdFYyVDhWaGhqT0UrK1hVejQ2dU5wY01VN3dITUVBWFV1ZlAKK3B6dHBGbThaRWsydEZLdmFka1NTb044bGIxMWp1dlpWa1NrUGxCNjVwRmhTZTRRS1NwNko0SHJrWXdJREFRQUIKK0FvR0JBS3k4anZiMEx6Ynk4cTExeU5MZjcrNzh3Q1ZkWWk3dWdNSGNZQTFKVkZLOCt6YjFXZlNtNDRGTFFvLzAKK2RTQ2hBamd6MzZUVGV4ZUxPRFBZeGxlSm5kalZjT01WenNMSmpTTThkTHBYc1RTNEZDZU1iaHcyczJ1K3hxS1kKK2JiUFdmaytIT1R5SmpmbmtjQzVOYmc0NGVPbXJ1cTBnU21CZVVYVk01VW50bFRueEFrRUE3VEdDQTNoN2t4NUUKK0JsNHpsMnBjM2dQQUd0K2R5Zms1UG85bUdKVVVYaEY1cDJ6dWVHbVlXVzc0VG1PV0Ixa3p0NFFSZFlNekZlUHEKK3pmRE5YRWExQ3dKQkFNRkVyZFkweHAwVUoxM1d3QmJVVGs4cnVqcVFkSHRqdzBrbGhwYnVLa2p4dTJoTjB3d00KKzZwMEQ5cXhGN0pIYWdocVZSSTBmQVcvRUUwT3pkSE1SOVFrQ1FRRE5SMjZkTUZYS3NvUHUrdkl0bGpqL1VFR2YKK1FHN2dFUmlRNHl4YUZCUEhnZHBHbzBrVDMxZWg5eDloUUdEa3hUZTBHTkcvWVNnQ1J2bTgrQzNUTWNLWEFrQkQKK2RoR24zNndrVUZDZGRNU0FNNE5TSjFWTjgvWjB5NUh6Q21JOGRNM1Z3R3RHTVVRbHhLeHdPbDMwTEVRemRTNU0KKzBTV29qTllYaVQyZ09CZkJ3dGJoQWtFQWhhZmw1UUVPSWdVeitYYXpTL0lsWjhnb05LZERWZllnSzNtSEhqdnYKK25ZNUcrQXVHZWJkTmtYSnI0S1NXeERjTitDMmk0N3p1ajRRWEExNk1BT2FuZEE9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvczEwMjRyZXEucGVtIGIvbGliL29wZW5zc2wvYXBwcy9zMTAyNHJlcS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3NWU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvczEwMjRyZXEucGVtCkBAIC0wLDAgKzEsMTEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCitNSUlCb2pDQ0FRc0NBUUF3WkRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbEYxWldWdWMyeGhibVF4CitHakFZQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNU1F3SWdZRFZRUURFeHRUWlhKMlpYSWdkR1Z6CitkQ0JqWlhKMElDZ3hNREkwSUdKcGRDa3dnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTE1SCis5VHdUNWtaTWEwZGRYbGVHOHpZdURmWjlkUWlQSjFkdmZnRVpVOWZxZzN2NW8xVkwxNVpySzliLzczKzlSdlJvCitLcUtVbXVrVjZ5QWkxWFpQeFdHR000VDc1ZFRQanE0Mmx3eFR2QWN3UUJkUzU4K25PMmtXYnhrU1RhMFVxOXAyCitSSktnM3lWdlhXTzY5bFdSS1ErVUhybWtXRko3aEFwS25vbmdldVJqQWdNQkFBRXdEUVlKS29aSWh2Y05BUUVFCitCUUFEZ1lFQVN0SGxrNHBCYndpTmVRMi9QS1RQUFh6SVRZQzhHbjBYTWJyVTk0ZS82SklLaU83YUFycTlFc3BxCituckJTdkMxNGRIY05sNk5Odm5rRUtkUTdoQWtjQUNmQmJuT1hBL29Rdk1CZDRHRDc4Y0gzazBqVkRvVlVFamlsCitmckxmV2xja1c2V3pwVGt0dDBaUERkQWpKQ21LVmgwQUJIaW1pN0JvOUZDM3dJR0llNU09CistLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvczUxMi1rZXkucGVtIGIvbGliL29wZW5zc2wvYXBwcy9zNTEyLWtleS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzZmYyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvczUxMi1rZXkucGVtCkBAIC0wLDAgKzEsOSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQlBBSUJBQUpCQUorenc0UW5sZjhTTVZJUEZlOUdFY1N0Z09ZMld3L2RnTmRoamVEOGNrVUpOUDVWWmtWRAorVEdpWGF2Nm9vS1hmWDNqLzd0ZGt1RDhFeTIvL0t2Nyt1ZTBDQXdFQUFRSkFONlczMXZERVAyRGpkcWh6Q0REdQorT0E0TkFDcW9pRnF5YmxvN3ljMnRNNGg0eE1iQzNZeDVVS01OOVprQ3RYMGd6cno2RHlGNDdiZEtjV0J6TldDagorZ1FJaEFORW9valZ0N2hxK1NRNk1DTjZGVEF5c0dnUWY1NlEzVFlvSk1vV3ZkaVhWQWlFQXczZTNyYytWSnBPegorckh1RG82YmdwalVBQVhNK3YzZmNwc2ZaU05PNlY3a0NJUUN0YlZqYW5wVXd2WmtNSTlieTAyb1VrOXRha2kzYgorUHpQZkFmTlBZQWJDSlFJaEFKWE5RRFd5cXduL2xHbVIxMWNxWTJ5OW5aMSs1dzN5SEdhdExyY0RuUUh4QWlFQQordm5sRUdvOEs4NXUrS3dJT2ltTTQ4Wkc4b1RrN2lGZGtxTEpSMXV0VDNhVT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3M1MTItcmVxLnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvczUxMi1yZXEucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzE0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3M1MTItcmVxLnBlbQpAQCAtMCwwICsxLDggQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCitNSUlCR3pDQnhnSUJBREJqTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUtVWFZsWlc1emJHRnVaREVhCitNQmdHQTFVRUNoTVJRM0o1Y0hSVGIyWjBJRkIwZVNCTWRHUXhJekFoQmdOVkJBTVRHbE5sY25abGNpQjBaWE4wCitJR05sY25RZ0tEVXhNaUJpYVhRcE1Gd3dEUVlKS29aSWh2Y05BUUVCQlFBRFN3QXdTQUpCQUorenc0UW5sZjhTCitNVklQRmU5R0VjU3RnT1kyV3cvZGdOZGhqZUQ4Y2tVSk5QNVZaa1ZEVEdpWGF2Nm9vS1hmWDNqLzd0ZGt1RDhFCit5Mi8vS3Y3K3VlMENBd0VBQVRBTkJna3Foa2lHOXcwQkFRUUZBQU5CQUFCK3VRaStxd242cVJTSEI4RVVUdnNtCis1VE5USHpZRGVOMzlueUliWk5YMnMwc2UzU3JuMkJ4ZnQ1WUN3RDNtb0ZaOVFveURIeEUwaDZxTFg1eWpEKzg9CistLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvc19hcHBzLmggYi9saWIvb3BlbnNzbC9hcHBzL3NfYXBwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMGU1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3NfYXBwcy5oCkBAIC0wLDAgKzEsMTc2IEBACisvKiBhcHBzL3NfYXBwcy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAgLyogY29uZmxpY3RzIHdpdGggd2luc29jazIgc3R1ZmYgb24gbmV0d2FyZSAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKQorI2luY2x1ZGUgPGNvbmlvLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpICYmICFkZWZpbmVkKF9XSU4zMikKKyNkZWZpbmUgX2tiaGl0IGtiaGl0CisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKSAmJiAhZGVmaW5lZChGRF9TRVQpCisvKiBWQVggQyBkb2VzIG5vdCBkZWZpbmVkIGZkX3NldCBhbmQgZnJpZW5kcywgYnV0IGl0J3MgYWN0dWFsbHkgcXVpdGUgc2ltcGxlICovCisvKiBUaGVzZSBkZWZpbml0aW9ucyBhcmUgYm9ycm93ZWQgZnJvbSBTT0NLRVRTSFIuCS9SaWNoYXJkIExldml0dGUgKi8KKyNkZWZpbmUgTUFYX05PRklMRQkzMgorI2RlZmluZQlOQkJZCQkgOAkJLyogbnVtYmVyIG9mIGJpdHMgaW4gYSBieXRlCSovCisKKyNpZm5kZWYJRkRfU0VUU0laRQorI2RlZmluZQlGRF9TRVRTSVpFCU1BWF9OT0ZJTEUKKyNlbmRpZgkvKiBGRF9TRVRTSVpFICovCisKKy8qIEhvdyBtYW55IHRoaW5ncyB3ZSdsbCBhbGxvdyBzZWxlY3QgdG8gdXNlLiAwIGlmIHVubGltaXRlZCAqLworI2RlZmluZSBNQVhTRUxGRAlNQVhfTk9GSUxFCit0eXBlZGVmIGludAlmZF9tYXNrOwkvKiBpbnQgaGVyZSEgVk1TIHByb3RvdHlwZXMgaW50LCBub3QgbG9uZyAqLworI2RlZmluZSBORkRCSVRTCShzaXplb2YoZmRfbWFzaykgKiBOQkJZKQkvKiBiaXRzIHBlciBtYXNrIChwb3dlciBvZiAyISkqLworI2RlZmluZSBORkRTSElGVCA1CQkJCS8qIFNoaWZ0IGJhc2VkIG9uIGFib3ZlICovCisKK3R5cGVkZWYgZmRfbWFzayBmZF9zZXQ7CisjZGVmaW5lCUZEX1NFVChuLCBwKQkoKihwKSB8PSAoMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2RlZmluZQlGRF9DTFIobiwgcCkJKCoocCkgJj0gfigxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lCUZEX0lTU0VUKG4sIHApCSgqKHApICYgKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNkZWZpbmUgRkRfWkVSTyhwKQltZW1zZXQoKGNoYXIgKikocCksIDAsIHNpemVvZigqKHApKSkKKyNlbmRpZgorCisjZGVmaW5lIFBPUlQgICAgICAgICAgICA0NDMzCisjZGVmaW5lIFBPUlRfU1RSICAgICAgICAiNDQzMyIKKyNkZWZpbmUgUFJPVE9DT0wgICAgICAgICJ0Y3AiCisKK2ludCBkb19zZXJ2ZXIoaW50IHBvcnQsIGludCB0eXBlLCBpbnQgKnJldCwgaW50ICgqY2IpIChjaGFyICpob3N0bmFtZSwgaW50IHMsIHVuc2lnbmVkIGNoYXIgKmNvbnRleHQpLCB1bnNpZ25lZCBjaGFyICpjb250ZXh0KTsKKyNpZmRlZiBIRUFERVJfWDUwOV9ICitpbnQgTVNfQ0FMTEJBQ0sgdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKmN0eCk7CisjZW5kaWYKKyNpZmRlZiBIRUFERVJfU1NMX0gKK2ludCBzZXRfY2VydF9zdHVmZihTU0xfQ1RYICpjdHgsIGNoYXIgKmNlcnRfZmlsZSwgY2hhciAqa2V5X2ZpbGUpOworaW50IHNldF9jZXJ0X2tleV9zdHVmZihTU0xfQ1RYICpjdHgsIFg1MDkgKmNlcnQsIEVWUF9QS0VZICprZXkpOworI2VuZGlmCitpbnQgaW5pdF9jbGllbnQoaW50ICpzb2NrLCBjaGFyICpzZXJ2ZXIsIGludCBwb3J0LCBpbnQgdHlwZSk7CitpbnQgc2hvdWxkX3JldHJ5KGludCBpKTsKK2ludCBleHRyYWN0X3BvcnQoY2hhciAqc3RyLCBzaG9ydCAqcG9ydF9wdHIpOworaW50IGV4dHJhY3RfaG9zdF9wb3J0KGNoYXIgKnN0cixjaGFyICoqaG9zdF9wdHIsdW5zaWduZWQgY2hhciAqaXAsc2hvcnQgKnApOworCitsb25nIE1TX0NBTExCQUNLIGJpb19kdW1wX2NhbGxiYWNrKEJJTyAqYmlvLCBpbnQgY21kLCBjb25zdCBjaGFyICphcmdwLAorCQkJCSAgIGludCBhcmdpLCBsb25nIGFyZ2wsIGxvbmcgcmV0KTsKKworI2lmZGVmIEhFQURFUl9TU0xfSAordm9pZCBNU19DQUxMQkFDSyBhcHBzX3NzbF9pbmZvX2NhbGxiYWNrKGNvbnN0IFNTTCAqcywgaW50IHdoZXJlLCBpbnQgcmV0KTsKK3ZvaWQgTVNfQ0FMTEJBQ0sgbXNnX2NiKGludCB3cml0ZV9wLCBpbnQgdmVyc2lvbiwgaW50IGNvbnRlbnRfdHlwZSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBTU0wgKnNzbCwgdm9pZCAqYXJnKTsKK3ZvaWQgTVNfQ0FMTEJBQ0sgdGxzZXh0X2NiKFNTTCAqcywgaW50IGNsaWVudF9zZXJ2ZXIsIGludCB0eXBlLAorCQkJCQl1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLAorCQkJCQl2b2lkICphcmcpOworI2VuZGlmCisKK2ludCBNU19DQUxMQkFDSyBnZW5lcmF0ZV9jb29raWVfY2FsbGJhY2soU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKmNvb2tpZSwgdW5zaWduZWQgaW50ICpjb29raWVfbGVuKTsKK2ludCBNU19DQUxMQkFDSyB2ZXJpZnlfY29va2llX2NhbGxiYWNrKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICpjb29raWUsIHVuc2lnbmVkIGludCBjb29raWVfbGVuKTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvc19jYi5jIGIvbGliL29wZW5zc2wvYXBwcy9zX2NiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmNTUxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvc19jYi5jCkBAIC0wLDAgKzEsODYyIEBACisvKiBhcHBzL3NfY2IuYyAtIGNhbGxiYWNrIGZ1bmN0aW9ucyB1c2VkIGJ5IHNfY2xpZW50LCBzX3NlcnZlciwgYW5kIHNfdGltZSAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2RlZmluZSBVU0VfU09DS0VUUworI2RlZmluZSBOT05fTUFJTgorI2luY2x1ZGUgImFwcHMuaCIKKyN1bmRlZiBOT05fTUFJTgorI3VuZGVmIFVTRV9TT0NLRVRTCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgInNfYXBwcy5oIgorCisjZGVmaW5lCUNPT0tJRV9TRUNSRVRfTEVOR1RICTE2CisKK2ludCB2ZXJpZnlfZGVwdGg9MDsKK2ludCB2ZXJpZnlfZXJyb3I9WDUwOV9WX09LOworaW50IHZlcmlmeV9yZXR1cm5fZXJyb3I9MDsKK3Vuc2lnbmVkIGNoYXIgY29va2llX3NlY3JldFtDT09LSUVfU0VDUkVUX0xFTkdUSF07CitpbnQgY29va2llX2luaXRpYWxpemVkPTA7CisKK2ludCBNU19DQUxMQkFDSyB2ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlYNTA5ICplcnJfY2VydDsKKwlpbnQgZXJyLGRlcHRoOworCisJZXJyX2NlcnQ9WDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChjdHgpOworCWVycj0JWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKGN0eCk7CisJZGVwdGg9CVg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcl9kZXB0aChjdHgpOworCisJQklPX3ByaW50ZihiaW9fZXJyLCJkZXB0aD0lZCAiLGRlcHRoKTsKKwlpZiAoZXJyX2NlcnQpCisJCXsKKwkJWDUwOV9OQU1FX3ByaW50X2V4KGJpb19lcnIsIFg1MDlfZ2V0X3N1YmplY3RfbmFtZShlcnJfY2VydCksCisJCQkJCTAsIFhOX0ZMQUdfT05FTElORSk7CisJCUJJT19wdXRzKGJpb19lcnIsICJcbiIpOworCQl9CisJZWxzZQorCQlCSU9fcHV0cyhiaW9fZXJyLCAiPG5vIGNlcnQ+XG4iKTsKKwlpZiAoIW9rKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IGVycm9yOm51bT0lZDolc1xuIixlcnIsCisJCQlYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpKTsKKwkJaWYgKHZlcmlmeV9kZXB0aCA+PSBkZXB0aCkKKwkJCXsKKwkJCWlmICghdmVyaWZ5X3JldHVybl9lcnJvcikKKwkJCQlvaz0xOworCQkJdmVyaWZ5X2Vycm9yPVg1MDlfVl9PSzsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJb2s9MDsKKwkJCXZlcmlmeV9lcnJvcj1YNTA5X1ZfRVJSX0NFUlRfQ0hBSU5fVE9PX0xPTkc7CisJCQl9CisJCX0KKwlzd2l0Y2ggKGVycikKKwkJeworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUOgorCQlCSU9fcHV0cyhiaW9fZXJyLCJpc3N1ZXI9ICIpOworCQlYNTA5X05BTUVfcHJpbnRfZXgoYmlvX2VyciwgWDUwOV9nZXRfaXNzdWVyX25hbWUoZXJyX2NlcnQpLAorCQkJCQkwLCBYTl9GTEFHX09ORUxJTkUpOworCQlCSU9fcHV0cyhiaW9fZXJyLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfTk9UX1lFVF9WQUxJRDoKKwljYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVGT1JFX0ZJRUxEOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vdEJlZm9yZT0iKTsKKwkJQVNOMV9USU1FX3ByaW50KGJpb19lcnIsWDUwOV9nZXRfbm90QmVmb3JlKGVycl9jZXJ0KSk7CisJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQ6CisJY2FzZSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxEOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vdEFmdGVyPSIpOworCQlBU04xX1RJTUVfcHJpbnQoYmlvX2VycixYNTA5X2dldF9ub3RBZnRlcihlcnJfY2VydCkpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuIik7CisJCWJyZWFrOworCWNhc2UgWDUwOV9WX0VSUl9OT19FWFBMSUNJVF9QT0xJQ1k6CisJCXBvbGljaWVzX3ByaW50KGJpb19lcnIsIGN0eCk7CisJCWJyZWFrOworCQl9CisJaWYgKGVyciA9PSBYNTA5X1ZfT0sgJiYgb2sgPT0gMikKKwkJcG9saWNpZXNfcHJpbnQoYmlvX2VyciwgY3R4KTsKKworCUJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IHJldHVybjolZFxuIixvayk7CisJcmV0dXJuKG9rKTsKKwl9CisKK2ludCBzZXRfY2VydF9zdHVmZihTU0xfQ1RYICpjdHgsIGNoYXIgKmNlcnRfZmlsZSwgY2hhciAqa2V5X2ZpbGUpCisJeworCWlmIChjZXJ0X2ZpbGUgIT0gTlVMTCkKKwkJeworCQkvKgorCQlTU0wgKnNzbDsKKwkJWDUwOSAqeDUwOTsKKwkJKi8KKworCQlpZiAoU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShjdHgsY2VydF9maWxlLAorCQkJU1NMX0ZJTEVUWVBFX1BFTSkgPD0gMCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGdldCBjZXJ0aWZpY2F0ZSBmcm9tICclcydcbiIsY2VydF9maWxlKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlyZXR1cm4oMCk7CisJCQl9CisJCWlmIChrZXlfZmlsZSA9PSBOVUxMKSBrZXlfZmlsZT1jZXJ0X2ZpbGU7CisJCWlmIChTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY3R4LGtleV9maWxlLAorCQkJU1NMX0ZJTEVUWVBFX1BFTSkgPD0gMCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIGdldCBwcml2YXRlIGtleSBmcm9tICclcydcbiIsa2V5X2ZpbGUpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKworCQkvKgorCQlJbiB0aGVvcnkgdGhpcyBpcyBubyBsb25nZXIgbmVlZGVkIAorCQlzc2w9U1NMX25ldyhjdHgpOworCQl4NTA5PVNTTF9nZXRfY2VydGlmaWNhdGUoc3NsKTsKKworCQlpZiAoeDUwOSAhPSBOVUxMKSB7CisJCQlFVlBfUEtFWSAqcGt0bXA7CisJCQlwa3RtcCA9IFg1MDlfZ2V0X3B1YmtleSh4NTA5KTsKKwkJCUVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhwa3RtcCwKKwkJCQkJCVNTTF9nZXRfcHJpdmF0ZWtleShzc2wpKTsKKwkJCUVWUF9QS0VZX2ZyZWUocGt0bXApOworCQl9CisJCVNTTF9mcmVlKHNzbCk7CisJCSovCisKKwkJLyogSWYgd2UgYXJlIHVzaW5nIERTQSwgd2UgY2FuIGNvcHkgdGhlIHBhcmFtZXRlcnMgZnJvbQorCQkgKiB0aGUgcHJpdmF0ZSBrZXkgKi8KKwkJCisJCQorCQkvKiBOb3cgd2Uga25vdyB0aGF0IGEga2V5IGFuZCBjZXJ0IGhhdmUgYmVlbiBzZXQgYWdhaW5zdAorCQkgKiB0aGUgU1NMIGNvbnRleHQgKi8KKwkJaWYgKCFTU0xfQ1RYX2NoZWNrX3ByaXZhdGVfa2V5KGN0eCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlByaXZhdGUga2V5IGRvZXMgbm90IG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSBwdWJsaWMga2V5XG4iKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKwkJfQorCXJldHVybigxKTsKKwl9CisKK2ludCBzZXRfY2VydF9rZXlfc3R1ZmYoU1NMX0NUWCAqY3R4LCBYNTA5ICpjZXJ0LCBFVlBfUEtFWSAqa2V5KQorCXsKKwlpZiAoY2VydCA9PSAgTlVMTCkKKwkJcmV0dXJuIDE7CisJaWYgKFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGN0eCxjZXJ0KSA8PSAwKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiZXJyb3Igc2V0dGluZyBjZXJ0aWZpY2F0ZVxuIik7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCXJldHVybiAwOworCQl9CisJaWYgKFNTTF9DVFhfdXNlX1ByaXZhdGVLZXkoY3R4LGtleSkgPD0gMCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHNldHRpbmcgcHJpdmF0ZSBrZXlcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlyZXR1cm4gMDsKKwkJfQorCisJCQorCQkvKiBOb3cgd2Uga25vdyB0aGF0IGEga2V5IGFuZCBjZXJ0IGhhdmUgYmVlbiBzZXQgYWdhaW5zdAorCQkgKiB0aGUgU1NMIGNvbnRleHQgKi8KKwlpZiAoIVNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoY3R4KSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlByaXZhdGUga2V5IGRvZXMgbm90IG1hdGNoIHRoZSBjZXJ0aWZpY2F0ZSBwdWJsaWMga2V5XG4iKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2xvbmcgTVNfQ0FMTEJBQ0sgYmlvX2R1bXBfY2FsbGJhY2soQklPICpiaW8sIGludCBjbWQsIGNvbnN0IGNoYXIgKmFyZ3AsCisJCQkJICAgaW50IGFyZ2ksIGxvbmcgYXJnbCwgbG9uZyByZXQpCisJeworCUJJTyAqb3V0OworCisJb3V0PShCSU8gKilCSU9fZ2V0X2NhbGxiYWNrX2FyZyhiaW8pOworCWlmIChvdXQgPT0gTlVMTCkgcmV0dXJuKHJldCk7CisKKwlpZiAoY21kID09IChCSU9fQ0JfUkVBRHxCSU9fQ0JfUkVUVVJOKSkKKwkJeworCQlCSU9fcHJpbnRmKG91dCwicmVhZCBmcm9tICVwIFslcF0gKCVsdSBieXRlcyA9PiAlbGQgKDB4JWxYKSlcbiIsCisgCQkJKHZvaWQgKiliaW8sYXJncCwodW5zaWduZWQgbG9uZylhcmdpLHJldCxyZXQpOworCQlCSU9fZHVtcChvdXQsYXJncCwoaW50KXJldCk7CisJCXJldHVybihyZXQpOworCQl9CisJZWxzZSBpZiAoY21kID09IChCSU9fQ0JfV1JJVEV8QklPX0NCX1JFVFVSTikpCisJCXsKKwkJQklPX3ByaW50ZihvdXQsIndyaXRlIHRvICVwIFslcF0gKCVsdSBieXRlcyA9PiAlbGQgKDB4JWxYKSlcbiIsCisJCQkodm9pZCAqKWJpbyxhcmdwLCh1bnNpZ25lZCBsb25nKWFyZ2kscmV0LHJldCk7CisJCUJJT19kdW1wKG91dCxhcmdwLChpbnQpcmV0KTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKwordm9pZCBNU19DQUxMQkFDSyBhcHBzX3NzbF9pbmZvX2NhbGxiYWNrKGNvbnN0IFNTTCAqcywgaW50IHdoZXJlLCBpbnQgcmV0KQorCXsKKwljb25zdCBjaGFyICpzdHI7CisJaW50IHc7CisKKwl3PXdoZXJlJiB+U1NMX1NUX01BU0s7CisKKwlpZiAodyAmIFNTTF9TVF9DT05ORUNUKSBzdHI9IlNTTF9jb25uZWN0IjsKKwllbHNlIGlmICh3ICYgU1NMX1NUX0FDQ0VQVCkgc3RyPSJTU0xfYWNjZXB0IjsKKwllbHNlIHN0cj0idW5kZWZpbmVkIjsKKworCWlmICh3aGVyZSAmIFNTTF9DQl9MT09QKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiJXM6JXNcbiIsc3RyLFNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhzKSk7CisJCX0KKwllbHNlIGlmICh3aGVyZSAmIFNTTF9DQl9BTEVSVCkKKwkJeworCQlzdHI9KHdoZXJlICYgU1NMX0NCX1JFQUQpPyJyZWFkIjoid3JpdGUiOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlNTTDMgYWxlcnQgJXM6JXM6JXNcbiIsCisJCQlzdHIsCisJCQlTU0xfYWxlcnRfdHlwZV9zdHJpbmdfbG9uZyhyZXQpLAorCQkJU1NMX2FsZXJ0X2Rlc2Nfc3RyaW5nX2xvbmcocmV0KSk7CisJCX0KKwllbHNlIGlmICh3aGVyZSAmIFNTTF9DQl9FWElUKQorCQl7CisJCWlmIChyZXQgPT0gMCkKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJXM6ZmFpbGVkIGluICVzXG4iLAorCQkJCXN0cixTU0xfc3RhdGVfc3RyaW5nX2xvbmcocykpOworCQllbHNlIGlmIChyZXQgPCAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlczplcnJvciBpbiAlc1xuIiwKKwkJCQlzdHIsU1NMX3N0YXRlX3N0cmluZ19sb25nKHMpKTsKKwkJCX0KKwkJfQorCX0KKworCit2b2lkIE1TX0NBTExCQUNLIG1zZ19jYihpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykKKwl7CisJQklPICpiaW8gPSBhcmc7CisJY29uc3QgY2hhciAqc3RyX3dyaXRlX3AsICpzdHJfdmVyc2lvbiwgKnN0cl9jb250ZW50X3R5cGUgPSAiIiwgKnN0cl9kZXRhaWxzMSA9ICIiLCAqc3RyX2RldGFpbHMyPSAiIjsKKwkKKwlzdHJfd3JpdGVfcCA9IHdyaXRlX3AgPyAiPj4+IiA6ICI8PDwiOworCisJc3dpdGNoICh2ZXJzaW9uKQorCQl7CisJY2FzZSBTU0wyX1ZFUlNJT046CisJCXN0cl92ZXJzaW9uID0gIlNTTCAyLjAiOworCQlicmVhazsKKwljYXNlIFNTTDNfVkVSU0lPTjoKKwkJc3RyX3ZlcnNpb24gPSAiU1NMIDMuMCAiOworCQlicmVhazsKKwljYXNlIFRMUzFfVkVSU0lPTjoKKwkJc3RyX3ZlcnNpb24gPSAiVExTIDEuMCAiOworCQlicmVhazsKKwljYXNlIERUTFMxX1ZFUlNJT046CisJCXN0cl92ZXJzaW9uID0gIkRUTFMgMS4wICI7CisJCWJyZWFrOworCWNhc2UgRFRMUzFfQkFEX1ZFUjoKKwkJc3RyX3ZlcnNpb24gPSAiRFRMUyAxLjAgKGJhZCkgIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RyX3ZlcnNpb24gPSAiPz8/IjsKKwkJfQorCisJaWYgKHZlcnNpb24gPT0gU1NMMl9WRVJTSU9OKQorCQl7CisJCXN0cl9kZXRhaWxzMSA9ICI/Pz8iOworCisJCWlmIChsZW4gPiAwKQorCQkJeworCQkJc3dpdGNoICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWJ1ZilbMF0pCisJCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJc3RyX2RldGFpbHMxID0gIiwgRVJST1I6IjsKKwkJCQkJc3RyX2RldGFpbHMyID0gIiA/Pz8iOworCQkJCQlpZiAobGVuID49IDMpCisJCQkJCQl7CisJCQkJCQl1bnNpZ25lZCBlcnIgPSAoKChjb25zdCB1bnNpZ25lZCBjaGFyKilidWYpWzFdPDw4KSArICgoY29uc3QgdW5zaWduZWQgY2hhciopYnVmKVsyXTsKKwkJCQkJCQorCQkJCQkJc3dpdGNoIChlcnIpCisJCQkJCQkJeworCQkJCQkJY2FzZSAweDAwMDE6CisJCQkJCQkJc3RyX2RldGFpbHMyID0gIiBOTy1DSVBIRVItRVJST1IiOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSAweDAwMDI6CisJCQkJCQkJc3RyX2RldGFpbHMyID0gIiBOTy1DRVJUSUZJQ0FURS1FUlJPUiI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDB4MDAwNDoKKwkJCQkJCQlzdHJfZGV0YWlsczIgPSAiIEJBRC1DRVJUSUZJQ0FURS1FUlJPUiI7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIDB4MDAwNjoKKwkJCQkJCQlzdHJfZGV0YWlsczIgPSAiIFVOU1VQUE9SVEVELUNFUlRJRklDQVRFLVRZUEUtRVJST1IiOworCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIENMSUVOVC1IRUxMTyI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJc3RyX2RldGFpbHMxID0gIiwgQ0xJRU5ULU1BU1RFUi1LRVkiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIENMSUVOVC1GSU5JU0hFRCI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDoKKwkJCQkJc3RyX2RldGFpbHMxID0gIiwgU0VSVkVSLUhFTExPIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA1OgorCQkJCQlzdHJfZGV0YWlsczEgPSAiLCBTRVJWRVItVkVSSUZZIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA2OgorCQkJCQlzdHJfZGV0YWlsczEgPSAiLCBTRVJWRVItRklOSVNIRUQiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDc6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIFJFUVVFU1QtQ0VSVElGSUNBVEUiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDg6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIENMSUVOVC1DRVJUSUZJQ0FURSI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJaWYgKHZlcnNpb24gPT0gU1NMM19WRVJTSU9OIHx8CisJICAgIHZlcnNpb24gPT0gVExTMV9WRVJTSU9OIHx8CisJICAgIHZlcnNpb24gPT0gRFRMUzFfVkVSU0lPTiB8fAorCSAgICB2ZXJzaW9uID09IERUTFMxX0JBRF9WRVIpCisJCXsKKwkJc3dpdGNoIChjb250ZW50X3R5cGUpCisJCQl7CisJCWNhc2UgMjA6CisJCQlzdHJfY29udGVudF90eXBlID0gIkNoYW5nZUNpcGhlclNwZWMiOworCQkJYnJlYWs7CisJCWNhc2UgMjE6CisJCQlzdHJfY29udGVudF90eXBlID0gIkFsZXJ0IjsKKwkJCWJyZWFrOworCQljYXNlIDIyOgorCQkJc3RyX2NvbnRlbnRfdHlwZSA9ICJIYW5kc2hha2UiOworCQkJYnJlYWs7CisJCQl9CisKKwkJaWYgKGNvbnRlbnRfdHlwZSA9PSAyMSkgLyogQWxlcnQgKi8KKwkJCXsKKwkJCXN0cl9kZXRhaWxzMSA9ICIsID8/PyI7CisJCQkKKwkJCWlmIChsZW4gPT0gMikKKwkJCQl7CisJCQkJc3dpdGNoICgoKGNvbnN0IHVuc2lnbmVkIGNoYXIqKWJ1ZilbMF0pCisJCQkJCXsKKwkJCQljYXNlIDE6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIHdhcm5pbmciOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIGZhdGFsIjsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCXN0cl9kZXRhaWxzMiA9ICIgPz8/IjsKKwkJCQlzd2l0Y2ggKCgoY29uc3QgdW5zaWduZWQgY2hhciopYnVmKVsxXSkKKwkJCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJc3RyX2RldGFpbHMyID0gIiBjbG9zZV9ub3RpZnkiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDEwOgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIHVuZXhwZWN0ZWRfbWVzc2FnZSI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjA6CisJCQkJCXN0cl9kZXRhaWxzMiA9ICIgYmFkX3JlY29yZF9tYWMiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDIxOgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGRlY3J5cHRpb25fZmFpbGVkIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyMjoKKwkJCQkJc3RyX2RldGFpbHMyID0gIiByZWNvcmRfb3ZlcmZsb3ciOworCQkJCQlicmVhazsKKwkJCQljYXNlIDMwOgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGRlY29tcHJlc3Npb25fZmFpbHVyZSI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDA6CisJCQkJCXN0cl9kZXRhaWxzMiA9ICIgaGFuZHNoYWtlX2ZhaWx1cmUiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQyOgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGJhZF9jZXJ0aWZpY2F0ZSI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNDM6CisJCQkJCXN0cl9kZXRhaWxzMiA9ICIgdW5zdXBwb3J0ZWRfY2VydGlmaWNhdGUiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ0OgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGNlcnRpZmljYXRlX3Jldm9rZWQiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ1OgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGNlcnRpZmljYXRlX2V4cGlyZWQiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ2OgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGNlcnRpZmljYXRlX3Vua25vd24iOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ3OgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGlsbGVnYWxfcGFyYW1ldGVyIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0ODoKKwkJCQkJc3RyX2RldGFpbHMyID0gIiB1bmtub3duX2NhIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OToKKwkJCQkJc3RyX2RldGFpbHMyID0gIiBhY2Nlc3NfZGVuaWVkIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA1MDoKKwkJCQkJc3RyX2RldGFpbHMyID0gIiBkZWNvZGVfZXJyb3IiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDUxOgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGRlY3J5cHRfZXJyb3IiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDYwOgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGV4cG9ydF9yZXN0cmljdGlvbiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNzA6CisJCQkJCXN0cl9kZXRhaWxzMiA9ICIgcHJvdG9jb2xfdmVyc2lvbiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgNzE6CisJCQkJCXN0cl9kZXRhaWxzMiA9ICIgaW5zdWZmaWNpZW50X3NlY3VyaXR5IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA4MDoKKwkJCQkJc3RyX2RldGFpbHMyID0gIiBpbnRlcm5hbF9lcnJvciI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgOTA6CisJCQkJCXN0cl9kZXRhaWxzMiA9ICIgdXNlcl9jYW5jZWxlZCI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTAwOgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIG5vX3JlbmVnb3RpYXRpb24iOworCQkJCQlicmVhazsKKwkJCQljYXNlIDExMDoKKwkJCQkJc3RyX2RldGFpbHMyID0gIiB1bnN1cHBvcnRlZF9leHRlbnNpb24iOworCQkJCQlicmVhazsKKwkJCQljYXNlIDExMToKKwkJCQkJc3RyX2RldGFpbHMyID0gIiBjZXJ0aWZpY2F0ZV91bm9idGFpbmFibGUiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDExMjoKKwkJCQkJc3RyX2RldGFpbHMyID0gIiB1bnJlY29nbml6ZWRfbmFtZSI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTEzOgorCQkJCQlzdHJfZGV0YWlsczIgPSAiIGJhZF9jZXJ0aWZpY2F0ZV9zdGF0dXNfcmVzcG9uc2UiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDExNDoKKwkJCQkJc3RyX2RldGFpbHMyID0gIiBiYWRfY2VydGlmaWNhdGVfaGFzaF92YWx1ZSI7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkKKwkJaWYgKGNvbnRlbnRfdHlwZSA9PSAyMikgLyogSGFuZHNoYWtlICovCisJCQl7CisJCQlzdHJfZGV0YWlsczEgPSAiPz8/IjsKKworCQkJaWYgKGxlbiA+IDApCisJCQkJeworCQkJCXN3aXRjaCAoKChjb25zdCB1bnNpZ25lZCBjaGFyKilidWYpWzBdKQorCQkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlzdHJfZGV0YWlsczEgPSAiLCBIZWxsb1JlcXVlc3QiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIENsaWVudEhlbGxvIjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQlzdHJfZGV0YWlsczEgPSAiLCBTZXJ2ZXJIZWxsbyI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJc3RyX2RldGFpbHMxID0gIiwgSGVsbG9WZXJpZnlSZXF1ZXN0IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxMToKKwkJCQkJc3RyX2RldGFpbHMxID0gIiwgQ2VydGlmaWNhdGUiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDEyOgorCQkJCQlzdHJfZGV0YWlsczEgPSAiLCBTZXJ2ZXJLZXlFeGNoYW5nZSI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTM6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIENlcnRpZmljYXRlUmVxdWVzdCI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTQ6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIFNlcnZlckhlbGxvRG9uZSI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTU6CisJCQkJCXN0cl9kZXRhaWxzMSA9ICIsIENlcnRpZmljYXRlVmVyaWZ5IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxNjoKKwkJCQkJc3RyX2RldGFpbHMxID0gIiwgQ2xpZW50S2V5RXhjaGFuZ2UiOworCQkJCQlicmVhazsKKwkJCQljYXNlIDIwOgorCQkJCQlzdHJfZGV0YWlsczEgPSAiLCBGaW5pc2hlZCI7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwlCSU9fcHJpbnRmKGJpbywgIiVzICVzJXMgW2xlbmd0aCAlMDRseF0lcyVzXG4iLCBzdHJfd3JpdGVfcCwgc3RyX3ZlcnNpb24sIHN0cl9jb250ZW50X3R5cGUsICh1bnNpZ25lZCBsb25nKWxlbiwgc3RyX2RldGFpbHMxLCBzdHJfZGV0YWlsczIpOworCisJaWYgKGxlbiA+IDApCisJCXsKKwkJc2l6ZV90IG51bSwgaTsKKwkJCisJCUJJT19wcmludGYoYmlvLCAiICAgIik7CisJCW51bSA9IGxlbjsKKyNpZiAwCisJCWlmIChudW0gPiAxNikKKwkJCW51bSA9IDE2OworI2VuZGlmCisJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJCXsKKwkJCWlmIChpICUgMTYgPT0gMCAmJiBpID4gMCkKKwkJCQlCSU9fcHJpbnRmKGJpbywgIlxuICAgIik7CisJCQlCSU9fcHJpbnRmKGJpbywgIiAlMDJ4IiwgKChjb25zdCB1bnNpZ25lZCBjaGFyKilidWYpW2ldKTsKKwkJCX0KKwkJaWYgKGkgPCBsZW4pCisJCQlCSU9fcHJpbnRmKGJpbywgIiAuLi4iKTsKKwkJQklPX3ByaW50ZihiaW8sICJcbiIpOworCQl9CisJKHZvaWQpQklPX2ZsdXNoKGJpbyk7CisJfQorCit2b2lkIE1TX0NBTExCQUNLIHRsc2V4dF9jYihTU0wgKnMsIGludCBjbGllbnRfc2VydmVyLCBpbnQgdHlwZSwKKwkJCQkJdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwKKwkJCQkJdm9pZCAqYXJnKQorCXsKKwlCSU8gKmJpbyA9IGFyZzsKKwljaGFyICpleHRuYW1lOworCisJc3dpdGNoKHR5cGUpCisJCXsKKwkJY2FzZSBUTFNFWFRfVFlQRV9zZXJ2ZXJfbmFtZToKKwkJZXh0bmFtZSA9ICJzZXJ2ZXIgbmFtZSI7CisJCWJyZWFrOworCisJCWNhc2UgVExTRVhUX1RZUEVfbWF4X2ZyYWdtZW50X2xlbmd0aDoKKwkJZXh0bmFtZSA9ICJtYXggZnJhZ21lbnQgbGVuZ3RoIjsKKwkJYnJlYWs7CisKKwkJY2FzZSBUTFNFWFRfVFlQRV9jbGllbnRfY2VydGlmaWNhdGVfdXJsOgorCQlleHRuYW1lID0gImNsaWVudCBjZXJ0aWZpY2F0ZSBVUkwiOworCQlicmVhazsKKworCQljYXNlIFRMU0VYVF9UWVBFX3RydXN0ZWRfY2Ffa2V5czoKKwkJZXh0bmFtZSA9ICJ0cnVzdGVkIENBIGtleXMiOworCQlicmVhazsKKworCQljYXNlIFRMU0VYVF9UWVBFX3RydW5jYXRlZF9obWFjOgorCQlleHRuYW1lID0gInRydW5jYXRlZCBITUFDIjsKKwkJYnJlYWs7CisKKwkJY2FzZSBUTFNFWFRfVFlQRV9zdGF0dXNfcmVxdWVzdDoKKwkJZXh0bmFtZSA9ICJzdGF0dXMgcmVxdWVzdCI7CisJCWJyZWFrOworCisJCWNhc2UgVExTRVhUX1RZUEVfZWxsaXB0aWNfY3VydmVzOgorCQlleHRuYW1lID0gImVsbGlwdGljIGN1cnZlcyI7CisJCWJyZWFrOworCisJCWNhc2UgVExTRVhUX1RZUEVfZWNfcG9pbnRfZm9ybWF0czoKKwkJZXh0bmFtZSA9ICJFQyBwb2ludCBmb3JtYXRzIjsKKwkJYnJlYWs7CisKKwkJY2FzZSBUTFNFWFRfVFlQRV9zZXNzaW9uX3RpY2tldDoKKwkJZXh0bmFtZSA9ICJzZXJ2ZXIgdGlja2V0IjsKKwkJYnJlYWs7CisKKwkJY2FzZSBUTFNFWFRfVFlQRV9yZW5lZ290aWF0ZToKKwkJZXh0bmFtZSA9ICJyZW5lZ290aWF0ZSI7CisJCWJyZWFrOworCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorCQljYXNlIFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQ6CisJCWV4dG5hbWUgPSAib3BhcXVlIFBSRiBpbnB1dCI7CisJCWJyZWFrOworI2VuZGlmCisKKwkJZGVmYXVsdDoKKwkJZXh0bmFtZSA9ICJ1bmtub3duIjsKKwkJYnJlYWs7CisKKwkJfQorCQorCUJJT19wcmludGYoYmlvLCAiVExTICVzIGV4dGVuc2lvbiBcIiVzXCIgKGlkPSVkKSwgbGVuPSVkXG4iLAorCQkJY2xpZW50X3NlcnZlciA/ICJzZXJ2ZXIiOiAiY2xpZW50IiwKKwkJCWV4dG5hbWUsIHR5cGUsIGxlbik7CisJQklPX2R1bXAoYmlvLCAoY2hhciAqKWRhdGEsIGxlbik7CisJKHZvaWQpQklPX2ZsdXNoKGJpbyk7CisJfQorCitpbnQgTVNfQ0FMTEJBQ0sgZ2VuZXJhdGVfY29va2llX2NhbGxiYWNrKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICpjb29raWUsIHVuc2lnbmVkIGludCAqY29va2llX2xlbikKKwl7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyLCByZXN1bHRbRVZQX01BWF9NRF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgbGVuZ3RoLCByZXN1bHRsZW5ndGg7CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzNDsKKyNpZiBPUEVOU1NMX1VTRV9JUFY2CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgczY7CisjZW5kaWYKKwl9IHBlZXI7CisKKwkvKiBJbml0aWFsaXplIGEgcmFuZG9tIHNlY3JldCAqLworCWlmICghY29va2llX2luaXRpYWxpemVkKQorCQl7CisJCWlmICghUkFORF9ieXRlcyhjb29raWVfc2VjcmV0LCBDT09LSUVfU0VDUkVUX0xFTkdUSCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHNldHRpbmcgcmFuZG9tIGNvb2tpZSBzZWNyZXRcbiIpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWNvb2tpZV9pbml0aWFsaXplZCA9IDE7CisJCX0KKworCS8qIFJlYWQgcGVlciBpbmZvcm1hdGlvbiAqLworCSh2b2lkKUJJT19kZ3JhbV9nZXRfcGVlcihTU0xfZ2V0X3JiaW8oc3NsKSwgJnBlZXIpOworCisJLyogQ3JlYXRlIGJ1ZmZlciB3aXRoIHBlZXIncyBhZGRyZXNzIGFuZCBwb3J0ICovCisJbGVuZ3RoID0gMDsKKwlzd2l0Y2ggKHBlZXIuc2Euc2FfZmFtaWx5KQorCQl7CisJY2FzZSBBRl9JTkVUOgorCQlsZW5ndGggKz0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJbGVuZ3RoICs9IHNpemVvZihwZWVyLnM0LnNpbl9wb3J0KTsKKwkJYnJlYWs7CisjaWYgT1BFTlNTTF9VU0VfSVBWNgorCWNhc2UgQUZfSU5FVDY6CisJCWxlbmd0aCArPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKKwkJbGVuZ3RoICs9IHNpemVvZihwZWVyLnM2LnNpbjZfcG9ydCk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJT1BFTlNTTF9hc3NlcnQoMCk7CisJCWJyZWFrOworCQl9CisJYnVmZmVyID0gT1BFTlNTTF9tYWxsb2MobGVuZ3RoKTsKKworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gMDsKKwkJfQorCisJc3dpdGNoIChwZWVyLnNhLnNhX2ZhbWlseSkKKwkJeworCWNhc2UgQUZfSU5FVDoKKwkJbWVtY3B5KGJ1ZmZlciwKKwkJICAgICAgICZwZWVyLnM0LnNpbl9wb3J0LAorCQkgICAgICAgc2l6ZW9mKHBlZXIuczQuc2luX3BvcnQpKTsKKwkJbWVtY3B5KGJ1ZmZlciArIHNpemVvZihwZWVyLnM0LnNpbl9wb3J0KSwKKwkJICAgICAgICZwZWVyLnM0LnNpbl9hZGRyLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCWJyZWFrOworI2lmIE9QRU5TU0xfVVNFX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQltZW1jcHkoYnVmZmVyLAorCQkgICAgICAgJnBlZXIuczYuc2luNl9wb3J0LAorCQkgICAgICAgc2l6ZW9mKHBlZXIuczYuc2luNl9wb3J0KSk7CisJCW1lbWNweShidWZmZXIgKyBzaXplb2YocGVlci5zNi5zaW42X3BvcnQpLAorCQkgICAgICAgJnBlZXIuczYuc2luNl9hZGRyLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCU9QRU5TU0xfYXNzZXJ0KDApOworCQlicmVhazsKKwkJfQorCisJLyogQ2FsY3VsYXRlIEhNQUMgb2YgYnVmZmVyIHVzaW5nIHRoZSBzZWNyZXQgKi8KKwlITUFDKEVWUF9zaGExKCksIGNvb2tpZV9zZWNyZXQsIENPT0tJRV9TRUNSRVRfTEVOR1RILAorCSAgICAgYnVmZmVyLCBsZW5ndGgsIHJlc3VsdCwgJnJlc3VsdGxlbmd0aCk7CisJT1BFTlNTTF9mcmVlKGJ1ZmZlcik7CisKKwltZW1jcHkoY29va2llLCByZXN1bHQsIHJlc3VsdGxlbmd0aCk7CisJKmNvb2tpZV9sZW4gPSByZXN1bHRsZW5ndGg7CisKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBNU19DQUxMQkFDSyB2ZXJpZnlfY29va2llX2NhbGxiYWNrKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICpjb29raWUsIHVuc2lnbmVkIGludCBjb29raWVfbGVuKQorCXsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIsIHJlc3VsdFtFVlBfTUFYX01EX1NJWkVdOworCXVuc2lnbmVkIGludCBsZW5ndGgsIHJlc3VsdGxlbmd0aDsKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luIHM0OworI2lmIE9QRU5TU0xfVVNFX0lQVjYKKwkJc3RydWN0IHNvY2thZGRyX2luNiBzNjsKKyNlbmRpZgorCX0gcGVlcjsKKworCS8qIElmIHNlY3JldCBpc24ndCBpbml0aWFsaXplZCB5ZXQsIHRoZSBjb29raWUgY2FuJ3QgYmUgdmFsaWQgKi8KKwlpZiAoIWNvb2tpZV9pbml0aWFsaXplZCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZWFkIHBlZXIgaW5mb3JtYXRpb24gKi8KKwkodm9pZClCSU9fZGdyYW1fZ2V0X3BlZXIoU1NMX2dldF9yYmlvKHNzbCksICZwZWVyKTsKKworCS8qIENyZWF0ZSBidWZmZXIgd2l0aCBwZWVyJ3MgYWRkcmVzcyBhbmQgcG9ydCAqLworCWxlbmd0aCA9IDA7CisJc3dpdGNoIChwZWVyLnNhLnNhX2ZhbWlseSkKKwkJeworCWNhc2UgQUZfSU5FVDoKKwkJbGVuZ3RoICs9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7CisJCWxlbmd0aCArPSBzaXplb2YocGVlci5zNC5zaW5fcG9ydCk7CisJCWJyZWFrOworI2lmIE9QRU5TU0xfVVNFX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlsZW5ndGggKz0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJCWxlbmd0aCArPSBzaXplb2YocGVlci5zNi5zaW42X3BvcnQpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCU9QRU5TU0xfYXNzZXJ0KDApOworCQlicmVhazsKKwkJfQorCWJ1ZmZlciA9IE9QRU5TU0xfbWFsbG9jKGxlbmd0aCk7CisJCisJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2Vyciwib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAwOworCQl9CisKKwlzd2l0Y2ggKHBlZXIuc2Euc2FfZmFtaWx5KQorCQl7CisJY2FzZSBBRl9JTkVUOgorCQltZW1jcHkoYnVmZmVyLAorCQkgICAgICAgJnBlZXIuczQuc2luX3BvcnQsCisJCSAgICAgICBzaXplb2YocGVlci5zNC5zaW5fcG9ydCkpOworCQltZW1jcHkoYnVmZmVyICsgc2l6ZW9mKHBlZXIuczQuc2luX3BvcnQpLAorCQkgICAgICAgJnBlZXIuczQuc2luX2FkZHIsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJYnJlYWs7CisjaWYgT1BFTlNTTF9VU0VfSVBWNgorCWNhc2UgQUZfSU5FVDY6CisJCW1lbWNweShidWZmZXIsCisJCSAgICAgICAmcGVlci5zNi5zaW42X3BvcnQsCisJCSAgICAgICBzaXplb2YocGVlci5zNi5zaW42X3BvcnQpKTsKKwkJbWVtY3B5KGJ1ZmZlciArIHNpemVvZihwZWVyLnM2LnNpbjZfcG9ydCksCisJCSAgICAgICAmcGVlci5zNi5zaW42X2FkZHIsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJT1BFTlNTTF9hc3NlcnQoMCk7CisJCWJyZWFrOworCQl9CisKKwkvKiBDYWxjdWxhdGUgSE1BQyBvZiBidWZmZXIgdXNpbmcgdGhlIHNlY3JldCAqLworCUhNQUMoRVZQX3NoYTEoKSwgY29va2llX3NlY3JldCwgQ09PS0lFX1NFQ1JFVF9MRU5HVEgsCisJICAgICBidWZmZXIsIGxlbmd0aCwgcmVzdWx0LCAmcmVzdWx0bGVuZ3RoKTsKKwlPUEVOU1NMX2ZyZWUoYnVmZmVyKTsKKworCWlmIChjb29raWVfbGVuID09IHJlc3VsdGxlbmd0aCAmJiBtZW1jbXAocmVzdWx0LCBjb29raWUsIHJlc3VsdGxlbmd0aCkgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3NfY2xpZW50LmMgYi9saWIvb3BlbnNzbC9hcHBzL3NfY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkOTBmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvc19jbGllbnQuYwpAQCAtMCwwICsxLDE3OTQgQEAKKy8qIGFwcHMvc19jbGllbnQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDUgTm9raWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIHBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGlzIGRldmVsb3BlZCBieQorICogTm9raWEgQ29ycG9yYXRpb24gYW5kIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlLgorICoKKyAqIFRoZSBDb250cmlidXRpb24sIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZgorICogTm9raWEgQ29ycG9yYXRpb24sIGNvbnNpc3RzIG9mIHRoZSAiUFNLIiAoUHJlLVNoYXJlZCBLZXkpIGNpcGhlcnN1aXRlcworICogc3VwcG9ydCAoc2VlIFJGQyA0Mjc5KSB0byBPcGVuU1NMLgorICoKKyAqIE5vIHBhdGVudCBsaWNlbnNlcyBvciBvdGhlciByaWdodHMgZXhjZXB0IHRob3NlIGV4cHJlc3NseSBzdGF0ZWQgaW4KKyAqIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlIGxpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIGdyYW50ZWQgb3IgcmVjZWl2ZWQKKyAqIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsLCBvciBvdGhlcndpc2UuCisgKgorICogTm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgTm9raWEgdGhhdCB0aGUgQ29udHJpYnV0aW9uIGRvZXMgbm90CisgKiBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IHRoaXJkCisgKiBwYXJ0eSBvciB0aGF0IHRoZSBsaWNlbnNlIHByb3ZpZGVzIHlvdSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHJpZ2h0cworICogdG8gbWFrZSB1c2Ugb2YgdGhlIENvbnRyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELiBJTgorICogQURESVRJT04gVE8gVEhFIERJU0NMQUlNRVJTIElOQ0xVREVEIElOIFRIRSBMSUNFTlNFLCBOT0tJQQorICogU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIEZPUiBDTEFJTVMgQlJPVUdIVCBCWSBZT1UgT1IgQU5ZCisgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKKyAqIE9USEVSV0lTRS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpZmRlZiBPUEVOU1NMX05PX1NURElPCisjZGVmaW5lIEFQUFNfV0lOMTYKKyNlbmRpZgorCisvKiBXaXRoIElQdjYsIGl0IGxvb2tzIGxpa2UgRGlnaXRhbCBoYXMgbWl4ZWQgdXAgdGhlIHByb3BlciBvcmRlciBvZgorICAgcmVjdXJzaXZlIGhlYWRlciBmaWxlIGluY2x1c2lvbiwgcmVzdWx0aW5nIGluIHRoZSBjb21waWxlciBjb21wbGFpbmluZworICAgdGhhdCB1X2ludCBpc24ndCBkZWZpbmVkLCBidXQgb25seSBpZiBfUE9TSVhfQ19TT1VSQ0UgaXMgZGVmaW5lZCwgd2hpY2gKKyAgIGlzIG5lZWRlZCB0byBoYXZlIGZpbGVubygpIGRlY2xhcmVkIGNvcnJlY3RseS4uLiAgU28gbGV0J3MgZGVmaW5lIHVfaW50ICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVNfREVDQykgJiYgIWRlZmluZWQoX19VX0lOVCkKKyNkZWZpbmUgX19VX0lOVAordHlwZWRlZiB1bnNpZ25lZCBpbnQgdV9pbnQ7CisjZW5kaWYKKworI2RlZmluZSBVU0VfU09DS0VUUworI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29jc3AuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSAic19hcHBzLmgiCisjaW5jbHVkZSAidGltZW91dHMuaCIKKworI2lmIChkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgJiYgX19WTVNfVkVSIDwgNzAwMDAwMDApCisvKiBGSU9OQklPIHVzZWQgYXMgYSBzd2l0Y2ggdG8gZW5hYmxlIGlvY3RsLCBhbmQgdGhhdCBpc24ndCBpbiBWTVMgPCA3LjAgKi8KKyN1bmRlZiBGSU9OQklPCisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfQkVPU19SNSkKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cJc19jbGllbnRfbWFpbgorCisvKiNkZWZpbmUgU1NMX0hPU1RfTkFNRQkid3d3Lm5ldHNjYXBlLmNvbSIgKi8KKy8qI2RlZmluZSBTU0xfSE9TVF9OQU1FCSIxOTMuMTE4LjE4Ny4xMDIiICovCisjZGVmaW5lIFNTTF9IT1NUX05BTUUJImxvY2FsaG9zdCIKKworLyojZGVmaW5lIFRFU1RfQ0VSVCAiY2xpZW50LnBlbSIgKi8gLyogbm8gZGVmYXVsdCBjZXJ0LiAqLworCisjdW5kZWYgQlVGU0laWgorI2RlZmluZSBCVUZTSVpaIDEwMjQqOAorCitleHRlcm4gaW50IHZlcmlmeV9kZXB0aDsKK2V4dGVybiBpbnQgdmVyaWZ5X2Vycm9yOworZXh0ZXJuIGludCB2ZXJpZnlfcmV0dXJuX2Vycm9yOworCisjaWZkZWYgRklPTkJJTworc3RhdGljIGludCBjX25iaW89MDsKKyNlbmRpZgorc3RhdGljIGludCBjX1BhdXNlPTA7CitzdGF0aWMgaW50IGNfZGVidWc9MDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK3N0YXRpYyBpbnQgY190bHNleHRkZWJ1Zz0wOworc3RhdGljIGludCBjX3N0YXR1c19yZXE9MDsKKyNlbmRpZgorc3RhdGljIGludCBjX21zZz0wOworc3RhdGljIGludCBjX3Nob3djZXJ0cz0wOworCitzdGF0aWMgdm9pZCBzY191c2FnZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHByaW50X3N0dWZmKEJJTyAqYmVycixTU0wgKmNvbixpbnQgZnVsbCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCitzdGF0aWMgaW50IG9jc3BfcmVzcF9jYihTU0wgKnMsIHZvaWQgKmFyZyk7CisjZW5kaWYKK3N0YXRpYyBCSU8gKmJpb19jX291dD1OVUxMOworc3RhdGljIGludCBjX3F1aWV0PTA7CitzdGF0aWMgaW50IGNfaWduX2VvZj0wOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisvKiBEZWZhdWx0IFBTSyBpZGVudGl0eSBhbmQga2V5ICovCitzdGF0aWMgY2hhciAqcHNrX2lkZW50aXR5PSJDbGllbnRfaWRlbnRpdHkiOworLypjaGFyICpwc2tfa2V5PU5VTEw7ICBieSBkZWZhdWx0IFBTSyBpcyBub3QgdXNlZCAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IHBza19jbGllbnRfY2IoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIGNoYXIgKmlkZW50aXR5LAorCXVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLCB1bnNpZ25lZCBjaGFyICpwc2ssCisJdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKQorCXsKKwl1bnNpZ25lZCBpbnQgcHNrX2xlbiA9IDA7CisJaW50IHJldDsKKyAgICAgICAgQklHTlVNICpibj1OVUxMOworCisJaWYgKGNfZGVidWcpCisJCUJJT19wcmludGYoYmlvX2Nfb3V0LCAicHNrX2NsaWVudF9jYlxuIik7CisJaWYgKCFoaW50KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBubyBTZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlKi8KKwkJaWYgKGNfZGVidWcpCisJCQlCSU9fcHJpbnRmKGJpb19jX291dCwiTlVMTCByZWNlaXZlZCBQU0sgaWRlbnRpdHkgaGludCwgY29udGludWluZyBhbnl3YXlcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY19kZWJ1ZykKKwkJQklPX3ByaW50ZihiaW9fY19vdXQsICJSZWNlaXZlZCBQU0sgaWRlbnRpdHkgaGludCAnJXMnXG4iLCBoaW50KTsKKworCS8qIGxvb2t1cCBQU0sgaWRlbnRpdHkgYW5kIFBTSyBrZXkgYmFzZWQgb24gdGhlIGdpdmVuIGlkZW50aXR5IGhpbnQgaGVyZSAqLworCXJldCA9IEJJT19zbnByaW50ZihpZGVudGl0eSwgbWF4X2lkZW50aXR5X2xlbiwgIiVzIiwgcHNrX2lkZW50aXR5KTsKKwlpZiAocmV0IDwgMCB8fCAodW5zaWduZWQgaW50KXJldCA+IG1heF9pZGVudGl0eV9sZW4pCisJCWdvdG8gb3V0X2VycjsKKwlpZiAoY19kZWJ1ZykKKwkJQklPX3ByaW50ZihiaW9fY19vdXQsICJjcmVhdGVkIGlkZW50aXR5ICclcycgbGVuPSVkXG4iLCBpZGVudGl0eSwgcmV0KTsKKyAgICAgICAgcmV0PUJOX2hleDJibigmYm4sIHBza19rZXkpOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJDb3VsZCBub3QgY29udmVydCBQU0sga2V5ICclcycgdG8gQklHTlVNXG4iLCBwc2tfa2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoYm4pCisgICAgICAgICAgICAgICAgICAgICAgICBCTl9mcmVlKGJuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpQk5fbnVtX2J5dGVzKGJuKSA+IG1heF9wc2tfbGVuKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCSU9fcHJpbnRmKGJpb19lcnIsInBzayBidWZmZXIgb2YgY2FsbGJhY2sgaXMgdG9vIHNtYWxsICglZCkgZm9yIGtleSAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3Bza19sZW4sIEJOX251bV9ieXRlcyhibikpOworICAgICAgICAgICAgICAgIEJOX2ZyZWUoYm4pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICBwc2tfbGVuPUJOX2JuMmJpbihibiwgcHNrKTsKKyAgICAgICAgQk5fZnJlZShibik7CisgICAgICAgIGlmIChwc2tfbGVuID09IDApCisgICAgICAgICAgICAgICAgZ290byBvdXRfZXJyOworCisJaWYgKGNfZGVidWcpCisJCUJJT19wcmludGYoYmlvX2Nfb3V0LCAiY3JlYXRlZCBQU0sgbGVuPSVkXG4iLCBwc2tfbGVuKTsKKworICAgICAgICByZXR1cm4gcHNrX2xlbjsKKyBvdXRfZXJyOgorCWlmIChjX2RlYnVnKQorCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBpbiBQU0sgY2xpZW50IGNhbGxiYWNrXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisJfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNjX3VzYWdlKHZvaWQpCisJeworCUJJT19wcmludGYoYmlvX2VyciwidXNhZ2U6IHNfY2xpZW50IGFyZ3NcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaG9zdCBob3N0ICAgICAtIHVzZSAtY29ubmVjdCBpbnN0ZWFkXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcG9ydCBwb3J0ICAgICAtIHVzZSAtY29ubmVjdCBpbnN0ZWFkXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtY29ubmVjdCBob3N0OnBvcnQgLSB3aG8gdG8gY29ubmVjdCB0byAoZGVmYXVsdCBpcyAlczolcylcbiIsU1NMX0hPU1RfTkFNRSxQT1JUX1NUUik7CisKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtdmVyaWZ5IGFyZyAgIC0gdHVybiBvbiBwZWVyIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvblxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNlcnQgYXJnICAgICAtIGNlcnRpZmljYXRlIGZpbGUgdG8gdXNlLCBQRU0gZm9ybWF0IGFzc3VtZWRcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1jZXJ0Zm9ybSBhcmcgLSBjZXJ0aWZpY2F0ZSBmb3JtYXQgKFBFTSBvciBERVIpIFBFTSBkZWZhdWx0XG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAta2V5IGFyZyAgICAgIC0gUHJpdmF0ZSBrZXkgZmlsZSB0byB1c2UsIGluIGNlcnQgZmlsZSBpZlxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgYnV0IGNlcnQgZmlsZSBpcy5cbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1rZXlmb3JtIGFyZyAgLSBrZXkgZm9ybWF0IChQRU0gb3IgREVSKSBQRU0gZGVmYXVsdFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXBhc3MgYXJnICAgICAtIHByaXZhdGUga2V5IGZpbGUgcGFzcyBwaHJhc2Ugc291cmNlXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtQ0FwYXRoIGFyZyAgIC0gUEVNIGZvcm1hdCBkaXJlY3Rvcnkgb2YgQ0Enc1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLUNBZmlsZSBhcmcgICAtIFBFTSBmb3JtYXQgZmlsZSBvZiBDQSdzXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcmVjb25uZWN0ICAgIC0gRHJvcCBhbmQgcmUtbWFrZSB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBzYW1lIFNlc3Npb24tSURcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1wYXVzZSAgICAgICAgLSBzbGVlcCgxKSBhZnRlciBlYWNoIHJlYWQoMikgYW5kIHdyaXRlKDIpIHN5c3RlbSBjYWxsXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtc2hvd2NlcnRzICAgIC0gc2hvdyBhbGwgY2VydGlmaWNhdGVzIGluIHRoZSBjaGFpblxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWRlYnVnICAgICAgICAtIGV4dHJhIG91dHB1dFxuIik7CisjaWZkZWYgV0FUVDMyCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXdkZWJ1ZyAgICAgICAtIFdBVFQtMzIgdGNwIGRlYnVnZ2luZ1xuIik7CisjZW5kaWYKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbXNnICAgICAgICAgIC0gU2hvdyBwcm90b2NvbCBtZXNzYWdlc1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5iaW9fdGVzdCAgICAtIG1vcmUgc3NsIHByb3RvY29sIHRlc3RpbmdcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zdGF0ZSAgICAgICAgLSBwcmludCB0aGUgJ3NzbCcgc3RhdGVzXG4iKTsKKyNpZmRlZiBGSU9OQklPCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5iaW8gICAgICAgICAtIFJ1biB3aXRoIG5vbi1ibG9ja2luZyBJT1xuIik7CisjZW5kaWYKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtY3JsZiAgICAgICAgIC0gY29udmVydCBMRiBmcm9tIHRlcm1pbmFsIGludG8gQ1JMRlxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXF1aWV0ICAgICAgICAtIG5vIHNfY2xpZW50IG91dHB1dFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWlnbl9lb2YgICAgICAtIGlnbm9yZSBpbnB1dCBlb2YgKGRlZmF1bHQgd2hlbiAtcXVpZXQpXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbm9faWduX2VvZiAgIC0gZG9uJ3QgaWdub3JlIGlucHV0IGVvZlxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXBza19pZGVudGl0eSBhcmcgLSBQU0sgaWRlbnRpdHlcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1wc2sgYXJnICAgICAgLSBQU0sgaW4gaGV4ICh3aXRob3V0IDB4KVxuIik7CisjIGlmbmRlZiBPUEVOU1NMX05PX0pQQUtFCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWpwYWtlIGFyZyAgICAtIEpQQUtFIHNlY3JldCB0byB1c2VcbiIpOworIyBlbmRpZgorI2VuZGlmCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXNzbDIgICAgICAgICAtIGp1c3QgdXNlIFNTTHYyXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtc3NsMyAgICAgICAgIC0ganVzdCB1c2UgU1NMdjNcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC10bHMxICAgICAgICAgLSBqdXN0IHVzZSBUTFN2MVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWR0bHMxICAgICAgICAtIGp1c3QgdXNlIERUTFN2MVxuIik7ICAgIAorCUJJT19wcmludGYoYmlvX2VyciwiIC1tdHUgICAgICAgICAgLSBzZXQgdGhlIGxpbmsgbGF5ZXIgTVRVXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbm9fdGxzMS8tbm9fc3NsMy8tbm9fc3NsMiAtIHR1cm4gb2ZmIHRoYXQgcHJvdG9jb2xcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1idWdzICAgICAgICAgLSBTd2l0Y2ggb24gYWxsIFNTTCBpbXBsZW1lbnRhdGlvbiBidWcgd29ya2Fyb3VuZHNcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zZXJ2ZXJwcmVmICAgLSBVc2Ugc2VydmVyJ3MgY2lwaGVyIHByZWZlcmVuY2VzIChvbmx5IFNTTHYyKVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNpcGhlciAgICAgICAtIHByZWZlcnJlZCBjaXBoZXIgdG8gdXNlLCB1c2UgdGhlICdvcGVuc3NsIGNpcGhlcnMnXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgY29tbWFuZCB0byBzZWUgd2hhdCBpcyBhdmFpbGFibGVcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zdGFydHRscyBwcm90IC0gdXNlIHRoZSBTVEFSVFRMUyBjb21tYW5kIGJlZm9yZSBzdGFydGluZyBUTFNcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBmb3IgdGhvc2UgcHJvdG9jb2xzIHRoYXQgc3VwcG9ydCBpdCwgd2hlcmVcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICAncHJvdCcgZGVmaW5lcyB3aGljaCBvbmUgdG8gYXNzdW1lLiAgQ3VycmVudGx5LFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICAgIG9ubHkgXCJzbXRwXCIsIFwicG9wM1wiLCBcImltYXBcIiwgXCJmdHBcIiBhbmQgXCJ4bXBwXCJcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBhcmUgc3VwcG9ydGVkLlxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWVuZ2luZSBpZCAgICAtIEluaXRpYWxpc2UgYW5kIHVzZSB0aGUgc3BlY2lmaWVkIGVuZ2luZVxuIik7CisjZW5kaWYKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcmFuZCBmaWxlJWNmaWxlJWMuLi5cbiIsIExJU1RfU0VQQVJBVE9SX0NIQVIsIExJU1RfU0VQQVJBVE9SX0NIQVIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zZXNzX291dCBhcmcgLSBmaWxlIHRvIHdyaXRlIFNTTCBzZXNzaW9uIHRvXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtc2Vzc19pbiBhcmcgIC0gZmlsZSB0byByZWFkIFNTTCBzZXNzaW9uIGZyb21cbiIpOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCUJJT19wcmludGYoYmlvX2VyciwiIC1zZXJ2ZXJuYW1lIGhvc3QgIC0gU2V0IFRMUyBleHRlbnNpb24gc2VydmVybmFtZSBpbiBDbGllbnRIZWxsb1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXRsc2V4dGRlYnVnICAgICAgLSBoZXggZHVtcCBvZiBhbGwgVExTIGV4dGVuc2lvbnMgcmVjZWl2ZWRcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zdGF0dXMgICAgICAgICAgIC0gcmVxdWVzdCBjZXJ0aWZpY2F0ZSBzdGF0dXMgZnJvbSBzZXJ2ZXJcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1ub190aWNrZXQgICAgICAgIC0gZGlzYWJsZSB1c2Ugb2YgUkZDNDUwN2JpcyBzZXNzaW9uIHRpY2tldHNcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1jdXR0aHJvdWdoICAgICAgIC0gZW5hYmxlIDEtUlRUIGZ1bGwtaGFuZHNoYWtlIGZvciBzdHJvbmcgY2lwaGVyc1xuIik7CisjZW5kaWYKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbGVnYWN5X3JlbmVnb3RpYXRpb24gLSBlbmFibGUgdXNlIG9mIGxlZ2FjeSByZW5lZ290aWF0aW9uIChkYW5nZXJvdXMpXG4iKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKworLyogVGhpcyBpcyBhIGNvbnRleHQgdGhhdCB3ZSBwYXNzIHRvIGNhbGxiYWNrcyAqLwordHlwZWRlZiBzdHJ1Y3QgdGxzZXh0Y3R4X3N0IHsKKyAgIEJJTyAqIGJpb2RlYnVnOworICAgaW50IGFjazsKK30gdGxzZXh0Y3R4OworCisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgc3NsX3NlcnZlcm5hbWVfY2IoU1NMICpzLCBpbnQgKmFkLCB2b2lkICphcmcpCisJeworCXRsc2V4dGN0eCAqIHAgPSAodGxzZXh0Y3R4ICopIGFyZzsKKwljb25zdCBjaGFyICogaG49IFNTTF9nZXRfc2VydmVybmFtZShzLCBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lKTsKKwlpZiAoU1NMX2dldF9zZXJ2ZXJuYW1lX3R5cGUocykgIT0gLTEpIAorIAkgICAgICAgIHAtPmFjayA9ICFTU0xfc2Vzc2lvbl9yZXVzZWQocykgJiYgaG4gIT0gTlVMTDsKKwllbHNlIAorCQlCSU9fcHJpbnRmKGJpb19lcnIsIkNhbid0IHVzZSBTU0xfZ2V0X3NlcnZlcm5hbWVcbiIpOworCQorCXJldHVybiBTU0xfVExTRVhUX0VSUl9PSzsKKwl9CisjZW5kaWYKKworZW51bQoreworCVBST1RPX09GRgk9IDAsCisJUFJPVE9fU01UUCwKKwlQUk9UT19QT1AzLAorCVBST1RPX0lNQVAsCisJUFJPVE9fRlRQLAorCVBST1RPX1hNUFAKK307CisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJdW5zaWduZWQgaW50IG9mZj0wLCBjbHI9MDsKKwlTU0wgKmNvbj1OVUxMOworCWludCBzLGssd2lkdGgsc3RhdGU9MDsKKwljaGFyICpjYnVmPU5VTEwsKnNidWY9TlVMTCwqbWJ1Zj1OVUxMOworCWludCBjYnVmX2xlbixjYnVmX29mZjsKKwlpbnQgc2J1Zl9sZW4sc2J1Zl9vZmY7CisJZmRfc2V0IHJlYWRmZHMsd3JpdGVmZHM7CisJc2hvcnQgcG9ydD1QT1JUOworCWludCBmdWxsX2xvZz0xOworCWNoYXIgKmhvc3Q9U1NMX0hPU1RfTkFNRTsKKwljaGFyICpjZXJ0X2ZpbGU9TlVMTCwqa2V5X2ZpbGU9TlVMTDsKKwlpbnQgY2VydF9mb3JtYXQgPSBGT1JNQVRfUEVNLCBrZXlfZm9ybWF0ID0gRk9STUFUX1BFTTsKKwljaGFyICpwYXNzYXJnID0gTlVMTCwgKnBhc3MgPSBOVUxMOworCVg1MDkgKmNlcnQgPSBOVUxMOworCUVWUF9QS0VZICprZXkgPSBOVUxMOworCWNoYXIgKkNBcGF0aD1OVUxMLCpDQWZpbGU9TlVMTCwqY2lwaGVyPU5VTEw7CisJaW50IHJlY29ubmVjdD0wLGJhZG9wPTAsdmVyaWZ5PVNTTF9WRVJJRllfTk9ORSxidWdzPTA7CisJaW50IGN1dHRocm91Z2g9MDsKKwlpbnQgY3JsZj0wOworCWludCB3cml0ZV90dHkscmVhZF90dHksd3JpdGVfc3NsLHJlYWRfc3NsLHR0eV9vbixzc2xfcGVuZGluZzsKKwlTU0xfQ1RYICpjdHg9TlVMTDsKKwlpbnQgcmV0PTEsaW5faW5pdD0xLGksbmJpb190ZXN0PTA7CisJaW50IHN0YXJ0dGxzX3Byb3RvID0gUFJPVE9fT0ZGOworCWludCBwcmV4aXQgPSAwOworCVg1MDlfVkVSSUZZX1BBUkFNICp2cG0gPSBOVUxMOworCWludCBiYWRhcmcgPSAwOworCWNvbnN0IFNTTF9NRVRIT0QgKm1ldGg9TlVMTDsKKwlpbnQgc29ja2V0X3R5cGU9U09DS19TVFJFQU07CisJQklPICpzYmlvOworCWNoYXIgKmlucmFuZD1OVUxMOworCWludCBtYnVmX2xlbj0wOworCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQsICp0aW1lb3V0cDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwljaGFyICplbmdpbmVfaWQ9TlVMTDsKKwljaGFyICpzc2xfY2xpZW50X2VuZ2luZV9pZD1OVUxMOworCUVOR0lORSAqc3NsX2NsaWVudF9lbmdpbmU9TlVMTDsKKyNlbmRpZgorCUVOR0lORSAqZT1OVUxMOworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisJc3RydWN0IHRpbWV2YWwgdHY7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TX1I1KQorCWludCBzdGRpbl9zZXQgPSAwOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwljaGFyICpzZXJ2ZXJuYW1lID0gTlVMTDsgCisgICAgICAgIHRsc2V4dGN0eCB0bHNleHRjYnAgPSAKKyAgICAgICAge05VTEwsMH07CisjZW5kaWYKKwljaGFyICpzZXNzX2luID0gTlVMTDsKKwljaGFyICpzZXNzX291dCA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyIHBlZXI7CisJaW50IHBlZXJsZW4gPSBzaXplb2YocGVlcik7CisJaW50IGVuYWJsZV90aW1lb3V0cyA9IDAgOworCWxvbmcgc29ja2V0X210dSA9IDA7CisjaWZuZGVmIE9QRU5TU0xfTk9fSlBBS0UKKwljaGFyICpqcGFrZV9zZWNyZXQgPSBOVUxMOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykKKwltZXRoPVNTTHYyM19jbGllbnRfbWV0aG9kKCk7CisjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDMpCisJbWV0aD1TU0x2M19jbGllbnRfbWV0aG9kKCk7CisjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpCisJbWV0aD1TU0x2Ml9jbGllbnRfbWV0aG9kKCk7CisjZW5kaWYKKworCWFwcHNfc3RhcnR1cCgpOworCWNfUGF1c2U9MDsKKwljX3F1aWV0PTA7CisJY19pZ25fZW9mPTA7CisJY19kZWJ1Zz0wOworCWNfbXNnPTA7CisJY19zaG93Y2VydHM9MDsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWJpb19lcnI9QklPX25ld19mcChzdGRlcnIsQklPX05PQ0xPU0UpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisKKwlpZiAoCSgoY2J1Zj1PUEVOU1NMX21hbGxvYyhCVUZTSVpaKSkgPT0gTlVMTCkgfHwKKwkJKChzYnVmPU9QRU5TU0xfbWFsbG9jKEJVRlNJWlopKSA9PSBOVUxMKSB8fAorCQkoKG1idWY9T1BFTlNTTF9tYWxsb2MoQlVGU0laWikpID09IE5VTEwpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2Vyciwib3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwl2ZXJpZnlfZGVwdGg9MDsKKwl2ZXJpZnlfZXJyb3I9WDUwOV9WX09LOworI2lmZGVmIEZJT05CSU8KKwljX25iaW89MDsKKyNlbmRpZgorCisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmCShzdHJjbXAoKmFyZ3YsIi1ob3N0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWhvc3Q9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcG9ydCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwb3J0PWF0b2koKigrK2FyZ3YpKTsKKwkJCWlmIChwb3J0ID09IDApIGdvdG8gYmFkOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jb25uZWN0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWlmICghZXh0cmFjdF9ob3N0X3BvcnQoKigrK2FyZ3YpLCZob3N0LE5VTEwsJnBvcnQpKQorCQkJCWdvdG8gYmFkOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi12ZXJpZnkiKSA9PSAwKQorCQkJeworCQkJdmVyaWZ5PVNTTF9WRVJJRllfUEVFUjsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXZlcmlmeV9kZXB0aD1hdG9pKCooKythcmd2KSk7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInZlcmlmeSBkZXB0aCBpcyAlZFxuIix2ZXJpZnlfZGVwdGgpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jZXJ0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWNlcnRfZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zZXNzX291dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzZXNzX291dCA9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItc2Vzc19pbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzZXNzX2luID0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jZXJ0Zm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQljZXJ0X2Zvcm1hdCA9IHN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoYXJnc192ZXJpZnkoJmFyZ3YsICZhcmdjLCAmYmFkYXJnLCBiaW9fZXJyLCAmdnBtKSkKKwkJCXsKKwkJCWlmIChiYWRhcmcpCisJCQkJZ290byBiYWQ7CisJCQljb250aW51ZTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdmVyaWZ5X3JldHVybl9lcnJvciIpID09IDApCisJCQl2ZXJpZnlfcmV0dXJuX2Vycm9yID0gMTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcHJleGl0IikgPT0gMCkKKwkJCXByZXhpdD0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jcmxmIikgPT0gMCkKKwkJCWNybGY9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcXVpZXQiKSA9PSAwKQorCQkJeworCQkJY19xdWlldD0xOworCQkJY19pZ25fZW9mPTE7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWlnbl9lb2YiKSA9PSAwKQorCQkJY19pZ25fZW9mPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLW5vX2lnbl9lb2YiKSA9PSAwKQorCQkJY19pZ25fZW9mPTA7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXBhdXNlIikgPT0gMCkKKwkJCWNfUGF1c2U9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItZGVidWciKSA9PSAwKQorCQkJY19kZWJ1Zz0xOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi10bHNleHRkZWJ1ZyIpID09IDApCisJCQljX3Rsc2V4dGRlYnVnPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXN0YXR1cyIpID09IDApCisJCQljX3N0YXR1c19yZXE9MTsKKyNlbmRpZgorI2lmZGVmIFdBVFQzMgorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi13ZGVidWciKSA9PSAwKQorCQkJZGJ1Z19pbml0KCk7CisjZW5kaWYKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbXNnIikgPT0gMCkKKwkJCWNfbXNnPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXNob3djZXJ0cyIpID09IDApCisJCQljX3Nob3djZXJ0cz0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1uYmlvX3Rlc3QiKSA9PSAwKQorCQkJbmJpb190ZXN0PTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXN0YXRlIikgPT0gMCkKKwkJCXN0YXRlPTE7CisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHNrX2lkZW50aXR5IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXBza19pZGVudGl0eT0qKCsrYXJndik7CisJCQl9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHNrIikgPT0gMCkKKwkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBqOworCisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwc2tfa2V5PSooKythcmd2KTsKKwkJCWZvciAoaiA9IDA7IGogPCBzdHJsZW4ocHNrX2tleSk7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXN4ZGlnaXQoKGludClwc2tfa2V5W2pdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCJOb3QgYSBoZXggbnVtYmVyICclcydcbiIsKmFyZ3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zc2wyIikgPT0gMCkKKwkJCW1ldGg9U1NMdjJfY2xpZW50X21ldGhvZCgpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zc2wzIikgPT0gMCkKKwkJCW1ldGg9U1NMdjNfY2xpZW50X21ldGhvZCgpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTMQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi10bHMxIikgPT0gMCkKKwkJCW1ldGg9VExTdjFfY2xpZW50X21ldGhvZCgpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFRMUzEKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItZHRsczEiKSA9PSAwKQorCQkJeworCQkJbWV0aD1EVExTdjFfY2xpZW50X21ldGhvZCgpOworCQkJc29ja2V0X3R5cGU9U09DS19ER1JBTTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdGltZW91dCIpID09IDApCisJCQllbmFibGVfdGltZW91dHM9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbXR1IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNvY2tldF9tdHUgPSBhdG9sKCooKythcmd2KSk7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItYnVncyIpID09IDApCisJCQlidWdzPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWtleWZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJa2V5X2Zvcm1hdCA9IHN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcGFzcyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwYXNzYXJnID0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1rZXkiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJa2V5X2ZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcmVjb25uZWN0IikgPT0gMCkKKwkJCXsKKwkJCXJlY29ubmVjdD01OworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1DQXBhdGgiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJQ0FwYXRoPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLUNBZmlsZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlDQWZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbm9fdGxzMSIpID09IDApCisJCQlvZmZ8PVNTTF9PUF9OT19UTFN2MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbm9fc3NsMyIpID09IDApCisJCQlvZmZ8PVNTTF9PUF9OT19TU0x2MzsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbm9fc3NsMiIpID09IDApCisJCQlvZmZ8PVNTTF9PUF9OT19TU0x2MjsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbm9fY29tcCIpID09IDApCisJCQl7IG9mZnw9U1NMX09QX05PX0NPTVBSRVNTSU9OOyB9CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLW5vX3RpY2tldCIpID09IDApCisJCQl7IG9mZnw9U1NMX09QX05PX1RJQ0tFVDsgfQorI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWN1dHRocm91Z2giKSA9PSAwKQorCQkJY3V0dGhyb3VnaD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zZXJ2ZXJwcmVmIikgPT0gMCkKKwkJCW9mZnw9U1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbGVnYWN5X3JlbmVnb3RpYXRpb24iKSA9PSAwKQorCQkJb2ZmfD1TU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1sZWdhY3lfc2VydmVyX2Nvbm5lY3QiKSA9PSAwKQorCQkJeyBvZmZ8PVNTTF9PUF9MRUdBQ1lfU0VSVkVSX0NPTk5FQ1Q7IH0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbm9fbGVnYWN5X3NlcnZlcl9jb25uZWN0IikgPT0gMCkKKwkJCXsgY2xyfD1TU0xfT1BfTEVHQUNZX1NFUlZFUl9DT05ORUNUOyB9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWNpcGhlciIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQljaXBoZXI9ICooKythcmd2KTsKKwkJCX0KKyNpZmRlZiBGSU9OQklPCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5iaW8iKSA9PSAwKQorCQkJeyBjX25iaW89MTsgfQorI2VuZGlmCisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXN0YXJ0dGxzIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCSsrYXJndjsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsInNtdHAiKSA9PSAwKQorCQkJCXN0YXJ0dGxzX3Byb3RvID0gUFJPVE9fU01UUDsKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwicG9wMyIpID09IDApCisJCQkJc3RhcnR0bHNfcHJvdG8gPSBQUk9UT19QT1AzOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJpbWFwIikgPT0gMCkKKwkJCQlzdGFydHRsc19wcm90byA9IFBST1RPX0lNQVA7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsImZ0cCIpID09IDApCisJCQkJc3RhcnR0bHNfcHJvdG8gPSBQUk9UT19GVFA7CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ4bXBwIikgPT0gMCkKKwkJCQlzdGFydHRsc19wcm90byA9IFBST1RPX1hNUFA7CisJCQllbHNlCisJCQkJZ290byBiYWQ7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWVuZ2luZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQllbmdpbmVfaWQgPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXNzbF9jbGllbnRfZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNzbF9jbGllbnRfZW5naW5lX2lkID0gKigrK2FyZ3YpOworCQkJfQorI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXJhbmQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5yYW5kPSAqKCsrYXJndik7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXNlcnZlcm5hbWUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc2VydmVybmFtZT0gKigrK2FyZ3YpOworCQkJLyogbWV0aD1UTFN2MV9jbGllbnRfbWV0aG9kKCk7ICovCisJCQl9CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19KUEFLRQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1qcGFrZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlqcGFrZV9zZWNyZXQgPSAqKythcmd2OworCQkJfQorI2VuZGlmCisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJXNcbiIsKmFyZ3YpOworCQkJYmFkb3A9MTsKKwkJCWJyZWFrOworCQkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCWlmIChiYWRvcCkKKwkJeworYmFkOgorCQlzY191c2FnZSgpOworCQlnb3RvIGVuZDsKKwkJfQorCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19KUEFLRSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19QU0spCisJaWYgKGpwYWtlX3NlY3JldCkKKwkJeworCQlpZiAocHNrX2tleSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkgICAiQ2FuJ3QgdXNlIEpQQUtFIGFuZCBQU0sgdG9nZXRoZXJcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCXBza19pZGVudGl0eSA9ICJKUEFLRSI7CisJCX0KKworCWlmIChjaXBoZXIpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiSlBBS0Ugc2V0cyBjaXBoZXIgdG8gUFNLXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKwljaXBoZXIgPSAiUFNLIjsKKyNlbmRpZgorCisJT3BlblNTTF9hZGRfc3NsX2FsZ29yaXRobXMoKTsKKwlTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyAgICAgICAgZSA9IHNldHVwX2VuZ2luZShiaW9fZXJyLCBlbmdpbmVfaWQsIDEpOworCWlmIChzc2xfY2xpZW50X2VuZ2luZV9pZCkKKwkJeworCQlzc2xfY2xpZW50X2VuZ2luZSA9IEVOR0lORV9ieV9pZChzc2xfY2xpZW50X2VuZ2luZV9pZCk7CisJCWlmICghc3NsX2NsaWVudF9lbmdpbmUpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCSJFcnJvciBnZXR0aW5nIGNsaWVudCBhdXRoIGVuZ2luZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisjZW5kaWYKKwlpZiAoIWFwcF9wYXNzd2QoYmlvX2VyciwgcGFzc2FyZywgTlVMTCwgJnBhc3MsIE5VTEwpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgcGFzc3dvcmRcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGtleV9maWxlID09IE5VTEwpCisJCWtleV9maWxlID0gY2VydF9maWxlOworCisKKwlpZiAoa2V5X2ZpbGUpCisKKwkJeworCisJCWtleSA9IGxvYWRfa2V5KGJpb19lcnIsIGtleV9maWxlLCBrZXlfZm9ybWF0LCAwLCBwYXNzLCBlLAorCQkJICAgICAgICJjbGllbnQgY2VydGlmaWNhdGUgcHJpdmF0ZSBrZXkgZmlsZSIpOworCQlpZiAoIWtleSkKKwkJCXsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQl9CisKKwlpZiAoY2VydF9maWxlKQorCisJCXsKKwkJY2VydCA9IGxvYWRfY2VydChiaW9fZXJyLGNlcnRfZmlsZSxjZXJ0X2Zvcm1hdCwKKwkJCQlOVUxMLCBlLCAiY2xpZW50IGNlcnRpZmljYXRlIGZpbGUiKTsKKworCQlpZiAoIWNlcnQpCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmICghYXBwX1JBTkRfbG9hZF9maWxlKE5VTEwsIGJpb19lcnIsIDEpICYmIGlucmFuZCA9PSBOVUxMCisJCSYmICFSQU5EX3N0YXR1cygpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2Vyciwid2FybmluZywgbm90IG11Y2ggZXh0cmEgcmFuZG9tIGRhdGEsIGNvbnNpZGVyIHVzaW5nIHRoZSAtcmFuZCBvcHRpb25cbiIpOworCQl9CisJaWYgKGlucmFuZCAhPSBOVUxMKQorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVsZCBzZW1pLXJhbmRvbSBieXRlcyBsb2FkZWRcbiIsCisJCQlhcHBfUkFORF9sb2FkX2ZpbGVzKGlucmFuZCkpOworCisJaWYgKGJpb19jX291dCA9PSBOVUxMKQorCQl7CisJCWlmIChjX3F1aWV0ICYmICFjX2RlYnVnICYmICFjX21zZykKKwkJCXsKKwkJCWJpb19jX291dD1CSU9fbmV3KEJJT19zX251bGwoKSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmIChiaW9fY19vdXQgPT0gTlVMTCkKKwkJCQliaW9fY19vdXQ9QklPX25ld19mcChzdGRvdXQsQklPX05PQ0xPU0UpOworCQkJfQorCQl9CisKKwljdHg9U1NMX0NUWF9uZXcobWV0aCk7CisJaWYgKGN0eCA9PSBOVUxMKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAodnBtKQorCQlTU0xfQ1RYX3NldDFfcGFyYW0oY3R4LCB2cG0pOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYgKHNzbF9jbGllbnRfZW5naW5lKQorCQl7CisJCWlmICghU1NMX0NUWF9zZXRfY2xpZW50X2NlcnRfZW5naW5lKGN0eCwgc3NsX2NsaWVudF9lbmdpbmUpKQorCQkJeworCQkJQklPX3B1dHMoYmlvX2VyciwgIkVycm9yIHNldHRpbmcgY2xpZW50IGF1dGggZW5naW5lXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlFTkdJTkVfZnJlZShzc2xfY2xpZW50X2VuZ2luZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJRU5HSU5FX2ZyZWUoc3NsX2NsaWVudF9lbmdpbmUpOworCQl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworI2lmZGVmIE9QRU5TU0xfTk9fSlBBS0UKKwlpZiAocHNrX2tleSAhPSBOVUxMKQorI2Vsc2UKKwlpZiAocHNrX2tleSAhPSBOVUxMIHx8IGpwYWtlX3NlY3JldCkKKyNlbmRpZgorCQl7CisJCWlmIChjX2RlYnVnKQorCQkJQklPX3ByaW50ZihiaW9fY19vdXQsICJQU0sga2V5IGdpdmVuIG9yIEpQQUtFIGluIHVzZSwgc2V0dGluZyBjbGllbnQgY2FsbGJhY2tcbiIpOworCQlTU0xfQ1RYX3NldF9wc2tfY2xpZW50X2NhbGxiYWNrKGN0eCwgcHNrX2NsaWVudF9jYik7CisJCX0KKyNlbmRpZgorCWlmIChidWdzKQorCQlTU0xfQ1RYX3NldF9vcHRpb25zKGN0eCxTU0xfT1BfQUxMfG9mZik7CisJZWxzZQorCQlTU0xfQ1RYX3NldF9vcHRpb25zKGN0eCxvZmYpOworCisJaWYgKGNscikKKwkJU1NMX0NUWF9jbGVhcl9vcHRpb25zKGN0eCwgY2xyKTsKKwkvKiBEVExTOiBwYXJ0aWFsIHJlYWRzIGVuZCB1cCBkaXNjYXJkaW5nIHVucmVhZCBVRFAgYnl0ZXMgOi0oIAorCSAqIFNldHRpbmcgcmVhZCBhaGVhZCBzb2x2ZXMgdGhpcyBwcm9ibGVtLgorCSAqLworCWlmIChzb2NrZXRfdHlwZSA9PSBTT0NLX0RHUkFNKSBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkKGN0eCwgMSk7CisKKwkvKiBFbmFibGUgaGFuZHNoYWtlIGN1dHRocm91Z2ggZm9yIGNsaWVudCBjb25uZWN0aW9ucyB1c2luZworCSAqIHN0cm9uZyBjaXBoZXJzLiAqLworCWlmIChjdXR0aHJvdWdoKQorCQl7CisJCWludCBzc2xfbW9kZSA9IFNTTF9DVFhfZ2V0X21vZGUoY3R4KTsKKwkJc3NsX21vZGUgfD0gU1NMX01PREVfSEFORFNIQUtFX0NVVFRIUk9VR0g7CisJCVNTTF9DVFhfc2V0X21vZGUoY3R4LCBzc2xfbW9kZSk7CisJCX0KKworCWlmIChzdGF0ZSkgU1NMX0NUWF9zZXRfaW5mb19jYWxsYmFjayhjdHgsYXBwc19zc2xfaW5mb19jYWxsYmFjayk7CisJaWYgKGNpcGhlciAhPSBOVUxMKQorCQlpZighU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY3R4LGNpcGhlcikpIHsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciBzZXR0aW5nIGNpcGhlciBsaXN0XG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJfQorI2lmIDAKKwllbHNlCisJCVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eCxnZXRlbnYoIlNTTF9DSVBIRVIiKSk7CisjZW5kaWYKKworCVNTTF9DVFhfc2V0X3ZlcmlmeShjdHgsdmVyaWZ5LHZlcmlmeV9jYWxsYmFjayk7CisJaWYgKCFzZXRfY2VydF9rZXlfc3R1ZmYoY3R4LGNlcnQsa2V5KSkKKwkJZ290byBlbmQ7CisKKwlpZiAoKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHgsQ0FmaWxlLENBcGF0aCkpIHx8CisJCSghU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoY3R4KSkpCisJCXsKKwkJLyogQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciBzZXR0aW5nIGRlZmF1bHQgdmVyaWZ5IGxvY2F0aW9uc1xuIik7ICovCisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCS8qIGdvdG8gZW5kOyAqLworCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpZiAoc2VydmVybmFtZSAhPSBOVUxMKQorCQl7CisJCXRsc2V4dGNicC5iaW9kZWJ1ZyA9IGJpb19lcnI7CisJCVNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKGN0eCwgc3NsX3NlcnZlcm5hbWVfY2IpOworCQlTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcoY3R4LCAmdGxzZXh0Y2JwKTsKKwkJfQorI2VuZGlmCisKKwljb249U1NMX25ldyhjdHgpOworCWlmIChzZXNzX2luKQorCQl7CisJCVNTTF9TRVNTSU9OICpzZXNzOworCQlCSU8gKnN0bXAgPSBCSU9fbmV3X2ZpbGUoc2Vzc19pbiwgInIiKTsKKwkJaWYgKCFzdG1wKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiQ2FuJ3Qgb3BlbiBzZXNzaW9uIGZpbGUgJXNcbiIsCisJCQkJCQlzZXNzX2luKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJc2VzcyA9IFBFTV9yZWFkX2Jpb19TU0xfU0VTU0lPTihzdG1wLCBOVUxMLCAwLCBOVUxMKTsKKwkJQklPX2ZyZWUoc3RtcCk7CisJCWlmICghc2VzcykKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkNhbid0IG9wZW4gc2Vzc2lvbiBmaWxlICVzXG4iLAorCQkJCQkJc2Vzc19pbik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCVNTTF9zZXRfc2Vzc2lvbihjb24sIHNlc3MpOworCQlTU0xfU0VTU0lPTl9mcmVlKHNlc3MpOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKHNlcnZlcm5hbWUgIT0gTlVMTCkKKwkJeworCQlpZiAoIVNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShjb24sc2VydmVybmFtZSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlVuYWJsZSB0byBzZXQgVExTIHNlcnZlcm5hbWUgZXh0ZW5zaW9uLlxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwlpZiAoY29uICAmJiAgKGNvbi0+a3NzbF9jdHggPSBrc3NsX2N0eF9uZXcoKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga3NzbF9jdHhfc2V0c3RyaW5nKGNvbi0+a3NzbF9jdHgsIEtTU0xfU0VSVkVSLCBob3N0KTsKKwkJfQorI2VuZGlmCS8qIE9QRU5TU0xfTk9fS1JCNSAgKi8KKy8qCVNTTF9zZXRfY2lwaGVyX2xpc3QoY29uLCJSQzQtTUQ1Iik7ICovCisjaWYgMAorI2lmZGVmIFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQKKwlTU0xfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0KGNvbiwgIlRlc3QgY2xpZW50IiwgMTEpOworI2VuZGlmCisjZW5kaWYKKworcmVfc3RhcnQ6CisKKwlpZiAoaW5pdF9jbGllbnQoJnMsaG9zdCxwb3J0LHNvY2tldF90eXBlKSA9PSAwKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiY29ubmVjdDplcnJubz0lZFxuIixnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSk7CisJCVNIVVRET1dOKHMpOworCQlnb3RvIGVuZDsKKwkJfQorCUJJT19wcmludGYoYmlvX2Nfb3V0LCJDT05ORUNURUQoJTA4WClcbiIscyk7CisKKyNpZmRlZiBGSU9OQklPCisJaWYgKGNfbmJpbykKKwkJeworCQl1bnNpZ25lZCBsb25nIGw9MTsKKwkJQklPX3ByaW50ZihiaW9fY19vdXQsInR1cm5pbmcgb24gbm9uIGJsb2NraW5nIGlvXG4iKTsKKwkJaWYgKEJJT19zb2NrZXRfaW9jdGwocyxGSU9OQklPLCZsKSA8IDApCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlpZiAoY19QYXVzZSAmIDB4MDEpIGNvbi0+ZGVidWc9MTsKKworCWlmICggU1NMX3ZlcnNpb24oY29uKSA9PSBEVExTMV9WRVJTSU9OKQorCQl7CisKKwkJc2Jpbz1CSU9fbmV3X2RncmFtKHMsQklPX05PQ0xPU0UpOworCQlpZiAoZ2V0c29ja25hbWUocywgJnBlZXIsICh2b2lkICopJnBlZXJsZW4pIDwgMCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgImdldHNvY2tuYW1lOmVycm5vPSVkXG4iLAorCQkJCWdldF9sYXN0X3NvY2tldF9lcnJvcigpKTsKKwkJCVNIVVRET1dOKHMpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJKHZvaWQpQklPX2N0cmxfc2V0X2Nvbm5lY3RlZChzYmlvLCAxLCAmcGVlcik7CisKKwkJaWYgKGVuYWJsZV90aW1lb3V0cykKKwkJCXsKKwkJCXRpbWVvdXQudHZfc2VjID0gMDsKKwkJCXRpbWVvdXQudHZfdXNlYyA9IERHUkFNX1JDVl9USU1FT1VUOworCQkJQklPX2N0cmwoc2JpbywgQklPX0NUUkxfREdSQU1fU0VUX1JFQ1ZfVElNRU9VVCwgMCwgJnRpbWVvdXQpOworCQkJCisJCQl0aW1lb3V0LnR2X3NlYyA9IDA7CisJCQl0aW1lb3V0LnR2X3VzZWMgPSBER1JBTV9TTkRfVElNRU9VVDsKKwkJCUJJT19jdHJsKHNiaW8sIEJJT19DVFJMX0RHUkFNX1NFVF9TRU5EX1RJTUVPVVQsIDAsICZ0aW1lb3V0KTsKKwkJCX0KKworCQlpZiAoc29ja2V0X210dSA+IDI4KQorCQkJeworCQkJU1NMX3NldF9vcHRpb25zKGNvbiwgU1NMX09QX05PX1FVRVJZX01UVSk7CisJCQlTU0xfc2V0X210dShjb24sIHNvY2tldF9tdHUgLSAyOCk7CisJCQl9CisJCWVsc2UKKwkJCS8qIHdhbnQgdG8gZG8gTVRVIGRpc2NvdmVyeSAqLworCQkJQklPX2N0cmwoc2JpbywgQklPX0NUUkxfREdSQU1fTVRVX0RJU0NPVkVSLCAwLCBOVUxMKTsKKwkJfQorCWVsc2UKKwkJc2Jpbz1CSU9fbmV3X3NvY2tldChzLEJJT19OT0NMT1NFKTsKKworCWlmIChuYmlvX3Rlc3QpCisJCXsKKwkJQklPICp0ZXN0OworCisJCXRlc3Q9QklPX25ldyhCSU9fZl9uYmlvX3Rlc3QoKSk7CisJCXNiaW89QklPX3B1c2godGVzdCxzYmlvKTsKKwkJfQorCisJaWYgKGNfZGVidWcpCisJCXsKKwkJY29uLT5kZWJ1Zz0xOworCQlCSU9fc2V0X2NhbGxiYWNrKHNiaW8sYmlvX2R1bXBfY2FsbGJhY2spOworCQlCSU9fc2V0X2NhbGxiYWNrX2FyZyhzYmlvLChjaGFyICopYmlvX2Nfb3V0KTsKKwkJfQorCWlmIChjX21zZykKKwkJeworCQlTU0xfc2V0X21zZ19jYWxsYmFjayhjb24sIG1zZ19jYik7CisJCVNTTF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhjb24sIGJpb19jX291dCk7CisJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpZiAoY190bHNleHRkZWJ1ZykKKwkJeworCQlTU0xfc2V0X3Rsc2V4dF9kZWJ1Z19jYWxsYmFjayhjb24sIHRsc2V4dF9jYik7CisJCVNTTF9zZXRfdGxzZXh0X2RlYnVnX2FyZyhjb24sIGJpb19jX291dCk7CisJCX0KKwlpZiAoY19zdGF0dXNfcmVxKQorCQl7CisJCVNTTF9zZXRfdGxzZXh0X3N0YXR1c190eXBlKGNvbiwgVExTRVhUX1NUQVRVU1RZUEVfb2NzcCk7CisJCVNTTF9DVFhfc2V0X3Rsc2V4dF9zdGF0dXNfY2IoY3R4LCBvY3NwX3Jlc3BfY2IpOworCQlTU0xfQ1RYX3NldF90bHNleHRfc3RhdHVzX2FyZyhjdHgsIGJpb19jX291dCk7CisjaWYgMAoreworU1RBQ0tfT0YoT0NTUF9SRVNQSUQpICppZHMgPSBza19PQ1NQX1JFU1BJRF9uZXdfbnVsbCgpOworT0NTUF9SRVNQSUQgKmlkID0gT0NTUF9SRVNQSURfbmV3KCk7CitpZC0+dmFsdWUuYnlLZXkgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKK2lkLT50eXBlID0gVl9PQ1NQX1JFU1BJRF9LRVk7CitBU04xX1NUUklOR19zZXQoaWQtPnZhbHVlLmJ5S2V5LCAiSGVsbG8gV29ybGQiLCAtMSk7Citza19PQ1NQX1JFU1BJRF9wdXNoKGlkcywgaWQpOworU1NMX3NldF90bHNleHRfc3RhdHVzX2lkcyhjb24sIGlkcyk7Cit9CisjZW5kaWYKKwkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSlBBS0UKKwlpZiAoanBha2Vfc2VjcmV0KQorCQlqcGFrZV9jbGllbnRfYXV0aChiaW9fY19vdXQsIHNiaW8sIGpwYWtlX3NlY3JldCk7CisjZW5kaWYKKworCVNTTF9zZXRfYmlvKGNvbixzYmlvLHNiaW8pOworCVNTTF9zZXRfY29ubmVjdF9zdGF0ZShjb24pOworCisJLyogb2ssIGxldHMgY29ubmVjdCAqLworCXdpZHRoPVNTTF9nZXRfZmQoY29uKSsxOworCisJcmVhZF90dHk9MTsKKwl3cml0ZV90dHk9MDsKKwl0dHlfb249MDsKKwlyZWFkX3NzbD0xOworCXdyaXRlX3NzbD0xOworCQorCWNidWZfbGVuPTA7CisJY2J1Zl9vZmY9MDsKKwlzYnVmX2xlbj0wOworCXNidWZfb2ZmPTA7CisKKwkvKiBUaGlzIGlzIGFuIHVnbHkgaGFjayB0aGF0IGRvZXMgYSBsb3Qgb2YgYXNzdW1wdGlvbnMgKi8KKwkvKiBXZSBkbyBoYXZlIHRvIGhhbmRsZSBtdWx0aS1saW5lIHJlc3BvbnNlcyB3aGljaCBtYXkgY29tZQorIAkgICBpbiBhIHNpbmdsZSBwYWNrZXQgb3Igbm90LiBXZSB0aGVyZWZvcmUgaGF2ZSB0byB1c2UKKwkgICBCSU9fZ2V0cygpIHdoaWNoIGRvZXMgbmVlZCBhIGJ1ZmZlcmluZyBCSU8uIFNvIGR1cmluZworCSAgIHRoZSBpbml0aWFsIGNoaXRjaGF0IHdlIGRvIHB1c2ggYSBidWZmZXJpbmcgQklPIGludG8gdGhlCisJICAgY2hhaW4gdGhhdCBpcyByZW1vdmVkIGFnYWluIGxhdGVyIG9uIHRvIG5vdCBkaXN0dXJiIHRoZQorCSAgIHJlc3Qgb2YgdGhlIHNfY2xpZW50IG9wZXJhdGlvbi4gKi8KKwlpZiAoc3RhcnR0bHNfcHJvdG8gPT0gUFJPVE9fU01UUCkKKwkJeworCQlpbnQgZm91bmRpdD0wOworCQlCSU8gKmZiaW8gPSBCSU9fbmV3KEJJT19mX2J1ZmZlcigpKTsKKwkJQklPX3B1c2goZmJpbywgc2Jpbyk7CisJCS8qIHdhaXQgZm9yIG11bHRpLWxpbmUgcmVzcG9uc2UgdG8gZW5kIGZyb20gU01UUCAqLworCQlkbworCQkJeworCQkJbWJ1Zl9sZW4gPSBCSU9fZ2V0cyhmYmlvLG1idWYsQlVGU0laWik7CisJCQl9CisJCXdoaWxlIChtYnVmX2xlbj4zICYmIG1idWZbM109PSctJyk7CisJCS8qIFNUQVJUVExTIGNvbW1hbmQgcmVxdWlyZXMgRUhMTy4uLiAqLworCQlCSU9fcHJpbnRmKGZiaW8sIkVITE8gb3BlbnNzbC5jbGllbnQubmV0XHJcbiIpOworCQkodm9pZClCSU9fZmx1c2goZmJpbyk7CisJCS8qIHdhaXQgZm9yIG11bHRpLWxpbmUgcmVzcG9uc2UgdG8gZW5kIEVITE8gU01UUCByZXNwb25zZSAqLworCQlkbworCQkJeworCQkJbWJ1Zl9sZW4gPSBCSU9fZ2V0cyhmYmlvLG1idWYsQlVGU0laWik7CisJCQlpZiAoc3Ryc3RyKG1idWYsIlNUQVJUVExTIikpCisJCQkJZm91bmRpdD0xOworCQkJfQorCQl3aGlsZSAobWJ1Zl9sZW4+MyAmJiBtYnVmWzNdPT0nLScpOworCQkodm9pZClCSU9fZmx1c2goZmJpbyk7CisJCUJJT19wb3AoZmJpbyk7CisJCUJJT19mcmVlKGZiaW8pOworCQlpZiAoIWZvdW5kaXQpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJICAgImRpZG4ndCBmb3VuZCBzdGFydHRscyBpbiBzZXJ2ZXIgcmVzcG9uc2UsIgorCQkJCSAgICIgdHJ5IGFueXdheS4uLlxuIik7CisJCUJJT19wcmludGYoc2JpbywiU1RBUlRUTFNcclxuIik7CisJCUJJT19yZWFkKHNiaW8sc2J1ZixCVUZTSVpaKTsKKwkJfQorCWVsc2UgaWYgKHN0YXJ0dGxzX3Byb3RvID09IFBST1RPX1BPUDMpCisJCXsKKwkJQklPX3JlYWQoc2JpbyxtYnVmLEJVRlNJWlopOworCQlCSU9fcHJpbnRmKHNiaW8sIlNUTFNcclxuIik7CisJCUJJT19yZWFkKHNiaW8sc2J1ZixCVUZTSVpaKTsKKwkJfQorCWVsc2UgaWYgKHN0YXJ0dGxzX3Byb3RvID09IFBST1RPX0lNQVApCisJCXsKKwkJaW50IGZvdW5kaXQ9MDsKKwkJQklPICpmYmlvID0gQklPX25ldyhCSU9fZl9idWZmZXIoKSk7CisJCUJJT19wdXNoKGZiaW8sIHNiaW8pOworCQlCSU9fZ2V0cyhmYmlvLG1idWYsQlVGU0laWik7CisJCS8qIFNUQVJUVExTIGNvbW1hbmQgcmVxdWlyZXMgQ0FQQUJJTElUWS4uLiAqLworCQlCSU9fcHJpbnRmKGZiaW8sIi4gQ0FQQUJJTElUWVxyXG4iKTsKKwkJKHZvaWQpQklPX2ZsdXNoKGZiaW8pOworCQkvKiB3YWl0IGZvciBtdWx0aS1saW5lIENBUEFCSUxJVFkgcmVzcG9uc2UgKi8KKwkJZG8KKwkJCXsKKwkJCW1idWZfbGVuID0gQklPX2dldHMoZmJpbyxtYnVmLEJVRlNJWlopOworCQkJaWYgKHN0cnN0cihtYnVmLCJTVEFSVFRMUyIpKQorCQkJCWZvdW5kaXQ9MTsKKwkJCX0KKwkJd2hpbGUgKG1idWZfbGVuPjMgJiYgbWJ1ZlswXSE9Jy4nKTsKKwkJKHZvaWQpQklPX2ZsdXNoKGZiaW8pOworCQlCSU9fcG9wKGZiaW8pOworCQlCSU9fZnJlZShmYmlvKTsKKwkJaWYgKCFmb3VuZGl0KQorCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSAgICJkaWRuJ3QgZm91bmQgU1RBUlRUTFMgaW4gc2VydmVyIHJlc3BvbnNlLCIKKwkJCQkgICAiIHRyeSBhbnl3YXkuLi5cbiIpOworCQlCSU9fcHJpbnRmKHNiaW8sIi4gU1RBUlRUTFNcclxuIik7CisJCUJJT19yZWFkKHNiaW8sc2J1ZixCVUZTSVpaKTsKKwkJfQorCWVsc2UgaWYgKHN0YXJ0dGxzX3Byb3RvID09IFBST1RPX0ZUUCkKKwkJeworCQlCSU8gKmZiaW8gPSBCSU9fbmV3KEJJT19mX2J1ZmZlcigpKTsKKwkJQklPX3B1c2goZmJpbywgc2Jpbyk7CisJCS8qIHdhaXQgZm9yIG11bHRpLWxpbmUgcmVzcG9uc2UgdG8gZW5kIGZyb20gRlRQICovCisJCWRvCisJCQl7CisJCQltYnVmX2xlbiA9IEJJT19nZXRzKGZiaW8sbWJ1ZixCVUZTSVpaKTsKKwkJCX0KKwkJd2hpbGUgKG1idWZfbGVuPjMgJiYgbWJ1ZlszXT09Jy0nKTsKKwkJKHZvaWQpQklPX2ZsdXNoKGZiaW8pOworCQlCSU9fcG9wKGZiaW8pOworCQlCSU9fZnJlZShmYmlvKTsKKwkJQklPX3ByaW50ZihzYmlvLCJBVVRIIFRMU1xyXG4iKTsKKwkJQklPX3JlYWQoc2JpbyxzYnVmLEJVRlNJWlopOworCQl9CisJaWYgKHN0YXJ0dGxzX3Byb3RvID09IFBST1RPX1hNUFApCisJCXsKKwkJaW50IHNlZW4gPSAwOworCQlCSU9fcHJpbnRmKHNiaW8sIjxzdHJlYW06c3RyZWFtICIKKwkJICAgICJ4bWxuczpzdHJlYW09J2h0dHA6Ly9ldGhlcnguamFiYmVyLm9yZy9zdHJlYW1zJyAiCisJCSAgICAieG1sbnM9J2phYmJlcjpjbGllbnQnIHRvPSclcycgdmVyc2lvbj0nMS4wJz4iLCBob3N0KTsKKwkJc2VlbiA9IEJJT19yZWFkKHNiaW8sbWJ1ZixCVUZTSVpaKTsKKwkJbWJ1ZltzZWVuXSA9IDA7CisJCXdoaWxlICghc3Ryc3RyKG1idWYsICI8c3RhcnR0bHMgeG1sbnM9J3VybjppZXRmOnBhcmFtczp4bWw6bnM6eG1wcC10bHMnIikpCisJCQl7CisJCQlpZiAoc3Ryc3RyKG1idWYsICIvc3RyZWFtOmZlYXR1cmVzPiIpKQorCQkJCWdvdG8gc2h1dDsKKwkJCXNlZW4gPSBCSU9fcmVhZChzYmlvLG1idWYsQlVGU0laWik7CisJCQltYnVmW3NlZW5dID0gMDsKKwkJCX0KKwkJQklPX3ByaW50ZihzYmlvLCAiPHN0YXJ0dGxzIHhtbG5zPSd1cm46aWV0ZjpwYXJhbXM6eG1sOm5zOnhtcHAtdGxzJy8+Iik7CisJCXNlZW4gPSBCSU9fcmVhZChzYmlvLHNidWYsQlVGU0laWik7CisJCXNidWZbc2Vlbl0gPSAwOworCQlpZiAoIXN0cnN0cihzYnVmLCAiPHByb2NlZWQiKSkKKwkJCWdvdG8gc2h1dDsKKwkJbWJ1ZlswXSA9IDA7CisJCX0KKworCWZvciAoOzspCisJCXsKKwkJRkRfWkVSTygmcmVhZGZkcyk7CisJCUZEX1pFUk8oJndyaXRlZmRzKTsKKworCQlpZiAoKFNTTF92ZXJzaW9uKGNvbikgPT0gRFRMUzFfVkVSU0lPTikgJiYKKwkJCURUTFN2MV9nZXRfdGltZW91dChjb24sICZ0aW1lb3V0KSkKKwkJCXRpbWVvdXRwID0gJnRpbWVvdXQ7CisJCWVsc2UKKwkJCXRpbWVvdXRwID0gTlVMTDsKKworCQlpZiAoU1NMX2luX2luaXQoY29uKSAmJiAhU1NMX3RvdGFsX3JlbmVnb3RpYXRpb25zKGNvbikpCisJCQl7CisJCQlpbl9pbml0PTE7CisJCQl0dHlfb249MDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJdHR5X29uPTE7CisJCQlpZiAoaW5faW5pdCkKKwkJCQl7CisJCQkJaW5faW5pdD0wOworI2lmIDAgLyogVGhpcyB0ZXN0IGRvZXNuJ3QgcmVhbGx5IHdvcmsgYXMgaW50ZW5kZWQgKG5lZWRzIHRvIGJlIGZpeGVkKSAqLworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQkJCWlmIChzZXJ2ZXJuYW1lICE9IE5VTEwgJiYgIVNTTF9zZXNzaW9uX3JldXNlZChjb24pKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2Nfb3V0LCJTZXJ2ZXIgZGlkICVzYWNrbm93bGVkZ2Ugc2VydmVybmFtZSBleHRlbnNpb24uXG4iLHRsc2V4dGNicC5hY2s/IiI6Im5vdCAiKTsKKwkJCQkJfQorI2VuZGlmCisjZW5kaWYKKwkJCQlpZiAoc2Vzc19vdXQpCisJCQkJCXsKKwkJCQkJQklPICpzdG1wID0gQklPX25ld19maWxlKHNlc3Nfb3V0LCAidyIpOworCQkJCQlpZiAoc3RtcCkKKwkJCQkJCXsKKwkJCQkJCVBFTV93cml0ZV9iaW9fU1NMX1NFU1NJT04oc3RtcCwgU1NMX2dldF9zZXNzaW9uKGNvbikpOworCQkJCQkJQklPX2ZyZWUoc3RtcCk7CisJCQkJCQl9CisJCQkJCWVsc2UgCisJCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciB3cml0aW5nIHNlc3Npb24gZmlsZSAlc1xuIiwgc2Vzc19vdXQpOworCQkJCQl9CisJCQkJcHJpbnRfc3R1ZmYoYmlvX2Nfb3V0LGNvbixmdWxsX2xvZyk7CisJCQkJaWYgKGZ1bGxfbG9nID4gMCkgZnVsbF9sb2ctLTsKKworCQkJCWlmIChzdGFydHRsc19wcm90bykKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIixtYnVmKTsKKwkJCQkJLyogV2UgZG9uJ3QgbmVlZCB0byBrbm93IGFueSBtb3JlICovCisJCQkJCXN0YXJ0dGxzX3Byb3RvID0gUFJPVE9fT0ZGOworCQkJCQl9CisKKwkJCQlpZiAocmVjb25uZWN0KQorCQkJCQl7CisJCQkJCXJlY29ubmVjdC0tOworCQkJCQlCSU9fcHJpbnRmKGJpb19jX291dCwiZHJvcCBjb25uZWN0aW9uIGFuZCB0aGVuIHJlY29ubmVjdFxuIik7CisJCQkJCVNTTF9zaHV0ZG93bihjb24pOworCQkJCQlTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoY29uKTsKKwkJCQkJU0hVVERPV04oU1NMX2dldF9mZChjb24pKTsKKwkJCQkJZ290byByZV9zdGFydDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQlzc2xfcGVuZGluZyA9IHJlYWRfc3NsICYmIFNTTF9wZW5kaW5nKGNvbik7CisKKwkJaWYgKCFzc2xfcGVuZGluZykKKwkJCXsKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkgJiYgIWRlZmluZWQgKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisJCQlpZiAodHR5X29uKQorCQkJCXsKKwkJCQlpZiAocmVhZF90dHkpICBvcGVuc3NsX2Zkc2V0KGZpbGVubyhzdGRpbiksJnJlYWRmZHMpOworCQkJCWlmICh3cml0ZV90dHkpIG9wZW5zc2xfZmRzZXQoZmlsZW5vKHN0ZG91dCksJndyaXRlZmRzKTsKKwkJCQl9CisJCQlpZiAocmVhZF9zc2wpCisJCQkJb3BlbnNzbF9mZHNldChTU0xfZ2V0X2ZkKGNvbiksJnJlYWRmZHMpOworCQkJaWYgKHdyaXRlX3NzbCkKKwkJCQlvcGVuc3NsX2Zkc2V0KFNTTF9nZXRfZmQoY29uKSwmd3JpdGVmZHMpOworI2Vsc2UKKwkJCWlmKCF0dHlfb24gfHwgIXdyaXRlX3R0eSkgeworCQkJCWlmIChyZWFkX3NzbCkKKwkJCQkJb3BlbnNzbF9mZHNldChTU0xfZ2V0X2ZkKGNvbiksJnJlYWRmZHMpOworCQkJCWlmICh3cml0ZV9zc2wpCisJCQkJCW9wZW5zc2xfZmRzZXQoU1NMX2dldF9mZChjb24pLCZ3cml0ZWZkcyk7CisJCQl9CisjZW5kaWYKKy8qCQkJcHJpbnRmKCJtb2RlIHR0eSglZCAlZCVkKSBzc2woJWQlZClcbiIsCisJCQkJdHR5X29uLHJlYWRfdHR5LHdyaXRlX3R0eSxyZWFkX3NzbCx3cml0ZV9zc2wpOyovCisKKwkJCS8qIE5vdGU6IHVuZGVyIFZNUyB3aXRoIFNPQ0tFVFNIUiB0aGUgc2Vjb25kIHBhcmFtZXRlcgorCQkJICogaXMgY3VycmVudGx5IG9mIHR5cGUgKGludCAqKSB3aGVyZWFzIHVuZGVyIG90aGVyCisJCQkgKiBzeXN0ZW1zIGl0IGlzICh2b2lkICopIGlmIHlvdSBkb24ndCBoYXZlIGEgY2FzdCBpdAorCQkJICogd2lsbCBjaG9rZSB0aGUgY29tcGlsZXI6IGlmIHlvdSBkbyBoYXZlIGEgY2FzdCB0aGVuCisJCQkgKiB5b3UgY2FuIGVpdGhlciBnbyBmb3IgKGludCAqKSBvciAodm9pZCAqKS4KKwkJCSAqLworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuZGVyIFdpbmRvd3MvRE9TIHdlIG1ha2UgdGhlIGFzc3VtcHRpb24gdGhhdCB3ZSBjYW4KKwkJCSAqIGFsd2F5cyB3cml0ZSB0byB0aGUgdHR5OiB0aGVyZWZvcmUgaWYgd2UgbmVlZCB0bworCQkJICogd3JpdGUgdG8gdGhlIHR0eSB3ZSBqdXN0IGZhbGwgdGhyb3VnaC4gT3RoZXJ3aXNlCisJCQkgKiB3ZSB0aW1lb3V0IHRoZSBzZWxlY3QgZXZlcnkgc2Vjb25kIGFuZCBzZWUgaWYgdGhlcmUKKwkJCSAqIGFyZSBhbnkga2V5cHJlc3Nlcy4gTm90ZTogdGhpcyBpcyBhIGhhY2ssIGluIGEgcHJvcGVyCisJCQkgKiBXaW5kb3dzIGFwcGxpY2F0aW9uIHdlIHdvdWxkbid0IGRvIHRoaXMuCisJCQkgKi8KKwkJCWk9MDsKKwkJCWlmKCF3cml0ZV90dHkpIHsKKwkJCQlpZihyZWFkX3R0eSkgeworCQkJCQl0di50dl9zZWMgPSAxOworCQkJCQl0di50dl91c2VjID0gMDsKKwkJCQkJaT1zZWxlY3Qod2lkdGgsKHZvaWQgKikmcmVhZGZkcywodm9pZCAqKSZ3cml0ZWZkcywKKwkJCQkJCSBOVUxMLCZ0dik7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5DRSkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykKKwkJCQkJaWYoIWkgJiYgKCFfa2JoaXQoKSB8fCAhcmVhZF90dHkpICkgY29udGludWU7CisjZWxzZQorCQkJCQlpZighaSAmJiAoISgoX2tiaGl0KCkpIHx8IChXQUlUX09CSkVDVF8wID09IFdhaXRGb3JTaW5nbGVPYmplY3QoR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpLCAwKSkpIHx8ICFyZWFkX3R0eSkgKSBjb250aW51ZTsKKyNlbmRpZgorCQkJCX0gZWxzZSAJaT1zZWxlY3Qod2lkdGgsKHZvaWQgKikmcmVhZGZkcywodm9pZCAqKSZ3cml0ZWZkcywKKwkJCQkJIE5VTEwsdGltZW91dHApOworCQkJfQorI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKQorCQkJaWYoIXdyaXRlX3R0eSkgeworCQkJCWlmKHJlYWRfdHR5KSB7CisJCQkJCXR2LnR2X3NlYyA9IDE7CisJCQkJCXR2LnR2X3VzZWMgPSAwOworCQkJCQlpPXNlbGVjdCh3aWR0aCwodm9pZCAqKSZyZWFkZmRzLCh2b2lkICopJndyaXRlZmRzLAorCQkJCQkJTlVMTCwmdHYpOworCQkJCX0gZWxzZSAJaT1zZWxlY3Qod2lkdGgsKHZvaWQgKikmcmVhZGZkcywodm9pZCAqKSZ3cml0ZWZkcywKKwkJCQkJTlVMTCx0aW1lb3V0cCk7CisJCQl9CisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisJCQkvKiBVbmRlciBCZU9TLVI1IHRoZSBzaXR1YXRpb24gaXMgc2ltaWxhciB0byBET1MgKi8KKwkJCWk9MDsKKwkJCXN0ZGluX3NldCA9IDA7CisJCQkodm9pZClmY250bChmaWxlbm8oc3RkaW4pLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKwkJCWlmKCF3cml0ZV90dHkpIHsKKwkJCQlpZihyZWFkX3R0eSkgeworCQkJCQl0di50dl9zZWMgPSAxOworCQkJCQl0di50dl91c2VjID0gMDsKKwkJCQkJaT1zZWxlY3Qod2lkdGgsKHZvaWQgKikmcmVhZGZkcywodm9pZCAqKSZ3cml0ZWZkcywKKwkJCQkJCSBOVUxMLCZ0dik7CisJCQkJCWlmIChyZWFkKGZpbGVubyhzdGRpbiksIHNidWYsIDApID49IDApCisJCQkJCQlzdGRpbl9zZXQgPSAxOworCQkJCQlpZiAoIWkgJiYgKHN0ZGluX3NldCAhPSAxIHx8ICFyZWFkX3R0eSkpCisJCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgCWk9c2VsZWN0KHdpZHRoLCh2b2lkICopJnJlYWRmZHMsKHZvaWQgKikmd3JpdGVmZHMsCisJCQkJCSBOVUxMLHRpbWVvdXRwKTsKKwkJCX0KKwkJCSh2b2lkKWZjbnRsKGZpbGVubyhzdGRpbiksIEZfU0VURkwsIDApOworI2Vsc2UKKwkJCWk9c2VsZWN0KHdpZHRoLCh2b2lkICopJnJlYWRmZHMsKHZvaWQgKikmd3JpdGVmZHMsCisJCQkJIE5VTEwsdGltZW91dHApOworI2VuZGlmCisJCQlpZiAoIGkgPCAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBzZWxlY3QgJWRcbiIsCisJCQkJZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkpOworCQkJCWdvdG8gc2h1dDsKKwkJCQkvKiBnb3RvIGVuZDsgKi8KKwkJCQl9CisJCQl9CisKKwkJaWYgKChTU0xfdmVyc2lvbihjb24pID09IERUTFMxX1ZFUlNJT04pICYmIERUTFN2MV9oYW5kbGVfdGltZW91dChjb24pID4gMCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiVElNRU9VVCBvY2N1cmVkXG4iKTsKKwkJCX0KKworCQlpZiAoIXNzbF9wZW5kaW5nICYmIEZEX0lTU0VUKFNTTF9nZXRfZmQoY29uKSwmd3JpdGVmZHMpKQorCQkJeworCQkJaz1TU0xfd3JpdGUoY29uLCYoY2J1ZltjYnVmX29mZl0pLAorCQkJCSh1bnNpZ25lZCBpbnQpY2J1Zl9sZW4pOworCQkJc3dpdGNoIChTU0xfZ2V0X2Vycm9yKGNvbixrKSkKKwkJCQl7CisJCQljYXNlIFNTTF9FUlJPUl9OT05FOgorCQkJCWNidWZfb2ZmKz1rOworCQkJCWNidWZfbGVuLT1rOworCQkJCWlmIChrIDw9IDApIGdvdG8gZW5kOworCQkJCS8qIHdlIGhhdmUgZG9uZSBhICB3cml0ZShjb24sTlVMTCwwKTsgKi8KKwkJCQlpZiAoY2J1Zl9sZW4gPD0gMCkKKwkJCQkJeworCQkJCQlyZWFkX3R0eT0xOworCQkJCQl3cml0ZV9zc2w9MDsKKwkJCQkJfQorCQkJCWVsc2UgLyogaWYgKGNidWZfbGVuID4gMCkgKi8KKwkJCQkJeworCQkJCQlyZWFkX3R0eT0wOworCQkJCQl3cml0ZV9zc2w9MTsKKwkJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkJCQlCSU9fcHJpbnRmKGJpb19jX291dCwid3JpdGUgVyBCTE9DS1xuIik7CisJCQkJd3JpdGVfc3NsPTE7CisJCQkJcmVhZF90dHk9MDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKwkJCQlCSU9fcHJpbnRmKGJpb19jX291dCwid3JpdGUgUiBCTE9DS1xuIik7CisJCQkJd3JpdGVfdHR5PTA7CisJCQkJcmVhZF9zc2w9MTsKKwkJCQl3cml0ZV9zc2w9MDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJCQkJQklPX3ByaW50ZihiaW9fY19vdXQsIndyaXRlIFggQkxPQ0tcbiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisJCQkJaWYgKGNidWZfbGVuICE9IDApCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fY19vdXQsInNodXRkb3duXG4iKTsKKwkJCQkJcmV0ID0gMDsKKwkJCQkJZ290byBzaHV0OworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCXJlYWRfdHR5PTE7CisJCQkJCXdyaXRlX3NzbD0wOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQorCQkJY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKwkJCQlpZiAoKGsgIT0gMCkgfHwgKGNidWZfbGVuICE9IDApKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2Vyciwid3JpdGU6ZXJybm89JWRcbiIsCisJCQkJCQlnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSk7CisJCQkJCWdvdG8gc2h1dDsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlyZWFkX3R0eT0xOworCQkJCQl3cml0ZV9zc2w9MDsKKwkJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTU0xfRVJST1JfU1NMOgorCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJZ290byBzaHV0OworCQkJCX0KKwkJCX0KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TX1I1KQorCQkvKiBBc3N1bWUgV2luZG93cy9ET1MvQmVPUyBjYW4gYWx3YXlzIHdyaXRlICovCisJCWVsc2UgaWYgKCFzc2xfcGVuZGluZyAmJiB3cml0ZV90dHkpCisjZWxzZQorCQllbHNlIGlmICghc3NsX3BlbmRpbmcgJiYgRkRfSVNTRVQoZmlsZW5vKHN0ZG91dCksJndyaXRlZmRzKSkKKyNlbmRpZgorCQkJeworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCQlhc2NpaTJlYmNkaWMoJihzYnVmW3NidWZfb2ZmXSksJihzYnVmW3NidWZfb2ZmXSksc2J1Zl9sZW4pOworI2VuZGlmCisJCQlpPXJhd193cml0ZV9zdGRvdXQoJihzYnVmW3NidWZfb2ZmXSksc2J1Zl9sZW4pOworCisJCQlpZiAoaSA8PSAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19jX291dCwiRE9ORVxuIik7CisJCQkJcmV0ID0gMDsKKwkJCQlnb3RvIHNodXQ7CisJCQkJLyogZ290byBlbmQ7ICovCisJCQkJfQorCisJCQlzYnVmX2xlbi09aTs7CisJCQlzYnVmX29mZis9aTsKKwkJCWlmIChzYnVmX2xlbiA8PSAwKQorCQkJCXsKKwkJCQlyZWFkX3NzbD0xOworCQkJCXdyaXRlX3R0eT0wOworCQkJCX0KKwkJCX0KKwkJZWxzZSBpZiAoc3NsX3BlbmRpbmcgfHwgRkRfSVNTRVQoU1NMX2dldF9mZChjb24pLCZyZWFkZmRzKSkKKwkJCXsKKyNpZmRlZiBSRU5FRworeyBzdGF0aWMgaW50IGlpaWk7IGlmICgrK2lpaWkgPT0gNTIpIHsgU1NMX3JlbmVnb3RpYXRlKGNvbik7IGlpaWk9MDsgfSB9CisjZW5kaWYKKyNpZiAxCisJCQlrPVNTTF9yZWFkKGNvbixzYnVmLDEwMjQgLyogQlVGU0laWiAqLyApOworI2Vsc2UKKy8qIERlbW8gZm9yIHBlbmRpbmcgYW5kIHBlZWsgOi0pICovCisJCQlrPVNTTF9yZWFkKGNvbixzYnVmLDE2KTsKK3sgY2hhciB6YnVmWzEwMjQwXTsgCitwcmludGYoInJlYWQ9JWQgcGVuZGluZz0lZCBwZWVrPSVkXG4iLGssU1NMX3BlbmRpbmcoY29uKSxTU0xfcGVlayhjb24semJ1ZiwxMDI0MCkpOworfQorI2VuZGlmCisKKwkJCXN3aXRjaCAoU1NMX2dldF9lcnJvcihjb24saykpCisJCQkJeworCQkJY2FzZSBTU0xfRVJST1JfTk9ORToKKwkJCQlpZiAoayA8PSAwKQorCQkJCQlnb3RvIGVuZDsKKwkJCQlzYnVmX29mZj0wOworCQkJCXNidWZfbGVuPWs7CisKKwkJCQlyZWFkX3NzbD0wOworCQkJCXdyaXRlX3R0eT0xOworCQkJCWJyZWFrOworCQkJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkJCQlCSU9fcHJpbnRmKGJpb19jX291dCwicmVhZCBXIEJMT0NLXG4iKTsKKwkJCQl3cml0ZV9zc2w9MTsKKwkJCQlyZWFkX3R0eT0wOworCQkJCWJyZWFrOworCQkJY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCQkJCUJJT19wcmludGYoYmlvX2Nfb3V0LCJyZWFkIFIgQkxPQ0tcbiIpOworCQkJCXdyaXRlX3R0eT0wOworCQkJCXJlYWRfc3NsPTE7CisJCQkJaWYgKChyZWFkX3R0eSA9PSAwKSAmJiAod3JpdGVfc3NsID09IDApKQorCQkJCQl3cml0ZV9zc2w9MTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJCQkJQklPX3ByaW50ZihiaW9fY19vdXQsInJlYWQgWCBCTE9DS1xuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorCQkJCXJldD1nZXRfbGFzdF9zb2NrZXRfZXJyb3IoKTsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsInJlYWQ6ZXJybm89JWRcbiIscmV0KTsKKwkJCQlnb3RvIHNodXQ7CisJCQljYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKwkJCQlCSU9fcHJpbnRmKGJpb19jX291dCwiY2xvc2VkXG4iKTsKKwkJCQlyZXQ9MDsKKwkJCQlnb3RvIHNodXQ7CisJCQljYXNlIFNTTF9FUlJPUl9TU0w6CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQlnb3RvIHNodXQ7CisJCQkJLyogYnJlYWs7ICovCisJCQkJfQorCQkJfQorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKQorI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOQ0UpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpCisJCWVsc2UgaWYgKF9rYmhpdCgpKQorI2Vsc2UKKwkJZWxzZSBpZiAoKF9rYmhpdCgpKSB8fCAoV0FJVF9PQkpFQ1RfMCA9PSBXYWl0Rm9yU2luZ2xlT2JqZWN0KEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKSwgMCkpKQorI2VuZGlmCisjZWxpZiBkZWZpbmVkIChPUEVOU1NMX1NZU19ORVRXQVJFKQorCQllbHNlIGlmIChfa2JoaXQoKSkKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfQkVPU19SNSkKKwkJZWxzZSBpZiAoc3RkaW5fc2V0KQorI2Vsc2UKKwkJZWxzZSBpZiAoRkRfSVNTRVQoZmlsZW5vKHN0ZGluKSwmcmVhZGZkcykpCisjZW5kaWYKKwkJCXsKKwkJCWlmIChjcmxmKQorCQkJCXsKKwkJCQlpbnQgaiwgbGZfbnVtOworCisJCQkJaT1yYXdfcmVhZF9zdGRpbihjYnVmLEJVRlNJWlovMik7CisJCQkJbGZfbnVtID0gMDsKKwkJCQkvKiBib3RoIGxvb3BzIGFyZSBza2lwcGVkIHdoZW4gaSA8PSAwICovCisJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQkJaWYgKGNidWZbal0gPT0gJ1xuJykKKwkJCQkJCWxmX251bSsrOworCQkJCWZvciAoaiA9IGktMTsgaiA+PSAwOyBqLS0pCisJCQkJCXsKKwkJCQkJY2J1ZltqK2xmX251bV0gPSBjYnVmW2pdOworCQkJCQlpZiAoY2J1ZltqXSA9PSAnXG4nKQorCQkJCQkJeworCQkJCQkJbGZfbnVtLS07CisJCQkJCQlpKys7CisJCQkJCQljYnVmW2orbGZfbnVtXSA9ICdccic7CisJCQkJCQl9CisJCQkJCX0KKwkJCQlhc3NlcnQobGZfbnVtID09IDApOworCQkJCX0KKwkJCWVsc2UKKwkJCQlpPXJhd19yZWFkX3N0ZGluKGNidWYsQlVGU0laWik7CisKKwkJCWlmICgoIWNfaWduX2VvZikgJiYgKChpIDw9IDApIHx8IChjYnVmWzBdID09ICdRJykpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkRPTkVcbiIpOworCQkJCXJldD0wOworCQkJCWdvdG8gc2h1dDsKKwkJCQl9CisKKwkJCWlmICgoIWNfaWduX2VvZikgJiYgKGNidWZbMF0gPT0gJ1InKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJSRU5FR09USUFUSU5HXG4iKTsKKwkJCQlTU0xfcmVuZWdvdGlhdGUoY29uKTsKKwkJCQljYnVmX2xlbj0wOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJY2J1Zl9sZW49aTsKKwkJCQljYnVmX29mZj0wOworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCQkJZWJjZGljMmFzY2lpKGNidWYsIGNidWYsIGkpOworI2VuZGlmCisJCQkJfQorCisJCQl3cml0ZV9zc2w9MTsKKwkJCXJlYWRfdHR5PTA7CisJCQl9CisJCX0KKworCXJldD0wOworc2h1dDoKKwlpZiAoaW5faW5pdCkKKwkJcHJpbnRfc3R1ZmYoYmlvX2Nfb3V0LGNvbixmdWxsX2xvZyk7CisJU1NMX3NodXRkb3duKGNvbik7CisJU0hVVERPV04oU1NMX2dldF9mZChjb24pKTsKK2VuZDoKKwlpZiAoY29uICE9IE5VTEwpCisJCXsKKwkJaWYgKHByZXhpdCAhPSAwKQorCQkJcHJpbnRfc3R1ZmYoYmlvX2Nfb3V0LGNvbiwxKTsKKwkJU1NMX2ZyZWUoY29uKTsKKwkJfQorCWlmIChjdHggIT0gTlVMTCkgU1NMX0NUWF9mcmVlKGN0eCk7CisJaWYgKGNlcnQpCisJCVg1MDlfZnJlZShjZXJ0KTsKKwlpZiAoa2V5KQorCQlFVlBfUEtFWV9mcmVlKGtleSk7CisJaWYgKHBhc3MpCisJCU9QRU5TU0xfZnJlZShwYXNzKTsKKwlpZiAoY2J1ZiAhPSBOVUxMKSB7IE9QRU5TU0xfY2xlYW5zZShjYnVmLEJVRlNJWlopOyBPUEVOU1NMX2ZyZWUoY2J1Zik7IH0KKwlpZiAoc2J1ZiAhPSBOVUxMKSB7IE9QRU5TU0xfY2xlYW5zZShzYnVmLEJVRlNJWlopOyBPUEVOU1NMX2ZyZWUoc2J1Zik7IH0KKwlpZiAobWJ1ZiAhPSBOVUxMKSB7IE9QRU5TU0xfY2xlYW5zZShtYnVmLEJVRlNJWlopOyBPUEVOU1NMX2ZyZWUobWJ1Zik7IH0KKwlpZiAoYmlvX2Nfb3V0ICE9IE5VTEwpCisJCXsKKwkJQklPX2ZyZWUoYmlvX2Nfb3V0KTsKKwkJYmlvX2Nfb3V0PU5VTEw7CisJCX0KKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQorCisKK3N0YXRpYyB2b2lkIHByaW50X3N0dWZmKEJJTyAqYmlvLCBTU0wgKnMsIGludCBmdWxsKQorCXsKKwlYNTA5ICpwZWVyPU5VTEw7CisJY2hhciAqcDsKKwlzdGF0aWMgY29uc3QgY2hhciAqc3BhY2U9IiAgICAgICAgICAgICAgICAiOworCWNoYXIgYnVmW0JVRlNJWl07CisJU1RBQ0tfT0YoWDUwOSkgKnNrOworCVNUQUNLX09GKFg1MDlfTkFNRSkgKnNrMjsKKwljb25zdCBTU0xfQ0lQSEVSICpjOworCVg1MDlfTkFNRSAqeG47CisJaW50IGosaTsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJY29uc3QgQ09NUF9NRVRIT0QgKmNvbXAsICpleHBhbnNpb247CisjZW5kaWYKKworCWlmIChmdWxsKQorCQl7CisJCWludCBnb3RfYV9jaGFpbiA9IDA7CisKKwkJc2s9U1NMX2dldF9wZWVyX2NlcnRfY2hhaW4ocyk7CisJCWlmIChzayAhPSBOVUxMKQorCQkJeworCQkJZ290X2FfY2hhaW4gPSAxOyAvKiB3ZSBkb24ndCBoYXZlIGl0IGZvciBTU0wyICh5ZXQpICovCisKKwkJCUJJT19wcmludGYoYmlvLCItLS1cbkNlcnRpZmljYXRlIGNoYWluXG4iKTsKKwkJCWZvciAoaT0wOyBpPHNrX1g1MDlfbnVtKHNrKTsgaSsrKQorCQkJCXsKKwkJCQlYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoCisJCQkJCXNrX1g1MDlfdmFsdWUoc2ssaSkpLGJ1ZixzaXplb2YgYnVmKTsKKwkJCQlCSU9fcHJpbnRmKGJpbywiJTJkIHM6JXNcbiIsaSxidWYpOworCQkJCVg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKAorCQkJCQlza19YNTA5X3ZhbHVlKHNrLGkpKSxidWYsc2l6ZW9mIGJ1Zik7CisJCQkJQklPX3ByaW50ZihiaW8sIiAgIGk6JXNcbiIsYnVmKTsKKwkJCQlpZiAoY19zaG93Y2VydHMpCisJCQkJCVBFTV93cml0ZV9iaW9fWDUwOShiaW8sc2tfWDUwOV92YWx1ZShzayxpKSk7CisJCQkJfQorCQkJfQorCisJCUJJT19wcmludGYoYmlvLCItLS1cbiIpOworCQlwZWVyPVNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShzKTsKKwkJaWYgKHBlZXIgIT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvLCJTZXJ2ZXIgY2VydGlmaWNhdGVcbiIpOworCQkJaWYgKCEoY19zaG93Y2VydHMgJiYgZ290X2FfY2hhaW4pKSAvKiBSZWR1bmRhbnQgaWYgd2Ugc2hvd2VkIHRoZSB3aG9sZSBjaGFpbiAqLworCQkJCVBFTV93cml0ZV9iaW9fWDUwOShiaW8scGVlcik7CisJCQlYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUocGVlciksCisJCQkJYnVmLHNpemVvZiBidWYpOworCQkJQklPX3ByaW50ZihiaW8sInN1YmplY3Q9JXNcbiIsYnVmKTsKKwkJCVg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHBlZXIpLAorCQkJCWJ1ZixzaXplb2YgYnVmKTsKKwkJCUJJT19wcmludGYoYmlvLCJpc3N1ZXI9JXNcbiIsYnVmKTsKKwkJCX0KKwkJZWxzZQorCQkJQklPX3ByaW50ZihiaW8sIm5vIHBlZXIgY2VydGlmaWNhdGUgYXZhaWxhYmxlXG4iKTsKKworCQlzazI9U1NMX2dldF9jbGllbnRfQ0FfbGlzdChzKTsKKwkJaWYgKChzazIgIT0gTlVMTCkgJiYgKHNrX1g1MDlfTkFNRV9udW0oc2syKSA+IDApKQorCQkJeworCQkJQklPX3ByaW50ZihiaW8sIi0tLVxuQWNjZXB0YWJsZSBjbGllbnQgY2VydGlmaWNhdGUgQ0EgbmFtZXNcbiIpOworCQkJZm9yIChpPTA7IGk8c2tfWDUwOV9OQU1FX251bShzazIpOyBpKyspCisJCQkJeworCQkJCXhuPXNrX1g1MDlfTkFNRV92YWx1ZShzazIsaSk7CisJCQkJWDUwOV9OQU1FX29uZWxpbmUoeG4sYnVmLHNpemVvZihidWYpKTsKKwkJCQlCSU9fd3JpdGUoYmlvLGJ1ZixzdHJsZW4oYnVmKSk7CisJCQkJQklPX3dyaXRlKGJpbywiXG4iLDEpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW8sIi0tLVxuTm8gY2xpZW50IGNlcnRpZmljYXRlIENBIG5hbWVzIHNlbnRcbiIpOworCQkJfQorCQlwPVNTTF9nZXRfc2hhcmVkX2NpcGhlcnMocyxidWYsc2l6ZW9mIGJ1Zik7CisJCWlmIChwICE9IE5VTEwpCisJCQl7CisJCQkvKiBUaGlzIHdvcmtzIG9ubHkgZm9yIFNTTCAyLiAgSW4gbGF0ZXIgcHJvdG9jb2wKKwkJCSAqIHZlcnNpb25zLCB0aGUgY2xpZW50IGRvZXMgbm90IGtub3cgd2hhdCBvdGhlcgorCQkJICogY2lwaGVycyAoaW4gYWRkaXRpb24gdG8gdGhlIG9uZSB0byBiZSB1c2VkCisJCQkgKiBpbiB0aGUgY3VycmVudCBjb25uZWN0aW9uKSB0aGUgc2VydmVyIHN1cHBvcnRzLiAqLworCisJCQlCSU9fcHJpbnRmKGJpbywiLS0tXG5DaXBoZXJzIGNvbW1vbiBiZXR3ZWVuIGJvdGggU1NMIGVuZHBvaW50czpcbiIpOworCQkJaj1pPTA7CisJCQl3aGlsZSAoKnApCisJCQkJeworCQkJCWlmICgqcCA9PSAnOicpCisJCQkJCXsKKwkJCQkJQklPX3dyaXRlKGJpbyxzcGFjZSwxNS1qJTI1KTsKKwkJCQkJaSsrOworCQkJCQlqPTA7CisJCQkJCUJJT193cml0ZShiaW8sKChpJTMpPyIgIjoiXG4iKSwxKTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlCSU9fd3JpdGUoYmlvLHAsMSk7CisJCQkJCWorKzsKKwkJCQkJfQorCQkJCXArKzsKKwkJCQl9CisJCQlCSU9fd3JpdGUoYmlvLCJcbiIsMSk7CisJCQl9CisKKwkJQklPX3ByaW50ZihiaW8sIi0tLVxuU1NMIGhhbmRzaGFrZSBoYXMgcmVhZCAlbGQgYnl0ZXMgYW5kIHdyaXR0ZW4gJWxkIGJ5dGVzXG4iLAorCQkJQklPX251bWJlcl9yZWFkKFNTTF9nZXRfcmJpbyhzKSksCisJCQlCSU9fbnVtYmVyX3dyaXR0ZW4oU1NMX2dldF93YmlvKHMpKSk7CisJCX0KKwlCSU9fcHJpbnRmKGJpbywoKHMtPmhpdCk/Ii0tLVxuUmV1c2VkLCAiOiItLS1cbk5ldywgIikpOworCWM9U1NMX2dldF9jdXJyZW50X2NpcGhlcihzKTsKKwlCSU9fcHJpbnRmKGJpbywiJXMsIENpcGhlciBpcyAlc1xuIiwKKwkJU1NMX0NJUEhFUl9nZXRfdmVyc2lvbihjKSwKKwkJU1NMX0NJUEhFUl9nZXRfbmFtZShjKSk7CisJaWYgKHBlZXIgIT0gTlVMTCkgeworCQlFVlBfUEtFWSAqcGt0bXA7CisJCXBrdG1wID0gWDUwOV9nZXRfcHVia2V5KHBlZXIpOworCQlCSU9fcHJpbnRmKGJpbywiU2VydmVyIHB1YmxpYyBrZXkgaXMgJWQgYml0XG4iLAorCQkJCQkJCSBFVlBfUEtFWV9iaXRzKHBrdG1wKSk7CisJCUVWUF9QS0VZX2ZyZWUocGt0bXApOworCX0KKwlCSU9fcHJpbnRmKGJpbywgIlNlY3VyZSBSZW5lZ290aWF0aW9uIElTJXMgc3VwcG9ydGVkXG4iLAorCQkJU1NMX2dldF9zZWN1cmVfcmVuZWdvdGlhdGlvbl9zdXBwb3J0KHMpID8gIiIgOiAiIE5PVCIpOworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwljb21wPVNTTF9nZXRfY3VycmVudF9jb21wcmVzc2lvbihzKTsKKwlleHBhbnNpb249U1NMX2dldF9jdXJyZW50X2V4cGFuc2lvbihzKTsKKwlCSU9fcHJpbnRmKGJpbywiQ29tcHJlc3Npb246ICVzXG4iLAorCQljb21wID8gU1NMX0NPTVBfZ2V0X25hbWUoY29tcCkgOiAiTk9ORSIpOworCUJJT19wcmludGYoYmlvLCJFeHBhbnNpb246ICVzXG4iLAorCQlleHBhbnNpb24gPyBTU0xfQ09NUF9nZXRfbmFtZShleHBhbnNpb24pIDogIk5PTkUiKTsKKyNlbmRpZgorCVNTTF9TRVNTSU9OX3ByaW50KGJpbyxTU0xfZ2V0X3Nlc3Npb24ocykpOworCUJJT19wcmludGYoYmlvLCItLS1cbiIpOworCWlmIChwZWVyICE9IE5VTEwpCisJCVg1MDlfZnJlZShwZWVyKTsKKwkvKiBmbHVzaCwgb3IgZGVidWdnaW5nIG91dHB1dCBnZXRzIG1peGVkIHdpdGggaHR0cCByZXNwb25zZSAqLworCSh2b2lkKUJJT19mbHVzaChiaW8pOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCitzdGF0aWMgaW50IG9jc3BfcmVzcF9jYihTU0wgKnMsIHZvaWQgKmFyZykKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgbGVuOworCU9DU1BfUkVTUE9OU0UgKnJzcDsKKwlsZW4gPSBTU0xfZ2V0X3Rsc2V4dF9zdGF0dXNfb2NzcF9yZXNwKHMsICZwKTsKKwlCSU9fcHV0cyhhcmcsICJPQ1NQIHJlc3BvbnNlOiAiKTsKKwlpZiAoIXApCisJCXsKKwkJQklPX3B1dHMoYXJnLCAibm8gcmVzcG9uc2Ugc2VudFxuIik7CisJCXJldHVybiAxOworCQl9CisJcnNwID0gZDJpX09DU1BfUkVTUE9OU0UoTlVMTCwgJnAsIGxlbik7CisJaWYgKCFyc3ApCisJCXsKKwkJQklPX3B1dHMoYXJnLCAicmVzcG9uc2UgcGFyc2UgZXJyb3JcbiIpOworCQlCSU9fZHVtcF9pbmRlbnQoYXJnLCAoY2hhciAqKXAsIGxlbiwgNCk7CisJCXJldHVybiAwOworCQl9CisJQklPX3B1dHMoYXJnLCAiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisJT0NTUF9SRVNQT05TRV9wcmludChhcmcsIHJzcCwgMCk7CisJQklPX3B1dHMoYXJnLCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCU9DU1BfUkVTUE9OU0VfZnJlZShyc3ApOworCXJldHVybiAxOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3Nfc2VydmVyLmMgYi9saWIvb3BlbnNzbC9hcHBzL3Nfc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEwNmQxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvc19zZXJ2ZXIuYwpAQCAtMCwwICsxLDI2OTEgQEAKKy8qIGFwcHMvc19zZXJ2ZXIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogRUNDIGNpcGhlciBzdWl0ZSBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDA1IE5va2lhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBwb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBpcyBkZXZlbG9wZWQgYnkKKyAqIE5va2lhIENvcnBvcmF0aW9uIGFuZCBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZS4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uLCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWlrYSBLb3VzYSBhbmQgUGFzaSBFcm9uZW4gb2YKKyAqIE5va2lhIENvcnBvcmF0aW9uLCBjb25zaXN0cyBvZiB0aGUgIlBTSyIgKFByZS1TaGFyZWQgS2V5KSBjaXBoZXJzdWl0ZXMKKyAqIHN1cHBvcnQgKHNlZSBSRkMgNDI3OSkgdG8gT3BlblNTTC4KKyAqCisgKiBObyBwYXRlbnQgbGljZW5zZXMgb3Igb3RoZXIgcmlnaHRzIGV4Y2VwdCB0aG9zZSBleHByZXNzbHkgc3RhdGVkIGluCisgKiB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZSBsaWNlbnNlIHNoYWxsIGJlIGRlZW1lZCBncmFudGVkIG9yIHJlY2VpdmVkCisgKiBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCwgb3Igb3RoZXJ3aXNlLgorICoKKyAqIE5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IE5va2lhIHRoYXQgdGhlIENvbnRyaWJ1dGlvbiBkb2VzIG5vdAorICogaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSB0aGlyZAorICogcGFydHkgb3IgdGhhdCB0aGUgbGljZW5zZSBwcm92aWRlcyB5b3Ugd2l0aCBhbGwgdGhlIG5lY2Vzc2FyeSByaWdodHMKKyAqIHRvIG1ha2UgdXNlIG9mIHRoZSBDb250cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORC4gSU4KKyAqIEFERElUSU9OIFRPIFRIRSBESVNDTEFJTUVSUyBJTkNMVURFRCBJTiBUSEUgTElDRU5TRSwgTk9LSUEKKyAqIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBGT1IgQ0xBSU1TIEJST1VHSFQgQlkgWU9VIE9SIEFOWQorICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCisgKiBPVEhFUldJU0UuCisgKi8KKworLyogVW50aWwgdGhlIGtleS1nZW4gY2FsbGJhY2tzIGFyZSBtb2RpZmllZCB0byB1c2UgbmV3ZXIgcHJvdG90eXBlcywgd2UgYWxsb3cKKyAqIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGZvciBvcGVuc3NsLWludGVybmFsIGNvZGUgKi8KKyNpZmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyN1bmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorI2lmZGVmIE9QRU5TU0xfTk9fU1RESU8KKyNkZWZpbmUgQVBQU19XSU4xNgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAgLyogY29uZmxpY3RzIHdpdGggd2luc29jazIgc3R1ZmYgb24gbmV0d2FyZSAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKy8qIFdpdGggSVB2NiwgaXQgbG9va3MgbGlrZSBEaWdpdGFsIGhhcyBtaXhlZCB1cCB0aGUgcHJvcGVyIG9yZGVyIG9mCisgICByZWN1cnNpdmUgaGVhZGVyIGZpbGUgaW5jbHVzaW9uLCByZXN1bHRpbmcgaW4gdGhlIGNvbXBpbGVyIGNvbXBsYWluaW5nCisgICB0aGF0IHVfaW50IGlzbid0IGRlZmluZWQsIGJ1dCBvbmx5IGlmIF9QT1NJWF9DX1NPVVJDRSBpcyBkZWZpbmVkLCB3aGljaAorICAgaXMgbmVlZGVkIHRvIGhhdmUgZmlsZW5vKCkgZGVjbGFyZWQgY29ycmVjdGx5Li4uICBTbyBsZXQncyBkZWZpbmUgdV9pbnQgKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNU19ERUNDKSAmJiAhZGVmaW5lZChfX1VfSU5UKQorI2RlZmluZSBfX1VfSU5UCit0eXBlZGVmIHVuc2lnbmVkIGludCB1X2ludDsKKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNkZWZpbmUgVVNFX1NPQ0tFVFMKKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vY3NwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisjaW5jbHVkZSAic19hcHBzLmgiCisjaW5jbHVkZSAidGltZW91dHMuaCIKKworI2lmIChkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgJiYgX19WTVNfVkVSIDwgNzAwMDAwMDApCisvKiBGSU9OQklPIHVzZWQgYXMgYSBzd2l0Y2ggdG8gZW5hYmxlIGlvY3RsLCBhbmQgdGhhdCBpc24ndCBpbiBWTVMgPCA3LjAgKi8KKyN1bmRlZiBGSU9OQklPCisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfQkVPU19SNSkKKyNpbmNsdWRlIDxmY250bC5oPgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK3N0YXRpYyBSU0EgTVNfQ0FMTEJBQ0sgKnRtcF9yc2FfY2IoU1NMICpzLCBpbnQgaXNfZXhwb3J0LCBpbnQga2V5bGVuZ3RoKTsKKyNlbmRpZgorc3RhdGljIGludCBzdl9ib2R5KGNoYXIgKmhvc3RuYW1lLCBpbnQgcywgdW5zaWduZWQgY2hhciAqY29udGV4dCk7CitzdGF0aWMgaW50IHd3d19ib2R5KGNoYXIgKmhvc3RuYW1lLCBpbnQgcywgdW5zaWduZWQgY2hhciAqY29udGV4dCk7CitzdGF0aWMgdm9pZCBjbG9zZV9hY2NlcHRfc29ja2V0KHZvaWQgKTsKK3N0YXRpYyB2b2lkIHN2X3VzYWdlKHZvaWQpOworc3RhdGljIGludCBpbml0X3NzbF9jb25uZWN0aW9uKFNTTCAqcyk7CitzdGF0aWMgdm9pZCBwcmludF9zdGF0cyhCSU8gKmJwLFNTTF9DVFggKmN0eCk7CitzdGF0aWMgaW50IGdlbmVyYXRlX3Nlc3Npb25faWQoY29uc3QgU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKmlkLAorCQkJCXVuc2lnbmVkIGludCAqaWRfbGVuKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorc3RhdGljIERIICpsb2FkX2RoX3BhcmFtKGNvbnN0IGNoYXIgKmRoZmlsZSk7CitzdGF0aWMgREggKmdldF9kaDUxMih2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgTU9OT0xJVEgKK3N0YXRpYyB2b2lkIHNfc2VydmVyX2luaXQodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICitzdGF0aWMgdW5zaWduZWQgY2hhciBkaDUxMl9wW109eworCTB4REEsMHg1OCwweDNDLDB4MTYsMHhEOSwweDg1LDB4MjIsMHg4OSwweEQwLDB4RTQsMHhBRiwweDc1LAorCTB4NkYsMHg0QywweENBLDB4OTIsMHhERCwweDRCLDB4RTUsMHgzMywweEI4LDB4MDQsMHhGQiwweDBGLAorCTB4RUQsMHg5NCwweEVGLDB4OUMsMHg4QSwweDQ0LDB4MDMsMHhFRCwweDU3LDB4NDYsMHg1MCwweEQzLAorCTB4NjksMHg5OSwweERCLDB4MjksMHhENywweDc2LDB4MjcsMHg2QiwweEEyLDB4RDMsMHhENCwweDEyLAorCTB4RTIsMHgxOCwweEY0LDB4REQsMHgxRSwweDA4LDB4NEMsMHhGNiwweEQ4LDB4MDAsMHgzRSwweDdDLAorCTB4NDcsMHg3NCwweEU4LDB4MzMsCisJfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRoNTEyX2dbXT17CisJMHgwMiwKKwl9OworCitzdGF0aWMgREggKmdldF9kaDUxMih2b2lkKQorCXsKKwlESCAqZGg9TlVMTDsKKworCWlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlkaC0+cD1CTl9iaW4yYm4oZGg1MTJfcCxzaXplb2YoZGg1MTJfcCksTlVMTCk7CisJZGgtPmc9Qk5fYmluMmJuKGRoNTEyX2csc2l6ZW9mKGRoNTEyX2cpLE5VTEwpOworCWlmICgoZGgtPnAgPT0gTlVMTCkgfHwgKGRoLT5nID09IE5VTEwpKQorCQlyZXR1cm4oTlVMTCk7CisJcmV0dXJuKGRoKTsKKwl9CisjZW5kaWYKKworCisvKiBzdGF0aWMgaW50IGxvYWRfQ0EoU1NMX0NUWCAqY3R4LCBjaGFyICpmaWxlKTsqLworCisjdW5kZWYgQlVGU0laWgorI2RlZmluZSBCVUZTSVpaCTE2KjEwMjQKK3N0YXRpYyBpbnQgYnVmc2l6ZT1CVUZTSVpaOworc3RhdGljIGludCBhY2NlcHRfc29ja2V0PSAtMTsKKworI2RlZmluZSBURVNUX0NFUlQJInNlcnZlci5wZW0iCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisjZGVmaW5lIFRFU1RfQ0VSVDIJInNlcnZlcjIucGVtIgorI2VuZGlmCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCQlzX3NlcnZlcl9tYWluCisKK2V4dGVybiBpbnQgdmVyaWZ5X2RlcHRoLCB2ZXJpZnlfcmV0dXJuX2Vycm9yOworCitzdGF0aWMgY2hhciAqY2lwaGVyPU5VTEw7CitzdGF0aWMgaW50IHNfc2VydmVyX3ZlcmlmeT1TU0xfVkVSSUZZX05PTkU7CitzdGF0aWMgaW50IHNfc2VydmVyX3Nlc3Npb25faWRfY29udGV4dCA9IDE7IC8qIGFueXRoaW5nIHdpbGwgZG8gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpzX2NlcnRfZmlsZT1URVNUX0NFUlQsKnNfa2V5X2ZpbGU9TlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK3N0YXRpYyBjb25zdCBjaGFyICpzX2NlcnRfZmlsZTI9VEVTVF9DRVJUMiwqc19rZXlfZmlsZTI9TlVMTDsKKyNlbmRpZgorc3RhdGljIGNoYXIgKnNfZGNlcnRfZmlsZT1OVUxMLCpzX2RrZXlfZmlsZT1OVUxMOworI2lmZGVmIEZJT05CSU8KK3N0YXRpYyBpbnQgc19uYmlvPTA7CisjZW5kaWYKK3N0YXRpYyBpbnQgc19uYmlvX3Rlc3Q9MDsKK2ludCBzX2NybGY9MDsKK3N0YXRpYyBTU0xfQ1RYICpjdHg9TlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK3N0YXRpYyBTU0xfQ1RYICpjdHgyPU5VTEw7CisjZW5kaWYKK3N0YXRpYyBpbnQgd3d3PTA7CisKK3N0YXRpYyBCSU8gKmJpb19zX291dD1OVUxMOworc3RhdGljIGludCBzX2RlYnVnPTA7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCitzdGF0aWMgaW50IHNfdGxzZXh0ZGVidWc9MDsKK3N0YXRpYyBpbnQgc190bHNleHRzdGF0dXM9MDsKK3N0YXRpYyBpbnQgY2VydF9zdGF0dXNfY2IoU1NMICpzLCB2b2lkICphcmcpOworI2VuZGlmCitzdGF0aWMgaW50IHNfbXNnPTA7CitzdGF0aWMgaW50IHNfcXVpZXQ9MDsKKworc3RhdGljIGludCBoYWNrPTA7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitzdGF0aWMgY2hhciAqZW5naW5lX2lkPU5VTEw7CisjZW5kaWYKK3N0YXRpYyBjb25zdCBjaGFyICpzZXNzaW9uX2lkX3ByZWZpeD1OVUxMOworCitzdGF0aWMgaW50IGVuYWJsZV90aW1lb3V0cyA9IDA7CitzdGF0aWMgbG9uZyBzb2NrZXRfbXR1OworI2lmbmRlZiBPUEVOU1NMX05PX0RUTFMxCitzdGF0aWMgaW50IGNlcnRfY2hhaW4gPSAwOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKK3N0YXRpYyBjaGFyICpwc2tfaWRlbnRpdHk9IkNsaWVudF9pZGVudGl0eSI7CitjaGFyICpwc2tfa2V5PU5VTEw7IC8qIGJ5IGRlZmF1bHQgUFNLIGlzIG5vdCB1c2VkICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHNrX3NlcnZlcl9jYihTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCisJdW5zaWduZWQgY2hhciAqcHNrLCB1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pCisJeworCXVuc2lnbmVkIGludCBwc2tfbGVuID0gMDsKKwlpbnQgcmV0OworCUJJR05VTSAqYm4gPSBOVUxMOworCisJaWYgKHNfZGVidWcpCisJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJwc2tfc2VydmVyX2NiXG4iKTsKKwlpZiAoIWlkZW50aXR5KQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiRXJyb3I6IGNsaWVudCBkaWQgbm90IHNlbmQgUFNLIGlkZW50aXR5XG4iKTsKKwkJZ290byBvdXRfZXJyOworCQl9CisJaWYgKHNfZGVidWcpCisJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJpZGVudGl0eV9sZW49JWQgaWRlbnRpdHk9JXNcbiIsCisJCQlpZGVudGl0eSA/IChpbnQpc3RybGVuKGlkZW50aXR5KSA6IDAsIGlkZW50aXR5KTsKKworCS8qIGhlcmUgd2UgY291bGQgbG9va3VwIHRoZSBnaXZlbiBpZGVudGl0eSBlLmcuIGZyb20gYSBkYXRhYmFzZSAqLworICAJaWYgKHN0cmNtcChpZGVudGl0eSwgcHNrX2lkZW50aXR5KSAhPSAwKQorCQl7CisgICAgICAgICAgICAgICAgQklPX3ByaW50ZihiaW9fc19vdXQsICJQU0sgZXJyb3I6IGNsaWVudCBpZGVudGl0eSBub3QgZm91bmQiCisJCQkgICAiIChnb3QgJyVzJyBleHBlY3RlZCAnJXMnKVxuIiwgaWRlbnRpdHksCisJCQkgICBwc2tfaWRlbnRpdHkpOworCQlnb3RvIG91dF9lcnI7CisgICAgICAgICAgICAgICAgfQorCWlmIChzX2RlYnVnKQorCQlCSU9fcHJpbnRmKGJpb19zX291dCwgIlBTSyBjbGllbnQgaWRlbnRpdHkgZm91bmRcbiIpOworCisJLyogY29udmVydCB0aGUgUFNLIGtleSB0byBiaW5hcnkgKi8KKwlyZXQgPSBCTl9oZXgyYm4oJmJuLCBwc2tfa2V5KTsKKwlpZiAoIXJldCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIkNvdWxkIG5vdCBjb252ZXJ0IFBTSyBrZXkgJyVzJyB0byBCSUdOVU1cbiIsIHBza19rZXkpOworCQlpZiAoYm4pCisJCQlCTl9mcmVlKGJuKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoQk5fbnVtX2J5dGVzKGJuKSA+IChpbnQpbWF4X3Bza19sZW4pCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJwc2sgYnVmZmVyIG9mIGNhbGxiYWNrIGlzIHRvbyBzbWFsbCAoJWQpIGZvciBrZXkgKCVkKVxuIiwKKwkJCW1heF9wc2tfbGVuLCBCTl9udW1fYnl0ZXMoYm4pKTsKKwkJQk5fZnJlZShibik7CisJCXJldHVybiAwOworCQl9CisKKwlyZXQgPSBCTl9ibjJiaW4oYm4sIHBzayk7CisJQk5fZnJlZShibik7CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZXJyOworCXBza19sZW4gPSAodW5zaWduZWQgaW50KXJldDsKKworCWlmIChzX2RlYnVnKQorCQlCSU9fcHJpbnRmKGJpb19zX291dCwgImZldGNoZWQgUFNLIGxlbj0lZFxuIiwgcHNrX2xlbik7CisgICAgICAgIHJldHVybiBwc2tfbGVuOworIG91dF9lcnI6CisJaWYgKHNfZGVidWcpCisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGluIFBTSyBzZXJ2ZXIgY2FsbGJhY2tcbiIpOworCXJldHVybiAwOworICAgICAgICB9CisjZW5kaWYKKworI2lmZGVmIE1PTk9MSVRICitzdGF0aWMgdm9pZCBzX3NlcnZlcl9pbml0KHZvaWQpCisJeworCWFjY2VwdF9zb2NrZXQ9LTE7CisJY2lwaGVyPU5VTEw7CisJc19zZXJ2ZXJfdmVyaWZ5PVNTTF9WRVJJRllfTk9ORTsKKwlzX2RjZXJ0X2ZpbGU9TlVMTDsKKwlzX2RrZXlfZmlsZT1OVUxMOworCXNfY2VydF9maWxlPVRFU1RfQ0VSVDsKKwlzX2tleV9maWxlPU5VTEw7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJc19jZXJ0X2ZpbGUyPVRFU1RfQ0VSVDI7CisJc19rZXlfZmlsZTI9TlVMTDsKKwljdHgyPU5VTEw7CisjZW5kaWYKKyNpZmRlZiBGSU9OQklPCisJc19uYmlvPTA7CisjZW5kaWYKKwlzX25iaW9fdGVzdD0wOworCWN0eD1OVUxMOworCXd3dz0wOworCisJYmlvX3Nfb3V0PU5VTEw7CisJc19kZWJ1Zz0wOworCXNfbXNnPTA7CisJc19xdWlldD0wOworCWhhY2s9MDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwllbmdpbmVfaWQ9TlVMTDsKKyNlbmRpZgorCX0KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzdl91c2FnZSh2b2lkKQorCXsKKwlCSU9fcHJpbnRmKGJpb19lcnIsInVzYWdlOiBzX3NlcnZlciBbYXJncyAuLi5dXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIlxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWFjY2VwdCBhcmcgICAtIHBvcnQgdG8gYWNjZXB0IG9uIChkZWZhdWx0IGlzICVkKVxuIixQT1JUKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtY29udGV4dCBhcmcgIC0gc2V0IHNlc3Npb24gSUQgY29udGV4dFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXZlcmlmeSBhcmcgICAtIHR1cm4gb24gcGVlciBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb25cbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1WZXJpZnkgYXJnICAgLSB0dXJuIG9uIHBlZXIgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLCBtdXN0IGhhdmUgYSBjZXJ0LlxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNlcnQgYXJnICAgICAtIGNlcnRpZmljYXRlIGZpbGUgdG8gdXNlXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgKGRlZmF1bHQgaXMgJXMpXG4iLFRFU1RfQ0VSVCk7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNybF9jaGVjayAgICAtIGNoZWNrIHRoZSBwZWVyIGNlcnRpZmljYXRlIGhhcyBub3QgYmVlbiByZXZva2VkIGJ5IGl0cyBDQS5cbiIgXAorCSAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICBUaGUgQ1JMKHMpIGFyZSBhcHBlbmRlZCB0byB0aGUgY2VydGlmaWNhdGUgZmlsZVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNybF9jaGVja19hbGwgLSBjaGVjayB0aGUgcGVlciBjZXJ0aWZpY2F0ZSBoYXMgbm90IGJlZW4gcmV2b2tlZCBieSBpdHMgQ0FcbiIgXAorCSAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICBvciBhbnkgb3RoZXIgQ1JMIGluIHRoZSBDQSBjaGFpbi4gQ1JMKHMpIGFyZSBhcHBlbmVkIHRvIHRoZVxuIiBcCisJICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIHRoZSBjZXJ0aWZpY2F0ZSBmaWxlLlxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNlcnRmb3JtIGFyZyAtIGNlcnRpZmljYXRlIGZvcm1hdCAoUEVNIG9yIERFUikgUEVNIGRlZmF1bHRcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1rZXkgYXJnICAgICAgLSBQcml2YXRlIEtleSBmaWxlIHRvIHVzZSwgaW4gY2VydCBmaWxlIGlmXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgbm90IHNwZWNpZmllZCAoZGVmYXVsdCBpcyAlcylcbiIsVEVTVF9DRVJUKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAta2V5Zm9ybSBhcmcgIC0ga2V5IGZvcm1hdCAoUEVNLCBERVIgb3IgRU5HSU5FKSBQRU0gZGVmYXVsdFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXBhc3MgYXJnICAgICAtIHByaXZhdGUga2V5IGZpbGUgcGFzcyBwaHJhc2Ugc291cmNlXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtZGNlcnQgYXJnICAgIC0gc2Vjb25kIGNlcnRpZmljYXRlIGZpbGUgdG8gdXNlICh1c3VhbGx5IGZvciBEU0EpXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtZGNlcnRmb3JtIHggIC0gc2Vjb25kIGNlcnRpZmljYXRlIGZvcm1hdCAoUEVNIG9yIERFUikgUEVNIGRlZmF1bHRcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1ka2V5IGFyZyAgICAgLSBzZWNvbmQgcHJpdmF0ZSBrZXkgZmlsZSB0byB1c2UgKHVzdWFsbHkgZm9yIERTQSlcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1ka2V5Zm9ybSBhcmcgLSBzZWNvbmQga2V5IGZvcm1hdCAoUEVNLCBERVIgb3IgRU5HSU5FKSBQRU0gZGVmYXVsdFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWRwYXNzIGFyZyAgICAtIHNlY29uZCBwcml2YXRlIGtleSBmaWxlIHBhc3MgcGhyYXNlIHNvdXJjZVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWRocGFyYW0gYXJnICAtIERIIHBhcmFtZXRlciBmaWxlIHRvIHVzZSwgaW4gY2VydCBmaWxlIGlmIG5vdCBzcGVjaWZpZWRcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiICAgICAgICAgICAgICAgICBvciBhIGRlZmF1bHQgc2V0IG9mIHBhcmFtZXRlcnMgaXMgdXNlZFxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCUJJT19wcmludGYoYmlvX2VyciwiIC1uYW1lZF9jdXJ2ZSBhcmcgIC0gRWxsaXB0aWMgY3VydmUgbmFtZSB0byB1c2UgZm9yIGVwaGVtZXJhbCBFQ0RIIGtleXMuXG4iIFwKKwkgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgVXNlIFwib3BlbnNzbCBlY3BhcmFtIC1saXN0X2N1cnZlc1wiIGZvciBhbGwgbmFtZXNcbiIgXAorCSAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAoZGVmYXVsdCBpcyBuaXN0cDI1NikuXG4iKTsKKyNlbmRpZgorI2lmZGVmIEZJT05CSU8KKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbmJpbyAgICAgICAgIC0gUnVuIHdpdGggbm9uLWJsb2NraW5nIElPXG4iKTsKKyNlbmRpZgorCUJJT19wcmludGYoYmlvX2VyciwiIC1uYmlvX3Rlc3QgICAgLSB0ZXN0IHdpdGggdGhlIG5vbi1ibG9ja2luZyB0ZXN0IGJpb1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNybGYgICAgICAgICAtIGNvbnZlcnQgTEYgZnJvbSB0ZXJtaW5hbCBpbnRvIENSTEZcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1kZWJ1ZyAgICAgICAgLSBQcmludCBtb3JlIG91dHB1dFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLW1zZyAgICAgICAgICAtIFNob3cgcHJvdG9jb2wgbWVzc2FnZXNcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zdGF0ZSAgICAgICAgLSBQcmludCB0aGUgU1NMIHN0YXRlc1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLUNBcGF0aCBhcmcgICAtIFBFTSBmb3JtYXQgZGlyZWN0b3J5IG9mIENBJ3NcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1DQWZpbGUgYXJnICAgLSBQRU0gZm9ybWF0IGZpbGUgb2YgQ0Enc1xuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vY2VydCAgICAgICAtIERvbid0IHVzZSBhbnkgY2VydGlmaWNhdGVzIChBbm9uLURIKVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNpcGhlciBhcmcgICAtIHBsYXkgd2l0aCAnb3BlbnNzbCBjaXBoZXJzJyB0byBzZWUgd2hhdCBnb2VzIGhlcmVcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zZXJ2ZXJwcmVmICAgLSBVc2Ugc2VydmVyJ3MgY2lwaGVyIHByZWZlcmVuY2VzXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcXVpZXQgICAgICAgIC0gTm8gc2VydmVyIG91dHB1dFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vX3RtcF9yc2EgICAtIERvIG5vdCBnZW5lcmF0ZSBhIHRtcCBSU0Ega2V5XG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcHNrX2hpbnQgYXJnIC0gUFNLIGlkZW50aXR5IGhpbnQgdG8gdXNlXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtcHNrIGFyZyAgICAgIC0gUFNLIGluIGhleCAod2l0aG91dCAweClcbiIpOworIyBpZm5kZWYgT1BFTlNTTF9OT19KUEFLRQorCUJJT19wcmludGYoYmlvX2VyciwiIC1qcGFrZSBhcmcgICAgLSBKUEFLRSBzZWNyZXQgdG8gdXNlXG4iKTsKKyMgZW5kaWYKKyNlbmRpZgorCUJJT19wcmludGYoYmlvX2VyciwiIC1zc2wyICAgICAgICAgLSBKdXN0IHRhbGsgU1NMdjJcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zc2wzICAgICAgICAgLSBKdXN0IHRhbGsgU1NMdjNcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC10bHMxICAgICAgICAgLSBKdXN0IHRhbGsgVExTdjFcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1kdGxzMSAgICAgICAgLSBKdXN0IHRhbGsgRFRMU3YxXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtdGltZW91dCAgICAgIC0gRW5hYmxlIHRpbWVvdXRzXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbXR1ICAgICAgICAgIC0gU2V0IGxpbmsgbGF5ZXIgTVRVXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtY2hhaW4gICAgICAgIC0gUmVhZCBhIGNlcnRpZmljYXRlIGNoYWluXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbm9fc3NsMiAgICAgIC0gSnVzdCBkaXNhYmxlIFNTTHYyXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbm9fc3NsMyAgICAgIC0gSnVzdCBkaXNhYmxlIFNTTHYzXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbm9fdGxzMSAgICAgIC0gSnVzdCBkaXNhYmxlIFRMU3YxXG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCUJJT19wcmludGYoYmlvX2VyciwiIC1ub19kaGUgICAgICAgLSBEaXNhYmxlIGVwaGVtZXJhbCBESFxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vX2VjZGhlICAgICAtIERpc2FibGUgZXBoZW1lcmFsIEVDREhcbiIpOworI2VuZGlmCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWJ1Z3MgICAgICAgICAtIFR1cm4gb24gU1NMIGJ1ZyBjb21wYXRpYmlsaXR5XG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtd3d3ICAgICAgICAgIC0gUmVzcG9uZCB0byBhICdHRVQgLycgd2l0aCBhIHN0YXR1cyBwYWdlXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtV1dXICAgICAgICAgIC0gUmVzcG9uZCB0byBhICdHRVQgLzxwYXRoPiBIVFRQLzEuMCcgd2l0aCBmaWxlIC4vPHBhdGg+XG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtSFRUUCAgICAgICAgIC0gUmVzcG9uZCB0byBhICdHRVQgLzxwYXRoPiBIVFRQLzEuMCcgd2l0aCBmaWxlIC4vPHBhdGg+XG4iKTsKKyAgICAgICAgQklPX3ByaW50ZihiaW9fZXJyLCIgICAgICAgICAgICAgICAgIHdpdGggdGhlIGFzc3VtcHRpb24gaXQgY29udGFpbnMgYSBjb21wbGV0ZSBIVFRQIHJlc3BvbnNlLlxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWVuZ2luZSBpZCAgICAtIEluaXRpYWxpc2UgYW5kIHVzZSB0aGUgc3BlY2lmaWVkIGVuZ2luZVxuIik7CisjZW5kaWYKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtaWRfcHJlZml4IGFyZyAtIEdlbmVyYXRlIFNTTC9UTFMgc2Vzc2lvbiBJRHMgcHJlZml4ZWQgYnkgJ2FyZydcbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1yYW5kIGZpbGUlY2ZpbGUlYy4uLlxuIiwgTElTVF9TRVBBUkFUT1JfQ0hBUiwgTElTVF9TRVBBUkFUT1JfQ0hBUik7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXNlcnZlcm5hbWUgaG9zdCAtIHNlcnZlcm5hbWUgZm9yIEhvc3ROYW1lIFRMUyBleHRlbnNpb25cbiIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1zZXJ2ZXJuYW1lX2ZhdGFsIC0gb24gbWlzbWF0Y2ggc2VuZCBmYXRhbCBhbGVydCAoZGVmYXVsdCB3YXJuaW5nIGFsZXJ0KVxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLWNlcnQyIGFyZyAgICAtIGNlcnRpZmljYXRlIGZpbGUgdG8gdXNlIGZvciBzZXJ2ZXJuYW1lXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgKGRlZmF1bHQgaXMgJXMpXG4iLFRFU1RfQ0VSVDIpOworCUJJT19wcmludGYoYmlvX2VyciwiIC1rZXkyIGFyZyAgICAgLSBQcml2YXRlIEtleSBmaWxlIHRvIHVzZSBmb3Igc2VydmVybmFtZSwgaW4gY2VydCBmaWxlIGlmXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAgICAgICAgICAgICAgICAgbm90IHNwZWNpZmllZCAoZGVmYXVsdCBpcyAlcylcbiIsVEVTVF9DRVJUMik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLXRsc2V4dGRlYnVnICAtIGhleCBkdW1wIG9mIGFsbCBUTFMgZXh0ZW5zaW9ucyByZWNlaXZlZFxuIik7CisJQklPX3ByaW50ZihiaW9fZXJyLCIgLW5vX3RpY2tldCAgICAtIGRpc2FibGUgdXNlIG9mIFJGQzQ1MDdiaXMgc2Vzc2lvbiB0aWNrZXRzXG4iKTsKKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtbGVnYWN5X3JlbmVnb3RpYXRpb24gLSBlbmFibGUgdXNlIG9mIGxlZ2FjeSByZW5lZ290aWF0aW9uIChkYW5nZXJvdXMpXG4iKTsKKyNlbmRpZgorCX0KKworc3RhdGljIGludCBsb2NhbF9hcmdjPTA7CitzdGF0aWMgY2hhciAqKmxvY2FsX2FyZ3Y7CisKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworc3RhdGljIGludCBlYmNkaWNfbmV3KEJJTyAqYmkpOworc3RhdGljIGludCBlYmNkaWNfZnJlZShCSU8gKmEpOworc3RhdGljIGludCBlYmNkaWNfcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpOworc3RhdGljIGludCBlYmNkaWNfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCk7CitzdGF0aWMgbG9uZyBlYmNkaWNfY3RybChCSU8gKmIsIGludCBjbWQsIGxvbmcgbnVtLCB2b2lkICpwdHIpOworc3RhdGljIGludCBlYmNkaWNfZ2V0cyhCSU8gKmJwLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgZWJjZGljX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKTsKKworI2RlZmluZSBCSU9fVFlQRV9FQkNESUNfRklMVEVSCSgxOHwweDAyMDApCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX2ViY2RpYz0KKwl7CisJQklPX1RZUEVfRUJDRElDX0ZJTFRFUiwKKwkiRUJDRElDL0FTQ0lJIGZpbHRlciIsCisJZWJjZGljX3dyaXRlLAorCWViY2RpY19yZWFkLAorCWViY2RpY19wdXRzLAorCWViY2RpY19nZXRzLAorCWViY2RpY19jdHJsLAorCWViY2RpY19uZXcsCisJZWJjZGljX2ZyZWUsCisJfTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlzaXplX3QJYWxsb2NlZDsKKwljaGFyCWJ1ZmZbMV07Cit9IEVCQ0RJQ19PVVRCVUZGOworCitCSU9fTUVUSE9EICpCSU9fZl9lYmNkaWNfZmlsdGVyKCkKK3sKKwlyZXR1cm4oJm1ldGhvZHNfZWJjZGljKTsKK30KKworc3RhdGljIGludCBlYmNkaWNfbmV3KEJJTyAqYmkpCit7CisJRUJDRElDX09VVEJVRkYgKndidWY7CisKKwl3YnVmID0gKEVCQ0RJQ19PVVRCVUZGICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVCQ0RJQ19PVVRCVUZGKSArIDEwMjQpOworCXdidWYtPmFsbG9jZWQgPSAxMDI0OworCXdidWYtPmJ1ZmZbMF0gPSAnXDAnOworCisJYmktPnB0cj0oY2hhciAqKXdidWY7CisJYmktPmluaXQ9MTsKKwliaS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7Cit9CisKK3N0YXRpYyBpbnQgZWJjZGljX2ZyZWUoQklPICphKQoreworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKwlpZiAoYS0+cHRyICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShhLT5wdHIpOworCWEtPnB0cj1OVUxMOworCWEtPmluaXQ9MDsKKwlhLT5mbGFncz0wOworCXJldHVybigxKTsKK30KKwkKK3N0YXRpYyBpbnQgZWJjZGljX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQoreworCWludCByZXQ9MDsKKworCWlmIChvdXQgPT0gTlVMTCB8fCBvdXRsID09IDApIHJldHVybigwKTsKKwlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCisJcmV0PUJJT19yZWFkKGItPm5leHRfYmlvLG91dCxvdXRsKTsKKwlpZiAocmV0ID4gMCkKKwkJYXNjaWkyZWJjZGljKG91dCxvdXQscmV0KTsKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGludCBlYmNkaWNfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkKK3sKKwlFQkNESUNfT1VUQlVGRiAqd2J1ZjsKKwlpbnQgcmV0PTA7CisJaW50IG51bTsKKwl1bnNpZ25lZCBjaGFyIG47CisKKwlpZiAoKGluID09IE5VTEwpIHx8IChpbmwgPD0gMCkpIHJldHVybigwKTsKKwlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCisJd2J1Zj0oRUJDRElDX09VVEJVRkYgKiliLT5wdHI7CisKKwlpZiAoaW5sID4gKG51bSA9IHdidWYtPmFsbG9jZWQpKQorCXsKKwkJbnVtID0gbnVtICsgbnVtOyAgLyogZG91YmxlIHRoZSBzaXplICovCisJCWlmIChudW0gPCBpbmwpCisJCQludW0gPSBpbmw7CisJCU9QRU5TU0xfZnJlZSh3YnVmKTsKKwkJd2J1Zj0oRUJDRElDX09VVEJVRkYgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRUJDRElDX09VVEJVRkYpICsgbnVtKTsKKworCQl3YnVmLT5hbGxvY2VkID0gbnVtOworCQl3YnVmLT5idWZmWzBdID0gJ1wwJzsKKworCQliLT5wdHI9KGNoYXIgKil3YnVmOworCX0KKworCWViY2RpYzJhc2NpaSh3YnVmLT5idWZmLCBpbiwgaW5sKTsKKworCXJldD1CSU9fd3JpdGUoYi0+bmV4dF9iaW8sIHdidWYtPmJ1ZmYsIGlubCk7CisKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIGxvbmcgZWJjZGljX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQoreworCWxvbmcgcmV0OworCisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwlzd2l0Y2ggKGNtZCkKKwl7CisJY2FzZSBCSU9fQ1RSTF9EVVA6CisJCXJldD0wTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJfQorCXJldHVybihyZXQpOworfQorCitzdGF0aWMgaW50IGViY2RpY19nZXRzKEJJTyAqYnAsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IGksIHJldD0wOworCWlmIChicC0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworLyoJcmV0dXJuKEJJT19nZXRzKGJwLT5uZXh0X2JpbyxidWYsc2l6ZSkpOyovCisJZm9yIChpPTA7IGk8c2l6ZS0xOyArK2kpCisJeworCQlyZXQgPSBlYmNkaWNfcmVhZChicCwmYnVmW2ldLDEpOworCQlpZiAocmV0IDw9IDApCisJCQlicmVhazsKKwkJZWxzZSBpZiAoYnVmW2ldID09ICdcbicpCisJCXsKKwkJCSsraTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpIDwgc2l6ZSkKKwkJYnVmW2ldID0gJ1wwJzsKKwlyZXR1cm4gKHJldCA8IDAgJiYgaSA9PSAwKSA/IHJldCA6IGk7Cit9CisKK3N0YXRpYyBpbnQgZWJjZGljX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKQoreworCWlmIChicC0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCXJldHVybiBlYmNkaWNfd3JpdGUoYnAsIHN0ciwgc3RybGVuKHN0cikpOworfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKworLyogVGhpcyBpcyBhIGNvbnRleHQgdGhhdCB3ZSBwYXNzIHRvIGNhbGxiYWNrcyAqLwordHlwZWRlZiBzdHJ1Y3QgdGxzZXh0Y3R4X3N0IHsKKyAgIGNoYXIgKiBzZXJ2ZXJuYW1lOworICAgQklPICogYmlvZGVidWc7CisgICBpbnQgZXh0ZW5zaW9uX2Vycm9yOworfSB0bHNleHRjdHg7CisKKworc3RhdGljIGludCBNU19DQUxMQkFDSyBzc2xfc2VydmVybmFtZV9jYihTU0wgKnMsIGludCAqYWQsIHZvaWQgKmFyZykKKwl7CisJdGxzZXh0Y3R4ICogcCA9ICh0bHNleHRjdHggKikgYXJnOworCWNvbnN0IGNoYXIgKiBzZXJ2ZXJuYW1lID0gU1NMX2dldF9zZXJ2ZXJuYW1lKHMsIFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWUpOworICAgICAgICBpZiAoc2VydmVybmFtZSAmJiBwLT5iaW9kZWJ1ZykgCisJCUJJT19wcmludGYocC0+YmlvZGVidWcsIkhvc3RuYW1lIGluIFRMUyBleHRlbnNpb246IFwiJXNcIlxuIixzZXJ2ZXJuYW1lKTsKKyAgICAgICAgCisJaWYgKCFwLT5zZXJ2ZXJuYW1lKQorCQlyZXR1cm4gU1NMX1RMU0VYVF9FUlJfTk9BQ0s7CisJCisJaWYgKHNlcnZlcm5hbWUpCisJCXsKKyAgICAJCWlmIChzdHJjbXAoc2VydmVybmFtZSxwLT5zZXJ2ZXJuYW1lKSkgCisJCQlyZXR1cm4gcC0+ZXh0ZW5zaW9uX2Vycm9yOworCQlpZiAoY3R4MikKKwkJCXsKKwkJCUJJT19wcmludGYocC0+YmlvZGVidWcsIlN3aXRjaGluZyBzZXJ2ZXIgY29udGV4dC5cbiIpOworCQkJU1NMX3NldF9TU0xfQ1RYKHMsY3R4Mik7CisJCQl9ICAgICAKKwkJfQorCXJldHVybiBTU0xfVExTRVhUX0VSUl9PSzsKK30KKworLyogU3RydWN0dXJlIHBhc3NlZCB0byBjZXJ0IHN0YXR1cyBjYWxsYmFjayAqLworCit0eXBlZGVmIHN0cnVjdCB0bHNleHRzdGF0dXNjdHhfc3QgeworICAgLyogRGVmYXVsdCByZXNwb25kZXIgdG8gdXNlICovCisgICBjaGFyICpob3N0LCAqcGF0aCwgKnBvcnQ7CisgICBpbnQgdXNlX3NzbDsKKyAgIGludCB0aW1lb3V0OworICAgQklPICplcnI7CisgICBpbnQgdmVyYm9zZTsKK30gdGxzZXh0c3RhdHVzY3R4OworCitzdGF0aWMgdGxzZXh0c3RhdHVzY3R4IHRsc2NzdGF0cCA9IHtOVUxMLCBOVUxMLCBOVUxMLCAwLCAtMSwgTlVMTCwgMH07CisKKy8qIENlcnRpZmljYXRlIFN0YXR1cyBjYWxsYmFjay4gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBpbmNsdWRlcyBhCisgKiBjZXJ0aWZpY2F0ZSBzdGF0dXMgcmVxdWVzdCBleHRlbnNpb24uCisgKgorICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbi4gSXQgZXhhbWluZXMgY2VydGlmaWNhdGVzIGVhY2ggdGltZSBhbmQKKyAqIG1ha2VzIG9uZSBPQ1NQIHJlc3BvbmRlciBxdWVyeSBmb3IgZWFjaCByZXF1ZXN0LgorICoKKyAqIEEgZnVsbCB2ZXJzaW9uIHdvdWxkIHN0b3JlIGRldGFpbHMgc3VjaCBhcyB0aGUgT0NTUCBjZXJ0aWZpY2F0ZSBJRHMgYW5kCisgKiBtaW5pbWlzZSB0aGUgbnVtYmVyIG9mIE9DU1AgcmVzcG9uc2VzIGJ5IGNhY2hpbmcgdGhlbSB1bnRpbCB0aGV5IHdlcmUKKyAqIGNvbnNpZGVyZWQgImV4cGlyZWQiLgorICovCisKK3N0YXRpYyBpbnQgY2VydF9zdGF0dXNfY2IoU1NMICpzLCB2b2lkICphcmcpCisJeworCXRsc2V4dHN0YXR1c2N0eCAqc3JjdHggPSBhcmc7CisJQklPICplcnIgPSBzcmN0eC0+ZXJyOworCWNoYXIgKmhvc3QsICpwb3J0LCAqcGF0aDsKKwlpbnQgdXNlX3NzbDsKKwl1bnNpZ25lZCBjaGFyICpyc3BkZXIgPSBOVUxMOworCWludCByc3BkZXJsZW47CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICphaWEgPSBOVUxMOworCVg1MDkgKnggPSBOVUxMOworCVg1MDlfU1RPUkVfQ1RYIGluY3R4OworCVg1MDlfT0JKRUNUIG9iajsKKwlPQ1NQX1JFUVVFU1QgKnJlcSA9IE5VTEw7CisJT0NTUF9SRVNQT05TRSAqcmVzcCA9IE5VTEw7CisJT0NTUF9DRVJUSUQgKmlkID0gTlVMTDsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHM7CisJaW50IHJldCA9IFNTTF9UTFNFWFRfRVJSX05PQUNLOworCWludCBpOworI2lmIDAKK1NUQUNLX09GKE9DU1BfUkVTUElEKSAqaWRzOworU1NMX2dldF90bHNleHRfc3RhdHVzX2lkcyhzLCAmaWRzKTsKK0JJT19wcmludGYoZXJyLCAiY2VydF9zdGF0dXM6IHJlY2VpdmVkICVkIGlkc1xuIiwgc2tfT0NTUF9SRVNQSURfbnVtKGlkcykpOworI2VuZGlmCisJaWYgKHNyY3R4LT52ZXJib3NlKQorCQlCSU9fcHV0cyhlcnIsICJjZXJ0X3N0YXR1czogY2FsbGJhY2sgY2FsbGVkXG4iKTsKKwkvKiBCdWlsZCB1cCBPQ1NQIHF1ZXJ5IGZyb20gc2VydmVyIGNlcnRpZmljYXRlICovCisJeCA9IFNTTF9nZXRfY2VydGlmaWNhdGUocyk7CisJYWlhID0gWDUwOV9nZXQxX29jc3AoeCk7CisJaWYgKGFpYSkKKwkJeworCQlpZiAoIU9DU1BfcGFyc2VfdXJsKHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKGFpYSwgMCksCisJCQkmaG9zdCwgJnBvcnQsICZwYXRoLCAmdXNlX3NzbCkpCisJCQl7CisJCQlCSU9fcHV0cyhlcnIsICJjZXJ0X3N0YXR1czogY2FuJ3QgcGFyc2UgQUlBIFVSTFxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKHNyY3R4LT52ZXJib3NlKQorCQkJQklPX3ByaW50ZihlcnIsICJjZXJ0X3N0YXR1czogQUlBIFVSTDogJXNcbiIsCisJCQkJCXNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKGFpYSwgMCkpOworCQl9CisJZWxzZQorCQl7CisJCWlmICghc3JjdHgtPmhvc3QpCisJCQl7CisJCQlCSU9fcHV0cyhzcmN0eC0+ZXJyLCAiY2VydF9zdGF0dXM6IG5vIEFJQSBhbmQgbm8gZGVmYXVsdCByZXNwb25kZXIgVVJMXG4iKTsKKwkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJaG9zdCA9IHNyY3R4LT5ob3N0OworCQlwYXRoID0gc3JjdHgtPnBhdGg7CisJCXBvcnQgPSBzcmN0eC0+cG9ydDsKKwkJdXNlX3NzbCA9IHNyY3R4LT51c2Vfc3NsOworCQl9CisJCQorCWlmICghWDUwOV9TVE9SRV9DVFhfaW5pdCgmaW5jdHgsCisJCQkJU1NMX0NUWF9nZXRfY2VydF9zdG9yZShTU0xfZ2V0X1NTTF9DVFgocykpLAorCQkJCU5VTEwsIE5VTEwpKQorCQlnb3RvIGVycjsKKwlpZiAoWDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdCgmaW5jdHgsWDUwOV9MVV9YNTA5LAorCQkJCVg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpLCZvYmopIDw9IDApCisJCXsKKwkJQklPX3B1dHMoZXJyLCAiY2VydF9zdGF0dXM6IENhbid0IHJldHJpZXZlIGlzc3VlciBjZXJ0aWZpY2F0ZS5cbiIpOworCQlYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZpbmN0eCk7CisJCWdvdG8gZG9uZTsKKwkJfQorCXJlcSA9IE9DU1BfUkVRVUVTVF9uZXcoKTsKKwlpZiAoIXJlcSkKKwkJZ290byBlcnI7CisJaWQgPSBPQ1NQX2NlcnRfdG9faWQoTlVMTCwgeCwgb2JqLmRhdGEueDUwOSk7CisJWDUwOV9mcmVlKG9iai5kYXRhLng1MDkpOworCVg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJmluY3R4KTsKKwlpZiAoIWlkKQorCQlnb3RvIGVycjsKKwlpZiAoIU9DU1BfcmVxdWVzdF9hZGQwX2lkKHJlcSwgaWQpKQorCQlnb3RvIGVycjsKKwlpZCA9IE5VTEw7CisJLyogQWRkIGFueSBleHRlbnNpb25zIHRvIHRoZSByZXF1ZXN0ICovCisJU1NMX2dldF90bHNleHRfc3RhdHVzX2V4dHMocywgJmV4dHMpOworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X0VYVEVOU0lPTl9udW0oZXh0cyk7IGkrKykKKwkJeworCQlYNTA5X0VYVEVOU0lPTiAqZXh0ID0gc2tfWDUwOV9FWFRFTlNJT05fdmFsdWUoZXh0cywgaSk7CisJCWlmICghT0NTUF9SRVFVRVNUX2FkZF9leHQocmVxLCBleHQsIC0xKSkKKwkJCWdvdG8gZXJyOworCQl9CisJcmVzcCA9IHByb2Nlc3NfcmVzcG9uZGVyKGVyciwgcmVxLCBob3N0LCBwYXRoLCBwb3J0LCB1c2Vfc3NsLCBOVUxMLAorCQkJCQlzcmN0eC0+dGltZW91dCk7CisJaWYgKCFyZXNwKQorCQl7CisJCUJJT19wdXRzKGVyciwgImNlcnRfc3RhdHVzOiBlcnJvciBxdWVyeWluZyByZXNwb25kZXJcbiIpOworCQlnb3RvIGRvbmU7CisJCX0KKwlyc3BkZXJsZW4gPSBpMmRfT0NTUF9SRVNQT05TRShyZXNwLCAmcnNwZGVyKTsKKwlpZiAocnNwZGVybGVuIDw9IDApCisJCWdvdG8gZXJyOworCVNTTF9zZXRfdGxzZXh0X3N0YXR1c19vY3NwX3Jlc3AocywgcnNwZGVyLCByc3BkZXJsZW4pOworCWlmIChzcmN0eC0+dmVyYm9zZSkKKwkJeworCQlCSU9fcHV0cyhlcnIsICJjZXJ0X3N0YXR1czogb2NzcCByZXNwb25zZSBzZW50OlxuIik7CisJCU9DU1BfUkVTUE9OU0VfcHJpbnQoZXJyLCByZXNwLCAyKTsKKwkJfQorCXJldCA9IFNTTF9UTFNFWFRfRVJSX09LOworCWRvbmU6CisJaWYgKHJldCAhPSBTU0xfVExTRVhUX0VSUl9PSykKKwkJRVJSX3ByaW50X2Vycm9ycyhlcnIpOworCWlmIChhaWEpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGhvc3QpOworCQlPUEVOU1NMX2ZyZWUocGF0aCk7CisJCU9QRU5TU0xfZnJlZShwb3J0KTsKKwkJWDUwOV9lbWFpbF9mcmVlKGFpYSk7CisJCX0KKwlpZiAoaWQpCisJCU9DU1BfQ0VSVElEX2ZyZWUoaWQpOworCWlmIChyZXEpCisJCU9DU1BfUkVRVUVTVF9mcmVlKHJlcSk7CisJaWYgKHJlc3ApCisJCU9DU1BfUkVTUE9OU0VfZnJlZShyZXNwKTsKKwlyZXR1cm4gcmV0OworCWVycjoKKwlyZXQgPSBTU0xfVExTRVhUX0VSUl9BTEVSVF9GQVRBTDsKKwlnb3RvIGRvbmU7CisJfQorI2VuZGlmCisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19KUEFLRQorc3RhdGljIGNoYXIgKmpwYWtlX3NlY3JldCA9IE5VTEw7CisjZW5kaWYKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKwl7CisJWDUwOV9WRVJJRllfUEFSQU0gKnZwbSA9IE5VTEw7CisJaW50IGJhZGFyZyA9IDA7CisJc2hvcnQgcG9ydD1QT1JUOworCWNoYXIgKkNBcGF0aD1OVUxMLCpDQWZpbGU9TlVMTDsKKwl1bnNpZ25lZCBjaGFyICpjb250ZXh0ID0gTlVMTDsKKwljaGFyICpkaGZpbGUgPSBOVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwljaGFyICpuYW1lZF9jdXJ2ZSA9IE5VTEw7CisjZW5kaWYKKwlpbnQgYmFkb3A9MCxidWdzPTA7CisJaW50IHJldD0xOworCWludCBvZmY9MDsKKwlpbnQgbm9fdG1wX3JzYT0wLG5vX2RoZT0wLG5vX2VjZGhlPTAsbm9jZXJ0PTA7CisJaW50IHN0YXRlPTA7CisJY29uc3QgU1NMX01FVEhPRCAqbWV0aD1OVUxMOworCWludCBzb2NrZXRfdHlwZT1TT0NLX1NUUkVBTTsKKwlFTkdJTkUgKmU9TlVMTDsKKwljaGFyICppbnJhbmQ9TlVMTDsKKwlpbnQgc19jZXJ0X2Zvcm1hdCA9IEZPUk1BVF9QRU0sIHNfa2V5X2Zvcm1hdCA9IEZPUk1BVF9QRU07CisJY2hhciAqcGFzc2FyZyA9IE5VTEwsICpwYXNzID0gTlVMTDsKKwljaGFyICpkcGFzc2FyZyA9IE5VTEwsICpkcGFzcyA9IE5VTEw7CisJaW50IHNfZGNlcnRfZm9ybWF0ID0gRk9STUFUX1BFTSwgc19ka2V5X2Zvcm1hdCA9IEZPUk1BVF9QRU07CisJWDUwOSAqc19jZXJ0ID0gTlVMTCwgKnNfZGNlcnQgPSBOVUxMOworCUVWUF9QS0VZICpzX2tleSA9IE5VTEwsICpzX2RrZXkgPSBOVUxMOworCWludCBub19jYWNoZSA9IDA7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJRVZQX1BLRVkgKnNfa2V5MiA9IE5VTEw7CisJWDUwOSAqc19jZXJ0MiA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKyAgICAgICAgdGxzZXh0Y3R4IHRsc2V4dGNicCA9IHtOVUxMLCBOVUxMLCBTU0xfVExTRVhUX0VSUl9BTEVSVF9XQVJOSU5HfTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCS8qIGJ5IGRlZmF1bHQgZG8gbm90IHNlbmQgYSBQU0sgaWRlbnRpdHkgaGludCAqLworCXN0YXRpYyBjaGFyICpwc2tfaWRlbnRpdHlfaGludD1OVUxMOworI2VuZGlmCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TU0wyKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDMpCisJbWV0aD1TU0x2MjNfc2VydmVyX21ldGhvZCgpOworI2VsaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TU0wzKQorCW1ldGg9U1NMdjNfc2VydmVyX21ldGhvZCgpOworI2VsaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TU0wyKQorCW1ldGg9U1NMdjJfc2VydmVyX21ldGhvZCgpOworI2VuZGlmCisKKwlsb2NhbF9hcmdjPWFyZ2M7CisJbG9jYWxfYXJndj1hcmd2OworCisJYXBwc19zdGFydHVwKCk7CisjaWZkZWYgTU9OT0xJVEgKKwlzX3NlcnZlcl9pbml0KCk7CisjZW5kaWYKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWJpb19lcnI9QklPX25ld19mcChzdGRlcnIsQklPX05PQ0xPU0UpOworCisJaWYgKCFsb2FkX2NvbmZpZyhiaW9fZXJyLCBOVUxMKSkKKwkJZ290byBlbmQ7CisKKwl2ZXJpZnlfZGVwdGg9MDsKKyNpZmRlZiBGSU9OQklPCisJc19uYmlvPTA7CisjZW5kaWYKKwlzX25iaW9fdGVzdD0wOworCisJYXJnYy0tOworCWFyZ3YrKzsKKworCXdoaWxlIChhcmdjID49IDEpCisJCXsKKwkJaWYJKChzdHJjbXAoKmFyZ3YsIi1wb3J0IikgPT0gMCkgfHwKKwkJCSAoc3RyY21wKCphcmd2LCItYWNjZXB0IikgPT0gMCkpCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpZiAoIWV4dHJhY3RfcG9ydCgqKCsrYXJndiksJnBvcnQpKQorCQkJCWdvdG8gYmFkOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi12ZXJpZnkiKSA9PSAwKQorCQkJeworCQkJc19zZXJ2ZXJfdmVyaWZ5PVNTTF9WRVJJRllfUEVFUnxTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJdmVyaWZ5X2RlcHRoPWF0b2koKigrK2FyZ3YpKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IGRlcHRoIGlzICVkXG4iLHZlcmlmeV9kZXB0aCk7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLVZlcmlmeSIpID09IDApCisJCQl7CisJCQlzX3NlcnZlcl92ZXJpZnk9U1NMX1ZFUklGWV9QRUVSfFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlR8CisJCQkJU1NMX1ZFUklGWV9DTElFTlRfT05DRTsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXZlcmlmeV9kZXB0aD1hdG9pKCooKythcmd2KSk7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInZlcmlmeSBkZXB0aCBpcyAlZCwgbXVzdCByZXR1cm4gYSBjZXJ0aWZpY2F0ZVxuIix2ZXJpZnlfZGVwdGgpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jb250ZXh0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWNvbnRleHQ9ICh1bnNpZ25lZCBjaGFyICopKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jZXJ0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNfY2VydF9maWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWNlcnRmb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNfY2VydF9mb3JtYXQgPSBzdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWtleSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzX2tleV9maWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWtleWZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc19rZXlfZm9ybWF0ID0gc3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1wYXNzIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXBhc3NhcmcgPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWRocGFyYW0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZGhmaWxlID0gKigrK2FyZ3YpOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgJCQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1uYW1lZF9jdXJ2ZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQluYW1lZF9jdXJ2ZSA9ICooKythcmd2KTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1kY2VydGZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc19kY2VydF9mb3JtYXQgPSBzdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWRjZXJ0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNfZGNlcnRfZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1ka2V5Zm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzX2RrZXlfZm9ybWF0ID0gc3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1kcGFzcyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlkcGFzc2FyZyA9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItZGtleSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzX2RrZXlfZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub2NlcnQiKSA9PSAwKQorCQkJeworCQkJbm9jZXJ0PTE7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLUNBcGF0aCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlDQXBhdGg9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbm9fY2FjaGUiKSA9PSAwKQorCQkJbm9fY2FjaGUgPSAxOworCQllbHNlIGlmIChhcmdzX3ZlcmlmeSgmYXJndiwgJmFyZ2MsICZiYWRhcmcsIGJpb19lcnIsICZ2cG0pKQorCQkJeworCQkJaWYgKGJhZGFyZykKKwkJCQlnb3RvIGJhZDsKKwkJCWNvbnRpbnVlOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi12ZXJpZnlfcmV0dXJuX2Vycm9yIikgPT0gMCkKKwkJCXZlcmlmeV9yZXR1cm5fZXJyb3IgPSAxOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zZXJ2ZXJwcmVmIikgPT0gMCkKKwkJCXsgb2ZmfD1TU0xfT1BfQ0lQSEVSX1NFUlZFUl9QUkVGRVJFTkNFOyB9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWxlZ2FjeV9yZW5lZ290aWF0aW9uIikgPT0gMCkKKwkJCW9mZnw9U1NMX09QX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTjsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItY2lwaGVyIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWNpcGhlcj0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1DQWZpbGUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJQ0FmaWxlPSAqKCsrYXJndik7CisJCQl9CisjaWZkZWYgRklPTkJJTwkKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbmJpbyIpID09IDApCisJCQl7IHNfbmJpbz0xOyB9CisjZW5kaWYKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbmJpb190ZXN0IikgPT0gMCkKKwkJCXsKKyNpZmRlZiBGSU9OQklPCQorCQkJc19uYmlvPTE7CisjZW5kaWYKKwkJCXNfbmJpb190ZXN0PTE7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWRlYnVnIikgPT0gMCkKKwkJCXsgc19kZWJ1Zz0xOyB9CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXRsc2V4dGRlYnVnIikgPT0gMCkKKwkJCXNfdGxzZXh0ZGVidWc9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItc3RhdHVzIikgPT0gMCkKKwkJCXNfdGxzZXh0c3RhdHVzPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXN0YXR1c192ZXJib3NlIikgPT0gMCkKKwkJCXsKKwkJCXNfdGxzZXh0c3RhdHVzPTE7CisJCQl0bHNjc3RhdHAudmVyYm9zZSA9IDE7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3YsICItc3RhdHVzX3RpbWVvdXQiKSkKKwkJCXsKKwkJCXNfdGxzZXh0c3RhdHVzPTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQl0bHNjc3RhdHAudGltZW91dCA9IGF0b2koKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJndiwgIi1zdGF0dXNfdXJsIikpCisJCQl7CisJCQlzX3Rsc2V4dHN0YXR1cz0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaWYgKCFPQ1NQX3BhcnNlX3VybCgqKCsrYXJndiksCisJCQkJCSZ0bHNjc3RhdHAuaG9zdCwKKwkJCQkJJnRsc2NzdGF0cC5wb3J0LAorCQkJCQkmdGxzY3N0YXRwLnBhdGgsCisJCQkJCSZ0bHNjc3RhdHAudXNlX3NzbCkpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIHBhcnNpbmcgVVJMXG4iKTsKKwkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbXNnIikgPT0gMCkKKwkJCXsgc19tc2c9MTsgfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1oYWNrIikgPT0gMCkKKwkJCXsgaGFjaz0xOyB9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXN0YXRlIikgPT0gMCkKKwkJCXsgc3RhdGU9MTsgfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jcmxmIikgPT0gMCkKKwkJCXsgc19jcmxmPTE7IH0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcXVpZXQiKSA9PSAwKQorCQkJeyBzX3F1aWV0PTE7IH0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItYnVncyIpID09IDApCisJCQl7IGJ1Z3M9MTsgfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1ub190bXBfcnNhIikgPT0gMCkKKwkJCXsgbm9fdG1wX3JzYT0xOyB9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLW5vX2RoZSIpID09IDApCisJCQl7IG5vX2RoZT0xOyB9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLW5vX2VjZGhlIikgPT0gMCkKKwkJCXsgbm9fZWNkaGU9MTsgfQorI2lmbmRlZiBPUEVOU1NMX05PX1BTSworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBza19oaW50IikgPT0gMCkKKwkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBza19pZGVudGl0eV9oaW50PSAqKCsrYXJndik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHNrIikgPT0gMCkKKwkJCXsKKwkJCXNpemVfdCBpOworCisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwc2tfa2V5PSooKythcmd2KTsKKwkJCWZvciAoaT0wOyBpPHN0cmxlbihwc2tfa2V5KTsgaSsrKQorCQkJCXsKKwkJCQlpZiAoaXN4ZGlnaXQoKGludClwc2tfa2V5W2ldKSkKKwkJCQkJY29udGludWU7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJOb3QgYSBoZXggbnVtYmVyICclcydcbiIsKmFyZ3YpOworCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi13d3ciKSA9PSAwKQorCQkJeyB3d3c9MTsgfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1XV1ciKSA9PSAwKQorCQkJeyB3d3c9MjsgfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1IVFRQIikgPT0gMCkKKwkJCXsgd3d3PTM7IH0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbm9fc3NsMiIpID09IDApCisJCQl7IG9mZnw9U1NMX09QX05PX1NTTHYyOyB9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLW5vX3NzbDMiKSA9PSAwKQorCQkJeyBvZmZ8PVNTTF9PUF9OT19TU0x2MzsgfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1ub190bHMxIikgPT0gMCkKKwkJCXsgb2ZmfD1TU0xfT1BfTk9fVExTdjE7IH0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbm9fY29tcCIpID09IDApCisJCQl7IG9mZnw9U1NMX09QX05PX0NPTVBSRVNTSU9OOyB9CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLW5vX3RpY2tldCIpID09IDApCisJCQl7IG9mZnw9U1NMX09QX05PX1RJQ0tFVDsgfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zc2wyIikgPT0gMCkKKwkJCXsgbWV0aD1TU0x2Ml9zZXJ2ZXJfbWV0aG9kKCk7IH0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItc3NsMyIpID09IDApCisJCQl7IG1ldGg9U1NMdjNfc2VydmVyX21ldGhvZCgpOyB9CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFMxCisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXRsczEiKSA9PSAwKQorCQkJeyBtZXRoPVRMU3YxX3NlcnZlcl9tZXRob2QoKTsgfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFRMUzEKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItZHRsczEiKSA9PSAwKQorCQkJeyAKKwkJCW1ldGg9RFRMU3YxX3NlcnZlcl9tZXRob2QoKTsKKwkJCXNvY2tldF90eXBlID0gU09DS19ER1JBTTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdGltZW91dCIpID09IDApCisJCQllbmFibGVfdGltZW91dHMgPSAxOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1tdHUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc29ja2V0X210dSA9IGF0b2woKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWNoYWluIikgPT0gMCkKKwkJCWNlcnRfY2hhaW4gPSAxOworI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1pZF9wcmVmaXgiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc2Vzc2lvbl9pZF9wcmVmaXggPSAqKCsrYXJndik7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVuZ2luZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQllbmdpbmVfaWQ9ICooKythcmd2KTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1yYW5kIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWlucmFuZD0gKigrK2FyZ3YpOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zZXJ2ZXJuYW1lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXRsc2V4dGNicC5zZXJ2ZXJuYW1lPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXNlcnZlcm5hbWVfZmF0YWwiKSA9PSAwKQorCQkJeyB0bHNleHRjYnAuZXh0ZW5zaW9uX2Vycm9yID0gU1NMX1RMU0VYVF9FUlJfQUxFUlRfRkFUQUw7IH0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItY2VydDIiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc19jZXJ0X2ZpbGUyPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWtleTIiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc19rZXlfZmlsZTI9ICooKythcmd2KTsKKwkJCX0KKwkJCQorI2VuZGlmCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19KUEFLRSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19QU0spCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWpwYWtlIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWpwYWtlX3NlY3JldCA9ICooKythcmd2KTsKKwkJCX0KKyNlbmRpZgorCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVua25vd24gb3B0aW9uICVzXG4iLCphcmd2KTsKKwkJCWJhZG9wPTE7CisJCQlicmVhazsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKwlpZiAoYmFkb3ApCisJCXsKK2JhZDoKKwkJc3ZfdXNhZ2UoKTsKKwkJZ290byBlbmQ7CisJCX0KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fSlBBS0UpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fUFNLKQorCWlmIChqcGFrZV9zZWNyZXQpCisJCXsKKwkJaWYgKHBza19rZXkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJICAgIkNhbid0IHVzZSBKUEFLRSBhbmQgUFNLIHRvZ2V0aGVyXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlwc2tfaWRlbnRpdHkgPSAiSlBBS0UiOworCQlpZiAoY2lwaGVyKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiSlBBS0Ugc2V0cyBjaXBoZXIgdG8gUFNLXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQljaXBoZXIgPSAiUFNLIjsKKwkJfQorCisjZW5kaWYKKworCVNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKwlPcGVuU1NMX2FkZF9zc2xfYWxnb3JpdGhtcygpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgICAgIGUgPSBzZXR1cF9lbmdpbmUoYmlvX2VyciwgZW5naW5lX2lkLCAxKTsKKyNlbmRpZgorCisJaWYgKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmcsIGRwYXNzYXJnLCAmcGFzcywgJmRwYXNzKSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBnZXR0aW5nIHBhc3N3b3JkXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCisJaWYgKHNfa2V5X2ZpbGUgPT0gTlVMTCkKKwkJc19rZXlfZmlsZSA9IHNfY2VydF9maWxlOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCWlmIChzX2tleV9maWxlMiA9PSBOVUxMKQorCQlzX2tleV9maWxlMiA9IHNfY2VydF9maWxlMjsKKyNlbmRpZgorCisJaWYgKG5vY2VydCA9PSAwKQorCQl7CisJCXNfa2V5ID0gbG9hZF9rZXkoYmlvX2Vyciwgc19rZXlfZmlsZSwgc19rZXlfZm9ybWF0LCAwLCBwYXNzLCBlLAorCQkgICAgICAgInNlcnZlciBjZXJ0aWZpY2F0ZSBwcml2YXRlIGtleSBmaWxlIik7CisJCWlmICghc19rZXkpCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJc19jZXJ0ID0gbG9hZF9jZXJ0KGJpb19lcnIsc19jZXJ0X2ZpbGUsc19jZXJ0X2Zvcm1hdCwKKwkJCU5VTEwsIGUsICJzZXJ2ZXIgY2VydGlmaWNhdGUgZmlsZSIpOworCisJCWlmICghc19jZXJ0KQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWlmICh0bHNleHRjYnAuc2VydmVybmFtZSkgCisJCQl7CisJCQlzX2tleTIgPSBsb2FkX2tleShiaW9fZXJyLCBzX2tleV9maWxlMiwgc19rZXlfZm9ybWF0LCAwLCBwYXNzLCBlLAorCQkJCSJzZWNvbmQgc2VydmVyIGNlcnRpZmljYXRlIHByaXZhdGUga2V5IGZpbGUiKTsKKwkJCWlmICghc19rZXkyKQorCQkJCXsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCQorCQkJc19jZXJ0MiA9IGxvYWRfY2VydChiaW9fZXJyLHNfY2VydF9maWxlMixzX2NlcnRfZm9ybWF0LAorCQkJCU5VTEwsIGUsICJzZWNvbmQgc2VydmVyIGNlcnRpZmljYXRlIGZpbGUiKTsKKwkJCQorCQkJaWYgKCFzX2NlcnQyKQorCQkJCXsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQl9CisKKworCWlmIChzX2RjZXJ0X2ZpbGUpCisJCXsKKworCQlpZiAoc19ka2V5X2ZpbGUgPT0gTlVMTCkKKwkJCXNfZGtleV9maWxlID0gc19kY2VydF9maWxlOworCisJCXNfZGtleSA9IGxvYWRfa2V5KGJpb19lcnIsIHNfZGtleV9maWxlLCBzX2RrZXlfZm9ybWF0LAorCQkJCTAsIGRwYXNzLCBlLAorCQkJICAgICAgICJzZWNvbmQgY2VydGlmaWNhdGUgcHJpdmF0ZSBrZXkgZmlsZSIpOworCQlpZiAoIXNfZGtleSkKKwkJCXsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQlzX2RjZXJ0ID0gbG9hZF9jZXJ0KGJpb19lcnIsc19kY2VydF9maWxlLHNfZGNlcnRfZm9ybWF0LAorCQkJCU5VTEwsIGUsICJzZWNvbmQgc2VydmVyIGNlcnRpZmljYXRlIGZpbGUiKTsKKworCQlpZiAoIXNfZGNlcnQpCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJfQorCisJaWYgKCFhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgMSkgJiYgaW5yYW5kID09IE5VTEwKKwkJJiYgIVJBTkRfc3RhdHVzKCkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJ3YXJuaW5nLCBub3QgbXVjaCBleHRyYSByYW5kb20gZGF0YSwgY29uc2lkZXIgdXNpbmcgdGhlIC1yYW5kIG9wdGlvblxuIik7CisJCX0KKwlpZiAoaW5yYW5kICE9IE5VTEwpCisJCUJJT19wcmludGYoYmlvX2VyciwiJWxkIHNlbWktcmFuZG9tIGJ5dGVzIGxvYWRlZFxuIiwKKwkJCWFwcF9SQU5EX2xvYWRfZmlsZXMoaW5yYW5kKSk7CisKKwlpZiAoYmlvX3Nfb3V0ID09IE5VTEwpCisJCXsKKwkJaWYgKHNfcXVpZXQgJiYgIXNfZGVidWcgJiYgIXNfbXNnKQorCQkJeworCQkJYmlvX3Nfb3V0PUJJT19uZXcoQklPX3NfbnVsbCgpKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKGJpb19zX291dCA9PSBOVUxMKQorCQkJCWJpb19zX291dD1CSU9fbmV3X2ZwKHN0ZG91dCxCSU9fTk9DTE9TRSk7CisJCQl9CisJCX0KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fUlNBKSB8fCAhZGVmaW5lZChPUEVOU1NMX05PX0RTQSkgfHwgIWRlZmluZWQoT1BFTlNTTF9OT19FQ0RTQSkKKwlpZiAobm9jZXJ0KQorI2VuZGlmCisJCXsKKwkJc19jZXJ0X2ZpbGU9TlVMTDsKKwkJc19rZXlfZmlsZT1OVUxMOworCQlzX2RjZXJ0X2ZpbGU9TlVMTDsKKwkJc19ka2V5X2ZpbGU9TlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJc19jZXJ0X2ZpbGUyPU5VTEw7CisJCXNfa2V5X2ZpbGUyPU5VTEw7CisjZW5kaWYKKwkJfQorCisJY3R4PVNTTF9DVFhfbmV3KG1ldGgpOworCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmIChzZXNzaW9uX2lkX3ByZWZpeCkKKwkJeworCQlpZihzdHJsZW4oc2Vzc2lvbl9pZF9wcmVmaXgpID49IDMyKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLAorIndhcm5pbmc6IGlkX3ByZWZpeCBpcyB0b28gbG9uZywgb25seSBvbmUgbmV3IHNlc3Npb24gd2lsbCBiZSBwb3NzaWJsZVxuIik7CisJCWVsc2UgaWYoc3RybGVuKHNlc3Npb25faWRfcHJlZml4KSA+PSAxNikKKwkJCUJJT19wcmludGYoYmlvX2VyciwKKyJ3YXJuaW5nOiBpZF9wcmVmaXggaXMgdG9vIGxvbmcgaWYgeW91IHVzZSBTU0x2MlxuIik7CisJCWlmKCFTU0xfQ1RYX3NldF9nZW5lcmF0ZV9zZXNzaW9uX2lkKGN0eCwgZ2VuZXJhdGVfc2Vzc2lvbl9pZCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHNldHRpbmcgJ2lkX3ByZWZpeCdcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlCSU9fcHJpbnRmKGJpb19lcnIsImlkX3ByZWZpeCAnJXMnIHNldC5cbiIsIHNlc3Npb25faWRfcHJlZml4KTsKKwkJfQorCVNTTF9DVFhfc2V0X3F1aWV0X3NodXRkb3duKGN0eCwxKTsKKwlpZiAoYnVncykgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgsU1NMX09QX0FMTCk7CisJaWYgKGhhY2spIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4LFNTTF9PUF9ORVRTQ0FQRV9ERU1PX0NJUEhFUl9DSEFOR0VfQlVHKTsKKwlTU0xfQ1RYX3NldF9vcHRpb25zKGN0eCxvZmYpOworCS8qIERUTFM6IHBhcnRpYWwgcmVhZHMgZW5kIHVwIGRpc2NhcmRpbmcgdW5yZWFkIFVEUCBieXRlcyA6LSggCisJICogU2V0dGluZyByZWFkIGFoZWFkIHNvbHZlcyB0aGlzIHByb2JsZW0uCisJICovCisJaWYgKHNvY2tldF90eXBlID09IFNPQ0tfREdSQU0pIFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQoY3R4LCAxKTsKKworCWlmIChzdGF0ZSkgU1NMX0NUWF9zZXRfaW5mb19jYWxsYmFjayhjdHgsYXBwc19zc2xfaW5mb19jYWxsYmFjayk7CisJaWYgKG5vX2NhY2hlKQorCQlTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUoY3R4LCBTU0xfU0VTU19DQUNIRV9PRkYpOworCWVsc2UKKwkJU1NMX0NUWF9zZXNzX3NldF9jYWNoZV9zaXplKGN0eCwxMjgpOworCisjaWYgMAorCWlmIChjaXBoZXIgPT0gTlVMTCkgY2lwaGVyPWdldGVudigiU1NMX0NJUEhFUiIpOworI2VuZGlmCisKKyNpZiAwCisJaWYgKHNfY2VydF9maWxlID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2VydGlmaWNhdGUgZmlsZSBmb3IgdGhlIHNlcnZlciB0byB1c2VcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorI2VuZGlmCisKKwlpZiAoKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHgsQ0FmaWxlLENBcGF0aCkpIHx8CisJCSghU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoY3R4KSkpCisJCXsKKwkJLyogQklPX3ByaW50ZihiaW9fZXJyLCJYNTA5X2xvYWRfdmVyaWZ5X2xvY2F0aW9uc1xuIik7ICovCisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCS8qIGdvdG8gZW5kOyAqLworCQl9CisJaWYgKHZwbSkKKwkJU1NMX0NUWF9zZXQxX3BhcmFtKGN0eCwgdnBtKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCWlmIChzX2NlcnQyKQorCQl7CisJCWN0eDI9U1NMX0NUWF9uZXcobWV0aCk7CisJCWlmIChjdHgyID09IE5VTEwpCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwkKKwlpZiAoY3R4MikKKwkJeworCQlCSU9fcHJpbnRmKGJpb19zX291dCwiU2V0dGluZyBzZWNvbmRhcnkgY3R4IHBhcmFtZXRlcnNcbiIpOworCisJCWlmIChzZXNzaW9uX2lkX3ByZWZpeCkKKwkJCXsKKwkJCWlmKHN0cmxlbihzZXNzaW9uX2lkX3ByZWZpeCkgPj0gMzIpCisJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkid2FybmluZzogaWRfcHJlZml4IGlzIHRvbyBsb25nLCBvbmx5IG9uZSBuZXcgc2Vzc2lvbiB3aWxsIGJlIHBvc3NpYmxlXG4iKTsKKwkJCWVsc2UgaWYoc3RybGVuKHNlc3Npb25faWRfcHJlZml4KSA+PSAxNikKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCSJ3YXJuaW5nOiBpZF9wcmVmaXggaXMgdG9vIGxvbmcgaWYgeW91IHVzZSBTU0x2MlxuIik7CisJCQlpZighU1NMX0NUWF9zZXRfZ2VuZXJhdGVfc2Vzc2lvbl9pZChjdHgyLCBnZW5lcmF0ZV9zZXNzaW9uX2lkKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciBzZXR0aW5nICdpZF9wcmVmaXgnXG4iKTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCUJJT19wcmludGYoYmlvX2VyciwiaWRfcHJlZml4ICclcycgc2V0LlxuIiwgc2Vzc2lvbl9pZF9wcmVmaXgpOworCQkJfQorCQlTU0xfQ1RYX3NldF9xdWlldF9zaHV0ZG93bihjdHgyLDEpOworCQlpZiAoYnVncykgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgyLFNTTF9PUF9BTEwpOworCQlpZiAoaGFjaykgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgyLFNTTF9PUF9ORVRTQ0FQRV9ERU1PX0NJUEhFUl9DSEFOR0VfQlVHKTsKKwkJU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgyLG9mZik7CisJCS8qIERUTFM6IHBhcnRpYWwgcmVhZHMgZW5kIHVwIGRpc2NhcmRpbmcgdW5yZWFkIFVEUCBieXRlcyA6LSggCisJCSAqIFNldHRpbmcgcmVhZCBhaGVhZCBzb2x2ZXMgdGhpcyBwcm9ibGVtLgorCQkgKi8KKwkJaWYgKHNvY2tldF90eXBlID09IFNPQ0tfREdSQU0pIFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQoY3R4MiwgMSk7CisKKwkJaWYgKHN0YXRlKSBTU0xfQ1RYX3NldF9pbmZvX2NhbGxiYWNrKGN0eDIsYXBwc19zc2xfaW5mb19jYWxsYmFjayk7CisKKwkJaWYgKG5vX2NhY2hlKQorCQkJU1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlKGN0eDIsU1NMX1NFU1NfQ0FDSEVfT0ZGKTsKKwkJZWxzZQorCQkJU1NMX0NUWF9zZXNzX3NldF9jYWNoZV9zaXplKGN0eDIsMTI4KTsKKworCQlpZiAoKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjdHgyLENBZmlsZSxDQXBhdGgpKSB8fAorCQkJKCFTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhjdHgyKSkpCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJfQorCQlpZiAodnBtKQorCQkJU1NMX0NUWF9zZXQxX3BhcmFtKGN0eDIsIHZwbSk7CisJCX0KKyNlbmRpZiAKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisJaWYgKCFub19kaGUpCisJCXsKKwkJREggKmRoPU5VTEw7CisKKwkJaWYgKGRoZmlsZSkKKwkJCWRoID0gbG9hZF9kaF9wYXJhbShkaGZpbGUpOworCQllbHNlIGlmIChzX2NlcnRfZmlsZSkKKwkJCWRoID0gbG9hZF9kaF9wYXJhbShzX2NlcnRfZmlsZSk7CisKKwkJaWYgKGRoICE9IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19zX291dCwiU2V0dGluZyB0ZW1wIERIIHBhcmFtZXRlcnNcbiIpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19zX291dCwiVXNpbmcgZGVmYXVsdCB0ZW1wIERIIHBhcmFtZXRlcnNcbiIpOworCQkJZGg9Z2V0X2RoNTEyKCk7CisJCQl9CisJCSh2b2lkKUJJT19mbHVzaChiaW9fc19vdXQpOworCisJCVNTTF9DVFhfc2V0X3RtcF9kaChjdHgsZGgpOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQlpZiAoY3R4MikKKwkJCXsKKwkJCWlmICghZGhmaWxlKQorCQkJCXsgCisJCQkJREggKmRoMj1sb2FkX2RoX3BhcmFtKHNfY2VydF9maWxlMik7CisJCQkJaWYgKGRoMiAhPSBOVUxMKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJTZXR0aW5nIHRlbXAgREggcGFyYW1ldGVyc1xuIik7CisJCQkJCSh2b2lkKUJJT19mbHVzaChiaW9fc19vdXQpOworCisJCQkJCURIX2ZyZWUoZGgpOworCQkJCQlkaCA9IGRoMjsKKwkJCQkJfQorCQkJCX0KKwkJCVNTTF9DVFhfc2V0X3RtcF9kaChjdHgyLGRoKTsKKwkJCX0KKyNlbmRpZgorCQlESF9mcmVlKGRoKTsKKwkJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJaWYgKCFub19lY2RoZSkKKwkJeworCQlFQ19LRVkgKmVjZGg9TlVMTDsKKworCQlpZiAobmFtZWRfY3VydmUpCisJCQl7CisJCQlpbnQgbmlkID0gT0JKX3NuMm5pZChuYW1lZF9jdXJ2ZSk7CisKKwkJCWlmIChuaWQgPT0gMCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAidW5rbm93biBjdXJ2ZSBuYW1lICglcylcbiIsIAorCQkJCQluYW1lZF9jdXJ2ZSk7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJZWNkaCA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworCQkJaWYgKGVjZGggPT0gTlVMTCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAidW5hYmxlIHRvIGNyZWF0ZSBjdXJ2ZSAoJXMpXG4iLCAKKwkJCQkJbmFtZWRfY3VydmUpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKworCQlpZiAoZWNkaCAhPSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fc19vdXQsIlNldHRpbmcgdGVtcCBFQ0RIIHBhcmFtZXRlcnNcbiIpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19zX291dCwiVXNpbmcgZGVmYXVsdCB0ZW1wIEVDREggcGFyYW1ldGVyc1xuIik7CisJCQllY2RoID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKE5JRF9YOV82Ml9wcmltZTI1NnYxKTsKKwkJCWlmIChlY2RoID09IE5VTEwpIAorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJ1bmFibGUgdG8gY3JlYXRlIGN1cnZlIChuaXN0cDI1NilcbiIpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJKHZvaWQpQklPX2ZsdXNoKGJpb19zX291dCk7CisKKwkJU1NMX0NUWF9zZXRfdG1wX2VjZGgoY3R4LGVjZGgpOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQlpZiAoY3R4MikgCisJCQlTU0xfQ1RYX3NldF90bXBfZWNkaChjdHgyLGVjZGgpOworI2VuZGlmCisJCUVDX0tFWV9mcmVlKGVjZGgpOworCQl9CisjZW5kaWYKKwkKKwlpZiAoIXNldF9jZXJ0X2tleV9zdHVmZihjdHgsc19jZXJ0LHNfa2V5KSkKKwkJZ290byBlbmQ7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKGN0eDIgJiYgIXNldF9jZXJ0X2tleV9zdHVmZihjdHgyLHNfY2VydDIsc19rZXkyKSkKKwkJZ290byBlbmQ7IAorI2VuZGlmCisJaWYgKHNfZGNlcnQgIT0gTlVMTCkKKwkJeworCQlpZiAoIXNldF9jZXJ0X2tleV9zdHVmZihjdHgsc19kY2VydCxzX2RrZXkpKQorCQkJZ290byBlbmQ7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2lmIDEKKwlpZiAoIW5vX3RtcF9yc2EpCisJCXsKKwkJU1NMX0NUWF9zZXRfdG1wX3JzYV9jYWxsYmFjayhjdHgsdG1wX3JzYV9jYik7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWlmIChjdHgyKSAKKwkJCVNTTF9DVFhfc2V0X3RtcF9yc2FfY2FsbGJhY2soY3R4Mix0bXBfcnNhX2NiKTsKKyNlbmRpZgkJCisJCX0KKyNlbHNlCisJaWYgKCFub190bXBfcnNhICYmIFNTTF9DVFhfbmVlZF90bXBfUlNBKGN0eCkpCisJCXsKKwkJUlNBICpyc2E7CisKKwkJQklPX3ByaW50ZihiaW9fc19vdXQsIkdlbmVyYXRpbmcgdGVtcCAoNTEyIGJpdCkgUlNBIGtleS4uLiIpOworCQlCSU9fZmx1c2goYmlvX3Nfb3V0KTsKKworCQlyc2E9UlNBX2dlbmVyYXRlX2tleSg1MTIsUlNBX0Y0LE5VTEwpOworCisJCWlmICghU1NMX0NUWF9zZXRfdG1wX3JzYShjdHgscnNhKSkKKwkJCXsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJCWlmIChjdHgyKQorCQkJCXsKKwkJCQlpZiAoIVNTTF9DVFhfc2V0X3RtcF9yc2EoY3R4Mixyc2EpKQorCQkJCQl7CisJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCVJTQV9mcmVlKHJzYSk7CisJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJcbiIpOworCQl9CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisjaWZkZWYgT1BFTlNTTF9OT19KUEFLRQorCWlmIChwc2tfa2V5ICE9IE5VTEwpCisjZWxzZQorCWlmIChwc2tfa2V5ICE9IE5VTEwgfHwganBha2Vfc2VjcmV0KQorI2VuZGlmCisJCXsKKwkJaWYgKHNfZGVidWcpCisJCQlCSU9fcHJpbnRmKGJpb19zX291dCwgIlBTSyBrZXkgZ2l2ZW4gb3IgSlBBS0UgaW4gdXNlLCBzZXR0aW5nIHNlcnZlciBjYWxsYmFja1xuIik7CisJCVNTTF9DVFhfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soY3R4LCBwc2tfc2VydmVyX2NiKTsKKwkJfQorCisJaWYgKCFTU0xfQ1RYX3VzZV9wc2tfaWRlbnRpdHlfaGludChjdHgsIHBza19pZGVudGl0eV9oaW50KSkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHNldHRpbmcgUFNLIGlkZW50aXR5IGhpbnQgdG8gY29udGV4dFxuIik7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisjZW5kaWYKKworCWlmIChjaXBoZXIgIT0gTlVMTCkKKwkJeworCQlpZighU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY3R4LGNpcGhlcikpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHNldHRpbmcgY2lwaGVyIGxpc3RcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQlpZiAoY3R4MiAmJiAhU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY3R4MixjaXBoZXIpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciBzZXR0aW5nIGNpcGhlciBsaXN0XG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKyNlbmRpZgorCQl9CisJU1NMX0NUWF9zZXRfdmVyaWZ5KGN0eCxzX3NlcnZlcl92ZXJpZnksdmVyaWZ5X2NhbGxiYWNrKTsKKwlTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoY3R4LCh2b2lkKikmc19zZXJ2ZXJfc2Vzc2lvbl9pZF9jb250ZXh0LAorCQlzaXplb2Ygc19zZXJ2ZXJfc2Vzc2lvbl9pZF9jb250ZXh0KTsKKworCS8qIFNldCBEVExTIGNvb2tpZSBnZW5lcmF0aW9uIGFuZCB2ZXJpZmljYXRpb24gY2FsbGJhY2tzICovCisJU1NMX0NUWF9zZXRfY29va2llX2dlbmVyYXRlX2NiKGN0eCwgZ2VuZXJhdGVfY29va2llX2NhbGxiYWNrKTsKKwlTU0xfQ1RYX3NldF9jb29raWVfdmVyaWZ5X2NiKGN0eCwgdmVyaWZ5X2Nvb2tpZV9jYWxsYmFjayk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpZiAoY3R4MikKKwkJeworCQlTU0xfQ1RYX3NldF92ZXJpZnkoY3R4MixzX3NlcnZlcl92ZXJpZnksdmVyaWZ5X2NhbGxiYWNrKTsKKwkJU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KGN0eDIsKHZvaWQqKSZzX3NlcnZlcl9zZXNzaW9uX2lkX2NvbnRleHQsCisJCQlzaXplb2Ygc19zZXJ2ZXJfc2Vzc2lvbl9pZF9jb250ZXh0KTsKKworCQl0bHNleHRjYnAuYmlvZGVidWcgPSBiaW9fc19vdXQ7CisJCVNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKGN0eDIsIHNzbF9zZXJ2ZXJuYW1lX2NiKTsKKwkJU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfYXJnKGN0eDIsICZ0bHNleHRjYnApOworCQlTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFjayhjdHgsIHNzbF9zZXJ2ZXJuYW1lX2NiKTsKKwkJU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfYXJnKGN0eCwgJnRsc2V4dGNicCk7CisJCX0KKyNlbmRpZgorCisJaWYgKENBZmlsZSAhPSBOVUxMKQorCQl7CisJCVNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KGN0eCxTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShDQWZpbGUpKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJaWYgKGN0eDIpIAorCQkJU1NMX0NUWF9zZXRfY2xpZW50X0NBX2xpc3QoY3R4MixTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShDQWZpbGUpKTsKKyNlbmRpZgorCQl9CisKKwlCSU9fcHJpbnRmKGJpb19zX291dCwiQUNDRVBUXG4iKTsKKwkodm9pZClCSU9fZmx1c2goYmlvX3Nfb3V0KTsKKwlpZiAod3d3KQorCQlkb19zZXJ2ZXIocG9ydCxzb2NrZXRfdHlwZSwmYWNjZXB0X3NvY2tldCx3d3dfYm9keSwgY29udGV4dCk7CisJZWxzZQorCQlkb19zZXJ2ZXIocG9ydCxzb2NrZXRfdHlwZSwmYWNjZXB0X3NvY2tldCxzdl9ib2R5LCBjb250ZXh0KTsKKwlwcmludF9zdGF0cyhiaW9fc19vdXQsY3R4KTsKKwlyZXQ9MDsKK2VuZDoKKwlpZiAoY3R4ICE9IE5VTEwpIFNTTF9DVFhfZnJlZShjdHgpOworCWlmIChzX2NlcnQpCisJCVg1MDlfZnJlZShzX2NlcnQpOworCWlmIChzX2RjZXJ0KQorCQlYNTA5X2ZyZWUoc19kY2VydCk7CisJaWYgKHNfa2V5KQorCQlFVlBfUEtFWV9mcmVlKHNfa2V5KTsKKwlpZiAoc19ka2V5KQorCQlFVlBfUEtFWV9mcmVlKHNfZGtleSk7CisJaWYgKHBhc3MpCisJCU9QRU5TU0xfZnJlZShwYXNzKTsKKwlpZiAoZHBhc3MpCisJCU9QRU5TU0xfZnJlZShkcGFzcyk7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKGN0eDIgIT0gTlVMTCkgU1NMX0NUWF9mcmVlKGN0eDIpOworCWlmIChzX2NlcnQyKQorCQlYNTA5X2ZyZWUoc19jZXJ0Mik7CisJaWYgKHNfa2V5MikKKwkJRVZQX1BLRVlfZnJlZShzX2tleTIpOworI2VuZGlmCisJaWYgKGJpb19zX291dCAhPSBOVUxMKQorCQl7CisgICAgICAgIEJJT19mcmVlKGJpb19zX291dCk7CisJCWJpb19zX291dD1OVUxMOworCQl9CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHMoQklPICpiaW8sIFNTTF9DVFggKnNzbF9jdHgpCisJeworCUJJT19wcmludGYoYmlvLCIlNGxkIGl0ZW1zIGluIHRoZSBzZXNzaW9uIGNhY2hlXG4iLAorCQlTU0xfQ1RYX3Nlc3NfbnVtYmVyKHNzbF9jdHgpKTsKKwlCSU9fcHJpbnRmKGJpbywiJTRsZCBjbGllbnQgY29ubmVjdHMgKFNTTF9jb25uZWN0KCkpXG4iLAorCQlTU0xfQ1RYX3Nlc3NfY29ubmVjdChzc2xfY3R4KSk7CisJQklPX3ByaW50ZihiaW8sIiU0bGQgY2xpZW50IHJlbmVnb3RpYXRlcyAoU1NMX2Nvbm5lY3QoKSlcbiIsCisJCVNTTF9DVFhfc2Vzc19jb25uZWN0X3JlbmVnb3RpYXRlKHNzbF9jdHgpKTsKKwlCSU9fcHJpbnRmKGJpbywiJTRsZCBjbGllbnQgY29ubmVjdHMgdGhhdCBmaW5pc2hlZFxuIiwKKwkJU1NMX0NUWF9zZXNzX2Nvbm5lY3RfZ29vZChzc2xfY3R4KSk7CisJQklPX3ByaW50ZihiaW8sIiU0bGQgc2VydmVyIGFjY2VwdHMgKFNTTF9hY2NlcHQoKSlcbiIsCisJCVNTTF9DVFhfc2Vzc19hY2NlcHQoc3NsX2N0eCkpOworCUJJT19wcmludGYoYmlvLCIlNGxkIHNlcnZlciByZW5lZ290aWF0ZXMgKFNTTF9hY2NlcHQoKSlcbiIsCisJCVNTTF9DVFhfc2Vzc19hY2NlcHRfcmVuZWdvdGlhdGUoc3NsX2N0eCkpOworCUJJT19wcmludGYoYmlvLCIlNGxkIHNlcnZlciBhY2NlcHRzIHRoYXQgZmluaXNoZWRcbiIsCisJCVNTTF9DVFhfc2Vzc19hY2NlcHRfZ29vZChzc2xfY3R4KSk7CisJQklPX3ByaW50ZihiaW8sIiU0bGQgc2Vzc2lvbiBjYWNoZSBoaXRzXG4iLFNTTF9DVFhfc2Vzc19oaXRzKHNzbF9jdHgpKTsKKwlCSU9fcHJpbnRmKGJpbywiJTRsZCBzZXNzaW9uIGNhY2hlIG1pc3Nlc1xuIixTU0xfQ1RYX3Nlc3NfbWlzc2VzKHNzbF9jdHgpKTsKKwlCSU9fcHJpbnRmKGJpbywiJTRsZCBzZXNzaW9uIGNhY2hlIHRpbWVvdXRzXG4iLFNTTF9DVFhfc2Vzc190aW1lb3V0cyhzc2xfY3R4KSk7CisJQklPX3ByaW50ZihiaW8sIiU0bGQgY2FsbGJhY2sgY2FjaGUgaGl0c1xuIixTU0xfQ1RYX3Nlc3NfY2JfaGl0cyhzc2xfY3R4KSk7CisJQklPX3ByaW50ZihiaW8sIiU0bGQgY2FjaGUgZnVsbCBvdmVyZmxvd3MgKCVsZCBhbGxvd2VkKVxuIiwKKwkJU1NMX0NUWF9zZXNzX2NhY2hlX2Z1bGwoc3NsX2N0eCksCisJCVNTTF9DVFhfc2Vzc19nZXRfY2FjaGVfc2l6ZShzc2xfY3R4KSk7CisJfQorCitzdGF0aWMgaW50IHN2X2JvZHkoY2hhciAqaG9zdG5hbWUsIGludCBzLCB1bnNpZ25lZCBjaGFyICpjb250ZXh0KQorCXsKKwljaGFyICpidWY9TlVMTDsKKwlmZF9zZXQgcmVhZGZkczsKKwlpbnQgcmV0PTEsd2lkdGg7CisJaW50IGssaTsKKwl1bnNpZ25lZCBsb25nIGw7CisJU1NMICpjb249TlVMTDsKKwlCSU8gKnNiaW87CisJc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TX1I1KQorCXN0cnVjdCB0aW1ldmFsIHR2OworI2Vsc2UKKwlzdHJ1Y3QgdGltZXZhbCAqdGltZW91dHA7CisjZW5kaWYKKworCWlmICgoYnVmPU9QRU5TU0xfbWFsbG9jKGJ1ZnNpemUpKSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2Vyciwib3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyOworCQl9CisjaWZkZWYgRklPTkJJTwkKKwlpZiAoc19uYmlvKQorCQl7CisJCXVuc2lnbmVkIGxvbmcgc2w9MTsKKworCQlpZiAoIXNfcXVpZXQpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInR1cm5pbmcgb24gbm9uIGJsb2NraW5nIGlvXG4iKTsKKwkJaWYgKEJJT19zb2NrZXRfaW9jdGwocyxGSU9OQklPLCZzbCkgPCAwKQorCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJfQorI2VuZGlmCisKKwlpZiAoY29uID09IE5VTEwpIHsKKwkJY29uPVNTTF9uZXcoY3R4KTsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpZiAoc190bHNleHRkZWJ1ZykKKwkJeworCQlTU0xfc2V0X3Rsc2V4dF9kZWJ1Z19jYWxsYmFjayhjb24sIHRsc2V4dF9jYik7CisJCVNTTF9zZXRfdGxzZXh0X2RlYnVnX2FyZyhjb24sIGJpb19zX291dCk7CisJCX0KKwlpZiAoc190bHNleHRzdGF0dXMpCisJCXsKKwkJU1NMX0NUWF9zZXRfdGxzZXh0X3N0YXR1c19jYihjdHgsIGNlcnRfc3RhdHVzX2NiKTsKKwkJdGxzY3N0YXRwLmVyciA9IGJpb19lcnI7CisJCVNTTF9DVFhfc2V0X3Rsc2V4dF9zdGF0dXNfYXJnKGN0eCwgJnRsc2NzdGF0cCk7CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwkJaWYgKChjb24tPmtzc2xfY3R4ID0ga3NzbF9jdHhfbmV3KCkpICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrc3NsX2N0eF9zZXRzdHJpbmcoY29uLT5rc3NsX2N0eCwgS1NTTF9TRVJWSUNFLAorCQkJCQkJCQlLUkI1U1ZDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtzc2xfY3R4X3NldHN0cmluZyhjb24tPmtzc2xfY3R4LCBLU1NMX0tFWVRBQiwKKwkJCQkJCQkJS1JCNUtFWVRBQik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYJLyogT1BFTlNTTF9OT19LUkI1ICovCisJCWlmKGNvbnRleHQpCisJCSAgICAgIFNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KGNvbiwgY29udGV4dCwKKwkJCQkJCSBzdHJsZW4oKGNoYXIgKiljb250ZXh0KSk7CisJfQorCVNTTF9jbGVhcihjb24pOworI2lmIDAKKyNpZmRlZiBUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0CisJU1NMX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dChjb24sICJUZXN0IHNlcnZlciIsIDExKTsKKyNlbmRpZgorI2VuZGlmCisKKwlpZiAoU1NMX3ZlcnNpb24oY29uKSA9PSBEVExTMV9WRVJTSU9OKQorCQl7CisKKwkJc2Jpbz1CSU9fbmV3X2RncmFtKHMsQklPX05PQ0xPU0UpOworCisJCWlmIChlbmFibGVfdGltZW91dHMpCisJCQl7CisJCQl0aW1lb3V0LnR2X3NlYyA9IDA7CisJCQl0aW1lb3V0LnR2X3VzZWMgPSBER1JBTV9SQ1ZfVElNRU9VVDsKKwkJCUJJT19jdHJsKHNiaW8sIEJJT19DVFJMX0RHUkFNX1NFVF9SRUNWX1RJTUVPVVQsIDAsICZ0aW1lb3V0KTsKKwkJCQorCQkJdGltZW91dC50dl9zZWMgPSAwOworCQkJdGltZW91dC50dl91c2VjID0gREdSQU1fU05EX1RJTUVPVVQ7CisJCQlCSU9fY3RybChzYmlvLCBCSU9fQ1RSTF9ER1JBTV9TRVRfU0VORF9USU1FT1VULCAwLCAmdGltZW91dCk7CisJCQl9CisKKwkJaWYgKHNvY2tldF9tdHUgPiAyOCkKKwkJCXsKKwkJCVNTTF9zZXRfb3B0aW9ucyhjb24sIFNTTF9PUF9OT19RVUVSWV9NVFUpOworCQkJU1NMX3NldF9tdHUoY29uLCBzb2NrZXRfbXR1IC0gMjgpOworCQkJfQorCQllbHNlCisJCQkvKiB3YW50IHRvIGRvIE1UVSBkaXNjb3ZlcnkgKi8KKwkJCUJJT19jdHJsKHNiaW8sIEJJT19DVFJMX0RHUkFNX01UVV9ESVNDT1ZFUiwgMCwgTlVMTCk7CisKKyAgICAgICAgLyogdHVybiBvbiBjb29raWUgZXhjaGFuZ2UgKi8KKyAgICAgICAgU1NMX3NldF9vcHRpb25zKGNvbiwgU1NMX09QX0NPT0tJRV9FWENIQU5HRSk7CisJCX0KKwllbHNlCisJCXNiaW89QklPX25ld19zb2NrZXQocyxCSU9fTk9DTE9TRSk7CisKKwlpZiAoc19uYmlvX3Rlc3QpCisJCXsKKwkJQklPICp0ZXN0OworCisJCXRlc3Q9QklPX25ldyhCSU9fZl9uYmlvX3Rlc3QoKSk7CisJCXNiaW89QklPX3B1c2godGVzdCxzYmlvKTsKKwkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0pQQUtFCisJaWYoanBha2Vfc2VjcmV0KQorCQlqcGFrZV9zZXJ2ZXJfYXV0aChiaW9fc19vdXQsIHNiaW8sIGpwYWtlX3NlY3JldCk7CisjZW5kaWYKKworCVNTTF9zZXRfYmlvKGNvbixzYmlvLHNiaW8pOworCVNTTF9zZXRfYWNjZXB0X3N0YXRlKGNvbik7CisJLyogU1NMX3NldF9mZChjb24scyk7ICovCisKKwlpZiAoc19kZWJ1ZykKKwkJeworCQljb24tPmRlYnVnPTE7CisJCUJJT19zZXRfY2FsbGJhY2soU1NMX2dldF9yYmlvKGNvbiksYmlvX2R1bXBfY2FsbGJhY2spOworCQlCSU9fc2V0X2NhbGxiYWNrX2FyZyhTU0xfZ2V0X3JiaW8oY29uKSwoY2hhciAqKWJpb19zX291dCk7CisJCX0KKwlpZiAoc19tc2cpCisJCXsKKwkJU1NMX3NldF9tc2dfY2FsbGJhY2soY29uLCBtc2dfY2IpOworCQlTU0xfc2V0X21zZ19jYWxsYmFja19hcmcoY29uLCBiaW9fc19vdXQpOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKHNfdGxzZXh0ZGVidWcpCisJCXsKKwkJU1NMX3NldF90bHNleHRfZGVidWdfY2FsbGJhY2soY29uLCB0bHNleHRfY2IpOworCQlTU0xfc2V0X3Rsc2V4dF9kZWJ1Z19hcmcoY29uLCBiaW9fc19vdXQpOworCQl9CisjZW5kaWYKKworCXdpZHRoPXMrMTsKKwlmb3IgKDs7KQorCQl7CisJCWludCByZWFkX2Zyb21fdGVybWluYWw7CisJCWludCByZWFkX2Zyb21fc3NsY29uOworCisJCXJlYWRfZnJvbV90ZXJtaW5hbCA9IDA7CisJCXJlYWRfZnJvbV9zc2xjb24gPSBTU0xfcGVuZGluZyhjb24pOworCisJCWlmICghcmVhZF9mcm9tX3NzbGNvbikKKwkJCXsKKwkJCUZEX1pFUk8oJnJlYWRmZHMpOworI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TX1I1KQorCQkJb3BlbnNzbF9mZHNldChmaWxlbm8oc3RkaW4pLCZyZWFkZmRzKTsKKyNlbmRpZgorCQkJb3BlbnNzbF9mZHNldChzLCZyZWFkZmRzKTsKKwkJCS8qIE5vdGU6IHVuZGVyIFZNUyB3aXRoIFNPQ0tFVFNIUiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcworCQkJICogY3VycmVudGx5IG9mIHR5cGUgKGludCAqKSB3aGVyZWFzIHVuZGVyIG90aGVyIHN5c3RlbXMKKwkJCSAqIGl0IGlzICh2b2lkICopIGlmIHlvdSBkb24ndCBoYXZlIGEgY2FzdCBpdCB3aWxsIGNob2tlCisJCQkgKiB0aGUgY29tcGlsZXI6IGlmIHlvdSBkbyBoYXZlIGEgY2FzdCB0aGVuIHlvdSBjYW4gZWl0aGVyCisJCQkgKiBnbyBmb3IgKGludCAqKSBvciAodm9pZCAqKS4KKwkJCSAqLworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKQorICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5kZXIgRE9TIChub24tZGpncHApIGFuZCBXaW5kb3dzIHdlIGNhbid0IHNlbGVjdCBvbiBzdGRpbjogb25seQorCQkJICogb24gc29ja2V0cy4gQXMgYSB3b3JrYXJvdW5kIHdlIHRpbWVvdXQgdGhlIHNlbGVjdCBldmVyeQorCQkJICogc2Vjb25kIGFuZCBjaGVjayBmb3IgYW55IGtleXByZXNzLiBJbiBhIHByb3BlciBXaW5kb3dzCisJCQkgKiBhcHBsaWNhdGlvbiB3ZSB3b3VsZG4ndCBkbyB0aGlzIGJlY2F1c2UgaXQgaXMgaW5lZmZpY2llbnQuCisJCQkgKi8KKwkJCXR2LnR2X3NlYyA9IDE7CisJCQl0di50dl91c2VjID0gMDsKKwkJCWk9c2VsZWN0KHdpZHRoLCh2b2lkICopJnJlYWRmZHMsTlVMTCxOVUxMLCZ0dik7CisJCQlpZigoaSA8IDApIHx8ICghaSAmJiAhX2tiaGl0KCkgKSApY29udGludWU7CisJCQlpZihfa2JoaXQoKSkKKwkJCQlyZWFkX2Zyb21fdGVybWluYWwgPSAxOworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TX1I1KQorCQkJLyogVW5kZXIgQmVPUy1SNSB0aGUgc2l0dWF0aW9uIGlzIHNpbWlsYXIgdG8gRE9TICovCisJCQl0di50dl9zZWMgPSAxOworCQkJdHYudHZfdXNlYyA9IDA7CisJCQkodm9pZClmY250bChmaWxlbm8oc3RkaW4pLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKwkJCWk9c2VsZWN0KHdpZHRoLCh2b2lkICopJnJlYWRmZHMsTlVMTCxOVUxMLCZ0dik7CisJCQlpZiAoKGkgPCAwKSB8fCAoIWkgJiYgcmVhZChmaWxlbm8oc3RkaW4pLCBidWYsIDApIDwgMCkpCisJCQkJY29udGludWU7CisJCQlpZiAocmVhZChmaWxlbm8oc3RkaW4pLCBidWYsIDApID49IDApCisJCQkJcmVhZF9mcm9tX3Rlcm1pbmFsID0gMTsKKwkJCSh2b2lkKWZjbnRsKGZpbGVubyhzdGRpbiksIEZfU0VURkwsIDApOworI2Vsc2UKKwkJCWlmICgoU1NMX3ZlcnNpb24oY29uKSA9PSBEVExTMV9WRVJTSU9OKSAmJgorCQkJCURUTFN2MV9nZXRfdGltZW91dChjb24sICZ0aW1lb3V0KSkKKwkJCQl0aW1lb3V0cCA9ICZ0aW1lb3V0OworCQkJZWxzZQorCQkJCXRpbWVvdXRwID0gTlVMTDsKKworCQkJaT1zZWxlY3Qod2lkdGgsKHZvaWQgKikmcmVhZGZkcyxOVUxMLE5VTEwsdGltZW91dHApOworCisJCQlpZiAoKFNTTF92ZXJzaW9uKGNvbikgPT0gRFRMUzFfVkVSU0lPTikgJiYgRFRMU3YxX2hhbmRsZV90aW1lb3V0KGNvbikgPiAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlRJTUVPVVQgb2NjdXJlZFxuIik7CisJCQkJfQorCisJCQlpZiAoaSA8PSAwKSBjb250aW51ZTsKKwkJCWlmIChGRF9JU1NFVChmaWxlbm8oc3RkaW4pLCZyZWFkZmRzKSkKKwkJCQlyZWFkX2Zyb21fdGVybWluYWwgPSAxOworI2VuZGlmCisJCQlpZiAoRkRfSVNTRVQocywmcmVhZGZkcykpCisJCQkJcmVhZF9mcm9tX3NzbGNvbiA9IDE7CisJCQl9CisJCWlmIChyZWFkX2Zyb21fdGVybWluYWwpCisJCQl7CisJCQlpZiAoc19jcmxmKQorCQkJCXsKKwkJCQlpbnQgaiwgbGZfbnVtOworCisJCQkJaT1yYXdfcmVhZF9zdGRpbihidWYsIGJ1ZnNpemUvMik7CisJCQkJbGZfbnVtID0gMDsKKwkJCQkvKiBib3RoIGxvb3BzIGFyZSBza2lwcGVkIHdoZW4gaSA8PSAwICovCisJCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQkJaWYgKGJ1ZltqXSA9PSAnXG4nKQorCQkJCQkJbGZfbnVtKys7CisJCQkJZm9yIChqID0gaS0xOyBqID49IDA7IGotLSkKKwkJCQkJeworCQkJCQlidWZbaitsZl9udW1dID0gYnVmW2pdOworCQkJCQlpZiAoYnVmW2pdID09ICdcbicpCisJCQkJCQl7CisJCQkJCQlsZl9udW0tLTsKKwkJCQkJCWkrKzsKKwkJCQkJCWJ1ZltqK2xmX251bV0gPSAnXHInOworCQkJCQkJfQorCQkJCQl9CisJCQkJYXNzZXJ0KGxmX251bSA9PSAwKTsKKwkJCQl9CisJCQllbHNlCisJCQkJaT1yYXdfcmVhZF9zdGRpbihidWYsYnVmc2l6ZSk7CisJCQlpZiAoIXNfcXVpZXQpCisJCQkJeworCQkJCWlmICgoaSA8PSAwKSB8fCAoYnVmWzBdID09ICdRJykpCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihiaW9fc19vdXQsIkRPTkVcbiIpOworCQkJCQlTSFVURE9XTihzKTsKKwkJCQkJY2xvc2VfYWNjZXB0X3NvY2tldCgpOworCQkJCQlyZXQ9IC0xMTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlpZiAoKGkgPD0gMCkgfHwgKGJ1ZlswXSA9PSAncScpKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJET05FXG4iKTsKKwkJCQkJaWYgKFNTTF92ZXJzaW9uKGNvbikgIT0gRFRMUzFfVkVSU0lPTikKKyAgICAgICAgICAgICAgICAgICAgICAgIFNIVVRET1dOKHMpOworCS8qCQkJCWNsb3NlX2FjY2VwdF9zb2NrZXQoKTsKKwkJCQkJcmV0PSAtMTE7Ki8KKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKworCQkJCWlmICgoYnVmWzBdID09ICdyJykgJiYgCisJCQkJCSgoYnVmWzFdID09ICdcbicpIHx8IChidWZbMV0gPT0gJ1xyJykpKQorCQkJCQl7CisJCQkJCVNTTF9yZW5lZ290aWF0ZShjb24pOworCQkJCQlpPVNTTF9kb19oYW5kc2hha2UoY29uKTsKKwkJCQkJcHJpbnRmKCJTU0xfZG9faGFuZHNoYWtlIC0+ICVkXG4iLGkpOworCQkJCQlpPTA7IC8qMTM7ICovCisJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBzdHJjcHkoYnVmLCJzZXJ2ZXIgc2lkZSBSRS1ORUdPVElBVEVcbiIpOyAqLworCQkJCQl9CisJCQkJaWYgKChidWZbMF0gPT0gJ1InKSAmJgorCQkJCQkoKGJ1ZlsxXSA9PSAnXG4nKSB8fCAoYnVmWzFdID09ICdccicpKSkKKwkJCQkJeworCQkJCQlTU0xfc2V0X3ZlcmlmeShjb24sCisJCQkJCQlTU0xfVkVSSUZZX1BFRVJ8U1NMX1ZFUklGWV9DTElFTlRfT05DRSxOVUxMKTsKKwkJCQkJU1NMX3JlbmVnb3RpYXRlKGNvbik7CisJCQkJCWk9U1NMX2RvX2hhbmRzaGFrZShjb24pOworCQkJCQlwcmludGYoIlNTTF9kb19oYW5kc2hha2UgLT4gJWRcbiIsaSk7CisJCQkJCWk9MDsgLyogMTM7ICovCisJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBzdHJjcHkoYnVmLCJzZXJ2ZXIgc2lkZSBSRS1ORUdPVElBVEUgYXNraW5nIGZvciBjbGllbnQgY2VydFxuIik7ICovCisJCQkJCX0KKwkJCQlpZiAoYnVmWzBdID09ICdQJykKKwkJCQkJeworCQkJCQlzdGF0aWMgY29uc3QgY2hhciAqc3RyPSJMZXRzIHByaW50IHNvbWUgY2xlYXIgdGV4dFxuIjsKKwkJCQkJQklPX3dyaXRlKFNTTF9nZXRfd2Jpbyhjb24pLHN0cixzdHJsZW4oc3RyKSk7CisJCQkJCX0KKwkJCQlpZiAoYnVmWzBdID09ICdTJykKKwkJCQkJeworCQkJCQlwcmludF9zdGF0cyhiaW9fc19vdXQsU1NMX2dldF9TU0xfQ1RYKGNvbikpOworCQkJCQl9CisJCQkJfQorI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCQllYmNkaWMyYXNjaWkoYnVmLGJ1ZixpKTsKKyNlbmRpZgorCQkJbD1rPTA7CisJCQlmb3IgKDs7KQorCQkJCXsKKwkJCQkvKiBzaG91bGQgZG8gYSBzZWxlY3QgZm9yIHRoZSB3cml0ZSAqLworI2lmZGVmIFJFTkVHCit7IHN0YXRpYyBjb3VudD0wOyBpZiAoKytjb3VudCA9PSAxMDApIHsgY291bnQ9MDsgU1NMX3JlbmVnb3RpYXRlKGNvbik7IH0gfQorI2VuZGlmCisJCQkJaz1TU0xfd3JpdGUoY29uLCYoYnVmW2xdKSwodW5zaWduZWQgaW50KWkpOworCQkJCXN3aXRjaCAoU1NMX2dldF9lcnJvcihjb24saykpCisJCQkJCXsKKwkJCQljYXNlIFNTTF9FUlJPUl9OT05FOgorCQkJCQlicmVhazsKKwkJCQljYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorCQkJCWNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKwkJCQljYXNlIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQOgorCQkJCQlCSU9fcHJpbnRmKGJpb19zX291dCwiV3JpdGUgQkxPQ0tcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorCQkJCWNhc2UgU1NMX0VSUk9SX1NTTDoKKwkJCQkJQklPX3ByaW50ZihiaW9fc19vdXQsIkVSUk9SXG4iKTsKKwkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJcmV0PTE7CisJCQkJCWdvdG8gZXJyOworCQkJCQkvKiBicmVhazsgKi8KKwkJCQljYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKwkJCQkJQklPX3ByaW50ZihiaW9fc19vdXQsIkRPTkVcbiIpOworCQkJCQlyZXQ9MTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlsKz1rOworCQkJCWktPWs7CisJCQkJaWYgKGkgPD0gMCkgYnJlYWs7CisJCQkJfQorCQkJfQorCQlpZiAocmVhZF9mcm9tX3NzbGNvbikKKwkJCXsKKwkJCWlmICghU1NMX2lzX2luaXRfZmluaXNoZWQoY29uKSkKKwkJCQl7CisJCQkJaT1pbml0X3NzbF9jb25uZWN0aW9uKGNvbik7CisJCQkJCisJCQkJaWYgKGkgPCAwKQorCQkJCQl7CisJCQkJCXJldD0wOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UgaWYgKGkgPT0gMCkKKwkJCQkJeworCQkJCQlyZXQ9MTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlCisJCQkJeworYWdhaW46CQorCQkJCWk9U1NMX3JlYWQoY29uLChjaGFyICopYnVmLGJ1ZnNpemUpOworCQkJCXN3aXRjaCAoU1NMX2dldF9lcnJvcihjb24saSkpCisJCQkJCXsKKwkJCQljYXNlIFNTTF9FUlJPUl9OT05FOgorI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCQkJCWFzY2lpMmViY2RpYyhidWYsYnVmLGkpOworI2VuZGlmCisJCQkJCXJhd193cml0ZV9zdGRvdXQoYnVmLAorCQkJCQkJKHVuc2lnbmVkIGludClpKTsKKwkJCQkJaWYgKFNTTF9wZW5kaW5nKGNvbikpIGdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisJCQkJY2FzZSBTU0xfRVJST1JfV0FOVF9SRUFEOgorCQkJCWNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJCQkJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJSZWFkIEJMT0NLXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTU0xfRVJST1JfU1lTQ0FMTDoKKwkJCQljYXNlIFNTTF9FUlJPUl9TU0w6CisJCQkJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJFUlJPUlxuIik7CisJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJCXJldD0xOworCQkJCQlnb3RvIGVycjsKKwkJCQljYXNlIFNTTF9FUlJPUl9aRVJPX1JFVFVSTjoKKwkJCQkJQklPX3ByaW50ZihiaW9fc19vdXQsIkRPTkVcbiIpOworCQkJCQlyZXQ9MTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KK2VycjoKKwlpZiAoY29uICE9IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fc19vdXQsInNodXR0aW5nIGRvd24gU1NMXG4iKTsKKyNpZiAxCisJCVNTTF9zZXRfc2h1dGRvd24oY29uLFNTTF9TRU5UX1NIVVRET1dOfFNTTF9SRUNFSVZFRF9TSFVURE9XTik7CisjZWxzZQorCQlTU0xfc2h1dGRvd24oY29uKTsKKyNlbmRpZgorCQlTU0xfZnJlZShjb24pOworCQl9CisJQklPX3ByaW50ZihiaW9fc19vdXQsIkNPTk5FQ1RJT04gQ0xPU0VEXG4iKTsKKwlpZiAoYnVmICE9IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9jbGVhbnNlKGJ1ZixidWZzaXplKTsKKwkJT1BFTlNTTF9mcmVlKGJ1Zik7CisJCX0KKwlpZiAocmV0ID49IDApCisJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJBQ0NFUFRcbiIpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIHZvaWQgY2xvc2VfYWNjZXB0X3NvY2tldCh2b2lkKQorCXsKKwlCSU9fcHJpbnRmKGJpb19lcnIsInNodXRkb3duIGFjY2VwdCBzb2NrZXRcbiIpOworCWlmIChhY2NlcHRfc29ja2V0ID49IDApCisJCXsKKwkJU0hVVERPV04yKGFjY2VwdF9zb2NrZXQpOworCQl9CisJfQorCitzdGF0aWMgaW50IGluaXRfc3NsX2Nvbm5lY3Rpb24oU1NMICpjb24pCisJeworCWludCBpOworCWNvbnN0IGNoYXIgKnN0cjsKKwlYNTA5ICpwZWVyOworCWxvbmcgdmVyaWZ5X2Vycm9yOworCU1TX1NUQVRJQyBjaGFyIGJ1ZltCVUZTSVpdOworCisJaWYgKChpPVNTTF9hY2NlcHQoY29uKSkgPD0gMCkKKwkJeworCQlpZiAoQklPX3NvY2tfc2hvdWxkX3JldHJ5KGkpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fc19vdXQsIkRFTEFZXG4iKTsKKwkJCXJldHVybigxKTsKKwkJCX0KKworCQlCSU9fcHJpbnRmKGJpb19lcnIsIkVSUk9SXG4iKTsKKwkJdmVyaWZ5X2Vycm9yPVNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChjb24pOworCQlpZiAodmVyaWZ5X2Vycm9yICE9IFg1MDlfVl9PSykKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IGVycm9yOiVzXG4iLAorCQkJCVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHZlcmlmeV9lcnJvcikpOworCQkJfQorCQllbHNlCisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlyZXR1cm4oMCk7CisJCX0KKworCVBFTV93cml0ZV9iaW9fU1NMX1NFU1NJT04oYmlvX3Nfb3V0LFNTTF9nZXRfc2Vzc2lvbihjb24pKTsKKworCXBlZXI9U1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKGNvbik7CisJaWYgKHBlZXIgIT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19zX291dCwiQ2xpZW50IGNlcnRpZmljYXRlXG4iKTsKKwkJUEVNX3dyaXRlX2Jpb19YNTA5KGJpb19zX291dCxwZWVyKTsKKwkJWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHBlZXIpLGJ1ZixzaXplb2YgYnVmKTsKKwkJQklPX3ByaW50ZihiaW9fc19vdXQsInN1YmplY3Q9JXNcbiIsYnVmKTsKKwkJWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUocGVlciksYnVmLHNpemVvZiBidWYpOworCQlCSU9fcHJpbnRmKGJpb19zX291dCwiaXNzdWVyPSVzXG4iLGJ1Zik7CisJCVg1MDlfZnJlZShwZWVyKTsKKwkJfQorCisJaWYgKFNTTF9nZXRfc2hhcmVkX2NpcGhlcnMoY29uLGJ1ZixzaXplb2YgYnVmKSAhPSBOVUxMKQorCQlCSU9fcHJpbnRmKGJpb19zX291dCwiU2hhcmVkIGNpcGhlcnM6JXNcbiIsYnVmKTsKKwlzdHI9U1NMX0NJUEhFUl9nZXRfbmFtZShTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKGNvbikpOworCUJJT19wcmludGYoYmlvX3Nfb3V0LCJDSVBIRVIgaXMgJXNcbiIsKHN0ciAhPSBOVUxMKT9zdHI6IihOT05FKSIpOworCWlmIChjb24tPmhpdCkgQklPX3ByaW50ZihiaW9fc19vdXQsIlJldXNlZCBzZXNzaW9uLWlkXG4iKTsKKwlpZiAoU1NMX2N0cmwoY29uLFNTTF9DVFJMX0dFVF9GTEFHUywwLE5VTEwpICYKKwkJVExTMV9GTEFHU19UTFNfUEFERElOR19CVUcpCisJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJQZWVyIGhhcyBpbmNvcnJlY3QgVExTdjEgYmxvY2sgcGFkZGluZ1xuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCWlmIChjb24tPmtzc2xfY3R4LT5jbGllbnRfcHJpbmMgIT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19zX291dCwiS2VyYmVyb3MgcGVlciBwcmluY2lwYWwgaXMgJXNcbiIsCisJCQljb24tPmtzc2xfY3R4LT5jbGllbnRfcHJpbmMpOworCQl9CisjZW5kaWYgLyogT1BFTlNTTF9OT19LUkI1ICovCisJQklPX3ByaW50ZihiaW9fc19vdXQsICJTZWN1cmUgUmVuZWdvdGlhdGlvbiBJUyVzIHN1cHBvcnRlZFxuIiwKKwkJICAgICAgU1NMX2dldF9zZWN1cmVfcmVuZWdvdGlhdGlvbl9zdXBwb3J0KGNvbikgPyAiIiA6ICIgTk9UIik7CisJcmV0dXJuKDEpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0RICitzdGF0aWMgREggKmxvYWRfZGhfcGFyYW0oY29uc3QgY2hhciAqZGhmaWxlKQorCXsKKwlESCAqcmV0PU5VTEw7CisJQklPICpiaW87CisKKwlpZiAoKGJpbz1CSU9fbmV3X2ZpbGUoZGhmaWxlLCJyIikpID09IE5VTEwpCisJCWdvdG8gZXJyOworCXJldD1QRU1fcmVhZF9iaW9fREhwYXJhbXMoYmlvLE5VTEwsTlVMTCxOVUxMKTsKK2VycjoKKwlpZiAoYmlvICE9IE5VTEwpIEJJT19mcmVlKGJpbyk7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgaW50IGxvYWRfQ0EoU1NMX0NUWCAqY3R4LCBjaGFyICpmaWxlKQorCXsKKwlGSUxFICppbjsKKwlYNTA5ICp4PU5VTEw7CisKKwlpZiAoKGluPWZvcGVuKGZpbGUsInIiKSkgPT0gTlVMTCkKKwkJcmV0dXJuKDApOworCisJZm9yICg7OykKKwkJeworCQlpZiAoUEVNX3JlYWRfWDUwOShpbiwmeCxOVUxMKSA9PSBOVUxMKQorCQkJYnJlYWs7CisJCVNTTF9DVFhfYWRkX2NsaWVudF9DQShjdHgseCk7CisJCX0KKwlpZiAoeCAhPSBOVUxMKSBYNTA5X2ZyZWUoeCk7CisJZmNsb3NlKGluKTsKKwlyZXR1cm4oMSk7CisJfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgd3d3X2JvZHkoY2hhciAqaG9zdG5hbWUsIGludCBzLCB1bnNpZ25lZCBjaGFyICpjb250ZXh0KQorCXsKKwljaGFyICpidWY9TlVMTDsKKwlpbnQgcmV0PTE7CisJaW50IGksaixrLGJsYW5rLGRvdDsKKwlTU0wgKmNvbjsKKwljb25zdCBTU0xfQ0lQSEVSICpjOworCUJJTyAqaW8sKnNzbF9iaW8sKnNiaW87CisJbG9uZyB0b3RhbF9ieXRlczsKKworCWJ1Zj1PUEVOU1NMX21hbGxvYyhidWZzaXplKTsKKwlpZiAoYnVmID09IE5VTEwpIHJldHVybigwKTsKKwlpbz1CSU9fbmV3KEJJT19mX2J1ZmZlcigpKTsKKwlzc2xfYmlvPUJJT19uZXcoQklPX2Zfc3NsKCkpOworCWlmICgoaW8gPT0gTlVMTCkgfHwgKHNzbF9iaW8gPT0gTlVMTCkpIGdvdG8gZXJyOworCisjaWZkZWYgRklPTkJJTwkKKwlpZiAoc19uYmlvKQorCQl7CisJCXVuc2lnbmVkIGxvbmcgc2w9MTsKKworCQlpZiAoIXNfcXVpZXQpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInR1cm5pbmcgb24gbm9uIGJsb2NraW5nIGlvXG4iKTsKKwkJaWYgKEJJT19zb2NrZXRfaW9jdGwocyxGSU9OQklPLCZzbCkgPCAwKQorCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJfQorI2VuZGlmCisKKwkvKiBsZXRzIG1ha2UgdGhlIG91dHB1dCBidWZmZXIgYSByZWFzb25hYmxlIHNpemUgKi8KKwlpZiAoIUJJT19zZXRfd3JpdGVfYnVmZmVyX3NpemUoaW8sYnVmc2l6ZSkpIGdvdG8gZXJyOworCisJaWYgKChjb249U1NMX25ldyhjdHgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJaWYgKHNfdGxzZXh0ZGVidWcpCisJCQl7CisJCQlTU0xfc2V0X3Rsc2V4dF9kZWJ1Z19jYWxsYmFjayhjb24sIHRsc2V4dF9jYik7CisJCQlTU0xfc2V0X3Rsc2V4dF9kZWJ1Z19hcmcoY29uLCBiaW9fc19vdXQpOworCQkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCWlmICgoY29uLT5rc3NsX2N0eCA9IGtzc2xfY3R4X25ldygpKSAhPSBOVUxMKQorCQl7CisJCWtzc2xfY3R4X3NldHN0cmluZyhjb24tPmtzc2xfY3R4LCBLU1NMX1NFUlZJQ0UsIEtSQjVTVkMpOworCQlrc3NsX2N0eF9zZXRzdHJpbmcoY29uLT5rc3NsX2N0eCwgS1NTTF9LRVlUQUIsIEtSQjVLRVlUQUIpOworCQl9CisjZW5kaWYJLyogT1BFTlNTTF9OT19LUkI1ICovCisJaWYoY29udGV4dCkgU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoY29uLCBjb250ZXh0LAorCQkJCQkgICAgICAgc3RybGVuKChjaGFyICopY29udGV4dCkpOworCisJc2Jpbz1CSU9fbmV3X3NvY2tldChzLEJJT19OT0NMT1NFKTsKKwlpZiAoc19uYmlvX3Rlc3QpCisJCXsKKwkJQklPICp0ZXN0OworCisJCXRlc3Q9QklPX25ldyhCSU9fZl9uYmlvX3Rlc3QoKSk7CisJCXNiaW89QklPX3B1c2godGVzdCxzYmlvKTsKKwkJfQorCVNTTF9zZXRfYmlvKGNvbixzYmlvLHNiaW8pOworCVNTTF9zZXRfYWNjZXB0X3N0YXRlKGNvbik7CisKKwkvKiBTU0xfc2V0X2ZkKGNvbixzKTsgKi8KKwlCSU9fc2V0X3NzbChzc2xfYmlvLGNvbixCSU9fQ0xPU0UpOworCUJJT19wdXNoKGlvLHNzbF9iaW8pOworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJaW8gPSBCSU9fcHVzaChCSU9fbmV3KEJJT19mX2ViY2RpY19maWx0ZXIoKSksaW8pOworI2VuZGlmCisKKwlpZiAoc19kZWJ1ZykKKwkJeworCQljb24tPmRlYnVnPTE7CisJCUJJT19zZXRfY2FsbGJhY2soU1NMX2dldF9yYmlvKGNvbiksYmlvX2R1bXBfY2FsbGJhY2spOworCQlCSU9fc2V0X2NhbGxiYWNrX2FyZyhTU0xfZ2V0X3JiaW8oY29uKSwoY2hhciAqKWJpb19zX291dCk7CisJCX0KKwlpZiAoc19tc2cpCisJCXsKKwkJU1NMX3NldF9tc2dfY2FsbGJhY2soY29uLCBtc2dfY2IpOworCQlTU0xfc2V0X21zZ19jYWxsYmFja19hcmcoY29uLCBiaW9fc19vdXQpOworCQl9CisKKwlibGFuaz0wOworCWZvciAoOzspCisJCXsKKwkJaWYgKGhhY2spCisJCQl7CisJCQlpPVNTTF9hY2NlcHQoY29uKTsKKworCQkJc3dpdGNoIChTU0xfZ2V0X2Vycm9yKGNvbixpKSkKKwkJCQl7CisJCQljYXNlIFNTTF9FUlJPUl9OT05FOgorCQkJCWJyZWFrOworCQkJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkJCWNhc2UgU1NMX0VSUk9SX1dBTlRfUkVBRDoKKwkJCWNhc2UgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVA6CisJCQkJY29udGludWU7CisJCQljYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorCQkJY2FzZSBTU0xfRVJST1JfU1NMOgorCQkJY2FzZSBTU0xfRVJST1JfWkVST19SRVRVUk46CisJCQkJcmV0PTE7CisJCQkJZ290byBlcnI7CisJCQkJLyogYnJlYWs7ICovCisJCQkJfQorCisJCQlTU0xfcmVuZWdvdGlhdGUoY29uKTsKKwkJCVNTTF93cml0ZShjb24sTlVMTCwwKTsKKwkJCX0KKworCQlpPUJJT19nZXRzKGlvLGJ1ZixidWZzaXplLTEpOworCQlpZiAoaSA8IDApIC8qIGVycm9yICovCisJCQl7CisJCQlpZiAoIUJJT19zaG91bGRfcmV0cnkoaW8pKQorCQkJCXsKKwkJCQlpZiAoIXNfcXVpZXQpCisJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19zX291dCwicmVhZCBSIEJMT0NLXG4iKTsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisgICAgICAgICAgICBkZWxheSgxMDAwKTsKKyNlbGlmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChfX0RKR1BQX18pCisJCQkJc2xlZXAoMSk7CisjZW5kaWYKKwkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKGkgPT0gMCkgLyogZW5kIG9mIGlucHV0ICovCisJCQl7CisJCQlyZXQ9MTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCS8qIGVsc2Ugd2UgaGF2ZSBkYXRhICovCisJCWlmICgJKCh3d3cgPT0gMSkgJiYgKHN0cm5jbXAoIkdFVCAiLGJ1Ziw0KSA9PSAwKSkgfHwKKwkJCSgod3d3ID09IDIpICYmIChzdHJuY21wKCJHRVQgL3N0YXRzICIsYnVmLDEwKSA9PSAwKSkpCisJCQl7CisJCQljaGFyICpwOworCQkJWDUwOSAqcGVlcjsKKwkJCVNUQUNLX09GKFNTTF9DSVBIRVIpICpzazsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpzcGFjZT0iICAgICAgICAgICAgICAgICAgICAgICAgICAiOworCisJCQlCSU9fcHV0cyhpbywiSFRUUC8xLjAgMjAwIG9rXHJcbkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXHJcblxyXG4iKTsKKwkJCUJJT19wdXRzKGlvLCI8SFRNTD48Qk9EWSBCR0NPTE9SPVwiI2ZmZmZmZlwiPlxuIik7CisJCQlCSU9fcHV0cyhpbywiPHByZT5cbiIpOworLyoJCQlCSU9fcHV0cyhpbyxTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpOyovCisJCQlCSU9fcHV0cyhpbywiXG4iKTsKKwkJCWZvciAoaT0wOyBpPGxvY2FsX2FyZ2M7IGkrKykKKwkJCQl7CisJCQkJQklPX3B1dHMoaW8sbG9jYWxfYXJndltpXSk7CisJCQkJQklPX3dyaXRlKGlvLCIgIiwxKTsKKwkJCQl9CisJCQlCSU9fcHV0cyhpbywiXG4iKTsKKworCQkJLyogVGhlIGZvbGxvd2luZyBpcyBldmlsIGFuZCBzaG91bGQgbm90IHJlYWxseQorCQkJICogYmUgZG9uZSAqLworCQkJQklPX3ByaW50ZihpbywiQ2lwaGVycyBzdXBwb3J0ZWQgaW4gc19zZXJ2ZXIgYmluYXJ5XG4iKTsKKwkJCXNrPVNTTF9nZXRfY2lwaGVycyhjb24pOworCQkJaj1za19TU0xfQ0lQSEVSX251bShzayk7CisJCQlmb3IgKGk9MDsgaTxqOyBpKyspCisJCQkJeworCQkJCWM9c2tfU1NMX0NJUEhFUl92YWx1ZShzayxpKTsKKwkJCQlCSU9fcHJpbnRmKGlvLCIlLTExczolLTI1cyIsCisJCQkJCVNTTF9DSVBIRVJfZ2V0X3ZlcnNpb24oYyksCisJCQkJCVNTTF9DSVBIRVJfZ2V0X25hbWUoYykpOworCQkJCWlmICgoKChpKzEpJTIpID09IDApICYmIChpKzEgIT0gaikpCisJCQkJCUJJT19wdXRzKGlvLCJcbiIpOworCQkJCX0KKwkJCUJJT19wdXRzKGlvLCJcbiIpOworCQkJcD1TU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKGNvbixidWYsYnVmc2l6ZSk7CisJCQlpZiAocCAhPSBOVUxMKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGlvLCItLS1cbkNpcGhlcnMgY29tbW9uIGJldHdlZW4gYm90aCBTU0wgZW5kIHBvaW50czpcbiIpOworCQkJCWo9aT0wOworCQkJCXdoaWxlICgqcCkKKwkJCQkJeworCQkJCQlpZiAoKnAgPT0gJzonKQorCQkJCQkJeworCQkJCQkJQklPX3dyaXRlKGlvLHNwYWNlLDI2LWopOworCQkJCQkJaSsrOworCQkJCQkJaj0wOworCQkJCQkJQklPX3dyaXRlKGlvLCgoaSUzKT8iICI6IlxuIiksMSk7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCUJJT193cml0ZShpbyxwLDEpOworCQkJCQkJaisrOworCQkJCQkJfQorCQkJCQlwKys7CisJCQkJCX0KKwkJCQlCSU9fcHV0cyhpbywiXG4iKTsKKwkJCQl9CisJCQlCSU9fcHJpbnRmKGlvLCgoY29uLT5oaXQpCisJCQkJPyItLS1cblJldXNlZCwgIgorCQkJCToiLS0tXG5OZXcsICIpKTsKKwkJCWM9U1NMX2dldF9jdXJyZW50X2NpcGhlcihjb24pOworCQkJQklPX3ByaW50ZihpbywiJXMsIENpcGhlciBpcyAlc1xuIiwKKwkJCQlTU0xfQ0lQSEVSX2dldF92ZXJzaW9uKGMpLAorCQkJCVNTTF9DSVBIRVJfZ2V0X25hbWUoYykpOworCQkJU1NMX1NFU1NJT05fcHJpbnQoaW8sU1NMX2dldF9zZXNzaW9uKGNvbikpOworCQkJQklPX3ByaW50ZihpbywiLS0tXG4iKTsKKwkJCXByaW50X3N0YXRzKGlvLFNTTF9nZXRfU1NMX0NUWChjb24pKTsKKwkJCUJJT19wcmludGYoaW8sIi0tLVxuIik7CisJCQlwZWVyPVNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShjb24pOworCQkJaWYgKHBlZXIgIT0gTlVMTCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihpbywiQ2xpZW50IGNlcnRpZmljYXRlXG4iKTsKKwkJCQlYNTA5X3ByaW50KGlvLHBlZXIpOworCQkJCVBFTV93cml0ZV9iaW9fWDUwOShpbyxwZWVyKTsKKwkJCQl9CisJCQllbHNlCisJCQkJQklPX3B1dHMoaW8sIm5vIGNsaWVudCBjZXJ0aWZpY2F0ZSBhdmFpbGFibGVcbiIpOworCQkJQklPX3B1dHMoaW8sIjwvQk9EWT48L0hUTUw+XHJcblxyXG4iKTsKKwkJCWJyZWFrOworCQkJfQorCQllbHNlIGlmICgod3d3ID09IDIgfHwgd3d3ID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN0cm5jbXAoIkdFVCAvIixidWYsNSkgPT0gMCkpCisJCQl7CisJCQlCSU8gKmZpbGU7CisJCQljaGFyICpwLCplOworCQkJc3RhdGljIGNvbnN0IGNoYXIgKnRleHQ9IkhUVFAvMS4wIDIwMCBva1xyXG5Db250ZW50LXR5cGU6IHRleHQvcGxhaW5cclxuXHJcbiI7CisKKwkJCS8qIHNraXAgdGhlICcvJyAqLworCQkJcD0gJihidWZbNV0pOworCisJCQlkb3QgPSAxOworCQkJZm9yIChlPXA7ICplICE9ICdcMCc7IGUrKykKKwkJCQl7CisJCQkJaWYgKGVbMF0gPT0gJyAnKQorCQkJCQlicmVhazsKKworCQkJCXN3aXRjaCAoZG90KQorCQkJCQl7CisJCQkJY2FzZSAxOgorCQkJCQlkb3QgPSAoZVswXSA9PSAnLicpID8gMiA6IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJZG90ID0gKGVbMF0gPT0gJy4nKSA/IDMgOiAwOworCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCWRvdCA9IChlWzBdID09ICcvJykgPyAtMSA6IDA7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJaWYgKGRvdCA9PSAwKQorCQkJCQlkb3QgPSAoZVswXSA9PSAnLycpID8gMSA6IDA7CisJCQkJfQorCQkJZG90ID0gKGRvdCA9PSAzKSB8fCAoZG90ID09IC0xKTsgLyogZmlsZW5hbWUgY29udGFpbnMgIi4uIiBjb21wb25lbnQgKi8KKworCQkJaWYgKCplID09ICdcMCcpCisJCQkJeworCQkJCUJJT19wdXRzKGlvLHRleHQpOworCQkJCUJJT19wcmludGYoaW8sIiclcycgaXMgYW4gaW52YWxpZCBmaWxlIG5hbWVcclxuIixwKTsKKwkJCQlicmVhazsKKwkJCQl9CisJCQkqZT0nXDAnOworCisJCQlpZiAoZG90KQorCQkJCXsKKwkJCQlCSU9fcHV0cyhpbyx0ZXh0KTsKKwkJCQlCSU9fcHJpbnRmKGlvLCInJXMnIGNvbnRhaW5zICcuLicgcmVmZXJlbmNlXHJcbiIscCk7CisJCQkJYnJlYWs7CisJCQkJfQorCisJCQlpZiAoKnAgPT0gJy8nKQorCQkJCXsKKwkJCQlCSU9fcHV0cyhpbyx0ZXh0KTsKKwkJCQlCSU9fcHJpbnRmKGlvLCInJXMnIGlzIGFuIGludmFsaWQgcGF0aFxyXG4iLHApOworCQkJCWJyZWFrOworCQkJCX0KKworI2lmIDAKKwkJCS8qIGFwcGVuZCBpZiBhIGRpcmVjdG9yeSBsb29rdXAgKi8KKwkJCWlmIChlWy0xXSA9PSAnLycpCisJCQkJc3RyY2F0KHAsImluZGV4Lmh0bWwiKTsKKyNlbmRpZgorCisJCQkvKiBpZiBhIGRpcmVjdG9yeSwgZG8gdGhlIGluZGV4IHRoYW5nICovCisJCQlpZiAoYXBwX2lzZGlyKHApPjApCisJCQkJeworI2lmIDAgLyogbXVzdCBjaGVjayBidWZmZXIgc2l6ZSAqLworCQkJCXN0cmNhdChwLCIvaW5kZXguaHRtbCIpOworI2Vsc2UKKwkJCQlCSU9fcHV0cyhpbyx0ZXh0KTsKKwkJCQlCSU9fcHJpbnRmKGlvLCInJXMnIGlzIGEgZGlyZWN0b3J5XHJcbiIscCk7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCQl9CisKKwkJCWlmICgoZmlsZT1CSU9fbmV3X2ZpbGUocCwiciIpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlCSU9fcHV0cyhpbyx0ZXh0KTsKKwkJCQlCSU9fcHJpbnRmKGlvLCJFcnJvciBvcGVuaW5nICclcydcclxuIixwKTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGlvKTsKKwkJCQlicmVhazsKKwkJCQl9CisKKwkJCWlmICghc19xdWlldCkKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkZJTEU6JXNcbiIscCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3d3cgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpPXN0cmxlbihwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAkoKGkgPiA1KSAmJiAoc3RyY21wKCYocFtpLTVdKSwiLmh0bWwiKSA9PSAwKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGkgPiA0KSAmJiAoc3RyY21wKCYocFtpLTRdKSwiLnBocCIpID09IDApKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSA+IDQpICYmIChzdHJjbXAoJihwW2ktNF0pLCIuaHRtIikgPT0gMCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJT19wdXRzKGlvLCJIVFRQLzEuMCAyMDAgb2tcclxuQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcclxuXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklPX3B1dHMoaW8sIkhUVFAvMS4wIDIwMCBva1xyXG5Db250ZW50LXR5cGU6IHRleHQvcGxhaW5cclxuXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkvKiBzZW5kIHRoZSBmaWxlICovCisJCQl0b3RhbF9ieXRlcz0wOworCQkJZm9yICg7OykKKwkJCQl7CisJCQkJaT1CSU9fcmVhZChmaWxlLGJ1ZixidWZzaXplKTsKKwkJCQlpZiAoaSA8PSAwKSBicmVhazsKKworI2lmZGVmIFJFTkVHCisJCQkJdG90YWxfYnl0ZXMrPWk7CisJCQkJZnByaW50ZihzdGRlcnIsIiVkXG4iLGkpOworCQkJCWlmICh0b3RhbF9ieXRlcyA+IDMqMTAyNCkKKwkJCQkJeworCQkJCQl0b3RhbF9ieXRlcz0wOworCQkJCQlmcHJpbnRmKHN0ZGVyciwiUkVORUdPVElBVEVcbiIpOworCQkJCQlTU0xfcmVuZWdvdGlhdGUoY29uKTsKKwkJCQkJfQorI2VuZGlmCisKKwkJCQlmb3IgKGo9MDsgajxpOyApCisJCQkJCXsKKyNpZmRlZiBSRU5FRworeyBzdGF0aWMgY291bnQ9MDsgaWYgKCsrY291bnQgPT0gMTMpIHsgU1NMX3JlbmVnb3RpYXRlKGNvbik7IH0gfQorI2VuZGlmCisJCQkJCWs9QklPX3dyaXRlKGlvLCYoYnVmW2pdKSxpLWopOworCQkJCQlpZiAoayA8PSAwKQorCQkJCQkJeworCQkJCQkJaWYgKCFCSU9fc2hvdWxkX3JldHJ5KGlvKSkKKwkJCQkJCQlnb3RvIHdyaXRlX2Vycm9yOworCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQlCSU9fcHJpbnRmKGJpb19zX291dCwicndyaXRlIFcgQkxPQ0tcbiIpOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJais9azsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KK3dyaXRlX2Vycm9yOgorCQkJQklPX2ZyZWUoZmlsZSk7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCisJZm9yICg7OykKKwkJeworCQlpPShpbnQpQklPX2ZsdXNoKGlvKTsKKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCWlmICghQklPX3Nob3VsZF9yZXRyeShpbykpCisJCQkJYnJlYWs7CisJCQl9CisJCWVsc2UKKwkJCWJyZWFrOworCQl9CitlbmQ6CisjaWYgMQorCS8qIG1ha2Ugc3VyZSB3ZSByZS11c2Ugc2Vzc2lvbnMgKi8KKwlTU0xfc2V0X3NodXRkb3duKGNvbixTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOworI2Vsc2UKKwkvKiBUaGlzIGtpbGxzIHBlcmZvcm1hbmNlICovCisvKglTU0xfc2h1dGRvd24oY29uKTsgQSBzaHV0ZG93biBnZXRzIHNlbnQgaW4gdGhlCisgKglCSU9fZnJlZV9hbGwoaW8pIHByb2Nlc3Npb24gKi8KKyNlbmRpZgorCitlcnI6CisKKwlpZiAocmV0ID49IDApCisJCUJJT19wcmludGYoYmlvX3Nfb3V0LCJBQ0NFUFRcbiIpOworCisJaWYgKGJ1ZiAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYnVmKTsKKwlpZiAoaW8gIT0gTlVMTCkgQklPX2ZyZWVfYWxsKGlvKTsKKy8qCWlmIChzc2xfYmlvICE9IE5VTEwpIEJJT19mcmVlKHNzbF9iaW8pOyovCisJcmV0dXJuKHJldCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitzdGF0aWMgUlNBIE1TX0NBTExCQUNLICp0bXBfcnNhX2NiKFNTTCAqcywgaW50IGlzX2V4cG9ydCwgaW50IGtleWxlbmd0aCkKKwl7CisJQklHTlVNICpibiA9IE5VTEw7CisJc3RhdGljIFJTQSAqcnNhX3RtcD1OVUxMOworCisJaWYgKCFyc2FfdG1wICYmICgoYm4gPSBCTl9uZXcoKSkgPT0gTlVMTCkpCisJCUJJT19wcmludGYoYmlvX2VyciwiQWxsb2NhdGlvbiBlcnJvciBpbiBnZW5lcmF0aW5nIFJTQSBrZXlcbiIpOworCWlmICghcnNhX3RtcCAmJiBibikKKwkJeworCQlpZiAoIXNfcXVpZXQpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkdlbmVyYXRpbmcgdGVtcCAoJWQgYml0KSBSU0Ega2V5Li4uIixrZXlsZW5ndGgpOworCQkJKHZvaWQpQklPX2ZsdXNoKGJpb19lcnIpOworCQkJfQorCQlpZighQk5fc2V0X3dvcmQoYm4sIFJTQV9GNCkgfHwgKChyc2FfdG1wID0gUlNBX25ldygpKSA9PSBOVUxMKSB8fAorCQkJCSFSU0FfZ2VuZXJhdGVfa2V5X2V4KHJzYV90bXAsIGtleWxlbmd0aCwgYm4sIE5VTEwpKQorCQkJeworCQkJaWYocnNhX3RtcCkgUlNBX2ZyZWUocnNhX3RtcCk7CisJCQlyc2FfdG1wID0gTlVMTDsKKwkJCX0KKwkJaWYgKCFzX3F1aWV0KQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJcbiIpOworCQkJKHZvaWQpQklPX2ZsdXNoKGJpb19lcnIpOworCQkJfQorCQlCTl9mcmVlKGJuKTsKKwkJfQorCXJldHVybihyc2FfdG1wKTsKKwl9CisjZW5kaWYKKworI2RlZmluZSBNQVhfU0VTU0lPTl9JRF9BVFRFTVBUUyAxMAorc3RhdGljIGludCBnZW5lcmF0ZV9zZXNzaW9uX2lkKGNvbnN0IFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICppZCwKKwkJCQl1bnNpZ25lZCBpbnQgKmlkX2xlbikKKwl7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwlkbwl7CisJCVJBTkRfcHNldWRvX2J5dGVzKGlkLCAqaWRfbGVuKTsKKwkJLyogUHJlZml4IHRoZSBzZXNzaW9uX2lkIHdpdGggdGhlIHJlcXVpcmVkIHByZWZpeC4gTkI6IElmIG91cgorCQkgKiBwcmVmaXggaXMgdG9vIGxvbmcsIGNsaXAgaXQgLSBidXQgdGhlcmUgd2lsbCBiZSB3b3JzZSBlZmZlY3RzCisJCSAqIGFueXdheSwgZWcuIHRoZSBzZXJ2ZXIgY291bGQgb25seSBwb3NzaWJseSBjcmVhdGUgMSBzZXNzaW9uCisJCSAqIElEIChpZS4gdGhlIHByZWZpeCEpIHNvIGFsbCBmdXR1cmUgc2Vzc2lvbiBuZWdvdGlhdGlvbnMgd2lsbAorCQkgKiBmYWlsIGR1ZSB0byBjb25mbGljdHMuICovCisJCW1lbWNweShpZCwgc2Vzc2lvbl9pZF9wcmVmaXgsCisJCQkoc3RybGVuKHNlc3Npb25faWRfcHJlZml4KSA8ICppZF9sZW4pID8KKwkJCXN0cmxlbihzZXNzaW9uX2lkX3ByZWZpeCkgOiAqaWRfbGVuKTsKKwkJfQorCXdoaWxlKFNTTF9oYXNfbWF0Y2hpbmdfc2Vzc2lvbl9pZChzc2wsIGlkLCAqaWRfbGVuKSAmJgorCQkoKytjb3VudCA8IE1BWF9TRVNTSU9OX0lEX0FUVEVNUFRTKSk7CisJaWYoY291bnQgPj0gTUFYX1NFU1NJT05fSURfQVRURU1QVFMpCisJCXJldHVybiAwOworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvc19zb2NrZXQuYyBiL2xpYi9vcGVuc3NsL2FwcHMvc19zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjg3MTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9zX3NvY2tldC5jCkBAIC0wLDAgKzEsNjIxIEBACisvKiBhcHBzL3Nfc29ja2V0LmMgLSAgc29ja2V0LXJlbGF0ZWQgZnVuY3Rpb25zIHVzZWQgYnkgc19jbGllbnQgYW5kIHNfc2VydmVyICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZmRlZiBGTEFUX0lOQworI2luY2x1ZGUgImVfb3MyLmgiCisjZWxzZQorI2luY2x1ZGUgIi4uL2Vfb3MyLmgiCisjZW5kaWYKKworLyogV2l0aCBJUHY2LCBpdCBsb29rcyBsaWtlIERpZ2l0YWwgaGFzIG1peGVkIHVwIHRoZSBwcm9wZXIgb3JkZXIgb2YKKyAgIHJlY3Vyc2l2ZSBoZWFkZXIgZmlsZSBpbmNsdXNpb24sIHJlc3VsdGluZyBpbiB0aGUgY29tcGlsZXIgY29tcGxhaW5pbmcKKyAgIHRoYXQgdV9pbnQgaXNuJ3QgZGVmaW5lZCwgYnV0IG9ubHkgaWYgX1BPU0lYX0NfU09VUkNFIGlzIGRlZmluZWQsIHdoaWNoCisgICBpcyBuZWVkZWQgdG8gaGF2ZSBmaWxlbm8oKSBkZWNsYXJlZCBjb3JyZWN0bHkuLi4gIFNvIGxldCdzIGRlZmluZSB1X2ludCAqLworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TX0RFQ0MpICYmICFkZWZpbmVkKF9fVV9JTlQpCisjZGVmaW5lIF9fVV9JTlQKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50OworI2VuZGlmCisKKyNkZWZpbmUgVVNFX1NPQ0tFVFMKKyNkZWZpbmUgTk9OX01BSU4KKyNpbmNsdWRlICJhcHBzLmgiCisjdW5kZWYgVVNFX1NPQ0tFVFMKKyN1bmRlZiBOT05fTUFJTgorI2luY2x1ZGUgInNfYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisKKyNpZmRlZiBGTEFUX0lOQworI2luY2x1ZGUgImVfb3MuaCIKKyNlbHNlCisjaW5jbHVkZSAiLi4vZV9vcy5oIgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TT0NLCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpICYmIGRlZmluZWQoTkVUV0FSRV9CU0RTT0NLKQorI2luY2x1ZGUgIm5ldGRiLmgiCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBob3N0ZW50ICpHZXRIb3N0QnlOYW1lKGNoYXIgKm5hbWUpOworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgfHwgKGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkgJiYgIWRlZmluZWQoTkVUV0FSRV9CU0RTT0NLKSkKK3N0YXRpYyB2b2lkIHNzbF9zb2NrX2NsZWFudXAodm9pZCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgc3NsX3NvY2tfaW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgaW5pdF9jbGllbnRfaXAoaW50ICpzb2NrLHVuc2lnbmVkIGNoYXIgaXBbNF0sIGludCBwb3J0LCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGluaXRfc2VydmVyKGludCAqc29jaywgaW50IHBvcnQsIGludCB0eXBlKTsKK3N0YXRpYyBpbnQgaW5pdF9zZXJ2ZXJfbG9uZyhpbnQgKnNvY2ssIGludCBwb3J0LGNoYXIgKmlwLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGRvX2FjY2VwdChpbnQgYWNjX3NvY2ssIGludCAqc29jaywgY2hhciAqKmhvc3QpOworc3RhdGljIGludCBob3N0X2lwKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciBpcFs0XSk7CisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4xNgorI2RlZmluZSBTT0NLRVRfUFJPVE9DT0wJMCAvKiBtb3JlIG1pY3Jvc29mdCBzdHVwaWRpdHkgKi8KKyNlbHNlCisjZGVmaW5lIFNPQ0tFVF9QUk9UT0NPTAlJUFBST1RPX1RDUAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpICYmICFkZWZpbmVkKE5FVFdBUkVfQlNEU09DSykKK3N0YXRpYyBpbnQgd3NhX2luaXRfZG9uZT0wOworI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU5ET1dTCitzdGF0aWMgc3RydWN0IFdTQURhdGEgd3NhX3N0YXRlOworc3RhdGljIGludCB3c2FfaW5pdF9kb25lPTA7CisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4xNgorc3RhdGljIEhXTkQgdG9wV25kPTA7CitzdGF0aWMgRkFSUFJPQyBscFRvcFduZFByb2M9TlVMTDsKK3N0YXRpYyBGQVJQUk9DIGxwVG9wSG9va1Byb2M9TlVMTDsKK2V4dGVybiBISU5TVEFOQ0UgX2hJbnN0YW5jZTsgIC8qIG5pY2UgZ2xvYmFsIENSVCBwcm92aWRlcyAqLworCitzdGF0aWMgTE9ORyBGQVIgUEFTQ0FMIHRvcEhvb2tQcm9jKEhXTkQgaHduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLAorCSAgICAgTFBBUkFNIGxQYXJhbSkKKwl7CisJaWYgKGh3bmQgPT0gdG9wV25kKQorCQl7CisJCXN3aXRjaChtZXNzYWdlKQorCQkJeworCQljYXNlIFdNX0RFU1RST1k6CisJCWNhc2UgV01fQ0xPU0U6CisJCQlTZXRXaW5kb3dMb25nKHRvcFduZCxHV0xfV05EUFJPQywoTE9ORylscFRvcFduZFByb2MpOworCQkJc3NsX3NvY2tfY2xlYW51cCgpOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwlyZXR1cm4gQ2FsbFdpbmRvd1Byb2MobHBUb3BXbmRQcm9jLGh3bmQsbWVzc2FnZSx3UGFyYW0sbFBhcmFtKTsKKwl9CisKK3N0YXRpYyBCT09MIENBTExCQUNLIGVudW1wcm9jKEhXTkQgaHduZCxMUEFSQU0gbFBhcmFtKQorCXsKKwl0b3BXbmQ9aHduZDsKKwlyZXR1cm4oRkFMU0UpOworCX0KKworI2VuZGlmIC8qIE9QRU5TU0xfU1lTX1dJTjMyICovCisjZW5kaWYgLyogT1BFTlNTTF9TWVNfV0lORE9XUyAqLworCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lORE9XUworc3RhdGljIHZvaWQgc3NsX3NvY2tfY2xlYW51cCh2b2lkKQorCXsKKwlpZiAod3NhX2luaXRfZG9uZSkKKwkJeworCQl3c2FfaW5pdF9kb25lPTA7CisjaWZuZGVmIE9QRU5TU0xfU1lTX1dJTkNFCisJCVdTQUNhbmNlbEJsb2NraW5nQ2FsbCgpOworI2VuZGlmCisJCVdTQUNsZWFudXAoKTsKKwkJfQorCX0KKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkgJiYgIWRlZmluZWQoTkVUV0FSRV9CU0RTT0NLKQorc3RhdGljIHZvaWQgc29ja19jbGVhbnVwKHZvaWQpCisgICAgeworICAgIGlmICh3c2FfaW5pdF9kb25lKQorICAgICAgICB7CisgICAgICAgIHdzYV9pbml0X2RvbmU9MDsKKwkJV1NBQ2xlYW51cCgpOworCQl9CisJfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc3NsX3NvY2tfaW5pdCh2b2lkKQorCXsKKyNpZmRlZiBXQVRUMzIKKwlleHRlcm4gaW50IF93YXR0X2RvX2V4aXQ7CisJX3dhdHRfZG9fZXhpdCA9IDA7CisJaWYgKHNvY2tfaW5pdCgpKQorCQlyZXR1cm4gKDApOworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKQorCWlmICghd3NhX2luaXRfZG9uZSkKKwkJeworCQlpbnQgZXJyOworCSAgCisjaWZkZWYgU0lHSU5UCisJCXNpZ25hbChTSUdJTlQsKHZvaWQgKCopKGludCkpc3NsX3NvY2tfY2xlYW51cCk7CisjZW5kaWYKKwkJd3NhX2luaXRfZG9uZT0xOworCQltZW1zZXQoJndzYV9zdGF0ZSwwLHNpemVvZih3c2Ffc3RhdGUpKTsKKwkJaWYgKFdTQVN0YXJ0dXAoMHgwMTAxLCZ3c2Ffc3RhdGUpIT0wKQorCQkJeworCQkJZXJyPVdTQUdldExhc3RFcnJvcigpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1bmFibGUgdG8gc3RhcnQgV0lOU09DSywgZXJyb3IgY29kZT0lZFxuIixlcnIpOworCQkJcmV0dXJuKDApOworCQkJfQorCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMTYKKwkJRW51bVRhc2tXaW5kb3dzKEdldEN1cnJlbnRUYXNrKCksZW51bXByb2MsMEwpOworCQlscFRvcFduZFByb2M9KEZBUlBST0MpR2V0V2luZG93TG9uZyh0b3BXbmQsR1dMX1dORFBST0MpOworCQlscFRvcEhvb2tQcm9jPU1ha2VQcm9jSW5zdGFuY2UoKEZBUlBST0MpdG9wSG9va1Byb2MsX2hJbnN0YW5jZSk7CisKKwkJU2V0V2luZG93TG9uZyh0b3BXbmQsR1dMX1dORFBST0MsKExPTkcpbHBUb3BIb29rUHJvYyk7CisjZW5kaWYgLyogT1BFTlNTTF9TWVNfV0lOMTYgKi8KKwkJfQorI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAmJiAhZGVmaW5lZChORVRXQVJFX0JTRFNPQ0spCisgICBXT1JEIHdWZXJSZXE7CisgICBXU0FEQVRBIHdzYURhdGE7CisgICBpbnQgZXJyOworCisgICBpZiAoIXdzYV9pbml0X2RvbmUpCisgICAgICB7CisgICAKKyMgaWZkZWYgU0lHSU5UCisgICAgICBzaWduYWwoU0lHSU5ULCh2b2lkICgqKShpbnQpKXNvY2tfY2xlYW51cCk7CisjIGVuZGlmCisKKyAgICAgIHdzYV9pbml0X2RvbmU9MTsKKyAgICAgIHdWZXJSZXEgPSBNQUtFV09SRCggMiwgMCApOworICAgICAgZXJyID0gV1NBU3RhcnR1cCh3VmVyUmVxLCZ3c2FEYXRhKTsKKyAgICAgIGlmIChlcnIgIT0gMCkKKyAgICAgICAgIHsKKyAgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIHN0YXJ0IFdJTlNPQ0syLCBlcnJvciBjb2RlPSVkXG4iLGVycik7CisgICAgICAgICByZXR1cm4oMCk7CisgICAgICAgICB9CisgICAgICB9CisjZW5kaWYgLyogT1BFTlNTTF9TWVNfV0lORE9XUyAqLworCXJldHVybigxKTsKKwl9CisKK2ludCBpbml0X2NsaWVudChpbnQgKnNvY2ssIGNoYXIgKmhvc3QsIGludCBwb3J0LCBpbnQgdHlwZSkKKwl7CisJdW5zaWduZWQgY2hhciBpcFs0XTsKKworCWlmICghaG9zdF9pcChob3N0LCYoaXBbMF0pKSkKKwkJeworCQlyZXR1cm4oMCk7CisJCX0KKwlyZXR1cm4oaW5pdF9jbGllbnRfaXAoc29jayxpcCxwb3J0LHR5cGUpKTsKKwl9CisKK3N0YXRpYyBpbnQgaW5pdF9jbGllbnRfaXAoaW50ICpzb2NrLCB1bnNpZ25lZCBjaGFyIGlwWzRdLCBpbnQgcG9ydCwgaW50IHR5cGUpCisJeworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gdGhlbTsKKwlpbnQgcyxpOworCisJaWYgKCFzc2xfc29ja19pbml0KCkpIHJldHVybigwKTsKKworCW1lbXNldCgoY2hhciAqKSZ0aGVtLDAsc2l6ZW9mKHRoZW0pKTsKKwl0aGVtLnNpbl9mYW1pbHk9QUZfSU5FVDsKKwl0aGVtLnNpbl9wb3J0PWh0b25zKCh1bnNpZ25lZCBzaG9ydClwb3J0KTsKKwlhZGRyPSh1bnNpZ25lZCBsb25nKQorCQkoKHVuc2lnbmVkIGxvbmcpaXBbMF08PDI0TCl8CisJCSgodW5zaWduZWQgbG9uZylpcFsxXTw8MTZMKXwKKwkJKCh1bnNpZ25lZCBsb25nKWlwWzJdPDwgOEwpfAorCQkoKHVuc2lnbmVkIGxvbmcpaXBbM10pOworCXRoZW0uc2luX2FkZHIuc19hZGRyPWh0b25sKGFkZHIpOworCisJaWYgKHR5cGUgPT0gU09DS19TVFJFQU0pCisJCXM9c29ja2V0KEFGX0lORVQsU09DS19TVFJFQU0sU09DS0VUX1BST1RPQ09MKTsKKwllbHNlIC8qICggdHlwZSA9PSBTT0NLX0RHUkFNKSAqLworCQlzPXNvY2tldChBRl9JTkVULFNPQ0tfREdSQU0sSVBQUk9UT19VRFApOworCQkJCisJaWYgKHMgPT0gSU5WQUxJRF9TT0NLRVQpIHsgcGVycm9yKCJzb2NrZXQiKTsgcmV0dXJuKDApOyB9CisKKyNpZiBkZWZpbmVkKFNPX0tFRVBBTElWRSkgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfTVBFKQorCWlmICh0eXBlID09IFNPQ0tfU1RSRUFNKQorCQl7CisJCWk9MDsKKwkJaT1zZXRzb2Nrb3B0KHMsU09MX1NPQ0tFVCxTT19LRUVQQUxJVkUsKGNoYXIgKikmaSxzaXplb2YoaSkpOworCQlpZiAoaSA8IDApIHsgcGVycm9yKCJrZWVwYWxpdmUiKTsgcmV0dXJuKDApOyB9CisJCX0KKyNlbmRpZgorCisJaWYgKGNvbm5lY3Qocywoc3RydWN0IHNvY2thZGRyICopJnRoZW0sc2l6ZW9mKHRoZW0pKSA9PSAtMSkKKwkJeyBjbG9zZXNvY2tldChzKTsgcGVycm9yKCJjb25uZWN0Iik7IHJldHVybigwKTsgfQorCSpzb2NrPXM7CisJcmV0dXJuKDEpOworCX0KKworaW50IGRvX3NlcnZlcihpbnQgcG9ydCwgaW50IHR5cGUsIGludCAqcmV0LCBpbnQgKCpjYikoY2hhciAqaG9zdG5hbWUsIGludCBzLCB1bnNpZ25lZCBjaGFyICpjb250ZXh0KSwgdW5zaWduZWQgY2hhciAqY29udGV4dCkKKwl7CisJaW50IHNvY2s7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJaW50IGFjY2VwdF9zb2NrZXQgPSAwOworCWludCBpOworCisJaWYgKCFpbml0X3NlcnZlcigmYWNjZXB0X3NvY2tldCxwb3J0LHR5cGUpKSByZXR1cm4oMCk7CisKKwlpZiAocmV0ICE9IE5VTEwpCisJCXsKKwkJKnJldD1hY2NlcHRfc29ja2V0OworCQkvKiByZXR1cm4oMSk7Ki8KKwkJfQorICAJZm9yICg7OykKKyAgCQl7CisJCWlmICh0eXBlPT1TT0NLX1NUUkVBTSkKKwkJCXsKKwkJCWlmIChkb19hY2NlcHQoYWNjZXB0X3NvY2tldCwmc29jaywmbmFtZSkgPT0gMCkKKwkJCQl7CisJCQkJU0hVVERPV04oYWNjZXB0X3NvY2tldCk7CisJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJc29jayA9IGFjY2VwdF9zb2NrZXQ7CisJCWk9KCpjYikobmFtZSxzb2NrLCBjb250ZXh0KTsKKwkJaWYgKG5hbWUgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKG5hbWUpOworCQlpZiAodHlwZT09U09DS19TVFJFQU0pCisJCQlTSFVURE9XTjIoc29jayk7CisJCWlmIChpIDwgMCkKKwkJCXsKKwkJCVNIVVRET1dOMihhY2NlcHRfc29ja2V0KTsKKwkJCXJldHVybihpKTsKKwkJCX0KKwkJfQorCX0KKworc3RhdGljIGludCBpbml0X3NlcnZlcl9sb25nKGludCAqc29jaywgaW50IHBvcnQsIGNoYXIgKmlwLCBpbnQgdHlwZSkKKwl7CisJaW50IHJldD0wOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzZXJ2ZXI7CisJaW50IHM9IC0xLGk7CisKKwlpZiAoIXNzbF9zb2NrX2luaXQoKSkgcmV0dXJuKDApOworCisJbWVtc2V0KChjaGFyICopJnNlcnZlciwwLHNpemVvZihzZXJ2ZXIpKTsKKwlzZXJ2ZXIuc2luX2ZhbWlseT1BRl9JTkVUOworCXNlcnZlci5zaW5fcG9ydD1odG9ucygodW5zaWduZWQgc2hvcnQpcG9ydCk7CisJaWYgKGlwID09IE5VTEwpCisJCXNlcnZlci5zaW5fYWRkci5zX2FkZHI9SU5BRERSX0FOWTsKKwllbHNlCisvKiBBZGRlZCBmb3IgVDNFLCBhZGRyZXNzLW9mIGZhaWxzIG9uIGJpdCBmaWVsZCAoYmVja21hbkBhY2wubGFubC5nb3YpICovCisjaWZuZGVmIEJJVF9GSUVMRF9MSU1JVFMKKwkJbWVtY3B5KCZzZXJ2ZXIuc2luX2FkZHIuc19hZGRyLGlwLDQpOworI2Vsc2UKKwkJbWVtY3B5KCZzZXJ2ZXIuc2luX2FkZHIsaXAsNCk7CisjZW5kaWYKKwkKKwkJaWYgKHR5cGUgPT0gU09DS19TVFJFQU0pCisJCQlzPXNvY2tldChBRl9JTkVULFNPQ0tfU1RSRUFNLFNPQ0tFVF9QUk9UT0NPTCk7CisJCWVsc2UgLyogdHlwZSA9PSBTT0NLX0RHUkFNICovCisJCQlzPXNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLElQUFJPVE9fVURQKTsKKworCWlmIChzID09IElOVkFMSURfU09DS0VUKSBnb3RvIGVycjsKKyNpZiBkZWZpbmVkIFNPTF9TT0NLRVQgJiYgZGVmaW5lZCBTT19SRVVTRUFERFIKKwkJeworCQlpbnQgaiA9IDE7CisJCXNldHNvY2tvcHQocywgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAorCQkJICAgKHZvaWQgKikgJmosIHNpemVvZiBqKTsKKwkJfQorI2VuZGlmCisJaWYgKGJpbmQocywoc3RydWN0IHNvY2thZGRyICopJnNlcnZlcixzaXplb2Yoc2VydmVyKSkgPT0gLTEpCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfV0lORE9XUworCQlwZXJyb3IoImJpbmQiKTsKKyNlbmRpZgorCQlnb3RvIGVycjsKKwkJfQorCS8qIE1ha2UgaXQgMTI4IGZvciBsaW51eCAqLworCWlmICh0eXBlPT1TT0NLX1NUUkVBTSAmJiBsaXN0ZW4ocywxMjgpID09IC0xKSBnb3RvIGVycjsKKwlpPTA7CisJKnNvY2s9czsKKwlyZXQ9MTsKK2VycjoKKwlpZiAoKHJldCA9PSAwKSAmJiAocyAhPSAtMSkpCisJCXsKKwkJU0hVVERPV04ocyk7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgaW5pdF9zZXJ2ZXIoaW50ICpzb2NrLCBpbnQgcG9ydCwgaW50IHR5cGUpCisJeworCXJldHVybihpbml0X3NlcnZlcl9sb25nKHNvY2ssIHBvcnQsIE5VTEwsIHR5cGUpKTsKKwl9CisKK3N0YXRpYyBpbnQgZG9fYWNjZXB0KGludCBhY2Nfc29jaywgaW50ICpzb2NrLCBjaGFyICoqaG9zdCkKKwl7CisJaW50IHJldCxpOworCXN0cnVjdCBob3N0ZW50ICpoMSwqaDI7CisJc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbiBmcm9tOworCWludCBsZW47CisvKglzdHJ1Y3QgbGluZ2VyIGxpbmc7ICovCisKKwlpZiAoIXNzbF9zb2NrX2luaXQoKSkgcmV0dXJuKDApOworCisjaWZuZGVmIE9QRU5TU0xfU1lTX1dJTkRPV1MKK3JlZG9pdDoKKyNlbmRpZgorCisJbWVtc2V0KChjaGFyICopJmZyb20sMCxzaXplb2YoZnJvbSkpOworCWxlbj1zaXplb2YoZnJvbSk7CisJLyogTm90ZTogdW5kZXIgVk1TIHdpdGggU09DS0VUU0hSIHRoZSBmb3VydGggcGFyYW1ldGVyIGlzIGN1cnJlbnRseQorCSAqIG9mIHR5cGUgKGludCAqKSB3aGVyZWFzIHVuZGVyIG90aGVyIHN5c3RlbXMgaXQgaXMgKHZvaWQgKikgaWYKKwkgKiB5b3UgZG9uJ3QgaGF2ZSBhIGNhc3QgaXQgd2lsbCBjaG9rZSB0aGUgY29tcGlsZXI6IGlmIHlvdSBkbworCSAqIGhhdmUgYSBjYXN0IHRoZW4geW91IGNhbiBlaXRoZXIgZ28gZm9yIChpbnQgKikgb3IgKHZvaWQgKikuCisJICovCisJcmV0PWFjY2VwdChhY2Nfc29jaywoc3RydWN0IHNvY2thZGRyICopJmZyb20sKHZvaWQgKikmbGVuKTsKKwlpZiAocmV0ID09IElOVkFMSURfU09DS0VUKQorCQl7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSB8fCAoZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAmJiAhZGVmaW5lZChORVRXQVJFX0JTRFNPQ0spKQorCQlpPVdTQUdldExhc3RFcnJvcigpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsImFjY2VwdCBlcnJvciAlZFxuIixpKTsKKyNlbHNlCisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCXsKKwkJCS8qY2hlY2tfdGltZW91dCgpOyAqLworCQkJZ290byByZWRvaXQ7CisJCQl9CisJCWZwcmludGYoc3RkZXJyLCJlcnJubz0lZCAiLGVycm5vKTsKKwkJcGVycm9yKCJhY2NlcHQiKTsKKyNlbmRpZgorCQlyZXR1cm4oMCk7CisJCX0KKworLyoKKwlsaW5nLmxfb25vZmY9MTsKKwlsaW5nLmxfbGluZ2VyPTA7CisJaT1zZXRzb2Nrb3B0KHJldCxTT0xfU09DS0VULFNPX0xJTkdFUiwoY2hhciAqKSZsaW5nLHNpemVvZihsaW5nKSk7CisJaWYgKGkgPCAwKSB7IHBlcnJvcigibGluZ2VyIik7IHJldHVybigwKTsgfQorCWk9MDsKKwlpPXNldHNvY2tvcHQocmV0LFNPTF9TT0NLRVQsU09fS0VFUEFMSVZFLChjaGFyICopJmksc2l6ZW9mKGkpKTsKKwlpZiAoaSA8IDApIHsgcGVycm9yKCJrZWVwYWxpdmUiKTsgcmV0dXJuKDApOyB9CisqLworCisJaWYgKGhvc3QgPT0gTlVMTCkgZ290byBlbmQ7CisjaWZuZGVmIEJJVF9GSUVMRF9MSU1JVFMKKwkvKiBJIHNob3VsZCB1c2UgV1NBQXN5bmNHZXRIb3N0QnlOYW1lKCkgdW5kZXIgd2luZG93cyAqLworCWgxPWdldGhvc3RieWFkZHIoKGNoYXIgKikmZnJvbS5zaW5fYWRkci5zX2FkZHIsCisJCXNpemVvZihmcm9tLnNpbl9hZGRyLnNfYWRkciksQUZfSU5FVCk7CisjZWxzZQorCWgxPWdldGhvc3RieWFkZHIoKGNoYXIgKikmZnJvbS5zaW5fYWRkciwKKwkJc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSxBRl9JTkVUKTsKKyNlbmRpZgorCWlmIChoMSA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIGdldGhvc3RieWFkZHJcbiIpOworCQkqaG9zdD1OVUxMOworCQkvKiByZXR1cm4oMCk7ICovCisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCgqaG9zdD0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKHN0cmxlbihoMS0+aF9uYW1lKSsxKSkgPT0gTlVMTCkKKwkJCXsKKwkJCXBlcnJvcigiT1BFTlNTTF9tYWxsb2MiKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKwkJQlVGX3N0cmxjcHkoKmhvc3QsaDEtPmhfbmFtZSxzdHJsZW4oaDEtPmhfbmFtZSkrMSk7CisKKwkJaDI9R2V0SG9zdEJ5TmFtZSgqaG9zdCk7CisJCWlmIChoMiA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJnZXRob3N0YnluYW1lIGZhaWx1cmVcbiIpOworCQkJcmV0dXJuKDApOworCQkJfQorCQlpPTA7CisJCWlmIChoMi0+aF9hZGRydHlwZSAhPSBBRl9JTkVUKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJnZXRob3N0YnluYW1lIGFkZHIgaXMgbm90IEFGX0lORVRcbiIpOworCQkJcmV0dXJuKDApOworCQkJfQorCQl9CitlbmQ6CisJKnNvY2s9cmV0OworCXJldHVybigxKTsKKwl9CisKK2ludCBleHRyYWN0X2hvc3RfcG9ydChjaGFyICpzdHIsIGNoYXIgKipob3N0X3B0ciwgdW5zaWduZWQgY2hhciAqaXAsCisJICAgICBzaG9ydCAqcG9ydF9wdHIpCisJeworCWNoYXIgKmgsKnA7CisKKwloPXN0cjsKKwlwPXN0cmNocihzdHIsJzonKTsKKwlpZiAocCA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYoYmlvX2Vyciwibm8gcG9ydCBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuKDApOworCQl9CisJKihwKyspPSdcMCc7CisKKwlpZiAoKGlwICE9IE5VTEwpICYmICFob3N0X2lwKHN0cixpcCkpCisJCWdvdG8gZXJyOworCWlmIChob3N0X3B0ciAhPSBOVUxMKSAqaG9zdF9wdHI9aDsKKworCWlmICghZXh0cmFjdF9wb3J0KHAscG9ydF9wdHIpKQorCQlnb3RvIGVycjsKKwlyZXR1cm4oMSk7CitlcnI6CisJcmV0dXJuKDApOworCX0KKworc3RhdGljIGludCBob3N0X2lwKGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciBpcFs0XSkKKwl7CisJdW5zaWduZWQgaW50IGluWzRdOyAKKwlpbnQgaTsKKworCWlmIChzc2NhbmYoc3RyLCIldS4ldS4ldS4ldSIsJihpblswXSksJihpblsxXSksJihpblsyXSksJihpblszXSkpID09IDQpCisJCXsKKwkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQkJaWYgKGluW2ldID4gMjU1KQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsImludmFsaWQgSVAgYWRkcmVzc1xuIik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQlpcFswXT1pblswXTsKKwkJaXBbMV09aW5bMV07CisJCWlwWzJdPWluWzJdOworCQlpcFszXT1pblszXTsKKwkJfQorCWVsc2UKKwkJeyAvKiBkbyBhIGdldGhvc3RieW5hbWUgKi8KKwkJc3RydWN0IGhvc3RlbnQgKmhlOworCisJCWlmICghc3NsX3NvY2tfaW5pdCgpKSByZXR1cm4oMCk7CisKKwkJaGU9R2V0SG9zdEJ5TmFtZShzdHIpOworCQlpZiAoaGUgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZ2V0aG9zdGJ5bmFtZSBmYWlsdXJlXG4iKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQkvKiBjYXN0IHRvIHNob3J0IGJlY2F1c2Ugb2Ygd2luMTYgd2luc29jayBkZWZpbml0aW9uICovCisJCWlmICgoc2hvcnQpaGUtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZ2V0aG9zdGJ5bmFtZSBhZGRyIGlzIG5vdCBBRl9JTkVUXG4iKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKwkJaXBbMF09aGUtPmhfYWRkcl9saXN0WzBdWzBdOworCQlpcFsxXT1oZS0+aF9hZGRyX2xpc3RbMF1bMV07CisJCWlwWzJdPWhlLT5oX2FkZHJfbGlzdFswXVsyXTsKKwkJaXBbM109aGUtPmhfYWRkcl9saXN0WzBdWzNdOworCQl9CisJcmV0dXJuKDEpOworZXJyOgorCXJldHVybigwKTsKKwl9CisKK2ludCBleHRyYWN0X3BvcnQoY2hhciAqc3RyLCBzaG9ydCAqcG9ydF9wdHIpCisJeworCWludCBpOworCXN0cnVjdCBzZXJ2ZW50ICpzOworCisJaT1hdG9pKHN0cik7CisJaWYgKGkgIT0gMCkKKwkJKnBvcnRfcHRyPSh1bnNpZ25lZCBzaG9ydClpOworCWVsc2UKKwkJeworCQlzPWdldHNlcnZieW5hbWUoc3RyLCJ0Y3AiKTsKKwkJaWYgKHMgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZ2V0c2VydmJ5bmFtZSBmYWlsdXJlIGZvciAlc1xuIixzdHIpOworCQkJcmV0dXJuKDApOworCQkJfQorCQkqcG9ydF9wdHI9bnRvaHMoKHVuc2lnbmVkIHNob3J0KXMtPnNfcG9ydCk7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCisjZGVmaW5lIEdIQk5fTlVNCTQKK3N0YXRpYyBzdHJ1Y3QgZ2hibl9jYWNoZV9zdAorCXsKKwljaGFyIG5hbWVbMTI4XTsKKwlzdHJ1Y3QgaG9zdGVudCBlbnQ7CisJdW5zaWduZWQgbG9uZyBvcmRlcjsKKwl9IGdoYm5fY2FjaGVbR0hCTl9OVU1dOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnaGJuX2hpdHM9MEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBnaGJuX21pc3M9MEw7CisKK3N0YXRpYyBzdHJ1Y3QgaG9zdGVudCAqR2V0SG9zdEJ5TmFtZShjaGFyICpuYW1lKQorCXsKKwlzdHJ1Y3QgaG9zdGVudCAqcmV0OworCWludCBpLGxvd2k9MDsKKwl1bnNpZ25lZCBsb25nIGxvdz0gKHVuc2lnbmVkIGxvbmcpLTE7CisKKwlmb3IgKGk9MDsgaTxHSEJOX05VTTsgaSsrKQorCQl7CisJCWlmIChsb3cgPiBnaGJuX2NhY2hlW2ldLm9yZGVyKQorCQkJeworCQkJbG93PWdoYm5fY2FjaGVbaV0ub3JkZXI7CisJCQlsb3dpPWk7CisJCQl9CisJCWlmIChnaGJuX2NhY2hlW2ldLm9yZGVyID4gMCkKKwkJCXsKKwkJCWlmIChzdHJuY21wKG5hbWUsZ2hibl9jYWNoZVtpXS5uYW1lLDEyOCkgPT0gMCkKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCWlmIChpID09IEdIQk5fTlVNKSAvKiBubyBoaXQqLworCQl7CisJCWdoYm5fbWlzcysrOworCQlyZXQ9Z2V0aG9zdGJ5bmFtZShuYW1lKTsKKwkJaWYgKHJldCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJCS8qIGVsc2UgYWRkIHRvIGNhY2hlICovCisJCWlmKHN0cmxlbihuYW1lKSA8IHNpemVvZiBnaGJuX2NhY2hlWzBdLm5hbWUpCisJCQl7CisJCQlzdHJjcHkoZ2hibl9jYWNoZVtsb3dpXS5uYW1lLG5hbWUpOworCQkJbWVtY3B5KChjaGFyICopJihnaGJuX2NhY2hlW2xvd2ldLmVudCkscmV0LHNpemVvZihzdHJ1Y3QgaG9zdGVudCkpOworCQkJZ2hibl9jYWNoZVtsb3dpXS5vcmRlcj1naGJuX21pc3MrZ2hibl9oaXRzOworCQkJfQorCQlyZXR1cm4ocmV0KTsKKwkJfQorCWVsc2UKKwkJeworCQlnaGJuX2hpdHMrKzsKKwkJcmV0PSAmKGdoYm5fY2FjaGVbaV0uZW50KTsKKwkJZ2hibl9jYWNoZVtpXS5vcmRlcj1naGJuX21pc3MrZ2hibl9oaXRzOworCQlyZXR1cm4ocmV0KTsKKwkJfQorCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3NfdGltZS5jIGIvbGliL29wZW5zc2wvYXBwcy9zX3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODIzYzMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9zX3RpbWUuYwpAQCAtMCwwICsxLDYzMiBAQAorLyogYXBwcy9zX3RpbWUuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjZGVmaW5lIE5PX1NIVVRET1dOCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgIHNfdGltZSAtIFNTTCBjbGllbnQgY29ubmVjdGlvbiB0aW1lciBwcm9ncmFtCisgICBXcml0dGVuIGFuZCBkb25hdGVkIGJ5IExhcnJ5IFN0cmVlcHkgPHN0cmVlcHlAaGVhbHRoY2FyZS5jb20+CisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgVVNFX1NPQ0tFVFMKKyNpbmNsdWRlICJhcHBzLmgiCisjaWZkZWYgT1BFTlNTTF9OT19TVERJTworI2RlZmluZSBBUFBTX1dJTjE2CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSAic19hcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpZmRlZiBXSU4zMl9TVFVGRgorI2luY2x1ZGUgIndpbm1haW4uaCIKKyNpbmNsdWRlICJ3aW50ZXh0LmgiCisjZW5kaWYKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykKKyNpbmNsdWRlIE9QRU5TU0xfVU5JU1RECisjZW5kaWYKKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRyBzX3RpbWVfbWFpbgorCisjdW5kZWYgaW9jdGwKKyNkZWZpbmUgaW9jdGwgaW9jdGxzb2NrZXQKKworI2RlZmluZSBTU0xfQ09OTkVDVF9OQU1FCSJsb2NhbGhvc3Q6NDQzMyIKKworLyojZGVmaW5lIFRFU1RfQ0VSVCAiY2xpZW50LnBlbSIgKi8gLyogbm8gZGVmYXVsdCBjZXJ0LiAqLworCisjdW5kZWYgQlVGU0laWgorI2RlZmluZSBCVUZTSVpaIDEwMjQqMTAKKworI2RlZmluZSBNWUJVRlNJWiAxMDI0KjgKKworI3VuZGVmIG1pbgorI3VuZGVmIG1heAorI2RlZmluZSBtaW4oYSxiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIG1heChhLGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworI3VuZGVmIFNFQ09ORFMKKyNkZWZpbmUgU0VDT05EUwkzMAorZXh0ZXJuIGludCB2ZXJpZnlfZGVwdGg7CitleHRlcm4gaW50IHZlcmlmeV9lcnJvcjsKKworc3RhdGljIHZvaWQgc190aW1lX3VzYWdlKHZvaWQpOworc3RhdGljIGludCBwYXJzZUFyZ3MoIGludCBhcmdjLCBjaGFyICoqYXJndiApOworc3RhdGljIFNTTCAqZG9Db25uZWN0aW9uKCBTU0wgKnNjb24gKTsKK3N0YXRpYyB2b2lkIHNfdGltZV9pbml0KHZvaWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFN0YXRpYyBkYXRhIGRlY2xhcmF0aW9ucworICovCisKKy8qIHN0YXRpYyBjaGFyICpwb3J0PVBPUlRfU1RSOyovCitzdGF0aWMgY2hhciAqaG9zdD1TU0xfQ09OTkVDVF9OQU1FOworc3RhdGljIGNoYXIgKnRfY2VydF9maWxlPU5VTEw7CitzdGF0aWMgY2hhciAqdF9rZXlfZmlsZT1OVUxMOworc3RhdGljIGNoYXIgKkNBcGF0aD1OVUxMOworc3RhdGljIGNoYXIgKkNBZmlsZT1OVUxMOworc3RhdGljIGNoYXIgKnRtX2NpcGhlcj1OVUxMOworc3RhdGljIGludCB0bV92ZXJpZnkgPSBTU0xfVkVSSUZZX05PTkU7CitzdGF0aWMgaW50IG1heFRpbWUgPSBTRUNPTkRTOworc3RhdGljIFNTTF9DVFggKnRtX2N0eD1OVUxMOworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKnNfdGltZV9tZXRoPU5VTEw7CitzdGF0aWMgY2hhciAqc193d3dfcGF0aD1OVUxMOworc3RhdGljIGxvbmcgYnl0ZXNfcmVhZD0wOyAKK3N0YXRpYyBpbnQgc3RfYnVncz0wOworc3RhdGljIGludCBwZXJmb3JtPTA7CisjaWZkZWYgRklPTkJJTworc3RhdGljIGludCB0X25iaW89MDsKKyNlbmRpZgorI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjMyCitzdGF0aWMgaW50IGV4aXROb3cgPSAwOwkJLyogU2V0IHdoZW4gaXQncyB0aW1lIHRvIGV4aXQgbWFpbiAqLworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNfdGltZV9pbml0KHZvaWQpCisJeworCWhvc3Q9U1NMX0NPTk5FQ1RfTkFNRTsKKwl0X2NlcnRfZmlsZT1OVUxMOworCXRfa2V5X2ZpbGU9TlVMTDsKKwlDQXBhdGg9TlVMTDsKKwlDQWZpbGU9TlVMTDsKKwl0bV9jaXBoZXI9TlVMTDsKKwl0bV92ZXJpZnkgPSBTU0xfVkVSSUZZX05PTkU7CisJbWF4VGltZSA9IFNFQ09ORFM7CisJdG1fY3R4PU5VTEw7CisJc190aW1lX21ldGg9TlVMTDsKKwlzX3d3d19wYXRoPU5VTEw7CisJYnl0ZXNfcmVhZD0wOyAKKwlzdF9idWdzPTA7CisJcGVyZm9ybT0wOworCisjaWZkZWYgRklPTkJJTworCXRfbmJpbz0wOworI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzIKKwlleGl0Tm93ID0gMDsJCS8qIFNldCB3aGVuIGl0J3MgdGltZSB0byBleGl0IG1haW4gKi8KKyNlbmRpZgorCX0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB1c2FnZSAtIGRpc3BsYXkgdXNhZ2UgbWVzc2FnZQorICovCitzdGF0aWMgdm9pZCBzX3RpbWVfdXNhZ2Uodm9pZCkKK3sKKwlzdGF0aWMgY2hhciB1bXNnW10gPSAiXAorLXRpbWUgYXJnICAgICAtIG1heCBudW1iZXIgb2Ygc2Vjb25kcyB0byBjb2xsZWN0IGRhdGEsIGRlZmF1bHQgJWRcblwKKy12ZXJpZnkgYXJnICAgLSB0dXJuIG9uIHBlZXIgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLCBhcmcgPT0gZGVwdGhcblwKKy1jZXJ0IGFyZyAgICAgLSBjZXJ0aWZpY2F0ZSBmaWxlIHRvIHVzZSwgUEVNIGZvcm1hdCBhc3N1bWVkXG5cCista2V5IGFyZyAgICAgIC0gUlNBIGZpbGUgdG8gdXNlLCBQRU0gZm9ybWF0IGFzc3VtZWQsIGtleSBpcyBpbiBjZXJ0IGZpbGVcblwKKyAgICAgICAgICAgICAgICBmaWxlIGlmIG5vdCBzcGVjaWZpZWQgYnkgdGhpcyBvcHRpb25cblwKKy1DQXBhdGggYXJnICAgLSBQRU0gZm9ybWF0IGRpcmVjdG9yeSBvZiBDQSdzXG5cCistQ0FmaWxlIGFyZyAgIC0gUEVNIGZvcm1hdCBmaWxlIG9mIENBJ3NcblwKKy1jaXBoZXIgICAgICAgLSBwcmVmZXJyZWQgY2lwaGVyIHRvIHVzZSwgcGxheSB3aXRoICdvcGVuc3NsIGNpcGhlcnMnXG5cbiI7CisKKwlwcmludGYoICJ1c2FnZTogc190aW1lIDxhcmdzPlxuXG4iICk7CisKKwlwcmludGYoIi1jb25uZWN0IGhvc3Q6cG9ydCAtIGhvc3Q6cG9ydCB0byBjb25uZWN0IHRvIChkZWZhdWx0IGlzICVzKVxuIixTU0xfQ09OTkVDVF9OQU1FKTsKKyNpZmRlZiBGSU9OQklPCisJcHJpbnRmKCItbmJpbyAgICAgICAgIC0gUnVuIHdpdGggbm9uLWJsb2NraW5nIElPXG4iKTsKKwlwcmludGYoIi1zc2wyICAgICAgICAgLSBKdXN0IHVzZSBTU0x2MlxuIik7CisJcHJpbnRmKCItc3NsMyAgICAgICAgIC0gSnVzdCB1c2UgU1NMdjNcbiIpOworCXByaW50ZigiLWJ1Z3MgICAgICAgICAtIFR1cm4gb24gU1NMIGJ1ZyBjb21wYXRpYmlsaXR5XG4iKTsKKwlwcmludGYoIi1uZXcgICAgICAgICAgLSBKdXN0IHRpbWUgbmV3IGNvbm5lY3Rpb25zXG4iKTsKKwlwcmludGYoIi1yZXVzZSAgICAgICAgLSBKdXN0IHRpbWUgY29ubmVjdGlvbiByZXVzZVxuIik7CisJcHJpbnRmKCItd3d3IHBhZ2UgICAgIC0gUmV0cmlldmUgJ3BhZ2UnIGZyb20gdGhlIHNpdGVcbiIpOworI2VuZGlmCisJcHJpbnRmKCB1bXNnLFNFQ09ORFMgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwYXJzZUFyZ3MgLSBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFuZCBpbml0aWFsaXplIGRhdGEKKyAqCisgKiBSZXR1cm5zIDAgaWYgb2ssIC0xIG9uIGJhZCBhcmdzCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VBcmdzKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgYmFkb3AgPSAwOworCisgICAgdmVyaWZ5X2RlcHRoPTA7CisgICAgdmVyaWZ5X2Vycm9yPVg1MDlfVl9PSzsKKworICAgIGFyZ2MtLTsKKyAgICBhcmd2Kys7CisKKyAgICB3aGlsZSAoYXJnYyA+PSAxKSB7CisJaWYgKHN0cmNtcCgqYXJndiwiLWNvbm5lY3QiKSA9PSAwKQorCQl7CisJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJaG9zdD0gKigrK2FyZ3YpOworCQl9CisjaWYgMAorCWVsc2UgaWYoIHN0cmNtcCgqYXJndiwiLWhvc3QiKSA9PSAwKQorCQl7CisJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJaG9zdD0gKigrK2FyZ3YpOworCQl9CisJZWxzZSBpZiggc3RyY21wKCphcmd2LCItcG9ydCIpID09IDApCisJCXsKKwkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQlwb3J0PSAqKCsrYXJndik7CisJCX0KKyNlbmRpZgorCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXJldXNlIikgPT0gMCkKKwkJcGVyZm9ybT0yOworCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5ldyIpID09IDApCisJCXBlcmZvcm09MTsKKwllbHNlIGlmKCBzdHJjbXAoKmFyZ3YsIi12ZXJpZnkiKSA9PSAwKSB7CisKKwkgICAgdG1fdmVyaWZ5PVNTTF9WRVJJRllfUEVFUnxTU0xfVkVSSUZZX0NMSUVOVF9PTkNFOworCSAgICBpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJICAgIHZlcmlmeV9kZXB0aD1hdG9pKCooKythcmd2KSk7CisJICAgIEJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IGRlcHRoIGlzICVkXG4iLHZlcmlmeV9kZXB0aCk7CisKKwl9IGVsc2UgaWYoIHN0cmNtcCgqYXJndiwiLWNlcnQiKSA9PSAwKSB7CisKKwkgICAgaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCSAgICB0X2NlcnRfZmlsZT0gKigrK2FyZ3YpOworCisJfSBlbHNlIGlmKCBzdHJjbXAoKmFyZ3YsIi1rZXkiKSA9PSAwKSB7CisKKwkgICAgaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCSAgICB0X2tleV9maWxlPSAqKCsrYXJndik7CisKKwl9IGVsc2UgaWYoIHN0cmNtcCgqYXJndiwiLUNBcGF0aCIpID09IDApIHsKKworCSAgICBpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJICAgIENBcGF0aD0gKigrK2FyZ3YpOworCisJfSBlbHNlIGlmKCBzdHJjbXAoKmFyZ3YsIi1DQWZpbGUiKSA9PSAwKSB7CisKKwkgICAgaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCSAgICBDQWZpbGU9ICooKythcmd2KTsKKworCX0gZWxzZSBpZiggc3RyY21wKCphcmd2LCItY2lwaGVyIikgPT0gMCkgeworCisJICAgIGlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkgICAgdG1fY2lwaGVyPSAqKCsrYXJndik7CisJfQorI2lmZGVmIEZJT05CSU8KKwllbHNlIGlmKHN0cmNtcCgqYXJndiwiLW5iaW8iKSA9PSAwKSB7CisJICAgIHRfbmJpbz0xOworCX0KKyNlbmRpZgorCWVsc2UgaWYoc3RyY21wKCphcmd2LCItd3d3IikgPT0gMCkKKwkJeworCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCXNfd3d3X3BhdGg9ICooKythcmd2KTsKKwkJaWYoc3RybGVuKHNfd3d3X3BhdGgpID4gTVlCVUZTSVotMTAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCItd3d3IG9wdGlvbiB0b28gbG9uZ1xuIik7CisJCQliYWRvcD0xOworCQkJfQorCQl9CisJZWxzZSBpZihzdHJjbXAoKmFyZ3YsIi1idWdzIikgPT0gMCkKKwkgICAgc3RfYnVncz0xOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDIKKwllbHNlIGlmKHN0cmNtcCgqYXJndiwiLXNzbDIiKSA9PSAwKQorCSAgICBzX3RpbWVfbWV0aD1TU0x2Ml9jbGllbnRfbWV0aG9kKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisJZWxzZSBpZihzdHJjbXAoKmFyZ3YsIi1zc2wzIikgPT0gMCkKKwkgICAgc190aW1lX21ldGg9U1NMdjNfY2xpZW50X21ldGhvZCgpOworI2VuZGlmCisJZWxzZSBpZiggc3RyY21wKCphcmd2LCItdGltZSIpID09IDApIHsKKworCSAgICBpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJICAgIG1heFRpbWU9IGF0b2koKigrK2FyZ3YpKTsKKwl9CisJZWxzZSB7CisJICAgIEJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJXNcbiIsKmFyZ3YpOworCSAgICBiYWRvcD0xOworCSAgICBicmVhazsKKwl9CisKKwlhcmdjLS07CisJYXJndisrOworICAgIH0KKworICAgIGlmIChwZXJmb3JtID09IDApIHBlcmZvcm09MzsKKworICAgIGlmKGJhZG9wKSB7CitiYWQ6CisJCXNfdGltZV91c2FnZSgpOworCQlyZXR1cm4gLTE7CisgICAgfQorCisJcmV0dXJuIDA7CQkJLyogVmFsaWQgYXJncyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFRJTUUgLSB0aW1lIGZ1bmN0aW9ucworICovCisjZGVmaW5lIFNUQVJUCTAKKyNkZWZpbmUgU1RPUAkxCisKK3N0YXRpYyBkb3VibGUgdG1fVGltZV9GKGludCBzKQorCXsKKwlyZXR1cm4gYXBwX3RtaW50ZXJ2YWwocywxKTsKKwl9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUFJTiAtIG1haW4gcHJvY2Vzc2luZyBhcmVhIGZvciBjbGllbnQKKyAqCQkJcmVhbCBuYW1lIGRlcGVuZHMgb24gTU9OT0xJVEgKKyAqLworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlkb3VibGUgdG90YWxUaW1lID0gMC4wOworCWludCBuQ29ubiA9IDA7CisJU1NMICpzY29uPU5VTEw7CisJbG9uZyBmaW5pc2h0aW1lPTA7CisJaW50IHJldD0xLGk7CisJTVNfU1RBVElDIGNoYXIgYnVmWzEwMjQqOF07CisJaW50IHZlcjsKKworCWFwcHNfc3RhcnR1cCgpOworCXNfdGltZV9pbml0KCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQliaW9fZXJyPUJJT19uZXdfZnAoc3RkZXJyLEJJT19OT0NMT1NFKTsKKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMikgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TU0wzKQorCXNfdGltZV9tZXRoPVNTTHYyM19jbGllbnRfbWV0aG9kKCk7CisjZWxpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDMpCisJc190aW1lX21ldGg9U1NMdjNfY2xpZW50X21ldGhvZCgpOworI2VsaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TU0wyKQorCXNfdGltZV9tZXRoPVNTTHYyX2NsaWVudF9tZXRob2QoKTsKKyNlbmRpZgorCisJLyogcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KKwlpZiggcGFyc2VBcmdzKCBhcmdjLCBhcmd2ICkgPCAwICkKKwkJZ290byBlbmQ7CisKKwlPcGVuU1NMX2FkZF9zc2xfYWxnb3JpdGhtcygpOworCWlmICgodG1fY3R4PVNTTF9DVFhfbmV3KHNfdGltZV9tZXRoKSkgPT0gTlVMTCkgcmV0dXJuKDEpOworCisJU1NMX0NUWF9zZXRfcXVpZXRfc2h1dGRvd24odG1fY3R4LDEpOworCisJaWYgKHN0X2J1Z3MpIFNTTF9DVFhfc2V0X29wdGlvbnModG1fY3R4LFNTTF9PUF9BTEwpOworCVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KHRtX2N0eCx0bV9jaXBoZXIpOworCWlmKCFzZXRfY2VydF9zdHVmZih0bV9jdHgsdF9jZXJ0X2ZpbGUsdF9rZXlfZmlsZSkpIAorCQlnb3RvIGVuZDsKKworCVNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKworCWlmICgoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHRtX2N0eCxDQWZpbGUsQ0FwYXRoKSkgfHwKKwkJKCFTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyh0bV9jdHgpKSkKKwkJeworCQkvKiBCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHNldHRpbmcgZGVmYXVsdCB2ZXJpZnkgbG9jYXRpb25zXG4iKTsgKi8KKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJLyogZ290byBlbmQ7ICovCisJCX0KKworCWlmICh0bV9jaXBoZXIgPT0gTlVMTCkKKwkJdG1fY2lwaGVyID0gZ2V0ZW52KCJTU0xfQ0lQSEVSIik7CisKKwlpZiAodG1fY2lwaGVyID09IE5VTEwgKSB7CisJCWZwcmludGYoIHN0ZGVyciwgIk5vIENJUEhFUiBzcGVjaWZpZWRcbiIgKTsKKwl9CisKKwlpZiAoIShwZXJmb3JtICYgMSkpIGdvdG8gbmV4dDsKKwlwcmludGYoICJDb2xsZWN0aW5nIGNvbm5lY3Rpb24gc3RhdGlzdGljcyBmb3IgJWQgc2Vjb25kc1xuIiwgbWF4VGltZSApOworCisJLyogTG9vcCBhbmQgdGltZSBob3cgbG9uZyBpdCB0YWtlcyB0byBtYWtlIGNvbm5lY3Rpb25zICovCisKKwlieXRlc19yZWFkPTA7CisJZmluaXNodGltZT0obG9uZyl0aW1lKE5VTEwpK21heFRpbWU7CisJdG1fVGltZV9GKFNUQVJUKTsKKwlmb3IgKDs7KQorCQl7CisJCWlmIChmaW5pc2h0aW1lIDwgKGxvbmcpdGltZShOVUxMKSkgYnJlYWs7CisjaWZkZWYgV0lOMzJfU1RVRkYKKworCQlpZiggZmx1c2hXaW5Nc2dzKDApID09IC0xICkKKwkJCWdvdG8gZW5kOworCisJCWlmKCB3YWl0aW5nVG9EaWUgfHwgZXhpdE5vdyApCQkvKiB3ZSdyZSBkZWFkICovCisJCQlnb3RvIGVuZDsKKyNlbmRpZgorCisJCWlmKCAoc2NvbiA9IGRvQ29ubmVjdGlvbiggTlVMTCApKSA9PSBOVUxMICkKKwkJCWdvdG8gZW5kOworCisJCWlmIChzX3d3d19wYXRoICE9IE5VTEwpCisJCQl7CisJCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsIkdFVCAlcyBIVFRQLzEuMFxyXG5cclxuIixzX3d3d19wYXRoKTsKKwkJCVNTTF93cml0ZShzY29uLGJ1ZixzdHJsZW4oYnVmKSk7CisJCQl3aGlsZSAoKGk9U1NMX3JlYWQoc2NvbixidWYsc2l6ZW9mKGJ1ZikpKSA+IDApCisJCQkJYnl0ZXNfcmVhZCs9aTsKKwkJCX0KKworI2lmZGVmIE5PX1NIVVRET1dOCisJCVNTTF9zZXRfc2h1dGRvd24oc2NvbixTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOworI2Vsc2UKKwkJU1NMX3NodXRkb3duKHNjb24pOworI2VuZGlmCisJCVNIVVRET1dOMihTU0xfZ2V0X2ZkKHNjb24pKTsKKworCQluQ29ubiArPSAxOworCQlpZiAoU1NMX3Nlc3Npb25fcmV1c2VkKHNjb24pKQorCQkJdmVyPSdyJzsKKwkJZWxzZQorCQkJeworCQkJdmVyPVNTTF92ZXJzaW9uKHNjb24pOworCQkJaWYgKHZlciA9PSBUTFMxX1ZFUlNJT04pCisJCQkJdmVyPSd0JzsKKwkJCWVsc2UgaWYgKHZlciA9PSBTU0wzX1ZFUlNJT04pCisJCQkJdmVyPSczJzsKKwkJCWVsc2UgaWYgKHZlciA9PSBTU0wyX1ZFUlNJT04pCisJCQkJdmVyPScyJzsKKwkJCWVsc2UKKwkJCQl2ZXI9JyonOworCQkJfQorCQlmcHV0Yyh2ZXIsc3Rkb3V0KTsKKwkJZmZsdXNoKHN0ZG91dCk7CisKKwkJU1NMX2ZyZWUoIHNjb24gKTsKKwkJc2Nvbj1OVUxMOworCQl9CisJdG90YWxUaW1lICs9IHRtX1RpbWVfRihTVE9QKTsgLyogQWRkIHRoZSB0aW1lIGZvciB0aGlzIGl0ZXJhdGlvbiAqLworCisJaT0oaW50KSgobG9uZyl0aW1lKE5VTEwpLWZpbmlzaHRpbWUrbWF4VGltZSk7CisJcHJpbnRmKCAiXG5cbiVkIGNvbm5lY3Rpb25zIGluICUuMmZzOyAlLjJmIGNvbm5lY3Rpb25zL3VzZXIgc2VjLCBieXRlcyByZWFkICVsZFxuIiwgbkNvbm4sIHRvdGFsVGltZSwgKChkb3VibGUpbkNvbm4vdG90YWxUaW1lKSxieXRlc19yZWFkKTsKKwlwcmludGYoICIlZCBjb25uZWN0aW9ucyBpbiAlbGQgcmVhbCBzZWNvbmRzLCAlbGQgYnl0ZXMgcmVhZCBwZXIgY29ubmVjdGlvblxuIixuQ29ubiwobG9uZyl0aW1lKE5VTEwpLWZpbmlzaHRpbWUrbWF4VGltZSxieXRlc19yZWFkL25Db25uKTsKKworCS8qIE5vdyBsb29wIGFuZCB0aW1lIGNvbm5lY3Rpb25zIHVzaW5nIHRoZSBzYW1lIHNlc3Npb24gaWQgb3ZlciBhbmQgb3ZlciAqLworCituZXh0OgorCWlmICghKHBlcmZvcm0gJiAyKSkgZ290byBlbmQ7CisJcHJpbnRmKCAiXG5cbk5vdyB0aW1pbmcgd2l0aCBzZXNzaW9uIGlkIHJldXNlLlxuIiApOworCisJLyogR2V0IGFuIFNTTCBvYmplY3Qgc28gd2UgY2FuIHJldXNlIHRoZSBzZXNzaW9uIGlkICovCisJaWYoIChzY29uID0gZG9Db25uZWN0aW9uKCBOVUxMICkpID09IE5VTEwgKQorCQl7CisJCWZwcmludGYoIHN0ZGVyciwgIlVuYWJsZSB0byBnZXQgY29ubmVjdGlvblxuIiApOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKHNfd3d3X3BhdGggIT0gTlVMTCkKKwkJeworCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsIkdFVCAlcyBIVFRQLzEuMFxyXG5cclxuIixzX3d3d19wYXRoKTsKKwkJU1NMX3dyaXRlKHNjb24sYnVmLHN0cmxlbihidWYpKTsKKwkJd2hpbGUgKFNTTF9yZWFkKHNjb24sYnVmLHNpemVvZihidWYpKSA+IDApCisJCQk7CisJCX0KKyNpZmRlZiBOT19TSFVURE9XTgorCVNTTF9zZXRfc2h1dGRvd24oc2NvbixTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOworI2Vsc2UKKwlTU0xfc2h1dGRvd24oc2Nvbik7CisjZW5kaWYKKwlTSFVURE9XTjIoU1NMX2dldF9mZChzY29uKSk7CisKKwluQ29ubiA9IDA7CisJdG90YWxUaW1lID0gMC4wOworCisJZmluaXNodGltZT0obG9uZyl0aW1lKE5VTEwpK21heFRpbWU7CisKKwlwcmludGYoICJzdGFydGluZ1xuIiApOworCWJ5dGVzX3JlYWQ9MDsKKwl0bV9UaW1lX0YoU1RBUlQpOworCQkKKwlmb3IgKDs7KQorCQl7CisJCWlmIChmaW5pc2h0aW1lIDwgKGxvbmcpdGltZShOVUxMKSkgYnJlYWs7CisKKyNpZmRlZiBXSU4zMl9TVFVGRgorCQlpZiggZmx1c2hXaW5Nc2dzKDApID09IC0xICkKKwkJCWdvdG8gZW5kOworCisJCWlmKCB3YWl0aW5nVG9EaWUgfHwgZXhpdE5vdyApCS8qIHdlJ3JlIGRlYWQgKi8KKwkJCWdvdG8gZW5kOworI2VuZGlmCisKKwkgCWlmKCAoZG9Db25uZWN0aW9uKCBzY29uICkpID09IE5VTEwgKQorCQkJZ290byBlbmQ7CisKKwkJaWYgKHNfd3d3X3BhdGgpCisJCQl7CisJCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsIkdFVCAlcyBIVFRQLzEuMFxyXG5cclxuIixzX3d3d19wYXRoKTsKKwkJCVNTTF93cml0ZShzY29uLGJ1ZixzdHJsZW4oYnVmKSk7CisJCQl3aGlsZSAoKGk9U1NMX3JlYWQoc2NvbixidWYsc2l6ZW9mKGJ1ZikpKSA+IDApCisJCQkJYnl0ZXNfcmVhZCs9aTsKKwkJCX0KKworI2lmZGVmIE5PX1NIVVRET1dOCisJCVNTTF9zZXRfc2h1dGRvd24oc2NvbixTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOworI2Vsc2UKKwkJU1NMX3NodXRkb3duKHNjb24pOworI2VuZGlmCisJCVNIVVRET1dOMihTU0xfZ2V0X2ZkKHNjb24pKTsKKwkKKwkJbkNvbm4gKz0gMTsKKwkJaWYgKFNTTF9zZXNzaW9uX3JldXNlZChzY29uKSkKKwkJCXZlcj0ncic7CisJCWVsc2UKKwkJCXsKKwkJCXZlcj1TU0xfdmVyc2lvbihzY29uKTsKKwkJCWlmICh2ZXIgPT0gVExTMV9WRVJTSU9OKQorCQkJCXZlcj0ndCc7CisJCQllbHNlIGlmICh2ZXIgPT0gU1NMM19WRVJTSU9OKQorCQkJCXZlcj0nMyc7CisJCQllbHNlIGlmICh2ZXIgPT0gU1NMMl9WRVJTSU9OKQorCQkJCXZlcj0nMic7CisJCQllbHNlCisJCQkJdmVyPScqJzsKKwkJCX0KKwkJZnB1dGModmVyLHN0ZG91dCk7CisJCWZmbHVzaChzdGRvdXQpOworCQl9CisJdG90YWxUaW1lICs9IHRtX1RpbWVfRihTVE9QKTsgLyogQWRkIHRoZSB0aW1lIGZvciB0aGlzIGl0ZXJhdGlvbiovCisKKworCXByaW50ZiggIlxuXG4lZCBjb25uZWN0aW9ucyBpbiAlLjJmczsgJS4yZiBjb25uZWN0aW9ucy91c2VyIHNlYywgYnl0ZXMgcmVhZCAlbGRcbiIsIG5Db25uLCB0b3RhbFRpbWUsICgoZG91YmxlKW5Db25uL3RvdGFsVGltZSksYnl0ZXNfcmVhZCk7CisJcHJpbnRmKCAiJWQgY29ubmVjdGlvbnMgaW4gJWxkIHJlYWwgc2Vjb25kcywgJWxkIGJ5dGVzIHJlYWQgcGVyIGNvbm5lY3Rpb25cbiIsbkNvbm4sKGxvbmcpdGltZShOVUxMKS1maW5pc2h0aW1lK21heFRpbWUsYnl0ZXNfcmVhZC9uQ29ubik7CisKKwlyZXQ9MDsKK2VuZDoKKwlpZiAoc2NvbiAhPSBOVUxMKSBTU0xfZnJlZShzY29uKTsKKworCWlmICh0bV9jdHggIT0gTlVMTCkKKwkJeworCQlTU0xfQ1RYX2ZyZWUodG1fY3R4KTsKKwkJdG1fY3R4PU5VTEw7CisJCX0KKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRvQ29ubmVjdGlvbiAtIG1ha2UgYSBjb25uZWN0aW9uCisgKiBBcmdzOgorICoJCXNjb24JPSBlYXJsaWVyIHNzbCBjb25uZWN0aW9uIGZvciBzZXNzaW9uIGlkLCBvciBOVUxMCisgKiBSZXR1cm5zOgorICoJCVNTTCAqCT0gdGhlIGNvbm5lY3Rpb24gcG9pbnRlci4KKyAqLworc3RhdGljIFNTTCAqZG9Db25uZWN0aW9uKFNTTCAqc2NvbikKKwl7CisJQklPICpjb25uOworCVNTTCAqc2VydmVyQ29uOworCWludCB3aWR0aCwgaTsKKwlmZF9zZXQgcmVhZGZkczsKKworCWlmICgoY29ubj1CSU9fbmV3KEJJT19zX2Nvbm5lY3QoKSkpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworLyoJQklPX3NldF9jb25uX3BvcnQoY29ubixwb3J0KTsqLworCUJJT19zZXRfY29ubl9ob3N0bmFtZShjb25uLGhvc3QpOworCisJaWYgKHNjb24gPT0gTlVMTCkKKwkJc2VydmVyQ29uPVNTTF9uZXcodG1fY3R4KTsKKwllbHNlCisJCXsKKwkJc2VydmVyQ29uPXNjb247CisJCVNTTF9zZXRfY29ubmVjdF9zdGF0ZShzZXJ2ZXJDb24pOworCQl9CisKKwlTU0xfc2V0X2JpbyhzZXJ2ZXJDb24sY29ubixjb25uKTsKKworI2lmIDAKKwlpZiggc2NvbiAhPSBOVUxMICkKKwkJU1NMX3NldF9zZXNzaW9uKHNlcnZlckNvbixTU0xfZ2V0X3Nlc3Npb24oc2NvbikpOworI2VuZGlmCisKKwkvKiBvaywgbGV0cyBjb25uZWN0ICovCisJZm9yKDs7KSB7CisJCWk9U1NMX2Nvbm5lY3Qoc2VydmVyQ29uKTsKKwkJaWYgKEJJT19zb2NrX3Nob3VsZF9yZXRyeShpKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiREVMQVlcbiIpOworCisJCQlpPVNTTF9nZXRfZmQoc2VydmVyQ29uKTsKKwkJCXdpZHRoPWkrMTsKKwkJCUZEX1pFUk8oJnJlYWRmZHMpOworCQkJb3BlbnNzbF9mZHNldChpLCZyZWFkZmRzKTsKKwkJCS8qIE5vdGU6IHVuZGVyIFZNUyB3aXRoIFNPQ0tFVFNIUiB0aGUgMm5kIHBhcmFtZXRlcgorCQkJICogaXMgY3VycmVudGx5IG9mIHR5cGUgKGludCAqKSB3aGVyZWFzIHVuZGVyIG90aGVyCisJCQkgKiBzeXN0ZW1zIGl0IGlzICh2b2lkICopIGlmIHlvdSBkb24ndCBoYXZlIGEgY2FzdCBpdAorCQkJICogd2lsbCBjaG9rZSB0aGUgY29tcGlsZXI6IGlmIHlvdSBkbyBoYXZlIGEgY2FzdCB0aGVuCisJCQkgKiB5b3UgY2FuIGVpdGhlciBnbyBmb3IgKGludCAqKSBvciAodm9pZCAqKS4KKwkJCSAqLworCQkJc2VsZWN0KHdpZHRoLCh2b2lkICopJnJlYWRmZHMsTlVMTCxOVUxMLE5VTEwpOworCQkJY29udGludWU7CisJCQl9CisJCWJyZWFrOworCQl9CisJaWYoaSA8PSAwKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiRVJST1JcbiIpOworCQlpZiAodmVyaWZ5X2Vycm9yICE9IFg1MDlfVl9PSykKKwkJCUJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IGVycm9yOiVzXG4iLAorCQkJCVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKHZlcmlmeV9lcnJvcikpOworCQllbHNlCisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlpZiAoc2NvbiA9PSBOVUxMKQorCQkJU1NMX2ZyZWUoc2VydmVyQ29uKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldHVybiBzZXJ2ZXJDb247CisJfQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvc2VydmVyLnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvc2VydmVyLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI0OGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9zZXJ2ZXIucGVtCkBAIC0wLDAgKzEsMzY5IEBACitpc3N1ZXI9IC9DPUFVL1NUPVF1ZWVuc2xhbmQvTz1DcnlwdFNvZnQgUHR5IEx0ZC9DTj1UZXN0IENBICgxMDI0IGJpdCkKK3N1YmplY3Q9IC9DPUFVL1NUPVF1ZWVuc2xhbmQvTz1DcnlwdFNvZnQgUHR5IEx0ZC9DTj1TZXJ2ZXIgdGVzdCBjZXJ0ICg1MTIgYml0KQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlCNlRDQ0FWSUNBUVl3RFFZSktvWklodmNOQVFFRUJRQXdXekVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WCitCQWdUQ2xGMVpXVnVjMnhoYm1ReEdqQVlCZ05WQkFvVEVVTnllWEIwVTI5bWRDQlFkSGtnVEhSa01Sc3dHUVlECitWUVFERXhKVVpYTjBJRU5CSUNneE1ESTBJR0pwZENrd0hoY05NREF4TURFMk1qSXpNVEF6V2hjTk1ETXdNVEUwCitNakl6TVRBeldqQmpNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERWFNQmdHCitBMVVFQ2hNUlEzSjVjSFJUYjJaMElGQjBlU0JNZEdReEl6QWhCZ05WQkFNVEdsTmxjblpsY2lCMFpYTjBJR05sCitjblFnS0RVeE1pQmlhWFFwTUZ3d0RRWUpLb1pJaHZjTkFRRUJCUUFEU3dBd1NBSkJBSit6dzRRbmxmOFNNVklQCitGZTlHRWNTdGdPWTJXdy9kZ05kaGplRDhja1VKTlA1VlprVkRUR2lYYXY2b29LWGZYM2ovN3Rka3VEOEV5Mi8vCitLdjcrdWUwQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFRRkFBT0JnUUNUMGdyRlFlWmFxWWI1RVlmazIwWGl4WlY0CitHbXlBYlhNZnRHMUVvN3FHaU1oWXpSd0dOV3hFWW9qZjVQWmtZWlh2U3FaL1pYSFhhNGc1OWpLL3JKTm5hVkdNCitrK3hJWDhteFF2bFYwbjVPOVBJaGE1Qlg1dGVabmtIS2dMOGFLS0xLVzFCSzdZVG5nc2ZTenphZWFtZTVpS2Z6CitpdEFFK09qR0YrUEZLYndYOFE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQlBBSUJBQUpCQUorenc0UW5sZjhTTVZJUEZlOUdFY1N0Z09ZMld3L2RnTmRoamVEOGNrVUpOUDVWWmtWRAorVEdpWGF2Nm9vS1hmWDNqLzd0ZGt1RDhFeTIvL0t2Nyt1ZTBDQXdFQUFRSkFONlczMXZERVAyRGpkcWh6Q0REdQorT0E0TkFDcW9pRnF5YmxvN3ljMnRNNGg0eE1iQzNZeDVVS01OOVprQ3RYMGd6cno2RHlGNDdiZEtjV0J6TldDagorZ1FJaEFORW9valZ0N2hxK1NRNk1DTjZGVEF5c0dnUWY1NlEzVFlvSk1vV3ZkaVhWQWlFQXczZTNyYytWSnBPegorckh1RG82YmdwalVBQVhNK3YzZmNwc2ZaU05PNlY3a0NJUUN0YlZqYW5wVXd2WmtNSTlieTAyb1VrOXRha2kzYgorUHpQZkFmTlBZQWJDSlFJaEFKWE5RRFd5cXduL2xHbVIxMWNxWTJ5OW5aMSs1dzN5SEdhdExyY0RuUUh4QWlFQQordm5sRUdvOEs4NXUrS3dJT2ltTTQ4Wkc4b1RrN2lGZGtxTEpSMXV0VDNhVT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCitzdWJqZWN0PS9DPVVTL089QVQmVCBCZWxsIExhYm9yYXRvcmllcy9PVT1Qcm90b3R5cGUgUmVzZWFyY2ggQ0EKK2lzc3Vlcj0gL0M9VVMvTz1BVCZUIEJlbGwgTGFib3JhdG9yaWVzL09VPVByb3RvdHlwZSBSZXNlYXJjaCBDQQorbm90QmVmb3JlPTk1MDQxMzIxMDY1NloKK25vdEFmdGVyID05NzA0MTIyMTA2NTZaCistLS0tLUJFR0lOIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorCitNSUlDQ0RDQ0FYRUNBUUF3RFFZSktvWklodmNOQVFFRUJRQXdUakVMTUFrR0ExVUVCaE1DVlZNeEh6QWRCZ05WCitCQW9VRmtGVUpsUWdRbVZzYkNCTVlXSnZjbUYwYjNKcFpYTXhIakFjQmdOVkJBc1VGVkJ5YjNSdmRIbHdaU0JTCitaWE5sWVhKamFDQkRRVEFlRncwNU5UQTBNVE15TVRBMk5UWmFGdzA1TnpBME1USXlNVEEyTlRaYU1FNHhDekFKCitCZ05WQkFZVEFsVlRNUjh3SFFZRFZRUUtGQlpCVkNaVUlFSmxiR3dnVEdGaWIzSmhkRzl5YVdWek1SNHdIQVlECitWUVFMRkJWUWNtOTBiM1I1Y0dVZ1VtVnpaV0Z5WTJnZ1EwRXdnWnd3RFFZSktvWklodmNOQVFFQkJRQURnWW9BCitNSUdHQW9HQWViT21ndFNDbCt3Q1laYzg2VUdZZVRMWThjam1XMlAwRk44VG9UL3UycEVDQ29GZHJseWNYME9SCiszd3QwWmhwRlhMVk5lRG5Id0VFOXZlTlVpaDdwQ0wyWkJGcW9Jb1FrQjFsWm1YUmlWdGpHb256OEJMbS9xckZNCitZSGIwbG1lL09sK3MxMThtd0tWeG5uNmJTQWVJL09YS2hMYVZkWVpXaythRWF4RURrVmtDQVE4d0RRWUpLb1pJCitodmNOQVFFRUJRQURnWUVBQVpNRzE0bFptWjhiYWhrYUhhVFY5ZFFmNHAyRlppUVRGd0hQOVp5R3NYUEMrTFQ1CitkRzVpVGFSbXlqTklKZFBXb2haRGw5N2tBY2k3OWFCbmR2dUV2UktPakxIczNXUkdCSXdFUm5BY25ZOU16OHUvCit6SUhLMjNQallWeEdHYVpkNjY5T0p3RDBDWXlxSDIySEg5bkZVR2FvSmRzdjM5Q2hXME5SZExFOSt5OD0KKy0tLS0tRU5EIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQoraXNzdWVyPSAvQz1BVS9TVD1RdWVlbnNsYW5kL089Q3J5cHRTb2Z0IFB0eSBMdGQvQ049VGVzdCBQQ0EgKDEwMjQgYml0KQorc3ViamVjdD0vQz1BVS9TVD1RdWVlbnNsYW5kL089Q3J5cHRTb2Z0IFB0eSBMdGQvQ049VGVzdCBDQSAoMTAyNCBiaXQpCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNKakNDQVk4Q0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd1hERUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlYKK0JBZ1RDbEYxWldWdWMyeGhibVF4R2pBWUJnTlZCQW9URVVOeWVYQjBVMjltZENCUWRIa2dUSFJrTVJ3d0dnWUQKK1ZRUURFeE5VWlhOMElGQkRRU0FvTVRBeU5DQmlhWFFwTUI0WERUazNNRFl3T1RFek5UYzBNMW9YRFRBeE1EWXcKK09URXpOVGMwTTFvd1d6RUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEdqQVkKK0JnTlZCQW9URVVOeWVYQjBVMjltZENCUWRIa2dUSFJrTVJzd0dRWURWUVFERXhKVVpYTjBJRU5CSUNneE1ESTAKK0lHSnBkQ2t3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQUtPN284dDExNlZQNmNneWJUc1oKK0RDWmhyOTVuWWxadXlhM2FDaTFJS296dHF3V25qYm1ERklyaU9xR0ZQclpRK21vTUVUQzlENTlpUlcvZEZYU3YKKzFGNjVrYS9YWTJoTGg5ZXhDQ283WHVVY0RzNTNRcDNiSTNBbU1xSGpnekU4b08zYWp5SkF6SmtUVE9VZWNRVTIKK213L2dJNHRNTTBMcVdNUVM3bHVUeTQreEFnTUJBQUV3RFFZSktvWklodmNOQVFFRUJRQURnWUVBTTdhY2h2M3YKK2hMUUpjdi82NWVHRXBCWE00MFpEVm9GUUZGSldhWTVwODgzSFRxTEIxeDRGZHpzWEhIMFFLQlRjS3BXd3F5dTQKK1lEbTNmYjhvRHVndzcyYkN6ZnlaSy96VlpQUi9oVmxxSS9mdlUxMDlRb2MrN29QdklYV2t5NzFIZmNLNlpCQ0EKK3EzMEtJcUdNL3VvTTYwSU5xOTdxakRtQ0phcGFnY05CR1FzPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQ1hRSUJBQUtCZ1FDanU2UExkZGVsVCtuSU1tMDdHUXdtWWEvZVoySldic210MmdvdFNDcU03YXNGcDQyNQorZ3hTSzRqcWhoVDYyVVBwcURCRXd2UStmWWtWdjNSVjByOVJldVpHdjEyTm9TNGZYc1FncU8xN2xIQTdPZDBLZAorMnlOd0pqS2g0NE14UEtEdDJvOGlRTXlaRTB6bEhuRUZOcHNQNENPTFRETkM2bGpFRXU1Yms4dVBzUUlEQVFBQgorQW9HQVZabXBGWnNEWmZyMGwyUzl0TEx3cGpSV05PbEtBVFFrbm82cTJXZXNUMGVHTFF1ZlRjaVkrYzh5cGZVNgoraHlpbzhyNWlVbC9WaGhkamhBdEt4MW1ScGlvdGZ0SG8vZVlmOHJ0c3JucHJPbldHMGJXakxqdElvTWJjeEduMgorSjNiTjZMSm1iSk1qRHMwZUozS25UdTY0NkYzbkRVdzJvR0F3bXB6S1hBMUtBUDBDUVFEUnZRaHhrMkQzUGVocworSHZHNjY1dTJwQjVpcFlRbmdFRmxaTzdSSEpaekpPWkVXU0x1dU1xYUYvN3BUZkE1amlCdldxQ2dKZUNSUkluTAorMjFydTRkbFBBa0VBeDlqajdCZ0tuNVRZbk1vQlNTZTBhZmpzVjlvQXBWcE4xTmFjYjFZRHRDd3krc2NwMysrcworbkZ4bHY5OHd4SWxTZHB3TVVuK0FVV2ZqaVdSN1R1L0cvd0pCQUovS2p3WklyRlZ4ZXdQMHgySUxZc1RSWUx6egorTVM0UERzTzdGQitJMGk3RGJCT2lmWFMyb05TcGQzSTBDTk13cnhGblVIenlucGJPU3RWZk4zWkw1dzBDUVFDYQorcHdGYWh4QlJoa0pLc3hoam9GSkJYOXlsNzVKb1k0V3ZtNVRibzlpaDZVSmFSeDNrcWZrTjE0TDJCS1ljc1pnYgorS1k5dm1ET1l5NmlOZmpEZVdUZkpBa0JrZlBVYjhvVEovblNQNXpONnNxR3hTWTRrcmM0eEx4cFJteG9KOEhMMgorWGZocVhrVHpiVTEzUlg5SkovTlo4dlFOOVZtMk5oeFJHSm9jUWttY2RWdEoKKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCistLS0tLUJFR0lOIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1lEQ0NBaUFDQWdFb01Ba0dCU3NPQXdJTkJRQXdmREVMTUFrR0ExVUVCaE1DVlZNeE5qQTBCZ05WQkFvVAorTFU1aGRHbHZibUZzSUVGbGNtOXVZWFYwYVdOeklHRnVaQ0JUY0dGalpTQkJaRzFwYm1semRISmhkR2x2YmpFWgorTUJjR0ExVUVDeE1RVkdWemRDQkZiblpwY205dWJXVnVkREVhTUJnR0ExVUVDeE1SUkZOVExVNUJVMEV0VUdscworYjNRdFEwRXdIaGNOT1RZd01qSTJNVFl6TWpRMVdoY05PVGN3TWpJMU1UWXpNalExV2pCOE1Rc3dDUVlEVlFRRworRXdKVlV6RTJNRFFHQTFVRUNoTXRUbUYwYVc5dVlXd2dRV1Z5YjI1aGRYUnBZM01nWVc1a0lGTndZV05sSUVGaworYldsdWFYTjBjbUYwYVc5dU1Sa3dGd1lEVlFRTEV4QlVaWE4wSUVWdWRtbHliMjV0Wlc1ME1Sb3dHQVlEVlFRTAorRXhGRVUxTXRUa0ZUUVMxUWFXeHZkQzFEUVRDQjhqQUpCZ1VyRGdNQ0RBVUFBNEhrQURDQjRBSkJBTUEvc3NLYgoraFBOVUc3WmxBU2ZWd0VKVTIxTzVPeUYvaXlCemdISTFPOGVPaEpHVVlPOGNjOHdETWpSNTA4TXI5Y3A2VWhsLworWkI3RlY1R2tMTkVuUkhZQ1FRRFVFYVNnNDVQMnFyRHdpeFRSaEZobVd6NU52YzRsUkZRLzQyWFBjY2hpSkJMYgorYm4zUUs3NFQySXhZMXlZK2tDTnE4WHJJcWY1ZkpKeklIMEoveFVQM0FoVUFzZzJ3c1FIZkRHWWsvQk9TdWxYMworZlZkMGdlVUNRUUN6Q0ZVUUFoK1prRW1wNTgwNGNzNlpXQmhyVUFmbnJhOGxKSXRZbzl4UGNYZ2RJZkxmaWJjWAorUjcxVXN5Tzc3TVJEN0IwK0FnMnRxNzk0SWxlQ1ZjRUVNQWtHQlNzT0F3SU5CUUFETHdBd0xBSVVVYXlEZnJlUgorWWgyV2VVODYvcEhOZGtVQzFJZ0NGRWZ4ZTFmMG9NcHhKeXJKNVhJeFRpN3ZHZG9LCistLS0tLUVORCBYNTA5IENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gWDUwOSBDRVJUSUZJQ0FURS0tLS0tCisKK01JSUNHVENDQWRnQ0F3Q3FUREFKQmdVckRnTUNEUVVBTUh3eEN6QUpCZ05WQkFZVEFsVlRNVFl3TkFZRFZRUUsKK0V5MU9ZWFJwYjI1aGJDQkJaWEp2Ym1GMWRHbGpjeUJoYm1RZ1UzQmhZMlVnUVdSdGFXNXBjM1J5WVhScGIyNHgKK0dUQVhCZ05WQkFzVEVGUmxjM1FnUlc1MmFYSnZibTFsYm5ReEdqQVlCZ05WQkFzVEVVUlRVeTFPUVZOQkxWQnAKK2JHOTBMVU5CTUI0WERUazJNRFV4TkRFM01ERTBNVm9YRFRrM01EVXhOREUzTURFME1Wb3dNekVMTUFrR0ExVUUKK0JoTUNRVlV4RHpBTkJnTlZCQW9UQmsxcGJtTnZiVEVUTUJFR0ExVUVBeE1LUlhKcFl5QlpiM1Z1WnpDQjhqQUoKK0JnVXJEZ01DREFVQUE0SGtBRENCNEFKQkFLYmZIejZ2RTZwWFhNVHBzd3RHVWVjMnR2bmZMSlVzb3hFOXFzNCsKK09iWlg3TG1MdnJhZ05QVWVpVEp4N1VPV1o1RGZCajZiWExjOGVZbmUwbFAxZzNBQ1FRRFVFYVNnNDVQMnFyRHcKK2l4VFJoRmhtV3o1TnZjNGxSRlEvNDJYUGNjaGlKQkxiYm4zUUs3NFQySXhZMXlZK2tDTnE4WHJJcWY1ZkpKekkKK0gwSi94VVAzQWhVQXNnMndzUUhmREdZay9CT1N1bFgzZlZkMGdlVUNRUUN6Q0ZVUUFoK1prRW1wNTgwNGNzNloKK1dCaHJVQWZucmE4bEpJdFlvOXhQY1hnZElmTGZpYmNYUjcxVXN5Tzc3TVJEN0IwK0FnMnRxNzk0SWxlQ1ZjRUUKK01Ba0dCU3NPQXdJTkJRQURNQUF3TFFJVVdzdXVKUkUzVlQ0dWVXa1dNQUpNSmFaamoxRUNGUUNZWTB6WDRiek0KK0xDN29ic3JIRDhYQUhHK1pSRz09CistLS0tLUVORCBYNTA5IENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1RUQ0NBYmFnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFRRkFEQk1NUXN3Q1FZRFZRUUdFd0pIUWpFTQorTUFvR0ExVUVDaE1EVlVOTU1SZ3dGZ1lEVlFRTEV3OUpRMFV0VkVWTUlGQnliMnBsWTNReEZUQVRCZ05WQkFNVAorREZSeWRYTjBSbUZqZEc5eWVUQWVGdzA1TnpBME1qSXhORE01TVRSYUZ3MDVPREEwTWpJeE5ETTVNVFJhTUV3eAorQ3pBSkJnTlZCQVlUQWtkQ01Rd3dDZ1lEVlFRS0V3TlZRMHd4R0RBV0JnTlZCQXNURDBsRFJTMVVSVXdnVUhKdgorYW1WamRERVZNQk1HQTFVRUF4TU1WSEoxYzNSR1lXTjBiM0o1TUlHY01Bb0dCRlVJQVFFQ0FnUUFBNEdOQURDQgoraVFLQmdRQ0VpZVI4TmNYa1VXMWYwRzZhQzZ1MGk4cS85OEpxUzZSeEs1WW1ISUdLQ2t1VFdBVWp6TGZVYTRkdAorVTlpZ0dDalR1eGFEcWx6RWltK3QvMDJwbWlCWlQ5SGFYKyszNU1qUVBVV21zQ2hjWVU1V3l6R0VyWGkrclFhdworemx3Uzczek04cWlQai85N2xYWXljV2hnTDBWYWlEU1B4UlhFVWRXb2FHcnVvbTRtTlFJREFRQUJvMEl3UURBZAorQmdOVkhRNEVGZ1FVSGFsMUxacjdvVmc1ejZsWXpyaFRnWlJDbWNVd0RnWURWUjBQQVFIL0JBUURBZ0gyTUE4RworQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUFmYWdnZmw2RlpvaW9lY2p2MGRxOAorL0RYby91MTFpTVp2WG4wOGdqWC96bDJiNHd0UGJTaE9TWTVGaGtTbThHZXlTYXN6Ky9Od2IvdXpmbklob2tXaQorbGZQWkh0bENXdFhiSXkvVE41MWVKeXEwNGNlRENRRFd2TEMyZW5WZzlLQitHSjM0YjVjNVZhUFJ6cThNQnhzQQorUzdFTHVZR3RtWWdZbTlOWk9Jcjd5VTA9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUI2akNDQVpRQ0FnRXRNQTBHQ1NxR1NJYjNEUUVCQkFVQU1JR0FNUXN3Q1FZRFZRUUdFd0pWVXpFMk1EUUcKK0ExVUVDaE10VG1GMGFXOXVZV3dnUVdWeWIyNWhkWFJwWTNNZ1lXNWtJRk53WVdObElFRmtiV2x1YVhOMGNtRjAKK2FXOXVNUmt3RndZRFZRUUxFeEJVWlhOMElFVnVkbWx5YjI1dFpXNTBNUjR3SEFZRFZRUUxFeFZOUkRVdFVsTkIKK0xVNUJVMEV0VUdsc2IzUXRRMEV3SGhjTk9UWXdORE13TWpJd05UQXdXaGNOT1Rjd05ETXdNakl3TlRBd1dqQ0IKK2dERUxNQWtHQTFVRUJoTUNWVk14TmpBMEJnTlZCQW9UTFU1aGRHbHZibUZzSUVGbGNtOXVZWFYwYVdOeklHRnUKK1pDQlRjR0ZqWlNCQlpHMXBibWx6ZEhKaGRHbHZiakVaTUJjR0ExVUVDeE1RVkdWemRDQkZiblpwY205dWJXVnUKK2RERWVNQndHQTFVRUN4TVZUVVExTFZKVFFTMU9RVk5CTFZCcGJHOTBMVU5CTUZrd0NnWUVWUWdCQVFJQ0FnQUQKK1N3QXdTQUpCQUxtbVg1K0dxQXZjcldLMTNyZkRyTlg5VWZlQTdmK2lqeUJnZUZRallVb0RwRnFhcHc0bnpRQkwKK2JBWHVnOHBLa1J3YTJaaDhZT0RoWHNSV3UyRi9VY2tDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVFGQUFOQkFIOWEKK09CQStRQ3NqeFhnblNxSHgwNGdjVThTNDlEVlViMWYyWFZvTG5IbEliOFJuWDBrNU82bXBIVDVldGk5YkxraVcKK0dKTk1KNEwwQUovYWMrU21IWmM9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNhakNDQWRNQ0JER0EwUVV3RFFZSktvWklodmNOQVFFRUJRQXdmVEVMTUFrR0ExVUVCaE1DUTJFeER6QU4KK0JnTlZCQWNUQms1bGNHVmhiakVlTUJ3R0ExVUVDeE1WVG04Z1RHbGhZbWxzYVhSNUlFRmpZMlZ3ZEdWa01SOHcKK0hRWURWUVFLRXhaR2IzSWdSR1Z0YnlCUWRYSndiM05sY3lCUGJteDVNUnd3R2dZRFZRUURFeE5GYm5SeWRYTjAKK0lFUmxiVzhnVjJWaUlFTkJNQjRYRFRrMk1EUXlOakV6TXpVd01Wb1hEVEEyTURReU5qRXpNelV3TVZvd2ZURUwKK01Ba0dBMVVFQmhNQ1EyRXhEekFOQmdOVkJBY1RCazVsY0dWaGJqRWVNQndHQTFVRUN4TVZUbThnVEdsaFltbHMKK2FYUjVJRUZqWTJWd2RHVmtNUjh3SFFZRFZRUUtFeFpHYjNJZ1JHVnRieUJRZFhKd2IzTmxjeUJQYm14NU1Sd3cKK0dnWURWUVFERXhORmJuUnlkWE4wSUVSbGJXOGdWMlZpSUVOQk1JR2RNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R0wKK0FEQ0Jod0tCZ1FDYXJvUzdPMURBMGhtNEllZk5ZVTFjeC9ucU9tekVuazI5MWQxWHF6bkRlRjR3RWdha2JrQ2MKK3pUS3hLNzkxeU5wWEc1Um1uZ3FIN2N5Z0RSVEhaSjZtZkNSbjB3R0MrQUkwMEYydllUR3FQR1JRTDFOM2xaVDAKK1lES0ZDMFNRZU1NakZJWjFhZVFpZ3JvRlFuSG8wVkIzeldJTXBOa2thOFBZOWx4SFpBbVd3UUlCQXpBTkJna3EKK2hraUc5dzBCQVFRRkFBT0JnUUJBeDBVTVZBMXM1NGxNUXlYak1YNWtqOTlGSk41aXRiOGJLMVJrK2NlZ1BRUEYKK2NXTzlTRVd5RWpqQmpJa2pqekF3QmthRXN6RnNOR3hlbXh0WHZ3akltMXhFVU1UVmxQRVdUczJxbkR2QVVBOVcKK1lxaFdiaEgwdG9HVDM2MjM2UUFzcUNaNzZyYlRSVlNTWDJCSHlKd0pNRzJ0Q1J2N2tSSi8vTklneGozSDR3PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworaXNzdWVyPSAvQz1BVS9TVD1RdWVlbnNsYW5kL089Q3J5cHRTb2Z0IFB0eSBMdGQvQ049VGVzdCBQQ0EgKDEwMjQgYml0KQorc3ViamVjdD0vQz1BVS9TVD1RdWVlbnNsYW5kL089Q3J5cHRTb2Z0IFB0eSBMdGQvQ049VGVzdCBQQ0EgKDEwMjQgYml0KQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDSnpDQ0FaQUNBUUF3RFFZSktvWklodmNOQVFFRUJRQXdYREVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WCitCQWdUQ2xGMVpXVnVjMnhoYm1ReEdqQVlCZ05WQkFvVEVVTnllWEIwVTI5bWRDQlFkSGtnVEhSa01Sd3dHZ1lECitWUVFERXhOVVpYTjBJRkJEUVNBb01UQXlOQ0JpYVhRcE1CNFhEVGszTURZd09URXpOVGN6TjFvWERUQXhNRFl3CitPVEV6TlRjek4xb3dYREVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WQkFnVENsRjFaV1Z1YzJ4aGJtUXhHakFZCitCZ05WQkFvVEVVTnllWEIwVTI5bWRDQlFkSGtnVEhSa01Sd3dHZ1lEVlFRREV4TlVaWE4wSUZCRFFTQW9NVEF5CitOQ0JpYVhRcE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQ2RvV2svMytXY01sZmpJcmtnCis0MGtldG1uUWFFb2dRZTFMTGN1T0pWNnJLZlVTQXNQZ3dnc2FiSi93bjhUeEExeXkzZUtKYkZsM09pVVhNUnNwCisyMkpwODVQbWVtaUR6eVVJU3R3azcycWhwMWltYkFOWnZsbWxDRktpUXJqVXl1RGZ1NFRBQm1uK2trdDN2UjFZCitCRU9HdCtJRnllMVVCVlNBVFZkUkoyVVZod0lEQVFBQk1BMEdDU3FHU0liM0RRRUJCQVVBQTRHQkFCTkExdS9TCitDZy9MSlpXYjdHbGlpS0pzdnVoeGxFNEU1SnhRRjJ6TXViL0NTTmJGOTcvL3RZU3lqOTZzeGVGUXhaWGJjam05Cit4dDZtci94TkxBNHN6TlFNSjRQK0w3YjVlL2pDNURTcWx3UytDVVlKZ2FGcy9TUCtxSm9DU3UxYlIzSU05WFdPCitjUkJwRG1jQmJZTGtTeUI5MldVUnZzWjFMdGpFY24rY2RRVkkKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNYQUlCQUFLQmdRQ2RvV2svMytXY01sZmpJcmtnNDBrZXRtblFhRW9nUWUxTExjdU9KVjZyS2ZVU0FzUGcKK3dnc2FiSi93bjhUeEExeXkzZUtKYkZsM09pVVhNUnNwMjJKcDg1UG1lbWlEenlVSVN0d2s3MnFocDFpbWJBTloKK3ZsbWxDRktpUXJqVXl1RGZ1NFRBQm1uK2trdDN2UjFZQkVPR3QrSUZ5ZTFVQlZTQVRWZFJKMlVWaHdJREFRQUIKK0FvR0FiYTRmVHR1YXA1bDcvOFpzYkU3WjFPMzJLSlk0WmNPWnVrTE9MVVVoWHhYZHVUK0ZUZ0dXdWpjMC9yZ2MKK3o5cVlDTGxOWkhPb3VNWVRndFNmWXZ1TXVMWjExVkl0MEdZSCtuUmlvTFNoRTU5WXkrekNSeUMrZ1BpZ1Mxa3oKK3h2bzE0QXNPSVBZVjE0VGsvU3NIeXE2RTBlVGs3VnphSUUxOTdnaWlJTlVFUlBFQ1FRRFNLbXRQVGgvbFJLdzcKK0hTWlNNMEkxbUZXbi8xenFyQWJvbnRSUVk1dzk4UVdJT2U1cW16WXlGYlBYWVQzZDlCemxzTXloZ2lSTm9CYkQKK3l2b2hTSFhKQWtFQXdBSHg2ZXpBWmVXV3pENXlYRDM2bnlqcGtWQ3c3VGs3VFNtT2NlTEpNV3QxUWNyQ2ZxbFMKK3hBNWpqcFE2WjhzdVU1RGR0V0FyeU0yc0FpcjFXaXNZendKQWQ2WmN4NTZqdkFRM3hjUFhzRTZzY0JUVkZ6cmoKKzdGcVo2RStjY2xQemZMUStRUXN5T0JFN2JwSTZlL0ZKcHBZMjZYR1pYbzNZR3pWOElHWHJ0NDBvT1FKQUxFVEcKK2g4NkVGWG8zcUdPRmJtc0R5NHBkUDVuQkVSQ3U4WDF4VUNTZmludGlENGMyRElueGdTNW9HY2xuSmVNY2pUdkwKK1FqUW9KQ1gzVUpDaS9PVU8xUUpCQUtnY0RIV2pNdnQrbDFwakpCc1NFWjBIWDlBQUlJVngwUlFtYkZHUytGMlEKK2hodTVsNzdXbm5aT1E5dnZoVjV1N05QQ1VGOW5oVTNqaDYwcVdXTzhta2M9CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorc3ViamVjdD0vQz1VUy9PPVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuL09VPUNvbW1lcmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKK2lzc3Vlcj0gL0M9VVMvTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLi9PVT1Db21tZXJjaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Citub3RCZWZvcmU9OTQxMTA0MTg1ODM0Wgorbm90QWZ0ZXIgPTk5MTEwMzE4NTgzNFoKKy0tLS0tQkVHSU4gWDUwOSBDRVJUSUZJQ0FURS0tLS0tCisKK01JSUNJekNDQVpBQ0JRSkJBQUFXTUEwR0NTcUdTSWIzRFFFQkFnVUFNRnd4Q3pBSkJnTlZCQVlUQWxWVE1TQXcKK0hnWURWUVFLRXhkU1UwRWdSR0YwWVNCVFpXTjFjbWwwZVN3Z1NXNWpMakVyTUNrR0ExVUVDeE1pUTI5dGJXVnkKK1kybGhiQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1TkRFeE1EUXhPRFU0TXpSYUZ3MDUKK09URXhNRE14T0RVNE16UmFNRnd4Q3pBSkJnTlZCQVlUQWxWVE1TQXdIZ1lEVlFRS0V4ZFNVMEVnUkdGMFlTQlQKK1pXTjFjbWwwZVN3Z1NXNWpMakVyTUNrR0ExVUVDeE1pUTI5dGJXVnlZMmxoYkNCRFpYSjBhV1pwWTJGMGFXOXUKK0lFRjFkR2h2Y21sMGVUQ0JtekFOQmdrcWhraUc5dzBCQVFFRkFBT0JpUUF3Z1lVQ2ZnQ2srNEZpZTg0UUo5M28KKzk3NXNic1p3bWR1NDFRVURhU2lDbkhKL2xqK083S3dwa2orS0ZQaENkcjY5WFFPNWtOVFF2QWF5VVROZnhNSy8KK3RvdVBtYlppSW1EZDI5OGdnclRLb2k4dFVPMlVNdDdnVlkzVWFPTGdUTkxOQlJZdWxXWmNZVkk0SGxHb2dxSEUKKzd5WHBDdWFMSzQ0eFp0bjQyZjI5TzJuWjZ3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkFnVUFBMzRBZHJXMkVQNGoKKzkvZFpZa3V3WDV6QmFMeEp1N05KYnlGSFhTdWRWTVFBS0QrWXVmS0tnNXRnZit0UXg2c0ZFQzA5N1RnQ3dhVkkKKzB2NWxvTUM4NnFZakZtWnNHeVNwOCt4NU5SaFBKc2pqcjFCS3g2Y3hhOUI4R0oxUXY2a20raVlyUnB3VXFidGIKK01KaENLTFZMVTd0RENaSkF1cWlxV3FUR3RvdFhUY1U9CistLS0tLUVORCBYNTA5IENFUlRJRklDQVRFLS0tLS0KK3N1YmplY3Q9L0M9VVMvTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLi9PVT1TZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Citpc3N1ZXI9IC9DPVVTL089UlNBIERhdGEgU2VjdXJpdHksIEluYy4vT1U9U2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorbm90QmVmb3JlPTk0MTEwOTIzNTQxN1oKK25vdEFmdGVyID05OTEyMzEyMzU0MTdaCistLS0tLUJFR0lOIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorCitNSUlDS1RDQ0FaWUNCUUpCQUFBQk1BMEdDU3FHU0liM0RRRUJBZ1VBTUY4eEN6QUpCZ05WQkFZVEFsVlRNU0F3CitIZ1lEVlFRS0V4ZFNVMEVnUkdGMFlTQlRaV04xY21sMGVTd2dTVzVqTGpFdU1Dd0dBMVVFQ3hNbFUyVmpkWEpsCitJRk5sY25abGNpQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MDVOREV4TURreU16VTBNVGRhCitGdzA1T1RFeU16RXlNelUwTVRkYU1GOHhDekFKQmdOVkJBWVRBbFZUTVNBd0hnWURWUVFLRXhkU1UwRWdSR0YwCitZU0JUWldOMWNtbDBlU3dnU1c1akxqRXVNQ3dHQTFVRUN4TWxVMlZqZFhKbElGTmxjblpsY2lCRFpYSjBhV1pwCitZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0JtekFOQmdrcWhraUc5dzBCQVFFRkFBT0JpUUF3Z1lVQ2ZnQ1N6bnJCCityb00rV3FxSmcxZXNKUUYyREsydWppdzN6dXMxZUdSVUErV0VRRkhKdjQ4STRvcUNDTklXaGpkVjZiRWhBcTEyCithSUdhQmFKTHlVc2xaaUpXYklnSGovZUJXVzJFQjJWd0UzRjJQcHQzVE9OUWlWYVlTTGtkcHlrYUV5NUtFVm1jCitIaFhWU1ZRc2N6cHBnckdYT1p4dGNHZEk1ZDB0MXNnZWV3SURBUUFCTUEwR0NTcUdTSWIzRFFFQkFnVUFBMzRBCitpTkhSZVNITzRvdm8rTUY5TkZNL1lZUFp0Z3M0Rjdib3ZpR05qd0M0aTFOK1JHY2VJcjJYSitDY2hjeEs5b1U3CitzdUsra3RQbERlbXZYQTRNUnBYL29SeGVQdWcyV0hwenBncjRJaEZyd3drNGZpYTdjKzhBdlFLazh4UU5NRDloCitjSHNnL2pLam43UDBaMUxjdE82RWpKWTJJTjZCQ0lOeElZb1BucWs9CistLS0tLUVORCBYNTA5IENFUlRJRklDQVRFLS0tLS0KK3N1YmplY3Q9L0M9WkEvU1A9V2VzdGVybiBDYXBlL0w9Q2FwZSBUb3duL089VGhhd3RlIENvbnN1bHRpbmcgY2MKKwkvT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi9DTj1UaGF3dGUgU2VydmVyIENBCisJL0VtYWlsPXNlcnZlci1jZXJ0c0B0aGF3dGUuY29tCitpc3N1ZXI9IC9DPVpBL1NQPVdlc3Rlcm4gQ2FwZS9MPUNhcGUgVG93bi9PPVRoYXd0ZSBDb25zdWx0aW5nIGNjCisJL09VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vQ049VGhhd3RlIFNlcnZlciBDQQorCS9FbWFpbD1zZXJ2ZXItY2VydHNAdGhhd3RlLmNvbQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDK1RDQ0FtSUNBUUF3RFFZSktvWklodmNOQVFFRUJRQXdnY1F4Q3pBSkJnTlZCQVlUQWxwQk1SVXdFd1lECitWUVFJRXd4WFpYTjBaWEp1SUVOaGNHVXhFakFRQmdOVkJBY1RDVU5oY0dVZ1ZHOTNiakVkTUJzR0ExVUVDaE1VCitWR2hoZDNSbElFTnZibk4xYkhScGJtY2dZMk14S0RBbUJnTlZCQXNUSDBObGNuUnBabWxqWVhScGIyNGdVMlZ5CitkbWxqWlhNZ1JHbDJhWE5wYjI0eEdUQVhCZ05WQkFNVEVGUm9ZWGQwWlNCVFpYSjJaWElnUTBFeEpqQWtCZ2txCitoa2lHOXcwQkNRRVdGM05sY25abGNpMWpaWEowYzBCMGFHRjNkR1V1WTI5dE1CNFhEVGsyTURjeU56RTRNRGMxCitOMW9YRFRrNE1EY3lOekU0TURjMU4xb3dnY1F4Q3pBSkJnTlZCQVlUQWxwQk1SVXdFd1lEVlFRSUV3eFhaWE4wCitaWEp1SUVOaGNHVXhFakFRQmdOVkJBY1RDVU5oY0dVZ1ZHOTNiakVkTUJzR0ExVUVDaE1VVkdoaGQzUmxJRU52Citibk4xYkhScGJtY2dZMk14S0RBbUJnTlZCQXNUSDBObGNuUnBabWxqWVhScGIyNGdVMlZ5ZG1salpYTWdSR2wyCithWE5wYjI0eEdUQVhCZ05WQkFNVEVGUm9ZWGQwWlNCVFpYSjJaWElnUTBFeEpqQWtCZ2txaGtpRzl3MEJDUUVXCitGM05sY25abGNpMWpaWEowYzBCMGFHRjNkR1V1WTI5dE1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCCitpUUtCZ1FEVHBGQnV5UDlXYStiUFhiYnFER2gxUjZLcXd0cUVKZnlvOUVkUjJvVzFJSFNVaGg0UGRjbnBDR0gxCitCbTB3YmhVWkF1bFN3R0xiVFptZTRtb01SRGpOL3I3alpBbHd4ZjZ4YXltMkwwbklPOVFuQkNVUWx5L25rRzNBCitLRUtaMTB4RDNzUDFJVzFVbjEzRFdPSEE1Tmxic0xqY3RIdmZOanJDdFdZaUV0YUhEUUlEQVFBQk1BMEdDU3FHCitTSWIzRFFFQkJBVUFBNEdCQUlzdm43aWZYM1JVSXJ2WVh0cEk0RE9mQVJrVG9nd202bzdPd1ZkbDkzeUZoRGNYCis3aDV0MFhaMTFNVUFNemlLZGRlM3JtVHZ6VVlJVUNZb1k1YjAzMkl3R01UdmRpY2xLK1NUTjZOUDJtNW52RkFNCitxSlQ1Z0M1TytqL2pCdVpSUTRpMEFNWVFyNUY0bFQ4b0JKbmhnYWZ3NlBMOGFEWTJ2TUhHU1BsOSs3dWYKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlERFRDQ0FuWUNBUUF3RFFZSktvWklodmNOQVFFRUJRQXdnYzR4Q3pBSkJnTlZCQVlUQWxwQk1SVXdFd1lECitWUVFJRXd4WFpYTjBaWEp1SUVOaGNHVXhFakFRQmdOVkJBY1RDVU5oY0dVZ1ZHOTNiakVkTUJzR0ExVUVDaE1VCitWR2hoZDNSbElFTnZibk4xYkhScGJtY2dZMk14S0RBbUJnTlZCQXNUSDBObGNuUnBabWxqWVhScGIyNGdVMlZ5CitkbWxqWlhNZ1JHbDJhWE5wYjI0eElUQWZCZ05WQkFNVEdGUm9ZWGQwWlNCUWNtVnRhWFZ0SUZObGNuWmxjaUJECitRVEVvTUNZR0NTcUdTSWIzRFFFSkFSWVpjSEpsYldsMWJTMXpaWEoyWlhKQWRHaGhkM1JsTG1OdmJUQWVGdzA1CitOakEzTWpjeE9EQTNNVFJhRncwNU9EQTNNamN4T0RBM01UUmFNSUhPTVFzd0NRWURWUVFHRXdKYVFURVZNQk1HCitBMVVFQ0JNTVYyVnpkR1Z5YmlCRFlYQmxNUkl3RUFZRFZRUUhFd2xEWVhCbElGUnZkMjR4SFRBYkJnTlZCQW9UCitGRlJvWVhkMFpTQkRiMjV6ZFd4MGFXNW5JR05qTVNnd0pnWURWUVFMRXg5RFpYSjBhV1pwWTJGMGFXOXVJRk5sCitjblpwWTJWeklFUnBkbWx6YVc5dU1TRXdId1lEVlFRREV4aFVhR0YzZEdVZ1VISmxiV2wxYlNCVFpYSjJaWElnCitRMEV4S0RBbUJna3Foa2lHOXcwQkNRRVdHWEJ5WlcxcGRXMHRjMlZ5ZG1WeVFIUm9ZWGQwWlM1amIyMHdnWjh3CitEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFOSTJObXFMMThKYm50cUJRV0tQT081SkJGWFcwTzhjCitHNVVXUis4WVNEVTZVdlFyYWdhUE95L3FWdU92aG8yZUYvZWV0R1YxQWszdnl3bWlJVkhZbTlCbjBMb05rZ1lVCitjOVNUeTVjcUFKeGNUZ3k4K2hWUy9QSkVidG9SU200SW55OHQ0L21xT29aenRrWlRXTWlKQmIyREViaHpQNm9ICitqZlJDVGVkQW5SdzNBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQXV0RklnVFJaVlllcklaZkw5bHZSCit3OUVpZnZ2bzVLVFozaCtCaitWek5ueXc0UWMvSXlYa1BPdTZTSWlIOUxRM3NDbVdCZHhwZStxcjRsNzdyTGoyCitHWXVNdEVTRmZuMVhWQUx6a1lnQzdKY1B1VE9qTWZJaU1CeXQrdUZmOEFWOHgwSVcvUWt1ditoRVFjeU05dnhLCiszVlpkTGJDVkloTm9Fc3lzcnhDcHhjST0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KK1RpbXMgdGVzdCBHQ0kgQ0EKKworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlCOERDQ0Fab0NBUUF3RFFZSktvWklodmNOQVFFRUJRQXdnWUl4Q3pBSkJnTlZCQVlUQWtGVk1STXdFUVlECitWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdVpURWFNQmdHQTFVRUNoTVJRM0o1CitjSFJUYjJaMElGQjBlU0JNZEdReEZEQVNCZ05WQkFzVEMyUmxkbVZzYjNCdFpXNTBNUmt3RndZRFZRUURFeEJECitjbmx3ZEZOdlpuUWdSR1YySUVOQk1CNFhEVGszTURNeU1qRXpNelF3TkZvWERUazRNRE15TWpFek16UXdORm93CitnWUl4Q3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSUV3cFJkV1ZsYm5Oc1lXNWtNUkV3RHdZRFZRUUhFd2hDCitjbWx6WW1GdVpURWFNQmdHQTFVRUNoTVJRM0o1Y0hSVGIyWjBJRkIwZVNCTWRHUXhGREFTQmdOVkJBc1RDMlJsCitkbVZzYjNCdFpXNTBNUmt3RndZRFZRUURFeEJEY25sd2RGTnZablFnUkdWMklFTkJNRnd3RFFZSktvWklodmNOCitBUUVCQlFBRFN3QXdTQUpCQU9BT0Fxb2dHNVF3QW1MaHp5TzRDb1JueC93Vnk0TlpQNGR4Snk4M08xRW5MMHJ3CitPZHNhbUpLdlBPTEhnU1hvM2dEdTl1Vnl2Q2YvUUptWkFtQzVtbDhDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVFGCitBQU5CQURSUlMvR1ZkZDdyQXFSVzZTZG1nTEpkdU9VMnlxM2F2QnU5OWtScWJwOUEvZEx1NnI2alUrZVA0b09BCitUZmRiRlp0QUFEMkh4OWpVdFkzdGZkckpPYjg9IAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNWakNDQWdBQ0FRQXdEUVlKS29aSWh2Y05BUUVFQlFBd2diVXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWUQKK1ZRUUlFd3BSZFdWbGJuTnNZVzVrTVJFd0R3WURWUVFIRXdoQ2NtbHpZbUZ1WlRFYU1CZ0dBMVVFQ2hNUlEzSjUKK2NIUlRiMlowSUZCMGVTQk1kR1F4TERBcUJnTlZCQXNUSTFkUFVsUklURVZUVXlCRFJWSlVTVVpKUTBGVVNVOU8KK0lFRlZWRWhQVWtsVVNVVlRNVFF3TWdZRFZRUURFeXRhUlZKUElGWkJURlZGSUVOQklDMGdSRVZOVDA1VFZGSkIKK1ZFbFBUaUJRVlZKUVQxTkZVeUJQVGt4Wk1CNFhEVGszTURRd016RXpNakkxTkZvWERUazRNRFF3TXpFek1qSTEKK05Gb3dnYlV4Q3pBSkJnTlZCQVlUQWtGVk1STXdFUVlEVlFRSUV3cFJkV1ZsYm5Oc1lXNWtNUkV3RHdZRFZRUUgKK0V3aENjbWx6WW1GdVpURWFNQmdHQTFVRUNoTVJRM0o1Y0hSVGIyWjBJRkIwZVNCTWRHUXhMREFxQmdOVkJBc1QKK0kxZFBVbFJJVEVWVFV5QkRSVkpVU1VaSlEwRlVTVTlPSUVGVlZFaFBVa2xVU1VWVE1UUXdNZ1lEVlFRREV5dGEKK1JWSlBJRlpCVEZWRklFTkJJQzBnUkVWTlQwNVRWRkpCVkVsUFRpQlFWVkpRVDFORlV5QlBUa3haTUZ3d0RRWUoKK0tvWklodmNOQVFFQkJRQURTd0F3U0FKQkFPWjdUN3lxUC90eXNwY2tvM3lQWTF5MENtMkVtd052elc0UWdWWFIKK0ZqczNIbUo0eHRTcFhkbzZtd2NHZXpMM0FidC9hUVhheHY5UFU4eHQrSnIwT0ZVQ0F3RUFBVEFOQmdrcWhraUcKKzl3MEJBUVFGQUFOQkFPUXBZbUdneUNxQ3kxT2xqZ0poQ3FRT3U2MjdvVmxIeksxTCt0OXZCYU1mbjQwQVZVUjQKK1d6UVZXTzMxS1RnaTV2VEsxVSszaDQ2ZmdVV3FRMGgrNnJVPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUF3Z0tBREFnRUNBZ0VBTUEwR0NTcUdTSWIzRFFFQkJBVUFNR0l4RVRBUEJnTlZCQWNUQ0VsdWRHVnlibVYwCitNUmN3RlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRTBNRElHQTFVRUN4TXJWbVZ5YVZOcFoyNGdRMnhoCitjM01nTVNCRFFTQXRJRWx1WkdsMmFXUjFZV3dnVTNWaWMyTnlhV0psY2pBZUZ3MDVOakEwTURneE1ESXdNamRhCitGdzA1TnpBME1EZ3hNREl3TWpkYU1HSXhFVEFQQmdOVkJBY1RDRWx1ZEdWeWJtVjBNUmN3RlFZRFZRUUtFdzVXCitaWEpwVTJsbmJpd2dTVzVqTGpFME1ESUdBMVVFQ3hNclZtVnlhVk5wWjI0Z1EyeGhjM01nTVNCRFFTQXRJRWx1CitaR2wyYVdSMVlXd2dVM1ZpYzJOeWFXSmxjakNBTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUMyCitGS2JQVGRBRkRkaktJOUJ2cXJRcGttT09MUGh2bHRjdW5YWkxFYkUyalZmSncvMGN4cnIrSGdpNk04cVY2cjdqCitXODBHcUxkNUhVUXE3WFB5c1ZLRGFCQndaSkhYUG12NTkxMmRGRU9iYnBkRm1JRkgwUzNMM2J0eTEwdy9jYXJpCitRUEpVT2J3VzdzOTg3THJiUDJ3cXN4YXhoaEtkcnBNMDFialYwUGMrcVFJREFRQUJBQUFBQURBTkJna3Foa2lHCis5dzBCQVFRRkFBT0JnUUErMW5KcnlOdDhWQlJqUnIwN0FyREFWLzNqQUg3R2pEYzlqc3J4WlM2OG9zdDl2MDZDCitUdlROS0dMK0xJU05tRkxYbCtKWGhnR0IwSlo5ZnZ5WXpOZ0hRNDZIQlVuZzFINnZvYWxmSmdTMktkRW81MHdXCis4RUZaWU1Ea1QxazR1eW53SnFrVk4yUUpLLzJxNC9BL1ZDb3Y1aDZTbE04QWZmZzJXKzFUTHF2cWt3QUEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworIHN1YmplY3Q9L0w9SW50ZXJuZXQvTz1WZXJpU2lnbiwgSW5jLi9PVT1WZXJpU2lnbiBDbGFzcyAyIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyCisgaXNzdWVyPSAvTD1JbnRlcm5ldC9PPVZlcmlTaWduLCBJbmMuL09VPVZlcmlTaWduIENsYXNzIDIgQ0EgLSBJbmRpdmlkdWFsIFN1YnNjcmliZXIKKworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlFa3pDQ0EveWdBd0lCQWdJUkFORFRVcFNSTDNuVEZlTXJNYXlGU1BBd0RRWUpLb1pJaHZjTkFRRUNCUUF3CitZakVSTUE4R0ExVUVCeE1JU1c1MFpYSnVaWFF4RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVFF3CitNZ1lEVlFRTEV5dFdaWEpwVTJsbmJpQkRiR0Z6Y3lBeUlFTkJJQzBnU1c1a2FYWnBaSFZoYkNCVGRXSnpZM0pwCitZbVZ5TUI0WERUazJNRFl3TkRBd01EQXdNRm9YRFRrNE1EWXdOREl6TlRrMU9Wb3dZakVSTUE4R0ExVUVCeE1JCitTVzUwWlhKdVpYUXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1UUXdNZ1lEVlFRTEV5dFdaWEpwCitVMmxuYmlCRGJHRnpjeUF5SUVOQklDMGdTVzVrYVhacFpIVmhiQ0JUZFdKelkzSnBZbVZ5TUlHZk1BMEdDU3FHCitTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUM2QSsyY3pLR1JjWU1mbThnZG5rKzBkZTk5VEREenNxbzB2NW5iCitSc2JVbU1jZFJRN25zTWJSV2UwU0FiLzlRb0xUWi9jSjBpT0JxZHJrejdVcHFxS2FyVm9UU2RsU01WTTkydFdwCiszYkpuY1pIUUQxdDR4ZDZsUVZkSTEvVDZSKzVKMFQxdWtPZHNJOUptZitGMjhTNmczUjNMMVNGd2lIS2VaS1p2Cit6Kzc5M3dJREFRQUJvNElDUnpDQ0FrTXdnZ0lwQmdOVkhRTUJBZjhFZ2dJZE1JSUNHVENDQWhVd2dnSVJCZ3RnCitoa2dCaHZoRkFRY0JBVENDQWdBV2dnR3JWR2hwY3lCalpYSjBhV1pwWTJGMFpTQnBibU52Y25CdmNtRjBaWE1nCitZbmtnY21WbVpYSmxibU5sTENCaGJtUWdhWFJ6SUhWelpTQnBjeUJ6ZEhKcFkzUnNlU0J6ZFdKcVpXTjBJSFJ2CitMQ0IwYUdVZ1ZtVnlhVk5wWjI0Z1EyVnlkR2xtYVdOaGRHbHZiaUJRY21GamRHbGpaU0JUZEdGMFpXMWxiblFnCitLRU5RVXlrc0lHRjJZV2xzWVdKc1pTQmhkRG9nYUhSMGNITTZMeTkzZDNjdWRtVnlhWE5wWjI0dVkyOXRMME5RCitVeTB4TGpBN0lHSjVJRVV0YldGcGJDQmhkQ0JEVUZNdGNtVnhkV1Z6ZEhOQWRtVnlhWE5wWjI0dVkyOXRPeUJ2CitjaUJpZVNCdFlXbHNJR0YwSUZabGNtbFRhV2R1TENCSmJtTXVMQ0F5TlRreklFTnZZWE4wSUVGMlpTNHNJRTF2CitkVzUwWVdsdUlGWnBaWGNzSUVOQklEazBNRFF6SUZWVFFTQlVaV3d1SUNzeElDZzBNVFVwSURrMk1TMDRPRE13CitJRU52Y0hseWFXZG9kQ0FvWXlrZ01UazVOaUJXWlhKcFUybG5iaXdnU1c1akxpQWdRV3hzSUZKcFoyaDBjeUJTCitaWE5sY25abFpDNGdRMFZTVkVGSlRpQlhRVkpTUVU1VVNVVlRJRVJKVTBOTVFVbE5SVVFnWVc1a0lFeEpRVUpKCitURWxVV1NCTVNVMUpWRVZFTHFBT0JneGdoa2dCaHZoRkFRY0JBUUdoRGdZTVlJWklBWWI0UlFFSEFRRUNNQzh3CitMUllyYUhSMGNITTZMeTkzZDNjdWRtVnlhWE5wWjI0dVkyOXRMM0psY0c5emFYUnZjbmt2UTFCVExURXVNREFVCitCZ2xnaGtnQmh2aENBUUVCQWY4RUJBTUNBZ1F3RFFZSktvWklodmNOQVFFQ0JRQURnWUVBcFJKUmtOQnFMTGdzCis1M0lSL2QxOE9EZExPV01UWitRT094QnJxNDYwaUJFZFV3Z0Y4dm1QUlgxa3U3VWlEZU56YUxsdXJFNmVGcUhxCisyelB5SzVqNjB6ZlRMVkpNV0tjUVd3VEpMakh0WHJXOHB4aE50RmM2RmR2eTVaa0huQy85TklsNy90NFU2V3FCCitwNHkrcDdTZE1Ja0V3SVpmZHMwVmJuUXlYNU1SVUpZPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCisgc3ViamVjdD0vQz1VUy9PPVZlcmlTaWduLCBJbmMuL09VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyBpc3N1ZXI9IC9DPVVTL089VmVyaVNpZ24sIEluYy4vT1U9Q2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDTVRDQ0Fab0NCUUtoQUFBQk1BMEdDU3FHU0liM0RRRUJBZ1VBTUY4eEN6QUpCZ05WQkFZVEFsVlRNUmN3CitGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFM01EVUdBMVVFQ3hNdVEyeGhjM01nTXlCUWRXSnNhV01nCitVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MDVOakF4TWprd01EQXdNREJhCitGdzA1T1RFeU16RXlNelU1TlRsYU1GOHhDekFKQmdOVkJBWVRBbFZUTVJjd0ZRWURWUVFLRXc1V1pYSnBVMmxuCitiaXdnU1c1akxqRTNNRFVHQTFVRUN4TXVRMnhoYzNNZ015QlFkV0pzYVdNZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwCitZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUF5VnhaCitudkliaWdFVXRCRGZCRURiNDFldmFrVkFqNFFNQzlFejJka1J6KzRDV0I4bDl5cW9SQVdxN0FNZmVIK2VrN21hCitBS29qZmRhc2hhSmpSY2R5Sjh6MFRNWjFjZEk1NzA5QzhIWGZDcERHamlCdm1BLzRyQ05mY0NrMnBNbUc1N0dhCitJTXRUcFlYblBiNTltdjRrUlRQY2RoWHRENkp4WkV4bExvRm9SYWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUUlGCitBQU9CZ1FCMVptdyswYzJCMjdYNEx6WlJ0dmRDdk0xQ3I5d08raFZzK0dlVFZ6cnJ0cExvdGdIS2pMZU9RN1JKCitaZmsrN3IxMVJpN0ovQ1ZkcU1jdmk1dVBhTSswbkpjWXdFM3ZIOW12Z3JQbVpMaUVYSXFhQjFKRFlmdDBubHM2CitOdnhNc3Z3YVB4VXVwVnM4RzVEc2lDbmtXUmI1emdldDdPbmQydEl4aWsvVzJPOFhqUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisgc3ViamVjdD0vQz1VUy9PPVZlcmlTaWduLCBJbmMuL09VPUNsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKyBpc3N1ZXI9IC9DPVVTL089VmVyaVNpZ24sIEluYy4vT1U9Q2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDTVRDQ0Fab0NCUUttQUFBQk1BMEdDU3FHU0liM0RRRUJBZ1VBTUY4eEN6QUpCZ05WQkFZVEFsVlRNUmN3CitGUVlEVlFRS0V3NVdaWEpwVTJsbmJpd2dTVzVqTGpFM01EVUdBMVVFQ3hNdVEyeGhjM01nTkNCUWRXSnNhV01nCitVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MDVOakF4TWprd01EQXdNREJhCitGdzA1T1RFeU16RXlNelU1TlRsYU1GOHhDekFKQmdOVkJBWVRBbFZUTVJjd0ZRWURWUVFLRXc1V1pYSnBVMmxuCitiaXdnU1c1akxqRTNNRFVHQTFVRUN4TXVRMnhoYzNNZ05DQlFkV0pzYVdNZ1VISnBiV0Z5ZVNCRFpYSjBhV1pwCitZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3Z1lrQ2dZRUEwTEoxCis5bmpRcmxwUTlPbFFxWitNMSsrUmxIRG8waVNRZG9tRjF0K3M1Z0VYTW9Ed25aTkh2SnBsblIrWHJyL3BoblZqCitJSW05Z0ZpZEJBeWRxTUVrNlF2bE1YaTkvQzBNTjJxZWVJRHBSblg1N2FQN0Uzdkl3VXpTbysvMVBMQmlqMHBkCitPOTJWWjQ4VHVjRTgxcWNtbSt6RE8zclpUYnh0bStnVkFlUHdSNmtDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUUlGCitBQU9CZ1FCVDNkUHduQ1IrUUtyaS9BQWExOW9NL0RKaHVCVU5sdlA2Vnh0L00zeXY2WmlhWWNoNnM3Zi9zZHlaCitnOXlzRXZ4d3lSODRRdTFFOW9BdVcyc3phYXljMDF6blgxb1l4N0V0ZVFTV1FaR1pRYkU4RGJxRU9jWTdsL0FtCit5WTd1dmN4Q2xmOGV4d0kvVkF4NDlieXFZSHdDYWVqY3JPSUNkbUhFUGdQcTBvb2swUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3NlcnZlci5zcmwgYi9saWIvb3BlbnNzbC9hcHBzL3NlcnZlci5zcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwZjA1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvc2VydmVyLnNybApAQCAtMCwwICsxIEBACiswMQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9zZXJ2ZXIyLnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvc2VydmVyMi5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiNjY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvc2VydmVyMi5wZW0KQEAgLTAsMCArMSwzNzYgQEAKK2lzc3Vlcj0gL0M9QVUvU1Q9UXVlZW5zbGFuZC9PPUNyeXB0U29mdCBQdHkgTHRkL0NOPVRlc3QgQ0EgKDEwMjQgYml0KQorc3ViamVjdD0vQz1BVS9TVD1RdWVlbnNsYW5kL089Q3J5cHRTb2Z0IFB0eSBMdGQvQ049U2VydmVyIHRlc3QgY2VydCAoMTAyNCBiaXQpCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNMakNDQVpjQ0FRRXdEUVlKS29aSWh2Y05BUUVFQlFBd1d6RUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlYKK0JBZ1RDbEYxWldWdWMyeGhibVF4R2pBWUJnTlZCQW9URVVOeWVYQjBVMjltZENCUWRIa2dUSFJrTVJzd0dRWUQKK1ZRUURFeEpVWlhOMElFTkJJQ2d4TURJMElHSnBkQ2t3SGhjTk9UY3dOakE1TVRNMU56VTBXaGNOT1Rnd05qQTUKK01UTTFOelUwV2pCa01Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQk1LVVhWbFpXNXpiR0Z1WkRFYU1CZ0cKK0ExVUVDaE1SUTNKNWNIUlRiMlowSUZCMGVTQk1kR1F4SkRBaUJnTlZCQU1URzFObGNuWmxjaUIwWlhOMElHTmwKK2NuUWdLREV3TWpRZ1ltbDBLVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBc3hIMVBCUG0KK1JreHJSMTFlVjRiek5pNE45bjExQ0k4blYyOStBUmxUMStxRGUvbWpWVXZYbG1zcjF2L3ZmNzFHOUdncW9wU2EKKzZSWHJJQ0xWZGsvRllZWXpoUHZsMU0rT3JqYVhERk84QnpCQUYxTG56NmM3YVJadkdSSk5yUlNyMm5aRWtxRGYKK0pXOWRZN3IyVlpFcEQ1UWV1YVJZVW51RUNrcWVpZUI2NUdNQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFRRkFBT0IKK2dRQ1dzT3RhNkMwd2lWelh6OHdQbUpLeVRydXJNbGdVc3MyaVN1VzkzNjZpd29mWmRkc05nN0ZYbmlNemtJZjYKK2RwN2pubVdad0taOWNYc05VUzJvNE9MMDdxT2sySE95d0MwWXNOWlFzT0J1MUNCVFlZa0llZkRpS0ZMMXpRSGgKKzhsd3dOZDROUCtPRTNOelVOa0NmaDREbkZmZzlXSGtYVWxENVVweE5SSjRnSkE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQ1hnSUJBQUtCZ1FDekVmVThFK1pHVEd0SFhWNVhodk0yTGczMmZYVUlqeWRYYjM0QkdWUFg2b043K2FOVgorUzllV2F5dlcvKzkvdlViMGFDcWlsSnJwRmVzZ0l0VjJUOFZoaGpPRSsrWFV6NDZ1TnBjTVU3d0hNRUFYVXVmUAorcHp0cEZtOFpFazJ0Rkt2YWRrU1NvTjhsYjExanV2WlZrU2tQbEI2NXBGaFNlNFFLU3A2SjRIcmtZd0lEQVFBQgorQW9HQkFLeThqdmIwTHpieThxMTF5TkxmNys3OHdDVmRZaTd1Z01IY1lBMUpWRks4K3piMVdmU200NEZMUW8vMAorZFNDaEFqZ3ozNlRUZXhlTE9EUFl4bGVKbmRqVmNPTVZ6c0xKalNNOGRMcFhzVFM0RkNlTWJodzJzMnUreHFLWQorYmJQV2ZrK0hPVHlKamZua2NDNU5iZzQ0ZU9tcnVxMGdTbUJlVVhWTTVVbnRsVG54QWtFQTdUR0NBM2g3a3g1RQorQmw0emwycGMzZ1BBR3QrZHlmazVQbzltR0pVVVhoRjVwMnp1ZUdtWVdXNzRUbU9XQjFrenQ0UVJkWU16RmVQcQoremZETlhFYTFDd0pCQU1GRXJkWTB4cDBVSjEzV3dCYlVUazhydWpxUWRIdGp3MGtsaHBidUtranh1MmhOMHd3TQorNnAwRDlxeEY3SkhhZ2hxVlJJMGZBVy9FRTBPemRITVI5UWtDUVFETlIyNmRNRlhLc29QdSt2SXRsamovVUVHZgorUUc3Z0VSaVE0eXhhRkJQSGdkcEdvMGtUMzFlaDl4OWhRR0RreFRlMEdORy9ZU2dDUnZtOCtDM1RNY0tYQWtCRAorZGhHbjM2d2tVRkNkZE1TQU00TlNKMVZOOC9aMHk1SHpDbUk4ZE0zVndHdEdNVVFseEt4d09sMzBMRVF6ZFM1TQorMFNXb2pOWVhpVDJnT0JmQnd0YmhBa0VBaGFmbDVRRU9JZ1V6K1hhelMvSWxaOGdvTktkRFZmWWdLM21ISGp2dgorblk1RytBdUdlYmROa1hKcjRLU1d4RGNOK0MyaTQ3enVqNFFYQTE2TUFPYW5kQT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorc3ViamVjdD0vQz1VUy9PPUFUJlQgQmVsbCBMYWJvcmF0b3JpZXMvT1U9UHJvdG90eXBlIFJlc2VhcmNoIENBCitpc3N1ZXI9IC9DPVVTL089QVQmVCBCZWxsIExhYm9yYXRvcmllcy9PVT1Qcm90b3R5cGUgUmVzZWFyY2ggQ0EKK25vdEJlZm9yZT05NTA0MTMyMTA2NTZaCitub3RBZnRlciA9OTcwNDEyMjEwNjU2WgorLS0tLS1CRUdJTiBYNTA5IENFUlRJRklDQVRFLS0tLS0KKworTUlJQ0NEQ0NBWEVDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3VGpFTE1Ba0dBMVVFQmhNQ1ZWTXhIekFkQmdOVgorQkFvVUZrRlVKbFFnUW1Wc2JDQk1ZV0p2Y21GMGIzSnBaWE14SGpBY0JnTlZCQXNVRlZCeWIzUnZkSGx3WlNCUworWlhObFlYSmphQ0JEUVRBZUZ3MDVOVEEwTVRNeU1UQTJOVFphRncwNU56QTBNVEl5TVRBMk5UWmFNRTR4Q3pBSgorQmdOVkJBWVRBbFZUTVI4d0hRWURWUVFLRkJaQlZDWlVJRUpsYkd3Z1RHRmliM0poZEc5eWFXVnpNUjR3SEFZRAorVlFRTEZCVlFjbTkwYjNSNWNHVWdVbVZ6WldGeVkyZ2dRMEV3Z1p3d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1lvQQorTUlHR0FvR0FlYk9tZ3RTQ2wrd0NZWmM4NlVHWWVUTFk4Y2ptVzJQMEZOOFRvVC91MnBFQ0NvRmRybHljWDBPUgorM3d0MFpocEZYTFZOZURuSHdFRTl2ZU5VaWg3cENMMlpCRnFvSW9Ra0IxbFptWFJpVnRqR29uejhCTG0vcXJGTQorWUhiMGxtZS9PbCtzMTE4bXdLVnhubjZiU0FlSS9PWEtoTGFWZFlaV2srYUVheEVEa1ZrQ0FROHdEUVlKS29aSQoraHZjTkFRRUVCUUFEZ1lFQUFaTUcxNGxabVo4YmFoa2FIYVRWOWRRZjRwMkZaaVFURndIUDlaeUdzWFBDK0xUNQorZEc1aVRhUm15ak5JSmRQV29oWkRsOTdrQWNpNzlhQm5kdnVFdlJLT2pMSHMzV1JHQkl3RVJuQWNuWTlNejh1LworeklISzIzUGpZVnhHR2FaZDY2OU9Kd0QwQ1l5cUgyMkhIOW5GVUdhb0pkc3YzOUNoVzBOUmRMRTkreTg9CistLS0tLUVORCBYNTA5IENFUlRJRklDQVRFLS0tLS0KK2lzc3Vlcj0gL0M9QVUvU1Q9UXVlZW5zbGFuZC9PPUNyeXB0U29mdCBQdHkgTHRkL0NOPVRlc3QgUENBICgxMDI0IGJpdCkKK3N1YmplY3Q9L0M9QVUvU1Q9UXVlZW5zbGFuZC9PPUNyeXB0U29mdCBQdHkgTHRkL0NOPVRlc3QgQ0EgKDEwMjQgYml0KQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDSmpDQ0FZOENBUUF3RFFZSktvWklodmNOQVFFRUJRQXdYREVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WCitCQWdUQ2xGMVpXVnVjMnhoYm1ReEdqQVlCZ05WQkFvVEVVTnllWEIwVTI5bWRDQlFkSGtnVEhSa01Sd3dHZ1lECitWUVFERXhOVVpYTjBJRkJEUVNBb01UQXlOQ0JpYVhRcE1CNFhEVGszTURZd09URXpOVGMwTTFvWERUQXhNRFl3CitPVEV6TlRjME0xb3dXekVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WQkFnVENsRjFaV1Z1YzJ4aGJtUXhHakFZCitCZ05WQkFvVEVVTnllWEIwVTI5bWRDQlFkSGtnVEhSa01Sc3dHUVlEVlFRREV4SlVaWE4wSUVOQklDZ3hNREkwCitJR0pwZENrd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFLTzdvOHQxMTZWUDZjZ3liVHNaCitEQ1pocjk1bllsWnV5YTNhQ2kxSUtvenRxd1duamJtREZJcmlPcUdGUHJaUSttb01FVEM5RDU5aVJXL2RGWFN2CisxRjY1a2EvWFkyaExoOWV4Q0NvN1h1VWNEczUzUXAzYkkzQW1NcUhqZ3pFOG9PM2FqeUpBekprVFRPVWVjUVUyCittdy9nSTR0TU0wTHFXTVFTN2x1VHk0K3hBZ01CQUFFd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ1lFQU03YWNodjN2CitoTFFKY3YvNjVlR0VwQlhNNDBaRFZvRlFGRkpXYVk1cDg4M0hUcUxCMXg0RmR6c1hISDBRS0JUY0twV3dxeXU0CitZRG0zZmI4b0R1Z3c3MmJDemZ5WksvelZaUFIvaFZscUkvZnZVMTA5UW9jKzdvUHZJWFdreTcxSGZjSzZaQkNBCitxMzBLSXFHTS91b002MElOcTk3cWpEbUNKYXBhZ2NOQkdRcz0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNYUUlCQUFLQmdRQ2p1NlBMZGRlbFQrbklNbTA3R1F3bVlhL2VaMkpXYnNtdDJnb3RTQ3FNN2FzRnA0MjUKK2d4U0s0anFoaFQ2MlVQcHFEQkV3dlErZllrVnYzUlYwcjlSZXVaR3YxMk5vUzRmWHNRZ3FPMTdsSEE3T2QwS2QKKzJ5TndKaktoNDRNeFBLRHQybzhpUU15WkUwemxIbkVGTnBzUDRDT0xURE5DNmxqRUV1NWJrOHVQc1FJREFRQUIKK0FvR0FWWm1wRlpzRFpmcjBsMlM5dExMd3BqUldOT2xLQVRRa25vNnEyV2VzVDBlR0xRdWZUY2lZK2M4eXBmVTYKK2h5aW84cjVpVWwvVmhoZGpoQXRLeDFtUnBpb3RmdEhvL2VZZjhydHNybnByT25XRzBiV2pManRJb01iY3hHbjIKK0ozYk42TEptYkpNakRzMGVKM0tuVHU2NDZGM25EVXcyb0dBd21wektYQTFLQVAwQ1FRRFJ2UWh4azJEM1BlaHMKK0h2RzY2NXUycEI1aXBZUW5nRUZsWk83UkhKWnpKT1pFV1NMdXVNcWFGLzdwVGZBNWppQnZXcUNnSmVDUlJJbkwKKzIxcnU0ZGxQQWtFQXg5amo3QmdLbjVUWW5Nb0JTU2UwYWZqc1Y5b0FwVnBOMU5hY2IxWUR0Q3d5K3NjcDMrK3MKK25GeGx2OTh3eElsU2Rwd01VbitBVVdmamlXUjdUdS9HL3dKQkFKL0tqd1pJckZWeGV3UDB4MklMWXNUUllMenoKK01TNFBEc083RkIrSTBpN0RiQk9pZlhTMm9OU3BkM0kwQ05Nd3J4Rm5VSHp5bnBiT1N0VmZOM1pMNXcwQ1FRQ2EKK3B3RmFoeEJSaGtKS3N4aGpvRkpCWDl5bDc1Sm9ZNFd2bTVUYm85aWg2VUphUngza3Fma04xNEwyQktZY3NaZ2IKK0tZOXZtRE9ZeTZpTmZqRGVXVGZKQWtCa2ZQVWI4b1RKL25TUDV6TjZzcUd4U1k0a3JjNHhMeHBSbXhvSjhITDIKK1hmaHFYa1R6YlUxM1JYOUpKL05aOHZRTjlWbTJOaHhSR0pvY1FrbWNkVnRKCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBYNTA5IENFUlRJRklDQVRFLS0tLS0KK01JSUNZRENDQWlBQ0FnRW9NQWtHQlNzT0F3SU5CUUF3ZkRFTE1Ba0dBMVVFQmhNQ1ZWTXhOakEwQmdOVkJBb1QKK0xVNWhkR2x2Ym1Gc0lFRmxjbTl1WVhWMGFXTnpJR0Z1WkNCVGNHRmpaU0JCWkcxcGJtbHpkSEpoZEdsdmJqRVoKK01CY0dBMVVFQ3hNUVZHVnpkQ0JGYm5acGNtOXViV1Z1ZERFYU1CZ0dBMVVFQ3hNUlJGTlRMVTVCVTBFdFVHbHMKK2IzUXRRMEV3SGhjTk9UWXdNakkyTVRZek1qUTFXaGNOT1Rjd01qSTFNVFl6TWpRMVdqQjhNUXN3Q1FZRFZRUUcKK0V3SlZVekUyTURRR0ExVUVDaE10VG1GMGFXOXVZV3dnUVdWeWIyNWhkWFJwWTNNZ1lXNWtJRk53WVdObElFRmsKK2JXbHVhWE4wY21GMGFXOXVNUmt3RndZRFZRUUxFeEJVWlhOMElFVnVkbWx5YjI1dFpXNTBNUm93R0FZRFZRUUwKK0V4RkVVMU10VGtGVFFTMVFhV3h2ZEMxRFFUQ0I4akFKQmdVckRnTUNEQVVBQTRIa0FEQ0I0QUpCQU1BL3NzS2IKK2hQTlVHN1psQVNmVndFSlUyMU81T3lGL2l5QnpnSEkxTzhlT2hKR1VZTzhjYzh3RE1qUjUwOE1yOWNwNlVobC8KK1pCN0ZWNUdrTE5FblJIWUNRUURVRWFTZzQ1UDJxckR3aXhUUmhGaG1XejVOdmM0bFJGUS80MlhQY2NoaUpCTGIKK2JuM1FLNzRUMkl4WTF5WStrQ05xOFhySXFmNWZKSnpJSDBKL3hVUDNBaFVBc2cyd3NRSGZER1lrL0JPU3VsWDMKK2ZWZDBnZVVDUVFDekNGVVFBaCtaa0VtcDU4MDRjczZaV0JoclVBZm5yYThsSkl0WW85eFBjWGdkSWZMZmliY1gKK1I3MVVzeU83N01SRDdCMCtBZzJ0cTc5NElsZUNWY0VFTUFrR0JTc09Bd0lOQlFBREx3QXdMQUlVVWF5RGZyZVIKK1loMldlVTg2L3BITmRrVUMxSWdDRkVmeGUxZjBvTXB4SnlySjVYSXhUaTd2R2RvSworLS0tLS1FTkQgWDUwOSBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorCitNSUlDR1RDQ0FkZ0NBd0NxVERBSkJnVXJEZ01DRFFVQU1Id3hDekFKQmdOVkJBWVRBbFZUTVRZd05BWURWUVFLCitFeTFPWVhScGIyNWhiQ0JCWlhKdmJtRjFkR2xqY3lCaGJtUWdVM0JoWTJVZ1FXUnRhVzVwYzNSeVlYUnBiMjR4CitHVEFYQmdOVkJBc1RFRlJsYzNRZ1JXNTJhWEp2Ym0xbGJuUXhHakFZQmdOVkJBc1RFVVJUVXkxT1FWTkJMVkJwCitiRzkwTFVOQk1CNFhEVGsyTURVeE5ERTNNREUwTVZvWERUazNNRFV4TkRFM01ERTBNVm93TXpFTE1Ba0dBMVVFCitCaE1DUVZVeER6QU5CZ05WQkFvVEJrMXBibU52YlRFVE1CRUdBMVVFQXhNS1JYSnBZeUJaYjNWdVp6Q0I4akFKCitCZ1VyRGdNQ0RBVUFBNEhrQURDQjRBSkJBS2JmSHo2dkU2cFhYTVRwc3d0R1VlYzJ0dm5mTEpVc294RTlxczQrCitPYlpYN0xtTHZyYWdOUFVlaVRKeDdVT1daNURmQmo2YlhMYzhlWW5lMGxQMWczQUNRUURVRWFTZzQ1UDJxckR3CitpeFRSaEZobVd6NU52YzRsUkZRLzQyWFBjY2hpSkJMYmJuM1FLNzRUMkl4WTF5WStrQ05xOFhySXFmNWZKSnpJCitIMEoveFVQM0FoVUFzZzJ3c1FIZkRHWWsvQk9TdWxYM2ZWZDBnZVVDUVFDekNGVVFBaCtaa0VtcDU4MDRjczZaCitXQmhyVUFmbnJhOGxKSXRZbzl4UGNYZ2RJZkxmaWJjWFI3MVVzeU83N01SRDdCMCtBZzJ0cTc5NElsZUNWY0VFCitNQWtHQlNzT0F3SU5CUUFETUFBd0xRSVVXc3V1SlJFM1ZUNHVlV2tXTUFKTUphWmpqMUVDRlFDWVkwelg0YnpNCitMQzdvYnNySEQ4WEFIRytaUkc9PQorLS0tLS1FTkQgWDUwOSBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNUVENDQWJhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRUUZBREJNTVFzd0NRWURWUVFHRXdKSFFqRU0KK01Bb0dBMVVFQ2hNRFZVTk1NUmd3RmdZRFZRUUxFdzlKUTBVdFZFVk1JRkJ5YjJwbFkzUXhGVEFUQmdOVkJBTVQKK0RGUnlkWE4wUm1GamRHOXllVEFlRncwNU56QTBNakl4TkRNNU1UUmFGdzA1T0RBME1qSXhORE01TVRSYU1Fd3gKK0N6QUpCZ05WQkFZVEFrZENNUXd3Q2dZRFZRUUtFd05WUTB3eEdEQVdCZ05WQkFzVEQwbERSUzFVUlV3Z1VISnYKK2FtVmpkREVWTUJNR0ExVUVBeE1NVkhKMWMzUkdZV04wYjNKNU1JR2NNQW9HQkZVSUFRRUNBZ1FBQTRHTkFEQ0IKK2lRS0JnUUNFaWVSOE5jWGtVVzFmMEc2YUM2dTBpOHEvOThKcVM2UnhLNVltSElHS0NrdVRXQVVqekxmVWE0ZHQKK1U5aWdHQ2pUdXhhRHFsekVpbSt0LzAycG1pQlpUOUhhWCsrMzVNalFQVVdtc0NoY1lVNVd5ekdFclhpK3JRYXcKK3psd1M3M3pNOHFpUGovOTdsWFl5Y1doZ0wwVmFpRFNQeFJYRVVkV29hR3J1b200bU5RSURBUUFCbzBJd1FEQWQKK0JnTlZIUTRFRmdRVUhhbDFMWnI3b1ZnNXo2bFl6cmhUZ1pSQ21jVXdEZ1lEVlIwUEFRSC9CQVFEQWdIMk1BOEcKK0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRUJRQURnWUVBZmFnZ2ZsNkZab2lvZWNqdjBkcTgKKy9EWG8vdTExaU1adlhuMDhnalgvemwyYjR3dFBiU2hPU1k1RmhrU204R2V5U2FzeisvTndiL3V6Zm5JaG9rV2kKK2xmUFpIdGxDV3RYYkl5L1RONTFlSnlxMDRjZURDUURXdkxDMmVuVmc5S0IrR0ozNGI1YzVWYVBSenE4TUJ4c0EKK1M3RUx1WUd0bVlnWW05TlpPSXI3eVUwPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlCNmpDQ0FaUUNBZ0V0TUEwR0NTcUdTSWIzRFFFQkJBVUFNSUdBTVFzd0NRWURWUVFHRXdKVlV6RTJNRFFHCitBMVVFQ2hNdFRtRjBhVzl1WVd3Z1FXVnliMjVoZFhScFkzTWdZVzVrSUZOd1lXTmxJRUZrYldsdWFYTjBjbUYwCithVzl1TVJrd0Z3WURWUVFMRXhCVVpYTjBJRVZ1ZG1seWIyNXRaVzUwTVI0d0hBWURWUVFMRXhWTlJEVXRVbE5CCitMVTVCVTBFdFVHbHNiM1F0UTBFd0hoY05PVFl3TkRNd01qSXdOVEF3V2hjTk9UY3dORE13TWpJd05UQXdXakNCCitnREVMTUFrR0ExVUVCaE1DVlZNeE5qQTBCZ05WQkFvVExVNWhkR2x2Ym1Gc0lFRmxjbTl1WVhWMGFXTnpJR0Z1CitaQ0JUY0dGalpTQkJaRzFwYm1semRISmhkR2x2YmpFWk1CY0dBMVVFQ3hNUVZHVnpkQ0JGYm5acGNtOXViV1Z1CitkREVlTUJ3R0ExVUVDeE1WVFVRMUxWSlRRUzFPUVZOQkxWQnBiRzkwTFVOQk1Ga3dDZ1lFVlFnQkFRSUNBZ0FECitTd0F3U0FKQkFMbW1YNStHcUF2Y3JXSzEzcmZEck5YOVVmZUE3ZitpanlCZ2VGUWpZVW9EcEZxYXB3NG56UUJMCitiQVh1ZzhwS2tSd2EyWmg4WU9EaFhzUld1MkYvVWNrQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFRRkFBTkJBSDlhCitPQkErUUNzanhYZ25TcUh4MDRnY1U4UzQ5RFZVYjFmMlhWb0xuSGxJYjhSblgwazVPNm1wSFQ1ZXRpOWJMa2lXCitHSk5NSjRMMEFKL2FjK1NtSFpjPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDYWpDQ0FkTUNCREdBMFFVd0RRWUpLb1pJaHZjTkFRRUVCUUF3ZlRFTE1Ba0dBMVVFQmhNQ1EyRXhEekFOCitCZ05WQkFjVEJrNWxjR1ZoYmpFZU1Cd0dBMVVFQ3hNVlRtOGdUR2xoWW1sc2FYUjVJRUZqWTJWd2RHVmtNUjh3CitIUVlEVlFRS0V4WkdiM0lnUkdWdGJ5QlFkWEp3YjNObGN5QlBibXg1TVJ3d0dnWURWUVFERXhORmJuUnlkWE4wCitJRVJsYlc4Z1YyVmlJRU5CTUI0WERUazJNRFF5TmpFek16VXdNVm9YRFRBMk1EUXlOakV6TXpVd01Wb3dmVEVMCitNQWtHQTFVRUJoTUNRMkV4RHpBTkJnTlZCQWNUQms1bGNHVmhiakVlTUJ3R0ExVUVDeE1WVG04Z1RHbGhZbWxzCithWFI1SUVGalkyVndkR1ZrTVI4d0hRWURWUVFLRXhaR2IzSWdSR1Z0YnlCUWRYSndiM05sY3lCUGJteDVNUnd3CitHZ1lEVlFRREV4TkZiblJ5ZFhOMElFUmxiVzhnVjJWaUlFTkJNSUdkTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdMCitBRENCaHdLQmdRQ2Fyb1M3TzFEQTBobTRJZWZOWVUxY3gvbnFPbXpFbmsyOTFkMVhxem5EZUY0d0VnYWtia0NjCit6VEt4Szc5MXlOcFhHNVJtbmdxSDdjeWdEUlRIWko2bWZDUm4wd0dDK0FJMDBGMnZZVEdxUEdSUUwxTjNsWlQwCitZREtGQzBTUWVNTWpGSVoxYWVRaWdyb0ZRbkhvMFZCM3pXSU1wTmtrYThQWTlseEhaQW1Xd1FJQkF6QU5CZ2txCitoa2lHOXcwQkFRUUZBQU9CZ1FCQXgwVU1WQTFzNTRsTVF5WGpNWDVrajk5RkpONWl0YjhiSzFSaytjZWdQUVBGCitjV085U0VXeUVqakJqSWtqanpBd0JrYUVzekZzTkd4ZW14dFh2d2pJbTF4RVVNVFZsUEVXVHMycW5EdkFVQTlXCitZcWhXYmhIMHRvR1QzNjIzNlFBc3FDWjc2cmJUUlZTU1gyQkh5SndKTUcydENSdjdrUkovL05JZ3hqM0g0dz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKK2lzc3Vlcj0gL0M9QVUvU1Q9UXVlZW5zbGFuZC9PPUNyeXB0U29mdCBQdHkgTHRkL0NOPVRlc3QgUENBICgxMDI0IGJpdCkKK3N1YmplY3Q9L0M9QVUvU1Q9UXVlZW5zbGFuZC9PPUNyeXB0U29mdCBQdHkgTHRkL0NOPVRlc3QgUENBICgxMDI0IGJpdCkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ0p6Q0NBWkFDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3WERFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVgorQkFnVENsRjFaV1Z1YzJ4aGJtUXhHakFZQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNUnd3R2dZRAorVlFRREV4TlVaWE4wSUZCRFFTQW9NVEF5TkNCaWFYUXBNQjRYRFRrM01EWXdPVEV6TlRjek4xb1hEVEF4TURZdworT1RFek5UY3pOMW93WERFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbEYxWldWdWMyeGhibVF4R2pBWQorQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNUnd3R2dZRFZRUURFeE5VWlhOMElGQkRRU0FvTVRBeQorTkNCaWFYUXBNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUNkb1drLzMrV2NNbGZqSXJrZworNDBrZXRtblFhRW9nUWUxTExjdU9KVjZyS2ZVU0FzUGd3Z3NhYkovd244VHhBMXl5M2VLSmJGbDNPaVVYTVJzcAorMjJKcDg1UG1lbWlEenlVSVN0d2s3MnFocDFpbWJBTlp2bG1sQ0ZLaVFyalV5dURmdTRUQUJtbitra3QzdlIxWQorQkVPR3QrSUZ5ZTFVQlZTQVRWZFJKMlVWaHdJREFRQUJNQTBHQ1NxR1NJYjNEUUVCQkFVQUE0R0JBQk5BMXUvUworQ2cvTEpaV2I3R2xpaUtKc3Z1aHhsRTRFNUp4UUYyek11Yi9DU05iRjk3Ly90WVN5ajk2c3hlRlF4WlhiY2ptOQoreHQ2bXIveE5MQTRzek5RTUo0UCtMN2I1ZS9qQzVEU3Fsd1MrQ1VZSmdhRnMvU1ArcUpvQ1N1MWJSM0lNOVhXTworY1JCcERtY0JiWUxrU3lCOTJXVVJ2c1oxTHRqRWNuK2NkUVZJCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWEFJQkFBS0JnUUNkb1drLzMrV2NNbGZqSXJrZzQwa2V0bW5RYUVvZ1FlMUxMY3VPSlY2cktmVVNBc1BnCit3Z3NhYkovd244VHhBMXl5M2VLSmJGbDNPaVVYTVJzcDIySnA4NVBtZW1pRHp5VUlTdHdrNzJxaHAxaW1iQU5aCit2bG1sQ0ZLaVFyalV5dURmdTRUQUJtbitra3QzdlIxWUJFT0d0K0lGeWUxVUJWU0FUVmRSSjJVVmh3SURBUUFCCitBb0dBYmE0ZlR0dWFwNWw3Lzhac2JFN1oxTzMyS0pZNFpjT1p1a0xPTFVVaFh4WGR1VCtGVGdHV3VqYzAvcmdjCit6OXFZQ0xsTlpIT291TVlUZ3RTZll2dU11TFoxMVZJdDBHWUgrblJpb0xTaEU1OVl5K3pDUnlDK2dQaWdTMWt6Cit4dm8xNEFzT0lQWVYxNFRrL1NzSHlxNkUwZVRrN1Z6YUlFMTk3Z2lpSU5VRVJQRUNRUURTS210UFRoL2xSS3c3CitIU1pTTTBJMW1GV24vMXpxckFib250UlFZNXc5OFFXSU9lNXFtell5RmJQWFlUM2Q5Qnpsc015aGdpUk5vQmJECit5dm9oU0hYSkFrRUF3QUh4NmV6QVplV1d6RDV5WEQzNm55anBrVkN3N1RrN1RTbU9jZUxKTVd0MVFjckNmcWxTCit4QTVqanBRNlo4c3VVNURkdFdBcnlNMnNBaXIxV2lzWXp3SkFkNlpjeDU2anZBUTN4Y1BYc0U2c2NCVFZGenJqCis3RnFaNkUrY2NsUHpmTFErUVFzeU9CRTdicEk2ZS9GSnBwWTI2WEdaWG8zWUd6VjhJR1hydDQwb09RSkFMRVRHCitoODZFRlhvM3FHT0ZibXNEeTRwZFA1bkJFUkN1OFgxeFVDU2ZpbnRpRDRjMkRJbnhnUzVvR2NsbkplTWNqVHZMCitRalFvSkNYM1VKQ2kvT1VPMVFKQkFLZ2NESFdqTXZ0K2wxcGpKQnNTRVowSFg5QUFJSVZ4MFJRbWJGR1MrRjJRCitoaHU1bDc3V25uWk9ROXZ2aFY1dTdOUENVRjluaFUzamg2MHFXV084bWtjPQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KK3N1YmplY3Q9L0M9VVMvTz1SU0EgRGF0YSBTZWN1cml0eSwgSW5jLi9PVT1Db21tZXJjaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Citpc3N1ZXI9IC9DPVVTL089UlNBIERhdGEgU2VjdXJpdHksIEluYy4vT1U9Q29tbWVyY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQorbm90QmVmb3JlPTk0MTEwNDE4NTgzNFoKK25vdEFmdGVyID05OTExMDMxODU4MzRaCistLS0tLUJFR0lOIFg1MDkgQ0VSVElGSUNBVEUtLS0tLQorCitNSUlDSXpDQ0FaQUNCUUpCQUFBV01BMEdDU3FHU0liM0RRRUJBZ1VBTUZ3eEN6QUpCZ05WQkFZVEFsVlRNU0F3CitIZ1lEVlFRS0V4ZFNVMEVnUkdGMFlTQlRaV04xY21sMGVTd2dTVzVqTGpFck1Da0dBMVVFQ3hNaVEyOXRiV1Z5CitZMmxoYkNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwNU5ERXhNRFF4T0RVNE16UmFGdzA1CitPVEV4TURNeE9EVTRNelJhTUZ3eEN6QUpCZ05WQkFZVEFsVlRNU0F3SGdZRFZRUUtFeGRTVTBFZ1JHRjBZU0JUCitaV04xY21sMGVTd2dTVzVqTGpFck1Da0dBMVVFQ3hNaVEyOXRiV1Z5WTJsaGJDQkRaWEowYVdacFkyRjBhVzl1CitJRUYxZEdodmNtbDBlVENCbXpBTkJna3Foa2lHOXcwQkFRRUZBQU9CaVFBd2dZVUNmZ0NrKzRGaWU4NFFKOTNvCis5NzVzYnNad21kdTQxUVVEYVNpQ25ISi9saitPN0t3cGtqK0tGUGhDZHI2OVhRTzVrTlRRdkFheVVUTmZ4TUsvCit0b3VQbWJaaUltRGQyOThnZ3JUS29pOHRVTzJVTXQ3Z1ZZM1VhT0xnVE5MTkJSWXVsV1pjWVZJNEhsR29ncUhFCis3eVhwQ3VhTEs0NHhadG40MmYyOU8yblo2d0lEQVFBQk1BMEdDU3FHU0liM0RRRUJBZ1VBQTM0QWRyVzJFUDRqCis5L2RaWWt1d1g1ekJhTHhKdTdOSmJ5RkhYU3VkVk1RQUtEK1l1ZktLZzV0Z2YrdFF4NnNGRUMwOTdUZ0N3YVZJCiswdjVsb01DODZxWWpGbVpzR3lTcDgreDVOUmhQSnNqanIxQkt4NmN4YTlCOEdKMVF2NmttK2lZclJwd1VxYnRiCitNSmhDS0xWTFU3dERDWkpBdXFpcVdxVEd0b3RYVGNVPQorLS0tLS1FTkQgWDUwOSBDRVJUSUZJQ0FURS0tLS0tCitzdWJqZWN0PS9DPVVTL089UlNBIERhdGEgU2VjdXJpdHksIEluYy4vT1U9U2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQoraXNzdWVyPSAvQz1VUy9PPVJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuL09VPVNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKK25vdEJlZm9yZT05NDExMDkyMzU0MTdaCitub3RBZnRlciA9OTkxMjMxMjM1NDE3WgorLS0tLS1CRUdJTiBYNTA5IENFUlRJRklDQVRFLS0tLS0KKworTUlJQ0tUQ0NBWllDQlFKQkFBQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQU1GOHhDekFKQmdOVkJBWVRBbFZUTVNBdworSGdZRFZRUUtFeGRTVTBFZ1JHRjBZU0JUWldOMWNtbDBlU3dnU1c1akxqRXVNQ3dHQTFVRUN4TWxVMlZqZFhKbAorSUZObGNuWmxjaUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1TkRFeE1Ea3lNelUwTVRkYQorRncwNU9URXlNekV5TXpVME1UZGFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1TQXdIZ1lEVlFRS0V4ZFNVMEVnUkdGMAorWVNCVFpXTjFjbWwwZVN3Z1NXNWpMakV1TUN3R0ExVUVDeE1sVTJWamRYSmxJRk5sY25abGNpQkRaWEowYVdacAorWTJGMGFXOXVJRUYxZEdodmNtbDBlVENCbXpBTkJna3Foa2lHOXcwQkFRRUZBQU9CaVFBd2dZVUNmZ0NTem5yQgorcm9NK1dxcUpnMWVzSlFGMkRLMnVqaXczenVzMWVHUlVBK1dFUUZISnY0OEk0b3FDQ05JV2hqZFY2YkVoQXExMgorYUlHYUJhSkx5VXNsWmlKV2JJZ0hqL2VCV1cyRUIyVndFM0YyUHB0M1RPTlFpVmFZU0xrZHB5a2FFeTVLRVZtYworSGhYVlNWUXNjenBwZ3JHWE9aeHRjR2RJNWQwdDFzZ2Vld0lEQVFBQk1BMEdDU3FHU0liM0RRRUJBZ1VBQTM0QQoraU5IUmVTSE80b3ZvK01GOU5GTS9ZWVBadGdzNEY3Ym92aUdOandDNGkxTitSR2NlSXIyWEorQ2NoY3hLOW9VNworc3VLK2t0UGxEZW12WEE0TVJwWC9vUnhlUHVnMldIcHpwZ3I0SWhGcnd3azRmaWE3Yys4QXZRS2s4eFFOTUQ5aAorY0hzZy9qS2puN1AwWjFMY3RPNkVqSlkySU42QkNJTnhJWW9QbnFrPQorLS0tLS1FTkQgWDUwOSBDRVJUSUZJQ0FURS0tLS0tCitzdWJqZWN0PS9DPVpBL1NQPVdlc3Rlcm4gQ2FwZS9MPUNhcGUgVG93bi9PPVRoYXd0ZSBDb25zdWx0aW5nIGNjCisJL09VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vQ049VGhhd3RlIFNlcnZlciBDQQorCS9FbWFpbD1zZXJ2ZXItY2VydHNAdGhhd3RlLmNvbQoraXNzdWVyPSAvQz1aQS9TUD1XZXN0ZXJuIENhcGUvTD1DYXBlIFRvd24vTz1UaGF3dGUgQ29uc3VsdGluZyBjYworCS9PVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uL0NOPVRoYXd0ZSBTZXJ2ZXIgQ0EKKwkvRW1haWw9c2VydmVyLWNlcnRzQHRoYXd0ZS5jb20KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQytUQ0NBbUlDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3Z2NReEN6QUpCZ05WQkFZVEFscEJNUlV3RXdZRAorVlFRSUV3eFhaWE4wWlhKdUlFTmhjR1V4RWpBUUJnTlZCQWNUQ1VOaGNHVWdWRzkzYmpFZE1Cc0dBMVVFQ2hNVQorVkdoaGQzUmxJRU52Ym5OMWJIUnBibWNnWTJNeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnBiMjRnVTJWeQorZG1salpYTWdSR2wyYVhOcGIyNHhHVEFYQmdOVkJBTVRFRlJvWVhkMFpTQlRaWEoyWlhJZ1EwRXhKakFrQmdrcQoraGtpRzl3MEJDUUVXRjNObGNuWmxjaTFqWlhKMGMwQjBhR0YzZEdVdVkyOXRNQjRYRFRrMk1EY3lOekU0TURjMQorTjFvWERUazRNRGN5TnpFNE1EYzFOMW93Z2NReEN6QUpCZ05WQkFZVEFscEJNUlV3RXdZRFZRUUlFd3hYWlhOMAorWlhKdUlFTmhjR1V4RWpBUUJnTlZCQWNUQ1VOaGNHVWdWRzkzYmpFZE1Cc0dBMVVFQ2hNVVZHaGhkM1JsSUVOdgorYm5OMWJIUnBibWNnWTJNeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnBiMjRnVTJWeWRtbGpaWE1nUkdsMgorYVhOcGIyNHhHVEFYQmdOVkJBTVRFRlJvWVhkMFpTQlRaWEoyWlhJZ1EwRXhKakFrQmdrcWhraUc5dzBCQ1FFVworRjNObGNuWmxjaTFqWlhKMGMwQjBhR0YzZEdVdVkyOXRNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQgoraVFLQmdRRFRwRkJ1eVA5V2ErYlBYYmJxREdoMVI2S3F3dHFFSmZ5bzlFZFIyb1cxSUhTVWhoNFBkY25wQ0dIMQorQm0wd2JoVVpBdWxTd0dMYlRabWU0bW9NUkRqTi9yN2paQWx3eGY2eGF5bTJMMG5JTzlRbkJDVVFseS9ua0czQQorS0VLWjEweEQzc1AxSVcxVW4xM0RXT0hBNU5sYnNMamN0SHZmTmpyQ3RXWWlFdGFIRFFJREFRQUJNQTBHQ1NxRworU0liM0RRRUJCQVVBQTRHQkFJc3ZuN2lmWDNSVUlydllYdHBJNERPZkFSa1RvZ3dtNm83T3dWZGw5M3lGaERjWAorN2g1dDBYWjExTVVBTXppS2RkZTNybVR2elVZSVVDWW9ZNWIwMzJJd0dNVHZkaWNsSytTVE42TlAybTVudkZBTQorcUpUNWdDNU8rai9qQnVaUlE0aTBBTVlRcjVGNGxUOG9CSm5oZ2FmdzZQTDhhRFkydk1IR1NQbDkrN3VmCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRERUQ0NBbllDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3Z2M0eEN6QUpCZ05WQkFZVEFscEJNUlV3RXdZRAorVlFRSUV3eFhaWE4wWlhKdUlFTmhjR1V4RWpBUUJnTlZCQWNUQ1VOaGNHVWdWRzkzYmpFZE1Cc0dBMVVFQ2hNVQorVkdoaGQzUmxJRU52Ym5OMWJIUnBibWNnWTJNeEtEQW1CZ05WQkFzVEgwTmxjblJwWm1sallYUnBiMjRnVTJWeQorZG1salpYTWdSR2wyYVhOcGIyNHhJVEFmQmdOVkJBTVRHRlJvWVhkMFpTQlFjbVZ0YVhWdElGTmxjblpsY2lCRAorUVRFb01DWUdDU3FHU0liM0RRRUpBUllaY0hKbGJXbDFiUzF6WlhKMlpYSkFkR2hoZDNSbExtTnZiVEFlRncwNQorTmpBM01qY3hPREEzTVRSYUZ3MDVPREEzTWpjeE9EQTNNVFJhTUlIT01Rc3dDUVlEVlFRR0V3SmFRVEVWTUJNRworQTFVRUNCTU1WMlZ6ZEdWeWJpQkRZWEJsTVJJd0VBWURWUVFIRXdsRFlYQmxJRlJ2ZDI0eEhUQWJCZ05WQkFvVAorRkZSb1lYZDBaU0JEYjI1emRXeDBhVzVuSUdOak1TZ3dKZ1lEVlFRTEV4OURaWEowYVdacFkyRjBhVzl1SUZObAorY25acFkyVnpJRVJwZG1semFXOXVNU0V3SHdZRFZRUURFeGhVYUdGM2RHVWdVSEpsYldsMWJTQlRaWEoyWlhJZworUTBFeEtEQW1CZ2txaGtpRzl3MEJDUUVXR1hCeVpXMXBkVzB0YzJWeWRtVnlRSFJvWVhkMFpTNWpiMjB3Z1o4dworRFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTkkyTm1xTDE4SmJudHFCUVdLUE9PNUpCRlhXME84YworRzVVV1IrOFlTRFU2VXZRcmFnYVBPeS9xVnVPdmhvMmVGL2VldEdWMUFrM3Z5d21pSVZIWW05Qm4wTG9Oa2dZVQorYzlTVHk1Y3FBSnhjVGd5OCtoVlMvUEpFYnRvUlNtNElueTh0NC9tcU9vWnp0a1pUV01pSkJiMkRFYmh6UDZvSAoramZSQ1RlZEFuUnczQWdNQkFBRXdEUVlKS29aSWh2Y05BUUVFQlFBRGdZRUF1dEZJZ1RSWlZZZXJJWmZMOWx2UgordzlFaWZ2dm81S1RaM2grQmorVnpObnl3NFFjL0l5WGtQT3U2U0lpSDlMUTNzQ21XQmR4cGUrcXI0bDc3ckxqMgorR1l1TXRFU0ZmbjFYVkFMemtZZ0M3SmNQdVRPak1mSWlNQnl0K3VGZjhBVjh4MElXL1FrdXYraEVRY3lNOXZ4SworM1ZaZExiQ1ZJaE5vRXN5c3J4Q3B4Y0k9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCitUaW1zIHRlc3QgR0NJIENBCisKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQjhEQ0NBWm9DQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3Z1lJeEN6QUpCZ05WQkFZVEFrRlZNUk13RVFZRAorVlFRSUV3cFJkV1ZsYm5Oc1lXNWtNUkV3RHdZRFZRUUhFd2hDY21selltRnVaVEVhTUJnR0ExVUVDaE1SUTNKNQorY0hSVGIyWjBJRkIwZVNCTWRHUXhGREFTQmdOVkJBc1RDMlJsZG1Wc2IzQnRaVzUwTVJrd0Z3WURWUVFERXhCRAorY25sd2RGTnZablFnUkdWMklFTkJNQjRYRFRrM01ETXlNakV6TXpRd05Gb1hEVGs0TURNeU1qRXpNelF3TkZvdworZ1lJeEN6QUpCZ05WQkFZVEFrRlZNUk13RVFZRFZRUUlFd3BSZFdWbGJuTnNZVzVrTVJFd0R3WURWUVFIRXdoQworY21selltRnVaVEVhTUJnR0ExVUVDaE1SUTNKNWNIUlRiMlowSUZCMGVTQk1kR1F4RkRBU0JnTlZCQXNUQzJSbAorZG1Wc2IzQnRaVzUwTVJrd0Z3WURWUVFERXhCRGNubHdkRk52Wm5RZ1JHVjJJRU5CTUZ3d0RRWUpLb1pJaHZjTgorQVFFQkJRQURTd0F3U0FKQkFPQU9BcW9nRzVRd0FtTGh6eU80Q29Sbngvd1Z5NE5aUDRkeEp5ODNPMUVuTDBydworT2RzYW1KS3ZQT0xIZ1NYbzNnRHU5dVZ5dkNmL1FKbVpBbUM1bWw4Q0F3RUFBVEFOQmdrcWhraUc5dzBCQVFRRgorQUFOQkFEUlJTL0dWZGQ3ckFxUlc2U2RtZ0xKZHVPVTJ5cTNhdkJ1OTlrUnFicDlBL2RMdTZyNmpVK2VQNG9PQQorVGZkYkZadEFBRDJIeDlqVXRZM3RmZHJKT2I4PSAKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDVmpDQ0FnQUNBUUF3RFFZSktvWklodmNOQVFFRUJRQXdnYlV4Q3pBSkJnTlZCQVlUQWtGVk1STXdFUVlECitWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdVpURWFNQmdHQTFVRUNoTVJRM0o1CitjSFJUYjJaMElGQjBlU0JNZEdReExEQXFCZ05WQkFzVEkxZFBVbFJJVEVWVFV5QkRSVkpVU1VaSlEwRlVTVTlPCitJRUZWVkVoUFVrbFVTVVZUTVRRd01nWURWUVFERXl0YVJWSlBJRlpCVEZWRklFTkJJQzBnUkVWTlQwNVRWRkpCCitWRWxQVGlCUVZWSlFUMU5GVXlCUFRreFpNQjRYRFRrM01EUXdNekV6TWpJMU5Gb1hEVGs0TURRd016RXpNakkxCitORm93Z2JVeEN6QUpCZ05WQkFZVEFrRlZNUk13RVFZRFZRUUlFd3BSZFdWbGJuTnNZVzVrTVJFd0R3WURWUVFICitFd2hDY21selltRnVaVEVhTUJnR0ExVUVDaE1SUTNKNWNIUlRiMlowSUZCMGVTQk1kR1F4TERBcUJnTlZCQXNUCitJMWRQVWxSSVRFVlRVeUJEUlZKVVNVWkpRMEZVU1U5T0lFRlZWRWhQVWtsVVNVVlRNVFF3TWdZRFZRUURFeXRhCitSVkpQSUZaQlRGVkZJRU5CSUMwZ1JFVk5UMDVUVkZKQlZFbFBUaUJRVlZKUVQxTkZVeUJQVGt4Wk1Gd3dEUVlKCitLb1pJaHZjTkFRRUJCUUFEU3dBd1NBSkJBT1o3VDd5cVAvdHlzcGNrbzN5UFkxeTBDbTJFbXdOdnpXNFFnVlhSCitGanMzSG1KNHh0U3BYZG82bXdjR2V6TDNBYnQvYVFYYXh2OVBVOHh0K0pyME9GVUNBd0VBQVRBTkJna3Foa2lHCis5dzBCQVFRRkFBTkJBT1FwWW1HZ3lDcUN5MU9samdKaENxUU91NjI3b1ZsSHpLMUwrdDl2QmFNZm40MEFWVVI0CitXelFWV08zMUtUZ2k1dlRLMVUrM2g0NmZnVVdxUTBoKzZyVT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlBd2dLQURBZ0VDQWdFQU1BMEdDU3FHU0liM0RRRUJCQVVBTUdJeEVUQVBCZ05WQkFjVENFbHVkR1Z5Ym1WMAorTVJjd0ZRWURWUVFLRXc1V1pYSnBVMmxuYml3Z1NXNWpMakUwTURJR0ExVUVDeE1yVm1WeWFWTnBaMjRnUTJ4aAorYzNNZ01TQkRRU0F0SUVsdVpHbDJhV1IxWVd3Z1UzVmljMk55YVdKbGNqQWVGdzA1TmpBME1EZ3hNREl3TWpkYQorRncwNU56QTBNRGd4TURJd01qZGFNR0l4RVRBUEJnTlZCQWNUQ0VsdWRHVnlibVYwTVJjd0ZRWURWUVFLRXc1VworWlhKcFUybG5iaXdnU1c1akxqRTBNRElHQTFVRUN4TXJWbVZ5YVZOcFoyNGdRMnhoYzNNZ01TQkRRU0F0SUVsdQorWkdsMmFXUjFZV3dnVTNWaWMyTnlhV0psY2pDQU1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDMgorRktiUFRkQUZEZGpLSTlCdnFyUXBrbU9PTFBodmx0Y3VuWFpMRWJFMmpWZkp3LzBjeHJyK0hnaTZNOHFWNnI3agorVzgwR3FMZDVIVVFxN1hQeXNWS0RhQkJ3WkpIWFBtdjU5MTJkRkVPYmJwZEZtSUZIMFMzTDNidHkxMHcvY2FyaQorUVBKVU9id1c3czk4N0xyYlAyd3FzeGF4aGhLZHJwTTAxYmpWMFBjK3FRSURBUUFCQUFBQUFEQU5CZ2txaGtpRworOXcwQkFRUUZBQU9CZ1FBKzFuSnJ5TnQ4VkJSalJyMDdBckRBVi8zakFIN0dqRGM5anNyeFpTNjhvc3Q5djA2QworVHZUTktHTCtMSVNObUZMWGwrSlhoZ0dCMEpaOWZ2eVl6TmdIUTQ2SEJVbmcxSDZ2b2FsZkpnUzJLZEVvNTB3VworOEVGWllNRGtUMWs0dXlud0pxa1ZOMlFKSy8ycTQvQS9WQ292NWg2U2xNOEFmZmcyVysxVExxdnFrd0FBCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKKyBzdWJqZWN0PS9MPUludGVybmV0L089VmVyaVNpZ24sIEluYy4vT1U9VmVyaVNpZ24gQ2xhc3MgMiBDQSAtIEluZGl2aWR1YWwgU3Vic2NyaWJlcgorIGlzc3Vlcj0gL0w9SW50ZXJuZXQvTz1WZXJpU2lnbiwgSW5jLi9PVT1WZXJpU2lnbiBDbGFzcyAyIENBIC0gSW5kaXZpZHVhbCBTdWJzY3JpYmVyCisKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRWt6Q0NBL3lnQXdJQkFnSVJBTkRUVXBTUkwzblRGZU1yTWF5RlNQQXdEUVlKS29aSWh2Y05BUUVDQlFBdworWWpFUk1BOEdBMVVFQnhNSVNXNTBaWEp1WlhReEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVRRdworTWdZRFZRUUxFeXRXWlhKcFUybG5iaUJEYkdGemN5QXlJRU5CSUMwZ1NXNWthWFpwWkhWaGJDQlRkV0p6WTNKcAorWW1WeU1CNFhEVGsyTURZd05EQXdNREF3TUZvWERUazRNRFl3TkRJek5UazFPVm93WWpFUk1BOEdBMVVFQnhNSQorU1c1MFpYSnVaWFF4RnpBVkJnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVFF3TWdZRFZRUUxFeXRXWlhKcAorVTJsbmJpQkRiR0Z6Y3lBeUlFTkJJQzBnU1c1a2FYWnBaSFZoYkNCVGRXSnpZM0pwWW1WeU1JR2ZNQTBHQ1NxRworU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDNkErMmN6S0dSY1lNZm04Z2RuayswZGU5OVRERHpzcW8wdjVuYgorUnNiVW1NY2RSUTduc01iUldlMFNBYi85UW9MVFovY0owaU9CcWRya3o3VXBxcUthclZvVFNkbFNNVk05MnRXcAorM2JKbmNaSFFEMXQ0eGQ2bFFWZEkxL1Q2Uis1SjBUMXVrT2RzSTlKbWYrRjI4UzZnM1IzTDFTRndpSEtlWktadgoreis3OTN3SURBUUFCbzRJQ1J6Q0NBa013Z2dJcEJnTlZIUU1CQWY4RWdnSWRNSUlDR1RDQ0FoVXdnZ0lSQmd0ZworaGtnQmh2aEZBUWNCQVRDQ0FnQVdnZ0dyVkdocGN5QmpaWEowYVdacFkyRjBaU0JwYm1OdmNuQnZjbUYwWlhNZworWW5rZ2NtVm1aWEpsYm1ObExDQmhibVFnYVhSeklIVnpaU0JwY3lCemRISnBZM1JzZVNCemRXSnFaV04wSUhSdgorTENCMGFHVWdWbVZ5YVZOcFoyNGdRMlZ5ZEdsbWFXTmhkR2x2YmlCUWNtRmpkR2xqWlNCVGRHRjBaVzFsYm5RZworS0VOUVV5a3NJR0YyWVdsc1lXSnNaU0JoZERvZ2FIUjBjSE02THk5M2QzY3VkbVZ5YVhOcFoyNHVZMjl0TDBOUQorVXkweExqQTdJR0o1SUVVdGJXRnBiQ0JoZENCRFVGTXRjbVZ4ZFdWemRITkFkbVZ5YVhOcFoyNHVZMjl0T3lCdgorY2lCaWVTQnRZV2xzSUdGMElGWmxjbWxUYVdkdUxDQkpibU11TENBeU5Ua3pJRU52WVhOMElFRjJaUzRzSUUxdgorZFc1MFlXbHVJRlpwWlhjc0lFTkJJRGswTURReklGVlRRU0JVWld3dUlDc3hJQ2cwTVRVcElEazJNUzA0T0RNdworSUVOdmNIbHlhV2RvZENBb1l5a2dNVGs1TmlCV1pYSnBVMmxuYml3Z1NXNWpMaUFnUVd4c0lGSnBaMmgwY3lCUworWlhObGNuWmxaQzRnUTBWU1ZFRkpUaUJYUVZKU1FVNVVTVVZUSUVSSlUwTk1RVWxOUlVRZ1lXNWtJRXhKUVVKSgorVEVsVVdTQk1TVTFKVkVWRUxxQU9CZ3hnaGtnQmh2aEZBUWNCQVFHaERnWU1ZSVpJQVliNFJRRUhBUUVDTUM4dworTFJZcmFIUjBjSE02THk5M2QzY3VkbVZ5YVhOcFoyNHVZMjl0TDNKbGNHOXphWFJ2Y25rdlExQlRMVEV1TURBVQorQmdsZ2hrZ0JodmhDQVFFQkFmOEVCQU1DQWdRd0RRWUpLb1pJaHZjTkFRRUNCUUFEZ1lFQXBSSlJrTkJxTExncworNTNJUi9kMThPRGRMT1dNVForUU9PeEJycTQ2MGlCRWRVd2dGOHZtUFJYMWt1N1VpRGVOemFMbHVyRTZlRnFIcQorMnpQeUs1ajYwemZUTFZKTVdLY1FXd1RKTGpIdFhyVzhweGhOdEZjNkZkdnk1WmtIbkMvOU5JbDcvdDRVNldxQgorcDR5K3A3U2RNSWtFd0laZmRzMFZiblF5WDVNUlVKWT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKworIHN1YmplY3Q9L0M9VVMvTz1WZXJpU2lnbiwgSW5jLi9PVT1DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgaXNzdWVyPSAvQz1VUy9PPVZlcmlTaWduLCBJbmMuL09VPUNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ01UQ0NBWm9DQlFLaEFBQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQU1GOHhDekFKQmdOVkJBWVRBbFZUTVJjdworRlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRTNNRFVHQTFVRUN4TXVRMnhoYzNNZ015QlFkV0pzYVdNZworVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1TmpBeE1qa3dNREF3TURCYQorRncwNU9URXlNekV5TXpVNU5UbGFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbgorYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aGMzTWdNeUJRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacAorWTJGMGFXOXVJRUYxZEdodmNtbDBlVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBeVZ4WgorbnZJYmlnRVV0QkRmQkVEYjQxZXZha1ZBajRRTUM5RXoyZGtSeis0Q1dCOGw5eXFvUkFXcTdBTWZlSCtlazdtYQorQUtvamZkYXNoYUpqUmNkeUo4ejBUTVoxY2RJNTcwOUM4SFhmQ3BER2ppQnZtQS80ckNOZmNDazJwTW1HNTdHYQorSU10VHBZWG5QYjU5bXY0a1JUUGNkaFh0RDZKeFpFeGxMb0ZvUmFjQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFJRgorQUFPQmdRQjFabXcrMGMyQjI3WDRMelpSdHZkQ3ZNMUNyOXdPK2hWcytHZVRWenJydHBMb3RnSEtqTGVPUTdSSgorWmZrKzdyMTFSaTdKL0NWZHFNY3ZpNXVQYU0rMG5KY1l3RTN2SDltdmdyUG1aTGlFWElxYUIxSkRZZnQwbmxzNgorTnZ4TXN2d2FQeFV1cFZzOEc1RHNpQ25rV1JiNXpnZXQ3T25kMnRJeGlrL1cyTzhYalE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorIHN1YmplY3Q9L0M9VVMvTz1WZXJpU2lnbiwgSW5jLi9PVT1DbGFzcyA0IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CisgaXNzdWVyPSAvQz1VUy9PPVZlcmlTaWduLCBJbmMuL09VPUNsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ01UQ0NBWm9DQlFLbUFBQUJNQTBHQ1NxR1NJYjNEUUVCQWdVQU1GOHhDekFKQmdOVkJBWVRBbFZUTVJjdworRlFZRFZRUUtFdzVXWlhKcFUybG5iaXdnU1c1akxqRTNNRFVHQTFVRUN4TXVRMnhoYzNNZ05DQlFkV0pzYVdNZworVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzA1TmpBeE1qa3dNREF3TURCYQorRncwNU9URXlNekV5TXpVNU5UbGFNRjh4Q3pBSkJnTlZCQVlUQWxWVE1SY3dGUVlEVlFRS0V3NVdaWEpwVTJsbgorYml3Z1NXNWpMakUzTURVR0ExVUVDeE11UTJ4aGMzTWdOQ0JRZFdKc2FXTWdVSEpwYldGeWVTQkRaWEowYVdacAorWTJGMGFXOXVJRUYxZEdodmNtbDBlVENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBd2dZa0NnWUVBMExKMQorOW5qUXJscFE5T2xRcVorTTErK1JsSERvMGlTUWRvbUYxdCtzNWdFWE1vRHduWk5IdkpwbG5SK1hyci9waG5WagorSUltOWdGaWRCQXlkcU1FazZRdmxNWGk5L0MwTU4ycWVlSURwUm5YNTdhUDdFM3ZJd1V6U28rLzFQTEJpajBwZAorTzkyVlo0OFR1Y0U4MXFjbW0rekRPM3JaVGJ4dG0rZ1ZBZVB3UjZrQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFJRgorQUFPQmdRQlQzZFB3bkNSK1FLcmkvQUFhMTlvTS9ESmh1QlVObHZQNlZ4dC9NM3l2NlppYVljaDZzN2Yvc2R5WgorZzl5c0V2eHd5Ujg0UXUxRTlvQXVXMnN6YWF5YzAxem5YMW9ZeDdFdGVRU1dRWkdaUWJFOERicUVPY1k3bC9BbQoreVk3dXZjeENsZjhleHdJL1ZBeDQ5YnlxWUh3Q2FlamNyT0lDZG1IRVBnUHEwb29rMFE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy9zZXNzX2lkLmMgYi9saWIvb3BlbnNzbC9hcHBzL3Nlc3NfaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTkxNzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9zZXNzX2lkLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qIGFwcHMvc2Vzc19pZC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCXNlc3NfaWRfbWFpbgorCitzdGF0aWMgY29uc3QgY2hhciAqc2Vzc19pZF91c2FnZVtdPXsKKyJ1c2FnZTogc2Vzc19pZCBhcmdzXG4iLAorIlxuIiwKKyIgLWluZm9ybSBhcmcgICAgIC0gaW5wdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU0gKERFUiBvciBQRU0pXG4iLAorIiAtb3V0Zm9ybSBhcmcgICAgLSBvdXRwdXQgZm9ybWF0IC0gZGVmYXVsdCBQRU1cbiIsCisiIC1pbiBhcmcgICAgICAgICAtIGlucHV0IGZpbGUgLSBkZWZhdWx0IHN0ZGluXG4iLAorIiAtb3V0IGFyZyAgICAgICAgLSBvdXRwdXQgZmlsZSAtIGRlZmF1bHQgc3Rkb3V0XG4iLAorIiAtdGV4dCAgICAgICAgICAgLSBwcmludCBzc2wgc2Vzc2lvbiBpZCBkZXRhaWxzXG4iLAorIiAtY2VydCAgICAgICAgICAgLSBvdXRwdXQgY2VydGlmaWNhdGUgXG4iLAorIiAtbm9vdXQgICAgICAgICAgLSBubyBDUkwgb3V0cHV0XG4iLAorIiAtY29udGV4dCBhcmcgICAgLSBzZXQgdGhlIHNlc3Npb24gSUQgY29udGV4dFxuIiwKK05VTEwKK307CisKK3N0YXRpYyBTU0xfU0VTU0lPTiAqbG9hZF9zZXNzX2lkKGNoYXIgKmZpbGUsIGludCBmb3JtYXQpOworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCVNTTF9TRVNTSU9OICp4PU5VTEw7CisJaW50IHJldD0xLGksbnVtLGJhZG9wcz0wOworCUJJTyAqb3V0PU5VTEw7CisJaW50IGluZm9ybWF0LG91dGZvcm1hdDsKKwljaGFyICppbmZpbGU9TlVMTCwqb3V0ZmlsZT1OVUxMLCpjb250ZXh0PU5VTEw7CisJaW50IGNlcnQ9MCxub291dD0wLHRleHQ9MDsKKwljb25zdCBjaGFyICoqcHA7CisKKwlhcHBzX3N0YXJ0dXAoKTsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWluZm9ybWF0PUZPUk1BVF9QRU07CisJb3V0Zm9ybWF0PUZPUk1BVF9QRU07CisKKwlhcmdjLS07CisJYXJndisrOworCW51bT0wOworCXdoaWxlIChhcmdjID49IDEpCisJCXsKKwkJaWYgCShzdHJjbXAoKmFyZ3YsIi1pbmZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5mb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXRmb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWluIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWluZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJb3V0ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi10ZXh0IikgPT0gMCkKKwkJCXRleHQ9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jZXJ0IikgPT0gMCkKKwkJCWNlcnQ9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1ub291dCIpID09IDApCisJCQlub291dD0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNvbnRleHQiKSA9PSAwKQorCQkgICAgeworCQkgICAgaWYoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCSAgICBjb250ZXh0PSorK2FyZ3Y7CisJCSAgICB9CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5rbm93biBvcHRpb24gJXNcbiIsKmFyZ3YpOworCQkJYmFkb3BzPTE7CisJCQlicmVhazsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKworCWlmIChiYWRvcHMpCisJCXsKK2JhZDoKKwkJZm9yIChwcD1zZXNzX2lkX3VzYWdlOyAoKnBwICE9IE5VTEwpOyBwcCsrKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCIlcyIsKnBwKTsKKwkJZ290byBlbmQ7CisJCX0KKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisJeD1sb2FkX3Nlc3NfaWQoaW5maWxlLGluZm9ybWF0KTsKKwlpZiAoeCA9PSBOVUxMKSB7IGdvdG8gZW5kOyB9CisKKwlpZihjb250ZXh0KQorCSAgICB7CisJICAgIHgtPnNpZF9jdHhfbGVuZ3RoPXN0cmxlbihjb250ZXh0KTsKKwkgICAgaWYoeC0+c2lkX2N0eF9sZW5ndGggPiBTU0xfTUFYX1NJRF9DVFhfTEVOR1RIKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiQ29udGV4dCB0b28gbG9uZ1xuIik7CisJCWdvdG8gZW5kOworCQl9CisJICAgIG1lbWNweSh4LT5zaWRfY3R4LGNvbnRleHQseC0+c2lkX2N0eF9sZW5ndGgpOworCSAgICB9CisKKyNpZmRlZiB1bmRlZgorCS8qIGp1c3QgdGVzdGluZyBmb3IgbWVtb3J5IGxlYWtzIDotKSAqLworCXsKKwlTU0xfU0VTU0lPTiAqczsKKwljaGFyIGJ1ZlsxMDI0KjEwXSwqcDsKKwlpbnQgaTsKKworCXM9U1NMX1NFU1NJT05fbmV3KCk7CisKKwlwPSAmYnVmOworCWk9aTJkX1NTTF9TRVNTSU9OKHgsJnApOworCXA9ICZidWY7CisJZDJpX1NTTF9TRVNTSU9OKCZzLCZwLChsb25nKWkpOworCXA9ICZidWY7CisJZDJpX1NTTF9TRVNTSU9OKCZzLCZwLChsb25nKWkpOworCXA9ICZidWY7CisJZDJpX1NTTF9TRVNTSU9OKCZzLCZwLChsb25nKWkpOworCVNTTF9TRVNTSU9OX2ZyZWUocyk7CisJfQorI2VuZGlmCisKKwlpZiAoIW5vb3V0IHx8IHRleHQpCisJCXsKKwkJb3V0PUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwkJaWYgKG91dCA9PSBOVUxMKQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCWlmIChvdXRmaWxlID09IE5VTEwpCisJCQl7CisJCQlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQkJeworCQkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCQl9CisjZW5kaWYKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKEJJT193cml0ZV9maWxlbmFtZShvdXQsb3V0ZmlsZSkgPD0gMCkKKwkJCQl7CisJCQkJcGVycm9yKG91dGZpbGUpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJfQorCisJaWYgKHRleHQpCisJCXsKKwkJU1NMX1NFU1NJT05fcHJpbnQob3V0LHgpOworCisJCWlmIChjZXJ0KQorCQkJeworCQkJaWYgKHgtPnBlZXIgPT0gTlVMTCkKKwkJCQlCSU9fcHV0cyhvdXQsIk5vIGNlcnRpZmljYXRlIHByZXNlbnRcbiIpOworCQkJZWxzZQorCQkJCVg1MDlfcHJpbnQob3V0LHgtPnBlZXIpOworCQkJfQorCQl9CisKKwlpZiAoIW5vb3V0ICYmICFjZXJ0KQorCQl7CisJCWlmIAkob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJaT1pMmRfU1NMX1NFU1NJT05fYmlvKG91dCx4KTsKKwkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCQlpPVBFTV93cml0ZV9iaW9fU1NMX1NFU1NJT04ob3V0LHgpOworCQllbHNlCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBvdXRmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoIWkpIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIHdyaXRlIFNTTF9TRVNTSU9OXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJZWxzZSBpZiAoIW5vb3V0ICYmICh4LT5wZWVyICE9IE5VTEwpKSAvKiBqdXN0IHByaW50IHRoZSBjZXJ0aWZpY2F0ZSAqLworCQl7CisJCWlmIAkob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJaT0oaW50KWkyZF9YNTA5X2JpbyhvdXQseC0+cGVlcik7CisJCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQkJaT1QRU1fd3JpdGVfYmlvX1g1MDkob3V0LHgtPnBlZXIpOworCQllbHNlCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIG91dHB1dCBmb3JtYXQgc3BlY2lmaWVkIGZvciBvdXRmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoIWkpIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIHdyaXRlIFg1MDlcbiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwlyZXQ9MDsKK2VuZDoKKwlpZiAob3V0ICE9IE5VTEwpIEJJT19mcmVlX2FsbChvdXQpOworCWlmICh4ICE9IE5VTEwpIFNTTF9TRVNTSU9OX2ZyZWUoeCk7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKworc3RhdGljIFNTTF9TRVNTSU9OICpsb2FkX3Nlc3NfaWQoY2hhciAqaW5maWxlLCBpbnQgZm9ybWF0KQorCXsKKwlTU0xfU0VTU0lPTiAqeD1OVUxMOworCUJJTyAqaW49TlVMTDsKKworCWluPUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGluZmlsZSA9PSBOVUxMKQorCQlCSU9fc2V0X2ZwKGluLHN0ZGluLEJJT19OT0NMT1NFKTsKKwllbHNlCisJCXsKKwkJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGluZmlsZSkgPD0gMCkKKwkJCXsKKwkJCXBlcnJvcihpbmZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwlpZiAJKGZvcm1hdCA9PSBGT1JNQVRfQVNOMSkKKwkJeD1kMmlfU1NMX1NFU1NJT05fYmlvKGluLE5VTEwpOworCWVsc2UgaWYgKGZvcm1hdCA9PSBGT1JNQVRfUEVNKQorCQl4PVBFTV9yZWFkX2Jpb19TU0xfU0VTU0lPTihpbixOVUxMLE5VTEwsTlVMTCk7CisJZWxzZQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiYmFkIGlucHV0IGZvcm1hdCBzcGVjaWZpZWQgZm9yIGlucHV0IGNybFxuIik7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKHggPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsInVuYWJsZSB0byBsb2FkIFNTTF9TRVNTSU9OXG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKwkKK2VuZDoKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCXJldHVybih4KTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvc21pbWUuYyBiL2xpYi9vcGVuc3NsL2FwcHMvc21pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTgzZjhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9zbWltZS5jCkBAIC0wLDAgKzEsODU3IEBACisvKiBzbWltZS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBTL01JTUUgdXRpbGl0eSBmdW5jdGlvbiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5X3ZmeS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cgc21pbWVfbWFpbgorc3RhdGljIGludCBzYXZlX2NlcnRzKGNoYXIgKnNpZ25lcmZpbGUsIFNUQUNLX09GKFg1MDkpICpzaWduZXJzKTsKK3N0YXRpYyBpbnQgc21pbWVfY2IoaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KTsKKworI2RlZmluZSBTTUlNRV9PUAkweDEwCisjZGVmaW5lIFNNSU1FX0lQCTB4MjAKKyNkZWZpbmUgU01JTUVfU0lHTkVSUwkweDQwCisjZGVmaW5lIFNNSU1FX0VOQ1JZUFQJKDEgfCBTTUlNRV9PUCkKKyNkZWZpbmUgU01JTUVfREVDUllQVAkoMiB8IFNNSU1FX0lQKQorI2RlZmluZSBTTUlNRV9TSUdOCSgzIHwgU01JTUVfT1AgfCBTTUlNRV9TSUdORVJTKQorI2RlZmluZSBTTUlNRV9WRVJJRlkJKDQgfCBTTUlNRV9JUCkKKyNkZWZpbmUgU01JTUVfUEs3T1VUCSg1IHwgU01JTUVfSVAgfCBTTUlNRV9PUCkKKyNkZWZpbmUgU01JTUVfUkVTSUdOCSg2IHwgU01JTUVfSVAgfCBTTUlNRV9PUCB8IFNNSU1FX1NJR05FUlMpCisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJRU5HSU5FICplID0gTlVMTDsKKwlpbnQgb3BlcmF0aW9uID0gMDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyICoqYXJnczsKKwljb25zdCBjaGFyICppbm1vZGUgPSAiciIsICpvdXRtb2RlID0gInciOworCWNoYXIgKmluZmlsZSA9IE5VTEwsICpvdXRmaWxlID0gTlVMTDsKKwljaGFyICpzaWduZXJmaWxlID0gTlVMTCwgKnJlY2lwZmlsZSA9IE5VTEw7CisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpza3NpZ25lcnMgPSBOVUxMLCAqc2trZXlzID0gTlVMTDsKKwljaGFyICpjZXJ0ZmlsZSA9IE5VTEwsICprZXlmaWxlID0gTlVMTCwgKmNvbnRmaWxlPU5VTEw7CisJY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyID0gTlVMTDsKKwlQS0NTNyAqcDcgPSBOVUxMOworCVg1MDlfU1RPUkUgKnN0b3JlID0gTlVMTDsKKwlYNTA5ICpjZXJ0ID0gTlVMTCwgKnJlY2lwID0gTlVMTCwgKnNpZ25lciA9IE5VTEw7CisJRVZQX1BLRVkgKmtleSA9IE5VTEw7CisJU1RBQ0tfT0YoWDUwOSkgKmVuY2VydHMgPSBOVUxMLCAqb3RoZXIgPSBOVUxMOworCUJJTyAqaW4gPSBOVUxMLCAqb3V0ID0gTlVMTCwgKmluZGF0YSA9IE5VTEw7CisJaW50IGJhZGFyZyA9IDA7CisJaW50IGZsYWdzID0gUEtDUzdfREVUQUNIRUQ7CisJY2hhciAqdG8gPSBOVUxMLCAqZnJvbSA9IE5VTEwsICpzdWJqZWN0ID0gTlVMTDsKKwljaGFyICpDQWZpbGUgPSBOVUxMLCAqQ0FwYXRoID0gTlVMTDsKKwljaGFyICpwYXNzYXJnaW4gPSBOVUxMLCAqcGFzc2luID0gTlVMTDsKKwljaGFyICppbnJhbmQgPSBOVUxMOworCWludCBuZWVkX3JhbmQgPSAwOworCWludCBpbmRlZiA9IDA7CisJY29uc3QgRVZQX01EICpzaWduX21kID0gTlVMTDsKKwlpbnQgaW5mb3JtYXQgPSBGT1JNQVRfU01JTUUsIG91dGZvcm1hdCA9IEZPUk1BVF9TTUlNRTsKKyAgICAgICAgaW50IGtleWZvcm0gPSBGT1JNQVRfUEVNOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWNoYXIgKmVuZ2luZT1OVUxMOworI2VuZGlmCisKKwlYNTA5X1ZFUklGWV9QQVJBTSAqdnBtID0gTlVMTDsKKworCWFyZ3MgPSBhcmd2ICsgMTsKKwlyZXQgPSAxOworCisJYXBwc19zdGFydHVwKCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQl7CisJCWlmICgoYmlvX2VyciA9IEJJT19uZXcoQklPX3NfZmlsZSgpKSkgIT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoYmlvX2Vyciwgc3RkZXJyLCBCSU9fTk9DTE9TRXxCSU9fRlBfVEVYVCk7CisJCX0KKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJd2hpbGUgKCFiYWRhcmcgJiYgKmFyZ3MgJiYgKmFyZ3NbMF0gPT0gJy0nKQorCQl7CisJCWlmICghc3RyY21wICgqYXJncywgIi1lbmNyeXB0IikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9FTkNSWVBUOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1kZWNyeXB0IikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9ERUNSWVBUOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1zaWduIikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9TSUdOOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1yZXNpZ24iKSkKKwkJCW9wZXJhdGlvbiA9IFNNSU1FX1JFU0lHTjsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItdmVyaWZ5IikpCisJCQlvcGVyYXRpb24gPSBTTUlNRV9WRVJJRlk7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXBrN291dCIpKQorCQkJb3BlcmF0aW9uID0gU01JTUVfUEs3T1VUOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1kZXMzIikpIAorCQkJCWNpcGhlciA9IEVWUF9kZXNfZWRlM19jYmMoKTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItZGVzIikpIAorCQkJCWNpcGhlciA9IEVWUF9kZXNfY2JjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXNlZWQiKSkgCisJCQkJY2lwaGVyID0gRVZQX3NlZWRfY2JjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzIKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItcmMyLTQwIikpIAorCQkJCWNpcGhlciA9IEVWUF9yYzJfNDBfY2JjKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXJjMi0xMjgiKSkgCisJCQkJY2lwaGVyID0gRVZQX3JjMl9jYmMoKTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItcmMyLTY0IikpIAorCQkJCWNpcGhlciA9IEVWUF9yYzJfNjRfY2JjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLWFlczEyOCIpKQorCQkJCWNpcGhlciA9IEVWUF9hZXNfMTI4X2NiYygpOworCQllbHNlIGlmICghc3RyY21wKCphcmdzLCItYWVzMTkyIikpCisJCQkJY2lwaGVyID0gRVZQX2Flc18xOTJfY2JjKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1hZXMyNTYiKSkKKwkJCQljaXBoZXIgPSBFVlBfYWVzXzI1Nl9jYmMoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1jYW1lbGxpYTEyOCIpKQorCQkJCWNpcGhlciA9IEVWUF9jYW1lbGxpYV8xMjhfY2JjKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1jYW1lbGxpYTE5MiIpKQorCQkJCWNpcGhlciA9IEVWUF9jYW1lbGxpYV8xOTJfY2JjKCk7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1jYW1lbGxpYTI1NiIpKQorCQkJCWNpcGhlciA9IEVWUF9jYW1lbGxpYV8yNTZfY2JjKCk7CisjZW5kaWYKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItdGV4dCIpKSAKKwkJCQlmbGFncyB8PSBQS0NTN19URVhUOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub2ludGVybiIpKSAKKwkJCQlmbGFncyB8PSBQS0NTN19OT0lOVEVSTjsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm92ZXJpZnkiKSkgCisJCQkJZmxhZ3MgfD0gUEtDUzdfTk9WRVJJRlk7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vY2hhaW4iKSkgCisJCQkJZmxhZ3MgfD0gUEtDUzdfTk9DSEFJTjsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9jZXJ0cyIpKSAKKwkJCQlmbGFncyB8PSBQS0NTN19OT0NFUlRTOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub2F0dHIiKSkgCisJCQkJZmxhZ3MgfD0gUEtDUzdfTk9BVFRSOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1ub2RldGFjaCIpKSAKKwkJCQlmbGFncyAmPSB+UEtDUzdfREVUQUNIRUQ7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vc21pbWVjYXAiKSkKKwkJCQlmbGFncyB8PSBQS0NTN19OT1NNSU1FQ0FQOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1iaW5hcnkiKSkKKwkJCQlmbGFncyB8PSBQS0NTN19CSU5BUlk7CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW5vc2lncyIpKQorCQkJCWZsYWdzIHw9IFBLQ1M3X05PU0lHUzsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItc3RyZWFtIikpCisJCQkJaW5kZWYgPSAxOworCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1pbmRlZiIpKQorCQkJCWluZGVmID0gMTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9pbmRlZiIpKQorCQkJCWluZGVmID0gMDsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItbm9vbGRtaW1lIikpCisJCQkJZmxhZ3MgfD0gUEtDUzdfTk9PTERNSU1FVFlQRTsKKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItY3JsZmVvbCIpKQorCQkJCWZsYWdzIHw9IFBLQ1M3X0NSTEZFT0w7CisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1yYW5kIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQlhcmdzKys7CisJCQlpbnJhbmQgPSAqYXJnczsKKwkJCW5lZWRfcmFuZCA9IDE7CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYgKCFzdHJjbXAoKmFyZ3MsIi1lbmdpbmUiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCWVuZ2luZSA9ICorK2FyZ3M7CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAoIXN0cmNtcCgqYXJncywiLXBhc3NpbiIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJcGFzc2FyZ2luID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItdG8iKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCXRvID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItZnJvbSIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJZnJvbSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXN1YmplY3QiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCXN1YmplY3QgPSAqKythcmdzOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1zaWduZXIiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCS8qIElmIHByZXZpb3VzIC1zaWduZXIgYXJndW1lbnQgYWRkIHNpZ25lciB0byBsaXN0ICovCisKKwkJCWlmIChzaWduZXJmaWxlKQorCQkJCXsKKwkJCQlpZiAoIXNrc2lnbmVycykKKwkJCQkJc2tzaWduZXJzID0gc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKTsKKwkJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKHNrc2lnbmVycywgc2lnbmVyZmlsZSk7CisJCQkJaWYgKCFrZXlmaWxlKQorCQkJCQlrZXlmaWxlID0gc2lnbmVyZmlsZTsKKwkJCQlpZiAoIXNra2V5cykKKwkJCQkJc2trZXlzID0gc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKTsKKwkJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKHNra2V5cywga2V5ZmlsZSk7CisJCQkJa2V5ZmlsZSA9IE5VTEw7CisJCQkJfQorCQkJc2lnbmVyZmlsZSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLXJlY2lwIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQlyZWNpcGZpbGUgPSAqKythcmdzOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1tZCIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJc2lnbl9tZCA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKCorK2FyZ3MpOworCQkJaWYgKHNpZ25fbWQgPT0gTlVMTCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiVW5rbm93biBkaWdlc3QgJXNcbiIsCisJCQkJCQkJKmFyZ3MpOworCQkJCWdvdG8gYXJnZXJyOworCQkJCX0KKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItaW5rZXkiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkJCisJCQkJZ290byBhcmdlcnI7CisJCQkvKiBJZiBwcmV2aW91cyAtaW5rZXkgYXJ1bWVudCBhZGQgc2lnbmVyIHRvIGxpc3QgKi8KKwkJCWlmIChrZXlmaWxlKQorCQkJCXsKKwkJCQlpZiAoIXNpZ25lcmZpbGUpCisJCQkJCXsKKwkJCQkJQklPX3B1dHMoYmlvX2VyciwgIklsbGVnYWwgLWlua2V5IHdpdGhvdXQgLXNpZ25lclxuIik7CisJCQkJCWdvdG8gYXJnZXJyOworCQkJCQl9CisJCQkJaWYgKCFza3NpZ25lcnMpCisJCQkJCXNrc2lnbmVycyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisJCQkJc2tfT1BFTlNTTF9TVFJJTkdfcHVzaChza3NpZ25lcnMsIHNpZ25lcmZpbGUpOworCQkJCXNpZ25lcmZpbGUgPSBOVUxMOworCQkJCWlmICghc2trZXlzKQorCQkJCQlza2tleXMgPSBza19PUEVOU1NMX1NUUklOR19uZXdfbnVsbCgpOworCQkJCXNrX09QRU5TU0xfU1RSSU5HX3B1c2goc2trZXlzLCBrZXlmaWxlKTsKKwkJCQl9CisJCQlrZXlmaWxlID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICIta2V5Zm9ybSIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJa2V5Zm9ybSA9IHN0cjJmbXQoKisrYXJncyk7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWNlcnRmaWxlIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQljZXJ0ZmlsZSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLUNBZmlsZSIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJQ0FmaWxlID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItQ0FwYXRoIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQlDQXBhdGggPSAqKythcmdzOworCQkJfQorCQllbHNlIGlmICghc3RyY21wICgqYXJncywgIi1pbiIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJaW5maWxlID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cmNtcCAoKmFyZ3MsICItaW5mb3JtIikpCisJCQl7CisJCQlpZiAoIWFyZ3NbMV0pCisJCQkJZ290byBhcmdlcnI7CisJCQlpbmZvcm1hdCA9IHN0cjJmbXQoKisrYXJncyk7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW91dGZvcm0iKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCW91dGZvcm1hdCA9IHN0cjJmbXQoKisrYXJncyk7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLW91dCIpKQorCQkJeworCQkJaWYgKCFhcmdzWzFdKQorCQkJCWdvdG8gYXJnZXJyOworCQkJb3V0ZmlsZSA9ICorK2FyZ3M7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAgKCphcmdzLCAiLWNvbnRlbnQiKSkKKwkJCXsKKwkJCWlmICghYXJnc1sxXSkKKwkJCQlnb3RvIGFyZ2VycjsKKwkJCWNvbnRmaWxlID0gKisrYXJnczsKKwkJCX0KKwkJZWxzZSBpZiAoYXJnc192ZXJpZnkoJmFyZ3MsIE5VTEwsICZiYWRhcmcsIGJpb19lcnIsICZ2cG0pKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKChjaXBoZXIgPSBFVlBfZ2V0X2NpcGhlcmJ5bmFtZSgqYXJncyArIDEpKSA9PSBOVUxMKQorCQkJYmFkYXJnID0gMTsKKwkJYXJncysrOworCQl9CisKKwlpZiAoIShvcGVyYXRpb24gJiBTTUlNRV9TSUdORVJTKSAmJiAoc2trZXlzIHx8IHNrc2lnbmVycykpCisJCXsKKwkJQklPX3B1dHMoYmlvX2VyciwgIk11bHRpcGxlIHNpZ25lcnMgb3Iga2V5cyBub3QgYWxsb3dlZFxuIik7CisJCWdvdG8gYXJnZXJyOworCQl9CisKKwlpZiAob3BlcmF0aW9uICYgU01JTUVfU0lHTkVSUykKKwkJeworCQkvKiBDaGVjayB0byBzZWUgaWYgYW55IGZpbmFsIHNpZ25lciBuZWVkcyB0byBiZSBhcHBlbmRlZCAqLworCQlpZiAoa2V5ZmlsZSAmJiAhc2lnbmVyZmlsZSkKKwkJCXsKKwkJCUJJT19wdXRzKGJpb19lcnIsICJJbGxlZ2FsIC1pbmtleSB3aXRob3V0IC1zaWduZXJcbiIpOworCQkJZ290byBhcmdlcnI7CisJCQl9CisJCWlmIChzaWduZXJmaWxlKQorCQkJeworCQkJaWYgKCFza3NpZ25lcnMpCisJCQkJc2tzaWduZXJzID0gc2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKTsKKwkJCXNrX09QRU5TU0xfU1RSSU5HX3B1c2goc2tzaWduZXJzLCBzaWduZXJmaWxlKTsKKwkJCWlmICghc2trZXlzKQorCQkJCXNra2V5cyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisJCQlpZiAoIWtleWZpbGUpCisJCQkJa2V5ZmlsZSA9IHNpZ25lcmZpbGU7CisJCQlza19PUEVOU1NMX1NUUklOR19wdXNoKHNra2V5cywga2V5ZmlsZSk7CisJCQl9CisJCWlmICghc2tzaWduZXJzKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiTm8gc2lnbmVyIGNlcnRpZmljYXRlIHNwZWNpZmllZFxuIik7CisJCQliYWRhcmcgPSAxOworCQkJfQorCQlzaWduZXJmaWxlID0gTlVMTDsKKwkJa2V5ZmlsZSA9IE5VTEw7CisJCW5lZWRfcmFuZCA9IDE7CisJCX0KKwllbHNlIGlmIChvcGVyYXRpb24gPT0gU01JTUVfREVDUllQVCkKKwkJeworCQlpZiAoIXJlY2lwZmlsZSAmJiAha2V5ZmlsZSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIk5vIHJlY2lwaWVudCBjZXJ0aWZpY2F0ZSBvciBrZXkgc3BlY2lmaWVkXG4iKTsKKwkJCWJhZGFyZyA9IDE7CisJCQl9CisJCX0KKwllbHNlIGlmIChvcGVyYXRpb24gPT0gU01JTUVfRU5DUllQVCkKKwkJeworCQlpZiAoISphcmdzKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiTm8gcmVjaXBpZW50KHMpIGNlcnRpZmljYXRlKHMpIHNwZWNpZmllZFxuIik7CisJCQliYWRhcmcgPSAxOworCQkJfQorCQluZWVkX3JhbmQgPSAxOworCQl9CisJZWxzZSBpZiAoIW9wZXJhdGlvbikKKwkJYmFkYXJnID0gMTsKKworCWlmIChiYWRhcmcpCisJCXsKKwkJYXJnZXJyOgorCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiVXNhZ2Ugc21pbWUgW29wdGlvbnNdIGNlcnQucGVtIC4uLlxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICJ3aGVyZSBvcHRpb25zIGFyZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItZW5jcnlwdCAgICAgICBlbmNyeXB0IG1lc3NhZ2VcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWRlY3J5cHQgICAgICAgZGVjcnlwdCBlbmNyeXB0ZWQgbWVzc2FnZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItc2lnbiAgICAgICAgICBzaWduIG1lc3NhZ2VcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXZlcmlmeSAgICAgICAgdmVyaWZ5IHNpZ25lZCBtZXNzYWdlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1wazdvdXQgICAgICAgIG91dHB1dCBQS0NTIzcgc3RydWN0dXJlXG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1kZXMzICAgICAgICAgIGVuY3J5cHQgd2l0aCB0cmlwbGUgREVTXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1kZXMgICAgICAgICAgIGVuY3J5cHQgd2l0aCBERVNcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLXNlZWQgICAgICAgICAgZW5jcnlwdCB3aXRoIFNFRURcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkMyCisJCUJJT19wcmludGYgKGJpb19lcnIsICItcmMyLTQwICAgICAgICBlbmNyeXB0IHdpdGggUkMyLTQwIChkZWZhdWx0KVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItcmMyLTY0ICAgICAgICBlbmNyeXB0IHdpdGggUkMyLTY0XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yYzItMTI4ICAgICAgIGVuY3J5cHQgd2l0aCBSQzItMTI4XG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWFlczEyOCwgLWFlczE5MiwgLWFlczI1NlxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICIgICAgICAgICAgICAgICBlbmNyeXB0IFBFTSBvdXRwdXQgd2l0aCBjYmMgYWVzXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJCUJJT19wcmludGYgKGJpb19lcnIsICItY2FtZWxsaWExMjgsIC1jYW1lbGxpYTE5MiwgLWNhbWVsbGlhMjU2XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIiAgICAgICAgICAgICAgIGVuY3J5cHQgUEVNIG91dHB1dCB3aXRoIGNiYyBjYW1lbGxpYVxuIik7CisjZW5kaWYKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub2ludGVybiAgICAgIGRvbid0IHNlYXJjaCBjZXJ0aWZpY2F0ZXMgaW4gbWVzc2FnZSBmb3Igc2lnbmVyXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub3NpZ3MgICAgICAgIGRvbid0IHZlcmlmeSBtZXNzYWdlIHNpZ25hdHVyZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItbm92ZXJpZnkgICAgICBkb24ndCB2ZXJpZnkgc2lnbmVycyBjZXJ0aWZpY2F0ZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItbm9jZXJ0cyAgICAgICBkb24ndCBpbmNsdWRlIHNpZ25lcnMgY2VydGlmaWNhdGUgd2hlbiBzaWduaW5nXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1ub2RldGFjaCAgICAgIHVzZSBvcGFxdWUgc2lnbmluZ1xuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItbm9hdHRyICAgICAgICBkb24ndCBpbmNsdWRlIGFueSBzaWduZWQgYXR0cmlidXRlc1xuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItYmluYXJ5ICAgICAgICBkb24ndCB0cmFuc2xhdGUgbWVzc2FnZSB0byB0ZXh0XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1jZXJ0ZmlsZSBmaWxlIG90aGVyIGNlcnRpZmljYXRlcyBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1zaWduZXIgZmlsZSAgIHNpZ25lciBjZXJ0aWZpY2F0ZSBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1yZWNpcCAgZmlsZSAgIHJlY2lwaWVudCBjZXJ0aWZpY2F0ZSBmaWxlIGZvciBkZWNyeXB0aW9uXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1pbiBmaWxlICAgICAgIGlucHV0IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWluZm9ybSBhcmcgICAgaW5wdXQgZm9ybWF0IFNNSU1FIChkZWZhdWx0KSwgUEVNIG9yIERFUlxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItaW5rZXkgZmlsZSAgICBpbnB1dCBwcml2YXRlIGtleSAoaWYgbm90IHNpZ25lciBvciByZWNpcGllbnQpXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1rZXlmb3JtIGFyZyAgIGlucHV0IHByaXZhdGUga2V5IGZvcm1hdCAoUEVNIG9yIEVOR0lORSlcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW91dCBmaWxlICAgICAgb3V0cHV0IGZpbGVcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLW91dGZvcm0gYXJnICAgb3V0cHV0IGZvcm1hdCBTTUlNRSAoZGVmYXVsdCksIFBFTSBvciBERVJcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNvbnRlbnQgZmlsZSAgc3VwcGx5IG9yIG92ZXJyaWRlIGNvbnRlbnQgZm9yIGRldGFjaGVkIHNpZ25hdHVyZVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItdG8gYWRkciAgICAgICB0byBhZGRyZXNzXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1mcm9tIGFkICAgICAgIGZyb20gYWRkcmVzc1xuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItc3ViamVjdCBzICAgICBzdWJqZWN0XG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi10ZXh0ICAgICAgICAgIGluY2x1ZGUgb3IgZGVsZXRlIHRleHQgTUlNRSBoZWFkZXJzXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1DQXBhdGggZGlyICAgIHRydXN0ZWQgY2VydGlmaWNhdGVzIGRpcmVjdG9yeVxuIik7CisJCUJJT19wcmludGYgKGJpb19lcnIsICItQ0FmaWxlIGZpbGUgICB0cnVzdGVkIGNlcnRpZmljYXRlcyBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1jcmxfY2hlY2sgICAgIGNoZWNrIHJldm9jYXRpb24gc3RhdHVzIG9mIHNpZ25lcidzIGNlcnRpZmljYXRlIHVzaW5nIENSTHNcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiLWNybF9jaGVja19hbGwgY2hlY2sgcmV2b2NhdGlvbiBzdGF0dXMgb2Ygc2lnbmVyJ3MgY2VydGlmaWNhdGUgY2hhaW4gdXNpbmcgQ1JMc1xuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUJJT19wcmludGYgKGJpb19lcnIsICItZW5naW5lIGUgICAgICB1c2UgZW5naW5lIGUsIHBvc3NpYmx5IGEgaGFyZHdhcmUgZGV2aWNlLlxuIik7CisjZW5kaWYKKwkJQklPX3ByaW50ZiAoYmlvX2VyciwgIi1wYXNzaW4gYXJnICAgIGlucHV0IGZpbGUgcGFzcyBwaHJhc2Ugc291cmNlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAgIi1yYW5kIGZpbGUlY2ZpbGUlYy4uLlxuIiwgTElTVF9TRVBBUkFUT1JfQ0hBUiwgTElTVF9TRVBBUkFUT1JfQ0hBUik7CisJCUJJT19wcmludGYoYmlvX2VyciwgICIgICAgICAgICAgICAgICBsb2FkIHRoZSBmaWxlIChvciB0aGUgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSkgaW50b1xuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwgICIgICAgICAgICAgICAgICB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JcbiIpOworCQlCSU9fcHJpbnRmIChiaW9fZXJyLCAiY2VydC5wZW0gICAgICAgcmVjaXBpZW50IGNlcnRpZmljYXRlKHMpIGZvciBlbmNyeXB0aW9uXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmICghYXBwX3Bhc3N3ZChiaW9fZXJyLCBwYXNzYXJnaW4sIE5VTEwsICZwYXNzaW4sIE5VTEwpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGdldHRpbmcgcGFzc3dvcmRcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKG5lZWRfcmFuZCkKKwkJeworCQlhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgKGlucmFuZCAhPSBOVUxMKSk7CisJCWlmIChpbnJhbmQgIT0gTlVMTCkKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJWxkIHNlbWktcmFuZG9tIGJ5dGVzIGxvYWRlZFxuIiwKKwkJCQlhcHBfUkFORF9sb2FkX2ZpbGVzKGlucmFuZCkpOworCQl9CisKKwlyZXQgPSAyOworCisJaWYgKCEob3BlcmF0aW9uICYgU01JTUVfU0lHTkVSUykpCisJCWZsYWdzICY9IH5QS0NTN19ERVRBQ0hFRDsKKworCWlmIChvcGVyYXRpb24gJiBTTUlNRV9PUCkKKwkJeworCQlpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQkJb3V0bW9kZSA9ICJ3YiI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGZsYWdzICYgUEtDUzdfQklOQVJZKQorCQkJb3V0bW9kZSA9ICJ3YiI7CisJCX0KKworCWlmIChvcGVyYXRpb24gJiBTTUlNRV9JUCkKKwkJeworCQlpZiAoaW5mb3JtYXQgPT0gRk9STUFUX0FTTjEpCisJCQlpbm1vZGUgPSAicmIiOworCQl9CisJZWxzZQorCQl7CisJCWlmIChmbGFncyAmIFBLQ1M3X0JJTkFSWSkKKwkJCWlubW9kZSA9ICJyYiI7CisJCX0KKworCWlmIChvcGVyYXRpb24gPT0gU01JTUVfRU5DUllQVCkKKwkJeworCQlpZiAoIWNpcGhlcikKKwkJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzIJCQkKKwkJCWNpcGhlciA9IEVWUF9yYzJfNDBfY2JjKCk7CisjZWxzZQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiTm8gY2lwaGVyIHNlbGVjdGVkXG4iKTsKKwkJCWdvdG8gZW5kOworI2VuZGlmCisJCQl9CisJCWVuY2VydHMgPSBza19YNTA5X25ld19udWxsKCk7CisJCXdoaWxlICgqYXJncykKKwkJCXsKKwkJCWlmICghKGNlcnQgPSBsb2FkX2NlcnQoYmlvX2VyciwqYXJncyxGT1JNQVRfUEVNLAorCQkJCU5VTEwsIGUsICJyZWNpcGllbnQgY2VydGlmaWNhdGUgZmlsZSIpKSkKKwkJCQl7CisjaWYgMAkJCQkvKiBBbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGlzIGFscmVhZHkgcHJpbnRlZCAqLworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkNhbid0IHJlYWQgcmVjaXBpZW50IGNlcnRpZmljYXRlIGZpbGUgJXNcbiIsICphcmdzKTsKKyNlbmRpZgorCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCXNrX1g1MDlfcHVzaChlbmNlcnRzLCBjZXJ0KTsKKwkJCWNlcnQgPSBOVUxMOworCQkJYXJncysrOworCQkJfQorCQl9CisKKwlpZiAoY2VydGZpbGUpCisJCXsKKwkJaWYgKCEob3RoZXIgPSBsb2FkX2NlcnRzKGJpb19lcnIsY2VydGZpbGUsRk9STUFUX1BFTSwgTlVMTCwKKwkJCWUsICJjZXJ0aWZpY2F0ZSBmaWxlIikpKQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAocmVjaXBmaWxlICYmIChvcGVyYXRpb24gPT0gU01JTUVfREVDUllQVCkpCisJCXsKKwkJaWYgKCEocmVjaXAgPSBsb2FkX2NlcnQoYmlvX2VycixyZWNpcGZpbGUsRk9STUFUX1BFTSxOVUxMLAorCQkJZSwgInJlY2lwaWVudCBjZXJ0aWZpY2F0ZSBmaWxlIikpKQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwlpZiAob3BlcmF0aW9uID09IFNNSU1FX0RFQ1JZUFQpCisJCXsKKwkJaWYgKCFrZXlmaWxlKQorCQkJa2V5ZmlsZSA9IHJlY2lwZmlsZTsKKwkJfQorCWVsc2UgaWYgKG9wZXJhdGlvbiA9PSBTTUlNRV9TSUdOKQorCQl7CisJCWlmICgha2V5ZmlsZSkKKwkJCWtleWZpbGUgPSBzaWduZXJmaWxlOworCQl9CisJZWxzZSBrZXlmaWxlID0gTlVMTDsKKworCWlmIChrZXlmaWxlKQorCQl7CisJCWtleSA9IGxvYWRfa2V5KGJpb19lcnIsIGtleWZpbGUsIGtleWZvcm0sIDAsIHBhc3NpbiwgZSwKKwkJCSAgICAgICAic2lnbmluZyBrZXkgZmlsZSIpOworCQlpZiAoIWtleSkKKwkJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoaW5maWxlKQorCQl7CisJCWlmICghKGluID0gQklPX25ld19maWxlKGluZmlsZSwgaW5tb2RlKSkpCisJCQl7CisJCQlCSU9fcHJpbnRmIChiaW9fZXJyLAorCQkJCSAiQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBpbmZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCWluID0gQklPX25ld19mcChzdGRpbiwgQklPX05PQ0xPU0UpOworCisJaWYgKG9wZXJhdGlvbiAmIFNNSU1FX0lQKQorCQl7CisJCWlmIChpbmZvcm1hdCA9PSBGT1JNQVRfU01JTUUpIAorCQkJcDcgPSBTTUlNRV9yZWFkX1BLQ1M3KGluLCAmaW5kYXRhKTsKKwkJZWxzZSBpZiAoaW5mb3JtYXQgPT0gRk9STUFUX1BFTSkgCisJCQlwNyA9IFBFTV9yZWFkX2Jpb19QS0NTNyhpbiwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWVsc2UgaWYgKGluZm9ybWF0ID09IEZPUk1BVF9BU04xKSAKKwkJCXA3ID0gZDJpX1BLQ1M3X2JpbyhpbiwgTlVMTCk7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkJhZCBpbnB1dCBmb3JtYXQgZm9yIFBLQ1MjNyBmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCWlmICghcDcpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciByZWFkaW5nIFMvTUlNRSBtZXNzYWdlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoY29udGZpbGUpCisJCQl7CisJCQlCSU9fZnJlZShpbmRhdGEpOworCQkJaWYgKCEoaW5kYXRhID0gQklPX25ld19maWxlKGNvbnRmaWxlLCAicmIiKSkpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwgIkNhbid0IHJlYWQgY29udGVudCBmaWxlICVzXG4iLCBjb250ZmlsZSk7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAob3V0ZmlsZSkKKwkJeworCQlpZiAoIShvdXQgPSBCSU9fbmV3X2ZpbGUob3V0ZmlsZSwgb3V0bW9kZSkpKQorCQkJeworCQkJQklPX3ByaW50ZiAoYmlvX2VyciwKKwkJCQkgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dGZpbGUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJb3V0ID0gQklPX25ld19mcChzdGRvdXQsIEJJT19OT0NMT1NFKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwkJeworCQkgICAgQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCSAgICBvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCX0KKyNlbmRpZgorCQl9CisKKwlpZiAob3BlcmF0aW9uID09IFNNSU1FX1ZFUklGWSkKKwkJeworCQlpZiAoIShzdG9yZSA9IHNldHVwX3ZlcmlmeShiaW9fZXJyLCBDQWZpbGUsIENBcGF0aCkpKQorCQkJZ290byBlbmQ7CisJCVg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYihzdG9yZSwgc21pbWVfY2IpOworCQlpZiAodnBtKQorCQkJWDUwOV9TVE9SRV9zZXQxX3BhcmFtKHN0b3JlLCB2cG0pOworCQl9CisKKworCXJldCA9IDM7CisKKwlpZiAob3BlcmF0aW9uID09IFNNSU1FX0VOQ1JZUFQpCisJCXsKKwkJaWYgKGluZGVmKQorCQkJZmxhZ3MgfD0gUEtDUzdfU1RSRUFNOworCQlwNyA9IFBLQ1M3X2VuY3J5cHQoZW5jZXJ0cywgaW4sIGNpcGhlciwgZmxhZ3MpOworCQl9CisJZWxzZSBpZiAob3BlcmF0aW9uICYgU01JTUVfU0lHTkVSUykKKwkJeworCQlpbnQgaTsKKwkJLyogSWYgZGV0YWNoZWQgZGF0YSBjb250ZW50IHdlIG9ubHkgZW5hYmxlIHN0cmVhbWluZyBpZgorCQkgKiBTL01JTUUgb3V0cHV0IGZvcm1hdC4KKwkJICovCisJCWlmIChvcGVyYXRpb24gPT0gU01JTUVfU0lHTikKKwkJCXsKKwkJCWlmIChmbGFncyAmIFBLQ1M3X0RFVEFDSEVEKQorCQkJCXsKKwkJCQlpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9TTUlNRSkKKwkJCQkJZmxhZ3MgfD0gUEtDUzdfU1RSRUFNOworCQkJCX0KKwkJCWVsc2UgaWYgKGluZGVmKQorCQkJCWZsYWdzIHw9IFBLQ1M3X1NUUkVBTTsKKwkJCWZsYWdzIHw9IFBLQ1M3X1BBUlRJQUw7CisJCQlwNyA9IFBLQ1M3X3NpZ24oTlVMTCwgTlVMTCwgb3RoZXIsIGluLCBmbGFncyk7CisJCQlpZiAoIXA3KQorCQkJCWdvdG8gZW5kOworCQkJfQorCQllbHNlCisJCQlmbGFncyB8PSBQS0NTN19SRVVTRV9ESUdFU1Q7CisJCWZvciAoaSA9IDA7IGkgPCBza19PUEVOU1NMX1NUUklOR19udW0oc2tzaWduZXJzKTsgaSsrKQorCQkJeworCQkJc2lnbmVyZmlsZSA9IHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKHNrc2lnbmVycywgaSk7CisJCQlrZXlmaWxlID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoc2trZXlzLCBpKTsKKwkJCXNpZ25lciA9IGxvYWRfY2VydChiaW9fZXJyLCBzaWduZXJmaWxlLEZPUk1BVF9QRU0sIE5VTEwsCisJCQkJCWUsICJzaWduZXIgY2VydGlmaWNhdGUiKTsKKwkJCWlmICghc2lnbmVyKQorCQkJCWdvdG8gZW5kOworCQkJa2V5ID0gbG9hZF9rZXkoYmlvX2Vyciwga2V5ZmlsZSwga2V5Zm9ybSwgMCwgcGFzc2luLCBlLAorCQkJICAgICAgICJzaWduaW5nIGtleSBmaWxlIik7CisJCQlpZiAoIWtleSkKKwkJCQlnb3RvIGVuZDsKKwkJCWlmICghUEtDUzdfc2lnbl9hZGRfc2lnbmVyKHA3LCBzaWduZXIsIGtleSwKKwkJCQkJCXNpZ25fbWQsIGZsYWdzKSkKKwkJCQlnb3RvIGVuZDsKKwkJCVg1MDlfZnJlZShzaWduZXIpOworCQkJc2lnbmVyID0gTlVMTDsKKwkJCUVWUF9QS0VZX2ZyZWUoa2V5KTsKKwkJCWtleSA9IE5VTEw7CisJCQl9CisJCS8qIElmIG5vdCBzdHJlYW1pbmcgb3IgcmVzaWduaW5nIGZpbmFsaXplIHN0cnVjdHVyZSAqLworCQlpZiAoKG9wZXJhdGlvbiA9PSBTTUlNRV9TSUdOKSAmJiAhKGZsYWdzICYgUEtDUzdfU1RSRUFNKSkKKwkJCXsKKwkJCWlmICghUEtDUzdfZmluYWwocDcsIGluLCBmbGFncykpCisJCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmICghcDcpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgY3JlYXRpbmcgUEtDUyM3IHN0cnVjdHVyZVxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlyZXQgPSA0OworCWlmIChvcGVyYXRpb24gPT0gU01JTUVfREVDUllQVCkKKwkJeworCQlpZiAoIVBLQ1M3X2RlY3J5cHQocDcsIGtleSwgcmVjaXAsIG91dCwgZmxhZ3MpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgZGVjcnlwdGluZyBQS0NTIzcgc3RydWN0dXJlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJZWxzZSBpZiAob3BlcmF0aW9uID09IFNNSU1FX1ZFUklGWSkKKwkJeworCQlTVEFDS19PRihYNTA5KSAqc2lnbmVyczsKKwkJaWYgKFBLQ1M3X3ZlcmlmeShwNywgb3RoZXIsIHN0b3JlLCBpbmRhdGEsIG91dCwgZmxhZ3MpKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiVmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWxcbiIpOworCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJWZXJpZmljYXRpb24gZmFpbHVyZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJc2lnbmVycyA9IFBLQ1M3X2dldDBfc2lnbmVycyhwNywgb3RoZXIsIGZsYWdzKTsKKwkJaWYgKCFzYXZlX2NlcnRzKHNpZ25lcmZpbGUsIHNpZ25lcnMpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3Igd3JpdGluZyBzaWduZXJzIHRvICVzXG4iLAorCQkJCQkJCQlzaWduZXJmaWxlKTsKKwkJCXJldCA9IDU7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJc2tfWDUwOV9mcmVlKHNpZ25lcnMpOworCQl9CisJZWxzZSBpZiAob3BlcmF0aW9uID09IFNNSU1FX1BLN09VVCkKKwkJUEVNX3dyaXRlX2Jpb19QS0NTNyhvdXQsIHA3KTsKKwllbHNlCisJCXsKKwkJaWYgKHRvKQorCQkJQklPX3ByaW50ZihvdXQsICJUbzogJXNcbiIsIHRvKTsKKwkJaWYgKGZyb20pCisJCQlCSU9fcHJpbnRmKG91dCwgIkZyb206ICVzXG4iLCBmcm9tKTsKKwkJaWYgKHN1YmplY3QpCisJCQlCSU9fcHJpbnRmKG91dCwgIlN1YmplY3Q6ICVzXG4iLCBzdWJqZWN0KTsKKwkJaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfU01JTUUpIAorCQkJeworCQkJaWYgKG9wZXJhdGlvbiA9PSBTTUlNRV9SRVNJR04pCisJCQkJU01JTUVfd3JpdGVfUEtDUzcob3V0LCBwNywgaW5kYXRhLCBmbGFncyk7CisJCQllbHNlCisJCQkJU01JTUVfd3JpdGVfUEtDUzcob3V0LCBwNywgaW4sIGZsYWdzKTsKKwkJCX0KKwkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pIAorCQkJUEVNX3dyaXRlX2Jpb19QS0NTN19zdHJlYW0ob3V0LCBwNywgaW4sIGZsYWdzKTsKKwkJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKSAKKwkJCWkyZF9QS0NTN19iaW9fc3RyZWFtKG91dCxwNywgaW4sIGZsYWdzKTsKKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiQmFkIG91dHB1dCBmb3JtYXQgZm9yIFBLQ1MjNyBmaWxlXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJcmV0ID0gMDsKK2VuZDoKKwlpZiAobmVlZF9yYW5kKQorCQlhcHBfUkFORF93cml0ZV9maWxlKE5VTEwsIGJpb19lcnIpOworCWlmIChyZXQpIEVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJc2tfWDUwOV9wb3BfZnJlZShlbmNlcnRzLCBYNTA5X2ZyZWUpOworCXNrX1g1MDlfcG9wX2ZyZWUob3RoZXIsIFg1MDlfZnJlZSk7CisJaWYgKHZwbSkKKwkJWDUwOV9WRVJJRllfUEFSQU1fZnJlZSh2cG0pOworCWlmIChza3NpZ25lcnMpCisJCXNrX09QRU5TU0xfU1RSSU5HX2ZyZWUoc2tzaWduZXJzKTsKKwlpZiAoc2trZXlzKQorCQlza19PUEVOU1NMX1NUUklOR19mcmVlKHNra2V5cyk7CisJWDUwOV9TVE9SRV9mcmVlKHN0b3JlKTsKKwlYNTA5X2ZyZWUoY2VydCk7CisJWDUwOV9mcmVlKHJlY2lwKTsKKwlYNTA5X2ZyZWUoc2lnbmVyKTsKKwlFVlBfUEtFWV9mcmVlKGtleSk7CisJUEtDUzdfZnJlZShwNyk7CisJQklPX2ZyZWUoaW4pOworCUJJT19mcmVlKGluZGF0YSk7CisJQklPX2ZyZWVfYWxsKG91dCk7CisJaWYgKHBhc3NpbikgT1BFTlNTTF9mcmVlKHBhc3Npbik7CisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgaW50IHNhdmVfY2VydHMoY2hhciAqc2lnbmVyZmlsZSwgU1RBQ0tfT0YoWDUwOSkgKnNpZ25lcnMpCisJeworCWludCBpOworCUJJTyAqdG1wOworCWlmICghc2lnbmVyZmlsZSkKKwkJcmV0dXJuIDE7CisJdG1wID0gQklPX25ld19maWxlKHNpZ25lcmZpbGUsICJ3Iik7CisJaWYgKCF0bXApIHJldHVybiAwOworCWZvcihpID0gMDsgaSA8IHNrX1g1MDlfbnVtKHNpZ25lcnMpOyBpKyspCisJCVBFTV93cml0ZV9iaW9fWDUwOSh0bXAsIHNrX1g1MDlfdmFsdWUoc2lnbmVycywgaSkpOworCUJJT19mcmVlKHRtcCk7CisJcmV0dXJuIDE7CisJfQorCQorCisvKiBNaW5pbWFsIGNhbGxiYWNrIGp1c3QgdG8gb3V0cHV0IHBvbGljeSBpbmZvIChpZiBhbnkpICovCisKK3N0YXRpYyBpbnQgc21pbWVfY2IoaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihjdHgpOworCisJaWYgKChlcnJvciAhPSBYNTA5X1ZfRVJSX05PX0VYUExJQ0lUX1BPTElDWSkKKwkJJiYgKChlcnJvciAhPSBYNTA5X1ZfT0spIHx8IChvayAhPSAyKSkpCisJCXJldHVybiBvazsKKworCXBvbGljaWVzX3ByaW50KE5VTEwsIGN0eCk7CisKKwlyZXR1cm4gb2s7CisKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3NwZWVkLmMgYi9saWIvb3BlbnNzbC9hcHBzL3NwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwMzg2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvc3BlZWQuYwpAQCAtMCwwICsxLDI3OTEgQEAKKy8qIGFwcHMvc3BlZWQuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIEVDREggYW5kIEVDRFNBIHNwZWVkIHRlc3Qgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IAorICogU3VtaXQgR3VwdGEgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisKKy8qIG1vc3Qgb2YgdGhpcyBjb2RlIGhhcyBiZWVuIHBpbGZlcmVkIGZyb20gbXkgbGliZGVzIHNwZWVkLmMgcHJvZ3JhbSAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fU1BFRUQKKworI3VuZGVmIFNFQ09ORFMKKyNkZWZpbmUgU0VDT05EUwkJMwkKKyNkZWZpbmUgUlNBX1NFQ09ORFMJMTAKKyNkZWZpbmUgRFNBX1NFQ09ORFMJMTAKKyNkZWZpbmUgRUNEU0FfU0VDT05EUyAgIDEwCisjZGVmaW5lIEVDREhfU0VDT05EUyAgICAxMAorCisvKiAxMS1TZXAtOTIgQW5kcmV3IERhdmllbCAgIFN1cHBvcnQgZm9yIFNpbGljb24gR3JhcGhpY3MgSVJJWCBhZGRlZCAqLworLyogMDYtQXByLTkyIEx1a2UgQnJlbm5hbiAgICBTdXBwb3J0IGZvciBWTVMgYW5kIGFkZCBleHRyYSBzaWduYWwgY2FsbHMgKi8KKworI3VuZGVmIFBST0cKKyNkZWZpbmUgUFJPRyBzcGVlZF9tYWluCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpZmRlZiBPUEVOU1NMX05PX1NURElPCisjZGVmaW5lIEFQUFNfV0lOMTYKKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKQorI2luY2x1ZGUgT1BFTlNTTF9VTklTVEQKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfU1lTX05FVFdBUkUKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorI2luY2x1ZGUgPG9wZW5zc2wvY2FtZWxsaWEuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01EMgorI2luY2x1ZGUgPG9wZW5zc2wvbWQyLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NREMyCisjaW5jbHVkZSA8b3BlbnNzbC9tZGMyLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDQKKyNpbmNsdWRlIDxvcGVuc3NsL21kNC5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0hNQUMKKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JJUEVNRAorI2luY2x1ZGUgPG9wZW5zc2wvcmlwZW1kLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19XSElSTFBPT0wKKyNpbmNsdWRlIDxvcGVuc3NsL3docmxwb29sLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKyNpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM1CisjaW5jbHVkZSA8b3BlbnNzbC9yYzUuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorI2luY2x1ZGUgPG9wZW5zc2wvcmMyLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisjaW5jbHVkZSA8b3BlbnNzbC9pZGVhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisjaW5jbHVkZSA8b3BlbnNzbC9zZWVkLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CRgorI2luY2x1ZGUgPG9wZW5zc2wvYmxvd2Zpc2guaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKKyNpbmNsdWRlIDxvcGVuc3NsL2Nhc3QuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSAiLi90ZXN0cnNhLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2luY2x1ZGUgIi4vdGVzdGRzYS5oIgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisjaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0ZPUksKKyMgaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NQUNJTlRPU0hfQ0xBU1NJQykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19PUzIpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkKKyMgIGRlZmluZSBIQVZFX0ZPUksgMAorIyBlbHNlCisjICBkZWZpbmUgSEFWRV9GT1JLIDEKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgSEFWRV9GT1JLCisjdW5kZWYgTk9fRk9SSworI2Vsc2UKKyNkZWZpbmUgTk9fRk9SSworI2VuZGlmCisKKyN1bmRlZiBCVUZTSVpFCisjZGVmaW5lIEJVRlNJWkUJKChsb25nKTEwMjQqOCsxKQoraW50IHJ1bj0wOworCitzdGF0aWMgaW50IG1yPTA7CitzdGF0aWMgaW50IHVzZXJ0aW1lPTE7CisKK3N0YXRpYyBkb3VibGUgVGltZV9GKGludCBzKTsKK3N0YXRpYyB2b2lkIHByaW50X21lc3NhZ2UoY29uc3QgY2hhciAqcyxsb25nIG51bSxpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIHBrZXlfcHJpbnRfbWVzc2FnZShjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnN0cjIsCisJbG9uZyBudW0sIGludCBiaXRzLCBpbnQgc2VjKTsKK3N0YXRpYyB2b2lkIHByaW50X3Jlc3VsdChpbnQgYWxnLGludCBydW5fbm8saW50IGNvdW50LGRvdWJsZSB0aW1lX3VzZWQpOworI2lmbmRlZiBOT19GT1JLCitzdGF0aWMgaW50IGRvX211bHRpKGludCBtdWx0aSk7CisjZW5kaWYKKworI2RlZmluZSBBTEdPUl9OVU0JMjkKKyNkZWZpbmUgU0laRV9OVU0JNQorI2RlZmluZSBSU0FfTlVNCQk0CisjZGVmaW5lIERTQV9OVU0JCTMKKworI2RlZmluZSBFQ19OVU0gICAgICAgMTYKKyNkZWZpbmUgTUFYX0VDREhfU0laRSAyNTYKKworc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzW0FMR09SX05VTV09eworICAibWQyIiwibWRjMiIsIm1kNCIsIm1kNSIsImhtYWMobWQ1KSIsInNoYTEiLCJybWQxNjAiLCJyYzQiLAorICAiZGVzIGNiYyIsImRlcyBlZGUzIiwiaWRlYSBjYmMiLCJzZWVkIGNiYyIsCisgICJyYzIgY2JjIiwicmM1LTMyLzEyIGNiYyIsImJsb3dmaXNoIGNiYyIsImNhc3QgY2JjIiwKKyAgImFlcy0xMjggY2JjIiwiYWVzLTE5MiBjYmMiLCJhZXMtMjU2IGNiYyIsCisgICJjYW1lbGxpYS0xMjggY2JjIiwiY2FtZWxsaWEtMTkyIGNiYyIsImNhbWVsbGlhLTI1NiBjYmMiLAorICAiZXZwIiwic2hhMjU2Iiwic2hhNTEyIiwid2hpcmxwb29sIiwKKyAgImFlcy0xMjggaWdlIiwiYWVzLTE5MiBpZ2UiLCJhZXMtMjU2IGlnZSJ9Oworc3RhdGljIGRvdWJsZSByZXN1bHRzW0FMR09SX05VTV1bU0laRV9OVU1dOworc3RhdGljIGludCBsZW5ndGhzW1NJWkVfTlVNXT17MTYsNjQsMjU2LDEwMjQsOCoxMDI0fTsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK3N0YXRpYyBkb3VibGUgcnNhX3Jlc3VsdHNbUlNBX05VTV1bMl07CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKK3N0YXRpYyBkb3VibGUgZHNhX3Jlc3VsdHNbRFNBX05VTV1bMl07CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorc3RhdGljIGRvdWJsZSBlY2RzYV9yZXN1bHRzW0VDX05VTV1bMl07CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICitzdGF0aWMgZG91YmxlIGVjZGhfcmVzdWx0c1tFQ19OVU1dWzFdOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfTk9fRFNBKSAmJiAhKGRlZmluZWQoT1BFTlNTTF9OT19FQ0RTQSkgJiYgZGVmaW5lZChPUEVOU1NMX05PX0VDREgpKQorc3RhdGljIGNvbnN0IGNoYXIgcm5kX3NlZWRbXSA9ICJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHkiOworc3RhdGljIGludCBybmRfZmFrZSA9IDA7CisjZW5kaWYKKworI2lmZGVmIFNJR0FMUk0KKyNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKHNnaSkgfHwgZGVmaW5lZChfQUlYKQorI2RlZmluZSBTSUdSRVRUWVBFIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNJR1JFVFRZUEUgaW50CisjZW5kaWYgCisKK3N0YXRpYyBTSUdSRVRUWVBFIHNpZ19kb25lKGludCBzaWcpOworc3RhdGljIFNJR1JFVFRZUEUgc2lnX2RvbmUoaW50IHNpZykKKwl7CisJc2lnbmFsKFNJR0FMUk0sc2lnX2RvbmUpOworCXJ1bj0wOworI2lmZGVmIExJTlQKKwlzaWc9c2lnOworI2VuZGlmCisJfQorI2VuZGlmCisKKyNkZWZpbmUgU1RBUlQJMAorI2RlZmluZSBTVE9QCTEKKworI2lmIGRlZmluZWQoX1dJTjMyKQorCisjZGVmaW5lIFNJR0FMUk0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbGFwc2Usc2NobG9jazsKK3N0YXRpYyB2b2lkIGFsYXJtKHVuc2lnbmVkIGludCBzZWNzKSB7IGxhcHNlID0gc2VjcyoxMDAwOyB9CisKK3N0YXRpYyBEV09SRCBXSU5BUEkgc2xlZXB5KFZPSUQgKmFyZykKKwl7CisJc2NobG9jayA9IDE7CisJU2xlZXAobGFwc2UpOworCXJ1biA9IDA7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgZG91YmxlIFRpbWVfRihpbnQgcykKKwl7CisJaWYgKHMgPT0gU1RBUlQpCisJCXsKKwkJSEFORExFCXRocjsKKwkJc2NobG9jayA9IDA7CisJCXRociA9IENyZWF0ZVRocmVhZChOVUxMLDQwOTYsc2xlZXB5LE5VTEwsMCxOVUxMKTsKKwkJaWYgKHRocj09TlVMTCkKKwkJCXsKKwkJCURXT1JEIHJldD1HZXRMYXN0RXJyb3IoKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIENyZWF0ZVRocmVhZCAoJWQpIixyZXQpOworCQkJRXhpdFByb2Nlc3MocmV0KTsKKwkJCX0KKwkJQ2xvc2VIYW5kbGUodGhyKTsJCS8qIGRldGFjaCB0aGUgdGhyZWFkCSovCisJCXdoaWxlICghc2NobG9jaykgU2xlZXAoMCk7CS8qIHNjaGVkdWxlciBzcGlubG9jawkqLworCQl9CisKKwlyZXR1cm4gYXBwX3RtaW50ZXJ2YWwocyx1c2VydGltZSk7CisJfQorI2Vsc2UKKworc3RhdGljIGRvdWJsZSBUaW1lX0YoaW50IHMpCisJeworCXJldHVybiBhcHBfdG1pbnRlcnZhbChzLHVzZXJ0aW1lKTsKKwl9CisjZW5kaWYKKworCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorc3RhdGljIGNvbnN0IGludCBLREYxX1NIQTFfbGVuID0gMjA7CitzdGF0aWMgdm9pZCAqS0RGMV9TSEExKGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4sIHZvaWQgKm91dCwgc2l6ZV90ICpvdXRsZW4pCisJeworI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorCWlmICgqb3V0bGVuIDwgU0hBX0RJR0VTVF9MRU5HVEgpCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJKm91dGxlbiA9IFNIQV9ESUdFU1RfTEVOR1RIOworCXJldHVybiBTSEExKGluLCBpbmxlbiwgb3V0KTsKKyNlbHNlCisJcmV0dXJuIE5VTEw7CisjZW5kaWYJLyogT1BFTlNTTF9OT19TSEEgKi8KKwl9CisjZW5kaWYJLyogT1BFTlNTTF9OT19FQ0RIICovCisKKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlFTkdJTkUgKmUgPSBOVUxMOworI2VuZGlmCisJdW5zaWduZWQgY2hhciAqYnVmPU5VTEwsKmJ1ZjI9TlVMTDsKKwlpbnQgbXJldD0xOworCWxvbmcgY291bnQ9MCxzYXZlX2NvdW50PTA7CisJaW50IGksaixrOworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fUlNBKSB8fCAhZGVmaW5lZChPUEVOU1NMX05PX0RTQSkKKwlsb25nIHJzYV9jb3VudDsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXVuc2lnbmVkIHJzYV9udW07CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyIG1kW0VWUF9NQVhfTURfU0laRV07CisjaWZuZGVmIE9QRU5TU0xfTk9fTUQyCisJdW5zaWduZWQgY2hhciBtZDJbTUQyX0RJR0VTVF9MRU5HVEhdOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTURDMgorCXVuc2lnbmVkIGNoYXIgbWRjMltNREMyX0RJR0VTVF9MRU5HVEhdOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ0CisJdW5zaWduZWQgY2hhciBtZDRbTUQ0X0RJR0VTVF9MRU5HVEhdOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisJdW5zaWduZWQgY2hhciBtZDVbTUQ1X0RJR0VTVF9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgaG1hY1tNRDVfRElHRVNUX0xFTkdUSF07CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKwl1bnNpZ25lZCBjaGFyIHNoYVtTSEFfRElHRVNUX0xFTkdUSF07CisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBMjU2CisJdW5zaWduZWQgY2hhciBzaGEyNTZbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBNTEyCisJdW5zaWduZWQgY2hhciBzaGE1MTJbU0hBNTEyX0RJR0VTVF9MRU5HVEhdOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19XSElSTFBPT0wKKwl1bnNpZ25lZCBjaGFyIHdoaXJscG9vbFtXSElSTFBPT0xfRElHRVNUX0xFTkdUSF07CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SSVBFTUQKKwl1bnNpZ25lZCBjaGFyIHJtZDE2MFtSSVBFTUQxNjBfRElHRVNUX0xFTkdUSF07CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKwlSQzRfS0VZIHJjNF9rczsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDNQorCVJDNV8zMl9LRVkgcmM1X2tzOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkMyCisJUkMyX0tFWSByYzJfa3M7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJSURFQV9LRVlfU0NIRURVTEUgaWRlYV9rczsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKKwlTRUVEX0tFWV9TQ0hFRFVMRSBzZWVkX2tzOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQkYKKwlCRl9LRVkgYmZfa3M7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQVNUCisJQ0FTVF9LRVkgY2FzdF9rczsKKyNlbmRpZgorCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtleTE2WzE2XT0KKwkJezB4MTIsMHgzNCwweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwKKwkJIDB4MzQsMHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsMHgxMn07CisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5MjRbMjRdPQorCQl7MHgxMiwweDM0LDB4NTYsMHg3OCwweDlhLDB4YmMsMHhkZSwweGYwLAorCQkgMHgzNCwweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwweDEyLAorCQkgMHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsMHgxMiwweDM0fTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrZXkzMlszMl09CisJCXsweDEyLDB4MzQsMHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsCisJCSAweDM0LDB4NTYsMHg3OCwweDlhLDB4YmMsMHhkZSwweGYwLDB4MTIsCisJCSAweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwweDEyLDB4MzQsCisJCSAweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsMHgxMiwweDM0LDB4NTZ9OworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBja2V5MjRbMjRdPQorCQl7MHgxMiwweDM0LDB4NTYsMHg3OCwweDlhLDB4YmMsMHhkZSwweGYwLAorCQkgMHgzNCwweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwweDEyLAorCQkgMHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsMHgxMiwweDM0fTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBja2V5MzJbMzJdPQorCQl7MHgxMiwweDM0LDB4NTYsMHg3OCwweDlhLDB4YmMsMHhkZSwweGYwLAorCQkgMHgzNCwweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwweDEyLAorCQkgMHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsMHgxMiwweDM0LAorCQkgMHg3OCwweDlhLDB4YmMsMHhkZSwweGYwLDB4MTIsMHgzNCwweDU2fTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworI2RlZmluZSBNQVhfQkxPQ0tfU0laRSAxMjgKKyNlbHNlCisjZGVmaW5lIE1BWF9CTE9DS19TSVpFIDY0CisjZW5kaWYKKwl1bnNpZ25lZCBjaGFyIERFU19pdls4XTsKKwl1bnNpZ25lZCBjaGFyIGl2WzIqTUFYX0JMT0NLX1NJWkUvOF07CisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJREVTX2NibG9jayAqYnVmX2FzX2Rlc19jYmxvY2sgPSBOVUxMOworCXN0YXRpYyBERVNfY2Jsb2NrIGtleSA9ezB4MTIsMHgzNCwweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMH07CisJc3RhdGljIERFU19jYmxvY2sga2V5Mj17MHgzNCwweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwweDEyfTsKKwlzdGF0aWMgREVTX2NibG9jayBrZXkzPXsweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwweDEyLDB4MzR9OworCURFU19rZXlfc2NoZWR1bGUgc2NoOworCURFU19rZXlfc2NoZWR1bGUgc2NoMjsKKwlERVNfa2V5X3NjaGVkdWxlIHNjaDM7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwlBRVNfS0VZIGFlc19rczEsIGFlc19rczIsIGFlc19rczM7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCUNBTUVMTElBX0tFWSBjYW1lbGxpYV9rczEsIGNhbWVsbGlhX2tzMiwgY2FtZWxsaWFfa3MzOworI2VuZGlmCisjZGVmaW5lCURfTUQyCQkwCisjZGVmaW5lCURfTURDMgkJMQorI2RlZmluZQlEX01ENAkJMgorI2RlZmluZQlEX01ENQkJMworI2RlZmluZQlEX0hNQUMJCTQKKyNkZWZpbmUJRF9TSEExCQk1CisjZGVmaW5lIERfUk1EMTYwCTYKKyNkZWZpbmUJRF9SQzQJCTcKKyNkZWZpbmUJRF9DQkNfREVTCTgKKyNkZWZpbmUJRF9FREUzX0RFUwk5CisjZGVmaW5lCURfQ0JDX0lERUEJMTAKKyNkZWZpbmUJRF9DQkNfU0VFRAkxMQorI2RlZmluZQlEX0NCQ19SQzIJMTIKKyNkZWZpbmUJRF9DQkNfUkM1CTEzCisjZGVmaW5lCURfQ0JDX0JGCTE0CisjZGVmaW5lCURfQ0JDX0NBU1QJMTUKKyNkZWZpbmUgRF9DQkNfMTI4X0FFUwkxNgorI2RlZmluZSBEX0NCQ18xOTJfQUVTCTE3CisjZGVmaW5lIERfQ0JDXzI1Nl9BRVMJMTgKKyNkZWZpbmUgRF9DQkNfMTI4X0NNTCAgIDE5IAorI2RlZmluZSBEX0NCQ18xOTJfQ01MICAgMjAKKyNkZWZpbmUgRF9DQkNfMjU2X0NNTCAgIDIxIAorI2RlZmluZSBEX0VWUAkJMjIKKyNkZWZpbmUgRF9TSEEyNTYJMjMJCisjZGVmaW5lIERfU0hBNTEyCTI0CisjZGVmaW5lIERfV0hJUkxQT09MCTI1CisjZGVmaW5lIERfSUdFXzEyOF9BRVMgICAyNgorI2RlZmluZSBEX0lHRV8xOTJfQUVTICAgMjcKKyNkZWZpbmUgRF9JR0VfMjU2X0FFUyAgIDI4CisJZG91YmxlIGQ9MC4wOworCWxvbmcgY1tBTEdPUl9OVU1dW1NJWkVfTlVNXTsKKyNkZWZpbmUJUl9EU0FfNTEyCTAKKyNkZWZpbmUJUl9EU0FfMTAyNAkxCisjZGVmaW5lCVJfRFNBXzIwNDgJMgorI2RlZmluZQlSX1JTQV81MTIJMAorI2RlZmluZQlSX1JTQV8xMDI0CTEKKyNkZWZpbmUJUl9SU0FfMjA0OAkyCisjZGVmaW5lCVJfUlNBXzQwOTYJMworCisjZGVmaW5lIFJfRUNfUDE2MCAgICAwCisjZGVmaW5lIFJfRUNfUDE5MiAgICAxCQorI2RlZmluZSBSX0VDX1AyMjQgICAgMgorI2RlZmluZSBSX0VDX1AyNTYgICAgMworI2RlZmluZSBSX0VDX1AzODQgICAgNAorI2RlZmluZSBSX0VDX1A1MjEgICAgNQorI2RlZmluZSBSX0VDX0sxNjMgICAgNgorI2RlZmluZSBSX0VDX0syMzMgICAgNworI2RlZmluZSBSX0VDX0syODMgICAgOAorI2RlZmluZSBSX0VDX0s0MDkgICAgOQorI2RlZmluZSBSX0VDX0s1NzEgICAgMTAKKyNkZWZpbmUgUl9FQ19CMTYzICAgIDExCisjZGVmaW5lIFJfRUNfQjIzMyAgICAxMgorI2RlZmluZSBSX0VDX0IyODMgICAgMTMKKyNkZWZpbmUgUl9FQ19CNDA5ICAgIDE0CisjZGVmaW5lIFJfRUNfQjU3MSAgICAxNQorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJUlNBICpyc2Ffa2V5W1JTQV9OVU1dOworCWxvbmcgcnNhX2NbUlNBX05VTV1bMl07CisJc3RhdGljIHVuc2lnbmVkIGludCByc2FfYml0c1tSU0FfTlVNXT17NTEyLDEwMjQsMjA0OCw0MDk2fTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciAqcnNhX2RhdGFbUlNBX05VTV09CisJCXt0ZXN0NTEyLHRlc3QxMDI0LHRlc3QyMDQ4LHRlc3Q0MDk2fTsKKwlzdGF0aWMgaW50IHJzYV9kYXRhX2xlbmd0aFtSU0FfTlVNXT17CisJCXNpemVvZih0ZXN0NTEyKSxzaXplb2YodGVzdDEwMjQpLAorCQlzaXplb2YodGVzdDIwNDgpLHNpemVvZih0ZXN0NDA5Nil9OworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJRFNBICpkc2Ffa2V5W0RTQV9OVU1dOworCWxvbmcgZHNhX2NbRFNBX05VTV1bMl07CisJc3RhdGljIHVuc2lnbmVkIGludCBkc2FfYml0c1tEU0FfTlVNXT17NTEyLDEwMjQsMjA0OH07CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCS8qIFdlIG9ubHkgdGVzdCBvdmVyIHRoZSBmb2xsb3dpbmcgY3VydmVzIGFzIHRoZXkgYXJlIHJlcHJlc2VudGF0aXZlLCAKKwkgKiBUbyBhZGQgdGVzdHMgb3ZlciBtb3JlIGN1cnZlcywgc2ltcGx5IGFkZCB0aGUgY3VydmUgTklECisJICogYW5kIGN1cnZlIG5hbWUgdG8gdGhlIGZvbGxvd2luZyBhcnJheXMgYW5kIGluY3JlYXNlIHRoZSAKKwkgKiBFQ19OVU0gdmFsdWUgYWNjb3JkaW5nbHkuIAorCSAqLworCXN0YXRpYyB1bnNpZ25lZCBpbnQgdGVzdF9jdXJ2ZXNbRUNfTlVNXSA9IAorCXsJCisJLyogUHJpbWUgQ3VydmVzICovCisJTklEX3NlY3AxNjByMSwKKwlOSURfWDlfNjJfcHJpbWUxOTJ2MSwKKwlOSURfc2VjcDIyNHIxLAorCU5JRF9YOV82Ml9wcmltZTI1NnYxLAorCU5JRF9zZWNwMzg0cjEsCisJTklEX3NlY3A1MjFyMSwKKwkvKiBCaW5hcnkgQ3VydmVzICovCisJTklEX3NlY3QxNjNrMSwKKwlOSURfc2VjdDIzM2sxLAorCU5JRF9zZWN0MjgzazEsCisJTklEX3NlY3Q0MDlrMSwKKwlOSURfc2VjdDU3MWsxLAorCU5JRF9zZWN0MTYzcjIsCisJTklEX3NlY3QyMzNyMSwKKwlOSURfc2VjdDI4M3IxLAorCU5JRF9zZWN0NDA5cjEsCisJTklEX3NlY3Q1NzFyMQorCX07IAorCXN0YXRpYyBjb25zdCBjaGFyICogdGVzdF9jdXJ2ZXNfbmFtZXNbRUNfTlVNXSA9IAorCXsKKwkvKiBQcmltZSBDdXJ2ZXMgKi8KKwkic2VjcDE2MHIxIiwKKwkibmlzdHAxOTIiLAorCSJuaXN0cDIyNCIsCisJIm5pc3RwMjU2IiwKKwkibmlzdHAzODQiLAorCSJuaXN0cDUyMSIsCisJLyogQmluYXJ5IEN1cnZlcyAqLworCSJuaXN0azE2MyIsCisJIm5pc3RrMjMzIiwKKwkibmlzdGsyODMiLAorCSJuaXN0azQwOSIsCisJIm5pc3RrNTcxIiwKKwkibmlzdGIxNjMiLAorCSJuaXN0YjIzMyIsCisJIm5pc3RiMjgzIiwKKwkibmlzdGI0MDkiLAorCSJuaXN0YjU3MSIKKwl9OworCXN0YXRpYyBpbnQgdGVzdF9jdXJ2ZXNfYml0c1tFQ19OVU1dID0KKyAgICAgICAgeworICAgICAgICAxNjAsIDE5MiwgMjI0LCAyNTYsIDM4NCwgNTIxLAorICAgICAgICAxNjMsIDIzMywgMjgzLCA0MDksIDU3MSwKKyAgICAgICAgMTYzLCAyMzMsIDI4MywgNDA5LCA1NzEKKyAgICAgICAgfTsKKworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCXVuc2lnbmVkIGNoYXIgZWNkc2FzaWdbMjU2XTsKKwl1bnNpZ25lZCBpbnQgZWNkc2FzaWdsZW47CisJRUNfS0VZICplY2RzYVtFQ19OVU1dOworCWxvbmcgZWNkc2FfY1tFQ19OVU1dWzJdOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJRUNfS0VZICplY2RoX2FbRUNfTlVNXSwgKmVjZGhfYltFQ19OVU1dOworCXVuc2lnbmVkIGNoYXIgc2VjcmV0X2FbTUFYX0VDREhfU0laRV0sIHNlY3JldF9iW01BWF9FQ0RIX1NJWkVdOworCWludCBzZWNyZXRfc2l6ZV9hLCBzZWNyZXRfc2l6ZV9iOworCWludCBlY2RoX2NoZWNrcyA9IDA7CisJaW50IHNlY3JldF9pZHggPSAwOworCWxvbmcgZWNkaF9jW0VDX05VTV1bMl07CisjZW5kaWYKKworCWludCByc2FfZG9pdFtSU0FfTlVNXTsKKwlpbnQgZHNhX2RvaXRbRFNBX05VTV07CisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwlpbnQgZWNkc2FfZG9pdFtFQ19OVU1dOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorICAgICAgICBpbnQgZWNkaF9kb2l0W0VDX05VTV07CisjZW5kaWYKKwlpbnQgZG9pdFtBTEdPUl9OVU1dOworCWludCBwcl9oZWFkZXI9MDsKKwljb25zdCBFVlBfQ0lQSEVSICpldnBfY2lwaGVyPU5VTEw7CisJY29uc3QgRVZQX01EICpldnBfbWQ9TlVMTDsKKwlpbnQgZGVjcnlwdD0wOworI2lmbmRlZiBOT19GT1JLCisJaW50IG11bHRpPTA7CisjZW5kaWYKKworI2lmbmRlZiBUSU1FUworCXVzZXJ0aW1lPS0xOworI2VuZGlmCisKKwlhcHBzX3N0YXJ0dXAoKTsKKwltZW1zZXQocmVzdWx0cywgMCwgc2l6ZW9mKHJlc3VsdHMpKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwltZW1zZXQoZHNhX2tleSwwLHNpemVvZihkc2Ffa2V5KSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCWZvciAoaT0wOyBpPEVDX05VTTsgaSsrKSBlY2RzYVtpXSA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJZm9yIChpPTA7IGk8RUNfTlVNOyBpKyspCisJCXsKKwkJZWNkaF9hW2ldID0gTlVMTDsKKwkJZWNkaF9iW2ldID0gTlVMTDsKKwkJfQorI2VuZGlmCisKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJbWVtc2V0KHJzYV9rZXksMCxzaXplb2YocnNhX2tleSkpOworCWZvciAoaT0wOyBpPFJTQV9OVU07IGkrKykKKwkJcnNhX2tleVtpXT1OVUxMOworI2VuZGlmCisKKwlpZiAoKGJ1Zj0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpQlVGU0laRSkpID09IE5VTEwpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJvdXQgb2YgbWVtb3J5XG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwlidWZfYXNfZGVzX2NibG9jayA9IChERVNfY2Jsb2NrICopYnVmOworI2VuZGlmCisJaWYgKChidWYyPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKGludClCVUZTSVpFKSkgPT0gTlVMTCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsIm91dCBvZiBtZW1vcnlcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJbWVtc2V0KGMsMCxzaXplb2YoYykpOworCW1lbXNldChERVNfaXYsMCxzaXplb2YoREVTX2l2KSk7CisJbWVtc2V0KGl2LDAsc2l6ZW9mKGl2KSk7CisKKwlmb3IgKGk9MDsgaTxBTEdPUl9OVU07IGkrKykKKwkJZG9pdFtpXT0wOworCWZvciAoaT0wOyBpPFJTQV9OVU07IGkrKykKKwkJcnNhX2RvaXRbaV09MDsKKwlmb3IgKGk9MDsgaTxEU0FfTlVNOyBpKyspCisJCWRzYV9kb2l0W2ldPTA7CisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwlmb3IgKGk9MDsgaTxFQ19OVU07IGkrKykKKwkJZWNkc2FfZG9pdFtpXT0wOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWZvciAoaT0wOyBpPEVDX05VTTsgaSsrKQorCQllY2RoX2RvaXRbaV09MDsKKyNlbmRpZgorCisJCisJaj0wOworCWFyZ2MtLTsKKwlhcmd2Kys7CisJd2hpbGUgKGFyZ2MpCisJCXsKKwkJaWYJKChhcmdjID4gMCkgJiYgKHN0cmNtcCgqYXJndiwiLWVsYXBzZWQiKSA9PSAwKSkKKwkJCXsKKwkJCXVzZXJ0aW1lID0gMDsKKwkJCWotLTsJLyogT3RoZXJ3aXNlLCAtZWxhcHNlZCBnZXRzIGNvbmZ1c2VkIHdpdGgKKwkJCQkgICBhbiBhbGdvcml0aG0uICovCisJCQl9CisJCWVsc2UgaWYJKChhcmdjID4gMCkgJiYgKHN0cmNtcCgqYXJndiwiLWV2cCIpID09IDApKQorCQkJeworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJaWYoYXJnYyA9PSAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vIEVWUCBnaXZlblxuIik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJZXZwX2NpcGhlcj1FVlBfZ2V0X2NpcGhlcmJ5bmFtZSgqYXJndik7CisJCQlpZighZXZwX2NpcGhlcikKKwkJCQl7CisJCQkJZXZwX21kPUVWUF9nZXRfZGlnZXN0YnluYW1lKCphcmd2KTsKKwkJCQl9CisJCQlpZighZXZwX2NpcGhlciAmJiAhZXZwX21kKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIiVzIGlzIGFuIHVua25vd24gY2lwaGVyIG9yIGRpZ2VzdFxuIiwqYXJndik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJZG9pdFtEX0VWUF09MTsKKwkJCX0KKwkJZWxzZSBpZiAoYXJnYyA+IDAgJiYgIXN0cmNtcCgqYXJndiwiLWRlY3J5cHQiKSkKKwkJCXsKKwkJCWRlY3J5cHQ9MTsKKwkJCWotLTsJLyogT3RoZXJ3aXNlLCAtZWxhcHNlZCBnZXRzIGNvbmZ1c2VkIHdpdGgKKwkJCQkgICBhbiBhbGdvcml0aG0uICovCisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWVsc2UgaWYJKChhcmdjID4gMCkgJiYgKHN0cmNtcCgqYXJndiwiLWVuZ2luZSIpID09IDApKQorCQkJeworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJaWYoYXJnYyA9PSAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vIGVuZ2luZSBnaXZlblxuIik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9IHNldHVwX2VuZ2luZShiaW9fZXJyLCAqYXJndiwgMCk7CisJCQkvKiBqIHdpbGwgYmUgaW5jcmVhc2VkIGFnYWluIGZ1cnRoZXIgZG93bi4gIFdlIGp1c3QKKwkJCSAgIGRvbid0IHdhbnQgc3BlZWQgdG8gY29uZnVzZSBhbiBlbmdpbmUgd2l0aCBhbgorCQkJICAgYWxnb3JpdGhtLCBlc3BlY2lhbGx5IHdoZW4gbm9uZSBpcyBnaXZlbiAod2hpY2gKKwkJCSAgIG1lYW5zIGFsbCBvZiB0aGVtIHNob3VsZCBiZSBydW4pICovCisJCQlqLS07CisJCQl9CisjZW5kaWYKKyNpZm5kZWYgTk9fRk9SSworCQllbHNlIGlmCSgoYXJnYyA+IDApICYmIChzdHJjbXAoKmFyZ3YsIi1tdWx0aSIpID09IDApKQorCQkJeworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJaWYoYXJnYyA9PSAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vIG11bHRpIGNvdW50IGdpdmVuXG4iKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQltdWx0aT1hdG9pKGFyZ3ZbMF0pOworCQkJaWYobXVsdGkgPD0gMCkKKwkJCSAgICB7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJiYWQgbXVsdGkgY291bnRcbiIpOworCQkJCWdvdG8gZW5kOworCQkJCX0JCQkJCisJCQlqLS07CS8qIE90aGVyd2lzZSwgLW1yIGdldHMgY29uZnVzZWQgd2l0aAorCQkJCSAgIGFuIGFsZ29yaXRobS4gKi8KKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmIChhcmdjID4gMCAmJiAhc3RyY21wKCphcmd2LCItbXIiKSkKKwkJCXsKKwkJCW1yPTE7CisJCQlqLS07CS8qIE90aGVyd2lzZSwgLW1yIGdldHMgY29uZnVzZWQgd2l0aAorCQkJCSAgIGFuIGFsZ29yaXRobS4gKi8KKwkJCX0KKwkJZWxzZQorI2lmbmRlZiBPUEVOU1NMX05PX01EMgorCQlpZgkoc3RyY21wKCphcmd2LCJtZDIiKSA9PSAwKSBkb2l0W0RfTUQyXT0xOworCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NREMyCisJCQlpZiAoc3RyY21wKCphcmd2LCJtZGMyIikgPT0gMCkgZG9pdFtEX01EQzJdPTE7CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01ENAorCQkJaWYgKHN0cmNtcCgqYXJndiwibWQ0IikgPT0gMCkgZG9pdFtEX01ENF09MTsKKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisJCQlpZiAoc3RyY21wKCphcmd2LCJtZDUiKSA9PSAwKSBkb2l0W0RfTUQ1XT0xOworCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKKwkJCWlmIChzdHJjbXAoKmFyZ3YsImhtYWMiKSA9PSAwKSBkb2l0W0RfSE1BQ109MTsKKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisJCQlpZiAoc3RyY21wKCphcmd2LCJzaGExIikgPT0gMCkgZG9pdFtEX1NIQTFdPTE7CisJCWVsc2UKKwkJCWlmIChzdHJjbXAoKmFyZ3YsInNoYSIpID09IDApCWRvaXRbRF9TSEExXT0xLAorCQkJCQkJCWRvaXRbRF9TSEEyNTZdPTEsCisJCQkJCQkJZG9pdFtEX1NIQTUxMl09MTsKKwkJZWxzZQorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTI1NgorCQkJaWYgKHN0cmNtcCgqYXJndiwic2hhMjU2IikgPT0gMCkgZG9pdFtEX1NIQTI1Nl09MTsKKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBNTEyCisJCQlpZiAoc3RyY21wKCphcmd2LCJzaGE1MTIiKSA9PSAwKSBkb2l0W0RfU0hBNTEyXT0xOworCQllbHNlCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1dISVJMUE9PTAorCQkJaWYgKHN0cmNtcCgqYXJndiwid2hpcmxwb29sIikgPT0gMCkgZG9pdFtEX1dISVJMUE9PTF09MTsKKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUklQRU1ECisJCQlpZiAoc3RyY21wKCphcmd2LCJyaXBlbWQiKSA9PSAwKSBkb2l0W0RfUk1EMTYwXT0xOworCQllbHNlCisJCQlpZiAoc3RyY21wKCphcmd2LCJybWQxNjAiKSA9PSAwKSBkb2l0W0RfUk1EMTYwXT0xOworCQllbHNlCisJCQlpZiAoc3RyY21wKCphcmd2LCJyaXBlbWQxNjAiKSA9PSAwKSBkb2l0W0RfUk1EMTYwXT0xOworCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKwkJCWlmIChzdHJjbXAoKmFyZ3YsInJjNCIpID09IDApIGRvaXRbRF9SQzRdPTE7CisJCWVsc2UgCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwkJCWlmIChzdHJjbXAoKmFyZ3YsImRlcy1jYmMiKSA9PSAwKSBkb2l0W0RfQ0JDX0RFU109MTsKKwkJZWxzZQlpZiAoc3RyY21wKCphcmd2LCJkZXMtZWRlMyIpID09IDApIGRvaXRbRF9FREUzX0RFU109MTsKKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJCQlpZiAoc3RyY21wKCphcmd2LCJhZXMtMTI4LWNiYyIpID09IDApIGRvaXRbRF9DQkNfMTI4X0FFU109MTsKKwkJZWxzZQlpZiAoc3RyY21wKCphcmd2LCJhZXMtMTkyLWNiYyIpID09IDApIGRvaXRbRF9DQkNfMTkyX0FFU109MTsKKwkJZWxzZQlpZiAoc3RyY21wKCphcmd2LCJhZXMtMjU2LWNiYyIpID09IDApIGRvaXRbRF9DQkNfMjU2X0FFU109MTsKKwkJZWxzZSAgICBpZiAoc3RyY21wKCphcmd2LCJhZXMtMTI4LWlnZSIpID09IDApIGRvaXRbRF9JR0VfMTI4X0FFU109MTsKKwkJZWxzZQlpZiAoc3RyY21wKCphcmd2LCJhZXMtMTkyLWlnZSIpID09IDApIGRvaXRbRF9JR0VfMTkyX0FFU109MTsKKwkJZWxzZQlpZiAoc3RyY21wKCphcmd2LCJhZXMtMjU2LWlnZSIpID09IDApIGRvaXRbRF9JR0VfMjU2X0FFU109MTsKKyAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCQkJaWYgKHN0cmNtcCgqYXJndiwiY2FtZWxsaWEtMTI4LWNiYyIpID09IDApIGRvaXRbRF9DQkNfMTI4X0NNTF09MTsKKwkJZWxzZSAgICBpZiAoc3RyY21wKCphcmd2LCJjYW1lbGxpYS0xOTItY2JjIikgPT0gMCkgZG9pdFtEX0NCQ18xOTJfQ01MXT0xOworCQllbHNlICAgIGlmIChzdHJjbXAoKmFyZ3YsImNhbWVsbGlhLTI1Ni1jYmMiKSA9PSAwKSBkb2l0W0RfQ0JDXzI1Nl9DTUxdPTE7CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2lmIDAgLyogd2FzOiAjaWZkZWYgUlNBcmVmICovCisJCQlpZiAoc3RyY21wKCphcmd2LCJyc2FyZWYiKSA9PSAwKSAKKwkJCXsKKwkJCVJTQV9zZXRfZGVmYXVsdF9vcGVuc3NsX21ldGhvZChSU0FfUEtDUzFfUlNBcmVmKCkpOworCQkJai0tOworCQkJfQorCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgUlNBX05VTEwKKwkJCWlmIChzdHJjbXAoKmFyZ3YsIm9wZW5zc2wiKSA9PSAwKSAKKwkJCXsKKwkJCVJTQV9zZXRfZGVmYXVsdF9tZXRob2QoUlNBX1BLQ1MxX1NTTGVheSgpKTsKKwkJCWotLTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisjZW5kaWYgLyogIU9QRU5TU0xfTk9fUlNBICovCisJCSAgICAgaWYgKHN0cmNtcCgqYXJndiwiZHNhNTEyIikgPT0gMCkgZHNhX2RvaXRbUl9EU0FfNTEyXT0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsImRzYTEwMjQiKSA9PSAwKSBkc2FfZG9pdFtSX0RTQV8xMDI0XT0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsImRzYTIwNDgiKSA9PSAwKSBkc2FfZG9pdFtSX0RTQV8yMDQ4XT0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsInJzYTUxMiIpID09IDApIHJzYV9kb2l0W1JfUlNBXzUxMl09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJyc2ExMDI0IikgPT0gMCkgcnNhX2RvaXRbUl9SU0FfMTAyNF09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJyc2EyMDQ4IikgPT0gMCkgcnNhX2RvaXRbUl9SU0FfMjA0OF09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJyc2E0MDk2IikgPT0gMCkgcnNhX2RvaXRbUl9SU0FfNDA5Nl09MjsKKwkJZWxzZQorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorCQkgICAgIGlmIChzdHJjbXAoKmFyZ3YsInJjMi1jYmMiKSA9PSAwKSBkb2l0W0RfQ0JDX1JDMl09MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJyYzIiKSA9PSAwKSBkb2l0W0RfQ0JDX1JDMl09MTsKKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM1CisJCSAgICAgaWYgKHN0cmNtcCgqYXJndiwicmM1LWNiYyIpID09IDApIGRvaXRbRF9DQkNfUkM1XT0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsInJjNSIpID09IDApIGRvaXRbRF9DQkNfUkM1XT0xOworCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJCSAgICAgaWYgKHN0cmNtcCgqYXJndiwiaWRlYS1jYmMiKSA9PSAwKSBkb2l0W0RfQ0JDX0lERUFdPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiaWRlYSIpID09IDApIGRvaXRbRF9DQkNfSURFQV09MTsKKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQkgICAgIGlmIChzdHJjbXAoKmFyZ3YsInNlZWQtY2JjIikgPT0gMCkgZG9pdFtEX0NCQ19TRUVEXT0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsInNlZWQiKSA9PSAwKSBkb2l0W0RfQ0JDX1NFRURdPTE7CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JGCisJCSAgICAgaWYgKHN0cmNtcCgqYXJndiwiYmYtY2JjIikgPT0gMCkgZG9pdFtEX0NCQ19CRl09MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJibG93ZmlzaCIpID09IDApIGRvaXRbRF9DQkNfQkZdPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiYmYiKSA9PSAwKSBkb2l0W0RfQ0JDX0JGXT0xOworCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19DQVNUCisJCSAgICAgaWYgKHN0cmNtcCgqYXJndiwiY2FzdC1jYmMiKSA9PSAwKSBkb2l0W0RfQ0JDX0NBU1RdPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiY2FzdCIpID09IDApIGRvaXRbRF9DQkNfQ0FTVF09MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJjYXN0NSIpID09IDApIGRvaXRbRF9DQkNfQ0FTVF09MTsKKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJCQlpZiAoc3RyY21wKCphcmd2LCJkZXMiKSA9PSAwKQorCQkJeworCQkJZG9pdFtEX0NCQ19ERVNdPTE7CisJCQlkb2l0W0RfRURFM19ERVNdPTE7CisJCQl9CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCQkJaWYgKHN0cmNtcCgqYXJndiwiYWVzIikgPT0gMCkKKwkJCXsKKwkJCWRvaXRbRF9DQkNfMTI4X0FFU109MTsKKwkJCWRvaXRbRF9DQkNfMTkyX0FFU109MTsKKwkJCWRvaXRbRF9DQkNfMjU2X0FFU109MTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKwkJCWlmIChzdHJjbXAoKmFyZ3YsImNhbWVsbGlhIikgPT0gMCkKKwkJCXsKKwkJCWRvaXRbRF9DQkNfMTI4X0NNTF09MTsKKwkJCWRvaXRbRF9DQkNfMTkyX0NNTF09MTsKKwkJCWRvaXRbRF9DQkNfMjU2X0NNTF09MTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCQlpZiAoc3RyY21wKCphcmd2LCJyc2EiKSA9PSAwKQorCQkJeworCQkJcnNhX2RvaXRbUl9SU0FfNTEyXT0xOworCQkJcnNhX2RvaXRbUl9SU0FfMTAyNF09MTsKKwkJCXJzYV9kb2l0W1JfUlNBXzIwNDhdPTE7CisJCQlyc2FfZG9pdFtSX1JTQV80MDk2XT0xOworCQkJfQorCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkJCWlmIChzdHJjbXAoKmFyZ3YsImRzYSIpID09IDApCisJCQl7CisJCQlkc2FfZG9pdFtSX0RTQV81MTJdPTE7CisJCQlkc2FfZG9pdFtSX0RTQV8xMDI0XT0xOworCQkJZHNhX2RvaXRbUl9EU0FfMjA0OF09MTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwkJICAgICBpZiAoc3RyY21wKCphcmd2LCJlY2RzYXAxNjAiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfUDE2MF09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYXAxOTIiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfUDE5Ml09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYXAyMjQiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfUDIyNF09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYXAyNTYiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfUDI1Nl09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYXAzODQiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfUDM4NF09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYXA1MjEiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfUDUyMV09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWsxNjMiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfSzE2M109MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWsyMzMiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfSzIzM109MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWsyODMiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfSzI4M109MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWs0MDkiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfSzQwOV09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWs1NzEiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfSzU3MV09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWIxNjMiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfQjE2M109MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWIyMzMiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfQjIzM109MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWIyODMiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfQjI4M109MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWI0MDkiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfQjQwOV09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYWI1NzEiKSA9PSAwKSBlY2RzYV9kb2l0W1JfRUNfQjU3MV09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RzYSIpID09IDApCisJCQl7CisJCQlmb3IgKGk9MDsgaSA8IEVDX05VTTsgaSsrKQorCQkJCWVjZHNhX2RvaXRbaV09MTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCQkgICAgIGlmIChzdHJjbXAoKmFyZ3YsImVjZGhwMTYwIikgPT0gMCkgZWNkaF9kb2l0W1JfRUNfUDE2MF09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RocDE5MiIpID09IDApIGVjZGhfZG9pdFtSX0VDX1AxOTJdPTI7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiZWNkaHAyMjQiKSA9PSAwKSBlY2RoX2RvaXRbUl9FQ19QMjI0XT0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsImVjZGhwMjU2IikgPT0gMCkgZWNkaF9kb2l0W1JfRUNfUDI1Nl09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RocDM4NCIpID09IDApIGVjZGhfZG9pdFtSX0VDX1AzODRdPTI7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiZWNkaHA1MjEiKSA9PSAwKSBlY2RoX2RvaXRbUl9FQ19QNTIxXT0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsImVjZGhrMTYzIikgPT0gMCkgZWNkaF9kb2l0W1JfRUNfSzE2M109MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RoazIzMyIpID09IDApIGVjZGhfZG9pdFtSX0VDX0syMzNdPTI7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiZWNkaGsyODMiKSA9PSAwKSBlY2RoX2RvaXRbUl9FQ19LMjgzXT0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsImVjZGhrNDA5IikgPT0gMCkgZWNkaF9kb2l0W1JfRUNfSzQwOV09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RoazU3MSIpID09IDApIGVjZGhfZG9pdFtSX0VDX0s1NzFdPTI7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiZWNkaGIxNjMiKSA9PSAwKSBlY2RoX2RvaXRbUl9FQ19CMTYzXT0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsImVjZGhiMjMzIikgPT0gMCkgZWNkaF9kb2l0W1JfRUNfQjIzM109MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RoYjI4MyIpID09IDApIGVjZGhfZG9pdFtSX0VDX0IyODNdPTI7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiZWNkaGI0MDkiKSA9PSAwKSBlY2RoX2RvaXRbUl9FQ19CNDA5XT0yOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsImVjZGhiNTcxIikgPT0gMCkgZWNkaF9kb2l0W1JfRUNfQjU3MV09MjsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCJlY2RoIikgPT0gMCkKKwkJCXsKKwkJCWZvciAoaT0wOyBpIDwgRUNfTlVNOyBpKyspCisJCQkJZWNkaF9kb2l0W2ldPTE7CisJCQl9CisJCWVsc2UKKyNlbmRpZgorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJFcnJvcjogYmFkIG9wdGlvbiBvciB2YWx1ZVxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkF2YWlsYWJsZSB2YWx1ZXM6XG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDIKKwkJCUJJT19wcmludGYoYmlvX2VyciwibWQyICAgICAgIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NREMyCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm1kYzIgICAgICIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ0CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm1kNCAgICAgICIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIm1kNSAgICAgICIpOworI2lmbmRlZiBPUEVOU1NMX05PX0hNQUMKKwkJCUJJT19wcmludGYoYmlvX2VyciwiaG1hYyAgICAgIik7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTEKKwkJCUJJT19wcmludGYoYmlvX2Vyciwic2hhMSAgICAgIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEyNTYKKwkJCUJJT19wcmludGYoYmlvX2Vyciwic2hhMjU2ICAgIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEE1MTIKKwkJCUJJT19wcmludGYoYmlvX2Vyciwic2hhNTEyICAgIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19XSElSTFBPT0wKKwkJCUJJT19wcmludGYoYmlvX2Vyciwid2hpcmxwb29sIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SSVBFTUQxNjAKKwkJCUJJT19wcmludGYoYmlvX2Vyciwicm1kMTYwIik7CisjZW5kaWYKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX01EMikgfHwgIWRlZmluZWQoT1BFTlNTTF9OT19NREMyKSB8fCBcCisgICAgIWRlZmluZWQoT1BFTlNTTF9OT19NRDQpIHx8ICFkZWZpbmVkKE9QRU5TU0xfTk9fTUQ1KSB8fCBcCisgICAgIWRlZmluZWQoT1BFTlNTTF9OT19TSEExKSB8fCAhZGVmaW5lZChPUEVOU1NMX05PX1JJUEVNRDE2MCkgfHwgXAorICAgICFkZWZpbmVkKE9QRU5TU0xfTk9fV0hJUkxQT09MKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJcbiIpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImlkZWEtY2JjICIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJzZWVkLWNiYyAiKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJyYzItY2JjICAiKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDNQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJyYzUtY2JjICAiKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JGCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImJmLWNiYyIpOworI2VuZGlmCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19JREVBKSB8fCAhZGVmaW5lZChPUEVOU1NMX05PX1NFRUQpIHx8ICFkZWZpbmVkKE9QRU5TU0xfTk9fUkMyKSB8fCBcCisgICAgIWRlZmluZWQoT1BFTlNTTF9OT19CRikgfHwgIWRlZmluZWQoT1BFTlNTTF9OT19SQzUpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZGVzLWNiYyAgZGVzLWVkZTMgIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYWVzLTEyOC1jYmMgYWVzLTE5Mi1jYmMgYWVzLTI1Ni1jYmMgIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImFlcy0xMjgtaWdlIGFlcy0xOTItaWdlIGFlcy0yNTYtaWdlICIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKwkJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiY2FtZWxsaWEtMTI4LWNiYyBjYW1lbGxpYS0xOTItY2JjIGNhbWVsbGlhLTI1Ni1jYmMgIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKwkJCUJJT19wcmludGYoYmlvX2VyciwicmM0Iik7CisjZW5kaWYKKwkJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJyc2E1MTIgICByc2ExMDI0ICByc2EyMDQ4ICByc2E0MDk2XG4iKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImRzYTUxMiAgIGRzYTEwMjQgIGRzYTIwNDhcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZWNkc2FwMTYwIGVjZHNhcDE5MiBlY2RzYXAyMjQgZWNkc2FwMjU2IGVjZHNhcDM4NCBlY2RzYXA1MjFcbiIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJlY2RzYWsxNjMgZWNkc2FrMjMzIGVjZHNhazI4MyBlY2RzYWs0MDkgZWNkc2FrNTcxXG4iKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZWNkc2FiMTYzIGVjZHNhYjIzMyBlY2RzYWIyODMgZWNkc2FiNDA5IGVjZHNhYjU3MVxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVjZHNhXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJCUJJT19wcmludGYoYmlvX2VyciwiZWNkaHAxNjAgIGVjZGhwMTkyICBlY2RocDIyNCAgZWNkaHAyNTYgIGVjZGhwMzg0ICBlY2RocDUyMVxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVjZGhrMTYzICBlY2RoazIzMyAgZWNkaGsyODMgIGVjZGhrNDA5ICBlY2RoazU3MVxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVjZGhiMTYzICBlY2RoYjIzMyAgZWNkaGIyODMgIGVjZGhiNDA5ICBlY2RoYjU3MVxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVjZGhcbiIpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImlkZWEgICAgICIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJzZWVkICAgICAiKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJyYzIgICAgICAiKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJkZXMgICAgICAiKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJhZXMgICAgICAiKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImNhbWVsbGlhICIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInJzYSAgICAgICIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQkYKKwkJCUJJT19wcmludGYoYmlvX2VyciwiYmxvd2Zpc2giKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fSURFQSkgfHwgIWRlZmluZWQoT1BFTlNTTF9OT19TRUVEKSB8fCBcCisgICAgIWRlZmluZWQoT1BFTlNTTF9OT19SQzIpIHx8ICFkZWZpbmVkKE9QRU5TU0xfTk9fREVTKSB8fCBcCisgICAgIWRlZmluZWQoT1BFTlNTTF9OT19SU0EpIHx8ICFkZWZpbmVkKE9QRU5TU0xfTk9fQkYpIHx8IFwKKyAgICAhZGVmaW5lZChPUEVOU1NMX05PX0FFUykgfHwgIWRlZmluZWQoT1BFTlNTTF9OT19DQU1FTExJQSkKKwkJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKyNlbmRpZgorCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkF2YWlsYWJsZSBvcHRpb25zOlxuIik7CisjaWYgZGVmaW5lZChUSU1FUykgfHwgZGVmaW5lZChVU0VfVE9EKQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCItZWxhcHNlZCAgICAgICAgbWVhc3VyZSB0aW1lIGluIHJlYWwgdGltZSBpbnN0ZWFkIG9mIENQVSB1c2VyIHRpbWUuXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCItZW5naW5lIGUgICAgICAgdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIpOworI2VuZGlmCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIi1ldnAgZSAgICAgICAgICB1c2UgRVZQIGUuXG4iKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiLWRlY3J5cHQgICAgICAgIHRpbWUgZGVjcnlwdGlvbiBpbnN0ZWFkIG9mIGVuY3J5cHRpb24gKG9ubHkgRVZQKS5cbiIpOworCQkJQklPX3ByaW50ZihiaW9fZXJyLCItbXIgICAgICAgICAgICAgcHJvZHVjZSBtYWNoaW5lIHJlYWRhYmxlIG91dHB1dC5cbiIpOworI2lmbmRlZiBOT19GT1JLCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIi1tdWx0aSBuICAgICAgICBydW4gbiBiZW5jaG1hcmtzIGluIHBhcmFsbGVsLlxuIik7CisjZW5kaWYKKwkJCWdvdG8gZW5kOworCQkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJaisrOworCQl9CisKKyNpZm5kZWYgTk9fRk9SSworCWlmKG11bHRpICYmIGRvX211bHRpKG11bHRpKSkKKwkJZ290byBzaG93X3JlczsKKyNlbmRpZgorCisJaWYgKGogPT0gMCkKKwkJeworCQlmb3IgKGk9MDsgaTxBTEdPUl9OVU07IGkrKykKKwkJCXsKKwkJCWlmIChpICE9IERfRVZQKQorCQkJCWRvaXRbaV09MTsKKwkJCX0KKwkJZm9yIChpPTA7IGk8UlNBX05VTTsgaSsrKQorCQkJcnNhX2RvaXRbaV09MTsKKwkJZm9yIChpPTA7IGk8RFNBX05VTTsgaSsrKQorCQkJZHNhX2RvaXRbaV09MTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCQlmb3IgKGk9MDsgaTxFQ19OVU07IGkrKykKKwkJCWVjZHNhX2RvaXRbaV09MTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJZm9yIChpPTA7IGk8RUNfTlVNOyBpKyspCisJCQllY2RoX2RvaXRbaV09MTsKKyNlbmRpZgorCQl9CisJZm9yIChpPTA7IGk8QUxHT1JfTlVNOyBpKyspCisJCWlmIChkb2l0W2ldKSBwcl9oZWFkZXIrKzsKKworCWlmICh1c2VydGltZSA9PSAwICYmICFtcikKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJZb3UgaGF2ZSBjaG9zZW4gdG8gbWVhc3VyZSBlbGFwc2VkIHRpbWUgaW5zdGVhZCBvZiB1c2VyIENQVSB0aW1lLlxuIik7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwlmb3IgKGk9MDsgaTxSU0FfTlVNOyBpKyspCisJCXsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKworCQlwPXJzYV9kYXRhW2ldOworCQlyc2Ffa2V5W2ldPWQyaV9SU0FQcml2YXRlS2V5KE5VTEwsJnAscnNhX2RhdGFfbGVuZ3RoW2ldKTsKKwkJaWYgKHJzYV9rZXlbaV0gPT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiaW50ZXJuYWwgZXJyb3IgbG9hZGluZyBSU0Ega2V5IG51bWJlciAlZFxuIixpKTsKKwkJCWdvdG8gZW5kOworCQkJfQorI2lmIDAKKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLG1yID8gIitSSzolZDoiCisJCQkJICAgOiAiTG9hZGVkIFJTQSBrZXksICVkIGJpdCBtb2R1bHVzIGFuZCBlPSAweCIsCisJCQkJICAgQk5fbnVtX2JpdHMocnNhX2tleVtpXS0+bikpOworCQkJQk5fcHJpbnQoYmlvX2Vycixyc2Ffa2V5W2ldLT5lKTsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJCX0KKyNlbmRpZgorCQl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCWRzYV9rZXlbMF09Z2V0X2RzYTUxMigpOworCWRzYV9rZXlbMV09Z2V0X2RzYTEwMjQoKTsKKwlkc2Ffa2V5WzJdPWdldF9kc2EyMDQ4KCk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCURFU19zZXRfa2V5X3VuY2hlY2tlZCgma2V5LCZzY2gpOworCURFU19zZXRfa2V5X3VuY2hlY2tlZCgma2V5Miwmc2NoMik7CisJREVTX3NldF9rZXlfdW5jaGVja2VkKCZrZXkzLCZzY2gzKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCUFFU19zZXRfZW5jcnlwdF9rZXkoa2V5MTYsMTI4LCZhZXNfa3MxKTsKKwlBRVNfc2V0X2VuY3J5cHRfa2V5KGtleTI0LDE5MiwmYWVzX2tzMik7CisJQUVTX3NldF9lbmNyeXB0X2tleShrZXkzMiwyNTYsJmFlc19rczMpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKwlDYW1lbGxpYV9zZXRfa2V5KGtleTE2LDEyOCwmY2FtZWxsaWFfa3MxKTsKKwlDYW1lbGxpYV9zZXRfa2V5KGNrZXkyNCwxOTIsJmNhbWVsbGlhX2tzMik7CisJQ2FtZWxsaWFfc2V0X2tleShja2V5MzIsMjU2LCZjYW1lbGxpYV9rczMpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorCWlkZWFfc2V0X2VuY3J5cHRfa2V5KGtleTE2LCZpZGVhX2tzKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKKwlTRUVEX3NldF9rZXkoa2V5MTYsJnNlZWRfa3MpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM0CisJUkM0X3NldF9rZXkoJnJjNF9rcywxNixrZXkxNik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzIKKwlSQzJfc2V0X2tleSgmcmMyX2tzLDE2LGtleTE2LDEyOCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKKwlSQzVfMzJfc2V0X2tleSgmcmM1X2tzLDE2LGtleTE2LDEyKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JGCisJQkZfc2V0X2tleSgmYmZfa3MsMTYsa2V5MTYpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FTVAorCUNBU1Rfc2V0X2tleSgmY2FzdF9rcywxNixrZXkxNik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwltZW1zZXQocnNhX2MsMCxzaXplb2YocnNhX2MpKTsKKyNlbmRpZgorI2lmbmRlZiBTSUdBTFJNCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJQklPX3ByaW50ZihiaW9fZXJyLCJGaXJzdCB3ZSBjYWxjdWxhdGUgdGhlIGFwcHJveGltYXRlIHNwZWVkIC4uLlxuIik7CisJY291bnQ9MTA7CisJZG8JeworCQlsb25nIGl0OworCQljb3VudCo9MjsKKwkJVGltZV9GKFNUQVJUKTsKKwkJZm9yIChpdD1jb3VudDsgaXQ7IGl0LS0pCisJCQlERVNfZWNiX2VuY3J5cHQoYnVmX2FzX2Rlc19jYmxvY2ssYnVmX2FzX2Rlc19jYmxvY2ssCisJCQkJJnNjaCxERVNfRU5DUllQVCk7CisJCWQ9VGltZV9GKFNUT1ApOworCQl9IHdoaWxlIChkIDwzKTsKKwlzYXZlX2NvdW50PWNvdW50OworCWNbRF9NRDJdWzBdPWNvdW50LzEwOworCWNbRF9NREMyXVswXT1jb3VudC8xMDsKKwljW0RfTUQ0XVswXT1jb3VudDsKKwljW0RfTUQ1XVswXT1jb3VudDsKKwljW0RfSE1BQ11bMF09Y291bnQ7CisJY1tEX1NIQTFdWzBdPWNvdW50OworCWNbRF9STUQxNjBdWzBdPWNvdW50OworCWNbRF9SQzRdWzBdPWNvdW50KjU7CisJY1tEX0NCQ19ERVNdWzBdPWNvdW50OworCWNbRF9FREUzX0RFU11bMF09Y291bnQvMzsKKwljW0RfQ0JDX0lERUFdWzBdPWNvdW50OworCWNbRF9DQkNfU0VFRF1bMF09Y291bnQ7CisJY1tEX0NCQ19SQzJdWzBdPWNvdW50OworCWNbRF9DQkNfUkM1XVswXT1jb3VudDsKKwljW0RfQ0JDX0JGXVswXT1jb3VudDsKKwljW0RfQ0JDX0NBU1RdWzBdPWNvdW50OworCWNbRF9DQkNfMTI4X0FFU11bMF09Y291bnQ7CisJY1tEX0NCQ18xOTJfQUVTXVswXT1jb3VudDsKKwljW0RfQ0JDXzI1Nl9BRVNdWzBdPWNvdW50OworCWNbRF9DQkNfMTI4X0NNTF1bMF09Y291bnQ7CisJY1tEX0NCQ18xOTJfQ01MXVswXT1jb3VudDsKKwljW0RfQ0JDXzI1Nl9DTUxdWzBdPWNvdW50OworCWNbRF9TSEEyNTZdWzBdPWNvdW50OworCWNbRF9TSEE1MTJdWzBdPWNvdW50OworCWNbRF9XSElSTFBPT0xdWzBdPWNvdW50OworCWNbRF9JR0VfMTI4X0FFU11bMF09Y291bnQ7CisJY1tEX0lHRV8xOTJfQUVTXVswXT1jb3VudDsKKwljW0RfSUdFXzI1Nl9BRVNdWzBdPWNvdW50OworCisJZm9yIChpPTE7IGk8U0laRV9OVU07IGkrKykKKwkJeworCQljW0RfTUQyXVtpXT1jW0RfTUQyXVswXSo0Kmxlbmd0aHNbMF0vbGVuZ3Roc1tpXTsKKwkJY1tEX01EQzJdW2ldPWNbRF9NREMyXVswXSo0Kmxlbmd0aHNbMF0vbGVuZ3Roc1tpXTsKKwkJY1tEX01ENF1baV09Y1tEX01ENF1bMF0qNCpsZW5ndGhzWzBdL2xlbmd0aHNbaV07CisJCWNbRF9NRDVdW2ldPWNbRF9NRDVdWzBdKjQqbGVuZ3Roc1swXS9sZW5ndGhzW2ldOworCQljW0RfSE1BQ11baV09Y1tEX0hNQUNdWzBdKjQqbGVuZ3Roc1swXS9sZW5ndGhzW2ldOworCQljW0RfU0hBMV1baV09Y1tEX1NIQTFdWzBdKjQqbGVuZ3Roc1swXS9sZW5ndGhzW2ldOworCQljW0RfUk1EMTYwXVtpXT1jW0RfUk1EMTYwXVswXSo0Kmxlbmd0aHNbMF0vbGVuZ3Roc1tpXTsKKwkJY1tEX1NIQTI1Nl1baV09Y1tEX1NIQTI1Nl1bMF0qNCpsZW5ndGhzWzBdL2xlbmd0aHNbaV07CisJCWNbRF9TSEE1MTJdW2ldPWNbRF9TSEE1MTJdWzBdKjQqbGVuZ3Roc1swXS9sZW5ndGhzW2ldOworCQljW0RfV0hJUkxQT09MXVtpXT1jW0RfV0hJUkxQT09MXVswXSo0Kmxlbmd0aHNbMF0vbGVuZ3Roc1tpXTsKKwkJfQorCWZvciAoaT0xOyBpPFNJWkVfTlVNOyBpKyspCisJCXsKKwkJbG9uZyBsMCxsMTsKKworCQlsMD0obG9uZylsZW5ndGhzW2ktMV07CisJCWwxPShsb25nKWxlbmd0aHNbaV07CisJCWNbRF9SQzRdW2ldPWNbRF9SQzRdW2ktMV0qbDAvbDE7CisJCWNbRF9DQkNfREVTXVtpXT1jW0RfQ0JDX0RFU11baS0xXSpsMC9sMTsKKwkJY1tEX0VERTNfREVTXVtpXT1jW0RfRURFM19ERVNdW2ktMV0qbDAvbDE7CisJCWNbRF9DQkNfSURFQV1baV09Y1tEX0NCQ19JREVBXVtpLTFdKmwwL2wxOworCQljW0RfQ0JDX1NFRURdW2ldPWNbRF9DQkNfU0VFRF1baS0xXSpsMC9sMTsKKwkJY1tEX0NCQ19SQzJdW2ldPWNbRF9DQkNfUkMyXVtpLTFdKmwwL2wxOworCQljW0RfQ0JDX1JDNV1baV09Y1tEX0NCQ19SQzVdW2ktMV0qbDAvbDE7CisJCWNbRF9DQkNfQkZdW2ldPWNbRF9DQkNfQkZdW2ktMV0qbDAvbDE7CisJCWNbRF9DQkNfQ0FTVF1baV09Y1tEX0NCQ19DQVNUXVtpLTFdKmwwL2wxOworCQljW0RfQ0JDXzEyOF9BRVNdW2ldPWNbRF9DQkNfMTI4X0FFU11baS0xXSpsMC9sMTsKKwkJY1tEX0NCQ18xOTJfQUVTXVtpXT1jW0RfQ0JDXzE5Ml9BRVNdW2ktMV0qbDAvbDE7CisJCWNbRF9DQkNfMjU2X0FFU11baV09Y1tEX0NCQ18yNTZfQUVTXVtpLTFdKmwwL2wxOworIAkJY1tEX0NCQ18xMjhfQ01MXVtpXT1jW0RfQ0JDXzEyOF9DTUxdW2ktMV0qbDAvbDE7CisJCWNbRF9DQkNfMTkyX0NNTF1baV09Y1tEX0NCQ18xOTJfQ01MXVtpLTFdKmwwL2wxOworCQljW0RfQ0JDXzI1Nl9DTUxdW2ldPWNbRF9DQkNfMjU2X0NNTF1baS0xXSpsMC9sMTsKKwkJY1tEX0lHRV8xMjhfQUVTXVtpXT1jW0RfSUdFXzEyOF9BRVNdW2ktMV0qbDAvbDE7CisJCWNbRF9JR0VfMTkyX0FFU11baV09Y1tEX0lHRV8xOTJfQUVTXVtpLTFdKmwwL2wxOworCQljW0RfSUdFXzI1Nl9BRVNdW2ldPWNbRF9JR0VfMjU2X0FFU11baS0xXSpsMC9sMTsKKwkJfQorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXJzYV9jW1JfUlNBXzUxMl1bMF09Y291bnQvMjAwMDsKKwlyc2FfY1tSX1JTQV81MTJdWzFdPWNvdW50LzQwMDsKKwlmb3IgKGk9MTsgaTxSU0FfTlVNOyBpKyspCisJCXsKKwkJcnNhX2NbaV1bMF09cnNhX2NbaS0xXVswXS84OworCQlyc2FfY1tpXVsxXT1yc2FfY1tpLTFdWzFdLzQ7CisJCWlmICgocnNhX2RvaXRbaV0gPD0gMSkgJiYgKHJzYV9jW2ldWzBdID09IDApKQorCQkJcnNhX2RvaXRbaV09MDsKKwkJZWxzZQorCQkJeworCQkJaWYgKHJzYV9jW2ldWzBdID09IDApCisJCQkJeworCQkJCXJzYV9jW2ldWzBdPTE7CisJCQkJcnNhX2NbaV1bMV09MjA7CisJCQkJfQorCQkJfQkJCQkKKwkJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwlkc2FfY1tSX0RTQV81MTJdWzBdPWNvdW50LzEwMDA7CisJZHNhX2NbUl9EU0FfNTEyXVsxXT1jb3VudC8xMDAwLzI7CisJZm9yIChpPTE7IGk8RFNBX05VTTsgaSsrKQorCQl7CisJCWRzYV9jW2ldWzBdPWRzYV9jW2ktMV1bMF0vNDsKKwkJZHNhX2NbaV1bMV09ZHNhX2NbaS0xXVsxXS80OworCQlpZiAoKGRzYV9kb2l0W2ldIDw9IDEpICYmIChkc2FfY1tpXVswXSA9PSAwKSkKKwkJCWRzYV9kb2l0W2ldPTA7CisJCWVsc2UKKwkJCXsKKwkJCWlmIChkc2FfY1tpXSA9PSAwKQorCQkJCXsKKwkJCQlkc2FfY1tpXVswXT0xOworCQkJCWRzYV9jW2ldWzFdPTE7CisJCQkJfQorCQkJfQkJCQkKKwkJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCWVjZHNhX2NbUl9FQ19QMTYwXVswXT1jb3VudC8xMDAwOworCWVjZHNhX2NbUl9FQ19QMTYwXVsxXT1jb3VudC8xMDAwLzI7CisJZm9yIChpPVJfRUNfUDE5MjsgaTw9Ul9FQ19QNTIxOyBpKyspCisJCXsKKwkJZWNkc2FfY1tpXVswXT1lY2RzYV9jW2ktMV1bMF0vMjsKKwkJZWNkc2FfY1tpXVsxXT1lY2RzYV9jW2ktMV1bMV0vMjsKKwkJaWYgKChlY2RzYV9kb2l0W2ldIDw9IDEpICYmIChlY2RzYV9jW2ldWzBdID09IDApKQorCQkJZWNkc2FfZG9pdFtpXT0wOworCQllbHNlCisJCQl7CisJCQlpZiAoZWNkc2FfY1tpXSA9PSAwKQorCQkJCXsKKwkJCQllY2RzYV9jW2ldWzBdPTE7CisJCQkJZWNkc2FfY1tpXVsxXT0xOworCQkJCX0KKwkJCX0KKwkJfQorCWVjZHNhX2NbUl9FQ19LMTYzXVswXT1jb3VudC8xMDAwOworCWVjZHNhX2NbUl9FQ19LMTYzXVsxXT1jb3VudC8xMDAwLzI7CisJZm9yIChpPVJfRUNfSzIzMzsgaTw9Ul9FQ19LNTcxOyBpKyspCisJCXsKKwkJZWNkc2FfY1tpXVswXT1lY2RzYV9jW2ktMV1bMF0vMjsKKwkJZWNkc2FfY1tpXVsxXT1lY2RzYV9jW2ktMV1bMV0vMjsKKwkJaWYgKChlY2RzYV9kb2l0W2ldIDw9IDEpICYmIChlY2RzYV9jW2ldWzBdID09IDApKQorCQkJZWNkc2FfZG9pdFtpXT0wOworCQllbHNlCisJCQl7CisJCQlpZiAoZWNkc2FfY1tpXSA9PSAwKQorCQkJCXsKKwkJCQllY2RzYV9jW2ldWzBdPTE7CisJCQkJZWNkc2FfY1tpXVsxXT0xOworCQkJCX0KKwkJCX0KKwkJfQorCWVjZHNhX2NbUl9FQ19CMTYzXVswXT1jb3VudC8xMDAwOworCWVjZHNhX2NbUl9FQ19CMTYzXVsxXT1jb3VudC8xMDAwLzI7CisJZm9yIChpPVJfRUNfQjIzMzsgaTw9Ul9FQ19CNTcxOyBpKyspCisJCXsKKwkJZWNkc2FfY1tpXVswXT1lY2RzYV9jW2ktMV1bMF0vMjsKKwkJZWNkc2FfY1tpXVsxXT1lY2RzYV9jW2ktMV1bMV0vMjsKKwkJaWYgKChlY2RzYV9kb2l0W2ldIDw9IDEpICYmIChlY2RzYV9jW2ldWzBdID09IDApKQorCQkJZWNkc2FfZG9pdFtpXT0wOworCQllbHNlCisJCQl7CisJCQlpZiAoZWNkc2FfY1tpXSA9PSAwKQorCQkJCXsKKwkJCQllY2RzYV9jW2ldWzBdPTE7CisJCQkJZWNkc2FfY1tpXVsxXT0xOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJZWNkaF9jW1JfRUNfUDE2MF1bMF09Y291bnQvMTAwMDsKKwllY2RoX2NbUl9FQ19QMTYwXVsxXT1jb3VudC8xMDAwOworCWZvciAoaT1SX0VDX1AxOTI7IGk8PVJfRUNfUDUyMTsgaSsrKQorCQl7CisJCWVjZGhfY1tpXVswXT1lY2RoX2NbaS0xXVswXS8yOworCQllY2RoX2NbaV1bMV09ZWNkaF9jW2ktMV1bMV0vMjsKKwkJaWYgKChlY2RoX2RvaXRbaV0gPD0gMSkgJiYgKGVjZGhfY1tpXVswXSA9PSAwKSkKKwkJCWVjZGhfZG9pdFtpXT0wOworCQllbHNlCisJCQl7CisJCQlpZiAoZWNkaF9jW2ldID09IDApCisJCQkJeworCQkJCWVjZGhfY1tpXVswXT0xOworCQkJCWVjZGhfY1tpXVsxXT0xOworCQkJCX0KKwkJCX0KKwkJfQorCWVjZGhfY1tSX0VDX0sxNjNdWzBdPWNvdW50LzEwMDA7CisJZWNkaF9jW1JfRUNfSzE2M11bMV09Y291bnQvMTAwMDsKKwlmb3IgKGk9Ul9FQ19LMjMzOyBpPD1SX0VDX0s1NzE7IGkrKykKKwkJeworCQllY2RoX2NbaV1bMF09ZWNkaF9jW2ktMV1bMF0vMjsKKwkJZWNkaF9jW2ldWzFdPWVjZGhfY1tpLTFdWzFdLzI7CisJCWlmICgoZWNkaF9kb2l0W2ldIDw9IDEpICYmIChlY2RoX2NbaV1bMF0gPT0gMCkpCisJCQllY2RoX2RvaXRbaV09MDsKKwkJZWxzZQorCQkJeworCQkJaWYgKGVjZGhfY1tpXSA9PSAwKQorCQkJCXsKKwkJCQllY2RoX2NbaV1bMF09MTsKKwkJCQllY2RoX2NbaV1bMV09MTsKKwkJCQl9CisJCQl9CisJCX0KKwllY2RoX2NbUl9FQ19CMTYzXVswXT1jb3VudC8xMDAwOworCWVjZGhfY1tSX0VDX0IxNjNdWzFdPWNvdW50LzEwMDA7CisJZm9yIChpPVJfRUNfQjIzMzsgaTw9Ul9FQ19CNTcxOyBpKyspCisJCXsKKwkJZWNkaF9jW2ldWzBdPWVjZGhfY1tpLTFdWzBdLzI7CisJCWVjZGhfY1tpXVsxXT1lY2RoX2NbaS0xXVsxXS8yOworCQlpZiAoKGVjZGhfZG9pdFtpXSA8PSAxKSAmJiAoZWNkaF9jW2ldWzBdID09IDApKQorCQkJZWNkaF9kb2l0W2ldPTA7CisJCWVsc2UKKwkJCXsKKwkJCWlmIChlY2RoX2NbaV0gPT0gMCkKKwkJCQl7CisJCQkJZWNkaF9jW2ldWzBdPTE7CisJCQkJZWNkaF9jW2ldWzFdPTE7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKworI2RlZmluZSBDT05EKGQpCShjb3VudCA8IChkKSkKKyNkZWZpbmUgQ09VTlQoZCkgKGQpCisjZWxzZQorLyogbm90IHdvcnRoIGZpeGluZyAqLworIyBlcnJvciAiWW91IGNhbm5vdCBkaXNhYmxlIERFUyBvbiBzeXN0ZW1zIHdpdGhvdXQgU0lHQUxSTS4iCisjZW5kaWYgLyogT1BFTlNTTF9OT19ERVMgKi8KKyNlbHNlCisjZGVmaW5lIENPTkQoYykJKHJ1bikKKyNkZWZpbmUgQ09VTlQoZCkgKGNvdW50KQorI2lmbmRlZiBfV0lOMzIKKwlzaWduYWwoU0lHQUxSTSxzaWdfZG9uZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBTSUdBTFJNICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDIKKwlpZiAoZG9pdFtEX01EMl0pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9NRDJdLGNbRF9NRDJdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfTUQyXVtqXSk7IGNvdW50KyspCisJCQkJRVZQX0RpZ2VzdChidWYsKHVuc2lnbmVkIGxvbmcpbGVuZ3Roc1tqXSwmKG1kMlswXSksTlVMTCxFVlBfbWQyKCksTlVMTCk7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX01EMixqLGNvdW50LGQpOworCQkJfQorCQl9CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NREMyCisJaWYgKGRvaXRbRF9NREMyXSkKKwkJeworCQlmb3IgKGo9MDsgajxTSVpFX05VTTsgaisrKQorCQkJeworCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX01EQzJdLGNbRF9NREMyXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX01EQzJdW2pdKTsgY291bnQrKykKKwkJCQlFVlBfRGlnZXN0KGJ1ZiwodW5zaWduZWQgbG9uZylsZW5ndGhzW2pdLCYobWRjMlswXSksTlVMTCxFVlBfbWRjMigpLE5VTEwpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9NREMyLGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ0CisJaWYgKGRvaXRbRF9NRDRdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfTUQ0XSxjW0RfTUQ0XVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX01ENF1bal0pOyBjb3VudCsrKQorCQkJCUVWUF9EaWdlc3QoJihidWZbMF0pLCh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJihtZDRbMF0pLE5VTEwsRVZQX21kNCgpLE5VTEwpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9NRDQsaixjb3VudCxkKTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKKwlpZiAoZG9pdFtEX01ENV0pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9NRDVdLGNbRF9NRDVdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfTUQ1XVtqXSk7IGNvdW50KyspCisJCQkJRVZQX0RpZ2VzdCgmKGJ1ZlswXSksKHVuc2lnbmVkIGxvbmcpbGVuZ3Roc1tqXSwmKG1kNVswXSksTlVMTCxFVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgibWQ1IiksTlVMTCk7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX01ENSxqLGNvdW50LGQpOworCQkJfQorCQl9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fTUQ1KSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0hNQUMpCisJaWYgKGRvaXRbRF9ITUFDXSkKKwkJeworCQlITUFDX0NUWCBoY3R4OworCisJCUhNQUNfQ1RYX2luaXQoJmhjdHgpOworCQlITUFDX0luaXRfZXgoJmhjdHgsKHVuc2lnbmVkIGNoYXIgKikiVGhpcyBpcyBhIGtleS4uLiIsCisJCQkxNixFVlBfbWQ1KCksIE5VTEwpOworCisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfSE1BQ10sY1tEX0hNQUNdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfSE1BQ11bal0pOyBjb3VudCsrKQorCQkJCXsKKwkJCQlITUFDX0luaXRfZXgoJmhjdHgsTlVMTCwwLE5VTEwsTlVMTCk7CisJCQkJSE1BQ19VcGRhdGUoJmhjdHgsYnVmLGxlbmd0aHNbal0pOworCQkJCUhNQUNfRmluYWwoJmhjdHgsJihobWFjWzBdKSxOVUxMKTsKKwkJCQl9CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX0hNQUMsaixjb3VudCxkKTsKKwkJCX0KKwkJSE1BQ19DVFhfY2xlYW51cCgmaGN0eCk7CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorCWlmIChkb2l0W0RfU0hBMV0pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9TSEExXSxjW0RfU0hBMV1bal0sbGVuZ3Roc1tqXSk7CisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNbRF9TSEExXVtqXSk7IGNvdW50KyspCisJCQkJRVZQX0RpZ2VzdChidWYsKHVuc2lnbmVkIGxvbmcpbGVuZ3Roc1tqXSwmKHNoYVswXSksTlVMTCxFVlBfc2hhMSgpLE5VTEwpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9TSEExLGosY291bnQsZCk7CisJCQl9CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1NIQTI1NgorCWlmIChkb2l0W0RfU0hBMjU2XSkKKwkJeworCQlmb3IgKGo9MDsgajxTSVpFX05VTTsgaisrKQorCQkJeworCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX1NIQTI1Nl0sY1tEX1NIQTI1Nl1bal0sbGVuZ3Roc1tqXSk7CisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNbRF9TSEEyNTZdW2pdKTsgY291bnQrKykKKwkJCQlTSEEyNTYoYnVmLGxlbmd0aHNbal0sc2hhMjU2KTsKKwkJCWQ9VGltZV9GKFNUT1ApOworCQkJcHJpbnRfcmVzdWx0KERfU0hBMjU2LGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBNTEyCisJaWYgKGRvaXRbRF9TSEE1MTJdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfU0hBNTEyXSxjW0RfU0hBNTEyXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX1NIQTUxMl1bal0pOyBjb3VudCsrKQorCQkJCVNIQTUxMihidWYsbGVuZ3Roc1tqXSxzaGE1MTIpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9TSEE1MTIsaixjb3VudCxkKTsKKwkJCX0KKwkJfQorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1dISVJMUE9PTAorCWlmIChkb2l0W0RfV0hJUkxQT09MXSkKKwkJeworCQlmb3IgKGo9MDsgajxTSVpFX05VTTsgaisrKQorCQkJeworCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX1dISVJMUE9PTF0sY1tEX1dISVJMUE9PTF1bal0sbGVuZ3Roc1tqXSk7CisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNbRF9XSElSTFBPT0xdW2pdKTsgY291bnQrKykKKwkJCQlXSElSTFBPT0woYnVmLGxlbmd0aHNbal0sd2hpcmxwb29sKTsKKwkJCWQ9VGltZV9GKFNUT1ApOworCQkJcHJpbnRfcmVzdWx0KERfV0hJUkxQT09MLGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUklQRU1ECisJaWYgKGRvaXRbRF9STUQxNjBdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfUk1EMTYwXSxjW0RfUk1EMTYwXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX1JNRDE2MF1bal0pOyBjb3VudCsrKQorCQkJCUVWUF9EaWdlc3QoYnVmLCh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJihybWQxNjBbMF0pLE5VTEwsRVZQX3JpcGVtZDE2MCgpLE5VTEwpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9STUQxNjAsaixjb3VudCxkKTsKKwkJCX0KKwkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM0CisJaWYgKGRvaXRbRF9SQzRdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfUkM0XSxjW0RfUkM0XVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX1JDNF1bal0pOyBjb3VudCsrKQorCQkJCVJDNCgmcmM0X2tzLCh1bnNpZ25lZCBpbnQpbGVuZ3Roc1tqXSwKKwkJCQkJYnVmLGJ1Zik7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX1JDNCxqLGNvdW50LGQpOworCQkJfQorCQl9CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwlpZiAoZG9pdFtEX0NCQ19ERVNdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfQ0JDX0RFU10sY1tEX0NCQ19ERVNdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfQ0JDX0RFU11bal0pOyBjb3VudCsrKQorCQkJCURFU19uY2JjX2VuY3J5cHQoYnVmLGJ1ZixsZW5ndGhzW2pdLCZzY2gsCisJCQkJCQkgJkRFU19pdixERVNfRU5DUllQVCk7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX0NCQ19ERVMsaixjb3VudCxkKTsKKwkJCX0KKwkJfQorCisJaWYgKGRvaXRbRF9FREUzX0RFU10pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9FREUzX0RFU10sY1tEX0VERTNfREVTXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX0VERTNfREVTXVtqXSk7IGNvdW50KyspCisJCQkJREVTX2VkZTNfY2JjX2VuY3J5cHQoYnVmLGJ1ZixsZW5ndGhzW2pdLAorCQkJCQkJICAgICAmc2NoLCZzY2gyLCZzY2gzLAorCQkJCQkJICAgICAmREVTX2l2LERFU19FTkNSWVBUKTsKKwkJCWQ9VGltZV9GKFNUT1ApOworCQkJcHJpbnRfcmVzdWx0KERfRURFM19ERVMsaixjb3VudCxkKTsKKwkJCX0KKwkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQUVTCisJaWYgKGRvaXRbRF9DQkNfMTI4X0FFU10pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9DQkNfMTI4X0FFU10sY1tEX0NCQ18xMjhfQUVTXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX0NCQ18xMjhfQUVTXVtqXSk7IGNvdW50KyspCisJCQkJQUVTX2NiY19lbmNyeXB0KGJ1ZixidWYsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJmFlc19rczEsCisJCQkJCWl2LEFFU19FTkNSWVBUKTsKKwkJCWQ9VGltZV9GKFNUT1ApOworCQkJcHJpbnRfcmVzdWx0KERfQ0JDXzEyOF9BRVMsaixjb3VudCxkKTsKKwkJCX0KKwkJfQorCWlmIChkb2l0W0RfQ0JDXzE5Ml9BRVNdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfQ0JDXzE5Ml9BRVNdLGNbRF9DQkNfMTkyX0FFU11bal0sbGVuZ3Roc1tqXSk7CisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNbRF9DQkNfMTkyX0FFU11bal0pOyBjb3VudCsrKQorCQkJCUFFU19jYmNfZW5jcnlwdChidWYsYnVmLAorCQkJCQkodW5zaWduZWQgbG9uZylsZW5ndGhzW2pdLCZhZXNfa3MyLAorCQkJCQlpdixBRVNfRU5DUllQVCk7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX0NCQ18xOTJfQUVTLGosY291bnQsZCk7CisJCQl9CisJCX0KKwlpZiAoZG9pdFtEX0NCQ18yNTZfQUVTXSkKKwkJeworCQlmb3IgKGo9MDsgajxTSVpFX05VTTsgaisrKQorCQkJeworCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX0NCQ18yNTZfQUVTXSxjW0RfQ0JDXzI1Nl9BRVNdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfQ0JDXzI1Nl9BRVNdW2pdKTsgY291bnQrKykKKwkJCQlBRVNfY2JjX2VuY3J5cHQoYnVmLGJ1ZiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpbGVuZ3Roc1tqXSwmYWVzX2tzMywKKwkJCQkJaXYsQUVTX0VOQ1JZUFQpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9DQkNfMjU2X0FFUyxqLGNvdW50LGQpOworCQkJfQorCQl9CisKKyNpZiAwIC8qIEFORFJPSUQgKi8KKwlpZiAoZG9pdFtEX0lHRV8xMjhfQUVTXSkKKwkJeworCQlmb3IgKGo9MDsgajxTSVpFX05VTTsgaisrKQorCQkJeworCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX0lHRV8xMjhfQUVTXSxjW0RfSUdFXzEyOF9BRVNdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfSUdFXzEyOF9BRVNdW2pdKTsgY291bnQrKykKKwkJCQlBRVNfaWdlX2VuY3J5cHQoYnVmLGJ1ZjIsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJmFlc19rczEsCisJCQkJCWl2LEFFU19FTkNSWVBUKTsKKwkJCWQ9VGltZV9GKFNUT1ApOworCQkJcHJpbnRfcmVzdWx0KERfSUdFXzEyOF9BRVMsaixjb3VudCxkKTsKKwkJCX0KKwkJfQorCWlmIChkb2l0W0RfSUdFXzE5Ml9BRVNdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfSUdFXzE5Ml9BRVNdLGNbRF9JR0VfMTkyX0FFU11bal0sbGVuZ3Roc1tqXSk7CisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNbRF9JR0VfMTkyX0FFU11bal0pOyBjb3VudCsrKQorCQkJCUFFU19pZ2VfZW5jcnlwdChidWYsYnVmMiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpbGVuZ3Roc1tqXSwmYWVzX2tzMiwKKwkJCQkJaXYsQUVTX0VOQ1JZUFQpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9JR0VfMTkyX0FFUyxqLGNvdW50LGQpOworCQkJfQorCQl9CisJaWYgKGRvaXRbRF9JR0VfMjU2X0FFU10pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9JR0VfMjU2X0FFU10sY1tEX0lHRV8yNTZfQUVTXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX0lHRV8yNTZfQUVTXVtqXSk7IGNvdW50KyspCisJCQkJQUVTX2lnZV9lbmNyeXB0KGJ1ZixidWYyLAorCQkJCQkodW5zaWduZWQgbG9uZylsZW5ndGhzW2pdLCZhZXNfa3MzLAorCQkJCQlpdixBRVNfRU5DUllQVCk7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX0lHRV8yNTZfQUVTLGosY291bnQsZCk7CisJCQl9CisJCX0KKworCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJaWYgKGRvaXRbRF9DQkNfMTI4X0NNTF0pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9DQkNfMTI4X0NNTF0sY1tEX0NCQ18xMjhfQ01MXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX0NCQ18xMjhfQ01MXVtqXSk7IGNvdW50KyspCisJCQkJQ2FtZWxsaWFfY2JjX2VuY3J5cHQoYnVmLGJ1ZiwKKwkJCQkgICAgICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJmNhbWVsbGlhX2tzMSwKKwkJCQkgICAgICAgIGl2LENBTUVMTElBX0VOQ1JZUFQpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9DQkNfMTI4X0NNTCxqLGNvdW50LGQpOworCQkJfQorCQl9CisJaWYgKGRvaXRbRF9DQkNfMTkyX0NNTF0pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9DQkNfMTkyX0NNTF0sY1tEX0NCQ18xOTJfQ01MXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX0NCQ18xOTJfQ01MXVtqXSk7IGNvdW50KyspCisJCQkJQ2FtZWxsaWFfY2JjX2VuY3J5cHQoYnVmLGJ1ZiwKKwkJCQkgICAgICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJmNhbWVsbGlhX2tzMiwKKwkJCQkgICAgICAgIGl2LENBTUVMTElBX0VOQ1JZUFQpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9DQkNfMTkyX0NNTCxqLGNvdW50LGQpOworCQkJfQorCQl9CisJaWYgKGRvaXRbRF9DQkNfMjU2X0NNTF0pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9DQkNfMjU2X0NNTF0sY1tEX0NCQ18yNTZfQ01MXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX0NCQ18yNTZfQ01MXVtqXSk7IGNvdW50KyspCisJCQkJQ2FtZWxsaWFfY2JjX2VuY3J5cHQoYnVmLGJ1ZiwKKwkJCQkgICAgICAgICh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJmNhbWVsbGlhX2tzMywKKwkJCQkgICAgICAgIGl2LENBTUVMTElBX0VOQ1JZUFQpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9DQkNfMjU2X0NNTCxqLGNvdW50LGQpOworCQkJfQorCQl9CisKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKwlpZiAoZG9pdFtEX0NCQ19JREVBXSkKKwkJeworCQlmb3IgKGo9MDsgajxTSVpFX05VTTsgaisrKQorCQkJeworCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX0NCQ19JREVBXSxjW0RfQ0JDX0lERUFdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfQ0JDX0lERUFdW2pdKTsgY291bnQrKykKKwkJCQlpZGVhX2NiY19lbmNyeXB0KGJ1ZixidWYsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJmlkZWFfa3MsCisJCQkJCWl2LElERUFfRU5DUllQVCk7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX0NCQ19JREVBLGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKKwlpZiAoZG9pdFtEX0NCQ19TRUVEXSkKKwkJeworCQlmb3IgKGo9MDsgajxTSVpFX05VTTsgaisrKQorCQkJeworCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX0NCQ19TRUVEXSxjW0RfQ0JDX1NFRURdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfQ0JDX1NFRURdW2pdKTsgY291bnQrKykKKwkJCQlTRUVEX2NiY19lbmNyeXB0KGJ1ZixidWYsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJnNlZWRfa3MsaXYsMSk7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX0NCQ19TRUVELGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorCWlmIChkb2l0W0RfQ0JDX1JDMl0pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9DQkNfUkMyXSxjW0RfQ0JDX1JDMl1bal0sbGVuZ3Roc1tqXSk7CisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNbRF9DQkNfUkMyXVtqXSk7IGNvdW50KyspCisJCQkJUkMyX2NiY19lbmNyeXB0KGJ1ZixidWYsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJnJjMl9rcywKKwkJCQkJaXYsUkMyX0VOQ1JZUFQpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9DQkNfUkMyLGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDNQorCWlmIChkb2l0W0RfQ0JDX1JDNV0pCisJCXsKKwkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKKwkJCXsKKwkJCXByaW50X21lc3NhZ2UobmFtZXNbRF9DQkNfUkM1XSxjW0RfQ0JDX1JDNV1bal0sbGVuZ3Roc1tqXSk7CisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNbRF9DQkNfUkM1XVtqXSk7IGNvdW50KyspCisJCQkJUkM1XzMyX2NiY19lbmNyeXB0KGJ1ZixidWYsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJnJjNV9rcywKKwkJCQkJaXYsUkM1X0VOQ1JZUFQpOworCQkJZD1UaW1lX0YoU1RPUCk7CisJCQlwcmludF9yZXN1bHQoRF9DQkNfUkM1LGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JGCisJaWYgKGRvaXRbRF9DQkNfQkZdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlwcmludF9tZXNzYWdlKG5hbWVzW0RfQ0JDX0JGXSxjW0RfQ0JDX0JGXVtqXSxsZW5ndGhzW2pdKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY1tEX0NCQ19CRl1bal0pOyBjb3VudCsrKQorCQkJCUJGX2NiY19lbmNyeXB0KGJ1ZixidWYsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJmJmX2tzLAorCQkJCQlpdixCRl9FTkNSWVBUKTsKKwkJCWQ9VGltZV9GKFNUT1ApOworCQkJcHJpbnRfcmVzdWx0KERfQ0JDX0JGLGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKKwlpZiAoZG9pdFtEX0NCQ19DQVNUXSkKKwkJeworCQlmb3IgKGo9MDsgajxTSVpFX05VTTsgaisrKQorCQkJeworCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX0NCQ19DQVNUXSxjW0RfQ0JDX0NBU1RdW2pdLGxlbmd0aHNbal0pOworCQkJVGltZV9GKFNUQVJUKTsKKwkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjW0RfQ0JDX0NBU1RdW2pdKTsgY291bnQrKykKKwkJCQlDQVNUX2NiY19lbmNyeXB0KGJ1ZixidWYsCisJCQkJCSh1bnNpZ25lZCBsb25nKWxlbmd0aHNbal0sJmNhc3Rfa3MsCisJCQkJCWl2LENBU1RfRU5DUllQVCk7CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCXByaW50X3Jlc3VsdChEX0NCQ19DQVNULGosY291bnQsZCk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJaWYgKGRvaXRbRF9FVlBdKQorCQl7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlpZiAoZXZwX2NpcGhlcikKKwkJCQl7CisJCQkJRVZQX0NJUEhFUl9DVFggY3R4OworCQkJCWludCBvdXRsOworCisJCQkJbmFtZXNbRF9FVlBdPU9CSl9uaWQybG4oZXZwX2NpcGhlci0+bmlkKTsKKwkJCQkvKiAtTzMgLWZzY2hlZHVsZS1pbnNucyBtZXNzZXMgdXAgYW4KKwkJCQkgKiBvcHRpbWl6YXRpb24gaGVyZSEgIG5hbWVzW0RfRVZQXQorCQkJCSAqIHNvbWVob3cgYmVjb21lcyBOVUxMICovCisJCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX0VWUF0sc2F2ZV9jb3VudCwKKwkJCQkJbGVuZ3Roc1tqXSk7CisKKwkJCQlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOworCQkJCWlmKGRlY3J5cHQpCisJCQkJCUVWUF9EZWNyeXB0SW5pdF9leCgmY3R4LGV2cF9jaXBoZXIsTlVMTCxrZXkxNixpdik7CisJCQkJZWxzZQorCQkJCQlFVlBfRW5jcnlwdEluaXRfZXgoJmN0eCxldnBfY2lwaGVyLE5VTEwsa2V5MTYsaXYpOworCQkJCUVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCZjdHgsIDApOworCisJCQkJVGltZV9GKFNUQVJUKTsKKwkJCQlpZihkZWNyeXB0KQorCQkJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoc2F2ZV9jb3VudCo0Kmxlbmd0aHNbMF0vbGVuZ3Roc1tqXSk7IGNvdW50KyspCisJCQkJCQlFVlBfRGVjcnlwdFVwZGF0ZSgmY3R4LGJ1Ziwmb3V0bCxidWYsbGVuZ3Roc1tqXSk7CisJCQkJZWxzZQorCQkJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoc2F2ZV9jb3VudCo0Kmxlbmd0aHNbMF0vbGVuZ3Roc1tqXSk7IGNvdW50KyspCisJCQkJCQlFVlBfRW5jcnlwdFVwZGF0ZSgmY3R4LGJ1Ziwmb3V0bCxidWYsbGVuZ3Roc1tqXSk7CisJCQkJaWYoZGVjcnlwdCkKKwkJCQkJRVZQX0RlY3J5cHRGaW5hbF9leCgmY3R4LGJ1Ziwmb3V0bCk7CisJCQkJZWxzZQorCQkJCQlFVlBfRW5jcnlwdEZpbmFsX2V4KCZjdHgsYnVmLCZvdXRsKTsKKwkJCQlkPVRpbWVfRihTVE9QKTsKKwkJCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworCQkJCX0KKwkJCWlmIChldnBfbWQpCisJCQkJeworCQkJCW5hbWVzW0RfRVZQXT1PQkpfbmlkMmxuKGV2cF9tZC0+dHlwZSk7CisJCQkJcHJpbnRfbWVzc2FnZShuYW1lc1tEX0VWUF0sc2F2ZV9jb3VudCwKKwkJCQkJbGVuZ3Roc1tqXSk7CisKKwkJCQlUaW1lX0YoU1RBUlQpOworCQkJCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChzYXZlX2NvdW50KjQqbGVuZ3Roc1swXS9sZW5ndGhzW2pdKTsgY291bnQrKykKKwkJCQkJRVZQX0RpZ2VzdChidWYsbGVuZ3Roc1tqXSwmKG1kWzBdKSxOVUxMLGV2cF9tZCxOVUxMKTsKKworCQkJCWQ9VGltZV9GKFNUT1ApOworCQkJCX0KKwkJCXByaW50X3Jlc3VsdChEX0VWUCxqLGNvdW50LGQpOworCQkJfQorCQl9CisKKwlSQU5EX3BzZXVkb19ieXRlcyhidWYsMzYpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCWZvciAoaj0wOyBqPFJTQV9OVU07IGorKykKKwkJeworCQlpbnQgcmV0OworCQlpZiAoIXJzYV9kb2l0W2pdKSBjb250aW51ZTsKKwkJcmV0PVJTQV9zaWduKE5JRF9tZDVfc2hhMSwgYnVmLDM2LCBidWYyLCAmcnNhX251bSwgcnNhX2tleVtqXSk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiUlNBIHNpZ24gZmFpbHVyZS4gIE5vIFJTQSBzaWduIHdpbGwgYmUgZG9uZS5cbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCXJzYV9jb3VudD0xOworCQkJfQorCQllbHNlCisJCQl7CisJCQlwa2V5X3ByaW50X21lc3NhZ2UoInByaXZhdGUiLCJyc2EiLAorCQkJCXJzYV9jW2pdWzBdLHJzYV9iaXRzW2pdLAorCQkJCVJTQV9TRUNPTkRTKTsKKy8qCQkJUlNBX2JsaW5kaW5nX29uKHJzYV9rZXlbal0sTlVMTCk7ICovCisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKHJzYV9jW2pdWzBdKTsgY291bnQrKykKKwkJCQl7CisJCQkJcmV0PVJTQV9zaWduKE5JRF9tZDVfc2hhMSwgYnVmLDM2LCBidWYyLAorCQkJCQkmcnNhX251bSwgcnNhX2tleVtqXSk7CisJCQkJaWYgKHJldCA9PSAwKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkJCSJSU0Egc2lnbiBmYWlsdXJlXG4iKTsKKwkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJY291bnQ9MTsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCUJJT19wcmludGYoYmlvX2VycixtciA/ICIrUjE6JWxkOiVkOiUuMmZcbiIKKwkJCQkgICA6ICIlbGQgJWQgYml0IHByaXZhdGUgUlNBJ3MgaW4gJS4yZnNcbiIsCisJCQkJICAgY291bnQscnNhX2JpdHNbal0sZCk7CisJCQlyc2FfcmVzdWx0c1tqXVswXT1kLyhkb3VibGUpY291bnQ7CisJCQlyc2FfY291bnQ9Y291bnQ7CisJCQl9CisKKyNpZiAxCisJCXJldD1SU0FfdmVyaWZ5KE5JRF9tZDVfc2hhMSwgYnVmLDM2LCBidWYyLCByc2FfbnVtLCByc2Ffa2V5W2pdKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJSU0EgdmVyaWZ5IGZhaWx1cmUuICBObyBSU0EgdmVyaWZ5IHdpbGwgYmUgZG9uZS5cbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCXJzYV9kb2l0W2pdID0gMDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJcGtleV9wcmludF9tZXNzYWdlKCJwdWJsaWMiLCJyc2EiLAorCQkJCXJzYV9jW2pdWzFdLHJzYV9iaXRzW2pdLAorCQkJCVJTQV9TRUNPTkRTKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQocnNhX2Nbal1bMV0pOyBjb3VudCsrKQorCQkJCXsKKwkJCQlyZXQ9UlNBX3ZlcmlmeShOSURfbWQ1X3NoYTEsIGJ1ZiwzNiwgYnVmMiwKKwkJCQkJcnNhX251bSwgcnNhX2tleVtqXSk7CisJCQkJaWYgKHJldCA8PSAwKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkJCSJSU0EgdmVyaWZ5IGZhaWx1cmVcbiIpOworCQkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCQljb3VudD0xOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCWQ9VGltZV9GKFNUT1ApOworCQkJQklPX3ByaW50ZihiaW9fZXJyLG1yID8gIitSMjolbGQ6JWQ6JS4yZlxuIgorCQkJCSAgIDogIiVsZCAlZCBiaXQgcHVibGljIFJTQSdzIGluICUuMmZzXG4iLAorCQkJCSAgIGNvdW50LHJzYV9iaXRzW2pdLGQpOworCQkJcnNhX3Jlc3VsdHNbal1bMV09ZC8oZG91YmxlKWNvdW50OworCQkJfQorI2VuZGlmCisKKwkJaWYgKHJzYV9jb3VudCA8PSAxKQorCQkJeworCQkJLyogaWYgbG9uZ2VyIHRoYW4gMTBzLCBkb24ndCBkbyBhbnkgbW9yZSAqLworCQkJZm9yIChqKys7IGo8UlNBX05VTTsgaisrKQorCQkJCXJzYV9kb2l0W2pdPTA7CisJCQl9CisJCX0KKyNlbmRpZgorCisJUkFORF9wc2V1ZG9fYnl0ZXMoYnVmLDIwKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwlpZiAoUkFORF9zdGF0dXMoKSAhPSAxKQorCQl7CisJCVJBTkRfc2VlZChybmRfc2VlZCwgc2l6ZW9mIHJuZF9zZWVkKTsKKwkJcm5kX2Zha2UgPSAxOworCQl9CisJZm9yIChqPTA7IGo8RFNBX05VTTsgaisrKQorCQl7CisJCXVuc2lnbmVkIGludCBrazsKKwkJaW50IHJldDsKKworCQlpZiAoIWRzYV9kb2l0W2pdKSBjb250aW51ZTsKKy8qCQlEU0FfZ2VuZXJhdGVfa2V5KGRzYV9rZXlbal0pOyAqLworLyoJCURTQV9zaWduX3NldHVwKGRzYV9rZXlbal0sTlVMTCk7ICovCisJCXJldD1EU0Ffc2lnbihFVlBfUEtFWV9EU0EsYnVmLDIwLGJ1ZjIsCisJCQkma2ssZHNhX2tleVtqXSk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiRFNBIHNpZ24gZmFpbHVyZS4gIE5vIERTQSBzaWduIHdpbGwgYmUgZG9uZS5cbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCXJzYV9jb3VudD0xOworCQkJfQorCQllbHNlCisJCQl7CisJCQlwa2V5X3ByaW50X21lc3NhZ2UoInNpZ24iLCJkc2EiLAorCQkJCWRzYV9jW2pdWzBdLGRzYV9iaXRzW2pdLAorCQkJCURTQV9TRUNPTkRTKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoZHNhX2Nbal1bMF0pOyBjb3VudCsrKQorCQkJCXsKKwkJCQlyZXQ9RFNBX3NpZ24oRVZQX1BLRVlfRFNBLGJ1ZiwyMCxidWYyLAorCQkJCQkma2ssZHNhX2tleVtqXSk7CisJCQkJaWYgKHJldCA9PSAwKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkJCSJEU0Egc2lnbiBmYWlsdXJlXG4iKTsKKwkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJY291bnQ9MTsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCUJJT19wcmludGYoYmlvX2VycixtciA/ICIrUjM6JWxkOiVkOiUuMmZcbiIKKwkJCQkgICA6ICIlbGQgJWQgYml0IERTQSBzaWducyBpbiAlLjJmc1xuIiwKKwkJCQkgICBjb3VudCxkc2FfYml0c1tqXSxkKTsKKwkJCWRzYV9yZXN1bHRzW2pdWzBdPWQvKGRvdWJsZSljb3VudDsKKwkJCXJzYV9jb3VudD1jb3VudDsKKwkJCX0KKworCQlyZXQ9RFNBX3ZlcmlmeShFVlBfUEtFWV9EU0EsYnVmLDIwLGJ1ZjIsCisJCQlrayxkc2Ffa2V5W2pdKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJEU0EgdmVyaWZ5IGZhaWx1cmUuICBObyBEU0EgdmVyaWZ5IHdpbGwgYmUgZG9uZS5cbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWRzYV9kb2l0W2pdID0gMDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJcGtleV9wcmludF9tZXNzYWdlKCJ2ZXJpZnkiLCJkc2EiLAorCQkJCWRzYV9jW2pdWzFdLGRzYV9iaXRzW2pdLAorCQkJCURTQV9TRUNPTkRTKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoZHNhX2Nbal1bMV0pOyBjb3VudCsrKQorCQkJCXsKKwkJCQlyZXQ9RFNBX3ZlcmlmeShFVlBfUEtFWV9EU0EsYnVmLDIwLGJ1ZjIsCisJCQkJCWtrLGRzYV9rZXlbal0pOworCQkJCWlmIChyZXQgPD0gMCkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCQkiRFNBIHZlcmlmeSBmYWlsdXJlXG4iKTsKKwkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJY291bnQ9MTsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQlkPVRpbWVfRihTVE9QKTsKKwkJCUJJT19wcmludGYoYmlvX2VycixtciA/ICIrUjQ6JWxkOiVkOiUuMmZcbiIKKwkJCQkgICA6ICIlbGQgJWQgYml0IERTQSB2ZXJpZnkgaW4gJS4yZnNcbiIsCisJCQkJICAgY291bnQsZHNhX2JpdHNbal0sZCk7CisJCQlkc2FfcmVzdWx0c1tqXVsxXT1kLyhkb3VibGUpY291bnQ7CisJCQl9CisKKwkJaWYgKHJzYV9jb3VudCA8PSAxKQorCQkJeworCQkJLyogaWYgbG9uZ2VyIHRoYW4gMTBzLCBkb24ndCBkbyBhbnkgbW9yZSAqLworCQkJZm9yIChqKys7IGo8RFNBX05VTTsgaisrKQorCQkJCWRzYV9kb2l0W2pdPTA7CisJCQl9CisJCX0KKwlpZiAocm5kX2Zha2UpIFJBTkRfY2xlYW51cCgpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCWlmIChSQU5EX3N0YXR1cygpICE9IDEpIAorCQl7CisJCVJBTkRfc2VlZChybmRfc2VlZCwgc2l6ZW9mIHJuZF9zZWVkKTsKKwkJcm5kX2Zha2UgPSAxOworCQl9CisJZm9yIChqPTA7IGo8RUNfTlVNOyBqKyspIAorCQl7CisJCWludCByZXQ7CisKKwkJaWYgKCFlY2RzYV9kb2l0W2pdKSBjb250aW51ZTsgLyogSWdub3JlIEN1cnZlICovIAorCQllY2RzYVtqXSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSh0ZXN0X2N1cnZlc1tqXSk7CisJCWlmIChlY2RzYVtqXSA9PSBOVUxMKSAKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiRUNEU0EgZmFpbHVyZS5cbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCXJzYV9jb3VudD0xOworCQkJfSAKKwkJZWxzZSAKKwkJCXsKKyNpZiAxCisJCQlFQ19LRVlfcHJlY29tcHV0ZV9tdWx0KGVjZHNhW2pdLCBOVUxMKTsKKyNlbmRpZgorCQkJLyogUGVyZm9ybSBFQ0RTQSBzaWduYXR1cmUgdGVzdCAqLworCQkJRUNfS0VZX2dlbmVyYXRlX2tleShlY2RzYVtqXSk7CisJCQlyZXQgPSBFQ0RTQV9zaWduKDAsIGJ1ZiwgMjAsIGVjZHNhc2lnLCAKKwkJCQkmZWNkc2FzaWdsZW4sIGVjZHNhW2pdKTsKKwkJCWlmIChyZXQgPT0gMCkgCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwiRUNEU0Egc2lnbiBmYWlsdXJlLiAgTm8gRUNEU0Egc2lnbiB3aWxsIGJlIGRvbmUuXG4iKTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCXJzYV9jb3VudD0xOworCQkJCX0gCisJCQllbHNlIAorCQkJCXsKKwkJCQlwa2V5X3ByaW50X21lc3NhZ2UoInNpZ24iLCJlY2RzYSIsCisJCQkJCWVjZHNhX2Nbal1bMF0sIAorCQkJCQl0ZXN0X2N1cnZlc19iaXRzW2pdLAorCQkJCQlFQ0RTQV9TRUNPTkRTKTsKKworCQkJCVRpbWVfRihTVEFSVCk7CisJCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGVjZHNhX2Nbal1bMF0pOworCQkJCQljb3VudCsrKSAKKwkJCQkJeworCQkJCQlyZXQ9RUNEU0Ffc2lnbigwLCBidWYsIDIwLCAKKwkJCQkJCWVjZHNhc2lnLCAmZWNkc2FzaWdsZW4sCisJCQkJCQllY2RzYVtqXSk7CisJCQkJCWlmIChyZXQgPT0gMCkgCisJCQkJCQl7CisJCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFQ0RTQSBzaWduIGZhaWx1cmVcbiIpOworCQkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJCWNvdW50PTE7CisJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWQ9VGltZV9GKFNUT1ApOworCisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCBtciA/ICIrUjU6JWxkOiVkOiUuMmZcbiIgOgorCQkJCQkiJWxkICVkIGJpdCBFQ0RTQSBzaWducyBpbiAlLjJmcyBcbiIsIAorCQkJCQljb3VudCwgdGVzdF9jdXJ2ZXNfYml0c1tqXSwgZCk7CisJCQkJZWNkc2FfcmVzdWx0c1tqXVswXT1kLyhkb3VibGUpY291bnQ7CisJCQkJcnNhX2NvdW50PWNvdW50OworCQkJCX0KKworCQkJLyogUGVyZm9ybSBFQ0RTQSB2ZXJpZmljYXRpb24gdGVzdCAqLworCQkJcmV0PUVDRFNBX3ZlcmlmeSgwLCBidWYsIDIwLCBlY2RzYXNpZywgCisJCQkJZWNkc2FzaWdsZW4sIGVjZHNhW2pdKTsKKwkJCWlmIChyZXQgIT0gMSkgCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwiRUNEU0EgdmVyaWZ5IGZhaWx1cmUuICBObyBFQ0RTQSB2ZXJpZnkgd2lsbCBiZSBkb25lLlxuIik7CisJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQllY2RzYV9kb2l0W2pdID0gMDsKKwkJCQl9IAorCQkJZWxzZSAKKwkJCQl7CisJCQkJcGtleV9wcmludF9tZXNzYWdlKCJ2ZXJpZnkiLCJlY2RzYSIsCisJCQkJZWNkc2FfY1tqXVsxXSwKKwkJCQl0ZXN0X2N1cnZlc19iaXRzW2pdLAorCQkJCUVDRFNBX1NFQ09ORFMpOworCQkJCVRpbWVfRihTVEFSVCk7CisJCQkJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGVjZHNhX2Nbal1bMV0pOyBjb3VudCsrKSAKKwkJCQkJeworCQkJCQlyZXQ9RUNEU0FfdmVyaWZ5KDAsIGJ1ZiwgMjAsIGVjZHNhc2lnLCBlY2RzYXNpZ2xlbiwgZWNkc2Fbal0pOworCQkJCQlpZiAocmV0ICE9IDEpIAorCQkJCQkJeworCQkJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRUNEU0EgdmVyaWZ5IGZhaWx1cmVcbiIpOworCQkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJCWNvdW50PTE7CisJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWQ9VGltZV9GKFNUT1ApOworCQkJCUJJT19wcmludGYoYmlvX2VyciwgbXI/ICIrUjY6JWxkOiVkOiUuMmZcbiIKKwkJCQkJCTogIiVsZCAlZCBiaXQgRUNEU0EgdmVyaWZ5IGluICUuMmZzXG4iLAorCQkJCWNvdW50LCB0ZXN0X2N1cnZlc19iaXRzW2pdLCBkKTsKKwkJCQllY2RzYV9yZXN1bHRzW2pdWzFdPWQvKGRvdWJsZSljb3VudDsKKwkJCQl9CisKKwkJCWlmIChyc2FfY291bnQgPD0gMSkgCisJCQkJeworCQkJCS8qIGlmIGxvbmdlciB0aGFuIDEwcywgZG9uJ3QgZG8gYW55IG1vcmUgKi8KKwkJCQlmb3IgKGorKzsgajxFQ19OVU07IGorKykKKwkJCQllY2RzYV9kb2l0W2pdPTA7CisJCQkJfQorCQkJfQorCQl9CisJaWYgKHJuZF9mYWtlKSBSQU5EX2NsZWFudXAoKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWlmIChSQU5EX3N0YXR1cygpICE9IDEpCisJCXsKKwkJUkFORF9zZWVkKHJuZF9zZWVkLCBzaXplb2Ygcm5kX3NlZWQpOworCQlybmRfZmFrZSA9IDE7CisJCX0KKwlmb3IgKGo9MDsgajxFQ19OVU07IGorKykKKwkJeworCQlpZiAoIWVjZGhfZG9pdFtqXSkgY29udGludWU7CisJCWVjZGhfYVtqXSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSh0ZXN0X2N1cnZlc1tqXSk7CisJCWVjZGhfYltqXSA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZSh0ZXN0X2N1cnZlc1tqXSk7CisJCWlmICgoZWNkaF9hW2pdID09IE5VTEwpIHx8IChlY2RoX2Jbal0gPT0gTlVMTCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkVDREggZmFpbHVyZS5cbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCXJzYV9jb3VudD0xOworCQkJfQorCQllbHNlCisJCQl7CisJCQkvKiBnZW5lcmF0ZSB0d28gRUNESCBrZXkgcGFpcnMgKi8KKwkJCWlmICghRUNfS0VZX2dlbmVyYXRlX2tleShlY2RoX2Fbal0pIHx8CisJCQkJIUVDX0tFWV9nZW5lcmF0ZV9rZXkoZWNkaF9iW2pdKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJFQ0RIIGtleSBnZW5lcmF0aW9uIGZhaWx1cmUuXG4iKTsKKwkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCXJzYV9jb3VudD0xOwkJCisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkvKiBJZiBmaWVsZCBzaXplIGlzIG5vdCBtb3JlIHRoYW4gMjQgb2N0ZXRzLCB0aGVuIHVzZSBTSEEtMSBoYXNoIG9mIHJlc3VsdDsKKwkJCQkgKiBvdGhlcndpc2UsIHVzZSByZXN1bHQgKHNlZSBzZWN0aW9uIDQuOCBvZiBkcmFmdC1pZXRmLXRscy1lY2MtMDMudHh0KS4KKwkJCQkgKi8KKwkJCQlpbnQgZmllbGRfc2l6ZSwgb3V0bGVuOworCQkJCXZvaWQgKigqa2RmKShjb25zdCB2b2lkICppbiwgc2l6ZV90IGlubGVuLCB2b2lkICpvdXQsIHNpemVfdCAqeG91dGxlbik7CisJCQkJZmllbGRfc2l6ZSA9IEVDX0dST1VQX2dldF9kZWdyZWUoRUNfS0VZX2dldDBfZ3JvdXAoZWNkaF9hW2pdKSk7CisJCQkJaWYgKGZpZWxkX3NpemUgPD0gMjQgKiA4KQorCQkJCQl7CisJCQkJCW91dGxlbiA9IEtERjFfU0hBMV9sZW47CisJCQkJCWtkZiA9IEtERjFfU0hBMTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlvdXRsZW4gPSAoZmllbGRfc2l6ZSs3KS84OworCQkJCQlrZGYgPSBOVUxMOworCQkJCQl9CisJCQkJc2VjcmV0X3NpemVfYSA9IEVDREhfY29tcHV0ZV9rZXkoc2VjcmV0X2EsIG91dGxlbiwKKwkJCQkJRUNfS0VZX2dldDBfcHVibGljX2tleShlY2RoX2Jbal0pLAorCQkJCQllY2RoX2Fbal0sIGtkZik7CisJCQkJc2VjcmV0X3NpemVfYiA9IEVDREhfY29tcHV0ZV9rZXkoc2VjcmV0X2IsIG91dGxlbiwKKwkJCQkJRUNfS0VZX2dldDBfcHVibGljX2tleShlY2RoX2Fbal0pLAorCQkJCQllY2RoX2Jbal0sIGtkZik7CisJCQkJaWYgKHNlY3JldF9zaXplX2EgIT0gc2VjcmV0X3NpemVfYikgCisJCQkJCWVjZGhfY2hlY2tzID0gMDsKKwkJCQllbHNlCisJCQkJCWVjZGhfY2hlY2tzID0gMTsKKworCQkJCWZvciAoc2VjcmV0X2lkeCA9IDA7IAorCQkJCSAgICAoc2VjcmV0X2lkeCA8IHNlY3JldF9zaXplX2EpCisJCQkJCSYmIChlY2RoX2NoZWNrcyA9PSAxKTsKKwkJCQkgICAgc2VjcmV0X2lkeCsrKQorCQkJCQl7CisJCQkJCWlmIChzZWNyZXRfYVtzZWNyZXRfaWR4XSAhPSBzZWNyZXRfYltzZWNyZXRfaWR4XSkKKwkJCQkJZWNkaF9jaGVja3MgPSAwOworCQkJCQl9CisKKwkJCQlpZiAoZWNkaF9jaGVja3MgPT0gMCkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkVDREggY29tcHV0YXRpb25zIGRvbid0IG1hdGNoLlxuIik7CisJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJCXJzYV9jb3VudD0xOwkJCisJCQkJCX0KKworCQkJCXBrZXlfcHJpbnRfbWVzc2FnZSgiIiwiZWNkaCIsCisJCQkJZWNkaF9jW2pdWzBdLCAKKwkJCQl0ZXN0X2N1cnZlc19iaXRzW2pdLAorCQkJCUVDREhfU0VDT05EUyk7CisJCQkJVGltZV9GKFNUQVJUKTsKKwkJCQlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoZWNkaF9jW2pdWzBdKTsgY291bnQrKykKKwkJCQkJeworCQkJCQlFQ0RIX2NvbXB1dGVfa2V5KHNlY3JldF9hLCBvdXRsZW4sCisJCQkJCUVDX0tFWV9nZXQwX3B1YmxpY19rZXkoZWNkaF9iW2pdKSwKKwkJCQkJZWNkaF9hW2pdLCBrZGYpOworCQkJCQl9CisJCQkJZD1UaW1lX0YoU1RPUCk7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCBtciA/ICIrUjc6JWxkOiVkOiUuMmZcbiIgOiIlbGQgJWQtYml0IEVDREggb3BzIGluICUuMmZzXG4iLAorCQkJCWNvdW50LCB0ZXN0X2N1cnZlc19iaXRzW2pdLCBkKTsKKwkJCQllY2RoX3Jlc3VsdHNbal1bMF09ZC8oZG91YmxlKWNvdW50OworCQkJCXJzYV9jb3VudD1jb3VudDsKKwkJCQl9CisJCQl9CisKKworCQlpZiAocnNhX2NvdW50IDw9IDEpCisJCQl7CisJCQkvKiBpZiBsb25nZXIgdGhhbiAxMHMsIGRvbid0IGRvIGFueSBtb3JlICovCisJCQlmb3IgKGorKzsgajxFQ19OVU07IGorKykKKwkJCWVjZGhfZG9pdFtqXT0wOworCQkJfQorCQl9CisJaWYgKHJuZF9mYWtlKSBSQU5EX2NsZWFudXAoKTsKKyNlbmRpZgorI2lmbmRlZiBOT19GT1JLCitzaG93X3JlczoKKyNlbmRpZgorCWlmKCFtcikKKwkJeworCQlmcHJpbnRmKHN0ZG91dCwiJXNcbiIsU1NMZWF5X3ZlcnNpb24oU1NMRUFZX1ZFUlNJT04pKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsIiVzXG4iLFNTTGVheV92ZXJzaW9uKFNTTEVBWV9CVUlMVF9PTikpOworCQlwcmludGYoIm9wdGlvbnM6Iik7CisJCXByaW50ZigiJXMgIixCTl9vcHRpb25zKCkpOworI2lmbmRlZiBPUEVOU1NMX05PX01EMgorCQlwcmludGYoIiVzICIsTUQyX29wdGlvbnMoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKwkJcHJpbnRmKCIlcyAiLFJDNF9vcHRpb25zKCkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJCXByaW50ZigiJXMgIixERVNfb3B0aW9ucygpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCQlwcmludGYoIiVzICIsQUVTX29wdGlvbnMoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJCXByaW50ZigiJXMgIixpZGVhX29wdGlvbnMoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CRgorCQlwcmludGYoIiVzICIsQkZfb3B0aW9ucygpKTsKKyNlbmRpZgorCQlmcHJpbnRmKHN0ZG91dCwiXG4lc1xuIixTU0xlYXlfdmVyc2lvbihTU0xFQVlfQ0ZMQUdTKSk7CisJCX0KKworCWlmIChwcl9oZWFkZXIpCisJCXsKKwkJaWYobXIpCisJCQlmcHJpbnRmKHN0ZG91dCwiK0giKTsKKwkJZWxzZQorCQkJeworCQkJZnByaW50ZihzdGRvdXQsIlRoZSAnbnVtYmVycycgYXJlIGluIDEwMDBzIG9mIGJ5dGVzIHBlciBzZWNvbmQgcHJvY2Vzc2VkLlxuIik7IAorCQkJZnByaW50ZihzdGRvdXQsInR5cGUgICAgICAgICIpOworCQkJfQorCQlmb3IgKGo9MDsgIGo8U0laRV9OVU07IGorKykKKwkJCWZwcmludGYoc3Rkb3V0LG1yID8gIjolZCIgOiAiJTdkIGJ5dGVzIixsZW5ndGhzW2pdKTsKKwkJZnByaW50ZihzdGRvdXQsIlxuIik7CisJCX0KKworCWZvciAoaz0wOyBrPEFMR09SX05VTTsgaysrKQorCQl7CisJCWlmICghZG9pdFtrXSkgY29udGludWU7CisJCWlmKG1yKQorCQkJZnByaW50ZihzdGRvdXQsIitGOiVkOiVzIixrLG5hbWVzW2tdKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRvdXQsIiUtMTNzIixuYW1lc1trXSk7CisJCWZvciAoaj0wOyBqPFNJWkVfTlVNOyBqKyspCisJCQl7CisJCQlpZiAocmVzdWx0c1trXVtqXSA+IDEwMDAwICYmICFtcikKKwkJCQlmcHJpbnRmKHN0ZG91dCwiICUxMS4yZmsiLHJlc3VsdHNba11bal0vMWUzKTsKKwkJCWVsc2UKKwkJCQlmcHJpbnRmKHN0ZG91dCxtciA/ICI6JS4yZiIgOiAiICUxMS4yZiAiLHJlc3VsdHNba11bal0pOworCQkJfQorCQlmcHJpbnRmKHN0ZG91dCwiXG4iKTsKKwkJfQorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCWo9MTsKKwlmb3IgKGs9MDsgazxSU0FfTlVNOyBrKyspCisJCXsKKwkJaWYgKCFyc2FfZG9pdFtrXSkgY29udGludWU7CisJCWlmIChqICYmICFtcikKKwkJCXsKKwkJCXByaW50ZigiJTE4c3NpZ24gICAgdmVyaWZ5ICAgIHNpZ24vcyB2ZXJpZnkvc1xuIiwiICIpOworCQkJaj0wOworCQkJfQorCQlpZihtcikKKwkJCWZwcmludGYoc3Rkb3V0LCIrRjI6JXU6JXU6JWY6JWZcbiIsCisJCQkJayxyc2FfYml0c1trXSxyc2FfcmVzdWx0c1trXVswXSwKKwkJCQlyc2FfcmVzdWx0c1trXVsxXSk7CisJCWVsc2UKKwkJCWZwcmludGYoc3Rkb3V0LCJyc2EgJTR1IGJpdHMgJTguNmZzICU4LjZmcyAlOC4xZiAlOC4xZlxuIiwKKwkJCQlyc2FfYml0c1trXSxyc2FfcmVzdWx0c1trXVswXSxyc2FfcmVzdWx0c1trXVsxXSwKKwkJCQkxLjAvcnNhX3Jlc3VsdHNba11bMF0sMS4wL3JzYV9yZXN1bHRzW2tdWzFdKTsKKwkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJaj0xOworCWZvciAoaz0wOyBrPERTQV9OVU07IGsrKykKKwkJeworCQlpZiAoIWRzYV9kb2l0W2tdKSBjb250aW51ZTsKKwkJaWYgKGogJiYgIW1yKQorCQkJeworCQkJcHJpbnRmKCIlMThzc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zXG4iLCIgIik7CisJCQlqPTA7CisJCQl9CisJCWlmKG1yKQorCQkJZnByaW50ZihzdGRvdXQsIitGMzoldToldTolZjolZlxuIiwKKwkJCQlrLGRzYV9iaXRzW2tdLGRzYV9yZXN1bHRzW2tdWzBdLGRzYV9yZXN1bHRzW2tdWzFdKTsKKwkJZWxzZQorCQkJZnByaW50ZihzdGRvdXQsImRzYSAlNHUgYml0cyAlOC42ZnMgJTguNmZzICU4LjFmICU4LjFmXG4iLAorCQkJCWRzYV9iaXRzW2tdLGRzYV9yZXN1bHRzW2tdWzBdLGRzYV9yZXN1bHRzW2tdWzFdLAorCQkJCTEuMC9kc2FfcmVzdWx0c1trXVswXSwxLjAvZHNhX3Jlc3VsdHNba11bMV0pOworCQl9CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCWo9MTsKKwlmb3IgKGs9MDsgazxFQ19OVU07IGsrKykKKwkJeworCQlpZiAoIWVjZHNhX2RvaXRba10pIGNvbnRpbnVlOworCQlpZiAoaiAmJiAhbXIpCisJCQl7CisJCQlwcmludGYoIiUzMHNzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3NcbiIsIiAiKTsKKwkJCWo9MDsKKwkJCX0KKworCQlpZiAobXIpCisJCQlmcHJpbnRmKHN0ZG91dCwiK0Y0OiV1OiV1OiVmOiVmXG4iLCAKKwkJCQlrLCB0ZXN0X2N1cnZlc19iaXRzW2tdLAorCQkJCWVjZHNhX3Jlc3VsdHNba11bMF0sZWNkc2FfcmVzdWx0c1trXVsxXSk7CisJCWVsc2UKKwkJCWZwcmludGYoc3Rkb3V0LAorCQkJCSIlNHUgYml0IGVjZHNhICglcykgJTguNGZzICU4LjRmcyAlOC4xZiAlOC4xZlxuIiwgCisJCQkJdGVzdF9jdXJ2ZXNfYml0c1trXSwKKwkJCQl0ZXN0X2N1cnZlc19uYW1lc1trXSwKKwkJCQllY2RzYV9yZXN1bHRzW2tdWzBdLGVjZHNhX3Jlc3VsdHNba11bMV0sIAorCQkJCTEuMC9lY2RzYV9yZXN1bHRzW2tdWzBdLDEuMC9lY2RzYV9yZXN1bHRzW2tdWzFdKTsKKwkJfQorI2VuZGlmCisKKworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlqPTE7CisJZm9yIChrPTA7IGs8RUNfTlVNOyBrKyspCisJCXsKKwkJaWYgKCFlY2RoX2RvaXRba10pIGNvbnRpbnVlOworCQlpZiAoaiAmJiAhbXIpCisJCQl7CisJCQlwcmludGYoIiUzMHNvcCAgICAgIG9wL3NcbiIsIiAiKTsKKwkJCWo9MDsKKwkJCX0KKwkJaWYgKG1yKQorCQkJZnByaW50ZihzdGRvdXQsIitGNToldToldTolZjolZlxuIiwKKwkJCQlrLCB0ZXN0X2N1cnZlc19iaXRzW2tdLAorCQkJCWVjZGhfcmVzdWx0c1trXVswXSwgMS4wL2VjZGhfcmVzdWx0c1trXVswXSk7CisKKwkJZWxzZQorCQkJZnByaW50ZihzdGRvdXQsIiU0dSBiaXQgZWNkaCAoJXMpICU4LjRmcyAlOC4xZlxuIiwKKwkJCQl0ZXN0X2N1cnZlc19iaXRzW2tdLAorCQkJCXRlc3RfY3VydmVzX25hbWVzW2tdLAorCQkJCWVjZGhfcmVzdWx0c1trXVswXSwgMS4wL2VjZGhfcmVzdWx0c1trXVswXSk7CisJCX0KKyNlbmRpZgorCisJbXJldD0wOworCitlbmQ6CisJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwlpZiAoYnVmICE9IE5VTEwpIE9QRU5TU0xfZnJlZShidWYpOworCWlmIChidWYyICE9IE5VTEwpIE9QRU5TU0xfZnJlZShidWYyKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwlmb3IgKGk9MDsgaTxSU0FfTlVNOyBpKyspCisJCWlmIChyc2Ffa2V5W2ldICE9IE5VTEwpCisJCQlSU0FfZnJlZShyc2Ffa2V5W2ldKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCWZvciAoaT0wOyBpPERTQV9OVU07IGkrKykKKwkJaWYgKGRzYV9rZXlbaV0gIT0gTlVMTCkKKwkJCURTQV9mcmVlKGRzYV9rZXlbaV0pOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCWZvciAoaT0wOyBpPEVDX05VTTsgaSsrKQorCQlpZiAoZWNkc2FbaV0gIT0gTlVMTCkKKwkJCUVDX0tFWV9mcmVlKGVjZHNhW2ldKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlmb3IgKGk9MDsgaTxFQ19OVU07IGkrKykKKwl7CisJCWlmIChlY2RoX2FbaV0gIT0gTlVMTCkKKwkJCUVDX0tFWV9mcmVlKGVjZGhfYVtpXSk7CisJCWlmIChlY2RoX2JbaV0gIT0gTlVMTCkKKwkJCUVDX0tFWV9mcmVlKGVjZGhfYltpXSk7CisJfQorI2VuZGlmCisKKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKG1yZXQpOworCX0KKworc3RhdGljIHZvaWQgcHJpbnRfbWVzc2FnZShjb25zdCBjaGFyICpzLCBsb25nIG51bSwgaW50IGxlbmd0aCkKKwl7CisjaWZkZWYgU0lHQUxSTQorCUJJT19wcmludGYoYmlvX2VycixtciA/ICIrRFQ6JXM6JWQ6JWRcbiIKKwkJICAgOiAiRG9pbmcgJXMgZm9yICVkcyBvbiAlZCBzaXplIGJsb2NrczogIixzLFNFQ09ORFMsbGVuZ3RoKTsKKwkodm9pZClCSU9fZmx1c2goYmlvX2Vycik7CisJYWxhcm0oU0VDT05EUyk7CisjZWxzZQorCUJJT19wcmludGYoYmlvX2VycixtciA/ICIrRE46JXM6JWxkOiVkXG4iCisJCSAgIDogIkRvaW5nICVzICVsZCB0aW1lcyBvbiAlZCBzaXplIGJsb2NrczogIixzLG51bSxsZW5ndGgpOworCSh2b2lkKUJJT19mbHVzaChiaW9fZXJyKTsKKyNlbmRpZgorI2lmZGVmIExJTlQKKwludW09bnVtOworI2VuZGlmCisJfQorCitzdGF0aWMgdm9pZCBwa2V5X3ByaW50X21lc3NhZ2UoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpzdHIyLCBsb25nIG51bSwKKwlpbnQgYml0cywgaW50IHRtKQorCXsKKyNpZmRlZiBTSUdBTFJNCisJQklPX3ByaW50ZihiaW9fZXJyLG1yID8gIitEVFA6JWQ6JXM6JXM6JWRcbiIKKwkJCSAgIDogIkRvaW5nICVkIGJpdCAlcyAlcydzIGZvciAlZHM6ICIsYml0cyxzdHIsc3RyMix0bSk7CisJKHZvaWQpQklPX2ZsdXNoKGJpb19lcnIpOworCWFsYXJtKFJTQV9TRUNPTkRTKTsKKyNlbHNlCisJQklPX3ByaW50ZihiaW9fZXJyLG1yID8gIitETlA6JWxkOiVkOiVzOiVzXG4iCisJCQkgICA6ICJEb2luZyAlbGQgJWQgYml0ICVzICVzJ3M6ICIsbnVtLGJpdHMsc3RyLHN0cjIpOworCSh2b2lkKUJJT19mbHVzaChiaW9fZXJyKTsKKyNlbmRpZgorI2lmZGVmIExJTlQKKwludW09bnVtOworI2VuZGlmCisJfQorCitzdGF0aWMgdm9pZCBwcmludF9yZXN1bHQoaW50IGFsZyxpbnQgcnVuX25vLGludCBjb3VudCxkb3VibGUgdGltZV91c2VkKQorCXsKKwlCSU9fcHJpbnRmKGJpb19lcnIsbXIgPyAiK1I6JWQ6JXM6JWZcbiIKKwkJICAgOiAiJWQgJXMncyBpbiAlLjJmc1xuIixjb3VudCxuYW1lc1thbGddLHRpbWVfdXNlZCk7CisJcmVzdWx0c1thbGddW3J1bl9ub109KChkb3VibGUpY291bnQpL3RpbWVfdXNlZCpsZW5ndGhzW3J1bl9ub107CisJfQorCisjaWZuZGVmIE5PX0ZPUksKK3N0YXRpYyBjaGFyICpzc3Ryc2VwKGNoYXIgKipzdHJpbmcsIGNvbnN0IGNoYXIgKmRlbGltKQorICAgIHsKKyAgICBjaGFyIGlzZGVsaW1bMjU2XTsKKyAgICBjaGFyICp0b2tlbiA9ICpzdHJpbmc7CisKKyAgICBpZiAoKipzdHJpbmcgPT0gMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBtZW1zZXQoaXNkZWxpbSwgMCwgc2l6ZW9mIGlzZGVsaW0pOworICAgIGlzZGVsaW1bMF0gPSAxOworCisgICAgd2hpbGUgKCpkZWxpbSkKKyAgICAgICAgeworICAgICAgICBpc2RlbGltWyh1bnNpZ25lZCBjaGFyKSgqZGVsaW0pXSA9IDE7CisgICAgICAgIGRlbGltKys7CisgICAgICAgIH0KKworICAgIHdoaWxlICghaXNkZWxpbVsodW5zaWduZWQgY2hhcikoKipzdHJpbmcpXSkKKyAgICAgICAgeworICAgICAgICAoKnN0cmluZykrKzsKKyAgICAgICAgfQorCisgICAgaWYgKCoqc3RyaW5nKQorICAgICAgICB7CisgICAgICAgICoqc3RyaW5nID0gMDsKKyAgICAgICAgKCpzdHJpbmcpKys7CisgICAgICAgIH0KKworICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKK3N0YXRpYyBpbnQgZG9fbXVsdGkoaW50IG11bHRpKQorCXsKKwlpbnQgbjsKKwlpbnQgZmRbMl07CisJaW50ICpmZHM7CisJc3RhdGljIGNoYXIgc2VwW109IjoiOworCisJZmRzPW1hbGxvYyhtdWx0aSpzaXplb2YgKmZkcyk7CisJZm9yKG49MCA7IG4gPCBtdWx0aSA7ICsrbikKKwkJeworCQlwaXBlKGZkKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisJCWZmbHVzaChzdGRlcnIpOworCQlpZihmb3JrKCkpCisJCQl7CisJCQljbG9zZShmZFsxXSk7CisJCQlmZHNbbl09ZmRbMF07CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWNsb3NlKGZkWzBdKTsKKwkJCWNsb3NlKDEpOworCQkJZHVwKGZkWzFdKTsKKwkJCWNsb3NlKGZkWzFdKTsKKwkJCW1yPTE7CisJCQl1c2VydGltZT0wOworCQkJZnJlZShmZHMpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCXByaW50ZigiRm9ya2VkIGNoaWxkICVkXG4iLG4pOworCQl9CisKKwkvKiBmb3Igbm93LCBhc3N1bWUgdGhlIHBpcGUgaXMgbG9uZyBlbm91Z2ggdG8gdGFrZSBhbGwgdGhlIG91dHB1dCAqLworCWZvcihuPTAgOyBuIDwgbXVsdGkgOyArK24pCisJCXsKKwkJRklMRSAqZjsKKwkJY2hhciBidWZbMTAyNF07CisJCWNoYXIgKnA7CisKKwkJZj1mZG9wZW4oZmRzW25dLCJyIik7CisJCXdoaWxlKGZnZXRzKGJ1ZixzaXplb2YgYnVmLGYpKQorCQkJeworCQkJcD1zdHJjaHIoYnVmLCdcbicpOworCQkJaWYocCkKKwkJCQkqcD0nXDAnOworCQkJaWYoYnVmWzBdICE9ICcrJykKKwkJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsIkRvbid0IHVuZGVyc3RhbmQgbGluZSAnJXMnIGZyb20gY2hpbGQgJWRcbiIsCisJCQkJCQlidWYsbik7CisJCQkJY29udGludWU7CisJCQkJfQorCQkJcHJpbnRmKCJHb3Q6ICVzIGZyb20gJWRcbiIsYnVmLG4pOworCQkJaWYoIXN0cm5jbXAoYnVmLCIrRjoiLDMpKQorCQkJCXsKKwkJCQlpbnQgYWxnOworCQkJCWludCBqOworCisJCQkJcD1idWYrMzsKKwkJCQlhbGc9YXRvaShzc3Ryc2VwKCZwLHNlcCkpOworCQkJCXNzdHJzZXAoJnAsc2VwKTsKKwkJCQlmb3Ioaj0wIDsgaiA8IFNJWkVfTlVNIDsgKytqKQorCQkJCQlyZXN1bHRzW2FsZ11bal0rPWF0b2Yoc3N0cnNlcCgmcCxzZXApKTsKKwkJCQl9CisJCQllbHNlIGlmKCFzdHJuY21wKGJ1ZiwiK0YyOiIsNCkpCisJCQkJeworCQkJCWludCBrOworCQkJCWRvdWJsZSBkOworCQkJCQorCQkJCXA9YnVmKzQ7CisJCQkJaz1hdG9pKHNzdHJzZXAoJnAsc2VwKSk7CisJCQkJc3N0cnNlcCgmcCxzZXApOworCisJCQkJZD1hdG9mKHNzdHJzZXAoJnAsc2VwKSk7CisJCQkJaWYobikKKwkJCQkJcnNhX3Jlc3VsdHNba11bMF09MS8oMS9yc2FfcmVzdWx0c1trXVswXSsxL2QpOworCQkJCWVsc2UKKwkJCQkJcnNhX3Jlc3VsdHNba11bMF09ZDsKKworCQkJCWQ9YXRvZihzc3Ryc2VwKCZwLHNlcCkpOworCQkJCWlmKG4pCisJCQkJCXJzYV9yZXN1bHRzW2tdWzFdPTEvKDEvcnNhX3Jlc3VsdHNba11bMV0rMS9kKTsKKwkJCQllbHNlCisJCQkJCXJzYV9yZXN1bHRzW2tdWzFdPWQ7CisJCQkJfQorCQkJZWxzZSBpZighc3RybmNtcChidWYsIitGMjoiLDQpKQorCQkJCXsKKwkJCQlpbnQgazsKKwkJCQlkb3VibGUgZDsKKwkJCQkKKwkJCQlwPWJ1Zis0OworCQkJCWs9YXRvaShzc3Ryc2VwKCZwLHNlcCkpOworCQkJCXNzdHJzZXAoJnAsc2VwKTsKKworCQkJCWQ9YXRvZihzc3Ryc2VwKCZwLHNlcCkpOworCQkJCWlmKG4pCisJCQkJCXJzYV9yZXN1bHRzW2tdWzBdPTEvKDEvcnNhX3Jlc3VsdHNba11bMF0rMS9kKTsKKwkJCQllbHNlCisJCQkJCXJzYV9yZXN1bHRzW2tdWzBdPWQ7CisKKwkJCQlkPWF0b2Yoc3N0cnNlcCgmcCxzZXApKTsKKwkJCQlpZihuKQorCQkJCQlyc2FfcmVzdWx0c1trXVsxXT0xLygxL3JzYV9yZXN1bHRzW2tdWzFdKzEvZCk7CisJCQkJZWxzZQorCQkJCQlyc2FfcmVzdWx0c1trXVsxXT1kOworCQkJCX0KKwkJCWVsc2UgaWYoIXN0cm5jbXAoYnVmLCIrRjM6Iiw0KSkKKwkJCQl7CisJCQkJaW50IGs7CisJCQkJZG91YmxlIGQ7CisJCQkJCisJCQkJcD1idWYrNDsKKwkJCQlrPWF0b2koc3N0cnNlcCgmcCxzZXApKTsKKwkJCQlzc3Ryc2VwKCZwLHNlcCk7CisKKwkJCQlkPWF0b2Yoc3N0cnNlcCgmcCxzZXApKTsKKwkJCQlpZihuKQorCQkJCQlkc2FfcmVzdWx0c1trXVswXT0xLygxL2RzYV9yZXN1bHRzW2tdWzBdKzEvZCk7CisJCQkJZWxzZQorCQkJCQlkc2FfcmVzdWx0c1trXVswXT1kOworCisJCQkJZD1hdG9mKHNzdHJzZXAoJnAsc2VwKSk7CisJCQkJaWYobikKKwkJCQkJZHNhX3Jlc3VsdHNba11bMV09MS8oMS9kc2FfcmVzdWx0c1trXVsxXSsxL2QpOworCQkJCWVsc2UKKwkJCQkJZHNhX3Jlc3VsdHNba11bMV09ZDsKKwkJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwkJCWVsc2UgaWYoIXN0cm5jbXAoYnVmLCIrRjQ6Iiw0KSkKKwkJCQl7CisJCQkJaW50IGs7CisJCQkJZG91YmxlIGQ7CisJCQkJCisJCQkJcD1idWYrNDsKKwkJCQlrPWF0b2koc3N0cnNlcCgmcCxzZXApKTsKKwkJCQlzc3Ryc2VwKCZwLHNlcCk7CisKKwkJCQlkPWF0b2Yoc3N0cnNlcCgmcCxzZXApKTsKKwkJCQlpZihuKQorCQkJCQllY2RzYV9yZXN1bHRzW2tdWzBdPTEvKDEvZWNkc2FfcmVzdWx0c1trXVswXSsxL2QpOworCQkJCWVsc2UKKwkJCQkJZWNkc2FfcmVzdWx0c1trXVswXT1kOworCisJCQkJZD1hdG9mKHNzdHJzZXAoJnAsc2VwKSk7CisJCQkJaWYobikKKwkJCQkJZWNkc2FfcmVzdWx0c1trXVsxXT0xLygxL2VjZHNhX3Jlc3VsdHNba11bMV0rMS9kKTsKKwkJCQllbHNlCisJCQkJCWVjZHNhX3Jlc3VsdHNba11bMV09ZDsKKwkJCQl9CisjZW5kaWYgCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJCQllbHNlIGlmKCFzdHJuY21wKGJ1ZiwiK0Y1OiIsNCkpCisJCQkJeworCQkJCWludCBrOworCQkJCWRvdWJsZSBkOworCQkJCQorCQkJCXA9YnVmKzQ7CisJCQkJaz1hdG9pKHNzdHJzZXAoJnAsc2VwKSk7CisJCQkJc3N0cnNlcCgmcCxzZXApOworCisJCQkJZD1hdG9mKHNzdHJzZXAoJnAsc2VwKSk7CisJCQkJaWYobikKKwkJCQkJZWNkaF9yZXN1bHRzW2tdWzBdPTEvKDEvZWNkaF9yZXN1bHRzW2tdWzBdKzEvZCk7CisJCQkJZWxzZQorCQkJCQllY2RoX3Jlc3VsdHNba11bMF09ZDsKKworCQkJCX0KKyNlbmRpZgorCisJCQllbHNlIGlmKCFzdHJuY21wKGJ1ZiwiK0g6IiwzKSkKKwkJCQl7CisJCQkJfQorCQkJZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLCJVbmtub3duIHR5cGUgJyVzJyBmcm9tIGNoaWxkICVkXG4iLGJ1ZixuKTsKKwkJCX0KKworCQlmY2xvc2UoZik7CisJCX0KKwlmcmVlKGZkcyk7CisJcmV0dXJuIDE7CisJfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvc3BrYWMuYyBiL2xpYi9vcGVuc3NsL2FwcHMvc3BrYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTAxZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy9zcGthYy5jCkBAIC0wLDAgKzEsMzA4IEBACisvKiBhcHBzL3Nwa2FjLmMgKi8KKworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuIEJhc2VkIG9uIGFuIG9yaWdpbmFsIGlkZWEgYnkgTWFzc2ltaWxpYW5vIFBhbGEKKyAqIChtYWR3b2xmQG9wZW5jYS5vcmcpLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiYXBwcy5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCXNwa2FjX21haW4KKworLyogLWluIGFyZwktIGlucHV0IGZpbGUgLSBkZWZhdWx0IHN0ZGluCisgKiAtb3V0IGFyZwktIG91dHB1dCBmaWxlIC0gZGVmYXVsdCBzdGRvdXQKKyAqLworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCUVOR0lORSAqZSA9IE5VTEw7CisJaW50IGksYmFkb3BzPTAsIHJldCA9IDE7CisJQklPICppbiA9IE5VTEwsKm91dCA9IE5VTEw7CisJaW50IHZlcmlmeT0wLG5vb3V0PTAscHVia2V5PTA7CisJY2hhciAqaW5maWxlID0gTlVMTCwqb3V0ZmlsZSA9IE5VTEwsKnByb2c7CisJY2hhciAqcGFzc2FyZ2luID0gTlVMTCwgKnBhc3NpbiA9IE5VTEw7CisJY29uc3QgY2hhciAqc3BrYWMgPSAiU1BLQUMiLCAqc3Brc2VjdCA9ICJkZWZhdWx0IjsKKwljaGFyICpzcGtzdHIgPSBOVUxMOworCWNoYXIgKmNoYWxsZW5nZSA9IE5VTEwsICprZXlmaWxlID0gTlVMTDsKKwlDT05GICpjb25mID0gTlVMTDsKKwlORVRTQ0FQRV9TUEtJICpzcGtpID0gTlVMTDsKKwlFVlBfUEtFWSAqcGtleSA9IE5VTEw7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lPU5VTEw7CisjZW5kaWYKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKCFiaW9fZXJyKSBiaW9fZXJyID0gQklPX25ld19mcChzdGRlcnIsIEJJT19OT0NMT1NFKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJcHJvZz1hcmd2WzBdOworCWFyZ2MtLTsKKwlhcmd2Kys7CisJd2hpbGUgKGFyZ2MgPj0gMSkKKwkJeworCQlpZiAoc3RyY21wKCphcmd2LCItaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5maWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBhc3NpbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwYXNzYXJnaW49ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCIta2V5IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWtleWZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY2hhbGxlbmdlIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWNoYWxsZW5nZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zcGthYyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzcGthYz0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zcGtzZWN0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNwa3NlY3Q9ICooKythcmd2KTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWVuZ2luZT0gKigrK2FyZ3YpOworCQkJfQorI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vb3V0IikgPT0gMCkKKwkJCW5vb3V0PTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXB1YmtleSIpID09IDApCisJCQlwdWJrZXk9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdmVyaWZ5IikgPT0gMCkKKwkJCXZlcmlmeT0xOworCQllbHNlIGJhZG9wcyA9IDE7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQl9CisKKwlpZiAoYmFkb3BzKQorCQl7CitiYWQ6CisJCUJJT19wcmludGYoYmlvX2VyciwiJXMgW29wdGlvbnNdXG4iLHByb2cpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIndoZXJlIG9wdGlvbnMgYXJlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWluIGFyZyAgICAgICAgaW5wdXQgZmlsZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1vdXQgYXJnICAgICAgIG91dHB1dCBmaWxlXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWtleSBhcmcgICAgICAgY3JlYXRlIFNQS0FDIHVzaW5nIHByaXZhdGUga2V5XG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXBhc3NpbiBhcmcgICAgaW5wdXQgZmlsZSBwYXNzIHBocmFzZSBzb3VyY2VcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtY2hhbGxlbmdlIGFyZyBjaGFsbGVuZ2Ugc3RyaW5nXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXNwa2FjIGFyZyAgICAgYWx0ZXJuYXRpdmUgU1BLQUMgbmFtZVxuIik7CisJCUJJT19wcmludGYoYmlvX2VyciwiIC1ub291dCAgICAgICAgIGRvbid0IHByaW50IFNQS0FDXG4iKTsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLXB1YmtleSAgICAgICAgb3V0cHV0IHB1YmxpYyBrZXlcbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIiAtdmVyaWZ5ICAgICAgICB2ZXJpZnkgU1BLQUMgc2lnbmF0dXJlXG4iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgLWVuZ2luZSBlICAgICAgdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIpOworI2VuZGlmCisJCWdvdG8gZW5kOworCQl9CisKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCWlmKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmdpbiwgTlVMTCwgJnBhc3NpbiwgTlVMTCkpIHsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgZ2V0dGluZyBwYXNzd29yZFxuIik7CisJCWdvdG8gZW5kOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmKGtleWZpbGUpIHsKKwkJcGtleSA9IGxvYWRfa2V5KGJpb19lcnIsCisJCQkJc3RyY21wKGtleWZpbGUsICItIikgPyBrZXlmaWxlIDogTlVMTCwKKwkJCQlGT1JNQVRfUEVNLCAxLCBwYXNzaW4sIGUsICJwcml2YXRlIGtleSIpOworCQlpZighcGtleSkgeworCQkJZ290byBlbmQ7CisJCX0KKwkJc3BraSA9IE5FVFNDQVBFX1NQS0lfbmV3KCk7CisJCWlmKGNoYWxsZW5nZSkgQVNOMV9TVFJJTkdfc2V0KHNwa2ktPnNwa2FjLT5jaGFsbGVuZ2UsCisJCQkJCQkgY2hhbGxlbmdlLCAoaW50KXN0cmxlbihjaGFsbGVuZ2UpKTsKKwkJTkVUU0NBUEVfU1BLSV9zZXRfcHVia2V5KHNwa2ksIHBrZXkpOworCQlORVRTQ0FQRV9TUEtJX3NpZ24oc3BraSwgcGtleSwgRVZQX21kNSgpKTsKKwkJc3Brc3RyID0gTkVUU0NBUEVfU1BLSV9iNjRfZW5jb2RlKHNwa2kpOworCisJCWlmIChvdXRmaWxlKSBvdXQgPSBCSU9fbmV3X2ZpbGUob3V0ZmlsZSwgInciKTsKKwkJZWxzZSB7CisJCQlvdXQgPSBCSU9fbmV3X2ZwKHN0ZG91dCwgQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQkJeworCQkJICAgIEJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQkJICAgIG91dCA9IEJJT19wdXNoKHRtcGJpbywgb3V0KTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJaWYoIW91dCkgeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZVxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCX0KKwkJQklPX3ByaW50ZihvdXQsICJTUEtBQz0lc1xuIiwgc3Brc3RyKTsKKwkJT1BFTlNTTF9mcmVlKHNwa3N0cik7CisJCXJldCA9IDA7CisJCWdvdG8gZW5kOworCX0KKworCQorCisJaWYgKGluZmlsZSkgaW4gPSBCSU9fbmV3X2ZpbGUoaW5maWxlLCAiciIpOworCWVsc2UgaW4gPSBCSU9fbmV3X2ZwKHN0ZGluLCBCSU9fTk9DTE9TRSk7CisKKwlpZighaW4pIHsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3Igb3BlbmluZyBpbnB1dCBmaWxlXG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJfQorCisJY29uZiA9IE5DT05GX25ldyhOVUxMKTsKKwlpID0gTkNPTkZfbG9hZF9iaW8oY29uZiwgaW4sIE5VTEwpOworCisJaWYoIWkpIHsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgcGFyc2luZyBjb25maWcgZmlsZVxuIik7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCX0KKworCXNwa3N0ciA9IE5DT05GX2dldF9zdHJpbmcoY29uZiwgc3Brc2VjdCwgc3BrYWMpOworCQkKKwlpZighc3Brc3RyKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkNhbid0IGZpbmQgU1BLQUMgY2FsbGVkIFwiJXNcIlxuIiwgc3BrYWMpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlzcGtpID0gTkVUU0NBUEVfU1BLSV9iNjRfZGVjb2RlKHNwa3N0ciwgLTEpOworCQorCWlmKCFzcGtpKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGxvYWRpbmcgU1BLQUNcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAob3V0ZmlsZSkgb3V0ID0gQklPX25ld19maWxlKG91dGZpbGUsICJ3Iik7CisJZWxzZSB7CisJCW91dCA9IEJJT19uZXdfZnAoc3Rkb3V0LCBCSU9fTk9DTE9TRSk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJCXsKKwkJICAgIEJJTyAqdG1wYmlvID0gQklPX25ldyhCSU9fZl9saW5lYnVmZmVyKCkpOworCQkgICAgb3V0ID0gQklPX3B1c2godG1wYmlvLCBvdXQpOworCQl9CisjZW5kaWYKKwl9CisKKwlpZighb3V0KSB7CisJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGVcbiIpOworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZighbm9vdXQpIE5FVFNDQVBFX1NQS0lfcHJpbnQob3V0LCBzcGtpKTsKKwlwa2V5ID0gTkVUU0NBUEVfU1BLSV9nZXRfcHVia2V5KHNwa2kpOworCWlmKHZlcmlmeSkgeworCQlpID0gTkVUU0NBUEVfU1BLSV92ZXJpZnkoc3BraSwgcGtleSk7CisJCWlmIChpID4gMCkgQklPX3ByaW50ZihiaW9fZXJyLCAiU2lnbmF0dXJlIE9LXG4iKTsKKwkJZWxzZSB7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJTaWduYXR1cmUgRmFpbHVyZVxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCX0KKwl9CisJaWYocHVia2V5KSBQRU1fd3JpdGVfYmlvX1BVQktFWShvdXQsIHBrZXkpOworCisJcmV0ID0gMDsKKworZW5kOgorCU5DT05GX2ZyZWUoY29uZik7CisJTkVUU0NBUEVfU1BLSV9mcmVlKHNwa2kpOworCUJJT19mcmVlKGluKTsKKwlCSU9fZnJlZV9hbGwob3V0KTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCWlmKHBhc3NpbikgT1BFTlNTTF9mcmVlKHBhc3Npbik7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvdGVzdENBLnBlbSBiL2xpYi9vcGVuc3NsL2FwcHMvdGVzdENBLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I3MTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy90ZXN0Q0EucGVtCkBAIC0wLDAgKzEsOCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KK01JSUJCekNCc2dJQkFEQk5NUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERVgKK01CVUdBMVVFQ2hNT1RXbHVZMjl0SUZCMGVTQk1kR1F4RURBT0JnTlZCQU1UQjFSRlUxUWdRMEV3WERBTkJna3EKK2hraUc5dzBCQVFFRkFBTkxBREJJQWtFQXpXOWJyZ0E4ZWZUMk9EQitOcnNmbEpaajNLS3FLc200T3JYVFJxZkwKK1ZFVGoxd3MvekNYbDQyWEpBeGRXUU1DUDBsaUtmYzlVdDR4aTFxQ1ZJN04wN3dJREFRQUJvQUF3RFFZSktvWkkKK2h2Y05BUUVFQlFBRFFRQmpaWjQyRGV0OVV3MEFGd0p5NHVmVUV5NUN2NzRweEJwNVNabmxqZ0hZK0F6MEhzMlMKK3VOa0llZ3IySVRYNWF6S2k5bk9rZzlabXNtR0cxM0ZJamlDLworLS0tLS1FTkQgQ0VSVElGSUNBVEUgUkVRVUVTVC0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3Rlc3Rkc2EuaCBiL2xpYi9vcGVuc3NsL2FwcHMvdGVzdGRzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODRlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3Rlc3Rkc2EuaApAQCAtMCwwICsxLDIxNyBAQAorLyogTk9DVyAqLworLyogdXNlZCBieSBhcHBzL3NwZWVkLmMgKi8KK0RTQSAqZ2V0X2RzYTUxMih2b2lkICk7CitEU0EgKmdldF9kc2ExMDI0KHZvaWQgKTsKK0RTQSAqZ2V0X2RzYTIwNDgodm9pZCApOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHNhNTEyX3ByaXZbXSA9IHsKKwkweDY1LDB4ZTUsMHhjNywweDM4LDB4NjAsMHgyNCwweGI1LDB4ODksMHhkNCwweDljLDB4ZWIsMHg0YywKKwkweDljLDB4MWQsMHg3YSwweDIyLDB4YmQsMHhkMSwweGMyLDB4ZDIsCisJfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRzYTUxMl9wdWJbXSA9IHsKKwkweDAwLDB4OTUsMHhhNywweDBkLDB4ZWMsMHg5MywweDY4LDB4YmEsMHg1ZiwweGY3LDB4NWYsMHgwNywKKwkweGYyLDB4M2IsMHhhZCwweDZiLDB4MDEsMHhkYywweGJlLDB4ZWMsMHhkZSwweDA0LDB4N2EsMHgzYSwKKwkweDI3LDB4YjMsMHhlYywweDQ5LDB4ZmQsMHgwOCwweDQzLDB4M2QsMHg3ZSwweGE4LDB4MmMsMHg1ZSwKKwkweDdiLDB4YmIsMHhmYywweGY0LDB4NmUsMHhlYiwweDZjLDB4YjAsMHg2ZSwweGY4LDB4MDIsMHgxMiwKKwkweDhjLDB4MzgsMHg1ZCwweDgzLDB4NTYsMHg3ZCwweGVlLDB4NTMsMHgwNSwweDNlLDB4MjQsMHg4NCwKKwkweGJlLDB4YmEsMHgwYSwweDZiLDB4YzgsCisJfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRzYTUxMl9wW109eworCTB4OUQsMHgxQiwweDY5LDB4OEUsMHgyNiwweERCLDB4RjIsMHgyQiwweDExLDB4NzAsMHgxOSwweDg2LAorCTB4RjYsMHgxOSwweEM4LDB4RjgsMHgxOSwweEYyLDB4MTgsMHg1MywweDk0LDB4NDYsMHgwNiwweEQwLAorCTB4NjIsMHg1MCwweDMzLDB4NEIsMHgwMiwweDNDLDB4NTIsMHgzMCwweDAzLDB4OEIsMHgzQiwweEY5LAorCTB4NUYsMHhEMSwweDI0LDB4MDYsMHg0RiwweDdCLDB4NEMsMHhCQSwweEFBLDB4NDAsMHg5QiwweEZELAorCTB4OTYsMHhFNCwweDM3LDB4MzMsMHhCQiwweDJELDB4NUEsMHhENywweDVBLDB4MTEsMHg0MCwweDY2LAorCTB4QTIsMHg3NiwweDdELDB4MzEsCisJfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRzYTUxMl9xW109eworCTB4RkIsMHg1MywweEVGLDB4NTAsMHhCNCwweDQwLDB4OTIsMHgzMSwweDU2LDB4ODYsMHg1MywweDdBLAorCTB4RTgsMHg4QiwweDIyLDB4OUEsMHg0OSwweEZCLDB4NzEsMHg4RiwKKwl9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHNhNTEyX2dbXT17CisJMHg4MywweDNFLDB4ODgsMHhFNSwweEM1LDB4ODksMHg3MywweENFLDB4M0IsMHg2QywweDAxLDB4NDksCisJMHhCRiwweEIzLDB4QzcsMHg5RiwweDBBLDB4RUEsMHg0NCwweDkxLDB4RTUsMHgzMCwweEFBLDB4RDksCisJMHhCRSwweDVCLDB4NUYsMHhCNywweDEwLDB4RDcsMHg4OSwweEI3LDB4OEUsMHg3NCwweEZCLDB4Q0YsCisJMHgyOSwweDFFLDB4RUIsMHhBOCwweDJDLDB4NTQsMHg1MSwweEI4LDB4MTAsMHhERSwweEEwLDB4Q0UsCisJMHgyRiwweENDLDB4MjQsMHg2QiwweDkwLDB4NzcsMHhERSwweEEyLDB4NjgsMHhBNiwweDUyLDB4MTIsCisJMHhBMiwweDAzLDB4OUQsMHgyMCwKKwl9OworCitEU0EgKmdldF9kc2E1MTIoKQorCXsKKwlEU0EgKmRzYTsKKworCWlmICgoZHNhPURTQV9uZXcoKSkgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCWRzYS0+cHJpdl9rZXk9Qk5fYmluMmJuKGRzYTUxMl9wcml2LHNpemVvZihkc2E1MTJfcHJpdiksTlVMTCk7CisJZHNhLT5wdWJfa2V5PUJOX2JpbjJibihkc2E1MTJfcHViLHNpemVvZihkc2E1MTJfcHViKSxOVUxMKTsKKwlkc2EtPnA9Qk5fYmluMmJuKGRzYTUxMl9wLHNpemVvZihkc2E1MTJfcCksTlVMTCk7CisJZHNhLT5xPUJOX2JpbjJibihkc2E1MTJfcSxzaXplb2YoZHNhNTEyX3EpLE5VTEwpOworCWRzYS0+Zz1CTl9iaW4yYm4oZHNhNTEyX2csc2l6ZW9mKGRzYTUxMl9nKSxOVUxMKTsKKwlpZiAoKGRzYS0+cHJpdl9rZXkgPT0gTlVMTCkgfHwgKGRzYS0+cHViX2tleSA9PSBOVUxMKSB8fCAoZHNhLT5wID09IE5VTEwpIHx8CisJCQkJKGRzYS0+cSA9PSBOVUxMKSB8fCAoZHNhLT5nID09IE5VTEwpKQorCQlyZXR1cm4oTlVMTCk7CisJcmV0dXJuKGRzYSk7CisJfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBkc2ExMDI0X3ByaXZbXT17CisJMHg3ZCwweDIxLDB4ZGEsMHhiYiwweDYyLDB4MTUsMHg0NywweDM2LDB4MDcsMHg2NywweDEyLDB4ZTgsCisJMHg4YywweGFhLDB4MWMsMHhjZCwweDM4LDB4MTIsMHg2MSwweDE4LAorCX07CitzdGF0aWMgdW5zaWduZWQgY2hhciBkc2ExMDI0X3B1YltdPXsKKwkweDNjLDB4NGUsMHg5YywweDJhLDB4N2YsMHgxNiwweGMxLDB4MjUsMHhlYiwweGFjLDB4NzgsMHg2MywKKwkweDkwLDB4MTQsMHg4YywweDhiLDB4ZjQsMHg2OCwweDQzLDB4M2MsMHgyZCwweGVlLDB4NjUsMHg1MCwKKwkweDdkLDB4OWMsMHg4ZiwweDhjLDB4OGEsMHg1MSwweGQ2LDB4MTEsMHgyYiwweDk5LDB4YWYsMHgxZSwKKwkweDkwLDB4OTcsMHhiNSwweGQzLDB4YTYsMHgyMCwweDI1LDB4ZDYsMHhmZSwweDQzLDB4MDIsMHhkNSwKKwkweDkxLDB4N2QsMHhhNywweDhjLDB4ZGIsMHhjOSwweDg1LDB4YTMsMHgzNiwweDQ4LDB4ZjcsMHg2OCwKKwkweGFhLDB4NjAsMHhiMSwweGY3LDB4MDUsMHg2OCwweDNhLDB4YTMsMHgzZiwweGQzLDB4MTksMHg4MiwKKwkweGQ4LDB4ODIsMHg3YSwweDc3LDB4ZmIsMHhlZiwweGY0LDB4MTUsMHgwYSwweGViLDB4MDYsMHgwNCwKKwkweDdmLDB4NTMsMHgwNywweDBjLDB4YmMsMHhjYiwweDJkLDB4ODMsMHhkYiwweDNlLDB4ZDEsMHgyOCwKKwkweGE1LDB4YTEsMHgzMSwweGUwLDB4NjcsMHhmYSwweDUwLDB4ZGUsMHg5YiwweDA3LDB4ODMsMHg3ZSwKKwkweDJjLDB4MGIsMHhjMywweDEzLDB4NTAsMHg2MSwweGU1LDB4YWQsMHhiZCwweDM2LDB4YjgsMHg5NywKKwkweDRlLDB4NDAsMHg3ZCwweGU4LDB4ODMsMHgwZCwweGJjLDB4NGIKKwl9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHNhMTAyNF9wW109eworCTB4QTcsMHgzRiwweDZFLDB4ODUsMHhCRiwweDQxLDB4NkEsMHgyOSwweDdELDB4RjAsMHg5RiwweDQ3LAorCTB4MTksMHgzMCwweDkwLDB4OUEsMHgwOSwweDFELDB4REEsMHg2QSwweDMzLDB4MUUsMHhDNSwweDNELAorCTB4ODYsMHg5NiwweEIzLDB4MTUsMHhFMCwweDUzLDB4MkUsMHg4RiwweEUwLDB4NTksMHg4MiwweDczLAorCTB4OTAsMHgzRSwweDc1LDB4MzEsMHg5OSwweDQ3LDB4N0EsMHg1MiwweEZCLDB4ODUsMHhFNCwweEQ5LAorCTB4QTYsMHg3QiwweDM4LDB4OUIsMHg2OCwweDhBLDB4ODQsMHg5QiwweDg3LDB4QzYsMHgxRSwweEI1LAorCTB4N0UsMHg4NiwweDRCLDB4NTMsMHg1QiwweDU5LDB4Q0YsMHg3MSwweDY1LDB4MTksMHg4OCwweDZFLAorCTB4Q0UsMHg2NiwweEFFLDB4NkIsMHg4OCwweDM2LDB4RkIsMHhFQywweDI4LDB4REMsMHhDMiwweEQ3LAorCTB4QTUsMHhCQiwweEU1LDB4MkMsMHgzOSwweDI2LDB4NEIsMHhEQSwweDlBLDB4NzAsMHgxOCwweDk1LAorCTB4MzcsMHg5NSwweDEwLDB4NTYsMHgyMywweEY2LDB4MTUsMHhFRCwweEJBLDB4MDQsMHg1RSwweERFLAorCTB4MzksMHg0RiwweEZELDB4QjcsMHg0MywweDFGLDB4QjUsMHhBNCwweDY1LDB4NkYsMHhDRCwweDgwLAorCTB4MTEsMHhFNCwweDcwLDB4OTUsMHg1QiwweDUwLDB4Q0QsMHg0OSwKKwl9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHNhMTAyNF9xW109eworCTB4RjcsMHgwNywweDMxLDB4RUQsMHhGQSwweDZDLDB4MDYsMHgwMywweEQ1LDB4ODUsMHg4QSwweDFDLAorCTB4QUMsMHg5QywweDY1LDB4RTcsMHg1MCwweDY2LDB4NjUsMHg2RiwKKwl9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgZHNhMTAyNF9nW109eworCTB4NEQsMHhERiwweDRDLDB4MDMsMHhBNiwweDkxLDB4OEEsMHhGNSwweDE5LDB4NkYsMHg1MCwweDQ2LAorCTB4MjUsMHg5OSwweEU1LDB4NjgsMHg2RiwweDMwLDB4RTMsMHg2OSwweEUxLDB4RTUsMHhCMywweDVELAorCTB4OTgsMHhCQiwweDI4LDB4ODYsMHg0OCwweEZDLDB4REUsMHg5OSwweDA0LDB4M0YsMHg1RiwweDg4LAorCTB4MEMsMHg5QywweDczLDB4MjQsMHgwRCwweDIwLDB4NUQsMHhCOSwweDJBLDB4OUEsMHgzRiwweDE4LAorCTB4OTYsMHgyNywweEU0LDB4NjIsMHg4NywweEMxLDB4N0IsMHg3NCwweDYyLDB4NTMsMHhGQywweDYxLAorCTB4MjcsMHhBOCwweDdBLDB4OTEsMHgwOSwweDlELDB4QjYsMHhGMSwweDRELDB4OUMsMHg1NCwweDBGLAorCTB4NTgsMHgwNiwweEVFLDB4NDksMHg3NCwweDA3LDB4Q0UsMHg1NSwweDdFLDB4MjMsMHhDRSwweDE2LAorCTB4RjYsMHhDQSwweERDLDB4NUEsMHg2MSwweDAxLDB4N0UsMHhDOSwweDcxLDB4QjUsMHg0RCwweEY2LAorCTB4REMsMHgzNCwweDI5LDB4ODcsMHg2OCwweEY2LDB4NUUsMHgyMCwweDkzLDB4QjMsMHhEQiwweEY1LAorCTB4RTQsMHgwOSwweDZDLDB4NDEsMHgxNywweDk1LDB4OTIsMHhFQiwweDAxLDB4QjUsMHg3MywweEE1LAorCTB4NkEsMHg3RSwweEQ4LDB4MzIsMHhFRCwweDBFLDB4MDIsMHhCOCwKKwl9OworCitEU0EgKmdldF9kc2ExMDI0KCkKKwl7CisJRFNBICpkc2E7CisKKwlpZiAoKGRzYT1EU0FfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlkc2EtPnByaXZfa2V5PUJOX2JpbjJibihkc2ExMDI0X3ByaXYsc2l6ZW9mKGRzYTEwMjRfcHJpdiksTlVMTCk7CisJZHNhLT5wdWJfa2V5PUJOX2JpbjJibihkc2ExMDI0X3B1YixzaXplb2YoZHNhMTAyNF9wdWIpLE5VTEwpOworCWRzYS0+cD1CTl9iaW4yYm4oZHNhMTAyNF9wLHNpemVvZihkc2ExMDI0X3ApLE5VTEwpOworCWRzYS0+cT1CTl9iaW4yYm4oZHNhMTAyNF9xLHNpemVvZihkc2ExMDI0X3EpLE5VTEwpOworCWRzYS0+Zz1CTl9iaW4yYm4oZHNhMTAyNF9nLHNpemVvZihkc2ExMDI0X2cpLE5VTEwpOworCWlmICgoZHNhLT5wcml2X2tleSA9PSBOVUxMKSB8fCAoZHNhLT5wdWJfa2V5ID09IE5VTEwpIHx8IChkc2EtPnAgPT0gTlVMTCkgfHwKKwkJCQkoZHNhLT5xID09IE5VTEwpIHx8IChkc2EtPmcgPT0gTlVMTCkpCisJCXJldHVybihOVUxMKTsKKwlyZXR1cm4oZHNhKTsKKwl9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRzYTIwNDhfcHJpdltdPXsKKwkweDMyLDB4NjcsMHg5MiwweGY2LDB4YzQsMHhlMiwweGUyLDB4ZTgsMHhhMCwweDhiLDB4NmIsMHg0NSwKKwkweDBjLDB4OGEsMHg3NiwweGIwLDB4ZWUsMHhjZiwweDkxLDB4YTcsCisJfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRzYTIwNDhfcHViW109eworCTB4MTcsMHg4ZiwweGE4LDB4MTEsMHg4NCwweDkyLDB4ZWMsMHg4MywweDQ3LDB4YzcsMHg2YSwweGIwLAorCTB4OTIsMHhhZiwweDVhLDB4MjAsMHgzNywweGEzLDB4NjQsMHg3OSwweGQyLDB4ZDAsMHgzZCwweGNkLAorCTB4ZTAsMHg2MSwweDg4LDB4ODgsMHgyMSwweGNjLDB4NzQsMHg1ZCwweGNlLDB4NGMsMHg1MSwweDQ3LAorCTB4ZjAsMHhjNSwweDVjLDB4NGMsMHg4MiwweDdhLDB4YWYsMHg3MiwweGFkLDB4YjksMHhlMCwweDUzLAorCTB4ZjIsMHg3OCwweGI3LDB4ZjAsMHhiNSwweDQ4LDB4N2YsMHg4YSwweDNhLDB4MTgsMHhkMSwweDlmLAorCTB4OGIsMHg3ZCwweGE1LDB4NDcsMHhiNywweDk1LDB4YWIsMHg5OCwweGY4LDB4N2IsMHg3NCwweDUwLAorCTB4NTYsMHg4ZSwweDU3LDB4ZjAsMHhlZSwweGY1LDB4YjcsMHhiYSwweGFiLDB4ODUsMHg4NiwweGY5LAorCTB4MmIsMHhlZiwweDQxLDB4NTYsMHhhMCwweGE0LDB4OWYsMHhiNywweDM4LDB4MDAsMHg0NiwweDBhLAorCTB4YTYsMHhmMSwweGZjLDB4MWYsMHhkOCwweDRlLDB4ODUsMHg0NCwweDkyLDB4NDMsMHgyMSwweDVkLAorCTB4NmUsMHhjYywweGMyLDB4Y2IsMHgyNiwweDMxLDB4MGQsMHgyMSwweGM0LDB4YmQsMHg4ZCwweDI0LAorCTB4YmMsMHhkOSwweDE4LDB4MTksMHhkNywweGRjLDB4ZjEsMHhlNywweDkzLDB4NTAsMHg0OCwweDAzLAorCTB4MmMsMHhhZSwweDJlLDB4ZTcsMHg0OSwweDg4LDB4NWYsMHg5MywweDU3LDB4MjcsMHg5OSwweDM2LAorCTB4YjQsMHgyMCwweGFiLDB4ZmMsMHhhNywweDJiLDB4ZjIsMHhkOSwweDk4LDB4ZDcsMHhkNCwweDM0LAorCTB4OWQsMHg5NiwweDUwLDB4NTgsMHg5YSwweGVhLDB4NTQsMHhmMywweGVlLDB4ZjUsMHg2MywweDE0LAorCTB4ZWUsMHg4NSwweDgzLDB4NzQsMHg3NiwweGUxLDB4NTIsMHg5NSwweGMzLDB4ZjcsMHhlYiwweDA0LAorCTB4MDQsMHg3YiwweGE3LDB4MjgsMHgxYiwweGNjLDB4ZWEsMHg0YSwweDRlLDB4ODQsMHhkYSwweGQ4LAorCTB4OWMsMHg3OSwweGQ4LDB4OWIsMHg2NiwweDg5LDB4MmYsMHhjZiwweGFjLDB4ZDcsMHg3OSwweGY5LAorCTB4YTksMHhkOCwweDQ1LDB4MTMsMHg3OCwweGI5LDB4MDAsMHgxNCwweGM5LDB4N2UsMHgyMiwweDUxLAorCTB4ODYsMHg2NywweGIwLDB4OWYsMHgyNiwweDExLDB4MjMsMHhjOCwweDM4LDB4ZDcsMHg3MCwweDFkLAorCTB4MTUsMHg4ZSwweDRkLDB4NGYsMHg5NSwweDk3LDB4NDAsMHhhMSwweGMyLDB4N2UsMHgwMSwweDE4LAorCTB4NzIsMHhmNCwweDEwLDB4ZTYsMHg4ZCwweDUyLDB4MTYsMHg3ZiwweGYyLDB4YzksMHhmOCwweDMzLAorCTB4OGIsMHgzMywweGI3LDB4Y2UsCisJfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRzYTIwNDhfcFtdPXsKKwkweEEwLDB4MjUsMHhGQSwweEFELDB4RjQsMHg4RSwweEI5LDB4RTUsMHg5OSwweEYzLDB4NUQsMHg2RiwKKwkweDRGLDB4ODMsMHgzNCwweEUyLDB4N0UsMHhDRiwweDZGLDB4QkYsMHgzMCwweEFGLDB4NkYsMHg4MSwKKwkweEVCLDB4RjgsMHhDNCwweDEzLDB4RDksMHhBMCwweDVELDB4OEIsMHg1QywweDhFLDB4REMsMHhDMiwKKwkweDFELDB4MEIsMHg0MSwweDMyLDB4QjAsMHgxRiwweEZFLDB4RUYsMHgwQywweEMyLDB4QTIsMHg3RSwKKwkweDY4LDB4NUMsMHgyOCwweDIxLDB4RTksMHhGNSwweEIxLDB4NTgsMHgxMiwweDYzLDB4NEMsMHgxOSwKKwkweDRFLDB4RkYsMHgwMiwweDRCLDB4OTIsMHhFRCwweEQyLDB4MDcsMHgxMSwweDRELDB4OEMsMHg1OCwKKwkweDE2LDB4NUMsMHg1NSwweDhFLDB4QUQsMHhBMywweDY3LDB4N0QsMHhCOSwweDg2LDB4NkUsMHgwQiwKKwkweEU2LDB4NTQsMHg2RiwweDQwLDB4QUUsMHgwRSwweDY3LDB4NEMsMHhGOSwweDEyLDB4NUIsMHgzQywKKwkweDA4LDB4N0EsMHhGNywweEZDLDB4NjcsMHg4NiwweDY5LDB4RTcsMHgwQSwweDk0LDB4NDAsMHhCRiwKKwkweDhCLDB4NzYsMHhGRSwweDI2LDB4RDEsMHhGMiwweEExLDB4MUEsMHg4NCwweEExLDB4NDMsMHg1NiwKKwkweDI4LDB4QkMsMHg5QSwweDVGLDB4RDcsMHgzQiwweDY5LDB4ODksMHg4QSwweDM2LDB4MkMsMHg1MSwKKwkweERGLDB4MTIsMHg3NywweDJGLDB4NTcsMHg3QiwweEEwLDB4QUEsMHhERCwweDdGLDB4QTEsMHg2MiwKKwkweDNCLDB4NDAsMHg3QiwweDY4LDB4MUEsMHg4RiwweDBELDB4MzgsMHhCQiwweDIxLDB4NUQsMHgxOCwKKwkweEZDLDB4MEYsMHg0NiwweEY3LDB4QTMsMHhCMCwweDFELDB4MjMsMHhDMywweEQyLDB4QzcsMHg3MiwKKwkweDUxLDB4MTgsMHhERiwweDQ2LDB4OTUsMHg3OSwweEQ5LDB4QkQsMHhCNSwweDE5LDB4MDIsMHgyQywKKwkweDg3LDB4REMsMHhFNywweDU3LDB4ODIsMHg3RSwweEYxLDB4OEIsMHgwNiwweDNELDB4MDAsMHhBNSwKKwkweDdCLDB4NkIsMHgyNiwweDI3LDB4OTEsMHgwRiwweDZBLDB4NzcsMHhFNCwweEQ1LDB4MDQsMHhFNCwKKwkweDEyLDB4MkMsMHg0MiwweEZGLDB4RDIsMHg4OCwweEJCLDB4RDMsMHg5MiwweEEwLDB4RjksMHhDOCwKKwkweDUxLDB4NjQsMHgxNCwweDVDLDB4RDgsMHhGOSwweDZDLDB4NDcsMHg4MiwweEI0LDB4MUMsMHg3RiwKKwkweDA5LDB4QjgsMHhGMCwweDI1LDB4ODMsMHgxRCwweDNGLDB4M0YsMHgwNSwweEIzLDB4MjEsMHgwQSwKKwkweDVELDB4QTcsMHhEOCwweDU0LDB4QzMsMHg2NSwweDdELDB4QzMsMHhCMCwweDFELDB4QkYsMHhBRSwKKwkweEY4LDB4NjgsMHhDRiwweDlCLAorCX07CitzdGF0aWMgdW5zaWduZWQgY2hhciBkc2EyMDQ4X3FbXT17CisJMHg5NywweEU3LDB4MzMsMHg0RCwweEQzLDB4OTQsMHgzRSwweDBCLDB4REIsMHg2MiwweDc0LDB4QzYsCisJMHhBMSwweDA4LDB4REQsMHgxOSwweEEzLDB4NzUsMHgxNywweDFCLAorCX07CitzdGF0aWMgdW5zaWduZWQgY2hhciBkc2EyMDQ4X2dbXT17CisJMHgyQywweDc4LDB4MTYsMHg1OSwweDM0LDB4NjMsMHhGNCwweEYzLDB4OTIsMHhGQywweEI1LDB4QTUsCisJMHg0RiwweDEzLDB4REUsMHgyRiwweDFDLDB4QTQsMHgzQywweEFFLDB4QUQsMHgzOCwweDNGLDB4N0UsCisJMHg5MCwweEJGLDB4OTYsMHhBNiwweEFFLDB4MjUsMHg5MCwweDcyLDB4RjUsMHg4RSwweDgwLDB4MEMsCisJMHgzOSwweDFDLDB4RDksMHhFQywweEJBLDB4OTAsMHg1QiwweDNBLDB4RTgsMHg1OCwweDZDLDB4OUUsCisJMHgzMCwweDQyLDB4MzcsMHgwMiwweDMxLDB4ODIsMHhCQywweDZBLDB4REYsMHg2QSwweDA5LDB4MjksCisJMHhFMywweEMwLDB4NDYsMHhEMSwweENCLDB4ODUsMHhFQywweDBDLDB4MzAsMHg1RSwweEVBLDB4QzgsCisJMHgzOSwweDhFLDB4MjIsMHg5RiwweDIyLDB4MTAsMHhEMiwweDM0LDB4NjEsMHg2OCwweDM3LDB4M0QsCisJMHgyRSwweDRBLDB4NUIsMHg5QSwweEY1LDB4QzEsMHg0OCwweEM2LDB4RjYsMHhEQywweDYzLDB4MUEsCisJMHhEMywweDk2LDB4NjQsMHhCQSwweDM0LDB4QzksMHhEMSwweEEwLDB4RDEsMHhBRSwweDZDLDB4MkYsCisJMHg0OCwweDE3LDB4OTMsMHgxNCwweDQzLDB4RUQsMHhGMCwweDIxLDB4MzAsMHgxOSwweEMzLDB4MUIsCisJMHg1RiwweERFLDB4QTMsMHhGMCwweDcwLDB4NzgsMHgxOCwweEUxLDB4QTgsMHhFNCwweEVFLDB4MkUsCisJMHgwMCwweEE1LDB4RTQsMHhCMywweDE3LDB4QzgsMHgwQywweDdELDB4NkUsMHg0MiwweERDLDB4QjcsCisJMHg0NiwweDAwLDB4MzYsMHg0RCwweEQ0LDB4NDYsMHhBQSwweDNELDB4M0MsMHg0NiwweDg5LDB4NDAsCisJMHhCRiwweDFELDB4ODQsMHg3NywweDBBLDB4NzUsMHhGMywweDg3LDB4MUQsMHgwOCwweDRDLDB4QTYsCisJMHhEMSwweEE5LDB4MUMsMHgxRSwweDEyLDB4MUUsMHhFMSwweEM3LDB4MzAsMHgyOCwweDc2LDB4QTUsCisJMHg3RiwweDZDLDB4ODUsMHg5NiwweDJCLDB4NkYsMHhEQiwweDgwLDB4NjYsMHgyNiwweEFFLDB4RjUsCisJMHg5MywweEM3LDB4OEUsMHhBRSwweDlBLDB4RUQsMHhFNCwweENBLDB4MDQsMHhFQSwweDNCLDB4NzIsCisJMHhFRiwweERDLDB4ODcsMHhFRCwweDBELDB4QTUsMHg0QywweDRBLDB4REQsMHg3MSwweDIyLDB4NjQsCisJMHg1OSwweDY5LDB4NEUsMHg4RSwweEJGLDB4NDMsMHhEQywweEFCLDB4OEUsMHg2NiwweEJCLDB4MDEsCisJMHhCNiwweEY0LDB4RTcsMHhGRCwweEQyLDB4QUQsMHg5RiwweDM2LDB4QzEsMHhBMCwweDI5LDB4OTksCisJMHhEMSwweDk2LDB4NzAsMHg1OSwweDA2LDB4NzgsMHgzNSwweEJELDB4NjUsMHg1NSwweDUyLDB4OUUsCisJMHhGOCwweEIyLDB4RTUsMHgzOCwKKwl9OworIAorRFNBICpnZXRfZHNhMjA0OCgpCisJeworCURTQSAqZHNhOworIAorCWlmICgoZHNhPURTQV9uZXcoKSkgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCWRzYS0+cHJpdl9rZXk9Qk5fYmluMmJuKGRzYTIwNDhfcHJpdixzaXplb2YoZHNhMjA0OF9wcml2KSxOVUxMKTsKKwlkc2EtPnB1Yl9rZXk9Qk5fYmluMmJuKGRzYTIwNDhfcHViLHNpemVvZihkc2EyMDQ4X3B1YiksTlVMTCk7CisJZHNhLT5wPUJOX2JpbjJibihkc2EyMDQ4X3Asc2l6ZW9mKGRzYTIwNDhfcCksTlVMTCk7CisJZHNhLT5xPUJOX2JpbjJibihkc2EyMDQ4X3Esc2l6ZW9mKGRzYTIwNDhfcSksTlVMTCk7CisJZHNhLT5nPUJOX2JpbjJibihkc2EyMDQ4X2csc2l6ZW9mKGRzYTIwNDhfZyksTlVMTCk7CisJaWYgKChkc2EtPnByaXZfa2V5ID09IE5VTEwpIHx8IChkc2EtPnB1Yl9rZXkgPT0gTlVMTCkgfHwgKGRzYS0+cCA9PSBOVUxMKSB8fAorCQkJCShkc2EtPnEgPT0gTlVMTCkgfHwgKGRzYS0+ZyA9PSBOVUxMKSkKKwkJcmV0dXJuKE5VTEwpOworCXJldHVybihkc2EpOworCX0KKworc3RhdGljIGNvbnN0IGNoYXIgcm5kX3NlZWRbXSA9ICJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHkiOworc3RhdGljIGludCBybmRfZmFrZSA9IDA7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3Rlc3Ryc2EuaCBiL2xpYi9vcGVuc3NsL2FwcHMvdGVzdHJzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDdkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3Rlc3Ryc2EuaApAQCAtMCwwICsxLDUxOCBAQAorLyogYXBwcy90ZXN0cnNhLmggKi8KKy8qIHVzZWQgYnkgYXBwcy9zcGVlZC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRlc3Q1MTJbXT17CisJMHgzMCwweDgyLDB4MDEsMHgzYSwweDAyLDB4MDEsMHgwMCwweDAyLDB4NDEsMHgwMCwKKwkweGQ2LDB4MzMsMHhiOSwweGM4LDB4ZmIsMHg0ZiwweDNjLDB4N2QsMHhjMCwweDAxLAorCTB4ODYsMHhkMCwweGU3LDB4YTAsMHg1NSwweGYyLDB4OTUsMHg5MywweGNjLDB4NGYsCisJMHhiNywweDViLDB4NjcsMHg1YiwweDk0LDB4NjgsMHhjOSwweDM0LDB4MTUsMHhkZSwKKwkweGE1LDB4MmUsMHgxYywweDMzLDB4YzIsMHg2ZSwweGZjLDB4MzQsMHg1ZSwweDcxLAorCTB4MTMsMHhiNywweGQ2LDB4ZWUsMHhkOCwweGE1LDB4NjUsMHgwNSwweDcyLDB4ODcsCisJMHhhOCwweGIwLDB4NzcsMHhmZSwweDU3LDB4ZjUsMHhmYywweDVmLDB4NTUsMHg4MywKKwkweDg3LDB4ZGQsMHg1NywweDQ5LDB4MDIsMHgwMywweDAxLDB4MDAsMHgwMSwweDAyLAorCTB4NDEsMHgwMCwweGE3LDB4ZjcsMHg5MSwweGM1LDB4MGYsMHg4NCwweDU3LDB4ZGMsCisJMHgwNywweGY3LDB4NmEsMHg3ZiwweDYwLDB4NTIsMHhiMywweDcyLDB4ZjEsMHg2NiwKKwkweDFmLDB4N2QsMHg5NywweDNiLDB4OWUsMHhiNiwweDBhLDB4OGYsMHg4YywweGNmLAorCTB4NDIsMHgyMywweDAwLDB4MDQsMHhkNCwweDI4LDB4MGUsMHgxYywweDkwLDB4YzQsCisJMHgxMSwweDI1LDB4MjUsMHhhNSwweDkzLDB4YTUsMHgyZiwweDcwLDB4MDIsMHhkZiwKKwkweDgxLDB4OWMsMHg0OSwweDAzLDB4YTAsMHhmOCwweDZkLDB4NTQsMHgyZSwweDI2LAorCTB4ZGUsMHhhYSwweDg1LDB4NTksMHhhOCwweDMxLDB4MDIsMHgyMSwweDAwLDB4ZWIsCisJMHg0NywweGQ3LDB4M2IsMHhmNiwweGMzLDB4ZGQsMHg1YSwweDQ2LDB4YzUsMHhiOSwKKwkweDJiLDB4OWEsMHhhMCwweDA5LDB4OGYsMHhhNiwweGZiLDB4ZjMsMHg3OCwweDdhLAorCTB4MzMsMHg3MCwweDlkLDB4MGYsMHg0MiwweDZiLDB4MTMsMHg2OCwweDI0LDB4ZDMsCisJMHgxNSwweDAyLDB4MjEsMHgwMCwweGU5LDB4MTAsMHhiMCwweGIzLDB4MGQsMHhlMiwKKwkweDgyLDB4NjgsMHg3NywweDhhLDB4NmUsMHg3YywweGRhLDB4YmMsMHgzZSwweDUzLAorCTB4ODMsMHhmYiwweGQ2LDB4MjIsMHhlNywweGI1LDB4YWUsMHg2ZSwweDgwLDB4ZGEsCisJMHgwMCwweDU1LDB4OTcsMHhjMSwweGQwLDB4NjUsMHgwMiwweDIwLDB4NGMsMHhmOCwKKwkweDczLDB4YjEsMHg2YSwweDQ5LDB4MjksMHg2MSwweDFmLDB4NDYsMHgxMCwweDBkLAorCTB4ZjMsMHhjNywweGU3LDB4NTgsMHhkNywweDg4LDB4MTUsMHg1ZSwweDk0LDB4OWIsCisJMHhiZiwweDdiLDB4YTIsMHg0MiwweDU4LDB4NDUsMHg0MSwweDBjLDB4Y2IsMHgwMSwKKwkweDAyLDB4MjAsMHgxMiwweDExLDB4YmEsMHgzMSwweDU3LDB4OWQsMHgzZCwweDExLAorCTB4MGUsMHg1YiwweDhjLDB4MmYsMHg1ZiwweGUyLDB4MDIsMHg0ZiwweDA1LDB4NDcsCisJMHg4YywweDE1LDB4OGUsMHhiMywweDU2LDB4M2YsMHhiOCwweGZiLDB4YWQsMHhkNCwKKwkweGY0LDB4ZmMsMHgxMCwweGM1LDB4MDIsMHgyMCwweDE4LDB4YTEsMHgyOSwweDk5LAorCTB4NWIsMHhkOSwweGM4LDB4ZDQsMHhmYywweDQ5LDB4N2EsMHgyYSwweDIxLDB4MmMsCisJMHg0OSwweGU0LDB4NGYsMHhlYiwweGVmLDB4NTEsMHhmMSwweGFiLDB4NmQsMHhmYiwKKwkweDRiLDB4MTQsMHhlOSwweDRiLDB4NTIsMHhiNSwweDgyLDB4MmMsCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdDEwMjRbXT17CisJMHgzMCwweDgyLDB4MDIsMHg1YywweDAyLDB4MDEsMHgwMCwweDAyLDB4ODEsMHg4MSwKKwkweDAwLDB4ZGMsMHg5OCwweDQzLDB4ZTgsMHgzZCwweDQzLDB4NWIsMHhlNCwweDA1LAorCTB4Y2QsMHhkMCwweGE5LDB4M2UsMHhjYiwweDgzLDB4NzUsMHhmNiwweGI1LDB4YTUsCisJMHg5ZiwweDZiLDB4ZTksMHgzNCwweDQxLDB4MjksMHgxOCwweGZhLDB4NmEsMHg1NSwKKwkweDRkLDB4NzAsMHhmYywweGVjLDB4YWUsMHg4NywweDM4LDB4MGEsMHgyMCwweGE5LAorCTB4YzAsMHg0NSwweDc3LDB4NmUsMHg1NywweDYwLDB4NTcsMHhmNCwweGVkLDB4OTYsCisJMHgyMiwweGNiLDB4OGYsMHhlMSwweDMzLDB4M2EsMHgxNywweDFmLDB4ZWQsMHgzNywKKwkweGE1LDB4NmYsMHhlYiwweGE2LDB4YmMsMHgxMiwweDgwLDB4MWQsMHg1MywweGJkLAorCTB4NzAsMHhlYiwweDIxLDB4NzYsMHgzZSwweGM5LDB4MmYsMHgxYSwweDQ1LDB4MjQsCisJMHg4MiwweGZmLDB4Y2QsMHg1OSwweDMyLDB4MDYsMHgyZSwweDEyLDB4M2IsMHgyMywKKwkweDc4LDB4ZWQsMHgxMiwweDNkLDB4ZTAsMHg4ZCwweGY5LDB4NjcsMHg0ZiwweDM3LAorCTB4NGUsMHg0NywweDAyLDB4NGMsMHgyZCwweGMwLDB4NGYsMHgxZiwweGIzLDB4OTQsCisJMHhlMSwweDQxLDB4MmUsMHgyZCwweDkwLDB4MTAsMHhmYywweDgyLDB4OTEsMHg4YiwKKwkweDBmLDB4MjIsMHhkNCwweGYyLDB4ZmMsMHgyYywweGFiLDB4NTMsMHg1NSwweDAyLAorCTB4MDMsMHgwMSwweDAwLDB4MDEsMHgwMiwweDgxLDB4ODAsMHgyYiwweGNjLDB4M2YsCisJMHg4ZiwweDU4LDB4YmEsMHg4YiwweDAwLDB4MTYsMHhmNiwweGVhLDB4M2EsMHhmMCwKKwkweDMwLDB4ZDAsMHgwNSwweDE3LDB4ZGEsMHhiMCwweGViLDB4OWEsMHgyZCwweDRmLAorCTB4MjYsMHhiMCwweGQ2LDB4MzgsMHhjMSwweGViLDB4ZjUsMHhkOCwweDNkLDB4MWYsCisJMHg3MCwweGY3LDB4N2YsMHhmNCwweGUyLDB4Y2YsMHg1MSwweDUxLDB4NzksMHg4OCwKKwkweGZhLDB4ZTgsMHgzMiwweDBlLDB4N2IsMHgyZCwweDk3LDB4ZjIsMHhmYSwweGJhLAorCTB4MjcsMHhjNSwweDljLDB4ZDksMHhjNSwweGViLDB4OGEsMHg3OSwweDUyLDB4M2MsCisJMHg2NCwweDM0LDB4N2QsMHhjMiwweGNmLDB4MjgsMHhjNywweDRlLDB4ZDUsMHg0MywKKwkweDBiLDB4ZDEsMHhhNiwweGNhLDB4NmQsMHgwMywweDJkLDB4NzIsMHgyMywweGJjLAorCTB4NmQsMHgwNSwweGZhLDB4MTYsMHgwOSwweDJmLDB4MmUsMHg1YywweGI2LDB4ZWUsCisJMHg3NCwweGRkLDB4ZDIsMHg0OCwweDhlLDB4MzYsMHgwYywweDA2LDB4M2QsMHg0ZCwKKwkweGU1LDB4MTAsMHg4MiwweGViLDB4NmEsMHhmMywweDRiLDB4OWYsMHhkNiwweGVkLAorCTB4MTEsMHhiMSwweDZlLDB4ZWMsMHhmNCwweGZlLDB4OGUsMHg3NSwweDk0LDB4MjAsCisJMHgyZiwweGNiLDB4YWMsMHg0NiwweGYxLDB4MDIsMHg0MSwweDAwLDB4ZjksMHg4YywKKwkweGEzLDB4ODUsMHhiMSwweGRkLDB4MjksMHhhZiwweDY1LDB4YzEsMHgzMywweGYzLAorCTB4OTUsMHhjNSwweDUyLDB4NjgsMHgwYiwweGQ0LDB4ZjEsMHhlNSwweDBlLDB4MDIsCisJMHg5ZiwweDRmLDB4ZmEsMHg3NywweGRjLDB4NDYsMHg5ZSwweGM3LDB4YTYsMHhlNCwKKwkweDE2LDB4MjksMHhkYSwweGIwLDB4MDcsMHhjZiwweDViLDB4YTksMHgxMiwweDhhLAorCTB4ZGQsMHg2MywweDBhLDB4ZGUsMHgyZSwweDhjLDB4NjYsMHg4YiwweDhjLDB4ZGMsCisJMHgxOSwweGEzLDB4N2UsMHhmNCwweDNiLDB4ZDAsMHgxYSwweDhjLDB4YTQsMHhjMiwKKwkweGUxLDB4ZDMsMHgwMiwweDQxLDB4MDAsMHhlMiwweDRjLDB4MDUsMHhmMiwweDA0LAorCTB4ODYsMHg0ZSwweDYxLDB4NDMsMHhkYiwweGIwLDB4YjksMHg5NiwweDg2LDB4NTIsCisJMHgyYywweGNhLDB4OGQsMHg3YiwweGFiLDB4MGIsMHgxMywweDBkLDB4N2UsMHgzOCwKKwkweDViLDB4ZTIsMHgyZSwweDdiLDB4MGUsMHhlNywweDE5LDB4OTksMHgzOCwweGU3LAorCTB4ZjIsMHgyMSwweGJkLDB4ODUsMHg4NSwweGUzLDB4ZmQsMHgyOCwweDc3LDB4MjAsCisJMHgzMSwweDcxLDB4MmMsMHhkMCwweGZmLDB4ZmIsMHgyZSwweGFmLDB4ODUsMHhiNCwKKwkweDg2LDB4Y2EsMHhmMywweGJiLDB4Y2EsMHhhYSwweDBmLDB4OTUsMHgzNywweDAyLAorCTB4NDAsMHgwZSwweDQxLDB4OWEsMHg5NSwweGU4LDB4YjMsMHg1OSwweGNlLDB4NGIsCisJMHg2MSwweGRlLDB4MzUsMHhlYywweDM4LDB4NzksMHg5YywweGI4LDB4MTAsMHg1MiwKKwkweDQxLDB4NjMsMHhhYiwweDgyLDB4YWUsMHg2ZiwweDAwLDB4YTksMHhmNCwweGRlLAorCTB4ZGQsMHg0OSwweDBiLDB4N2UsMHhiOCwweGE1LDB4NjUsMHhhOSwweDBjLDB4OGYsCisJMHg4ZiwweGY5LDB4MWYsMHgzNSwweGM2LDB4OTIsMHhiOCwweDVlLDB4YjAsMHg2NiwKKwkweGFiLDB4NTIsMHg0MCwweGMwLDB4YjYsMHgzNiwweDZhLDB4N2QsMHg4MCwweDQ2LAorCTB4MDQsMHgwMiwweGU1LDB4OWYsMHg0MSwweDAyLDB4NDEsMHgwMCwweGMwLDB4YWQsCisJMHhjYywweDRlLDB4MjEsMHhlZSwweDFkLDB4MjQsMHg5MSwweGZiLDB4YTcsMHg4MCwKKwkweDhkLDB4OWEsMHhiNiwweGIzLDB4MmUsMHg4ZiwweGMyLDB4ZTEsMHg4MiwweGRmLAorCTB4NjksMHgxOCwweGI0LDB4NzEsMHhmZiwweGE2LDB4NjUsMHhkZSwweGVkLDB4ODQsCisJMHg4ZCwweDQyLDB4YjcsMHhiMywweDIxLDB4NjksMHg1NiwweDFjLDB4MDcsMHg2MCwKKwkweDUxLDB4MjksMHgwNCwweGZmLDB4MzQsMHgwNiwweGRkLDB4YjksMHg2NywweDJjLAorCTB4N2MsMHgwNCwweDkzLDB4MGUsMHg0NiwweDE1LDB4YmIsMHgyYSwweGI3LDB4MWIsCisJMHhlNywweDg3LDB4MDIsMHg0MCwweDc4LDB4ZGEsMHg1ZCwweDA3LDB4NTEsMHgwYywKKwkweDE2LDB4N2EsMHg5ZiwweDI5LDB4MjAsMHg4NCwweDBkLDB4NDIsMHhmYSwweGQ3LAorCTB4MDAsMHhkOCwweDc3LDB4N2UsMHhiMCwweGIwLDB4NmIsMHhkNiwweDViLDB4NTMsCisJMHhiOCwweDliLDB4N2EsMHhjZCwweGM3LDB4MmIsMHhiOCwweDZhLDB4NjMsMHhhOSwKKwkweGZiLDB4NmYsMHhhNCwweDcyLDB4YmYsMHg0YywweDVkLDB4MDAsMHgxNCwweGJhLAorCTB4ZmEsMHg1OSwweDg4LDB4ZWQsMHhlNCwweGUwLDB4OGMsMHhhMiwweGVjLDB4MTQsCisJMHg3ZSwweDJkLDB4ZTIsMHhmMCwweDQ2LDB4NDksMHg5NSwweDQ1LAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRlc3QyMDQ4W109eworCTB4MzAsMHg4MiwweDA0LDB4YTMsMHgwMiwweDAxLDB4MDAsMHgwMiwweDgyLDB4MDEsCisJMHgwMSwweDAwLDB4YzAsMHhjMCwweGNlLDB4M2UsMHgzYywweDUzLDB4NjcsMHgzZiwKKwkweDRmLDB4YzUsMHgyZiwweGE0LDB4YzIsMHg1YSwweDJmLDB4NTgsMHhmZCwweDI3LAorCTB4NTIsMHg2YSwweGU4LDB4Y2YsMHg0YSwweDczLDB4NDcsMHg4ZCwweDI1LDB4MGYsCisJMHg1ZiwweDAzLDB4MjYsMHg3OCwweGVmLDB4ZjAsMHgyMiwweDEyLDB4ZDMsMHhkZSwKKwkweDQ3LDB4YjIsMHgxYywweDBiLDB4MzgsMHg2MywweDFhLDB4NmMsMHg4NSwweDdhLAorCTB4ODAsMHhjNiwweDhmLDB4YTAsMHg0MSwweGFmLDB4NjIsMHhjNCwweDY3LDB4MzIsCisJMHg4OCwweGY4LDB4YTYsMHg5YywweGY1LDB4MjMsMHgxZCwweGU0LDB4YWMsMHgzZiwKKwkweDI5LDB4ZjksMHhlYywweGUxLDB4OGIsMHgyNiwweDAzLDB4MmMsMHhiMiwweGFiLAorCTB4ZjMsMHg3ZCwweGI1LDB4Y2EsMHg0OSwweGMwLDB4OGYsMHgxYywweGRmLDB4MzMsCisJMHgzYSwweDYwLDB4ZGEsMHgzYywweGIwLDB4MTYsMHhmOCwweGE5LDB4MTIsMHg4ZiwKKwkweDY0LDB4YWMsMHgyMywweDBjLDB4NjksMHg2NCwweDk3LDB4NWQsMHg5OSwweGQ0LAorCTB4MDksMHg4MywweDliLDB4NjEsMHhkMywweGFjLDB4ZjAsMHhkZSwweGRkLDB4NWUsCisJMHg5ZiwweDQ0LDB4OTQsMHhkYiwweDNhLDB4NGQsMHg5NywweGU4LDB4NTIsMHgyOSwKKwkweGY3LDB4ZGIsMHg5NCwweDA3LDB4NDUsMHg5MCwweDc4LDB4MWUsMHgzMSwweDBiLAorCTB4ODAsMHhmNywweDU3LDB4YWQsMHgxYywweDc5LDB4YzUsMHhjYiwweDMyLDB4YjAsCisJMHhjZSwweGNkLDB4NzQsMHhiMywweGUyLDB4OTQsMHhjNSwweDc4LDB4MmYsMHgzNCwKKwkweDFhLDB4NDUsMHhmNywweDhjLDB4NTIsMHhhNSwweGJjLDB4OGQsMHhlYywweGQxLAorCTB4MmYsMHgzMSwweDNiLDB4ZjAsMHg0OSwweDU5LDB4NWUsMHg4OCwweDlkLDB4MTUsCisJMHg5MiwweDM1LDB4MzIsMHhjMSwweGU3LDB4NjEsMHhlYywweDUwLDB4NDgsMHg3YywKKwkweGJhLDB4MDUsMHhmOSwweGY4LDB4ZjgsMHhhNywweDhjLDB4ODMsMHhlOCwweDY2LAorCTB4NWIsMHhlYiwweGZlLDB4ZDgsMHg0ZiwweGRkLDB4NmQsMHgzNiwweGMwLDB4YjIsCisJMHg5MCwweDBmLDB4YjgsMHg1MiwweGY5LDB4MDQsMHg5YiwweDQwLDB4MmMsMHgyNywKKwkweGQ2LDB4MzYsMHg4ZSwweGMyLDB4MWIsMHg0NCwweGYzLDB4OTIsMHhkNSwweDE1LAorCTB4OWUsMHg5YSwweGJjLDB4ZjMsMHg3ZCwweDAzLDB4ZDcsMHgwMiwweDE0LDB4MjAsCisJMHhlOSwweDEwLDB4OTIsMHhmZCwweGY5LDB4ZmMsMHg4ZiwweGU1LDB4MTgsMHhlMSwKKwkweDk1LDB4Y2MsMHg5ZSwweDYwLDB4YTYsMHhmYSwweDM4LDB4NGQsMHgwMiwweDAzLAorCTB4MDEsMHgwMCwweDAxLDB4MDIsMHg4MiwweDAxLDB4MDAsMHgwMCwweGMzLDB4YzMsCisJMHgwZCwweGI0LDB4MjcsMHg5MCwweDhkLDB4NGIsMHhiZiwweGI4LDB4ODQsMHhhYSwKKwkweGQwLDB4YjgsMHhjNywweDVkLDB4OTksMHhiZSwweDU1LDB4ZjYsMHgzZSwweDdjLAorCTB4NDksMHgyMCwweGNiLDB4OGEsMHg4ZSwweDE5LDB4MGUsMHg2NiwweDI0LDB4YWMsCisJMHhhZiwweDAzLDB4MzMsMHg5NywweGViLDB4OTUsMHhkNSwweDNiLDB4MGYsMHg0MCwKKwkweDU2LDB4MDQsMHg1MCwweGQxLDB4ZTYsMHhiZSwweDg0LDB4MGIsMHgyNSwweGQzLAorCTB4OWMsMHhlMiwweDgzLDB4NmMsMHhmNSwweDYyLDB4NWQsMHhiYSwweDJiLDB4N2QsCisJMHgzZCwweDdhLDB4NmMsMHhlMSwweGQyLDB4MGUsMHg1NCwweDkzLDB4ODAsMHgwMSwKKwkweDkxLDB4NTEsMHgwOSwweGU4LDB4NWIsMHg4ZSwweDQ3LDB4YmQsMHg2NCwweGU0LAorCTB4MGUsMHgwMywweDgzLDB4NTUsMHhjZiwweDVhLDB4MzcsMHhmMCwweDI1LDB4YjUsCisJMHg3ZCwweDIxLDB4ZDcsMHg2OSwweGRmLDB4NmYsMHhjMiwweGNmLDB4MTAsMHhjOSwKKwkweDhhLDB4NDAsMHg5ZiwweDdhLDB4NzAsMHhjMCwweGU4LDB4ZTgsMHhjMCwweGU2LAorCTB4OWEsMHgxNSwweDBhLDB4OGQsMHg0ZSwweDQ2LDB4Y2IsMHg3YSwweGRiLDB4YjMsCisJMHhjYiwweDgzLDB4MDIsMHhjNCwweGYwLDB4YWIsMHhlYiwweDAyLDB4MDEsMHgwZSwKKwkweDIzLDB4ZmMsMHgxZCwweGM0LDB4YmQsMHhkNCwweGFhLDB4NWQsMHgzMSwweDQ2LAorCTB4OTksMHhjZSwweDllLDB4ZjgsMHgwNCwweDc1LDB4MTAsMHg2NywweGM0LDB4NTMsCisJMHg0NywweDQ0LDB4ZmEsMHhjMiwweDI1LDB4NzMsMHg3ZSwweGQwLDB4OGUsMHg1OSwKKwkweGQxLDB4YjIsMHg1YSwweGY0LDB4YzcsMHgxOCwweDkyLDB4MmYsMHgzOSwweGFiLAorCTB4Y2QsMHhhMywweGI1LDB4YzIsMHhiOSwweGM3LDB4YjksMHgxYiwweDlmLDB4NDgsCisJMHhmYSwweDEzLDB4YzYsMHg5OCwweDRkLDB4Y2EsMHg4NCwweDljLDB4MDYsMHhjYSwKKwkweGU3LDB4ODksMHgwMSwweDA0LDB4YzQsMHg2YywweGZkLDB4MjksMHg1OSwweDM1LAorCTB4ZTcsMHhmMywweGRkLDB4Y2UsMHg2NCwweDU5LDB4YmYsMHgyMSwweDEzLDB4YTksCisJMHg5ZiwweDBlLDB4YzUsMHhmZiwweGJkLDB4MzMsMHgwMCwweGVjLDB4YWMsMHg2YiwKKwkweDExLDB4ZWYsMHg1MSwweDVlLDB4YWQsMHgwNywweDE1LDB4ZGUsMHhiOCwweDVmLAorCTB4YzYsMHhiOSwweGEzLDB4MjIsMHg2NSwweDQ2LDB4ODMsMHgxNCwweGRmLDB4ZDAsCisJMHhmMSwweDQ0LDB4OGEsMHhlMSwweDljLDB4MjMsMHgzMywweGI0LDB4OTcsMHgzMywKKwkweGU2LDB4NmIsMHg4MSwweDAyLDB4ODEsMHg4MSwweDAwLDB4ZWMsMHgxMiwweGE3LAorCTB4NTksMHg3NCwweDZhLDB4ZGUsMHgzZSwweGFkLDB4ZDgsMHgzNiwweDgwLDB4NTAsCisJMHhhMiwweGQ1LDB4MjEsMHg4MSwweDA3LDB4ZjEsMHhkMCwweDkxLDB4ZjIsMHg2YywKKwkweDEyLDB4MmYsMHg5ZCwweDFhLDB4MjYsMHhmOCwweDMwLDB4NjUsMHhkZiwweGU4LAorCTB4YzAsMHg5YiwweDZhLDB4MzAsMHg5OCwweDgyLDB4ODcsMHhlYywweGEyLDB4NTYsCisJMHg4NywweDYyLDB4NmYsMHhlNywweDlmLDB4ZjYsMHg1NiwweGU2LDB4NzEsMHg4ZiwKKwkweDQ5LDB4ODYsMHg5MywweDVhLDB4NGQsMHgzNCwweDU4LDB4ZmUsMHhkOSwweDA0LAorCTB4MTMsMHhhZiwweDc5LDB4YjcsMHhhZCwweDExLDB4ZDEsMHgzMCwweDlhLDB4MTQsCisJMHgwNiwweGEwLDB4ZmEsMHhiNywweDU1LDB4ZGMsMHg2YywweDVhLDB4NGMsMHgyYywKKwkweDU5LDB4NTYsMHhmNiwweGU4LDB4OWQsMHhhZiwweDBhLDB4NzgsMHg5OSwweDA2LAorCTB4MDYsMHg5ZSwweGU3LDB4OWMsMHg1MSwweDU1LDB4NDMsMHhmYywweDNiLDB4NmMsCisJMHgwYiwweGJmLDB4MmQsMHg0MSwweGE3LDB4YWYsMHhiNywweGUwLDB4ZTgsMHgyOCwKKwkweDE4LDB4YjQsMHgxMywweGQxLDB4ZTYsMHg5NywweGQwLDB4OWYsMHg2YSwweDgwLAorCTB4Y2EsMHhkZCwweDFhLDB4N2UsMHgxNSwweDAyLDB4ODEsMHg4MSwweDAwLDB4ZDEsCisJMHgwNiwweDBjLDB4MWYsMHhlMywweGQwLDB4YWIsMHhkNiwweGNhLDB4N2MsMHhiYywKKwkweDdkLDB4MTMsMHgzNSwweGNlLDB4MjcsMHhjZCwweGQ4LDB4NDksMHg1MSwweDYzLAorCTB4NjQsMHgwZiwweGNhLDB4MDYsMHgxMiwweGZjLDB4MDcsMHgzZSwweGFmLDB4NjEsCisJMHg2ZCwweGUyLDB4NTMsMHgzOSwweDI3LDB4YWUsMHhjMywweDExLDB4OWUsMHg5NCwKKwkweDAxLDB4NGYsMHhlMywweGYzLDB4NjcsMHhmOSwweDc3LDB4ZjksMHhlNywweDk1LAorCTB4M2EsMHg2ZiwweGUyLDB4MjAsMHg3MywweDNlLDB4YTQsMHg3YSwweDI4LDB4ZDQsCisJMHg2MSwweDk3LDB4ZjYsMHgxNywweGEwLDB4MjMsMHgxMCwweDJiLDB4Y2UsMHg4NCwKKwkweDU3LDB4N2UsMHgyNSwweDFmLDB4ZjQsMHhhOCwweDU0LDB4ZDIsMHg2NSwweDk0LAorCTB4Y2MsMHg5NSwweDBhLDB4YWIsMHgzMCwweGMxLDB4NTksMHgxZiwweDYxLDB4OGUsCisJMHhiOSwweDZiLDB4ZDcsMHg0ZSwweGI5LDB4ODMsMHg0MywweDc5LDB4ODUsMHgxMSwKKwkweGJjLDB4MGYsMHhhZSwweDI1LDB4MjAsMHgwNSwweGJjLDB4ZDIsMHg0OCwweGExLAorCTB4NjgsMHgwOSwweDg0LDB4ZjYsMHgxMiwweDlhLDB4NjYsMHhiOSwweDJiLDB4YmIsCisJMHg3NiwweDAzLDB4MTcsMHg0NiwweDRlLDB4OTcsMHg1OSwweDAyLDB4ODEsMHg4MCwKKwkweDA5LDB4NGMsMHhmYSwweGQ2LDB4ZTUsMHg2NSwweDQ4LDB4NzgsMHg0MywweGI1LAorCTB4MWYsMHgwMCwweDkzLDB4MmMsMHhiNywweDI0LDB4ZTgsMHhjNiwweDdkLDB4NWEsCisJMHg3MCwweDQ1LDB4OTIsMHhjOCwweDZjLDB4YTMsMHhjZCwweGUxLDB4ZjcsMHgyOSwKKwkweDQwLDB4ZmEsMHgzZiwweDViLDB4NDcsMHg0NCwweDM5LDB4YzEsMHhlOCwweDcyLAorCTB4OWUsMHg3YSwweDBlLDB4ZGEsMHhhYSwweGEwLDB4MmEsMHgwOSwweGZkLDB4NTQsCisJMHg5MywweDIzLDB4YWEsMHgzNywweDg1LDB4NWIsMHhjYywweGQ0LDB4ZjksMHhkOCwKKwkweGZmLDB4YzEsMHg2MSwweDBkLDB4YmQsMHg3ZSwweDE4LDB4MjQsMHg3MywweDZkLAorCTB4NDAsMHg3MiwweGYxLDB4OTMsMHgwOSwweDQ4LDB4OTcsMHg2YywweDg0LDB4OTAsCisJMHhhOCwweDQ2LDB4MTQsMHgwMSwweDM5LDB4MTEsMHhlNSwweDNjLDB4NDEsMHgyNywKKwkweDMyLDB4NzUsMHgyNCwweGVkLDB4YTEsMHhkOSwweDEyLDB4MjksMHg4YSwweDI4LAorCTB4NzEsMHg4OSwweDhkLDB4Y2EsMHgzMCwweGIwLDB4MDEsMHhjNCwweDJmLDB4ODIsCisJMHgxOSwweDE0LDB4NGMsMHg3MCwweDFjLDB4YjgsMHgyMywweDJlLDB4ZTgsMHg5MCwKKwkweDQ5LDB4OTcsMHg5MiwweDk3LDB4NmIsMHg3YSwweDlkLDB4YjksMHgwMiwweDgxLAorCTB4ODAsMHgwZiwweDBlLDB4YTEsMHg3NiwweGY2LDB4YTEsMHg0NCwweDhmLDB4YWYsCisJMHg3YywweDc2LDB4ZDMsMHg4NywweGJiLDB4YmIsMHg4MywweDEwLDB4ODgsMHgwMSwKKwkweDE4LDB4MTQsMHhkMSwweGQzLDB4NzUsMHg1OSwweDI0LDB4YWEsMHhmNSwweDE2LAorCTB4YTUsMHhlOSwweDlkLDB4ZDEsMHhjYywweGVlLDB4ZjQsMHgxNSwweGQ5LDB4YzUsCisJMHg3ZSwweDI3LDB4ZTksMHg0NCwweDQ5LDB4MDYsMHg3MiwweGI5LDB4ZmMsMHhkMywKKwkweDhhLDB4YzQsMHgyYywweDM2LDB4N2QsMHgxMiwweDliLDB4NWEsMHhhYSwweGRjLAorCTB4ODUsMHhlZSwweDZlLDB4YWQsMHg1NCwweGIzLDB4ZjQsMHhmYywweDMxLDB4YTEsCisJMHgwNiwweDNhLDB4NzAsMHg1NywweDBjLDB4ZjMsMHg5NSwweDViLDB4M2UsMHhlOCwKKwkweGZkLDB4MWEsMHg0ZiwweGY2LDB4NzgsMHg5MywweDQ2LDB4NmEsMHhkNywweDMxLAorCTB4YjQsMHg4NCwweDY0LDB4ODUsMHgwOSwweDM4LDB4ODksMHg5MiwweDk0LDB4MWMsCisJMHhiZiwweGUyLDB4M2MsMHgyYSwweGUwLDB4ZmYsMHg5OSwweGEzLDB4ZjAsMHgyYiwKKwkweDMxLDB4YzIsMHgzNiwweGNkLDB4NjAsMHhiZiwweDlkLDB4MmQsMHg3NCwweDMyLAorCTB4ZTgsMHg5YywweDkzLDB4NmUsMHhiYiwweDkxLDB4N2IsMHhmZCwweGQ5LDB4MDIsCisJMHg4MSwweDgxLDB4MDAsMHhhMiwweDcxLDB4MjUsMHgzOCwweGViLDB4MmEsMHhlOSwKKwkweDM3LDB4Y2QsMHhmZSwweDQ0LDB4Y2UsMHg5MCwweDNmLDB4NTIsMHg4NywweDg0LAorCTB4NTIsMHgxYiwweGFlLDB4OGQsMHgyMiwweDk0LDB4Y2UsMHgzOCwweGU2LDB4MDQsCisJMHg4OCwweDc2LDB4ODUsMHg5YSwweGQzLDB4MTQsMHgwOSwweGU1LDB4NjksMHg5YSwKKwkweGZmLDB4NTgsMHg5MiwweDAyLDB4NmEsMHg3ZCwweDdjLDB4MWUsMHgyYywweGZkLAorCTB4YTgsMHhjYSwweDMyLDB4MTQsMHg0ZiwweDBkLDB4ODQsMHgwZCwweDM3LDB4NDMsCisJMHhiZiwweGU0LDB4NWQsMHgxMiwweGM4LDB4MjQsMHg5MSwweDI3LDB4OGQsMHg0NiwKKwkweGQ5LDB4NTQsMHg1MywweGU3LDB4NjIsMHg3MSwweGE4LDB4MmIsMHg3MSwweDQxLAorCTB4OGQsMHg3NSwweGY4LDB4M2EsMHhhMCwweDYxLDB4MjksMHg0NiwweGE2LDB4ZTUsCisJMHg4MiwweGZhLDB4M2EsMHhkOSwweDA4LDB4ZmEsMHhmYywweDYzLDB4ZmQsMHg2YiwKKwkweDMwLDB4YmMsMHhmNCwweDRlLDB4OWUsMHg4YywweDI1LDB4MGMsMHhiNiwweDU1LAorCTB4ZTcsMHgzYywweGQ0LDB4NGUsMHgwYiwweGZkLDB4OGIsMHhjMywweDBlLDB4MWQsCisJMHg5YywweDQ0LDB4NTcsMHg4ZiwweDFmLDB4ODYsMHhmNywweGQ1LDB4MWIsMHhlNCwKKwkweDk1LAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRlc3Q0MDk2W109eworCTB4MzAsMHg4MiwweDA5LDB4MjksMHgwMiwweDAxLDB4MDAsMHgwMiwweDgyLDB4MDIsCisJMHgwMSwweDAwLDB4YzAsMHg3MSwweGFjLDB4MWEsMHgxMywweDg4LDB4ODIsMHg0MywKKwkweDNiLDB4NTEsMHg1NywweDcxLDB4OGQsMHhiNiwweDJiLDB4ODIsMHg2NSwweDIxLAorCTB4NTMsMHg1ZiwweDI4LDB4MjksMHg0ZiwweDhkLDB4N2MsMHg4YSwweGI5LDB4NDQsCisJMHhiMywweDI4LDB4NDEsMHg0ZiwweGQzLDB4ZmEsMHg2YSwweGY4LDB4YjksMHgyOCwKKwkweDUwLDB4MzksMHg2NywweDUzLDB4MmMsMHgzYywweGQ3LDB4Y2IsMHg5NiwweDQxLAorCTB4NDAsMHgzMiwweGJiLDB4ZWIsMHg3MCwweGFlLDB4MWYsMHhiMCwweDY1LDB4ZjcsCisJMHgzYSwweGQ5LDB4MjIsMHhmZCwweDEwLDB4YWUsMHhiZCwweDAyLDB4ZTIsMHhkZCwKKwkweGYzLDB4YzIsMHg3OSwweDNjLDB4YzYsMHhmYywweDc1LDB4YmIsMHhhZiwweDRlLAorCTB4M2EsMHgzNiwweGMyLDB4NGYsMHhlYSwweDI1LDB4ZGYsMHgxMywweDE2LDB4NGIsCisJMHgyMCwweGZlLDB4NGIsMHg2OSwweDE2LDB4YzQsMHg3ZiwweDFhLDB4NDMsMHhhNiwKKwkweDE3LDB4MWIsMHhiOSwweDBhLDB4ZjMsMHgwOSwweDg2LDB4MjgsMHg4OSwweGNmLAorCTB4MmMsMHhkMCwweGQ0LDB4ODEsMHhhZiwweGM2LDB4NmQsMHhlNiwweDIxLDB4OGQsCisJMHhlZSwweGVmLDB4ZWEsMHhkYywweGI3LDB4YzYsMHgzYiwweDYzLDB4OWYsMHgwZSwKKwkweGFkLDB4ODksMHg3OCwweDIzLDB4MTgsMHhiZiwweDcwLDB4N2UsMHg4NCwweGUwLAorCTB4MzcsMHhlYywweGRiLDB4OGUsMHg5YywweDNlLDB4NmEsMHgxOSwweGNjLDB4OTksCisJMHg3MiwweGU2LDB4YjUsMHg3ZCwweDZkLDB4ZmEsMHhlNSwweGQzLDB4ZTQsMHg5MCwKKwkweGI1LDB4YjIsMHhiMiwweDEyLDB4NzAsMHg0ZSwweGNhLDB4ZjgsMHgxMCwweGY4LAorCTB4YTMsMHgxNCwweGMyLDB4NDgsMHgxOSwweGViLDB4NjAsMHg5OSwweGJiLDB4MmEsCisJMHgxZiwweGIxLDB4N2EsMHhiMSwweDNkLDB4MjQsMHhmYiwweGEwLDB4MjksMHhkYSwKKwkweGJkLDB4MWIsMHhkNywweGE0LDB4YmYsMHhlZiwweDYwLDB4MmQsMHgyMiwweGNhLAorCTB4NjUsMHg5OCwweGYxLDB4YzQsMHhlMSwweGM5LDB4MDIsMHg2YiwweDE2LDB4MjgsCisJMHgyZiwweGExLDB4YWEsMHg3OSwweDAwLDB4ZGEsMHhkYywweDdjLDB4NDMsMHhmNywKKwkweDQyLDB4M2MsMHhhMCwweGVmLDB4NjgsMHhmNywweGRmLDB4YjksMHg2OSwweGZiLAorCTB4OGUsMHgwMSwweGVkLDB4MDEsMHg0MiwweGI1LDB4NGUsMHg1NywweGE2LDB4MjYsCisJMHhiOCwweGQwLDB4N2IsMHg1NiwweDZkLDB4MDMsMHhjNiwweDQwLDB4OGMsMHg4YywKKwkweDJhLDB4NTUsMHhkNywweDljLDB4MzUsMHgwMCwweDk0LDB4OTMsMHhlYywweDAzLAorCTB4ZWIsMHgyMiwweGVmLDB4NzcsMHhiYiwweDc5LDB4MTMsMHgzZiwweDE1LDB4YTEsCisJMHg4ZiwweGNhLDB4ZGYsMHhmZCwweGQzLDB4YjgsMHhlMSwweGQ0LDB4Y2MsMHgwOSwKKwkweDNmLDB4M2MsMHgyYywweGRiLDB4ZDEsMHg0OSwweDdmLDB4MzgsMHgwNywweDgzLAorCTB4NmQsMHhlYiwweDA4LDB4NjYsMHhlOSwweDA2LDB4NDQsMHgxMiwweGFjLDB4OTUsCisJMHgyMiwweDkwLDB4MjMsMHg2NywweGQ0LDB4MDgsMHhjYywweGY0LDB4YjcsMHhkYywKKwkweGNjLDB4ODcsMHhkNCwweGFjLDB4NjksMHgzNSwweDRjLDB4YjUsMHgzOSwweDM2LAorCTB4Y2QsMHhhNCwweGQyLDB4OTUsMHhjYSwweDBkLDB4YzUsMHhkYSwweGMyLDB4YzUsCisJMHgyMiwweDMyLDB4MjgsMHgwOCwweGUzLDB4ZDIsMHg4YiwweDM4LDB4MzAsMHhkYywKKwkweDhjLDB4NzUsMHg0ZiwweDZhLDB4ZWMsMHg3YSwweGFjLDB4MTYsMHgzZSwweGE4LAorCTB4ZDQsMHg2YSwweDQ1LDB4ZTEsMHhhOCwweDRmLDB4MmUsMHg4MCwweDM0LDB4YWEsCisJMHg1NCwweDFiLDB4MDIsMHg5NSwweDdkLDB4OGEsMHg2ZCwweGNjLDB4NzksMHhjYSwKKwkweGYyLDB4YTQsMHgyZSwweDhkLDB4ZmIsMHhmZSwweDE1LDB4NTEsMHgxMCwweDBlLAorCTB4NGQsMHg4OCwweGIxLDB4YzcsMHhmNCwweDc5LDB4ZGIsMHhmMCwweGI0LDB4NTYsCisJMHg0NCwweDM3LDB4Y2EsMHg1YSwweGMxLDB4OGMsMHg0OCwweGFjLDB4YWUsMHg0OCwKKwkweDgwLDB4ODMsMHgwMSwweDNmLDB4ZGUsMHhkOSwweGQzLDB4MmMsMHg1MSwweDQ2LAorCTB4YjEsMHg0MSwweGI2LDB4YzYsMHg5MSwweDcyLDB4ZjksMHg4MywweDU1LDB4MWIsCisJMHg4YywweGJhLDB4ZjMsMHg3MywweGU1LDB4MmMsMHg3NCwweDUwLDB4M2EsMHhiZSwKKwkweGM1LDB4MmYsMHhhNywweGIyLDB4NmQsMHg4YywweDllLDB4MTMsMHg3NywweGEzLAorCTB4MTMsMHhjZCwweDZkLDB4OGMsMHg0NSwweGUxLDB4ZmMsMHgwYiwweGI3LDB4NjksCisJMHhlOSwweDI3LDB4YmMsMHg2NSwweGMzLDB4ZmEsMHg5YiwweGQwLDB4ZWYsMHhmZSwKKwkweGU4LDB4MWYsMHhiMywweDVlLDB4MzQsMHhmNCwweDhjLDB4ZWEsMHhmYywweGQzLAorCTB4ODEsMHhiZiwweDNkLDB4MzAsMHhiMiwweGI0LDB4MDEsMHhlOCwweDQzLDB4MGYsCisJMHhiYSwweDAyLDB4MjMsMHg0MiwweDc2LDB4ODIsMHgzMSwweDczLDB4OTEsMHhlZCwKKwkweDA3LDB4NDYsMHg2MSwweDBkLDB4MzksMHg4MywweDQwLDB4Y2UsMHg3YSwweGQ0LAorCTB4ZGIsMHg4MCwweDJjLDB4MWYsMHgwZCwweGQxLDB4MzQsMHhkNCwweDkyLDB4ZTMsCisJMHhkNCwweGYxLDB4YzIsMHgwMSwweDAyLDB4MDMsMHgwMSwweDAwLDB4MDEsMHgwMiwKKwkweDgyLDB4MDIsMHgwMSwweDAwLDB4OTcsMHg2YywweGRhLDB4NmUsMHhlYSwweDRmLAorCTB4Y2YsMHhhZiwweGY3LDB4NGMsMHhkOSwweGYxLDB4OTAsMHgwMCwweDc3LDB4ZGIsCisJMHhmMiwweDk3LDB4NzYsMHg3MiwweGI5LDB4YjcsMHg0NywweGQxLDB4OWMsMHhkZCwKKwkweGNiLDB4NGEsMHgzMywweDZlLDB4YzksMHg3NSwweDc2LDB4ZTYsMHhlNCwweGE1LAorCTB4MzEsMHg4YywweDc3LDB4MTMsMHhiNCwweDI5LDB4Y2QsMHhmNSwweDUyLDB4MTcsCisJMHhlZiwweGYzLDB4MDgsMHgwMCwweGUzLDB4YmQsMHgyZSwweGJjLDB4ZDQsMHg1MiwKKwkweDg4LDB4ZTksMHgzMCwweDc1LDB4MGIsMHgwMiwweGY1LDB4Y2QsMHg4OSwweDBjLAorCTB4NmMsMHg1NywweDE5LDB4MjcsMHgzZCwweDFlLDB4ODUsMHhiNCwweGMxLDB4MmYsCisJMHgxZCwweDkyLDB4MDAsMHg1YywweDc2LDB4MjksMHg0YiwweGE0LDB4ZTEsMHgxMiwKKwkweGIzLDB4YzgsMHgwOSwweGZlLDB4MGUsMHg3OCwweDcyLDB4NjEsMHhjYiwweDYxLAorCTB4NmYsMHgzOSwweDkxLDB4OTUsMHg0ZSwweGQ1LDB4M2UsMHhjNywweDhmLDB4YjgsCisJMHhmNiwweDM2LDB4ZmUsMHg5YywweDkzLDB4OWEsMHgzOCwweDI1LDB4N2EsMHhmNCwKKwkweDRhLDB4MTIsMHhkNCwweGEwLDB4MTMsMHhiZCwweGY5LDB4MWQsMHgxMiwweDNlLAorCTB4MjEsMHgzOSwweGZiLDB4NzIsMHhlMCwweDA1LDB4M2QsMHhjMywweGU1LDB4NTAsCisJMHhhOCwweDVkLDB4ODUsMHhhMywweGVhLDB4NWYsMHgxYywweGIyLDB4M2YsMHhlYSwKKwkweDZkLDB4MDMsMHg5MSwweDU1LDB4ZDgsMHgxOSwweDBhLDB4MjEsMHgxMiwweDE2LAorCTB4ZDksMHgxMiwweGM0LDB4ZTYsMHgwNywweDE4LDB4NWIsMHgyNiwweGE0LDB4YWUsCisJMHhlZCwweDJiLDB4YjcsMHhhNiwweGVkLDB4ZjgsMHhhZCwweGVjLDB4NzcsMHhlNiwKKwkweDdmLDB4NGYsMHg3NiwweDAwLDB4YzAsMHhmYSwweDE1LDB4OTIsMHhiNCwweDJjLAorCTB4MjIsMHhjMiwweGViLDB4NmEsMHhhZCwweDE0LDB4MDUsMHhiMiwweGU1LDB4OGEsCisJMHg5ZSwweDg1LDB4ODMsMHhjYywweDA0LDB4ZjEsMHg1NiwweDc4LDB4NDQsMHg1ZSwKKwkweGRlLDB4ZTAsMHg2MCwweDFhLDB4NjUsMHg3OSwweDMxLDB4MjMsMHgwNSwweGJiLAorCTB4MDEsMHhmZiwweGRkLDB4MmUsMHhiNywweGIzLDB4YWEsMHg3NCwweGUwLDB4YTUsCisJMHg5NCwweGFmLDB4NGIsMHhkZSwweDU4LDB4MGYsMHg1NSwweGRlLDB4MzMsMHhmNiwKKwkweGUzLDB4ZDYsMHgzNCwweDM2LDB4NTcsMHhkNiwweDc5LDB4OTEsMHgyZSwweGJlLAorCTB4M2IsMHhkOSwweDRlLDB4YjYsMHg5ZCwweDIxLDB4NWMsMHhkMywweDQ4LDB4MTQsCisJMHg3ZiwweDRhLDB4YzQsMHg2MCwweGE5LDB4MjksMHhmOCwweDUzLDB4N2YsMHg4OCwKKwkweDExLDB4MmQsMHhiNSwweGM1LDB4MmQsMHg2ZiwweGVlLDB4ODUsMHgwYiwweGY3LAorCTB4OGQsMHg5YSwweGJlLDB4YjAsMHg0MiwweGYyLDB4MmUsMHg3MSwweGFmLDB4MTksCisJMHgzMSwweDZkLDB4ZWMsMHhjZCwweDZmLDB4MmIsMHgyMywweGRmLDB4YjQsMHg0MCwKKwkweGFmLDB4MmMsMHgwYSwweGMzLDB4MWIsMHg3ZCwweDdkLDB4MDMsMHgxZCwweDRiLAorCTB4ZjMsMHhiNSwweGUwLDB4ODUsMHhkOCwweGRmLDB4OTEsMHg2YiwweDBhLDB4NjksCisJMHhmNywweGYyLDB4NjksMHg2NiwweDViLDB4ZjEsMHhjZiwweDQ2LDB4N2QsMHhlOSwKKwkweDcwLDB4ZmEsMHg2ZCwweDdlLDB4NzUsMHg0ZSwweGE5LDB4NzcsMHhlNiwweDhjLAorCTB4MDIsMHhmNywweDE0LDB4NGQsMHhhNSwweDQxLDB4OGYsMHgzZiwweGMxLDB4NjIsCisJMHgxZSwweDcxLDB4NWUsMHgzOCwweGI0LDB4ZDYsMHhlNiwweGUxLDB4NGIsMHhjMiwKKwkweDJjLDB4MzAsMHg4MywweDgxLDB4NmYsMHg0OSwweDJlLDB4OTYsMHhlNiwweGM5LAorCTB4OWEsMHhmNywweDVkLDB4MDksMHhhMCwweDU1LDB4MDIsMHhhNSwweDNhLDB4MjUsCisJMHgyMywweGQwLDB4OTIsMHhjMywweGEzLDB4ZTMsMHgwZSwweDEyLDB4MmYsMHg0ZCwKKwkweGVmLDB4ZjMsMHg1NSwweDVhLDB4YmUsMHhlNiwweDE5LDB4ODYsMHgzMSwweGFiLAorCTB4NzUsMHg5YSwweGQzLDB4ZjAsMHgyYywweGM1LDB4NDEsMHg5MiwweGQ5LDB4MWYsCisJMHg1ZiwweDExLDB4OGMsMHg3NSwweDFjLDB4NjMsMHhkMCwweDAyLDB4ODAsMHgyYywKKwkweDY4LDB4Y2IsMHg5MywweGZiLDB4NTEsMHg3MywweDQ5LDB4YjQsMHg2MCwweGRhLAorCTB4ZTIsMHgyNiwweGFmLDB4YTksMHg0NiwweDEyLDB4YjgsMHhlYywweDUwLDB4ZGQsCisJMHgxMiwweDA2LDB4NWYsMHhjZSwweDU5LDB4ZTYsMHhmNiwweDFjLDB4ZTAsMHg1NCwKKwkweDEwLDB4YWQsMHhmNiwweGNkLDB4OTgsMHhjYywweDBmLDB4ZmIsMHhjYiwweDQxLAorCTB4MTQsMHg5ZCwweGVkLDB4ZTQsMHhiNCwweDc0LDB4NWYsMHgwOSwweDYwLDB4YzcsCisJMHgxMiwweGY2LDB4N2IsMHgzYywweDhmLDB4YTcsMHgyMCwweGJjLDB4ZTQsMHhiMSwKKwkweGVmLDB4ZWIsMHhhNCwweDkzLDB4YzUsMHgwNiwweGNhLDB4OWEsMHgyNywweDlkLAorCTB4ODcsMHhmMywweGRlLDB4Y2EsMHhlNSwweGU3LDB4ZjYsMHgxYywweDAxLDB4NjUsCisJMHg1YiwweGZiLDB4MTksMHg3OSwweDZlLDB4MDgsMHgyNiwweGM1LDB4YzgsMHgyOCwKKwkweDBlLDB4YjYsMHgzYiwweDA3LDB4MDgsMHhjMSwweDAyLDB4ODIsMHgwMSwweDAxLAorCTB4MDAsMHhlOCwweDFjLDB4NzMsMHhhNiwweGI4LDB4ZTAsMHgwZSwweDZkLDB4OGQsCisJMHgxYiwweGI5LDB4NTMsMHhlZCwweDU4LDB4OTQsMHhlNiwweDFkLDB4NjAsMHgxNCwKKwkweDVjLDB4NzYsMHg0MywweGM0LDB4NTgsMHgxOSwweGM0LDB4MjQsMHhlOCwweGJjLAorCTB4MWIsMHgzYiwweDBiLDB4MTMsMHgyNCwweDQ1LDB4NTQsMHgwZSwweGNjLDB4MzcsCisJMHhmMCwweGUwLDB4NjMsMHg3ZCwweGMzLDB4ZjcsMHhmYiwweDgxLDB4NzQsMHg4MSwKKwkweGM0LDB4MGYsMHgxYSwweDIxLDB4NDgsMHhhZiwweGNlLDB4YzEsMHhjNCwweDk0LAorCTB4MTgsMHgwNiwweDQ0LDB4OGQsMHhkMywweGQyLDB4MjIsMHgyZCwweDJkLDB4M2UsCisJMHg1YSwweDMxLDB4ZGMsMHg5NSwweDhlLDB4ZjQsMHg0MSwweGZjLDB4NTgsMHhjOSwKKwkweDQwLDB4OTIsMHgxNywweDVmLDB4ZTMsMHhkYSwweGFjLDB4OWUsMHgzZiwweDFjLAorCTB4MmEsMHg2YiwweDU4LDB4NWYsMHg0OCwweDc4LDB4MjAsMHhiMSwweGFmLDB4MjQsCisJMHg5YiwweDNjLDB4MjAsMHg4YiwweDkzLDB4MjUsMHg5ZSwweGU2LDB4NmIsMHhiYywKKwkweDEzLDB4NDIsMHgxNCwweDZjLDB4MzYsMHgzMSwweGZmLDB4N2EsMHhkMSwweGMxLAorCTB4MWEsMHgyNiwweDE0LDB4N2YsMHhhOSwweDc2LDB4YTcsMHgwYywweGY4LDB4Y2MsCisJMHhlZCwweDA3LDB4NmEsMHhkMiwweGRmLDB4NjIsMHhlZSwweDBhLDB4N2MsMHg4NCwKKwkweGNiLDB4NDksMHg5MCwweGIyLDB4MDMsMHgwZCwweGEyLDB4ODIsMHgwNiwweDc3LAorCTB4ZjEsMHhjZCwweDY3LDB4ZjIsMHg0NywweDIxLDB4MDIsMHgzZiwweDQzLDB4MjEsCisJMHhmMCwweDQ2LDB4MzAsMHg2MiwweDUxLDB4NzIsMHhiMSwweGU3LDB4NDgsMHhjNiwKKwkweDY3LDB4MTIsMHhjZCwweDllLDB4ZDYsMHgxNSwweGU1LDB4MjEsMHhlZCwweGZhLAorCTB4OGYsMHgzMCwweGE2LDB4NDEsMHhmZSwweGI2LDB4ZmEsMHg4ZiwweDM0LDB4MTQsCisJMHgxOSwweGU4LDB4MTEsMHhmNywweGE1LDB4NzcsMHgzZSwweGI3LDB4ZjksMHgzOSwKKwkweDA3LDB4OGMsMHg2NywweDJhLDB4YWIsMHg3YiwweDA4LDB4ZjgsMHhiMCwweDA2LAorCTB4YTgsMHhlYSwweDJmLDB4OGYsMHhmYSwweGNjLDB4Y2MsMHg0MCwweGNlLDB4ZjMsCisJMHg3MCwweDRmLDB4M2YsMHg3ZiwweGUyLDB4MGMsMHhlYSwweDc2LDB4NGEsMHgzNSwKKwkweDRlLDB4NDcsMHhhZCwweDJiLDB4YTcsMHg5NywweDVkLDB4NzQsMHg0MywweDk3LAorCTB4OTAsMHhkMiwweGZiLDB4ZDksMHhmOSwweDk2LDB4MDEsMHgzMywweDA1LDB4ZWQsCisJMHg3YiwweDAzLDB4MDUsMHhhZCwweGY4LDB4NDksMHgwMywweDAyLDB4ODIsMHgwMSwKKwkweDAxLDB4MDAsMHhkNCwweDQwLDB4MTcsMHg2NiwweDEwLDB4OTIsMHg5NSwweGM4LAorCTB4ZWMsMHg2MiwweGE5LDB4N2EsMHhjYiwweDkzLDB4OGUsMHhlNiwweDUzLDB4ZDQsCisJMHg4MCwweDQ4LDB4MjcsMHg0YiwweDQxLDB4Y2UsMHg2MSwweGRmLDB4YmYsMHg5NCwKKwkweGE0LDB4M2QsMHg3MSwweDAzLDB4MGIsMHhlZCwweDI1LDB4NzEsMHg5OCwweGE0LAorCTB4ZDYsMHhkNSwweDRhLDB4NTcsMHhmNSwweDZjLDB4MWIsMHhkYSwweDIxLDB4N2QsCisJMHgzNSwweDQ1LDB4YjMsMHhmMywweDZhLDB4ZDksMHhkMywweDQzLDB4ZTgsMHg1YywKKwkweDU0LDB4MWMsMHg4MywweDFiLDB4YjQsMHg1ZiwweGYyLDB4OTcsMHgyNCwweDJlLAorCTB4ZGMsMHg0MCwweGRlLDB4OTIsMHgyMywweDU5LDB4OGUsMHhiYywweGQyLDB4YTEsCisJMHhmMiwweGUwLDB4NGMsMHhkZCwweDBiLDB4ZDEsMHhlNywweGFlLDB4NjUsMHhiYywKKwkweGI1LDB4ZjUsMHg1YiwweDk4LDB4ZTksMHhkNywweGMyLDB4YjcsMHgwZSwweDU1LAorCTB4NzEsMHgwZSwweDNjLDB4MGEsMHgyNCwweDZiLDB4YTYsMHhlNiwweDE0LDB4NjEsCisJMHgxMSwweGZkLDB4MzMsMHg0MiwweDk5LDB4MmIsMHg4NCwweDc3LDB4NzQsMHg5MiwKKwkweDkxLDB4ZjUsMHg3OSwweDc5LDB4Y2YsMHhhZCwweDhlLDB4MDQsMHhlZiwweDgwLAorCTB4MWUsMHg1NywweGY0LDB4MTQsMHhmNSwweDM1LDB4MDksMHg3NCwweGIyLDB4MTMsCisJMHg3MSwweDU4LDB4NmIsMHhlYSwweDMyLDB4NWQsMHhmMywweGQzLDB4NzYsMHg0OCwKKwkweDM5LDB4MTAsMHgyMywweDg0LDB4OWQsMHhiZSwweDkyLDB4NzcsMHg0YSwweGVkLAorCTB4NzAsMHgzZSwweDFhLDB4YTIsMHg2YywweGIzLDB4ODEsMHgwMCwweGMzLDB4YzksCisJMHhlNCwweDUyLDB4YzgsMHgyNCwweDg4LDB4MGMsMHg0MSwweGFkLDB4ODcsMHg1YSwKKwkweGVhLDB4YTMsMHg3YSwweDg1LDB4MWMsMHg1ZSwweDMxLDB4N2YsMHhjMywweDM1LAorCTB4YzYsMHhmYSwweDEwLDB4YzgsMHg3NSwweDEwLDB4YzQsMHg5NiwweDk5LDB4ZTcsCisJMHhmZSwweDAxLDB4YjQsMHg3NCwweGRiLDB4YjQsMHgxMSwweGMzLDB4YzgsMHg4YywKKwkweGY2LDB4ZjcsMHgzYiwweDY2LDB4NTAsMHhmYywweGRiLDB4ZWIsMHhjYSwweDQ3LAorCTB4ODUsMHg4OSwweGUxLDB4NjUsMHhkOSwweDYyLDB4MzQsMHgzYywweDcwLDB4ZDgsCisJMHgyZSwweGI0LDB4MmYsMHg2NSwweDNjLDB4NGEsMHhhNiwweDJhLDB4ZTcsMHhjNywKKwkweGQ4LDB4NDEsMHg4ZiwweDhhLDB4NDMsMHhiZiwweDQyLDB4ZjIsMHg0ZCwweGJjLAorCTB4ZmMsMHg5ZSwweDI3LDB4OTUsMHhmYiwweDc1LDB4ZmYsMHhhYiwweDAyLDB4ODIsCisJMHgwMSwweDAwLDB4NDEsMHgyZiwweDQ0LDB4NTcsMHg2ZCwweDEyLDB4MTcsMHg1YiwKKwkweDMyLDB4YzYsMHhiNywweDZjLDB4NTcsMHg3YSwweDhhLDB4MGUsMHg3OSwweGVmLAorCTB4NzIsMHhhOCwweDY4LDB4ZGEsMHgyZCwweDM4LDB4ZTQsMHhiYiwweDhkLDB4ZjYsCisJMHgwMiwweDY1LDB4Y2YsMHg1NiwweDEzLDB4ZTEsMHgxYSwweGNiLDB4MzksMHg4MCwKKwkweGE2LDB4YjEsMHgzMiwweDAzLDB4MWUsMHhkZCwweGJiLDB4MzUsMHhkOSwweGFjLAorCTB4NDMsMHg4OSwweDMxLDB4MDgsMHg5MCwweDkyLDB4NWUsMHgzNSwweDNkLDB4N2IsCisJMHg5YywweDZmLDB4ODYsMHhjYiwweDE3LDB4ZGQsMHg4NSwweGU0LDB4ZWQsMHgzNSwKKwkweDA4LDB4OGUsMHhjMSwweGY0LDB4MDUsMHhkOCwweDY4LDB4YzYsMHg2MywweDNjLAorCTB4ZjcsMHhmZiwweGY3LDB4NDcsMHgzMywweDM5LDB4YzUsMHgzZSwweGI3LDB4MGUsCisJMHg1OCwweDM1LDB4OWQsMHg4MSwweGVhLDB4ZjgsMHg2YSwweDJjLDB4MWMsMHg1YSwKKwkweDY4LDB4NzgsMHg2NCwweDExLDB4NmIsMHhjMSwweDNlLDB4NGUsMHg3YSwweGJkLAorCTB4ODQsMHhjYiwweDBmLDB4YzIsMHhiNiwweDg1LDB4MWQsMHhkMywweDc2LDB4YzUsCisJMHg5MywweDZhLDB4NjksMHg4OSwweDU2LDB4MzQsMHhkYywweDRhLDB4OWIsMHhiYywKKwkweGZmLDB4YTgsMHgwZCwweDZlLDB4MzUsMHg5YywweDYwLDB4YTcsMHgyMywweDMwLAorCTB4YzcsMHgwNiwweDY0LDB4MzksMHg4YiwweDk0LDB4ODksMHhlZSwweGJhLDB4N2YsCisJMHg2MCwweDhkLDB4ZmEsMHhiNiwweDk3LDB4NzYsMHhkYywweDUxLDB4NGEsMHgzYywKKwkweGViLDB4M2EsMHgxNCwweDJjLDB4MjAsMHg2MCwweDY5LDB4NGEsMHg4NiwweGZlLAorCTB4OGMsMHgyMSwweDg0LDB4NDksMHg1NCwweGIzLDB4MjAsMHhlMSwweDAxLDB4N2YsCisJMHg1OCwweGRmLDB4N2YsMHhiNSwweDIxLDB4NTEsMHg4YywweDQ3LDB4OWYsMHg5MSwKKwkweGViLDB4OTcsMHgzZSwweGYyLDB4NTQsMHhjZiwweDE2LDB4NDYsMHhmOSwweGQ5LAorCTB4YjYsMHhlNywweDY0LDB4YzksMHhkMCwweDU0LDB4ZWEsMHgyZiwweGExLDB4Y2YsCisJMHhhNSwweDdmLDB4MjgsMHg4ZCwweDg0LDB4ZWMsMHhkNSwweDM5LDB4MDMsMHg3NiwKKwkweDViLDB4MmQsMHg4ZSwweDQzLDB4ZjIsMHgwMSwweDI0LDB4YzksMHg2ZiwweGMwLAorCTB4ZjUsMHg2OSwweDZmLDB4N2QsMHhiNSwweDg1LDB4ZDIsMHg1ZiwweDdmLDB4NzgsCisJMHg0MCwweDA3LDB4N2YsMHgwOSwweDE1LDB4YjUsMHgxZiwweDI4LDB4NjUsMHgxMCwKKwkweGU0LDB4MTksMHhhOCwweGM2LDB4OWUsMHg4ZCwweGRjLDB4Y2IsMHgwMiwweDgyLAorCTB4MDEsMHgwMCwweDEzLDB4MDEsMHhlZSwweDU2LDB4ODAsMHg5MywweDcwLDB4MDAsCisJMHg3ZiwweDUyLDB4ZDIsMHg5NCwweGExLDB4OTgsMHg4NCwweDRhLDB4OTIsMHgyNSwKKwkweDRjLDB4OWIsMHhhOSwweDkxLDB4MmUsMHhjMiwweDc5LDB4YjcsMHg1YywweGUzLAorCTB4YzUsMHhkNSwweDhlLDB4YzIsMHg1NCwweDE2LDB4MTcsMHhhZCwweDU1LDB4OWIsCisJMHgyNSwweDc2LDB4MTIsMHg2MywweDUwLDB4MjIsMHgyZiwweDU4LDB4NTgsMHg3OSwKKwkweDZiLDB4MDQsMHhlMywweGY5LDB4OWYsMHg4ZiwweDA0LDB4NDEsMHg2NywweDk0LAorCTB4YTUsMHgxZiwweGFjLDB4OGEsMHgxNSwweDljLDB4MjYsMHgxMCwweDZjLDB4ZjgsCisJMHgxOSwweDU3LDB4NjEsMHhkNywweDNhLDB4N2QsMHgzMSwweGIwLDB4MmQsMHgzOCwKKwkweGJkLDB4OTQsMHg2MiwweGFkLDB4YzQsMHhmYSwweDM2LDB4NDIsMHg0MiwweGYwLAorCTB4MjQsMHg2NywweDY1LDB4OWQsMHg4YiwweDBiLDB4N2MsMHg2ZiwweDgyLDB4NDQsCisJMHgxYSwweDhjLDB4YzgsMHhjOSwweGFiLDB4YmIsMHg0YywweDQ1LDB4ZmMsMHg3YiwKKwkweDM4LDB4ZWUsMHgzMCwweGUxLDB4ZmMsMHhlZiwweDhkLDB4YmMsMHg1OCwweGRmLAorCTB4MmIsMHg1ZCwweDBkLDB4NTQsMHhlMCwweDQ5LDB4NGQsMHg5NywweDk5LDB4OGYsCisJMHgyMiwweGE4LDB4ODMsMHhiZSwweDQwLDB4YmIsMHg1MCwweDJlLDB4NzgsMHgyOCwKKwkweDBmLDB4OTUsMHg3OCwweDhjLDB4OGYsMHg5OCwweDI0LDB4NTYsMHhjMiwweDk3LAorCTB4ZjMsMHgyYywweDQzLDB4ZDIsMHgwMywweDgyLDB4NjYsMHg4MSwweDcyLDB4NWYsCisJMHg1MywweDE2LDB4ZWMsMHhiMSwweGIxLDB4MDQsMHg1ZSwweDQwLDB4MjAsMHg0OCwKKwkweDdiLDB4M2YsMHgwMiwweDk3LDB4NmEsMHhlYiwweDk2LDB4MTIsMHgyMSwweDM1LAorCTB4ZmUsMHgxZiwweDQ3LDB4YzAsMHg5NSwweGVhLDB4YzUsMHg4YSwweDA4LDB4ODQsCisJMHg0ZiwweDVlLDB4NjMsMHg5NCwweDYwLDB4MGYsMHg3MSwweDViLDB4N2YsMHg0YSwKKwkweGVjLDB4NGYsMHg2MCwweGM2LDB4YmEsMHg0YSwweDI0LDB4ZjEsMHgyMCwweDhiLAorCTB4YTcsMHgyZSwweDNhLDB4Y2UsMHg4ZCwweGUwLDB4MjcsMHgxZCwweGI1LDB4OGUsCisJMHhiNCwweDIxLDB4YzUsMHhlMiwweGE2LDB4MTYsMHgwYSwweDUxLDB4ODMsMHg1NSwKKwkweDg4LDB4ZDEsMHgzMCwweDExLDB4NjMsMHhkNSwweGQ3LDB4OGQsMHhhZSwweDE2LAorCTB4MTIsMHg4MiwweGM0LDB4ODUsMHgwMCwweDRlLDB4MjcsMHg4MywweGE1LDB4N2MsCisJMHg5MCwweDJlLDB4ZTUsMHhhMiwweGEzLDB4ZDMsMHg0YywweDYzLDB4MDIsMHg4MiwKKwkweDAxLDB4MDEsMHgwMCwweDg2LDB4MDgsMHg5OCwweDk4LDB4YTUsMHgwMCwweDA1LAorCTB4MzksMHg3NywweGQ5LDB4NjYsMHhiMywweGNmLDB4Y2EsMHhhMCwweDcxLDB4YjMsCisJMHg1MCwweGNlLDB4M2QsMHhiMSwweDkzLDB4OTUsMHgzNSwweGM0LDB4ZDQsMHgyZSwKKwkweDkwLDB4ZGYsMHgwZiwweGZjLDB4NjAsMHhjMSwweDk0LDB4NjgsMHg2MSwweDQzLAorCTB4Y2EsMHg5YSwweDIzLDB4NGEsMHgxZSwweDQ1LDB4NzIsMHg5OSwweGI1LDB4MWUsCisJMHg2MSwweDhkLDB4NzcsMHgwZiwweGEwLDB4YmIsMHhkNywweDc3LDB4YjQsMHgyYSwKKwkweDE1LDB4MTEsMHg4OCwweDJkLDB4YjMsMHg1NiwweDYxLDB4NWUsMHg2YSwweGVkLAorCTB4YTQsMHg0NiwweDRhLDB4M2YsMHg1MCwweDExLDB4ZDYsMHhiYSwweGI2LDB4ZDcsCisJMHg5NSwweDY1LDB4NTMsMHhjMywweGExLDB4OGYsMHhlMCwweGEzLDB4ZjUsMHgxYywKKwkweGZkLDB4YWYsMHg2ZSwweDQzLDB4ZDcsMHgxNywweGE3LDB4ZDMsMHg4MSwweDFiLAorCTB4YTQsMHhkZiwweGUwLDB4OTcsMHg4YSwweDQ2LDB4MDMsMHhkMywweDQ2LDB4MGUsCisJMHg4MywweDQ4LDB4NGUsMHhkMiwweDAyLDB4Y2IsMHhjMCwweGFkLDB4NzksMHg5NSwKKwkweDhjLDB4OTYsMHhiYSwweDQwLDB4MzQsMHgxMSwweDcxLDB4NWUsMHhlOSwweDExLAorCTB4ZjksMHhjNSwweDRhLDB4NWUsMHg5MSwweDlkLDB4ZjUsMHg5MiwweDRmLDB4ZWIsCisJMHhjNiwweDcwLDB4MDIsMHgyZCwweDNkLDB4MDQsMHhhYSwweGU5LDB4M2EsMHg4ZSwKKwkweGQ1LDB4YTgsMHhhZCwweGY3LDB4Y2UsMHgwZCwweDE2LDB4YjIsMHhlYywweDBhLAorCTB4OWMsMHhmNSwweDk0LDB4MzksMHhiOSwweDhhLDB4ZmMsMHgxZSwweGY5LDB4Y2MsCisJMHhmMiwweDVmLDB4MjEsMHgzMSwweDc0LDB4NzIsMHg2YiwweDY0LDB4YWUsMHgzNSwKKwkweDYxLDB4OGQsMHgwZCwweGNiLDB4ZTcsMHhkYSwweDM5LDB4Y2EsMHhmMywweDIxLAorCTB4NjYsMHgwYiwweDk1LDB4ZDcsMHgwYSwweDdjLDB4Y2EsMHhhMSwweGE5LDB4NWEsCisJMHhlOCwweGFjLDB4ZTAsMHg3MSwweDU0LDB4YWYsMHgyOCwweGNmLDB4ZDUsMHg3MCwKKwkweDg5LDB4ZTAsMHhmMywweDllLDB4NDMsMHg2YywweDhkLDB4N2IsMHg5OSwweDAxLAorCTB4NjgsMHg0ZCwweGExLDB4NDUsMHg0NiwweDBjLDB4NDMsMHhiYywweGNjLDB4MmMsCisJMHhkZCwweGM1LDB4NDYsMHhjOCwweDRlLDB4MGUsMHhiZSwweGVkLDB4YjksMHgyNiwKKwkweGFiLDB4MmUsMHhkYiwweGViLDB4OGYsMHhmZiwweGRiLDB4YjAsMHhjNiwweDU1LAorCTB4YWYsMHhmOCwweDJhLDB4OTEsMHg5ZCwweDUwLDB4NDQsMHgyMSwweDE3LAorCX07CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3RpbWVvdXRzLmggYi9saWIvb3BlbnNzbC9hcHBzL3RpbWVvdXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliNWRjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2FwcHMvdGltZW91dHMuaApAQCAtMCwwICsxLDY3IEBACisvKiBhcHBzL3RpbWVvdXRzLmggKi8KKy8qIAorICogRFRMUyBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IE5hZ2VuZHJhIE1vZGFkdWd1CisgKiAobmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDA1LiAgCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIElOQ0xVREVEX1RJTUVPVVRTX0gKKyNkZWZpbmUgSU5DTFVERURfVElNRU9VVFNfSAorCisvKiBudW1iZXJzIGluIHVzICovCisjZGVmaW5lIERHUkFNX1JDVl9USU1FT1VUICAgICAgICAgMjUwMDAwCisjZGVmaW5lIERHUkFNX1NORF9USU1FT1VUICAgICAgICAgMjUwMDAwCisKKyNlbmRpZiAvKiAhIElOQ0xVREVEX1RJTUVPVVRTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2FwcHMvdmVyaWZ5LmMgYi9saWIvb3BlbnNzbC9hcHBzL3ZlcmlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjM5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3ZlcmlmeS5jCkBAIC0wLDAgKzEsMzUwIEBACisvKiBhcHBzL3ZlcmlmeS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HCXZlcmlmeV9tYWluCisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgY2IoaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK3N0YXRpYyBpbnQgY2hlY2soWDUwOV9TVE9SRSAqY3R4LCBjaGFyICpmaWxlLAorCQlTVEFDS19PRihYNTA5KSAqdWNoYWluLCBTVEFDS19PRihYNTA5KSAqdGNoYWluLAorCQlTVEFDS19PRihYNTA5X0NSTCkgKmNybHMsIEVOR0lORSAqZSk7CitzdGF0aWMgaW50IHZfdmVyYm9zZT0wLCB2ZmxhZ3MgPSAwOworCitpbnQgTUFJTihpbnQsIGNoYXIgKiopOworCitpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCUVOR0lORSAqZSA9IE5VTEw7CisJaW50IGkscmV0PTEsIGJhZGFyZyA9IDA7CisJY2hhciAqQ0FwYXRoPU5VTEwsKkNBZmlsZT1OVUxMOworCWNoYXIgKnVudGZpbGUgPSBOVUxMLCAqdHJ1c3RmaWxlID0gTlVMTCwgKmNybGZpbGUgPSBOVUxMOworCVNUQUNLX09GKFg1MDkpICp1bnRydXN0ZWQgPSBOVUxMLCAqdHJ1c3RlZCA9IE5VTEw7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICpjcmxzID0gTlVMTDsKKwlYNTA5X1NUT1JFICpjZXJ0X2N0eD1OVUxMOworCVg1MDlfTE9PS1VQICpsb29rdXA9TlVMTDsKKwlYNTA5X1ZFUklGWV9QQVJBTSAqdnBtID0gTlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwljaGFyICplbmdpbmU9TlVMTDsKKyNlbmRpZgorCisJY2VydF9jdHg9WDUwOV9TVE9SRV9uZXcoKTsKKwlpZiAoY2VydF9jdHggPT0gTlVMTCkgZ290byBlbmQ7CisJWDUwOV9TVE9SRV9zZXRfdmVyaWZ5X2NiKGNlcnRfY3R4LGNiKTsKKworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKwlhcHBzX3N0YXJ0dXAoKTsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmICghbG9hZF9jb25maWcoYmlvX2VyciwgTlVMTCkpCisJCWdvdG8gZW5kOworCisJYXJnYy0tOworCWFyZ3YrKzsKKwlmb3IgKDs7KQorCQl7CisJCWlmIChhcmdjID49IDEpCisJCQl7CisJCQlpZiAoc3RyY21wKCphcmd2LCItQ0FwYXRoIikgPT0gMCkKKwkJCQl7CisJCQkJaWYgKGFyZ2MtLSA8IDEpIGdvdG8gZW5kOworCQkJCUNBcGF0aD0gKigrK2FyZ3YpOworCQkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUNBZmlsZSIpID09IDApCisJCQkJeworCQkJCWlmIChhcmdjLS0gPCAxKSBnb3RvIGVuZDsKKwkJCQlDQWZpbGU9ICooKythcmd2KTsKKwkJCQl9CisJCQllbHNlIGlmIChhcmdzX3ZlcmlmeSgmYXJndiwgJmFyZ2MsICZiYWRhcmcsIGJpb19lcnIsCisJCQkJCQkJCQkmdnBtKSkKKwkJCQl7CisJCQkJaWYgKGJhZGFyZykKKwkJCQkJZ290byBlbmQ7CisJCQkJY29udGludWU7CisJCQkJfQorCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdW50cnVzdGVkIikgPT0gMCkKKwkJCQl7CisJCQkJaWYgKGFyZ2MtLSA8IDEpIGdvdG8gZW5kOworCQkJCXVudGZpbGU9ICooKythcmd2KTsKKwkJCQl9CisJCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi10cnVzdGVkIikgPT0gMCkKKwkJCQl7CisJCQkJaWYgKGFyZ2MtLSA8IDEpIGdvdG8gZW5kOworCQkJCXRydXN0ZmlsZT0gKigrK2FyZ3YpOworCQkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUNSTGZpbGUiKSA9PSAwKQorCQkJCXsKKwkJCQlpZiAoYXJnYy0tIDwgMSkgZ290byBlbmQ7CisJCQkJY3JsZmlsZT0gKigrK2FyZ3YpOworCQkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVuZ2luZSIpID09IDApCisJCQkJeworCQkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGVuZDsKKwkJCQllbmdpbmU9ICooKythcmd2KTsKKwkJCQl9CisjZW5kaWYKKwkJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWhlbHAiKSA9PSAwKQorCQkJCWdvdG8gZW5kOworCQkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdmVyYm9zZSIpID09IDApCisJCQkJdl92ZXJib3NlPTE7CisJCQllbHNlIGlmIChhcmd2WzBdWzBdID09ICctJykKKwkJCQlnb3RvIGVuZDsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJCWFyZ2MtLTsKKwkJCWFyZ3YrKzsKKwkJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgICAgICBlID0gc2V0dXBfZW5naW5lKGJpb19lcnIsIGVuZ2luZSwgMCk7CisjZW5kaWYKKworCWlmICh2cG0pCisJCVg1MDlfU1RPUkVfc2V0MV9wYXJhbShjZXJ0X2N0eCwgdnBtKTsKKworCWxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoY2VydF9jdHgsWDUwOV9MT09LVVBfZmlsZSgpKTsKKwlpZiAobG9va3VwID09IE5VTEwpIGFib3J0KCk7CisJaWYgKENBZmlsZSkgeworCQlpPVg1MDlfTE9PS1VQX2xvYWRfZmlsZShsb29rdXAsQ0FmaWxlLFg1MDlfRklMRVRZUEVfUEVNKTsKKwkJaWYoIWkpIHsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIkVycm9yIGxvYWRpbmcgZmlsZSAlc1xuIiwgQ0FmaWxlKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0gZWxzZSBYNTA5X0xPT0tVUF9sb2FkX2ZpbGUobG9va3VwLE5VTEwsWDUwOV9GSUxFVFlQRV9ERUZBVUxUKTsKKwkJCisJbG9va3VwPVg1MDlfU1RPUkVfYWRkX2xvb2t1cChjZXJ0X2N0eCxYNTA5X0xPT0tVUF9oYXNoX2RpcigpKTsKKwlpZiAobG9va3VwID09IE5VTEwpIGFib3J0KCk7CisJaWYgKENBcGF0aCkgeworCQlpPVg1MDlfTE9PS1VQX2FkZF9kaXIobG9va3VwLENBcGF0aCxYNTA5X0ZJTEVUWVBFX1BFTSk7CisJCWlmKCFpKSB7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBsb2FkaW5nIGRpcmVjdG9yeSAlc1xuIiwgQ0FwYXRoKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0gZWxzZSBYNTA5X0xPT0tVUF9hZGRfZGlyKGxvb2t1cCxOVUxMLFg1MDlfRklMRVRZUEVfREVGQVVMVCk7CisKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKworCWlmKHVudGZpbGUpCisJCXsKKwkJdW50cnVzdGVkID0gbG9hZF9jZXJ0cyhiaW9fZXJyLCB1bnRmaWxlLCBGT1JNQVRfUEVNLAorCQkJCQlOVUxMLCBlLCAidW50cnVzdGVkIGNlcnRpZmljYXRlcyIpOworCQlpZighdW50cnVzdGVkKQorCQkJZ290byBlbmQ7CisJCX0KKworCWlmKHRydXN0ZmlsZSkKKwkJeworCQl0cnVzdGVkID0gbG9hZF9jZXJ0cyhiaW9fZXJyLCB0cnVzdGZpbGUsIEZPUk1BVF9QRU0sCisJCQkJCU5VTEwsIGUsICJ0cnVzdGVkIGNlcnRpZmljYXRlcyIpOworCQlpZighdHJ1c3RlZCkKKwkJCWdvdG8gZW5kOworCQl9CisKKwlpZihjcmxmaWxlKQorCQl7CisJCWNybHMgPSBsb2FkX2NybHMoYmlvX2VyciwgY3JsZmlsZSwgRk9STUFUX1BFTSwKKwkJCQkJTlVMTCwgZSwgIm90aGVyIENSTHMiKTsKKwkJaWYoIWNybHMpCisJCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGFyZ2MgPCAxKSBjaGVjayhjZXJ0X2N0eCwgTlVMTCwgdW50cnVzdGVkLCB0cnVzdGVkLCBjcmxzLCBlKTsKKwllbHNlCisJCWZvciAoaT0wOyBpPGFyZ2M7IGkrKykKKwkJCWNoZWNrKGNlcnRfY3R4LGFyZ3ZbaV0sIHVudHJ1c3RlZCwgdHJ1c3RlZCwgY3JscywgZSk7CisJcmV0PTA7CitlbmQ6CisJaWYgKHJldCA9PSAxKSB7CisJCUJJT19wcmludGYoYmlvX2VyciwidXNhZ2U6IHZlcmlmeSBbLXZlcmJvc2VdIFstQ0FwYXRoIHBhdGhdIFstQ0FmaWxlIGZpbGVdIFstcHVycG9zZSBwdXJwb3NlXSBbLWNybF9jaGVja10iKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIgWy1lbmdpbmUgZV0iKTsKKyNlbmRpZgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIiBjZXJ0MSBjZXJ0MiAuLi5cbiIpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsInJlY29nbml6ZWQgdXNhZ2VzOlxuIik7CisJCWZvcihpID0gMDsgaSA8IFg1MDlfUFVSUE9TRV9nZXRfY291bnQoKTsgaSsrKSB7CisJCQlYNTA5X1BVUlBPU0UgKnB0bXA7CisJCQlwdG1wID0gWDUwOV9QVVJQT1NFX2dldDAoaSk7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJcdCUtMTBzXHQlc1xuIiwgWDUwOV9QVVJQT1NFX2dldDBfc25hbWUocHRtcCksCisJCQkJCQkJCVg1MDlfUFVSUE9TRV9nZXQwX25hbWUocHRtcCkpOworCQl9CisJfQorCWlmICh2cG0pIFg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUodnBtKTsKKwlpZiAoY2VydF9jdHggIT0gTlVMTCkgWDUwOV9TVE9SRV9mcmVlKGNlcnRfY3R4KTsKKwlza19YNTA5X3BvcF9mcmVlKHVudHJ1c3RlZCwgWDUwOV9mcmVlKTsKKwlza19YNTA5X3BvcF9mcmVlKHRydXN0ZWQsIFg1MDlfZnJlZSk7CisJc2tfWDUwOV9DUkxfcG9wX2ZyZWUoY3JscywgWDUwOV9DUkxfZnJlZSk7CisJYXBwc19zaHV0ZG93bigpOworCU9QRU5TU0xfRVhJVChyZXQpOworCX0KKworc3RhdGljIGludCBjaGVjayhYNTA5X1NUT1JFICpjdHgsIGNoYXIgKmZpbGUsCisJCVNUQUNLX09GKFg1MDkpICp1Y2hhaW4sIFNUQUNLX09GKFg1MDkpICp0Y2hhaW4sCisJCVNUQUNLX09GKFg1MDlfQ1JMKSAqY3JscywgRU5HSU5FICplKQorCXsKKwlYNTA5ICp4PU5VTEw7CisJaW50IGk9MCxyZXQ9MDsKKwlYNTA5X1NUT1JFX0NUWCAqY3NjOworCisJeCA9IGxvYWRfY2VydChiaW9fZXJyLCBmaWxlLCBGT1JNQVRfUEVNLCBOVUxMLCBlLCAiY2VydGlmaWNhdGUgZmlsZSIpOworCWlmICh4ID09IE5VTEwpCisJCWdvdG8gZW5kOworCWZwcmludGYoc3Rkb3V0LCIlczogIiwoZmlsZSA9PSBOVUxMKT8ic3RkaW4iOmZpbGUpOworCisJY3NjID0gWDUwOV9TVE9SRV9DVFhfbmV3KCk7CisJaWYgKGNzYyA9PSBOVUxMKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisJWDUwOV9TVE9SRV9zZXRfZmxhZ3MoY3R4LCB2ZmxhZ3MpOworCWlmKCFYNTA5X1NUT1JFX0NUWF9pbml0KGNzYyxjdHgseCx1Y2hhaW4pKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisJaWYodGNoYWluKSBYNTA5X1NUT1JFX0NUWF90cnVzdGVkX3N0YWNrKGNzYywgdGNoYWluKTsKKwlpZiAoY3JscykKKwkJWDUwOV9TVE9SRV9DVFhfc2V0MF9jcmxzKGNzYywgY3Jscyk7CisJaT1YNTA5X3ZlcmlmeV9jZXJ0KGNzYyk7CisJWDUwOV9TVE9SRV9DVFhfZnJlZShjc2MpOworCisJcmV0PTA7CitlbmQ6CisJaWYgKGkgPiAwKQorCQl7CisJCWZwcmludGYoc3Rkb3V0LCJPS1xuIik7CisJCXJldD0xOworCQl9CisJZWxzZQorCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCWlmICh4ICE9IE5VTEwpIFg1MDlfZnJlZSh4KTsKKworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBNU19DQUxMQkFDSyBjYihpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCWludCBjZXJ0X2Vycm9yID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKGN0eCk7CisJWDUwOSAqY3VycmVudF9jZXJ0ID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2N1cnJlbnRfY2VydChjdHgpOworCisJaWYgKCFvaykKKwkJeworCQlpZiAoY3VycmVudF9jZXJ0KQorCQkJeworCQkJWDUwOV9OQU1FX3ByaW50X2V4X2ZwKHN0ZG91dCwKKwkJCQlYNTA5X2dldF9zdWJqZWN0X25hbWUoY3VycmVudF9jZXJ0KSwKKwkJCQkwLCBYTl9GTEFHX09ORUxJTkUpOworCQkJcHJpbnRmKCJcbiIpOworCQkJfQorCQlwcmludGYoIiVzZXJyb3IgJWQgYXQgJWQgZGVwdGggbG9va3VwOiVzXG4iLAorCQkJWDUwOV9TVE9SRV9DVFhfZ2V0MF9wYXJlbnRfY3R4KGN0eCkgPyAiW0NSTCBwYXRoXSIgOiAiIiwKKwkJCWNlcnRfZXJyb3IsCisJCQlYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoY3R4KSwKKwkJCVg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGNlcnRfZXJyb3IpKTsKKwkJc3dpdGNoKGNlcnRfZXJyb3IpCisJCQl7CisJCQljYXNlIFg1MDlfVl9FUlJfTk9fRVhQTElDSVRfUE9MSUNZOgorCQkJCXBvbGljaWVzX3ByaW50KE5VTEwsIGN0eCk7CisJCQljYXNlIFg1MDlfVl9FUlJfQ0VSVF9IQVNfRVhQSVJFRDoKKworCQkJLyogc2luY2Ugd2UgYXJlIGp1c3QgY2hlY2tpbmcgdGhlIGNlcnRpZmljYXRlcywgaXQgaXMKKwkJCSAqIG9rIGlmIHRoZXkgYXJlIHNlbGYgc2lnbmVkLiBCdXQgd2Ugc2hvdWxkIHN0aWxsIHdhcm4KKwkJCSAqIHRoZSB1c2VyLgorCQkJICovCisKKwkJCWNhc2UgWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQ6CisJCQkvKiBDb250aW51ZSBhZnRlciBleHRlbnNpb24gZXJyb3JzIHRvbyAqLworCQkJY2FzZSBYNTA5X1ZfRVJSX0lOVkFMSURfQ0E6CisJCQljYXNlIFg1MDlfVl9FUlJfSU5WQUxJRF9OT05fQ0E6CisJCQljYXNlIFg1MDlfVl9FUlJfUEFUSF9MRU5HVEhfRVhDRUVERUQ6CisJCQljYXNlIFg1MDlfVl9FUlJfSU5WQUxJRF9QVVJQT1NFOgorCQkJY2FzZSBYNTA5X1ZfRVJSX0NSTF9IQVNfRVhQSVJFRDoKKwkJCWNhc2UgWDUwOV9WX0VSUl9DUkxfTk9UX1lFVF9WQUxJRDoKKwkJCWNhc2UgWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfRVhURU5TSU9OOgorCQkJb2sgPSAxOworCisJCQl9CisKKwkJcmV0dXJuIG9rOworCisJCX0KKwlpZiAoY2VydF9lcnJvciA9PSBYNTA5X1ZfT0sgJiYgb2sgPT0gMikKKwkJcG9saWNpZXNfcHJpbnQoTlVMTCwgY3R4KTsKKwlpZiAoIXZfdmVyYm9zZSkKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJcmV0dXJuKG9rKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9hcHBzL3ZlcnNpb24uYyBiL2xpYi9vcGVuc3NsL2FwcHMvdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTU1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9hcHBzL3ZlcnNpb24uYwpAQCAtMCwwICsxLDIxNyBAQAorLyogYXBwcy92ZXJzaW9uLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJhcHBzLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19NRDIKKyMgaW5jbHVkZSA8b3BlbnNzbC9tZDIuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDNAorIyBpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisjIGluY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisjIGluY2x1ZGUgPG9wZW5zc2wvaWRlYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQkYKKyMgaW5jbHVkZSA8b3BlbnNzbC9ibG93ZmlzaC5oPgorI2VuZGlmCisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cJdmVyc2lvbl9tYWluCisKK2ludCBNQUlOKGludCwgY2hhciAqKik7CisKK2ludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJaW50IGkscmV0PTA7CisJaW50IGNmbGFncz0wLHZlcnNpb249MCxkYXRlPTAsb3B0aW9ucz0wLHBsYXRmb3JtPTAsZGlyPTA7CisKKwlhcHBzX3N0YXJ0dXAoKTsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWlmIChhcmdjID09IDEpIHZlcnNpb249MTsKKwlmb3IgKGk9MTsgaTxhcmdjOyBpKyspCisJCXsKKwkJaWYgKHN0cmNtcChhcmd2W2ldLCItdiIpID09IDApCisJCQl2ZXJzaW9uPTE7CQorCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwiLWIiKSA9PSAwKQorCQkJZGF0ZT0xOworCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwiLWYiKSA9PSAwKQorCQkJY2ZsYWdzPTE7CisJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCItbyIpID09IDApCisJCQlvcHRpb25zPTE7CisJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCItcCIpID09IDApCisJCQlwbGF0Zm9ybT0xOworCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwiLWQiKSA9PSAwKQorCQkJZGlyPTE7CisJCWVsc2UgaWYgKHN0cmNtcChhcmd2W2ldLCItYSIpID09IDApCisJCQlkYXRlPXZlcnNpb249Y2ZsYWdzPW9wdGlvbnM9cGxhdGZvcm09ZGlyPTE7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwidXNhZ2U6dmVyc2lvbiAtW2F2Ym9mcGRdXG4iKTsKKwkJCXJldD0xOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKworCWlmICh2ZXJzaW9uKQorCQl7CisJCWlmIChTU0xlYXkoKSA9PSBTU0xFQVlfVkVSU0lPTl9OVU1CRVIpCisJCQl7CisJCQlwcmludGYoIiVzXG4iLFNTTGVheV92ZXJzaW9uKFNTTEVBWV9WRVJTSU9OKSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXByaW50ZigiJXMgKExpYnJhcnk6ICVzKVxuIiwKKwkJCQlPUEVOU1NMX1ZFUlNJT05fVEVYVCwKKwkJCQlTU0xlYXlfdmVyc2lvbihTU0xFQVlfVkVSU0lPTikpOworCQkJfQorCQl9CisJaWYgKGRhdGUpICAgIHByaW50ZigiJXNcbiIsU1NMZWF5X3ZlcnNpb24oU1NMRUFZX0JVSUxUX09OKSk7CisJaWYgKHBsYXRmb3JtKSBwcmludGYoIiVzXG4iLFNTTGVheV92ZXJzaW9uKFNTTEVBWV9QTEFURk9STSkpOworCWlmIChvcHRpb25zKSAKKwkJeworCQlwcmludGYoIm9wdGlvbnM6ICAiKTsKKwkJcHJpbnRmKCIlcyAiLEJOX29wdGlvbnMoKSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fTUQyCisJCXByaW50ZigiJXMgIixNRDJfb3B0aW9ucygpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDNAorCQlwcmludGYoIiVzICIsUkM0X29wdGlvbnMoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwkJcHJpbnRmKCIlcyAiLERFU19vcHRpb25zKCkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorCQlwcmludGYoIiVzICIsaWRlYV9vcHRpb25zKCkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQkYKKwkJcHJpbnRmKCIlcyAiLEJGX29wdGlvbnMoKSk7CisjZW5kaWYKKwkJcHJpbnRmKCJcbiIpOworCQl9CisJaWYgKGNmbGFncykgIHByaW50ZigiJXNcbiIsU1NMZWF5X3ZlcnNpb24oU1NMRUFZX0NGTEFHUykpOworCWlmIChkaXIpICBwcmludGYoIiVzXG4iLFNTTGVheV92ZXJzaW9uKFNTTEVBWV9ESVIpKTsKK2VuZDoKKwlhcHBzX3NodXRkb3duKCk7CisJT1BFTlNTTF9FWElUKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy93aW5yYW5kLmMgYi9saWIvb3BlbnNzbC9hcHBzL3dpbnJhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWJlZGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy93aW5yYW5kLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIGFwcHMvd2lucmFuZC5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogVXNhZ2U6IHdpbnJhbmQgW2ZpbGVuYW1lXQorICoKKyAqIENvbGxlY3RzIGVudHJvcHkgZnJvbSBtb3VzZSBtb3ZlbWVudHMgYW5kIG90aGVyIGV2ZW50cyBhbmQgd3JpdGVzCisgKiByYW5kb20gZGF0YSB0byBmaWxlbmFtZSBvciAucm5kCisgKi8KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK0xSRVNVTFQgQ0FMTEJBQ0sgV25kUHJvYyhIV05ELCBVSU5ULCBXUEFSQU0sIExQQVJBTSk7Citjb25zdCBjaGFyICpmaWxlbmFtZTsKKworaW50IFdJTkFQSSBXaW5NYWluKEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhJTlNUQU5DRSBoUHJldkluc3RhbmNlLAorICAgICAgICBQU1RSIGNtZGxpbmUsIGludCBpQ21kU2hvdykKKwl7CisJc3RhdGljIGNoYXIgYXBwbmFtZVtdID0gIk9wZW5TU0wiOworCUhXTkQgaHduZDsKKwlNU0cgbXNnOworCVdORENMQVNTRVggd25kY2xhc3M7CisgICAgICAgIGNoYXIgYnVmZmVyWzIwMF07CisKKyAgICAgICAgaWYgKGNtZGxpbmVbMF0gPT0gJ1wwJykKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IFJBTkRfZmlsZV9uYW1lKGJ1ZmZlciwgc2l6ZW9mIGJ1ZmZlcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGNtZGxpbmU7CisKKyAgICAgICAgUkFORF9sb2FkX2ZpbGUoZmlsZW5hbWUsIC0xKTsKKworCXduZGNsYXNzLmNiU2l6ZSA9IHNpemVvZih3bmRjbGFzcyk7CisJd25kY2xhc3Muc3R5bGUgPSBDU19IUkVEUkFXIHwgQ1NfVlJFRFJBVzsKKwl3bmRjbGFzcy5scGZuV25kUHJvYyA9IFduZFByb2M7CisJd25kY2xhc3MuY2JDbHNFeHRyYSA9IDA7CisJd25kY2xhc3MuY2JXbmRFeHRyYSA9IDA7CisJd25kY2xhc3MuaEluc3RhbmNlID0gaEluc3RhbmNlOworCXduZGNsYXNzLmhJY29uID0gTG9hZEljb24oTlVMTCwgSURJX0FQUExJQ0FUSU9OKTsKKwl3bmRjbGFzcy5oQ3Vyc29yID0gTG9hZEN1cnNvcihOVUxMLCBJRENfQVJST1cpOworCXduZGNsYXNzLmhickJhY2tncm91bmQgPSAoSEJSVVNIKSBHZXRTdG9ja09iamVjdChXSElURV9CUlVTSCk7CisJd25kY2xhc3MubHBzek1lbnVOYW1lID0gTlVMTDsKKyAgICAgICAgd25kY2xhc3MubHBzekNsYXNzTmFtZSA9IGFwcG5hbWU7CisJd25kY2xhc3MuaEljb25TbSA9IExvYWRJY29uKE5VTEwsIElESV9BUFBMSUNBVElPTik7CisJUmVnaXN0ZXJDbGFzc0V4KCZ3bmRjbGFzcyk7CisKKyAgICAgICAgaHduZCA9IENyZWF0ZVdpbmRvdyhhcHBuYW1lLCBPUEVOU1NMX1ZFUlNJT05fVEVYVCwKKwkJV1NfT1ZFUkxBUFBFRFdJTkRPVywgQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwKKwkJQ1dfVVNFREVGQVVMVCwgQ1dfVVNFREVGQVVMVCwgTlVMTCwgTlVMTCwgaEluc3RhbmNlLCBOVUxMKTsKKworCVNob3dXaW5kb3coaHduZCwgaUNtZFNob3cpOworCVVwZGF0ZVdpbmRvdyhod25kKTsKKworCisJd2hpbGUgKEdldE1lc3NhZ2UoJm1zZywgTlVMTCwgMCwgMCkpCisJCXsKKwkJVHJhbnNsYXRlTWVzc2FnZSgmbXNnKTsKKwkJRGlzcGF0Y2hNZXNzYWdlKCZtc2cpOworCQl9CisKKwlyZXR1cm4gbXNnLndQYXJhbTsKKwl9CisKK0xSRVNVTFQgQ0FMTEJBQ0sgV25kUHJvYyhIV05EIGh3bmQsIFVJTlQgaU1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKKwl7CisgICAgICAgIEhEQyBoZGM7CisJUEFJTlRTVFJVQ1QgcHM7CisgICAgICAgIFJFQ1QgcmVjdDsKKyAgICAgICAgc3RhdGljIGludCBzZWVkZWQgPSAwOworCisJc3dpdGNoIChpTXNnKQorCQl7CisJY2FzZSBXTV9QQUlOVDoKKwkJaGRjID0gQmVnaW5QYWludChod25kLCAmcHMpOworCQlHZXRDbGllbnRSZWN0KGh3bmQsICZyZWN0KTsKKyAgICAgICAgICAgICAgICBEcmF3VGV4dChoZGMsICJTZWVkaW5nIHRoZSBQUk5HLiBQbGVhc2UgbW92ZSB0aGUgbW91c2UhIiwgLTEsCisJCQkmcmVjdCwgRFRfU0lOR0xFTElORSB8IERUX0NFTlRFUiB8IERUX1ZDRU5URVIpOworCQlFbmRQYWludChod25kLCAmcHMpOworCQlyZXR1cm4gMDsKKwkJCisgICAgICAgIGNhc2UgV01fREVTVFJPWToKKyAgICAgICAgICAgICAgICBQb3N0UXVpdE1lc3NhZ2UoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgIGlmIChSQU5EX2V2ZW50KGlNc2csIHdQYXJhbSwgbFBhcmFtKSA9PSAxICYmIHNlZWRlZCA9PSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWVkZWQgPSAxOworICAgICAgICAgICAgICAgIGlmIChSQU5EX3dyaXRlX2ZpbGUoZmlsZW5hbWUpIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm94KGh3bmQsICJDb3VsZG4ndCB3cml0ZSByYW5kb20gZmlsZSEiLAorCQkJCSJPcGVuU1NMIiwgTUJfT0sgfCBNQl9JQ09ORVJST1IpOworICAgICAgICAgICAgICAgIFBvc3RRdWl0TWVzc2FnZSgwKTsKKyAgICAgICAgICAgICAgICB9CisKKwlyZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBpTXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvYXBwcy94NTA5LmMgYi9saWIvb3BlbnNzbC9hcHBzL3g1MDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2U0NmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvYXBwcy94NTA5LmMKQEAgLTAsMCArMSwxMjk0IEBACisvKiBhcHBzL3g1MDkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBPUEVOU1NMX05PX1NURElPCisjZGVmaW5lIEFQUFNfV0lOMTYKKyNlbmRpZgorI2luY2x1ZGUgImFwcHMuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2VuZGlmCisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cgeDUwOV9tYWluCisKKyN1bmRlZiBQT1NURklYCisjZGVmaW5lCVBPU1RGSVgJIi5zcmwiCisjZGVmaW5lIERFRl9EQVlTCTMwCisKK3N0YXRpYyBjb25zdCBjaGFyICp4NTA5X3VzYWdlW109eworInVzYWdlOiB4NTA5IGFyZ3NcbiIsCisiIC1pbmZvcm0gYXJnICAgICAtIGlucHV0IGZvcm1hdCAtIGRlZmF1bHQgUEVNIChvbmUgb2YgREVSLCBORVQgb3IgUEVNKVxuIiwKKyIgLW91dGZvcm0gYXJnICAgIC0gb3V0cHV0IGZvcm1hdCAtIGRlZmF1bHQgUEVNIChvbmUgb2YgREVSLCBORVQgb3IgUEVNKVxuIiwKKyIgLWtleWZvcm0gYXJnICAgIC0gcHJpdmF0ZSBrZXkgZm9ybWF0IC0gZGVmYXVsdCBQRU1cbiIsCisiIC1DQWZvcm0gYXJnICAgICAtIENBIGZvcm1hdCAtIGRlZmF1bHQgUEVNXG4iLAorIiAtQ0FrZXlmb3JtIGFyZyAgLSBDQSBrZXkgZm9ybWF0IC0gZGVmYXVsdCBQRU1cbiIsCisiIC1pbiBhcmcgICAgICAgICAtIGlucHV0IGZpbGUgLSBkZWZhdWx0IHN0ZGluXG4iLAorIiAtb3V0IGFyZyAgICAgICAgLSBvdXRwdXQgZmlsZSAtIGRlZmF1bHQgc3Rkb3V0XG4iLAorIiAtcGFzc2luIGFyZyAgICAgLSBwcml2YXRlIGtleSBwYXNzd29yZCBzb3VyY2VcbiIsCisiIC1zZXJpYWwgICAgICAgICAtIHByaW50IHNlcmlhbCBudW1iZXIgdmFsdWVcbiIsCisiIC1zdWJqZWN0X2hhc2ggICAtIHByaW50IHN1YmplY3QgaGFzaCB2YWx1ZVxuIiwKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKKyIgLXN1YmplY3RfaGFzaF9vbGQgICAtIHByaW50IG9sZC1zdHlsZSAoTUQ1KSBzdWJqZWN0IGhhc2ggdmFsdWVcbiIsCisjZW5kaWYKKyIgLWlzc3Vlcl9oYXNoICAgIC0gcHJpbnQgaXNzdWVyIGhhc2ggdmFsdWVcbiIsCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisiIC1pc3N1ZXJfaGFzaF9vbGQgICAgLSBwcmludCBvbGQtc3R5bGUgKE1ENSkgaXNzdWVyIGhhc2ggdmFsdWVcbiIsCisjZW5kaWYKKyIgLWhhc2ggICAgICAgICAgIC0gc3lub255bSBmb3IgLXN1YmplY3RfaGFzaFxuIiwKKyIgLXN1YmplY3QgICAgICAgIC0gcHJpbnQgc3ViamVjdCBETlxuIiwKKyIgLWlzc3VlciAgICAgICAgIC0gcHJpbnQgaXNzdWVyIEROXG4iLAorIiAtZW1haWwgICAgICAgICAgLSBwcmludCBlbWFpbCBhZGRyZXNzKGVzKVxuIiwKKyIgLXN0YXJ0ZGF0ZSAgICAgIC0gbm90QmVmb3JlIGZpZWxkXG4iLAorIiAtZW5kZGF0ZSAgICAgICAgLSBub3RBZnRlciBmaWVsZFxuIiwKKyIgLXB1cnBvc2UgICAgICAgIC0gcHJpbnQgb3V0IGNlcnRpZmljYXRlIHB1cnBvc2VzXG4iLAorIiAtZGF0ZXMgICAgICAgICAgLSBib3RoIEJlZm9yZSBhbmQgQWZ0ZXIgZGF0ZXNcbiIsCisiIC1tb2R1bHVzICAgICAgICAtIHByaW50IHRoZSBSU0Ega2V5IG1vZHVsdXNcbiIsCisiIC1wdWJrZXkgICAgICAgICAtIG91dHB1dCB0aGUgcHVibGljIGtleVxuIiwKKyIgLWZpbmdlcnByaW50ICAgIC0gcHJpbnQgdGhlIGNlcnRpZmljYXRlIGZpbmdlcnByaW50XG4iLAorIiAtYWxpYXMgICAgICAgICAgLSBvdXRwdXQgY2VydGlmaWNhdGUgYWxpYXNcbiIsCisiIC1ub291dCAgICAgICAgICAtIG5vIGNlcnRpZmljYXRlIG91dHB1dFxuIiwKKyIgLW9jc3BpZCAgICAgICAgIC0gcHJpbnQgT0NTUCBoYXNoIHZhbHVlcyBmb3IgdGhlIHN1YmplY3QgbmFtZSBhbmQgcHVibGljIGtleVxuIiwKKyIgLW9jc3BfdXJpICAgICAgIC0gcHJpbnQgT0NTUCBSZXNwb25kZXIgVVJMKHMpXG4iLAorIiAtdHJ1c3RvdXQgICAgICAgLSBvdXRwdXQgYSBcInRydXN0ZWRcIiBjZXJ0aWZpY2F0ZVxuIiwKKyIgLWNscnRydXN0ICAgICAgIC0gY2xlYXIgYWxsIHRydXN0ZWQgcHVycG9zZXNcbiIsCisiIC1jbHJyZWplY3QgICAgICAtIGNsZWFyIGFsbCByZWplY3RlZCBwdXJwb3Nlc1xuIiwKKyIgLWFkZHRydXN0IGFyZyAgIC0gdHJ1c3QgY2VydGlmaWNhdGUgZm9yIGEgZ2l2ZW4gcHVycG9zZVxuIiwKKyIgLWFkZHJlamVjdCBhcmcgIC0gcmVqZWN0IGNlcnRpZmljYXRlIGZvciBhIGdpdmVuIHB1cnBvc2VcbiIsCisiIC1zZXRhbGlhcyBhcmcgICAtIHNldCBjZXJ0aWZpY2F0ZSBhbGlhc1xuIiwKKyIgLWRheXMgYXJnICAgICAgIC0gSG93IGxvbmcgdGlsbCBleHBpcnkgb2YgYSBzaWduZWQgY2VydGlmaWNhdGUgLSBkZWYgMzAgZGF5c1xuIiwKKyIgLWNoZWNrZW5kIGFyZyAgIC0gY2hlY2sgd2hldGhlciB0aGUgY2VydCBleHBpcmVzIGluIHRoZSBuZXh0IGFyZyBzZWNvbmRzXG4iLAorIiAgICAgICAgICAgICAgICAgICBleGl0IDEgaWYgc28sIDAgaWYgbm90XG4iLAorIiAtc2lnbmtleSBhcmcgICAgLSBzZWxmIHNpZ24gY2VydCB3aXRoIGFyZ1xuIiwKKyIgLXg1MDl0b3JlcSAgICAgIC0gb3V0cHV0IGEgY2VydGlmaWNhdGlvbiByZXF1ZXN0IG9iamVjdFxuIiwKKyIgLXJlcSAgICAgICAgICAgIC0gaW5wdXQgaXMgYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LCBzaWduIGFuZCBvdXRwdXQuXG4iLAorIiAtQ0EgYXJnICAgICAgICAgLSBzZXQgdGhlIENBIGNlcnRpZmljYXRlLCBtdXN0IGJlIFBFTSBmb3JtYXQuXG4iLAorIiAtQ0FrZXkgYXJnICAgICAgLSBzZXQgdGhlIENBIGtleSwgbXVzdCBiZSBQRU0gZm9ybWF0XG4iLAorIiAgICAgICAgICAgICAgICAgICBtaXNzaW5nLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZSBDQSBmaWxlLlxuIiwKKyIgLUNBY3JlYXRlc2VyaWFsIC0gY3JlYXRlIHNlcmlhbCBudW1iZXIgZmlsZSBpZiBpdCBkb2VzIG5vdCBleGlzdFxuIiwKKyIgLUNBc2VyaWFsIGFyZyAgIC0gc2VyaWFsIGZpbGVcbiIsCisiIC1zZXRfc2VyaWFsICAgICAtIHNlcmlhbCBudW1iZXIgdG8gdXNlXG4iLAorIiAtdGV4dCAgICAgICAgICAgLSBwcmludCB0aGUgY2VydGlmaWNhdGUgaW4gdGV4dCBmb3JtXG4iLAorIiAtQyAgICAgICAgICAgICAgLSBwcmludCBvdXQgQyBjb2RlIGZvcm1zXG4iLAorIiAtbWQyLy1tZDUvLXNoYTEvLW1kYzIgLSBkaWdlc3QgdG8gdXNlXG4iLAorIiAtZXh0ZmlsZSAgICAgICAgLSBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCBYNTA5VjMgZXh0ZW5zaW9ucyB0byBhZGRcbiIsCisiIC1leHRlbnNpb25zICAgICAtIHNlY3Rpb24gZnJvbSBjb25maWcgZmlsZSB3aXRoIFg1MDlWMyBleHRlbnNpb25zIHRvIGFkZFxuIiwKKyIgLWNscmV4dCAgICAgICAgIC0gZGVsZXRlIGV4dGVuc2lvbnMgYmVmb3JlIHNpZ25pbmcgYW5kIGlucHV0IGNlcnRpZmljYXRlXG4iLAorIiAtbmFtZW9wdCBhcmcgICAgLSB2YXJpb3VzIGNlcnRpZmljYXRlIG5hbWUgb3B0aW9uc1xuIiwKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyIgLWVuZ2luZSBlICAgICAgIC0gdXNlIGVuZ2luZSBlLCBwb3NzaWJseSBhIGhhcmR3YXJlIGRldmljZS5cbiIsCisjZW5kaWYKKyIgLWNlcnRvcHQgYXJnICAgIC0gdmFyaW91cyBjZXJ0aWZpY2F0ZSB0ZXh0IG9wdGlvbnNcbiIsCitOVUxMCit9OworCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGNhbGxiKGludCBvaywgWDUwOV9TVE9SRV9DVFggKmN0eCk7CitzdGF0aWMgaW50IHNpZ24gKFg1MDkgKngsIEVWUF9QS0VZICpwa2V5LGludCBkYXlzLGludCBjbHJleHQsIGNvbnN0IEVWUF9NRCAqZGlnZXN0LAorCQkJCQkJQ09ORiAqY29uZiwgY2hhciAqc2VjdGlvbik7CitzdGF0aWMgaW50IHg1MDlfY2VydGlmeSAoWDUwOV9TVE9SRSAqY3R4LGNoYXIgKkNBZmlsZSxjb25zdCBFVlBfTUQgKmRpZ2VzdCwKKwkJCSBYNTA5ICp4LFg1MDkgKnhjYSxFVlBfUEtFWSAqcGtleSxjaGFyICpzZXJpYWwsCisJCQkgaW50IGNyZWF0ZSxpbnQgZGF5cywgaW50IGNscmV4dCwgQ09ORiAqY29uZiwgY2hhciAqc2VjdGlvbiwKKwkJCQkJCUFTTjFfSU5URUdFUiAqc25vKTsKK3N0YXRpYyBpbnQgcHVycG9zZV9wcmludChCSU8gKmJpbywgWDUwOSAqY2VydCwgWDUwOV9QVVJQT1NFICpwdCk7CitzdGF0aWMgaW50IHJlcWZpbGU9MDsKKworaW50IE1BSU4oaW50LCBjaGFyICoqKTsKKworaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlFTkdJTkUgKmUgPSBOVUxMOworCWludCByZXQ9MTsKKwlYNTA5X1JFUSAqcmVxPU5VTEw7CisJWDUwOSAqeD1OVUxMLCp4Y2E9TlVMTDsKKwlBU04xX09CSkVDVCAqb2JqdG1wOworCUVWUF9QS0VZICpVcGtleT1OVUxMLCpDQXBrZXk9TlVMTDsKKwlBU04xX0lOVEVHRVIgKnNubyA9IE5VTEw7CisJaW50IGksbnVtLGJhZG9wcz0wOworCUJJTyAqb3V0PU5VTEw7CisJQklPICpTVERvdXQ9TlVMTDsKKwlTVEFDS19PRihBU04xX09CSkVDVCkgKnRydXN0ID0gTlVMTCwgKnJlamVjdCA9IE5VTEw7CisJaW50IGluZm9ybWF0LG91dGZvcm1hdCxrZXlmb3JtYXQsQ0Fmb3JtYXQsQ0FrZXlmb3JtYXQ7CisJY2hhciAqaW5maWxlPU5VTEwsKm91dGZpbGU9TlVMTCwqa2V5ZmlsZT1OVUxMLCpDQWZpbGU9TlVMTDsKKwljaGFyICpDQWtleWZpbGU9TlVMTCwqQ0FzZXJpYWw9TlVMTDsKKwljaGFyICphbGlhcz1OVUxMOworCWludCB0ZXh0PTAsc2VyaWFsPTAsc3ViamVjdD0wLGlzc3Vlcj0wLHN0YXJ0ZGF0ZT0wLGVuZGRhdGU9MDsKKwlpbnQgbmV4dF9zZXJpYWw9MDsKKwlpbnQgc3ViamVjdF9oYXNoPTAsaXNzdWVyX2hhc2g9MCxvY3NwaWQ9MDsKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKKwlpbnQgc3ViamVjdF9oYXNoX29sZD0wLGlzc3Vlcl9oYXNoX29sZD0wOworI2VuZGlmCisJaW50IG5vb3V0PTAsc2lnbl9mbGFnPTAsQ0FfZmxhZz0wLENBX2NyZWF0ZXNlcmlhbD0wLGVtYWlsPTA7CisJaW50IG9jc3BfdXJpPTA7CisJaW50IHRydXN0b3V0PTAsY2xydHJ1c3Q9MCxjbHJyZWplY3Q9MCxhbGlhc291dD0wLGNscmV4dD0wOworCWludCBDPTA7CisJaW50IHg1MDlyZXE9MCxkYXlzPURFRl9EQVlTLG1vZHVsdXM9MCxwdWJrZXk9MDsKKwlpbnQgcHByaW50ID0gMDsKKwljb25zdCBjaGFyICoqcHA7CisJWDUwOV9TVE9SRSAqY3R4PU5VTEw7CisJWDUwOV9SRVEgKnJxPU5VTEw7CisJaW50IGZpbmdlcnByaW50PTA7CisJY2hhciBidWZbMjU2XTsKKwljb25zdCBFVlBfTUQgKm1kX2FsZywqZGlnZXN0PU5VTEw7CisJQ09ORiAqZXh0Y29uZiA9IE5VTEw7CisJY2hhciAqZXh0c2VjdCA9IE5VTEwsICpleHRmaWxlID0gTlVMTCwgKnBhc3NpbiA9IE5VTEwsICpwYXNzYXJnaW4gPSBOVUxMOworCWludCBuZWVkX3JhbmQgPSAwOworCWludCBjaGVja2VuZD0wLGNoZWNrb2Zmc2V0PTA7CisJdW5zaWduZWQgbG9uZyBubWZsYWcgPSAwLCBjZXJ0ZmxhZyA9IDA7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJY2hhciAqZW5naW5lPU5VTEw7CisjZW5kaWYKKworCXJlcWZpbGU9MDsKKworCWFwcHNfc3RhcnR1cCgpOworCisJaWYgKGJpb19lcnIgPT0gTlVMTCkKKwkJYmlvX2Vycj1CSU9fbmV3X2ZwKHN0ZGVycixCSU9fTk9DTE9TRSk7CisKKwlpZiAoIWxvYWRfY29uZmlnKGJpb19lcnIsIE5VTEwpKQorCQlnb3RvIGVuZDsKKwlTVERvdXQ9QklPX25ld19mcChzdGRvdXQsQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCXsKKwlCSU8gKnRtcGJpbyA9IEJJT19uZXcoQklPX2ZfbGluZWJ1ZmZlcigpKTsKKwlTVERvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIFNURG91dCk7CisJfQorI2VuZGlmCisKKwlpbmZvcm1hdD1GT1JNQVRfUEVNOworCW91dGZvcm1hdD1GT1JNQVRfUEVNOworCWtleWZvcm1hdD1GT1JNQVRfUEVNOworCUNBZm9ybWF0PUZPUk1BVF9QRU07CisJQ0FrZXlmb3JtYXQ9Rk9STUFUX1BFTTsKKworCWN0eD1YNTA5X1NUT1JFX25ldygpOworCWlmIChjdHggPT0gTlVMTCkgZ290byBlbmQ7CisJWDUwOV9TVE9SRV9zZXRfdmVyaWZ5X2NiKGN0eCxjYWxsYik7CisKKwlhcmdjLS07CisJYXJndisrOworCW51bT0wOworCXdoaWxlIChhcmdjID49IDEpCisJCXsKKwkJaWYgCShzdHJjbXAoKmFyZ3YsIi1pbmZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5mb3JtYXQ9c3RyMmZtdCgqKCsrYXJndikpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vdXRmb3JtIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWtleWZvcm0iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJa2V5Zm9ybWF0PXN0cjJmbXQoKigrK2FyZ3YpKTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcmVxIikgPT0gMCkKKwkJCXsKKwkJCXJlcWZpbGU9MTsKKwkJCW5lZWRfcmFuZCA9IDE7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUNBZm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlDQWZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUNBa2V5Zm9ybSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlDQWtleWZvcm1hdD1zdHIyZm10KCooKythcmd2KSk7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWRheXMiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZGF5cz1hdG9pKCooKythcmd2KSk7CisJCQlpZiAoZGF5cyA9PSAwKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKFNURG91dCwiYmFkIG51bWJlciBvZiBkYXlzXG4iKTsKKwkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBhc3NpbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwYXNzYXJnaW49ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZXh0ZmlsZSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlleHRmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWV4dGVuc2lvbnMiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJZXh0c2VjdD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pbiIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpbmZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW91dGZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItc2lnbmtleSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlrZXlmaWxlPSAqKCsrYXJndik7CisJCQlzaWduX2ZsYWc9ICsrbnVtOworCQkJbmVlZF9yYW5kID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItQ0EiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJQ0FmaWxlPSAqKCsrYXJndik7CisJCQlDQV9mbGFnPSArK251bTsKKwkJCW5lZWRfcmFuZCA9IDE7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUNBa2V5IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCUNBa2V5ZmlsZT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1DQXNlcmlhbCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlDQXNlcmlhbD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zZXRfc2VyaWFsIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWlmICghKHNubyA9IHMyaV9BU04xX0lOVEVHRVIoTlVMTCwgKigrK2FyZ3YpKSkpCisJCQkJZ290byBiYWQ7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWFkZHRydXN0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWlmICghKG9ianRtcCA9IE9CSl90eHQyb2JqKCooKythcmd2KSwgMCkpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKGJpb19lcnIsCisJCQkJCSJJbnZhbGlkIHRydXN0IG9iamVjdCB2YWx1ZSAlc1xuIiwgKmFyZ3YpOworCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCWlmICghdHJ1c3QpIHRydXN0ID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKTsKKwkJCXNrX0FTTjFfT0JKRUNUX3B1c2godHJ1c3QsIG9ianRtcCk7CisJCQl0cnVzdG91dCA9IDE7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWFkZHJlamVjdCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpZiAoIShvYmp0bXAgPSBPQkpfdHh0Mm9iaigqKCsrYXJndiksIDApKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCQkiSW52YWxpZCByZWplY3Qgb2JqZWN0IHZhbHVlICVzXG4iLCAqYXJndik7CisJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJaWYgKCFyZWplY3QpIHJlamVjdCA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCk7CisJCQlza19BU04xX09CSkVDVF9wdXNoKHJlamVjdCwgb2JqdG1wKTsKKwkJCXRydXN0b3V0ID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItc2V0YWxpYXMiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJYWxpYXM9ICooKythcmd2KTsKKwkJCXRydXN0b3V0ID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY2VydG9wdCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlpZiAoIXNldF9jZXJ0X2V4KCZjZXJ0ZmxhZywgKigrK2FyZ3YpKSkgZ290byBiYWQ7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5hbWVvcHQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaWYgKCFzZXRfbmFtZV9leCgmbm1mbGFnLCAqKCsrYXJndikpKSBnb3RvIGJhZDsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZW5naW5lIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWVuZ2luZT0gKigrK2FyZ3YpOworCQkJfQorI2VuZGlmCisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLUMiKSA9PSAwKQorCQkJQz0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVtYWlsIikgPT0gMCkKKwkJCWVtYWlsPSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb2NzcF91cmkiKSA9PSAwKQorCQkJb2NzcF91cmk9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zZXJpYWwiKSA9PSAwKQorCQkJc2VyaWFsPSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItbmV4dF9zZXJpYWwiKSA9PSAwKQorCQkJbmV4dF9zZXJpYWw9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1tb2R1bHVzIikgPT0gMCkKKwkJCW1vZHVsdXM9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wdWJrZXkiKSA9PSAwKQorCQkJcHVia2V5PSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCIteDUwOXRvcmVxIikgPT0gMCkKKwkJCXg1MDlyZXE9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi10ZXh0IikgPT0gMCkKKwkJCXRleHQ9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1oYXNoIikgPT0gMAorCQkJfHwgc3RyY21wKCphcmd2LCItc3ViamVjdF9oYXNoIikgPT0gMCkKKwkJCXN1YmplY3RfaGFzaD0gKytudW07CisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXN1YmplY3RfaGFzaF9vbGQiKSA9PSAwKQorCQkJc3ViamVjdF9oYXNoX29sZD0gKytudW07CisjZW5kaWYKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItaXNzdWVyX2hhc2giKSA9PSAwKQorCQkJaXNzdWVyX2hhc2g9ICsrbnVtOworI2lmbmRlZiBPUEVOU1NMX05PX01ENQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pc3N1ZXJfaGFzaF9vbGQiKSA9PSAwKQorCQkJaXNzdWVyX2hhc2hfb2xkPSArK251bTsKKyNlbmRpZgorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zdWJqZWN0IikgPT0gMCkKKwkJCXN1YmplY3Q9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1pc3N1ZXIiKSA9PSAwKQorCQkJaXNzdWVyPSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItZmluZ2VycHJpbnQiKSA9PSAwKQorCQkJZmluZ2VycHJpbnQ9ICsrbnVtOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1kYXRlcyIpID09IDApCisJCQl7CisJCQlzdGFydGRhdGU9ICsrbnVtOworCQkJZW5kZGF0ZT0gKytudW07CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXB1cnBvc2UiKSA9PSAwKQorCQkJcHByaW50PSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItc3RhcnRkYXRlIikgPT0gMCkKKwkJCXN0YXJ0ZGF0ZT0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWVuZGRhdGUiKSA9PSAwKQorCQkJZW5kZGF0ZT0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNoZWNrZW5kIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWNoZWNrb2Zmc2V0PWF0b2koKigrK2FyZ3YpKTsKKwkJCWNoZWNrZW5kPTE7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW5vb3V0IikgPT0gMCkKKwkJCW5vb3V0PSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItdHJ1c3RvdXQiKSA9PSAwKQorCQkJdHJ1c3RvdXQ9IDE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWNscnRydXN0IikgPT0gMCkKKwkJCWNscnRydXN0PSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY2xycmVqZWN0IikgPT0gMCkKKwkJCWNscnJlamVjdD0gKytudW07CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWFsaWFzIikgPT0gMCkKKwkJCWFsaWFzb3V0PSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItQ0FjcmVhdGVzZXJpYWwiKSA9PSAwKQorCQkJQ0FfY3JlYXRlc2VyaWFsPSArK251bTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItY2xyZXh0IikgPT0gMCkKKwkJCWNscmV4dCA9IDE7CisjaWYgMSAvKiBzdGF5IGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggMC45LjU7IHRoaXMgc2hvdWxkIGdvIGF3YXkgc29vbiAqLworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jcmxleHQiKSA9PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJ1c2UgLWNscmV4dCBpbnN0ZWFkIG9mIC1jcmxleHRcbiIpOworCQkJY2xyZXh0ID0gMTsKKwkJCX0KKyNlbmRpZgorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1vY3NwaWQiKSA9PSAwKQorCQkJb2NzcGlkPSArK251bTsKKwkJZWxzZSBpZiAoKG1kX2FsZz1FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgqYXJndiArIDEpKSkKKwkJCXsKKwkJCS8qIG9rICovCisJCQlkaWdlc3Q9bWRfYWxnOworCQkJfQorCQllbHNlCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInVua25vd24gb3B0aW9uICVzXG4iLCphcmd2KTsKKwkJCWJhZG9wcz0xOworCQkJYnJlYWs7CisJCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQl9CisKKwlpZiAoYmFkb3BzKQorCQl7CitiYWQ6CisJCWZvciAocHA9eDUwOV91c2FnZTsgKCpwcCAhPSBOVUxMKTsgcHArKykKKwkJCUJJT19wcmludGYoYmlvX2VyciwiJXMiLCpwcCk7CisJCWdvdG8gZW5kOworCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyAgICAgICAgZSA9IHNldHVwX2VuZ2luZShiaW9fZXJyLCBlbmdpbmUsIDApOworI2VuZGlmCisKKwlpZiAobmVlZF9yYW5kKQorCQlhcHBfUkFORF9sb2FkX2ZpbGUoTlVMTCwgYmlvX2VyciwgMCk7CisKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCisJaWYgKCFhcHBfcGFzc3dkKGJpb19lcnIsIHBhc3NhcmdpbiwgTlVMTCwgJnBhc3NpbiwgTlVMTCkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAiRXJyb3IgZ2V0dGluZyBwYXNzd29yZFxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoIVg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoY3R4KSkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKChDQWtleWZpbGUgPT0gTlVMTCkgJiYgKENBX2ZsYWcpICYmIChDQWZvcm1hdCA9PSBGT1JNQVRfUEVNKSkKKwkJeyBDQWtleWZpbGU9Q0FmaWxlOyB9CisJZWxzZSBpZiAoKENBX2ZsYWcpICYmIChDQWtleWZpbGUgPT0gTlVMTCkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJuZWVkIHRvIHNwZWNpZnkgYSBDQWtleSBpZiB1c2luZyB0aGUgQ0EgY29tbWFuZFxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoZXh0ZmlsZSkKKwkJeworCQlsb25nIGVycm9ybGluZSA9IC0xOworCQlYNTA5VjNfQ1RYIGN0eDI7CisJCWV4dGNvbmYgPSBOQ09ORl9uZXcoTlVMTCk7CisJCWlmICghTkNPTkZfbG9hZChleHRjb25mLCBleHRmaWxlLCZlcnJvcmxpbmUpKQorCQkJeworCQkJaWYgKGVycm9ybGluZSA8PSAwKQorCQkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkJImVycm9yIGxvYWRpbmcgdGhlIGNvbmZpZyBmaWxlICclcydcbiIsCisJCQkJCQkJCWV4dGZpbGUpOworICAgICAgICAgICAgICAgIAllbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAJQklPX3ByaW50ZihiaW9fZXJyLAorCQkJCSAgICAgICAiZXJyb3Igb24gbGluZSAlbGQgb2YgY29uZmlnIGZpbGUgJyVzJ1xuIgorCQkJCQkJCSxlcnJvcmxpbmUsZXh0ZmlsZSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKCFleHRzZWN0KQorCQkJeworCQkJZXh0c2VjdCA9IE5DT05GX2dldF9zdHJpbmcoZXh0Y29uZiwgImRlZmF1bHQiLCAiZXh0ZW5zaW9ucyIpOworCQkJaWYgKCFleHRzZWN0KQorCQkJCXsKKwkJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCQlleHRzZWN0ID0gImRlZmF1bHQiOworCQkJCX0KKwkJCX0KKwkJWDUwOVYzX3NldF9jdHhfdGVzdCgmY3R4Mik7CisJCVg1MDlWM19zZXRfbmNvbmYoJmN0eDIsIGV4dGNvbmYpOworCQlpZiAoIVg1MDlWM19FWFRfYWRkX25jb25mKGV4dGNvbmYsICZjdHgyLCBleHRzZWN0LCBOVUxMKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwKKwkJCQkiRXJyb3IgTG9hZGluZyBleHRlbnNpb24gc2VjdGlvbiAlc1xuIiwKKwkJCQkJCQkJIGV4dHNlY3QpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKworCWlmIChyZXFmaWxlKQorCQl7CisJCUVWUF9QS0VZICpwa2V5OworCQlYNTA5X0NJTkYgKmNpOworCQlCSU8gKmluOworCisJCWlmICghc2lnbl9mbGFnICYmICFDQV9mbGFnKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJXZSBuZWVkIGEgcHJpdmF0ZSBrZXkgdG8gc2lnbiB3aXRoXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpbj1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJCWlmIChpbiA9PSBOVUxMKQorCQkJeworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCWlmIChpbmZpbGUgPT0gTlVMTCkKKwkJCUJJT19zZXRfZnAoaW4sc3RkaW4sQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOworCQllbHNlCisJCQl7CisJCQlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4saW5maWxlKSA8PSAwKQorCQkJCXsKKwkJCQlwZXJyb3IoaW5maWxlKTsKKwkJCQlCSU9fZnJlZShpbik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCQlyZXE9UEVNX3JlYWRfYmlvX1g1MDlfUkVRKGluLE5VTEwsTlVMTCxOVUxMKTsKKwkJQklPX2ZyZWUoaW4pOworCisJCWlmIChyZXEgPT0gTlVMTCkKKwkJCXsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQlpZiAoCShyZXEtPnJlcV9pbmZvID09IE5VTEwpIHx8CisJCQkocmVxLT5yZXFfaW5mby0+cHVia2V5ID09IE5VTEwpIHx8CisJCQkocmVxLT5yZXFfaW5mby0+cHVia2V5LT5wdWJsaWNfa2V5ID09IE5VTEwpIHx8CisJCQkocmVxLT5yZXFfaW5mby0+cHVia2V5LT5wdWJsaWNfa2V5LT5kYXRhID09IE5VTEwpKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJUaGUgY2VydGlmaWNhdGUgcmVxdWVzdCBhcHBlYXJzIHRvIGNvcnJ1cHRlZFxuIik7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkl0IGRvZXMgbm90IGNvbnRhaW4gYSBwdWJsaWMga2V5XG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoKHBrZXk9WDUwOV9SRVFfZ2V0X3B1YmtleShyZXEpKSA9PSBOVUxMKQorCSAgICAgICAgICAgICAgICB7CisJICAgICAgICAgICAgICAgIEJJT19wcmludGYoYmlvX2VyciwiZXJyb3IgdW5wYWNraW5nIHB1YmxpYyBrZXlcbiIpOworCSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKwkgICAgICAgICAgICAgICAgfQorCQlpPVg1MDlfUkVRX3ZlcmlmeShyZXEscGtleSk7CisJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCWlmIChpIDwgMCkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwiU2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBlcnJvclxuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJICAgICAgICBpZiAoaSA9PSAwKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCJTaWduYXR1cmUgZGlkIG5vdCBtYXRjaCB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdFxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJZWxzZQorCQkJQklPX3ByaW50ZihiaW9fZXJyLCJTaWduYXR1cmUgb2tcbiIpOworCisJCXByaW50X25hbWUoYmlvX2VyciwgInN1YmplY3Q9IiwgWDUwOV9SRVFfZ2V0X3N1YmplY3RfbmFtZShyZXEpLCBubWZsYWcpOworCisJCWlmICgoeD1YNTA5X25ldygpKSA9PSBOVUxMKSBnb3RvIGVuZDsKKwkJY2k9eC0+Y2VydF9pbmZvOworCisJCWlmIChzbm8gPT0gTlVMTCkKKwkJCXsKKwkJCXNubyA9IEFTTjFfSU5URUdFUl9uZXcoKTsKKwkJCWlmICghc25vIHx8ICFyYW5kX3NlcmlhbChOVUxMLCBzbm8pKQorCQkJCWdvdG8gZW5kOworCQkJaWYgKCFYNTA5X3NldF9zZXJpYWxOdW1iZXIoeCwgc25vKSkgCisJCQkJZ290byBlbmQ7CisJCQlBU04xX0lOVEVHRVJfZnJlZShzbm8pOworCQkJc25vID0gTlVMTDsKKwkJCX0KKwkJZWxzZSBpZiAoIVg1MDlfc2V0X3NlcmlhbE51bWJlcih4LCBzbm8pKSAKKwkJCWdvdG8gZW5kOworCisJCWlmICghWDUwOV9zZXRfaXNzdWVyX25hbWUoeCxyZXEtPnJlcV9pbmZvLT5zdWJqZWN0KSkgZ290byBlbmQ7CisJCWlmICghWDUwOV9zZXRfc3ViamVjdF9uYW1lKHgscmVxLT5yZXFfaW5mby0+c3ViamVjdCkpIGdvdG8gZW5kOworCisJCVg1MDlfZ210aW1lX2FkaihYNTA5X2dldF9ub3RCZWZvcmUoeCksMCk7CisJICAgICAgICBYNTA5X3RpbWVfYWRqX2V4KFg1MDlfZ2V0X25vdEFmdGVyKHgpLGRheXMsIDAsIE5VTEwpOworCisJCXBrZXkgPSBYNTA5X1JFUV9nZXRfcHVia2V5KHJlcSk7CisJCVg1MDlfc2V0X3B1YmtleSh4LHBrZXkpOworCQlFVlBfUEtFWV9mcmVlKHBrZXkpOworCQl9CisJZWxzZQorCQl4PWxvYWRfY2VydChiaW9fZXJyLGluZmlsZSxpbmZvcm1hdCxOVUxMLGUsIkNlcnRpZmljYXRlIik7CisKKwlpZiAoeCA9PSBOVUxMKSBnb3RvIGVuZDsKKwlpZiAoQ0FfZmxhZykKKwkJeworCQl4Y2E9bG9hZF9jZXJ0KGJpb19lcnIsQ0FmaWxlLENBZm9ybWF0LE5VTEwsZSwiQ0EgQ2VydGlmaWNhdGUiKTsKKwkJaWYgKHhjYSA9PSBOVUxMKSBnb3RvIGVuZDsKKwkJfQorCisJaWYgKCFub291dCB8fCB0ZXh0IHx8IG5leHRfc2VyaWFsKQorCQl7CisJCU9CSl9jcmVhdGUoIjIuOTk5OTkuMyIsCisJCQkiU0VULmV4MyIsIlNFVCB4NTA5djMgZXh0ZW5zaW9uIDMiKTsKKworCQlvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpOworCQlpZiAob3V0ID09IE5VTEwpCisJCQl7CisJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWlmIChvdXRmaWxlID09IE5VTEwpCisJCQl7CisJCQlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0UpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQkJeworCQkJQklPICp0bXBiaW8gPSBCSU9fbmV3KEJJT19mX2xpbmVidWZmZXIoKSk7CisJCQlvdXQgPSBCSU9fcHVzaCh0bXBiaW8sIG91dCk7CisJCQl9CisjZW5kaWYKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKEJJT193cml0ZV9maWxlbmFtZShvdXQsb3V0ZmlsZSkgPD0gMCkKKwkJCQl7CisJCQkJcGVycm9yKG91dGZpbGUpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCX0KKwkJfQorCisJaWYgKGFsaWFzKSBYNTA5X2FsaWFzX3NldDEoeCwgKHVuc2lnbmVkIGNoYXIgKilhbGlhcywgLTEpOworCisJaWYgKGNscnRydXN0KSBYNTA5X3RydXN0X2NsZWFyKHgpOworCWlmIChjbHJyZWplY3QpIFg1MDlfcmVqZWN0X2NsZWFyKHgpOworCisJaWYgKHRydXN0KQorCQl7CisJCWZvciAoaSA9IDA7IGkgPCBza19BU04xX09CSkVDVF9udW0odHJ1c3QpOyBpKyspCisJCQl7CisJCQlvYmp0bXAgPSBza19BU04xX09CSkVDVF92YWx1ZSh0cnVzdCwgaSk7CisJCQlYNTA5X2FkZDFfdHJ1c3Rfb2JqZWN0KHgsIG9ianRtcCk7CisJCQl9CisJCX0KKworCWlmIChyZWplY3QpCisJCXsKKwkJZm9yIChpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShyZWplY3QpOyBpKyspCisJCQl7CisJCQlvYmp0bXAgPSBza19BU04xX09CSkVDVF92YWx1ZShyZWplY3QsIGkpOworCQkJWDUwOV9hZGQxX3JlamVjdF9vYmplY3QoeCwgb2JqdG1wKTsKKwkJCX0KKwkJfQorCisJaWYgKG51bSkKKwkJeworCQlmb3IgKGk9MTsgaTw9bnVtOyBpKyspCisJCQl7CisJCQlpZiAoaXNzdWVyID09IGkpCisJCQkJeworCQkJCXByaW50X25hbWUoU1REb3V0LCAiaXNzdWVyPSAiLAorCQkJCQlYNTA5X2dldF9pc3N1ZXJfbmFtZSh4KSwgbm1mbGFnKTsKKwkJCQl9CisJCQllbHNlIGlmIChzdWJqZWN0ID09IGkpIAorCQkJCXsKKwkJCQlwcmludF9uYW1lKFNURG91dCwgInN1YmplY3Q9ICIsCisJCQkJCVg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSwgbm1mbGFnKTsKKwkJCQl9CisJCQllbHNlIGlmIChzZXJpYWwgPT0gaSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihTVERvdXQsInNlcmlhbD0iKTsKKwkJCQlpMmFfQVNOMV9JTlRFR0VSKFNURG91dCwKKwkJCQkJWDUwOV9nZXRfc2VyaWFsTnVtYmVyKHgpKTsKKwkJCQlCSU9fcHJpbnRmKFNURG91dCwiXG4iKTsKKwkJCQl9CisJCQllbHNlIGlmIChuZXh0X3NlcmlhbCA9PSBpKQorCQkJCXsKKwkJCQlCSUdOVU0gKmJuc2VyOworCQkJCUFTTjFfSU5URUdFUiAqc2VyOworCQkJCXNlciA9IFg1MDlfZ2V0X3NlcmlhbE51bWJlcih4KTsKKwkJCQlibnNlciA9IEFTTjFfSU5URUdFUl90b19CTihzZXIsIE5VTEwpOworCQkJCWlmICghYm5zZXIpCisJCQkJCWdvdG8gZW5kOworCQkJCWlmICghQk5fYWRkX3dvcmQoYm5zZXIsIDEpKQorCQkJCQlnb3RvIGVuZDsKKwkJCQlzZXIgPSBCTl90b19BU04xX0lOVEVHRVIoYm5zZXIsIE5VTEwpOworCQkJCWlmICghc2VyKQorCQkJCQlnb3RvIGVuZDsKKwkJCQlCTl9mcmVlKGJuc2VyKTsKKwkJCQlpMmFfQVNOMV9JTlRFR0VSKG91dCwgc2VyKTsKKwkJCQlBU04xX0lOVEVHRVJfZnJlZShzZXIpOworCQkJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCQkJfQorCQkJZWxzZSBpZiAoKGVtYWlsID09IGkpIHx8IChvY3NwX3VyaSA9PSBpKSkKKwkJCQl7CisJCQkJaW50IGo7CisJCQkJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICplbWxzdDsKKwkJCQlpZiAoZW1haWwgPT0gaSkKKwkJCQkJZW1sc3QgPSBYNTA5X2dldDFfZW1haWwoeCk7CisJCQkJZWxzZQorCQkJCQllbWxzdCA9IFg1MDlfZ2V0MV9vY3NwKHgpOworCQkJCWZvciAoaiA9IDA7IGogPCBza19PUEVOU1NMX1NUUklOR19udW0oZW1sc3QpOyBqKyspCisJCQkJCUJJT19wcmludGYoU1REb3V0LCAiJXNcbiIsCisJCQkJCQkgICBza19PUEVOU1NMX1NUUklOR192YWx1ZShlbWxzdCwgaikpOworCQkJCVg1MDlfZW1haWxfZnJlZShlbWxzdCk7CisJCQkJfQorCQkJZWxzZSBpZiAoYWxpYXNvdXQgPT0gaSkKKwkJCQl7CisJCQkJdW5zaWduZWQgY2hhciAqYWxzdHI7CisJCQkJYWxzdHIgPSBYNTA5X2FsaWFzX2dldDAoeCwgTlVMTCk7CisJCQkJaWYgKGFsc3RyKSBCSU9fcHJpbnRmKFNURG91dCwiJXNcbiIsIGFsc3RyKTsKKwkJCQllbHNlIEJJT19wdXRzKFNURG91dCwiPE5vIEFsaWFzPlxuIik7CisJCQkJfQorCQkJZWxzZSBpZiAoc3ViamVjdF9oYXNoID09IGkpCisJCQkJeworCQkJCUJJT19wcmludGYoU1REb3V0LCIlMDhseFxuIixYNTA5X3N1YmplY3RfbmFtZV9oYXNoKHgpKTsKKwkJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisJCQllbHNlIGlmIChzdWJqZWN0X2hhc2hfb2xkID09IGkpCisJCQkJeworCQkJCUJJT19wcmludGYoU1REb3V0LCIlMDhseFxuIixYNTA5X3N1YmplY3RfbmFtZV9oYXNoX29sZCh4KSk7CisJCQkJfQorI2VuZGlmCisJCQllbHNlIGlmIChpc3N1ZXJfaGFzaCA9PSBpKQorCQkJCXsKKwkJCQlCSU9fcHJpbnRmKFNURG91dCwiJTA4bHhcbiIsWDUwOV9pc3N1ZXJfbmFtZV9oYXNoKHgpKTsKKwkJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisJCQllbHNlIGlmIChpc3N1ZXJfaGFzaF9vbGQgPT0gaSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihTVERvdXQsIiUwOGx4XG4iLFg1MDlfaXNzdWVyX25hbWVfaGFzaF9vbGQoeCkpOworCQkJCX0KKyNlbmRpZgorCQkJZWxzZSBpZiAocHByaW50ID09IGkpCisJCQkJeworCQkJCVg1MDlfUFVSUE9TRSAqcHRtcDsKKwkJCQlpbnQgajsKKwkJCQlCSU9fcHJpbnRmKFNURG91dCwgIkNlcnRpZmljYXRlIHB1cnBvc2VzOlxuIik7CisJCQkJZm9yIChqID0gMDsgaiA8IFg1MDlfUFVSUE9TRV9nZXRfY291bnQoKTsgaisrKQorCQkJCQl7CisJCQkJCXB0bXAgPSBYNTA5X1BVUlBPU0VfZ2V0MChqKTsKKwkJCQkJcHVycG9zZV9wcmludChTVERvdXQsIHgsIHB0bXApOworCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCWlmIChtb2R1bHVzID09IGkpCisJCQkJeworCQkJCUVWUF9QS0VZICpwa2V5OworCisJCQkJcGtleT1YNTA5X2dldF9wdWJrZXkoeCk7CisJCQkJaWYgKHBrZXkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJpb19lcnIsIk1vZHVsdXM9dW5hdmFpbGFibGVcbiIpOworCQkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCUJJT19wcmludGYoU1REb3V0LCJNb2R1bHVzPSIpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQkJCWlmIChwa2V5LT50eXBlID09IEVWUF9QS0VZX1JTQSkKKwkJCQkJQk5fcHJpbnQoU1REb3V0LHBrZXktPnBrZXkucnNhLT5uKTsKKwkJCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkJCQlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9EU0EpCisJCQkJCUJOX3ByaW50KFNURG91dCxwa2V5LT5wa2V5LmRzYS0+cHViX2tleSk7CisJCQkJZWxzZQorI2VuZGlmCisJCQkJCUJJT19wcmludGYoU1REb3V0LCJXcm9uZyBBbGdvcml0aG0gdHlwZSIpOworCQkJCUJJT19wcmludGYoU1REb3V0LCJcbiIpOworCQkJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCQkJfQorCQkJZWxzZQorCQkJCWlmIChwdWJrZXkgPT0gaSkKKwkJCQl7CisJCQkJRVZQX1BLRVkgKnBrZXk7CisKKwkJCQlwa2V5PVg1MDlfZ2V0X3B1YmtleSh4KTsKKwkJCQlpZiAocGtleSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2VyciwiRXJyb3IgZ2V0dGluZyBwdWJsaWMga2V5XG4iKTsKKwkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlQRU1fd3JpdGVfYmlvX1BVQktFWShTVERvdXQsIHBrZXkpOworCQkJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCQkJfQorCQkJZWxzZQorCQkJCWlmIChDID09IGkpCisJCQkJeworCQkJCXVuc2lnbmVkIGNoYXIgKmQ7CisJCQkJY2hhciAqbTsKKwkJCQlpbnQgeSx6OworCisJCQkJWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKHgpLAorCQkJCQlidWYsc2l6ZW9mIGJ1Zik7CisJCQkJQklPX3ByaW50ZihTVERvdXQsIi8qIHN1YmplY3Q6JXMgKi9cbiIsYnVmKTsKKwkJCQltPVg1MDlfTkFNRV9vbmVsaW5lKAorCQkJCQlYNTA5X2dldF9pc3N1ZXJfbmFtZSh4KSxidWYsCisJCQkJCXNpemVvZiBidWYpOworCQkJCUJJT19wcmludGYoU1REb3V0LCIvKiBpc3N1ZXIgOiVzICovXG4iLGJ1Zik7CisKKwkJCQl6PWkyZF9YNTA5KHgsTlVMTCk7CisJCQkJbT1PUEVOU1NMX21hbGxvYyh6KTsKKworCQkJCWQ9KHVuc2lnbmVkIGNoYXIgKiltOworCQkJCXo9aTJkX1g1MDlfTkFNRShYNTA5X2dldF9zdWJqZWN0X25hbWUoeCksJmQpOworCQkJCUJJT19wcmludGYoU1REb3V0LCJ1bnNpZ25lZCBjaGFyIFhYWF9zdWJqZWN0X25hbWVbJWRdPXtcbiIseik7CisJCQkJZD0odW5zaWduZWQgY2hhciAqKW07CisJCQkJZm9yICh5PTA7IHk8ejsgeSsrKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoU1REb3V0LCIweCUwMlgsIixkW3ldKTsKKwkJCQkJaWYgKCh5ICYgMHgwZikgPT0gMHgwZikgQklPX3ByaW50ZihTVERvdXQsIlxuIik7CisJCQkJCX0KKwkJCQlpZiAoeSUxNiAhPSAwKSBCSU9fcHJpbnRmKFNURG91dCwiXG4iKTsKKwkJCQlCSU9fcHJpbnRmKFNURG91dCwifTtcbiIpOworCisJCQkJej1pMmRfWDUwOV9QVUJLRVkoWDUwOV9nZXRfWDUwOV9QVUJLRVkoeCksJmQpOworCQkJCUJJT19wcmludGYoU1REb3V0LCJ1bnNpZ25lZCBjaGFyIFhYWF9wdWJsaWNfa2V5WyVkXT17XG4iLHopOworCQkJCWQ9KHVuc2lnbmVkIGNoYXIgKiltOworCQkJCWZvciAoeT0wOyB5PHo7IHkrKykKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKFNURG91dCwiMHglMDJYLCIsZFt5XSk7CisJCQkJCWlmICgoeSAmIDB4MGYpID09IDB4MGYpCisJCQkJCQlCSU9fcHJpbnRmKFNURG91dCwiXG4iKTsKKwkJCQkJfQorCQkJCWlmICh5JTE2ICE9IDApIEJJT19wcmludGYoU1REb3V0LCJcbiIpOworCQkJCUJJT19wcmludGYoU1REb3V0LCJ9O1xuIik7CisKKwkJCQl6PWkyZF9YNTA5KHgsJmQpOworCQkJCUJJT19wcmludGYoU1REb3V0LCJ1bnNpZ25lZCBjaGFyIFhYWF9jZXJ0aWZpY2F0ZVslZF09e1xuIix6KTsKKwkJCQlkPSh1bnNpZ25lZCBjaGFyICopbTsKKwkJCQlmb3IgKHk9MDsgeTx6OyB5KyspCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihTVERvdXQsIjB4JTAyWCwiLGRbeV0pOworCQkJCQlpZiAoKHkgJiAweDBmKSA9PSAweDBmKQorCQkJCQkJQklPX3ByaW50ZihTVERvdXQsIlxuIik7CisJCQkJCX0KKwkJCQlpZiAoeSUxNiAhPSAwKSBCSU9fcHJpbnRmKFNURG91dCwiXG4iKTsKKwkJCQlCSU9fcHJpbnRmKFNURG91dCwifTtcbiIpOworCisJCQkJT1BFTlNTTF9mcmVlKG0pOworCQkJCX0KKwkJCWVsc2UgaWYgKHRleHQgPT0gaSkKKwkJCQl7CisJCQkJWDUwOV9wcmludF9leChvdXQseCxubWZsYWcsIGNlcnRmbGFnKTsKKwkJCQl9CisJCQllbHNlIGlmIChzdGFydGRhdGUgPT0gaSkKKwkJCQl7CisJCQkJQklPX3B1dHMoU1REb3V0LCJub3RCZWZvcmU9Iik7CisJCQkJQVNOMV9USU1FX3ByaW50KFNURG91dCxYNTA5X2dldF9ub3RCZWZvcmUoeCkpOworCQkJCUJJT19wdXRzKFNURG91dCwiXG4iKTsKKwkJCQl9CisJCQllbHNlIGlmIChlbmRkYXRlID09IGkpCisJCQkJeworCQkJCUJJT19wdXRzKFNURG91dCwibm90QWZ0ZXI9Iik7CisJCQkJQVNOMV9USU1FX3ByaW50KFNURG91dCxYNTA5X2dldF9ub3RBZnRlcih4KSk7CisJCQkJQklPX3B1dHMoU1REb3V0LCJcbiIpOworCQkJCX0KKwkJCWVsc2UgaWYgKGZpbmdlcnByaW50ID09IGkpCisJCQkJeworCQkJCWludCBqOworCQkJCXVuc2lnbmVkIGludCBuOworCQkJCXVuc2lnbmVkIGNoYXIgbWRbRVZQX01BWF9NRF9TSVpFXTsKKwkJCQljb25zdCBFVlBfTUQgKmZkaWcgPSBkaWdlc3Q7CisKKwkJCQlpZiAoIWZkaWcpCisJCQkJCWZkaWcgPSBFVlBfc2hhMSgpOworCisJCQkJaWYgKCFYNTA5X2RpZ2VzdCh4LGZkaWcsbWQsJm4pKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2Vyciwib3V0IG9mIG1lbW9yeVxuIik7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJQklPX3ByaW50ZihTVERvdXQsIiVzIEZpbmdlcnByaW50PSIsCisJCQkJCQlPQkpfbmlkMnNuKEVWUF9NRF90eXBlKGZkaWcpKSk7CisJCQkJZm9yIChqPTA7IGo8KGludCluOyBqKyspCisJCQkJCXsKKwkJCQkJQklPX3ByaW50ZihTVERvdXQsIiUwMlglYyIsbWRbal0sCisJCQkJCQkoaisxID09IChpbnQpbikKKwkJCQkJCT8nXG4nOic6Jyk7CisJCQkJCX0KKwkJCQl9CisKKwkJCS8qIHNob3VsZCBiZSBpbiB0aGUgbGlicmFyeSAqLworCQkJZWxzZSBpZiAoKHNpZ25fZmxhZyA9PSBpKSAmJiAoeDUwOXJlcSA9PSAwKSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJHZXR0aW5nIFByaXZhdGUga2V5XG4iKTsKKwkJCQlpZiAoVXBrZXkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlVcGtleT1sb2FkX2tleShiaW9fZXJyLAorCQkJCQkJa2V5ZmlsZSwga2V5Zm9ybWF0LCAwLAorCQkJCQkJcGFzc2luLCBlLCAiUHJpdmF0ZSBrZXkiKTsKKwkJCQkJaWYgKFVwa2V5ID09IE5VTEwpIGdvdG8gZW5kOworCQkJCQl9CisKKwkJCQlhc3NlcnQobmVlZF9yYW5kKTsKKwkJCQlpZiAoIXNpZ24oeCxVcGtleSxkYXlzLGNscmV4dCxkaWdlc3QsCisJCQkJCQkgZXh0Y29uZiwgZXh0c2VjdCkpIGdvdG8gZW5kOworCQkJCX0KKwkJCWVsc2UgaWYgKENBX2ZsYWcgPT0gaSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJHZXR0aW5nIENBIFByaXZhdGUgS2V5XG4iKTsKKwkJCQlpZiAoQ0FrZXlmaWxlICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJQ0Fwa2V5PWxvYWRfa2V5KGJpb19lcnIsCisJCQkJCQlDQWtleWZpbGUsIENBa2V5Zm9ybWF0LAorCQkJCQkJMCwgcGFzc2luLCBlLAorCQkJCQkJIkNBIFByaXZhdGUgS2V5Iik7CisJCQkJCWlmIChDQXBrZXkgPT0gTlVMTCkgZ290byBlbmQ7CisJCQkJCX0KKwkJCQkKKwkJCQlhc3NlcnQobmVlZF9yYW5kKTsKKwkJCQlpZiAoIXg1MDlfY2VydGlmeShjdHgsQ0FmaWxlLGRpZ2VzdCx4LHhjYSwKKwkJCQkJQ0Fwa2V5LCBDQXNlcmlhbCxDQV9jcmVhdGVzZXJpYWwsZGF5cywgY2xyZXh0LAorCQkJCQlleHRjb25mLCBleHRzZWN0LCBzbm8pKQorCQkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQllbHNlIGlmICh4NTA5cmVxID09IGkpCisJCQkJeworCQkJCUVWUF9QS0VZICpwazsKKworCQkJCUJJT19wcmludGYoYmlvX2VyciwiR2V0dGluZyByZXF1ZXN0IFByaXZhdGUgS2V5XG4iKTsKKwkJCQlpZiAoa2V5ZmlsZSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCUJJT19wcmludGYoYmlvX2Vyciwibm8gcmVxdWVzdCBrZXkgZmlsZSBzcGVjaWZpZWRcbiIpOworCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlwaz1sb2FkX2tleShiaW9fZXJyLAorCQkJCQkJa2V5ZmlsZSwgRk9STUFUX1BFTSwgMCwKKwkJCQkJCXBhc3NpbiwgZSwgInJlcXVlc3Qga2V5Iik7CisJCQkJCWlmIChwayA9PSBOVUxMKSBnb3RvIGVuZDsKKwkJCQkJfQorCisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJHZW5lcmF0aW5nIGNlcnRpZmljYXRlIHJlcXVlc3RcbiIpOworCisJCQkJcnE9WDUwOV90b19YNTA5X1JFUSh4LHBrLGRpZ2VzdCk7CisJCQkJRVZQX1BLRVlfZnJlZShwayk7CisJCQkJaWYgKHJxID09IE5VTEwpCisJCQkJCXsKKwkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlpZiAoIW5vb3V0KQorCQkJCQl7CisJCQkJCVg1MDlfUkVRX3ByaW50KG91dCxycSk7CisJCQkJCVBFTV93cml0ZV9iaW9fWDUwOV9SRVEob3V0LHJxKTsKKwkJCQkJfQorCQkJCW5vb3V0PTE7CisJCQkJfQorCQkJZWxzZSBpZiAob2NzcGlkID09IGkpCisJCQkJeworCQkJCVg1MDlfb2NzcGlkX3ByaW50KG91dCwgeCk7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAoY2hlY2tlbmQpCisJCXsKKwkJdGltZV90IHRjaGVjaz10aW1lKE5VTEwpICsgY2hlY2tvZmZzZXQ7CisKKwkJaWYgKFg1MDlfY21wX3RpbWUoWDUwOV9nZXRfbm90QWZ0ZXIoeCksICZ0Y2hlY2spIDwgMCkKKwkJCXsKKwkJCUJJT19wcmludGYob3V0LCJDZXJ0aWZpY2F0ZSB3aWxsIGV4cGlyZVxuIik7CisJCQlyZXQ9MTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihvdXQsIkNlcnRpZmljYXRlIHdpbGwgbm90IGV4cGlyZVxuIik7CisJCQlyZXQ9MDsKKwkJCX0KKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChub291dCkKKwkJeworCQlyZXQ9MDsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIAkob3V0Zm9ybWF0ID09IEZPUk1BVF9BU04xKQorCQlpPWkyZF9YNTA5X2JpbyhvdXQseCk7CisJZWxzZSBpZiAob3V0Zm9ybWF0ID09IEZPUk1BVF9QRU0pCisJCXsKKwkJaWYgKHRydXN0b3V0KSBpPVBFTV93cml0ZV9iaW9fWDUwOV9BVVgob3V0LHgpOworCQllbHNlIGk9UEVNX3dyaXRlX2Jpb19YNTA5KG91dCx4KTsKKwkJfQorCWVsc2UgaWYgKG91dGZvcm1hdCA9PSBGT1JNQVRfTkVUU0NBUEUpCisJCXsKKwkJTkVUU0NBUEVfWDUwOSBueDsKKwkJQVNOMV9PQ1RFVF9TVFJJTkcgaGRyOworCisJCWhkci5kYXRhPSh1bnNpZ25lZCBjaGFyICopTkVUU0NBUEVfQ0VSVF9IRFI7CisJCWhkci5sZW5ndGg9c3RybGVuKE5FVFNDQVBFX0NFUlRfSERSKTsKKwkJbnguaGVhZGVyPSAmaGRyOworCQlueC5jZXJ0PXg7CisKKwkJaT1BU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihORVRTQ0FQRV9YNTA5KSxvdXQsJm54KTsKKwkJfQorCWVsc2UJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsImJhZCBvdXRwdXQgZm9ybWF0IHNwZWNpZmllZCBmb3Igb3V0ZmlsZVxuIik7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKCFpKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidW5hYmxlIHRvIHdyaXRlIGNlcnRpZmljYXRlXG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKwlyZXQ9MDsKK2VuZDoKKwlpZiAobmVlZF9yYW5kKQorCQlhcHBfUkFORF93cml0ZV9maWxlKE5VTEwsIGJpb19lcnIpOworCU9CSl9jbGVhbnVwKCk7CisJTkNPTkZfZnJlZShleHRjb25mKTsKKwlCSU9fZnJlZV9hbGwob3V0KTsKKwlCSU9fZnJlZV9hbGwoU1REb3V0KTsKKwlYNTA5X1NUT1JFX2ZyZWUoY3R4KTsKKwlYNTA5X1JFUV9mcmVlKHJlcSk7CisJWDUwOV9mcmVlKHgpOworCVg1MDlfZnJlZSh4Y2EpOworCUVWUF9QS0VZX2ZyZWUoVXBrZXkpOworCUVWUF9QS0VZX2ZyZWUoQ0Fwa2V5KTsKKwlYNTA5X1JFUV9mcmVlKHJxKTsKKwlBU04xX0lOVEVHRVJfZnJlZShzbm8pOworCXNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKHRydXN0LCBBU04xX09CSkVDVF9mcmVlKTsKKwlza19BU04xX09CSkVDVF9wb3BfZnJlZShyZWplY3QsIEFTTjFfT0JKRUNUX2ZyZWUpOworCWlmIChwYXNzaW4pIE9QRU5TU0xfZnJlZShwYXNzaW4pOworCWFwcHNfc2h1dGRvd24oKTsKKwlPUEVOU1NMX0VYSVQocmV0KTsKKwl9CisKK3N0YXRpYyBBU04xX0lOVEVHRVIgKng1MDlfbG9hZF9zZXJpYWwoY2hhciAqQ0FmaWxlLCBjaGFyICpzZXJpYWxmaWxlLCBpbnQgY3JlYXRlKQorCXsKKwljaGFyICpidWYgPSBOVUxMLCAqcDsKKwlBU04xX0lOVEVHRVIgKmJzID0gTlVMTDsKKwlCSUdOVU0gKnNlcmlhbCA9IE5VTEw7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9ICgoc2VyaWFsZmlsZSA9PSBOVUxMKQorCQk/KHN0cmxlbihDQWZpbGUpK3N0cmxlbihQT1NURklYKSsxKQorCQk6KHN0cmxlbihzZXJpYWxmaWxlKSkpKzE7CisJYnVmPU9QRU5TU0xfbWFsbG9jKGxlbik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7IEJJT19wcmludGYoYmlvX2Vyciwib3V0IG9mIG1lbVxuIik7IGdvdG8gZW5kOyB9CisJaWYgKHNlcmlhbGZpbGUgPT0gTlVMTCkKKwkJeworCQlCVUZfc3RybGNweShidWYsQ0FmaWxlLGxlbik7CisJCWZvciAocD1idWY7ICpwOyBwKyspCisJCQlpZiAoKnAgPT0gJy4nKQorCQkJCXsKKwkJCQkqcD0nXDAnOworCQkJCWJyZWFrOworCQkJCX0KKwkJQlVGX3N0cmxjYXQoYnVmLFBPU1RGSVgsbGVuKTsKKwkJfQorCWVsc2UKKwkJQlVGX3N0cmxjcHkoYnVmLHNlcmlhbGZpbGUsbGVuKTsKKworCXNlcmlhbCA9IGxvYWRfc2VyaWFsKGJ1ZiwgY3JlYXRlLCBOVUxMKTsKKwlpZiAoc2VyaWFsID09IE5VTEwpIGdvdG8gZW5kOworCisJaWYgKCFCTl9hZGRfd29yZChzZXJpYWwsMSkpCisJCXsgQklPX3ByaW50ZihiaW9fZXJyLCJhZGRfd29yZCBmYWlsdXJlXG4iKTsgZ290byBlbmQ7IH0KKworCWlmICghc2F2ZV9zZXJpYWwoYnVmLCBOVUxMLCBzZXJpYWwsICZicykpIGdvdG8gZW5kOworCisgZW5kOgorCWlmIChidWYpIE9QRU5TU0xfZnJlZShidWYpOworCUJOX2ZyZWUoc2VyaWFsKTsKKwlyZXR1cm4gYnM7CisJfQorCitzdGF0aWMgaW50IHg1MDlfY2VydGlmeShYNTA5X1NUT1JFICpjdHgsIGNoYXIgKkNBZmlsZSwgY29uc3QgRVZQX01EICpkaWdlc3QsCisJICAgICBYNTA5ICp4LCBYNTA5ICp4Y2EsIEVWUF9QS0VZICpwa2V5LCBjaGFyICpzZXJpYWxmaWxlLCBpbnQgY3JlYXRlLAorCSAgICAgaW50IGRheXMsIGludCBjbHJleHQsIENPTkYgKmNvbmYsIGNoYXIgKnNlY3Rpb24sIEFTTjFfSU5URUdFUiAqc25vKQorCXsKKwlpbnQgcmV0PTA7CisJQVNOMV9JTlRFR0VSICpicz1OVUxMOworCVg1MDlfU1RPUkVfQ1RYIHhzYzsKKwlFVlBfUEtFWSAqdXBrZXk7CisKKwl1cGtleSA9IFg1MDlfZ2V0X3B1YmtleSh4Y2EpOworCUVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyh1cGtleSxwa2V5KTsKKwlFVlBfUEtFWV9mcmVlKHVwa2V5KTsKKworCWlmKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZ4c2MsY3R4LHgsTlVMTCkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJFcnJvciBpbml0aWFsaXNpbmcgWDUwOSBzdG9yZVxuIik7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKHNubykgYnMgPSBzbm87CisJZWxzZSBpZiAoIShicyA9IHg1MDlfbG9hZF9zZXJpYWwoQ0FmaWxlLCBzZXJpYWxmaWxlLCBjcmVhdGUpKSkKKwkJZ290byBlbmQ7CisKKy8qCWlmICghWDUwOV9TVE9SRV9hZGRfY2VydChjdHgseCkpIGdvdG8gZW5kOyovCisKKwkvKiBOT1RFOiB0aGlzIGNlcnRpZmljYXRlIGNhbi9zaG91bGQgYmUgc2VsZiBzaWduZWQsIHVubGVzcyBpdCB3YXMKKwkgKiBhIGNlcnRpZmljYXRlIHJlcXVlc3QgaW4gd2hpY2ggY2FzZSBpdCBpcyBub3QuICovCisJWDUwOV9TVE9SRV9DVFhfc2V0X2NlcnQoJnhzYyx4KTsKKwlYNTA5X1NUT1JFX0NUWF9zZXRfZmxhZ3MoJnhzYywgWDUwOV9WX0ZMQUdfQ0hFQ0tfU1NfU0lHTkFUVVJFKTsKKwlpZiAoIXJlcWZpbGUgJiYgWDUwOV92ZXJpZnlfY2VydCgmeHNjKSA8PSAwKQorCQlnb3RvIGVuZDsKKworCWlmICghWDUwOV9jaGVja19wcml2YXRlX2tleSh4Y2EscGtleSkpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJDQSBjZXJ0aWZpY2F0ZSBhbmQgQ0EgcHJpdmF0ZSBrZXkgZG8gbm90IG1hdGNoXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmICghWDUwOV9zZXRfaXNzdWVyX25hbWUoeCxYNTA5X2dldF9zdWJqZWN0X25hbWUoeGNhKSkpIGdvdG8gZW5kOworCWlmICghWDUwOV9zZXRfc2VyaWFsTnVtYmVyKHgsYnMpKSBnb3RvIGVuZDsKKworCWlmIChYNTA5X2dtdGltZV9hZGooWDUwOV9nZXRfbm90QmVmb3JlKHgpLDBMKSA9PSBOVUxMKQorCQlnb3RvIGVuZDsKKworCS8qIGhhcmR3aXJlZCBleHBpcmVkICovCisJaWYgKFg1MDlfdGltZV9hZGpfZXgoWDUwOV9nZXRfbm90QWZ0ZXIoeCksZGF5cywgMCwgTlVMTCkgPT0gTlVMTCkKKwkJZ290byBlbmQ7CisKKwlpZiAoY2xyZXh0KQorCQl7CisJCXdoaWxlIChYNTA5X2dldF9leHRfY291bnQoeCkgPiAwKSBYNTA5X2RlbGV0ZV9leHQoeCwgMCk7CisJCX0KKworCWlmIChjb25mKQorCQl7CisJCVg1MDlWM19DVFggY3R4MjsKKwkJWDUwOV9zZXRfdmVyc2lvbih4LDIpOyAvKiB2ZXJzaW9uIDMgY2VydGlmaWNhdGUgKi8KKyAgICAgICAgICAgICAgICBYNTA5VjNfc2V0X2N0eCgmY3R4MiwgeGNhLCB4LCBOVUxMLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBYNTA5VjNfc2V0X25jb25mKCZjdHgyLCBjb25mKTsKKyAgICAgICAgICAgICAgICBpZiAoIVg1MDlWM19FWFRfYWRkX25jb25mKGNvbmYsICZjdHgyLCBzZWN0aW9uLCB4KSkgZ290byBlbmQ7CisJCX0KKworCWlmICghWDUwOV9zaWduKHgscGtleSxkaWdlc3QpKSBnb3RvIGVuZDsKKwlyZXQ9MTsKK2VuZDoKKwlYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZ4c2MpOworCWlmICghcmV0KQorCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCWlmICghc25vKSBBU04xX0lOVEVHRVJfZnJlZShicyk7CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgY2FsbGIoaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlpbnQgZXJyOworCVg1MDkgKmVycl9jZXJ0OworCisJLyogaXQgaXMgb2sgdG8gdXNlIGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUKKwkgKiBUaGlzIGNhc2Ugd2lsbCBjYXRjaCBib3RoIHRoZSBpbml0aWFsIG9rID09IDAgYW5kIHRoZQorCSAqIGZpbmFsIG9rID09IDEgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiAqLworCWVycj1YNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoY3R4KTsKKwlpZiAoZXJyID09IFg1MDlfVl9FUlJfREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUKQorCQlyZXR1cm4gMTsKKworCS8qIEJBRCB3ZSBzaG91bGQgaGF2ZSBnb3R0ZW4gYW4gZXJyb3IuICBOb3JtYWxseSBpZiBldmVyeXRoaW5nCisJICogd29ya2VkIFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcihjdHgpIHdpbGwgc3RpbGwgYmUgc2V0IHRvCisJICogREVQVEhfWkVST19TRUxGXy4uLi4gKi8KKwlpZiAob2spCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCJlcnJvciB3aXRoIGNlcnRpZmljYXRlIHRvIGJlIGNlcnRpZmllZCAtIHNob3VsZCBiZSBzZWxmIHNpZ25lZFxuIik7CisJCXJldHVybiAwOworCQl9CisJZWxzZQorCQl7CisJCWVycl9jZXJ0PVg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoY3R4KTsKKwkJcHJpbnRfbmFtZShiaW9fZXJyLCBOVUxMLCBYNTA5X2dldF9zdWJqZWN0X25hbWUoZXJyX2NlcnQpLDApOworCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHdpdGggY2VydGlmaWNhdGUgLSBlcnJvciAlZCBhdCBkZXB0aCAlZFxuJXNcbiIsCisJCQllcnIsWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKGN0eCksCisJCQlYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpKTsKKwkJcmV0dXJuIDE7CisJCX0KKwl9CisKKy8qIHNlbGYgc2lnbiAqLworc3RhdGljIGludCBzaWduKFg1MDkgKngsIEVWUF9QS0VZICpwa2V5LCBpbnQgZGF5cywgaW50IGNscmV4dCwgY29uc3QgRVZQX01EICpkaWdlc3QsIAorCQkJCQkJQ09ORiAqY29uZiwgY2hhciAqc2VjdGlvbikKKwl7CisKKwlFVlBfUEtFWSAqcGt0bXA7CisKKwlwa3RtcCA9IFg1MDlfZ2V0X3B1YmtleSh4KTsKKwlFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMocGt0bXAscGtleSk7CisJRVZQX1BLRVlfc2F2ZV9wYXJhbWV0ZXJzKHBrdG1wLDEpOworCUVWUF9QS0VZX2ZyZWUocGt0bXApOworCisJaWYgKCFYNTA5X3NldF9pc3N1ZXJfbmFtZSh4LFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSkpIGdvdG8gZXJyOworCWlmIChYNTA5X2dtdGltZV9hZGooWDUwOV9nZXRfbm90QmVmb3JlKHgpLDApID09IE5VTEwpIGdvdG8gZXJyOworCisJLyogTGV0cyBqdXN0IG1ha2UgaXQgMTI6MDBhbSBHTVQsIEphbiAxIDE5NzAgKi8KKwkvKiBtZW1jcHkoeC0+Y2VydF9pbmZvLT52YWxpZGl0eS0+bm90QmVmb3JlLCI3MDAxMDExMjAwMDBaIiwxMyk7ICovCisJLyogMjggZGF5cyB0byBiZSBjZXJ0aWZpZWQgKi8KKworCWlmIChYNTA5X2dtdGltZV9hZGooWDUwOV9nZXRfbm90QWZ0ZXIoeCksKGxvbmcpNjAqNjAqMjQqZGF5cykgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpZiAoIVg1MDlfc2V0X3B1YmtleSh4LHBrZXkpKSBnb3RvIGVycjsKKwlpZiAoY2xyZXh0KQorCQl7CisJCXdoaWxlIChYNTA5X2dldF9leHRfY291bnQoeCkgPiAwKSBYNTA5X2RlbGV0ZV9leHQoeCwgMCk7CisJCX0KKwlpZiAoY29uZikKKwkJeworCQlYNTA5VjNfQ1RYIGN0eDsKKwkJWDUwOV9zZXRfdmVyc2lvbih4LDIpOyAvKiB2ZXJzaW9uIDMgY2VydGlmaWNhdGUgKi8KKyAgICAgICAgICAgICAgICBYNTA5VjNfc2V0X2N0eCgmY3R4LCB4LCB4LCBOVUxMLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICBYNTA5VjNfc2V0X25jb25mKCZjdHgsIGNvbmYpOworICAgICAgICAgICAgICAgIGlmICghWDUwOVYzX0VYVF9hZGRfbmNvbmYoY29uZiwgJmN0eCwgc2VjdGlvbiwgeCkpIGdvdG8gZXJyOworCQl9CisJaWYgKCFYNTA5X3NpZ24oeCxwa2V5LGRpZ2VzdCkpIGdvdG8gZXJyOworCXJldHVybiAxOworZXJyOgorCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IHB1cnBvc2VfcHJpbnQoQklPICpiaW8sIFg1MDkgKmNlcnQsIFg1MDlfUFVSUE9TRSAqcHQpCit7CisJaW50IGlkLCBpLCBpZHJldDsKKwljaGFyICpwbmFtZTsKKwlpZCA9IFg1MDlfUFVSUE9TRV9nZXRfaWQocHQpOworCXBuYW1lID0gWDUwOV9QVVJQT1NFX2dldDBfbmFtZShwdCk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJeworCQlpZHJldCA9IFg1MDlfY2hlY2tfcHVycG9zZShjZXJ0LCBpZCwgaSk7CisJCUJJT19wcmludGYoYmlvLCAiJXMlcyA6ICIsIHBuYW1lLCBpID8gIiBDQSIgOiAiIik7IAorCQlpZiAoaWRyZXQgPT0gMSkgQklPX3ByaW50ZihiaW8sICJZZXNcbiIpOworCQllbHNlIGlmIChpZHJldCA9PSAwKSBCSU9fcHJpbnRmKGJpbywgIk5vXG4iKTsKKwkJZWxzZSBCSU9fcHJpbnRmKGJpbywgIlllcyAoV0FSTklORyBjb2RlPSVkKVxuIiwgaWRyZXQpOworCQl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vQW5kcm9pZC5tayBiL2xpYi9vcGVuc3NsL2NyeXB0by9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTM3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vQW5kcm9pZC5tawpAQCAtMCwwICsxLDUzOCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2FybV9jZmxhZ3MgOj0gLURPUEVOU1NMX0JOX0FTTV9NT05UIC1EQUVTX0FTTSAtRFNIQTFfQVNNIC1EU0hBMjU2X0FTTSAtRFNIQTUxMl9BU00KK2FybV9zcmNfZmlsZXMgOj0gXAorICAgIGFlcy9hc20vYWVzLWFybXY0LnMgXAorICAgIGJuL2FzbS9hcm12NC1tb250LnMgXAorICAgIHNoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5zIFwKKyAgICBzaGEvYXNtL3NoYTI1Ni1hcm12NC5zIFwKKyAgICBzaGEvYXNtL3NoYTUxMi1hcm12NC5zCitub25fYXJtX3NyY19maWxlcyA6PSBhZXMvYWVzX2NvcmUuYworCitsb2NhbF9zcmNfZmlsZXMgOj0gXAorCWNyeXB0bGliLmMgXAorCW1lbS5jIFwKKwltZW1fY2xyLmMgXAorCW1lbV9kYmcuYyBcCisJY3ZlcnNpb24uYyBcCisJZXhfZGF0YS5jIFwKKwljcHRfZXJyLmMgXAorCWViY2RpYy5jIFwKKwl1aWQuYyBcCisJb190aW1lLmMgXAorCW9fc3RyLmMgXAorCW9fZGlyLmMgXAorCWFlcy9hZXNfY2JjLmMgXAorCWFlcy9hZXNfY2ZiLmMgXAorCWFlcy9hZXNfY3RyLmMgXAorCWFlcy9hZXNfZWNiLmMgXAorCWFlcy9hZXNfbWlzYy5jIFwKKwlhZXMvYWVzX29mYi5jIFwKKwlhZXMvYWVzX3dyYXAuYyBcCisJYXNuMS9hX2JpdHN0ci5jIFwKKwlhc24xL2FfYm9vbC5jIFwKKwlhc24xL2FfYnl0ZXMuYyBcCisJYXNuMS9hX2QyaV9mcC5jIFwKKwlhc24xL2FfZGlnZXN0LmMgXAorCWFzbjEvYV9kdXAuYyBcCisJYXNuMS9hX2VudW0uYyBcCisJYXNuMS9hX2dlbnRtLmMgXAorCWFzbjEvYV9pMmRfZnAuYyBcCisJYXNuMS9hX2ludC5jIFwKKwlhc24xL2FfbWJzdHIuYyBcCisJYXNuMS9hX29iamVjdC5jIFwKKwlhc24xL2Ffb2N0ZXQuYyBcCisJYXNuMS9hX3ByaW50LmMgXAorCWFzbjEvYV9zZXQuYyBcCisJYXNuMS9hX3NpZ24uYyBcCisJYXNuMS9hX3N0cmV4LmMgXAorCWFzbjEvYV9zdHJuaWQuYyBcCisJYXNuMS9hX3RpbWUuYyBcCisJYXNuMS9hX3R5cGUuYyBcCisJYXNuMS9hX3V0Y3RtLmMgXAorCWFzbjEvYV91dGY4LmMgXAorCWFzbjEvYV92ZXJpZnkuYyBcCisJYXNuMS9hbWV0aF9saWIuYyBcCisJYXNuMS9hc24xX2Vyci5jIFwKKwlhc24xL2FzbjFfZ2VuLmMgXAorCWFzbjEvYXNuMV9saWIuYyBcCisJYXNuMS9hc24xX3Bhci5jIFwKKwlhc24xL2Fzbl9taW1lLmMgXAorCWFzbjEvYXNuX21vaWQuYyBcCisJYXNuMS9hc25fcGFjay5jIFwKKwlhc24xL2Jpb19hc24xLmMgXAorCWFzbjEvYmlvX25kZWYuYyBcCisJYXNuMS9kMmlfcHIuYyBcCisJYXNuMS9kMmlfcHUuYyBcCisJYXNuMS9ldnBfYXNuMS5jIFwKKwlhc24xL2ZfZW51bS5jIFwKKwlhc24xL2ZfaW50LmMgXAorCWFzbjEvZl9zdHJpbmcuYyBcCisJYXNuMS9pMmRfcHIuYyBcCisJYXNuMS9pMmRfcHUuYyBcCisJYXNuMS9uX3BrZXkuYyBcCisJYXNuMS9uc3NlcS5jIFwKKwlhc24xL3A1X3BiZS5jIFwKKwlhc24xL3A1X3BiZXYyLmMgXAorCWFzbjEvcDhfcGtleS5jIFwKKwlhc24xL3RfYml0c3QuYyBcCisJYXNuMS90X2NybC5jIFwKKwlhc24xL3RfcGtleS5jIFwKKwlhc24xL3RfcmVxLmMgXAorCWFzbjEvdF9zcGtpLmMgXAorCWFzbjEvdF94NTA5LmMgXAorCWFzbjEvdF94NTA5YS5jIFwKKwlhc24xL3Rhc25fZGVjLmMgXAorCWFzbjEvdGFzbl9lbmMuYyBcCisJYXNuMS90YXNuX2ZyZS5jIFwKKwlhc24xL3Rhc25fbmV3LmMgXAorCWFzbjEvdGFzbl9wcm4uYyBcCisJYXNuMS90YXNuX3R5cC5jIFwKKwlhc24xL3Rhc25fdXRsLmMgXAorCWFzbjEveF9hbGdvci5jIFwKKwlhc24xL3hfYXR0cmliLmMgXAorCWFzbjEveF9iaWdudW0uYyBcCisJYXNuMS94X2NybC5jIFwKKwlhc24xL3hfZXh0ZW4uYyBcCisJYXNuMS94X2luZm8uYyBcCisJYXNuMS94X2xvbmcuYyBcCisJYXNuMS94X25hbWUuYyBcCisJYXNuMS94X254NTA5LmMgXAorCWFzbjEveF9wa2V5LmMgXAorCWFzbjEveF9wdWJrZXkuYyBcCisJYXNuMS94X3JlcS5jIFwKKwlhc24xL3hfc2lnLmMgXAorCWFzbjEveF9zcGtpLmMgXAorCWFzbjEveF92YWwuYyBcCisJYXNuMS94X3g1MDkuYyBcCisJYXNuMS94X3g1MDlhLmMgXAorCWJmL2JmX2NmYjY0LmMgXAorCWJmL2JmX2VjYi5jIFwKKwliZi9iZl9lbmMuYyBcCisJYmYvYmZfb2ZiNjQuYyBcCisJYmYvYmZfc2tleS5jIFwKKwliaW8vYl9kdW1wLmMgXAorCWJpby9iX3ByaW50LmMgXAorCWJpby9iX3NvY2suYyBcCisJYmlvL2JmX2J1ZmYuYyBcCisJYmlvL2JmX25iaW8uYyBcCisJYmlvL2JmX251bGwuYyBcCisJYmlvL2Jpb19jYi5jIFwKKwliaW8vYmlvX2Vyci5jIFwKKwliaW8vYmlvX2xpYi5jIFwKKwliaW8vYnNzX2FjcHQuYyBcCisJYmlvL2Jzc19iaW8uYyBcCisJYmlvL2Jzc19jb25uLmMgXAorCWJpby9ic3NfZGdyYW0uYyBcCisJYmlvL2Jzc19mZC5jIFwKKwliaW8vYnNzX2ZpbGUuYyBcCisJYmlvL2Jzc19sb2cuYyBcCisJYmlvL2Jzc19tZW0uYyBcCisJYmlvL2Jzc19udWxsLmMgXAorCWJpby9ic3Nfc29jay5jIFwKKwlibi9ibl9hZGQuYyBcCisJYm4vYm5fYXNtLmMgXAorCWJuL2JuX2JsaW5kLmMgXAorCWJuL2JuX2N0eC5jIFwKKwlibi9ibl9kaXYuYyBcCisJYm4vYm5fZXJyLmMgXAorCWJuL2JuX2V4cC5jIFwKKwlibi9ibl9leHAyLmMgXAorCWJuL2JuX2djZC5jIFwKKwlibi9ibl9nZjJtLmMgXAorCWJuL2JuX2tyb24uYyBcCisJYm4vYm5fbGliLmMgXAorCWJuL2JuX21vZC5jIFwKKwlibi9ibl9tb250LmMgXAorCWJuL2JuX21waS5jIFwKKwlibi9ibl9tdWwuYyBcCisJYm4vYm5fbmlzdC5jIFwKKwlibi9ibl9wcmltZS5jIFwKKwlibi9ibl9wcmludC5jIFwKKwlibi9ibl9yYW5kLmMgXAorCWJuL2JuX3JlY3AuYyBcCisJYm4vYm5fc2hpZnQuYyBcCisJYm4vYm5fc3FyLmMgXAorCWJuL2JuX3NxcnQuYyBcCisJYm4vYm5fd29yZC5jIFwKKwlidWZmZXIvYnVmX2Vyci5jIFwKKwlidWZmZXIvYnVmZmVyLmMgXAorCWNvbXAvY19ybGUuYyBcCisJY29tcC9jX3psaWIuYyBcCisJY29tcC9jb21wX2Vyci5jIFwKKwljb21wL2NvbXBfbGliLmMgXAorCWNvbmYvY29uZl9hcGkuYyBcCisJY29uZi9jb25mX2RlZi5jIFwKKwljb25mL2NvbmZfZXJyLmMgXAorCWNvbmYvY29uZl9saWIuYyBcCisJY29uZi9jb25mX21hbGwuYyBcCisJY29uZi9jb25mX21vZC5jIFwKKwljb25mL2NvbmZfc2FwLmMgXAorCWRlcy9jYmNfY2tzbS5jIFwKKwlkZXMvY2JjX2VuYy5jIFwKKwlkZXMvY2ZiNjRlZGUuYyBcCisJZGVzL2NmYjY0ZW5jLmMgXAorCWRlcy9jZmJfZW5jLmMgXAorCWRlcy9kZXNfZW5jLmMgXAorCWRlcy9kZXNfb2xkLmMgXAorCWRlcy9kZXNfb2xkMi5jIFwKKwlkZXMvZWNiM19lbmMuYyBcCisJZGVzL2VjYl9lbmMuYyBcCisJZGVzL2VkZV9jYmNtX2VuYy5jIFwKKwlkZXMvZW5jX3JlYWQuYyBcCisJZGVzL2VuY193cml0LmMgXAorCWRlcy9mY3J5cHQuYyBcCisJZGVzL2ZjcnlwdF9iLmMgXAorCWRlcy9vZmI2NGVkZS5jIFwKKwlkZXMvb2ZiNjRlbmMuYyBcCisJZGVzL29mYl9lbmMuYyBcCisJZGVzL3BjYmNfZW5jLmMgXAorCWRlcy9xdWRfY2tzbS5jIFwKKwlkZXMvcmFuZF9rZXkuYyBcCisJZGVzL3JlYWQycHdkLmMgXAorCWRlcy9ycGNfZW5jLmMgXAorCWRlcy9zZXRfa2V5LmMgXAorCWRlcy9zdHIya2V5LmMgXAorCWRlcy94Y2JjX2VuYy5jIFwKKwlkaC9kaF9hbWV0aC5jIFwKKwlkaC9kaF9hc24xLmMgXAorCWRoL2RoX2NoZWNrLmMgXAorCWRoL2RoX2RlcHIuYyBcCisJZGgvZGhfZXJyLmMgXAorCWRoL2RoX2dlbi5jIFwKKwlkaC9kaF9rZXkuYyBcCisJZGgvZGhfbGliLmMgXAorCWRoL2RoX3BtZXRoLmMgXAorCWRzYS9kc2FfYW1ldGguYyBcCisJZHNhL2RzYV9hc24xLmMgXAorCWRzYS9kc2FfZGVwci5jIFwKKwlkc2EvZHNhX2Vyci5jIFwKKwlkc2EvZHNhX2dlbi5jIFwKKwlkc2EvZHNhX2tleS5jIFwKKwlkc2EvZHNhX2xpYi5jIFwKKwlkc2EvZHNhX29zc2wuYyBcCisJZHNhL2RzYV9wbWV0aC5jIFwKKwlkc2EvZHNhX3Bybi5jIFwKKwlkc2EvZHNhX3NpZ24uYyBcCisJZHNhL2RzYV92cmYuYyBcCisJZHNvL2Rzb19kbC5jIFwKKwlkc28vZHNvX2RsZmNuLmMgXAorCWRzby9kc29fZXJyLmMgXAorCWRzby9kc29fbGliLmMgXAorCWRzby9kc29fbnVsbC5jIFwKKwlkc28vZHNvX29wZW5zc2wuYyBcCisJZHNvL2Rzb192bXMuYyBcCisJZHNvL2Rzb193aW4zMi5jIFwKKwllYy9lYzJfbXVsdC5jIFwKKwllYy9lYzJfc21wbC5jIFwKKwllYy9lY19hbWV0aC5jIFwKKwllYy9lY19hc24xLmMgXAorCWVjL2VjX2NoZWNrLmMgXAorCWVjL2VjX2N1cnZlLmMgXAorCWVjL2VjX2N2dC5jIFwKKwllYy9lY19lcnIuYyBcCisJZWMvZWNfa2V5LmMgXAorCWVjL2VjX2xpYi5jIFwKKwllYy9lY19tdWx0LmMgXAorCWVjL2VjX3BtZXRoLmMgXAorCWVjL2VjX3ByaW50LmMgXAorCWVjL2Vja19wcm4uYyBcCisJZWMvZWNwX21vbnQuYyBcCisJZWMvZWNwX25pc3QuYyBcCisJZWMvZWNwX3NtcGwuYyBcCisJZWNkaC9lY2hfZXJyLmMgXAorCWVjZGgvZWNoX2tleS5jIFwKKwllY2RoL2VjaF9saWIuYyBcCisJZWNkaC9lY2hfb3NzbC5jIFwKKwllY2RzYS9lY3NfYXNuMS5jIFwKKwllY2RzYS9lY3NfZXJyLmMgXAorCWVjZHNhL2Vjc19saWIuYyBcCisJZWNkc2EvZWNzX29zc2wuYyBcCisJZWNkc2EvZWNzX3NpZ24uYyBcCisJZWNkc2EvZWNzX3ZyZi5jIFwKKwllcnIvZXJyLmMgXAorCWVyci9lcnJfYWxsLmMgXAorCWVyci9lcnJfcHJuLmMgXAorCWV2cC9iaW9fYjY0LmMgXAorCWV2cC9iaW9fZW5jLmMgXAorCWV2cC9iaW9fbWQuYyBcCisJZXZwL2Jpb19vay5jIFwKKwlldnAvY19hbGwuYyBcCisJZXZwL2NfYWxsYy5jIFwKKwlldnAvY19hbGxkLmMgXAorCWV2cC9kaWdlc3QuYyBcCisJZXZwL2VfYWVzLmMgXAorCWV2cC9lX2JmLmMgXAorCWV2cC9lX2Rlcy5jIFwKKwlldnAvZV9kZXMzLmMgXAorCWV2cC9lX251bGwuYyBcCisJZXZwL2Vfb2xkLmMgXAorCWV2cC9lX3JjMi5jIFwKKwlldnAvZV9yYzQuYyBcCisJZXZwL2VfcmM1LmMgXAorCWV2cC9lX3hjYmNfZC5jIFwKKwlldnAvZW5jb2RlLmMgXAorCWV2cC9ldnBfYWNuZi5jIFwKKwlldnAvZXZwX2VuYy5jIFwKKwlldnAvZXZwX2Vyci5jIFwKKwlldnAvZXZwX2tleS5jIFwKKwlldnAvZXZwX2xpYi5jIFwKKwlldnAvZXZwX3BiZS5jIFwKKwlldnAvZXZwX3BrZXkuYyBcCisJZXZwL21fZHNzLmMgXAorCWV2cC9tX2RzczEuYyBcCisJZXZwL21fZWNkc2EuYyBcCisJZXZwL21fbWQ0LmMgXAorCWV2cC9tX21kNS5jIFwKKwlldnAvbV9tZGMyLmMgXAorCWV2cC9tX251bGwuYyBcCisJZXZwL21fcmlwZW1kLmMgXAorCWV2cC9tX3NoYTEuYyBcCisJZXZwL21fc2lndmVyLmMgXAorCWV2cC9tX3dwLmMgXAorCWV2cC9uYW1lcy5jIFwKKwlldnAvcDVfY3JwdC5jIFwKKwlldnAvcDVfY3JwdDIuYyBcCisJZXZwL3BfZGVjLmMgXAorCWV2cC9wX2VuYy5jIFwKKwlldnAvcF9saWIuYyBcCisJZXZwL3Bfb3Blbi5jIFwKKwlldnAvcF9zZWFsLmMgXAorCWV2cC9wX3NpZ24uYyBcCisJZXZwL3BfdmVyaWZ5LmMgXAorCWV2cC9wbWV0aF9mbi5jIFwKKwlldnAvcG1ldGhfZ24uYyBcCisJZXZwL3BtZXRoX2xpYi5jIFwKKwlobWFjL2htX2FtZXRoLmMgXAorCWhtYWMvaG1fcG1ldGguYyBcCisJaG1hYy9obWFjLmMgXAorCWtyYjUva3JiNV9hc24uYyBcCisJbGhhc2gvbGhfc3RhdHMuYyBcCisJbGhhc2gvbGhhc2guYyBcCisJbWQ0L21kNF9kZ3N0LmMgXAorCW1kNC9tZDRfb25lLmMgXAorCW1kNS9tZDVfZGdzdC5jIFwKKwltZDUvbWQ1X29uZS5jIFwKKwltb2Rlcy9jYmMxMjguYyBcCisJbW9kZXMvY2ZiMTI4LmMgXAorCW1vZGVzL2N0cjEyOC5jIFwKKwltb2Rlcy9vZmIxMjguYyBcCisJb2JqZWN0cy9vX25hbWVzLmMgXAorCW9iamVjdHMvb2JqX2RhdC5jIFwKKwlvYmplY3RzL29ial9lcnIuYyBcCisJb2JqZWN0cy9vYmpfbGliLmMgXAorCW9iamVjdHMvb2JqX3hyZWYuYyBcCisJb2NzcC9vY3NwX2Fzbi5jIFwKKwlvY3NwL29jc3BfY2wuYyBcCisJb2NzcC9vY3NwX2Vyci5jIFwKKwlvY3NwL29jc3BfZXh0LmMgXAorCW9jc3Avb2NzcF9odC5jIFwKKwlvY3NwL29jc3BfbGliLmMgXAorCW9jc3Avb2NzcF9wcm4uYyBcCisJb2NzcC9vY3NwX3Nydi5jIFwKKwlvY3NwL29jc3BfdmZ5LmMgXAorCXBlbS9wZW1fYWxsLmMgXAorCXBlbS9wZW1fZXJyLmMgXAorCXBlbS9wZW1faW5mby5jIFwKKwlwZW0vcGVtX2xpYi5jIFwKKwlwZW0vcGVtX290aC5jIFwKKwlwZW0vcGVtX3BrOC5jIFwKKwlwZW0vcGVtX3BrZXkuYyBcCisJcGVtL3BlbV9zZWFsLmMgXAorCXBlbS9wZW1fc2lnbi5jIFwKKwlwZW0vcGVtX3g1MDkuYyBcCisJcGVtL3BlbV94YXV4LmMgXAorCXBlbS9wdmtmbXQuYyBcCisJcGtjczEyL3AxMl9hZGQuYyBcCisJcGtjczEyL3AxMl9hc24uYyBcCisJcGtjczEyL3AxMl9hdHRyLmMgXAorCXBrY3MxMi9wMTJfY3JwdC5jIFwKKwlwa2NzMTIvcDEyX2NydC5jIFwKKwlwa2NzMTIvcDEyX2RlY3IuYyBcCisJcGtjczEyL3AxMl9pbml0LmMgXAorCXBrY3MxMi9wMTJfa2V5LmMgXAorCXBrY3MxMi9wMTJfa2lzcy5jIFwKKwlwa2NzMTIvcDEyX211dGwuYyBcCisJcGtjczEyL3AxMl9ucGFzLmMgXAorCXBrY3MxMi9wMTJfcDhkLmMgXAorCXBrY3MxMi9wMTJfcDhlLmMgXAorCXBrY3MxMi9wMTJfdXRsLmMgXAorCXBrY3MxMi9wazEyZXJyLmMgXAorCXBrY3M3L3BrN19hc24xLmMgXAorCXBrY3M3L3BrN19hdHRyLmMgXAorCXBrY3M3L3BrN19kb2l0LmMgXAorCXBrY3M3L3BrN19saWIuYwlcCisJcGtjczcvcGs3X21pbWUuYyBcCisJcGtjczcvcGs3X3NtaW1lLmMgXAorCXBrY3M3L3BrY3M3ZXJyLmMgXAorCXJhbmQvbWRfcmFuZC5jIFwKKwlyYW5kL3JhbmRfZWdkLmMgXAorCXJhbmQvcmFuZF9lcnIuYyBcCisJcmFuZC9yYW5kX2xpYi5jIFwKKwlyYW5kL3JhbmRfdW5peC5jIFwKKwlyYW5kL3JhbmRmaWxlLmMgXAorCXJjMi9yYzJfY2JjLmMgXAorCXJjMi9yYzJfZWNiLmMgXAorCXJjMi9yYzJfc2tleS5jIFwKKwlyYzIvcmMyY2ZiNjQuYyBcCisJcmMyL3JjMm9mYjY0LmMgXAorCXJjNC9yYzRfZW5jLmMgXAorCXJjNC9yYzRfc2tleS5jIFwKKwlyaXBlbWQvcm1kX2Rnc3QuYyBcCisJcmlwZW1kL3JtZF9vbmUuYyBcCisJcnNhL3JzYV9hbWV0aC5jIFwKKwlyc2EvcnNhX2FzbjEuYyBcCisJcnNhL3JzYV9jaGsuYyBcCisJcnNhL3JzYV9lYXkuYyBcCisJcnNhL3JzYV9lcnIuYyBcCisJcnNhL3JzYV9nZW4uYyBcCisJcnNhL3JzYV9saWIuYyBcCisJcnNhL3JzYV9ub25lLmMgXAorCXJzYS9yc2FfbnVsbC5jIFwKKwlyc2EvcnNhX29hZXAuYyBcCisJcnNhL3JzYV9wazEuYyBcCisJcnNhL3JzYV9wbWV0aC5jIFwKKwlyc2EvcnNhX3Bybi5jIFwKKwlyc2EvcnNhX3Bzcy5jIFwKKwlyc2EvcnNhX3Nhb3MuYyBcCisJcnNhL3JzYV9zaWduLmMgXAorCXJzYS9yc2Ffc3NsLmMgXAorCXJzYS9yc2FfeDkzMS5jIFwKKwlzaGEvc2hhMV9vbmUuYyBcCisJc2hhL3NoYTFkZ3N0LmMgXAorCXNoYS9zaGEyNTYuYyBcCisJc2hhL3NoYTUxMi5jIFwKKwlzaGEvc2hhX2Rnc3QuYyBcCisJc3RhY2svc3RhY2suYyBcCisJdHMvdHNfZXJyLmMgXAorCXR4dF9kYi90eHRfZGIuYyBcCisJdWkvdWlfY29tcGF0LmMgXAorCXVpL3VpX2Vyci5jIFwKKwl1aS91aV9saWIuYyBcCisJdWkvdWlfb3BlbnNzbC5jIFwKKwl1aS91aV91dGlsLmMgXAorCXg1MDkvYnlfZGlyLmMgXAorCXg1MDkvYnlfZmlsZS5jIFwKKwl4NTA5L3g1MDlfYXR0LmMgXAorCXg1MDkveDUwOV9jbXAuYyBcCisJeDUwOS94NTA5X2QyLmMgXAorCXg1MDkveDUwOV9kZWYuYyBcCisJeDUwOS94NTA5X2Vyci5jIFwKKwl4NTA5L3g1MDlfZXh0LmMgXAorCXg1MDkveDUwOV9sdS5jIFwKKwl4NTA5L3g1MDlfb2JqLmMgXAorCXg1MDkveDUwOV9yMnguYyBcCisJeDUwOS94NTA5X3JlcS5jIFwKKwl4NTA5L3g1MDlfc2V0LmMgXAorCXg1MDkveDUwOV90cnMuYyBcCisJeDUwOS94NTA5X3R4dC5jIFwKKwl4NTA5L3g1MDlfdjMuYyBcCisJeDUwOS94NTA5X3ZmeS5jIFwKKwl4NTA5L3g1MDlfdnBtLmMgXAorCXg1MDkveDUwOWNzZXQuYyBcCisJeDUwOS94NTA5bmFtZS5jIFwKKwl4NTA5L3g1MDlyc2V0LmMgXAorCXg1MDkveDUwOXNwa2kuYyBcCisJeDUwOS94NTA5dHlwZS5jIFwKKwl4NTA5L3hfYWxsLmMgXAorCXg1MDl2My9wY3lfY2FjaGUuYyBcCisJeDUwOXYzL3BjeV9kYXRhLmMgXAorCXg1MDl2My9wY3lfbGliLmMgXAorCXg1MDl2My9wY3lfbWFwLmMgXAorCXg1MDl2My9wY3lfbm9kZS5jIFwKKwl4NTA5djMvcGN5X3RyZWUuYyBcCisJeDUwOXYzL3YzX2FrZXkuYyBcCisJeDUwOXYzL3YzX2FrZXlhLmMgXAorCXg1MDl2My92M19hbHQuYyBcCisJeDUwOXYzL3YzX2Jjb25zLmMgXAorCXg1MDl2My92M19iaXRzdC5jIFwKKwl4NTA5djMvdjNfY29uZi5jIFwKKwl4NTA5djMvdjNfY3BvbHMuYyBcCisJeDUwOXYzL3YzX2NybGQuYyBcCisJeDUwOXYzL3YzX2VudW0uYyBcCisJeDUwOXYzL3YzX2V4dGt1LmMgXAorCXg1MDl2My92M19nZW5uLmMgXAorCXg1MDl2My92M19pYTUuYyBcCisJeDUwOXYzL3YzX2luZm8uYyBcCisJeDUwOXYzL3YzX2ludC5jIFwKKwl4NTA5djMvdjNfbGliLmMgXAorCXg1MDl2My92M19uY29ucy5jIFwKKwl4NTA5djMvdjNfb2NzcC5jIFwKKwl4NTA5djMvdjNfcGNpLmMgXAorCXg1MDl2My92M19wY2lhLmMgXAorCXg1MDl2My92M19wY29ucy5jIFwKKwl4NTA5djMvdjNfcGt1LmMgXAorCXg1MDl2My92M19wbWFwcy5jIFwKKwl4NTA5djMvdjNfcHJuLmMgXAorCXg1MDl2My92M19wdXJwLmMgXAorCXg1MDl2My92M19za2V5LmMgXAorCXg1MDl2My92M19zeG5ldC5jIFwKKwl4NTA5djMvdjNfdXRsLmMgXAorCXg1MDl2My92M2Vyci5jCisKK2xvY2FsX2NfaW5jbHVkZXMgOj0gXAorCWV4dGVybmFsL29wZW5zc2wgXAorCWV4dGVybmFsL29wZW5zc2wvY3J5cHRvL2FzbjEgXAorCWV4dGVybmFsL29wZW5zc2wvY3J5cHRvL2V2cCBcCisJZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlIFwKKwlleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbCBcCisJZXh0ZXJuYWwvemxpYgorCitsb2NhbF9jX2ZsYWdzIDo9IC1ETk9fV0lORE9XU19CUkFJTkRFQVRICisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIHRhcmdldAoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYW5kcm9pZC1jb25maWcubWsKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKGxvY2FsX3NyY19maWxlcykKK0xPQ0FMX0NGTEFHUyArPSAkKGxvY2FsX2NfZmxhZ3MpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQobG9jYWxfY19pbmNsdWRlcykKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliegoraWZlcSAoJChUQVJHRVRfQVJDSCksYXJtKQorCUxPQ0FMX1NSQ19GSUxFUyArPSAkKGFybV9zcmNfZmlsZXMpCisJTE9DQUxfQ0ZMQUdTICs9ICQoYXJtX2NmbGFncykKK2Vsc2UKKwlMT0NBTF9TUkNfRklMRVMgKz0gJChub25fYXJtX3NyY19maWxlcykKK2VuZGlmCitpZmVxICgkKFRBUkdFVF9TSU1VTEFUT1IpLHRydWUpCisJIyBNYWtlIHZhbGdyaW5kIGhhcHB5LgorCUxPQ0FMX0NGTEFHUyArPSAtRFBVUklGWQorICAgIExPQ0FMX0xETElCUyArPSAtbGRsCitlbHNlCisJTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAorZW5kaWYKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEU6PSBsaWJjcnlwdG8KK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGhvc3Qgc2hhcmVkIGxpYnJhcnkKK2lmZXEgKCQoV0lUSF9IT1NUX0RBTFZJSyksdHJ1ZSkKKyAgICBpbmNsdWRlICQoQ0xFQVJfVkFSUykKKyAgICBpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYW5kcm9pZC1jb25maWcubWsKKyAgICBMT0NBTF9TUkNfRklMRVMgKz0gJChsb2NhbF9zcmNfZmlsZXMpCisgICAgTE9DQUxfQ0ZMQUdTICs9ICQobG9jYWxfY19mbGFncykgLURQVVJJRlkKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQobG9jYWxfY19pbmNsdWRlcykKKyAgICBMT0NBTF9TUkNfRklMRVMgKz0gJChub25fYXJtX3NyY19maWxlcykKKyAgICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnoKKyAgICBMT0NBTF9MRExJQlMgKz0gLWxkbAorICAgIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisgICAgTE9DQUxfTU9EVUxFOj0gbGliY3J5cHRvCisgICAgaW5jbHVkZSAkKEJVSUxEX0hPU1RfU0hBUkVEX0xJQlJBUlkpCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGhvc3Qgc3RhdGljIGxpYnJhcnksIHdoaWNoIGlzIHVzZWQgYnkgc29tZSBTREsgdG9vbHMuCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2FuZHJvaWQtY29uZmlnLm1rCitMT0NBTF9TUkNfRklMRVMgKz0gJChsb2NhbF9zcmNfZmlsZXMpCitMT0NBTF9DRkxBR1MgKz0gJChsb2NhbF9jX2ZsYWdzKSAtRFBVUklGWQorTE9DQUxfQ19JTkNMVURFUyArPSAkKGxvY2FsX2NfaW5jbHVkZXMpCitMT0NBTF9TUkNfRklMRVMgKz0gJChub25fYXJtX3NyY19maWxlcykKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliegorTE9DQUxfTERMSUJTICs9IC1sZGwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEU6PSBsaWJjcnlwdG9fc3RhdGljCitpbmNsdWRlICQoQlVJTERfSE9TVF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9MUGRpcl9ueWkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9MUGRpcl9ueWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzFhNTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL0xQZGlyX255aS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qICRMUDogTFBsaWIvc291cmNlL0xQZGlyX3dpbi5jLHYgMS4xIDIwMDQvMDYvMTQgMTA6MDc6NTYgX2N2c19sZXZpdHRlIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBSaWNoYXJkIExldml0dGUgPHJpY2hhcmRAbGV2aXR0ZS5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBMUERJUl9ICisjaW5jbHVkZSAiTFBkaXIuaCIKKyNlbmRpZgorCitzdHJ1Y3QgTFBfZGlyX2NvbnRleHRfc3QgeyB2b2lkICpkdW1teTsgfTsKK2NvbnN0IGNoYXIgKkxQX2ZpbmRfZmlsZShMUF9ESVJfQ1RYICoqY3R4LCBjb25zdCBjaGFyICpkaXJlY3RvcnkpCisJeworCWVycm5vID0gRUlOVkFMOworCXJldHVybiAwOworCX0KK2ludCBMUF9maW5kX2ZpbGVfZW5kKExQX0RJUl9DVFggKipjdHgpCisJeworCWVycm5vID0gRUlOVkFMOworCXJldHVybiAwOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9MUGRpcl91bml4LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vTFBkaXJfdW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMDRjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vTFBkaXJfdW5peC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiAkTFA6IExQbGliL3NvdXJjZS9MUGRpcl91bml4LmMsdiAxLjExIDIwMDQvMDkvMjMgMjI6MDc6MjIgX2N2c19sZXZpdHRlIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBSaWNoYXJkIExldml0dGUgPHJpY2hhcmRAbGV2aXR0ZS5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaWZuZGVmIExQRElSX0gKKyNpbmNsdWRlICJMUGRpci5oIgorI2VuZGlmCisKKy8qIFRoZSBQT1NJWGx5IG1hY3JvIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIGZpbGUgcGF0aAorICAgaXMgTkFNRV9NQVguICBIb3dldmVyLCBzb21lIG9wZXJhdGluZyBzeXN0ZW1zIHVzZSBQQVRIX01BWCBpbnN0ZWFkLgorICAgVGhlcmVmb3JlLCBpdCBzZWVtcyBuYXR1cmFsIHRvIGZpcnN0IGNoZWNrIGZvciBQQVRIX01BWCBhbmQgdXNlIHRoYXQsCisgICBhbmQgaWYgaXQgZG9lc24ndCBleGlzdCwgdXNlIE5BTUVfTUFYLiAqLworI2lmIGRlZmluZWQoUEFUSF9NQVgpCisjIGRlZmluZSBMUF9FTlRSWV9TSVpFIFBBVEhfTUFYCisjZWxpZiBkZWZpbmVkKE5BTUVfTUFYKQorIyBkZWZpbmUgTFBfRU5UUllfU0laRSBOQU1FX01BWAorI2VuZGlmCisKKy8qIE9mIGNvdXJzZSwgdGhlcmUncyB0aGUgcG9zc2liaWxpdHkgdGhhdCBuZWl0aGVyIFBBVEhfTUFYIG5vciBOQU1FX01BWAorICAgZXhpc3QuICBJdCdzIGFsc28gcG9zc2libGUgdGhhdCBOQU1FX01BWCBleGlzdHMgYnV0IGlzIGRlZmluZSB0byBhCisgICB2ZXJ5IHNtYWxsIHZhbHVlIChIUC1VWCBvZmZlcnMgMTQpLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGdvdCBhCisgICByZXN1bHQsIGFuZCBpZiBpdCBtZWV0cyBhIG1pbmltdW0gc3RhbmRhcmQsIGFuZCBjcmVhdGUgb3IgY2hhbmdlIGl0CisgICBpZiBub3QuICovCisjaWYgIWRlZmluZWQoTFBfRU5UUllfU0laRSkgfHwgTFBfRU5UUllfU0laRTwyNTUKKyMgdW5kZWYgTFBfRU5UUllfU0laRQorIyBkZWZpbmUgTFBfRU5UUllfU0laRSAyNTUKKyNlbmRpZgorCitzdHJ1Y3QgTFBfZGlyX2NvbnRleHRfc3QKK3sKKyAgRElSICpkaXI7CisgIGNoYXIgZW50cnlfbmFtZVtMUF9FTlRSWV9TSVpFKzFdOworfTsKKworY29uc3QgY2hhciAqTFBfZmluZF9maWxlKExQX0RJUl9DVFggKipjdHgsIGNvbnN0IGNoYXIgKmRpcmVjdG9yeSkKK3sKKyAgc3RydWN0IGRpcmVudCAqZGlyZW50cnkgPSBOVUxMOworCisgIGlmIChjdHggPT0gTlVMTCB8fCBkaXJlY3RvcnkgPT0gTlVMTCkKKyAgICB7CisgICAgICBlcnJubyA9IEVJTlZBTDsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICBlcnJubyA9IDA7CisgIGlmICgqY3R4ID09IE5VTEwpCisgICAgeworICAgICAgKmN0eCA9IChMUF9ESVJfQ1RYICopbWFsbG9jKHNpemVvZihMUF9ESVJfQ1RYKSk7CisgICAgICBpZiAoKmN0eCA9PSBOVUxMKQorCXsKKwkgIGVycm5vID0gRU5PTUVNOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgbWVtc2V0KCpjdHgsICdcMCcsIHNpemVvZihMUF9ESVJfQ1RYKSk7CisKKyAgICAgICgqY3R4KS0+ZGlyID0gb3BlbmRpcihkaXJlY3RvcnkpOworICAgICAgaWYgKCgqY3R4KS0+ZGlyID09IE5VTEwpCisJeworCSAgaW50IHNhdmVfZXJybm8gPSBlcnJubzsgLyogUHJvYmFibHkgbm90IG5lZWRlZCwgYnV0IEknbSBwYXJhbm9pZCAqLworCSAgZnJlZSgqY3R4KTsKKwkgICpjdHggPSBOVUxMOworCSAgZXJybm8gPSBzYXZlX2Vycm5vOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBkaXJlbnRyeSA9IHJlYWRkaXIoKCpjdHgpLT5kaXIpOworICBpZiAoZGlyZW50cnkgPT0gTlVMTCkKKyAgICB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgc3RybmNweSgoKmN0eCktPmVudHJ5X25hbWUsIGRpcmVudHJ5LT5kX25hbWUsIHNpemVvZigoKmN0eCktPmVudHJ5X25hbWUpIC0gMSk7CisgICgqY3R4KS0+ZW50cnlfbmFtZVtzaXplb2YoKCpjdHgpLT5lbnRyeV9uYW1lKSAtIDFdID0gJ1wwJzsKKyAgcmV0dXJuICgqY3R4KS0+ZW50cnlfbmFtZTsKK30KKworaW50IExQX2ZpbmRfZmlsZV9lbmQoTFBfRElSX0NUWCAqKmN0eCkKK3sKKyAgaWYgKGN0eCAhPSBOVUxMICYmICpjdHggIT0gTlVMTCkKKyAgICB7CisgICAgICBpbnQgcmV0ID0gY2xvc2VkaXIoKCpjdHgpLT5kaXIpOworCisgICAgICBmcmVlKCpjdHgpOworICAgICAgc3dpdGNoIChyZXQpCisJeworCWNhc2UgMDoKKwkgIHJldHVybiAxOworCWNhc2UgLTE6CisJICByZXR1cm4gMDsKKwlkZWZhdWx0OgorCSAgYnJlYWs7CisJfQorICAgIH0KKyAgZXJybm8gPSBFSU5WQUw7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL0xQZGlyX3Ztcy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL0xQZGlyX3Ztcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YjQyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vTFBkaXJfdm1zLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qICRMUDogTFBsaWIvc291cmNlL0xQZGlyX3Ztcy5jLHYgMS4yMCAyMDA0LzA4LzI2IDEzOjM2OjA1IF9jdnNfbGV2aXR0ZSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGRlc2NyaXAuaD4KKyNpbmNsdWRlIDxuYW1kZWYuaD4KKyNpbmNsdWRlIDxybXNkZWYuaD4KKyNpbmNsdWRlIDxsaWJmaWxkZWYuaD4KKyNpbmNsdWRlIDxsaWIkcm91dGluZXMuaD4KKyNpbmNsdWRlIDxzdHJkZWYuaD4KKyNpbmNsdWRlIDxzdHIkcm91dGluZXMuaD4KKyNpbmNsdWRlIDxzdHNkZWYuaD4KKyNpZm5kZWYgTFBESVJfSAorI2luY2x1ZGUgIkxQZGlyLmgiCisjZW5kaWYKKworLyogQmVjYXVzZSBzb21lIGNvbXBpbGVyIG9wdGlvbnMgaGlkZSB0aGlzIG1hY29yICovCisjaWZuZGVmIEVWTVNFUlIKKyNkZWZpbmUgRVZNU0VSUgkJNjU1MzUgIC8qIGVycm9yIGZvciBub24tdHJhbnNsYXRhYmxlIFZNUyBlcnJvcnMgKi8KKyNlbmRpZgorCitzdHJ1Y3QgTFBfZGlyX2NvbnRleHRfc3QKK3sKKyAgdW5zaWduZWQgbG9uZyBWTVNfY29udGV4dDsKKyNpZmRlZiBOQU1MJENfTUFYUlNTCisgIGNoYXIgZmlsZXNwZWNbTkFNTCRDX01BWFJTUysxXTsKKyAgY2hhciByZXN1bHRbTkFNTCRDX01BWFJTUysxXTsKKyNlbHNlCisgIGNoYXIgZmlsZXNwZWNbMjU2XTsKKyAgY2hhciByZXN1bHRbMjU2XTsKKyNlbmRpZgorICBzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfZCBmaWxlc3BlY19kc2M7CisgIHN0cnVjdCBkc2MkZGVzY3JpcHRvcl9kIHJlc3VsdF9kc2M7Cit9OworCitjb25zdCBjaGFyICpMUF9maW5kX2ZpbGUoTFBfRElSX0NUWCAqKmN0eCwgY29uc3QgY2hhciAqZGlyZWN0b3J5KQoreworICBpbnQgc3RhdHVzOworICBjaGFyICpwLCAqcjsKKyAgc2l6ZV90IGw7CisgIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworI2lmZGVmIE5BTUwkQ19NQVhSU1MKKyAgZmxhZ3MgfD0gTElCJE1fRklMX0xPTkdfTkFNRVM7CisjZW5kaWYKKworICBpZiAoY3R4ID09IE5VTEwgfHwgZGlyZWN0b3J5ID09IE5VTEwpCisgICAgeworICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZXJybm8gPSAwOworICBpZiAoKmN0eCA9PSBOVUxMKQorICAgIHsKKyAgICAgIHNpemVfdCBmaWxlc3BlY2xlbiA9IHN0cmxlbihkaXJlY3RvcnkpOworICAgICAgY2hhciAqZmlsZXNwZWMgPSBOVUxMOworCisgICAgICAvKiBNVVNUIGJlIGEgVk1TIGRpcmVjdG9yeSBzcGVjaWZpY2F0aW9uISAgTGV0J3MgZXN0aW1hdGUgaWYgaXQgaXMuICovCisgICAgICBpZiAoZGlyZWN0b3J5W2ZpbGVzcGVjbGVuLTFdICE9ICddJworCSAgJiYgZGlyZWN0b3J5W2ZpbGVzcGVjbGVuLTFdICE9ICc+JworCSAgJiYgZGlyZWN0b3J5W2ZpbGVzcGVjbGVuLTFdICE9ICc6JykKKwl7CisJICBlcnJubyA9IEVJTlZBTDsKKwkgIHJldHVybiAwOworCX0KKworICAgICAgZmlsZXNwZWNsZW4gKz0gNDsJCS8qICIqLio7IiAqLworCisgICAgICBpZiAoZmlsZXNwZWNsZW4gPgorI2lmZGVmIE5BTUwkQ19NQVhSU1MKKwkgIE5BTUwkQ19NQVhSU1MKKyNlbHNlCisJICAyNTUKKyNlbmRpZgorCSAgKQorCXsKKwkgIGVycm5vID0gRU5BTUVUT09MT05HOworCSAgcmV0dXJuIDA7CisJfQorCisgICAgICAqY3R4ID0gKExQX0RJUl9DVFggKiltYWxsb2Moc2l6ZW9mKExQX0RJUl9DVFgpKTsKKyAgICAgIGlmICgqY3R4ID09IE5VTEwpCisJeworCSAgZXJybm8gPSBFTk9NRU07CisJICByZXR1cm4gMDsKKwl9CisgICAgICBtZW1zZXQoKmN0eCwgJ1wwJywgc2l6ZW9mKExQX0RJUl9DVFgpKTsKKworICAgICAgc3RyY3B5KCgqY3R4KS0+ZmlsZXNwZWMsZGlyZWN0b3J5KTsKKyAgICAgIHN0cmNhdCgoKmN0eCktPmZpbGVzcGVjLCIqLio7Iik7CisgICAgICAoKmN0eCktPmZpbGVzcGVjX2RzYy5kc2Mkd19sZW5ndGggPSBmaWxlc3BlY2xlbjsKKyAgICAgICgqY3R4KS0+ZmlsZXNwZWNfZHNjLmRzYyRiX2R0eXBlID0gRFNDJEtfRFRZUEVfVDsKKyAgICAgICgqY3R4KS0+ZmlsZXNwZWNfZHNjLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfUzsKKyAgICAgICgqY3R4KS0+ZmlsZXNwZWNfZHNjLmRzYyRhX3BvaW50ZXIgPSAoKmN0eCktPmZpbGVzcGVjOworICAgICAgKCpjdHgpLT5yZXN1bHRfZHNjLmRzYyR3X2xlbmd0aCA9IDA7CisgICAgICAoKmN0eCktPnJlc3VsdF9kc2MuZHNjJGJfZHR5cGUgPSBEU0MkS19EVFlQRV9UOworICAgICAgKCpjdHgpLT5yZXN1bHRfZHNjLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfRDsKKyAgICAgICgqY3R4KS0+cmVzdWx0X2RzYy5kc2MkYV9wb2ludGVyID0gMDsKKyAgICB9CisKKyAgKCpjdHgpLT5yZXN1bHRfZHNjLmRzYyR3X2xlbmd0aCA9IDA7CisgICgqY3R4KS0+cmVzdWx0X2RzYy5kc2MkYl9kdHlwZSA9IERTQyRLX0RUWVBFX1Q7CisgICgqY3R4KS0+cmVzdWx0X2RzYy5kc2MkYl9jbGFzcyA9IERTQyRLX0NMQVNTX0Q7CisgICgqY3R4KS0+cmVzdWx0X2RzYy5kc2MkYV9wb2ludGVyID0gMDsKKworICBzdGF0dXMgPSBsaWIkZmluZF9maWxlKCYoKmN0eCktPmZpbGVzcGVjX2RzYywgJigqY3R4KS0+cmVzdWx0X2RzYywKKwkJCSAmKCpjdHgpLT5WTVNfY29udGV4dCwgMCwgMCwgMCwgJmZsYWdzKTsKKworICBpZiAoc3RhdHVzID09IFJNUyRfTk1GKQorICAgIHsKKyAgICAgIGVycm5vID0gMDsKKyAgICAgIHZheGMkZXJybm8gPSBzdGF0dXM7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgaWYoISRWTVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKyAgICB7CisgICAgICBlcnJubyA9IEVWTVNFUlI7CisgICAgICB2YXhjJGVycm5vID0gc3RhdHVzOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgIC8qIFF1aWNrLCBjaGVhcCBhbmQgZGlydHkgd2F5IHRvIGRpc2NhcmQgYW55IGRldmljZSBhbmQgZGlyZWN0b3J5LAorICAgICBzaW5jZSB3ZSBvbmx5IHdhbnQgZmlsZSBuYW1lcyAqLworICBsID0gKCpjdHgpLT5yZXN1bHRfZHNjLmRzYyR3X2xlbmd0aDsKKyAgcCA9ICgqY3R4KS0+cmVzdWx0X2RzYy5kc2MkYV9wb2ludGVyOworICByID0gcDsKKyAgZm9yICg7ICpwOyBwKyspCisgICAgeworICAgICAgaWYgKCpwID09ICdeJyAmJiBwWzFdICE9ICdcMCcpIC8qIFRha2UgY2FyZSBvZiBPRFMtNSBlc2NhcGVzICovCisJeworCSAgcCsrOworCX0KKyAgICAgIGVsc2UgaWYgKCpwID09ICc6JyB8fCAqcCA9PSAnPicgfHwgKnAgPT0gJ10nKQorCXsKKwkgIGwgLT0gcCArIDEgLSByOworCSAgciA9IHAgKyAxOworCX0KKyAgICAgIGVsc2UgaWYgKCpwID09ICc7JykKKwl7CisJICBsID0gcCAtIHI7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIHN0cm5jcHkoKCpjdHgpLT5yZXN1bHQsIHIsIGwpOworICAoKmN0eCktPnJlc3VsdFtsXSA9ICdcMCc7CisgIHN0ciRmcmVlMV9keCgmKCpjdHgpLT5yZXN1bHRfZHNjKTsKKworICByZXR1cm4gKCpjdHgpLT5yZXN1bHQ7Cit9CisKK2ludCBMUF9maW5kX2ZpbGVfZW5kKExQX0RJUl9DVFggKipjdHgpCit7CisgIGlmIChjdHggIT0gTlVMTCAmJiAqY3R4ICE9IE5VTEwpCisgICAgeworICAgICAgaW50IHN0YXR1cyA9IGxpYiRmaW5kX2ZpbGVfZW5kKCYoKmN0eCktPlZNU19jb250ZXh0KTsKKworICAgICAgZnJlZSgqY3R4KTsKKworICAgICAgaWYoISRWTVNfU1RBVFVTX1NVQ0NFU1Moc3RhdHVzKSkKKwl7CisJICBlcnJubyA9IEVWTVNFUlI7CisJICB2YXhjJGVycm5vID0gc3RhdHVzOworCSAgcmV0dXJuIDA7CisJfQorICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlcnJubyA9IEVJTlZBTDsKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9MUGRpcl93aW4uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9MUGRpcl93aW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJkYmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL0xQZGlyX3dpbi5jCkBAIC0wLDAgKzEsMTUzIEBACisvKiAkTFA6IExQbGliL3NvdXJjZS9MUGRpcl93aW4uYyx2IDEuMTAgMjAwNC8wOC8yNiAxMzozNjowNSBfY3ZzX2xldml0dGUgRXhwICQgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIFJpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2lmbmRlZiBMUERJUl9ICisjaW5jbHVkZSAiTFBkaXIuaCIKKyNlbmRpZgorCisvKiBXZSdyZSBtb3N0IGxpa2VseSBvdmVyY2F1dGlvdXMgaGVyZSwgYnV0IGxldCdzIHJlc2VydmUgZm9yCisgICAgYnJva2VuIFdpbkNFIGhlYWRlcnMgYW5kIGV4cGxpY2l0bHkgb3B0IGZvciBVTklDT0RFIGNhbGwuCisgICAgS2VlcCBpbiBtaW5kIHRoYXQgb3VyIFdpbkNFIGJ1aWxkcyBhcmUgY29tcGlsZWQgd2l0aCAtRFVOSUNPREUKKyAgICBbYXMgd2VsbCBhcyAtRF9VTklDT0RFXS4gKi8KKyNpZiBkZWZpbmVkKExQX1NZU19XSU5DRSkgJiYgIWRlZmluZWQoRmluZEZpcnN0RmlsZSkKKyMgZGVmaW5lIEZpbmRGaXJzdEZpbGUgRmluZEZpcnN0RmlsZVcKKyNlbmRpZgorI2lmIGRlZmluZWQoTFBfU1lTX1dJTkNFKSAmJiAhZGVmaW5lZChGaW5kRmlyc3RGaWxlKQorIyBkZWZpbmUgRmluZE5leHRGaWxlIEZpbmROZXh0RmlsZVcKKyNlbmRpZgorCisjaWZuZGVmIE5BTUVfTUFYCisjZGVmaW5lIE5BTUVfTUFYIDI1NQorI2VuZGlmCisKK3N0cnVjdCBMUF9kaXJfY29udGV4dF9zdAoreworICBXSU4zMl9GSU5EX0RBVEEgY3R4OworICBIQU5ETEUgaGFuZGxlOworICBjaGFyIGVudHJ5X25hbWVbTkFNRV9NQVgrMV07Cit9OworCitjb25zdCBjaGFyICpMUF9maW5kX2ZpbGUoTFBfRElSX0NUWCAqKmN0eCwgY29uc3QgY2hhciAqZGlyZWN0b3J5KQoreworICBpZiAoY3R4ID09IE5VTEwgfHwgZGlyZWN0b3J5ID09IE5VTEwpCisgICAgeworICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgZXJybm8gPSAwOworICBpZiAoKmN0eCA9PSBOVUxMKQorICAgIHsKKyAgICAgICpjdHggPSAoTFBfRElSX0NUWCAqKW1hbGxvYyhzaXplb2YoTFBfRElSX0NUWCkpOworICAgICAgaWYgKCpjdHggPT0gTlVMTCkKKwl7CisJICBlcnJubyA9IEVOT01FTTsKKwkgIHJldHVybiAwOworCX0KKyAgICAgIG1lbXNldCgqY3R4LCAnXDAnLCBzaXplb2YoTFBfRElSX0NUWCkpOworCisgICAgICBpZiAoc2l6ZW9mKFRDSEFSKSAhPSBzaXplb2YoY2hhcikpCisJeworCSAgVENIQVIgKndkaXIgPSBOVUxMOworCSAgLyogbGVuXzAgZGVub3RlcyBzdHJpbmcgbGVuZ3RoICp3aXRoKiB0cmFpbGluZyAwICovIAorCSAgc2l6ZV90IGluZGV4ID0gMCxsZW5fMCA9IHN0cmxlbihkaXJlY3RvcnkpICsgMTsKKworCSAgd2RpciA9IChUQ0hBUiAqKW1hbGxvYyhsZW5fMCAqIHNpemVvZihUQ0hBUikpOworCSAgaWYgKHdkaXIgPT0gTlVMTCkKKwkgICAgeworCSAgICAgIGZyZWUoKmN0eCk7CisJICAgICAgKmN0eCA9IE5VTEw7CisJICAgICAgZXJybm8gPSBFTk9NRU07CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKworI2lmZGVmIExQX01VTFRJQllURV9BVkFJTEFCTEUKKwkgIGlmICghTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGRpcmVjdG9yeSwgbGVuXzAsIChXQ0hBUiAqKXdkaXIsIGxlbl8wKSkKKyNlbmRpZgorCSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsZW5fMDsgaW5kZXgrKykKKwkgICAgICB3ZGlyW2luZGV4XSA9IChUQ0hBUilkaXJlY3RvcnlbaW5kZXhdOworCisJICAoKmN0eCktPmhhbmRsZSA9IEZpbmRGaXJzdEZpbGUod2RpciwgJigqY3R4KS0+Y3R4KTsKKworCSAgZnJlZSh3ZGlyKTsKKwl9CisgICAgICBlbHNlCisJKCpjdHgpLT5oYW5kbGUgPSBGaW5kRmlyc3RGaWxlKChUQ0hBUiAqKWRpcmVjdG9yeSwgJigqY3R4KS0+Y3R4KTsKKworICAgICAgaWYgKCgqY3R4KS0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQorCXsKKwkgIGZyZWUoKmN0eCk7CisJICAqY3R4ID0gTlVMTDsKKwkgIGVycm5vID0gRUlOVkFMOworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGlmIChGaW5kTmV4dEZpbGUoKCpjdHgpLT5oYW5kbGUsICYoKmN0eCktPmN0eCkgPT0gRkFMU0UpCisJeworCSAgcmV0dXJuIDA7CisJfQorICAgIH0KKworICBpZiAoc2l6ZW9mKFRDSEFSKSAhPSBzaXplb2YoY2hhcikpCisgICAgeworICAgICAgVENIQVIgKndkaXIgPSAoKmN0eCktPmN0eC5jRmlsZU5hbWU7CisgICAgICBzaXplX3QgaW5kZXgsIGxlbl8wID0gMDsKKworICAgICAgd2hpbGUgKHdkaXJbbGVuXzBdICYmIGxlbl8wIDwgKHNpemVvZigoKmN0eCktPmVudHJ5X25hbWUpIC0gMSkpIGxlbl8wKys7CisgICAgICBsZW5fMCsrOworCisjaWZkZWYgTFBfTVVMVElCWVRFX0FWQUlMQUJMRQorICAgICAgaWYgKCFXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgKFdDSEFSICopd2RpciwgbGVuXzAsICgqY3R4KS0+ZW50cnlfbmFtZSwKKwkJCSAgICAgICBzaXplb2YoKCpjdHgpLT5lbnRyeV9uYW1lKSwgTlVMTCwgMCkpCisjZW5kaWYKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsZW5fMDsgaW5kZXgrKykKKwkgICgqY3R4KS0+ZW50cnlfbmFtZVtpbmRleF0gPSAoY2hhcil3ZGlyW2luZGV4XTsKKyAgICB9CisgIGVsc2UKKyAgICBzdHJuY3B5KCgqY3R4KS0+ZW50cnlfbmFtZSwgKGNvbnN0IGNoYXIgKikoKmN0eCktPmN0eC5jRmlsZU5hbWUsCisJICAgIHNpemVvZigoKmN0eCktPmVudHJ5X25hbWUpLTEpOworCisgICgqY3R4KS0+ZW50cnlfbmFtZVtzaXplb2YoKCpjdHgpLT5lbnRyeV9uYW1lKS0xXSA9ICdcMCc7CisKKyAgcmV0dXJuICgqY3R4KS0+ZW50cnlfbmFtZTsKK30KKworaW50IExQX2ZpbmRfZmlsZV9lbmQoTFBfRElSX0NUWCAqKmN0eCkKK3sKKyAgaWYgKGN0eCAhPSBOVUxMICYmICpjdHggIT0gTlVMTCkKKyAgICB7CisgICAgICBGaW5kQ2xvc2UoKCpjdHgpLT5oYW5kbGUpOworICAgICAgZnJlZSgqY3R4KTsKKyAgICAgICpjdHggPSBOVUxMOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICBlcnJubyA9IEVJTlZBTDsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vTFBkaXJfd2luMzIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9MUGRpcl93aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTg3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vTFBkaXJfd2luMzIuYwpAQCAtMCwwICsxLDMwIEBACisvKiAkTFA6IExQbGliL3NvdXJjZS9MUGRpcl93aW4zMi5jLHYgMS4zIDIwMDQvMDgvMjYgMTM6MzY6MDUgX2N2c19sZXZpdHRlIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBSaWNoYXJkIExldml0dGUgPHJpY2hhcmRAbGV2aXR0ZS5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2RlZmluZSBMUF9TWVNfV0lOMzIKKyNkZWZpbmUgTFBfTVVMVElCWVRFX0FWQUlMQUJMRQorI2luY2x1ZGUgIkxQZGlyX3dpbi5jIgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL0xQZGlyX3dpbmNlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vTFBkaXJfd2luY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjBlMWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL0xQZGlyX3dpbmNlLmMKQEAgLTAsMCArMSwzMSBAQAorLyogJExQOiBMUGxpYi9zb3VyY2UvTFBkaXJfd2luY2UuYyx2IDEuMyAyMDA0LzA4LzI2IDEzOjM2OjA1IF9jdnNfbGV2aXR0ZSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNkZWZpbmUgTFBfU1lTX1dJTkNFCisvKiBXZSBtaWdodCB3YW50IHRvIGRlZmluZSBMUF9NVUxUSUJZVEVfQVZBSUxBQkxFIGhlcmUuICBJdCdzIGN1cnJlbnRseQorICAgdW5kZXIgaW52ZXN0aWdhdGlvbiB3aGF0IHRoZSBleGFjdCBjb25kaXRpb25zIHdvdWxkIGJlICovCisjaW5jbHVkZSAiTFBkaXJfd2luLmMiCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL1JFQURNRSBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOTYyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL1JFQURNRQpAQCAtMCwwICsxLDMgQEAKK1RoaXMgaXMgYW4gT3BlblNTTC1jb21wYXRpYmxlIHZlcnNpb24gb2YgQUVTIChhbHNvIGNhbGxlZCBSaWpuZGFlbCkuCithZXNfY29yZS5jIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyByaWpuZGFlbC1hbGctZnN0LmMgYnV0IHdpdGggYW4KK0FQSSB0aGF0IGxvb2tzIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIE9wZW5TU0wgc3ltbWV0cmljIGNpcGhlciBzdWl0ZS4KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYzk5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flcy5oCkBAIC0wLDAgKzEsMTQyIEBACisvKiBjcnlwdG8vYWVzL2Flcy5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX0FFU19ICisjZGVmaW5lIEhFQURFUl9BRVNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19BRVMKKyNlcnJvciBBRVMgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIEFFU19FTkNSWVBUCTEKKyNkZWZpbmUgQUVTX0RFQ1JZUFQJMAorCisvKiBCZWNhdXNlIGFycmF5IHNpemUgY2FuJ3QgYmUgYSBjb25zdCBpbiBDLCB0aGUgZm9sbG93aW5nIHR3byBhcmUgbWFjcm9zLgorICAgQm90aCBzaXplcyBhcmUgaW4gYnl0ZXMuICovCisjZGVmaW5lIEFFU19NQVhOUiAxNAorI2RlZmluZSBBRVNfQkxPQ0tfU0laRSAxNgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGlzIHNob3VsZCBiZSBhIGhpZGRlbiB0eXBlLCBidXQgRVZQIHJlcXVpcmVzIHRoYXQgdGhlIHNpemUgYmUga25vd24gKi8KK3N0cnVjdCBhZXNfa2V5X3N0IHsKKyNpZmRlZiBBRVNfTE9ORworICAgIHVuc2lnbmVkIGxvbmcgcmRfa2V5WzQgKihBRVNfTUFYTlIgKyAxKV07CisjZWxzZQorICAgIHVuc2lnbmVkIGludCByZF9rZXlbNCAqKEFFU19NQVhOUiArIDEpXTsKKyNlbmRpZgorICAgIGludCByb3VuZHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYWVzX2tleV9zdCBBRVNfS0VZOworCitjb25zdCBjaGFyICpBRVNfb3B0aW9ucyh2b2lkKTsKKworaW50IEFFU19zZXRfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisJQUVTX0tFWSAqa2V5KTsKK2ludCBBRVNfc2V0X2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJLZXksIGNvbnN0IGludCBiaXRzLAorCUFFU19LRVkgKmtleSk7CisKK3ZvaWQgQUVTX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwljb25zdCBBRVNfS0VZICprZXkpOwordm9pZCBBRVNfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCWNvbnN0IEFFU19LRVkgKmtleSk7CisKK3ZvaWQgQUVTX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJY29uc3QgQUVTX0tFWSAqa2V5LCBjb25zdCBpbnQgZW5jKTsKK3ZvaWQgQUVTX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJc2l6ZV90IGxlbmd0aCwgY29uc3QgQUVTX0tFWSAqa2V5LAorCXVuc2lnbmVkIGNoYXIgKml2ZWMsIGNvbnN0IGludCBlbmMpOwordm9pZCBBRVNfY2ZiMTI4X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwlzaXplX3QgbGVuZ3RoLCBjb25zdCBBRVNfS0VZICprZXksCisJdW5zaWduZWQgY2hhciAqaXZlYywgaW50ICpudW0sIGNvbnN0IGludCBlbmMpOwordm9pZCBBRVNfY2ZiMV9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJc2l6ZV90IGxlbmd0aCwgY29uc3QgQUVTX0tFWSAqa2V5LAorCXVuc2lnbmVkIGNoYXIgKml2ZWMsIGludCAqbnVtLCBjb25zdCBpbnQgZW5jKTsKK3ZvaWQgQUVTX2NmYjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwl1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSwgY29uc3QgaW50IGVuYyk7Cit2b2lkIEFFU19vZmIxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwl1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSk7Cit2b2lkIEFFU19jdHIxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwl1bnNpZ25lZCBjaGFyIGl2ZWNbQUVTX0JMT0NLX1NJWkVdLAorCXVuc2lnbmVkIGNoYXIgZWNvdW50X2J1ZltBRVNfQkxPQ0tfU0laRV0sCisJdW5zaWduZWQgaW50ICpudW0pOworLyogTkI6IHRoZSBJViBpcyBfdHdvXyBibG9ja3MgbG9uZyAqLwordm9pZCBBRVNfaWdlX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJICAgICBzaXplX3QgbGVuZ3RoLCBjb25zdCBBRVNfS0VZICprZXksCisJCSAgICAgdW5zaWduZWQgY2hhciAqaXZlYywgY29uc3QgaW50IGVuYyk7CisvKiBOQjogdGhlIElWIGlzIF9mb3VyXyBibG9ja3MgbG9uZyAqLwordm9pZCBBRVNfYmlfaWdlX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwkJCWNvbnN0IEFFU19LRVkgKmtleTIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2ZWMsCisJCQljb25zdCBpbnQgZW5jKTsKKworaW50IEFFU193cmFwX2tleShBRVNfS0VZICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LAorCQl1bnNpZ25lZCBjaGFyICpvdXQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBpbnQgaW5sZW4pOworaW50IEFFU191bndyYXBfa2V5KEFFU19LRVkgKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsCisJCXVuc2lnbmVkIGNoYXIgKm91dCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGludCBpbmxlbik7CisKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhSEVBREVSX0FFU19IICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19jYmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NiYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyN2Y3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19jYmMuYwpAQCAtMCwwICsxLDYzIEBACisvKiBjcnlwdG8vYWVzL2Flc19jYmMuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21vZGVzLmg+CisKK3ZvaWQgQUVTX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgc2l6ZV90IGxlbiwgY29uc3QgQUVTX0tFWSAqa2V5LAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKml2ZWMsIGNvbnN0IGludCBlbmMpIHsKKworCWlmIChlbmMpCisJCUNSWVBUT19jYmMxMjhfZW5jcnlwdChpbixvdXQsbGVuLGtleSxpdmVjLChibG9jazEyOF9mKUFFU19lbmNyeXB0KTsKKwllbHNlCisJCUNSWVBUT19jYmMxMjhfZGVjcnlwdChpbixvdXQsbGVuLGtleSxpdmVjLChibG9jazEyOF9mKUFFU19kZWNyeXB0KTsKK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NmYi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfY2ZiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2ZDA1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NmYi5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIGNyeXB0by9hZXMvYWVzX2NmYi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbW9kZXMuaD4KKworLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZW5jcnlwdGVkIGFzIHRob3VnaCAxMjhiaXQgY2ZiIG1vZGUgaXMgYmVpbmcKKyAqIHVzZWQuICBUaGUgZXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gdG8gcmVjb3JkIGhvdyBtdWNoIG9mIHRoZQorICogMTI4Yml0IGJsb2NrIHdlIGhhdmUgdXNlZCBpcyBjb250YWluZWQgaW4gKm51bTsKKyAqLworCit2b2lkIEFFU19jZmIxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwl1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSwgY29uc3QgaW50IGVuYykgeworCisJQ1JZUFRPX2NmYjEyOF9lbmNyeXB0KGluLG91dCxsZW5ndGgsa2V5LGl2ZWMsbnVtLGVuYywoYmxvY2sxMjhfZilBRVNfZW5jcnlwdCk7Cit9CisKKy8qIE4uQi4gVGhpcyBleHBlY3RzIHRoZSBpbnB1dCB0byBiZSBwYWNrZWQsIE1TIGJpdCBmaXJzdCAqLwordm9pZCBBRVNfY2ZiMV9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgIHNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqaXZlYywgaW50ICpudW0sIGNvbnN0IGludCBlbmMpCisgICAgeworICAgIENSWVBUT19jZmIxMjhfMV9lbmNyeXB0KGluLG91dCxsZW5ndGgsa2V5LGl2ZWMsbnVtLGVuYywoYmxvY2sxMjhfZilBRVNfZW5jcnlwdCk7CisgICAgfQorCit2b2lkIEFFU19jZmI4X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJICAgICAgc2l6ZV90IGxlbmd0aCwgY29uc3QgQUVTX0tFWSAqa2V5LAorCQkgICAgICB1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSwgY29uc3QgaW50IGVuYykKKyAgICB7CisgICAgQ1JZUFRPX2NmYjEyOF84X2VuY3J5cHQoaW4sb3V0LGxlbmd0aCxrZXksaXZlYyxudW0sZW5jLChibG9jazEyOF9mKUFFU19lbmNyeXB0KTsKKyAgICB9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NvcmUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VjNTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfY29yZS5jCkBAIC0wLDAgKzEsMTM1OCBAQAorLyogY3J5cHRvL2Flcy9hZXNfY29yZS5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKioKKyAqIHJpam5kYWVsLWFsZy1mc3QuYworICoKKyAqIEB2ZXJzaW9uIDMuMCAoRGVjZW1iZXIgMjAwMCkKKyAqCisgKiBPcHRpbWlzZWQgQU5TSSBDIGNvZGUgZm9yIHRoZSBSaWpuZGFlbCBjaXBoZXIgKG5vdyBBRVMpCisgKgorICogQGF1dGhvciBWaW5jZW50IFJpam1lbiA8dmluY2VudC5yaWptZW5AZXNhdC5rdWxldXZlbi5hYy5iZT4KKyAqIEBhdXRob3IgQW50b29uIEJvc3NlbGFlcnMgPGFudG9vbi5ib3NzZWxhZXJzQGVzYXQua3VsZXV2ZW4uYWMuYmU+CisgKiBAYXV0aG9yIFBhdWxvIEJhcnJldG8gPHBhdWxvLmJhcnJldG9AdGVycmEuY29tLmJyPgorICoKKyAqIFRoaXMgY29kZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUlMgJydBUyBJUycnIEFORCBBTlkgRVhQUkVTUworICogT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIE5vdGU6IHJld3JpdHRlbiBhIGxpdHRsZSBiaXQgdG8gcHJvdmlkZSBlcnJvciBjb250cm9sIGFuZCBhbiBPcGVuU1NMLQorICAgY29tcGF0aWJsZSBBUEkgKi8KKworI2lmbmRlZiBBRVNfREVCVUcKKyMgaWZuZGVmIE5ERUJVRworIyAgZGVmaW5lIE5ERUJVRworIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgImFlc19sb2NsLmgiCisKKyNpZm5kZWYgQUVTX0FTTQorLyoKK1RlMFt4XSA9IFMgW3hdLlswMiwgMDEsIDAxLCAwM107CitUZTFbeF0gPSBTIFt4XS5bMDMsIDAyLCAwMSwgMDFdOworVGUyW3hdID0gUyBbeF0uWzAxLCAwMywgMDIsIDAxXTsKK1RlM1t4XSA9IFMgW3hdLlswMSwgMDEsIDAzLCAwMl07CisKK1RkMFt4XSA9IFNpW3hdLlswZSwgMDksIDBkLCAwYl07CitUZDFbeF0gPSBTaVt4XS5bMGIsIDBlLCAwOSwgMGRdOworVGQyW3hdID0gU2lbeF0uWzBkLCAwYiwgMGUsIDA5XTsKK1RkM1t4XSA9IFNpW3hdLlswOSwgMGQsIDBiLCAwZV07CitUZDRbeF0gPSBTaVt4XS5bMDFdOworKi8KKworc3RhdGljIGNvbnN0IHUzMiBUZTBbMjU2XSA9IHsKKyAgICAweGM2NjM2M2E1VSwgMHhmODdjN2M4NFUsIDB4ZWU3Nzc3OTlVLCAweGY2N2I3YjhkVSwKKyAgICAweGZmZjJmMjBkVSwgMHhkNjZiNmJiZFUsIDB4ZGU2ZjZmYjFVLCAweDkxYzVjNTU0VSwKKyAgICAweDYwMzAzMDUwVSwgMHgwMjAxMDEwM1UsIDB4Y2U2NzY3YTlVLCAweDU2MmIyYjdkVSwKKyAgICAweGU3ZmVmZTE5VSwgMHhiNWQ3ZDc2MlUsIDB4NGRhYmFiZTZVLCAweGVjNzY3NjlhVSwKKyAgICAweDhmY2FjYTQ1VSwgMHgxZjgyODI5ZFUsIDB4ODljOWM5NDBVLCAweGZhN2Q3ZDg3VSwKKyAgICAweGVmZmFmYTE1VSwgMHhiMjU5NTllYlUsIDB4OGU0NzQ3YzlVLCAweGZiZjBmMDBiVSwKKyAgICAweDQxYWRhZGVjVSwgMHhiM2Q0ZDQ2N1UsIDB4NWZhMmEyZmRVLCAweDQ1YWZhZmVhVSwKKyAgICAweDIzOWM5Y2JmVSwgMHg1M2E0YTRmN1UsIDB4ZTQ3MjcyOTZVLCAweDliYzBjMDViVSwKKyAgICAweDc1YjdiN2MyVSwgMHhlMWZkZmQxY1UsIDB4M2Q5MzkzYWVVLCAweDRjMjYyNjZhVSwKKyAgICAweDZjMzYzNjVhVSwgMHg3ZTNmM2Y0MVUsIDB4ZjVmN2Y3MDJVLCAweDgzY2NjYzRmVSwKKyAgICAweDY4MzQzNDVjVSwgMHg1MWE1YTVmNFUsIDB4ZDFlNWU1MzRVLCAweGY5ZjFmMTA4VSwKKyAgICAweGUyNzE3MTkzVSwgMHhhYmQ4ZDg3M1UsIDB4NjIzMTMxNTNVLCAweDJhMTUxNTNmVSwKKyAgICAweDA4MDQwNDBjVSwgMHg5NWM3Yzc1MlUsIDB4NDYyMzIzNjVVLCAweDlkYzNjMzVlVSwKKyAgICAweDMwMTgxODI4VSwgMHgzNzk2OTZhMVUsIDB4MGEwNTA1MGZVLCAweDJmOWE5YWI1VSwKKyAgICAweDBlMDcwNzA5VSwgMHgyNDEyMTIzNlUsIDB4MWI4MDgwOWJVLCAweGRmZTJlMjNkVSwKKyAgICAweGNkZWJlYjI2VSwgMHg0ZTI3Mjc2OVUsIDB4N2ZiMmIyY2RVLCAweGVhNzU3NTlmVSwKKyAgICAweDEyMDkwOTFiVSwgMHgxZDgzODM5ZVUsIDB4NTgyYzJjNzRVLCAweDM0MWExYTJlVSwKKyAgICAweDM2MWIxYjJkVSwgMHhkYzZlNmViMlUsIDB4YjQ1YTVhZWVVLCAweDViYTBhMGZiVSwKKyAgICAweGE0NTI1MmY2VSwgMHg3NjNiM2I0ZFUsIDB4YjdkNmQ2NjFVLCAweDdkYjNiM2NlVSwKKyAgICAweDUyMjkyOTdiVSwgMHhkZGUzZTMzZVUsIDB4NWUyZjJmNzFVLCAweDEzODQ4NDk3VSwKKyAgICAweGE2NTM1M2Y1VSwgMHhiOWQxZDE2OFUsIDB4MDAwMDAwMDBVLCAweGMxZWRlZDJjVSwKKyAgICAweDQwMjAyMDYwVSwgMHhlM2ZjZmMxZlUsIDB4NzliMWIxYzhVLCAweGI2NWI1YmVkVSwKKyAgICAweGQ0NmE2YWJlVSwgMHg4ZGNiY2I0NlUsIDB4NjdiZWJlZDlVLCAweDcyMzkzOTRiVSwKKyAgICAweDk0NGE0YWRlVSwgMHg5ODRjNGNkNFUsIDB4YjA1ODU4ZThVLCAweDg1Y2ZjZjRhVSwKKyAgICAweGJiZDBkMDZiVSwgMHhjNWVmZWYyYVUsIDB4NGZhYWFhZTVVLCAweGVkZmJmYjE2VSwKKyAgICAweDg2NDM0M2M1VSwgMHg5YTRkNGRkN1UsIDB4NjYzMzMzNTVVLCAweDExODU4NTk0VSwKKyAgICAweDhhNDU0NWNmVSwgMHhlOWY5ZjkxMFUsIDB4MDQwMjAyMDZVLCAweGZlN2Y3ZjgxVSwKKyAgICAweGEwNTA1MGYwVSwgMHg3ODNjM2M0NFUsIDB4MjU5ZjlmYmFVLCAweDRiYThhOGUzVSwKKyAgICAweGEyNTE1MWYzVSwgMHg1ZGEzYTNmZVUsIDB4ODA0MDQwYzBVLCAweDA1OGY4ZjhhVSwKKyAgICAweDNmOTI5MmFkVSwgMHgyMTlkOWRiY1UsIDB4NzAzODM4NDhVLCAweGYxZjVmNTA0VSwKKyAgICAweDYzYmNiY2RmVSwgMHg3N2I2YjZjMVUsIDB4YWZkYWRhNzVVLCAweDQyMjEyMTYzVSwKKyAgICAweDIwMTAxMDMwVSwgMHhlNWZmZmYxYVUsIDB4ZmRmM2YzMGVVLCAweGJmZDJkMjZkVSwKKyAgICAweDgxY2RjZDRjVSwgMHgxODBjMGMxNFUsIDB4MjYxMzEzMzVVLCAweGMzZWNlYzJmVSwKKyAgICAweGJlNWY1ZmUxVSwgMHgzNTk3OTdhMlUsIDB4ODg0NDQ0Y2NVLCAweDJlMTcxNzM5VSwKKyAgICAweDkzYzRjNDU3VSwgMHg1NWE3YTdmMlUsIDB4ZmM3ZTdlODJVLCAweDdhM2QzZDQ3VSwKKyAgICAweGM4NjQ2NGFjVSwgMHhiYTVkNWRlN1UsIDB4MzIxOTE5MmJVLCAweGU2NzM3Mzk1VSwKKyAgICAweGMwNjA2MGEwVSwgMHgxOTgxODE5OFUsIDB4OWU0ZjRmZDFVLCAweGEzZGNkYzdmVSwKKyAgICAweDQ0MjIyMjY2VSwgMHg1NDJhMmE3ZVUsIDB4M2I5MDkwYWJVLCAweDBiODg4ODgzVSwKKyAgICAweDhjNDY0NmNhVSwgMHhjN2VlZWUyOVUsIDB4NmJiOGI4ZDNVLCAweDI4MTQxNDNjVSwKKyAgICAweGE3ZGVkZTc5VSwgMHhiYzVlNWVlMlUsIDB4MTYwYjBiMWRVLCAweGFkZGJkYjc2VSwKKyAgICAweGRiZTBlMDNiVSwgMHg2NDMyMzI1NlUsIDB4NzQzYTNhNGVVLCAweDE0MGEwYTFlVSwKKyAgICAweDkyNDk0OWRiVSwgMHgwYzA2MDYwYVUsIDB4NDgyNDI0NmNVLCAweGI4NWM1Y2U0VSwKKyAgICAweDlmYzJjMjVkVSwgMHhiZGQzZDM2ZVUsIDB4NDNhY2FjZWZVLCAweGM0NjI2MmE2VSwKKyAgICAweDM5OTE5MWE4VSwgMHgzMTk1OTVhNFUsIDB4ZDNlNGU0MzdVLCAweGYyNzk3OThiVSwKKyAgICAweGQ1ZTdlNzMyVSwgMHg4YmM4Yzg0M1UsIDB4NmUzNzM3NTlVLCAweGRhNmQ2ZGI3VSwKKyAgICAweDAxOGQ4ZDhjVSwgMHhiMWQ1ZDU2NFUsIDB4OWM0ZTRlZDJVLCAweDQ5YTlhOWUwVSwKKyAgICAweGQ4NmM2Y2I0VSwgMHhhYzU2NTZmYVUsIDB4ZjNmNGY0MDdVLCAweGNmZWFlYTI1VSwKKyAgICAweGNhNjU2NWFmVSwgMHhmNDdhN2E4ZVUsIDB4NDdhZWFlZTlVLCAweDEwMDgwODE4VSwKKyAgICAweDZmYmFiYWQ1VSwgMHhmMDc4Nzg4OFUsIDB4NGEyNTI1NmZVLCAweDVjMmUyZTcyVSwKKyAgICAweDM4MWMxYzI0VSwgMHg1N2E2YTZmMVUsIDB4NzNiNGI0YzdVLCAweDk3YzZjNjUxVSwKKyAgICAweGNiZThlODIzVSwgMHhhMWRkZGQ3Y1UsIDB4ZTg3NDc0OWNVLCAweDNlMWYxZjIxVSwKKyAgICAweDk2NGI0YmRkVSwgMHg2MWJkYmRkY1UsIDB4MGQ4YjhiODZVLCAweDBmOGE4YTg1VSwKKyAgICAweGUwNzA3MDkwVSwgMHg3YzNlM2U0MlUsIDB4NzFiNWI1YzRVLCAweGNjNjY2NmFhVSwKKyAgICAweDkwNDg0OGQ4VSwgMHgwNjAzMDMwNVUsIDB4ZjdmNmY2MDFVLCAweDFjMGUwZTEyVSwKKyAgICAweGMyNjE2MWEzVSwgMHg2YTM1MzU1ZlUsIDB4YWU1NzU3ZjlVLCAweDY5YjliOWQwVSwKKyAgICAweDE3ODY4NjkxVSwgMHg5OWMxYzE1OFUsIDB4M2ExZDFkMjdVLCAweDI3OWU5ZWI5VSwKKyAgICAweGQ5ZTFlMTM4VSwgMHhlYmY4ZjgxM1UsIDB4MmI5ODk4YjNVLCAweDIyMTExMTMzVSwKKyAgICAweGQyNjk2OWJiVSwgMHhhOWQ5ZDk3MFUsIDB4MDc4ZThlODlVLCAweDMzOTQ5NGE3VSwKKyAgICAweDJkOWI5YmI2VSwgMHgzYzFlMWUyMlUsIDB4MTU4Nzg3OTJVLCAweGM5ZTllOTIwVSwKKyAgICAweDg3Y2VjZTQ5VSwgMHhhYTU1NTVmZlUsIDB4NTAyODI4NzhVLCAweGE1ZGZkZjdhVSwKKyAgICAweDAzOGM4YzhmVSwgMHg1OWExYTFmOFUsIDB4MDk4OTg5ODBVLCAweDFhMGQwZDE3VSwKKyAgICAweDY1YmZiZmRhVSwgMHhkN2U2ZTYzMVUsIDB4ODQ0MjQyYzZVLCAweGQwNjg2OGI4VSwKKyAgICAweDgyNDE0MWMzVSwgMHgyOTk5OTliMFUsIDB4NWEyZDJkNzdVLCAweDFlMGYwZjExVSwKKyAgICAweDdiYjBiMGNiVSwgMHhhODU0NTRmY1UsIDB4NmRiYmJiZDZVLCAweDJjMTYxNjNhVSwKK307CitzdGF0aWMgY29uc3QgdTMyIFRlMVsyNTZdID0geworICAgIDB4YTVjNjYzNjNVLCAweDg0Zjg3YzdjVSwgMHg5OWVlNzc3N1UsIDB4OGRmNjdiN2JVLAorICAgIDB4MGRmZmYyZjJVLCAweGJkZDY2YjZiVSwgMHhiMWRlNmY2ZlUsIDB4NTQ5MWM1YzVVLAorICAgIDB4NTA2MDMwMzBVLCAweDAzMDIwMTAxVSwgMHhhOWNlNjc2N1UsIDB4N2Q1NjJiMmJVLAorICAgIDB4MTllN2ZlZmVVLCAweDYyYjVkN2Q3VSwgMHhlNjRkYWJhYlUsIDB4OWFlYzc2NzZVLAorICAgIDB4NDU4ZmNhY2FVLCAweDlkMWY4MjgyVSwgMHg0MDg5YzljOVUsIDB4ODdmYTdkN2RVLAorICAgIDB4MTVlZmZhZmFVLCAweGViYjI1OTU5VSwgMHhjOThlNDc0N1UsIDB4MGJmYmYwZjBVLAorICAgIDB4ZWM0MWFkYWRVLCAweDY3YjNkNGQ0VSwgMHhmZDVmYTJhMlUsIDB4ZWE0NWFmYWZVLAorICAgIDB4YmYyMzljOWNVLCAweGY3NTNhNGE0VSwgMHg5NmU0NzI3MlUsIDB4NWI5YmMwYzBVLAorICAgIDB4YzI3NWI3YjdVLCAweDFjZTFmZGZkVSwgMHhhZTNkOTM5M1UsIDB4NmE0YzI2MjZVLAorICAgIDB4NWE2YzM2MzZVLCAweDQxN2UzZjNmVSwgMHgwMmY1ZjdmN1UsIDB4NGY4M2NjY2NVLAorICAgIDB4NWM2ODM0MzRVLCAweGY0NTFhNWE1VSwgMHgzNGQxZTVlNVUsIDB4MDhmOWYxZjFVLAorICAgIDB4OTNlMjcxNzFVLCAweDczYWJkOGQ4VSwgMHg1MzYyMzEzMVUsIDB4M2YyYTE1MTVVLAorICAgIDB4MGMwODA0MDRVLCAweDUyOTVjN2M3VSwgMHg2NTQ2MjMyM1UsIDB4NWU5ZGMzYzNVLAorICAgIDB4MjgzMDE4MThVLCAweGExMzc5Njk2VSwgMHgwZjBhMDUwNVUsIDB4YjUyZjlhOWFVLAorICAgIDB4MDkwZTA3MDdVLCAweDM2MjQxMjEyVSwgMHg5YjFiODA4MFUsIDB4M2RkZmUyZTJVLAorICAgIDB4MjZjZGViZWJVLCAweDY5NGUyNzI3VSwgMHhjZDdmYjJiMlUsIDB4OWZlYTc1NzVVLAorICAgIDB4MWIxMjA5MDlVLCAweDllMWQ4MzgzVSwgMHg3NDU4MmMyY1UsIDB4MmUzNDFhMWFVLAorICAgIDB4MmQzNjFiMWJVLCAweGIyZGM2ZTZlVSwgMHhlZWI0NWE1YVUsIDB4ZmI1YmEwYTBVLAorICAgIDB4ZjZhNDUyNTJVLCAweDRkNzYzYjNiVSwgMHg2MWI3ZDZkNlUsIDB4Y2U3ZGIzYjNVLAorICAgIDB4N2I1MjI5MjlVLCAweDNlZGRlM2UzVSwgMHg3MTVlMmYyZlUsIDB4OTcxMzg0ODRVLAorICAgIDB4ZjVhNjUzNTNVLCAweDY4YjlkMWQxVSwgMHgwMDAwMDAwMFUsIDB4MmNjMWVkZWRVLAorICAgIDB4NjA0MDIwMjBVLCAweDFmZTNmY2ZjVSwgMHhjODc5YjFiMVUsIDB4ZWRiNjViNWJVLAorICAgIDB4YmVkNDZhNmFVLCAweDQ2OGRjYmNiVSwgMHhkOTY3YmViZVUsIDB4NGI3MjM5MzlVLAorICAgIDB4ZGU5NDRhNGFVLCAweGQ0OTg0YzRjVSwgMHhlOGIwNTg1OFUsIDB4NGE4NWNmY2ZVLAorICAgIDB4NmJiYmQwZDBVLCAweDJhYzVlZmVmVSwgMHhlNTRmYWFhYVUsIDB4MTZlZGZiZmJVLAorICAgIDB4YzU4NjQzNDNVLCAweGQ3OWE0ZDRkVSwgMHg1NTY2MzMzM1UsIDB4OTQxMTg1ODVVLAorICAgIDB4Y2Y4YTQ1NDVVLCAweDEwZTlmOWY5VSwgMHgwNjA0MDIwMlUsIDB4ODFmZTdmN2ZVLAorICAgIDB4ZjBhMDUwNTBVLCAweDQ0NzgzYzNjVSwgMHhiYTI1OWY5ZlUsIDB4ZTM0YmE4YThVLAorICAgIDB4ZjNhMjUxNTFVLCAweGZlNWRhM2EzVSwgMHhjMDgwNDA0MFUsIDB4OGEwNThmOGZVLAorICAgIDB4YWQzZjkyOTJVLCAweGJjMjE5ZDlkVSwgMHg0ODcwMzgzOFUsIDB4MDRmMWY1ZjVVLAorICAgIDB4ZGY2M2JjYmNVLCAweGMxNzdiNmI2VSwgMHg3NWFmZGFkYVUsIDB4NjM0MjIxMjFVLAorICAgIDB4MzAyMDEwMTBVLCAweDFhZTVmZmZmVSwgMHgwZWZkZjNmM1UsIDB4NmRiZmQyZDJVLAorICAgIDB4NGM4MWNkY2RVLCAweDE0MTgwYzBjVSwgMHgzNTI2MTMxM1UsIDB4MmZjM2VjZWNVLAorICAgIDB4ZTFiZTVmNWZVLCAweGEyMzU5Nzk3VSwgMHhjYzg4NDQ0NFUsIDB4MzkyZTE3MTdVLAorICAgIDB4NTc5M2M0YzRVLCAweGYyNTVhN2E3VSwgMHg4MmZjN2U3ZVUsIDB4NDc3YTNkM2RVLAorICAgIDB4YWNjODY0NjRVLCAweGU3YmE1ZDVkVSwgMHgyYjMyMTkxOVUsIDB4OTVlNjczNzNVLAorICAgIDB4YTBjMDYwNjBVLCAweDk4MTk4MTgxVSwgMHhkMTllNGY0ZlUsIDB4N2ZhM2RjZGNVLAorICAgIDB4NjY0NDIyMjJVLCAweDdlNTQyYTJhVSwgMHhhYjNiOTA5MFUsIDB4ODMwYjg4ODhVLAorICAgIDB4Y2E4YzQ2NDZVLCAweDI5YzdlZWVlVSwgMHhkMzZiYjhiOFUsIDB4M2MyODE0MTRVLAorICAgIDB4NzlhN2RlZGVVLCAweGUyYmM1ZTVlVSwgMHgxZDE2MGIwYlUsIDB4NzZhZGRiZGJVLAorICAgIDB4M2JkYmUwZTBVLCAweDU2NjQzMjMyVSwgMHg0ZTc0M2EzYVUsIDB4MWUxNDBhMGFVLAorICAgIDB4ZGI5MjQ5NDlVLCAweDBhMGMwNjA2VSwgMHg2YzQ4MjQyNFUsIDB4ZTRiODVjNWNVLAorICAgIDB4NWQ5ZmMyYzJVLCAweDZlYmRkM2QzVSwgMHhlZjQzYWNhY1UsIDB4YTZjNDYyNjJVLAorICAgIDB4YTgzOTkxOTFVLCAweGE0MzE5NTk1VSwgMHgzN2QzZTRlNFUsIDB4OGJmMjc5NzlVLAorICAgIDB4MzJkNWU3ZTdVLCAweDQzOGJjOGM4VSwgMHg1OTZlMzczN1UsIDB4YjdkYTZkNmRVLAorICAgIDB4OGMwMThkOGRVLCAweDY0YjFkNWQ1VSwgMHhkMjljNGU0ZVUsIDB4ZTA0OWE5YTlVLAorICAgIDB4YjRkODZjNmNVLCAweGZhYWM1NjU2VSwgMHgwN2YzZjRmNFUsIDB4MjVjZmVhZWFVLAorICAgIDB4YWZjYTY1NjVVLCAweDhlZjQ3YTdhVSwgMHhlOTQ3YWVhZVUsIDB4MTgxMDA4MDhVLAorICAgIDB4ZDU2ZmJhYmFVLCAweDg4ZjA3ODc4VSwgMHg2ZjRhMjUyNVUsIDB4NzI1YzJlMmVVLAorICAgIDB4MjQzODFjMWNVLCAweGYxNTdhNmE2VSwgMHhjNzczYjRiNFUsIDB4NTE5N2M2YzZVLAorICAgIDB4MjNjYmU4ZThVLCAweDdjYTFkZGRkVSwgMHg5Y2U4NzQ3NFUsIDB4MjEzZTFmMWZVLAorICAgIDB4ZGQ5NjRiNGJVLCAweGRjNjFiZGJkVSwgMHg4NjBkOGI4YlUsIDB4ODUwZjhhOGFVLAorICAgIDB4OTBlMDcwNzBVLCAweDQyN2MzZTNlVSwgMHhjNDcxYjViNVUsIDB4YWFjYzY2NjZVLAorICAgIDB4ZDg5MDQ4NDhVLCAweDA1MDYwMzAzVSwgMHgwMWY3ZjZmNlUsIDB4MTIxYzBlMGVVLAorICAgIDB4YTNjMjYxNjFVLCAweDVmNmEzNTM1VSwgMHhmOWFlNTc1N1UsIDB4ZDA2OWI5YjlVLAorICAgIDB4OTExNzg2ODZVLCAweDU4OTljMWMxVSwgMHgyNzNhMWQxZFUsIDB4YjkyNzllOWVVLAorICAgIDB4MzhkOWUxZTFVLCAweDEzZWJmOGY4VSwgMHhiMzJiOTg5OFUsIDB4MzMyMjExMTFVLAorICAgIDB4YmJkMjY5NjlVLCAweDcwYTlkOWQ5VSwgMHg4OTA3OGU4ZVUsIDB4YTczMzk0OTRVLAorICAgIDB4YjYyZDliOWJVLCAweDIyM2MxZTFlVSwgMHg5MjE1ODc4N1UsIDB4MjBjOWU5ZTlVLAorICAgIDB4NDk4N2NlY2VVLCAweGZmYWE1NTU1VSwgMHg3ODUwMjgyOFUsIDB4N2FhNWRmZGZVLAorICAgIDB4OGYwMzhjOGNVLCAweGY4NTlhMWExVSwgMHg4MDA5ODk4OVUsIDB4MTcxYTBkMGRVLAorICAgIDB4ZGE2NWJmYmZVLCAweDMxZDdlNmU2VSwgMHhjNjg0NDI0MlUsIDB4YjhkMDY4NjhVLAorICAgIDB4YzM4MjQxNDFVLCAweGIwMjk5OTk5VSwgMHg3NzVhMmQyZFUsIDB4MTExZTBmMGZVLAorICAgIDB4Y2I3YmIwYjBVLCAweGZjYTg1NDU0VSwgMHhkNjZkYmJiYlUsIDB4M2EyYzE2MTZVLAorfTsKK3N0YXRpYyBjb25zdCB1MzIgVGUyWzI1Nl0gPSB7CisgICAgMHg2M2E1YzY2M1UsIDB4N2M4NGY4N2NVLCAweDc3OTllZTc3VSwgMHg3YjhkZjY3YlUsCisgICAgMHhmMjBkZmZmMlUsIDB4NmJiZGQ2NmJVLCAweDZmYjFkZTZmVSwgMHhjNTU0OTFjNVUsCisgICAgMHgzMDUwNjAzMFUsIDB4MDEwMzAyMDFVLCAweDY3YTljZTY3VSwgMHgyYjdkNTYyYlUsCisgICAgMHhmZTE5ZTdmZVUsIDB4ZDc2MmI1ZDdVLCAweGFiZTY0ZGFiVSwgMHg3NjlhZWM3NlUsCisgICAgMHhjYTQ1OGZjYVUsIDB4ODI5ZDFmODJVLCAweGM5NDA4OWM5VSwgMHg3ZDg3ZmE3ZFUsCisgICAgMHhmYTE1ZWZmYVUsIDB4NTllYmIyNTlVLCAweDQ3Yzk4ZTQ3VSwgMHhmMDBiZmJmMFUsCisgICAgMHhhZGVjNDFhZFUsIDB4ZDQ2N2IzZDRVLCAweGEyZmQ1ZmEyVSwgMHhhZmVhNDVhZlUsCisgICAgMHg5Y2JmMjM5Y1UsIDB4YTRmNzUzYTRVLCAweDcyOTZlNDcyVSwgMHhjMDViOWJjMFUsCisgICAgMHhiN2MyNzViN1UsIDB4ZmQxY2UxZmRVLCAweDkzYWUzZDkzVSwgMHgyNjZhNGMyNlUsCisgICAgMHgzNjVhNmMzNlUsIDB4M2Y0MTdlM2ZVLCAweGY3MDJmNWY3VSwgMHhjYzRmODNjY1UsCisgICAgMHgzNDVjNjgzNFUsIDB4YTVmNDUxYTVVLCAweGU1MzRkMWU1VSwgMHhmMTA4ZjlmMVUsCisgICAgMHg3MTkzZTI3MVUsIDB4ZDg3M2FiZDhVLCAweDMxNTM2MjMxVSwgMHgxNTNmMmExNVUsCisgICAgMHgwNDBjMDgwNFUsIDB4Yzc1Mjk1YzdVLCAweDIzNjU0NjIzVSwgMHhjMzVlOWRjM1UsCisgICAgMHgxODI4MzAxOFUsIDB4OTZhMTM3OTZVLCAweDA1MGYwYTA1VSwgMHg5YWI1MmY5YVUsCisgICAgMHgwNzA5MGUwN1UsIDB4MTIzNjI0MTJVLCAweDgwOWIxYjgwVSwgMHhlMjNkZGZlMlUsCisgICAgMHhlYjI2Y2RlYlUsIDB4Mjc2OTRlMjdVLCAweGIyY2Q3ZmIyVSwgMHg3NTlmZWE3NVUsCisgICAgMHgwOTFiMTIwOVUsIDB4ODM5ZTFkODNVLCAweDJjNzQ1ODJjVSwgMHgxYTJlMzQxYVUsCisgICAgMHgxYjJkMzYxYlUsIDB4NmViMmRjNmVVLCAweDVhZWViNDVhVSwgMHhhMGZiNWJhMFUsCisgICAgMHg1MmY2YTQ1MlUsIDB4M2I0ZDc2M2JVLCAweGQ2NjFiN2Q2VSwgMHhiM2NlN2RiM1UsCisgICAgMHgyOTdiNTIyOVUsIDB4ZTMzZWRkZTNVLCAweDJmNzE1ZTJmVSwgMHg4NDk3MTM4NFUsCisgICAgMHg1M2Y1YTY1M1UsIDB4ZDE2OGI5ZDFVLCAweDAwMDAwMDAwVSwgMHhlZDJjYzFlZFUsCisgICAgMHgyMDYwNDAyMFUsIDB4ZmMxZmUzZmNVLCAweGIxYzg3OWIxVSwgMHg1YmVkYjY1YlUsCisgICAgMHg2YWJlZDQ2YVUsIDB4Y2I0NjhkY2JVLCAweGJlZDk2N2JlVSwgMHgzOTRiNzIzOVUsCisgICAgMHg0YWRlOTQ0YVUsIDB4NGNkNDk4NGNVLCAweDU4ZThiMDU4VSwgMHhjZjRhODVjZlUsCisgICAgMHhkMDZiYmJkMFUsIDB4ZWYyYWM1ZWZVLCAweGFhZTU0ZmFhVSwgMHhmYjE2ZWRmYlUsCisgICAgMHg0M2M1ODY0M1UsIDB4NGRkNzlhNGRVLCAweDMzNTU2NjMzVSwgMHg4NTk0MTE4NVUsCisgICAgMHg0NWNmOGE0NVUsIDB4ZjkxMGU5ZjlVLCAweDAyMDYwNDAyVSwgMHg3ZjgxZmU3ZlUsCisgICAgMHg1MGYwYTA1MFUsIDB4M2M0NDc4M2NVLCAweDlmYmEyNTlmVSwgMHhhOGUzNGJhOFUsCisgICAgMHg1MWYzYTI1MVUsIDB4YTNmZTVkYTNVLCAweDQwYzA4MDQwVSwgMHg4ZjhhMDU4ZlUsCisgICAgMHg5MmFkM2Y5MlUsIDB4OWRiYzIxOWRVLCAweDM4NDg3MDM4VSwgMHhmNTA0ZjFmNVUsCisgICAgMHhiY2RmNjNiY1UsIDB4YjZjMTc3YjZVLCAweGRhNzVhZmRhVSwgMHgyMTYzNDIyMVUsCisgICAgMHgxMDMwMjAxMFUsIDB4ZmYxYWU1ZmZVLCAweGYzMGVmZGYzVSwgMHhkMjZkYmZkMlUsCisgICAgMHhjZDRjODFjZFUsIDB4MGMxNDE4MGNVLCAweDEzMzUyNjEzVSwgMHhlYzJmYzNlY1UsCisgICAgMHg1ZmUxYmU1ZlUsIDB4OTdhMjM1OTdVLCAweDQ0Y2M4ODQ0VSwgMHgxNzM5MmUxN1UsCisgICAgMHhjNDU3OTNjNFUsIDB4YTdmMjU1YTdVLCAweDdlODJmYzdlVSwgMHgzZDQ3N2EzZFUsCisgICAgMHg2NGFjYzg2NFUsIDB4NWRlN2JhNWRVLCAweDE5MmIzMjE5VSwgMHg3Mzk1ZTY3M1UsCisgICAgMHg2MGEwYzA2MFUsIDB4ODE5ODE5ODFVLCAweDRmZDE5ZTRmVSwgMHhkYzdmYTNkY1UsCisgICAgMHgyMjY2NDQyMlUsIDB4MmE3ZTU0MmFVLCAweDkwYWIzYjkwVSwgMHg4ODgzMGI4OFUsCisgICAgMHg0NmNhOGM0NlUsIDB4ZWUyOWM3ZWVVLCAweGI4ZDM2YmI4VSwgMHgxNDNjMjgxNFUsCisgICAgMHhkZTc5YTdkZVUsIDB4NWVlMmJjNWVVLCAweDBiMWQxNjBiVSwgMHhkYjc2YWRkYlUsCisgICAgMHhlMDNiZGJlMFUsIDB4MzI1NjY0MzJVLCAweDNhNGU3NDNhVSwgMHgwYTFlMTQwYVUsCisgICAgMHg0OWRiOTI0OVUsIDB4MDYwYTBjMDZVLCAweDI0NmM0ODI0VSwgMHg1Y2U0Yjg1Y1UsCisgICAgMHhjMjVkOWZjMlUsIDB4ZDM2ZWJkZDNVLCAweGFjZWY0M2FjVSwgMHg2MmE2YzQ2MlUsCisgICAgMHg5MWE4Mzk5MVUsIDB4OTVhNDMxOTVVLCAweGU0MzdkM2U0VSwgMHg3OThiZjI3OVUsCisgICAgMHhlNzMyZDVlN1UsIDB4Yzg0MzhiYzhVLCAweDM3NTk2ZTM3VSwgMHg2ZGI3ZGE2ZFUsCisgICAgMHg4ZDhjMDE4ZFUsIDB4ZDU2NGIxZDVVLCAweDRlZDI5YzRlVSwgMHhhOWUwNDlhOVUsCisgICAgMHg2Y2I0ZDg2Y1UsIDB4NTZmYWFjNTZVLCAweGY0MDdmM2Y0VSwgMHhlYTI1Y2ZlYVUsCisgICAgMHg2NWFmY2E2NVUsIDB4N2E4ZWY0N2FVLCAweGFlZTk0N2FlVSwgMHgwODE4MTAwOFUsCisgICAgMHhiYWQ1NmZiYVUsIDB4Nzg4OGYwNzhVLCAweDI1NmY0YTI1VSwgMHgyZTcyNWMyZVUsCisgICAgMHgxYzI0MzgxY1UsIDB4YTZmMTU3YTZVLCAweGI0Yzc3M2I0VSwgMHhjNjUxOTdjNlUsCisgICAgMHhlODIzY2JlOFUsIDB4ZGQ3Y2ExZGRVLCAweDc0OWNlODc0VSwgMHgxZjIxM2UxZlUsCisgICAgMHg0YmRkOTY0YlUsIDB4YmRkYzYxYmRVLCAweDhiODYwZDhiVSwgMHg4YTg1MGY4YVUsCisgICAgMHg3MDkwZTA3MFUsIDB4M2U0MjdjM2VVLCAweGI1YzQ3MWI1VSwgMHg2NmFhY2M2NlUsCisgICAgMHg0OGQ4OTA0OFUsIDB4MDMwNTA2MDNVLCAweGY2MDFmN2Y2VSwgMHgwZTEyMWMwZVUsCisgICAgMHg2MWEzYzI2MVUsIDB4MzU1ZjZhMzVVLCAweDU3ZjlhZTU3VSwgMHhiOWQwNjliOVUsCisgICAgMHg4NjkxMTc4NlUsIDB4YzE1ODk5YzFVLCAweDFkMjczYTFkVSwgMHg5ZWI5Mjc5ZVUsCisgICAgMHhlMTM4ZDllMVUsIDB4ZjgxM2ViZjhVLCAweDk4YjMyYjk4VSwgMHgxMTMzMjIxMVUsCisgICAgMHg2OWJiZDI2OVUsIDB4ZDk3MGE5ZDlVLCAweDhlODkwNzhlVSwgMHg5NGE3MzM5NFUsCisgICAgMHg5YmI2MmQ5YlUsIDB4MWUyMjNjMWVVLCAweDg3OTIxNTg3VSwgMHhlOTIwYzllOVUsCisgICAgMHhjZTQ5ODdjZVUsIDB4NTVmZmFhNTVVLCAweDI4Nzg1MDI4VSwgMHhkZjdhYTVkZlUsCisgICAgMHg4YzhmMDM4Y1UsIDB4YTFmODU5YTFVLCAweDg5ODAwOTg5VSwgMHgwZDE3MWEwZFUsCisgICAgMHhiZmRhNjViZlUsIDB4ZTYzMWQ3ZTZVLCAweDQyYzY4NDQyVSwgMHg2OGI4ZDA2OFUsCisgICAgMHg0MWMzODI0MVUsIDB4OTliMDI5OTlVLCAweDJkNzc1YTJkVSwgMHgwZjExMWUwZlUsCisgICAgMHhiMGNiN2JiMFUsIDB4NTRmY2E4NTRVLCAweGJiZDY2ZGJiVSwgMHgxNjNhMmMxNlUsCit9Oworc3RhdGljIGNvbnN0IHUzMiBUZTNbMjU2XSA9IHsKKyAgICAweDYzNjNhNWM2VSwgMHg3YzdjODRmOFUsIDB4Nzc3Nzk5ZWVVLCAweDdiN2I4ZGY2VSwKKyAgICAweGYyZjIwZGZmVSwgMHg2YjZiYmRkNlUsIDB4NmY2ZmIxZGVVLCAweGM1YzU1NDkxVSwKKyAgICAweDMwMzA1MDYwVSwgMHgwMTAxMDMwMlUsIDB4Njc2N2E5Y2VVLCAweDJiMmI3ZDU2VSwKKyAgICAweGZlZmUxOWU3VSwgMHhkN2Q3NjJiNVUsIDB4YWJhYmU2NGRVLCAweDc2NzY5YWVjVSwKKyAgICAweGNhY2E0NThmVSwgMHg4MjgyOWQxZlUsIDB4YzljOTQwODlVLCAweDdkN2Q4N2ZhVSwKKyAgICAweGZhZmExNWVmVSwgMHg1OTU5ZWJiMlUsIDB4NDc0N2M5OGVVLCAweGYwZjAwYmZiVSwKKyAgICAweGFkYWRlYzQxVSwgMHhkNGQ0NjdiM1UsIDB4YTJhMmZkNWZVLCAweGFmYWZlYTQ1VSwKKyAgICAweDljOWNiZjIzVSwgMHhhNGE0Zjc1M1UsIDB4NzI3Mjk2ZTRVLCAweGMwYzA1YjliVSwKKyAgICAweGI3YjdjMjc1VSwgMHhmZGZkMWNlMVUsIDB4OTM5M2FlM2RVLCAweDI2MjY2YTRjVSwKKyAgICAweDM2MzY1YTZjVSwgMHgzZjNmNDE3ZVUsIDB4ZjdmNzAyZjVVLCAweGNjY2M0ZjgzVSwKKyAgICAweDM0MzQ1YzY4VSwgMHhhNWE1ZjQ1MVUsIDB4ZTVlNTM0ZDFVLCAweGYxZjEwOGY5VSwKKyAgICAweDcxNzE5M2UyVSwgMHhkOGQ4NzNhYlUsIDB4MzEzMTUzNjJVLCAweDE1MTUzZjJhVSwKKyAgICAweDA0MDQwYzA4VSwgMHhjN2M3NTI5NVUsIDB4MjMyMzY1NDZVLCAweGMzYzM1ZTlkVSwKKyAgICAweDE4MTgyODMwVSwgMHg5Njk2YTEzN1UsIDB4MDUwNTBmMGFVLCAweDlhOWFiNTJmVSwKKyAgICAweDA3MDcwOTBlVSwgMHgxMjEyMzYyNFUsIDB4ODA4MDliMWJVLCAweGUyZTIzZGRmVSwKKyAgICAweGViZWIyNmNkVSwgMHgyNzI3Njk0ZVUsIDB4YjJiMmNkN2ZVLCAweDc1NzU5ZmVhVSwKKyAgICAweDA5MDkxYjEyVSwgMHg4MzgzOWUxZFUsIDB4MmMyYzc0NThVLCAweDFhMWEyZTM0VSwKKyAgICAweDFiMWIyZDM2VSwgMHg2ZTZlYjJkY1UsIDB4NWE1YWVlYjRVLCAweGEwYTBmYjViVSwKKyAgICAweDUyNTJmNmE0VSwgMHgzYjNiNGQ3NlUsIDB4ZDZkNjYxYjdVLCAweGIzYjNjZTdkVSwKKyAgICAweDI5Mjk3YjUyVSwgMHhlM2UzM2VkZFUsIDB4MmYyZjcxNWVVLCAweDg0ODQ5NzEzVSwKKyAgICAweDUzNTNmNWE2VSwgMHhkMWQxNjhiOVUsIDB4MDAwMDAwMDBVLCAweGVkZWQyY2MxVSwKKyAgICAweDIwMjA2MDQwVSwgMHhmY2ZjMWZlM1UsIDB4YjFiMWM4NzlVLCAweDViNWJlZGI2VSwKKyAgICAweDZhNmFiZWQ0VSwgMHhjYmNiNDY4ZFUsIDB4YmViZWQ5NjdVLCAweDM5Mzk0YjcyVSwKKyAgICAweDRhNGFkZTk0VSwgMHg0YzRjZDQ5OFUsIDB4NTg1OGU4YjBVLCAweGNmY2Y0YTg1VSwKKyAgICAweGQwZDA2YmJiVSwgMHhlZmVmMmFjNVUsIDB4YWFhYWU1NGZVLCAweGZiZmIxNmVkVSwKKyAgICAweDQzNDNjNTg2VSwgMHg0ZDRkZDc5YVUsIDB4MzMzMzU1NjZVLCAweDg1ODU5NDExVSwKKyAgICAweDQ1NDVjZjhhVSwgMHhmOWY5MTBlOVUsIDB4MDIwMjA2MDRVLCAweDdmN2Y4MWZlVSwKKyAgICAweDUwNTBmMGEwVSwgMHgzYzNjNDQ3OFUsIDB4OWY5ZmJhMjVVLCAweGE4YThlMzRiVSwKKyAgICAweDUxNTFmM2EyVSwgMHhhM2EzZmU1ZFUsIDB4NDA0MGMwODBVLCAweDhmOGY4YTA1VSwKKyAgICAweDkyOTJhZDNmVSwgMHg5ZDlkYmMyMVUsIDB4MzgzODQ4NzBVLCAweGY1ZjUwNGYxVSwKKyAgICAweGJjYmNkZjYzVSwgMHhiNmI2YzE3N1UsIDB4ZGFkYTc1YWZVLCAweDIxMjE2MzQyVSwKKyAgICAweDEwMTAzMDIwVSwgMHhmZmZmMWFlNVUsIDB4ZjNmMzBlZmRVLCAweGQyZDI2ZGJmVSwKKyAgICAweGNkY2Q0YzgxVSwgMHgwYzBjMTQxOFUsIDB4MTMxMzM1MjZVLCAweGVjZWMyZmMzVSwKKyAgICAweDVmNWZlMWJlVSwgMHg5Nzk3YTIzNVUsIDB4NDQ0NGNjODhVLCAweDE3MTczOTJlVSwKKyAgICAweGM0YzQ1NzkzVSwgMHhhN2E3ZjI1NVUsIDB4N2U3ZTgyZmNVLCAweDNkM2Q0NzdhVSwKKyAgICAweDY0NjRhY2M4VSwgMHg1ZDVkZTdiYVUsIDB4MTkxOTJiMzJVLCAweDczNzM5NWU2VSwKKyAgICAweDYwNjBhMGMwVSwgMHg4MTgxOTgxOVUsIDB4NGY0ZmQxOWVVLCAweGRjZGM3ZmEzVSwKKyAgICAweDIyMjI2NjQ0VSwgMHgyYTJhN2U1NFUsIDB4OTA5MGFiM2JVLCAweDg4ODg4MzBiVSwKKyAgICAweDQ2NDZjYThjVSwgMHhlZWVlMjljN1UsIDB4YjhiOGQzNmJVLCAweDE0MTQzYzI4VSwKKyAgICAweGRlZGU3OWE3VSwgMHg1ZTVlZTJiY1UsIDB4MGIwYjFkMTZVLCAweGRiZGI3NmFkVSwKKyAgICAweGUwZTAzYmRiVSwgMHgzMjMyNTY2NFUsIDB4M2EzYTRlNzRVLCAweDBhMGExZTE0VSwKKyAgICAweDQ5NDlkYjkyVSwgMHgwNjA2MGEwY1UsIDB4MjQyNDZjNDhVLCAweDVjNWNlNGI4VSwKKyAgICAweGMyYzI1ZDlmVSwgMHhkM2QzNmViZFUsIDB4YWNhY2VmNDNVLCAweDYyNjJhNmM0VSwKKyAgICAweDkxOTFhODM5VSwgMHg5NTk1YTQzMVUsIDB4ZTRlNDM3ZDNVLCAweDc5Nzk4YmYyVSwKKyAgICAweGU3ZTczMmQ1VSwgMHhjOGM4NDM4YlUsIDB4MzczNzU5NmVVLCAweDZkNmRiN2RhVSwKKyAgICAweDhkOGQ4YzAxVSwgMHhkNWQ1NjRiMVUsIDB4NGU0ZWQyOWNVLCAweGE5YTllMDQ5VSwKKyAgICAweDZjNmNiNGQ4VSwgMHg1NjU2ZmFhY1UsIDB4ZjRmNDA3ZjNVLCAweGVhZWEyNWNmVSwKKyAgICAweDY1NjVhZmNhVSwgMHg3YTdhOGVmNFUsIDB4YWVhZWU5NDdVLCAweDA4MDgxODEwVSwKKyAgICAweGJhYmFkNTZmVSwgMHg3ODc4ODhmMFUsIDB4MjUyNTZmNGFVLCAweDJlMmU3MjVjVSwKKyAgICAweDFjMWMyNDM4VSwgMHhhNmE2ZjE1N1UsIDB4YjRiNGM3NzNVLCAweGM2YzY1MTk3VSwKKyAgICAweGU4ZTgyM2NiVSwgMHhkZGRkN2NhMVUsIDB4NzQ3NDljZThVLCAweDFmMWYyMTNlVSwKKyAgICAweDRiNGJkZDk2VSwgMHhiZGJkZGM2MVUsIDB4OGI4Yjg2MGRVLCAweDhhOGE4NTBmVSwKKyAgICAweDcwNzA5MGUwVSwgMHgzZTNlNDI3Y1UsIDB4YjViNWM0NzFVLCAweDY2NjZhYWNjVSwKKyAgICAweDQ4NDhkODkwVSwgMHgwMzAzMDUwNlUsIDB4ZjZmNjAxZjdVLCAweDBlMGUxMjFjVSwKKyAgICAweDYxNjFhM2MyVSwgMHgzNTM1NWY2YVUsIDB4NTc1N2Y5YWVVLCAweGI5YjlkMDY5VSwKKyAgICAweDg2ODY5MTE3VSwgMHhjMWMxNTg5OVUsIDB4MWQxZDI3M2FVLCAweDllOWViOTI3VSwKKyAgICAweGUxZTEzOGQ5VSwgMHhmOGY4MTNlYlUsIDB4OTg5OGIzMmJVLCAweDExMTEzMzIyVSwKKyAgICAweDY5NjliYmQyVSwgMHhkOWQ5NzBhOVUsIDB4OGU4ZTg5MDdVLCAweDk0OTRhNzMzVSwKKyAgICAweDliOWJiNjJkVSwgMHgxZTFlMjIzY1UsIDB4ODc4NzkyMTVVLCAweGU5ZTkyMGM5VSwKKyAgICAweGNlY2U0OTg3VSwgMHg1NTU1ZmZhYVUsIDB4MjgyODc4NTBVLCAweGRmZGY3YWE1VSwKKyAgICAweDhjOGM4ZjAzVSwgMHhhMWExZjg1OVUsIDB4ODk4OTgwMDlVLCAweDBkMGQxNzFhVSwKKyAgICAweGJmYmZkYTY1VSwgMHhlNmU2MzFkN1UsIDB4NDI0MmM2ODRVLCAweDY4NjhiOGQwVSwKKyAgICAweDQxNDFjMzgyVSwgMHg5OTk5YjAyOVUsIDB4MmQyZDc3NWFVLCAweDBmMGYxMTFlVSwKKyAgICAweGIwYjBjYjdiVSwgMHg1NDU0ZmNhOFUsIDB4YmJiYmQ2NmRVLCAweDE2MTYzYTJjVSwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgVGQwWzI1Nl0gPSB7CisgICAgMHg1MWY0YTc1MFUsIDB4N2U0MTY1NTNVLCAweDFhMTdhNGMzVSwgMHgzYTI3NWU5NlUsCisgICAgMHgzYmFiNmJjYlUsIDB4MWY5ZDQ1ZjFVLCAweGFjZmE1OGFiVSwgMHg0YmUzMDM5M1UsCisgICAgMHgyMDMwZmE1NVUsIDB4YWQ3NjZkZjZVLCAweDg4Y2M3NjkxVSwgMHhmNTAyNGMyNVUsCisgICAgMHg0ZmU1ZDdmY1UsIDB4YzUyYWNiZDdVLCAweDI2MzU0NDgwVSwgMHhiNTYyYTM4ZlUsCisgICAgMHhkZWIxNWE0OVUsIDB4MjViYTFiNjdVLCAweDQ1ZWEwZTk4VSwgMHg1ZGZlYzBlMVUsCisgICAgMHhjMzJmNzUwMlUsIDB4ODE0Y2YwMTJVLCAweDhkNDY5N2EzVSwgMHg2YmQzZjljNlUsCisgICAgMHgwMzhmNWZlN1UsIDB4MTU5MjljOTVVLCAweGJmNmQ3YWViVSwgMHg5NTUyNTlkYVUsCisgICAgMHhkNGJlODMyZFUsIDB4NTg3NDIxZDNVLCAweDQ5ZTA2OTI5VSwgMHg4ZWM5Yzg0NFUsCisgICAgMHg3NWMyODk2YVUsIDB4ZjQ4ZTc5NzhVLCAweDk5NTgzZTZiVSwgMHgyN2I5NzFkZFUsCisgICAgMHhiZWUxNGZiNlUsIDB4ZjA4OGFkMTdVLCAweGM5MjBhYzY2VSwgMHg3ZGNlM2FiNFUsCisgICAgMHg2M2RmNGExOFUsIDB4ZTUxYTMxODJVLCAweDk3NTEzMzYwVSwgMHg2MjUzN2Y0NVUsCisgICAgMHhiMTY0NzdlMFUsIDB4YmI2YmFlODRVLCAweGZlODFhMDFjVSwgMHhmOTA4MmI5NFUsCisgICAgMHg3MDQ4Njg1OFUsIDB4OGY0NWZkMTlVLCAweDk0ZGU2Yzg3VSwgMHg1MjdiZjhiN1UsCisgICAgMHhhYjczZDMyM1UsIDB4NzI0YjAyZTJVLCAweGUzMWY4ZjU3VSwgMHg2NjU1YWIyYVUsCisgICAgMHhiMmViMjgwN1UsIDB4MmZiNWMyMDNVLCAweDg2YzU3YjlhVSwgMHhkMzM3MDhhNVUsCisgICAgMHgzMDI4ODdmMlUsIDB4MjNiZmE1YjJVLCAweDAyMDM2YWJhVSwgMHhlZDE2ODI1Y1UsCisgICAgMHg4YWNmMWMyYlUsIDB4YTc3OWI0OTJVLCAweGYzMDdmMmYwVSwgMHg0ZTY5ZTJhMVUsCisgICAgMHg2NWRhZjRjZFUsIDB4MDYwNWJlZDVVLCAweGQxMzQ2MjFmVSwgMHhjNGE2ZmU4YVUsCisgICAgMHgzNDJlNTM5ZFUsIDB4YTJmMzU1YTBVLCAweDA1OGFlMTMyVSwgMHhhNGY2ZWI3NVUsCisgICAgMHgwYjgzZWMzOVUsIDB4NDA2MGVmYWFVLCAweDVlNzE5ZjA2VSwgMHhiZDZlMTA1MVUsCisgICAgMHgzZTIxOGFmOVUsIDB4OTZkZDA2M2RVLCAweGRkM2UwNWFlVSwgMHg0ZGU2YmQ0NlUsCisgICAgMHg5MTU0OGRiNVUsIDB4NzFjNDVkMDVVLCAweDA0MDZkNDZmVSwgMHg2MDUwMTVmZlUsCisgICAgMHgxOTk4ZmIyNFUsIDB4ZDZiZGU5OTdVLCAweDg5NDA0M2NjVSwgMHg2N2Q5OWU3N1UsCisgICAgMHhiMGU4NDJiZFUsIDB4MDc4OThiODhVLCAweGU3MTk1YjM4VSwgMHg3OWM4ZWVkYlUsCisgICAgMHhhMTdjMGE0N1UsIDB4N2M0MjBmZTlVLCAweGY4ODQxZWM5VSwgMHgwMDAwMDAwMFUsCisgICAgMHgwOTgwODY4M1UsIDB4MzIyYmVkNDhVLCAweDFlMTE3MGFjVSwgMHg2YzVhNzI0ZVUsCisgICAgMHhmZDBlZmZmYlUsIDB4MGY4NTM4NTZVLCAweDNkYWVkNTFlVSwgMHgzNjJkMzkyN1UsCisgICAgMHgwYTBmZDk2NFUsIDB4Njg1Y2E2MjFVLCAweDliNWI1NGQxVSwgMHgyNDM2MmUzYVUsCisgICAgMHgwYzBhNjdiMVUsIDB4OTM1N2U3MGZVLCAweGI0ZWU5NmQyVSwgMHgxYjliOTE5ZVUsCisgICAgMHg4MGMwYzU0ZlUsIDB4NjFkYzIwYTJVLCAweDVhNzc0YjY5VSwgMHgxYzEyMWExNlUsCisgICAgMHhlMjkzYmEwYVUsIDB4YzBhMDJhZTVVLCAweDNjMjJlMDQzVSwgMHgxMjFiMTcxZFUsCisgICAgMHgwZTA5MGQwYlUsIDB4ZjI4YmM3YWRVLCAweDJkYjZhOGI5VSwgMHgxNDFlYTljOFUsCisgICAgMHg1N2YxMTk4NVUsIDB4YWY3NTA3NGNVLCAweGVlOTlkZGJiVSwgMHhhMzdmNjBmZFUsCisgICAgMHhmNzAxMjY5ZlUsIDB4NWM3MmY1YmNVLCAweDQ0NjYzYmM1VSwgMHg1YmZiN2UzNFUsCisgICAgMHg4YjQzMjk3NlUsIDB4Y2IyM2M2ZGNVLCAweGI2ZWRmYzY4VSwgMHhiOGU0ZjE2M1UsCisgICAgMHhkNzMxZGNjYVUsIDB4NDI2Mzg1MTBVLCAweDEzOTcyMjQwVSwgMHg4NGM2MTEyMFUsCisgICAgMHg4NTRhMjQ3ZFUsIDB4ZDJiYjNkZjhVLCAweGFlZjkzMjExVSwgMHhjNzI5YTE2ZFUsCisgICAgMHgxZDllMmY0YlUsIDB4ZGNiMjMwZjNVLCAweDBkODY1MmVjVSwgMHg3N2MxZTNkMFUsCisgICAgMHgyYmIzMTY2Y1UsIDB4YTk3MGI5OTlVLCAweDExOTQ0OGZhVSwgMHg0N2U5NjQyMlUsCisgICAgMHhhOGZjOGNjNFUsIDB4YTBmMDNmMWFVLCAweDU2N2QyY2Q4VSwgMHgyMjMzOTBlZlUsCisgICAgMHg4NzQ5NGVjN1UsIDB4ZDkzOGQxYzFVLCAweDhjY2FhMmZlVSwgMHg5OGQ0MGIzNlUsCisgICAgMHhhNmY1ODFjZlUsIDB4YTU3YWRlMjhVLCAweGRhYjc4ZTI2VSwgMHgzZmFkYmZhNFUsCisgICAgMHgyYzNhOWRlNFUsIDB4NTA3ODkyMGRVLCAweDZhNWZjYzliVSwgMHg1NDdlNDY2MlUsCisgICAgMHhmNjhkMTNjMlUsIDB4OTBkOGI4ZThVLCAweDJlMzlmNzVlVSwgMHg4MmMzYWZmNVUsCisgICAgMHg5ZjVkODBiZVUsIDB4NjlkMDkzN2NVLCAweDZmZDUyZGE5VSwgMHhjZjI1MTJiM1UsCisgICAgMHhjOGFjOTkzYlUsIDB4MTAxODdkYTdVLCAweGU4OWM2MzZlVSwgMHhkYjNiYmI3YlUsCisgICAgMHhjZDI2NzgwOVUsIDB4NmU1OTE4ZjRVLCAweGVjOWFiNzAxVSwgMHg4MzRmOWFhOFUsCisgICAgMHhlNjk1NmU2NVUsIDB4YWFmZmU2N2VVLCAweDIxYmNjZjA4VSwgMHhlZjE1ZThlNlUsCisgICAgMHhiYWU3OWJkOVUsIDB4NGE2ZjM2Y2VVLCAweGVhOWYwOWQ0VSwgMHgyOWIwN2NkNlUsCisgICAgMHgzMWE0YjJhZlUsIDB4MmEzZjIzMzFVLCAweGM2YTU5NDMwVSwgMHgzNWEyNjZjMFUsCisgICAgMHg3NDRlYmMzN1UsIDB4ZmM4MmNhYTZVLCAweGUwOTBkMGIwVSwgMHgzM2E3ZDgxNVUsCisgICAgMHhmMTA0OTg0YVUsIDB4NDFlY2RhZjdVLCAweDdmY2Q1MDBlVSwgMHgxNzkxZjYyZlUsCisgICAgMHg3NjRkZDY4ZFUsIDB4NDNlZmIwNGRVLCAweGNjYWE0ZDU0VSwgMHhlNDk2MDRkZlUsCisgICAgMHg5ZWQxYjVlM1UsIDB4NGM2YTg4MWJVLCAweGMxMmMxZmI4VSwgMHg0NjY1NTE3ZlUsCisgICAgMHg5ZDVlZWEwNFUsIDB4MDE4YzM1NWRVLCAweGZhODc3NDczVSwgMHhmYjBiNDEyZVUsCisgICAgMHhiMzY3MWQ1YVUsIDB4OTJkYmQyNTJVLCAweGU5MTA1NjMzVSwgMHg2ZGQ2NDcxM1UsCisgICAgMHg5YWQ3NjE4Y1UsIDB4MzdhMTBjN2FVLCAweDU5ZjgxNDhlVSwgMHhlYjEzM2M4OVUsCisgICAgMHhjZWE5MjdlZVUsIDB4Yjc2MWM5MzVVLCAweGUxMWNlNWVkVSwgMHg3YTQ3YjEzY1UsCisgICAgMHg5Y2QyZGY1OVUsIDB4NTVmMjczM2ZVLCAweDE4MTRjZTc5VSwgMHg3M2M3MzdiZlUsCisgICAgMHg1M2Y3Y2RlYVUsIDB4NWZmZGFhNWJVLCAweGRmM2Q2ZjE0VSwgMHg3ODQ0ZGI4NlUsCisgICAgMHhjYWFmZjM4MVUsIDB4Yjk2OGM0M2VVLCAweDM4MjQzNDJjVSwgMHhjMmEzNDA1ZlUsCisgICAgMHgxNjFkYzM3MlUsIDB4YmNlMjI1MGNVLCAweDI4M2M0OThiVSwgMHhmZjBkOTU0MVUsCisgICAgMHgzOWE4MDE3MVUsIDB4MDgwY2IzZGVVLCAweGQ4YjRlNDljVSwgMHg2NDU2YzE5MFUsCisgICAgMHg3YmNiODQ2MVUsIDB4ZDUzMmI2NzBVLCAweDQ4NmM1Yzc0VSwgMHhkMGI4NTc0MlUsCit9Oworc3RhdGljIGNvbnN0IHUzMiBUZDFbMjU2XSA9IHsKKyAgICAweDUwNTFmNGE3VSwgMHg1MzdlNDE2NVUsIDB4YzMxYTE3YTRVLCAweDk2M2EyNzVlVSwKKyAgICAweGNiM2JhYjZiVSwgMHhmMTFmOWQ0NVUsIDB4YWJhY2ZhNThVLCAweDkzNGJlMzAzVSwKKyAgICAweDU1MjAzMGZhVSwgMHhmNmFkNzY2ZFUsIDB4OTE4OGNjNzZVLCAweDI1ZjUwMjRjVSwKKyAgICAweGZjNGZlNWQ3VSwgMHhkN2M1MmFjYlUsIDB4ODAyNjM1NDRVLCAweDhmYjU2MmEzVSwKKyAgICAweDQ5ZGViMTVhVSwgMHg2NzI1YmExYlUsIDB4OTg0NWVhMGVVLCAweGUxNWRmZWMwVSwKKyAgICAweDAyYzMyZjc1VSwgMHgxMjgxNGNmMFUsIDB4YTM4ZDQ2OTdVLCAweGM2NmJkM2Y5VSwKKyAgICAweGU3MDM4ZjVmVSwgMHg5NTE1OTI5Y1UsIDB4ZWJiZjZkN2FVLCAweGRhOTU1MjU5VSwKKyAgICAweDJkZDRiZTgzVSwgMHhkMzU4NzQyMVUsIDB4Mjk0OWUwNjlVLCAweDQ0OGVjOWM4VSwKKyAgICAweDZhNzVjMjg5VSwgMHg3OGY0OGU3OVUsIDB4NmI5OTU4M2VVLCAweGRkMjdiOTcxVSwKKyAgICAweGI2YmVlMTRmVSwgMHgxN2YwODhhZFUsIDB4NjZjOTIwYWNVLCAweGI0N2RjZTNhVSwKKyAgICAweDE4NjNkZjRhVSwgMHg4MmU1MWEzMVUsIDB4NjA5NzUxMzNVLCAweDQ1NjI1MzdmVSwKKyAgICAweGUwYjE2NDc3VSwgMHg4NGJiNmJhZVUsIDB4MWNmZTgxYTBVLCAweDk0ZjkwODJiVSwKKyAgICAweDU4NzA0ODY4VSwgMHgxOThmNDVmZFUsIDB4ODc5NGRlNmNVLCAweGI3NTI3YmY4VSwKKyAgICAweDIzYWI3M2QzVSwgMHhlMjcyNGIwMlUsIDB4NTdlMzFmOGZVLCAweDJhNjY1NWFiVSwKKyAgICAweDA3YjJlYjI4VSwgMHgwMzJmYjVjMlUsIDB4OWE4NmM1N2JVLCAweGE1ZDMzNzA4VSwKKyAgICAweGYyMzAyODg3VSwgMHhiMjIzYmZhNVUsIDB4YmEwMjAzNmFVLCAweDVjZWQxNjgyVSwKKyAgICAweDJiOGFjZjFjVSwgMHg5MmE3NzliNFUsIDB4ZjBmMzA3ZjJVLCAweGExNGU2OWUyVSwKKyAgICAweGNkNjVkYWY0VSwgMHhkNTA2MDViZVUsIDB4MWZkMTM0NjJVLCAweDhhYzRhNmZlVSwKKyAgICAweDlkMzQyZTUzVSwgMHhhMGEyZjM1NVUsIDB4MzIwNThhZTFVLCAweDc1YTRmNmViVSwKKyAgICAweDM5MGI4M2VjVSwgMHhhYTQwNjBlZlUsIDB4MDY1ZTcxOWZVLCAweDUxYmQ2ZTEwVSwKKyAgICAweGY5M2UyMThhVSwgMHgzZDk2ZGQwNlUsIDB4YWVkZDNlMDVVLCAweDQ2NGRlNmJkVSwKKyAgICAweGI1OTE1NDhkVSwgMHgwNTcxYzQ1ZFUsIDB4NmYwNDA2ZDRVLCAweGZmNjA1MDE1VSwKKyAgICAweDI0MTk5OGZiVSwgMHg5N2Q2YmRlOVUsIDB4Y2M4OTQwNDNVLCAweDc3NjdkOTllVSwKKyAgICAweGJkYjBlODQyVSwgMHg4ODA3ODk4YlUsIDB4MzhlNzE5NWJVLCAweGRiNzljOGVlVSwKKyAgICAweDQ3YTE3YzBhVSwgMHhlOTdjNDIwZlUsIDB4YzlmODg0MWVVLCAweDAwMDAwMDAwVSwKKyAgICAweDgzMDk4MDg2VSwgMHg0ODMyMmJlZFUsIDB4YWMxZTExNzBVLCAweDRlNmM1YTcyVSwKKyAgICAweGZiZmQwZWZmVSwgMHg1NjBmODUzOFUsIDB4MWUzZGFlZDVVLCAweDI3MzYyZDM5VSwKKyAgICAweDY0MGEwZmQ5VSwgMHgyMTY4NWNhNlUsIDB4ZDE5YjViNTRVLCAweDNhMjQzNjJlVSwKKyAgICAweGIxMGMwYTY3VSwgMHgwZjkzNTdlN1UsIDB4ZDJiNGVlOTZVLCAweDllMWI5YjkxVSwKKyAgICAweDRmODBjMGM1VSwgMHhhMjYxZGMyMFUsIDB4Njk1YTc3NGJVLCAweDE2MWMxMjFhVSwKKyAgICAweDBhZTI5M2JhVSwgMHhlNWMwYTAyYVUsIDB4NDMzYzIyZTBVLCAweDFkMTIxYjE3VSwKKyAgICAweDBiMGUwOTBkVSwgMHhhZGYyOGJjN1UsIDB4YjkyZGI2YThVLCAweGM4MTQxZWE5VSwKKyAgICAweDg1NTdmMTE5VSwgMHg0Y2FmNzUwN1UsIDB4YmJlZTk5ZGRVLCAweGZkYTM3ZjYwVSwKKyAgICAweDlmZjcwMTI2VSwgMHhiYzVjNzJmNVUsIDB4YzU0NDY2M2JVLCAweDM0NWJmYjdlVSwKKyAgICAweDc2OGI0MzI5VSwgMHhkY2NiMjNjNlUsIDB4NjhiNmVkZmNVLCAweDYzYjhlNGYxVSwKKyAgICAweGNhZDczMWRjVSwgMHgxMDQyNjM4NVUsIDB4NDAxMzk3MjJVLCAweDIwODRjNjExVSwKKyAgICAweDdkODU0YTI0VSwgMHhmOGQyYmIzZFUsIDB4MTFhZWY5MzJVLCAweDZkYzcyOWExVSwKKyAgICAweDRiMWQ5ZTJmVSwgMHhmM2RjYjIzMFUsIDB4ZWMwZDg2NTJVLCAweGQwNzdjMWUzVSwKKyAgICAweDZjMmJiMzE2VSwgMHg5OWE5NzBiOVUsIDB4ZmExMTk0NDhVLCAweDIyNDdlOTY0VSwKKyAgICAweGM0YThmYzhjVSwgMHgxYWEwZjAzZlUsIDB4ZDg1NjdkMmNVLCAweGVmMjIzMzkwVSwKKyAgICAweGM3ODc0OTRlVSwgMHhjMWQ5MzhkMVUsIDB4ZmU4Y2NhYTJVLCAweDM2OThkNDBiVSwKKyAgICAweGNmYTZmNTgxVSwgMHgyOGE1N2FkZVUsIDB4MjZkYWI3OGVVLCAweGE0M2ZhZGJmVSwKKyAgICAweGU0MmMzYTlkVSwgMHgwZDUwNzg5MlUsIDB4OWI2YTVmY2NVLCAweDYyNTQ3ZTQ2VSwKKyAgICAweGMyZjY4ZDEzVSwgMHhlODkwZDhiOFUsIDB4NWUyZTM5ZjdVLCAweGY1ODJjM2FmVSwKKyAgICAweGJlOWY1ZDgwVSwgMHg3YzY5ZDA5M1UsIDB4YTk2ZmQ1MmRVLCAweGIzY2YyNTEyVSwKKyAgICAweDNiYzhhYzk5VSwgMHhhNzEwMTg3ZFUsIDB4NmVlODljNjNVLCAweDdiZGIzYmJiVSwKKyAgICAweDA5Y2QyNjc4VSwgMHhmNDZlNTkxOFUsIDB4MDFlYzlhYjdVLCAweGE4ODM0ZjlhVSwKKyAgICAweDY1ZTY5NTZlVSwgMHg3ZWFhZmZlNlUsIDB4MDgyMWJjY2ZVLCAweGU2ZWYxNWU4VSwKKyAgICAweGQ5YmFlNzliVSwgMHhjZTRhNmYzNlUsIDB4ZDRlYTlmMDlVLCAweGQ2MjliMDdjVSwKKyAgICAweGFmMzFhNGIyVSwgMHgzMTJhM2YyM1UsIDB4MzBjNmE1OTRVLCAweGMwMzVhMjY2VSwKKyAgICAweDM3NzQ0ZWJjVSwgMHhhNmZjODJjYVUsIDB4YjBlMDkwZDBVLCAweDE1MzNhN2Q4VSwKKyAgICAweDRhZjEwNDk4VSwgMHhmNzQxZWNkYVUsIDB4MGU3ZmNkNTBVLCAweDJmMTc5MWY2VSwKKyAgICAweDhkNzY0ZGQ2VSwgMHg0ZDQzZWZiMFUsIDB4NTRjY2FhNGRVLCAweGRmZTQ5NjA0VSwKKyAgICAweGUzOWVkMWI1VSwgMHgxYjRjNmE4OFUsIDB4YjhjMTJjMWZVLCAweDdmNDY2NTUxVSwKKyAgICAweDA0OWQ1ZWVhVSwgMHg1ZDAxOGMzNVUsIDB4NzNmYTg3NzRVLCAweDJlZmIwYjQxVSwKKyAgICAweDVhYjM2NzFkVSwgMHg1MjkyZGJkMlUsIDB4MzNlOTEwNTZVLCAweDEzNmRkNjQ3VSwKKyAgICAweDhjOWFkNzYxVSwgMHg3YTM3YTEwY1UsIDB4OGU1OWY4MTRVLCAweDg5ZWIxMzNjVSwKKyAgICAweGVlY2VhOTI3VSwgMHgzNWI3NjFjOVUsIDB4ZWRlMTFjZTVVLCAweDNjN2E0N2IxVSwKKyAgICAweDU5OWNkMmRmVSwgMHgzZjU1ZjI3M1UsIDB4NzkxODE0Y2VVLCAweGJmNzNjNzM3VSwKKyAgICAweGVhNTNmN2NkVSwgMHg1YjVmZmRhYVUsIDB4MTRkZjNkNmZVLCAweDg2Nzg0NGRiVSwKKyAgICAweDgxY2FhZmYzVSwgMHgzZWI5NjhjNFUsIDB4MmMzODI0MzRVLCAweDVmYzJhMzQwVSwKKyAgICAweDcyMTYxZGMzVSwgMHgwY2JjZTIyNVUsIDB4OGIyODNjNDlVLCAweDQxZmYwZDk1VSwKKyAgICAweDcxMzlhODAxVSwgMHhkZTA4MGNiM1UsIDB4OWNkOGI0ZTRVLCAweDkwNjQ1NmMxVSwKKyAgICAweDYxN2JjYjg0VSwgMHg3MGQ1MzJiNlUsIDB4NzQ0ODZjNWNVLCAweDQyZDBiODU3VSwKK307CitzdGF0aWMgY29uc3QgdTMyIFRkMlsyNTZdID0geworICAgIDB4YTc1MDUxZjRVLCAweDY1NTM3ZTQxVSwgMHhhNGMzMWExN1UsIDB4NWU5NjNhMjdVLAorICAgIDB4NmJjYjNiYWJVLCAweDQ1ZjExZjlkVSwgMHg1OGFiYWNmYVUsIDB4MDM5MzRiZTNVLAorICAgIDB4ZmE1NTIwMzBVLCAweDZkZjZhZDc2VSwgMHg3NjkxODhjY1UsIDB4NGMyNWY1MDJVLAorICAgIDB4ZDdmYzRmZTVVLCAweGNiZDdjNTJhVSwgMHg0NDgwMjYzNVUsIDB4YTM4ZmI1NjJVLAorICAgIDB4NWE0OWRlYjFVLCAweDFiNjcyNWJhVSwgMHgwZTk4NDVlYVUsIDB4YzBlMTVkZmVVLAorICAgIDB4NzUwMmMzMmZVLCAweGYwMTI4MTRjVSwgMHg5N2EzOGQ0NlUsIDB4ZjljNjZiZDNVLAorICAgIDB4NWZlNzAzOGZVLCAweDljOTUxNTkyVSwgMHg3YWViYmY2ZFUsIDB4NTlkYTk1NTJVLAorICAgIDB4ODMyZGQ0YmVVLCAweDIxZDM1ODc0VSwgMHg2OTI5NDllMFUsIDB4Yzg0NDhlYzlVLAorICAgIDB4ODk2YTc1YzJVLCAweDc5NzhmNDhlVSwgMHgzZTZiOTk1OFUsIDB4NzFkZDI3YjlVLAorICAgIDB4NGZiNmJlZTFVLCAweGFkMTdmMDg4VSwgMHhhYzY2YzkyMFUsIDB4M2FiNDdkY2VVLAorICAgIDB4NGExODYzZGZVLCAweDMxODJlNTFhVSwgMHgzMzYwOTc1MVUsIDB4N2Y0NTYyNTNVLAorICAgIDB4NzdlMGIxNjRVLCAweGFlODRiYjZiVSwgMHhhMDFjZmU4MVUsIDB4MmI5NGY5MDhVLAorICAgIDB4Njg1ODcwNDhVLCAweGZkMTk4ZjQ1VSwgMHg2Yzg3OTRkZVUsIDB4ZjhiNzUyN2JVLAorICAgIDB4ZDMyM2FiNzNVLCAweDAyZTI3MjRiVSwgMHg4ZjU3ZTMxZlUsIDB4YWIyYTY2NTVVLAorICAgIDB4MjgwN2IyZWJVLCAweGMyMDMyZmI1VSwgMHg3YjlhODZjNVUsIDB4MDhhNWQzMzdVLAorICAgIDB4ODdmMjMwMjhVLCAweGE1YjIyM2JmVSwgMHg2YWJhMDIwM1UsIDB4ODI1Y2VkMTZVLAorICAgIDB4MWMyYjhhY2ZVLCAweGI0OTJhNzc5VSwgMHhmMmYwZjMwN1UsIDB4ZTJhMTRlNjlVLAorICAgIDB4ZjRjZDY1ZGFVLCAweGJlZDUwNjA1VSwgMHg2MjFmZDEzNFUsIDB4ZmU4YWM0YTZVLAorICAgIDB4NTM5ZDM0MmVVLCAweDU1YTBhMmYzVSwgMHhlMTMyMDU4YVUsIDB4ZWI3NWE0ZjZVLAorICAgIDB4ZWMzOTBiODNVLCAweGVmYWE0MDYwVSwgMHg5ZjA2NWU3MVUsIDB4MTA1MWJkNmVVLAorICAgIDB4OGFmOTNlMjFVLCAweDA2M2Q5NmRkVSwgMHgwNWFlZGQzZVUsIDB4YmQ0NjRkZTZVLAorICAgIDB4OGRiNTkxNTRVLCAweDVkMDU3MWM0VSwgMHhkNDZmMDQwNlUsIDB4MTVmZjYwNTBVLAorICAgIDB4ZmIyNDE5OThVLCAweGU5OTdkNmJkVSwgMHg0M2NjODk0MFUsIDB4OWU3NzY3ZDlVLAorICAgIDB4NDJiZGIwZThVLCAweDhiODgwNzg5VSwgMHg1YjM4ZTcxOVUsIDB4ZWVkYjc5YzhVLAorICAgIDB4MGE0N2ExN2NVLCAweDBmZTk3YzQyVSwgMHgxZWM5Zjg4NFUsIDB4MDAwMDAwMDBVLAorICAgIDB4ODY4MzA5ODBVLCAweGVkNDgzMjJiVSwgMHg3MGFjMWUxMVUsIDB4NzI0ZTZjNWFVLAorICAgIDB4ZmZmYmZkMGVVLCAweDM4NTYwZjg1VSwgMHhkNTFlM2RhZVUsIDB4MzkyNzM2MmRVLAorICAgIDB4ZDk2NDBhMGZVLCAweGE2MjE2ODVjVSwgMHg1NGQxOWI1YlUsIDB4MmUzYTI0MzZVLAorICAgIDB4NjdiMTBjMGFVLCAweGU3MGY5MzU3VSwgMHg5NmQyYjRlZVUsIDB4OTE5ZTFiOWJVLAorICAgIDB4YzU0ZjgwYzBVLCAweDIwYTI2MWRjVSwgMHg0YjY5NWE3N1UsIDB4MWExNjFjMTJVLAorICAgIDB4YmEwYWUyOTNVLCAweDJhZTVjMGEwVSwgMHhlMDQzM2MyMlUsIDB4MTcxZDEyMWJVLAorICAgIDB4MGQwYjBlMDlVLCAweGM3YWRmMjhiVSwgMHhhOGI5MmRiNlUsIDB4YTljODE0MWVVLAorICAgIDB4MTk4NTU3ZjFVLCAweDA3NGNhZjc1VSwgMHhkZGJiZWU5OVUsIDB4NjBmZGEzN2ZVLAorICAgIDB4MjY5ZmY3MDFVLCAweGY1YmM1YzcyVSwgMHgzYmM1NDQ2NlUsIDB4N2UzNDViZmJVLAorICAgIDB4Mjk3NjhiNDNVLCAweGM2ZGNjYjIzVSwgMHhmYzY4YjZlZFUsIDB4ZjE2M2I4ZTRVLAorICAgIDB4ZGNjYWQ3MzFVLCAweDg1MTA0MjYzVSwgMHgyMjQwMTM5N1UsIDB4MTEyMDg0YzZVLAorICAgIDB4MjQ3ZDg1NGFVLCAweDNkZjhkMmJiVSwgMHgzMjExYWVmOVUsIDB4YTE2ZGM3MjlVLAorICAgIDB4MmY0YjFkOWVVLCAweDMwZjNkY2IyVSwgMHg1MmVjMGQ4NlUsIDB4ZTNkMDc3YzFVLAorICAgIDB4MTY2YzJiYjNVLCAweGI5OTlhOTcwVSwgMHg0OGZhMTE5NFUsIDB4NjQyMjQ3ZTlVLAorICAgIDB4OGNjNGE4ZmNVLCAweDNmMWFhMGYwVSwgMHgyY2Q4NTY3ZFUsIDB4OTBlZjIyMzNVLAorICAgIDB4NGVjNzg3NDlVLCAweGQxYzFkOTM4VSwgMHhhMmZlOGNjYVUsIDB4MGIzNjk4ZDRVLAorICAgIDB4ODFjZmE2ZjVVLCAweGRlMjhhNTdhVSwgMHg4ZTI2ZGFiN1UsIDB4YmZhNDNmYWRVLAorICAgIDB4OWRlNDJjM2FVLCAweDkyMGQ1MDc4VSwgMHhjYzliNmE1ZlUsIDB4NDY2MjU0N2VVLAorICAgIDB4MTNjMmY2OGRVLCAweGI4ZTg5MGQ4VSwgMHhmNzVlMmUzOVUsIDB4YWZmNTgyYzNVLAorICAgIDB4ODBiZTlmNWRVLCAweDkzN2M2OWQwVSwgMHgyZGE5NmZkNVUsIDB4MTJiM2NmMjVVLAorICAgIDB4OTkzYmM4YWNVLCAweDdkYTcxMDE4VSwgMHg2MzZlZTg5Y1UsIDB4YmI3YmRiM2JVLAorICAgIDB4NzgwOWNkMjZVLCAweDE4ZjQ2ZTU5VSwgMHhiNzAxZWM5YVUsIDB4OWFhODgzNGZVLAorICAgIDB4NmU2NWU2OTVVLCAweGU2N2VhYWZmVSwgMHhjZjA4MjFiY1UsIDB4ZThlNmVmMTVVLAorICAgIDB4OWJkOWJhZTdVLCAweDM2Y2U0YTZmVSwgMHgwOWQ0ZWE5ZlUsIDB4N2NkNjI5YjBVLAorICAgIDB4YjJhZjMxYTRVLCAweDIzMzEyYTNmVSwgMHg5NDMwYzZhNVUsIDB4NjZjMDM1YTJVLAorICAgIDB4YmMzNzc0NGVVLCAweGNhYTZmYzgyVSwgMHhkMGIwZTA5MFUsIDB4ZDgxNTMzYTdVLAorICAgIDB4OTg0YWYxMDRVLCAweGRhZjc0MWVjVSwgMHg1MDBlN2ZjZFUsIDB4ZjYyZjE3OTFVLAorICAgIDB4ZDY4ZDc2NGRVLCAweGIwNGQ0M2VmVSwgMHg0ZDU0Y2NhYVUsIDB4MDRkZmU0OTZVLAorICAgIDB4YjVlMzllZDFVLCAweDg4MWI0YzZhVSwgMHgxZmI4YzEyY1UsIDB4NTE3ZjQ2NjVVLAorICAgIDB4ZWEwNDlkNWVVLCAweDM1NWQwMThjVSwgMHg3NDczZmE4N1UsIDB4NDEyZWZiMGJVLAorICAgIDB4MWQ1YWIzNjdVLCAweGQyNTI5MmRiVSwgMHg1NjMzZTkxMFUsIDB4NDcxMzZkZDZVLAorICAgIDB4NjE4YzlhZDdVLCAweDBjN2EzN2ExVSwgMHgxNDhlNTlmOFUsIDB4M2M4OWViMTNVLAorICAgIDB4MjdlZWNlYTlVLCAweGM5MzViNzYxVSwgMHhlNWVkZTExY1UsIDB4YjEzYzdhNDdVLAorICAgIDB4ZGY1OTljZDJVLCAweDczM2Y1NWYyVSwgMHhjZTc5MTgxNFUsIDB4MzdiZjczYzdVLAorICAgIDB4Y2RlYTUzZjdVLCAweGFhNWI1ZmZkVSwgMHg2ZjE0ZGYzZFUsIDB4ZGI4Njc4NDRVLAorICAgIDB4ZjM4MWNhYWZVLCAweGM0M2ViOTY4VSwgMHgzNDJjMzgyNFUsIDB4NDA1ZmMyYTNVLAorICAgIDB4YzM3MjE2MWRVLCAweDI1MGNiY2UyVSwgMHg0OThiMjgzY1UsIDB4OTU0MWZmMGRVLAorICAgIDB4MDE3MTM5YThVLCAweGIzZGUwODBjVSwgMHhlNDljZDhiNFUsIDB4YzE5MDY0NTZVLAorICAgIDB4ODQ2MTdiY2JVLCAweGI2NzBkNTMyVSwgMHg1Yzc0NDg2Y1UsIDB4NTc0MmQwYjhVLAorfTsKK3N0YXRpYyBjb25zdCB1MzIgVGQzWzI1Nl0gPSB7CisgICAgMHhmNGE3NTA1MVUsIDB4NDE2NTUzN2VVLCAweDE3YTRjMzFhVSwgMHgyNzVlOTYzYVUsCisgICAgMHhhYjZiY2IzYlUsIDB4OWQ0NWYxMWZVLCAweGZhNThhYmFjVSwgMHhlMzAzOTM0YlUsCisgICAgMHgzMGZhNTUyMFUsIDB4NzY2ZGY2YWRVLCAweGNjNzY5MTg4VSwgMHgwMjRjMjVmNVUsCisgICAgMHhlNWQ3ZmM0ZlUsIDB4MmFjYmQ3YzVVLCAweDM1NDQ4MDI2VSwgMHg2MmEzOGZiNVUsCisgICAgMHhiMTVhNDlkZVUsIDB4YmExYjY3MjVVLCAweGVhMGU5ODQ1VSwgMHhmZWMwZTE1ZFUsCisgICAgMHgyZjc1MDJjM1UsIDB4NGNmMDEyODFVLCAweDQ2OTdhMzhkVSwgMHhkM2Y5YzY2YlUsCisgICAgMHg4ZjVmZTcwM1UsIDB4OTI5Yzk1MTVVLCAweDZkN2FlYmJmVSwgMHg1MjU5ZGE5NVUsCisgICAgMHhiZTgzMmRkNFUsIDB4NzQyMWQzNThVLCAweGUwNjkyOTQ5VSwgMHhjOWM4NDQ4ZVUsCisgICAgMHhjMjg5NmE3NVUsIDB4OGU3OTc4ZjRVLCAweDU4M2U2Yjk5VSwgMHhiOTcxZGQyN1UsCisgICAgMHhlMTRmYjZiZVUsIDB4ODhhZDE3ZjBVLCAweDIwYWM2NmM5VSwgMHhjZTNhYjQ3ZFUsCisgICAgMHhkZjRhMTg2M1UsIDB4MWEzMTgyZTVVLCAweDUxMzM2MDk3VSwgMHg1MzdmNDU2MlUsCisgICAgMHg2NDc3ZTBiMVUsIDB4NmJhZTg0YmJVLCAweDgxYTAxY2ZlVSwgMHgwODJiOTRmOVUsCisgICAgMHg0ODY4NTg3MFUsIDB4NDVmZDE5OGZVLCAweGRlNmM4Nzk0VSwgMHg3YmY4Yjc1MlUsCisgICAgMHg3M2QzMjNhYlUsIDB4NGIwMmUyNzJVLCAweDFmOGY1N2UzVSwgMHg1NWFiMmE2NlUsCisgICAgMHhlYjI4MDdiMlUsIDB4YjVjMjAzMmZVLCAweGM1N2I5YTg2VSwgMHgzNzA4YTVkM1UsCisgICAgMHgyODg3ZjIzMFUsIDB4YmZhNWIyMjNVLCAweDAzNmFiYTAyVSwgMHgxNjgyNWNlZFUsCisgICAgMHhjZjFjMmI4YVUsIDB4NzliNDkyYTdVLCAweDA3ZjJmMGYzVSwgMHg2OWUyYTE0ZVUsCisgICAgMHhkYWY0Y2Q2NVUsIDB4MDViZWQ1MDZVLCAweDM0NjIxZmQxVSwgMHhhNmZlOGFjNFUsCisgICAgMHgyZTUzOWQzNFUsIDB4ZjM1NWEwYTJVLCAweDhhZTEzMjA1VSwgMHhmNmViNzVhNFUsCisgICAgMHg4M2VjMzkwYlUsIDB4NjBlZmFhNDBVLCAweDcxOWYwNjVlVSwgMHg2ZTEwNTFiZFUsCisgICAgMHgyMThhZjkzZVUsIDB4ZGQwNjNkOTZVLCAweDNlMDVhZWRkVSwgMHhlNmJkNDY0ZFUsCisgICAgMHg1NDhkYjU5MVUsIDB4YzQ1ZDA1NzFVLCAweDA2ZDQ2ZjA0VSwgMHg1MDE1ZmY2MFUsCisgICAgMHg5OGZiMjQxOVUsIDB4YmRlOTk3ZDZVLCAweDQwNDNjYzg5VSwgMHhkOTllNzc2N1UsCisgICAgMHhlODQyYmRiMFUsIDB4ODk4Yjg4MDdVLCAweDE5NWIzOGU3VSwgMHhjOGVlZGI3OVUsCisgICAgMHg3YzBhNDdhMVUsIDB4NDIwZmU5N2NVLCAweDg0MWVjOWY4VSwgMHgwMDAwMDAwMFUsCisgICAgMHg4MDg2ODMwOVUsIDB4MmJlZDQ4MzJVLCAweDExNzBhYzFlVSwgMHg1YTcyNGU2Y1UsCisgICAgMHgwZWZmZmJmZFUsIDB4ODUzODU2MGZVLCAweGFlZDUxZTNkVSwgMHgyZDM5MjczNlUsCisgICAgMHgwZmQ5NjQwYVUsIDB4NWNhNjIxNjhVLCAweDViNTRkMTliVSwgMHgzNjJlM2EyNFUsCisgICAgMHgwYTY3YjEwY1UsIDB4NTdlNzBmOTNVLCAweGVlOTZkMmI0VSwgMHg5YjkxOWUxYlUsCisgICAgMHhjMGM1NGY4MFUsIDB4ZGMyMGEyNjFVLCAweDc3NGI2OTVhVSwgMHgxMjFhMTYxY1UsCisgICAgMHg5M2JhMGFlMlUsIDB4YTAyYWU1YzBVLCAweDIyZTA0MzNjVSwgMHgxYjE3MWQxMlUsCisgICAgMHgwOTBkMGIwZVUsIDB4OGJjN2FkZjJVLCAweGI2YThiOTJkVSwgMHgxZWE5YzgxNFUsCisgICAgMHhmMTE5ODU1N1UsIDB4NzUwNzRjYWZVLCAweDk5ZGRiYmVlVSwgMHg3ZjYwZmRhM1UsCisgICAgMHgwMTI2OWZmN1UsIDB4NzJmNWJjNWNVLCAweDY2M2JjNTQ0VSwgMHhmYjdlMzQ1YlUsCisgICAgMHg0MzI5NzY4YlUsIDB4MjNjNmRjY2JVLCAweGVkZmM2OGI2VSwgMHhlNGYxNjNiOFUsCisgICAgMHgzMWRjY2FkN1UsIDB4NjM4NTEwNDJVLCAweDk3MjI0MDEzVSwgMHhjNjExMjA4NFUsCisgICAgMHg0YTI0N2Q4NVUsIDB4YmIzZGY4ZDJVLCAweGY5MzIxMWFlVSwgMHgyOWExNmRjN1UsCisgICAgMHg5ZTJmNGIxZFUsIDB4YjIzMGYzZGNVLCAweDg2NTJlYzBkVSwgMHhjMWUzZDA3N1UsCisgICAgMHhiMzE2NmMyYlUsIDB4NzBiOTk5YTlVLCAweDk0NDhmYTExVSwgMHhlOTY0MjI0N1UsCisgICAgMHhmYzhjYzRhOFUsIDB4ZjAzZjFhYTBVLCAweDdkMmNkODU2VSwgMHgzMzkwZWYyMlUsCisgICAgMHg0OTRlYzc4N1UsIDB4MzhkMWMxZDlVLCAweGNhYTJmZThjVSwgMHhkNDBiMzY5OFUsCisgICAgMHhmNTgxY2ZhNlUsIDB4N2FkZTI4YTVVLCAweGI3OGUyNmRhVSwgMHhhZGJmYTQzZlUsCisgICAgMHgzYTlkZTQyY1UsIDB4Nzg5MjBkNTBVLCAweDVmY2M5YjZhVSwgMHg3ZTQ2NjI1NFUsCisgICAgMHg4ZDEzYzJmNlUsIDB4ZDhiOGU4OTBVLCAweDM5Zjc1ZTJlVSwgMHhjM2FmZjU4MlUsCisgICAgMHg1ZDgwYmU5ZlUsIDB4ZDA5MzdjNjlVLCAweGQ1MmRhOTZmVSwgMHgyNTEyYjNjZlUsCisgICAgMHhhYzk5M2JjOFUsIDB4MTg3ZGE3MTBVLCAweDljNjM2ZWU4VSwgMHgzYmJiN2JkYlUsCisgICAgMHgyNjc4MDljZFUsIDB4NTkxOGY0NmVVLCAweDlhYjcwMWVjVSwgMHg0ZjlhYTg4M1UsCisgICAgMHg5NTZlNjVlNlUsIDB4ZmZlNjdlYWFVLCAweGJjY2YwODIxVSwgMHgxNWU4ZTZlZlUsCisgICAgMHhlNzliZDliYVUsIDB4NmYzNmNlNGFVLCAweDlmMDlkNGVhVSwgMHhiMDdjZDYyOVUsCisgICAgMHhhNGIyYWYzMVUsIDB4M2YyMzMxMmFVLCAweGE1OTQzMGM2VSwgMHhhMjY2YzAzNVUsCisgICAgMHg0ZWJjMzc3NFUsIDB4ODJjYWE2ZmNVLCAweDkwZDBiMGUwVSwgMHhhN2Q4MTUzM1UsCisgICAgMHgwNDk4NGFmMVUsIDB4ZWNkYWY3NDFVLCAweGNkNTAwZTdmVSwgMHg5MWY2MmYxN1UsCisgICAgMHg0ZGQ2OGQ3NlUsIDB4ZWZiMDRkNDNVLCAweGFhNGQ1NGNjVSwgMHg5NjA0ZGZlNFUsCisgICAgMHhkMWI1ZTM5ZVUsIDB4NmE4ODFiNGNVLCAweDJjMWZiOGMxVSwgMHg2NTUxN2Y0NlUsCisgICAgMHg1ZWVhMDQ5ZFUsIDB4OGMzNTVkMDFVLCAweDg3NzQ3M2ZhVSwgMHgwYjQxMmVmYlUsCisgICAgMHg2NzFkNWFiM1UsIDB4ZGJkMjUyOTJVLCAweDEwNTYzM2U5VSwgMHhkNjQ3MTM2ZFUsCisgICAgMHhkNzYxOGM5YVUsIDB4YTEwYzdhMzdVLCAweGY4MTQ4ZTU5VSwgMHgxMzNjODllYlUsCisgICAgMHhhOTI3ZWVjZVUsIDB4NjFjOTM1YjdVLCAweDFjZTVlZGUxVSwgMHg0N2IxM2M3YVUsCisgICAgMHhkMmRmNTk5Y1UsIDB4ZjI3MzNmNTVVLCAweDE0Y2U3OTE4VSwgMHhjNzM3YmY3M1UsCisgICAgMHhmN2NkZWE1M1UsIDB4ZmRhYTViNWZVLCAweDNkNmYxNGRmVSwgMHg0NGRiODY3OFUsCisgICAgMHhhZmYzODFjYVUsIDB4NjhjNDNlYjlVLCAweDI0MzQyYzM4VSwgMHhhMzQwNWZjMlUsCisgICAgMHgxZGMzNzIxNlUsIDB4ZTIyNTBjYmNVLCAweDNjNDk4YjI4VSwgMHgwZDk1NDFmZlUsCisgICAgMHhhODAxNzEzOVUsIDB4MGNiM2RlMDhVLCAweGI0ZTQ5Y2Q4VSwgMHg1NmMxOTA2NFUsCisgICAgMHhjYjg0NjE3YlUsIDB4MzJiNjcwZDVVLCAweDZjNWM3NDQ4VSwgMHhiODU3NDJkMFUsCit9Oworc3RhdGljIGNvbnN0IHU4IFRkNFsyNTZdID0geworICAgIDB4NTJVLCAweDA5VSwgMHg2YVUsIDB4ZDVVLCAweDMwVSwgMHgzNlUsIDB4YTVVLCAweDM4VSwKKyAgICAweGJmVSwgMHg0MFUsIDB4YTNVLCAweDllVSwgMHg4MVUsIDB4ZjNVLCAweGQ3VSwgMHhmYlUsCisgICAgMHg3Y1UsIDB4ZTNVLCAweDM5VSwgMHg4MlUsIDB4OWJVLCAweDJmVSwgMHhmZlUsIDB4ODdVLAorICAgIDB4MzRVLCAweDhlVSwgMHg0M1UsIDB4NDRVLCAweGM0VSwgMHhkZVUsIDB4ZTlVLCAweGNiVSwKKyAgICAweDU0VSwgMHg3YlUsIDB4OTRVLCAweDMyVSwgMHhhNlUsIDB4YzJVLCAweDIzVSwgMHgzZFUsCisgICAgMHhlZVUsIDB4NGNVLCAweDk1VSwgMHgwYlUsIDB4NDJVLCAweGZhVSwgMHhjM1UsIDB4NGVVLAorICAgIDB4MDhVLCAweDJlVSwgMHhhMVUsIDB4NjZVLCAweDI4VSwgMHhkOVUsIDB4MjRVLCAweGIyVSwKKyAgICAweDc2VSwgMHg1YlUsIDB4YTJVLCAweDQ5VSwgMHg2ZFUsIDB4OGJVLCAweGQxVSwgMHgyNVUsCisgICAgMHg3MlUsIDB4ZjhVLCAweGY2VSwgMHg2NFUsIDB4ODZVLCAweDY4VSwgMHg5OFUsIDB4MTZVLAorICAgIDB4ZDRVLCAweGE0VSwgMHg1Y1UsIDB4Y2NVLCAweDVkVSwgMHg2NVUsIDB4YjZVLCAweDkyVSwKKyAgICAweDZjVSwgMHg3MFUsIDB4NDhVLCAweDUwVSwgMHhmZFUsIDB4ZWRVLCAweGI5VSwgMHhkYVUsCisgICAgMHg1ZVUsIDB4MTVVLCAweDQ2VSwgMHg1N1UsIDB4YTdVLCAweDhkVSwgMHg5ZFUsIDB4ODRVLAorICAgIDB4OTBVLCAweGQ4VSwgMHhhYlUsIDB4MDBVLCAweDhjVSwgMHhiY1UsIDB4ZDNVLCAweDBhVSwKKyAgICAweGY3VSwgMHhlNFUsIDB4NThVLCAweDA1VSwgMHhiOFUsIDB4YjNVLCAweDQ1VSwgMHgwNlUsCisgICAgMHhkMFUsIDB4MmNVLCAweDFlVSwgMHg4ZlUsIDB4Y2FVLCAweDNmVSwgMHgwZlUsIDB4MDJVLAorICAgIDB4YzFVLCAweGFmVSwgMHhiZFUsIDB4MDNVLCAweDAxVSwgMHgxM1UsIDB4OGFVLCAweDZiVSwKKyAgICAweDNhVSwgMHg5MVUsIDB4MTFVLCAweDQxVSwgMHg0ZlUsIDB4NjdVLCAweGRjVSwgMHhlYVUsCisgICAgMHg5N1UsIDB4ZjJVLCAweGNmVSwgMHhjZVUsIDB4ZjBVLCAweGI0VSwgMHhlNlUsIDB4NzNVLAorICAgIDB4OTZVLCAweGFjVSwgMHg3NFUsIDB4MjJVLCAweGU3VSwgMHhhZFUsIDB4MzVVLCAweDg1VSwKKyAgICAweGUyVSwgMHhmOVUsIDB4MzdVLCAweGU4VSwgMHgxY1UsIDB4NzVVLCAweGRmVSwgMHg2ZVUsCisgICAgMHg0N1UsIDB4ZjFVLCAweDFhVSwgMHg3MVUsIDB4MWRVLCAweDI5VSwgMHhjNVUsIDB4ODlVLAorICAgIDB4NmZVLCAweGI3VSwgMHg2MlUsIDB4MGVVLCAweGFhVSwgMHgxOFUsIDB4YmVVLCAweDFiVSwKKyAgICAweGZjVSwgMHg1NlUsIDB4M2VVLCAweDRiVSwgMHhjNlUsIDB4ZDJVLCAweDc5VSwgMHgyMFUsCisgICAgMHg5YVUsIDB4ZGJVLCAweGMwVSwgMHhmZVUsIDB4NzhVLCAweGNkVSwgMHg1YVUsIDB4ZjRVLAorICAgIDB4MWZVLCAweGRkVSwgMHhhOFUsIDB4MzNVLCAweDg4VSwgMHgwN1UsIDB4YzdVLCAweDMxVSwKKyAgICAweGIxVSwgMHgxMlUsIDB4MTBVLCAweDU5VSwgMHgyN1UsIDB4ODBVLCAweGVjVSwgMHg1ZlUsCisgICAgMHg2MFUsIDB4NTFVLCAweDdmVSwgMHhhOVUsIDB4MTlVLCAweGI1VSwgMHg0YVUsIDB4MGRVLAorICAgIDB4MmRVLCAweGU1VSwgMHg3YVUsIDB4OWZVLCAweDkzVSwgMHhjOVUsIDB4OWNVLCAweGVmVSwKKyAgICAweGEwVSwgMHhlMFUsIDB4M2JVLCAweDRkVSwgMHhhZVUsIDB4MmFVLCAweGY1VSwgMHhiMFUsCisgICAgMHhjOFUsIDB4ZWJVLCAweGJiVSwgMHgzY1UsIDB4ODNVLCAweDUzVSwgMHg5OVUsIDB4NjFVLAorICAgIDB4MTdVLCAweDJiVSwgMHgwNFUsIDB4N2VVLCAweGJhVSwgMHg3N1UsIDB4ZDZVLCAweDI2VSwKKyAgICAweGUxVSwgMHg2OVUsIDB4MTRVLCAweDYzVSwgMHg1NVUsIDB4MjFVLCAweDBjVSwgMHg3ZFUsCit9Oworc3RhdGljIGNvbnN0IHUzMiByY29uW10gPSB7CisJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMCwKKwkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwLAorCTB4MUIwMDAwMDAsIDB4MzYwMDAwMDAsIC8qIGZvciAxMjgtYml0IGJsb2NrcywgUmlqbmRhZWwgbmV2ZXIgdXNlcyBtb3JlIHRoYW4gMTAgcmNvbiB2YWx1ZXMgKi8KK307CisKKy8qKgorICogRXhwYW5kIHRoZSBjaXBoZXIga2V5IGludG8gdGhlIGVuY3J5cHRpb24ga2V5IHNjaGVkdWxlLgorICovCitpbnQgQUVTX3NldF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywKKwkJCUFFU19LRVkgKmtleSkgeworCisJdTMyICpyazsKKyAgIAlpbnQgaSA9IDA7CisJdTMyIHRlbXA7CisKKwlpZiAoIXVzZXJLZXkgfHwgIWtleSkKKwkJcmV0dXJuIC0xOworCWlmIChiaXRzICE9IDEyOCAmJiBiaXRzICE9IDE5MiAmJiBiaXRzICE9IDI1NikKKwkJcmV0dXJuIC0yOworCisJcmsgPSBrZXktPnJkX2tleTsKKworCWlmIChiaXRzPT0xMjgpCisJCWtleS0+cm91bmRzID0gMTA7CisJZWxzZSBpZiAoYml0cz09MTkyKQorCQlrZXktPnJvdW5kcyA9IDEyOworCWVsc2UKKwkJa2V5LT5yb3VuZHMgPSAxNDsKKworCXJrWzBdID0gR0VUVTMyKHVzZXJLZXkgICAgICk7CisJcmtbMV0gPSBHRVRVMzIodXNlcktleSArICA0KTsKKwlya1syXSA9IEdFVFUzMih1c2VyS2V5ICsgIDgpOworCXJrWzNdID0gR0VUVTMyKHVzZXJLZXkgKyAxMik7CisJaWYgKGJpdHMgPT0gMTI4KSB7CisJCXdoaWxlICgxKSB7CisJCQl0ZW1wICA9IHJrWzNdOworCQkJcmtbNF0gPSBya1swXSBeCisJCQkJKFRlMlsodGVtcCA+PiAxNikgJiAweGZmXSAmIDB4ZmYwMDAwMDApIF4KKwkJCQkoVGUzWyh0ZW1wID4+ICA4KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkJCShUZTBbKHRlbXAgICAgICApICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCisJCQkJKFRlMVsodGVtcCA+PiAyNCkgICAgICAgXSAmIDB4MDAwMDAwZmYpIF4KKwkJCQlyY29uW2ldOworCQkJcmtbNV0gPSBya1sxXSBeIHJrWzRdOworCQkJcmtbNl0gPSBya1syXSBeIHJrWzVdOworCQkJcmtbN10gPSBya1szXSBeIHJrWzZdOworCQkJaWYgKCsraSA9PSAxMCkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmsgKz0gNDsKKwkJfQorCX0KKwlya1s0XSA9IEdFVFUzMih1c2VyS2V5ICsgMTYpOworCXJrWzVdID0gR0VUVTMyKHVzZXJLZXkgKyAyMCk7CisJaWYgKGJpdHMgPT0gMTkyKSB7CisJCXdoaWxlICgxKSB7CisJCQl0ZW1wID0gcmtbIDVdOworCQkJcmtbIDZdID0gcmtbIDBdIF4KKwkJCQkoVGUyWyh0ZW1wID4+IDE2KSAmIDB4ZmZdICYgMHhmZjAwMDAwMCkgXgorCQkJCShUZTNbKHRlbXAgPj4gIDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisJCQkJKFRlMFsodGVtcCAgICAgICkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJCQkoVGUxWyh0ZW1wID4+IDI0KSAgICAgICBdICYgMHgwMDAwMDBmZikgXgorCQkJCXJjb25baV07CisJCQlya1sgN10gPSBya1sgMV0gXiBya1sgNl07CisJCQlya1sgOF0gPSBya1sgMl0gXiBya1sgN107CisJCQlya1sgOV0gPSBya1sgM10gXiBya1sgOF07CisJCQlpZiAoKytpID09IDgpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXJrWzEwXSA9IHJrWyA0XSBeIHJrWyA5XTsKKwkJCXJrWzExXSA9IHJrWyA1XSBeIHJrWzEwXTsKKwkJCXJrICs9IDY7CisJCX0KKwl9CisJcmtbNl0gPSBHRVRVMzIodXNlcktleSArIDI0KTsKKwlya1s3XSA9IEdFVFUzMih1c2VyS2V5ICsgMjgpOworCWlmIChiaXRzID09IDI1NikgeworCQl3aGlsZSAoMSkgeworCQkJdGVtcCA9IHJrWyA3XTsKKwkJCXJrWyA4XSA9IHJrWyAwXSBeCisJCQkJKFRlMlsodGVtcCA+PiAxNikgJiAweGZmXSAmIDB4ZmYwMDAwMDApIF4KKwkJCQkoVGUzWyh0ZW1wID4+ICA4KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkJCShUZTBbKHRlbXAgICAgICApICYgMHhmZl0gJiAweDAwMDBmZjAwKSBeCisJCQkJKFRlMVsodGVtcCA+PiAyNCkgICAgICAgXSAmIDB4MDAwMDAwZmYpIF4KKwkJCQlyY29uW2ldOworCQkJcmtbIDldID0gcmtbIDFdIF4gcmtbIDhdOworCQkJcmtbMTBdID0gcmtbIDJdIF4gcmtbIDldOworCQkJcmtbMTFdID0gcmtbIDNdIF4gcmtbMTBdOworCQkJaWYgKCsraSA9PSA3KSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQl0ZW1wID0gcmtbMTFdOworCQkJcmtbMTJdID0gcmtbIDRdIF4KKwkJCQkoVGUyWyh0ZW1wID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMCkgXgorCQkJCShUZTNbKHRlbXAgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwKSBeCisJCQkJKFRlMFsodGVtcCA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJCQkoVGUxWyh0ZW1wICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZik7CisJCQlya1sxM10gPSBya1sgNV0gXiBya1sxMl07CisJCQlya1sxNF0gPSBya1sgNl0gXiBya1sxM107CisJCQlya1sxNV0gPSBya1sgN10gXiBya1sxNF07CisKKwkJCXJrICs9IDg7CisgICAgICAgIAl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIEV4cGFuZCB0aGUgY2lwaGVyIGtleSBpbnRvIHRoZSBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZS4KKyAqLworaW50IEFFU19zZXRfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisJCQkgQUVTX0tFWSAqa2V5KSB7CisKKyAgICAgICAgdTMyICpyazsKKwlpbnQgaSwgaiwgc3RhdHVzOworCXUzMiB0ZW1wOworCisJLyogZmlyc3QsIHN0YXJ0IHdpdGggYW4gZW5jcnlwdGlvbiBzY2hlZHVsZSAqLworCXN0YXR1cyA9IEFFU19zZXRfZW5jcnlwdF9rZXkodXNlcktleSwgYml0cywga2V5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXJrID0ga2V5LT5yZF9rZXk7CisKKwkvKiBpbnZlcnQgdGhlIG9yZGVyIG9mIHRoZSByb3VuZCBrZXlzOiAqLworCWZvciAoaSA9IDAsIGogPSA0KihrZXktPnJvdW5kcyk7IGkgPCBqOyBpICs9IDQsIGogLT0gNCkgeworCQl0ZW1wID0gcmtbaSAgICBdOyBya1tpICAgIF0gPSBya1tqICAgIF07IHJrW2ogICAgXSA9IHRlbXA7CisJCXRlbXAgPSBya1tpICsgMV07IHJrW2kgKyAxXSA9IHJrW2ogKyAxXTsgcmtbaiArIDFdID0gdGVtcDsKKwkJdGVtcCA9IHJrW2kgKyAyXTsgcmtbaSArIDJdID0gcmtbaiArIDJdOyBya1tqICsgMl0gPSB0ZW1wOworCQl0ZW1wID0gcmtbaSArIDNdOyBya1tpICsgM10gPSBya1tqICsgM107IHJrW2ogKyAzXSA9IHRlbXA7CisJfQorCS8qIGFwcGx5IHRoZSBpbnZlcnNlIE1peENvbHVtbiB0cmFuc2Zvcm0gdG8gYWxsIHJvdW5kIGtleXMgYnV0IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3Q6ICovCisJZm9yIChpID0gMTsgaSA8IChrZXktPnJvdW5kcyk7IGkrKykgeworCQlyayArPSA0OworCQlya1swXSA9CisJCQlUZDBbVGUxWyhya1swXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KKwkJCVRkMVtUZTFbKHJrWzBdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgorCQkJVGQyW1RlMVsocmtbMF0gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDNbVGUxWyhya1swXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOworCQlya1sxXSA9CisJCQlUZDBbVGUxWyhya1sxXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KKwkJCVRkMVtUZTFbKHJrWzFdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgorCQkJVGQyW1RlMVsocmtbMV0gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDNbVGUxWyhya1sxXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOworCQlya1syXSA9CisJCQlUZDBbVGUxWyhya1syXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KKwkJCVRkMVtUZTFbKHJrWzJdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgorCQkJVGQyW1RlMVsocmtbMl0gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDNbVGUxWyhya1syXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOworCQlya1szXSA9CisJCQlUZDBbVGUxWyhya1szXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdIF4KKwkJCVRkMVtUZTFbKHJrWzNdID4+IDE2KSAmIDB4ZmZdICYgMHhmZl0gXgorCQkJVGQyW1RlMVsocmtbM10gPj4gIDgpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDNbVGUxWyhya1szXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY3J5cHQgYSBzaW5nbGUgYmxvY2sKKyAqIGluIGFuZCBvdXQgY2FuIG92ZXJsYXAKKyAqLwordm9pZCBBRVNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisKKwljb25zdCB1MzIgKnJrOworCXUzMiBzMCwgczEsIHMyLCBzMywgdDAsIHQxLCB0MiwgdDM7CisjaWZuZGVmIEZVTExfVU5ST0xMCisJaW50IHI7CisjZW5kaWYgLyogP0ZVTExfVU5ST0xMICovCisKKwlhc3NlcnQoaW4gJiYgb3V0ICYmIGtleSk7CisJcmsgPSBrZXktPnJkX2tleTsKKworCS8qCisJICogbWFwIGJ5dGUgYXJyYXkgYmxvY2sgdG8gY2lwaGVyIHN0YXRlCisJICogYW5kIGFkZCBpbml0aWFsIHJvdW5kIGtleToKKwkgKi8KKwlzMCA9IEdFVFUzMihpbiAgICAgKSBeIHJrWzBdOworCXMxID0gR0VUVTMyKGluICsgIDQpIF4gcmtbMV07CisJczIgPSBHRVRVMzIoaW4gKyAgOCkgXiBya1syXTsKKwlzMyA9IEdFVFUzMihpbiArIDEyKSBeIHJrWzNdOworI2lmZGVmIEZVTExfVU5ST0xMCisJLyogcm91bmQgMTogKi8KKyAgIAl0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMyAmIDB4ZmZdIF4gcmtbIDRdOworICAgCXQxID0gVGUwW3MxID4+IDI0XSBeIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MwICYgMHhmZl0gXiBya1sgNV07CisgICAJdDIgPSBUZTBbczIgPj4gMjRdIF4gVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRlMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZTNbczEgJiAweGZmXSBeIHJrWyA2XTsKKyAgIAl0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMiAmIDB4ZmZdIF4gcmtbIDddOworICAgCS8qIHJvdW5kIDI6ICovCisgICAJczAgPSBUZTBbdDAgPj4gMjRdIF4gVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDMgJiAweGZmXSBeIHJrWyA4XTsKKyAgIAlzMSA9IFRlMFt0MSA+PiAyNF0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MCAmIDB4ZmZdIF4gcmtbIDldOworICAgCXMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QxICYgMHhmZl0gXiBya1sxMF07CisgICAJczMgPSBUZTBbdDMgPj4gMjRdIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDIgJiAweGZmXSBeIHJrWzExXTsKKwkvKiByb3VuZCAzOiAqLworICAgCXQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MzICYgMHhmZl0gXiBya1sxMl07CisgICAJdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZTNbczAgJiAweGZmXSBeIHJrWzEzXTsKKyAgIAl0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbMTRdOworICAgCXQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MyICYgMHhmZl0gXiBya1sxNV07CisgICAJLyogcm91bmQgNDogKi8KKyAgIAlzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MyAmIDB4ZmZdIF4gcmtbMTZdOworICAgCXMxID0gVGUwW3QxID4+IDI0XSBeIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QwICYgMHhmZl0gXiBya1sxN107CisgICAJczIgPSBUZTBbdDIgPj4gMjRdIF4gVGUxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRlMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDEgJiAweGZmXSBeIHJrWzE4XTsKKyAgIAlzMyA9IFRlMFt0MyA+PiAyNF0gXiBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MiAmIDB4ZmZdIF4gcmtbMTldOworCS8qIHJvdW5kIDU6ICovCisgICAJdDAgPSBUZTBbczAgPj4gMjRdIF4gVGUxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRlMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZTNbczMgJiAweGZmXSBeIHJrWzIwXTsKKyAgIAl0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMCAmIDB4ZmZdIF4gcmtbMjFdOworICAgCXQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MxICYgMHhmZl0gXiBya1syMl07CisgICAJdDMgPSBUZTBbczMgPj4gMjRdIF4gVGUxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRlMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZTNbczIgJiAweGZmXSBeIHJrWzIzXTsKKyAgIAkvKiByb3VuZCA2OiAqLworICAgCXMwID0gVGUwW3QwID4+IDI0XSBeIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QzICYgMHhmZl0gXiBya1syNF07CisgICAJczEgPSBUZTBbdDEgPj4gMjRdIF4gVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRlMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDAgJiAweGZmXSBeIHJrWzI1XTsKKyAgIAlzMiA9IFRlMFt0MiA+PiAyNF0gXiBUZTFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MSAmIDB4ZmZdIF4gcmtbMjZdOworICAgCXMzID0gVGUwW3QzID4+IDI0XSBeIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QyICYgMHhmZl0gXiBya1syN107CisJLyogcm91bmQgNzogKi8KKyAgIAl0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMyAmIDB4ZmZdIF4gcmtbMjhdOworICAgCXQxID0gVGUwW3MxID4+IDI0XSBeIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MwICYgMHhmZl0gXiBya1syOV07CisgICAJdDIgPSBUZTBbczIgPj4gMjRdIF4gVGUxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRlMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZTNbczEgJiAweGZmXSBeIHJrWzMwXTsKKyAgIAl0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMiAmIDB4ZmZdIF4gcmtbMzFdOworICAgCS8qIHJvdW5kIDg6ICovCisgICAJczAgPSBUZTBbdDAgPj4gMjRdIF4gVGUxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRlMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDMgJiAweGZmXSBeIHJrWzMyXTsKKyAgIAlzMSA9IFRlMFt0MSA+PiAyNF0gXiBUZTFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MCAmIDB4ZmZdIF4gcmtbMzNdOworICAgCXMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QxICYgMHhmZl0gXiBya1szNF07CisgICAJczMgPSBUZTBbdDMgPj4gMjRdIF4gVGUxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRlMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDIgJiAweGZmXSBeIHJrWzM1XTsKKwkvKiByb3VuZCA5OiAqLworICAgCXQwID0gVGUwW3MwID4+IDI0XSBeIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MzICYgMHhmZl0gXiBya1szNl07CisgICAJdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZTNbczAgJiAweGZmXSBeIHJrWzM3XTsKKyAgIAl0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbMzhdOworICAgCXQzID0gVGUwW3MzID4+IDI0XSBeIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MyICYgMHhmZl0gXiBya1szOV07CisgICAgaWYgKGtleS0+cm91bmRzID4gMTApIHsKKyAgICAgICAgLyogcm91bmQgMTA6ICovCisgICAgICAgIHMwID0gVGUwW3QwID4+IDI0XSBeIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QzICYgMHhmZl0gXiBya1s0MF07CisgICAgICAgIHMxID0gVGUwW3QxID4+IDI0XSBeIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QwICYgMHhmZl0gXiBya1s0MV07CisgICAgICAgIHMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QxICYgMHhmZl0gXiBya1s0Ml07CisgICAgICAgIHMzID0gVGUwW3QzID4+IDI0XSBeIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QyICYgMHhmZl0gXiBya1s0M107CisgICAgICAgIC8qIHJvdW5kIDExOiAqLworICAgICAgICB0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMyAmIDB4ZmZdIF4gcmtbNDRdOworICAgICAgICB0MSA9IFRlMFtzMSA+PiAyNF0gXiBUZTFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMCAmIDB4ZmZdIF4gcmtbNDVdOworICAgICAgICB0MiA9IFRlMFtzMiA+PiAyNF0gXiBUZTFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMSAmIDB4ZmZdIF4gcmtbNDZdOworICAgICAgICB0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMiAmIDB4ZmZdIF4gcmtbNDddOworICAgICAgICBpZiAoa2V5LT5yb3VuZHMgPiAxMikgeworICAgICAgICAgICAgLyogcm91bmQgMTI6ICovCisgICAgICAgICAgICBzMCA9IFRlMFt0MCA+PiAyNF0gXiBUZTFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MyAmIDB4ZmZdIF4gcmtbNDhdOworICAgICAgICAgICAgczEgPSBUZTBbdDEgPj4gMjRdIF4gVGUxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRlMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZTNbdDAgJiAweGZmXSBeIHJrWzQ5XTsKKyAgICAgICAgICAgIHMyID0gVGUwW3QyID4+IDI0XSBeIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3QxICYgMHhmZl0gXiBya1s1MF07CisgICAgICAgICAgICBzMyA9IFRlMFt0MyA+PiAyNF0gXiBUZTFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRlM1t0MiAmIDB4ZmZdIF4gcmtbNTFdOworICAgICAgICAgICAgLyogcm91bmQgMTM6ICovCisgICAgICAgICAgICB0MCA9IFRlMFtzMCA+PiAyNF0gXiBUZTFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMyAmIDB4ZmZdIF4gcmtbNTJdOworICAgICAgICAgICAgdDEgPSBUZTBbczEgPj4gMjRdIF4gVGUxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRlMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZTNbczAgJiAweGZmXSBeIHJrWzUzXTsKKyAgICAgICAgICAgIHQyID0gVGUwW3MyID4+IDI0XSBeIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZTJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGUzW3MxICYgMHhmZl0gXiBya1s1NF07CisgICAgICAgICAgICB0MyA9IFRlMFtzMyA+PiAyNF0gXiBUZTFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRlM1tzMiAmIDB4ZmZdIF4gcmtbNTVdOworICAgICAgICB9CisgICAgfQorICAgIHJrICs9IGtleS0+cm91bmRzIDw8IDI7CisjZWxzZSAgLyogIUZVTExfVU5ST0xMICovCisgICAgLyoKKyAgICAgKiBOciAtIDEgZnVsbCByb3VuZHM6CisgICAgICovCisgICAgciA9IGtleS0+cm91bmRzID4+IDE7CisgICAgZm9yICg7OykgeworICAgICAgICB0MCA9CisgICAgICAgICAgICBUZTBbKHMwID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIFRlMVsoczEgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgVGUyWyhzMiA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBUZTNbKHMzICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzRdOworICAgICAgICB0MSA9CisgICAgICAgICAgICBUZTBbKHMxID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIFRlMVsoczIgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgVGUyWyhzMyA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBUZTNbKHMwICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzVdOworICAgICAgICB0MiA9CisgICAgICAgICAgICBUZTBbKHMyID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIFRlMVsoczMgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgVGUyWyhzMCA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBUZTNbKHMxICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzZdOworICAgICAgICB0MyA9CisgICAgICAgICAgICBUZTBbKHMzID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIFRlMVsoczAgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgVGUyWyhzMSA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBUZTNbKHMyICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzddOworCisgICAgICAgIHJrICs9IDg7CisgICAgICAgIGlmICgtLXIgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzMCA9CisgICAgICAgICAgICBUZTBbKHQwID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIFRlMVsodDEgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgVGUyWyh0MiA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBUZTNbKHQzICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzBdOworICAgICAgICBzMSA9CisgICAgICAgICAgICBUZTBbKHQxID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIFRlMVsodDIgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgVGUyWyh0MyA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBUZTNbKHQwICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzFdOworICAgICAgICBzMiA9CisgICAgICAgICAgICBUZTBbKHQyID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIFRlMVsodDMgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgVGUyWyh0MCA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBUZTNbKHQxICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzJdOworICAgICAgICBzMyA9CisgICAgICAgICAgICBUZTBbKHQzID4+IDI0KSAgICAgICBdIF4KKyAgICAgICAgICAgIFRlMVsodDAgPj4gMTYpICYgMHhmZl0gXgorICAgICAgICAgICAgVGUyWyh0MSA+PiAgOCkgJiAweGZmXSBeCisgICAgICAgICAgICBUZTNbKHQyICAgICAgKSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIHJrWzNdOworICAgIH0KKyNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KKyAgICAvKgorCSAqIGFwcGx5IGxhc3Qgcm91bmQgYW5kCisJICogbWFwIGNpcGhlciBzdGF0ZSB0byBieXRlIGFycmF5IGJsb2NrOgorCSAqLworCXMwID0KKwkJKFRlMlsodDAgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisJCShUZTNbKHQxID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkoVGUwWyh0MiA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJKFRlMVsodDMgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzBdOworCVBVVFUzMihvdXQgICAgICwgczApOworCXMxID0KKwkJKFRlMlsodDEgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisJCShUZTNbKHQyID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkoVGUwWyh0MyA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJKFRlMVsodDAgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzFdOworCVBVVFUzMihvdXQgKyAgNCwgczEpOworCXMyID0KKwkJKFRlMlsodDIgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisJCShUZTNbKHQzID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkoVGUwWyh0MCA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJKFRlMVsodDEgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzJdOworCVBVVFUzMihvdXQgKyAgOCwgczIpOworCXMzID0KKwkJKFRlMlsodDMgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwKSBeCisJCShUZTNbKHQwID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkgXgorCQkoVGUwWyh0MSA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApIF4KKwkJKFRlMVsodDIgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmKSBeCisJCXJrWzNdOworCVBVVFUzMihvdXQgKyAxMiwgczMpOworfQorCisvKgorICogRGVjcnlwdCBhIHNpbmdsZSBibG9jaworICogaW4gYW5kIG91dCBjYW4gb3ZlcmxhcAorICovCit2b2lkIEFFU19kZWNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSBjb25zdCBBRVNfS0VZICprZXkpIHsKKworCWNvbnN0IHUzMiAqcms7CisJdTMyIHMwLCBzMSwgczIsIHMzLCB0MCwgdDEsIHQyLCB0MzsKKyNpZm5kZWYgRlVMTF9VTlJPTEwKKwlpbnQgcjsKKyNlbmRpZiAvKiA/RlVMTF9VTlJPTEwgKi8KKworCWFzc2VydChpbiAmJiBvdXQgJiYga2V5KTsKKwlyayA9IGtleS0+cmRfa2V5OworCisJLyoKKwkgKiBtYXAgYnl0ZSBhcnJheSBibG9jayB0byBjaXBoZXIgc3RhdGUKKwkgKiBhbmQgYWRkIGluaXRpYWwgcm91bmQga2V5OgorCSAqLworICAgIHMwID0gR0VUVTMyKGluICAgICApIF4gcmtbMF07CisgICAgczEgPSBHRVRVMzIoaW4gKyAgNCkgXiBya1sxXTsKKyAgICBzMiA9IEdFVFUzMihpbiArICA4KSBeIHJrWzJdOworICAgIHMzID0gR0VUVTMyKGluICsgMTIpIF4gcmtbM107CisjaWZkZWYgRlVMTF9VTlJPTEwKKyAgICAvKiByb3VuZCAxOiAqLworICAgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MxICYgMHhmZl0gXiBya1sgNF07CisgICAgdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZDNbczIgJiAweGZmXSBeIHJrWyA1XTsKKyAgICB0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMyAmIDB4ZmZdIF4gcmtbIDZdOworICAgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MwICYgMHhmZl0gXiBya1sgN107CisgICAgLyogcm91bmQgMjogKi8KKyAgICBzMCA9IFRkMFt0MCA+PiAyNF0gXiBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MSAmIDB4ZmZdIF4gcmtbIDhdOworICAgIHMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QyICYgMHhmZl0gXiBya1sgOV07CisgICAgczIgPSBUZDBbdDIgPj4gMjRdIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDMgJiAweGZmXSBeIHJrWzEwXTsKKyAgICBzMyA9IFRkMFt0MyA+PiAyNF0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MCAmIDB4ZmZdIF4gcmtbMTFdOworICAgIC8qIHJvdW5kIDM6ICovCisgICAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZDNbczEgJiAweGZmXSBeIHJrWzEyXTsKKyAgICB0MSA9IFRkMFtzMSA+PiAyNF0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMiAmIDB4ZmZdIF4gcmtbMTNdOworICAgIHQyID0gVGQwW3MyID4+IDI0XSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MzICYgMHhmZl0gXiBya1sxNF07CisgICAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZDNbczAgJiAweGZmXSBeIHJrWzE1XTsKKyAgICAvKiByb3VuZCA0OiAqLworICAgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QxICYgMHhmZl0gXiBya1sxNl07CisgICAgczEgPSBUZDBbdDEgPj4gMjRdIF4gVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRkMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDIgJiAweGZmXSBeIHJrWzE3XTsKKyAgICBzMiA9IFRkMFt0MiA+PiAyNF0gXiBUZDFbKHQxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MCA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MyAmIDB4ZmZdIF4gcmtbMThdOworICAgIHMzID0gVGQwW3QzID4+IDI0XSBeIFRkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QwICYgMHhmZl0gXiBya1sxOV07CisgICAgLyogcm91bmQgNTogKi8KKyAgICB0MCA9IFRkMFtzMCA+PiAyNF0gXiBUZDFbKHMzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMiA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMSAmIDB4ZmZdIF4gcmtbMjBdOworICAgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MyICYgMHhmZl0gXiBya1syMV07CisgICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZDNbczMgJiAweGZmXSBeIHJrWzIyXTsKKyAgICB0MyA9IFRkMFtzMyA+PiAyNF0gXiBUZDFbKHMyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMSA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMCAmIDB4ZmZdIF4gcmtbMjNdOworICAgIC8qIHJvdW5kIDY6ICovCisgICAgczAgPSBUZDBbdDAgPj4gMjRdIF4gVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDEgJiAweGZmXSBeIHJrWzI0XTsKKyAgICBzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MiAmIDB4ZmZdIF4gcmtbMjVdOworICAgIHMyID0gVGQwW3QyID4+IDI0XSBeIFRkMVsodDEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QzICYgMHhmZl0gXiBya1syNl07CisgICAgczMgPSBUZDBbdDMgPj4gMjRdIF4gVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDAgJiAweGZmXSBeIHJrWzI3XTsKKyAgICAvKiByb3VuZCA3OiAqLworICAgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MxICYgMHhmZl0gXiBya1syOF07CisgICAgdDEgPSBUZDBbczEgPj4gMjRdIF4gVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeIFRkMlsoczMgPj4gIDgpICYgMHhmZl0gXiBUZDNbczIgJiAweGZmXSBeIHJrWzI5XTsKKyAgICB0MiA9IFRkMFtzMiA+PiAyNF0gXiBUZDFbKHMxID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMCA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMyAmIDB4ZmZdIF4gcmtbMzBdOworICAgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MwICYgMHhmZl0gXiBya1szMV07CisgICAgLyogcm91bmQgODogKi8KKyAgICBzMCA9IFRkMFt0MCA+PiAyNF0gXiBUZDFbKHQzID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MiA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MSAmIDB4ZmZdIF4gcmtbMzJdOworICAgIHMxID0gVGQwW3QxID4+IDI0XSBeIFRkMVsodDAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QyICYgMHhmZl0gXiBya1szM107CisgICAgczIgPSBUZDBbdDIgPj4gMjRdIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDMgJiAweGZmXSBeIHJrWzM0XTsKKyAgICBzMyA9IFRkMFt0MyA+PiAyNF0gXiBUZDFbKHQyID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MSA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MCAmIDB4ZmZdIF4gcmtbMzVdOworICAgIC8qIHJvdW5kIDk6ICovCisgICAgdDAgPSBUZDBbczAgPj4gMjRdIF4gVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeIFRkMlsoczIgPj4gIDgpICYgMHhmZl0gXiBUZDNbczEgJiAweGZmXSBeIHJrWzM2XTsKKyAgICB0MSA9IFRkMFtzMSA+PiAyNF0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMiAmIDB4ZmZdIF4gcmtbMzddOworICAgIHQyID0gVGQwW3MyID4+IDI0XSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MzICYgMHhmZl0gXiBya1szOF07CisgICAgdDMgPSBUZDBbczMgPj4gMjRdIF4gVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeIFRkMlsoczEgPj4gIDgpICYgMHhmZl0gXiBUZDNbczAgJiAweGZmXSBeIHJrWzM5XTsKKyAgICBpZiAoa2V5LT5yb3VuZHMgPiAxMCkgeworICAgICAgICAvKiByb3VuZCAxMDogKi8KKyAgICAgICAgczAgPSBUZDBbdDAgPj4gMjRdIF4gVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeIFRkMlsodDIgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDEgJiAweGZmXSBeIHJrWzQwXTsKKyAgICAgICAgczEgPSBUZDBbdDEgPj4gMjRdIF4gVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeIFRkMlsodDMgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDIgJiAweGZmXSBeIHJrWzQxXTsKKyAgICAgICAgczIgPSBUZDBbdDIgPj4gMjRdIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDMgJiAweGZmXSBeIHJrWzQyXTsKKyAgICAgICAgczMgPSBUZDBbdDMgPj4gMjRdIF4gVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeIFRkMlsodDEgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDAgJiAweGZmXSBeIHJrWzQzXTsKKyAgICAgICAgLyogcm91bmQgMTE6ICovCisgICAgICAgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MxICYgMHhmZl0gXiBya1s0NF07CisgICAgICAgIHQxID0gVGQwW3MxID4+IDI0XSBeIFRkMVsoczAgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MyICYgMHhmZl0gXiBya1s0NV07CisgICAgICAgIHQyID0gVGQwW3MyID4+IDI0XSBeIFRkMVsoczEgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MzICYgMHhmZl0gXiBya1s0Nl07CisgICAgICAgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MwICYgMHhmZl0gXiBya1s0N107CisgICAgICAgIGlmIChrZXktPnJvdW5kcyA+IDEyKSB7CisgICAgICAgICAgICAvKiByb3VuZCAxMjogKi8KKyAgICAgICAgICAgIHMwID0gVGQwW3QwID4+IDI0XSBeIFRkMVsodDMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QxICYgMHhmZl0gXiBya1s0OF07CisgICAgICAgICAgICBzMSA9IFRkMFt0MSA+PiAyNF0gXiBUZDFbKHQwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyh0MyA+PiAgOCkgJiAweGZmXSBeIFRkM1t0MiAmIDB4ZmZdIF4gcmtbNDldOworICAgICAgICAgICAgczIgPSBUZDBbdDIgPj4gMjRdIF4gVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeIFRkMlsodDAgPj4gIDgpICYgMHhmZl0gXiBUZDNbdDMgJiAweGZmXSBeIHJrWzUwXTsKKyAgICAgICAgICAgIHMzID0gVGQwW3QzID4+IDI0XSBeIFRkMVsodDIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHQxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3QwICYgMHhmZl0gXiBya1s1MV07CisgICAgICAgICAgICAvKiByb3VuZCAxMzogKi8KKyAgICAgICAgICAgIHQwID0gVGQwW3MwID4+IDI0XSBeIFRkMVsoczMgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MxICYgMHhmZl0gXiBya1s1Ml07CisgICAgICAgICAgICB0MSA9IFRkMFtzMSA+PiAyNF0gXiBUZDFbKHMwID4+IDE2KSAmIDB4ZmZdIF4gVGQyWyhzMyA+PiAgOCkgJiAweGZmXSBeIFRkM1tzMiAmIDB4ZmZdIF4gcmtbNTNdOworICAgICAgICAgICAgdDIgPSBUZDBbczIgPj4gMjRdIF4gVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeIFRkMlsoczAgPj4gIDgpICYgMHhmZl0gXiBUZDNbczMgJiAweGZmXSBeIHJrWzU0XTsKKyAgICAgICAgICAgIHQzID0gVGQwW3MzID4+IDI0XSBeIFRkMVsoczIgPj4gMTYpICYgMHhmZl0gXiBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4gVGQzW3MwICYgMHhmZl0gXiBya1s1NV07CisgICAgICAgIH0KKyAgICB9CisJcmsgKz0ga2V5LT5yb3VuZHMgPDwgMjsKKyNlbHNlICAvKiAhRlVMTF9VTlJPTEwgKi8KKyAgICAvKgorICAgICAqIE5yIC0gMSBmdWxsIHJvdW5kczoKKyAgICAgKi8KKyAgICByID0ga2V5LT5yb3VuZHMgPj4gMTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHQwID0KKyAgICAgICAgICAgIFRkMFsoczAgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgVGQxWyhzMyA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBUZDJbKHMyID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIFRkM1soczEgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbNF07CisgICAgICAgIHQxID0KKyAgICAgICAgICAgIFRkMFsoczEgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgVGQxWyhzMCA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBUZDJbKHMzID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIFRkM1soczIgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbNV07CisgICAgICAgIHQyID0KKyAgICAgICAgICAgIFRkMFsoczIgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgVGQxWyhzMSA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBUZDJbKHMwID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIFRkM1soczMgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbNl07CisgICAgICAgIHQzID0KKyAgICAgICAgICAgIFRkMFsoczMgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgVGQxWyhzMiA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBUZDJbKHMxID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIFRkM1soczAgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbN107CisKKyAgICAgICAgcmsgKz0gODsKKyAgICAgICAgaWYgKC0tciA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHMwID0KKyAgICAgICAgICAgIFRkMFsodDAgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgVGQxWyh0MyA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBUZDJbKHQyID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIFRkM1sodDEgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbMF07CisgICAgICAgIHMxID0KKyAgICAgICAgICAgIFRkMFsodDEgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgVGQxWyh0MCA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBUZDJbKHQzID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIFRkM1sodDIgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbMV07CisgICAgICAgIHMyID0KKyAgICAgICAgICAgIFRkMFsodDIgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgVGQxWyh0MSA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBUZDJbKHQwID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIFRkM1sodDMgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbMl07CisgICAgICAgIHMzID0KKyAgICAgICAgICAgIFRkMFsodDMgPj4gMjQpICAgICAgIF0gXgorICAgICAgICAgICAgVGQxWyh0MiA+PiAxNikgJiAweGZmXSBeCisgICAgICAgICAgICBUZDJbKHQxID4+ICA4KSAmIDB4ZmZdIF4KKyAgICAgICAgICAgIFRkM1sodDAgICAgICApICYgMHhmZl0gXgorICAgICAgICAgICAgcmtbM107CisgICAgfQorI2VuZGlmIC8qID9GVUxMX1VOUk9MTCAqLworICAgIC8qCisJICogYXBwbHkgbGFzdCByb3VuZCBhbmQKKwkgKiBtYXAgY2lwaGVyIHN0YXRlIHRvIGJ5dGUgYXJyYXkgYmxvY2s6CisJICovCisgICAJczAgPQorICAgCQkoVGQ0Wyh0MCA+PiAyNCkgICAgICAgXSA8PCAyNCkgXgorICAgCQkoVGQ0Wyh0MyA+PiAxNikgJiAweGZmXSA8PCAxNikgXgorICAgCQkoVGQ0Wyh0MiA+PiAgOCkgJiAweGZmXSA8PCAgOCkgXgorICAgCQkoVGQ0Wyh0MSAgICAgICkgJiAweGZmXSkgICAgICAgXgorICAgCQlya1swXTsKKwlQVVRVMzIob3V0ICAgICAsIHMwKTsKKyAgIAlzMSA9CisgICAJCShUZDRbKHQxID4+IDI0KSAgICAgICBdIDw8IDI0KSBeCisgICAJCShUZDRbKHQwID4+IDE2KSAmIDB4ZmZdIDw8IDE2KSBeCisgICAJCShUZDRbKHQzID4+ICA4KSAmIDB4ZmZdIDw8ICA4KSBeCisgICAJCShUZDRbKHQyICAgICAgKSAmIDB4ZmZdKSAgICAgICBeCisgICAJCXJrWzFdOworCVBVVFUzMihvdXQgKyAgNCwgczEpOworICAgCXMyID0KKyAgIAkJKFRkNFsodDIgPj4gMjQpICAgICAgIF0gPDwgMjQpIF4KKyAgIAkJKFRkNFsodDEgPj4gMTYpICYgMHhmZl0gPDwgMTYpIF4KKyAgIAkJKFRkNFsodDAgPj4gIDgpICYgMHhmZl0gPDwgIDgpIF4KKyAgIAkJKFRkNFsodDMgICAgICApICYgMHhmZl0pICAgICAgIF4KKyAgIAkJcmtbMl07CisJUFVUVTMyKG91dCArICA4LCBzMik7CisgICAJczMgPQorICAgCQkoVGQ0Wyh0MyA+PiAyNCkgICAgICAgXSA8PCAyNCkgXgorICAgCQkoVGQ0Wyh0MiA+PiAxNikgJiAweGZmXSA8PCAxNikgXgorICAgCQkoVGQ0Wyh0MSA+PiAgOCkgJiAweGZmXSA8PCAgOCkgXgorICAgCQkoVGQ0Wyh0MCAgICAgICkgJiAweGZmXSkgICAgICAgXgorICAgCQlya1szXTsKKwlQVVRVMzIob3V0ICsgMTIsIHMzKTsKK30KKworI2Vsc2UgLyogQUVTX0FTTSAqLworCitzdGF0aWMgY29uc3QgdTggVGU0WzI1Nl0gPSB7CisgICAgMHg2M1UsIDB4N2NVLCAweDc3VSwgMHg3YlUsIDB4ZjJVLCAweDZiVSwgMHg2ZlUsIDB4YzVVLAorICAgIDB4MzBVLCAweDAxVSwgMHg2N1UsIDB4MmJVLCAweGZlVSwgMHhkN1UsIDB4YWJVLCAweDc2VSwKKyAgICAweGNhVSwgMHg4MlUsIDB4YzlVLCAweDdkVSwgMHhmYVUsIDB4NTlVLCAweDQ3VSwgMHhmMFUsCisgICAgMHhhZFUsIDB4ZDRVLCAweGEyVSwgMHhhZlUsIDB4OWNVLCAweGE0VSwgMHg3MlUsIDB4YzBVLAorICAgIDB4YjdVLCAweGZkVSwgMHg5M1UsIDB4MjZVLCAweDM2VSwgMHgzZlUsIDB4ZjdVLCAweGNjVSwKKyAgICAweDM0VSwgMHhhNVUsIDB4ZTVVLCAweGYxVSwgMHg3MVUsIDB4ZDhVLCAweDMxVSwgMHgxNVUsCisgICAgMHgwNFUsIDB4YzdVLCAweDIzVSwgMHhjM1UsIDB4MThVLCAweDk2VSwgMHgwNVUsIDB4OWFVLAorICAgIDB4MDdVLCAweDEyVSwgMHg4MFUsIDB4ZTJVLCAweGViVSwgMHgyN1UsIDB4YjJVLCAweDc1VSwKKyAgICAweDA5VSwgMHg4M1UsIDB4MmNVLCAweDFhVSwgMHgxYlUsIDB4NmVVLCAweDVhVSwgMHhhMFUsCisgICAgMHg1MlUsIDB4M2JVLCAweGQ2VSwgMHhiM1UsIDB4MjlVLCAweGUzVSwgMHgyZlUsIDB4ODRVLAorICAgIDB4NTNVLCAweGQxVSwgMHgwMFUsIDB4ZWRVLCAweDIwVSwgMHhmY1UsIDB4YjFVLCAweDViVSwKKyAgICAweDZhVSwgMHhjYlUsIDB4YmVVLCAweDM5VSwgMHg0YVUsIDB4NGNVLCAweDU4VSwgMHhjZlUsCisgICAgMHhkMFUsIDB4ZWZVLCAweGFhVSwgMHhmYlUsIDB4NDNVLCAweDRkVSwgMHgzM1UsIDB4ODVVLAorICAgIDB4NDVVLCAweGY5VSwgMHgwMlUsIDB4N2ZVLCAweDUwVSwgMHgzY1UsIDB4OWZVLCAweGE4VSwKKyAgICAweDUxVSwgMHhhM1UsIDB4NDBVLCAweDhmVSwgMHg5MlUsIDB4OWRVLCAweDM4VSwgMHhmNVUsCisgICAgMHhiY1UsIDB4YjZVLCAweGRhVSwgMHgyMVUsIDB4MTBVLCAweGZmVSwgMHhmM1UsIDB4ZDJVLAorICAgIDB4Y2RVLCAweDBjVSwgMHgxM1UsIDB4ZWNVLCAweDVmVSwgMHg5N1UsIDB4NDRVLCAweDE3VSwKKyAgICAweGM0VSwgMHhhN1UsIDB4N2VVLCAweDNkVSwgMHg2NFUsIDB4NWRVLCAweDE5VSwgMHg3M1UsCisgICAgMHg2MFUsIDB4ODFVLCAweDRmVSwgMHhkY1UsIDB4MjJVLCAweDJhVSwgMHg5MFUsIDB4ODhVLAorICAgIDB4NDZVLCAweGVlVSwgMHhiOFUsIDB4MTRVLCAweGRlVSwgMHg1ZVUsIDB4MGJVLCAweGRiVSwKKyAgICAweGUwVSwgMHgzMlUsIDB4M2FVLCAweDBhVSwgMHg0OVUsIDB4MDZVLCAweDI0VSwgMHg1Y1UsCisgICAgMHhjMlUsIDB4ZDNVLCAweGFjVSwgMHg2MlUsIDB4OTFVLCAweDk1VSwgMHhlNFUsIDB4NzlVLAorICAgIDB4ZTdVLCAweGM4VSwgMHgzN1UsIDB4NmRVLCAweDhkVSwgMHhkNVUsIDB4NGVVLCAweGE5VSwKKyAgICAweDZjVSwgMHg1NlUsIDB4ZjRVLCAweGVhVSwgMHg2NVUsIDB4N2FVLCAweGFlVSwgMHgwOFUsCisgICAgMHhiYVUsIDB4NzhVLCAweDI1VSwgMHgyZVUsIDB4MWNVLCAweGE2VSwgMHhiNFUsIDB4YzZVLAorICAgIDB4ZThVLCAweGRkVSwgMHg3NFUsIDB4MWZVLCAweDRiVSwgMHhiZFUsIDB4OGJVLCAweDhhVSwKKyAgICAweDcwVSwgMHgzZVUsIDB4YjVVLCAweDY2VSwgMHg0OFUsIDB4MDNVLCAweGY2VSwgMHgwZVUsCisgICAgMHg2MVUsIDB4MzVVLCAweDU3VSwgMHhiOVUsIDB4ODZVLCAweGMxVSwgMHgxZFUsIDB4OWVVLAorICAgIDB4ZTFVLCAweGY4VSwgMHg5OFUsIDB4MTFVLCAweDY5VSwgMHhkOVUsIDB4OGVVLCAweDk0VSwKKyAgICAweDliVSwgMHgxZVUsIDB4ODdVLCAweGU5VSwgMHhjZVUsIDB4NTVVLCAweDI4VSwgMHhkZlUsCisgICAgMHg4Y1UsIDB4YTFVLCAweDg5VSwgMHgwZFUsIDB4YmZVLCAweGU2VSwgMHg0MlUsIDB4NjhVLAorICAgIDB4NDFVLCAweDk5VSwgMHgyZFUsIDB4MGZVLCAweGIwVSwgMHg1NFUsIDB4YmJVLCAweDE2VQorfTsKK3N0YXRpYyBjb25zdCB1MzIgcmNvbltdID0geworCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCisJMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwKKwkweDFCMDAwMDAwLCAweDM2MDAwMDAwLCAvKiBmb3IgMTI4LWJpdCBibG9ja3MsIFJpam5kYWVsIG5ldmVyIHVzZXMgbW9yZSB0aGFuIDEwIHJjb24gdmFsdWVzICovCit9OworCisvKioKKyAqIEV4cGFuZCB0aGUgY2lwaGVyIGtleSBpbnRvIHRoZSBlbmNyeXB0aW9uIGtleSBzY2hlZHVsZS4KKyAqLworaW50IEFFU19zZXRfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisJCQlBRVNfS0VZICprZXkpIHsKKwl1MzIgKnJrOworICAgCWludCBpID0gMDsKKwl1MzIgdGVtcDsKKworCWlmICghdXNlcktleSB8fCAha2V5KQorCQlyZXR1cm4gLTE7CisJaWYgKGJpdHMgIT0gMTI4ICYmIGJpdHMgIT0gMTkyICYmIGJpdHMgIT0gMjU2KQorCQlyZXR1cm4gLTI7CisKKwlyayA9IGtleS0+cmRfa2V5OworCisJaWYgKGJpdHM9PTEyOCkKKwkJa2V5LT5yb3VuZHMgPSAxMDsKKwllbHNlIGlmIChiaXRzPT0xOTIpCisJCWtleS0+cm91bmRzID0gMTI7CisJZWxzZQorCQlrZXktPnJvdW5kcyA9IDE0OworCisJcmtbMF0gPSBHRVRVMzIodXNlcktleSAgICAgKTsKKwlya1sxXSA9IEdFVFUzMih1c2VyS2V5ICsgIDQpOworCXJrWzJdID0gR0VUVTMyKHVzZXJLZXkgKyAgOCk7CisJcmtbM10gPSBHRVRVMzIodXNlcktleSArIDEyKTsKKwlpZiAoYml0cyA9PSAxMjgpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCXRlbXAgID0gcmtbM107CisJCQlya1s0XSA9IHJrWzBdIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdIDw8IDI0KSBeCisJCQkJKFRlNFsodGVtcCA+PiAgOCkgJiAweGZmXSA8PCAxNikgXgorCQkJCShUZTRbKHRlbXAgICAgICApICYgMHhmZl0gPDwgOCkgXgorCQkJCShUZTRbKHRlbXAgPj4gMjQpICAgICAgIF0pIF4KKwkJCQlyY29uW2ldOworCQkJcmtbNV0gPSBya1sxXSBeIHJrWzRdOworCQkJcmtbNl0gPSBya1syXSBeIHJrWzVdOworCQkJcmtbN10gPSBya1szXSBeIHJrWzZdOworCQkJaWYgKCsraSA9PSAxMCkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmsgKz0gNDsKKwkJfQorCX0KKwlya1s0XSA9IEdFVFUzMih1c2VyS2V5ICsgMTYpOworCXJrWzVdID0gR0VUVTMyKHVzZXJLZXkgKyAyMCk7CisJaWYgKGJpdHMgPT0gMTkyKSB7CisJCXdoaWxlICgxKSB7CisJCQl0ZW1wID0gcmtbIDVdOworCQkJcmtbIDZdID0gcmtbIDBdIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdIDw8IDI0KSBeCisJCQkJKFRlNFsodGVtcCA+PiAgOCkgJiAweGZmXSA8PCAxNikgXgorCQkJCShUZTRbKHRlbXAgICAgICApICYgMHhmZl0gPDwgOCkgXgorCQkJCShUZTRbKHRlbXAgPj4gMjQpICAgICAgIF0pIF4KKwkJCQlyY29uW2ldOworCQkJcmtbIDddID0gcmtbIDFdIF4gcmtbIDZdOworCQkJcmtbIDhdID0gcmtbIDJdIF4gcmtbIDddOworCQkJcmtbIDldID0gcmtbIDNdIF4gcmtbIDhdOworCQkJaWYgKCsraSA9PSA4KSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlya1sxMF0gPSBya1sgNF0gXiBya1sgOV07CisJCQlya1sxMV0gPSBya1sgNV0gXiBya1sxMF07CisJCQlyayArPSA2OworCQl9CisJfQorCXJrWzZdID0gR0VUVTMyKHVzZXJLZXkgKyAyNCk7CisJcmtbN10gPSBHRVRVMzIodXNlcktleSArIDI4KTsKKwlpZiAoYml0cyA9PSAyNTYpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCXRlbXAgPSBya1sgN107CisJCQlya1sgOF0gPSBya1sgMF0gXgorCQkJCShUZTRbKHRlbXAgPj4gMTYpICYgMHhmZl0gPDwgMjQpIF4KKwkJCQkoVGU0Wyh0ZW1wID4+ICA4KSAmIDB4ZmZdIDw8IDE2KSBeCisJCQkJKFRlNFsodGVtcCAgICAgICkgJiAweGZmXSA8PCA4KSBeCisJCQkJKFRlNFsodGVtcCA+PiAyNCkgICAgICAgXSkgXgorCQkJCXJjb25baV07CisJCQlya1sgOV0gPSBya1sgMV0gXiBya1sgOF07CisJCQlya1sxMF0gPSBya1sgMl0gXiBya1sgOV07CisJCQlya1sxMV0gPSBya1sgM10gXiBya1sxMF07CisJCQlpZiAoKytpID09IDcpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXRlbXAgPSBya1sxMV07CisJCQlya1sxMl0gPSBya1sgNF0gXgorCQkJCShUZTRbKHRlbXAgPj4gMjQpICAgICAgIF0gPDwgMjQpIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdIDw8IDE2KSBeCisJCQkJKFRlNFsodGVtcCA+PiAgOCkgJiAweGZmXSA8PCA4KSBeCisJCQkJKFRlNFsodGVtcCAgICAgICkgJiAweGZmXSk7CisJCQlya1sxM10gPSBya1sgNV0gXiBya1sxMl07CisJCQlya1sxNF0gPSBya1sgNl0gXiBya1sxM107CisJCQlya1sxNV0gPSBya1sgN10gXiBya1sxNF07CisKKwkJCXJrICs9IDg7CisgICAgICAgIAl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIEV4cGFuZCB0aGUgY2lwaGVyIGtleSBpbnRvIHRoZSBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZS4KKyAqLworaW50IEFFU19zZXRfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisJCQkgQUVTX0tFWSAqa2V5KSB7CisKKyAgICAgICAgdTMyICpyazsKKwlpbnQgaSwgaiwgc3RhdHVzOworCXUzMiB0ZW1wOworCisJLyogZmlyc3QsIHN0YXJ0IHdpdGggYW4gZW5jcnlwdGlvbiBzY2hlZHVsZSAqLworCXN0YXR1cyA9IEFFU19zZXRfZW5jcnlwdF9rZXkodXNlcktleSwgYml0cywga2V5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXJrID0ga2V5LT5yZF9rZXk7CisKKwkvKiBpbnZlcnQgdGhlIG9yZGVyIG9mIHRoZSByb3VuZCBrZXlzOiAqLworCWZvciAoaSA9IDAsIGogPSA0KihrZXktPnJvdW5kcyk7IGkgPCBqOyBpICs9IDQsIGogLT0gNCkgeworCQl0ZW1wID0gcmtbaSAgICBdOyBya1tpICAgIF0gPSBya1tqICAgIF07IHJrW2ogICAgXSA9IHRlbXA7CisJCXRlbXAgPSBya1tpICsgMV07IHJrW2kgKyAxXSA9IHJrW2ogKyAxXTsgcmtbaiArIDFdID0gdGVtcDsKKwkJdGVtcCA9IHJrW2kgKyAyXTsgcmtbaSArIDJdID0gcmtbaiArIDJdOyBya1tqICsgMl0gPSB0ZW1wOworCQl0ZW1wID0gcmtbaSArIDNdOyBya1tpICsgM10gPSBya1tqICsgM107IHJrW2ogKyAzXSA9IHRlbXA7CisJfQorCS8qIGFwcGx5IHRoZSBpbnZlcnNlIE1peENvbHVtbiB0cmFuc2Zvcm0gdG8gYWxsIHJvdW5kIGtleXMgYnV0IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3Q6ICovCisJZm9yIChpID0gMTsgaSA8IChrZXktPnJvdW5kcyk7IGkrKykgeworCQlyayArPSA0OworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisJCQl1MzIgdHAxLCB0cDIsIHRwNCwgdHA4LCB0cDksIHRwYiwgdHBkLCB0cGUsIG07CisKKwkJCXRwMSA9IHJrW2pdOworCQkJbSA9IHRwMSAmIDB4ODA4MDgwODA7CisJCQl0cDIgPSAoKHRwMSAmIDB4N2Y3ZjdmN2YpIDw8IDEpIF4KKwkJCQkoKG0gLSAobSA+PiA3KSkgJiAweDFiMWIxYjFiKTsKKwkJCW0gPSB0cDIgJiAweDgwODA4MDgwOworCQkJdHA0ID0gKCh0cDIgJiAweDdmN2Y3ZjdmKSA8PCAxKSBeCisJCQkJKChtIC0gKG0gPj4gNykpICYgMHgxYjFiMWIxYik7CisJCQltID0gdHA0ICYgMHg4MDgwODA4MDsKKwkJCXRwOCA9ICgodHA0ICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXgorCQkJCSgobSAtIChtID4+IDcpKSAmIDB4MWIxYjFiMWIpOworCQkJdHA5ID0gdHA4IF4gdHAxOworCQkJdHBiID0gdHA5IF4gdHAyOworCQkJdHBkID0gdHA5IF4gdHA0OworCQkJdHBlID0gdHA4IF4gdHA0IF4gdHAyOworI2lmIGRlZmluZWQoUk9UQVRFKQorCQkJcmtbal0gPSB0cGUgXiBST1RBVEUodHBkLDE2KSBeCisJCQkJUk9UQVRFKHRwOSwyNCkgXiBST1RBVEUodHBiLDgpOworI2Vsc2UKKwkJCXJrW2pdID0gdHBlIF4gKHRwZCA+PiAxNikgXiAodHBkIDw8IDE2KSBeIAorCQkJCSh0cDkgPj4gOCkgXiAodHA5IDw8IDI0KSBeCisJCQkJKHRwYiA+PiAyNCkgXiAodHBiIDw8IDgpOworI2VuZGlmCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBBRVNfQVNNICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19jdHIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWQxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19jdHIuYwpAQCAtMCwwICsxLDYxIEBACisvKiBjcnlwdG8vYWVzL2Flc19jdHIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21vZGVzLmg+CisKK3ZvaWQgQUVTX2N0cjEyOF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCQlzaXplX3QgbGVuZ3RoLCBjb25zdCBBRVNfS0VZICprZXksCisJCQl1bnNpZ25lZCBjaGFyIGl2ZWNbQUVTX0JMT0NLX1NJWkVdLAorCQkJdW5zaWduZWQgY2hhciBlY291bnRfYnVmW0FFU19CTE9DS19TSVpFXSwKKwkJCXVuc2lnbmVkIGludCAqbnVtKSB7CisJQ1JZUFRPX2N0cjEyOF9lbmNyeXB0KGluLG91dCxsZW5ndGgsa2V5LGl2ZWMsZWNvdW50X2J1ZixudW0sKGJsb2NrMTI4X2YpQUVTX2VuY3J5cHQpOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfZWNiLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19lY2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFhNTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfZWNiLmMKQEAgLTAsMCArMSw3MyBAQAorLyogY3J5cHRvL2Flcy9hZXNfZWNiLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBBRVNfREVCVUcKKyMgaWZuZGVmIE5ERUJVRworIyAgZGVmaW5lIE5ERUJVRworIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgImFlc19sb2NsLmgiCisKK3ZvaWQgQUVTX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgY29uc3QgQUVTX0tFWSAqa2V5LCBjb25zdCBpbnQgZW5jKSB7CisKKyAgICAgICAgYXNzZXJ0KGluICYmIG91dCAmJiBrZXkpOworCWFzc2VydCgoQUVTX0VOQ1JZUFQgPT0gZW5jKXx8KEFFU19ERUNSWVBUID09IGVuYykpOworCisJaWYgKEFFU19FTkNSWVBUID09IGVuYykKKwkJQUVTX2VuY3J5cHQoaW4sIG91dCwga2V5KTsKKwllbHNlCisJCUFFU19kZWNyeXB0KGluLCBvdXQsIGtleSk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2lnZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfaWdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2MTM1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2lnZS5jCkBAIC0wLDAgKzEsMzIzIEBACisvKiBjcnlwdG8vYWVzL2Flc19pZ2UuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgImFlc19sb2NsLmgiCisKKyNkZWZpbmUgTl9XT1JEUyAoQUVTX0JMT0NLX1NJWkUgLyBzaXplb2YodW5zaWduZWQgbG9uZykpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZGF0YVtOX1dPUkRTXTsKK30gYWVzX2Jsb2NrX3Q7CisKKy8qIFhYWDogcHJvYmFibHkgc29tZSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgKi8KKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisjZGVmaW5lIFVOQUxJR05FRF9NRU1PUFNfQVJFX0ZBU1QgMQorI2Vsc2UKKyNkZWZpbmUgVU5BTElHTkVEX01FTU9QU19BUkVfRkFTVCAwCisjZW5kaWYKKworI2lmIFVOQUxJR05FRF9NRU1PUFNfQVJFX0ZBU1QKKyNkZWZpbmUgbG9hZF9ibG9jayhkLCBzKSAgICAgICAgKGQpID0gKihjb25zdCBhZXNfYmxvY2tfdCAqKShzKQorI2RlZmluZSBzdG9yZV9ibG9jayhkLCBzKSAgICAgICAqKGFlc19ibG9ja190ICopKGQpID0gKHMpCisjZWxzZQorI2RlZmluZSBsb2FkX2Jsb2NrKGQsIHMpICAgICAgICBtZW1jcHkoKGQpLmRhdGEsIChzKSwgQUVTX0JMT0NLX1NJWkUpCisjZGVmaW5lIHN0b3JlX2Jsb2NrKGQsIHMpICAgICAgIG1lbWNweSgoZCksIChzKS5kYXRhLCBBRVNfQkxPQ0tfU0laRSkKKyNlbmRpZgorCisvKiBOLkIuIFRoZSBJViBmb3IgdGhpcyBtb2RlIGlzIF90d2ljZV8gdGhlIGJsb2NrIHNpemUgKi8KKwordm9pZCBBRVNfaWdlX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCQkJIHNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwkJCQkJIHVuc2lnbmVkIGNoYXIgKml2ZWMsIGNvbnN0IGludCBlbmMpCisJeworCXNpemVfdCBuOworCXNpemVfdCBsZW4gPSBsZW5ndGg7CisKKwlPUEVOU1NMX2Fzc2VydChpbiAmJiBvdXQgJiYga2V5ICYmIGl2ZWMpOworCU9QRU5TU0xfYXNzZXJ0KChBRVNfRU5DUllQVCA9PSBlbmMpfHwoQUVTX0RFQ1JZUFQgPT0gZW5jKSk7CisJT1BFTlNTTF9hc3NlcnQoKGxlbmd0aCVBRVNfQkxPQ0tfU0laRSkgPT0gMCk7CisKKwlsZW4gPSBsZW5ndGggLyBBRVNfQkxPQ0tfU0laRTsKKworCWlmIChBRVNfRU5DUllQVCA9PSBlbmMpCisJCXsKKwkJaWYgKGluICE9IG91dCAmJgorCQkgICAgKFVOQUxJR05FRF9NRU1PUFNfQVJFX0ZBU1QgfHwgKChzaXplX3QpaW58KHNpemVfdClvdXR8KHNpemVfdClpdmVjKSVzaXplb2YobG9uZyk9PTApKQorCQkJeworCQkJYWVzX2Jsb2NrX3QgKml2cCA9IChhZXNfYmxvY2tfdCAqKWl2ZWM7CisJCQlhZXNfYmxvY2tfdCAqaXYycCA9IChhZXNfYmxvY2tfdCAqKShpdmVjICsgQUVTX0JMT0NLX1NJWkUpOworCisJCQl3aGlsZSAobGVuKQorCQkJCXsKKwkJCQlhZXNfYmxvY2tfdCAqaW5wID0gKGFlc19ibG9ja190ICopaW47CisJCQkJYWVzX2Jsb2NrX3QgKm91dHAgPSAoYWVzX2Jsb2NrX3QgKilvdXQ7CisKKwkJCQlmb3Iobj0wIDsgbiA8IE5fV09SRFM7ICsrbikKKwkJCQkJb3V0cC0+ZGF0YVtuXSA9IGlucC0+ZGF0YVtuXSBeIGl2cC0+ZGF0YVtuXTsKKwkJCQlBRVNfZW5jcnlwdCgodW5zaWduZWQgY2hhciAqKW91dHAtPmRhdGEsICh1bnNpZ25lZCBjaGFyICopb3V0cC0+ZGF0YSwga2V5KTsKKwkJCQlmb3Iobj0wIDsgbiA8IE5fV09SRFM7ICsrbikKKwkJCQkJb3V0cC0+ZGF0YVtuXSBePSBpdjJwLT5kYXRhW25dOworCQkJCWl2cCA9IG91dHA7CisJCQkJaXYycCA9IGlucDsKKwkJCQktLWxlbjsKKwkJCQlpbiArPSBBRVNfQkxPQ0tfU0laRTsKKwkJCQlvdXQgKz0gQUVTX0JMT0NLX1NJWkU7CisJCQkJfQorCQkJbWVtY3B5KGl2ZWMsIGl2cC0+ZGF0YSwgQUVTX0JMT0NLX1NJWkUpOworCQkJbWVtY3B5KGl2ZWMgKyBBRVNfQkxPQ0tfU0laRSwgaXYycC0+ZGF0YSwgQUVTX0JMT0NLX1NJWkUpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlhZXNfYmxvY2tfdCB0bXAsIHRtcDI7CisJCQlhZXNfYmxvY2tfdCBpdjsKKwkJCWFlc19ibG9ja190IGl2MjsKKworCQkJbG9hZF9ibG9jayhpdiwgaXZlYyk7CisJCQlsb2FkX2Jsb2NrKGl2MiwgaXZlYyArIEFFU19CTE9DS19TSVpFKTsKKworCQkJd2hpbGUgKGxlbikKKwkJCQl7CisJCQkJbG9hZF9ibG9jayh0bXAsIGluKTsKKwkJCQlmb3Iobj0wIDsgbiA8IE5fV09SRFM7ICsrbikKKwkJCQkJdG1wMi5kYXRhW25dID0gdG1wLmRhdGFbbl0gXiBpdi5kYXRhW25dOworCQkJCUFFU19lbmNyeXB0KCh1bnNpZ25lZCBjaGFyICopdG1wMi5kYXRhLCAodW5zaWduZWQgY2hhciAqKXRtcDIuZGF0YSwga2V5KTsKKwkJCQlmb3Iobj0wIDsgbiA8IE5fV09SRFM7ICsrbikKKwkJCQkJdG1wMi5kYXRhW25dIF49IGl2Mi5kYXRhW25dOworCQkJCXN0b3JlX2Jsb2NrKG91dCwgdG1wMik7CisJCQkJaXYgPSB0bXAyOworCQkJCWl2MiA9IHRtcDsKKwkJCQktLWxlbjsKKwkJCQlpbiArPSBBRVNfQkxPQ0tfU0laRTsKKwkJCQlvdXQgKz0gQUVTX0JMT0NLX1NJWkU7CisJCQkJfQorCQkJbWVtY3B5KGl2ZWMsIGl2LmRhdGEsIEFFU19CTE9DS19TSVpFKTsKKwkJCW1lbWNweShpdmVjICsgQUVTX0JMT0NLX1NJWkUsIGl2Mi5kYXRhLCBBRVNfQkxPQ0tfU0laRSk7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGluICE9IG91dCAmJgorCQkgICAgKFVOQUxJR05FRF9NRU1PUFNfQVJFX0ZBU1QgfHwgKChzaXplX3QpaW58KHNpemVfdClvdXR8KHNpemVfdClpdmVjKSVzaXplb2YobG9uZyk9PTApKQorCQkJeworCQkJYWVzX2Jsb2NrX3QgKml2cCA9IChhZXNfYmxvY2tfdCAqKWl2ZWM7CisJCQlhZXNfYmxvY2tfdCAqaXYycCA9IChhZXNfYmxvY2tfdCAqKShpdmVjICsgQUVTX0JMT0NLX1NJWkUpOworCisJCQl3aGlsZSAobGVuKQorCQkJCXsKKwkJCQlhZXNfYmxvY2tfdCB0bXA7CisJCQkJYWVzX2Jsb2NrX3QgKmlucCA9IChhZXNfYmxvY2tfdCAqKWluOworCQkJCWFlc19ibG9ja190ICpvdXRwID0gKGFlc19ibG9ja190ICopb3V0OworCisJCQkJZm9yKG49MCA7IG4gPCBOX1dPUkRTOyArK24pCisJCQkJCXRtcC5kYXRhW25dID0gaW5wLT5kYXRhW25dIF4gaXYycC0+ZGF0YVtuXTsKKwkJCQlBRVNfZGVjcnlwdCgodW5zaWduZWQgY2hhciAqKXRtcC5kYXRhLCAodW5zaWduZWQgY2hhciAqKW91dHAtPmRhdGEsIGtleSk7CisJCQkJZm9yKG49MCA7IG4gPCBOX1dPUkRTOyArK24pCisJCQkJCW91dHAtPmRhdGFbbl0gXj0gaXZwLT5kYXRhW25dOworCQkJCWl2cCA9IGlucDsKKwkJCQlpdjJwID0gb3V0cDsKKwkJCQktLWxlbjsKKwkJCQlpbiArPSBBRVNfQkxPQ0tfU0laRTsKKwkJCQlvdXQgKz0gQUVTX0JMT0NLX1NJWkU7CisJCQkJfQorCQkJbWVtY3B5KGl2ZWMsIGl2cC0+ZGF0YSwgQUVTX0JMT0NLX1NJWkUpOworCQkJbWVtY3B5KGl2ZWMgKyBBRVNfQkxPQ0tfU0laRSwgaXYycC0+ZGF0YSwgQUVTX0JMT0NLX1NJWkUpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlhZXNfYmxvY2tfdCB0bXAsIHRtcDI7CisJCQlhZXNfYmxvY2tfdCBpdjsKKwkJCWFlc19ibG9ja190IGl2MjsKKworCQkJbG9hZF9ibG9jayhpdiwgaXZlYyk7CisJCQlsb2FkX2Jsb2NrKGl2MiwgaXZlYyArIEFFU19CTE9DS19TSVpFKTsKKworCQkJd2hpbGUgKGxlbikKKwkJCQl7CisJCQkJbG9hZF9ibG9jayh0bXAsIGluKTsKKwkJCQl0bXAyID0gdG1wOworCQkJCWZvcihuPTAgOyBuIDwgTl9XT1JEUzsgKytuKQorCQkJCQl0bXAuZGF0YVtuXSBePSBpdjIuZGF0YVtuXTsKKwkJCQlBRVNfZGVjcnlwdCgodW5zaWduZWQgY2hhciAqKXRtcC5kYXRhLCAodW5zaWduZWQgY2hhciAqKXRtcC5kYXRhLCBrZXkpOworCQkJCWZvcihuPTAgOyBuIDwgTl9XT1JEUzsgKytuKQorCQkJCQl0bXAuZGF0YVtuXSBePSBpdi5kYXRhW25dOworCQkJCXN0b3JlX2Jsb2NrKG91dCwgdG1wKTsKKwkJCQlpdiA9IHRtcDI7CisJCQkJaXYyID0gdG1wOworCQkJCS0tbGVuOworCQkJCWluICs9IEFFU19CTE9DS19TSVpFOworCQkJCW91dCArPSBBRVNfQkxPQ0tfU0laRTsKKwkJCQl9CisJCQltZW1jcHkoaXZlYywgaXYuZGF0YSwgQUVTX0JMT0NLX1NJWkUpOworCQkJbWVtY3B5KGl2ZWMgKyBBRVNfQkxPQ0tfU0laRSwgaXYyLmRhdGEsIEFFU19CTE9DS19TSVpFKTsKKwkJCX0KKwkJfQorCX0KKworLyoKKyAqIE5vdGUgdGhhdCBpdHMgZWZmZWN0aXZlbHkgaW1wb3NzaWJsZSB0byBkbyBiaUlHRSBpbiBhbnl0aGluZyBvdGhlcgorICogdGhhbiBhIHNpbmdsZSBwYXNzLCBzbyBubyBwcm92aXNpb24gaXMgbWFkZSBmb3IgY2hhaW5pbmcuCisgKi8KKworLyogTi5CLiBUaGUgSVYgZm9yIHRoaXMgbW9kZSBpcyBfZm91ciB0aW1lc18gdGhlIGJsb2NrIHNpemUgKi8KKwordm9pZCBBRVNfYmlfaWdlX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCQkJCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwkJCQkJCWNvbnN0IEFFU19LRVkgKmtleTIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2ZWMsCisJCQkJCQljb25zdCBpbnQgZW5jKQorCXsKKwlzaXplX3QgbjsKKwlzaXplX3QgbGVuID0gbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgdG1wW0FFU19CTE9DS19TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIHRtcDJbQUVTX0JMT0NLX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgdG1wM1tBRVNfQkxPQ0tfU0laRV07CisJdW5zaWduZWQgY2hhciBwcmV2W0FFU19CTE9DS19TSVpFXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppdjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppdjI7CisKKwlPUEVOU1NMX2Fzc2VydChpbiAmJiBvdXQgJiYga2V5ICYmIGl2ZWMpOworCU9QRU5TU0xfYXNzZXJ0KChBRVNfRU5DUllQVCA9PSBlbmMpfHwoQUVTX0RFQ1JZUFQgPT0gZW5jKSk7CisJT1BFTlNTTF9hc3NlcnQoKGxlbmd0aCVBRVNfQkxPQ0tfU0laRSkgPT0gMCk7CisKKwlpZiAoQUVTX0VOQ1JZUFQgPT0gZW5jKQorCQl7CisJCS8qIFhYWDogRG8gYSBzZXBhcmF0ZSBjYXNlIGZvciB3aGVuIGluICE9IG91dCAoc3RyaWN0bHkgc2hvdWxkCisJCSAgIGNoZWNrIGZvciBvdmVybGFwLCB0b28pICovCisKKwkJLyogRmlyc3QgdGhlIGZvcndhcmQgcGFzcyAqLyAKKwkJaXYgPSBpdmVjOworCQlpdjIgPSBpdmVjICsgQUVTX0JMT0NLX1NJWkU7CisJCXdoaWxlIChsZW4gPj0gQUVTX0JMT0NLX1NJWkUpCisJCQl7CisJCQlmb3Iobj0wIDsgbiA8IEFFU19CTE9DS19TSVpFIDsgKytuKQorCQkJCW91dFtuXSA9IGluW25dIF4gaXZbbl07CisJCQlBRVNfZW5jcnlwdChvdXQsIG91dCwga2V5KTsKKwkJCWZvcihuPTAgOyBuIDwgQUVTX0JMT0NLX1NJWkUgOyArK24pCisJCQkJb3V0W25dIF49IGl2MltuXTsKKwkJCWl2ID0gb3V0OworCQkJbWVtY3B5KHByZXYsIGluLCBBRVNfQkxPQ0tfU0laRSk7CisJCQlpdjIgPSBwcmV2OworCQkJbGVuIC09IEFFU19CTE9DS19TSVpFOworCQkJaW4gKz0gQUVTX0JMT0NLX1NJWkU7CisJCQlvdXQgKz0gQUVTX0JMT0NLX1NJWkU7CisJCQl9CisKKwkJLyogQW5kIG5vdyBiYWNrd2FyZHMgKi8KKwkJaXYgPSBpdmVjICsgQUVTX0JMT0NLX1NJWkUqMjsKKwkJaXYyID0gaXZlYyArIEFFU19CTE9DS19TSVpFKjM7CisJCWxlbiA9IGxlbmd0aDsKKwkJd2hpbGUobGVuID49IEFFU19CTE9DS19TSVpFKQorCQkJeworCQkJb3V0IC09IEFFU19CTE9DS19TSVpFOworCQkJLyogWFhYOiByZWR1Y2UgY29waWVzIGJ5IGFsdGVybmF0aW5nIGJldHdlZW4gYnVmZmVycyAqLworCQkJbWVtY3B5KHRtcCwgb3V0LCBBRVNfQkxPQ0tfU0laRSk7CisJCQlmb3Iobj0wIDsgbiA8IEFFU19CTE9DS19TSVpFIDsgKytuKQorCQkJCW91dFtuXSBePSBpdltuXTsKKwkJCS8qCQkJaGV4ZHVtcChzdGRvdXQsICJvdXQgXiBpdiIsIG91dCwgQUVTX0JMT0NLX1NJWkUpOyAqLworCQkJQUVTX2VuY3J5cHQob3V0LCBvdXQsIGtleSk7CisJCQkvKgkJCWhleGR1bXAoc3Rkb3V0LCJlbmMiLCBvdXQsIEFFU19CTE9DS19TSVpFKTsgKi8KKwkJCS8qCQkJaGV4ZHVtcChzdGRvdXQsIml2MiIsIGl2MiwgQUVTX0JMT0NLX1NJWkUpOyAqLworCQkJZm9yKG49MCA7IG4gPCBBRVNfQkxPQ0tfU0laRSA7ICsrbikKKwkJCQlvdXRbbl0gXj0gaXYyW25dOworCQkJLyoJCQloZXhkdW1wKHN0ZG91dCwib3V0Iiwgb3V0LCBBRVNfQkxPQ0tfU0laRSk7ICovCisJCQlpdiA9IG91dDsKKwkJCW1lbWNweShwcmV2LCB0bXAsIEFFU19CTE9DS19TSVpFKTsKKwkJCWl2MiA9IHByZXY7CisJCQlsZW4gLT0gQUVTX0JMT0NLX1NJWkU7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJLyogRmlyc3QgYmFja3dhcmRzICovCisJCWl2ID0gaXZlYyArIEFFU19CTE9DS19TSVpFKjI7CisJCWl2MiA9IGl2ZWMgKyBBRVNfQkxPQ0tfU0laRSozOworCQlpbiArPSBsZW5ndGg7CisJCW91dCArPSBsZW5ndGg7CisJCXdoaWxlIChsZW4gPj0gQUVTX0JMT0NLX1NJWkUpCisJCQl7CisJCQlpbiAtPSBBRVNfQkxPQ0tfU0laRTsKKwkJCW91dCAtPSBBRVNfQkxPQ0tfU0laRTsKKwkJCW1lbWNweSh0bXAsIGluLCBBRVNfQkxPQ0tfU0laRSk7CisJCQltZW1jcHkodG1wMiwgaW4sIEFFU19CTE9DS19TSVpFKTsKKwkJCWZvcihuPTAgOyBuIDwgQUVTX0JMT0NLX1NJWkUgOyArK24pCisJCQkJdG1wW25dIF49IGl2MltuXTsKKwkJCUFFU19kZWNyeXB0KHRtcCwgb3V0LCBrZXkpOworCQkJZm9yKG49MCA7IG4gPCBBRVNfQkxPQ0tfU0laRSA7ICsrbikKKwkJCQlvdXRbbl0gXj0gaXZbbl07CisJCQltZW1jcHkodG1wMywgdG1wMiwgQUVTX0JMT0NLX1NJWkUpOworCQkJaXYgPSB0bXAzOworCQkJaXYyID0gb3V0OworCQkJbGVuIC09IEFFU19CTE9DS19TSVpFOworCQkJfQorCisJCS8qIEFuZCBub3cgZm9yd2FyZHMgKi8KKwkJaXYgPSBpdmVjOworCQlpdjIgPSBpdmVjICsgQUVTX0JMT0NLX1NJWkU7CisJCWxlbiA9IGxlbmd0aDsKKwkJd2hpbGUgKGxlbiA+PSBBRVNfQkxPQ0tfU0laRSkKKwkJCXsKKwkJCW1lbWNweSh0bXAsIG91dCwgQUVTX0JMT0NLX1NJWkUpOworCQkJbWVtY3B5KHRtcDIsIG91dCwgQUVTX0JMT0NLX1NJWkUpOworCQkJZm9yKG49MCA7IG4gPCBBRVNfQkxPQ0tfU0laRSA7ICsrbikKKwkJCQl0bXBbbl0gXj0gaXYyW25dOworCQkJQUVTX2RlY3J5cHQodG1wLCBvdXQsIGtleSk7CisJCQlmb3Iobj0wIDsgbiA8IEFFU19CTE9DS19TSVpFIDsgKytuKQorCQkJCW91dFtuXSBePSBpdltuXTsKKwkJCW1lbWNweSh0bXAzLCB0bXAyLCBBRVNfQkxPQ0tfU0laRSk7CisJCQlpdiA9IHRtcDM7CisJCQlpdjIgPSBvdXQ7CisJCQlsZW4gLT0gQUVTX0JMT0NLX1NJWkU7CisJCQlpbiArPSBBRVNfQkxPQ0tfU0laRTsKKwkJCW91dCArPSBBRVNfQkxPQ0tfU0laRTsKKwkJCX0KKwkJfQorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX2xvY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRiNDQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfbG9jbC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIGNyeXB0by9hZXMvYWVzLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfQUVTX0xPQ0xfSAorI2RlZmluZSBIRUFERVJfQUVTX0xPQ0xfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19BRVMKKyNlcnJvciBBRVMgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9NX0FNRDY0KSB8fCBkZWZpbmVkKF9NX1g2NCkpCisjIGRlZmluZSBTV0FQKHgpIChfbHJvdGwoeCwgOCkgJiAweDAwZmYwMGZmIHwgX2xyb3RyKHgsIDgpICYgMHhmZjAwZmYwMCkKKyMgZGVmaW5lIEdFVFUzMihwKSBTV0FQKCooKHUzMiAqKShwKSkpCisjIGRlZmluZSBQVVRVMzIoY3QsIHN0KSB7ICooKHUzMiAqKShjdCkpID0gU1dBUCgoc3QpKTsgfQorI2Vsc2UKKyMgZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikgXiAoKHUzMikocHQpWzJdIDw8ICA4KSBeICgodTMyKShwdClbM10pKQorIyBkZWZpbmUgUFVUVTMyKGN0LCBzdCkgeyAoY3QpWzBdID0gKHU4KSgoc3QpID4+IDI0KTsgKGN0KVsxXSA9ICh1OCkoKHN0KSA+PiAxNik7IChjdClbMl0gPSAodTgpKChzdCkgPj4gIDgpOyAoY3QpWzNdID0gKHU4KShzdCk7IH0KKyNlbmRpZgorCisjaWZkZWYgQUVTX0xPTkcKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1MzI7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBpbnQgdTMyOworI2VuZGlmCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHUxNjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKworI2RlZmluZSBNQVhLQyAgICgyNTYvMzIpCisjZGVmaW5lIE1BWEtCICAgKDI1Ni84KQorI2RlZmluZSBNQVhOUiAgIDE0CisKKy8qIFRoaXMgY29udHJvbHMgbG9vcC11bnJvbGxpbmcgaW4gYWVzX2NvcmUuYyAqLworI3VuZGVmIEZVTExfVU5ST0xMCisKKyNlbmRpZiAvKiAhSEVBREVSX0FFU19MT0NMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX21pc2MuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmVhZDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfbWlzYy5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qIGNyeXB0by9hZXMvYWVzX21pc2MuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjaW5jbHVkZSAiYWVzX2xvY2wuaCIKKworY29uc3QgY2hhciBBRVNfdmVyc2lvbltdPSJBRVMiIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworY29uc3QgY2hhciAqQUVTX29wdGlvbnModm9pZCkgeworI2lmZGVmIEZVTExfVU5ST0xMCisgICAgICAgIHJldHVybiAiYWVzKGZ1bGwpIjsKKyNlbHNlICAgCisgICAgICAgIHJldHVybiAiYWVzKHBhcnRpYWwpIjsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfb2ZiLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc19vZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJmMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfb2ZiLmMKQEAgLTAsMCArMSw2MCBAQAorLyogY3J5cHRvL2Flcy9hZXNfb2ZiLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tb2Rlcy5oPgorCit2b2lkIEFFU19vZmIxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwl1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSkKK3sKKwlDUllQVE9fb2ZiMTI4X2VuY3J5cHQoaW4sb3V0LGxlbmd0aCxrZXksaXZlYyxudW0sKGJsb2NrMTI4X2YpQUVTX2VuY3J5cHQpOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfd3JhcC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hZXNfd3JhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZWFjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc193cmFwLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qIGNyeXB0by9hZXMvYWVzX3dyYXAuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGVmYXVsdF9pdltdID0geworICAweEE2LCAweEE2LCAweEE2LCAweEE2LCAweEE2LCAweEE2LCAweEE2LCAweEE2LAorfTsKKworaW50IEFFU193cmFwX2tleShBRVNfS0VZICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LAorCQl1bnNpZ25lZCBjaGFyICpvdXQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBpbnQgaW5sZW4pCisJeworCXVuc2lnbmVkIGNoYXIgKkEsIEJbMTZdLCAqUjsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgdDsKKwlpZiAoKGlubGVuICYgMHg3KSB8fCAoaW5sZW4gPCA4KSkKKwkJcmV0dXJuIC0xOworCUEgPSBCOworCXQgPSAxOworCW1lbWNweShvdXQgKyA4LCBpbiwgaW5sZW4pOworCWlmICghaXYpCisJCWl2ID0gZGVmYXVsdF9pdjsKKworCW1lbWNweShBLCBpdiwgOCk7CisKKwlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorCQl7CisJCVIgPSBvdXQgKyA4OworCQlmb3IgKGkgPSAwOyBpIDwgaW5sZW47IGkgKz0gOCwgdCsrLCBSICs9IDgpCisJCQl7CisJCQltZW1jcHkoQiArIDgsIFIsIDgpOworCQkJQUVTX2VuY3J5cHQoQiwgQiwga2V5KTsKKwkJCUFbN10gXj0gKHVuc2lnbmVkIGNoYXIpKHQgJiAweGZmKTsKKwkJCWlmICh0ID4gMHhmZikJCisJCQkJeworCQkJCUFbNl0gXj0gKHVuc2lnbmVkIGNoYXIpKCh0ICYgMHhmZikgPj4gOCk7CisJCQkJQVs1XSBePSAodW5zaWduZWQgY2hhcikoKHQgJiAweGZmKSA+PiAxNik7CisJCQkJQVs0XSBePSAodW5zaWduZWQgY2hhcikoKHQgJiAweGZmKSA+PiAyNCk7CisJCQkJfQorCQkJbWVtY3B5KFIsIEIgKyA4LCA4KTsKKwkJCX0KKwkJfQorCW1lbWNweShvdXQsIEEsIDgpOworCXJldHVybiBpbmxlbiArIDg7CisJfQorCitpbnQgQUVTX3Vud3JhcF9rZXkoQUVTX0tFWSAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwKKwkJdW5zaWduZWQgY2hhciAqb3V0LAorCQljb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlubGVuKQorCXsKKwl1bnNpZ25lZCBjaGFyICpBLCBCWzE2XSwgKlI7CisJdW5zaWduZWQgaW50IGksIGosIHQ7CisJaW5sZW4gLT0gODsKKwlpZiAoaW5sZW4gJiAweDcpCisJCXJldHVybiAtMTsKKwlpZiAoaW5sZW4gPCA4KQorCQlyZXR1cm4gLTE7CisJQSA9IEI7CisJdCA9ICA2ICogKGlubGVuID4+IDMpOworCW1lbWNweShBLCBpbiwgOCk7CisJbWVtY3B5KG91dCwgaW4gKyA4LCBpbmxlbik7CisJZm9yIChqID0gMDsgaiA8IDY7IGorKykKKwkJeworCQlSID0gb3V0ICsgaW5sZW4gLSA4OworCQlmb3IgKGkgPSAwOyBpIDwgaW5sZW47IGkgKz0gOCwgdC0tLCBSIC09IDgpCisJCQl7CisJCQlBWzddIF49ICh1bnNpZ25lZCBjaGFyKSh0ICYgMHhmZik7CisJCQlpZiAodCA+IDB4ZmYpCQorCQkJCXsKKwkJCQlBWzZdIF49ICh1bnNpZ25lZCBjaGFyKSgodCAmIDB4ZmYpID4+IDgpOworCQkJCUFbNV0gXj0gKHVuc2lnbmVkIGNoYXIpKCh0ICYgMHhmZikgPj4gMTYpOworCQkJCUFbNF0gXj0gKHVuc2lnbmVkIGNoYXIpKCh0ICYgMHhmZikgPj4gMjQpOworCQkJCX0KKwkJCW1lbWNweShCICsgOCwgUiwgOCk7CisJCQlBRVNfZGVjcnlwdChCLCBCLCBrZXkpOworCQkJbWVtY3B5KFIsIEIgKyA4LCA4KTsKKwkJCX0KKwkJfQorCWlmICghaXYpCisJCWl2ID0gZGVmYXVsdF9pdjsKKwlpZiAobWVtY21wKEEsIGl2LCA4KSkKKwkJeworCQlPUEVOU1NMX2NsZWFuc2Uob3V0LCBpbmxlbik7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGlubGVuOworCX0KKworI2lmZGVmIEFFU19XUkFQX1RFU1QKKworaW50IEFFU193cmFwX3Vud3JhcF90ZXN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtlaywgaW50IGtleWJpdHMsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqZW91dCwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4pCisJeworCXVuc2lnbmVkIGNoYXIgKm90bXAgPSBOVUxMLCAqcHRtcCA9IE5VTEw7CisJaW50IHIsIHJldCA9IDA7CisJQUVTX0tFWSB3Y3R4OworCW90bXAgPSBPUEVOU1NMX21hbGxvYyhrZXlsZW4gKyA4KTsKKwlwdG1wID0gT1BFTlNTTF9tYWxsb2Moa2V5bGVuKTsKKwlpZiAoIW90bXAgfHwgIXB0bXApCisJCXJldHVybiAwOworCWlmIChBRVNfc2V0X2VuY3J5cHRfa2V5KGtlaywga2V5Yml0cywgJndjdHgpKQorCQlnb3RvIGVycjsKKwlyID0gQUVTX3dyYXBfa2V5KCZ3Y3R4LCBpdiwgb3RtcCwga2V5LCBrZXlsZW4pOworCWlmIChyIDw9IDApCisJCWdvdG8gZXJyOworCisJaWYgKGVvdXQgJiYgbWVtY21wKGVvdXQsIG90bXAsIGtleWxlbikpCisJCWdvdG8gZXJyOworCQkKKwlpZiAoQUVTX3NldF9kZWNyeXB0X2tleShrZWssIGtleWJpdHMsICZ3Y3R4KSkKKwkJZ290byBlcnI7CisJciA9IEFFU191bndyYXBfa2V5KCZ3Y3R4LCBpdiwgcHRtcCwgb3RtcCwgcik7CisKKwlpZiAobWVtY21wKGtleSwgcHRtcCwga2V5bGVuKSkKKwkJZ290byBlcnI7CisKKwlyZXQgPSAxOworCisJZXJyOgorCWlmIChvdG1wKQorCQlPUEVOU1NMX2ZyZWUob3RtcCk7CisJaWYgKHB0bXApCisJCU9QRU5TU0xfZnJlZShwdG1wKTsKKworCXJldHVybiByZXQ7CisKKwl9CisKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtla1tdID0geworICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLAorICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LAorICAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrZXlbXSA9IHsKKyAgMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywKKyAgMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZiwKKyAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZgorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZTFbXSA9IHsKKyAgMHgxZiwgMHhhNiwgMHg4YiwgMHgwYSwgMHg4MSwgMHgxMiwgMHhiNCwgMHg0NywKKyAgMHhhZSwgMHhmMywgMHg0YiwgMHhkOCwgMHhmYiwgMHg1YSwgMHg3YiwgMHg4MiwKKyAgMHg5ZCwgMHgzZSwgMHg4NiwgMHgyMywgMHg3MSwgMHhkMiwgMHhjZiwgMHhlNQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZTJbXSA9IHsKKyAgMHg5NiwgMHg3NywgMHg4YiwgMHgyNSwgMHhhZSwgMHg2YywgMHhhNCwgMHgzNSwKKyAgMHhmOSwgMHgyYiwgMHg1YiwgMHg5NywgMHhjMCwgMHg1MCwgMHhhZSwgMHhkMiwKKyAgMHg0NiwgMHg4YSwgMHhiOCwgMHhhMSwgMHg3YSwgMHhkOCwgMHg0ZSwgMHg1ZAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZTNbXSA9IHsKKyAgMHg2NCwgMHhlOCwgMHhjMywgMHhmOSwgMHhjZSwgMHgwZiwgMHg1YiwgMHhhMiwKKyAgMHg2MywgMHhlOSwgMHg3NywgMHg3OSwgMHgwNSwgMHg4MSwgMHg4YSwgMHgyYSwKKyAgMHg5MywgMHhjOCwgMHgxOSwgMHgxZSwgMHg3ZCwgMHg2ZSwgMHg4YSwgMHhlNworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZTRbXSA9IHsKKyAgMHgwMywgMHgxZCwgMHgzMywgMHgyNiwgMHg0ZSwgMHgxNSwgMHhkMywgMHgzMiwKKyAgMHg2OCwgMHhmMiwgMHg0ZSwgMHhjMiwgMHg2MCwgMHg3NCwgMHgzZSwgMHhkYywKKyAgMHhlMSwgMHhjNiwgMHhjNywgMHhkZCwgMHhlZSwgMHg3MiwgMHg1YSwgMHg5MywKKyAgMHg2YiwgMHhhOCwgMHgxNCwgMHg5MSwgMHg1YywgMHg2NywgMHg2MiwgMHhkMgorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZTVbXSA9IHsKKyAgMHhhOCwgMHhmOSwgMHhiYywgMHgxNiwgMHgxMiwgMHhjNiwgMHg4YiwgMHgzZiwKKyAgMHhmNiwgMHhlNiwgMHhmNCwgMHhmYiwgMHhlMywgMHgwZSwgMHg3MSwgMHhlNCwKKyAgMHg3NiwgMHg5YywgMHg4YiwgMHg4MCwgMHhhMywgMHgyYywgMHhiOCwgMHg5NSwKKyAgMHg4YywgMHhkNSwgMHhkMSwgMHg3ZCwgMHg2YiwgMHgyNSwgMHg0ZCwgMHhhMQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZTZbXSA9IHsKKyAgMHgyOCwgMHhjOSwgMHhmNCwgMHgwNCwgMHhjNCwgMHhiOCwgMHgxMCwgMHhmNCwKKyAgMHhjYiwgMHhjYywgMHhiMywgMHg1YywgMHhmYiwgMHg4NywgMHhmOCwgMHgyNiwKKyAgMHgzZiwgMHg1NywgMHg4NiwgMHhlMiwgMHhkOCwgMHgwZSwgMHhkMywgMHgyNiwKKyAgMHhjYiwgMHhjNywgMHhmMCwgMHhlNywgMHgxYSwgMHg5OSwgMHhmNCwgMHgzYiwKKyAgMHhmYiwgMHg5OCwgMHg4YiwgMHg5YiwgMHg3YSwgMHgwMiwgMHhkZCwgMHgyMQorfTsKKworCUFFU19LRVkgd2N0eCwgeGN0eDsKKwlpbnQgcmV0OworCXJldCA9IEFFU193cmFwX3Vud3JhcF90ZXN0KGtlaywgMTI4LCBOVUxMLCBlMSwga2V5LCAxNik7CisJZnByaW50ZihzdGRlcnIsICJLZXkgdGVzdCByZXN1bHQgJWRcbiIsIHJldCk7CisJcmV0ID0gQUVTX3dyYXBfdW53cmFwX3Rlc3Qoa2VrLCAxOTIsIE5VTEwsIGUyLCBrZXksIDE2KTsKKwlmcHJpbnRmKHN0ZGVyciwgIktleSB0ZXN0IHJlc3VsdCAlZFxuIiwgcmV0KTsKKwlyZXQgPSBBRVNfd3JhcF91bndyYXBfdGVzdChrZWssIDI1NiwgTlVMTCwgZTMsIGtleSwgMTYpOworCWZwcmludGYoc3RkZXJyLCAiS2V5IHRlc3QgcmVzdWx0ICVkXG4iLCByZXQpOworCXJldCA9IEFFU193cmFwX3Vud3JhcF90ZXN0KGtlaywgMTkyLCBOVUxMLCBlNCwga2V5LCAyNCk7CisJZnByaW50ZihzdGRlcnIsICJLZXkgdGVzdCByZXN1bHQgJWRcbiIsIHJldCk7CisJcmV0ID0gQUVTX3dyYXBfdW53cmFwX3Rlc3Qoa2VrLCAyNTYsIE5VTEwsIGU1LCBrZXksIDI0KTsKKwlmcHJpbnRmKHN0ZGVyciwgIktleSB0ZXN0IHJlc3VsdCAlZFxuIiwgcmV0KTsKKwlyZXQgPSBBRVNfd3JhcF91bndyYXBfdGVzdChrZWssIDI1NiwgTlVMTCwgZTYsIGtleSwgMzIpOworCWZwcmludGYoc3RkZXJyLCAiS2V5IHRlc3QgcmVzdWx0ICVkXG4iLCByZXQpOworfQorCQorCQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc194ODZjb3JlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2Flc194ODZjb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyM2UyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYWVzX3g4NmNvcmUuYwpAQCAtMCwwICsxLDEwNjMgQEAKKy8qIGNyeXB0by9hZXMvYWVzX2NvcmUuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyoqCisgKiByaWpuZGFlbC1hbGctZnN0LmMKKyAqCisgKiBAdmVyc2lvbiAzLjAgKERlY2VtYmVyIDIwMDApCisgKgorICogT3B0aW1pc2VkIEFOU0kgQyBjb2RlIGZvciB0aGUgUmlqbmRhZWwgY2lwaGVyIChub3cgQUVTKQorICoKKyAqIEBhdXRob3IgVmluY2VudCBSaWptZW4gPHZpbmNlbnQucmlqbWVuQGVzYXQua3VsZXV2ZW4uYWMuYmU+CisgKiBAYXV0aG9yIEFudG9vbiBCb3NzZWxhZXJzIDxhbnRvb24uYm9zc2VsYWVyc0Blc2F0Lmt1bGV1dmVuLmFjLmJlPgorICogQGF1dGhvciBQYXVsbyBCYXJyZXRvIDxwYXVsby5iYXJyZXRvQHRlcnJhLmNvbS5icj4KKyAqCisgKiBUaGlzIGNvZGUgaXMgaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1JTICcnQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKKyAqIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVGhpcyBpcyBleHBlcmltZW50YWwgeDg2W182NF0gZGVyaXZhdGl2ZS4gSXQgYXNzdW1lcyBsaXR0bGUtZW5kaWFuCisgKiBieXRlIG9yZGVyIGFuZCBleHBlY3RzIENQVSB0byBzdXN0YWluIHVuYWxpZ25lZCBtZW1vcnkgcmVmZXJlbmNlcy4KKyAqIEl0IGlzIHVzZWQgYXMgcGxheWdyb3VuZCBmb3IgY2FjaGUtdGltZSBhdHRhY2sgbWl0aWdhdGlvbnMgYW5kCisgKiBzZXJ2ZXMgYXMgcmVmZXJlbmNlIEMgaW1wbGVtZW50YXRpb24gZm9yIHg4NltfNjRdIGFzc2VtYmxlci4KKyAqCisgKgkJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorICovCisKKworI2lmbmRlZiBBRVNfREVCVUcKKyMgaWZuZGVmIE5ERUJVRworIyAgZGVmaW5lIE5ERUJVRworIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgImFlc19sb2NsLmgiCisKKy8qCisgKiBUaGVzZSB0d28gcGFyYW1ldGVycyBjb250cm9sIHdoaWNoIHRhYmxlLCAyNTYtYnl0ZSBvciAyS0IsIGlzCisgKiByZWZlcmVuY2VkIGluIG91dGVyIGFuZCByZXNwZWN0aXZlbHkgaW5uZXIgcm91bmRzLgorICovCisjZGVmaW5lIEFFU19DT01QQUNUX0lOX09VVEVSX1JPVU5EUworI2lmZGVmICBBRVNfQ09NUEFDVF9JTl9PVVRFUl9ST1VORFMKKy8qIEFFU19DT01QQUNUX0lOX09VVEVSX1JPVU5EUyBjb3N0cyB+MzAlIGluIHBlcmZvcm1hbmNlLCB3aGlsZQorICogYWRkaW5nIEFFU19DT01QQUNUX0lOX0lOTkVSX1JPVU5EUyByZWR1Y2VzIGJlbmNobWFyayAqZnVydGhlcioKKyAqIGJ5IGZhY3RvciBvZiB+Mi4gKi8KKyMgdW5kZWYgIEFFU19DT01QQUNUX0lOX0lOTkVSX1JPVU5EUworI2VuZGlmCisKKyNpZiAxCitzdGF0aWMgdm9pZCBwcmVmZXRjaDI1Nihjb25zdCB2b2lkICp0YWJsZSkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICp0PSh2b2lkICopdGFibGUscmV0OworCXVuc2lnbmVkIGxvbmcgc3VtOworCWludCBpOworCisJLyogMzIgaXMgY29tbW9uIGxlYXN0IGNhY2hlLWxpbmUgc2l6ZSAqLworCWZvciAoc3VtPTAsaT0wO2k8MjU2L3NpemVvZih0WzBdKTtpKz0zMi9zaXplb2YodFswXSkpCXN1bSBePSB0W2ldOworCisJcmV0ID0gc3VtOworfQorI2Vsc2UKKyMgZGVmaW5lIHByZWZldGNoMjU2KHQpCisjZW5kaWYKKworI3VuZGVmIEdFVFUzMgorI2RlZmluZSBHRVRVMzIocCkgKCooKHUzMiopKHApKSkKKworI2lmIChkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1NjQ7CisjZGVmaW5lIFU2NChDKQlDIyNVSTY0CisjZWxpZiBkZWZpbmVkKF9fYXJjaDY0X18pCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdTY0OworI2RlZmluZSBVNjQoQykJQyMjVUwKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1NjQ7CisjZGVmaW5lIFU2NChDKQlDIyNVTEwKKyNlbmRpZgorCisjdW5kZWYgUk9UQVRFCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX0lDQykKKyMgZGVmaW5lIFJPVEFURShhLG4pCV9scm90bChhLG4pCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXz49MgorIyBpZiBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorIyAgIGRlZmluZSBST1RBVEUoYSxuKQkoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmV0OwlcCisJCQkJYXNtICgJCQlcCisJCQkJInJvbGwgJTEsJTAiCQlcCisJCQkJOiAiPXIiKHJldCkJCVwKKwkJCQk6ICJJIihuKSwgIjAiKGEpCVwKKwkJCQk6ICJjYyIpOwkJXAorCQkJICAgcmV0OwkJCQlcCisJCQl9KQorIyBlbmRpZgorI2VuZGlmCisvKgorVGUgW3hdID0gUyBbeF0uWzAyLCAwMSwgMDEsIDAzLCAwMiwgMDEsIDAxLCAwM107CitUZTBbeF0gPSBTIFt4XS5bMDIsIDAxLCAwMSwgMDNdOworVGUxW3hdID0gUyBbeF0uWzAzLCAwMiwgMDEsIDAxXTsKK1RlMlt4XSA9IFMgW3hdLlswMSwgMDMsIDAyLCAwMV07CitUZTNbeF0gPSBTIFt4XS5bMDEsIDAxLCAwMywgMDJdOworKi8KKyNkZWZpbmUgVGUwICh1MzIpKCh1NjQqKSgodTgqKVRlKzApKQorI2RlZmluZSBUZTEgKHUzMikoKHU2NCopKCh1OCopVGUrMykpCisjZGVmaW5lIFRlMiAodTMyKSgodTY0KikoKHU4KilUZSsyKSkKKyNkZWZpbmUgVGUzICh1MzIpKCh1NjQqKSgodTgqKVRlKzEpKQorLyoKK1RkIFt4XSA9IFNpW3hdLlswZSwgMDksIDBkLCAwYiwgMGUsIDA5LCAwZCwgMGJdOworVGQwW3hdID0gU2lbeF0uWzBlLCAwOSwgMGQsIDBiXTsKK1RkMVt4XSA9IFNpW3hdLlswYiwgMGUsIDA5LCAwZF07CitUZDJbeF0gPSBTaVt4XS5bMGQsIDBiLCAwZSwgMDldOworVGQzW3hdID0gU2lbeF0uWzA5LCAwZCwgMGIsIDBlXTsKK1RkNFt4XSA9IFNpW3hdLlswMV07CisqLworI2RlZmluZSBUZDAgKHUzMikoKHU2NCopKCh1OCopVGQrMCkpCisjZGVmaW5lIFRkMSAodTMyKSgodTY0KikoKHU4KilUZCszKSkKKyNkZWZpbmUgVGQyICh1MzIpKCh1NjQqKSgodTgqKVRkKzIpKQorI2RlZmluZSBUZDMgKHUzMikoKHU2NCopKCh1OCopVGQrMSkpCisKK3N0YXRpYyBjb25zdCB1NjQgVGVbMjU2XSA9IHsKKyAgICBVNjQoMHhhNTYzNjNjNmE1NjM2M2M2KSwgVTY0KDB4ODQ3YzdjZjg4NDdjN2NmOCksCisgICAgVTY0KDB4OTk3Nzc3ZWU5OTc3NzdlZSksIFU2NCgweDhkN2I3YmY2OGQ3YjdiZjYpLAorICAgIFU2NCgweDBkZjJmMmZmMGRmMmYyZmYpLCBVNjQoMHhiZDZiNmJkNmJkNmI2YmQ2KSwKKyAgICBVNjQoMHhiMTZmNmZkZWIxNmY2ZmRlKSwgVTY0KDB4NTRjNWM1OTE1NGM1YzU5MSksCisgICAgVTY0KDB4NTAzMDMwNjA1MDMwMzA2MCksIFU2NCgweDAzMDEwMTAyMDMwMTAxMDIpLAorICAgIFU2NCgweGE5Njc2N2NlYTk2NzY3Y2UpLCBVNjQoMHg3ZDJiMmI1NjdkMmIyYjU2KSwKKyAgICBVNjQoMHgxOWZlZmVlNzE5ZmVmZWU3KSwgVTY0KDB4NjJkN2Q3YjU2MmQ3ZDdiNSksCisgICAgVTY0KDB4ZTZhYmFiNGRlNmFiYWI0ZCksIFU2NCgweDlhNzY3NmVjOWE3Njc2ZWMpLAorICAgIFU2NCgweDQ1Y2FjYThmNDVjYWNhOGYpLCBVNjQoMHg5ZDgyODIxZjlkODI4MjFmKSwKKyAgICBVNjQoMHg0MGM5Yzk4OTQwYzljOTg5KSwgVTY0KDB4ODc3ZDdkZmE4NzdkN2RmYSksCisgICAgVTY0KDB4MTVmYWZhZWYxNWZhZmFlZiksIFU2NCgweGViNTk1OWIyZWI1OTU5YjIpLAorICAgIFU2NCgweGM5NDc0NzhlYzk0NzQ3OGUpLCBVNjQoMHgwYmYwZjBmYjBiZjBmMGZiKSwKKyAgICBVNjQoMHhlY2FkYWQ0MWVjYWRhZDQxKSwgVTY0KDB4NjdkNGQ0YjM2N2Q0ZDRiMyksCisgICAgVTY0KDB4ZmRhMmEyNWZmZGEyYTI1ZiksIFU2NCgweGVhYWZhZjQ1ZWFhZmFmNDUpLAorICAgIFU2NCgweGJmOWM5YzIzYmY5YzljMjMpLCBVNjQoMHhmN2E0YTQ1M2Y3YTRhNDUzKSwKKyAgICBVNjQoMHg5NjcyNzJlNDk2NzI3MmU0KSwgVTY0KDB4NWJjMGMwOWI1YmMwYzA5YiksCisgICAgVTY0KDB4YzJiN2I3NzVjMmI3Yjc3NSksIFU2NCgweDFjZmRmZGUxMWNmZGZkZTEpLAorICAgIFU2NCgweGFlOTM5MzNkYWU5MzkzM2QpLCBVNjQoMHg2YTI2MjY0YzZhMjYyNjRjKSwKKyAgICBVNjQoMHg1YTM2MzY2YzVhMzYzNjZjKSwgVTY0KDB4NDEzZjNmN2U0MTNmM2Y3ZSksCisgICAgVTY0KDB4MDJmN2Y3ZjUwMmY3ZjdmNSksIFU2NCgweDRmY2NjYzgzNGZjY2NjODMpLAorICAgIFU2NCgweDVjMzQzNDY4NWMzNDM0NjgpLCBVNjQoMHhmNGE1YTU1MWY0YTVhNTUxKSwKKyAgICBVNjQoMHgzNGU1ZTVkMTM0ZTVlNWQxKSwgVTY0KDB4MDhmMWYxZjkwOGYxZjFmOSksCisgICAgVTY0KDB4OTM3MTcxZTI5MzcxNzFlMiksIFU2NCgweDczZDhkOGFiNzNkOGQ4YWIpLAorICAgIFU2NCgweDUzMzEzMTYyNTMzMTMxNjIpLCBVNjQoMHgzZjE1MTUyYTNmMTUxNTJhKSwKKyAgICBVNjQoMHgwYzA0MDQwODBjMDQwNDA4KSwgVTY0KDB4NTJjN2M3OTU1MmM3Yzc5NSksCisgICAgVTY0KDB4NjUyMzIzNDY2NTIzMjM0NiksIFU2NCgweDVlYzNjMzlkNWVjM2MzOWQpLAorICAgIFU2NCgweDI4MTgxODMwMjgxODE4MzApLCBVNjQoMHhhMTk2OTYzN2ExOTY5NjM3KSwKKyAgICBVNjQoMHgwZjA1MDUwYTBmMDUwNTBhKSwgVTY0KDB4YjU5YTlhMmZiNTlhOWEyZiksCisgICAgVTY0KDB4MDkwNzA3MGUwOTA3MDcwZSksIFU2NCgweDM2MTIxMjI0MzYxMjEyMjQpLAorICAgIFU2NCgweDliODA4MDFiOWI4MDgwMWIpLCBVNjQoMHgzZGUyZTJkZjNkZTJlMmRmKSwKKyAgICBVNjQoMHgyNmViZWJjZDI2ZWJlYmNkKSwgVTY0KDB4NjkyNzI3NGU2OTI3Mjc0ZSksCisgICAgVTY0KDB4Y2RiMmIyN2ZjZGIyYjI3ZiksIFU2NCgweDlmNzU3NWVhOWY3NTc1ZWEpLAorICAgIFU2NCgweDFiMDkwOTEyMWIwOTA5MTIpLCBVNjQoMHg5ZTgzODMxZDllODM4MzFkKSwKKyAgICBVNjQoMHg3NDJjMmM1ODc0MmMyYzU4KSwgVTY0KDB4MmUxYTFhMzQyZTFhMWEzNCksCisgICAgVTY0KDB4MmQxYjFiMzYyZDFiMWIzNiksIFU2NCgweGIyNmU2ZWRjYjI2ZTZlZGMpLAorICAgIFU2NCgweGVlNWE1YWI0ZWU1YTVhYjQpLCBVNjQoMHhmYmEwYTA1YmZiYTBhMDViKSwKKyAgICBVNjQoMHhmNjUyNTJhNGY2NTI1MmE0KSwgVTY0KDB4NGQzYjNiNzY0ZDNiM2I3NiksCisgICAgVTY0KDB4NjFkNmQ2Yjc2MWQ2ZDZiNyksIFU2NCgweGNlYjNiMzdkY2ViM2IzN2QpLAorICAgIFU2NCgweDdiMjkyOTUyN2IyOTI5NTIpLCBVNjQoMHgzZWUzZTNkZDNlZTNlM2RkKSwKKyAgICBVNjQoMHg3MTJmMmY1ZTcxMmYyZjVlKSwgVTY0KDB4OTc4NDg0MTM5Nzg0ODQxMyksCisgICAgVTY0KDB4ZjU1MzUzYTZmNTUzNTNhNiksIFU2NCgweDY4ZDFkMWI5NjhkMWQxYjkpLAorICAgIFU2NCgweDAwMDAwMDAwMDAwMDAwMDApLCBVNjQoMHgyY2VkZWRjMTJjZWRlZGMxKSwKKyAgICBVNjQoMHg2MDIwMjA0MDYwMjAyMDQwKSwgVTY0KDB4MWZmY2ZjZTMxZmZjZmNlMyksCisgICAgVTY0KDB4YzhiMWIxNzljOGIxYjE3OSksIFU2NCgweGVkNWI1YmI2ZWQ1YjViYjYpLAorICAgIFU2NCgweGJlNmE2YWQ0YmU2YTZhZDQpLCBVNjQoMHg0NmNiY2I4ZDQ2Y2JjYjhkKSwKKyAgICBVNjQoMHhkOWJlYmU2N2Q5YmViZTY3KSwgVTY0KDB4NGIzOTM5NzI0YjM5Mzk3MiksCisgICAgVTY0KDB4ZGU0YTRhOTRkZTRhNGE5NCksIFU2NCgweGQ0NGM0Yzk4ZDQ0YzRjOTgpLAorICAgIFU2NCgweGU4NTg1OGIwZTg1ODU4YjApLCBVNjQoMHg0YWNmY2Y4NTRhY2ZjZjg1KSwKKyAgICBVNjQoMHg2YmQwZDBiYjZiZDBkMGJiKSwgVTY0KDB4MmFlZmVmYzUyYWVmZWZjNSksCisgICAgVTY0KDB4ZTVhYWFhNGZlNWFhYWE0ZiksIFU2NCgweDE2ZmJmYmVkMTZmYmZiZWQpLAorICAgIFU2NCgweGM1NDM0Mzg2YzU0MzQzODYpLCBVNjQoMHhkNzRkNGQ5YWQ3NGQ0ZDlhKSwKKyAgICBVNjQoMHg1NTMzMzM2NjU1MzMzMzY2KSwgVTY0KDB4OTQ4NTg1MTE5NDg1ODUxMSksCisgICAgVTY0KDB4Y2Y0NTQ1OGFjZjQ1NDU4YSksIFU2NCgweDEwZjlmOWU5MTBmOWY5ZTkpLAorICAgIFU2NCgweDA2MDIwMjA0MDYwMjAyMDQpLCBVNjQoMHg4MTdmN2ZmZTgxN2Y3ZmZlKSwKKyAgICBVNjQoMHhmMDUwNTBhMGYwNTA1MGEwKSwgVTY0KDB4NDQzYzNjNzg0NDNjM2M3OCksCisgICAgVTY0KDB4YmE5ZjlmMjViYTlmOWYyNSksIFU2NCgweGUzYThhODRiZTNhOGE4NGIpLAorICAgIFU2NCgweGYzNTE1MWEyZjM1MTUxYTIpLCBVNjQoMHhmZWEzYTM1ZGZlYTNhMzVkKSwKKyAgICBVNjQoMHhjMDQwNDA4MGMwNDA0MDgwKSwgVTY0KDB4OGE4ZjhmMDU4YThmOGYwNSksCisgICAgVTY0KDB4YWQ5MjkyM2ZhZDkyOTIzZiksIFU2NCgweGJjOWQ5ZDIxYmM5ZDlkMjEpLAorICAgIFU2NCgweDQ4MzgzODcwNDgzODM4NzApLCBVNjQoMHgwNGY1ZjVmMTA0ZjVmNWYxKSwKKyAgICBVNjQoMHhkZmJjYmM2M2RmYmNiYzYzKSwgVTY0KDB4YzFiNmI2NzdjMWI2YjY3NyksCisgICAgVTY0KDB4NzVkYWRhYWY3NWRhZGFhZiksIFU2NCgweDYzMjEyMTQyNjMyMTIxNDIpLAorICAgIFU2NCgweDMwMTAxMDIwMzAxMDEwMjApLCBVNjQoMHgxYWZmZmZlNTFhZmZmZmU1KSwKKyAgICBVNjQoMHgwZWYzZjNmZDBlZjNmM2ZkKSwgVTY0KDB4NmRkMmQyYmY2ZGQyZDJiZiksCisgICAgVTY0KDB4NGNjZGNkODE0Y2NkY2Q4MSksIFU2NCgweDE0MGMwYzE4MTQwYzBjMTgpLAorICAgIFU2NCgweDM1MTMxMzI2MzUxMzEzMjYpLCBVNjQoMHgyZmVjZWNjMzJmZWNlY2MzKSwKKyAgICBVNjQoMHhlMTVmNWZiZWUxNWY1ZmJlKSwgVTY0KDB4YTI5Nzk3MzVhMjk3OTczNSksCisgICAgVTY0KDB4Y2M0NDQ0ODhjYzQ0NDQ4OCksIFU2NCgweDM5MTcxNzJlMzkxNzE3MmUpLAorICAgIFU2NCgweDU3YzRjNDkzNTdjNGM0OTMpLCBVNjQoMHhmMmE3YTc1NWYyYTdhNzU1KSwKKyAgICBVNjQoMHg4MjdlN2VmYzgyN2U3ZWZjKSwgVTY0KDB4NDczZDNkN2E0NzNkM2Q3YSksCisgICAgVTY0KDB4YWM2NDY0YzhhYzY0NjRjOCksIFU2NCgweGU3NWQ1ZGJhZTc1ZDVkYmEpLAorICAgIFU2NCgweDJiMTkxOTMyMmIxOTE5MzIpLCBVNjQoMHg5NTczNzNlNjk1NzM3M2U2KSwKKyAgICBVNjQoMHhhMDYwNjBjMGEwNjA2MGMwKSwgVTY0KDB4OTg4MTgxMTk5ODgxODExOSksCisgICAgVTY0KDB4ZDE0ZjRmOWVkMTRmNGY5ZSksIFU2NCgweDdmZGNkY2EzN2ZkY2RjYTMpLAorICAgIFU2NCgweDY2MjIyMjQ0NjYyMjIyNDQpLCBVNjQoMHg3ZTJhMmE1NDdlMmEyYTU0KSwKKyAgICBVNjQoMHhhYjkwOTAzYmFiOTA5MDNiKSwgVTY0KDB4ODM4ODg4MGI4Mzg4ODgwYiksCisgICAgVTY0KDB4Y2E0NjQ2OGNjYTQ2NDY4YyksIFU2NCgweDI5ZWVlZWM3MjllZWVlYzcpLAorICAgIFU2NCgweGQzYjhiODZiZDNiOGI4NmIpLCBVNjQoMHgzYzE0MTQyODNjMTQxNDI4KSwKKyAgICBVNjQoMHg3OWRlZGVhNzc5ZGVkZWE3KSwgVTY0KDB4ZTI1ZTVlYmNlMjVlNWViYyksCisgICAgVTY0KDB4MWQwYjBiMTYxZDBiMGIxNiksIFU2NCgweDc2ZGJkYmFkNzZkYmRiYWQpLAorICAgIFU2NCgweDNiZTBlMGRiM2JlMGUwZGIpLCBVNjQoMHg1NjMyMzI2NDU2MzIzMjY0KSwKKyAgICBVNjQoMHg0ZTNhM2E3NDRlM2EzYTc0KSwgVTY0KDB4MWUwYTBhMTQxZTBhMGExNCksCisgICAgVTY0KDB4ZGI0OTQ5OTJkYjQ5NDk5MiksIFU2NCgweDBhMDYwNjBjMGEwNjA2MGMpLAorICAgIFU2NCgweDZjMjQyNDQ4NmMyNDI0NDgpLCBVNjQoMHhlNDVjNWNiOGU0NWM1Y2I4KSwKKyAgICBVNjQoMHg1ZGMyYzI5ZjVkYzJjMjlmKSwgVTY0KDB4NmVkM2QzYmQ2ZWQzZDNiZCksCisgICAgVTY0KDB4ZWZhY2FjNDNlZmFjYWM0MyksIFU2NCgweGE2NjI2MmM0YTY2MjYyYzQpLAorICAgIFU2NCgweGE4OTE5MTM5YTg5MTkxMzkpLCBVNjQoMHhhNDk1OTUzMWE0OTU5NTMxKSwKKyAgICBVNjQoMHgzN2U0ZTRkMzM3ZTRlNGQzKSwgVTY0KDB4OGI3OTc5ZjI4Yjc5NzlmMiksCisgICAgVTY0KDB4MzJlN2U3ZDUzMmU3ZTdkNSksIFU2NCgweDQzYzhjODhiNDNjOGM4OGIpLAorICAgIFU2NCgweDU5MzczNzZlNTkzNzM3NmUpLCBVNjQoMHhiNzZkNmRkYWI3NmQ2ZGRhKSwKKyAgICBVNjQoMHg4YzhkOGQwMThjOGQ4ZDAxKSwgVTY0KDB4NjRkNWQ1YjE2NGQ1ZDViMSksCisgICAgVTY0KDB4ZDI0ZTRlOWNkMjRlNGU5YyksIFU2NCgweGUwYTlhOTQ5ZTBhOWE5NDkpLAorICAgIFU2NCgweGI0NmM2Y2Q4YjQ2YzZjZDgpLCBVNjQoMHhmYTU2NTZhY2ZhNTY1NmFjKSwKKyAgICBVNjQoMHgwN2Y0ZjRmMzA3ZjRmNGYzKSwgVTY0KDB4MjVlYWVhY2YyNWVhZWFjZiksCisgICAgVTY0KDB4YWY2NTY1Y2FhZjY1NjVjYSksIFU2NCgweDhlN2E3YWY0OGU3YTdhZjQpLAorICAgIFU2NCgweGU5YWVhZTQ3ZTlhZWFlNDcpLCBVNjQoMHgxODA4MDgxMDE4MDgwODEwKSwKKyAgICBVNjQoMHhkNWJhYmE2ZmQ1YmFiYTZmKSwgVTY0KDB4ODg3ODc4ZjA4ODc4NzhmMCksCisgICAgVTY0KDB4NmYyNTI1NGE2ZjI1MjU0YSksIFU2NCgweDcyMmUyZTVjNzIyZTJlNWMpLAorICAgIFU2NCgweDI0MWMxYzM4MjQxYzFjMzgpLCBVNjQoMHhmMWE2YTY1N2YxYTZhNjU3KSwKKyAgICBVNjQoMHhjN2I0YjQ3M2M3YjRiNDczKSwgVTY0KDB4NTFjNmM2OTc1MWM2YzY5NyksCisgICAgVTY0KDB4MjNlOGU4Y2IyM2U4ZThjYiksIFU2NCgweDdjZGRkZGExN2NkZGRkYTEpLAorICAgIFU2NCgweDljNzQ3NGU4OWM3NDc0ZTgpLCBVNjQoMHgyMTFmMWYzZTIxMWYxZjNlKSwKKyAgICBVNjQoMHhkZDRiNGI5NmRkNGI0Yjk2KSwgVTY0KDB4ZGNiZGJkNjFkY2JkYmQ2MSksCisgICAgVTY0KDB4ODY4YjhiMGQ4NjhiOGIwZCksIFU2NCgweDg1OGE4YTBmODU4YThhMGYpLAorICAgIFU2NCgweDkwNzA3MGUwOTA3MDcwZTApLCBVNjQoMHg0MjNlM2U3YzQyM2UzZTdjKSwKKyAgICBVNjQoMHhjNGI1YjU3MWM0YjViNTcxKSwgVTY0KDB4YWE2NjY2Y2NhYTY2NjZjYyksCisgICAgVTY0KDB4ZDg0ODQ4OTBkODQ4NDg5MCksIFU2NCgweDA1MDMwMzA2MDUwMzAzMDYpLAorICAgIFU2NCgweDAxZjZmNmY3MDFmNmY2ZjcpLCBVNjQoMHgxMjBlMGUxYzEyMGUwZTFjKSwKKyAgICBVNjQoMHhhMzYxNjFjMmEzNjE2MWMyKSwgVTY0KDB4NWYzNTM1NmE1ZjM1MzU2YSksCisgICAgVTY0KDB4Zjk1NzU3YWVmOTU3NTdhZSksIFU2NCgweGQwYjliOTY5ZDBiOWI5NjkpLAorICAgIFU2NCgweDkxODY4NjE3OTE4Njg2MTcpLCBVNjQoMHg1OGMxYzE5OTU4YzFjMTk5KSwKKyAgICBVNjQoMHgyNzFkMWQzYTI3MWQxZDNhKSwgVTY0KDB4Yjk5ZTllMjdiOTllOWUyNyksCisgICAgVTY0KDB4MzhlMWUxZDkzOGUxZTFkOSksIFU2NCgweDEzZjhmOGViMTNmOGY4ZWIpLAorICAgIFU2NCgweGIzOTg5ODJiYjM5ODk4MmIpLCBVNjQoMHgzMzExMTEyMjMzMTExMTIyKSwKKyAgICBVNjQoMHhiYjY5NjlkMmJiNjk2OWQyKSwgVTY0KDB4NzBkOWQ5YTk3MGQ5ZDlhOSksCisgICAgVTY0KDB4ODk4ZThlMDc4OThlOGUwNyksIFU2NCgweGE3OTQ5NDMzYTc5NDk0MzMpLAorICAgIFU2NCgweGI2OWI5YjJkYjY5YjliMmQpLCBVNjQoMHgyMjFlMWUzYzIyMWUxZTNjKSwKKyAgICBVNjQoMHg5Mjg3ODcxNTkyODc4NzE1KSwgVTY0KDB4MjBlOWU5YzkyMGU5ZTljOSksCisgICAgVTY0KDB4NDljZWNlODc0OWNlY2U4NyksIFU2NCgweGZmNTU1NWFhZmY1NTU1YWEpLAorICAgIFU2NCgweDc4MjgyODUwNzgyODI4NTApLCBVNjQoMHg3YWRmZGZhNTdhZGZkZmE1KSwKKyAgICBVNjQoMHg4ZjhjOGMwMzhmOGM4YzAzKSwgVTY0KDB4ZjhhMWExNTlmOGExYTE1OSksCisgICAgVTY0KDB4ODA4OTg5MDk4MDg5ODkwOSksIFU2NCgweDE3MGQwZDFhMTcwZDBkMWEpLAorICAgIFU2NCgweGRhYmZiZjY1ZGFiZmJmNjUpLCBVNjQoMHgzMWU2ZTZkNzMxZTZlNmQ3KSwKKyAgICBVNjQoMHhjNjQyNDI4NGM2NDI0Mjg0KSwgVTY0KDB4Yjg2ODY4ZDBiODY4NjhkMCksCisgICAgVTY0KDB4YzM0MTQxODJjMzQxNDE4MiksIFU2NCgweGIwOTk5OTI5YjA5OTk5MjkpLAorICAgIFU2NCgweDc3MmQyZDVhNzcyZDJkNWEpLCBVNjQoMHgxMTBmMGYxZTExMGYwZjFlKSwKKyAgICBVNjQoMHhjYmIwYjA3YmNiYjBiMDdiKSwgVTY0KDB4ZmM1NDU0YThmYzU0NTRhOCksCisgICAgVTY0KDB4ZDZiYmJiNmRkNmJiYmI2ZCksIFU2NCgweDNhMTYxNjJjM2ExNjE2MmMpCit9OworCitzdGF0aWMgY29uc3QgdTggVGU0WzI1Nl0gPSB7CisgICAgMHg2M1UsIDB4N2NVLCAweDc3VSwgMHg3YlUsIDB4ZjJVLCAweDZiVSwgMHg2ZlUsIDB4YzVVLAorICAgIDB4MzBVLCAweDAxVSwgMHg2N1UsIDB4MmJVLCAweGZlVSwgMHhkN1UsIDB4YWJVLCAweDc2VSwKKyAgICAweGNhVSwgMHg4MlUsIDB4YzlVLCAweDdkVSwgMHhmYVUsIDB4NTlVLCAweDQ3VSwgMHhmMFUsCisgICAgMHhhZFUsIDB4ZDRVLCAweGEyVSwgMHhhZlUsIDB4OWNVLCAweGE0VSwgMHg3MlUsIDB4YzBVLAorICAgIDB4YjdVLCAweGZkVSwgMHg5M1UsIDB4MjZVLCAweDM2VSwgMHgzZlUsIDB4ZjdVLCAweGNjVSwKKyAgICAweDM0VSwgMHhhNVUsIDB4ZTVVLCAweGYxVSwgMHg3MVUsIDB4ZDhVLCAweDMxVSwgMHgxNVUsCisgICAgMHgwNFUsIDB4YzdVLCAweDIzVSwgMHhjM1UsIDB4MThVLCAweDk2VSwgMHgwNVUsIDB4OWFVLAorICAgIDB4MDdVLCAweDEyVSwgMHg4MFUsIDB4ZTJVLCAweGViVSwgMHgyN1UsIDB4YjJVLCAweDc1VSwKKyAgICAweDA5VSwgMHg4M1UsIDB4MmNVLCAweDFhVSwgMHgxYlUsIDB4NmVVLCAweDVhVSwgMHhhMFUsCisgICAgMHg1MlUsIDB4M2JVLCAweGQ2VSwgMHhiM1UsIDB4MjlVLCAweGUzVSwgMHgyZlUsIDB4ODRVLAorICAgIDB4NTNVLCAweGQxVSwgMHgwMFUsIDB4ZWRVLCAweDIwVSwgMHhmY1UsIDB4YjFVLCAweDViVSwKKyAgICAweDZhVSwgMHhjYlUsIDB4YmVVLCAweDM5VSwgMHg0YVUsIDB4NGNVLCAweDU4VSwgMHhjZlUsCisgICAgMHhkMFUsIDB4ZWZVLCAweGFhVSwgMHhmYlUsIDB4NDNVLCAweDRkVSwgMHgzM1UsIDB4ODVVLAorICAgIDB4NDVVLCAweGY5VSwgMHgwMlUsIDB4N2ZVLCAweDUwVSwgMHgzY1UsIDB4OWZVLCAweGE4VSwKKyAgICAweDUxVSwgMHhhM1UsIDB4NDBVLCAweDhmVSwgMHg5MlUsIDB4OWRVLCAweDM4VSwgMHhmNVUsCisgICAgMHhiY1UsIDB4YjZVLCAweGRhVSwgMHgyMVUsIDB4MTBVLCAweGZmVSwgMHhmM1UsIDB4ZDJVLAorICAgIDB4Y2RVLCAweDBjVSwgMHgxM1UsIDB4ZWNVLCAweDVmVSwgMHg5N1UsIDB4NDRVLCAweDE3VSwKKyAgICAweGM0VSwgMHhhN1UsIDB4N2VVLCAweDNkVSwgMHg2NFUsIDB4NWRVLCAweDE5VSwgMHg3M1UsCisgICAgMHg2MFUsIDB4ODFVLCAweDRmVSwgMHhkY1UsIDB4MjJVLCAweDJhVSwgMHg5MFUsIDB4ODhVLAorICAgIDB4NDZVLCAweGVlVSwgMHhiOFUsIDB4MTRVLCAweGRlVSwgMHg1ZVUsIDB4MGJVLCAweGRiVSwKKyAgICAweGUwVSwgMHgzMlUsIDB4M2FVLCAweDBhVSwgMHg0OVUsIDB4MDZVLCAweDI0VSwgMHg1Y1UsCisgICAgMHhjMlUsIDB4ZDNVLCAweGFjVSwgMHg2MlUsIDB4OTFVLCAweDk1VSwgMHhlNFUsIDB4NzlVLAorICAgIDB4ZTdVLCAweGM4VSwgMHgzN1UsIDB4NmRVLCAweDhkVSwgMHhkNVUsIDB4NGVVLCAweGE5VSwKKyAgICAweDZjVSwgMHg1NlUsIDB4ZjRVLCAweGVhVSwgMHg2NVUsIDB4N2FVLCAweGFlVSwgMHgwOFUsCisgICAgMHhiYVUsIDB4NzhVLCAweDI1VSwgMHgyZVUsIDB4MWNVLCAweGE2VSwgMHhiNFUsIDB4YzZVLAorICAgIDB4ZThVLCAweGRkVSwgMHg3NFUsIDB4MWZVLCAweDRiVSwgMHhiZFUsIDB4OGJVLCAweDhhVSwKKyAgICAweDcwVSwgMHgzZVUsIDB4YjVVLCAweDY2VSwgMHg0OFUsIDB4MDNVLCAweGY2VSwgMHgwZVUsCisgICAgMHg2MVUsIDB4MzVVLCAweDU3VSwgMHhiOVUsIDB4ODZVLCAweGMxVSwgMHgxZFUsIDB4OWVVLAorICAgIDB4ZTFVLCAweGY4VSwgMHg5OFUsIDB4MTFVLCAweDY5VSwgMHhkOVUsIDB4OGVVLCAweDk0VSwKKyAgICAweDliVSwgMHgxZVUsIDB4ODdVLCAweGU5VSwgMHhjZVUsIDB4NTVVLCAweDI4VSwgMHhkZlUsCisgICAgMHg4Y1UsIDB4YTFVLCAweDg5VSwgMHgwZFUsIDB4YmZVLCAweGU2VSwgMHg0MlUsIDB4NjhVLAorICAgIDB4NDFVLCAweDk5VSwgMHgyZFUsIDB4MGZVLCAweGIwVSwgMHg1NFUsIDB4YmJVLCAweDE2VQorfTsKKworc3RhdGljIGNvbnN0IHU2NCBUZFsyNTZdID0geworICAgIFU2NCgweDUwYTdmNDUxNTBhN2Y0NTEpLCBVNjQoMHg1MzY1NDE3ZTUzNjU0MTdlKSwKKyAgICBVNjQoMHhjM2E0MTcxYWMzYTQxNzFhKSwgVTY0KDB4OTY1ZTI3M2E5NjVlMjczYSksCisgICAgVTY0KDB4Y2I2YmFiM2JjYjZiYWIzYiksIFU2NCgweGYxNDU5ZDFmZjE0NTlkMWYpLAorICAgIFU2NCgweGFiNThmYWFjYWI1OGZhYWMpLCBVNjQoMHg5MzAzZTM0YjkzMDNlMzRiKSwKKyAgICBVNjQoMHg1NWZhMzAyMDU1ZmEzMDIwKSwgVTY0KDB4ZjY2ZDc2YWRmNjZkNzZhZCksCisgICAgVTY0KDB4OTE3NmNjODg5MTc2Y2M4OCksIFU2NCgweDI1NGMwMmY1MjU0YzAyZjUpLAorICAgIFU2NCgweGZjZDdlNTRmZmNkN2U1NGYpLCBVNjQoMHhkN2NiMmFjNWQ3Y2IyYWM1KSwKKyAgICBVNjQoMHg4MDQ0MzUyNjgwNDQzNTI2KSwgVTY0KDB4OGZhMzYyYjU4ZmEzNjJiNSksCisgICAgVTY0KDB4NDk1YWIxZGU0OTVhYjFkZSksIFU2NCgweDY3MWJiYTI1NjcxYmJhMjUpLAorICAgIFU2NCgweDk4MGVlYTQ1OTgwZWVhNDUpLCBVNjQoMHhlMWMwZmU1ZGUxYzBmZTVkKSwKKyAgICBVNjQoMHgwMjc1MmZjMzAyNzUyZmMzKSwgVTY0KDB4MTJmMDRjODExMmYwNGM4MSksCisgICAgVTY0KDB4YTM5NzQ2OGRhMzk3NDY4ZCksIFU2NCgweGM2ZjlkMzZiYzZmOWQzNmIpLAorICAgIFU2NCgweGU3NWY4ZjAzZTc1ZjhmMDMpLCBVNjQoMHg5NTljOTIxNTk1OWM5MjE1KSwKKyAgICBVNjQoMHhlYjdhNmRiZmViN2E2ZGJmKSwgVTY0KDB4ZGE1OTUyOTVkYTU5NTI5NSksCisgICAgVTY0KDB4MmQ4M2JlZDQyZDgzYmVkNCksIFU2NCgweGQzMjE3NDU4ZDMyMTc0NTgpLAorICAgIFU2NCgweDI5NjllMDQ5Mjk2OWUwNDkpLCBVNjQoMHg0NGM4Yzk4ZTQ0YzhjOThlKSwKKyAgICBVNjQoMHg2YTg5YzI3NTZhODljMjc1KSwgVTY0KDB4Nzg3OThlZjQ3ODc5OGVmNCksCisgICAgVTY0KDB4NmIzZTU4OTk2YjNlNTg5OSksIFU2NCgweGRkNzFiOTI3ZGQ3MWI5MjcpLAorICAgIFU2NCgweGI2NGZlMWJlYjY0ZmUxYmUpLCBVNjQoMHgxN2FkODhmMDE3YWQ4OGYwKSwKKyAgICBVNjQoMHg2NmFjMjBjOTY2YWMyMGM5KSwgVTY0KDB4YjQzYWNlN2RiNDNhY2U3ZCksCisgICAgVTY0KDB4MTg0YWRmNjMxODRhZGY2MyksIFU2NCgweDgyMzExYWU1ODIzMTFhZTUpLAorICAgIFU2NCgweDYwMzM1MTk3NjAzMzUxOTcpLCBVNjQoMHg0NTdmNTM2MjQ1N2Y1MzYyKSwKKyAgICBVNjQoMHhlMDc3NjRiMWUwNzc2NGIxKSwgVTY0KDB4ODRhZTZiYmI4NGFlNmJiYiksCisgICAgVTY0KDB4MWNhMDgxZmUxY2EwODFmZSksIFU2NCgweDk0MmIwOGY5OTQyYjA4ZjkpLAorICAgIFU2NCgweDU4Njg0ODcwNTg2ODQ4NzApLCBVNjQoMHgxOWZkNDU4ZjE5ZmQ0NThmKSwKKyAgICBVNjQoMHg4NzZjZGU5NDg3NmNkZTk0KSwgVTY0KDB4YjdmODdiNTJiN2Y4N2I1MiksCisgICAgVTY0KDB4MjNkMzczYWIyM2QzNzNhYiksIFU2NCgweGUyMDI0YjcyZTIwMjRiNzIpLAorICAgIFU2NCgweDU3OGYxZmUzNTc4ZjFmZTMpLCBVNjQoMHgyYWFiNTU2NjJhYWI1NTY2KSwKKyAgICBVNjQoMHgwNzI4ZWJiMjA3MjhlYmIyKSwgVTY0KDB4MDNjMmI1MmYwM2MyYjUyZiksCisgICAgVTY0KDB4OWE3YmM1ODY5YTdiYzU4NiksIFU2NCgweGE1MDgzN2QzYTUwODM3ZDMpLAorICAgIFU2NCgweGYyODcyODMwZjI4NzI4MzApLCBVNjQoMHhiMmE1YmYyM2IyYTViZjIzKSwKKyAgICBVNjQoMHhiYTZhMDMwMmJhNmEwMzAyKSwgVTY0KDB4NWM4MjE2ZWQ1YzgyMTZlZCksCisgICAgVTY0KDB4MmIxY2NmOGEyYjFjY2Y4YSksIFU2NCgweDkyYjQ3OWE3OTJiNDc5YTcpLAorICAgIFU2NCgweGYwZjIwN2YzZjBmMjA3ZjMpLCBVNjQoMHhhMWUyNjk0ZWExZTI2OTRlKSwKKyAgICBVNjQoMHhjZGY0ZGE2NWNkZjRkYTY1KSwgVTY0KDB4ZDViZTA1MDZkNWJlMDUwNiksCisgICAgVTY0KDB4MWY2MjM0ZDExZjYyMzRkMSksIFU2NCgweDhhZmVhNmM0OGFmZWE2YzQpLAorICAgIFU2NCgweDlkNTMyZTM0OWQ1MzJlMzQpLCBVNjQoMHhhMDU1ZjNhMmEwNTVmM2EyKSwKKyAgICBVNjQoMHgzMmUxOGEwNTMyZTE4YTA1KSwgVTY0KDB4NzVlYmY2YTQ3NWViZjZhNCksCisgICAgVTY0KDB4MzllYzgzMGIzOWVjODMwYiksIFU2NCgweGFhZWY2MDQwYWFlZjYwNDApLAorICAgIFU2NCgweDA2OWY3MTVlMDY5ZjcxNWUpLCBVNjQoMHg1MTEwNmViZDUxMTA2ZWJkKSwKKyAgICBVNjQoMHhmOThhMjEzZWY5OGEyMTNlKSwgVTY0KDB4M2QwNmRkOTYzZDA2ZGQ5NiksCisgICAgVTY0KDB4YWUwNTNlZGRhZTA1M2VkZCksIFU2NCgweDQ2YmRlNjRkNDZiZGU2NGQpLAorICAgIFU2NCgweGI1OGQ1NDkxYjU4ZDU0OTEpLCBVNjQoMHgwNTVkYzQ3MTA1NWRjNDcxKSwKKyAgICBVNjQoMHg2ZmQ0MDYwNDZmZDQwNjA0KSwgVTY0KDB4ZmYxNTUwNjBmZjE1NTA2MCksCisgICAgVTY0KDB4MjRmYjk4MTkyNGZiOTgxOSksIFU2NCgweDk3ZTliZGQ2OTdlOWJkZDYpLAorICAgIFU2NCgweGNjNDM0MDg5Y2M0MzQwODkpLCBVNjQoMHg3NzllZDk2Nzc3OWVkOTY3KSwKKyAgICBVNjQoMHhiZDQyZThiMGJkNDJlOGIwKSwgVTY0KDB4ODg4Yjg5MDc4ODhiODkwNyksCisgICAgVTY0KDB4Mzg1YjE5ZTczODViMTllNyksIFU2NCgweGRiZWVjODc5ZGJlZWM4NzkpLAorICAgIFU2NCgweDQ3MGE3Y2ExNDcwYTdjYTEpLCBVNjQoMHhlOTBmNDI3Y2U5MGY0MjdjKSwKKyAgICBVNjQoMHhjOTFlODRmOGM5MWU4NGY4KSwgVTY0KDB4MDAwMDAwMDAwMDAwMDAwMCksCisgICAgVTY0KDB4ODM4NjgwMDk4Mzg2ODAwOSksIFU2NCgweDQ4ZWQyYjMyNDhlZDJiMzIpLAorICAgIFU2NCgweGFjNzAxMTFlYWM3MDExMWUpLCBVNjQoMHg0ZTcyNWE2YzRlNzI1YTZjKSwKKyAgICBVNjQoMHhmYmZmMGVmZGZiZmYwZWZkKSwgVTY0KDB4NTYzODg1MGY1NjM4ODUwZiksCisgICAgVTY0KDB4MWVkNWFlM2QxZWQ1YWUzZCksIFU2NCgweDI3MzkyZDM2MjczOTJkMzYpLAorICAgIFU2NCgweDY0ZDkwZjBhNjRkOTBmMGEpLCBVNjQoMHgyMWE2NWM2ODIxYTY1YzY4KSwKKyAgICBVNjQoMHhkMTU0NWI5YmQxNTQ1YjliKSwgVTY0KDB4M2EyZTM2MjQzYTJlMzYyNCksCisgICAgVTY0KDB4YjE2NzBhMGNiMTY3MGEwYyksIFU2NCgweDBmZTc1NzkzMGZlNzU3OTMpLAorICAgIFU2NCgweGQyOTZlZWI0ZDI5NmVlYjQpLCBVNjQoMHg5ZTkxOWIxYjllOTE5YjFiKSwKKyAgICBVNjQoMHg0ZmM1YzA4MDRmYzVjMDgwKSwgVTY0KDB4YTIyMGRjNjFhMjIwZGM2MSksCisgICAgVTY0KDB4Njk0Yjc3NWE2OTRiNzc1YSksIFU2NCgweDE2MWExMjFjMTYxYTEyMWMpLAorICAgIFU2NCgweDBhYmE5M2UyMGFiYTkzZTIpLCBVNjQoMHhlNTJhYTBjMGU1MmFhMGMwKSwKKyAgICBVNjQoMHg0M2UwMjIzYzQzZTAyMjNjKSwgVTY0KDB4MWQxNzFiMTIxZDE3MWIxMiksCisgICAgVTY0KDB4MGIwZDA5MGUwYjBkMDkwZSksIFU2NCgweGFkYzc4YmYyYWRjNzhiZjIpLAorICAgIFU2NCgweGI5YThiNjJkYjlhOGI2MmQpLCBVNjQoMHhjOGE5MWUxNGM4YTkxZTE0KSwKKyAgICBVNjQoMHg4NTE5ZjE1Nzg1MTlmMTU3KSwgVTY0KDB4NGMwNzc1YWY0YzA3NzVhZiksCisgICAgVTY0KDB4YmJkZDk5ZWViYmRkOTllZSksIFU2NCgweGZkNjA3ZmEzZmQ2MDdmYTMpLAorICAgIFU2NCgweDlmMjYwMWY3OWYyNjAxZjcpLCBVNjQoMHhiY2Y1NzI1Y2JjZjU3MjVjKSwKKyAgICBVNjQoMHhjNTNiNjY0NGM1M2I2NjQ0KSwgVTY0KDB4MzQ3ZWZiNWIzNDdlZmI1YiksCisgICAgVTY0KDB4NzYyOTQzOGI3NjI5NDM4YiksIFU2NCgweGRjYzYyM2NiZGNjNjIzY2IpLAorICAgIFU2NCgweDY4ZmNlZGI2NjhmY2VkYjYpLCBVNjQoMHg2M2YxZTRiODYzZjFlNGI4KSwKKyAgICBVNjQoMHhjYWRjMzFkN2NhZGMzMWQ3KSwgVTY0KDB4MTA4NTYzNDIxMDg1NjM0MiksCisgICAgVTY0KDB4NDAyMjk3MTM0MDIyOTcxMyksIFU2NCgweDIwMTFjNjg0MjAxMWM2ODQpLAorICAgIFU2NCgweDdkMjQ0YTg1N2QyNDRhODUpLCBVNjQoMHhmODNkYmJkMmY4M2RiYmQyKSwKKyAgICBVNjQoMHgxMTMyZjlhZTExMzJmOWFlKSwgVTY0KDB4NmRhMTI5Yzc2ZGExMjljNyksCisgICAgVTY0KDB4NGIyZjllMWQ0YjJmOWUxZCksIFU2NCgweGYzMzBiMmRjZjMzMGIyZGMpLAorICAgIFU2NCgweGVjNTI4NjBkZWM1Mjg2MGQpLCBVNjQoMHhkMGUzYzE3N2QwZTNjMTc3KSwKKyAgICBVNjQoMHg2YzE2YjMyYjZjMTZiMzJiKSwgVTY0KDB4OTliOTcwYTk5OWI5NzBhOSksCisgICAgVTY0KDB4ZmE0ODk0MTFmYTQ4OTQxMSksIFU2NCgweDIyNjRlOTQ3MjI2NGU5NDcpLAorICAgIFU2NCgweGM0OGNmY2E4YzQ4Y2ZjYTgpLCBVNjQoMHgxYTNmZjBhMDFhM2ZmMGEwKSwKKyAgICBVNjQoMHhkODJjN2Q1NmQ4MmM3ZDU2KSwgVTY0KDB4ZWY5MDMzMjJlZjkwMzMyMiksCisgICAgVTY0KDB4Yzc0ZTQ5ODdjNzRlNDk4NyksIFU2NCgweGMxZDEzOGQ5YzFkMTM4ZDkpLAorICAgIFU2NCgweGZlYTJjYThjZmVhMmNhOGMpLCBVNjQoMHgzNjBiZDQ5ODM2MGJkNDk4KSwKKyAgICBVNjQoMHhjZjgxZjVhNmNmODFmNWE2KSwgVTY0KDB4MjhkZTdhYTUyOGRlN2FhNSksCisgICAgVTY0KDB4MjY4ZWI3ZGEyNjhlYjdkYSksIFU2NCgweGE0YmZhZDNmYTRiZmFkM2YpLAorICAgIFU2NCgweGU0OWQzYTJjZTQ5ZDNhMmMpLCBVNjQoMHgwZDkyNzg1MDBkOTI3ODUwKSwKKyAgICBVNjQoMHg5YmNjNWY2YTliY2M1ZjZhKSwgVTY0KDB4NjI0NjdlNTQ2MjQ2N2U1NCksCisgICAgVTY0KDB4YzIxMzhkZjZjMjEzOGRmNiksIFU2NCgweGU4YjhkODkwZThiOGQ4OTApLAorICAgIFU2NCgweDVlZjczOTJlNWVmNzM5MmUpLCBVNjQoMHhmNWFmYzM4MmY1YWZjMzgyKSwKKyAgICBVNjQoMHhiZTgwNWQ5ZmJlODA1ZDlmKSwgVTY0KDB4N2M5M2QwNjk3YzkzZDA2OSksCisgICAgVTY0KDB4YTkyZGQ1NmZhOTJkZDU2ZiksIFU2NCgweGIzMTIyNWNmYjMxMjI1Y2YpLAorICAgIFU2NCgweDNiOTlhY2M4M2I5OWFjYzgpLCBVNjQoMHhhNzdkMTgxMGE3N2QxODEwKSwKKyAgICBVNjQoMHg2ZTYzOWNlODZlNjM5Y2U4KSwgVTY0KDB4N2JiYjNiZGI3YmJiM2JkYiksCisgICAgVTY0KDB4MDk3ODI2Y2QwOTc4MjZjZCksIFU2NCgweGY0MTg1OTZlZjQxODU5NmUpLAorICAgIFU2NCgweDAxYjc5YWVjMDFiNzlhZWMpLCBVNjQoMHhhODlhNGY4M2E4OWE0ZjgzKSwKKyAgICBVNjQoMHg2NTZlOTVlNjY1NmU5NWU2KSwgVTY0KDB4N2VlNmZmYWE3ZWU2ZmZhYSksCisgICAgVTY0KDB4MDhjZmJjMjEwOGNmYmMyMSksIFU2NCgweGU2ZTgxNWVmZTZlODE1ZWYpLAorICAgIFU2NCgweGQ5OWJlN2JhZDk5YmU3YmEpLCBVNjQoMHhjZTM2NmY0YWNlMzY2ZjRhKSwKKyAgICBVNjQoMHhkNDA5OWZlYWQ0MDk5ZmVhKSwgVTY0KDB4ZDY3Y2IwMjlkNjdjYjAyOSksCisgICAgVTY0KDB4YWZiMmE0MzFhZmIyYTQzMSksIFU2NCgweDMxMjMzZjJhMzEyMzNmMmEpLAorICAgIFU2NCgweDMwOTRhNWM2MzA5NGE1YzYpLCBVNjQoMHhjMDY2YTIzNWMwNjZhMjM1KSwKKyAgICBVNjQoMHgzN2JjNGU3NDM3YmM0ZTc0KSwgVTY0KDB4YTZjYTgyZmNhNmNhODJmYyksCisgICAgVTY0KDB4YjBkMDkwZTBiMGQwOTBlMCksIFU2NCgweDE1ZDhhNzMzMTVkOGE3MzMpLAorICAgIFU2NCgweDRhOTgwNGYxNGE5ODA0ZjEpLCBVNjQoMHhmN2RhZWM0MWY3ZGFlYzQxKSwKKyAgICBVNjQoMHgwZTUwY2Q3ZjBlNTBjZDdmKSwgVTY0KDB4MmZmNjkxMTcyZmY2OTExNyksCisgICAgVTY0KDB4OGRkNjRkNzY4ZGQ2NGQ3NiksIFU2NCgweDRkYjBlZjQzNGRiMGVmNDMpLAorICAgIFU2NCgweDU0NGRhYWNjNTQ0ZGFhY2MpLCBVNjQoMHhkZjA0OTZlNGRmMDQ5NmU0KSwKKyAgICBVNjQoMHhlM2I1ZDE5ZWUzYjVkMTllKSwgVTY0KDB4MWI4ODZhNGMxYjg4NmE0YyksCisgICAgVTY0KDB4YjgxZjJjYzFiODFmMmNjMSksIFU2NCgweDdmNTE2NTQ2N2Y1MTY1NDYpLAorICAgIFU2NCgweDA0ZWE1ZTlkMDRlYTVlOWQpLCBVNjQoMHg1ZDM1OGMwMTVkMzU4YzAxKSwKKyAgICBVNjQoMHg3Mzc0ODdmYTczNzQ4N2ZhKSwgVTY0KDB4MmU0MTBiZmIyZTQxMGJmYiksCisgICAgVTY0KDB4NWExZDY3YjM1YTFkNjdiMyksIFU2NCgweDUyZDJkYjkyNTJkMmRiOTIpLAorICAgIFU2NCgweDMzNTYxMGU5MzM1NjEwZTkpLCBVNjQoMHgxMzQ3ZDY2ZDEzNDdkNjZkKSwKKyAgICBVNjQoMHg4YzYxZDc5YThjNjFkNzlhKSwgVTY0KDB4N2EwY2ExMzc3YTBjYTEzNyksCisgICAgVTY0KDB4OGUxNGY4NTk4ZTE0Zjg1OSksIFU2NCgweDg5M2MxM2ViODkzYzEzZWIpLAorICAgIFU2NCgweGVlMjdhOWNlZWUyN2E5Y2UpLCBVNjQoMHgzNWM5NjFiNzM1Yzk2MWI3KSwKKyAgICBVNjQoMHhlZGU1MWNlMWVkZTUxY2UxKSwgVTY0KDB4M2NiMTQ3N2EzY2IxNDc3YSksCisgICAgVTY0KDB4NTlkZmQyOWM1OWRmZDI5YyksIFU2NCgweDNmNzNmMjU1M2Y3M2YyNTUpLAorICAgIFU2NCgweDc5Y2UxNDE4NzljZTE0MTgpLCBVNjQoMHhiZjM3Yzc3M2JmMzdjNzczKSwKKyAgICBVNjQoMHhlYWNkZjc1M2VhY2RmNzUzKSwgVTY0KDB4NWJhYWZkNWY1YmFhZmQ1ZiksCisgICAgVTY0KDB4MTQ2ZjNkZGYxNDZmM2RkZiksIFU2NCgweDg2ZGI0NDc4ODZkYjQ0NzgpLAorICAgIFU2NCgweDgxZjNhZmNhODFmM2FmY2EpLCBVNjQoMHgzZWM0NjhiOTNlYzQ2OGI5KSwKKyAgICBVNjQoMHgyYzM0MjQzODJjMzQyNDM4KSwgVTY0KDB4NWY0MGEzYzI1ZjQwYTNjMiksCisgICAgVTY0KDB4NzJjMzFkMTY3MmMzMWQxNiksIFU2NCgweDBjMjVlMmJjMGMyNWUyYmMpLAorICAgIFU2NCgweDhiNDkzYzI4OGI0OTNjMjgpLCBVNjQoMHg0MTk1MGRmZjQxOTUwZGZmKSwKKyAgICBVNjQoMHg3MTAxYTgzOTcxMDFhODM5KSwgVTY0KDB4ZGViMzBjMDhkZWIzMGMwOCksCisgICAgVTY0KDB4OWNlNGI0ZDg5Y2U0YjRkOCksIFU2NCgweDkwYzE1NjY0OTBjMTU2NjQpLAorICAgIFU2NCgweDYxODRjYjdiNjE4NGNiN2IpLCBVNjQoMHg3MGI2MzJkNTcwYjYzMmQ1KSwKKyAgICBVNjQoMHg3NDVjNmM0ODc0NWM2YzQ4KSwgVTY0KDB4NDI1N2I4ZDA0MjU3YjhkMCkKK307CitzdGF0aWMgY29uc3QgdTggVGQ0WzI1Nl0gPSB7CisgICAgMHg1MlUsIDB4MDlVLCAweDZhVSwgMHhkNVUsIDB4MzBVLCAweDM2VSwgMHhhNVUsIDB4MzhVLAorICAgIDB4YmZVLCAweDQwVSwgMHhhM1UsIDB4OWVVLCAweDgxVSwgMHhmM1UsIDB4ZDdVLCAweGZiVSwKKyAgICAweDdjVSwgMHhlM1UsIDB4MzlVLCAweDgyVSwgMHg5YlUsIDB4MmZVLCAweGZmVSwgMHg4N1UsCisgICAgMHgzNFUsIDB4OGVVLCAweDQzVSwgMHg0NFUsIDB4YzRVLCAweGRlVSwgMHhlOVUsIDB4Y2JVLAorICAgIDB4NTRVLCAweDdiVSwgMHg5NFUsIDB4MzJVLCAweGE2VSwgMHhjMlUsIDB4MjNVLCAweDNkVSwKKyAgICAweGVlVSwgMHg0Y1UsIDB4OTVVLCAweDBiVSwgMHg0MlUsIDB4ZmFVLCAweGMzVSwgMHg0ZVUsCisgICAgMHgwOFUsIDB4MmVVLCAweGExVSwgMHg2NlUsIDB4MjhVLCAweGQ5VSwgMHgyNFUsIDB4YjJVLAorICAgIDB4NzZVLCAweDViVSwgMHhhMlUsIDB4NDlVLCAweDZkVSwgMHg4YlUsIDB4ZDFVLCAweDI1VSwKKyAgICAweDcyVSwgMHhmOFUsIDB4ZjZVLCAweDY0VSwgMHg4NlUsIDB4NjhVLCAweDk4VSwgMHgxNlUsCisgICAgMHhkNFUsIDB4YTRVLCAweDVjVSwgMHhjY1UsIDB4NWRVLCAweDY1VSwgMHhiNlUsIDB4OTJVLAorICAgIDB4NmNVLCAweDcwVSwgMHg0OFUsIDB4NTBVLCAweGZkVSwgMHhlZFUsIDB4YjlVLCAweGRhVSwKKyAgICAweDVlVSwgMHgxNVUsIDB4NDZVLCAweDU3VSwgMHhhN1UsIDB4OGRVLCAweDlkVSwgMHg4NFUsCisgICAgMHg5MFUsIDB4ZDhVLCAweGFiVSwgMHgwMFUsIDB4OGNVLCAweGJjVSwgMHhkM1UsIDB4MGFVLAorICAgIDB4ZjdVLCAweGU0VSwgMHg1OFUsIDB4MDVVLCAweGI4VSwgMHhiM1UsIDB4NDVVLCAweDA2VSwKKyAgICAweGQwVSwgMHgyY1UsIDB4MWVVLCAweDhmVSwgMHhjYVUsIDB4M2ZVLCAweDBmVSwgMHgwMlUsCisgICAgMHhjMVUsIDB4YWZVLCAweGJkVSwgMHgwM1UsIDB4MDFVLCAweDEzVSwgMHg4YVUsIDB4NmJVLAorICAgIDB4M2FVLCAweDkxVSwgMHgxMVUsIDB4NDFVLCAweDRmVSwgMHg2N1UsIDB4ZGNVLCAweGVhVSwKKyAgICAweDk3VSwgMHhmMlUsIDB4Y2ZVLCAweGNlVSwgMHhmMFUsIDB4YjRVLCAweGU2VSwgMHg3M1UsCisgICAgMHg5NlUsIDB4YWNVLCAweDc0VSwgMHgyMlUsIDB4ZTdVLCAweGFkVSwgMHgzNVUsIDB4ODVVLAorICAgIDB4ZTJVLCAweGY5VSwgMHgzN1UsIDB4ZThVLCAweDFjVSwgMHg3NVUsIDB4ZGZVLCAweDZlVSwKKyAgICAweDQ3VSwgMHhmMVUsIDB4MWFVLCAweDcxVSwgMHgxZFUsIDB4MjlVLCAweGM1VSwgMHg4OVUsCisgICAgMHg2ZlUsIDB4YjdVLCAweDYyVSwgMHgwZVUsIDB4YWFVLCAweDE4VSwgMHhiZVUsIDB4MWJVLAorICAgIDB4ZmNVLCAweDU2VSwgMHgzZVUsIDB4NGJVLCAweGM2VSwgMHhkMlUsIDB4NzlVLCAweDIwVSwKKyAgICAweDlhVSwgMHhkYlUsIDB4YzBVLCAweGZlVSwgMHg3OFUsIDB4Y2RVLCAweDVhVSwgMHhmNFUsCisgICAgMHgxZlUsIDB4ZGRVLCAweGE4VSwgMHgzM1UsIDB4ODhVLCAweDA3VSwgMHhjN1UsIDB4MzFVLAorICAgIDB4YjFVLCAweDEyVSwgMHgxMFUsIDB4NTlVLCAweDI3VSwgMHg4MFUsIDB4ZWNVLCAweDVmVSwKKyAgICAweDYwVSwgMHg1MVUsIDB4N2ZVLCAweGE5VSwgMHgxOVUsIDB4YjVVLCAweDRhVSwgMHgwZFUsCisgICAgMHgyZFUsIDB4ZTVVLCAweDdhVSwgMHg5ZlUsIDB4OTNVLCAweGM5VSwgMHg5Y1UsIDB4ZWZVLAorICAgIDB4YTBVLCAweGUwVSwgMHgzYlUsIDB4NGRVLCAweGFlVSwgMHgyYVUsIDB4ZjVVLCAweGIwVSwKKyAgICAweGM4VSwgMHhlYlUsIDB4YmJVLCAweDNjVSwgMHg4M1UsIDB4NTNVLCAweDk5VSwgMHg2MVUsCisgICAgMHgxN1UsIDB4MmJVLCAweDA0VSwgMHg3ZVUsIDB4YmFVLCAweDc3VSwgMHhkNlUsIDB4MjZVLAorICAgIDB4ZTFVLCAweDY5VSwgMHgxNFUsIDB4NjNVLCAweDU1VSwgMHgyMVUsIDB4MGNVLCAweDdkVQorfTsKKworc3RhdGljIGNvbnN0IHUzMiByY29uW10gPSB7CisgICAgMHgwMDAwMDAwMVUsIDB4MDAwMDAwMDJVLCAweDAwMDAwMDA0VSwgMHgwMDAwMDAwOFUsCisgICAgMHgwMDAwMDAxMFUsIDB4MDAwMDAwMjBVLCAweDAwMDAwMDQwVSwgMHgwMDAwMDA4MFUsCisgICAgMHgwMDAwMDAxYlUsIDB4MDAwMDAwMzZVLCAvKiBmb3IgMTI4LWJpdCBibG9ja3MsIFJpam5kYWVsIG5ldmVyIHVzZXMgbW9yZSB0aGFuIDEwIHJjb24gdmFsdWVzICovCit9OworCisvKioKKyAqIEV4cGFuZCB0aGUgY2lwaGVyIGtleSBpbnRvIHRoZSBlbmNyeXB0aW9uIGtleSBzY2hlZHVsZS4KKyAqLworaW50IEFFU19zZXRfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisJCQlBRVNfS0VZICprZXkpIHsKKworCXUzMiAqcms7CisgICAJaW50IGkgPSAwOworCXUzMiB0ZW1wOworCisJaWYgKCF1c2VyS2V5IHx8ICFrZXkpCisJCXJldHVybiAtMTsKKwlpZiAoYml0cyAhPSAxMjggJiYgYml0cyAhPSAxOTIgJiYgYml0cyAhPSAyNTYpCisJCXJldHVybiAtMjsKKworCXJrID0ga2V5LT5yZF9rZXk7CisKKwlpZiAoYml0cz09MTI4KQorCQlrZXktPnJvdW5kcyA9IDEwOworCWVsc2UgaWYgKGJpdHM9PTE5MikKKwkJa2V5LT5yb3VuZHMgPSAxMjsKKwllbHNlCisJCWtleS0+cm91bmRzID0gMTQ7CisKKwlya1swXSA9IEdFVFUzMih1c2VyS2V5ICAgICApOworCXJrWzFdID0gR0VUVTMyKHVzZXJLZXkgKyAgNCk7CisJcmtbMl0gPSBHRVRVMzIodXNlcktleSArICA4KTsKKwlya1szXSA9IEdFVFUzMih1c2VyS2V5ICsgMTIpOworCWlmIChiaXRzID09IDEyOCkgeworCQl3aGlsZSAoMSkgeworCQkJdGVtcCAgPSBya1szXTsKKwkJCXJrWzRdID0gcmtbMF0gXgorCQkJCShUZTRbKHRlbXAgPj4gIDgpICYgMHhmZl0gICAgICApIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdIDw8ICA4KSBeCisJCQkJKFRlNFsodGVtcCA+PiAyNCkgICAgICAgXSA8PCAxNikgXgorCQkJCShUZTRbKHRlbXAgICAgICApICYgMHhmZl0gPDwgMjQpIF4KKwkJCQlyY29uW2ldOworCQkJcmtbNV0gPSBya1sxXSBeIHJrWzRdOworCQkJcmtbNl0gPSBya1syXSBeIHJrWzVdOworCQkJcmtbN10gPSBya1szXSBeIHJrWzZdOworCQkJaWYgKCsraSA9PSAxMCkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmsgKz0gNDsKKwkJfQorCX0KKwlya1s0XSA9IEdFVFUzMih1c2VyS2V5ICsgMTYpOworCXJrWzVdID0gR0VUVTMyKHVzZXJLZXkgKyAyMCk7CisJaWYgKGJpdHMgPT0gMTkyKSB7CisJCXdoaWxlICgxKSB7CisJCQl0ZW1wID0gcmtbIDVdOworCQkJcmtbIDZdID0gcmtbIDBdIF4KKwkJCQkoVGU0Wyh0ZW1wID4+ICA4KSAmIDB4ZmZdICAgICAgKSBeCisJCQkJKFRlNFsodGVtcCA+PiAxNikgJiAweGZmXSA8PCAgOCkgXgorCQkJCShUZTRbKHRlbXAgPj4gMjQpICAgICAgIF0gPDwgMTYpIF4KKwkJCQkoVGU0Wyh0ZW1wICAgICAgKSAmIDB4ZmZdIDw8IDI0KSBeCisJCQkJcmNvbltpXTsKKwkJCXJrWyA3XSA9IHJrWyAxXSBeIHJrWyA2XTsKKwkJCXJrWyA4XSA9IHJrWyAyXSBeIHJrWyA3XTsKKwkJCXJrWyA5XSA9IHJrWyAzXSBeIHJrWyA4XTsKKwkJCWlmICgrK2kgPT0gOCkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJcmtbMTBdID0gcmtbIDRdIF4gcmtbIDldOworCQkJcmtbMTFdID0gcmtbIDVdIF4gcmtbMTBdOworCQkJcmsgKz0gNjsKKwkJfQorCX0KKwlya1s2XSA9IEdFVFUzMih1c2VyS2V5ICsgMjQpOworCXJrWzddID0gR0VUVTMyKHVzZXJLZXkgKyAyOCk7CisJaWYgKGJpdHMgPT0gMjU2KSB7CisJCXdoaWxlICgxKSB7CisJCQl0ZW1wID0gcmtbIDddOworCQkJcmtbIDhdID0gcmtbIDBdIF4KKwkJCQkoVGU0Wyh0ZW1wID4+ICA4KSAmIDB4ZmZdICAgICAgKSBeCisJCQkJKFRlNFsodGVtcCA+PiAxNikgJiAweGZmXSA8PCAgOCkgXgorCQkJCShUZTRbKHRlbXAgPj4gMjQpICAgICAgIF0gPDwgMTYpIF4KKwkJCQkoVGU0Wyh0ZW1wICAgICAgKSAmIDB4ZmZdIDw8IDI0KSBeCisJCQkJcmNvbltpXTsKKwkJCXJrWyA5XSA9IHJrWyAxXSBeIHJrWyA4XTsKKwkJCXJrWzEwXSA9IHJrWyAyXSBeIHJrWyA5XTsKKwkJCXJrWzExXSA9IHJrWyAzXSBeIHJrWzEwXTsKKwkJCWlmICgrK2kgPT0gNykgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJdGVtcCA9IHJrWzExXTsKKwkJCXJrWzEyXSA9IHJrWyA0XSBeCisJCQkJKFRlNFsodGVtcCAgICAgICkgJiAweGZmXSAgICAgICkgXgorCQkJCShUZTRbKHRlbXAgPj4gIDgpICYgMHhmZl0gPDwgIDgpIF4KKwkJCQkoVGU0Wyh0ZW1wID4+IDE2KSAmIDB4ZmZdIDw8IDE2KSBeCisJCQkJKFRlNFsodGVtcCA+PiAyNCkgICAgICAgXSA8PCAyNCk7CisJCQlya1sxM10gPSBya1sgNV0gXiBya1sxMl07CisJCQlya1sxNF0gPSBya1sgNl0gXiBya1sxM107CisJCQlya1sxNV0gPSBya1sgN10gXiBya1sxNF07CisKKwkJCXJrICs9IDg7CisgICAgICAgIAl9CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIEV4cGFuZCB0aGUgY2lwaGVyIGtleSBpbnRvIHRoZSBkZWNyeXB0aW9uIGtleSBzY2hlZHVsZS4KKyAqLworaW50IEFFU19zZXRfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisJCQkgQUVTX0tFWSAqa2V5KSB7CisKKyAgICAgICAgdTMyICpyazsKKwlpbnQgaSwgaiwgc3RhdHVzOworCXUzMiB0ZW1wOworCisJLyogZmlyc3QsIHN0YXJ0IHdpdGggYW4gZW5jcnlwdGlvbiBzY2hlZHVsZSAqLworCXN0YXR1cyA9IEFFU19zZXRfZW5jcnlwdF9rZXkodXNlcktleSwgYml0cywga2V5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXJrID0ga2V5LT5yZF9rZXk7CisKKwkvKiBpbnZlcnQgdGhlIG9yZGVyIG9mIHRoZSByb3VuZCBrZXlzOiAqLworCWZvciAoaSA9IDAsIGogPSA0KihrZXktPnJvdW5kcyk7IGkgPCBqOyBpICs9IDQsIGogLT0gNCkgeworCQl0ZW1wID0gcmtbaSAgICBdOyBya1tpICAgIF0gPSBya1tqICAgIF07IHJrW2ogICAgXSA9IHRlbXA7CisJCXRlbXAgPSBya1tpICsgMV07IHJrW2kgKyAxXSA9IHJrW2ogKyAxXTsgcmtbaiArIDFdID0gdGVtcDsKKwkJdGVtcCA9IHJrW2kgKyAyXTsgcmtbaSArIDJdID0gcmtbaiArIDJdOyBya1tqICsgMl0gPSB0ZW1wOworCQl0ZW1wID0gcmtbaSArIDNdOyBya1tpICsgM10gPSBya1tqICsgM107IHJrW2ogKyAzXSA9IHRlbXA7CisJfQorCS8qIGFwcGx5IHRoZSBpbnZlcnNlIE1peENvbHVtbiB0cmFuc2Zvcm0gdG8gYWxsIHJvdW5kIGtleXMgYnV0IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3Q6ICovCisJZm9yIChpID0gMTsgaSA8IChrZXktPnJvdW5kcyk7IGkrKykgeworCQlyayArPSA0OworI2lmIDEKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJdTMyIHRwMSwgdHAyLCB0cDQsIHRwOCwgdHA5LCB0cGIsIHRwZCwgdHBlLCBtOworCisJCQl0cDEgPSBya1tqXTsKKwkJCW0gPSB0cDEgJiAweDgwODA4MDgwOworCQkJdHAyID0gKCh0cDEgJiAweDdmN2Y3ZjdmKSA8PCAxKSBeCisJCQkJKChtIC0gKG0gPj4gNykpICYgMHgxYjFiMWIxYik7CisJCQltID0gdHAyICYgMHg4MDgwODA4MDsKKwkJCXRwNCA9ICgodHAyICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXgorCQkJCSgobSAtIChtID4+IDcpKSAmIDB4MWIxYjFiMWIpOworCQkJbSA9IHRwNCAmIDB4ODA4MDgwODA7CisJCQl0cDggPSAoKHRwNCAmIDB4N2Y3ZjdmN2YpIDw8IDEpIF4KKwkJCQkoKG0gLSAobSA+PiA3KSkgJiAweDFiMWIxYjFiKTsKKwkJCXRwOSA9IHRwOCBeIHRwMTsKKwkJCXRwYiA9IHRwOSBeIHRwMjsKKwkJCXRwZCA9IHRwOSBeIHRwNDsKKwkJCXRwZSA9IHRwOCBeIHRwNCBeIHRwMjsKKyNpZiBkZWZpbmVkKFJPVEFURSkKKwkJCXJrW2pdID0gdHBlIF4gUk9UQVRFKHRwZCwxNikgXgorCQkJCVJPVEFURSh0cDksOCkgXiBST1RBVEUodHBiLDI0KTsKKyNlbHNlCisJCQlya1tqXSA9IHRwZSBeICh0cGQgPj4gMTYpIF4gKHRwZCA8PCAxNikgXiAKKwkJCQkodHA5ID4+IDI0KSBeICh0cDkgPDwgOCkgXgorCQkJCSh0cGIgPj4gOCkgXiAodHBiIDw8IDI0KTsKKyNlbmRpZgorCQl9CisjZWxzZQorCQlya1swXSA9CisJCQlUZDBbVGUyWyhya1swXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdIF4KKwkJCVRkMVtUZTJbKHJrWzBdID4+ICA4KSAmIDB4ZmZdICYgMHhmZl0gXgorCQkJVGQyW1RlMlsocmtbMF0gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDNbVGUyWyhya1swXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdOworCQlya1sxXSA9CisJCQlUZDBbVGUyWyhya1sxXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdIF4KKwkJCVRkMVtUZTJbKHJrWzFdID4+ICA4KSAmIDB4ZmZdICYgMHhmZl0gXgorCQkJVGQyW1RlMlsocmtbMV0gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDNbVGUyWyhya1sxXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdOworCQlya1syXSA9CisJCQlUZDBbVGUyWyhya1syXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdIF4KKwkJCVRkMVtUZTJbKHJrWzJdID4+ICA4KSAmIDB4ZmZdICYgMHhmZl0gXgorCQkJVGQyW1RlMlsocmtbMl0gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDNbVGUyWyhya1syXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdOworCQlya1szXSA9CisJCQlUZDBbVGUyWyhya1szXSAgICAgICkgJiAweGZmXSAmIDB4ZmZdIF4KKwkJCVRkMVtUZTJbKHJrWzNdID4+ICA4KSAmIDB4ZmZdICYgMHhmZl0gXgorCQkJVGQyW1RlMlsocmtbM10gPj4gMTYpICYgMHhmZl0gJiAweGZmXSBeCisJCQlUZDNbVGUyWyhya1szXSA+PiAyNCkgICAgICAgXSAmIDB4ZmZdOworI2VuZGlmCisJfQorCXJldHVybiAwOworfQorCisvKgorICogRW5jcnlwdCBhIHNpbmdsZSBibG9jaworICogaW4gYW5kIG91dCBjYW4gb3ZlcmxhcAorICovCit2b2lkIEFFU19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSBjb25zdCBBRVNfS0VZICprZXkpIHsKKworCWNvbnN0IHUzMiAqcms7CisJdTMyIHMwLCBzMSwgczIsIHMzLCB0WzRdOworCWludCByOworCisJYXNzZXJ0KGluICYmIG91dCAmJiBrZXkpOworCXJrID0ga2V5LT5yZF9rZXk7CisKKwkvKgorCSAqIG1hcCBieXRlIGFycmF5IGJsb2NrIHRvIGNpcGhlciBzdGF0ZQorCSAqIGFuZCBhZGQgaW5pdGlhbCByb3VuZCBrZXk6CisJICovCisJczAgPSBHRVRVMzIoaW4gICAgICkgXiBya1swXTsKKwlzMSA9IEdFVFUzMihpbiArICA0KSBeIHJrWzFdOworCXMyID0gR0VUVTMyKGluICsgIDgpIF4gcmtbMl07CisJczMgPSBHRVRVMzIoaW4gKyAxMikgXiBya1szXTsKKworI2lmIGRlZmluZWQoQUVTX0NPTVBBQ1RfSU5fT1VURVJfUk9VTkRTKQorCXByZWZldGNoMjU2KFRlNCk7CisKKwl0WzBdID0JVGU0WyhzMCAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRlNFsoczEgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZTRbKHMyID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGU0WyhzMyA+PiAyNCkgICAgICAgXSA8PCAyNDsKKwl0WzFdID0JVGU0WyhzMSAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRlNFsoczIgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZTRbKHMzID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGU0WyhzMCA+PiAyNCkgICAgICAgXSA8PCAyNDsKKwl0WzJdID0JVGU0WyhzMiAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRlNFsoczMgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZTRbKHMwID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGU0WyhzMSA+PiAyNCkgICAgICAgXSA8PCAyNDsKKwl0WzNdID0JVGU0WyhzMyAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRlNFsoczAgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZTRbKHMxID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGU0WyhzMiA+PiAyNCkgICAgICAgXSA8PCAyNDsKKworCS8qIG5vdyBkbyB0aGUgbGluZWFyIHRyYW5zZm9ybSB1c2luZyB3b3JkcyAqLworCXsJaW50IGk7CisJCXUzMiByMCwgcjEsIHIyOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXIwID0gdFtpXTsKKwkJCXIxID0gcjAgJiAweDgwODA4MDgwOworCQkJcjIgPSAoKHIwICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXgorCQkJCSgocjEgLSAocjEgPj4gNykpICYgMHgxYjFiMWIxYik7CisjaWYgZGVmaW5lZChST1RBVEUpCisJCQl0W2ldID0gcjIgXiBST1RBVEUocjIsMjQpIF4gUk9UQVRFKHIwLDI0KSBeCisJCQkJUk9UQVRFKHIwLDE2KSBeIFJPVEFURShyMCw4KTsKKyNlbHNlCisJCQl0W2ldID0gcjIgXiAoKHIyIF4gcjApIDw8IDI0KSBeICgocjIgXiByMCkgPj4gOCkgXgorCQkJCShyMCA8PCAxNikgXiAocjAgPj4gMTYpIF4KKwkJCQkocjAgPDwgOCkgXiAocjAgPj4gMjQpOworI2VuZGlmCisJCQl0W2ldIF49IHJrWzQraV07CisJCX0KKwl9CisjZWxzZQorCXRbMF0gPQlUZTBbKHMwICAgICAgKSAmIDB4ZmZdIF4KKwkJVGUxWyhzMSA+PiAgOCkgJiAweGZmXSBeCisJCVRlMlsoczIgPj4gMTYpICYgMHhmZl0gXgorCQlUZTNbKHMzID4+IDI0KSAgICAgICBdIF4KKwkJcmtbNF07CisJdFsxXSA9CVRlMFsoczEgICAgICApICYgMHhmZl0gXgorCQlUZTFbKHMyID4+ICA4KSAmIDB4ZmZdIF4KKwkJVGUyWyhzMyA+PiAxNikgJiAweGZmXSBeCisJCVRlM1soczAgPj4gMjQpICAgICAgIF0gXgorCQlya1s1XTsKKwl0WzJdID0JVGUwWyhzMiAgICAgICkgJiAweGZmXSBeCisJCVRlMVsoczMgPj4gIDgpICYgMHhmZl0gXgorCQlUZTJbKHMwID4+IDE2KSAmIDB4ZmZdIF4KKwkJVGUzWyhzMSA+PiAyNCkgICAgICAgXSBeCisJCXJrWzZdOworCXRbM10gPQlUZTBbKHMzICAgICAgKSAmIDB4ZmZdIF4KKwkJVGUxWyhzMCA+PiAgOCkgJiAweGZmXSBeCisJCVRlMlsoczEgPj4gMTYpICYgMHhmZl0gXgorCQlUZTNbKHMyID4+IDI0KSAgICAgICBdIF4KKwkJcmtbN107CisjZW5kaWYKKwlzMCA9IHRbMF07IHMxID0gdFsxXTsgczIgPSB0WzJdOyBzMyA9IHRbM107CisKKyAgICAvKgorICAgICAqIE5yIC0gMiBmdWxsIHJvdW5kczoKKyAgICAgKi8KKyAgICBmb3IgKHJrKz04LHI9a2V5LT5yb3VuZHMtMjsgcj4wOyByays9NCxyLS0pIHsKKyNpZiBkZWZpbmVkKEFFU19DT01QQUNUX0lOX0lOTkVSX1JPVU5EUykKKwl0WzBdID0JVGU0WyhzMCAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRlNFsoczEgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZTRbKHMyID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGU0WyhzMyA+PiAyNCkgICAgICAgXSA8PCAyNDsKKwl0WzFdID0JVGU0WyhzMSAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRlNFsoczIgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZTRbKHMzID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGU0WyhzMCA+PiAyNCkgICAgICAgXSA8PCAyNDsKKwl0WzJdID0JVGU0WyhzMiAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRlNFsoczMgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZTRbKHMwID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGU0WyhzMSA+PiAyNCkgICAgICAgXSA8PCAyNDsKKwl0WzNdID0JVGU0WyhzMyAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRlNFsoczAgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZTRbKHMxID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGU0WyhzMiA+PiAyNCkgICAgICAgXSA8PCAyNDsKKworCS8qIG5vdyBkbyB0aGUgbGluZWFyIHRyYW5zZm9ybSB1c2luZyB3b3JkcyAqLworCXsJaW50IGk7CisJCXUzMiByMCwgcjEsIHIyOworCisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCXIwID0gdFtpXTsKKwkJCXIxID0gcjAgJiAweDgwODA4MDgwOworCQkJcjIgPSAoKHIwICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXgorCQkJCSgocjEgLSAocjEgPj4gNykpICYgMHgxYjFiMWIxYik7CisjaWYgZGVmaW5lZChST1RBVEUpCisJCQl0W2ldID0gcjIgXiBST1RBVEUocjIsMjQpIF4gUk9UQVRFKHIwLDI0KSBeCisJCQkJUk9UQVRFKHIwLDE2KSBeIFJPVEFURShyMCw4KTsKKyNlbHNlCisJCQl0W2ldID0gcjIgXiAoKHIyIF4gcjApIDw8IDI0KSBeICgocjIgXiByMCkgPj4gOCkgXgorCQkJCShyMCA8PCAxNikgXiAocjAgPj4gMTYpIF4KKwkJCQkocjAgPDwgOCkgXiAocjAgPj4gMjQpOworI2VuZGlmCisJCQl0W2ldIF49IHJrW2ldOworCQl9CisJfQorI2Vsc2UKKwl0WzBdID0JVGUwWyhzMCAgICAgICkgJiAweGZmXSBeCisJCVRlMVsoczEgPj4gIDgpICYgMHhmZl0gXgorCQlUZTJbKHMyID4+IDE2KSAmIDB4ZmZdIF4KKwkJVGUzWyhzMyA+PiAyNCkgICAgICAgXSBeCisJCXJrWzBdOworCXRbMV0gPQlUZTBbKHMxICAgICAgKSAmIDB4ZmZdIF4KKwkJVGUxWyhzMiA+PiAgOCkgJiAweGZmXSBeCisJCVRlMlsoczMgPj4gMTYpICYgMHhmZl0gXgorCQlUZTNbKHMwID4+IDI0KSAgICAgICBdIF4KKwkJcmtbMV07CisJdFsyXSA9CVRlMFsoczIgICAgICApICYgMHhmZl0gXgorCQlUZTFbKHMzID4+ICA4KSAmIDB4ZmZdIF4KKwkJVGUyWyhzMCA+PiAxNikgJiAweGZmXSBeCisJCVRlM1soczEgPj4gMjQpICAgICAgIF0gXgorCQlya1syXTsKKwl0WzNdID0JVGUwWyhzMyAgICAgICkgJiAweGZmXSBeCisJCVRlMVsoczAgPj4gIDgpICYgMHhmZl0gXgorCQlUZTJbKHMxID4+IDE2KSAmIDB4ZmZdIF4KKwkJVGUzWyhzMiA+PiAyNCkgICAgICAgXSBeCisJCXJrWzNdOworI2VuZGlmCisJczAgPSB0WzBdOyBzMSA9IHRbMV07IHMyID0gdFsyXTsgczMgPSB0WzNdOworICAgIH0KKyAgICAvKgorCSAqIGFwcGx5IGxhc3Qgcm91bmQgYW5kCisJICogbWFwIGNpcGhlciBzdGF0ZSB0byBieXRlIGFycmF5IGJsb2NrOgorCSAqLworI2lmIGRlZmluZWQoQUVTX0NPTVBBQ1RfSU5fT1VURVJfUk9VTkRTKQorCXByZWZldGNoMjU2KFRlNCk7CisKKwkqKHUzMiopKG91dCswKSA9CisJCVRlNFsoczAgICAgICApICYgMHhmZl0gICAgICAgXgorCQlUZTRbKHMxID4+ICA4KSAmIDB4ZmZdIDw8ICA4IF4KKwkJVGU0WyhzMiA+PiAxNikgJiAweGZmXSA8PCAxNiBeCisJCVRlNFsoczMgPj4gMjQpICAgICAgIF0gPDwgMjQgXgorCQlya1swXTsKKwkqKHUzMiopKG91dCs0KSA9CisJCVRlNFsoczEgICAgICApICYgMHhmZl0gICAgICAgXgorCQlUZTRbKHMyID4+ICA4KSAmIDB4ZmZdIDw8ICA4IF4KKwkJVGU0WyhzMyA+PiAxNikgJiAweGZmXSA8PCAxNiBeCisJCVRlNFsoczAgPj4gMjQpICAgICAgIF0gPDwgMjQgXgorCQlya1sxXTsKKwkqKHUzMiopKG91dCs4KSA9CisJCVRlNFsoczIgICAgICApICYgMHhmZl0gICAgICAgXgorCQlUZTRbKHMzID4+ICA4KSAmIDB4ZmZdIDw8ICA4IF4KKwkJVGU0WyhzMCA+PiAxNikgJiAweGZmXSA8PCAxNiBeCisJCVRlNFsoczEgPj4gMjQpICAgICAgIF0gPDwgMjQgXgorCQlya1syXTsKKwkqKHUzMiopKG91dCsxMikgPQorCQlUZTRbKHMzICAgICAgKSAmIDB4ZmZdICAgICAgIF4KKwkJVGU0WyhzMCA+PiAgOCkgJiAweGZmXSA8PCAgOCBeCisJCVRlNFsoczEgPj4gMTYpICYgMHhmZl0gPDwgMTYgXgorCQlUZTRbKHMyID4+IDI0KSAgICAgICBdIDw8IDI0IF4KKwkJcmtbM107CisjZWxzZQorCSoodTMyKikob3V0KzApID0KKwkJKFRlMlsoczAgICAgICApICYgMHhmZl0gJiAweDAwMDAwMGZmVSkgXgorCQkoVGUzWyhzMSA+PiAgOCkgJiAweGZmXSAmIDB4MDAwMGZmMDBVKSBeCisJCShUZTBbKHMyID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMFUpIF4KKwkJKFRlMVsoczMgPj4gMjQpICAgICAgIF0gJiAweGZmMDAwMDAwVSkgXgorCQlya1swXTsKKwkqKHUzMiopKG91dCs0KSA9CisJCShUZTJbKHMxICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZlUpIF4KKwkJKFRlM1soczIgPj4gIDgpICYgMHhmZl0gJiAweDAwMDBmZjAwVSkgXgorCQkoVGUwWyhzMyA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDBVKSBeCisJCShUZTFbKHMwID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMFUpIF4KKwkJcmtbMV07CisJKih1MzIqKShvdXQrOCkgPQorCQkoVGUyWyhzMiAgICAgICkgJiAweGZmXSAmIDB4MDAwMDAwZmZVKSBeCisJCShUZTNbKHMzID4+ICA4KSAmIDB4ZmZdICYgMHgwMDAwZmYwMFUpIF4KKwkJKFRlMFsoczAgPj4gMTYpICYgMHhmZl0gJiAweDAwZmYwMDAwVSkgXgorCQkoVGUxWyhzMSA+PiAyNCkgICAgICAgXSAmIDB4ZmYwMDAwMDBVKSBeCisJCXJrWzJdOworCSoodTMyKikob3V0KzEyKSA9CisJCShUZTJbKHMzICAgICAgKSAmIDB4ZmZdICYgMHgwMDAwMDBmZlUpIF4KKwkJKFRlM1soczAgPj4gIDgpICYgMHhmZl0gJiAweDAwMDBmZjAwVSkgXgorCQkoVGUwWyhzMSA+PiAxNikgJiAweGZmXSAmIDB4MDBmZjAwMDBVKSBeCisJCShUZTFbKHMyID4+IDI0KSAgICAgICBdICYgMHhmZjAwMDAwMFUpIF4KKwkJcmtbM107CisjZW5kaWYKK30KKworLyoKKyAqIERlY3J5cHQgYSBzaW5nbGUgYmxvY2sKKyAqIGluIGFuZCBvdXQgY2FuIG92ZXJsYXAKKyAqLwordm9pZCBBRVNfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisKKwljb25zdCB1MzIgKnJrOworCXUzMiBzMCwgczEsIHMyLCBzMywgdFs0XTsKKwlpbnQgcjsKKworCWFzc2VydChpbiAmJiBvdXQgJiYga2V5KTsKKwlyayA9IGtleS0+cmRfa2V5OworCisJLyoKKwkgKiBtYXAgYnl0ZSBhcnJheSBibG9jayB0byBjaXBoZXIgc3RhdGUKKwkgKiBhbmQgYWRkIGluaXRpYWwgcm91bmQga2V5OgorCSAqLworCXMwID0gR0VUVTMyKGluICAgICApIF4gcmtbMF07CisJczEgPSBHRVRVMzIoaW4gKyAgNCkgXiBya1sxXTsKKwlzMiA9IEdFVFUzMihpbiArICA4KSBeIHJrWzJdOworCXMzID0gR0VUVTMyKGluICsgMTIpIF4gcmtbM107CisKKyNpZiBkZWZpbmVkKEFFU19DT01QQUNUX0lOX09VVEVSX1JPVU5EUykKKwlwcmVmZXRjaDI1NihUZDQpOworCisgICAgICAgIHRbMF0gPQlUZDRbKHMwICAgICAgKSAmIDB4ZmZdICAgICAgIF4KKwkJVGQ0WyhzMyA+PiAgOCkgJiAweGZmXSA8PCAgOCBeCisJCVRkNFsoczIgPj4gMTYpICYgMHhmZl0gPDwgMTYgXgorCQlUZDRbKHMxID4+IDI0KSAgICAgICBdIDw8IDI0OworICAgICAgICB0WzFdID0JVGQ0WyhzMSAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRkNFsoczAgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZDRbKHMzID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGQ0WyhzMiA+PiAyNCkgICAgICAgXSA8PCAyNDsKKyAgICAgICAgdFsyXSA9CVRkNFsoczIgICAgICApICYgMHhmZl0gICAgICAgXgorCQlUZDRbKHMxID4+ICA4KSAmIDB4ZmZdIDw8ICA4IF4KKwkJVGQ0WyhzMCA+PiAxNikgJiAweGZmXSA8PCAxNiBeCisJCVRkNFsoczMgPj4gMjQpICAgICAgIF0gPDwgMjQ7CisgICAgICAgIHRbM10gPQlUZDRbKHMzICAgICAgKSAmIDB4ZmZdICAgICAgIF4KKwkJVGQ0WyhzMiA+PiAgOCkgJiAweGZmXSA8PCAgOCBeCisJCVRkNFsoczEgPj4gMTYpICYgMHhmZl0gPDwgMTYgXgorCQlUZDRbKHMwID4+IDI0KSAgICAgICBdIDw8IDI0OworCisJLyogbm93IGRvIHRoZSBsaW5lYXIgdHJhbnNmb3JtIHVzaW5nIHdvcmRzICovIAorCXsJaW50IGk7CisJCXUzMiB0cDEsIHRwMiwgdHA0LCB0cDgsIHRwOSwgdHBiLCB0cGQsIHRwZSwgbTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQl0cDEgPSB0W2ldOworCQkJbSA9IHRwMSAmIDB4ODA4MDgwODA7CisJCQl0cDIgPSAoKHRwMSAmIDB4N2Y3ZjdmN2YpIDw8IDEpIF4KKwkJCQkoKG0gLSAobSA+PiA3KSkgJiAweDFiMWIxYjFiKTsKKwkJCW0gPSB0cDIgJiAweDgwODA4MDgwOworCQkJdHA0ID0gKCh0cDIgJiAweDdmN2Y3ZjdmKSA8PCAxKSBeCisJCQkJKChtIC0gKG0gPj4gNykpICYgMHgxYjFiMWIxYik7CisJCQltID0gdHA0ICYgMHg4MDgwODA4MDsKKwkJCXRwOCA9ICgodHA0ICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXgorCQkJCSgobSAtIChtID4+IDcpKSAmIDB4MWIxYjFiMWIpOworCQkJdHA5ID0gdHA4IF4gdHAxOworCQkJdHBiID0gdHA5IF4gdHAyOworCQkJdHBkID0gdHA5IF4gdHA0OworCQkJdHBlID0gdHA4IF4gdHA0IF4gdHAyOworI2lmIGRlZmluZWQoUk9UQVRFKQorCQkJdFtpXSA9IHRwZSBeIFJPVEFURSh0cGQsMTYpIF4KKwkJCQlST1RBVEUodHA5LDgpIF4gUk9UQVRFKHRwYiwyNCk7CisjZWxzZQorCQkJdFtpXSA9IHRwZSBeICh0cGQgPj4gMTYpIF4gKHRwZCA8PCAxNikgXiAKKwkJCQkodHA5ID4+IDI0KSBeICh0cDkgPDwgOCkgXgorCQkJCSh0cGIgPj4gOCkgXiAodHBiIDw8IDI0KTsKKyNlbmRpZgorCQkJdFtpXSBePSBya1s0K2ldOworCQl9CisJfQorI2Vsc2UKKwl0WzBdID0JVGQwWyhzMCAgICAgICkgJiAweGZmXSBeCisJCVRkMVsoczMgPj4gIDgpICYgMHhmZl0gXgorCQlUZDJbKHMyID4+IDE2KSAmIDB4ZmZdIF4KKwkJVGQzWyhzMSA+PiAyNCkgICAgICAgXSBeCisJCXJrWzRdOworCXRbMV0gPQlUZDBbKHMxICAgICAgKSAmIDB4ZmZdIF4KKwkJVGQxWyhzMCA+PiAgOCkgJiAweGZmXSBeCisJCVRkMlsoczMgPj4gMTYpICYgMHhmZl0gXgorCQlUZDNbKHMyID4+IDI0KSAgICAgICBdIF4KKwkJcmtbNV07CisJdFsyXSA9CVRkMFsoczIgICAgICApICYgMHhmZl0gXgorCQlUZDFbKHMxID4+ICA4KSAmIDB4ZmZdIF4KKwkJVGQyWyhzMCA+PiAxNikgJiAweGZmXSBeCisJCVRkM1soczMgPj4gMjQpICAgICAgIF0gXgorCQlya1s2XTsKKwl0WzNdID0JVGQwWyhzMyAgICAgICkgJiAweGZmXSBeCisJCVRkMVsoczIgPj4gIDgpICYgMHhmZl0gXgorCQlUZDJbKHMxID4+IDE2KSAmIDB4ZmZdIF4KKwkJVGQzWyhzMCA+PiAyNCkgICAgICAgXSBeCisJCXJrWzddOworI2VuZGlmCisJczAgPSB0WzBdOyBzMSA9IHRbMV07IHMyID0gdFsyXTsgczMgPSB0WzNdOworCisgICAgLyoKKyAgICAgKiBOciAtIDIgZnVsbCByb3VuZHM6CisgICAgICovCisgICAgZm9yIChyays9OCxyPWtleS0+cm91bmRzLTI7IHI+MDsgcmsrPTQsci0tKSB7CisjaWYgZGVmaW5lZChBRVNfQ09NUEFDVF9JTl9JTk5FUl9ST1VORFMpCisgICAgICAgIHRbMF0gPQlUZDRbKHMwICAgICAgKSAmIDB4ZmZdICAgICAgIF4KKwkJVGQ0WyhzMyA+PiAgOCkgJiAweGZmXSA8PCAgOCBeCisJCVRkNFsoczIgPj4gMTYpICYgMHhmZl0gPDwgMTYgXgorCQlUZDRbKHMxID4+IDI0KSAgICAgICBdIDw8IDI0OworICAgICAgICB0WzFdID0JVGQ0WyhzMSAgICAgICkgJiAweGZmXSAgICAgICBeCisJCVRkNFsoczAgPj4gIDgpICYgMHhmZl0gPDwgIDggXgorCQlUZDRbKHMzID4+IDE2KSAmIDB4ZmZdIDw8IDE2IF4KKwkJVGQ0WyhzMiA+PiAyNCkgICAgICAgXSA8PCAyNDsKKyAgICAgICAgdFsyXSA9CVRkNFsoczIgICAgICApICYgMHhmZl0gICAgICAgXgorCQlUZDRbKHMxID4+ICA4KSAmIDB4ZmZdIDw8ICA4IF4KKwkJVGQ0WyhzMCA+PiAxNikgJiAweGZmXSA8PCAxNiBeCisJCVRkNFsoczMgPj4gMjQpICAgICAgIF0gPDwgMjQ7CisgICAgICAgIHRbM10gPQlUZDRbKHMzICAgICAgKSAmIDB4ZmZdICAgICAgIF4KKwkJVGQ0WyhzMiA+PiAgOCkgJiAweGZmXSA8PCAgOCBeCisJCVRkNFsoczEgPj4gMTYpICYgMHhmZl0gPDwgMTYgXgorCQlUZDRbKHMwID4+IDI0KSAgICAgICBdIDw8IDI0OworCisJLyogbm93IGRvIHRoZSBsaW5lYXIgdHJhbnNmb3JtIHVzaW5nIHdvcmRzICovIAorCXsJaW50IGk7CisJCXUzMiB0cDEsIHRwMiwgdHA0LCB0cDgsIHRwOSwgdHBiLCB0cGQsIHRwZSwgbTsKKworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQl0cDEgPSB0W2ldOworCQkJbSA9IHRwMSAmIDB4ODA4MDgwODA7CisJCQl0cDIgPSAoKHRwMSAmIDB4N2Y3ZjdmN2YpIDw8IDEpIF4KKwkJCQkoKG0gLSAobSA+PiA3KSkgJiAweDFiMWIxYjFiKTsKKwkJCW0gPSB0cDIgJiAweDgwODA4MDgwOworCQkJdHA0ID0gKCh0cDIgJiAweDdmN2Y3ZjdmKSA8PCAxKSBeCisJCQkJKChtIC0gKG0gPj4gNykpICYgMHgxYjFiMWIxYik7CisJCQltID0gdHA0ICYgMHg4MDgwODA4MDsKKwkJCXRwOCA9ICgodHA0ICYgMHg3ZjdmN2Y3ZikgPDwgMSkgXgorCQkJCSgobSAtIChtID4+IDcpKSAmIDB4MWIxYjFiMWIpOworCQkJdHA5ID0gdHA4IF4gdHAxOworCQkJdHBiID0gdHA5IF4gdHAyOworCQkJdHBkID0gdHA5IF4gdHA0OworCQkJdHBlID0gdHA4IF4gdHA0IF4gdHAyOworI2lmIGRlZmluZWQoUk9UQVRFKQorCQkJdFtpXSA9IHRwZSBeIFJPVEFURSh0cGQsMTYpIF4KKwkJCQlST1RBVEUodHA5LDgpIF4gUk9UQVRFKHRwYiwyNCk7CisjZWxzZQorCQkJdFtpXSA9IHRwZSBeICh0cGQgPj4gMTYpIF4gKHRwZCA8PCAxNikgXiAKKwkJCQkodHA5ID4+IDI0KSBeICh0cDkgPDwgOCkgXgorCQkJCSh0cGIgPj4gOCkgXiAodHBiIDw8IDI0KTsKKyNlbmRpZgorCQkJdFtpXSBePSBya1tpXTsKKwkJfQorCX0KKyNlbHNlCisJdFswXSA9CVRkMFsoczAgICAgICApICYgMHhmZl0gXgorCQlUZDFbKHMzID4+ICA4KSAmIDB4ZmZdIF4KKwkJVGQyWyhzMiA+PiAxNikgJiAweGZmXSBeCisJCVRkM1soczEgPj4gMjQpICAgICAgIF0gXgorCQlya1swXTsKKwl0WzFdID0JVGQwWyhzMSAgICAgICkgJiAweGZmXSBeCisJCVRkMVsoczAgPj4gIDgpICYgMHhmZl0gXgorCQlUZDJbKHMzID4+IDE2KSAmIDB4ZmZdIF4KKwkJVGQzWyhzMiA+PiAyNCkgICAgICAgXSBeCisJCXJrWzFdOworCXRbMl0gPQlUZDBbKHMyICAgICAgKSAmIDB4ZmZdIF4KKwkJVGQxWyhzMSA+PiAgOCkgJiAweGZmXSBeCisJCVRkMlsoczAgPj4gMTYpICYgMHhmZl0gXgorCQlUZDNbKHMzID4+IDI0KSAgICAgICBdIF4KKwkJcmtbMl07CisJdFszXSA9CVRkMFsoczMgICAgICApICYgMHhmZl0gXgorCQlUZDFbKHMyID4+ICA4KSAmIDB4ZmZdIF4KKwkJVGQyWyhzMSA+PiAxNikgJiAweGZmXSBeCisJCVRkM1soczAgPj4gMjQpICAgICAgIF0gXgorCQlya1szXTsKKyNlbmRpZgorCXMwID0gdFswXTsgczEgPSB0WzFdOyBzMiA9IHRbMl07IHMzID0gdFszXTsKKyAgICB9CisgICAgLyoKKwkgKiBhcHBseSBsYXN0IHJvdW5kIGFuZAorCSAqIG1hcCBjaXBoZXIgc3RhdGUgdG8gYnl0ZSBhcnJheSBibG9jazoKKwkgKi8KKwlwcmVmZXRjaDI1NihUZDQpOworCisJKih1MzIqKShvdXQrMCkgPQorCQkoVGQ0WyhzMCAgICAgICkgJiAweGZmXSkJXgorCQkoVGQ0WyhzMyA+PiAgOCkgJiAweGZmXSA8PCAgOCkgXgorCQkoVGQ0WyhzMiA+PiAxNikgJiAweGZmXSA8PCAxNikgXgorCQkoVGQ0WyhzMSA+PiAyNCkgICAgICAgXSA8PCAyNCkgXgorCQlya1swXTsKKwkqKHUzMiopKG91dCs0KSA9CisJCShUZDRbKHMxICAgICAgKSAmIDB4ZmZdKQkgXgorCQkoVGQ0WyhzMCA+PiAgOCkgJiAweGZmXSA8PCAgOCkgXgorCQkoVGQ0WyhzMyA+PiAxNikgJiAweGZmXSA8PCAxNikgXgorCQkoVGQ0WyhzMiA+PiAyNCkgICAgICAgXSA8PCAyNCkgXgorCQlya1sxXTsKKwkqKHUzMiopKG91dCs4KSA9CisJCShUZDRbKHMyICAgICAgKSAmIDB4ZmZdKQkgXgorCQkoVGQ0WyhzMSA+PiAgOCkgJiAweGZmXSA8PCAgOCkgXgorCQkoVGQ0WyhzMCA+PiAxNikgJiAweGZmXSA8PCAxNikgXgorCQkoVGQ0WyhzMyA+PiAyNCkgICAgICAgXSA8PCAyNCkgXgorCQlya1syXTsKKwkqKHUzMiopKG91dCsxMikgPQorCQkoVGQ0WyhzMyAgICAgICkgJiAweGZmXSkJIF4KKwkJKFRkNFsoczIgPj4gIDgpICYgMHhmZl0gPDwgIDgpIF4KKwkJKFRkNFsoczEgPj4gMTYpICYgMHhmZl0gPDwgMTYpIF4KKwkJKFRkNFsoczAgPj4gMjQpICAgICAgIF0gPDwgMjQpIF4KKwkJcmtbM107Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMtNTg2LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWI0MGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLTU4Ni5wbApAQCAtMCwwICsxLDI5ODAgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFZlcnNpb24gNC4zLgorIworIyBZb3UgbWlnaHQgZmFpbCB0byBhcHByZWNpYXRlIHRoaXMgbW9kdWxlIHBlcmZvcm1hbmNlIGZyb20gdGhlIGZpcnN0CisjIHRyeS4gSWYgY29tcGFyZWQgdG8gInZhbmlsbGEiIGxpbnV4LWlhMzItaWNjIHRhcmdldCwgaS5lLiBjb25zaWRlcmVkCisjIHRvIGJlICp0aGUqIGJlc3QgSW50ZWwgQyBjb21waWxlciB3aXRob3V0IC1LUElDLCBwZXJmb3JtYW5jZSBhcHBlYXJzCisjIHRvIGJlIHZpcnR1YWxseSBpZGVudGljYWwuLi4gQnV0IHRyeSB0byByZS1jb25maWd1cmUgd2l0aCBzaGFyZWQKKyMgbGlicmFyeSBzdXBwb3J0Li4uIEFoYSEgSW50ZWwgY29tcGlsZXIgInN1ZGRlbmx5IiBsYWdzIGJlaGluZCBieSAzMCUKKyMgW29uIFA0LCBtb3JlIG9uIG90aGVyc106LSkgQW5kIGlmIGNvbXBhcmVkIHRvIHBvc2l0aW9uLWluZGVwZW5kZW50CisjIGNvZGUgZ2VuZXJhdGVkIGJ5IEdOVSBDLCB0aGlzIGNvZGUgcGVyZm9ybXMgKm1vcmUqIHRoYW4gKnR3aWNlKiBhcworIyBmYXN0ISBZZXMsIGFsbCB0aGlzIGJ1enogYWJvdXQgUElDIG1lYW5zIHRoYXQgdW5saWtlIG90aGVyIGhhbmQtCisjIGNvZGVkIGltcGxlbWVudGF0aW9ucywgdGhpcyBvbmUgd2FzIGV4cGxpY2l0bHkgZGVzaWduZWQgdG8gYmUgc2FmZQorIyB0byB1c2UgZXZlbiBpbiBzaGFyZWQgbGlicmFyeSBjb250ZXh0Li4uIFRoaXMgYWxzbyBtZWFucyB0aGF0IHRoaXMKKyMgY29kZSBpc24ndCBuZWNlc3NhcmlseSBhYnNvbHV0ZWx5IGZhc3Rlc3QgImV2ZXIsIiBiZWNhdXNlIGluIG9yZGVyCisjIHRvIGFjaGlldmUgcG9zaXRpb24gaW5kZXBlbmRlbmNlIGFuIGV4dHJhIHJlZ2lzdGVyIGhhcyB0byBiZQorIyBvZmYtbG9hZGVkIHRvIHN0YWNrLCB3aGljaCBhZmZlY3RzIHRoZSBiZW5jaG1hcmsgcmVzdWx0LgorIworIyBTcGVjaWFsIG5vdGUgYWJvdXQgaW5zdHJ1Y3Rpb24gY2hvaWNlLiBEbyB5b3UgcmVjYWxsIFJDNF9JTlQgY29kZQorIyBwZXJmb3JtaW5nIHBvb3JseSBvbiBQND8gSXQgbWlnaHQgYmUgdGhlIHRpbWUgdG8gZmlndXJlIG91dCB3aHkuCisjIFJDNF9JTlQgY29kZSBpbXBsaWVzIGVmZmVjdGl2ZSBhZGRyZXNzIGNhbGN1bGF0aW9ucyBpbiBiYXNlK29mZnNldCo0CisjIGZvcm0uIFRyb3VibGUgaXMgdGhhdCBpdCBzZWVtcyB0aGF0IG9mZnNldCBzY2FsaW5nIHR1cm5lZCB0byBiZQorIyBjcml0aWNhbCBwYXRoLi4uIEF0IGxlYXN0IGVsaW1pbmF0aW5nIHNjYWxpbmcgcmVzdWx0ZWQgaW4gMi44eCBSQzQKKyMgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgW2FzIHlvdSBtaWdodCByZWNhbGxdLiBBcyBBRVMgY29kZSBpcyBodW5ncnkKKyMgZm9yIHNjYWxpbmcgdG9vLCBJIFt0cnkgdG9dIGF2b2lkIHRoZSBsYXR0ZXIgYnkgZmF2b3Jpbmcgb2ZmLWJ5LTIKKyMgc2hpZnRzIGFuZCBtYXNraW5nIHRoZSByZXN1bHQgd2l0aCAweEZGPDwyIGluc3RlYWQgb2YgImJvcmluZyIgMHhGRi4KKyMKKyMgQXMgd2FzIHNob3duIGJ5IERlYW4gR2F1ZGV0IDxkZWFuQGFyY3RpYy5vcmc+LCB0aGUgYWJvdmUgbm90ZSB0dXJuZWQKKyMgdm9pZC4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2l0aCBvZmYtYnktMiBzaGlmdHMgd2FzIG9ic2VydmVkIG9uCisjIGludGVybWVkaWF0ZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2FzIHNwaWxsaW5nIHlldCBhbm90aGVyIHJlZ2lzdGVyCisjIHRvIHN0YWNrLi4uIEZpbmFsIG9mZnNldCo0IGNvZGUgYmVsb3cgcnVucyBqdXN0IGEgdGFkIGZhc3RlciBvbiBQNCwKKyMgYnV0IGV4aGliaXRzIHVwIHRvIDEwJSBpbXByb3ZlbWVudCBvbiBvdGhlciBjb3Jlcy4KKyMKKyMgU2Vjb25kIHZlcnNpb24gaXMgIm1vbm9saXRoaWMiIHJlcGxhY2VtZW50IGZvciBhZXNfY29yZS5jLCB3aGljaCBpbgorIyBhZGRpdGlvbiB0byBBRVNfW2RlfGVuXWNyeXB0IGltcGxlbWVudHMgQUVTX3NldF9bZGV8ZW5dY3J5cHRpb25fa2V5LgorIyBUaGlzIG1hZGUgaXQgcG9zc2libGUgdG8gaW1wbGVtZW50IGxpdHRsZS1lbmRpYW4gdmFyaWFudCBvZiB0aGUKKyMgYWxnb3JpdGhtIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBiYXNlIEMgY29kZS4gTW90aXZhdGluZyBmYWN0b3IgZm9yCisjIHRoZSB1bmRlcnRha2VuIGVmZm9ydCB3YXMgdGhhdCBpdCBhcHBlYXJlZCB0aGF0IGluIHRpZ2h0IElBLTMyCisjIHJlZ2lzdGVyIHdpbmRvdyBsaXR0bGUtZW5kaWFuIGZsYXZvciBjb3VsZCBhY2hpZXZlIHNsaWdodGx5IGhpZ2hlcgorIyBJbnN0cnVjdGlvbiBMZXZlbCBQYXJhbGxlbGlzbSwgYW5kIGl0IGluZGVlZCByZXN1bHRlZCBpbiB1cCB0byAxNSUKKyMgYmV0dGVyIHBlcmZvcm1hbmNlIG9uIG1vc3QgcmVjZW50ILUtYXJjaHMuLi4KKyMKKyMgVGhpcmQgdmVyc2lvbiBhZGRzIEFFU19jYmNfZW5jcnlwdCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggcmVzdWx0ZWQgaW4KKyMgdXAgdG8gNDAlIHBlcmZvcm1hbmNlIGltcm92ZW1lbnQgb2YgQ0JDIGJlbmNobWFyayByZXN1bHRzLiA0MCUgd2FzCisjIG9ic2VydmVkIG9uIFA0IGNvcmUsIHdoZXJlICJvdmVyYWxsIiBpbXJvdmVtZW50IGNvZWZmaWNpZW50LCBpLmUuIGlmCisjIGNvbXBhcmVkIHRvIFBJQyBnZW5lcmF0ZWQgYnkgR0NDIGFuZCBpbiBDQkMgbW9kZSwgd2FzIG9ic2VydmVkIHRvIGJlCisjIGFzIGxhcmdlIGFzIDR4Oi0pIENCQyBwZXJmb3JtYW5jZSBpcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIHRvIEVDQiBub3cKKyMgYW5kIG9uIHNvbWUgcGxhdGZvcm1zIGV2ZW4gYmV0dGVyLCBlLmcuIDE3LjYgInNtYWxsIiBjeWNsZXMvYnl0ZSBvbgorIyBPcHRlcm9uLCBiZWNhdXNlIGNlcnRhaW4gZnVuY3Rpb24gcHJvbG9ndWVzIGFuZCBlcGlsb2d1ZXMgYXJlCisjIGVmZmVjdGl2ZWx5IHRha2VuIG91dCBvZiB0aGUgbG9vcC4uLgorIworIyBWZXJzaW9uIDMuMiBpbXBsZW1lbnRzIGNvbXByZXNzZWQgdGFibGVzIGFuZCBwcmVmZXRjaCBvZiB0aGVzZSB0YWJsZXMKKyMgaW4gQ0JDWyFdIG1vZGUuIEZvcm1lciBtZWFucyB0aGF0IDMvNCBvZiB0YWJsZSByZWZlcmVuY2VzIGFyZSBub3cKKyMgbWlzYWxpZ25lZCwgd2hpY2ggdW5mb3J0dW5hdGVseSBoYXMgbmVnYXRpdmUgaW1wYWN0IG9uIGVsZGVyIElBLTMyCisjIGltcGxlbWVudGF0aW9ucywgUGVudGl1bSBzdWZmZXJlZCAzMCUgcGVuYWx0eSwgUElJSSAtIDEwJS4KKyMKKyMgVmVyc2lvbiAzLjMgYXZvaWRzIEwxIGNhY2hlIGFsaWFzaW5nIGJldHdlZW4gc3RhY2sgZnJhbWUgYW5kCisjIFMtYm94ZXMsIGFuZCAzLjQgLSBMMSBjYWNoZSBhbGlhc2luZyBldmVuIGJldHdlZW4ga2V5IHNjaGVkdWxlLiBUaGUKKyMgbGF0dGVyIGlzIGFjaGlldmVkIGJ5IGNvcHlpbmcgdGhlIGtleSBzY2hlZHVsZSB0byBjb250cm9sbGVkIHBsYWNlIGluCisjIHN0YWNrLiBUaGlzIHVuZm9ydHVuYXRlbHkgaGFzIHJhdGhlciBzdHJvbmcgaW1wYWN0IG9uIHNtYWxsIGJsb2NrIENCQworIyBwZXJmb3JtYW5jZSwgfjJ4IGRldGVyaW9yYXRpb24gb24gMTYtYnl0ZSBibG9jayBpZiBjb21wYXJlZCB0byAzLjMuCisjCisjIFZlcnNpb24gMy41IGNoZWNrcyBpZiB0aGVyZSBpcyBMMSBjYWNoZSBhbGlhc2luZyBiZXR3ZWVuIHVzZXItc3VwcGxpZWQKKyMga2V5IHNjaGVkdWxlIGFuZCBTLWJveGVzIGFuZCBhYnN0YWlucyBmcm9tIGNvcHlpbmcgdGhlIGZvcm1lciBpZgorIyB0aGVyZSBpcyBuby4gVGhpcyBhbGxvd3MgZW5kLXVzZXIgdG8gY29uc2Npb3VzbHkgcmV0YWluIHNtYWxsIGJsb2NrCisjIHBlcmZvcm1hbmNlIGJ5IGFsaWduaW5nIGtleSBzY2hlZHVsZSBpbiBzcGVjaWZpYyBtYW5uZXIuCisjCisjIFZlcnNpb24gMy42IGNvbXByZXNzZXMgVGQ0IHRvIDI1NiBieXRlcyBhbmQgcHJlZmV0Y2hlcyBpdCBpbiBFQ0IuCisjCisjIEN1cnJlbnQgRUNCIHBlcmZvcm1hbmNlIG51bWJlcnMgZm9yIDEyOC1iaXQga2V5IGluIENQVSBjeWNsZXMgcGVyCisjIHByb2Nlc3NlZCBieXRlIFttZWFzdXJlIGNvbW1vbmx5IHVzZWQgYnkgQUVTIGJlbmNobWFya2Vyc10gYXJlOgorIworIwkJc21hbGwgZm9vdHByaW50CQlmdWxseSB1bnJvbGxlZAorIyBQNAkJMjQJCQkyMgorIyBBTUQgSzgJMjAJCQkxOQorIyBQSUlJCQkyNQkJCTIzCisjIFBlbnRpdW0JODEJCQk3OAorIworIyBWZXJzaW9uIDMuNyByZWltcGxlbWVudHMgb3V0ZXIgcm91bmRzIGFzICJjb21wYWN0LiIgTWVhbmluZyB0aGF0CisjIGZpcnN0IGFuZCBsYXN0IHJvdW5kcyByZWZlcmVuY2UgY29tcGFjdCAyNTYgYnl0ZXMgUy1ib3guIFRoaXMgbWVhbnMKKyMgdGhhdCBmaXJzdCByb3VuZCBjb25zdW1lcyBhIGxvdCBtb3JlIENQVSBjeWNsZXMgYW5kIHRoYXQgZW5jcnlwdAorIyBhbmQgZGVjcnlwdCBwZXJmb3JtYW5jZSBiZWNvbWVzIGFzeW1tZXRyaWMuIEVuY3J5cHQgcGVyZm9ybWFuY2UKKyMgZHJvcHMgYnkgMTAtMTIlLCB3aGlsZSBkZWNyeXB0IC0gYnkgMjAtMjUlOi0oIDI1NiBieXRlcyBTLWJveCBpcworIyBhZ2dyZXNzaXZlbHkgcHJlLWZldGNoZWQuCisjCisjIFZlcnNpb24gNC4wIGVmZmVjdGl2ZWx5IHJvbGxzIGJhY2sgdG8gMy42IGFuZCBpbnN0ZWFkIGltcGxlbWVudHMKKyMgYWRkaXRpb25hbCBzZXQgb2YgZnVuY3Rpb25zLCBfW3g4Nnxzc2VdX0FFU19bZW58ZGVdY3J5cHRfY29tcGFjdCwKKyMgd2hpY2ggdXNlIGV4Y2x1c2l2ZWx5IDI1NiBieXRlIFMtYm94LiBUaGVzZSBmdW5jdGlvbnMgYXJlIHRvIGJlCisjIGNhbGxlZCBpbiBtb2RlcyBub3QgY29uY2VhbGluZyBwbGFpbiB0ZXh0LCBzdWNoIGFzIEVDQiwgb3Igd2hlbgorIyB3ZSdyZSBhc2tlZCB0byBwcm9jZXNzIHNtYWxsZXIgYW1vdW50IG9mIGRhdGEgW29yIHVuY29uZGl0aW9uYWxseQorIyBvbiBoeXBlci10aHJlYWRpbmcgQ1BVXS4gQ3VycmVudGx5IGl0J3MgY2FsbGVkIHVuY29uZGl0aW9uYWxseSBmcm9tCisjIEFFU19bZW58ZGVdY3J5cHQsIHdoaWNoIGFmZmVjdHMgYWxsIG1vZGVzLCBidXQgQ0JDLiBDQkMgcm91dGluZQorIyBzdGlsbCBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBzd2l0Y2ggYmV0d2VlbiBzbG93ZXIgYW5kIGZhc3RlcgorIyBtb2RlIHdoZW4gYXBwcm9wcmlhdGUuLi4gQnV0IGluIGVpdGhlciBjYXNlIGJlbmNobWFyayBsYW5kc2NhcGUKKyMgY2hhbmdlcyBkcmFtYXRpY2FsbHkgYW5kIGJlbG93IG51bWJlcnMgYXJlIENQVSBjeWNsZXMgcGVyIHByb2Nlc3NlZAorIyBieXRlIGZvciAxMjgtYml0IGtleS4KKyMKKyMJCUVDQiBlbmNyeXB0CUVDQiBkZWNyeXB0CUNCQyBsYXJnZSBjaHVuaworIyBQNAkJNTZbNjBdCQk4NFsxMDBdCQkyMworIyBBTUQgSzgJNDhbNDRdCQk3MFs3OV0JCTE4CisjIFBJSUkJCTQxWzUwXQkJNjFbOTFdCQkyNAorIyBDb3JlIDIJMzJbMzhdCQk0NVs3MF0JCTE4LjUKKyMgUGVudGl1bQkxMjAJCTE2MAkJNzcKKyMKKyMgVmVyc2lvbiA0LjEgc3dpdGNoZXMgdG8gY29tcGFjdCBTLWJveCBldmVuIGluIGtleSBzY2hlZHVsZSBzZXR1cC4KKyMKKyMgVmVyc2lvbiA0LjIgcHJlZmV0Y2hlcyBjb21wYWN0IFMtYm94IGluIGV2ZXJ5IFNTRSByb3VuZCBvciBpbiBvdGhlcgorIyB3b3JkcyBldmVyeSBjYWNoZS1saW5lIGlzICpndWFyYW50ZWVkKiB0byBiZSBhY2Nlc3NlZCB3aXRoaW4gfjUwCisjIGN5Y2xlcyB3aW5kb3cuIFdoeSBqdXN0IFNTRT8gQmVjYXVzZSBpdCdzIG5lZWRlZCBvbiBoeXBlci10aHJlYWRpbmcKKyMgQ1BVISBXaGljaCBpcyBhbHNvIHdoeSBpdCdzIHByZWZldGNoZWQgd2l0aCA2NCBieXRlIHN0cmlkZS4gQmVzdAorIyBwYXJ0IGlzIHRoYXQgaXQgaGFzIG5vIG5lZ2F0aXZlIGVmZmVjdCBvbiBwZXJmb3JtYW5jZTotKSAgCisjCisjIFZlcnNpb24gNC4zIGltcGxlbWVudHMgc3dpdGNoIGJldHdlZW4gY29tcGFjdCBhbmQgbm9uLWNvbXBhY3QgYmxvY2sKKyMgZnVuY3Rpb25zIGluIEFFU19jYmNfZW5jcnlwdCBkZXBlbmRpbmcgb24gaG93IG11Y2ggZGF0YSB3YXMgYXNrZWQKKyMgdG8gYmUgcHJvY2Vzc2VkIGluIG9uZSBzdHJva2UuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRpbWluZyBhdHRhY2tzIGFyZSBjbGFzc2lmaWVkIGluIHR3byBjbGFzc2VzOiBzeW5jaHJvbm91cyB3aGVuCisjIGF0dGFja2VyIGNvbnNjaW91c2x5IGluaXRpYXRlcyBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbiBhbmQgY29sbGVjdHMKKyMgdGltaW5nIGRhdGEgb2YgdmFyaW91cyBjaGFyYWN0ZXIgYWZ0ZXJ3YXJkcywgYW5kIGFzeW5jaHJvbm91cyB3aGVuCisjIG1hbGljaW91cyBjb2RlIGlzIGV4ZWN1dGVkIG9uIHNhbWUgQ1BVIHNpbXVsdGFuZW91c2x5IHdpdGggQUVTLAorIyBpbnN0cnVtZW50cyBpdHNlbGYgYW5kIHBlcmZvcm1zIHN0YXRpc3RpY2FsIGFuYWx5c2lzIG9mIHRoaXMgZGF0YS4KKyMKKyMgQXMgZmFyIGFzIHN5bmNocm9ub3VzIGF0dGFja3MgZ28gdGhlIHJvb3QgdG8gdGhlIEFFUyB0aW1pbmcKKyMgdnVsbmVyYWJpbGl0eSBpcyB0d29mb2xkLiBGaXJzdGx5LCBvZiAyNTYgUy1ib3ggZWxlbWVudHMgYXQgbW9zdCAxNjAKKyMgYXJlIHJlZmVycmVkIHRvIGluIHNpbmdsZSAxMjgtYml0IGJsb2NrIG9wZXJhdGlvbi4gV2VsbCwgaW4gQworIyBpbXBsZW1lbnRhdGlvbiB3aXRoIDQgZGlzdGluY3QgdGFibGVzIGl0J3MgYWN0dWFsbHkgYXMgbGl0dGxlIGFzIDQwCisjIHJlZmVyZW5jZXMgcGVyIDI1NiBlbGVtZW50cyB0YWJsZSwgYnV0IGFueXdheS4uLiBTZWNvbmRseSwgZXZlbgorIyB0aG91Z2ggUy1ib3ggZWxlbWVudHMgYXJlIGNsdXN0ZXJlZCBpbnRvIHNtYWxsZXIgYW1vdW50IG9mIGNhY2hlLQorIyBsaW5lcywgc21hbGxlciB0aGFuIDE2MCBhbmQgZXZlbiA0MCwgaXQgdHVybmVkIG91dCB0aGF0IGZvciBjZXJ0YWluCisjIHBsYWluLXRleHQgcGF0dGVybltzXSBvciBzaW1wbHkgcHV0IGNob3NlbiBwbGFpbi10ZXh0IGFuZCBnaXZlbiBrZXkKKyMgZmV3IGNhY2hlLWxpbmVzIHJlbWFpbiB1bmFjY2Vzc2VkIGR1cmluZyBibG9jayBvcGVyYXRpb24uIE5vdywgaWYKKyMgYXR0YWNrZXIgY2FuIGZpZ3VyZSBvdXQgdGhpcyBhY2Nlc3MgcGF0dGVybiwgaGUgY2FuIGRlZHVjdCB0aGUga2V5CisjIFtvciBhdCBsZWFzdCBwYXJ0IG9mIGl0XS4gVGhlIG5hdHVyYWwgd2F5IHRvIG1pdGlnYXRlIHRoaXMga2luZCBvZgorIyBhdHRhY2tzIGlzIHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2YgY2FjaGUtbGluZXMgaW4gUy1ib3ggYW5kL29yCisjIHByZWZldGNoIHRoZW0gdG8gZW5zdXJlIHRoYXQgZXZlcnkgb25lIGlzIGFjY2Vzc2VkIGZvciBtb3JlIHVuaWZvcm0KKyMgdGltaW5nLiBCdXQgbm90ZSB0aGF0ICppZiogcGxhaW4tdGV4dCB3YXMgY29uY2VhbGVkIGluIHN1Y2ggd2F5IHRoYXQKKyMgaW5wdXQgdG8gYmxvY2sgZnVuY3Rpb24gaXMgZGlzdHJpYnV0ZWQgKnVuaWZvcm1seSosIHRoZW4gYXR0YWNrCisjIHdvdWxkbid0IGFwcGx5LiBOb3cgbm90ZSB0aGF0IHNvbWUgZW5jcnlwdGlvbiBtb2RlcywgbW9zdCBub3RhYmx5CisjIENCQywgZG8gbWFzayB0aGUgcGxhaW4tdGV4dCBpbiB0aGlzIGV4YWN0IHdheSBbc2VjdXJlIGNpcGhlciBvdXRwdXQKKyMgaXMgZGlzdHJpYnV0ZWQgdW5pZm9ybWx5XS4gWWVzLCBvbmUgc3RpbGwgbWlnaHQgZmluZCBpbnB1dCB0aGF0CisjIHdvdWxkIHJldmVhbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgZ2l2ZW4ga2V5LCBidXQgaWYgYW1vdW50IG9mCisjIGNhbmRpZGF0ZSBpbnB1dHMgdG8gYmUgdHJpZWQgaXMgbGFyZ2VyIHRoYW4gYW1vdW50IG9mIHBvc3NpYmxlIGtleQorIyBjb21iaW5hdGlvbnMgdGhlbiBhdHRhY2sgYmVjb21lcyBpbmZlYXNpYmxlLiBUaGlzIGlzIHdoeSByZXZpc2VkCisjIEFFU19jYmNfZW5jcnlwdCAiZGFyZXMiIHRvIHN3aXRjaCB0byBsYXJnZXIgUy1ib3ggd2hlbiBsYXJnZXIgY2h1bmsKKyMgb2YgZGF0YSBpcyB0byBiZSBwcm9jZXNzZWQgaW4gb25lIHN0cm9rZS4gVGhlIGN1cnJlbnQgc2l6ZSBsaW1pdCBvZgorIyA1MTIgYnl0ZXMgaXMgY2hvc2VuIHRvIHByb3ZpZGUgc2FtZSBbZGltaW5pc2hpZ2x5IGxvd10gcHJvYmFiaWxpdHkKKyMgZm9yIGNhY2hlLWxpbmUgdG8gcmVtYWluIHVudG91Y2hlZCBpbiBsYXJnZSBjaHVuayBvcGVyYXRpb24gd2l0aAorIyBsYXJnZSBTLWJveCBhcyBmb3Igc2luZ2xlIGJsb2NrIG9wZXJhdGlvbiB3aXRoIGNvbXBhY3QgUy1ib3ggYW5kCisjIHN1cmVseSBuZWVkcyBtb3JlIGNhcmVmdWwgY29uc2lkZXJhdGlvbi4uLgorIworIyBBcyBmb3IgYXN5bmNocm9ub3VzIGF0dGFja3MuIFRoZXJlIGFyZSB0d28gZmxhdm91cnM6IGF0dGFja2VyIGNvZGUKKyMgYmVpbmcgaW50ZXJsZWF2ZWQgd2l0aCBBRVMgb24gaHlwZXItdGhyZWFkaW5nIENQVSBhdCAqaW5zdHJ1Y3Rpb24qCisjIGxldmVsLCBhbmQgdHdvIHByb2Nlc3NlcyB0aW1lIHNoYXJpbmcgc2luZ2xlIGNvcmUuIEFzIGZvciBsYXR0ZXIuCisjIFR3byB2ZWN0b3JzLiAxLiBHaXZlbiB0aGF0IGF0dGFja2VyIHByb2Nlc3MgaGFzIGhpZ2hlciBwcmlvcml0eSwKKyMgeWllbGQgZXhlY3V0aW9uIHRvIHByb2Nlc3MgcGVyZm9ybWluZyBBRVMganVzdCBiZWZvcmUgdGltZXIgZmlyZXMKKyMgb2ZmIHRoZSBzY2hlZHVsZXIsIGltbWVkaWF0ZWx5IHJlZ2FpbiBjb250cm9sIG9mIENQVSBhbmQgYW5hbHl6ZSB0aGUKKyMgY2FjaGUgc3RhdGUuIEZvciB0aGlzIGF0dGFjayB0byBiZSBlZmZpY2llbnQgYXR0YWNrZXIgd291bGQgaGF2ZSB0bworIyBlZmZlY3RpdmVseSBzbG93IGRvd24gdGhlIG9wZXJhdGlvbiBieSBzZXZlcmFsICpvcmRlcnMqIG9mIG1hZ25pdHV0ZSwKKyMgYnkgcmF0aW8gb2YgdGltZSBzbGljZSB0byBkdXJhdGlvbiBvZiBoYW5kZnVsIG9mIEFFUyByb3VuZHMsIHdoaWNoCisjIHVubGlrZWx5IHRvIHJlbWFpbiB1bm5vdGljZWQuIE5vdCB0byBtZW50aW9uIHRoYXQgdGhpcyBhbHNvIG1lYW5zCisjIHRoYXQgaGUgd291bGQgc3BlbmQgY29ycmVzcG9uZGlnbHkgbW9yZSB0aW1lIHRvIGNvbGxlY3QgZW5vdWdoCisjIHN0YXRpc3RpY2FsIGRhdGEgdG8gbW91bnQgdGhlIGF0dGFjay4gSXQncyBwcm9iYWJseSBhcHByb3ByaWF0ZSB0bworIyBzYXkgdGhhdCBpZiBhZGV2ZXJzYXJ5IHJlY2tvbnMgdGhhdCB0aGlzIGF0dGFjayBpcyBiZW5lZmljaWFsIGFuZAorIyByaXNrcyB0byBiZSBub3RpY2VkLCB5b3UgcHJvYmFibHkgaGF2ZSBsYXJnZXIgcHJvYmxlbXMgaGF2aW5nIGhpbQorIyBtZXJlIG9wcG9ydHVuaXR5LiBJbiBvdGhlciB3b3JkcyBzdWdnZXN0ZWQgY29kZSBkZXNpZ24gZXhwZWN0cyB5b3UKKyMgdG8gcHJlY2x1ZGUvbWl0aWdhdGUgdGhpcyBhdHRhY2sgYnkgb3ZlcmFsbCBzeXN0ZW0gc2VjdXJpdHkgZGVzaWduLgorIyAyLiBBdHRhY2tlciBtYW5hZ2VzIHRvIG1ha2UgaGlzIGNvZGUgaW50ZXJydXB0IGRyaXZlbi4gSW4gb3JkZXIgZm9yCisjIHRoaXMga2luZCBvZiBhdHRhY2sgdG8gYmUgZmVhc2libGUsIGludGVycnVwdCByYXRlIGhhcyB0byBiZSBoaWdoCisjIGVub3VnaCwgYWdhaW4gY29tcGFyYWJsZSB0byBkdXJhdGlvbiBvZiBoYW5kZnVsIG9mIEFFUyByb3VuZHMuIEJ1dAorIyBpcyB0aGVyZSBpbnRlcnJ1cHQgc291cmNlIG9mIHN1Y2ggcmF0ZT8gSGFyZGx5LCBub3QgZXZlbiAxR2JwcyBOSUMKKyMgZ2VuZXJhdGVzIGludGVycnVwdHMgYXQgc3VjaCByYWdpbmcgcmF0ZS4uLgorIworIyBBbmQgbm93IGJhY2sgdG8gdGhlIGZvcm1lciwgaHlwZXItdGhyZWFkaW5nIENQVSBvciBtb3JlIHNwZWNpZmljYWxseQorIyBJbnRlbCBQNC4gUmVjYWxsIHRoYXQgYXN5bmNocm9ub3VzIGF0dGFjayBpbXBsaWVzIHRoYXQgbWFsaWNpb3VzCisjIGNvZGUgaW5zdHJ1bWVudHMgaXRzZWxmLiBBbmQgbmF0dXJhbGx5IGluc3RydW1lbnRhdGlvbiBncmFudWxhcml0eQorIyBoYXMgYmUgbm90aWNlYWJseSBsb3dlciB0aGFuIGR1cmF0aW9uIG9mIGNvZGVwYXRoIGFjY2Vzc2luZyBTLWJveC4KKyMgR2l2ZW4gdGhhdCBhbGwgY2FjaGUtbGluZXMgYXJlIGFjY2Vzc2VkIGR1cmluZyB0aGF0IHRpbWUgdGhhdCBpcy4KKyMgQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBhY2Nlc3NlcyAqYWxsKiBjYWNoZS1saW5lcyB3aXRoaW4gfjUwIGN5Y2xlcworIyB3aW5kb3csIHdoaWNoIGlzIGFjdHVhbGx5ICpsZXNzKiB0aGFuIFJEVFNDIGxhdGVuY3kgb24gSW50ZWwgUDQhCisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwiYWVzLTU4Ni5wbCIsJHg4Nm9ubHkgPSAkQVJHVlskI0FSR1ZdIGVxICIzODYiKTsKKyZzdGF0aWNfbGFiZWwoIkFFU19UZSIpOworJnN0YXRpY19sYWJlbCgiQUVTX1RkIik7CisKKyRzMD0iZWF4IjsKKyRzMT0iZWJ4IjsKKyRzMj0iZWN4IjsKKyRzMz0iZWR4IjsKKyRrZXk9ImVkaSI7CiskYWNjPSJlc2kiOworJHRibD0iZWJwIjsKKworIyBzdGFjayBmcmFtZSBsYXlvdXQgaW4gX1t4ODZ8c3NlXV9BRVNfKiByb3V0aW5lcywgZnJhbWUgaXMgYWxsb2NhdGVkCisjIGJ5IGNhbGxlcgorJF9fcmE9JkRXUCgwLCJlc3AiKTsJIyByZXR1cm4gYWRkcmVzcworJF9fczA9JkRXUCg0LCJlc3AiKTsJIyBzMCBiYWNraW5nIHN0b3JlCiskX19zMT0mRFdQKDgsImVzcCIpOwkjIHMxIGJhY2tpbmcgc3RvcmUKKyRfX3MyPSZEV1AoMTIsImVzcCIpOwkjIHMyIGJhY2tpbmcgc3RvcmUKKyRfX3MzPSZEV1AoMTYsImVzcCIpOwkjIHMzIGJhY2tpbmcgc3RvcmUKKyRfX2tleT0mRFdQKDIwLCJlc3AiKTsJIyBwb2ludGVyIHRvIGtleSBzY2hlZHVsZQorJF9fZW5kPSZEV1AoMjQsImVzcCIpOwkjIHBvaW50ZXIgdG8gZW5kIG9mIGtleSBzY2hlZHVsZQorJF9fdGJsPSZEV1AoMjgsImVzcCIpOwkjICVlYnAgYmFja2luZyBzdG9yZQorCisjIHN0YWNrIGZyYW1lIGxheW91dCBpbiBBRVNfW2VufGNyeXB0XSByb3V0aW5lcywgd2hpY2ggZGlmZmVycyBmcm9tCisjIGFib3ZlIGJ5IDQgYW5kIG92ZXJsYXBzIGJ5ICVlYnAgYmFja2luZyBzdG9yZQorJF90Ymw9JkRXUCgyNCwiZXNwIik7CiskX2VzcD0mRFdQKDI4LCJlc3AiKTsKKworc3ViIF9kYXRhX3dvcmQoKSB7IG15ICRpOyB3aGlsZShkZWZpbmVkKCRpPXNoaWZ0KSkgeyAmZGF0YV93b3JkKCRpLCRpKTsgfSB9CisKKyRzcGVlZF9saW1pdD01MTI7CSMgY2h1bmtzIHNtYWxsZXIgdGhhbiAkc3BlZWRfbGltaXQgYXJlCisJCQkjIHByb2Nlc3NlZCB3aXRoIGNvbXBhY3Qgcm91dGluZSBpbiBDQkMgbW9kZQorJHNtYWxsX2Zvb3RwcmludD0xOwkjICRzbWFsbF9mb290cHJpbnQ9MSBjb2RlIGlzIH41JSBzbG93ZXIgW29uCisJCQkjIHJlY2VudCC1LWFyY2hzXSwgYnV0IH41IHRpbWVzIHNtYWxsZXIhCisJCQkjIEkgZmF2b3IgY29tcGFjdCBjb2RlIHRvIG1pbmltaXplIGNhY2hlCisJCQkjIGNvbnRlbnRpb24gYW5kIGluIGhvcGUgdG8gImNvbGxlY3QiIDUlIGJhY2sKKwkJCSMgaW4gcmVhbC1saWZlIGFwcGxpY2F0aW9ucy4uLgorCiskdmVydGljYWxfc3Bpbj0wOwkjIHNoaWZ0ICJ2ZXJ0aWNhbHkiIGRlZmF1bHRzIHRvIDAsIGJlY2F1c2Ugb2YKKwkJCSMgaXRzIHByb29mLW9mLWNvbmNlcHQgc3RhdHVzLi4uCisjIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBkZWN2ZXJ0KCksIGFzIHdlbGwgYXMgbGFzdCBlbmNyeXB0aW9uIHJvdW5kIGlzCisjIHBlcmZvcm1lZCB3aXRoICJob3Jpem9udGFsIiBzaGlmdHMuIFRoaXMgaXMgYmVjYXVzZSB0aGlzICJ2ZXJ0aWNhbCIKKyMgaW1wbGVtZW50YXRpb24gW29uZSB3aGljaCBncm91cHMgc2hpZnRzIG9uIGEgZ2l2ZW4gJHNbaV0gdG8gZm9ybSBhCisjICJjb2x1bW4sIiB1bmxpa2UgImhvcml6b250YWwiIG9uZSwgd2hpY2ggZ3JvdXBzIHNoaWZ0cyBvbiBkaWZmZXJlbnQKKyMgJHNbaV0gdG8gZm9ybSBhICJyb3ciXSBpcyB3b3JrIGluIHByb2dyZXNzLiBJdCB3YXMgb2JzZXJ2ZWQgdG8gcnVuCisjIGZldyBwZXJjZW50cyBmYXN0ZXIgb24gSW50ZWwgY29yZXMsIGJ1dCBub3QgQU1ELiBPbiBBTUQgSzggY29yZSBpdCdzCisjIHdob2xlIDEyJSBzbG93ZXI6LSggU28gd2UgZmFjZSBhIHRyYWRlLW9mZi4uLiBTaGFsbCBpdCBiZSByZXNvbHZlZAorIyBzb21lIGRheT8gVGlsbCB0aGVuIHRoZSBjb2RlIGlzIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsIGFuZCBieQorIyBkZWZhdWx0IHJlbWFpbnMgZG9ybWFudC4uLgorCitzdWIgZW5jdmVydCgpCit7IG15ICgkdGUsQHMpID0gQF87CisgIG15ICR2MCA9ICRhY2MsICR2MSA9ICRrZXk7CisKKwkmbW92CSgkdjAsJHNbM10pOwkJCQkjIGNvcHkgczMKKwkmbW92CSgmRFdQKDQsImVzcCIpLCRzWzJdKTsJCQkjIHNhdmUgczIKKwkmbW92CSgkdjEsJHNbMF0pOwkJCQkjIGNvcHkgczAKKwkmbW92CSgmRFdQKDgsImVzcCIpLCRzWzFdKTsJCQkjIHNhdmUgczEKKworCSZtb3Z6CSgkc1syXSwmSEIoJHNbMF0pKTsKKwkmYW5kCSgkc1swXSwweEZGKTsKKwkmbW92CSgkc1swXSwmRFdQKDAsJHRlLCRzWzBdLDgpKTsJCSMgczA+PjAKKwkmc2hyCSgkdjEsMTYpOworCSZtb3YJKCRzWzNdLCZEV1AoMywkdGUsJHNbMl0sOCkpOwkJIyBzMD4+OAorCSZtb3Z6CSgkc1sxXSwmSEIoJHYxKSk7CisJJmFuZAkoJHYxLDB4RkYpOworCSZtb3YJKCRzWzJdLCZEV1AoMiwkdGUsJHYxLDgpKTsJCSMgczA+PjE2CisJICZtb3YJKCR2MSwkdjApOworCSZtb3YJKCRzWzFdLCZEV1AoMSwkdGUsJHNbMV0sOCkpOwkJIyBzMD4+MjQKKworCSZhbmQJKCR2MCwweEZGKTsKKwkmeG9yCSgkc1szXSwmRFdQKDAsJHRlLCR2MCw4KSk7CQkjIHMzPj4wCisJJm1vdnoJKCR2MCwmSEIoJHYxKSk7CisJJnNocgkoJHYxLDE2KTsKKwkmeG9yCSgkc1syXSwmRFdQKDMsJHRlLCR2MCw4KSk7CQkjIHMzPj44CisJJm1vdnoJKCR2MCwmSEIoJHYxKSk7CisJJmFuZAkoJHYxLDB4RkYpOworCSZ4b3IJKCRzWzFdLCZEV1AoMiwkdGUsJHYxLDgpKTsJCSMgczM+PjE2CisJICZtb3YJKCR2MSwmRFdQKDQsImVzcCIpKTsJCQkjIHJlc3RvcmUgczIKKwkmeG9yCSgkc1swXSwmRFdQKDEsJHRlLCR2MCw4KSk7CQkjIHMzPj4yNAorCisJJm1vdgkoJHYwLCR2MSk7CisJJmFuZAkoJHYxLDB4RkYpOworCSZ4b3IJKCRzWzJdLCZEV1AoMCwkdGUsJHYxLDgpKTsJCSMgczI+PjAKKwkmbW92egkoJHYxLCZIQigkdjApKTsKKwkmc2hyCSgkdjAsMTYpOworCSZ4b3IJKCRzWzFdLCZEV1AoMywkdGUsJHYxLDgpKTsJCSMgczI+PjgKKwkmbW92egkoJHYxLCZIQigkdjApKTsKKwkmYW5kCSgkdjAsMHhGRik7CisJJnhvcgkoJHNbMF0sJkRXUCgyLCR0ZSwkdjAsOCkpOwkJIyBzMj4+MTYKKwkgJm1vdgkoJHYwLCZEV1AoOCwiZXNwIikpOwkJCSMgcmVzdG9yZSBzMQorCSZ4b3IJKCRzWzNdLCZEV1AoMSwkdGUsJHYxLDgpKTsJCSMgczI+PjI0CisKKwkmbW92CSgkdjEsJHYwKTsKKwkmYW5kCSgkdjAsMHhGRik7CisJJnhvcgkoJHNbMV0sJkRXUCgwLCR0ZSwkdjAsOCkpOwkJIyBzMT4+MAorCSZtb3Z6CSgkdjAsJkhCKCR2MSkpOworCSZzaHIJKCR2MSwxNik7CisJJnhvcgkoJHNbMF0sJkRXUCgzLCR0ZSwkdjAsOCkpOwkJIyBzMT4+OAorCSZtb3Z6CSgkdjAsJkhCKCR2MSkpOworCSZhbmQJKCR2MSwweEZGKTsKKwkmeG9yCSgkc1szXSwmRFdQKDIsJHRlLCR2MSw4KSk7CQkjIHMxPj4xNgorCSAmbW92CSgka2V5LCRfX2tleSk7CQkJCSMgcmVpbmNhcm5hdGUgdjEgYXMga2V5CisJJnhvcgkoJHNbMl0sJkRXUCgxLCR0ZSwkdjAsOCkpOwkJIyBzMT4+MjQKK30KKworIyBBbm90aGVyIGV4cGVyaW1lbnRhbCByb3V0aW5lLCB3aGljaCBmZWF0dXJlcyAiaG9yaXpvbnRhbCBzcGluLCIgYnV0CisjIGVsaW1pbmF0ZXMgb25lIHJlZmVyZW5jZSB0byBzdGFjay4gU3RyYW5nZWx5IGVub3VnaCBydW5zIHNsb3dlci4uLgorc3ViIGVuY2hvcml6KCkKK3sgbXkgJHYwID0gJGtleSwgJHYxID0gJGFjYzsKKworCSZtb3Z6CSgkdjAsJkxCKCRzMCkpOwkJCSMgIDMsIDIsIDEsIDAqCisJJnJvdHIJKCRzMiw4KTsJCQkjICA4LDExLDEwLCA5CisJJm1vdgkoJHYxLCZEV1AoMCwkdGUsJHYwLDgpKTsJIyAgMAorCSZtb3Z6CSgkdjAsJkhCKCRzMSkpOwkJCSMgIDcsIDYsIDUqLCA0CisJJnJvdHIJKCRzMywxNik7CQkJIyAxMywxMiwxNSwxNAorCSZ4b3IJKCR2MSwmRFdQKDMsJHRlLCR2MCw4KSk7CSMgIDUKKwkmbW92egkoJHYwLCZIQigkczIpKTsJCQkjICA4LDExLDEwKiwgOQorCSZyb3RyCSgkczAsMTYpOwkJCSMgIDEsIDAsIDMsIDIKKwkmeG9yCSgkdjEsJkRXUCgyLCR0ZSwkdjAsOCkpOwkjIDEwCisJJm1vdnoJKCR2MCwmSEIoJHMzKSk7CQkJIyAxMywxMiwxNSosMTQKKwkmeG9yCSgkdjEsJkRXUCgxLCR0ZSwkdjAsOCkpOwkjIDE1LCB0WzBdIGNvbGxlY3RlZAorCSZtb3YJKCRfX3MwLCR2MSk7CQkJIyB0WzBdIHNhdmVkCisKKwkmbW92egkoJHYwLCZMQigkczEpKTsJCQkjICA3LCA2LCA1LCA0KgorCSZzaHIJKCRzMSwxNik7CQkJIyAgLSwgLSwgNywgNgorCSZtb3YJKCR2MSwmRFdQKDAsJHRlLCR2MCw4KSk7CSMgIDQKKwkmbW92egkoJHYwLCZMQigkczMpKTsJCQkjIDEzLDEyLDE1LDE0KgorCSZ4b3IJKCR2MSwmRFdQKDIsJHRlLCR2MCw4KSk7CSMgMTQKKwkmbW92egkoJHYwLCZIQigkczApKTsJCQkjICAxLCAwLCAzKiwgMgorCSZhbmQJKCRzMywweGZmZmYwMDAwKTsJCSMgMTMsMTIsIC0sIC0KKwkmeG9yCSgkdjEsJkRXUCgxLCR0ZSwkdjAsOCkpOwkjICAzCisJJm1vdnoJKCR2MCwmTEIoJHMyKSk7CQkJIyAgOCwxMSwxMCwgOSoKKwkmb3IJKCRzMywkczEpOwkJCSMgMTMsMTIsIDcsIDYKKwkmeG9yCSgkdjEsJkRXUCgzLCR0ZSwkdjAsOCkpOwkjICA5LCB0WzFdIGNvbGxlY3RlZAorCSZtb3YJKCRzMSwkdjEpOwkJCSMgIHNbMV09dFsxXQorCisJJm1vdnoJKCR2MCwmTEIoJHMwKSk7CQkJIyAgMSwgMCwgMywgMioKKwkmc2hyCSgkczIsMTYpOwkJCSMgIC0sIC0sIDgsMTEKKwkmbW92CSgkdjEsJkRXUCgyLCR0ZSwkdjAsOCkpOwkjICAyCisJJm1vdnoJKCR2MCwmSEIoJHMzKSk7CQkJIyAxMywxMiwgNyosIDYKKwkmeG9yCSgkdjEsJkRXUCgxLCR0ZSwkdjAsOCkpOwkjICA3CisJJm1vdnoJKCR2MCwmSEIoJHMyKSk7CQkJIyAgLSwgLSwgOCosMTEKKwkmeG9yCSgkdjEsJkRXUCgwLCR0ZSwkdjAsOCkpOwkjICA4CisJJm1vdgkoJHYwLCRzMyk7CisJJnNocgkoJHYwLDI0KTsJCQkjIDEzCisJJnhvcgkoJHYxLCZEV1AoMywkdGUsJHYwLDgpKTsJIyAxMywgdFsyXSBjb2xsZWN0ZWQKKworCSZtb3Z6CSgkdjAsJkxCKCRzMikpOwkJCSMgIC0sIC0sIDgsMTEqCisJJnNocgkoJHMwLDI0KTsJCQkjICAxKgorCSZtb3YJKCRzMiwmRFdQKDEsJHRlLCR2MCw4KSk7CSMgMTEKKwkmeG9yCSgkczIsJkRXUCgzLCR0ZSwkczAsOCkpOwkjICAxCisJJm1vdgkoJHMwLCRfX3MwKTsJCQkjIHNbMF09dFswXQorCSZtb3Z6CSgkdjAsJkxCKCRzMykpOwkJCSMgMTMsMTIsIDcsIDYqCisJJnNocgkoJHMzLDE2KTsJCQkjICAgLCAgLDEzLDEyCisJJnhvcgkoJHMyLCZEV1AoMiwkdGUsJHYwLDgpKTsJIyAgNgorCSZtb3YJKCRrZXksJF9fa2V5KTsJCQkjIHJlaW5jYXJuYXRlIHYwIGFzIGtleQorCSZhbmQJKCRzMywweGZmKTsJCQkjICAgLCAgLDEzLDEyKgorCSZtb3YJKCRzMywmRFdQKDAsJHRlLCRzMyw4KSk7CSMgMTIKKwkmeG9yCSgkczMsJHMyKTsJCQkjIHNbMl09dFszXSBjb2xsZWN0ZWQKKwkmbW92CSgkczIsJHYxKTsJCQkjIHNbMl09dFsyXQorfQorCisjIE1vcmUgZXhwZXJpbWVudGFsIGNvZGUuLi4gU1NFIG9uZS4uLiBFdmVuIHRob3VnaCB0aGlzIG9uZSBlbGltaW5hdGVzCisjICphbGwqIHJlZmVyZW5jZXMgdG8gc3RhY2ssIGl0J3Mgbm90IGZhc3Rlci4uLgorc3ViIHNzZV9lbmNib2R5KCkKK3sKKwkmbW92egkoJGFjYywmTEIoImVheCIpKTsJCSMgIDAKKwkmbW92CSgiZWN4IiwmRFdQKDAsJHRibCwkYWNjLDgpKTsJIyAgMAorCSZwc2h1ZncJKCJtbTIiLCJtbTAiLDB4MGQpOwkJIyAgNywgNiwgMywgMgorCSZtb3Z6CSgiZWR4IiwmSEIoImVheCIpKTsJCSMgIDEKKwkmbW92CSgiZWR4IiwmRFdQKDMsJHRibCwiZWR4Iiw4KSk7CSMgIDEKKwkmc2hyCSgiZWF4IiwxNik7CQkJIyAgNSwgNAorCisJJm1vdnoJKCRhY2MsJkxCKCJlYngiKSk7CQkjIDEwCisJJnhvcgkoImVjeCIsJkRXUCgyLCR0YmwsJGFjYyw4KSk7CSMgMTAKKwkmcHNodWZ3CSgibW02IiwibW00IiwweDA4KTsJCSMgMTMsMTIsIDksIDgKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgMTEKKwkmeG9yCSgiZWR4IiwmRFdQKDEsJHRibCwkYWNjLDgpKTsJIyAxMQorCSZzaHIJKCJlYngiLDE2KTsJCQkjIDE1LDE0CisKKwkmbW92egkoJGFjYywmSEIoImVheCIpKTsJCSMgIDUKKwkmeG9yCSgiZWN4IiwmRFdQKDMsJHRibCwkYWNjLDgpKTsJIyAgNQorCSZtb3ZxCSgibW0zIixRV1AoMTYsJGtleSkpOworCSZtb3Z6CSgkYWNjLCZIQigiZWJ4IikpOwkJIyAxNQorCSZ4b3IJKCJlY3giLCZEV1AoMSwkdGJsLCRhY2MsOCkpOwkjIDE1CisJJm1vdmQJKCJtbTAiLCJlY3giKTsJCQkjIHRbMF0gY29sbGVjdGVkCisKKwkmbW92egkoJGFjYywmTEIoImVheCIpKTsJCSMgIDQKKwkmbW92CSgiZWN4IiwmRFdQKDAsJHRibCwkYWNjLDgpKTsJIyAgNAorCSZtb3ZkCSgiZWF4IiwibW0yIik7CQkJIyAgNywgNiwgMywgMgorCSZtb3Z6CSgkYWNjLCZMQigiZWJ4IikpOwkJIyAxNAorCSZ4b3IJKCJlY3giLCZEV1AoMiwkdGJsLCRhY2MsOCkpOwkjIDE0CisJJm1vdmQJKCJlYngiLCJtbTYiKTsJCQkjIDEzLDEyLCA5LCA4CisKKwkmbW92egkoJGFjYywmSEIoImVheCIpKTsJCSMgIDMKKwkmeG9yCSgiZWN4IiwmRFdQKDEsJHRibCwkYWNjLDgpKTsJIyAgMworCSZtb3Z6CSgkYWNjLCZIQigiZWJ4IikpOwkJIyAgOQorCSZ4b3IJKCJlY3giLCZEV1AoMywkdGJsLCRhY2MsOCkpOwkjICA5CisJJm1vdmQJKCJtbTEiLCJlY3giKTsJCQkjIHRbMV0gY29sbGVjdGVkCisKKwkmbW92egkoJGFjYywmTEIoImVheCIpKTsJCSMgIDIKKwkmbW92CSgiZWN4IiwmRFdQKDIsJHRibCwkYWNjLDgpKTsJIyAgMgorCSZzaHIJKCJlYXgiLDE2KTsJCQkjICA3LCA2CisJJnB1bnBja2xkcQkoIm1tMCIsIm1tMSIpOwkJIyB0WzAsMV0gY29sbGVjdGVkCisJJm1vdnoJKCRhY2MsJkxCKCJlYngiKSk7CQkjICA4CisJJnhvcgkoImVjeCIsJkRXUCgwLCR0YmwsJGFjYyw4KSk7CSMgIDgKKwkmc2hyCSgiZWJ4IiwxNik7CQkJIyAxMywxMgorCisJJm1vdnoJKCRhY2MsJkhCKCJlYXgiKSk7CQkjICA3CisJJnhvcgkoImVjeCIsJkRXUCgxLCR0YmwsJGFjYyw4KSk7CSMgIDcKKwkmcHhvcgkoIm1tMCIsIm1tMyIpOworCSZtb3Z6CSgiZWF4IiwmTEIoImVheCIpKTsJCSMgIDYKKwkmeG9yCSgiZWR4IiwmRFdQKDIsJHRibCwiZWF4Iiw4KSk7CSMgIDYKKwkmcHNodWZ3CSgibW0xIiwibW0wIiwweDA4KTsJCSMgIDUsIDQsIDEsIDAKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgMTMKKwkmeG9yCSgiZWN4IiwmRFdQKDMsJHRibCwkYWNjLDgpKTsJIyAxMworCSZ4b3IJKCJlY3giLCZEV1AoMjQsJGtleSkpOwkJIyB0WzJdCisJJm1vdmQJKCJtbTQiLCJlY3giKTsJCQkjIHRbMl0gY29sbGVjdGVkCisJJm1vdnoJKCJlYngiLCZMQigiZWJ4IikpOwkJIyAxMgorCSZ4b3IJKCJlZHgiLCZEV1AoMCwkdGJsLCJlYngiLDgpKTsJIyAxMgorCSZzaHIJKCJlY3giLDE2KTsKKwkmbW92ZAkoImVheCIsIm1tMSIpOwkJCSMgIDUsIDQsIDEsIDAKKwkmbW92CSgiZWJ4IiwmRFdQKDI4LCRrZXkpKTsJCSMgdFszXQorCSZ4b3IJKCJlYngiLCJlZHgiKTsKKwkmbW92ZAkoIm1tNSIsImVieCIpOwkJCSMgdFszXSBjb2xsZWN0ZWQKKwkmYW5kCSgiZWJ4IiwweGZmZmYwMDAwKTsKKwkmb3IJKCJlYngiLCJlY3giKTsKKworCSZwdW5wY2tsZHEJKCJtbTQiLCJtbTUiKTsJCSMgdFsyLDNdIGNvbGxlY3RlZAorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJDb21wYWN0IiBibG9jayBmdW5jdGlvbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgZW5jY29tcGFjdCgpCit7IG15ICRGbiA9IG1vdjsKKyAgd2hpbGUgKCQjXz41KSB7IHBvcChAXyk7ICRGbj1zdWJ7fTsgfQorICBteSAoJGksJHRlLEBzKT1AXzsKKyAgbXkgJHRtcCA9ICRrZXk7CisgIG15ICRvdXQgPSAkaT09Mz8kc1swXTokYWNjOworCisJIyAkRm4gaXMgdXNlZCBpbiBmaXJzdCBjb21wYWN0IHJvdW5kIGFuZCBpdHMgcHVycG9zZSBpcyB0bworCSMgdm9pZCByZXN0b3JhdGlvbiBvZiBzb21lIHZhbHVlcyBmcm9tIHN0YWNrLCBzbyB0aGF0IGFmdGVyCisJIyA0eGVuY2NvbXBhY3Qgd2l0aCBleHRyYSBhcmd1bWVudCAka2V5IHZhbHVlIGlzIGxlZnQgdGhlcmUuLi4KKwlpZiAoJGk9PTMpICB7CSYkRm4JKCRrZXksJF9fa2V5KTsJCQl9IyMlZWR4CisJZWxzZSAgICAgICAgewkmbW92CSgkb3V0LCRzWzBdKTsJCQl9CisJCQkmYW5kCSgkb3V0LDB4RkYpOworCWlmICgkaT09MSkgIHsJJnNocgkoJHNbMF0sMTYpOwkJCX0jJWVieFsxXQorCWlmICgkaT09MikgIHsJJnNocgkoJHNbMF0sMjQpOwkJCX0jJWVjeFsyXQorCQkJJm1vdnoJKCRvdXQsJkJQKC0xMjgsJHRlLCRvdXQsMSkpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzFdOwkJCQl9IyMlZWF4CisJCQkmbW92egkoJHRtcCwmSEIoJHNbMV0pKTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgtMTI4LCR0ZSwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsOCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzJdOyAmbW92ICgkc1sxXSwkX19zMCk7CQl9IyMlZWJ4CisJZWxzZSAgICAgICAgewkmbW92CSgkdG1wLCRzWzJdKTsKKwkJCSZzaHIJKCR0bXAsMTYpOwkJCX0KKwlpZiAoJGk9PTIpICB7CSZhbmQJKCRzWzFdLDB4RkYpOwkJCX0jJWVkeFsyXQorCQkJJmFuZAkoJHRtcCwweEZGKTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgtMTI4LCR0ZSwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsMTYpOworCQkJJnhvcgkoJG91dCwkdG1wKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1szXTsgJm1vdiAoJHNbMl0sJF9fczEpOwkJfSMjJWVjeAorCWVsc2lmKCRpPT0yKXsJJm1vdnoJKCR0bXAsJkhCKCRzWzNdKSk7CQl9IyVlYnhbMl0KKwllbHNlICAgICAgICB7CSZtb3YJKCR0bXAsJHNbM10pOworCQkJJnNocgkoJHRtcCwyNCk7CQkJfQorCQkJJm1vdnoJKCR0bXAsJkJQKC0xMjgsJHRlLCR0bXAsMSkpOworCQkJJnNobAkoJHRtcCwyNCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCWlmICgkaTwyKSAgIHsJJm1vdgkoJkRXUCg0KzQqJGksImVzcCIpLCRvdXQpOwl9CisJaWYgKCRpPT0zKSAgewkmbW92CSgkc1szXSwkYWNjKTsJCQl9CisJJmNvbW1lbnQoKTsKK30KKworc3ViIGVuY3RyYW5zZm9ybSgpCit7IG15IEBzID0gKCRzMCwkczEsJHMyLCRzMyk7CisgIG15ICRpID0gc2hpZnQ7CisgIG15ICR0bXAgPSAkdGJsOworICBteSAkcjIgID0gJGtleSA7CisKKwkmbW92CSgkYWNjLCRzWyRpXSk7CisJJmFuZAkoJGFjYywweDgwODA4MDgwKTsKKwkmbW92CSgkdG1wLCRhY2MpOworCSZzaHIJKCR0bXAsNyk7CisJJmxlYQkoJHIyLCZEV1AoMCwkc1skaV0sJHNbJGldKSk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkcjIsMHhmZWZlZmVmZSk7CisJJmFuZAkoJGFjYywweDFiMWIxYjFiKTsKKwkmbW92CSgkdG1wLCRzWyRpXSk7CisJJnhvcgkoJGFjYywkcjIpOwkjIHIyCisKKwkmeG9yCSgkc1skaV0sJGFjYyk7CSMgcjAgXiByMgorCSZyb3RsCSgkc1skaV0sMjQpOworCSZ4b3IJKCRzWyRpXSwkYWNjKQkjIFJPVEFURShyMl5yMCwyNCkgXiByMgorCSZyb3RyCSgkdG1wLDE2KTsKKwkmeG9yCSgkc1skaV0sJHRtcCk7CisJJnJvdHIJKCR0bXAsOCk7CisJJnhvcgkoJHNbJGldLCR0bXApOworfQorCismZnVuY3Rpb25fYmVnaW5fQigiX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0Iik7CisJIyBub3RlIHRoYXQgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGFsbG9jYXRlIHN0YWNrIGZyYW1lIGZvciBtZSEKKwkmbW92CSgkX19rZXksJGtleSk7CQkJIyBzYXZlIGtleQorCisJJnhvcgkoJHMwLCZEV1AoMCwka2V5KSk7CQkjIHhvciB3aXRoIGtleQorCSZ4b3IJKCRzMSwmRFdQKDQsJGtleSkpOworCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCSZ4b3IJKCRzMywmRFdQKDEyLCRrZXkpKTsKKworCSZtb3YJKCRhY2MsJkRXUCgyNDAsJGtleSkpOwkJIyBsb2FkIGtleS0+cm91bmRzCisJJmxlYQkoJGFjYywmRFdQKC0yLCRhY2MsJGFjYykpOworCSZsZWEJKCRhY2MsJkRXUCgwLCRrZXksJGFjYyw4KSk7CisJJm1vdgkoJF9fZW5kLCRhY2MpOwkJCSMgZW5kIG9mIGtleSBzY2hlZHVsZQorCisJIyBwcmVmZXRjaCBUZTQKKwkmbW92CSgka2V5LCZEV1AoMC0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCgzMi0xMjgsJHRibCkpOworCSZtb3YJKCRrZXksJkRXUCg2NC0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCg5Ni0xMjgsJHRibCkpOworCSZtb3YJKCRrZXksJkRXUCgxMjgtMTI4LCR0YmwpKTsKKwkmbW92CSgkYWNjLCZEV1AoMTYwLTEyOCwkdGJsKSk7CisJJm1vdgkoJGtleSwmRFdQKDE5Mi0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCgyMjQtMTI4LCR0YmwpKTsKKworCSZzZXRfbGFiZWwoImxvb3AiLDE2KTsKKworCQkmZW5jY29tcGFjdCgwLCR0YmwsJHMwLCRzMSwkczIsJHMzLDEpOworCQkmZW5jY29tcGFjdCgxLCR0YmwsJHMxLCRzMiwkczMsJHMwLDEpOworCQkmZW5jY29tcGFjdCgyLCR0YmwsJHMyLCRzMywkczAsJHMxLDEpOworCQkmZW5jY29tcGFjdCgzLCR0YmwsJHMzLCRzMCwkczEsJHMyLDEpOworCQkmZW5jdHJhbnNmb3JtKDIpOworCQkmZW5jdHJhbnNmb3JtKDMpOworCQkmZW5jdHJhbnNmb3JtKDApOworCQkmZW5jdHJhbnNmb3JtKDEpOworCQkmbW92IAkoJGtleSwkX19rZXkpOworCQkmbW92CSgkdGJsLCRfX3RibCk7CisJCSZhZGQJKCRrZXksMTYpOwkJIyBhZHZhbmNlIHJkX2tleQorCQkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmY21wCSgka2V5LCRfX2VuZCk7CisJJm1vdgkoJF9fa2V5LCRrZXkpOworCSZqYgkoJmxhYmVsKCJsb29wIikpOworCisJJmVuY2NvbXBhY3QoMCwkdGJsLCRzMCwkczEsJHMyLCRzMyk7CisJJmVuY2NvbXBhY3QoMSwkdGJsLCRzMSwkczIsJHMzLCRzMCk7CisJJmVuY2NvbXBhY3QoMiwkdGJsLCRzMiwkczMsJHMwLCRzMSk7CisJJmVuY2NvbXBhY3QoMywkdGJsLCRzMywkczAsJHMxLCRzMik7CisKKwkmeG9yCSgkczAsJkRXUCgxNiwka2V5KSk7CisJJnhvcgkoJHMxLCZEV1AoMjAsJGtleSkpOworCSZ4b3IJKCRzMiwmRFdQKDI0LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgyOCwka2V5KSk7CisKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJfeDg2X0FFU19lbmNyeXB0X2NvbXBhY3QiKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAiQ29tcGFjdCIgU1NFIGJsb2NrIGZ1bmN0aW9uLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQZXJmb3JtYW5jZSBpcyBub3QgYWN0dWFsbHkgZXh0cmFvcmRpbmFyeSBpbiBjb21wYXJpc29uIHRvIHB1cmUKKyMgeDg2IGNvZGUuIEluIHBhcnRpY3VsYXIgZW5jcnlwdCBwZXJmb3JtYW5jZSBpcyB2aXJ0dWFsbHkgdGhlIHNhbWUuCisjIERlY3J5cHQgcGVyZm9ybWFuY2Ugb24gdGhlIG90aGVyIGhhbmQgaXMgMTUtMjAlIGJldHRlciBvbiBuZXdlcgorIyC1LWFyY2hzIFtidXQgd2UncmUgdGhhbmtmdWwgZm9yICphbnkqIGltcHJvdmVtZW50IGhlcmVdLCBhbmQgfjUwJQorIyBiZXR0ZXIgb24gUElJSTotKSBBbmQgYWRkaXRpb25hbGx5IG9uIHRoZSBwcm9zIHNpZGUgdGhpcyBjb2RlCisjIGVsaW1pbmF0ZXMgcmVkdW5kYW50IHJlZmVyZW5jZXMgdG8gc3RhY2sgYW5kIHRodXMgcmVsaWV2ZXMvCisjIG1pbmltaXplcyB0aGUgcHJlc3N1cmUgb24gdGhlIG1lbW9yeSBidXMuCisjCisjIE1NWCByZWdpc3RlciBsYXlvdXQgICAgICAgICAgICAgICAgICAgICAgICAgICBsc2IKKyMgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworIyB8ICAgICAgICAgIG1tNCAgICAgICAgICB8ICAgICAgICAgIG1tMCAgICAgICAgICB8CisjICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyMgfCAgICAgczMgICAgfCAgICAgczIgICAgfCAgICAgczEgICAgfCAgICAgczAgICAgfCAgICAKKyMgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworIyB8MTV8MTR8MTN8MTJ8MTF8MTB8IDl8IDh8IDd8IDZ8IDV8IDR8IDN8IDJ8IDF8IDB8CisjICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyMKKyMgSW5kZXhlcyB0cmFuc2xhdGUgYXMgc1tOLzRdPj4oOCooTiU0KSksIGUuZy4gNSBtZWFucyBzMT4+OC4KKyMgSW4gdGhpcyB0ZXJtcyBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uICJjb21wYWN0IiBwZXJtdXRhdGlvbgorIyBtYXRyaWNlcyBjYW4gYmUgZGVwaWN0ZWQgYXMgZm9sbG93aW5nOgorIworIyBlbmNyeXB0aW9uICAgICAgICAgICAgICBsc2IJIyBkZWNyeXB0aW9uICAgICAgICAgICAgICBsc2IKKyMgKy0tLS0rKy0tLS0rLS0tLSstLS0tKy0tLS0rCSMgKy0tLS0rKy0tLS0rLS0tLSstLS0tKy0tLS0rCisjIHwgdDAgfHwgMTUgfCAxMCB8ICA1IHwgIDAgfAkjIHwgdDAgfHwgIDcgfCAxMCB8IDEzIHwgIDAgfAorIyArLS0tLSsrLS0tLSstLS0tKy0tLS0rLS0tLSsJIyArLS0tLSsrLS0tLSstLS0tKy0tLS0rLS0tLSsKKyMgfCB0MSB8fCAgMyB8IDE0IHwgIDkgfCAgNCB8CSMgfCB0MSB8fCAxMSB8IDE0IHwgIDEgfCAgNCB8CisjICstLS0tKystLS0tKy0tLS0rLS0tLSstLS0tKwkjICstLS0tKystLS0tKy0tLS0rLS0tLSstLS0tKworIyB8IHQyIHx8ICA3IHwgIDIgfCAxMyB8ICA4IHwJIyB8IHQyIHx8IDE1IHwgIDIgfCAgNSB8ICA4IHwKKyMgKy0tLS0rKy0tLS0rLS0tLSstLS0tKy0tLS0rCSMgKy0tLS0rKy0tLS0rLS0tLSstLS0tKy0tLS0rCisjIHwgdDMgfHwgMTEgfCAgNiB8ICAxIHwgMTIgfAkjIHwgdDMgfHwgIDMgfCAgNiB8ICA5IHwgMTIgfAorIyArLS0tLSsrLS0tLSstLS0tKy0tLS0rLS0tLSsJIyArLS0tLSsrLS0tLSstLS0tKy0tLS0rLS0tLSsKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgV2h5IG5vdCB4bW0gcmVnaXN0ZXJzPyBTaG9ydCBhbnN3ZXIuIEl0IHdhcyBhY3R1YWxseSB0ZXN0ZWQgYW5kCisjIHdhcyBub3QgYW55IGZhc3RlciwgYnV0ICpjb250cmFyeSosIG1vc3Qgbm90YWJseSBvbiBJbnRlbCBDUFVzLgorIyBMb25nZXIgYW5zd2VyLiBNYWluIGFkdmFudGFnZSBvZiB1c2luZyBtbSByZWdpc3RlcnMgaXMgdGhhdCBtb3ZkCisjIGxhdGVuY3kgaXMgbG93ZXIsIGVzcGVjaWFsbHkgb24gSW50ZWwgUDQuIFdoaWxlIGFyaXRobWV0aWMKKyMgaW5zdHJ1Y3Rpb25zIGFyZSB0d2ljZSBhcyBtYW55LCB0aGV5IGNhbiBiZSBzY2hlZHVsZWQgZXZlcnkgY3ljbGUKKyMgYW5kIG5vdCBldmVyeSBzZWNvbmQgb25lIHdoZW4gdGhleSBhcmUgb3BlcmF0aW5nIG9uIHhtbSByZWdpc3RlciwKKyMgc28gdGhhdCAiYXJpdGhtZXRpYyB0aHJvdWdocHV0IiByZW1haW5zIHZpcnR1YWxseSB0aGUgc2FtZS4gQW5kCisjIGZpbmFsbHkgdGhlIGNvZGUgY2FuIGJlIGV4ZWN1dGVkIGV2ZW4gb24gZWxkZXIgU1NFLW9ubHkgQ1BVczotKQorCitzdWIgc3NlX2VuY2NvbXBhY3QoKQoreworCSZwc2h1ZncJKCJtbTEiLCJtbTAiLDB4MDgpOwkJIyAgNSwgNCwgMSwgMAorCSZwc2h1ZncJKCJtbTUiLCJtbTQiLDB4MGQpOwkJIyAxNSwxNCwxMSwxMAorCSZtb3ZkCSgiZWF4IiwibW0xIik7CQkJIyAgNSwgNCwgMSwgMAorCSZtb3ZkCSgiZWJ4IiwibW01Iik7CQkJIyAxNSwxNCwxMSwxMAorCisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICAwCisJJm1vdnoJKCJlY3giLCZCUCgtMTI4LCR0YmwsJGFjYywxKSk7CSMgIDAKKwkmcHNodWZ3CSgibW0yIiwibW0wIiwweDBkKTsJCSMgIDcsIDYsIDMsIDIKKwkmbW92egkoImVkeCIsJkhCKCJlYXgiKSk7CQkjICAxCisJJm1vdnoJKCJlZHgiLCZCUCgtMTI4LCR0YmwsImVkeCIsMSkpOwkjICAxCisJJnNobAkoImVkeCIsOCk7CQkJIyAgMQorCSZzaHIJKCJlYXgiLDE2KTsJCQkjICA1LCA0CisKKwkmbW92egkoJGFjYywmTEIoImVieCIpKTsJCSMgMTAKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRhY2MsMSkpOwkjIDEwCisJJnNobAkoJGFjYywxNik7CQkJIyAxMAorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAxMAorCSZwc2h1ZncJKCJtbTYiLCJtbTQiLDB4MDgpOwkJIyAxMywxMiwgOSwgOAorCSZtb3Z6CSgkYWNjLCZIQigiZWJ4IikpOwkJIyAxMQorCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGFjYywxKSk7CSMgMTEKKwkmc2hsCSgkYWNjLDI0KTsJCQkjIDExCisJJm9yCSgiZWR4IiwkYWNjKTsJCQkjIDExCisJJnNocgkoImVieCIsMTYpOwkJCSMgMTUsMTQKKworCSZtb3Z6CSgkYWNjLCZIQigiZWF4IikpOwkJIyAgNQorCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGFjYywxKSk7CSMgIDUKKwkmc2hsCSgkYWNjLDgpOwkJCSMgIDUKKwkmb3IJKCJlY3giLCRhY2MpOwkJCSMgIDUKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgMTUKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRhY2MsMSkpOwkjIDE1CisJJnNobAkoJGFjYywyNCk7CQkJIyAxNQorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAxNQorCSZtb3ZkCSgibW0wIiwiZWN4Iik7CQkJIyB0WzBdIGNvbGxlY3RlZAorCisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICA0CisJJm1vdnoJKCJlY3giLCZCUCgtMTI4LCR0YmwsJGFjYywxKSk7CSMgIDQKKwkmbW92ZAkoImVheCIsIm1tMiIpOwkJCSMgIDcsIDYsIDMsIDIKKwkmbW92egkoJGFjYywmTEIoImVieCIpKTsJCSMgMTQKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRhY2MsMSkpOwkjIDE0CisJJnNobAkoJGFjYywxNik7CQkJIyAxNAorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAxNAorCisJJm1vdmQJKCJlYngiLCJtbTYiKTsJCQkjIDEzLDEyLCA5LCA4CisJJm1vdnoJKCRhY2MsJkhCKCJlYXgiKSk7CQkjICAzCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgMworCSZzaGwJKCRhY2MsMjQpOwkJCSMgIDMKKwkmb3IJKCJlY3giLCRhY2MpOwkJCSMgIDMKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgIDkKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRhY2MsMSkpOwkjICA5CisJJnNobAkoJGFjYyw4KTsJCQkjICA5CisJJm9yCSgiZWN4IiwkYWNjKTsJCQkjICA5CisJJm1vdmQJKCJtbTEiLCJlY3giKTsJCQkjIHRbMV0gY29sbGVjdGVkCisKKwkmbW92egkoJGFjYywmTEIoImVieCIpKTsJCSMgIDgKKwkmbW92egkoImVjeCIsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgOAorCSZzaHIJKCJlYngiLDE2KTsJCQkjIDEzLDEyCisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICAyCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgMgorCSZzaGwJKCRhY2MsMTYpOwkJCSMgIDIKKwkmb3IJKCJlY3giLCRhY2MpOwkJCSMgIDIKKwkmc2hyCSgiZWF4IiwxNik7CQkJIyAgNywgNgorCisJJnB1bnBja2xkcQkoIm1tMCIsIm1tMSIpOwkJIyB0WzAsMV0gY29sbGVjdGVkCisKKwkmbW92egkoJGFjYywmSEIoImVheCIpKTsJCSMgIDcKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRhY2MsMSkpOwkjICA3CisJJnNobAkoJGFjYywyNCk7CQkJIyAgNworCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAgNworCSZhbmQJKCJlYXgiLDB4ZmYpOwkJCSMgIDYKKwkmbW92egkoImVheCIsJkJQKC0xMjgsJHRibCwiZWF4IiwxKSk7CSMgIDYKKwkmc2hsCSgiZWF4IiwxNik7CQkJIyAgNgorCSZvcgkoImVkeCIsImVheCIpOwkJCSMgIDYKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgMTMKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRhY2MsMSkpOwkjIDEzCisJJnNobAkoJGFjYyw4KTsJCQkjIDEzCisJJm9yCSgiZWN4IiwkYWNjKTsJCQkjIDEzCisJJm1vdmQJKCJtbTQiLCJlY3giKTsJCQkjIHRbMl0gY29sbGVjdGVkCisJJmFuZAkoImVieCIsMHhmZik7CQkJIyAxMgorCSZtb3Z6CSgiZWJ4IiwmQlAoLTEyOCwkdGJsLCJlYngiLDEpKTsJIyAxMgorCSZvcgkoImVkeCIsImVieCIpOwkJCSMgMTIKKwkmbW92ZAkoIm1tNSIsImVkeCIpOwkJCSMgdFszXSBjb2xsZWN0ZWQKKworCSZwdW5wY2tsZHEJKCJtbTQiLCJtbTUiKTsJCSMgdFsyLDNdIGNvbGxlY3RlZAorfQorCisJCQkJCWlmICghJHg4Nm9ubHkpIHsKKyZmdW5jdGlvbl9iZWdpbl9CKCJfc3NlX0FFU19lbmNyeXB0X2NvbXBhY3QiKTsKKwkmcHhvcgkoIm1tMCIsJlFXUCgwLCRrZXkpKTsJIyAgNywgNiwgNSwgNCwgMywgMiwgMSwgMAorCSZweG9yCSgibW00IiwmUVdQKDgsJGtleSkpOwkjIDE1LDE0LDEzLDEyLDExLDEwLCA5LCA4CisKKwkjIG5vdGUgdGhhdCBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYWxsb2NhdGUgc3RhY2sgZnJhbWUgZm9yIG1lIQorCSZtb3YJKCRhY2MsJkRXUCgyNDAsJGtleSkpOwkJIyBsb2FkIGtleS0+cm91bmRzCisJJmxlYQkoJGFjYywmRFdQKC0yLCRhY2MsJGFjYykpOworCSZsZWEJKCRhY2MsJkRXUCgwLCRrZXksJGFjYyw4KSk7CisJJm1vdgkoJF9fZW5kLCRhY2MpOwkJCSMgZW5kIG9mIGtleSBzY2hlZHVsZQorCisJJm1vdgkoJHMwLDB4MWIxYjFiMWIpOwkJIyBtYWdpYyBjb25zdGFudAorCSZtb3YJKCZEV1AoOCwiZXNwIiksJHMwKTsKKwkmbW92CSgmRFdQKDEyLCJlc3AiKSwkczApOworCisJIyBwcmVmZXRjaCBUZTQKKwkmbW92CSgkczAsJkRXUCgwLTEyOCwkdGJsKSk7CisJJm1vdgkoJHMxLCZEV1AoMzItMTI4LCR0YmwpKTsKKwkmbW92CSgkczIsJkRXUCg2NC0xMjgsJHRibCkpOworCSZtb3YJKCRzMywmRFdQKDk2LTEyOCwkdGJsKSk7CisJJm1vdgkoJHMwLCZEV1AoMTI4LTEyOCwkdGJsKSk7CisJJm1vdgkoJHMxLCZEV1AoMTYwLTEyOCwkdGJsKSk7CisJJm1vdgkoJHMyLCZEV1AoMTkyLTEyOCwkdGJsKSk7CisJJm1vdgkoJHMzLCZEV1AoMjI0LTEyOCwkdGJsKSk7CisKKwkmc2V0X2xhYmVsKCJsb29wIiwxNik7CisJCSZzc2VfZW5jY29tcGFjdCgpOworCQkmYWRkCSgka2V5LDE2KTsKKwkJJmNtcAkoJGtleSwkX19lbmQpOworCQkmamEJKCZsYWJlbCgib3V0IikpOworCisJCSZtb3ZxCSgibW0yIiwmUVdQKDgsImVzcCIpKTsKKwkJJnB4b3IJKCJtbTMiLCJtbTMiKTsJCSZweG9yCSgibW03IiwibW03Iik7CisJCSZtb3ZxCSgibW0xIiwibW0wIik7CQkmbW92cQkoIm1tNSIsIm1tNCIpOwkjIHIwCisJCSZwY21wZ3RiKCJtbTMiLCJtbTAiKTsJCSZwY21wZ3RiKCJtbTciLCJtbTQiKTsKKwkJJnBhbmQJKCJtbTMiLCJtbTIiKTsJCSZwYW5kCSgibW03IiwibW0yIik7CisJCSZwc2h1ZncJKCJtbTIiLCJtbTAiLDB4YjEpOwkmcHNodWZ3CSgibW02IiwibW00IiwweGIxKTsjIFJPVEFURShyMCwxNikKKwkJJnBhZGRiCSgibW0wIiwibW0wIik7CQkmcGFkZGIJKCJtbTQiLCJtbTQiKTsKKwkJJnB4b3IJKCJtbTAiLCJtbTMiKTsJCSZweG9yCSgibW00IiwibW03Iik7CSMgPSByMgorCQkmcHNodWZ3CSgibW0zIiwibW0yIiwweGIxKTsJJnBzaHVmdwkoIm1tNyIsIm1tNiIsMHhiMSk7IyByMAorCQkmcHhvcgkoIm1tMSIsIm1tMCIpOwkJJnB4b3IJKCJtbTUiLCJtbTQiKTsJIyByMF5yMgorCQkmcHhvcgkoIm1tMCIsIm1tMiIpOwkJJnB4b3IJKCJtbTQiLCJtbTYiKTsJIyBePSBST1RBVEUocjAsMTYpCisKKwkJJm1vdnEJKCJtbTIiLCJtbTMiKTsJCSZtb3ZxCSgibW02IiwibW03Iik7CisJCSZwc2xsZAkoIm1tMyIsOCk7CQkmcHNsbGQJKCJtbTciLDgpOworCQkmcHNybGQJKCJtbTIiLDI0KTsJCSZwc3JsZAkoIm1tNiIsMjQpOworCQkmcHhvcgkoIm1tMCIsIm1tMyIpOwkJJnB4b3IJKCJtbTQiLCJtbTciKTsJIyBePSByMDw8OAorCQkmcHhvcgkoIm1tMCIsIm1tMiIpOwkJJnB4b3IJKCJtbTQiLCJtbTYiKTsJIyBePSByMD4+MjQKKworCQkmbW92cQkoIm1tMyIsIm1tMSIpOwkJJm1vdnEJKCJtbTciLCJtbTUiKTsKKwkJJm1vdnEJKCJtbTIiLCZRV1AoMCwka2V5KSk7CSZtb3ZxCSgibW02IiwmUVdQKDgsJGtleSkpOworCQkmcHNybGQJKCJtbTEiLDgpOwkJJnBzcmxkCSgibW01Iiw4KTsKKwkJJm1vdgkoJHMwLCZEV1AoMC0xMjgsJHRibCkpOworCQkmcHNsbGQJKCJtbTMiLDI0KTsJCSZwc2xsZAkoIm1tNyIsMjQpOworCQkmbW92CSgkczEsJkRXUCg2NC0xMjgsJHRibCkpOworCQkmcHhvcgkoIm1tMCIsIm1tMSIpOwkJJnB4b3IJKCJtbTQiLCJtbTUiKTsJIyBePSAocjJecjApPDw4CisJCSZtb3YJKCRzMiwmRFdQKDEyOC0xMjgsJHRibCkpOworCQkmcHhvcgkoIm1tMCIsIm1tMyIpOwkJJnB4b3IJKCJtbTQiLCJtbTciKTsJIyBePSAocjJecjApPj4yNAorCQkmbW92CSgkczMsJkRXUCgxOTItMTI4LCR0YmwpKTsKKworCQkmcHhvcgkoIm1tMCIsIm1tMiIpOwkJJnB4b3IJKCJtbTQiLCJtbTYiKTsKKwkmam1wCSgmbGFiZWwoImxvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJvdXQiLDE2KTsKKwkmcHhvcgkoIm1tMCIsJlFXUCgwLCRrZXkpKTsKKwkmcHhvcgkoIm1tNCIsJlFXUCg4LCRrZXkpKTsKKworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIl9zc2VfQUVTX2VuY3J5cHRfY29tcGFjdCIpOworCQkJCQl9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVmFuaWxsYSBibG9jayBmdW5jdGlvbi4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworc3ViIGVuY3N0ZXAoKQoreyBteSAoJGksJHRlLEBzKSA9IEBfOworICBteSAkdG1wID0gJGtleTsKKyAgbXkgJG91dCA9ICRpPT0zPyRzWzBdOiRhY2M7CisKKwkjIGxpbmVzIG1hcmtlZCB3aXRoICMlZT94W2ldIGRlbm90ZSAicmVvcmRlcmVkIiBpbnN0cnVjdGlvbnMuLi4KKwlpZiAoJGk9PTMpICB7CSZtb3YJKCRrZXksJF9fa2V5KTsJCQl9IyMlZWR4CisJZWxzZSAgICAgICAgewkmbW92CSgkb3V0LCRzWzBdKTsKKwkJCSZhbmQJKCRvdXQsMHhGRik7CQkJfQorCWlmICgkaT09MSkgIHsJJnNocgkoJHNbMF0sMTYpOwkJCX0jJWVieFsxXQorCWlmICgkaT09MikgIHsJJnNocgkoJHNbMF0sMjQpOwkJCX0jJWVjeFsyXQorCQkJJm1vdgkoJG91dCwmRFdQKDAsJHRlLCRvdXQsOCkpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzFdOwkJCQl9IyMlZWF4CisJCQkmbW92egkoJHRtcCwmSEIoJHNbMV0pKTsKKwkJCSZ4b3IJKCRvdXQsJkRXUCgzLCR0ZSwkdG1wLDgpKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1syXTsgJm1vdiAoJHNbMV0sJF9fczApOwkJfSMjJWVieAorCWVsc2UgICAgICAgIHsJJm1vdgkoJHRtcCwkc1syXSk7CisJCQkmc2hyCSgkdG1wLDE2KTsJCQl9CisJaWYgKCRpPT0yKSAgewkmYW5kCSgkc1sxXSwweEZGKTsJCQl9IyVlZHhbMl0KKwkJCSZhbmQJKCR0bXAsMHhGRik7CisJCQkmeG9yCSgkb3V0LCZEV1AoMiwkdGUsJHRtcCw4KSk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbM107ICZtb3YgKCRzWzJdLCRfX3MxKTsJCX0jIyVlY3gKKwllbHNpZigkaT09Mil7CSZtb3Z6CSgkdG1wLCZIQigkc1szXSkpOwkJfSMlZWJ4WzJdCisJZWxzZSAgICAgICAgewkmbW92CSgkdG1wLCRzWzNdKTsgCisJCQkmc2hyCSgkdG1wLDI0KQkJCX0KKwkJCSZ4b3IJKCRvdXQsJkRXUCgxLCR0ZSwkdG1wLDgpKTsKKwlpZiAoJGk8MikgICB7CSZtb3YJKCZEV1AoNCs0KiRpLCJlc3AiKSwkb3V0KTsJfQorCWlmICgkaT09MykgIHsJJm1vdgkoJHNbM10sJGFjYyk7CQkJfQorCQkJJmNvbW1lbnQoKTsKK30KKworc3ViIGVuY2xhc3QoKQoreyBteSAoJGksJHRlLEBzKT1AXzsKKyAgbXkgJHRtcCA9ICRrZXk7CisgIG15ICRvdXQgPSAkaT09Mz8kc1swXTokYWNjOworCisJaWYgKCRpPT0zKSAgewkmbW92CSgka2V5LCRfX2tleSk7CQkJfSMjJWVkeAorCWVsc2UgICAgICAgIHsJJm1vdgkoJG91dCwkc1swXSk7CQkJfQorCQkJJmFuZAkoJG91dCwweEZGKTsKKwlpZiAoJGk9PTEpICB7CSZzaHIJKCRzWzBdLDE2KTsJCQl9IyVlYnhbMV0KKwlpZiAoJGk9PTIpICB7CSZzaHIJKCRzWzBdLDI0KTsJCQl9IyVlY3hbMl0KKwkJCSZtb3YJKCRvdXQsJkRXUCgyLCR0ZSwkb3V0LDgpKTsKKwkJCSZhbmQJKCRvdXQsMHgwMDAwMDBmZik7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbMV07CQkJCX0jIyVlYXgKKwkJCSZtb3Z6CSgkdG1wLCZIQigkc1sxXSkpOworCQkJJm1vdgkoJHRtcCwmRFdQKDAsJHRlLCR0bXAsOCkpOworCQkJJmFuZAkoJHRtcCwweDAwMDBmZjAwKTsKKwkJCSZ4b3IJKCRvdXQsJHRtcCk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbMl07ICZtb3YgKCRzWzFdLCRfX3MwKTsJCX0jIyVlYngKKwllbHNlICAgICAgICB7CSZtb3YJKCR0bXAsJHNbMl0pOworCQkJJnNocgkoJHRtcCwxNik7CQkJfQorCWlmICgkaT09MikgIHsJJmFuZAkoJHNbMV0sMHhGRik7CQkJfSMlZWR4WzJdCisJCQkmYW5kCSgkdG1wLDB4RkYpOworCQkJJm1vdgkoJHRtcCwmRFdQKDAsJHRlLCR0bXAsOCkpOworCQkJJmFuZAkoJHRtcCwweDAwZmYwMDAwKTsKKwkJCSZ4b3IJKCRvdXQsJHRtcCk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbM107ICZtb3YgKCRzWzJdLCRfX3MxKTsJCX0jIyVlY3gKKwllbHNpZigkaT09Mil7CSZtb3Z6CSgkdG1wLCZIQigkc1szXSkpOwkJfSMlZWJ4WzJdCisJZWxzZSAgICAgICAgewkmbW92CSgkdG1wLCRzWzNdKTsKKwkJCSZzaHIJKCR0bXAsMjQpOwkJCX0KKwkJCSZtb3YJKCR0bXAsJkRXUCgyLCR0ZSwkdG1wLDgpKTsKKwkJCSZhbmQJKCR0bXAsMHhmZjAwMDAwMCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCWlmICgkaTwyKSAgIHsJJm1vdgkoJkRXUCg0KzQqJGksImVzcCIpLCRvdXQpOwl9CisJaWYgKCRpPT0zKSAgewkmbW92CSgkc1szXSwkYWNjKTsJCQl9Cit9CisKKyZmdW5jdGlvbl9iZWdpbl9CKCJfeDg2X0FFU19lbmNyeXB0Iik7CisJaWYgKCR2ZXJ0aWNhbF9zcGluKSB7CisJCSMgSSBuZWVkIGhpZ2ggcGFydHMgb2Ygdm9sYXRpbGUgcmVnaXN0ZXJzIHRvIGJlIGFjY2Vzc2libGUuLi4KKwkJJmV4Y2gJKCRzMT0iZWRpIiwka2V5PSJlYngiKTsKKwkJJm1vdgkoJHMyPSJlc2kiLCRhY2M9ImVjeCIpOworCX0KKworCSMgbm90ZSB0aGF0IGNhbGxlciBpcyBleHBlY3RlZCB0byBhbGxvY2F0ZSBzdGFjayBmcmFtZSBmb3IgbWUhCisJJm1vdgkoJF9fa2V5LCRrZXkpOwkJCSMgc2F2ZSBrZXkKKworCSZ4b3IJKCRzMCwmRFdQKDAsJGtleSkpOwkJIyB4b3Igd2l0aCBrZXkKKwkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmbW92CSgkYWNjLCZEV1AoMjQwLCRrZXkpKTsJCSMgbG9hZCBrZXktPnJvdW5kcworCisJaWYgKCRzbWFsbF9mb290cHJpbnQpIHsKKwkgICAgJmxlYQkoJGFjYywmRFdQKC0yLCRhY2MsJGFjYykpOworCSAgICAmbGVhCSgkYWNjLCZEV1AoMCwka2V5LCRhY2MsOCkpOworCSAgICAmbW92CSgkX19lbmQsJGFjYyk7CQkjIGVuZCBvZiBrZXkgc2NoZWR1bGUKKworCSAgICAmc2V0X2xhYmVsKCJsb29wIiwxNik7CisJCWlmICgkdmVydGljYWxfc3BpbikgeworCQkgICAgJmVuY3ZlcnQoJHRibCwkczAsJHMxLCRzMiwkczMpOworCQl9IGVsc2UgeworCQkgICAgJmVuY3N0ZXAoMCwkdGJsLCRzMCwkczEsJHMyLCRzMyk7CisJCSAgICAmZW5jc3RlcCgxLCR0YmwsJHMxLCRzMiwkczMsJHMwKTsKKwkJICAgICZlbmNzdGVwKDIsJHRibCwkczIsJHMzLCRzMCwkczEpOworCQkgICAgJmVuY3N0ZXAoMywkdGJsLCRzMywkczAsJHMxLCRzMik7CisJCX0KKwkJJmFkZAkoJGtleSwxNik7CQkjIGFkdmFuY2UgcmRfa2V5CisJCSZ4b3IJKCRzMCwmRFdQKDAsJGtleSkpOworCQkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkJJnhvcgkoJHMyLCZEV1AoOCwka2V5KSk7CisJCSZ4b3IJKCRzMywmRFdQKDEyLCRrZXkpKTsKKwkgICAgJmNtcAkoJGtleSwkX19lbmQpOworCSAgICAmbW92CSgkX19rZXksJGtleSk7CisJICAgICZqYgkJKCZsYWJlbCgibG9vcCIpKTsKKwl9CisJZWxzZSB7CisJICAgICZjbXAJKCRhY2MsMTApOworCSAgICAmamxlCSgmbGFiZWwoIjEwcm91bmRzIikpOworCSAgICAmY21wCSgkYWNjLDEyKTsKKwkgICAgJmpsZQkoJmxhYmVsKCIxMnJvdW5kcyIpKTsKKworCSZzZXRfbGFiZWwoIjE0cm91bmRzIiw0KTsKKwkgICAgZm9yICgkaT0xOyRpPDM7JGkrKykgeworCQlpZiAoJHZlcnRpY2FsX3NwaW4pIHsKKwkJICAgICZlbmN2ZXJ0KCR0YmwsJHMwLCRzMSwkczIsJHMzKTsKKwkJfSBlbHNlIHsKKwkJICAgICZlbmNzdGVwKDAsJHRibCwkczAsJHMxLCRzMiwkczMpOworCQkgICAgJmVuY3N0ZXAoMSwkdGJsLCRzMSwkczIsJHMzLCRzMCk7CisJCSAgICAmZW5jc3RlcCgyLCR0YmwsJHMyLCRzMywkczAsJHMxKTsKKwkJICAgICZlbmNzdGVwKDMsJHRibCwkczMsJHMwLCRzMSwkczIpOworCQl9CisJCSZ4b3IJKCRzMCwmRFdQKDE2KiRpKzAsJGtleSkpOworCQkmeG9yCSgkczEsJkRXUCgxNiokaSs0LCRrZXkpKTsKKwkJJnhvcgkoJHMyLCZEV1AoMTYqJGkrOCwka2V5KSk7CisJCSZ4b3IJKCRzMywmRFdQKDE2KiRpKzEyLCRrZXkpKTsKKwkgICAgfQorCSAgICAmYWRkCSgka2V5LDMyKTsKKwkgICAgJm1vdgkoJF9fa2V5LCRrZXkpOwkJIyBhZHZhbmNlIHJkX2tleQorCSZzZXRfbGFiZWwoIjEycm91bmRzIiw0KTsKKwkgICAgZm9yICgkaT0xOyRpPDM7JGkrKykgeworCQlpZiAoJHZlcnRpY2FsX3NwaW4pIHsKKwkJICAgICZlbmN2ZXJ0KCR0YmwsJHMwLCRzMSwkczIsJHMzKTsKKwkJfSBlbHNlIHsKKwkJICAgICZlbmNzdGVwKDAsJHRibCwkczAsJHMxLCRzMiwkczMpOworCQkgICAgJmVuY3N0ZXAoMSwkdGJsLCRzMSwkczIsJHMzLCRzMCk7CisJCSAgICAmZW5jc3RlcCgyLCR0YmwsJHMyLCRzMywkczAsJHMxKTsKKwkJICAgICZlbmNzdGVwKDMsJHRibCwkczMsJHMwLCRzMSwkczIpOworCQl9CisJCSZ4b3IJKCRzMCwmRFdQKDE2KiRpKzAsJGtleSkpOworCQkmeG9yCSgkczEsJkRXUCgxNiokaSs0LCRrZXkpKTsKKwkJJnhvcgkoJHMyLCZEV1AoMTYqJGkrOCwka2V5KSk7CisJCSZ4b3IJKCRzMywmRFdQKDE2KiRpKzEyLCRrZXkpKTsKKwkgICAgfQorCSAgICAmYWRkCSgka2V5LDMyKTsKKwkgICAgJm1vdgkoJF9fa2V5LCRrZXkpOwkJIyBhZHZhbmNlIHJkX2tleQorCSZzZXRfbGFiZWwoIjEwcm91bmRzIiw0KTsKKwkgICAgZm9yICgkaT0xOyRpPDEwOyRpKyspIHsKKwkJaWYgKCR2ZXJ0aWNhbF9zcGluKSB7CisJCSAgICAmZW5jdmVydCgkdGJsLCRzMCwkczEsJHMyLCRzMyk7CisJCX0gZWxzZSB7CisJCSAgICAmZW5jc3RlcCgwLCR0YmwsJHMwLCRzMSwkczIsJHMzKTsKKwkJICAgICZlbmNzdGVwKDEsJHRibCwkczEsJHMyLCRzMywkczApOworCQkgICAgJmVuY3N0ZXAoMiwkdGJsLCRzMiwkczMsJHMwLCRzMSk7CisJCSAgICAmZW5jc3RlcCgzLCR0YmwsJHMzLCRzMCwkczEsJHMyKTsKKwkJfQorCQkmeG9yCSgkczAsJkRXUCgxNiokaSswLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoMTYqJGkrNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDE2KiRpKzgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxNiokaSsxMiwka2V5KSk7CisJICAgIH0KKwl9CisKKwlpZiAoJHZlcnRpY2FsX3NwaW4pIHsKKwkgICAgIyAicmVpbmNhcm5hdGUiIHNvbWUgcmVnaXN0ZXJzIGZvciAiaG9yaXpvbnRhbCIgc3Bpbi4uLgorCSAgICAmbW92CSgkczE9ImVieCIsJGtleT0iZWRpIik7CisJICAgICZtb3YJKCRzMj0iZWN4IiwkYWNjPSJlc2kiKTsKKwl9CisJJmVuY2xhc3QoMCwkdGJsLCRzMCwkczEsJHMyLCRzMyk7CisJJmVuY2xhc3QoMSwkdGJsLCRzMSwkczIsJHMzLCRzMCk7CisJJmVuY2xhc3QoMiwkdGJsLCRzMiwkczMsJHMwLCRzMSk7CisJJmVuY2xhc3QoMywkdGJsLCRzMywkczAsJHMxLCRzMik7CisKKwkmYWRkCSgka2V5LCRzbWFsbF9mb290cHJpbnQ/MTY6MTYwKTsKKwkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsKKwkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmcmV0CSgpOworCismc2V0X2xhYmVsKCJBRVNfVGUiLDY0KTsJIyBZZXMhIEkga2VlcCBpdCBpbiB0aGUgY29kZSBzZWdtZW50IQorCSZfZGF0YV93b3JkKDB4YTU2MzYzYzYsIDB4ODQ3YzdjZjgsIDB4OTk3Nzc3ZWUsIDB4OGQ3YjdiZjYpOworCSZfZGF0YV93b3JkKDB4MGRmMmYyZmYsIDB4YmQ2YjZiZDYsIDB4YjE2ZjZmZGUsIDB4NTRjNWM1OTEpOworCSZfZGF0YV93b3JkKDB4NTAzMDMwNjAsIDB4MDMwMTAxMDIsIDB4YTk2NzY3Y2UsIDB4N2QyYjJiNTYpOworCSZfZGF0YV93b3JkKDB4MTlmZWZlZTcsIDB4NjJkN2Q3YjUsIDB4ZTZhYmFiNGQsIDB4OWE3Njc2ZWMpOworCSZfZGF0YV93b3JkKDB4NDVjYWNhOGYsIDB4OWQ4MjgyMWYsIDB4NDBjOWM5ODksIDB4ODc3ZDdkZmEpOworCSZfZGF0YV93b3JkKDB4MTVmYWZhZWYsIDB4ZWI1OTU5YjIsIDB4Yzk0NzQ3OGUsIDB4MGJmMGYwZmIpOworCSZfZGF0YV93b3JkKDB4ZWNhZGFkNDEsIDB4NjdkNGQ0YjMsIDB4ZmRhMmEyNWYsIDB4ZWFhZmFmNDUpOworCSZfZGF0YV93b3JkKDB4YmY5YzljMjMsIDB4ZjdhNGE0NTMsIDB4OTY3MjcyZTQsIDB4NWJjMGMwOWIpOworCSZfZGF0YV93b3JkKDB4YzJiN2I3NzUsIDB4MWNmZGZkZTEsIDB4YWU5MzkzM2QsIDB4NmEyNjI2NGMpOworCSZfZGF0YV93b3JkKDB4NWEzNjM2NmMsIDB4NDEzZjNmN2UsIDB4MDJmN2Y3ZjUsIDB4NGZjY2NjODMpOworCSZfZGF0YV93b3JkKDB4NWMzNDM0NjgsIDB4ZjRhNWE1NTEsIDB4MzRlNWU1ZDEsIDB4MDhmMWYxZjkpOworCSZfZGF0YV93b3JkKDB4OTM3MTcxZTIsIDB4NzNkOGQ4YWIsIDB4NTMzMTMxNjIsIDB4M2YxNTE1MmEpOworCSZfZGF0YV93b3JkKDB4MGMwNDA0MDgsIDB4NTJjN2M3OTUsIDB4NjUyMzIzNDYsIDB4NWVjM2MzOWQpOworCSZfZGF0YV93b3JkKDB4MjgxODE4MzAsIDB4YTE5Njk2MzcsIDB4MGYwNTA1MGEsIDB4YjU5YTlhMmYpOworCSZfZGF0YV93b3JkKDB4MDkwNzA3MGUsIDB4MzYxMjEyMjQsIDB4OWI4MDgwMWIsIDB4M2RlMmUyZGYpOworCSZfZGF0YV93b3JkKDB4MjZlYmViY2QsIDB4NjkyNzI3NGUsIDB4Y2RiMmIyN2YsIDB4OWY3NTc1ZWEpOworCSZfZGF0YV93b3JkKDB4MWIwOTA5MTIsIDB4OWU4MzgzMWQsIDB4NzQyYzJjNTgsIDB4MmUxYTFhMzQpOworCSZfZGF0YV93b3JkKDB4MmQxYjFiMzYsIDB4YjI2ZTZlZGMsIDB4ZWU1YTVhYjQsIDB4ZmJhMGEwNWIpOworCSZfZGF0YV93b3JkKDB4ZjY1MjUyYTQsIDB4NGQzYjNiNzYsIDB4NjFkNmQ2YjcsIDB4Y2ViM2IzN2QpOworCSZfZGF0YV93b3JkKDB4N2IyOTI5NTIsIDB4M2VlM2UzZGQsIDB4NzEyZjJmNWUsIDB4OTc4NDg0MTMpOworCSZfZGF0YV93b3JkKDB4ZjU1MzUzYTYsIDB4NjhkMWQxYjksIDB4MDAwMDAwMDAsIDB4MmNlZGVkYzEpOworCSZfZGF0YV93b3JkKDB4NjAyMDIwNDAsIDB4MWZmY2ZjZTMsIDB4YzhiMWIxNzksIDB4ZWQ1YjViYjYpOworCSZfZGF0YV93b3JkKDB4YmU2YTZhZDQsIDB4NDZjYmNiOGQsIDB4ZDliZWJlNjcsIDB4NGIzOTM5NzIpOworCSZfZGF0YV93b3JkKDB4ZGU0YTRhOTQsIDB4ZDQ0YzRjOTgsIDB4ZTg1ODU4YjAsIDB4NGFjZmNmODUpOworCSZfZGF0YV93b3JkKDB4NmJkMGQwYmIsIDB4MmFlZmVmYzUsIDB4ZTVhYWFhNGYsIDB4MTZmYmZiZWQpOworCSZfZGF0YV93b3JkKDB4YzU0MzQzODYsIDB4ZDc0ZDRkOWEsIDB4NTUzMzMzNjYsIDB4OTQ4NTg1MTEpOworCSZfZGF0YV93b3JkKDB4Y2Y0NTQ1OGEsIDB4MTBmOWY5ZTksIDB4MDYwMjAyMDQsIDB4ODE3ZjdmZmUpOworCSZfZGF0YV93b3JkKDB4ZjA1MDUwYTAsIDB4NDQzYzNjNzgsIDB4YmE5ZjlmMjUsIDB4ZTNhOGE4NGIpOworCSZfZGF0YV93b3JkKDB4ZjM1MTUxYTIsIDB4ZmVhM2EzNWQsIDB4YzA0MDQwODAsIDB4OGE4ZjhmMDUpOworCSZfZGF0YV93b3JkKDB4YWQ5MjkyM2YsIDB4YmM5ZDlkMjEsIDB4NDgzODM4NzAsIDB4MDRmNWY1ZjEpOworCSZfZGF0YV93b3JkKDB4ZGZiY2JjNjMsIDB4YzFiNmI2NzcsIDB4NzVkYWRhYWYsIDB4NjMyMTIxNDIpOworCSZfZGF0YV93b3JkKDB4MzAxMDEwMjAsIDB4MWFmZmZmZTUsIDB4MGVmM2YzZmQsIDB4NmRkMmQyYmYpOworCSZfZGF0YV93b3JkKDB4NGNjZGNkODEsIDB4MTQwYzBjMTgsIDB4MzUxMzEzMjYsIDB4MmZlY2VjYzMpOworCSZfZGF0YV93b3JkKDB4ZTE1ZjVmYmUsIDB4YTI5Nzk3MzUsIDB4Y2M0NDQ0ODgsIDB4MzkxNzE3MmUpOworCSZfZGF0YV93b3JkKDB4NTdjNGM0OTMsIDB4ZjJhN2E3NTUsIDB4ODI3ZTdlZmMsIDB4NDczZDNkN2EpOworCSZfZGF0YV93b3JkKDB4YWM2NDY0YzgsIDB4ZTc1ZDVkYmEsIDB4MmIxOTE5MzIsIDB4OTU3MzczZTYpOworCSZfZGF0YV93b3JkKDB4YTA2MDYwYzAsIDB4OTg4MTgxMTksIDB4ZDE0ZjRmOWUsIDB4N2ZkY2RjYTMpOworCSZfZGF0YV93b3JkKDB4NjYyMjIyNDQsIDB4N2UyYTJhNTQsIDB4YWI5MDkwM2IsIDB4ODM4ODg4MGIpOworCSZfZGF0YV93b3JkKDB4Y2E0NjQ2OGMsIDB4MjllZWVlYzcsIDB4ZDNiOGI4NmIsIDB4M2MxNDE0MjgpOworCSZfZGF0YV93b3JkKDB4NzlkZWRlYTcsIDB4ZTI1ZTVlYmMsIDB4MWQwYjBiMTYsIDB4NzZkYmRiYWQpOworCSZfZGF0YV93b3JkKDB4M2JlMGUwZGIsIDB4NTYzMjMyNjQsIDB4NGUzYTNhNzQsIDB4MWUwYTBhMTQpOworCSZfZGF0YV93b3JkKDB4ZGI0OTQ5OTIsIDB4MGEwNjA2MGMsIDB4NmMyNDI0NDgsIDB4ZTQ1YzVjYjgpOworCSZfZGF0YV93b3JkKDB4NWRjMmMyOWYsIDB4NmVkM2QzYmQsIDB4ZWZhY2FjNDMsIDB4YTY2MjYyYzQpOworCSZfZGF0YV93b3JkKDB4YTg5MTkxMzksIDB4YTQ5NTk1MzEsIDB4MzdlNGU0ZDMsIDB4OGI3OTc5ZjIpOworCSZfZGF0YV93b3JkKDB4MzJlN2U3ZDUsIDB4NDNjOGM4OGIsIDB4NTkzNzM3NmUsIDB4Yjc2ZDZkZGEpOworCSZfZGF0YV93b3JkKDB4OGM4ZDhkMDEsIDB4NjRkNWQ1YjEsIDB4ZDI0ZTRlOWMsIDB4ZTBhOWE5NDkpOworCSZfZGF0YV93b3JkKDB4YjQ2YzZjZDgsIDB4ZmE1NjU2YWMsIDB4MDdmNGY0ZjMsIDB4MjVlYWVhY2YpOworCSZfZGF0YV93b3JkKDB4YWY2NTY1Y2EsIDB4OGU3YTdhZjQsIDB4ZTlhZWFlNDcsIDB4MTgwODA4MTApOworCSZfZGF0YV93b3JkKDB4ZDViYWJhNmYsIDB4ODg3ODc4ZjAsIDB4NmYyNTI1NGEsIDB4NzIyZTJlNWMpOworCSZfZGF0YV93b3JkKDB4MjQxYzFjMzgsIDB4ZjFhNmE2NTcsIDB4YzdiNGI0NzMsIDB4NTFjNmM2OTcpOworCSZfZGF0YV93b3JkKDB4MjNlOGU4Y2IsIDB4N2NkZGRkYTEsIDB4OWM3NDc0ZTgsIDB4MjExZjFmM2UpOworCSZfZGF0YV93b3JkKDB4ZGQ0YjRiOTYsIDB4ZGNiZGJkNjEsIDB4ODY4YjhiMGQsIDB4ODU4YThhMGYpOworCSZfZGF0YV93b3JkKDB4OTA3MDcwZTAsIDB4NDIzZTNlN2MsIDB4YzRiNWI1NzEsIDB4YWE2NjY2Y2MpOworCSZfZGF0YV93b3JkKDB4ZDg0ODQ4OTAsIDB4MDUwMzAzMDYsIDB4MDFmNmY2ZjcsIDB4MTIwZTBlMWMpOworCSZfZGF0YV93b3JkKDB4YTM2MTYxYzIsIDB4NWYzNTM1NmEsIDB4Zjk1NzU3YWUsIDB4ZDBiOWI5NjkpOworCSZfZGF0YV93b3JkKDB4OTE4Njg2MTcsIDB4NThjMWMxOTksIDB4MjcxZDFkM2EsIDB4Yjk5ZTllMjcpOworCSZfZGF0YV93b3JkKDB4MzhlMWUxZDksIDB4MTNmOGY4ZWIsIDB4YjM5ODk4MmIsIDB4MzMxMTExMjIpOworCSZfZGF0YV93b3JkKDB4YmI2OTY5ZDIsIDB4NzBkOWQ5YTksIDB4ODk4ZThlMDcsIDB4YTc5NDk0MzMpOworCSZfZGF0YV93b3JkKDB4YjY5YjliMmQsIDB4MjIxZTFlM2MsIDB4OTI4Nzg3MTUsIDB4MjBlOWU5YzkpOworCSZfZGF0YV93b3JkKDB4NDljZWNlODcsIDB4ZmY1NTU1YWEsIDB4NzgyODI4NTAsIDB4N2FkZmRmYTUpOworCSZfZGF0YV93b3JkKDB4OGY4YzhjMDMsIDB4ZjhhMWExNTksIDB4ODA4OTg5MDksIDB4MTcwZDBkMWEpOworCSZfZGF0YV93b3JkKDB4ZGFiZmJmNjUsIDB4MzFlNmU2ZDcsIDB4YzY0MjQyODQsIDB4Yjg2ODY4ZDApOworCSZfZGF0YV93b3JkKDB4YzM0MTQxODIsIDB4YjA5OTk5MjksIDB4NzcyZDJkNWEsIDB4MTEwZjBmMWUpOworCSZfZGF0YV93b3JkKDB4Y2JiMGIwN2IsIDB4ZmM1NDU0YTgsIDB4ZDZiYmJiNmQsIDB4M2ExNjE2MmMpOworCisjVGU0CSMgZm91ciBjb3BpZXMgb2YgVGU0IHRvIGNob29zZSBmcm9tIHRvIGF2b2lkIEwxIGFsaWFzaW5nCisJJmRhdGFfYnl0ZSgweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1KTsKKwkmZGF0YV9ieXRlKDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYpOworCSZkYXRhX2J5dGUoMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCk7CisJJmRhdGFfYnl0ZSgweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwKTsKKwkmZGF0YV9ieXRlKDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MpOworCSZkYXRhX2J5dGUoMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSk7CisJJmRhdGFfYnl0ZSgweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhKTsKKwkmZGF0YV9ieXRlKDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUpOworCSZkYXRhX2J5dGUoMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCk7CisJJmRhdGFfYnl0ZSgweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIpOworCSZkYXRhX2J5dGUoMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZik7CisJJmRhdGFfYnl0ZSgweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgpOworCSZkYXRhX2J5dGUoMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSk7CisJJmRhdGFfYnl0ZSgweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyKTsKKwkmZGF0YV9ieXRlKDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcpOworCSZkYXRhX2J5dGUoMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4KTsKKwkmZGF0YV9ieXRlKDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIpOworCSZkYXRhX2J5dGUoMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1Yyk7CisJJmRhdGFfYnl0ZSgweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5KTsKKwkmZGF0YV9ieXRlKDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkpOworCSZkYXRhX2J5dGUoMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCk7CisJJmRhdGFfYnl0ZSgweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2KTsKKwkmZGF0YV9ieXRlKDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEpOworCSZkYXRhX2J5dGUoMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSk7CisJJmRhdGFfYnl0ZSgweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllKTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQpOworCSZkYXRhX2J5dGUoMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZik7CisJJmRhdGFfYnl0ZSgweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4KTsKKwkmZGF0YV9ieXRlKDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYpOworCisJJmRhdGFfYnl0ZSgweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1KTsKKwkmZGF0YV9ieXRlKDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYpOworCSZkYXRhX2J5dGUoMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCk7CisJJmRhdGFfYnl0ZSgweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwKTsKKwkmZGF0YV9ieXRlKDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MpOworCSZkYXRhX2J5dGUoMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSk7CisJJmRhdGFfYnl0ZSgweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhKTsKKwkmZGF0YV9ieXRlKDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUpOworCSZkYXRhX2J5dGUoMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCk7CisJJmRhdGFfYnl0ZSgweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIpOworCSZkYXRhX2J5dGUoMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZik7CisJJmRhdGFfYnl0ZSgweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgpOworCSZkYXRhX2J5dGUoMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSk7CisJJmRhdGFfYnl0ZSgweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyKTsKKwkmZGF0YV9ieXRlKDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcpOworCSZkYXRhX2J5dGUoMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4KTsKKwkmZGF0YV9ieXRlKDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIpOworCSZkYXRhX2J5dGUoMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1Yyk7CisJJmRhdGFfYnl0ZSgweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5KTsKKwkmZGF0YV9ieXRlKDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkpOworCSZkYXRhX2J5dGUoMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCk7CisJJmRhdGFfYnl0ZSgweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2KTsKKwkmZGF0YV9ieXRlKDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEpOworCSZkYXRhX2J5dGUoMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSk7CisJJmRhdGFfYnl0ZSgweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllKTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQpOworCSZkYXRhX2J5dGUoMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZik7CisJJmRhdGFfYnl0ZSgweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4KTsKKwkmZGF0YV9ieXRlKDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYpOworCisJJmRhdGFfYnl0ZSgweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1KTsKKwkmZGF0YV9ieXRlKDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYpOworCSZkYXRhX2J5dGUoMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCk7CisJJmRhdGFfYnl0ZSgweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwKTsKKwkmZGF0YV9ieXRlKDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MpOworCSZkYXRhX2J5dGUoMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSk7CisJJmRhdGFfYnl0ZSgweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhKTsKKwkmZGF0YV9ieXRlKDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUpOworCSZkYXRhX2J5dGUoMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCk7CisJJmRhdGFfYnl0ZSgweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIpOworCSZkYXRhX2J5dGUoMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZik7CisJJmRhdGFfYnl0ZSgweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgpOworCSZkYXRhX2J5dGUoMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSk7CisJJmRhdGFfYnl0ZSgweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyKTsKKwkmZGF0YV9ieXRlKDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcpOworCSZkYXRhX2J5dGUoMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4KTsKKwkmZGF0YV9ieXRlKDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIpOworCSZkYXRhX2J5dGUoMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1Yyk7CisJJmRhdGFfYnl0ZSgweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5KTsKKwkmZGF0YV9ieXRlKDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkpOworCSZkYXRhX2J5dGUoMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCk7CisJJmRhdGFfYnl0ZSgweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2KTsKKwkmZGF0YV9ieXRlKDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEpOworCSZkYXRhX2J5dGUoMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSk7CisJJmRhdGFfYnl0ZSgweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllKTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQpOworCSZkYXRhX2J5dGUoMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZik7CisJJmRhdGFfYnl0ZSgweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4KTsKKwkmZGF0YV9ieXRlKDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYpOworCisJJmRhdGFfYnl0ZSgweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1KTsKKwkmZGF0YV9ieXRlKDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYpOworCSZkYXRhX2J5dGUoMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCk7CisJJmRhdGFfYnl0ZSgweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwKTsKKwkmZGF0YV9ieXRlKDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MpOworCSZkYXRhX2J5dGUoMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSk7CisJJmRhdGFfYnl0ZSgweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhKTsKKwkmZGF0YV9ieXRlKDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUpOworCSZkYXRhX2J5dGUoMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCk7CisJJmRhdGFfYnl0ZSgweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIpOworCSZkYXRhX2J5dGUoMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZik7CisJJmRhdGFfYnl0ZSgweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgpOworCSZkYXRhX2J5dGUoMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSk7CisJJmRhdGFfYnl0ZSgweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyKTsKKwkmZGF0YV9ieXRlKDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcpOworCSZkYXRhX2J5dGUoMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4KTsKKwkmZGF0YV9ieXRlKDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIpOworCSZkYXRhX2J5dGUoMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1Yyk7CisJJmRhdGFfYnl0ZSgweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5KTsKKwkmZGF0YV9ieXRlKDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkpOworCSZkYXRhX2J5dGUoMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCk7CisJJmRhdGFfYnl0ZSgweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2KTsKKwkmZGF0YV9ieXRlKDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEpOworCSZkYXRhX2J5dGUoMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSk7CisJJmRhdGFfYnl0ZSgweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllKTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQpOworCSZkYXRhX2J5dGUoMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZik7CisJJmRhdGFfYnl0ZSgweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4KTsKKwkmZGF0YV9ieXRlKDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYpOworI3Jjb246CisJJmRhdGFfd29yZCgweDAwMDAwMDAxLCAweDAwMDAwMDAyLCAweDAwMDAwMDA0LCAweDAwMDAwMDA4KTsKKwkmZGF0YV93b3JkKDB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwODApOworCSZkYXRhX3dvcmQoMHgwMDAwMDAxYiwgMHgwMDAwMDAzNiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwKTsKKyZmdW5jdGlvbl9lbmRfQigiX3g4Nl9BRVNfZW5jcnlwdCIpOworCisjIHZvaWQgQUVTX2VuY3J5cHQgKGNvbnN0IHZvaWQgKmlucCx2b2lkICpvdXQsY29uc3QgQUVTX0tFWSAqa2V5KTsKKyZmdW5jdGlvbl9iZWdpbigiQUVTX2VuY3J5cHQiKTsKKwkmbW92CSgkYWNjLCZ3cGFyYW0oMCkpOwkJIyBsb2FkIGlucAorCSZtb3YJKCRrZXksJndwYXJhbSgyKSk7CQkjIGxvYWQga2V5CisKKwkmbW92CSgkczAsImVzcCIpOworCSZzdWIJKCJlc3AiLDM2KTsKKwkmYW5kCSgiZXNwIiwtNjQpOwkJCSMgYWxpZ24gdG8gY2FjaGUtbGluZQorCisJIyBwbGFjZSBzdGFjayBmcmFtZSBqdXN0ICJhYm92ZSIgdGhlIGtleSBzY2hlZHVsZQorCSZsZWEJKCRzMSwmRFdQKC02NC02Mywka2V5KSk7CisJJnN1YgkoJHMxLCJlc3AiKTsKKwkmbmVnCSgkczEpOworCSZhbmQJKCRzMSwweDNDMCk7CSMgbW9kdWxvIDEwMjQsIGJ1dCBhbGlnbmVkIHRvIGNhY2hlLWxpbmUKKwkmc3ViCSgiZXNwIiwkczEpOworCSZhZGQJKCJlc3AiLDQpOwkjIDQgaXMgcmVzZXJ2ZWQgZm9yIGNhbGxlcidzIHJldHVybiBhZGRyZXNzCisJJm1vdgkoJF9lc3AsJHMwKTsJCQkjIHNhdmUgc3RhY2sgcG9pbnRlcgorCisJJmNhbGwgICAoJmxhYmVsKCJwaWNfcG9pbnQiKSk7ICAgICAgICAgICMgbWFrZSBpdCBQSUMhCisJJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCR0YmwpOworCSZwaWNtZXVwKCRzMCwiT1BFTlNTTF9pYTMyY2FwX1AiLCR0YmwsJmxhYmVsKCJwaWNfcG9pbnQiKSkgaWYgKCEkeDg2b25seSk7CisJJmxlYSAgICAoJHRibCwmRFdQKCZsYWJlbCgiQUVTX1RlIikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJHRibCkpOworCisJIyBwaWNrIFRlNCBjb3B5IHdoaWNoIGNhbid0ICJvdmVybGFwIiB3aXRoIHN0YWNrIGZyYW1lIG9yIGtleSBzY2hlZHVsZQorCSZsZWEJKCRzMSwmRFdQKDc2OC00LCJlc3AiKSk7CisJJnN1YgkoJHMxLCR0YmwpOworCSZhbmQJKCRzMSwweDMwMCk7CisJJmxlYQkoJHRibCwmRFdQKDIwNDgrMTI4LCR0YmwsJHMxKSk7CisKKwkJCQkJaWYgKCEkeDg2b25seSkgeworCSZidAkoJkRXUCgwLCRzMCksMjUpOwkjIGNoZWNrIGZvciBTU0UgYml0CisJJmpuYwkoJmxhYmVsKCJ4ODYiKSk7CisKKwkmbW92cQkoIm1tMCIsJlFXUCgwLCRhY2MpKTsKKwkmbW92cQkoIm1tNCIsJlFXUCg4LCRhY2MpKTsKKwkmY2FsbAkoIl9zc2VfQUVTX2VuY3J5cHRfY29tcGFjdCIpOworCSZtb3YJKCJlc3AiLCRfZXNwKTsJCQkjIHJlc3RvcmUgc3RhY2sgcG9pbnRlcgorCSZtb3YJKCRhY2MsJndwYXJhbSgxKSk7CQkjIGxvYWQgb3V0CisJJm1vdnEJKCZRV1AoMCwkYWNjKSwibW0wIik7CQkjIHdyaXRlIG91dHB1dCBkYXRhCisJJm1vdnEJKCZRV1AoOCwkYWNjKSwibW00Iik7CisJJmVtbXMJKCk7CisJJmZ1bmN0aW9uX2VuZF9BKCk7CisJCQkJCX0KKwkmc2V0X2xhYmVsKCJ4ODYiLDE2KTsKKwkmbW92CSgkX3RibCwkdGJsKTsKKwkmbW92CSgkczAsJkRXUCgwLCRhY2MpKTsJCSMgbG9hZCBpbnB1dCBkYXRhCisJJm1vdgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJJm1vdgkoJHMyLCZEV1AoOCwkYWNjKSk7CisJJm1vdgkoJHMzLCZEV1AoMTIsJGFjYykpOworCSZjYWxsCSgiX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0Iik7CisJJm1vdgkoImVzcCIsJF9lc3ApOwkJCSMgcmVzdG9yZSBzdGFjayBwb2ludGVyCisJJm1vdgkoJGFjYywmd3BhcmFtKDEpKTsJCSMgbG9hZCBvdXQKKwkmbW92CSgmRFdQKDAsJGFjYyksJHMwKTsJCSMgd3JpdGUgb3V0cHV0IGRhdGEKKwkmbW92CSgmRFdQKDQsJGFjYyksJHMxKTsKKwkmbW92CSgmRFdQKDgsJGFjYyksJHMyKTsKKwkmbW92CSgmRFdQKDEyLCRhY2MpLCRzMyk7CismZnVuY3Rpb25fZW5kKCJBRVNfZW5jcnlwdCIpOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIkNvbXBhY3QiIGJsb2NrIGZ1bmN0aW9uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiBkZWNjb21wYWN0KCkKK3sgbXkgJEZuID0gbW92OworICB3aGlsZSAoJCNfPjUpIHsgcG9wKEBfKTsgJEZuPXN1Ynt9OyB9CisgIG15ICgkaSwkdGQsQHMpPUBfOworICBteSAkdG1wID0gJGtleTsKKyAgbXkgJG91dCA9ICRpPT0zPyRzWzBdOiRhY2M7CisKKwkjICRGbiBpcyB1c2VkIGluIGZpcnN0IGNvbXBhY3Qgcm91bmQgYW5kIGl0cyBwdXJwb3NlIGlzIHRvCisJIyB2b2lkIHJlc3RvcmF0aW9uIG9mIHNvbWUgdmFsdWVzIGZyb20gc3RhY2ssIHNvIHRoYXQgYWZ0ZXIKKwkjIDR4ZGVjY29tcGFjdCB3aXRoIGV4dHJhIGFyZ3VtZW50ICRrZXksICRzMCBhbmQgJHMxIHZhbHVlcworCSMgYXJlIGxlZnQgdGhlcmUuLi4KKwlpZigkaT09MykgICB7CSYkRm4JKCRrZXksJF9fa2V5KTsJCQl9CisJZWxzZSAgICAgICAgewkmbW92CSgkb3V0LCRzWzBdKTsJCQl9CisJCQkmYW5kCSgkb3V0LDB4RkYpOworCQkJJm1vdnoJKCRvdXQsJkJQKC0xMjgsJHRkLCRvdXQsMSkpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzFdOwkJCQl9CisJCQkmbW92egkoJHRtcCwmSEIoJHNbMV0pKTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgtMTI4LCR0ZCwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsOCk7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzJdOyAmbW92ICgkc1sxXSwkYWNjKTsJCX0KKwllbHNlICAgICAgICB7CW1vdgkoJHRtcCwkc1syXSk7CQkJfQorCQkJJnNocgkoJHRtcCwxNik7CisJCQkmYW5kCSgkdG1wLDB4RkYpOworCQkJJm1vdnoJKCR0bXAsJkJQKC0xMjgsJHRkLCR0bXAsMSkpOworCQkJJnNobAkoJHRtcCwxNik7CisJCQkmeG9yCSgkb3V0LCR0bXApOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzNdOyAmJEZuICgkc1syXSwkX19zMSk7CQl9CisJZWxzZSAgICAgICAgewkmbW92CSgkdG1wLCRzWzNdKTsJCQl9CisJCQkmc2hyCSgkdG1wLDI0KTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgtMTI4LCR0ZCwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsMjQpOworCQkJJnhvcgkoJG91dCwkdG1wKTsKKwlpZiAoJGk8MikgICB7CSZtb3YJKCZEV1AoNCs0KiRpLCJlc3AiKSwkb3V0KTsJfQorCWlmICgkaT09MykgIHsJJiRGbgkoJHNbM10sJF9fczApOwkJCX0KK30KKworIyBtdXN0IGJlIGNhbGxlZCB3aXRoIDIsMywwLDEgYXMgYXJndW1lbnQgc2VxdWVuY2UhISEKK3N1YiBkZWN0cmFuc2Zvcm0oKQoreyBteSBAcyA9ICgkczAsJHMxLCRzMiwkczMpOworICBteSAkaSA9IHNoaWZ0OworICBteSAkdG1wID0gJGtleTsKKyAgbXkgJHRwMiA9IEBzWygkaSsyKSU0XTsgJHRwMiA9IEBzWzJdIGlmICgkaT09MSk7CisgIG15ICR0cDQgPSBAc1soJGkrMyklNF07ICR0cDQgPSBAc1szXSBpZiAoJGk9PTEpOworICBteSAkdHA4ID0gJHRibDsKKworCSZtb3YJKCRhY2MsJHNbJGldKTsKKwkmYW5kCSgkYWNjLDB4ODA4MDgwODApOworCSZtb3YJKCR0bXAsJGFjYyk7CisJJnNocgkoJHRtcCw3KTsKKwkmbGVhCSgkdHAyLCZEV1AoMCwkc1skaV0sJHNbJGldKSk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHAyLDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJJnhvcgkoJGFjYywkdHAyKTsKKwkmbW92CSgkdHAyLCRhY2MpOworCisJJmFuZAkoJGFjYywweDgwODA4MDgwKTsKKwkmbW92CSgkdG1wLCRhY2MpOworCSZzaHIJKCR0bXAsNyk7CisJJmxlYQkoJHRwNCwmRFdQKDAsJHRwMiwkdHAyKSk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHA0LDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJICZ4b3IJKCR0cDIsJHNbJGldKTsJIyB0cDJedHAxCisJJnhvcgkoJGFjYywkdHA0KTsKKwkmbW92CSgkdHA0LCRhY2MpOworCisJJmFuZAkoJGFjYywweDgwODA4MDgwKTsKKwkmbW92CSgkdG1wLCRhY2MpOworCSZzaHIJKCR0bXAsNyk7CisJJmxlYQkoJHRwOCwmRFdQKDAsJHRwNCwkdHA0KSk7CisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHA4LDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJICZ4b3IJKCR0cDQsJHNbJGldKTsJIyB0cDRedHAxCisJICZyb3RsCSgkc1skaV0sOCk7CSMgPSBST1RBVEUodHAxLDgpCisJJnhvcgkoJHRwOCwkYWNjKTsKKworCSZ4b3IJKCRzWyRpXSwkdHAyKTsKKwkmeG9yCSgkdHAyLCR0cDgpOworCSZyb3RsCSgkdHAyLDI0KTsKKwkmeG9yCSgkc1skaV0sJHRwNCk7CisJJnhvcgkoJHRwNCwkdHA4KTsKKwkmcm90bAkoJHRwNCwxNik7CisJJnhvcgkoJHNbJGldLCR0cDgpOwkjIF49IHRwOF4odHA0XnRwMSleKHRwMl50cDEpCisJJnJvdGwJKCR0cDgsOCk7CisJJnhvcgkoJHNbJGldLCR0cDIpOwkjIF49IFJPVEFURSh0cDhedHAyXnRwMSwyNCkKKwkmeG9yCSgkc1skaV0sJHRwNCk7CSMgXj0gUk9UQVRFKHRwOF50cDRedHAxLDE2KQorCSAmbW92CSgkc1swXSwkX19zMCkJCQlpZigkaT09Mik7ICNwcmVmZXRjaCAkczAKKwkgJm1vdgkoJHNbMV0sJF9fczEpCQkJaWYoJGk9PTMpOyAjcHJlZmV0Y2ggJHMxCisJICZtb3YJKCRzWzJdLCRfX3MyKQkJCWlmKCRpPT0xKTsKKwkmeG9yCSgkc1skaV0sJHRwOCk7CSMgXj0gUk9UQVRFKHRwOCw4KQorCisJJm1vdgkoJHNbM10sJF9fczMpCQkJaWYoJGk9PTEpOworCSZtb3YJKCZEV1AoNCs0KiRpLCJlc3AiKSwkc1skaV0pCWlmKCRpPj0yKTsKK30KKworJmZ1bmN0aW9uX2JlZ2luX0IoIl94ODZfQUVTX2RlY3J5cHRfY29tcGFjdCIpOworCSMgbm90ZSB0aGF0IGNhbGxlciBpcyBleHBlY3RlZCB0byBhbGxvY2F0ZSBzdGFjayBmcmFtZSBmb3IgbWUhCisJJm1vdgkoJF9fa2V5LCRrZXkpOwkJCSMgc2F2ZSBrZXkKKworCSZ4b3IJKCRzMCwmRFdQKDAsJGtleSkpOwkJIyB4b3Igd2l0aCBrZXkKKwkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmbW92CSgkYWNjLCZEV1AoMjQwLCRrZXkpKTsJCSMgbG9hZCBrZXktPnJvdW5kcworCisJJmxlYQkoJGFjYywmRFdQKC0yLCRhY2MsJGFjYykpOworCSZsZWEJKCRhY2MsJkRXUCgwLCRrZXksJGFjYyw4KSk7CisJJm1vdgkoJF9fZW5kLCRhY2MpOwkJCSMgZW5kIG9mIGtleSBzY2hlZHVsZQorCisJIyBwcmVmZXRjaCBUZDQKKwkmbW92CSgka2V5LCZEV1AoMC0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCgzMi0xMjgsJHRibCkpOworCSZtb3YJKCRrZXksJkRXUCg2NC0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCg5Ni0xMjgsJHRibCkpOworCSZtb3YJKCRrZXksJkRXUCgxMjgtMTI4LCR0YmwpKTsKKwkmbW92CSgkYWNjLCZEV1AoMTYwLTEyOCwkdGJsKSk7CisJJm1vdgkoJGtleSwmRFdQKDE5Mi0xMjgsJHRibCkpOworCSZtb3YJKCRhY2MsJkRXUCgyMjQtMTI4LCR0YmwpKTsKKworCSZzZXRfbGFiZWwoImxvb3AiLDE2KTsKKworCQkmZGVjY29tcGFjdCgwLCR0YmwsJHMwLCRzMywkczIsJHMxLDEpOworCQkmZGVjY29tcGFjdCgxLCR0YmwsJHMxLCRzMCwkczMsJHMyLDEpOworCQkmZGVjY29tcGFjdCgyLCR0YmwsJHMyLCRzMSwkczAsJHMzLDEpOworCQkmZGVjY29tcGFjdCgzLCR0YmwsJHMzLCRzMiwkczEsJHMwLDEpOworCQkmZGVjdHJhbnNmb3JtKDIpOworCQkmZGVjdHJhbnNmb3JtKDMpOworCQkmZGVjdHJhbnNmb3JtKDApOworCQkmZGVjdHJhbnNmb3JtKDEpOworCQkmbW92IAkoJGtleSwkX19rZXkpOworCQkmbW92CSgkdGJsLCRfX3RibCk7CisJCSZhZGQJKCRrZXksMTYpOwkJIyBhZHZhbmNlIHJkX2tleQorCQkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmY21wCSgka2V5LCRfX2VuZCk7CisJJm1vdgkoJF9fa2V5LCRrZXkpOworCSZqYgkoJmxhYmVsKCJsb29wIikpOworCisJJmRlY2NvbXBhY3QoMCwkdGJsLCRzMCwkczMsJHMyLCRzMSk7CisJJmRlY2NvbXBhY3QoMSwkdGJsLCRzMSwkczAsJHMzLCRzMik7CisJJmRlY2NvbXBhY3QoMiwkdGJsLCRzMiwkczEsJHMwLCRzMyk7CisJJmRlY2NvbXBhY3QoMywkdGJsLCRzMywkczIsJHMxLCRzMCk7CisKKwkmeG9yCSgkczAsJkRXUCgxNiwka2V5KSk7CisJJnhvcgkoJHMxLCZEV1AoMjAsJGtleSkpOworCSZ4b3IJKCRzMiwmRFdQKDI0LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgyOCwka2V5KSk7CisKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJfeDg2X0FFU19kZWNyeXB0X2NvbXBhY3QiKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAiQ29tcGFjdCIgU1NFIGJsb2NrIGZ1bmN0aW9uLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitzdWIgc3NlX2RlY2NvbXBhY3QoKQoreworCSZwc2h1ZncJKCJtbTEiLCJtbTAiLDB4MGMpOwkJIyAgNywgNiwgMSwgMAorCSZtb3ZkCSgiZWF4IiwibW0xIik7CQkJIyAgNywgNiwgMSwgMAorCisJJnBzaHVmdwkoIm1tNSIsIm1tNCIsMHgwOSk7CQkjIDEzLDEyLDExLDEwCisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICAwCisJJm1vdnoJKCJlY3giLCZCUCgtMTI4LCR0YmwsJGFjYywxKSk7CSMgIDAKKwkmbW92ZAkoImVieCIsIm1tNSIpOwkJCSMgMTMsMTIsMTEsMTAKKwkmbW92egkoImVkeCIsJkhCKCJlYXgiKSk7CQkjICAxCisJJm1vdnoJKCJlZHgiLCZCUCgtMTI4LCR0YmwsImVkeCIsMSkpOwkjICAxCisJJnNobAkoImVkeCIsOCk7CQkJIyAgMQorCisJJnBzaHVmdwkoIm1tMiIsIm1tMCIsMHgwNik7CQkjICAzLCAyLCA1LCA0CisJJm1vdnoJKCRhY2MsJkxCKCJlYngiKSk7CQkjIDEwCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAxMAorCSZzaGwJKCRhY2MsMTYpOwkJCSMgMTAKKwkmb3IJKCJlY3giLCRhY2MpOwkJCSMgMTAKKwkmc2hyCSgiZWF4IiwxNik7CQkJIyAgNywgNgorCSZtb3Z6CSgkYWNjLCZIQigiZWJ4IikpOwkJIyAxMQorCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGFjYywxKSk7CSMgMTEKKwkmc2hsCSgkYWNjLDI0KTsJCQkjIDExCisJJm9yCSgiZWR4IiwkYWNjKTsJCQkjIDExCisJJnNocgkoImVieCIsMTYpOwkJCSMgMTMsMTIKKworCSZwc2h1ZncJKCJtbTYiLCJtbTQiLDB4MDMpOwkJIyA5LCA4LDE1LDE0CisJJm1vdnoJKCRhY2MsJkhCKCJlYXgiKSk7CQkjICA3CisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgNworCSZzaGwJKCRhY2MsMjQpOwkJCSMgIDcKKwkmb3IJKCJlY3giLCRhY2MpOwkJCSMgIDcKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgMTMKKwkmbW92egkoJGFjYywmQlAoLTEyOCwkdGJsLCRhY2MsMSkpOwkjIDEzCisJJnNobAkoJGFjYyw4KTsJCQkjIDEzCisJJm9yCSgiZWN4IiwkYWNjKTsJCQkjIDEzCisJJm1vdmQJKCJtbTAiLCJlY3giKTsJCQkjIHRbMF0gY29sbGVjdGVkCisKKwkmbW92egkoJGFjYywmTEIoImVheCIpKTsJCSMgIDYKKwkmbW92ZAkoImVheCIsIm1tMiIpOwkJCSMgIDMsIDIsIDUsIDQKKwkmbW92egkoImVjeCIsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgNgorCSZzaGwJKCJlY3giLDE2KTsJCQkjICA2CisJJm1vdnoJKCRhY2MsJkxCKCJlYngiKSk7CQkjIDEyCisJJm1vdmQJKCJlYngiLCJtbTYiKTsJCQkjICA5LCA4LDE1LDE0CisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAxMgorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAxMgorCisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICA0CisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgNAorCSZvcgkoImVkeCIsJGFjYyk7CQkJIyAgNAorCSZtb3Z6CSgkYWNjLCZMQigiZWJ4IikpOwkJIyAxNAorCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGFjYywxKSk7CSMgMTQKKwkmc2hsCSgkYWNjLDE2KTsJCQkjIDE0CisJJm9yCSgiZWR4IiwkYWNjKTsJCQkjIDE0CisJJm1vdmQJKCJtbTEiLCJlZHgiKTsJCQkjIHRbMV0gY29sbGVjdGVkCisKKwkmbW92egkoJGFjYywmSEIoImVheCIpKTsJCSMgIDUKKwkmbW92egkoImVkeCIsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgNQorCSZzaGwJKCJlZHgiLDgpOwkJCSMgIDUKKwkmbW92egkoJGFjYywmSEIoImVieCIpKTsJCSMgMTUKKwkmc2hyCSgiZWF4IiwxNik7CQkJIyAgMywgMgorCSZtb3Z6CSgkYWNjLCZCUCgtMTI4LCR0YmwsJGFjYywxKSk7CSMgMTUKKwkmc2hsCSgkYWNjLDI0KTsJCQkjIDE1CisJJm9yCSgiZWR4IiwkYWNjKTsJCQkjIDE1CisJJnNocgkoImVieCIsMTYpOwkJCSMgIDksIDgKKworCSZwdW5wY2tsZHEJKCJtbTAiLCJtbTEiKTsJCSMgdFswLDFdIGNvbGxlY3RlZAorCisJJm1vdnoJKCRhY2MsJkhCKCJlYngiKSk7CQkjICA5CisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgOQorCSZzaGwJKCRhY2MsOCk7CQkJIyAgOQorCSZvcgkoImVjeCIsJGFjYyk7CQkJIyAgOQorCSZhbmQJKCJlYngiLDB4ZmYpOwkJCSMgIDgKKwkmbW92egkoImVieCIsJkJQKC0xMjgsJHRibCwiZWJ4IiwxKSk7CSMgIDgKKwkmb3IJKCJlZHgiLCJlYngiKTsJCQkjICA4CisJJm1vdnoJKCRhY2MsJkxCKCJlYXgiKSk7CQkjICAyCisJJm1vdnoJKCRhY2MsJkJQKC0xMjgsJHRibCwkYWNjLDEpKTsJIyAgMgorCSZzaGwJKCRhY2MsMTYpOwkJCSMgIDIKKwkmb3IJKCJlZHgiLCRhY2MpOwkJCSMgIDIKKwkmbW92ZAkoIm1tNCIsImVkeCIpOwkJCSMgdFsyXSBjb2xsZWN0ZWQKKwkmbW92egkoImVheCIsJkhCKCJlYXgiKSk7CQkjICAzCisJJm1vdnoJKCJlYXgiLCZCUCgtMTI4LCR0YmwsImVheCIsMSkpOwkjICAzCisJJnNobAkoImVheCIsMjQpOwkJCSMgIDMKKwkmb3IJKCJlY3giLCJlYXgiKTsJCQkjICAzCisJJm1vdmQJKCJtbTUiLCJlY3giKTsJCQkjIHRbM10gY29sbGVjdGVkCisKKwkmcHVucGNrbGRxCSgibW00IiwibW01Iik7CQkjIHRbMiwzXSBjb2xsZWN0ZWQKK30KKworCQkJCQlpZiAoISR4ODZvbmx5KSB7CismZnVuY3Rpb25fYmVnaW5fQigiX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0Iik7CisJJnB4b3IJKCJtbTAiLCZRV1AoMCwka2V5KSk7CSMgIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAKKwkmcHhvcgkoIm1tNCIsJlFXUCg4LCRrZXkpKTsJIyAxNSwxNCwxMywxMiwxMSwxMCwgOSwgOAorCisJIyBub3RlIHRoYXQgY2FsbGVyIGlzIGV4cGVjdGVkIHRvIGFsbG9jYXRlIHN0YWNrIGZyYW1lIGZvciBtZSEKKwkmbW92CSgkYWNjLCZEV1AoMjQwLCRrZXkpKTsJCSMgbG9hZCBrZXktPnJvdW5kcworCSZsZWEJKCRhY2MsJkRXUCgtMiwkYWNjLCRhY2MpKTsKKwkmbGVhCSgkYWNjLCZEV1AoMCwka2V5LCRhY2MsOCkpOworCSZtb3YJKCRfX2VuZCwkYWNjKTsJCQkjIGVuZCBvZiBrZXkgc2NoZWR1bGUKKworCSZtb3YJKCRzMCwweDFiMWIxYjFiKTsJCSMgbWFnaWMgY29uc3RhbnQKKwkmbW92CSgmRFdQKDgsImVzcCIpLCRzMCk7CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksJHMwKTsKKworCSMgcHJlZmV0Y2ggVGQ0CisJJm1vdgkoJHMwLCZEV1AoMC0xMjgsJHRibCkpOworCSZtb3YJKCRzMSwmRFdQKDMyLTEyOCwkdGJsKSk7CisJJm1vdgkoJHMyLCZEV1AoNjQtMTI4LCR0YmwpKTsKKwkmbW92CSgkczMsJkRXUCg5Ni0xMjgsJHRibCkpOworCSZtb3YJKCRzMCwmRFdQKDEyOC0xMjgsJHRibCkpOworCSZtb3YJKCRzMSwmRFdQKDE2MC0xMjgsJHRibCkpOworCSZtb3YJKCRzMiwmRFdQKDE5Mi0xMjgsJHRibCkpOworCSZtb3YJKCRzMywmRFdQKDIyNC0xMjgsJHRibCkpOworCisJJnNldF9sYWJlbCgibG9vcCIsMTYpOworCQkmc3NlX2RlY2NvbXBhY3QoKTsKKwkJJmFkZAkoJGtleSwxNik7CisJCSZjbXAJKCRrZXksJF9fZW5kKTsKKwkJJmphCSgmbGFiZWwoIm91dCIpKTsKKworCQkjIFJPVEFURSh4XnksTikgPT0gUk9UQVRFKHgsTileUk9UQVRFKHksTikKKwkJJm1vdnEJKCJtbTMiLCJtbTAiKTsJCSZtb3ZxCSgibW03IiwibW00Iik7CisJCSZtb3ZxCSgibW0yIiwibW0wIiwxKTsJJm1vdnEJKCJtbTYiLCJtbTQiLDEpOworCQkmbW92cQkoIm1tMSIsIm1tMCIpOwkJJm1vdnEJKCJtbTUiLCJtbTQiKTsKKwkJJnBzaHVmdwkoIm1tMCIsIm1tMCIsMHhiMSk7CSZwc2h1ZncJKCJtbTQiLCJtbTQiLDB4YjEpOyMgPSBST1RBVEUodHAwLDE2KQorCQkmcHNsbGQJKCJtbTIiLDgpOwkJJnBzbGxkCSgibW02Iiw4KTsKKwkJJnBzcmxkCSgibW0zIiw4KTsJCSZwc3JsZAkoIm1tNyIsOCk7CisJCSZweG9yCSgibW0wIiwibW0yIik7CQkmcHhvcgkoIm1tNCIsIm1tNiIpOwkjIF49IHRwMDw8OAorCQkmcHhvcgkoIm1tMCIsIm1tMyIpOwkJJnB4b3IJKCJtbTQiLCJtbTciKTsJIyBePSB0cDA+PjgKKwkJJnBzbGxkCSgibW0yIiwxNik7CQkmcHNsbGQJKCJtbTYiLDE2KTsKKwkJJnBzcmxkCSgibW0zIiwxNik7CQkmcHNybGQJKCJtbTciLDE2KTsKKwkJJnB4b3IJKCJtbTAiLCJtbTIiKTsJCSZweG9yCSgibW00IiwibW02Iik7CSMgXj0gdHAwPDwyNAorCQkmcHhvcgkoIm1tMCIsIm1tMyIpOwkJJnB4b3IJKCJtbTQiLCJtbTciKTsJIyBePSB0cDA+PjI0CisKKwkJJm1vdnEJKCJtbTMiLCZRV1AoOCwiZXNwIikpOworCQkmcHhvcgkoIm1tMiIsIm1tMiIpOwkJJnB4b3IJKCJtbTYiLCJtbTYiKTsKKwkJJnBjbXBndGIoIm1tMiIsIm1tMSIpOwkJJnBjbXBndGIoIm1tNiIsIm1tNSIpOworCQkmcGFuZAkoIm1tMiIsIm1tMyIpOwkJJnBhbmQJKCJtbTYiLCJtbTMiKTsKKwkJJnBhZGRiCSgibW0xIiwibW0xIik7CQkmcGFkZGIJKCJtbTUiLCJtbTUiKTsKKwkJJnB4b3IJKCJtbTEiLCJtbTIiKTsJCSZweG9yCSgibW01IiwibW02Iik7CSMgdHAyCisJCSZtb3ZxCSgibW0zIiwibW0xIik7CQkmbW92cQkoIm1tNyIsIm1tNSIpOworCQkmbW92cQkoIm1tMiIsIm1tMSIpOwkJJm1vdnEJKCJtbTYiLCJtbTUiKTsKKwkJJnB4b3IJKCJtbTAiLCJtbTEiKTsJCSZweG9yCSgibW00IiwibW01Iik7CSMgXj0gdHAyCisJCSZwc2xsZAkoIm1tMyIsMjQpOwkJJnBzbGxkCSgibW03IiwyNCk7CisJCSZwc3JsZAkoIm1tMiIsOCk7CQkmcHNybGQJKCJtbTYiLDgpOworCQkmcHhvcgkoIm1tMCIsIm1tMyIpOwkJJnB4b3IJKCJtbTQiLCJtbTciKTsJIyBePSB0cDI8PDI0CisJCSZweG9yCSgibW0wIiwibW0yIik7CQkmcHhvcgkoIm1tNCIsIm1tNiIpOwkjIF49IHRwMj4+OAorCisJCSZtb3ZxCSgibW0yIiwmUVdQKDgsImVzcCIpKTsKKwkJJnB4b3IJKCJtbTMiLCJtbTMiKTsJCSZweG9yCSgibW03IiwibW03Iik7CisJCSZwY21wZ3RiKCJtbTMiLCJtbTEiKTsJCSZwY21wZ3RiKCJtbTciLCJtbTUiKTsKKwkJJnBhbmQJKCJtbTMiLCJtbTIiKTsJCSZwYW5kCSgibW03IiwibW0yIik7CisJCSZwYWRkYgkoIm1tMSIsIm1tMSIpOwkJJnBhZGRiCSgibW01IiwibW01Iik7CisJCSZweG9yCSgibW0xIiwibW0zIik7CQkmcHhvcgkoIm1tNSIsIm1tNyIpOwkjIHRwNAorCQkmcHNodWZ3CSgibW0zIiwibW0xIiwweGIxKTsJJnBzaHVmdwkoIm1tNyIsIm1tNSIsMHhiMSk7CisJCSZweG9yCSgibW0wIiwibW0xIik7CQkmcHhvcgkoIm1tNCIsIm1tNSIpOwkjIF49IHRwNAorCQkmcHhvcgkoIm1tMCIsIm1tMyIpOwkJJnB4b3IJKCJtbTQiLCJtbTciKTsJIyBePSBST1RBVEUodHA0LDE2KQkKKworCQkmcHhvcgkoIm1tMyIsIm1tMyIpOwkJJnB4b3IJKCJtbTciLCJtbTciKTsKKwkJJnBjbXBndGIoIm1tMyIsIm1tMSIpOwkJJnBjbXBndGIoIm1tNyIsIm1tNSIpOworCQkmcGFuZAkoIm1tMyIsIm1tMiIpOwkJJnBhbmQJKCJtbTciLCJtbTIiKTsKKwkJJnBhZGRiCSgibW0xIiwibW0xIik7CQkmcGFkZGIJKCJtbTUiLCJtbTUiKTsKKwkJJnB4b3IJKCJtbTEiLCJtbTMiKTsJCSZweG9yCSgibW01IiwibW03Iik7CSMgdHA4CisJCSZweG9yCSgibW0wIiwibW0xIik7CQkmcHhvcgkoIm1tNCIsIm1tNSIpOwkjIF49IHRwOAorCQkmbW92cQkoIm1tMyIsIm1tMSIpOwkJJm1vdnEJKCJtbTciLCJtbTUiKTsKKwkJJnBzaHVmdwkoIm1tMiIsIm1tMSIsMHhiMSk7CSZwc2h1ZncJKCJtbTYiLCJtbTUiLDB4YjEpOworCQkmcHhvcgkoIm1tMCIsIm1tMiIpOwkJJnB4b3IJKCJtbTQiLCJtbTYiKTsJIyBePSBST1RBVEUodHA4LDE2KQorCQkmcHNsbGQJKCJtbTEiLDgpOwkJJnBzbGxkCSgibW01Iiw4KTsKKwkJJnBzcmxkCSgibW0zIiw4KTsJCSZwc3JsZAkoIm1tNyIsOCk7CisJCSZtb3ZxCSgibW0yIiwmUVdQKDAsJGtleSkpOwkmbW92cQkoIm1tNiIsJlFXUCg4LCRrZXkpKTsKKwkJJnB4b3IJKCJtbTAiLCJtbTEiKTsJCSZweG9yCSgibW00IiwibW01Iik7CSMgXj0gdHA4PDw4CisJCSZweG9yCSgibW0wIiwibW0zIik7CQkmcHhvcgkoIm1tNCIsIm1tNyIpOwkjIF49IHRwOD4+OAorCQkmbW92CSgkczAsJkRXUCgwLTEyOCwkdGJsKSk7CisJCSZwc2xsZAkoIm1tMSIsMTYpOwkJJnBzbGxkCSgibW01IiwxNik7CisJCSZtb3YJKCRzMSwmRFdQKDY0LTEyOCwkdGJsKSk7CisJCSZwc3JsZAkoIm1tMyIsMTYpOwkJJnBzcmxkCSgibW03IiwxNik7CisJCSZtb3YJKCRzMiwmRFdQKDEyOC0xMjgsJHRibCkpOworCQkmcHhvcgkoIm1tMCIsIm1tMSIpOwkJJnB4b3IJKCJtbTQiLCJtbTUiKTsJIyBePSB0cDg8PDI0CisJCSZtb3YJKCRzMywmRFdQKDE5Mi0xMjgsJHRibCkpOworCQkmcHhvcgkoIm1tMCIsIm1tMyIpOwkJJnB4b3IJKCJtbTQiLCJtbTciKTsJIyBePSB0cDg+PjI0CisKKwkJJnB4b3IJKCJtbTAiLCJtbTIiKTsJCSZweG9yCSgibW00IiwibW02Iik7CisJJmptcAkoJmxhYmVsKCJsb29wIikpOworCisJJnNldF9sYWJlbCgib3V0IiwxNik7CisJJnB4b3IJKCJtbTAiLCZRV1AoMCwka2V5KSk7CisJJnB4b3IJKCJtbTQiLCZRV1AoOCwka2V5KSk7CisKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJfc3NlX0FFU19kZWNyeXB0X2NvbXBhY3QiKTsKKwkJCQkJfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFZhbmlsbGEgYmxvY2sgZnVuY3Rpb24uCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK3N1YiBkZWNzdGVwKCkKK3sgbXkgKCRpLCR0ZCxAcykgPSBAXzsKKyAgbXkgJHRtcCA9ICRrZXk7CisgIG15ICRvdXQgPSAkaT09Mz8kc1swXTokYWNjOworCisJIyBubyBpbnN0cnVjdGlvbnMgYXJlIHJlb3JkZXJlZCwgYXMgcGVyZm9ybWFuY2UgYXBwZWFycworCSMgb3B0aW1hbC4uLiBvciByYXRoZXIgdGhhdCBhbGwgYXR0ZW1wdHMgdG8gcmVvcmRlciBkaWRuJ3QKKwkjIHJlc3VsdCBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UgW3doaWNoIGJ5IHRoZSB3YXkgaXMgbm90IGEKKwkjIGJpdCBsb3dlciB0aGFuIGVjcnlwdGlvbl0uCisJaWYoJGk9PTMpICAgewkmbW92CSgka2V5LCRfX2tleSk7CQkJfQorCWVsc2UgICAgICAgIHsJJm1vdgkoJG91dCwkc1swXSk7CQkJfQorCQkJJmFuZAkoJG91dCwweEZGKTsKKwkJCSZtb3YJKCRvdXQsJkRXUCgwLCR0ZCwkb3V0LDgpKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1sxXTsJCQkJfQorCQkJJm1vdnoJKCR0bXAsJkhCKCRzWzFdKSk7CisJCQkmeG9yCSgkb3V0LCZEV1AoMywkdGQsJHRtcCw4KSk7CisKKwlpZiAoJGk9PTMpICB7CSR0bXA9JHNbMl07ICZtb3YgKCRzWzFdLCRhY2MpOwkJfQorCWVsc2UgICAgICAgIHsJJm1vdgkoJHRtcCwkc1syXSk7CQkJfQorCQkJJnNocgkoJHRtcCwxNik7CisJCQkmYW5kCSgkdG1wLDB4RkYpOworCQkJJnhvcgkoJG91dCwmRFdQKDIsJHRkLCR0bXAsOCkpOworCisJaWYgKCRpPT0zKSAgewkkdG1wPSRzWzNdOyAmbW92ICgkc1syXSwkX19zMSk7CQl9CisJZWxzZSAgICAgICAgewkmbW92CSgkdG1wLCRzWzNdKTsJCQl9CisJCQkmc2hyCSgkdG1wLDI0KTsKKwkJCSZ4b3IJKCRvdXQsJkRXUCgxLCR0ZCwkdG1wLDgpKTsKKwlpZiAoJGk8MikgICB7CSZtb3YJKCZEV1AoNCs0KiRpLCJlc3AiKSwkb3V0KTsJfQorCWlmICgkaT09MykgIHsJJm1vdgkoJHNbM10sJF9fczApOwkJCX0KKwkJCSZjb21tZW50KCk7Cit9CisKK3N1YiBkZWNsYXN0KCkKK3sgbXkgKCRpLCR0ZCxAcyk9QF87CisgIG15ICR0bXAgPSAka2V5OworICBteSAkb3V0ID0gJGk9PTM/JHNbMF06JGFjYzsKKworCWlmKCRpPT0wKSAgIHsJJmxlYQkoJHRkLCZEV1AoMjA0OCsxMjgsJHRkKSk7CisJCQkmbW92CSgkdG1wLCZEV1AoMC0xMjgsJHRkKSk7CisJCQkmbW92CSgkYWNjLCZEV1AoMzItMTI4LCR0ZCkpOworCQkJJm1vdgkoJHRtcCwmRFdQKDY0LTEyOCwkdGQpKTsKKwkJCSZtb3YJKCRhY2MsJkRXUCg5Ni0xMjgsJHRkKSk7CisJCQkmbW92CSgkdG1wLCZEV1AoMTI4LTEyOCwkdGQpKTsKKwkJCSZtb3YJKCRhY2MsJkRXUCgxNjAtMTI4LCR0ZCkpOworCQkJJm1vdgkoJHRtcCwmRFdQKDE5Mi0xMjgsJHRkKSk7CisJCQkmbW92CSgkYWNjLCZEV1AoMjI0LTEyOCwkdGQpKTsKKwkJCSZsZWEJKCR0ZCwmRFdQKC0xMjgsJHRkKSk7CQl9CisJaWYoJGk9PTMpICAgewkmbW92CSgka2V5LCRfX2tleSk7CQkJfQorCWVsc2UgICAgICAgIHsJJm1vdgkoJG91dCwkc1swXSk7CQkJfQorCQkJJmFuZAkoJG91dCwweEZGKTsKKwkJCSZtb3Z6CSgkb3V0LCZCUCgwLCR0ZCwkb3V0LDEpKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1sxXTsJCQkJfQorCQkJJm1vdnoJKCR0bXAsJkhCKCRzWzFdKSk7CisJCQkmbW92egkoJHRtcCwmQlAoMCwkdGQsJHRtcCwxKSk7CisJCQkmc2hsCSgkdG1wLDgpOworCQkJJnhvcgkoJG91dCwkdG1wKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1syXTsgJm1vdiAoJHNbMV0sJGFjYyk7CQl9CisJZWxzZSAgICAgICAgewltb3YJKCR0bXAsJHNbMl0pOwkJCX0KKwkJCSZzaHIJKCR0bXAsMTYpOworCQkJJmFuZAkoJHRtcCwweEZGKTsKKwkJCSZtb3Z6CSgkdG1wLCZCUCgwLCR0ZCwkdG1wLDEpKTsKKwkJCSZzaGwJKCR0bXAsMTYpOworCQkJJnhvcgkoJG91dCwkdG1wKTsKKworCWlmICgkaT09MykgIHsJJHRtcD0kc1szXTsgJm1vdiAoJHNbMl0sJF9fczEpOwkJfQorCWVsc2UgICAgICAgIHsJJm1vdgkoJHRtcCwkc1szXSk7CQkJfQorCQkJJnNocgkoJHRtcCwyNCk7CisJCQkmbW92egkoJHRtcCwmQlAoMCwkdGQsJHRtcCwxKSk7CisJCQkmc2hsCSgkdG1wLDI0KTsKKwkJCSZ4b3IJKCRvdXQsJHRtcCk7CisJaWYgKCRpPDIpICAgewkmbW92CSgmRFdQKDQrNCokaSwiZXNwIiksJG91dCk7CX0KKwlpZiAoJGk9PTMpICB7CSZtb3YJKCRzWzNdLCRfX3MwKTsKKwkJCSZsZWEJKCR0ZCwmRFdQKC0yMDQ4LCR0ZCkpOwkJfQorfQorCismZnVuY3Rpb25fYmVnaW5fQigiX3g4Nl9BRVNfZGVjcnlwdCIpOworCSMgbm90ZSB0aGF0IGNhbGxlciBpcyBleHBlY3RlZCB0byBhbGxvY2F0ZSBzdGFjayBmcmFtZSBmb3IgbWUhCisJJm1vdgkoJF9fa2V5LCRrZXkpOwkJCSMgc2F2ZSBrZXkKKworCSZ4b3IJKCRzMCwmRFdQKDAsJGtleSkpOwkJIyB4b3Igd2l0aCBrZXkKKwkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkmbW92CSgkYWNjLCZEV1AoMjQwLCRrZXkpKTsJCSMgbG9hZCBrZXktPnJvdW5kcworCisJaWYgKCRzbWFsbF9mb290cHJpbnQpIHsKKwkgICAgJmxlYQkoJGFjYywmRFdQKC0yLCRhY2MsJGFjYykpOworCSAgICAmbGVhCSgkYWNjLCZEV1AoMCwka2V5LCRhY2MsOCkpOworCSAgICAmbW92CSgkX19lbmQsJGFjYyk7CQkjIGVuZCBvZiBrZXkgc2NoZWR1bGUKKwkgICAgJnNldF9sYWJlbCgibG9vcCIsMTYpOworCQkmZGVjc3RlcCgwLCR0YmwsJHMwLCRzMywkczIsJHMxKTsKKwkJJmRlY3N0ZXAoMSwkdGJsLCRzMSwkczAsJHMzLCRzMik7CisJCSZkZWNzdGVwKDIsJHRibCwkczIsJHMxLCRzMCwkczMpOworCQkmZGVjc3RlcCgzLCR0YmwsJHMzLCRzMiwkczEsJHMwKTsKKwkJJmFkZAkoJGtleSwxNik7CQkjIGFkdmFuY2UgcmRfa2V5CisJCSZ4b3IJKCRzMCwmRFdQKDAsJGtleSkpOworCQkmeG9yCSgkczEsJkRXUCg0LCRrZXkpKTsKKwkJJnhvcgkoJHMyLCZEV1AoOCwka2V5KSk7CisJCSZ4b3IJKCRzMywmRFdQKDEyLCRrZXkpKTsKKwkgICAgJmNtcAkoJGtleSwkX19lbmQpOworCSAgICAmbW92CSgkX19rZXksJGtleSk7CisJICAgICZqYgkJKCZsYWJlbCgibG9vcCIpKTsKKwl9CisJZWxzZSB7CisJICAgICZjbXAJKCRhY2MsMTApOworCSAgICAmamxlCSgmbGFiZWwoIjEwcm91bmRzIikpOworCSAgICAmY21wCSgkYWNjLDEyKTsKKwkgICAgJmpsZQkoJmxhYmVsKCIxMnJvdW5kcyIpKTsKKworCSZzZXRfbGFiZWwoIjE0cm91bmRzIiw0KTsKKwkgICAgZm9yICgkaT0xOyRpPDM7JGkrKykgeworCQkmZGVjc3RlcCgwLCR0YmwsJHMwLCRzMywkczIsJHMxKTsKKwkJJmRlY3N0ZXAoMSwkdGJsLCRzMSwkczAsJHMzLCRzMik7CisJCSZkZWNzdGVwKDIsJHRibCwkczIsJHMxLCRzMCwkczMpOworCQkmZGVjc3RlcCgzLCR0YmwsJHMzLCRzMiwkczEsJHMwKTsKKwkJJnhvcgkoJHMwLCZEV1AoMTYqJGkrMCwka2V5KSk7CisJCSZ4b3IJKCRzMSwmRFdQKDE2KiRpKzQsJGtleSkpOworCQkmeG9yCSgkczIsJkRXUCgxNiokaSs4LCRrZXkpKTsKKwkJJnhvcgkoJHMzLCZEV1AoMTYqJGkrMTIsJGtleSkpOworCSAgICB9CisJICAgICZhZGQJKCRrZXksMzIpOworCSAgICAmbW92CSgkX19rZXksJGtleSk7CQkjIGFkdmFuY2UgcmRfa2V5CisJJnNldF9sYWJlbCgiMTJyb3VuZHMiLDQpOworCSAgICBmb3IgKCRpPTE7JGk8MzskaSsrKSB7CisJCSZkZWNzdGVwKDAsJHRibCwkczAsJHMzLCRzMiwkczEpOworCQkmZGVjc3RlcCgxLCR0YmwsJHMxLCRzMCwkczMsJHMyKTsKKwkJJmRlY3N0ZXAoMiwkdGJsLCRzMiwkczEsJHMwLCRzMyk7CisJCSZkZWNzdGVwKDMsJHRibCwkczMsJHMyLCRzMSwkczApOworCQkmeG9yCSgkczAsJkRXUCgxNiokaSswLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoMTYqJGkrNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDE2KiRpKzgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxNiokaSsxMiwka2V5KSk7CisJICAgIH0KKwkgICAgJmFkZAkoJGtleSwzMik7CisJICAgICZtb3YJKCRfX2tleSwka2V5KTsJCSMgYWR2YW5jZSByZF9rZXkKKwkmc2V0X2xhYmVsKCIxMHJvdW5kcyIsNCk7CisJICAgIGZvciAoJGk9MTskaTwxMDskaSsrKSB7CisJCSZkZWNzdGVwKDAsJHRibCwkczAsJHMzLCRzMiwkczEpOworCQkmZGVjc3RlcCgxLCR0YmwsJHMxLCRzMCwkczMsJHMyKTsKKwkJJmRlY3N0ZXAoMiwkdGJsLCRzMiwkczEsJHMwLCRzMyk7CisJCSZkZWNzdGVwKDMsJHRibCwkczMsJHMyLCRzMSwkczApOworCQkmeG9yCSgkczAsJkRXUCgxNiokaSswLCRrZXkpKTsKKwkJJnhvcgkoJHMxLCZEV1AoMTYqJGkrNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDE2KiRpKzgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxNiokaSsxMiwka2V5KSk7CisJICAgIH0KKwl9CisKKwkmZGVjbGFzdCgwLCR0YmwsJHMwLCRzMywkczIsJHMxKTsKKwkmZGVjbGFzdCgxLCR0YmwsJHMxLCRzMCwkczMsJHMyKTsKKwkmZGVjbGFzdCgyLCR0YmwsJHMyLCRzMSwkczAsJHMzKTsKKwkmZGVjbGFzdCgzLCR0YmwsJHMzLCRzMiwkczEsJHMwKTsKKworCSZhZGQJKCRrZXksJHNtYWxsX2Zvb3RwcmludD8xNjoxNjApOworCSZ4b3IJKCRzMCwmRFdQKDAsJGtleSkpOworCSZ4b3IJKCRzMSwmRFdQKDQsJGtleSkpOworCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCSZ4b3IJKCRzMywmRFdQKDEyLCRrZXkpKTsKKworCSZyZXQJKCk7CisKKyZzZXRfbGFiZWwoIkFFU19UZCIsNjQpOwkjIFllcyEgSSBrZWVwIGl0IGluIHRoZSBjb2RlIHNlZ21lbnQhCisJJl9kYXRhX3dvcmQoMHg1MGE3ZjQ1MSwgMHg1MzY1NDE3ZSwgMHhjM2E0MTcxYSwgMHg5NjVlMjczYSk7CisJJl9kYXRhX3dvcmQoMHhjYjZiYWIzYiwgMHhmMTQ1OWQxZiwgMHhhYjU4ZmFhYywgMHg5MzAzZTM0Yik7CisJJl9kYXRhX3dvcmQoMHg1NWZhMzAyMCwgMHhmNjZkNzZhZCwgMHg5MTc2Y2M4OCwgMHgyNTRjMDJmNSk7CisJJl9kYXRhX3dvcmQoMHhmY2Q3ZTU0ZiwgMHhkN2NiMmFjNSwgMHg4MDQ0MzUyNiwgMHg4ZmEzNjJiNSk7CisJJl9kYXRhX3dvcmQoMHg0OTVhYjFkZSwgMHg2NzFiYmEyNSwgMHg5ODBlZWE0NSwgMHhlMWMwZmU1ZCk7CisJJl9kYXRhX3dvcmQoMHgwMjc1MmZjMywgMHgxMmYwNGM4MSwgMHhhMzk3NDY4ZCwgMHhjNmY5ZDM2Yik7CisJJl9kYXRhX3dvcmQoMHhlNzVmOGYwMywgMHg5NTljOTIxNSwgMHhlYjdhNmRiZiwgMHhkYTU5NTI5NSk7CisJJl9kYXRhX3dvcmQoMHgyZDgzYmVkNCwgMHhkMzIxNzQ1OCwgMHgyOTY5ZTA0OSwgMHg0NGM4Yzk4ZSk7CisJJl9kYXRhX3dvcmQoMHg2YTg5YzI3NSwgMHg3ODc5OGVmNCwgMHg2YjNlNTg5OSwgMHhkZDcxYjkyNyk7CisJJl9kYXRhX3dvcmQoMHhiNjRmZTFiZSwgMHgxN2FkODhmMCwgMHg2NmFjMjBjOSwgMHhiNDNhY2U3ZCk7CisJJl9kYXRhX3dvcmQoMHgxODRhZGY2MywgMHg4MjMxMWFlNSwgMHg2MDMzNTE5NywgMHg0NTdmNTM2Mik7CisJJl9kYXRhX3dvcmQoMHhlMDc3NjRiMSwgMHg4NGFlNmJiYiwgMHgxY2EwODFmZSwgMHg5NDJiMDhmOSk7CisJJl9kYXRhX3dvcmQoMHg1ODY4NDg3MCwgMHgxOWZkNDU4ZiwgMHg4NzZjZGU5NCwgMHhiN2Y4N2I1Mik7CisJJl9kYXRhX3dvcmQoMHgyM2QzNzNhYiwgMHhlMjAyNGI3MiwgMHg1NzhmMWZlMywgMHgyYWFiNTU2Nik7CisJJl9kYXRhX3dvcmQoMHgwNzI4ZWJiMiwgMHgwM2MyYjUyZiwgMHg5YTdiYzU4NiwgMHhhNTA4MzdkMyk7CisJJl9kYXRhX3dvcmQoMHhmMjg3MjgzMCwgMHhiMmE1YmYyMywgMHhiYTZhMDMwMiwgMHg1YzgyMTZlZCk7CisJJl9kYXRhX3dvcmQoMHgyYjFjY2Y4YSwgMHg5MmI0NzlhNywgMHhmMGYyMDdmMywgMHhhMWUyNjk0ZSk7CisJJl9kYXRhX3dvcmQoMHhjZGY0ZGE2NSwgMHhkNWJlMDUwNiwgMHgxZjYyMzRkMSwgMHg4YWZlYTZjNCk7CisJJl9kYXRhX3dvcmQoMHg5ZDUzMmUzNCwgMHhhMDU1ZjNhMiwgMHgzMmUxOGEwNSwgMHg3NWViZjZhNCk7CisJJl9kYXRhX3dvcmQoMHgzOWVjODMwYiwgMHhhYWVmNjA0MCwgMHgwNjlmNzE1ZSwgMHg1MTEwNmViZCk7CisJJl9kYXRhX3dvcmQoMHhmOThhMjEzZSwgMHgzZDA2ZGQ5NiwgMHhhZTA1M2VkZCwgMHg0NmJkZTY0ZCk7CisJJl9kYXRhX3dvcmQoMHhiNThkNTQ5MSwgMHgwNTVkYzQ3MSwgMHg2ZmQ0MDYwNCwgMHhmZjE1NTA2MCk7CisJJl9kYXRhX3dvcmQoMHgyNGZiOTgxOSwgMHg5N2U5YmRkNiwgMHhjYzQzNDA4OSwgMHg3NzllZDk2Nyk7CisJJl9kYXRhX3dvcmQoMHhiZDQyZThiMCwgMHg4ODhiODkwNywgMHgzODViMTllNywgMHhkYmVlYzg3OSk7CisJJl9kYXRhX3dvcmQoMHg0NzBhN2NhMSwgMHhlOTBmNDI3YywgMHhjOTFlODRmOCwgMHgwMDAwMDAwMCk7CisJJl9kYXRhX3dvcmQoMHg4Mzg2ODAwOSwgMHg0OGVkMmIzMiwgMHhhYzcwMTExZSwgMHg0ZTcyNWE2Yyk7CisJJl9kYXRhX3dvcmQoMHhmYmZmMGVmZCwgMHg1NjM4ODUwZiwgMHgxZWQ1YWUzZCwgMHgyNzM5MmQzNik7CisJJl9kYXRhX3dvcmQoMHg2NGQ5MGYwYSwgMHgyMWE2NWM2OCwgMHhkMTU0NWI5YiwgMHgzYTJlMzYyNCk7CisJJl9kYXRhX3dvcmQoMHhiMTY3MGEwYywgMHgwZmU3NTc5MywgMHhkMjk2ZWViNCwgMHg5ZTkxOWIxYik7CisJJl9kYXRhX3dvcmQoMHg0ZmM1YzA4MCwgMHhhMjIwZGM2MSwgMHg2OTRiNzc1YSwgMHgxNjFhMTIxYyk7CisJJl9kYXRhX3dvcmQoMHgwYWJhOTNlMiwgMHhlNTJhYTBjMCwgMHg0M2UwMjIzYywgMHgxZDE3MWIxMik7CisJJl9kYXRhX3dvcmQoMHgwYjBkMDkwZSwgMHhhZGM3OGJmMiwgMHhiOWE4YjYyZCwgMHhjOGE5MWUxNCk7CisJJl9kYXRhX3dvcmQoMHg4NTE5ZjE1NywgMHg0YzA3NzVhZiwgMHhiYmRkOTllZSwgMHhmZDYwN2ZhMyk7CisJJl9kYXRhX3dvcmQoMHg5ZjI2MDFmNywgMHhiY2Y1NzI1YywgMHhjNTNiNjY0NCwgMHgzNDdlZmI1Yik7CisJJl9kYXRhX3dvcmQoMHg3NjI5NDM4YiwgMHhkY2M2MjNjYiwgMHg2OGZjZWRiNiwgMHg2M2YxZTRiOCk7CisJJl9kYXRhX3dvcmQoMHhjYWRjMzFkNywgMHgxMDg1NjM0MiwgMHg0MDIyOTcxMywgMHgyMDExYzY4NCk7CisJJl9kYXRhX3dvcmQoMHg3ZDI0NGE4NSwgMHhmODNkYmJkMiwgMHgxMTMyZjlhZSwgMHg2ZGExMjljNyk7CisJJl9kYXRhX3dvcmQoMHg0YjJmOWUxZCwgMHhmMzMwYjJkYywgMHhlYzUyODYwZCwgMHhkMGUzYzE3Nyk7CisJJl9kYXRhX3dvcmQoMHg2YzE2YjMyYiwgMHg5OWI5NzBhOSwgMHhmYTQ4OTQxMSwgMHgyMjY0ZTk0Nyk7CisJJl9kYXRhX3dvcmQoMHhjNDhjZmNhOCwgMHgxYTNmZjBhMCwgMHhkODJjN2Q1NiwgMHhlZjkwMzMyMik7CisJJl9kYXRhX3dvcmQoMHhjNzRlNDk4NywgMHhjMWQxMzhkOSwgMHhmZWEyY2E4YywgMHgzNjBiZDQ5OCk7CisJJl9kYXRhX3dvcmQoMHhjZjgxZjVhNiwgMHgyOGRlN2FhNSwgMHgyNjhlYjdkYSwgMHhhNGJmYWQzZik7CisJJl9kYXRhX3dvcmQoMHhlNDlkM2EyYywgMHgwZDkyNzg1MCwgMHg5YmNjNWY2YSwgMHg2MjQ2N2U1NCk7CisJJl9kYXRhX3dvcmQoMHhjMjEzOGRmNiwgMHhlOGI4ZDg5MCwgMHg1ZWY3MzkyZSwgMHhmNWFmYzM4Mik7CisJJl9kYXRhX3dvcmQoMHhiZTgwNWQ5ZiwgMHg3YzkzZDA2OSwgMHhhOTJkZDU2ZiwgMHhiMzEyMjVjZik7CisJJl9kYXRhX3dvcmQoMHgzYjk5YWNjOCwgMHhhNzdkMTgxMCwgMHg2ZTYzOWNlOCwgMHg3YmJiM2JkYik7CisJJl9kYXRhX3dvcmQoMHgwOTc4MjZjZCwgMHhmNDE4NTk2ZSwgMHgwMWI3OWFlYywgMHhhODlhNGY4Myk7CisJJl9kYXRhX3dvcmQoMHg2NTZlOTVlNiwgMHg3ZWU2ZmZhYSwgMHgwOGNmYmMyMSwgMHhlNmU4MTVlZik7CisJJl9kYXRhX3dvcmQoMHhkOTliZTdiYSwgMHhjZTM2NmY0YSwgMHhkNDA5OWZlYSwgMHhkNjdjYjAyOSk7CisJJl9kYXRhX3dvcmQoMHhhZmIyYTQzMSwgMHgzMTIzM2YyYSwgMHgzMDk0YTVjNiwgMHhjMDY2YTIzNSk7CisJJl9kYXRhX3dvcmQoMHgzN2JjNGU3NCwgMHhhNmNhODJmYywgMHhiMGQwOTBlMCwgMHgxNWQ4YTczMyk7CisJJl9kYXRhX3dvcmQoMHg0YTk4MDRmMSwgMHhmN2RhZWM0MSwgMHgwZTUwY2Q3ZiwgMHgyZmY2OTExNyk7CisJJl9kYXRhX3dvcmQoMHg4ZGQ2NGQ3NiwgMHg0ZGIwZWY0MywgMHg1NDRkYWFjYywgMHhkZjA0OTZlNCk7CisJJl9kYXRhX3dvcmQoMHhlM2I1ZDE5ZSwgMHgxYjg4NmE0YywgMHhiODFmMmNjMSwgMHg3ZjUxNjU0Nik7CisJJl9kYXRhX3dvcmQoMHgwNGVhNWU5ZCwgMHg1ZDM1OGMwMSwgMHg3Mzc0ODdmYSwgMHgyZTQxMGJmYik7CisJJl9kYXRhX3dvcmQoMHg1YTFkNjdiMywgMHg1MmQyZGI5MiwgMHgzMzU2MTBlOSwgMHgxMzQ3ZDY2ZCk7CisJJl9kYXRhX3dvcmQoMHg4YzYxZDc5YSwgMHg3YTBjYTEzNywgMHg4ZTE0Zjg1OSwgMHg4OTNjMTNlYik7CisJJl9kYXRhX3dvcmQoMHhlZTI3YTljZSwgMHgzNWM5NjFiNywgMHhlZGU1MWNlMSwgMHgzY2IxNDc3YSk7CisJJl9kYXRhX3dvcmQoMHg1OWRmZDI5YywgMHgzZjczZjI1NSwgMHg3OWNlMTQxOCwgMHhiZjM3Yzc3Myk7CisJJl9kYXRhX3dvcmQoMHhlYWNkZjc1MywgMHg1YmFhZmQ1ZiwgMHgxNDZmM2RkZiwgMHg4NmRiNDQ3OCk7CisJJl9kYXRhX3dvcmQoMHg4MWYzYWZjYSwgMHgzZWM0NjhiOSwgMHgyYzM0MjQzOCwgMHg1ZjQwYTNjMik7CisJJl9kYXRhX3dvcmQoMHg3MmMzMWQxNiwgMHgwYzI1ZTJiYywgMHg4YjQ5M2MyOCwgMHg0MTk1MGRmZik7CisJJl9kYXRhX3dvcmQoMHg3MTAxYTgzOSwgMHhkZWIzMGMwOCwgMHg5Y2U0YjRkOCwgMHg5MGMxNTY2NCk7CisJJl9kYXRhX3dvcmQoMHg2MTg0Y2I3YiwgMHg3MGI2MzJkNSwgMHg3NDVjNmM0OCwgMHg0MjU3YjhkMCk7CisKKyNUZDQ6CSMgZm91ciBjb3BpZXMgb2YgVGQ0IHRvIGNob29zZSBmcm9tIHRvIGF2b2lkIEwxIGFsaWFzaW5nCisJJmRhdGFfYnl0ZSgweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4KTsKKwkmZGF0YV9ieXRlKDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIpOworCSZkYXRhX2J5dGUoMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4Nyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiKTsKKwkmZGF0YV9ieXRlKDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QpOworCSZkYXRhX2J5dGUoMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSk7CisJJmRhdGFfYnl0ZSgweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyKTsKKwkmZGF0YV9ieXRlKDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUpOworCSZkYXRhX2J5dGUoMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNik7CisJJmRhdGFfYnl0ZSgweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyKTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEpOworCSZkYXRhX2J5dGUoMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhKTsKKwkmZGF0YV9ieXRlKDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYpOworCSZkYXRhX2J5dGUoMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMik7CisJJmRhdGFfYnl0ZSgweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiKTsKKwkmZGF0YV9ieXRlKDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEpOworCSZkYXRhX2J5dGUoMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUpOworCSZkYXRhX2J5dGUoMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSk7CisJJmRhdGFfYnl0ZSgweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiKTsKKwkmZGF0YV9ieXRlKDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjApOworCSZkYXRhX2J5dGUoMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCk7CisJJmRhdGFfYnl0ZSgweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxKTsKKwkmZGF0YV9ieXRlKDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCk7CisJJmRhdGFfYnl0ZSgweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmKTsKKwkmZGF0YV9ieXRlKDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjApOworCSZkYXRhX2J5dGUoMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSk7CisJJmRhdGFfYnl0ZSgweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2KTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QpOworCisJJmRhdGFfYnl0ZSgweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4KTsKKwkmZGF0YV9ieXRlKDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIpOworCSZkYXRhX2J5dGUoMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4Nyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiKTsKKwkmZGF0YV9ieXRlKDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QpOworCSZkYXRhX2J5dGUoMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSk7CisJJmRhdGFfYnl0ZSgweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyKTsKKwkmZGF0YV9ieXRlKDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUpOworCSZkYXRhX2J5dGUoMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNik7CisJJmRhdGFfYnl0ZSgweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyKTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEpOworCSZkYXRhX2J5dGUoMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhKTsKKwkmZGF0YV9ieXRlKDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYpOworCSZkYXRhX2J5dGUoMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMik7CisJJmRhdGFfYnl0ZSgweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiKTsKKwkmZGF0YV9ieXRlKDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEpOworCSZkYXRhX2J5dGUoMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUpOworCSZkYXRhX2J5dGUoMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSk7CisJJmRhdGFfYnl0ZSgweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiKTsKKwkmZGF0YV9ieXRlKDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjApOworCSZkYXRhX2J5dGUoMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCk7CisJJmRhdGFfYnl0ZSgweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxKTsKKwkmZGF0YV9ieXRlKDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCk7CisJJmRhdGFfYnl0ZSgweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmKTsKKwkmZGF0YV9ieXRlKDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjApOworCSZkYXRhX2J5dGUoMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSk7CisJJmRhdGFfYnl0ZSgweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2KTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QpOworCisJJmRhdGFfYnl0ZSgweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4KTsKKwkmZGF0YV9ieXRlKDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIpOworCSZkYXRhX2J5dGUoMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4Nyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiKTsKKwkmZGF0YV9ieXRlKDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QpOworCSZkYXRhX2J5dGUoMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSk7CisJJmRhdGFfYnl0ZSgweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyKTsKKwkmZGF0YV9ieXRlKDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUpOworCSZkYXRhX2J5dGUoMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNik7CisJJmRhdGFfYnl0ZSgweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyKTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEpOworCSZkYXRhX2J5dGUoMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhKTsKKwkmZGF0YV9ieXRlKDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYpOworCSZkYXRhX2J5dGUoMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMik7CisJJmRhdGFfYnl0ZSgweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiKTsKKwkmZGF0YV9ieXRlKDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEpOworCSZkYXRhX2J5dGUoMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUpOworCSZkYXRhX2J5dGUoMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSk7CisJJmRhdGFfYnl0ZSgweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiKTsKKwkmZGF0YV9ieXRlKDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjApOworCSZkYXRhX2J5dGUoMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCk7CisJJmRhdGFfYnl0ZSgweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxKTsKKwkmZGF0YV9ieXRlKDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCk7CisJJmRhdGFfYnl0ZSgweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmKTsKKwkmZGF0YV9ieXRlKDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjApOworCSZkYXRhX2J5dGUoMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSk7CisJJmRhdGFfYnl0ZSgweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2KTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QpOworCisJJmRhdGFfYnl0ZSgweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4KTsKKwkmZGF0YV9ieXRlKDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIpOworCSZkYXRhX2J5dGUoMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4Nyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiKTsKKwkmZGF0YV9ieXRlKDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QpOworCSZkYXRhX2J5dGUoMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSk7CisJJmRhdGFfYnl0ZSgweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyKTsKKwkmZGF0YV9ieXRlKDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUpOworCSZkYXRhX2J5dGUoMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNik7CisJJmRhdGFfYnl0ZSgweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyKTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEpOworCSZkYXRhX2J5dGUoMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhKTsKKwkmZGF0YV9ieXRlKDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYpOworCSZkYXRhX2J5dGUoMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMik7CisJJmRhdGFfYnl0ZSgweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiKTsKKwkmZGF0YV9ieXRlKDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEpOworCSZkYXRhX2J5dGUoMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUpOworCSZkYXRhX2J5dGUoMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSk7CisJJmRhdGFfYnl0ZSgweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiKTsKKwkmZGF0YV9ieXRlKDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjApOworCSZkYXRhX2J5dGUoMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCk7CisJJmRhdGFfYnl0ZSgweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxKTsKKwkmZGF0YV9ieXRlKDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCk7CisJJmRhdGFfYnl0ZSgweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmKTsKKwkmZGF0YV9ieXRlKDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjApOworCSZkYXRhX2J5dGUoMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSk7CisJJmRhdGFfYnl0ZSgweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2KTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QpOworJmZ1bmN0aW9uX2VuZF9CKCJfeDg2X0FFU19kZWNyeXB0Iik7CisKKyMgdm9pZCBBRVNfZGVjcnlwdCAoY29uc3Qgdm9pZCAqaW5wLHZvaWQgKm91dCxjb25zdCBBRVNfS0VZICprZXkpOworJmZ1bmN0aW9uX2JlZ2luKCJBRVNfZGVjcnlwdCIpOworCSZtb3YJKCRhY2MsJndwYXJhbSgwKSk7CQkjIGxvYWQgaW5wCisJJm1vdgkoJGtleSwmd3BhcmFtKDIpKTsJCSMgbG9hZCBrZXkKKworCSZtb3YJKCRzMCwiZXNwIik7CisJJnN1YgkoImVzcCIsMzYpOworCSZhbmQJKCJlc3AiLC02NCk7CQkJIyBhbGlnbiB0byBjYWNoZS1saW5lCisKKwkjIHBsYWNlIHN0YWNrIGZyYW1lIGp1c3QgImFib3ZlIiB0aGUga2V5IHNjaGVkdWxlCisJJmxlYQkoJHMxLCZEV1AoLTY0LTYzLCRrZXkpKTsKKwkmc3ViCSgkczEsImVzcCIpOworCSZuZWcJKCRzMSk7CisJJmFuZAkoJHMxLDB4M0MwKTsJIyBtb2R1bG8gMTAyNCwgYnV0IGFsaWduZWQgdG8gY2FjaGUtbGluZQorCSZzdWIJKCJlc3AiLCRzMSk7CisJJmFkZAkoImVzcCIsNCk7CSMgNCBpcyByZXNlcnZlZCBmb3IgY2FsbGVyJ3MgcmV0dXJuIGFkZHJlc3MKKwkmbW92CSgkX2VzcCwkczApOwkjIHNhdmUgc3RhY2sgcG9pbnRlcgorCisJJmNhbGwgICAoJmxhYmVsKCJwaWNfcG9pbnQiKSk7ICAgICAgICAgICMgbWFrZSBpdCBQSUMhCisJJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCR0YmwpOworCSZwaWNtZXVwKCRzMCwiT1BFTlNTTF9pYTMyY2FwX1AiLCR0YmwsJmxhYmVsKCJwaWNfcG9pbnQiKSkgaWYoISR4ODZvbmx5KTsKKwkmbGVhICAgICgkdGJsLCZEV1AoJmxhYmVsKCJBRVNfVGQiKS4iLSIuJmxhYmVsKCJwaWNfcG9pbnQiKSwkdGJsKSk7CisKKwkjIHBpY2sgVGQ0IGNvcHkgd2hpY2ggY2FuJ3QgIm92ZXJsYXAiIHdpdGggc3RhY2sgZnJhbWUgb3Iga2V5IHNjaGVkdWxlCisJJmxlYQkoJHMxLCZEV1AoNzY4LTQsImVzcCIpKTsKKwkmc3ViCSgkczEsJHRibCk7CisJJmFuZAkoJHMxLDB4MzAwKTsKKwkmbGVhCSgkdGJsLCZEV1AoMjA0OCsxMjgsJHRibCwkczEpKTsKKworCQkJCQlpZiAoISR4ODZvbmx5KSB7CisJJmJ0CSgmRFdQKDAsJHMwKSwyNSk7CSMgY2hlY2sgZm9yIFNTRSBiaXQKKwkmam5jCSgmbGFiZWwoIng4NiIpKTsKKworCSZtb3ZxCSgibW0wIiwmUVdQKDAsJGFjYykpOworCSZtb3ZxCSgibW00IiwmUVdQKDgsJGFjYykpOworCSZjYWxsCSgiX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0Iik7CisJJm1vdgkoImVzcCIsJF9lc3ApOwkJCSMgcmVzdG9yZSBzdGFjayBwb2ludGVyCisJJm1vdgkoJGFjYywmd3BhcmFtKDEpKTsJCSMgbG9hZCBvdXQKKwkmbW92cQkoJlFXUCgwLCRhY2MpLCJtbTAiKTsJCSMgd3JpdGUgb3V0cHV0IGRhdGEKKwkmbW92cQkoJlFXUCg4LCRhY2MpLCJtbTQiKTsKKwkmZW1tcwkoKTsKKwkmZnVuY3Rpb25fZW5kX0EoKTsKKwkJCQkJfQorCSZzZXRfbGFiZWwoIng4NiIsMTYpOworCSZtb3YJKCRfdGJsLCR0YmwpOworCSZtb3YJKCRzMCwmRFdQKDAsJGFjYykpOwkJIyBsb2FkIGlucHV0IGRhdGEKKwkmbW92CSgkczEsJkRXUCg0LCRhY2MpKTsKKwkmbW92CSgkczIsJkRXUCg4LCRhY2MpKTsKKwkmbW92CSgkczMsJkRXUCgxMiwkYWNjKSk7CisJJmNhbGwJKCJfeDg2X0FFU19kZWNyeXB0X2NvbXBhY3QiKTsKKwkmbW92CSgiZXNwIiwkX2VzcCk7CQkJIyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKwkmbW92CSgkYWNjLCZ3cGFyYW0oMSkpOwkJIyBsb2FkIG91dAorCSZtb3YJKCZEV1AoMCwkYWNjKSwkczApOwkJIyB3cml0ZSBvdXRwdXQgZGF0YQorCSZtb3YJKCZEV1AoNCwkYWNjKSwkczEpOworCSZtb3YJKCZEV1AoOCwkYWNjKSwkczIpOworCSZtb3YJKCZEV1AoMTIsJGFjYyksJHMzKTsKKyZmdW5jdGlvbl9lbmQoIkFFU19kZWNyeXB0Iik7CisKKyMgdm9pZCBBRVNfY2JjX2VuY3J5cHQgKGNvbnN0IHZvaWQgY2hhciAqaW5wLCB1bnNpZ25lZCBjaGFyICpvdXQsCisjCQkJc2l6ZV90IGxlbmd0aCwgY29uc3QgQUVTX0tFWSAqa2V5LAorIwkJCXVuc2lnbmVkIGNoYXIgKml2cCxjb25zdCBpbnQgZW5jKTsKK3sKKyMgc3RhY2sgZnJhbWUgbGF5b3V0CisjICAgICAgICAgICAgIC00KCVlc3ApCQkjIHJldHVybiBhZGRyZXNzCSAwKCVlc3ApCisjICAgICAgICAgICAgICAwKCVlc3ApCQkjIHMwIGJhY2tpbmcgc3RvcmUJIDQoJWVzcCkJCisjICAgICAgICAgICAgICA0KCVlc3ApCQkjIHMxIGJhY2tpbmcgc3RvcmUJIDgoJWVzcCkKKyMgICAgICAgICAgICAgIDgoJWVzcCkJCSMgczIgYmFja2luZyBzdG9yZQkxMiglZXNwKQorIyAgICAgICAgICAgICAxMiglZXNwKQkJIyBzMyBiYWNraW5nIHN0b3JlCTE2KCVlc3ApCisjICAgICAgICAgICAgIDE2KCVlc3ApCQkjIGtleSBiYWNrdXAJCTIwKCVlc3ApCisjICAgICAgICAgICAgIDIwKCVlc3ApCQkjIGVuZCBvZiBrZXkgc2NoZWR1bGUJMjQoJWVzcCkKKyMgICAgICAgICAgICAgMjQoJWVzcCkJCSMgJWVicCBiYWNrdXAJCTI4KCVlc3ApCisjICAgICAgICAgICAgIDI4KCVlc3ApCQkjICVlc3AgYmFja3VwCitteSAkX2lucD0mRFdQKDMyLCJlc3AiKTsJIyBjb3B5IG9mIHdwYXJhbSgwKQorbXkgJF9vdXQ9JkRXUCgzNiwiZXNwIik7CSMgY29weSBvZiB3cGFyYW0oMSkKK215ICRfbGVuPSZEV1AoNDAsImVzcCIpOwkjIGNvcHkgb2Ygd3BhcmFtKDIpCitteSAkX2tleT0mRFdQKDQ0LCJlc3AiKTsJIyBjb3B5IG9mIHdwYXJhbSgzKQorbXkgJF9pdnA9JkRXUCg0OCwiZXNwIik7CSMgY29weSBvZiB3cGFyYW0oNCkKK215ICRfdG1wPSZEV1AoNTIsImVzcCIpOwkjIHZvbGF0aWxlIHZhcmlhYmxlCisjCitteSAkaXZlYz0mRFdQKDYwLCJlc3AiKTsJIyBpdmVjWzE2XQorbXkgJGFlc19rZXk9JkRXUCg3NiwiZXNwIik7CSMgY29weSBvZiBhZXNfa2V5CitteSAkbWFyaz0mRFdQKDc2KzI0MCwiZXNwIik7CSMgY29weSBvZiBhZXNfa2V5LT5yb3VuZHMKKworJmZ1bmN0aW9uX2JlZ2luKCJBRVNfY2JjX2VuY3J5cHQiKTsKKwkmbW92CSgkczIgZXEgImVjeCI/ICRzMiA6ICIiLCZ3cGFyYW0oMikpOwkjIGxvYWQgbGVuCisJJmNtcAkoJHMyLDApOworCSZqZQkoJmxhYmVsKCJkcm9wX291dCIpKTsKKworCSZjYWxsICAgKCZsYWJlbCgicGljX3BvaW50IikpOwkJIyBtYWtlIGl0IFBJQyEKKwkmc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmYmxpbmRwb3AoJHRibCk7CisJJnBpY21ldXAoJHMwLCJPUEVOU1NMX2lhMzJjYXBfUCIsJHRibCwmbGFiZWwoInBpY19wb2ludCIpKSBpZighJHg4Nm9ubHkpOworCisJJmNtcAkoJndwYXJhbSg1KSwwKTsKKwkmbGVhICAgICgkdGJsLCZEV1AoJmxhYmVsKCJBRVNfVGUiKS4iLSIuJmxhYmVsKCJwaWNfcG9pbnQiKSwkdGJsKSk7CisJJmpuZQkoJmxhYmVsKCJwaWNrZWRfdGUiKSk7CisJJmxlYQkoJHRibCwmRFdQKCZsYWJlbCgiQUVTX1RkIikuIi0iLiZsYWJlbCgiQUVTX1RlIiksJHRibCkpOworCSZzZXRfbGFiZWwoInBpY2tlZF90ZSIpOworCisJIyBvbmUgY2FuIGFyZ3VlIGlmIHRoaXMgaXMgcmVxdWlyZWQKKwkmcHVzaGYJKCk7CisJJmNsZAkoKTsKKworCSZjbXAJKCRzMiwkc3BlZWRfbGltaXQpOworCSZqYgkoJmxhYmVsKCJzbG93X3dheSIpKTsKKwkmdGVzdAkoJHMyLDE1KTsKKwkmam56CSgmbGFiZWwoInNsb3dfd2F5IikpOworCQkJCQlpZiAoISR4ODZvbmx5KSB7CisJJmJ0CSgmRFdQKDAsJHMwKSwyOCk7CSMgY2hlY2sgZm9yIGh5cGVyLXRocmVhZGluZyBiaXQKKwkmamMJKCZsYWJlbCgic2xvd193YXkiKSk7CisJCQkJCX0KKwkjIHByZS1hbGxvY2F0ZSBhbGlnbmVkIHN0YWNrIGZyYW1lLi4uCisJJmxlYQkoJGFjYywmRFdQKC04MC0yNDQsImVzcCIpKTsKKwkmYW5kCSgkYWNjLC02NCk7CisKKwkjIC4uLiBhbmQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYWxpYXMgd2l0aCAkdGJsIG1vZHVsbyA0MDk2CisJJm1vdgkoJHMwLCR0YmwpOworCSZsZWEJKCRzMSwmRFdQKDIwNDgrMjU2LCR0YmwpKTsKKwkmbW92CSgkczMsJGFjYyk7CisJJmFuZAkoJHMwLDB4ZmZmKTsJCSMgcyA9ICVlYnAmMHhmZmYKKwkmYW5kCSgkczEsMHhmZmYpOwkJIyBlID0gKCVlYnArMjA0OCsyNTYpJjB4ZmZmCisJJmFuZAkoJHMzLDB4ZmZmKTsJCSMgcCA9ICVlc3AmMHhmZmYKKworCSZjbXAJKCRzMywkczEpOwkJIyBpZiAocD49ZSkgJWVzcCA9LSAocC1lKTsKKwkmamIJKCZsYWJlbCgidGJsX2JyZWFrX291dCIpKTsKKwkmc3ViCSgkczMsJHMxKTsKKwkmc3ViCSgkYWNjLCRzMyk7CisJJmptcAkoJmxhYmVsKCJ0Ymxfb2siKSk7CisJJnNldF9sYWJlbCgidGJsX2JyZWFrX291dCIsNCk7CSMgZWxzZSAlZXNwIC09IChwLXMpJjB4ZmZmICsgZnJhbWVzejsKKwkmc3ViCSgkczMsJHMwKTsKKwkmYW5kCSgkczMsMHhmZmYpOworCSZhZGQJKCRzMywzODQpOworCSZzdWIJKCRhY2MsJHMzKTsKKwkmc2V0X2xhYmVsKCJ0Ymxfb2siLDQpOworCisJJmxlYQkoJHMzLCZ3cGFyYW0oMCkpOwkjIG9idGFpbiBwb2ludGVyIHRvIHBhcmFtZXRlciBibG9jaworCSZleGNoCSgiZXNwIiwkYWNjKTsJCSMgYWxsb2NhdGUgc3RhY2sgZnJhbWUKKwkmYWRkCSgiZXNwIiw0KTsJCSMgcmVzZXJ2ZSBmb3IgcmV0dXJuIGFkZHJlc3MhCisJJm1vdgkoJF90YmwsJHRibCk7CQkjIHNhdmUgJWVicAorCSZtb3YJKCRfZXNwLCRhY2MpOwkJIyBzYXZlICVlc3AKKworCSZtb3YJKCRzMCwmRFdQKDAsJHMzKSk7CSMgbG9hZCBpbnAKKwkmbW92CSgkczEsJkRXUCg0LCRzMykpOwkjIGxvYWQgb3V0CisJIyZtb3YJKCRzMiwmRFdQKDgsJHMzKSk7CSMgbG9hZCBsZW4KKwkmbW92CSgka2V5LCZEV1AoMTIsJHMzKSk7CSMgbG9hZCBrZXkKKwkmbW92CSgkYWNjLCZEV1AoMTYsJHMzKSk7CSMgbG9hZCBpdnAKKwkmbW92CSgkczMsJkRXUCgyMCwkczMpKTsJIyBsb2FkIGVuYyBmbGFnCisKKwkmbW92CSgkX2lucCwkczApOwkJIyBzYXZlIGNvcHkgb2YgaW5wCisJJm1vdgkoJF9vdXQsJHMxKTsJCSMgc2F2ZSBjb3B5IG9mIG91dAorCSZtb3YJKCRfbGVuLCRzMik7CQkjIHNhdmUgY29weSBvZiBsZW4KKwkmbW92CSgkX2tleSwka2V5KTsJCSMgc2F2ZSBjb3B5IG9mIGtleQorCSZtb3YJKCRfaXZwLCRhY2MpOwkJIyBzYXZlIGNvcHkgb2YgaXZwCisKKwkmbW92CSgkbWFyaywwKTsJCSMgY29weSBvZiBhZXNfa2V5LT5yb3VuZHMgPSAwOworCSMgZG8gd2UgY29weSBrZXkgc2NoZWR1bGUgdG8gc3RhY2s/CisJJm1vdgkoJHMxIGVxICJlYngiID8gJHMxIDogIiIsJGtleSk7CisJJm1vdgkoJHMyIGVxICJlY3giID8gJHMyIDogIiIsMjQ0LzQpOworCSZzdWIJKCRzMSwkdGJsKTsKKwkmbW92CSgiZXNpIiwka2V5KTsKKwkmYW5kCSgkczEsMHhmZmYpOworCSZsZWEJKCJlZGkiLCRhZXNfa2V5KTsKKwkmY21wCSgkczEsMjA0OCsyNTYpOworCSZqYgkoJmxhYmVsKCJkb19jb3B5IikpOworCSZjbXAJKCRzMSw0MDk2LTI0NCk7CisJJmpiCSgmbGFiZWwoInNraXBfY29weSIpKTsKKwkmc2V0X2xhYmVsKCJkb19jb3B5Iiw0KTsKKwkJJm1vdgkoJF9rZXksImVkaSIpOworCQkmZGF0YV93b3JkKDB4QTVGM0Y2ODkpOwkjIHJlcCBtb3ZzZAorCSZzZXRfbGFiZWwoInNraXBfY29weSIpOworCisJJm1vdgkoJGtleSwxNik7CisJJnNldF9sYWJlbCgicHJlZmV0Y2hfdGJsIiw0KTsKKwkJJm1vdgkoJHMwLCZEV1AoMCwkdGJsKSk7CisJCSZtb3YJKCRzMSwmRFdQKDMyLCR0YmwpKTsKKwkJJm1vdgkoJHMyLCZEV1AoNjQsJHRibCkpOworCQkmbW92CSgkYWNjLCZEV1AoOTYsJHRibCkpOworCQkmbGVhCSgkdGJsLCZEV1AoMTI4LCR0YmwpKTsKKwkJJnN1YgkoJGtleSwxKTsKKwkmam56CSgmbGFiZWwoInByZWZldGNoX3RibCIpKTsKKwkmc3ViCSgkdGJsLDIwNDgpOworCisJJm1vdgkoJGFjYywkX2lucCk7CisJJm1vdgkoJGtleSwkX2l2cCk7CisKKwkmY21wCSgkczMsMCk7CisJJmplCSgmbGFiZWwoImZhc3RfZGVjcnlwdCIpKTsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEVOQ1JZUFQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisJJm1vdgkoJHMwLCZEV1AoMCwka2V5KSk7CQkjIGxvYWQgaXYKKwkmbW92CSgkczEsJkRXUCg0LCRrZXkpKTsKKworCSZzZXRfbGFiZWwoImZhc3RfZW5jX2xvb3AiLDE2KTsKKwkJJm1vdgkoJHMyLCZEV1AoOCwka2V5KSk7CisJCSZtb3YJKCRzMywmRFdQKDEyLCRrZXkpKTsKKworCQkmeG9yCSgkczAsJkRXUCgwLCRhY2MpKTsJIyB4b3IgaW5wdXQgZGF0YQorCQkmeG9yCSgkczEsJkRXUCg0LCRhY2MpKTsKKwkJJnhvcgkoJHMyLCZEV1AoOCwkYWNjKSk7CisJCSZ4b3IJKCRzMywmRFdQKDEyLCRhY2MpKTsKKworCQkmbW92CSgka2V5LCRfa2V5KTsJCSMgbG9hZCBrZXkKKwkJJmNhbGwJKCJfeDg2X0FFU19lbmNyeXB0Iik7CisKKwkJJm1vdgkoJGFjYywkX2lucCk7CQkjIGxvYWQgaW5wCisJCSZtb3YJKCRrZXksJF9vdXQpOwkJIyBsb2FkIG91dAorCisJCSZtb3YJKCZEV1AoMCwka2V5KSwkczApOwkjIHNhdmUgb3V0cHV0IGRhdGEKKwkJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwka2V5KSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkJJmxlYQkoJGFjYywmRFdQKDE2LCRhY2MpKTsJIyBhZHZhbmNlIGlucAorCQkmbW92CSgkczIsJF9sZW4pOwkJIyBsb2FkIGxlbgorCQkmbW92CSgkX2lucCwkYWNjKTsJCSMgc2F2ZSBpbnAKKwkJJmxlYQkoJHMzLCZEV1AoMTYsJGtleSkpOwkjIGFkdmFuY2Ugb3V0CisJCSZtb3YJKCRfb3V0LCRzMyk7CQkjIHNhdmUgb3V0CisJCSZzdWIJKCRzMiwxNik7CQkjIGRlY3JlYXNlIGxlbgorCQkmbW92CSgkX2xlbiwkczIpOwkJIyBzYXZlIGxlbgorCSZqbnoJKCZsYWJlbCgiZmFzdF9lbmNfbG9vcCIpKTsKKwkmbW92CSgkYWNjLCRfaXZwKTsJCSMgbG9hZCBpdnAKKwkmbW92CSgkczIsJkRXUCg4LCRrZXkpKTsJIyByZXN0b3JlIGxhc3QgMiBkd29yZHMKKwkmbW92CSgkczMsJkRXUCgxMiwka2V5KSk7CisJJm1vdgkoJkRXUCgwLCRhY2MpLCRzMCk7CSMgc2F2ZSBpdmVjCisJJm1vdgkoJkRXUCg0LCRhY2MpLCRzMSk7CisJJm1vdgkoJkRXUCg4LCRhY2MpLCRzMik7CisJJm1vdgkoJkRXUCgxMiwkYWNjKSwkczMpOworCisJJmNtcAkoJG1hcmssMCk7CQkjIHdhcyB0aGUga2V5IHNjaGVkdWxlIGNvcGllZD8KKwkmbW92CSgiZWRpIiwkX2tleSk7CisJJmplCSgmbGFiZWwoInNraXBfZXplcm8iKSk7CisJIyB6ZXJvIGNvcHkgb2Yga2V5IHNjaGVkdWxlCisJJm1vdgkoImVjeCIsMjQwLzQpOworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmYWxpZ24JKDQpOworCSZkYXRhX3dvcmQoMHhBQkYzRjY4OSk7CSMgcmVwIHN0b3NkCisJJnNldF9sYWJlbCgic2tpcF9lemVybyIpCisJJm1vdgkoImVzcCIsJF9lc3ApOworCSZwb3BmCSgpOworICAgICZzZXRfbGFiZWwoImRyb3Bfb3V0Iik7CisJJmZ1bmN0aW9uX2VuZF9BKCk7CisJJnB1c2hmCSgpOwkJCSMga2x1ZGdlLCBuZXZlciBleGVjdXRlZAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gREVDUllQVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyZzZXRfbGFiZWwoImZhc3RfZGVjcnlwdCIsMTYpOworCisJJmNtcAkoJGFjYywkX291dCk7CisJJmplCSgmbGFiZWwoImZhc3RfZGVjX2luX3BsYWNlIikpOwkjIGluLXBsYWNlIHByb2Nlc3NpbmcuLi4KKworCSZtb3YJKCRfdG1wLCRrZXkpOworCisJJmFsaWduCSg0KTsKKwkmc2V0X2xhYmVsKCJmYXN0X2RlY19sb29wIiwxNik7CisJCSZtb3YJKCRzMCwmRFdQKDAsJGFjYykpOwkjIHJlYWQgaW5wdXQKKwkJJm1vdgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJCSZtb3YJKCRzMiwmRFdQKDgsJGFjYykpOworCQkmbW92CSgkczMsJkRXUCgxMiwkYWNjKSk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CQkjIGxvYWQga2V5CisJCSZjYWxsCSgiX3g4Nl9BRVNfZGVjcnlwdCIpOworCisJCSZtb3YJKCRrZXksJF90bXApOwkJIyBsb2FkIGl2cAorCQkmbW92CSgkYWNjLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJnhvcgkoJHMwLCZEV1AoMCwka2V5KSk7CSMgeG9yIGl2CisJCSZ4b3IJKCRzMSwmRFdQKDQsJGtleSkpOworCQkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkJJnhvcgkoJHMzLCZEV1AoMTIsJGtleSkpOworCisJCSZtb3YJKCRrZXksJF9vdXQpOwkJIyBsb2FkIG91dAorCQkmbW92CSgkYWNjLCRfaW5wKTsJCSMgbG9hZCBpbnAKKworCQkmbW92CSgmRFdQKDAsJGtleSksJHMwKTsJIyB3cml0ZSBvdXRwdXQKKwkJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwka2V5KSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkJJm1vdgkoJHMyLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJm1vdgkoJF90bXAsJGFjYyk7CQkjIHNhdmUgaXZwCisJCSZsZWEJKCRhY2MsJkRXUCgxNiwkYWNjKSk7CSMgYWR2YW5jZSBpbnAKKwkJJm1vdgkoJF9pbnAsJGFjYyk7CQkjIHNhdmUgaW5wCisJCSZsZWEJKCRrZXksJkRXUCgxNiwka2V5KSk7CSMgYWR2YW5jZSBvdXQKKwkJJm1vdgkoJF9vdXQsJGtleSk7CQkjIHNhdmUgb3V0CisJCSZzdWIJKCRzMiwxNik7CQkjIGRlY3JlYXNlIGxlbgorCQkmbW92CSgkX2xlbiwkczIpOwkJIyBzYXZlIGxlbgorCSZqbnoJKCZsYWJlbCgiZmFzdF9kZWNfbG9vcCIpKTsKKwkmbW92CSgka2V5LCRfdG1wKTsJCSMgbG9hZCB0ZW1wIGl2cAorCSZtb3YJKCRhY2MsJF9pdnApOwkJIyBsb2FkIHVzZXIgaXZwCisJJm1vdgkoJHMwLCZEV1AoMCwka2V5KSk7CSMgbG9hZCBpdgorCSZtb3YJKCRzMSwmRFdQKDQsJGtleSkpOworCSZtb3YJKCRzMiwmRFdQKDgsJGtleSkpOworCSZtb3YJKCRzMywmRFdQKDEyLCRrZXkpKTsKKwkmbW92CSgmRFdQKDAsJGFjYyksJHMwKTsJIyBjb3B5IGJhY2sgdG8gdXNlcgorCSZtb3YJKCZEV1AoNCwkYWNjKSwkczEpOworCSZtb3YJKCZEV1AoOCwkYWNjKSwkczIpOworCSZtb3YJKCZEV1AoMTIsJGFjYyksJHMzKTsKKwkmam1wCSgmbGFiZWwoImZhc3RfZGVjX291dCIpKTsKKworICAgICZzZXRfbGFiZWwoImZhc3RfZGVjX2luX3BsYWNlIiwxNik7CisJJnNldF9sYWJlbCgiZmFzdF9kZWNfaW5fcGxhY2VfbG9vcCIpOworCQkmbW92CSgkczAsJkRXUCgwLCRhY2MpKTsJIyByZWFkIGlucHV0CisJCSZtb3YJKCRzMSwmRFdQKDQsJGFjYykpOworCQkmbW92CSgkczIsJkRXUCg4LCRhY2MpKTsKKwkJJm1vdgkoJHMzLCZEV1AoMTIsJGFjYykpOworCisJCSZsZWEJKCRrZXksJGl2ZWMpOworCQkmbW92CSgmRFdQKDAsJGtleSksJHMwKTsJIyBjb3B5IHRvIHRlbXAKKwkJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwka2V5KSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CQkjIGxvYWQga2V5CisJCSZjYWxsCSgiX3g4Nl9BRVNfZGVjcnlwdCIpOworCisJCSZtb3YJKCRrZXksJF9pdnApOwkJIyBsb2FkIGl2cAorCQkmbW92CSgkYWNjLCRfb3V0KTsJCSMgbG9hZCBvdXQKKwkJJnhvcgkoJHMwLCZEV1AoMCwka2V5KSk7CSMgeG9yIGl2CisJCSZ4b3IJKCRzMSwmRFdQKDQsJGtleSkpOworCQkmeG9yCSgkczIsJkRXUCg4LCRrZXkpKTsKKwkJJnhvcgkoJHMzLCZEV1AoMTIsJGtleSkpOworCisJCSZtb3YJKCZEV1AoMCwkYWNjKSwkczApOwkjIHdyaXRlIG91dHB1dAorCQkmbW92CSgmRFdQKDQsJGFjYyksJHMxKTsKKwkJJm1vdgkoJkRXUCg4LCRhY2MpLCRzMik7CisJCSZtb3YJKCZEV1AoMTIsJGFjYyksJHMzKTsKKworCQkmbGVhCSgkYWNjLCZEV1AoMTYsJGFjYykpOwkjIGFkdmFuY2Ugb3V0CisJCSZtb3YJKCRfb3V0LCRhY2MpOwkJIyBzYXZlIG91dAorCisJCSZsZWEJKCRhY2MsJGl2ZWMpOworCQkmbW92CSgkczAsJkRXUCgwLCRhY2MpKTsJIyByZWFkIHRlbXAKKwkJJm1vdgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJCSZtb3YJKCRzMiwmRFdQKDgsJGFjYykpOworCQkmbW92CSgkczMsJkRXUCgxMiwkYWNjKSk7CisKKwkJJm1vdgkoJkRXUCgwLCRrZXkpLCRzMCk7CSMgY29weSBpdgorCQkmbW92CSgmRFdQKDQsJGtleSksJHMxKTsKKwkJJm1vdgkoJkRXUCg4LCRrZXkpLCRzMik7CisJCSZtb3YJKCZEV1AoMTIsJGtleSksJHMzKTsKKworCQkmbW92CSgkYWNjLCRfaW5wKTsJCSMgbG9hZCBpbnAKKwkJJm1vdgkoJHMyLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJmxlYQkoJGFjYywmRFdQKDE2LCRhY2MpKTsJIyBhZHZhbmNlIGlucAorCQkmbW92CSgkX2lucCwkYWNjKTsJCSMgc2F2ZSBpbnAKKwkJJnN1YgkoJHMyLDE2KTsJCSMgZGVjcmVhc2UgbGVuCisJCSZtb3YJKCRfbGVuLCRzMik7CQkjIHNhdmUgbGVuCisJJmpuegkoJmxhYmVsKCJmYXN0X2RlY19pbl9wbGFjZV9sb29wIikpOworCisgICAgJnNldF9sYWJlbCgiZmFzdF9kZWNfb3V0Iiw0KTsKKwkmY21wCSgkbWFyaywwKTsJCSMgd2FzIHRoZSBrZXkgc2NoZWR1bGUgY29waWVkPworCSZtb3YJKCJlZGkiLCRfa2V5KTsKKwkmamUJKCZsYWJlbCgic2tpcF9kemVybyIpKTsKKwkjIHplcm8gY29weSBvZiBrZXkgc2NoZWR1bGUKKwkmbW92CSgiZWN4IiwyNDAvNCk7CisJJnhvcgkoImVheCIsImVheCIpOworCSZhbGlnbgkoNCk7CisJJmRhdGFfd29yZCgweEFCRjNGNjg5KTsJIyByZXAgc3Rvc2QKKwkmc2V0X2xhYmVsKCJza2lwX2R6ZXJvIikKKwkmbW92CSgiZXNwIiwkX2VzcCk7CisJJnBvcGYJKCk7CisJJmZ1bmN0aW9uX2VuZF9BKCk7CisJJnB1c2hmCSgpOwkJCSMga2x1ZGdlLCBuZXZlciBleGVjdXRlZAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNMT1cgUk9VVElORSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCismc2V0X2xhYmVsKCJzbG93X3dheSIsMTYpOworCisJJm1vdgkoJHMwLCZEV1AoMCwkczApKSBpZiAoISR4ODZvbmx5KTsjIGxvYWQgT1BFTlNTTF9pYTMyY2FwCisJJm1vdgkoJGtleSwmd3BhcmFtKDMpKTsJIyBsb2FkIGtleQorCisJIyBwcmUtYWxsb2NhdGUgYWxpZ25lZCBzdGFjayBmcmFtZS4uLgorCSZsZWEJKCRhY2MsJkRXUCgtODAsImVzcCIpKTsKKwkmYW5kCSgkYWNjLC02NCk7CisKKwkjIC4uLiBhbmQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYWxpYXMgd2l0aCAka2V5IG1vZHVsbyAxMDI0CisJJmxlYQkoJHMxLCZEV1AoLTgwLTYzLCRrZXkpKTsKKwkmc3ViCSgkczEsJGFjYyk7CisJJm5lZwkoJHMxKTsKKwkmYW5kCSgkczEsMHgzQzApOwkjIG1vZHVsbyAxMDI0LCBidXQgYWxpZ25lZCB0byBjYWNoZS1saW5lCisJJnN1YgkoJGFjYywkczEpOworCisJIyBwaWNrIFMtYm94IGNvcHkgd2hpY2ggY2FuJ3Qgb3ZlcmxhcCB3aXRoIHN0YWNrIGZyYW1lIG9yICRrZXkKKwkmbGVhCSgkczEsJkRXUCg3NjgsJGFjYykpOworCSZzdWIJKCRzMSwkdGJsKTsKKwkmYW5kCSgkczEsMHgzMDApOworCSZsZWEJKCR0YmwsJkRXUCgyMDQ4KzEyOCwkdGJsLCRzMSkpOworCisJJmxlYQkoJHMzLCZ3cGFyYW0oMCkpOwkjIHBvaW50ZXIgdG8gcGFyYW1ldGVyIGJsb2NrCisKKwkmZXhjaAkoImVzcCIsJGFjYyk7CisJJmFkZAkoImVzcCIsNCk7CQkjIHJlc2VydmUgZm9yIHJldHVybiBhZGRyZXNzIQorCSZtb3YJKCRfdGJsLCR0YmwpOwkJIyBzYXZlICVlYnAKKwkmbW92CSgkX2VzcCwkYWNjKTsJCSMgc2F2ZSAlZXNwCisJJm1vdgkoJF90bXAsJHMwKTsJCSMgc2F2ZSBPUEVOU1NMX2lhMzJjYXAKKworCSZtb3YJKCRzMCwmRFdQKDAsJHMzKSk7CSMgbG9hZCBpbnAKKwkmbW92CSgkczEsJkRXUCg0LCRzMykpOwkjIGxvYWQgb3V0CisJIyZtb3YJKCRzMiwmRFdQKDgsJHMzKSk7CSMgbG9hZCBsZW4KKwkjJm1vdgkoJGtleSwmRFdQKDEyLCRzMykpOwkjIGxvYWQga2V5CisJJm1vdgkoJGFjYywmRFdQKDE2LCRzMykpOwkjIGxvYWQgaXZwCisJJm1vdgkoJHMzLCZEV1AoMjAsJHMzKSk7CSMgbG9hZCBlbmMgZmxhZworCisJJm1vdgkoJF9pbnAsJHMwKTsJCSMgc2F2ZSBjb3B5IG9mIGlucAorCSZtb3YJKCRfb3V0LCRzMSk7CQkjIHNhdmUgY29weSBvZiBvdXQKKwkmbW92CSgkX2xlbiwkczIpOwkJIyBzYXZlIGNvcHkgb2YgbGVuCisJJm1vdgkoJF9rZXksJGtleSk7CQkjIHNhdmUgY29weSBvZiBrZXkKKwkmbW92CSgkX2l2cCwkYWNjKTsJCSMgc2F2ZSBjb3B5IG9mIGl2cAorCisJJm1vdgkoJGtleSwkYWNjKTsKKwkmbW92CSgkYWNjLCRzMCk7CisKKwkmY21wCSgkczMsMCk7CisJJmplCSgmbGFiZWwoInNsb3dfZGVjcnlwdCIpKTsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTE9XIEVOQ1JZUFQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCSZjbXAJKCRzMiwxNik7CisJJm1vdgkoJHMzLCRzMSk7CisJJmpiCSgmbGFiZWwoInNsb3dfZW5jX3RhaWwiKSk7CisKKwkJCQkJaWYgKCEkeDg2b25seSkgeworCSZidAkoJF90bXAsMjUpOwkJIyBjaGVjayBmb3IgU1NFIGJpdAorCSZqbmMJKCZsYWJlbCgic2xvd19lbmNfeDg2IikpOworCisJJm1vdnEJKCJtbTAiLCZRV1AoMCwka2V5KSk7CSMgbG9hZCBpdgorCSZtb3ZxCSgibW00IiwmUVdQKDgsJGtleSkpOworCisJJnNldF9sYWJlbCgic2xvd19lbmNfbG9vcF9zc2UiLDE2KTsKKwkJJnB4b3IJKCJtbTAiLCZRV1AoMCwkYWNjKSk7CSMgeG9yIGlucHV0IGRhdGEKKwkJJnB4b3IJKCJtbTQiLCZRV1AoOCwkYWNjKSk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CisJCSZjYWxsCSgiX3NzZV9BRVNfZW5jcnlwdF9jb21wYWN0Iik7CisKKwkJJm1vdgkoJGFjYywkX2lucCk7CQkjIGxvYWQgaW5wCisJCSZtb3YJKCRrZXksJF9vdXQpOwkJIyBsb2FkIG91dAorCQkmbW92CSgkczIsJF9sZW4pOwkJIyBsb2FkIGxlbgorCisJCSZtb3ZxCSgmUVdQKDAsJGtleSksIm1tMCIpOwkjIHNhdmUgb3V0cHV0IGRhdGEKKwkJJm1vdnEJKCZRV1AoOCwka2V5KSwibW00Iik7CisKKwkJJmxlYQkoJGFjYywmRFdQKDE2LCRhY2MpKTsJIyBhZHZhbmNlIGlucAorCQkmbW92CSgkX2lucCwkYWNjKTsJCSMgc2F2ZSBpbnAKKwkJJmxlYQkoJHMzLCZEV1AoMTYsJGtleSkpOwkjIGFkdmFuY2Ugb3V0CisJCSZtb3YJKCRfb3V0LCRzMyk7CQkjIHNhdmUgb3V0CisJCSZzdWIJKCRzMiwxNik7CQkjIGRlY3JlYXNlIGxlbgorCQkmY21wCSgkczIsMTYpOworCQkmbW92CSgkX2xlbiwkczIpOwkJIyBzYXZlIGxlbgorCSZqYWUJKCZsYWJlbCgic2xvd19lbmNfbG9vcF9zc2UiKSk7CisJJnRlc3QJKCRzMiwxNSk7CisJJmpuegkoJmxhYmVsKCJzbG93X2VuY190YWlsIikpOworCSZtb3YJKCRhY2MsJF9pdnApOwkJIyBsb2FkIGl2cAorCSZtb3ZxCSgmUVdQKDAsJGFjYyksIm1tMCIpOwkjIHNhdmUgaXZlYworCSZtb3ZxCSgmUVdQKDgsJGFjYyksIm1tNCIpOworCSZlbW1zCSgpOworCSZtb3YJKCJlc3AiLCRfZXNwKTsKKwkmcG9wZgkoKTsKKwkmZnVuY3Rpb25fZW5kX0EoKTsKKwkmcHVzaGYJKCk7CQkJIyBrbHVkZ2UsIG5ldmVyIGV4ZWN1dGVkCisJCQkJCX0KKyAgICAmc2V0X2xhYmVsKCJzbG93X2VuY194ODYiLDE2KTsKKwkmbW92CSgkczAsJkRXUCgwLCRrZXkpKTsJIyBsb2FkIGl2CisJJm1vdgkoJHMxLCZEV1AoNCwka2V5KSk7CisKKwkmc2V0X2xhYmVsKCJzbG93X2VuY19sb29wX3g4NiIsNCk7CisJCSZtb3YJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmbW92CSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkJJnhvcgkoJHMwLCZEV1AoMCwkYWNjKSk7CSMgeG9yIGlucHV0IGRhdGEKKwkJJnhvcgkoJHMxLCZEV1AoNCwkYWNjKSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGFjYykpOworCQkmeG9yCSgkczMsJkRXUCgxMiwkYWNjKSk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CQkjIGxvYWQga2V5CisJCSZjYWxsCSgiX3g4Nl9BRVNfZW5jcnlwdF9jb21wYWN0Iik7CisKKwkJJm1vdgkoJGFjYywkX2lucCk7CQkjIGxvYWQgaW5wCisJCSZtb3YJKCRrZXksJF9vdXQpOwkJIyBsb2FkIG91dAorCisJCSZtb3YJKCZEV1AoMCwka2V5KSwkczApOwkjIHNhdmUgb3V0cHV0IGRhdGEKKwkJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwka2V5KSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkJJm1vdgkoJHMyLCRfbGVuKTsJCSMgbG9hZCBsZW4KKwkJJmxlYQkoJGFjYywmRFdQKDE2LCRhY2MpKTsJIyBhZHZhbmNlIGlucAorCQkmbW92CSgkX2lucCwkYWNjKTsJCSMgc2F2ZSBpbnAKKwkJJmxlYQkoJHMzLCZEV1AoMTYsJGtleSkpOwkjIGFkdmFuY2Ugb3V0CisJCSZtb3YJKCRfb3V0LCRzMyk7CQkjIHNhdmUgb3V0CisJCSZzdWIJKCRzMiwxNik7CQkjIGRlY3JlYXNlIGxlbgorCQkmY21wCSgkczIsMTYpOworCQkmbW92CSgkX2xlbiwkczIpOwkJIyBzYXZlIGxlbgorCSZqYWUJKCZsYWJlbCgic2xvd19lbmNfbG9vcF94ODYiKSk7CisJJnRlc3QJKCRzMiwxNSk7CisJJmpuegkoJmxhYmVsKCJzbG93X2VuY190YWlsIikpOworCSZtb3YJKCRhY2MsJF9pdnApOwkJIyBsb2FkIGl2cAorCSZtb3YJKCRzMiwmRFdQKDgsJGtleSkpOwkjIHJlc3RvcmUgbGFzdCBkd29yZHMKKwkmbW92CSgkczMsJkRXUCgxMiwka2V5KSk7CisJJm1vdgkoJkRXUCgwLCRhY2MpLCRzMCk7CSMgc2F2ZSBpdmVjCisJJm1vdgkoJkRXUCg0LCRhY2MpLCRzMSk7CisJJm1vdgkoJkRXUCg4LCRhY2MpLCRzMik7CisJJm1vdgkoJkRXUCgxMiwkYWNjKSwkczMpOworCisJJm1vdgkoImVzcCIsJF9lc3ApOworCSZwb3BmCSgpOworCSZmdW5jdGlvbl9lbmRfQSgpOworCSZwdXNoZgkoKTsJCQkjIGtsdWRnZSwgbmV2ZXIgZXhlY3V0ZWQKKworICAgICZzZXRfbGFiZWwoInNsb3dfZW5jX3RhaWwiLDE2KTsKKwkmZW1tcwkoKQlpZiAoISR4ODZvbmx5KTsKKwkmbW92CSgka2V5IGVxICJlZGkiPyAka2V5OiIiLCRzMyk7CSMgbG9hZCBvdXQgdG8gZWRpCisJJm1vdgkoJHMxLDE2KTsKKwkmc3ViCSgkczEsJHMyKTsKKwkmY21wCSgka2V5LCRhY2MgZXEgImVzaSI/ICRhY2M6IiIpOwkjIGNvbXBhcmUgd2l0aCBpbnAKKwkmamUJKCZsYWJlbCgiZW5jX2luX3BsYWNlIikpOworCSZhbGlnbgkoNCk7CisJJmRhdGFfd29yZCgweEE0RjNGNjg5KTsJIyByZXAgbW92c2IJIyBjb3B5IGlucHV0CisJJmptcAkoJmxhYmVsKCJlbmNfc2tpcF9pbl9wbGFjZSIpKTsKKyAgICAmc2V0X2xhYmVsKCJlbmNfaW5fcGxhY2UiKTsKKwkmbGVhCSgka2V5LCZEV1AoMCwka2V5LCRzMikpOworICAgICZzZXRfbGFiZWwoImVuY19za2lwX2luX3BsYWNlIik7CisJJm1vdgkoJHMyLCRzMSk7CisJJnhvcgkoJHMwLCRzMCk7CisJJmFsaWduCSg0KTsKKwkmZGF0YV93b3JkKDB4QUFGM0Y2ODkpOwkjIHJlcCBzdG9zYgkjIHplcm8gdGFpbAorCisJJm1vdgkoJGtleSwkX2l2cCk7CQkJIyByZXN0b3JlIGl2cAorCSZtb3YJKCRhY2MsJHMzKTsJCQkjIG91dHB1dCBhcyBpbnB1dAorCSZtb3YJKCRzMCwmRFdQKDAsJGtleSkpOworCSZtb3YJKCRzMSwmRFdQKDQsJGtleSkpOworCSZtb3YJKCRfbGVuLDE2KTsJCQkjIGxlbj0xNgorCSZqbXAJKCZsYWJlbCgic2xvd19lbmNfbG9vcF94ODYiKSk7CSMgb25lIG1vcmUgc3Bpbi4uLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNMT1cgREVDUllQVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCismc2V0X2xhYmVsKCJzbG93X2RlY3J5cHQiLDE2KTsKKwkJCQkJaWYgKCEkeDg2b25seSkgeworCSZidAkoJF90bXAsMjUpOwkJIyBjaGVjayBmb3IgU1NFIGJpdAorCSZqbmMJKCZsYWJlbCgic2xvd19kZWNfbG9vcF94ODYiKSk7CisKKwkmc2V0X2xhYmVsKCJzbG93X2RlY19sb29wX3NzZSIsNCk7CisJCSZtb3ZxCSgibW0wIiwmUVdQKDAsJGFjYykpOwkjIHJlYWQgaW5wdXQKKwkJJm1vdnEJKCJtbTQiLCZRV1AoOCwkYWNjKSk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CisJCSZjYWxsCSgiX3NzZV9BRVNfZGVjcnlwdF9jb21wYWN0Iik7CisKKwkJJm1vdgkoJGFjYywkX2lucCk7CQkjIGxvYWQgaW5wCisJCSZsZWEJKCRzMCwkaXZlYyk7CisJCSZtb3YJKCRzMSwkX291dCk7CQkjIGxvYWQgb3V0CisJCSZtb3YJKCRzMiwkX2xlbik7CQkjIGxvYWQgbGVuCisJCSZtb3YJKCRrZXksJF9pdnApOwkJIyBsb2FkIGl2cAorCisJCSZtb3ZxCSgibW0xIiwmUVdQKDAsJGFjYykpOwkjIHJlLXJlYWQgaW5wdXQKKwkJJm1vdnEJKCJtbTUiLCZRV1AoOCwkYWNjKSk7CisKKwkJJnB4b3IJKCJtbTAiLCZRV1AoMCwka2V5KSk7CSMgeG9yIGl2CisJCSZweG9yCSgibW00IiwmUVdQKDgsJGtleSkpOworCisJCSZtb3ZxCSgmUVdQKDAsJGtleSksIm1tMSIpOwkjIGNvcHkgaW5wdXQgdG8gaXYKKwkJJm1vdnEJKCZRV1AoOCwka2V5KSwibW01Iik7CisKKwkJJnN1YgkoJHMyLDE2KTsJCSMgZGVjcmVhc2UgbGVuCisJCSZqYwkoJmxhYmVsKCJzbG93X2RlY19wYXJ0aWFsX3NzZSIpKTsKKworCQkmbW92cQkoJlFXUCgwLCRzMSksIm1tMCIpOwkjIHdyaXRlIG91dHB1dAorCQkmbW92cQkoJlFXUCg4LCRzMSksIm1tNCIpOworCisJCSZsZWEJKCRzMSwmRFdQKDE2LCRzMSkpOwkjIGFkdmFuY2Ugb3V0CisJCSZtb3YJKCRfb3V0LCRzMSk7CQkjIHNhdmUgb3V0CisJCSZsZWEJKCRhY2MsJkRXUCgxNiwkYWNjKSk7CSMgYWR2YW5jZSBpbnAKKwkJJm1vdgkoJF9pbnAsJGFjYyk7CQkjIHNhdmUgaW5wCisJCSZtb3YJKCRfbGVuLCRzMik7CQkjIHNhdmUgbGVuCisJJmpuegkoJmxhYmVsKCJzbG93X2RlY19sb29wX3NzZSIpKTsKKwkmZW1tcwkoKTsKKwkmbW92CSgiZXNwIiwkX2VzcCk7CisJJnBvcGYJKCk7CisJJmZ1bmN0aW9uX2VuZF9BKCk7CisJJnB1c2hmCSgpOwkJCSMga2x1ZGdlLCBuZXZlciBleGVjdXRlZAorCisgICAgJnNldF9sYWJlbCgic2xvd19kZWNfcGFydGlhbF9zc2UiLDE2KTsKKwkmbW92cQkoJlFXUCgwLCRzMCksIm1tMCIpOwkjIHNhdmUgb3V0cHV0IHRvIHRlbXAKKwkmbW92cQkoJlFXUCg4LCRzMCksIm1tNCIpOworCSZlbW1zCSgpOworCisJJmFkZAkoJHMyIGVxICJlY3giID8gImVjeCI6IiIsMTYpOworCSZtb3YJKCJlZGkiLCRzMSk7CQkjIG91dAorCSZtb3YJKCJlc2kiLCRzMCk7CQkjIHRlbXAKKwkmYWxpZ24JKDQpOworCSZkYXRhX3dvcmQoMHhBNEYzRjY4OSk7CQkjIHJlcCBtb3ZzYiAjIGNvcHkgcGFydGlhbCBvdXRwdXQKKworCSZtb3YJKCJlc3AiLCRfZXNwKTsKKwkmcG9wZgkoKTsKKwkmZnVuY3Rpb25fZW5kX0EoKTsKKwkmcHVzaGYJKCk7CQkJIyBrbHVkZ2UsIG5ldmVyIGV4ZWN1dGVkCisJCQkJCX0KKwkmc2V0X2xhYmVsKCJzbG93X2RlY19sb29wX3g4NiIsMTYpOworCQkmbW92CSgkczAsJkRXUCgwLCRhY2MpKTsJIyByZWFkIGlucHV0CisJCSZtb3YJKCRzMSwmRFdQKDQsJGFjYykpOworCQkmbW92CSgkczIsJkRXUCg4LCRhY2MpKTsKKwkJJm1vdgkoJHMzLCZEV1AoMTIsJGFjYykpOworCisJCSZsZWEJKCRrZXksJGl2ZWMpOworCQkmbW92CSgmRFdQKDAsJGtleSksJHMwKTsJIyBjb3B5IHRvIHRlbXAKKwkJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJCSZtb3YJKCZEV1AoOCwka2V5KSwkczIpOworCQkmbW92CSgmRFdQKDEyLCRrZXkpLCRzMyk7CisKKwkJJm1vdgkoJGtleSwkX2tleSk7CQkjIGxvYWQga2V5CisJCSZjYWxsCSgiX3g4Nl9BRVNfZGVjcnlwdF9jb21wYWN0Iik7CisKKwkJJm1vdgkoJGtleSwkX2l2cCk7CQkjIGxvYWQgaXZwCisJCSZtb3YJKCRhY2MsJF9sZW4pOwkJIyBsb2FkIGxlbgorCQkmeG9yCSgkczAsJkRXUCgwLCRrZXkpKTsJIyB4b3IgaXYKKwkJJnhvcgkoJHMxLCZEV1AoNCwka2V5KSk7CisJCSZ4b3IJKCRzMiwmRFdQKDgsJGtleSkpOworCQkmeG9yCSgkczMsJkRXUCgxMiwka2V5KSk7CisKKwkJJnN1YgkoJGFjYywxNik7CisJCSZqYwkoJmxhYmVsKCJzbG93X2RlY19wYXJ0aWFsX3g4NiIpKTsKKworCQkmbW92CSgkX2xlbiwkYWNjKTsJCSMgc2F2ZSBsZW4KKwkJJm1vdgkoJGFjYywkX291dCk7CQkjIGxvYWQgb3V0CisKKwkJJm1vdgkoJkRXUCgwLCRhY2MpLCRzMCk7CSMgd3JpdGUgb3V0cHV0CisJCSZtb3YJKCZEV1AoNCwkYWNjKSwkczEpOworCQkmbW92CSgmRFdQKDgsJGFjYyksJHMyKTsKKwkJJm1vdgkoJkRXUCgxMiwkYWNjKSwkczMpOworCisJCSZsZWEJKCRhY2MsJkRXUCgxNiwkYWNjKSk7CSMgYWR2YW5jZSBvdXQKKwkJJm1vdgkoJF9vdXQsJGFjYyk7CQkjIHNhdmUgb3V0CisKKwkJJmxlYQkoJGFjYywkaXZlYyk7CisJCSZtb3YJKCRzMCwmRFdQKDAsJGFjYykpOwkjIHJlYWQgdGVtcAorCQkmbW92CSgkczEsJkRXUCg0LCRhY2MpKTsKKwkJJm1vdgkoJHMyLCZEV1AoOCwkYWNjKSk7CisJCSZtb3YJKCRzMywmRFdQKDEyLCRhY2MpKTsKKworCQkmbW92CSgmRFdQKDAsJGtleSksJHMwKTsJIyBjb3B5IGl0IHRvIGl2CisJCSZtb3YJKCZEV1AoNCwka2V5KSwkczEpOworCQkmbW92CSgmRFdQKDgsJGtleSksJHMyKTsKKwkJJm1vdgkoJkRXUCgxMiwka2V5KSwkczMpOworCisJCSZtb3YJKCRhY2MsJF9pbnApOwkJIyBsb2FkIGlucAorCQkmbGVhCSgkYWNjLCZEV1AoMTYsJGFjYykpOwkjIGFkdmFuY2UgaW5wCisJCSZtb3YJKCRfaW5wLCRhY2MpOwkJIyBzYXZlIGlucAorCSZqbnoJKCZsYWJlbCgic2xvd19kZWNfbG9vcF94ODYiKSk7CisJJm1vdgkoImVzcCIsJF9lc3ApOworCSZwb3BmCSgpOworCSZmdW5jdGlvbl9lbmRfQSgpOworCSZwdXNoZgkoKTsJCQkjIGtsdWRnZSwgbmV2ZXIgZXhlY3V0ZWQKKworICAgICZzZXRfbGFiZWwoInNsb3dfZGVjX3BhcnRpYWxfeDg2IiwxNik7CisJJmxlYQkoJGFjYywkaXZlYyk7CisJJm1vdgkoJkRXUCgwLCRhY2MpLCRzMCk7CSMgc2F2ZSBvdXRwdXQgdG8gdGVtcAorCSZtb3YJKCZEV1AoNCwkYWNjKSwkczEpOworCSZtb3YJKCZEV1AoOCwkYWNjKSwkczIpOworCSZtb3YJKCZEV1AoMTIsJGFjYyksJHMzKTsKKworCSZtb3YJKCRhY2MsJF9pbnApOworCSZtb3YJKCRzMCwmRFdQKDAsJGFjYykpOwkjIHJlLXJlYWQgaW5wdXQKKwkmbW92CSgkczEsJkRXUCg0LCRhY2MpKTsKKwkmbW92CSgkczIsJkRXUCg4LCRhY2MpKTsKKwkmbW92CSgkczMsJkRXUCgxMiwkYWNjKSk7CisKKwkmbW92CSgmRFdQKDAsJGtleSksJHMwKTsJIyBjb3B5IGl0IHRvIGl2CisJJm1vdgkoJkRXUCg0LCRrZXkpLCRzMSk7CisJJm1vdgkoJkRXUCg4LCRrZXkpLCRzMik7CisJJm1vdgkoJkRXUCgxMiwka2V5KSwkczMpOworCisJJm1vdgkoImVjeCIsJF9sZW4pOworCSZtb3YJKCJlZGkiLCRfb3V0KTsKKwkmbGVhCSgiZXNpIiwkaXZlYyk7CisJJmFsaWduCSg0KTsKKwkmZGF0YV93b3JkKDB4QTRGM0Y2ODkpOwkJIyByZXAgbW92c2IgIyBjb3B5IHBhcnRpYWwgb3V0cHV0CisKKwkmbW92CSgiZXNwIiwkX2VzcCk7CisJJnBvcGYJKCk7CismZnVuY3Rpb25fZW5kKCJBRVNfY2JjX2VuY3J5cHQiKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKworc3ViIGVuY2tleSgpCit7CisJJm1vdnoJKCJlc2kiLCZMQigiZWR4IikpOwkJIyBya1tpXT4+MAorCSZtb3Z6CSgiZWJ4IiwmQlAoLTEyOCwkdGJsLCJlc2kiLDEpKTsKKwkmbW92egkoImVzaSIsJkhCKCJlZHgiKSk7CQkjIHJrW2ldPj44CisJJnNobAkoImVieCIsMjQpOworCSZ4b3IJKCJlYXgiLCJlYngiKTsKKworCSZtb3Z6CSgiZWJ4IiwmQlAoLTEyOCwkdGJsLCJlc2kiLDEpKTsKKwkmc2hyCSgiZWR4IiwxNik7CisJJm1vdnoJKCJlc2kiLCZMQigiZWR4IikpOwkJIyBya1tpXT4+MTYKKwkmeG9yCSgiZWF4IiwiZWJ4Iik7CisKKwkmbW92egkoImVieCIsJkJQKC0xMjgsJHRibCwiZXNpIiwxKSk7CisJJm1vdnoJKCJlc2kiLCZIQigiZWR4IikpOwkJIyBya1tpXT4+MjQKKwkmc2hsCSgiZWJ4Iiw4KTsKKwkmeG9yCSgiZWF4IiwiZWJ4Iik7CisKKwkmbW92egkoImVieCIsJkJQKC0xMjgsJHRibCwiZXNpIiwxKSk7CisJJnNobAkoImVieCIsMTYpOworCSZ4b3IJKCJlYXgiLCJlYngiKTsKKworCSZ4b3IJKCJlYXgiLCZEV1AoMTAyNC0xMjgsJHRibCwiZWN4Iiw0KSk7CSMgcmNvbgorfQorCismZnVuY3Rpb25fYmVnaW4oIl94ODZfQUVTX3NldF9lbmNyeXB0X2tleSIpOworCSZtb3YJKCJlc2kiLCZ3cGFyYW0oMSkpOwkJIyB1c2VyIHN1cHBsaWVkIGtleQorCSZtb3YJKCJlZGkiLCZ3cGFyYW0oMykpOwkJIyBwcml2YXRlIGtleSBzY2hlZHVsZQorCisJJnRlc3QJKCJlc2kiLC0xKTsKKwkmanoJKCZsYWJlbCgiYmFkcG9pbnRlciIpKTsKKwkmdGVzdAkoImVkaSIsLTEpOworCSZqegkoJmxhYmVsKCJiYWRwb2ludGVyIikpOworCisJJmNhbGwJKCZsYWJlbCgicGljX3BvaW50IikpOworCSZzZXRfbGFiZWwoInBpY19wb2ludCIpOworCSZibGluZHBvcCgkdGJsKTsKKwkmbGVhCSgkdGJsLCZEV1AoJmxhYmVsKCJBRVNfVGUiKS4iLSIuJmxhYmVsKCJwaWNfcG9pbnQiKSwkdGJsKSk7CisJJmxlYQkoJHRibCwmRFdQKDIwNDgrMTI4LCR0YmwpKTsKKworCSMgcHJlZmV0Y2ggVGU0CisJJm1vdgkoImVheCIsJkRXUCgwLTEyOCwkdGJsKSk7CisJJm1vdgkoImVieCIsJkRXUCgzMi0xMjgsJHRibCkpOworCSZtb3YJKCJlY3giLCZEV1AoNjQtMTI4LCR0YmwpKTsKKwkmbW92CSgiZWR4IiwmRFdQKDk2LTEyOCwkdGJsKSk7CisJJm1vdgkoImVheCIsJkRXUCgxMjgtMTI4LCR0YmwpKTsKKwkmbW92CSgiZWJ4IiwmRFdQKDE2MC0xMjgsJHRibCkpOworCSZtb3YJKCJlY3giLCZEV1AoMTkyLTEyOCwkdGJsKSk7CisJJm1vdgkoImVkeCIsJkRXUCgyMjQtMTI4LCR0YmwpKTsKKworCSZtb3YJKCJlY3giLCZ3cGFyYW0oMikpOwkJIyBudW1iZXIgb2YgYml0cyBpbiBrZXkKKwkmY21wCSgiZWN4IiwxMjgpOworCSZqZQkoJmxhYmVsKCIxMHJvdW5kcyIpKTsKKwkmY21wCSgiZWN4IiwxOTIpOworCSZqZQkoJmxhYmVsKCIxMnJvdW5kcyIpKTsKKwkmY21wCSgiZWN4IiwyNTYpOworCSZqZQkoJmxhYmVsKCIxNHJvdW5kcyIpKTsKKwkmbW92CSgiZWF4IiwtMik7CQkJIyBpbnZhbGlkIG51bWJlciBvZiBiaXRzCisJJmptcAkoJmxhYmVsKCJleGl0IikpOworCisgICAgJnNldF9sYWJlbCgiMTByb3VuZHMiKTsKKwkmbW92CSgiZWF4IiwmRFdQKDAsImVzaSIpKTsJCSMgY29weSBmaXJzdCA0IGR3b3JkcworCSZtb3YJKCJlYngiLCZEV1AoNCwiZXNpIikpOworCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNpIikpOworCSZtb3YJKCJlZHgiLCZEV1AoMTIsImVzaSIpKTsKKwkmbW92CSgmRFdQKDAsImVkaSIpLCJlYXgiKTsKKwkmbW92CSgmRFdQKDQsImVkaSIpLCJlYngiKTsKKwkmbW92CSgmRFdQKDgsImVkaSIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDEyLCJlZGkiKSwiZWR4Iik7CisKKwkmeG9yCSgiZWN4IiwiZWN4Iik7CisJJmptcAkoJmxhYmVsKCIxMHNob3J0Y3V0IikpOworCisJJmFsaWduCSg0KTsKKwkmc2V0X2xhYmVsKCIxMGxvb3AiKTsKKwkJJm1vdgkoImVheCIsJkRXUCgwLCJlZGkiKSk7CQkjIHJrWzBdCisJCSZtb3YJKCJlZHgiLCZEV1AoMTIsImVkaSIpKTsJCSMgcmtbM10KKwkmc2V0X2xhYmVsKCIxMHNob3J0Y3V0Iik7CisJCSZlbmNrZXkJKCk7CisKKwkJJm1vdgkoJkRXUCgxNiwiZWRpIiksImVheCIpOwkJIyBya1s0XQorCQkmeG9yCSgiZWF4IiwmRFdQKDQsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCgyMCwiZWRpIiksImVheCIpOwkJIyBya1s1XQorCQkmeG9yCSgiZWF4IiwmRFdQKDgsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCgyNCwiZWRpIiksImVheCIpOwkJIyBya1s2XQorCQkmeG9yCSgiZWF4IiwmRFdQKDEyLCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoMjgsImVkaSIpLCJlYXgiKTsJCSMgcmtbN10KKwkJJmluYwkoImVjeCIpOworCQkmYWRkCSgiZWRpIiwxNik7CisJCSZjbXAJKCJlY3giLDEwKTsKKwkmamwJKCZsYWJlbCgiMTBsb29wIikpOworCisJJm1vdgkoJkRXUCg4MCwiZWRpIiksMTApOwkJIyBzZXR1cCBudW1iZXIgb2Ygcm91bmRzCisJJnhvcgkoImVheCIsImVheCIpOworCSZqbXAJKCZsYWJlbCgiZXhpdCIpKTsKKwkJCisgICAgJnNldF9sYWJlbCgiMTJyb3VuZHMiKTsKKwkmbW92CSgiZWF4IiwmRFdQKDAsImVzaSIpKTsJCSMgY29weSBmaXJzdCA2IGR3b3JkcworCSZtb3YJKCJlYngiLCZEV1AoNCwiZXNpIikpOworCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNpIikpOworCSZtb3YJKCJlZHgiLCZEV1AoMTIsImVzaSIpKTsKKwkmbW92CSgmRFdQKDAsImVkaSIpLCJlYXgiKTsKKwkmbW92CSgmRFdQKDQsImVkaSIpLCJlYngiKTsKKwkmbW92CSgmRFdQKDgsImVkaSIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDEyLCJlZGkiKSwiZWR4Iik7CisJJm1vdgkoImVjeCIsJkRXUCgxNiwiZXNpIikpOworCSZtb3YJKCJlZHgiLCZEV1AoMjAsImVzaSIpKTsKKwkmbW92CSgmRFdQKDE2LCJlZGkiKSwiZWN4Iik7CisJJm1vdgkoJkRXUCgyMCwiZWRpIiksImVkeCIpOworCisJJnhvcgkoImVjeCIsImVjeCIpOworCSZqbXAJKCZsYWJlbCgiMTJzaG9ydGN1dCIpKTsKKworCSZhbGlnbgkoNCk7CisJJnNldF9sYWJlbCgiMTJsb29wIik7CisJCSZtb3YJKCJlYXgiLCZEV1AoMCwiZWRpIikpOwkJIyBya1swXQorCQkmbW92CSgiZWR4IiwmRFdQKDIwLCJlZGkiKSk7CQkjIHJrWzVdCisJJnNldF9sYWJlbCgiMTJzaG9ydGN1dCIpOworCQkmZW5ja2V5CSgpOworCisJCSZtb3YJKCZEV1AoMjQsImVkaSIpLCJlYXgiKTsJCSMgcmtbNl0KKwkJJnhvcgkoImVheCIsJkRXUCg0LCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoMjgsImVkaSIpLCJlYXgiKTsJCSMgcmtbN10KKwkJJnhvcgkoImVheCIsJkRXUCg4LCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoMzIsImVkaSIpLCJlYXgiKTsJCSMgcmtbOF0KKwkJJnhvcgkoImVheCIsJkRXUCgxMiwiZWRpIikpOworCQkmbW92CSgmRFdQKDM2LCJlZGkiKSwiZWF4Iik7CQkjIHJrWzldCisKKwkJJmNtcAkoImVjeCIsNyk7CisJCSZqZQkoJmxhYmVsKCIxMmJyZWFrIikpOworCQkmaW5jCSgiZWN4Iik7CisKKwkJJnhvcgkoImVheCIsJkRXUCgxNiwiZWRpIikpOworCQkmbW92CSgmRFdQKDQwLCJlZGkiKSwiZWF4Iik7CQkjIHJrWzEwXQorCQkmeG9yCSgiZWF4IiwmRFdQKDIwLCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoNDQsImVkaSIpLCJlYXgiKTsJCSMgcmtbMTFdCisKKwkJJmFkZAkoImVkaSIsMjQpOworCSZqbXAJKCZsYWJlbCgiMTJsb29wIikpOworCisJJnNldF9sYWJlbCgiMTJicmVhayIpOworCSZtb3YJKCZEV1AoNzIsImVkaSIpLDEyKTsJCSMgc2V0dXAgbnVtYmVyIG9mIHJvdW5kcworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmam1wCSgmbGFiZWwoImV4aXQiKSk7CisKKyAgICAmc2V0X2xhYmVsKCIxNHJvdW5kcyIpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwiZXNpIikpOwkJIyBjb3B5IGZpcnN0IDggZHdvcmRzCisJJm1vdgkoImVieCIsJkRXUCg0LCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCg4LCJlc2kiKSk7CisJJm1vdgkoImVkeCIsJkRXUCgxMiwiZXNpIikpOworCSZtb3YJKCZEV1AoMCwiZWRpIiksImVheCIpOworCSZtb3YJKCZEV1AoNCwiZWRpIiksImVieCIpOworCSZtb3YJKCZEV1AoOCwiZWRpIiksImVjeCIpOworCSZtb3YJKCZEV1AoMTIsImVkaSIpLCJlZHgiKTsKKwkmbW92CSgiZWF4IiwmRFdQKDE2LCJlc2kiKSk7CisJJm1vdgkoImVieCIsJkRXUCgyMCwiZXNpIikpOworCSZtb3YJKCJlY3giLCZEV1AoMjQsImVzaSIpKTsKKwkmbW92CSgiZWR4IiwmRFdQKDI4LCJlc2kiKSk7CisJJm1vdgkoJkRXUCgxNiwiZWRpIiksImVheCIpOworCSZtb3YJKCZEV1AoMjAsImVkaSIpLCJlYngiKTsKKwkmbW92CSgmRFdQKDI0LCJlZGkiKSwiZWN4Iik7CisJJm1vdgkoJkRXUCgyOCwiZWRpIiksImVkeCIpOworCisJJnhvcgkoImVjeCIsImVjeCIpOworCSZqbXAJKCZsYWJlbCgiMTRzaG9ydGN1dCIpKTsKKworCSZhbGlnbgkoNCk7CisJJnNldF9sYWJlbCgiMTRsb29wIik7CisJCSZtb3YJKCJlZHgiLCZEV1AoMjgsImVkaSIpKTsJCSMgcmtbN10KKwkmc2V0X2xhYmVsKCIxNHNob3J0Y3V0Iik7CisJCSZtb3YJKCJlYXgiLCZEV1AoMCwiZWRpIikpOwkJIyBya1swXQorCisJCSZlbmNrZXkJKCk7CisKKwkJJm1vdgkoJkRXUCgzMiwiZWRpIiksImVheCIpOwkJIyBya1s4XQorCQkmeG9yCSgiZWF4IiwmRFdQKDQsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCgzNiwiZWRpIiksImVheCIpOwkJIyBya1s5XQorCQkmeG9yCSgiZWF4IiwmRFdQKDgsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCg0MCwiZWRpIiksImVheCIpOwkJIyBya1sxMF0KKwkJJnhvcgkoImVheCIsJkRXUCgxMiwiZWRpIikpOworCQkmbW92CSgmRFdQKDQ0LCJlZGkiKSwiZWF4Iik7CQkjIHJrWzExXQorCisJCSZjbXAJKCJlY3giLDYpOworCQkmamUJKCZsYWJlbCgiMTRicmVhayIpKTsKKwkJJmluYwkoImVjeCIpOworCisJCSZtb3YJKCJlZHgiLCJlYXgiKTsKKwkJJm1vdgkoImVheCIsJkRXUCgxNiwiZWRpIikpOwkJIyBya1s0XQorCQkmbW92egkoImVzaSIsJkxCKCJlZHgiKSk7CQkjIHJrWzExXT4+MAorCQkmbW92egkoImVieCIsJkJQKC0xMjgsJHRibCwiZXNpIiwxKSk7CisJCSZtb3Z6CSgiZXNpIiwmSEIoImVkeCIpKTsJCSMgcmtbMTFdPj44CisJCSZ4b3IJKCJlYXgiLCJlYngiKTsKKworCQkmbW92egkoImVieCIsJkJQKC0xMjgsJHRibCwiZXNpIiwxKSk7CisJCSZzaHIJKCJlZHgiLDE2KTsKKwkJJnNobAkoImVieCIsOCk7CisJCSZtb3Z6CSgiZXNpIiwmTEIoImVkeCIpKTsJCSMgcmtbMTFdPj4xNgorCQkmeG9yCSgiZWF4IiwiZWJ4Iik7CisKKwkJJm1vdnoJKCJlYngiLCZCUCgtMTI4LCR0YmwsImVzaSIsMSkpOworCQkmbW92egkoImVzaSIsJkhCKCJlZHgiKSk7CQkjIHJrWzExXT4+MjQKKwkJJnNobAkoImVieCIsMTYpOworCQkmeG9yCSgiZWF4IiwiZWJ4Iik7CisKKwkJJm1vdnoJKCJlYngiLCZCUCgtMTI4LCR0YmwsImVzaSIsMSkpOworCQkmc2hsCSgiZWJ4IiwyNCk7CisJCSZ4b3IJKCJlYXgiLCJlYngiKTsKKworCQkmbW92CSgmRFdQKDQ4LCJlZGkiKSwiZWF4Iik7CQkjIHJrWzEyXQorCQkmeG9yCSgiZWF4IiwmRFdQKDIwLCJlZGkiKSk7CisJCSZtb3YJKCZEV1AoNTIsImVkaSIpLCJlYXgiKTsJCSMgcmtbMTNdCisJCSZ4b3IJKCJlYXgiLCZEV1AoMjQsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCg1NiwiZWRpIiksImVheCIpOwkJIyBya1sxNF0KKwkJJnhvcgkoImVheCIsJkRXUCgyOCwiZWRpIikpOworCQkmbW92CSgmRFdQKDYwLCJlZGkiKSwiZWF4Iik7CQkjIHJrWzE1XQorCisJCSZhZGQJKCJlZGkiLDMyKTsKKwkmam1wCSgmbGFiZWwoIjE0bG9vcCIpKTsKKworCSZzZXRfbGFiZWwoIjE0YnJlYWsiKTsKKwkmbW92CSgmRFdQKDQ4LCJlZGkiKSwxNCk7CQkjIHNldHVwIG51bWJlciBvZiByb3VuZHMKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJmptcAkoJmxhYmVsKCJleGl0IikpOworCisgICAgJnNldF9sYWJlbCgiYmFkcG9pbnRlciIpOworCSZtb3YJKCJlYXgiLC0xKTsKKyAgICAmc2V0X2xhYmVsKCJleGl0Iik7CismZnVuY3Rpb25fZW5kKCJfeDg2X0FFU19zZXRfZW5jcnlwdF9rZXkiKTsKKworIyBpbnQgQUVTX3NldF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywKKyMgICAgICAgICAgICAgICAgICAgICAgICBBRVNfS0VZICprZXkpCismZnVuY3Rpb25fYmVnaW5fQigiQUVTX3NldF9lbmNyeXB0X2tleSIpOworCSZjYWxsCSgiX3g4Nl9BRVNfc2V0X2VuY3J5cHRfa2V5Iik7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiQUVTX3NldF9lbmNyeXB0X2tleSIpOworCitzdWIgZGVja2V5KCkKK3sgbXkgKCRpLCRrZXksJHRwMSwkdHAyLCR0cDQsJHRwOCkgPSBAXzsKKyAgbXkgJHRtcCA9ICR0Ymw7CisKKwkmbW92CSgkYWNjLCR0cDEpOworCSZhbmQJKCRhY2MsMHg4MDgwODA4MCk7CisJJm1vdgkoJHRtcCwkYWNjKTsKKwkmc2hyCSgkdG1wLDcpOworCSZsZWEJKCR0cDIsJkRXUCgwLCR0cDEsJHRwMSkpOworCSZzdWIJKCRhY2MsJHRtcCk7CisJJmFuZAkoJHRwMiwweGZlZmVmZWZlKTsKKwkmYW5kCSgkYWNjLDB4MWIxYjFiMWIpOworCSZ4b3IJKCRhY2MsJHRwMik7CisJJm1vdgkoJHRwMiwkYWNjKTsKKworCSZhbmQJKCRhY2MsMHg4MDgwODA4MCk7CisJJm1vdgkoJHRtcCwkYWNjKTsKKwkmc2hyCSgkdG1wLDcpOworCSZsZWEJKCR0cDQsJkRXUCgwLCR0cDIsJHRwMikpOworCSZzdWIJKCRhY2MsJHRtcCk7CisJJmFuZAkoJHRwNCwweGZlZmVmZWZlKTsKKwkmYW5kCSgkYWNjLDB4MWIxYjFiMWIpOworCSAmeG9yCSgkdHAyLCR0cDEpOwkjIHRwMl50cDEKKwkmeG9yCSgkYWNjLCR0cDQpOworCSZtb3YJKCR0cDQsJGFjYyk7CisKKwkmYW5kCSgkYWNjLDB4ODA4MDgwODApOworCSZtb3YJKCR0bXAsJGFjYyk7CisJJnNocgkoJHRtcCw3KTsKKwkmbGVhCSgkdHA4LCZEV1AoMCwkdHA0LCR0cDQpKTsKKwkgJnhvcgkoJHRwNCwkdHAxKTsJIyB0cDRedHAxCisJJnN1YgkoJGFjYywkdG1wKTsKKwkmYW5kCSgkdHA4LDB4ZmVmZWZlZmUpOworCSZhbmQJKCRhY2MsMHgxYjFiMWIxYik7CisJICZyb3RsCSgkdHAxLDgpOwkjID0gUk9UQVRFKHRwMSw4KQorCSZ4b3IJKCR0cDgsJGFjYyk7CisKKwkmbW92CSgkdG1wLCZEV1AoNCooJGkrMSksJGtleSkpOwkjIG1vZHVsby1zY2hlZHVsZWQgbG9hZAorCisJJnhvcgkoJHRwMSwkdHAyKTsKKwkmeG9yCSgkdHAyLCR0cDgpOworCSZ4b3IJKCR0cDEsJHRwNCk7CisJJnJvdGwJKCR0cDIsMjQpOworCSZ4b3IJKCR0cDQsJHRwOCk7CisJJnhvcgkoJHRwMSwkdHA4KTsJIyBePSB0cDheKHRwNF50cDEpXih0cDJedHAxKQorCSZyb3RsCSgkdHA0LDE2KTsKKwkmeG9yCSgkdHAxLCR0cDIpOwkjIF49IFJPVEFURSh0cDhedHAyXnRwMSwyNCkKKwkmcm90bAkoJHRwOCw4KTsKKwkmeG9yCSgkdHAxLCR0cDQpOwkjIF49IFJPVEFURSh0cDhedHA0XnRwMSwxNikKKwkmbW92CSgkdHAyLCR0bXApOworCSZ4b3IJKCR0cDEsJHRwOCk7CSMgXj0gUk9UQVRFKHRwOCw4KQorCisJJm1vdgkoJkRXUCg0KiRpLCRrZXkpLCR0cDEpOworfQorCisjIGludCBBRVNfc2V0X2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJLZXksIGNvbnN0IGludCBiaXRzLAorIyAgICAgICAgICAgICAgICAgICAgICAgIEFFU19LRVkgKmtleSkKKyZmdW5jdGlvbl9iZWdpbl9CKCJBRVNfc2V0X2RlY3J5cHRfa2V5Iik7CisJJmNhbGwJKCJfeDg2X0FFU19zZXRfZW5jcnlwdF9rZXkiKTsKKwkmY21wCSgiZWF4IiwwKTsKKwkmamUJKCZsYWJlbCgicHJvY2VlZCIpKTsKKwkmcmV0CSgpOworCisgICAgJnNldF9sYWJlbCgicHJvY2VlZCIpOworCSZwdXNoCSgiZWJwIik7CisJJnB1c2gJKCJlYngiKTsKKwkmcHVzaAkoImVzaSIpOworCSZwdXNoCSgiZWRpIik7CisKKwkmbW92CSgiZXNpIiwmd3BhcmFtKDIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKDI0MCwiZXNpIikpOwkjIHB1bGwgbnVtYmVyIG9mIHJvdW5kcworCSZsZWEJKCJlY3giLCZEV1AoMCwiIiwiZWN4Iiw0KSk7CisJJmxlYQkoImVkaSIsJkRXUCgwLCJlc2kiLCJlY3giLDQpKTsJIyBwb2ludGVyIHRvIGxhc3QgY2h1bmsKKworCSZzZXRfbGFiZWwoImludmVydCIsNCk7CQkJIyBpbnZlcnQgb3JkZXIgb2YgY2h1bmtzCisJCSZtb3YJKCJlYXgiLCZEV1AoMCwiZXNpIikpOworCQkmbW92CSgiZWJ4IiwmRFdQKDQsImVzaSIpKTsKKwkJJm1vdgkoImVjeCIsJkRXUCgwLCJlZGkiKSk7CisJCSZtb3YJKCJlZHgiLCZEV1AoNCwiZWRpIikpOworCQkmbW92CSgmRFdQKDAsImVkaSIpLCJlYXgiKTsKKwkJJm1vdgkoJkRXUCg0LCJlZGkiKSwiZWJ4Iik7CisJCSZtb3YJKCZEV1AoMCwiZXNpIiksImVjeCIpOworCQkmbW92CSgmRFdQKDQsImVzaSIpLCJlZHgiKTsKKwkJJm1vdgkoImVheCIsJkRXUCg4LCJlc2kiKSk7CisJCSZtb3YJKCJlYngiLCZEV1AoMTIsImVzaSIpKTsKKwkJJm1vdgkoImVjeCIsJkRXUCg4LCJlZGkiKSk7CisJCSZtb3YJKCJlZHgiLCZEV1AoMTIsImVkaSIpKTsKKwkJJm1vdgkoJkRXUCg4LCJlZGkiKSwiZWF4Iik7CisJCSZtb3YJKCZEV1AoMTIsImVkaSIpLCJlYngiKTsKKwkJJm1vdgkoJkRXUCg4LCJlc2kiKSwiZWN4Iik7CisJCSZtb3YJKCZEV1AoMTIsImVzaSIpLCJlZHgiKTsKKwkJJmFkZAkoImVzaSIsMTYpOworCQkmc3ViCSgiZWRpIiwxNik7CisJCSZjbXAJKCJlc2kiLCJlZGkiKTsKKwkmam5lCSgmbGFiZWwoImludmVydCIpKTsKKworCSZtb3YJKCRrZXksJndwYXJhbSgyKSk7CisJJm1vdgkoJGFjYywmRFdQKDI0MCwka2V5KSk7CQkjIHB1bGwgbnVtYmVyIG9mIHJvdW5kcworCSZsZWEJKCRhY2MsJkRXUCgtMiwkYWNjLCRhY2MpKTsKKwkmbGVhCSgkYWNjLCZEV1AoMCwka2V5LCRhY2MsOCkpOworCSZtb3YJKCZ3cGFyYW0oMiksJGFjYyk7CisKKwkmbW92CSgkczAsJkRXUCgxNiwka2V5KSk7CQkjIG1vZHVsby1zY2hlZHVsZWQgbG9hZAorCSZzZXRfbGFiZWwoInBlcm11dGUiLDQpOwkJIyBwZXJtdXRlIHRoZSBrZXkgc2NoZWR1bGUKKwkJJmFkZAkoJGtleSwxNik7CisJCSZkZWNrZXkJKDAsJGtleSwkczAsJHMxLCRzMiwkczMpOworCQkmZGVja2V5CSgxLCRrZXksJHMxLCRzMiwkczMsJHMwKTsKKwkJJmRlY2tleQkoMiwka2V5LCRzMiwkczMsJHMwLCRzMSk7CisJCSZkZWNrZXkJKDMsJGtleSwkczMsJHMwLCRzMSwkczIpOworCQkmY21wCSgka2V5LCZ3cGFyYW0oMikpOworCSZqYgkoJmxhYmVsKCJwZXJtdXRlIikpOworCisJJnhvcgkoImVheCIsImVheCIpOwkJCSMgcmV0dXJuIHN1Y2Nlc3MKKyZmdW5jdGlvbl9lbmQoIkFFU19zZXRfZGVjcnlwdF9rZXkiKTsKKyZhc2NpeigiQUVTIGZvciB4ODYsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iKTsKKworJmFzbV9maW5pc2goKTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYXNtL2Flcy1hcm12NC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYXNtL2Flcy1hcm12NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTAyNDQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnBsCkBAIC0wLDAgKzEsMTAzMSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIEFFUyBmb3IgQVJNdjQKKworIyBKYW51YXJ5IDIwMDcuCisjCisjIENvZGUgdXNlcyBzaW5nbGUgMUsgUy1ib3ggYW5kIGlzID4yIHRpbWVzIGZhc3RlciB0aGFuIGNvZGUgZ2VuZXJhdGVkCisjIGJ5IGdjYy0zLjQuMS4gVGhpcyBpcyB0aGFua3MgdG8gdW5pcXVlIGZlYXR1cmUgb2YgQVJNdjQgSVNBLCB3aGljaAorIyBhbGxvd3MgdG8gbWVyZ2UgbG9naWNhbCBvciBhcml0aG1ldGljIG9wZXJhdGlvbiB3aXRoIHNoaWZ0IG9yIHJvdGF0ZQorIyBpbiBvbmUgaW5zdHJ1Y3Rpb24gYW5kIGVtaXQgY29tYmluZWQgcmVzdWx0IGV2ZXJ5IGN5Y2xlLiBUaGUgbW9kdWxlCisjIGlzIGVuZGlhbi1uZXV0cmFsLiBUaGUgcGVyZm9ybWFuY2UgaXMgfjQyIGN5Y2xlcy9ieXRlIGZvciAxMjgtYml0CisjIGtleS4KKworIyBNYXkgMjAwNy4KKyMKKyMgQUVTX3NldF9bZW58ZGVdY3J5cHRfa2V5IGlzIGFkZGVkLgorCiskczA9InIwIjsKKyRzMT0icjEiOworJHMyPSJyMiI7CiskczM9InIzIjsKKyR0MT0icjQiOworJHQyPSJyNSI7CiskdDM9InI2IjsKKyRpMT0icjciOworJGkyPSJyOCI7CiskaTM9InI5IjsKKworJHRibD0icjEwIjsKKyRrZXk9InIxMSI7Ciskcm91bmRzPSJyMTIiOworCiskY29kZT08PF9fXzsKKy50ZXh0CisuY29kZQkzMgorCisudHlwZQlBRVNfVGUsJW9iamVjdAorLmFsaWduCTUKK0FFU19UZToKKy53b3JkCTB4YzY2MzYzYTUsIDB4Zjg3YzdjODQsIDB4ZWU3Nzc3OTksIDB4ZjY3YjdiOGQKKy53b3JkCTB4ZmZmMmYyMGQsIDB4ZDY2YjZiYmQsIDB4ZGU2ZjZmYjEsIDB4OTFjNWM1NTQKKy53b3JkCTB4NjAzMDMwNTAsIDB4MDIwMTAxMDMsIDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QKKy53b3JkCTB4ZTdmZWZlMTksIDB4YjVkN2Q3NjIsIDB4NGRhYmFiZTYsIDB4ZWM3Njc2OWEKKy53b3JkCTB4OGZjYWNhNDUsIDB4MWY4MjgyOWQsIDB4ODljOWM5NDAsIDB4ZmE3ZDdkODcKKy53b3JkCTB4ZWZmYWZhMTUsIDB4YjI1OTU5ZWIsIDB4OGU0NzQ3YzksIDB4ZmJmMGYwMGIKKy53b3JkCTB4NDFhZGFkZWMsIDB4YjNkNGQ0NjcsIDB4NWZhMmEyZmQsIDB4NDVhZmFmZWEKKy53b3JkCTB4MjM5YzljYmYsIDB4NTNhNGE0ZjcsIDB4ZTQ3MjcyOTYsIDB4OWJjMGMwNWIKKy53b3JkCTB4NzViN2I3YzIsIDB4ZTFmZGZkMWMsIDB4M2Q5MzkzYWUsIDB4NGMyNjI2NmEKKy53b3JkCTB4NmMzNjM2NWEsIDB4N2UzZjNmNDEsIDB4ZjVmN2Y3MDIsIDB4ODNjY2NjNGYKKy53b3JkCTB4NjgzNDM0NWMsIDB4NTFhNWE1ZjQsIDB4ZDFlNWU1MzQsIDB4ZjlmMWYxMDgKKy53b3JkCTB4ZTI3MTcxOTMsIDB4YWJkOGQ4NzMsIDB4NjIzMTMxNTMsIDB4MmExNTE1M2YKKy53b3JkCTB4MDgwNDA0MGMsIDB4OTVjN2M3NTIsIDB4NDYyMzIzNjUsIDB4OWRjM2MzNWUKKy53b3JkCTB4MzAxODE4MjgsIDB4Mzc5Njk2YTEsIDB4MGEwNTA1MGYsIDB4MmY5YTlhYjUKKy53b3JkCTB4MGUwNzA3MDksIDB4MjQxMjEyMzYsIDB4MWI4MDgwOWIsIDB4ZGZlMmUyM2QKKy53b3JkCTB4Y2RlYmViMjYsIDB4NGUyNzI3NjksIDB4N2ZiMmIyY2QsIDB4ZWE3NTc1OWYKKy53b3JkCTB4MTIwOTA5MWIsIDB4MWQ4MzgzOWUsIDB4NTgyYzJjNzQsIDB4MzQxYTFhMmUKKy53b3JkCTB4MzYxYjFiMmQsIDB4ZGM2ZTZlYjIsIDB4YjQ1YTVhZWUsIDB4NWJhMGEwZmIKKy53b3JkCTB4YTQ1MjUyZjYsIDB4NzYzYjNiNGQsIDB4YjdkNmQ2NjEsIDB4N2RiM2IzY2UKKy53b3JkCTB4NTIyOTI5N2IsIDB4ZGRlM2UzM2UsIDB4NWUyZjJmNzEsIDB4MTM4NDg0OTcKKy53b3JkCTB4YTY1MzUzZjUsIDB4YjlkMWQxNjgsIDB4MDAwMDAwMDAsIDB4YzFlZGVkMmMKKy53b3JkCTB4NDAyMDIwNjAsIDB4ZTNmY2ZjMWYsIDB4NzliMWIxYzgsIDB4YjY1YjViZWQKKy53b3JkCTB4ZDQ2YTZhYmUsIDB4OGRjYmNiNDYsIDB4NjdiZWJlZDksIDB4NzIzOTM5NGIKKy53b3JkCTB4OTQ0YTRhZGUsIDB4OTg0YzRjZDQsIDB4YjA1ODU4ZTgsIDB4ODVjZmNmNGEKKy53b3JkCTB4YmJkMGQwNmIsIDB4YzVlZmVmMmEsIDB4NGZhYWFhZTUsIDB4ZWRmYmZiMTYKKy53b3JkCTB4ODY0MzQzYzUsIDB4OWE0ZDRkZDcsIDB4NjYzMzMzNTUsIDB4MTE4NTg1OTQKKy53b3JkCTB4OGE0NTQ1Y2YsIDB4ZTlmOWY5MTAsIDB4MDQwMjAyMDYsIDB4ZmU3ZjdmODEKKy53b3JkCTB4YTA1MDUwZjAsIDB4NzgzYzNjNDQsIDB4MjU5ZjlmYmEsIDB4NGJhOGE4ZTMKKy53b3JkCTB4YTI1MTUxZjMsIDB4NWRhM2EzZmUsIDB4ODA0MDQwYzAsIDB4MDU4ZjhmOGEKKy53b3JkCTB4M2Y5MjkyYWQsIDB4MjE5ZDlkYmMsIDB4NzAzODM4NDgsIDB4ZjFmNWY1MDQKKy53b3JkCTB4NjNiY2JjZGYsIDB4NzdiNmI2YzEsIDB4YWZkYWRhNzUsIDB4NDIyMTIxNjMKKy53b3JkCTB4MjAxMDEwMzAsIDB4ZTVmZmZmMWEsIDB4ZmRmM2YzMGUsIDB4YmZkMmQyNmQKKy53b3JkCTB4ODFjZGNkNGMsIDB4MTgwYzBjMTQsIDB4MjYxMzEzMzUsIDB4YzNlY2VjMmYKKy53b3JkCTB4YmU1ZjVmZTEsIDB4MzU5Nzk3YTIsIDB4ODg0NDQ0Y2MsIDB4MmUxNzE3MzkKKy53b3JkCTB4OTNjNGM0NTcsIDB4NTVhN2E3ZjIsIDB4ZmM3ZTdlODIsIDB4N2EzZDNkNDcKKy53b3JkCTB4Yzg2NDY0YWMsIDB4YmE1ZDVkZTcsIDB4MzIxOTE5MmIsIDB4ZTY3MzczOTUKKy53b3JkCTB4YzA2MDYwYTAsIDB4MTk4MTgxOTgsIDB4OWU0ZjRmZDEsIDB4YTNkY2RjN2YKKy53b3JkCTB4NDQyMjIyNjYsIDB4NTQyYTJhN2UsIDB4M2I5MDkwYWIsIDB4MGI4ODg4ODMKKy53b3JkCTB4OGM0NjQ2Y2EsIDB4YzdlZWVlMjksIDB4NmJiOGI4ZDMsIDB4MjgxNDE0M2MKKy53b3JkCTB4YTdkZWRlNzksIDB4YmM1ZTVlZTIsIDB4MTYwYjBiMWQsIDB4YWRkYmRiNzYKKy53b3JkCTB4ZGJlMGUwM2IsIDB4NjQzMjMyNTYsIDB4NzQzYTNhNGUsIDB4MTQwYTBhMWUKKy53b3JkCTB4OTI0OTQ5ZGIsIDB4MGMwNjA2MGEsIDB4NDgyNDI0NmMsIDB4Yjg1YzVjZTQKKy53b3JkCTB4OWZjMmMyNWQsIDB4YmRkM2QzNmUsIDB4NDNhY2FjZWYsIDB4YzQ2MjYyYTYKKy53b3JkCTB4Mzk5MTkxYTgsIDB4MzE5NTk1YTQsIDB4ZDNlNGU0MzcsIDB4ZjI3OTc5OGIKKy53b3JkCTB4ZDVlN2U3MzIsIDB4OGJjOGM4NDMsIDB4NmUzNzM3NTksIDB4ZGE2ZDZkYjcKKy53b3JkCTB4MDE4ZDhkOGMsIDB4YjFkNWQ1NjQsIDB4OWM0ZTRlZDIsIDB4NDlhOWE5ZTAKKy53b3JkCTB4ZDg2YzZjYjQsIDB4YWM1NjU2ZmEsIDB4ZjNmNGY0MDcsIDB4Y2ZlYWVhMjUKKy53b3JkCTB4Y2E2NTY1YWYsIDB4ZjQ3YTdhOGUsIDB4NDdhZWFlZTksIDB4MTAwODA4MTgKKy53b3JkCTB4NmZiYWJhZDUsIDB4ZjA3ODc4ODgsIDB4NGEyNTI1NmYsIDB4NWMyZTJlNzIKKy53b3JkCTB4MzgxYzFjMjQsIDB4NTdhNmE2ZjEsIDB4NzNiNGI0YzcsIDB4OTdjNmM2NTEKKy53b3JkCTB4Y2JlOGU4MjMsIDB4YTFkZGRkN2MsIDB4ZTg3NDc0OWMsIDB4M2UxZjFmMjEKKy53b3JkCTB4OTY0YjRiZGQsIDB4NjFiZGJkZGMsIDB4MGQ4YjhiODYsIDB4MGY4YThhODUKKy53b3JkCTB4ZTA3MDcwOTAsIDB4N2MzZTNlNDIsIDB4NzFiNWI1YzQsIDB4Y2M2NjY2YWEKKy53b3JkCTB4OTA0ODQ4ZDgsIDB4MDYwMzAzMDUsIDB4ZjdmNmY2MDEsIDB4MWMwZTBlMTIKKy53b3JkCTB4YzI2MTYxYTMsIDB4NmEzNTM1NWYsIDB4YWU1NzU3ZjksIDB4NjliOWI5ZDAKKy53b3JkCTB4MTc4Njg2OTEsIDB4OTljMWMxNTgsIDB4M2ExZDFkMjcsIDB4Mjc5ZTllYjkKKy53b3JkCTB4ZDllMWUxMzgsIDB4ZWJmOGY4MTMsIDB4MmI5ODk4YjMsIDB4MjIxMTExMzMKKy53b3JkCTB4ZDI2OTY5YmIsIDB4YTlkOWQ5NzAsIDB4MDc4ZThlODksIDB4MzM5NDk0YTcKKy53b3JkCTB4MmQ5YjliYjYsIDB4M2MxZTFlMjIsIDB4MTU4Nzg3OTIsIDB4YzllOWU5MjAKKy53b3JkCTB4ODdjZWNlNDksIDB4YWE1NTU1ZmYsIDB4NTAyODI4NzgsIDB4YTVkZmRmN2EKKy53b3JkCTB4MDM4YzhjOGYsIDB4NTlhMWExZjgsIDB4MDk4OTg5ODAsIDB4MWEwZDBkMTcKKy53b3JkCTB4NjViZmJmZGEsIDB4ZDdlNmU2MzEsIDB4ODQ0MjQyYzYsIDB4ZDA2ODY4YjgKKy53b3JkCTB4ODI0MTQxYzMsIDB4Mjk5OTk5YjAsIDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEKKy53b3JkCTB4N2JiMGIwY2IsIDB4YTg1NDU0ZmMsIDB4NmRiYmJiZDYsIDB4MmMxNjE2M2EKK0AgVGU0WzI1Nl0KKy5ieXRlCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUKKy5ieXRlCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYKKy5ieXRlCTB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAKKy5ieXRlCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAKKy5ieXRlCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MKKy5ieXRlCTB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUKKy5ieXRlCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEKKy5ieXRlCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUKKy5ieXRlCTB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAKKy5ieXRlCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQKKy5ieXRlCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIKKy5ieXRlCTB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YKKy5ieXRlCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUKKy5ieXRlCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgKKy5ieXRlCTB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUKKy5ieXRlCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIKKy5ieXRlCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcKKy5ieXRlCTB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMKKy5ieXRlCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgKKy5ieXRlCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIKKy5ieXRlCTB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMKKy5ieXRlCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzkKKy5ieXRlCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkKKy5ieXRlCTB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgKKy5ieXRlCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYKKy5ieXRlCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEKKy5ieXRlCTB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUKKy5ieXRlCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUKKy5ieXRlCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQKKy5ieXRlCTB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYKKy5ieXRlCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgKKy5ieXRlCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK0AgcmNvbltdCisud29yZAkweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwCisud29yZAkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwCisud29yZAkweDFCMDAwMDAwLCAweDM2MDAwMDAwLCAwLCAwLCAwLCAwLCAwLCAwCisuc2l6ZQlBRVNfVGUsLi1BRVNfVGUKKworQCB2b2lkIEFFU19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCitAIAkJIGNvbnN0IEFFU19LRVkgKmtleSkgeworLmdsb2JhbCBBRVNfZW5jcnlwdAorLnR5cGUgICBBRVNfZW5jcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgk1CitBRVNfZW5jcnlwdDoKKwlzdWIJcjMscGMsIzgJCUAgQUVTX2VuY3J5cHQKKwlzdG1kYiAgIHNwISx7cjEscjQtcjEyLGxyfQorCW1vdgkkcm91bmRzLHIwCQlAIGlucAorCW1vdgkka2V5LHIyCisJc3ViCSR0YmwscjMsI0FFU19lbmNyeXB0LUFFU19UZQlAIFRlCisKKwlsZHJiCSRzMCxbJHJvdW5kcywjM10JQCBsb2FkIGlucHV0IGRhdGEgaW4gZW5kaWFuLW5ldXRyYWwKKwlsZHJiCSR0MSxbJHJvdW5kcywjMl0JQCBtYW5uZXIuLi4KKwlsZHJiCSR0MixbJHJvdW5kcywjMV0KKwlsZHJiCSR0MyxbJHJvdW5kcywjMF0KKwlvcnIJJHMwLCRzMCwkdDEsbHNsIzgKKwlvcnIJJHMwLCRzMCwkdDIsbHNsIzE2CisJb3JyCSRzMCwkczAsJHQzLGxzbCMyNAorCWxkcmIJJHMxLFskcm91bmRzLCM3XQorCWxkcmIJJHQxLFskcm91bmRzLCM2XQorCWxkcmIJJHQyLFskcm91bmRzLCM1XQorCWxkcmIJJHQzLFskcm91bmRzLCM0XQorCW9ycgkkczEsJHMxLCR0MSxsc2wjOAorCW9ycgkkczEsJHMxLCR0Mixsc2wjMTYKKwlvcnIJJHMxLCRzMSwkdDMsbHNsIzI0CisJbGRyYgkkczIsWyRyb3VuZHMsIzExXQorCWxkcmIJJHQxLFskcm91bmRzLCMxMF0KKwlsZHJiCSR0MixbJHJvdW5kcywjOV0KKwlsZHJiCSR0MyxbJHJvdW5kcywjOF0KKwlvcnIJJHMyLCRzMiwkdDEsbHNsIzgKKwlvcnIJJHMyLCRzMiwkdDIsbHNsIzE2CisJb3JyCSRzMiwkczIsJHQzLGxzbCMyNAorCWxkcmIJJHMzLFskcm91bmRzLCMxNV0KKwlsZHJiCSR0MSxbJHJvdW5kcywjMTRdCisJbGRyYgkkdDIsWyRyb3VuZHMsIzEzXQorCWxkcmIJJHQzLFskcm91bmRzLCMxMl0KKwlvcnIJJHMzLCRzMywkdDEsbHNsIzgKKwlvcnIJJHMzLCRzMywkdDIsbHNsIzE2CisJb3JyCSRzMywkczMsJHQzLGxzbCMyNAorCisJYmwJX2FybXY0X0FFU19lbmNyeXB0CisKKwlsZHIJJHJvdW5kcyxbc3BdLCM0CQlAIHBvcCBvdXQKKwltb3YJJHQxLCRzMCxsc3IjMjQJCUAgd3JpdGUgb3V0cHV0IGluIGVuZGlhbi1uZXV0cmFsCisJbW92CSR0MiwkczAsbHNyIzE2CQlAIG1hbm5lci4uLgorCW1vdgkkdDMsJHMwLGxzciM4CisJc3RyYgkkdDEsWyRyb3VuZHMsIzBdCisJc3RyYgkkdDIsWyRyb3VuZHMsIzFdCisJc3RyYgkkdDMsWyRyb3VuZHMsIzJdCisJc3RyYgkkczAsWyRyb3VuZHMsIzNdCisJbW92CSR0MSwkczEsbHNyIzI0CisJbW92CSR0MiwkczEsbHNyIzE2CisJbW92CSR0MywkczEsbHNyIzgKKwlzdHJiCSR0MSxbJHJvdW5kcywjNF0KKwlzdHJiCSR0MixbJHJvdW5kcywjNV0KKwlzdHJiCSR0MyxbJHJvdW5kcywjNl0KKwlzdHJiCSRzMSxbJHJvdW5kcywjN10KKwltb3YJJHQxLCRzMixsc3IjMjQKKwltb3YJJHQyLCRzMixsc3IjMTYKKwltb3YJJHQzLCRzMixsc3IjOAorCXN0cmIJJHQxLFskcm91bmRzLCM4XQorCXN0cmIJJHQyLFskcm91bmRzLCM5XQorCXN0cmIJJHQzLFskcm91bmRzLCMxMF0KKwlzdHJiCSRzMixbJHJvdW5kcywjMTFdCisJbW92CSR0MSwkczMsbHNyIzI0CisJbW92CSR0MiwkczMsbHNyIzE2CisJbW92CSR0MywkczMsbHNyIzgKKwlzdHJiCSR0MSxbJHJvdW5kcywjMTJdCisJc3RyYgkkdDIsWyRyb3VuZHMsIzEzXQorCXN0cmIJJHQzLFskcm91bmRzLCMxNF0KKwlzdHJiCSRzMyxbJHJvdW5kcywjMTVdCisKKwlsZG1pYSAgIHNwISx7cjQtcjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwlieAlscgkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorLnNpemUJQUVTX2VuY3J5cHQsLi1BRVNfZW5jcnlwdAorCisudHlwZSAgIF9hcm12NF9BRVNfZW5jcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgkyCitfYXJtdjRfQUVTX2VuY3J5cHQ6CisJc3RyCWxyLFtzcCwjLTRdIQkJQCBwdXNoIGxyCisJbGRyCSR0MSxbJGtleV0sIzE2CisJbGRyCSR0MixbJGtleSwjLTEyXQorCWxkcgkkdDMsWyRrZXksIy04XQorCWxkcgkkaTEsWyRrZXksIy00XQorCWxkcgkkcm91bmRzLFska2V5LCMyNDAtMTZdCisJZW9yCSRzMCwkczAsJHQxCisJZW9yCSRzMSwkczEsJHQyCisJZW9yCSRzMiwkczIsJHQzCisJZW9yCSRzMywkczMsJGkxCisJc3ViCSRyb3VuZHMsJHJvdW5kcywjMQorCW1vdglsciwjMjU1CisKKy5MZW5jX2xvb3A6CisJYW5kCSRpMixsciwkczAsbHNyIzgKKwlhbmQJJGkzLGxyLCRzMCxsc3IjMTYKKwlhbmQJJGkxLGxyLCRzMAorCW1vdgkkczAsJHMwLGxzciMyNAorCWxkcgkkdDEsWyR0YmwsJGkxLGxzbCMyXQlAIFRlM1tzMD4+MF0KKwlsZHIJJHMwLFskdGJsLCRzMCxsc2wjMl0JQCBUZTBbczA+PjI0XQorCWxkcgkkdDIsWyR0YmwsJGkyLGxzbCMyXQlAIFRlMltzMD4+OF0KKwlsZHIJJHQzLFskdGJsLCRpMyxsc2wjMl0JQCBUZTFbczA+PjE2XQorCisJYW5kCSRpMSxsciwkczEsbHNyIzE2CUAgaTAKKwlhbmQJJGkyLGxyLCRzMQorCWFuZAkkaTMsbHIsJHMxLGxzciM4CisJbW92CSRzMSwkczEsbHNyIzI0CisJbGRyCSRpMSxbJHRibCwkaTEsbHNsIzJdCUAgVGUxW3MxPj4xNl0KKwlsZHIJJHMxLFskdGJsLCRzMSxsc2wjMl0JQCBUZTBbczE+PjI0XQorCWxkcgkkaTIsWyR0YmwsJGkyLGxzbCMyXQlAIFRlM1tzMT4+MF0KKwlsZHIJJGkzLFskdGJsLCRpMyxsc2wjMl0JQCBUZTJbczE+PjhdCisJZW9yCSRzMCwkczAsJGkxLHJvciM4CisJZW9yCSRzMSwkczEsJHQxLHJvciMyNAorCWVvcgkkdDIsJHQyLCRpMixyb3IjOAorCWVvcgkkdDMsJHQzLCRpMyxyb3IjOAorCisJYW5kCSRpMSxsciwkczIsbHNyIzgJQCBpMAorCWFuZAkkaTIsbHIsJHMyLGxzciMxNglAIGkxCisJYW5kCSRpMyxsciwkczIKKwltb3YJJHMyLCRzMixsc3IjMjQKKwlsZHIJJGkxLFskdGJsLCRpMSxsc2wjMl0JQCBUZTJbczI+PjhdCisJbGRyCSRpMixbJHRibCwkaTIsbHNsIzJdCUAgVGUxW3MyPj4xNl0KKwlsZHIJJHMyLFskdGJsLCRzMixsc2wjMl0JQCBUZTBbczI+PjI0XQorCWxkcgkkaTMsWyR0YmwsJGkzLGxzbCMyXQlAIFRlM1tzMj4+MF0KKwllb3IJJHMwLCRzMCwkaTEscm9yIzE2CisJZW9yCSRzMSwkczEsJGkyLHJvciM4CisJZW9yCSRzMiwkczIsJHQyLHJvciMxNgorCWVvcgkkdDMsJHQzLCRpMyxyb3IjMTYKKworCWFuZAkkaTEsbHIsJHMzCQlAIGkwCisJYW5kCSRpMixsciwkczMsbHNyIzgJQCBpMQorCWFuZAkkaTMsbHIsJHMzLGxzciMxNglAIGkyCisJbW92CSRzMywkczMsbHNyIzI0CisJbGRyCSRpMSxbJHRibCwkaTEsbHNsIzJdCUAgVGUzW3MzPj4wXQorCWxkcgkkaTIsWyR0YmwsJGkyLGxzbCMyXQlAIFRlMltzMz4+OF0KKwlsZHIJJGkzLFskdGJsLCRpMyxsc2wjMl0JQCBUZTFbczM+PjE2XQorCWxkcgkkczMsWyR0YmwsJHMzLGxzbCMyXQlAIFRlMFtzMz4+MjRdCisJZW9yCSRzMCwkczAsJGkxLHJvciMyNAorCWVvcgkkczEsJHMxLCRpMixyb3IjMTYKKwllb3IJJHMyLCRzMiwkaTMscm9yIzgKKwllb3IJJHMzLCRzMywkdDMscm9yIzgKKworCWxkcgkkdDEsWyRrZXldLCMxNgorCWxkcgkkdDIsWyRrZXksIy0xMl0KKwlsZHIJJHQzLFska2V5LCMtOF0KKwlsZHIJJGkxLFska2V5LCMtNF0KKwllb3IJJHMwLCRzMCwkdDEKKwllb3IJJHMxLCRzMSwkdDIKKwllb3IJJHMyLCRzMiwkdDMKKwllb3IJJHMzLCRzMywkaTEKKworCXN1YnMJJHJvdW5kcywkcm91bmRzLCMxCisJYm5lCS5MZW5jX2xvb3AKKworCWFkZAkkdGJsLCR0YmwsIzIKKworCWFuZAkkaTEsbHIsJHMwCisJYW5kCSRpMixsciwkczAsbHNyIzgKKwlhbmQJJGkzLGxyLCRzMCxsc3IjMTYKKwltb3YJJHMwLCRzMCxsc3IjMjQKKwlsZHJiCSR0MSxbJHRibCwkaTEsbHNsIzJdCUAgVGU0W3MwPj4wXQorCWxkcmIJJHMwLFskdGJsLCRzMCxsc2wjMl0JQCBUZTRbczA+PjI0XQorCWxkcmIJJHQyLFskdGJsLCRpMixsc2wjMl0JQCBUZTRbczA+PjhdCisJbGRyYgkkdDMsWyR0YmwsJGkzLGxzbCMyXQlAIFRlNFtzMD4+MTZdCisKKwlhbmQJJGkxLGxyLCRzMSxsc3IjMTYJQCBpMAorCWFuZAkkaTIsbHIsJHMxCisJYW5kCSRpMyxsciwkczEsbHNyIzgKKwltb3YJJHMxLCRzMSxsc3IjMjQKKwlsZHJiCSRpMSxbJHRibCwkaTEsbHNsIzJdCUAgVGU0W3MxPj4xNl0KKwlsZHJiCSRzMSxbJHRibCwkczEsbHNsIzJdCUAgVGU0W3MxPj4yNF0KKwlsZHJiCSRpMixbJHRibCwkaTIsbHNsIzJdCUAgVGU0W3MxPj4wXQorCWxkcmIJJGkzLFskdGJsLCRpMyxsc2wjMl0JQCBUZTRbczE+PjhdCisJZW9yCSRzMCwkaTEsJHMwLGxzbCM4CisJZW9yCSRzMSwkdDEsJHMxLGxzbCMyNAorCWVvcgkkdDIsJGkyLCR0Mixsc2wjOAorCWVvcgkkdDMsJGkzLCR0Myxsc2wjOAorCisJYW5kCSRpMSxsciwkczIsbHNyIzgJQCBpMAorCWFuZAkkaTIsbHIsJHMyLGxzciMxNglAIGkxCisJYW5kCSRpMyxsciwkczIKKwltb3YJJHMyLCRzMixsc3IjMjQKKwlsZHJiCSRpMSxbJHRibCwkaTEsbHNsIzJdCUAgVGU0W3MyPj44XQorCWxkcmIJJGkyLFskdGJsLCRpMixsc2wjMl0JQCBUZTRbczI+PjE2XQorCWxkcmIJJHMyLFskdGJsLCRzMixsc2wjMl0JQCBUZTRbczI+PjI0XQorCWxkcmIJJGkzLFskdGJsLCRpMyxsc2wjMl0JQCBUZTRbczI+PjBdCisJZW9yCSRzMCwkaTEsJHMwLGxzbCM4CisJZW9yCSRzMSwkczEsJGkyLGxzbCMxNgorCWVvcgkkczIsJHQyLCRzMixsc2wjMjQKKwllb3IJJHQzLCRpMywkdDMsbHNsIzgKKworCWFuZAkkaTEsbHIsJHMzCQlAIGkwCisJYW5kCSRpMixsciwkczMsbHNyIzgJQCBpMQorCWFuZAkkaTMsbHIsJHMzLGxzciMxNglAIGkyCisJbW92CSRzMywkczMsbHNyIzI0CisJbGRyYgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRlNFtzMz4+MF0KKwlsZHJiCSRpMixbJHRibCwkaTIsbHNsIzJdCUAgVGU0W3MzPj44XQorCWxkcmIJJGkzLFskdGJsLCRpMyxsc2wjMl0JQCBUZTRbczM+PjE2XQorCWxkcmIJJHMzLFskdGJsLCRzMyxsc2wjMl0JQCBUZTRbczM+PjI0XQorCWVvcgkkczAsJGkxLCRzMCxsc2wjOAorCWVvcgkkczEsJHMxLCRpMixsc2wjOAorCWVvcgkkczIsJHMyLCRpMyxsc2wjMTYKKwllb3IJJHMzLCR0MywkczMsbHNsIzI0CisKKwlsZHIJbHIsW3NwXSwjNAkJQCBwb3AgbHIKKwlsZHIJJHQxLFska2V5LCMwXQorCWxkcgkkdDIsWyRrZXksIzRdCisJbGRyCSR0MyxbJGtleSwjOF0KKwlsZHIJJGkxLFska2V5LCMxMl0KKwllb3IJJHMwLCRzMCwkdDEKKwllb3IJJHMxLCRzMSwkdDIKKwllb3IJJHMyLCRzMiwkdDMKKwllb3IJJHMzLCRzMywkaTEKKworCXN1YgkkdGJsLCR0YmwsIzIKKwltb3YJcGMsbHIJCQlAIHJldHVybgorLnNpemUJX2FybXY0X0FFU19lbmNyeXB0LC4tX2FybXY0X0FFU19lbmNyeXB0CisKKy5nbG9iYWwgQUVTX3NldF9lbmNyeXB0X2tleQorLnR5cGUgICBBRVNfc2V0X2VuY3J5cHRfa2V5LCVmdW5jdGlvbgorLmFsaWduCTUKK0FFU19zZXRfZW5jcnlwdF9rZXk6CisJc3ViCXIzLHBjLCM4CQlAIEFFU19zZXRfZW5jcnlwdF9rZXkKKwl0ZXEJcjAsIzAKKwltb3ZlcQlyMCwjLTEKKwliZXEJLkxhYnJ0CisJdGVxCXIyLCMwCisJbW92ZXEJcjAsIy0xCisJYmVxCS5MYWJydAorCisJdGVxCXIxLCMxMjgKKwliZXEJLkxvaworCXRlcQlyMSwjMTkyCisJYmVxCS5Mb2sKKwl0ZXEJcjEsIzI1NgorCW1vdm5lCXIwLCMtMQorCWJuZQkuTGFicnQKKworLkxvazoJc3RtZGIgICBzcCEse3I0LXIxMixscn0KKwlzdWIJJHRibCxyMywjQUVTX3NldF9lbmNyeXB0X2tleS1BRVNfVGUtMTAyNAlAIFRlNAorCisJbW92CSRyb3VuZHMscjAJCUAgaW5wCisJbW92CWxyLHIxCQkJQCBiaXRzCisJbW92CSRrZXkscjIJCQlAIGtleQorCisJbGRyYgkkczAsWyRyb3VuZHMsIzNdCUAgbG9hZCBpbnB1dCBkYXRhIGluIGVuZGlhbi1uZXV0cmFsCisJbGRyYgkkdDEsWyRyb3VuZHMsIzJdCUAgbWFubmVyLi4uCisJbGRyYgkkdDIsWyRyb3VuZHMsIzFdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzBdCisJb3JyCSRzMCwkczAsJHQxLGxzbCM4CisJb3JyCSRzMCwkczAsJHQyLGxzbCMxNgorCW9ycgkkczAsJHMwLCR0Myxsc2wjMjQKKwlsZHJiCSRzMSxbJHJvdW5kcywjN10KKwlsZHJiCSR0MSxbJHJvdW5kcywjNl0KKwlsZHJiCSR0MixbJHJvdW5kcywjNV0KKwlsZHJiCSR0MyxbJHJvdW5kcywjNF0KKwlvcnIJJHMxLCRzMSwkdDEsbHNsIzgKKwlvcnIJJHMxLCRzMSwkdDIsbHNsIzE2CisJb3JyCSRzMSwkczEsJHQzLGxzbCMyNAorCWxkcmIJJHMyLFskcm91bmRzLCMxMV0KKwlsZHJiCSR0MSxbJHJvdW5kcywjMTBdCisJbGRyYgkkdDIsWyRyb3VuZHMsIzldCisJbGRyYgkkdDMsWyRyb3VuZHMsIzhdCisJb3JyCSRzMiwkczIsJHQxLGxzbCM4CisJb3JyCSRzMiwkczIsJHQyLGxzbCMxNgorCW9ycgkkczIsJHMyLCR0Myxsc2wjMjQKKwlsZHJiCSRzMyxbJHJvdW5kcywjMTVdCisJbGRyYgkkdDEsWyRyb3VuZHMsIzE0XQorCWxkcmIJJHQyLFskcm91bmRzLCMxM10KKwlsZHJiCSR0MyxbJHJvdW5kcywjMTJdCisJb3JyCSRzMywkczMsJHQxLGxzbCM4CisJb3JyCSRzMywkczMsJHQyLGxzbCMxNgorCW9ycgkkczMsJHMzLCR0Myxsc2wjMjQKKwlzdHIJJHMwLFska2V5XSwjMTYKKwlzdHIJJHMxLFska2V5LCMtMTJdCisJc3RyCSRzMixbJGtleSwjLThdCisJc3RyCSRzMyxbJGtleSwjLTRdCisKKwl0ZXEJbHIsIzEyOAorCWJuZQkuTG5vdDEyOAorCW1vdgkkcm91bmRzLCMxMAorCXN0cgkkcm91bmRzLFska2V5LCMyNDAtMTZdCisJYWRkCSR0MywkdGJsLCMyNTYJCQlAIHJjb24KKwltb3YJbHIsIzI1NQorCisuTDEyOF9sb29wOgorCWFuZAkkdDIsbHIsJHMzLGxzciMyNAorCWFuZAkkaTEsbHIsJHMzLGxzciMxNgorCWFuZAkkaTIsbHIsJHMzLGxzciM4CisJYW5kCSRpMyxsciwkczMKKwlsZHJiCSR0MixbJHRibCwkdDJdCisJbGRyYgkkaTEsWyR0YmwsJGkxXQorCWxkcmIJJGkyLFskdGJsLCRpMl0KKwlsZHJiCSRpMyxbJHRibCwkaTNdCisJbGRyCSR0MSxbJHQzXSwjNAkJCUAgcmNvbltpKytdCisJb3JyCSR0MiwkdDIsJGkxLGxzbCMyNAorCW9ycgkkdDIsJHQyLCRpMixsc2wjMTYKKwlvcnIJJHQyLCR0MiwkaTMsbHNsIzgKKwllb3IJJHQyLCR0MiwkdDEKKwllb3IJJHMwLCRzMCwkdDIJCQlAIHJrWzRdPXJrWzBdXi4uLgorCWVvcgkkczEsJHMxLCRzMAkJCUAgcmtbNV09cmtbMV1ecmtbNF0KKwllb3IJJHMyLCRzMiwkczEJCQlAIHJrWzZdPXJrWzJdXnJrWzVdCisJZW9yCSRzMywkczMsJHMyCQkJQCBya1s3XT1ya1szXV5ya1s2XQorCXN0cgkkczAsWyRrZXldLCMxNgorCXN0cgkkczEsWyRrZXksIy0xMl0KKwlzdHIJJHMyLFska2V5LCMtOF0KKwlzdHIJJHMzLFska2V5LCMtNF0KKworCXN1YnMJJHJvdW5kcywkcm91bmRzLCMxCisJYm5lCS5MMTI4X2xvb3AKKwlzdWIJcjIsJGtleSwjMTc2CisJYgkuTGRvbmUKKworLkxub3QxMjg6CisJbGRyYgkkaTIsWyRyb3VuZHMsIzE5XQorCWxkcmIJJHQxLFskcm91bmRzLCMxOF0KKwlsZHJiCSR0MixbJHJvdW5kcywjMTddCisJbGRyYgkkdDMsWyRyb3VuZHMsIzE2XQorCW9ycgkkaTIsJGkyLCR0MSxsc2wjOAorCW9ycgkkaTIsJGkyLCR0Mixsc2wjMTYKKwlvcnIJJGkyLCRpMiwkdDMsbHNsIzI0CisJbGRyYgkkaTMsWyRyb3VuZHMsIzIzXQorCWxkcmIJJHQxLFskcm91bmRzLCMyMl0KKwlsZHJiCSR0MixbJHJvdW5kcywjMjFdCisJbGRyYgkkdDMsWyRyb3VuZHMsIzIwXQorCW9ycgkkaTMsJGkzLCR0MSxsc2wjOAorCW9ycgkkaTMsJGkzLCR0Mixsc2wjMTYKKwlvcnIJJGkzLCRpMywkdDMsbHNsIzI0CisJc3RyCSRpMixbJGtleV0sIzgKKwlzdHIJJGkzLFska2V5LCMtNF0KKworCXRlcQlsciwjMTkyCisJYm5lCS5Mbm90MTkyCisJbW92CSRyb3VuZHMsIzEyCisJc3RyCSRyb3VuZHMsWyRrZXksIzI0MC0yNF0KKwlhZGQJJHQzLCR0YmwsIzI1NgkJCUAgcmNvbgorCW1vdglsciwjMjU1CisJbW92CSRyb3VuZHMsIzgKKworLkwxOTJfbG9vcDoKKwlhbmQJJHQyLGxyLCRpMyxsc3IjMjQKKwlhbmQJJGkxLGxyLCRpMyxsc3IjMTYKKwlhbmQJJGkyLGxyLCRpMyxsc3IjOAorCWFuZAkkaTMsbHIsJGkzCisJbGRyYgkkdDIsWyR0YmwsJHQyXQorCWxkcmIJJGkxLFskdGJsLCRpMV0KKwlsZHJiCSRpMixbJHRibCwkaTJdCisJbGRyYgkkaTMsWyR0YmwsJGkzXQorCWxkcgkkdDEsWyR0M10sIzQJCQlAIHJjb25baSsrXQorCW9ycgkkdDIsJHQyLCRpMSxsc2wjMjQKKwlvcnIJJHQyLCR0MiwkaTIsbHNsIzE2CisJb3JyCSR0MiwkdDIsJGkzLGxzbCM4CisJZW9yCSRpMywkdDIsJHQxCisJZW9yCSRzMCwkczAsJGkzCQkJQCBya1s2XT1ya1swXV4uLi4KKwllb3IJJHMxLCRzMSwkczAJCQlAIHJrWzddPXJrWzFdXnJrWzZdCisJZW9yCSRzMiwkczIsJHMxCQkJQCBya1s4XT1ya1syXV5ya1s3XQorCWVvcgkkczMsJHMzLCRzMgkJCUAgcmtbOV09cmtbM11ecmtbOF0KKwlzdHIJJHMwLFska2V5XSwjMjQKKwlzdHIJJHMxLFska2V5LCMtMjBdCisJc3RyCSRzMixbJGtleSwjLTE2XQorCXN0cgkkczMsWyRrZXksIy0xMl0KKworCXN1YnMJJHJvdW5kcywkcm91bmRzLCMxCisJc3ViZXEJcjIsJGtleSwjMjE2CisJYmVxCS5MZG9uZQorCisJbGRyCSRpMSxbJGtleSwjLTMyXQorCWxkcgkkaTIsWyRrZXksIy0yOF0KKwllb3IJJGkxLCRpMSwkczMJCQlAIHJrWzEwXT1ya1s0XV5ya1s5XQorCWVvcgkkaTMsJGkyLCRpMQkJCUAgcmtbMTFdPXJrWzVdXnJrWzEwXQorCXN0cgkkaTEsWyRrZXksIy04XQorCXN0cgkkaTMsWyRrZXksIy00XQorCWIJLkwxOTJfbG9vcAorCisuTG5vdDE5MjoKKwlsZHJiCSRpMixbJHJvdW5kcywjMjddCisJbGRyYgkkdDEsWyRyb3VuZHMsIzI2XQorCWxkcmIJJHQyLFskcm91bmRzLCMyNV0KKwlsZHJiCSR0MyxbJHJvdW5kcywjMjRdCisJb3JyCSRpMiwkaTIsJHQxLGxzbCM4CisJb3JyCSRpMiwkaTIsJHQyLGxzbCMxNgorCW9ycgkkaTIsJGkyLCR0Myxsc2wjMjQKKwlsZHJiCSRpMyxbJHJvdW5kcywjMzFdCisJbGRyYgkkdDEsWyRyb3VuZHMsIzMwXQorCWxkcmIJJHQyLFskcm91bmRzLCMyOV0KKwlsZHJiCSR0MyxbJHJvdW5kcywjMjhdCisJb3JyCSRpMywkaTMsJHQxLGxzbCM4CisJb3JyCSRpMywkaTMsJHQyLGxzbCMxNgorCW9ycgkkaTMsJGkzLCR0Myxsc2wjMjQKKwlzdHIJJGkyLFska2V5XSwjOAorCXN0cgkkaTMsWyRrZXksIy00XQorCisJbW92CSRyb3VuZHMsIzE0CisJc3RyCSRyb3VuZHMsWyRrZXksIzI0MC0zMl0KKwlhZGQJJHQzLCR0YmwsIzI1NgkJCUAgcmNvbgorCW1vdglsciwjMjU1CisJbW92CSRyb3VuZHMsIzcKKworLkwyNTZfbG9vcDoKKwlhbmQJJHQyLGxyLCRpMyxsc3IjMjQKKwlhbmQJJGkxLGxyLCRpMyxsc3IjMTYKKwlhbmQJJGkyLGxyLCRpMyxsc3IjOAorCWFuZAkkaTMsbHIsJGkzCisJbGRyYgkkdDIsWyR0YmwsJHQyXQorCWxkcmIJJGkxLFskdGJsLCRpMV0KKwlsZHJiCSRpMixbJHRibCwkaTJdCisJbGRyYgkkaTMsWyR0YmwsJGkzXQorCWxkcgkkdDEsWyR0M10sIzQJCQlAIHJjb25baSsrXQorCW9ycgkkdDIsJHQyLCRpMSxsc2wjMjQKKwlvcnIJJHQyLCR0MiwkaTIsbHNsIzE2CisJb3JyCSR0MiwkdDIsJGkzLGxzbCM4CisJZW9yCSRpMywkdDIsJHQxCisJZW9yCSRzMCwkczAsJGkzCQkJQCBya1s4XT1ya1swXV4uLi4KKwllb3IJJHMxLCRzMSwkczAJCQlAIHJrWzldPXJrWzFdXnJrWzhdCisJZW9yCSRzMiwkczIsJHMxCQkJQCBya1sxMF09cmtbMl1ecmtbOV0KKwllb3IJJHMzLCRzMywkczIJCQlAIHJrWzExXT1ya1szXV5ya1sxMF0KKwlzdHIJJHMwLFska2V5XSwjMzIKKwlzdHIJJHMxLFska2V5LCMtMjhdCisJc3RyCSRzMixbJGtleSwjLTI0XQorCXN0cgkkczMsWyRrZXksIy0yMF0KKworCXN1YnMJJHJvdW5kcywkcm91bmRzLCMxCisJc3ViZXEJcjIsJGtleSwjMjU2CisJYmVxCS5MZG9uZQorCisJYW5kCSR0MixsciwkczMKKwlhbmQJJGkxLGxyLCRzMyxsc3IjOAorCWFuZAkkaTIsbHIsJHMzLGxzciMxNgorCWFuZAkkaTMsbHIsJHMzLGxzciMyNAorCWxkcmIJJHQyLFskdGJsLCR0Ml0KKwlsZHJiCSRpMSxbJHRibCwkaTFdCisJbGRyYgkkaTIsWyR0YmwsJGkyXQorCWxkcmIJJGkzLFskdGJsLCRpM10KKwlvcnIJJHQyLCR0MiwkaTEsbHNsIzgKKwlvcnIJJHQyLCR0MiwkaTIsbHNsIzE2CisJb3JyCSR0MiwkdDIsJGkzLGxzbCMyNAorCisJbGRyCSR0MSxbJGtleSwjLTQ4XQorCWxkcgkkaTEsWyRrZXksIy00NF0KKwlsZHIJJGkyLFska2V5LCMtNDBdCisJbGRyCSRpMyxbJGtleSwjLTM2XQorCWVvcgkkdDEsJHQxLCR0MgkJCUAgcmtbMTJdPXJrWzRdXi4uLgorCWVvcgkkaTEsJGkxLCR0MQkJCUAgcmtbMTNdPXJrWzVdXnJrWzEyXQorCWVvcgkkaTIsJGkyLCRpMQkJCUAgcmtbMTRdPXJrWzZdXnJrWzEzXQorCWVvcgkkaTMsJGkzLCRpMgkJCUAgcmtbMTVdPXJrWzddXnJrWzE0XQorCXN0cgkkdDEsWyRrZXksIy0xNl0KKwlzdHIJJGkxLFska2V5LCMtMTJdCisJc3RyCSRpMixbJGtleSwjLThdCisJc3RyCSRpMyxbJGtleSwjLTRdCisJYgkuTDI1Nl9sb29wCisKKy5MZG9uZToJbW92CXIwLCMwCisJbGRtaWEgICBzcCEse3I0LXIxMixscn0KKy5MYWJydDoJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCWJ4CWxyCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisuc2l6ZQlBRVNfc2V0X2VuY3J5cHRfa2V5LC4tQUVTX3NldF9lbmNyeXB0X2tleQorCisuZ2xvYmFsIEFFU19zZXRfZGVjcnlwdF9rZXkKKy50eXBlICAgQUVTX3NldF9kZWNyeXB0X2tleSwlZnVuY3Rpb24KKy5hbGlnbgk1CitBRVNfc2V0X2RlY3J5cHRfa2V5OgorCXN0cglscixbc3AsIy00XSEgICAgICAgICAgICBAIHB1c2ggbHIKKwlibAlBRVNfc2V0X2VuY3J5cHRfa2V5CisJdGVxCXIwLCMwCisJbGRybmUJbHIsW3NwXSwjNCAgICAgICAgICAgICAgQCBwb3AgbHIKKwlibmUJLkxhYnJ0CisKKwlzdG1kYiAgIHNwISx7cjQtcjEyfQorCisJbGRyCSRyb3VuZHMsW3IyLCMyNDBdCUAgQUVTX3NldF9lbmNyeXB0X2tleSBwcmVzZXJ2ZXMgcjIsCisJbW92CSRrZXkscjIJCQlAIHdoaWNoIGlzIEFFU19LRVkgKmtleQorCW1vdgkkaTEscjIKKwlhZGQJJGkyLHIyLCRyb3VuZHMsbHNsIzQKKworLkxpbnY6CWxkcgkkczAsWyRpMV0KKwlsZHIJJHMxLFskaTEsIzRdCisJbGRyCSRzMixbJGkxLCM4XQorCWxkcgkkczMsWyRpMSwjMTJdCisJbGRyCSR0MSxbJGkyXQorCWxkcgkkdDIsWyRpMiwjNF0KKwlsZHIJJHQzLFskaTIsIzhdCisJbGRyCSRpMyxbJGkyLCMxMl0KKwlzdHIJJHMwLFskaTJdLCMtMTYKKwlzdHIJJHMxLFskaTIsIzE2KzRdCisJc3RyCSRzMixbJGkyLCMxNis4XQorCXN0cgkkczMsWyRpMiwjMTYrMTJdCisJc3RyCSR0MSxbJGkxXSwjMTYKKwlzdHIJJHQyLFskaTEsIy0xMl0KKwlzdHIJJHQzLFskaTEsIy04XQorCXN0cgkkaTMsWyRpMSwjLTRdCisJdGVxCSRpMSwkaTIKKwlibmUJLkxpbnYKK19fXworJG1hc2s4MD0kaTE7CiskbWFzazFiPSRpMjsKKyRtYXNrN2Y9JGkzOworJGNvZGUuPTw8X19fOworCWxkcgkkczAsWyRrZXksIzE2XSEJCUAgcHJlZmV0Y2ggdHAxCisJbW92CSRtYXNrODAsIzB4ODAKKwltb3YJJG1hc2sxYiwjMHgxYgorCW9ycgkkbWFzazgwLCRtYXNrODAsIzB4ODAwMAorCW9ycgkkbWFzazFiLCRtYXNrMWIsIzB4MWIwMAorCW9ycgkkbWFzazgwLCRtYXNrODAsJG1hc2s4MCxsc2wjMTYKKwlvcnIJJG1hc2sxYiwkbWFzazFiLCRtYXNrMWIsbHNsIzE2CisJc3ViCSRyb3VuZHMsJHJvdW5kcywjMQorCW12bgkkbWFzazdmLCRtYXNrODAKKwltb3YJJHJvdW5kcywkcm91bmRzLGxzbCMyCUAgKHJvdW5kcy0xKSo0CisKKy5MbWl4OglhbmQJJHQxLCRzMCwkbWFzazgwCisJYW5kCSRzMSwkczAsJG1hc2s3ZgorCXN1YgkkdDEsJHQxLCR0MSxsc3IjNworCWFuZAkkdDEsJHQxLCRtYXNrMWIKKwllb3IJJHMxLCR0MSwkczEsbHNsIzEJQCB0cDIKKworCWFuZAkkdDEsJHMxLCRtYXNrODAKKwlhbmQJJHMyLCRzMSwkbWFzazdmCisJc3ViCSR0MSwkdDEsJHQxLGxzciM3CisJYW5kCSR0MSwkdDEsJG1hc2sxYgorCWVvcgkkczIsJHQxLCRzMixsc2wjMQlAIHRwNAorCisJYW5kCSR0MSwkczIsJG1hc2s4MAorCWFuZAkkczMsJHMyLCRtYXNrN2YKKwlzdWIJJHQxLCR0MSwkdDEsbHNyIzcKKwlhbmQJJHQxLCR0MSwkbWFzazFiCisJZW9yCSRzMywkdDEsJHMzLGxzbCMxCUAgdHA4CisKKwllb3IJJHQxLCRzMSwkczIKKwllb3IJJHQyLCRzMCwkczMJCUAgdHA5CisJZW9yCSR0MSwkdDEsJHMzCQlAIHRwZQorCWVvcgkkdDEsJHQxLCRzMSxyb3IjMjQKKwllb3IJJHQxLCR0MSwkdDIscm9yIzI0CUAgXj0gUk9UQVRFKHRwYj10cDledHAyLDgpCisJZW9yCSR0MSwkdDEsJHMyLHJvciMxNgorCWVvcgkkdDEsJHQxLCR0Mixyb3IjMTYJQCBePSBST1RBVEUodHBkPXRwOV50cDQsMTYpCisJZW9yCSR0MSwkdDEsJHQyLHJvciM4CUAgXj0gUk9UQVRFKHRwOSwyNCkKKworCWxkcgkkczAsWyRrZXksIzRdCQlAIHByZWZldGNoIHRwMQorCXN0cgkkdDEsWyRrZXldLCM0CisJc3Vicwkkcm91bmRzLCRyb3VuZHMsIzEKKwlibmUJLkxtaXgKKworCW1vdglyMCwjMAorCWxkbWlhICAgc3AhLHtyNC1yMTIsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCWJ4CWxyCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisuc2l6ZQlBRVNfc2V0X2RlY3J5cHRfa2V5LC4tQUVTX3NldF9kZWNyeXB0X2tleQorCisudHlwZQlBRVNfVGQsJW9iamVjdAorLmFsaWduCTUKK0FFU19UZDoKKy53b3JkCTB4NTFmNGE3NTAsIDB4N2U0MTY1NTMsIDB4MWExN2E0YzMsIDB4M2EyNzVlOTYKKy53b3JkCTB4M2JhYjZiY2IsIDB4MWY5ZDQ1ZjEsIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMKKy53b3JkCTB4MjAzMGZhNTUsIDB4YWQ3NjZkZjYsIDB4ODhjYzc2OTEsIDB4ZjUwMjRjMjUKKy53b3JkCTB4NGZlNWQ3ZmMsIDB4YzUyYWNiZDcsIDB4MjYzNTQ0ODAsIDB4YjU2MmEzOGYKKy53b3JkCTB4ZGViMTVhNDksIDB4MjViYTFiNjcsIDB4NDVlYTBlOTgsIDB4NWRmZWMwZTEKKy53b3JkCTB4YzMyZjc1MDIsIDB4ODE0Y2YwMTIsIDB4OGQ0Njk3YTMsIDB4NmJkM2Y5YzYKKy53b3JkCTB4MDM4ZjVmZTcsIDB4MTU5MjljOTUsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEKKy53b3JkCTB4ZDRiZTgzMmQsIDB4NTg3NDIxZDMsIDB4NDllMDY5MjksIDB4OGVjOWM4NDQKKy53b3JkCTB4NzVjMjg5NmEsIDB4ZjQ4ZTc5NzgsIDB4OTk1ODNlNmIsIDB4MjdiOTcxZGQKKy53b3JkCTB4YmVlMTRmYjYsIDB4ZjA4OGFkMTcsIDB4YzkyMGFjNjYsIDB4N2RjZTNhYjQKKy53b3JkCTB4NjNkZjRhMTgsIDB4ZTUxYTMxODIsIDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUKKy53b3JkCTB4YjE2NDc3ZTAsIDB4YmI2YmFlODQsIDB4ZmU4MWEwMWMsIDB4ZjkwODJiOTQKKy53b3JkCTB4NzA0ODY4NTgsIDB4OGY0NWZkMTksIDB4OTRkZTZjODcsIDB4NTI3YmY4YjcKKy53b3JkCTB4YWI3M2QzMjMsIDB4NzI0YjAyZTIsIDB4ZTMxZjhmNTcsIDB4NjY1NWFiMmEKKy53b3JkCTB4YjJlYjI4MDcsIDB4MmZiNWMyMDMsIDB4ODZjNTdiOWEsIDB4ZDMzNzA4YTUKKy53b3JkCTB4MzAyODg3ZjIsIDB4MjNiZmE1YjIsIDB4MDIwMzZhYmEsIDB4ZWQxNjgyNWMKKy53b3JkCTB4OGFjZjFjMmIsIDB4YTc3OWI0OTIsIDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEKKy53b3JkCTB4NjVkYWY0Y2QsIDB4MDYwNWJlZDUsIDB4ZDEzNDYyMWYsIDB4YzRhNmZlOGEKKy53b3JkCTB4MzQyZTUzOWQsIDB4YTJmMzU1YTAsIDB4MDU4YWUxMzIsIDB4YTRmNmViNzUKKy53b3JkCTB4MGI4M2VjMzksIDB4NDA2MGVmYWEsIDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEKKy53b3JkCTB4M2UyMThhZjksIDB4OTZkZDA2M2QsIDB4ZGQzZTA1YWUsIDB4NGRlNmJkNDYKKy53b3JkCTB4OTE1NDhkYjUsIDB4NzFjNDVkMDUsIDB4MDQwNmQ0NmYsIDB4NjA1MDE1ZmYKKy53b3JkCTB4MTk5OGZiMjQsIDB4ZDZiZGU5OTcsIDB4ODk0MDQzY2MsIDB4NjdkOTllNzcKKy53b3JkCTB4YjBlODQyYmQsIDB4MDc4OThiODgsIDB4ZTcxOTViMzgsIDB4NzljOGVlZGIKKy53b3JkCTB4YTE3YzBhNDcsIDB4N2M0MjBmZTksIDB4Zjg4NDFlYzksIDB4MDAwMDAwMDAKKy53b3JkCTB4MDk4MDg2ODMsIDB4MzIyYmVkNDgsIDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUKKy53b3JkCTB4ZmQwZWZmZmIsIDB4MGY4NTM4NTYsIDB4M2RhZWQ1MWUsIDB4MzYyZDM5MjcKKy53b3JkCTB4MGEwZmQ5NjQsIDB4Njg1Y2E2MjEsIDB4OWI1YjU0ZDEsIDB4MjQzNjJlM2EKKy53b3JkCTB4MGMwYTY3YjEsIDB4OTM1N2U3MGYsIDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUKKy53b3JkCTB4ODBjMGM1NGYsIDB4NjFkYzIwYTIsIDB4NWE3NzRiNjksIDB4MWMxMjFhMTYKKy53b3JkCTB4ZTI5M2JhMGEsIDB4YzBhMDJhZTUsIDB4M2MyMmUwNDMsIDB4MTIxYjE3MWQKKy53b3JkCTB4MGUwOTBkMGIsIDB4ZjI4YmM3YWQsIDB4MmRiNmE4YjksIDB4MTQxZWE5YzgKKy53b3JkCTB4NTdmMTE5ODUsIDB4YWY3NTA3NGMsIDB4ZWU5OWRkYmIsIDB4YTM3ZjYwZmQKKy53b3JkCTB4ZjcwMTI2OWYsIDB4NWM3MmY1YmMsIDB4NDQ2NjNiYzUsIDB4NWJmYjdlMzQKKy53b3JkCTB4OGI0MzI5NzYsIDB4Y2IyM2M2ZGMsIDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMKKy53b3JkCTB4ZDczMWRjY2EsIDB4NDI2Mzg1MTAsIDB4MTM5NzIyNDAsIDB4ODRjNjExMjAKKy53b3JkCTB4ODU0YTI0N2QsIDB4ZDJiYjNkZjgsIDB4YWVmOTMyMTEsIDB4YzcyOWExNmQKKy53b3JkCTB4MWQ5ZTJmNGIsIDB4ZGNiMjMwZjMsIDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAKKy53b3JkCTB4MmJiMzE2NmMsIDB4YTk3MGI5OTksIDB4MTE5NDQ4ZmEsIDB4NDdlOTY0MjIKKy53b3JkCTB4YThmYzhjYzQsIDB4YTBmMDNmMWEsIDB4NTY3ZDJjZDgsIDB4MjIzMzkwZWYKKy53b3JkCTB4ODc0OTRlYzcsIDB4ZDkzOGQxYzEsIDB4OGNjYWEyZmUsIDB4OThkNDBiMzYKKy53b3JkCTB4YTZmNTgxY2YsIDB4YTU3YWRlMjgsIDB4ZGFiNzhlMjYsIDB4M2ZhZGJmYTQKKy53b3JkCTB4MmMzYTlkZTQsIDB4NTA3ODkyMGQsIDB4NmE1ZmNjOWIsIDB4NTQ3ZTQ2NjIKKy53b3JkCTB4ZjY4ZDEzYzIsIDB4OTBkOGI4ZTgsIDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUKKy53b3JkCTB4OWY1ZDgwYmUsIDB4NjlkMDkzN2MsIDB4NmZkNTJkYTksIDB4Y2YyNTEyYjMKKy53b3JkCTB4YzhhYzk5M2IsIDB4MTAxODdkYTcsIDB4ZTg5YzYzNmUsIDB4ZGIzYmJiN2IKKy53b3JkCTB4Y2QyNjc4MDksIDB4NmU1OTE4ZjQsIDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgKKy53b3JkCTB4ZTY5NTZlNjUsIDB4YWFmZmU2N2UsIDB4MjFiY2NmMDgsIDB4ZWYxNWU4ZTYKKy53b3JkCTB4YmFlNzliZDksIDB4NGE2ZjM2Y2UsIDB4ZWE5ZjA5ZDQsIDB4MjliMDdjZDYKKy53b3JkCTB4MzFhNGIyYWYsIDB4MmEzZjIzMzEsIDB4YzZhNTk0MzAsIDB4MzVhMjY2YzAKKy53b3JkCTB4NzQ0ZWJjMzcsIDB4ZmM4MmNhYTYsIDB4ZTA5MGQwYjAsIDB4MzNhN2Q4MTUKKy53b3JkCTB4ZjEwNDk4NGEsIDB4NDFlY2RhZjcsIDB4N2ZjZDUwMGUsIDB4MTc5MWY2MmYKKy53b3JkCTB4NzY0ZGQ2OGQsIDB4NDNlZmIwNGQsIDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYKKy53b3JkCTB4OWVkMWI1ZTMsIDB4NGM2YTg4MWIsIDB4YzEyYzFmYjgsIDB4NDY2NTUxN2YKKy53b3JkCTB4OWQ1ZWVhMDQsIDB4MDE4YzM1NWQsIDB4ZmE4Nzc0NzMsIDB4ZmIwYjQxMmUKKy53b3JkCTB4YjM2NzFkNWEsIDB4OTJkYmQyNTIsIDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMKKy53b3JkCTB4OWFkNzYxOGMsIDB4MzdhMTBjN2EsIDB4NTlmODE0OGUsIDB4ZWIxMzNjODkKKy53b3JkCTB4Y2VhOTI3ZWUsIDB4Yjc2MWM5MzUsIDB4ZTExY2U1ZWQsIDB4N2E0N2IxM2MKKy53b3JkCTB4OWNkMmRmNTksIDB4NTVmMjczM2YsIDB4MTgxNGNlNzksIDB4NzNjNzM3YmYKKy53b3JkCTB4NTNmN2NkZWEsIDB4NWZmZGFhNWIsIDB4ZGYzZDZmMTQsIDB4Nzg0NGRiODYKKy53b3JkCTB4Y2FhZmYzODEsIDB4Yjk2OGM0M2UsIDB4MzgyNDM0MmMsIDB4YzJhMzQwNWYKKy53b3JkCTB4MTYxZGMzNzIsIDB4YmNlMjI1MGMsIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEKKy53b3JkCTB4MzlhODAxNzEsIDB4MDgwY2IzZGUsIDB4ZDhiNGU0OWMsIDB4NjQ1NmMxOTAKKy53b3JkCTB4N2JjYjg0NjEsIDB4ZDUzMmI2NzAsIDB4NDg2YzVjNzQsIDB4ZDBiODU3NDIKK0AgVGQ0WzI1Nl0KKy5ieXRlCTB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgKKy5ieXRlCTB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIKKy5ieXRlCTB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcKKy5ieXRlCTB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IKKy5ieXRlCTB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QKKy5ieXRlCTB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUKKy5ieXRlCTB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIKKy5ieXRlCTB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUKKy5ieXRlCTB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYKKy5ieXRlCTB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIKKy5ieXRlCTB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEKKy5ieXRlCTB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQKKy5ieXRlCTB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEKKy5ieXRlCTB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYKKy5ieXRlCTB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIKKy5ieXRlCTB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIKKy5ieXRlCTB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEKKy5ieXRlCTB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMKKy5ieXRlCTB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUKKy5ieXRlCTB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUKKy5ieXRlCTB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkKKy5ieXRlCTB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIKKy5ieXRlCTB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAKKy5ieXRlCTB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQKKy5ieXRlCTB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEKKy5ieXRlCTB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYKKy5ieXRlCTB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQKKy5ieXRlCTB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYKKy5ieXRlCTB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAKKy5ieXRlCTB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEKKy5ieXRlCTB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYKKy5ieXRlCTB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QKKy5zaXplCUFFU19UZCwuLUFFU19UZAorCitAIHZvaWQgQUVTX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKK0AgCQkgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisuZ2xvYmFsIEFFU19kZWNyeXB0CisudHlwZSAgIEFFU19kZWNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTUKK0FFU19kZWNyeXB0OgorCXN1YglyMyxwYywjOAkJQCBBRVNfZGVjcnlwdAorCXN0bWRiICAgc3AhLHtyMSxyNC1yMTIsbHJ9CisJbW92CSRyb3VuZHMscjAJCUAgaW5wCisJbW92CSRrZXkscjIKKwlzdWIJJHRibCxyMywjQUVTX2RlY3J5cHQtQUVTX1RkCQlAIFRkCisKKwlsZHJiCSRzMCxbJHJvdW5kcywjM10JQCBsb2FkIGlucHV0IGRhdGEgaW4gZW5kaWFuLW5ldXRyYWwKKwlsZHJiCSR0MSxbJHJvdW5kcywjMl0JQCBtYW5uZXIuLi4KKwlsZHJiCSR0MixbJHJvdW5kcywjMV0KKwlsZHJiCSR0MyxbJHJvdW5kcywjMF0KKwlvcnIJJHMwLCRzMCwkdDEsbHNsIzgKKwlvcnIJJHMwLCRzMCwkdDIsbHNsIzE2CisJb3JyCSRzMCwkczAsJHQzLGxzbCMyNAorCWxkcmIJJHMxLFskcm91bmRzLCM3XQorCWxkcmIJJHQxLFskcm91bmRzLCM2XQorCWxkcmIJJHQyLFskcm91bmRzLCM1XQorCWxkcmIJJHQzLFskcm91bmRzLCM0XQorCW9ycgkkczEsJHMxLCR0MSxsc2wjOAorCW9ycgkkczEsJHMxLCR0Mixsc2wjMTYKKwlvcnIJJHMxLCRzMSwkdDMsbHNsIzI0CisJbGRyYgkkczIsWyRyb3VuZHMsIzExXQorCWxkcmIJJHQxLFskcm91bmRzLCMxMF0KKwlsZHJiCSR0MixbJHJvdW5kcywjOV0KKwlsZHJiCSR0MyxbJHJvdW5kcywjOF0KKwlvcnIJJHMyLCRzMiwkdDEsbHNsIzgKKwlvcnIJJHMyLCRzMiwkdDIsbHNsIzE2CisJb3JyCSRzMiwkczIsJHQzLGxzbCMyNAorCWxkcmIJJHMzLFskcm91bmRzLCMxNV0KKwlsZHJiCSR0MSxbJHJvdW5kcywjMTRdCisJbGRyYgkkdDIsWyRyb3VuZHMsIzEzXQorCWxkcmIJJHQzLFskcm91bmRzLCMxMl0KKwlvcnIJJHMzLCRzMywkdDEsbHNsIzgKKwlvcnIJJHMzLCRzMywkdDIsbHNsIzE2CisJb3JyCSRzMywkczMsJHQzLGxzbCMyNAorCisJYmwJX2FybXY0X0FFU19kZWNyeXB0CisKKwlsZHIJJHJvdW5kcyxbc3BdLCM0CQlAIHBvcCBvdXQKKwltb3YJJHQxLCRzMCxsc3IjMjQJCUAgd3JpdGUgb3V0cHV0IGluIGVuZGlhbi1uZXV0cmFsCisJbW92CSR0MiwkczAsbHNyIzE2CQlAIG1hbm5lci4uLgorCW1vdgkkdDMsJHMwLGxzciM4CisJc3RyYgkkdDEsWyRyb3VuZHMsIzBdCisJc3RyYgkkdDIsWyRyb3VuZHMsIzFdCisJc3RyYgkkdDMsWyRyb3VuZHMsIzJdCisJc3RyYgkkczAsWyRyb3VuZHMsIzNdCisJbW92CSR0MSwkczEsbHNyIzI0CisJbW92CSR0MiwkczEsbHNyIzE2CisJbW92CSR0MywkczEsbHNyIzgKKwlzdHJiCSR0MSxbJHJvdW5kcywjNF0KKwlzdHJiCSR0MixbJHJvdW5kcywjNV0KKwlzdHJiCSR0MyxbJHJvdW5kcywjNl0KKwlzdHJiCSRzMSxbJHJvdW5kcywjN10KKwltb3YJJHQxLCRzMixsc3IjMjQKKwltb3YJJHQyLCRzMixsc3IjMTYKKwltb3YJJHQzLCRzMixsc3IjOAorCXN0cmIJJHQxLFskcm91bmRzLCM4XQorCXN0cmIJJHQyLFskcm91bmRzLCM5XQorCXN0cmIJJHQzLFskcm91bmRzLCMxMF0KKwlzdHJiCSRzMixbJHJvdW5kcywjMTFdCisJbW92CSR0MSwkczMsbHNyIzI0CisJbW92CSR0MiwkczMsbHNyIzE2CisJbW92CSR0MywkczMsbHNyIzgKKwlzdHJiCSR0MSxbJHJvdW5kcywjMTJdCisJc3RyYgkkdDIsWyRyb3VuZHMsIzEzXQorCXN0cmIJJHQzLFskcm91bmRzLCMxNF0KKwlzdHJiCSRzMyxbJHJvdW5kcywjMTVdCisKKwlsZG1pYSAgIHNwISx7cjQtcjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwlieAlscgkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorLnNpemUJQUVTX2RlY3J5cHQsLi1BRVNfZGVjcnlwdAorCisudHlwZSAgIF9hcm12NF9BRVNfZGVjcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgkyCitfYXJtdjRfQUVTX2RlY3J5cHQ6CisJc3RyCWxyLFtzcCwjLTRdIQkJQCBwdXNoIGxyCisJbGRyCSR0MSxbJGtleV0sIzE2CisJbGRyCSR0MixbJGtleSwjLTEyXQorCWxkcgkkdDMsWyRrZXksIy04XQorCWxkcgkkaTEsWyRrZXksIy00XQorCWxkcgkkcm91bmRzLFska2V5LCMyNDAtMTZdCisJZW9yCSRzMCwkczAsJHQxCisJZW9yCSRzMSwkczEsJHQyCisJZW9yCSRzMiwkczIsJHQzCisJZW9yCSRzMywkczMsJGkxCisJc3ViCSRyb3VuZHMsJHJvdW5kcywjMQorCW1vdglsciwjMjU1CisKKy5MZGVjX2xvb3A6CisJYW5kCSRpMSxsciwkczAsbHNyIzE2CisJYW5kCSRpMixsciwkczAsbHNyIzgKKwlhbmQJJGkzLGxyLCRzMAorCW1vdgkkczAsJHMwLGxzciMyNAorCWxkcgkkdDEsWyR0YmwsJGkxLGxzbCMyXQlAIFRkMVtzMD4+MTZdCisJbGRyCSRzMCxbJHRibCwkczAsbHNsIzJdCUAgVGQwW3MwPj4yNF0KKwlsZHIJJHQyLFskdGJsLCRpMixsc2wjMl0JQCBUZDJbczA+PjhdCisJbGRyCSR0MyxbJHRibCwkaTMsbHNsIzJdCUAgVGQzW3MwPj4wXQorCisJYW5kCSRpMSxsciwkczEJCUAgaTAKKwlhbmQJJGkyLGxyLCRzMSxsc3IjMTYKKwlhbmQJJGkzLGxyLCRzMSxsc3IjOAorCW1vdgkkczEsJHMxLGxzciMyNAorCWxkcgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRkM1tzMT4+MF0KKwlsZHIJJHMxLFskdGJsLCRzMSxsc2wjMl0JQCBUZDBbczE+PjI0XQorCWxkcgkkaTIsWyR0YmwsJGkyLGxzbCMyXQlAIFRkMVtzMT4+MTZdCisJbGRyCSRpMyxbJHRibCwkaTMsbHNsIzJdCUAgVGQyW3MxPj44XQorCWVvcgkkczAsJHMwLCRpMSxyb3IjMjQKKwllb3IJJHMxLCRzMSwkdDEscm9yIzgKKwllb3IJJHQyLCRpMiwkdDIscm9yIzgKKwllb3IJJHQzLCRpMywkdDMscm9yIzgKKworCWFuZAkkaTEsbHIsJHMyLGxzciM4CUAgaTAKKwlhbmQJJGkyLGxyLCRzMgkJQCBpMQorCWFuZAkkaTMsbHIsJHMyLGxzciMxNgorCW1vdgkkczIsJHMyLGxzciMyNAorCWxkcgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRkMltzMj4+OF0KKwlsZHIJJGkyLFskdGJsLCRpMixsc2wjMl0JQCBUZDNbczI+PjBdCisJbGRyCSRzMixbJHRibCwkczIsbHNsIzJdCUAgVGQwW3MyPj4yNF0KKwlsZHIJJGkzLFskdGJsLCRpMyxsc2wjMl0JQCBUZDFbczI+PjE2XQorCWVvcgkkczAsJHMwLCRpMSxyb3IjMTYKKwllb3IJJHMxLCRzMSwkaTIscm9yIzI0CisJZW9yCSRzMiwkczIsJHQyLHJvciM4CisJZW9yCSR0MywkaTMsJHQzLHJvciM4CisKKwlhbmQJJGkxLGxyLCRzMyxsc3IjMTYJQCBpMAorCWFuZAkkaTIsbHIsJHMzLGxzciM4CUAgaTEKKwlhbmQJJGkzLGxyLCRzMwkJQCBpMgorCW1vdgkkczMsJHMzLGxzciMyNAorCWxkcgkkaTEsWyR0YmwsJGkxLGxzbCMyXQlAIFRkMVtzMz4+MTZdCisJbGRyCSRpMixbJHRibCwkaTIsbHNsIzJdCUAgVGQyW3MzPj44XQorCWxkcgkkaTMsWyR0YmwsJGkzLGxzbCMyXQlAIFRkM1tzMz4+MF0KKwlsZHIJJHMzLFskdGJsLCRzMyxsc2wjMl0JQCBUZDBbczM+PjI0XQorCWVvcgkkczAsJHMwLCRpMSxyb3IjOAorCWVvcgkkczEsJHMxLCRpMixyb3IjMTYKKwllb3IJJHMyLCRzMiwkaTMscm9yIzI0CisJZW9yCSRzMywkczMsJHQzLHJvciM4CisKKwlsZHIJJHQxLFska2V5XSwjMTYKKwlsZHIJJHQyLFska2V5LCMtMTJdCisJbGRyCSR0MyxbJGtleSwjLThdCisJbGRyCSRpMSxbJGtleSwjLTRdCisJZW9yCSRzMCwkczAsJHQxCisJZW9yCSRzMSwkczEsJHQyCisJZW9yCSRzMiwkczIsJHQzCisJZW9yCSRzMywkczMsJGkxCisKKwlzdWJzCSRyb3VuZHMsJHJvdW5kcywjMQorCWJuZQkuTGRlY19sb29wCisKKwlhZGQJJHRibCwkdGJsLCMxMDI0CisKKwlsZHIJJHQxLFskdGJsLCMwXQkJQCBwcmVmZXRjaCBUZDQKKwlsZHIJJHQyLFskdGJsLCMzMl0KKwlsZHIJJHQzLFskdGJsLCM2NF0KKwlsZHIJJGkxLFskdGJsLCM5Nl0KKwlsZHIJJGkyLFskdGJsLCMxMjhdCisJbGRyCSRpMyxbJHRibCwjMTYwXQorCWxkcgkkdDEsWyR0YmwsIzE5Ml0KKwlsZHIJJHQyLFskdGJsLCMyMjRdCisKKwlhbmQJJGkxLGxyLCRzMCxsc3IjMTYKKwlhbmQJJGkyLGxyLCRzMCxsc3IjOAorCWFuZAkkaTMsbHIsJHMwCisJbGRyYgkkczAsWyR0YmwsJHMwLGxzciMyNF0JQCBUZDRbczA+PjI0XQorCWxkcmIJJHQxLFskdGJsLCRpMV0JCUAgVGQ0W3MwPj4xNl0KKwlsZHJiCSR0MixbJHRibCwkaTJdCQlAIFRkNFtzMD4+OF0KKwlsZHJiCSR0MyxbJHRibCwkaTNdCQlAIFRkNFtzMD4+MF0KKworCWFuZAkkaTEsbHIsJHMxCQlAIGkwCisJYW5kCSRpMixsciwkczEsbHNyIzE2CisJYW5kCSRpMyxsciwkczEsbHNyIzgKKwlsZHJiCSRpMSxbJHRibCwkaTFdCQlAIFRkNFtzMT4+MF0KKwlsZHJiCSRzMSxbJHRibCwkczEsbHNyIzI0XQlAIFRkNFtzMT4+MjRdCisJbGRyYgkkaTIsWyR0YmwsJGkyXQkJQCBUZDRbczE+PjE2XQorCWxkcmIJJGkzLFskdGJsLCRpM10JCUAgVGQ0W3MxPj44XQorCWVvcgkkczAsJGkxLCRzMCxsc2wjMjQKKwllb3IJJHMxLCR0MSwkczEsbHNsIzgKKwllb3IJJHQyLCR0MiwkaTIsbHNsIzgKKwllb3IJJHQzLCR0MywkaTMsbHNsIzgKKworCWFuZAkkaTEsbHIsJHMyLGxzciM4CUAgaTAKKwlhbmQJJGkyLGxyLCRzMgkJQCBpMQorCWFuZAkkaTMsbHIsJHMyLGxzciMxNgorCWxkcmIJJGkxLFskdGJsLCRpMV0JCUAgVGQ0W3MyPj44XQorCWxkcmIJJGkyLFskdGJsLCRpMl0JCUAgVGQ0W3MyPj4wXQorCWxkcmIJJHMyLFskdGJsLCRzMixsc3IjMjRdCUAgVGQ0W3MyPj4yNF0KKwlsZHJiCSRpMyxbJHRibCwkaTNdCQlAIFRkNFtzMj4+MTZdCisJZW9yCSRzMCwkczAsJGkxLGxzbCM4CisJZW9yCSRzMSwkaTIsJHMxLGxzbCMxNgorCWVvcgkkczIsJHQyLCRzMixsc2wjMTYKKwllb3IJJHQzLCR0MywkaTMsbHNsIzE2CisKKwlhbmQJJGkxLGxyLCRzMyxsc3IjMTYJQCBpMAorCWFuZAkkaTIsbHIsJHMzLGxzciM4CUAgaTEKKwlhbmQJJGkzLGxyLCRzMwkJQCBpMgorCWxkcmIJJGkxLFskdGJsLCRpMV0JCUAgVGQ0W3MzPj4xNl0KKwlsZHJiCSRpMixbJHRibCwkaTJdCQlAIFRkNFtzMz4+OF0KKwlsZHJiCSRpMyxbJHRibCwkaTNdCQlAIFRkNFtzMz4+MF0KKwlsZHJiCSRzMyxbJHRibCwkczMsbHNyIzI0XQlAIFRkNFtzMz4+MjRdCisJZW9yCSRzMCwkczAsJGkxLGxzbCMxNgorCWVvcgkkczEsJHMxLCRpMixsc2wjOAorCWVvcgkkczIsJGkzLCRzMixsc2wjOAorCWVvcgkkczMsJHQzLCRzMyxsc2wjMjQKKworCWxkcglscixbc3BdLCM0CQlAIHBvcCBscgorCWxkcgkkdDEsWyRrZXksIzBdCisJbGRyCSR0MixbJGtleSwjNF0KKwlsZHIJJHQzLFska2V5LCM4XQorCWxkcgkkaTEsWyRrZXksIzEyXQorCWVvcgkkczAsJHMwLCR0MQorCWVvcgkkczEsJHMxLCR0MgorCWVvcgkkczIsJHMyLCR0MworCWVvcgkkczMsJHMzLCRpMQorCisJc3ViCSR0YmwsJHRibCwjMTAyNAorCW1vdglwYyxscgkJCUAgcmV0dXJuCisuc2l6ZQlfYXJtdjRfQUVTX2RlY3J5cHQsLi1fYXJtdjRfQUVTX2RlY3J5cHQKKy5hc2NpegkiQUVTIGZvciBBUk12NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkyCitfX18KKworJGNvZGUgPX4gcy9cYmJ4XHMrbHJcYi8ud29yZFx0MHhlMTJmZmYxZS9nbTsJIyBtYWtlIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgd2l0aCAtbWFyY2g9YXJtdjQKK3ByaW50ICRjb2RlOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMtYXJtdjQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQwMDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLWFybXY0LnMKQEAgLTAsMCArMSw5ODIgQEAKKy50ZXh0CisuY29kZQkzMgorCisudHlwZQlBRVNfVGUsJW9iamVjdAorLmFsaWduCTUKK0FFU19UZToKKy53b3JkCTB4YzY2MzYzYTUsIDB4Zjg3YzdjODQsIDB4ZWU3Nzc3OTksIDB4ZjY3YjdiOGQKKy53b3JkCTB4ZmZmMmYyMGQsIDB4ZDY2YjZiYmQsIDB4ZGU2ZjZmYjEsIDB4OTFjNWM1NTQKKy53b3JkCTB4NjAzMDMwNTAsIDB4MDIwMTAxMDMsIDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QKKy53b3JkCTB4ZTdmZWZlMTksIDB4YjVkN2Q3NjIsIDB4NGRhYmFiZTYsIDB4ZWM3Njc2OWEKKy53b3JkCTB4OGZjYWNhNDUsIDB4MWY4MjgyOWQsIDB4ODljOWM5NDAsIDB4ZmE3ZDdkODcKKy53b3JkCTB4ZWZmYWZhMTUsIDB4YjI1OTU5ZWIsIDB4OGU0NzQ3YzksIDB4ZmJmMGYwMGIKKy53b3JkCTB4NDFhZGFkZWMsIDB4YjNkNGQ0NjcsIDB4NWZhMmEyZmQsIDB4NDVhZmFmZWEKKy53b3JkCTB4MjM5YzljYmYsIDB4NTNhNGE0ZjcsIDB4ZTQ3MjcyOTYsIDB4OWJjMGMwNWIKKy53b3JkCTB4NzViN2I3YzIsIDB4ZTFmZGZkMWMsIDB4M2Q5MzkzYWUsIDB4NGMyNjI2NmEKKy53b3JkCTB4NmMzNjM2NWEsIDB4N2UzZjNmNDEsIDB4ZjVmN2Y3MDIsIDB4ODNjY2NjNGYKKy53b3JkCTB4NjgzNDM0NWMsIDB4NTFhNWE1ZjQsIDB4ZDFlNWU1MzQsIDB4ZjlmMWYxMDgKKy53b3JkCTB4ZTI3MTcxOTMsIDB4YWJkOGQ4NzMsIDB4NjIzMTMxNTMsIDB4MmExNTE1M2YKKy53b3JkCTB4MDgwNDA0MGMsIDB4OTVjN2M3NTIsIDB4NDYyMzIzNjUsIDB4OWRjM2MzNWUKKy53b3JkCTB4MzAxODE4MjgsIDB4Mzc5Njk2YTEsIDB4MGEwNTA1MGYsIDB4MmY5YTlhYjUKKy53b3JkCTB4MGUwNzA3MDksIDB4MjQxMjEyMzYsIDB4MWI4MDgwOWIsIDB4ZGZlMmUyM2QKKy53b3JkCTB4Y2RlYmViMjYsIDB4NGUyNzI3NjksIDB4N2ZiMmIyY2QsIDB4ZWE3NTc1OWYKKy53b3JkCTB4MTIwOTA5MWIsIDB4MWQ4MzgzOWUsIDB4NTgyYzJjNzQsIDB4MzQxYTFhMmUKKy53b3JkCTB4MzYxYjFiMmQsIDB4ZGM2ZTZlYjIsIDB4YjQ1YTVhZWUsIDB4NWJhMGEwZmIKKy53b3JkCTB4YTQ1MjUyZjYsIDB4NzYzYjNiNGQsIDB4YjdkNmQ2NjEsIDB4N2RiM2IzY2UKKy53b3JkCTB4NTIyOTI5N2IsIDB4ZGRlM2UzM2UsIDB4NWUyZjJmNzEsIDB4MTM4NDg0OTcKKy53b3JkCTB4YTY1MzUzZjUsIDB4YjlkMWQxNjgsIDB4MDAwMDAwMDAsIDB4YzFlZGVkMmMKKy53b3JkCTB4NDAyMDIwNjAsIDB4ZTNmY2ZjMWYsIDB4NzliMWIxYzgsIDB4YjY1YjViZWQKKy53b3JkCTB4ZDQ2YTZhYmUsIDB4OGRjYmNiNDYsIDB4NjdiZWJlZDksIDB4NzIzOTM5NGIKKy53b3JkCTB4OTQ0YTRhZGUsIDB4OTg0YzRjZDQsIDB4YjA1ODU4ZTgsIDB4ODVjZmNmNGEKKy53b3JkCTB4YmJkMGQwNmIsIDB4YzVlZmVmMmEsIDB4NGZhYWFhZTUsIDB4ZWRmYmZiMTYKKy53b3JkCTB4ODY0MzQzYzUsIDB4OWE0ZDRkZDcsIDB4NjYzMzMzNTUsIDB4MTE4NTg1OTQKKy53b3JkCTB4OGE0NTQ1Y2YsIDB4ZTlmOWY5MTAsIDB4MDQwMjAyMDYsIDB4ZmU3ZjdmODEKKy53b3JkCTB4YTA1MDUwZjAsIDB4NzgzYzNjNDQsIDB4MjU5ZjlmYmEsIDB4NGJhOGE4ZTMKKy53b3JkCTB4YTI1MTUxZjMsIDB4NWRhM2EzZmUsIDB4ODA0MDQwYzAsIDB4MDU4ZjhmOGEKKy53b3JkCTB4M2Y5MjkyYWQsIDB4MjE5ZDlkYmMsIDB4NzAzODM4NDgsIDB4ZjFmNWY1MDQKKy53b3JkCTB4NjNiY2JjZGYsIDB4NzdiNmI2YzEsIDB4YWZkYWRhNzUsIDB4NDIyMTIxNjMKKy53b3JkCTB4MjAxMDEwMzAsIDB4ZTVmZmZmMWEsIDB4ZmRmM2YzMGUsIDB4YmZkMmQyNmQKKy53b3JkCTB4ODFjZGNkNGMsIDB4MTgwYzBjMTQsIDB4MjYxMzEzMzUsIDB4YzNlY2VjMmYKKy53b3JkCTB4YmU1ZjVmZTEsIDB4MzU5Nzk3YTIsIDB4ODg0NDQ0Y2MsIDB4MmUxNzE3MzkKKy53b3JkCTB4OTNjNGM0NTcsIDB4NTVhN2E3ZjIsIDB4ZmM3ZTdlODIsIDB4N2EzZDNkNDcKKy53b3JkCTB4Yzg2NDY0YWMsIDB4YmE1ZDVkZTcsIDB4MzIxOTE5MmIsIDB4ZTY3MzczOTUKKy53b3JkCTB4YzA2MDYwYTAsIDB4MTk4MTgxOTgsIDB4OWU0ZjRmZDEsIDB4YTNkY2RjN2YKKy53b3JkCTB4NDQyMjIyNjYsIDB4NTQyYTJhN2UsIDB4M2I5MDkwYWIsIDB4MGI4ODg4ODMKKy53b3JkCTB4OGM0NjQ2Y2EsIDB4YzdlZWVlMjksIDB4NmJiOGI4ZDMsIDB4MjgxNDE0M2MKKy53b3JkCTB4YTdkZWRlNzksIDB4YmM1ZTVlZTIsIDB4MTYwYjBiMWQsIDB4YWRkYmRiNzYKKy53b3JkCTB4ZGJlMGUwM2IsIDB4NjQzMjMyNTYsIDB4NzQzYTNhNGUsIDB4MTQwYTBhMWUKKy53b3JkCTB4OTI0OTQ5ZGIsIDB4MGMwNjA2MGEsIDB4NDgyNDI0NmMsIDB4Yjg1YzVjZTQKKy53b3JkCTB4OWZjMmMyNWQsIDB4YmRkM2QzNmUsIDB4NDNhY2FjZWYsIDB4YzQ2MjYyYTYKKy53b3JkCTB4Mzk5MTkxYTgsIDB4MzE5NTk1YTQsIDB4ZDNlNGU0MzcsIDB4ZjI3OTc5OGIKKy53b3JkCTB4ZDVlN2U3MzIsIDB4OGJjOGM4NDMsIDB4NmUzNzM3NTksIDB4ZGE2ZDZkYjcKKy53b3JkCTB4MDE4ZDhkOGMsIDB4YjFkNWQ1NjQsIDB4OWM0ZTRlZDIsIDB4NDlhOWE5ZTAKKy53b3JkCTB4ZDg2YzZjYjQsIDB4YWM1NjU2ZmEsIDB4ZjNmNGY0MDcsIDB4Y2ZlYWVhMjUKKy53b3JkCTB4Y2E2NTY1YWYsIDB4ZjQ3YTdhOGUsIDB4NDdhZWFlZTksIDB4MTAwODA4MTgKKy53b3JkCTB4NmZiYWJhZDUsIDB4ZjA3ODc4ODgsIDB4NGEyNTI1NmYsIDB4NWMyZTJlNzIKKy53b3JkCTB4MzgxYzFjMjQsIDB4NTdhNmE2ZjEsIDB4NzNiNGI0YzcsIDB4OTdjNmM2NTEKKy53b3JkCTB4Y2JlOGU4MjMsIDB4YTFkZGRkN2MsIDB4ZTg3NDc0OWMsIDB4M2UxZjFmMjEKKy53b3JkCTB4OTY0YjRiZGQsIDB4NjFiZGJkZGMsIDB4MGQ4YjhiODYsIDB4MGY4YThhODUKKy53b3JkCTB4ZTA3MDcwOTAsIDB4N2MzZTNlNDIsIDB4NzFiNWI1YzQsIDB4Y2M2NjY2YWEKKy53b3JkCTB4OTA0ODQ4ZDgsIDB4MDYwMzAzMDUsIDB4ZjdmNmY2MDEsIDB4MWMwZTBlMTIKKy53b3JkCTB4YzI2MTYxYTMsIDB4NmEzNTM1NWYsIDB4YWU1NzU3ZjksIDB4NjliOWI5ZDAKKy53b3JkCTB4MTc4Njg2OTEsIDB4OTljMWMxNTgsIDB4M2ExZDFkMjcsIDB4Mjc5ZTllYjkKKy53b3JkCTB4ZDllMWUxMzgsIDB4ZWJmOGY4MTMsIDB4MmI5ODk4YjMsIDB4MjIxMTExMzMKKy53b3JkCTB4ZDI2OTY5YmIsIDB4YTlkOWQ5NzAsIDB4MDc4ZThlODksIDB4MzM5NDk0YTcKKy53b3JkCTB4MmQ5YjliYjYsIDB4M2MxZTFlMjIsIDB4MTU4Nzg3OTIsIDB4YzllOWU5MjAKKy53b3JkCTB4ODdjZWNlNDksIDB4YWE1NTU1ZmYsIDB4NTAyODI4NzgsIDB4YTVkZmRmN2EKKy53b3JkCTB4MDM4YzhjOGYsIDB4NTlhMWExZjgsIDB4MDk4OTg5ODAsIDB4MWEwZDBkMTcKKy53b3JkCTB4NjViZmJmZGEsIDB4ZDdlNmU2MzEsIDB4ODQ0MjQyYzYsIDB4ZDA2ODY4YjgKKy53b3JkCTB4ODI0MTQxYzMsIDB4Mjk5OTk5YjAsIDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEKKy53b3JkCTB4N2JiMGIwY2IsIDB4YTg1NDU0ZmMsIDB4NmRiYmJiZDYsIDB4MmMxNjE2M2EKK0AgVGU0WzI1Nl0KKy5ieXRlCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUKKy5ieXRlCTB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYKKy5ieXRlCTB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAKKy5ieXRlCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAKKy5ieXRlCTB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MKKy5ieXRlCTB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUKKy5ieXRlCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEKKy5ieXRlCTB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUKKy5ieXRlCTB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAKKy5ieXRlCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQKKy5ieXRlCTB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIKKy5ieXRlCTB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YKKy5ieXRlCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUKKy5ieXRlCTB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgKKy5ieXRlCTB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUKKy5ieXRlCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIKKy5ieXRlCTB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcKKy5ieXRlCTB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMKKy5ieXRlCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgKKy5ieXRlCTB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIKKy5ieXRlCTB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMKKy5ieXRlCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzkKKy5ieXRlCTB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkKKy5ieXRlCTB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgKKy5ieXRlCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYKKy5ieXRlCTB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEKKy5ieXRlCTB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUKKy5ieXRlCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUKKy5ieXRlCTB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQKKy5ieXRlCTB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYKKy5ieXRlCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgKKy5ieXRlCTB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYKK0AgcmNvbltdCisud29yZAkweDAxMDAwMDAwLCAweDAyMDAwMDAwLCAweDA0MDAwMDAwLCAweDA4MDAwMDAwCisud29yZAkweDEwMDAwMDAwLCAweDIwMDAwMDAwLCAweDQwMDAwMDAwLCAweDgwMDAwMDAwCisud29yZAkweDFCMDAwMDAwLCAweDM2MDAwMDAwLCAwLCAwLCAwLCAwLCAwLCAwCisuc2l6ZQlBRVNfVGUsLi1BRVNfVGUKKworQCB2b2lkIEFFU19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCitAIAkJIGNvbnN0IEFFU19LRVkgKmtleSkgeworLmdsb2JhbCBBRVNfZW5jcnlwdAorLnR5cGUgICBBRVNfZW5jcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgk1CitBRVNfZW5jcnlwdDoKKwlzdWIJcjMscGMsIzgJCUAgQUVTX2VuY3J5cHQKKwlzdG1kYiAgIHNwISx7cjEscjQtcjEyLGxyfQorCW1vdglyMTIscjAJCUAgaW5wCisJbW92CXIxMSxyMgorCXN1YglyMTAscjMsI0FFU19lbmNyeXB0LUFFU19UZQlAIFRlCisKKwlsZHJiCXIwLFtyMTIsIzNdCUAgbG9hZCBpbnB1dCBkYXRhIGluIGVuZGlhbi1uZXV0cmFsCisJbGRyYglyNCxbcjEyLCMyXQlAIG1hbm5lci4uLgorCWxkcmIJcjUsW3IxMiwjMV0KKwlsZHJiCXI2LFtyMTIsIzBdCisJb3JyCXIwLHIwLHI0LGxzbCM4CisJb3JyCXIwLHIwLHI1LGxzbCMxNgorCW9ycglyMCxyMCxyNixsc2wjMjQKKwlsZHJiCXIxLFtyMTIsIzddCisJbGRyYglyNCxbcjEyLCM2XQorCWxkcmIJcjUsW3IxMiwjNV0KKwlsZHJiCXI2LFtyMTIsIzRdCisJb3JyCXIxLHIxLHI0LGxzbCM4CisJb3JyCXIxLHIxLHI1LGxzbCMxNgorCW9ycglyMSxyMSxyNixsc2wjMjQKKwlsZHJiCXIyLFtyMTIsIzExXQorCWxkcmIJcjQsW3IxMiwjMTBdCisJbGRyYglyNSxbcjEyLCM5XQorCWxkcmIJcjYsW3IxMiwjOF0KKwlvcnIJcjIscjIscjQsbHNsIzgKKwlvcnIJcjIscjIscjUsbHNsIzE2CisJb3JyCXIyLHIyLHI2LGxzbCMyNAorCWxkcmIJcjMsW3IxMiwjMTVdCisJbGRyYglyNCxbcjEyLCMxNF0KKwlsZHJiCXI1LFtyMTIsIzEzXQorCWxkcmIJcjYsW3IxMiwjMTJdCisJb3JyCXIzLHIzLHI0LGxzbCM4CisJb3JyCXIzLHIzLHI1LGxzbCMxNgorCW9ycglyMyxyMyxyNixsc2wjMjQKKworCWJsCV9hcm12NF9BRVNfZW5jcnlwdAorCisJbGRyCXIxMixbc3BdLCM0CQlAIHBvcCBvdXQKKwltb3YJcjQscjAsbHNyIzI0CQlAIHdyaXRlIG91dHB1dCBpbiBlbmRpYW4tbmV1dHJhbAorCW1vdglyNSxyMCxsc3IjMTYJCUAgbWFubmVyLi4uCisJbW92CXI2LHIwLGxzciM4CisJc3RyYglyNCxbcjEyLCMwXQorCXN0cmIJcjUsW3IxMiwjMV0KKwlzdHJiCXI2LFtyMTIsIzJdCisJc3RyYglyMCxbcjEyLCMzXQorCW1vdglyNCxyMSxsc3IjMjQKKwltb3YJcjUscjEsbHNyIzE2CisJbW92CXI2LHIxLGxzciM4CisJc3RyYglyNCxbcjEyLCM0XQorCXN0cmIJcjUsW3IxMiwjNV0KKwlzdHJiCXI2LFtyMTIsIzZdCisJc3RyYglyMSxbcjEyLCM3XQorCW1vdglyNCxyMixsc3IjMjQKKwltb3YJcjUscjIsbHNyIzE2CisJbW92CXI2LHIyLGxzciM4CisJc3RyYglyNCxbcjEyLCM4XQorCXN0cmIJcjUsW3IxMiwjOV0KKwlzdHJiCXI2LFtyMTIsIzEwXQorCXN0cmIJcjIsW3IxMiwjMTFdCisJbW92CXI0LHIzLGxzciMyNAorCW1vdglyNSxyMyxsc3IjMTYKKwltb3YJcjYscjMsbHNyIzgKKwlzdHJiCXI0LFtyMTIsIzEyXQorCXN0cmIJcjUsW3IxMiwjMTNdCisJc3RyYglyNixbcjEyLCMxNF0KKwlzdHJiCXIzLFtyMTIsIzE1XQorCisJbGRtaWEgICBzcCEse3I0LXIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0CisJLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorLnNpemUJQUVTX2VuY3J5cHQsLi1BRVNfZW5jcnlwdAorCisudHlwZSAgIF9hcm12NF9BRVNfZW5jcnlwdCwlZnVuY3Rpb24KKy5hbGlnbgkyCitfYXJtdjRfQUVTX2VuY3J5cHQ6CisJc3RyCWxyLFtzcCwjLTRdIQkJQCBwdXNoIGxyCisJbGRyCXI0LFtyMTFdLCMxNgorCWxkcglyNSxbcjExLCMtMTJdCisJbGRyCXI2LFtyMTEsIy04XQorCWxkcglyNyxbcjExLCMtNF0KKwlsZHIJcjEyLFtyMTEsIzI0MC0xNl0KKwllb3IJcjAscjAscjQKKwllb3IJcjEscjEscjUKKwllb3IJcjIscjIscjYKKwllb3IJcjMscjMscjcKKwlzdWIJcjEyLHIxMiwjMQorCW1vdglsciwjMjU1CisKKy5MZW5jX2xvb3A6CisJYW5kCXI4LGxyLHIwLGxzciM4CisJYW5kCXI5LGxyLHIwLGxzciMxNgorCWFuZAlyNyxscixyMAorCW1vdglyMCxyMCxsc3IjMjQKKwlsZHIJcjQsW3IxMCxyNyxsc2wjMl0JQCBUZTNbczA+PjBdCisJbGRyCXIwLFtyMTAscjAsbHNsIzJdCUAgVGUwW3MwPj4yNF0KKwlsZHIJcjUsW3IxMCxyOCxsc2wjMl0JQCBUZTJbczA+PjhdCisJbGRyCXI2LFtyMTAscjksbHNsIzJdCUAgVGUxW3MwPj4xNl0KKworCWFuZAlyNyxscixyMSxsc3IjMTYJQCBpMAorCWFuZAlyOCxscixyMQorCWFuZAlyOSxscixyMSxsc3IjOAorCW1vdglyMSxyMSxsc3IjMjQKKwlsZHIJcjcsW3IxMCxyNyxsc2wjMl0JQCBUZTFbczE+PjE2XQorCWxkcglyMSxbcjEwLHIxLGxzbCMyXQlAIFRlMFtzMT4+MjRdCisJbGRyCXI4LFtyMTAscjgsbHNsIzJdCUAgVGUzW3MxPj4wXQorCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRlMltzMT4+OF0KKwllb3IJcjAscjAscjcscm9yIzgKKwllb3IJcjEscjEscjQscm9yIzI0CisJZW9yCXI1LHI1LHI4LHJvciM4CisJZW9yCXI2LHI2LHI5LHJvciM4CisKKwlhbmQJcjcsbHIscjIsbHNyIzgJQCBpMAorCWFuZAlyOCxscixyMixsc3IjMTYJQCBpMQorCWFuZAlyOSxscixyMgorCW1vdglyMixyMixsc3IjMjQKKwlsZHIJcjcsW3IxMCxyNyxsc2wjMl0JQCBUZTJbczI+PjhdCisJbGRyCXI4LFtyMTAscjgsbHNsIzJdCUAgVGUxW3MyPj4xNl0KKwlsZHIJcjIsW3IxMCxyMixsc2wjMl0JQCBUZTBbczI+PjI0XQorCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRlM1tzMj4+MF0KKwllb3IJcjAscjAscjcscm9yIzE2CisJZW9yCXIxLHIxLHI4LHJvciM4CisJZW9yCXIyLHIyLHI1LHJvciMxNgorCWVvcglyNixyNixyOSxyb3IjMTYKKworCWFuZAlyNyxscixyMwkJQCBpMAorCWFuZAlyOCxscixyMyxsc3IjOAlAIGkxCisJYW5kCXI5LGxyLHIzLGxzciMxNglAIGkyCisJbW92CXIzLHIzLGxzciMyNAorCWxkcglyNyxbcjEwLHI3LGxzbCMyXQlAIFRlM1tzMz4+MF0KKwlsZHIJcjgsW3IxMCxyOCxsc2wjMl0JQCBUZTJbczM+PjhdCisJbGRyCXI5LFtyMTAscjksbHNsIzJdCUAgVGUxW3MzPj4xNl0KKwlsZHIJcjMsW3IxMCxyMyxsc2wjMl0JQCBUZTBbczM+PjI0XQorCWVvcglyMCxyMCxyNyxyb3IjMjQKKwllb3IJcjEscjEscjgscm9yIzE2CisJZW9yCXIyLHIyLHI5LHJvciM4CisJZW9yCXIzLHIzLHI2LHJvciM4CisKKwlsZHIJcjQsW3IxMV0sIzE2CisJbGRyCXI1LFtyMTEsIy0xMl0KKwlsZHIJcjYsW3IxMSwjLThdCisJbGRyCXI3LFtyMTEsIy00XQorCWVvcglyMCxyMCxyNAorCWVvcglyMSxyMSxyNQorCWVvcglyMixyMixyNgorCWVvcglyMyxyMyxyNworCisJc3VicwlyMTIscjEyLCMxCisJYm5lCS5MZW5jX2xvb3AKKworCWFkZAlyMTAscjEwLCMyCisKKwlhbmQJcjcsbHIscjAKKwlhbmQJcjgsbHIscjAsbHNyIzgKKwlhbmQJcjksbHIscjAsbHNyIzE2CisJbW92CXIwLHIwLGxzciMyNAorCWxkcmIJcjQsW3IxMCxyNyxsc2wjMl0JQCBUZTRbczA+PjBdCisJbGRyYglyMCxbcjEwLHIwLGxzbCMyXQlAIFRlNFtzMD4+MjRdCisJbGRyYglyNSxbcjEwLHI4LGxzbCMyXQlAIFRlNFtzMD4+OF0KKwlsZHJiCXI2LFtyMTAscjksbHNsIzJdCUAgVGU0W3MwPj4xNl0KKworCWFuZAlyNyxscixyMSxsc3IjMTYJQCBpMAorCWFuZAlyOCxscixyMQorCWFuZAlyOSxscixyMSxsc3IjOAorCW1vdglyMSxyMSxsc3IjMjQKKwlsZHJiCXI3LFtyMTAscjcsbHNsIzJdCUAgVGU0W3MxPj4xNl0KKwlsZHJiCXIxLFtyMTAscjEsbHNsIzJdCUAgVGU0W3MxPj4yNF0KKwlsZHJiCXI4LFtyMTAscjgsbHNsIzJdCUAgVGU0W3MxPj4wXQorCWxkcmIJcjksW3IxMCxyOSxsc2wjMl0JQCBUZTRbczE+PjhdCisJZW9yCXIwLHI3LHIwLGxzbCM4CisJZW9yCXIxLHI0LHIxLGxzbCMyNAorCWVvcglyNSxyOCxyNSxsc2wjOAorCWVvcglyNixyOSxyNixsc2wjOAorCisJYW5kCXI3LGxyLHIyLGxzciM4CUAgaTAKKwlhbmQJcjgsbHIscjIsbHNyIzE2CUAgaTEKKwlhbmQJcjksbHIscjIKKwltb3YJcjIscjIsbHNyIzI0CisJbGRyYglyNyxbcjEwLHI3LGxzbCMyXQlAIFRlNFtzMj4+OF0KKwlsZHJiCXI4LFtyMTAscjgsbHNsIzJdCUAgVGU0W3MyPj4xNl0KKwlsZHJiCXIyLFtyMTAscjIsbHNsIzJdCUAgVGU0W3MyPj4yNF0KKwlsZHJiCXI5LFtyMTAscjksbHNsIzJdCUAgVGU0W3MyPj4wXQorCWVvcglyMCxyNyxyMCxsc2wjOAorCWVvcglyMSxyMSxyOCxsc2wjMTYKKwllb3IJcjIscjUscjIsbHNsIzI0CisJZW9yCXI2LHI5LHI2LGxzbCM4CisKKwlhbmQJcjcsbHIscjMJCUAgaTAKKwlhbmQJcjgsbHIscjMsbHNyIzgJQCBpMQorCWFuZAlyOSxscixyMyxsc3IjMTYJQCBpMgorCW1vdglyMyxyMyxsc3IjMjQKKwlsZHJiCXI3LFtyMTAscjcsbHNsIzJdCUAgVGU0W3MzPj4wXQorCWxkcmIJcjgsW3IxMCxyOCxsc2wjMl0JQCBUZTRbczM+PjhdCisJbGRyYglyOSxbcjEwLHI5LGxzbCMyXQlAIFRlNFtzMz4+MTZdCisJbGRyYglyMyxbcjEwLHIzLGxzbCMyXQlAIFRlNFtzMz4+MjRdCisJZW9yCXIwLHI3LHIwLGxzbCM4CisJZW9yCXIxLHIxLHI4LGxzbCM4CisJZW9yCXIyLHIyLHI5LGxzbCMxNgorCWVvcglyMyxyNixyMyxsc2wjMjQKKworCWxkcglscixbc3BdLCM0CQlAIHBvcCBscgorCWxkcglyNCxbcjExLCMwXQorCWxkcglyNSxbcjExLCM0XQorCWxkcglyNixbcjExLCM4XQorCWxkcglyNyxbcjExLCMxMl0KKwllb3IJcjAscjAscjQKKwllb3IJcjEscjEscjUKKwllb3IJcjIscjIscjYKKwllb3IJcjMscjMscjcKKworCXN1YglyMTAscjEwLCMyCisJbW92CXBjLGxyCQkJQCByZXR1cm4KKy5zaXplCV9hcm12NF9BRVNfZW5jcnlwdCwuLV9hcm12NF9BRVNfZW5jcnlwdAorCisuZ2xvYmFsIEFFU19zZXRfZW5jcnlwdF9rZXkKKy50eXBlICAgQUVTX3NldF9lbmNyeXB0X2tleSwlZnVuY3Rpb24KKy5hbGlnbgk1CitBRVNfc2V0X2VuY3J5cHRfa2V5OgorCXN1YglyMyxwYywjOAkJQCBBRVNfc2V0X2VuY3J5cHRfa2V5CisJdGVxCXIwLCMwCisJbW92ZXEJcjAsIy0xCisJYmVxCS5MYWJydAorCXRlcQlyMiwjMAorCW1vdmVxCXIwLCMtMQorCWJlcQkuTGFicnQKKworCXRlcQlyMSwjMTI4CisJYmVxCS5Mb2sKKwl0ZXEJcjEsIzE5MgorCWJlcQkuTG9rCisJdGVxCXIxLCMyNTYKKwltb3ZuZQlyMCwjLTEKKwlibmUJLkxhYnJ0CisKKy5Mb2s6CXN0bWRiICAgc3AhLHtyNC1yMTIsbHJ9CisJc3ViCXIxMCxyMywjQUVTX3NldF9lbmNyeXB0X2tleS1BRVNfVGUtMTAyNAlAIFRlNAorCisJbW92CXIxMixyMAkJQCBpbnAKKwltb3YJbHIscjEJCQlAIGJpdHMKKwltb3YJcjExLHIyCQkJQCBrZXkKKworCWxkcmIJcjAsW3IxMiwjM10JQCBsb2FkIGlucHV0IGRhdGEgaW4gZW5kaWFuLW5ldXRyYWwKKwlsZHJiCXI0LFtyMTIsIzJdCUAgbWFubmVyLi4uCisJbGRyYglyNSxbcjEyLCMxXQorCWxkcmIJcjYsW3IxMiwjMF0KKwlvcnIJcjAscjAscjQsbHNsIzgKKwlvcnIJcjAscjAscjUsbHNsIzE2CisJb3JyCXIwLHIwLHI2LGxzbCMyNAorCWxkcmIJcjEsW3IxMiwjN10KKwlsZHJiCXI0LFtyMTIsIzZdCisJbGRyYglyNSxbcjEyLCM1XQorCWxkcmIJcjYsW3IxMiwjNF0KKwlvcnIJcjEscjEscjQsbHNsIzgKKwlvcnIJcjEscjEscjUsbHNsIzE2CisJb3JyCXIxLHIxLHI2LGxzbCMyNAorCWxkcmIJcjIsW3IxMiwjMTFdCisJbGRyYglyNCxbcjEyLCMxMF0KKwlsZHJiCXI1LFtyMTIsIzldCisJbGRyYglyNixbcjEyLCM4XQorCW9ycglyMixyMixyNCxsc2wjOAorCW9ycglyMixyMixyNSxsc2wjMTYKKwlvcnIJcjIscjIscjYsbHNsIzI0CisJbGRyYglyMyxbcjEyLCMxNV0KKwlsZHJiCXI0LFtyMTIsIzE0XQorCWxkcmIJcjUsW3IxMiwjMTNdCisJbGRyYglyNixbcjEyLCMxMl0KKwlvcnIJcjMscjMscjQsbHNsIzgKKwlvcnIJcjMscjMscjUsbHNsIzE2CisJb3JyCXIzLHIzLHI2LGxzbCMyNAorCXN0cglyMCxbcjExXSwjMTYKKwlzdHIJcjEsW3IxMSwjLTEyXQorCXN0cglyMixbcjExLCMtOF0KKwlzdHIJcjMsW3IxMSwjLTRdCisKKwl0ZXEJbHIsIzEyOAorCWJuZQkuTG5vdDEyOAorCW1vdglyMTIsIzEwCisJc3RyCXIxMixbcjExLCMyNDAtMTZdCisJYWRkCXI2LHIxMCwjMjU2CQkJQCByY29uCisJbW92CWxyLCMyNTUKKworLkwxMjhfbG9vcDoKKwlhbmQJcjUsbHIscjMsbHNyIzI0CisJYW5kCXI3LGxyLHIzLGxzciMxNgorCWFuZAlyOCxscixyMyxsc3IjOAorCWFuZAlyOSxscixyMworCWxkcmIJcjUsW3IxMCxyNV0KKwlsZHJiCXI3LFtyMTAscjddCisJbGRyYglyOCxbcjEwLHI4XQorCWxkcmIJcjksW3IxMCxyOV0KKwlsZHIJcjQsW3I2XSwjNAkJCUAgcmNvbltpKytdCisJb3JyCXI1LHI1LHI3LGxzbCMyNAorCW9ycglyNSxyNSxyOCxsc2wjMTYKKwlvcnIJcjUscjUscjksbHNsIzgKKwllb3IJcjUscjUscjQKKwllb3IJcjAscjAscjUJCQlAIHJrWzRdPXJrWzBdXi4uLgorCWVvcglyMSxyMSxyMAkJCUAgcmtbNV09cmtbMV1ecmtbNF0KKwllb3IJcjIscjIscjEJCQlAIHJrWzZdPXJrWzJdXnJrWzVdCisJZW9yCXIzLHIzLHIyCQkJQCBya1s3XT1ya1szXV5ya1s2XQorCXN0cglyMCxbcjExXSwjMTYKKwlzdHIJcjEsW3IxMSwjLTEyXQorCXN0cglyMixbcjExLCMtOF0KKwlzdHIJcjMsW3IxMSwjLTRdCisKKwlzdWJzCXIxMixyMTIsIzEKKwlibmUJLkwxMjhfbG9vcAorCXN1YglyMixyMTEsIzE3NgorCWIJLkxkb25lCisKKy5Mbm90MTI4OgorCWxkcmIJcjgsW3IxMiwjMTldCisJbGRyYglyNCxbcjEyLCMxOF0KKwlsZHJiCXI1LFtyMTIsIzE3XQorCWxkcmIJcjYsW3IxMiwjMTZdCisJb3JyCXI4LHI4LHI0LGxzbCM4CisJb3JyCXI4LHI4LHI1LGxzbCMxNgorCW9ycglyOCxyOCxyNixsc2wjMjQKKwlsZHJiCXI5LFtyMTIsIzIzXQorCWxkcmIJcjQsW3IxMiwjMjJdCisJbGRyYglyNSxbcjEyLCMyMV0KKwlsZHJiCXI2LFtyMTIsIzIwXQorCW9ycglyOSxyOSxyNCxsc2wjOAorCW9ycglyOSxyOSxyNSxsc2wjMTYKKwlvcnIJcjkscjkscjYsbHNsIzI0CisJc3RyCXI4LFtyMTFdLCM4CisJc3RyCXI5LFtyMTEsIy00XQorCisJdGVxCWxyLCMxOTIKKwlibmUJLkxub3QxOTIKKwltb3YJcjEyLCMxMgorCXN0cglyMTIsW3IxMSwjMjQwLTI0XQorCWFkZAlyNixyMTAsIzI1NgkJCUAgcmNvbgorCW1vdglsciwjMjU1CisJbW92CXIxMiwjOAorCisuTDE5Ml9sb29wOgorCWFuZAlyNSxscixyOSxsc3IjMjQKKwlhbmQJcjcsbHIscjksbHNyIzE2CisJYW5kCXI4LGxyLHI5LGxzciM4CisJYW5kCXI5LGxyLHI5CisJbGRyYglyNSxbcjEwLHI1XQorCWxkcmIJcjcsW3IxMCxyN10KKwlsZHJiCXI4LFtyMTAscjhdCisJbGRyYglyOSxbcjEwLHI5XQorCWxkcglyNCxbcjZdLCM0CQkJQCByY29uW2krK10KKwlvcnIJcjUscjUscjcsbHNsIzI0CisJb3JyCXI1LHI1LHI4LGxzbCMxNgorCW9ycglyNSxyNSxyOSxsc2wjOAorCWVvcglyOSxyNSxyNAorCWVvcglyMCxyMCxyOQkJCUAgcmtbNl09cmtbMF1eLi4uCisJZW9yCXIxLHIxLHIwCQkJQCBya1s3XT1ya1sxXV5ya1s2XQorCWVvcglyMixyMixyMQkJCUAgcmtbOF09cmtbMl1ecmtbN10KKwllb3IJcjMscjMscjIJCQlAIHJrWzldPXJrWzNdXnJrWzhdCisJc3RyCXIwLFtyMTFdLCMyNAorCXN0cglyMSxbcjExLCMtMjBdCisJc3RyCXIyLFtyMTEsIy0xNl0KKwlzdHIJcjMsW3IxMSwjLTEyXQorCisJc3VicwlyMTIscjEyLCMxCisJc3ViZXEJcjIscjExLCMyMTYKKwliZXEJLkxkb25lCisKKwlsZHIJcjcsW3IxMSwjLTMyXQorCWxkcglyOCxbcjExLCMtMjhdCisJZW9yCXI3LHI3LHIzCQkJQCBya1sxMF09cmtbNF1ecmtbOV0KKwllb3IJcjkscjgscjcJCQlAIHJrWzExXT1ya1s1XV5ya1sxMF0KKwlzdHIJcjcsW3IxMSwjLThdCisJc3RyCXI5LFtyMTEsIy00XQorCWIJLkwxOTJfbG9vcAorCisuTG5vdDE5MjoKKwlsZHJiCXI4LFtyMTIsIzI3XQorCWxkcmIJcjQsW3IxMiwjMjZdCisJbGRyYglyNSxbcjEyLCMyNV0KKwlsZHJiCXI2LFtyMTIsIzI0XQorCW9ycglyOCxyOCxyNCxsc2wjOAorCW9ycglyOCxyOCxyNSxsc2wjMTYKKwlvcnIJcjgscjgscjYsbHNsIzI0CisJbGRyYglyOSxbcjEyLCMzMV0KKwlsZHJiCXI0LFtyMTIsIzMwXQorCWxkcmIJcjUsW3IxMiwjMjldCisJbGRyYglyNixbcjEyLCMyOF0KKwlvcnIJcjkscjkscjQsbHNsIzgKKwlvcnIJcjkscjkscjUsbHNsIzE2CisJb3JyCXI5LHI5LHI2LGxzbCMyNAorCXN0cglyOCxbcjExXSwjOAorCXN0cglyOSxbcjExLCMtNF0KKworCW1vdglyMTIsIzE0CisJc3RyCXIxMixbcjExLCMyNDAtMzJdCisJYWRkCXI2LHIxMCwjMjU2CQkJQCByY29uCisJbW92CWxyLCMyNTUKKwltb3YJcjEyLCM3CisKKy5MMjU2X2xvb3A6CisJYW5kCXI1LGxyLHI5LGxzciMyNAorCWFuZAlyNyxscixyOSxsc3IjMTYKKwlhbmQJcjgsbHIscjksbHNyIzgKKwlhbmQJcjksbHIscjkKKwlsZHJiCXI1LFtyMTAscjVdCisJbGRyYglyNyxbcjEwLHI3XQorCWxkcmIJcjgsW3IxMCxyOF0KKwlsZHJiCXI5LFtyMTAscjldCisJbGRyCXI0LFtyNl0sIzQJCQlAIHJjb25baSsrXQorCW9ycglyNSxyNSxyNyxsc2wjMjQKKwlvcnIJcjUscjUscjgsbHNsIzE2CisJb3JyCXI1LHI1LHI5LGxzbCM4CisJZW9yCXI5LHI1LHI0CisJZW9yCXIwLHIwLHI5CQkJQCBya1s4XT1ya1swXV4uLi4KKwllb3IJcjEscjEscjAJCQlAIHJrWzldPXJrWzFdXnJrWzhdCisJZW9yCXIyLHIyLHIxCQkJQCBya1sxMF09cmtbMl1ecmtbOV0KKwllb3IJcjMscjMscjIJCQlAIHJrWzExXT1ya1szXV5ya1sxMF0KKwlzdHIJcjAsW3IxMV0sIzMyCisJc3RyCXIxLFtyMTEsIy0yOF0KKwlzdHIJcjIsW3IxMSwjLTI0XQorCXN0cglyMyxbcjExLCMtMjBdCisKKwlzdWJzCXIxMixyMTIsIzEKKwlzdWJlcQlyMixyMTEsIzI1NgorCWJlcQkuTGRvbmUKKworCWFuZAlyNSxscixyMworCWFuZAlyNyxscixyMyxsc3IjOAorCWFuZAlyOCxscixyMyxsc3IjMTYKKwlhbmQJcjksbHIscjMsbHNyIzI0CisJbGRyYglyNSxbcjEwLHI1XQorCWxkcmIJcjcsW3IxMCxyN10KKwlsZHJiCXI4LFtyMTAscjhdCisJbGRyYglyOSxbcjEwLHI5XQorCW9ycglyNSxyNSxyNyxsc2wjOAorCW9ycglyNSxyNSxyOCxsc2wjMTYKKwlvcnIJcjUscjUscjksbHNsIzI0CisKKwlsZHIJcjQsW3IxMSwjLTQ4XQorCWxkcglyNyxbcjExLCMtNDRdCisJbGRyCXI4LFtyMTEsIy00MF0KKwlsZHIJcjksW3IxMSwjLTM2XQorCWVvcglyNCxyNCxyNQkJCUAgcmtbMTJdPXJrWzRdXi4uLgorCWVvcglyNyxyNyxyNAkJCUAgcmtbMTNdPXJrWzVdXnJrWzEyXQorCWVvcglyOCxyOCxyNwkJCUAgcmtbMTRdPXJrWzZdXnJrWzEzXQorCWVvcglyOSxyOSxyOAkJCUAgcmtbMTVdPXJrWzddXnJrWzE0XQorCXN0cglyNCxbcjExLCMtMTZdCisJc3RyCXI3LFtyMTEsIy0xMl0KKwlzdHIJcjgsW3IxMSwjLThdCisJc3RyCXI5LFtyMTEsIy00XQorCWIJLkwyNTZfbG9vcAorCisuTGRvbmU6CW1vdglyMCwjMAorCWxkbWlhICAgc3AhLHtyNC1yMTIsbHJ9CisuTGFicnQ6CXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwkud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisuc2l6ZQlBRVNfc2V0X2VuY3J5cHRfa2V5LC4tQUVTX3NldF9lbmNyeXB0X2tleQorCisuZ2xvYmFsIEFFU19zZXRfZGVjcnlwdF9rZXkKKy50eXBlICAgQUVTX3NldF9kZWNyeXB0X2tleSwlZnVuY3Rpb24KKy5hbGlnbgk1CitBRVNfc2V0X2RlY3J5cHRfa2V5OgorCXN0cglscixbc3AsIy00XSEgICAgICAgICAgICBAIHB1c2ggbHIKKwlibAlBRVNfc2V0X2VuY3J5cHRfa2V5CisJdGVxCXIwLCMwCisJbGRybmUJbHIsW3NwXSwjNCAgICAgICAgICAgICAgQCBwb3AgbHIKKwlibmUJLkxhYnJ0CisKKwlzdG1kYiAgIHNwISx7cjQtcjEyfQorCisJbGRyCXIxMixbcjIsIzI0MF0JQCBBRVNfc2V0X2VuY3J5cHRfa2V5IHByZXNlcnZlcyByMiwKKwltb3YJcjExLHIyCQkJQCB3aGljaCBpcyBBRVNfS0VZICprZXkKKwltb3YJcjcscjIKKwlhZGQJcjgscjIscjEyLGxzbCM0CisKKy5MaW52OglsZHIJcjAsW3I3XQorCWxkcglyMSxbcjcsIzRdCisJbGRyCXIyLFtyNywjOF0KKwlsZHIJcjMsW3I3LCMxMl0KKwlsZHIJcjQsW3I4XQorCWxkcglyNSxbcjgsIzRdCisJbGRyCXI2LFtyOCwjOF0KKwlsZHIJcjksW3I4LCMxMl0KKwlzdHIJcjAsW3I4XSwjLTE2CisJc3RyCXIxLFtyOCwjMTYrNF0KKwlzdHIJcjIsW3I4LCMxNis4XQorCXN0cglyMyxbcjgsIzE2KzEyXQorCXN0cglyNCxbcjddLCMxNgorCXN0cglyNSxbcjcsIy0xMl0KKwlzdHIJcjYsW3I3LCMtOF0KKwlzdHIJcjksW3I3LCMtNF0KKwl0ZXEJcjcscjgKKwlibmUJLkxpbnYKKwlsZHIJcjAsW3IxMSwjMTZdIQkJQCBwcmVmZXRjaCB0cDEKKwltb3YJcjcsIzB4ODAKKwltb3YJcjgsIzB4MWIKKwlvcnIJcjcscjcsIzB4ODAwMAorCW9ycglyOCxyOCwjMHgxYjAwCisJb3JyCXI3LHI3LHI3LGxzbCMxNgorCW9ycglyOCxyOCxyOCxsc2wjMTYKKwlzdWIJcjEyLHIxMiwjMQorCW12bglyOSxyNworCW1vdglyMTIscjEyLGxzbCMyCUAgKHJvdW5kcy0xKSo0CisKKy5MbWl4OglhbmQJcjQscjAscjcKKwlhbmQJcjEscjAscjkKKwlzdWIJcjQscjQscjQsbHNyIzcKKwlhbmQJcjQscjQscjgKKwllb3IJcjEscjQscjEsbHNsIzEJQCB0cDIKKworCWFuZAlyNCxyMSxyNworCWFuZAlyMixyMSxyOQorCXN1YglyNCxyNCxyNCxsc3IjNworCWFuZAlyNCxyNCxyOAorCWVvcglyMixyNCxyMixsc2wjMQlAIHRwNAorCisJYW5kCXI0LHIyLHI3CisJYW5kCXIzLHIyLHI5CisJc3ViCXI0LHI0LHI0LGxzciM3CisJYW5kCXI0LHI0LHI4CisJZW9yCXIzLHI0LHIzLGxzbCMxCUAgdHA4CisKKwllb3IJcjQscjEscjIKKwllb3IJcjUscjAscjMJCUAgdHA5CisJZW9yCXI0LHI0LHIzCQlAIHRwZQorCWVvcglyNCxyNCxyMSxyb3IjMjQKKwllb3IJcjQscjQscjUscm9yIzI0CUAgXj0gUk9UQVRFKHRwYj10cDledHAyLDgpCisJZW9yCXI0LHI0LHIyLHJvciMxNgorCWVvcglyNCxyNCxyNSxyb3IjMTYJQCBePSBST1RBVEUodHBkPXRwOV50cDQsMTYpCisJZW9yCXI0LHI0LHI1LHJvciM4CUAgXj0gUk9UQVRFKHRwOSwyNCkKKworCWxkcglyMCxbcjExLCM0XQkJQCBwcmVmZXRjaCB0cDEKKwlzdHIJcjQsW3IxMV0sIzQKKwlzdWJzCXIxMixyMTIsIzEKKwlibmUJLkxtaXgKKworCW1vdglyMCwjMAorCWxkbWlhICAgc3AhLHtyNC1yMTIsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCS53b3JkCTB4ZTEyZmZmMWUJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKy5zaXplCUFFU19zZXRfZGVjcnlwdF9rZXksLi1BRVNfc2V0X2RlY3J5cHRfa2V5CisKKy50eXBlCUFFU19UZCwlb2JqZWN0CisuYWxpZ24JNQorQUVTX1RkOgorLndvcmQJMHg1MWY0YTc1MCwgMHg3ZTQxNjU1MywgMHgxYTE3YTRjMywgMHgzYTI3NWU5NgorLndvcmQJMHgzYmFiNmJjYiwgMHgxZjlkNDVmMSwgMHhhY2ZhNThhYiwgMHg0YmUzMDM5MworLndvcmQJMHgyMDMwZmE1NSwgMHhhZDc2NmRmNiwgMHg4OGNjNzY5MSwgMHhmNTAyNGMyNQorLndvcmQJMHg0ZmU1ZDdmYywgMHhjNTJhY2JkNywgMHgyNjM1NDQ4MCwgMHhiNTYyYTM4ZgorLndvcmQJMHhkZWIxNWE0OSwgMHgyNWJhMWI2NywgMHg0NWVhMGU5OCwgMHg1ZGZlYzBlMQorLndvcmQJMHhjMzJmNzUwMiwgMHg4MTRjZjAxMiwgMHg4ZDQ2OTdhMywgMHg2YmQzZjljNgorLndvcmQJMHgwMzhmNWZlNywgMHgxNTkyOWM5NSwgMHhiZjZkN2FlYiwgMHg5NTUyNTlkYQorLndvcmQJMHhkNGJlODMyZCwgMHg1ODc0MjFkMywgMHg0OWUwNjkyOSwgMHg4ZWM5Yzg0NAorLndvcmQJMHg3NWMyODk2YSwgMHhmNDhlNzk3OCwgMHg5OTU4M2U2YiwgMHgyN2I5NzFkZAorLndvcmQJMHhiZWUxNGZiNiwgMHhmMDg4YWQxNywgMHhjOTIwYWM2NiwgMHg3ZGNlM2FiNAorLndvcmQJMHg2M2RmNGExOCwgMHhlNTFhMzE4MiwgMHg5NzUxMzM2MCwgMHg2MjUzN2Y0NQorLndvcmQJMHhiMTY0NzdlMCwgMHhiYjZiYWU4NCwgMHhmZTgxYTAxYywgMHhmOTA4MmI5NAorLndvcmQJMHg3MDQ4Njg1OCwgMHg4ZjQ1ZmQxOSwgMHg5NGRlNmM4NywgMHg1MjdiZjhiNworLndvcmQJMHhhYjczZDMyMywgMHg3MjRiMDJlMiwgMHhlMzFmOGY1NywgMHg2NjU1YWIyYQorLndvcmQJMHhiMmViMjgwNywgMHgyZmI1YzIwMywgMHg4NmM1N2I5YSwgMHhkMzM3MDhhNQorLndvcmQJMHgzMDI4ODdmMiwgMHgyM2JmYTViMiwgMHgwMjAzNmFiYSwgMHhlZDE2ODI1YworLndvcmQJMHg4YWNmMWMyYiwgMHhhNzc5YjQ5MiwgMHhmMzA3ZjJmMCwgMHg0ZTY5ZTJhMQorLndvcmQJMHg2NWRhZjRjZCwgMHgwNjA1YmVkNSwgMHhkMTM0NjIxZiwgMHhjNGE2ZmU4YQorLndvcmQJMHgzNDJlNTM5ZCwgMHhhMmYzNTVhMCwgMHgwNThhZTEzMiwgMHhhNGY2ZWI3NQorLndvcmQJMHgwYjgzZWMzOSwgMHg0MDYwZWZhYSwgMHg1ZTcxOWYwNiwgMHhiZDZlMTA1MQorLndvcmQJMHgzZTIxOGFmOSwgMHg5NmRkMDYzZCwgMHhkZDNlMDVhZSwgMHg0ZGU2YmQ0NgorLndvcmQJMHg5MTU0OGRiNSwgMHg3MWM0NWQwNSwgMHgwNDA2ZDQ2ZiwgMHg2MDUwMTVmZgorLndvcmQJMHgxOTk4ZmIyNCwgMHhkNmJkZTk5NywgMHg4OTQwNDNjYywgMHg2N2Q5OWU3NworLndvcmQJMHhiMGU4NDJiZCwgMHgwNzg5OGI4OCwgMHhlNzE5NWIzOCwgMHg3OWM4ZWVkYgorLndvcmQJMHhhMTdjMGE0NywgMHg3YzQyMGZlOSwgMHhmODg0MWVjOSwgMHgwMDAwMDAwMAorLndvcmQJMHgwOTgwODY4MywgMHgzMjJiZWQ0OCwgMHgxZTExNzBhYywgMHg2YzVhNzI0ZQorLndvcmQJMHhmZDBlZmZmYiwgMHgwZjg1Mzg1NiwgMHgzZGFlZDUxZSwgMHgzNjJkMzkyNworLndvcmQJMHgwYTBmZDk2NCwgMHg2ODVjYTYyMSwgMHg5YjViNTRkMSwgMHgyNDM2MmUzYQorLndvcmQJMHgwYzBhNjdiMSwgMHg5MzU3ZTcwZiwgMHhiNGVlOTZkMiwgMHgxYjliOTE5ZQorLndvcmQJMHg4MGMwYzU0ZiwgMHg2MWRjMjBhMiwgMHg1YTc3NGI2OSwgMHgxYzEyMWExNgorLndvcmQJMHhlMjkzYmEwYSwgMHhjMGEwMmFlNSwgMHgzYzIyZTA0MywgMHgxMjFiMTcxZAorLndvcmQJMHgwZTA5MGQwYiwgMHhmMjhiYzdhZCwgMHgyZGI2YThiOSwgMHgxNDFlYTljOAorLndvcmQJMHg1N2YxMTk4NSwgMHhhZjc1MDc0YywgMHhlZTk5ZGRiYiwgMHhhMzdmNjBmZAorLndvcmQJMHhmNzAxMjY5ZiwgMHg1YzcyZjViYywgMHg0NDY2M2JjNSwgMHg1YmZiN2UzNAorLndvcmQJMHg4YjQzMjk3NiwgMHhjYjIzYzZkYywgMHhiNmVkZmM2OCwgMHhiOGU0ZjE2MworLndvcmQJMHhkNzMxZGNjYSwgMHg0MjYzODUxMCwgMHgxMzk3MjI0MCwgMHg4NGM2MTEyMAorLndvcmQJMHg4NTRhMjQ3ZCwgMHhkMmJiM2RmOCwgMHhhZWY5MzIxMSwgMHhjNzI5YTE2ZAorLndvcmQJMHgxZDllMmY0YiwgMHhkY2IyMzBmMywgMHgwZDg2NTJlYywgMHg3N2MxZTNkMAorLndvcmQJMHgyYmIzMTY2YywgMHhhOTcwYjk5OSwgMHgxMTk0NDhmYSwgMHg0N2U5NjQyMgorLndvcmQJMHhhOGZjOGNjNCwgMHhhMGYwM2YxYSwgMHg1NjdkMmNkOCwgMHgyMjMzOTBlZgorLndvcmQJMHg4NzQ5NGVjNywgMHhkOTM4ZDFjMSwgMHg4Y2NhYTJmZSwgMHg5OGQ0MGIzNgorLndvcmQJMHhhNmY1ODFjZiwgMHhhNTdhZGUyOCwgMHhkYWI3OGUyNiwgMHgzZmFkYmZhNAorLndvcmQJMHgyYzNhOWRlNCwgMHg1MDc4OTIwZCwgMHg2YTVmY2M5YiwgMHg1NDdlNDY2MgorLndvcmQJMHhmNjhkMTNjMiwgMHg5MGQ4YjhlOCwgMHgyZTM5Zjc1ZSwgMHg4MmMzYWZmNQorLndvcmQJMHg5ZjVkODBiZSwgMHg2OWQwOTM3YywgMHg2ZmQ1MmRhOSwgMHhjZjI1MTJiMworLndvcmQJMHhjOGFjOTkzYiwgMHgxMDE4N2RhNywgMHhlODljNjM2ZSwgMHhkYjNiYmI3YgorLndvcmQJMHhjZDI2NzgwOSwgMHg2ZTU5MThmNCwgMHhlYzlhYjcwMSwgMHg4MzRmOWFhOAorLndvcmQJMHhlNjk1NmU2NSwgMHhhYWZmZTY3ZSwgMHgyMWJjY2YwOCwgMHhlZjE1ZThlNgorLndvcmQJMHhiYWU3OWJkOSwgMHg0YTZmMzZjZSwgMHhlYTlmMDlkNCwgMHgyOWIwN2NkNgorLndvcmQJMHgzMWE0YjJhZiwgMHgyYTNmMjMzMSwgMHhjNmE1OTQzMCwgMHgzNWEyNjZjMAorLndvcmQJMHg3NDRlYmMzNywgMHhmYzgyY2FhNiwgMHhlMDkwZDBiMCwgMHgzM2E3ZDgxNQorLndvcmQJMHhmMTA0OTg0YSwgMHg0MWVjZGFmNywgMHg3ZmNkNTAwZSwgMHgxNzkxZjYyZgorLndvcmQJMHg3NjRkZDY4ZCwgMHg0M2VmYjA0ZCwgMHhjY2FhNGQ1NCwgMHhlNDk2MDRkZgorLndvcmQJMHg5ZWQxYjVlMywgMHg0YzZhODgxYiwgMHhjMTJjMWZiOCwgMHg0NjY1NTE3ZgorLndvcmQJMHg5ZDVlZWEwNCwgMHgwMThjMzU1ZCwgMHhmYTg3NzQ3MywgMHhmYjBiNDEyZQorLndvcmQJMHhiMzY3MWQ1YSwgMHg5MmRiZDI1MiwgMHhlOTEwNTYzMywgMHg2ZGQ2NDcxMworLndvcmQJMHg5YWQ3NjE4YywgMHgzN2ExMGM3YSwgMHg1OWY4MTQ4ZSwgMHhlYjEzM2M4OQorLndvcmQJMHhjZWE5MjdlZSwgMHhiNzYxYzkzNSwgMHhlMTFjZTVlZCwgMHg3YTQ3YjEzYworLndvcmQJMHg5Y2QyZGY1OSwgMHg1NWYyNzMzZiwgMHgxODE0Y2U3OSwgMHg3M2M3MzdiZgorLndvcmQJMHg1M2Y3Y2RlYSwgMHg1ZmZkYWE1YiwgMHhkZjNkNmYxNCwgMHg3ODQ0ZGI4NgorLndvcmQJMHhjYWFmZjM4MSwgMHhiOTY4YzQzZSwgMHgzODI0MzQyYywgMHhjMmEzNDA1ZgorLndvcmQJMHgxNjFkYzM3MiwgMHhiY2UyMjUwYywgMHgyODNjNDk4YiwgMHhmZjBkOTU0MQorLndvcmQJMHgzOWE4MDE3MSwgMHgwODBjYjNkZSwgMHhkOGI0ZTQ5YywgMHg2NDU2YzE5MAorLndvcmQJMHg3YmNiODQ2MSwgMHhkNTMyYjY3MCwgMHg0ODZjNWM3NCwgMHhkMGI4NTc0MgorQCBUZDRbMjU2XQorLmJ5dGUJMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOAorLmJ5dGUJMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSwgMHg4MSwgMHhmMywgMHhkNywgMHhmYgorLmJ5dGUJMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4NworLmJ5dGUJMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYgorLmJ5dGUJMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZAorLmJ5dGUJMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZQorLmJ5dGUJMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMgorLmJ5dGUJMHg3NiwgMHg1YiwgMHhhMiwgMHg0OSwgMHg2ZCwgMHg4YiwgMHhkMSwgMHgyNQorLmJ5dGUJMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNgorLmJ5dGUJMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5MgorLmJ5dGUJMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYQorLmJ5dGUJMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NAorLmJ5dGUJMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYQorLmJ5dGUJMHhmNywgMHhlNCwgMHg1OCwgMHgwNSwgMHhiOCwgMHhiMywgMHg0NSwgMHgwNgorLmJ5dGUJMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMgorLmJ5dGUJMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2YgorLmJ5dGUJMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYQorLmJ5dGUJMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3MworLmJ5dGUJMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NQorLmJ5dGUJMHhlMiwgMHhmOSwgMHgzNywgMHhlOCwgMHgxYywgMHg3NSwgMHhkZiwgMHg2ZQorLmJ5dGUJMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OQorLmJ5dGUJMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYgorLmJ5dGUJMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMAorLmJ5dGUJMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNAorLmJ5dGUJMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMQorLmJ5dGUJMHhiMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhlYywgMHg1ZgorLmJ5dGUJMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZAorLmJ5dGUJMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZgorLmJ5dGUJMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMAorLmJ5dGUJMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MQorLmJ5dGUJMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNgorLmJ5dGUJMHhlMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZAorLnNpemUJQUVTX1RkLC4tQUVTX1RkCisKK0Agdm9pZCBBRVNfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorQCAJCSBjb25zdCBBRVNfS0VZICprZXkpIHsKKy5nbG9iYWwgQUVTX2RlY3J5cHQKKy50eXBlICAgQUVTX2RlY3J5cHQsJWZ1bmN0aW9uCisuYWxpZ24JNQorQUVTX2RlY3J5cHQ6CisJc3ViCXIzLHBjLCM4CQlAIEFFU19kZWNyeXB0CisJc3RtZGIgICBzcCEse3IxLHI0LXIxMixscn0KKwltb3YJcjEyLHIwCQlAIGlucAorCW1vdglyMTEscjIKKwlzdWIJcjEwLHIzLCNBRVNfZGVjcnlwdC1BRVNfVGQJCUAgVGQKKworCWxkcmIJcjAsW3IxMiwjM10JQCBsb2FkIGlucHV0IGRhdGEgaW4gZW5kaWFuLW5ldXRyYWwKKwlsZHJiCXI0LFtyMTIsIzJdCUAgbWFubmVyLi4uCisJbGRyYglyNSxbcjEyLCMxXQorCWxkcmIJcjYsW3IxMiwjMF0KKwlvcnIJcjAscjAscjQsbHNsIzgKKwlvcnIJcjAscjAscjUsbHNsIzE2CisJb3JyCXIwLHIwLHI2LGxzbCMyNAorCWxkcmIJcjEsW3IxMiwjN10KKwlsZHJiCXI0LFtyMTIsIzZdCisJbGRyYglyNSxbcjEyLCM1XQorCWxkcmIJcjYsW3IxMiwjNF0KKwlvcnIJcjEscjEscjQsbHNsIzgKKwlvcnIJcjEscjEscjUsbHNsIzE2CisJb3JyCXIxLHIxLHI2LGxzbCMyNAorCWxkcmIJcjIsW3IxMiwjMTFdCisJbGRyYglyNCxbcjEyLCMxMF0KKwlsZHJiCXI1LFtyMTIsIzldCisJbGRyYglyNixbcjEyLCM4XQorCW9ycglyMixyMixyNCxsc2wjOAorCW9ycglyMixyMixyNSxsc2wjMTYKKwlvcnIJcjIscjIscjYsbHNsIzI0CisJbGRyYglyMyxbcjEyLCMxNV0KKwlsZHJiCXI0LFtyMTIsIzE0XQorCWxkcmIJcjUsW3IxMiwjMTNdCisJbGRyYglyNixbcjEyLCMxMl0KKwlvcnIJcjMscjMscjQsbHNsIzgKKwlvcnIJcjMscjMscjUsbHNsIzE2CisJb3JyCXIzLHIzLHI2LGxzbCMyNAorCisJYmwJX2FybXY0X0FFU19kZWNyeXB0CisKKwlsZHIJcjEyLFtzcF0sIzQJCUAgcG9wIG91dAorCW1vdglyNCxyMCxsc3IjMjQJCUAgd3JpdGUgb3V0cHV0IGluIGVuZGlhbi1uZXV0cmFsCisJbW92CXI1LHIwLGxzciMxNgkJQCBtYW5uZXIuLi4KKwltb3YJcjYscjAsbHNyIzgKKwlzdHJiCXI0LFtyMTIsIzBdCisJc3RyYglyNSxbcjEyLCMxXQorCXN0cmIJcjYsW3IxMiwjMl0KKwlzdHJiCXIwLFtyMTIsIzNdCisJbW92CXI0LHIxLGxzciMyNAorCW1vdglyNSxyMSxsc3IjMTYKKwltb3YJcjYscjEsbHNyIzgKKwlzdHJiCXI0LFtyMTIsIzRdCisJc3RyYglyNSxbcjEyLCM1XQorCXN0cmIJcjYsW3IxMiwjNl0KKwlzdHJiCXIxLFtyMTIsIzddCisJbW92CXI0LHIyLGxzciMyNAorCW1vdglyNSxyMixsc3IjMTYKKwltb3YJcjYscjIsbHNyIzgKKwlzdHJiCXI0LFtyMTIsIzhdCisJc3RyYglyNSxbcjEyLCM5XQorCXN0cmIJcjYsW3IxMiwjMTBdCisJc3RyYglyMixbcjEyLCMxMV0KKwltb3YJcjQscjMsbHNyIzI0CisJbW92CXI1LHIzLGxzciMxNgorCW1vdglyNixyMyxsc3IjOAorCXN0cmIJcjQsW3IxMiwjMTJdCisJc3RyYglyNSxbcjEyLCMxM10KKwlzdHJiCXI2LFtyMTIsIzE0XQorCXN0cmIJcjMsW3IxMiwjMTVdCisKKwlsZG1pYSAgIHNwISx7cjQtcjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwkud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisuc2l6ZQlBRVNfZGVjcnlwdCwuLUFFU19kZWNyeXB0CisKKy50eXBlICAgX2FybXY0X0FFU19kZWNyeXB0LCVmdW5jdGlvbgorLmFsaWduCTIKK19hcm12NF9BRVNfZGVjcnlwdDoKKwlzdHIJbHIsW3NwLCMtNF0hCQlAIHB1c2ggbHIKKwlsZHIJcjQsW3IxMV0sIzE2CisJbGRyCXI1LFtyMTEsIy0xMl0KKwlsZHIJcjYsW3IxMSwjLThdCisJbGRyCXI3LFtyMTEsIy00XQorCWxkcglyMTIsW3IxMSwjMjQwLTE2XQorCWVvcglyMCxyMCxyNAorCWVvcglyMSxyMSxyNQorCWVvcglyMixyMixyNgorCWVvcglyMyxyMyxyNworCXN1YglyMTIscjEyLCMxCisJbW92CWxyLCMyNTUKKworLkxkZWNfbG9vcDoKKwlhbmQJcjcsbHIscjAsbHNyIzE2CisJYW5kCXI4LGxyLHIwLGxzciM4CisJYW5kCXI5LGxyLHIwCisJbW92CXIwLHIwLGxzciMyNAorCWxkcglyNCxbcjEwLHI3LGxzbCMyXQlAIFRkMVtzMD4+MTZdCisJbGRyCXIwLFtyMTAscjAsbHNsIzJdCUAgVGQwW3MwPj4yNF0KKwlsZHIJcjUsW3IxMCxyOCxsc2wjMl0JQCBUZDJbczA+PjhdCisJbGRyCXI2LFtyMTAscjksbHNsIzJdCUAgVGQzW3MwPj4wXQorCisJYW5kCXI3LGxyLHIxCQlAIGkwCisJYW5kCXI4LGxyLHIxLGxzciMxNgorCWFuZAlyOSxscixyMSxsc3IjOAorCW1vdglyMSxyMSxsc3IjMjQKKwlsZHIJcjcsW3IxMCxyNyxsc2wjMl0JQCBUZDNbczE+PjBdCisJbGRyCXIxLFtyMTAscjEsbHNsIzJdCUAgVGQwW3MxPj4yNF0KKwlsZHIJcjgsW3IxMCxyOCxsc2wjMl0JQCBUZDFbczE+PjE2XQorCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRkMltzMT4+OF0KKwllb3IJcjAscjAscjcscm9yIzI0CisJZW9yCXIxLHIxLHI0LHJvciM4CisJZW9yCXI1LHI4LHI1LHJvciM4CisJZW9yCXI2LHI5LHI2LHJvciM4CisKKwlhbmQJcjcsbHIscjIsbHNyIzgJQCBpMAorCWFuZAlyOCxscixyMgkJQCBpMQorCWFuZAlyOSxscixyMixsc3IjMTYKKwltb3YJcjIscjIsbHNyIzI0CisJbGRyCXI3LFtyMTAscjcsbHNsIzJdCUAgVGQyW3MyPj44XQorCWxkcglyOCxbcjEwLHI4LGxzbCMyXQlAIFRkM1tzMj4+MF0KKwlsZHIJcjIsW3IxMCxyMixsc2wjMl0JQCBUZDBbczI+PjI0XQorCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRkMVtzMj4+MTZdCisJZW9yCXIwLHIwLHI3LHJvciMxNgorCWVvcglyMSxyMSxyOCxyb3IjMjQKKwllb3IJcjIscjIscjUscm9yIzgKKwllb3IJcjYscjkscjYscm9yIzgKKworCWFuZAlyNyxscixyMyxsc3IjMTYJQCBpMAorCWFuZAlyOCxscixyMyxsc3IjOAlAIGkxCisJYW5kCXI5LGxyLHIzCQlAIGkyCisJbW92CXIzLHIzLGxzciMyNAorCWxkcglyNyxbcjEwLHI3LGxzbCMyXQlAIFRkMVtzMz4+MTZdCisJbGRyCXI4LFtyMTAscjgsbHNsIzJdCUAgVGQyW3MzPj44XQorCWxkcglyOSxbcjEwLHI5LGxzbCMyXQlAIFRkM1tzMz4+MF0KKwlsZHIJcjMsW3IxMCxyMyxsc2wjMl0JQCBUZDBbczM+PjI0XQorCWVvcglyMCxyMCxyNyxyb3IjOAorCWVvcglyMSxyMSxyOCxyb3IjMTYKKwllb3IJcjIscjIscjkscm9yIzI0CisJZW9yCXIzLHIzLHI2LHJvciM4CisKKwlsZHIJcjQsW3IxMV0sIzE2CisJbGRyCXI1LFtyMTEsIy0xMl0KKwlsZHIJcjYsW3IxMSwjLThdCisJbGRyCXI3LFtyMTEsIy00XQorCWVvcglyMCxyMCxyNAorCWVvcglyMSxyMSxyNQorCWVvcglyMixyMixyNgorCWVvcglyMyxyMyxyNworCisJc3VicwlyMTIscjEyLCMxCisJYm5lCS5MZGVjX2xvb3AKKworCWFkZAlyMTAscjEwLCMxMDI0CisKKwlsZHIJcjQsW3IxMCwjMF0JCUAgcHJlZmV0Y2ggVGQ0CisJbGRyCXI1LFtyMTAsIzMyXQorCWxkcglyNixbcjEwLCM2NF0KKwlsZHIJcjcsW3IxMCwjOTZdCisJbGRyCXI4LFtyMTAsIzEyOF0KKwlsZHIJcjksW3IxMCwjMTYwXQorCWxkcglyNCxbcjEwLCMxOTJdCisJbGRyCXI1LFtyMTAsIzIyNF0KKworCWFuZAlyNyxscixyMCxsc3IjMTYKKwlhbmQJcjgsbHIscjAsbHNyIzgKKwlhbmQJcjksbHIscjAKKwlsZHJiCXIwLFtyMTAscjAsbHNyIzI0XQlAIFRkNFtzMD4+MjRdCisJbGRyYglyNCxbcjEwLHI3XQkJQCBUZDRbczA+PjE2XQorCWxkcmIJcjUsW3IxMCxyOF0JCUAgVGQ0W3MwPj44XQorCWxkcmIJcjYsW3IxMCxyOV0JCUAgVGQ0W3MwPj4wXQorCisJYW5kCXI3LGxyLHIxCQlAIGkwCisJYW5kCXI4LGxyLHIxLGxzciMxNgorCWFuZAlyOSxscixyMSxsc3IjOAorCWxkcmIJcjcsW3IxMCxyN10JCUAgVGQ0W3MxPj4wXQorCWxkcmIJcjEsW3IxMCxyMSxsc3IjMjRdCUAgVGQ0W3MxPj4yNF0KKwlsZHJiCXI4LFtyMTAscjhdCQlAIFRkNFtzMT4+MTZdCisJbGRyYglyOSxbcjEwLHI5XQkJQCBUZDRbczE+PjhdCisJZW9yCXIwLHI3LHIwLGxzbCMyNAorCWVvcglyMSxyNCxyMSxsc2wjOAorCWVvcglyNSxyNSxyOCxsc2wjOAorCWVvcglyNixyNixyOSxsc2wjOAorCisJYW5kCXI3LGxyLHIyLGxzciM4CUAgaTAKKwlhbmQJcjgsbHIscjIJCUAgaTEKKwlhbmQJcjksbHIscjIsbHNyIzE2CisJbGRyYglyNyxbcjEwLHI3XQkJQCBUZDRbczI+PjhdCisJbGRyYglyOCxbcjEwLHI4XQkJQCBUZDRbczI+PjBdCisJbGRyYglyMixbcjEwLHIyLGxzciMyNF0JQCBUZDRbczI+PjI0XQorCWxkcmIJcjksW3IxMCxyOV0JCUAgVGQ0W3MyPj4xNl0KKwllb3IJcjAscjAscjcsbHNsIzgKKwllb3IJcjEscjgscjEsbHNsIzE2CisJZW9yCXIyLHI1LHIyLGxzbCMxNgorCWVvcglyNixyNixyOSxsc2wjMTYKKworCWFuZAlyNyxscixyMyxsc3IjMTYJQCBpMAorCWFuZAlyOCxscixyMyxsc3IjOAlAIGkxCisJYW5kCXI5LGxyLHIzCQlAIGkyCisJbGRyYglyNyxbcjEwLHI3XQkJQCBUZDRbczM+PjE2XQorCWxkcmIJcjgsW3IxMCxyOF0JCUAgVGQ0W3MzPj44XQorCWxkcmIJcjksW3IxMCxyOV0JCUAgVGQ0W3MzPj4wXQorCWxkcmIJcjMsW3IxMCxyMyxsc3IjMjRdCUAgVGQ0W3MzPj4yNF0KKwllb3IJcjAscjAscjcsbHNsIzE2CisJZW9yCXIxLHIxLHI4LGxzbCM4CisJZW9yCXIyLHI5LHIyLGxzbCM4CisJZW9yCXIzLHI2LHIzLGxzbCMyNAorCisJbGRyCWxyLFtzcF0sIzQJCUAgcG9wIGxyCisJbGRyCXI0LFtyMTEsIzBdCisJbGRyCXI1LFtyMTEsIzRdCisJbGRyCXI2LFtyMTEsIzhdCisJbGRyCXI3LFtyMTEsIzEyXQorCWVvcglyMCxyMCxyNAorCWVvcglyMSxyMSxyNQorCWVvcglyMixyMixyNgorCWVvcglyMyxyMyxyNworCisJc3ViCXIxMCxyMTAsIzEwMjQKKwltb3YJcGMsbHIJCQlAIHJldHVybgorLnNpemUJX2FybXY0X0FFU19kZWNyeXB0LC4tX2FybXY0X0FFU19kZWNyeXB0CisuYXNjaXoJIkFFUyBmb3IgQVJNdjQsIENSWVBUT0dBTVMgYnkgPGFwcHJvQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkyCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMtaWE2NC5TIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLWlhNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjZjNGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLWlhNjQuUwpAQCAtMCwwICsxLDExMjMgQEAKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKy8vIHByb2plY3QuIFJpZ2h0cyBmb3IgcmVkaXN0cmlidXRpb24gYW5kIHVzYWdlIGluIHNvdXJjZSBhbmQgYmluYXJ5CisvLyBmb3JtcyBhcmUgZ3JhbnRlZCBhY2NvcmRpbmcgdG8gdGhlIE9wZW5TU0wgbGljZW5zZS4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gV2hhdCdzIHdyb25nIHdpdGggY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGU/IENvbXBpbGVyIG5ldmVyIHVzZXMKKy8vIHZhcmlhYmxlICdzaHInIHdoaWNoIGlzIHBhaXJhYmxlIHdpdGggJ2V4dHInLydkZXAnIGluc3RydWN0aW9ucy4KKy8vIFRoZW4gaXQgdXNlcyAnenh0JyB3aGljaCBpcyBhbiBJLXR5cGUsIGJ1dCBjYW4gYmUgcmVwbGFjZWQgd2l0aAorLy8gJ2FuZCcgd2hpY2ggaW4gdHVybiBjYW4gYmUgYXNzaWduZWQgdG8gTS1wb3J0IFt0aGVyZSdyZSBkb3VibGUgYXMKKy8vIG11Y2ggTS1wb3J0cyBhcyB0aGVyZSdyZSBJLXBvcnRzIG9uIEl0YW5pdW0gMl0uIEJ5IHNhY3JpZmljaW5nIGZldworLy8gcmVnaXN0ZXJzIGZvciBzbWFsbCBjb25zdGFudHMgKDI1NSwgMjQgYW5kIDE2KSB0byBiZSB1c2VkIHdpdGgKKy8vICdzaHInIGFuZCAnYW5kJyBpbnN0cnVjdGlvbnMgSSBjYW4gYWNoaWV2ZSBiZXR0ZXIgSUxQLCBJbnRydWN0aW9uCisvLyBMZXZlbCBQYXJhbGxlbGlzbSwgYW5kIHBlcmZvcm1hbmNlLiBUaGlzIGNvZGUgb3V0cGVyZm9ybXMgR0NDIDMuMworLy8gZ2VuZXJhdGVkIGNvZGUgYnkgb3ZlciBmYWN0b3Igb2YgMiAodHdvKSwgR0NDIDMuNCAtIGJ5IDcwJSBhbmQKKy8vIEhQIEMgLSBieSA0MCUuIE1lYXN1cmVkIGJlc3QtY2FzZSBzY2VuYXJpbywgaS5lLiBhbGlnbmVkCisvLyBiaWctZW5kaWFuIGlucHV0LCBFQ0IgdGltaW5nIG9uIEl0YW5pdW0gMiBpcyAoMTggKyAxMypyb3VuZHMpCisvLyB0aWNrcyBwZXIgYmxvY2ssIG9yIDkuMjUgQ1BVIGN5Y2xlcyBwZXIgYnl0ZSBmb3IgMTI4IGJpdCBrZXkuCisKKy8vIFZlcnNpb24gMS4yIG1pdGlnYXRlcyB0aGUgaGF6YXJkIG9mIGNhY2hlLXRpbWluZyBhdHRhY2tzIGJ5CisvLyBhKSBjb21wcmVzc2luZyBTLWJveGVzIGZyb20gOEtCIHRvIDJLQisyNTZCLCBiKSBzY2hlZHVsaW5nCisvLyByZWZlcmVuY2VzIHRvIFMtYm94ZXMgZm9yIEwyIGNhY2hlIGxhdGVuY3ksIGMpIHByZWZldGNoaW5nIFRbZWRdNAorLy8gcHJpb3IgbGFzdCByb3VuZC4gQXMgcmVzdWx0IHBlcmZvcm1hbmNlIGRyb3BwZWQgdG8gKDI2ICsgMTUqcm91bmRzKQorLy8gdGlja3MgcGVyIGJsb2NrIG9yIDExIGN5Y2xlcyBwZXIgYnl0ZSBwcm9jZXNzZWQgd2l0aCAxMjgtYml0IGtleS4KKy8vIFRoaXMgaXMgfjE2JSBkZXRlcmlvcmF0aW9uLiBGb3IgcmVmZXJlbmNlIEl0YW5pdW0gMiBMMSBjYWNoZSBoYXMKKy8vIDY0IGJ5dGVzIGxpbmUgc2l6ZSBhbmQgTDIgLSAxMjggYnl0ZXMuLi4KKworLmlkZW50CSJhZXMtaWE2NC5TLCB2ZXJzaW9uIDEuMiIKKy5pZGVudAkiSUEtNjQgSVNBIGFydHdvcmsgYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IgorLmV4cGxpY2l0CisudGV4dAorCityazA9cjg7ICAgICByazE9cjk7CisKK3Bmc3NhdmU9cjI7CitsY3NhdmU9cjEwOworcHJzYXZlPXIzOworbWFza2ZmPXIxMTsKK3R3ZW50eTQ9cjE0Oworc2l4dGVlbj1yMTU7CisKK3RlMDA9cjE2OyAgIHRlMTE9cjE3OyAgIHRlMjI9cjE4OyAgIHRlMzM9cjE5OwordGUwMT1yMjA7ICAgdGUxMj1yMjE7ICAgdGUyMz1yMjI7ICAgdGUzMD1yMjM7Cit0ZTAyPXIyNDsgICB0ZTEzPXIyNTsgICB0ZTIwPXIyNjsgICB0ZTMxPXIyNzsKK3RlMDM9cjI4OyAgIHRlMTA9cjI5OyAgIHRlMjE9cjMwOyAgIHRlMzI9cjMxOworCisvLyB0aGVzZSBhcmUgcm90YXRpbmcuLi4KK3QwPXIzMjsgICAgIHMwPXIzMzsKK3QxPXIzNDsgICAgIHMxPXIzNTsKK3QyPXIzNjsgICAgIHMyPXIzNzsKK3QzPXIzODsgICAgIHMzPXIzOTsKKwordGUwPXI0MDsgICAgdGUxPXI0MTsgICAgdGUyPXI0MjsgICAgdGUzPXI0MzsKKworI2lmIGRlZmluZWQoX0hQVVhfU09VUkNFKSAmJiAhZGVmaW5lZChfTFA2NCkKKyMgZGVmaW5lIEFERFAJYWRkcDQKKyNlbHNlCisjIGRlZmluZSBBRERQCWFkZAorI2VuZGlmCisKKy8vIE9mZnNldHMgZnJvbSBUZTAKKyNkZWZpbmUgVEUwCTAKKyNkZWZpbmUgVEUyCTIKKyNpZiBkZWZpbmVkKF9IUFVYX1NPVVJDRSkgfHwgZGVmaW5lZChCX0VORElBTikKKyNkZWZpbmUgVEUxCTMKKyNkZWZpbmUgVEUzCTEKKyNlbHNlCisjZGVmaW5lIFRFMQkxCisjZGVmaW5lIFRFMwkzCisjZW5kaWYKKworLy8gVGhpcyBpbXBsaWVzIHRoYXQgQUVTX0tFWSBjb21wcmlzZXMgMzItYml0IGtleSBzY2hlZHVsZSBlbGVtZW50cworLy8gZXZlbiBvbiBMUDY0IHBsYXRmb3Jtcy4KKyNpZm5kZWYJS1NaCisjIGRlZmluZSBLU1oJNAorIyBkZWZpbmUgTERLRVkJbGQ0CisjZW5kaWYKKworLnByb2MJX2lhNjRfQUVTX2VuY3J5cHQjCisvLyBJbnB1dDoJcmswLXJrMQorLy8JCXRlMAorLy8JCXRlMwlhcyBBRVNfS0VZLT5yb3VuZHMhISEKKy8vCQlzMC1zMworLy8JCW1hc2tmZix0d2VudHk0LHNpeHRlZW4KKy8vIE91dHB1dDoJcjE2LHIyMCxyMjQscjI4IGFzIHMwLXMzCisvLyBDbG9iYmVyOglyMTYtcjMxLHJrMC1yazEscjMyLXI0MworLmFsaWduCTMyCitfaWE2NF9BRVNfZW5jcnlwdDoKKwkucHJvbG9ndWUKKwkuYWx0cnAJYjYKKwkuYm9keQoreyAubW1pOwlhbGxvYwlyMTY9YXIucGZzLDEyLDAsMCw4CisJTERLRVkJdDA9W3JrMF0sMipLU1oKKwltb3YJcHIucm90PTE8PDE2CX0KK3sgLm1taTsJTERLRVkJdDE9W3JrMV0sMipLU1oKKwlhZGQJdGUxPVRFMSx0ZTAKKwlhZGQJdGUzPS0zLHRlMwl9OzsKK3sgLm1pYjsJTERLRVkJdDI9W3JrMF0sMipLU1oKKwltb3YJYXIuZWM9MgkJfQoreyAubWliOwlMREtFWQl0Mz1bcmsxXSwyKktTWgorCWFkZAl0ZTI9VEUyLHRlMAorCWJycC5sb29wLmltcAkuTGVfdG9wLC5MZV9lbmQtMTYJfTs7CisKK3sgLm1taTsJeG9yCXMwPXMwLHQwCisJeG9yCXMxPXMxLHQxCisJbW92CWFyLmxjPXRlMwl9Cit7IC5tbWk7CXhvcglzMj1zMix0MgorCXhvcglzMz1zMyx0MworCWFkZAl0ZTM9VEUzLHRlMAl9OzsKKwwKKy5hbGlnbgkzMgorLkxlX3RvcDoKK3sgLm1taTsJKHAwKQlMREtFWQl0MD1bcmswXSwyKktTWgkJLy8gMC8wOnJrWzBdCisJKHAwKQlhbmQJdGUzMz1zMyxtYXNrZmYJCS8vIDAvMDpzMyYweGZmCisJKHAwKQlleHRyLnUJdGUyMj1zMiw4LDgJfQkvLyAwLzA6czI+PjgmMHhmZgoreyAubW1pOyAocDApCUxES0VZCXQxPVtyazFdLDIqS1NaCQkvLyAwLzE6cmtbMV0KKwkocDApCWFuZAl0ZTMwPXMwLG1hc2tmZgkJLy8gMC8xOnMwJjB4ZmYKKwkocDApCXNoci51CXRlMDA9czAsdHdlbnR5NAl9OzsJLy8gMC8wOnMwPj4yNAoreyAubW1pOwkocDApCUxES0VZCXQyPVtyazBdLDIqS1NaCQkvLyAxLzI6cmtbMl0KKwkocDApCXNobGFkZAl0ZTMzPXRlMzMsMyx0ZTMJCS8vIDEvMDp0ZTArczA+PjI0CisJKHAwKQlleHRyLnUJdGUyMz1zMyw4LDgJfQkvLyAxLzE6czM+PjgmMHhmZgoreyAubW1pOwkocDApCUxES0VZCXQzPVtyazFdLDIqS1NaCQkvLyAxLzM6cmtbM10KKwkocDApCXNobGFkZAl0ZTMwPXRlMzAsMyx0ZTMJCS8vIDEvMTp0ZTMrczAKKwkocDApCXNoci51CXRlMDE9czEsdHdlbnR5NAl9OzsJLy8gMS8xOnMxPj4yNAoreyAubW1pOwkocDApCWxkNAl0ZTMzPVt0ZTMzXQkJLy8gMi8wOnRlM1tzMyYweGZmXQorCShwMCkJc2hsYWRkCXRlMjI9dGUyMiwzLHRlMgkJLy8gMi8wOnRlMitzMj4+OCYweGZmCisJKHAwKQlleHRyLnUJdGUyMD1zMCw4LDgJfQkvLyAyLzI6czA+PjgmMHhmZgoreyAubW1pOwkocDApCWxkNAl0ZTMwPVt0ZTMwXQkJLy8gMi8xOnRlM1tzMF0KKwkocDApCXNobGFkZAl0ZTIzPXRlMjMsMyx0ZTIJCS8vIDIvMTp0ZTIrczM+PjgKKwkocDApCXNoci51CXRlMDI9czIsdHdlbnR5NAl9OzsJLy8gMi8yOnMyPj4yNAoreyAubW1pOwkocDApCWxkNAl0ZTIyPVt0ZTIyXQkJLy8gMy8wOnRlMltzMj4+OF0KKwkocDApCXNobGFkZAl0ZTIwPXRlMjAsMyx0ZTIJCS8vIDMvMjp0ZTIrczA+PjgKKwkocDApCWV4dHIudQl0ZTIxPXMxLDgsOAl9CS8vIDMvMzpzMT4+OCYweGZmCit7IC5tbWk7CShwMCkJbGQ0CXRlMjM9W3RlMjNdCQkvLyAzLzE6dGUyW3MzPj44XQorCShwMCkJc2hsYWRkCXRlMDA9dGUwMCwzLHRlMAkJLy8gMy8wOnRlMCtzMD4+MjQKKwkocDApCXNoci51CXRlMDM9czMsdHdlbnR5NAl9OzsJLy8gMy8zOnMzPj4yNAoreyAubW1pOwkocDApCWxkNAl0ZTIwPVt0ZTIwXQkJLy8gNC8yOnRlMltzMD4+OF0KKwkocDApCXNobGFkZAl0ZTIxPXRlMjEsMyx0ZTIJCS8vIDQvMzp0ZTMrczIKKwkocDApCWV4dHIudQl0ZTExPXMxLDE2LDgJfQkvLyA0LzA6czE+PjE2JjB4ZmYKK3sgLm1taTsJKHAwKQlsZDQJdGUwMD1bdGUwMF0JCS8vIDQvMDp0ZTBbczA+PjI0XQorCShwMCkJc2hsYWRkCXRlMDE9dGUwMSwzLHRlMAkJLy8gNC8xOnRlMCtzMT4+MjQKKwkocDApCXNoci51CXRlMTM9czMsc2l4dGVlbgl9OzsJLy8gNC8yOnMzPj4xNgoreyAubW1pOwkocDApCWxkNAl0ZTIxPVt0ZTIxXQkJLy8gNS8zOnRlMltzMT4+OF0KKwkocDApCXNobGFkZAl0ZTExPXRlMTEsMyx0ZTEJCS8vIDUvMDp0ZTErczE+PjE2CisJKHAwKQlleHRyLnUJdGUxMj1zMiwxNiw4CX0JLy8gNS8xOnMyPj4xNiYweGZmCit7IC5tbWk7CShwMCkJbGQ0CXRlMDE9W3RlMDFdCQkvLyA1LzE6dGUwW3MxPj4yNF0KKwkocDApCXNobGFkZAl0ZTAyPXRlMDIsMyx0ZTAJCS8vIDUvMjp0ZTArczI+PjI0CisJKHAwKQlhbmQJdGUzMT1zMSxtYXNrZmYJfTs7CS8vIDUvMjpzMSYweGZmCit7IC5tbWk7CShwMCkJbGQ0CXRlMTE9W3RlMTFdCQkvLyA2LzA6dGUxW3MxPj4xNl0KKwkocDApCXNobGFkZAl0ZTEyPXRlMTIsMyx0ZTEJCS8vIDYvMTp0ZTErczI+PjE2CisJKHAwKQlleHRyLnUJdGUxMD1zMCwxNiw4CX0JLy8gNi8zOnMwPj4xNiYweGZmCit7IC5tbWk7CShwMCkJbGQ0CXRlMDI9W3RlMDJdCQkvLyA2LzI6dGUwW3MyPj4yNF0KKwkocDApCXNobGFkZAl0ZTAzPXRlMDMsMyx0ZTAJCS8vIDYvMzp0ZTErczA+PjE2CisJKHAwKQlhbmQJdGUzMj1zMixtYXNrZmYJfTs7CS8vIDYvMzpzMiYweGZmCisKK3sgLm1taTsJKHAwKQlsZDQJdGUxMj1bdGUxMl0JCS8vIDcvMTp0ZTFbczI+PjE2XQorCShwMCkJc2hsYWRkCXRlMzE9dGUzMSwzLHRlMwkJLy8gNy8yOnRlMytzMSYweGZmCisJKHAwKQlhbmQJdGUxMz10ZTEzLG1hc2tmZn0JLy8gNy8yOnMzPj4xNiYweGZmCit7IC5tbWk7CShwMCkJbGQ0CXRlMDM9W3RlMDNdCQkvLyA3LzM6dGUwW3MzPj4yNF0KKwkocDApCXNobGFkZAl0ZTMyPXRlMzIsMyx0ZTMJCS8vIDcvMzp0ZTMrczIKKwkocDApCXhvcgl0MD10MCx0ZTMzCX07OwkvLyA3LzA6Cit7IC5tbWk7CShwMCkJbGQ0CXRlMzE9W3RlMzFdCQkvLyA4LzI6dGUzW3MxXQorCShwMCkJc2hsYWRkCXRlMTM9dGUxMywzLHRlMQkJLy8gOC8yOnRlMStzMz4+MTYKKwkocDApCXhvcgl0MD10MCx0ZTIyCX0JLy8gOC8wOgoreyAubW1pOwkocDApCWxkNAl0ZTMyPVt0ZTMyXQkJLy8gOC8zOnRlM1tzMl0KKwkocDApCXNobGFkZAl0ZTEwPXRlMTAsMyx0ZTEJCS8vIDgvMzp0ZTErczA+PjE2CisJKHAwKQl4b3IJdDE9dDEsdGUzMAl9OzsJLy8gOC8xOgoreyAubW1pOwkocDApCWxkNAl0ZTEzPVt0ZTEzXQkJLy8gOS8yOnRlMVtzMz4+MTZdCisJKHAwKQlsZDQJdGUxMD1bdGUxMF0JCS8vIDkvMzp0ZTFbczA+PjE2XQorCShwMCkJeG9yCXQwPXQwLHRlMDAJfTs7CS8vIDkvMDoJCSFMMiBzY2hlZHVsaW5nCit7IC5tbWk7CShwMCkJeG9yCXQxPXQxLHRlMjMJCS8vIDEwWzldLzE6CQorCShwMCkJeG9yCXQyPXQyLHRlMjAJCS8vIDEwWzldLzI6CisJKHAwKQl4b3IJdDM9dDMsdGUyMQl9OzsJLy8gMTBbOV0vMzoKK3sgLm1taTsJKHAwKQl4b3IJdDA9dDAsdGUxMQkJLy8gMTFbMTBdLzA6ZG9uZSEKKwkocDApCXhvcgl0MT10MSx0ZTAxCQkvLyAxMVsxMF0vMToKKwkocDApCXhvcgl0Mj10Mix0ZTAyCX07OwkvLyAxMVsxMF0vMjoJIUwyIHNjaGVkdWxpbmcKK3sgLm1taTsJKHAwKQl4b3IJdDM9dDMsdGUwMwkJLy8gMTJbMTBdLzM6CisJKHAxNikJY21wLmVxCXAwLHAxNz1yMCxyMCAJfTs7CS8vIDEyWzEwXS9jbGVhciAocDE3KQoreyAubW1pOwkocDApCXhvcgl0MT10MSx0ZTEyCQkvLyAxM1sxMV0vMTpkb25lIQorCShwMCkJeG9yCXQyPXQyLHRlMzEJCS8vIDEzWzExXS8yOgorCShwMCkJeG9yCXQzPXQzLHRlMzIJfQkvLyAxM1sxMV0vMzoKK3sgLm1taTsJKHAxNykJYWRkCXRlMD0yMDQ4LHRlMAkJLy8gMTNbMTFdLworCShwMTcpCWFkZAl0ZTE9MjA0OCs2NC1URTEsdGUxfTs7CS8vIDEzWzExXS8KK3sgLm1pYjsJKHAwKQl4b3IJdDI9dDIsdGUxMwkJLy8gMTRbMTJdLzI6ZG9uZSEKKwkocDE3KQlhZGQJdGUyPTIwNDgrMTI4LVRFMix0ZTJ9CS8vIDE0WzEyXS8KK3sgLm1pYjsJKHAwKQl4b3IJdDM9dDMsdGUxMAkJLy8gMTRbMTJdLzM6ZG9uZSEKKwkocDE3KQlhZGQJdGUzPTIwNDgrMTkyLVRFMyx0ZTMJLy8gMTRbMTJdLworCWJyLmN0b3Auc3B0awkuTGVfdG9wCQl9OzsKKy5MZV9lbmQ6CisMCisKK3sgLm1taTsJbGQ4CXRlMTI9W3RlMF0JCS8vIHByZWZldGNoIFRlNAorCWxkOAl0ZTMxPVt0ZTFdCX0KK3sgLm1taTsJbGQ4CXRlMTA9W3RlMl0KKwlsZDgJdGUzMj1bdGUzXQl9CisKK3sgLm1taTsJTERLRVkJdDA9W3JrMF0sMipLU1oJCS8vIDAvMDpya1swXQorCWFuZAl0ZTMzPXMzLG1hc2tmZgkJLy8gMC8wOnMzJjB4ZmYKKwlleHRyLnUJdGUyMj1zMiw4LDgJfQkvLyAwLzA6czI+PjgmMHhmZgoreyAubW1pOyBMREtFWQl0MT1bcmsxXSwyKktTWgkJLy8gMC8xOnJrWzFdCisJYW5kCXRlMzA9czAsbWFza2ZmCQkvLyAwLzE6czAmMHhmZgorCXNoci51CXRlMDA9czAsdHdlbnR5NAl9OzsJLy8gMC8wOnMwPj4yNAoreyAubW1pOwlMREtFWQl0Mj1bcmswXSwyKktTWgkJLy8gMS8yOnJrWzJdCisJYWRkCXRlMzM9dGUzMyx0ZTAJCS8vIDEvMDp0ZTArczA+PjI0CisJZXh0ci51CXRlMjM9czMsOCw4CX0JLy8gMS8xOnMzPj44JjB4ZmYKK3sgLm1taTsJTERLRVkJdDM9W3JrMV0sMipLU1oJCS8vIDEvMzpya1szXQorCWFkZAl0ZTMwPXRlMzAsdGUwCQkvLyAxLzE6dGUwK3MwCisJc2hyLnUJdGUwMT1zMSx0d2VudHk0CX07OwkvLyAxLzE6czE+PjI0Cit7IC5tbWk7CWxkMQl0ZTMzPVt0ZTMzXQkJLy8gMi8wOnRlMFtzMyYweGZmXQorCWFkZAl0ZTIyPXRlMjIsdGUwCQkvLyAyLzA6dGUwK3MyPj44JjB4ZmYKKwlleHRyLnUJdGUyMD1zMCw4LDgJfQkvLyAyLzI6czA+PjgmMHhmZgoreyAubW1pOwlsZDEJdGUzMD1bdGUzMF0JCS8vIDIvMTp0ZTBbczBdCisJYWRkCXRlMjM9dGUyMyx0ZTAJCS8vIDIvMTp0ZTArczM+PjgKKwlzaHIudQl0ZTAyPXMyLHR3ZW50eTQJfTs7CS8vIDIvMjpzMj4+MjQKK3sgLm1taTsJbGQxCXRlMjI9W3RlMjJdCQkvLyAzLzA6dGUwW3MyPj44XQorCWFkZAl0ZTIwPXRlMjAsdGUwCQkvLyAzLzI6dGUwK3MwPj44CisJZXh0ci51CXRlMjE9czEsOCw4CX0JLy8gMy8zOnMxPj44JjB4ZmYKK3sgLm1taTsJbGQxCXRlMjM9W3RlMjNdCQkvLyAzLzE6dGUwW3MzPj44XQorCWFkZAl0ZTAwPXRlMDAsdGUwCQkvLyAzLzA6dGUwK3MwPj4yNAorCXNoci51CXRlMDM9czMsdHdlbnR5NAl9OzsJLy8gMy8zOnMzPj4yNAoreyAubW1pOwlsZDEJdGUyMD1bdGUyMF0JCS8vIDQvMjp0ZTBbczA+PjhdCisJYWRkCXRlMjE9dGUyMSx0ZTAJCS8vIDQvMzp0ZTArczIKKwlleHRyLnUJdGUxMT1zMSwxNiw4CX0JLy8gNC8wOnMxPj4xNiYweGZmCit7IC5tbWk7CWxkMQl0ZTAwPVt0ZTAwXQkJLy8gNC8wOnRlMFtzMD4+MjRdCisJYWRkCXRlMDE9dGUwMSx0ZTAJCS8vIDQvMTp0ZTArczE+PjI0CisJc2hyLnUJdGUxMz1zMyxzaXh0ZWVuCX07OwkvLyA0LzI6czM+PjE2Cit7IC5tbWk7CWxkMQl0ZTIxPVt0ZTIxXQkJLy8gNS8zOnRlMFtzMT4+OF0KKwlhZGQJdGUxMT10ZTExLHRlMAkJLy8gNS8wOnRlMCtzMT4+MTYKKwlleHRyLnUJdGUxMj1zMiwxNiw4CX0JLy8gNS8xOnMyPj4xNiYweGZmCit7IC5tbWk7CWxkMQl0ZTAxPVt0ZTAxXQkJLy8gNS8xOnRlMFtzMT4+MjRdCisJYWRkCXRlMDI9dGUwMix0ZTAJCS8vIDUvMjp0ZTArczI+PjI0CisJYW5kCXRlMzE9czEsbWFza2ZmCX07OwkvLyA1LzI6czEmMHhmZgoreyAubW1pOwlsZDEJdGUxMT1bdGUxMV0JCS8vIDYvMDp0ZTBbczE+PjE2XQorCWFkZAl0ZTEyPXRlMTIsdGUwCQkvLyA2LzE6dGUwK3MyPj4xNgorCWV4dHIudQl0ZTEwPXMwLDE2LDgJfQkvLyA2LzM6czA+PjE2JjB4ZmYKK3sgLm1taTsJbGQxCXRlMDI9W3RlMDJdCQkvLyA2LzI6dGUwW3MyPj4yNF0KKwlhZGQJdGUwMz10ZTAzLHRlMAkJLy8gNi8zOnRlMCtzMD4+MTYKKwlhbmQJdGUzMj1zMixtYXNrZmYJfTs7CS8vIDYvMzpzMiYweGZmCisKK3sgLm1taTsJbGQxCXRlMTI9W3RlMTJdCQkvLyA3LzE6dGUwW3MyPj4xNl0KKwlhZGQJdGUzMT10ZTMxLHRlMAkJLy8gNy8yOnRlMCtzMSYweGZmCisJZGVwCXRlMzM9dGUyMix0ZTMzLDgsOH0JLy8gNy8wOgoreyAubW1pOwlsZDEJdGUwMz1bdGUwM10JCS8vIDcvMzp0ZTBbczM+PjI0XQorCWFkZAl0ZTMyPXRlMzIsdGUwCQkvLyA3LzM6dGUwK3MyCisJYW5kCXRlMTM9dGUxMyxtYXNrZmZ9OzsJLy8gNy8yOnMzPj4xNiYweGZmCit7IC5tbWk7CWxkMQl0ZTMxPVt0ZTMxXQkJLy8gOC8yOnRlMFtzMV0KKwlhZGQJdGUxMz10ZTEzLHRlMAkJLy8gOC8yOnRlMCtzMz4+MTYKKwlkZXAJdGUzMD10ZTIzLHRlMzAsOCw4fQkvLyA4LzE6Cit7IC5tbWk7CWxkMQl0ZTMyPVt0ZTMyXQkJLy8gOC8zOnRlMFtzMl0KKwlhZGQJdGUxMD10ZTEwLHRlMAkJLy8gOC8zOnRlMCtzMD4+MTYKKwlzaGwJdGUwMD10ZTAwLHR3ZW50eTR9OzsJLy8gOC8wOgoreyAubWlpOwlsZDEJdGUxMz1bdGUxM10JCS8vIDkvMjp0ZTBbczM+PjE2XQorCWRlcAl0ZTMzPXRlMTEsdGUzMywxNiw4CS8vIDkvMDoKKwlzaGwJdGUwMT10ZTAxLHR3ZW50eTR9OzsJLy8gOS8xOgoreyAubWlpOwlsZDEJdGUxMD1bdGUxMF0JCS8vIDEwLzM6dGUwW3MwPj4xNl0KKwlkZXAJdGUzMT10ZTIwLHRlMzEsOCw4CS8vIDEwLzI6CisJc2hsCXRlMDI9dGUwMix0d2VudHk0fTs7CS8vIDEwLzI6Cit7IC5taWk7CXhvcgl0MD10MCx0ZTMzCQkvLyAxMS8wOgorCWRlcAl0ZTMyPXRlMjEsdGUzMiw4LDgJLy8gMTEvMzoKKwlzaGwJdGUxMj10ZTEyLHNpeHRlZW59OzsJLy8gMTEvMToKK3sgLm1paTsJeG9yCXIxNj10MCx0ZTAwCQkvLyAxMi8wOmRvbmUhCisJZGVwCXRlMzE9dGUxMyx0ZTMxLDE2LDgJLy8gMTIvMjoKKwlzaGwJdGUwMz10ZTAzLHR3ZW50eTR9OzsJLy8gMTIvMzoKK3sgLm1taTsJeG9yCXQxPXQxLHRlMDEJCS8vIDEzLzE6CisJeG9yCXQyPXQyLHRlMDIJCS8vIDEzLzI6CisJZGVwCXRlMzI9dGUxMCx0ZTMyLDE2LDh9OzsJLy8gMTMvMzoKK3sgLm1taTsJeG9yCXQxPXQxLHRlMzAJCS8vIDE0LzE6CisJeG9yCXIyND10Mix0ZTMxCQkvLyAxNC8yOmRvbmUhCisJeG9yCXQzPXQzLHRlMzIJfTs7CS8vIDE0LzM6Cit7IC5taWI7CXhvcglyMjA9dDEsdGUxMgkJLy8gMTUvMTpkb25lIQorCXhvcglyMjg9dDMsdGUwMwkJLy8gMTUvMzpkb25lIQorCWJyLnJldC5zcHRrCWI2CX07OworLmVuZHAJX2lhNjRfQUVTX2VuY3J5cHQjCisKKy8vIHZvaWQgQUVTX2VuY3J5cHQgKGNvbnN0IHZvaWQgKmluLHZvaWQgKm91dCxjb25zdCBBRVNfS0VZICprZXkpOworLmdsb2JhbAlBRVNfZW5jcnlwdCMKKy5wcm9jCUFFU19lbmNyeXB0IworLmFsaWduCTMyCitBRVNfZW5jcnlwdDoKKwkucHJvbG9ndWUKKwkuc2F2ZQlhci5wZnMscGZzc2F2ZQoreyAubW1pOwlhbGxvYwlwZnNzYXZlPWFyLnBmcywzLDEsMTIsMAorCWFuZAlvdXQwPTMsaW4wCisJbW92CXIzPWlwCQkJfQoreyAubW1pOwlBRERQCWluMD0wLGluMAorCW1vdglsb2MwPXBzci51bQorCUFERFAJb3V0MTE9S1NaKjYwLGluMgl9OzsJLy8gJkFFU19LRVktPnJvdW5kcworCit7IC5tbWk7CWxkNAlvdXQxMT1bb3V0MTFdCQkJLy8gQUVTX0tFWS0+cm91bmRzCisJYWRkCW91dDg9KEFFU19UZSMtQUVTX2VuY3J5cHQjKSxyMwkvLyBUZTAKKwkuc2F2ZQlwcixwcnNhdmUKKwltb3YJcHJzYXZlPXByCQl9Cit7IC5tbWk7CXJ1bQkxPDwzCQkJCS8vIGNsZWFyIHVtLmFjCisJLnNhdmUJYXIubGMsbGNzYXZlCisJbW92CWxjc2F2ZT1hci5sYwkJfTs7CisKKwkuYm9keQorI2lmIGRlZmluZWQoX0hQVVhfU09VUkNFKQkvLyBIUFVYIGlzIGJpZy1lbmRpYW4sIGN1dCAxNSsxNSBjeWNsZXMuLi4KK3sgLm1pYjsgY21wLm5lCXA2LHAwPW91dDAscjAKKwlhZGQJb3V0MD00LGluMAorKHA2KQlici5kcG50Lm1hbnkJLkxlX2lfdW5hbGlnbmVkCX07OworCit7IC5tbWk7CWxkNAlvdXQxPVtpbjBdLDgJCS8vIHMwCisJYW5kCW91dDk9MyxpbjEKKwltb3YJdHdlbnR5ND0yNAkJfQoreyAubW1pOwlsZDQJb3V0Mz1bb3V0MF0sOAkJLy8gczEKKwlBRERQCXJrMD0wLGluMgorCW1vdglzaXh0ZWVuPTE2CQl9OzsKK3sgLm1taTsJbGQ0CW91dDU9W2luMF0JCS8vIHMyCisJY21wLm5lCXA2LHAwPW91dDkscjAKKwltb3YJbWFza2ZmPTB4ZmYJCX0KK3sgLm1tYjsJbGQ0CW91dDc9W291dDBdCQkvLyBzMworCUFERFAJcmsxPUtTWixpbjIKKwlici5jYWxsLnNwdGsubWFueQliNj1faWE2NF9BRVNfZW5jcnlwdAl9OzsKKworeyAubWliOwlBRERQCWluMD00LGluMQorCUFERFAJaW4xPTAsaW4xCisocDYpCWJyLnNwbnQJLkxlX29fdW5hbGlnbmVkCQl9OzsKKworeyAubWlpOwltb3YJcHNyLnVtPWxvYzAKKwltb3YJYXIucGZzPXBmc3NhdmUKKwltb3YJYXIubGM9bGNzYXZlCQl9OzsKK3sgLm1taTsJc3Q0CVtpbjFdPXIxNiw4CQkvLyBzMAorCXN0NAlbaW4wXT1yMjAsOAkJLy8gczEKKwltb3YJcHI9cHJzYXZlLDB4MWZmZmYJfTs7Cit7IC5tbWI7CXN0NAlbaW4xXT1yMjQJCS8vIHMyCisJc3Q0CVtpbjBdPXIyOAkJLy8gczMKKwlici5yZXQuc3B0ay5tYW55CWIwCX07OworI2VuZGlmCisKKy5hbGlnbgkzMgorLkxlX2lfdW5hbGlnbmVkOgoreyAubW1pOwlhZGQJb3V0MD0xLGluMAorCWFkZAlvdXQyPTIsaW4wCisJYWRkCW91dDQ9MyxpbjAJfTs7Cit7IC5tbWk7CWxkMQlyMTY9W2luMF0sNAorCWxkMQlyMTc9W291dDBdLDQJfS8vOzsKK3sgLm1taTsJbGQxCXIxOD1bb3V0Ml0sNAorCWxkMQlvdXQxPVtvdXQ0XSw0CX07OwkvLyBzMAoreyAubW1pOwlsZDEJcjIwPVtpbjBdLDQKKwlsZDEJcjIxPVtvdXQwXSw0CX0vLzs7Cit7IC5tbWk7CWxkMQlyMjI9W291dDJdLDQKKwlsZDEJb3V0Mz1bb3V0NF0sNAl9OzsJLy8gczEKK3sgLm1taTsJbGQxCXIyND1baW4wXSw0CisJbGQxCXIyNT1bb3V0MF0sNAl9Ly87OworeyAubW1pOwlsZDEJcjI2PVtvdXQyXSw0CisJbGQxCW91dDU9W291dDRdLDQJfTs7CS8vIHMyCit7IC5tbWk7CWxkMQlyMjg9W2luMF0KKwlsZDEJcjI5PVtvdXQwXQl9Ly87OworeyAubW1pOwlsZDEJcjMwPVtvdXQyXQorCWxkMQlvdXQ3PVtvdXQ0XQl9OzsJLy8gczMKKworeyAubWlpOworCWRlcAlvdXQxPXIxNixvdXQxLDI0LDgJLy87OworCWRlcAlvdXQzPXIyMCxvdXQzLDI0LDgJfS8vOzsKK3sgLm1paTsJQUREUAlyazA9MCxpbjIKKwlkZXAJb3V0NT1yMjQsb3V0NSwyNCw4CS8vOzsKKwlkZXAJb3V0Nz1yMjgsb3V0NywyNCw4CX07OworeyAubWlpOwlBRERQCXJrMT1LU1osaW4yCisJZGVwCW91dDE9cjE3LG91dDEsMTYsOAkvLzs7CisJZGVwCW91dDM9cjIxLG91dDMsMTYsOAl9Ly87OworeyAubWlpOwltb3YJdHdlbnR5ND0yNAorCWRlcAlvdXQ1PXIyNSxvdXQ1LDE2LDgJLy87OworCWRlcAlvdXQ3PXIyOSxvdXQ3LDE2LDgJfTs7Cit7IC5taWk7CW1vdglzaXh0ZWVuPTE2CisJZGVwCW91dDE9cjE4LG91dDEsOCw4CS8vOzsKKwlkZXAJb3V0Mz1yMjIsb3V0Myw4LDgJfS8vOzsKK3sgLm1paTsJbW92CW1hc2tmZj0weGZmCisJZGVwCW91dDU9cjI2LG91dDUsOCw4CS8vOzsKKwlkZXAJb3V0Nz1yMzAsb3V0Nyw4LDgJfTs7CisKK3sgLm1pYjsJYnIuY2FsbC5zcHRrLm1hbnkJYjY9X2lhNjRfQUVTX2VuY3J5cHQJfTs7CisKKy5MZV9vX3VuYWxpZ25lZDoKK3sgLm1paTsJQUREUAlvdXQwPTAsaW4xCisJZXh0ci51CXIxNz1yMTYsOCw4CQkJLy8gczAKKwlzaHIudQlyMTk9cjE2LHR3ZW50eTQJCX0vLzs7Cit7IC5taWk7CUFERFAJb3V0MT0xLGluMQorCWV4dHIudQlyMTg9cjE2LDE2LDgKKwlzaHIudQlyMjM9cjIwLHR3ZW50eTQJCX0vLzs7CS8vIHMxCit7IC5taWk7CUFERFAJb3V0Mj0yLGluMQorCWV4dHIudQlyMjE9cjIwLDgsOAorCXNoci51CXIyMj1yMjAsc2l4dGVlbgkJfS8vOzsKK3sgLm1paTsJQUREUAlvdXQzPTMsaW4xCisJZXh0ci51CXIyNT1yMjQsOCw4CQkJLy8gczIKKwlzaHIudQlyMjc9cjI0LHR3ZW50eTQJCX07OworeyAubWlpOwlzdDEJW291dDNdPXIxNiw0CisJZXh0ci51CXIyNj1yMjQsMTYsOAorCXNoci51CXIzMT1yMjgsdHdlbnR5NAkJfS8vOzsJLy8gczMKK3sgLm1paTsJc3QxCVtvdXQyXT1yMTcsNAorCWV4dHIudQlyMjk9cjI4LDgsOAorCXNoci51CXIzMD1yMjgsc2l4dGVlbgkJfS8vOzsKKworeyAubW1pOwlzdDEJW291dDFdPXIxOCw0CisJc3QxCVtvdXQwXT1yMTksNAkJfTs7Cit7IC5tbWk7CXN0MQlbb3V0M109cjIwLDQKKwlzdDEJW291dDJdPXIyMSw0CQl9Ly87OworeyAubW1pOwlzdDEJW291dDFdPXIyMiw0CisJc3QxCVtvdXQwXT1yMjMsNAkJfTs7Cit7IC5tbWk7CXN0MQlbb3V0M109cjI0LDQKKwlzdDEJW291dDJdPXIyNSw0CisJbW92CXByPXByc2F2ZSwweDFmZmZmCX0vLzs7Cit7IC5tbWk7CXN0MQlbb3V0MV09cjI2LDQKKwlzdDEJW291dDBdPXIyNyw0CisJbW92CWFyLnBmcz1wZnNzYXZlCQl9OzsKK3sgLm1taTsJc3QxCVtvdXQzXT1yMjgKKwlzdDEJW291dDJdPXIyOQorCW1vdglhci5sYz1sY3NhdmUJCX0vLzs7Cit7IC5tbWk7CXN0MQlbb3V0MV09cjMwCisJc3QxCVtvdXQwXT1yMzEJCX0KK3sgLm1mYjsJbW92CXBzci51bT1sb2MwCQkJLy8gcmVzdG9yZSB1c2VyIG1hc2sKKwlici5yZXQuc3B0ay5tYW55CWIwCX07OworLmVuZHAJQUVTX2VuY3J5cHQjCisKKy8vICpBRVNfZGVjcnlwdCBhcmUgYXV0b2dlbmVyYXRlZCBieSB0aGUgZm9sbG93aW5nIHNjcmlwdDoKKyNpZiAwCisjIS91c3IvYmluL2VudiBwZXJsCitwcmludCAiLy8gKkFFU19kZWNyeXB0IGFyZSBhdXRvZ2VuZXJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgc2NyaXB0OlxuI2lmIDBcbiI7CitvcGVuKFBST0csJzwnLiQwKTsgd2hpbGUoPFBST0c+KSB7IHByaW50OyB9IGNsb3NlKFBST0cpOworcHJpbnQgIiNlbmRpZlxuIjsKK3doaWxlKDw+KSB7CisJJHByb2Nlc3M9MQlpZiAoL1wucHJvY1xzK19pYTY0X0FFU19lbmNyeXB0Lyk7CisJbmV4dAkJaWYgKCEkcHJvY2Vzcyk7CisKKwkjcy90ZTAwPXMwL3RkMDA9czAvOwlzL3RlMDAvdGQwMC9nOworCXMvdGUxMT1zMS90ZDEzPXMzLzsJcy90ZTExL3RkMTMvZzsKKwkjcy90ZTIyPXMyL3RkMjI9czIvOwlzL3RlMjIvdGQyMi9nOworCXMvdGUzMz1zMy90ZDMxPXMxLzsJcy90ZTMzL3RkMzEvZzsKKworCSNzL3RlMDE9czEvdGQwMT1zMS87CXMvdGUwMS90ZDAxL2c7CisJcy90ZTEyPXMyL3RkMTA9czAvOwlzL3RlMTIvdGQxMC9nOworCSNzL3RlMjM9czMvdGQyMz1zMy87CXMvdGUyMy90ZDIzL2c7CisJcy90ZTMwPXMwL3RkMzI9czIvOwlzL3RlMzAvdGQzMi9nOworCisJI3MvdGUwMj1zMi90ZDAyPXMyLzsJcy90ZTAyL3RkMDIvZzsKKwlzL3RlMTM9czMvdGQxMT1zMS87CXMvdGUxMy90ZDExL2c7CisJI3MvdGUyMD1zMC90ZDIwPXMwLzsJcy90ZTIwL3RkMjAvZzsKKwlzL3RlMzE9czEvdGQzMz1zMy87CXMvdGUzMS90ZDMzL2c7CisKKwkjcy90ZTAzPXMzL3RkMDM9czMvOwlzL3RlMDMvdGQwMy9nOworCXMvdGUxMD1zMC90ZDEyPXMyLzsJcy90ZTEwL3RkMTIvZzsKKwkjcy90ZTIxPXMxL3RkMjE9czEvOwlzL3RlMjEvdGQyMS9nOworCXMvdGUzMj1zMi90ZDMwPXMwLzsJcy90ZTMyL3RkMzAvZzsKKworCXMvdGQvdGUvZzsKKworCXMvQUVTX2VuY3J5cHQvQUVTX2RlY3J5cHQvZzsKKwlzL1wuTGVfLy5MZF8vZzsKKwlzL0FFU19UZSMvQUVTX1RkIy9nOworCisJcHJpbnQ7CisKKwlleGl0CQlpZiAoL1wuZW5kcFxzK0FFU19kZWNyeXB0Lyk7Cit9CisjZW5kaWYKKy5wcm9jCV9pYTY0X0FFU19kZWNyeXB0IworLy8gSW5wdXQ6CXJrMC1yazEKKy8vCQl0ZTAKKy8vCQl0ZTMJYXMgQUVTX0tFWS0+cm91bmRzISEhCisvLwkJczAtczMKKy8vCQltYXNrZmYsdHdlbnR5NCxzaXh0ZWVuCisvLyBPdXRwdXQ6CXIxNixyMjAscjI0LHIyOCBhcyBzMC1zMworLy8gQ2xvYmJlcjoJcjE2LXIzMSxyazAtcmsxLHIzMi1yNDMKKy5hbGlnbgkzMgorX2lhNjRfQUVTX2RlY3J5cHQ6CisJLnByb2xvZ3VlCisJLmFsdHJwCWI2CisJLmJvZHkKK3sgLm1taTsJYWxsb2MJcjE2PWFyLnBmcywxMiwwLDAsOAorCUxES0VZCXQwPVtyazBdLDIqS1NaCisJbW92CXByLnJvdD0xPDwxNgl9Cit7IC5tbWk7CUxES0VZCXQxPVtyazFdLDIqS1NaCisJYWRkCXRlMT1URTEsdGUwCisJYWRkCXRlMz0tMyx0ZTMJfTs7Cit7IC5taWI7CUxES0VZCXQyPVtyazBdLDIqS1NaCisJbW92CWFyLmVjPTIJCX0KK3sgLm1pYjsJTERLRVkJdDM9W3JrMV0sMipLU1oKKwlhZGQJdGUyPVRFMix0ZTAKKwlicnAubG9vcC5pbXAJLkxkX3RvcCwuTGRfZW5kLTE2CX07OworCit7IC5tbWk7CXhvcglzMD1zMCx0MAorCXhvcglzMT1zMSx0MQorCW1vdglhci5sYz10ZTMJfQoreyAubW1pOwl4b3IJczI9czIsdDIKKwl4b3IJczM9czMsdDMKKwlhZGQJdGUzPVRFMyx0ZTAJfTs7CisMCisuYWxpZ24JMzIKKy5MZF90b3A6Cit7IC5tbWk7CShwMCkJTERLRVkJdDA9W3JrMF0sMipLU1oJCS8vIDAvMDpya1swXQorCShwMCkJYW5kCXRlMzE9czEsbWFza2ZmCQkvLyAwLzA6czMmMHhmZgorCShwMCkJZXh0ci51CXRlMjI9czIsOCw4CX0JLy8gMC8wOnMyPj44JjB4ZmYKK3sgLm1taTsgKHAwKQlMREtFWQl0MT1bcmsxXSwyKktTWgkJLy8gMC8xOnJrWzFdCisJKHAwKQlhbmQJdGUzMj1zMixtYXNrZmYJCS8vIDAvMTpzMCYweGZmCisJKHAwKQlzaHIudQl0ZTAwPXMwLHR3ZW50eTQJfTs7CS8vIDAvMDpzMD4+MjQKK3sgLm1taTsJKHAwKQlMREtFWQl0Mj1bcmswXSwyKktTWgkJLy8gMS8yOnJrWzJdCisJKHAwKQlzaGxhZGQJdGUzMT10ZTMxLDMsdGUzCQkvLyAxLzA6dGUwK3MwPj4yNAorCShwMCkJZXh0ci51CXRlMjM9czMsOCw4CX0JLy8gMS8xOnMzPj44JjB4ZmYKK3sgLm1taTsJKHAwKQlMREtFWQl0Mz1bcmsxXSwyKktTWgkJLy8gMS8zOnJrWzNdCisJKHAwKQlzaGxhZGQJdGUzMj10ZTMyLDMsdGUzCQkvLyAxLzE6dGUzK3MwCisJKHAwKQlzaHIudQl0ZTAxPXMxLHR3ZW50eTQJfTs7CS8vIDEvMTpzMT4+MjQKK3sgLm1taTsJKHAwKQlsZDQJdGUzMT1bdGUzMV0JCS8vIDIvMDp0ZTNbczMmMHhmZl0KKwkocDApCXNobGFkZAl0ZTIyPXRlMjIsMyx0ZTIJCS8vIDIvMDp0ZTIrczI+PjgmMHhmZgorCShwMCkJZXh0ci51CXRlMjA9czAsOCw4CX0JLy8gMi8yOnMwPj44JjB4ZmYKK3sgLm1taTsJKHAwKQlsZDQJdGUzMj1bdGUzMl0JCS8vIDIvMTp0ZTNbczBdCisJKHAwKQlzaGxhZGQJdGUyMz10ZTIzLDMsdGUyCQkvLyAyLzE6dGUyK3MzPj44CisJKHAwKQlzaHIudQl0ZTAyPXMyLHR3ZW50eTQJfTs7CS8vIDIvMjpzMj4+MjQKK3sgLm1taTsJKHAwKQlsZDQJdGUyMj1bdGUyMl0JCS8vIDMvMDp0ZTJbczI+PjhdCisJKHAwKQlzaGxhZGQJdGUyMD10ZTIwLDMsdGUyCQkvLyAzLzI6dGUyK3MwPj44CisJKHAwKQlleHRyLnUJdGUyMT1zMSw4LDgJfQkvLyAzLzM6czE+PjgmMHhmZgoreyAubW1pOwkocDApCWxkNAl0ZTIzPVt0ZTIzXQkJLy8gMy8xOnRlMltzMz4+OF0KKwkocDApCXNobGFkZAl0ZTAwPXRlMDAsMyx0ZTAJCS8vIDMvMDp0ZTArczA+PjI0CisJKHAwKQlzaHIudQl0ZTAzPXMzLHR3ZW50eTQJfTs7CS8vIDMvMzpzMz4+MjQKK3sgLm1taTsJKHAwKQlsZDQJdGUyMD1bdGUyMF0JCS8vIDQvMjp0ZTJbczA+PjhdCisJKHAwKQlzaGxhZGQJdGUyMT10ZTIxLDMsdGUyCQkvLyA0LzM6dGUzK3MyCisJKHAwKQlleHRyLnUJdGUxMz1zMywxNiw4CX0JLy8gNC8wOnMxPj4xNiYweGZmCit7IC5tbWk7CShwMCkJbGQ0CXRlMDA9W3RlMDBdCQkvLyA0LzA6dGUwW3MwPj4yNF0KKwkocDApCXNobGFkZAl0ZTAxPXRlMDEsMyx0ZTAJCS8vIDQvMTp0ZTArczE+PjI0CisJKHAwKQlzaHIudQl0ZTExPXMxLHNpeHRlZW4JfTs7CS8vIDQvMjpzMz4+MTYKK3sgLm1taTsJKHAwKQlsZDQJdGUyMT1bdGUyMV0JCS8vIDUvMzp0ZTJbczE+PjhdCisJKHAwKQlzaGxhZGQJdGUxMz10ZTEzLDMsdGUxCQkvLyA1LzA6dGUxK3MxPj4xNgorCShwMCkJZXh0ci51CXRlMTA9czAsMTYsOAl9CS8vIDUvMTpzMj4+MTYmMHhmZgoreyAubW1pOwkocDApCWxkNAl0ZTAxPVt0ZTAxXQkJLy8gNS8xOnRlMFtzMT4+MjRdCisJKHAwKQlzaGxhZGQJdGUwMj10ZTAyLDMsdGUwCQkvLyA1LzI6dGUwK3MyPj4yNAorCShwMCkJYW5kCXRlMzM9czMsbWFza2ZmCX07OwkvLyA1LzI6czEmMHhmZgoreyAubW1pOwkocDApCWxkNAl0ZTEzPVt0ZTEzXQkJLy8gNi8wOnRlMVtzMT4+MTZdCisJKHAwKQlzaGxhZGQJdGUxMD10ZTEwLDMsdGUxCQkvLyA2LzE6dGUxK3MyPj4xNgorCShwMCkJZXh0ci51CXRlMTI9czIsMTYsOAl9CS8vIDYvMzpzMD4+MTYmMHhmZgoreyAubW1pOwkocDApCWxkNAl0ZTAyPVt0ZTAyXQkJLy8gNi8yOnRlMFtzMj4+MjRdCisJKHAwKQlzaGxhZGQJdGUwMz10ZTAzLDMsdGUwCQkvLyA2LzM6dGUxK3MwPj4xNgorCShwMCkJYW5kCXRlMzA9czAsbWFza2ZmCX07OwkvLyA2LzM6czImMHhmZgorCit7IC5tbWk7CShwMCkJbGQ0CXRlMTA9W3RlMTBdCQkvLyA3LzE6dGUxW3MyPj4xNl0KKwkocDApCXNobGFkZAl0ZTMzPXRlMzMsMyx0ZTMJCS8vIDcvMjp0ZTMrczEmMHhmZgorCShwMCkJYW5kCXRlMTE9dGUxMSxtYXNrZmZ9CS8vIDcvMjpzMz4+MTYmMHhmZgoreyAubW1pOwkocDApCWxkNAl0ZTAzPVt0ZTAzXQkJLy8gNy8zOnRlMFtzMz4+MjRdCisJKHAwKQlzaGxhZGQJdGUzMD10ZTMwLDMsdGUzCQkvLyA3LzM6dGUzK3MyCisJKHAwKQl4b3IJdDA9dDAsdGUzMQl9OzsJLy8gNy8wOgoreyAubW1pOwkocDApCWxkNAl0ZTMzPVt0ZTMzXQkJLy8gOC8yOnRlM1tzMV0KKwkocDApCXNobGFkZAl0ZTExPXRlMTEsMyx0ZTEJCS8vIDgvMjp0ZTErczM+PjE2CisJKHAwKQl4b3IJdDA9dDAsdGUyMgl9CS8vIDgvMDoKK3sgLm1taTsJKHAwKQlsZDQJdGUzMD1bdGUzMF0JCS8vIDgvMzp0ZTNbczJdCisJKHAwKQlzaGxhZGQJdGUxMj10ZTEyLDMsdGUxCQkvLyA4LzM6dGUxK3MwPj4xNgorCShwMCkJeG9yCXQxPXQxLHRlMzIJfTs7CS8vIDgvMToKK3sgLm1taTsJKHAwKQlsZDQJdGUxMT1bdGUxMV0JCS8vIDkvMjp0ZTFbczM+PjE2XQorCShwMCkJbGQ0CXRlMTI9W3RlMTJdCQkvLyA5LzM6dGUxW3MwPj4xNl0KKwkocDApCXhvcgl0MD10MCx0ZTAwCX07OwkvLyA5LzA6CQkhTDIgc2NoZWR1bGluZworeyAubW1pOwkocDApCXhvcgl0MT10MSx0ZTIzCQkvLyAxMFs5XS8xOgkKKwkocDApCXhvcgl0Mj10Mix0ZTIwCQkvLyAxMFs5XS8yOgorCShwMCkJeG9yCXQzPXQzLHRlMjEJfTs7CS8vIDEwWzldLzM6Cit7IC5tbWk7CShwMCkJeG9yCXQwPXQwLHRlMTMJCS8vIDExWzEwXS8wOmRvbmUhCisJKHAwKQl4b3IJdDE9dDEsdGUwMQkJLy8gMTFbMTBdLzE6CisJKHAwKQl4b3IJdDI9dDIsdGUwMgl9OzsJLy8gMTFbMTBdLzI6CSFMMiBzY2hlZHVsaW5nCit7IC5tbWk7CShwMCkJeG9yCXQzPXQzLHRlMDMJCS8vIDEyWzEwXS8zOgorCShwMTYpCWNtcC5lcQlwMCxwMTc9cjAscjAgCX07OwkvLyAxMlsxMF0vY2xlYXIgKHAxNykKK3sgLm1taTsJKHAwKQl4b3IJdDE9dDEsdGUxMAkJLy8gMTNbMTFdLzE6ZG9uZSEKKwkocDApCXhvcgl0Mj10Mix0ZTMzCQkvLyAxM1sxMV0vMjoKKwkocDApCXhvcgl0Mz10Myx0ZTMwCX0JLy8gMTNbMTFdLzM6Cit7IC5tbWk7CShwMTcpCWFkZAl0ZTA9MjA0OCx0ZTAJCS8vIDEzWzExXS8KKwkocDE3KQlhZGQJdGUxPTIwNDgrNjQtVEUxLHRlMX07OwkvLyAxM1sxMV0vCit7IC5taWI7CShwMCkJeG9yCXQyPXQyLHRlMTEJCS8vIDE0WzEyXS8yOmRvbmUhCisJKHAxNykJYWRkCXRlMj0yMDQ4KzEyOC1URTIsdGUyfQkvLyAxNFsxMl0vCit7IC5taWI7CShwMCkJeG9yCXQzPXQzLHRlMTIJCS8vIDE0WzEyXS8zOmRvbmUhCisJKHAxNykJYWRkCXRlMz0yMDQ4KzE5Mi1URTMsdGUzCS8vIDE0WzEyXS8KKwlici5jdG9wLnNwdGsJLkxkX3RvcAkJfTs7CisuTGRfZW5kOgorDAorCit7IC5tbWk7CWxkOAl0ZTEwPVt0ZTBdCQkvLyBwcmVmZXRjaCBUZDQKKwlsZDgJdGUzMz1bdGUxXQl9Cit7IC5tbWk7CWxkOAl0ZTEyPVt0ZTJdCisJbGQ4CXRlMzA9W3RlM10JfQorCit7IC5tbWk7CUxES0VZCXQwPVtyazBdLDIqS1NaCQkvLyAwLzA6cmtbMF0KKwlhbmQJdGUzMT1zMSxtYXNrZmYJCS8vIDAvMDpzMyYweGZmCisJZXh0ci51CXRlMjI9czIsOCw4CX0JLy8gMC8wOnMyPj44JjB4ZmYKK3sgLm1taTsgTERLRVkJdDE9W3JrMV0sMipLU1oJCS8vIDAvMTpya1sxXQorCWFuZAl0ZTMyPXMyLG1hc2tmZgkJLy8gMC8xOnMwJjB4ZmYKKwlzaHIudQl0ZTAwPXMwLHR3ZW50eTQJfTs7CS8vIDAvMDpzMD4+MjQKK3sgLm1taTsJTERLRVkJdDI9W3JrMF0sMipLU1oJCS8vIDEvMjpya1syXQorCWFkZAl0ZTMxPXRlMzEsdGUwCQkvLyAxLzA6dGUwK3MwPj4yNAorCWV4dHIudQl0ZTIzPXMzLDgsOAl9CS8vIDEvMTpzMz4+OCYweGZmCit7IC5tbWk7CUxES0VZCXQzPVtyazFdLDIqS1NaCQkvLyAxLzM6cmtbM10KKwlhZGQJdGUzMj10ZTMyLHRlMAkJLy8gMS8xOnRlMCtzMAorCXNoci51CXRlMDE9czEsdHdlbnR5NAl9OzsJLy8gMS8xOnMxPj4yNAoreyAubW1pOwlsZDEJdGUzMT1bdGUzMV0JCS8vIDIvMDp0ZTBbczMmMHhmZl0KKwlhZGQJdGUyMj10ZTIyLHRlMAkJLy8gMi8wOnRlMCtzMj4+OCYweGZmCisJZXh0ci51CXRlMjA9czAsOCw4CX0JLy8gMi8yOnMwPj44JjB4ZmYKK3sgLm1taTsJbGQxCXRlMzI9W3RlMzJdCQkvLyAyLzE6dGUwW3MwXQorCWFkZAl0ZTIzPXRlMjMsdGUwCQkvLyAyLzE6dGUwK3MzPj44CisJc2hyLnUJdGUwMj1zMix0d2VudHk0CX07OwkvLyAyLzI6czI+PjI0Cit7IC5tbWk7CWxkMQl0ZTIyPVt0ZTIyXQkJLy8gMy8wOnRlMFtzMj4+OF0KKwlhZGQJdGUyMD10ZTIwLHRlMAkJLy8gMy8yOnRlMCtzMD4+OAorCWV4dHIudQl0ZTIxPXMxLDgsOAl9CS8vIDMvMzpzMT4+OCYweGZmCit7IC5tbWk7CWxkMQl0ZTIzPVt0ZTIzXQkJLy8gMy8xOnRlMFtzMz4+OF0KKwlhZGQJdGUwMD10ZTAwLHRlMAkJLy8gMy8wOnRlMCtzMD4+MjQKKwlzaHIudQl0ZTAzPXMzLHR3ZW50eTQJfTs7CS8vIDMvMzpzMz4+MjQKK3sgLm1taTsJbGQxCXRlMjA9W3RlMjBdCQkvLyA0LzI6dGUwW3MwPj44XQorCWFkZAl0ZTIxPXRlMjEsdGUwCQkvLyA0LzM6dGUwK3MyCisJZXh0ci51CXRlMTM9czMsMTYsOAl9CS8vIDQvMDpzMT4+MTYmMHhmZgoreyAubW1pOwlsZDEJdGUwMD1bdGUwMF0JCS8vIDQvMDp0ZTBbczA+PjI0XQorCWFkZAl0ZTAxPXRlMDEsdGUwCQkvLyA0LzE6dGUwK3MxPj4yNAorCXNoci51CXRlMTE9czEsc2l4dGVlbgl9OzsJLy8gNC8yOnMzPj4xNgoreyAubW1pOwlsZDEJdGUyMT1bdGUyMV0JCS8vIDUvMzp0ZTBbczE+PjhdCisJYWRkCXRlMTM9dGUxMyx0ZTAJCS8vIDUvMDp0ZTArczE+PjE2CisJZXh0ci51CXRlMTA9czAsMTYsOAl9CS8vIDUvMTpzMj4+MTYmMHhmZgoreyAubW1pOwlsZDEJdGUwMT1bdGUwMV0JCS8vIDUvMTp0ZTBbczE+PjI0XQorCWFkZAl0ZTAyPXRlMDIsdGUwCQkvLyA1LzI6dGUwK3MyPj4yNAorCWFuZAl0ZTMzPXMzLG1hc2tmZgl9OzsJLy8gNS8yOnMxJjB4ZmYKK3sgLm1taTsJbGQxCXRlMTM9W3RlMTNdCQkvLyA2LzA6dGUwW3MxPj4xNl0KKwlhZGQJdGUxMD10ZTEwLHRlMAkJLy8gNi8xOnRlMCtzMj4+MTYKKwlleHRyLnUJdGUxMj1zMiwxNiw4CX0JLy8gNi8zOnMwPj4xNiYweGZmCit7IC5tbWk7CWxkMQl0ZTAyPVt0ZTAyXQkJLy8gNi8yOnRlMFtzMj4+MjRdCisJYWRkCXRlMDM9dGUwMyx0ZTAJCS8vIDYvMzp0ZTArczA+PjE2CisJYW5kCXRlMzA9czAsbWFza2ZmCX07OwkvLyA2LzM6czImMHhmZgorCit7IC5tbWk7CWxkMQl0ZTEwPVt0ZTEwXQkJLy8gNy8xOnRlMFtzMj4+MTZdCisJYWRkCXRlMzM9dGUzMyx0ZTAJCS8vIDcvMjp0ZTArczEmMHhmZgorCWRlcAl0ZTMxPXRlMjIsdGUzMSw4LDh9CS8vIDcvMDoKK3sgLm1taTsJbGQxCXRlMDM9W3RlMDNdCQkvLyA3LzM6dGUwW3MzPj4yNF0KKwlhZGQJdGUzMD10ZTMwLHRlMAkJLy8gNy8zOnRlMCtzMgorCWFuZAl0ZTExPXRlMTEsbWFza2ZmfTs7CS8vIDcvMjpzMz4+MTYmMHhmZgoreyAubW1pOwlsZDEJdGUzMz1bdGUzM10JCS8vIDgvMjp0ZTBbczFdCisJYWRkCXRlMTE9dGUxMSx0ZTAJCS8vIDgvMjp0ZTArczM+PjE2CisJZGVwCXRlMzI9dGUyMyx0ZTMyLDgsOH0JLy8gOC8xOgoreyAubW1pOwlsZDEJdGUzMD1bdGUzMF0JCS8vIDgvMzp0ZTBbczJdCisJYWRkCXRlMTI9dGUxMix0ZTAJCS8vIDgvMzp0ZTArczA+PjE2CisJc2hsCXRlMDA9dGUwMCx0d2VudHk0fTs7CS8vIDgvMDoKK3sgLm1paTsJbGQxCXRlMTE9W3RlMTFdCQkvLyA5LzI6dGUwW3MzPj4xNl0KKwlkZXAJdGUzMT10ZTEzLHRlMzEsMTYsOAkvLyA5LzA6CisJc2hsCXRlMDE9dGUwMSx0d2VudHk0fTs7CS8vIDkvMToKK3sgLm1paTsJbGQxCXRlMTI9W3RlMTJdCQkvLyAxMC8zOnRlMFtzMD4+MTZdCisJZGVwCXRlMzM9dGUyMCx0ZTMzLDgsOAkvLyAxMC8yOgorCXNobAl0ZTAyPXRlMDIsdHdlbnR5NH07OwkvLyAxMC8yOgoreyAubWlpOwl4b3IJdDA9dDAsdGUzMQkJLy8gMTEvMDoKKwlkZXAJdGUzMD10ZTIxLHRlMzAsOCw4CS8vIDExLzM6CisJc2hsCXRlMTA9dGUxMCxzaXh0ZWVufTs7CS8vIDExLzE6Cit7IC5taWk7CXhvcglyMTY9dDAsdGUwMAkJLy8gMTIvMDpkb25lIQorCWRlcAl0ZTMzPXRlMTEsdGUzMywxNiw4CS8vIDEyLzI6CisJc2hsCXRlMDM9dGUwMyx0d2VudHk0fTs7CS8vIDEyLzM6Cit7IC5tbWk7CXhvcgl0MT10MSx0ZTAxCQkvLyAxMy8xOgorCXhvcgl0Mj10Mix0ZTAyCQkvLyAxMy8yOgorCWRlcAl0ZTMwPXRlMTIsdGUzMCwxNiw4fTs7CS8vIDEzLzM6Cit7IC5tbWk7CXhvcgl0MT10MSx0ZTMyCQkvLyAxNC8xOgorCXhvcglyMjQ9dDIsdGUzMwkJLy8gMTQvMjpkb25lIQorCXhvcgl0Mz10Myx0ZTMwCX07OwkvLyAxNC8zOgoreyAubWliOwl4b3IJcjIwPXQxLHRlMTAJCS8vIDE1LzE6ZG9uZSEKKwl4b3IJcjI4PXQzLHRlMDMJCS8vIDE1LzM6ZG9uZSEKKwlici5yZXQuc3B0awliNgl9OzsKKy5lbmRwCV9pYTY0X0FFU19kZWNyeXB0IworCisvLyB2b2lkIEFFU19kZWNyeXB0IChjb25zdCB2b2lkICppbix2b2lkICpvdXQsY29uc3QgQUVTX0tFWSAqa2V5KTsKKy5nbG9iYWwJQUVTX2RlY3J5cHQjCisucHJvYwlBRVNfZGVjcnlwdCMKKy5hbGlnbgkzMgorQUVTX2RlY3J5cHQ6CisJLnByb2xvZ3VlCisJLnNhdmUJYXIucGZzLHBmc3NhdmUKK3sgLm1taTsJYWxsb2MJcGZzc2F2ZT1hci5wZnMsMywxLDEyLDAKKwlhbmQJb3V0MD0zLGluMAorCW1vdglyMz1pcAkJCX0KK3sgLm1taTsJQUREUAlpbjA9MCxpbjAKKwltb3YJbG9jMD1wc3IudW0KKwlBRERQCW91dDExPUtTWio2MCxpbjIJfTs7CS8vICZBRVNfS0VZLT5yb3VuZHMKKworeyAubW1pOwlsZDQJb3V0MTE9W291dDExXQkJCS8vIEFFU19LRVktPnJvdW5kcworCWFkZAlvdXQ4PShBRVNfVGQjLUFFU19kZWNyeXB0IykscjMJLy8gVGUwCisJLnNhdmUJcHIscHJzYXZlCisJbW92CXByc2F2ZT1wcgkJfQoreyAubW1pOwlydW0JMTw8MwkJCQkvLyBjbGVhciB1bS5hYworCS5zYXZlCWFyLmxjLGxjc2F2ZQorCW1vdglsY3NhdmU9YXIubGMJCX07OworCisJLmJvZHkKKyNpZiBkZWZpbmVkKF9IUFVYX1NPVVJDRSkJLy8gSFBVWCBpcyBiaWctZW5kaWFuLCBjdXQgMTUrMTUgY3ljbGVzLi4uCit7IC5taWI7IGNtcC5uZQlwNixwMD1vdXQwLHIwCisJYWRkCW91dDA9NCxpbjAKKyhwNikJYnIuZHBudC5tYW55CS5MZF9pX3VuYWxpZ25lZAl9OzsKKworeyAubW1pOwlsZDQJb3V0MT1baW4wXSw4CQkvLyBzMAorCWFuZAlvdXQ5PTMsaW4xCisJbW92CXR3ZW50eTQ9MjQJCX0KK3sgLm1taTsJbGQ0CW91dDM9W291dDBdLDgJCS8vIHMxCisJQUREUAlyazA9MCxpbjIKKwltb3YJc2l4dGVlbj0xNgkJfTs7Cit7IC5tbWk7CWxkNAlvdXQ1PVtpbjBdCQkvLyBzMgorCWNtcC5uZQlwNixwMD1vdXQ5LHIwCisJbW92CW1hc2tmZj0weGZmCQl9Cit7IC5tbWI7CWxkNAlvdXQ3PVtvdXQwXQkJLy8gczMKKwlBRERQCXJrMT1LU1osaW4yCisJYnIuY2FsbC5zcHRrLm1hbnkJYjY9X2lhNjRfQUVTX2RlY3J5cHQJfTs7CisKK3sgLm1pYjsJQUREUAlpbjA9NCxpbjEKKwlBRERQCWluMT0wLGluMQorKHA2KQlici5zcG50CS5MZF9vX3VuYWxpZ25lZAkJfTs7CisKK3sgLm1paTsJbW92CXBzci51bT1sb2MwCisJbW92CWFyLnBmcz1wZnNzYXZlCisJbW92CWFyLmxjPWxjc2F2ZQkJfTs7Cit7IC5tbWk7CXN0NAlbaW4xXT1yMTYsOAkJLy8gczAKKwlzdDQJW2luMF09cjIwLDgJCS8vIHMxCisJbW92CXByPXByc2F2ZSwweDFmZmZmCX07OworeyAubW1iOwlzdDQJW2luMV09cjI0CQkvLyBzMgorCXN0NAlbaW4wXT1yMjgJCS8vIHMzCisJYnIucmV0LnNwdGsubWFueQliMAl9OzsKKyNlbmRpZgorCisuYWxpZ24JMzIKKy5MZF9pX3VuYWxpZ25lZDoKK3sgLm1taTsJYWRkCW91dDA9MSxpbjAKKwlhZGQJb3V0Mj0yLGluMAorCWFkZAlvdXQ0PTMsaW4wCX07OworeyAubW1pOwlsZDEJcjE2PVtpbjBdLDQKKwlsZDEJcjE3PVtvdXQwXSw0CX0vLzs7Cit7IC5tbWk7CWxkMQlyMTg9W291dDJdLDQKKwlsZDEJb3V0MT1bb3V0NF0sNAl9OzsJLy8gczAKK3sgLm1taTsJbGQxCXIyMD1baW4wXSw0CisJbGQxCXIyMT1bb3V0MF0sNAl9Ly87OworeyAubW1pOwlsZDEJcjIyPVtvdXQyXSw0CisJbGQxCW91dDM9W291dDRdLDQJfTs7CS8vIHMxCit7IC5tbWk7CWxkMQlyMjQ9W2luMF0sNAorCWxkMQlyMjU9W291dDBdLDQJfS8vOzsKK3sgLm1taTsJbGQxCXIyNj1bb3V0Ml0sNAorCWxkMQlvdXQ1PVtvdXQ0XSw0CX07OwkvLyBzMgoreyAubW1pOwlsZDEJcjI4PVtpbjBdCisJbGQxCXIyOT1bb3V0MF0JfS8vOzsKK3sgLm1taTsJbGQxCXIzMD1bb3V0Ml0KKwlsZDEJb3V0Nz1bb3V0NF0JfTs7CS8vIHMzCisKK3sgLm1paTsKKwlkZXAJb3V0MT1yMTYsb3V0MSwyNCw4CS8vOzsKKwlkZXAJb3V0Mz1yMjAsb3V0MywyNCw4CX0vLzs7Cit7IC5taWk7CUFERFAJcmswPTAsaW4yCisJZGVwCW91dDU9cjI0LG91dDUsMjQsOAkvLzs7CisJZGVwCW91dDc9cjI4LG91dDcsMjQsOAl9OzsKK3sgLm1paTsJQUREUAlyazE9S1NaLGluMgorCWRlcAlvdXQxPXIxNyxvdXQxLDE2LDgJLy87OworCWRlcAlvdXQzPXIyMSxvdXQzLDE2LDgJfS8vOzsKK3sgLm1paTsJbW92CXR3ZW50eTQ9MjQKKwlkZXAJb3V0NT1yMjUsb3V0NSwxNiw4CS8vOzsKKwlkZXAJb3V0Nz1yMjksb3V0NywxNiw4CX07OworeyAubWlpOwltb3YJc2l4dGVlbj0xNgorCWRlcAlvdXQxPXIxOCxvdXQxLDgsOAkvLzs7CisJZGVwCW91dDM9cjIyLG91dDMsOCw4CX0vLzs7Cit7IC5taWk7CW1vdgltYXNrZmY9MHhmZgorCWRlcAlvdXQ1PXIyNixvdXQ1LDgsOAkvLzs7CisJZGVwCW91dDc9cjMwLG91dDcsOCw4CX07OworCit7IC5taWI7CWJyLmNhbGwuc3B0ay5tYW55CWI2PV9pYTY0X0FFU19kZWNyeXB0CX07OworCisuTGRfb191bmFsaWduZWQ6Cit7IC5taWk7CUFERFAJb3V0MD0wLGluMQorCWV4dHIudQlyMTc9cjE2LDgsOAkJCS8vIHMwCisJc2hyLnUJcjE5PXIxNix0d2VudHk0CQl9Ly87OworeyAubWlpOwlBRERQCW91dDE9MSxpbjEKKwlleHRyLnUJcjE4PXIxNiwxNiw4CisJc2hyLnUJcjIzPXIyMCx0d2VudHk0CQl9Ly87OwkvLyBzMQoreyAubWlpOwlBRERQCW91dDI9MixpbjEKKwlleHRyLnUJcjIxPXIyMCw4LDgKKwlzaHIudQlyMjI9cjIwLHNpeHRlZW4JCX0vLzs7Cit7IC5taWk7CUFERFAJb3V0Mz0zLGluMQorCWV4dHIudQlyMjU9cjI0LDgsOAkJCS8vIHMyCisJc2hyLnUJcjI3PXIyNCx0d2VudHk0CQl9OzsKK3sgLm1paTsJc3QxCVtvdXQzXT1yMTYsNAorCWV4dHIudQlyMjY9cjI0LDE2LDgKKwlzaHIudQlyMzE9cjI4LHR3ZW50eTQJCX0vLzs7CS8vIHMzCit7IC5taWk7CXN0MQlbb3V0Ml09cjE3LDQKKwlleHRyLnUJcjI5PXIyOCw4LDgKKwlzaHIudQlyMzA9cjI4LHNpeHRlZW4JCX0vLzs7CisKK3sgLm1taTsJc3QxCVtvdXQxXT1yMTgsNAorCXN0MQlbb3V0MF09cjE5LDQJCX07OworeyAubW1pOwlzdDEJW291dDNdPXIyMCw0CisJc3QxCVtvdXQyXT1yMjEsNAkJfS8vOzsKK3sgLm1taTsJc3QxCVtvdXQxXT1yMjIsNAorCXN0MQlbb3V0MF09cjIzLDQJCX07OworeyAubW1pOwlzdDEJW291dDNdPXIyNCw0CisJc3QxCVtvdXQyXT1yMjUsNAorCW1vdglwcj1wcnNhdmUsMHgxZmZmZgl9Ly87OworeyAubW1pOwlzdDEJW291dDFdPXIyNiw0CisJc3QxCVtvdXQwXT1yMjcsNAorCW1vdglhci5wZnM9cGZzc2F2ZQkJfTs7Cit7IC5tbWk7CXN0MQlbb3V0M109cjI4CisJc3QxCVtvdXQyXT1yMjkKKwltb3YJYXIubGM9bGNzYXZlCQl9Ly87OworeyAubW1pOwlzdDEJW291dDFdPXIzMAorCXN0MQlbb3V0MF09cjMxCQl9Cit7IC5tZmI7CW1vdglwc3IudW09bG9jMAkJCS8vIHJlc3RvcmUgdXNlciBtYXNrCisJYnIucmV0LnNwdGsubWFueQliMAl9OzsKKy5lbmRwCUFFU19kZWNyeXB0IworCisvLyBsZWF2ZSBpdCBpbiAudGV4dCBzZWdtZW50Li4uCisuYWxpZ24JNjQKKy5nbG9iYWwJQUVTX1RlIworLnR5cGUJQUVTX1RlIyxAb2JqZWN0CitBRVNfVGU6CWRhdGE0CTB4YzY2MzYzYTUsMHhjNjYzNjNhNSwgMHhmODdjN2M4NCwweGY4N2M3Yzg0CisJZGF0YTQJMHhlZTc3Nzc5OSwweGVlNzc3Nzk5LCAweGY2N2I3YjhkLDB4ZjY3YjdiOGQKKwlkYXRhNAkweGZmZjJmMjBkLDB4ZmZmMmYyMGQsIDB4ZDY2YjZiYmQsMHhkNjZiNmJiZAorCWRhdGE0CTB4ZGU2ZjZmYjEsMHhkZTZmNmZiMSwgMHg5MWM1YzU1NCwweDkxYzVjNTU0CisJZGF0YTQJMHg2MDMwMzA1MCwweDYwMzAzMDUwLCAweDAyMDEwMTAzLDB4MDIwMTAxMDMKKwlkYXRhNAkweGNlNjc2N2E5LDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QsMHg1NjJiMmI3ZAorCWRhdGE0CTB4ZTdmZWZlMTksMHhlN2ZlZmUxOSwgMHhiNWQ3ZDc2MiwweGI1ZDdkNzYyCisJZGF0YTQJMHg0ZGFiYWJlNiwweDRkYWJhYmU2LCAweGVjNzY3NjlhLDB4ZWM3Njc2OWEKKwlkYXRhNAkweDhmY2FjYTQ1LDB4OGZjYWNhNDUsIDB4MWY4MjgyOWQsMHgxZjgyODI5ZAorCWRhdGE0CTB4ODljOWM5NDAsMHg4OWM5Yzk0MCwgMHhmYTdkN2Q4NywweGZhN2Q3ZDg3CisJZGF0YTQJMHhlZmZhZmExNSwweGVmZmFmYTE1LCAweGIyNTk1OWViLDB4YjI1OTU5ZWIKKwlkYXRhNAkweDhlNDc0N2M5LDB4OGU0NzQ3YzksIDB4ZmJmMGYwMGIsMHhmYmYwZjAwYgorCWRhdGE0CTB4NDFhZGFkZWMsMHg0MWFkYWRlYywgMHhiM2Q0ZDQ2NywweGIzZDRkNDY3CisJZGF0YTQJMHg1ZmEyYTJmZCwweDVmYTJhMmZkLCAweDQ1YWZhZmVhLDB4NDVhZmFmZWEKKwlkYXRhNAkweDIzOWM5Y2JmLDB4MjM5YzljYmYsIDB4NTNhNGE0ZjcsMHg1M2E0YTRmNworCWRhdGE0CTB4ZTQ3MjcyOTYsMHhlNDcyNzI5NiwgMHg5YmMwYzA1YiwweDliYzBjMDViCisJZGF0YTQJMHg3NWI3YjdjMiwweDc1YjdiN2MyLCAweGUxZmRmZDFjLDB4ZTFmZGZkMWMKKwlkYXRhNAkweDNkOTM5M2FlLDB4M2Q5MzkzYWUsIDB4NGMyNjI2NmEsMHg0YzI2MjY2YQorCWRhdGE0CTB4NmMzNjM2NWEsMHg2YzM2MzY1YSwgMHg3ZTNmM2Y0MSwweDdlM2YzZjQxCisJZGF0YTQJMHhmNWY3ZjcwMiwweGY1ZjdmNzAyLCAweDgzY2NjYzRmLDB4ODNjY2NjNGYKKwlkYXRhNAkweDY4MzQzNDVjLDB4NjgzNDM0NWMsIDB4NTFhNWE1ZjQsMHg1MWE1YTVmNAorCWRhdGE0CTB4ZDFlNWU1MzQsMHhkMWU1ZTUzNCwgMHhmOWYxZjEwOCwweGY5ZjFmMTA4CisJZGF0YTQJMHhlMjcxNzE5MywweGUyNzE3MTkzLCAweGFiZDhkODczLDB4YWJkOGQ4NzMKKwlkYXRhNAkweDYyMzEzMTUzLDB4NjIzMTMxNTMsIDB4MmExNTE1M2YsMHgyYTE1MTUzZgorCWRhdGE0CTB4MDgwNDA0MGMsMHgwODA0MDQwYywgMHg5NWM3Yzc1MiwweDk1YzdjNzUyCisJZGF0YTQJMHg0NjIzMjM2NSwweDQ2MjMyMzY1LCAweDlkYzNjMzVlLDB4OWRjM2MzNWUKKwlkYXRhNAkweDMwMTgxODI4LDB4MzAxODE4MjgsIDB4Mzc5Njk2YTEsMHgzNzk2OTZhMQorCWRhdGE0CTB4MGEwNTA1MGYsMHgwYTA1MDUwZiwgMHgyZjlhOWFiNSwweDJmOWE5YWI1CisJZGF0YTQJMHgwZTA3MDcwOSwweDBlMDcwNzA5LCAweDI0MTIxMjM2LDB4MjQxMjEyMzYKKwlkYXRhNAkweDFiODA4MDliLDB4MWI4MDgwOWIsIDB4ZGZlMmUyM2QsMHhkZmUyZTIzZAorCWRhdGE0CTB4Y2RlYmViMjYsMHhjZGViZWIyNiwgMHg0ZTI3Mjc2OSwweDRlMjcyNzY5CisJZGF0YTQJMHg3ZmIyYjJjZCwweDdmYjJiMmNkLCAweGVhNzU3NTlmLDB4ZWE3NTc1OWYKKwlkYXRhNAkweDEyMDkwOTFiLDB4MTIwOTA5MWIsIDB4MWQ4MzgzOWUsMHgxZDgzODM5ZQorCWRhdGE0CTB4NTgyYzJjNzQsMHg1ODJjMmM3NCwgMHgzNDFhMWEyZSwweDM0MWExYTJlCisJZGF0YTQJMHgzNjFiMWIyZCwweDM2MWIxYjJkLCAweGRjNmU2ZWIyLDB4ZGM2ZTZlYjIKKwlkYXRhNAkweGI0NWE1YWVlLDB4YjQ1YTVhZWUsIDB4NWJhMGEwZmIsMHg1YmEwYTBmYgorCWRhdGE0CTB4YTQ1MjUyZjYsMHhhNDUyNTJmNiwgMHg3NjNiM2I0ZCwweDc2M2IzYjRkCisJZGF0YTQJMHhiN2Q2ZDY2MSwweGI3ZDZkNjYxLCAweDdkYjNiM2NlLDB4N2RiM2IzY2UKKwlkYXRhNAkweDUyMjkyOTdiLDB4NTIyOTI5N2IsIDB4ZGRlM2UzM2UsMHhkZGUzZTMzZQorCWRhdGE0CTB4NWUyZjJmNzEsMHg1ZTJmMmY3MSwgMHgxMzg0ODQ5NywweDEzODQ4NDk3CisJZGF0YTQJMHhhNjUzNTNmNSwweGE2NTM1M2Y1LCAweGI5ZDFkMTY4LDB4YjlkMWQxNjgKKwlkYXRhNAkweDAwMDAwMDAwLDB4MDAwMDAwMDAsIDB4YzFlZGVkMmMsMHhjMWVkZWQyYworCWRhdGE0CTB4NDAyMDIwNjAsMHg0MDIwMjA2MCwgMHhlM2ZjZmMxZiwweGUzZmNmYzFmCisJZGF0YTQJMHg3OWIxYjFjOCwweDc5YjFiMWM4LCAweGI2NWI1YmVkLDB4YjY1YjViZWQKKwlkYXRhNAkweGQ0NmE2YWJlLDB4ZDQ2YTZhYmUsIDB4OGRjYmNiNDYsMHg4ZGNiY2I0NgorCWRhdGE0CTB4NjdiZWJlZDksMHg2N2JlYmVkOSwgMHg3MjM5Mzk0YiwweDcyMzkzOTRiCisJZGF0YTQJMHg5NDRhNGFkZSwweDk0NGE0YWRlLCAweDk4NGM0Y2Q0LDB4OTg0YzRjZDQKKwlkYXRhNAkweGIwNTg1OGU4LDB4YjA1ODU4ZTgsIDB4ODVjZmNmNGEsMHg4NWNmY2Y0YQorCWRhdGE0CTB4YmJkMGQwNmIsMHhiYmQwZDA2YiwgMHhjNWVmZWYyYSwweGM1ZWZlZjJhCisJZGF0YTQJMHg0ZmFhYWFlNSwweDRmYWFhYWU1LCAweGVkZmJmYjE2LDB4ZWRmYmZiMTYKKwlkYXRhNAkweDg2NDM0M2M1LDB4ODY0MzQzYzUsIDB4OWE0ZDRkZDcsMHg5YTRkNGRkNworCWRhdGE0CTB4NjYzMzMzNTUsMHg2NjMzMzM1NSwgMHgxMTg1ODU5NCwweDExODU4NTk0CisJZGF0YTQJMHg4YTQ1NDVjZiwweDhhNDU0NWNmLCAweGU5ZjlmOTEwLDB4ZTlmOWY5MTAKKwlkYXRhNAkweDA0MDIwMjA2LDB4MDQwMjAyMDYsIDB4ZmU3ZjdmODEsMHhmZTdmN2Y4MQorCWRhdGE0CTB4YTA1MDUwZjAsMHhhMDUwNTBmMCwgMHg3ODNjM2M0NCwweDc4M2MzYzQ0CisJZGF0YTQJMHgyNTlmOWZiYSwweDI1OWY5ZmJhLCAweDRiYThhOGUzLDB4NGJhOGE4ZTMKKwlkYXRhNAkweGEyNTE1MWYzLDB4YTI1MTUxZjMsIDB4NWRhM2EzZmUsMHg1ZGEzYTNmZQorCWRhdGE0CTB4ODA0MDQwYzAsMHg4MDQwNDBjMCwgMHgwNThmOGY4YSwweDA1OGY4ZjhhCisJZGF0YTQJMHgzZjkyOTJhZCwweDNmOTI5MmFkLCAweDIxOWQ5ZGJjLDB4MjE5ZDlkYmMKKwlkYXRhNAkweDcwMzgzODQ4LDB4NzAzODM4NDgsIDB4ZjFmNWY1MDQsMHhmMWY1ZjUwNAorCWRhdGE0CTB4NjNiY2JjZGYsMHg2M2JjYmNkZiwgMHg3N2I2YjZjMSwweDc3YjZiNmMxCisJZGF0YTQJMHhhZmRhZGE3NSwweGFmZGFkYTc1LCAweDQyMjEyMTYzLDB4NDIyMTIxNjMKKwlkYXRhNAkweDIwMTAxMDMwLDB4MjAxMDEwMzAsIDB4ZTVmZmZmMWEsMHhlNWZmZmYxYQorCWRhdGE0CTB4ZmRmM2YzMGUsMHhmZGYzZjMwZSwgMHhiZmQyZDI2ZCwweGJmZDJkMjZkCisJZGF0YTQJMHg4MWNkY2Q0YywweDgxY2RjZDRjLCAweDE4MGMwYzE0LDB4MTgwYzBjMTQKKwlkYXRhNAkweDI2MTMxMzM1LDB4MjYxMzEzMzUsIDB4YzNlY2VjMmYsMHhjM2VjZWMyZgorCWRhdGE0CTB4YmU1ZjVmZTEsMHhiZTVmNWZlMSwgMHgzNTk3OTdhMiwweDM1OTc5N2EyCisJZGF0YTQJMHg4ODQ0NDRjYywweDg4NDQ0NGNjLCAweDJlMTcxNzM5LDB4MmUxNzE3MzkKKwlkYXRhNAkweDkzYzRjNDU3LDB4OTNjNGM0NTcsIDB4NTVhN2E3ZjIsMHg1NWE3YTdmMgorCWRhdGE0CTB4ZmM3ZTdlODIsMHhmYzdlN2U4MiwgMHg3YTNkM2Q0NywweDdhM2QzZDQ3CisJZGF0YTQJMHhjODY0NjRhYywweGM4NjQ2NGFjLCAweGJhNWQ1ZGU3LDB4YmE1ZDVkZTcKKwlkYXRhNAkweDMyMTkxOTJiLDB4MzIxOTE5MmIsIDB4ZTY3MzczOTUsMHhlNjczNzM5NQorCWRhdGE0CTB4YzA2MDYwYTAsMHhjMDYwNjBhMCwgMHgxOTgxODE5OCwweDE5ODE4MTk4CisJZGF0YTQJMHg5ZTRmNGZkMSwweDllNGY0ZmQxLCAweGEzZGNkYzdmLDB4YTNkY2RjN2YKKwlkYXRhNAkweDQ0MjIyMjY2LDB4NDQyMjIyNjYsIDB4NTQyYTJhN2UsMHg1NDJhMmE3ZQorCWRhdGE0CTB4M2I5MDkwYWIsMHgzYjkwOTBhYiwgMHgwYjg4ODg4MywweDBiODg4ODgzCisJZGF0YTQJMHg4YzQ2NDZjYSwweDhjNDY0NmNhLCAweGM3ZWVlZTI5LDB4YzdlZWVlMjkKKwlkYXRhNAkweDZiYjhiOGQzLDB4NmJiOGI4ZDMsIDB4MjgxNDE0M2MsMHgyODE0MTQzYworCWRhdGE0CTB4YTdkZWRlNzksMHhhN2RlZGU3OSwgMHhiYzVlNWVlMiwweGJjNWU1ZWUyCisJZGF0YTQJMHgxNjBiMGIxZCwweDE2MGIwYjFkLCAweGFkZGJkYjc2LDB4YWRkYmRiNzYKKwlkYXRhNAkweGRiZTBlMDNiLDB4ZGJlMGUwM2IsIDB4NjQzMjMyNTYsMHg2NDMyMzI1NgorCWRhdGE0CTB4NzQzYTNhNGUsMHg3NDNhM2E0ZSwgMHgxNDBhMGExZSwweDE0MGEwYTFlCisJZGF0YTQJMHg5MjQ5NDlkYiwweDkyNDk0OWRiLCAweDBjMDYwNjBhLDB4MGMwNjA2MGEKKwlkYXRhNAkweDQ4MjQyNDZjLDB4NDgyNDI0NmMsIDB4Yjg1YzVjZTQsMHhiODVjNWNlNAorCWRhdGE0CTB4OWZjMmMyNWQsMHg5ZmMyYzI1ZCwgMHhiZGQzZDM2ZSwweGJkZDNkMzZlCisJZGF0YTQJMHg0M2FjYWNlZiwweDQzYWNhY2VmLCAweGM0NjI2MmE2LDB4YzQ2MjYyYTYKKwlkYXRhNAkweDM5OTE5MWE4LDB4Mzk5MTkxYTgsIDB4MzE5NTk1YTQsMHgzMTk1OTVhNAorCWRhdGE0CTB4ZDNlNGU0MzcsMHhkM2U0ZTQzNywgMHhmMjc5Nzk4YiwweGYyNzk3OThiCisJZGF0YTQJMHhkNWU3ZTczMiwweGQ1ZTdlNzMyLCAweDhiYzhjODQzLDB4OGJjOGM4NDMKKwlkYXRhNAkweDZlMzczNzU5LDB4NmUzNzM3NTksIDB4ZGE2ZDZkYjcsMHhkYTZkNmRiNworCWRhdGE0CTB4MDE4ZDhkOGMsMHgwMThkOGQ4YywgMHhiMWQ1ZDU2NCwweGIxZDVkNTY0CisJZGF0YTQJMHg5YzRlNGVkMiwweDljNGU0ZWQyLCAweDQ5YTlhOWUwLDB4NDlhOWE5ZTAKKwlkYXRhNAkweGQ4NmM2Y2I0LDB4ZDg2YzZjYjQsIDB4YWM1NjU2ZmEsMHhhYzU2NTZmYQorCWRhdGE0CTB4ZjNmNGY0MDcsMHhmM2Y0ZjQwNywgMHhjZmVhZWEyNSwweGNmZWFlYTI1CisJZGF0YTQJMHhjYTY1NjVhZiwweGNhNjU2NWFmLCAweGY0N2E3YThlLDB4ZjQ3YTdhOGUKKwlkYXRhNAkweDQ3YWVhZWU5LDB4NDdhZWFlZTksIDB4MTAwODA4MTgsMHgxMDA4MDgxOAorCWRhdGE0CTB4NmZiYWJhZDUsMHg2ZmJhYmFkNSwgMHhmMDc4Nzg4OCwweGYwNzg3ODg4CisJZGF0YTQJMHg0YTI1MjU2ZiwweDRhMjUyNTZmLCAweDVjMmUyZTcyLDB4NWMyZTJlNzIKKwlkYXRhNAkweDM4MWMxYzI0LDB4MzgxYzFjMjQsIDB4NTdhNmE2ZjEsMHg1N2E2YTZmMQorCWRhdGE0CTB4NzNiNGI0YzcsMHg3M2I0YjRjNywgMHg5N2M2YzY1MSwweDk3YzZjNjUxCisJZGF0YTQJMHhjYmU4ZTgyMywweGNiZThlODIzLCAweGExZGRkZDdjLDB4YTFkZGRkN2MKKwlkYXRhNAkweGU4NzQ3NDljLDB4ZTg3NDc0OWMsIDB4M2UxZjFmMjEsMHgzZTFmMWYyMQorCWRhdGE0CTB4OTY0YjRiZGQsMHg5NjRiNGJkZCwgMHg2MWJkYmRkYywweDYxYmRiZGRjCisJZGF0YTQJMHgwZDhiOGI4NiwweDBkOGI4Yjg2LCAweDBmOGE4YTg1LDB4MGY4YThhODUKKwlkYXRhNAkweGUwNzA3MDkwLDB4ZTA3MDcwOTAsIDB4N2MzZTNlNDIsMHg3YzNlM2U0MgorCWRhdGE0CTB4NzFiNWI1YzQsMHg3MWI1YjVjNCwgMHhjYzY2NjZhYSwweGNjNjY2NmFhCisJZGF0YTQJMHg5MDQ4NDhkOCwweDkwNDg0OGQ4LCAweDA2MDMwMzA1LDB4MDYwMzAzMDUKKwlkYXRhNAkweGY3ZjZmNjAxLDB4ZjdmNmY2MDEsIDB4MWMwZTBlMTIsMHgxYzBlMGUxMgorCWRhdGE0CTB4YzI2MTYxYTMsMHhjMjYxNjFhMywgMHg2YTM1MzU1ZiwweDZhMzUzNTVmCisJZGF0YTQJMHhhZTU3NTdmOSwweGFlNTc1N2Y5LCAweDY5YjliOWQwLDB4NjliOWI5ZDAKKwlkYXRhNAkweDE3ODY4NjkxLDB4MTc4Njg2OTEsIDB4OTljMWMxNTgsMHg5OWMxYzE1OAorCWRhdGE0CTB4M2ExZDFkMjcsMHgzYTFkMWQyNywgMHgyNzllOWViOSwweDI3OWU5ZWI5CisJZGF0YTQJMHhkOWUxZTEzOCwweGQ5ZTFlMTM4LCAweGViZjhmODEzLDB4ZWJmOGY4MTMKKwlkYXRhNAkweDJiOTg5OGIzLDB4MmI5ODk4YjMsIDB4MjIxMTExMzMsMHgyMjExMTEzMworCWRhdGE0CTB4ZDI2OTY5YmIsMHhkMjY5NjliYiwgMHhhOWQ5ZDk3MCwweGE5ZDlkOTcwCisJZGF0YTQJMHgwNzhlOGU4OSwweDA3OGU4ZTg5LCAweDMzOTQ5NGE3LDB4MzM5NDk0YTcKKwlkYXRhNAkweDJkOWI5YmI2LDB4MmQ5YjliYjYsIDB4M2MxZTFlMjIsMHgzYzFlMWUyMgorCWRhdGE0CTB4MTU4Nzg3OTIsMHgxNTg3ODc5MiwgMHhjOWU5ZTkyMCwweGM5ZTllOTIwCisJZGF0YTQJMHg4N2NlY2U0OSwweDg3Y2VjZTQ5LCAweGFhNTU1NWZmLDB4YWE1NTU1ZmYKKwlkYXRhNAkweDUwMjgyODc4LDB4NTAyODI4NzgsIDB4YTVkZmRmN2EsMHhhNWRmZGY3YQorCWRhdGE0CTB4MDM4YzhjOGYsMHgwMzhjOGM4ZiwgMHg1OWExYTFmOCwweDU5YTFhMWY4CisJZGF0YTQJMHgwOTg5ODk4MCwweDA5ODk4OTgwLCAweDFhMGQwZDE3LDB4MWEwZDBkMTcKKwlkYXRhNAkweDY1YmZiZmRhLDB4NjViZmJmZGEsIDB4ZDdlNmU2MzEsMHhkN2U2ZTYzMQorCWRhdGE0CTB4ODQ0MjQyYzYsMHg4NDQyNDJjNiwgMHhkMDY4NjhiOCwweGQwNjg2OGI4CisJZGF0YTQJMHg4MjQxNDFjMywweDgyNDE0MWMzLCAweDI5OTk5OWIwLDB4Mjk5OTk5YjAKKwlkYXRhNAkweDVhMmQyZDc3LDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEsMHgxZTBmMGYxMQorCWRhdGE0CTB4N2JiMGIwY2IsMHg3YmIwYjBjYiwgMHhhODU0NTRmYywweGE4NTQ1NGZjCisJZGF0YTQJMHg2ZGJiYmJkNiwweDZkYmJiYmQ2LCAweDJjMTYxNjNhLDB4MmMxNjE2M2EKKy8vIFRlNDoKKwlkYXRhMQkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1CisJZGF0YTEJMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NgorCWRhdGExCTB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAKKwlkYXRhMQkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwCisJZGF0YTEJMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYworCWRhdGExCTB4MzQsIDB4YTUsIDB4ZTUsIDB4ZjEsIDB4NzEsIDB4ZDgsIDB4MzEsIDB4MTUKKwlkYXRhMQkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhCisJZGF0YTEJMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NQorCWRhdGExCTB4MDksIDB4ODMsIDB4MmMsIDB4MWEsIDB4MWIsIDB4NmUsIDB4NWEsIDB4YTAKKwlkYXRhMQkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0CisJZGF0YTEJMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YgorCWRhdGExCTB4NmEsIDB4Y2IsIDB4YmUsIDB4MzksIDB4NGEsIDB4NGMsIDB4NTgsIDB4Y2YKKwlkYXRhMQkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1CisJZGF0YTEJMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOAorCWRhdGExCTB4NTEsIDB4YTMsIDB4NDAsIDB4OGYsIDB4OTIsIDB4OWQsIDB4MzgsIDB4ZjUKKwlkYXRhMQkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyCisJZGF0YTEJMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNworCWRhdGExCTB4YzQsIDB4YTcsIDB4N2UsIDB4M2QsIDB4NjQsIDB4NWQsIDB4MTksIDB4NzMKKwlkYXRhMQkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4CisJZGF0YTEJMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYgorCWRhdGExCTB4ZTAsIDB4MzIsIDB4M2EsIDB4MGEsIDB4NDksIDB4MDYsIDB4MjQsIDB4NWMKKwlkYXRhMQkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5CisJZGF0YTEJMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOQorCWRhdGExCTB4NmMsIDB4NTYsIDB4ZjQsIDB4ZWEsIDB4NjUsIDB4N2EsIDB4YWUsIDB4MDgKKwlkYXRhMQkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2CisJZGF0YTEJMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YQorCWRhdGExCTB4NzAsIDB4M2UsIDB4YjUsIDB4NjYsIDB4NDgsIDB4MDMsIDB4ZjYsIDB4MGUKKwlkYXRhMQkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllCisJZGF0YTEJMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NAorCWRhdGExCTB4OWIsIDB4MWUsIDB4ODcsIDB4ZTksIDB4Y2UsIDB4NTUsIDB4MjgsIDB4ZGYKKwlkYXRhMQkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4CisJZGF0YTEJMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgorLnNpemUJQUVTX1RlIywyMDQ4KzI1NgkvLyBIUC1VWCBhc3NlbWJsZXIgZmFpbHMgdG8gIi4tQUVTX1RlIyIKKworLmFsaWduCTY0CisuZ2xvYmFsCUFFU19UZCMKKy50eXBlCUFFU19UZCMsQG9iamVjdAorQUVTX1RkOglkYXRhNAkweDUxZjRhNzUwLDB4NTFmNGE3NTAsIDB4N2U0MTY1NTMsMHg3ZTQxNjU1MworCWRhdGE0CTB4MWExN2E0YzMsMHgxYTE3YTRjMywgMHgzYTI3NWU5NiwweDNhMjc1ZTk2CisJZGF0YTQJMHgzYmFiNmJjYiwweDNiYWI2YmNiLCAweDFmOWQ0NWYxLDB4MWY5ZDQ1ZjEKKwlkYXRhNAkweGFjZmE1OGFiLDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMsMHg0YmUzMDM5MworCWRhdGE0CTB4MjAzMGZhNTUsMHgyMDMwZmE1NSwgMHhhZDc2NmRmNiwweGFkNzY2ZGY2CisJZGF0YTQJMHg4OGNjNzY5MSwweDg4Y2M3NjkxLCAweGY1MDI0YzI1LDB4ZjUwMjRjMjUKKwlkYXRhNAkweDRmZTVkN2ZjLDB4NGZlNWQ3ZmMsIDB4YzUyYWNiZDcsMHhjNTJhY2JkNworCWRhdGE0CTB4MjYzNTQ0ODAsMHgyNjM1NDQ4MCwgMHhiNTYyYTM4ZiwweGI1NjJhMzhmCisJZGF0YTQJMHhkZWIxNWE0OSwweGRlYjE1YTQ5LCAweDI1YmExYjY3LDB4MjViYTFiNjcKKwlkYXRhNAkweDQ1ZWEwZTk4LDB4NDVlYTBlOTgsIDB4NWRmZWMwZTEsMHg1ZGZlYzBlMQorCWRhdGE0CTB4YzMyZjc1MDIsMHhjMzJmNzUwMiwgMHg4MTRjZjAxMiwweDgxNGNmMDEyCisJZGF0YTQJMHg4ZDQ2OTdhMywweDhkNDY5N2EzLCAweDZiZDNmOWM2LDB4NmJkM2Y5YzYKKwlkYXRhNAkweDAzOGY1ZmU3LDB4MDM4ZjVmZTcsIDB4MTU5MjljOTUsMHgxNTkyOWM5NQorCWRhdGE0CTB4YmY2ZDdhZWIsMHhiZjZkN2FlYiwgMHg5NTUyNTlkYSwweDk1NTI1OWRhCisJZGF0YTQJMHhkNGJlODMyZCwweGQ0YmU4MzJkLCAweDU4NzQyMWQzLDB4NTg3NDIxZDMKKwlkYXRhNAkweDQ5ZTA2OTI5LDB4NDllMDY5MjksIDB4OGVjOWM4NDQsMHg4ZWM5Yzg0NAorCWRhdGE0CTB4NzVjMjg5NmEsMHg3NWMyODk2YSwgMHhmNDhlNzk3OCwweGY0OGU3OTc4CisJZGF0YTQJMHg5OTU4M2U2YiwweDk5NTgzZTZiLCAweDI3Yjk3MWRkLDB4MjdiOTcxZGQKKwlkYXRhNAkweGJlZTE0ZmI2LDB4YmVlMTRmYjYsIDB4ZjA4OGFkMTcsMHhmMDg4YWQxNworCWRhdGE0CTB4YzkyMGFjNjYsMHhjOTIwYWM2NiwgMHg3ZGNlM2FiNCwweDdkY2UzYWI0CisJZGF0YTQJMHg2M2RmNGExOCwweDYzZGY0YTE4LCAweGU1MWEzMTgyLDB4ZTUxYTMxODIKKwlkYXRhNAkweDk3NTEzMzYwLDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUsMHg2MjUzN2Y0NQorCWRhdGE0CTB4YjE2NDc3ZTAsMHhiMTY0NzdlMCwgMHhiYjZiYWU4NCwweGJiNmJhZTg0CisJZGF0YTQJMHhmZTgxYTAxYywweGZlODFhMDFjLCAweGY5MDgyYjk0LDB4ZjkwODJiOTQKKwlkYXRhNAkweDcwNDg2ODU4LDB4NzA0ODY4NTgsIDB4OGY0NWZkMTksMHg4ZjQ1ZmQxOQorCWRhdGE0CTB4OTRkZTZjODcsMHg5NGRlNmM4NywgMHg1MjdiZjhiNywweDUyN2JmOGI3CisJZGF0YTQJMHhhYjczZDMyMywweGFiNzNkMzIzLCAweDcyNGIwMmUyLDB4NzI0YjAyZTIKKwlkYXRhNAkweGUzMWY4ZjU3LDB4ZTMxZjhmNTcsIDB4NjY1NWFiMmEsMHg2NjU1YWIyYQorCWRhdGE0CTB4YjJlYjI4MDcsMHhiMmViMjgwNywgMHgyZmI1YzIwMywweDJmYjVjMjAzCisJZGF0YTQJMHg4NmM1N2I5YSwweDg2YzU3YjlhLCAweGQzMzcwOGE1LDB4ZDMzNzA4YTUKKwlkYXRhNAkweDMwMjg4N2YyLDB4MzAyODg3ZjIsIDB4MjNiZmE1YjIsMHgyM2JmYTViMgorCWRhdGE0CTB4MDIwMzZhYmEsMHgwMjAzNmFiYSwgMHhlZDE2ODI1YywweGVkMTY4MjVjCisJZGF0YTQJMHg4YWNmMWMyYiwweDhhY2YxYzJiLCAweGE3NzliNDkyLDB4YTc3OWI0OTIKKwlkYXRhNAkweGYzMDdmMmYwLDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEsMHg0ZTY5ZTJhMQorCWRhdGE0CTB4NjVkYWY0Y2QsMHg2NWRhZjRjZCwgMHgwNjA1YmVkNSwweDA2MDViZWQ1CisJZGF0YTQJMHhkMTM0NjIxZiwweGQxMzQ2MjFmLCAweGM0YTZmZThhLDB4YzRhNmZlOGEKKwlkYXRhNAkweDM0MmU1MzlkLDB4MzQyZTUzOWQsIDB4YTJmMzU1YTAsMHhhMmYzNTVhMAorCWRhdGE0CTB4MDU4YWUxMzIsMHgwNThhZTEzMiwgMHhhNGY2ZWI3NSwweGE0ZjZlYjc1CisJZGF0YTQJMHgwYjgzZWMzOSwweDBiODNlYzM5LCAweDQwNjBlZmFhLDB4NDA2MGVmYWEKKwlkYXRhNAkweDVlNzE5ZjA2LDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEsMHhiZDZlMTA1MQorCWRhdGE0CTB4M2UyMThhZjksMHgzZTIxOGFmOSwgMHg5NmRkMDYzZCwweDk2ZGQwNjNkCisJZGF0YTQJMHhkZDNlMDVhZSwweGRkM2UwNWFlLCAweDRkZTZiZDQ2LDB4NGRlNmJkNDYKKwlkYXRhNAkweDkxNTQ4ZGI1LDB4OTE1NDhkYjUsIDB4NzFjNDVkMDUsMHg3MWM0NWQwNQorCWRhdGE0CTB4MDQwNmQ0NmYsMHgwNDA2ZDQ2ZiwgMHg2MDUwMTVmZiwweDYwNTAxNWZmCisJZGF0YTQJMHgxOTk4ZmIyNCwweDE5OThmYjI0LCAweGQ2YmRlOTk3LDB4ZDZiZGU5OTcKKwlkYXRhNAkweDg5NDA0M2NjLDB4ODk0MDQzY2MsIDB4NjdkOTllNzcsMHg2N2Q5OWU3NworCWRhdGE0CTB4YjBlODQyYmQsMHhiMGU4NDJiZCwgMHgwNzg5OGI4OCwweDA3ODk4Yjg4CisJZGF0YTQJMHhlNzE5NWIzOCwweGU3MTk1YjM4LCAweDc5YzhlZWRiLDB4NzljOGVlZGIKKwlkYXRhNAkweGExN2MwYTQ3LDB4YTE3YzBhNDcsIDB4N2M0MjBmZTksMHg3YzQyMGZlOQorCWRhdGE0CTB4Zjg4NDFlYzksMHhmODg0MWVjOSwgMHgwMDAwMDAwMCwweDAwMDAwMDAwCisJZGF0YTQJMHgwOTgwODY4MywweDA5ODA4NjgzLCAweDMyMmJlZDQ4LDB4MzIyYmVkNDgKKwlkYXRhNAkweDFlMTE3MGFjLDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUsMHg2YzVhNzI0ZQorCWRhdGE0CTB4ZmQwZWZmZmIsMHhmZDBlZmZmYiwgMHgwZjg1Mzg1NiwweDBmODUzODU2CisJZGF0YTQJMHgzZGFlZDUxZSwweDNkYWVkNTFlLCAweDM2MmQzOTI3LDB4MzYyZDM5MjcKKwlkYXRhNAkweDBhMGZkOTY0LDB4MGEwZmQ5NjQsIDB4Njg1Y2E2MjEsMHg2ODVjYTYyMQorCWRhdGE0CTB4OWI1YjU0ZDEsMHg5YjViNTRkMSwgMHgyNDM2MmUzYSwweDI0MzYyZTNhCisJZGF0YTQJMHgwYzBhNjdiMSwweDBjMGE2N2IxLCAweDkzNTdlNzBmLDB4OTM1N2U3MGYKKwlkYXRhNAkweGI0ZWU5NmQyLDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUsMHgxYjliOTE5ZQorCWRhdGE0CTB4ODBjMGM1NGYsMHg4MGMwYzU0ZiwgMHg2MWRjMjBhMiwweDYxZGMyMGEyCisJZGF0YTQJMHg1YTc3NGI2OSwweDVhNzc0YjY5LCAweDFjMTIxYTE2LDB4MWMxMjFhMTYKKwlkYXRhNAkweGUyOTNiYTBhLDB4ZTI5M2JhMGEsIDB4YzBhMDJhZTUsMHhjMGEwMmFlNQorCWRhdGE0CTB4M2MyMmUwNDMsMHgzYzIyZTA0MywgMHgxMjFiMTcxZCwweDEyMWIxNzFkCisJZGF0YTQJMHgwZTA5MGQwYiwweDBlMDkwZDBiLCAweGYyOGJjN2FkLDB4ZjI4YmM3YWQKKwlkYXRhNAkweDJkYjZhOGI5LDB4MmRiNmE4YjksIDB4MTQxZWE5YzgsMHgxNDFlYTljOAorCWRhdGE0CTB4NTdmMTE5ODUsMHg1N2YxMTk4NSwgMHhhZjc1MDc0YywweGFmNzUwNzRjCisJZGF0YTQJMHhlZTk5ZGRiYiwweGVlOTlkZGJiLCAweGEzN2Y2MGZkLDB4YTM3ZjYwZmQKKwlkYXRhNAkweGY3MDEyNjlmLDB4ZjcwMTI2OWYsIDB4NWM3MmY1YmMsMHg1YzcyZjViYworCWRhdGE0CTB4NDQ2NjNiYzUsMHg0NDY2M2JjNSwgMHg1YmZiN2UzNCwweDViZmI3ZTM0CisJZGF0YTQJMHg4YjQzMjk3NiwweDhiNDMyOTc2LCAweGNiMjNjNmRjLDB4Y2IyM2M2ZGMKKwlkYXRhNAkweGI2ZWRmYzY4LDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMsMHhiOGU0ZjE2MworCWRhdGE0CTB4ZDczMWRjY2EsMHhkNzMxZGNjYSwgMHg0MjYzODUxMCwweDQyNjM4NTEwCisJZGF0YTQJMHgxMzk3MjI0MCwweDEzOTcyMjQwLCAweDg0YzYxMTIwLDB4ODRjNjExMjAKKwlkYXRhNAkweDg1NGEyNDdkLDB4ODU0YTI0N2QsIDB4ZDJiYjNkZjgsMHhkMmJiM2RmOAorCWRhdGE0CTB4YWVmOTMyMTEsMHhhZWY5MzIxMSwgMHhjNzI5YTE2ZCwweGM3MjlhMTZkCisJZGF0YTQJMHgxZDllMmY0YiwweDFkOWUyZjRiLCAweGRjYjIzMGYzLDB4ZGNiMjMwZjMKKwlkYXRhNAkweDBkODY1MmVjLDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAsMHg3N2MxZTNkMAorCWRhdGE0CTB4MmJiMzE2NmMsMHgyYmIzMTY2YywgMHhhOTcwYjk5OSwweGE5NzBiOTk5CisJZGF0YTQJMHgxMTk0NDhmYSwweDExOTQ0OGZhLCAweDQ3ZTk2NDIyLDB4NDdlOTY0MjIKKwlkYXRhNAkweGE4ZmM4Y2M0LDB4YThmYzhjYzQsIDB4YTBmMDNmMWEsMHhhMGYwM2YxYQorCWRhdGE0CTB4NTY3ZDJjZDgsMHg1NjdkMmNkOCwgMHgyMjMzOTBlZiwweDIyMzM5MGVmCisJZGF0YTQJMHg4NzQ5NGVjNywweDg3NDk0ZWM3LCAweGQ5MzhkMWMxLDB4ZDkzOGQxYzEKKwlkYXRhNAkweDhjY2FhMmZlLDB4OGNjYWEyZmUsIDB4OThkNDBiMzYsMHg5OGQ0MGIzNgorCWRhdGE0CTB4YTZmNTgxY2YsMHhhNmY1ODFjZiwgMHhhNTdhZGUyOCwweGE1N2FkZTI4CisJZGF0YTQJMHhkYWI3OGUyNiwweGRhYjc4ZTI2LCAweDNmYWRiZmE0LDB4M2ZhZGJmYTQKKwlkYXRhNAkweDJjM2E5ZGU0LDB4MmMzYTlkZTQsIDB4NTA3ODkyMGQsMHg1MDc4OTIwZAorCWRhdGE0CTB4NmE1ZmNjOWIsMHg2YTVmY2M5YiwgMHg1NDdlNDY2MiwweDU0N2U0NjYyCisJZGF0YTQJMHhmNjhkMTNjMiwweGY2OGQxM2MyLCAweDkwZDhiOGU4LDB4OTBkOGI4ZTgKKwlkYXRhNAkweDJlMzlmNzVlLDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUsMHg4MmMzYWZmNQorCWRhdGE0CTB4OWY1ZDgwYmUsMHg5ZjVkODBiZSwgMHg2OWQwOTM3YywweDY5ZDA5MzdjCisJZGF0YTQJMHg2ZmQ1MmRhOSwweDZmZDUyZGE5LCAweGNmMjUxMmIzLDB4Y2YyNTEyYjMKKwlkYXRhNAkweGM4YWM5OTNiLDB4YzhhYzk5M2IsIDB4MTAxODdkYTcsMHgxMDE4N2RhNworCWRhdGE0CTB4ZTg5YzYzNmUsMHhlODljNjM2ZSwgMHhkYjNiYmI3YiwweGRiM2JiYjdiCisJZGF0YTQJMHhjZDI2NzgwOSwweGNkMjY3ODA5LCAweDZlNTkxOGY0LDB4NmU1OTE4ZjQKKwlkYXRhNAkweGVjOWFiNzAxLDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgsMHg4MzRmOWFhOAorCWRhdGE0CTB4ZTY5NTZlNjUsMHhlNjk1NmU2NSwgMHhhYWZmZTY3ZSwweGFhZmZlNjdlCisJZGF0YTQJMHgyMWJjY2YwOCwweDIxYmNjZjA4LCAweGVmMTVlOGU2LDB4ZWYxNWU4ZTYKKwlkYXRhNAkweGJhZTc5YmQ5LDB4YmFlNzliZDksIDB4NGE2ZjM2Y2UsMHg0YTZmMzZjZQorCWRhdGE0CTB4ZWE5ZjA5ZDQsMHhlYTlmMDlkNCwgMHgyOWIwN2NkNiwweDI5YjA3Y2Q2CisJZGF0YTQJMHgzMWE0YjJhZiwweDMxYTRiMmFmLCAweDJhM2YyMzMxLDB4MmEzZjIzMzEKKwlkYXRhNAkweGM2YTU5NDMwLDB4YzZhNTk0MzAsIDB4MzVhMjY2YzAsMHgzNWEyNjZjMAorCWRhdGE0CTB4NzQ0ZWJjMzcsMHg3NDRlYmMzNywgMHhmYzgyY2FhNiwweGZjODJjYWE2CisJZGF0YTQJMHhlMDkwZDBiMCwweGUwOTBkMGIwLCAweDMzYTdkODE1LDB4MzNhN2Q4MTUKKwlkYXRhNAkweGYxMDQ5ODRhLDB4ZjEwNDk4NGEsIDB4NDFlY2RhZjcsMHg0MWVjZGFmNworCWRhdGE0CTB4N2ZjZDUwMGUsMHg3ZmNkNTAwZSwgMHgxNzkxZjYyZiwweDE3OTFmNjJmCisJZGF0YTQJMHg3NjRkZDY4ZCwweDc2NGRkNjhkLCAweDQzZWZiMDRkLDB4NDNlZmIwNGQKKwlkYXRhNAkweGNjYWE0ZDU0LDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYsMHhlNDk2MDRkZgorCWRhdGE0CTB4OWVkMWI1ZTMsMHg5ZWQxYjVlMywgMHg0YzZhODgxYiwweDRjNmE4ODFiCisJZGF0YTQJMHhjMTJjMWZiOCwweGMxMmMxZmI4LCAweDQ2NjU1MTdmLDB4NDY2NTUxN2YKKwlkYXRhNAkweDlkNWVlYTA0LDB4OWQ1ZWVhMDQsIDB4MDE4YzM1NWQsMHgwMThjMzU1ZAorCWRhdGE0CTB4ZmE4Nzc0NzMsMHhmYTg3NzQ3MywgMHhmYjBiNDEyZSwweGZiMGI0MTJlCisJZGF0YTQJMHhiMzY3MWQ1YSwweGIzNjcxZDVhLCAweDkyZGJkMjUyLDB4OTJkYmQyNTIKKwlkYXRhNAkweGU5MTA1NjMzLDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMsMHg2ZGQ2NDcxMworCWRhdGE0CTB4OWFkNzYxOGMsMHg5YWQ3NjE4YywgMHgzN2ExMGM3YSwweDM3YTEwYzdhCisJZGF0YTQJMHg1OWY4MTQ4ZSwweDU5ZjgxNDhlLCAweGViMTMzYzg5LDB4ZWIxMzNjODkKKwlkYXRhNAkweGNlYTkyN2VlLDB4Y2VhOTI3ZWUsIDB4Yjc2MWM5MzUsMHhiNzYxYzkzNQorCWRhdGE0CTB4ZTExY2U1ZWQsMHhlMTFjZTVlZCwgMHg3YTQ3YjEzYywweDdhNDdiMTNjCisJZGF0YTQJMHg5Y2QyZGY1OSwweDljZDJkZjU5LCAweDU1ZjI3MzNmLDB4NTVmMjczM2YKKwlkYXRhNAkweDE4MTRjZTc5LDB4MTgxNGNlNzksIDB4NzNjNzM3YmYsMHg3M2M3MzdiZgorCWRhdGE0CTB4NTNmN2NkZWEsMHg1M2Y3Y2RlYSwgMHg1ZmZkYWE1YiwweDVmZmRhYTViCisJZGF0YTQJMHhkZjNkNmYxNCwweGRmM2Q2ZjE0LCAweDc4NDRkYjg2LDB4Nzg0NGRiODYKKwlkYXRhNAkweGNhYWZmMzgxLDB4Y2FhZmYzODEsIDB4Yjk2OGM0M2UsMHhiOTY4YzQzZQorCWRhdGE0CTB4MzgyNDM0MmMsMHgzODI0MzQyYywgMHhjMmEzNDA1ZiwweGMyYTM0MDVmCisJZGF0YTQJMHgxNjFkYzM3MiwweDE2MWRjMzcyLCAweGJjZTIyNTBjLDB4YmNlMjI1MGMKKwlkYXRhNAkweDI4M2M0OThiLDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEsMHhmZjBkOTU0MQorCWRhdGE0CTB4MzlhODAxNzEsMHgzOWE4MDE3MSwgMHgwODBjYjNkZSwweDA4MGNiM2RlCisJZGF0YTQJMHhkOGI0ZTQ5YywweGQ4YjRlNDljLCAweDY0NTZjMTkwLDB4NjQ1NmMxOTAKKwlkYXRhNAkweDdiY2I4NDYxLDB4N2JjYjg0NjEsIDB4ZDUzMmI2NzAsMHhkNTMyYjY3MAorCWRhdGE0CTB4NDg2YzVjNzQsMHg0ODZjNWM3NCwgMHhkMGI4NTc0MiwweGQwYjg1NzQyCisvLyBUZDQ6CisJZGF0YTEJMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOAorCWRhdGExCTB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIKKwlkYXRhMQkweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3CisJZGF0YTEJMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYgorCWRhdGExCTB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QKKwlkYXRhMQkweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlCisJZGF0YTEJMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMgorCWRhdGExCTB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUKKwlkYXRhMQkweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2CisJZGF0YTEJMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5MgorCWRhdGExCTB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEKKwlkYXRhMQkweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0CisJZGF0YTEJMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYQorCWRhdGExCTB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYKKwlkYXRhMQkweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyCisJZGF0YTEJMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2YgorCWRhdGExCTB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEKKwlkYXRhMQkweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczCisJZGF0YTEJMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NQorCWRhdGExCTB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUKKwlkYXRhMQkweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5CisJZGF0YTEJMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYgorCWRhdGExCTB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAKKwlkYXRhMQkweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0CisJZGF0YTEJMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMQorCWRhdGExCTB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYKKwlkYXRhMQkweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkCisJZGF0YTEJMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZgorCWRhdGExCTB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAKKwlkYXRhMQkweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxCisJZGF0YTEJMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNgorCWRhdGExCTB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QKKy5zaXplCUFFU19UZCMsMjA0OCsyNTYJLy8gSFAtVVggYXNzZW1ibGVyIGZhaWxzIHRvICIuLUFFU19UZCMiCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMtcHBjLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLXBwYy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODJjNWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLXBwYy5wbApAQCAtMCwwICsxLDExODkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBOZWVkcyBtb3JlIHdvcms6IGtleSBzZXR1cCwgcGFnZSBib3VuZGFyaWVzLCBDQkMgcm91dGluZS4uLgorIworIyBwcGNfQUVTX1tlbnxkZV1jcnlwdCBwZXJmb3JtIGF0IDE4IGN5Y2xlcyBwZXIgYnl0ZSBwcm9jZXNzZWQgd2l0aAorIyAxMjgtYml0IGtleSwgd2hpY2ggaXMgfjQwJSBiZXR0ZXIgdGhhbiA2NC1iaXQgY29kZSBnZW5lcmF0ZWQgYnkgZ2NjCisjIDQuMC4gQnV0IHRoZXNlIGFyZSBub3QgdGhlIG9uZXMgY3VycmVudGx5IHVzZWQhIFRoZWlyICJjb21wYWN0IgorIyBjb3VudGVycGFydHMgYXJlLCBmb3Igc2VjdXJpdHkgcmVhc29uLiBwcGNfQUVTX2VuY3J5cHRfY29tcGFjdCBydW5zCisjIGF0IDEvMiBvZiBwcGNfQUVTX2VuY3J5cHQgc3BlZWQsIHdoaWxlIHBwY19BRVNfZGVjcnlwdF9jb21wYWN0IC0KKyMgYXQgMS8zIG9mIHBwY19BRVNfZGVjcnlwdC4KKworIyBGZWJydWFyeSAyMDEwCisjCisjIFJlc2NoZWR1bGluZyBpbnN0cnVjdGlvbnMgdG8gZmF2b3VyIFBvd2VyNiBwaXBlbGluZSBnaXZlcyAxMCUKKyMgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb24gdGhlIHBsYXRmcm9tIGluIHF1ZXN0aW9uIChhbmQgbWFyZ2luYWwKKyMgaW1wcm92ZW1lbnQgZXZlbiBvbiBvdGhlcnMpLiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBQb3dlcjYgZmFpbHMKKyMgdG8gcHJvY2VzcyBieXRlIGluIDE4IGN5Y2xlcywgb25seSBpbiAyMywgYmVjYXVzZSBpdCBmYWlscyB0byBpc3N1ZQorIyA0IGxvYWQgaW5zdHJ1Y3Rpb25zIGluIHR3byBjeWNsZXMsIG9ubHkgaW4gMy4gQXMgcmVzdWx0IG5vbi1jb21wYWN0CisjIGJsb2NrIHN1YnJvdXRpbmVzIGFyZSAyNSUgc2xvd2VyIHRoYW4gb25lIHdvdWxkIGV4cGVjdC4gQ29tcGFjdAorIyBmdW5jdGlvbnMgc2NhbGUgYmV0dGVyLCBiZWNhdXNlIHRoZXkgaGF2ZSBwdXJlIGNvbXB1dGF0aW9uYWwgcGFydCwKKyMgd2hpY2ggc2NhbGVzIHBlcmZlY3RseSB3aXRoIGNsb2NrIGZyZXF1ZW5jeS4gVG8gYmUgc3BlY2lmaWMKKyMgcHBjX0FFU19lbmNyeXB0X2NvbXBhY3Qgb3BlcmF0ZXMgYXQgNDIgY3ljbGVzIHBlciBieXRlLCB3aGlsZQorIyBwcGNfQUVTX2RlY3J5cHRfY29tcGFjdCAtIGF0IDU1IChpbiA2NC1iaXQgYnVpbGQpLgorCiskZmxhdm91ciA9IHNoaWZ0OworCitpZiAoJGZsYXZvdXIgPX4gLzY0LykgeworCSRTSVpFX1QJPTg7CisJJFNUVQk9InN0ZHUiOworCSRQT1AJPSJsZCI7CisJJFBVU0gJPSJzdGQiOworfSBlbHNpZiAoJGZsYXZvdXIgPX4gLzMyLykgeworCSRTSVpFX1QJPTQ7CisJJFNUVQk9InN0d3UiOworCSRQT1AJPSJsd3oiOworCSRQVVNICT0ic3R3IjsKK30gZWxzZSB7IGRpZSAibm9uc2Vuc2UgJGZsYXZvdXIiOyB9CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9cHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3BwYy14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHBwYy14bGF0ZS5wbCI7CisKK29wZW4gU1RET1VULCJ8ICReWCAkeGxhdGUgJGZsYXZvdXIgIi5zaGlmdCB8fCBkaWUgImNhbid0IGNhbGwgJHhsYXRlOiAkISI7CisKKyRGUkFNRT0zMiokU0laRV9UOworCitzdWIgX2RhdGFfd29yZCgpCit7IG15ICRpOworICAgIHdoaWxlKGRlZmluZWQoJGk9c2hpZnQpKSB7ICRjb2RlLj1zcHJpbnRmIlx0LmxvbmdcdDB4JTA4eCwweCUwOHhcbiIsJGksJGk7IH0KK30KKworJHNwPSJyMSI7CiskdG9jPSJyMiI7CiskaW5wPSJyMyI7Ciskb3V0PSJyNCI7Ciska2V5PSJyNSI7CisKKyRUYmwwPSJyMyI7CiskVGJsMT0icjYiOworJFRibDI9InI3IjsKKyRUYmwzPSJyMiI7CisKKyRzMD0icjgiOworJHMxPSJyOSI7CiskczI9InIxMCI7CiskczM9InIxMSI7CisKKyR0MD0icjEyIjsKKyR0MT0icjEzIjsKKyR0Mj0icjE0IjsKKyR0Mz0icjE1IjsKKworJGFjYzAwPSJyMTYiOworJGFjYzAxPSJyMTciOworJGFjYzAyPSJyMTgiOworJGFjYzAzPSJyMTkiOworCiskYWNjMDQ9InIyMCI7CiskYWNjMDU9InIyMSI7CiskYWNjMDY9InIyMiI7CiskYWNjMDc9InIyMyI7CisKKyRhY2MwOD0icjI0IjsKKyRhY2MwOT0icjI1IjsKKyRhY2MxMD0icjI2IjsKKyRhY2MxMT0icjI3IjsKKworJGFjYzEyPSJyMjgiOworJGFjYzEzPSJyMjkiOworJGFjYzE0PSJyMzAiOworJGFjYzE1PSJyMzEiOworCisjIHN0YXkgYXdheSBmcm9tIFRMUyBwb2ludGVyCitpZiAoJFNJWkVfVD09OCkJeyBkaWUgaWYgKCR0MSBuZSAicjEzIik7ICAkdDE9InIwIjsJCX0KK2Vsc2UJCXsgZGllIGlmICgkVGJsMyBuZSAicjIiKTsgJFRibDM9JHQwOyAkdDA9InIwIjsJfQorJG1hc2s4MD0kVGJsMjsKKyRtYXNrMWI9JFRibDM7CisKKyRjb2RlLj08PF9fXzsKKy5tYWNoaW5lCSJhbnkiCisudGV4dAorCisuYWxpZ24JNworTEFFU19UZToKKwltZmxyCXIwCisJYmNsCTIwLDMxLFwkKzQKKwltZmxyCSRUYmwwCTsgICAgdnZ2dnYgImRpc3RhbmNlIiBiZXR3ZWVuIC4gYW5kIDFzdCBkYXRhIGVudHJ5CisJYWRkaQkkVGJsMCwkVGJsMCxgMTI4LThgCisJbXRscglyMAorCWJscgorCS5zcGFjZQlgMzItMjRgCitMQUVTX1RkOgorCW1mbHIJcjAKKwliY2wJMjAsMzEsXCQrNAorCW1mbHIJJFRibDAJOyAgICB2dnZ2dnZ2diAiZGlzdGFuY2UiIGJldHdlZW4gLiBhbmQgMXN0IGRhdGEgZW50cnkKKwlhZGRpCSRUYmwwLCRUYmwwLGAxMjgtOC0zMisyMDQ4KzI1NmAKKwltdGxyCXIwCisJYmxyCisJLnNwYWNlCWAxMjgtMzItMjRgCitfX18KKyZfZGF0YV93b3JkKAorCTB4YzY2MzYzYTUsIDB4Zjg3YzdjODQsIDB4ZWU3Nzc3OTksIDB4ZjY3YjdiOGQsCisJMHhmZmYyZjIwZCwgMHhkNjZiNmJiZCwgMHhkZTZmNmZiMSwgMHg5MWM1YzU1NCwKKwkweDYwMzAzMDUwLCAweDAyMDEwMTAzLCAweGNlNjc2N2E5LCAweDU2MmIyYjdkLAorCTB4ZTdmZWZlMTksIDB4YjVkN2Q3NjIsIDB4NGRhYmFiZTYsIDB4ZWM3Njc2OWEsCisJMHg4ZmNhY2E0NSwgMHgxZjgyODI5ZCwgMHg4OWM5Yzk0MCwgMHhmYTdkN2Q4NywKKwkweGVmZmFmYTE1LCAweGIyNTk1OWViLCAweDhlNDc0N2M5LCAweGZiZjBmMDBiLAorCTB4NDFhZGFkZWMsIDB4YjNkNGQ0NjcsIDB4NWZhMmEyZmQsIDB4NDVhZmFmZWEsCisJMHgyMzljOWNiZiwgMHg1M2E0YTRmNywgMHhlNDcyNzI5NiwgMHg5YmMwYzA1YiwKKwkweDc1YjdiN2MyLCAweGUxZmRmZDFjLCAweDNkOTM5M2FlLCAweDRjMjYyNjZhLAorCTB4NmMzNjM2NWEsIDB4N2UzZjNmNDEsIDB4ZjVmN2Y3MDIsIDB4ODNjY2NjNGYsCisJMHg2ODM0MzQ1YywgMHg1MWE1YTVmNCwgMHhkMWU1ZTUzNCwgMHhmOWYxZjEwOCwKKwkweGUyNzE3MTkzLCAweGFiZDhkODczLCAweDYyMzEzMTUzLCAweDJhMTUxNTNmLAorCTB4MDgwNDA0MGMsIDB4OTVjN2M3NTIsIDB4NDYyMzIzNjUsIDB4OWRjM2MzNWUsCisJMHgzMDE4MTgyOCwgMHgzNzk2OTZhMSwgMHgwYTA1MDUwZiwgMHgyZjlhOWFiNSwKKwkweDBlMDcwNzA5LCAweDI0MTIxMjM2LCAweDFiODA4MDliLCAweGRmZTJlMjNkLAorCTB4Y2RlYmViMjYsIDB4NGUyNzI3NjksIDB4N2ZiMmIyY2QsIDB4ZWE3NTc1OWYsCisJMHgxMjA5MDkxYiwgMHgxZDgzODM5ZSwgMHg1ODJjMmM3NCwgMHgzNDFhMWEyZSwKKwkweDM2MWIxYjJkLCAweGRjNmU2ZWIyLCAweGI0NWE1YWVlLCAweDViYTBhMGZiLAorCTB4YTQ1MjUyZjYsIDB4NzYzYjNiNGQsIDB4YjdkNmQ2NjEsIDB4N2RiM2IzY2UsCisJMHg1MjI5Mjk3YiwgMHhkZGUzZTMzZSwgMHg1ZTJmMmY3MSwgMHgxMzg0ODQ5NywKKwkweGE2NTM1M2Y1LCAweGI5ZDFkMTY4LCAweDAwMDAwMDAwLCAweGMxZWRlZDJjLAorCTB4NDAyMDIwNjAsIDB4ZTNmY2ZjMWYsIDB4NzliMWIxYzgsIDB4YjY1YjViZWQsCisJMHhkNDZhNmFiZSwgMHg4ZGNiY2I0NiwgMHg2N2JlYmVkOSwgMHg3MjM5Mzk0YiwKKwkweDk0NGE0YWRlLCAweDk4NGM0Y2Q0LCAweGIwNTg1OGU4LCAweDg1Y2ZjZjRhLAorCTB4YmJkMGQwNmIsIDB4YzVlZmVmMmEsIDB4NGZhYWFhZTUsIDB4ZWRmYmZiMTYsCisJMHg4NjQzNDNjNSwgMHg5YTRkNGRkNywgMHg2NjMzMzM1NSwgMHgxMTg1ODU5NCwKKwkweDhhNDU0NWNmLCAweGU5ZjlmOTEwLCAweDA0MDIwMjA2LCAweGZlN2Y3ZjgxLAorCTB4YTA1MDUwZjAsIDB4NzgzYzNjNDQsIDB4MjU5ZjlmYmEsIDB4NGJhOGE4ZTMsCisJMHhhMjUxNTFmMywgMHg1ZGEzYTNmZSwgMHg4MDQwNDBjMCwgMHgwNThmOGY4YSwKKwkweDNmOTI5MmFkLCAweDIxOWQ5ZGJjLCAweDcwMzgzODQ4LCAweGYxZjVmNTA0LAorCTB4NjNiY2JjZGYsIDB4NzdiNmI2YzEsIDB4YWZkYWRhNzUsIDB4NDIyMTIxNjMsCisJMHgyMDEwMTAzMCwgMHhlNWZmZmYxYSwgMHhmZGYzZjMwZSwgMHhiZmQyZDI2ZCwKKwkweDgxY2RjZDRjLCAweDE4MGMwYzE0LCAweDI2MTMxMzM1LCAweGMzZWNlYzJmLAorCTB4YmU1ZjVmZTEsIDB4MzU5Nzk3YTIsIDB4ODg0NDQ0Y2MsIDB4MmUxNzE3MzksCisJMHg5M2M0YzQ1NywgMHg1NWE3YTdmMiwgMHhmYzdlN2U4MiwgMHg3YTNkM2Q0NywKKwkweGM4NjQ2NGFjLCAweGJhNWQ1ZGU3LCAweDMyMTkxOTJiLCAweGU2NzM3Mzk1LAorCTB4YzA2MDYwYTAsIDB4MTk4MTgxOTgsIDB4OWU0ZjRmZDEsIDB4YTNkY2RjN2YsCisJMHg0NDIyMjI2NiwgMHg1NDJhMmE3ZSwgMHgzYjkwOTBhYiwgMHgwYjg4ODg4MywKKwkweDhjNDY0NmNhLCAweGM3ZWVlZTI5LCAweDZiYjhiOGQzLCAweDI4MTQxNDNjLAorCTB4YTdkZWRlNzksIDB4YmM1ZTVlZTIsIDB4MTYwYjBiMWQsIDB4YWRkYmRiNzYsCisJMHhkYmUwZTAzYiwgMHg2NDMyMzI1NiwgMHg3NDNhM2E0ZSwgMHgxNDBhMGExZSwKKwkweDkyNDk0OWRiLCAweDBjMDYwNjBhLCAweDQ4MjQyNDZjLCAweGI4NWM1Y2U0LAorCTB4OWZjMmMyNWQsIDB4YmRkM2QzNmUsIDB4NDNhY2FjZWYsIDB4YzQ2MjYyYTYsCisJMHgzOTkxOTFhOCwgMHgzMTk1OTVhNCwgMHhkM2U0ZTQzNywgMHhmMjc5Nzk4YiwKKwkweGQ1ZTdlNzMyLCAweDhiYzhjODQzLCAweDZlMzczNzU5LCAweGRhNmQ2ZGI3LAorCTB4MDE4ZDhkOGMsIDB4YjFkNWQ1NjQsIDB4OWM0ZTRlZDIsIDB4NDlhOWE5ZTAsCisJMHhkODZjNmNiNCwgMHhhYzU2NTZmYSwgMHhmM2Y0ZjQwNywgMHhjZmVhZWEyNSwKKwkweGNhNjU2NWFmLCAweGY0N2E3YThlLCAweDQ3YWVhZWU5LCAweDEwMDgwODE4LAorCTB4NmZiYWJhZDUsIDB4ZjA3ODc4ODgsIDB4NGEyNTI1NmYsIDB4NWMyZTJlNzIsCisJMHgzODFjMWMyNCwgMHg1N2E2YTZmMSwgMHg3M2I0YjRjNywgMHg5N2M2YzY1MSwKKwkweGNiZThlODIzLCAweGExZGRkZDdjLCAweGU4NzQ3NDljLCAweDNlMWYxZjIxLAorCTB4OTY0YjRiZGQsIDB4NjFiZGJkZGMsIDB4MGQ4YjhiODYsIDB4MGY4YThhODUsCisJMHhlMDcwNzA5MCwgMHg3YzNlM2U0MiwgMHg3MWI1YjVjNCwgMHhjYzY2NjZhYSwKKwkweDkwNDg0OGQ4LCAweDA2MDMwMzA1LCAweGY3ZjZmNjAxLCAweDFjMGUwZTEyLAorCTB4YzI2MTYxYTMsIDB4NmEzNTM1NWYsIDB4YWU1NzU3ZjksIDB4NjliOWI5ZDAsCisJMHgxNzg2ODY5MSwgMHg5OWMxYzE1OCwgMHgzYTFkMWQyNywgMHgyNzllOWViOSwKKwkweGQ5ZTFlMTM4LCAweGViZjhmODEzLCAweDJiOTg5OGIzLCAweDIyMTExMTMzLAorCTB4ZDI2OTY5YmIsIDB4YTlkOWQ5NzAsIDB4MDc4ZThlODksIDB4MzM5NDk0YTcsCisJMHgyZDliOWJiNiwgMHgzYzFlMWUyMiwgMHgxNTg3ODc5MiwgMHhjOWU5ZTkyMCwKKwkweDg3Y2VjZTQ5LCAweGFhNTU1NWZmLCAweDUwMjgyODc4LCAweGE1ZGZkZjdhLAorCTB4MDM4YzhjOGYsIDB4NTlhMWExZjgsIDB4MDk4OTg5ODAsIDB4MWEwZDBkMTcsCisJMHg2NWJmYmZkYSwgMHhkN2U2ZTYzMSwgMHg4NDQyNDJjNiwgMHhkMDY4NjhiOCwKKwkweDgyNDE0MWMzLCAweDI5OTk5OWIwLCAweDVhMmQyZDc3LCAweDFlMGYwZjExLAorCTB4N2JiMGIwY2IsIDB4YTg1NDU0ZmMsIDB4NmRiYmJiZDYsIDB4MmMxNjE2M2EpOworJGNvZGUuPTw8X19fOworLmJ5dGUJMHg2MywgMHg3YywgMHg3NywgMHg3YiwgMHhmMiwgMHg2YiwgMHg2ZiwgMHhjNQorLmJ5dGUJMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NgorLmJ5dGUJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMAorLmJ5dGUJMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMAorLmJ5dGUJMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYworLmJ5dGUJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNQorLmJ5dGUJMHgwNCwgMHhjNywgMHgyMywgMHhjMywgMHgxOCwgMHg5NiwgMHgwNSwgMHg5YQorLmJ5dGUJMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NQorLmJ5dGUJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMAorLmJ5dGUJMHg1MiwgMHgzYiwgMHhkNiwgMHhiMywgMHgyOSwgMHhlMywgMHgyZiwgMHg4NAorLmJ5dGUJMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YgorLmJ5dGUJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZgorLmJ5dGUJMHhkMCwgMHhlZiwgMHhhYSwgMHhmYiwgMHg0MywgMHg0ZCwgMHgzMywgMHg4NQorLmJ5dGUJMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOAorLmJ5dGUJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNQorLmJ5dGUJMHhiYywgMHhiNiwgMHhkYSwgMHgyMSwgMHgxMCwgMHhmZiwgMHhmMywgMHhkMgorLmJ5dGUJMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNworLmJ5dGUJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MworLmJ5dGUJMHg2MCwgMHg4MSwgMHg0ZiwgMHhkYywgMHgyMiwgMHgyYSwgMHg5MCwgMHg4OAorLmJ5dGUJMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYgorLmJ5dGUJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YworLmJ5dGUJMHhjMiwgMHhkMywgMHhhYywgMHg2MiwgMHg5MSwgMHg5NSwgMHhlNCwgMHg3OQorLmJ5dGUJMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOQorLmJ5dGUJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOAorLmJ5dGUJMHhiYSwgMHg3OCwgMHgyNSwgMHgyZSwgMHgxYywgMHhhNiwgMHhiNCwgMHhjNgorLmJ5dGUJMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YQorLmJ5dGUJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZQorLmJ5dGUJMHg2MSwgMHgzNSwgMHg1NywgMHhiOSwgMHg4NiwgMHhjMSwgMHgxZCwgMHg5ZQorLmJ5dGUJMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NAorLmJ5dGUJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZgorLmJ5dGUJMHg4YywgMHhhMSwgMHg4OSwgMHgwZCwgMHhiZiwgMHhlNiwgMHg0MiwgMHg2OAorLmJ5dGUJMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgorX19fCismX2RhdGFfd29yZCgKKwkweDUxZjRhNzUwLCAweDdlNDE2NTUzLCAweDFhMTdhNGMzLCAweDNhMjc1ZTk2LAorCTB4M2JhYjZiY2IsIDB4MWY5ZDQ1ZjEsIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMsCisJMHgyMDMwZmE1NSwgMHhhZDc2NmRmNiwgMHg4OGNjNzY5MSwgMHhmNTAyNGMyNSwKKwkweDRmZTVkN2ZjLCAweGM1MmFjYmQ3LCAweDI2MzU0NDgwLCAweGI1NjJhMzhmLAorCTB4ZGViMTVhNDksIDB4MjViYTFiNjcsIDB4NDVlYTBlOTgsIDB4NWRmZWMwZTEsCisJMHhjMzJmNzUwMiwgMHg4MTRjZjAxMiwgMHg4ZDQ2OTdhMywgMHg2YmQzZjljNiwKKwkweDAzOGY1ZmU3LCAweDE1OTI5Yzk1LCAweGJmNmQ3YWViLCAweDk1NTI1OWRhLAorCTB4ZDRiZTgzMmQsIDB4NTg3NDIxZDMsIDB4NDllMDY5MjksIDB4OGVjOWM4NDQsCisJMHg3NWMyODk2YSwgMHhmNDhlNzk3OCwgMHg5OTU4M2U2YiwgMHgyN2I5NzFkZCwKKwkweGJlZTE0ZmI2LCAweGYwODhhZDE3LCAweGM5MjBhYzY2LCAweDdkY2UzYWI0LAorCTB4NjNkZjRhMTgsIDB4ZTUxYTMxODIsIDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUsCisJMHhiMTY0NzdlMCwgMHhiYjZiYWU4NCwgMHhmZTgxYTAxYywgMHhmOTA4MmI5NCwKKwkweDcwNDg2ODU4LCAweDhmNDVmZDE5LCAweDk0ZGU2Yzg3LCAweDUyN2JmOGI3LAorCTB4YWI3M2QzMjMsIDB4NzI0YjAyZTIsIDB4ZTMxZjhmNTcsIDB4NjY1NWFiMmEsCisJMHhiMmViMjgwNywgMHgyZmI1YzIwMywgMHg4NmM1N2I5YSwgMHhkMzM3MDhhNSwKKwkweDMwMjg4N2YyLCAweDIzYmZhNWIyLCAweDAyMDM2YWJhLCAweGVkMTY4MjVjLAorCTB4OGFjZjFjMmIsIDB4YTc3OWI0OTIsIDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEsCisJMHg2NWRhZjRjZCwgMHgwNjA1YmVkNSwgMHhkMTM0NjIxZiwgMHhjNGE2ZmU4YSwKKwkweDM0MmU1MzlkLCAweGEyZjM1NWEwLCAweDA1OGFlMTMyLCAweGE0ZjZlYjc1LAorCTB4MGI4M2VjMzksIDB4NDA2MGVmYWEsIDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEsCisJMHgzZTIxOGFmOSwgMHg5NmRkMDYzZCwgMHhkZDNlMDVhZSwgMHg0ZGU2YmQ0NiwKKwkweDkxNTQ4ZGI1LCAweDcxYzQ1ZDA1LCAweDA0MDZkNDZmLCAweDYwNTAxNWZmLAorCTB4MTk5OGZiMjQsIDB4ZDZiZGU5OTcsIDB4ODk0MDQzY2MsIDB4NjdkOTllNzcsCisJMHhiMGU4NDJiZCwgMHgwNzg5OGI4OCwgMHhlNzE5NWIzOCwgMHg3OWM4ZWVkYiwKKwkweGExN2MwYTQ3LCAweDdjNDIwZmU5LCAweGY4ODQxZWM5LCAweDAwMDAwMDAwLAorCTB4MDk4MDg2ODMsIDB4MzIyYmVkNDgsIDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUsCisJMHhmZDBlZmZmYiwgMHgwZjg1Mzg1NiwgMHgzZGFlZDUxZSwgMHgzNjJkMzkyNywKKwkweDBhMGZkOTY0LCAweDY4NWNhNjIxLCAweDliNWI1NGQxLCAweDI0MzYyZTNhLAorCTB4MGMwYTY3YjEsIDB4OTM1N2U3MGYsIDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUsCisJMHg4MGMwYzU0ZiwgMHg2MWRjMjBhMiwgMHg1YTc3NGI2OSwgMHgxYzEyMWExNiwKKwkweGUyOTNiYTBhLCAweGMwYTAyYWU1LCAweDNjMjJlMDQzLCAweDEyMWIxNzFkLAorCTB4MGUwOTBkMGIsIDB4ZjI4YmM3YWQsIDB4MmRiNmE4YjksIDB4MTQxZWE5YzgsCisJMHg1N2YxMTk4NSwgMHhhZjc1MDc0YywgMHhlZTk5ZGRiYiwgMHhhMzdmNjBmZCwKKwkweGY3MDEyNjlmLCAweDVjNzJmNWJjLCAweDQ0NjYzYmM1LCAweDViZmI3ZTM0LAorCTB4OGI0MzI5NzYsIDB4Y2IyM2M2ZGMsIDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMsCisJMHhkNzMxZGNjYSwgMHg0MjYzODUxMCwgMHgxMzk3MjI0MCwgMHg4NGM2MTEyMCwKKwkweDg1NGEyNDdkLCAweGQyYmIzZGY4LCAweGFlZjkzMjExLCAweGM3MjlhMTZkLAorCTB4MWQ5ZTJmNGIsIDB4ZGNiMjMwZjMsIDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAsCisJMHgyYmIzMTY2YywgMHhhOTcwYjk5OSwgMHgxMTk0NDhmYSwgMHg0N2U5NjQyMiwKKwkweGE4ZmM4Y2M0LCAweGEwZjAzZjFhLCAweDU2N2QyY2Q4LCAweDIyMzM5MGVmLAorCTB4ODc0OTRlYzcsIDB4ZDkzOGQxYzEsIDB4OGNjYWEyZmUsIDB4OThkNDBiMzYsCisJMHhhNmY1ODFjZiwgMHhhNTdhZGUyOCwgMHhkYWI3OGUyNiwgMHgzZmFkYmZhNCwKKwkweDJjM2E5ZGU0LCAweDUwNzg5MjBkLCAweDZhNWZjYzliLCAweDU0N2U0NjYyLAorCTB4ZjY4ZDEzYzIsIDB4OTBkOGI4ZTgsIDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUsCisJMHg5ZjVkODBiZSwgMHg2OWQwOTM3YywgMHg2ZmQ1MmRhOSwgMHhjZjI1MTJiMywKKwkweGM4YWM5OTNiLCAweDEwMTg3ZGE3LCAweGU4OWM2MzZlLCAweGRiM2JiYjdiLAorCTB4Y2QyNjc4MDksIDB4NmU1OTE4ZjQsIDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgsCisJMHhlNjk1NmU2NSwgMHhhYWZmZTY3ZSwgMHgyMWJjY2YwOCwgMHhlZjE1ZThlNiwKKwkweGJhZTc5YmQ5LCAweDRhNmYzNmNlLCAweGVhOWYwOWQ0LCAweDI5YjA3Y2Q2LAorCTB4MzFhNGIyYWYsIDB4MmEzZjIzMzEsIDB4YzZhNTk0MzAsIDB4MzVhMjY2YzAsCisJMHg3NDRlYmMzNywgMHhmYzgyY2FhNiwgMHhlMDkwZDBiMCwgMHgzM2E3ZDgxNSwKKwkweGYxMDQ5ODRhLCAweDQxZWNkYWY3LCAweDdmY2Q1MDBlLCAweDE3OTFmNjJmLAorCTB4NzY0ZGQ2OGQsIDB4NDNlZmIwNGQsIDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYsCisJMHg5ZWQxYjVlMywgMHg0YzZhODgxYiwgMHhjMTJjMWZiOCwgMHg0NjY1NTE3ZiwKKwkweDlkNWVlYTA0LCAweDAxOGMzNTVkLCAweGZhODc3NDczLCAweGZiMGI0MTJlLAorCTB4YjM2NzFkNWEsIDB4OTJkYmQyNTIsIDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMsCisJMHg5YWQ3NjE4YywgMHgzN2ExMGM3YSwgMHg1OWY4MTQ4ZSwgMHhlYjEzM2M4OSwKKwkweGNlYTkyN2VlLCAweGI3NjFjOTM1LCAweGUxMWNlNWVkLCAweDdhNDdiMTNjLAorCTB4OWNkMmRmNTksIDB4NTVmMjczM2YsIDB4MTgxNGNlNzksIDB4NzNjNzM3YmYsCisJMHg1M2Y3Y2RlYSwgMHg1ZmZkYWE1YiwgMHhkZjNkNmYxNCwgMHg3ODQ0ZGI4NiwKKwkweGNhYWZmMzgxLCAweGI5NjhjNDNlLCAweDM4MjQzNDJjLCAweGMyYTM0MDVmLAorCTB4MTYxZGMzNzIsIDB4YmNlMjI1MGMsIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEsCisJMHgzOWE4MDE3MSwgMHgwODBjYjNkZSwgMHhkOGI0ZTQ5YywgMHg2NDU2YzE5MCwKKwkweDdiY2I4NDYxLCAweGQ1MzJiNjcwLCAweDQ4NmM1Yzc0LCAweGQwYjg1NzQyKTsKKyRjb2RlLj08PF9fXzsKKy5ieXRlCTB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgKKy5ieXRlCTB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIKKy5ieXRlCTB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcKKy5ieXRlCTB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IKKy5ieXRlCTB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QKKy5ieXRlCTB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUKKy5ieXRlCTB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIKKy5ieXRlCTB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUKKy5ieXRlCTB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYKKy5ieXRlCTB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIKKy5ieXRlCTB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEKKy5ieXRlCTB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQKKy5ieXRlCTB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEKKy5ieXRlCTB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYKKy5ieXRlCTB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIKKy5ieXRlCTB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIKKy5ieXRlCTB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEKKy5ieXRlCTB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMKKy5ieXRlCTB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUKKy5ieXRlCTB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUKKy5ieXRlCTB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkKKy5ieXRlCTB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIKKy5ieXRlCTB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAKKy5ieXRlCTB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQKKy5ieXRlCTB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEKKy5ieXRlCTB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYKKy5ieXRlCTB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQKKy5ieXRlCTB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYKKy5ieXRlCTB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAKKy5ieXRlCTB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEKKy5ieXRlCTB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYKKy5ieXRlCTB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QKKworCisuZ2xvYmwJLkFFU19lbmNyeXB0CisuYWxpZ24JNworLkFFU19lbmNyeXB0OgorCW1mbHIJcjAKKwkkU1RVCSRzcCwtJEZSQU1FKCRzcCkKKworCSRQVVNICXIwLGAkRlJBTUUtJFNJWkVfVCoyMWAoJHNwKQorCSRQVVNICSR0b2MsYCRGUkFNRS0kU0laRV9UKjIwYCgkc3ApCisJJFBVU0gJcjEzLGAkRlJBTUUtJFNJWkVfVCoxOWAoJHNwKQorCSRQVVNICXIxNCxgJEZSQU1FLSRTSVpFX1QqMThgKCRzcCkKKwkkUFVTSAlyMTUsYCRGUkFNRS0kU0laRV9UKjE3YCgkc3ApCisJJFBVU0gJcjE2LGAkRlJBTUUtJFNJWkVfVCoxNmAoJHNwKQorCSRQVVNICXIxNyxgJEZSQU1FLSRTSVpFX1QqMTVgKCRzcCkKKwkkUFVTSAlyMTgsYCRGUkFNRS0kU0laRV9UKjE0YCgkc3ApCisJJFBVU0gJcjE5LGAkRlJBTUUtJFNJWkVfVCoxM2AoJHNwKQorCSRQVVNICXIyMCxgJEZSQU1FLSRTSVpFX1QqMTJgKCRzcCkKKwkkUFVTSAlyMjEsYCRGUkFNRS0kU0laRV9UKjExYCgkc3ApCisJJFBVU0gJcjIyLGAkRlJBTUUtJFNJWkVfVCoxMGAoJHNwKQorCSRQVVNICXIyMyxgJEZSQU1FLSRTSVpFX1QqOWAoJHNwKQorCSRQVVNICXIyNCxgJEZSQU1FLSRTSVpFX1QqOGAoJHNwKQorCSRQVVNICXIyNSxgJEZSQU1FLSRTSVpFX1QqN2AoJHNwKQorCSRQVVNICXIyNixgJEZSQU1FLSRTSVpFX1QqNmAoJHNwKQorCSRQVVNICXIyNyxgJEZSQU1FLSRTSVpFX1QqNWAoJHNwKQorCSRQVVNICXIyOCxgJEZSQU1FLSRTSVpFX1QqNGAoJHNwKQorCSRQVVNICXIyOSxgJEZSQU1FLSRTSVpFX1QqM2AoJHNwKQorCSRQVVNICXIzMCxgJEZSQU1FLSRTSVpFX1QqMmAoJHNwKQorCSRQVVNICXIzMSxgJEZSQU1FLSRTSVpFX1QqMWAoJHNwKQorCisJbHd6CSRzMCwwKCRpbnApCisJbHd6CSRzMSw0KCRpbnApCisJbHd6CSRzMiw4KCRpbnApCisJbHd6CSRzMywxMigkaW5wKQorCWJsCUxBRVNfVGUKKwlibAlMcHBjX0FFU19lbmNyeXB0X2NvbXBhY3QKKwlzdHcJJHMwLDAoJG91dCkKKwlzdHcJJHMxLDQoJG91dCkKKwlzdHcJJHMyLDgoJG91dCkKKwlzdHcJJHMzLDEyKCRvdXQpCisKKwkkUE9QCXIwLGAkRlJBTUUtJFNJWkVfVCoyMWAoJHNwKQorCSRQT1AJJHRvYyxgJEZSQU1FLSRTSVpFX1QqMjBgKCRzcCkKKwkkUE9QCXIxMyxgJEZSQU1FLSRTSVpFX1QqMTlgKCRzcCkKKwkkUE9QCXIxNCxgJEZSQU1FLSRTSVpFX1QqMThgKCRzcCkKKwkkUE9QCXIxNSxgJEZSQU1FLSRTSVpFX1QqMTdgKCRzcCkKKwkkUE9QCXIxNixgJEZSQU1FLSRTSVpFX1QqMTZgKCRzcCkKKwkkUE9QCXIxNyxgJEZSQU1FLSRTSVpFX1QqMTVgKCRzcCkKKwkkUE9QCXIxOCxgJEZSQU1FLSRTSVpFX1QqMTRgKCRzcCkKKwkkUE9QCXIxOSxgJEZSQU1FLSRTSVpFX1QqMTNgKCRzcCkKKwkkUE9QCXIyMCxgJEZSQU1FLSRTSVpFX1QqMTJgKCRzcCkKKwkkUE9QCXIyMSxgJEZSQU1FLSRTSVpFX1QqMTFgKCRzcCkKKwkkUE9QCXIyMixgJEZSQU1FLSRTSVpFX1QqMTBgKCRzcCkKKwkkUE9QCXIyMyxgJEZSQU1FLSRTSVpFX1QqOWAoJHNwKQorCSRQT1AJcjI0LGAkRlJBTUUtJFNJWkVfVCo4YCgkc3ApCisJJFBPUAlyMjUsYCRGUkFNRS0kU0laRV9UKjdgKCRzcCkKKwkkUE9QCXIyNixgJEZSQU1FLSRTSVpFX1QqNmAoJHNwKQorCSRQT1AJcjI3LGAkRlJBTUUtJFNJWkVfVCo1YCgkc3ApCisJJFBPUAlyMjgsYCRGUkFNRS0kU0laRV9UKjRgKCRzcCkKKwkkUE9QCXIyOSxgJEZSQU1FLSRTSVpFX1QqM2AoJHNwKQorCSRQT1AJcjMwLGAkRlJBTUUtJFNJWkVfVCoyYCgkc3ApCisJJFBPUAlyMzEsYCRGUkFNRS0kU0laRV9UKjFgKCRzcCkKKwltdGxyCXIwCisJYWRkaQkkc3AsJHNwLCRGUkFNRQorCWJscgorCisuYWxpZ24JNQorTHBwY19BRVNfZW5jcnlwdDoKKwlsd3oJJGFjYzAwLDI0MCgka2V5KQorCWx3egkkdDAsMCgka2V5KQorCWx3egkkdDEsNCgka2V5KQorCWx3egkkdDIsOCgka2V5KQorCWx3egkkdDMsMTIoJGtleSkKKwlhZGRpCSRUYmwxLCRUYmwwLDMKKwlhZGRpCSRUYmwyLCRUYmwwLDIKKwlhZGRpCSRUYmwzLCRUYmwwLDEKKwlhZGRpCSRhY2MwMCwkYWNjMDAsLTEKKwlhZGRpCSRrZXksJGtleSwxNgorCXhvcgkkczAsJHMwLCR0MAorCXhvcgkkczEsJHMxLCR0MQorCXhvcgkkczIsJHMyLCR0MgorCXhvcgkkczMsJHMzLCR0MworCW10Y3RyCSRhY2MwMAorLmFsaWduCTQKK0xlbmNfbG9vcDoKKwlybHdpbm0JJGFjYzAwLCRzMCxgMzItMjQrM2AsMjEsMjgKKwlybHdpbm0JJGFjYzAxLCRzMSxgMzItMjQrM2AsMjEsMjgKKwlybHdpbm0JJGFjYzAyLCRzMixgMzItMjQrM2AsMjEsMjgKKwlybHdpbm0JJGFjYzAzLCRzMyxgMzItMjQrM2AsMjEsMjgKKwlsd3oJJHQwLDAoJGtleSkKKwlsd3oJJHQxLDQoJGtleSkKKwlybHdpbm0JJGFjYzA0LCRzMSxgMzItMTYrM2AsMjEsMjgKKwlybHdpbm0JJGFjYzA1LCRzMixgMzItMTYrM2AsMjEsMjgKKwlsd3oJJHQyLDgoJGtleSkKKwlsd3oJJHQzLDEyKCRrZXkpCisJcmx3aW5tCSRhY2MwNiwkczMsYDMyLTE2KzNgLDIxLDI4CisJcmx3aW5tCSRhY2MwNywkczAsYDMyLTE2KzNgLDIxLDI4CisJbHd6eAkkYWNjMDAsJFRibDAsJGFjYzAwCisJbHd6eAkkYWNjMDEsJFRibDAsJGFjYzAxCisJcmx3aW5tCSRhY2MwOCwkczIsYDMyLTgrM2AsMjEsMjgKKwlybHdpbm0JJGFjYzA5LCRzMyxgMzItOCszYCwyMSwyOAorCWx3engJJGFjYzAyLCRUYmwwLCRhY2MwMgorCWx3engJJGFjYzAzLCRUYmwwLCRhY2MwMworCXJsd2lubQkkYWNjMTAsJHMwLGAzMi04KzNgLDIxLDI4CisJcmx3aW5tCSRhY2MxMSwkczEsYDMyLTgrM2AsMjEsMjgKKwlsd3p4CSRhY2MwNCwkVGJsMSwkYWNjMDQKKwlsd3p4CSRhY2MwNSwkVGJsMSwkYWNjMDUKKwlybHdpbm0JJGFjYzEyLCRzMyxgMCszYCwyMSwyOAorCXJsd2lubQkkYWNjMTMsJHMwLGAwKzNgLDIxLDI4CisJbHd6eAkkYWNjMDYsJFRibDEsJGFjYzA2CisJbHd6eAkkYWNjMDcsJFRibDEsJGFjYzA3CisJcmx3aW5tCSRhY2MxNCwkczEsYDArM2AsMjEsMjgKKwlybHdpbm0JJGFjYzE1LCRzMixgMCszYCwyMSwyOAorCWx3engJJGFjYzA4LCRUYmwyLCRhY2MwOAorCWx3engJJGFjYzA5LCRUYmwyLCRhY2MwOQorCXhvcgkkdDAsJHQwLCRhY2MwMAorCXhvcgkkdDEsJHQxLCRhY2MwMQorCWx3engJJGFjYzEwLCRUYmwyLCRhY2MxMAorCWx3engJJGFjYzExLCRUYmwyLCRhY2MxMQorCXhvcgkkdDIsJHQyLCRhY2MwMgorCXhvcgkkdDMsJHQzLCRhY2MwMworCWx3engJJGFjYzEyLCRUYmwzLCRhY2MxMgorCWx3engJJGFjYzEzLCRUYmwzLCRhY2MxMworCXhvcgkkdDAsJHQwLCRhY2MwNAorCXhvcgkkdDEsJHQxLCRhY2MwNQorCWx3engJJGFjYzE0LCRUYmwzLCRhY2MxNAorCWx3engJJGFjYzE1LCRUYmwzLCRhY2MxNQorCXhvcgkkdDIsJHQyLCRhY2MwNgorCXhvcgkkdDMsJHQzLCRhY2MwNworCXhvcgkkdDAsJHQwLCRhY2MwOAorCXhvcgkkdDEsJHQxLCRhY2MwOQorCXhvcgkkdDIsJHQyLCRhY2MxMAorCXhvcgkkdDMsJHQzLCRhY2MxMQorCXhvcgkkczAsJHQwLCRhY2MxMgorCXhvcgkkczEsJHQxLCRhY2MxMworCXhvcgkkczIsJHQyLCRhY2MxNAorCXhvcgkkczMsJHQzLCRhY2MxNQorCWFkZGkJJGtleSwka2V5LDE2CisJYmRuei0JTGVuY19sb29wCisKKwlhZGRpCSRUYmwyLCRUYmwwLDIwNDgKKwlub3AKKwlsd3oJJHQwLDAoJGtleSkKKwlsd3oJJHQxLDQoJGtleSkKKwlybHdpbm0JJGFjYzAwLCRzMCxgMzItMjRgLDI0LDMxCisJcmx3aW5tCSRhY2MwMSwkczEsYDMyLTI0YCwyNCwzMQorCWx3egkkdDIsOCgka2V5KQorCWx3egkkdDMsMTIoJGtleSkKKwlybHdpbm0JJGFjYzAyLCRzMixgMzItMjRgLDI0LDMxCisJcmx3aW5tCSRhY2MwMywkczMsYDMyLTI0YCwyNCwzMQorCWx3egkkYWNjMDgsYDIwNDgrMGAoJFRibDApCSEgcHJlZmV0Y2ggVGU0CisJbHd6CSRhY2MwOSxgMjA0OCszMmAoJFRibDApCisJcmx3aW5tCSRhY2MwNCwkczEsYDMyLTE2YCwyNCwzMQorCXJsd2lubQkkYWNjMDUsJHMyLGAzMi0xNmAsMjQsMzEKKwlsd3oJJGFjYzEwLGAyMDQ4KzY0YCgkVGJsMCkKKwlsd3oJJGFjYzExLGAyMDQ4Kzk2YCgkVGJsMCkKKwlybHdpbm0JJGFjYzA2LCRzMyxgMzItMTZgLDI0LDMxCisJcmx3aW5tCSRhY2MwNywkczAsYDMyLTE2YCwyNCwzMQorCWx3egkkYWNjMTIsYDIwNDgrMTI4YCgkVGJsMCkKKwlsd3oJJGFjYzEzLGAyMDQ4KzE2MGAoJFRibDApCisJcmx3aW5tCSRhY2MwOCwkczIsYDMyLThgLDI0LDMxCisJcmx3aW5tCSRhY2MwOSwkczMsYDMyLThgLDI0LDMxCisJbHd6CSRhY2MxNCxgMjA0OCsxOTJgKCRUYmwwKQorCWx3egkkYWNjMTUsYDIwNDgrMjI0YCgkVGJsMCkKKwlybHdpbm0JJGFjYzEwLCRzMCxgMzItOGAsMjQsMzEKKwlybHdpbm0JJGFjYzExLCRzMSxgMzItOGAsMjQsMzEKKwlsYnp4CSRhY2MwMCwkVGJsMiwkYWNjMDAKKwlsYnp4CSRhY2MwMSwkVGJsMiwkYWNjMDEKKwlybHdpbm0JJGFjYzEyLCRzMyxgMGAsMjQsMzEKKwlybHdpbm0JJGFjYzEzLCRzMCxgMGAsMjQsMzEKKwlsYnp4CSRhY2MwMiwkVGJsMiwkYWNjMDIKKwlsYnp4CSRhY2MwMywkVGJsMiwkYWNjMDMKKwlybHdpbm0JJGFjYzE0LCRzMSxgMGAsMjQsMzEKKwlybHdpbm0JJGFjYzE1LCRzMixgMGAsMjQsMzEKKwlsYnp4CSRhY2MwNCwkVGJsMiwkYWNjMDQKKwlsYnp4CSRhY2MwNSwkVGJsMiwkYWNjMDUKKwlybHdpbm0JJHMwLCRhY2MwMCwyNCwwLDcKKwlybHdpbm0JJHMxLCRhY2MwMSwyNCwwLDcKKwlsYnp4CSRhY2MwNiwkVGJsMiwkYWNjMDYKKwlsYnp4CSRhY2MwNywkVGJsMiwkYWNjMDcKKwlybHdpbm0JJHMyLCRhY2MwMiwyNCwwLDcKKwlybHdpbm0JJHMzLCRhY2MwMywyNCwwLDcKKwlsYnp4CSRhY2MwOCwkVGJsMiwkYWNjMDgKKwlsYnp4CSRhY2MwOSwkVGJsMiwkYWNjMDkKKwlybHdpbWkJJHMwLCRhY2MwNCwxNiw4LDE1CisJcmx3aW1pCSRzMSwkYWNjMDUsMTYsOCwxNQorCWxiengJJGFjYzEwLCRUYmwyLCRhY2MxMAorCWxiengJJGFjYzExLCRUYmwyLCRhY2MxMQorCXJsd2ltaQkkczIsJGFjYzA2LDE2LDgsMTUKKwlybHdpbWkJJHMzLCRhY2MwNywxNiw4LDE1CisJbGJ6eAkkYWNjMTIsJFRibDIsJGFjYzEyCisJbGJ6eAkkYWNjMTMsJFRibDIsJGFjYzEzCisJcmx3aW1pCSRzMCwkYWNjMDgsOCwxNiwyMworCXJsd2ltaQkkczEsJGFjYzA5LDgsMTYsMjMKKwlsYnp4CSRhY2MxNCwkVGJsMiwkYWNjMTQKKwlsYnp4CSRhY2MxNSwkVGJsMiwkYWNjMTUKKwlybHdpbWkJJHMyLCRhY2MxMCw4LDE2LDIzCisJcmx3aW1pCSRzMywkYWNjMTEsOCwxNiwyMworCW9yCSRzMCwkczAsJGFjYzEyCisJb3IJJHMxLCRzMSwkYWNjMTMKKwlvcgkkczIsJHMyLCRhY2MxNAorCW9yCSRzMywkczMsJGFjYzE1CisJeG9yCSRzMCwkczAsJHQwCisJeG9yCSRzMSwkczEsJHQxCisJeG9yCSRzMiwkczIsJHQyCisJeG9yCSRzMywkczMsJHQzCisJYmxyCisKKy5hbGlnbgk0CitMcHBjX0FFU19lbmNyeXB0X2NvbXBhY3Q6CisJbHd6CSRhY2MwMCwyNDAoJGtleSkKKwlsd3oJJHQwLDAoJGtleSkKKwlsd3oJJHQxLDQoJGtleSkKKwlsd3oJJHQyLDgoJGtleSkKKwlsd3oJJHQzLDEyKCRrZXkpCisJYWRkaQkkVGJsMSwkVGJsMCwyMDQ4CisJbGlzCSRtYXNrODAsMHg4MDgwCisJbGlzCSRtYXNrMWIsMHgxYjFiCisJYWRkaQkka2V5LCRrZXksMTYKKwlvcmkJJG1hc2s4MCwkbWFzazgwLDB4ODA4MAorCW9yaQkkbWFzazFiLCRtYXNrMWIsMHgxYjFiCisJbXRjdHIJJGFjYzAwCisuYWxpZ24JNAorTGVuY19jb21wYWN0X2xvb3A6CisJeG9yCSRzMCwkczAsJHQwCisJeG9yCSRzMSwkczEsJHQxCisJeG9yCSRzMiwkczIsJHQyCisJeG9yCSRzMywkczMsJHQzCisJcmx3aW5tCSRhY2MwMCwkczAsYDMyLTI0YCwyNCwzMQorCXJsd2lubQkkYWNjMDEsJHMxLGAzMi0yNGAsMjQsMzEKKwlybHdpbm0JJGFjYzAyLCRzMixgMzItMjRgLDI0LDMxCisJcmx3aW5tCSRhY2MwMywkczMsYDMyLTI0YCwyNCwzMQorCXJsd2lubQkkYWNjMDQsJHMxLGAzMi0xNmAsMjQsMzEKKwlybHdpbm0JJGFjYzA1LCRzMixgMzItMTZgLDI0LDMxCisJcmx3aW5tCSRhY2MwNiwkczMsYDMyLTE2YCwyNCwzMQorCXJsd2lubQkkYWNjMDcsJHMwLGAzMi0xNmAsMjQsMzEKKwlsYnp4CSRhY2MwMCwkVGJsMSwkYWNjMDAKKwlsYnp4CSRhY2MwMSwkVGJsMSwkYWNjMDEKKwlybHdpbm0JJGFjYzA4LCRzMixgMzItOGAsMjQsMzEKKwlybHdpbm0JJGFjYzA5LCRzMyxgMzItOGAsMjQsMzEKKwlsYnp4CSRhY2MwMiwkVGJsMSwkYWNjMDIKKwlsYnp4CSRhY2MwMywkVGJsMSwkYWNjMDMKKwlybHdpbm0JJGFjYzEwLCRzMCxgMzItOGAsMjQsMzEKKwlybHdpbm0JJGFjYzExLCRzMSxgMzItOGAsMjQsMzEKKwlsYnp4CSRhY2MwNCwkVGJsMSwkYWNjMDQKKwlsYnp4CSRhY2MwNSwkVGJsMSwkYWNjMDUKKwlybHdpbm0JJGFjYzEyLCRzMyxgMGAsMjQsMzEKKwlybHdpbm0JJGFjYzEzLCRzMCxgMGAsMjQsMzEKKwlsYnp4CSRhY2MwNiwkVGJsMSwkYWNjMDYKKwlsYnp4CSRhY2MwNywkVGJsMSwkYWNjMDcKKwlybHdpbm0JJGFjYzE0LCRzMSxgMGAsMjQsMzEKKwlybHdpbm0JJGFjYzE1LCRzMixgMGAsMjQsMzEKKwlsYnp4CSRhY2MwOCwkVGJsMSwkYWNjMDgKKwlsYnp4CSRhY2MwOSwkVGJsMSwkYWNjMDkKKwlybHdpbm0JJHMwLCRhY2MwMCwyNCwwLDcKKwlybHdpbm0JJHMxLCRhY2MwMSwyNCwwLDcKKwlsYnp4CSRhY2MxMCwkVGJsMSwkYWNjMTAKKwlsYnp4CSRhY2MxMSwkVGJsMSwkYWNjMTEKKwlybHdpbm0JJHMyLCRhY2MwMiwyNCwwLDcKKwlybHdpbm0JJHMzLCRhY2MwMywyNCwwLDcKKwlsYnp4CSRhY2MxMiwkVGJsMSwkYWNjMTIKKwlsYnp4CSRhY2MxMywkVGJsMSwkYWNjMTMKKwlybHdpbWkJJHMwLCRhY2MwNCwxNiw4LDE1CisJcmx3aW1pCSRzMSwkYWNjMDUsMTYsOCwxNQorCWxiengJJGFjYzE0LCRUYmwxLCRhY2MxNAorCWxiengJJGFjYzE1LCRUYmwxLCRhY2MxNQorCXJsd2ltaQkkczIsJGFjYzA2LDE2LDgsMTUKKwlybHdpbWkJJHMzLCRhY2MwNywxNiw4LDE1CisJcmx3aW1pCSRzMCwkYWNjMDgsOCwxNiwyMworCXJsd2ltaQkkczEsJGFjYzA5LDgsMTYsMjMKKwlybHdpbWkJJHMyLCRhY2MxMCw4LDE2LDIzCisJcmx3aW1pCSRzMywkYWNjMTEsOCwxNiwyMworCWx3egkkdDAsMCgka2V5KQorCWx3egkkdDEsNCgka2V5KQorCW9yCSRzMCwkczAsJGFjYzEyCisJb3IJJHMxLCRzMSwkYWNjMTMKKwlsd3oJJHQyLDgoJGtleSkKKwlsd3oJJHQzLDEyKCRrZXkpCisJb3IJJHMyLCRzMiwkYWNjMTQKKwlvcgkkczMsJHMzLCRhY2MxNQorCisJYWRkaQkka2V5LCRrZXksMTYKKwliZHoJTGVuY19jb21wYWN0X2RvbmUKKworCWFuZAkkYWNjMDAsJHMwLCRtYXNrODAJIyByMT1yMCYweDgwODA4MDgwCisJYW5kCSRhY2MwMSwkczEsJG1hc2s4MAorCWFuZAkkYWNjMDIsJHMyLCRtYXNrODAKKwlhbmQJJGFjYzAzLCRzMywkbWFzazgwCisJc3J3aQkkYWNjMDQsJGFjYzAwLDcJCSMgcjE+PjcKKwlzcndpCSRhY2MwNSwkYWNjMDEsNworCXNyd2kJJGFjYzA2LCRhY2MwMiw3CisJc3J3aQkkYWNjMDcsJGFjYzAzLDcKKwlhbmRjCSRhY2MwOCwkczAsJG1hc2s4MAkjIHIwJjB4N2Y3ZjdmN2YKKwlhbmRjCSRhY2MwOSwkczEsJG1hc2s4MAorCWFuZGMJJGFjYzEwLCRzMiwkbWFzazgwCisJYW5kYwkkYWNjMTEsJHMzLCRtYXNrODAKKwlzdWIJJGFjYzAwLCRhY2MwMCwkYWNjMDQJIyByMS0ocjE+PjcpCisJc3ViCSRhY2MwMSwkYWNjMDEsJGFjYzA1CisJc3ViCSRhY2MwMiwkYWNjMDIsJGFjYzA2CisJc3ViCSRhY2MwMywkYWNjMDMsJGFjYzA3CisJYWRkCSRhY2MwOCwkYWNjMDgsJGFjYzA4CSMgKHIwJjB4N2Y3ZjdmN2YpPDwxCisJYWRkCSRhY2MwOSwkYWNjMDksJGFjYzA5CisJYWRkCSRhY2MxMCwkYWNjMTAsJGFjYzEwCisJYWRkCSRhY2MxMSwkYWNjMTEsJGFjYzExCisJYW5kCSRhY2MwMCwkYWNjMDAsJG1hc2sxYgkjIChyMS0ocjE+PjcpKSYweDFiMWIxYjFiCisJYW5kCSRhY2MwMSwkYWNjMDEsJG1hc2sxYgorCWFuZAkkYWNjMDIsJGFjYzAyLCRtYXNrMWIKKwlhbmQJJGFjYzAzLCRhY2MwMywkbWFzazFiCisJeG9yCSRhY2MwMCwkYWNjMDAsJGFjYzA4CSMgcjIKKwl4b3IJJGFjYzAxLCRhY2MwMSwkYWNjMDkKKwl4b3IJJGFjYzAyLCRhY2MwMiwkYWNjMTAKKwl4b3IJJGFjYzAzLCRhY2MwMywkYWNjMTEKKworCXJvdGx3aQkkYWNjMTIsJHMwLDE2CQkjIFJPVEFURShyMCwxNikKKwlyb3Rsd2kJJGFjYzEzLCRzMSwxNgorCXJvdGx3aQkkYWNjMTQsJHMyLDE2CisJcm90bHdpCSRhY2MxNSwkczMsMTYKKwl4b3IJJHMwLCRzMCwkYWNjMDAJCSMgcjBecjIKKwl4b3IJJHMxLCRzMSwkYWNjMDEKKwl4b3IJJHMyLCRzMiwkYWNjMDIKKwl4b3IJJHMzLCRzMywkYWNjMDMKKwlyb3Ryd2kJJHMwLCRzMCwyNAkJIyBST1RBVEUocjJecjAsMjQpCisJcm90cndpCSRzMSwkczEsMjQKKwlyb3Ryd2kJJHMyLCRzMiwyNAorCXJvdHJ3aQkkczMsJHMzLDI0CisJeG9yCSRzMCwkczAsJGFjYzAwCQkjIFJPVEFURShyMl5yMCwyNClecjIKKwl4b3IJJHMxLCRzMSwkYWNjMDEKKwl4b3IJJHMyLCRzMiwkYWNjMDIKKwl4b3IJJHMzLCRzMywkYWNjMDMKKwlyb3Rsd2kJJGFjYzA4LCRhY2MxMiw4CQkjIFJPVEFURShyMCwyNCkKKwlyb3Rsd2kJJGFjYzA5LCRhY2MxMyw4CisJcm90bHdpCSRhY2MxMCwkYWNjMTQsOAorCXJvdGx3aQkkYWNjMTEsJGFjYzE1LDgKKwl4b3IJJHMwLCRzMCwkYWNjMTIJCSMKKwl4b3IJJHMxLCRzMSwkYWNjMTMKKwl4b3IJJHMyLCRzMiwkYWNjMTQKKwl4b3IJJHMzLCRzMywkYWNjMTUKKwl4b3IJJHMwLCRzMCwkYWNjMDgJCSMKKwl4b3IJJHMxLCRzMSwkYWNjMDkKKwl4b3IJJHMyLCRzMiwkYWNjMTAKKwl4b3IJJHMzLCRzMywkYWNjMTEKKworCWIJTGVuY19jb21wYWN0X2xvb3AKKy5hbGlnbgk0CitMZW5jX2NvbXBhY3RfZG9uZToKKwl4b3IJJHMwLCRzMCwkdDAKKwl4b3IJJHMxLCRzMSwkdDEKKwl4b3IJJHMyLCRzMiwkdDIKKwl4b3IJJHMzLCRzMywkdDMKKwlibHIKKworLmdsb2JsCS5BRVNfZGVjcnlwdAorLmFsaWduCTcKKy5BRVNfZGVjcnlwdDoKKwltZmxyCXIwCisJJFNUVQkkc3AsLSRGUkFNRSgkc3ApCisKKwkkUFVTSAlyMCxgJEZSQU1FLSRTSVpFX1QqMjFgKCRzcCkKKwkkUFVTSAkkdG9jLGAkRlJBTUUtJFNJWkVfVCoyMGAoJHNwKQorCSRQVVNICXIxMyxgJEZSQU1FLSRTSVpFX1QqMTlgKCRzcCkKKwkkUFVTSAlyMTQsYCRGUkFNRS0kU0laRV9UKjE4YCgkc3ApCisJJFBVU0gJcjE1LGAkRlJBTUUtJFNJWkVfVCoxN2AoJHNwKQorCSRQVVNICXIxNixgJEZSQU1FLSRTSVpFX1QqMTZgKCRzcCkKKwkkUFVTSAlyMTcsYCRGUkFNRS0kU0laRV9UKjE1YCgkc3ApCisJJFBVU0gJcjE4LGAkRlJBTUUtJFNJWkVfVCoxNGAoJHNwKQorCSRQVVNICXIxOSxgJEZSQU1FLSRTSVpFX1QqMTNgKCRzcCkKKwkkUFVTSAlyMjAsYCRGUkFNRS0kU0laRV9UKjEyYCgkc3ApCisJJFBVU0gJcjIxLGAkRlJBTUUtJFNJWkVfVCoxMWAoJHNwKQorCSRQVVNICXIyMixgJEZSQU1FLSRTSVpFX1QqMTBgKCRzcCkKKwkkUFVTSAlyMjMsYCRGUkFNRS0kU0laRV9UKjlgKCRzcCkKKwkkUFVTSAlyMjQsYCRGUkFNRS0kU0laRV9UKjhgKCRzcCkKKwkkUFVTSAlyMjUsYCRGUkFNRS0kU0laRV9UKjdgKCRzcCkKKwkkUFVTSAlyMjYsYCRGUkFNRS0kU0laRV9UKjZgKCRzcCkKKwkkUFVTSAlyMjcsYCRGUkFNRS0kU0laRV9UKjVgKCRzcCkKKwkkUFVTSAlyMjgsYCRGUkFNRS0kU0laRV9UKjRgKCRzcCkKKwkkUFVTSAlyMjksYCRGUkFNRS0kU0laRV9UKjNgKCRzcCkKKwkkUFVTSAlyMzAsYCRGUkFNRS0kU0laRV9UKjJgKCRzcCkKKwkkUFVTSAlyMzEsYCRGUkFNRS0kU0laRV9UKjFgKCRzcCkKKworCWx3egkkczAsMCgkaW5wKQorCWx3egkkczEsNCgkaW5wKQorCWx3egkkczIsOCgkaW5wKQorCWx3egkkczMsMTIoJGlucCkKKwlibAlMQUVTX1RkCisJYmwJTHBwY19BRVNfZGVjcnlwdF9jb21wYWN0CisJc3R3CSRzMCwwKCRvdXQpCisJc3R3CSRzMSw0KCRvdXQpCisJc3R3CSRzMiw4KCRvdXQpCisJc3R3CSRzMywxMigkb3V0KQorCisJJFBPUAlyMCxgJEZSQU1FLSRTSVpFX1QqMjFgKCRzcCkKKwkkUE9QCSR0b2MsYCRGUkFNRS0kU0laRV9UKjIwYCgkc3ApCisJJFBPUAlyMTMsYCRGUkFNRS0kU0laRV9UKjE5YCgkc3ApCisJJFBPUAlyMTQsYCRGUkFNRS0kU0laRV9UKjE4YCgkc3ApCisJJFBPUAlyMTUsYCRGUkFNRS0kU0laRV9UKjE3YCgkc3ApCisJJFBPUAlyMTYsYCRGUkFNRS0kU0laRV9UKjE2YCgkc3ApCisJJFBPUAlyMTcsYCRGUkFNRS0kU0laRV9UKjE1YCgkc3ApCisJJFBPUAlyMTgsYCRGUkFNRS0kU0laRV9UKjE0YCgkc3ApCisJJFBPUAlyMTksYCRGUkFNRS0kU0laRV9UKjEzYCgkc3ApCisJJFBPUAlyMjAsYCRGUkFNRS0kU0laRV9UKjEyYCgkc3ApCisJJFBPUAlyMjEsYCRGUkFNRS0kU0laRV9UKjExYCgkc3ApCisJJFBPUAlyMjIsYCRGUkFNRS0kU0laRV9UKjEwYCgkc3ApCisJJFBPUAlyMjMsYCRGUkFNRS0kU0laRV9UKjlgKCRzcCkKKwkkUE9QCXIyNCxgJEZSQU1FLSRTSVpFX1QqOGAoJHNwKQorCSRQT1AJcjI1LGAkRlJBTUUtJFNJWkVfVCo3YCgkc3ApCisJJFBPUAlyMjYsYCRGUkFNRS0kU0laRV9UKjZgKCRzcCkKKwkkUE9QCXIyNyxgJEZSQU1FLSRTSVpFX1QqNWAoJHNwKQorCSRQT1AJcjI4LGAkRlJBTUUtJFNJWkVfVCo0YCgkc3ApCisJJFBPUAlyMjksYCRGUkFNRS0kU0laRV9UKjNgKCRzcCkKKwkkUE9QCXIzMCxgJEZSQU1FLSRTSVpFX1QqMmAoJHNwKQorCSRQT1AJcjMxLGAkRlJBTUUtJFNJWkVfVCoxYCgkc3ApCisJbXRscglyMAorCWFkZGkJJHNwLCRzcCwkRlJBTUUKKwlibHIKKworLmFsaWduCTUKK0xwcGNfQUVTX2RlY3J5cHQ6CisJbHd6CSRhY2MwMCwyNDAoJGtleSkKKwlsd3oJJHQwLDAoJGtleSkKKwlsd3oJJHQxLDQoJGtleSkKKwlsd3oJJHQyLDgoJGtleSkKKwlsd3oJJHQzLDEyKCRrZXkpCisJYWRkaQkkVGJsMSwkVGJsMCwzCisJYWRkaQkkVGJsMiwkVGJsMCwyCisJYWRkaQkkVGJsMywkVGJsMCwxCisJYWRkaQkkYWNjMDAsJGFjYzAwLC0xCisJYWRkaQkka2V5LCRrZXksMTYKKwl4b3IJJHMwLCRzMCwkdDAKKwl4b3IJJHMxLCRzMSwkdDEKKwl4b3IJJHMyLCRzMiwkdDIKKwl4b3IJJHMzLCRzMywkdDMKKwltdGN0cgkkYWNjMDAKKy5hbGlnbgk0CitMZGVjX2xvb3A6CisJcmx3aW5tCSRhY2MwMCwkczAsYDMyLTI0KzNgLDIxLDI4CisJcmx3aW5tCSRhY2MwMSwkczEsYDMyLTI0KzNgLDIxLDI4CisJcmx3aW5tCSRhY2MwMiwkczIsYDMyLTI0KzNgLDIxLDI4CisJcmx3aW5tCSRhY2MwMywkczMsYDMyLTI0KzNgLDIxLDI4CisJbHd6CSR0MCwwKCRrZXkpCisJbHd6CSR0MSw0KCRrZXkpCisJcmx3aW5tCSRhY2MwNCwkczMsYDMyLTE2KzNgLDIxLDI4CisJcmx3aW5tCSRhY2MwNSwkczAsYDMyLTE2KzNgLDIxLDI4CisJbHd6CSR0Miw4KCRrZXkpCisJbHd6CSR0MywxMigka2V5KQorCXJsd2lubQkkYWNjMDYsJHMxLGAzMi0xNiszYCwyMSwyOAorCXJsd2lubQkkYWNjMDcsJHMyLGAzMi0xNiszYCwyMSwyOAorCWx3engJJGFjYzAwLCRUYmwwLCRhY2MwMAorCWx3engJJGFjYzAxLCRUYmwwLCRhY2MwMQorCXJsd2lubQkkYWNjMDgsJHMyLGAzMi04KzNgLDIxLDI4CisJcmx3aW5tCSRhY2MwOSwkczMsYDMyLTgrM2AsMjEsMjgKKwlsd3p4CSRhY2MwMiwkVGJsMCwkYWNjMDIKKwlsd3p4CSRhY2MwMywkVGJsMCwkYWNjMDMKKwlybHdpbm0JJGFjYzEwLCRzMCxgMzItOCszYCwyMSwyOAorCXJsd2lubQkkYWNjMTEsJHMxLGAzMi04KzNgLDIxLDI4CisJbHd6eAkkYWNjMDQsJFRibDEsJGFjYzA0CisJbHd6eAkkYWNjMDUsJFRibDEsJGFjYzA1CisJcmx3aW5tCSRhY2MxMiwkczEsYDArM2AsMjEsMjgKKwlybHdpbm0JJGFjYzEzLCRzMixgMCszYCwyMSwyOAorCWx3engJJGFjYzA2LCRUYmwxLCRhY2MwNgorCWx3engJJGFjYzA3LCRUYmwxLCRhY2MwNworCXJsd2lubQkkYWNjMTQsJHMzLGAwKzNgLDIxLDI4CisJcmx3aW5tCSRhY2MxNSwkczAsYDArM2AsMjEsMjgKKwlsd3p4CSRhY2MwOCwkVGJsMiwkYWNjMDgKKwlsd3p4CSRhY2MwOSwkVGJsMiwkYWNjMDkKKwl4b3IJJHQwLCR0MCwkYWNjMDAKKwl4b3IJJHQxLCR0MSwkYWNjMDEKKwlsd3p4CSRhY2MxMCwkVGJsMiwkYWNjMTAKKwlsd3p4CSRhY2MxMSwkVGJsMiwkYWNjMTEKKwl4b3IJJHQyLCR0MiwkYWNjMDIKKwl4b3IJJHQzLCR0MywkYWNjMDMKKwlsd3p4CSRhY2MxMiwkVGJsMywkYWNjMTIKKwlsd3p4CSRhY2MxMywkVGJsMywkYWNjMTMKKwl4b3IJJHQwLCR0MCwkYWNjMDQKKwl4b3IJJHQxLCR0MSwkYWNjMDUKKwlsd3p4CSRhY2MxNCwkVGJsMywkYWNjMTQKKwlsd3p4CSRhY2MxNSwkVGJsMywkYWNjMTUKKwl4b3IJJHQyLCR0MiwkYWNjMDYKKwl4b3IJJHQzLCR0MywkYWNjMDcKKwl4b3IJJHQwLCR0MCwkYWNjMDgKKwl4b3IJJHQxLCR0MSwkYWNjMDkKKwl4b3IJJHQyLCR0MiwkYWNjMTAKKwl4b3IJJHQzLCR0MywkYWNjMTEKKwl4b3IJJHMwLCR0MCwkYWNjMTIKKwl4b3IJJHMxLCR0MSwkYWNjMTMKKwl4b3IJJHMyLCR0MiwkYWNjMTQKKwl4b3IJJHMzLCR0MywkYWNjMTUKKwlhZGRpCSRrZXksJGtleSwxNgorCWJkbnotCUxkZWNfbG9vcAorCisJYWRkaQkkVGJsMiwkVGJsMCwyMDQ4CisJbm9wCisJbHd6CSR0MCwwKCRrZXkpCisJbHd6CSR0MSw0KCRrZXkpCisJcmx3aW5tCSRhY2MwMCwkczAsYDMyLTI0YCwyNCwzMQorCXJsd2lubQkkYWNjMDEsJHMxLGAzMi0yNGAsMjQsMzEKKwlsd3oJJHQyLDgoJGtleSkKKwlsd3oJJHQzLDEyKCRrZXkpCisJcmx3aW5tCSRhY2MwMiwkczIsYDMyLTI0YCwyNCwzMQorCXJsd2lubQkkYWNjMDMsJHMzLGAzMi0yNGAsMjQsMzEKKwlsd3oJJGFjYzA4LGAyMDQ4KzBgKCRUYmwwKQkhIHByZWZldGNoIFRkNAorCWx3egkkYWNjMDksYDIwNDgrMzJgKCRUYmwwKQorCXJsd2lubQkkYWNjMDQsJHMzLGAzMi0xNmAsMjQsMzEKKwlybHdpbm0JJGFjYzA1LCRzMCxgMzItMTZgLDI0LDMxCisJbHd6CSRhY2MxMCxgMjA0OCs2NGAoJFRibDApCisJbHd6CSRhY2MxMSxgMjA0OCs5NmAoJFRibDApCisJbGJ6eAkkYWNjMDAsJFRibDIsJGFjYzAwCisJbGJ6eAkkYWNjMDEsJFRibDIsJGFjYzAxCisJbHd6CSRhY2MxMixgMjA0OCsxMjhgKCRUYmwwKQorCWx3egkkYWNjMTMsYDIwNDgrMTYwYCgkVGJsMCkKKwlybHdpbm0JJGFjYzA2LCRzMSxgMzItMTZgLDI0LDMxCisJcmx3aW5tCSRhY2MwNywkczIsYDMyLTE2YCwyNCwzMQorCWx3egkkYWNjMTQsYDIwNDgrMTkyYCgkVGJsMCkKKwlsd3oJJGFjYzE1LGAyMDQ4KzIyNGAoJFRibDApCisJcmx3aW5tCSRhY2MwOCwkczIsYDMyLThgLDI0LDMxCisJcmx3aW5tCSRhY2MwOSwkczMsYDMyLThgLDI0LDMxCisJbGJ6eAkkYWNjMDIsJFRibDIsJGFjYzAyCisJbGJ6eAkkYWNjMDMsJFRibDIsJGFjYzAzCisJcmx3aW5tCSRhY2MxMCwkczAsYDMyLThgLDI0LDMxCisJcmx3aW5tCSRhY2MxMSwkczEsYDMyLThgLDI0LDMxCisJbGJ6eAkkYWNjMDQsJFRibDIsJGFjYzA0CisJbGJ6eAkkYWNjMDUsJFRibDIsJGFjYzA1CisJcmx3aW5tCSRhY2MxMiwkczEsYDBgLDI0LDMxCisJcmx3aW5tCSRhY2MxMywkczIsYDBgLDI0LDMxCisJbGJ6eAkkYWNjMDYsJFRibDIsJGFjYzA2CisJbGJ6eAkkYWNjMDcsJFRibDIsJGFjYzA3CisJcmx3aW5tCSRhY2MxNCwkczMsYDBgLDI0LDMxCisJcmx3aW5tCSRhY2MxNSwkczAsYDBgLDI0LDMxCisJbGJ6eAkkYWNjMDgsJFRibDIsJGFjYzA4CisJbGJ6eAkkYWNjMDksJFRibDIsJGFjYzA5CisJcmx3aW5tCSRzMCwkYWNjMDAsMjQsMCw3CisJcmx3aW5tCSRzMSwkYWNjMDEsMjQsMCw3CisJbGJ6eAkkYWNjMTAsJFRibDIsJGFjYzEwCisJbGJ6eAkkYWNjMTEsJFRibDIsJGFjYzExCisJcmx3aW5tCSRzMiwkYWNjMDIsMjQsMCw3CisJcmx3aW5tCSRzMywkYWNjMDMsMjQsMCw3CisJbGJ6eAkkYWNjMTIsJFRibDIsJGFjYzEyCisJbGJ6eAkkYWNjMTMsJFRibDIsJGFjYzEzCisJcmx3aW1pCSRzMCwkYWNjMDQsMTYsOCwxNQorCXJsd2ltaQkkczEsJGFjYzA1LDE2LDgsMTUKKwlsYnp4CSRhY2MxNCwkVGJsMiwkYWNjMTQKKwlsYnp4CSRhY2MxNSwkVGJsMiwkYWNjMTUKKwlybHdpbWkJJHMyLCRhY2MwNiwxNiw4LDE1CisJcmx3aW1pCSRzMywkYWNjMDcsMTYsOCwxNQorCXJsd2ltaQkkczAsJGFjYzA4LDgsMTYsMjMKKwlybHdpbWkJJHMxLCRhY2MwOSw4LDE2LDIzCisJcmx3aW1pCSRzMiwkYWNjMTAsOCwxNiwyMworCXJsd2ltaQkkczMsJGFjYzExLDgsMTYsMjMKKwlvcgkkczAsJHMwLCRhY2MxMgorCW9yCSRzMSwkczEsJGFjYzEzCisJb3IJJHMyLCRzMiwkYWNjMTQKKwlvcgkkczMsJHMzLCRhY2MxNQorCXhvcgkkczAsJHMwLCR0MAorCXhvcgkkczEsJHMxLCR0MQorCXhvcgkkczIsJHMyLCR0MgorCXhvcgkkczMsJHMzLCR0MworCWJscgorCisuYWxpZ24JNAorTHBwY19BRVNfZGVjcnlwdF9jb21wYWN0OgorCWx3egkkYWNjMDAsMjQwKCRrZXkpCisJbHd6CSR0MCwwKCRrZXkpCisJbHd6CSR0MSw0KCRrZXkpCisJbHd6CSR0Miw4KCRrZXkpCisJbHd6CSR0MywxMigka2V5KQorCWFkZGkJJFRibDEsJFRibDAsMjA0OAorCWxpcwkkbWFzazgwLDB4ODA4MAorCWxpcwkkbWFzazFiLDB4MWIxYgorCWFkZGkJJGtleSwka2V5LDE2CisJb3JpCSRtYXNrODAsJG1hc2s4MCwweDgwODAKKwlvcmkJJG1hc2sxYiwkbWFzazFiLDB4MWIxYgorX19fCiskY29kZS49PDxfX18gaWYgKCRTSVpFX1Q9PTgpOworCWluc3JkaQkkbWFzazgwLCRtYXNrODAsMzIsMAorCWluc3JkaQkkbWFzazFiLCRtYXNrMWIsMzIsMAorX19fCiskY29kZS49PDxfX187CisJbXRjdHIJJGFjYzAwCisuYWxpZ24JNAorTGRlY19jb21wYWN0X2xvb3A6CisJeG9yCSRzMCwkczAsJHQwCisJeG9yCSRzMSwkczEsJHQxCisJeG9yCSRzMiwkczIsJHQyCisJeG9yCSRzMywkczMsJHQzCisJcmx3aW5tCSRhY2MwMCwkczAsYDMyLTI0YCwyNCwzMQorCXJsd2lubQkkYWNjMDEsJHMxLGAzMi0yNGAsMjQsMzEKKwlybHdpbm0JJGFjYzAyLCRzMixgMzItMjRgLDI0LDMxCisJcmx3aW5tCSRhY2MwMywkczMsYDMyLTI0YCwyNCwzMQorCXJsd2lubQkkYWNjMDQsJHMzLGAzMi0xNmAsMjQsMzEKKwlybHdpbm0JJGFjYzA1LCRzMCxgMzItMTZgLDI0LDMxCisJcmx3aW5tCSRhY2MwNiwkczEsYDMyLTE2YCwyNCwzMQorCXJsd2lubQkkYWNjMDcsJHMyLGAzMi0xNmAsMjQsMzEKKwlsYnp4CSRhY2MwMCwkVGJsMSwkYWNjMDAKKwlsYnp4CSRhY2MwMSwkVGJsMSwkYWNjMDEKKwlybHdpbm0JJGFjYzA4LCRzMixgMzItOGAsMjQsMzEKKwlybHdpbm0JJGFjYzA5LCRzMyxgMzItOGAsMjQsMzEKKwlsYnp4CSRhY2MwMiwkVGJsMSwkYWNjMDIKKwlsYnp4CSRhY2MwMywkVGJsMSwkYWNjMDMKKwlybHdpbm0JJGFjYzEwLCRzMCxgMzItOGAsMjQsMzEKKwlybHdpbm0JJGFjYzExLCRzMSxgMzItOGAsMjQsMzEKKwlsYnp4CSRhY2MwNCwkVGJsMSwkYWNjMDQKKwlsYnp4CSRhY2MwNSwkVGJsMSwkYWNjMDUKKwlybHdpbm0JJGFjYzEyLCRzMSxgMGAsMjQsMzEKKwlybHdpbm0JJGFjYzEzLCRzMixgMGAsMjQsMzEKKwlsYnp4CSRhY2MwNiwkVGJsMSwkYWNjMDYKKwlsYnp4CSRhY2MwNywkVGJsMSwkYWNjMDcKKwlybHdpbm0JJGFjYzE0LCRzMyxgMGAsMjQsMzEKKwlybHdpbm0JJGFjYzE1LCRzMCxgMGAsMjQsMzEKKwlsYnp4CSRhY2MwOCwkVGJsMSwkYWNjMDgKKwlsYnp4CSRhY2MwOSwkVGJsMSwkYWNjMDkKKwlybHdpbm0JJHMwLCRhY2MwMCwyNCwwLDcKKwlybHdpbm0JJHMxLCRhY2MwMSwyNCwwLDcKKwlsYnp4CSRhY2MxMCwkVGJsMSwkYWNjMTAKKwlsYnp4CSRhY2MxMSwkVGJsMSwkYWNjMTEKKwlybHdpbm0JJHMyLCRhY2MwMiwyNCwwLDcKKwlybHdpbm0JJHMzLCRhY2MwMywyNCwwLDcKKwlsYnp4CSRhY2MxMiwkVGJsMSwkYWNjMTIKKwlsYnp4CSRhY2MxMywkVGJsMSwkYWNjMTMKKwlybHdpbWkJJHMwLCRhY2MwNCwxNiw4LDE1CisJcmx3aW1pCSRzMSwkYWNjMDUsMTYsOCwxNQorCWxiengJJGFjYzE0LCRUYmwxLCRhY2MxNAorCWxiengJJGFjYzE1LCRUYmwxLCRhY2MxNQorCXJsd2ltaQkkczIsJGFjYzA2LDE2LDgsMTUKKwlybHdpbWkJJHMzLCRhY2MwNywxNiw4LDE1CisJcmx3aW1pCSRzMCwkYWNjMDgsOCwxNiwyMworCXJsd2ltaQkkczEsJGFjYzA5LDgsMTYsMjMKKwlybHdpbWkJJHMyLCRhY2MxMCw4LDE2LDIzCisJcmx3aW1pCSRzMywkYWNjMTEsOCwxNiwyMworCWx3egkkdDAsMCgka2V5KQorCWx3egkkdDEsNCgka2V5KQorCW9yCSRzMCwkczAsJGFjYzEyCisJb3IJJHMxLCRzMSwkYWNjMTMKKwlsd3oJJHQyLDgoJGtleSkKKwlsd3oJJHQzLDEyKCRrZXkpCisJb3IJJHMyLCRzMiwkYWNjMTQKKwlvcgkkczMsJHMzLCRhY2MxNQorCisJYWRkaQkka2V5LCRrZXksMTYKKwliZHoJTGRlY19jb21wYWN0X2RvbmUKK19fXworJGNvZGUuPTw8X19fIGlmICgkU0laRV9UPT04KTsKKwkjIHZlY3Rvcml6ZWQgcGVybXV0YXRpb24gaW1wcm92ZXMgZGVjcnlwdCBwZXJmb3JtYW5jZSBieSAxMCUKKwlpbnNyZGkJJHMwLCRzMSwzMiwwCisJaW5zcmRpCSRzMiwkczMsMzIsMAorCisJYW5kCSRhY2MwMCwkczAsJG1hc2s4MAkjIHIxPXIwJjB4ODA4MDgwODAKKwlhbmQJJGFjYzAyLCRzMiwkbWFzazgwCisJc3JkaQkkYWNjMDQsJGFjYzAwLDcJCSMgcjE+PjcKKwlzcmRpCSRhY2MwNiwkYWNjMDIsNworCWFuZGMJJGFjYzA4LCRzMCwkbWFzazgwCSMgcjAmMHg3ZjdmN2Y3ZgorCWFuZGMJJGFjYzEwLCRzMiwkbWFzazgwCisJc3ViCSRhY2MwMCwkYWNjMDAsJGFjYzA0CSMgcjEtKHIxPj43KQorCXN1YgkkYWNjMDIsJGFjYzAyLCRhY2MwNgorCWFkZAkkYWNjMDgsJGFjYzA4LCRhY2MwOAkjIChyMCYweDdmN2Y3ZjdmKTw8MQorCWFkZAkkYWNjMTAsJGFjYzEwLCRhY2MxMAorCWFuZAkkYWNjMDAsJGFjYzAwLCRtYXNrMWIJIyAocjEtKHIxPj43KSkmMHgxYjFiMWIxYgorCWFuZAkkYWNjMDIsJGFjYzAyLCRtYXNrMWIKKwl4b3IJJGFjYzAwLCRhY2MwMCwkYWNjMDgJIyByMgorCXhvcgkkYWNjMDIsJGFjYzAyLCRhY2MxMAorCisJYW5kCSRhY2MwNCwkYWNjMDAsJG1hc2s4MAkjIHIxPXIyJjB4ODA4MDgwODAKKwlhbmQJJGFjYzA2LCRhY2MwMiwkbWFzazgwCisJc3JkaQkkYWNjMDgsJGFjYzA0LDcJCSMgcjE+PjcKKwlzcmRpCSRhY2MxMCwkYWNjMDYsNworCWFuZGMJJGFjYzEyLCRhY2MwMCwkbWFzazgwCSMgcjImMHg3ZjdmN2Y3ZgorCWFuZGMJJGFjYzE0LCRhY2MwMiwkbWFzazgwCisJc3ViCSRhY2MwNCwkYWNjMDQsJGFjYzA4CSMgcjEtKHIxPj43KQorCXN1YgkkYWNjMDYsJGFjYzA2LCRhY2MxMAorCWFkZAkkYWNjMTIsJGFjYzEyLCRhY2MxMgkjIChyMiYweDdmN2Y3ZjdmKTw8MQorCWFkZAkkYWNjMTQsJGFjYzE0LCRhY2MxNAorCWFuZAkkYWNjMDQsJGFjYzA0LCRtYXNrMWIJIyAocjEtKHIxPj43KSkmMHgxYjFiMWIxYgorCWFuZAkkYWNjMDYsJGFjYzA2LCRtYXNrMWIKKwl4b3IJJGFjYzA0LCRhY2MwNCwkYWNjMTIJIyByNAorCXhvcgkkYWNjMDYsJGFjYzA2LCRhY2MxNAorCisJYW5kCSRhY2MwOCwkYWNjMDQsJG1hc2s4MAkjIHIxPXI0JjB4ODA4MDgwODAKKwlhbmQJJGFjYzEwLCRhY2MwNiwkbWFzazgwCisJc3JkaQkkYWNjMTIsJGFjYzA4LDcJCSMgcjE+PjcKKwlzcmRpCSRhY2MxNCwkYWNjMTAsNworCXN1YgkkYWNjMDgsJGFjYzA4LCRhY2MxMgkjIHIxLShyMT4+NykKKwlzdWIJJGFjYzEwLCRhY2MxMCwkYWNjMTQKKwlhbmRjCSRhY2MxMiwkYWNjMDQsJG1hc2s4MAkjIHI0JjB4N2Y3ZjdmN2YKKwlhbmRjCSRhY2MxNCwkYWNjMDYsJG1hc2s4MAorCWFkZAkkYWNjMTIsJGFjYzEyLCRhY2MxMgkjIChyNCYweDdmN2Y3ZjdmKTw8MQorCWFkZAkkYWNjMTQsJGFjYzE0LCRhY2MxNAorCWFuZAkkYWNjMDgsJGFjYzA4LCRtYXNrMWIJIyAocjEtKHIxPj43KSkmMHgxYjFiMWIxYgorCWFuZAkkYWNjMTAsJGFjYzEwLCRtYXNrMWIKKwl4b3IJJGFjYzA4LCRhY2MwOCwkYWNjMTIJIyByOAorCXhvcgkkYWNjMTAsJGFjYzEwLCRhY2MxNAorCisJeG9yCSRhY2MwMCwkYWNjMDAsJHMwCSMgcjJecjAKKwl4b3IJJGFjYzAyLCRhY2MwMiwkczIKKwl4b3IJJGFjYzA0LCRhY2MwNCwkczAJIyByNF5yMAorCXhvcgkkYWNjMDYsJGFjYzA2LCRzMgorCisJZXh0cmRpCSRhY2MwMSwkYWNjMDAsMzIsMAorCWV4dHJkaQkkYWNjMDMsJGFjYzAyLDMyLDAKKwlleHRyZGkJJGFjYzA1LCRhY2MwNCwzMiwwCisJZXh0cmRpCSRhY2MwNywkYWNjMDYsMzIsMAorCWV4dHJkaQkkYWNjMDksJGFjYzA4LDMyLDAKKwlleHRyZGkJJGFjYzExLCRhY2MxMCwzMiwwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJFNJWkVfVD09NCk7CisJYW5kCSRhY2MwMCwkczAsJG1hc2s4MAkjIHIxPXIwJjB4ODA4MDgwODAKKwlhbmQJJGFjYzAxLCRzMSwkbWFzazgwCisJYW5kCSRhY2MwMiwkczIsJG1hc2s4MAorCWFuZAkkYWNjMDMsJHMzLCRtYXNrODAKKwlzcndpCSRhY2MwNCwkYWNjMDAsNwkJIyByMT4+NworCXNyd2kJJGFjYzA1LCRhY2MwMSw3CisJc3J3aQkkYWNjMDYsJGFjYzAyLDcKKwlzcndpCSRhY2MwNywkYWNjMDMsNworCWFuZGMJJGFjYzA4LCRzMCwkbWFzazgwCSMgcjAmMHg3ZjdmN2Y3ZgorCWFuZGMJJGFjYzA5LCRzMSwkbWFzazgwCisJYW5kYwkkYWNjMTAsJHMyLCRtYXNrODAKKwlhbmRjCSRhY2MxMSwkczMsJG1hc2s4MAorCXN1YgkkYWNjMDAsJGFjYzAwLCRhY2MwNAkjIHIxLShyMT4+NykKKwlzdWIJJGFjYzAxLCRhY2MwMSwkYWNjMDUKKwlzdWIJJGFjYzAyLCRhY2MwMiwkYWNjMDYKKwlzdWIJJGFjYzAzLCRhY2MwMywkYWNjMDcKKwlhZGQJJGFjYzA4LCRhY2MwOCwkYWNjMDgJIyAocjAmMHg3ZjdmN2Y3Zik8PDEKKwlhZGQJJGFjYzA5LCRhY2MwOSwkYWNjMDkKKwlhZGQJJGFjYzEwLCRhY2MxMCwkYWNjMTAKKwlhZGQJJGFjYzExLCRhY2MxMSwkYWNjMTEKKwlhbmQJJGFjYzAwLCRhY2MwMCwkbWFzazFiCSMgKHIxLShyMT4+NykpJjB4MWIxYjFiMWIKKwlhbmQJJGFjYzAxLCRhY2MwMSwkbWFzazFiCisJYW5kCSRhY2MwMiwkYWNjMDIsJG1hc2sxYgorCWFuZAkkYWNjMDMsJGFjYzAzLCRtYXNrMWIKKwl4b3IJJGFjYzAwLCRhY2MwMCwkYWNjMDgJIyByMgorCXhvcgkkYWNjMDEsJGFjYzAxLCRhY2MwOQorCXhvcgkkYWNjMDIsJGFjYzAyLCRhY2MxMAorCXhvcgkkYWNjMDMsJGFjYzAzLCRhY2MxMQorCisJYW5kCSRhY2MwNCwkYWNjMDAsJG1hc2s4MAkjIHIxPXIyJjB4ODA4MDgwODAKKwlhbmQJJGFjYzA1LCRhY2MwMSwkbWFzazgwCisJYW5kCSRhY2MwNiwkYWNjMDIsJG1hc2s4MAorCWFuZAkkYWNjMDcsJGFjYzAzLCRtYXNrODAKKwlzcndpCSRhY2MwOCwkYWNjMDQsNwkJIyByMT4+NworCXNyd2kJJGFjYzA5LCRhY2MwNSw3CisJc3J3aQkkYWNjMTAsJGFjYzA2LDcKKwlzcndpCSRhY2MxMSwkYWNjMDcsNworCWFuZGMJJGFjYzEyLCRhY2MwMCwkbWFzazgwCSMgcjImMHg3ZjdmN2Y3ZgorCWFuZGMJJGFjYzEzLCRhY2MwMSwkbWFzazgwCisJYW5kYwkkYWNjMTQsJGFjYzAyLCRtYXNrODAKKwlhbmRjCSRhY2MxNSwkYWNjMDMsJG1hc2s4MAorCXN1YgkkYWNjMDQsJGFjYzA0LCRhY2MwOAkjIHIxLShyMT4+NykKKwlzdWIJJGFjYzA1LCRhY2MwNSwkYWNjMDkKKwlzdWIJJGFjYzA2LCRhY2MwNiwkYWNjMTAKKwlzdWIJJGFjYzA3LCRhY2MwNywkYWNjMTEKKwlhZGQJJGFjYzEyLCRhY2MxMiwkYWNjMTIJIyAocjImMHg3ZjdmN2Y3Zik8PDEKKwlhZGQJJGFjYzEzLCRhY2MxMywkYWNjMTMKKwlhZGQJJGFjYzE0LCRhY2MxNCwkYWNjMTQKKwlhZGQJJGFjYzE1LCRhY2MxNSwkYWNjMTUKKwlhbmQJJGFjYzA0LCRhY2MwNCwkbWFzazFiCSMgKHIxLShyMT4+NykpJjB4MWIxYjFiMWIKKwlhbmQJJGFjYzA1LCRhY2MwNSwkbWFzazFiCisJYW5kCSRhY2MwNiwkYWNjMDYsJG1hc2sxYgorCWFuZAkkYWNjMDcsJGFjYzA3LCRtYXNrMWIKKwl4b3IJJGFjYzA0LCRhY2MwNCwkYWNjMTIJIyByNAorCXhvcgkkYWNjMDUsJGFjYzA1LCRhY2MxMworCXhvcgkkYWNjMDYsJGFjYzA2LCRhY2MxNAorCXhvcgkkYWNjMDcsJGFjYzA3LCRhY2MxNQorCisJYW5kCSRhY2MwOCwkYWNjMDQsJG1hc2s4MAkjIHIxPXI0JjB4ODA4MDgwODAKKwlhbmQJJGFjYzA5LCRhY2MwNSwkbWFzazgwCisJYW5kCSRhY2MxMCwkYWNjMDYsJG1hc2s4MAorCWFuZAkkYWNjMTEsJGFjYzA3LCRtYXNrODAKKwlzcndpCSRhY2MxMiwkYWNjMDgsNwkJIyByMT4+NworCXNyd2kJJGFjYzEzLCRhY2MwOSw3CisJc3J3aQkkYWNjMTQsJGFjYzEwLDcKKwlzcndpCSRhY2MxNSwkYWNjMTEsNworCXN1YgkkYWNjMDgsJGFjYzA4LCRhY2MxMgkjIHIxLShyMT4+NykKKwlzdWIJJGFjYzA5LCRhY2MwOSwkYWNjMTMKKwlzdWIJJGFjYzEwLCRhY2MxMCwkYWNjMTQKKwlzdWIJJGFjYzExLCRhY2MxMSwkYWNjMTUKKwlhbmRjCSRhY2MxMiwkYWNjMDQsJG1hc2s4MAkjIHI0JjB4N2Y3ZjdmN2YKKwlhbmRjCSRhY2MxMywkYWNjMDUsJG1hc2s4MAorCWFuZGMJJGFjYzE0LCRhY2MwNiwkbWFzazgwCisJYW5kYwkkYWNjMTUsJGFjYzA3LCRtYXNrODAKKwlhZGQJJGFjYzEyLCRhY2MxMiwkYWNjMTIJIyAocjQmMHg3ZjdmN2Y3Zik8PDEKKwlhZGQJJGFjYzEzLCRhY2MxMywkYWNjMTMKKwlhZGQJJGFjYzE0LCRhY2MxNCwkYWNjMTQKKwlhZGQJJGFjYzE1LCRhY2MxNSwkYWNjMTUKKwlhbmQJJGFjYzA4LCRhY2MwOCwkbWFzazFiCSMgKHIxLShyMT4+NykpJjB4MWIxYjFiMWIKKwlhbmQJJGFjYzA5LCRhY2MwOSwkbWFzazFiCisJYW5kCSRhY2MxMCwkYWNjMTAsJG1hc2sxYgorCWFuZAkkYWNjMTEsJGFjYzExLCRtYXNrMWIKKwl4b3IJJGFjYzA4LCRhY2MwOCwkYWNjMTIJIyByOAorCXhvcgkkYWNjMDksJGFjYzA5LCRhY2MxMworCXhvcgkkYWNjMTAsJGFjYzEwLCRhY2MxNAorCXhvcgkkYWNjMTEsJGFjYzExLCRhY2MxNQorCisJeG9yCSRhY2MwMCwkYWNjMDAsJHMwCSMgcjJecjAKKwl4b3IJJGFjYzAxLCRhY2MwMSwkczEKKwl4b3IJJGFjYzAyLCRhY2MwMiwkczIKKwl4b3IJJGFjYzAzLCRhY2MwMywkczMKKwl4b3IJJGFjYzA0LCRhY2MwNCwkczAJIyByNF5yMAorCXhvcgkkYWNjMDUsJGFjYzA1LCRzMQorCXhvcgkkYWNjMDYsJGFjYzA2LCRzMgorCXhvcgkkYWNjMDcsJGFjYzA3LCRzMworX19fCiskY29kZS49PDxfX187CisJcm90cndpCSRzMCwkczAsOAkJIyA9IFJPVEFURShyMCw4KQorCXJvdHJ3aQkkczEsJHMxLDgKKwlyb3Ryd2kJJHMyLCRzMiw4CisJcm90cndpCSRzMywkczMsOAorCXhvcgkkczAsJHMwLCRhY2MwMAkJIyBePSByMl5yMAorCXhvcgkkczEsJHMxLCRhY2MwMQorCXhvcgkkczIsJHMyLCRhY2MwMgorCXhvcgkkczMsJHMzLCRhY2MwMworCXhvcgkkYWNjMDAsJGFjYzAwLCRhY2MwOAorCXhvcgkkYWNjMDEsJGFjYzAxLCRhY2MwOQorCXhvcgkkYWNjMDIsJGFjYzAyLCRhY2MxMAorCXhvcgkkYWNjMDMsJGFjYzAzLCRhY2MxMQorCXhvcgkkczAsJHMwLCRhY2MwNAkJIyBePSByNF5yMAorCXhvcgkkczEsJHMxLCRhY2MwNQorCXhvcgkkczIsJHMyLCRhY2MwNgorCXhvcgkkczMsJHMzLCRhY2MwNworCXJvdHJ3aQkkYWNjMDAsJGFjYzAwLDI0CisJcm90cndpCSRhY2MwMSwkYWNjMDEsMjQKKwlyb3Ryd2kJJGFjYzAyLCRhY2MwMiwyNAorCXJvdHJ3aQkkYWNjMDMsJGFjYzAzLDI0CisJeG9yCSRhY2MwNCwkYWNjMDQsJGFjYzA4CisJeG9yCSRhY2MwNSwkYWNjMDUsJGFjYzA5CisJeG9yCSRhY2MwNiwkYWNjMDYsJGFjYzEwCisJeG9yCSRhY2MwNywkYWNjMDcsJGFjYzExCisJeG9yCSRzMCwkczAsJGFjYzA4CQkjIF49IHI4IFteKChyNF5yMCleKHIyXnIwKT1yNF5yMildCisJeG9yCSRzMSwkczEsJGFjYzA5CisJeG9yCSRzMiwkczIsJGFjYzEwCisJeG9yCSRzMywkczMsJGFjYzExCisJcm90cndpCSRhY2MwNCwkYWNjMDQsMTYKKwlyb3Ryd2kJJGFjYzA1LCRhY2MwNSwxNgorCXJvdHJ3aQkkYWNjMDYsJGFjYzA2LDE2CisJcm90cndpCSRhY2MwNywkYWNjMDcsMTYKKwl4b3IJJHMwLCRzMCwkYWNjMDAJCSMgXj0gUk9UQVRFKHI4XnIyXnIwLDI0KQorCXhvcgkkczEsJHMxLCRhY2MwMQorCXhvcgkkczIsJHMyLCRhY2MwMgorCXhvcgkkczMsJHMzLCRhY2MwMworCXJvdHJ3aQkkYWNjMDgsJGFjYzA4LDgKKwlyb3Ryd2kJJGFjYzA5LCRhY2MwOSw4CisJcm90cndpCSRhY2MxMCwkYWNjMTAsOAorCXJvdHJ3aQkkYWNjMTEsJGFjYzExLDgKKwl4b3IJJHMwLCRzMCwkYWNjMDQJCSMgXj0gUk9UQVRFKHI4XnI0XnIwLDE2KQorCXhvcgkkczEsJHMxLCRhY2MwNQorCXhvcgkkczIsJHMyLCRhY2MwNgorCXhvcgkkczMsJHMzLCRhY2MwNworCXhvcgkkczAsJHMwLCRhY2MwOAkJIyBePSBST1RBVEUocjgsOCkJCisJeG9yCSRzMSwkczEsJGFjYzA5CQorCXhvcgkkczIsJHMyLCRhY2MxMAkKKwl4b3IJJHMzLCRzMywkYWNjMTEJCisKKwliCUxkZWNfY29tcGFjdF9sb29wCisuYWxpZ24JNAorTGRlY19jb21wYWN0X2RvbmU6CisJeG9yCSRzMCwkczAsJHQwCisJeG9yCSRzMSwkczEsJHQxCisJeG9yCSRzMiwkczIsJHQyCisJeG9yCSRzMywkczMsJHQzCisJYmxyCisubG9uZwkwCisuYXNjaXoJIkFFUyBmb3IgUFBDLCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorLmFsaWduCTcKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLXMzOTB4LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLXMzOTB4LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDE4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMtczM5MHgucGwKQEAgLTAsMCArMSwxMzM5IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQUVTIGZvciBzMzkweC4KKworIyBBcHJpbCAyMDA3LgorIworIyBTb2Z0d2FyZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGdjYy1nZW5lcmF0ZWQgY29kZSBpcyB+NzAlIGFuZAorIyBpbiBhYnNvbHV0ZSB0ZXJtcyBpcyB+NzMgY3ljbGVzIHBlciBieXRlIHByb2Nlc3NlZCB3aXRoIDEyOC1iaXQga2V5LgorIyBZb3UncmUgbGlrZWx5IHRvIGV4Y2xhaW0gIndoeSBzbyBzbG93PyIgS2VlcCBpbiBtaW5kIHRoYXQgei1DUFVzIGFyZQorIyAqc3RyaWN0bHkqIGluLW9yZGVyIGV4ZWN1dGlvbiBhbmQgaXNzdWVkIGluc3RydWN0aW9uIFtpbiB0aGlzIGNhc2UKKyMgbG9hZCB2YWx1ZSBmcm9tIG1lbW9yeSBpcyBjcml0aWNhbF0gaGFzIHRvIGNvbXBsZXRlIGJlZm9yZSBleGVjdXRpb24KKyMgZmxvdyBwcm9jZWVkcy4gUy1ib3hlcyBhcmUgY29tcHJlc3NlZCB0byAyS0JbKzI1NkJdLgorIworIyBBcyBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIHN1cHBvcnQuIEl0J3MgYmFzaWNhbGx5IGEgInRlYXNlciwiIGFzCisjIGl0IGNhbiBhbmQgc2hvdWxkIGJlIGltcHJvdmVkIGluIHNldmVyYWwgd2F5cy4gTW9zdCBub3RhYmx5IHN1cHBvcnQKKyMgZm9yIENCQyBpcyBub3QgdXRpbGl6ZWQsIG5vciBtdWx0aXBsZSBibG9ja3MgYXJlIGV2ZXIgcHJvY2Vzc2VkLgorIyBUaGVuIHNvZnR3YXJlIGtleSBzY2hlZHVsZSBjYW4gYmUgcG9zdHBvbmVkIHRpbGwgaGFyZHdhcmUgc3VwcG9ydAorIyBkZXRlY3Rpb24uLi4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb3ZlciBhc3NlbWJsZXIgaXMgcmVwb3J0ZWRseQorIyB+Mi41eCwgYnV0IGNhbiByZWFjaCA+OHggW25hdHVyYWxseSBvbiBsYXJnZXIgY2h1bmtzXSBpZiBwcm9wZXIKKyMgc3VwcG9ydCBpcyBpbXBsZW1lbnRlZC4KKworIyBNYXkgMjAwNy4KKyMKKyMgSW1wbGVtZW50IEFFU19zZXRfW2VufGRlXWNyeXB0X2tleS4gS2V5IHNjaGVkdWxlIHNldHVwIGlzIGF2b2lkZWQKKyMgZm9yIDEyOC1iaXQga2V5cywgaWYgaGFyZHdhcmUgc3VwcG9ydCBpcyBkZXRlY3RlZC4KKworIyBKYW51cmF5IDIwMDkuCisjCisjIEFkZCBzdXBwb3J0IGZvciBoYXJkd2FyZSBBRVMxOTIvMjU2IGFuZCByZXNjaGVkdWxlIGluc3RydWN0aW9ucyB0bworIyBtaW5pbWl6ZS9hdm9pZCBBZGRyZXNzIEdlbmVyYXRpb24gSW50ZXJsb2NrIGhhemFyZCBhbmQgdG8gZmF2b3VyCisjIGR1YWwtaXNzdWUgejEwIHBpcGVsaW5lLiBUaGlzIGdhdmUgfjI1JSBpbXByb3ZlbWVudCBvbiB6MTAgYW5kCisjIGFsbW9zdCA1MCUgb24gejkuIFRoZSBnYWluIGlzIHNtYWxsZXIgb24gejEwLCBiZWNhdXNlIGJlaW5nIGR1YWwtCisjIGlzc3VlIHoxMCBtYWtlcyBpdCBpbXByb3NzaWJsZSB0byBlbGltaW5hdGUgdGhlIGludGVybG9jayBjb25kaXRpb246CisjIGNyaXRpYWwgcGF0aCBpcyBub3QgbG9uZyBlbm91Z2guIFlldCBpdCBzcGVuZHMgfjI0IGN5Y2xlcyBwZXIgYnl0ZQorIyBwcm9jZXNzZWQgd2l0aCAxMjgtYml0IGtleS4KKyMKKyMgVW5saWtlIHByZXZpb3VzIHZlcnNpb24gaGFyZHdhcmUgc3VwcG9ydCBkZXRlY3Rpb24gdGFrZXMgcGxhY2Ugb25seQorIyBhdCB0aGUgbW9tZW50IG9mIGtleSBzY2hlZHVsZSBzZXR1cCwgd2hpY2ggaXMgZGVub3RlZCBpbiBrZXktPnJvdW5kcy4KKyMgVGhpcyBpcyBkb25lLCBiZWNhdXNlIGRlZmVycmVkIGtleSBzZXR1cCBjYW4ndCBiZSBtYWRlIE1ULXNhZmUsIG5vdAorIyBmb3Iga2V5IGxlbmd0aGVzIGxvbmdlciB0aGFuIDEyOCBiaXRzLgorIworIyBBZGQgQUVTX2NiY19lbmNyeXB0LCB3aGljaCBnaXZlcyBpbmNyZWRpYmxlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LAorIyBpdCB3YXMgbWVhc3VyZWQgdG8gYmUgfjYuNnguIEl0J3MgbGVzcyB0aGFuIHByZXZpb3VzbHkgbWVudGlvbmVkIDh4LAorIyBiZWNhdXNlIHNvZnR3YXJlIGltcGxlbWVudGF0aW9uIHdhcyBvcHRpbWl6ZWQuCisKKyRzb2Z0b25seT0wOwkjIGFsbG93IGhhcmR3YXJlIHN1cHBvcnQKKworJHQwPSIlcjAiOwkkbWFzaz0iJXIwIjsKKyR0MT0iJXIxIjsKKyR0Mj0iJXIyIjsJJGlucD0iJXIyIjsKKyR0Mz0iJXIzIjsJJG91dD0iJXIzIjsJJGJpdHM9IiVyMyI7Ciska2V5PSIlcjQiOworJGkxPSIlcjUiOworJGkyPSIlcjYiOworJGkzPSIlcjciOworJHMwPSIlcjgiOworJHMxPSIlcjkiOworJHMyPSIlcjEwIjsKKyRzMz0iJXIxMSI7CiskdGJsPSIlcjEyIjsKKyRyb3VuZHM9IiVyMTMiOworJHJhPSIlcjE0IjsKKyRzcD0iJXIxNSI7CisKK3N1YiBfZGF0YV93b3JkKCkKK3sgbXkgJGk7CisgICAgd2hpbGUoZGVmaW5lZCgkaT1zaGlmdCkpIHsgJGNvZGUuPXNwcmludGYiLmxvbmdcdDB4JTA4eCwweCUwOHhcbiIsJGksJGk7IH0KK30KKworJGNvZGU9PDxfX187CisudGV4dAorCisudHlwZQlBRVNfVGUsXEBvYmplY3QKKy5hbGlnbgkyNTYKK0FFU19UZToKK19fXworJl9kYXRhX3dvcmQoCisJMHhjNjYzNjNhNSwgMHhmODdjN2M4NCwgMHhlZTc3Nzc5OSwgMHhmNjdiN2I4ZCwKKwkweGZmZjJmMjBkLCAweGQ2NmI2YmJkLCAweGRlNmY2ZmIxLCAweDkxYzVjNTU0LAorCTB4NjAzMDMwNTAsIDB4MDIwMTAxMDMsIDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QsCisJMHhlN2ZlZmUxOSwgMHhiNWQ3ZDc2MiwgMHg0ZGFiYWJlNiwgMHhlYzc2NzY5YSwKKwkweDhmY2FjYTQ1LCAweDFmODI4MjlkLCAweDg5YzljOTQwLCAweGZhN2Q3ZDg3LAorCTB4ZWZmYWZhMTUsIDB4YjI1OTU5ZWIsIDB4OGU0NzQ3YzksIDB4ZmJmMGYwMGIsCisJMHg0MWFkYWRlYywgMHhiM2Q0ZDQ2NywgMHg1ZmEyYTJmZCwgMHg0NWFmYWZlYSwKKwkweDIzOWM5Y2JmLCAweDUzYTRhNGY3LCAweGU0NzI3Mjk2LCAweDliYzBjMDViLAorCTB4NzViN2I3YzIsIDB4ZTFmZGZkMWMsIDB4M2Q5MzkzYWUsIDB4NGMyNjI2NmEsCisJMHg2YzM2MzY1YSwgMHg3ZTNmM2Y0MSwgMHhmNWY3ZjcwMiwgMHg4M2NjY2M0ZiwKKwkweDY4MzQzNDVjLCAweDUxYTVhNWY0LCAweGQxZTVlNTM0LCAweGY5ZjFmMTA4LAorCTB4ZTI3MTcxOTMsIDB4YWJkOGQ4NzMsIDB4NjIzMTMxNTMsIDB4MmExNTE1M2YsCisJMHgwODA0MDQwYywgMHg5NWM3Yzc1MiwgMHg0NjIzMjM2NSwgMHg5ZGMzYzM1ZSwKKwkweDMwMTgxODI4LCAweDM3OTY5NmExLCAweDBhMDUwNTBmLCAweDJmOWE5YWI1LAorCTB4MGUwNzA3MDksIDB4MjQxMjEyMzYsIDB4MWI4MDgwOWIsIDB4ZGZlMmUyM2QsCisJMHhjZGViZWIyNiwgMHg0ZTI3Mjc2OSwgMHg3ZmIyYjJjZCwgMHhlYTc1NzU5ZiwKKwkweDEyMDkwOTFiLCAweDFkODM4MzllLCAweDU4MmMyYzc0LCAweDM0MWExYTJlLAorCTB4MzYxYjFiMmQsIDB4ZGM2ZTZlYjIsIDB4YjQ1YTVhZWUsIDB4NWJhMGEwZmIsCisJMHhhNDUyNTJmNiwgMHg3NjNiM2I0ZCwgMHhiN2Q2ZDY2MSwgMHg3ZGIzYjNjZSwKKwkweDUyMjkyOTdiLCAweGRkZTNlMzNlLCAweDVlMmYyZjcxLCAweDEzODQ4NDk3LAorCTB4YTY1MzUzZjUsIDB4YjlkMWQxNjgsIDB4MDAwMDAwMDAsIDB4YzFlZGVkMmMsCisJMHg0MDIwMjA2MCwgMHhlM2ZjZmMxZiwgMHg3OWIxYjFjOCwgMHhiNjViNWJlZCwKKwkweGQ0NmE2YWJlLCAweDhkY2JjYjQ2LCAweDY3YmViZWQ5LCAweDcyMzkzOTRiLAorCTB4OTQ0YTRhZGUsIDB4OTg0YzRjZDQsIDB4YjA1ODU4ZTgsIDB4ODVjZmNmNGEsCisJMHhiYmQwZDA2YiwgMHhjNWVmZWYyYSwgMHg0ZmFhYWFlNSwgMHhlZGZiZmIxNiwKKwkweDg2NDM0M2M1LCAweDlhNGQ0ZGQ3LCAweDY2MzMzMzU1LCAweDExODU4NTk0LAorCTB4OGE0NTQ1Y2YsIDB4ZTlmOWY5MTAsIDB4MDQwMjAyMDYsIDB4ZmU3ZjdmODEsCisJMHhhMDUwNTBmMCwgMHg3ODNjM2M0NCwgMHgyNTlmOWZiYSwgMHg0YmE4YThlMywKKwkweGEyNTE1MWYzLCAweDVkYTNhM2ZlLCAweDgwNDA0MGMwLCAweDA1OGY4ZjhhLAorCTB4M2Y5MjkyYWQsIDB4MjE5ZDlkYmMsIDB4NzAzODM4NDgsIDB4ZjFmNWY1MDQsCisJMHg2M2JjYmNkZiwgMHg3N2I2YjZjMSwgMHhhZmRhZGE3NSwgMHg0MjIxMjE2MywKKwkweDIwMTAxMDMwLCAweGU1ZmZmZjFhLCAweGZkZjNmMzBlLCAweGJmZDJkMjZkLAorCTB4ODFjZGNkNGMsIDB4MTgwYzBjMTQsIDB4MjYxMzEzMzUsIDB4YzNlY2VjMmYsCisJMHhiZTVmNWZlMSwgMHgzNTk3OTdhMiwgMHg4ODQ0NDRjYywgMHgyZTE3MTczOSwKKwkweDkzYzRjNDU3LCAweDU1YTdhN2YyLCAweGZjN2U3ZTgyLCAweDdhM2QzZDQ3LAorCTB4Yzg2NDY0YWMsIDB4YmE1ZDVkZTcsIDB4MzIxOTE5MmIsIDB4ZTY3MzczOTUsCisJMHhjMDYwNjBhMCwgMHgxOTgxODE5OCwgMHg5ZTRmNGZkMSwgMHhhM2RjZGM3ZiwKKwkweDQ0MjIyMjY2LCAweDU0MmEyYTdlLCAweDNiOTA5MGFiLCAweDBiODg4ODgzLAorCTB4OGM0NjQ2Y2EsIDB4YzdlZWVlMjksIDB4NmJiOGI4ZDMsIDB4MjgxNDE0M2MsCisJMHhhN2RlZGU3OSwgMHhiYzVlNWVlMiwgMHgxNjBiMGIxZCwgMHhhZGRiZGI3NiwKKwkweGRiZTBlMDNiLCAweDY0MzIzMjU2LCAweDc0M2EzYTRlLCAweDE0MGEwYTFlLAorCTB4OTI0OTQ5ZGIsIDB4MGMwNjA2MGEsIDB4NDgyNDI0NmMsIDB4Yjg1YzVjZTQsCisJMHg5ZmMyYzI1ZCwgMHhiZGQzZDM2ZSwgMHg0M2FjYWNlZiwgMHhjNDYyNjJhNiwKKwkweDM5OTE5MWE4LCAweDMxOTU5NWE0LCAweGQzZTRlNDM3LCAweGYyNzk3OThiLAorCTB4ZDVlN2U3MzIsIDB4OGJjOGM4NDMsIDB4NmUzNzM3NTksIDB4ZGE2ZDZkYjcsCisJMHgwMThkOGQ4YywgMHhiMWQ1ZDU2NCwgMHg5YzRlNGVkMiwgMHg0OWE5YTllMCwKKwkweGQ4NmM2Y2I0LCAweGFjNTY1NmZhLCAweGYzZjRmNDA3LCAweGNmZWFlYTI1LAorCTB4Y2E2NTY1YWYsIDB4ZjQ3YTdhOGUsIDB4NDdhZWFlZTksIDB4MTAwODA4MTgsCisJMHg2ZmJhYmFkNSwgMHhmMDc4Nzg4OCwgMHg0YTI1MjU2ZiwgMHg1YzJlMmU3MiwKKwkweDM4MWMxYzI0LCAweDU3YTZhNmYxLCAweDczYjRiNGM3LCAweDk3YzZjNjUxLAorCTB4Y2JlOGU4MjMsIDB4YTFkZGRkN2MsIDB4ZTg3NDc0OWMsIDB4M2UxZjFmMjEsCisJMHg5NjRiNGJkZCwgMHg2MWJkYmRkYywgMHgwZDhiOGI4NiwgMHgwZjhhOGE4NSwKKwkweGUwNzA3MDkwLCAweDdjM2UzZTQyLCAweDcxYjViNWM0LCAweGNjNjY2NmFhLAorCTB4OTA0ODQ4ZDgsIDB4MDYwMzAzMDUsIDB4ZjdmNmY2MDEsIDB4MWMwZTBlMTIsCisJMHhjMjYxNjFhMywgMHg2YTM1MzU1ZiwgMHhhZTU3NTdmOSwgMHg2OWI5YjlkMCwKKwkweDE3ODY4NjkxLCAweDk5YzFjMTU4LCAweDNhMWQxZDI3LCAweDI3OWU5ZWI5LAorCTB4ZDllMWUxMzgsIDB4ZWJmOGY4MTMsIDB4MmI5ODk4YjMsIDB4MjIxMTExMzMsCisJMHhkMjY5NjliYiwgMHhhOWQ5ZDk3MCwgMHgwNzhlOGU4OSwgMHgzMzk0OTRhNywKKwkweDJkOWI5YmI2LCAweDNjMWUxZTIyLCAweDE1ODc4NzkyLCAweGM5ZTllOTIwLAorCTB4ODdjZWNlNDksIDB4YWE1NTU1ZmYsIDB4NTAyODI4NzgsIDB4YTVkZmRmN2EsCisJMHgwMzhjOGM4ZiwgMHg1OWExYTFmOCwgMHgwOTg5ODk4MCwgMHgxYTBkMGQxNywKKwkweDY1YmZiZmRhLCAweGQ3ZTZlNjMxLCAweDg0NDI0MmM2LCAweGQwNjg2OGI4LAorCTB4ODI0MTQxYzMsIDB4Mjk5OTk5YjAsIDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEsCisJMHg3YmIwYjBjYiwgMHhhODU0NTRmYywgMHg2ZGJiYmJkNiwgMHgyYzE2MTYzYSk7CiskY29kZS49PDxfX187CisjIFRlNFsyNTZdCisuYnl0ZQkweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1CisuYnl0ZQkweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2CisuYnl0ZQkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwCisuYnl0ZQkweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwCisuYnl0ZQkweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjCisuYnl0ZQkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1CisuYnl0ZQkweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhCisuYnl0ZQkweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1CisuYnl0ZQkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwCisuYnl0ZQkweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0CisuYnl0ZQkweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViCisuYnl0ZQkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmCisuYnl0ZQkweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1CisuYnl0ZQkweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4CisuYnl0ZQkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1CisuYnl0ZQkweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyCisuYnl0ZQkweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3CisuYnl0ZQkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczCisuYnl0ZQkweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4CisuYnl0ZQkweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiCisuYnl0ZQkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjCisuYnl0ZQkweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5CisuYnl0ZQkweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5CisuYnl0ZQkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4CisuYnl0ZQkweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2CisuYnl0ZQkweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhCisuYnl0ZQkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlCisuYnl0ZQkweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllCisuYnl0ZQkweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0CisuYnl0ZQkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmCisuYnl0ZQkweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4CisuYnl0ZQkweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2CisjIHJjb25bXQorLmxvbmcJMHgwMTAwMDAwMCwgMHgwMjAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwODAwMDAwMAorLmxvbmcJMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMAorLmxvbmcJMHgxQjAwMDAwMCwgMHgzNjAwMDAwMCwgMCwgMCwgMCwgMCwgMCwgMAorLmFsaWduCTI1NgorLnNpemUJQUVTX1RlLC4tQUVTX1RlCisKKyMgdm9pZCBBRVNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbnAsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyMgCQkgY29uc3QgQUVTX0tFWSAqa2V5KSB7CisuZ2xvYmwJQUVTX2VuY3J5cHQKKy50eXBlCUFFU19lbmNyeXB0LFxAZnVuY3Rpb24KK0FFU19lbmNyeXB0OgorX19fCiskY29kZS49PDxfX18gaWYgKCEkc29mdG9ubHkpOworCWwJJXIwLDI0MCgka2V5KQorCWxoaQklcjEsMTYKKwljbHIJJXIwLCVyMQorCWpsCS5MZXNvZnQKKworCWxhCSVyMSwwKCRrZXkpCisJI2xhCSVyMiwwKCRpbnApCisJbGEJJXI0LDAoJG91dCkKKwlsZ2hpCSVyMywxNgkJIyBzaW5nbGUgYmxvY2sgbGVuZ3RoCisJLmxvbmcJMHhiOTJlMDA0MgkjIGttICVyNCwlcjIKKwlicmMJMSwuLTQJCSMgY2FuIHRoaXMgaGFwcGVuPworCWJyCSVyMTQKKy5hbGlnbgk2NAorLkxlc29mdDoKK19fXworJGNvZGUuPTw8X19fOworCXN0bWcJJXIzLCRyYSwyNCgkc3ApCisKKwlsbGdmCSRzMCwwKCRpbnApCisJbGxnZgkkczEsNCgkaW5wKQorCWxsZ2YJJHMyLDgoJGlucCkKKwlsbGdmCSRzMywxMigkaW5wKQorCisJbGFybAkkdGJsLEFFU19UZQorCWJyYXMJJHJhLF9zMzkweF9BRVNfZW5jcnlwdAorCisJbGcJJG91dCwyNCgkc3ApCisJc3QJJHMwLDAoJG91dCkKKwlzdAkkczEsNCgkb3V0KQorCXN0CSRzMiw4KCRvdXQpCisJc3QJJHMzLDEyKCRvdXQpCisKKwlsbWcJJXI2LCRyYSw0OCgkc3ApCisJYnIJJHJhCisuc2l6ZQlBRVNfZW5jcnlwdCwuLUFFU19lbmNyeXB0CisKKy50eXBlICAgX3MzOTB4X0FFU19lbmNyeXB0LFxAZnVuY3Rpb24KKy5hbGlnbgkxNgorX3MzOTB4X0FFU19lbmNyeXB0OgorCXN0ZwkkcmEsMTUyKCRzcCkKKwl4CSRzMCwwKCRrZXkpCisJeAkkczEsNCgka2V5KQorCXgJJHMyLDgoJGtleSkKKwl4CSRzMywxMigka2V5KQorCWwJJHJvdW5kcywyNDAoJGtleSkKKwlsbGlsbAkkbWFzayxgMHhmZjw8M2AKKwlhZ2hpCSRyb3VuZHMsLTEKKwlqCS5MZW5jX2xvb3AKKy5hbGlnbgkxNgorLkxlbmNfbG9vcDoKKwlzbGxnCSR0MSwkczAsYDArM2AKKwlzcmxnCSR0MiwkczAsYDgtM2AKKwlzcmxnCSR0MywkczAsYDE2LTNgCisJc3JsCSRzMCxgMjQtM2AKKwlucgkkczAsJG1hc2sKKwluZ3IJJHQxLCRtYXNrCisJbnIJJHQyLCRtYXNrCisJbnIJJHQzLCRtYXNrCisKKwlzcmxnCSRpMSwkczEsYDE2LTNgCSMgaTAKKwlzbGxnCSRpMiwkczEsYDArM2AKKwlzcmxnCSRpMywkczEsYDgtM2AKKwlzcmwJJHMxLGAyNC0zYAorCW5yCSRpMSwkbWFzaworCW5yCSRzMSwkbWFzaworCW5ncgkkaTIsJG1hc2sKKwlucgkkaTMsJG1hc2sKKworCWwJJHMwLDAoJHMwLCR0YmwpCSMgVGUwW3MwPj4yNF0KKwlsCSR0MSwxKCR0MSwkdGJsKQkjIFRlM1tzMD4+MF0KKwlsCSR0MiwyKCR0MiwkdGJsKSAjIFRlMltzMD4+OF0KKwlsCSR0MywzKCR0MywkdGJsKQkjIFRlMVtzMD4+MTZdCisKKwl4CSRzMCwzKCRpMSwkdGJsKQkjIFRlMVtzMT4+MTZdCisJbAkkczEsMCgkczEsJHRibCkJIyBUZTBbczE+PjI0XQorCXgJJHQyLDEoJGkyLCR0YmwpCSMgVGUzW3MxPj4wXQorCXgJJHQzLDIoJGkzLCR0YmwpCSMgVGUyW3MxPj44XQorCisJc3JsZwkkaTEsJHMyLGA4LTNgCSMgaTAKKwlzcmxnCSRpMiwkczIsYDE2LTNgCSMgaTEKKwlucgkkaTEsJG1hc2sKKwlucgkkaTIsJG1hc2sKKwlzbGxnCSRpMywkczIsYDArM2AKKwlzcmwJJHMyLGAyNC0zYAorCW5yCSRzMiwkbWFzaworCW5ncgkkaTMsJG1hc2sKKworCXhyCSRzMSwkdDEKKwlzcmxnCSRyYSwkczMsYDgtM2AJIyBpMQorCXNsbGcJJHQxLCRzMyxgMCszYAkjIGkwCisJbnIJJHJhLCRtYXNrCisJbGEJJGtleSwxNigka2V5KQorCW5ncgkkdDEsJG1hc2sKKworCXgJJHMwLDIoJGkxLCR0YmwpCSMgVGUyW3MyPj44XQorCXgJJHMxLDMoJGkyLCR0YmwpCSMgVGUxW3MyPj4xNl0KKwlsCSRzMiwwKCRzMiwkdGJsKQkjIFRlMFtzMj4+MjRdCisJeAkkdDMsMSgkaTMsJHRibCkJIyBUZTNbczI+PjBdCisKKwlzcmxnCSRpMywkczMsYDE2LTNgCSMgaTIKKwl4cgkkczIsJHQyCisJc3JsCSRzMyxgMjQtM2AKKwlucgkkaTMsJG1hc2sKKwlucgkkczMsJG1hc2sKKworCXgJJHMwLDAoJGtleSkKKwl4CSRzMSw0KCRrZXkpCisJeAkkczIsOCgka2V5KQorCXgJJHQzLDEyKCRrZXkpCisKKwl4CSRzMCwxKCR0MSwkdGJsKQkjIFRlM1tzMz4+MF0KKwl4CSRzMSwyKCRyYSwkdGJsKQkjIFRlMltzMz4+OF0KKwl4CSRzMiwzKCRpMywkdGJsKQkjIFRlMVtzMz4+MTZdCisJbAkkczMsMCgkczMsJHRibCkJIyBUZTBbczM+PjI0XQorCXhyCSRzMywkdDMKKworCWJyY3QJJHJvdW5kcywuTGVuY19sb29wCisJLmFsaWduCTE2CisKKwlzbGxnCSR0MSwkczAsYDArM2AKKwlzcmxnCSR0MiwkczAsYDgtM2AKKwluZ3IJJHQxLCRtYXNrCisJc3JsZwkkdDMsJHMwLGAxNi0zYAorCXNybAkkczAsYDI0LTNgCisJbnIJJHMwLCRtYXNrCisJbnIJJHQyLCRtYXNrCisJbnIJJHQzLCRtYXNrCisKKwlzcmxnCSRpMSwkczEsYDE2LTNgCSMgaTAKKwlzbGxnCSRpMiwkczEsYDArM2AKKwluZ3IJJGkyLCRtYXNrCisJc3JsZwkkaTMsJHMxLGA4LTNgCisJc3JsCSRzMSxgMjQtM2AKKwlucgkkaTEsJG1hc2sKKwlucgkkczEsJG1hc2sKKwlucgkkaTMsJG1hc2sKKworCWxsZ2MJJHMwLDIoJHMwLCR0YmwpCSMgVGU0W3MwPj4yNF0KKwlsbGdjCSR0MSwyKCR0MSwkdGJsKQkjIFRlNFtzMD4+MF0KKwlzbGwJJHMwLDI0CisJbGxnYwkkdDIsMigkdDIsJHRibCkJIyBUZTRbczA+PjhdCisJbGxnYwkkdDMsMigkdDMsJHRibCkJIyBUZTRbczA+PjE2XQorCXNsbAkkdDIsOAorCXNsbAkkdDMsMTYKKworCWxsZ2MJJGkxLDIoJGkxLCR0YmwpCSMgVGU0W3MxPj4xNl0KKwlsbGdjCSRzMSwyKCRzMSwkdGJsKQkjIFRlNFtzMT4+MjRdCisJbGxnYwkkaTIsMigkaTIsJHRibCkJIyBUZTRbczE+PjBdCisJbGxnYwkkaTMsMigkaTMsJHRibCkJIyBUZTRbczE+PjhdCisJc2xsCSRpMSwxNgorCXNsbAkkczEsMjQKKwlzbGwJJGkzLDgKKwlvcgkkczAsJGkxCisJb3IJJHMxLCR0MQorCW9yCSR0MiwkaTIKKwlvcgkkdDMsJGkzCisJCisJc3JsZwkkaTEsJHMyLGA4LTNgCSMgaTAKKwlzcmxnCSRpMiwkczIsYDE2LTNgCSMgaTEKKwlucgkkaTEsJG1hc2sKKwlucgkkaTIsJG1hc2sKKwlzbGxnCSRpMywkczIsYDArM2AKKwlzcmwJJHMyLGAyNC0zYAorCW5ncgkkaTMsJG1hc2sKKwlucgkkczIsJG1hc2sKKworCXNsbGcJJHQxLCRzMyxgMCszYAkjIGkwCisJc3JsZwkkcmEsJHMzLGA4LTNgCSMgaTEKKwluZ3IJJHQxLCRtYXNrCisKKwlsbGdjCSRpMSwyKCRpMSwkdGJsKQkjIFRlNFtzMj4+OF0KKwlsbGdjCSRpMiwyKCRpMiwkdGJsKQkjIFRlNFtzMj4+MTZdCisJc2xsCSRpMSw4CisJbGxnYwkkczIsMigkczIsJHRibCkJIyBUZTRbczI+PjI0XQorCWxsZ2MJJGkzLDIoJGkzLCR0YmwpCSMgVGU0W3MyPj4wXQorCXNsbAkkaTIsMTYKKwlucgkkcmEsJG1hc2sKKwlzbGwJJHMyLDI0CisJb3IJJHMwLCRpMQorCW9yCSRzMSwkaTIKKwlvcgkkczIsJHQyCisJb3IJJHQzLCRpMworCisJc3JsZwkkaTMsJHMzLGAxNi0zYAkjIGkyCisJc3JsCSRzMyxgMjQtM2AKKwlucgkkaTMsJG1hc2sKKwlucgkkczMsJG1hc2sKKworCWwJJHQwLDE2KCRrZXkpCisJbAkkdDIsMjAoJGtleSkKKworCWxsZ2MJJGkxLDIoJHQxLCR0YmwpCSMgVGU0W3MzPj4wXQorCWxsZ2MJJGkyLDIoJHJhLCR0YmwpCSMgVGU0W3MzPj44XQorCWxsZ2MJJGkzLDIoJGkzLCR0YmwpCSMgVGU0W3MzPj4xNl0KKwlsbGdjCSRzMywyKCRzMywkdGJsKQkjIFRlNFtzMz4+MjRdCisJc2xsCSRpMiw4CisJc2xsCSRpMywxNgorCXNsbAkkczMsMjQKKwlvcgkkczAsJGkxCisJb3IJJHMxLCRpMgorCW9yCSRzMiwkaTMKKwlvcgkkczMsJHQzCisKKwlsZwkkcmEsMTUyKCRzcCkKKwl4cgkkczAsJHQwCisJeHIJJHMxLCR0MgorCXgJJHMyLDI0KCRrZXkpCisJeAkkczMsMjgoJGtleSkKKworCWJyCSRyYQkKKy5zaXplCV9zMzkweF9BRVNfZW5jcnlwdCwuLV9zMzkweF9BRVNfZW5jcnlwdAorX19fCisKKyRjb2RlLj08PF9fXzsKKy50eXBlCUFFU19UZCxcQG9iamVjdAorLmFsaWduCTI1NgorQUVTX1RkOgorX19fCismX2RhdGFfd29yZCgKKwkweDUxZjRhNzUwLCAweDdlNDE2NTUzLCAweDFhMTdhNGMzLCAweDNhMjc1ZTk2LAorCTB4M2JhYjZiY2IsIDB4MWY5ZDQ1ZjEsIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMsCisJMHgyMDMwZmE1NSwgMHhhZDc2NmRmNiwgMHg4OGNjNzY5MSwgMHhmNTAyNGMyNSwKKwkweDRmZTVkN2ZjLCAweGM1MmFjYmQ3LCAweDI2MzU0NDgwLCAweGI1NjJhMzhmLAorCTB4ZGViMTVhNDksIDB4MjViYTFiNjcsIDB4NDVlYTBlOTgsIDB4NWRmZWMwZTEsCisJMHhjMzJmNzUwMiwgMHg4MTRjZjAxMiwgMHg4ZDQ2OTdhMywgMHg2YmQzZjljNiwKKwkweDAzOGY1ZmU3LCAweDE1OTI5Yzk1LCAweGJmNmQ3YWViLCAweDk1NTI1OWRhLAorCTB4ZDRiZTgzMmQsIDB4NTg3NDIxZDMsIDB4NDllMDY5MjksIDB4OGVjOWM4NDQsCisJMHg3NWMyODk2YSwgMHhmNDhlNzk3OCwgMHg5OTU4M2U2YiwgMHgyN2I5NzFkZCwKKwkweGJlZTE0ZmI2LCAweGYwODhhZDE3LCAweGM5MjBhYzY2LCAweDdkY2UzYWI0LAorCTB4NjNkZjRhMTgsIDB4ZTUxYTMxODIsIDB4OTc1MTMzNjAsIDB4NjI1MzdmNDUsCisJMHhiMTY0NzdlMCwgMHhiYjZiYWU4NCwgMHhmZTgxYTAxYywgMHhmOTA4MmI5NCwKKwkweDcwNDg2ODU4LCAweDhmNDVmZDE5LCAweDk0ZGU2Yzg3LCAweDUyN2JmOGI3LAorCTB4YWI3M2QzMjMsIDB4NzI0YjAyZTIsIDB4ZTMxZjhmNTcsIDB4NjY1NWFiMmEsCisJMHhiMmViMjgwNywgMHgyZmI1YzIwMywgMHg4NmM1N2I5YSwgMHhkMzM3MDhhNSwKKwkweDMwMjg4N2YyLCAweDIzYmZhNWIyLCAweDAyMDM2YWJhLCAweGVkMTY4MjVjLAorCTB4OGFjZjFjMmIsIDB4YTc3OWI0OTIsIDB4ZjMwN2YyZjAsIDB4NGU2OWUyYTEsCisJMHg2NWRhZjRjZCwgMHgwNjA1YmVkNSwgMHhkMTM0NjIxZiwgMHhjNGE2ZmU4YSwKKwkweDM0MmU1MzlkLCAweGEyZjM1NWEwLCAweDA1OGFlMTMyLCAweGE0ZjZlYjc1LAorCTB4MGI4M2VjMzksIDB4NDA2MGVmYWEsIDB4NWU3MTlmMDYsIDB4YmQ2ZTEwNTEsCisJMHgzZTIxOGFmOSwgMHg5NmRkMDYzZCwgMHhkZDNlMDVhZSwgMHg0ZGU2YmQ0NiwKKwkweDkxNTQ4ZGI1LCAweDcxYzQ1ZDA1LCAweDA0MDZkNDZmLCAweDYwNTAxNWZmLAorCTB4MTk5OGZiMjQsIDB4ZDZiZGU5OTcsIDB4ODk0MDQzY2MsIDB4NjdkOTllNzcsCisJMHhiMGU4NDJiZCwgMHgwNzg5OGI4OCwgMHhlNzE5NWIzOCwgMHg3OWM4ZWVkYiwKKwkweGExN2MwYTQ3LCAweDdjNDIwZmU5LCAweGY4ODQxZWM5LCAweDAwMDAwMDAwLAorCTB4MDk4MDg2ODMsIDB4MzIyYmVkNDgsIDB4MWUxMTcwYWMsIDB4NmM1YTcyNGUsCisJMHhmZDBlZmZmYiwgMHgwZjg1Mzg1NiwgMHgzZGFlZDUxZSwgMHgzNjJkMzkyNywKKwkweDBhMGZkOTY0LCAweDY4NWNhNjIxLCAweDliNWI1NGQxLCAweDI0MzYyZTNhLAorCTB4MGMwYTY3YjEsIDB4OTM1N2U3MGYsIDB4YjRlZTk2ZDIsIDB4MWI5YjkxOWUsCisJMHg4MGMwYzU0ZiwgMHg2MWRjMjBhMiwgMHg1YTc3NGI2OSwgMHgxYzEyMWExNiwKKwkweGUyOTNiYTBhLCAweGMwYTAyYWU1LCAweDNjMjJlMDQzLCAweDEyMWIxNzFkLAorCTB4MGUwOTBkMGIsIDB4ZjI4YmM3YWQsIDB4MmRiNmE4YjksIDB4MTQxZWE5YzgsCisJMHg1N2YxMTk4NSwgMHhhZjc1MDc0YywgMHhlZTk5ZGRiYiwgMHhhMzdmNjBmZCwKKwkweGY3MDEyNjlmLCAweDVjNzJmNWJjLCAweDQ0NjYzYmM1LCAweDViZmI3ZTM0LAorCTB4OGI0MzI5NzYsIDB4Y2IyM2M2ZGMsIDB4YjZlZGZjNjgsIDB4YjhlNGYxNjMsCisJMHhkNzMxZGNjYSwgMHg0MjYzODUxMCwgMHgxMzk3MjI0MCwgMHg4NGM2MTEyMCwKKwkweDg1NGEyNDdkLCAweGQyYmIzZGY4LCAweGFlZjkzMjExLCAweGM3MjlhMTZkLAorCTB4MWQ5ZTJmNGIsIDB4ZGNiMjMwZjMsIDB4MGQ4NjUyZWMsIDB4NzdjMWUzZDAsCisJMHgyYmIzMTY2YywgMHhhOTcwYjk5OSwgMHgxMTk0NDhmYSwgMHg0N2U5NjQyMiwKKwkweGE4ZmM4Y2M0LCAweGEwZjAzZjFhLCAweDU2N2QyY2Q4LCAweDIyMzM5MGVmLAorCTB4ODc0OTRlYzcsIDB4ZDkzOGQxYzEsIDB4OGNjYWEyZmUsIDB4OThkNDBiMzYsCisJMHhhNmY1ODFjZiwgMHhhNTdhZGUyOCwgMHhkYWI3OGUyNiwgMHgzZmFkYmZhNCwKKwkweDJjM2E5ZGU0LCAweDUwNzg5MjBkLCAweDZhNWZjYzliLCAweDU0N2U0NjYyLAorCTB4ZjY4ZDEzYzIsIDB4OTBkOGI4ZTgsIDB4MmUzOWY3NWUsIDB4ODJjM2FmZjUsCisJMHg5ZjVkODBiZSwgMHg2OWQwOTM3YywgMHg2ZmQ1MmRhOSwgMHhjZjI1MTJiMywKKwkweGM4YWM5OTNiLCAweDEwMTg3ZGE3LCAweGU4OWM2MzZlLCAweGRiM2JiYjdiLAorCTB4Y2QyNjc4MDksIDB4NmU1OTE4ZjQsIDB4ZWM5YWI3MDEsIDB4ODM0ZjlhYTgsCisJMHhlNjk1NmU2NSwgMHhhYWZmZTY3ZSwgMHgyMWJjY2YwOCwgMHhlZjE1ZThlNiwKKwkweGJhZTc5YmQ5LCAweDRhNmYzNmNlLCAweGVhOWYwOWQ0LCAweDI5YjA3Y2Q2LAorCTB4MzFhNGIyYWYsIDB4MmEzZjIzMzEsIDB4YzZhNTk0MzAsIDB4MzVhMjY2YzAsCisJMHg3NDRlYmMzNywgMHhmYzgyY2FhNiwgMHhlMDkwZDBiMCwgMHgzM2E3ZDgxNSwKKwkweGYxMDQ5ODRhLCAweDQxZWNkYWY3LCAweDdmY2Q1MDBlLCAweDE3OTFmNjJmLAorCTB4NzY0ZGQ2OGQsIDB4NDNlZmIwNGQsIDB4Y2NhYTRkNTQsIDB4ZTQ5NjA0ZGYsCisJMHg5ZWQxYjVlMywgMHg0YzZhODgxYiwgMHhjMTJjMWZiOCwgMHg0NjY1NTE3ZiwKKwkweDlkNWVlYTA0LCAweDAxOGMzNTVkLCAweGZhODc3NDczLCAweGZiMGI0MTJlLAorCTB4YjM2NzFkNWEsIDB4OTJkYmQyNTIsIDB4ZTkxMDU2MzMsIDB4NmRkNjQ3MTMsCisJMHg5YWQ3NjE4YywgMHgzN2ExMGM3YSwgMHg1OWY4MTQ4ZSwgMHhlYjEzM2M4OSwKKwkweGNlYTkyN2VlLCAweGI3NjFjOTM1LCAweGUxMWNlNWVkLCAweDdhNDdiMTNjLAorCTB4OWNkMmRmNTksIDB4NTVmMjczM2YsIDB4MTgxNGNlNzksIDB4NzNjNzM3YmYsCisJMHg1M2Y3Y2RlYSwgMHg1ZmZkYWE1YiwgMHhkZjNkNmYxNCwgMHg3ODQ0ZGI4NiwKKwkweGNhYWZmMzgxLCAweGI5NjhjNDNlLCAweDM4MjQzNDJjLCAweGMyYTM0MDVmLAorCTB4MTYxZGMzNzIsIDB4YmNlMjI1MGMsIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEsCisJMHgzOWE4MDE3MSwgMHgwODBjYjNkZSwgMHhkOGI0ZTQ5YywgMHg2NDU2YzE5MCwKKwkweDdiY2I4NDYxLCAweGQ1MzJiNjcwLCAweDQ4NmM1Yzc0LCAweGQwYjg1NzQyKTsKKyRjb2RlLj08PF9fXzsKKyMgVGQ0WzI1Nl0KKy5ieXRlCTB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgKKy5ieXRlCTB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIKKy5ieXRlCTB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcKKy5ieXRlCTB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IKKy5ieXRlCTB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QKKy5ieXRlCTB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUKKy5ieXRlCTB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIKKy5ieXRlCTB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUKKy5ieXRlCTB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYKKy5ieXRlCTB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIKKy5ieXRlCTB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEKKy5ieXRlCTB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQKKy5ieXRlCTB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEKKy5ieXRlCTB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYKKy5ieXRlCTB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIKKy5ieXRlCTB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIKKy5ieXRlCTB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEKKy5ieXRlCTB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMKKy5ieXRlCTB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUKKy5ieXRlCTB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUKKy5ieXRlCTB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkKKy5ieXRlCTB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIKKy5ieXRlCTB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjAKKy5ieXRlCTB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQKKy5ieXRlCTB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEKKy5ieXRlCTB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYKKy5ieXRlCTB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQKKy5ieXRlCTB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYKKy5ieXRlCTB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjAKKy5ieXRlCTB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEKKy5ieXRlCTB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYKKy5ieXRlCTB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QKKy5zaXplCUFFU19UZCwuLUFFU19UZAorCisjIHZvaWQgQUVTX2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW5wLCB1bnNpZ25lZCBjaGFyICpvdXQsCisjIAkJIGNvbnN0IEFFU19LRVkgKmtleSkgeworLmdsb2JsCUFFU19kZWNyeXB0CisudHlwZQlBRVNfZGVjcnlwdCxcQGZ1bmN0aW9uCitBRVNfZGVjcnlwdDoKK19fXworJGNvZGUuPTw8X19fIGlmICghJHNvZnRvbmx5KTsKKwlsCSVyMCwyNDAoJGtleSkKKwlsaGkJJXIxLDE2CisJY2xyCSVyMCwlcjEKKwlqbAkuTGRzb2Z0CisKKwlsYQklcjEsMCgka2V5KQorCSNsYQklcjIsMCgkaW5wKQorCWxhCSVyNCwwKCRvdXQpCisJbGdoaQklcjMsMTYJCSMgc2luZ2xlIGJsb2NrIGxlbmd0aAorCS5sb25nCTB4YjkyZTAwNDIJIyBrbSAlcjQsJXIyCisJYnJjCTEsLi00CQkjIGNhbiB0aGlzIGhhcHBlbj8KKwlicgklcjE0CisuYWxpZ24JNjQKKy5MZHNvZnQ6CitfX18KKyRjb2RlLj08PF9fXzsKKwlzdG1nCSVyMywkcmEsMjQoJHNwKQorCisJbGxnZgkkczAsMCgkaW5wKQorCWxsZ2YJJHMxLDQoJGlucCkKKwlsbGdmCSRzMiw4KCRpbnApCisJbGxnZgkkczMsMTIoJGlucCkKKworCWxhcmwJJHRibCxBRVNfVGQKKwlicmFzCSRyYSxfczM5MHhfQUVTX2RlY3J5cHQKKworCWxnCSRvdXQsMjQoJHNwKQorCXN0CSRzMCwwKCRvdXQpCisJc3QJJHMxLDQoJG91dCkKKwlzdAkkczIsOCgkb3V0KQorCXN0CSRzMywxMigkb3V0KQorCisJbG1nCSVyNiwkcmEsNDgoJHNwKQorCWJyCSRyYQorLnNpemUJQUVTX2RlY3J5cHQsLi1BRVNfZGVjcnlwdAorCisudHlwZSAgIF9zMzkweF9BRVNfZGVjcnlwdCxcQGZ1bmN0aW9uCisuYWxpZ24JMTYKK19zMzkweF9BRVNfZGVjcnlwdDoKKwlzdGcJJHJhLDE1Migkc3ApCisJeAkkczAsMCgka2V5KQorCXgJJHMxLDQoJGtleSkKKwl4CSRzMiw4KCRrZXkpCisJeAkkczMsMTIoJGtleSkKKwlsCSRyb3VuZHMsMjQwKCRrZXkpCisJbGxpbGwJJG1hc2ssYDB4ZmY8PDNgCisJYWdoaQkkcm91bmRzLC0xCisJagkuTGRlY19sb29wCisuYWxpZ24JMTYKKy5MZGVjX2xvb3A6CisJc3JsZwkkdDEsJHMwLGAxNi0zYAorCXNybGcJJHQyLCRzMCxgOC0zYAorCXNsbGcJJHQzLCRzMCxgMCszYAorCXNybAkkczAsYDI0LTNgCisJbnIJJHMwLCRtYXNrCisJbnIJJHQxLCRtYXNrCisJbnIJJHQyLCRtYXNrCisJbmdyCSR0MywkbWFzaworCisJc2xsZwkkaTEsJHMxLGAwKzNgCSMgaTAKKwlzcmxnCSRpMiwkczEsYDE2LTNgCisJc3JsZwkkaTMsJHMxLGA4LTNgCisJc3JsCSRzMSxgMjQtM2AKKwluZ3IJJGkxLCRtYXNrCisJbnIJJHMxLCRtYXNrCisJbnIJJGkyLCRtYXNrCisJbnIJJGkzLCRtYXNrCisKKwlsCSRzMCwwKCRzMCwkdGJsKQkjIFRkMFtzMD4+MjRdCisJbAkkdDEsMygkdDEsJHRibCkJIyBUZDFbczA+PjE2XQorCWwJJHQyLDIoJHQyLCR0YmwpCSMgVGQyW3MwPj44XQorCWwJJHQzLDEoJHQzLCR0YmwpCSMgVGQzW3MwPj4wXQorCisJeAkkczAsMSgkaTEsJHRibCkJIyBUZDNbczE+PjBdCisJbAkkczEsMCgkczEsJHRibCkJIyBUZDBbczE+PjI0XQorCXgJJHQyLDMoJGkyLCR0YmwpCSMgVGQxW3MxPj4xNl0KKwl4CSR0MywyKCRpMywkdGJsKQkjIFRkMltzMT4+OF0KKworCXNybGcJJGkxLCRzMixgOC0zYAkjIGkwCisJc2xsZwkkaTIsJHMyLGAwKzNgCSMgaTEKKwlzcmxnCSRpMywkczIsYDE2LTNgCisJc3JsCSRzMixgMjQtM2AKKwlucgkkaTEsJG1hc2sKKwluZ3IJJGkyLCRtYXNrCisJbnIJJHMyLCRtYXNrCisJbnIJJGkzLCRtYXNrCisKKwl4cgkkczEsJHQxCisJc3JsZwkkcmEsJHMzLGA4LTNgCSMgaTEKKwlzcmxnCSR0MSwkczMsYDE2LTNgCSMgaTAKKwlucgkkcmEsJG1hc2sKKwlsYQkka2V5LDE2KCRrZXkpCisJbnIJJHQxLCRtYXNrCisKKwl4CSRzMCwyKCRpMSwkdGJsKQkjIFRkMltzMj4+OF0KKwl4CSRzMSwxKCRpMiwkdGJsKQkjIFRkM1tzMj4+MF0KKwlsCSRzMiwwKCRzMiwkdGJsKQkjIFRkMFtzMj4+MjRdCisJeAkkdDMsMygkaTMsJHRibCkJIyBUZDFbczI+PjE2XQorCisJc2xsZwkkaTMsJHMzLGAwKzNgCSMgaTIKKwlzcmwJJHMzLGAyNC0zYAorCW5ncgkkaTMsJG1hc2sKKwlucgkkczMsJG1hc2sKKworCXhyCSRzMiwkdDIKKwl4CSRzMCwwKCRrZXkpCisJeAkkczEsNCgka2V5KQorCXgJJHMyLDgoJGtleSkKKwl4CSR0MywxMigka2V5KQorCisJeAkkczAsMygkdDEsJHRibCkJIyBUZDFbczM+PjE2XQorCXgJJHMxLDIoJHJhLCR0YmwpCSMgVGQyW3MzPj44XQorCXgJJHMyLDEoJGkzLCR0YmwpCSMgVGQzW3MzPj4wXQorCWwJJHMzLDAoJHMzLCR0YmwpCSMgVGQwW3MzPj4yNF0KKwl4cgkkczMsJHQzCisKKwlicmN0CSRyb3VuZHMsLkxkZWNfbG9vcAorCS5hbGlnbgkxNgorCisJbAkkdDEsYDIwNDgrMGAoJHRibCkJIyBwcmVmZXRjaCBUZDQKKwlsCSR0MixgMjA0OCs2NGAoJHRibCkKKwlsCSR0MyxgMjA0OCsxMjhgKCR0YmwpCisJbAkkaTEsYDIwNDgrMTkyYCgkdGJsKQorCWxsaWxsCSRtYXNrLDB4ZmYKKworCXNybGcJJGkzLCRzMCwyNAkjIGkwCisJc3JsZwkkdDEsJHMwLDE2CisJc3JsZwkkdDIsJHMwLDgKKwlucgkkczAsJG1hc2sJIyBpMworCW5yCSR0MSwkbWFzaworCisJc3JsZwkkaTEsJHMxLDI0CisJbnIJJHQyLCRtYXNrCisJc3JsZwkkaTIsJHMxLDE2CisJc3JsZwkkcmEsJHMxLDgKKwlucgkkczEsJG1hc2sJIyBpMAorCW5yCSRpMiwkbWFzaworCW5yCSRyYSwkbWFzaworCisJbGxnYwkkaTMsMjA0OCgkaTMsJHRibCkJIyBUZDRbczA+PjI0XQorCWxsZ2MJJHQxLDIwNDgoJHQxLCR0YmwpCSMgVGQ0W3MwPj4xNl0KKwlsbGdjCSR0MiwyMDQ4KCR0MiwkdGJsKQkjIFRkNFtzMD4+OF0KKwlzbGwJJHQxLDE2CisJbGxnYwkkdDMsMjA0OCgkczAsJHRibCkJIyBUZDRbczA+PjBdCisJc2xsZwkkczAsJGkzLDI0CisJc2xsCSR0Miw4CisKKwlsbGdjCSRzMSwyMDQ4KCRzMSwkdGJsKQkjIFRkNFtzMT4+MF0KKwlsbGdjCSRpMSwyMDQ4KCRpMSwkdGJsKQkjIFRkNFtzMT4+MjRdCisJbGxnYwkkaTIsMjA0OCgkaTIsJHRibCkJIyBUZDRbczE+PjE2XQorCXNsbAkkaTEsMjQKKwlsbGdjCSRpMywyMDQ4KCRyYSwkdGJsKQkjIFRkNFtzMT4+OF0KKwlzbGwJJGkyLDE2CisJc2xsCSRpMyw4CisJb3IJJHMwLCRzMQorCW9yCSR0MSwkaTEKKwlvcgkkdDIsJGkyCisJb3IJJHQzLCRpMworCisJc3JsZwkkaTEsJHMyLDgJIyBpMAorCXNybGcJJGkyLCRzMiwyNAorCXNybGcJJGkzLCRzMiwxNgorCW5yCSRzMiwkbWFzawkjIGkxCisJbnIJJGkxLCRtYXNrCisJbnIJJGkzLCRtYXNrCisJbGxnYwkkaTEsMjA0OCgkaTEsJHRibCkJIyBUZDRbczI+PjhdCisJbGxnYwkkczEsMjA0OCgkczIsJHRibCkJIyBUZDRbczI+PjBdCisJbGxnYwkkaTIsMjA0OCgkaTIsJHRibCkJIyBUZDRbczI+PjI0XQorCWxsZ2MJJGkzLDIwNDgoJGkzLCR0YmwpCSMgVGQ0W3MyPj4xNl0KKwlzbGwJJGkxLDgKKwlzbGwJJGkyLDI0CisJb3IJJHMwLCRpMQorCXNsbAkkaTMsMTYKKwlvcgkkdDIsJGkyCisJb3IJJHQzLCRpMworCisJc3JsZwkkaTEsJHMzLDE2CSMgaTAKKwlzcmxnCSRpMiwkczMsOAkjIGkxCisJc3JsZwkkaTMsJHMzLDI0CisJbnIJJHMzLCRtYXNrCSMgaTIKKwlucgkkaTEsJG1hc2sKKwlucgkkaTIsJG1hc2sKKworCWxnCSRyYSwxNTIoJHNwKQorCW9yCSRzMSwkdDEKKwlsCSR0MCwxNigka2V5KQorCWwJJHQxLDIwKCRrZXkpCisKKwlsbGdjCSRpMSwyMDQ4KCRpMSwkdGJsKQkjIFRkNFtzMz4+MTZdCisJbGxnYwkkaTIsMjA0OCgkaTIsJHRibCkJIyBUZDRbczM+PjhdCisJc2xsCSRpMSwxNgorCWxsZ2MJJHMyLDIwNDgoJHMzLCR0YmwpCSMgVGQ0W3MzPj4wXQorCWxsZ2MJJHMzLDIwNDgoJGkzLCR0YmwpCSMgVGQ0W3MzPj4yNF0KKwlzbGwJJGkyLDgKKwlzbGwJJHMzLDI0CisJb3IJJHMwLCRpMQorCW9yCSRzMSwkaTIKKwlvcgkkczIsJHQyCisJb3IJJHMzLCR0MworCisJeHIJJHMwLCR0MAorCXhyCSRzMSwkdDEKKwl4CSRzMiwyNCgka2V5KQorCXgJJHMzLDI4KCRrZXkpCisKKwlicgkkcmEJCisuc2l6ZQlfczM5MHhfQUVTX2RlY3J5cHQsLi1fczM5MHhfQUVTX2RlY3J5cHQKK19fXworCiskY29kZS49PDxfX187CisjIHZvaWQgQUVTX3NldF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGJpdHMsCisjIAkJIEFFU19LRVkgKmtleSkgeworLmdsb2JsCUFFU19zZXRfZW5jcnlwdF9rZXkKKy50eXBlCUFFU19zZXRfZW5jcnlwdF9rZXksXEBmdW5jdGlvbgorLmFsaWduCTE2CitBRVNfc2V0X2VuY3J5cHRfa2V5OgorCWxnaGkJJHQwLDAKKwljbGdyCSRpbnAsJHQwCisJamUJLkxtaW51czEKKwljbGdyCSRrZXksJHQwCisJamUJLkxtaW51czEKKworCWxnaGkJJHQwLDEyOAorCWNscgkkYml0cywkdDAKKwlqZQkuTHByb2NlZWQKKwlsZ2hpCSR0MCwxOTIKKwljbHIJJGJpdHMsJHQwCisJamUJLkxwcm9jZWVkCisJbGdoaQkkdDAsMjU2CisJY2xyCSRiaXRzLCR0MAorCWplCS5McHJvY2VlZAorCWxnaGkJJXIyLC0yCisJYnIJJXIxNAorCisuYWxpZ24JMTYKKy5McHJvY2VlZDoKK19fXworJGNvZGUuPTw8X19fIGlmICghJHNvZnRvbmx5KTsKKwkjIGNvbnZlcnQgYml0cyB0byBrbSBjb2RlLCBbMTI4LDE5MiwyNTZdLT5bMTgsMTksMjBdCisJbGhpCSVyNSwtMTI4CisJbGhpCSVyMCwxOAorCWFyCSVyNSwkYml0cworCXNybAklcjUsNgorCWFyCSVyNSwlcjAKKworCWxhcmwJJXIxLE9QRU5TU0xfczM5MHhjYXBfUAorCWxnCSVyMCwwKCVyMSkKKwl0bWhsCSVyMCwweDQwMDAJIyBjaGVjayBmb3IgbWVzc2FnZS1zZWN1cml0eSBhc3Npc3QKKwlqegkuTGVrZXlfaW50ZXJuYWwKKworCWxnaGkJJXIwLDAJCSMgcXVlcnkgY2FwYWJpbGl0eSB2ZWN0b3IKKwlsYQklcjEsMTYoJHNwKQorCS5sb25nCTB4YjkyZjAwNDIJIyBrbWMgJXI0LCVyMgorCisJbGxpaGgJJXIxLDB4ODAwMAorCXNybGcJJXIxLCVyMSwwKCVyNSkKKwluZwklcjEsMTYoJHNwKQorCWp6CS5MZWtleV9pbnRlcm5hbAorCisJbG1nCSVyMCwlcjEsMCgkaW5wKQkjIGp1c3QgY29weSAxMjggYml0cy4uLgorCXN0bWcJJXIwLCVyMSwwKCRrZXkpCisJbGhpCSVyMCwxOTIKKwljcgkkYml0cywlcjAKKwlqbAkxZgorCWxnCSVyMSwxNigkaW5wKQorCXN0ZwklcjEsMTYoJGtleSkKKwlqZQkxZgorCWxnCSVyMSwyNCgkaW5wKQorCXN0ZwklcjEsMjQoJGtleSkKKzE6CXN0CSRiaXRzLDIzNigka2V5KQkjIHNhdmUgYml0cworCXN0CSVyNSwyNDAoJGtleSkJIyBzYXZlIGttIGNvZGUKKwlsZ2hpCSVyMiwwCisJYnIJJXIxNAorX19fCiskY29kZS49PDxfX187CisuYWxpZ24JMTYKKy5MZWtleV9pbnRlcm5hbDoKKwlzdG1nCSVyNiwlcjEzLDQ4KCRzcCkJIyBhbGwgbm9uLXZvbGF0aWxlIHJlZ3MKKworCWxhcmwJJHRibCxBRVNfVGUrMjA0OAorCisJbGxnZgkkczAsMCgkaW5wKQorCWxsZ2YJJHMxLDQoJGlucCkKKwlsbGdmCSRzMiw4KCRpbnApCisJbGxnZgkkczMsMTIoJGlucCkKKwlzdAkkczAsMCgka2V5KQorCXN0CSRzMSw0KCRrZXkpCisJc3QJJHMyLDgoJGtleSkKKwlzdAkkczMsMTIoJGtleSkKKwlsZ2hpCSR0MCwxMjgKKwljcgkkYml0cywkdDAKKwlqbmUJLkxub3QxMjgKKworCWxsaWxsCSRtYXNrLDB4ZmYKKwlsZ2hpCSR0MywwCQkJIyBpPTAKKwlsZ2hpCSRyb3VuZHMsMTAKKwlzdAkkcm91bmRzLDI0MCgka2V5KQorCisJbGxnZnIJJHQyLCRzMwkJCSMgdGVtcD1ya1szXQorCXNybGcJJGkxLCRzMyw4CisJc3JsZwkkaTIsJHMzLDE2CisJc3JsZwkkaTMsJHMzLDI0CisJbnIJJHQyLCRtYXNrCisJbnIJJGkxLCRtYXNrCisJbnIJJGkyLCRtYXNrCisKKy5hbGlnbgkxNgorLkwxMjhfbG9vcDoKKwlsYQkkdDIsMCgkdDIsJHRibCkKKwlsYQkkaTEsMCgkaTEsJHRibCkKKwlsYQkkaTIsMCgkaTIsJHRibCkKKwlsYQkkaTMsMCgkaTMsJHRibCkKKwlpY20JJHQyLDIsMCgkdDIpCQkjIFRlNFtya1szXT4+MF08PDgKKwlpY20JJHQyLDQsMCgkaTEpCQkjIFRlNFtya1szXT4+OF08PDE2CisJaWNtCSR0Miw4LDAoJGkyKQkJIyBUZTRbcmtbM10+PjE2XTw8MjQKKwlpY20JJHQyLDEsMCgkaTMpCQkjIFRlNFtya1szXT4+MjRdCisJeAkkdDIsMjU2KCR0MywkdGJsKQkjIHJjb25baV0KKwl4cgkkczAsJHQyCQkJIyBya1s0XT1ya1swXV4uLi4KKwl4cgkkczEsJHMwCQkJIyBya1s1XT1ya1sxXV5ya1s0XQorCXhyCSRzMiwkczEJCQkjIHJrWzZdPXJrWzJdXnJrWzVdCisJeHIJJHMzLCRzMgkJCSMgcmtbN109cmtbM11ecmtbNl0KKworCWxsZ2ZyCSR0MiwkczMJCQkjIHRlbXA9cmtbM10KKwlzcmxnCSRpMSwkczMsOAorCXNybGcJJGkyLCRzMywxNgorCW5yCSR0MiwkbWFzaworCW5yCSRpMSwkbWFzaworCXNybGcJJGkzLCRzMywyNAorCW5yCSRpMiwkbWFzaworCisJc3QJJHMwLDE2KCRrZXkpCisJc3QJJHMxLDIwKCRrZXkpCisJc3QJJHMyLDI0KCRrZXkpCisJc3QJJHMzLDI4KCRrZXkpCisJbGEJJGtleSwxNigka2V5KQkJIyBrZXkrPTQKKwlsYQkkdDMsNCgkdDMpCQkjIGkrKworCWJyY3QJJHJvdW5kcywuTDEyOF9sb29wCisJbGdoaQklcjIsMAorCWxtZwklcjYsJXIxMyw0OCgkc3ApCisJYnIJJHJhCisKKy5hbGlnbgkxNgorLkxub3QxMjg6CisJbGxnZgkkdDAsMTYoJGlucCkKKwlsbGdmCSR0MSwyMCgkaW5wKQorCXN0CSR0MCwxNigka2V5KQorCXN0CSR0MSwyMCgka2V5KQorCWxnaGkJJHQwLDE5MgorCWNyCSRiaXRzLCR0MAorCWpuZQkuTG5vdDE5MgorCisJbGxpbGwJJG1hc2ssMHhmZgorCWxnaGkJJHQzLDAJCQkjIGk9MAorCWxnaGkJJHJvdW5kcywxMgorCXN0CSRyb3VuZHMsMjQwKCRrZXkpCisJbGdoaQkkcm91bmRzLDgKKworCXNybGcJJGkxLCR0MSw4CisJc3JsZwkkaTIsJHQxLDE2CisJc3JsZwkkaTMsJHQxLDI0CisJbnIJJHQxLCRtYXNrCisJbnIJJGkxLCRtYXNrCisJbnIJJGkyLCRtYXNrCisKKy5hbGlnbgkxNgorLkwxOTJfbG9vcDoKKwlsYQkkdDEsMCgkdDEsJHRibCkKKwlsYQkkaTEsMCgkaTEsJHRibCkKKwlsYQkkaTIsMCgkaTIsJHRibCkKKwlsYQkkaTMsMCgkaTMsJHRibCkKKwlpY20JJHQxLDIsMCgkdDEpCQkjIFRlNFtya1s1XT4+MF08PDgKKwlpY20JJHQxLDQsMCgkaTEpCQkjIFRlNFtya1s1XT4+OF08PDE2CisJaWNtCSR0MSw4LDAoJGkyKQkJIyBUZTRbcmtbNV0+PjE2XTw8MjQKKwlpY20JJHQxLDEsMCgkaTMpCQkjIFRlNFtya1s1XT4+MjRdCisJeAkkdDEsMjU2KCR0MywkdGJsKQkjIHJjb25baV0KKwl4cgkkczAsJHQxCQkJIyBya1s2XT1ya1swXV4uLi4KKwl4cgkkczEsJHMwCQkJIyBya1s3XT1ya1sxXV5ya1s2XQorCXhyCSRzMiwkczEJCQkjIHJrWzhdPXJrWzJdXnJrWzddCisJeHIJJHMzLCRzMgkJCSMgcmtbOV09cmtbM11ecmtbOF0KKworCXN0CSRzMCwyNCgka2V5KQorCXN0CSRzMSwyOCgka2V5KQorCXN0CSRzMiwzMigka2V5KQorCXN0CSRzMywzNigka2V5KQorCWJyY3QJJHJvdW5kcywuTDE5Ml9jb250aW51ZQorCWxnaGkJJXIyLDAKKwlsbWcJJXI2LCVyMTMsNDgoJHNwKQorCWJyCSRyYQorCisuYWxpZ24JMTYKKy5MMTkyX2NvbnRpbnVlOgorCWxncgkkdDEsJHMzCisJeAkkdDEsMTYoJGtleSkJCSMgcmtbMTBdPXJrWzRdXnJrWzldCisJc3QJJHQxLDQwKCRrZXkpCisJeAkkdDEsMjAoJGtleSkJCSMgcmtbMTFdPXJrWzVdXnJrWzEwXQorCXN0CSR0MSw0NCgka2V5KQorCisJc3JsZwkkaTEsJHQxLDgKKwlzcmxnCSRpMiwkdDEsMTYKKwlzcmxnCSRpMywkdDEsMjQKKwlucgkkdDEsJG1hc2sKKwlucgkkaTEsJG1hc2sKKwlucgkkaTIsJG1hc2sKKworCWxhCSRrZXksMjQoJGtleSkJCSMga2V5Kz02CisJbGEJJHQzLDQoJHQzKQkJIyBpKysKKwlqCS5MMTkyX2xvb3AKKworLmFsaWduCTE2CisuTG5vdDE5MjoKKwlsbGdmCSR0MCwyNCgkaW5wKQorCWxsZ2YJJHQxLDI4KCRpbnApCisJc3QJJHQwLDI0KCRrZXkpCisJc3QJJHQxLDI4KCRrZXkpCisJbGxpbGwJJG1hc2ssMHhmZgorCWxnaGkJJHQzLDAJCQkjIGk9MAorCWxnaGkJJHJvdW5kcywxNAorCXN0CSRyb3VuZHMsMjQwKCRrZXkpCisJbGdoaQkkcm91bmRzLDcKKworCXNybGcJJGkxLCR0MSw4CisJc3JsZwkkaTIsJHQxLDE2CisJc3JsZwkkaTMsJHQxLDI0CisJbnIJJHQxLCRtYXNrCisJbnIJJGkxLCRtYXNrCisJbnIJJGkyLCRtYXNrCisKKy5hbGlnbgkxNgorLkwyNTZfbG9vcDoKKwlsYQkkdDEsMCgkdDEsJHRibCkKKwlsYQkkaTEsMCgkaTEsJHRibCkKKwlsYQkkaTIsMCgkaTIsJHRibCkKKwlsYQkkaTMsMCgkaTMsJHRibCkKKwlpY20JJHQxLDIsMCgkdDEpCQkjIFRlNFtya1s3XT4+MF08PDgKKwlpY20JJHQxLDQsMCgkaTEpCQkjIFRlNFtya1s3XT4+OF08PDE2CisJaWNtCSR0MSw4LDAoJGkyKQkJIyBUZTRbcmtbN10+PjE2XTw8MjQKKwlpY20JJHQxLDEsMCgkaTMpCQkjIFRlNFtya1s3XT4+MjRdCisJeAkkdDEsMjU2KCR0MywkdGJsKQkjIHJjb25baV0KKwl4cgkkczAsJHQxCQkJIyBya1s4XT1ya1swXV4uLi4KKwl4cgkkczEsJHMwCQkJIyBya1s5XT1ya1sxXV5ya1s4XQorCXhyCSRzMiwkczEJCQkjIHJrWzEwXT1ya1syXV5ya1s5XQorCXhyCSRzMywkczIJCQkjIHJrWzExXT1ya1szXV5ya1sxMF0KKwlzdAkkczAsMzIoJGtleSkKKwlzdAkkczEsMzYoJGtleSkKKwlzdAkkczIsNDAoJGtleSkKKwlzdAkkczMsNDQoJGtleSkKKwlicmN0CSRyb3VuZHMsLkwyNTZfY29udGludWUKKwlsZ2hpCSVyMiwwCisJbG1nCSVyNiwlcjEzLDQ4KCRzcCkKKwlicgkkcmEKKworLmFsaWduCTE2CisuTDI1Nl9jb250aW51ZToKKwlsZ3IJJHQxLCRzMwkJCSMgdGVtcD1ya1sxMV0KKwlzcmxnCSRpMSwkczMsOAorCXNybGcJJGkyLCRzMywxNgorCXNybGcJJGkzLCRzMywyNAorCW5yCSR0MSwkbWFzaworCW5yCSRpMSwkbWFzaworCW5yCSRpMiwkbWFzaworCWxhCSR0MSwwKCR0MSwkdGJsKQorCWxhCSRpMSwwKCRpMSwkdGJsKQorCWxhCSRpMiwwKCRpMiwkdGJsKQorCWxhCSRpMywwKCRpMywkdGJsKQorCWxsZ2MJJHQxLDAoJHQxKQkJIyBUZTRbcmtbMTFdPj4wXQorCWljbQkkdDEsMiwwKCRpMSkJCSMgVGU0W3JrWzExXT4+OF08PDgKKwlpY20JJHQxLDQsMCgkaTIpCQkjIFRlNFtya1sxMV0+PjE2XTw8MTYKKwlpY20JJHQxLDgsMCgkaTMpCQkjIFRlNFtya1sxMV0+PjI0XTw8MjQKKwl4CSR0MSwxNigka2V5KQkJIyBya1sxMl09cmtbNF1eLi4uCisJc3QJJHQxLDQ4KCRrZXkpCisJeAkkdDEsMjAoJGtleSkJCSMgcmtbMTNdPXJrWzVdXnJrWzEyXQorCXN0CSR0MSw1Migka2V5KQorCXgJJHQxLDI0KCRrZXkpCQkjIHJrWzE0XT1ya1s2XV5ya1sxM10KKwlzdAkkdDEsNTYoJGtleSkKKwl4CSR0MSwyOCgka2V5KQkJIyBya1sxNV09cmtbN11ecmtbMTRdCisJc3QJJHQxLDYwKCRrZXkpCisKKwlzcmxnCSRpMSwkdDEsOAorCXNybGcJJGkyLCR0MSwxNgorCXNybGcJJGkzLCR0MSwyNAorCW5yCSR0MSwkbWFzaworCW5yCSRpMSwkbWFzaworCW5yCSRpMiwkbWFzaworCisJbGEJJGtleSwzMigka2V5KQkJIyBrZXkrPTgKKwlsYQkkdDMsNCgkdDMpCQkjIGkrKworCWoJLkwyNTZfbG9vcAorCisuTG1pbnVzMToKKwlsZ2hpCSVyMiwtMQorCWJyCSRyYQorLnNpemUJQUVTX3NldF9lbmNyeXB0X2tleSwuLUFFU19zZXRfZW5jcnlwdF9rZXkKKworIyB2b2lkIEFFU19zZXRfZGVjcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBiaXRzLAorIyAJCSBBRVNfS0VZICprZXkpIHsKKy5nbG9ibAlBRVNfc2V0X2RlY3J5cHRfa2V5CisudHlwZQlBRVNfc2V0X2RlY3J5cHRfa2V5LFxAZnVuY3Rpb24KKy5hbGlnbgkxNgorQUVTX3NldF9kZWNyeXB0X2tleToKKwlzdGcJJGtleSwzMigkc3ApCQkjIEkgcmVseSBvbiBBRVNfc2V0X2VuY3J5cHRfa2V5IHRvCisJc3RnCSRyYSwxMTIoJHNwKQkJIyBzYXZlIG5vbi12b2xhdGlsZSByZWdpc3RlcnMhCisJYnJhcwkkcmEsQUVTX3NldF9lbmNyeXB0X2tleQorCWxnCSRrZXksMzIoJHNwKQorCWxnCSRyYSwxMTIoJHNwKQorCWx0Z3IJJXIyLCVyMgorCWJuenIJJHJhCitfX18KKyRjb2RlLj08PF9fXyBpZiAoISRzb2Z0b25seSk7CisJbAkkdDAsMjQwKCRrZXkpCisJbGhpCSR0MSwxNgorCWNyCSR0MCwkdDEKKwlqbAkuTGdvCisJb2lsbAkkdDAsMHg4MAkjIHNldCAiZGVjcnlwdCIgYml0CisJc3QJJHQwLDI0MCgka2V5KQorCWJyCSRyYQorCisuYWxpZ24JMTYKKy5MZGtleV9pbnRlcm5hbDoKKwlzdGcJJGtleSwzMigkc3ApCisJc3RnCSRyYSw0MCgkc3ApCisJYnJhcwkkcmEsLkxla2V5X2ludGVybmFsCisJbGcJJGtleSwzMigkc3ApCisJbGcJJHJhLDQwKCRzcCkKK19fXworJGNvZGUuPTw8X19fOworCisuTGdvOglsbGdmCSRyb3VuZHMsMjQwKCRrZXkpCisJbGEJJGkxLDAoJGtleSkKKwlzbGxnCSRpMiwkcm91bmRzLDQKKwlsYQkkaTIsMCgkaTIsJGtleSkKKwlzcmwJJHJvdW5kcywxCisJbGdoaQkkdDEsLTE2CisKKy5hbGlnbgkxNgorLkxpbnY6CWxtZwkkczAsJHMxLDAoJGkxKQorCWxtZwkkczIsJHMzLDAoJGkyKQorCXN0bWcJJHMwLCRzMSwwKCRpMikKKwlzdG1nCSRzMiwkczMsMCgkaTEpCisJbGEJJGkxLDE2KCRpMSkKKwlsYQkkaTIsMCgkdDEsJGkyKQorCWJyY3QJJHJvdW5kcywuTGludgorX19fCiskbWFzazgwPSRpMTsKKyRtYXNrMWI9JGkyOworJG1hc2tmZT0kaTM7CiskY29kZS49PDxfX187CisJbGxnZgkkcm91bmRzLDI0MCgka2V5KQorCWFnaGkJJHJvdW5kcywtMQorCXNsbAkkcm91bmRzLDIJIyAocm91bmRzLTEpKjQKKwlsbGlsaAkkbWFzazgwLDB4ODA4MAorCWxsaWxoCSRtYXNrMWIsMHgxYjFiCisJbGxpbGgJJG1hc2tmZSwweGZlZmUKKwlvaWxsCSRtYXNrODAsMHg4MDgwCisJb2lsbAkkbWFzazFiLDB4MWIxYgorCW9pbGwJJG1hc2tmZSwweGZlZmUKKworLmFsaWduCTE2CisuTG1peDoJbAkkczAsMTYoJGtleSkJIyB0cDEKKwlscgkkczEsJHMwCisJbmdyCSRzMSwkbWFzazgwCisJc3JsZwkkdDEsJHMxLDcKKwlzbHIJJHMxLCR0MQorCW5yCSRzMSwkbWFzazFiCisJc2xsZwkkdDEsJHMwLDEKKwlucgkkdDEsJG1hc2tmZQorCXhyCSRzMSwkdDEJCSMgdHAyCisKKwlscgkkczIsJHMxCisJbmdyCSRzMiwkbWFzazgwCisJc3JsZwkkdDEsJHMyLDcKKwlzbHIJJHMyLCR0MQorCW5yCSRzMiwkbWFzazFiCisJc2xsZwkkdDEsJHMxLDEKKwlucgkkdDEsJG1hc2tmZQorCXhyCSRzMiwkdDEJCSMgdHA0CisKKwlscgkkczMsJHMyCisJbmdyCSRzMywkbWFzazgwCisJc3JsZwkkdDEsJHMzLDcKKwlzbHIJJHMzLCR0MQorCW5yCSRzMywkbWFzazFiCisJc2xsZwkkdDEsJHMyLDEKKwlucgkkdDEsJG1hc2tmZQorCXhyCSRzMywkdDEJCSMgdHA4CisKKwl4cgkkczEsJHMwCQkjIHRwMl50cDEKKwl4cgkkczIsJHMwCQkjIHRwNF50cDEKKwlybGwJJHMwLCRzMCwyNAkjID0gUk9UQVRFKHRwMSw4KQorCXhyCSRzMiwkczMJCSMgXj10cDgKKwl4cgkkczAsJHMxCQkjIF49dHAyXnRwMQorCXhyCSRzMSwkczMJCSMgdHAyXnRwMV50cDgKKwl4cgkkczAsJHMyCQkjIF49dHA0XnRwMV50cDgKKwlybGwJJHMxLCRzMSw4CisJcmxsCSRzMiwkczIsMTYKKwl4cgkkczAsJHMxCQkjIF49IFJPVEFURSh0cDhedHAyXnRwMSwyNCkKKwlybGwJJHMzLCRzMywyNAorCXhyCSRzMCwkczIgICAgCSMgXj0gUk9UQVRFKHRwOF50cDRedHAxLDE2KQorCXhyCSRzMCwkczMJCSMgXj0gUk9UQVRFKHRwOCw4KQorCisJc3QJJHMwLDE2KCRrZXkpCisJbGEJJGtleSw0KCRrZXkpCisJYnJjdAkkcm91bmRzLC5MbWl4CisKKwlsbWcJJXI2LCVyMTMsNDgoJHNwKSMgYXMgd2FzIHNhdmVkIGJ5IEFFU19zZXRfZW5jcnlwdF9rZXkhCisJbGdoaQklcjIsMAorCWJyCSRyYQorLnNpemUJQUVTX3NldF9kZWNyeXB0X2tleSwuLUFFU19zZXRfZGVjcnlwdF9rZXkKK19fXworCisjdm9pZCBBRVNfY2JjX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKyMgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoLCBjb25zdCBBRVNfS0VZICprZXksCisjICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqaXZlYywgY29uc3QgaW50IGVuYykKK3sKK215ICRpbnA9IiVyMiI7CitteSAkb3V0PSIlcjQiOwkjIGxlbmd0aCBhbmQgb3V0IGFyZSBzd2FwcGVkCitteSAkbGVuPSIlcjMiOworbXkgJGtleT0iJXI1IjsKK215ICRpdnA9IiVyNiI7CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAlBRVNfY2JjX2VuY3J5cHQKKy50eXBlCUFFU19jYmNfZW5jcnlwdCxcQGZ1bmN0aW9uCisuYWxpZ24JMTYKK0FFU19jYmNfZW5jcnlwdDoKKwl4Z3IJJXIzLCVyNAkJIyBmbGlwICVyMyBhbmQgJXI0LCBvdXQgYW5kIGxlbgorCXhncgklcjQsJXIzCisJeGdyCSVyMywlcjQKK19fXworJGNvZGUuPTw8X19fIGlmICghJHNvZnRvbmx5KTsKKwlsaGkJJXIwLDE2CisJY2wJJXIwLDI0MCgka2V5KQorCWpoCS5MY2JjX3NvZnR3YXJlCisKKwlsZwklcjAsMCgkaXZwKQkjIGNvcHkgaXZlYworCWxnCSVyMSw4KCRpdnApCisJc3RtZwklcjAsJXIxLDE2KCRzcCkKKwlsbWcJJXIwLCVyMSwwKCRrZXkpCSMgY29weSBrZXksIGNvdmVyIDI1NiBiaXQKKwlzdG1nCSVyMCwlcjEsMzIoJHNwKQorCWxtZwklcjAsJXIxLDE2KCRrZXkpCisJc3RtZwklcjAsJXIxLDQ4KCRzcCkKKwlsCSVyMCwyNDAoJGtleSkJIyBsb2FkIGttYyBjb2RlCisJbGdoaQkka2V5LDE1CQkjIHJlcz1sZW4lMTYsIGxlbi09cmVzOworCW5ncgkka2V5LCRsZW4KKwlzbGdyCSRsZW4sJGtleQorCWxhCSVyMSwxNigkc3ApCSMgcGFyYW1ldGVyIGJsb2NrIC0gaXZlYyB8fCBrZXkKKwlqegkuTGttY190cnVuY2F0ZWQKKwkubG9uZwkweGI5MmYwMDQyCSMga21jICVyNCwlcjIKKwlicmMJMSwuLTQJCSMgcGF5IGF0dGVudGlvbiB0byAicGFydGlhbCBjb21wbGV0aW9uIgorCWx0cgkka2V5LCRrZXkKKwlqbnoJLkxrbWNfdHJ1bmNhdGVkCisuTGttY19kb25lOgorCWxtZwklcjAsJXIxLDE2KCRzcCkJIyBjb3B5IGl2ZWMgdG8gY2FsbGVyCisJc3RnCSVyMCwwKCRpdnApCisJc3RnCSVyMSw4KCRpdnApCisJYnIJJHJhCisuYWxpZ24JMTYKKy5Ma21jX3RydW5jYXRlZDoKKwlhaGkJJGtleSwtMQkJIyBpdCdzIHRoZSB3YXkgaXQncyBlbmNvZGVkIGluIG12YworCXRtbGwJJXIwLDB4ODAKKwlqbnoJLkxrbWNfdHJ1bmNhdGVkX2RlYworCWxnaGkJJXIxLDAKKwlzdGcJJXIxLDEyOCgkc3ApCisJc3RnCSVyMSwxMzYoJHNwKQorCWJyYXMJJXIxLDFmCisJbXZjCTEyOCgxLCRzcCksMCgkaW5wKQorMToJZXgJJGtleSwwKCVyMSkKKwlsYQklcjEsMTYoJHNwKQkjIHJlc3RvcmUgcGFyYW1ldGVyIGJsb2NrCisJbGEJJGlucCwxMjgoJHNwKQorCWxnaGkJJGxlbiwxNgorCS5sb25nCTB4YjkyZjAwNDIJIyBrbWMgJXI0LCVyMgorCWoJLkxrbWNfZG9uZQorLmFsaWduCTE2CisuTGttY190cnVuY2F0ZWRfZGVjOgorCXN0Zwkkb3V0LDY0KCRzcCkKKwlsYQkkb3V0LDEyOCgkc3ApCisJbGdoaQkkbGVuLDE2CisJLmxvbmcJMHhiOTJmMDA0MgkjIGttYyAlcjQsJXIyCisJbGcJJG91dCw2NCgkc3ApCisJYnJhcwklcjEsMmYKKwltdmMJMCgxLCRvdXQpLDEyOCgkc3ApCisyOglleAkka2V5LDAoJXIxKQorCWoJLkxrbWNfZG9uZQorLmFsaWduCTE2CisuTGNiY19zb2Z0d2FyZToKK19fXworJGNvZGUuPTw8X19fOworCXN0bWcJJGtleSwkcmEsNDAoJHNwKQorCWxoaQklcjAsMAorCWNsCSVyMCwxNjQoJHNwKQorCWplCS5MY2JjX2RlY3J5cHQKKworCWxhcmwJJHRibCxBRVNfVGUKKworCWxsZ2YJJHMwLDAoJGl2cCkKKwlsbGdmCSRzMSw0KCRpdnApCisJbGxnZgkkczIsOCgkaXZwKQorCWxsZ2YJJHMzLDEyKCRpdnApCisKKwlsZ2hpCSR0MCwxNgorCXNsZ3IJJGxlbiwkdDAKKwlicmMJNCwuTGNiY19lbmNfdGFpbAkjIGlmIGJvcnJvdworLkxjYmNfZW5jX2xvb3A6CisJc3RtZwkkaW5wLCRvdXQsMTYoJHNwKQorCXgJJHMwLDAoJGlucCkKKwl4CSRzMSw0KCRpbnApCisJeAkkczIsOCgkaW5wKQorCXgJJHMzLDEyKCRpbnApCisJbGdyCSVyNCwka2V5CisKKwlicmFzCSRyYSxfczM5MHhfQUVTX2VuY3J5cHQKKworCWxtZwkkaW5wLCRrZXksMTYoJHNwKQorCXN0CSRzMCwwKCRvdXQpCisJc3QJJHMxLDQoJG91dCkKKwlzdAkkczIsOCgkb3V0KQorCXN0CSRzMywxMigkb3V0KQorCisJbGEJJGlucCwxNigkaW5wKQorCWxhCSRvdXQsMTYoJG91dCkKKwlsZ2hpCSR0MCwxNgorCWx0Z3IJJGxlbiwkbGVuCisJanoJLkxjYmNfZW5jX2RvbmUKKwlzbGdyCSRsZW4sJHQwCisJYnJjCTQsLkxjYmNfZW5jX3RhaWwJIyBpZiBib3Jyb3cKKwlqCS5MY2JjX2VuY19sb29wCisuYWxpZ24JMTYKKy5MY2JjX2VuY19kb25lOgorCWxnCSRpdnAsNDgoJHNwKQorCXN0CSRzMCwwKCRpdnApCisJc3QJJHMxLDQoJGl2cCkJCisJc3QJJHMyLDgoJGl2cCkKKwlzdAkkczMsMTIoJGl2cCkKKworCWxtZwklcjcsJHJhLDU2KCRzcCkKKwlicgkkcmEKKworLmFsaWduCTE2CisuTGNiY19lbmNfdGFpbDoKKwlhZ2hpCSRsZW4sMTUKKwlsZ2hpCSR0MCwwCisJc3RnCSR0MCwxMjgoJHNwKQorCXN0ZwkkdDAsMTM2KCRzcCkKKwlicmFzCSR0MSwzZgorCW12YwkxMjgoMSwkc3ApLDAoJGlucCkKKzM6CWV4CSRsZW4sMCgkdDEpCisJbGdoaQkkbGVuLDAKKwlsYQkkaW5wLDEyOCgkc3ApCisJagkuTGNiY19lbmNfbG9vcAorCisuYWxpZ24JMTYKKy5MY2JjX2RlY3J5cHQ6CisJbGFybAkkdGJsLEFFU19UZAorCisJbGcJJHQwLDAoJGl2cCkKKwlsZwkkdDEsOCgkaXZwKQorCXN0bWcJJHQwLCR0MSwxMjgoJHNwKQorCisuTGNiY19kZWNfbG9vcDoKKwlzdG1nCSRpbnAsJG91dCwxNigkc3ApCisJbGxnZgkkczAsMCgkaW5wKQorCWxsZ2YJJHMxLDQoJGlucCkKKwlsbGdmCSRzMiw4KCRpbnApCisJbGxnZgkkczMsMTIoJGlucCkKKwlsZ3IJJXI0LCRrZXkKKworCWJyYXMJJHJhLF9zMzkweF9BRVNfZGVjcnlwdAorCisJbG1nCSRpbnAsJGtleSwxNigkc3ApCisJc2xsZwkkczAsJHMwLDMyCisJc2xsZwkkczIsJHMyLDMyCisJbHIJJHMwLCRzMQorCWxyCSRzMiwkczMKKworCWxnCSR0MCwwKCRpbnApCisJbGcJJHQxLDgoJGlucCkKKwl4ZwkkczAsMTI4KCRzcCkKKwl4ZwkkczIsMTM2KCRzcCkKKwlsZ2hpCSRzMSwxNgorCXNsZ3IJJGxlbiwkczEKKwlicmMJNCwuTGNiY19kZWNfdGFpbAkjIGlmIGJvcnJvdworCWJyYwkyLC5MY2JjX2RlY19kb25lCSMgaWYgemVybworCXN0ZwkkczAsMCgkb3V0KQorCXN0ZwkkczIsOCgkb3V0KQorCXN0bWcJJHQwLCR0MSwxMjgoJHNwKQorCisJbGEJJGlucCwxNigkaW5wKQorCWxhCSRvdXQsMTYoJG91dCkKKwlqCS5MY2JjX2RlY19sb29wCisKKy5MY2JjX2RlY19kb25lOgorCXN0ZwkkczAsMCgkb3V0KQorCXN0ZwkkczIsOCgkb3V0KQorLkxjYmNfZGVjX2V4aXQ6CisJbG1nCSRpdnAsJHJhLDQ4KCRzcCkKKwlzdG1nCSR0MCwkdDEsMCgkaXZwKQorCisJYnIJJHJhCisKKy5hbGlnbgkxNgorLkxjYmNfZGVjX3RhaWw6CisJYWdoaQkkbGVuLDE1CisJc3RnCSRzMCwxMjgoJHNwKQorCXN0ZwkkczIsMTM2KCRzcCkKKwlicmFzCSRzMSw0ZgorCW12YwkwKDEsJG91dCksMTI4KCRzcCkKKzQ6CWV4CSRsZW4sMCgkczEpCisJagkuTGNiY19kZWNfZXhpdAorLnNpemUJQUVTX2NiY19lbmNyeXB0LC4tQUVTX2NiY19lbmNyeXB0CisuY29tbSAgT1BFTlNTTF9zMzkweGNhcF9QLDgsOAorX19fCit9CiskY29kZS49PDxfX187Cisuc3RyaW5nCSJBRVMgZm9yIHMzOTB4LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorX19fCisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworcHJpbnQgJGNvZGU7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMtc3BhcmN2OS5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9hZXMvYXNtL2Flcy1zcGFyY3Y5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1N2IzYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMtc3BhcmN2OS5wbApAQCAtMCwwICsxLDExODEgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFJpZ2h0cyBmb3IgcmVkaXN0cmlidXRpb24gYW5kIHVzYWdlIGluIHNvdXJjZSBhbmQgYmluYXJ5CisjIGZvcm1zIGFyZSBncmFudGVkIGFjY29yZGluZyB0byB0aGUgT3BlblNTTCBsaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBWZXJzaW9uIDEuMQorIworIyBUaGUgbWFqb3IgcmVhc29uIGZvciB1bmRlcnRha2VuIGVmZm9ydCB3YXMgdG8gbWl0aWdhdGUgdGhlIGhhemFyZCBvZgorIyBjYWNoZS10aW1pbmcgYXR0YWNrLiBUaGlzIGlzIFtjdXJyZW50bHkgYW5kIGluaXRpYWxseSFdIGFkZHJlc3NlZCBpbgorIyB0d28gd2F5cy4gMS4gUy1ib3hlcyBhcmUgY29tcHJlc3NlZCBmcm9tIDVLQiB0byAyS0IrMjU2QiBzaXplIGVhY2guCisjIDIuIFJlZmVyZW5jZXMgdG8gdGhlbSBhcmUgc2NoZWR1bGVkIGZvciBMMiBjYWNoZSBsYXRlbmN5LCBtZWFuaW5nCisjIHRoYXQgdGhlIHRhYmxlcyBkb24ndCBoYXZlIHRvIHJlc2lkZSBpbiBMMSBjYWNoZS4gT25jZSBhZ2FpbiwgdGhpcworIyBpcyBhbiBpbml0aWFsIGRyYWZ0IGFuZCBvbmUgc2hvdWxkIGV4cGVjdCBtb3JlIGNvdW50ZXJtZWFzdXJlcyB0bworIyBiZSBpbXBsZW1lbnRlZC4uLgorIworIyBWZXJzaW9uIDEuMSBwcmVmZXRjaGVzIFRbZWRdNCBpbiBvcmRlciB0byBtaXRpZ2F0ZSBhdHRhY2sgb24gbGFzdAorIyByb3VuZC4KKyMKKyMgRXZlbiB0aG91Z2ggcGVyZm9ybWFuY2Ugd2FzIG5vdCB0aGUgcHJpbWFyeSBnb2FsIFtvbiB0aGUgY29udHJhcnksCisjIGV4dHJhIHNoaWZ0cyAiaW5kdWNlZCIgYnkgY29tcHJlc3NlZCBTLWJveCBhbmQgbG9uZ2VyIGxvb3AgZXBpbG9ndWUKKyMgImluZHVjZWQiIGJ5IHNjaGVkdWxpbmcgZm9yIEwyIGhhdmUgbmVnYXRpdmUgZWZmZWN0IG9uIHBlcmZvcm1hbmNlXSwKKyMgdGhlIGNvZGUgdHVybmVkIG91dCB0byBydW4gaW4gfjIzIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUgZW4tLworIyBkZWNyeXB0ZWQgd2l0aCAxMjgtYml0IGtleS4gVGhpcyBpcyBwcmV0dHkgZ29vZCByZXN1bHQgZm9yIGNvZGUKKyMgd2l0aCBtZW50aW9uZWQgcXVhbGl0aWVzIGFuZCBVbHRyYVNQQVJDIGNvcmUuIENvbXBhcmVkIHRvIFN1biBDCisjIGdlbmVyYXRlZCBjb2RlIG15IGVuY3J5cHQgcHJvY2VkdXJlIHJ1bnMganVzdCBmZXcgcGVyY2VudHMgZmFzdGVyLAorIyB3aGlsZSBkZWNyeXB0IG9uZSAtIHdob2xlIDUwJSBmYXN0ZXIgW3llcywgU3VuIEMgZmFpbGVkIHRvIGdlbmVyYXRlCisjIG9wdGltYWwgZGVjcnlwdCBwcm9jZWR1cmVdLiBDb21wYXJlZCB0byBHTlUgQyBnZW5lcmF0ZWQgY29kZSBib3RoCisjIHByb2NlZHVyZXMgYXJlIG1vcmUgdGhhbiA2MCUgZmFzdGVyOi0pCisKKyRiaXRzPTMyOworZm9yIChAQVJHVikJeyAkYml0cz02NCBpZiAoL1wtbTY0LyB8fCAvXC14YXJjaFw9djkvKTsgfQoraWYgKCRiaXRzPT02NCkJeyAkYmlhcz0yMDQ3OyAkZnJhbWU9MTkyOyB9CitlbHNlCQl7ICRiaWFzPTA7ICAgICRmcmFtZT0xMTI7IH0KKyRsb2NhbHM9MTY7CisKKyRhY2MwPSIlbDAiOworJGFjYzE9IiVvMCI7CiskYWNjMj0iJW8xIjsKKyRhY2MzPSIlbzIiOworCiskYWNjND0iJWwxIjsKKyRhY2M1PSIlbzMiOworJGFjYzY9IiVvNCI7CiskYWNjNz0iJW81IjsKKworJGFjYzg9IiVsMiI7CiskYWNjOT0iJW83IjsKKyRhY2MxMD0iJWcxIjsKKyRhY2MxMT0iJWcyIjsKKworJGFjYzEyPSIlbDMiOworJGFjYzEzPSIlZzMiOworJGFjYzE0PSIlZzQiOworJGFjYzE1PSIlZzUiOworCiskdDA9IiVsNCI7CiskdDE9IiVsNSI7CiskdDI9IiVsNiI7CiskdDM9IiVsNyI7CisKKyRzMD0iJWkwIjsKKyRzMT0iJWkxIjsKKyRzMj0iJWkyIjsKKyRzMz0iJWkzIjsKKyR0Ymw9IiVpNCI7Ciska2V5PSIlaTUiOworJHJvdW5kcz0iJWk3IjsJIyBhbGlhc2VzIHdpdGggcmV0dXJuIGFkZHJlc3MsIHdoaWNoIGlzIG9mZi1sb2FkZWQgdG8gc3RhY2sKKworc3ViIF9kYXRhX3dvcmQoKQoreyBteSAkaTsKKyAgICB3aGlsZShkZWZpbmVkKCRpPXNoaWZ0KSkgeyAkY29kZS49c3ByaW50ZiJcdC5sb25nXHQweCUwOHgsMHglMDh4XG4iLCRpLCRpOyB9Cit9CisKKyRjb2RlLj08PF9fXyBpZiAoJGJpdHM9PTY0KTsKKy5yZWdpc3RlcgklZzIsI3NjcmF0Y2gKKy5yZWdpc3RlcgklZzMsI3NjcmF0Y2gKK19fXworJGNvZGUuPTw8X19fOworLnNlY3Rpb24JIi50ZXh0IiwjYWxsb2MsI2V4ZWNpbnN0cgorCisuYWxpZ24JMjU2CitBRVNfVGU6CitfX18KKyZfZGF0YV93b3JkKAorCTB4YzY2MzYzYTUsIDB4Zjg3YzdjODQsIDB4ZWU3Nzc3OTksIDB4ZjY3YjdiOGQsCisJMHhmZmYyZjIwZCwgMHhkNjZiNmJiZCwgMHhkZTZmNmZiMSwgMHg5MWM1YzU1NCwKKwkweDYwMzAzMDUwLCAweDAyMDEwMTAzLCAweGNlNjc2N2E5LCAweDU2MmIyYjdkLAorCTB4ZTdmZWZlMTksIDB4YjVkN2Q3NjIsIDB4NGRhYmFiZTYsIDB4ZWM3Njc2OWEsCisJMHg4ZmNhY2E0NSwgMHgxZjgyODI5ZCwgMHg4OWM5Yzk0MCwgMHhmYTdkN2Q4NywKKwkweGVmZmFmYTE1LCAweGIyNTk1OWViLCAweDhlNDc0N2M5LCAweGZiZjBmMDBiLAorCTB4NDFhZGFkZWMsIDB4YjNkNGQ0NjcsIDB4NWZhMmEyZmQsIDB4NDVhZmFmZWEsCisJMHgyMzljOWNiZiwgMHg1M2E0YTRmNywgMHhlNDcyNzI5NiwgMHg5YmMwYzA1YiwKKwkweDc1YjdiN2MyLCAweGUxZmRmZDFjLCAweDNkOTM5M2FlLCAweDRjMjYyNjZhLAorCTB4NmMzNjM2NWEsIDB4N2UzZjNmNDEsIDB4ZjVmN2Y3MDIsIDB4ODNjY2NjNGYsCisJMHg2ODM0MzQ1YywgMHg1MWE1YTVmNCwgMHhkMWU1ZTUzNCwgMHhmOWYxZjEwOCwKKwkweGUyNzE3MTkzLCAweGFiZDhkODczLCAweDYyMzEzMTUzLCAweDJhMTUxNTNmLAorCTB4MDgwNDA0MGMsIDB4OTVjN2M3NTIsIDB4NDYyMzIzNjUsIDB4OWRjM2MzNWUsCisJMHgzMDE4MTgyOCwgMHgzNzk2OTZhMSwgMHgwYTA1MDUwZiwgMHgyZjlhOWFiNSwKKwkweDBlMDcwNzA5LCAweDI0MTIxMjM2LCAweDFiODA4MDliLCAweGRmZTJlMjNkLAorCTB4Y2RlYmViMjYsIDB4NGUyNzI3NjksIDB4N2ZiMmIyY2QsIDB4ZWE3NTc1OWYsCisJMHgxMjA5MDkxYiwgMHgxZDgzODM5ZSwgMHg1ODJjMmM3NCwgMHgzNDFhMWEyZSwKKwkweDM2MWIxYjJkLCAweGRjNmU2ZWIyLCAweGI0NWE1YWVlLCAweDViYTBhMGZiLAorCTB4YTQ1MjUyZjYsIDB4NzYzYjNiNGQsIDB4YjdkNmQ2NjEsIDB4N2RiM2IzY2UsCisJMHg1MjI5Mjk3YiwgMHhkZGUzZTMzZSwgMHg1ZTJmMmY3MSwgMHgxMzg0ODQ5NywKKwkweGE2NTM1M2Y1LCAweGI5ZDFkMTY4LCAweDAwMDAwMDAwLCAweGMxZWRlZDJjLAorCTB4NDAyMDIwNjAsIDB4ZTNmY2ZjMWYsIDB4NzliMWIxYzgsIDB4YjY1YjViZWQsCisJMHhkNDZhNmFiZSwgMHg4ZGNiY2I0NiwgMHg2N2JlYmVkOSwgMHg3MjM5Mzk0YiwKKwkweDk0NGE0YWRlLCAweDk4NGM0Y2Q0LCAweGIwNTg1OGU4LCAweDg1Y2ZjZjRhLAorCTB4YmJkMGQwNmIsIDB4YzVlZmVmMmEsIDB4NGZhYWFhZTUsIDB4ZWRmYmZiMTYsCisJMHg4NjQzNDNjNSwgMHg5YTRkNGRkNywgMHg2NjMzMzM1NSwgMHgxMTg1ODU5NCwKKwkweDhhNDU0NWNmLCAweGU5ZjlmOTEwLCAweDA0MDIwMjA2LCAweGZlN2Y3ZjgxLAorCTB4YTA1MDUwZjAsIDB4NzgzYzNjNDQsIDB4MjU5ZjlmYmEsIDB4NGJhOGE4ZTMsCisJMHhhMjUxNTFmMywgMHg1ZGEzYTNmZSwgMHg4MDQwNDBjMCwgMHgwNThmOGY4YSwKKwkweDNmOTI5MmFkLCAweDIxOWQ5ZGJjLCAweDcwMzgzODQ4LCAweGYxZjVmNTA0LAorCTB4NjNiY2JjZGYsIDB4NzdiNmI2YzEsIDB4YWZkYWRhNzUsIDB4NDIyMTIxNjMsCisJMHgyMDEwMTAzMCwgMHhlNWZmZmYxYSwgMHhmZGYzZjMwZSwgMHhiZmQyZDI2ZCwKKwkweDgxY2RjZDRjLCAweDE4MGMwYzE0LCAweDI2MTMxMzM1LCAweGMzZWNlYzJmLAorCTB4YmU1ZjVmZTEsIDB4MzU5Nzk3YTIsIDB4ODg0NDQ0Y2MsIDB4MmUxNzE3MzksCisJMHg5M2M0YzQ1NywgMHg1NWE3YTdmMiwgMHhmYzdlN2U4MiwgMHg3YTNkM2Q0NywKKwkweGM4NjQ2NGFjLCAweGJhNWQ1ZGU3LCAweDMyMTkxOTJiLCAweGU2NzM3Mzk1LAorCTB4YzA2MDYwYTAsIDB4MTk4MTgxOTgsIDB4OWU0ZjRmZDEsIDB4YTNkY2RjN2YsCisJMHg0NDIyMjI2NiwgMHg1NDJhMmE3ZSwgMHgzYjkwOTBhYiwgMHgwYjg4ODg4MywKKwkweDhjNDY0NmNhLCAweGM3ZWVlZTI5LCAweDZiYjhiOGQzLCAweDI4MTQxNDNjLAorCTB4YTdkZWRlNzksIDB4YmM1ZTVlZTIsIDB4MTYwYjBiMWQsIDB4YWRkYmRiNzYsCisJMHhkYmUwZTAzYiwgMHg2NDMyMzI1NiwgMHg3NDNhM2E0ZSwgMHgxNDBhMGExZSwKKwkweDkyNDk0OWRiLCAweDBjMDYwNjBhLCAweDQ4MjQyNDZjLCAweGI4NWM1Y2U0LAorCTB4OWZjMmMyNWQsIDB4YmRkM2QzNmUsIDB4NDNhY2FjZWYsIDB4YzQ2MjYyYTYsCisJMHgzOTkxOTFhOCwgMHgzMTk1OTVhNCwgMHhkM2U0ZTQzNywgMHhmMjc5Nzk4YiwKKwkweGQ1ZTdlNzMyLCAweDhiYzhjODQzLCAweDZlMzczNzU5LCAweGRhNmQ2ZGI3LAorCTB4MDE4ZDhkOGMsIDB4YjFkNWQ1NjQsIDB4OWM0ZTRlZDIsIDB4NDlhOWE5ZTAsCisJMHhkODZjNmNiNCwgMHhhYzU2NTZmYSwgMHhmM2Y0ZjQwNywgMHhjZmVhZWEyNSwKKwkweGNhNjU2NWFmLCAweGY0N2E3YThlLCAweDQ3YWVhZWU5LCAweDEwMDgwODE4LAorCTB4NmZiYWJhZDUsIDB4ZjA3ODc4ODgsIDB4NGEyNTI1NmYsIDB4NWMyZTJlNzIsCisJMHgzODFjMWMyNCwgMHg1N2E2YTZmMSwgMHg3M2I0YjRjNywgMHg5N2M2YzY1MSwKKwkweGNiZThlODIzLCAweGExZGRkZDdjLCAweGU4NzQ3NDljLCAweDNlMWYxZjIxLAorCTB4OTY0YjRiZGQsIDB4NjFiZGJkZGMsIDB4MGQ4YjhiODYsIDB4MGY4YThhODUsCisJMHhlMDcwNzA5MCwgMHg3YzNlM2U0MiwgMHg3MWI1YjVjNCwgMHhjYzY2NjZhYSwKKwkweDkwNDg0OGQ4LCAweDA2MDMwMzA1LCAweGY3ZjZmNjAxLCAweDFjMGUwZTEyLAorCTB4YzI2MTYxYTMsIDB4NmEzNTM1NWYsIDB4YWU1NzU3ZjksIDB4NjliOWI5ZDAsCisJMHgxNzg2ODY5MSwgMHg5OWMxYzE1OCwgMHgzYTFkMWQyNywgMHgyNzllOWViOSwKKwkweGQ5ZTFlMTM4LCAweGViZjhmODEzLCAweDJiOTg5OGIzLCAweDIyMTExMTMzLAorCTB4ZDI2OTY5YmIsIDB4YTlkOWQ5NzAsIDB4MDc4ZThlODksIDB4MzM5NDk0YTcsCisJMHgyZDliOWJiNiwgMHgzYzFlMWUyMiwgMHgxNTg3ODc5MiwgMHhjOWU5ZTkyMCwKKwkweDg3Y2VjZTQ5LCAweGFhNTU1NWZmLCAweDUwMjgyODc4LCAweGE1ZGZkZjdhLAorCTB4MDM4YzhjOGYsIDB4NTlhMWExZjgsIDB4MDk4OTg5ODAsIDB4MWEwZDBkMTcsCisJMHg2NWJmYmZkYSwgMHhkN2U2ZTYzMSwgMHg4NDQyNDJjNiwgMHhkMDY4NjhiOCwKKwkweDgyNDE0MWMzLCAweDI5OTk5OWIwLCAweDVhMmQyZDc3LCAweDFlMGYwZjExLAorCTB4N2JiMGIwY2IsIDB4YTg1NDU0ZmMsIDB4NmRiYmJiZDYsIDB4MmMxNjE2M2EpOworJGNvZGUuPTw8X19fOworCS5ieXRlCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUKKwkuYnl0ZQkweDMwLCAweDAxLCAweDY3LCAweDJiLCAweGZlLCAweGQ3LCAweGFiLCAweDc2CisJLmJ5dGUJMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMAorCS5ieXRlCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAKKwkuYnl0ZQkweGI3LCAweGZkLCAweDkzLCAweDI2LCAweDM2LCAweDNmLCAweGY3LCAweGNjCisJLmJ5dGUJMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNQorCS5ieXRlCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEKKwkuYnl0ZQkweDA3LCAweDEyLCAweDgwLCAweGUyLCAweGViLCAweDI3LCAweGIyLCAweDc1CisJLmJ5dGUJMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMAorCS5ieXRlCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQKKwkuYnl0ZQkweDUzLCAweGQxLCAweDAwLCAweGVkLCAweDIwLCAweGZjLCAweGIxLCAweDViCisJLmJ5dGUJMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZgorCS5ieXRlCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUKKwkuYnl0ZQkweDQ1LCAweGY5LCAweDAyLCAweDdmLCAweDUwLCAweDNjLCAweDlmLCAweGE4CisJLmJ5dGUJMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNQorCS5ieXRlCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIKKwkuYnl0ZQkweGNkLCAweDBjLCAweDEzLCAweGVjLCAweDVmLCAweDk3LCAweDQ0LCAweDE3CisJLmJ5dGUJMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3MworCS5ieXRlCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgKKwkuYnl0ZQkweDQ2LCAweGVlLCAweGI4LCAweDE0LCAweGRlLCAweDVlLCAweDBiLCAweGRiCisJLmJ5dGUJMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1YworCS5ieXRlCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzkKKwkuYnl0ZQkweGU3LCAweGM4LCAweDM3LCAweDZkLCAweDhkLCAweGQ1LCAweDRlLCAweGE5CisJLmJ5dGUJMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOAorCS5ieXRlCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYKKwkuYnl0ZQkweGU4LCAweGRkLCAweDc0LCAweDFmLCAweDRiLCAweGJkLCAweDhiLCAweDhhCisJLmJ5dGUJMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZQorCS5ieXRlCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUKKwkuYnl0ZQkweGUxLCAweGY4LCAweDk4LCAweDExLCAweDY5LCAweGQ5LCAweDhlLCAweDk0CisJLmJ5dGUJMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZgorCS5ieXRlCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgKKwkuYnl0ZQkweDQxLCAweDk5LCAweDJkLCAweDBmLCAweGIwLCAweDU0LCAweGJiLCAweDE2CisudHlwZQlBRVNfVGUsI29iamVjdAorLnNpemUJQUVTX1RlLCguLUFFU19UZSkKKworLmFsaWduCTY0Cisuc2tpcAkxNgorX3NwYXJjdjlfQUVTX2VuY3J5cHQ6CisJc2F2ZQklc3AsLSRmcmFtZS0kbG9jYWxzLCVzcAorCXN0eAklaTcsWyVzcCskYmlhcyskZnJhbWUrMF0JISBvZmYtbG9hZCByZXR1cm4gYWRkcmVzcworCWxkCVska2V5KzI0MF0sJHJvdW5kcworCWxkCVska2V5KzBdLCR0MAorCWxkCVska2V5KzRdLCR0MQkJCSEKKwlsZAlbJGtleSs4XSwkdDIKKwlzcmwJJHJvdW5kcywxLCRyb3VuZHMKKwl4b3IJJHQwLCRzMCwkczAKKwlsZAlbJGtleSsxMl0sJHQzCisJc3JsCSRzMCwyMSwkYWNjMAorCXhvcgkkdDEsJHMxLCRzMQorCWxkCVska2V5KzE2XSwkdDAKKwlzcmwJJHMxLDEzLCRhY2MxCQkJIQorCXhvcgkkdDIsJHMyLCRzMgorCWxkCVska2V5KzIwXSwkdDEKKwl4b3IJJHQzLCRzMywkczMKKwlsZAlbJGtleSsyNF0sJHQyCisJYW5kCSRhY2MwLDIwNDAsJGFjYzAKKwlsZAlbJGtleSsyOF0sJHQzCisJbm9wCisuTGVuY19sb29wOgorCXNybAkkczIsNSwkYWNjMgkJCSEKKwlhbmQJJGFjYzEsMjA0MCwkYWNjMQorCWxkeAlbJHRibCskYWNjMF0sJGFjYzAKKwlzbGwJJHMzLDMsJGFjYzMKKwlhbmQJJGFjYzIsMjA0MCwkYWNjMgorCWxkeAlbJHRibCskYWNjMV0sJGFjYzEKKwlzcmwJJHMxLDIxLCRhY2M0CisJYW5kCSRhY2MzLDIwNDAsJGFjYzMKKwlsZHgJWyR0YmwrJGFjYzJdLCRhY2MyCQkhCisJc3JsCSRzMiwxMywkYWNjNQorCWFuZAkkYWNjNCwyMDQwLCRhY2M0CisJbGR4CVskdGJsKyRhY2MzXSwkYWNjMworCXNybAkkczMsNSwkYWNjNgorCWFuZAkkYWNjNSwyMDQwLCRhY2M1CisJbGR4CVskdGJsKyRhY2M0XSwkYWNjNAorCWZtb3ZzCSVmMCwlZjAKKwlzbGwJJHMwLDMsJGFjYzcJCQkhCisJYW5kCSRhY2M2LDIwNDAsJGFjYzYKKwlsZHgJWyR0YmwrJGFjYzVdLCRhY2M1CisJc3JsCSRzMiwyMSwkYWNjOAorCWFuZAkkYWNjNywyMDQwLCRhY2M3CisJbGR4CVskdGJsKyRhY2M2XSwkYWNjNgorCXNybAkkczMsMTMsJGFjYzkKKwlhbmQJJGFjYzgsMjA0MCwkYWNjOAorCWxkeAlbJHRibCskYWNjN10sJGFjYzcJCSEKKwlzcmwJJHMwLDUsJGFjYzEwCisJYW5kCSRhY2M5LDIwNDAsJGFjYzkKKwlsZHgJWyR0YmwrJGFjYzhdLCRhY2M4CisJc2xsCSRzMSwzLCRhY2MxMQorCWFuZAkkYWNjMTAsMjA0MCwkYWNjMTAKKwlsZHgJWyR0YmwrJGFjYzldLCRhY2M5CisJZm1vdnMJJWYwLCVmMAorCXNybAkkczMsMjEsJGFjYzEyCQkJIQorCWFuZAkkYWNjMTEsMjA0MCwkYWNjMTEKKwlsZHgJWyR0YmwrJGFjYzEwXSwkYWNjMTAKKwlzcmwJJHMwLDEzLCRhY2MxMworCWFuZAkkYWNjMTIsMjA0MCwkYWNjMTIKKwlsZHgJWyR0YmwrJGFjYzExXSwkYWNjMTEKKwlzcmwJJHMxLDUsJGFjYzE0CisJYW5kCSRhY2MxMywyMDQwLCRhY2MxMworCWxkeAlbJHRibCskYWNjMTJdLCRhY2MxMgkJIQorCXNsbAkkczIsMywkYWNjMTUKKwlhbmQJJGFjYzE0LDIwNDAsJGFjYzE0CisJbGR4CVskdGJsKyRhY2MxM10sJGFjYzEzCisJYW5kCSRhY2MxNSwyMDQwLCRhY2MxNQorCWFkZAkka2V5LDMyLCRrZXkKKwlsZHgJWyR0YmwrJGFjYzE0XSwkYWNjMTQKKwlmbW92cwklZjAsJWYwCisJc3ViY2MJJHJvdW5kcywxLCRyb3VuZHMJCSEKKwlsZHgJWyR0YmwrJGFjYzE1XSwkYWNjMTUKKwlieixhLHBuCSVpY2MsLkxlbmNfbGFzdAorCWFkZAkkdGJsLDIwNDgsJHJvdW5kcworCisJCXNybHgJJGFjYzEsOCwkYWNjMQorCQl4b3IJJGFjYzAsJHQwLCR0MAorCWxkCVska2V5KzBdLCRzMAorCWZtb3ZzCSVmMCwlZjAKKwkJc3JseAkkYWNjMiwxNiwkYWNjMgkJIQorCQl4b3IJJGFjYzEsJHQwLCR0MAorCWxkCVska2V5KzRdLCRzMQorCQlzcmx4CSRhY2MzLDI0LCRhY2MzCisJCXhvcgkkYWNjMiwkdDAsJHQwCisJbGQJWyRrZXkrOF0sJHMyCisJCXNybHgJJGFjYzUsOCwkYWNjNQorCQl4b3IJJGFjYzMsJHQwLCR0MAorCWxkCVska2V5KzEyXSwkczMJCQkhCisJCXNybHgJJGFjYzYsMTYsJGFjYzYKKwkJeG9yCSRhY2M0LCR0MSwkdDEKKwlmbW92cwklZjAsJWYwCisJCXNybHgJJGFjYzcsMjQsJGFjYzcKKwkJeG9yCSRhY2M1LCR0MSwkdDEKKwkJc3JseAkkYWNjOSw4LCRhY2M5CisJCXhvcgkkYWNjNiwkdDEsJHQxCisJCXNybHgJJGFjYzEwLDE2LCRhY2MxMAkhCisJCXhvcgkkYWNjNywkdDEsJHQxCisJCXNybHgJJGFjYzExLDI0LCRhY2MxMQorCQl4b3IJJGFjYzgsJHQyLCR0MgorCQlzcmx4CSRhY2MxMyw4LCRhY2MxMworCQl4b3IJJGFjYzksJHQyLCR0MgorCQlzcmx4CSRhY2MxNCwxNiwkYWNjMTQKKwkJeG9yCSRhY2MxMCwkdDIsJHQyCisJCXNybHgJJGFjYzE1LDI0LCRhY2MxNQkhCisJCXhvcgkkYWNjMTEsJHQyLCR0MgorCQl4b3IJJGFjYzEyLCRhY2MxNCwkYWNjMTQKKwkJeG9yCSRhY2MxMywkdDMsJHQzCisJc3JsCSR0MCwyMSwkYWNjMAorCQl4b3IJJGFjYzE0LCR0MywkdDMKKwlzcmwJJHQxLDEzLCRhY2MxCisJCXhvcgkkYWNjMTUsJHQzLCR0MworCisJYW5kCSRhY2MwLDIwNDAsJGFjYzAJCSEKKwlzcmwJJHQyLDUsJGFjYzIKKwlhbmQJJGFjYzEsMjA0MCwkYWNjMQorCWxkeAlbJHRibCskYWNjMF0sJGFjYzAKKwlzbGwJJHQzLDMsJGFjYzMKKwlhbmQJJGFjYzIsMjA0MCwkYWNjMgorCWxkeAlbJHRibCskYWNjMV0sJGFjYzEKKwlmbW92cwklZjAsJWYwCisJc3JsCSR0MSwyMSwkYWNjNAkJCSEKKwlhbmQJJGFjYzMsMjA0MCwkYWNjMworCWxkeAlbJHRibCskYWNjMl0sJGFjYzIKKwlzcmwJJHQyLDEzLCRhY2M1CisJYW5kCSRhY2M0LDIwNDAsJGFjYzQKKwlsZHgJWyR0YmwrJGFjYzNdLCRhY2MzCisJc3JsCSR0Myw1LCRhY2M2CisJYW5kCSRhY2M1LDIwNDAsJGFjYzUKKwlsZHgJWyR0YmwrJGFjYzRdLCRhY2M0CQkhCisJc2xsCSR0MCwzLCRhY2M3CisJYW5kCSRhY2M2LDIwNDAsJGFjYzYKKwlsZHgJWyR0YmwrJGFjYzVdLCRhY2M1CisJc3JsCSR0MiwyMSwkYWNjOAorCWFuZAkkYWNjNywyMDQwLCRhY2M3CisJbGR4CVskdGJsKyRhY2M2XSwkYWNjNgorCWZtb3ZzCSVmMCwlZjAKKwlzcmwJJHQzLDEzLCRhY2M5CQkJIQorCWFuZAkkYWNjOCwyMDQwLCRhY2M4CisJbGR4CVskdGJsKyRhY2M3XSwkYWNjNworCXNybAkkdDAsNSwkYWNjMTAKKwlhbmQJJGFjYzksMjA0MCwkYWNjOQorCWxkeAlbJHRibCskYWNjOF0sJGFjYzgKKwlzbGwJJHQxLDMsJGFjYzExCisJYW5kCSRhY2MxMCwyMDQwLCRhY2MxMAorCWxkeAlbJHRibCskYWNjOV0sJGFjYzkJCSEKKwlzcmwJJHQzLDIxLCRhY2MxMgorCWFuZAkkYWNjMTEsMjA0MCwkYWNjMTEKKwlsZHgJWyR0YmwrJGFjYzEwXSwkYWNjMTAKKwlzcmwJJHQwLDEzLCRhY2MxMworCWFuZAkkYWNjMTIsMjA0MCwkYWNjMTIKKwlsZHgJWyR0YmwrJGFjYzExXSwkYWNjMTEKKwlmbW92cwklZjAsJWYwCisJc3JsCSR0MSw1LCRhY2MxNAkJCSEKKwlhbmQJJGFjYzEzLDIwNDAsJGFjYzEzCisJbGR4CVskdGJsKyRhY2MxMl0sJGFjYzEyCisJc2xsCSR0MiwzLCRhY2MxNQorCWFuZAkkYWNjMTQsMjA0MCwkYWNjMTQKKwlsZHgJWyR0YmwrJGFjYzEzXSwkYWNjMTMKKwkJc3JseAkkYWNjMSw4LCRhY2MxCisJYW5kCSRhY2MxNSwyMDQwLCRhY2MxNQorCWxkeAlbJHRibCskYWNjMTRdLCRhY2MxNAkJIQorCisJCXNybHgJJGFjYzIsMTYsJGFjYzIKKwkJeG9yCSRhY2MwLCRzMCwkczAKKwlsZHgJWyR0YmwrJGFjYzE1XSwkYWNjMTUKKwkJc3JseAkkYWNjMywyNCwkYWNjMworCQl4b3IJJGFjYzEsJHMwLCRzMAorCWxkCVska2V5KzE2XSwkdDAKKwlmbW92cwklZjAsJWYwCisJCXNybHgJJGFjYzUsOCwkYWNjNQkJIQorCQl4b3IJJGFjYzIsJHMwLCRzMAorCWxkCVska2V5KzIwXSwkdDEKKwkJc3JseAkkYWNjNiwxNiwkYWNjNgorCQl4b3IJJGFjYzMsJHMwLCRzMAorCWxkCVska2V5KzI0XSwkdDIKKwkJc3JseAkkYWNjNywyNCwkYWNjNworCQl4b3IJJGFjYzQsJHMxLCRzMQorCWxkCVska2V5KzI4XSwkdDMJCQkhCisJCXNybHgJJGFjYzksOCwkYWNjOQorCQl4b3IJJGFjYzUsJHMxLCRzMQorCWxkeAlbJHRibCsyMDQ4KzBdLCVnMAkJISBwcmVmZXRjaCB0ZTQKKwkJc3JseAkkYWNjMTAsMTYsJGFjYzEwCisJCXhvcgkkYWNjNiwkczEsJHMxCisJbGR4CVskdGJsKzIwNDgrMzJdLCVnMAkJISBwcmVmZXRjaCB0ZTQKKwkJc3JseAkkYWNjMTEsMjQsJGFjYzExCisJCXhvcgkkYWNjNywkczEsJHMxCisJbGR4CVskdGJsKzIwNDgrNjRdLCVnMAkJISBwcmVmZXRjaCB0ZTQKKwkJc3JseAkkYWNjMTMsOCwkYWNjMTMKKwkJeG9yCSRhY2M4LCRzMiwkczIKKwlsZHgJWyR0YmwrMjA0OCs5Nl0sJWcwCQkhIHByZWZldGNoIHRlNAorCQlzcmx4CSRhY2MxNCwxNiwkYWNjMTQJIQorCQl4b3IJJGFjYzksJHMyLCRzMgorCWxkeAlbJHRibCsyMDQ4KzEyOF0sJWcwCQkhIHByZWZldGNoIHRlNAorCQlzcmx4CSRhY2MxNSwyNCwkYWNjMTUKKwkJeG9yCSRhY2MxMCwkczIsJHMyCisJbGR4CVskdGJsKzIwNDgrMTYwXSwlZzAJCSEgcHJlZmV0Y2ggdGU0CisJc3JsCSRzMCwyMSwkYWNjMAorCQl4b3IJJGFjYzExLCRzMiwkczIKKwlsZHgJWyR0YmwrMjA0OCsxOTJdLCVnMAkJISBwcmVmZXRjaCB0ZTQKKwkJeG9yCSRhY2MxMiwkYWNjMTQsJGFjYzE0CisJCXhvcgkkYWNjMTMsJHMzLCRzMworCWxkeAlbJHRibCsyMDQ4KzIyNF0sJWcwCQkhIHByZWZldGNoIHRlNAorCXNybAkkczEsMTMsJGFjYzEJCQkhCisJCXhvcgkkYWNjMTQsJHMzLCRzMworCQl4b3IJJGFjYzE1LCRzMywkczMKKwliYQkuTGVuY19sb29wCisJYW5kCSRhY2MwLDIwNDAsJGFjYzAKKworLmFsaWduCTMyCisuTGVuY19sYXN0OgorCQlzcmx4CSRhY2MxLDgsJGFjYzEJCSEKKwkJeG9yCSRhY2MwLCR0MCwkdDAKKwlsZAlbJGtleSswXSwkczAKKwkJc3JseAkkYWNjMiwxNiwkYWNjMgorCQl4b3IJJGFjYzEsJHQwLCR0MAorCWxkCVska2V5KzRdLCRzMQorCQlzcmx4CSRhY2MzLDI0LCRhY2MzCisJCXhvcgkkYWNjMiwkdDAsJHQwCisJbGQJWyRrZXkrOF0sJHMyCQkJIQorCQlzcmx4CSRhY2M1LDgsJGFjYzUKKwkJeG9yCSRhY2MzLCR0MCwkdDAKKwlsZAlbJGtleSsxMl0sJHMzCisJCXNybHgJJGFjYzYsMTYsJGFjYzYKKwkJeG9yCSRhY2M0LCR0MSwkdDEKKwkJc3JseAkkYWNjNywyNCwkYWNjNworCQl4b3IJJGFjYzUsJHQxLCR0MQorCQlzcmx4CSRhY2M5LDgsJGFjYzkJCSEKKwkJeG9yCSRhY2M2LCR0MSwkdDEKKwkJc3JseAkkYWNjMTAsMTYsJGFjYzEwCisJCXhvcgkkYWNjNywkdDEsJHQxCisJCXNybHgJJGFjYzExLDI0LCRhY2MxMQorCQl4b3IJJGFjYzgsJHQyLCR0MgorCQlzcmx4CSRhY2MxMyw4LCRhY2MxMworCQl4b3IJJGFjYzksJHQyLCR0MgorCQlzcmx4CSRhY2MxNCwxNiwkYWNjMTQJIQorCQl4b3IJJGFjYzEwLCR0MiwkdDIKKwkJc3JseAkkYWNjMTUsMjQsJGFjYzE1CisJCXhvcgkkYWNjMTEsJHQyLCR0MgorCQl4b3IJJGFjYzEyLCRhY2MxNCwkYWNjMTQKKwkJeG9yCSRhY2MxMywkdDMsJHQzCisJc3JsCSR0MCwyNCwkYWNjMAorCQl4b3IJJGFjYzE0LCR0MywkdDMKKwlzcmwJJHQxLDE2LCRhY2MxCQkJIQorCQl4b3IJJGFjYzE1LCR0MywkdDMKKworCXNybAkkdDIsOCwkYWNjMgorCWFuZAkkYWNjMSwyNTUsJGFjYzEKKwlsZHViCVskcm91bmRzKyRhY2MwXSwkYWNjMAorCXNybAkkdDEsMjQsJGFjYzQKKwlhbmQJJGFjYzIsMjU1LCRhY2MyCisJbGR1YglbJHJvdW5kcyskYWNjMV0sJGFjYzEKKwlzcmwJJHQyLDE2LCRhY2M1CQkJIQorCWFuZAkkdDMsMjU1LCRhY2MzCisJbGR1YglbJHJvdW5kcyskYWNjMl0sJGFjYzIKKwlsZHViCVskcm91bmRzKyRhY2MzXSwkYWNjMworCXNybAkkdDMsOCwkYWNjNgorCWFuZAkkYWNjNSwyNTUsJGFjYzUKKwlsZHViCVskcm91bmRzKyRhY2M0XSwkYWNjNAorCWZtb3ZzCSVmMCwlZjAKKwlzcmwJJHQyLDI0LCRhY2M4CQkJIQorCWFuZAkkYWNjNiwyNTUsJGFjYzYKKwlsZHViCVskcm91bmRzKyRhY2M1XSwkYWNjNQorCXNybAkkdDMsMTYsJGFjYzkKKwlhbmQJJHQwLDI1NSwkYWNjNworCWxkdWIJWyRyb3VuZHMrJGFjYzZdLCRhY2M2CisJbGR1YglbJHJvdW5kcyskYWNjN10sJGFjYzcKKwlmbW92cwklZjAsJWYwCisJc3JsCSR0MCw4LCRhY2MxMAkJCSEKKwlhbmQJJGFjYzksMjU1LCRhY2M5CisJbGR1YglbJHJvdW5kcyskYWNjOF0sJGFjYzgKKwlzcmwJJHQzLDI0LCRhY2MxMgorCWFuZAkkYWNjMTAsMjU1LCRhY2MxMAorCWxkdWIJWyRyb3VuZHMrJGFjYzldLCRhY2M5CisJc3JsCSR0MCwxNiwkYWNjMTMKKwlhbmQJJHQxLDI1NSwkYWNjMTEKKwlsZHViCVskcm91bmRzKyRhY2MxMF0sJGFjYzEwCQkhCisJc3JsCSR0MSw4LCRhY2MxNAorCWFuZAkkYWNjMTMsMjU1LCRhY2MxMworCWxkdWIJWyRyb3VuZHMrJGFjYzExXSwkYWNjMTEKKwlsZHViCVskcm91bmRzKyRhY2MxMl0sJGFjYzEyCisJYW5kCSRhY2MxNCwyNTUsJGFjYzE0CisJbGR1YglbJHJvdW5kcyskYWNjMTNdLCRhY2MxMworCWFuZAkkdDIsMjU1LCRhY2MxNQorCWxkdWIJWyRyb3VuZHMrJGFjYzE0XSwkYWNjMTQJCSEKKworCQlzbGwJJGFjYzAsMjQsJGFjYzAKKwkJeG9yCSRhY2MzLCRzMCwkczAKKwlsZHViCVskcm91bmRzKyRhY2MxNV0sJGFjYzE1CisJCXNsbAkkYWNjMSwxNiwkYWNjMQorCQl4b3IJJGFjYzAsJHMwLCRzMAorCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSswXSwlaTcJISByZXN0b3JlIHJldHVybiBhZGRyZXNzCisJZm1vdnMJJWYwLCVmMAorCQlzbGwJJGFjYzIsOCwkYWNjMgkJIQorCQl4b3IJJGFjYzEsJHMwLCRzMAorCQlzbGwJJGFjYzQsMjQsJGFjYzQKKwkJeG9yCSRhY2MyLCRzMCwkczAKKwkJc2xsCSRhY2M1LDE2LCRhY2M1CisJCXhvcgkkYWNjNywkczEsJHMxCisJCXNsbAkkYWNjNiw4LCRhY2M2CisJCXhvcgkkYWNjNCwkczEsJHMxCisJCXNsbAkkYWNjOCwyNCwkYWNjOAkJIQorCQl4b3IJJGFjYzUsJHMxLCRzMQorCQlzbGwJJGFjYzksMTYsJGFjYzkKKwkJeG9yCSRhY2MxMSwkczIsJHMyCisJCXNsbAkkYWNjMTAsOCwkYWNjMTAKKwkJeG9yCSRhY2M2LCRzMSwkczEKKwkJc2xsCSRhY2MxMiwyNCwkYWNjMTIKKwkJeG9yCSRhY2M4LCRzMiwkczIKKwkJc2xsCSRhY2MxMywxNiwkYWNjMTMJIQorCQl4b3IJJGFjYzksJHMyLCRzMgorCQlzbGwJJGFjYzE0LDgsJGFjYzE0CisJCXhvcgkkYWNjMTAsJHMyLCRzMgorCQl4b3IJJGFjYzEyLCRhY2MxNCwkYWNjMTQKKwkJeG9yCSRhY2MxMywkczMsJHMzCisJCXhvcgkkYWNjMTQsJHMzLCRzMworCQl4b3IJJGFjYzE1LCRzMywkczMKKworCXJldAorCXJlc3RvcmUKKy50eXBlCV9zcGFyY3Y5X0FFU19lbmNyeXB0LCNmdW5jdGlvbgorLnNpemUJX3NwYXJjdjlfQUVTX2VuY3J5cHQsKC4tX3NwYXJjdjlfQUVTX2VuY3J5cHQpCisKKy5hbGlnbgkzMgorLmdsb2JsCUFFU19lbmNyeXB0CitBRVNfZW5jcnlwdDoKKwlvcgklbzAsJW8xLCVnMQorCWFuZGNjCSVnMSwzLCVnMAorCWJueixwbgkleGNjLC5MdW5hbGlnbmVkX2VuYworCXNhdmUJJXNwLC0kZnJhbWUsJXNwCisKKwlsZAlbJWkwKzBdLCVvMAorCWxkCVslaTArNF0sJW8xCisJbGQJWyVpMCs4XSwlbzIKKwlsZAlbJWkwKzEyXSwlbzMKKworMToJY2FsbAkuKzgKKwlhZGQJJW83LEFFU19UZS0xYiwlbzQKKwljYWxsCV9zcGFyY3Y5X0FFU19lbmNyeXB0CisJbW92CSVpMiwlbzUKKworCXN0CSVvMCxbJWkxKzBdCisJc3QJJW8xLFslaTErNF0KKwlzdAklbzIsWyVpMSs4XQorCXN0CSVvMyxbJWkxKzEyXQorCisJcmV0CisJcmVzdG9yZQorCisuYWxpZ24JMzIKKy5MdW5hbGlnbmVkX2VuYzoKKwlsZHViCVslaTArMF0sJWwwCisJbGR1YglbJWkwKzFdLCVsMQorCWxkdWIJWyVpMCsyXSwlbDIKKworCXNsbAklbDAsMjQsJWwwCisJbGR1YglbJWkwKzNdLCVsMworCXNsbAklbDEsMTYsJWwxCisJbGR1YglbJWkwKzRdLCVsNAorCXNsbAklbDIsOCwlbDIKKwlvcgklbDEsJWwwLCVsMAorCWxkdWIJWyVpMCs1XSwlbDUKKwlzbGwJJWw0LDI0LCVsNAorCW9yCSVsMywlbDIsJWwyCisJbGR1YglbJWkwKzZdLCVsNgorCXNsbAklbDUsMTYsJWw1CisJb3IJJWwwLCVsMiwlbzAKKwlsZHViCVslaTArN10sJWw3CisKKwlzbGwJJWw2LDgsJWw2CisJb3IJJWw1LCVsNCwlbDQKKwlsZHViCVslaTArOF0sJWwwCisJb3IJJWw3LCVsNiwlbDYKKwlsZHViCVslaTArOV0sJWwxCisJb3IJJWw0LCVsNiwlbzEKKwlsZHViCVslaTArMTBdLCVsMgorCisJc2xsCSVsMCwyNCwlbDAKKwlsZHViCVslaTArMTFdLCVsMworCXNsbAklbDEsMTYsJWwxCisJbGR1YglbJWkwKzEyXSwlbDQKKwlzbGwJJWwyLDgsJWwyCisJb3IJJWwxLCVsMCwlbDAKKwlsZHViCVslaTArMTNdLCVsNQorCXNsbAklbDQsMjQsJWw0CisJb3IJJWwzLCVsMiwlbDIKKwlsZHViCVslaTArMTRdLCVsNgorCXNsbAklbDUsMTYsJWw1CisJb3IJJWwwLCVsMiwlbzIKKwlsZHViCVslaTArMTVdLCVsNworCisJc2xsCSVsNiw4LCVsNgorCW9yCSVsNSwlbDQsJWw0CisJb3IJJWw3LCVsNiwlbDYKKwlvcgklbDQsJWw2LCVvMworCisxOgljYWxsCS4rOAorCWFkZAklbzcsQUVTX1RlLTFiLCVvNAorCWNhbGwJX3NwYXJjdjlfQUVTX2VuY3J5cHQKKwltb3YJJWkyLCVvNQorCisJc3JsCSVvMCwyNCwlbDAKKwlzcmwJJW8wLDE2LCVsMQorCXN0YgklbDAsWyVpMSswXQorCXNybAklbzAsOCwlbDIKKwlzdGIJJWwxLFslaTErMV0KKwlzdGIJJWwyLFslaTErMl0KKwlzcmwJJW8xLDI0LCVsNAorCXN0YgklbzAsWyVpMSszXQorCisJc3JsCSVvMSwxNiwlbDUKKwlzdGIJJWw0LFslaTErNF0KKwlzcmwJJW8xLDgsJWw2CisJc3RiCSVsNSxbJWkxKzVdCisJc3RiCSVsNixbJWkxKzZdCisJc3JsCSVvMiwyNCwlbDAKKwlzdGIJJW8xLFslaTErN10KKworCXNybAklbzIsMTYsJWwxCisJc3RiCSVsMCxbJWkxKzhdCisJc3JsCSVvMiw4LCVsMgorCXN0YgklbDEsWyVpMSs5XQorCXN0YgklbDIsWyVpMSsxMF0KKwlzcmwJJW8zLDI0LCVsNAorCXN0YgklbzIsWyVpMSsxMV0KKworCXNybAklbzMsMTYsJWw1CisJc3RiCSVsNCxbJWkxKzEyXQorCXNybAklbzMsOCwlbDYKKwlzdGIJJWw1LFslaTErMTNdCisJc3RiCSVsNixbJWkxKzE0XQorCXN0YgklbzMsWyVpMSsxNV0KKworCXJldAorCXJlc3RvcmUKKy50eXBlCUFFU19lbmNyeXB0LCNmdW5jdGlvbgorLnNpemUJQUVTX2VuY3J5cHQsKC4tQUVTX2VuY3J5cHQpCisKK19fXworCiskY29kZS49PDxfX187CisuYWxpZ24JMjU2CitBRVNfVGQ6CitfX18KKyZfZGF0YV93b3JkKAorCTB4NTFmNGE3NTAsIDB4N2U0MTY1NTMsIDB4MWExN2E0YzMsIDB4M2EyNzVlOTYsCisJMHgzYmFiNmJjYiwgMHgxZjlkNDVmMSwgMHhhY2ZhNThhYiwgMHg0YmUzMDM5MywKKwkweDIwMzBmYTU1LCAweGFkNzY2ZGY2LCAweDg4Y2M3NjkxLCAweGY1MDI0YzI1LAorCTB4NGZlNWQ3ZmMsIDB4YzUyYWNiZDcsIDB4MjYzNTQ0ODAsIDB4YjU2MmEzOGYsCisJMHhkZWIxNWE0OSwgMHgyNWJhMWI2NywgMHg0NWVhMGU5OCwgMHg1ZGZlYzBlMSwKKwkweGMzMmY3NTAyLCAweDgxNGNmMDEyLCAweDhkNDY5N2EzLCAweDZiZDNmOWM2LAorCTB4MDM4ZjVmZTcsIDB4MTU5MjljOTUsIDB4YmY2ZDdhZWIsIDB4OTU1MjU5ZGEsCisJMHhkNGJlODMyZCwgMHg1ODc0MjFkMywgMHg0OWUwNjkyOSwgMHg4ZWM5Yzg0NCwKKwkweDc1YzI4OTZhLCAweGY0OGU3OTc4LCAweDk5NTgzZTZiLCAweDI3Yjk3MWRkLAorCTB4YmVlMTRmYjYsIDB4ZjA4OGFkMTcsIDB4YzkyMGFjNjYsIDB4N2RjZTNhYjQsCisJMHg2M2RmNGExOCwgMHhlNTFhMzE4MiwgMHg5NzUxMzM2MCwgMHg2MjUzN2Y0NSwKKwkweGIxNjQ3N2UwLCAweGJiNmJhZTg0LCAweGZlODFhMDFjLCAweGY5MDgyYjk0LAorCTB4NzA0ODY4NTgsIDB4OGY0NWZkMTksIDB4OTRkZTZjODcsIDB4NTI3YmY4YjcsCisJMHhhYjczZDMyMywgMHg3MjRiMDJlMiwgMHhlMzFmOGY1NywgMHg2NjU1YWIyYSwKKwkweGIyZWIyODA3LCAweDJmYjVjMjAzLCAweDg2YzU3YjlhLCAweGQzMzcwOGE1LAorCTB4MzAyODg3ZjIsIDB4MjNiZmE1YjIsIDB4MDIwMzZhYmEsIDB4ZWQxNjgyNWMsCisJMHg4YWNmMWMyYiwgMHhhNzc5YjQ5MiwgMHhmMzA3ZjJmMCwgMHg0ZTY5ZTJhMSwKKwkweDY1ZGFmNGNkLCAweDA2MDViZWQ1LCAweGQxMzQ2MjFmLCAweGM0YTZmZThhLAorCTB4MzQyZTUzOWQsIDB4YTJmMzU1YTAsIDB4MDU4YWUxMzIsIDB4YTRmNmViNzUsCisJMHgwYjgzZWMzOSwgMHg0MDYwZWZhYSwgMHg1ZTcxOWYwNiwgMHhiZDZlMTA1MSwKKwkweDNlMjE4YWY5LCAweDk2ZGQwNjNkLCAweGRkM2UwNWFlLCAweDRkZTZiZDQ2LAorCTB4OTE1NDhkYjUsIDB4NzFjNDVkMDUsIDB4MDQwNmQ0NmYsIDB4NjA1MDE1ZmYsCisJMHgxOTk4ZmIyNCwgMHhkNmJkZTk5NywgMHg4OTQwNDNjYywgMHg2N2Q5OWU3NywKKwkweGIwZTg0MmJkLCAweDA3ODk4Yjg4LCAweGU3MTk1YjM4LCAweDc5YzhlZWRiLAorCTB4YTE3YzBhNDcsIDB4N2M0MjBmZTksIDB4Zjg4NDFlYzksIDB4MDAwMDAwMDAsCisJMHgwOTgwODY4MywgMHgzMjJiZWQ0OCwgMHgxZTExNzBhYywgMHg2YzVhNzI0ZSwKKwkweGZkMGVmZmZiLCAweDBmODUzODU2LCAweDNkYWVkNTFlLCAweDM2MmQzOTI3LAorCTB4MGEwZmQ5NjQsIDB4Njg1Y2E2MjEsIDB4OWI1YjU0ZDEsIDB4MjQzNjJlM2EsCisJMHgwYzBhNjdiMSwgMHg5MzU3ZTcwZiwgMHhiNGVlOTZkMiwgMHgxYjliOTE5ZSwKKwkweDgwYzBjNTRmLCAweDYxZGMyMGEyLCAweDVhNzc0YjY5LCAweDFjMTIxYTE2LAorCTB4ZTI5M2JhMGEsIDB4YzBhMDJhZTUsIDB4M2MyMmUwNDMsIDB4MTIxYjE3MWQsCisJMHgwZTA5MGQwYiwgMHhmMjhiYzdhZCwgMHgyZGI2YThiOSwgMHgxNDFlYTljOCwKKwkweDU3ZjExOTg1LCAweGFmNzUwNzRjLCAweGVlOTlkZGJiLCAweGEzN2Y2MGZkLAorCTB4ZjcwMTI2OWYsIDB4NWM3MmY1YmMsIDB4NDQ2NjNiYzUsIDB4NWJmYjdlMzQsCisJMHg4YjQzMjk3NiwgMHhjYjIzYzZkYywgMHhiNmVkZmM2OCwgMHhiOGU0ZjE2MywKKwkweGQ3MzFkY2NhLCAweDQyNjM4NTEwLCAweDEzOTcyMjQwLCAweDg0YzYxMTIwLAorCTB4ODU0YTI0N2QsIDB4ZDJiYjNkZjgsIDB4YWVmOTMyMTEsIDB4YzcyOWExNmQsCisJMHgxZDllMmY0YiwgMHhkY2IyMzBmMywgMHgwZDg2NTJlYywgMHg3N2MxZTNkMCwKKwkweDJiYjMxNjZjLCAweGE5NzBiOTk5LCAweDExOTQ0OGZhLCAweDQ3ZTk2NDIyLAorCTB4YThmYzhjYzQsIDB4YTBmMDNmMWEsIDB4NTY3ZDJjZDgsIDB4MjIzMzkwZWYsCisJMHg4NzQ5NGVjNywgMHhkOTM4ZDFjMSwgMHg4Y2NhYTJmZSwgMHg5OGQ0MGIzNiwKKwkweGE2ZjU4MWNmLCAweGE1N2FkZTI4LCAweGRhYjc4ZTI2LCAweDNmYWRiZmE0LAorCTB4MmMzYTlkZTQsIDB4NTA3ODkyMGQsIDB4NmE1ZmNjOWIsIDB4NTQ3ZTQ2NjIsCisJMHhmNjhkMTNjMiwgMHg5MGQ4YjhlOCwgMHgyZTM5Zjc1ZSwgMHg4MmMzYWZmNSwKKwkweDlmNWQ4MGJlLCAweDY5ZDA5MzdjLCAweDZmZDUyZGE5LCAweGNmMjUxMmIzLAorCTB4YzhhYzk5M2IsIDB4MTAxODdkYTcsIDB4ZTg5YzYzNmUsIDB4ZGIzYmJiN2IsCisJMHhjZDI2NzgwOSwgMHg2ZTU5MThmNCwgMHhlYzlhYjcwMSwgMHg4MzRmOWFhOCwKKwkweGU2OTU2ZTY1LCAweGFhZmZlNjdlLCAweDIxYmNjZjA4LCAweGVmMTVlOGU2LAorCTB4YmFlNzliZDksIDB4NGE2ZjM2Y2UsIDB4ZWE5ZjA5ZDQsIDB4MjliMDdjZDYsCisJMHgzMWE0YjJhZiwgMHgyYTNmMjMzMSwgMHhjNmE1OTQzMCwgMHgzNWEyNjZjMCwKKwkweDc0NGViYzM3LCAweGZjODJjYWE2LCAweGUwOTBkMGIwLCAweDMzYTdkODE1LAorCTB4ZjEwNDk4NGEsIDB4NDFlY2RhZjcsIDB4N2ZjZDUwMGUsIDB4MTc5MWY2MmYsCisJMHg3NjRkZDY4ZCwgMHg0M2VmYjA0ZCwgMHhjY2FhNGQ1NCwgMHhlNDk2MDRkZiwKKwkweDllZDFiNWUzLCAweDRjNmE4ODFiLCAweGMxMmMxZmI4LCAweDQ2NjU1MTdmLAorCTB4OWQ1ZWVhMDQsIDB4MDE4YzM1NWQsIDB4ZmE4Nzc0NzMsIDB4ZmIwYjQxMmUsCisJMHhiMzY3MWQ1YSwgMHg5MmRiZDI1MiwgMHhlOTEwNTYzMywgMHg2ZGQ2NDcxMywKKwkweDlhZDc2MThjLCAweDM3YTEwYzdhLCAweDU5ZjgxNDhlLCAweGViMTMzYzg5LAorCTB4Y2VhOTI3ZWUsIDB4Yjc2MWM5MzUsIDB4ZTExY2U1ZWQsIDB4N2E0N2IxM2MsCisJMHg5Y2QyZGY1OSwgMHg1NWYyNzMzZiwgMHgxODE0Y2U3OSwgMHg3M2M3MzdiZiwKKwkweDUzZjdjZGVhLCAweDVmZmRhYTViLCAweGRmM2Q2ZjE0LCAweDc4NDRkYjg2LAorCTB4Y2FhZmYzODEsIDB4Yjk2OGM0M2UsIDB4MzgyNDM0MmMsIDB4YzJhMzQwNWYsCisJMHgxNjFkYzM3MiwgMHhiY2UyMjUwYywgMHgyODNjNDk4YiwgMHhmZjBkOTU0MSwKKwkweDM5YTgwMTcxLCAweDA4MGNiM2RlLCAweGQ4YjRlNDljLCAweDY0NTZjMTkwLAorCTB4N2JjYjg0NjEsIDB4ZDUzMmI2NzAsIDB4NDg2YzVjNzQsIDB4ZDBiODU3NDIpOworJGNvZGUuPTw8X19fOworCS5ieXRlCTB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgKKwkuYnl0ZQkweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiCisJLmJ5dGUJMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4NworCS5ieXRlCTB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IKKwkuYnl0ZQkweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkCisJLmJ5dGUJMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZQorCS5ieXRlCTB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIKKwkuYnl0ZQkweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1CisJLmJ5dGUJMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNgorCS5ieXRlCTB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIKKwkuYnl0ZQkweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhCisJLmJ5dGUJMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NAorCS5ieXRlCTB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEKKwkuYnl0ZQkweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2CisJLmJ5dGUJMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMgorCS5ieXRlCTB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIKKwkuYnl0ZQkweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhCisJLmJ5dGUJMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3MworCS5ieXRlCTB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUKKwkuYnl0ZQkweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlCisJLmJ5dGUJMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OQorCS5ieXRlCTB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIKKwkuYnl0ZQkweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwCisJLmJ5dGUJMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNAorCS5ieXRlCTB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEKKwkuYnl0ZQkweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmCisJLmJ5dGUJMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZAorCS5ieXRlCTB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYKKwkuYnl0ZQkweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwCisJLmJ5dGUJMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MQorCS5ieXRlCTB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYKKwkuYnl0ZQkweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkCisudHlwZQlBRVNfVGQsI29iamVjdAorLnNpemUJQUVTX1RkLCguLUFFU19UZCkKKworLmFsaWduCTY0Cisuc2tpcAkxNgorX3NwYXJjdjlfQUVTX2RlY3J5cHQ6CisJc2F2ZQklc3AsLSRmcmFtZS0kbG9jYWxzLCVzcAorCXN0eAklaTcsWyVzcCskYmlhcyskZnJhbWUrMF0JISBvZmYtbG9hZCByZXR1cm4gYWRkcmVzcworCWxkCVska2V5KzI0MF0sJHJvdW5kcworCWxkCVska2V5KzBdLCR0MAorCWxkCVska2V5KzRdLCR0MQkJCSEKKwlsZAlbJGtleSs4XSwkdDIKKwlsZAlbJGtleSsxMl0sJHQzCisJc3JsCSRyb3VuZHMsMSwkcm91bmRzCisJeG9yCSR0MCwkczAsJHMwCisJbGQJWyRrZXkrMTZdLCR0MAorCXhvcgkkdDEsJHMxLCRzMQorCWxkCVska2V5KzIwXSwkdDEKKwlzcmwJJHMwLDIxLCRhY2MwCQkJIQorCXhvcgkkdDIsJHMyLCRzMgorCWxkCVska2V5KzI0XSwkdDIKKwl4b3IJJHQzLCRzMywkczMKKwlhbmQJJGFjYzAsMjA0MCwkYWNjMAorCWxkCVska2V5KzI4XSwkdDMKKwlzcmwJJHMzLDEzLCRhY2MxCisJbm9wCisuTGRlY19sb29wOgorCXNybAkkczIsNSwkYWNjMgkJCSEKKwlhbmQJJGFjYzEsMjA0MCwkYWNjMQorCWxkeAlbJHRibCskYWNjMF0sJGFjYzAKKwlzbGwJJHMxLDMsJGFjYzMKKwlhbmQJJGFjYzIsMjA0MCwkYWNjMgorCWxkeAlbJHRibCskYWNjMV0sJGFjYzEKKwlzcmwJJHMxLDIxLCRhY2M0CisJYW5kCSRhY2MzLDIwNDAsJGFjYzMKKwlsZHgJWyR0YmwrJGFjYzJdLCRhY2MyCQkhCisJc3JsCSRzMCwxMywkYWNjNQorCWFuZAkkYWNjNCwyMDQwLCRhY2M0CisJbGR4CVskdGJsKyRhY2MzXSwkYWNjMworCXNybAkkczMsNSwkYWNjNgorCWFuZAkkYWNjNSwyMDQwLCRhY2M1CisJbGR4CVskdGJsKyRhY2M0XSwkYWNjNAorCWZtb3ZzCSVmMCwlZjAKKwlzbGwJJHMyLDMsJGFjYzcJCQkhCisJYW5kCSRhY2M2LDIwNDAsJGFjYzYKKwlsZHgJWyR0YmwrJGFjYzVdLCRhY2M1CisJc3JsCSRzMiwyMSwkYWNjOAorCWFuZAkkYWNjNywyMDQwLCRhY2M3CisJbGR4CVskdGJsKyRhY2M2XSwkYWNjNgorCXNybAkkczEsMTMsJGFjYzkKKwlhbmQJJGFjYzgsMjA0MCwkYWNjOAorCWxkeAlbJHRibCskYWNjN10sJGFjYzcJCSEKKwlzcmwJJHMwLDUsJGFjYzEwCisJYW5kCSRhY2M5LDIwNDAsJGFjYzkKKwlsZHgJWyR0YmwrJGFjYzhdLCRhY2M4CisJc2xsCSRzMywzLCRhY2MxMQorCWFuZAkkYWNjMTAsMjA0MCwkYWNjMTAKKwlsZHgJWyR0YmwrJGFjYzldLCRhY2M5CisJZm1vdnMJJWYwLCVmMAorCXNybAkkczMsMjEsJGFjYzEyCQkJIQorCWFuZAkkYWNjMTEsMjA0MCwkYWNjMTEKKwlsZHgJWyR0YmwrJGFjYzEwXSwkYWNjMTAKKwlzcmwJJHMyLDEzLCRhY2MxMworCWFuZAkkYWNjMTIsMjA0MCwkYWNjMTIKKwlsZHgJWyR0YmwrJGFjYzExXSwkYWNjMTEKKwlzcmwJJHMxLDUsJGFjYzE0CisJYW5kCSRhY2MxMywyMDQwLCRhY2MxMworCWxkeAlbJHRibCskYWNjMTJdLCRhY2MxMgkJIQorCXNsbAkkczAsMywkYWNjMTUKKwlhbmQJJGFjYzE0LDIwNDAsJGFjYzE0CisJbGR4CVskdGJsKyRhY2MxM10sJGFjYzEzCisJYW5kCSRhY2MxNSwyMDQwLCRhY2MxNQorCWFkZAkka2V5LDMyLCRrZXkKKwlsZHgJWyR0YmwrJGFjYzE0XSwkYWNjMTQKKwlmbW92cwklZjAsJWYwCisJc3ViY2MJJHJvdW5kcywxLCRyb3VuZHMJCSEKKwlsZHgJWyR0YmwrJGFjYzE1XSwkYWNjMTUKKwlieixhLHBuCSVpY2MsLkxkZWNfbGFzdAorCWFkZAkkdGJsLDIwNDgsJHJvdW5kcworCisJCXNybHgJJGFjYzEsOCwkYWNjMQorCQl4b3IJJGFjYzAsJHQwLCR0MAorCWxkCVska2V5KzBdLCRzMAorCWZtb3ZzCSVmMCwlZjAKKwkJc3JseAkkYWNjMiwxNiwkYWNjMgkJIQorCQl4b3IJJGFjYzEsJHQwLCR0MAorCWxkCVska2V5KzRdLCRzMQorCQlzcmx4CSRhY2MzLDI0LCRhY2MzCisJCXhvcgkkYWNjMiwkdDAsJHQwCisJbGQJWyRrZXkrOF0sJHMyCisJCXNybHgJJGFjYzUsOCwkYWNjNQorCQl4b3IJJGFjYzMsJHQwLCR0MAorCWxkCVska2V5KzEyXSwkczMJCQkhCisJCXNybHgJJGFjYzYsMTYsJGFjYzYKKwkJeG9yCSRhY2M0LCR0MSwkdDEKKwlmbW92cwklZjAsJWYwCisJCXNybHgJJGFjYzcsMjQsJGFjYzcKKwkJeG9yCSRhY2M1LCR0MSwkdDEKKwkJc3JseAkkYWNjOSw4LCRhY2M5CisJCXhvcgkkYWNjNiwkdDEsJHQxCisJCXNybHgJJGFjYzEwLDE2LCRhY2MxMAkhCisJCXhvcgkkYWNjNywkdDEsJHQxCisJCXNybHgJJGFjYzExLDI0LCRhY2MxMQorCQl4b3IJJGFjYzgsJHQyLCR0MgorCQlzcmx4CSRhY2MxMyw4LCRhY2MxMworCQl4b3IJJGFjYzksJHQyLCR0MgorCQlzcmx4CSRhY2MxNCwxNiwkYWNjMTQKKwkJeG9yCSRhY2MxMCwkdDIsJHQyCisJCXNybHgJJGFjYzE1LDI0LCRhY2MxNQkhCisJCXhvcgkkYWNjMTEsJHQyLCR0MgorCQl4b3IJJGFjYzEyLCRhY2MxNCwkYWNjMTQKKwkJeG9yCSRhY2MxMywkdDMsJHQzCisJc3JsCSR0MCwyMSwkYWNjMAorCQl4b3IJJGFjYzE0LCR0MywkdDMKKwkJeG9yCSRhY2MxNSwkdDMsJHQzCisJc3JsCSR0MywxMywkYWNjMQorCisJYW5kCSRhY2MwLDIwNDAsJGFjYzAJCSEKKwlzcmwJJHQyLDUsJGFjYzIKKwlhbmQJJGFjYzEsMjA0MCwkYWNjMQorCWxkeAlbJHRibCskYWNjMF0sJGFjYzAKKwlzbGwJJHQxLDMsJGFjYzMKKwlhbmQJJGFjYzIsMjA0MCwkYWNjMgorCWxkeAlbJHRibCskYWNjMV0sJGFjYzEKKwlmbW92cwklZjAsJWYwCisJc3JsCSR0MSwyMSwkYWNjNAkJCSEKKwlhbmQJJGFjYzMsMjA0MCwkYWNjMworCWxkeAlbJHRibCskYWNjMl0sJGFjYzIKKwlzcmwJJHQwLDEzLCRhY2M1CisJYW5kCSRhY2M0LDIwNDAsJGFjYzQKKwlsZHgJWyR0YmwrJGFjYzNdLCRhY2MzCisJc3JsCSR0Myw1LCRhY2M2CisJYW5kCSRhY2M1LDIwNDAsJGFjYzUKKwlsZHgJWyR0YmwrJGFjYzRdLCRhY2M0CQkhCisJc2xsCSR0MiwzLCRhY2M3CisJYW5kCSRhY2M2LDIwNDAsJGFjYzYKKwlsZHgJWyR0YmwrJGFjYzVdLCRhY2M1CisJc3JsCSR0MiwyMSwkYWNjOAorCWFuZAkkYWNjNywyMDQwLCRhY2M3CisJbGR4CVskdGJsKyRhY2M2XSwkYWNjNgorCWZtb3ZzCSVmMCwlZjAKKwlzcmwJJHQxLDEzLCRhY2M5CQkJIQorCWFuZAkkYWNjOCwyMDQwLCRhY2M4CisJbGR4CVskdGJsKyRhY2M3XSwkYWNjNworCXNybAkkdDAsNSwkYWNjMTAKKwlhbmQJJGFjYzksMjA0MCwkYWNjOQorCWxkeAlbJHRibCskYWNjOF0sJGFjYzgKKwlzbGwJJHQzLDMsJGFjYzExCisJYW5kCSRhY2MxMCwyMDQwLCRhY2MxMAorCWxkeAlbJHRibCskYWNjOV0sJGFjYzkJCSEKKwlzcmwJJHQzLDIxLCRhY2MxMgorCWFuZAkkYWNjMTEsMjA0MCwkYWNjMTEKKwlsZHgJWyR0YmwrJGFjYzEwXSwkYWNjMTAKKwlzcmwJJHQyLDEzLCRhY2MxMworCWFuZAkkYWNjMTIsMjA0MCwkYWNjMTIKKwlsZHgJWyR0YmwrJGFjYzExXSwkYWNjMTEKKwlmbW92cwklZjAsJWYwCisJc3JsCSR0MSw1LCRhY2MxNAkJCSEKKwlhbmQJJGFjYzEzLDIwNDAsJGFjYzEzCisJbGR4CVskdGJsKyRhY2MxMl0sJGFjYzEyCisJc2xsCSR0MCwzLCRhY2MxNQorCWFuZAkkYWNjMTQsMjA0MCwkYWNjMTQKKwlsZHgJWyR0YmwrJGFjYzEzXSwkYWNjMTMKKwkJc3JseAkkYWNjMSw4LCRhY2MxCisJYW5kCSRhY2MxNSwyMDQwLCRhY2MxNQorCWxkeAlbJHRibCskYWNjMTRdLCRhY2MxNAkJIQorCisJCXNybHgJJGFjYzIsMTYsJGFjYzIKKwkJeG9yCSRhY2MwLCRzMCwkczAKKwlsZHgJWyR0YmwrJGFjYzE1XSwkYWNjMTUKKwkJc3JseAkkYWNjMywyNCwkYWNjMworCQl4b3IJJGFjYzEsJHMwLCRzMAorCWxkCVska2V5KzE2XSwkdDAKKwlmbW92cwklZjAsJWYwCisJCXNybHgJJGFjYzUsOCwkYWNjNQkJIQorCQl4b3IJJGFjYzIsJHMwLCRzMAorCWxkCVska2V5KzIwXSwkdDEKKwkJc3JseAkkYWNjNiwxNiwkYWNjNgorCQl4b3IJJGFjYzMsJHMwLCRzMAorCWxkCVska2V5KzI0XSwkdDIKKwkJc3JseAkkYWNjNywyNCwkYWNjNworCQl4b3IJJGFjYzQsJHMxLCRzMQorCWxkCVska2V5KzI4XSwkdDMJCQkhCisJCXNybHgJJGFjYzksOCwkYWNjOQorCQl4b3IJJGFjYzUsJHMxLCRzMQorCWxkeAlbJHRibCsyMDQ4KzBdLCVnMAkJISBwcmVmZXRjaCB0ZDQKKwkJc3JseAkkYWNjMTAsMTYsJGFjYzEwCisJCXhvcgkkYWNjNiwkczEsJHMxCisJbGR4CVskdGJsKzIwNDgrMzJdLCVnMAkJISBwcmVmZXRjaCB0ZDQKKwkJc3JseAkkYWNjMTEsMjQsJGFjYzExCisJCXhvcgkkYWNjNywkczEsJHMxCisJbGR4CVskdGJsKzIwNDgrNjRdLCVnMAkJISBwcmVmZXRjaCB0ZDQKKwkJc3JseAkkYWNjMTMsOCwkYWNjMTMKKwkJeG9yCSRhY2M4LCRzMiwkczIKKwlsZHgJWyR0YmwrMjA0OCs5Nl0sJWcwCQkhIHByZWZldGNoIHRkNAorCQlzcmx4CSRhY2MxNCwxNiwkYWNjMTQJIQorCQl4b3IJJGFjYzksJHMyLCRzMgorCWxkeAlbJHRibCsyMDQ4KzEyOF0sJWcwCQkhIHByZWZldGNoIHRkNAorCQlzcmx4CSRhY2MxNSwyNCwkYWNjMTUKKwkJeG9yCSRhY2MxMCwkczIsJHMyCisJbGR4CVskdGJsKzIwNDgrMTYwXSwlZzAJCSEgcHJlZmV0Y2ggdGQ0CisJc3JsCSRzMCwyMSwkYWNjMAorCQl4b3IJJGFjYzExLCRzMiwkczIKKwlsZHgJWyR0YmwrMjA0OCsxOTJdLCVnMAkJISBwcmVmZXRjaCB0ZDQKKwkJeG9yCSRhY2MxMiwkYWNjMTQsJGFjYzE0CisJCXhvcgkkYWNjMTMsJHMzLCRzMworCWxkeAlbJHRibCsyMDQ4KzIyNF0sJWcwCQkhIHByZWZldGNoIHRkNAorCWFuZAkkYWNjMCwyMDQwLCRhY2MwCQkhCisJCXhvcgkkYWNjMTQsJHMzLCRzMworCQl4b3IJJGFjYzE1LCRzMywkczMKKwliYQkuTGRlY19sb29wCisJc3JsCSRzMywxMywkYWNjMQorCisuYWxpZ24JMzIKKy5MZGVjX2xhc3Q6CisJCXNybHgJJGFjYzEsOCwkYWNjMQkJIQorCQl4b3IJJGFjYzAsJHQwLCR0MAorCWxkCVska2V5KzBdLCRzMAorCQlzcmx4CSRhY2MyLDE2LCRhY2MyCisJCXhvcgkkYWNjMSwkdDAsJHQwCisJbGQJWyRrZXkrNF0sJHMxCisJCXNybHgJJGFjYzMsMjQsJGFjYzMKKwkJeG9yCSRhY2MyLCR0MCwkdDAKKwlsZAlbJGtleSs4XSwkczIJCQkhCisJCXNybHgJJGFjYzUsOCwkYWNjNQorCQl4b3IJJGFjYzMsJHQwLCR0MAorCWxkCVska2V5KzEyXSwkczMKKwkJc3JseAkkYWNjNiwxNiwkYWNjNgorCQl4b3IJJGFjYzQsJHQxLCR0MQorCQlzcmx4CSRhY2M3LDI0LCRhY2M3CisJCXhvcgkkYWNjNSwkdDEsJHQxCisJCXNybHgJJGFjYzksOCwkYWNjOQkJIQorCQl4b3IJJGFjYzYsJHQxLCR0MQorCQlzcmx4CSRhY2MxMCwxNiwkYWNjMTAKKwkJeG9yCSRhY2M3LCR0MSwkdDEKKwkJc3JseAkkYWNjMTEsMjQsJGFjYzExCisJCXhvcgkkYWNjOCwkdDIsJHQyCisJCXNybHgJJGFjYzEzLDgsJGFjYzEzCisJCXhvcgkkYWNjOSwkdDIsJHQyCisJCXNybHgJJGFjYzE0LDE2LCRhY2MxNAkhCisJCXhvcgkkYWNjMTAsJHQyLCR0MgorCQlzcmx4CSRhY2MxNSwyNCwkYWNjMTUKKwkJeG9yCSRhY2MxMSwkdDIsJHQyCisJCXhvcgkkYWNjMTIsJGFjYzE0LCRhY2MxNAorCQl4b3IJJGFjYzEzLCR0MywkdDMKKwlzcmwJJHQwLDI0LCRhY2MwCisJCXhvcgkkYWNjMTQsJHQzLCR0MworCQl4b3IJJGFjYzE1LCR0MywkdDMJCSEKKwlzcmwJJHQzLDE2LCRhY2MxCisKKwlzcmwJJHQyLDgsJGFjYzIKKwlhbmQJJGFjYzEsMjU1LCRhY2MxCisJbGR1YglbJHJvdW5kcyskYWNjMF0sJGFjYzAKKwlzcmwJJHQxLDI0LCRhY2M0CisJYW5kCSRhY2MyLDI1NSwkYWNjMgorCWxkdWIJWyRyb3VuZHMrJGFjYzFdLCRhY2MxCisJc3JsCSR0MCwxNiwkYWNjNQkJCSEKKwlhbmQJJHQxLDI1NSwkYWNjMworCWxkdWIJWyRyb3VuZHMrJGFjYzJdLCRhY2MyCisJbGR1YglbJHJvdW5kcyskYWNjM10sJGFjYzMKKwlzcmwJJHQzLDgsJGFjYzYKKwlhbmQJJGFjYzUsMjU1LCRhY2M1CisJbGR1YglbJHJvdW5kcyskYWNjNF0sJGFjYzQKKwlmbW92cwklZjAsJWYwCisJc3JsCSR0MiwyNCwkYWNjOAkJCSEKKwlhbmQJJGFjYzYsMjU1LCRhY2M2CisJbGR1YglbJHJvdW5kcyskYWNjNV0sJGFjYzUKKwlzcmwJJHQxLDE2LCRhY2M5CisJYW5kCSR0MiwyNTUsJGFjYzcKKwlsZHViCVskcm91bmRzKyRhY2M2XSwkYWNjNgorCWxkdWIJWyRyb3VuZHMrJGFjYzddLCRhY2M3CisJZm1vdnMJJWYwLCVmMAorCXNybAkkdDAsOCwkYWNjMTAJCQkhCisJYW5kCSRhY2M5LDI1NSwkYWNjOQorCWxkdWIJWyRyb3VuZHMrJGFjYzhdLCRhY2M4CisJc3JsCSR0MywyNCwkYWNjMTIKKwlhbmQJJGFjYzEwLDI1NSwkYWNjMTAKKwlsZHViCVskcm91bmRzKyRhY2M5XSwkYWNjOQorCXNybAkkdDIsMTYsJGFjYzEzCisJYW5kCSR0MywyNTUsJGFjYzExCisJbGR1YglbJHJvdW5kcyskYWNjMTBdLCRhY2MxMAkJIQorCXNybAkkdDEsOCwkYWNjMTQKKwlhbmQJJGFjYzEzLDI1NSwkYWNjMTMKKwlsZHViCVskcm91bmRzKyRhY2MxMV0sJGFjYzExCisJbGR1YglbJHJvdW5kcyskYWNjMTJdLCRhY2MxMgorCWFuZAkkYWNjMTQsMjU1LCRhY2MxNAorCWxkdWIJWyRyb3VuZHMrJGFjYzEzXSwkYWNjMTMKKwlhbmQJJHQwLDI1NSwkYWNjMTUKKwlsZHViCVskcm91bmRzKyRhY2MxNF0sJGFjYzE0CQkhCisKKwkJc2xsCSRhY2MwLDI0LCRhY2MwCisJCXhvcgkkYWNjMywkczAsJHMwCisJbGR1YglbJHJvdW5kcyskYWNjMTVdLCRhY2MxNQorCQlzbGwJJGFjYzEsMTYsJGFjYzEKKwkJeG9yCSRhY2MwLCRzMCwkczAKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrMF0sJWk3CSEgcmVzdG9yZSByZXR1cm4gYWRkcmVzcworCWZtb3ZzCSVmMCwlZjAKKwkJc2xsCSRhY2MyLDgsJGFjYzIJCSEKKwkJeG9yCSRhY2MxLCRzMCwkczAKKwkJc2xsCSRhY2M0LDI0LCRhY2M0CisJCXhvcgkkYWNjMiwkczAsJHMwCisJCXNsbAkkYWNjNSwxNiwkYWNjNQorCQl4b3IJJGFjYzcsJHMxLCRzMQorCQlzbGwJJGFjYzYsOCwkYWNjNgorCQl4b3IJJGFjYzQsJHMxLCRzMQorCQlzbGwJJGFjYzgsMjQsJGFjYzgJCSEKKwkJeG9yCSRhY2M1LCRzMSwkczEKKwkJc2xsCSRhY2M5LDE2LCRhY2M5CisJCXhvcgkkYWNjMTEsJHMyLCRzMgorCQlzbGwJJGFjYzEwLDgsJGFjYzEwCisJCXhvcgkkYWNjNiwkczEsJHMxCisJCXNsbAkkYWNjMTIsMjQsJGFjYzEyCisJCXhvcgkkYWNjOCwkczIsJHMyCisJCXNsbAkkYWNjMTMsMTYsJGFjYzEzCSEKKwkJeG9yCSRhY2M5LCRzMiwkczIKKwkJc2xsCSRhY2MxNCw4LCRhY2MxNAorCQl4b3IJJGFjYzEwLCRzMiwkczIKKwkJeG9yCSRhY2MxMiwkYWNjMTQsJGFjYzE0CisJCXhvcgkkYWNjMTMsJHMzLCRzMworCQl4b3IJJGFjYzE0LCRzMywkczMKKwkJeG9yCSRhY2MxNSwkczMsJHMzCisKKwlyZXQKKwlyZXN0b3JlCisudHlwZQlfc3BhcmN2OV9BRVNfZGVjcnlwdCwjZnVuY3Rpb24KKy5zaXplCV9zcGFyY3Y5X0FFU19kZWNyeXB0LCguLV9zcGFyY3Y5X0FFU19kZWNyeXB0KQorCisuYWxpZ24JMzIKKy5nbG9ibAlBRVNfZGVjcnlwdAorQUVTX2RlY3J5cHQ6CisJb3IJJW8wLCVvMSwlZzEKKwlhbmRjYwklZzEsMywlZzAKKwlibnoscG4JJXhjYywuTHVuYWxpZ25lZF9kZWMKKwlzYXZlCSVzcCwtJGZyYW1lLCVzcAorCisJbGQJWyVpMCswXSwlbzAKKwlsZAlbJWkwKzRdLCVvMQorCWxkCVslaTArOF0sJW8yCisJbGQJWyVpMCsxMl0sJW8zCisKKzE6CWNhbGwJLis4CisJYWRkCSVvNyxBRVNfVGQtMWIsJW80CisJY2FsbAlfc3BhcmN2OV9BRVNfZGVjcnlwdAorCW1vdgklaTIsJW81CisKKwlzdAklbzAsWyVpMSswXQorCXN0CSVvMSxbJWkxKzRdCisJc3QJJW8yLFslaTErOF0KKwlzdAklbzMsWyVpMSsxMl0KKworCXJldAorCXJlc3RvcmUKKworLmFsaWduCTMyCisuTHVuYWxpZ25lZF9kZWM6CisJbGR1YglbJWkwKzBdLCVsMAorCWxkdWIJWyVpMCsxXSwlbDEKKwlsZHViCVslaTArMl0sJWwyCisKKwlzbGwJJWwwLDI0LCVsMAorCWxkdWIJWyVpMCszXSwlbDMKKwlzbGwJJWwxLDE2LCVsMQorCWxkdWIJWyVpMCs0XSwlbDQKKwlzbGwJJWwyLDgsJWwyCisJb3IJJWwxLCVsMCwlbDAKKwlsZHViCVslaTArNV0sJWw1CisJc2xsCSVsNCwyNCwlbDQKKwlvcgklbDMsJWwyLCVsMgorCWxkdWIJWyVpMCs2XSwlbDYKKwlzbGwJJWw1LDE2LCVsNQorCW9yCSVsMCwlbDIsJW8wCisJbGR1YglbJWkwKzddLCVsNworCisJc2xsCSVsNiw4LCVsNgorCW9yCSVsNSwlbDQsJWw0CisJbGR1YglbJWkwKzhdLCVsMAorCW9yCSVsNywlbDYsJWw2CisJbGR1YglbJWkwKzldLCVsMQorCW9yCSVsNCwlbDYsJW8xCisJbGR1YglbJWkwKzEwXSwlbDIKKworCXNsbAklbDAsMjQsJWwwCisJbGR1YglbJWkwKzExXSwlbDMKKwlzbGwJJWwxLDE2LCVsMQorCWxkdWIJWyVpMCsxMl0sJWw0CisJc2xsCSVsMiw4LCVsMgorCW9yCSVsMSwlbDAsJWwwCisJbGR1YglbJWkwKzEzXSwlbDUKKwlzbGwJJWw0LDI0LCVsNAorCW9yCSVsMywlbDIsJWwyCisJbGR1YglbJWkwKzE0XSwlbDYKKwlzbGwJJWw1LDE2LCVsNQorCW9yCSVsMCwlbDIsJW8yCisJbGR1YglbJWkwKzE1XSwlbDcKKworCXNsbAklbDYsOCwlbDYKKwlvcgklbDUsJWw0LCVsNAorCW9yCSVsNywlbDYsJWw2CisJb3IJJWw0LCVsNiwlbzMKKworMToJY2FsbAkuKzgKKwlhZGQJJW83LEFFU19UZC0xYiwlbzQKKwljYWxsCV9zcGFyY3Y5X0FFU19kZWNyeXB0CisJbW92CSVpMiwlbzUKKworCXNybAklbzAsMjQsJWwwCisJc3JsCSVvMCwxNiwlbDEKKwlzdGIJJWwwLFslaTErMF0KKwlzcmwJJW8wLDgsJWwyCisJc3RiCSVsMSxbJWkxKzFdCisJc3RiCSVsMixbJWkxKzJdCisJc3JsCSVvMSwyNCwlbDQKKwlzdGIJJW8wLFslaTErM10KKworCXNybAklbzEsMTYsJWw1CisJc3RiCSVsNCxbJWkxKzRdCisJc3JsCSVvMSw4LCVsNgorCXN0YgklbDUsWyVpMSs1XQorCXN0YgklbDYsWyVpMSs2XQorCXNybAklbzIsMjQsJWwwCisJc3RiCSVvMSxbJWkxKzddCisKKwlzcmwJJW8yLDE2LCVsMQorCXN0YgklbDAsWyVpMSs4XQorCXNybAklbzIsOCwlbDIKKwlzdGIJJWwxLFslaTErOV0KKwlzdGIJJWwyLFslaTErMTBdCisJc3JsCSVvMywyNCwlbDQKKwlzdGIJJW8yLFslaTErMTFdCisKKwlzcmwJJW8zLDE2LCVsNQorCXN0YgklbDQsWyVpMSsxMl0KKwlzcmwJJW8zLDgsJWw2CisJc3RiCSVsNSxbJWkxKzEzXQorCXN0YgklbDYsWyVpMSsxNF0KKwlzdGIJJW8zLFslaTErMTVdCisKKwlyZXQKKwlyZXN0b3JlCisudHlwZQlBRVNfZGVjcnlwdCwjZnVuY3Rpb24KKy5zaXplCUFFU19kZWNyeXB0LCguLUFFU19kZWNyeXB0KQorX19fCisKKyMgZm1vdnMgaW5zdHJ1Y3Rpb25zIHN1YnN0aXR1dGluZyBmb3IgRlAgbm9wcyB3ZXJlIG9yaWdpbmFsbHkgYWRkZWQKKyMgdG8gbWVldCBzcGVjaWZpYyBpbnN0cnVjdGlvbiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIHRvIG1heGltaXplIElMUC4KKyMgQXMgVWx0cmFTUEFSQyBUMSwgYS5rLmEuIE5pYWdhcmEsIGhhcyBzaGFyZWQgRlBVLCBGUCBub3BzIGNhbiBoYXZlCisjIHVuZGVzaXJlZCBlZmZlY3QsIHNvIGp1c3Qgb21pdCB0aGVtIGFuZCBzYWNyaWZpY2Ugc29tZSBwb3J0aW9uIG9mCisjIHBlcmNlbnQgaW4gcGVyZm9ybWFuY2UuLi4KKyRjb2RlID1+IHMvZm1vdnMuKiQvL2dlbTsKKworcHJpbnQgJGNvZGU7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYWVzL2FzbS9hZXMteDg2XzY0LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQ1ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Flcy9hc20vYWVzLXg4Nl82NC5wbApAQCAtMCwwICsxLDI4MDkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFZlcnNpb24gMi4xLgorIworIyBhZXMtKi1jYmMgYmVuY2htYXJrcyBhcmUgaW1wcm92ZWQgYnkgPjcwJSBbY29tcGFyZWQgdG8gZ2NjIDMuMy4yIG9uCisjIE9wdGVyb24gMjQwIENQVV0gcGx1cyBhbGwgdGhlIGJlbGxzLW4td2hpc3RsZXMgZnJvbSAzMi1iaXQgdmVyc2lvbgorIyBbeW91J2xsIG5vdGljZSBhIGxvdCBvZiByZXNlbWJsYW5jZV0sIHN1Y2ggYXMgY29tcHJlc3NlZCBTLWJveGVzCisjIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlciwgcHJlZmV0Y2ggb2YgdGhlc2UgdGFibGVzIGluIENCQyBtb2RlLAorIyBhcyB3ZWxsIGFzIGF2b2lkaW5nIEwxIGNhY2hlIGFsaWFzaW5nIGJldHdlZW4gc3RhY2sgZnJhbWUgYW5kIGtleQorIyBzY2hlZHVsZSBhbmQgYWxyZWFkeSBtZW50aW9uZWQgdGFibGVzLCBjb21wcmVzc2VkIFRkNC4uLgorIworIyBQZXJmb3JtYW5jZSBpbiBudW1iZXIgb2YgY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSBmb3IgMTI4LWJpdCBrZXk6CisjCisjCQlFQ0IgZW5jcnlwdAlFQ0IgZGVjcnlwdAlDQkMgbGFyZ2UgY2h1bmsKKyMgQU1ENjQJCTMzCQk0MQkJMTMuMAorIyBFTTY0VAkJMzgJCTU5CQkxOC42KCopCisjIENvcmUgMgkzMAkJNDMJCTE0LjUoKikKKyMKKyMgKCopIHdpdGggaHlwZXItdGhyZWFkaW5nIG9mZgorCiskZmxhdm91ciA9IHNoaWZ0OworJG91dHB1dCAgPSBzaGlmdDsKK2lmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KKworJHdpbjY0PTA7ICR3aW42ND0xIGlmICgkZmxhdm91ciA9fiAvW25tXWFzbXxtaW5ndzY0LyB8fCAkb3V0cHV0ID1+IC9cLmFzbSQvKTsKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKKyggJHhsYXRlPSIke2Rpcn14ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgorKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgorZGllICJjYW4ndCBsb2NhdGUgeDg2XzY0LXhsYXRlLnBsIjsKKworb3BlbiBTVERPVVQsInwgJF5YICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKworJHZlcnRpY2Fsc3Bpbj0xOwkjIHVubGlrZSAzMi1iaXQgdmVyc2lvbiAkdmVydGljYWxzcGluIHBlcmZvcm1zCisJCQkjIH4xNSUgYmV0dGVyIG9uIGJvdGggQU1EIGFuZCBJbnRlbCBjb3JlcworJHNwZWVkX2xpbWl0PTUxMjsJIyBzZWUgYWVzLTU4Ni5wbCBmb3IgZGV0YWlscworCiskY29kZT0iLnRleHRcbiI7CisKKyRzMD0iJWVheCI7CiskczE9IiVlYngiOworJHMyPSIlZWN4IjsKKyRzMz0iJWVkeCI7CiskYWNjMD0iJWVzaSI7CSRtYXNrODA9IiVyc2kiOworJGFjYzE9IiVlZGkiOwkkbWFza2ZlPSIlcmRpIjsKKyRhY2MyPSIlZWJwIjsJJG1hc2sxYj0iJXJicCI7CiskaW5wPSIlcjgiOworJG91dD0iJXI5IjsKKyR0MD0iJXIxMGQiOworJHQxPSIlcjExZCI7CiskdDI9IiVyMTJkIjsKKyRybmRzPSIlcjEzZCI7Ciskc2JveD0iJXIxNCI7Ciska2V5PSIlcjE1IjsKKworc3ViIGhpKCkgeyBteSAkcj1zaGlmdDsJJHIgPX4gcy8lW2VyXShbYS1kXSl4LyVcMWgvOwkkcjsgfQorc3ViIGxvKCkgeyBteSAkcj1zaGlmdDsJJHIgPX4gcy8lW2VyXShbYS1kXSl4LyVcMWwvOworCQkJJHIgPX4gcy8lW2VyXShbc2RdaSkvJVwxbC87CisJCQkkciA9fiBzLyUoclswLTldKylbZF0/LyVcMWIvOwkkcjsgfQorc3ViIExPKCkgeyBteSAkcj1zaGlmdDsgJHIgPX4gcy8lcihbYS16XSspLyVlXDEvOworCQkJJHIgPX4gcy8lcihbMC05XSspLyVyXDFkLzsJJHI7IH0KK3N1YiBfZGF0YV93b3JkKCkKK3sgbXkgJGk7CisgICAgd2hpbGUoZGVmaW5lZCgkaT1zaGlmdCkpIHsgJGNvZGUuPXNwcmludGYiLmxvbmdcdDB4JTA4eCwweCUwOHhcbiIsJGksJGk7IH0KK30KK3N1YiBkYXRhX3dvcmQoKQoreyBteSAkaTsKKyAgbXkgJGxhc3Q9cG9wKEBfKTsKKyAgICAkY29kZS49Ii5sb25nXHQiOworICAgIHdoaWxlKGRlZmluZWQoJGk9c2hpZnQpKSB7ICRjb2RlLj1zcHJpbnRmIjB4JTA4eCwiLCRpOyB9CisgICAgJGNvZGUuPXNwcmludGYiMHglMDh4XG4iLCRsYXN0OworfQorCitzdWIgZGF0YV9ieXRlKCkKK3sgbXkgJGk7CisgIG15ICRsYXN0PXBvcChAXyk7CisgICAgJGNvZGUuPSIuYnl0ZVx0IjsKKyAgICB3aGlsZShkZWZpbmVkKCRpPXNoaWZ0KSkgeyAkY29kZS49c3ByaW50ZiIweCUwMngsIiwkaSYweGZmOyB9CisgICAgJGNvZGUuPXNwcmludGYiMHglMDJ4XG4iLCRsYXN0JjB4ZmY7Cit9CisKK3N1YiBlbmN2ZXJ0KCkKK3sgbXkgJHQzPSIlcjhkIjsJIyB6YXBzICRpbnAhCisKKyRjb2RlLj08PF9fXzsKKwkjIGZhdm9yIDMtd2F5IGlzc3VlIE9wdGVyb24gcGlwZWxpbmUuLi4KKwltb3Z6YglgJmxvKCIkczAiKWAsJGFjYzAKKwltb3Z6YglgJmxvKCIkczEiKWAsJGFjYzEKKwltb3Z6YglgJmxvKCIkczIiKWAsJGFjYzIKKwltb3YJMCgkc2JveCwkYWNjMCw4KSwkdDAKKwltb3YJMCgkc2JveCwkYWNjMSw4KSwkdDEKKwltb3YJMCgkc2JveCwkYWNjMiw4KSwkdDIKKworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMyIpYCwkYWNjMgorCXhvcgkzKCRzYm94LCRhY2MwLDgpLCR0MAorCXhvcgkzKCRzYm94LCRhY2MxLDgpLCR0MQorCW1vdgkwKCRzYm94LCRhY2MyLDgpLCR0MworCisJbW92emIJYCZoaSgiJHMzIilgLCRhY2MwCisJc2hyCVwkMTYsJHMyCisJbW92emIJYCZoaSgiJHMwIilgLCRhY2MyCisJeG9yCTMoJHNib3gsJGFjYzAsOCksJHQyCisJc2hyCVwkMTYsJHMzCisJeG9yCTMoJHNib3gsJGFjYzIsOCksJHQzCisKKwlzaHIJXCQxNiwkczEKKwlsZWEJMTYoJGtleSksJGtleQorCXNocglcJDE2LCRzMAorCisJbW92emIJYCZsbygiJHMyIilgLCRhY2MwCisJbW92emIJYCZsbygiJHMzIilgLCRhY2MxCisJbW92emIJYCZsbygiJHMwIilgLCRhY2MyCisJeG9yCTIoJHNib3gsJGFjYzAsOCksJHQwCisJeG9yCTIoJHNib3gsJGFjYzEsOCksJHQxCisJeG9yCTIoJHNib3gsJGFjYzIsOCksJHQyCisKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzAKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzEKKwltb3Z6YglgJmxvKCIkczEiKWAsJGFjYzIKKwl4b3IJMSgkc2JveCwkYWNjMCw4KSwkdDAKKwl4b3IJMSgkc2JveCwkYWNjMSw4KSwkdDEKKwl4b3IJMigkc2JveCwkYWNjMiw4KSwkdDMKKworCW1vdgkxMigka2V5KSwkczMKKwltb3Z6YglgJmhpKCIkczEiKWAsJGFjYzEKKwltb3Z6YglgJmhpKCIkczIiKWAsJGFjYzIKKwltb3YJMCgka2V5KSwkczAKKwl4b3IJMSgkc2JveCwkYWNjMSw4KSwkdDIKKwl4b3IJMSgkc2JveCwkYWNjMiw4KSwkdDMKKworCW1vdgk0KCRrZXkpLCRzMQorCW1vdgk4KCRrZXkpLCRzMgorCXhvcgkkdDAsJHMwCisJeG9yCSR0MSwkczEKKwl4b3IJJHQyLCRzMgorCXhvcgkkdDMsJHMzCitfX18KK30KKworc3ViIGVuY2xhc3R2ZXJ0KCkKK3sgbXkgJHQzPSIlcjhkIjsJIyB6YXBzICRpbnAhCisKKyRjb2RlLj08PF9fXzsKKwltb3Z6YglgJmxvKCIkczAiKWAsJGFjYzAKKwltb3Z6YglgJmxvKCIkczEiKWAsJGFjYzEKKwltb3Z6YglgJmxvKCIkczIiKWAsJGFjYzIKKwltb3Z6YgkyKCRzYm94LCRhY2MwLDgpLCR0MAorCW1vdnpiCTIoJHNib3gsJGFjYzEsOCksJHQxCisJbW92emIJMigkc2JveCwkYWNjMiw4KSwkdDIKKworCW1vdnpiCWAmbG8oIiRzMyIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMQorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMgorCW1vdnpiCTIoJHNib3gsJGFjYzAsOCksJHQzCisJbW92CTAoJHNib3gsJGFjYzEsOCksJGFjYzEJIyR0MAorCW1vdgkwKCRzYm94LCRhY2MyLDgpLCRhY2MyCSMkdDEKKworCWFuZAlcJDB4MDAwMGZmMDAsJGFjYzEKKwlhbmQJXCQweDAwMDBmZjAwLCRhY2MyCisKKwl4b3IJJGFjYzEsJHQwCisJeG9yCSRhY2MyLCR0MQorCXNocglcJDE2LCRzMgorCisJbW92emIJYCZoaSgiJHMzIilgLCRhY2MwCisJbW92emIJYCZoaSgiJHMwIilgLCRhY2MxCisJc2hyCVwkMTYsJHMzCisJbW92CTAoJHNib3gsJGFjYzAsOCksJGFjYzAJIyR0MgorCW1vdgkwKCRzYm94LCRhY2MxLDgpLCRhY2MxCSMkdDMKKworCWFuZAlcJDB4MDAwMGZmMDAsJGFjYzAKKwlhbmQJXCQweDAwMDBmZjAwLCRhY2MxCisJc2hyCVwkMTYsJHMxCisJeG9yCSRhY2MwLCR0MgorCXhvcgkkYWNjMSwkdDMKKwlzaHIJXCQxNiwkczAKKworCW1vdnpiCWAmbG8oIiRzMiIpYCwkYWNjMAorCW1vdnpiCWAmbG8oIiRzMyIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMCIpYCwkYWNjMgorCW1vdgkwKCRzYm94LCRhY2MwLDgpLCRhY2MwCSMkdDAKKwltb3YJMCgkc2JveCwkYWNjMSw4KSwkYWNjMQkjJHQxCisJbW92CTAoJHNib3gsJGFjYzIsOCksJGFjYzIJIyR0MgorCisJYW5kCVwkMHgwMGZmMDAwMCwkYWNjMAorCWFuZAlcJDB4MDBmZjAwMDAsJGFjYzEKKwlhbmQJXCQweDAwZmYwMDAwLCRhY2MyCisKKwl4b3IJJGFjYzAsJHQwCisJeG9yCSRhY2MxLCR0MQorCXhvcgkkYWNjMiwkdDIKKworCW1vdnpiCWAmbG8oIiRzMSIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMyIpYCwkYWNjMQorCW1vdnpiCWAmaGkoIiRzMCIpYCwkYWNjMgorCW1vdgkwKCRzYm94LCRhY2MwLDgpLCRhY2MwCSMkdDMKKwltb3YJMigkc2JveCwkYWNjMSw4KSwkYWNjMQkjJHQwCisJbW92CTIoJHNib3gsJGFjYzIsOCksJGFjYzIJIyR0MQorCisJYW5kCVwkMHgwMGZmMDAwMCwkYWNjMAorCWFuZAlcJDB4ZmYwMDAwMDAsJGFjYzEKKwlhbmQJXCQweGZmMDAwMDAwLCRhY2MyCisKKwl4b3IJJGFjYzAsJHQzCisJeG9yCSRhY2MxLCR0MAorCXhvcgkkYWNjMiwkdDEKKworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMQorCW1vdgkxNisxMigka2V5KSwkczMKKwltb3YJMigkc2JveCwkYWNjMCw4KSwkYWNjMAkjJHQyCisJbW92CTIoJHNib3gsJGFjYzEsOCksJGFjYzEJIyR0MworCW1vdgkxNiswKCRrZXkpLCRzMAorCisJYW5kCVwkMHhmZjAwMDAwMCwkYWNjMAorCWFuZAlcJDB4ZmYwMDAwMDAsJGFjYzEKKworCXhvcgkkYWNjMCwkdDIKKwl4b3IJJGFjYzEsJHQzCisKKwltb3YJMTYrNCgka2V5KSwkczEKKwltb3YJMTYrOCgka2V5KSwkczIKKwl4b3IJJHQwLCRzMAorCXhvcgkkdDEsJHMxCisJeG9yCSR0MiwkczIKKwl4b3IJJHQzLCRzMworX19fCit9CisKK3N1YiBlbmNzdGVwKCkKK3sgbXkgKCRpLEBzKSA9IEBfOworICBteSAkdG1wMD0kYWNjMDsKKyAgbXkgJHRtcDE9JGFjYzE7CisgIG15ICR0bXAyPSRhY2MyOworICBteSAkb3V0PSgkdDAsJHQxLCR0Miwkc1swXSlbJGldOworCisJaWYgKCRpPT0zKSB7CisJCSR0bXAwPSRzWzFdOworCQkkdG1wMT0kc1syXTsKKwkJJHRtcDI9JHNbM107CisJfQorCSRjb2RlLj0iCW1vdnpiCSIuJmxvKCRzWzBdKS4iLCRvdXRcbiI7CisJJGNvZGUuPSIJbW92CSRzWzJdLCR0bXAxXG4iCQlpZiAoJGkhPTMpOworCSRjb2RlLj0iCWxlYQkxNigka2V5KSwka2V5XG4iCWlmICgkaT09MCk7CisKKwkkY29kZS49Igltb3Z6YgkiLiZoaSgkc1sxXSkuIiwkdG1wMFxuIjsKKwkkY29kZS49Igltb3YJMCgkc2JveCwkb3V0LDgpLCRvdXRcbiI7CisKKwkkY29kZS49IglzaHIJXCQxNiwkdG1wMVxuIjsKKwkkY29kZS49Igltb3YJJHNbM10sJHRtcDJcbiIJCWlmICgkaSE9Myk7CisJJGNvZGUuPSIJeG9yCTMoJHNib3gsJHRtcDAsOCksJG91dFxuIjsKKworCSRjb2RlLj0iCW1vdnpiCSIuJmxvKCR0bXAxKS4iLCR0bXAxXG4iOworCSRjb2RlLj0iCXNocglcJDI0LCR0bXAyXG4iOworCSRjb2RlLj0iCXhvcgk0KiRpKCRrZXkpLCRvdXRcbiI7CisKKwkkY29kZS49Igl4b3IJMigkc2JveCwkdG1wMSw4KSwkb3V0XG4iOworCSRjb2RlLj0iCXhvcgkxKCRzYm94LCR0bXAyLDgpLCRvdXRcbiI7CisKKwkkY29kZS49Igltb3YJJHQwLCRzWzFdXG4iCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iCW1vdgkkdDEsJHNbMl1cbiIJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJbW92CSR0Miwkc1szXVxuIgkJaWYgKCRpPT0zKTsKKwkkY29kZS49IlxuIjsKK30KKworc3ViIGVuY2xhc3QoKQoreyBteSAoJGksQHMpPUBfOworICBteSAkdG1wMD0kYWNjMDsKKyAgbXkgJHRtcDE9JGFjYzE7CisgIG15ICR0bXAyPSRhY2MyOworICBteSAkb3V0PSgkdDAsJHQxLCR0Miwkc1swXSlbJGldOworCisJaWYgKCRpPT0zKSB7CisJCSR0bXAwPSRzWzFdOworCQkkdG1wMT0kc1syXTsKKwkJJHRtcDI9JHNbM107CisJfQorCSRjb2RlLj0iCW1vdnpiCSIuJmxvKCRzWzBdKS4iLCRvdXRcbiI7CisJJGNvZGUuPSIJbW92CSRzWzJdLCR0bXAxXG4iCQlpZiAoJGkhPTMpOworCisJJGNvZGUuPSIJbW92CTIoJHNib3gsJG91dCw4KSwkb3V0XG4iOworCSRjb2RlLj0iCXNocglcJDE2LCR0bXAxXG4iOworCSRjb2RlLj0iCW1vdgkkc1szXSwkdG1wMlxuIgkJaWYgKCRpIT0zKTsKKworCSRjb2RlLj0iCWFuZAlcJDB4MDAwMDAwZmYsJG91dFxuIjsKKwkkY29kZS49Igltb3Z6YgkiLiZoaSgkc1sxXSkuIiwkdG1wMFxuIjsKKwkkY29kZS49Igltb3Z6YgkiLiZsbygkdG1wMSkuIiwkdG1wMVxuIjsKKwkkY29kZS49IglzaHIJXCQyNCwkdG1wMlxuIjsKKworCSRjb2RlLj0iCW1vdgkwKCRzYm94LCR0bXAwLDgpLCR0bXAwXG4iOworCSRjb2RlLj0iCW1vdgkwKCRzYm94LCR0bXAxLDgpLCR0bXAxXG4iOworCSRjb2RlLj0iCW1vdgkyKCRzYm94LCR0bXAyLDgpLCR0bXAyXG4iOworCisJJGNvZGUuPSIJYW5kCVwkMHgwMDAwZmYwMCwkdG1wMFxuIjsKKwkkY29kZS49IglhbmQJXCQweDAwZmYwMDAwLCR0bXAxXG4iOworCSRjb2RlLj0iCWFuZAlcJDB4ZmYwMDAwMDAsJHRtcDJcbiI7CisKKwkkY29kZS49Igl4b3IJJHRtcDAsJG91dFxuIjsKKwkkY29kZS49Igltb3YJJHQwLCRzWzFdXG4iCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iCXhvcgkkdG1wMSwkb3V0XG4iOworCSRjb2RlLj0iCW1vdgkkdDEsJHNbMl1cbiIJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJeG9yCSR0bXAyLCRvdXRcbiI7CisJJGNvZGUuPSIJbW92CSR0Miwkc1szXVxuIgkJaWYgKCRpPT0zKTsKKwkkY29kZS49IlxuIjsKK30KKworJGNvZGUuPTw8X19fOworLnR5cGUJX3g4Nl82NF9BRVNfZW5jcnlwdCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK194ODZfNjRfQUVTX2VuY3J5cHQ6CisJeG9yCTAoJGtleSksJHMwCQkJIyB4b3Igd2l0aCBrZXkKKwl4b3IJNCgka2V5KSwkczEKKwl4b3IJOCgka2V5KSwkczIKKwl4b3IJMTIoJGtleSksJHMzCisKKwltb3YJMjQwKCRrZXkpLCRybmRzCQkJIyBsb2FkIGtleS0+cm91bmRzCisJc3ViCVwkMSwkcm5kcworCWptcAkuTGVuY19sb29wCisuYWxpZ24JMTYKKy5MZW5jX2xvb3A6CitfX18KKwlpZiAoJHZlcnRpY2Fsc3BpbikgeyAmZW5jdmVydCgpOyB9CisJZWxzZSB7CSZlbmNzdGVwKDAsJHMwLCRzMSwkczIsJHMzKTsKKwkJJmVuY3N0ZXAoMSwkczEsJHMyLCRzMywkczApOworCQkmZW5jc3RlcCgyLCRzMiwkczMsJHMwLCRzMSk7CisJCSZlbmNzdGVwKDMsJHMzLCRzMCwkczEsJHMyKTsKKwl9CiskY29kZS49PDxfX187CisJc3ViCVwkMSwkcm5kcworCWpuegkuTGVuY19sb29wCitfX18KKwlpZiAoJHZlcnRpY2Fsc3BpbikgeyAmZW5jbGFzdHZlcnQoKTsgfQorCWVsc2UgewkmZW5jbGFzdCgwLCRzMCwkczEsJHMyLCRzMyk7CisJCSZlbmNsYXN0KDEsJHMxLCRzMiwkczMsJHMwKTsKKwkJJmVuY2xhc3QoMiwkczIsJHMzLCRzMCwkczEpOworCQkmZW5jbGFzdCgzLCRzMywkczAsJHMxLCRzMik7CisJCSRjb2RlLj08PF9fXzsKKwkJeG9yCTE2KzAoJGtleSksJHMwCQkjIHhvciB3aXRoIGtleQorCQl4b3IJMTYrNCgka2V5KSwkczEKKwkJeG9yCTE2KzgoJGtleSksJHMyCisJCXhvcgkxNisxMigka2V5KSwkczMKK19fXworCX0KKyRjb2RlLj08PF9fXzsKKwkuYnl0ZQkweGYzLDB4YzMJCQkjIHJlcCByZXQKKy5zaXplCV94ODZfNjRfQUVTX2VuY3J5cHQsLi1feDg2XzY0X0FFU19lbmNyeXB0CitfX18KKworIyBpdCdzIHBvc3NpYmxlIHRvIGltcGxlbWVudCB0aGlzIGJ5IHNoaWZ0aW5nIHROIGJ5IDgsIGZpbGxpbmcgbGVhc3QKKyMgc2lnbmlmaWNhbnQgYnl0ZSB3aXRoIGJ5dGUgbG9hZCBhbmQgZmluYWxseSBic3dhcC1pbmcgYXQgdGhlIGVuZCwKKyMgYnV0IHN1Y2ggcGFydGlhbCByZWdpc3RlciBsb2FkIGtpbGxzIENvcmUgMi4uLgorc3ViIGVuY2NvbXBhY3R2ZXJ0KCkKK3sgbXkgKCR0MywkdDQsJHQ1KT0oIiVyOGQiLCIlcjlkIiwiJXIxM2QiKTsKKworJGNvZGUuPTw8X19fOworCW1vdnpiCWAmbG8oIiRzMCIpYCwkdDAKKwltb3Z6YglgJmxvKCIkczEiKWAsJHQxCisJbW92emIJYCZsbygiJHMyIilgLCR0MgorCW1vdnpiCSgkc2JveCwkdDAsMSksJHQwCisJbW92emIJKCRzYm94LCR0MSwxKSwkdDEKKwltb3Z6YgkoJHNib3gsJHQyLDEpLCR0MgorCisJbW92emIJYCZsbygiJHMzIilgLCR0MworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMQorCW1vdnpiCSgkc2JveCwkdDMsMSksJHQzCisJbW92emIJKCRzYm94LCRhY2MwLDEpLCR0NAkjJHQwCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCR0NQkjJHQxCisKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzIKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzAKKwlzaHIJXCQxNiwkczIKKwltb3Z6YgkoJHNib3gsJGFjYzIsMSksJGFjYzIJIyR0MgorCW1vdnpiCSgkc2JveCwkYWNjMCwxKSwkYWNjMAkjJHQzCisJc2hyCVwkMTYsJHMzCisKKwltb3Z6YglgJmxvKCIkczIiKWAsJGFjYzEKKwlzaGwJXCQ4LCR0NAorCXNobAlcJDgsJHQ1CisJbW92emIJKCRzYm94LCRhY2MxLDEpLCRhY2MxCSMkdDAKKwl4b3IJJHQ0LCR0MAorCXhvcgkkdDUsJHQxCisKKwltb3Z6YglgJmxvKCIkczMiKWAsJHQ0CisJc2hyCVwkMTYsJHMwCisJc2hyCVwkMTYsJHMxCisJbW92emIJYCZsbygiJHMwIilgLCR0NQorCXNobAlcJDgsJGFjYzIKKwlzaGwJXCQ4LCRhY2MwCisJbW92emIJKCRzYm94LCR0NCwxKSwkdDQJIyR0MQorCW1vdnpiCSgkc2JveCwkdDUsMSksJHQ1CSMkdDIKKwl4b3IJJGFjYzIsJHQyCisJeG9yCSRhY2MwLCR0MworCisJbW92emIJYCZsbygiJHMxIilgLCRhY2MyCisJbW92emIJYCZoaSgiJHMzIilgLCRhY2MwCisJc2hsCVwkMTYsJGFjYzEKKwltb3Z6YgkoJHNib3gsJGFjYzIsMSksJGFjYzIJIyR0MworCW1vdnpiCSgkc2JveCwkYWNjMCwxKSwkYWNjMAkjJHQwCisJeG9yCSRhY2MxLCR0MAorCisJbW92emIJYCZoaSgiJHMwIilgLCRhY2MxCisJc2hyCVwkOCwkczIKKwlzaHIJXCQ4LCRzMQorCW1vdnpiCSgkc2JveCwkYWNjMSwxKSwkYWNjMQkjJHQxCisJbW92emIJKCRzYm94LCRzMiwxKSwkczMJIyR0MworCW1vdnpiCSgkc2JveCwkczEsMSksJHMyCSMkdDIKKwlzaGwJXCQxNiwkdDQKKwlzaGwJXCQxNiwkdDUKKwlzaGwJXCQxNiwkYWNjMgorCXhvcgkkdDQsJHQxCisJeG9yCSR0NSwkdDIKKwl4b3IJJGFjYzIsJHQzCisKKwlzaGwJXCQyNCwkYWNjMAorCXNobAlcJDI0LCRhY2MxCisJc2hsCVwkMjQsJHMzCisJeG9yCSRhY2MwLCR0MAorCXNobAlcJDI0LCRzMgorCXhvcgkkYWNjMSwkdDEKKwltb3YJJHQwLCRzMAorCW1vdgkkdDEsJHMxCisJeG9yCSR0MiwkczIKKwl4b3IJJHQzLCRzMworX19fCit9CisKK3N1YiBlbmN0cmFuc2Zvcm1fcmVmKCkKK3sgbXkgJHNuID0gc2hpZnQ7CisgIG15ICgkYWNjLCRyMiwkdG1wKT0oIiVyOGQiLCIlcjlkIiwiJXIxM2QiKTsKKworJGNvZGUuPTw8X19fOworCW1vdgkkc24sJGFjYworCWFuZAlcJDB4ODA4MDgwODAsJGFjYworCW1vdgkkYWNjLCR0bXAKKwlzaHIJXCQ3LCR0bXAKKwlsZWEJKCRzbiwkc24pLCRyMgorCXN1YgkkdG1wLCRhY2MKKwlhbmQJXCQweGZlZmVmZWZlLCRyMgorCWFuZAlcJDB4MWIxYjFiMWIsJGFjYworCW1vdgkkc24sJHRtcAorCXhvcgkkYWNjLCRyMgorCisJeG9yCSRyMiwkc24KKwlyb2wJXCQyNCwkc24KKwl4b3IJJHIyLCRzbgorCXJvcglcJDE2LCR0bXAKKwl4b3IJJHRtcCwkc24KKwlyb3IJXCQ4LCR0bXAKKwl4b3IJJHRtcCwkc24KK19fXworfQorCisjIHVubGlrZSBkZWNyeXB0IGNhc2UgaXQgZG9lcyBub3QgcGF5IG9mZiB0byBwYXJhbGxlbGl6ZSBlbmN0cmFuc2Zvcm0KK3N1YiBlbmN0cmFuc2Zvcm0oKQoreyBteSAoJHQzLCRyMjAsJHIyMSk9KCRhY2MyLCIlcjhkIiwiJXI5ZCIpOworCiskY29kZS49PDxfX187CisJbW92CSRzMCwkYWNjMAorCW1vdgkkczEsJGFjYzEKKwlhbmQJXCQweDgwODA4MDgwLCRhY2MwCisJYW5kCVwkMHg4MDgwODA4MCwkYWNjMQorCW1vdgkkYWNjMCwkdDAKKwltb3YJJGFjYzEsJHQxCisJc2hyCVwkNywkdDAKKwlsZWEJKCRzMCwkczApLCRyMjAKKwlzaHIJXCQ3LCR0MQorCWxlYQkoJHMxLCRzMSksJHIyMQorCXN1YgkkdDAsJGFjYzAKKwlzdWIJJHQxLCRhY2MxCisJYW5kCVwkMHhmZWZlZmVmZSwkcjIwCisJYW5kCVwkMHhmZWZlZmVmZSwkcjIxCisJYW5kCVwkMHgxYjFiMWIxYiwkYWNjMAorCWFuZAlcJDB4MWIxYjFiMWIsJGFjYzEKKwltb3YJJHMwLCR0MAorCW1vdgkkczEsJHQxCisJeG9yCSRhY2MwLCRyMjAKKwl4b3IJJGFjYzEsJHIyMQorCisJeG9yCSRyMjAsJHMwCisJeG9yCSRyMjEsJHMxCisJIG1vdgkkczIsJGFjYzAKKwkgbW92CSRzMywkYWNjMQorCXJvbAlcJDI0LCRzMAorCXJvbAlcJDI0LCRzMQorCSBhbmQJXCQweDgwODA4MDgwLCRhY2MwCisJIGFuZAlcJDB4ODA4MDgwODAsJGFjYzEKKwl4b3IJJHIyMCwkczAKKwl4b3IJJHIyMSwkczEKKwkgbW92CSRhY2MwLCR0MgorCSBtb3YJJGFjYzEsJHQzCisJcm9yCVwkMTYsJHQwCisJcm9yCVwkMTYsJHQxCisJIHNocglcJDcsJHQyCisJIGxlYQkoJHMyLCRzMiksJHIyMAorCXhvcgkkdDAsJHMwCisJeG9yCSR0MSwkczEKKwkgc2hyCVwkNywkdDMKKwkgbGVhCSgkczMsJHMzKSwkcjIxCisJcm9yCVwkOCwkdDAKKwlyb3IJXCQ4LCR0MQorCSBzdWIJJHQyLCRhY2MwCisJIHN1YgkkdDMsJGFjYzEKKwl4b3IJJHQwLCRzMAorCXhvcgkkdDEsJHMxCisKKwlhbmQJXCQweGZlZmVmZWZlLCRyMjAKKwlhbmQJXCQweGZlZmVmZWZlLCRyMjEKKwlhbmQJXCQweDFiMWIxYjFiLCRhY2MwCisJYW5kCVwkMHgxYjFiMWIxYiwkYWNjMQorCW1vdgkkczIsJHQyCisJbW92CSRzMywkdDMKKwl4b3IJJGFjYzAsJHIyMAorCXhvcgkkYWNjMSwkcjIxCisKKwl4b3IJJHIyMCwkczIKKwl4b3IJJHIyMSwkczMKKwlyb2wJXCQyNCwkczIKKwlyb2wJXCQyNCwkczMKKwl4b3IJJHIyMCwkczIKKwl4b3IJJHIyMSwkczMKKwltb3YJMCgkc2JveCksJGFjYzAJCQkjIHByZWZldGNoIFRlNAorCXJvcglcJDE2LCR0MgorCXJvcglcJDE2LCR0MworCW1vdgk2NCgkc2JveCksJGFjYzEKKwl4b3IJJHQyLCRzMgorCXhvcgkkdDMsJHMzCisJbW92CTEyOCgkc2JveCksJHIyMAorCXJvcglcJDgsJHQyCisJcm9yCVwkOCwkdDMKKwltb3YJMTkyKCRzYm94KSwkcjIxCisJeG9yCSR0MiwkczIKKwl4b3IJJHQzLCRzMworX19fCit9CisKKyRjb2RlLj08PF9fXzsKKy50eXBlCV94ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK194ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdDoKKwlsZWEJMTI4KCRzYm94KSwkaW5wCQkJIyBzaXplIG9wdGltaXphdGlvbgorCW1vdgkwLTEyOCgkaW5wKSwkYWNjMQkJIyBwcmVmZXRjaCBUZTQKKwltb3YJMzItMTI4KCRpbnApLCRhY2MyCisJbW92CTY0LTEyOCgkaW5wKSwkdDAKKwltb3YJOTYtMTI4KCRpbnApLCR0MQorCW1vdgkxMjgtMTI4KCRpbnApLCRhY2MxCisJbW92CTE2MC0xMjgoJGlucCksJGFjYzIKKwltb3YJMTkyLTEyOCgkaW5wKSwkdDAKKwltb3YJMjI0LTEyOCgkaW5wKSwkdDEKKwlqbXAJLkxlbmNfbG9vcF9jb21wYWN0CisuYWxpZ24JMTYKKy5MZW5jX2xvb3BfY29tcGFjdDoKKwkJeG9yCTAoJGtleSksJHMwCQkjIHhvciB3aXRoIGtleQorCQl4b3IJNCgka2V5KSwkczEKKwkJeG9yCTgoJGtleSksJHMyCisJCXhvcgkxMigka2V5KSwkczMKKwkJbGVhCTE2KCRrZXkpLCRrZXkKK19fXworCQkmZW5jY29tcGFjdHZlcnQoKTsKKyRjb2RlLj08PF9fXzsKKwkJY21wCTE2KCVyc3ApLCRrZXkKKwkJamUJLkxlbmNfY29tcGFjdF9kb25lCitfX18KKwkJJmVuY3RyYW5zZm9ybSgpOworJGNvZGUuPTw8X19fOworCWptcAkuTGVuY19sb29wX2NvbXBhY3QKKy5hbGlnbgkxNgorLkxlbmNfY29tcGFjdF9kb25lOgorCXhvcgkwKCRrZXkpLCRzMAorCXhvcgk0KCRrZXkpLCRzMQorCXhvcgk4KCRrZXkpLCRzMgorCXhvcgkxMigka2V5KSwkczMKKwkuYnl0ZQkweGYzLDB4YzMJCQkjIHJlcCByZXQKKy5zaXplCV94ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdCwuLV94ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdAorX19fCisKKyMgdm9pZCBBRVNfZW5jcnlwdCAoY29uc3Qgdm9pZCAqaW5wLHZvaWQgKm91dCxjb25zdCBBRVNfS0VZICprZXkpOworJGNvZGUuPTw8X19fOworLmdsb2JsCUFFU19lbmNyeXB0CisudHlwZQlBRVNfZW5jcnlwdCxcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorQUVTX2VuY3J5cHQ6CisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisKKwkjIGFsbG9jYXRlIGZyYW1lICJhYm92ZSIga2V5IHNjaGVkdWxlCisJbW92CSVyc3AsJXIxMAorCWxlYQktNjMoJXJkeCksJXJjeAkjICVyZHggaXMga2V5IGFyZ3VtZW50CisJYW5kCVwkLTY0LCVyc3AKKwlzdWIJJXJzcCwlcmN4CisJbmVnCSVyY3gKKwlhbmQJXCQweDNjMCwlcmN4CisJc3ViCSVyY3gsJXJzcAorCXN1YglcJDMyLCVyc3AKKworCW1vdgklcnNpLDE2KCVyc3ApCSMgc2F2ZSBvdXQKKwltb3YJJXIxMCwyNCglcnNwKQkjIHNhdmUgcmVhbCBzdGFjayBwb2ludGVyCisuTGVuY19wcm9sb2d1ZToKKworCW1vdgklcmR4LCRrZXkKKwltb3YJMjQwKCRrZXkpLCRybmRzCSMgbG9hZCByb3VuZHMKKworCW1vdgkwKCVyZGkpLCRzMAkjIGxvYWQgaW5wdXQgdmVjdG9yCisJbW92CTQoJXJkaSksJHMxCisJbW92CTgoJXJkaSksJHMyCisJbW92CTEyKCVyZGkpLCRzMworCisJc2hsCVwkNCwkcm5kcworCWxlYQkoJGtleSwkcm5kcyksJXJicAorCW1vdgkka2V5LCglcnNwKQkjIGtleSBzY2hlZHVsZQorCW1vdgklcmJwLDgoJXJzcCkJIyBlbmQgb2Yga2V5IHNjaGVkdWxlCisKKwkjIHBpY2sgVGU0IGNvcHkgd2hpY2ggY2FuJ3QgIm92ZXJsYXAiIHdpdGggc3RhY2sgZnJhbWUgb3Iga2V5IHNjaGVkdWxlCisJbGVhCS5MQUVTX1RlKzIwNDgoJXJpcCksJHNib3gKKwlsZWEJNzY4KCVyc3ApLCVyYnAKKwlzdWIJJHNib3gsJXJicAorCWFuZAlcJDB4MzAwLCVyYnAKKwlsZWEJKCRzYm94LCVyYnApLCRzYm94CisKKwljYWxsCV94ODZfNjRfQUVTX2VuY3J5cHRfY29tcGFjdAorCisJbW92CTE2KCVyc3ApLCRvdXQJIyByZXN0b3JlIG91dAorCW1vdgkyNCglcnNwKSwlcnNpCSMgcmVzdG9yZSBzYXZlZCBzdGFjayBwb2ludGVyCisJbW92CSRzMCwwKCRvdXQpCSMgd3JpdGUgb3V0cHV0IHZlY3RvcgorCW1vdgkkczEsNCgkb3V0KQorCW1vdgkkczIsOCgkb3V0KQorCW1vdgkkczMsMTIoJG91dCkKKworCW1vdgkoJXJzaSksJXIxNQorCW1vdgk4KCVyc2kpLCVyMTQKKwltb3YJMTYoJXJzaSksJXIxMworCW1vdgkyNCglcnNpKSwlcjEyCisJbW92CTMyKCVyc2kpLCVyYnAKKwltb3YJNDAoJXJzaSksJXJieAorCWxlYQk0OCglcnNpKSwlcnNwCisuTGVuY19lcGlsb2d1ZToKKwlyZXQKKy5zaXplCUFFU19lbmNyeXB0LC4tQUVTX2VuY3J5cHQKK19fXworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCitzdWIgZGVjdmVydCgpCit7IG15ICR0Mz0iJXI4ZCI7CSMgemFwcyAkaW5wIQorCiskY29kZS49PDxfX187CisJIyBmYXZvciAzLXdheSBpc3N1ZSBPcHRlcm9uIHBpcGVsaW5lLi4uCisJbW92emIJYCZsbygiJHMwIilgLCRhY2MwCisJbW92emIJYCZsbygiJHMxIilgLCRhY2MxCisJbW92emIJYCZsbygiJHMyIilgLCRhY2MyCisJbW92CTAoJHNib3gsJGFjYzAsOCksJHQwCisJbW92CTAoJHNib3gsJGFjYzEsOCksJHQxCisJbW92CTAoJHNib3gsJGFjYzIsOCksJHQyCisKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzAKKwltb3Z6YglgJmhpKCIkczAiKWAsJGFjYzEKKwltb3Z6YglgJmxvKCIkczMiKWAsJGFjYzIKKwl4b3IJMygkc2JveCwkYWNjMCw4KSwkdDAKKwl4b3IJMygkc2JveCwkYWNjMSw4KSwkdDEKKwltb3YJMCgkc2JveCwkYWNjMiw4KSwkdDMKKworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMAorCXNocglcJDE2LCRzMAorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMgorCXhvcgkzKCRzYm94LCRhY2MwLDgpLCR0MgorCXNocglcJDE2LCRzMworCXhvcgkzKCRzYm94LCRhY2MyLDgpLCR0MworCisJc2hyCVwkMTYsJHMxCisJbGVhCTE2KCRrZXkpLCRrZXkKKwlzaHIJXCQxNiwkczIKKworCW1vdnpiCWAmbG8oIiRzMiIpYCwkYWNjMAorCW1vdnpiCWAmbG8oIiRzMyIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMCIpYCwkYWNjMgorCXhvcgkyKCRzYm94LCRhY2MwLDgpLCR0MAorCXhvcgkyKCRzYm94LCRhY2MxLDgpLCR0MQorCXhvcgkyKCRzYm94LCRhY2MyLDgpLCR0MgorCisJbW92emIJYCZoaSgiJHMxIilgLCRhY2MwCisJbW92emIJYCZoaSgiJHMyIilgLCRhY2MxCisJbW92emIJYCZsbygiJHMxIilgLCRhY2MyCisJeG9yCTEoJHNib3gsJGFjYzAsOCksJHQwCisJeG9yCTEoJHNib3gsJGFjYzEsOCksJHQxCisJeG9yCTIoJHNib3gsJGFjYzIsOCksJHQzCisKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzAKKwltb3YJMTIoJGtleSksJHMzCisJbW92emIJYCZoaSgiJHMwIilgLCRhY2MyCisJeG9yCTEoJHNib3gsJGFjYzAsOCksJHQyCisJbW92CTAoJGtleSksJHMwCisJeG9yCTEoJHNib3gsJGFjYzIsOCksJHQzCisKKwl4b3IJJHQwLCRzMAorCW1vdgk0KCRrZXkpLCRzMQorCW1vdgk4KCRrZXkpLCRzMgorCXhvcgkkdDIsJHMyCisJeG9yCSR0MSwkczEKKwl4b3IJJHQzLCRzMworX19fCit9CisKK3N1YiBkZWNsYXN0dmVydCgpCit7IG15ICR0Mz0iJXI4ZCI7CSMgemFwcyAkaW5wIQorCiskY29kZS49PDxfX187CisJbGVhCTIwNDgoJHNib3gpLCRzYm94CSMgc2l6ZSBvcHRpbWl6YXRpb24KKwltb3Z6YglgJmxvKCIkczAiKWAsJGFjYzAKKwltb3Z6YglgJmxvKCIkczEiKWAsJGFjYzEKKwltb3Z6YglgJmxvKCIkczIiKWAsJGFjYzIKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJHQwCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCR0MQorCW1vdnpiCSgkc2JveCwkYWNjMiwxKSwkdDIKKworCW1vdnpiCWAmbG8oIiRzMyIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMyIpYCwkYWNjMQorCW1vdnpiCWAmaGkoIiRzMCIpYCwkYWNjMgorCW1vdnpiCSgkc2JveCwkYWNjMCwxKSwkdDMKKwltb3Z6YgkoJHNib3gsJGFjYzEsMSksJGFjYzEJIyR0MAorCW1vdnpiCSgkc2JveCwkYWNjMiwxKSwkYWNjMgkjJHQxCisKKwlzaGwJXCQ4LCRhY2MxCisJc2hsCVwkOCwkYWNjMgorCisJeG9yCSRhY2MxLCR0MAorCXhvcgkkYWNjMiwkdDEKKwlzaHIJXCQxNiwkczMKKworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMQorCXNocglcJDE2LCRzMAorCW1vdnpiCSgkc2JveCwkYWNjMCwxKSwkYWNjMAkjJHQyCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCRhY2MxCSMkdDMKKworCXNobAlcJDgsJGFjYzAKKwlzaGwJXCQ4LCRhY2MxCisJc2hyCVwkMTYsJHMxCisJeG9yCSRhY2MwLCR0MgorCXhvcgkkYWNjMSwkdDMKKwlzaHIJXCQxNiwkczIKKworCW1vdnpiCWAmbG8oIiRzMiIpYCwkYWNjMAorCW1vdnpiCWAmbG8oIiRzMyIpYCwkYWNjMQorCW1vdnpiCWAmbG8oIiRzMCIpYCwkYWNjMgorCW1vdnpiCSgkc2JveCwkYWNjMCwxKSwkYWNjMAkjJHQwCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCRhY2MxCSMkdDEKKwltb3Z6YgkoJHNib3gsJGFjYzIsMSksJGFjYzIJIyR0MgorCisJc2hsCVwkMTYsJGFjYzAKKwlzaGwJXCQxNiwkYWNjMQorCXNobAlcJDE2LCRhY2MyCisKKwl4b3IJJGFjYzAsJHQwCisJeG9yCSRhY2MxLCR0MQorCXhvcgkkYWNjMiwkdDIKKworCW1vdnpiCWAmbG8oIiRzMSIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMQorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMgorCW1vdnpiCSgkc2JveCwkYWNjMCwxKSwkYWNjMAkjJHQzCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCRhY2MxCSMkdDAKKwltb3Z6YgkoJHNib3gsJGFjYzIsMSksJGFjYzIJIyR0MQorCisJc2hsCVwkMTYsJGFjYzAKKwlzaGwJXCQyNCwkYWNjMQorCXNobAlcJDI0LCRhY2MyCisKKwl4b3IJJGFjYzAsJHQzCisJeG9yCSRhY2MxLCR0MAorCXhvcgkkYWNjMiwkdDEKKworCW1vdnpiCWAmaGkoIiRzMyIpYCwkYWNjMAorCW1vdnpiCWAmaGkoIiRzMCIpYCwkYWNjMQorCW1vdgkxNisxMigka2V5KSwkczMKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJGFjYzAJIyR0MgorCW1vdnpiCSgkc2JveCwkYWNjMSwxKSwkYWNjMQkjJHQzCisJbW92CTE2KzAoJGtleSksJHMwCisKKwlzaGwJXCQyNCwkYWNjMAorCXNobAlcJDI0LCRhY2MxCisKKwl4b3IJJGFjYzAsJHQyCisJeG9yCSRhY2MxLCR0MworCisJbW92CTE2KzQoJGtleSksJHMxCisJbW92CTE2KzgoJGtleSksJHMyCisJbGVhCS0yMDQ4KCRzYm94KSwkc2JveAorCXhvcgkkdDAsJHMwCisJeG9yCSR0MSwkczEKKwl4b3IJJHQyLCRzMgorCXhvcgkkdDMsJHMzCitfX18KK30KKworc3ViIGRlY3N0ZXAoKQoreyBteSAoJGksQHMpID0gQF87CisgIG15ICR0bXAwPSRhY2MwOworICBteSAkdG1wMT0kYWNjMTsKKyAgbXkgJHRtcDI9JGFjYzI7CisgIG15ICRvdXQ9KCR0MCwkdDEsJHQyLCRzWzBdKVskaV07CisKKwkkY29kZS49Igltb3YJJHNbMF0sJG91dFxuIgkJaWYgKCRpIT0zKTsKKwkJCSR0bXAxPSRzWzJdCQkJaWYgKCRpPT0zKTsKKwkkY29kZS49Igltb3YJJHNbMl0sJHRtcDFcbiIJCWlmICgkaSE9Myk7CisJJGNvZGUuPSIJYW5kCVwkMHhGRiwkb3V0XG4iOworCisJJGNvZGUuPSIJbW92CTAoJHNib3gsJG91dCw4KSwkb3V0XG4iOworCSRjb2RlLj0iCXNocglcJDE2LCR0bXAxXG4iOworCQkJJHRtcDI9JHNbM10JCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iCW1vdgkkc1szXSwkdG1wMlxuIgkJaWYgKCRpIT0zKTsKKworCQkJJHRtcDA9JHNbMV0JCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iCW1vdnpiCSIuJmhpKCRzWzFdKS4iLCR0bXAwXG4iOworCSRjb2RlLj0iCWFuZAlcJDB4RkYsJHRtcDFcbiI7CisJJGNvZGUuPSIJc2hyCVwkMjQsJHRtcDJcbiI7CisKKwkkY29kZS49Igl4b3IJMygkc2JveCwkdG1wMCw4KSwkb3V0XG4iOworCSRjb2RlLj0iCXhvcgkyKCRzYm94LCR0bXAxLDgpLCRvdXRcbiI7CisJJGNvZGUuPSIJeG9yCTEoJHNib3gsJHRtcDIsOCksJG91dFxuIjsKKworCSRjb2RlLj0iCW1vdgkkdDIsJHNbMV1cbiIJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJbW92CSR0MSwkc1syXVxuIgkJaWYgKCRpPT0zKTsKKwkkY29kZS49Igltb3YJJHQwLCRzWzNdXG4iCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iXG4iOworfQorCitzdWIgZGVjbGFzdCgpCit7IG15ICgkaSxAcyk9QF87CisgIG15ICR0bXAwPSRhY2MwOworICBteSAkdG1wMT0kYWNjMTsKKyAgbXkgJHRtcDI9JGFjYzI7CisgIG15ICRvdXQ9KCR0MCwkdDEsJHQyLCRzWzBdKVskaV07CisKKwkkY29kZS49Igltb3YJJHNbMF0sJG91dFxuIgkJaWYgKCRpIT0zKTsKKwkJCSR0bXAxPSRzWzJdCQkJaWYgKCRpPT0zKTsKKwkkY29kZS49Igltb3YJJHNbMl0sJHRtcDFcbiIJCWlmICgkaSE9Myk7CisJJGNvZGUuPSIJYW5kCVwkMHhGRiwkb3V0XG4iOworCisJJGNvZGUuPSIJbW92emIJMjA0OCgkc2JveCwkb3V0LDEpLCRvdXRcbiI7CisJJGNvZGUuPSIJc2hyCVwkMTYsJHRtcDFcbiI7CisJCQkkdG1wMj0kc1szXQkJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJbW92CSRzWzNdLCR0bXAyXG4iCQlpZiAoJGkhPTMpOworCisJCQkkdG1wMD0kc1sxXQkJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJbW92emIJIi4maGkoJHNbMV0pLiIsJHRtcDBcbiI7CisJJGNvZGUuPSIJYW5kCVwkMHhGRiwkdG1wMVxuIjsKKwkkY29kZS49IglzaHIJXCQyNCwkdG1wMlxuIjsKKworCSRjb2RlLj0iCW1vdnpiCTIwNDgoJHNib3gsJHRtcDAsMSksJHRtcDBcbiI7CisJJGNvZGUuPSIJbW92emIJMjA0OCgkc2JveCwkdG1wMSwxKSwkdG1wMVxuIjsKKwkkY29kZS49Igltb3Z6YgkyMDQ4KCRzYm94LCR0bXAyLDEpLCR0bXAyXG4iOworCisJJGNvZGUuPSIJc2hsCVwkOCwkdG1wMFxuIjsKKwkkY29kZS49IglzaGwJXCQxNiwkdG1wMVxuIjsKKwkkY29kZS49IglzaGwJXCQyNCwkdG1wMlxuIjsKKworCSRjb2RlLj0iCXhvcgkkdG1wMCwkb3V0XG4iOworCSRjb2RlLj0iCW1vdgkkdDIsJHNbMV1cbiIJCWlmICgkaT09Myk7CisJJGNvZGUuPSIJeG9yCSR0bXAxLCRvdXRcbiI7CisJJGNvZGUuPSIJbW92CSR0MSwkc1syXVxuIgkJaWYgKCRpPT0zKTsKKwkkY29kZS49Igl4b3IJJHRtcDIsJG91dFxuIjsKKwkkY29kZS49Igltb3YJJHQwLCRzWzNdXG4iCQlpZiAoJGk9PTMpOworCSRjb2RlLj0iXG4iOworfQorCiskY29kZS49PDxfX187CisudHlwZQlfeDg2XzY0X0FFU19kZWNyeXB0LFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorX3g4Nl82NF9BRVNfZGVjcnlwdDoKKwl4b3IJMCgka2V5KSwkczAJCQkjIHhvciB3aXRoIGtleQorCXhvcgk0KCRrZXkpLCRzMQorCXhvcgk4KCRrZXkpLCRzMgorCXhvcgkxMigka2V5KSwkczMKKworCW1vdgkyNDAoJGtleSksJHJuZHMJCQkjIGxvYWQga2V5LT5yb3VuZHMKKwlzdWIJXCQxLCRybmRzCisJam1wCS5MZGVjX2xvb3AKKy5hbGlnbgkxNgorLkxkZWNfbG9vcDoKK19fXworCWlmICgkdmVydGljYWxzcGluKSB7ICZkZWN2ZXJ0KCk7IH0KKwllbHNlIHsJJmRlY3N0ZXAoMCwkczAsJHMzLCRzMiwkczEpOworCQkmZGVjc3RlcCgxLCRzMSwkczAsJHMzLCRzMik7CisJCSZkZWNzdGVwKDIsJHMyLCRzMSwkczAsJHMzKTsKKwkJJmRlY3N0ZXAoMywkczMsJHMyLCRzMSwkczApOworCQkkY29kZS49PDxfX187CisJCWxlYQkxNigka2V5KSwka2V5CisJCXhvcgkwKCRrZXkpLCRzMAkJCSMgeG9yIHdpdGgga2V5CisJCXhvcgk0KCRrZXkpLCRzMQorCQl4b3IJOCgka2V5KSwkczIKKwkJeG9yCTEyKCRrZXkpLCRzMworX19fCisJfQorJGNvZGUuPTw8X19fOworCXN1YglcJDEsJHJuZHMKKwlqbnoJLkxkZWNfbG9vcAorX19fCisJaWYgKCR2ZXJ0aWNhbHNwaW4pIHsgJmRlY2xhc3R2ZXJ0KCk7IH0KKwllbHNlIHsJJmRlY2xhc3QoMCwkczAsJHMzLCRzMiwkczEpOworCQkmZGVjbGFzdCgxLCRzMSwkczAsJHMzLCRzMik7CisJCSZkZWNsYXN0KDIsJHMyLCRzMSwkczAsJHMzKTsKKwkJJmRlY2xhc3QoMywkczMsJHMyLCRzMSwkczApOworCQkkY29kZS49PDxfX187CisJCXhvcgkxNiswKCRrZXkpLCRzMAkJCSMgeG9yIHdpdGgga2V5CisJCXhvcgkxNis0KCRrZXkpLCRzMQorCQl4b3IJMTYrOCgka2V5KSwkczIKKwkJeG9yCTE2KzEyKCRrZXkpLCRzMworX19fCisJfQorJGNvZGUuPTw8X19fOworCS5ieXRlCTB4ZjMsMHhjMwkJCSMgcmVwIHJldAorLnNpemUJX3g4Nl82NF9BRVNfZGVjcnlwdCwuLV94ODZfNjRfQUVTX2RlY3J5cHQKK19fXworCitzdWIgZGVjY29tcGFjdHZlcnQoKQoreyBteSAoJHQzLCR0NCwkdDUpPSgiJXI4ZCIsIiVyOWQiLCIlcjEzZCIpOworCiskY29kZS49PDxfX187CisJbW92emIJYCZsbygiJHMwIilgLCR0MAorCW1vdnpiCWAmbG8oIiRzMSIpYCwkdDEKKwltb3Z6YglgJmxvKCIkczIiKWAsJHQyCisJbW92emIJKCRzYm94LCR0MCwxKSwkdDAKKwltb3Z6YgkoJHNib3gsJHQxLDEpLCR0MQorCW1vdnpiCSgkc2JveCwkdDIsMSksJHQyCisKKwltb3Z6YglgJmxvKCIkczMiKWAsJHQzCisJbW92emIJYCZoaSgiJHMzIilgLCRhY2MwCisJbW92emIJYCZoaSgiJHMwIilgLCRhY2MxCisJbW92emIJKCRzYm94LCR0MywxKSwkdDMKKwltb3Z6YgkoJHNib3gsJGFjYzAsMSksJHQ0CSMkdDAKKwltb3Z6YgkoJHNib3gsJGFjYzEsMSksJHQ1CSMkdDEKKworCW1vdnpiCWAmaGkoIiRzMSIpYCwkYWNjMgorCW1vdnpiCWAmaGkoIiRzMiIpYCwkYWNjMAorCXNocglcJDE2LCRzMgorCW1vdnpiCSgkc2JveCwkYWNjMiwxKSwkYWNjMgkjJHQyCisJbW92emIJKCRzYm94LCRhY2MwLDEpLCRhY2MwCSMkdDMKKwlzaHIJXCQxNiwkczMKKworCW1vdnpiCWAmbG8oIiRzMiIpYCwkYWNjMQorCXNobAlcJDgsJHQ0CisJc2hsCVwkOCwkdDUKKwltb3Z6YgkoJHNib3gsJGFjYzEsMSksJGFjYzEJIyR0MAorCXhvcgkkdDQsJHQwCisJeG9yCSR0NSwkdDEKKworCW1vdnpiCWAmbG8oIiRzMyIpYCwkdDQKKwlzaHIJXCQxNiwkczAKKwlzaHIJXCQxNiwkczEKKwltb3Z6YglgJmxvKCIkczAiKWAsJHQ1CisJc2hsCVwkOCwkYWNjMgorCXNobAlcJDgsJGFjYzAKKwltb3Z6YgkoJHNib3gsJHQ0LDEpLCR0NAkjJHQxCisJbW92emIJKCRzYm94LCR0NSwxKSwkdDUJIyR0MgorCXhvcgkkYWNjMiwkdDIKKwl4b3IJJGFjYzAsJHQzCisKKwltb3Z6YglgJmxvKCIkczEiKWAsJGFjYzIKKwltb3Z6YglgJmhpKCIkczEiKWAsJGFjYzAKKwlzaGwJXCQxNiwkYWNjMQorCW1vdnpiCSgkc2JveCwkYWNjMiwxKSwkYWNjMgkjJHQzCisJbW92emIJKCRzYm94LCRhY2MwLDEpLCRhY2MwCSMkdDAKKwl4b3IJJGFjYzEsJHQwCisKKwltb3Z6YglgJmhpKCIkczIiKWAsJGFjYzEKKwlzaGwJXCQxNiwkdDQKKwlzaGwJXCQxNiwkdDUKKwltb3Z6YgkoJHNib3gsJGFjYzEsMSksJHMxCSMkdDEKKwl4b3IJJHQ0LCR0MQorCXhvcgkkdDUsJHQyCisKKwltb3Z6YglgJmhpKCIkczMiKWAsJGFjYzEKKwlzaHIJXCQ4LCRzMAorCXNobAlcJDE2LCRhY2MyCisJbW92emIJKCRzYm94LCRhY2MxLDEpLCRzMgkjJHQyCisJbW92emIJKCRzYm94LCRzMCwxKSwkczMJIyR0MworCXhvcgkkYWNjMiwkdDMKKworCXNobAlcJDI0LCRhY2MwCisJc2hsCVwkMjQsJHMxCisJc2hsCVwkMjQsJHMyCisJeG9yCSRhY2MwLCR0MAorCXNobAlcJDI0LCRzMworCXhvcgkkdDEsJHMxCisJbW92CSR0MCwkczAKKwl4b3IJJHQyLCRzMgorCXhvcgkkdDMsJHMzCitfX18KK30KKworIyBwYXJhbGxlbGl6ZWQgdmVyc2lvbiEgaW5wdXQgaXMgcGFpciBvZiA2NC1iaXQgdmFsdWVzOiAlcmF4PXMxLnMwCisjIGFuZCAlcmN4PXMzLnMyLCBvdXRwdXQgaXMgZm91ciAzMi1iaXQgdmFsdWVzIGluICVlYXg9czAsICVlYng9czEsCisjICVlY3g9czIgYW5kICVlZHg9czMuCitzdWIgZGVjdHJhbnNmb3JtKCkKK3sgbXkgKCR0cDEwLCR0cDIwLCR0cDQwLCR0cDgwLCRhY2MwKT0oIiVyYXgiLCIlcjgiLCAiJXI5IiwgIiVyMTAiLCIlcmJ4Iik7CisgIG15ICgkdHAxOCwkdHAyOCwkdHA0OCwkdHA4OCwkYWNjOCk9KCIlcmN4IiwiJXIxMSIsIiVyMTIiLCIlcjEzIiwiJXJkeCIpOworICBteSAkcHJlZmV0Y2ggPSBzaGlmdDsKKworJGNvZGUuPTw8X19fOworCW1vdgkkdHAxMCwkYWNjMAorCW1vdgkkdHAxOCwkYWNjOAorCWFuZAkkbWFzazgwLCRhY2MwCisJYW5kCSRtYXNrODAsJGFjYzgKKwltb3YJJGFjYzAsJHRwNDAKKwltb3YJJGFjYzgsJHRwNDgKKwlzaHIJXCQ3LCR0cDQwCisJbGVhCSgkdHAxMCwkdHAxMCksJHRwMjAKKwlzaHIJXCQ3LCR0cDQ4CisJbGVhCSgkdHAxOCwkdHAxOCksJHRwMjgKKwlzdWIJJHRwNDAsJGFjYzAKKwlzdWIJJHRwNDgsJGFjYzgKKwlhbmQJJG1hc2tmZSwkdHAyMAorCWFuZAkkbWFza2ZlLCR0cDI4CisJYW5kCSRtYXNrMWIsJGFjYzAKKwlhbmQJJG1hc2sxYiwkYWNjOAorCXhvcgkkdHAyMCwkYWNjMAorCXhvcgkkdHAyOCwkYWNjOAorCW1vdgkkYWNjMCwkdHAyMAorCW1vdgkkYWNjOCwkdHAyOAorCisJYW5kCSRtYXNrODAsJGFjYzAKKwlhbmQJJG1hc2s4MCwkYWNjOAorCW1vdgkkYWNjMCwkdHA4MAorCW1vdgkkYWNjOCwkdHA4OAorCXNocglcJDcsJHRwODAKKwlsZWEJKCR0cDIwLCR0cDIwKSwkdHA0MAorCXNocglcJDcsJHRwODgKKwlsZWEJKCR0cDI4LCR0cDI4KSwkdHA0OAorCXN1YgkkdHA4MCwkYWNjMAorCXN1YgkkdHA4OCwkYWNjOAorCWFuZAkkbWFza2ZlLCR0cDQwCisJYW5kCSRtYXNrZmUsJHRwNDgKKwlhbmQJJG1hc2sxYiwkYWNjMAorCWFuZAkkbWFzazFiLCRhY2M4CisJeG9yCSR0cDQwLCRhY2MwCisJeG9yCSR0cDQ4LCRhY2M4CisJbW92CSRhY2MwLCR0cDQwCisJbW92CSRhY2M4LCR0cDQ4CisKKwlhbmQJJG1hc2s4MCwkYWNjMAorCWFuZAkkbWFzazgwLCRhY2M4CisJbW92CSRhY2MwLCR0cDgwCisJbW92CSRhY2M4LCR0cDg4CisJc2hyCVwkNywkdHA4MAorCSB4b3IJJHRwMTAsJHRwMjAJCSMgdHAyXj10cDEKKwlzaHIJXCQ3LCR0cDg4CisJIHhvcgkkdHAxOCwkdHAyOAkJIyB0cDJePXRwMQorCXN1YgkkdHA4MCwkYWNjMAorCXN1YgkkdHA4OCwkYWNjOAorCWxlYQkoJHRwNDAsJHRwNDApLCR0cDgwCisJbGVhCSgkdHA0OCwkdHA0OCksJHRwODgKKwkgeG9yCSR0cDEwLCR0cDQwCQkjIHRwNF49dHAxCisJIHhvcgkkdHAxOCwkdHA0OAkJIyB0cDRePXRwMQorCWFuZAkkbWFza2ZlLCR0cDgwCisJYW5kCSRtYXNrZmUsJHRwODgKKwlhbmQJJG1hc2sxYiwkYWNjMAorCWFuZAkkbWFzazFiLCRhY2M4CisJeG9yCSRhY2MwLCR0cDgwCisJeG9yCSRhY2M4LCR0cDg4CisKKwl4b3IJJHRwODAsJHRwMTAJCSMgdHAxXj10cDgKKwl4b3IJJHRwODgsJHRwMTgJCSMgdHAxXj10cDgKKwl4b3IJJHRwODAsJHRwMjAJCSMgdHAyXnRwMV49dHA4CisJeG9yCSR0cDg4LCR0cDI4CQkjIHRwMl50cDFePXRwOAorCW1vdgkkdHAxMCwkYWNjMAorCW1vdgkkdHAxOCwkYWNjOAorCXhvcgkkdHA4MCwkdHA0MAkJIyB0cDRedHAxXj10cDgKKwl4b3IJJHRwODgsJHRwNDgJCSMgdHA0XnRwMV49dHA4CisJc2hyCVwkMzIsJGFjYzAKKwlzaHIJXCQzMiwkYWNjOAorCXhvcgkkdHAyMCwkdHA4MAkJIyB0cDhePXRwOF50cDJedHAxPXRwMl50cDEKKwl4b3IJJHRwMjgsJHRwODgJCSMgdHA4Xj10cDhedHAyXnRwMT10cDJedHAxCisJcm9sCVwkOCxgJkxPKCIkdHAxMCIpYAkjIFJPVEFURSh0cDFedHA4LDgpCisJcm9sCVwkOCxgJkxPKCIkdHAxOCIpYAkjIFJPVEFURSh0cDFedHA4LDgpCisJeG9yCSR0cDQwLCR0cDgwCQkjIHRwMl50cDFePXRwOF50cDRedHAxPXRwOF50cDRedHAyCisJeG9yCSR0cDQ4LCR0cDg4CQkjIHRwMl50cDFePXRwOF50cDRedHAxPXRwOF50cDRedHAyCisKKwlyb2wJXCQ4LGAmTE8oIiRhY2MwIilgCSMgUk9UQVRFKHRwMV50cDgsOCkKKwlyb2wJXCQ4LGAmTE8oIiRhY2M4IilgCSMgUk9UQVRFKHRwMV50cDgsOCkKKwl4b3IJYCZMTygiJHRwODAiKWAsYCZMTygiJHRwMTAiKWAKKwl4b3IJYCZMTygiJHRwODgiKWAsYCZMTygiJHRwMTgiKWAKKwlzaHIJXCQzMiwkdHA4MAorCXNocglcJDMyLCR0cDg4CisJeG9yCWAmTE8oIiR0cDgwIilgLGAmTE8oIiRhY2MwIilgCisJeG9yCWAmTE8oIiR0cDg4IilgLGAmTE8oIiRhY2M4IilgCisKKwltb3YJJHRwMjAsJHRwODAKKwltb3YJJHRwMjgsJHRwODgKKwlzaHIJXCQzMiwkdHA4MAorCXNocglcJDMyLCR0cDg4CisJcm9sCVwkMjQsYCZMTygiJHRwMjAiKWAJIyBST1RBVEUodHAyXnRwMV50cDgsMjQpCisJcm9sCVwkMjQsYCZMTygiJHRwMjgiKWAJIyBST1RBVEUodHAyXnRwMV50cDgsMjQpCisJcm9sCVwkMjQsYCZMTygiJHRwODAiKWAJIyBST1RBVEUodHAyXnRwMV50cDgsMjQpCisJcm9sCVwkMjQsYCZMTygiJHRwODgiKWAJIyBST1RBVEUodHAyXnRwMV50cDgsMjQpCisJeG9yCWAmTE8oIiR0cDIwIilgLGAmTE8oIiR0cDEwIilgCisJeG9yCWAmTE8oIiR0cDI4IilgLGAmTE8oIiR0cDE4IilgCisJbW92CSR0cDQwLCR0cDIwCisJbW92CSR0cDQ4LCR0cDI4CisJeG9yCWAmTE8oIiR0cDgwIilgLGAmTE8oIiRhY2MwIilgCisJeG9yCWAmTE8oIiR0cDg4IilgLGAmTE8oIiRhY2M4IilgCisKKwlgIm1vdgkwKCRzYm94KSwkbWFzazgwIglpZiAoJHByZWZldGNoKWAKKwlzaHIJXCQzMiwkdHAyMAorCXNocglcJDMyLCR0cDI4CisJYCJtb3YJNjQoJHNib3gpLCRtYXNrZmUiCWlmICgkcHJlZmV0Y2gpYAorCXJvbAlcJDE2LGAmTE8oIiR0cDQwIilgCSMgUk9UQVRFKHRwNF50cDFedHA4LDE2KQorCXJvbAlcJDE2LGAmTE8oIiR0cDQ4IilgCSMgUk9UQVRFKHRwNF50cDFedHA4LDE2KQorCWAibW92CTEyOCgkc2JveCksJG1hc2sxYiIJaWYgKCRwcmVmZXRjaClgCisJcm9sCVwkMTYsYCZMTygiJHRwMjAiKWAJIyBST1RBVEUodHA0XnRwMV50cDgsMTYpCisJcm9sCVwkMTYsYCZMTygiJHRwMjgiKWAJIyBST1RBVEUodHA0XnRwMV50cDgsMTYpCisJYCJtb3YJMTkyKCRzYm94KSwkdHA4MCIJaWYgKCRwcmVmZXRjaClgCisJeG9yCWAmTE8oIiR0cDQwIilgLGAmTE8oIiR0cDEwIilgCisJeG9yCWAmTE8oIiR0cDQ4IilgLGAmTE8oIiR0cDE4IilgCisJYCJtb3YJMjU2KCRzYm94KSwkdHA4OCIJaWYgKCRwcmVmZXRjaClgCisJeG9yCWAmTE8oIiR0cDIwIilgLGAmTE8oIiRhY2MwIilgCisJeG9yCWAmTE8oIiR0cDI4IilgLGAmTE8oIiRhY2M4IilgCitfX18KK30KKworJGNvZGUuPTw8X19fOworLnR5cGUJX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0LFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0OgorCWxlYQkxMjgoJHNib3gpLCRpbnAJCQkjIHNpemUgb3B0aW1pemF0aW9uCisJbW92CTAtMTI4KCRpbnApLCRhY2MxCQkjIHByZWZldGNoIFRkNAorCW1vdgkzMi0xMjgoJGlucCksJGFjYzIKKwltb3YJNjQtMTI4KCRpbnApLCR0MAorCW1vdgk5Ni0xMjgoJGlucCksJHQxCisJbW92CTEyOC0xMjgoJGlucCksJGFjYzEKKwltb3YJMTYwLTEyOCgkaW5wKSwkYWNjMgorCW1vdgkxOTItMTI4KCRpbnApLCR0MAorCW1vdgkyMjQtMTI4KCRpbnApLCR0MQorCWptcAkuTGRlY19sb29wX2NvbXBhY3QKKworLmFsaWduCTE2CisuTGRlY19sb29wX2NvbXBhY3Q6CisJCXhvcgkwKCRrZXkpLCRzMAkJIyB4b3Igd2l0aCBrZXkKKwkJeG9yCTQoJGtleSksJHMxCisJCXhvcgk4KCRrZXkpLCRzMgorCQl4b3IJMTIoJGtleSksJHMzCisJCWxlYQkxNigka2V5KSwka2V5CitfX18KKwkJJmRlY2NvbXBhY3R2ZXJ0KCk7CiskY29kZS49PDxfX187CisJCWNtcAkxNiglcnNwKSwka2V5CisJCWplCS5MZGVjX2NvbXBhY3RfZG9uZQorCisJCW1vdgkyNTYrMCgkc2JveCksJG1hc2s4MAorCQlzaGwJXCQzMiwlcmJ4CisJCXNobAlcJDMyLCVyZHgKKwkJbW92CTI1Nis4KCRzYm94KSwkbWFza2ZlCisJCW9yCSVyYngsJXJheAorCQlvcgklcmR4LCVyY3gKKwkJbW92CTI1NisxNigkc2JveCksJG1hc2sxYgorX19fCisJCSZkZWN0cmFuc2Zvcm0oMSk7CiskY29kZS49PDxfX187CisJam1wCS5MZGVjX2xvb3BfY29tcGFjdAorLmFsaWduCTE2CisuTGRlY19jb21wYWN0X2RvbmU6CisJeG9yCTAoJGtleSksJHMwCisJeG9yCTQoJGtleSksJHMxCisJeG9yCTgoJGtleSksJHMyCisJeG9yCTEyKCRrZXkpLCRzMworCS5ieXRlCTB4ZjMsMHhjMwkJCSMgcmVwIHJldAorLnNpemUJX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0LC4tX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0CitfX18KKworIyB2b2lkIEFFU19kZWNyeXB0IChjb25zdCB2b2lkICppbnAsdm9pZCAqb3V0LGNvbnN0IEFFU19LRVkgKmtleSk7CiskY29kZS49PDxfX187CisuZ2xvYmwJQUVTX2RlY3J5cHQKKy50eXBlCUFFU19kZWNyeXB0LFxAZnVuY3Rpb24sMworLmFsaWduCTE2CitBRVNfZGVjcnlwdDoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKworCSMgYWxsb2NhdGUgZnJhbWUgImFib3ZlIiBrZXkgc2NoZWR1bGUKKwltb3YJJXJzcCwlcjEwCisJbGVhCS02MyglcmR4KSwlcmN4CSMgJXJkeCBpcyBrZXkgYXJndW1lbnQKKwlhbmQJXCQtNjQsJXJzcAorCXN1YgklcnNwLCVyY3gKKwluZWcJJXJjeAorCWFuZAlcJDB4M2MwLCVyY3gKKwlzdWIJJXJjeCwlcnNwCisJc3ViCVwkMzIsJXJzcAorCisJbW92CSVyc2ksMTYoJXJzcCkJIyBzYXZlIG91dAorCW1vdgklcjEwLDI0KCVyc3ApCSMgc2F2ZSByZWFsIHN0YWNrIHBvaW50ZXIKKy5MZGVjX3Byb2xvZ3VlOgorCisJbW92CSVyZHgsJGtleQorCW1vdgkyNDAoJGtleSksJHJuZHMJIyBsb2FkIHJvdW5kcworCisJbW92CTAoJXJkaSksJHMwCSMgbG9hZCBpbnB1dCB2ZWN0b3IKKwltb3YJNCglcmRpKSwkczEKKwltb3YJOCglcmRpKSwkczIKKwltb3YJMTIoJXJkaSksJHMzCisKKwlzaGwJXCQ0LCRybmRzCisJbGVhCSgka2V5LCRybmRzKSwlcmJwCisJbW92CSRrZXksKCVyc3ApCSMga2V5IHNjaGVkdWxlCisJbW92CSVyYnAsOCglcnNwKQkjIGVuZCBvZiBrZXkgc2NoZWR1bGUKKworCSMgcGljayBUZDQgY29weSB3aGljaCBjYW4ndCAib3ZlcmxhcCIgd2l0aCBzdGFjayBmcmFtZSBvciBrZXkgc2NoZWR1bGUKKwlsZWEJLkxBRVNfVGQrMjA0OCglcmlwKSwkc2JveAorCWxlYQk3NjgoJXJzcCksJXJicAorCXN1Ygkkc2JveCwlcmJwCisJYW5kCVwkMHgzMDAsJXJicAorCWxlYQkoJHNib3gsJXJicCksJHNib3gKKwlzaHIJXCQzLCVyYnAJIyByZWNhbGwgIm1hZ2ljIiBjb25zdGFudHMhCisJYWRkCSVyYnAsJHNib3gKKworCWNhbGwJX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0CisKKwltb3YJMTYoJXJzcCksJG91dAkjIHJlc3RvcmUgb3V0CisJbW92CTI0KCVyc3ApLCVyc2kJIyByZXN0b3JlIHNhdmVkIHN0YWNrIHBvaW50ZXIKKwltb3YJJHMwLDAoJG91dCkJIyB3cml0ZSBvdXRwdXQgdmVjdG9yCisJbW92CSRzMSw0KCRvdXQpCisJbW92CSRzMiw4KCRvdXQpCisJbW92CSRzMywxMigkb3V0KQorCisJbW92CSglcnNpKSwlcjE1CisJbW92CTgoJXJzaSksJXIxNAorCW1vdgkxNiglcnNpKSwlcjEzCisJbW92CTI0KCVyc2kpLCVyMTIKKwltb3YJMzIoJXJzaSksJXJicAorCW1vdgk0MCglcnNpKSwlcmJ4CisJbGVhCTQ4KCVyc2kpLCVyc3AKKy5MZGVjX2VwaWxvZ3VlOgorCXJldAorLnNpemUJQUVTX2RlY3J5cHQsLi1BRVNfZGVjcnlwdAorX19fCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCitzdWIgZW5ja2V5KCkKK3sKKyRjb2RlLj08PF9fXzsKKwltb3Z6CSVkbCwlZXNpCQkjIHJrW2ldPj4wCisJbW92emIJLTEyOCglcmJwLCVyc2kpLCVlYngKKwltb3Z6CSVkaCwlZXNpCQkjIHJrW2ldPj44CisJc2hsCVwkMjQsJWVieAorCXhvcgklZWJ4LCVlYXgKKworCW1vdnpiCS0xMjgoJXJicCwlcnNpKSwlZWJ4CisJc2hyCVwkMTYsJWVkeAorCW1vdnoJJWRsLCVlc2kJCSMgcmtbaV0+PjE2CisJeG9yCSVlYngsJWVheAorCisJbW92emIJLTEyOCglcmJwLCVyc2kpLCVlYngKKwltb3Z6CSVkaCwlZXNpCQkjIHJrW2ldPj4yNAorCXNobAlcJDgsJWVieAorCXhvcgklZWJ4LCVlYXgKKworCW1vdnpiCS0xMjgoJXJicCwlcnNpKSwlZWJ4CisJc2hsCVwkMTYsJWVieAorCXhvcgklZWJ4LCVlYXgKKworCXhvcgkxMDI0LTEyOCglcmJwLCVyY3gsNCksJWVheAkJIyByY29uCitfX18KK30KKworIyBpbnQgQUVTX3NldF9lbmNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywKKyMgICAgICAgICAgICAgICAgICAgICAgICBBRVNfS0VZICprZXkpCiskY29kZS49PDxfX187CisuZ2xvYmwJQUVTX3NldF9lbmNyeXB0X2tleQorLnR5cGUJQUVTX3NldF9lbmNyeXB0X2tleSxcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorQUVTX3NldF9lbmNyeXB0X2tleToKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIJCQkjIHJlZHVuZGFudCwgYnV0IGFsbG93cyB0byBzaGFyZSAKKwlwdXNoCSVyMTMJCQkjIGV4Y2VwdGlvbiBoYW5kbGVyLi4uCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJc3ViCVwkOCwlcnNwCisuTGVuY19rZXlfcHJvbG9ndWU6CisKKwljYWxsCV94ODZfNjRfQUVTX3NldF9lbmNyeXB0X2tleQorCisJbW92CTgoJXJzcCksJXIxNQorCW1vdgkxNiglcnNwKSwlcjE0CisJbW92CTI0KCVyc3ApLCVyMTMKKwltb3YJMzIoJXJzcCksJXIxMgorCW1vdgk0MCglcnNwKSwlcmJwCisJbW92CTQ4KCVyc3ApLCVyYngKKwlhZGQJXCQ1NiwlcnNwCisuTGVuY19rZXlfZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlBRVNfc2V0X2VuY3J5cHRfa2V5LC4tQUVTX3NldF9lbmNyeXB0X2tleQorCisudHlwZQlfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXksXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXk6CisJbW92CSVlc2ksJWVjeAkJCSMgJWVjeD1iaXRzCisJbW92CSVyZGksJXJzaQkJCSMgJXJzaT11c2VyS2V5CisJbW92CSVyZHgsJXJkaQkJCSMgJXJkaT1rZXkKKworCXRlc3QJXCQtMSwlcnNpCisJanoJLkxiYWRwb2ludGVyCisJdGVzdAlcJC0xLCVyZGkKKwlqegkuTGJhZHBvaW50ZXIKKworCWxlYQkuTEFFU19UZSglcmlwKSwlcmJwCisJbGVhCTIwNDgrMTI4KCVyYnApLCVyYnAKKworCSMgcHJlZmV0Y2ggVGU0CisJbW92CTAtMTI4KCVyYnApLCVlYXgKKwltb3YJMzItMTI4KCVyYnApLCVlYngKKwltb3YJNjQtMTI4KCVyYnApLCVyOGQKKwltb3YJOTYtMTI4KCVyYnApLCVlZHgKKwltb3YJMTI4LTEyOCglcmJwKSwlZWF4CisJbW92CTE2MC0xMjgoJXJicCksJWVieAorCW1vdgkxOTItMTI4KCVyYnApLCVyOGQKKwltb3YJMjI0LTEyOCglcmJwKSwlZWR4CisKKwljbXAJXCQxMjgsJWVjeAorCWplCS5MMTByb3VuZHMKKwljbXAJXCQxOTIsJWVjeAorCWplCS5MMTJyb3VuZHMKKwljbXAJXCQyNTYsJWVjeAorCWplCS5MMTRyb3VuZHMKKwltb3YJXCQtMiwlcmF4CQkJIyBpbnZhbGlkIG51bWJlciBvZiBiaXRzCisJam1wCS5MZXhpdAorCisuTDEwcm91bmRzOgorCW1vdgkwKCVyc2kpLCVyYXgJCQkjIGNvcHkgZmlyc3QgNCBkd29yZHMKKwltb3YJOCglcnNpKSwlcmR4CisJbW92CSVyYXgsMCglcmRpKQorCW1vdgklcmR4LDgoJXJkaSkKKworCXNocglcJDMyLCVyZHgKKwl4b3IJJWVjeCwlZWN4CisJam1wCS5MMTBzaG9ydGN1dAorLmFsaWduCTQKKy5MMTBsb29wOgorCQltb3YJMCglcmRpKSwlZWF4CQkJIyBya1swXQorCQltb3YJMTIoJXJkaSksJWVkeAkJCSMgcmtbM10KKy5MMTBzaG9ydGN1dDoKK19fXworCQkmZW5ja2V5CSgpOworJGNvZGUuPTw8X19fOworCQltb3YJJWVheCwxNiglcmRpKQkJCSMgcmtbNF0KKwkJeG9yCTQoJXJkaSksJWVheAorCQltb3YJJWVheCwyMCglcmRpKQkJCSMgcmtbNV0KKwkJeG9yCTgoJXJkaSksJWVheAorCQltb3YJJWVheCwyNCglcmRpKQkJCSMgcmtbNl0KKwkJeG9yCTEyKCVyZGkpLCVlYXgKKwkJbW92CSVlYXgsMjgoJXJkaSkJCQkjIHJrWzddCisJCWFkZAlcJDEsJWVjeAorCQlsZWEJMTYoJXJkaSksJXJkaQorCQljbXAJXCQxMCwlZWN4CisJamwJLkwxMGxvb3AKKworCW1vdmwJXCQxMCw4MCglcmRpKQkJCSMgc2V0dXAgbnVtYmVyIG9mIHJvdW5kcworCXhvcgklcmF4LCVyYXgKKwlqbXAJLkxleGl0CisKKy5MMTJyb3VuZHM6CisJbW92CTAoJXJzaSksJXJheAkJCSMgY29weSBmaXJzdCA2IGR3b3JkcworCW1vdgk4KCVyc2kpLCVyYngKKwltb3YJMTYoJXJzaSksJXJkeAorCW1vdgklcmF4LDAoJXJkaSkKKwltb3YJJXJieCw4KCVyZGkpCisJbW92CSVyZHgsMTYoJXJkaSkKKworCXNocglcJDMyLCVyZHgKKwl4b3IJJWVjeCwlZWN4CisJam1wCS5MMTJzaG9ydGN1dAorLmFsaWduCTQKKy5MMTJsb29wOgorCQltb3YJMCglcmRpKSwlZWF4CQkJIyBya1swXQorCQltb3YJMjAoJXJkaSksJWVkeAkJCSMgcmtbNV0KKy5MMTJzaG9ydGN1dDoKK19fXworCQkmZW5ja2V5CSgpOworJGNvZGUuPTw8X19fOworCQltb3YJJWVheCwyNCglcmRpKQkJCSMgcmtbNl0KKwkJeG9yCTQoJXJkaSksJWVheAorCQltb3YJJWVheCwyOCglcmRpKQkJCSMgcmtbN10KKwkJeG9yCTgoJXJkaSksJWVheAorCQltb3YJJWVheCwzMiglcmRpKQkJCSMgcmtbOF0KKwkJeG9yCTEyKCVyZGkpLCVlYXgKKwkJbW92CSVlYXgsMzYoJXJkaSkJCQkjIHJrWzldCisKKwkJY21wCVwkNywlZWN4CisJCWplCS5MMTJicmVhaworCQlhZGQJXCQxLCVlY3gKKworCQl4b3IJMTYoJXJkaSksJWVheAorCQltb3YJJWVheCw0MCglcmRpKQkJCSMgcmtbMTBdCisJCXhvcgkyMCglcmRpKSwlZWF4CisJCW1vdgklZWF4LDQ0KCVyZGkpCQkJIyBya1sxMV0KKworCQlsZWEJMjQoJXJkaSksJXJkaQorCWptcAkuTDEybG9vcAorLkwxMmJyZWFrOgorCW1vdmwJXCQxMiw3MiglcmRpKQkJIyBzZXR1cCBudW1iZXIgb2Ygcm91bmRzCisJeG9yCSVyYXgsJXJheAorCWptcAkuTGV4aXQKKworLkwxNHJvdW5kczoJCQorCW1vdgkwKCVyc2kpLCVyYXgJCQkjIGNvcHkgZmlyc3QgOCBkd29yZHMKKwltb3YJOCglcnNpKSwlcmJ4CisJbW92CTE2KCVyc2kpLCVyY3gKKwltb3YJMjQoJXJzaSksJXJkeAorCW1vdgklcmF4LDAoJXJkaSkKKwltb3YJJXJieCw4KCVyZGkpCisJbW92CSVyY3gsMTYoJXJkaSkKKwltb3YJJXJkeCwyNCglcmRpKQorCisJc2hyCVwkMzIsJXJkeAorCXhvcgklZWN4LCVlY3gKKwlqbXAJLkwxNHNob3J0Y3V0CisuYWxpZ24JNAorLkwxNGxvb3A6CisJCW1vdgkwKCVyZGkpLCVlYXgJCQkjIHJrWzBdCisJCW1vdgkyOCglcmRpKSwlZWR4CQkJIyBya1s0XQorLkwxNHNob3J0Y3V0OgorX19fCisJCSZlbmNrZXkJKCk7CiskY29kZS49PDxfX187CisJCW1vdgklZWF4LDMyKCVyZGkpCQkJIyBya1s4XQorCQl4b3IJNCglcmRpKSwlZWF4CisJCW1vdgklZWF4LDM2KCVyZGkpCQkJIyBya1s5XQorCQl4b3IJOCglcmRpKSwlZWF4CisJCW1vdgklZWF4LDQwKCVyZGkpCQkJIyBya1sxMF0KKwkJeG9yCTEyKCVyZGkpLCVlYXgKKwkJbW92CSVlYXgsNDQoJXJkaSkJCQkjIHJrWzExXQorCisJCWNtcAlcJDYsJWVjeAorCQlqZQkuTDE0YnJlYWsKKwkJYWRkCVwkMSwlZWN4CisKKwkJbW92CSVlYXgsJWVkeAorCQltb3YJMTYoJXJkaSksJWVheAkJCSMgcmtbNF0KKwkJbW92egklZGwsJWVzaQkJCSMgcmtbMTFdPj4wCisJCW1vdnpiCS0xMjgoJXJicCwlcnNpKSwlZWJ4CisJCW1vdnoJJWRoLCVlc2kJCQkjIHJrWzExXT4+OAorCQl4b3IJJWVieCwlZWF4CisKKwkJbW92emIJLTEyOCglcmJwLCVyc2kpLCVlYngKKwkJc2hyCVwkMTYsJWVkeAorCQlzaGwJXCQ4LCVlYngKKwkJbW92egklZGwsJWVzaQkJCSMgcmtbMTFdPj4xNgorCQl4b3IJJWVieCwlZWF4CisKKwkJbW92emIJLTEyOCglcmJwLCVyc2kpLCVlYngKKwkJbW92egklZGgsJWVzaQkJCSMgcmtbMTFdPj4yNAorCQlzaGwJXCQxNiwlZWJ4CisJCXhvcgklZWJ4LCVlYXgKKworCQltb3Z6YgktMTI4KCVyYnAsJXJzaSksJWVieAorCQlzaGwJXCQyNCwlZWJ4CisJCXhvcgklZWJ4LCVlYXgKKworCQltb3YJJWVheCw0OCglcmRpKQkJCSMgcmtbMTJdCisJCXhvcgkyMCglcmRpKSwlZWF4CisJCW1vdgklZWF4LDUyKCVyZGkpCQkJIyBya1sxM10KKwkJeG9yCTI0KCVyZGkpLCVlYXgKKwkJbW92CSVlYXgsNTYoJXJkaSkJCQkjIHJrWzE0XQorCQl4b3IJMjgoJXJkaSksJWVheAorCQltb3YJJWVheCw2MCglcmRpKQkJCSMgcmtbMTVdCisKKwkJbGVhCTMyKCVyZGkpLCVyZGkKKwlqbXAJLkwxNGxvb3AKKy5MMTRicmVhazoKKwltb3ZsCVwkMTQsNDgoJXJkaSkJCSMgc2V0dXAgbnVtYmVyIG9mIHJvdW5kcworCXhvcgklcmF4LCVyYXgKKwlqbXAJLkxleGl0CisKKy5MYmFkcG9pbnRlcjoKKwltb3YJXCQtMSwlcmF4CisuTGV4aXQ6CisJLmJ5dGUJMHhmMywweGMzCQkJIyByZXAgcmV0Cisuc2l6ZQlfeDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXksLi1feDg2XzY0X0FFU19zZXRfZW5jcnlwdF9rZXkKK19fXworCitzdWIgZGVja2V5X3JlZigpCit7IG15ICgkaSwkcHRyLCR0ZSwkdGQpID0gQF87CisgIG15ICgkdHAxLCR0cDIsJHRwNCwkdHA4LCRhY2MpPSgiJWVheCIsIiVlYngiLCIlZWRpIiwiJWVkeCIsIiVyOGQiKTsKKyRjb2RlLj08PF9fXzsKKwltb3YJJGkoJHB0ciksJHRwMQorCW1vdgkkdHAxLCRhY2MKKwlhbmQJXCQweDgwODA4MDgwLCRhY2MKKwltb3YJJGFjYywkdHA0CisJc2hyCVwkNywkdHA0CisJbGVhCTAoJHRwMSwkdHAxKSwkdHAyCisJc3ViCSR0cDQsJGFjYworCWFuZAlcJDB4ZmVmZWZlZmUsJHRwMgorCWFuZAlcJDB4MWIxYjFiMWIsJGFjYworCXhvcgkkdHAyLCRhY2MKKwltb3YJJGFjYywkdHAyCisKKwlhbmQJXCQweDgwODA4MDgwLCRhY2MKKwltb3YJJGFjYywkdHA4CisJc2hyCVwkNywkdHA4CisJbGVhCTAoJHRwMiwkdHAyKSwkdHA0CisJc3ViCSR0cDgsJGFjYworCWFuZAlcJDB4ZmVmZWZlZmUsJHRwNAorCWFuZAlcJDB4MWIxYjFiMWIsJGFjYworCSB4b3IJJHRwMSwkdHAyCQkjIHRwMl50cDEKKwl4b3IJJHRwNCwkYWNjCisJbW92CSRhY2MsJHRwNAorCisJYW5kCVwkMHg4MDgwODA4MCwkYWNjCisJbW92CSRhY2MsJHRwOAorCXNocglcJDcsJHRwOAorCXN1YgkkdHA4LCRhY2MKKwlsZWEJMCgkdHA0LCR0cDQpLCR0cDgKKwkgeG9yCSR0cDEsJHRwNAkJIyB0cDRedHAxCisJYW5kCVwkMHhmZWZlZmVmZSwkdHA4CisJYW5kCVwkMHgxYjFiMWIxYiwkYWNjCisJeG9yCSRhY2MsJHRwOAorCisJeG9yCSR0cDgsJHRwMQkJIyB0cDFedHA4CisJcm9sCVwkOCwkdHAxCQkjIFJPVEFURSh0cDFedHA4LDgpCisJeG9yCSR0cDgsJHRwMgkJIyB0cDJedHAxXnRwOAorCXhvcgkkdHA4LCR0cDQJCSMgdHA0XnRwMV50cDgKKwl4b3IJJHRwMiwkdHA4CisJeG9yCSR0cDQsJHRwOAkJIyB0cDheKHRwOF50cDRedHAxKV4odHA4XnRwMl50cDEpPXRwOF50cDRedHAyCisKKwl4b3IJJHRwOCwkdHAxCisJcm9sCVwkMjQsJHRwMgkJIyBST1RBVEUodHAyXnRwMV50cDgsMjQpCisJeG9yCSR0cDIsJHRwMQorCXJvbAlcJDE2LCR0cDQJCSMgUk9UQVRFKHRwNF50cDFedHA4LDE2KQorCXhvcgkkdHA0LCR0cDEKKworCW1vdgkkdHAxLCRpKCRwdHIpCitfX18KK30KKworIyBpbnQgQUVTX3NldF9kZWNyeXB0X2tleShjb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyS2V5LCBjb25zdCBpbnQgYml0cywKKyMgICAgICAgICAgICAgICAgICAgICAgICBBRVNfS0VZICprZXkpCiskY29kZS49PDxfX187CisuZ2xvYmwJQUVTX3NldF9kZWNyeXB0X2tleQorLnR5cGUJQUVTX3NldF9kZWNyeXB0X2tleSxcQGZ1bmN0aW9uLDMKKy5hbGlnbgkxNgorQUVTX3NldF9kZWNyeXB0X2tleToKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoCSVyZHgJCQkjIHNhdmUga2V5IHNjaGVkdWxlCisuTGRlY19rZXlfcHJvbG9ndWU6CisKKwljYWxsCV94ODZfNjRfQUVTX3NldF9lbmNyeXB0X2tleQorCW1vdgkoJXJzcCksJXI4CQkjIHJlc3RvcmUga2V5IHNjaGVkdWxlCisJY21wCVwkMCwlZWF4CisJam5lCS5MYWJvcnQKKworCW1vdgkyNDAoJXI4KSwlcjE0ZAkJIyBwdWxsIG51bWJlciBvZiByb3VuZHMKKwl4b3IJJXJkaSwlcmRpCisJbGVhCSglcmRpLCVyMTRkLDQpLCVyY3gKKwltb3YJJXI4LCVyc2kKKwlsZWEJKCVyOCwlcmN4LDQpLCVyZGkJIyBwb2ludGVyIHRvIGxhc3QgY2h1bmsKKy5hbGlnbgk0CisuTGludmVydDoKKwkJbW92CTAoJXJzaSksJXJheAorCQltb3YJOCglcnNpKSwlcmJ4CisJCW1vdgkwKCVyZGkpLCVyY3gKKwkJbW92CTgoJXJkaSksJXJkeAorCQltb3YJJXJheCwwKCVyZGkpCisJCW1vdgklcmJ4LDgoJXJkaSkKKwkJbW92CSVyY3gsMCglcnNpKQorCQltb3YJJXJkeCw4KCVyc2kpCisJCWxlYQkxNiglcnNpKSwlcnNpCisJCWxlYQktMTYoJXJkaSksJXJkaQorCQljbXAJJXJzaSwlcmRpCisJam5lCS5MaW52ZXJ0CisKKwlsZWEJLkxBRVNfVGUrMjA0OCsxMDI0KCVyaXApLCVyYXgJIyByY29uCisKKwltb3YJNDAoJXJheCksJG1hc2s4MAorCW1vdgk0OCglcmF4KSwkbWFza2ZlCisJbW92CTU2KCVyYXgpLCRtYXNrMWIKKworCW1vdgklcjgsJGtleQorCXN1YglcJDEsJXIxNGQKKy5hbGlnbgk0CisuTHBlcm11dGU6CisJCWxlYQkxNigka2V5KSwka2V5CisJCW1vdgkwKCRrZXkpLCVyYXgKKwkJbW92CTgoJGtleSksJXJjeAorX19fCisJCSZkZWN0cmFuc2Zvcm0gKCk7CiskY29kZS49PDxfX187CisJCW1vdgklZWF4LDAoJGtleSkKKwkJbW92CSVlYngsNCgka2V5KQorCQltb3YJJWVjeCw4KCRrZXkpCisJCW1vdgklZWR4LDEyKCRrZXkpCisJCXN1YglcJDEsJXIxNGQKKwlqbnoJLkxwZXJtdXRlCisKKwl4b3IJJXJheCwlcmF4CisuTGFib3J0OgorCW1vdgk4KCVyc3ApLCVyMTUKKwltb3YJMTYoJXJzcCksJXIxNAorCW1vdgkyNCglcnNwKSwlcjEzCisJbW92CTMyKCVyc3ApLCVyMTIKKwltb3YJNDAoJXJzcCksJXJicAorCW1vdgk0OCglcnNwKSwlcmJ4CisJYWRkCVwkNTYsJXJzcAorLkxkZWNfa2V5X2VwaWxvZ3VlOgorCXJldAorLnNpemUJQUVTX3NldF9kZWNyeXB0X2tleSwuLUFFU19zZXRfZGVjcnlwdF9rZXkKK19fXworCisjIHZvaWQgQUVTX2NiY19lbmNyeXB0IChjb25zdCB2b2lkIGNoYXIgKmlucCwgdW5zaWduZWQgY2hhciAqb3V0LAorIwkJCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKyMJCQl1bnNpZ25lZCBjaGFyICppdnAsY29uc3QgaW50IGVuYyk7Cit7CisjIHN0YWNrIGZyYW1lIGxheW91dAorIyAtOCglcnNwKQkJcmV0dXJuIGFkZHJlc3MKK215ICRrZXlwPSIwKCVyc3ApIjsJCSMgb25lIHRvIHBhc3MgYXMgJGtleQorbXkgJGtleWVuZD0iOCglcnNwKSI7CQkjICYoa2V5cC0+cmRfa2V5WzQqa2V5cC0+cm91bmRzXSkKK215ICRfcnNwPSIxNiglcnNwKSI7CQkjIHNhdmVkICVyc3AKK215ICRfaW5wPSIyNCglcnNwKSI7CQkjIGNvcHkgb2YgMXN0IHBhcmFtZXRlciwgaW5wCitteSAkX291dD0iMzIoJXJzcCkiOwkJIyBjb3B5IG9mIDJuZCBwYXJhbWV0ZXIsIG91dAorbXkgJF9sZW49IjQwKCVyc3ApIjsJCSMgY29weSBvZiAzcmQgcGFyYW1ldGVyLCBsZW5ndGgKK215ICRfa2V5PSI0OCglcnNwKSI7CQkjIGNvcHkgb2YgNHRoIHBhcmFtZXRlciwga2V5CitteSAkX2l2cD0iNTYoJXJzcCkiOwkJIyBjb3B5IG9mIDV0aCBwYXJhbWV0ZXIsIGl2cAorbXkgJGl2ZWM9IjY0KCVyc3ApIjsJCSMgaXZlY1sxNl0KK215ICRhZXNfa2V5PSI4MCglcnNwKSI7CQkjIGNvcHkgb2YgYWVzX2tleQorbXkgJG1hcms9IjgwKzI0MCglcnNwKSI7CSMgY29weSBvZiBhZXNfa2V5LT5yb3VuZHMKKworJGNvZGUuPTw8X19fOworLmdsb2JsCUFFU19jYmNfZW5jcnlwdAorLnR5cGUJQUVTX2NiY19lbmNyeXB0LFxAZnVuY3Rpb24sNgorLmFsaWduCTE2CisuZXh0ZXJuCU9QRU5TU0xfaWEzMmNhcF9QCitBRVNfY2JjX2VuY3J5cHQ6CisJY21wCVwkMCwlcmR4CSMgY2hlY2sgbGVuZ3RoCisJamUJLkxjYmNfZXBpbG9ndWUKKwlwdXNoZnEKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKy5MY2JjX3Byb2xvZ3VlOgorCisJY2xkCisJbW92CSVyOWQsJXI5ZAkjIGNsZWFyIHVwcGVyIGhhbGYgb2YgZW5jCisKKwlsZWEJLkxBRVNfVGUoJXJpcCksJHNib3gKKwljbXAJXCQwLCVyOQorCWpuZQkuTGNiY19waWNrZWRfdGUKKwlsZWEJLkxBRVNfVGQoJXJpcCksJHNib3gKKy5MY2JjX3BpY2tlZF90ZToKKworCW1vdglPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwlcjEwZAorCWNtcAlcJCRzcGVlZF9saW1pdCwlcmR4CisJamIJLkxjYmNfc2xvd19wcm9sb2d1ZQorCXRlc3QJXCQxNSwlcmR4CisJam56CS5MY2JjX3Nsb3dfcHJvbG9ndWUKKwlidAlcJDI4LCVyMTBkCisJamMJLkxjYmNfc2xvd19wcm9sb2d1ZQorCisJIyBhbGxvY2F0ZSBhbGlnbmVkIHN0YWNrIGZyYW1lLi4uCisJbGVhCS04OC0yNDgoJXJzcCksJGtleQorCWFuZAlcJC02NCwka2V5CisKKwkjIC4uLiBhbmQgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYWxpYXMgd2l0aCBBRVNfVFtlZF0gbW9kdWxvIDQwOTYKKwltb3YJJHNib3gsJXIxMAorCWxlYQkyMzA0KCRzYm94KSwlcjExCisJbW92CSRrZXksJXIxMgorCWFuZAlcJDB4RkZGLCVyMTAJIyBzID0gJHNib3gmMHhmZmYKKwlhbmQJXCQweEZGRiwlcjExCSMgZSA9ICgkc2JveCsyMDQ4KSYweGZmZgorCWFuZAlcJDB4RkZGLCVyMTIJIyBwID0gJXJzcCYweGZmZgorCisJY21wCSVyMTEsJXIxMgkjIGlmIChwPT5lKSAlcnNwID0tIChwLWUpOworCWpiCS5MY2JjX3RlX2JyZWFrX291dAorCXN1YgklcjExLCVyMTIKKwlzdWIJJXIxMiwka2V5CisJam1wCS5MY2JjX3RlX29rCisuTGNiY190ZV9icmVha19vdXQ6CQkjIGVsc2UgJXJzcCAtPSAocC1zKSYweGZmZiArIGZyYW1lc3oKKwlzdWIJJXIxMCwlcjEyCisJYW5kCVwkMHhGRkYsJXIxMgorCWFkZAlcJDMyMCwlcjEyCisJc3ViCSVyMTIsJGtleQorLmFsaWduCTQKKy5MY2JjX3RlX29rOgorCisJeGNoZwklcnNwLCRrZXkKKwkjYWRkCVwkOCwlcnNwCSMgcmVzZXJ2ZSBmb3IgcmV0dXJuIGFkZHJlc3MhCisJbW92CSRrZXksJF9yc3AJIyBzYXZlICVyc3AKKy5MY2JjX2Zhc3RfYm9keToKKwltb3YJJXJkaSwkX2lucAkjIHNhdmUgY29weSBvZiBpbnAKKwltb3YJJXJzaSwkX291dAkjIHNhdmUgY29weSBvZiBvdXQKKwltb3YJJXJkeCwkX2xlbgkjIHNhdmUgY29weSBvZiBsZW4KKwltb3YJJXJjeCwkX2tleQkjIHNhdmUgY29weSBvZiBrZXkKKwltb3YJJXI4LCRfaXZwCSMgc2F2ZSBjb3B5IG9mIGl2cAorCW1vdmwJXCQwLCRtYXJrCSMgY29weSBvZiBhZXNfa2V5LT5yb3VuZHMgPSAwOworCW1vdgklcjgsJXJicAkjIHJlYXJyYW5nZSBpbnB1dCBhcmd1bWVudHMKKwltb3YJJXI5LCVyYngKKwltb3YJJXJzaSwkb3V0CisJbW92CSVyZGksJGlucAorCW1vdgklcmN4LCRrZXkKKworCW1vdgkyNDAoJGtleSksJWVheAkJIyBrZXktPnJvdW5kcworCSMgZG8gd2UgY29weSBrZXkgc2NoZWR1bGUgdG8gc3RhY2s/CisJbW92CSRrZXksJXIxMAorCXN1Ygkkc2JveCwlcjEwCisJYW5kCVwkMHhmZmYsJXIxMAorCWNtcAlcJDIzMDQsJXIxMAorCWpiCS5MY2JjX2RvX2Vjb3B5CisJY21wCVwkNDA5Ni0yNDgsJXIxMAorCWpiCS5MY2JjX3NraXBfZWNvcHkKKy5hbGlnbgk0CisuTGNiY19kb19lY29weToKKwkJbW92CSRrZXksJXJzaQorCQlsZWEJJGFlc19rZXksJXJkaQorCQlsZWEJJGFlc19rZXksJGtleQorCQltb3YJXCQyNDAvOCwlZWN4CisJCS5sb25nCTB4OTBBNTQ4RjMJIyByZXAgbW92c3EKKwkJbW92CSVlYXgsKCVyZGkpCSMgY29weSBhZXNfa2V5LT5yb3VuZHMKKy5MY2JjX3NraXBfZWNvcHk6CisJbW92CSRrZXksJGtleXAJIyBzYXZlIGtleSBwb2ludGVyCisKKwltb3YJXCQxOCwlZWN4CisuYWxpZ24JNAorLkxjYmNfcHJlZmV0Y2hfdGU6CisJCW1vdgkwKCRzYm94KSwlcjEwCisJCW1vdgkzMigkc2JveCksJXIxMQorCQltb3YJNjQoJHNib3gpLCVyMTIKKwkJbW92CTk2KCRzYm94KSwlcjEzCisJCWxlYQkxMjgoJHNib3gpLCRzYm94CisJCXN1YglcJDEsJWVjeAorCWpuegkuTGNiY19wcmVmZXRjaF90ZQorCWxlYQktMjMwNCgkc2JveCksJHNib3gKKworCWNtcAlcJDAsJXJieAorCWplCS5MRkFTVF9ERUNSWVBUCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkNSWVBUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCW1vdgkwKCVyYnApLCRzMAkJIyBsb2FkIGl2CisJbW92CTQoJXJicCksJHMxCisJbW92CTgoJXJicCksJHMyCisJbW92CTEyKCVyYnApLCRzMworCisuYWxpZ24JNAorLkxjYmNfZmFzdF9lbmNfbG9vcDoKKwkJeG9yCTAoJGlucCksJHMwCisJCXhvcgk0KCRpbnApLCRzMQorCQl4b3IJOCgkaW5wKSwkczIKKwkJeG9yCTEyKCRpbnApLCRzMworCQltb3YJJGtleXAsJGtleQkjIHJlc3RvcmUga2V5CisJCW1vdgkkaW5wLCRfaW5wCSMgaWYgKCR2ZXJ0aWNhbHNwaW4pIHNhdmUgaW5wCisKKwkJY2FsbAlfeDg2XzY0X0FFU19lbmNyeXB0CisKKwkJbW92CSRfaW5wLCRpbnAJIyBpZiAoJHZlcnRpY2Fsc3BpbikgcmVzdG9yZSBpbnAKKwkJbW92CSRfbGVuLCVyMTAKKwkJbW92CSRzMCwwKCRvdXQpCisJCW1vdgkkczEsNCgkb3V0KQorCQltb3YJJHMyLDgoJG91dCkKKwkJbW92CSRzMywxMigkb3V0KQorCisJCWxlYQkxNigkaW5wKSwkaW5wCisJCWxlYQkxNigkb3V0KSwkb3V0CisJCXN1YglcJDE2LCVyMTAKKwkJdGVzdAlcJC0xNiwlcjEwCisJCW1vdgklcjEwLCRfbGVuCisJam56CS5MY2JjX2Zhc3RfZW5jX2xvb3AKKwltb3YJJF9pdnAsJXJicAkjIHJlc3RvcmUgaXZwCisJbW92CSRzMCwwKCVyYnApCSMgc2F2ZSBpdmVjCisJbW92CSRzMSw0KCVyYnApCisJbW92CSRzMiw4KCVyYnApCisJbW92CSRzMywxMiglcmJwKQorCisJam1wCS5MY2JjX2Zhc3RfY2xlYW51cAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gREVDUllQVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKy5hbGlnbgkxNgorLkxGQVNUX0RFQ1JZUFQ6CisJY21wCSRpbnAsJG91dAorCWplCS5MY2JjX2Zhc3RfZGVjX2luX3BsYWNlCisKKwltb3YJJXJicCwkaXZlYworLmFsaWduCTQKKy5MY2JjX2Zhc3RfZGVjX2xvb3A6CisJCW1vdgkwKCRpbnApLCRzMAkjIHJlYWQgaW5wdXQKKwkJbW92CTQoJGlucCksJHMxCisJCW1vdgk4KCRpbnApLCRzMgorCQltb3YJMTIoJGlucCksJHMzCisJCW1vdgkka2V5cCwka2V5CSMgcmVzdG9yZSBrZXkKKwkJbW92CSRpbnAsJF9pbnAJIyBpZiAoJHZlcnRpY2Fsc3Bpbikgc2F2ZSBpbnAKKworCQljYWxsCV94ODZfNjRfQUVTX2RlY3J5cHQKKworCQltb3YJJGl2ZWMsJXJicAkjIGxvYWQgaXZwCisJCW1vdgkkX2lucCwkaW5wCSMgaWYgKCR2ZXJ0aWNhbHNwaW4pIHJlc3RvcmUgaW5wCisJCW1vdgkkX2xlbiwlcjEwCSMgbG9hZCBsZW4KKwkJeG9yCTAoJXJicCksJHMwCSMgeG9yIGl2CisJCXhvcgk0KCVyYnApLCRzMQorCQl4b3IJOCglcmJwKSwkczIKKwkJeG9yCTEyKCVyYnApLCRzMworCQltb3YJJGlucCwlcmJwCSMgY3VycmVudCBpbnB1dCwgbmV4dCBpdgorCisJCXN1YglcJDE2LCVyMTAKKwkJbW92CSVyMTAsJF9sZW4JIyB1cGRhdGUgbGVuCisJCW1vdgklcmJwLCRpdmVjCSMgdXBkYXRlIGl2cAorCisJCW1vdgkkczAsMCgkb3V0KQkjIHdyaXRlIG91dHB1dAorCQltb3YJJHMxLDQoJG91dCkKKwkJbW92CSRzMiw4KCRvdXQpCisJCW1vdgkkczMsMTIoJG91dCkKKworCQlsZWEJMTYoJGlucCksJGlucAorCQlsZWEJMTYoJG91dCksJG91dAorCWpuegkuTGNiY19mYXN0X2RlY19sb29wCisJbW92CSRfaXZwLCVyMTIJCSMgbG9hZCB1c2VyIGl2cAorCW1vdgkwKCVyYnApLCVyMTAJCSMgbG9hZCBpdgorCW1vdgk4KCVyYnApLCVyMTEKKwltb3YJJXIxMCwwKCVyMTIpCQkjIGNvcHkgYmFjayB0byB1c2VyCisJbW92CSVyMTEsOCglcjEyKQorCWptcAkuTGNiY19mYXN0X2NsZWFudXAKKworLmFsaWduCTE2CisuTGNiY19mYXN0X2RlY19pbl9wbGFjZToKKwltb3YJMCglcmJwKSwlcjEwCQkjIGNvcHkgaXYgdG8gc3RhY2sKKwltb3YJOCglcmJwKSwlcjExCisJbW92CSVyMTAsMCskaXZlYworCW1vdgklcjExLDgrJGl2ZWMKKy5hbGlnbgk0CisuTGNiY19mYXN0X2RlY19pbl9wbGFjZV9sb29wOgorCQltb3YJMCgkaW5wKSwkczAJIyBsb2FkIGlucHV0CisJCW1vdgk0KCRpbnApLCRzMQorCQltb3YJOCgkaW5wKSwkczIKKwkJbW92CTEyKCRpbnApLCRzMworCQltb3YJJGtleXAsJGtleQkjIHJlc3RvcmUga2V5CisJCW1vdgkkaW5wLCRfaW5wCSMgaWYgKCR2ZXJ0aWNhbHNwaW4pIHNhdmUgaW5wCisKKwkJY2FsbAlfeDg2XzY0X0FFU19kZWNyeXB0CisKKwkJbW92CSRfaW5wLCRpbnAJIyBpZiAoJHZlcnRpY2Fsc3BpbikgcmVzdG9yZSBpbnAKKwkJbW92CSRfbGVuLCVyMTAKKwkJeG9yCTArJGl2ZWMsJHMwCisJCXhvcgk0KyRpdmVjLCRzMQorCQl4b3IJOCskaXZlYywkczIKKwkJeG9yCTEyKyRpdmVjLCRzMworCisJCW1vdgkwKCRpbnApLCVyMTEJIyBsb2FkIGlucHV0CisJCW1vdgk4KCRpbnApLCVyMTIKKwkJc3ViCVwkMTYsJXIxMAorCQlqegkuTGNiY19mYXN0X2RlY19pbl9wbGFjZV9kb25lCisKKwkJbW92CSVyMTEsMCskaXZlYwkjIGNvcHkgaW5wdXQgdG8gaXYKKwkJbW92CSVyMTIsOCskaXZlYworCisJCW1vdgkkczAsMCgkb3V0KQkjIHNhdmUgb3V0cHV0IFt6YXBzIGlucHV0XQorCQltb3YJJHMxLDQoJG91dCkKKwkJbW92CSRzMiw4KCRvdXQpCisJCW1vdgkkczMsMTIoJG91dCkKKworCQlsZWEJMTYoJGlucCksJGlucAorCQlsZWEJMTYoJG91dCksJG91dAorCQltb3YJJXIxMCwkX2xlbgorCWptcAkuTGNiY19mYXN0X2RlY19pbl9wbGFjZV9sb29wCisuTGNiY19mYXN0X2RlY19pbl9wbGFjZV9kb25lOgorCW1vdgkkX2l2cCwlcmRpCisJbW92CSVyMTEsMCglcmRpKQkjIGNvcHkgaXYgYmFjayB0byB1c2VyCisJbW92CSVyMTIsOCglcmRpKQorCisJbW92CSRzMCwwKCRvdXQpCSMgc2F2ZSBvdXRwdXQgW3phcHMgaW5wdXRdCisJbW92CSRzMSw0KCRvdXQpCisJbW92CSRzMiw4KCRvdXQpCisJbW92CSRzMywxMigkb3V0KQorCisuYWxpZ24JNAorLkxjYmNfZmFzdF9jbGVhbnVwOgorCWNtcGwJXCQwLCRtYXJrCSMgd2FzIHRoZSBrZXkgc2NoZWR1bGUgY29waWVkPworCWxlYQkkYWVzX2tleSwlcmRpCisJamUJLkxjYmNfZXhpdAorCQltb3YJXCQyNDAvOCwlZWN4CisJCXhvcgklcmF4LCVyYXgKKwkJLmxvbmcJMHg5MEFCNDhGMwkjIHJlcCBzdG9zcQorCisJam1wCS5MY2JjX2V4aXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTTE9XIFJPVVRJTkUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworLmFsaWduCTE2CisuTGNiY19zbG93X3Byb2xvZ3VlOgorCSMgYWxsb2NhdGUgYWxpZ25lZCBzdGFjayBmcmFtZS4uLgorCWxlYQktODgoJXJzcCksJXJicAorCWFuZAlcJC02NCwlcmJwCisJIyAuLi4ganVzdCAiYWJvdmUiIGtleSBzY2hlZHVsZQorCWxlYQktODgtNjMoJXJjeCksJXIxMAorCXN1YgklcmJwLCVyMTAKKwluZWcJJXIxMAorCWFuZAlcJDB4M2MwLCVyMTAKKwlzdWIJJXIxMCwlcmJwCisKKwl4Y2hnCSVyc3AsJXJicAorCSNhZGQJXCQ4LCVyc3AJIyByZXNlcnZlIGZvciByZXR1cm4gYWRkcmVzcyEKKwltb3YJJXJicCwkX3JzcAkjIHNhdmUgJXJzcAorLkxjYmNfc2xvd19ib2R5OgorCSNtb3YJJXJkaSwkX2lucAkjIHNhdmUgY29weSBvZiBpbnAKKwkjbW92CSVyc2ksJF9vdXQJIyBzYXZlIGNvcHkgb2Ygb3V0CisJI21vdgklcmR4LCRfbGVuCSMgc2F2ZSBjb3B5IG9mIGxlbgorCSNtb3YJJXJjeCwkX2tleQkjIHNhdmUgY29weSBvZiBrZXkKKwltb3YJJXI4LCRfaXZwCSMgc2F2ZSBjb3B5IG9mIGl2cAorCW1vdgklcjgsJXJicAkjIHJlYXJyYW5nZSBpbnB1dCBhcmd1bWVudHMKKwltb3YJJXI5LCVyYngKKwltb3YJJXJzaSwkb3V0CisJbW92CSVyZGksJGlucAorCW1vdgklcmN4LCRrZXkKKwltb3YJJXJkeCwlcjEwCisKKwltb3YJMjQwKCRrZXkpLCVlYXgKKwltb3YJJGtleSwka2V5cAkjIHNhdmUga2V5IHBvaW50ZXIKKwlzaGwJXCQ0LCVlYXgKKwlsZWEJKCRrZXksJXJheCksJXJheAorCW1vdgklcmF4LCRrZXllbmQKKworCSMgcGljayBUZTQgY29weSB3aGljaCBjYW4ndCAib3ZlcmxhcCIgd2l0aCBzdGFjayBmcmFtZSBvciBrZXkgc2NkZWR1bGUKKwlsZWEJMjA0OCgkc2JveCksJHNib3gKKwlsZWEJNzY4LTgoJXJzcCksJXJheAorCXN1Ygkkc2JveCwlcmF4CisJYW5kCVwkMHgzMDAsJXJheAorCWxlYQkoJHNib3gsJXJheCksJHNib3gKKworCWNtcAlcJDAsJXJieAorCWplCS5MU0xPV19ERUNSWVBUCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU0xPVyBFTkNSWVBUIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKwl0ZXN0CVwkLTE2LCVyMTAJCSMgY2hlY2sgdXBvbiBsZW5ndGgKKwltb3YJMCglcmJwKSwkczAJCSMgbG9hZCBpdgorCW1vdgk0KCVyYnApLCRzMQorCW1vdgk4KCVyYnApLCRzMgorCW1vdgkxMiglcmJwKSwkczMKKwlqegkuTGNiY19zbG93X2VuY190YWlsCSMgc2hvcnQgaW5wdXQuLi4KKworLmFsaWduCTQKKy5MY2JjX3Nsb3dfZW5jX2xvb3A6CisJCXhvcgkwKCRpbnApLCRzMAorCQl4b3IJNCgkaW5wKSwkczEKKwkJeG9yCTgoJGlucCksJHMyCisJCXhvcgkxMigkaW5wKSwkczMKKwkJbW92CSRrZXlwLCRrZXkJIyByZXN0b3JlIGtleQorCQltb3YJJGlucCwkX2lucAkjIHNhdmUgaW5wCisJCW1vdgkkb3V0LCRfb3V0CSMgc2F2ZSBvdXQKKwkJbW92CSVyMTAsJF9sZW4JIyBzYXZlIGxlbgorCisJCWNhbGwJX3g4Nl82NF9BRVNfZW5jcnlwdF9jb21wYWN0CisKKwkJbW92CSRfaW5wLCRpbnAJIyByZXN0b3JlIGlucAorCQltb3YJJF9vdXQsJG91dAkjIHJlc3RvcmUgb3V0CisJCW1vdgkkX2xlbiwlcjEwCSMgcmVzdG9yZSBsZW4KKwkJbW92CSRzMCwwKCRvdXQpCisJCW1vdgkkczEsNCgkb3V0KQorCQltb3YJJHMyLDgoJG91dCkKKwkJbW92CSRzMywxMigkb3V0KQorCisJCWxlYQkxNigkaW5wKSwkaW5wCisJCWxlYQkxNigkb3V0KSwkb3V0CisJCXN1YglcJDE2LCVyMTAKKwkJdGVzdAlcJC0xNiwlcjEwCisJam56CS5MY2JjX3Nsb3dfZW5jX2xvb3AKKwl0ZXN0CVwkMTUsJXIxMAorCWpuegkuTGNiY19zbG93X2VuY190YWlsCisJbW92CSRfaXZwLCVyYnAJIyByZXN0b3JlIGl2cAorCW1vdgkkczAsMCglcmJwKQkjIHNhdmUgaXZlYworCW1vdgkkczEsNCglcmJwKQorCW1vdgkkczIsOCglcmJwKQorCW1vdgkkczMsMTIoJXJicCkKKworCWptcAkuTGNiY19leGl0CisKKy5hbGlnbgk0CisuTGNiY19zbG93X2VuY190YWlsOgorCW1vdgklcmF4LCVyMTEKKwltb3YJJXJjeCwlcjEyCisJbW92CSVyMTAsJXJjeAorCW1vdgkkaW5wLCVyc2kKKwltb3YJJG91dCwlcmRpCisJLmxvbmcJMHg5MDY2QTRGMwkJIyByZXAgbW92c2IKKwltb3YJXCQxNiwlcmN4CQkjIHplcm8gdGFpbAorCXN1YgklcjEwLCVyY3gKKwl4b3IJJXJheCwlcmF4CisJLmxvbmcJMHg5MDY2QUFGMwkJIyByZXAgc3Rvc2IKKwltb3YJJG91dCwkaW5wCQkjIHRoaXMgaXMgbm90IGEgbWlzdGFrZSEKKwltb3YJXCQxNiwlcjEwCQkjIGxlbj0xNgorCW1vdgklcjExLCVyYXgKKwltb3YJJXIxMiwlcmN4CisJam1wCS5MY2JjX3Nsb3dfZW5jX2xvb3AJIyBvbmUgbW9yZSBzcGluLi4uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNMT1cgREVDUllQVCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisuYWxpZ24JMTYKKy5MU0xPV19ERUNSWVBUOgorCXNocglcJDMsJXJheAorCWFkZAklcmF4LCRzYm94CQkjIHJlY2FsbCAibWFnaWMiIGNvbnN0YW50cyEKKworCW1vdgkwKCVyYnApLCVyMTEJCSMgY29weSBpdiB0byBzdGFjaworCW1vdgk4KCVyYnApLCVyMTIKKwltb3YJJXIxMSwwKyRpdmVjCisJbW92CSVyMTIsOCskaXZlYworCisuYWxpZ24JNAorLkxjYmNfc2xvd19kZWNfbG9vcDoKKwkJbW92CTAoJGlucCksJHMwCSMgbG9hZCBpbnB1dAorCQltb3YJNCgkaW5wKSwkczEKKwkJbW92CTgoJGlucCksJHMyCisJCW1vdgkxMigkaW5wKSwkczMKKwkJbW92CSRrZXlwLCRrZXkJIyByZXN0b3JlIGtleQorCQltb3YJJGlucCwkX2lucAkjIHNhdmUgaW5wCisJCW1vdgkkb3V0LCRfb3V0CSMgc2F2ZSBvdXQKKwkJbW92CSVyMTAsJF9sZW4JIyBzYXZlIGxlbgorCisJCWNhbGwJX3g4Nl82NF9BRVNfZGVjcnlwdF9jb21wYWN0CisKKwkJbW92CSRfaW5wLCRpbnAJIyByZXN0b3JlIGlucAorCQltb3YJJF9vdXQsJG91dAkjIHJlc3RvcmUgb3V0CisJCW1vdgkkX2xlbiwlcjEwCisJCXhvcgkwKyRpdmVjLCRzMAorCQl4b3IJNCskaXZlYywkczEKKwkJeG9yCTgrJGl2ZWMsJHMyCisJCXhvcgkxMiskaXZlYywkczMKKworCQltb3YJMCgkaW5wKSwlcjExCSMgbG9hZCBpbnB1dAorCQltb3YJOCgkaW5wKSwlcjEyCisJCXN1YglcJDE2LCVyMTAKKwkJamMJLkxjYmNfc2xvd19kZWNfcGFydGlhbAorCQlqegkuTGNiY19zbG93X2RlY19kb25lCisKKwkJbW92CSVyMTEsMCskaXZlYwkjIGNvcHkgaW5wdXQgdG8gaXYKKwkJbW92CSVyMTIsOCskaXZlYworCisJCW1vdgkkczAsMCgkb3V0KQkjIHNhdmUgb3V0cHV0IFtjYW4gemFwIGlucHV0XQorCQltb3YJJHMxLDQoJG91dCkKKwkJbW92CSRzMiw4KCRvdXQpCisJCW1vdgkkczMsMTIoJG91dCkKKworCQlsZWEJMTYoJGlucCksJGlucAorCQlsZWEJMTYoJG91dCksJG91dAorCWptcAkuTGNiY19zbG93X2RlY19sb29wCisuTGNiY19zbG93X2RlY19kb25lOgorCW1vdgkkX2l2cCwlcmRpCisJbW92CSVyMTEsMCglcmRpKQkJIyBjb3B5IGl2IGJhY2sgdG8gdXNlcgorCW1vdgklcjEyLDgoJXJkaSkKKworCW1vdgkkczAsMCgkb3V0KQkJIyBzYXZlIG91dHB1dCBbY2FuIHphcCBpbnB1dF0KKwltb3YJJHMxLDQoJG91dCkKKwltb3YJJHMyLDgoJG91dCkKKwltb3YJJHMzLDEyKCRvdXQpCisKKwlqbXAJLkxjYmNfZXhpdAorCisuYWxpZ24JNAorLkxjYmNfc2xvd19kZWNfcGFydGlhbDoKKwltb3YJJF9pdnAsJXJkaQorCW1vdgklcjExLDAoJXJkaSkJCSMgY29weSBpdiBiYWNrIHRvIHVzZXIKKwltb3YJJXIxMiw4KCVyZGkpCisKKwltb3YJJHMwLDArJGl2ZWMJCSMgc2F2ZSBvdXRwdXQgdG8gc3RhY2sKKwltb3YJJHMxLDQrJGl2ZWMKKwltb3YJJHMyLDgrJGl2ZWMKKwltb3YJJHMzLDEyKyRpdmVjCisKKwltb3YJJG91dCwlcmRpCisJbGVhCSRpdmVjLCVyc2kKKwlsZWEJMTYoJXIxMCksJXJjeAorCS5sb25nCTB4OTA2NkE0RjMJIyByZXAgbW92c2IKKwlqbXAJLkxjYmNfZXhpdAorCisuYWxpZ24JMTYKKy5MY2JjX2V4aXQ6CisJbW92CSRfcnNwLCVyc2kKKwltb3YJKCVyc2kpLCVyMTUKKwltb3YJOCglcnNpKSwlcjE0CisJbW92CTE2KCVyc2kpLCVyMTMKKwltb3YJMjQoJXJzaSksJXIxMgorCW1vdgkzMiglcnNpKSwlcmJwCisJbW92CTQwKCVyc2kpLCVyYngKKwlsZWEJNDgoJXJzaSksJXJzcAorLkxjYmNfcG9wZnE6CisJcG9wZnEKKy5MY2JjX2VwaWxvZ3VlOgorCXJldAorLnNpemUJQUVTX2NiY19lbmNyeXB0LC4tQUVTX2NiY19lbmNyeXB0CitfX18KK30KKworJGNvZGUuPTw8X19fOworLmFsaWduCTY0CisuTEFFU19UZToKK19fXworCSZfZGF0YV93b3JkKDB4YTU2MzYzYzYsIDB4ODQ3YzdjZjgsIDB4OTk3Nzc3ZWUsIDB4OGQ3YjdiZjYpOworCSZfZGF0YV93b3JkKDB4MGRmMmYyZmYsIDB4YmQ2YjZiZDYsIDB4YjE2ZjZmZGUsIDB4NTRjNWM1OTEpOworCSZfZGF0YV93b3JkKDB4NTAzMDMwNjAsIDB4MDMwMTAxMDIsIDB4YTk2NzY3Y2UsIDB4N2QyYjJiNTYpOworCSZfZGF0YV93b3JkKDB4MTlmZWZlZTcsIDB4NjJkN2Q3YjUsIDB4ZTZhYmFiNGQsIDB4OWE3Njc2ZWMpOworCSZfZGF0YV93b3JkKDB4NDVjYWNhOGYsIDB4OWQ4MjgyMWYsIDB4NDBjOWM5ODksIDB4ODc3ZDdkZmEpOworCSZfZGF0YV93b3JkKDB4MTVmYWZhZWYsIDB4ZWI1OTU5YjIsIDB4Yzk0NzQ3OGUsIDB4MGJmMGYwZmIpOworCSZfZGF0YV93b3JkKDB4ZWNhZGFkNDEsIDB4NjdkNGQ0YjMsIDB4ZmRhMmEyNWYsIDB4ZWFhZmFmNDUpOworCSZfZGF0YV93b3JkKDB4YmY5YzljMjMsIDB4ZjdhNGE0NTMsIDB4OTY3MjcyZTQsIDB4NWJjMGMwOWIpOworCSZfZGF0YV93b3JkKDB4YzJiN2I3NzUsIDB4MWNmZGZkZTEsIDB4YWU5MzkzM2QsIDB4NmEyNjI2NGMpOworCSZfZGF0YV93b3JkKDB4NWEzNjM2NmMsIDB4NDEzZjNmN2UsIDB4MDJmN2Y3ZjUsIDB4NGZjY2NjODMpOworCSZfZGF0YV93b3JkKDB4NWMzNDM0NjgsIDB4ZjRhNWE1NTEsIDB4MzRlNWU1ZDEsIDB4MDhmMWYxZjkpOworCSZfZGF0YV93b3JkKDB4OTM3MTcxZTIsIDB4NzNkOGQ4YWIsIDB4NTMzMTMxNjIsIDB4M2YxNTE1MmEpOworCSZfZGF0YV93b3JkKDB4MGMwNDA0MDgsIDB4NTJjN2M3OTUsIDB4NjUyMzIzNDYsIDB4NWVjM2MzOWQpOworCSZfZGF0YV93b3JkKDB4MjgxODE4MzAsIDB4YTE5Njk2MzcsIDB4MGYwNTA1MGEsIDB4YjU5YTlhMmYpOworCSZfZGF0YV93b3JkKDB4MDkwNzA3MGUsIDB4MzYxMjEyMjQsIDB4OWI4MDgwMWIsIDB4M2RlMmUyZGYpOworCSZfZGF0YV93b3JkKDB4MjZlYmViY2QsIDB4NjkyNzI3NGUsIDB4Y2RiMmIyN2YsIDB4OWY3NTc1ZWEpOworCSZfZGF0YV93b3JkKDB4MWIwOTA5MTIsIDB4OWU4MzgzMWQsIDB4NzQyYzJjNTgsIDB4MmUxYTFhMzQpOworCSZfZGF0YV93b3JkKDB4MmQxYjFiMzYsIDB4YjI2ZTZlZGMsIDB4ZWU1YTVhYjQsIDB4ZmJhMGEwNWIpOworCSZfZGF0YV93b3JkKDB4ZjY1MjUyYTQsIDB4NGQzYjNiNzYsIDB4NjFkNmQ2YjcsIDB4Y2ViM2IzN2QpOworCSZfZGF0YV93b3JkKDB4N2IyOTI5NTIsIDB4M2VlM2UzZGQsIDB4NzEyZjJmNWUsIDB4OTc4NDg0MTMpOworCSZfZGF0YV93b3JkKDB4ZjU1MzUzYTYsIDB4NjhkMWQxYjksIDB4MDAwMDAwMDAsIDB4MmNlZGVkYzEpOworCSZfZGF0YV93b3JkKDB4NjAyMDIwNDAsIDB4MWZmY2ZjZTMsIDB4YzhiMWIxNzksIDB4ZWQ1YjViYjYpOworCSZfZGF0YV93b3JkKDB4YmU2YTZhZDQsIDB4NDZjYmNiOGQsIDB4ZDliZWJlNjcsIDB4NGIzOTM5NzIpOworCSZfZGF0YV93b3JkKDB4ZGU0YTRhOTQsIDB4ZDQ0YzRjOTgsIDB4ZTg1ODU4YjAsIDB4NGFjZmNmODUpOworCSZfZGF0YV93b3JkKDB4NmJkMGQwYmIsIDB4MmFlZmVmYzUsIDB4ZTVhYWFhNGYsIDB4MTZmYmZiZWQpOworCSZfZGF0YV93b3JkKDB4YzU0MzQzODYsIDB4ZDc0ZDRkOWEsIDB4NTUzMzMzNjYsIDB4OTQ4NTg1MTEpOworCSZfZGF0YV93b3JkKDB4Y2Y0NTQ1OGEsIDB4MTBmOWY5ZTksIDB4MDYwMjAyMDQsIDB4ODE3ZjdmZmUpOworCSZfZGF0YV93b3JkKDB4ZjA1MDUwYTAsIDB4NDQzYzNjNzgsIDB4YmE5ZjlmMjUsIDB4ZTNhOGE4NGIpOworCSZfZGF0YV93b3JkKDB4ZjM1MTUxYTIsIDB4ZmVhM2EzNWQsIDB4YzA0MDQwODAsIDB4OGE4ZjhmMDUpOworCSZfZGF0YV93b3JkKDB4YWQ5MjkyM2YsIDB4YmM5ZDlkMjEsIDB4NDgzODM4NzAsIDB4MDRmNWY1ZjEpOworCSZfZGF0YV93b3JkKDB4ZGZiY2JjNjMsIDB4YzFiNmI2NzcsIDB4NzVkYWRhYWYsIDB4NjMyMTIxNDIpOworCSZfZGF0YV93b3JkKDB4MzAxMDEwMjAsIDB4MWFmZmZmZTUsIDB4MGVmM2YzZmQsIDB4NmRkMmQyYmYpOworCSZfZGF0YV93b3JkKDB4NGNjZGNkODEsIDB4MTQwYzBjMTgsIDB4MzUxMzEzMjYsIDB4MmZlY2VjYzMpOworCSZfZGF0YV93b3JkKDB4ZTE1ZjVmYmUsIDB4YTI5Nzk3MzUsIDB4Y2M0NDQ0ODgsIDB4MzkxNzE3MmUpOworCSZfZGF0YV93b3JkKDB4NTdjNGM0OTMsIDB4ZjJhN2E3NTUsIDB4ODI3ZTdlZmMsIDB4NDczZDNkN2EpOworCSZfZGF0YV93b3JkKDB4YWM2NDY0YzgsIDB4ZTc1ZDVkYmEsIDB4MmIxOTE5MzIsIDB4OTU3MzczZTYpOworCSZfZGF0YV93b3JkKDB4YTA2MDYwYzAsIDB4OTg4MTgxMTksIDB4ZDE0ZjRmOWUsIDB4N2ZkY2RjYTMpOworCSZfZGF0YV93b3JkKDB4NjYyMjIyNDQsIDB4N2UyYTJhNTQsIDB4YWI5MDkwM2IsIDB4ODM4ODg4MGIpOworCSZfZGF0YV93b3JkKDB4Y2E0NjQ2OGMsIDB4MjllZWVlYzcsIDB4ZDNiOGI4NmIsIDB4M2MxNDE0MjgpOworCSZfZGF0YV93b3JkKDB4NzlkZWRlYTcsIDB4ZTI1ZTVlYmMsIDB4MWQwYjBiMTYsIDB4NzZkYmRiYWQpOworCSZfZGF0YV93b3JkKDB4M2JlMGUwZGIsIDB4NTYzMjMyNjQsIDB4NGUzYTNhNzQsIDB4MWUwYTBhMTQpOworCSZfZGF0YV93b3JkKDB4ZGI0OTQ5OTIsIDB4MGEwNjA2MGMsIDB4NmMyNDI0NDgsIDB4ZTQ1YzVjYjgpOworCSZfZGF0YV93b3JkKDB4NWRjMmMyOWYsIDB4NmVkM2QzYmQsIDB4ZWZhY2FjNDMsIDB4YTY2MjYyYzQpOworCSZfZGF0YV93b3JkKDB4YTg5MTkxMzksIDB4YTQ5NTk1MzEsIDB4MzdlNGU0ZDMsIDB4OGI3OTc5ZjIpOworCSZfZGF0YV93b3JkKDB4MzJlN2U3ZDUsIDB4NDNjOGM4OGIsIDB4NTkzNzM3NmUsIDB4Yjc2ZDZkZGEpOworCSZfZGF0YV93b3JkKDB4OGM4ZDhkMDEsIDB4NjRkNWQ1YjEsIDB4ZDI0ZTRlOWMsIDB4ZTBhOWE5NDkpOworCSZfZGF0YV93b3JkKDB4YjQ2YzZjZDgsIDB4ZmE1NjU2YWMsIDB4MDdmNGY0ZjMsIDB4MjVlYWVhY2YpOworCSZfZGF0YV93b3JkKDB4YWY2NTY1Y2EsIDB4OGU3YTdhZjQsIDB4ZTlhZWFlNDcsIDB4MTgwODA4MTApOworCSZfZGF0YV93b3JkKDB4ZDViYWJhNmYsIDB4ODg3ODc4ZjAsIDB4NmYyNTI1NGEsIDB4NzIyZTJlNWMpOworCSZfZGF0YV93b3JkKDB4MjQxYzFjMzgsIDB4ZjFhNmE2NTcsIDB4YzdiNGI0NzMsIDB4NTFjNmM2OTcpOworCSZfZGF0YV93b3JkKDB4MjNlOGU4Y2IsIDB4N2NkZGRkYTEsIDB4OWM3NDc0ZTgsIDB4MjExZjFmM2UpOworCSZfZGF0YV93b3JkKDB4ZGQ0YjRiOTYsIDB4ZGNiZGJkNjEsIDB4ODY4YjhiMGQsIDB4ODU4YThhMGYpOworCSZfZGF0YV93b3JkKDB4OTA3MDcwZTAsIDB4NDIzZTNlN2MsIDB4YzRiNWI1NzEsIDB4YWE2NjY2Y2MpOworCSZfZGF0YV93b3JkKDB4ZDg0ODQ4OTAsIDB4MDUwMzAzMDYsIDB4MDFmNmY2ZjcsIDB4MTIwZTBlMWMpOworCSZfZGF0YV93b3JkKDB4YTM2MTYxYzIsIDB4NWYzNTM1NmEsIDB4Zjk1NzU3YWUsIDB4ZDBiOWI5NjkpOworCSZfZGF0YV93b3JkKDB4OTE4Njg2MTcsIDB4NThjMWMxOTksIDB4MjcxZDFkM2EsIDB4Yjk5ZTllMjcpOworCSZfZGF0YV93b3JkKDB4MzhlMWUxZDksIDB4MTNmOGY4ZWIsIDB4YjM5ODk4MmIsIDB4MzMxMTExMjIpOworCSZfZGF0YV93b3JkKDB4YmI2OTY5ZDIsIDB4NzBkOWQ5YTksIDB4ODk4ZThlMDcsIDB4YTc5NDk0MzMpOworCSZfZGF0YV93b3JkKDB4YjY5YjliMmQsIDB4MjIxZTFlM2MsIDB4OTI4Nzg3MTUsIDB4MjBlOWU5YzkpOworCSZfZGF0YV93b3JkKDB4NDljZWNlODcsIDB4ZmY1NTU1YWEsIDB4NzgyODI4NTAsIDB4N2FkZmRmYTUpOworCSZfZGF0YV93b3JkKDB4OGY4YzhjMDMsIDB4ZjhhMWExNTksIDB4ODA4OTg5MDksIDB4MTcwZDBkMWEpOworCSZfZGF0YV93b3JkKDB4ZGFiZmJmNjUsIDB4MzFlNmU2ZDcsIDB4YzY0MjQyODQsIDB4Yjg2ODY4ZDApOworCSZfZGF0YV93b3JkKDB4YzM0MTQxODIsIDB4YjA5OTk5MjksIDB4NzcyZDJkNWEsIDB4MTEwZjBmMWUpOworCSZfZGF0YV93b3JkKDB4Y2JiMGIwN2IsIDB4ZmM1NDU0YTgsIDB4ZDZiYmJiNmQsIDB4M2ExNjE2MmMpOworCisjVGU0CSMgZm91ciBjb3BpZXMgb2YgVGU0IHRvIGNob29zZSBmcm9tIHRvIGF2b2lkIEwxIGFsaWFzaW5nCisJJmRhdGFfYnl0ZSgweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1KTsKKwkmZGF0YV9ieXRlKDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYpOworCSZkYXRhX2J5dGUoMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCk7CisJJmRhdGFfYnl0ZSgweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwKTsKKwkmZGF0YV9ieXRlKDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MpOworCSZkYXRhX2J5dGUoMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSk7CisJJmRhdGFfYnl0ZSgweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhKTsKKwkmZGF0YV9ieXRlKDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUpOworCSZkYXRhX2J5dGUoMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCk7CisJJmRhdGFfYnl0ZSgweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIpOworCSZkYXRhX2J5dGUoMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZik7CisJJmRhdGFfYnl0ZSgweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgpOworCSZkYXRhX2J5dGUoMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSk7CisJJmRhdGFfYnl0ZSgweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyKTsKKwkmZGF0YV9ieXRlKDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcpOworCSZkYXRhX2J5dGUoMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4KTsKKwkmZGF0YV9ieXRlKDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIpOworCSZkYXRhX2J5dGUoMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1Yyk7CisJJmRhdGFfYnl0ZSgweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5KTsKKwkmZGF0YV9ieXRlKDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkpOworCSZkYXRhX2J5dGUoMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCk7CisJJmRhdGFfYnl0ZSgweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2KTsKKwkmZGF0YV9ieXRlKDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEpOworCSZkYXRhX2J5dGUoMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSk7CisJJmRhdGFfYnl0ZSgweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllKTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQpOworCSZkYXRhX2J5dGUoMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZik7CisJJmRhdGFfYnl0ZSgweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4KTsKKwkmZGF0YV9ieXRlKDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYpOworCisJJmRhdGFfYnl0ZSgweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1KTsKKwkmZGF0YV9ieXRlKDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYpOworCSZkYXRhX2J5dGUoMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCk7CisJJmRhdGFfYnl0ZSgweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwKTsKKwkmZGF0YV9ieXRlKDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MpOworCSZkYXRhX2J5dGUoMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSk7CisJJmRhdGFfYnl0ZSgweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhKTsKKwkmZGF0YV9ieXRlKDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUpOworCSZkYXRhX2J5dGUoMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCk7CisJJmRhdGFfYnl0ZSgweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIpOworCSZkYXRhX2J5dGUoMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZik7CisJJmRhdGFfYnl0ZSgweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgpOworCSZkYXRhX2J5dGUoMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSk7CisJJmRhdGFfYnl0ZSgweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyKTsKKwkmZGF0YV9ieXRlKDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcpOworCSZkYXRhX2J5dGUoMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4KTsKKwkmZGF0YV9ieXRlKDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIpOworCSZkYXRhX2J5dGUoMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1Yyk7CisJJmRhdGFfYnl0ZSgweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5KTsKKwkmZGF0YV9ieXRlKDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkpOworCSZkYXRhX2J5dGUoMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCk7CisJJmRhdGFfYnl0ZSgweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2KTsKKwkmZGF0YV9ieXRlKDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEpOworCSZkYXRhX2J5dGUoMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSk7CisJJmRhdGFfYnl0ZSgweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllKTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQpOworCSZkYXRhX2J5dGUoMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZik7CisJJmRhdGFfYnl0ZSgweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4KTsKKwkmZGF0YV9ieXRlKDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYpOworCisJJmRhdGFfYnl0ZSgweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1KTsKKwkmZGF0YV9ieXRlKDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYpOworCSZkYXRhX2J5dGUoMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCk7CisJJmRhdGFfYnl0ZSgweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwKTsKKwkmZGF0YV9ieXRlKDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MpOworCSZkYXRhX2J5dGUoMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSk7CisJJmRhdGFfYnl0ZSgweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhKTsKKwkmZGF0YV9ieXRlKDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUpOworCSZkYXRhX2J5dGUoMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCk7CisJJmRhdGFfYnl0ZSgweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIpOworCSZkYXRhX2J5dGUoMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZik7CisJJmRhdGFfYnl0ZSgweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgpOworCSZkYXRhX2J5dGUoMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSk7CisJJmRhdGFfYnl0ZSgweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyKTsKKwkmZGF0YV9ieXRlKDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcpOworCSZkYXRhX2J5dGUoMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4KTsKKwkmZGF0YV9ieXRlKDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIpOworCSZkYXRhX2J5dGUoMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1Yyk7CisJJmRhdGFfYnl0ZSgweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5KTsKKwkmZGF0YV9ieXRlKDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkpOworCSZkYXRhX2J5dGUoMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCk7CisJJmRhdGFfYnl0ZSgweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2KTsKKwkmZGF0YV9ieXRlKDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEpOworCSZkYXRhX2J5dGUoMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSk7CisJJmRhdGFfYnl0ZSgweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllKTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQpOworCSZkYXRhX2J5dGUoMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZik7CisJJmRhdGFfYnl0ZSgweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4KTsKKwkmZGF0YV9ieXRlKDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYpOworCisJJmRhdGFfYnl0ZSgweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1KTsKKwkmZGF0YV9ieXRlKDB4MzAsIDB4MDEsIDB4NjcsIDB4MmIsIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYpOworCSZkYXRhX2J5dGUoMHhjYSwgMHg4MiwgMHhjOSwgMHg3ZCwgMHhmYSwgMHg1OSwgMHg0NywgMHhmMCk7CisJJmRhdGFfYnl0ZSgweGFkLCAweGQ0LCAweGEyLCAweGFmLCAweDljLCAweGE0LCAweDcyLCAweGMwKTsKKwkmZGF0YV9ieXRlKDB4YjcsIDB4ZmQsIDB4OTMsIDB4MjYsIDB4MzYsIDB4M2YsIDB4ZjcsIDB4Y2MpOworCSZkYXRhX2J5dGUoMHgzNCwgMHhhNSwgMHhlNSwgMHhmMSwgMHg3MSwgMHhkOCwgMHgzMSwgMHgxNSk7CisJJmRhdGFfYnl0ZSgweDA0LCAweGM3LCAweDIzLCAweGMzLCAweDE4LCAweDk2LCAweDA1LCAweDlhKTsKKwkmZGF0YV9ieXRlKDB4MDcsIDB4MTIsIDB4ODAsIDB4ZTIsIDB4ZWIsIDB4MjcsIDB4YjIsIDB4NzUpOworCSZkYXRhX2J5dGUoMHgwOSwgMHg4MywgMHgyYywgMHgxYSwgMHgxYiwgMHg2ZSwgMHg1YSwgMHhhMCk7CisJJmRhdGFfYnl0ZSgweDUyLCAweDNiLCAweGQ2LCAweGIzLCAweDI5LCAweGUzLCAweDJmLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4NTMsIDB4ZDEsIDB4MDAsIDB4ZWQsIDB4MjAsIDB4ZmMsIDB4YjEsIDB4NWIpOworCSZkYXRhX2J5dGUoMHg2YSwgMHhjYiwgMHhiZSwgMHgzOSwgMHg0YSwgMHg0YywgMHg1OCwgMHhjZik7CisJJmRhdGFfYnl0ZSgweGQwLCAweGVmLCAweGFhLCAweGZiLCAweDQzLCAweDRkLCAweDMzLCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4NDUsIDB4ZjksIDB4MDIsIDB4N2YsIDB4NTAsIDB4M2MsIDB4OWYsIDB4YTgpOworCSZkYXRhX2J5dGUoMHg1MSwgMHhhMywgMHg0MCwgMHg4ZiwgMHg5MiwgMHg5ZCwgMHgzOCwgMHhmNSk7CisJJmRhdGFfYnl0ZSgweGJjLCAweGI2LCAweGRhLCAweDIxLCAweDEwLCAweGZmLCAweGYzLCAweGQyKTsKKwkmZGF0YV9ieXRlKDB4Y2QsIDB4MGMsIDB4MTMsIDB4ZWMsIDB4NWYsIDB4OTcsIDB4NDQsIDB4MTcpOworCSZkYXRhX2J5dGUoMHhjNCwgMHhhNywgMHg3ZSwgMHgzZCwgMHg2NCwgMHg1ZCwgMHgxOSwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDYwLCAweDgxLCAweDRmLCAweGRjLCAweDIyLCAweDJhLCAweDkwLCAweDg4KTsKKwkmZGF0YV9ieXRlKDB4NDYsIDB4ZWUsIDB4YjgsIDB4MTQsIDB4ZGUsIDB4NWUsIDB4MGIsIDB4ZGIpOworCSZkYXRhX2J5dGUoMHhlMCwgMHgzMiwgMHgzYSwgMHgwYSwgMHg0OSwgMHgwNiwgMHgyNCwgMHg1Yyk7CisJJmRhdGFfYnl0ZSgweGMyLCAweGQzLCAweGFjLCAweDYyLCAweDkxLCAweDk1LCAweGU0LCAweDc5KTsKKwkmZGF0YV9ieXRlKDB4ZTcsIDB4YzgsIDB4MzcsIDB4NmQsIDB4OGQsIDB4ZDUsIDB4NGUsIDB4YTkpOworCSZkYXRhX2J5dGUoMHg2YywgMHg1NiwgMHhmNCwgMHhlYSwgMHg2NSwgMHg3YSwgMHhhZSwgMHgwOCk7CisJJmRhdGFfYnl0ZSgweGJhLCAweDc4LCAweDI1LCAweDJlLCAweDFjLCAweGE2LCAweGI0LCAweGM2KTsKKwkmZGF0YV9ieXRlKDB4ZTgsIDB4ZGQsIDB4NzQsIDB4MWYsIDB4NGIsIDB4YmQsIDB4OGIsIDB4OGEpOworCSZkYXRhX2J5dGUoMHg3MCwgMHgzZSwgMHhiNSwgMHg2NiwgMHg0OCwgMHgwMywgMHhmNiwgMHgwZSk7CisJJmRhdGFfYnl0ZSgweDYxLCAweDM1LCAweDU3LCAweGI5LCAweDg2LCAweGMxLCAweDFkLCAweDllKTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4ZjgsIDB4OTgsIDB4MTEsIDB4NjksIDB4ZDksIDB4OGUsIDB4OTQpOworCSZkYXRhX2J5dGUoMHg5YiwgMHgxZSwgMHg4NywgMHhlOSwgMHhjZSwgMHg1NSwgMHgyOCwgMHhkZik7CisJJmRhdGFfYnl0ZSgweDhjLCAweGExLCAweDg5LCAweDBkLCAweGJmLCAweGU2LCAweDQyLCAweDY4KTsKKwkmZGF0YV9ieXRlKDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsIDB4YjAsIDB4NTQsIDB4YmIsIDB4MTYpOworI3Jjb246CiskY29kZS49PDxfX187CisJLmxvbmcJMHgwMDAwMDAwMSwgMHgwMDAwMDAwMiwgMHgwMDAwMDAwNCwgMHgwMDAwMDAwOAorCS5sb25nCTB4MDAwMDAwMTAsIDB4MDAwMDAwMjAsIDB4MDAwMDAwNDAsIDB4MDAwMDAwODAKKwkubG9uZwkweDAwMDAwMDFiLCAweDAwMDAwMDM2LCAweDgwODA4MDgwLCAweDgwODA4MDgwCisJLmxvbmcJMHhmZWZlZmVmZSwgMHhmZWZlZmVmZSwgMHgxYjFiMWIxYiwgMHgxYjFiMWIxYgorX19fCiskY29kZS49PDxfX187CisuYWxpZ24JNjQKKy5MQUVTX1RkOgorX19fCisJJl9kYXRhX3dvcmQoMHg1MGE3ZjQ1MSwgMHg1MzY1NDE3ZSwgMHhjM2E0MTcxYSwgMHg5NjVlMjczYSk7CisJJl9kYXRhX3dvcmQoMHhjYjZiYWIzYiwgMHhmMTQ1OWQxZiwgMHhhYjU4ZmFhYywgMHg5MzAzZTM0Yik7CisJJl9kYXRhX3dvcmQoMHg1NWZhMzAyMCwgMHhmNjZkNzZhZCwgMHg5MTc2Y2M4OCwgMHgyNTRjMDJmNSk7CisJJl9kYXRhX3dvcmQoMHhmY2Q3ZTU0ZiwgMHhkN2NiMmFjNSwgMHg4MDQ0MzUyNiwgMHg4ZmEzNjJiNSk7CisJJl9kYXRhX3dvcmQoMHg0OTVhYjFkZSwgMHg2NzFiYmEyNSwgMHg5ODBlZWE0NSwgMHhlMWMwZmU1ZCk7CisJJl9kYXRhX3dvcmQoMHgwMjc1MmZjMywgMHgxMmYwNGM4MSwgMHhhMzk3NDY4ZCwgMHhjNmY5ZDM2Yik7CisJJl9kYXRhX3dvcmQoMHhlNzVmOGYwMywgMHg5NTljOTIxNSwgMHhlYjdhNmRiZiwgMHhkYTU5NTI5NSk7CisJJl9kYXRhX3dvcmQoMHgyZDgzYmVkNCwgMHhkMzIxNzQ1OCwgMHgyOTY5ZTA0OSwgMHg0NGM4Yzk4ZSk7CisJJl9kYXRhX3dvcmQoMHg2YTg5YzI3NSwgMHg3ODc5OGVmNCwgMHg2YjNlNTg5OSwgMHhkZDcxYjkyNyk7CisJJl9kYXRhX3dvcmQoMHhiNjRmZTFiZSwgMHgxN2FkODhmMCwgMHg2NmFjMjBjOSwgMHhiNDNhY2U3ZCk7CisJJl9kYXRhX3dvcmQoMHgxODRhZGY2MywgMHg4MjMxMWFlNSwgMHg2MDMzNTE5NywgMHg0NTdmNTM2Mik7CisJJl9kYXRhX3dvcmQoMHhlMDc3NjRiMSwgMHg4NGFlNmJiYiwgMHgxY2EwODFmZSwgMHg5NDJiMDhmOSk7CisJJl9kYXRhX3dvcmQoMHg1ODY4NDg3MCwgMHgxOWZkNDU4ZiwgMHg4NzZjZGU5NCwgMHhiN2Y4N2I1Mik7CisJJl9kYXRhX3dvcmQoMHgyM2QzNzNhYiwgMHhlMjAyNGI3MiwgMHg1NzhmMWZlMywgMHgyYWFiNTU2Nik7CisJJl9kYXRhX3dvcmQoMHgwNzI4ZWJiMiwgMHgwM2MyYjUyZiwgMHg5YTdiYzU4NiwgMHhhNTA4MzdkMyk7CisJJl9kYXRhX3dvcmQoMHhmMjg3MjgzMCwgMHhiMmE1YmYyMywgMHhiYTZhMDMwMiwgMHg1YzgyMTZlZCk7CisJJl9kYXRhX3dvcmQoMHgyYjFjY2Y4YSwgMHg5MmI0NzlhNywgMHhmMGYyMDdmMywgMHhhMWUyNjk0ZSk7CisJJl9kYXRhX3dvcmQoMHhjZGY0ZGE2NSwgMHhkNWJlMDUwNiwgMHgxZjYyMzRkMSwgMHg4YWZlYTZjNCk7CisJJl9kYXRhX3dvcmQoMHg5ZDUzMmUzNCwgMHhhMDU1ZjNhMiwgMHgzMmUxOGEwNSwgMHg3NWViZjZhNCk7CisJJl9kYXRhX3dvcmQoMHgzOWVjODMwYiwgMHhhYWVmNjA0MCwgMHgwNjlmNzE1ZSwgMHg1MTEwNmViZCk7CisJJl9kYXRhX3dvcmQoMHhmOThhMjEzZSwgMHgzZDA2ZGQ5NiwgMHhhZTA1M2VkZCwgMHg0NmJkZTY0ZCk7CisJJl9kYXRhX3dvcmQoMHhiNThkNTQ5MSwgMHgwNTVkYzQ3MSwgMHg2ZmQ0MDYwNCwgMHhmZjE1NTA2MCk7CisJJl9kYXRhX3dvcmQoMHgyNGZiOTgxOSwgMHg5N2U5YmRkNiwgMHhjYzQzNDA4OSwgMHg3NzllZDk2Nyk7CisJJl9kYXRhX3dvcmQoMHhiZDQyZThiMCwgMHg4ODhiODkwNywgMHgzODViMTllNywgMHhkYmVlYzg3OSk7CisJJl9kYXRhX3dvcmQoMHg0NzBhN2NhMSwgMHhlOTBmNDI3YywgMHhjOTFlODRmOCwgMHgwMDAwMDAwMCk7CisJJl9kYXRhX3dvcmQoMHg4Mzg2ODAwOSwgMHg0OGVkMmIzMiwgMHhhYzcwMTExZSwgMHg0ZTcyNWE2Yyk7CisJJl9kYXRhX3dvcmQoMHhmYmZmMGVmZCwgMHg1NjM4ODUwZiwgMHgxZWQ1YWUzZCwgMHgyNzM5MmQzNik7CisJJl9kYXRhX3dvcmQoMHg2NGQ5MGYwYSwgMHgyMWE2NWM2OCwgMHhkMTU0NWI5YiwgMHgzYTJlMzYyNCk7CisJJl9kYXRhX3dvcmQoMHhiMTY3MGEwYywgMHgwZmU3NTc5MywgMHhkMjk2ZWViNCwgMHg5ZTkxOWIxYik7CisJJl9kYXRhX3dvcmQoMHg0ZmM1YzA4MCwgMHhhMjIwZGM2MSwgMHg2OTRiNzc1YSwgMHgxNjFhMTIxYyk7CisJJl9kYXRhX3dvcmQoMHgwYWJhOTNlMiwgMHhlNTJhYTBjMCwgMHg0M2UwMjIzYywgMHgxZDE3MWIxMik7CisJJl9kYXRhX3dvcmQoMHgwYjBkMDkwZSwgMHhhZGM3OGJmMiwgMHhiOWE4YjYyZCwgMHhjOGE5MWUxNCk7CisJJl9kYXRhX3dvcmQoMHg4NTE5ZjE1NywgMHg0YzA3NzVhZiwgMHhiYmRkOTllZSwgMHhmZDYwN2ZhMyk7CisJJl9kYXRhX3dvcmQoMHg5ZjI2MDFmNywgMHhiY2Y1NzI1YywgMHhjNTNiNjY0NCwgMHgzNDdlZmI1Yik7CisJJl9kYXRhX3dvcmQoMHg3NjI5NDM4YiwgMHhkY2M2MjNjYiwgMHg2OGZjZWRiNiwgMHg2M2YxZTRiOCk7CisJJl9kYXRhX3dvcmQoMHhjYWRjMzFkNywgMHgxMDg1NjM0MiwgMHg0MDIyOTcxMywgMHgyMDExYzY4NCk7CisJJl9kYXRhX3dvcmQoMHg3ZDI0NGE4NSwgMHhmODNkYmJkMiwgMHgxMTMyZjlhZSwgMHg2ZGExMjljNyk7CisJJl9kYXRhX3dvcmQoMHg0YjJmOWUxZCwgMHhmMzMwYjJkYywgMHhlYzUyODYwZCwgMHhkMGUzYzE3Nyk7CisJJl9kYXRhX3dvcmQoMHg2YzE2YjMyYiwgMHg5OWI5NzBhOSwgMHhmYTQ4OTQxMSwgMHgyMjY0ZTk0Nyk7CisJJl9kYXRhX3dvcmQoMHhjNDhjZmNhOCwgMHgxYTNmZjBhMCwgMHhkODJjN2Q1NiwgMHhlZjkwMzMyMik7CisJJl9kYXRhX3dvcmQoMHhjNzRlNDk4NywgMHhjMWQxMzhkOSwgMHhmZWEyY2E4YywgMHgzNjBiZDQ5OCk7CisJJl9kYXRhX3dvcmQoMHhjZjgxZjVhNiwgMHgyOGRlN2FhNSwgMHgyNjhlYjdkYSwgMHhhNGJmYWQzZik7CisJJl9kYXRhX3dvcmQoMHhlNDlkM2EyYywgMHgwZDkyNzg1MCwgMHg5YmNjNWY2YSwgMHg2MjQ2N2U1NCk7CisJJl9kYXRhX3dvcmQoMHhjMjEzOGRmNiwgMHhlOGI4ZDg5MCwgMHg1ZWY3MzkyZSwgMHhmNWFmYzM4Mik7CisJJl9kYXRhX3dvcmQoMHhiZTgwNWQ5ZiwgMHg3YzkzZDA2OSwgMHhhOTJkZDU2ZiwgMHhiMzEyMjVjZik7CisJJl9kYXRhX3dvcmQoMHgzYjk5YWNjOCwgMHhhNzdkMTgxMCwgMHg2ZTYzOWNlOCwgMHg3YmJiM2JkYik7CisJJl9kYXRhX3dvcmQoMHgwOTc4MjZjZCwgMHhmNDE4NTk2ZSwgMHgwMWI3OWFlYywgMHhhODlhNGY4Myk7CisJJl9kYXRhX3dvcmQoMHg2NTZlOTVlNiwgMHg3ZWU2ZmZhYSwgMHgwOGNmYmMyMSwgMHhlNmU4MTVlZik7CisJJl9kYXRhX3dvcmQoMHhkOTliZTdiYSwgMHhjZTM2NmY0YSwgMHhkNDA5OWZlYSwgMHhkNjdjYjAyOSk7CisJJl9kYXRhX3dvcmQoMHhhZmIyYTQzMSwgMHgzMTIzM2YyYSwgMHgzMDk0YTVjNiwgMHhjMDY2YTIzNSk7CisJJl9kYXRhX3dvcmQoMHgzN2JjNGU3NCwgMHhhNmNhODJmYywgMHhiMGQwOTBlMCwgMHgxNWQ4YTczMyk7CisJJl9kYXRhX3dvcmQoMHg0YTk4MDRmMSwgMHhmN2RhZWM0MSwgMHgwZTUwY2Q3ZiwgMHgyZmY2OTExNyk7CisJJl9kYXRhX3dvcmQoMHg4ZGQ2NGQ3NiwgMHg0ZGIwZWY0MywgMHg1NDRkYWFjYywgMHhkZjA0OTZlNCk7CisJJl9kYXRhX3dvcmQoMHhlM2I1ZDE5ZSwgMHgxYjg4NmE0YywgMHhiODFmMmNjMSwgMHg3ZjUxNjU0Nik7CisJJl9kYXRhX3dvcmQoMHgwNGVhNWU5ZCwgMHg1ZDM1OGMwMSwgMHg3Mzc0ODdmYSwgMHgyZTQxMGJmYik7CisJJl9kYXRhX3dvcmQoMHg1YTFkNjdiMywgMHg1MmQyZGI5MiwgMHgzMzU2MTBlOSwgMHgxMzQ3ZDY2ZCk7CisJJl9kYXRhX3dvcmQoMHg4YzYxZDc5YSwgMHg3YTBjYTEzNywgMHg4ZTE0Zjg1OSwgMHg4OTNjMTNlYik7CisJJl9kYXRhX3dvcmQoMHhlZTI3YTljZSwgMHgzNWM5NjFiNywgMHhlZGU1MWNlMSwgMHgzY2IxNDc3YSk7CisJJl9kYXRhX3dvcmQoMHg1OWRmZDI5YywgMHgzZjczZjI1NSwgMHg3OWNlMTQxOCwgMHhiZjM3Yzc3Myk7CisJJl9kYXRhX3dvcmQoMHhlYWNkZjc1MywgMHg1YmFhZmQ1ZiwgMHgxNDZmM2RkZiwgMHg4NmRiNDQ3OCk7CisJJl9kYXRhX3dvcmQoMHg4MWYzYWZjYSwgMHgzZWM0NjhiOSwgMHgyYzM0MjQzOCwgMHg1ZjQwYTNjMik7CisJJl9kYXRhX3dvcmQoMHg3MmMzMWQxNiwgMHgwYzI1ZTJiYywgMHg4YjQ5M2MyOCwgMHg0MTk1MGRmZik7CisJJl9kYXRhX3dvcmQoMHg3MTAxYTgzOSwgMHhkZWIzMGMwOCwgMHg5Y2U0YjRkOCwgMHg5MGMxNTY2NCk7CisJJl9kYXRhX3dvcmQoMHg2MTg0Y2I3YiwgMHg3MGI2MzJkNSwgMHg3NDVjNmM0OCwgMHg0MjU3YjhkMCk7CisKKyNUZDQ6CSMgZm91ciBjb3BpZXMgb2YgVGQ0IHRvIGNob29zZSBmcm9tIHRvIGF2b2lkIEwxIGFsaWFzaW5nCisJJmRhdGFfYnl0ZSgweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4KTsKKwkmZGF0YV9ieXRlKDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIpOworCSZkYXRhX2J5dGUoMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4Nyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiKTsKKwkmZGF0YV9ieXRlKDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QpOworCSZkYXRhX2J5dGUoMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSk7CisJJmRhdGFfYnl0ZSgweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyKTsKKwkmZGF0YV9ieXRlKDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUpOworCSZkYXRhX2J5dGUoMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNik7CisJJmRhdGFfYnl0ZSgweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyKTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEpOworCSZkYXRhX2J5dGUoMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhKTsKKwkmZGF0YV9ieXRlKDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYpOworCSZkYXRhX2J5dGUoMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMik7CisJJmRhdGFfYnl0ZSgweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiKTsKKwkmZGF0YV9ieXRlKDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEpOworCSZkYXRhX2J5dGUoMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUpOworCSZkYXRhX2J5dGUoMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSk7CisJJmRhdGFfYnl0ZSgweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiKTsKKwkmZGF0YV9ieXRlKDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjApOworCSZkYXRhX2J5dGUoMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCk7CisJJmRhdGFfYnl0ZSgweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxKTsKKwkmZGF0YV9ieXRlKDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCk7CisJJmRhdGFfYnl0ZSgweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmKTsKKwkmZGF0YV9ieXRlKDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjApOworCSZkYXRhX2J5dGUoMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSk7CisJJmRhdGFfYnl0ZSgweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2KTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QpOworJGNvZGUuPTw8X19fOworCS5sb25nCTB4ODA4MDgwODAsIDB4ODA4MDgwODAsIDB4ZmVmZWZlZmUsIDB4ZmVmZWZlZmUKKwkubG9uZwkweDFiMWIxYjFiLCAweDFiMWIxYjFiLCAwLCAwCitfX18KKwkmZGF0YV9ieXRlKDB4NTIsIDB4MDksIDB4NmEsIDB4ZDUsIDB4MzAsIDB4MzYsIDB4YTUsIDB4MzgpOworCSZkYXRhX2J5dGUoMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSwgMHg4MSwgMHhmMywgMHhkNywgMHhmYik7CisJJmRhdGFfYnl0ZSgweDdjLCAweGUzLCAweDM5LCAweDgyLCAweDliLCAweDJmLCAweGZmLCAweDg3KTsKKwkmZGF0YV9ieXRlKDB4MzQsIDB4OGUsIDB4NDMsIDB4NDQsIDB4YzQsIDB4ZGUsIDB4ZTksIDB4Y2IpOworCSZkYXRhX2J5dGUoMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZCk7CisJJmRhdGFfYnl0ZSgweGVlLCAweDRjLCAweDk1LCAweDBiLCAweDQyLCAweGZhLCAweGMzLCAweDRlKTsKKwkmZGF0YV9ieXRlKDB4MDgsIDB4MmUsIDB4YTEsIDB4NjYsIDB4MjgsIDB4ZDksIDB4MjQsIDB4YjIpOworCSZkYXRhX2J5dGUoMHg3NiwgMHg1YiwgMHhhMiwgMHg0OSwgMHg2ZCwgMHg4YiwgMHhkMSwgMHgyNSk7CisJJmRhdGFfYnl0ZSgweDcyLCAweGY4LCAweGY2LCAweDY0LCAweDg2LCAweDY4LCAweDk4LCAweDE2KTsKKwkmZGF0YV9ieXRlKDB4ZDQsIDB4YTQsIDB4NWMsIDB4Y2MsIDB4NWQsIDB4NjUsIDB4YjYsIDB4OTIpOworCSZkYXRhX2J5dGUoMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYSk7CisJJmRhdGFfYnl0ZSgweDVlLCAweDE1LCAweDQ2LCAweDU3LCAweGE3LCAweDhkLCAweDlkLCAweDg0KTsKKwkmZGF0YV9ieXRlKDB4OTAsIDB4ZDgsIDB4YWIsIDB4MDAsIDB4OGMsIDB4YmMsIDB4ZDMsIDB4MGEpOworCSZkYXRhX2J5dGUoMHhmNywgMHhlNCwgMHg1OCwgMHgwNSwgMHhiOCwgMHhiMywgMHg0NSwgMHgwNik7CisJJmRhdGFfYnl0ZSgweGQwLCAweDJjLCAweDFlLCAweDhmLCAweGNhLCAweDNmLCAweDBmLCAweDAyKTsKKwkmZGF0YV9ieXRlKDB4YzEsIDB4YWYsIDB4YmQsIDB4MDMsIDB4MDEsIDB4MTMsIDB4OGEsIDB4NmIpOworCSZkYXRhX2J5dGUoMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYSk7CisJJmRhdGFfYnl0ZSgweDk3LCAweGYyLCAweGNmLCAweGNlLCAweGYwLCAweGI0LCAweGU2LCAweDczKTsKKwkmZGF0YV9ieXRlKDB4OTYsIDB4YWMsIDB4NzQsIDB4MjIsIDB4ZTcsIDB4YWQsIDB4MzUsIDB4ODUpOworCSZkYXRhX2J5dGUoMHhlMiwgMHhmOSwgMHgzNywgMHhlOCwgMHgxYywgMHg3NSwgMHhkZiwgMHg2ZSk7CisJJmRhdGFfYnl0ZSgweDQ3LCAweGYxLCAweDFhLCAweDcxLCAweDFkLCAweDI5LCAweGM1LCAweDg5KTsKKwkmZGF0YV9ieXRlKDB4NmYsIDB4YjcsIDB4NjIsIDB4MGUsIDB4YWEsIDB4MTgsIDB4YmUsIDB4MWIpOworCSZkYXRhX2J5dGUoMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMCk7CisJJmRhdGFfYnl0ZSgweDlhLCAweGRiLCAweGMwLCAweGZlLCAweDc4LCAweGNkLCAweDVhLCAweGY0KTsKKwkmZGF0YV9ieXRlKDB4MWYsIDB4ZGQsIDB4YTgsIDB4MzMsIDB4ODgsIDB4MDcsIDB4YzcsIDB4MzEpOworCSZkYXRhX2J5dGUoMHhiMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhlYywgMHg1Zik7CisJJmRhdGFfYnl0ZSgweDYwLCAweDUxLCAweDdmLCAweGE5LCAweDE5LCAweGI1LCAweDRhLCAweDBkKTsKKwkmZGF0YV9ieXRlKDB4MmQsIDB4ZTUsIDB4N2EsIDB4OWYsIDB4OTMsIDB4YzksIDB4OWMsIDB4ZWYpOworCSZkYXRhX2J5dGUoMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMCk7CisJJmRhdGFfYnl0ZSgweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxKTsKKwkmZGF0YV9ieXRlKDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYpOworCSZkYXRhX2J5dGUoMHhlMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZCk7CiskY29kZS49PDxfX187CisJLmxvbmcJMHg4MDgwODA4MCwgMHg4MDgwODA4MCwgMHhmZWZlZmVmZSwgMHhmZWZlZmVmZQorCS5sb25nCTB4MWIxYjFiMWIsIDB4MWIxYjFiMWIsIDAsIDAKK19fXworCSZkYXRhX2J5dGUoMHg1MiwgMHgwOSwgMHg2YSwgMHhkNSwgMHgzMCwgMHgzNiwgMHhhNSwgMHgzOCk7CisJJmRhdGFfYnl0ZSgweGJmLCAweDQwLCAweGEzLCAweDllLCAweDgxLCAweGYzLCAweGQ3LCAweGZiKTsKKwkmZGF0YV9ieXRlKDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcpOworCSZkYXRhX2J5dGUoMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYik7CisJJmRhdGFfYnl0ZSgweDU0LCAweDdiLCAweDk0LCAweDMyLCAweGE2LCAweGMyLCAweDIzLCAweDNkKTsKKwkmZGF0YV9ieXRlKDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUpOworCSZkYXRhX2J5dGUoMHgwOCwgMHgyZSwgMHhhMSwgMHg2NiwgMHgyOCwgMHhkOSwgMHgyNCwgMHhiMik7CisJJmRhdGFfYnl0ZSgweDc2LCAweDViLCAweGEyLCAweDQ5LCAweDZkLCAweDhiLCAweGQxLCAweDI1KTsKKwkmZGF0YV9ieXRlKDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYpOworCSZkYXRhX2J5dGUoMHhkNCwgMHhhNCwgMHg1YywgMHhjYywgMHg1ZCwgMHg2NSwgMHhiNiwgMHg5Mik7CisJJmRhdGFfYnl0ZSgweDZjLCAweDcwLCAweDQ4LCAweDUwLCAweGZkLCAweGVkLCAweGI5LCAweGRhKTsKKwkmZGF0YV9ieXRlKDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQpOworCSZkYXRhX2J5dGUoMHg5MCwgMHhkOCwgMHhhYiwgMHgwMCwgMHg4YywgMHhiYywgMHhkMywgMHgwYSk7CisJJmRhdGFfYnl0ZSgweGY3LCAweGU0LCAweDU4LCAweDA1LCAweGI4LCAweGIzLCAweDQ1LCAweDA2KTsKKwkmZGF0YV9ieXRlKDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIpOworCSZkYXRhX2J5dGUoMHhjMSwgMHhhZiwgMHhiZCwgMHgwMywgMHgwMSwgMHgxMywgMHg4YSwgMHg2Yik7CisJJmRhdGFfYnl0ZSgweDNhLCAweDkxLCAweDExLCAweDQxLCAweDRmLCAweDY3LCAweGRjLCAweGVhKTsKKwkmZGF0YV9ieXRlKDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMpOworCSZkYXRhX2J5dGUoMHg5NiwgMHhhYywgMHg3NCwgMHgyMiwgMHhlNywgMHhhZCwgMHgzNSwgMHg4NSk7CisJJmRhdGFfYnl0ZSgweGUyLCAweGY5LCAweDM3LCAweGU4LCAweDFjLCAweDc1LCAweGRmLCAweDZlKTsKKwkmZGF0YV9ieXRlKDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkpOworCSZkYXRhX2J5dGUoMHg2ZiwgMHhiNywgMHg2MiwgMHgwZSwgMHhhYSwgMHgxOCwgMHhiZSwgMHgxYik7CisJJmRhdGFfYnl0ZSgweGZjLCAweDU2LCAweDNlLCAweDRiLCAweGM2LCAweGQyLCAweDc5LCAweDIwKTsKKwkmZGF0YV9ieXRlKDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQpOworCSZkYXRhX2J5dGUoMHgxZiwgMHhkZCwgMHhhOCwgMHgzMywgMHg4OCwgMHgwNywgMHhjNywgMHgzMSk7CisJJmRhdGFfYnl0ZSgweGIxLCAweDEyLCAweDEwLCAweDU5LCAweDI3LCAweDgwLCAweGVjLCAweDVmKTsKKwkmZGF0YV9ieXRlKDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQpOworCSZkYXRhX2J5dGUoMHgyZCwgMHhlNSwgMHg3YSwgMHg5ZiwgMHg5MywgMHhjOSwgMHg5YywgMHhlZik7CisJJmRhdGFfYnl0ZSgweGEwLCAweGUwLCAweDNiLCAweDRkLCAweGFlLCAweDJhLCAweGY1LCAweGIwKTsKKwkmZGF0YV9ieXRlKDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEpOworCSZkYXRhX2J5dGUoMHgxNywgMHgyYiwgMHgwNCwgMHg3ZSwgMHhiYSwgMHg3NywgMHhkNiwgMHgyNik7CisJJmRhdGFfYnl0ZSgweGUxLCAweDY5LCAweDE0LCAweDYzLCAweDU1LCAweDIxLCAweDBjLCAweDdkKTsKKyRjb2RlLj08PF9fXzsKKwkubG9uZwkweDgwODA4MDgwLCAweDgwODA4MDgwLCAweGZlZmVmZWZlLCAweGZlZmVmZWZlCisJLmxvbmcJMHgxYjFiMWIxYiwgMHgxYjFiMWIxYiwgMCwgMAorX19fCisJJmRhdGFfYnl0ZSgweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4KTsKKwkmZGF0YV9ieXRlKDB4YmYsIDB4NDAsIDB4YTMsIDB4OWUsIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIpOworCSZkYXRhX2J5dGUoMHg3YywgMHhlMywgMHgzOSwgMHg4MiwgMHg5YiwgMHgyZiwgMHhmZiwgMHg4Nyk7CisJJmRhdGFfYnl0ZSgweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiKTsKKwkmZGF0YV9ieXRlKDB4NTQsIDB4N2IsIDB4OTQsIDB4MzIsIDB4YTYsIDB4YzIsIDB4MjMsIDB4M2QpOworCSZkYXRhX2J5dGUoMHhlZSwgMHg0YywgMHg5NSwgMHgwYiwgMHg0MiwgMHhmYSwgMHhjMywgMHg0ZSk7CisJJmRhdGFfYnl0ZSgweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyKTsKKwkmZGF0YV9ieXRlKDB4NzYsIDB4NWIsIDB4YTIsIDB4NDksIDB4NmQsIDB4OGIsIDB4ZDEsIDB4MjUpOworCSZkYXRhX2J5dGUoMHg3MiwgMHhmOCwgMHhmNiwgMHg2NCwgMHg4NiwgMHg2OCwgMHg5OCwgMHgxNik7CisJJmRhdGFfYnl0ZSgweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyKTsKKwkmZGF0YV9ieXRlKDB4NmMsIDB4NzAsIDB4NDgsIDB4NTAsIDB4ZmQsIDB4ZWQsIDB4YjksIDB4ZGEpOworCSZkYXRhX2J5dGUoMHg1ZSwgMHgxNSwgMHg0NiwgMHg1NywgMHhhNywgMHg4ZCwgMHg5ZCwgMHg4NCk7CisJJmRhdGFfYnl0ZSgweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhKTsKKwkmZGF0YV9ieXRlKDB4ZjcsIDB4ZTQsIDB4NTgsIDB4MDUsIDB4YjgsIDB4YjMsIDB4NDUsIDB4MDYpOworCSZkYXRhX2J5dGUoMHhkMCwgMHgyYywgMHgxZSwgMHg4ZiwgMHhjYSwgMHgzZiwgMHgwZiwgMHgwMik7CisJJmRhdGFfYnl0ZSgweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiKTsKKwkmZGF0YV9ieXRlKDB4M2EsIDB4OTEsIDB4MTEsIDB4NDEsIDB4NGYsIDB4NjcsIDB4ZGMsIDB4ZWEpOworCSZkYXRhX2J5dGUoMHg5NywgMHhmMiwgMHhjZiwgMHhjZSwgMHhmMCwgMHhiNCwgMHhlNiwgMHg3Myk7CisJJmRhdGFfYnl0ZSgweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1KTsKKwkmZGF0YV9ieXRlKDB4ZTIsIDB4ZjksIDB4MzcsIDB4ZTgsIDB4MWMsIDB4NzUsIDB4ZGYsIDB4NmUpOworCSZkYXRhX2J5dGUoMHg0NywgMHhmMSwgMHgxYSwgMHg3MSwgMHgxZCwgMHgyOSwgMHhjNSwgMHg4OSk7CisJJmRhdGFfYnl0ZSgweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiKTsKKwkmZGF0YV9ieXRlKDB4ZmMsIDB4NTYsIDB4M2UsIDB4NGIsIDB4YzYsIDB4ZDIsIDB4NzksIDB4MjApOworCSZkYXRhX2J5dGUoMHg5YSwgMHhkYiwgMHhjMCwgMHhmZSwgMHg3OCwgMHhjZCwgMHg1YSwgMHhmNCk7CisJJmRhdGFfYnl0ZSgweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxKTsKKwkmZGF0YV9ieXRlKDB4YjEsIDB4MTIsIDB4MTAsIDB4NTksIDB4MjcsIDB4ODAsIDB4ZWMsIDB4NWYpOworCSZkYXRhX2J5dGUoMHg2MCwgMHg1MSwgMHg3ZiwgMHhhOSwgMHgxOSwgMHhiNSwgMHg0YSwgMHgwZCk7CisJJmRhdGFfYnl0ZSgweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmKTsKKwkmZGF0YV9ieXRlKDB4YTAsIDB4ZTAsIDB4M2IsIDB4NGQsIDB4YWUsIDB4MmEsIDB4ZjUsIDB4YjApOworCSZkYXRhX2J5dGUoMHhjOCwgMHhlYiwgMHhiYiwgMHgzYywgMHg4MywgMHg1MywgMHg5OSwgMHg2MSk7CisJJmRhdGFfYnl0ZSgweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2KTsKKwkmZGF0YV9ieXRlKDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsIDB4NTUsIDB4MjEsIDB4MGMsIDB4N2QpOworJGNvZGUuPTw8X19fOworCS5sb25nCTB4ODA4MDgwODAsIDB4ODA4MDgwODAsIDB4ZmVmZWZlZmUsIDB4ZmVmZWZlZmUKKwkubG9uZwkweDFiMWIxYjFiLCAweDFiMWIxYjFiLCAwLCAwCisuYXNjaXogICJBRVMgZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgk2NAorX19fCisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCWJsb2NrX3NlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitibG9ja19zZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbW92CTgoJGRpc3ApLCVyc2kJCSMgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTU2KCRkaXNwKSwlcjExCQkjIGRpc3AtPkhhbmRsZXJEYXRhCisKKwltb3YJMCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVswXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgcHJvbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxwcm9sb2d1ZSBsYWJlbAorCWpiCS5MaW5fYmxvY2tfcHJvbG9ndWUKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbW92CTQoJXIxMSksJXIxMGQJCSMgSGFuZGxlckRhdGFbMV0KKwlsZWEJKCVyc2ksJXIxMCksJXIxMAkjIGVwaWxvZ3VlIGxhYmVsCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PWVwaWxvZ3VlIGxhYmVsCisJamFlCS5MaW5fYmxvY2tfcHJvbG9ndWUKKworCW1vdgkyNCglcmF4KSwlcmF4CQkjIHB1bGwgc2F2ZWQgcmVhbCBzdGFjayBwb2ludGVyCisJbGVhCTQ4KCVyYXgpLCVyYXgJCSMgYWRqdXN0Li4uCisKKwltb3YJLTgoJXJheCksJXJieAorCW1vdgktMTYoJXJheCksJXJicAorCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMzIoJXJheCksJXIxMworCW1vdgktNDAoJXJheCksJXIxNAorCW1vdgktNDgoJXJheCksJXIxNQorCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMworCW1vdgklcjE0LDIzMigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNAorCW1vdgklcjE1LDI0MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNQorCisuTGluX2Jsb2NrX3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJam1wCS5MY29tbW9uX3NlaF9leGl0Cisuc2l6ZQlibG9ja19zZV9oYW5kbGVyLC4tYmxvY2tfc2VfaGFuZGxlcgorCisudHlwZQlrZXlfc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK2tleV9zZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbW92CTgoJGRpc3ApLCVyc2kJCSMgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTU2KCRkaXNwKSwlcjExCQkjIGRpc3AtPkhhbmRsZXJEYXRhCisKKwltb3YJMCglcjExKSwlcjEwZAkJIyBIYW5kbGVyRGF0YVswXQorCWxlYQkoJXJzaSwlcjEwKSwlcjEwCSMgcHJvbG9ndWUgbGFiZWwKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDxwcm9sb2d1ZSBsYWJlbAorCWpiCS5MaW5fa2V5X3Byb2xvZ3VlCisKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKworCW1vdgk0KCVyMTEpLCVyMTBkCQkjIEhhbmRsZXJEYXRhWzFdCisJbGVhCSglcnNpLCVyMTApLCVyMTAJIyBlcGlsb2d1ZSBsYWJlbAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPj1lcGlsb2d1ZSBsYWJlbAorCWphZQkuTGluX2tleV9wcm9sb2d1ZQorCisJbGVhCTU2KCVyYXgpLCVyYXgKKworCW1vdgktOCglcmF4KSwlcmJ4CisJbW92CS0xNiglcmF4KSwlcmJwCisJbW92CS0yNCglcmF4KSwlcjEyCisJbW92CS0zMiglcmF4KSwlcjEzCisJbW92CS00MCglcmF4KSwlcjE0CisJbW92CS00OCglcmF4KSwlcjE1CisJbW92CSVyYngsMTQ0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJ4CisJbW92CSVyYnAsMTYwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJwCisJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCisJbW92CSVyMTMsMjI0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEzCisJbW92CSVyMTQsMjMyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE0CisJbW92CSVyMTUsMjQwKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjE1CisKKy5MaW5fa2V5X3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJam1wCS5MY29tbW9uX3NlaF9leGl0Cisuc2l6ZQlrZXlfc2VfaGFuZGxlciwuLWtleV9zZV9oYW5kbGVyCisKKy50eXBlCWNiY19zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorY2JjX3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwlsZWEJLkxjYmNfcHJvbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPC5MY2JjX3Byb2xvZ3VlCisJamIJLkxpbl9jYmNfcHJvbG9ndWUKKworCWxlYQkuTGNiY19mYXN0X2JvZHkoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPC5MY2JjX2Zhc3RfYm9keQorCWpiCS5MaW5fY2JjX2ZyYW1lX3NldHVwCisKKwlsZWEJLkxjYmNfc2xvd19wcm9sb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8LkxjYmNfc2xvd19wcm9sb2d1ZQorCWpiCS5MaW5fY2JjX2JvZHkKKworCWxlYQkuTGNiY19zbG93X2JvZHkoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPC5MY2JjX3Nsb3dfYm9keQorCWpiCS5MaW5fY2JjX2ZyYW1lX3NldHVwCisKKy5MaW5fY2JjX2JvZHk6CisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwlsZWEJLkxjYmNfZXBpbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPj0uTGNiY19lcGlsb2d1ZQorCWphZQkuTGluX2NiY19wcm9sb2d1ZQorCisJbGVhCTgoJXJheCksJXJheAorCisJbGVhCS5MY2JjX3BvcGZxKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49LkxjYmNfcG9wZnEKKwlqYWUJLkxpbl9jYmNfcHJvbG9ndWUKKworCW1vdglgMTYtOGAoJXJheCksJXJheAkjIGJpYXNlZCAkX3JzcAorCWxlYQk1NiglcmF4KSwlcmF4CisKKy5MaW5fY2JjX2ZyYW1lX3NldHVwOgorCW1vdgktMTYoJXJheCksJXJieAorCW1vdgktMjQoJXJheCksJXJicAorCW1vdgktMzIoJXJheCksJXIxMgorCW1vdgktNDAoJXJheCksJXIxMworCW1vdgktNDgoJXJheCksJXIxNAorCW1vdgktNTYoJXJheCksJXIxNQorCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjEzLDIyNCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMworCW1vdgklcjE0LDIzMigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNAorCW1vdgklcjE1LDI0MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNQorCisuTGluX2NiY19wcm9sb2d1ZToKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworLkxjb21tb25fc2VoX2V4aXQ6CisKKwltb3YJNDAoJGRpc3ApLCVyZGkJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKKwltb3YJXCRgMTIzMi84YCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCWNiY19zZV9oYW5kbGVyLC4tY2JjX3NlX2hhbmRsZXIKKworLnNlY3Rpb24JLnBkYXRhCisuYWxpZ24JNAorCS5ydmEJLkxTRUhfYmVnaW5fQUVTX2VuY3J5cHQKKwkucnZhCS5MU0VIX2VuZF9BRVNfZW5jcnlwdAorCS5ydmEJLkxTRUhfaW5mb19BRVNfZW5jcnlwdAorCisJLnJ2YQkuTFNFSF9iZWdpbl9BRVNfZGVjcnlwdAorCS5ydmEJLkxTRUhfZW5kX0FFU19kZWNyeXB0CisJLnJ2YQkuTFNFSF9pbmZvX0FFU19kZWNyeXB0CisKKwkucnZhCS5MU0VIX2JlZ2luX0FFU19zZXRfZW5jcnlwdF9rZXkKKwkucnZhCS5MU0VIX2VuZF9BRVNfc2V0X2VuY3J5cHRfa2V5CisJLnJ2YQkuTFNFSF9pbmZvX0FFU19zZXRfZW5jcnlwdF9rZXkKKworCS5ydmEJLkxTRUhfYmVnaW5fQUVTX3NldF9kZWNyeXB0X2tleQorCS5ydmEJLkxTRUhfZW5kX0FFU19zZXRfZGVjcnlwdF9rZXkKKwkucnZhCS5MU0VIX2luZm9fQUVTX3NldF9kZWNyeXB0X2tleQorCisJLnJ2YQkuTFNFSF9iZWdpbl9BRVNfY2JjX2VuY3J5cHQKKwkucnZhCS5MU0VIX2VuZF9BRVNfY2JjX2VuY3J5cHQKKwkucnZhCS5MU0VIX2luZm9fQUVTX2NiY19lbmNyeXB0CisKKy5zZWN0aW9uCS54ZGF0YQorLmFsaWduCTgKKy5MU0VIX2luZm9fQUVTX2VuY3J5cHQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJYmxvY2tfc2VfaGFuZGxlcgorCS5ydmEJLkxlbmNfcHJvbG9ndWUsLkxlbmNfZXBpbG9ndWUJIyBIYW5kbGVyRGF0YVtdCisuTFNFSF9pbmZvX0FFU19kZWNyeXB0OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCWJsb2NrX3NlX2hhbmRsZXIKKwkucnZhCS5MZGVjX3Byb2xvZ3VlLC5MZGVjX2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorLkxTRUhfaW5mb19BRVNfc2V0X2VuY3J5cHRfa2V5OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCWtleV9zZV9oYW5kbGVyCisJLnJ2YQkuTGVuY19rZXlfcHJvbG9ndWUsLkxlbmNfa2V5X2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorLkxTRUhfaW5mb19BRVNfc2V0X2RlY3J5cHRfa2V5OgorCS5ieXRlCTksMCwwLDAKKwkucnZhCWtleV9zZV9oYW5kbGVyCisJLnJ2YQkuTGRlY19rZXlfcHJvbG9ndWUsLkxkZWNfa2V5X2VwaWxvZ3VlCSMgSGFuZGxlckRhdGFbXQorLkxTRUhfaW5mb19BRVNfY2JjX2VuY3J5cHQ6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJY2JjX3NlX2hhbmRsZXIKK19fXworfQorCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsKCQxKS9nZW07CisKK3ByaW50ICRjb2RlOworCitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2JpdHN0ci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9iaXRzdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDE3OTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9iaXRzdHIuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogY3J5cHRvL2FzbjEvYV9iaXRzdHIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCitpbnQgQVNOMV9CSVRfU1RSSU5HX3NldChBU04xX0JJVF9TVFJJTkcgKngsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pCit7IHJldHVybiBNX0FTTjFfQklUX1NUUklOR19zZXQoeCwgZCwgbGVuKTsgfQorCitpbnQgaTJjX0FTTjFfQklUX1NUUklORyhBU04xX0JJVF9TVFJJTkcgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisJaW50IHJldCxqLGJpdHMsbGVuOworCXVuc2lnbmVkIGNoYXIgKnAsKmQ7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwlsZW49YS0+bGVuZ3RoOworCisJaWYgKGxlbiA+IDApCisJCXsKKwkJaWYgKGEtPmZsYWdzICYgQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlQpCisJCQl7CisJCQliaXRzPShpbnQpYS0+ZmxhZ3MmMHgwNzsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJZm9yICggOyBsZW4gPiAwOyBsZW4tLSkKKwkJCQl7CisJCQkJaWYgKGEtPmRhdGFbbGVuLTFdKSBicmVhazsKKwkJCQl9CisJCQlqPWEtPmRhdGFbbGVuLTFdOworCQkJaWYgICAgICAoaiAmIDB4MDEpIGJpdHM9MDsKKwkJCWVsc2UgaWYgKGogJiAweDAyKSBiaXRzPTE7CisJCQllbHNlIGlmIChqICYgMHgwNCkgYml0cz0yOworCQkJZWxzZSBpZiAoaiAmIDB4MDgpIGJpdHM9MzsKKwkJCWVsc2UgaWYgKGogJiAweDEwKSBiaXRzPTQ7CisJCQllbHNlIGlmIChqICYgMHgyMCkgYml0cz01OworCQkJZWxzZSBpZiAoaiAmIDB4NDApIGJpdHM9NjsKKwkJCWVsc2UgaWYgKGogJiAweDgwKSBiaXRzPTc7CisJCQllbHNlIGJpdHM9MDsgLyogc2hvdWxkIG5vdCBoYXBwZW4gKi8KKwkJCX0KKwkJfQorCWVsc2UKKwkJYml0cz0wOworCisJcmV0PTErbGVuOworCWlmIChwcCA9PSBOVUxMKSByZXR1cm4ocmV0KTsKKworCXA9ICpwcDsKKworCSoocCsrKT0odW5zaWduZWQgY2hhciliaXRzOworCWQ9YS0+ZGF0YTsKKwltZW1jcHkocCxkLGxlbik7CisJcCs9bGVuOworCWlmIChsZW4gPiAwKSBwWy0xXSY9KDB4ZmY8PGJpdHMpOworCSpwcD1wOworCXJldHVybihyZXQpOworCX0KKworQVNOMV9CSVRfU1RSSU5HICpjMmlfQVNOMV9CSVRfU1RSSU5HKEFTTjFfQklUX1NUUklORyAqKmEsCisJY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbikKKwl7CisJQVNOMV9CSVRfU1RSSU5HICpyZXQ9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnM7CisJaW50IGk7CisKKwlpZiAobGVuIDwgMSkKKwkJeworCQlpPUFTTjFfUl9TVFJJTkdfVE9PX1NIT1JUOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKChhID09IE5VTEwpIHx8ICgoKmEpID09IE5VTEwpKQorCQl7CisJCWlmICgocmV0PU1fQVNOMV9CSVRfU1RSSU5HX25ldygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJCX0KKwllbHNlCisJCXJldD0oKmEpOworCisJcD0gKnBwOworCWk9ICoocCsrKTsKKwkvKiBXZSBkbyB0aGlzIHRvIHByZXNlcnZlIHRoZSBzZXR0aW5ncy4gIElmIHdlIG1vZGlmeQorCSAqIHRoZSBzZXR0aW5ncywgdmlhIHRoZSBfc2V0X2JpdCBmdW5jdGlvbiwgd2Ugd2lsbCByZWNhbGN1bGF0ZQorCSAqIG9uIG91dHB1dCAqLworCXJldC0+ZmxhZ3MmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUfDB4MDcpOyAvKiBjbGVhciAqLworCXJldC0+ZmxhZ3N8PShBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVHwoaSYweDA3KSk7IC8qIHNldCAqLworCisJaWYgKGxlbi0tID4gMSkgLyogdXNpbmcgb25lIGJlY2F1c2Ugb2YgdGhlIGJpdHMgbGVmdCBieXRlICovCisJCXsKKwkJcz0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbGVuKTsKKwkJaWYgKHMgPT0gTlVMTCkKKwkJCXsKKwkJCWk9RVJSX1JfTUFMTE9DX0ZBSUxVUkU7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJbWVtY3B5KHMscCwoaW50KWxlbik7CisJCXNbbGVuLTFdJj0oMHhmZjw8aSk7CisJCXArPWxlbjsKKwkJfQorCWVsc2UKKwkJcz1OVUxMOworCisJcmV0LT5sZW5ndGg9KGludClsZW47CisJaWYgKHJldC0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5kYXRhKTsKKwlyZXQtPmRhdGE9czsKKwlyZXQtPnR5cGU9Vl9BU04xX0JJVF9TVFJJTkc7CisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7CisJKnBwPXA7CisJcmV0dXJuKHJldCk7CitlcnI6CisJQVNOMWVycihBU04xX0ZfQzJJX0FTTjFfQklUX1NUUklORyxpKTsKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlNX0FTTjFfQklUX1NUUklOR19mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworLyogVGhlc2UgbmV4dCAyIGZ1bmN0aW9ucyBmcm9tIEdvZXR6IEJhYmluLUViZWxsIDxiYWJpbmViZWxsQHRydXN0Y2VudGVyLmRlPgorICovCitpbnQgQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQoQVNOMV9CSVRfU1RSSU5HICphLCBpbnQgbiwgaW50IHZhbHVlKQorCXsKKwlpbnQgdyx2LGl2OworCXVuc2lnbmVkIGNoYXIgKmM7CisKKwl3PW4vODsKKwl2PTE8PCg3LShuJjB4MDcpKTsKKwlpdj0gfnY7CisJaWYgKCF2YWx1ZSkgdj0wOworCisJaWYgKGEgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlhLT5mbGFncyY9IH4oQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlR8MHgwNyk7IC8qIGNsZWFyLCBzZXQgb24gd3JpdGUgKi8KKworCWlmICgoYS0+bGVuZ3RoIDwgKHcrMSkpIHx8IChhLT5kYXRhID09IE5VTEwpKQorCQl7CisJCWlmICghdmFsdWUpIHJldHVybigxKTsgLyogRG9uJ3QgbmVlZCB0byBzZXQgKi8KKwkJaWYgKGEtPmRhdGEgPT0gTlVMTCkKKwkJCWM9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyh3KzEpOworCQllbHNlCisJCQljPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9yZWFsbG9jX2NsZWFuKGEtPmRhdGEsCisJCQkJCQkJCSBhLT5sZW5ndGgsCisJCQkJCQkJCSB3KzEpOworCQlpZiAoYyA9PSBOVUxMKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9CSVRfU1RSSU5HX1NFVF9CSVQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCQl9CisgIAkJaWYgKHcrMS1hLT5sZW5ndGggPiAwKSBtZW1zZXQoYythLT5sZW5ndGgsIDAsIHcrMS1hLT5sZW5ndGgpOworCQlhLT5kYXRhPWM7CisJCWEtPmxlbmd0aD13KzE7CisJfQorCWEtPmRhdGFbd109KChhLT5kYXRhW3ddKSZpdil8djsKKwl3aGlsZSAoKGEtPmxlbmd0aCA+IDApICYmIChhLT5kYXRhW2EtPmxlbmd0aC0xXSA9PSAwKSkKKwkJYS0+bGVuZ3RoLS07CisJcmV0dXJuKDEpOworCX0KKworaW50IEFTTjFfQklUX1NUUklOR19nZXRfYml0KEFTTjFfQklUX1NUUklORyAqYSwgaW50IG4pCisJeworCWludCB3LHY7CisKKwl3PW4vODsKKwl2PTE8PCg3LShuJjB4MDcpKTsKKwlpZiAoKGEgPT0gTlVMTCkgfHwgKGEtPmxlbmd0aCA8ICh3KzEpKSB8fCAoYS0+ZGF0YSA9PSBOVUxMKSkKKwkJcmV0dXJuKDApOworCXJldHVybigoYS0+ZGF0YVt3XSZ2KSAhPSAwKTsKKwl9CisKKy8qCisgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGJpdCBzdHJpbmcgY29udGFpbnMgb25seSBiaXRzIHNwZWNpZmllZCBieSAKKyAqIHRoZSBmbGFncyB2ZWN0b3IuIFJldHVybnMgMCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYml0IHNldCBpbiAnYScKKyAqIHdoaWNoIGlzIG5vdCBzcGVjaWZpZWQgaW4gJ2ZsYWdzJywgMSBvdGhlcndpc2UuCisgKiAnbGVuJyBpcyB0aGUgbGVuZ3RoIG9mICdmbGFncycuCisgKi8KK2ludCBBU04xX0JJVF9TVFJJTkdfY2hlY2soQVNOMV9CSVRfU1RSSU5HICphLAorCQkJICB1bnNpZ25lZCBjaGFyICpmbGFncywgaW50IGZsYWdzX2xlbikKKwl7CisJaW50IGksIG9rOworCS8qIENoZWNrIGlmIHRoZXJlIGlzIG9uZSBiaXQgc2V0IGF0IGFsbC4gKi8KKwlpZiAoIWEgfHwgIWEtPmRhdGEpIHJldHVybiAxOworCisJLyogQ2hlY2sgZWFjaCBieXRlIG9mIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYml0IHN0cmluZy4gKi8KKwlvayA9IDE7CisJZm9yIChpID0gMDsgaSA8IGEtPmxlbmd0aCAmJiBvazsgKytpKQorCQl7CisJCXVuc2lnbmVkIGNoYXIgbWFzayA9IGkgPCBmbGFnc19sZW4gPyB+ZmxhZ3NbaV0gOiAweGZmOworCQkvKiBXZSBhcmUgZG9uZSBpZiB0aGVyZSBpcyBhbiB1bm5lZWRlZCBiaXQgc2V0LiAqLworCQlvayA9IChhLT5kYXRhW2ldICYgbWFzaykgPT0gMDsKKwkJfQorCXJldHVybiBvazsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2Jvb2wuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfYm9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMWFjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2Jvb2wuYwpAQCAtMCwwICsxLDExNCBAQAorLyogY3J5cHRvL2FzbjEvYV9ib29sLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisKK2ludCBpMmRfQVNOMV9CT09MRUFOKGludCBhLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCWludCByOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlyPUFTTjFfb2JqZWN0X3NpemUoMCwxLFZfQVNOMV9CT09MRUFOKTsKKwlpZiAocHAgPT0gTlVMTCkgcmV0dXJuKHIpOworCXA9ICpwcDsKKworCUFTTjFfcHV0X29iamVjdCgmcCwwLDEsVl9BU04xX0JPT0xFQU4sVl9BU04xX1VOSVZFUlNBTCk7CisJKihwKyspPSAodW5zaWduZWQgY2hhcilhOworCSpwcD1wOworCXJldHVybihyKTsKKwl9CisKK2ludCBkMmlfQVNOMV9CT09MRUFOKGludCAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCkKKwl7CisJaW50IHJldD0gLTE7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGxlbjsKKwlpbnQgaW5mLHRhZyx4Y2xhc3M7CisJaW50IGk9MDsKKworCXA9ICpwcDsKKwlpbmY9QVNOMV9nZXRfb2JqZWN0KCZwLCZsZW4sJnRhZywmeGNsYXNzLGxlbmd0aCk7CisJaWYgKGluZiAmIDB4ODApCisJCXsKKwkJaT1BU04xX1JfQkFEX09CSkVDVF9IRUFERVI7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAodGFnICE9IFZfQVNOMV9CT09MRUFOKQorCQl7CisJCWk9QVNOMV9SX0VYUEVDVElOR19BX0JPT0xFQU47CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAobGVuICE9IDEpCisJCXsKKwkJaT1BU04xX1JfQk9PTEVBTl9JU19XUk9OR19MRU5HVEg7CisJCWdvdG8gZXJyOworCQl9CisJcmV0PSAoaW50KSoocCsrKTsKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwkqcHA9cDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9CT09MRUFOLGkpOworCXJldHVybihyZXQpOworCX0KKworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2J5dGVzLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2J5dGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkNjMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfYnl0ZXMuYwpAQCAtMCwwICsxLDMxNCBAQAorLyogY3J5cHRvL2FzbjEvYV9ieXRlcy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKK3N0YXRpYyBpbnQgYXNuMV9jb2xsYXRlX3ByaW1pdGl2ZShBU04xX1NUUklORyAqYSwgQVNOMV9jb25zdF9DVFggKmMpOworLyogdHlwZSBpcyBhICdiaXRtYXAnIG9mIGFjY2VwdGFibGUgc3RyaW5nIHR5cGVzLgorICovCitBU04xX1NUUklORyAqZDJpX0FTTjFfdHlwZV9ieXRlcyhBU04xX1NUUklORyAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkgICAgIGxvbmcgbGVuZ3RoLCBpbnQgdHlwZSkKKwl7CisJQVNOMV9TVFJJTkcgKnJldD1OVUxMOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgY2hhciAqczsKKwlsb25nIGxlbjsKKwlpbnQgaW5mLHRhZyx4Y2xhc3M7CisJaW50IGk9MDsKKworCXA9ICpwcDsKKwlpbmY9QVNOMV9nZXRfb2JqZWN0KCZwLCZsZW4sJnRhZywmeGNsYXNzLGxlbmd0aCk7CisJaWYgKGluZiAmIDB4ODApIGdvdG8gZXJyOworCisJaWYgKHRhZyA+PSAzMikKKwkJeworCQlpPUFTTjFfUl9UQUdfVkFMVUVfVE9PX0hJR0g7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCEoQVNOMV90YWcyYml0KHRhZykgJiB0eXBlKSkKKwkJeworCQlpPUFTTjFfUl9XUk9OR19UWVBFOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogSWYgYSBiaXQtc3RyaW5nLCBleGl0IGVhcmx5ICovCisJaWYgKHRhZyA9PSBWX0FTTjFfQklUX1NUUklORykKKwkJcmV0dXJuKGQyaV9BU04xX0JJVF9TVFJJTkcoYSxwcCxsZW5ndGgpKTsKKworCWlmICgoYSA9PSBOVUxMKSB8fCAoKCphKSA9PSBOVUxMKSkKKwkJeworCQlpZiAoKHJldD1BU04xX1NUUklOR19uZXcoKSkgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCQl9CisJZWxzZQorCQlyZXQ9KCphKTsKKworCWlmIChsZW4gIT0gMCkKKwkJeworCQlzPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKGludClsZW4rMSk7CisJCWlmIChzID09IE5VTEwpCisJCQl7CisJCQlpPUVSUl9SX01BTExPQ19GQUlMVVJFOworCQkJZ290byBlcnI7CisJCQl9CisJCW1lbWNweShzLHAsKGludClsZW4pOworCQlzW2xlbl09J1wwJzsKKwkJcCs9bGVuOworCQl9CisJZWxzZQorCQlzPU5VTEw7CisKKwlpZiAocmV0LT5kYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShyZXQtPmRhdGEpOworCXJldC0+bGVuZ3RoPShpbnQpbGVuOworCXJldC0+ZGF0YT1zOworCXJldC0+dHlwZT10YWc7CisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7CisJKnBwPXA7CisJcmV0dXJuKHJldCk7CitlcnI6CisJQVNOMWVycihBU04xX0ZfRDJJX0FTTjFfVFlQRV9CWVRFUyxpKTsKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlBU04xX1NUUklOR19mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworaW50IGkyZF9BU04xX2J5dGVzKEFTTjFfU1RSSU5HICphLCB1bnNpZ25lZCBjaGFyICoqcHAsIGludCB0YWcsIGludCB4Y2xhc3MpCisJeworCWludCByZXQscixjb25zdHJ1Y3RlZDsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKGEgPT0gTlVMTCkgIHJldHVybigwKTsKKworCWlmICh0YWcgPT0gVl9BU04xX0JJVF9TVFJJTkcpCisJCXJldHVybihpMmRfQVNOMV9CSVRfU1RSSU5HKGEscHApKTsKKwkJCisJcmV0PWEtPmxlbmd0aDsKKwlyPUFTTjFfb2JqZWN0X3NpemUoMCxyZXQsdGFnKTsKKwlpZiAocHAgPT0gTlVMTCkgcmV0dXJuKHIpOworCXA9ICpwcDsKKworCWlmICgodGFnID09IFZfQVNOMV9TRVFVRU5DRSkgfHwgKHRhZyA9PSBWX0FTTjFfU0VUKSkKKwkJY29uc3RydWN0ZWQ9MTsKKwllbHNlCisJCWNvbnN0cnVjdGVkPTA7CisJQVNOMV9wdXRfb2JqZWN0KCZwLGNvbnN0cnVjdGVkLHJldCx0YWcseGNsYXNzKTsKKwltZW1jcHkocCxhLT5kYXRhLGEtPmxlbmd0aCk7CisJcCs9YS0+bGVuZ3RoOworCSpwcD0gcDsKKwlyZXR1cm4ocik7CisJfQorCitBU04xX1NUUklORyAqZDJpX0FTTjFfYnl0ZXMoQVNOMV9TVFJJTkcgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCwgaW50IFB0YWcsIGludCBQY2xhc3MpCisJeworCUFTTjFfU1RSSU5HICpyZXQ9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnM7CisJbG9uZyBsZW47CisJaW50IGluZix0YWcseGNsYXNzOworCWludCBpPTA7CisKKwlpZiAoKGEgPT0gTlVMTCkgfHwgKCgqYSkgPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9QVNOMV9TVFJJTkdfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTsKKwkJfQorCWVsc2UKKwkJcmV0PSgqYSk7CisKKwlwPSAqcHA7CisJaW5mPUFTTjFfZ2V0X29iamVjdCgmcCwmbGVuLCZ0YWcsJnhjbGFzcyxsZW5ndGgpOworCWlmIChpbmYgJiAweDgwKQorCQl7CisJCWk9QVNOMV9SX0JBRF9PQkpFQ1RfSEVBREVSOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHRhZyAhPSBQdGFnKQorCQl7CisJCWk9QVNOMV9SX1dST05HX1RBRzsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChpbmYgJiBWX0FTTjFfQ09OU1RSVUNURUQpCisJCXsKKwkJQVNOMV9jb25zdF9DVFggYzsKKworCQljLnBwPXBwOworCQljLnA9cDsKKwkJYy5pbmY9aW5mOworCQljLnNsZW49bGVuOworCQljLnRhZz1QdGFnOworCQljLnhjbGFzcz1QY2xhc3M7CisJCWMubWF4PShsZW5ndGggPT0gMCk/MDoocCtsZW5ndGgpOworCQlpZiAoIWFzbjFfY29sbGF0ZV9wcmltaXRpdmUocmV0LCZjKSkgCisJCQlnb3RvIGVycjsgCisJCWVsc2UKKwkJCXsKKwkJCXA9Yy5wOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWlmIChsZW4gIT0gMCkKKwkJCXsKKwkJCWlmICgocmV0LT5sZW5ndGggPCBsZW4pIHx8IChyZXQtPmRhdGEgPT0gTlVMTCkpCisJCQkJeworCQkJCWlmIChyZXQtPmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHJldC0+ZGF0YSk7CisJCQkJcz0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbGVuICsgMSk7CisJCQkJaWYgKHMgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlpPUVSUl9SX01BTExPQ19GQUlMVVJFOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UKKwkJCQlzPXJldC0+ZGF0YTsKKwkJCW1lbWNweShzLHAsKGludClsZW4pOworCQkJc1tsZW5dID0gJ1wwJzsKKwkJCXArPWxlbjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJcz1OVUxMOworCQkJaWYgKHJldC0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5kYXRhKTsKKwkJCX0KKworCQlyZXQtPmxlbmd0aD0oaW50KWxlbjsKKwkJcmV0LT5kYXRhPXM7CisJCXJldC0+dHlwZT1QdGFnOworCQl9CisKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwkqcHA9cDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlBU04xX1NUUklOR19mcmVlKHJldCk7CisJQVNOMWVycihBU04xX0ZfRDJJX0FTTjFfQllURVMsaSk7CisJcmV0dXJuKE5VTEwpOworCX0KKworCisvKiBXZSBhcmUgYWJvdXQgdG8gcGFyc2UgMC4ubiBkMmlfQVNOMV9ieXRlcyBvYmplY3RzLCB3ZSBhcmUgdG8gY29sbGFwc2UKKyAqIHRoZW0gaW50byB0aGUgb25lIHN0cnVjdHVyZSB0aGF0IGlzIHRoZW4gcmV0dXJuZWQgKi8KKy8qIFRoZXJlIGhhdmUgYmVlbiBhIGZldyBidWcgZml4ZXMgZm9yIHRoaXMgZnVuY3Rpb24gZnJvbQorICogUGF1bCBLZW9naCA8cGF1bC5rZW9naEBzc2UuaWU+LCBtYW55IHRoYW5rcyB0byBoaW0gKi8KK3N0YXRpYyBpbnQgYXNuMV9jb2xsYXRlX3ByaW1pdGl2ZShBU04xX1NUUklORyAqYSwgQVNOMV9jb25zdF9DVFggKmMpCisJeworCUFTTjFfU1RSSU5HICpvcz1OVUxMOworCUJVRl9NRU0gYjsKKwlpbnQgbnVtOworCisJYi5sZW5ndGg9MDsKKwliLm1heD0wOworCWIuZGF0YT1OVUxMOworCisJaWYgKGEgPT0gTlVMTCkKKwkJeworCQljLT5lcnJvcj1FUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVI7CisJCWdvdG8gZXJyOworCQl9CisKKwludW09MDsKKwlmb3IgKDs7KQorCQl7CisJCWlmIChjLT5pbmYgJiAxKQorCQkJeworCQkJYy0+ZW9zPUFTTjFfY29uc3RfY2hlY2tfaW5maW5pdGVfZW5kKCZjLT5wLAorCQkJCShsb25nKShjLT5tYXgtYy0+cCkpOworCQkJaWYgKGMtPmVvcykgYnJlYWs7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmIChjLT5zbGVuIDw9IDApIGJyZWFrOworCQkJfQorCisJCWMtPnE9Yy0+cDsKKwkJaWYgKGQyaV9BU04xX2J5dGVzKCZvcywmYy0+cCxjLT5tYXgtYy0+cCxjLT50YWcsYy0+eGNsYXNzKQorCQkJPT0gTlVMTCkKKwkJCXsKKwkJCWMtPmVycm9yPUVSUl9SX0FTTjFfTElCOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oJmIsbnVtK29zLT5sZW5ndGgpKQorCQkJeworCQkJYy0+ZXJyb3I9RVJSX1JfQlVGX0xJQjsKKwkJCWdvdG8gZXJyOworCQkJfQorCQltZW1jcHkoJihiLmRhdGFbbnVtXSksb3MtPmRhdGEsb3MtPmxlbmd0aCk7CisJCWlmICghKGMtPmluZiAmIDEpKQorCQkJYy0+c2xlbi09KGMtPnAtYy0+cSk7CisJCW51bSs9b3MtPmxlbmd0aDsKKwkJfQorCisJaWYgKCFhc24xX2NvbnN0X0ZpbmlzaChjKSkgZ290byBlcnI7CisKKwlhLT5sZW5ndGg9bnVtOworCWlmIChhLT5kYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShhLT5kYXRhKTsKKwlhLT5kYXRhPSh1bnNpZ25lZCBjaGFyICopYi5kYXRhOworCWlmIChvcyAhPSBOVUxMKSBBU04xX1NUUklOR19mcmVlKG9zKTsKKwlyZXR1cm4oMSk7CitlcnI6CisJQVNOMWVycihBU04xX0ZfQVNOMV9DT0xMQVRFX1BSSU1JVElWRSxjLT5lcnJvcik7CisJaWYgKG9zICE9IE5VTEwpIEFTTjFfU1RSSU5HX2ZyZWUob3MpOworCWlmIChiLmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGIuZGF0YSk7CisJcmV0dXJuKDApOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9kMmlfZnAuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfZDJpX2ZwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlNDBiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfZDJpX2ZwLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qIGNyeXB0by9hc24xL2FfZDJpX2ZwLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMV9tYWMuaD4KKworc3RhdGljIGludCBhc24xX2QyaV9yZWFkX2JpbyhCSU8gKmluLCBCVUZfTUVNICoqcGIpOworCisjaWZuZGVmIE5PX09MRF9BU04xCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisKK3ZvaWQgKkFTTjFfZDJpX2ZwKHZvaWQgKigqeG5ldykodm9pZCksIGQyaV9vZl92b2lkICpkMmksIEZJTEUgKmluLCB2b2lkICoqeCkKKyAgICAgICAgeworICAgICAgICBCSU8gKmI7CisgICAgICAgIHZvaWQgKnJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRDJJX0ZQLEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybihOVUxMKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsaW4sQklPX05PQ0xPU0UpOworICAgICAgICByZXQ9QVNOMV9kMmlfYmlvKHhuZXcsZDJpLGIseCk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK3ZvaWQgKkFTTjFfZDJpX2Jpbyh2b2lkICooKnhuZXcpKHZvaWQpLCBkMmlfb2Zfdm9pZCAqZDJpLCBCSU8gKmluLCB2b2lkICoqeCkKKwl7CisJQlVGX01FTSAqYiA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwl2b2lkICpyZXQ9TlVMTDsKKwlpbnQgbGVuOworCisJbGVuID0gYXNuMV9kMmlfcmVhZF9iaW8oaW4sICZiKTsKKwlpZihsZW4gPCAwKSBnb3RvIGVycjsKKworCXA9KHVuc2lnbmVkIGNoYXIgKiliLT5kYXRhOworCXJldD1kMmkoeCwmcCxsZW4pOworZXJyOgorCWlmIChiICE9IE5VTEwpIEJVRl9NRU1fZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNlbmRpZgorCit2b2lkICpBU04xX2l0ZW1fZDJpX2Jpbyhjb25zdCBBU04xX0lURU0gKml0LCBCSU8gKmluLCB2b2lkICp4KQorCXsKKwlCVUZfTUVNICpiID0gTlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXZvaWQgKnJldD1OVUxMOworCWludCBsZW47CisKKwlsZW4gPSBhc24xX2QyaV9yZWFkX2JpbyhpbiwgJmIpOworCWlmKGxlbiA8IDApIGdvdG8gZXJyOworCisJcD0oY29uc3QgdW5zaWduZWQgY2hhciAqKWItPmRhdGE7CisJcmV0PUFTTjFfaXRlbV9kMmkoeCwmcCxsZW4sIGl0KTsKK2VycjoKKwlpZiAoYiAhPSBOVUxMKSBCVUZfTUVNX2ZyZWUoYik7CisJcmV0dXJuKHJldCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCit2b2lkICpBU04xX2l0ZW1fZDJpX2ZwKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEZJTEUgKmluLCB2b2lkICp4KQorICAgICAgICB7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgY2hhciAqcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX0QySV9GUCxFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oTlVMTCk7CisJCX0KKyAgICAgICAgQklPX3NldF9mcChiLGluLEJJT19OT0NMT1NFKTsKKyAgICAgICAgcmV0PUFTTjFfaXRlbV9kMmlfYmlvKGl0LGIseCk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNkZWZpbmUgSEVBREVSX1NJWkUgICA4CitzdGF0aWMgaW50IGFzbjFfZDJpX3JlYWRfYmlvKEJJTyAqaW4sIEJVRl9NRU0gKipwYikKKwl7CisJQlVGX01FTSAqYjsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBpOworCWludCByZXQ9LTE7CisJQVNOMV9jb25zdF9DVFggYzsKKwlpbnQgd2FudD1IRUFERVJfU0laRTsKKwlpbnQgZW9zPTA7CisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2lhNjQpCisJLyogcGF0aGV0aWMgY29tcGlsZXIgYnVnIGluIGFsbCBrbm93biB2ZXJzaW9ucyBhcyBvZiBOb3YuIDIwMDIgKi8KKwlsb25nIG9mZj0wOworI2Vsc2UKKwlpbnQgb2ZmPTA7CisjZW5kaWYKKwlpbnQgbGVuPTA7CisKKwliPUJVRl9NRU1fbmV3KCk7CisJaWYgKGIgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0QySV9SRUFEX0JJTyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAtMTsKKwkJfQorCisJRVJSX2NsZWFyX2Vycm9yKCk7CisJZm9yICg7OykKKwkJeworCQlpZiAod2FudCA+PSAobGVuLW9mZikpCisJCQl7CisJCQl3YW50LT0obGVuLW9mZik7CisKKwkJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGIsbGVuK3dhbnQpKQorCQkJCXsKKwkJCQlBU04xZXJyKEFTTjFfRl9BU04xX0QySV9SRUFEX0JJTyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaT1CSU9fcmVhZChpbiwmKGItPmRhdGFbbGVuXSksd2FudCk7CisJCQlpZiAoKGkgPCAwKSAmJiAoKGxlbi1vZmYpID09IDApKQorCQkJCXsKKwkJCQlBU04xZXJyKEFTTjFfRl9BU04xX0QySV9SRUFEX0JJTyxBU04xX1JfTk9UX0VOT1VHSF9EQVRBKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoaSA+IDApCisJCQkJbGVuKz1pOworCQkJfQorCQkvKiBlbHNlIGRhdGEgYWxyZWFkeSBsb2FkZWQgKi8KKworCQlwPSh1bnNpZ25lZCBjaGFyICopJihiLT5kYXRhW29mZl0pOworCQljLnA9cDsKKwkJYy5pbmY9QVNOMV9nZXRfb2JqZWN0KCYoYy5wKSwmKGMuc2xlbiksJihjLnRhZyksJihjLnhjbGFzcyksCisJCQlsZW4tb2ZmKTsKKwkJaWYgKGMuaW5mICYgMHg4MCkKKwkJCXsKKwkJCXVuc2lnbmVkIGxvbmcgZTsKKworCQkJZT1FUlJfR0VUX1JFQVNPTihFUlJfcGVla19lcnJvcigpKTsKKwkJCWlmIChlICE9IEFTTjFfUl9UT09fTE9ORykKKwkJCQlnb3RvIGVycjsKKwkJCWVsc2UKKwkJCQlFUlJfY2xlYXJfZXJyb3IoKTsgLyogY2xlYXIgZXJyb3IgKi8KKwkJCX0KKwkJaT1jLnAtcDsvKiBoZWFkZXIgbGVuZ3RoICovCisJCW9mZis9aTsJLyogZW5kIG9mIGRhdGEgKi8KKworCQlpZiAoYy5pbmYgJiAxKQorCQkJeworCQkJLyogbm8gZGF0YSBib2R5IHNvIGdvIHJvdW5kIGFnYWluICovCisJCQllb3MrKzsKKwkJCXdhbnQ9SEVBREVSX1NJWkU7CisJCQl9CisJCWVsc2UgaWYgKGVvcyAmJiAoYy5zbGVuID09IDApICYmIChjLnRhZyA9PSBWX0FTTjFfRU9DKSkKKwkJCXsKKwkJCS8qIGVvcyB2YWx1ZSwgc28gZ28gYmFjayBhbmQgcmVhZCBhbm90aGVyIGhlYWRlciAqLworCQkJZW9zLS07CisJCQlpZiAoZW9zIDw9IDApCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJd2FudD1IRUFERVJfU0laRTsKKwkJCX0KKwkJZWxzZSAKKwkJCXsKKwkJCS8qIHN1Y2sgaW4gYy5zbGVuIGJ5dGVzIG9mIGRhdGEgKi8KKwkJCXdhbnQ9KGludCljLnNsZW47CisJCQlpZiAod2FudCA+IChsZW4tb2ZmKSkKKwkJCQl7CisJCQkJd2FudC09KGxlbi1vZmYpOworCQkJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGIsbGVuK3dhbnQpKQorCQkJCQl7CisJCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRDJJX1JFQURfQklPLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl3aGlsZSAod2FudCA+IDApCisJCQkJCXsKKwkJCQkJaT1CSU9fcmVhZChpbiwmKGItPmRhdGFbbGVuXSksd2FudCk7CisJCQkJCWlmIChpIDw9IDApCisJCQkJCQl7CisJCQkJCQlBU04xZXJyKEFTTjFfRl9BU04xX0QySV9SRUFEX0JJTywKKwkJCQkJCSAgICBBU04xX1JfTk9UX0VOT1VHSF9EQVRBKTsKKwkJCQkJCWdvdG8gZXJyOworCQkJCQkJfQorCQkJCQlsZW4rPWk7CisJCQkJCXdhbnQgLT0gaTsKKwkJCQkJfQorCQkJCX0KKwkJCW9mZis9KGludCljLnNsZW47CisJCQlpZiAoZW9zIDw9IDApCisJCQkJeworCQkJCWJyZWFrOworCQkJCX0KKwkJCWVsc2UKKwkJCQl3YW50PUhFQURFUl9TSVpFOworCQkJfQorCQl9CisKKwkqcGIgPSBiOworCXJldHVybiBvZmY7CitlcnI6CisJaWYgKGIgIT0gTlVMTCkgQlVGX01FTV9mcmVlKGIpOworCXJldHVybihyZXQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfZGlnZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2RpZ2VzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMGQ5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2RpZ2VzdC5jCkBAIC0wLDAgKzEsMTExIEBACisvKiBjcnlwdG8vYXNuMS9hX2RpZ2VzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgTk9fU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjaWZuZGVmIE5PX0FTTjFfT0xECisKK2ludCBBU04xX2RpZ2VzdChpMmRfb2Zfdm9pZCAqaTJkLCBjb25zdCBFVlBfTUQgKnR5cGUsIGNoYXIgKmRhdGEsCisJCXVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKmxlbikKKwl7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqc3RyLCpwOworCisJaT1pMmQoZGF0YSxOVUxMKTsKKwlpZiAoKHN0cj0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGkpKSA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRElHRVNULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJcD1zdHI7CisJaTJkKGRhdGEsJnApOworCisJRVZQX0RpZ2VzdChzdHIsIGksIG1kLCBsZW4sIHR5cGUsIE5VTEwpOworCU9QRU5TU0xfZnJlZShzdHIpOworCXJldHVybigxKTsKKwl9CisKKyNlbmRpZgorCisKK2ludCBBU04xX2l0ZW1fZGlnZXN0KGNvbnN0IEFTTjFfSVRFTSAqaXQsIGNvbnN0IEVWUF9NRCAqdHlwZSwgdm9pZCAqYXNuLAorCQl1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pCisJeworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKnN0ciA9IE5VTEw7CisKKwlpPUFTTjFfaXRlbV9pMmQoYXNuLCZzdHIsIGl0KTsKKwlpZiAoIXN0cikgcmV0dXJuKDApOworCisJRVZQX0RpZ2VzdChzdHIsIGksIG1kLCBsZW4sIHR5cGUsIE5VTEwpOworCU9QRU5TU0xfZnJlZShzdHIpOworCXJldHVybigxKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfZHVwLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2R1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ODk5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2R1cC5jCkBAIC0wLDAgKzEsMTA5IEBACisvKiBjcnlwdG8vYXNuMS9hX2R1cC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpZm5kZWYgTk9fT0xEX0FTTjEKKwordm9pZCAqQVNOMV9kdXAoaTJkX29mX3ZvaWQgKmkyZCwgZDJpX29mX3ZvaWQgKmQyaSwgdm9pZCAqeCkKKwl7CisJdW5zaWduZWQgY2hhciAqYiwqcDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwMjsKKwlpbnQgaTsKKwljaGFyICpyZXQ7CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisKKwlpPWkyZCh4LE5VTEwpOworCWI9T1BFTlNTTF9tYWxsb2MoaSsxMCk7CisJaWYgKGIgPT0gTlVMTCkKKwkJeyBBU04xZXJyKEFTTjFfRl9BU04xX0RVUCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IHJldHVybihOVUxMKTsgfQorCXA9IGI7CisJaT1pMmQoeCwmcCk7CisJcDI9IGI7CisJcmV0PWQyaShOVUxMLCZwMixpKTsKKwlPUEVOU1NMX2ZyZWUoYik7CisJcmV0dXJuKHJldCk7CisJfQorCisjZW5kaWYKKworLyogQVNOMV9JVEVNIHZlcnNpb24gb2YgZHVwOiB0aGlzIGZvbGxvd3MgdGhlIG1vZGVsIGFib3ZlIGV4Y2VwdCB3ZSBkb24ndCBuZWVkCisgKiB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyLiBBdCBzb21lIHBvaW50IHRoaXMgY291bGQgYmUgcmV3cml0dGVuIHRvIGRpcmVjdGx5IGR1cAorICogdGhlIHVuZGVybHlpbmcgc3RydWN0dXJlIGluc3RlYWQgb2YgZG9pbmcgYW5kIGVuY29kZSBhbmQgZGVjb2RlLgorICovCisKK3ZvaWQgKkFTTjFfaXRlbV9kdXAoY29uc3QgQVNOMV9JVEVNICppdCwgdm9pZCAqeCkKKwl7CisJdW5zaWduZWQgY2hhciAqYiA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGk7CisJdm9pZCAqcmV0OworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCisJaT1BU04xX2l0ZW1faTJkKHgsJmIsaXQpOworCWlmIChiID09IE5VTEwpCisJCXsgQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX0RVUCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IHJldHVybihOVUxMKTsgfQorCXA9IGI7CisJcmV0PUFTTjFfaXRlbV9kMmkoTlVMTCwmcCxpLCBpdCk7CisJT1BFTlNTTF9mcmVlKGIpOworCXJldHVybihyZXQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfZW51bS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9lbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU5YWExMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfZW51bS5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBjcnlwdG8vYXNuMS9hX2VudW0uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworLyogCisgKiBDb2RlIGZvciBFTlVNRVJBVEVEIHR5cGU6IGlkZW50aWNhbCB0byBJTlRFR0VSIGFwYXJ0IGZyb20gYSBkaWZmZXJlbnQgdGFnLgorICogZm9yIGNvbW1lbnRzIG9uIGVuY29kaW5nIHNlZSBhX2ludC5jCisgKi8KKworaW50IEFTTjFfRU5VTUVSQVRFRF9zZXQoQVNOMV9FTlVNRVJBVEVEICphLCBsb25nIHYpCisJeworCWludCBqLGs7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciBidWZbc2l6ZW9mKGxvbmcpKzFdOworCWxvbmcgZDsKKworCWEtPnR5cGU9Vl9BU04xX0VOVU1FUkFURUQ7CisJaWYgKGEtPmxlbmd0aCA8IChpbnQpKHNpemVvZihsb25nKSsxKSkKKwkJeworCQlpZiAoYS0+ZGF0YSAhPSBOVUxMKQorCQkJT1BFTlNTTF9mcmVlKGEtPmRhdGEpOworCQlpZiAoKGEtPmRhdGE9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhzaXplb2YobG9uZykrMSkpICE9IE5VTEwpCisJCQltZW1zZXQoKGNoYXIgKilhLT5kYXRhLDAsc2l6ZW9mKGxvbmcpKzEpOworCQl9CisJaWYgKGEtPmRhdGEgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0VOVU1FUkFURURfU0VULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJZD12OworCWlmIChkIDwgMCkKKwkJeworCQlkPSAtZDsKKwkJYS0+dHlwZT1WX0FTTjFfTkVHX0VOVU1FUkFURUQ7CisJCX0KKworCWZvciAoaT0wOyBpPHNpemVvZihsb25nKTsgaSsrKQorCQl7CisJCWlmIChkID09IDApIGJyZWFrOworCQlidWZbaV09KGludClkJjB4ZmY7CisJCWQ+Pj04OworCQl9CisJaj0wOworCWZvciAoaz1pLTE7IGsgPj0wOyBrLS0pCisJCWEtPmRhdGFbaisrXT1idWZba107CisJYS0+bGVuZ3RoPWo7CisJcmV0dXJuKDEpOworCX0KKworbG9uZyBBU04xX0VOVU1FUkFURURfZ2V0KEFTTjFfRU5VTUVSQVRFRCAqYSkKKwl7CisJaW50IG5lZz0wLGk7CisJbG9uZyByPTA7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMEwpOworCWk9YS0+dHlwZTsKKwlpZiAoaSA9PSBWX0FTTjFfTkVHX0VOVU1FUkFURUQpCisJCW5lZz0xOworCWVsc2UgaWYgKGkgIT0gVl9BU04xX0VOVU1FUkFURUQpCisJCXJldHVybiAtMTsKKwkKKwlpZiAoYS0+bGVuZ3RoID4gKGludClzaXplb2YobG9uZykpCisJCXsKKwkJLyogaG1tLi4uIGEgYml0IHVnbHkgKi8KKwkJcmV0dXJuKDB4ZmZmZmZmZmZMKTsKKwkJfQorCWlmIChhLT5kYXRhID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChpPTA7IGk8YS0+bGVuZ3RoOyBpKyspCisJCXsKKwkJcjw8PTg7CisJCXJ8PSh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV07CisJCX0KKwlpZiAobmVnKSByPSAtcjsKKwlyZXR1cm4ocik7CisJfQorCitBU04xX0VOVU1FUkFURUQgKkJOX3RvX0FTTjFfRU5VTUVSQVRFRChCSUdOVU0gKmJuLCBBU04xX0VOVU1FUkFURUQgKmFpKQorCXsKKwlBU04xX0VOVU1FUkFURUQgKnJldDsKKwlpbnQgbGVuLGo7CisKKwlpZiAoYWkgPT0gTlVMTCkKKwkJcmV0PU1fQVNOMV9FTlVNRVJBVEVEX25ldygpOworCWVsc2UKKwkJcmV0PWFpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9CTl9UT19BU04xX0VOVU1FUkFURUQsRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCWlmKEJOX2lzX25lZ2F0aXZlKGJuKSkgcmV0LT50eXBlID0gVl9BU04xX05FR19FTlVNRVJBVEVEOworCWVsc2UgcmV0LT50eXBlPVZfQVNOMV9FTlVNRVJBVEVEOworCWo9Qk5fbnVtX2JpdHMoYm4pOworCWxlbj0oKGogPT0gMCk/MDooKGovOCkrMSkpOworCWlmIChyZXQtPmxlbmd0aCA8IGxlbis0KQorCQl7CisJCXVuc2lnbmVkIGNoYXIgKm5ld19kYXRhPU9QRU5TU0xfcmVhbGxvYyhyZXQtPmRhdGEsIGxlbis0KTsKKwkJaWYgKCFuZXdfZGF0YSkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0JOX1RPX0FTTjFfRU5VTUVSQVRFRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcmV0LT5kYXRhPW5ld19kYXRhOworCQl9CisKKwlyZXQtPmxlbmd0aD1CTl9ibjJiaW4oYm4scmV0LT5kYXRhKTsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAocmV0ICE9IGFpKSBNX0FTTjFfRU5VTUVSQVRFRF9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworQklHTlVNICpBU04xX0VOVU1FUkFURURfdG9fQk4oQVNOMV9FTlVNRVJBVEVEICphaSwgQklHTlVNICpibikKKwl7CisJQklHTlVNICpyZXQ7CisKKwlpZiAoKHJldD1CTl9iaW4yYm4oYWktPmRhdGEsYWktPmxlbmd0aCxibikpID09IE5VTEwpCisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRU5VTUVSQVRFRF9UT19CTixBU04xX1JfQk5fTElCKTsKKwllbHNlIGlmKGFpLT50eXBlID09IFZfQVNOMV9ORUdfRU5VTUVSQVRFRCkgQk5fc2V0X25lZ2F0aXZlKHJldCwxKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2dlbnRtLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2dlbnRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc5YzZmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfZ2VudG0uYwpAQCAtMCwwICsxLDI2MyBAQAorLyogY3J5cHRvL2FzbjEvYV9nZW50bS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIEdFTkVSQUxJWkVEVElNRSBpbXBsZW1lbnRhdGlvbiwgd3JpdHRlbiBieSBTdGV2ZSBIZW5zb24uIEJhc2VkIG9uIFVUQ1RJTUUgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAib190aW1lLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpZiAwCisKK2ludCBpMmRfQVNOMV9HRU5FUkFMSVpFRFRJTUUoQVNOMV9HRU5FUkFMSVpFRFRJTUUgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwkvKiBLTFVER0UhIFdlIGNvbnZlcnQgdG8gYXNjaWkgYmVmb3JlIHdyaXRpbmcgREVSICovCisJaW50IGxlbjsKKwljaGFyIHRtcFsyNF07CisJQVNOMV9TVFJJTkcgdG1wc3RyID0gKihBU04xX1NUUklORyAqKWE7CisKKwlsZW4gPSB0bXBzdHIubGVuZ3RoOworCWViY2RpYzJhc2NpaSh0bXAsIHRtcHN0ci5kYXRhLCAobGVuID49IHNpemVvZiB0bXApID8gc2l6ZW9mIHRtcCA6IGxlbik7CisJdG1wc3RyLmRhdGEgPSB0bXA7CisKKwlhID0gKEFTTjFfR0VORVJBTElaRURUSU1FICopICZ0bXBzdHI7CisjZW5kaWYKKwlyZXR1cm4oaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCwKKwkJVl9BU04xX0dFTkVSQUxJWkVEVElNRSxWX0FTTjFfVU5JVkVSU0FMKSk7CisJfQorCisKK0FTTjFfR0VORVJBTElaRURUSU1FICpkMmlfQVNOMV9HRU5FUkFMSVpFRFRJTUUoQVNOMV9HRU5FUkFMSVpFRFRJTUUgKiphLAorCSAgICAgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCkKKwl7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnJldD1OVUxMOworCisJcmV0PShBU04xX0dFTkVSQUxJWkVEVElNRSAqKWQyaV9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKilhLHBwLGxlbmd0aCwKKwkJVl9BU04xX0dFTkVSQUxJWkVEVElNRSxWX0FTTjFfVU5JVkVSU0FMKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfRDJJX0FTTjFfR0VORVJBTElaRURUSU1FLEVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwlhc2NpaTJlYmNkaWMocmV0LT5kYXRhLCByZXQtPmRhdGEsIHJldC0+bGVuZ3RoKTsKKyNlbmRpZgorCWlmICghQVNOMV9HRU5FUkFMSVpFRFRJTUVfY2hlY2socmV0KSkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9HRU5FUkFMSVpFRFRJTUUsQVNOMV9SX0lOVkFMSURfVElNRV9GT1JNQVQpOworCQlnb3RvIGVycjsKKwkJfQorCisJcmV0dXJuKHJldCk7CitlcnI6CisJaWYgKChyZXQgIT0gTlVMTCkgJiYgKChhID09IE5VTEwpIHx8ICgqYSAhPSByZXQpKSkKKwkJTV9BU04xX0dFTkVSQUxJWkVEVElNRV9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworI2VuZGlmCisKK2ludCBBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjayhBU04xX0dFTkVSQUxJWkVEVElNRSAqZCkKKwl7CisJc3RhdGljIGNvbnN0IGludCBtaW5bOV09eyAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwfTsKKwlzdGF0aWMgY29uc3QgaW50IG1heFs5XT17OTksIDk5LDEyLDMxLDIzLDU5LDU5LDEyLDU5fTsKKwljaGFyICphOworCWludCBuLGksbCxvOworCisJaWYgKGQtPnR5cGUgIT0gVl9BU04xX0dFTkVSQUxJWkVEVElNRSkgcmV0dXJuKDApOworCWw9ZC0+bGVuZ3RoOworCWE9KGNoYXIgKilkLT5kYXRhOworCW89MDsKKwkvKiBHRU5FUkFMSVpFRFRJTUUgaXMgc2ltaWxhciB0byBVVENUSU1FIGV4Y2VwdCB0aGUgeWVhciBpcworICAgICAgICAgKiByZXByZXNlbnRlZCBhcyBZWVlZLiBUaGlzIHN0dWZmIHRyZWF0cyBldmVyeXRoaW5nIGFzIGEgdHdvIGRpZ2l0CisgICAgICAgICAqIGZpZWxkIHNvIG1ha2UgZmlyc3QgdHdvIGZpZWxkcyAwMCB0byA5OQorICAgICAgICAgKi8KKwlpZiAobCA8IDEzKSBnb3RvIGVycjsKKwlmb3IgKGk9MDsgaTw3OyBpKyspCisJCXsKKwkJaWYgKChpID09IDYpICYmICgoYVtvXSA9PSAnWicpIHx8CisJCQkoYVtvXSA9PSAnKycpIHx8IChhW29dID09ICctJykpKQorCQkJeyBpKys7IGJyZWFrOyB9CisJCWlmICgoYVtvXSA8ICcwJykgfHwgKGFbb10gPiAnOScpKSBnb3RvIGVycjsKKwkJbj0gYVtvXS0nMCc7CisJCWlmICgrK28gPiBsKSBnb3RvIGVycjsKKworCQlpZiAoKGFbb10gPCAnMCcpIHx8IChhW29dID4gJzknKSkgZ290byBlcnI7CisJCW49KG4qMTApKyBhW29dLScwJzsKKwkJaWYgKCsrbyA+IGwpIGdvdG8gZXJyOworCisJCWlmICgobiA8IG1pbltpXSkgfHwgKG4gPiBtYXhbaV0pKSBnb3RvIGVycjsKKwkJfQorCS8qIE9wdGlvbmFsIGZyYWN0aW9uYWwgc2Vjb25kczogZGVjaW1hbCBwb2ludCBmb2xsb3dlZCBieSBvbmUKKwkgKiBvciBtb3JlIGRpZ2l0cy4KKwkgKi8KKwlpZiAoYVtvXSA9PSAnLicpCisJCXsKKwkJaWYgKCsrbyA+IGwpIGdvdG8gZXJyOworCQlpID0gbzsKKwkJd2hpbGUgKChhW29dID49ICcwJykgJiYgKGFbb10gPD0gJzknKSAmJiAobyA8PSBsKSkKKwkJCW8rKzsKKwkJLyogTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBkaWdpdCBhZnRlciBkZWNpbWFsIHBvaW50ICovCisJCWlmIChpID09IG8pIGdvdG8gZXJyOworCQl9CisKKwlpZiAoYVtvXSA9PSAnWicpCisJCW8rKzsKKwllbHNlIGlmICgoYVtvXSA9PSAnKycpIHx8IChhW29dID09ICctJykpCisJCXsKKwkJbysrOworCQlpZiAobys0ID4gbCkgZ290byBlcnI7CisJCWZvciAoaT03OyBpPDk7IGkrKykKKwkJCXsKKwkJCWlmICgoYVtvXSA8ICcwJykgfHwgKGFbb10gPiAnOScpKSBnb3RvIGVycjsKKwkJCW49IGFbb10tJzAnOworCQkJbysrOworCQkJaWYgKChhW29dIDwgJzAnKSB8fCAoYVtvXSA+ICc5JykpIGdvdG8gZXJyOworCQkJbj0obioxMCkrIGFbb10tJzAnOworCQkJaWYgKChuIDwgbWluW2ldKSB8fCAobiA+IG1heFtpXSkpIGdvdG8gZXJyOworCQkJbysrOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCS8qIE1pc3NpbmcgdGltZSB6b25lIGluZm9ybWF0aW9uLiAqLworCQlnb3RvIGVycjsKKwkJfQorCXJldHVybihvID09IGwpOworZXJyOgorCXJldHVybigwKTsKKwl9CisKK2ludCBBU04xX0dFTkVSQUxJWkVEVElNRV9zZXRfc3RyaW5nKEFTTjFfR0VORVJBTElaRURUSU1FICpzLCBjb25zdCBjaGFyICpzdHIpCisJeworCUFTTjFfR0VORVJBTElaRURUSU1FIHQ7CisKKwl0LnR5cGU9Vl9BU04xX0dFTkVSQUxJWkVEVElNRTsKKwl0Lmxlbmd0aD1zdHJsZW4oc3RyKTsKKwl0LmRhdGE9KHVuc2lnbmVkIGNoYXIgKilzdHI7CisJaWYgKEFTTjFfR0VORVJBTElaRURUSU1FX2NoZWNrKCZ0KSkKKwkJeworCQlpZiAocyAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFBU04xX1NUUklOR19zZXQoKEFTTjFfU1RSSU5HICopcywKKwkJCQkodW5zaWduZWQgY2hhciAqKXN0cix0Lmxlbmd0aCkpCisJCQkJcmV0dXJuIDA7CisJCQlzLT50eXBlPVZfQVNOMV9HRU5FUkFMSVpFRFRJTUU7CisJCQl9CisJCXJldHVybigxKTsKKwkJfQorCWVsc2UKKwkJcmV0dXJuKDApOworCX0KKworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKkFTTjFfR0VORVJBTElaRURUSU1FX3NldChBU04xX0dFTkVSQUxJWkVEVElNRSAqcywKKwkgICAgIHRpbWVfdCB0KQorCXsKKwkJcmV0dXJuIEFTTjFfR0VORVJBTElaRURUSU1FX2FkaihzLCB0LCAwLCAwKTsKKwl9CisKK0FTTjFfR0VORVJBTElaRURUSU1FICpBU04xX0dFTkVSQUxJWkVEVElNRV9hZGooQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnMsCisJICAgICB0aW1lX3QgdCwgaW50IG9mZnNldF9kYXksIGxvbmcgb2Zmc2V0X3NlYykKKwl7CisJY2hhciAqcDsKKwlzdHJ1Y3QgdG0gKnRzOworCXN0cnVjdCB0bSBkYXRhOworCXNpemVfdCBsZW4gPSAyMDsgCisKKwlpZiAocyA9PSBOVUxMKQorCQlzPU1fQVNOMV9HRU5FUkFMSVpFRFRJTUVfbmV3KCk7CisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuKE5VTEwpOworCisJdHM9T1BFTlNTTF9nbXRpbWUoJnQsICZkYXRhKTsKKwlpZiAodHMgPT0gTlVMTCkKKwkJcmV0dXJuKE5VTEwpOworCisJaWYgKG9mZnNldF9kYXkgfHwgb2Zmc2V0X3NlYykKKwkJeyAKKwkJaWYgKCFPUEVOU1NMX2dtdGltZV9hZGoodHMsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpKQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCXA9KGNoYXIgKilzLT5kYXRhOworCWlmICgocCA9PSBOVUxMKSB8fCAoKHNpemVfdClzLT5sZW5ndGggPCBsZW4pKQorCQl7CisJCXA9T1BFTlNTTF9tYWxsb2MobGVuKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfR0VORVJBTElaRURUSU1FX0FESiwKKwkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCWlmIChzLT5kYXRhICE9IE5VTEwpCisJCQlPUEVOU1NMX2ZyZWUocy0+ZGF0YSk7CisJCXMtPmRhdGE9KHVuc2lnbmVkIGNoYXIgKilwOworCQl9CisKKwlCSU9fc25wcmludGYocCxsZW4sIiUwNGQlMDJkJTAyZCUwMmQlMDJkJTAyZFoiLHRzLT50bV95ZWFyICsgMTkwMCwKKwkJICAgICB0cy0+dG1fbW9uKzEsdHMtPnRtX21kYXksdHMtPnRtX2hvdXIsdHMtPnRtX21pbix0cy0+dG1fc2VjKTsKKwlzLT5sZW5ndGg9c3RybGVuKHApOworCXMtPnR5cGU9Vl9BU04xX0dFTkVSQUxJWkVEVElNRTsKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQ19ub3QKKwllYmNkaWMyYXNjaWkocy0+ZGF0YSwgcy0+ZGF0YSwgcy0+bGVuZ3RoKTsKKyNlbmRpZgorCXJldHVybihzKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2kyZF9mcC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FkNzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9pMmRfZnAuYwpAQCAtMCwwICsxLDE2MyBAQAorLyogY3J5cHRvL2FzbjEvYV9pMmRfZnAuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpZm5kZWYgTk9fT0xEX0FTTjEKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IEFTTjFfaTJkX2ZwKGkyZF9vZl92b2lkICppMmQsIEZJTEUgKm91dCwgdm9pZCAqeCkKKyAgICAgICAgeworICAgICAgICBCSU8gKmI7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0kyRF9GUCxFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisJCX0KKyAgICAgICAgQklPX3NldF9mcChiLG91dCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1BU04xX2kyZF9iaW8oaTJkLGIseCk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK2ludCBBU04xX2kyZF9iaW8oaTJkX29mX3ZvaWQgKmkyZCwgQklPICpvdXQsIHVuc2lnbmVkIGNoYXIgKngpCisJeworCWNoYXIgKmI7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaSxqPTAsbixyZXQ9MTsKKworCW49aTJkKHgsTlVMTCk7CisJYj0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKG4pOworCWlmIChiID09IE5VTEwpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9JMkRfQklPLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlwPSh1bnNpZ25lZCBjaGFyICopYjsKKwlpMmQoeCwmcCk7CisJCisJZm9yICg7OykKKwkJeworCQlpPUJJT193cml0ZShvdXQsJihiW2pdKSxuKTsKKwkJaWYgKGkgPT0gbikgYnJlYWs7CisJCWlmIChpIDw9IDApCisJCQl7CisJCQlyZXQ9MDsKKwkJCWJyZWFrOworCQkJfQorCQlqKz1pOworCQluLT1pOworCQl9CisJT1BFTlNTTF9mcmVlKGIpOworCXJldHVybihyZXQpOworCX0KKworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBBU04xX2l0ZW1faTJkX2ZwKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEZJTEUgKm91dCwgdm9pZCAqeCkKKyAgICAgICAgeworICAgICAgICBCSU8gKmI7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fSTJEX0ZQLEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsb3V0LEJJT19OT0NMT1NFKTsKKyAgICAgICAgcmV0PUFTTjFfaXRlbV9pMmRfYmlvKGl0LGIseCk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK2ludCBBU04xX2l0ZW1faTJkX2Jpbyhjb25zdCBBU04xX0lURU0gKml0LCBCSU8gKm91dCwgdm9pZCAqeCkKKwl7CisJdW5zaWduZWQgY2hhciAqYiA9IE5VTEw7CisJaW50IGksaj0wLG4scmV0PTE7CisKKwluID0gQVNOMV9pdGVtX2kyZCh4LCAmYiwgaXQpOworCWlmIChiID09IE5VTEwpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX0kyRF9CSU8sRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKworCWZvciAoOzspCisJCXsKKwkJaT1CSU9fd3JpdGUob3V0LCYoYltqXSksbik7CisJCWlmIChpID09IG4pIGJyZWFrOworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJcmV0PTA7CisJCQlicmVhazsKKwkJCX0KKwkJais9aTsKKwkJbi09aTsKKwkJfQorCU9QRU5TU0xfZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX2ludC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmZkMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9pbnQuYwpAQCAtMCwwICsxLDQ1OSBAQAorLyogY3J5cHRvL2FzbjEvYV9pbnQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworQVNOMV9JTlRFR0VSICpBU04xX0lOVEVHRVJfZHVwKGNvbnN0IEFTTjFfSU5URUdFUiAqeCkKK3sgcmV0dXJuIE1fQVNOMV9JTlRFR0VSX2R1cCh4KTt9CisKK2ludCBBU04xX0lOVEVHRVJfY21wKGNvbnN0IEFTTjFfSU5URUdFUiAqeCwgY29uc3QgQVNOMV9JTlRFR0VSICp5KQorCXsgCisJaW50IG5lZywgcmV0OworCS8qIENvbXBhcmUgc2lnbnMgKi8KKwluZWcgPSB4LT50eXBlICYgVl9BU04xX05FRzsKKwlpZiAobmVnICE9ICh5LT50eXBlICYgVl9BU04xX05FRykpCisJCXsKKwkJaWYgKG5lZykKKwkJCXJldHVybiAtMTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJCX0KKworCXJldCA9IEFTTjFfU1RSSU5HX2NtcCh4LCB5KTsKKworCWlmIChuZWcpCisJCXJldHVybiAtcmV0OworCWVsc2UKKwkJcmV0dXJuIHJldDsKKwl9CisJCisKKy8qIAorICogVGhpcyBjb252ZXJ0cyBhbiBBU04xIElOVEVHRVIgaW50byBpdHMgY29udGVudCBlbmNvZGluZy4KKyAqIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBpcyBhbiBBU04xX1NUUklORyB3aG9zZSBkYXRhIGlzIGEgYmlnIGVuZGlhbgorICogcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLCBpZ25vcmluZyB0aGUgc2lnbi4gVGhlIHNpZ24gaXMgZGV0ZXJtaW5lZCBieQorICogdGhlIHR5cGU6IFZfQVNOMV9JTlRFR0VSIGZvciBwb3NpdGl2ZSBhbmQgVl9BU04xX05FR19JTlRFR0VSIGZvciBuZWdhdGl2ZS4gCisgKgorICogUG9zaXRpdmUgaW50ZWdlcnMgYXJlIG5vIHByb2JsZW06IHRoZXkgYXJlIGFsbW9zdCB0aGUgc2FtZSBhcyB0aGUgREVSCisgKiBlbmNvZGluZywgZXhjZXB0IGlmIHRoZSBmaXJzdCBieXRlIGlzID49IDB4ODAgd2UgbmVlZCB0byBhZGQgYSB6ZXJvIHBhZC4KKyAqCisgKiBOZWdhdGl2ZSBpbnRlZ2VycyBhcmUgYSBiaXQgdHJpY2tpZXIuLi4KKyAqIFRoZSBERVIgcmVwcmVzZW50YXRpb24gb2YgbmVnYXRpdmUgaW50ZWdlcnMgaXMgaW4gMnMgY29tcGxlbWVudCBmb3JtLgorICogVGhlIGludGVybmFsIGZvcm0gaXMgY29udmVydGVkIGJ5IGNvbXBsZW1lbnRpbmcgZWFjaCBvY3RldCBhbmQgZmluYWxseSAKKyAqIGFkZGluZyBvbmUgdG8gdGhlIHJlc3VsdC4gVGhpcyBjYW4gYmUgZG9uZSBsZXNzIG1lc3NpbHkgd2l0aCBhIGxpdHRsZSB0cmljay4KKyAqIElmIHRoZSBpbnRlcm5hbCBmb3JtIGhhcyB0cmFpbGluZyB6ZXJvZXMgdGhlbiB0aGV5IHdpbGwgYmVjb21lIEZGIGJ5IHRoZQorICogY29tcGxlbWVudCBhbmQgMCBieSB0aGUgYWRkIG9uZSAoZHVlIHRvIGNhcnJ5KSBzbyBqdXN0IGNvcHkgYXMgbWFueSB0cmFpbGluZyAKKyAqIHplcm9zIHRvIHRoZSBkZXN0aW5hdGlvbiBhcyB0aGVyZSBhcmUgaW4gdGhlIHNvdXJjZS4gVGhlIGNhcnJ5IHdpbGwgYWRkIG9uZQorICogdG8gdGhlIGxhc3Qgbm9uZSB6ZXJvIG9jdGV0OiBzbyBjb21wbGVtZW50IHRoaXMgb2N0ZXQgYW5kIGFkZCBvbmUgYW5kIGZpbmFsbHkKKyAqIGNvbXBsZW1lbnQgYW55IGxlZnQgb3ZlciB1bnRpbCB5b3UgZ2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLgorICoKKyAqIFBhZGRpbmcgaXMgYSBsaXR0bGUgdHJpY2tpZXIgdG9vLiBJZiB0aGUgZmlyc3QgYnl0ZXMgaXMgPiAweDgwIHRoZW4gd2UgcGFkCisgKiB3aXRoIDB4ZmYuIEhvd2V2ZXIgaWYgdGhlIGZpcnN0IGJ5dGUgaXMgMHg4MCBhbmQgb25lIG9mIHRoZSBmb2xsb3dpbmcgYnl0ZXMKKyAqIGlzIG5vbi16ZXJvIHdlIHBhZCB3aXRoIDB4ZmYuIFRoZSByZWFzb24gZm9yIHRoaXMgZGlzdGluY3Rpb24gaXMgdGhhdCAweDgwCisgKiBmb2xsb3dlZCBieSBvcHRpb25hbCB6ZXJvcyBpc24ndCBwYWRkZWQuCisgKi8KKworaW50IGkyY19BU04xX0lOVEVHRVIoQVNOMV9JTlRFR0VSICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCWludCBwYWQ9MCxyZXQsaSxuZWc7CisJdW5zaWduZWQgY2hhciAqcCwqbixwYj0wOworCisJaWYgKChhID09IE5VTEwpIHx8IChhLT5kYXRhID09IE5VTEwpKSByZXR1cm4oMCk7CisJbmVnPWEtPnR5cGUgJiBWX0FTTjFfTkVHOworCWlmIChhLT5sZW5ndGggPT0gMCkKKwkJcmV0PTE7CisJZWxzZQorCQl7CisJCXJldD1hLT5sZW5ndGg7CisJCWk9YS0+ZGF0YVswXTsKKwkJaWYgKCFuZWcgJiYgKGkgPiAxMjcpKSB7CisJCQlwYWQ9MTsKKwkJCXBiPTA7CisJCX0gZWxzZSBpZihuZWcpIHsKKwkJCWlmKGk+MTI4KSB7CisJCQkJcGFkPTE7CisJCQkJcGI9MHhGRjsKKwkJCX0gZWxzZSBpZihpID09IDEyOCkgeworCQkJLyoKKwkJCSAqIFNwZWNpYWwgY2FzZTogaWYgYW55IG90aGVyIGJ5dGVzIG5vbiB6ZXJvIHdlIHBhZDoKKwkJCSAqIG90aGVyd2lzZSB3ZSBkb24ndC4KKwkJCSAqLworCQkJCWZvcihpID0gMTsgaSA8IGEtPmxlbmd0aDsgaSsrKSBpZihhLT5kYXRhW2ldKSB7CisJCQkJCQlwYWQ9MTsKKwkJCQkJCXBiPTB4RkY7CisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0Kz1wYWQ7CisJCX0KKwlpZiAocHAgPT0gTlVMTCkgcmV0dXJuKHJldCk7CisJcD0gKnBwOworCisJaWYgKHBhZCkgKihwKyspPXBiOworCWlmIChhLT5sZW5ndGggPT0gMCkgKihwKyspPTA7CisJZWxzZSBpZiAoIW5lZykgbWVtY3B5KHAsYS0+ZGF0YSwodW5zaWduZWQgaW50KWEtPmxlbmd0aCk7CisJZWxzZSB7CisJCS8qIEJlZ2luIGF0IHRoZSBlbmQgb2YgdGhlIGVuY29kaW5nICovCisJCW49YS0+ZGF0YSArIGEtPmxlbmd0aCAtIDE7CisJCXAgKz0gYS0+bGVuZ3RoIC0gMTsKKwkJaSA9IGEtPmxlbmd0aDsKKwkJLyogQ29weSB6ZXJvcyB0byBkZXN0aW5hdGlvbiBhcyBsb25nIGFzIHNvdXJjZSBpcyB6ZXJvICovCisJCXdoaWxlKCEqbikgeworCQkJKihwLS0pID0gMDsKKwkJCW4tLTsKKwkJCWktLTsKKwkJfQorCQkvKiBDb21wbGVtZW50IGFuZCBpbmNyZW1lbnQgbmV4dCBvY3RldCAqLworCQkqKHAtLSkgPSAoKCoobi0tKSkgXiAweGZmKSArIDE7CisJCWktLTsKKwkJLyogQ29tcGxlbWVudCBhbnkgb2N0ZXRzIGxlZnQgKi8KKwkJZm9yKDtpID4gMDsgaS0tKSAqKHAtLSkgPSAqKG4tLSkgXiAweGZmOworCX0KKworCSpwcCs9cmV0OworCXJldHVybihyZXQpOworCX0KKworLyogQ29udmVydCBqdXN0IEFTTjEgSU5URUdFUiBjb250ZW50IG9jdGV0cyB0byBBU04xX0lOVEVHRVIgc3RydWN0dXJlICovCisKK0FTTjFfSU5URUdFUiAqYzJpX0FTTjFfSU5URUdFUihBU04xX0lOVEVHRVIgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbikKKwl7CisJQVNOMV9JTlRFR0VSICpyZXQ9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCAqcGVuZDsKKwl1bnNpZ25lZCBjaGFyICp0bywqczsKKwlpbnQgaTsKKworCWlmICgoYSA9PSBOVUxMKSB8fCAoKCphKSA9PSBOVUxMKSkKKwkJeworCQlpZiAoKHJldD1NX0FTTjFfSU5URUdFUl9uZXcoKSkgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCQlyZXQtPnR5cGU9Vl9BU04xX0lOVEVHRVI7CisJCX0KKwllbHNlCisJCXJldD0oKmEpOworCisJcD0gKnBwOworCXBlbmQgPSBwICsgbGVuOworCisJLyogV2UgbXVzdCBPUEVOU1NMX21hbGxvYyBzdHVmZiwgZXZlbiBmb3IgMCBieXRlcyBvdGhlcndpc2UgaXQKKwkgKiBzaWduaWZpZXMgYSBtaXNzaW5nIE5VTEwgcGFyYW1ldGVyLiAqLworCXM9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygoaW50KWxlbisxKTsKKwlpZiAocyA9PSBOVUxMKQorCQl7CisJCWk9RVJSX1JfTUFMTE9DX0ZBSUxVUkU7CisJCWdvdG8gZXJyOworCQl9CisJdG89czsKKwlpZighbGVuKSB7CisJCS8qIFN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXMgYW4gaWxsZWdhbCBJTlRFR0VSIGJ1dCB3ZQorCQkgKiB0b2xlcmF0ZSBpdC4KKwkJICovCisJCXJldC0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKwl9IGVsc2UgaWYgKCpwICYgMHg4MCkgLyogYSBuZWdhdGl2ZSBudW1iZXIgKi8KKwkJeworCQlyZXQtPnR5cGU9Vl9BU04xX05FR19JTlRFR0VSOworCQlpZiAoKCpwID09IDB4ZmYpICYmIChsZW4gIT0gMSkpIHsKKwkJCXArKzsKKwkJCWxlbi0tOworCQl9CisJCWkgPSBsZW47CisJCXAgKz0gaSAtIDE7CisJCXRvICs9IGkgLSAxOworCQl3aGlsZSgoISpwKSAmJiBpKSB7CisJCQkqKHRvLS0pID0gMDsKKwkJCWktLTsKKwkJCXAtLTsKKwkJfQorCQkvKiBTcGVjaWFsIGNhc2U6IGlmIGFsbCB6ZXJvcyB0aGVuIHRoZSBudW1iZXIgd2lsbCBiZSBvZgorCQkgKiB0aGUgZm9ybSBGRiBmb2xsb3dlZCBieSBuIHplcm8gYnl0ZXM6IHRoaXMgY29ycmVzcG9uZHMgdG8KKwkJICogMSBmb2xsb3dlZCBieSBuIHplcm8gYnl0ZXMuIFdlJ3ZlIGFscmVhZHkgd3JpdHRlbiBuIHplcm9zCisJCSAqIHNvIHdlIGp1c3QgYXBwZW5kIGFuIGV4dHJhIG9uZSBhbmQgc2V0IHRoZSBmaXJzdCBieXRlIHRvCisJCSAqIGEgMS4gVGhpcyBpcyB0cmVhdGVkIHNlcGFyYXRlbHkgYmVjYXVzZSBpdCBpcyB0aGUgb25seSBjYXNlCisJCSAqIHdoZXJlIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgbGFyZ2VyIHRoYW4gbGVuLgorCQkgKi8KKwkJaWYoIWkpIHsKKwkJCSpzID0gMTsKKwkJCXNbbGVuXSA9IDA7CisJCQlsZW4rKzsKKwkJfSBlbHNlIHsKKwkJCSoodG8tLSkgPSAoKihwLS0pIF4gMHhmZikgKyAxOworCQkJaS0tOworCQkJZm9yKDtpID4gMDsgaS0tKSAqKHRvLS0pID0gKihwLS0pIF4gMHhmZjsKKwkJfQorCX0gZWxzZSB7CisJCXJldC0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKwkJaWYgKCgqcCA9PSAwKSAmJiAobGVuICE9IDEpKQorCQkJeworCQkJcCsrOworCQkJbGVuLS07CisJCQl9CisJCW1lbWNweShzLHAsKGludClsZW4pOworCX0KKworCWlmIChyZXQtPmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHJldC0+ZGF0YSk7CisJcmV0LT5kYXRhPXM7CisJcmV0LT5sZW5ndGg9KGludClsZW47CisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7CisJKnBwPXBlbmQ7CisJcmV0dXJuKHJldCk7CitlcnI6CisJQVNOMWVycihBU04xX0ZfQzJJX0FTTjFfSU5URUdFUixpKTsKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlNX0FTTjFfSU5URUdFUl9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworCisvKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBkMmlfQVNOMV9JTlRFR0VSIHRoYXQgaWdub3JlcyB0aGUgc2lnbiBiaXQgb2YKKyAqIEFTTjEgaW50ZWdlcnM6IHNvbWUgYnJva2VuIHNvZnR3YXJlIGNhbiBlbmNvZGUgYSBwb3NpdGl2ZSBJTlRFR0VSCisgKiB3aXRoIGl0cyBNU0Igc2V0IGFzIG5lZ2F0aXZlIChpdCBkb2Vzbid0IGFkZCBhIHBhZGRpbmcgemVybykuCisgKi8KKworQVNOMV9JTlRFR0VSICpkMmlfQVNOMV9VSU5URUdFUihBU04xX0lOVEVHRVIgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCkKKwl7CisJQVNOMV9JTlRFR0VSICpyZXQ9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKnRvLCpzOworCWxvbmcgbGVuOworCWludCBpbmYsdGFnLHhjbGFzczsKKwlpbnQgaTsKKworCWlmICgoYSA9PSBOVUxMKSB8fCAoKCphKSA9PSBOVUxMKSkKKwkJeworCQlpZiAoKHJldD1NX0FTTjFfSU5URUdFUl9uZXcoKSkgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCQlyZXQtPnR5cGU9Vl9BU04xX0lOVEVHRVI7CisJCX0KKwllbHNlCisJCXJldD0oKmEpOworCisJcD0gKnBwOworCWluZj1BU04xX2dldF9vYmplY3QoJnAsJmxlbiwmdGFnLCZ4Y2xhc3MsbGVuZ3RoKTsKKwlpZiAoaW5mICYgMHg4MCkKKwkJeworCQlpPUFTTjFfUl9CQURfT0JKRUNUX0hFQURFUjsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICh0YWcgIT0gVl9BU04xX0lOVEVHRVIpCisJCXsKKwkJaT1BU04xX1JfRVhQRUNUSU5HX0FOX0lOVEVHRVI7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBXZSBtdXN0IE9QRU5TU0xfbWFsbG9jIHN0dWZmLCBldmVuIGZvciAwIGJ5dGVzIG90aGVyd2lzZSBpdAorCSAqIHNpZ25pZmllcyBhIG1pc3NpbmcgTlVMTCBwYXJhbWV0ZXIuICovCisJcz0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbGVuKzEpOworCWlmIChzID09IE5VTEwpCisJCXsKKwkJaT1FUlJfUl9NQUxMT0NfRkFJTFVSRTsKKwkJZ290byBlcnI7CisJCX0KKwl0bz1zOworCXJldC0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKwlpZihsZW4pIHsKKwkJaWYgKCgqcCA9PSAwKSAmJiAobGVuICE9IDEpKQorCQkJeworCQkJcCsrOworCQkJbGVuLS07CisJCQl9CisJCW1lbWNweShzLHAsKGludClsZW4pOworCQlwKz1sZW47CisJfQorCisJaWYgKHJldC0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5kYXRhKTsKKwlyZXQtPmRhdGE9czsKKwlyZXQtPmxlbmd0aD0oaW50KWxlbjsKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwkqcHA9cDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9VSU5URUdFUixpKTsKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlNX0FTTjFfSU5URUdFUl9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworaW50IEFTTjFfSU5URUdFUl9zZXQoQVNOMV9JTlRFR0VSICphLCBsb25nIHYpCisJeworCWludCBqLGs7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciBidWZbc2l6ZW9mKGxvbmcpKzFdOworCWxvbmcgZDsKKworCWEtPnR5cGU9Vl9BU04xX0lOVEVHRVI7CisJaWYgKGEtPmxlbmd0aCA8IChpbnQpKHNpemVvZihsb25nKSsxKSkKKwkJeworCQlpZiAoYS0+ZGF0YSAhPSBOVUxMKQorCQkJT1BFTlNTTF9mcmVlKGEtPmRhdGEpOworCQlpZiAoKGEtPmRhdGE9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhzaXplb2YobG9uZykrMSkpICE9IE5VTEwpCisJCQltZW1zZXQoKGNoYXIgKilhLT5kYXRhLDAsc2l6ZW9mKGxvbmcpKzEpOworCQl9CisJaWYgKGEtPmRhdGEgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0lOVEVHRVJfU0VULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJZD12OworCWlmIChkIDwgMCkKKwkJeworCQlkPSAtZDsKKwkJYS0+dHlwZT1WX0FTTjFfTkVHX0lOVEVHRVI7CisJCX0KKworCWZvciAoaT0wOyBpPHNpemVvZihsb25nKTsgaSsrKQorCQl7CisJCWlmIChkID09IDApIGJyZWFrOworCQlidWZbaV09KGludClkJjB4ZmY7CisJCWQ+Pj04OworCQl9CisJaj0wOworCWZvciAoaz1pLTE7IGsgPj0wOyBrLS0pCisJCWEtPmRhdGFbaisrXT1idWZba107CisJYS0+bGVuZ3RoPWo7CisJcmV0dXJuKDEpOworCX0KKworbG9uZyBBU04xX0lOVEVHRVJfZ2V0KGNvbnN0IEFTTjFfSU5URUdFUiAqYSkKKwl7CisJaW50IG5lZz0wLGk7CisJbG9uZyByPTA7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMEwpOworCWk9YS0+dHlwZTsKKwlpZiAoaSA9PSBWX0FTTjFfTkVHX0lOVEVHRVIpCisJCW5lZz0xOworCWVsc2UgaWYgKGkgIT0gVl9BU04xX0lOVEVHRVIpCisJCXJldHVybiAtMTsKKwkKKwlpZiAoYS0+bGVuZ3RoID4gKGludClzaXplb2YobG9uZykpCisJCXsKKwkJLyogaG1tLi4uIGEgYml0IHVnbHkgKi8KKwkJcmV0dXJuKDB4ZmZmZmZmZmZMKTsKKwkJfQorCWlmIChhLT5kYXRhID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChpPTA7IGk8YS0+bGVuZ3RoOyBpKyspCisJCXsKKwkJcjw8PTg7CisJCXJ8PSh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV07CisJCX0KKwlpZiAobmVnKSByPSAtcjsKKwlyZXR1cm4ocik7CisJfQorCitBU04xX0lOVEVHRVIgKkJOX3RvX0FTTjFfSU5URUdFUihjb25zdCBCSUdOVU0gKmJuLCBBU04xX0lOVEVHRVIgKmFpKQorCXsKKwlBU04xX0lOVEVHRVIgKnJldDsKKwlpbnQgbGVuLGo7CisKKwlpZiAoYWkgPT0gTlVMTCkKKwkJcmV0PU1fQVNOMV9JTlRFR0VSX25ldygpOworCWVsc2UKKwkJcmV0PWFpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9CTl9UT19BU04xX0lOVEVHRVIsRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChCTl9pc19uZWdhdGl2ZShibikpCisJCXJldC0+dHlwZSA9IFZfQVNOMV9ORUdfSU5URUdFUjsKKwllbHNlIHJldC0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKwlqPUJOX251bV9iaXRzKGJuKTsKKwlsZW49KChqID09IDApPzA6KChqLzgpKzEpKTsKKwlpZiAocmV0LT5sZW5ndGggPCBsZW4rNCkKKwkJeworCQl1bnNpZ25lZCBjaGFyICpuZXdfZGF0YT1PUEVOU1NMX3JlYWxsb2MocmV0LT5kYXRhLCBsZW4rNCk7CisJCWlmICghbmV3X2RhdGEpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9CTl9UT19BU04xX0lOVEVHRVIsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCXJldC0+ZGF0YT1uZXdfZGF0YTsKKwkJfQorCXJldC0+bGVuZ3RoPUJOX2JuMmJpbihibixyZXQtPmRhdGEpOworCS8qIENvcnJlY3QgemVybyBjYXNlICovCisJaWYoIXJldC0+bGVuZ3RoKQorCQl7CisJCXJldC0+ZGF0YVswXSA9IDA7CisJCXJldC0+bGVuZ3RoID0gMTsKKwkJfQorCXJldHVybihyZXQpOworZXJyOgorCWlmIChyZXQgIT0gYWkpIE1fQVNOMV9JTlRFR0VSX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitCSUdOVU0gKkFTTjFfSU5URUdFUl90b19CTihjb25zdCBBU04xX0lOVEVHRVIgKmFpLCBCSUdOVU0gKmJuKQorCXsKKwlCSUdOVU0gKnJldDsKKworCWlmICgocmV0PUJOX2JpbjJibihhaS0+ZGF0YSxhaS0+bGVuZ3RoLGJuKSkgPT0gTlVMTCkKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9JTlRFR0VSX1RPX0JOLEFTTjFfUl9CTl9MSUIpOworCWVsc2UgaWYoYWktPnR5cGUgPT0gVl9BU04xX05FR19JTlRFR0VSKQorCQlCTl9zZXRfbmVnYXRpdmUocmV0LCAxKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK0lNUExFTUVOVF9TVEFDS19PRihBU04xX0lOVEVHRVIpCitJTVBMRU1FTlRfQVNOMV9TRVRfT0YoQVNOMV9JTlRFR0VSKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9tYnN0ci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9tYnN0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MzhlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX21ic3RyLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qIGFfbWJzdHIuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCitzdGF0aWMgaW50IHRyYXZlcnNlX3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuLCBpbnQgaW5mb3JtLAorCQkgaW50ICgqcmZ1bmMpKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmluKSwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgaW5fdXRmOCh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpOworc3RhdGljIGludCBvdXRfdXRmOCh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpOworc3RhdGljIGludCB0eXBlX3N0cih1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpOworc3RhdGljIGludCBjcHlfYXNjKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50IGNweV9ibXAodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgY3B5X3VuaXYodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgY3B5X3V0ZjgodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgaXNfcHJpbnRhYmxlKHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCisvKiBUaGVzZSBmdW5jdGlvbnMgdGFrZSBhIHN0cmluZyBpbiBVVEY4LCBBU0NJSSBvciBtdWx0aWJ5dGUgZm9ybSBhbmQKKyAqIGEgbWFzayBvZiBwZXJtaXNzaWJsZSBBU04xIHN0cmluZyB0eXBlcy4gSXQgdGhlbiB3b3JrcyBvdXQgdGhlIG1pbmltYWwKKyAqIHR5cGUgKHVzaW5nIHRoZSBvcmRlciBQcmludGFibGUgPCBJQTUgPCBUNjEgPCBCTVAgPCBVbml2ZXJzYWwgPCBVVEY4KQorICogYW5kIGNyZWF0ZXMgYSBzdHJpbmcgb2YgdGhlIGNvcnJlY3QgdHlwZSB3aXRoIHRoZSBzdXBwbGllZCBkYXRhLgorICogWWVzIHRoaXMgaXMgaG9ycmlibGU6IGl0IGhhcyB0byBiZSA6LSgKKyAqIFRoZSAnbmNvcHknIGZvcm0gY2hlY2tzIG1pbmltdW0gYW5kIG1heGltdW0gc2l6ZSBsaW1pdHMgdG9vLgorICovCisKK2ludCBBU04xX21ic3RyaW5nX2NvcHkoQVNOMV9TVFJJTkcgKipvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbGVuLAorCQkJCQlpbnQgaW5mb3JtLCB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJcmV0dXJuIEFTTjFfbWJzdHJpbmdfbmNvcHkob3V0LCBpbiwgbGVuLCBpbmZvcm0sIG1hc2ssIDAsIDApOworfQorCitpbnQgQVNOMV9tYnN0cmluZ19uY29weShBU04xX1NUUklORyAqKm91dCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBsZW4sCisJCQkJCWludCBpbmZvcm0sIHVuc2lnbmVkIGxvbmcgbWFzaywgCisJCQkJCWxvbmcgbWluc2l6ZSwgbG9uZyBtYXhzaXplKQoreworCWludCBzdHJfdHlwZTsKKwlpbnQgcmV0OworCWNoYXIgZnJlZV9vdXQ7CisJaW50IG91dGZvcm0sIG91dGxlbiA9IDA7CisJQVNOMV9TVFJJTkcgKmRlc3Q7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgbmNoYXI7CisJY2hhciBzdHJidWZbMzJdOworCWludCAoKmNweWZ1bmMpKHVuc2lnbmVkIGxvbmcsdm9pZCAqKSA9IE5VTEw7CisJaWYobGVuID09IC0xKSBsZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilpbik7CisJaWYoIW1hc2spIG1hc2sgPSBESVJTVFJJTkdfVFlQRTsKKworCS8qIEZpcnN0IGRvIGEgc3RyaW5nIGNoZWNrIGFuZCB3b3JrIG91dCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKi8KKwlzd2l0Y2goaW5mb3JtKSB7CisKKwkJY2FzZSBNQlNUUklOR19CTVA6CisJCWlmKGxlbiAmIDEpIHsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfTUJTVFJJTkdfTkNPUFksCisJCQkJCSBBU04xX1JfSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RIKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQluY2hhciA9IGxlbiA+PiAxOworCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX1VOSVY6CisJCWlmKGxlbiAmIDMpIHsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfTUJTVFJJTkdfTkNPUFksCisJCQkJCSBBU04xX1JfSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdfTEVOR1RIKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQluY2hhciA9IGxlbiA+PiAyOworCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX1VURjg6CisJCW5jaGFyID0gMDsKKwkJLyogVGhpcyBjb3VudHMgdGhlIGNoYXJhY3RlcnMgYW5kIGRvZXMgdXRmOCBzeW50YXggY2hlY2tpbmcgKi8KKwkJcmV0ID0gdHJhdmVyc2Vfc3RyaW5nKGluLCBsZW4sIE1CU1RSSU5HX1VURjgsIGluX3V0ZjgsICZuY2hhcik7CisJCWlmKHJldCA8IDApIHsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfTUJTVFJJTkdfTkNPUFksCisJCQkJCQkgQVNOMV9SX0lOVkFMSURfVVRGOFNUUklORyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBNQlNUUklOR19BU0M6CisJCW5jaGFyID0gbGVuOworCQlicmVhazsKKworCQlkZWZhdWx0OgorCQlBU04xZXJyKEFTTjFfRl9BU04xX01CU1RSSU5HX05DT1BZLCBBU04xX1JfVU5LTk9XTl9GT1JNQVQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYoKG1pbnNpemUgPiAwKSAmJiAobmNoYXIgPCBtaW5zaXplKSkgeworCQlBU04xZXJyKEFTTjFfRl9BU04xX01CU1RSSU5HX05DT1BZLCBBU04xX1JfU1RSSU5HX1RPT19TSE9SVCk7CisJCUJJT19zbnByaW50ZihzdHJidWYsIHNpemVvZiBzdHJidWYsICIlbGQiLCBtaW5zaXplKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJtaW5zaXplPSIsIHN0cmJ1Zik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZigobWF4c2l6ZSA+IDApICYmIChuY2hhciA+IG1heHNpemUpKSB7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfTUJTVFJJTkdfTkNPUFksIEFTTjFfUl9TVFJJTkdfVE9PX0xPTkcpOworCQlCSU9fc25wcmludGYoc3RyYnVmLCBzaXplb2Ygc3RyYnVmLCAiJWxkIiwgbWF4c2l6ZSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibWF4c2l6ZT0iLCBzdHJidWYpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogTm93IHdvcmsgb3V0IG1pbmltYWwgdHlwZSAoaWYgYW55KSAqLworCWlmKHRyYXZlcnNlX3N0cmluZyhpbiwgbGVuLCBpbmZvcm0sIHR5cGVfc3RyLCAmbWFzaykgPCAwKSB7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfTUJTVFJJTkdfTkNPUFksIEFTTjFfUl9JTExFR0FMX0NIQVJBQ1RFUlMpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwkvKiBOb3cgd29yayBvdXQgb3V0cHV0IGZvcm1hdCBhbmQgc3RyaW5nIHR5cGUgKi8KKwlvdXRmb3JtID0gTUJTVFJJTkdfQVNDOworCWlmKG1hc2sgJiBCX0FTTjFfUFJJTlRBQkxFU1RSSU5HKSBzdHJfdHlwZSA9IFZfQVNOMV9QUklOVEFCTEVTVFJJTkc7CisJZWxzZSBpZihtYXNrICYgQl9BU04xX0lBNVNUUklORykgc3RyX3R5cGUgPSBWX0FTTjFfSUE1U1RSSU5HOworCWVsc2UgaWYobWFzayAmIEJfQVNOMV9UNjFTVFJJTkcpIHN0cl90eXBlID0gVl9BU04xX1Q2MVNUUklORzsKKwllbHNlIGlmKG1hc2sgJiBCX0FTTjFfQk1QU1RSSU5HKSB7CisJCXN0cl90eXBlID0gVl9BU04xX0JNUFNUUklORzsKKwkJb3V0Zm9ybSA9IE1CU1RSSU5HX0JNUDsKKwl9IGVsc2UgaWYobWFzayAmIEJfQVNOMV9VTklWRVJTQUxTVFJJTkcpIHsKKwkJc3RyX3R5cGUgPSBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HOworCQlvdXRmb3JtID0gTUJTVFJJTkdfVU5JVjsKKwl9IGVsc2UgeworCQlzdHJfdHlwZSA9IFZfQVNOMV9VVEY4U1RSSU5HOworCQlvdXRmb3JtID0gTUJTVFJJTkdfVVRGODsKKwl9CisJaWYoIW91dCkgcmV0dXJuIHN0cl90eXBlOworCWlmKCpvdXQpIHsKKwkJZnJlZV9vdXQgPSAwOworCQlkZXN0ID0gKm91dDsKKwkJaWYoZGVzdC0+ZGF0YSkgeworCQkJZGVzdC0+bGVuZ3RoID0gMDsKKwkJCU9QRU5TU0xfZnJlZShkZXN0LT5kYXRhKTsKKwkJCWRlc3QtPmRhdGEgPSBOVUxMOworCQl9CisJCWRlc3QtPnR5cGUgPSBzdHJfdHlwZTsKKwl9IGVsc2UgeworCQlmcmVlX291dCA9IDE7CisJCWRlc3QgPSBBU04xX1NUUklOR190eXBlX25ldyhzdHJfdHlwZSk7CisJCWlmKCFkZXN0KSB7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX01CU1RSSU5HX05DT1BZLAorCQkJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkqb3V0ID0gZGVzdDsKKwl9CisJLyogSWYgYm90aCB0aGUgc2FtZSB0eXBlIGp1c3QgY29weSBhY3Jvc3MgKi8KKwlpZihpbmZvcm0gPT0gb3V0Zm9ybSkgeworCQlpZighQVNOMV9TVFJJTkdfc2V0KGRlc3QsIGluLCBsZW4pKSB7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX01CU1RSSU5HX05DT1BZLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gc3RyX3R5cGU7CisJfSAKKworCS8qIFdvcmsgb3V0IGhvdyBtdWNoIHNwYWNlIHRoZSBkZXN0aW5hdGlvbiB3aWxsIG5lZWQgKi8KKwlzd2l0Y2gob3V0Zm9ybSkgeworCQljYXNlIE1CU1RSSU5HX0FTQzoKKwkJb3V0bGVuID0gbmNoYXI7CisJCWNweWZ1bmMgPSBjcHlfYXNjOworCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX0JNUDoKKwkJb3V0bGVuID0gbmNoYXIgPDwgMTsKKwkJY3B5ZnVuYyA9IGNweV9ibXA7CisJCWJyZWFrOworCisJCWNhc2UgTUJTVFJJTkdfVU5JVjoKKwkJb3V0bGVuID0gbmNoYXIgPDwgMjsKKwkJY3B5ZnVuYyA9IGNweV91bml2OworCQlicmVhazsKKworCQljYXNlIE1CU1RSSU5HX1VURjg6CisJCW91dGxlbiA9IDA7CisJCXRyYXZlcnNlX3N0cmluZyhpbiwgbGVuLCBpbmZvcm0sIG91dF91dGY4LCAmb3V0bGVuKTsKKwkJY3B5ZnVuYyA9IGNweV91dGY4OworCQlicmVhazsKKwl9CisJaWYoIShwID0gT1BFTlNTTF9tYWxsb2Mob3V0bGVuICsgMSkpKSB7CisJCWlmKGZyZWVfb3V0KSBBU04xX1NUUklOR19mcmVlKGRlc3QpOworCQlBU04xZXJyKEFTTjFfRl9BU04xX01CU1RSSU5HX05DT1BZLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkZXN0LT5sZW5ndGggPSBvdXRsZW47CisJZGVzdC0+ZGF0YSA9IHA7CisJcFtvdXRsZW5dID0gMDsKKwl0cmF2ZXJzZV9zdHJpbmcoaW4sIGxlbiwgaW5mb3JtLCBjcHlmdW5jLCAmcCk7CisJcmV0dXJuIHN0cl90eXBlOwkKK30KKworLyogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgYSBzdHJpbmcgYW5kIHBhc3NlcyB0aGUgdmFsdWUgb2YgZWFjaCBjaGFyYWN0ZXIKKyAqIHRvIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIGFsb25nIHdpdGggYSB2b2lkICogYXJndW1lbnQuCisgKi8KKworc3RhdGljIGludCB0cmF2ZXJzZV9zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlbiwgaW50IGluZm9ybSwKKwkJIGludCAoKnJmdW5jKSh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICppbiksIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisJd2hpbGUobGVuKSB7CisJCWlmKGluZm9ybSA9PSBNQlNUUklOR19BU0MpIHsKKwkJCXZhbHVlID0gKnArKzsKKwkJCWxlbi0tOworCQl9IGVsc2UgaWYoaW5mb3JtID09IE1CU1RSSU5HX0JNUCkgeworCQkJdmFsdWUgPSAqcCsrIDw8IDg7CisJCQl2YWx1ZSB8PSAqcCsrOworCQkJbGVuIC09IDI7CisJCX0gZWxzZSBpZihpbmZvcm0gPT0gTUJTVFJJTkdfVU5JVikgeworCQkJdmFsdWUgPSAoKHVuc2lnbmVkIGxvbmcpKnArKykgPDwgMjQ7CisJCQl2YWx1ZSB8PSAoKHVuc2lnbmVkIGxvbmcpKnArKykgPDwgMTY7CisJCQl2YWx1ZSB8PSAqcCsrIDw8IDg7CisJCQl2YWx1ZSB8PSAqcCsrOworCQkJbGVuIC09IDQ7CisJCX0gZWxzZSB7CisJCQlyZXQgPSBVVEY4X2dldGMocCwgbGVuLCAmdmFsdWUpOworCQkJaWYocmV0IDwgMCkgcmV0dXJuIC0xOworCQkJbGVuIC09IHJldDsKKwkJCXAgKz0gcmV0OworCQl9CisJCWlmKHJmdW5jKSB7CisJCQlyZXQgPSByZnVuYyh2YWx1ZSwgYXJnKTsKKwkJCWlmKHJldCA8PSAwKSByZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKiBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0cmF2ZXJzZV9zdHJpbmcgKi8KKworLyogSnVzdCBjb3VudCBudW1iZXIgb2YgY2hhcmFjdGVycyAqLworCitzdGF0aWMgaW50IGluX3V0ZjgodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKQoreworCWludCAqbmNoYXI7CisJbmNoYXIgPSBhcmc7CisJKCpuY2hhcikrKzsKKwlyZXR1cm4gMTsKK30KKworLyogRGV0ZXJtaW5lIHNpemUgb2Ygb3V0cHV0IGFzIGEgVVRGOCBTdHJpbmcgKi8KKworc3RhdGljIGludCBvdXRfdXRmOCh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpCit7CisJaW50ICpvdXRsZW47CisJb3V0bGVuID0gYXJnOworCSpvdXRsZW4gKz0gVVRGOF9wdXRjKE5VTEwsIC0xLCB2YWx1ZSk7CisJcmV0dXJuIDE7Cit9CisKKy8qIERldGVybWluZSB0aGUgInR5cGUiIG9mIGEgc3RyaW5nOiBjaGVjayBlYWNoIGNoYXJhY3RlciBhZ2FpbnN0IGEKKyAqIHN1cHBsaWVkICJtYXNrIi4KKyAqLworCitzdGF0aWMgaW50IHR5cGVfc3RyKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIHR5cGVzOworCXR5cGVzID0gKigodW5zaWduZWQgbG9uZyAqKWFyZyk7CisJaWYoKHR5cGVzICYgQl9BU04xX1BSSU5UQUJMRVNUUklORykgJiYgIWlzX3ByaW50YWJsZSh2YWx1ZSkpCisJCQkJCXR5cGVzICY9IH5CX0FTTjFfUFJJTlRBQkxFU1RSSU5HOworCWlmKCh0eXBlcyAmIEJfQVNOMV9JQTVTVFJJTkcpICYmICh2YWx1ZSA+IDEyNykpCisJCQkJCXR5cGVzICY9IH5CX0FTTjFfSUE1U1RSSU5HOworCWlmKCh0eXBlcyAmIEJfQVNOMV9UNjFTVFJJTkcpICYmICh2YWx1ZSA+IDB4ZmYpKQorCQkJCQl0eXBlcyAmPSB+Ql9BU04xX1Q2MVNUUklORzsKKwlpZigodHlwZXMgJiBCX0FTTjFfQk1QU1RSSU5HKSAmJiAodmFsdWUgPiAweGZmZmYpKQorCQkJCQl0eXBlcyAmPSB+Ql9BU04xX0JNUFNUUklORzsKKwlpZighdHlwZXMpIHJldHVybiAtMTsKKwkqKCh1bnNpZ25lZCBsb25nICopYXJnKSA9IHR5cGVzOworCXJldHVybiAxOworfQorCisvKiBDb3B5IG9uZSBieXRlIHBlciBjaGFyYWN0ZXIgQVNDSUkgbGlrZSBzdHJpbmdzICovCisKK3N0YXRpYyBpbnQgY3B5X2FzYyh1bnNpZ25lZCBsb25nIHZhbHVlLCB2b2lkICphcmcpCit7CisJdW5zaWduZWQgY2hhciAqKnAsICpxOworCXAgPSBhcmc7CisJcSA9ICpwOworCSpxID0gKHVuc2lnbmVkIGNoYXIpIHZhbHVlOworCSgqcCkrKzsKKwlyZXR1cm4gMTsKK30KKworLyogQ29weSB0d28gYnl0ZSBwZXIgY2hhcmFjdGVyIEJNUFN0cmluZ3MgKi8KKworc3RhdGljIGludCBjcHlfYm1wKHVuc2lnbmVkIGxvbmcgdmFsdWUsIHZvaWQgKmFyZykKK3sKKwl1bnNpZ25lZCBjaGFyICoqcCwgKnE7CisJcCA9IGFyZzsKKwlxID0gKnA7CisJKnErKyA9ICh1bnNpZ25lZCBjaGFyKSAoKHZhbHVlID4+IDgpICYgMHhmZik7CisJKnEgPSAodW5zaWduZWQgY2hhcikgKHZhbHVlICYgMHhmZik7CisJKnAgKz0gMjsKKwlyZXR1cm4gMTsKK30KKworLyogQ29weSBmb3VyIGJ5dGUgcGVyIGNoYXJhY3RlciBVbml2ZXJzYWxTdHJpbmdzICovCisKK3N0YXRpYyBpbnQgY3B5X3VuaXYodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGNoYXIgKipwLCAqcTsKKwlwID0gYXJnOworCXEgPSAqcDsKKwkqcSsrID0gKHVuc2lnbmVkIGNoYXIpICgodmFsdWUgPj4gMjQpICYgMHhmZik7CisJKnErKyA9ICh1bnNpZ25lZCBjaGFyKSAoKHZhbHVlID4+IDE2KSAmIDB4ZmYpOworCSpxKysgPSAodW5zaWduZWQgY2hhcikgKCh2YWx1ZSA+PiA4KSAmIDB4ZmYpOworCSpxID0gKHVuc2lnbmVkIGNoYXIpICh2YWx1ZSAmIDB4ZmYpOworCSpwICs9IDQ7CisJcmV0dXJuIDE7Cit9CisKKy8qIENvcHkgdG8gYSBVVEY4U3RyaW5nICovCisKK3N0YXRpYyBpbnQgY3B5X3V0ZjgodW5zaWduZWQgbG9uZyB2YWx1ZSwgdm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGNoYXIgKipwOworCWludCByZXQ7CisJcCA9IGFyZzsKKwkvKiBXZSBhbHJlYWR5IGtub3cgdGhlcmUgaXMgZW5vdWdoIHJvb20gc28gcGFzcyAweGZmIGFzIHRoZSBsZW5ndGggKi8KKwlyZXQgPSBVVEY4X3B1dGMoKnAsIDB4ZmYsIHZhbHVlKTsKKwkqcCArPSByZXQ7CisJcmV0dXJuIDE7Cit9CisKKy8qIFJldHVybiAxIGlmIHRoZSBjaGFyYWN0ZXIgaXMgcGVybWl0dGVkIGluIGEgUHJpbnRhYmxlU3RyaW5nICovCitzdGF0aWMgaW50IGlzX3ByaW50YWJsZSh1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCWludCBjaDsKKwlpZih2YWx1ZSA+IDB4N2YpIHJldHVybiAwOworCWNoID0gKGludCkgdmFsdWU7CisJLyogTm90ZTogd2UgY2FuJ3QgdXNlICdpc2FsbnVtJyBiZWNhdXNlIGNlcnRhaW4gYWNjZW50ZWQgCisJICogY2hhcmFjdGVycyBtYXkgY291bnQgYXMgYWxwaGFudW1lcmljIGluIHNvbWUgZW52aXJvbm1lbnRzLgorCSAqLworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCWlmKChjaCA+PSAnYScpICYmIChjaCA8PSAneicpKSByZXR1cm4gMTsKKwlpZigoY2ggPj0gJ0EnKSAmJiAoY2ggPD0gJ1onKSkgcmV0dXJuIDE7CisJaWYoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIHJldHVybiAxOworCWlmICgoY2ggPT0gJyAnKSB8fCBzdHJjaHIoIicoKSssLS4vOj0/IiwgY2gpKSByZXR1cm4gMTsKKyNlbHNlIC8qQ0hBUlNFVF9FQkNESUMqLworCWlmKChjaCA+PSBvc190b2FzY2lpWydhJ10pICYmIChjaCA8PSBvc190b2FzY2lpWyd6J10pKSByZXR1cm4gMTsKKwlpZigoY2ggPj0gb3NfdG9hc2NpaVsnQSddKSAmJiAoY2ggPD0gb3NfdG9hc2NpaVsnWiddKSkgcmV0dXJuIDE7CisJaWYoKGNoID49IG9zX3RvYXNjaWlbJzAnXSkgJiYgKGNoIDw9IG9zX3RvYXNjaWlbJzknXSkpIHJldHVybiAxOworCWlmICgoY2ggPT0gb3NfdG9hc2NpaVsnICddKSB8fCBzdHJjaHIoIicoKSssLS4vOj0/Iiwgb3NfdG9lYmNkaWNbY2hdKSkgcmV0dXJuIDE7CisjZW5kaWYgLypDSEFSU0VUX0VCQ0RJQyovCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX29iamVjdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9vYmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWZiZTdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9vYmplY3QuYwpAQCAtMCwwICsxLDQwMyBAQAorLyogY3J5cHRvL2FzbjEvYV9vYmplY3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCitpbnQgaTJkX0FTTjFfT0JKRUNUKEFTTjFfT0JKRUNUICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IG9ianNpemU7CisKKwlpZiAoKGEgPT0gTlVMTCkgfHwgKGEtPmRhdGEgPT0gTlVMTCkpIHJldHVybigwKTsKKworCW9ianNpemUgPSBBU04xX29iamVjdF9zaXplKDAsYS0+bGVuZ3RoLFZfQVNOMV9PQkpFQ1QpOworCWlmIChwcCA9PSBOVUxMKSByZXR1cm4gb2Jqc2l6ZTsKKworCXA9ICpwcDsKKwlBU04xX3B1dF9vYmplY3QoJnAsMCxhLT5sZW5ndGgsVl9BU04xX09CSkVDVCxWX0FTTjFfVU5JVkVSU0FMKTsKKwltZW1jcHkocCxhLT5kYXRhLGEtPmxlbmd0aCk7CisJcCs9YS0+bGVuZ3RoOworCisJKnBwPXA7CisJcmV0dXJuKG9ianNpemUpOworCX0KKworaW50IGEyZF9BU04xX09CSkVDVCh1bnNpZ25lZCBjaGFyICpvdXQsIGludCBvbGVuLCBjb25zdCBjaGFyICpidWYsIGludCBudW0pCisJeworCWludCBpLGZpcnN0LGxlbj0wLGMsIHVzZV9ibjsKKwljaGFyIGZ0bXBbMjRdLCAqdG1wID0gZnRtcDsKKwlpbnQgdG1wc2l6ZSA9IHNpemVvZiBmdG1wOworCWNvbnN0IGNoYXIgKnA7CisJdW5zaWduZWQgbG9uZyBsOworCUJJR05VTSAqYmwgPSBOVUxMOworCisJaWYgKG51bSA9PSAwKQorCQlyZXR1cm4oMCk7CisJZWxzZSBpZiAobnVtID09IC0xKQorCQludW09c3RybGVuKGJ1Zik7CisKKwlwPWJ1ZjsKKwljPSAqKHArKyk7CisJbnVtLS07CisJaWYgKChjID49ICcwJykgJiYgKGMgPD0gJzInKSkKKwkJeworCQlmaXJzdD0gYy0nMCc7CisJCX0KKwllbHNlCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQTJEX0FTTjFfT0JKRUNULEFTTjFfUl9GSVJTVF9OVU1fVE9PX0xBUkdFKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChudW0gPD0gMCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BMkRfQVNOMV9PQkpFQ1QsQVNOMV9SX01JU1NJTkdfU0VDT05EX05VTUJFUik7CisJCWdvdG8gZXJyOworCQl9CisJYz0gKihwKyspOworCW51bS0tOworCWZvciAoOzspCisJCXsKKwkJaWYgKG51bSA8PSAwKSBicmVhazsKKwkJaWYgKChjICE9ICcuJykgJiYgKGMgIT0gJyAnKSkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0EyRF9BU04xX09CSkVDVCxBU04xX1JfSU5WQUxJRF9TRVBBUkFUT1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCWw9MDsKKwkJdXNlX2JuID0gMDsKKwkJZm9yICg7OykKKwkJCXsKKwkJCWlmIChudW0gPD0gMCkgYnJlYWs7CisJCQludW0tLTsKKwkJCWM9ICoocCsrKTsKKwkJCWlmICgoYyA9PSAnICcpIHx8IChjID09ICcuJykpCisJCQkJYnJlYWs7CisJCQlpZiAoKGMgPCAnMCcpIHx8IChjID4gJzknKSkKKwkJCQl7CisJCQkJQVNOMWVycihBU04xX0ZfQTJEX0FTTjFfT0JKRUNULEFTTjFfUl9JTlZBTElEX0RJR0lUKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoIXVzZV9ibiAmJiBsID4gKFVMT05HX01BWCAvIDEwTCkpCisJCQkJeworCQkJCXVzZV9ibiA9IDE7CisJCQkJaWYgKCFibCkKKwkJCQkJYmwgPSBCTl9uZXcoKTsKKwkJCQlpZiAoIWJsIHx8ICFCTl9zZXRfd29yZChibCwgbCkpCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmICh1c2VfYm4pCisJCQkJeworCQkJCWlmICghQk5fbXVsX3dvcmQoYmwsIDEwTCkKKwkJCQkJfHwgIUJOX2FkZF93b3JkKGJsLCBjLScwJykpCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWVsc2UKKwkJCQlsPWwqMTBMKyhsb25nKShjLScwJyk7CisJCQl9CisJCWlmIChsZW4gPT0gMCkKKwkJCXsKKwkJCWlmICgoZmlyc3QgPCAyKSAmJiAobCA+PSA0MCkpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0EyRF9BU04xX09CSkVDVCxBU04xX1JfU0VDT05EX05VTUJFUl9UT09fTEFSR0UpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmICh1c2VfYm4pCisJCQkJeworCQkJCWlmICghQk5fYWRkX3dvcmQoYmwsIGZpcnN0ICogNDApKQorCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQllbHNlCisJCQkJbCs9KGxvbmcpZmlyc3QqNDA7CisJCQl9CisJCWk9MDsKKwkJaWYgKHVzZV9ibikKKwkJCXsKKwkJCWludCBibHNpemU7CisJCQlibHNpemUgPSBCTl9udW1fYml0cyhibCk7CisJCQlibHNpemUgPSAoYmxzaXplICsgNikvNzsKKwkJCWlmIChibHNpemUgPiB0bXBzaXplKQorCQkJCXsKKwkJCQlpZiAodG1wICE9IGZ0bXApCisJCQkJCU9QRU5TU0xfZnJlZSh0bXApOworCQkJCXRtcHNpemUgPSBibHNpemUgKyAzMjsKKwkJCQl0bXAgPSBPUEVOU1NMX21hbGxvYyh0bXBzaXplKTsKKwkJCQlpZiAoIXRtcCkKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJd2hpbGUoYmxzaXplLS0pCisJCQkJdG1wW2krK10gPSAodW5zaWduZWQgY2hhcilCTl9kaXZfd29yZChibCwgMHg4MEwpOworCQkJfQorCQllbHNlCisJCQl7CisJCQkJCQorCQkJZm9yICg7OykKKwkJCQl7CisJCQkJdG1wW2krK109KHVuc2lnbmVkIGNoYXIpbCYweDdmOworCQkJCWw+Pj03TDsKKwkJCQlpZiAobCA9PSAwTCkgYnJlYWs7CisJCQkJfQorCisJCQl9CisJCWlmIChvdXQgIT0gTlVMTCkKKwkJCXsKKwkJCWlmIChsZW4raSA+IG9sZW4pCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0EyRF9BU04xX09CSkVDVCxBU04xX1JfQlVGRkVSX1RPT19TTUFMTCk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJd2hpbGUgKC0taSA+IDApCisJCQkJb3V0W2xlbisrXT10bXBbaV18MHg4MDsKKwkJCW91dFtsZW4rK109dG1wWzBdOworCQkJfQorCQllbHNlCisJCQlsZW4rPWk7CisJCX0KKwlpZiAodG1wICE9IGZ0bXApCisJCU9QRU5TU0xfZnJlZSh0bXApOworCWlmIChibCkKKwkJQk5fZnJlZShibCk7CisJcmV0dXJuKGxlbik7CitlcnI6CisJaWYgKHRtcCAhPSBmdG1wKQorCQlPUEVOU1NMX2ZyZWUodG1wKTsKKwlpZiAoYmwpCisJCUJOX2ZyZWUoYmwpOworCXJldHVybigwKTsKKwl9CisKK2ludCBpMnRfQVNOMV9PQkpFQ1QoY2hhciAqYnVmLCBpbnQgYnVmX2xlbiwgQVNOMV9PQkpFQ1QgKmEpCit7CisJcmV0dXJuIE9CSl9vYmoydHh0KGJ1ZiwgYnVmX2xlbiwgYSwgMCk7Cit9CisKK2ludCBpMmFfQVNOMV9PQkpFQ1QoQklPICpicCwgQVNOMV9PQkpFQ1QgKmEpCisJeworCWNoYXIgYnVmWzgwXSwgKnAgPSBidWY7CisJaW50IGk7CisKKwlpZiAoKGEgPT0gTlVMTCkgfHwgKGEtPmRhdGEgPT0gTlVMTCkpCisJCXJldHVybihCSU9fd3JpdGUoYnAsIk5VTEwiLDQpKTsKKwlpPWkydF9BU04xX09CSkVDVChidWYsc2l6ZW9mIGJ1ZixhKTsKKwlpZiAoaSA+IChpbnQpKHNpemVvZihidWYpIC0gMSkpCisJCXsKKwkJcCA9IE9QRU5TU0xfbWFsbG9jKGkgKyAxKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC0xOworCQlpMnRfQVNOMV9PQkpFQ1QocCxpICsgMSxhKTsKKwkJfQorCWlmIChpIDw9IDApCisJCXJldHVybiBCSU9fd3JpdGUoYnAsICI8SU5WQUxJRD4iLCA5KTsKKwlCSU9fd3JpdGUoYnAscCxpKTsKKwlpZiAocCAhPSBidWYpCisJCU9QRU5TU0xfZnJlZShwKTsKKwlyZXR1cm4oaSk7CisJfQorCitBU04xX09CSkVDVCAqZDJpX0FTTjFfT0JKRUNUKEFTTjFfT0JKRUNUICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCSAgICAgbG9uZyBsZW5ndGgpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGxlbjsKKwlpbnQgdGFnLHhjbGFzczsKKwlpbnQgaW5mLGk7CisJQVNOMV9PQkpFQ1QgKnJldCA9IE5VTEw7CisJcD0gKnBwOworCWluZj1BU04xX2dldF9vYmplY3QoJnAsJmxlbiwmdGFnLCZ4Y2xhc3MsbGVuZ3RoKTsKKwlpZiAoaW5mICYgMHg4MCkKKwkJeworCQlpPUFTTjFfUl9CQURfT0JKRUNUX0hFQURFUjsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICh0YWcgIT0gVl9BU04xX09CSkVDVCkKKwkJeworCQlpPUFTTjFfUl9FWFBFQ1RJTkdfQU5fT0JKRUNUOworCQlnb3RvIGVycjsKKwkJfQorCXJldCA9IGMyaV9BU04xX09CSkVDVChhLCAmcCwgbGVuKTsKKwlpZihyZXQpICpwcCA9IHA7CisJcmV0dXJuIHJldDsKK2VycjoKKwlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9PQkpFQ1QsaSk7CisJcmV0dXJuKE5VTEwpOworfQorQVNOMV9PQkpFQ1QgKmMyaV9BU04xX09CSkVDVChBU04xX09CSkVDVCAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkgICAgIGxvbmcgbGVuKQorCXsKKwlBU04xX09CSkVDVCAqcmV0PU5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBpOworCS8qIFNhbml0eSBjaGVjayBPSUQgZW5jb2Rpbmc6IGNhbid0IGhhdmUgbGVhZGluZyAweDgwIGluCisJICogc3ViaWRlbnRpZmllcnMsIHNlZTogWC42OTAgOC4xOS4yCisJICovCisJZm9yIChpID0gMCwgcCA9ICpwcCArIDE7IGkgPCBsZW4gLSAxOyBpKyssIHArKykKKwkJeworCQlpZiAoKnAgPT0gMHg4MCAmJiAoIWkgfHwgIShwWy0xXSAmIDB4ODApKSkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0MySV9BU04xX09CSkVDVCxBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCS8qIG9ubHkgdGhlIEFTTjFfT0JKRUNUcyBmcm9tIHRoZSAndGFibGUnIHdpbGwgaGF2ZSB2YWx1ZXMKKwkgKiBmb3IgLT5zbiBvciAtPmxuICovCisJaWYgKChhID09IE5VTEwpIHx8ICgoKmEpID09IE5VTEwpIHx8CisJCSEoKCphKS0+ZmxhZ3MgJiBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUMpKQorCQl7CisJCWlmICgocmV0PUFTTjFfT0JKRUNUX25ldygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJCX0KKwllbHNlCXJldD0oKmEpOworCisJcD0gKnBwOworCS8qIGRldGFjaCBkYXRhIGZyb20gb2JqZWN0ICovCisJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopcmV0LT5kYXRhOworCXJldC0+ZGF0YSA9IE5VTEw7CisJLyogb25jZSBkZXRhY2hlZCB3ZSBjYW4gY2hhbmdlIGl0ICovCisJaWYgKChkYXRhID09IE5VTEwpIHx8IChyZXQtPmxlbmd0aCA8IGxlbikpCisJCXsKKwkJcmV0LT5sZW5ndGg9MDsKKwkJaWYgKGRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGRhdGEpOworCQlkYXRhPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MobGVuID8gKGludClsZW4gOiAxKTsKKwkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCXsgaT1FUlJfUl9NQUxMT0NfRkFJTFVSRTsgZ290byBlcnI7IH0KKwkJcmV0LT5mbGFnc3w9QVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX0RBVEE7CisJCX0KKwltZW1jcHkoZGF0YSxwLChpbnQpbGVuKTsKKwkvKiByZWF0dGFjaCBkYXRhIHRvIG9iamVjdCwgYWZ0ZXIgd2hpY2ggaXQgcmVtYWlucyBjb25zdCAqLworCXJldC0+ZGF0YSAgPWRhdGE7CisJcmV0LT5sZW5ndGg9KGludClsZW47CisJcmV0LT5zbj1OVUxMOworCXJldC0+bG49TlVMTDsKKwkvKiByZXQtPmZsYWdzPUFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQzsgd2Uga25vdyBpdCBpcyBkeW5hbWljICovCisJcCs9bGVuOworCisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7CisJKnBwPXA7CisJcmV0dXJuKHJldCk7CitlcnI6CisJQVNOMWVycihBU04xX0ZfQzJJX0FTTjFfT0JKRUNULGkpOworCWlmICgocmV0ICE9IE5VTEwpICYmICgoYSA9PSBOVUxMKSB8fCAoKmEgIT0gcmV0KSkpCisJCUFTTjFfT0JKRUNUX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitBU04xX09CSkVDVCAqQVNOMV9PQkpFQ1RfbmV3KHZvaWQpCisJeworCUFTTjFfT0JKRUNUICpyZXQ7CisKKwlyZXQ9KEFTTjFfT0JKRUNUICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfT0JKRUNUKSk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfT0JKRUNUX05FVyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXJldC0+bGVuZ3RoPTA7CisJcmV0LT5kYXRhPU5VTEw7CisJcmV0LT5uaWQ9MDsKKwlyZXQtPnNuPU5VTEw7CisJcmV0LT5sbj1OVUxMOworCXJldC0+ZmxhZ3M9QVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDOworCXJldHVybihyZXQpOworCX0KKwordm9pZCBBU04xX09CSkVDVF9mcmVlKEFTTjFfT0JKRUNUICphKQorCXsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm47CisJaWYgKGEtPmZsYWdzICYgQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX1NUUklOR1MpCisJCXsKKyNpZm5kZWYgQ09OU1RfU1RSSUNUIC8qIGRpc2FibGUgcHVyZWx5IGZvciBjb21waWxlLXRpbWUgc3RyaWN0IGNvbnN0IGNoZWNraW5nLiBEb2luZyB0aGlzIG9uIGEgInJlYWwiIGNvbXBpbGUgd2lsbCBjYXVzZSBtZW1vcnkgbGVha3MgKi8KKwkJaWYgKGEtPnNuICE9IE5VTEwpIE9QRU5TU0xfZnJlZSgodm9pZCAqKWEtPnNuKTsKKwkJaWYgKGEtPmxuICE9IE5VTEwpIE9QRU5TU0xfZnJlZSgodm9pZCAqKWEtPmxuKTsKKyNlbmRpZgorCQlhLT5zbj1hLT5sbj1OVUxMOworCQl9CisJaWYgKGEtPmZsYWdzICYgQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX0RBVEEpCisJCXsKKwkJaWYgKGEtPmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKCh2b2lkICopYS0+ZGF0YSk7CisJCWEtPmRhdGE9TlVMTDsKKwkJYS0+bGVuZ3RoPTA7CisJCX0KKwlpZiAoYS0+ZmxhZ3MgJiBBU04xX09CSkVDVF9GTEFHX0RZTkFNSUMpCisJCU9QRU5TU0xfZnJlZShhKTsKKwl9CisKK0FTTjFfT0JKRUNUICpBU04xX09CSkVDVF9jcmVhdGUoaW50IG5pZCwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwKKwkgICAgIGNvbnN0IGNoYXIgKnNuLCBjb25zdCBjaGFyICpsbikKKwl7CisJQVNOMV9PQkpFQ1QgbzsKKworCW8uc249c247CisJby5sbj1sbjsKKwlvLmRhdGE9ZGF0YTsKKwlvLm5pZD1uaWQ7CisJby5sZW5ndGg9bGVuOworCW8uZmxhZ3M9QVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDfEFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQ19TVFJJTkdTfAorCQlBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfREFUQTsKKwlyZXR1cm4oT0JKX2R1cCgmbykpOworCX0KKworSU1QTEVNRU5UX1NUQUNLX09GKEFTTjFfT0JKRUNUKQorSU1QTEVNRU5UX0FTTjFfU0VUX09GKEFTTjFfT0JKRUNUKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9vY3RldC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9vY3RldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzI1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX29jdGV0LmMKQEAgLTAsMCArMSw3MSBAQAorLyogY3J5cHRvL2FzbjEvYV9vY3RldC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKK0FTTjFfT0NURVRfU1RSSU5HICpBU04xX09DVEVUX1NUUklOR19kdXAoY29uc3QgQVNOMV9PQ1RFVF9TVFJJTkcgKngpCit7IHJldHVybiBNX0FTTjFfT0NURVRfU1RSSU5HX2R1cCh4KTsgfQorCitpbnQgQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGNvbnN0IEFTTjFfT0NURVRfU1RSSU5HICphLCBjb25zdCBBU04xX09DVEVUX1NUUklORyAqYikKK3sgcmV0dXJuIE1fQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGEsIGIpOyB9CisKK2ludCBBU04xX09DVEVUX1NUUklOR19zZXQoQVNOMV9PQ1RFVF9TVFJJTkcgKngsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pCit7IHJldHVybiBNX0FTTjFfT0NURVRfU1RSSU5HX3NldCh4LCBkLCBsZW4pOyB9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfcHJpbnQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMThlNzcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9wcmludC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiBjcnlwdG8vYXNuMS9hX3ByaW50LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworaW50IEFTTjFfUFJJTlRBQkxFX3R5cGUoY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IGxlbikKKwl7CisJaW50IGM7CisJaW50IGlhNT0wOworCWludCB0NjE9MDsKKworCWlmIChsZW4gPD0gMCkgbGVuPSAtMTsKKwlpZiAocyA9PSBOVUxMKSByZXR1cm4oVl9BU04xX1BSSU5UQUJMRVNUUklORyk7CisKKwl3aGlsZSAoKCpzKSAmJiAobGVuLS0gIT0gMCkpCisJCXsKKwkJYz0gKihzKyspOworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCQlpZiAoISgJKChjID49ICdhJykgJiYgKGMgPD0gJ3onKSkgfHwKKwkJCSgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpIHx8CisJCQkoYyA9PSAnICcpIHx8CisJCQkoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB8fAorCQkJKGMgPT0gJyAnKSB8fCAoYyA9PSAnXCcnKSB8fAorCQkJKGMgPT0gJygnKSB8fCAoYyA9PSAnKScpIHx8CisJCQkoYyA9PSAnKycpIHx8IChjID09ICcsJykgfHwKKwkJCShjID09ICctJykgfHwgKGMgPT0gJy4nKSB8fAorCQkJKGMgPT0gJy8nKSB8fCAoYyA9PSAnOicpIHx8CisJCQkoYyA9PSAnPScpIHx8IChjID09ICc/JykpKQorCQkJaWE1PTE7CisJCWlmIChjJjB4ODApCisJCQl0NjE9MTsKKyNlbHNlCisJCWlmICghaXNhbG51bShjKSAmJiAoYyAhPSAnICcpICYmCisJCSAgICBzdHJjaHIoIicoKSssLS4vOj0/IiwgYykgPT0gTlVMTCkKKwkJCWlhNT0xOworCQlpZiAob3NfdG9hc2NpaVtjXSAmIDB4ODApCisJCQl0NjE9MTsKKyNlbmRpZgorCQl9CisJaWYgKHQ2MSkgcmV0dXJuKFZfQVNOMV9UNjFTVFJJTkcpOworCWlmIChpYTUpIHJldHVybihWX0FTTjFfSUE1U1RSSU5HKTsKKwlyZXR1cm4oVl9BU04xX1BSSU5UQUJMRVNUUklORyk7CisJfQorCitpbnQgQVNOMV9VTklWRVJTQUxTVFJJTkdfdG9fc3RyaW5nKEFTTjFfVU5JVkVSU0FMU1RSSU5HICpzKQorCXsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKHMtPnR5cGUgIT0gVl9BU04xX1VOSVZFUlNBTFNUUklORykgcmV0dXJuKDApOworCWlmICgocy0+bGVuZ3RoJTQpICE9IDApIHJldHVybigwKTsKKwlwPXMtPmRhdGE7CisJZm9yIChpPTA7IGk8cy0+bGVuZ3RoOyBpKz00KQorCQl7CisJCWlmICgocFswXSAhPSAnXDAnKSB8fCAocFsxXSAhPSAnXDAnKSB8fCAocFsyXSAhPSAnXDAnKSkKKwkJCWJyZWFrOworCQllbHNlCisJCQlwKz00OworCQl9CisJaWYgKGkgPCBzLT5sZW5ndGgpIHJldHVybigwKTsKKwlwPXMtPmRhdGE7CisJZm9yIChpPTM7IGk8cy0+bGVuZ3RoOyBpKz00KQorCQl7CisJCSoocCsrKT1zLT5kYXRhW2ldOworCQl9CisJKihwKT0nXDAnOworCXMtPmxlbmd0aC89NDsKKwlzLT50eXBlPUFTTjFfUFJJTlRBQkxFX3R5cGUocy0+ZGF0YSxzLT5sZW5ndGgpOworCXJldHVybigxKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3NldC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzI2YzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9zZXQuYwpAQCAtMCwwICsxLDI0MSBAQAorLyogY3J5cHRvL2FzbjEvYV9zZXQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMV9tYWMuaD4KKworI2lmbmRlZiBOT19BU04xX09MRAorCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBjaGFyICpwYkRhdGE7CisgICAgaW50IGNiRGF0YTsKKyAgICB9IE1ZQkxPQjsKKworLyogU2V0QmxvYkNtcAorICogVGhpcyBmdW5jdGlvbiBjb21wYXJlcyB0d28gZWxlbWVudHMgb2YgU0VUX09GIGJsb2NrCisgKi8KK3N0YXRpYyBpbnQgU2V0QmxvYkNtcChjb25zdCB2b2lkICplbGVtMSwgY29uc3Qgdm9pZCAqZWxlbTIgKQorICAgIHsKKyAgICBjb25zdCBNWUJMT0IgKmIxID0gKGNvbnN0IE1ZQkxPQiAqKWVsZW0xOworICAgIGNvbnN0IE1ZQkxPQiAqYjIgPSAoY29uc3QgTVlCTE9CICopZWxlbTI7CisgICAgaW50IHI7CisKKyAgICByID0gbWVtY21wKGIxLT5wYkRhdGEsIGIyLT5wYkRhdGEsCisJICAgICAgIGIxLT5jYkRhdGEgPCBiMi0+Y2JEYXRhID8gYjEtPmNiRGF0YSA6IGIyLT5jYkRhdGEpOworICAgIGlmKHIgIT0gMCkKKwlyZXR1cm4gcjsKKyAgICByZXR1cm4gYjEtPmNiRGF0YS1iMi0+Y2JEYXRhOworICAgIH0KKworLyogaW50IGlzX3NldDogIGlmIFRSVUUsIHRoZW4gc29ydCB0aGUgY29udGVudHMgKGkuZS4gaXQgaXNuJ3QgYSBTRVFVRU5DRSkgICAgKi8KK2ludCBpMmRfQVNOMV9TRVQoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJIGkyZF9vZl92b2lkICppMmQsIGludCBleF90YWcsIGludCBleF9jbGFzcywKKwkJIGludCBpc19zZXQpCisJeworCWludCByZXQ9MCxyOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKnA7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBTdGFydCwgKnBUZW1wTWVtOworICAgICAgICBNWUJMT0IgKnJnU2V0QmxvYjsKKyAgICAgICAgaW50IHRvdFNpemU7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJZm9yIChpPXNrX09QRU5TU0xfQkxPQ0tfbnVtKGEpLTE7IGk+PTA7IGktLSkKKwkJcmV0Kz1pMmQoc2tfT1BFTlNTTF9CTE9DS192YWx1ZShhLGkpLE5VTEwpOworCXI9QVNOMV9vYmplY3Rfc2l6ZSgxLHJldCxleF90YWcpOworCWlmIChwcCA9PSBOVUxMKSByZXR1cm4ocik7CisKKwlwPSAqcHA7CisJQVNOMV9wdXRfb2JqZWN0KCZwLDEscmV0LGV4X3RhZyxleF9jbGFzcyk7CisKKy8qIE1vZGlmaWVkIGJ5IGdwQG5zai5jby5qcCAqLworCS8qIEFuZCB0aGVuIGFnYWluIGJ5IEJlbiAqLworCS8qIEFuZCBhZ2FpbiBieSBTdGV2ZSAqLworCisJaWYoIWlzX3NldCB8fCAoc2tfT1BFTlNTTF9CTE9DS19udW0oYSkgPCAyKSkKKwkJeworCQlmb3IgKGk9MDsgaTxza19PUEVOU1NMX0JMT0NLX251bShhKTsgaSsrKQorICAgICAgICAgICAgICAgIAlpMmQoc2tfT1BFTlNTTF9CTE9DS192YWx1ZShhLGkpLCZwKTsKKworCQkqcHA9cDsKKwkJcmV0dXJuKHIpOworCQl9CisKKyAgICAgICAgcFN0YXJ0ICA9IHA7IC8qIENhdGNoIHRoZSBiZWcgb2YgU2V0YmxvYnMqLworCQkvKiBJbiB0aGlzIGFycmF5IHdlIHdpbGwgc3RvcmUgdGhlIFNFVCBibG9icyAqLworCQlyZ1NldEJsb2IgPSBPUEVOU1NMX21hbGxvYyhza19PUEVOU1NMX0JMT0NLX251bShhKSAqIHNpemVvZihNWUJMT0IpKTsKKwkJaWYgKHJnU2V0QmxvYiA9PSBOVUxMKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfSTJEX0FTTjFfU0VULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKworICAgICAgICBmb3IgKGk9MDsgaTxza19PUEVOU1NMX0JMT0NLX251bShhKTsgaSsrKQorCSAgICAgICAgeworICAgICAgICAgICAgICAgIHJnU2V0QmxvYltpXS5wYkRhdGEgPSBwOyAgLyogY2F0Y2ggZWFjaCBzZXQgZW5jb2RlIGJsb2IgKi8KKyAgICAgICAgICAgICAgICBpMmQoc2tfT1BFTlNTTF9CTE9DS192YWx1ZShhLGkpLCZwKTsKKyAgICAgICAgICAgICAgICByZ1NldEJsb2JbaV0uY2JEYXRhID0gcCAtIHJnU2V0QmxvYltpXS5wYkRhdGE7IC8qIExlbmd0aCBvZiB0aGlzCitTZXRCbG9iCisqLworCQl9CisgICAgICAgICpwcD1wOworICAgICAgICB0b3RTaXplID0gcCAtIHBTdGFydDsgLyogVGhpcyBpcyB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgc2V0IGJsb2JzICovCisKKyAvKiBOb3cgd2UgaGF2ZSB0byBzb3J0IHRoZSBibG9icy4gSSBhbSB1c2luZyBhIHNpbXBsZSBhbGdvLgorICAgICpTb3J0IHB0cnMgKkNvcHkgdG8gdGVtcC1tZW0gKkNvcHkgZnJvbSB0ZW1wLW1lbSB0byB1c2VyLW1lbSovCisgICAgICAgIHFzb3J0KCByZ1NldEJsb2IsIHNrX09QRU5TU0xfQkxPQ0tfbnVtKGEpLCBzaXplb2YoTVlCTE9CKSwgU2V0QmxvYkNtcCk7CisJCWlmICghKHBUZW1wTWVtID0gT1BFTlNTTF9tYWxsb2ModG90U2l6ZSkpKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfSTJEX0FTTjFfU0VULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKworLyogQ29weSB0byB0ZW1wIG1lbSAqLworICAgICAgICBwID0gcFRlbXBNZW07CisgICAgICAgIGZvcihpPTA7IGk8c2tfT1BFTlNTTF9CTE9DS19udW0oYSk7ICsraSkKKwkJeworICAgICAgICAgICAgICAgIG1lbWNweShwLCByZ1NldEJsb2JbaV0ucGJEYXRhLCByZ1NldEJsb2JbaV0uY2JEYXRhKTsKKyAgICAgICAgICAgICAgICBwICs9IHJnU2V0QmxvYltpXS5jYkRhdGE7CisJCX0KKworLyogQ29weSBiYWNrIHRvIHVzZXIgbWVtKi8KKyAgICAgICAgbWVtY3B5KHBTdGFydCwgcFRlbXBNZW0sIHRvdFNpemUpOworICAgICAgICBPUEVOU1NMX2ZyZWUocFRlbXBNZW0pOworICAgICAgICBPUEVOU1NMX2ZyZWUocmdTZXRCbG9iKTsKKworICAgICAgICByZXR1cm4ocik7CisgICAgICAgIH0KKworU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKmQyaV9BU04xX1NFVChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKmEsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQkgICAgICBsb25nIGxlbmd0aCwgZDJpX29mX3ZvaWQgKmQyaSwKKwkJCSAgICAgIHZvaWQgKCpmcmVlX2Z1bmMpKE9QRU5TU0xfQkxPQ0spLCBpbnQgZXhfdGFnLAorCQkJICAgICAgaW50IGV4X2NsYXNzKQorCXsKKwlBU04xX2NvbnN0X0NUWCBjOworCVNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpyZXQ9TlVMTDsKKworCWlmICgoYSA9PSBOVUxMKSB8fCAoKCphKSA9PSBOVUxMKSkKKwkJeworCQlpZiAoKHJldD1za19PUEVOU1NMX0JMT0NLX25ld19udWxsKCkpID09IE5VTEwpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9TRVQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXJldD0oKmEpOworCisJYy5wPSAqcHA7CisJYy5tYXg9KGxlbmd0aCA9PSAwKT8wOihjLnArbGVuZ3RoKTsKKworCWMuaW5mPUFTTjFfZ2V0X29iamVjdCgmYy5wLCZjLnNsZW4sJmMudGFnLCZjLnhjbGFzcyxjLm1heC1jLnApOworCWlmIChjLmluZiAmIDB4ODApIGdvdG8gZXJyOworCWlmIChleF9jbGFzcyAhPSBjLnhjbGFzcykKKwkJeworCQlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9TRVQsQVNOMV9SX0JBRF9DTEFTUyk7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKGV4X3RhZyAhPSBjLnRhZykKKwkJeworCQlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9TRVQsQVNOMV9SX0JBRF9UQUcpOworCQlnb3RvIGVycjsKKwkJfQorCWlmICgoYy5zbGVuK2MucCkgPiBjLm1heCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9TRVQsQVNOMV9SX0xFTkdUSF9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisJLyogY2hlY2sgZm9yIGluZmluaXRlIGNvbnN0cnVjdGVkIC0gaXQgY2FuIGJlIGFzIGxvbmcKKwkgKiBhcyB0aGUgYW1vdW50IG9mIGRhdGEgcGFzc2VkIHRvIHVzICovCisJaWYgKGMuaW5mID09IChWX0FTTjFfQ09OU1RSVUNURUQrMSkpCisJCWMuc2xlbj1sZW5ndGgrICpwcC1jLnA7CisJYy5tYXg9Yy5wK2Muc2xlbjsKKworCXdoaWxlIChjLnAgPCBjLm1heCkKKwkJeworCQljaGFyICpzOworCisJCWlmIChNX0FTTjFfRDJJX2VuZF9zZXF1ZW5jZSgpKSBicmVhazsKKwkJLyogWFhYOiBUaGlzIHdhcyBjYWxsZWQgd2l0aCA0IGFyZ3VtZW50cywgaW5jb3JyZWN0bHksIGl0IHNlZW1zCisJCSAgIGlmICgocz1mdW5jKE5VTEwsJmMucCxjLnNsZW4sYy5tYXgtYy5wKSkgPT0gTlVMTCkgKi8KKwkJaWYgKChzPWQyaShOVUxMLCZjLnAsYy5zbGVuKSkgPT0gTlVMTCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0QySV9BU04xX1NFVCxBU04xX1JfRVJST1JfUEFSU0lOR19TRVRfRUxFTUVOVCk7CisJCQlhc24xX2FkZF9lcnJvcigqcHAsKGludCkoYy5wLSAqcHApKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoIXNrX09QRU5TU0xfQkxPQ0tfcHVzaChyZXQscykpIGdvdG8gZXJyOworCQl9CisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7CisJKnBwPWMucDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQl7CisJCWlmIChmcmVlX2Z1bmMgIT0gTlVMTCkKKwkJCXNrX09QRU5TU0xfQkxPQ0tfcG9wX2ZyZWUocmV0LGZyZWVfZnVuYyk7CisJCWVsc2UKKwkJCXNrX09QRU5TU0xfQkxPQ0tfZnJlZShyZXQpOworCQl9CisJcmV0dXJuKE5VTEwpOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3NpZ24uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2Ffc2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNjNiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3NpZ24uYwpAQCAtMCwwICsxLDI5OCBAQAorLyogY3J5cHRvL2FzbjEvYV9zaWduLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorCisjaWZuZGVmIE5PX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgImFzbjFfbG9jbC5oIgorCisjaWZuZGVmIE5PX0FTTjFfT0xECisKK2ludCBBU04xX3NpZ24oaTJkX29mX3ZvaWQgKmkyZCwgWDUwOV9BTEdPUiAqYWxnb3IxLCBYNTA5X0FMR09SICphbGdvcjIsCisJICAgICAgQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmUsIGNoYXIgKmRhdGEsIEVWUF9QS0VZICpwa2V5LAorCSAgICAgIGNvbnN0IEVWUF9NRCAqdHlwZSkKKwl7CisJRVZQX01EX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciAqcCwqYnVmX2luPU5VTEwsKmJ1Zl9vdXQ9TlVMTDsKKwlpbnQgaSxpbmw9MCxvdXRsPTAsb3V0bGw9MDsKKwlYNTA5X0FMR09SICphOworCisJRVZQX01EX0NUWF9pbml0KCZjdHgpOworCWZvciAoaT0wOyBpPDI7IGkrKykKKwkJeworCQlpZiAoaSA9PSAwKQorCQkJYT1hbGdvcjE7CisJCWVsc2UKKwkJCWE9YWxnb3IyOworCQlpZiAoYSA9PSBOVUxMKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZS0+cGtleV90eXBlID09IE5JRF9kc2FXaXRoU0hBMSkKKwkJCXsKKwkJCS8qIHNwZWNpYWwgY2FzZTogUkZDIDI0NTkgdGVsbHMgdXMgdG8gb21pdCAncGFyYW1ldGVycycKKwkJCSAqIHdpdGggaWQtZHNhLXdpdGgtc2hhMSAqLworCQkJQVNOMV9UWVBFX2ZyZWUoYS0+cGFyYW1ldGVyKTsKKwkJCWEtPnBhcmFtZXRlciA9IE5VTEw7CisJCQl9CisJCWVsc2UgaWYgKChhLT5wYXJhbWV0ZXIgPT0gTlVMTCkgfHwgCisJCQkoYS0+cGFyYW1ldGVyLT50eXBlICE9IFZfQVNOMV9OVUxMKSkKKwkJCXsKKwkJCUFTTjFfVFlQRV9mcmVlKGEtPnBhcmFtZXRlcik7CisJCQlpZiAoKGEtPnBhcmFtZXRlcj1BU04xX1RZUEVfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCQkJYS0+cGFyYW1ldGVyLT50eXBlPVZfQVNOMV9OVUxMOworCQkJfQorCQlBU04xX09CSkVDVF9mcmVlKGEtPmFsZ29yaXRobSk7CisJCWEtPmFsZ29yaXRobT1PQkpfbmlkMm9iaih0eXBlLT5wa2V5X3R5cGUpOworCQlpZiAoYS0+YWxnb3JpdGhtID09IE5VTEwpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NJR04sQVNOMV9SX1VOS05PV05fT0JKRUNUX1RZUEUpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmIChhLT5hbGdvcml0aG0tPmxlbmd0aCA9PSAwKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9TSUdOLEFTTjFfUl9USEVfQVNOMV9PQkpFQ1RfSURFTlRJRklFUl9JU19OT1RfS05PV05fRk9SX1RISVNfTUQpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlpbmw9aTJkKGRhdGEsTlVMTCk7CisJYnVmX2luPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKHVuc2lnbmVkIGludClpbmwpOworCW91dGxsPW91dGw9RVZQX1BLRVlfc2l6ZShwa2V5KTsKKwlidWZfb3V0PSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKHVuc2lnbmVkIGludClvdXRsKTsKKwlpZiAoKGJ1Zl9pbiA9PSBOVUxMKSB8fCAoYnVmX291dCA9PSBOVUxMKSkKKwkJeworCQlvdXRsPTA7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU0lHTixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisJcD1idWZfaW47CisKKwlpMmQoZGF0YSwmcCk7CisJRVZQX1NpZ25Jbml0X2V4KCZjdHgsdHlwZSwgTlVMTCk7CisJRVZQX1NpZ25VcGRhdGUoJmN0eCwodW5zaWduZWQgY2hhciAqKWJ1Zl9pbixpbmwpOworCWlmICghRVZQX1NpZ25GaW5hbCgmY3R4LCh1bnNpZ25lZCBjaGFyICopYnVmX291dCwKKwkJCSh1bnNpZ25lZCBpbnQgKikmb3V0bCxwa2V5KSkKKwkJeworCQlvdXRsPTA7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU0lHTixFUlJfUl9FVlBfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoc2lnbmF0dXJlLT5kYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzaWduYXR1cmUtPmRhdGEpOworCXNpZ25hdHVyZS0+ZGF0YT1idWZfb3V0OworCWJ1Zl9vdXQ9TlVMTDsKKwlzaWduYXR1cmUtPmxlbmd0aD1vdXRsOworCS8qIEluIHRoZSBpbnRlcmVzdHMgb2YgY29tcGF0aWJpbGl0eSwgSSdsbCBtYWtlIHN1cmUgdGhhdAorCSAqIHRoZSBiaXQgc3RyaW5nIGhhcyBhICdub3QtdXNlZCBiaXRzJyB2YWx1ZSBvZiAwCisJICovCisJc2lnbmF0dXJlLT5mbGFncyY9IH4oQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlR8MHgwNyk7CisJc2lnbmF0dXJlLT5mbGFnc3w9QVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlQ7CitlcnI6CisJRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOworCWlmIChidWZfaW4gIT0gTlVMTCkKKwkJeyBPUEVOU1NMX2NsZWFuc2UoKGNoYXIgKilidWZfaW4sKHVuc2lnbmVkIGludClpbmwpOyBPUEVOU1NMX2ZyZWUoYnVmX2luKTsgfQorCWlmIChidWZfb3V0ICE9IE5VTEwpCisJCXsgT1BFTlNTTF9jbGVhbnNlKChjaGFyICopYnVmX291dCxvdXRsbCk7IE9QRU5TU0xfZnJlZShidWZfb3V0KTsgfQorCXJldHVybihvdXRsKTsKKwl9CisKKyNlbmRpZgorCitpbnQgQVNOMV9pdGVtX3NpZ24oY29uc3QgQVNOMV9JVEVNICppdCwgWDUwOV9BTEdPUiAqYWxnb3IxLCBYNTA5X0FMR09SICphbGdvcjIsCisJICAgICBBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZSwgdm9pZCAqYXNuLCBFVlBfUEtFWSAqcGtleSwKKwkgICAgIGNvbnN0IEVWUF9NRCAqdHlwZSkKKwl7CisJRVZQX01EX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciAqYnVmX2luPU5VTEwsKmJ1Zl9vdXQ9TlVMTDsKKwlpbnQgaW5sPTAsb3V0bD0wLG91dGxsPTA7CisJaW50IHNpZ25pZCwgcGFyYW10eXBlOworCisJaWYgKHR5cGUgPT0gTlVMTCkKKwkJeworCQlpbnQgZGVmX25pZDsKKwkJaWYgKEVWUF9QS0VZX2dldF9kZWZhdWx0X2RpZ2VzdF9uaWQocGtleSwgJmRlZl9uaWQpID4gMCkKKwkJCXR5cGUgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmlkKGRlZl9uaWQpOworCQl9CisKKwlpZiAodHlwZSA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9TSUdOLCBBU04xX1JfTk9fREVGQVVMVF9ESUdFU1QpOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKHR5cGUtPmZsYWdzICYgRVZQX01EX0ZMQUdfUEtFWV9NRVRIT0RfU0lHTkFUVVJFKQorCQl7CisJCWlmICghcGtleS0+YW1ldGggfHwKKwkJCSFPQkpfZmluZF9zaWdpZF9ieV9hbGdzKCZzaWduaWQsIEVWUF9NRF9uaWQodHlwZSksCisJCQkJCQlwa2V5LT5hbWV0aC0+cGtleV9pZCkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fU0lHTiwKKwkJCQlBU04xX1JfRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVEKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJZWxzZQorCQlzaWduaWQgPSB0eXBlLT5wa2V5X3R5cGU7CisKKwlpZiAocGtleS0+YW1ldGgtPnBrZXlfZmxhZ3MgJiBBU04xX1BLRVlfU0lHUEFSQU1fTlVMTCkKKwkJcGFyYW10eXBlID0gVl9BU04xX05VTEw7CisJZWxzZQorCQlwYXJhbXR5cGUgPSBWX0FTTjFfVU5ERUY7CisKKwlpZiAoYWxnb3IxKQorCQlYNTA5X0FMR09SX3NldDAoYWxnb3IxLCBPQkpfbmlkMm9iaihzaWduaWQpLCBwYXJhbXR5cGUsIE5VTEwpOworCWlmIChhbGdvcjIpCisJCVg1MDlfQUxHT1Jfc2V0MChhbGdvcjIsIE9CSl9uaWQyb2JqKHNpZ25pZCksIHBhcmFtdHlwZSwgTlVMTCk7CisKKwlFVlBfTURfQ1RYX2luaXQoJmN0eCk7CisJaW5sPUFTTjFfaXRlbV9pMmQoYXNuLCZidWZfaW4sIGl0KTsKKwlvdXRsbD1vdXRsPUVWUF9QS0VZX3NpemUocGtleSk7CisJYnVmX291dD0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKCh1bnNpZ25lZCBpbnQpb3V0bCk7CisJaWYgKChidWZfaW4gPT0gTlVMTCkgfHwgKGJ1Zl9vdXQgPT0gTlVMTCkpCisJCXsKKwkJb3V0bD0wOworCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fU0lHTixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlFVlBfU2lnbkluaXRfZXgoJmN0eCx0eXBlLCBOVUxMKTsKKwlFVlBfU2lnblVwZGF0ZSgmY3R4LCh1bnNpZ25lZCBjaGFyICopYnVmX2luLGlubCk7CisJaWYgKCFFVlBfU2lnbkZpbmFsKCZjdHgsKHVuc2lnbmVkIGNoYXIgKilidWZfb3V0LAorCQkJKHVuc2lnbmVkIGludCAqKSZvdXRsLHBrZXkpKQorCQl7CisJCW91dGw9MDsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX1NJR04sRVJSX1JfRVZQX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKHNpZ25hdHVyZS0+ZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoc2lnbmF0dXJlLT5kYXRhKTsKKwlzaWduYXR1cmUtPmRhdGE9YnVmX291dDsKKwlidWZfb3V0PU5VTEw7CisJc2lnbmF0dXJlLT5sZW5ndGg9b3V0bDsKKwkvKiBJbiB0aGUgaW50ZXJlc3RzIG9mIGNvbXBhdGliaWxpdHksIEknbGwgbWFrZSBzdXJlIHRoYXQKKwkgKiB0aGUgYml0IHN0cmluZyBoYXMgYSAnbm90LXVzZWQgYml0cycgdmFsdWUgb2YgMAorCSAqLworCXNpZ25hdHVyZS0+ZmxhZ3MmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUfDB4MDcpOworCXNpZ25hdHVyZS0+ZmxhZ3N8PUFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUOworZXJyOgorCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKwlpZiAoYnVmX2luICE9IE5VTEwpCisJCXsgT1BFTlNTTF9jbGVhbnNlKChjaGFyICopYnVmX2luLCh1bnNpZ25lZCBpbnQpaW5sKTsgT1BFTlNTTF9mcmVlKGJ1Zl9pbik7IH0KKwlpZiAoYnVmX291dCAhPSBOVUxMKQorCQl7IE9QRU5TU0xfY2xlYW5zZSgoY2hhciAqKWJ1Zl9vdXQsb3V0bGwpOyBPUEVOU1NMX2ZyZWUoYnVmX291dCk7IH0KKwlyZXR1cm4ob3V0bCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9zdHJleC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV9zdHJleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzE0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3N0cmV4LmMKQEAgLTAsMCArMSw1NjcgQEAKKy8qIGFfc3RyZXguYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaW5jbHVkZSAiY2hhcm1hcC5oIgorCisvKiBBU04xX1NUUklOR19wcmludF9leCgpIGFuZCBYNTA5X05BTUVfcHJpbnRfZXgoKS4KKyAqIEVuaGFuY2VkIHN0cmluZyBhbmQgbmFtZSBwcmludGluZyByb3V0aW5lcyBoYW5kbGluZworICogbXVsdGlieXRlIGNoYXJhY3RlcnMsIFJGQzIyNTMgYW5kIGEgaG9zdCBvZiBvdGhlcgorICogb3B0aW9ucy4KKyAqLworCisKKyNkZWZpbmUgQ0hBUlRZUEVfQlNfRVNDCQkoQVNOMV9TVFJGTEdTX0VTQ18yMjUzIHwgQ0hBUlRZUEVfRklSU1RfRVNDXzIyNTMgfCBDSEFSVFlQRV9MQVNUX0VTQ18yMjUzKQorCisKKy8qIFRocmVlIElPIGZ1bmN0aW9ucyBmb3Igc2VuZGluZyBkYXRhIHRvIG1lbW9yeSwgYSBCSU8gYW5kCisgKiBhbmQgYSBGSUxFIHBvaW50ZXIuCisgKi8KKyNpZiAwCQkJCS8qIG5ldmVyIHVzZWQgKi8KK3N0YXRpYyBpbnQgc2VuZF9tZW1fY2hhcnModm9pZCAqYXJnLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqKm91dCA9IGFyZzsKKwlpZighb3V0KSByZXR1cm4gMTsKKwltZW1jcHkoKm91dCwgYnVmLCBsZW4pOworCSpvdXQgKz0gbGVuOworCXJldHVybiAxOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc2VuZF9iaW9fY2hhcnModm9pZCAqYXJnLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCit7CisJaWYoIWFyZykgcmV0dXJuIDE7CisJaWYoQklPX3dyaXRlKGFyZywgYnVmLCBsZW4pICE9IGxlbikgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9mcF9jaGFycyh2b2lkICphcmcsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlpZighYXJnKSByZXR1cm4gMTsKKwlpZihmd3JpdGUoYnVmLCAxLCBsZW4sIGFyZykgIT0gKHVuc2lnbmVkIGludClsZW4pIHJldHVybiAwOworCXJldHVybiAxOworfQorCit0eXBlZGVmIGludCBjaGFyX2lvKHZvaWQgKmFyZywgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKTsKKworLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGRpc3BsYXkgb2YKKyAqIHN0cmluZ3MsIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgorICogSXQgaXMgcGFzc2VkIGFuIHVuc2lnbmVkIGxvbmcgZm9yIGVhY2gKKyAqIGNoYXJhY3RlciBiZWNhdXNlIGl0IGNvdWxkIGNvbWUgZnJvbSAyIG9yIGV2ZW4KKyAqIDQgYnl0ZSBmb3Jtcy4KKyAqLworCitzdGF0aWMgaW50IGRvX2VzY19jaGFyKHVuc2lnbmVkIGxvbmcgYywgdW5zaWduZWQgY2hhciBmbGFncywgY2hhciAqZG9fcXVvdGVzLCBjaGFyX2lvICppb19jaCwgdm9pZCAqYXJnKQoreworCXVuc2lnbmVkIGNoYXIgY2hmbGdzLCBjaHRtcDsKKwljaGFyIHRtcGhleFtIRVhfU0laRShsb25nKSszXTsKKworCWlmKGMgPiAweGZmZmZmZmZmTCkKKwkJcmV0dXJuIC0xOworCWlmKGMgPiAweGZmZmYpIHsKKwkJQklPX3NucHJpbnRmKHRtcGhleCwgc2l6ZW9mIHRtcGhleCwgIlxcVyUwOGxYIiwgYyk7CisJCWlmKCFpb19jaChhcmcsIHRtcGhleCwgMTApKSByZXR1cm4gLTE7CisJCXJldHVybiAxMDsKKwl9CisJaWYoYyA+IDB4ZmYpIHsKKwkJQklPX3NucHJpbnRmKHRtcGhleCwgc2l6ZW9mIHRtcGhleCwgIlxcVSUwNGxYIiwgYyk7CisJCWlmKCFpb19jaChhcmcsIHRtcGhleCwgNikpIHJldHVybiAtMTsKKwkJcmV0dXJuIDY7CisJfQorCWNodG1wID0gKHVuc2lnbmVkIGNoYXIpYzsKKwlpZihjaHRtcCA+IDB4N2YpIGNoZmxncyA9IGZsYWdzICYgQVNOMV9TVFJGTEdTX0VTQ19NU0I7CisJZWxzZSBjaGZsZ3MgPSBjaGFyX3R5cGVbY2h0bXBdICYgZmxhZ3M7CisJaWYoY2hmbGdzICYgQ0hBUlRZUEVfQlNfRVNDKSB7CisJCS8qIElmIHdlIGRvbid0IGVzY2FwZSB3aXRoIHF1b3Rlcywgc2lnbmFsIHdlIG5lZWQgcXVvdGVzICovCisJCWlmKGNoZmxncyAmIEFTTjFfU1RSRkxHU19FU0NfUVVPVEUpIHsKKwkJCWlmKGRvX3F1b3RlcykgKmRvX3F1b3RlcyA9IDE7CisJCQlpZighaW9fY2goYXJnLCAmY2h0bXAsIDEpKSByZXR1cm4gLTE7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZighaW9fY2goYXJnLCAiXFwiLCAxKSkgcmV0dXJuIC0xOworCQlpZighaW9fY2goYXJnLCAmY2h0bXAsIDEpKSByZXR1cm4gLTE7CisJCXJldHVybiAyOworCX0KKwlpZihjaGZsZ3MgJiAoQVNOMV9TVFJGTEdTX0VTQ19DVFJMfEFTTjFfU1RSRkxHU19FU0NfTVNCKSkgeworCQlCSU9fc25wcmludGYodG1waGV4LCAxMSwgIlxcJTAyWCIsIGNodG1wKTsKKwkJaWYoIWlvX2NoKGFyZywgdG1waGV4LCAzKSkgcmV0dXJuIC0xOworCQlyZXR1cm4gMzsKKwl9CisJaWYoIWlvX2NoKGFyZywgJmNodG1wLCAxKSkgcmV0dXJuIC0xOworCXJldHVybiAxOworfQorCisjZGVmaW5lIEJVRl9UWVBFX1dJRFRIX01BU0sJMHg3CisjZGVmaW5lIEJVRl9UWVBFX0NPTlZVVEY4CTB4OAorCisvKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGVhY2ggY2hhcmFjdGVyIGluIGEgYnVmZmVyIHRvCisgKiBkb19lc2NfY2hhcigpLiBJdCBpbnRlcnByZXRzIHRoZSBjb250ZW50IGZvcm1hdHMKKyAqIGFuZCBjb252ZXJ0cyB0byBvciBmcm9tIFVURjggYXMgYXBwcm9wcmlhdGUuCisgKi8KKworc3RhdGljIGludCBkb19idWYodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmbGVuLAorCQkJaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgZmxhZ3MsIGNoYXIgKnF1b3RlcywgY2hhcl9pbyAqaW9fY2gsIHZvaWQgKmFyZykKK3sKKwlpbnQgaSwgb3V0bGVuLCBsZW47CisJdW5zaWduZWQgY2hhciBvcmZsYWdzLCAqcCwgKnE7CisJdW5zaWduZWQgbG9uZyBjOworCXAgPSBidWY7CisJcSA9IGJ1ZiArIGJ1ZmxlbjsKKwlvdXRsZW4gPSAwOworCXdoaWxlKHAgIT0gcSkgeworCQlpZihwID09IGJ1ZiAmJiBmbGFncyAmIEFTTjFfU1RSRkxHU19FU0NfMjI1Mykgb3JmbGFncyA9IENIQVJUWVBFX0ZJUlNUX0VTQ18yMjUzOworCQllbHNlIG9yZmxhZ3MgPSAwOworCQlzd2l0Y2godHlwZSAmIEJVRl9UWVBFX1dJRFRIX01BU0spIHsKKwkJCWNhc2UgNDoKKwkJCWMgPSAoKHVuc2lnbmVkIGxvbmcpKnArKykgPDwgMjQ7CisJCQljIHw9ICgodW5zaWduZWQgbG9uZykqcCsrKSA8PCAxNjsKKwkJCWMgfD0gKCh1bnNpZ25lZCBsb25nKSpwKyspIDw8IDg7CisJCQljIHw9ICpwKys7CisJCQlicmVhazsKKworCQkJY2FzZSAyOgorCQkJYyA9ICgodW5zaWduZWQgbG9uZykqcCsrKSA8PCA4OworCQkJYyB8PSAqcCsrOworCQkJYnJlYWs7CisKKwkJCWNhc2UgMToKKwkJCWMgPSAqcCsrOworCQkJYnJlYWs7CisJCQkKKwkJCWNhc2UgMDoKKwkJCWkgPSBVVEY4X2dldGMocCwgYnVmbGVuLCAmYyk7CisJCQlpZihpIDwgMCkgcmV0dXJuIC0xOwkvKiBJbnZhbGlkIFVURjhTdHJpbmcgKi8KKwkJCXAgKz0gaTsKKwkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCXJldHVybiAtMTsJLyogaW52YWxpZCB3aWR0aCAqLworCQl9CisJCWlmIChwID09IHEgJiYgZmxhZ3MgJiBBU04xX1NUUkZMR1NfRVNDXzIyNTMpIG9yZmxhZ3MgPSBDSEFSVFlQRV9MQVNUX0VTQ18yMjUzOworCQlpZih0eXBlICYgQlVGX1RZUEVfQ09OVlVURjgpIHsKKwkJCXVuc2lnbmVkIGNoYXIgdXRmYnVmWzZdOworCQkJaW50IHV0ZmxlbjsKKwkJCXV0ZmxlbiA9IFVURjhfcHV0Yyh1dGZidWYsIHNpemVvZiB1dGZidWYsIGMpOworCQkJZm9yKGkgPSAwOyBpIDwgdXRmbGVuOyBpKyspIHsKKwkJCQkvKiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgb3JmbGFncyBjb3JyZWN0bHkKKwkJCQkgKiBiZWNhdXNlIGlmIHV0Zmxlbj09MSBpdHMgdmFsdWUgd2lsbCBiZSBjb3JyZWN0IGFueXdheSAKKwkJCQkgKiBvdGhlcndpc2UgZWFjaCBjaGFyYWN0ZXIgd2lsbCBiZSA+IDB4N2YgYW5kIHNvIHRoZSAKKwkJCQkgKiBjaGFyYWN0ZXIgd2lsbCBuZXZlciBiZSBlc2NhcGVkIG9uIGZpcnN0IGFuZCBsYXN0LgorCQkJCSAqLworCQkJCWxlbiA9IGRvX2VzY19jaGFyKHV0ZmJ1ZltpXSwgKHVuc2lnbmVkIGNoYXIpKGZsYWdzIHwgb3JmbGFncyksIHF1b3RlcywgaW9fY2gsIGFyZyk7CisJCQkJaWYobGVuIDwgMCkgcmV0dXJuIC0xOworCQkJCW91dGxlbiArPSBsZW47CisJCQl9CisJCX0gZWxzZSB7CisJCQlsZW4gPSBkb19lc2NfY2hhcihjLCAodW5zaWduZWQgY2hhcikoZmxhZ3MgfCBvcmZsYWdzKSwgcXVvdGVzLCBpb19jaCwgYXJnKTsKKwkJCWlmKGxlbiA8IDApIHJldHVybiAtMTsKKwkJCW91dGxlbiArPSBsZW47CisJCX0KKwl9CisJcmV0dXJuIG91dGxlbjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBoZXggZHVtcHMgYSBidWZmZXIgb2YgY2hhcmFjdGVycyAqLworCitzdGF0aWMgaW50IGRvX2hleF9kdW1wKGNoYXJfaW8gKmlvX2NoLCB2b2lkICphcmcsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBoZXhkaWdbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKwl1bnNpZ25lZCBjaGFyICpwLCAqcTsKKwljaGFyIGhleHRtcFsyXTsKKwlpZihhcmcpIHsKKwkJcCA9IGJ1ZjsKKwkJcSA9IGJ1ZiArIGJ1ZmxlbjsKKwkJd2hpbGUocCAhPSBxKSB7CisJCQloZXh0bXBbMF0gPSBoZXhkaWdbKnAgPj4gNF07CisJCQloZXh0bXBbMV0gPSBoZXhkaWdbKnAgJiAweGZdOworCQkJaWYoIWlvX2NoKGFyZywgaGV4dG1wLCAyKSkgcmV0dXJuIC0xOworCQkJcCsrOworCQl9CisJfQorCXJldHVybiBidWZsZW4gPDwgMTsKK30KKworLyogImR1bXAiIGEgc3RyaW5nLiBUaGlzIGlzIGRvbmUgd2hlbiB0aGUgdHlwZSBpcyB1bmtub3duLAorICogb3IgdGhlIGZsYWdzIHJlcXVlc3QgaXQuIFdlIGNhbiBlaXRoZXIgZHVtcCB0aGUgY29udGVudAorICogb2N0ZXRzIG9yIHRoZSBlbnRpcmUgREVSIGVuY29kaW5nLiBUaGlzIHVzZXMgdGhlIFJGQzIyNTMKKyAqICMwMTIzNCBmb3JtYXQuCisgKi8KKworc3RhdGljIGludCBkb19kdW1wKHVuc2lnbmVkIGxvbmcgbGZsYWdzLCBjaGFyX2lvICppb19jaCwgdm9pZCAqYXJnLCBBU04xX1NUUklORyAqc3RyKQoreworCS8qIFBsYWNpbmcgdGhlIEFTTjFfU1RSSU5HIGluIGEgdGVtcCBBU04xX1RZUEUgYWxsb3dzCisJICogdGhlIERFUiBlbmNvZGluZyB0byByZWFkaWx5IG9idGFpbmVkCisJICovCisJQVNOMV9UWVBFIHQ7CisJdW5zaWduZWQgY2hhciAqZGVyX2J1ZiwgKnA7CisJaW50IG91dGxlbiwgZGVyX2xlbjsKKworCWlmKCFpb19jaChhcmcsICIjIiwgMSkpIHJldHVybiAtMTsKKwkvKiBJZiB3ZSBkb24ndCBkdW1wIERFUiBlbmNvZGluZyBqdXN0IGR1bXAgY29udGVudCBvY3RldHMgKi8KKwlpZighKGxmbGFncyAmIEFTTjFfU1RSRkxHU19EVU1QX0RFUikpIHsKKwkJb3V0bGVuID0gZG9faGV4X2R1bXAoaW9fY2gsIGFyZywgc3RyLT5kYXRhLCBzdHItPmxlbmd0aCk7CisJCWlmKG91dGxlbiA8IDApIHJldHVybiAtMTsKKwkJcmV0dXJuIG91dGxlbiArIDE7CisJfQorCXQudHlwZSA9IHN0ci0+dHlwZTsKKwl0LnZhbHVlLnB0ciA9IChjaGFyICopc3RyOworCWRlcl9sZW4gPSBpMmRfQVNOMV9UWVBFKCZ0LCBOVUxMKTsKKwlkZXJfYnVmID0gT1BFTlNTTF9tYWxsb2MoZGVyX2xlbik7CisJaWYoIWRlcl9idWYpIHJldHVybiAtMTsKKwlwID0gZGVyX2J1ZjsKKwlpMmRfQVNOMV9UWVBFKCZ0LCAmcCk7CisJb3V0bGVuID0gZG9faGV4X2R1bXAoaW9fY2gsIGFyZywgZGVyX2J1ZiwgZGVyX2xlbik7CisJT1BFTlNTTF9mcmVlKGRlcl9idWYpOworCWlmKG91dGxlbiA8IDApIHJldHVybiAtMTsKKwlyZXR1cm4gb3V0bGVuICsgMTsKK30KKworLyogTG9va3VwIHRhYmxlIHRvIGNvbnZlcnQgdGFncyB0byBjaGFyYWN0ZXIgd2lkdGhzLAorICogMCA9IFVURjggZW5jb2RlZCwgLTEgaXMgdXNlZCBmb3Igbm9uIHN0cmluZyB0eXBlcworICogb3RoZXJ3aXNlIGl0IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGNoYXJhY3RlcgorICovCisKK3N0YXRpYyBjb25zdCBzaWduZWQgY2hhciB0YWcybmJ5dGVbXSA9IHsKKwktMSwgLTEsIC0xLCAtMSwgLTEsCS8qIDAtNCAqLworCS0xLCAtMSwgLTEsIC0xLCAtMSwJLyogNS05ICovCisJLTEsIC0xLCAwLCAtMSwJCS8qIDEwLTEzICovCisJLTEsIC0xLCAtMSwgLTEsCQkvKiAxNS0xNyAqLworCS0xLCAxLCAxLAkJLyogMTgtMjAgKi8KKwktMSwgMSwgMSwgMSwJCS8qIDIxLTI0ICovCisJLTEsIDEsIC0xLAkJLyogMjUtMjcgKi8KKwk0LCAtMSwgMgkJLyogMjgtMzAgKi8KK307CisKKyNkZWZpbmUgRVNDX0ZMQUdTIChBU04xX1NUUkZMR1NfRVNDXzIyNTMgfCBcCisJCSAgQVNOMV9TVFJGTEdTX0VTQ19RVU9URSB8IFwKKwkJICBBU04xX1NUUkZMR1NfRVNDX0NUUkwgfCBcCisJCSAgQVNOMV9TVFJGTEdTX0VTQ19NU0IpCisKKy8qIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24sIHByaW50IG91dCBhbgorICogQVNOMV9TVFJJTkcgdGFraW5nIG5vdGUgb2YgdmFyaW91cyBlc2NhcGUKKyAqIGFuZCBkaXNwbGF5IG9wdGlvbnMuIFJldHVybnMgbnVtYmVyIG9mCisgKiBjaGFyYWN0ZXJzIHdyaXR0ZW4gb3IgLTEgaWYgYW4gZXJyb3IKKyAqIG9jY3VycmVkLgorICovCisKK3N0YXRpYyBpbnQgZG9fcHJpbnRfZXgoY2hhcl9pbyAqaW9fY2gsIHZvaWQgKmFyZywgdW5zaWduZWQgbG9uZyBsZmxhZ3MsIEFTTjFfU1RSSU5HICpzdHIpCit7CisJaW50IG91dGxlbiwgbGVuOworCWludCB0eXBlOworCWNoYXIgcXVvdGVzOworCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJcXVvdGVzID0gMDsKKwkvKiBLZWVwIGEgY29weSBvZiBlc2NhcGUgZmxhZ3MgKi8KKwlmbGFncyA9ICh1bnNpZ25lZCBjaGFyKShsZmxhZ3MgJiBFU0NfRkxBR1MpOworCisJdHlwZSA9IHN0ci0+dHlwZTsKKworCW91dGxlbiA9IDA7CisKKworCWlmKGxmbGFncyAmIEFTTjFfU1RSRkxHU19TSE9XX1RZUEUpIHsKKwkJY29uc3QgY2hhciAqdGFnbmFtZTsKKwkJdGFnbmFtZSA9IEFTTjFfdGFnMnN0cih0eXBlKTsKKwkJb3V0bGVuICs9IHN0cmxlbih0YWduYW1lKTsKKwkJaWYoIWlvX2NoKGFyZywgdGFnbmFtZSwgb3V0bGVuKSB8fCAhaW9fY2goYXJnLCAiOiIsIDEpKSByZXR1cm4gLTE7IAorCQlvdXRsZW4rKzsKKwl9CisKKwkvKiBEZWNpZGUgd2hhdCB0byBkbyB3aXRoIHR5cGUsIGVpdGhlciBkdW1wIGNvbnRlbnQgb3IgZGlzcGxheSBpdCAqLworCisJLyogRHVtcCBldmVyeXRoaW5nICovCisJaWYobGZsYWdzICYgQVNOMV9TVFJGTEdTX0RVTVBfQUxMKSB0eXBlID0gLTE7CisJLyogSWdub3JlIHRoZSBzdHJpbmcgdHlwZSAqLworCWVsc2UgaWYobGZsYWdzICYgQVNOMV9TVFJGTEdTX0lHTk9SRV9UWVBFKSB0eXBlID0gMTsKKwllbHNlIHsKKwkJLyogRWxzZSBkZXRlcm1pbmUgd2lkdGggYmFzZWQgb24gdHlwZSAqLworCQlpZigodHlwZSA+IDApICYmICh0eXBlIDwgMzEpKSB0eXBlID0gdGFnMm5ieXRlW3R5cGVdOworCQllbHNlIHR5cGUgPSAtMTsKKwkJaWYoKHR5cGUgPT0gLTEpICYmICEobGZsYWdzICYgQVNOMV9TVFJGTEdTX0RVTVBfVU5LTk9XTikpIHR5cGUgPSAxOworCX0KKworCWlmKHR5cGUgPT0gLTEpIHsKKwkJbGVuID0gZG9fZHVtcChsZmxhZ3MsIGlvX2NoLCBhcmcsIHN0cik7CisJCWlmKGxlbiA8IDApIHJldHVybiAtMTsKKwkJb3V0bGVuICs9IGxlbjsKKwkJcmV0dXJuIG91dGxlbjsKKwl9CisKKwlpZihsZmxhZ3MgJiBBU04xX1NUUkZMR1NfVVRGOF9DT05WRVJUKSB7CisJCS8qIE5vdGU6IGlmIHN0cmluZyBpcyBVVEY4IGFuZCB3ZSB3YW50CisJCSAqIHRvIGNvbnZlcnQgdG8gVVRGOCB0aGVuIHdlIGp1c3QgaW50ZXJwcmV0CisJCSAqIGl0IGFzIDEgYnl0ZSBwZXIgY2hhcmFjdGVyIHRvIGF2b2lkIGNvbnZlcnRpbmcKKwkJICogdHdpY2UuCisJCSAqLworCQlpZighdHlwZSkgdHlwZSA9IDE7CisJCWVsc2UgdHlwZSB8PSBCVUZfVFlQRV9DT05WVVRGODsKKwl9CisKKwlsZW4gPSBkb19idWYoc3RyLT5kYXRhLCBzdHItPmxlbmd0aCwgdHlwZSwgZmxhZ3MsICZxdW90ZXMsIGlvX2NoLCBOVUxMKTsKKwlpZihsZW4gPCAwKSByZXR1cm4gLTE7CisJb3V0bGVuICs9IGxlbjsKKwlpZihxdW90ZXMpIG91dGxlbiArPSAyOworCWlmKCFhcmcpIHJldHVybiBvdXRsZW47CisJaWYocXVvdGVzICYmICFpb19jaChhcmcsICJcIiIsIDEpKSByZXR1cm4gLTE7CisJaWYoZG9fYnVmKHN0ci0+ZGF0YSwgc3RyLT5sZW5ndGgsIHR5cGUsIGZsYWdzLCBOVUxMLCBpb19jaCwgYXJnKSA8IDApCisJCXJldHVybiAtMTsKKwlpZihxdW90ZXMgJiYgIWlvX2NoKGFyZywgIlwiIiwgMSkpIHJldHVybiAtMTsKKwlyZXR1cm4gb3V0bGVuOworfQorCisvKiBVc2VkIGZvciBsaW5lIGluZGVudGluZzogcHJpbnQgJ2luZGVudCcgc3BhY2VzICovCisKK3N0YXRpYyBpbnQgZG9faW5kZW50KGNoYXJfaW8gKmlvX2NoLCB2b2lkICphcmcsIGludCBpbmRlbnQpCit7CisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCisJCQlpZighaW9fY2goYXJnLCAiICIsIDEpKSByZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBGTl9XSURUSF9MTgkyNQorI2RlZmluZSBGTl9XSURUSF9TTgkxMAorCitzdGF0aWMgaW50IGRvX25hbWVfZXgoY2hhcl9pbyAqaW9fY2gsIHZvaWQgKmFyZywgWDUwOV9OQU1FICpuLAorCQkJCWludCBpbmRlbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaW50IGksIHByZXYgPSAtMSwgb3JmbGFncywgY250OworCWludCBmbl9vcHQsIGZuX25pZDsKKwlBU04xX09CSkVDVCAqZm47CisJQVNOMV9TVFJJTkcgKnZhbDsKKwlYNTA5X05BTUVfRU5UUlkgKmVudDsKKwljaGFyIG9ianRtcFs4MF07CisJY29uc3QgY2hhciAqb2JqYnVmOworCWludCBvdXRsZW4sIGxlbjsKKwljaGFyICpzZXBfZG4sICpzZXBfbXYsICpzZXBfZXE7CisJaW50IHNlcF9kbl9sZW4sIHNlcF9tdl9sZW4sIHNlcF9lcV9sZW47CisJaWYoaW5kZW50IDwgMCkgaW5kZW50ID0gMDsKKwlvdXRsZW4gPSBpbmRlbnQ7CisJaWYoIWRvX2luZGVudChpb19jaCwgYXJnLCBpbmRlbnQpKSByZXR1cm4gLTE7CisJc3dpdGNoIChmbGFncyAmIFhOX0ZMQUdfU0VQX01BU0spCisJeworCQljYXNlIFhOX0ZMQUdfU0VQX01VTFRJTElORToKKwkJc2VwX2RuID0gIlxuIjsKKwkJc2VwX2RuX2xlbiA9IDE7CisJCXNlcF9tdiA9ICIgKyAiOworCQlzZXBfbXZfbGVuID0gMzsKKwkJYnJlYWs7CisKKwkJY2FzZSBYTl9GTEFHX1NFUF9DT01NQV9QTFVTOgorCQlzZXBfZG4gPSAiLCI7CisJCXNlcF9kbl9sZW4gPSAxOworCQlzZXBfbXYgPSAiKyI7CisJCXNlcF9tdl9sZW4gPSAxOworCQlpbmRlbnQgPSAwOworCQlicmVhazsKKworCQljYXNlIFhOX0ZMQUdfU0VQX0NQTFVTX1NQQzoKKwkJc2VwX2RuID0gIiwgIjsKKwkJc2VwX2RuX2xlbiA9IDI7CisJCXNlcF9tdiA9ICIgKyAiOworCQlzZXBfbXZfbGVuID0gMzsKKwkJaW5kZW50ID0gMDsKKwkJYnJlYWs7CisKKwkJY2FzZSBYTl9GTEFHX1NFUF9TUExVU19TUEM6CisJCXNlcF9kbiA9ICI7ICI7CisJCXNlcF9kbl9sZW4gPSAyOworCQlzZXBfbXYgPSAiICsgIjsKKwkJc2VwX212X2xlbiA9IDM7CisJCWluZGVudCA9IDA7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlpZihmbGFncyAmIFhOX0ZMQUdfU1BDX0VRKSB7CisJCXNlcF9lcSA9ICIgPSAiOworCQlzZXBfZXFfbGVuID0gMzsKKwl9IGVsc2UgeworCQlzZXBfZXEgPSAiPSI7CisJCXNlcF9lcV9sZW4gPSAxOworCX0KKworCWZuX29wdCA9IGZsYWdzICYgWE5fRkxBR19GTl9NQVNLOworCisJY250ID0gWDUwOV9OQU1FX2VudHJ5X2NvdW50KG4pOwkKKwlmb3IoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlpZihmbGFncyAmIFhOX0ZMQUdfRE5fUkVWKQorCQkJCWVudCA9IFg1MDlfTkFNRV9nZXRfZW50cnkobiwgY250IC0gaSAtIDEpOworCQllbHNlIGVudCA9IFg1MDlfTkFNRV9nZXRfZW50cnkobiwgaSk7CisJCWlmKHByZXYgIT0gLTEpIHsKKwkJCWlmKHByZXYgPT0gZW50LT5zZXQpIHsKKwkJCQlpZighaW9fY2goYXJnLCBzZXBfbXYsIHNlcF9tdl9sZW4pKSByZXR1cm4gLTE7CisJCQkJb3V0bGVuICs9IHNlcF9tdl9sZW47CisJCQl9IGVsc2UgeworCQkJCWlmKCFpb19jaChhcmcsIHNlcF9kbiwgc2VwX2RuX2xlbikpIHJldHVybiAtMTsKKwkJCQlvdXRsZW4gKz0gc2VwX2RuX2xlbjsKKwkJCQlpZighZG9faW5kZW50KGlvX2NoLCBhcmcsIGluZGVudCkpIHJldHVybiAtMTsKKwkJCQlvdXRsZW4gKz0gaW5kZW50OworCQkJfQorCQl9CisJCXByZXYgPSBlbnQtPnNldDsKKwkJZm4gPSBYNTA5X05BTUVfRU5UUllfZ2V0X29iamVjdChlbnQpOworCQl2YWwgPSBYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoZW50KTsKKwkJZm5fbmlkID0gT0JKX29iajJuaWQoZm4pOworCQlpZihmbl9vcHQgIT0gWE5fRkxBR19GTl9OT05FKSB7CisJCQlpbnQgb2JqbGVuLCBmbGRfbGVuOworCQkJaWYoKGZuX29wdCA9PSBYTl9GTEFHX0ZOX09JRCkgfHwgKGZuX25pZD09TklEX3VuZGVmKSApIHsKKwkJCQlPQkpfb2JqMnR4dChvYmp0bXAsIHNpemVvZiBvYmp0bXAsIGZuLCAxKTsKKwkJCQlmbGRfbGVuID0gMDsgLyogWFhYOiB3aGF0IHNob3VsZCB0aGlzIGJlPyAqLworCQkJCW9iamJ1ZiA9IG9ianRtcDsKKwkJCX0gZWxzZSB7CisJCQkJaWYoZm5fb3B0ID09IFhOX0ZMQUdfRk5fU04pIHsKKwkJCQkJZmxkX2xlbiA9IEZOX1dJRFRIX1NOOworCQkJCQlvYmpidWYgPSBPQkpfbmlkMnNuKGZuX25pZCk7CisJCQkJfSBlbHNlIGlmKGZuX29wdCA9PSBYTl9GTEFHX0ZOX0xOKSB7CisJCQkJCWZsZF9sZW4gPSBGTl9XSURUSF9MTjsKKwkJCQkJb2JqYnVmID0gT0JKX25pZDJsbihmbl9uaWQpOworCQkJCX0gZWxzZSB7CisJCQkJCWZsZF9sZW4gPSAwOyAvKiBYWFg6IHdoYXQgc2hvdWxkIHRoaXMgYmU/ICovCisJCQkJCW9iamJ1ZiA9ICIiOworCQkJCX0KKwkJCX0KKwkJCW9iamxlbiA9IHN0cmxlbihvYmpidWYpOworCQkJaWYoIWlvX2NoKGFyZywgb2JqYnVmLCBvYmpsZW4pKSByZXR1cm4gLTE7CisJCQlpZiAoKG9iamxlbiA8IGZsZF9sZW4pICYmIChmbGFncyAmIFhOX0ZMQUdfRk5fQUxJR04pKSB7CisJCQkJaWYgKCFkb19pbmRlbnQoaW9fY2gsIGFyZywgZmxkX2xlbiAtIG9iamxlbikpIHJldHVybiAtMTsKKwkJCQlvdXRsZW4gKz0gZmxkX2xlbiAtIG9iamxlbjsKKwkJCX0KKwkJCWlmKCFpb19jaChhcmcsIHNlcF9lcSwgc2VwX2VxX2xlbikpIHJldHVybiAtMTsKKwkJCW91dGxlbiArPSBvYmpsZW4gKyBzZXBfZXFfbGVuOworCQl9CisJCS8qIElmIHRoZSBmaWVsZCBuYW1lIGlzIHVua25vd24gdGhlbiBmaXggdXAgdGhlIERFUiBkdW1wCisJCSAqIGZsYWcuIFdlIG1pZ2h0IHdhbnQgdG8gbGltaXQgdGhpcyBmdXJ0aGVyIHNvIGl0IHdpbGwKKyAJCSAqIERFUiBkdW1wIG9uIGFueXRoaW5nIG90aGVyIHRoYW4gYSBmZXcgJ3N0YW5kYXJkJyBmaWVsZHMuCisJCSAqLworCQlpZigoZm5fbmlkID09IE5JRF91bmRlZikgJiYgKGZsYWdzICYgWE5fRkxBR19EVU1QX1VOS05PV05fRklFTERTKSkgCisJCQkJCW9yZmxhZ3MgPSBBU04xX1NUUkZMR1NfRFVNUF9BTEw7CisJCWVsc2Ugb3JmbGFncyA9IDA7CisgICAgIAorCQlsZW4gPSBkb19wcmludF9leChpb19jaCwgYXJnLCBmbGFncyB8IG9yZmxhZ3MsIHZhbCk7CisJCWlmKGxlbiA8IDApIHJldHVybiAtMTsKKwkJb3V0bGVuICs9IGxlbjsKKwl9CisJcmV0dXJuIG91dGxlbjsKK30KKworLyogV3JhcHBlcnMgcm91bmQgdGhlIG1haW4gZnVuY3Rpb25zICovCisKK2ludCBYNTA5X05BTUVfcHJpbnRfZXgoQklPICpvdXQsIFg1MDlfTkFNRSAqbm0sIGludCBpbmRlbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaWYoZmxhZ3MgPT0gWE5fRkxBR19DT01QQVQpCisJCXJldHVybiBYNTA5X05BTUVfcHJpbnQob3V0LCBubSwgaW5kZW50KTsKKwlyZXR1cm4gZG9fbmFtZV9leChzZW5kX2Jpb19jaGFycywgb3V0LCBubSwgaW5kZW50LCBmbGFncyk7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBYNTA5X05BTUVfcHJpbnRfZXhfZnAoRklMRSAqZnAsIFg1MDlfTkFNRSAqbm0sIGludCBpbmRlbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJaWYoZmxhZ3MgPT0gWE5fRkxBR19DT01QQVQpCisJCXsKKwkJQklPICpidG1wOworCQlpbnQgcmV0OworCQlidG1wID0gQklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpOworCQlpZighYnRtcCkgcmV0dXJuIC0xOworCQlyZXQgPSBYNTA5X05BTUVfcHJpbnQoYnRtcCwgbm0sIGluZGVudCk7CisJCUJJT19mcmVlKGJ0bXApOworCQlyZXR1cm4gcmV0OworCQl9CisJcmV0dXJuIGRvX25hbWVfZXgoc2VuZF9mcF9jaGFycywgZnAsIG5tLCBpbmRlbnQsIGZsYWdzKTsKK30KKyNlbmRpZgorCitpbnQgQVNOMV9TVFJJTkdfcHJpbnRfZXgoQklPICpvdXQsIEFTTjFfU1RSSU5HICpzdHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIGRvX3ByaW50X2V4KHNlbmRfYmlvX2NoYXJzLCBvdXQsIGZsYWdzLCBzdHIpOworfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgQVNOMV9TVFJJTkdfcHJpbnRfZXhfZnAoRklMRSAqZnAsIEFTTjFfU1RSSU5HICpzdHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIGRvX3ByaW50X2V4KHNlbmRfZnBfY2hhcnMsIGZwLCBmbGFncywgc3RyKTsKK30KKyNlbmRpZgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uOiBjb252ZXJ0IGFueSBzdHJpbmcgdHlwZSB0byBVVEY4LCByZXR1cm5zIG51bWJlciBvZiBieXRlcworICogaW4gb3V0cHV0IHN0cmluZyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqLworCitpbnQgQVNOMV9TVFJJTkdfdG9fVVRGOCh1bnNpZ25lZCBjaGFyICoqb3V0LCBBU04xX1NUUklORyAqaW4pCit7CisJQVNOMV9TVFJJTkcgc3RtcCwgKnN0ciA9ICZzdG1wOworCWludCBtYmZsYWcsIHR5cGUsIHJldDsKKwlpZighaW4pIHJldHVybiAtMTsKKwl0eXBlID0gaW4tPnR5cGU7CisJaWYoKHR5cGUgPCAwKSB8fCAodHlwZSA+IDMwKSkgcmV0dXJuIC0xOworCW1iZmxhZyA9IHRhZzJuYnl0ZVt0eXBlXTsKKwlpZihtYmZsYWcgPT0gLTEpIHJldHVybiAtMTsKKwltYmZsYWcgfD0gTUJTVFJJTkdfRkxBRzsKKwlzdG1wLmRhdGEgPSBOVUxMOworCXJldCA9IEFTTjFfbWJzdHJpbmdfY29weSgmc3RyLCBpbi0+ZGF0YSwgaW4tPmxlbmd0aCwgbWJmbGFnLCBCX0FTTjFfVVRGOFNUUklORyk7CisJaWYocmV0IDwgMCkgcmV0dXJuIHJldDsKKwkqb3V0ID0gc3RtcC5kYXRhOworCXJldHVybiBzdG1wLmxlbmd0aDsKK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2Ffc3RybmlkLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3N0cm5pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MzAyMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3N0cm5pZC5jCkBAIC0wLDAgKzEsMjkwIEBACisvKiBhX3N0cm5pZC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKKworc3RhdGljIFNUQUNLX09GKEFTTjFfU1RSSU5HX1RBQkxFKSAqc3RhYmxlID0gTlVMTDsKK3N0YXRpYyB2b2lkIHN0X2ZyZWUoQVNOMV9TVFJJTkdfVEFCTEUgKnRibCk7CitzdGF0aWMgaW50IHNrX3RhYmxlX2NtcChjb25zdCBBU04xX1NUUklOR19UQUJMRSAqIGNvbnN0ICphLAorCQkJY29uc3QgQVNOMV9TVFJJTkdfVEFCTEUgKiBjb25zdCAqYik7CisKKworLyogVGhpcyBpcyB0aGUgZ2xvYmFsIG1hc2sgZm9yIHRoZSBtYnN0cmluZyBmdW5jdGlvbnM6IHRoaXMgaXMgdXNlIHRvCisgKiBtYXNrIG91dCBjZXJ0YWluIHR5cGVzIChzdWNoIGFzIEJNUFN0cmluZyBhbmQgVVRGOFN0cmluZykgYmVjYXVzZQorICogY2VydGFpbiBzb2Z0d2FyZSAoZS5nLiBOZXRzY2FwZSkgaGFzIHByb2JsZW1zIHdpdGggdGhlbS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnbG9iYWxfbWFzayA9IDB4RkZGRkZGRkZMOworCit2b2lkIEFTTjFfU1RSSU5HX3NldF9kZWZhdWx0X21hc2sodW5zaWduZWQgbG9uZyBtYXNrKQoreworCWdsb2JhbF9tYXNrID0gbWFzazsKK30KKwordW5zaWduZWQgbG9uZyBBU04xX1NUUklOR19nZXRfZGVmYXVsdF9tYXNrKHZvaWQpCit7CisJcmV0dXJuIGdsb2JhbF9tYXNrOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGRlZmF1bHQgdG8gdmFyaW91cyAiZmxhdm91cnMiIG9mIGNvbmZpZ3VyYXRpb24uCisgKiBiYXNlZCBvbiBhbiBBU0NJSSBzdHJpbmcuIEN1cnJlbnRseSB0aGlzIGlzOgorICogTUFTSzpYWFhYIDogYSBudW1lcmljYWwgbWFzayB2YWx1ZS4KKyAqIG5vYm1wIDogRG9uJ3QgdXNlIEJNUFN0cmluZ3MgKGp1c3QgUHJpbnRhYmxlLCBUNjEpLgorICogcGtpeCA6IFBLSVggcmVjb21tZW5kYXRpb24gaW4gUkZDMjQ1OS4KKyAqIHV0Zjhvbmx5IDogb25seSB1c2UgVVRGOFN0cmluZ3MgKFJGQzI0NTkgcmVjb21tZW5kYXRpb24gZm9yIDIwMDQpLgorICogZGVmYXVsdDogICB0aGUgZGVmYXVsdCB2YWx1ZSwgUHJpbnRhYmxlLCBUNjEsIEJNUC4KKyAqLworCitpbnQgQVNOMV9TVFJJTkdfc2V0X2RlZmF1bHRfbWFza19hc2MoY2hhciAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJY2hhciAqZW5kOworCWlmKCFzdHJuY21wKHAsICJNQVNLOiIsIDUpKSB7CisJCWlmKCFwWzVdKSByZXR1cm4gMDsKKwkJbWFzayA9IHN0cnRvdWwocCArIDUsICZlbmQsIDApOworCQlpZigqZW5kKSByZXR1cm4gMDsKKwl9IGVsc2UgaWYoIXN0cmNtcChwLCAibm9tYnN0ciIpKQorCQkJIG1hc2sgPSB+KCh1bnNpZ25lZCBsb25nKShCX0FTTjFfQk1QU1RSSU5HfEJfQVNOMV9VVEY4U1RSSU5HKSk7CisJZWxzZSBpZighc3RyY21wKHAsICJwa2l4IikpCisJCQltYXNrID0gfigodW5zaWduZWQgbG9uZylCX0FTTjFfVDYxU1RSSU5HKTsKKwllbHNlIGlmKCFzdHJjbXAocCwgInV0Zjhvbmx5IikpIG1hc2sgPSBCX0FTTjFfVVRGOFNUUklORzsKKwllbHNlIGlmKCFzdHJjbXAocCwgImRlZmF1bHQiKSkKKwkgICAgbWFzayA9IDB4RkZGRkZGRkZMOworCWVsc2UgcmV0dXJuIDA7CisJQVNOMV9TVFJJTkdfc2V0X2RlZmF1bHRfbWFzayhtYXNrKTsKKwlyZXR1cm4gMTsKK30KKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBnZW5lcmF0ZXMgYW4gQVNOMV9TVFJJTkcgYmFzZWQgb24gbGltaXRzIGluIGEgdGFibGUuCisgKiBGcmVxdWVudGx5IHRoZSB0eXBlcyBhbmQgbGVuZ3RoIG9mIGFuIEFTTjFfU1RSSU5HIGFyZSByZXN0cmljdGVkIGJ5IGEgCisgKiBjb3JyZXNwb25kaW5nIE9JRC4gRm9yIGV4YW1wbGUgY2VydGlmaWNhdGVzIGFuZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4KKyAqLworCitBU04xX1NUUklORyAqQVNOMV9TVFJJTkdfc2V0X2J5X05JRChBU04xX1NUUklORyAqKm91dCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisJCQkJCWludCBpbmxlbiwgaW50IGluZm9ybSwgaW50IG5pZCkKK3sKKwlBU04xX1NUUklOR19UQUJMRSAqdGJsOworCUFTTjFfU1RSSU5HICpzdHIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlpbnQgcmV0OworCWlmKCFvdXQpIG91dCA9ICZzdHI7CisJdGJsID0gQVNOMV9TVFJJTkdfVEFCTEVfZ2V0KG5pZCk7CisJaWYodGJsKSB7CisJCW1hc2sgPSB0YmwtPm1hc2s7CisJCWlmKCEodGJsLT5mbGFncyAmIFNUQUJMRV9OT19NQVNLKSkgbWFzayAmPSBnbG9iYWxfbWFzazsKKwkJcmV0ID0gQVNOMV9tYnN0cmluZ19uY29weShvdXQsIGluLCBpbmxlbiwgaW5mb3JtLCBtYXNrLAorCQkJCQl0YmwtPm1pbnNpemUsIHRibC0+bWF4c2l6ZSk7CisJfSBlbHNlIHJldCA9IEFTTjFfbWJzdHJpbmdfY29weShvdXQsIGluLCBpbmxlbiwgaW5mb3JtLCBESVJTVFJJTkdfVFlQRSAmIGdsb2JhbF9tYXNrKTsKKwlpZihyZXQgPD0gMCkgcmV0dXJuIE5VTEw7CisJcmV0dXJuICpvdXQ7Cit9CisKKy8qIE5vdyB0aGUgdGFibGVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgc3RyaW5nIHRhYmxlOgorICovCisKKy8qIHNpemUgbGltaXRzOiB0aGlzIHN0dWZmIGlzIHRha2VuIHN0cmFpZ2h0IGZyb20gUkZDMzI4MCAqLworCisjZGVmaW5lIHViX25hbWUJCQkJMzI3NjgKKyNkZWZpbmUgdWJfY29tbW9uX25hbWUJCQk2NAorI2RlZmluZSB1Yl9sb2NhbGl0eV9uYW1lCQkxMjgKKyNkZWZpbmUgdWJfc3RhdGVfbmFtZQkJCTEyOAorI2RlZmluZSB1Yl9vcmdhbml6YXRpb25fbmFtZQkJNjQKKyNkZWZpbmUgdWJfb3JnYW5pemF0aW9uX3VuaXRfbmFtZQk2NAorI2RlZmluZSB1Yl90aXRsZQkJCTY0CisjZGVmaW5lIHViX2VtYWlsX2FkZHJlc3MJCTEyOAorI2RlZmluZSB1Yl9zZXJpYWxfbnVtYmVyCQk2NAorCisKKy8qIFRoaXMgdGFibGUgbXVzdCBiZSBrZXB0IGluIE5JRCBvcmRlciAqLworCitzdGF0aWMgY29uc3QgQVNOMV9TVFJJTkdfVEFCTEUgdGJsX3N0YW5kYXJkW10gPSB7Cit7TklEX2NvbW1vbk5hbWUsCQkxLCB1Yl9jb21tb25fbmFtZSwgRElSU1RSSU5HX1RZUEUsIDB9LAore05JRF9jb3VudHJ5TmFtZSwJCTIsIDIsIEJfQVNOMV9QUklOVEFCTEVTVFJJTkcsIFNUQUJMRV9OT19NQVNLfSwKK3tOSURfbG9jYWxpdHlOYW1lLAkJMSwgdWJfbG9jYWxpdHlfbmFtZSwgRElSU1RSSU5HX1RZUEUsIDB9LAore05JRF9zdGF0ZU9yUHJvdmluY2VOYW1lLAkxLCB1Yl9zdGF0ZV9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX29yZ2FuaXphdGlvbk5hbWUsCQkxLCB1Yl9vcmdhbml6YXRpb25fbmFtZSwgRElSU1RSSU5HX1RZUEUsIDB9LAore05JRF9vcmdhbml6YXRpb25hbFVuaXROYW1lLAkxLCB1Yl9vcmdhbml6YXRpb25fdW5pdF9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX3BrY3M5X2VtYWlsQWRkcmVzcywJMSwgdWJfZW1haWxfYWRkcmVzcywgQl9BU04xX0lBNVNUUklORywgU1RBQkxFX05PX01BU0t9LAore05JRF9wa2NzOV91bnN0cnVjdHVyZWROYW1lLAkxLCAtMSwgUEtDUzlTVFJJTkdfVFlQRSwgMH0sCit7TklEX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkLAkxLCAtMSwgUEtDUzlTVFJJTkdfVFlQRSwgMH0sCit7TklEX3BrY3M5X3Vuc3RydWN0dXJlZEFkZHJlc3MsCTEsIC0xLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX2dpdmVuTmFtZSwJCQkxLCB1Yl9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX3N1cm5hbWUsCQkJMSwgdWJfbmFtZSwgRElSU1RSSU5HX1RZUEUsIDB9LAore05JRF9pbml0aWFscywJCQkxLCB1Yl9uYW1lLCBESVJTVFJJTkdfVFlQRSwgMH0sCit7TklEX3NlcmlhbE51bWJlciwJCTEsIHViX3NlcmlhbF9udW1iZXIsIEJfQVNOMV9QUklOVEFCTEVTVFJJTkcsIFNUQUJMRV9OT19NQVNLfSwKK3tOSURfZnJpZW5kbHlOYW1lLAkJLTEsIC0xLCBCX0FTTjFfQk1QU1RSSU5HLCBTVEFCTEVfTk9fTUFTS30sCit7TklEX25hbWUsCQkJMSwgdWJfbmFtZSwgRElSU1RSSU5HX1RZUEUsIDB9LAore05JRF9kblF1YWxpZmllciwJCS0xLCAtMSwgQl9BU04xX1BSSU5UQUJMRVNUUklORywgU1RBQkxFX05PX01BU0t9LAore05JRF9kb21haW5Db21wb25lbnQsCQkxLCAtMSwgQl9BU04xX0lBNVNUUklORywgU1RBQkxFX05PX01BU0t9LAore05JRF9tc19jc3BfbmFtZSwJCS0xLCAtMSwgQl9BU04xX0JNUFNUUklORywgU1RBQkxFX05PX01BU0t9Cit9OworCitzdGF0aWMgaW50IHNrX3RhYmxlX2NtcChjb25zdCBBU04xX1NUUklOR19UQUJMRSAqIGNvbnN0ICphLAorCQkJY29uc3QgQVNOMV9TVFJJTkdfVEFCTEUgKiBjb25zdCAqYikKK3sKKwlyZXR1cm4gKCphKS0+bmlkIC0gKCpiKS0+bmlkOworfQorCitERUNMQVJFX09CSl9CU0VBUkNIX0NNUF9GTihBU04xX1NUUklOR19UQUJMRSwgQVNOMV9TVFJJTkdfVEFCTEUsIHRhYmxlKTsKKworc3RhdGljIGludCB0YWJsZV9jbXAoY29uc3QgQVNOMV9TVFJJTkdfVEFCTEUgKmEsIGNvbnN0IEFTTjFfU1RSSU5HX1RBQkxFICpiKQoreworCXJldHVybiBhLT5uaWQgLSBiLT5uaWQ7Cit9CisKK0lNUExFTUVOVF9PQkpfQlNFQVJDSF9DTVBfRk4oQVNOMV9TVFJJTkdfVEFCTEUsIEFTTjFfU1RSSU5HX1RBQkxFLCB0YWJsZSk7CisKK0FTTjFfU1RSSU5HX1RBQkxFICpBU04xX1NUUklOR19UQUJMRV9nZXQoaW50IG5pZCkKK3sKKwlpbnQgaWR4OworCUFTTjFfU1RSSU5HX1RBQkxFICp0dG1wOworCUFTTjFfU1RSSU5HX1RBQkxFIGZuZDsKKwlmbmQubmlkID0gbmlkOworCXR0bXAgPSBPQkpfYnNlYXJjaF90YWJsZSgmZm5kLCB0Ymxfc3RhbmRhcmQsIAorCQkJICAgc2l6ZW9mKHRibF9zdGFuZGFyZCkvc2l6ZW9mKEFTTjFfU1RSSU5HX1RBQkxFKSk7CisJaWYodHRtcCkgcmV0dXJuIHR0bXA7CisJaWYoIXN0YWJsZSkgcmV0dXJuIE5VTEw7CisJaWR4ID0gc2tfQVNOMV9TVFJJTkdfVEFCTEVfZmluZChzdGFibGUsICZmbmQpOworCWlmKGlkeCA8IDApIHJldHVybiBOVUxMOworCXJldHVybiBza19BU04xX1NUUklOR19UQUJMRV92YWx1ZShzdGFibGUsIGlkeCk7Cit9CisJCitpbnQgQVNOMV9TVFJJTkdfVEFCTEVfYWRkKGludCBuaWQsCisJCSBsb25nIG1pbnNpemUsIGxvbmcgbWF4c2l6ZSwgdW5zaWduZWQgbG9uZyBtYXNrLAorCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJQVNOMV9TVFJJTkdfVEFCTEUgKnRtcDsKKwljaGFyIG5ld19uaWQgPSAwOworCWZsYWdzICY9IH5TVEFCTEVfRkxBR1NfTUFMTE9DOworCWlmKCFzdGFibGUpIHN0YWJsZSA9IHNrX0FTTjFfU1RSSU5HX1RBQkxFX25ldyhza190YWJsZV9jbXApOworCWlmKCFzdGFibGUpIHsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9TVFJJTkdfVEFCTEVfQURELCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKwlpZighKHRtcCA9IEFTTjFfU1RSSU5HX1RBQkxFX2dldChuaWQpKSkgeworCQl0bXAgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQVNOMV9TVFJJTkdfVEFCTEUpKTsKKwkJaWYoIXRtcCkgeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9TVFJJTkdfVEFCTEVfQURELAorCQkJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQl9CisJCXRtcC0+ZmxhZ3MgPSBmbGFncyB8IFNUQUJMRV9GTEFHU19NQUxMT0M7CisJCXRtcC0+bmlkID0gbmlkOworCQluZXdfbmlkID0gMTsKKwl9IGVsc2UgdG1wLT5mbGFncyA9ICh0bXAtPmZsYWdzICYgU1RBQkxFX0ZMQUdTX01BTExPQykgfCBmbGFnczsKKwlpZihtaW5zaXplICE9IC0xKSB0bXAtPm1pbnNpemUgPSBtaW5zaXplOworCWlmKG1heHNpemUgIT0gLTEpIHRtcC0+bWF4c2l6ZSA9IG1heHNpemU7CisJdG1wLT5tYXNrID0gbWFzazsKKwlpZihuZXdfbmlkKSBza19BU04xX1NUUklOR19UQUJMRV9wdXNoKHN0YWJsZSwgdG1wKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZCBBU04xX1NUUklOR19UQUJMRV9jbGVhbnVwKHZvaWQpCit7CisJU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpICp0bXA7CisJdG1wID0gc3RhYmxlOworCWlmKCF0bXApIHJldHVybjsKKwlzdGFibGUgPSBOVUxMOworCXNrX0FTTjFfU1RSSU5HX1RBQkxFX3BvcF9mcmVlKHRtcCwgc3RfZnJlZSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0X2ZyZWUoQVNOMV9TVFJJTkdfVEFCTEUgKnRibCkKK3sKKwlpZih0YmwtPmZsYWdzICYgU1RBQkxFX0ZMQUdTX01BTExPQykgT1BFTlNTTF9mcmVlKHRibCk7Cit9CisKKworSU1QTEVNRU5UX1NUQUNLX09GKEFTTjFfU1RSSU5HX1RBQkxFKQorCisjaWZkZWYgU1RSSU5HX1RBQkxFX1RFU1QKKworbWFpbigpCit7CisJQVNOMV9TVFJJTkdfVEFCTEUgKnRtcDsKKwlpbnQgaSwgbGFzdF9uaWQgPSAtMTsKKworCWZvciAodG1wID0gdGJsX3N0YW5kYXJkLCBpID0gMDsKKwkJaSA8IHNpemVvZih0Ymxfc3RhbmRhcmQpL3NpemVvZihBU04xX1NUUklOR19UQUJMRSk7IGkrKywgdG1wKyspCisJCXsKKwkJCWlmICh0bXAtPm5pZCA8IGxhc3RfbmlkKQorCQkJCXsKKwkJCQlsYXN0X25pZCA9IDA7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJbGFzdF9uaWQgPSB0bXAtPm5pZDsKKwkJfQorCisJaWYgKGxhc3RfbmlkICE9IDApCisJCXsKKwkJcHJpbnRmKCJUYWJsZSBvcmRlciBPS1xuIik7CisJCWV4aXQoMCk7CisJCX0KKworCWZvciAodG1wID0gdGJsX3N0YW5kYXJkLCBpID0gMDsKKwkJaSA8IHNpemVvZih0Ymxfc3RhbmRhcmQpL3NpemVvZihBU04xX1NUUklOR19UQUJMRSk7IGkrKywgdG1wKyspCisJCQlwcmludGYoIkluZGV4ICVkLCBOSUQgJWQsIE5hbWU9JXNcbiIsIGksIHRtcC0+bmlkLAorCQkJCQkJCU9CSl9uaWQybG4odG1wLT5uaWQpKTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfdGltZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV90aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJlYjliMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfdGltZS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKiBjcnlwdG8vYXNuMS9hX3RpbWUuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKy8qIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFTTjEgVGltZSBzdHJ1Y3R1cmUgd2hpY2ggaXM6CisgKiAgICBUaW1lIDo6PSBDSE9JQ0UgeworICogICAgICB1dGNUaW1lICAgICAgICBVVENUaW1lLAorICogICAgICBnZW5lcmFsVGltZSAgICBHZW5lcmFsaXplZFRpbWUgfQorICogd3JpdHRlbiBieSBTdGV2ZSBIZW5zb24uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAib190aW1lLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorCitJTVBMRU1FTlRfQVNOMV9NU1RSSU5HKEFTTjFfVElNRSwgQl9BU04xX1RJTUUpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX1RJTUUpCisKKyNpZiAwCitpbnQgaTJkX0FTTjFfVElNRShBU04xX1RJTUUgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwkvKiBLTFVER0UhIFdlIGNvbnZlcnQgdG8gYXNjaWkgYmVmb3JlIHdyaXRpbmcgREVSICovCisJY2hhciB0bXBbMjRdOworCUFTTjFfU1RSSU5HIHRtcHN0cjsKKworCWlmKGEtPnR5cGUgPT0gVl9BU04xX1VUQ1RJTUUgfHwgYS0+dHlwZSA9PSBWX0FTTjFfR0VORVJBTElaRURUSU1FKSB7CisJICAgIGludCBsZW47CisKKwkgICAgdG1wc3RyID0gKihBU04xX1NUUklORyAqKWE7CisJICAgIGxlbiA9IHRtcHN0ci5sZW5ndGg7CisJICAgIGViY2RpYzJhc2NpaSh0bXAsIHRtcHN0ci5kYXRhLCAobGVuID49IHNpemVvZiB0bXApID8gc2l6ZW9mIHRtcCA6IGxlbik7CisJICAgIHRtcHN0ci5kYXRhID0gdG1wOworCSAgICBhID0gKEFTTjFfR0VORVJBTElaRURUSU1FICopICZ0bXBzdHI7CisJfQorI2VuZGlmCisJaWYoYS0+dHlwZSA9PSBWX0FTTjFfVVRDVElNRSB8fCBhLT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCisJCQkJcmV0dXJuKGkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsCisJCQkJICAgICBhLT50eXBlICxWX0FTTjFfVU5JVkVSU0FMKSk7CisJQVNOMWVycihBU04xX0ZfSTJEX0FTTjFfVElNRSxBU04xX1JfRVhQRUNUSU5HX0FfVElNRSk7CisJcmV0dXJuIC0xOworCX0KKyNlbmRpZgorCisKK0FTTjFfVElNRSAqQVNOMV9USU1FX3NldChBU04xX1RJTUUgKnMsIHRpbWVfdCB0KQorCXsKKwlyZXR1cm4gQVNOMV9USU1FX2FkaihzLCB0LCAwLCAwKTsKKwl9CisKK0FTTjFfVElNRSAqQVNOMV9USU1FX2FkaihBU04xX1RJTUUgKnMsIHRpbWVfdCB0LAorCQkJCWludCBvZmZzZXRfZGF5LCBsb25nIG9mZnNldF9zZWMpCisJeworCXN0cnVjdCB0bSAqdHM7CisJc3RydWN0IHRtIGRhdGE7CisKKwl0cz1PUEVOU1NMX2dtdGltZSgmdCwmZGF0YSk7CisJaWYgKHRzID09IE5VTEwpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9USU1FX0FESiwgQVNOMV9SX0VSUk9SX0dFVFRJTkdfVElNRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJaWYgKG9mZnNldF9kYXkgfHwgb2Zmc2V0X3NlYykKKwkJeyAKKwkJaWYgKCFPUEVOU1NMX2dtdGltZV9hZGoodHMsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpKQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZigodHMtPnRtX3llYXIgPj0gNTApICYmICh0cy0+dG1feWVhciA8IDE1MCkpCisJCQlyZXR1cm4gQVNOMV9VVENUSU1FX2FkaihzLCB0LCBvZmZzZXRfZGF5LCBvZmZzZXRfc2VjKTsKKwlyZXR1cm4gQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqKHMsIHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOworCX0KKworaW50IEFTTjFfVElNRV9jaGVjayhBU04xX1RJTUUgKnQpCisJeworCWlmICh0LT50eXBlID09IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCisJCXJldHVybiBBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjayh0KTsKKwllbHNlIGlmICh0LT50eXBlID09IFZfQVNOMV9VVENUSU1FKQorCQlyZXR1cm4gQVNOMV9VVENUSU1FX2NoZWNrKHQpOworCXJldHVybiAwOworCX0KKworLyogQ29udmVydCBhbiBBU04xX1RJTUUgc3RydWN0dXJlIHRvIEdlbmVyYWxpemVkVGltZSAqLworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKkFTTjFfVElNRV90b19nZW5lcmFsaXplZHRpbWUoQVNOMV9USU1FICp0LCBBU04xX0dFTkVSQUxJWkVEVElNRSAqKm91dCkKKwl7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnJldDsKKwljaGFyICpzdHI7CisJaW50IG5ld2xlbjsKKworCWlmICghQVNOMV9USU1FX2NoZWNrKHQpKSByZXR1cm4gTlVMTDsKKworCWlmICghb3V0IHx8ICEqb3V0KQorCQl7CisJCWlmICghKHJldCA9IEFTTjFfR0VORVJBTElaRURUSU1FX25ldyAoKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKG91dCkgKm91dCA9IHJldDsKKwkJfQorCWVsc2UgcmV0ID0gKm91dDsKKworCS8qIElmIGFscmVhZHkgR2VuZXJhbGl6ZWRUaW1lIGp1c3QgY29weSBhY3Jvc3MgKi8KKwlpZiAodC0+dHlwZSA9PSBWX0FTTjFfR0VORVJBTElaRURUSU1FKQorCQl7CisJCWlmKCFBU04xX1NUUklOR19zZXQocmV0LCB0LT5kYXRhLCB0LT5sZW5ndGgpKQorCQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiByZXQ7CisJCX0KKworCS8qIGdyb3cgdGhlIHN0cmluZyAqLworCWlmICghQVNOMV9TVFJJTkdfc2V0KHJldCwgTlVMTCwgdC0+bGVuZ3RoICsgMikpCisJCXJldHVybiBOVUxMOworCS8qIEFTTjFfU1RSSU5HX3NldCgpIGFsbG9jYXRlZCAnbGVuICsgMScgYnl0ZXMuICovCisJbmV3bGVuID0gdC0+bGVuZ3RoICsgMiArIDE7CisJc3RyID0gKGNoYXIgKilyZXQtPmRhdGE7CisJLyogV29yayBvdXQgdGhlIGNlbnR1cnkgYW5kIHByZXBlbmQgKi8KKwlpZiAodC0+ZGF0YVswXSA+PSAnNScpIEJVRl9zdHJsY3B5KHN0ciwgIjE5IiwgbmV3bGVuKTsKKwllbHNlIEJVRl9zdHJsY3B5KHN0ciwgIjIwIiwgbmV3bGVuKTsKKworCUJVRl9zdHJsY2F0KHN0ciwgKGNoYXIgKil0LT5kYXRhLCBuZXdsZW4pOworCisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBBU04xX1RJTUVfc2V0X3N0cmluZyhBU04xX1RJTUUgKnMsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJQVNOMV9USU1FIHQ7CisKKwl0Lmxlbmd0aCA9IHN0cmxlbihzdHIpOworCXQuZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopc3RyOworCXQuZmxhZ3MgPSAwOworCQorCXQudHlwZSA9IFZfQVNOMV9VVENUSU1FOworCisJaWYgKCFBU04xX1RJTUVfY2hlY2soJnQpKQorCQl7CisJCXQudHlwZSA9IFZfQVNOMV9HRU5FUkFMSVpFRFRJTUU7CisJCWlmICghQVNOMV9USU1FX2NoZWNrKCZ0KSkKKwkJCXJldHVybiAwOworCQl9CisJCisJaWYgKHMgJiYgIUFTTjFfU1RSSU5HX2NvcHkoKEFTTjFfU1RSSU5HICopcywgKEFTTjFfU1RSSU5HICopJnQpKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3R5cGUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NWQyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3R5cGUuYwpAQCAtMCwwICsxLDE1OSBAQAorLyogY3J5cHRvL2FzbjEvYV90eXBlLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKK2ludCBBU04xX1RZUEVfZ2V0KEFTTjFfVFlQRSAqYSkKKwl7CisJaWYgKChhLT52YWx1ZS5wdHIgIT0gTlVMTCkgfHwgKGEtPnR5cGUgPT0gVl9BU04xX05VTEwpKQorCQlyZXR1cm4oYS0+dHlwZSk7CisJZWxzZQorCQlyZXR1cm4oMCk7CisJfQorCit2b2lkIEFTTjFfVFlQRV9zZXQoQVNOMV9UWVBFICphLCBpbnQgdHlwZSwgdm9pZCAqdmFsdWUpCisJeworCWlmIChhLT52YWx1ZS5wdHIgIT0gTlVMTCkKKwkJeworCQlBU04xX1RZUEUgKip0bXBfYSA9ICZhOworCQlBU04xX3ByaW1pdGl2ZV9mcmVlKChBU04xX1ZBTFVFICoqKXRtcF9hLCBOVUxMKTsKKwkJfQorCWEtPnR5cGU9dHlwZTsKKwlpZiAodHlwZSA9PSBWX0FTTjFfQk9PTEVBTikKKwkJYS0+dmFsdWUuYm9vbGVhbiA9IHZhbHVlID8gMHhmZiA6IDA7CisJZWxzZQorCQlhLT52YWx1ZS5wdHI9dmFsdWU7CisJfQorCitpbnQgQVNOMV9UWVBFX3NldDEoQVNOMV9UWVBFICphLCBpbnQgdHlwZSwgY29uc3Qgdm9pZCAqdmFsdWUpCisJeworCWlmICghdmFsdWUgfHwgKHR5cGUgPT0gVl9BU04xX0JPT0xFQU4pKQorCQl7CisJCXZvaWQgKnAgPSAodm9pZCAqKXZhbHVlOworCQlBU04xX1RZUEVfc2V0KGEsIHR5cGUsIHApOworCQl9CisJZWxzZSBpZiAodHlwZSA9PSBWX0FTTjFfT0JKRUNUKQorCQl7CisJCUFTTjFfT0JKRUNUICpvZHVwOworCQlvZHVwID0gT0JKX2R1cCh2YWx1ZSk7CisJCWlmICghb2R1cCkKKwkJCXJldHVybiAwOworCQlBU04xX1RZUEVfc2V0KGEsIHR5cGUsIG9kdXApOworCQl9CisJZWxzZQorCQl7CisJCUFTTjFfU1RSSU5HICpzZHVwOworCQlzZHVwID0gQVNOMV9TVFJJTkdfZHVwKHZhbHVlKTsKKwkJaWYgKCFzZHVwKQorCQkJcmV0dXJuIDA7CisJCUFTTjFfVFlQRV9zZXQoYSwgdHlwZSwgc2R1cCk7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK0lNUExFTUVOVF9TVEFDS19PRihBU04xX1RZUEUpCitJTVBMRU1FTlRfQVNOMV9TRVRfT0YoQVNOMV9UWVBFKQorCisvKiBSZXR1cm5zIDAgaWYgdGhleSBhcmUgZXF1YWwsICE9IDAgb3RoZXJ3aXNlLiAqLworaW50IEFTTjFfVFlQRV9jbXAoQVNOMV9UWVBFICphLCBBU04xX1RZUEUgKmIpCisJeworCWludCByZXN1bHQgPSAtMTsKKworCWlmICghYSB8fCAhYiB8fCBhLT50eXBlICE9IGItPnR5cGUpIHJldHVybiAtMTsKKworCXN3aXRjaCAoYS0+dHlwZSkKKwkJeworCWNhc2UgVl9BU04xX09CSkVDVDoKKwkJcmVzdWx0ID0gT0JKX2NtcChhLT52YWx1ZS5vYmplY3QsIGItPnZhbHVlLm9iamVjdCk7CisJCWJyZWFrOworCWNhc2UgVl9BU04xX05VTEw6CisJCXJlc3VsdCA9IDA7CS8qIFRoZXkgZG8gbm90IGhhdmUgY29udGVudC4gKi8KKwkJYnJlYWs7CisJY2FzZSBWX0FTTjFfSU5URUdFUjoKKwljYXNlIFZfQVNOMV9ORUdfSU5URUdFUjoKKwljYXNlIFZfQVNOMV9FTlVNRVJBVEVEOgorCWNhc2UgVl9BU04xX05FR19FTlVNRVJBVEVEOgorCWNhc2UgVl9BU04xX0JJVF9TVFJJTkc6CisJY2FzZSBWX0FTTjFfT0NURVRfU1RSSU5HOgorCWNhc2UgVl9BU04xX1NFUVVFTkNFOgorCWNhc2UgVl9BU04xX1NFVDoKKwljYXNlIFZfQVNOMV9OVU1FUklDU1RSSU5HOgorCWNhc2UgVl9BU04xX1BSSU5UQUJMRVNUUklORzoKKwljYXNlIFZfQVNOMV9UNjFTVFJJTkc6CisJY2FzZSBWX0FTTjFfVklERU9URVhTVFJJTkc6CisJY2FzZSBWX0FTTjFfSUE1U1RSSU5HOgorCWNhc2UgVl9BU04xX1VUQ1RJTUU6CisJY2FzZSBWX0FTTjFfR0VORVJBTElaRURUSU1FOgorCWNhc2UgVl9BU04xX0dSQVBISUNTVFJJTkc6CisJY2FzZSBWX0FTTjFfVklTSUJMRVNUUklORzoKKwljYXNlIFZfQVNOMV9HRU5FUkFMU1RSSU5HOgorCWNhc2UgVl9BU04xX1VOSVZFUlNBTFNUUklORzoKKwljYXNlIFZfQVNOMV9CTVBTVFJJTkc6CisJY2FzZSBWX0FTTjFfVVRGOFNUUklORzoKKwljYXNlIFZfQVNOMV9PVEhFUjoKKwlkZWZhdWx0OgorCQlyZXN1bHQgPSBBU04xX1NUUklOR19jbXAoKEFTTjFfU1RSSU5HICopIGEtPnZhbHVlLnB0ciwKKwkJCQkJIChBU04xX1NUUklORyAqKSBiLT52YWx1ZS5wdHIpOworCQlicmVhazsKKwkJfQorCisJcmV0dXJuIHJlc3VsdDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3V0Y3RtLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3V0Y3RtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyZTIzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfdXRjdG0uYwpAQCAtMCwwICsxLDMxOCBAQAorLyogY3J5cHRvL2FzbjEvYV91dGN0bS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgIm9fdGltZS5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaWYgMAoraW50IGkyZF9BU04xX1VUQ1RJTUUoQVNOMV9VVENUSU1FICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCXJldHVybihpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLAorCQlWX0FTTjFfVVRDVElNRSxWX0FTTjFfVU5JVkVSU0FMKSk7CisjZWxzZQorCS8qIEtMVURHRSEgV2UgY29udmVydCB0byBhc2NpaSBiZWZvcmUgd3JpdGluZyBERVIgKi8KKwlpbnQgbGVuOworCWNoYXIgdG1wWzI0XTsKKwlBU04xX1NUUklORyB4ID0gKihBU04xX1NUUklORyAqKWE7CisKKwlsZW4gPSB4Lmxlbmd0aDsKKwllYmNkaWMyYXNjaWkodG1wLCB4LmRhdGEsIChsZW4gPj0gc2l6ZW9mIHRtcCkgPyBzaXplb2YgdG1wIDogbGVuKTsKKwl4LmRhdGEgPSB0bXA7CisJcmV0dXJuIGkyZF9BU04xX2J5dGVzKCZ4LCBwcCwgVl9BU04xX1VUQ1RJTUUsVl9BU04xX1VOSVZFUlNBTCk7CisjZW5kaWYKKwl9CisKKworQVNOMV9VVENUSU1FICpkMmlfQVNOMV9VVENUSU1FKEFTTjFfVVRDVElNRSAqKmEsIHVuc2lnbmVkIGNoYXIgKipwcCwKKwkgICAgIGxvbmcgbGVuZ3RoKQorCXsKKwlBU04xX1VUQ1RJTUUgKnJldD1OVUxMOworCisJcmV0PShBU04xX1VUQ1RJTUUgKilkMmlfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsZW5ndGgsCisJCVZfQVNOMV9VVENUSU1FLFZfQVNOMV9VTklWRVJTQUwpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9EMklfQVNOMV9VVENUSU1FLEVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwlhc2NpaTJlYmNkaWMocmV0LT5kYXRhLCByZXQtPmRhdGEsIHJldC0+bGVuZ3RoKTsKKyNlbmRpZgorCWlmICghQVNOMV9VVENUSU1FX2NoZWNrKHJldCkpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfRDJJX0FTTjFfVVRDVElNRSxBU04xX1JfSU5WQUxJRF9USU1FX0ZPUk1BVCk7CisJCWdvdG8gZXJyOworCQl9CisKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKQorCQlNX0FTTjFfVVRDVElNRV9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworI2VuZGlmCisKK2ludCBBU04xX1VUQ1RJTUVfY2hlY2soQVNOMV9VVENUSU1FICpkKQorCXsKKwlzdGF0aWMgY29uc3QgaW50IG1pbls4XT17IDAsIDEsIDEsIDAsIDAsIDAsIDAsIDB9OworCXN0YXRpYyBjb25zdCBpbnQgbWF4WzhdPXs5OSwxMiwzMSwyMyw1OSw1OSwxMiw1OX07CisJY2hhciAqYTsKKwlpbnQgbixpLGwsbzsKKworCWlmIChkLT50eXBlICE9IFZfQVNOMV9VVENUSU1FKSByZXR1cm4oMCk7CisJbD1kLT5sZW5ndGg7CisJYT0oY2hhciAqKWQtPmRhdGE7CisJbz0wOworCisJaWYgKGwgPCAxMSkgZ290byBlcnI7CisJZm9yIChpPTA7IGk8NjsgaSsrKQorCQl7CisJCWlmICgoaSA9PSA1KSAmJiAoKGFbb10gPT0gJ1onKSB8fAorCQkJKGFbb10gPT0gJysnKSB8fCAoYVtvXSA9PSAnLScpKSkKKwkJCXsgaSsrOyBicmVhazsgfQorCQlpZiAoKGFbb10gPCAnMCcpIHx8IChhW29dID4gJzknKSkgZ290byBlcnI7CisJCW49IGFbb10tJzAnOworCQlpZiAoKytvID4gbCkgZ290byBlcnI7CisKKwkJaWYgKChhW29dIDwgJzAnKSB8fCAoYVtvXSA+ICc5JykpIGdvdG8gZXJyOworCQluPShuKjEwKSsgYVtvXS0nMCc7CisJCWlmICgrK28gPiBsKSBnb3RvIGVycjsKKworCQlpZiAoKG4gPCBtaW5baV0pIHx8IChuID4gbWF4W2ldKSkgZ290byBlcnI7CisJCX0KKwlpZiAoYVtvXSA9PSAnWicpCisJCW8rKzsKKwllbHNlIGlmICgoYVtvXSA9PSAnKycpIHx8IChhW29dID09ICctJykpCisJCXsKKwkJbysrOworCQlpZiAobys0ID4gbCkgZ290byBlcnI7CisJCWZvciAoaT02OyBpPDg7IGkrKykKKwkJCXsKKwkJCWlmICgoYVtvXSA8ICcwJykgfHwgKGFbb10gPiAnOScpKSBnb3RvIGVycjsKKwkJCW49IGFbb10tJzAnOworCQkJbysrOworCQkJaWYgKChhW29dIDwgJzAnKSB8fCAoYVtvXSA+ICc5JykpIGdvdG8gZXJyOworCQkJbj0obioxMCkrIGFbb10tJzAnOworCQkJaWYgKChuIDwgbWluW2ldKSB8fCAobiA+IG1heFtpXSkpIGdvdG8gZXJyOworCQkJbysrOworCQkJfQorCQl9CisJcmV0dXJuKG8gPT0gbCk7CitlcnI6CisJcmV0dXJuKDApOworCX0KKworaW50IEFTTjFfVVRDVElNRV9zZXRfc3RyaW5nKEFTTjFfVVRDVElNRSAqcywgY29uc3QgY2hhciAqc3RyKQorCXsKKwlBU04xX1VUQ1RJTUUgdDsKKworCXQudHlwZT1WX0FTTjFfVVRDVElNRTsKKwl0Lmxlbmd0aD1zdHJsZW4oc3RyKTsKKwl0LmRhdGE9KHVuc2lnbmVkIGNoYXIgKilzdHI7CisJaWYgKEFTTjFfVVRDVElNRV9jaGVjaygmdCkpCisJCXsKKwkJaWYgKHMgIT0gTlVMTCkKKwkJCXsKKwkJCWlmICghQVNOMV9TVFJJTkdfc2V0KChBU04xX1NUUklORyAqKXMsCisJCQkJKHVuc2lnbmVkIGNoYXIgKilzdHIsdC5sZW5ndGgpKQorCQkJCXJldHVybiAwOworCQkJcy0+dHlwZSA9IFZfQVNOMV9VVENUSU1FOworCQkJfQorCQlyZXR1cm4oMSk7CisJCX0KKwllbHNlCisJCXJldHVybigwKTsKKwl9CisKK0FTTjFfVVRDVElNRSAqQVNOMV9VVENUSU1FX3NldChBU04xX1VUQ1RJTUUgKnMsIHRpbWVfdCB0KQorCXsKKwlyZXR1cm4gQVNOMV9VVENUSU1FX2FkaihzLCB0LCAwLCAwKTsKKwl9CisKK0FTTjFfVVRDVElNRSAqQVNOMV9VVENUSU1FX2FkaihBU04xX1VUQ1RJTUUgKnMsIHRpbWVfdCB0LAorCQkJCWludCBvZmZzZXRfZGF5LCBsb25nIG9mZnNldF9zZWMpCisJeworCWNoYXIgKnA7CisJc3RydWN0IHRtICp0czsKKwlzdHJ1Y3QgdG0gZGF0YTsKKwlzaXplX3QgbGVuID0gMjA7CisKKwlpZiAocyA9PSBOVUxMKQorCQlzPU1fQVNOMV9VVENUSU1FX25ldygpOworCWlmIChzID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworCXRzPU9QRU5TU0xfZ210aW1lKCZ0LCAmZGF0YSk7CisJaWYgKHRzID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworCWlmIChvZmZzZXRfZGF5IHx8IG9mZnNldF9zZWMpCisJCXsgCisJCWlmICghT1BFTlNTTF9nbXRpbWVfYWRqKHRzLCBvZmZzZXRfZGF5LCBvZmZzZXRfc2VjKSkKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwlpZigodHMtPnRtX3llYXIgPCA1MCkgfHwgKHRzLT50bV95ZWFyID49IDE1MCkpCisJCXJldHVybiBOVUxMOworCisJcD0oY2hhciAqKXMtPmRhdGE7CisJaWYgKChwID09IE5VTEwpIHx8ICgoc2l6ZV90KXMtPmxlbmd0aCA8IGxlbikpCisJCXsKKwkJcD1PUEVOU1NMX21hbGxvYyhsZW4pOworCQlpZiAocCA9PSBOVUxMKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9VVENUSU1FX0FESixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCWlmIChzLT5kYXRhICE9IE5VTEwpCisJCQlPUEVOU1NMX2ZyZWUocy0+ZGF0YSk7CisJCXMtPmRhdGE9KHVuc2lnbmVkIGNoYXIgKilwOworCQl9CisKKwlCSU9fc25wcmludGYocCxsZW4sIiUwMmQlMDJkJTAyZCUwMmQlMDJkJTAyZFoiLHRzLT50bV95ZWFyJTEwMCwKKwkJICAgICB0cy0+dG1fbW9uKzEsdHMtPnRtX21kYXksdHMtPnRtX2hvdXIsdHMtPnRtX21pbix0cy0+dG1fc2VjKTsKKwlzLT5sZW5ndGg9c3RybGVuKHApOworCXMtPnR5cGU9Vl9BU04xX1VUQ1RJTUU7CisjaWZkZWYgQ0hBUlNFVF9FQkNESUNfbm90CisJZWJjZGljMmFzY2lpKHMtPmRhdGEsIHMtPmRhdGEsIHMtPmxlbmd0aCk7CisjZW5kaWYKKwlyZXR1cm4ocyk7CisJfQorCisKK2ludCBBU04xX1VUQ1RJTUVfY21wX3RpbWVfdChjb25zdCBBU04xX1VUQ1RJTUUgKnMsIHRpbWVfdCB0KQorCXsKKwlzdHJ1Y3QgdG0gKnRtOworCXN0cnVjdCB0bSBkYXRhOworCWludCBvZmZzZXQ7CisJaW50IHllYXI7CisKKyNkZWZpbmUgZzIocCkgKCgocClbMF0tJzAnKSoxMCsocClbMV0tJzAnKQorCisJaWYgKHMtPmRhdGFbMTJdID09ICdaJykKKwkJb2Zmc2V0PTA7CisJZWxzZQorCQl7CisJCW9mZnNldCA9IGcyKHMtPmRhdGErMTMpKjYwK2cyKHMtPmRhdGErMTUpOworCQlpZiAocy0+ZGF0YVsxMl0gPT0gJy0nKQorCQkJb2Zmc2V0ID0gLW9mZnNldDsKKwkJfQorCisJdCAtPSBvZmZzZXQqNjA7IC8qIEZJWE1FOiBtYXkgb3ZlcmZsb3cgaW4gZXh0cmVtZSBjYXNlcyAqLworCisJdG0gPSBPUEVOU1NMX2dtdGltZSgmdCwgJmRhdGEpOworCQorI2RlZmluZSByZXR1cm5fY21wKGEsYikgaWYgKChhKTwoYikpIHJldHVybiAtMTsgZWxzZSBpZiAoKGEpPihiKSkgcmV0dXJuIDEKKwl5ZWFyID0gZzIocy0+ZGF0YSk7CisJaWYgKHllYXIgPCA1MCkKKwkJeWVhciArPSAxMDA7CisJcmV0dXJuX2NtcCh5ZWFyLCAgICAgICAgICAgICAgdG0tPnRtX3llYXIpOworCXJldHVybl9jbXAoZzIocy0+ZGF0YSsyKSAtIDEsIHRtLT50bV9tb24pOworCXJldHVybl9jbXAoZzIocy0+ZGF0YSs0KSwgICAgIHRtLT50bV9tZGF5KTsKKwlyZXR1cm5fY21wKGcyKHMtPmRhdGErNiksICAgICB0bS0+dG1faG91cik7CisJcmV0dXJuX2NtcChnMihzLT5kYXRhKzgpLCAgICAgdG0tPnRtX21pbik7CisJcmV0dXJuX2NtcChnMihzLT5kYXRhKzEwKSwgICAgdG0tPnRtX3NlYyk7CisjdW5kZWYgZzIKKyN1bmRlZiByZXR1cm5fY21wCisKKwlyZXR1cm4gMDsKKwl9CisKKworI2lmIDAKK3RpbWVfdCBBU04xX1VUQ1RJTUVfZ2V0KGNvbnN0IEFTTjFfVVRDVElNRSAqcykKKwl7CisJc3RydWN0IHRtIHRtOworCWludCBvZmZzZXQ7CisKKwltZW1zZXQoJnRtLCdcMCcsc2l6ZW9mIHRtKTsKKworI2RlZmluZSBnMihwKSAoKChwKVswXS0nMCcpKjEwKyhwKVsxXS0nMCcpCisJdG0udG1feWVhcj1nMihzLT5kYXRhKTsKKwlpZih0bS50bV95ZWFyIDwgNTApCisJCXRtLnRtX3llYXIrPTEwMDsKKwl0bS50bV9tb249ZzIocy0+ZGF0YSsyKS0xOworCXRtLnRtX21kYXk9ZzIocy0+ZGF0YSs0KTsKKwl0bS50bV9ob3VyPWcyKHMtPmRhdGErNik7CisJdG0udG1fbWluPWcyKHMtPmRhdGErOCk7CisJdG0udG1fc2VjPWcyKHMtPmRhdGErMTApOworCWlmKHMtPmRhdGFbMTJdID09ICdaJykKKwkJb2Zmc2V0PTA7CisJZWxzZQorCQl7CisJCW9mZnNldD1nMihzLT5kYXRhKzEzKSo2MCtnMihzLT5kYXRhKzE1KTsKKwkJaWYocy0+ZGF0YVsxMl0gPT0gJy0nKQorCQkJb2Zmc2V0PSAtb2Zmc2V0OworCQl9CisjdW5kZWYgZzIKKworCXJldHVybiBta3RpbWUoJnRtKS1vZmZzZXQqNjA7IC8qIEZJWE1FOiBta3RpbWUgYXNzdW1lcyB0aGUgY3VycmVudCB0aW1lem9uZQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGluc3RlYWQgb2YgVVRDLCBhbmQgdW5sZXNzIHdlIHJld3JpdGUgT3BlblNTTAorCQkJCSAgICAgICAqIGluIExpc3Agd2UgY2Fubm90IGxvY2FsbHkgY2hhbmdlIHRoZSB0aW1lem9uZQorCQkJCSAgICAgICAqIHdpdGhvdXQgcG9zc2libHkgaW50ZXJmZXJpbmcgd2l0aCBvdGhlciBwYXJ0cworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSBwcm9ncmFtLiB0aW1lZ20sIHdoaWNoIHVzZXMgVVRDLCBpcworCQkJCSAgICAgICAqIG5vbi1zdGFuZGFyZC4KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbHNvIHRpbWVfdCBpcyBpbmFwcHJvcHJpYXRlIGZvciBnZW5lcmFsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVVRDIHRpbWVzIGJlY2F1c2UgaXQgbWF5IGEgMzIgYml0IHR5cGUuICovCisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3V0ZjguYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FfdXRmOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOGUxMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3V0ZjguYwpAQCAtMCwwICsxLDIxMSBAQAorLyogY3J5cHRvL2FzbjEvYV91dGY4LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworCisvKiBVVEY4IHV0aWxpdGllcyAqLworCisvKiBUaGlzIHBhcnNlcyBhIFVURjggc3RyaW5nIG9uZSBjaGFyYWN0ZXIgYXQgYSB0aW1lLiBJdCBpcyBwYXNzZWQgYSBwb2ludGVyCisgKiB0byB0aGUgc3RyaW5nIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuIEl0IHNldHMgJ3ZhbHVlJyB0byB0aGUgdmFsdWUgb2YKKyAqIHRoZSBjdXJyZW50IGNoYXJhY3Rlci4gSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlOgorICogLTEgPSBzdHJpbmcgdG9vIHNob3J0CisgKiAtMiA9IGlsbGVnYWwgY2hhcmFjdGVyCisgKiAtMyA9IHN1YnNlcXVlbnQgY2hhcmFjdGVycyBub3Qgb2YgdGhlIGZvcm0gMTB4eHh4eHgKKyAqIC00ID0gY2hhcmFjdGVyIGVuY29kZWQgaW5jb3JyZWN0bHkgKG5vdCBtaW5pbWFsIGxlbmd0aCkuCisgKi8KKworaW50IFVURjhfZ2V0Yyhjb25zdCB1bnNpZ25lZCBjaGFyICpzdHIsIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgKnZhbCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IHJldDsKKwlpZihsZW4gPD0gMCkgcmV0dXJuIDA7CisJcCA9IHN0cjsKKworCS8qIENoZWNrIHN5bnRheCBhbmQgd29yayBvdXQgdGhlIGVuY29kZWQgdmFsdWUgKGlmIGNvcnJlY3QpICovCisJaWYoKCpwICYgMHg4MCkgPT0gMCkgeworCQl2YWx1ZSA9ICpwKysgJiAweDdmOworCQlyZXQgPSAxOworCX0gZWxzZSBpZigoKnAgJiAweGUwKSA9PSAweGMwKSB7CisJCWlmKGxlbiA8IDIpIHJldHVybiAtMTsKKwkJaWYoKHBbMV0gJiAweGMwKSAhPSAweDgwKSByZXR1cm4gLTM7CisJCXZhbHVlID0gKCpwKysgJiAweDFmKSA8PCA2OworCQl2YWx1ZSB8PSAqcCsrICYgMHgzZjsKKwkJaWYodmFsdWUgPCAweDgwKSByZXR1cm4gLTQ7CisJCXJldCA9IDI7CisJfSBlbHNlIGlmKCgqcCAmIDB4ZjApID09IDB4ZTApIHsKKwkJaWYobGVuIDwgMykgcmV0dXJuIC0xOworCQlpZiggKChwWzFdICYgMHhjMCkgIT0gMHg4MCkKKwkJICAgfHwgKChwWzJdICYgMHhjMCkgIT0gMHg4MCkgKSByZXR1cm4gLTM7CisJCXZhbHVlID0gKCpwKysgJiAweGYpIDw8IDEyOworCQl2YWx1ZSB8PSAoKnArKyAmIDB4M2YpIDw8IDY7CisJCXZhbHVlIHw9ICpwKysgJiAweDNmOworCQlpZih2YWx1ZSA8IDB4ODAwKSByZXR1cm4gLTQ7CisJCXJldCA9IDM7CisJfSBlbHNlIGlmKCgqcCAmIDB4ZjgpID09IDB4ZjApIHsKKwkJaWYobGVuIDwgNCkgcmV0dXJuIC0xOworCQlpZiggKChwWzFdICYgMHhjMCkgIT0gMHg4MCkKKwkJICAgfHwgKChwWzJdICYgMHhjMCkgIT0gMHg4MCkgCisJCSAgIHx8ICgocFszXSAmIDB4YzApICE9IDB4ODApICkgcmV0dXJuIC0zOworCQl2YWx1ZSA9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4NykpIDw8IDE4OworCQl2YWx1ZSB8PSAoKnArKyAmIDB4M2YpIDw8IDEyOworCQl2YWx1ZSB8PSAoKnArKyAmIDB4M2YpIDw8IDY7CisJCXZhbHVlIHw9ICpwKysgJiAweDNmOworCQlpZih2YWx1ZSA8IDB4MTAwMDApIHJldHVybiAtNDsKKwkJcmV0ID0gNDsKKwl9IGVsc2UgaWYoKCpwICYgMHhmYykgPT0gMHhmOCkgeworCQlpZihsZW4gPCA1KSByZXR1cm4gLTE7CisJCWlmKCAoKHBbMV0gJiAweGMwKSAhPSAweDgwKQorCQkgICB8fCAoKHBbMl0gJiAweGMwKSAhPSAweDgwKSAKKwkJICAgfHwgKChwWzNdICYgMHhjMCkgIT0gMHg4MCkgCisJCSAgIHx8ICgocFs0XSAmIDB4YzApICE9IDB4ODApICkgcmV0dXJuIC0zOworCQl2YWx1ZSA9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4MykpIDw8IDI0OworCQl2YWx1ZSB8PSAoKHVuc2lnbmVkIGxvbmcpKCpwKysgJiAweDNmKSkgPDwgMTg7CisJCXZhbHVlIHw9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4M2YpKSA8PCAxMjsKKwkJdmFsdWUgfD0gKCpwKysgJiAweDNmKSA8PCA2OworCQl2YWx1ZSB8PSAqcCsrICYgMHgzZjsKKwkJaWYodmFsdWUgPCAweDIwMDAwMCkgcmV0dXJuIC00OworCQlyZXQgPSA1OworCX0gZWxzZSBpZigoKnAgJiAweGZlKSA9PSAweGZjKSB7CisJCWlmKGxlbiA8IDYpIHJldHVybiAtMTsKKwkJaWYoICgocFsxXSAmIDB4YzApICE9IDB4ODApCisJCSAgIHx8ICgocFsyXSAmIDB4YzApICE9IDB4ODApIAorCQkgICB8fCAoKHBbM10gJiAweGMwKSAhPSAweDgwKSAKKwkJICAgfHwgKChwWzRdICYgMHhjMCkgIT0gMHg4MCkgCisJCSAgIHx8ICgocFs1XSAmIDB4YzApICE9IDB4ODApICkgcmV0dXJuIC0zOworCQl2YWx1ZSA9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4MSkpIDw8IDMwOworCQl2YWx1ZSB8PSAoKHVuc2lnbmVkIGxvbmcpKCpwKysgJiAweDNmKSkgPDwgMjQ7CisJCXZhbHVlIHw9ICgodW5zaWduZWQgbG9uZykoKnArKyAmIDB4M2YpKSA8PCAxODsKKwkJdmFsdWUgfD0gKCh1bnNpZ25lZCBsb25nKSgqcCsrICYgMHgzZikpIDw8IDEyOworCQl2YWx1ZSB8PSAoKnArKyAmIDB4M2YpIDw8IDY7CisJCXZhbHVlIHw9ICpwKysgJiAweDNmOworCQlpZih2YWx1ZSA8IDB4NDAwMDAwMCkgcmV0dXJuIC00OworCQlyZXQgPSA2OworCX0gZWxzZSByZXR1cm4gLTI7CisJKnZhbCA9IHZhbHVlOworCXJldHVybiByZXQ7Cit9CisKKy8qIFRoaXMgdGFrZXMgYSBjaGFyYWN0ZXIgJ3ZhbHVlJyBhbmQgd3JpdGVzIHRoZSBVVEY4IGVuY29kZWQgdmFsdWUgaW4KKyAqICdzdHInIHdoZXJlICdzdHInIGlzIGEgYnVmZmVyIGNvbnRhaW5pbmcgJ2xlbicgY2hhcmFjdGVycy4gUmV0dXJucworICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gb3IgLTEgaWYgJ2xlbicgaXMgdG9vIHNtYWxsLiAnc3RyJyBjYW4KKyAqIGJlIHNldCB0byBOVUxMIGluIHdoaWNoIGNhc2UgaXQganVzdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KKyAqIEl0IHdpbGwgbmVlZCBhdCBtb3N0IDYgY2hhcmFjdGVycy4KKyAqLworCitpbnQgVVRGOF9wdXRjKHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKK3sKKwlpZighc3RyKSBsZW4gPSA2OwkvKiBNYXhpbXVtIHdlIHdpbGwgbmVlZCAqLworCWVsc2UgaWYobGVuIDw9IDApIHJldHVybiAtMTsKKwlpZih2YWx1ZSA8IDB4ODApIHsKKwkJaWYoc3RyKSAqc3RyID0gKHVuc2lnbmVkIGNoYXIpdmFsdWU7CisJCXJldHVybiAxOworCX0KKwlpZih2YWx1ZSA8IDB4ODAwKSB7CisJCWlmKGxlbiA8IDIpIHJldHVybiAtMTsKKwkJaWYoc3RyKSB7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiA2KSAmIDB4MWYpIHwgMHhjMCk7CisJCQkqc3RyID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSAmIDB4M2YpIHwgMHg4MCk7CisJCX0KKwkJcmV0dXJuIDI7CisJfQorCWlmKHZhbHVlIDwgMHgxMDAwMCkgeworCQlpZihsZW4gPCAzKSByZXR1cm4gLTE7CisJCWlmKHN0cikgeworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gMTIpICYgMHhmKSB8IDB4ZTApOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gNikgJiAweDNmKSB8IDB4ODApOworCQkJKnN0ciA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgJiAweDNmKSB8IDB4ODApOworCQl9CisJCXJldHVybiAzOworCX0KKwlpZih2YWx1ZSA8IDB4MjAwMDAwKSB7CisJCWlmKGxlbiA8IDQpIHJldHVybiAtMTsKKwkJaWYoc3RyKSB7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAxOCkgJiAweDcpIHwgMHhmMCk7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAxMikgJiAweDNmKSB8IDB4ODApOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gNikgJiAweDNmKSB8IDB4ODApOworCQkJKnN0ciA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgJiAweDNmKSB8IDB4ODApOworCQl9CisJCXJldHVybiA0OworCX0KKwlpZih2YWx1ZSA8IDB4NDAwMDAwMCkgeworCQlpZihsZW4gPCA1KSByZXR1cm4gLTE7CisJCWlmKHN0cikgeworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gMjQpICYgMHgzKSB8IDB4ZjgpOworCQkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gMTgpICYgMHgzZikgfCAweDgwKTsKKwkJCSpzdHIrKyA9ICh1bnNpZ25lZCBjaGFyKSgoKHZhbHVlID4+IDEyKSAmIDB4M2YpIHwgMHg4MCk7CisJCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7CisJCQkqc3RyID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSAmIDB4M2YpIHwgMHg4MCk7CisJCX0KKwkJcmV0dXJuIDU7CisJfQorCWlmKGxlbiA8IDYpIHJldHVybiAtMTsKKwlpZihzdHIpIHsKKwkJKnN0cisrID0gKHVuc2lnbmVkIGNoYXIpKCgodmFsdWUgPj4gMzApICYgMHgxKSB8IDB4ZmMpOworCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAyNCkgJiAweDNmKSB8IDB4ODApOworCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAxOCkgJiAweDNmKSB8IDB4ODApOworCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiAxMikgJiAweDNmKSB8IDB4ODApOworCQkqc3RyKysgPSAodW5zaWduZWQgY2hhcikoKCh2YWx1ZSA+PiA2KSAmIDB4M2YpIHwgMHg4MCk7CisJCSpzdHIgPSAodW5zaWduZWQgY2hhcikoKHZhbHVlICYgMHgzZikgfCAweDgwKTsKKwl9CisJcmV0dXJuIDY7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hX3ZlcmlmeS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV92ZXJpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNkYjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYV92ZXJpZnkuYwpAQCAtMCwwICsxLDE5NyBAQAorLyogY3J5cHRvL2FzbjEvYV92ZXJpZnkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgImFzbjFfbG9jbC5oIgorCisjaWZuZGVmIE5PX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaWZuZGVmIE5PX0FTTjFfT0xECisKK2ludCBBU04xX3ZlcmlmeShpMmRfb2Zfdm9pZCAqaTJkLCBYNTA5X0FMR09SICphLCBBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZSwKKwkJY2hhciAqZGF0YSwgRVZQX1BLRVkgKnBrZXkpCisJeworCUVWUF9NRF9DVFggY3R4OworCWNvbnN0IEVWUF9NRCAqdHlwZTsKKwl1bnNpZ25lZCBjaGFyICpwLCpidWZfaW49TlVMTDsKKwlpbnQgcmV0PSAtMSxpLGlubDsKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKwlpPU9CSl9vYmoybmlkKGEtPmFsZ29yaXRobSk7CisJdHlwZT1FVlBfZ2V0X2RpZ2VzdGJ5bmFtZShPQkpfbmlkMnNuKGkpKTsKKwlpZiAodHlwZSA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVkVSSUZZLEFTTjFfUl9VTktOT1dOX01FU1NBR0VfRElHRVNUX0FMR09SSVRITSk7CisJCWdvdG8gZXJyOworCQl9CisJCisJaW5sPWkyZChkYXRhLE5VTEwpOworCWJ1Zl9pbj1PUEVOU1NMX21hbGxvYygodW5zaWduZWQgaW50KWlubCk7CisJaWYgKGJ1Zl9pbiA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVkVSSUZZLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlwPWJ1Zl9pbjsKKworCWkyZChkYXRhLCZwKTsKKwlFVlBfVmVyaWZ5SW5pdF9leCgmY3R4LHR5cGUsIE5VTEwpOworCUVWUF9WZXJpZnlVcGRhdGUoJmN0eCwodW5zaWduZWQgY2hhciAqKWJ1Zl9pbixpbmwpOworCisJT1BFTlNTTF9jbGVhbnNlKGJ1Zl9pbiwodW5zaWduZWQgaW50KWlubCk7CisJT1BFTlNTTF9mcmVlKGJ1Zl9pbik7CisKKwlpZiAoRVZQX1ZlcmlmeUZpbmFsKCZjdHgsKHVuc2lnbmVkIGNoYXIgKilzaWduYXR1cmUtPmRhdGEsCisJCQkodW5zaWduZWQgaW50KXNpZ25hdHVyZS0+bGVuZ3RoLHBrZXkpIDw9IDApCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9WRVJJRlksRVJSX1JfRVZQX0xJQik7CisJCXJldD0wOworCQlnb3RvIGVycjsKKwkJfQorCS8qIHdlIGRvbid0IG5lZWQgdG8gemVybyB0aGUgJ2N0eCcgYmVjYXVzZSB3ZSBqdXN0IGNoZWNrZWQKKwkgKiBwdWJsaWMgaW5mb3JtYXRpb24gKi8KKwkvKiBtZW1zZXQoJmN0eCwwLHNpemVvZihjdHgpKTsgKi8KKwlyZXQ9MTsKK2VycjoKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuKHJldCk7CisJfQorCisjZW5kaWYKKworCitpbnQgQVNOMV9pdGVtX3ZlcmlmeShjb25zdCBBU04xX0lURU0gKml0LCBYNTA5X0FMR09SICphLCBBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZSwKKwkgICAgIHZvaWQgKmFzbiwgRVZQX1BLRVkgKnBrZXkpCisJeworCUVWUF9NRF9DVFggY3R4OworCWNvbnN0IEVWUF9NRCAqdHlwZSA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqYnVmX2luPU5VTEw7CisJaW50IHJldD0gLTEsaW5sOworCisJaW50IG1kbmlkLCBwa25pZDsKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKworCS8qIENvbnZlcnQgc2lnbmF0dXJlIE9JRCBpbnRvIGRpZ2VzdCBhbmQgcHVibGljIGtleSBPSURzICovCisJaWYgKCFPQkpfZmluZF9zaWdpZF9hbGdzKE9CSl9vYmoybmlkKGEtPmFsZ29yaXRobSksICZtZG5pZCwgJnBrbmlkKSkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fVkVSSUZZLEFTTjFfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0pOworCQlnb3RvIGVycjsKKwkJfQorCXR5cGU9RVZQX2dldF9kaWdlc3RieW5pZChtZG5pZCk7CisJaWYgKHR5cGUgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fVkVSSUZZLEFTTjFfUl9VTktOT1dOX01FU1NBR0VfRElHRVNUX0FMR09SSVRITSk7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBDaGVjayBwdWJsaWMga2V5IE9JRCBtYXRjaGVzIHB1YmxpYyBrZXkgdHlwZSAqLworCWlmIChFVlBfUEtFWV90eXBlKHBrbmlkKSAhPSBwa2V5LT5hbWV0aC0+cGtleV9pZCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fVkVSSUZZLEFTTjFfUl9XUk9OR19QVUJMSUNfS0VZX1RZUEUpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKCFFVlBfVmVyaWZ5SW5pdF9leCgmY3R4LHR5cGUsIE5VTEwpKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9WRVJJRlksRVJSX1JfRVZQX0xJQik7CisJCXJldD0wOworCQlnb3RvIGVycjsKKwkJfQorCisJaW5sID0gQVNOMV9pdGVtX2kyZChhc24sICZidWZfaW4sIGl0KTsKKwkKKwlpZiAoYnVmX2luID09IE5VTEwpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX1ZFUklGWSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlFVlBfVmVyaWZ5VXBkYXRlKCZjdHgsKHVuc2lnbmVkIGNoYXIgKilidWZfaW4saW5sKTsKKworCU9QRU5TU0xfY2xlYW5zZShidWZfaW4sKHVuc2lnbmVkIGludClpbmwpOworCU9QRU5TU0xfZnJlZShidWZfaW4pOworCisJaWYgKEVWUF9WZXJpZnlGaW5hbCgmY3R4LCh1bnNpZ25lZCBjaGFyICopc2lnbmF0dXJlLT5kYXRhLAorCQkJKHVuc2lnbmVkIGludClzaWduYXR1cmUtPmxlbmd0aCxwa2V5KSA8PSAwKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9WRVJJRlksRVJSX1JfRVZQX0xJQik7CisJCXJldD0wOworCQlnb3RvIGVycjsKKwkJfQorCS8qIHdlIGRvbid0IG5lZWQgdG8gemVybyB0aGUgJ2N0eCcgYmVjYXVzZSB3ZSBqdXN0IGNoZWNrZWQKKwkgKiBwdWJsaWMgaW5mb3JtYXRpb24gKi8KKwkvKiBtZW1zZXQoJmN0eCwwLHNpemVvZihjdHgpKTsgKi8KKwlyZXQ9MTsKK2VycjoKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuKHJldCk7CisJfQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FtZXRoX2xpYi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYW1ldGhfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4YjZjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FtZXRoX2xpYi5jCkBAIC0wLDAgKzEsNDUwIEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSAiYXNuMV9sb2NsLmgiCisKK2V4dGVybiBjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCByc2FfYXNuMV9tZXRoc1tdOworZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGRzYV9hc24xX21ldGhzW107CitleHRlcm4gY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgZGhfYXNuMV9tZXRoOworZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGVja2V5X2FzbjFfbWV0aDsKK2V4dGVybiBjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCBobWFjX2FzbjFfbWV0aDsKKworLyogS2VlcCB0aGlzIHNvcnRlZCBpbiB0eXBlIG9yZGVyICEhICovCitzdGF0aWMgY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKnN0YW5kYXJkX21ldGhvZHNbXSA9IAorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkmcnNhX2FzbjFfbWV0aHNbMF0sCisJJnJzYV9hc24xX21ldGhzWzFdLAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwkmZGhfYXNuMV9tZXRoLAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJJmRzYV9hc24xX21ldGhzWzBdLAorCSZkc2FfYXNuMV9tZXRoc1sxXSwKKwkmZHNhX2FzbjFfbWV0aHNbMl0sCisJJmRzYV9hc24xX21ldGhzWzNdLAorCSZkc2FfYXNuMV9tZXRoc1s0XSwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisJJmVja2V5X2FzbjFfbWV0aCwKKyNlbmRpZgorCSZobWFjX2FzbjFfbWV0aAorCX07CisKK3R5cGVkZWYgaW50IHNrX2NtcF9mbl90eXBlKGNvbnN0IGNoYXIgKiBjb25zdCAqYSwgY29uc3QgY2hhciAqIGNvbnN0ICpiKTsKK0RFQ0xBUkVfU1RBQ0tfT0YoRVZQX1BLRVlfQVNOMV9NRVRIT0QpCitzdGF0aWMgU1RBQ0tfT0YoRVZQX1BLRVlfQVNOMV9NRVRIT0QpICphcHBfbWV0aG9kcyA9IE5VTEw7CisKKworCisjaWZkZWYgVEVTVAordm9pZCBtYWluKCkKKwl7CisJaW50IGk7CisJZm9yIChpID0gMDsKKwkJaSA8IHNpemVvZihzdGFuZGFyZF9tZXRob2RzKS9zaXplb2YoRVZQX1BLRVlfQVNOMV9NRVRIT0QgKik7CisJCWkrKykKKwkJZnByaW50ZihzdGRlcnIsICJOdW1iZXIgJWQgaWQ9JWQgKCVzKVxuIiwgaSwKKwkJCXN0YW5kYXJkX21ldGhvZHNbaV0tPnBrZXlfaWQsCisJCQlPQkpfbmlkMnNuKHN0YW5kYXJkX21ldGhvZHNbaV0tPnBrZXlfaWQpKTsKKwl9CisjZW5kaWYKKworREVDTEFSRV9PQkpfQlNFQVJDSF9DTVBfRk4oY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKiwKKwkJCSAgIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICosIGFtZXRoKTsKKworc3RhdGljIGludCBhbWV0aF9jbXAoY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKiBjb25zdCAqYSwKKwkJICAgICBjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqIGNvbnN0ICpiKQorCXsKKyAgICAgICAgcmV0dXJuICgoKmEpLT5wa2V5X2lkIC0gKCpiKS0+cGtleV9pZCk7CisJfQorCitJTVBMRU1FTlRfT0JKX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICosCisJCQkgICAgIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICosIGFtZXRoKTsKKworaW50IEVWUF9QS0VZX2FzbjFfZ2V0X2NvdW50KHZvaWQpCisJeworCWludCBudW0gPSBzaXplb2Yoc3RhbmRhcmRfbWV0aG9kcykvc2l6ZW9mKEVWUF9QS0VZX0FTTjFfTUVUSE9EICopOworCWlmIChhcHBfbWV0aG9kcykKKwkJbnVtICs9IHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX251bShhcHBfbWV0aG9kcyk7CisJcmV0dXJuIG51bTsKKwl9CisKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICpFVlBfUEtFWV9hc24xX2dldDAoaW50IGlkeCkKKwl7CisJaW50IG51bSA9IHNpemVvZihzdGFuZGFyZF9tZXRob2RzKS9zaXplb2YoRVZQX1BLRVlfQVNOMV9NRVRIT0QgKik7CisJaWYgKGlkeCA8IDApCisJCXJldHVybiBOVUxMOyAKKwlpZiAoaWR4IDwgbnVtKQorCQlyZXR1cm4gc3RhbmRhcmRfbWV0aG9kc1tpZHhdOworCWlkeCAtPSBudW07CisJcmV0dXJuIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3ZhbHVlKGFwcF9tZXRob2RzLCBpZHgpOworCX0KKworc3RhdGljIGNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICpwa2V5X2FzbjFfZmluZChpbnQgdHlwZSkKKwl7CisJRVZQX1BLRVlfQVNOMV9NRVRIT0QgdG1wOworCWNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICp0ID0gJnRtcCwgKipyZXQ7CisJdG1wLnBrZXlfaWQgPSB0eXBlOworCWlmIChhcHBfbWV0aG9kcykKKwkJeworCQlpbnQgaWR4OworCQlpZHggPSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9maW5kKGFwcF9tZXRob2RzLCAmdG1wKTsKKwkJaWYgKGlkeCA+PSAwKQorCQkJcmV0dXJuIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3ZhbHVlKGFwcF9tZXRob2RzLCBpZHgpOworCQl9CisJcmV0ID0gT0JKX2JzZWFyY2hfYW1ldGgoJnQsIHN0YW5kYXJkX21ldGhvZHMsCisJCQkgIHNpemVvZihzdGFuZGFyZF9tZXRob2RzKQorCQkJICAvc2l6ZW9mKEVWUF9QS0VZX0FTTjFfTUVUSE9EICopKTsKKwlpZiAoIXJldCB8fCAhKnJldCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICpyZXQ7CisJfQorCisvKiBGaW5kIGFuIGltcGxlbWVudGF0aW9uIG9mIGFuIEFTTjEgYWxnb3JpdGhtLiBJZiAncGUnIGlzIG5vdCBOVUxMCisgKiBhbHNvIHNlYXJjaCB0aHJvdWdoIGVuZ2luZXMgYW5kIHNldCAqcGUgdG8gYSBmdW5jdGlvbmFsIHJlZmVyZW5jZQorICogdG8gdGhlIGVuZ2luZSBpbXBsZW1lbnRpbmcgJ3R5cGUnIG9yIE5VTEwgaWYgbm8gZW5naW5lIGltcGxlbWVudHMgCisgKiBpdC4KKyAqLworCitjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRVZQX1BLRVlfYXNuMV9maW5kKEVOR0lORSAqKnBlLCBpbnQgdHlwZSkKKwl7CisJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKnQ7CisJRU5HSU5FICplOworCisJZm9yICg7OykKKwkJeworCQl0ID0gcGtleV9hc24xX2ZpbmQodHlwZSk7CisJCWlmICghdCB8fCAhKHQtPnBrZXlfZmxhZ3MgJiBBU04xX1BLRVlfQUxJQVMpKQorCQkJYnJlYWs7CisJCXR5cGUgPSB0LT5wa2V5X2Jhc2VfaWQ7CisJCX0KKwlpZiAocGUpCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJLyogdHlwZSB3aWxsIGNvbnRhaW4gdGhlIGZpbmFsIHVuYWxpYXNlZCB0eXBlICovCisJCWUgPSBFTkdJTkVfZ2V0X3BrZXlfYXNuMV9tZXRoX2VuZ2luZSh0eXBlKTsKKwkJaWYgKGUpCisJCQl7CisJCQkqcGUgPSBlOworCQkJcmV0dXJuIEVOR0lORV9nZXRfcGtleV9hc24xX21ldGgoZSwgdHlwZSk7CisJCQl9CisjZW5kaWYKKwkJKnBlID0gTlVMTDsKKwkJfQorCXJldHVybiB0OworCX0KKworY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKkVWUF9QS0VZX2FzbjFfZmluZF9zdHIoRU5HSU5FICoqcGUsCisJCQkJCWNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKKwl7CisJaW50IGk7CisJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCWlmIChsZW4gPT0gLTEpCisJCWxlbiA9IHN0cmxlbihzdHIpOworCWlmIChwZSkKKwkJeworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQlFTkdJTkUgKmU7CisJCWFtZXRoID0gRU5HSU5FX3BrZXlfYXNuMV9maW5kX3N0cigmZSwgc3RyLCBsZW4pOworCQlpZiAoYW1ldGgpCisJCQl7CisJCQkvKiBDb252ZXJ0IHN0cnVjdHVyYWwgaW50bworCQkJICogZnVuY3Rpb25hbCByZWZlcmVuY2UKKwkJCSAqLworCQkJaWYgKCFFTkdJTkVfaW5pdChlKSkKKwkJCQlhbWV0aCA9IE5VTEw7CisJCQlFTkdJTkVfZnJlZShlKTsKKwkJCSpwZSA9IGU7CisJCQlyZXR1cm4gYW1ldGg7CisJCQl9CisjZW5kaWYKKwkJKnBlID0gTlVMTDsKKwkJfQorCWZvciAoaSA9IDA7IGkgPCBFVlBfUEtFWV9hc24xX2dldF9jb3VudCgpOyBpKyspCisJCXsKKwkJYW1ldGggPSBFVlBfUEtFWV9hc24xX2dldDAoaSk7CisJCWlmIChhbWV0aC0+cGtleV9mbGFncyAmIEFTTjFfUEtFWV9BTElBUykKKwkJCWNvbnRpbnVlOworCQlpZiAoKChpbnQpc3RybGVuKGFtZXRoLT5wZW1fc3RyKSA9PSBsZW4pICYmIAorCQkJIXN0cm5jYXNlY21wKGFtZXRoLT5wZW1fc3RyLCBzdHIsIGxlbikpCisJCQlyZXR1cm4gYW1ldGg7CisJCX0KKwlyZXR1cm4gTlVMTDsKKwl9CisKK2ludCBFVlBfUEtFWV9hc24xX2FkZDAoY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoKQorCXsKKwlpZiAoYXBwX21ldGhvZHMgPT0gTlVMTCkKKwkJeworCQlhcHBfbWV0aG9kcyA9IHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX25ldyhhbWV0aF9jbXApOworCQlpZiAoIWFwcF9tZXRob2RzKQorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoIXNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3B1c2goYXBwX21ldGhvZHMsIGFtZXRoKSkKKwkJcmV0dXJuIDA7CisJc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0Rfc29ydChhcHBfbWV0aG9kcyk7CisJcmV0dXJuIDE7CisJfQorCitpbnQgRVZQX1BLRVlfYXNuMV9hZGRfYWxpYXMoaW50IHRvLCBpbnQgZnJvbSkKKwl7CisJRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9uZXcoZnJvbSwgQVNOMV9QS0VZX0FMSUFTLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWFtZXRoKQorCQlyZXR1cm4gMDsKKwlhbWV0aC0+cGtleV9iYXNlX2lkID0gdG87CisJcmV0dXJuIEVWUF9QS0VZX2FzbjFfYWRkMChhbWV0aCk7CisJfQorCitpbnQgRVZQX1BLRVlfYXNuMV9nZXQwX2luZm8oaW50ICpwcGtleV9pZCwgaW50ICpwcGtleV9iYXNlX2lkLCBpbnQgKnBwa2V5X2ZsYWdzLAorCQkJCWNvbnN0IGNoYXIgKipwaW5mbywgY29uc3QgY2hhciAqKnBwZW1fc3RyLAorCQkJCQljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGgpCisJeworCWlmICghYW1ldGgpCisJCXJldHVybiAwOworCWlmIChwcGtleV9pZCkKKwkJKnBwa2V5X2lkID0gYW1ldGgtPnBrZXlfaWQ7CisJaWYgKHBwa2V5X2Jhc2VfaWQpCisJCSpwcGtleV9iYXNlX2lkID0gYW1ldGgtPnBrZXlfYmFzZV9pZDsKKwlpZiAocHBrZXlfZmxhZ3MpCisJCSpwcGtleV9mbGFncyA9IGFtZXRoLT5wa2V5X2ZsYWdzOworCWlmIChwaW5mbykKKwkJKnBpbmZvID0gYW1ldGgtPmluZm87CisJaWYgKHBwZW1fc3RyKQorCQkqcHBlbV9zdHIgPSBhbWV0aC0+cGVtX3N0cjsKKwlyZXR1cm4gMTsKKwl9CisKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EKiBFVlBfUEtFWV9nZXQwX2FzbjEoRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBwa2V5LT5hbWV0aDsKKwl9CisKK0VWUF9QS0VZX0FTTjFfTUVUSE9EKiBFVlBfUEtFWV9hc24xX25ldyhpbnQgaWQsIGludCBmbGFncywKKwkJCQkJY29uc3QgY2hhciAqcGVtX3N0ciwgY29uc3QgY2hhciAqaW5mbykKKwl7CisJRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCWFtZXRoID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVWUF9QS0VZX0FTTjFfTUVUSE9EKSk7CisJaWYgKCFhbWV0aCkKKwkJcmV0dXJuIE5VTEw7CisKKwlhbWV0aC0+cGtleV9pZCA9IGlkOworCWFtZXRoLT5wa2V5X2Jhc2VfaWQgPSBpZDsKKwlhbWV0aC0+cGtleV9mbGFncyA9IGZsYWdzIHwgQVNOMV9QS0VZX0RZTkFNSUM7CisKKwlpZiAoaW5mbykKKwkJeworCQlhbWV0aC0+aW5mbyA9IEJVRl9zdHJkdXAoaW5mbyk7CisJCWlmICghYW1ldGgtPmluZm8pCisJCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJYW1ldGgtPmluZm8gPSBOVUxMOworCisJaWYgKHBlbV9zdHIpCisJCXsKKwkJYW1ldGgtPnBlbV9zdHIgPSBCVUZfc3RyZHVwKHBlbV9zdHIpOworCQlpZiAoIWFtZXRoLT5wZW1fc3RyKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCWFtZXRoLT5wZW1fc3RyID0gTlVMTDsKKworCWFtZXRoLT5wdWJfZGVjb2RlID0gMDsKKwlhbWV0aC0+cHViX2VuY29kZSA9IDA7CisJYW1ldGgtPnB1Yl9jbXAgPSAwOworCWFtZXRoLT5wdWJfcHJpbnQgPSAwOworCisJYW1ldGgtPnByaXZfZGVjb2RlID0gMDsKKwlhbWV0aC0+cHJpdl9lbmNvZGUgPSAwOworCWFtZXRoLT5wcml2X3ByaW50ID0gMDsKKworCWFtZXRoLT5vbGRfcHJpdl9lbmNvZGUgPSAwOworCWFtZXRoLT5vbGRfcHJpdl9kZWNvZGUgPSAwOworCisJYW1ldGgtPnBrZXlfc2l6ZSA9IDA7CisJYW1ldGgtPnBrZXlfYml0cyA9IDA7CisKKwlhbWV0aC0+cGFyYW1fZGVjb2RlID0gMDsKKwlhbWV0aC0+cGFyYW1fZW5jb2RlID0gMDsKKwlhbWV0aC0+cGFyYW1fbWlzc2luZyA9IDA7CisJYW1ldGgtPnBhcmFtX2NvcHkgPSAwOworCWFtZXRoLT5wYXJhbV9jbXAgPSAwOworCWFtZXRoLT5wYXJhbV9wcmludCA9IDA7CisKKwlhbWV0aC0+cGtleV9mcmVlID0gMDsKKwlhbWV0aC0+cGtleV9jdHJsID0gMDsKKworCXJldHVybiBhbWV0aDsKKworCWVycjoKKworCUVWUF9QS0VZX2FzbjFfZnJlZShhbWV0aCk7CisJcmV0dXJuIE5VTEw7CisKKwl9CisKK3ZvaWQgRVZQX1BLRVlfYXNuMV9jb3B5KEVWUF9QS0VZX0FTTjFfTUVUSE9EICpkc3QsIAorCQkJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKnNyYykKKwl7CisKKwlkc3QtPnB1Yl9kZWNvZGUgPSBzcmMtPnB1Yl9kZWNvZGU7CisJZHN0LT5wdWJfZW5jb2RlID0gc3JjLT5wdWJfZW5jb2RlOworCWRzdC0+cHViX2NtcCA9IHNyYy0+cHViX2NtcDsKKwlkc3QtPnB1Yl9wcmludCA9IHNyYy0+cHViX3ByaW50OworCisJZHN0LT5wcml2X2RlY29kZSA9IHNyYy0+cHJpdl9kZWNvZGU7CisJZHN0LT5wcml2X2VuY29kZSA9IHNyYy0+cHJpdl9lbmNvZGU7CisJZHN0LT5wcml2X3ByaW50ID0gc3JjLT5wcml2X3ByaW50OworCisJZHN0LT5vbGRfcHJpdl9lbmNvZGUgPSBzcmMtPm9sZF9wcml2X2VuY29kZTsKKwlkc3QtPm9sZF9wcml2X2RlY29kZSA9IHNyYy0+b2xkX3ByaXZfZGVjb2RlOworCisJZHN0LT5wa2V5X3NpemUgPSBzcmMtPnBrZXlfc2l6ZTsKKwlkc3QtPnBrZXlfYml0cyA9IHNyYy0+cGtleV9iaXRzOworCisJZHN0LT5wYXJhbV9kZWNvZGUgPSBzcmMtPnBhcmFtX2RlY29kZTsKKwlkc3QtPnBhcmFtX2VuY29kZSA9IHNyYy0+cGFyYW1fZW5jb2RlOworCWRzdC0+cGFyYW1fbWlzc2luZyA9IHNyYy0+cGFyYW1fbWlzc2luZzsKKwlkc3QtPnBhcmFtX2NvcHkgPSBzcmMtPnBhcmFtX2NvcHk7CisJZHN0LT5wYXJhbV9jbXAgPSBzcmMtPnBhcmFtX2NtcDsKKwlkc3QtPnBhcmFtX3ByaW50ID0gc3JjLT5wYXJhbV9wcmludDsKKworCWRzdC0+cGtleV9mcmVlID0gc3JjLT5wa2V5X2ZyZWU7CisJZHN0LT5wa2V5X2N0cmwgPSBzcmMtPnBrZXlfY3RybDsKKworCX0KKwordm9pZCBFVlBfUEtFWV9hc24xX2ZyZWUoRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoKQorCXsKKwlpZiAoYW1ldGggJiYgKGFtZXRoLT5wa2V5X2ZsYWdzICYgQVNOMV9QS0VZX0RZTkFNSUMpKQorCQl7CisJCWlmIChhbWV0aC0+cGVtX3N0cikKKwkJCU9QRU5TU0xfZnJlZShhbWV0aC0+cGVtX3N0cik7CisJCWlmIChhbWV0aC0+aW5mbykKKwkJCU9QRU5TU0xfZnJlZShhbWV0aC0+aW5mbyk7CisJCU9QRU5TU0xfZnJlZShhbWV0aCk7CisJCX0KKwl9CisKK3ZvaWQgRVZQX1BLRVlfYXNuMV9zZXRfcHVibGljKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJaW50ICgqcHViX2RlY29kZSkoRVZQX1BLRVkgKnBrLCBYNTA5X1BVQktFWSAqcHViKSwKKwkJaW50ICgqcHViX2VuY29kZSkoWDUwOV9QVUJLRVkgKnB1YiwgY29uc3QgRVZQX1BLRVkgKnBrKSwKKwkJaW50ICgqcHViX2NtcCkoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKSwKKwkJaW50ICgqcHViX3ByaW50KShCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisJCQkJCQkJQVNOMV9QQ1RYICpwY3R4KSwKKwkJaW50ICgqcGtleV9zaXplKShjb25zdCBFVlBfUEtFWSAqcGspLAorCQlpbnQgKCpwa2V5X2JpdHMpKGNvbnN0IEVWUF9QS0VZICpwaykpCisJeworCWFtZXRoLT5wdWJfZGVjb2RlID0gcHViX2RlY29kZTsKKwlhbWV0aC0+cHViX2VuY29kZSA9IHB1Yl9lbmNvZGU7CisJYW1ldGgtPnB1Yl9jbXAgPSBwdWJfY21wOworCWFtZXRoLT5wdWJfcHJpbnQgPSBwdWJfcHJpbnQ7CisJYW1ldGgtPnBrZXlfc2l6ZSA9IHBrZXlfc2l6ZTsKKwlhbWV0aC0+cGtleV9iaXRzID0gcGtleV9iaXRzOworCX0KKwordm9pZCBFVlBfUEtFWV9hc24xX3NldF9wcml2YXRlKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJaW50ICgqcHJpdl9kZWNvZGUpKEVWUF9QS0VZICpwaywgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpLAorCQlpbnQgKCpwcml2X2VuY29kZSkoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGNvbnN0IEVWUF9QS0VZICpwayksCisJCWludCAoKnByaXZfcHJpbnQpKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKnBjdHgpKQorCXsKKwlhbWV0aC0+cHJpdl9kZWNvZGUgPSBwcml2X2RlY29kZTsKKwlhbWV0aC0+cHJpdl9lbmNvZGUgPSBwcml2X2VuY29kZTsKKwlhbWV0aC0+cHJpdl9wcmludCA9IHByaXZfcHJpbnQ7CisJfQorCit2b2lkIEVWUF9QS0VZX2FzbjFfc2V0X3BhcmFtKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJaW50ICgqcGFyYW1fZGVjb2RlKShFVlBfUEtFWSAqcGtleSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwgaW50IGRlcmxlbiksCisJCWludCAoKnBhcmFtX2VuY29kZSkoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVuc2lnbmVkIGNoYXIgKipwZGVyKSwKKwkJaW50ICgqcGFyYW1fbWlzc2luZykoY29uc3QgRVZQX1BLRVkgKnBrKSwKKwkJaW50ICgqcGFyYW1fY29weSkoRVZQX1BLRVkgKnRvLCBjb25zdCBFVlBfUEtFWSAqZnJvbSksCisJCWludCAoKnBhcmFtX2NtcCkoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKSwKKwkJaW50ICgqcGFyYW1fcHJpbnQpKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKnBjdHgpKQorCXsKKwlhbWV0aC0+cGFyYW1fZGVjb2RlID0gcGFyYW1fZGVjb2RlOworCWFtZXRoLT5wYXJhbV9lbmNvZGUgPSBwYXJhbV9lbmNvZGU7CisJYW1ldGgtPnBhcmFtX21pc3NpbmcgPSBwYXJhbV9taXNzaW5nOworCWFtZXRoLT5wYXJhbV9jb3B5ID0gcGFyYW1fY29weTsKKwlhbWV0aC0+cGFyYW1fY21wID0gcGFyYW1fY21wOworCWFtZXRoLT5wYXJhbV9wcmludCA9IHBhcmFtX3ByaW50OworCX0KKwordm9pZCBFVlBfUEtFWV9hc24xX3NldF9mcmVlKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJdm9pZCAoKnBrZXlfZnJlZSkoRVZQX1BLRVkgKnBrZXkpKQorCXsKKwlhbWV0aC0+cGtleV9mcmVlID0gcGtleV9mcmVlOworCX0KKwordm9pZCBFVlBfUEtFWV9hc24xX3NldF9jdHJsKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJaW50ICgqcGtleV9jdHJsKShFVlBfUEtFWSAqcGtleSwgaW50IG9wLAorCQkJCQkJCWxvbmcgYXJnMSwgdm9pZCAqYXJnMikpCisJeworCWFtZXRoLT5wa2V5X2N0cmwgPSBwa2V5X2N0cmw7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMS5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzE4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hc24xLmgKQEAgLTAsMCArMSwxNDAyIEBACisvKiBjcnlwdG8vYXNuMS9hc24xLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfQVNOMV9ICisjZGVmaW5lIEhFQURFUl9BU04xX0gKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NhZmVzdGFjay5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9zeW1oYWNrcy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfQlVJTERfU0hMSUJDUllQVE8KKyMgdW5kZWYgT1BFTlNTTF9FWFRFUk4KKyMgZGVmaW5lIE9QRU5TU0xfRVhURVJOIE9QRU5TU0xfRVhQT1JUCisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBWX0FTTjFfVU5JVkVSU0FMCQkweDAwCisjZGVmaW5lCVZfQVNOMV9BUFBMSUNBVElPTgkJMHg0MAorI2RlZmluZSBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQwkJMHg4MAorI2RlZmluZSBWX0FTTjFfUFJJVkFURQkJCTB4YzAKKworI2RlZmluZSBWX0FTTjFfQ09OU1RSVUNURUQJCTB4MjAKKyNkZWZpbmUgVl9BU04xX1BSSU1JVElWRV9UQUcJCTB4MWYKKyNkZWZpbmUgVl9BU04xX1BSSU1BVElWRV9UQUcJCTB4MWYKKworI2RlZmluZSBWX0FTTjFfQVBQX0NIT09TRQkJLTIJLyogbGV0IHRoZSByZWNpcGllbnQgY2hvb3NlICovCisjZGVmaW5lIFZfQVNOMV9PVEhFUgkJCS0zCS8qIHVzZWQgaW4gQVNOMV9UWVBFICovCisjZGVmaW5lIFZfQVNOMV9BTlkJCQktNAkvKiB1c2VkIGluIEFTTjEgdGVtcGxhdGUgY29kZSAqLworCisjZGVmaW5lIFZfQVNOMV9ORUcJCQkweDEwMAkvKiBuZWdhdGl2ZSBmbGFnICovCisKKyNkZWZpbmUgVl9BU04xX1VOREVGCQkJLTEKKyNkZWZpbmUgVl9BU04xX0VPQwkJCTAKKyNkZWZpbmUgVl9BU04xX0JPT0xFQU4JCQkxCS8qKi8KKyNkZWZpbmUgVl9BU04xX0lOVEVHRVIJCQkyCisjZGVmaW5lIFZfQVNOMV9ORUdfSU5URUdFUgkJKDIgfCBWX0FTTjFfTkVHKQorI2RlZmluZSBWX0FTTjFfQklUX1NUUklORwkJMworI2RlZmluZSBWX0FTTjFfT0NURVRfU1RSSU5HCQk0CisjZGVmaW5lIFZfQVNOMV9OVUxMCQkJNQorI2RlZmluZSBWX0FTTjFfT0JKRUNUCQkJNgorI2RlZmluZSBWX0FTTjFfT0JKRUNUX0RFU0NSSVBUT1IJNworI2RlZmluZSBWX0FTTjFfRVhURVJOQUwJCQk4CisjZGVmaW5lIFZfQVNOMV9SRUFMCQkJOQorI2RlZmluZSBWX0FTTjFfRU5VTUVSQVRFRAkJMTAKKyNkZWZpbmUgVl9BU04xX05FR19FTlVNRVJBVEVECQkoMTAgfCBWX0FTTjFfTkVHKQorI2RlZmluZSBWX0FTTjFfVVRGOFNUUklORwkJMTIKKyNkZWZpbmUgVl9BU04xX1NFUVVFTkNFCQkJMTYKKyNkZWZpbmUgVl9BU04xX1NFVAkJCTE3CisjZGVmaW5lIFZfQVNOMV9OVU1FUklDU1RSSU5HCQkxOAkvKiovCisjZGVmaW5lIFZfQVNOMV9QUklOVEFCTEVTVFJJTkcJCTE5CisjZGVmaW5lIFZfQVNOMV9UNjFTVFJJTkcJCTIwCisjZGVmaW5lIFZfQVNOMV9URUxFVEVYU1RSSU5HCQkyMAkvKiBhbGlhcyAqLworI2RlZmluZSBWX0FTTjFfVklERU9URVhTVFJJTkcJCTIxCS8qKi8KKyNkZWZpbmUgVl9BU04xX0lBNVNUUklORwkJMjIKKyNkZWZpbmUgVl9BU04xX1VUQ1RJTUUJCQkyMworI2RlZmluZSBWX0FTTjFfR0VORVJBTElaRURUSU1FCQkyNAkvKiovCisjZGVmaW5lIFZfQVNOMV9HUkFQSElDU1RSSU5HCQkyNQkvKiovCisjZGVmaW5lIFZfQVNOMV9JU082NFNUUklORwkJMjYJLyoqLworI2RlZmluZSBWX0FTTjFfVklTSUJMRVNUUklORwkJMjYJLyogYWxpYXMgKi8KKyNkZWZpbmUgVl9BU04xX0dFTkVSQUxTVFJJTkcJCTI3CS8qKi8KKyNkZWZpbmUgVl9BU04xX1VOSVZFUlNBTFNUUklORwkJMjgJLyoqLworI2RlZmluZSBWX0FTTjFfQk1QU1RSSU5HCQkzMAorCisvKiBGb3IgdXNlIHdpdGggZDJpX0FTTjFfdHlwZV9ieXRlcygpICovCisjZGVmaW5lIEJfQVNOMV9OVU1FUklDU1RSSU5HCTB4MDAwMQorI2RlZmluZSBCX0FTTjFfUFJJTlRBQkxFU1RSSU5HCTB4MDAwMgorI2RlZmluZSBCX0FTTjFfVDYxU1RSSU5HCTB4MDAwNAorI2RlZmluZSBCX0FTTjFfVEVMRVRFWFNUUklORwkweDAwMDQKKyNkZWZpbmUgQl9BU04xX1ZJREVPVEVYU1RSSU5HCTB4MDAwOAorI2RlZmluZSBCX0FTTjFfSUE1U1RSSU5HCTB4MDAxMAorI2RlZmluZSBCX0FTTjFfR1JBUEhJQ1NUUklORwkweDAwMjAKKyNkZWZpbmUgQl9BU04xX0lTTzY0U1RSSU5HCTB4MDA0MAorI2RlZmluZSBCX0FTTjFfVklTSUJMRVNUUklORwkweDAwNDAKKyNkZWZpbmUgQl9BU04xX0dFTkVSQUxTVFJJTkcJMHgwMDgwCisjZGVmaW5lIEJfQVNOMV9VTklWRVJTQUxTVFJJTkcJMHgwMTAwCisjZGVmaW5lIEJfQVNOMV9PQ1RFVF9TVFJJTkcJMHgwMjAwCisjZGVmaW5lIEJfQVNOMV9CSVRfU1RSSU5HCTB4MDQwMAorI2RlZmluZSBCX0FTTjFfQk1QU1RSSU5HCTB4MDgwMAorI2RlZmluZSBCX0FTTjFfVU5LTk9XTgkJMHgxMDAwCisjZGVmaW5lIEJfQVNOMV9VVEY4U1RSSU5HCTB4MjAwMAorI2RlZmluZSBCX0FTTjFfVVRDVElNRQkJMHg0MDAwCisjZGVmaW5lIEJfQVNOMV9HRU5FUkFMSVpFRFRJTUUJMHg4MDAwCisjZGVmaW5lIEJfQVNOMV9TRVFVRU5DRQkJMHgxMDAwMAorCisvKiBGb3IgdXNlIHdpdGggQVNOMV9tYnN0cmluZ19jb3B5KCkgKi8KKyNkZWZpbmUgTUJTVFJJTkdfRkxBRwkJMHgxMDAwCisjZGVmaW5lIE1CU1RSSU5HX1VURjgJCShNQlNUUklOR19GTEFHKQorI2RlZmluZSBNQlNUUklOR19BU0MJCShNQlNUUklOR19GTEFHfDEpCisjZGVmaW5lIE1CU1RSSU5HX0JNUAkJKE1CU1RSSU5HX0ZMQUd8MikKKyNkZWZpbmUgTUJTVFJJTkdfVU5JVgkJKE1CU1RSSU5HX0ZMQUd8NCkKKworI2RlZmluZSBTTUlNRV9PTERNSU1FCQkweDQwMAorI2RlZmluZSBTTUlNRV9DUkxGRU9MCQkweDgwMAorI2RlZmluZSBTTUlNRV9TVFJFQU0JCTB4MTAwMAorCitzdHJ1Y3QgWDUwOV9hbGdvcl9zdDsKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9BTEdPUikKKworI2RlZmluZSBERUNMQVJFX0FTTjFfU0VUX09GKHR5cGUpIC8qIGZpbGxlZCBpbiBieSBta3N0YWNrLnBsICovCisjZGVmaW5lIElNUExFTUVOVF9BU04xX1NFVF9PRih0eXBlKSAvKiBub3RoaW5nLCBubyBsb25nZXIgbmVlZGVkICovCisKKy8qIFdlIE1VU1QgbWFrZSBzdXJlIHRoYXQsIGV4Y2VwdCBmb3IgY29uc3RuZXNzLCBhc24xX2N0eF9zdCBhbmQKKyAgIGFzbjFfY29uc3RfY3R4IGFyZSBleGFjdGx5IHRoZSBzYW1lLiAgRm9ydHVuYXRlbHksIGFzIHNvb24gYXMKKyAgIHRoZSBvbGQgQVNOMSBwYXJzaW5nIG1hY3JvcyBhcmUgZ29uZSwgd2UgY2FuIHRocm93IHRoaXMgYXdheQorICAgYXMgd2VsbC4uLiAqLwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9jdHhfc3QKKwl7CisJdW5zaWduZWQgY2hhciAqcDsvKiB3b3JrIGNoYXIgcG9pbnRlciAqLworCWludCBlb3M7CS8qIGVuZCBvZiBzZXF1ZW5jZSByZWFkIGZvciBpbmRlZmluaXRlIGVuY29kaW5nICovCisJaW50IGVycm9yOwkvKiBlcnJvciBjb2RlIHRvIHVzZSB3aGVuIHJldHVybmluZyBhbiBlcnJvciAqLworCWludCBpbmY7CS8qIGNvbnN0cnVjdGVkIGlmIDB4MjAsIGluZGVmaW5pdGUgaXMgMHgyMSAqLworCWludCB0YWc7CS8qIHRhZyBmcm9tIGxhc3QgJ2dldCBvYmplY3QnICovCisJaW50IHhjbGFzczsJLyogY2xhc3MgZnJvbSBsYXN0ICdnZXQgb2JqZWN0JyAqLworCWxvbmcgc2xlbjsJLyogbGVuZ3RoIG9mIGxhc3QgJ2dldCBvYmplY3QnICovCisJdW5zaWduZWQgY2hhciAqbWF4OyAvKiBsYXJnZXN0IHZhbHVlIG9mIHAgYWxsb3dlZCAqLworCXVuc2lnbmVkIGNoYXIgKnE7LyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCisJdW5zaWduZWQgY2hhciAqKnBwOy8qIHZhcmlhYmxlICovCisJaW50IGxpbmU7CS8qIHVzZWQgaW4gZXJyb3IgcHJvY2Vzc2luZyAqLworCX0gQVNOMV9DVFg7CisKK3R5cGVkZWYgc3RydWN0IGFzbjFfY29uc3RfY3R4X3N0CisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7Lyogd29yayBjaGFyIHBvaW50ZXIgKi8KKwlpbnQgZW9zOwkvKiBlbmQgb2Ygc2VxdWVuY2UgcmVhZCBmb3IgaW5kZWZpbml0ZSBlbmNvZGluZyAqLworCWludCBlcnJvcjsJLyogZXJyb3IgY29kZSB0byB1c2Ugd2hlbiByZXR1cm5pbmcgYW4gZXJyb3IgKi8KKwlpbnQgaW5mOwkvKiBjb25zdHJ1Y3RlZCBpZiAweDIwLCBpbmRlZmluaXRlIGlzIDB4MjEgKi8KKwlpbnQgdGFnOwkvKiB0YWcgZnJvbSBsYXN0ICdnZXQgb2JqZWN0JyAqLworCWludCB4Y2xhc3M7CS8qIGNsYXNzIGZyb20gbGFzdCAnZ2V0IG9iamVjdCcgKi8KKwlsb25nIHNsZW47CS8qIGxlbmd0aCBvZiBsYXN0ICdnZXQgb2JqZWN0JyAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1heDsgLyogbGFyZ2VzdCB2YWx1ZSBvZiBwIGFsbG93ZWQgKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyICpxOy8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcDsvKiB2YXJpYWJsZSAqLworCWludCBsaW5lOwkvKiB1c2VkIGluIGVycm9yIHByb2Nlc3NpbmcgKi8KKwl9IEFTTjFfY29uc3RfQ1RYOworCisvKiBUaGVzZSBhcmUgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBBU04xX09CSkVDVCB0byBrZWVwIHRyYWNrIG9mCisgKiB3aGV0aGVyIHRoZSBuYW1lcyBhbmQgZGF0YSBuZWVkIHRvIGJlIGZyZWUoKWVkICovCisjZGVmaW5lIEFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQwkgMHgwMQkvKiBpbnRlcm5hbCB1c2UgKi8KKyNkZWZpbmUgQVNOMV9PQkpFQ1RfRkxBR19DUklUSUNBTAkgMHgwMgkvKiBjcml0aWNhbCB4NTA5djMgb2JqZWN0IGlkICovCisjZGVmaW5lIEFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQ19TVFJJTkdTIDB4MDQJLyogaW50ZXJuYWwgdXNlICovCisjZGVmaW5lIEFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQ19EQVRBIAkgMHgwOAkvKiBpbnRlcm5hbCB1c2UgKi8KK3R5cGVkZWYgc3RydWN0IGFzbjFfb2JqZWN0X3N0CisJeworCWNvbnN0IGNoYXIgKnNuLCpsbjsKKwlpbnQgbmlkOworCWludCBsZW5ndGg7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsJLyogZGF0YSByZW1haW5zIGNvbnN0IGFmdGVyIGluaXQgKi8KKwlpbnQgZmxhZ3M7CS8qIFNob3VsZCB3ZSBmcmVlIHRoaXMgb25lICovCisJfSBBU04xX09CSkVDVDsKKworI2RlZmluZSBBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVCAweDA4IC8qIFNldCBpZiAweDA3IGhhcyBiaXRzIGxlZnQgdmFsdWUgKi8KKy8qIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIEFTTjFfU1RSSU5HIGlzIG5vdCBhIHJlYWwgdmFsdWUgYnV0IGp1c3QgYSBwbGFjZQorICogaG9sZGVyIGZvciB0aGUgbG9jYXRpb24gd2hlcmUgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZGF0YSBzaG91bGQKKyAqIGJlIGluc2VydGVkIGluIHRoZSBtZW1vcnkgYnVmZmVyIAorICovCisjZGVmaW5lIEFTTjFfU1RSSU5HX0ZMQUdfTkRFRiAweDAxMCAKKworLyogVGhpcyBmbGFnIGlzIHVzZWQgYnkgdGhlIENNUyBjb2RlIHRvIGluZGljYXRlIHRoYXQgYSBzdHJpbmcgaXMgbm90CisgKiBjb21wbGV0ZSBhbmQgaXMgYSBwbGFjZSBob2xkZXIgZm9yIGNvbnRlbnQgd2hlbiBpdCBoYWQgYWxsIGJlZW4gCisgKiBhY2Nlc3NlZC4gVGhlIGZsYWcgd2lsbCBiZSByZXNldCB3aGVuIGNvbnRlbnQgaGFzIGJlZW4gd3JpdHRlbiB0byBpdC4KKyAqLworCisjZGVmaW5lIEFTTjFfU1RSSU5HX0ZMQUdfQ09OVCAweDAyMCAKKy8qIFRoaXMgZmxhZyBpcyB1c2VkIGJ5IEFTTjEgY29kZSB0byBpbmRpY2F0ZSBhbiBBU04xX1NUUklORyBpcyBhbiBNU1RSSU5HCisgKiB0eXBlLgorICovCisjZGVmaW5lIEFTTjFfU1RSSU5HX0ZMQUdfTVNUUklORyAweDA0MCAKKy8qIFRoaXMgaXMgdGhlIGJhc2UgdHlwZSB0aGF0IGhvbGRzIGp1c3QgYWJvdXQgZXZlcnl0aGluZyA6LSkgKi8KK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0CisJeworCWludCBsZW5ndGg7CisJaW50IHR5cGU7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkvKiBUaGUgdmFsdWUgb2YgdGhlIGZvbGxvd2luZyBmaWVsZCBkZXBlbmRzIG9uIHRoZSB0eXBlIGJlaW5nCisJICogaGVsZC4gIEl0IGlzIG1vc3RseSBiZWluZyB1c2VkIGZvciBCSVRfU1RSSU5HIHNvIGlmIHRoZQorCSAqIGlucHV0IGRhdGEgaGFzIGEgbm9uLXplcm8gJ3VudXNlZCBiaXRzJyB2YWx1ZSwgaXQgd2lsbCBiZQorCSAqIGhhbmRsZWQgY29ycmVjdGx5ICovCisJbG9uZyBmbGFnczsKKwl9IEFTTjFfU1RSSU5HOworCisvKiBBU04xX0VOQ09ESU5HIHN0cnVjdHVyZTogdGhpcyBpcyB1c2VkIHRvIHNhdmUgdGhlIHJlY2VpdmVkCisgKiBlbmNvZGluZyBvZiBhbiBBU04xIHR5cGUuIFRoaXMgaXMgdXNlZnVsIHRvIGdldCByb3VuZAorICogcHJvYmxlbXMgd2l0aCBpbnZhbGlkIGVuY29kaW5ncyB3aGljaCBjYW4gYnJlYWsgc2lnbmF0dXJlcy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBBU04xX0VOQ09ESU5HX3N0CisJeworCXVuc2lnbmVkIGNoYXIgKmVuYzsJLyogREVSIGVuY29kaW5nICovCisJbG9uZyBsZW47CQkvKiBMZW5ndGggb2YgZW5jb2RpbmcgKi8KKwlpbnQgbW9kaWZpZWQ7CQkgLyogc2V0IHRvIDEgaWYgJ2VuYycgaXMgaW52YWxpZCAqLworCX0gQVNOMV9FTkNPRElORzsKKworLyogVXNlZCB3aXRoIEFTTjEgTE9ORyB0eXBlOiBpZiBhIGxvbmcgaXMgc2V0IHRvIHRoaXMgaXQgaXMgb21pdHRlZCAqLworI2RlZmluZSBBU04xX0xPTkdfVU5ERUYJMHg3ZmZmZmZmZkwKKworI2RlZmluZSBTVEFCTEVfRkxBR1NfTUFMTE9DCTB4MDEKKyNkZWZpbmUgU1RBQkxFX05PX01BU0sJCTB4MDIKKyNkZWZpbmUgRElSU1RSSU5HX1RZUEUJXAorIChCX0FTTjFfUFJJTlRBQkxFU1RSSU5HfEJfQVNOMV9UNjFTVFJJTkd8Ql9BU04xX0JNUFNUUklOR3xCX0FTTjFfVVRGOFNUUklORykKKyNkZWZpbmUgUEtDUzlTVFJJTkdfVFlQRSAoRElSU1RSSU5HX1RZUEV8Ql9BU04xX0lBNVNUUklORykKKwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfdGFibGVfc3QgeworCWludCBuaWQ7CisJbG9uZyBtaW5zaXplOworCWxvbmcgbWF4c2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKK30gQVNOMV9TVFJJTkdfVEFCTEU7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoQVNOMV9TVFJJTkdfVEFCTEUpCisKKy8qIHNpemUgbGltaXRzOiB0aGlzIHN0dWZmIGlzIHRha2VuIHN0cmFpZ2h0IGZyb20gUkZDMjQ1OSAqLworCisjZGVmaW5lIHViX25hbWUJCQkJMzI3NjgKKyNkZWZpbmUgdWJfY29tbW9uX25hbWUJCQk2NAorI2RlZmluZSB1Yl9sb2NhbGl0eV9uYW1lCQkxMjgKKyNkZWZpbmUgdWJfc3RhdGVfbmFtZQkJCTEyOAorI2RlZmluZSB1Yl9vcmdhbml6YXRpb25fbmFtZQkJNjQKKyNkZWZpbmUgdWJfb3JnYW5pemF0aW9uX3VuaXRfbmFtZQk2NAorI2RlZmluZSB1Yl90aXRsZQkJCTY0CisjZGVmaW5lIHViX2VtYWlsX2FkZHJlc3MJCTEyOAorCisvKiBEZWNsYXJhdGlvbnMgZm9yIHRlbXBsYXRlIHN0cnVjdHVyZXM6IGZvciBmdWxsIGRlZmluaXRpb25zCisgKiBzZWUgYXNuMXQuaAorICovCit0eXBlZGVmIHN0cnVjdCBBU04xX1RFTVBMQVRFX3N0IEFTTjFfVEVNUExBVEU7Cit0eXBlZGVmIHN0cnVjdCBBU04xX0lURU1fc3QgQVNOMV9JVEVNOwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9UTENfc3QgQVNOMV9UTEM7CisvKiBUaGlzIGlzIGp1c3QgYW4gb3BhcXVlIHBvaW50ZXIgKi8KK3R5cGVkZWYgc3RydWN0IEFTTjFfVkFMVUVfc3QgQVNOMV9WQUxVRTsKKworLyogRGVjbGFyZSBBU04xIGZ1bmN0aW9uczogdGhlIGltcGxlbWVudCBtYWNybyBpbiBpbiBhc24xdC5oICovCisKKyNkZWZpbmUgREVDTEFSRV9BU04xX0ZVTkNUSU9OUyh0eXBlKSBERUNMQVJFX0FTTjFfRlVOQ1RJT05TX25hbWUodHlwZSwgdHlwZSkKKworI2RlZmluZSBERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TKHR5cGUpIFwKKwlERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TX25hbWUodHlwZSwgdHlwZSkKKworI2RlZmluZSBERUNMQVJFX0FTTjFfRlVOQ1RJT05TX25hbWUodHlwZSwgbmFtZSkgXAorCURFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlNfbmFtZSh0eXBlLCBuYW1lKSBcCisJREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlModHlwZSwgbmFtZSwgbmFtZSkKKworI2RlZmluZSBERUNMQVJFX0FTTjFfRlVOQ1RJT05TX2ZuYW1lKHR5cGUsIGl0bmFtZSwgbmFtZSkgXAorCURFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlNfbmFtZSh0eXBlLCBuYW1lKSBcCisJREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlModHlwZSwgaXRuYW1lLCBuYW1lKQorCisjZGVmaW5lCURFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TKHR5cGUsIGl0bmFtZSwgbmFtZSkgXAorCXR5cGUgKmQyaV8jI25hbWUodHlwZSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4pOyBcCisJaW50IGkyZF8jI25hbWUodHlwZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCk7IFwKKwlERUNMQVJFX0FTTjFfSVRFTShpdG5hbWUpCisKKyNkZWZpbmUJREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3QodHlwZSwgbmFtZSkgXAorCXR5cGUgKmQyaV8jI25hbWUodHlwZSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4pOyBcCisJaW50IGkyZF8jI25hbWUoY29uc3QgdHlwZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCk7IFwKKwlERUNMQVJFX0FTTjFfSVRFTShuYW1lKQorCisjZGVmaW5lCURFQ0xBUkVfQVNOMV9OREVGX0ZVTkNUSU9OKG5hbWUpIFwKKwlpbnQgaTJkXyMjbmFtZSMjX05ERUYobmFtZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCk7CisKKyNkZWZpbmUgREVDTEFSRV9BU04xX0ZVTkNUSU9OU19jb25zdChuYW1lKSBcCisJREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OUyhuYW1lKSBcCisJREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3QobmFtZSwgbmFtZSkKKworI2RlZmluZSBERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TX25hbWUodHlwZSwgbmFtZSkgXAorCXR5cGUgKm5hbWUjI19uZXcodm9pZCk7IFwKKwl2b2lkIG5hbWUjI19mcmVlKHR5cGUgKmEpOworCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9QUklOVF9GVU5DVElPTihzdG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfUFJJTlRfRlVOQ1RJT05fZm5hbWUoc3RuYW1lLCBzdG5hbWUpCisKKyNkZWZpbmUgREVDTEFSRV9BU04xX1BSSU5UX0ZVTkNUSU9OX2ZuYW1lKHN0bmFtZSwgZm5hbWUpIFwKKwlpbnQgZm5hbWUjI19wcmludF9jdHgoQklPICpvdXQsIHN0bmFtZSAqeCwgaW50IGluZGVudCwgXAorCQkJCQkgY29uc3QgQVNOMV9QQ1RYICpwY3R4KTsKKworI2RlZmluZSBEMklfT0YodHlwZSkgdHlwZSAqKCopKHR5cGUgKiosY29uc3QgdW5zaWduZWQgY2hhciAqKixsb25nKQorI2RlZmluZSBJMkRfT0YodHlwZSkgaW50ICgqKSh0eXBlICosdW5zaWduZWQgY2hhciAqKikKKyNkZWZpbmUgSTJEX09GX2NvbnN0KHR5cGUpIGludCAoKikoY29uc3QgdHlwZSAqLHVuc2lnbmVkIGNoYXIgKiopCisKKyNkZWZpbmUgQ0hFQ0tFRF9EMklfT0YodHlwZSwgZDJpKSBcCisgICAgKChkMmlfb2Zfdm9pZCopICgxID8gZDJpIDogKChEMklfT0YodHlwZSkpMCkpKQorI2RlZmluZSBDSEVDS0VEX0kyRF9PRih0eXBlLCBpMmQpIFwKKyAgICAoKGkyZF9vZl92b2lkKikgKDEgPyBpMmQgOiAoKEkyRF9PRih0eXBlKSkwKSkpCisjZGVmaW5lIENIRUNLRURfTkVXX09GKHR5cGUsIHhuZXcpIFwKKyAgICAoKHZvaWQgKigqKSh2b2lkKSkgKDEgPyB4bmV3IDogKCh0eXBlICooKikodm9pZCkpMCkpKQorI2RlZmluZSBDSEVDS0VEX1BUUl9PRih0eXBlLCBwKSBcCisgICAgKCh2b2lkKikgKDEgPyBwIDogKHR5cGUqKTApKQorI2RlZmluZSBDSEVDS0VEX1BQVFJfT0YodHlwZSwgcCkgXAorICAgICgodm9pZCoqKSAoMSA/IHAgOiAodHlwZSoqKTApKQorCisjZGVmaW5lIFRZUEVERUZfRDJJX09GKHR5cGUpIHR5cGVkZWYgdHlwZSAqZDJpX29mXyMjdHlwZSh0eXBlICoqLGNvbnN0IHVuc2lnbmVkIGNoYXIgKiosbG9uZykKKyNkZWZpbmUgVFlQRURFRl9JMkRfT0YodHlwZSkgdHlwZWRlZiBpbnQgaTJkX29mXyMjdHlwZSh0eXBlICosdW5zaWduZWQgY2hhciAqKikKKyNkZWZpbmUgVFlQRURFRl9EMkkyRF9PRih0eXBlKSBUWVBFREVGX0QySV9PRih0eXBlKTsgVFlQRURFRl9JMkRfT0YodHlwZSkKKworVFlQRURFRl9EMkkyRF9PRih2b2lkKTsKKworLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYW5kIHR5cGVkZWZzIGFsbG93IGFuIEFTTjFfSVRFTQorICogdG8gYmUgZW1iZWRkZWQgaW4gYSBzdHJ1Y3R1cmUgYW5kIHJlZmVyZW5jZWQuIFNpbmNlCisgKiB0aGUgQVNOMV9JVEVNIHBvaW50ZXJzIG5lZWQgdG8gYmUgZ2xvYmFsbHkgYWNjZXNzaWJsZQorICogKHBvc3NpYmx5IGZyb20gc2hhcmVkIGxpYnJhcmllcykgdGhleSBtYXkgZXhpc3QgaW4KKyAqIGRpZmZlcmVudCBmb3Jtcy4gT24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBpdCB0aGUKKyAqIEFTTjFfSVRFTSBzdHJ1Y3R1cmUgaXRzZWxmIHdpbGwgYmUgZ2xvYmFsbHkgZXhwb3J0ZWQuCisgKiBPdGhlciBwbGF0Zm9ybXMgd2lsbCBleHBvcnQgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMKKyAqIGFuIEFTTjFfSVRFTSBwb2ludGVyLgorICoKKyAqIFRvIGhhbmRsZSBib3RoIGNhc2VzIHRyYW5zcGFyZW50bHkgdGhlIG1hY3JvcyBiZWxvdworICogc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBoYXJkIGNvZGluZyBhbiBBU04xX0lURU0KKyAqIHBvaW50ZXIgaW4gYSBzdHJ1Y3R1cmUuCisgKgorICogVGhlIHN0cnVjdHVyZSB3aWxsIGxvb2sgbGlrZSB0aGlzOgorICoKKyAqIHR5cGVkZWYgc3RydWN0IFNPTUVUSElOR19zdCB7CisgKiAgICAgIC4uLgorICogICAgICBBU04xX0lURU1fRVhQICppcHRyOworICogICAgICAuLi4KKyAqIH0gU09NRVRISU5HOyAKKyAqCisgKiBJdCB3b3VsZCBiZSBpbml0aWFsaXNlZCBhcyBlLmcuOgorICoKKyAqIFNPTUVUSElORyBzb21ldmFyID0gey4uLixBU04xX0lURU1fcmVmKFg1MDkpLC4uLn07CisgKgorICogYW5kIHRoZSBhY3R1YWwgcG9pbnRlciBleHRyYWN0ZWQgd2l0aDoKKyAqCisgKiBjb25zdCBBU04xX0lURU0gKml0ID0gQVNOMV9JVEVNX3B0cihzb21ldmFyLmlwdHIpOworICoKKyAqIEZpbmFsbHkgYW4gQVNOMV9JVEVNIHBvaW50ZXIgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGFuCisgKiBhcHByb3ByaWF0ZSByZWZlcmVuY2Ugd2l0aDogQVNOMV9JVEVNX3JwdHIoWDUwOSkuIFRoaXMKKyAqIHdvdWxkIGJlIHVzZWQgd2hlbiBhIGZ1bmN0aW9uIHRha2VzIGFuIEFTTjFfSVRFTSAqIGFyZ3VtZW50LgorICoKKyAqLworCisjaWZuZGVmIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTgorCisvKiBBU04xX0lURU0gcG9pbnRlciBleHBvcnRlZCB0eXBlICovCit0eXBlZGVmIGNvbnN0IEFTTjFfSVRFTSBBU04xX0lURU1fRVhQOworCisvKiBNYWNybyB0byBvYnRhaW4gQVNOMV9JVEVNIHBvaW50ZXIgZnJvbSBleHBvcnRlZCB0eXBlICovCisjZGVmaW5lIEFTTjFfSVRFTV9wdHIoaXB0cikgKGlwdHIpCisKKy8qIE1hY3JvIHRvIGluY2x1ZGUgQVNOMV9JVEVNIHBvaW50ZXIgZnJvbSBiYXNlIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9JVEVNX3JlZihpcHRyKSAoJihpcHRyIyNfaXQpKQorCisjZGVmaW5lIEFTTjFfSVRFTV9ycHRyKHJlZikgKCYocmVmIyNfaXQpKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9JVEVNKG5hbWUpIFwKKwlPUEVOU1NMX0VYVEVSTiBjb25zdCBBU04xX0lURU0gbmFtZSMjX2l0OworCisjZWxzZQorCisvKiBQbGF0Zm9ybXMgdGhhdCBjYW4ndCBlYXNpbHkgaGFuZGxlIHNoYXJlZCBnbG9iYWwgdmFyaWFibGVzIGFyZSBkZWNsYXJlZAorICogYXMgZnVuY3Rpb25zIHJldHVybmluZyBBU04xX0lURU0gcG9pbnRlcnMuCisgKi8KKworLyogQVNOMV9JVEVNIHBvaW50ZXIgZXhwb3J0ZWQgdHlwZSAqLwordHlwZWRlZiBjb25zdCBBU04xX0lURU0gKiBBU04xX0lURU1fRVhQKHZvaWQpOworCisvKiBNYWNybyB0byBvYnRhaW4gQVNOMV9JVEVNIHBvaW50ZXIgZnJvbSBleHBvcnRlZCB0eXBlICovCisjZGVmaW5lIEFTTjFfSVRFTV9wdHIoaXB0cikgKGlwdHIoKSkKKworLyogTWFjcm8gdG8gaW5jbHVkZSBBU04xX0lURU0gcG9pbnRlciBmcm9tIGJhc2UgdHlwZSAqLworI2RlZmluZSBBU04xX0lURU1fcmVmKGlwdHIpIChpcHRyIyNfaXQpCisKKyNkZWZpbmUgQVNOMV9JVEVNX3JwdHIocmVmKSAocmVmIyNfaXQoKSkKKworI2RlZmluZSBERUNMQVJFX0FTTjFfSVRFTShuYW1lKSBcCisJY29uc3QgQVNOMV9JVEVNICogbmFtZSMjX2l0KHZvaWQpOworCisjZW5kaWYKKworLyogUGFyYW1ldGVycyB1c2VkIGJ5IEFTTjFfU1RSSU5HX3ByaW50X2V4KCkgKi8KKworLyogVGhlc2UgZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMgdG8gZXNjYXBlOgorICogUkZDMjI1MyBzcGVjaWFsIGNoYXJhY3RlcnMsIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQKKyAqIE1TQiBzZXQgY2hhcmFjdGVycworICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0VTQ18yMjUzCQkxCisjZGVmaW5lIEFTTjFfU1RSRkxHU19FU0NfQ1RSTAkJMgorI2RlZmluZSBBU04xX1NUUkZMR1NfRVNDX01TQgkJNAorCisKKy8qIFRoaXMgZmxhZyBkZXRlcm1pbmVzIGhvdyB3ZSBkbyBlc2NhcGluZzogbm9ybWFsbHkKKyAqIFJDMjI1MyBiYWNrc2xhc2ggb25seSwgc2V0IHRoaXMgdG8gdXNlIGJhY2tzbGFzaCBhbmQKKyAqIHF1b3RlLgorICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0VTQ19RVU9URQkJOAorCisKKy8qIFRoZXNlIHRocmVlIGZsYWdzIGFyZSBpbnRlcm5hbCB1c2Ugb25seS4gKi8KKworLyogQ2hhcmFjdGVyIGlzIGEgdmFsaWQgUHJpbnRhYmxlU3RyaW5nIGNoYXJhY3RlciAqLworI2RlZmluZSBDSEFSVFlQRV9QUklOVEFCTEVTVFJJTkcJMHgxMAorLyogQ2hhcmFjdGVyIG5lZWRzIGVzY2FwaW5nIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ0hBUlRZUEVfRklSU1RfRVNDXzIyNTMJCTB4MjAKKy8qIENoYXJhY3RlciBuZWVkcyBlc2NhcGluZyBpZiBpdCBpcyB0aGUgbGFzdCBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ0hBUlRZUEVfTEFTVF9FU0NfMjI1MwkJMHg0MAorCisvKiBOQiB0aGUgaW50ZXJuYWwgZmxhZ3MgYXJlIHNhZmVseSByZXVzZWQgYmVsb3cgYnkgZmxhZ3MKKyAqIGhhbmRsZWQgYXQgdGhlIHRvcCBsZXZlbC4KKyAqLworCisvKiBJZiB0aGlzIGlzIHNldCB3ZSBjb252ZXJ0IGFsbCBjaGFyYWN0ZXIgc3RyaW5ncworICogdG8gVVRGOCBmaXJzdCAKKyAqLworCisjZGVmaW5lIEFTTjFfU1RSRkxHU19VVEY4X0NPTlZFUlQJMHgxMAorCisvKiBJZiB0aGlzIGlzIHNldCB3ZSBkb24ndCBhdHRlbXB0IHRvIGludGVycHJldCBjb250ZW50OgorICoganVzdCBhc3N1bWUgYWxsIHN0cmluZ3MgYXJlIDEgYnl0ZSBwZXIgY2hhcmFjdGVyLiBUaGlzCisgKiB3aWxsIHByb2R1Y2Ugc29tZSBwcmV0dHkgb2RkIGxvb2tpbmcgb3V0cHV0IQorICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0lHTk9SRV9UWVBFCTB4MjAKKworLyogSWYgdGhpcyBpcyBzZXQgd2UgaW5jbHVkZSB0aGUgc3RyaW5nIHR5cGUgaW4gdGhlIG91dHB1dCAqLworI2RlZmluZSBBU04xX1NUUkZMR1NfU0hPV19UWVBFCQkweDQwCisKKy8qIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBzdHJpbmdzIHRvIGRpc3BsYXkgYW5kIHdoaWNoIHRvCisgKiAnZHVtcCcgKGhleCBkdW1wIG9mIGNvbnRlbnQgb2N0ZXRzIG9yIERFUiBlbmNvZGluZykuIFdlIGNhbgorICogb25seSBkdW1wIG5vbiBjaGFyYWN0ZXIgc3RyaW5ncyBvciBldmVyeXRoaW5nLiBJZiB3ZQorICogZG9uJ3QgZHVtcCAndW5rbm93bicgdGhleSBhcmUgaW50ZXJwcmV0ZWQgYXMgY2hhcmFjdGVyCisgKiBzdHJpbmdzIHdpdGggMSBvY3RldCBwZXIgY2hhcmFjdGVyIGFuZCBhcmUgc3ViamVjdCB0bworICogdGhlIHVzdWFsIGVzY2FwaW5nIG9wdGlvbnMuCisgKi8KKworI2RlZmluZSBBU04xX1NUUkZMR1NfRFVNUF9BTEwJCTB4ODAKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0RVTVBfVU5LTk9XTgkweDEwMAorCisvKiBUaGVzZSBkZXRlcm1pbmUgd2hhdCAnZHVtcGluZycgZG9lcywgd2UgY2FuIGR1bXAgdGhlCisgKiBjb250ZW50IG9jdGV0cyBvciB0aGUgREVSIGVuY29kaW5nOiBib3RoIHVzZSB0aGUKKyAqIFJGQzIyNTMgI1hYWFhYIG5vdGF0aW9uLgorICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0RVTVBfREVSCQkweDIwMAorCisvKiBBbGwgdGhlIHN0cmluZyBmbGFncyBjb25zaXN0ZW50IHdpdGggUkZDMjI1MywKKyAqIGVzY2FwaW5nIGNvbnRyb2wgY2hhcmFjdGVycyBpc24ndCBlc3NlbnRpYWwgaW4KKyAqIFJGQzIyNTMgYnV0IGl0IGlzIGFkdmlzYWJsZSBhbnl3YXkuCisgKi8KKworI2RlZmluZSBBU04xX1NUUkZMR1NfUkZDMjI1MwkoQVNOMV9TVFJGTEdTX0VTQ18yMjUzIHwgXAorCQkJCUFTTjFfU1RSRkxHU19FU0NfQ1RSTCB8IFwKKwkJCQlBU04xX1NUUkZMR1NfRVNDX01TQiB8IFwKKwkJCQlBU04xX1NUUkZMR1NfVVRGOF9DT05WRVJUIHwgXAorCQkJCUFTTjFfU1RSRkxHU19EVU1QX1VOS05PV04gfCBcCisJCQkJQVNOMV9TVFJGTEdTX0RVTVBfREVSKQorCitERUNMQVJFX1NUQUNLX09GKEFTTjFfSU5URUdFUikKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoQVNOMV9JTlRFR0VSKQorCitERUNMQVJFX1NUQUNLX09GKEFTTjFfR0VORVJBTFNUUklORykKKwordHlwZWRlZiBzdHJ1Y3QgYXNuMV90eXBlX3N0CisJeworCWludCB0eXBlOworCXVuaW9uCXsKKwkJY2hhciAqcHRyOworCQlBU04xX0JPT0xFQU4JCWJvb2xlYW47CisJCUFTTjFfU1RSSU5HICoJCWFzbjFfc3RyaW5nOworCQlBU04xX09CSkVDVCAqCQlvYmplY3Q7CisJCUFTTjFfSU5URUdFUiAqCQlpbnRlZ2VyOworCQlBU04xX0VOVU1FUkFURUQgKgllbnVtZXJhdGVkOworCQlBU04xX0JJVF9TVFJJTkcgKgliaXRfc3RyaW5nOworCQlBU04xX09DVEVUX1NUUklORyAqCW9jdGV0X3N0cmluZzsKKwkJQVNOMV9QUklOVEFCTEVTVFJJTkcgKglwcmludGFibGVzdHJpbmc7CisJCUFTTjFfVDYxU1RSSU5HICoJdDYxc3RyaW5nOworCQlBU04xX0lBNVNUUklORyAqCWlhNXN0cmluZzsKKwkJQVNOMV9HRU5FUkFMU1RSSU5HICoJZ2VuZXJhbHN0cmluZzsKKwkJQVNOMV9CTVBTVFJJTkcgKglibXBzdHJpbmc7CisJCUFTTjFfVU5JVkVSU0FMU1RSSU5HICoJdW5pdmVyc2Fsc3RyaW5nOworCQlBU04xX1VUQ1RJTUUgKgkJdXRjdGltZTsKKwkJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKglnZW5lcmFsaXplZHRpbWU7CisJCUFTTjFfVklTSUJMRVNUUklORyAqCXZpc2libGVzdHJpbmc7CisJCUFTTjFfVVRGOFNUUklORyAqCXV0ZjhzdHJpbmc7CisJCS8qIHNldCBhbmQgc2VxdWVuY2UgYXJlIGxlZnQgY29tcGxldGUgYW5kIHN0aWxsCisJCSAqIGNvbnRhaW4gdGhlIHNldCBvciBzZXF1ZW5jZSBieXRlcyAqLworCQlBU04xX1NUUklORyAqCQlzZXQ7CisJCUFTTjFfU1RSSU5HICoJCXNlcXVlbmNlOworCQlBU04xX1ZBTFVFICoJCWFzbjFfdmFsdWU7CisJCX0gdmFsdWU7CisJfSBBU04xX1RZUEU7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoQVNOMV9UWVBFKQorREVDTEFSRV9BU04xX1NFVF9PRihBU04xX1RZUEUpCisKK3R5cGVkZWYgU1RBQ0tfT0YoQVNOMV9UWVBFKSBBU04xX1NFUVVFTkNFX0FOWTsKKworREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3QoQVNOMV9TRVFVRU5DRV9BTlksIEFTTjFfU0VRVUVOQ0VfQU5ZKQorREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3QoQVNOMV9TRVFVRU5DRV9BTlksIEFTTjFfU0VUX0FOWSkKKwordHlwZWRlZiBzdHJ1Y3QgTkVUU0NBUEVfWDUwOV9zdAorCXsKKwlBU04xX09DVEVUX1NUUklORyAqaGVhZGVyOworCVg1MDkgKmNlcnQ7CisJfSBORVRTQ0FQRV9YNTA5OworCisvKiBUaGlzIGlzIHVzZWQgdG8gY29udGFpbiBhIGxpc3Qgb2YgYml0IG5hbWVzICovCit0eXBlZGVmIHN0cnVjdCBCSVRfU1RSSU5HX0JJVE5BTUVfc3QgeworCWludCBiaXRudW07CisJY29uc3QgY2hhciAqbG5hbWU7CisJY29uc3QgY2hhciAqc25hbWU7Cit9IEJJVF9TVFJJTkdfQklUTkFNRTsKKworCisjZGVmaW5lIE1fQVNOMV9TVFJJTkdfbGVuZ3RoKHgpCSgoeCktPmxlbmd0aCkKKyNkZWZpbmUgTV9BU04xX1NUUklOR19sZW5ndGhfc2V0KHgsIG4pCSgoeCktPmxlbmd0aCA9IChuKSkKKyNkZWZpbmUgTV9BU04xX1NUUklOR190eXBlKHgpCSgoeCktPnR5cGUpCisjZGVmaW5lIE1fQVNOMV9TVFJJTkdfZGF0YSh4KQkoKHgpLT5kYXRhKQorCisvKiBNYWNyb3MgZm9yIHN0cmluZyBvcGVyYXRpb25zICovCisjZGVmaW5lIE1fQVNOMV9CSVRfU1RSSU5HX25ldygpCShBU04xX0JJVF9TVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9CSVRfU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfQklUX1NUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX0JJVF9TVFJJTkdfZHVwKGEpIChBU04xX0JJVF9TVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX2R1cCgoY29uc3QgQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfQklUX1NUUklOR19jbXAoYSxiKSBBU04xX1NUUklOR19jbXAoXAorCQkoY29uc3QgQVNOMV9TVFJJTkcgKilhLChjb25zdCBBU04xX1NUUklORyAqKWIpCisjZGVmaW5lIE1fQVNOMV9CSVRfU1RSSU5HX3NldChhLGIsYykgQVNOMV9TVFJJTkdfc2V0KChBU04xX1NUUklORyAqKWEsYixjKQorCisjZGVmaW5lIE1fQVNOMV9JTlRFR0VSX25ldygpCShBU04xX0lOVEVHRVIgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9JTlRFR0VSKQorI2RlZmluZSBNX0FTTjFfSU5URUdFUl9mcmVlKGEpCQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9JTlRFR0VSX2R1cChhKSAoQVNOMV9JTlRFR0VSICopXAorCQlBU04xX1NUUklOR19kdXAoKGNvbnN0IEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX0lOVEVHRVJfY21wKGEsYikJQVNOMV9TVFJJTkdfY21wKFwKKwkJKGNvbnN0IEFTTjFfU1RSSU5HICopYSwoY29uc3QgQVNOMV9TVFJJTkcgKiliKQorCisjZGVmaW5lIE1fQVNOMV9FTlVNRVJBVEVEX25ldygpCShBU04xX0VOVU1FUkFURUQgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9FTlVNRVJBVEVEKQorI2RlZmluZSBNX0FTTjFfRU5VTUVSQVRFRF9mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX0VOVU1FUkFURURfZHVwKGEpIChBU04xX0VOVU1FUkFURUQgKilcCisJCUFTTjFfU1RSSU5HX2R1cCgoY29uc3QgQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfRU5VTUVSQVRFRF9jbXAoYSxiKQlBU04xX1NUUklOR19jbXAoXAorCQkoY29uc3QgQVNOMV9TVFJJTkcgKilhLChjb25zdCBBU04xX1NUUklORyAqKWIpCisKKyNkZWZpbmUgTV9BU04xX09DVEVUX1NUUklOR19uZXcoKQkoQVNOMV9PQ1RFVF9TVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9PQ1RFVF9TVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9PQ1RFVF9TVFJJTkdfZHVwKGEpIChBU04xX09DVEVUX1NUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGEsYikgQVNOMV9TVFJJTkdfY21wKFwKKwkJKGNvbnN0IEFTTjFfU1RSSU5HICopYSwoY29uc3QgQVNOMV9TVFJJTkcgKiliKQorI2RlZmluZSBNX0FTTjFfT0NURVRfU1RSSU5HX3NldChhLGIsYykJQVNOMV9TVFJJTkdfc2V0KChBU04xX1NUUklORyAqKWEsYixjKQorI2RlZmluZSBNX0FTTjFfT0NURVRfU1RSSU5HX3ByaW50KGEsYikJQVNOMV9TVFJJTkdfcHJpbnQoYSwoQVNOMV9TVFJJTkcgKiliKQorI2RlZmluZSBNX2kyZF9BU04xX09DVEVUX1NUUklORyhhLHBwKSBcCisJCWkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsVl9BU04xX09DVEVUX1NUUklORyxcCisJCVZfQVNOMV9VTklWRVJTQUwpCisKKyNkZWZpbmUgQl9BU04xX1RJTUUgXAorCQkJQl9BU04xX1VUQ1RJTUUgfCBcCisJCQlCX0FTTjFfR0VORVJBTElaRURUSU1FCisKKyNkZWZpbmUgQl9BU04xX1BSSU5UQUJMRSBcCisJCQlCX0FTTjFfTlVNRVJJQ1NUUklOR3wgXAorCQkJQl9BU04xX1BSSU5UQUJMRVNUUklOR3wgXAorCQkJQl9BU04xX1Q2MVNUUklOR3wgXAorCQkJQl9BU04xX0lBNVNUUklOR3wgXAorCQkJQl9BU04xX0JJVF9TVFJJTkd8IFwKKwkJCUJfQVNOMV9VTklWRVJTQUxTVFJJTkd8XAorCQkJQl9BU04xX0JNUFNUUklOR3xcCisJCQlCX0FTTjFfVVRGOFNUUklOR3xcCisJCQlCX0FTTjFfU0VRVUVOQ0V8XAorCQkJQl9BU04xX1VOS05PV04KKworI2RlZmluZSBCX0FTTjFfRElSRUNUT1JZU1RSSU5HIFwKKwkJCUJfQVNOMV9QUklOVEFCTEVTVFJJTkd8IFwKKwkJCUJfQVNOMV9URUxFVEVYU1RSSU5HfFwKKwkJCUJfQVNOMV9CTVBTVFJJTkd8XAorCQkJQl9BU04xX1VOSVZFUlNBTFNUUklOR3xcCisJCQlCX0FTTjFfVVRGOFNUUklORworCisjZGVmaW5lIEJfQVNOMV9ESVNQTEFZVEVYVCBcCisJCQlCX0FTTjFfSUE1U1RSSU5HfCBcCisJCQlCX0FTTjFfVklTSUJMRVNUUklOR3wgXAorCQkJQl9BU04xX0JNUFNUUklOR3xcCisJCQlCX0FTTjFfVVRGOFNUUklORworCisjZGVmaW5lIE1fQVNOMV9QUklOVEFCTEVfbmV3KCkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX1Q2MVNUUklORykKKyNkZWZpbmUgTV9BU04xX1BSSU5UQUJMRV9mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfQVNOMV9QUklOVEFCTEUoYSxwcCkgaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxcCisJCXBwLGEtPnR5cGUsVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9QUklOVEFCTEUoYSxwcCxsKSBcCisJCWQyaV9BU04xX3R5cGVfYnl0ZXMoKEFTTjFfU1RSSU5HICoqKWEscHAsbCwgXAorCQkJQl9BU04xX1BSSU5UQUJMRSkKKworI2RlZmluZSBNX0RJUkVDVE9SWVNUUklOR19uZXcoKSBBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfUFJJTlRBQkxFU1RSSU5HKQorI2RlZmluZSBNX0RJUkVDVE9SWVNUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfRElSRUNUT1JZU1RSSU5HKGEscHApIGkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEsXAorCQkJCQkJcHAsYS0+dHlwZSxWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9ESVJFQ1RPUllTVFJJTkcoYSxwcCxsKSBcCisJCWQyaV9BU04xX3R5cGVfYnl0ZXMoKEFTTjFfU1RSSU5HICoqKWEscHAsbCwgXAorCQkJQl9BU04xX0RJUkVDVE9SWVNUUklORykKKworI2RlZmluZSBNX0RJU1BMQVlURVhUX25ldygpIEFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9WSVNJQkxFU1RSSU5HKQorI2RlZmluZSBNX0RJU1BMQVlURVhUX2ZyZWUoYSkgQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9ESVNQTEFZVEVYVChhLHBwKSBpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLFwKKwkJCQkJCXBwLGEtPnR5cGUsVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfRElTUExBWVRFWFQoYSxwcCxsKSBcCisJCWQyaV9BU04xX3R5cGVfYnl0ZXMoKEFTTjFfU1RSSU5HICoqKWEscHAsbCwgXAorCQkJQl9BU04xX0RJU1BMQVlURVhUKQorCisjZGVmaW5lIE1fQVNOMV9QUklOVEFCTEVTVFJJTkdfbmV3KCkgKEFTTjFfUFJJTlRBQkxFU1RSSU5HICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfUFJJTlRBQkxFU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfUFJJTlRBQkxFU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX1BSSU5UQUJMRVNUUklORyhhLHBwKSBcCisJCWkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsVl9BU04xX1BSSU5UQUJMRVNUUklORyxcCisJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfUFJJTlRBQkxFU1RSSU5HKGEscHAsbCkgXAorCQkoQVNOMV9QUklOVEFCTEVTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzXAorCQkoKEFTTjFfU1RSSU5HICoqKWEscHAsbCxCX0FTTjFfUFJJTlRBQkxFU1RSSU5HKQorCisjZGVmaW5lIE1fQVNOMV9UNjFTVFJJTkdfbmV3KCkJKEFTTjFfVDYxU1RSSU5HICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVDYxU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfVDYxU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX1Q2MVNUUklORyhhLHBwKSBcCisJCWkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsVl9BU04xX1Q2MVNUUklORyxcCisJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfVDYxU1RSSU5HKGEscHAsbCkgXAorCQkoQVNOMV9UNjFTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzXAorCQkoKEFTTjFfU1RSSU5HICoqKWEscHAsbCxCX0FTTjFfVDYxU1RSSU5HKQorCisjZGVmaW5lIE1fQVNOMV9JQTVTVFJJTkdfbmV3KCkJKEFTTjFfSUE1U1RSSU5HICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfSUE1U1RSSU5HKQorI2RlZmluZSBNX0FTTjFfSUE1U1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfSUE1U1RSSU5HX2R1cChhKQlcCisJCShBU04xX0lBNVNUUklORyAqKUFTTjFfU1RSSU5HX2R1cCgoY29uc3QgQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX0lBNVNUUklORyhhLHBwKSBcCisJCWkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsVl9BU04xX0lBNVNUUklORyxcCisJCQlWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX0lBNVNUUklORyhhLHBwLGwpIFwKKwkJKEFTTjFfSUE1U1RSSU5HICopZDJpX0FTTjFfdHlwZV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsLFwKKwkJCUJfQVNOMV9JQTVTVFJJTkcpCisKKyNkZWZpbmUgTV9BU04xX1VUQ1RJTUVfbmV3KCkJKEFTTjFfVVRDVElNRSAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX1VUQ1RJTUUpCisjZGVmaW5lIE1fQVNOMV9VVENUSU1FX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfVVRDVElNRV9kdXAoYSkgKEFTTjFfVVRDVElNRSAqKVwKKwkJQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisKKyNkZWZpbmUgTV9BU04xX0dFTkVSQUxJWkVEVElNRV9uZXcoKQkoQVNOMV9HRU5FUkFMSVpFRFRJTUUgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUpCisjZGVmaW5lIE1fQVNOMV9HRU5FUkFMSVpFRFRJTUVfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9HRU5FUkFMSVpFRFRJTUVfZHVwKGEpIChBU04xX0dFTkVSQUxJWkVEVElNRSAqKUFTTjFfU1RSSU5HX2R1cChcCisJKGNvbnN0IEFTTjFfU1RSSU5HICopYSkKKworI2RlZmluZSBNX0FTTjFfVElNRV9uZXcoKQkoQVNOMV9USU1FICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVVRDVElNRSkKKyNkZWZpbmUgTV9BU04xX1RJTUVfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9USU1FX2R1cChhKSAoQVNOMV9USU1FICopXAorCUFTTjFfU1RSSU5HX2R1cCgoY29uc3QgQVNOMV9TVFJJTkcgKilhKQorCisjZGVmaW5lIE1fQVNOMV9HRU5FUkFMU1RSSU5HX25ldygpCShBU04xX0dFTkVSQUxTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9HRU5FUkFMU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfR0VORVJBTFNUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfQVNOMV9HRU5FUkFMU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfR0VORVJBTFNUUklORyxcCisJCQlWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX0dFTkVSQUxTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX0dFTkVSQUxTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzXAorCQkoKEFTTjFfU1RSSU5HICoqKWEscHAsbCxCX0FTTjFfR0VORVJBTFNUUklORykKKworI2RlZmluZSBNX0FTTjFfVU5JVkVSU0FMU1RSSU5HX25ldygpCShBU04xX1VOSVZFUlNBTFNUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX1VOSVZFUlNBTFNUUklORykKKyNkZWZpbmUgTV9BU04xX1VOSVZFUlNBTFNUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfQVNOMV9VTklWRVJTQUxTVFJJTkcoYSxwcCkgXAorCQlpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLFZfQVNOMV9VTklWRVJTQUxTVFJJTkcsXAorCQkJVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9VTklWRVJTQUxTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX1VOSVZFUlNBTFNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9VTklWRVJTQUxTVFJJTkcpCisKKyNkZWZpbmUgTV9BU04xX0JNUFNUUklOR19uZXcoKQkoQVNOMV9CTVBTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9CTVBTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9CTVBTVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0FTTjFfQk1QU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfQk1QU1RSSU5HLFwKKwkJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfQk1QU1RSSU5HKGEscHAsbCkgXAorCQkoQVNOMV9CTVBTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzXAorCQkoKEFTTjFfU1RSSU5HICoqKWEscHAsbCxCX0FTTjFfQk1QU1RSSU5HKQorCisjZGVmaW5lIE1fQVNOMV9WSVNJQkxFU1RSSU5HX25ldygpCShBU04xX1ZJU0lCTEVTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9WSVNJQkxFU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfVklTSUJMRVNUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfQVNOMV9WSVNJQkxFU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfVklTSUJMRVNUUklORyxcCisJCQlWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX1ZJU0lCTEVTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX1ZJU0lCTEVTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzXAorCQkoKEFTTjFfU1RSSU5HICoqKWEscHAsbCxCX0FTTjFfVklTSUJMRVNUUklORykKKworI2RlZmluZSBNX0FTTjFfVVRGOFNUUklOR19uZXcoKQkoQVNOMV9VVEY4U1RSSU5HICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVVRGOFNUUklORykKKyNkZWZpbmUgTV9BU04xX1VURjhTVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0FTTjFfVVRGOFNUUklORyhhLHBwKSBcCisJCWkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsVl9BU04xX1VURjhTVFJJTkcsXAorCQkJVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9VVEY4U1RSSU5HKGEscHAsbCkgXAorCQkoQVNOMV9VVEY4U1RSSU5HICopZDJpX0FTTjFfdHlwZV9ieXRlc1wKKwkJKChBU04xX1NUUklORyAqKilhLHBwLGwsQl9BU04xX1VURjhTVFJJTkcpCisKKyAgLyogZm9yIHRoZSBpc19zZXQgcGFyYW1ldGVyIHRvIGkyZF9BU04xX1NFVCAqLworI2RlZmluZSBJU19TRVFVRU5DRQkwCisjZGVmaW5lIElTX1NFVAkJMQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX2ZuYW1lKEFTTjFfVFlQRSwgQVNOMV9BTlksIEFTTjFfVFlQRSkKKworaW50IEFTTjFfVFlQRV9nZXQoQVNOMV9UWVBFICphKTsKK3ZvaWQgQVNOMV9UWVBFX3NldChBU04xX1RZUEUgKmEsIGludCB0eXBlLCB2b2lkICp2YWx1ZSk7CitpbnQgQVNOMV9UWVBFX3NldDEoQVNOMV9UWVBFICphLCBpbnQgdHlwZSwgY29uc3Qgdm9pZCAqdmFsdWUpOworaW50ICAgICAgICAgICAgQVNOMV9UWVBFX2NtcChBU04xX1RZUEUgKmEsIEFTTjFfVFlQRSAqYik7CisKK0FTTjFfT0JKRUNUICoJQVNOMV9PQkpFQ1RfbmV3KHZvaWQgKTsKK3ZvaWQJCUFTTjFfT0JKRUNUX2ZyZWUoQVNOMV9PQkpFQ1QgKmEpOworaW50CQlpMmRfQVNOMV9PQkpFQ1QoQVNOMV9PQkpFQ1QgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK0FTTjFfT0JKRUNUICoJYzJpX0FTTjFfT0JKRUNUKEFTTjFfT0JKRUNUICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CitBU04xX09CSkVDVCAqCWQyaV9BU04xX09CSkVDVChBU04xX09CSkVDVCAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJbG9uZyBsZW5ndGgpOworCitERUNMQVJFX0FTTjFfSVRFTShBU04xX09CSkVDVCkKKworREVDTEFSRV9TVEFDS19PRihBU04xX09CSkVDVCkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoQVNOMV9PQkpFQ1QpCisKK0FTTjFfU1RSSU5HICoJQVNOMV9TVFJJTkdfbmV3KHZvaWQpOwordm9pZAkJQVNOMV9TVFJJTkdfZnJlZShBU04xX1NUUklORyAqYSk7CitpbnQJCUFTTjFfU1RSSU5HX2NvcHkoQVNOMV9TVFJJTkcgKmRzdCwgY29uc3QgQVNOMV9TVFJJTkcgKnN0cik7CitBU04xX1NUUklORyAqCUFTTjFfU1RSSU5HX2R1cChjb25zdCBBU04xX1NUUklORyAqYSk7CitBU04xX1NUUklORyAqCUFTTjFfU1RSSU5HX3R5cGVfbmV3KGludCB0eXBlICk7CitpbnQgCQlBU04xX1NUUklOR19jbXAoY29uc3QgQVNOMV9TVFJJTkcgKmEsIGNvbnN0IEFTTjFfU1RSSU5HICpiKTsKKyAgLyogU2luY2UgdGhpcyBpcyB1c2VkIHRvIHN0b3JlIGFsbCBzb3J0cyBvZiB0aGluZ3MsIHZpYSBtYWNyb3MsIGZvciBub3csIG1ha2UKKyAgICAgaXRzIGRhdGEgdm9pZCAqICovCitpbnQgCQlBU04xX1NUUklOR19zZXQoQVNOMV9TVFJJTkcgKnN0ciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbik7Cit2b2lkCQlBU04xX1NUUklOR19zZXQwKEFTTjFfU1RSSU5HICpzdHIsIHZvaWQgKmRhdGEsIGludCBsZW4pOworaW50IEFTTjFfU1RSSU5HX2xlbmd0aChjb25zdCBBU04xX1NUUklORyAqeCk7Cit2b2lkIEFTTjFfU1RSSU5HX2xlbmd0aF9zZXQoQVNOMV9TVFJJTkcgKngsIGludCBuKTsKK2ludCBBU04xX1NUUklOR190eXBlKEFTTjFfU1RSSU5HICp4KTsKK3Vuc2lnbmVkIGNoYXIgKiBBU04xX1NUUklOR19kYXRhKEFTTjFfU1RSSU5HICp4KTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX0JJVF9TVFJJTkcpCitpbnQJCWkyY19BU04xX0JJVF9TVFJJTkcoQVNOMV9CSVRfU1RSSU5HICphLHVuc2lnbmVkIGNoYXIgKipwcCk7CitBU04xX0JJVF9TVFJJTkcgKmMyaV9BU04xX0JJVF9TVFJJTkcoQVNOMV9CSVRfU1RSSU5HICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CitpbnQJCUFTTjFfQklUX1NUUklOR19zZXQoQVNOMV9CSVRfU1RSSU5HICphLCB1bnNpZ25lZCBjaGFyICpkLAorCQkJaW50IGxlbmd0aCApOworaW50CQlBU04xX0JJVF9TVFJJTkdfc2V0X2JpdChBU04xX0JJVF9TVFJJTkcgKmEsIGludCBuLCBpbnQgdmFsdWUpOworaW50CQlBU04xX0JJVF9TVFJJTkdfZ2V0X2JpdChBU04xX0JJVF9TVFJJTkcgKmEsIGludCBuKTsKK2ludCAgICAgICAgICAgIEFTTjFfQklUX1NUUklOR19jaGVjayhBU04xX0JJVF9TVFJJTkcgKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZmxhZ3MsIGludCBmbGFnc19sZW4pOworCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCitpbnQgQVNOMV9CSVRfU1RSSU5HX25hbWVfcHJpbnQoQklPICpvdXQsIEFTTjFfQklUX1NUUklORyAqYnMsCisJCQkJQklUX1NUUklOR19CSVROQU1FICp0YmwsIGludCBpbmRlbnQpOworI2VuZGlmCitpbnQgQVNOMV9CSVRfU1RSSU5HX251bV9hc2MoY2hhciAqbmFtZSwgQklUX1NUUklOR19CSVROQU1FICp0YmwpOworaW50IEFTTjFfQklUX1NUUklOR19zZXRfYXNjKEFTTjFfQklUX1NUUklORyAqYnMsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKKwkJCQlCSVRfU1RSSU5HX0JJVE5BTUUgKnRibCk7CisKK2ludAkJaTJkX0FTTjFfQk9PTEVBTihpbnQgYSx1bnNpZ25lZCBjaGFyICoqcHApOworaW50IAkJZDJpX0FTTjFfQk9PTEVBTihpbnQgKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLGxvbmcgbGVuZ3RoKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX0lOVEVHRVIpCitpbnQJCWkyY19BU04xX0lOVEVHRVIoQVNOMV9JTlRFR0VSICphLHVuc2lnbmVkIGNoYXIgKipwcCk7CitBU04xX0lOVEVHRVIgKmMyaV9BU04xX0lOVEVHRVIoQVNOMV9JTlRFR0VSICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CitBU04xX0lOVEVHRVIgKmQyaV9BU04xX1VJTlRFR0VSKEFTTjFfSU5URUdFUiAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJbG9uZyBsZW5ndGgpOworQVNOMV9JTlRFR0VSICoJQVNOMV9JTlRFR0VSX2R1cChjb25zdCBBU04xX0lOVEVHRVIgKngpOworaW50IEFTTjFfSU5URUdFUl9jbXAoY29uc3QgQVNOMV9JTlRFR0VSICp4LCBjb25zdCBBU04xX0lOVEVHRVIgKnkpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfRU5VTUVSQVRFRCkKKworaW50IEFTTjFfVVRDVElNRV9jaGVjayhBU04xX1VUQ1RJTUUgKmEpOworQVNOMV9VVENUSU1FICpBU04xX1VUQ1RJTUVfc2V0KEFTTjFfVVRDVElNRSAqcyx0aW1lX3QgdCk7CitBU04xX1VUQ1RJTUUgKkFTTjFfVVRDVElNRV9hZGooQVNOMV9VVENUSU1FICpzLCB0aW1lX3QgdCwKKwkJCQlpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjKTsKK2ludCBBU04xX1VUQ1RJTUVfc2V0X3N0cmluZyhBU04xX1VUQ1RJTUUgKnMsIGNvbnN0IGNoYXIgKnN0cik7CitpbnQgQVNOMV9VVENUSU1FX2NtcF90aW1lX3QoY29uc3QgQVNOMV9VVENUSU1FICpzLCB0aW1lX3QgdCk7CisjaWYgMAordGltZV90IEFTTjFfVVRDVElNRV9nZXQoY29uc3QgQVNOMV9VVENUSU1FICpzKTsKKyNlbmRpZgorCitpbnQgQVNOMV9HRU5FUkFMSVpFRFRJTUVfY2hlY2soQVNOMV9HRU5FUkFMSVpFRFRJTUUgKmEpOworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKkFTTjFfR0VORVJBTElaRURUSU1FX3NldChBU04xX0dFTkVSQUxJWkVEVElNRSAqcyx0aW1lX3QgdCk7CitBU04xX0dFTkVSQUxJWkVEVElNRSAqQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqKEFTTjFfR0VORVJBTElaRURUSU1FICpzLAorCSAgICAgdGltZV90IHQsIGludCBvZmZzZXRfZGF5LCBsb25nIG9mZnNldF9zZWMpOworaW50IEFTTjFfR0VORVJBTElaRURUSU1FX3NldF9zdHJpbmcoQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnMsIGNvbnN0IGNoYXIgKnN0cik7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9PQ1RFVF9TVFJJTkcpCitBU04xX09DVEVUX1NUUklORyAqCUFTTjFfT0NURVRfU1RSSU5HX2R1cChjb25zdCBBU04xX09DVEVUX1NUUklORyAqYSk7CitpbnQgCUFTTjFfT0NURVRfU1RSSU5HX2NtcChjb25zdCBBU04xX09DVEVUX1NUUklORyAqYSwgY29uc3QgQVNOMV9PQ1RFVF9TVFJJTkcgKmIpOworaW50IAlBU04xX09DVEVUX1NUUklOR19zZXQoQVNOMV9PQ1RFVF9TVFJJTkcgKnN0ciwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbik7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9WSVNJQkxFU1RSSU5HKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX1VOSVZFUlNBTFNUUklORykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9VVEY4U1RSSU5HKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX05VTEwpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfQk1QU1RSSU5HKQorCitpbnQgVVRGOF9nZXRjKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IGxlbiwgdW5zaWduZWQgbG9uZyAqdmFsKTsKK2ludCBVVEY4X3B1dGModW5zaWduZWQgY2hhciAqc3RyLCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OU19uYW1lKEFTTjFfU1RSSU5HLCBBU04xX1BSSU5UQUJMRSkKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OU19uYW1lKEFTTjFfU1RSSU5HLCBESVJFQ1RPUllTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX25hbWUoQVNOMV9TVFJJTkcsIERJU1BMQVlURVhUKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX1BSSU5UQUJMRVNUUklORykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9UNjFTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfSUE1U1RSSU5HKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX0dFTkVSQUxTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfVVRDVElNRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9HRU5FUkFMSVpFRFRJTUUpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfVElNRSkKKworREVDTEFSRV9BU04xX0lURU0oQVNOMV9PQ1RFVF9TVFJJTkdfTkRFRikKKworQVNOMV9USU1FICpBU04xX1RJTUVfc2V0KEFTTjFfVElNRSAqcyx0aW1lX3QgdCk7CitBU04xX1RJTUUgKkFTTjFfVElNRV9hZGooQVNOMV9USU1FICpzLHRpbWVfdCB0LAorCQkJCWludCBvZmZzZXRfZGF5LCBsb25nIG9mZnNldF9zZWMpOworaW50IEFTTjFfVElNRV9jaGVjayhBU04xX1RJTUUgKnQpOworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKkFTTjFfVElNRV90b19nZW5lcmFsaXplZHRpbWUoQVNOMV9USU1FICp0LCBBU04xX0dFTkVSQUxJWkVEVElNRSAqKm91dCk7CitpbnQgQVNOMV9USU1FX3NldF9zdHJpbmcoQVNOMV9USU1FICpzLCBjb25zdCBjaGFyICpzdHIpOworCitpbnQgaTJkX0FTTjFfU0VUKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICphLCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCSBpMmRfb2Zfdm9pZCAqaTJkLCBpbnQgZXhfdGFnLCBpbnQgZXhfY2xhc3MsCisJCSBpbnQgaXNfc2V0KTsKK1NUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpkMmlfQVNOMV9TRVQoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiphLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJICAgICAgbG9uZyBsZW5ndGgsIGQyaV9vZl92b2lkICpkMmksCisJCQkgICAgICB2b2lkICgqZnJlZV9mdW5jKShPUEVOU1NMX0JMT0NLKSwgaW50IGV4X3RhZywKKwkJCSAgICAgIGludCBleF9jbGFzcyk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludCBpMmFfQVNOMV9JTlRFR0VSKEJJTyAqYnAsIEFTTjFfSU5URUdFUiAqYSk7CitpbnQgYTJpX0FTTjFfSU5URUdFUihCSU8gKmJwLEFTTjFfSU5URUdFUiAqYnMsY2hhciAqYnVmLGludCBzaXplKTsKK2ludCBpMmFfQVNOMV9FTlVNRVJBVEVEKEJJTyAqYnAsIEFTTjFfRU5VTUVSQVRFRCAqYSk7CitpbnQgYTJpX0FTTjFfRU5VTUVSQVRFRChCSU8gKmJwLEFTTjFfRU5VTUVSQVRFRCAqYnMsY2hhciAqYnVmLGludCBzaXplKTsKK2ludCBpMmFfQVNOMV9PQkpFQ1QoQklPICpicCxBU04xX09CSkVDVCAqYSk7CitpbnQgYTJpX0FTTjFfU1RSSU5HKEJJTyAqYnAsQVNOMV9TVFJJTkcgKmJzLGNoYXIgKmJ1ZixpbnQgc2l6ZSk7CitpbnQgaTJhX0FTTjFfU1RSSU5HKEJJTyAqYnAsIEFTTjFfU1RSSU5HICphLCBpbnQgdHlwZSk7CisjZW5kaWYKK2ludCBpMnRfQVNOMV9PQkpFQ1QoY2hhciAqYnVmLGludCBidWZfbGVuLEFTTjFfT0JKRUNUICphKTsKKworaW50IGEyZF9BU04xX09CSkVDVCh1bnNpZ25lZCBjaGFyICpvdXQsaW50IG9sZW4sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitBU04xX09CSkVDVCAqQVNOMV9PQkpFQ1RfY3JlYXRlKGludCBuaWQsIHVuc2lnbmVkIGNoYXIgKmRhdGEsaW50IGxlbiwKKwljb25zdCBjaGFyICpzbiwgY29uc3QgY2hhciAqbG4pOworCitpbnQgQVNOMV9JTlRFR0VSX3NldChBU04xX0lOVEVHRVIgKmEsIGxvbmcgdik7Citsb25nIEFTTjFfSU5URUdFUl9nZXQoY29uc3QgQVNOMV9JTlRFR0VSICphKTsKK0FTTjFfSU5URUdFUiAqQk5fdG9fQVNOMV9JTlRFR0VSKGNvbnN0IEJJR05VTSAqYm4sIEFTTjFfSU5URUdFUiAqYWkpOworQklHTlVNICpBU04xX0lOVEVHRVJfdG9fQk4oY29uc3QgQVNOMV9JTlRFR0VSICphaSxCSUdOVU0gKmJuKTsKKworaW50IEFTTjFfRU5VTUVSQVRFRF9zZXQoQVNOMV9FTlVNRVJBVEVEICphLCBsb25nIHYpOworbG9uZyBBU04xX0VOVU1FUkFURURfZ2V0KEFTTjFfRU5VTUVSQVRFRCAqYSk7CitBU04xX0VOVU1FUkFURUQgKkJOX3RvX0FTTjFfRU5VTUVSQVRFRChCSUdOVU0gKmJuLCBBU04xX0VOVU1FUkFURUQgKmFpKTsKK0JJR05VTSAqQVNOMV9FTlVNRVJBVEVEX3RvX0JOKEFTTjFfRU5VTUVSQVRFRCAqYWksQklHTlVNICpibik7CisKKy8qIEdlbmVyYWwgKi8KKy8qIGdpdmVuIGEgc3RyaW5nLCByZXR1cm4gdGhlIGNvcnJlY3QgdHlwZSwgbWF4IGlzIHRoZSBtYXhpbXVtIGxlbmd0aCAqLworaW50IEFTTjFfUFJJTlRBQkxFX3R5cGUoY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IG1heCk7CisKK2ludCBpMmRfQVNOMV9ieXRlcyhBU04xX1NUUklORyAqYSwgdW5zaWduZWQgY2hhciAqKnBwLCBpbnQgdGFnLCBpbnQgeGNsYXNzKTsKK0FTTjFfU1RSSU5HICpkMmlfQVNOMV9ieXRlcyhBU04xX1NUUklORyAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwlsb25nIGxlbmd0aCwgaW50IFB0YWcsIGludCBQY2xhc3MpOwordW5zaWduZWQgbG9uZyBBU04xX3RhZzJiaXQoaW50IHRhZyk7CisvKiB0eXBlIGlzIG9uZSBvciBtb3JlIG9mIHRoZSBCX0FTTjFfIHZhbHVlcy4gKi8KK0FTTjFfU1RSSU5HICpkMmlfQVNOMV90eXBlX2J5dGVzKEFTTjFfU1RSSU5HICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCWxvbmcgbGVuZ3RoLGludCB0eXBlKTsKKworLyogUEFSU0lORyAqLworaW50IGFzbjFfRmluaXNoKEFTTjFfQ1RYICpjKTsKK2ludCBhc24xX2NvbnN0X0ZpbmlzaChBU04xX2NvbnN0X0NUWCAqYyk7CisKKy8qIFNQRUNJQUxTICovCitpbnQgQVNOMV9nZXRfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyAqcGxlbmd0aCwgaW50ICpwdGFnLAorCWludCAqcGNsYXNzLCBsb25nIG9tYXgpOworaW50IEFTTjFfY2hlY2tfaW5maW5pdGVfZW5kKHVuc2lnbmVkIGNoYXIgKipwLGxvbmcgbGVuKTsKK2ludCBBU04xX2NvbnN0X2NoZWNrX2luZmluaXRlX2VuZChjb25zdCB1bnNpZ25lZCBjaGFyICoqcCxsb25nIGxlbik7Cit2b2lkIEFTTjFfcHV0X29iamVjdCh1bnNpZ25lZCBjaGFyICoqcHAsIGludCBjb25zdHJ1Y3RlZCwgaW50IGxlbmd0aCwKKwlpbnQgdGFnLCBpbnQgeGNsYXNzKTsKK2ludCBBU04xX3B1dF9lb2ModW5zaWduZWQgY2hhciAqKnBwKTsKK2ludCBBU04xX29iamVjdF9zaXplKGludCBjb25zdHJ1Y3RlZCwgaW50IGxlbmd0aCwgaW50IHRhZyk7CisKKy8qIFVzZWQgdG8gaW1wbGVtZW50IG90aGVyIGZ1bmN0aW9ucyAqLwordm9pZCAqQVNOMV9kdXAoaTJkX29mX3ZvaWQgKmkyZCwgZDJpX29mX3ZvaWQgKmQyaSwgdm9pZCAqeCk7CisKKyNkZWZpbmUgQVNOMV9kdXBfb2YodHlwZSxpMmQsZDJpLHgpIFwKKyAgICAoKHR5cGUqKUFTTjFfZHVwKENIRUNLRURfSTJEX09GKHR5cGUsIGkyZCksIFwKKwkJICAgICBDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpLCBcCisJCSAgICAgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgeCkpKQorCisjZGVmaW5lIEFTTjFfZHVwX29mX2NvbnN0KHR5cGUsaTJkLGQyaSx4KSBcCisgICAgKCh0eXBlKilBU04xX2R1cChDSEVDS0VEX0kyRF9PRihjb25zdCB0eXBlLCBpMmQpLCBcCisJCSAgICAgQ0hFQ0tFRF9EMklfT0YodHlwZSwgZDJpKSwgXAorCQkgICAgIENIRUNLRURfUFRSX09GKGNvbnN0IHR5cGUsIHgpKSkKKwordm9pZCAqQVNOMV9pdGVtX2R1cChjb25zdCBBU04xX0lURU0gKml0LCB2b2lkICp4KTsKKworLyogQVNOMSBhbGxvYy9mcmVlIG1hY3JvcyBmb3Igd2hlbiBhIHR5cGUgaXMgb25seSB1c2VkIGludGVybmFsbHkgKi8KKworI2RlZmluZSBNX0FTTjFfbmV3X29mKHR5cGUpICh0eXBlICopQVNOMV9pdGVtX25ldyhBU04xX0lURU1fcnB0cih0eXBlKSkKKyNkZWZpbmUgTV9BU04xX2ZyZWVfb2YoeCwgdHlwZSkgXAorCQlBU04xX2l0ZW1fZnJlZShDSEVDS0VEX1BUUl9PRih0eXBlLCB4KSwgQVNOMV9JVEVNX3JwdHIodHlwZSkpCisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK3ZvaWQgKkFTTjFfZDJpX2ZwKHZvaWQgKigqeG5ldykodm9pZCksIGQyaV9vZl92b2lkICpkMmksIEZJTEUgKmluLCB2b2lkICoqeCk7CisKKyNkZWZpbmUgQVNOMV9kMmlfZnBfb2YodHlwZSx4bmV3LGQyaSxpbix4KSBcCisgICAgKCh0eXBlKilBU04xX2QyaV9mcChDSEVDS0VEX05FV19PRih0eXBlLCB4bmV3KSwgXAorCQkJQ0hFQ0tFRF9EMklfT0YodHlwZSwgZDJpKSwgXAorCQkJaW4sIFwKKwkJCUNIRUNLRURfUFBUUl9PRih0eXBlLCB4KSkpCisKK3ZvaWQgKkFTTjFfaXRlbV9kMmlfZnAoY29uc3QgQVNOMV9JVEVNICppdCwgRklMRSAqaW4sIHZvaWQgKngpOworaW50IEFTTjFfaTJkX2ZwKGkyZF9vZl92b2lkICppMmQsRklMRSAqb3V0LHZvaWQgKngpOworCisjZGVmaW5lIEFTTjFfaTJkX2ZwX29mKHR5cGUsaTJkLG91dCx4KSBcCisgICAgKEFTTjFfaTJkX2ZwKENIRUNLRURfSTJEX09GKHR5cGUsIGkyZCksIFwKKwkJIG91dCwgXAorCQkgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgeCkpKQorCisjZGVmaW5lIEFTTjFfaTJkX2ZwX29mX2NvbnN0KHR5cGUsaTJkLG91dCx4KSBcCisgICAgKEFTTjFfaTJkX2ZwKENIRUNLRURfSTJEX09GKGNvbnN0IHR5cGUsIGkyZCksIFwKKwkJIG91dCwgXAorCQkgQ0hFQ0tFRF9QVFJfT0YoY29uc3QgdHlwZSwgeCkpKQorCitpbnQgQVNOMV9pdGVtX2kyZF9mcChjb25zdCBBU04xX0lURU0gKml0LCBGSUxFICpvdXQsIHZvaWQgKngpOworaW50IEFTTjFfU1RSSU5HX3ByaW50X2V4X2ZwKEZJTEUgKmZwLCBBU04xX1NUUklORyAqc3RyLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKyNlbmRpZgorCitpbnQgQVNOMV9TVFJJTkdfdG9fVVRGOCh1bnNpZ25lZCBjaGFyICoqb3V0LCBBU04xX1NUUklORyAqaW4pOworCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCit2b2lkICpBU04xX2QyaV9iaW8odm9pZCAqKCp4bmV3KSh2b2lkKSwgZDJpX29mX3ZvaWQgKmQyaSwgQklPICppbiwgdm9pZCAqKngpOworCisjZGVmaW5lIEFTTjFfZDJpX2Jpb19vZih0eXBlLHhuZXcsZDJpLGluLHgpIFwKKyAgICAoKHR5cGUqKUFTTjFfZDJpX2JpbyggQ0hFQ0tFRF9ORVdfT0YodHlwZSwgeG5ldyksIFwKKwkJCSAgQ0hFQ0tFRF9EMklfT0YodHlwZSwgZDJpKSwgXAorCQkJICBpbiwgXAorCQkJICBDSEVDS0VEX1BQVFJfT0YodHlwZSwgeCkpKQorCit2b2lkICpBU04xX2l0ZW1fZDJpX2Jpbyhjb25zdCBBU04xX0lURU0gKml0LCBCSU8gKmluLCB2b2lkICp4KTsKK2ludCBBU04xX2kyZF9iaW8oaTJkX29mX3ZvaWQgKmkyZCxCSU8gKm91dCwgdW5zaWduZWQgY2hhciAqeCk7CisKKyNkZWZpbmUgQVNOMV9pMmRfYmlvX29mKHR5cGUsaTJkLG91dCx4KSBcCisgICAgKEFTTjFfaTJkX2JpbyhDSEVDS0VEX0kyRF9PRih0eXBlLCBpMmQpLCBcCisJCSAgb3V0LCBcCisJCSAgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgeCkpKQorCisjZGVmaW5lIEFTTjFfaTJkX2Jpb19vZl9jb25zdCh0eXBlLGkyZCxvdXQseCkgXAorICAgIChBU04xX2kyZF9iaW8oQ0hFQ0tFRF9JMkRfT0YoY29uc3QgdHlwZSwgaTJkKSwgXAorCQkgIG91dCwgXAorCQkgIENIRUNLRURfUFRSX09GKGNvbnN0IHR5cGUsIHgpKSkKKworaW50IEFTTjFfaXRlbV9pMmRfYmlvKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEJJTyAqb3V0LCB2b2lkICp4KTsKK2ludCBBU04xX1VUQ1RJTUVfcHJpbnQoQklPICpmcCwgY29uc3QgQVNOMV9VVENUSU1FICphKTsKK2ludCBBU04xX0dFTkVSQUxJWkVEVElNRV9wcmludChCSU8gKmZwLCBjb25zdCBBU04xX0dFTkVSQUxJWkVEVElNRSAqYSk7CitpbnQgQVNOMV9USU1FX3ByaW50KEJJTyAqZnAsIGNvbnN0IEFTTjFfVElNRSAqYSk7CitpbnQgQVNOMV9TVFJJTkdfcHJpbnQoQklPICpicCwgY29uc3QgQVNOMV9TVFJJTkcgKnYpOworaW50IEFTTjFfU1RSSU5HX3ByaW50X2V4KEJJTyAqb3V0LCBBU04xX1NUUklORyAqc3RyLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBBU04xX2JuX3ByaW50KEJJTyAqYnAsIGNvbnN0IGNoYXIgKm51bWJlciwgY29uc3QgQklHTlVNICpudW0sCisJCQkJdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgb2ZmKTsKK2ludCBBU04xX3BhcnNlKEJJTyAqYnAsY29uc3QgdW5zaWduZWQgY2hhciAqcHAsbG9uZyBsZW4saW50IGluZGVudCk7CitpbnQgQVNOMV9wYXJzZV9kdW1wKEJJTyAqYnAsY29uc3QgdW5zaWduZWQgY2hhciAqcHAsbG9uZyBsZW4saW50IGluZGVudCxpbnQgZHVtcCk7CisjZW5kaWYKK2NvbnN0IGNoYXIgKkFTTjFfdGFnMnN0cihpbnQgdGFnKTsKKworLyogVXNlZCB0byBsb2FkIGFuZCB3cml0ZSBuZXRzY2FwZSBmb3JtYXQgY2VydCAqLworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE5FVFNDQVBFX1g1MDkpCisKK2ludCBBU04xX1VOSVZFUlNBTFNUUklOR190b19zdHJpbmcoQVNOMV9VTklWRVJTQUxTVFJJTkcgKnMpOworCitpbnQgQVNOMV9UWVBFX3NldF9vY3RldHN0cmluZyhBU04xX1RZUEUgKmEsCisJdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbik7CitpbnQgQVNOMV9UWVBFX2dldF9vY3RldHN0cmluZyhBU04xX1RZUEUgKmEsCisJdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IG1heF9sZW4pOworaW50IEFTTjFfVFlQRV9zZXRfaW50X29jdGV0c3RyaW5nKEFTTjFfVFlQRSAqYSwgbG9uZyBudW0sCisJdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbik7CitpbnQgQVNOMV9UWVBFX2dldF9pbnRfb2N0ZXRzdHJpbmcoQVNOMV9UWVBFICphLGxvbmcgKm51bSwKKwl1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbWF4X2xlbik7CisKK1NUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpBU04xX3NlcV91bnBhY2soY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLAorCQkJCSBkMmlfb2Zfdm9pZCAqZDJpLCB2b2lkICgqZnJlZV9mdW5jKShPUEVOU1NMX0JMT0NLKSk7Cit1bnNpZ25lZCBjaGFyICpBU04xX3NlcV9wYWNrKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpzYWZlcywgaTJkX29mX3ZvaWQgKmkyZCwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqKmJ1ZiwgaW50ICpsZW4gKTsKK3ZvaWQgKkFTTjFfdW5wYWNrX3N0cmluZyhBU04xX1NUUklORyAqb2N0LCBkMmlfb2Zfdm9pZCAqZDJpKTsKK3ZvaWQgKkFTTjFfaXRlbV91bnBhY2soQVNOMV9TVFJJTkcgKm9jdCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitBU04xX1NUUklORyAqQVNOMV9wYWNrX3N0cmluZyh2b2lkICpvYmosIGkyZF9vZl92b2lkICppMmQsCisJCQkgICAgICBBU04xX09DVEVUX1NUUklORyAqKm9jdCk7CisKKyNkZWZpbmUgQVNOMV9wYWNrX3N0cmluZ19vZih0eXBlLG9iaixpMmQsb2N0KSBcCisgICAgKEFTTjFfcGFja19zdHJpbmcoQ0hFQ0tFRF9QVFJfT0YodHlwZSwgb2JqKSwgXAorCQkgICAgICBDSEVDS0VEX0kyRF9PRih0eXBlLCBpMmQpLCBcCisJCSAgICAgIG9jdCkpCisKK0FTTjFfU1RSSU5HICpBU04xX2l0ZW1fcGFjayh2b2lkICpvYmosIGNvbnN0IEFTTjFfSVRFTSAqaXQsIEFTTjFfT0NURVRfU1RSSU5HICoqb2N0KTsKKwordm9pZCBBU04xX1NUUklOR19zZXRfZGVmYXVsdF9tYXNrKHVuc2lnbmVkIGxvbmcgbWFzayk7CitpbnQgQVNOMV9TVFJJTkdfc2V0X2RlZmF1bHRfbWFza19hc2MoY2hhciAqcCk7Cit1bnNpZ25lZCBsb25nIEFTTjFfU1RSSU5HX2dldF9kZWZhdWx0X21hc2sodm9pZCk7CitpbnQgQVNOMV9tYnN0cmluZ19jb3B5KEFTTjFfU1RSSU5HICoqb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGxlbiwKKwkJCQkJaW50IGluZm9ybSwgdW5zaWduZWQgbG9uZyBtYXNrKTsKK2ludCBBU04xX21ic3RyaW5nX25jb3B5KEFTTjFfU1RSSU5HICoqb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGxlbiwKKwkJCQkJaW50IGluZm9ybSwgdW5zaWduZWQgbG9uZyBtYXNrLCAKKwkJCQkJbG9uZyBtaW5zaXplLCBsb25nIG1heHNpemUpOworCitBU04xX1NUUklORyAqQVNOMV9TVFJJTkdfc2V0X2J5X05JRChBU04xX1NUUklORyAqKm91dCwgCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaW5sZW4sIGludCBpbmZvcm0sIGludCBuaWQpOworQVNOMV9TVFJJTkdfVEFCTEUgKkFTTjFfU1RSSU5HX1RBQkxFX2dldChpbnQgbmlkKTsKK2ludCBBU04xX1NUUklOR19UQUJMRV9hZGQoaW50LCBsb25nLCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgQVNOMV9TVFJJTkdfVEFCTEVfY2xlYW51cCh2b2lkKTsKKworLyogQVNOMSB0ZW1wbGF0ZSBmdW5jdGlvbnMgKi8KKworLyogT2xkIEFQSSBjb21wYXRpYmxlIGZ1bmN0aW9ucyAqLworQVNOMV9WQUxVRSAqQVNOMV9pdGVtX25ldyhjb25zdCBBU04xX0lURU0gKml0KTsKK3ZvaWQgQVNOMV9pdGVtX2ZyZWUoQVNOMV9WQUxVRSAqdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK0FTTjFfVkFMVUUgKiBBU04xX2l0ZW1fZDJpKEFTTjFfVkFMVUUgKip2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworaW50IEFTTjFfaXRlbV9pMmQoQVNOMV9WQUxVRSAqdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBBU04xX2l0ZW1fbmRlZl9pMmQoQVNOMV9WQUxVRSAqdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0KTsKKwordm9pZCBBU04xX2FkZF9vaWRfbW9kdWxlKHZvaWQpOworCitBU04xX1RZUEUgKkFTTjFfZ2VuZXJhdGVfbmNvbmYoY2hhciAqc3RyLCBDT05GICpuY29uZik7CitBU04xX1RZUEUgKkFTTjFfZ2VuZXJhdGVfdjMoY2hhciAqc3RyLCBYNTA5VjNfQ1RYICpjbmYpOworCisvKiBBU04xIFByaW50IGZsYWdzICovCisKKy8qIEluZGljYXRlIG1pc3NpbmcgT1BUSU9OQUwgZmllbGRzICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19TSE9XX0FCU0VOVAkJMHgwMDEJCisvKiBNYXJrIHN0YXJ0IGFuZCBlbmQgb2YgU0VRVUVOQ0UgKi8KKyNkZWZpbmUgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfU0VRVUVOQ0UJCTB4MDAyCisvKiBNYXJrIHN0YXJ0IGFuZCBlbmQgb2YgU0VRVUVOQ0UvU0VUIE9GICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19TSE9XX1NTT0YJCTB4MDA0CisvKiBTaG93IHRoZSBBU04xIHR5cGUgb2YgcHJpbWl0aXZlcyAqLworI2RlZmluZSBBU04xX1BDVFhfRkxBR1NfU0hPV19UWVBFCQkweDAwOAorLyogRG9uJ3Qgc2hvdyBBU04xIHR5cGUgb2YgQU5ZICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19OT19BTllfVFlQRQkJMHgwMTAKKy8qIERvbid0IHNob3cgQVNOMSB0eXBlIG9mIE1TVFJJTkdzICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19OT19NU1RSSU5HX1RZUEUJCTB4MDIwCisvKiBEb24ndCBzaG93IGZpZWxkIG5hbWVzIGluIFNFUVVFTkNFICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19OT19GSUVMRF9OQU1FCQkweDA0MAorLyogU2hvdyBzdHJ1Y3R1cmUgbmFtZXMgb2YgZWFjaCBTRVFVRU5DRSBmaWVsZCAqLworI2RlZmluZSBBU04xX1BDVFhfRkxBR1NfU0hPV19GSUVMRF9TVFJVQ1RfTkFNRQkweDA4MAorLyogRG9uJ3Qgc2hvdyBzdHJ1Y3R1cmUgbmFtZSBldmVuIGF0IHRvcCBsZXZlbCAqLworI2RlZmluZSBBU04xX1BDVFhfRkxBR1NfTk9fU1RSVUNUX05BTUUJCTB4MTAwCisKK2ludCBBU04xX2l0ZW1fcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKmlmbGQsIGludCBpbmRlbnQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgY29uc3QgQVNOMV9QQ1RYICpwY3R4KTsKK0FTTjFfUENUWCAqQVNOMV9QQ1RYX25ldyh2b2lkKTsKK3ZvaWQgQVNOMV9QQ1RYX2ZyZWUoQVNOMV9QQ1RYICpwKTsKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9mbGFncyhBU04xX1BDVFggKnApOwordm9pZCBBU04xX1BDVFhfc2V0X2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfbm1fZmxhZ3MoQVNOMV9QQ1RYICpwKTsKK3ZvaWQgQVNOMV9QQ1RYX3NldF9ubV9mbGFncyhBU04xX1BDVFggKnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordW5zaWduZWQgbG9uZyBBU04xX1BDVFhfZ2V0X2NlcnRfZmxhZ3MoQVNOMV9QQ1RYICpwKTsKK3ZvaWQgQVNOMV9QQ1RYX3NldF9jZXJ0X2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfb2lkX2ZsYWdzKEFTTjFfUENUWCAqcCk7Cit2b2lkIEFTTjFfUENUWF9zZXRfb2lkX2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfc3RyX2ZsYWdzKEFTTjFfUENUWCAqcCk7Cit2b2lkIEFTTjFfUENUWF9zZXRfc3RyX2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK0JJT19NRVRIT0QgKkJJT19mX2FzbjEodm9pZCk7CisKK0JJTyAqQklPX25ld19OREVGKEJJTyAqb3V0LCBBU04xX1ZBTFVFICp2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitpbnQgaTJkX0FTTjFfYmlvX3N0cmVhbShCSU8gKm91dCwgQVNOMV9WQUxVRSAqdmFsLCBCSU8gKmluLCBpbnQgZmxhZ3MsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgUEVNX3dyaXRlX2Jpb19BU04xX3N0cmVhbShCSU8gKm91dCwgQVNOMV9WQUxVRSAqdmFsLCBCSU8gKmluLCBpbnQgZmxhZ3MsCisJCQkJY29uc3QgY2hhciAqaGRyLAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQpOworaW50IFNNSU1FX3dyaXRlX0FTTjEoQklPICpiaW8sIEFTTjFfVkFMVUUgKnZhbCwgQklPICpkYXRhLCBpbnQgZmxhZ3MsCisJCQkJaW50IGN0eXBlX25pZCwgaW50IGVjb250X25pZCwKKwkJCQlTVEFDS19PRihYNTA5X0FMR09SKSAqbWRhbGdzLAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQpOworQVNOMV9WQUxVRSAqU01JTUVfcmVhZF9BU04xKEJJTyAqYmlvLCBCSU8gKipiY29udCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgU01JTUVfY3JsZl9jb3B5KEJJTyAqaW4sIEJJTyAqb3V0LCBpbnQgZmxhZ3MpOworaW50IFNNSU1FX3RleHQoQklPICppbiwgQklPICpvdXQpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0FTTjFfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBBU04xIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIEFTTjFfRl9BMkRfQVNOMV9PQkpFQ1QJCQkJIDEwMAorI2RlZmluZSBBU04xX0ZfQTJJX0FTTjFfRU5VTUVSQVRFRAkJCSAxMDEKKyNkZWZpbmUgQVNOMV9GX0EySV9BU04xX0lOVEVHRVIJCQkJIDEwMgorI2RlZmluZSBBU04xX0ZfQTJJX0FTTjFfU1RSSU5HCQkJCSAxMDMKKyNkZWZpbmUgQVNOMV9GX0FQUEVORF9FWFAJCQkJIDE3NgorI2RlZmluZSBBU04xX0ZfQVNOMV9CSVRfU1RSSU5HX1NFVF9CSVQJCQkgMTgzCisjZGVmaW5lIEFTTjFfRl9BU04xX0NCCQkJCQkgMTc3CisjZGVmaW5lIEFTTjFfRl9BU04xX0NIRUNLX1RMRU4JCQkJIDEwNAorI2RlZmluZSBBU04xX0ZfQVNOMV9DT0xMQVRFX1BSSU1JVElWRQkJCSAxMDUKKyNkZWZpbmUgQVNOMV9GX0FTTjFfQ09MTEVDVAkJCQkgMTA2CisjZGVmaW5lIEFTTjFfRl9BU04xX0QySV9FWF9QUklNSVRJVkUJCQkgMTA4CisjZGVmaW5lIEFTTjFfRl9BU04xX0QySV9GUAkJCQkgMTA5CisjZGVmaW5lIEFTTjFfRl9BU04xX0QySV9SRUFEX0JJTwkJCSAxMDcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfRElHRVNUCQkJCSAxODQKKyNkZWZpbmUgQVNOMV9GX0FTTjFfRE9fQURCCQkJCSAxMTAKKyNkZWZpbmUgQVNOMV9GX0FTTjFfRFVQCQkJCQkgMTExCisjZGVmaW5lIEFTTjFfRl9BU04xX0VOVU1FUkFURURfU0VUCQkJIDExMgorI2RlZmluZSBBU04xX0ZfQVNOMV9FTlVNRVJBVEVEX1RPX0JOCQkJIDExMworI2RlZmluZSBBU04xX0ZfQVNOMV9FWF9DMkkJCQkJIDIwNAorI2RlZmluZSBBU04xX0ZfQVNOMV9GSU5EX0VORAkJCQkgMTkwCisjZGVmaW5lIEFTTjFfRl9BU04xX0dFTkVSQUxJWkVEVElNRV9BREoJCQkgMjE2CisjZGVmaW5lIEFTTjFfRl9BU04xX0dFTkVSQUxJWkVEVElNRV9TRVQJCQkgMTg1CisjZGVmaW5lIEFTTjFfRl9BU04xX0dFTkVSQVRFX1YzCQkJCSAxNzgKKyNkZWZpbmUgQVNOMV9GX0FTTjFfR0VUX09CSkVDVAkJCQkgMTE0CisjZGVmaW5lIEFTTjFfRl9BU04xX0hFQURFUl9ORVcJCQkJIDExNQorI2RlZmluZSBBU04xX0ZfQVNOMV9JMkRfQklPCQkJCSAxMTYKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSTJEX0ZQCQkJCSAxMTcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSU5URUdFUl9TRVQJCQkJIDExOAorI2RlZmluZSBBU04xX0ZfQVNOMV9JTlRFR0VSX1RPX0JOCQkJIDExOQorI2RlZmluZSBBU04xX0ZfQVNOMV9JVEVNX0QySV9GUAkJCQkgMjA2CisjZGVmaW5lIEFTTjFfRl9BU04xX0lURU1fRFVQCQkJCSAxOTEKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSVRFTV9FWF9DT01CSU5FX05FVwkJCSAxMjEKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkkJCQkJIDEyMAorI2RlZmluZSBBU04xX0ZfQVNOMV9JVEVNX0kyRF9CSU8JCQkgMTkyCisjZGVmaW5lIEFTTjFfRl9BU04xX0lURU1fSTJEX0ZQCQkJCSAxOTMKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSVRFTV9QQUNLCQkJCSAxOTgKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSVRFTV9TSUdOCQkJCSAxOTUKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSVRFTV9VTlBBQ0sJCQkJIDE5OQorI2RlZmluZSBBU04xX0ZfQVNOMV9JVEVNX1ZFUklGWQkJCQkgMTk3CisjZGVmaW5lIEFTTjFfRl9BU04xX01CU1RSSU5HX05DT1BZCQkJIDEyMgorI2RlZmluZSBBU04xX0ZfQVNOMV9PQkpFQ1RfTkVXCQkJCSAxMjMKKyNkZWZpbmUgQVNOMV9GX0FTTjFfT1VUUFVUX0RBVEEJCQkJIDIxNAorI2RlZmluZSBBU04xX0ZfQVNOMV9QQUNLX1NUUklORwkJCQkgMTI0CisjZGVmaW5lIEFTTjFfRl9BU04xX1BDVFhfTkVXCQkJCSAyMDUKKyNkZWZpbmUgQVNOMV9GX0FTTjFfUEtDUzVfUEJFX1NFVAkJCSAxMjUKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU0VRX1BBQ0sJCQkJIDEyNgorI2RlZmluZSBBU04xX0ZfQVNOMV9TRVFfVU5QQUNLCQkJCSAxMjcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU0lHTgkJCQkgMTI4CisjZGVmaW5lIEFTTjFfRl9BU04xX1NUUjJUWVBFCQkJCSAxNzkKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU1RSSU5HX1NFVAkJCQkgMTg2CisjZGVmaW5lIEFTTjFfRl9BU04xX1NUUklOR19UQUJMRV9BREQJCQkgMTI5CisjZGVmaW5lIEFTTjFfRl9BU04xX1NUUklOR19UWVBFX05FVwkJCSAxMzAKKyNkZWZpbmUgQVNOMV9GX0FTTjFfVEVNUExBVEVfRVhfRDJJCQkJIDEzMgorI2RlZmluZSBBU04xX0ZfQVNOMV9URU1QTEFURV9ORVcJCQkgMTMzCisjZGVmaW5lIEFTTjFfRl9BU04xX1RFTVBMQVRFX05PRVhQX0QySQkJCSAxMzEKKyNkZWZpbmUgQVNOMV9GX0FTTjFfVElNRV9BREoJCQkJIDIxNworI2RlZmluZSBBU04xX0ZfQVNOMV9USU1FX1NFVAkJCQkgMTc1CisjZGVmaW5lIEFTTjFfRl9BU04xX1RZUEVfR0VUX0lOVF9PQ1RFVFNUUklORwkJIDEzNAorI2RlZmluZSBBU04xX0ZfQVNOMV9UWVBFX0dFVF9PQ1RFVFNUUklORwkJIDEzNQorI2RlZmluZSBBU04xX0ZfQVNOMV9VTlBBQ0tfU1RSSU5HCQkJIDEzNgorI2RlZmluZSBBU04xX0ZfQVNOMV9VVENUSU1FX0FESgkJCQkgMjE4CisjZGVmaW5lIEFTTjFfRl9BU04xX1VUQ1RJTUVfU0VUCQkJCSAxODcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfVkVSSUZZCQkJCSAxMzcKKyNkZWZpbmUgQVNOMV9GX0I2NF9SRUFEX0FTTjEJCQkJIDIwOQorI2RlZmluZSBBU04xX0ZfQjY0X1dSSVRFX0FTTjEJCQkJIDIxMAorI2RlZmluZSBBU04xX0ZfQklPX05FV19OREVGCQkJCSAyMDgKKyNkZWZpbmUgQVNOMV9GX0JJVFNUUl9DQgkJCQkgMTgwCisjZGVmaW5lIEFTTjFfRl9CTl9UT19BU04xX0VOVU1FUkFURUQJCQkgMTM4CisjZGVmaW5lIEFTTjFfRl9CTl9UT19BU04xX0lOVEVHRVIJCQkgMTM5CisjZGVmaW5lIEFTTjFfRl9DMklfQVNOMV9CSVRfU1RSSU5HCQkJIDE4OQorI2RlZmluZSBBU04xX0ZfQzJJX0FTTjFfSU5URUdFUgkJCQkgMTk0CisjZGVmaW5lIEFTTjFfRl9DMklfQVNOMV9PQkpFQ1QJCQkJIDE5NgorI2RlZmluZSBBU04xX0ZfQ09MTEVDVF9EQVRBCQkJCSAxNDAKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX0JJVF9TVFJJTkcJCQkgMTQxCisjZGVmaW5lIEFTTjFfRl9EMklfQVNOMV9CT09MRUFOCQkJCSAxNDIKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX0JZVEVTCQkJCSAxNDMKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX0dFTkVSQUxJWkVEVElNRQkJCSAxNDQKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX0hFQURFUgkJCQkgMTQ1CisjZGVmaW5lIEFTTjFfRl9EMklfQVNOMV9JTlRFR0VSCQkJCSAxNDYKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX09CSkVDVAkJCQkgMTQ3CisjZGVmaW5lIEFTTjFfRl9EMklfQVNOMV9TRVQJCQkJIDE0OAorI2RlZmluZSBBU04xX0ZfRDJJX0FTTjFfVFlQRV9CWVRFUwkJCSAxNDkKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX1VJTlRFR0VSCQkJIDE1MAorI2RlZmluZSBBU04xX0ZfRDJJX0FTTjFfVVRDVElNRQkJCQkgMTUxCisjZGVmaW5lIEFTTjFfRl9EMklfQVVUT1BSSVZBVEVLRVkJCQkgMjA3CisjZGVmaW5lIEFTTjFfRl9EMklfTkVUU0NBUEVfUlNBCQkJCSAxNTIKKyNkZWZpbmUgQVNOMV9GX0QySV9ORVRTQ0FQRV9SU0FfMgkJCSAxNTMKKyNkZWZpbmUgQVNOMV9GX0QySV9QUklWQVRFS0VZCQkJCSAxNTQKKyNkZWZpbmUgQVNOMV9GX0QySV9QVUJMSUNLRVkJCQkJIDE1NQorI2RlZmluZSBBU04xX0ZfRDJJX1JTQV9ORVQJCQkJIDIwMAorI2RlZmluZSBBU04xX0ZfRDJJX1JTQV9ORVRfMgkJCQkgMjAxCisjZGVmaW5lIEFTTjFfRl9EMklfWDUwOQkJCQkJIDE1NgorI2RlZmluZSBBU04xX0ZfRDJJX1g1MDlfQ0lORgkJCQkgMTU3CisjZGVmaW5lIEFTTjFfRl9EMklfWDUwOV9QS0VZCQkJCSAxNTkKKyNkZWZpbmUgQVNOMV9GX0kyRF9BU04xX0JJT19TVFJFQU0JCQkgMjExCisjZGVmaW5lIEFTTjFfRl9JMkRfQVNOMV9TRVQJCQkJIDE4OAorI2RlZmluZSBBU04xX0ZfSTJEX0FTTjFfVElNRQkJCQkgMTYwCisjZGVmaW5lIEFTTjFfRl9JMkRfRFNBX1BVQktFWQkJCQkgMTYxCisjZGVmaW5lIEFTTjFfRl9JMkRfRUNfUFVCS0VZCQkJCSAxODEKKyNkZWZpbmUgQVNOMV9GX0kyRF9QUklWQVRFS0VZCQkJCSAxNjMKKyNkZWZpbmUgQVNOMV9GX0kyRF9QVUJMSUNLRVkJCQkJIDE2NAorI2RlZmluZSBBU04xX0ZfSTJEX1JTQV9ORVQJCQkJIDE2MgorI2RlZmluZSBBU04xX0ZfSTJEX1JTQV9QVUJLRVkJCQkJIDE2NQorI2RlZmluZSBBU04xX0ZfTE9OR19DMkkJCQkJCSAxNjYKKyNkZWZpbmUgQVNOMV9GX09JRF9NT0RVTEVfSU5JVAkJCQkgMTc0CisjZGVmaW5lIEFTTjFfRl9QQVJTRV9UQUdHSU5HCQkJCSAxODIKKyNkZWZpbmUgQVNOMV9GX1BLQ1M1X1BCRTJfU0VUX0lWCQkJIDE2NworI2RlZmluZSBBU04xX0ZfUEtDUzVfUEJFX1NFVAkJCQkgMjAyCisjZGVmaW5lIEFTTjFfRl9QS0NTNV9QQkVfU0VUMF9BTEdPUgkJCSAyMTUKKyNkZWZpbmUgQVNOMV9GX1NNSU1FX1JFQURfQVNOMQkJCQkgMjEyCisjZGVmaW5lIEFTTjFfRl9TTUlNRV9URVhUCQkJCSAyMTMKKyNkZWZpbmUgQVNOMV9GX1g1MDlfQ0lORl9ORVcJCQkJIDE2OAorI2RlZmluZSBBU04xX0ZfWDUwOV9DUkxfQUREMF9SRVZPS0VECQkJIDE2OQorI2RlZmluZSBBU04xX0ZfWDUwOV9JTkZPX05FVwkJCQkgMTcwCisjZGVmaW5lIEFTTjFfRl9YNTA5X05BTUVfRU5DT0RFCQkJCSAyMDMKKyNkZWZpbmUgQVNOMV9GX1g1MDlfTkFNRV9FWF9EMkkJCQkJIDE1OAorI2RlZmluZSBBU04xX0ZfWDUwOV9OQU1FX0VYX05FVwkJCQkgMTcxCisjZGVmaW5lIEFTTjFfRl9YNTA5X05FVwkJCQkJIDE3MgorI2RlZmluZSBBU04xX0ZfWDUwOV9QS0VZX05FVwkJCQkgMTczCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQVNOMV9SX0FERElOR19PQkpFQ1QJCQkJIDE3MQorI2RlZmluZSBBU04xX1JfQVNOMV9QQVJTRV9FUlJPUgkJCQkgMjAzCisjZGVmaW5lIEFTTjFfUl9BU04xX1NJR19QQVJTRV9FUlJPUgkJCSAyMDQKKyNkZWZpbmUgQVNOMV9SX0FVWF9FUlJPUgkJCQkgMTAwCisjZGVmaW5lIEFTTjFfUl9CQURfQ0xBU1MJCQkJIDEwMQorI2RlZmluZSBBU04xX1JfQkFEX09CSkVDVF9IRUFERVIJCQkgMTAyCisjZGVmaW5lIEFTTjFfUl9CQURfUEFTU1dPUkRfUkVBRAkJCSAxMDMKKyNkZWZpbmUgQVNOMV9SX0JBRF9UQUcJCQkJCSAxMDQKKyNkZWZpbmUgQVNOMV9SX0JNUFNUUklOR19JU19XUk9OR19MRU5HVEgJCSAyMTQKKyNkZWZpbmUgQVNOMV9SX0JOX0xJQgkJCQkJIDEwNQorI2RlZmluZSBBU04xX1JfQk9PTEVBTl9JU19XUk9OR19MRU5HVEgJCQkgMTA2CisjZGVmaW5lIEFTTjFfUl9CVUZGRVJfVE9PX1NNQUxMCQkJCSAxMDcKKyNkZWZpbmUgQVNOMV9SX0NJUEhFUl9IQVNfTk9fT0JKRUNUX0lERU5USUZJRVIJCSAxMDgKKyNkZWZpbmUgQVNOMV9SX0RBVEFfSVNfV1JPTkcJCQkJIDEwOQorI2RlZmluZSBBU04xX1JfREVDT0RFX0VSUk9SCQkJCSAxMTAKKyNkZWZpbmUgQVNOMV9SX0RFQ09ESU5HX0VSUk9SCQkJCSAxMTEKKyNkZWZpbmUgQVNOMV9SX0RFUFRIX0VYQ0VFREVECQkJCSAxNzQKKyNkZWZpbmUgQVNOMV9SX0RJR0VTVF9BTkRfS0VZX1RZUEVfTk9UX1NVUFBPUlRFRAkgMTk4CisjZGVmaW5lIEFTTjFfUl9FTkNPREVfRVJST1IJCQkJIDExMgorI2RlZmluZSBBU04xX1JfRVJST1JfR0VUVElOR19USU1FCQkJIDE3MworI2RlZmluZSBBU04xX1JfRVJST1JfTE9BRElOR19TRUNUSU9OCQkJIDE3MgorI2RlZmluZSBBU04xX1JfRVJST1JfUEFSU0lOR19TRVRfRUxFTUVOVAkJIDExMworI2RlZmluZSBBU04xX1JfRVJST1JfU0VUVElOR19DSVBIRVJfUEFSQU1TCQkgMTE0CisjZGVmaW5lIEFTTjFfUl9FWFBFQ1RJTkdfQU5fSU5URUdFUgkJCSAxMTUKKyNkZWZpbmUgQVNOMV9SX0VYUEVDVElOR19BTl9PQkpFQ1QJCQkgMTE2CisjZGVmaW5lIEFTTjFfUl9FWFBFQ1RJTkdfQV9CT09MRUFOCQkJIDExNworI2RlZmluZSBBU04xX1JfRVhQRUNUSU5HX0FfVElNRQkJCQkgMTE4CisjZGVmaW5lIEFTTjFfUl9FWFBMSUNJVF9MRU5HVEhfTUlTTUFUQ0gJCQkgMTE5CisjZGVmaW5lIEFTTjFfUl9FWFBMSUNJVF9UQUdfTk9UX0NPTlNUUlVDVEVECQkgMTIwCisjZGVmaW5lIEFTTjFfUl9GSUVMRF9NSVNTSU5HCQkJCSAxMjEKKyNkZWZpbmUgQVNOMV9SX0ZJUlNUX05VTV9UT09fTEFSR0UJCQkgMTIyCisjZGVmaW5lIEFTTjFfUl9IRUFERVJfVE9PX0xPTkcJCQkJIDEyMworI2RlZmluZSBBU04xX1JfSUxMRUdBTF9CSVRTVFJJTkdfRk9STUFUCQkJIDE3NQorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9CT09MRUFOCQkJCSAxNzYKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfQ0hBUkFDVEVSUwkJCSAxMjQKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfRk9STUFUCQkJCSAxNzcKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfSEVYCQkJCSAxNzgKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfSU1QTElDSVRfVEFHCQkJIDE3OQorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9JTlRFR0VSCQkJCSAxODAKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfTkVTVEVEX1RBR0dJTkcJCQkgMTgxCisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX05VTEwJCQkJIDEyNQorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9OVUxMX1ZBTFVFCQkJIDE4MgorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9PQkpFQ1QJCQkJIDE4MworI2RlZmluZSBBU04xX1JfSUxMRUdBTF9PUFRJT05BTF9BTlkJCQkgMTI2CisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX09QVElPTlNfT05fSVRFTV9URU1QTEFURQkJIDE3MAorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9UQUdHRURfQU5ZCQkJIDEyNworI2RlZmluZSBBU04xX1JfSUxMRUdBTF9USU1FX1ZBTFVFCQkJIDE4NAorI2RlZmluZSBBU04xX1JfSU5URUdFUl9OT1RfQVNDSUlfRk9STUFUCQkJIDE4NQorI2RlZmluZSBBU04xX1JfSU5URUdFUl9UT09fTEFSR0VfRk9SX0xPTkcJCSAxMjgKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfQk1QU1RSSU5HX0xFTkdUSAkJCSAxMjkKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfRElHSVQJCQkJIDEzMAorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9NSU1FX1RZUEUJCQkgMjA1CisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX01PRElGSUVSCQkJCSAxODYKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfTlVNQkVSCQkJCSAxODcKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfT0JKRUNUX0VOQ09ESU5HCQkJIDIxNgorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9TRVBBUkFUT1IJCQkgMTMxCisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX1RJTUVfRk9STUFUCQkJIDEzMgorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9VTklWRVJTQUxTVFJJTkdfTEVOR1RICQkgMTMzCisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX1VURjhTVFJJTkcJCQkgMTM0CisjZGVmaW5lIEFTTjFfUl9JVl9UT09fTEFSR0UJCQkJIDEzNQorI2RlZmluZSBBU04xX1JfTEVOR1RIX0VSUk9SCQkJCSAxMzYKKyNkZWZpbmUgQVNOMV9SX0xJU1RfRVJST1IJCQkJIDE4OAorI2RlZmluZSBBU04xX1JfTUlNRV9OT19DT05URU5UX1RZUEUJCQkgMjA2CisjZGVmaW5lIEFTTjFfUl9NSU1FX1BBUlNFX0VSUk9SCQkJCSAyMDcKKyNkZWZpbmUgQVNOMV9SX01JTUVfU0lHX1BBUlNFX0VSUk9SCQkJIDIwOAorI2RlZmluZSBBU04xX1JfTUlTU0lOR19FT0MJCQkJIDEzNworI2RlZmluZSBBU04xX1JfTUlTU0lOR19TRUNPTkRfTlVNQkVSCQkJIDEzOAorI2RlZmluZSBBU04xX1JfTUlTU0lOR19WQUxVRQkJCQkgMTg5CisjZGVmaW5lIEFTTjFfUl9NU1RSSU5HX05PVF9VTklWRVJTQUwJCQkgMTM5CisjZGVmaW5lIEFTTjFfUl9NU1RSSU5HX1dST05HX1RBRwkJCSAxNDAKKyNkZWZpbmUgQVNOMV9SX05FU1RFRF9BU04xX1NUUklORwkJCSAxOTcKKyNkZWZpbmUgQVNOMV9SX05PTl9IRVhfQ0hBUkFDVEVSUwkJCSAxNDEKKyNkZWZpbmUgQVNOMV9SX05PVF9BU0NJSV9GT1JNQVQJCQkJIDE5MAorI2RlZmluZSBBU04xX1JfTk9UX0VOT1VHSF9EQVRBCQkJCSAxNDIKKyNkZWZpbmUgQVNOMV9SX05PX0NPTlRFTlRfVFlQRQkJCQkgMjA5CisjZGVmaW5lIEFTTjFfUl9OT19ERUZBVUxUX0RJR0VTVAkJCSAyMDEKKyNkZWZpbmUgQVNOMV9SX05PX01BVENISU5HX0NIT0lDRV9UWVBFCQkJIDE0MworI2RlZmluZSBBU04xX1JfTk9fTVVMVElQQVJUX0JPRFlfRkFJTFVSRQkJIDIxMAorI2RlZmluZSBBU04xX1JfTk9fTVVMVElQQVJUX0JPVU5EQVJZCQkJIDIxMQorI2RlZmluZSBBU04xX1JfTk9fU0lHX0NPTlRFTlRfVFlQRQkJCSAyMTIKKyNkZWZpbmUgQVNOMV9SX05VTExfSVNfV1JPTkdfTEVOR1RICQkJIDE0NAorI2RlZmluZSBBU04xX1JfT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQJCQkgMTkxCisjZGVmaW5lIEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTCQkJIDE0NQorI2RlZmluZSBBU04xX1JfUFJJVkFURV9LRVlfSEVBREVSX01JU1NJTkcJCSAxNDYKKyNkZWZpbmUgQVNOMV9SX1NFQ09ORF9OVU1CRVJfVE9PX0xBUkdFCQkJIDE0NworI2RlZmluZSBBU04xX1JfU0VRVUVOQ0VfTEVOR1RIX01JU01BVENICQkJIDE0OAorI2RlZmluZSBBU04xX1JfU0VRVUVOQ0VfTk9UX0NPTlNUUlVDVEVECQkJIDE0OQorI2RlZmluZSBBU04xX1JfU0VRVUVOQ0VfT1JfU0VUX05FRURTX0NPTkZJRwkJIDE5MgorI2RlZmluZSBBU04xX1JfU0hPUlRfTElORQkJCQkgMTUwCisjZGVmaW5lIEFTTjFfUl9TSUdfSU5WQUxJRF9NSU1FX1RZUEUJCQkgMjEzCisjZGVmaW5lIEFTTjFfUl9TVFJFQU1JTkdfTk9UX1NVUFBPUlRFRAkJCSAyMDIKKyNkZWZpbmUgQVNOMV9SX1NUUklOR19UT09fTE9ORwkJCQkgMTUxCisjZGVmaW5lIEFTTjFfUl9TVFJJTkdfVE9PX1NIT1JUCQkJCSAxNTIKKyNkZWZpbmUgQVNOMV9SX1RBR19WQUxVRV9UT09fSElHSAkJCSAxNTMKKyNkZWZpbmUgQVNOMV9SX1RIRV9BU04xX09CSkVDVF9JREVOVElGSUVSX0lTX05PVF9LTk9XTl9GT1JfVEhJU19NRCAxNTQKKyNkZWZpbmUgQVNOMV9SX1RJTUVfTk9UX0FTQ0lJX0ZPUk1BVAkJCSAxOTMKKyNkZWZpbmUgQVNOMV9SX1RPT19MT05HCQkJCQkgMTU1CisjZGVmaW5lIEFTTjFfUl9UWVBFX05PVF9DT05TVFJVQ1RFRAkJCSAxNTYKKyNkZWZpbmUgQVNOMV9SX1VOQUJMRV9UT19ERUNPREVfUlNBX0tFWQkJCSAxNTcKKyNkZWZpbmUgQVNOMV9SX1VOQUJMRV9UT19ERUNPREVfUlNBX1BSSVZBVEVfS0VZCQkgMTU4CisjZGVmaW5lIEFTTjFfUl9VTkVYUEVDVEVEX0VPQwkJCQkgMTU5CisjZGVmaW5lIEFTTjFfUl9VTklWRVJTQUxTVFJJTkdfSVNfV1JPTkdfTEVOR1RICQkgMjE1CisjZGVmaW5lIEFTTjFfUl9VTktOT1dOX0ZPUk1BVAkJCQkgMTYwCisjZGVmaW5lIEFTTjFfUl9VTktOT1dOX01FU1NBR0VfRElHRVNUX0FMR09SSVRITQkJIDE2MQorI2RlZmluZSBBU04xX1JfVU5LTk9XTl9PQkpFQ1RfVFlQRQkJCSAxNjIKKyNkZWZpbmUgQVNOMV9SX1VOS05PV05fUFVCTElDX0tFWV9UWVBFCQkJIDE2MworI2RlZmluZSBBU04xX1JfVU5LTk9XTl9TSUdOQVRVUkVfQUxHT1JJVEhNCQkgMTk5CisjZGVmaW5lIEFTTjFfUl9VTktOT1dOX1RBRwkJCQkgMTk0CisjZGVmaW5lIEFTTjFfUl9VTktPV05fRk9STUFUCQkJCSAxOTUKKyNkZWZpbmUgQVNOMV9SX1VOU1VQUE9SVEVEX0FOWV9ERUZJTkVEX0JZX1RZUEUJCSAxNjQKKyNkZWZpbmUgQVNOMV9SX1VOU1VQUE9SVEVEX0NJUEhFUgkJCSAxNjUKKyNkZWZpbmUgQVNOMV9SX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT05fQUxHT1JJVEhNCQkgMTY2CisjZGVmaW5lIEFTTjFfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUJCSAxNjcKKyNkZWZpbmUgQVNOMV9SX1VOU1VQUE9SVEVEX1RZUEUJCQkJIDE5NgorI2RlZmluZSBBU04xX1JfV1JPTkdfUFVCTElDX0tFWV9UWVBFCQkJIDIwMAorI2RlZmluZSBBU04xX1JfV1JPTkdfVEFHCQkJCSAxNjgKKyNkZWZpbmUgQVNOMV9SX1dST05HX1RZUEUJCQkJIDE2OQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMV9lcnIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwNGQwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfZXJyLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qIGNyeXB0by9hc24xL2FzbjFfZXJyLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwOSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBOT1RFOiB0aGlzIGZpbGUgd2FzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBta2Vyci5wbCBzY3JpcHQ6IGFueSBjaGFuZ2VzCisgKiBtYWRlIHRvIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IG5leHQgdXBkYXRlcyB0aGlzIGZpbGUsCisgKiBvbmx5IHJlYXNvbiBzdHJpbmdzIHdpbGwgYmUgcHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9BU04xLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfQVNOMSwwLHJlYXNvbikKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBBU04xX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoQVNOMV9GX0EyRF9BU04xX09CSkVDVCksCSJhMmRfQVNOMV9PQkpFQ1QifSwKK3tFUlJfRlVOQyhBU04xX0ZfQTJJX0FTTjFfRU5VTUVSQVRFRCksCSJhMmlfQVNOMV9FTlVNRVJBVEVEIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0EySV9BU04xX0lOVEVHRVIpLAkiYTJpX0FTTjFfSU5URUdFUiJ9LAore0VSUl9GVU5DKEFTTjFfRl9BMklfQVNOMV9TVFJJTkcpLAkiYTJpX0FTTjFfU1RSSU5HIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FQUEVORF9FWFApLAkiQVBQRU5EX0VYUCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0JJVF9TVFJJTkdfU0VUX0JJVCksCSJBU04xX0JJVF9TVFJJTkdfc2V0X2JpdCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0NCKSwJIkFTTjFfQ0IifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9DSEVDS19UTEVOKSwJIkFTTjFfQ0hFQ0tfVExFTiJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0NPTExBVEVfUFJJTUlUSVZFKSwJIkFTTjFfQ09MTEFURV9QUklNSVRJVkUifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9DT0xMRUNUKSwJIkFTTjFfQ09MTEVDVCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0QySV9FWF9QUklNSVRJVkUpLAkiQVNOMV9EMklfRVhfUFJJTUlUSVZFIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfRDJJX0ZQKSwJIkFTTjFfZDJpX2ZwIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfRDJJX1JFQURfQklPKSwJIkFTTjFfRDJJX1JFQURfQklPIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfRElHRVNUKSwJIkFTTjFfZGlnZXN0In0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfRE9fQURCKSwJIkFTTjFfRE9fQURCIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfRFVQKSwJIkFTTjFfZHVwIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfRU5VTUVSQVRFRF9TRVQpLAkiQVNOMV9FTlVNRVJBVEVEX3NldCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0VOVU1FUkFURURfVE9fQk4pLAkiQVNOMV9FTlVNRVJBVEVEX3RvX0JOIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfRVhfQzJJKSwJIkFTTjFfRVhfQzJJIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfRklORF9FTkQpLAkiQVNOMV9GSU5EX0VORCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0dFTkVSQUxJWkVEVElNRV9BREopLAkiQVNOMV9HRU5FUkFMSVpFRFRJTUVfYWRqIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfR0VORVJBTElaRURUSU1FX1NFVCksCSJBU04xX0dFTkVSQUxJWkVEVElNRV9zZXQifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9HRU5FUkFURV9WMyksCSJBU04xX2dlbmVyYXRlX3YzIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfR0VUX09CSkVDVCksCSJBU04xX2dldF9vYmplY3QifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9IRUFERVJfTkVXKSwJIkFTTjFfSEVBREVSX05FVyJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0kyRF9CSU8pLAkiQVNOMV9pMmRfYmlvIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfSTJEX0ZQKSwJIkFTTjFfaTJkX2ZwIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfSU5URUdFUl9TRVQpLAkiQVNOMV9JTlRFR0VSX3NldCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0lOVEVHRVJfVE9fQk4pLAkiQVNOMV9JTlRFR0VSX3RvX0JOIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfSVRFTV9EMklfRlApLAkiQVNOMV9pdGVtX2QyaV9mcCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0lURU1fRFVQKSwJIkFTTjFfaXRlbV9kdXAifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9JVEVNX0VYX0NPTUJJTkVfTkVXKSwJIkFTTjFfSVRFTV9FWF9DT01CSU5FX05FVyJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJKSwJIkFTTjFfSVRFTV9FWF9EMkkifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9JVEVNX0kyRF9CSU8pLAkiQVNOMV9pdGVtX2kyZF9iaW8ifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9JVEVNX0kyRF9GUCksCSJBU04xX2l0ZW1faTJkX2ZwIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfSVRFTV9QQUNLKSwJIkFTTjFfaXRlbV9wYWNrIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfSVRFTV9TSUdOKSwJIkFTTjFfaXRlbV9zaWduIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfSVRFTV9VTlBBQ0spLAkiQVNOMV9pdGVtX3VucGFjayJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX0lURU1fVkVSSUZZKSwJIkFTTjFfaXRlbV92ZXJpZnkifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9NQlNUUklOR19OQ09QWSksCSJBU04xX21ic3RyaW5nX25jb3B5In0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfT0JKRUNUX05FVyksCSJBU04xX09CSkVDVF9uZXcifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9PVVRQVVRfREFUQSksCSJBU04xX09VVFBVVF9EQVRBIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfUEFDS19TVFJJTkcpLAkiQVNOMV9wYWNrX3N0cmluZyJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX1BDVFhfTkVXKSwJIkFTTjFfUENUWF9uZXcifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9QS0NTNV9QQkVfU0VUKSwJIkFTTjFfUEtDUzVfUEJFX1NFVCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX1NFUV9QQUNLKSwJIkFTTjFfc2VxX3BhY2sifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9TRVFfVU5QQUNLKSwJIkFTTjFfc2VxX3VucGFjayJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX1NJR04pLAkiQVNOMV9zaWduIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfU1RSMlRZUEUpLAkiQVNOMV9TVFIyVFlQRSJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX1NUUklOR19TRVQpLAkiQVNOMV9TVFJJTkdfc2V0In0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfU1RSSU5HX1RBQkxFX0FERCksCSJBU04xX1NUUklOR19UQUJMRV9hZGQifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9TVFJJTkdfVFlQRV9ORVcpLAkiQVNOMV9TVFJJTkdfdHlwZV9uZXcifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9URU1QTEFURV9FWF9EMkkpLAkiQVNOMV9URU1QTEFURV9FWF9EMkkifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9URU1QTEFURV9ORVcpLAkiQVNOMV9URU1QTEFURV9ORVcifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9URU1QTEFURV9OT0VYUF9EMkkpLAkiQVNOMV9URU1QTEFURV9OT0VYUF9EMkkifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9USU1FX0FESiksCSJBU04xX1RJTUVfYWRqIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfVElNRV9TRVQpLAkiQVNOMV9USU1FX3NldCJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX1RZUEVfR0VUX0lOVF9PQ1RFVFNUUklORyksCSJBU04xX1RZUEVfZ2V0X2ludF9vY3RldHN0cmluZyJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX1RZUEVfR0VUX09DVEVUU1RSSU5HKSwJIkFTTjFfVFlQRV9nZXRfb2N0ZXRzdHJpbmcifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9VTlBBQ0tfU1RSSU5HKSwJIkFTTjFfdW5wYWNrX3N0cmluZyJ9LAore0VSUl9GVU5DKEFTTjFfRl9BU04xX1VUQ1RJTUVfQURKKSwJIkFTTjFfVVRDVElNRV9hZGoifSwKK3tFUlJfRlVOQyhBU04xX0ZfQVNOMV9VVENUSU1FX1NFVCksCSJBU04xX1VUQ1RJTUVfc2V0In0sCit7RVJSX0ZVTkMoQVNOMV9GX0FTTjFfVkVSSUZZKSwJIkFTTjFfdmVyaWZ5In0sCit7RVJSX0ZVTkMoQVNOMV9GX0I2NF9SRUFEX0FTTjEpLAkiQjY0X1JFQURfQVNOMSJ9LAore0VSUl9GVU5DKEFTTjFfRl9CNjRfV1JJVEVfQVNOMSksCSJCNjRfV1JJVEVfQVNOMSJ9LAore0VSUl9GVU5DKEFTTjFfRl9CSU9fTkVXX05ERUYpLAkiQklPX25ld19OREVGIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0JJVFNUUl9DQiksCSJCSVRTVFJfQ0IifSwKK3tFUlJfRlVOQyhBU04xX0ZfQk5fVE9fQVNOMV9FTlVNRVJBVEVEKSwJIkJOX3RvX0FTTjFfRU5VTUVSQVRFRCJ9LAore0VSUl9GVU5DKEFTTjFfRl9CTl9UT19BU04xX0lOVEVHRVIpLAkiQk5fdG9fQVNOMV9JTlRFR0VSIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0MySV9BU04xX0JJVF9TVFJJTkcpLAkiYzJpX0FTTjFfQklUX1NUUklORyJ9LAore0VSUl9GVU5DKEFTTjFfRl9DMklfQVNOMV9JTlRFR0VSKSwJImMyaV9BU04xX0lOVEVHRVIifSwKK3tFUlJfRlVOQyhBU04xX0ZfQzJJX0FTTjFfT0JKRUNUKSwJImMyaV9BU04xX09CSkVDVCJ9LAore0VSUl9GVU5DKEFTTjFfRl9DT0xMRUNUX0RBVEEpLAkiQ09MTEVDVF9EQVRBIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9BU04xX0JJVF9TVFJJTkcpLAkiRDJJX0FTTjFfQklUX1NUUklORyJ9LAore0VSUl9GVU5DKEFTTjFfRl9EMklfQVNOMV9CT09MRUFOKSwJImQyaV9BU04xX0JPT0xFQU4ifSwKK3tFUlJfRlVOQyhBU04xX0ZfRDJJX0FTTjFfQllURVMpLAkiZDJpX0FTTjFfYnl0ZXMifSwKK3tFUlJfRlVOQyhBU04xX0ZfRDJJX0FTTjFfR0VORVJBTElaRURUSU1FKSwJIkQySV9BU04xX0dFTkVSQUxJWkVEVElNRSJ9LAore0VSUl9GVU5DKEFTTjFfRl9EMklfQVNOMV9IRUFERVIpLAkiRDJJX0FTTjFfSEVBREVSIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9BU04xX0lOVEVHRVIpLAkiRDJJX0FTTjFfSU5URUdFUiJ9LAore0VSUl9GVU5DKEFTTjFfRl9EMklfQVNOMV9PQkpFQ1QpLAkiZDJpX0FTTjFfT0JKRUNUIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9BU04xX1NFVCksCSJkMmlfQVNOMV9TRVQifSwKK3tFUlJfRlVOQyhBU04xX0ZfRDJJX0FTTjFfVFlQRV9CWVRFUyksCSJkMmlfQVNOMV90eXBlX2J5dGVzIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9BU04xX1VJTlRFR0VSKSwJImQyaV9BU04xX1VJTlRFR0VSIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9BU04xX1VUQ1RJTUUpLAkiRDJJX0FTTjFfVVRDVElNRSJ9LAore0VSUl9GVU5DKEFTTjFfRl9EMklfQVVUT1BSSVZBVEVLRVkpLAkiZDJpX0F1dG9Qcml2YXRlS2V5In0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9ORVRTQ0FQRV9SU0EpLAkiZDJpX05ldHNjYXBlX1JTQSJ9LAore0VSUl9GVU5DKEFTTjFfRl9EMklfTkVUU0NBUEVfUlNBXzIpLAkiRDJJX05FVFNDQVBFX1JTQV8yIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9QUklWQVRFS0VZKSwJImQyaV9Qcml2YXRlS2V5In0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9QVUJMSUNLRVkpLAkiZDJpX1B1YmxpY0tleSJ9LAore0VSUl9GVU5DKEFTTjFfRl9EMklfUlNBX05FVCksCSJkMmlfUlNBX05FVCJ9LAore0VSUl9GVU5DKEFTTjFfRl9EMklfUlNBX05FVF8yKSwJIkQySV9SU0FfTkVUXzIifSwKK3tFUlJfRlVOQyhBU04xX0ZfRDJJX1g1MDkpLAkiRDJJX1g1MDkifSwKK3tFUlJfRlVOQyhBU04xX0ZfRDJJX1g1MDlfQ0lORiksCSJEMklfWDUwOV9DSU5GIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0QySV9YNTA5X1BLRVkpLAkiZDJpX1g1MDlfUEtFWSJ9LAore0VSUl9GVU5DKEFTTjFfRl9JMkRfQVNOMV9CSU9fU1RSRUFNKSwJImkyZF9BU04xX2Jpb19zdHJlYW0ifSwKK3tFUlJfRlVOQyhBU04xX0ZfSTJEX0FTTjFfU0VUKSwJImkyZF9BU04xX1NFVCJ9LAore0VSUl9GVU5DKEFTTjFfRl9JMkRfQVNOMV9USU1FKSwJIkkyRF9BU04xX1RJTUUifSwKK3tFUlJfRlVOQyhBU04xX0ZfSTJEX0RTQV9QVUJLRVkpLAkiaTJkX0RTQV9QVUJLRVkifSwKK3tFUlJfRlVOQyhBU04xX0ZfSTJEX0VDX1BVQktFWSksCSJpMmRfRUNfUFVCS0VZIn0sCit7RVJSX0ZVTkMoQVNOMV9GX0kyRF9QUklWQVRFS0VZKSwJImkyZF9Qcml2YXRlS2V5In0sCit7RVJSX0ZVTkMoQVNOMV9GX0kyRF9QVUJMSUNLRVkpLAkiaTJkX1B1YmxpY0tleSJ9LAore0VSUl9GVU5DKEFTTjFfRl9JMkRfUlNBX05FVCksCSJpMmRfUlNBX05FVCJ9LAore0VSUl9GVU5DKEFTTjFfRl9JMkRfUlNBX1BVQktFWSksCSJpMmRfUlNBX1BVQktFWSJ9LAore0VSUl9GVU5DKEFTTjFfRl9MT05HX0MySSksCSJMT05HX0MySSJ9LAore0VSUl9GVU5DKEFTTjFfRl9PSURfTU9EVUxFX0lOSVQpLAkiT0lEX01PRFVMRV9JTklUIn0sCit7RVJSX0ZVTkMoQVNOMV9GX1BBUlNFX1RBR0dJTkcpLAkiUEFSU0VfVEFHR0lORyJ9LAore0VSUl9GVU5DKEFTTjFfRl9QS0NTNV9QQkUyX1NFVF9JViksCSJQS0NTNV9wYmUyX3NldF9pdiJ9LAore0VSUl9GVU5DKEFTTjFfRl9QS0NTNV9QQkVfU0VUKSwJIlBLQ1M1X3BiZV9zZXQifSwKK3tFUlJfRlVOQyhBU04xX0ZfUEtDUzVfUEJFX1NFVDBfQUxHT1IpLAkiUEtDUzVfcGJlX3NldDBfYWxnb3IifSwKK3tFUlJfRlVOQyhBU04xX0ZfU01JTUVfUkVBRF9BU04xKSwJIlNNSU1FX3JlYWRfQVNOMSJ9LAore0VSUl9GVU5DKEFTTjFfRl9TTUlNRV9URVhUKSwJIlNNSU1FX3RleHQifSwKK3tFUlJfRlVOQyhBU04xX0ZfWDUwOV9DSU5GX05FVyksCSJYNTA5X0NJTkZfTkVXIn0sCit7RVJSX0ZVTkMoQVNOMV9GX1g1MDlfQ1JMX0FERDBfUkVWT0tFRCksCSJYNTA5X0NSTF9hZGQwX3Jldm9rZWQifSwKK3tFUlJfRlVOQyhBU04xX0ZfWDUwOV9JTkZPX05FVyksCSJYNTA5X0lORk9fbmV3In0sCit7RVJSX0ZVTkMoQVNOMV9GX1g1MDlfTkFNRV9FTkNPREUpLAkiWDUwOV9OQU1FX0VOQ09ERSJ9LAore0VSUl9GVU5DKEFTTjFfRl9YNTA5X05BTUVfRVhfRDJJKSwJIlg1MDlfTkFNRV9FWF9EMkkifSwKK3tFUlJfRlVOQyhBU04xX0ZfWDUwOV9OQU1FX0VYX05FVyksCSJYNTA5X05BTUVfRVhfTkVXIn0sCit7RVJSX0ZVTkMoQVNOMV9GX1g1MDlfTkVXKSwJIlg1MDlfTkVXIn0sCit7RVJSX0ZVTkMoQVNOMV9GX1g1MDlfUEtFWV9ORVcpLAkiWDUwOV9QS0VZX25ldyJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEFTTjFfc3RyX3JlYXNvbnNbXT0KKwl7Cit7RVJSX1JFQVNPTihBU04xX1JfQURESU5HX09CSkVDVCkgICAgICAgICwiYWRkaW5nIG9iamVjdCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0FTTjFfUEFSU0VfRVJST1IpICAgICAsImFzbjEgcGFyc2UgZXJyb3IifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9BU04xX1NJR19QQVJTRV9FUlJPUikgLCJhc24xIHNpZyBwYXJzZSBlcnJvciJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0FVWF9FUlJPUikgICAgICAgICAgICAsImF1eCBlcnJvciJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0JBRF9DTEFTUykgICAgICAgICAgICAsImJhZCBjbGFzcyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0JBRF9PQkpFQ1RfSEVBREVSKSAgICAsImJhZCBvYmplY3QgaGVhZGVyIn0sCit7RVJSX1JFQVNPTihBU04xX1JfQkFEX1BBU1NXT1JEX1JFQUQpICAgICwiYmFkIHBhc3N3b3JkIHJlYWQifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9CQURfVEFHKSAgICAgICAgICAgICAgLCJiYWQgdGFnIn0sCit7RVJSX1JFQVNPTihBU04xX1JfQk1QU1RSSU5HX0lTX1dST05HX0xFTkdUSCksImJtcHN0cmluZyBpcyB3cm9uZyBsZW5ndGgifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9CTl9MSUIpICAgICAgICAgICAgICAgLCJibiBsaWIifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9CT09MRUFOX0lTX1dST05HX0xFTkdUSCksImJvb2xlYW4gaXMgd3JvbmcgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihBU04xX1JfQlVGRkVSX1RPT19TTUFMTCkgICAgICwiYnVmZmVyIHRvbyBzbWFsbCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0NJUEhFUl9IQVNfTk9fT0JKRUNUX0lERU5USUZJRVIpLCJjaXBoZXIgaGFzIG5vIG9iamVjdCBpZGVudGlmaWVyIn0sCit7RVJSX1JFQVNPTihBU04xX1JfREFUQV9JU19XUk9ORykgICAgICAgICwiZGF0YSBpcyB3cm9uZyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0RFQ09ERV9FUlJPUikgICAgICAgICAsImRlY29kZSBlcnJvciJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0RFQ09ESU5HX0VSUk9SKSAgICAgICAsImRlY29kaW5nIGVycm9yIn0sCit7RVJSX1JFQVNPTihBU04xX1JfREVQVEhfRVhDRUVERUQpICAgICAgICwiZGVwdGggZXhjZWVkZWQifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9ESUdFU1RfQU5EX0tFWV9UWVBFX05PVF9TVVBQT1JURUQpLCJkaWdlc3QgYW5kIGtleSB0eXBlIG5vdCBzdXBwb3J0ZWQifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9FTkNPREVfRVJST1IpICAgICAgICAgLCJlbmNvZGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9FUlJPUl9HRVRUSU5HX1RJTUUpICAgLCJlcnJvciBnZXR0aW5nIHRpbWUifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9FUlJPUl9MT0FESU5HX1NFQ1RJT04pLCJlcnJvciBsb2FkaW5nIHNlY3Rpb24ifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9FUlJPUl9QQVJTSU5HX1NFVF9FTEVNRU5UKSwiZXJyb3IgcGFyc2luZyBzZXQgZWxlbWVudCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0VSUk9SX1NFVFRJTkdfQ0lQSEVSX1BBUkFNUyksImVycm9yIHNldHRpbmcgY2lwaGVyIHBhcmFtcyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0VYUEVDVElOR19BTl9JTlRFR0VSKSAsImV4cGVjdGluZyBhbiBpbnRlZ2VyIn0sCit7RVJSX1JFQVNPTihBU04xX1JfRVhQRUNUSU5HX0FOX09CSkVDVCkgICwiZXhwZWN0aW5nIGFuIG9iamVjdCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0VYUEVDVElOR19BX0JPT0xFQU4pICAsImV4cGVjdGluZyBhIGJvb2xlYW4ifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9FWFBFQ1RJTkdfQV9USU1FKSAgICAgLCJleHBlY3RpbmcgYSB0aW1lIn0sCit7RVJSX1JFQVNPTihBU04xX1JfRVhQTElDSVRfTEVOR1RIX01JU01BVENIKSwiZXhwbGljaXQgbGVuZ3RoIG1pc21hdGNoIn0sCit7RVJSX1JFQVNPTihBU04xX1JfRVhQTElDSVRfVEFHX05PVF9DT05TVFJVQ1RFRCksImV4cGxpY2l0IHRhZyBub3QgY29uc3RydWN0ZWQifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9GSUVMRF9NSVNTSU5HKSAgICAgICAgLCJmaWVsZCBtaXNzaW5nIn0sCit7RVJSX1JFQVNPTihBU04xX1JfRklSU1RfTlVNX1RPT19MQVJHRSkgICwiZmlyc3QgbnVtIHRvbyBsYXJnZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0hFQURFUl9UT09fTE9ORykgICAgICAsImhlYWRlciB0b28gbG9uZyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lMTEVHQUxfQklUU1RSSU5HX0ZPUk1BVCksImlsbGVnYWwgYml0c3RyaW5nIGZvcm1hdCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lMTEVHQUxfQk9PTEVBTikgICAgICAsImlsbGVnYWwgYm9vbGVhbiJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lMTEVHQUxfQ0hBUkFDVEVSUykgICAsImlsbGVnYWwgY2hhcmFjdGVycyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lMTEVHQUxfRk9STUFUKSAgICAgICAsImlsbGVnYWwgZm9ybWF0In0sCit7RVJSX1JFQVNPTihBU04xX1JfSUxMRUdBTF9IRVgpICAgICAgICAgICwiaWxsZWdhbCBoZXgifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9JTExFR0FMX0lNUExJQ0lUX1RBRykgLCJpbGxlZ2FsIGltcGxpY2l0IHRhZyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lMTEVHQUxfSU5URUdFUikgICAgICAsImlsbGVnYWwgaW50ZWdlciJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lMTEVHQUxfTkVTVEVEX1RBR0dJTkcpLCJpbGxlZ2FsIG5lc3RlZCB0YWdnaW5nIn0sCit7RVJSX1JFQVNPTihBU04xX1JfSUxMRUdBTF9OVUxMKSAgICAgICAgICwiaWxsZWdhbCBudWxsIn0sCit7RVJSX1JFQVNPTihBU04xX1JfSUxMRUdBTF9OVUxMX1ZBTFVFKSAgICwiaWxsZWdhbCBudWxsIHZhbHVlIn0sCit7RVJSX1JFQVNPTihBU04xX1JfSUxMRUdBTF9PQkpFQ1QpICAgICAgICwiaWxsZWdhbCBvYmplY3QifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9JTExFR0FMX09QVElPTkFMX0FOWSkgLCJpbGxlZ2FsIG9wdGlvbmFsIGFueSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFKSwiaWxsZWdhbCBvcHRpb25zIG9uIGl0ZW0gdGVtcGxhdGUifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9JTExFR0FMX1RBR0dFRF9BTlkpICAgLCJpbGxlZ2FsIHRhZ2dlZCBhbnkifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9JTExFR0FMX1RJTUVfVkFMVUUpICAgLCJpbGxlZ2FsIHRpbWUgdmFsdWUifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9JTlRFR0VSX05PVF9BU0NJSV9GT1JNQVQpLCJpbnRlZ2VyIG5vdCBhc2NpaSBmb3JtYXQifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9JTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9ORyksImludGVnZXIgdG9vIGxhcmdlIGZvciBsb25nIn0sCit7RVJSX1JFQVNPTihBU04xX1JfSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RIKSwiaW52YWxpZCBibXBzdHJpbmcgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihBU04xX1JfSU5WQUxJRF9ESUdJVCkgICAgICAgICwiaW52YWxpZCBkaWdpdCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lOVkFMSURfTUlNRV9UWVBFKSAgICAsImludmFsaWQgbWltZSB0eXBlIn0sCit7RVJSX1JFQVNPTihBU04xX1JfSU5WQUxJRF9NT0RJRklFUikgICAgICwiaW52YWxpZCBtb2RpZmllciJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lOVkFMSURfTlVNQkVSKSAgICAgICAsImludmFsaWQgbnVtYmVyIn0sCit7RVJSX1JFQVNPTihBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcpLCJpbnZhbGlkIG9iamVjdCBlbmNvZGluZyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lOVkFMSURfU0VQQVJBVE9SKSAgICAsImludmFsaWQgc2VwYXJhdG9yIn0sCit7RVJSX1JFQVNPTihBU04xX1JfSU5WQUxJRF9USU1FX0ZPUk1BVCkgICwiaW52YWxpZCB0aW1lIGZvcm1hdCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lOVkFMSURfVU5JVkVSU0FMU1RSSU5HX0xFTkdUSCksImludmFsaWQgdW5pdmVyc2Fsc3RyaW5nIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lOVkFMSURfVVRGOFNUUklORykgICAsImludmFsaWQgdXRmOHN0cmluZyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0lWX1RPT19MQVJHRSkgICAgICAgICAsIml2IHRvbyBsYXJnZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0xFTkdUSF9FUlJPUikgICAgICAgICAsImxlbmd0aCBlcnJvciJ9LAore0VSUl9SRUFTT04oQVNOMV9SX0xJU1RfRVJST1IpICAgICAgICAgICAsImxpc3QgZXJyb3IifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9NSU1FX05PX0NPTlRFTlRfVFlQRSkgLCJtaW1lIG5vIGNvbnRlbnQgdHlwZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX01JTUVfUEFSU0VfRVJST1IpICAgICAsIm1pbWUgcGFyc2UgZXJyb3IifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9NSU1FX1NJR19QQVJTRV9FUlJPUikgLCJtaW1lIHNpZyBwYXJzZSBlcnJvciJ9LAore0VSUl9SRUFTT04oQVNOMV9SX01JU1NJTkdfRU9DKSAgICAgICAgICAsIm1pc3NpbmcgZW9jIn0sCit7RVJSX1JFQVNPTihBU04xX1JfTUlTU0lOR19TRUNPTkRfTlVNQkVSKSwibWlzc2luZyBzZWNvbmQgbnVtYmVyIn0sCit7RVJSX1JFQVNPTihBU04xX1JfTUlTU0lOR19WQUxVRSkgICAgICAgICwibWlzc2luZyB2YWx1ZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX01TVFJJTkdfTk9UX1VOSVZFUlNBTCksIm1zdHJpbmcgbm90IHVuaXZlcnNhbCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX01TVFJJTkdfV1JPTkdfVEFHKSAgICAsIm1zdHJpbmcgd3JvbmcgdGFnIn0sCit7RVJSX1JFQVNPTihBU04xX1JfTkVTVEVEX0FTTjFfU1RSSU5HKSAgICwibmVzdGVkIGFzbjEgc3RyaW5nIn0sCit7RVJSX1JFQVNPTihBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKSAgICwibm9uIGhleCBjaGFyYWN0ZXJzIn0sCit7RVJSX1JFQVNPTihBU04xX1JfTk9UX0FTQ0lJX0ZPUk1BVCkgICAgICwibm90IGFzY2lpIGZvcm1hdCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX05PVF9FTk9VR0hfREFUQSkgICAgICAsIm5vdCBlbm91Z2ggZGF0YSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX05PX0NPTlRFTlRfVFlQRSkgICAgICAsIm5vIGNvbnRlbnQgdHlwZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX05PX0RFRkFVTFRfRElHRVNUKSAgICAsIm5vIGRlZmF1bHQgZGlnZXN0In0sCit7RVJSX1JFQVNPTihBU04xX1JfTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEUpLCJubyBtYXRjaGluZyBjaG9pY2UgdHlwZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX05PX01VTFRJUEFSVF9CT0RZX0ZBSUxVUkUpLCJubyBtdWx0aXBhcnQgYm9keSBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihBU04xX1JfTk9fTVVMVElQQVJUX0JPVU5EQVJZKSwibm8gbXVsdGlwYXJ0IGJvdW5kYXJ5In0sCit7RVJSX1JFQVNPTihBU04xX1JfTk9fU0lHX0NPTlRFTlRfVFlQRSkgICwibm8gc2lnIGNvbnRlbnQgdHlwZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX05VTExfSVNfV1JPTkdfTEVOR1RIKSAsIm51bGwgaXMgd3JvbmcgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihBU04xX1JfT0JKRUNUX05PVF9BU0NJSV9GT1JNQVQpLCJvYmplY3Qgbm90IGFzY2lpIGZvcm1hdCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX09ERF9OVU1CRVJfT0ZfQ0hBUlMpICAsIm9kZCBudW1iZXIgb2YgY2hhcnMifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9QUklWQVRFX0tFWV9IRUFERVJfTUlTU0lORyksInByaXZhdGUga2V5IGhlYWRlciBtaXNzaW5nIn0sCit7RVJSX1JFQVNPTihBU04xX1JfU0VDT05EX05VTUJFUl9UT09fTEFSR0UpLCJzZWNvbmQgbnVtYmVyIHRvbyBsYXJnZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1NFUVVFTkNFX0xFTkdUSF9NSVNNQVRDSCksInNlcXVlbmNlIGxlbmd0aCBtaXNtYXRjaCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1NFUVVFTkNFX05PVF9DT05TVFJVQ1RFRCksInNlcXVlbmNlIG5vdCBjb25zdHJ1Y3RlZCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1NFUVVFTkNFX09SX1NFVF9ORUVEU19DT05GSUcpLCJzZXF1ZW5jZSBvciBzZXQgbmVlZHMgY29uZmlnIn0sCit7RVJSX1JFQVNPTihBU04xX1JfU0hPUlRfTElORSkgICAgICAgICAgICwic2hvcnQgbGluZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1NJR19JTlZBTElEX01JTUVfVFlQRSksInNpZyBpbnZhbGlkIG1pbWUgdHlwZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1NUUkVBTUlOR19OT1RfU1VQUE9SVEVEKSwic3RyZWFtaW5nIG5vdCBzdXBwb3J0ZWQifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9TVFJJTkdfVE9PX0xPTkcpICAgICAgLCJzdHJpbmcgdG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9TVFJJTkdfVE9PX1NIT1JUKSAgICAgLCJzdHJpbmcgdG9vIHNob3J0In0sCit7RVJSX1JFQVNPTihBU04xX1JfVEFHX1ZBTFVFX1RPT19ISUdIKSAgICwidGFnIHZhbHVlIHRvbyBoaWdoIn0sCit7RVJSX1JFQVNPTihBU04xX1JfVEhFX0FTTjFfT0JKRUNUX0lERU5USUZJRVJfSVNfTk9UX0tOT1dOX0ZPUl9USElTX01EKSwidGhlIGFzbjEgb2JqZWN0IGlkZW50aWZpZXIgaXMgbm90IGtub3duIGZvciB0aGlzIG1kIn0sCit7RVJSX1JFQVNPTihBU04xX1JfVElNRV9OT1RfQVNDSUlfRk9STUFUKSwidGltZSBub3QgYXNjaWkgZm9ybWF0In0sCit7RVJSX1JFQVNPTihBU04xX1JfVE9PX0xPTkcpICAgICAgICAgICAgICwidG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9UWVBFX05PVF9DT05TVFJVQ1RFRCkgLCJ0eXBlIG5vdCBjb25zdHJ1Y3RlZCJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1VOQUJMRV9UT19ERUNPREVfUlNBX0tFWSksInVuYWJsZSB0byBkZWNvZGUgcnNhIGtleSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1VOQUJMRV9UT19ERUNPREVfUlNBX1BSSVZBVEVfS0VZKSwidW5hYmxlIHRvIGRlY29kZSByc2EgcHJpdmF0ZSBrZXkifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9VTkVYUEVDVEVEX0VPQykgICAgICAgLCJ1bmV4cGVjdGVkIGVvYyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1VOSVZFUlNBTFNUUklOR19JU19XUk9OR19MRU5HVEgpLCJ1bml2ZXJzYWxzdHJpbmcgaXMgd3JvbmcgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihBU04xX1JfVU5LTk9XTl9GT1JNQVQpICAgICAgICwidW5rbm93biBmb3JtYXQifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9VTktOT1dOX01FU1NBR0VfRElHRVNUX0FMR09SSVRITSksInVua25vd24gbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIn0sCit7RVJSX1JFQVNPTihBU04xX1JfVU5LTk9XTl9PQkpFQ1RfVFlQRSkgICwidW5rbm93biBvYmplY3QgdHlwZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1VOS05PV05fUFVCTElDX0tFWV9UWVBFKSwidW5rbm93biBwdWJsaWMga2V5IHR5cGUifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0pLCJ1bmtub3duIHNpZ25hdHVyZSBhbGdvcml0aG0ifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9VTktOT1dOX1RBRykgICAgICAgICAgLCJ1bmtub3duIHRhZyJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1VOS09XTl9GT1JNQVQpICAgICAgICAsInVua293biBmb3JtYXQifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9VTlNVUFBPUlRFRF9BTllfREVGSU5FRF9CWV9UWVBFKSwidW5zdXBwb3J0ZWQgYW55IGRlZmluZWQgYnkgdHlwZSJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1VOU1VQUE9SVEVEX0NJUEhFUikgICAsInVuc3VwcG9ydGVkIGNpcGhlciJ9LAore0VSUl9SRUFTT04oQVNOMV9SX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT05fQUxHT1JJVEhNKSwidW5zdXBwb3J0ZWQgZW5jcnlwdGlvbiBhbGdvcml0aG0ifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUpLCJ1bnN1cHBvcnRlZCBwdWJsaWMga2V5IHR5cGUifSwKK3tFUlJfUkVBU09OKEFTTjFfUl9VTlNVUFBPUlRFRF9UWVBFKSAgICAgLCJ1bnN1cHBvcnRlZCB0eXBlIn0sCit7RVJSX1JFQVNPTihBU04xX1JfV1JPTkdfUFVCTElDX0tFWV9UWVBFKSwid3JvbmcgcHVibGljIGtleSB0eXBlIn0sCit7RVJSX1JFQVNPTihBU04xX1JfV1JPTkdfVEFHKSAgICAgICAgICAgICwid3JvbmcgdGFnIn0sCit7RVJSX1JFQVNPTihBU04xX1JfV1JPTkdfVFlQRSkgICAgICAgICAgICwid3JvbmcgdHlwZSJ9LAorezAsTlVMTH0KKwl9OworCisjZW5kaWYKKwordm9pZCBFUlJfbG9hZF9BU04xX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKEFTTjFfc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsQVNOMV9zdHJfZnVuY3RzKTsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLEFTTjFfc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hc24xX2dlbi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMV9nZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmMyNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMV9nZW4uYwpAQCAtMCwwICsxLDg1NCBAQAorLyogYXNuMV9nZW4uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDIuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2RlZmluZSBBU04xX0dFTl9GTEFHCQkweDEwMDAwCisjZGVmaW5lIEFTTjFfR0VOX0ZMQUdfSU1QCShBU04xX0dFTl9GTEFHfDEpCisjZGVmaW5lIEFTTjFfR0VOX0ZMQUdfRVhQCShBU04xX0dFTl9GTEFHfDIpCisjZGVmaW5lIEFTTjFfR0VOX0ZMQUdfVEFHCShBU04xX0dFTl9GTEFHfDMpCisjZGVmaW5lIEFTTjFfR0VOX0ZMQUdfQklUV1JBUAkoQVNOMV9HRU5fRkxBR3w0KQorI2RlZmluZSBBU04xX0dFTl9GTEFHX09DVFdSQVAJKEFTTjFfR0VOX0ZMQUd8NSkKKyNkZWZpbmUgQVNOMV9HRU5fRkxBR19TRVFXUkFQCShBU04xX0dFTl9GTEFHfDYpCisjZGVmaW5lIEFTTjFfR0VOX0ZMQUdfU0VUV1JBUAkoQVNOMV9HRU5fRkxBR3w3KQorI2RlZmluZSBBU04xX0dFTl9GTEFHX0ZPUk1BVAkoQVNOMV9HRU5fRkxBR3w4KQorCisjZGVmaW5lIEFTTjFfR0VOX1NUUihzdHIsdmFsKQl7c3RyLCBzaXplb2Yoc3RyKSAtIDEsIHZhbH0KKworI2RlZmluZSBBU04xX0ZMQUdfRVhQX01BWAkyMAorCisvKiBJbnB1dCBmb3JtYXRzICovCisKKy8qIEFTQ0lJOiBkZWZhdWx0ICovCisjZGVmaW5lIEFTTjFfR0VOX0ZPUk1BVF9BU0NJSQkxCisvKiBVVEY4ICovCisjZGVmaW5lIEFTTjFfR0VOX0ZPUk1BVF9VVEY4CTIKKy8qIEhleCAqLworI2RlZmluZSBBU04xX0dFTl9GT1JNQVRfSEVYCTMKKy8qIExpc3Qgb2YgYml0cyAqLworI2RlZmluZSBBU04xX0dFTl9GT1JNQVRfQklUTElTVAk0CisKKworc3RydWN0IHRhZ19uYW1lX3N0CisJeworCWNvbnN0IGNoYXIgKnN0cm5hbTsKKwlpbnQgbGVuOworCWludCB0YWc7CisJfTsKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJaW50IGV4cF90YWc7CisJaW50IGV4cF9jbGFzczsKKwlpbnQgZXhwX2NvbnN0cnVjdGVkOworCWludCBleHBfcGFkOworCWxvbmcgZXhwX2xlbjsKKwl9IHRhZ19leHBfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJaW50IGltcF90YWc7CisJaW50IGltcF9jbGFzczsKKwlpbnQgdXR5cGU7CisJaW50IGZvcm1hdDsKKwljb25zdCBjaGFyICpzdHI7CisJdGFnX2V4cF90eXBlIGV4cF9saXN0W0FTTjFfRkxBR19FWFBfTUFYXTsKKwlpbnQgZXhwX2NvdW50OworCX0gdGFnX2V4cF9hcmc7CisKK3N0YXRpYyBpbnQgYml0c3RyX2NiKGNvbnN0IGNoYXIgKmVsZW0sIGludCBsZW4sIHZvaWQgKmJpdHN0cik7CitzdGF0aWMgaW50IGFzbjFfY2IoY29uc3QgY2hhciAqZWxlbSwgaW50IGxlbiwgdm9pZCAqYml0c3RyKTsKK3N0YXRpYyBpbnQgYXBwZW5kX2V4cCh0YWdfZXhwX2FyZyAqYXJnLCBpbnQgZXhwX3RhZywgaW50IGV4cF9jbGFzcywgaW50IGV4cF9jb25zdHJ1Y3RlZCwgaW50IGV4cF9wYWQsIGludCBpbXBfb2spOworc3RhdGljIGludCBwYXJzZV90YWdnaW5nKGNvbnN0IGNoYXIgKnZzdGFydCwgaW50IHZsZW4sIGludCAqcHRhZywgaW50ICpwY2xhc3MpOworc3RhdGljIEFTTjFfVFlQRSAqYXNuMV9tdWx0aShpbnQgdXR5cGUsIGNvbnN0IGNoYXIgKnNlY3Rpb24sIFg1MDlWM19DVFggKmNuZik7CitzdGF0aWMgQVNOMV9UWVBFICphc24xX3N0cjJ0eXBlKGNvbnN0IGNoYXIgKnN0ciwgaW50IGZvcm1hdCwgaW50IHV0eXBlKTsKK3N0YXRpYyBpbnQgYXNuMV9zdHIydGFnKGNvbnN0IGNoYXIgKnRhZ3N0ciwgaW50IGxlbik7CisKK0FTTjFfVFlQRSAqQVNOMV9nZW5lcmF0ZV9uY29uZihjaGFyICpzdHIsIENPTkYgKm5jb25mKQorCXsKKwlYNTA5VjNfQ1RYIGNuZjsKKworCWlmICghbmNvbmYpCisJCXJldHVybiBBU04xX2dlbmVyYXRlX3YzKHN0ciwgTlVMTCk7CisKKwlYNTA5VjNfc2V0X25jb25mKCZjbmYsIG5jb25mKTsKKwlyZXR1cm4gQVNOMV9nZW5lcmF0ZV92MyhzdHIsICZjbmYpOworCX0KKworQVNOMV9UWVBFICpBU04xX2dlbmVyYXRlX3YzKGNoYXIgKnN0ciwgWDUwOVYzX0NUWCAqY25mKQorCXsKKwlBU04xX1RZUEUgKnJldDsKKwl0YWdfZXhwX2FyZyBhc24xX3RhZ3M7CisJdGFnX2V4cF90eXBlICpldG1wOworCisJaW50IGksIGxlbjsKKworCXVuc2lnbmVkIGNoYXIgKm9yaWdfZGVyID0gTlVMTCwgKm5ld19kZXIgPSBOVUxMOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNweV9zdGFydDsKKwl1bnNpZ25lZCBjaGFyICpwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwOworCWludCBjcHlfbGVuOworCWxvbmcgaGRyX2xlbjsKKwlpbnQgaGRyX2NvbnN0cnVjdGVkID0gMCwgaGRyX3RhZywgaGRyX2NsYXNzOworCWludCByOworCisJYXNuMV90YWdzLmltcF90YWcgPSAtMTsKKwlhc24xX3RhZ3MuaW1wX2NsYXNzID0gLTE7CisJYXNuMV90YWdzLmZvcm1hdCA9IEFTTjFfR0VOX0ZPUk1BVF9BU0NJSTsKKwlhc24xX3RhZ3MuZXhwX2NvdW50ID0gMDsKKwlpZiAoQ09ORl9wYXJzZV9saXN0KHN0ciwgJywnLCAxLCBhc24xX2NiLCAmYXNuMV90YWdzKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoYXNuMV90YWdzLnV0eXBlID09IFZfQVNOMV9TRVFVRU5DRSkgfHwgKGFzbjFfdGFncy51dHlwZSA9PSBWX0FTTjFfU0VUKSkKKwkJeworCQlpZiAoIWNuZikKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfR0VORVJBVEVfVjMsIEFTTjFfUl9TRVFVRU5DRV9PUl9TRVRfTkVFRFNfQ09ORklHKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQlyZXQgPSBhc24xX211bHRpKGFzbjFfdGFncy51dHlwZSwgYXNuMV90YWdzLnN0ciwgY25mKTsKKwkJfQorCWVsc2UKKwkJcmV0ID0gYXNuMV9zdHIydHlwZShhc24xX3RhZ3Muc3RyLCBhc24xX3RhZ3MuZm9ybWF0LCBhc24xX3RhZ3MudXR5cGUpOworCisJaWYgKCFyZXQpCisJCXJldHVybiBOVUxMOworCisJLyogSWYgbm8gdGFnZ2luZyByZXR1cm4gYmFzZSB0eXBlICovCisJaWYgKChhc24xX3RhZ3MuaW1wX3RhZyA9PSAtMSkgJiYgKGFzbjFfdGFncy5leHBfY291bnQgPT0gMCkpCisJCXJldHVybiByZXQ7CisKKwkvKiBHZW5lcmF0ZSB0aGUgZW5jb2RpbmcgKi8KKwljcHlfbGVuID0gaTJkX0FTTjFfVFlQRShyZXQsICZvcmlnX2Rlcik7CisJQVNOMV9UWVBFX2ZyZWUocmV0KTsKKwlyZXQgPSBOVUxMOworCS8qIFNldCBwb2ludCB0byBzdGFydCBjb3B5aW5nIGZvciBtb2RpZmllZCBlbmNvZGluZyAqLworCWNweV9zdGFydCA9IG9yaWdfZGVyOworCisJLyogRG8gd2UgbmVlZCBJTVBMSUNJVCB0YWdnaW5nPyAqLworCWlmIChhc24xX3RhZ3MuaW1wX3RhZyAhPSAtMSkKKwkJeworCQkvKiBJZiBJTVBMSUNJVCB3ZSB3aWxsIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgdGFnICovCisJCS8qIFNraXAgZXhpc3RpbmcgdGFnK2xlbiAqLworCQlyID0gQVNOMV9nZXRfb2JqZWN0KCZjcHlfc3RhcnQsICZoZHJfbGVuLCAmaGRyX3RhZywgJmhkcl9jbGFzcywgY3B5X2xlbik7CisJCWlmIChyICYgMHg4MCkKKwkJCWdvdG8gZXJyOworCQkvKiBVcGRhdGUgY29weSBsZW5ndGggKi8KKwkJY3B5X2xlbiAtPSBjcHlfc3RhcnQgLSBvcmlnX2RlcjsKKwkJLyogRm9yIElNUExJQ0lUIHRhZ2dpbmcgdGhlIGxlbmd0aCBzaG91bGQgbWF0Y2ggdGhlCisJCSAqIG9yaWdpbmFsIGxlbmd0aCBhbmQgY29uc3RydWN0ZWQgZmxhZyBzaG91bGQgYmUKKwkJICogY29uc2lzdGVudC4KKwkJICovCisJCWlmIChyICYgMHgxKQorCQkJeworCQkJLyogSW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgKi8KKwkJCWhkcl9jb25zdHJ1Y3RlZCA9IDI7CisJCQloZHJfbGVuID0gMDsKKwkJCX0KKwkJZWxzZQorCQkJLyogSnVzdCByZXRhaW4gY29uc3RydWN0ZWQgZmxhZyAqLworCQkJaGRyX2NvbnN0cnVjdGVkID0gciAmIFZfQVNOMV9DT05TVFJVQ1RFRDsKKwkJLyogV29yayBvdXQgbmV3IGxlbmd0aCB3aXRoIElNUExJQ0lUIHRhZzogaWdub3JlIGNvbnN0cnVjdGVkCisJCSAqIGJlY2F1c2UgaXQgd2lsbCBtZXNzIHVwIGlmIGluZGVmaW5pdGUgbGVuZ3RoCisJCSAqLworCQlsZW4gPSBBU04xX29iamVjdF9zaXplKDAsIGhkcl9sZW4sIGFzbjFfdGFncy5pbXBfdGFnKTsKKwkJfQorCWVsc2UKKwkJbGVuID0gY3B5X2xlbjsKKworCS8qIFdvcmsgb3V0IGxlbmd0aCBpbiBhbnkgRVhQTElDSVQsIHN0YXJ0aW5nIGZyb20gZW5kICovCisKKwlmb3IoaSA9IDAsIGV0bXAgPSBhc24xX3RhZ3MuZXhwX2xpc3QgKyBhc24xX3RhZ3MuZXhwX2NvdW50IC0gMTsgaSA8IGFzbjFfdGFncy5leHBfY291bnQ7IGkrKywgZXRtcC0tKQorCQl7CisJCS8qIENvbnRlbnQgbGVuZ3RoOiBudW1iZXIgb2YgY29udGVudCBvY3RldHMgKyBhbnkgcGFkZGluZyAqLworCQlsZW4gKz0gZXRtcC0+ZXhwX3BhZDsKKwkJZXRtcC0+ZXhwX2xlbiA9IGxlbjsKKwkJLyogVG90YWwgb2JqZWN0IGxlbmd0aDogbGVuZ3RoIGluY2x1ZGluZyBuZXcgaGVhZGVyICovCisJCWxlbiA9IEFTTjFfb2JqZWN0X3NpemUoMCwgbGVuLCBldG1wLT5leHBfdGFnKTsKKwkJfQorCisJLyogQWxsb2NhdGUgYnVmZmVyIGZvciBuZXcgZW5jb2RpbmcgKi8KKworCW5ld19kZXIgPSBPUEVOU1NMX21hbGxvYyhsZW4pOworCWlmICghbmV3X2RlcikKKwkJZ290byBlcnI7CisKKwkvKiBHZW5lcmF0ZSB0YWdnZWQgZW5jb2RpbmcgKi8KKworCXAgPSBuZXdfZGVyOworCisJLyogT3V0cHV0IGV4cGxpY2l0IHRhZ3MgZmlyc3QgKi8KKworCWZvciAoaSA9IDAsIGV0bXAgPSBhc24xX3RhZ3MuZXhwX2xpc3Q7IGkgPCBhc24xX3RhZ3MuZXhwX2NvdW50OyBpKyssIGV0bXArKykKKwkJeworCQlBU04xX3B1dF9vYmplY3QoJnAsIGV0bXAtPmV4cF9jb25zdHJ1Y3RlZCwgZXRtcC0+ZXhwX2xlbiwKKwkJCQkJZXRtcC0+ZXhwX3RhZywgZXRtcC0+ZXhwX2NsYXNzKTsKKwkJaWYgKGV0bXAtPmV4cF9wYWQpCisJCQkqcCsrID0gMDsKKwkJfQorCisJLyogSWYgSU1QTElDSVQsIG91dHB1dCB0YWcgKi8KKworCWlmIChhc24xX3RhZ3MuaW1wX3RhZyAhPSAtMSkKKwkJeworCQlpZiAoYXNuMV90YWdzLmltcF9jbGFzcyA9PSBWX0FTTjFfVU5JVkVSU0FMIAorCQkgICAgJiYgKGFzbjFfdGFncy5pbXBfdGFnID09IFZfQVNOMV9TRVFVRU5DRQorCQkgICAgIHx8IGFzbjFfdGFncy5pbXBfdGFnID09IFZfQVNOMV9TRVQpICkKKwkJCWhkcl9jb25zdHJ1Y3RlZCA9IFZfQVNOMV9DT05TVFJVQ1RFRDsKKwkJQVNOMV9wdXRfb2JqZWN0KCZwLCBoZHJfY29uc3RydWN0ZWQsIGhkcl9sZW4sCisJCQkJCWFzbjFfdGFncy5pbXBfdGFnLCBhc24xX3RhZ3MuaW1wX2NsYXNzKTsKKwkJfQorCisJLyogQ29weSBhY3Jvc3Mgb3JpZ2luYWwgZW5jb2RpbmcgKi8KKwltZW1jcHkocCwgY3B5X3N0YXJ0LCBjcHlfbGVuKTsKKworCWNwID0gbmV3X2RlcjsKKworCS8qIE9idGFpbiBuZXcgQVNOMV9UWVBFIHN0cnVjdHVyZSAqLworCXJldCA9IGQyaV9BU04xX1RZUEUoTlVMTCwgJmNwLCBsZW4pOworCisJZXJyOgorCWlmIChvcmlnX2RlcikKKwkJT1BFTlNTTF9mcmVlKG9yaWdfZGVyKTsKKwlpZiAobmV3X2RlcikKKwkJT1BFTlNTTF9mcmVlKG5ld19kZXIpOworCisJcmV0dXJuIHJldDsKKworCX0KKworc3RhdGljIGludCBhc24xX2NiKGNvbnN0IGNoYXIgKmVsZW0sIGludCBsZW4sIHZvaWQgKmJpdHN0cikKKwl7CisJdGFnX2V4cF9hcmcgKmFyZyA9IGJpdHN0cjsKKwlpbnQgaTsKKwlpbnQgdXR5cGU7CisJaW50IHZsZW4gPSAwOworCWNvbnN0IGNoYXIgKnAsICp2c3RhcnQgPSBOVUxMOworCisJaW50IHRtcF90YWcsIHRtcF9jbGFzczsKKworCWZvcihpID0gMCwgcCA9IGVsZW07IGkgPCBsZW47IHArKywgaSsrKQorCQl7CisJCS8qIExvb2sgZm9yIHRoZSAnOicgaW4gbmFtZSB2YWx1ZSBwYWlycyAqLworCQlpZiAoKnAgPT0gJzonKQorCQkJeworCQkJdnN0YXJ0ID0gcCArIDE7CisJCQl2bGVuID0gbGVuIC0gKHZzdGFydCAtIGVsZW0pOworCQkJbGVuID0gcCAtIGVsZW07CisJCQlicmVhazsKKwkJCX0KKwkJfQorCisJdXR5cGUgPSBhc24xX3N0cjJ0YWcoZWxlbSwgbGVuKTsKKworCWlmICh1dHlwZSA9PSAtMSkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0NCLCBBU04xX1JfVU5LTk9XTl9UQUcpOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInRhZz0iLCBlbGVtKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwkvKiBJZiB0aGlzIGlzIG5vdCBhIG1vZGlmaWVyIG1hcmsgZW5kIG9mIHN0cmluZyBhbmQgZXhpdCAqLworCWlmICghKHV0eXBlICYgQVNOMV9HRU5fRkxBRykpCisJCXsKKwkJYXJnLT51dHlwZSA9IHV0eXBlOworCQlhcmctPnN0ciA9IHZzdGFydDsKKwkJLyogSWYgbm8gdmFsdWUgYW5kIG5vdCBlbmQgb2Ygc3RyaW5nLCBlcnJvciAqLworCQlpZiAoIXZzdGFydCAmJiBlbGVtW2xlbl0pCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0NCLCBBU04xX1JfTUlTU0lOR19WQUxVRSk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCXJldHVybiAwOworCQl9CisKKwlzd2l0Y2godXR5cGUpCisJCXsKKworCQljYXNlIEFTTjFfR0VOX0ZMQUdfSU1QOgorCQkvKiBDaGVjayBmb3IgaWxsZWdhbCBtdWx0aXBsZSBJTVBMSUNJVCB0YWdnaW5nICovCisJCWlmIChhcmctPmltcF90YWcgIT0gLTEpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0NCLCBBU04xX1JfSUxMRUdBTF9ORVNURURfVEFHR0lORyk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCWlmICghcGFyc2VfdGFnZ2luZyh2c3RhcnQsIHZsZW4sICZhcmctPmltcF90YWcsICZhcmctPmltcF9jbGFzcykpCisJCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9HRU5fRkxBR19FWFA6CisKKwkJaWYgKCFwYXJzZV90YWdnaW5nKHZzdGFydCwgdmxlbiwgJnRtcF90YWcsICZ0bXBfY2xhc3MpKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIWFwcGVuZF9leHAoYXJnLCB0bXBfdGFnLCB0bXBfY2xhc3MsIDEsIDAsIDApKQorCQkJcmV0dXJuIC0xOworCQlicmVhazsKKworCQljYXNlIEFTTjFfR0VOX0ZMQUdfU0VRV1JBUDoKKwkJaWYgKCFhcHBlbmRfZXhwKGFyZywgVl9BU04xX1NFUVVFTkNFLCBWX0FTTjFfVU5JVkVSU0FMLCAxLCAwLCAxKSkKKwkJCXJldHVybiAtMTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0dFTl9GTEFHX1NFVFdSQVA6CisJCWlmICghYXBwZW5kX2V4cChhcmcsIFZfQVNOMV9TRVQsIFZfQVNOMV9VTklWRVJTQUwsIDEsIDAsIDEpKQorCQkJcmV0dXJuIC0xOworCQlicmVhazsKKworCQljYXNlIEFTTjFfR0VOX0ZMQUdfQklUV1JBUDoKKwkJaWYgKCFhcHBlbmRfZXhwKGFyZywgVl9BU04xX0JJVF9TVFJJTkcsIFZfQVNOMV9VTklWRVJTQUwsIDAsIDEsIDEpKQorCQkJcmV0dXJuIC0xOworCQlicmVhazsKKworCQljYXNlIEFTTjFfR0VOX0ZMQUdfT0NUV1JBUDoKKwkJaWYgKCFhcHBlbmRfZXhwKGFyZywgVl9BU04xX09DVEVUX1NUUklORywgVl9BU04xX1VOSVZFUlNBTCwgMCwgMCwgMSkpCisJCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9HRU5fRkxBR19GT1JNQVQ6CisJCWlmICghc3RybmNtcCh2c3RhcnQsICJBU0NJSSIsIDUpKQorCQkJYXJnLT5mb3JtYXQgPSBBU04xX0dFTl9GT1JNQVRfQVNDSUk7CisJCWVsc2UgaWYgKCFzdHJuY21wKHZzdGFydCwgIlVURjgiLCA0KSkKKwkJCWFyZy0+Zm9ybWF0ID0gQVNOMV9HRU5fRk9STUFUX1VURjg7CisJCWVsc2UgaWYgKCFzdHJuY21wKHZzdGFydCwgIkhFWCIsIDMpKQorCQkJYXJnLT5mb3JtYXQgPSBBU04xX0dFTl9GT1JNQVRfSEVYOworCQllbHNlIGlmICghc3RybmNtcCh2c3RhcnQsICJCSVRMSVNUIiwgMykpCisJCQlhcmctPmZvcm1hdCA9IEFTTjFfR0VOX0ZPUk1BVF9CSVRMSVNUOworCQllbHNlCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0NCLCBBU04xX1JfVU5LT1dOX0ZPUk1BVCk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCWJyZWFrOworCisJCX0KKworCXJldHVybiAxOworCisJfQorCitzdGF0aWMgaW50IHBhcnNlX3RhZ2dpbmcoY29uc3QgY2hhciAqdnN0YXJ0LCBpbnQgdmxlbiwgaW50ICpwdGFnLCBpbnQgKnBjbGFzcykKKwl7CisJY2hhciBlcmNoWzJdOworCWxvbmcgdGFnX251bTsKKwljaGFyICplcHRyOworCWlmICghdnN0YXJ0KQorCQlyZXR1cm4gMDsKKwl0YWdfbnVtID0gc3RydG91bCh2c3RhcnQsICZlcHRyLCAxMCk7CisJLyogQ2hlY2sgd2UgaGF2ZW4ndCBnb25lIHBhc3QgbWF4IGxlbmd0aDogc2hvdWxkIGJlIGltcG9zc2libGUgKi8KKwlpZiAoZXB0ciAmJiAqZXB0ciAmJiAoZXB0ciA+IHZzdGFydCArIHZsZW4pKQorCQlyZXR1cm4gMDsKKwlpZiAodGFnX251bSA8IDApCisJCXsKKwkJQVNOMWVycihBU04xX0ZfUEFSU0VfVEFHR0lORywgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkqcHRhZyA9IHRhZ19udW07CisJLyogSWYgd2UgaGF2ZSBub24gbnVtZXJpYyBjaGFyYWN0ZXJzLCBwYXJzZSB0aGVtICovCisJaWYgKGVwdHIpCisJCXZsZW4gLT0gZXB0ciAtIHZzdGFydDsKKwllbHNlIAorCQl2bGVuID0gMDsKKwlpZiAodmxlbikKKwkJeworCQlzd2l0Y2ggKCplcHRyKQorCQkJeworCisJCQljYXNlICdVJzoKKwkJCSpwY2xhc3MgPSBWX0FTTjFfVU5JVkVSU0FMOworCQkJYnJlYWs7CisKKwkJCWNhc2UgJ0EnOgorCQkJKnBjbGFzcyA9IFZfQVNOMV9BUFBMSUNBVElPTjsKKwkJCWJyZWFrOworCisJCQljYXNlICdQJzoKKwkJCSpwY2xhc3MgPSBWX0FTTjFfUFJJVkFURTsKKwkJCWJyZWFrOworCisJCQljYXNlICdDJzoKKwkJCSpwY2xhc3MgPSBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQzsKKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJZXJjaFswXSA9ICplcHRyOworCQkJZXJjaFsxXSA9IDA7CisJCQlBU04xZXJyKEFTTjFfRl9QQVJTRV9UQUdHSU5HLCBBU04xX1JfSU5WQUxJRF9NT0RJRklFUik7CisJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIkNoYXI9IiwgZXJjaCk7CisJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCisJCQl9CisJCX0KKwllbHNlCisJCSpwY2xhc3MgPSBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQzsKKworCXJldHVybiAxOworCisJfQorCisvKiBIYW5kbGUgbXVsdGlwbGUgdHlwZXM6IFNFVCBhbmQgU0VRVUVOQ0UgKi8KKworc3RhdGljIEFTTjFfVFlQRSAqYXNuMV9tdWx0aShpbnQgdXR5cGUsIGNvbnN0IGNoYXIgKnNlY3Rpb24sIFg1MDlWM19DVFggKmNuZikKKwl7CisJQVNOMV9UWVBFICpyZXQgPSBOVUxMOworCVNUQUNLX09GKEFTTjFfVFlQRSkgKnNrID0gTlVMTDsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqc2VjdCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqZGVyID0gTlVMTDsKKwlpbnQgZGVybGVuOworCWludCBpOworCXNrID0gc2tfQVNOMV9UWVBFX25ld19udWxsKCk7CisJaWYgKCFzaykKKwkJZ290byBiYWQ7CisJaWYgKHNlY3Rpb24pCisJCXsKKwkJaWYgKCFjbmYpCisJCQlnb3RvIGJhZDsKKwkJc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjbmYsIChjaGFyICopc2VjdGlvbik7CisJCWlmICghc2VjdCkKKwkJCWdvdG8gYmFkOworCQlmb3IgKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0oc2VjdCk7IGkrKykKKwkJCXsKKwkJCUFTTjFfVFlQRSAqdHlwID0gQVNOMV9nZW5lcmF0ZV92Myhza19DT05GX1ZBTFVFX3ZhbHVlKHNlY3QsIGkpLT52YWx1ZSwgY25mKTsKKwkJCWlmICghdHlwKQorCQkJCWdvdG8gYmFkOworCQkJaWYgKCFza19BU04xX1RZUEVfcHVzaChzaywgdHlwKSkKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfQorCisJLyogTm93IHdlIGhhcyBhIFNUQUNLIG9mIHRoZSBjb21wb25lbnRzLCBjb252ZXJ0IHRvIHRoZSBjb3JyZWN0IGZvcm0gKi8KKworCWlmICh1dHlwZSA9PSBWX0FTTjFfU0VUKQorCQlkZXJsZW4gPSBpMmRfQVNOMV9TRVRfQU5ZKHNrLCAmZGVyKTsKKwllbHNlCisJCWRlcmxlbiA9IGkyZF9BU04xX1NFUVVFTkNFX0FOWShzaywgJmRlcik7CisKKwlpZiAoZGVybGVuIDwgMCkKKwkJZ290byBiYWQ7CisKKwlpZiAoIShyZXQgPSBBU04xX1RZUEVfbmV3KCkpKQorCQlnb3RvIGJhZDsKKworCWlmICghKHJldC0+dmFsdWUuYXNuMV9zdHJpbmcgPSBBU04xX1NUUklOR190eXBlX25ldyh1dHlwZSkpKQorCQlnb3RvIGJhZDsKKworCXJldC0+dHlwZSA9IHV0eXBlOworCisJcmV0LT52YWx1ZS5hc24xX3N0cmluZy0+ZGF0YSA9IGRlcjsKKwlyZXQtPnZhbHVlLmFzbjFfc3RyaW5nLT5sZW5ndGggPSBkZXJsZW47CisKKwlkZXIgPSBOVUxMOworCisJYmFkOgorCisJaWYgKGRlcikKKwkJT1BFTlNTTF9mcmVlKGRlcik7CisKKwlpZiAoc2spCisJCXNrX0FTTjFfVFlQRV9wb3BfZnJlZShzaywgQVNOMV9UWVBFX2ZyZWUpOworCWlmIChzZWN0KQorCQlYNTA5VjNfc2VjdGlvbl9mcmVlKGNuZiwgc2VjdCk7CisKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIGludCBhcHBlbmRfZXhwKHRhZ19leHBfYXJnICphcmcsIGludCBleHBfdGFnLCBpbnQgZXhwX2NsYXNzLCBpbnQgZXhwX2NvbnN0cnVjdGVkLCBpbnQgZXhwX3BhZCwgaW50IGltcF9vaykKKwl7CisJdGFnX2V4cF90eXBlICpleHBfdG1wOworCS8qIENhbiBvbmx5IGhhdmUgSU1QTElDSVQgaWYgcGVybWl0dGVkICovCisJaWYgKChhcmctPmltcF90YWcgIT0gLTEpICYmICFpbXBfb2spCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQVBQRU5EX0VYUCwgQVNOMV9SX0lMTEVHQUxfSU1QTElDSVRfVEFHKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmIChhcmctPmV4cF9jb3VudCA9PSBBU04xX0ZMQUdfRVhQX01BWCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BUFBFTkRfRVhQLCBBU04xX1JfREVQVEhfRVhDRUVERUQpOworCQlyZXR1cm4gMDsKKwkJfQorCisJZXhwX3RtcCA9ICZhcmctPmV4cF9saXN0W2FyZy0+ZXhwX2NvdW50KytdOworCisJLyogSWYgSU1QTElDSVQgc2V0IHRhZyB0byBpbXBsaWNpdCB2YWx1ZSB0aGVuCisJICogcmVzZXQgaW1wbGljaXQgdGFnIHNpbmNlIGl0IGhhcyBiZWVuIHVzZWQuCisJICovCisJaWYgKGFyZy0+aW1wX3RhZyAhPSAtMSkKKwkJeworCQlleHBfdG1wLT5leHBfdGFnID0gYXJnLT5pbXBfdGFnOworCQlleHBfdG1wLT5leHBfY2xhc3MgPSBhcmctPmltcF9jbGFzczsKKwkJYXJnLT5pbXBfdGFnID0gLTE7CisJCWFyZy0+aW1wX2NsYXNzID0gLTE7CisJCX0KKwllbHNlCisJCXsKKwkJZXhwX3RtcC0+ZXhwX3RhZyA9IGV4cF90YWc7CisJCWV4cF90bXAtPmV4cF9jbGFzcyA9IGV4cF9jbGFzczsKKwkJfQorCWV4cF90bXAtPmV4cF9jb25zdHJ1Y3RlZCA9IGV4cF9jb25zdHJ1Y3RlZDsKKwlleHBfdG1wLT5leHBfcGFkID0gZXhwX3BhZDsKKworCXJldHVybiAxOworCX0KKworCitzdGF0aWMgaW50IGFzbjFfc3RyMnRhZyhjb25zdCBjaGFyICp0YWdzdHIsIGludCBsZW4pCisJeworCXVuc2lnbmVkIGludCBpOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGFnX25hbWVfc3QgKnRudG1wLCB0bnN0IFtdID0geworCQlBU04xX0dFTl9TVFIoIkJPT0wiLCBWX0FTTjFfQk9PTEVBTiksCisJCUFTTjFfR0VOX1NUUigiQk9PTEVBTiIsIFZfQVNOMV9CT09MRUFOKSwKKwkJQVNOMV9HRU5fU1RSKCJOVUxMIiwgVl9BU04xX05VTEwpLAorCQlBU04xX0dFTl9TVFIoIklOVCIsIFZfQVNOMV9JTlRFR0VSKSwKKwkJQVNOMV9HRU5fU1RSKCJJTlRFR0VSIiwgVl9BU04xX0lOVEVHRVIpLAorCQlBU04xX0dFTl9TVFIoIkVOVU0iLCBWX0FTTjFfRU5VTUVSQVRFRCksCisJCUFTTjFfR0VOX1NUUigiRU5VTUVSQVRFRCIsIFZfQVNOMV9FTlVNRVJBVEVEKSwKKwkJQVNOMV9HRU5fU1RSKCJPSUQiLCBWX0FTTjFfT0JKRUNUKSwKKwkJQVNOMV9HRU5fU1RSKCJPQkpFQ1QiLCBWX0FTTjFfT0JKRUNUKSwKKwkJQVNOMV9HRU5fU1RSKCJVVENUSU1FIiwgVl9BU04xX1VUQ1RJTUUpLAorCQlBU04xX0dFTl9TVFIoIlVUQyIsIFZfQVNOMV9VVENUSU1FKSwKKwkJQVNOMV9HRU5fU1RSKCJHRU5FUkFMSVpFRFRJTUUiLCBWX0FTTjFfR0VORVJBTElaRURUSU1FKSwKKwkJQVNOMV9HRU5fU1RSKCJHRU5USU1FIiwgVl9BU04xX0dFTkVSQUxJWkVEVElNRSksCisJCUFTTjFfR0VOX1NUUigiT0NUIiwgVl9BU04xX09DVEVUX1NUUklORyksCisJCUFTTjFfR0VOX1NUUigiT0NURVRTVFJJTkciLCBWX0FTTjFfT0NURVRfU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJCSVRTVFIiLCBWX0FTTjFfQklUX1NUUklORyksCisJCUFTTjFfR0VOX1NUUigiQklUU1RSSU5HIiwgVl9BU04xX0JJVF9TVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlVOSVZFUlNBTFNUUklORyIsIFZfQVNOMV9VTklWRVJTQUxTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlVOSVYiLCBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJJQTUiLCBWX0FTTjFfSUE1U1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJJQTVTVFJJTkciLCBWX0FTTjFfSUE1U1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJVVEY4IiwgVl9BU04xX1VURjhTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlVURjhTdHJpbmciLCBWX0FTTjFfVVRGOFNUUklORyksCisJCUFTTjFfR0VOX1NUUigiQk1QIiwgVl9BU04xX0JNUFNUUklORyksCisJCUFTTjFfR0VOX1NUUigiQk1QU1RSSU5HIiwgVl9BU04xX0JNUFNUUklORyksCisJCUFTTjFfR0VOX1NUUigiVklTSUJMRVNUUklORyIsIFZfQVNOMV9WSVNJQkxFU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJWSVNJQkxFIiwgVl9BU04xX1ZJU0lCTEVTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlBSSU5UQUJMRVNUUklORyIsIFZfQVNOMV9QUklOVEFCTEVTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlBSSU5UQUJMRSIsIFZfQVNOMV9QUklOVEFCTEVTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlQ2MSIsIFZfQVNOMV9UNjFTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlQ2MVNUUklORyIsIFZfQVNOMV9UNjFTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIlRFTEVURVhTVFJJTkciLCBWX0FTTjFfVDYxU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJHZW5lcmFsU3RyaW5nIiwgVl9BU04xX0dFTkVSQUxTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIkdFTlNUUiIsIFZfQVNOMV9HRU5FUkFMU1RSSU5HKSwKKwkJQVNOMV9HRU5fU1RSKCJOVU1FUklDIiwgVl9BU04xX05VTUVSSUNTVFJJTkcpLAorCQlBU04xX0dFTl9TVFIoIk5VTUVSSUNTVFJJTkciLCBWX0FTTjFfTlVNRVJJQ1NUUklORyksCisKKwkJLyogU3BlY2lhbCBjYXNlcyAqLworCQlBU04xX0dFTl9TVFIoIlNFUVVFTkNFIiwgVl9BU04xX1NFUVVFTkNFKSwKKwkJQVNOMV9HRU5fU1RSKCJTRVEiLCBWX0FTTjFfU0VRVUVOQ0UpLAorCQlBU04xX0dFTl9TVFIoIlNFVCIsIFZfQVNOMV9TRVQpLAorCQkvKiB0eXBlIG1vZGlmaWVycyAqLworCQkvKiBFeHBsaWNpdCB0YWcgKi8KKwkJQVNOMV9HRU5fU1RSKCJFWFAiLCBBU04xX0dFTl9GTEFHX0VYUCksCisJCUFTTjFfR0VOX1NUUigiRVhQTElDSVQiLCBBU04xX0dFTl9GTEFHX0VYUCksCisJCS8qIEltcGxpY2l0IHRhZyAqLworCQlBU04xX0dFTl9TVFIoIklNUCIsIEFTTjFfR0VOX0ZMQUdfSU1QKSwKKwkJQVNOMV9HRU5fU1RSKCJJTVBMSUNJVCIsIEFTTjFfR0VOX0ZMQUdfSU1QKSwKKwkJLyogT0NURVQgU1RSSU5HIHdyYXBwZXIgKi8KKwkJQVNOMV9HRU5fU1RSKCJPQ1RXUkFQIiwgQVNOMV9HRU5fRkxBR19PQ1RXUkFQKSwKKwkJLyogU0VRVUVOQ0Ugd3JhcHBlciAqLworCQlBU04xX0dFTl9TVFIoIlNFUVdSQVAiLCBBU04xX0dFTl9GTEFHX1NFUVdSQVApLAorCQkvKiBTRVQgd3JhcHBlciAqLworCQlBU04xX0dFTl9TVFIoIlNFVFdSQVAiLCBBU04xX0dFTl9GTEFHX1NFVFdSQVApLAorCQkvKiBCSVQgU1RSSU5HIHdyYXBwZXIgKi8KKwkJQVNOMV9HRU5fU1RSKCJCSVRXUkFQIiwgQVNOMV9HRU5fRkxBR19CSVRXUkFQKSwKKwkJQVNOMV9HRU5fU1RSKCJGT1JNIiwgQVNOMV9HRU5fRkxBR19GT1JNQVQpLAorCQlBU04xX0dFTl9TVFIoIkZPUk1BVCIsIEFTTjFfR0VOX0ZMQUdfRk9STUFUKSwKKwl9OworCisJaWYgKGxlbiA9PSAtMSkKKwkJbGVuID0gc3RybGVuKHRhZ3N0cik7CisJCisJdG50bXAgPSB0bnN0OwkKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHRuc3QpIC8gc2l6ZW9mKHN0cnVjdCB0YWdfbmFtZV9zdCk7IGkrKywgdG50bXArKykKKwkJeworCQlpZiAoKGxlbiA9PSB0bnRtcC0+bGVuKSAmJiAhc3RybmNtcCh0bnRtcC0+c3RybmFtLCB0YWdzdHIsIGxlbikpCisJCQlyZXR1cm4gdG50bXAtPnRhZzsKKwkJfQorCQorCXJldHVybiAtMTsKKwl9CisKK3N0YXRpYyBBU04xX1RZUEUgKmFzbjFfc3RyMnR5cGUoY29uc3QgY2hhciAqc3RyLCBpbnQgZm9ybWF0LCBpbnQgdXR5cGUpCisJeworCUFTTjFfVFlQRSAqYXRtcCA9IE5VTEw7CisKKwlDT05GX1ZBTFVFIHZ0bXA7CisKKwl1bnNpZ25lZCBjaGFyICpyZGF0YTsKKwlsb25nIHJkbGVuOworCisJaW50IG5vX3VudXNlZCA9IDE7CisKKwlpZiAoIShhdG1wID0gQVNOMV9UWVBFX25ldygpKSkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAoIXN0cikKKwkJc3RyID0gIiI7CisKKwlzd2l0Y2godXR5cGUpCisJCXsKKworCQljYXNlIFZfQVNOMV9OVUxMOgorCQlpZiAoc3RyICYmICpzdHIpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBBU04xX1JfSUxMRUdBTF9OVUxMX1ZBTFVFKTsKKwkJCWdvdG8gYmFkX2Zvcm07CisJCQl9CisJCWJyZWFrOworCQkKKwkJY2FzZSBWX0FTTjFfQk9PTEVBTjoKKwkJaWYgKGZvcm1hdCAhPSBBU04xX0dFTl9GT1JNQVRfQVNDSUkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBBU04xX1JfTk9UX0FTQ0lJX0ZPUk1BVCk7CisJCQlnb3RvIGJhZF9mb3JtOworCQkJfQorCQl2dG1wLm5hbWUgPSBOVUxMOworCQl2dG1wLnNlY3Rpb24gPSBOVUxMOworCQl2dG1wLnZhbHVlID0gKGNoYXIgKilzdHI7CisJCWlmICghWDUwOVYzX2dldF92YWx1ZV9ib29sKCZ2dG1wLCAmYXRtcC0+dmFsdWUuYm9vbGVhbikpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBBU04xX1JfSUxMRUdBTF9CT09MRUFOKTsKKwkJCWdvdG8gYmFkX3N0cjsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfSU5URUdFUjoKKwkJY2FzZSBWX0FTTjFfRU5VTUVSQVRFRDoKKwkJaWYgKGZvcm1hdCAhPSBBU04xX0dFTl9GT1JNQVRfQVNDSUkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBBU04xX1JfSU5URUdFUl9OT1RfQVNDSUlfRk9STUFUKTsKKwkJCWdvdG8gYmFkX2Zvcm07CisJCQl9CisJCWlmICghKGF0bXAtPnZhbHVlLmludGVnZXIgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIChjaGFyICopc3RyKSkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBBU04xX1JfSUxMRUdBTF9JTlRFR0VSKTsKKwkJCWdvdG8gYmFkX3N0cjsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfT0JKRUNUOgorCQlpZiAoZm9ybWF0ICE9IEFTTjFfR0VOX0ZPUk1BVF9BU0NJSSkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU1RSMlRZUEUsIEFTTjFfUl9PQkpFQ1RfTk9UX0FTQ0lJX0ZPUk1BVCk7CisJCQlnb3RvIGJhZF9mb3JtOworCQkJfQorCQlpZiAoIShhdG1wLT52YWx1ZS5vYmplY3QgPSBPQkpfdHh0Mm9iaihzdHIsIDApKSkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU1RSMlRZUEUsIEFTTjFfUl9JTExFR0FMX09CSkVDVCk7CisJCQlnb3RvIGJhZF9zdHI7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX1VUQ1RJTUU6CisJCWNhc2UgVl9BU04xX0dFTkVSQUxJWkVEVElNRToKKwkJaWYgKGZvcm1hdCAhPSBBU04xX0dFTl9GT1JNQVRfQVNDSUkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBBU04xX1JfVElNRV9OT1RfQVNDSUlfRk9STUFUKTsKKwkJCWdvdG8gYmFkX2Zvcm07CisJCQl9CisJCWlmICghKGF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nID0gQVNOMV9TVFJJTkdfbmV3KCkpKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9TVFIyVFlQRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBiYWRfc3RyOworCQkJfQorCQlpZiAoIUFTTjFfU1RSSU5HX3NldChhdG1wLT52YWx1ZS5hc24xX3N0cmluZywgc3RyLCAtMSkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGJhZF9zdHI7CisJCQl9CisJCWF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nLT50eXBlID0gdXR5cGU7CisJCWlmICghQVNOMV9USU1FX2NoZWNrKGF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nKSkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU1RSMlRZUEUsIEFTTjFfUl9JTExFR0FMX1RJTUVfVkFMVUUpOworCQkJZ290byBiYWRfc3RyOworCQkJfQorCisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0JNUFNUUklORzoKKwkJY2FzZSBWX0FTTjFfUFJJTlRBQkxFU1RSSU5HOgorCQljYXNlIFZfQVNOMV9JQTVTVFJJTkc6CisJCWNhc2UgVl9BU04xX1Q2MVNUUklORzoKKwkJY2FzZSBWX0FTTjFfVVRGOFNUUklORzoKKwkJY2FzZSBWX0FTTjFfVklTSUJMRVNUUklORzoKKwkJY2FzZSBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HOgorCQljYXNlIFZfQVNOMV9HRU5FUkFMU1RSSU5HOgorCQljYXNlIFZfQVNOMV9OVU1FUklDU1RSSU5HOgorCisJCWlmIChmb3JtYXQgPT0gQVNOMV9HRU5fRk9STUFUX0FTQ0lJKQorCQkJZm9ybWF0ID0gTUJTVFJJTkdfQVNDOworCQllbHNlIGlmIChmb3JtYXQgPT0gQVNOMV9HRU5fRk9STUFUX1VURjgpCisJCQlmb3JtYXQgPSBNQlNUUklOR19VVEY4OworCQllbHNlCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBBU04xX1JfSUxMRUdBTF9GT1JNQVQpOworCQkJZ290byBiYWRfZm9ybTsKKwkJCX0KKworCisJCWlmIChBU04xX21ic3RyaW5nX2NvcHkoJmF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nLCAodW5zaWduZWQgY2hhciAqKXN0ciwKKwkJCQkJCS0xLCBmb3JtYXQsIEFTTjFfdGFnMmJpdCh1dHlwZSkpIDw9IDApCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGJhZF9zdHI7CisJCQl9CisJCQorCisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0JJVF9TVFJJTkc6CisKKwkJY2FzZSBWX0FTTjFfT0NURVRfU1RSSU5HOgorCisJCWlmICghKGF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nID0gQVNOMV9TVFJJTkdfbmV3KCkpKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9TVFIyVFlQRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBiYWRfZm9ybTsKKwkJCX0KKworCQlpZiAoZm9ybWF0ID09IEFTTjFfR0VOX0ZPUk1BVF9IRVgpCisJCQl7CisKKwkJCWlmICghKHJkYXRhID0gc3RyaW5nX3RvX2hleCgoY2hhciAqKXN0ciwgJnJkbGVuKSkpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU1RSMlRZUEUsIEFTTjFfUl9JTExFR0FMX0hFWCk7CisJCQkJZ290byBiYWRfc3RyOworCQkJCX0KKworCQkJYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmctPmRhdGEgPSByZGF0YTsKKwkJCWF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nLT5sZW5ndGggPSByZGxlbjsKKwkJCWF0bXAtPnZhbHVlLmFzbjFfc3RyaW5nLT50eXBlID0gdXR5cGU7CisKKwkJCX0KKwkJZWxzZSBpZiAoZm9ybWF0ID09IEFTTjFfR0VOX0ZPUk1BVF9BU0NJSSkKKwkJCUFTTjFfU1RSSU5HX3NldChhdG1wLT52YWx1ZS5hc24xX3N0cmluZywgc3RyLCAtMSk7CisJCWVsc2UgaWYgKChmb3JtYXQgPT0gQVNOMV9HRU5fRk9STUFUX0JJVExJU1QpICYmICh1dHlwZSA9PSBWX0FTTjFfQklUX1NUUklORykpCisJCQl7CisJCQlpZiAoIUNPTkZfcGFyc2VfbGlzdChzdHIsICcsJywgMSwgYml0c3RyX2NiLCBhdG1wLT52YWx1ZS5iaXRfc3RyaW5nKSkKKwkJCQl7CisJCQkJQVNOMWVycihBU04xX0ZfQVNOMV9TVFIyVFlQRSwgQVNOMV9SX0xJU1RfRVJST1IpOworCQkJCWdvdG8gYmFkX3N0cjsKKwkJCQl9CisJCQlub191bnVzZWQgPSAwOworCQkJCisJCQl9CisJCWVsc2UgCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1NUUjJUWVBFLCBBU04xX1JfSUxMRUdBTF9CSVRTVFJJTkdfRk9STUFUKTsKKwkJCWdvdG8gYmFkX2Zvcm07CisJCQl9CisKKwkJaWYgKCh1dHlwZSA9PSBWX0FTTjFfQklUX1NUUklORykgJiYgbm9fdW51c2VkKQorCQkJeworCQkJYXRtcC0+dmFsdWUuYXNuMV9zdHJpbmctPmZsYWdzCisJCQkJJj0gfihBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVHwweDA3KTsKKyAgICAgICAgCQlhdG1wLT52YWx1ZS5hc24xX3N0cmluZy0+ZmxhZ3MKKwkJCQl8PSBBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVDsKKwkJCX0KKworCisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU1RSMlRZUEUsIEFTTjFfUl9VTlNVUFBPUlRFRF9UWVBFKTsKKwkJZ290byBiYWRfc3RyOworCQlicmVhazsKKwkJfQorCisKKwlhdG1wLT50eXBlID0gdXR5cGU7CisJcmV0dXJuIGF0bXA7CisKKworCWJhZF9zdHI6CisJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJzdHJpbmc9Iiwgc3RyKTsKKwliYWRfZm9ybToKKworCUFTTjFfVFlQRV9mcmVlKGF0bXApOworCXJldHVybiBOVUxMOworCisJfQorCitzdGF0aWMgaW50IGJpdHN0cl9jYihjb25zdCBjaGFyICplbGVtLCBpbnQgbGVuLCB2b2lkICpiaXRzdHIpCisJeworCWxvbmcgYml0bnVtOworCWNoYXIgKmVwdHI7CisJaWYgKCFlbGVtKQorCQlyZXR1cm4gMDsKKwliaXRudW0gPSBzdHJ0b3VsKGVsZW0sICZlcHRyLCAxMCk7CisJaWYgKGVwdHIgJiYgKmVwdHIgJiYgKGVwdHIgIT0gZWxlbSArIGxlbikpCisJCXJldHVybiAwOworCWlmIChiaXRudW0gPCAwKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0JJVFNUUl9DQiwgQVNOMV9SX0lOVkFMSURfTlVNQkVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoIUFTTjFfQklUX1NUUklOR19zZXRfYml0KGJpdHN0ciwgYml0bnVtLCAxKSkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9CSVRTVFJfQ0IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfbGliLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hc24xX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiY2I0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hc24xX2xpYi5jCkBAIC0wLDAgKzEsNDgyIEBACisvKiBjcnlwdG8vYXNuMS9hc24xX2xpYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xX21hYy5oPgorCitzdGF0aWMgaW50IGFzbjFfZ2V0X2xlbmd0aChjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsaW50ICppbmYsbG9uZyAqcmwsaW50IG1heCk7CitzdGF0aWMgdm9pZCBhc24xX3B1dF9sZW5ndGgodW5zaWduZWQgY2hhciAqKnBwLCBpbnQgbGVuZ3RoKTsKK2NvbnN0IGNoYXIgQVNOMV92ZXJzaW9uW109IkFTTi4xIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKK3N0YXRpYyBpbnQgX2FzbjFfY2hlY2tfaW5maW5pdGVfZW5kKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwLCBsb25nIGxlbikKKwl7CisJLyogSWYgdGhlcmUgaXMgMCBvciAxIGJ5dGUgbGVmdCwgdGhlIGxlbmd0aCBjaGVjayBzaG91bGQgcGljaworCSAqIHRoaW5ncyB1cCAqLworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuKDEpOworCWVsc2UgaWYgKChsZW4gPj0gMikgJiYgKCgqcClbMF0gPT0gMCkgJiYgKCgqcClbMV0gPT0gMCkpCisJCXsKKwkJKCpwKSs9MjsKKwkJcmV0dXJuKDEpOworCQl9CisJcmV0dXJuKDApOworCX0KKworaW50IEFTTjFfY2hlY2tfaW5maW5pdGVfZW5kKHVuc2lnbmVkIGNoYXIgKipwLCBsb25nIGxlbikKKwl7CisJcmV0dXJuIF9hc24xX2NoZWNrX2luZmluaXRlX2VuZCgoY29uc3QgdW5zaWduZWQgY2hhciAqKilwLCBsZW4pOworCX0KKworaW50IEFTTjFfY29uc3RfY2hlY2tfaW5maW5pdGVfZW5kKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwLCBsb25nIGxlbikKKwl7CisJcmV0dXJuIF9hc24xX2NoZWNrX2luZmluaXRlX2VuZChwLCBsZW4pOworCX0KKworCitpbnQgQVNOMV9nZXRfb2JqZWN0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyAqcGxlbmd0aCwgaW50ICpwdGFnLAorCWludCAqcGNsYXNzLCBsb25nIG9tYXgpCisJeworCWludCBpLHJldDsKKwlsb25nIGw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcD0gKnBwOworCWludCB0YWcseGNsYXNzLGluZjsKKwlsb25nIG1heD1vbWF4OworCisJaWYgKCFtYXgpIGdvdG8gZXJyOworCXJldD0oKnAmVl9BU04xX0NPTlNUUlVDVEVEKTsKKwl4Y2xhc3M9KCpwJlZfQVNOMV9QUklWQVRFKTsKKwlpPSAqcCZWX0FTTjFfUFJJTUlUSVZFX1RBRzsKKwlpZiAoaSA9PSBWX0FTTjFfUFJJTUlUSVZFX1RBRykKKwkJewkJLyogaGlnaC10YWcgKi8KKwkJcCsrOworCQlpZiAoLS1tYXggPT0gMCkgZ290byBlcnI7CisJCWw9MDsKKwkJd2hpbGUgKCpwJjB4ODApCisJCQl7CisJCQlsPDw9N0w7CisJCQlsfD0gKihwKyspJjB4N2Y7CisJCQlpZiAoLS1tYXggPT0gMCkgZ290byBlcnI7CisJCQlpZiAobCA+IChJTlRfTUFYID4+IDdMKSkgZ290byBlcnI7CisJCQl9CisJCWw8PD03TDsKKwkJbHw9ICoocCsrKSYweDdmOworCQl0YWc9KGludClsOworCQlpZiAoLS1tYXggPT0gMCkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsgCisJCXRhZz1pOworCQlwKys7CisJCWlmICgtLW1heCA9PSAwKSBnb3RvIGVycjsKKwkJfQorCSpwdGFnPXRhZzsKKwkqcGNsYXNzPXhjbGFzczsKKwlpZiAoIWFzbjFfZ2V0X2xlbmd0aCgmcCwmaW5mLHBsZW5ndGgsKGludCltYXgpKSBnb3RvIGVycjsKKworI2lmIDAKKwlmcHJpbnRmKHN0ZGVyciwicD0lZCArICpwbGVuZ3RoPSVsZCA+IG9tYXg9JWxkICsgKnBwPSVkICAoJWQgPiAlZClcbiIsIAorCQkoaW50KXAsKnBsZW5ndGgsb21heCwoaW50KSpwcCwoaW50KShwKyAqcGxlbmd0aCksCisJCShpbnQpKG9tYXgrICpwcCkpOworCisjZW5kaWYKKwlpZiAoKnBsZW5ndGggPiAob21heCAtIChwIC0gKnBwKSkpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9HRVRfT0JKRUNULEFTTjFfUl9UT09fTE9ORyk7CisJCS8qIFNldCB0aGlzIHNvIHRoYXQgZXZlbiBpZiB0aGluZ3MgYXJlIG5vdCBsb25nIGVub3VnaAorCQkgKiB0aGUgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5ICovCisJCXJldHw9MHg4MDsKKwkJfQorCSpwcD1wOworCXJldHVybihyZXR8aW5mKTsKK2VycjoKKwlBU04xZXJyKEFTTjFfRl9BU04xX0dFVF9PQkpFQ1QsQVNOMV9SX0hFQURFUl9UT09fTE9ORyk7CisJcmV0dXJuKDB4ODApOworCX0KKworc3RhdGljIGludCBhc24xX2dldF9sZW5ndGgoY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBpbnQgKmluZiwgbG9uZyAqcmwsIGludCBtYXgpCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA9ICpwcDsKKwl1bnNpZ25lZCBsb25nIHJldD0wOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKG1heC0tIDwgMSkgcmV0dXJuKDApOworCWlmICgqcCA9PSAweDgwKQorCQl7CisJCSppbmY9MTsKKwkJcmV0PTA7CisJCXArKzsKKwkJfQorCWVsc2UKKwkJeworCQkqaW5mPTA7CisJCWk9ICpwJjB4N2Y7CisJCWlmICgqKHArKykgJiAweDgwKQorCQkJeworCQkJaWYgKGkgPiBzaXplb2YobG9uZykpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAobWF4LS0gPT0gMCkgcmV0dXJuKDApOworCQkJd2hpbGUgKGktLSA+IDApCisJCQkJeworCQkJCXJldDw8PThMOworCQkJCXJldHw9ICoocCsrKTsKKwkJCQlpZiAobWF4LS0gPT0gMCkgcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJcmV0PWk7CisJCX0KKwlpZiAocmV0ID4gTE9OR19NQVgpCisJCXJldHVybiAwOworCSpwcD1wOworCSpybD0obG9uZylyZXQ7CisJcmV0dXJuKDEpOworCX0KKworLyogY2xhc3MgMCBpcyBjb25zdHJ1Y3RlZAorICogY29uc3RydWN0ZWQgPT0gMiBmb3IgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgKi8KK3ZvaWQgQVNOMV9wdXRfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKipwcCwgaW50IGNvbnN0cnVjdGVkLCBpbnQgbGVuZ3RoLCBpbnQgdGFnLAorCSAgICAgaW50IHhjbGFzcykKKwl7CisJdW5zaWduZWQgY2hhciAqcD0gKnBwOworCWludCBpLCB0dGFnOworCisJaT0oY29uc3RydWN0ZWQpP1ZfQVNOMV9DT05TVFJVQ1RFRDowOworCWl8PSh4Y2xhc3MmVl9BU04xX1BSSVZBVEUpOworCWlmICh0YWcgPCAzMSkKKwkJKihwKyspPWl8KHRhZyZWX0FTTjFfUFJJTUlUSVZFX1RBRyk7CisJZWxzZQorCQl7CisJCSoocCsrKT1pfFZfQVNOMV9QUklNSVRJVkVfVEFHOworCQlmb3IoaSA9IDAsIHR0YWcgPSB0YWc7IHR0YWcgPiAwOyBpKyspIHR0YWcgPj49NzsKKwkJdHRhZyA9IGk7CisJCXdoaWxlKGktLSA+IDApCisJCQl7CisJCQlwW2ldID0gdGFnICYgMHg3ZjsKKwkJCWlmKGkgIT0gKHR0YWcgLSAxKSkgcFtpXSB8PSAweDgwOworCQkJdGFnID4+PSA3OworCQkJfQorCQlwICs9IHR0YWc7CisJCX0KKwlpZiAoY29uc3RydWN0ZWQgPT0gMikKKwkJKihwKyspPTB4ODA7CisJZWxzZQorCQlhc24xX3B1dF9sZW5ndGgoJnAsbGVuZ3RoKTsKKwkqcHA9cDsKKwl9CisKK2ludCBBU04xX3B1dF9lb2ModW5zaWduZWQgY2hhciAqKnBwKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwID0gKnBwOworCSpwKysgPSAwOworCSpwKysgPSAwOworCSpwcCA9IHA7CisJcmV0dXJuIDI7CisJfQorCitzdGF0aWMgdm9pZCBhc24xX3B1dF9sZW5ndGgodW5zaWduZWQgY2hhciAqKnBwLCBpbnQgbGVuZ3RoKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwPSAqcHA7CisJaW50IGksbDsKKwlpZiAobGVuZ3RoIDw9IDEyNykKKwkJKihwKyspPSh1bnNpZ25lZCBjaGFyKWxlbmd0aDsKKwllbHNlCisJCXsKKwkJbD1sZW5ndGg7CisJCWZvciAoaT0wOyBsID4gMDsgaSsrKQorCQkJbD4+PTg7CisJCSoocCsrKT1pfDB4ODA7CisJCWw9aTsKKwkJd2hpbGUgKGktLSA+IDApCisJCQl7CisJCQlwW2ldPWxlbmd0aCYweGZmOworCQkJbGVuZ3RoPj49ODsKKwkJCX0KKwkJcCs9bDsKKwkJfQorCSpwcD1wOworCX0KKworaW50IEFTTjFfb2JqZWN0X3NpemUoaW50IGNvbnN0cnVjdGVkLCBpbnQgbGVuZ3RoLCBpbnQgdGFnKQorCXsKKwlpbnQgcmV0OworCisJcmV0PWxlbmd0aDsKKwlyZXQrKzsKKwlpZiAodGFnID49IDMxKQorCQl7CisJCXdoaWxlICh0YWcgPiAwKQorCQkJeworCQkJdGFnPj49NzsKKwkJCXJldCsrOworCQkJfQorCQl9CisJaWYgKGNvbnN0cnVjdGVkID09IDIpCisJCXJldHVybiByZXQgKyAzOworCXJldCsrOworCWlmIChsZW5ndGggPiAxMjcpCisJCXsKKwkJd2hpbGUgKGxlbmd0aCA+IDApCisJCQl7CisJCQlsZW5ndGg+Pj04OworCQkJcmV0Kys7CisJCQl9CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgX2FzbjFfRmluaXNoKEFTTjFfY29uc3RfQ1RYICpjKQorCXsKKwlpZiAoKGMtPmluZiA9PSAoMXxWX0FTTjFfQ09OU1RSVUNURUQpKSAmJiAoIWMtPmVvcykpCisJCXsKKwkJaWYgKCFBU04xX2NvbnN0X2NoZWNrX2luZmluaXRlX2VuZCgmYy0+cCxjLT5zbGVuKSkKKwkJCXsKKwkJCWMtPmVycm9yPUVSUl9SX01JU1NJTkdfQVNOMV9FT1M7CisJCQlyZXR1cm4oMCk7CisJCQl9CisJCX0KKwlpZiAoCSgoYy0+c2xlbiAhPSAwKSAmJiAhKGMtPmluZiAmIDEpKSB8fAorCQkoKGMtPnNsZW4gPCAwKSAmJiAoYy0+aW5mICYgMSkpKQorCQl7CisJCWMtPmVycm9yPUVSUl9SX0FTTjFfTEVOR1RIX01JU01BVENIOworCQlyZXR1cm4oMCk7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCitpbnQgYXNuMV9GaW5pc2goQVNOMV9DVFggKmMpCisJeworCXJldHVybiBfYXNuMV9GaW5pc2goKEFTTjFfY29uc3RfQ1RYICopYyk7CisJfQorCitpbnQgYXNuMV9jb25zdF9GaW5pc2goQVNOMV9jb25zdF9DVFggKmMpCisJeworCXJldHVybiBfYXNuMV9GaW5pc2goYyk7CisJfQorCitpbnQgYXNuMV9HZXRTZXF1ZW5jZShBU04xX2NvbnN0X0NUWCAqYywgbG9uZyAqbGVuZ3RoKQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpxOworCisJcT1jLT5wOworCWMtPmluZj1BU04xX2dldF9vYmplY3QoJihjLT5wKSwmKGMtPnNsZW4pLCYoYy0+dGFnKSwmKGMtPnhjbGFzcyksCisJCSpsZW5ndGgpOworCWlmIChjLT5pbmYgJiAweDgwKQorCQl7CisJCWMtPmVycm9yPUVSUl9SX0JBRF9HRVRfQVNOMV9PQkpFQ1RfQ0FMTDsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKGMtPnRhZyAhPSBWX0FTTjFfU0VRVUVOQ0UpCisJCXsKKwkJYy0+ZXJyb3I9RVJSX1JfRVhQRUNUSU5HX0FOX0FTTjFfU0VRVUVOQ0U7CisJCXJldHVybigwKTsKKwkJfQorCSgqbGVuZ3RoKS09KGMtPnAtcSk7CisJaWYgKGMtPm1heCAmJiAoKmxlbmd0aCA8IDApKQorCQl7CisJCWMtPmVycm9yPUVSUl9SX0FTTjFfTEVOR1RIX01JU01BVENIOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoYy0+aW5mID09ICgxfFZfQVNOMV9DT05TVFJVQ1RFRCkpCisJCWMtPnNsZW49ICpsZW5ndGgrICooYy0+cHApLWMtPnA7CisJYy0+ZW9zPTA7CisJcmV0dXJuKDEpOworCX0KKworaW50IEFTTjFfU1RSSU5HX2NvcHkoQVNOMV9TVFJJTkcgKmRzdCwgY29uc3QgQVNOMV9TVFJJTkcgKnN0cikKKwl7CisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlkc3QtPnR5cGUgPSBzdHItPnR5cGU7CisJaWYgKCFBU04xX1NUUklOR19zZXQoZHN0LHN0ci0+ZGF0YSxzdHItPmxlbmd0aCkpCisJCXJldHVybiAwOworCWRzdC0+ZmxhZ3MgPSBzdHItPmZsYWdzOworCXJldHVybiAxOworCX0KKworQVNOMV9TVFJJTkcgKkFTTjFfU1RSSU5HX2R1cChjb25zdCBBU04xX1NUUklORyAqc3RyKQorCXsKKwlBU04xX1NUUklORyAqcmV0OworCWlmICghc3RyKQorCQkgcmV0dXJuIE5VTEw7CisJcmV0PUFTTjFfU1RSSU5HX25ldygpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIUFTTjFfU1RSSU5HX2NvcHkocmV0LHN0cikpCisJCXsKKwkJQVNOMV9TVFJJTkdfZnJlZShyZXQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCXJldHVybiByZXQ7CisJfQorCitpbnQgQVNOMV9TVFJJTkdfc2V0KEFTTjFfU1RSSU5HICpzdHIsIGNvbnN0IHZvaWQgKl9kYXRhLCBpbnQgbGVuKQorCXsKKwl1bnNpZ25lZCBjaGFyICpjOworCWNvbnN0IGNoYXIgKmRhdGE9X2RhdGE7CisKKwlpZiAobGVuIDwgMCkKKwkJeworCQlpZiAoZGF0YSA9PSBOVUxMKQorCQkJcmV0dXJuKDApOworCQllbHNlCisJCQlsZW49c3RybGVuKGRhdGEpOworCQl9CisJaWYgKChzdHItPmxlbmd0aCA8IGxlbikgfHwgKHN0ci0+ZGF0YSA9PSBOVUxMKSkKKwkJeworCQljPXN0ci0+ZGF0YTsKKwkJaWYgKGMgPT0gTlVMTCkKKwkJCXN0ci0+ZGF0YT1PUEVOU1NMX21hbGxvYyhsZW4rMSk7CisJCWVsc2UKKwkJCXN0ci0+ZGF0YT1PUEVOU1NMX3JlYWxsb2MoYyxsZW4rMSk7CisKKwkJaWYgKHN0ci0+ZGF0YSA9PSBOVUxMKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9TVFJJTkdfU0VULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXN0ci0+ZGF0YT1jOworCQkJcmV0dXJuKDApOworCQkJfQorCQl9CisJc3RyLT5sZW5ndGg9bGVuOworCWlmIChkYXRhICE9IE5VTEwpCisJCXsKKwkJbWVtY3B5KHN0ci0+ZGF0YSxkYXRhLGxlbik7CisJCS8qIGFuIGFsbG93YW5jZSBmb3Igc3RyaW5ncyA6LSkgKi8KKwkJc3RyLT5kYXRhW2xlbl09J1wwJzsKKwkJfQorCXJldHVybigxKTsKKwl9CisKK3ZvaWQgQVNOMV9TVFJJTkdfc2V0MChBU04xX1NUUklORyAqc3RyLCB2b2lkICpkYXRhLCBpbnQgbGVuKQorCXsKKwlpZiAoc3RyLT5kYXRhKQorCQlPUEVOU1NMX2ZyZWUoc3RyLT5kYXRhKTsKKwlzdHItPmRhdGEgPSBkYXRhOworCXN0ci0+bGVuZ3RoID0gbGVuOworCX0KKworQVNOMV9TVFJJTkcgKkFTTjFfU1RSSU5HX25ldyh2b2lkKQorCXsKKwlyZXR1cm4oQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX09DVEVUX1NUUklORykpOworCX0KKworCitBU04xX1NUUklORyAqQVNOMV9TVFJJTkdfdHlwZV9uZXcoaW50IHR5cGUpCisJeworCUFTTjFfU1RSSU5HICpyZXQ7CisKKwlyZXQ9KEFTTjFfU1RSSU5HICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfU1RSSU5HKSk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU1RSSU5HX1RZUEVfTkVXLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0LT5sZW5ndGg9MDsKKwlyZXQtPnR5cGU9dHlwZTsKKwlyZXQtPmRhdGE9TlVMTDsKKwlyZXQtPmZsYWdzPTA7CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIEFTTjFfU1RSSU5HX2ZyZWUoQVNOMV9TVFJJTkcgKmEpCisJeworCWlmIChhID09IE5VTEwpIHJldHVybjsKKwlpZiAoYS0+ZGF0YSAmJiAhKGEtPmZsYWdzICYgQVNOMV9TVFJJTkdfRkxBR19OREVGKSkKKwkJT1BFTlNTTF9mcmVlKGEtPmRhdGEpOworCU9QRU5TU0xfZnJlZShhKTsKKwl9CisKK2ludCBBU04xX1NUUklOR19jbXAoY29uc3QgQVNOMV9TVFJJTkcgKmEsIGNvbnN0IEFTTjFfU1RSSU5HICpiKQorCXsKKwlpbnQgaTsKKworCWk9KGEtPmxlbmd0aC1iLT5sZW5ndGgpOworCWlmIChpID09IDApCisJCXsKKwkJaT1tZW1jbXAoYS0+ZGF0YSxiLT5kYXRhLGEtPmxlbmd0aCk7CisJCWlmIChpID09IDApCisJCQlyZXR1cm4oYS0+dHlwZS1iLT50eXBlKTsKKwkJZWxzZQorCQkJcmV0dXJuKGkpOworCQl9CisJZWxzZQorCQlyZXR1cm4oaSk7CisJfQorCit2b2lkIGFzbjFfYWRkX2Vycm9yKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MsIGludCBvZmZzZXQpCisJeworCWNoYXIgYnVmMVtERUNJTUFMX1NJWkUoYWRkcmVzcykrMV0sYnVmMltERUNJTUFMX1NJWkUob2Zmc2V0KSsxXTsKKworCUJJT19zbnByaW50ZihidWYxLHNpemVvZiBidWYxLCIlbHUiLCh1bnNpZ25lZCBsb25nKWFkZHJlc3MpOworCUJJT19zbnByaW50ZihidWYyLHNpemVvZiBidWYyLCIlZCIsb2Zmc2V0KTsKKwlFUlJfYWRkX2Vycm9yX2RhdGEoNCwiYWRkcmVzcz0iLGJ1ZjEsIiBvZmZzZXQ9IixidWYyKTsKKwl9CisKK2ludCBBU04xX1NUUklOR19sZW5ndGgoY29uc3QgQVNOMV9TVFJJTkcgKngpCit7IHJldHVybiBNX0FTTjFfU1RSSU5HX2xlbmd0aCh4KTsgfQorCit2b2lkIEFTTjFfU1RSSU5HX2xlbmd0aF9zZXQoQVNOMV9TVFJJTkcgKngsIGludCBsZW4pCit7IE1fQVNOMV9TVFJJTkdfbGVuZ3RoX3NldCh4LCBsZW4pOyByZXR1cm47IH0KKworaW50IEFTTjFfU1RSSU5HX3R5cGUoQVNOMV9TVFJJTkcgKngpCit7IHJldHVybiBNX0FTTjFfU1RSSU5HX3R5cGUoeCk7IH0KKwordW5zaWduZWQgY2hhciAqIEFTTjFfU1RSSU5HX2RhdGEoQVNOMV9TVFJJTkcgKngpCit7IHJldHVybiBNX0FTTjFfU1RSSU5HX2RhdGEoeCk7IH0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfbG9jbC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMV9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhNjVlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfbG9jbC5oCkBAIC0wLDAgKzEsMTM0IEBACisvKiBhc24xdC5oICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBJbnRlcm5hbCBBU04xIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9uczogbm90IGZvciBhcHBsaWNhdGlvbiB1c2UgKi8KKworLyogQVNOMSBwcmludCBjb250ZXh0IHN0cnVjdHVyZSAqLworCitzdHJ1Y3QgYXNuMV9wY3R4X3N0CisJeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBubV9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGNlcnRfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBvaWRfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzdHJfZmxhZ3M7CisJfSAvKiBBU04xX1BDVFggKi87CisKKy8qIEFTTjEgcHVibGljIGtleSBtZXRob2Qgc3RydWN0dXJlICovCisKK3N0cnVjdCBldnBfcGtleV9hc24xX21ldGhvZF9zdAorCXsKKwlpbnQgcGtleV9pZDsKKwlpbnQgcGtleV9iYXNlX2lkOworCXVuc2lnbmVkIGxvbmcgcGtleV9mbGFnczsKKworCWNoYXIgKnBlbV9zdHI7CisJY2hhciAqaW5mbzsKKworCWludCAoKnB1Yl9kZWNvZGUpKEVWUF9QS0VZICpwaywgWDUwOV9QVUJLRVkgKnB1Yik7CisJaW50ICgqcHViX2VuY29kZSkoWDUwOV9QVUJLRVkgKnB1YiwgY29uc3QgRVZQX1BLRVkgKnBrKTsKKwlpbnQgKCpwdWJfY21wKShjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpOworCWludCAoKnB1Yl9wcmludCkoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorCQkJCQkJCUFTTjFfUENUWCAqcGN0eCk7CisKKwlpbnQgKCpwcml2X2RlY29kZSkoRVZQX1BLRVkgKnBrLCBQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZik7CisJaW50ICgqcHJpdl9lbmNvZGUpKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4LCBjb25zdCBFVlBfUEtFWSAqcGspOworCWludCAoKnByaXZfcHJpbnQpKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKnBjdHgpOworCisJaW50ICgqcGtleV9zaXplKShjb25zdCBFVlBfUEtFWSAqcGspOworCWludCAoKnBrZXlfYml0cykoY29uc3QgRVZQX1BLRVkgKnBrKTsKKworCWludCAoKnBhcmFtX2RlY29kZSkoRVZQX1BLRVkgKnBrZXksCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKnBkZXIsIGludCBkZXJsZW4pOworCWludCAoKnBhcmFtX2VuY29kZSkoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVuc2lnbmVkIGNoYXIgKipwZGVyKTsKKwlpbnQgKCpwYXJhbV9taXNzaW5nKShjb25zdCBFVlBfUEtFWSAqcGspOworCWludCAoKnBhcmFtX2NvcHkpKEVWUF9QS0VZICp0bywgY29uc3QgRVZQX1BLRVkgKmZyb20pOworCWludCAoKnBhcmFtX2NtcCkoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKTsKKwlpbnQgKCpwYXJhbV9wcmludCkoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorCQkJCQkJCUFTTjFfUENUWCAqcGN0eCk7CisKKwl2b2lkICgqcGtleV9mcmVlKShFVlBfUEtFWSAqcGtleSk7CisJaW50ICgqcGtleV9jdHJsKShFVlBfUEtFWSAqcGtleSwgaW50IG9wLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworCisJLyogTGVnYWN5IGZ1bmN0aW9ucyBmb3Igb2xkIFBFTSAqLworCisJaW50ICgqb2xkX3ByaXZfZGVjb2RlKShFVlBfUEtFWSAqcGtleSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwgaW50IGRlcmxlbik7CisJaW50ICgqb2xkX3ByaXZfZW5jb2RlKShjb25zdCBFVlBfUEtFWSAqcGtleSwgdW5zaWduZWQgY2hhciAqKnBkZXIpOworCisJfSAvKiBFVlBfUEtFWV9BU04xX01FVEhPRCAqLzsKKworLyogTWV0aG9kIHRvIGhhbmRsZSBDUkwgYWNjZXNzLgorICogSW4gZ2VuZXJhbCBhIENSTCBjb3VsZCBiZSB2ZXJ5IGxhcmdlIChzZXZlcmFsIE1iKSBhbmQgY2FuIGNvbnN1bWUgbGFyZ2UKKyAqIGFtb3VudHMgb2YgcmVzb3VyY2VzIGlmIHN0b3JlZCBpbiBtZW1vcnkgYnkgbXVsdGlwbGUgcHJvY2Vzc2VzLgorICogVGhpcyBtZXRob2QgYWxsb3dzIGdlbmVyYWwgQ1JMIG9wZXJhdGlvbnMgdG8gYmUgcmVkaXJlY3RlZCB0byBtb3JlCisgKiBlZmZpY2llbnQgY2FsbGJhY2tzOiBmb3IgZXhhbXBsZSBhIENSTCBlbnRyeSBkYXRhYmFzZS4KKyAqLworCisjZGVmaW5lIFg1MDlfQ1JMX01FVEhPRF9EWU5BTUlDCQkxCisKK3N0cnVjdCB4NTA5X2NybF9tZXRob2Rfc3QKKwl7CisJaW50IGZsYWdzOworCWludCAoKmNybF9pbml0KShYNTA5X0NSTCAqY3JsKTsKKwlpbnQgKCpjcmxfZnJlZSkoWDUwOV9DUkwgKmNybCk7CisJaW50ICgqY3JsX2xvb2t1cCkoWDUwOV9DUkwgKmNybCwgWDUwOV9SRVZPS0VEICoqcmV0LAorCQkJCUFTTjFfSU5URUdFUiAqc2VyLCBYNTA5X05BTUUgKmlzc3Vlcik7CisJaW50ICgqY3JsX3ZlcmlmeSkoWDUwOV9DUkwgKmNybCwgRVZQX1BLRVkgKnBrKTsKKwl9OwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMV9tYWMuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdiZDBlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfbWFjLmgKQEAgLTAsMCArMSw1NzggQEAKKy8qIGNyeXB0by9hc24xL2FzbjFfbWFjLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfQVNOMV9NQUNfSAorI2RlZmluZSBIRUFERVJfQVNOMV9NQUNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgQVNOMV9NQUNfRVJSX0xJQgorI2RlZmluZSBBU04xX01BQ19FUlJfTElCCUVSUl9MSUJfQVNOMQorI2VuZGlmIAorCisjZGVmaW5lIEFTTjFfTUFDX0hfZXJyKGYscixsaW5lKSBcCisJRVJSX1BVVF9lcnJvcihBU04xX01BQ19FUlJfTElCLChmKSwociksX19GSUxFX18sKGxpbmUpKQorCisjZGVmaW5lIE1fQVNOMV9EMklfdmFycyhhLHR5cGUsZnVuYykgXAorCUFTTjFfY29uc3RfQ1RYIGM7IFwKKwl0eXBlIHJldD1OVUxMOyBcCisJXAorCWMucHA9KGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopcHA7IFwKKwljLnE9ICooY29uc3QgdW5zaWduZWQgY2hhciAqKilwcDsgXAorCWMuZXJyb3I9RVJSX1JfTkVTVEVEX0FTTjFfRVJST1I7IFwKKwlpZiAoKGEgPT0gTlVMTCkgfHwgKCgqYSkgPT0gTlVMTCkpIFwKKwkJeyBpZiAoKHJldD0odHlwZSlmdW5jKCkpID09IE5VTEwpIFwKKwkJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSB9IFwKKwllbHNlCXJldD0oKmEpOworCisjZGVmaW5lIE1fQVNOMV9EMklfSW5pdCgpIFwKKwljLnA9ICooY29uc3QgdW5zaWduZWQgY2hhciAqKilwcDsgXAorCWMubWF4PShsZW5ndGggPT0gMCk/MDooYy5wK2xlbmd0aCk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9GaW5pc2hfMihhKSBcCisJaWYgKCFhc24xX2NvbnN0X0ZpbmlzaCgmYykpIFwKKwkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkqKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopcHA9Yy5wOyBcCisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7IFwKKwlyZXR1cm4ocmV0KTsKKworI2RlZmluZSBNX0FTTjFfRDJJX0ZpbmlzaChhLGZ1bmMsZSkgXAorCU1fQVNOMV9EMklfRmluaXNoXzIoYSk7IFwKK2VycjpcCisJQVNOMV9NQUNfSF9lcnIoKGUpLGMuZXJyb3IsYy5saW5lKTsgXAorCWFzbjFfYWRkX2Vycm9yKCooY29uc3QgdW5zaWduZWQgY2hhciAqKilwcCwoaW50KShjLnEtICpwcCkpOyBcCisJaWYgKChyZXQgIT0gTlVMTCkgJiYgKChhID09IE5VTEwpIHx8ICgqYSAhPSByZXQpKSkgZnVuYyhyZXQpOyBcCisJcmV0dXJuKE5VTEwpCisKKyNkZWZpbmUgTV9BU04xX0QySV9zdGFydF9zZXF1ZW5jZSgpIFwKKwlpZiAoIWFzbjFfR2V0U2VxdWVuY2UoJmMsJmxlbmd0aCkpIFwKKwkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9CisvKiBCZWdpbiByZWFkaW5nIEFTTjEgd2l0aG91dCBhIHN1cnJvdW5kaW5nIHNlcXVlbmNlICovCisjZGVmaW5lIE1fQVNOMV9EMklfYmVnaW4oKSBcCisJYy5zbGVuID0gbGVuZ3RoOworCisvKiBFbmQgcmVhZGluZyBBU04xIHdpdGggbm8gY2hlY2sgb24gbGVuZ3RoICovCisjZGVmaW5lIE1fQVNOMV9EMklfRmluaXNoX25vbGVuKGEsIGZ1bmMsIGUpIFwKKwkqcHA9Yy5wOyBcCisJaWYgKGEgIT0gTlVMTCkgKCphKT1yZXQ7IFwKKwlyZXR1cm4ocmV0KTsgXAorZXJyOlwKKwlBU04xX01BQ19IX2VycigoZSksYy5lcnJvcixjLmxpbmUpOyBcCisJYXNuMV9hZGRfZXJyb3IoKnBwLChpbnQpKGMucS0gKnBwKSk7IFwKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKSBmdW5jKHJldCk7IFwKKwlyZXR1cm4oTlVMTCkKKworI2RlZmluZSBNX0FTTjFfRDJJX2VuZF9zZXF1ZW5jZSgpIFwKKwkoKChjLmluZiYxKSA9PSAwKT8oYy5zbGVuIDw9IDApOiBcCisJCShjLmVvcz1BU04xX2NvbnN0X2NoZWNrX2luZmluaXRlX2VuZCgmYy5wLGMuc2xlbikpKQorCisvKiBEb24ndCB1c2UgdGhpcyB3aXRoIGQyaV9BU04xX0JPT0xFQU4oKSAqLworI2RlZmluZSBNX0FTTjFfRDJJX2dldChiLCBmdW5jKSBcCisJYy5xPWMucDsgXAorCWlmIChmdW5jKCYoYiksJmMucCxjLnNsZW4pID09IE5VTEwpIFwKKwkJe2MubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCWMuc2xlbi09KGMucC1jLnEpOworCisvKiBEb24ndCB1c2UgdGhpcyB3aXRoIGQyaV9BU04xX0JPT0xFQU4oKSAqLworI2RlZmluZSBNX0FTTjFfRDJJX2dldF94KHR5cGUsYixmdW5jKSBcCisJYy5xPWMucDsgXAorCWlmICgoKEQySV9PRih0eXBlKSlmdW5jKSgmKGIpLCZjLnAsYy5zbGVuKSA9PSBOVUxMKSBcCisJCXtjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwljLnNsZW4tPShjLnAtYy5xKTsKKworLyogdXNlIHRoaXMgaW5zdGVhZCAoKSAqLworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9pbnQoYixmdW5jKSBcCisJYy5xPWMucDsgXAorCWlmIChmdW5jKCYoYiksJmMucCxjLnNsZW4pIDwgMCkgXAorCQl7Yy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJYy5zbGVuLT0oYy5wLWMucSk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfb3B0KGIsZnVuYyx0eXBlKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKChNX0FTTjFfbmV4dCAmICh+Vl9BU04xX0NPTlNUUlVDVEVEKSkgXAorCQk9PSAoVl9BU04xX1VOSVZFUlNBTHwodHlwZSkpKSkgXAorCQl7IFwKKwkJTV9BU04xX0QySV9nZXQoYixmdW5jKTsgXAorCQl9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfaW50X29wdChiLGZ1bmMsdHlwZSkgXAorCWlmICgoYy5zbGVuICE9IDApICYmICgoTV9BU04xX25leHQgJiAoflZfQVNOMV9DT05TVFJVQ1RFRCkpIFwKKwkJPT0gKFZfQVNOMV9VTklWRVJTQUx8KHR5cGUpKSkpIFwKKwkJeyBcCisJCU1fQVNOMV9EMklfZ2V0X2ludChiLGZ1bmMpOyBcCisJCX0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9pbXAoYixmdW5jLCB0eXBlKSBcCisJTV9BU04xX25leHQ9KF90bXAmIFZfQVNOMV9DT05TVFJVQ1RFRCl8dHlwZTsgXAorCWMucT1jLnA7IFwKKwlpZiAoZnVuYygmKGIpLCZjLnAsYy5zbGVuKSA9PSBOVUxMKSBcCisJCXtjLmxpbmU9X19MSU5FX187IE1fQVNOMV9uZXh0X3ByZXYgPSBfdG1wOyBnb3RvIGVycjsgfSBcCisJYy5zbGVuLT0oYy5wLWMucSk7XAorCU1fQVNOMV9uZXh0X3ByZXY9X3RtcDsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9JTVBfb3B0KGIsZnVuYyx0YWcsdHlwZSkgXAorCWlmICgoYy5zbGVuICE9IDApICYmICgoTV9BU04xX25leHQgJiAoflZfQVNOMV9DT05TVFJVQ1RFRCkpID09IFwKKwkJKFZfQVNOMV9DT05URVhUX1NQRUNJRklDfCh0YWcpKSkpIFwKKwkJeyBcCisJCXVuc2lnbmVkIGNoYXIgX3RtcCA9IE1fQVNOMV9uZXh0OyBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcChiLGZ1bmMsIHR5cGUpO1wKKwkJfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NldChyLGZ1bmMsZnJlZV9mdW5jKSBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcF9zZXQocixmdW5jLGZyZWVfZnVuYywgXAorCQkJVl9BU04xX1NFVCxWX0FTTjFfVU5JVkVSU0FMKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMpIFwKKwkJTV9BU04xX0QySV9nZXRfaW1wX3NldF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYywgXAorCQkJVl9BU04xX1NFVCxWX0FTTjFfVU5JVkVSU0FMKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXRfb3B0KHIsZnVuYyxmcmVlX2Z1bmMpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoTV9BU04xX25leHQgPT0gKFZfQVNOMV9VTklWRVJTQUx8IFwKKwkJVl9BU04xX0NPTlNUUlVDVEVEfFZfQVNOMV9TRVQpKSlcCisJCXsgTV9BU04xX0QySV9nZXRfc2V0KHIsZnVuYyxmcmVlX2Z1bmMpOyB9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2V0X29wdF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYykgXAorCWlmICgoYy5zbGVuICE9IDApICYmIChNX0FTTjFfbmV4dCA9PSAoVl9BU04xX1VOSVZFUlNBTHwgXAorCQlWX0FTTjFfQ09OU1RSVUNURUR8Vl9BU04xX1NFVCkpKVwKKwkJeyBNX0FTTjFfRDJJX2dldF9zZXRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMpOyB9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fU0VUX29wdChhLGYpIFwKKwlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQlNX0FTTjFfSTJEX2xlbl9TRVQoYSxmKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVRfb3B0KGEsZikgXAorCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCU1fQVNOMV9JMkRfcHV0X1NFVChhLGYpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X1NFUVVFTkNFX29wdChhLGYpIFwKKwlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQlNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRShhLGYpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmKSBcCisJaWYgKChhICE9IE5VTEwpICYmIChza18jI3R5cGUjI19udW0oYSkgIT0gMCkpIFwKKwkJTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0VfdHlwZSh0eXBlLGEsZik7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfSU1QX3NldF9vcHQoYixmdW5jLGZyZWVfZnVuYyx0YWcpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiBcCisJCShNX0FTTjFfbmV4dCA9PSBcCisJCShWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQ3xWX0FTTjFfQ09OU1RSVUNURUR8KHRhZykpKSlcCisJCXsgXAorCQlNX0FTTjFfRDJJX2dldF9pbXBfc2V0KGIsZnVuYyxmcmVlX2Z1bmMsXAorCQkJdGFnLFZfQVNOMV9DT05URVhUX1NQRUNJRklDKTsgXAorCQl9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfSU1QX3NldF9vcHRfdHlwZSh0eXBlLGIsZnVuYyxmcmVlX2Z1bmMsdGFnKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgXAorCQkoTV9BU04xX25leHQgPT0gXAorCQkoVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUN8Vl9BU04xX0NPTlNUUlVDVEVEfCh0YWcpKSkpXAorCQl7IFwKKwkJTV9BU04xX0QySV9nZXRfaW1wX3NldF90eXBlKHR5cGUsYixmdW5jLGZyZWVfZnVuYyxcCisJCQl0YWcsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMpOyBcCisJCX0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXEocixmdW5jLGZyZWVfZnVuYykgXAorCQlNX0FTTjFfRDJJX2dldF9pbXBfc2V0KHIsZnVuYyxmcmVlX2Z1bmMsXAorCQkJVl9BU04xX1NFUVVFTkNFLFZfQVNOMV9VTklWRVJTQUwpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NlcV90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYykgXAorCQlNX0FTTjFfRDJJX2dldF9pbXBfc2V0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jLFwKKwkJCQkJICAgIFZfQVNOMV9TRVFVRU5DRSxWX0FTTjFfVU5JVkVSU0FMKQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NlcV9vcHQocixmdW5jLGZyZWVfZnVuYykgXAorCWlmICgoYy5zbGVuICE9IDApICYmIChNX0FTTjFfbmV4dCA9PSAoVl9BU04xX1VOSVZFUlNBTHwgXAorCQlWX0FTTjFfQ09OU1RSVUNURUR8Vl9BU04xX1NFUVVFTkNFKSkpXAorCQl7IE1fQVNOMV9EMklfZ2V0X3NlcShyLGZ1bmMsZnJlZV9mdW5jKTsgfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NlcV9vcHRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoTV9BU04xX25leHQgPT0gKFZfQVNOMV9VTklWRVJTQUx8IFwKKwkJVl9BU04xX0NPTlNUUlVDVEVEfFZfQVNOMV9TRVFVRU5DRSkpKVwKKwkJeyBNX0FTTjFfRDJJX2dldF9zZXFfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMpOyB9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfSU1QX3NldChyLGZ1bmMsZnJlZV9mdW5jLHgpIFwKKwkJTV9BU04xX0QySV9nZXRfaW1wX3NldChyLGZ1bmMsZnJlZV9mdW5jLFwKKwkJCXgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X0lNUF9zZXRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMseCkgXAorCQlNX0FTTjFfRDJJX2dldF9pbXBfc2V0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jLFwKKwkJCXgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X2ltcF9zZXQocixmdW5jLGZyZWVfZnVuYyxhLGIpIFwKKwljLnE9Yy5wOyBcCisJaWYgKGQyaV9BU04xX1NFVCgmKHIpLCZjLnAsYy5zbGVuLChjaGFyICooKikoKSlmdW5jLFwKKwkJKHZvaWQgKCopKCkpZnJlZV9mdW5jLGEsYikgPT0gTlVMTCkgXAorCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCWMuc2xlbi09KGMucC1jLnEpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X2ltcF9zZXRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMsYSxiKSBcCisJYy5xPWMucDsgXAorCWlmIChkMmlfQVNOMV9TRVRfT0ZfIyN0eXBlKCYociksJmMucCxjLnNsZW4sZnVuYyxcCisJCQkJICAgZnJlZV9mdW5jLGEsYikgPT0gTlVMTCkgXAorCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCWMuc2xlbi09KGMucC1jLnEpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NldF9zdHJpbmdzKHIsZnVuYyxhLGIpIFwKKwljLnE9Yy5wOyBcCisJaWYgKGQyaV9BU04xX1NUUklOR19TRVQoJihyKSwmYy5wLGMuc2xlbixhLGIpID09IE5VTEwpIFwKKwkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwljLnNsZW4tPShjLnAtYy5xKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9FWFBfb3B0KHIsZnVuYyx0YWcpIFwKKwlpZiAoKGMuc2xlbiAhPSAwTCkgJiYgKE1fQVNOMV9uZXh0ID09IFwKKwkJKFZfQVNOMV9DT05TVFJVQ1RFRHxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQ3x0YWcpKSkgXAorCQl7IFwKKwkJaW50IFRpbmYsVHRhZyxUY2xhc3M7IFwKKwkJbG9uZyBUbGVuOyBcCisJCVwKKwkJYy5xPWMucDsgXAorCQlUaW5mPUFTTjFfZ2V0X29iamVjdCgmYy5wLCZUbGVuLCZUdGFnLCZUY2xhc3MsYy5zbGVuKTsgXAorCQlpZiAoVGluZiAmIDB4ODApIFwKKwkJCXsgYy5lcnJvcj1FUlJfUl9CQURfQVNOMV9PQkpFQ1RfSEVBREVSOyBcCisJCQljLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkJaWYgKFRpbmYgPT0gKFZfQVNOMV9DT05TVFJVQ1RFRCsxKSkgXAorCQkJCQlUbGVuID0gYy5zbGVuIC0gKGMucCAtIGMucSkgLSAyOyBcCisJCWlmIChmdW5jKCYociksJmMucCxUbGVuKSA9PSBOVUxMKSBcCisJCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQlpZiAoVGluZiA9PSAoVl9BU04xX0NPTlNUUlVDVEVEKzEpKSB7IFwKKwkJCVRsZW4gPSBjLnNsZW4gLSAoYy5wIC0gYy5xKTsgXAorCQkJaWYoIUFTTjFfY29uc3RfY2hlY2tfaW5maW5pdGVfZW5kKCZjLnAsIFRsZW4pKSBcCisJCQkJeyBjLmVycm9yPUVSUl9SX01JU1NJTkdfQVNOMV9FT1M7IFwKKwkJCQljLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkJfVwKKwkJYy5zbGVuLT0oYy5wLWMucSk7IFwKKwkJfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X0VYUF9zZXRfb3B0KHIsZnVuYyxmcmVlX2Z1bmMsdGFnLGIpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoTV9BU04xX25leHQgPT0gXAorCQkoVl9BU04xX0NPTlNUUlVDVEVEfFZfQVNOMV9DT05URVhUX1NQRUNJRklDfHRhZykpKSBcCisJCXsgXAorCQlpbnQgVGluZixUdGFnLFRjbGFzczsgXAorCQlsb25nIFRsZW47IFwKKwkJXAorCQljLnE9Yy5wOyBcCisJCVRpbmY9QVNOMV9nZXRfb2JqZWN0KCZjLnAsJlRsZW4sJlR0YWcsJlRjbGFzcyxjLnNsZW4pOyBcCisJCWlmIChUaW5mICYgMHg4MCkgXAorCQkJeyBjLmVycm9yPUVSUl9SX0JBRF9BU04xX09CSkVDVF9IRUFERVI7IFwKKwkJCWMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQlpZiAoVGluZiA9PSAoVl9BU04xX0NPTlNUUlVDVEVEKzEpKSBcCisJCQkJCVRsZW4gPSBjLnNsZW4gLSAoYy5wIC0gYy5xKSAtIDI7IFwKKwkJaWYgKGQyaV9BU04xX1NFVCgmKHIpLCZjLnAsVGxlbiwoY2hhciAqKCopKCkpZnVuYywgXAorCQkJKHZvaWQgKCopKCkpZnJlZV9mdW5jLCBcCisJCQliLFZfQVNOMV9VTklWRVJTQUwpID09IE5VTEwpIFwKKwkJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJCWlmIChUaW5mID09IChWX0FTTjFfQ09OU1RSVUNURUQrMSkpIHsgXAorCQkJVGxlbiA9IGMuc2xlbiAtIChjLnAgLSBjLnEpOyBcCisJCQlpZighQVNOMV9jaGVja19pbmZpbml0ZV9lbmQoJmMucCwgVGxlbikpIFwKKwkJCQl7IGMuZXJyb3I9RVJSX1JfTUlTU0lOR19BU04xX0VPUzsgXAorCQkJCWMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQl9XAorCQljLnNsZW4tPShjLnAtYy5xKTsgXAorCQl9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfRVhQX3NldF9vcHRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMsdGFnLGIpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoTV9BU04xX25leHQgPT0gXAorCQkoVl9BU04xX0NPTlNUUlVDVEVEfFZfQVNOMV9DT05URVhUX1NQRUNJRklDfHRhZykpKSBcCisJCXsgXAorCQlpbnQgVGluZixUdGFnLFRjbGFzczsgXAorCQlsb25nIFRsZW47IFwKKwkJXAorCQljLnE9Yy5wOyBcCisJCVRpbmY9QVNOMV9nZXRfb2JqZWN0KCZjLnAsJlRsZW4sJlR0YWcsJlRjbGFzcyxjLnNsZW4pOyBcCisJCWlmIChUaW5mICYgMHg4MCkgXAorCQkJeyBjLmVycm9yPUVSUl9SX0JBRF9BU04xX09CSkVDVF9IRUFERVI7IFwKKwkJCWMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQlpZiAoVGluZiA9PSAoVl9BU04xX0NPTlNUUlVDVEVEKzEpKSBcCisJCQkJCVRsZW4gPSBjLnNsZW4gLSAoYy5wIC0gYy5xKSAtIDI7IFwKKwkJaWYgKGQyaV9BU04xX1NFVF9PRl8jI3R5cGUoJihyKSwmYy5wLFRsZW4sZnVuYywgXAorCQkJZnJlZV9mdW5jLGIsVl9BU04xX1VOSVZFUlNBTCkgPT0gTlVMTCkgXAorCQkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkJaWYgKFRpbmYgPT0gKFZfQVNOMV9DT05TVFJVQ1RFRCsxKSkgeyBcCisJCQlUbGVuID0gYy5zbGVuIC0gKGMucCAtIGMucSk7IFwKKwkJCWlmKCFBU04xX2NoZWNrX2luZmluaXRlX2VuZCgmYy5wLCBUbGVuKSkgXAorCQkJCXsgYy5lcnJvcj1FUlJfUl9NSVNTSU5HX0FTTjFfRU9TOyBcCisJCQkJYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJCX1cCisJCWMuc2xlbi09KGMucC1jLnEpOyBcCisJCX0KKworLyogTmV3IG1hY3JvcyAqLworI2RlZmluZSBNX0FTTjFfTmV3X01hbGxvYyhyZXQsdHlwZSkgXAorCWlmICgocmV0PSh0eXBlICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKHR5cGUpKSkgPT0gTlVMTCkgXAorCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnIyOyB9CisKKyNkZWZpbmUgTV9BU04xX05ldyhhcmcsZnVuYykgXAorCWlmICgoKGFyZyk9ZnVuYygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCkKKworI2RlZmluZSBNX0FTTjFfTmV3X0Vycm9yKGEpIFwKKy8qCWVycjoJQVNOMV9NQUNfSF9lcnIoKGEpLEVSUl9SX05FU1RFRF9BU04xX0VSUk9SLGMubGluZSk7IFwKKwkJcmV0dXJuKE5VTEwpOyovIFwKKwllcnIyOglBU04xX01BQ19IX2VycigoYSksRVJSX1JfTUFMTE9DX0ZBSUxVUkUsYy5saW5lKTsgXAorCQlyZXR1cm4oTlVMTCkKKworCisvKiBCSUcgVUdMWSBXQVJOSU5HISAgVGhpcyBpcyBzbyBkYW1uIHVnbHkgSSB3YW5uYSBwdWtlLiAgVW5mb3J0dW5hdGVseSwKKyAgIHNvbWUgbWFjcm9zIHRoYXQgdXNlIEFTTjFfY29uc3RfQ1RYIHN0aWxsIGluc2lzdCBvbiB3cml0aW5nIGluIHRoZSBpbnB1dAorICAgc3RyZWFtLiAgQVJHSCEgIEFSR0ghICBBUkdIISAgTGV0J3MgZ2V0IHJpZCBvZiB0aGlzIG1hY3JvIHBhY2thZ2UuCisgICBQbGVhc2U/CQkJCQkJLS0gUmljaGFyZCBMZXZpdHRlICovCisjZGVmaW5lIE1fQVNOMV9uZXh0CQkoKigodW5zaWduZWQgY2hhciAqKShjLnApKSkKKyNkZWZpbmUgTV9BU04xX25leHRfcHJldgkoKigodW5zaWduZWQgY2hhciAqKShjLnEpKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTV9BU04xX0kyRF92YXJzKGEpCWludCByPTAscmV0PTA7IFwKKwkJCQl1bnNpZ25lZCBjaGFyICpwOyBcCisJCQkJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApCisKKy8qIExlbmd0aCBNYWNyb3MgKi8KKyNkZWZpbmUgTV9BU04xX0kyRF9sZW4oYSxmKQlyZXQrPWYoYSxOVUxMKQorI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9JTVBfb3B0KGEsZikJaWYgKGEgIT0gTlVMTCkgTV9BU04xX0kyRF9sZW4oYSxmKQorCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX1NFVChhLGYpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVQoYSxOVUxMLGYsVl9BU04xX1NFVCxWX0FTTjFfVU5JVkVSU0FMLElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fU0VUX3R5cGUodHlwZSxhLGYpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsTlVMTCxmLFZfQVNOMV9TRVQsIFwKKwkJCQkJICAgIFZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRShhLGYpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVQoYSxOVUxMLGYsVl9BU04xX1NFUVVFTkNFLFZfQVNOMV9VTklWRVJTQUwsIFwKKwkJCQkgIElTX1NFUVVFTkNFKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRV90eXBlKHR5cGUsYSxmKSBcCisJCXJldCs9aTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLE5VTEwsZixWX0FTTjFfU0VRVUVOQ0UsIFwKKwkJCQkJICAgIFZfQVNOMV9VTklWRVJTQUwsSVNfU0VRVUVOQ0UpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fU0VRVUVOQ0Vfb3B0KGEsZikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJTV9BU04xX0kyRF9sZW5fU0VRVUVOQ0UoYSxmKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRV9vcHRfdHlwZSh0eXBlLGEsZikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQkJTV9BU04xX0kyRF9sZW5fU0VRVUVOQ0VfdHlwZSh0eXBlLGEsZik7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFVChhLGYseCkgXAorCQlyZXQrPWkyZF9BU04xX1NFVChhLE5VTEwsZix4LFZfQVNOMV9DT05URVhUX1NQRUNJRklDLElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFVF90eXBlKHR5cGUsYSxmLHgpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsTlVMTCxmLHgsIFwKKwkJCQkJICAgIFZfQVNOMV9DT05URVhUX1NQRUNJRklDLElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFVF9vcHQoYSxmLHgpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza19udW0oYSkgIT0gMCkpIFwKKwkJCXJldCs9aTJkX0FTTjFfU0VUKGEsTlVMTCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkJICBJU19TRVQpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0lNUF9TRVRfb3B0X3R5cGUodHlwZSxhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQkJcmV0Kz1pMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsTlVMTCxmLHgsIFwKKwkJCQkJICAgICAgIFZfQVNOMV9DT05URVhUX1NQRUNJRklDLElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFUVVFTkNFKGEsZix4KSBcCisJCXJldCs9aTJkX0FTTjFfU0VUKGEsTlVMTCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkgIElTX1NFUVVFTkNFKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9JTVBfU0VRVUVOQ0Vfb3B0KGEsZix4KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQlyZXQrPWkyZF9BU04xX1NFVChhLE5VTEwsZix4LFZfQVNOMV9DT05URVhUX1NQRUNJRklDLCBcCisJCQkJCSAgSVNfU0VRVUVOQ0UpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0lNUF9TRVFVRU5DRV9vcHRfdHlwZSh0eXBlLGEsZix4KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfIyN0eXBlIyNfbnVtKGEpICE9IDApKSBcCisJCQlyZXQrPWkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSxOVUxMLGYseCwgXAorCQkJCQkJICAgIFZfQVNOMV9DT05URVhUX1NQRUNJRklDLCBcCisJCQkJCQkgICAgSVNfU0VRVUVOQ0UpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0VYUF9vcHQoYSxmLG10YWcsdikgXAorCQlpZiAoYSAhPSBOVUxMKVwKKwkJCXsgXAorCQkJdj1mKGEsTlVMTCk7IFwKKwkJCXJldCs9QVNOMV9vYmplY3Rfc2l6ZSgxLHYsbXRhZyk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9FWFBfU0VUX29wdChhLGYsbXRhZyx0YWcsdikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSlcCisJCQl7IFwKKwkJCXY9aTJkX0FTTjFfU0VUKGEsTlVMTCxmLHRhZyxWX0FTTjFfVU5JVkVSU0FMLElTX1NFVCk7IFwKKwkJCXJldCs9QVNOMV9vYmplY3Rfc2l6ZSgxLHYsbXRhZyk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9FWFBfU0VRVUVOQ0Vfb3B0KGEsZixtdGFnLHRhZyx2KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKVwKKwkJCXsgXAorCQkJdj1pMmRfQVNOMV9TRVQoYSxOVUxMLGYsdGFnLFZfQVNOMV9VTklWRVJTQUwsIFwKKwkJCQkgICAgICAgSVNfU0VRVUVOQ0UpOyBcCisJCQlyZXQrPUFTTjFfb2JqZWN0X3NpemUoMSx2LG10YWcpOyBcCisJCQl9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fRVhQX1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmLG10YWcsdGFnLHYpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza18jI3R5cGUjI19udW0oYSkgIT0gMCkpXAorCQkJeyBcCisJCQl2PWkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSxOVUxMLGYsdGFnLCBcCisJCQkJCQkgVl9BU04xX1VOSVZFUlNBTCwgXAorCQkJCQkJIElTX1NFUVVFTkNFKTsgXAorCQkJcmV0Kz1BU04xX29iamVjdF9zaXplKDEsdixtdGFnKTsgXAorCQkJfQorCisvKiBQdXQgTWFjcm9zICovCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0KGEsZikJZihhLCZwKQorCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0lNUF9vcHQoYSxmLHQpCVwKKwkJaWYgKGEgIT0gTlVMTCkgXAorCQkJeyBcCisJCQl1bnNpZ25lZCBjaGFyICpxPXA7IFwKKwkJCWYoYSwmcCk7IFwKKwkJCSpxPShWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQ3x0fCgqcSZWX0FTTjFfQ09OU1RSVUNURUQpKTtcCisJCQl9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VUKGEsZikgaTJkX0FTTjFfU0VUKGEsJnAsZixWX0FTTjFfU0VULFwKKwkJCVZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKQorI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVRfdHlwZSh0eXBlLGEsZikgXAorICAgICBpMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsJnAsZixWX0FTTjFfU0VULFZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKQorI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VUKGEsZix4KSBpMmRfQVNOMV9TRVQoYSwmcCxmLHgsXAorCQkJVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsSVNfU0VUKQorI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VUX3R5cGUodHlwZSxhLGYseCkgXAorICAgICBpMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsJnAsZix4LFZfQVNOMV9DT05URVhUX1NQRUNJRklDLElTX1NFVCkKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfSU1QX1NFUVVFTkNFKGEsZix4KSBpMmRfQVNOMV9TRVQoYSwmcCxmLHgsXAorCQkJVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsSVNfU0VRVUVOQ0UpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0UoYSxmKSBpMmRfQVNOMV9TRVQoYSwmcCxmLFZfQVNOMV9TRVFVRU5DRSxcCisJCQkJCSAgICAgVl9BU04xX1VOSVZFUlNBTCxJU19TRVFVRU5DRSkKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRV90eXBlKHR5cGUsYSxmKSBcCisgICAgIGkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSwmcCxmLFZfQVNOMV9TRVFVRU5DRSxWX0FTTjFfVU5JVkVSU0FMLCBcCisJCQkgICAgSVNfU0VRVUVOQ0UpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0Vfb3B0KGEsZikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0UoYSxmKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VUX29wdChhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJeyBpMmRfQVNOMV9TRVQoYSwmcCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkgICAgICAgSVNfU0VUKTsgfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0lNUF9TRVRfb3B0X3R5cGUodHlwZSxhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQkJeyBpMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsJnAsZix4LCBcCisJCQkJCQkgVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkJCSBJU19TRVQpOyB9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfSU1QX1NFUVVFTkNFX29wdChhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJeyBpMmRfQVNOMV9TRVQoYSwmcCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkgICAgICAgSVNfU0VRVUVOQ0UpOyB9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfSU1QX1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmLHgpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza18jI3R5cGUjI19udW0oYSkgIT0gMCkpIFwKKwkJCXsgaTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLCZwLGYseCwgXAorCQkJCQkJIFZfQVNOMV9DT05URVhUX1NQRUNJRklDLCBcCisJCQkJCQkgSVNfU0VRVUVOQ0UpOyB9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfRVhQX29wdChhLGYsdGFnLHYpIFwKKwkJaWYgKGEgIT0gTlVMTCkgXAorCQkJeyBcCisJCQlBU04xX3B1dF9vYmplY3QoJnAsMSx2LHRhZyxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7IFwKKwkJCWYoYSwmcCk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9FWFBfU0VUX29wdChhLGYsbXRhZyx0YWcsdikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJeyBcCisJCQlBU04xX3B1dF9vYmplY3QoJnAsMSx2LG10YWcsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMpOyBcCisJCQlpMmRfQVNOMV9TRVQoYSwmcCxmLHRhZyxWX0FTTjFfVU5JVkVSU0FMLElTX1NFVCk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9FWFBfU0VRVUVOQ0Vfb3B0KGEsZixtdGFnLHRhZyx2KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQl7IFwKKwkJCUFTTjFfcHV0X29iamVjdCgmcCwxLHYsbXRhZyxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7IFwKKwkJCWkyZF9BU04xX1NFVChhLCZwLGYsdGFnLFZfQVNOMV9VTklWRVJTQUwsSVNfU0VRVUVOQ0UpOyBcCisJCQl9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfRVhQX1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmLG10YWcsdGFnLHYpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza18jI3R5cGUjI19udW0oYSkgIT0gMCkpIFwKKwkJCXsgXAorCQkJQVNOMV9wdXRfb2JqZWN0KCZwLDEsdixtdGFnLFZfQVNOMV9DT05URVhUX1NQRUNJRklDKTsgXAorCQkJaTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLCZwLGYsdGFnLFZfQVNOMV9VTklWRVJTQUwsIFwKKwkJCQkJICAgICAgIElTX1NFUVVFTkNFKTsgXAorCQkJfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfc2VxX3RvdGFsKCkgXAorCQlyPUFTTjFfb2JqZWN0X3NpemUoMSxyZXQsVl9BU04xX1NFUVVFTkNFKTsgXAorCQlpZiAocHAgPT0gTlVMTCkgcmV0dXJuKHIpOyBcCisJCXA9ICpwcDsgXAorCQlBU04xX3B1dF9vYmplY3QoJnAsMSxyZXQsVl9BU04xX1NFUVVFTkNFLFZfQVNOMV9VTklWRVJTQUwpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9JTkZfc2VxX3N0YXJ0KHRhZyxjdHgpIFwKKwkJKihwKyspPShWX0FTTjFfQ09OU1RSVUNURUR8KHRhZyl8KGN0eCkpOyBcCisJCSoocCsrKT0weDgwCisKKyNkZWZpbmUgTV9BU04xX0kyRF9JTkZfc2VxX2VuZCgpICoocCsrKT0weDAwOyAqKHArKyk9MHgwMAorCisjZGVmaW5lIE1fQVNOMV9JMkRfZmluaXNoKCkJKnBwPXA7IFwKKwkJCQlyZXR1cm4ocik7CisKK2ludCBhc24xX0dldFNlcXVlbmNlKEFTTjFfY29uc3RfQ1RYICpjLCBsb25nICpsZW5ndGgpOwordm9pZCBhc24xX2FkZF9lcnJvcihjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyZXNzLGludCBvZmZzZXQpOworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMV9wYXIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfcGFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjYTY5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2FzbjFfcGFyLmMKQEAgLTAsMCArMSw0MzcgQEAKKy8qIGNyeXB0by9hc24xL2FzbjFfcGFyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCitzdGF0aWMgaW50IGFzbjFfcHJpbnRfaW5mbyhCSU8gKmJwLCBpbnQgdGFnLCBpbnQgeGNsYXNzLGludCBjb25zdHJ1Y3RlZCwKKwlpbnQgaW5kZW50KTsKK3N0YXRpYyBpbnQgYXNuMV9wYXJzZTIoQklPICpicCwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCwKKwlpbnQgb2Zmc2V0LCBpbnQgZGVwdGgsIGludCBpbmRlbnQsIGludCBkdW1wKTsKK3N0YXRpYyBpbnQgYXNuMV9wcmludF9pbmZvKEJJTyAqYnAsIGludCB0YWcsIGludCB4Y2xhc3MsIGludCBjb25zdHJ1Y3RlZCwKKwkgICAgIGludCBpbmRlbnQpCisJeworCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdPSIlLTE4cyI7CisJY2hhciBzdHJbMTI4XTsKKwljb25zdCBjaGFyICpwOworCisJaWYgKGNvbnN0cnVjdGVkICYgVl9BU04xX0NPTlNUUlVDVEVEKQorCQlwPSJjb25zOiAiOworCWVsc2UKKwkJcD0icHJpbTogIjsKKwlpZiAoQklPX3dyaXRlKGJwLHAsNikgPCA2KSBnb3RvIGVycjsKKwlCSU9faW5kZW50KGJwLGluZGVudCwxMjgpOworCisJcD1zdHI7CisJaWYgKCh4Y2xhc3MgJiBWX0FTTjFfUFJJVkFURSkgPT0gVl9BU04xX1BSSVZBVEUpCisJCUJJT19zbnByaW50ZihzdHIsc2l6ZW9mIHN0ciwicHJpdiBbICVkIF0gIix0YWcpOworCWVsc2UgaWYgKCh4Y2xhc3MgJiBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQykgPT0gVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMpCisJCUJJT19zbnByaW50ZihzdHIsc2l6ZW9mIHN0ciwiY29udCBbICVkIF0iLHRhZyk7CisJZWxzZSBpZiAoKHhjbGFzcyAmIFZfQVNOMV9BUFBMSUNBVElPTikgPT0gVl9BU04xX0FQUExJQ0FUSU9OKQorCQlCSU9fc25wcmludGYoc3RyLHNpemVvZiBzdHIsImFwcGwgWyAlZCBdIix0YWcpOworCWVsc2UgaWYgKHRhZyA+IDMwKQorCQlCSU9fc25wcmludGYoc3RyLHNpemVvZiBzdHIsIjxBU04xICVkPiIsdGFnKTsKKwllbHNlCisJCXAgPSBBU04xX3RhZzJzdHIodGFnKTsKKworCWlmIChCSU9fcHJpbnRmKGJwLGZtdCxwKSA8PSAwKQorCQlnb3RvIGVycjsKKwlyZXR1cm4oMSk7CitlcnI6CisJcmV0dXJuKDApOworCX0KKworaW50IEFTTjFfcGFyc2UoQklPICpicCwgY29uc3QgdW5zaWduZWQgY2hhciAqcHAsIGxvbmcgbGVuLCBpbnQgaW5kZW50KQorCXsKKwlyZXR1cm4oYXNuMV9wYXJzZTIoYnAsJnBwLGxlbiwwLDAsaW5kZW50LDApKTsKKwl9CisKK2ludCBBU04xX3BhcnNlX2R1bXAoQklPICpicCwgY29uc3QgdW5zaWduZWQgY2hhciAqcHAsIGxvbmcgbGVuLCBpbnQgaW5kZW50LCBpbnQgZHVtcCkKKwl7CisJcmV0dXJuKGFzbjFfcGFyc2UyKGJwLCZwcCxsZW4sMCwwLGluZGVudCxkdW1wKSk7CisJfQorCitzdGF0aWMgaW50IGFzbjFfcGFyc2UyKEJJTyAqYnAsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgsIGludCBvZmZzZXQsCisJICAgICBpbnQgZGVwdGgsIGludCBpbmRlbnQsIGludCBkdW1wKQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCplcCwqdG90LCpvcCwqb3BwOworCWxvbmcgbGVuOworCWludCB0YWcseGNsYXNzLHJldD0wOworCWludCBubCxobCxqLHI7CisJQVNOMV9PQkpFQ1QgKm89TlVMTDsKKwlBU04xX09DVEVUX1NUUklORyAqb3M9TlVMTDsKKwkvKiBBU04xX0JNUFNUUklORyAqYm1wPU5VTEw7Ki8KKwlpbnQgZHVtcF9pbmRlbnQ7CisKKyNpZiAwCisJZHVtcF9pbmRlbnQgPSBpbmRlbnQ7CisjZWxzZQorCWR1bXBfaW5kZW50ID0gNjsJLyogQmVjYXVzZSB3ZSBrbm93IEJJT19kdW1wX2luZGVudCgpICovCisjZW5kaWYKKwlwPSAqcHA7CisJdG90PXArbGVuZ3RoOworCW9wPXAtMTsKKwl3aGlsZSAoKHAgPCB0b3QpICYmIChvcCA8IHApKQorCQl7CisJCW9wPXA7CisJCWo9QVNOMV9nZXRfb2JqZWN0KCZwLCZsZW4sJnRhZywmeGNsYXNzLGxlbmd0aCk7CisjaWZkZWYgTElOVAorCQlqPWo7CisjZW5kaWYKKwkJaWYgKGogJiAweDgwKQorCQkJeworCQkJaWYgKEJJT193cml0ZShicCwiRXJyb3IgaW4gZW5jb2RpbmdcbiIsMTgpIDw9IDApCisJCQkJZ290byBlbmQ7CisJCQlyZXQ9MDsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlobD0ocC1vcCk7CisJCWxlbmd0aC09aGw7CisJCS8qIGlmIGogPT0gMHgyMSBpdCBpcyBhIGNvbnN0cnVjdGVkIGluZGVmaW5pdGUgbGVuZ3RoIG9iamVjdCAqLworCQlpZiAoQklPX3ByaW50ZihicCwiJTVsZDoiLChsb25nKW9mZnNldCsobG9uZykob3AtICpwcCkpCisJCQk8PSAwKSBnb3RvIGVuZDsKKworCQlpZiAoaiAhPSAoVl9BU04xX0NPTlNUUlVDVEVEIHwgMSkpCisJCQl7CisJCQlpZiAoQklPX3ByaW50ZihicCwiZD0lLTJkIGhsPSVsZCBsPSU0bGQgIiwKKwkJCQlkZXB0aCwobG9uZylobCxsZW4pIDw9IDApCisJCQkJZ290byBlbmQ7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmIChCSU9fcHJpbnRmKGJwLCJkPSUtMmQgaGw9JWxkIGw9aW5mICAiLAorCQkJCWRlcHRoLChsb25nKWhsKSA8PSAwKQorCQkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoIWFzbjFfcHJpbnRfaW5mbyhicCx0YWcseGNsYXNzLGosKGluZGVudCk/ZGVwdGg6MCkpCisJCQlnb3RvIGVuZDsKKwkJaWYgKGogJiBWX0FTTjFfQ09OU1RSVUNURUQpCisJCQl7CisJCQllcD1wK2xlbjsKKwkJCWlmIChCSU9fd3JpdGUoYnAsIlxuIiwxKSA8PSAwKSBnb3RvIGVuZDsKKwkJCWlmIChsZW4gPiBsZW5ndGgpCisJCQkJeworCQkJCUJJT19wcmludGYoYnAsCisJCQkJCSJsZW5ndGggaXMgZ3JlYXRlciB0aGFuICVsZFxuIixsZW5ndGgpOworCQkJCXJldD0wOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWlmICgoaiA9PSAweDIxKSAmJiAobGVuID09IDApKQorCQkJCXsKKwkJCQlmb3IgKDs7KQorCQkJCQl7CisJCQkJCXI9YXNuMV9wYXJzZTIoYnAsJnAsKGxvbmcpKHRvdC1wKSwKKwkJCQkJCW9mZnNldCsocCAtICpwcCksZGVwdGgrMSwKKwkJCQkJCWluZGVudCxkdW1wKTsKKwkJCQkJaWYgKHIgPT0gMCkgeyByZXQ9MDsgZ290byBlbmQ7IH0KKwkJCQkJaWYgKChyID09IDIpIHx8IChwID49IHRvdCkpIGJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCXdoaWxlIChwIDwgZXApCisJCQkJCXsKKwkJCQkJcj1hc24xX3BhcnNlMihicCwmcCwobG9uZylsZW4sCisJCQkJCQlvZmZzZXQrKHAgLSAqcHApLGRlcHRoKzEsCisJCQkJCQlpbmRlbnQsZHVtcCk7CisJCQkJCWlmIChyID09IDApIHsgcmV0PTA7IGdvdG8gZW5kOyB9CisJCQkJCX0KKwkJCX0KKwkJZWxzZSBpZiAoeGNsYXNzICE9IDApCisJCQl7CisJCQlwKz1sZW47CisJCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlbmQ7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW5sPTA7CisJCQlpZiAoCSh0YWcgPT0gVl9BU04xX1BSSU5UQUJMRVNUUklORykgfHwKKwkJCQkodGFnID09IFZfQVNOMV9UNjFTVFJJTkcpIHx8CisJCQkJKHRhZyA9PSBWX0FTTjFfSUE1U1RSSU5HKSB8fAorCQkJCSh0YWcgPT0gVl9BU04xX1ZJU0lCTEVTVFJJTkcpIHx8CisJCQkJKHRhZyA9PSBWX0FTTjFfTlVNRVJJQ1NUUklORykgfHwKKwkJCQkodGFnID09IFZfQVNOMV9VVEY4U1RSSU5HKSB8fAorCQkJCSh0YWcgPT0gVl9BU04xX1VUQ1RJTUUpIHx8CisJCQkJKHRhZyA9PSBWX0FTTjFfR0VORVJBTElaRURUSU1FKSkKKwkJCQl7CisJCQkJaWYgKEJJT193cml0ZShicCwiOiIsMSkgPD0gMCkgZ290byBlbmQ7CisJCQkJaWYgKChsZW4gPiAwKSAmJgorCQkJCQlCSU9fd3JpdGUoYnAsKGNvbnN0IGNoYXIgKilwLChpbnQpbGVuKQorCQkJCQkhPSAoaW50KWxlbikKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJZWxzZSBpZiAodGFnID09IFZfQVNOMV9PQkpFQ1QpCisJCQkJeworCQkJCW9wcD1vcDsKKwkJCQlpZiAoZDJpX0FTTjFfT0JKRUNUKCZvLCZvcHAsbGVuK2hsKSAhPSBOVUxMKQorCQkJCQl7CisJCQkJCWlmIChCSU9fd3JpdGUoYnAsIjoiLDEpIDw9IDApIGdvdG8gZW5kOworCQkJCQlpMmFfQVNOMV9PQkpFQ1QoYnAsbyk7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKEJJT193cml0ZShicCwiOkJBRCBPQkpFQ1QiLDExKSA8PSAwKQorCQkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlIGlmICh0YWcgPT0gVl9BU04xX0JPT0xFQU4pCisJCQkJeworCQkJCWludCBpaTsKKworCQkJCW9wcD1vcDsKKwkJCQlpaT1kMmlfQVNOMV9CT09MRUFOKE5VTEwsJm9wcCxsZW4raGwpOworCQkJCWlmIChpaSA8IDApCisJCQkJCXsKKwkJCQkJaWYgKEJJT193cml0ZShicCwiQmFkIGJvb2xlYW5cbiIsMTIpIDw9IDApCisJCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCUJJT19wcmludGYoYnAsIjolZCIsaWkpOworCQkJCX0KKwkJCWVsc2UgaWYgKHRhZyA9PSBWX0FTTjFfQk1QU1RSSU5HKQorCQkJCXsKKwkJCQkvKiBkbyB0aGUgQk1QIHRoYW5nICovCisJCQkJfQorCQkJZWxzZSBpZiAodGFnID09IFZfQVNOMV9PQ1RFVF9TVFJJTkcpCisJCQkJeworCQkJCWludCBpLHByaW50YWJsZT0xOworCisJCQkJb3BwPW9wOworCQkJCW9zPWQyaV9BU04xX09DVEVUX1NUUklORyhOVUxMLCZvcHAsbGVuK2hsKTsKKwkJCQlpZiAob3MgIT0gTlVMTCAmJiBvcy0+bGVuZ3RoID4gMCkKKwkJCQkJeworCQkJCQlvcHAgPSBvcy0+ZGF0YTsKKwkJCQkJLyogdGVzdGluZyB3aGV0aGVyIHRoZSBvY3RldCBzdHJpbmcgaXMKKwkJCQkJICogcHJpbnRhYmxlICovCisJCQkJCWZvciAoaT0wOyBpPG9zLT5sZW5ndGg7IGkrKykKKwkJCQkJCXsKKwkJCQkJCWlmICgoCShvcHBbaV0gPCAnICcpICYmCisJCQkJCQkJKG9wcFtpXSAhPSAnXG4nKSAmJgorCQkJCQkJCShvcHBbaV0gIT0gJ1xyJykgJiYKKwkJCQkJCQkob3BwW2ldICE9ICdcdCcpKSB8fAorCQkJCQkJCShvcHBbaV0gPiAnficpKQorCQkJCQkJCXsKKwkJCQkJCQlwcmludGFibGU9MDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCWlmIChwcmludGFibGUpCisJCQkJCS8qIHByaW50YWJsZSBzdHJpbmcgKi8KKwkJCQkJCXsKKwkJCQkJCWlmIChCSU9fd3JpdGUoYnAsIjoiLDEpIDw9IDApCisJCQkJCQkJZ290byBlbmQ7CisJCQkJCQlpZiAoQklPX3dyaXRlKGJwLChjb25zdCBjaGFyICopb3BwLAorCQkJCQkJCW9zLT5sZW5ndGgpIDw9IDApCisJCQkJCQkJZ290byBlbmQ7CisJCQkJCQl9CisJCQkJCWVsc2UgaWYgKCFkdW1wKQorCQkJCQkvKiBub3QgcHJpbnRhYmxlID0+IHByaW50IG9jdGV0IHN0cmluZworCQkJCQkgKiBhcyBoZXggZHVtcCAqLworCQkJCQkJeworCQkJCQkJaWYgKEJJT193cml0ZShicCwiW0hFWCBEVU1QXToiLDExKSA8PSAwKQorCQkJCQkJCWdvdG8gZW5kOworCQkJCQkJZm9yIChpPTA7IGk8b3MtPmxlbmd0aDsgaSsrKQorCQkJCQkJCXsKKwkJCQkJCQlpZiAoQklPX3ByaW50ZihicCwiJTAyWCIKKwkJCQkJCQkJLCBvcHBbaV0pIDw9IDApCisJCQkJCQkJCWdvdG8gZW5kOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkvKiBwcmludCB0aGUgbm9ybWFsIGR1bXAgKi8KKwkJCQkJCXsKKwkJCQkJCWlmICghbmwpIAorCQkJCQkJCXsKKwkJCQkJCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkKKwkJCQkJCQkJZ290byBlbmQ7CisJCQkJCQkJfQorCQkJCQkJaWYgKEJJT19kdW1wX2luZGVudChicCwKKwkJCQkJCQkoY29uc3QgY2hhciAqKW9wcCwKKwkJCQkJCQkoKGR1bXAgPT0gLTEgfHwgZHVtcCA+IAorCQkJCQkJCW9zLT5sZW5ndGgpP29zLT5sZW5ndGg6ZHVtcCksCisJCQkJCQkJZHVtcF9pbmRlbnQpIDw9IDApCisJCQkJCQkJZ290byBlbmQ7CisJCQkJCQlubD0xOworCQkJCQkJfQorCQkJCQl9CisJCQkJaWYgKG9zICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJTV9BU04xX09DVEVUX1NUUklOR19mcmVlKG9zKTsKKwkJCQkJb3M9TlVMTDsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UgaWYgKHRhZyA9PSBWX0FTTjFfSU5URUdFUikKKwkJCQl7CisJCQkJQVNOMV9JTlRFR0VSICpiczsKKwkJCQlpbnQgaTsKKworCQkJCW9wcD1vcDsKKwkJCQlicz1kMmlfQVNOMV9JTlRFR0VSKE5VTEwsJm9wcCxsZW4raGwpOworCQkJCWlmIChicyAhPSBOVUxMKQorCQkJCQl7CisJCQkJCWlmIChCSU9fd3JpdGUoYnAsIjoiLDEpIDw9IDApIGdvdG8gZW5kOworCQkJCQlpZiAoYnMtPnR5cGUgPT0gVl9BU04xX05FR19JTlRFR0VSKQorCQkJCQkJaWYgKEJJT193cml0ZShicCwiLSIsMSkgPD0gMCkKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJZm9yIChpPTA7IGk8YnMtPmxlbmd0aDsgaSsrKQorCQkJCQkJeworCQkJCQkJaWYgKEJJT19wcmludGYoYnAsIiUwMlgiLAorCQkJCQkJCWJzLT5kYXRhW2ldKSA8PSAwKQorCQkJCQkJCWdvdG8gZW5kOworCQkJCQkJfQorCQkJCQlpZiAoYnMtPmxlbmd0aCA9PSAwKQorCQkJCQkJeworCQkJCQkJaWYgKEJJT193cml0ZShicCwiMDAiLDIpIDw9IDApCisJCQkJCQkJZ290byBlbmQ7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKEJJT193cml0ZShicCwiQkFEIElOVEVHRVIiLDExKSA8PSAwKQorCQkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlNX0FTTjFfSU5URUdFUl9mcmVlKGJzKTsKKwkJCQl9CisJCQllbHNlIGlmICh0YWcgPT0gVl9BU04xX0VOVU1FUkFURUQpCisJCQkJeworCQkJCUFTTjFfRU5VTUVSQVRFRCAqYnM7CisJCQkJaW50IGk7CisKKwkJCQlvcHA9b3A7CisJCQkJYnM9ZDJpX0FTTjFfRU5VTUVSQVRFRChOVUxMLCZvcHAsbGVuK2hsKTsKKwkJCQlpZiAoYnMgIT0gTlVMTCkKKwkJCQkJeworCQkJCQlpZiAoQklPX3dyaXRlKGJwLCI6IiwxKSA8PSAwKSBnb3RvIGVuZDsKKwkJCQkJaWYgKGJzLT50eXBlID09IFZfQVNOMV9ORUdfRU5VTUVSQVRFRCkKKwkJCQkJCWlmIChCSU9fd3JpdGUoYnAsIi0iLDEpIDw9IDApCisJCQkJCQkJZ290byBlbmQ7CisJCQkJCWZvciAoaT0wOyBpPGJzLT5sZW5ndGg7IGkrKykKKwkJCQkJCXsKKwkJCQkJCWlmIChCSU9fcHJpbnRmKGJwLCIlMDJYIiwKKwkJCQkJCQlicy0+ZGF0YVtpXSkgPD0gMCkKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCX0KKwkJCQkJaWYgKGJzLT5sZW5ndGggPT0gMCkKKwkJCQkJCXsKKwkJCQkJCWlmIChCSU9fd3JpdGUoYnAsIjAwIiwyKSA8PSAwKQorCQkJCQkJCWdvdG8gZW5kOworCQkJCQkJfQorCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmIChCSU9fd3JpdGUoYnAsIkJBRCBFTlVNRVJBVEVEIiwxMSkgPD0gMCkKKwkJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJTV9BU04xX0VOVU1FUkFURURfZnJlZShicyk7CisJCQkJfQorCQkJZWxzZSBpZiAobGVuID4gMCAmJiBkdW1wKQorCQkJCXsKKwkJCQlpZiAoIW5sKSAKKwkJCQkJeworCQkJCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkKKwkJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJaWYgKEJJT19kdW1wX2luZGVudChicCwoY29uc3QgY2hhciAqKXAsCisJCQkJCSgoZHVtcCA9PSAtMSB8fCBkdW1wID4gbGVuKT9sZW46ZHVtcCksCisJCQkJCWR1bXBfaW5kZW50KSA8PSAwKQorCQkJCQlnb3RvIGVuZDsKKwkJCQlubD0xOworCQkJCX0KKworCQkJaWYgKCFubCkgCisJCQkJeworCQkJCWlmIChCSU9fd3JpdGUoYnAsIlxuIiwxKSA8PSAwKSBnb3RvIGVuZDsKKwkJCQl9CisJCQlwKz1sZW47CisJCQlpZiAoKHRhZyA9PSBWX0FTTjFfRU9DKSAmJiAoeGNsYXNzID09IDApKQorCQkJCXsKKwkJCQlyZXQ9MjsgLyogRW5kIG9mIHNlcXVlbmNlICovCisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJfQorCQlsZW5ndGgtPWxlbjsKKwkJfQorCXJldD0xOworZW5kOgorCWlmIChvICE9IE5VTEwpIEFTTjFfT0JKRUNUX2ZyZWUobyk7CisJaWYgKG9zICE9IE5VTEwpIE1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvcyk7CisJKnBwPXA7CisJcmV0dXJuKHJldCk7CisJfQorCitjb25zdCBjaGFyICpBU04xX3RhZzJzdHIoaW50IHRhZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRhZzJzdHJbXSA9IHsKKwkgIkVPQyIsICJCT09MRUFOIiwgIklOVEVHRVIiLCAiQklUIFNUUklORyIsICJPQ1RFVCBTVFJJTkciLCAvKiAwLTQgKi8KKwkgIk5VTEwiLCAiT0JKRUNUIiwgIk9CSkVDVCBERVNDUklQVE9SIiwgIkVYVEVSTkFMIiwgIlJFQUwiLCAvKiA1LTkgKi8KKwkgIkVOVU1FUkFURUQiLCAiPEFTTjEgMTE+IiwgIlVURjhTVFJJTkciLCAiPEFTTjEgMTM+IiwgCSAgICAvKiAxMC0xMyAqLworCSI8QVNOMSAxND4iLCAiPEFTTjEgMTU+IiwgIlNFUVVFTkNFIiwgIlNFVCIsIAkJICAgIC8qIDE1LTE3ICovCisJIk5VTUVSSUNTVFJJTkciLCAiUFJJTlRBQkxFU1RSSU5HIiwgIlQ2MVNUUklORyIsCSAgICAvKiAxOC0yMCAqLworCSJWSURFT1RFWFNUUklORyIsICJJQTVTVFJJTkciLCAiVVRDVElNRSIsIkdFTkVSQUxJWkVEVElNRSIsIC8qIDIxLTI0ICovCisJIkdSQVBISUNTVFJJTkciLCAiVklTSUJMRVNUUklORyIsICJHRU5FUkFMU1RSSU5HIiwJICAgIC8qIDI1LTI3ICovCisJIlVOSVZFUlNBTFNUUklORyIsICI8QVNOMSAyOT4iLCAiQk1QU1RSSU5HIgkJICAgIC8qIDI4LTMwICovCisJfTsKKworCWlmKCh0YWcgPT0gVl9BU04xX05FR19JTlRFR0VSKSB8fCAodGFnID09IFZfQVNOMV9ORUdfRU5VTUVSQVRFRCkpCisJCQkJCQkJdGFnICY9IH4weDEwMDsKKworCWlmKHRhZyA8IDAgfHwgdGFnID4gMzApIHJldHVybiAiKHVua25vd24pIjsKKwlyZXR1cm4gdGFnMnN0clt0YWddOworfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hc24xdC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjMwZTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuMXQuaApAQCAtMCwwICsxLDk2MCBAQAorLyogYXNuMXQuaCAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2lmbmRlZiBIRUFERVJfQVNOMVRfSAorI2RlZmluZSBIRUFERVJfQVNOMVRfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaWZkZWYgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTworIyB1bmRlZiBPUEVOU1NMX0VYVEVSTgorIyBkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9FWFBPUlQKKyNlbmRpZgorCisvKiBBU04xIHRlbXBsYXRlIGRlZmluZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNpZm5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKy8qIE1hY3JvIHRvIG9idGFpbiBBU04xX0FEQiBwb2ludGVyIGZyb20gYSB0eXBlIChvbmx5IHVzZWQgaW50ZXJuYWxseSkgKi8KKyNkZWZpbmUgQVNOMV9BREJfcHRyKGlwdHIpICgoY29uc3QgQVNOMV9BREIgKikoaXB0cikpCisKKworLyogTWFjcm9zIGZvciBzdGFydCBhbmQgZW5kIG9mIEFTTjFfSVRFTSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX3N0YXJ0KGl0bmFtZSkgXAorCU9QRU5TU0xfR0xPQkFMIGNvbnN0IEFTTjFfSVRFTSBpdG5hbWUjI19pdCA9IHsKKworI2RlZmluZSBBU04xX0lURU1fZW5kKGl0bmFtZSkgXAorCQl9OworCisjZWxzZQorCisvKiBNYWNybyB0byBvYnRhaW4gQVNOMV9BREIgcG9pbnRlciBmcm9tIGEgdHlwZSAob25seSB1c2VkIGludGVybmFsbHkpICovCisjZGVmaW5lIEFTTjFfQURCX3B0cihpcHRyKSAoKGNvbnN0IEFTTjFfQURCICopKGlwdHIoKSkpCisKKworLyogTWFjcm9zIGZvciBzdGFydCBhbmQgZW5kIG9mIEFTTjFfSVRFTSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX3N0YXJ0KGl0bmFtZSkgXAorCWNvbnN0IEFTTjFfSVRFTSAqIGl0bmFtZSMjX2l0KHZvaWQpIFwKKwl7IFwKKwkJc3RhdGljIGNvbnN0IEFTTjFfSVRFTSBsb2NhbF9pdCA9IHsgCisKKyNkZWZpbmUgQVNOMV9JVEVNX2VuZChpdG5hbWUpIFwKKwkJfTsgXAorCXJldHVybiAmbG9jYWxfaXQ7IFwKKwl9CisKKyNlbmRpZgorCisKKy8qIE1hY3JvcyB0byBhaWQgQVNOMSB0ZW1wbGF0ZSB3cml0aW5nICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX1RFTVBMQVRFKHRuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfVEVNUExBVEUgdG5hbWUjI19pdGVtX3R0IAorCisjZGVmaW5lIEFTTjFfSVRFTV9URU1QTEFURV9FTkQodG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1BSSU1JVElWRSxcCisJCS0xLFwKKwkJJnRuYW1lIyNfaXRlbV90dCxcCisJCTAsXAorCQlOVUxMLFwKKwkJMCxcCisJCSN0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworCisvKiBUaGlzIGlzIGEgQVNOMSB0eXBlIHdoaWNoIGp1c3QgZW1iZWRzIGEgdGVtcGxhdGUgKi8KKyAKKy8qIFRoaXMgcGFpciBoZWxwcyBkZWNsYXJlIGEgU0VRVUVOQ0UuIFdlIGNhbiBkbzoKKyAqCisgKiAJQVNOMV9TRVFVRU5DRShzdG5hbWUpID0geworICogCQkuLi4gU0VRVUVOQ0UgY29tcG9uZW50cyAuLi4KKyAqIAl9IEFTTjFfU0VRVUVOQ0VfRU5EKHN0bmFtZSkKKyAqCisgKiAJVGhpcyB3aWxsIHByb2R1Y2UgYW4gQVNOMV9JVEVNIGNhbGxlZCBzdG5hbWVfaXQKKyAqCWZvciBhIHN0cnVjdHVyZSBjYWxsZWQgc3RuYW1lLgorICoKKyAqIAlJZiB5b3Ugd2FudCB0aGUgc2FtZSBzdHJ1Y3R1cmUgYnV0IGEgZGlmZmVyZW50CisgKgluYW1lIHRoZW4gdXNlOgorICoKKyAqIAlBU04xX1NFUVVFTkNFKGl0bmFtZSkgPSB7CisgKiAJCS4uLiBTRVFVRU5DRSBjb21wb25lbnRzIC4uLgorICogCX0gQVNOMV9TRVFVRU5DRV9FTkRfbmFtZShzdG5hbWUsIGl0bmFtZSkKKyAqCisgKglUaGlzIHdpbGwgY3JlYXRlIGFuIGl0ZW0gY2FsbGVkIGl0bmFtZV9pdCB1c2luZworICoJYSBzdHJ1Y3R1cmUgY2FsbGVkIHN0bmFtZS4KKyAqLworCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0UodG5hbWUpIFwKKwlzdGF0aWMgY29uc3QgQVNOMV9URU1QTEFURSB0bmFtZSMjX3NlcV90dFtdIAorCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfRU5EKHN0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfbmFtZShzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX0VORF9uYW1lKHN0bmFtZSwgdG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1NFUVVFTkNFLFwKKwkJVl9BU04xX1NFUVVFTkNFLFwKKwkJdG5hbWUjI19zZXFfdHQsXAorCQlzaXplb2YodG5hbWUjI19zZXFfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJTlVMTCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworI2RlZmluZSBBU04xX05ERUZfU0VRVUVOQ0UodG5hbWUpIFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfTkRFRl9TRVFVRU5DRV9jYih0bmFtZSwgY2IpIFwKKwlBU04xX1NFUVVFTkNFX2NiKHRuYW1lLCBjYikKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX2NiKHRuYW1lLCBjYikgXAorCXN0YXRpYyBjb25zdCBBU04xX0FVWCB0bmFtZSMjX2F1eCA9IHtOVUxMLCAwLCAwLCAwLCBjYiwgMH07IFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfQlJPS0VOX1NFUVVFTkNFKHRuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQVVYIHRuYW1lIyNfYXV4ID0ge05VTEwsIEFTTjFfQUZMR19CUk9LRU4sIDAsIDAsIDAsIDB9OyBcCisJQVNOMV9TRVFVRU5DRSh0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX3JlZih0bmFtZSwgY2IsIGxjaykgXAorCXN0YXRpYyBjb25zdCBBU04xX0FVWCB0bmFtZSMjX2F1eCA9IHtOVUxMLCBBU04xX0FGTEdfUkVGQ09VTlQsIG9mZnNldG9mKHRuYW1lLCByZWZlcmVuY2VzKSwgbGNrLCBjYiwgMH07IFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfZW5jKHRuYW1lLCBlbmMsIGNiKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQVVYIHRuYW1lIyNfYXV4ID0ge05VTEwsIEFTTjFfQUZMR19FTkNPRElORywgMCwgMCwgY2IsIG9mZnNldG9mKHRuYW1lLCBlbmMpfTsgXAorCUFTTjFfU0VRVUVOQ0UodG5hbWUpCisKKyNkZWZpbmUgQVNOMV9OREVGX1NFUVVFTkNFX0VORCh0bmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfTkRFRl9TRVFVRU5DRSxcCisJCVZfQVNOMV9TRVFVRU5DRSxcCisJCXRuYW1lIyNfc2VxX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfc2VxX3R0KSAvIHNpemVvZihBU04xX1RFTVBMQVRFKSxcCisJCU5VTEwsXAorCQlzaXplb2YodG5hbWUpLFwKKwkJI3RuYW1lIFwKKwlBU04xX0lURU1fZW5kKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfQlJPS0VOX1NFUVVFTkNFX0VORChzdG5hbWUpIEFTTjFfU0VRVUVOQ0VfRU5EX3JlZihzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX0VORF9lbmMoc3RuYW1lLCB0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1NFUVVFTkNFLFwKKwkJVl9BU04xX1NFUVVFTkNFLFwKKwkJdG5hbWUjI19zZXFfdHQsXAorCQlzaXplb2YodG5hbWUjI19zZXFfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJJnRuYW1lIyNfYXV4LFwKKwkJc2l6ZW9mKHN0bmFtZSksXAorCQkjc3RuYW1lIFwKKwlBU04xX0lURU1fZW5kKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfTkRFRl9TRVFVRU5DRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfTkRFRl9TRVFVRU5DRSxcCisJCVZfQVNOMV9TRVFVRU5DRSxcCisJCXRuYW1lIyNfc2VxX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfc2VxX3R0KSAvIHNpemVvZihBU04xX1RFTVBMQVRFKSxcCisJCSZ0bmFtZSMjX2F1eCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworCisvKiBUaGlzIHBhaXIgaGVscHMgZGVjbGFyZSBhIENIT0lDRSB0eXBlLiBXZSBjYW4gZG86CisgKgorICogCUFTTjFfQ0hPSUNFKGNobmFtZSkgPSB7CisgKiAJCS4uLiBDSE9JQ0Ugb3B0aW9ucyAuLi4KKyAqIAlBU04xX0NIT0lDRV9FTkQoY2huYW1lKQorICoKKyAqIAlUaGlzIHdpbGwgcHJvZHVjZSBhbiBBU04xX0lURU0gY2FsbGVkIGNobmFtZV9pdAorICoJZm9yIGEgc3RydWN0dXJlIGNhbGxlZCBjaG5hbWUuIFRoZSBzdHJ1Y3R1cmUKKyAqCWRlZmluaXRpb24gbXVzdCBsb29rIGxpa2UgdGhpczoKKyAqCXR5cGVkZWYgc3RydWN0IHsKKyAqCQlpbnQgdHlwZTsKKyAqCQl1bmlvbiB7CisgKgkJCUFTTjFfU09NRVRISU5HICpvcHQxOworICoJCQlBU04xX1NPTUVPVEhFUiAqb3B0MjsKKyAqCQl9IHZhbHVlOworICoJfSBjaG5hbWU7CisgKgkKKyAqCXRoZSBuYW1lIG9mIHRoZSBzZWxlY3RvciBtdXN0IGJlICd0eXBlJy4KKyAqIAl0byB1c2UgYW4gYWx0ZXJuYXRpdmUgc2VsZWN0b3IgbmFtZSB1c2UgdGhlCisgKiAgICAgIEFTTjFfQ0hPSUNFX0VORF9zZWxlY3RvcigpIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBBU04xX0NIT0lDRSh0bmFtZSkgXAorCXN0YXRpYyBjb25zdCBBU04xX1RFTVBMQVRFIHRuYW1lIyNfY2hfdHRbXSAKKworI2RlZmluZSBBU04xX0NIT0lDRV9jYih0bmFtZSwgY2IpIFwKKwlzdGF0aWMgY29uc3QgQVNOMV9BVVggdG5hbWUjI19hdXggPSB7TlVMTCwgMCwgMCwgMCwgY2IsIDB9OyBcCisJQVNOMV9DSE9JQ0UodG5hbWUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EKHN0bmFtZSkgQVNOMV9DSE9JQ0VfRU5EX25hbWUoc3RuYW1lLCBzdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EX25hbWUoc3RuYW1lLCB0bmFtZSkgQVNOMV9DSE9JQ0VfRU5EX3NlbGVjdG9yKHN0bmFtZSwgdG5hbWUsIHR5cGUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EX3NlbGVjdG9yKHN0bmFtZSwgdG5hbWUsIHNlbG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX0NIT0lDRSxcCisJCW9mZnNldG9mKHN0bmFtZSxzZWxuYW1lKSAsXAorCQl0bmFtZSMjX2NoX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfY2hfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJTlVMTCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworI2RlZmluZSBBU04xX0NIT0lDRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSwgc2VsbmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfQ0hPSUNFLFwKKwkJb2Zmc2V0b2Yoc3RuYW1lLHNlbG5hbWUpICxcCisJCXRuYW1lIyNfY2hfdHQsXAorCQlzaXplb2YodG5hbWUjI19jaF90dCkgLyBzaXplb2YoQVNOMV9URU1QTEFURSksXAorCQkmdG5hbWUjI19hdXgsXAorCQlzaXplb2Yoc3RuYW1lKSxcCisJCSNzdG5hbWUgXAorCUFTTjFfSVRFTV9lbmQodG5hbWUpCisKKy8qIFRoaXMgaGVscHMgd2l0aCB0aGUgdGVtcGxhdGUgd3JhcHBlciBmb3JtIG9mIEFTTjFfSVRFTSAqLworCisjZGVmaW5lIEFTTjFfRVhfVEVNUExBVEVfVFlQRShmbGFncywgdGFnLCBuYW1lLCB0eXBlKSB7IFwKKwkoZmxhZ3MpLCAodGFnKSwgMCxcCisJI25hbWUsIEFTTjFfSVRFTV9yZWYodHlwZSkgfQorCisvKiBUaGVzZSBoZWxwIHdpdGggU0VRVUVOQ0Ugb3IgQ0hPSUNFIGNvbXBvbmVudHMgKi8KKworLyogdXNlZCB0byBkZWNsYXJlIG90aGVyIHR5cGVzICovCisKKyNkZWZpbmUgQVNOMV9FWF9UWVBFKGZsYWdzLCB0YWcsIHN0bmFtZSwgZmllbGQsIHR5cGUpIHsgXAorCShmbGFncyksICh0YWcpLCBvZmZzZXRvZihzdG5hbWUsIGZpZWxkKSxcCisJI2ZpZWxkLCBBU04xX0lURU1fcmVmKHR5cGUpIH0KKworLyogdXNlZCB3aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgY29tYmluZWQgd2l0aCB0aGUgcGFyZW50ICovCisKKyNkZWZpbmUgQVNOMV9FWF9DT01CSU5FKGZsYWdzLCB0YWcsIHR5cGUpIHsgXAorCShmbGFncyl8QVNOMV9URkxHX0NPTUJJTkUsICh0YWcpLCAwLCBOVUxMLCBBU04xX0lURU1fcmVmKHR5cGUpIH0KKworLyogaW1wbGljaXQgYW5kIGV4cGxpY2l0IGhlbHBlciBtYWNyb3MgKi8KKworI2RlZmluZSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIGV4KSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfSU1QTElDSVQgfCBleCwgdGFnLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisjZGVmaW5lIEFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgZXgpIFwKKwkJQVNOMV9FWF9UWVBFKEFTTjFfVEZMR19FWFBMSUNJVCB8IGV4LCB0YWcsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIEFueSBkZWZpbmVkIGJ5IG1hY3JvczogdGhlIGZpZWxkIHVzZWQgaXMgaW4gdGhlIHRhYmxlIGl0c2VsZiAqLworCisjaWZuZGVmIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTgorI2RlZmluZSBBU04xX0FEQl9PQkpFQ1QodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX09JRCwgLTEsIDAsICN0YmxuYW1lLCAoY29uc3QgQVNOMV9JVEVNICopJih0YmxuYW1lIyNfYWRiKSB9CisjZGVmaW5lIEFTTjFfQURCX0lOVEVHRVIodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX0lOVCwgLTEsIDAsICN0YmxuYW1lLCAoY29uc3QgQVNOMV9JVEVNICopJih0YmxuYW1lIyNfYWRiKSB9CisjZWxzZQorI2RlZmluZSBBU04xX0FEQl9PQkpFQ1QodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX09JRCwgLTEsIDAsICN0YmxuYW1lLCB0YmxuYW1lIyNfYWRiIH0KKyNkZWZpbmUgQVNOMV9BREJfSU5URUdFUih0YmxuYW1lKSB7IEFTTjFfVEZMR19BREJfSU5ULCAtMSwgMCwgI3RibG5hbWUsIHRibG5hbWUjI19hZGIgfQorI2VuZGlmCisvKiBQbGFpbiBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX1NJTVBMRShzdG5hbWUsIGZpZWxkLCB0eXBlKSBBU04xX0VYX1RZUEUoMCwwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisvKiBPUFRJT05BTCBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlKSBBU04xX0VYX1RZUEUoQVNOMV9URkxHX09QVElPTkFMLCAwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisvKiBJTVBMSUNJVCB0YWdnZWQgc2ltcGxlIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9JTVAoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnKSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIDApCisKKy8qIElNUExJQ0lUIHRhZ2dlZCBPUFRJT05BTCBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX0lNUF9PUFQoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnKSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIEFTTjFfVEZMR19PUFRJT05BTCkKKworLyogU2FtZSBhcyBhYm92ZSBidXQgRVhQTElDSVQgKi8KKworI2RlZmluZSBBU04xX0VYUChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIEFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgMCkKKyNkZWZpbmUgQVNOMV9FWFBfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfT1BUSU9OQUwpCisKKy8qIFNFUVVFTkNFIE9GIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIE9QVElPTkFMIFNFUVVFTkNFIE9GICovCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUpIFwKKwkJQVNOMV9FWF9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRnxBU04xX1RGTEdfT1BUSU9OQUwsIDAsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciBTRVQgT0YgKi8KKworI2RlZmluZSBBU04xX1NFVF9PRihzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VUX09GLCAwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisjZGVmaW5lIEFTTjFfU0VUX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCwgMCwgc3RuYW1lLCBmaWVsZCwgdHlwZSkKKworLyogRmluYWxseSBjb21wb3VuZCB0eXBlcyBvZiBTRVFVRU5DRSwgU0VULCBJTVBMSUNJVCwgRVhQTElDSVQgYW5kIE9QVElPTkFMICovCisKKyNkZWZpbmUgQVNOMV9JTVBfU0VUX09GKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9JTVBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GKQorCisjZGVmaW5lIEFTTjFfRVhQX1NFVF9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFVF9PRikKKworI2RlZmluZSBBU04xX0lNUF9TRVRfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9JTVBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0VYUF9TRVRfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0lNUF9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfSU1QX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GKQorCisjZGVmaW5lIEFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfSU1QX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0VYUF9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GKQorCisjZGVmaW5lIEFTTjFfRVhQX1NFUVVFTkNFX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworLyogRVhQTElDSVQgdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZm9ybSAqLworI2RlZmluZSBBU04xX05ERUZfRVhQKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfTkRFRikKKworLyogRVhQTElDSVQgT1BUSU9OQUwgdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZm9ybSAqLworI2RlZmluZSBBU04xX05ERUZfRVhQX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX09QVElPTkFMfEFTTjFfVEZMR19OREVGKQorCisvKiBNYWNyb3MgZm9yIHRoZSBBU04xX0FEQiBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBBU04xX0FEQihuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQURCX1RBQkxFIG5hbWUjI19hZGJ0YmxbXSAKKworI2lmbmRlZiBPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04KKworI2RlZmluZSBBU04xX0FEQl9FTkQobmFtZSwgZmxhZ3MsIGZpZWxkLCBhcHBfdGFibGUsIGRlZiwgbm9uZSkgXAorCTtcCisJc3RhdGljIGNvbnN0IEFTTjFfQURCIG5hbWUjI19hZGIgPSB7XAorCQlmbGFncyxcCisJCW9mZnNldG9mKG5hbWUsIGZpZWxkKSxcCisJCWFwcF90YWJsZSxcCisJCW5hbWUjI19hZGJ0YmwsXAorCQlzaXplb2YobmFtZSMjX2FkYnRibCkgLyBzaXplb2YoQVNOMV9BREJfVEFCTEUpLFwKKwkJZGVmLFwKKwkJbm9uZVwKKwl9CisKKyNlbHNlCisKKyNkZWZpbmUgQVNOMV9BREJfRU5EKG5hbWUsIGZsYWdzLCBmaWVsZCwgYXBwX3RhYmxlLCBkZWYsIG5vbmUpIFwKKwk7XAorCXN0YXRpYyBjb25zdCBBU04xX0lURU0gKm5hbWUjI19hZGIodm9pZCkgXAorCXsgXAorCXN0YXRpYyBjb25zdCBBU04xX0FEQiBpbnRlcm5hbF9hZGIgPSBcCisJCXtcCisJCWZsYWdzLFwKKwkJb2Zmc2V0b2YobmFtZSwgZmllbGQpLFwKKwkJYXBwX3RhYmxlLFwKKwkJbmFtZSMjX2FkYnRibCxcCisJCXNpemVvZihuYW1lIyNfYWRidGJsKSAvIHNpemVvZihBU04xX0FEQl9UQUJMRSksXAorCQlkZWYsXAorCQlub25lXAorCQl9OyBcCisJCXJldHVybiAoY29uc3QgQVNOMV9JVEVNICopICZpbnRlcm5hbF9hZGI7IFwKKwl9IFwKKwl2b2lkIGR1bW15X2Z1bmN0aW9uKHZvaWQpCisKKyNlbmRpZgorCisjZGVmaW5lIEFEQl9FTlRSWSh2YWwsIHRlbXBsYXRlKSB7dmFsLCB0ZW1wbGF0ZX0KKworI2RlZmluZSBBU04xX0FEQl9URU1QTEFURShuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfVEVNUExBVEUgbmFtZSMjX3R0IAorCisvKiBUaGlzIGlzIHRoZSBBU04xIHRlbXBsYXRlIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMKKyAqIGEgd3JhcHBlciByb3VuZCB0aGUgYWN0dWFsIHR5cGUuIEl0IGRldGVybWluZXMgdGhlCisgKiBhY3R1YWwgcG9zaXRpb24gb2YgdGhlIGZpZWxkIGluIHRoZSB2YWx1ZSBzdHJ1Y3R1cmUsCisgKiB2YXJpb3VzIGZsYWdzIHN1Y2ggYXMgT1BUSU9OQUwgYW5kIHRoZSBmaWVsZCBuYW1lLgorICovCisKK3N0cnVjdCBBU04xX1RFTVBMQVRFX3N0IHsKK3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBWYXJpb3VzIGZsYWdzICovCitsb25nIHRhZzsJCQkvKiB0YWcsIG5vdCB1c2VkIGlmIG5vIHRhZ2dpbmcgKi8KK3Vuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyogT2Zmc2V0IG9mIHRoaXMgZmllbGQgaW4gc3RydWN0dXJlICovCisjaWZuZGVmIE5PX0FTTjFfRklFTERfTkFNRVMKK2NvbnN0IGNoYXIgKmZpZWxkX25hbWU7CQkvKiBGaWVsZCBuYW1lICovCisjZW5kaWYKK0FTTjFfSVRFTV9FWFAgKml0ZW07CQkvKiBSZWxldmFudCBBU04xX0lURU0gb3IgQVNOMV9BREIgKi8KK307CisKKy8qIE1hY3JvIHRvIGV4dHJhY3QgQVNOMV9JVEVNIGFuZCBBU04xX0FEQiBwb2ludGVyIGZyb20gQVNOMV9URU1QTEFURSAqLworCisjZGVmaW5lIEFTTjFfVEVNUExBVEVfaXRlbSh0KSAodC0+aXRlbV9wdHIpCisjZGVmaW5lIEFTTjFfVEVNUExBVEVfYWRiKHQpICh0LT5pdGVtX3B0cikKKwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9BREJfVEFCTEVfc3QgQVNOMV9BREJfVEFCTEU7Cit0eXBlZGVmIHN0cnVjdCBBU04xX0FEQl9zdCBBU04xX0FEQjsKKworc3RydWN0IEFTTjFfQURCX3N0IHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBWYXJpb3VzIGZsYWdzICovCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBvZiBzZWxlY3RvciBmaWVsZCAqLworCVNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqKmFwcF9pdGVtczsgLyogQXBwbGljYXRpb24gZGVmaW5lZCBpdGVtcyAqLworCWNvbnN0IEFTTjFfQURCX1RBQkxFICp0Ymw7CS8qIFRhYmxlIG9mIHBvc3NpYmxlIHR5cGVzICovCisJbG9uZyB0Ymxjb3VudDsJCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRibCAqLworCWNvbnN0IEFTTjFfVEVNUExBVEUgKmRlZmF1bHRfdHQ7ICAvKiBUeXBlIHRvIHVzZSBpZiBubyBtYXRjaCAqLworCWNvbnN0IEFTTjFfVEVNUExBVEUgKm51bGxfdHQ7ICAvKiBUeXBlIHRvIHVzZSBpZiBzZWxlY3RvciBpcyBOVUxMICovCit9OworCitzdHJ1Y3QgQVNOMV9BREJfVEFCTEVfc3QgeworCWxvbmcgdmFsdWU7CQkvKiBOSUQgZm9yIGFuIG9iamVjdCBvciB2YWx1ZSBmb3IgYW4gaW50ICovCisJY29uc3QgQVNOMV9URU1QTEFURSB0dDsJCS8qIGl0ZW0gZm9yIHRoaXMgdmFsdWUgKi8KK307CisKKy8qIHRlbXBsYXRlIGZsYWdzICovCisKKy8qIEZpZWxkIGlzIG9wdGlvbmFsICovCisjZGVmaW5lIEFTTjFfVEZMR19PUFRJT05BTAkoMHgxKQorCisvKiBGaWVsZCBpcyBhIFNFVCBPRiAqLworI2RlZmluZSBBU04xX1RGTEdfU0VUX09GCSgweDEgPDwgMSkKKworLyogRmllbGQgaXMgYSBTRVFVRU5DRSBPRiAqLworI2RlZmluZSBBU04xX1RGTEdfU0VRVUVOQ0VfT0YJKDB4MiA8PCAxKQorCisvKiBTcGVjaWFsIGNhc2U6IHRoaXMgcmVmZXJzIHRvIGEgU0VUIE9GIHRoYXQKKyAqIHdpbGwgYmUgc29ydGVkIGludG8gREVSIG9yZGVyIHdoZW4gZW5jb2RlZCAqYW5kKgorICogdGhlIGNvcnJlc3BvbmRpbmcgU1RBQ0sgd2lsbCBiZSBtb2RpZmllZCB0byBtYXRjaAorICogdGhlIG5ldyBvcmRlci4KKyAqLworI2RlZmluZSBBU04xX1RGTEdfU0VUX09SREVSCSgweDMgPDwgMSkKKworLyogTWFzayBmb3IgU0VUIE9GIG9yIFNFUVVFTkNFIE9GICovCisjZGVmaW5lIEFTTjFfVEZMR19TS19NQVNLCSgweDMgPDwgMSkKKworLyogVGhlc2UgZmxhZ3MgbWVhbiB0aGUgdGFnIHNob3VsZCBiZSB0YWtlbiBmcm9tIHRoZQorICogdGFnIGZpZWxkLiBJZiBFWFBMSUNJVCB0aGVuIHRoZSB1bmRlcmx5aW5nIHR5cGUKKyAqIGlzIHVzZWQgZm9yIHRoZSBpbm5lciB0YWcuCisgKi8KKworLyogSU1QTElDSVQgdGFnZ2luZyAqLworI2RlZmluZSBBU04xX1RGTEdfSU1QVEFHCSgweDEgPDwgMykKKworCisvKiBFWFBMSUNJVCB0YWdnaW5nLCBpbm5lciB0YWcgZnJvbSB1bmRlcmx5aW5nIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9URkxHX0VYUFRBRwkoMHgyIDw8IDMpCisKKyNkZWZpbmUgQVNOMV9URkxHX1RBR19NQVNLCSgweDMgPDwgMykKKworLyogY29udGV4dCBzcGVjaWZpYyBJTVBMSUNJVCAqLworI2RlZmluZSBBU04xX1RGTEdfSU1QTElDSVQJQVNOMV9URkxHX0lNUFRBR3xBU04xX1RGTEdfQ09OVEVYVAorCisvKiBjb250ZXh0IHNwZWNpZmljIEVYUExJQ0lUICovCisjZGVmaW5lIEFTTjFfVEZMR19FWFBMSUNJVAlBU04xX1RGTEdfRVhQVEFHfEFTTjFfVEZMR19DT05URVhUCisKKy8qIElmIHRhZ2dpbmcgaXMgaW4gZm9yY2UgdGhlc2UgZGV0ZXJtaW5lIHRoZQorICogdHlwZSBvZiB0YWcgdG8gdXNlLiBPdGhlcndpc2UgdGhlIHRhZyBpcworICogZGV0ZXJtaW5lZCBieSB0aGUgdW5kZXJseWluZyB0eXBlLiBUaGVzZSAKKyAqIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgb2N0ZXQgZm9ybWF0LgorICovCisKKy8qIFVuaXZlcnNhbCB0YWcgKi8gCisjZGVmaW5lIEFTTjFfVEZMR19VTklWRVJTQUwJKDB4MDw8NikKKy8qIEFwcGxpY2F0aW9uIHRhZyAqLyAKKyNkZWZpbmUgQVNOMV9URkxHX0FQUExJQ0FUSU9OCSgweDE8PDYpCisvKiBDb250ZXh0IHNwZWNpZmljIHRhZyAqLyAKKyNkZWZpbmUgQVNOMV9URkxHX0NPTlRFWFQJKDB4Mjw8NikKKy8qIFByaXZhdGUgdGFnICovIAorI2RlZmluZSBBU04xX1RGTEdfUFJJVkFURQkoMHgzPDw2KQorCisjZGVmaW5lIEFTTjFfVEZMR19UQUdfQ0xBU1MJKDB4Mzw8NikKKworLyogVGhlc2UgYXJlIGZvciBBTlkgREVGSU5FRCBCWSB0eXBlLiBJbiB0aGlzIGNhc2UKKyAqIHRoZSAnaXRlbScgZmllbGQgcG9pbnRzIHRvIGFuIEFTTjFfQURCIHN0cnVjdHVyZQorICogd2hpY2ggY29udGFpbnMgYSB0YWJsZSBvZiB2YWx1ZXMgdG8gZGVjb2RlIHRoZQorICogcmVsZXZhbnQgdHlwZQorICovCisKKyNkZWZpbmUgQVNOMV9URkxHX0FEQl9NQVNLCSgweDM8PDgpCisKKyNkZWZpbmUgQVNOMV9URkxHX0FEQl9PSUQJKDB4MTw8OCkKKworI2RlZmluZSBBU04xX1RGTEdfQURCX0lOVAkoMHgxPDw5KQorCisvKiBUaGlzIGZsYWcgbWVhbnMgYSBwYXJlbnQgc3RydWN0dXJlIGlzIHBhc3NlZAorICogaW5zdGVhZCBvZiB0aGUgZmllbGQ6IHRoaXMgaXMgdXNlZnVsIGlzIGEKKyAqIFNFUVVFTkNFIGlzIGJlaW5nIGNvbWJpbmVkIHdpdGggYSBDSE9JQ0UgZm9yCisgKiBleGFtcGxlLiBTaW5jZSB0aGlzIG1lYW5zIHRoZSBzdHJ1Y3R1cmUgYW5kCisgKiBpdGVtIG5hbWUgd2lsbCBkaWZmZXIgd2UgbmVlZCB0byB1c2UgdGhlCisgKiBBU04xX0NIT0lDRV9FTkRfbmFtZSgpIG1hY3JvIGZvciBleGFtcGxlLgorICovCisKKyNkZWZpbmUgQVNOMV9URkxHX0NPTUJJTkUJKDB4MTw8MTApCisKKy8qIFRoaXMgZmxhZyB3aGVuIHByZXNlbnQgaW4gYSBTRVFVRU5DRSBPRiwgU0VUIE9GCisgKiBvciBFWFBMSUNJVCBjYXVzZXMgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQKKyAqIGVuY29kaW5nIHRvIGJlIHVzZWQgaWYgcmVxdWlyZWQuCisgKi8KKworI2RlZmluZSBBU04xX1RGTEdfTkRFRgkJKDB4MTw8MTEpCisKKy8qIFRoaXMgaXMgdGhlIGFjdHVhbCBBU04xIGl0ZW0gaXRzZWxmICovCisKK3N0cnVjdCBBU04xX0lURU1fc3QgeworY2hhciBpdHlwZTsJCQkvKiBUaGUgaXRlbSB0eXBlLCBwcmltaXRpdmUsIFNFUVVFTkNFLCBDSE9JQ0Ugb3IgZXh0ZXJuICovCitsb25nIHV0eXBlOwkJCS8qIHVuZGVybHlpbmcgdHlwZSAqLworY29uc3QgQVNOMV9URU1QTEFURSAqdGVtcGxhdGVzOwkvKiBJZiBTRVFVRU5DRSBvciBDSE9JQ0UgdGhpcyBjb250YWlucyB0aGUgY29udGVudHMgKi8KK2xvbmcgdGNvdW50OwkJCS8qIE51bWJlciBvZiB0ZW1wbGF0ZXMgaWYgU0VRVUVOQ0Ugb3IgQ0hPSUNFICovCitjb25zdCB2b2lkICpmdW5jczsJCS8qIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGlzIHR5cGUgKi8KK2xvbmcgc2l6ZTsJCQkvKiBTdHJ1Y3R1cmUgc2l6ZSAodXN1YWxseSkqLworI2lmbmRlZiBOT19BU04xX0ZJRUxEX05BTUVTCitjb25zdCBjaGFyICpzbmFtZTsJCS8qIFN0cnVjdHVyZSBuYW1lICovCisjZW5kaWYKK307CisKKy8qIFRoZXNlIGFyZSB2YWx1ZXMgZm9yIHRoZSBpdHlwZSBmaWVsZCBhbmQKKyAqIGRldGVybWluZSBob3cgdGhlIHR5cGUgaXMgaW50ZXJwcmV0ZWQuCisgKgorICogRm9yIFBSSU1JVElWRSB0eXBlcyB0aGUgdW5kZXJseWluZyB0eXBlCisgKiBkZXRlcm1pbmVzIHRoZSBiZWhhdmlvdXIgaWYgaXRlbXMgaXMgTlVMTC4KKyAqCisgKiBPdGhlcndpc2UgdGVtcGxhdGVzIG11c3QgY29udGFpbiBhIHNpbmdsZSAKKyAqIHRlbXBsYXRlIGFuZCB0aGUgdHlwZSBpcyB0cmVhdGVkIGluIHRoZQorICogc2FtZSB3YXkgYXMgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSB0ZW1wbGF0ZS4KKyAqCisgKiBGb3IgU0VRVUVOQ0UgdHlwZXMgdGhlIHRlbXBsYXRlcyBmaWVsZCBwb2ludHMKKyAqIHRvIHRoZSBtZW1iZXJzLCB0aGUgc2l6ZSBmaWVsZCBpcyB0aGUKKyAqIHN0cnVjdHVyZSBzaXplLgorICoKKyAqIEZvciBDSE9JQ0UgdHlwZXMgdGhlIHRlbXBsYXRlcyBmaWVsZCBwb2ludHMKKyAqIHRvIGVhY2ggcG9zc2libGUgbWVtYmVyICh0eXBpY2FsbHkgYSB1bmlvbikKKyAqIGFuZCB0aGUgJ3NpemUnIGZpZWxkIGlzIHRoZSBvZmZzZXQgb2YgdGhlCisgKiBzZWxlY3Rvci4KKyAqCisgKiBUaGUgJ2Z1bmNzJyBmaWVsZCBpcyB1c2VkIGZvciBhcHBsaWNhdGlvbgorICogc3BlY2lmaWMgZnVuY3Rpb25zLiAKKyAqCisgKiBGb3IgQ09NUEFUIHR5cGVzIHRoZSBmdW5jcyBmaWVsZCBnaXZlcyBhCisgKiBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRoaXMgdHlwZSwgdGhpcworICogc3VwcG9ydHMgdGhlIG9sZCBkMmksIGkyZCBjb252ZW50aW9uLgorICoKKyAqIFRoZSBFWFRFUk4gdHlwZSB1c2VzIGEgbmV3IHN0eWxlIGQyaS9pMmQuCisgKiBUaGUgbmV3IHN0eWxlIHNob3VsZCBiZSB1c2VkIHdoZXJlIHBvc3NpYmxlCisgKiBiZWNhdXNlIGl0IGF2b2lkcyB0aGluZ3MgbGlrZSB0aGUgZDJpIElNUExJQ0lUCisgKiBoYWNrLgorICoKKyAqIE1TVFJJTkcgaXMgYSBtdWx0aXBsZSBzdHJpbmcgdHlwZSwgaXQgaXMgdXNlZAorICogZm9yIGEgQ0hPSUNFIG9mIGNoYXJhY3RlciBzdHJpbmdzIHdoZXJlIHRoZQorICogYWN0dWFsIHN0cmluZ3MgYWxsIG9jY3VweSBhbiBBU04xX1NUUklORworICogc3RydWN0dXJlLiBJbiB0aGlzIGNhc2UgdGhlICd1dHlwZScgZmllbGQKKyAqIGhhcyBhIHNwZWNpYWwgbWVhbmluZywgaXQgaXMgdXNlZCBhcyBhIG1hc2sKKyAqIG9mIGFjY2VwdGFibGUgdHlwZXMgdXNpbmcgdGhlIEJfQVNOMSBjb25zdGFudHMuCisgKgorICogTkRFRl9TRVFVRU5DRSBpcyB0aGUgc2FtZSBhcyBTRVFVRU5DRSBleGNlcHQKKyAqIHRoYXQgaXQgd2lsbCB1c2UgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQKKyAqIGVuY29kaW5nIGlmIHJlcXVlc3RlZC4KKyAqCisgKi8KKworI2RlZmluZSBBU04xX0lUWVBFX1BSSU1JVElWRQkJMHgwCisKKyNkZWZpbmUgQVNOMV9JVFlQRV9TRVFVRU5DRQkJMHgxCisKKyNkZWZpbmUgQVNOMV9JVFlQRV9DSE9JQ0UJCTB4MgorCisjZGVmaW5lIEFTTjFfSVRZUEVfQ09NUEFUCQkweDMKKworI2RlZmluZSBBU04xX0lUWVBFX0VYVEVSTgkJMHg0CisKKyNkZWZpbmUgQVNOMV9JVFlQRV9NU1RSSU5HCQkweDUKKworI2RlZmluZSBBU04xX0lUWVBFX05ERUZfU0VRVUVOQ0UJMHg2CisKKy8qIENhY2hlIGZvciBBU04xIHRhZyBhbmQgbGVuZ3RoLCBzbyB3ZQorICogZG9uJ3Qga2VlcCByZS1yZWFkaW5nIGl0IGZvciB0aGluZ3MKKyAqIGxpa2UgQ0hPSUNFCisgKi8KKworc3RydWN0IEFTTjFfVExDX3N0eworCWNoYXIgdmFsaWQ7CS8qIFZhbHVlcyBiZWxvdyBhcmUgdmFsaWQgKi8KKwlpbnQgcmV0OwkvKiByZXR1cm4gdmFsdWUgKi8KKwlsb25nIHBsZW47CS8qIGxlbmd0aCAqLworCWludCBwdGFnOwkvKiBjbGFzcyB2YWx1ZSAqLworCWludCBwY2xhc3M7CS8qIGNsYXNzIHZhbHVlICovCisJaW50IGhkcmxlbjsJLyogaGVhZGVyIGxlbmd0aCAqLworfTsKKworLyogVHlwZWRlZnMgZm9yIEFTTjEgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwordHlwZWRlZiBBU04xX1ZBTFVFICogQVNOMV9uZXdfZnVuYyh2b2lkKTsKK3R5cGVkZWYgdm9pZCBBU04xX2ZyZWVfZnVuYyhBU04xX1ZBTFVFICphKTsKK3R5cGVkZWYgQVNOMV9WQUxVRSAqIEFTTjFfZDJpX2Z1bmMoQVNOMV9WQUxVRSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiogaW4sIGxvbmcgbGVuZ3RoKTsKK3R5cGVkZWYgaW50IEFTTjFfaTJkX2Z1bmMoQVNOMV9WQUxVRSAqIGEsIHVuc2lnbmVkIGNoYXIgKippbik7CisKK3R5cGVkZWYgaW50IEFTTjFfZXhfZDJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzLCBjaGFyIG9wdCwgQVNOMV9UTEMgKmN0eCk7CisKK3R5cGVkZWYgaW50IEFTTjFfZXhfaTJkKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0LCBpbnQgdGFnLCBpbnQgYWNsYXNzKTsKK3R5cGVkZWYgaW50IEFTTjFfZXhfbmV3X2Z1bmMoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordHlwZWRlZiB2b2lkIEFTTjFfZXhfZnJlZV9mdW5jKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKKwordHlwZWRlZiBpbnQgQVNOMV9leF9wcmludF9mdW5jKEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwgCisJCQkJCQlpbnQgaW5kZW50LCBjb25zdCBjaGFyICpmbmFtZSwgCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpOworCit0eXBlZGVmIGludCBBU04xX3ByaW1pdGl2ZV9pMmMoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCAqcHV0eXBlLCBjb25zdCBBU04xX0lURU0gKml0KTsKK3R5cGVkZWYgaW50IEFTTjFfcHJpbWl0aXZlX2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordHlwZWRlZiBpbnQgQVNOMV9wcmltaXRpdmVfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LCBpbnQgaW5kZW50LCBjb25zdCBBU04xX1BDVFggKnBjdHgpOworCit0eXBlZGVmIHN0cnVjdCBBU04xX0NPTVBBVF9GVU5DU19zdCB7CisJQVNOMV9uZXdfZnVuYyAqYXNuMV9uZXc7CisJQVNOMV9mcmVlX2Z1bmMgKmFzbjFfZnJlZTsKKwlBU04xX2QyaV9mdW5jICphc24xX2QyaTsKKwlBU04xX2kyZF9mdW5jICphc24xX2kyZDsKK30gQVNOMV9DT01QQVRfRlVOQ1M7CisKK3R5cGVkZWYgc3RydWN0IEFTTjFfRVhURVJOX0ZVTkNTX3N0IHsKKwl2b2lkICphcHBfZGF0YTsKKwlBU04xX2V4X25ld19mdW5jICphc24xX2V4X25ldzsKKwlBU04xX2V4X2ZyZWVfZnVuYyAqYXNuMV9leF9mcmVlOworCUFTTjFfZXhfZnJlZV9mdW5jICphc24xX2V4X2NsZWFyOworCUFTTjFfZXhfZDJpICphc24xX2V4X2QyaTsKKwlBU04xX2V4X2kyZCAqYXNuMV9leF9pMmQ7CisJQVNOMV9leF9wcmludF9mdW5jICphc24xX2V4X3ByaW50OworfSBBU04xX0VYVEVSTl9GVU5DUzsKKwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9QUklNSVRJVkVfRlVOQ1Nfc3QgeworCXZvaWQgKmFwcF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJQVNOMV9leF9uZXdfZnVuYyAqcHJpbV9uZXc7CisJQVNOMV9leF9mcmVlX2Z1bmMgKnByaW1fZnJlZTsKKwlBU04xX2V4X2ZyZWVfZnVuYyAqcHJpbV9jbGVhcjsKKwlBU04xX3ByaW1pdGl2ZV9jMmkgKnByaW1fYzJpOworCUFTTjFfcHJpbWl0aXZlX2kyYyAqcHJpbV9pMmM7CisJQVNOMV9wcmltaXRpdmVfcHJpbnQgKnByaW1fcHJpbnQ7Cit9IEFTTjFfUFJJTUlUSVZFX0ZVTkNTOworCisvKiBUaGlzIGlzIHRoZSBBU04xX0FVWCBzdHJ1Y3R1cmU6IGl0IGhhbmRsZXMgdmFyaW91cworICogbWlzY2VsbGFuZW91cyByZXF1aXJlbWVudHMuIEZvciBleGFtcGxlIHRoZSB1c2Ugb2YKKyAqIHJlZmVyZW5jZSBjb3VudHMgYW5kIGFuIGluZm9ybWF0aW9uYWwgY2FsbGJhY2suCisgKgorICogVGhlICJpbmZvcm1hdGlvbmFsIGNhbGxiYWNrIiBpcyBjYWxsZWQgYXQgdmFyaW91cworICogcG9pbnRzIGR1cmluZyB0aGUgQVNOMSBlbmNvZGluZyBhbmQgZGVjb2RpbmcuIEl0IGNhbgorICogYmUgdXNlZCB0byBwcm92aWRlIG1pbm9yIGN1c3RvbWlzYXRpb24gb2YgdGhlIHN0cnVjdHVyZXMKKyAqIHVzZWQuIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlcmUgdGhlIHN1cHBsaWVkIHJvdXRpbmVzCisgKiAqYWxtb3N0KiBkbyB0aGUgcmlnaHQgdGhpbmcgYnV0IG5lZWQgc29tZSBleHRyYSBoZWxwCisgKiBhdCBhIGZldyBwb2ludHMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIHplcm8gdGhlbgorICogaXQgaXMgYXNzdW1lZCBhIGZhdGFsIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQgdGhlIAorICogbWFpbiBvcGVyYXRpb24gc2hvdWxkIGJlIGFiYW5kb25lZC4KKyAqCisgKiBJZiBtYWpvciBjaGFuZ2VzIGluIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBhcmUgcmVxdWlyZWQKKyAqIHRoZW4gYW4gZXh0ZXJuYWwgdHlwZSBpcyBtb3JlIGFwcHJvcHJpYXRlLgorICovCisKK3R5cGVkZWYgaW50IEFTTjFfYXV4X2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKippbiwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQl2b2lkICpleGFyZyk7CisKK3R5cGVkZWYgc3RydWN0IEFTTjFfQVVYX3N0IHsKKwl2b2lkICphcHBfZGF0YTsKKwlpbnQgZmxhZ3M7CisJaW50IHJlZl9vZmZzZXQ7CQkvKiBPZmZzZXQgb2YgcmVmZXJlbmNlIHZhbHVlICovCisJaW50IHJlZl9sb2NrOwkJLyogTG9jayB0eXBlIHRvIHVzZSAqLworCUFTTjFfYXV4X2NiICphc24xX2NiOworCWludCBlbmNfb2Zmc2V0OwkJLyogT2Zmc2V0IG9mIEFTTjFfRU5DT0RJTkcgc3RydWN0dXJlICovCit9IEFTTjFfQVVYOworCisvKiBGb3IgcHJpbnQgcmVsYXRlZCBjYWxsYmFja3MgZXhhcmcgcG9pbnRzIHRvIHRoaXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBBU04xX1BSSU5UX0FSR19zdCB7CisJQklPICpvdXQ7CisJaW50IGluZGVudDsKKwljb25zdCBBU04xX1BDVFggKnBjdHg7Cit9IEFTTjFfUFJJTlRfQVJHOworCisvKiBGb3Igc3RyZWFtaW5nIHJlbGF0ZWQgY2FsbGJhY2tzIGV4YXJnIHBvaW50cyB0byB0aGlzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9TVFJFQU1fQVJHX3N0IHsKKwkvKiBCSU8gdG8gc3RyZWFtIHRocm91Z2ggKi8KKwlCSU8gKm91dDsKKwkvKiBCSU8gd2l0aCBmaWx0ZXJzIGFwcGVuZGVkICovCisJQklPICpuZGVmX2JpbzsKKwkvKiBTdHJlYW1pbmcgSS9PIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgY2hhciAqKmJvdW5kYXJ5OworfSBBU04xX1NUUkVBTV9BUkc7CisKKy8qIEZsYWdzIGluIEFTTjFfQVVYICovCisKKy8qIFVzZSBhIHJlZmVyZW5jZSBjb3VudCAqLworI2RlZmluZSBBU04xX0FGTEdfUkVGQ09VTlQJMQorLyogU2F2ZSB0aGUgZW5jb2Rpbmcgb2Ygc3RydWN0dXJlICh1c2VmdWwgZm9yIHNpZ25hdHVyZXMpICovCisjZGVmaW5lIEFTTjFfQUZMR19FTkNPRElORwkyCisvKiBUaGUgU2VxdWVuY2UgbGVuZ3RoIGlzIGludmFsaWQgKi8KKyNkZWZpbmUgQVNOMV9BRkxHX0JST0tFTgk0CisKKy8qIG9wZXJhdGlvbiB2YWx1ZXMgZm9yIGFzbjFfY2IgKi8KKworI2RlZmluZSBBU04xX09QX05FV19QUkUJCTAKKyNkZWZpbmUgQVNOMV9PUF9ORVdfUE9TVAkxCisjZGVmaW5lIEFTTjFfT1BfRlJFRV9QUkUJMgorI2RlZmluZSBBU04xX09QX0ZSRUVfUE9TVAkzCisjZGVmaW5lIEFTTjFfT1BfRDJJX1BSRQkJNAorI2RlZmluZSBBU04xX09QX0QySV9QT1NUCTUKKyNkZWZpbmUgQVNOMV9PUF9JMkRfUFJFCQk2CisjZGVmaW5lIEFTTjFfT1BfSTJEX1BPU1QJNworI2RlZmluZSBBU04xX09QX1BSSU5UX1BSRQk4CisjZGVmaW5lIEFTTjFfT1BfUFJJTlRfUE9TVAk5CisjZGVmaW5lIEFTTjFfT1BfU1RSRUFNX1BSRQkxMAorI2RlZmluZSBBU04xX09QX1NUUkVBTV9QT1NUCTExCisjZGVmaW5lIEFTTjFfT1BfREVUQUNIRURfUFJFCTEyCisjZGVmaW5lIEFTTjFfT1BfREVUQUNIRURfUE9TVAkxMworCisvKiBNYWNybyB0byBpbXBsZW1lbnQgYSBwcmltaXRpdmUgdHlwZSAqLworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9UWVBFKHN0bmFtZSkgSU1QTEVNRU5UX0FTTjFfVFlQRV9leChzdG5hbWUsIHN0bmFtZSwgMCkKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfVFlQRV9leChpdG5hbWUsIHZuYW1lLCBleCkgXAorCQkJCUFTTjFfSVRFTV9zdGFydChpdG5hbWUpIFwKKwkJCQkJQVNOMV9JVFlQRV9QUklNSVRJVkUsIFZfIyN2bmFtZSwgTlVMTCwgMCwgTlVMTCwgZXgsICNpdG5hbWUgXAorCQkJCUFTTjFfSVRFTV9lbmQoaXRuYW1lKQorCisvKiBNYWNybyB0byBpbXBsZW1lbnQgYSBtdWx0aSBzdHJpbmcgdHlwZSAqLworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9NU1RSSU5HKGl0bmFtZSwgbWFzaykgXAorCQkJCUFTTjFfSVRFTV9zdGFydChpdG5hbWUpIFwKKwkJCQkJQVNOMV9JVFlQRV9NU1RSSU5HLCBtYXNrLCBOVUxMLCAwLCBOVUxMLCBzaXplb2YoQVNOMV9TVFJJTkcpLCAjaXRuYW1lIFwKKwkJCQlBU04xX0lURU1fZW5kKGl0bmFtZSkKKworLyogTWFjcm8gdG8gaW1wbGVtZW50IGFuIEFTTjFfSVRFTSBpbiB0ZXJtcyBvZiBvbGQgc3R5bGUgZnVuY3MgKi8KKworI2RlZmluZSBJTVBMRU1FTlRfQ09NUEFUX0FTTjEoc25hbWUpIElNUExFTUVOVF9DT01QQVRfQVNOMV90eXBlKHNuYW1lLCBWX0FTTjFfU0VRVUVOQ0UpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0NPTVBBVF9BU04xX3R5cGUoc25hbWUsIHRhZykgXAorCXN0YXRpYyBjb25zdCBBU04xX0NPTVBBVF9GVU5DUyBzbmFtZSMjX2ZmID0geyBcCisJCShBU04xX25ld19mdW5jICopc25hbWUjI19uZXcsIFwKKwkJKEFTTjFfZnJlZV9mdW5jICopc25hbWUjI19mcmVlLCBcCisJCShBU04xX2QyaV9mdW5jICopZDJpXyMjc25hbWUsIFwKKwkJKEFTTjFfaTJkX2Z1bmMgKilpMmRfIyNzbmFtZSwgXAorCX07IFwKKwlBU04xX0lURU1fc3RhcnQoc25hbWUpIFwKKwkJQVNOMV9JVFlQRV9DT01QQVQsIFwKKwkJdGFnLCBcCisJCU5VTEwsIFwKKwkJMCwgXAorCQkmc25hbWUjI19mZiwgXAorCQkwLCBcCisJCSNzbmFtZSBcCisJQVNOMV9JVEVNX2VuZChzbmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfRVhURVJOX0FTTjEoc25hbWUsIHRhZywgZnB0cnMpIFwKKwlBU04xX0lURU1fc3RhcnQoc25hbWUpIFwKKwkJQVNOMV9JVFlQRV9FWFRFUk4sIFwKKwkJdGFnLCBcCisJCU5VTEwsIFwKKwkJMCwgXAorCQkmZnB0cnMsIFwKKwkJMCwgXAorCQkjc25hbWUgXAorCUFTTjFfSVRFTV9lbmQoc25hbWUpCisKKy8qIE1hY3JvIHRvIGltcGxlbWVudCBzdGFuZGFyZCBmdW5jdGlvbnMgaW4gdGVybXMgb2YgQVNOMV9JVEVNIHN0cnVjdHVyZXMgKi8KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoc3RuYW1lKSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfbmFtZShzdG5hbWUsIGl0bmFtZSkgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBpdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX0VOQ09ERV9uYW1lKHN0bmFtZSwgaXRuYW1lKSBcCisJCQlJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfRU5DT0RFX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBpdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX1NUQVRJQ19BU04xX0FMTE9DX0ZVTkNUSU9OUyhzdG5hbWUpIFwKKwkJSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX3BmbmFtZShzdGF0aWMsIHN0bmFtZSwgc3RuYW1lLCBzdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TKHN0bmFtZSkgXAorCQlJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfcGZuYW1lKHByZSwgc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJcHJlIHN0bmFtZSAqZm5hbWUjI19uZXcodm9pZCkgXAorCXsgXAorCQlyZXR1cm4gKHN0bmFtZSAqKUFTTjFfaXRlbV9uZXcoQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9IFwKKwlwcmUgdm9pZCBmbmFtZSMjX2ZyZWUoc3RuYW1lICphKSBcCisJeyBcCisJCUFTTjFfaXRlbV9mcmVlKChBU04xX1ZBTFVFICopYSwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9CisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCXN0bmFtZSAqZm5hbWUjI19uZXcodm9pZCkgXAorCXsgXAorCQlyZXR1cm4gKHN0bmFtZSAqKUFTTjFfaXRlbV9uZXcoQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9IFwKKwl2b2lkIGZuYW1lIyNfZnJlZShzdG5hbWUgKmEpIFwKKwl7IFwKKwkJQVNOMV9pdGVtX2ZyZWUoKEFTTjFfVkFMVUUgKilhLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTsgXAorCX0KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19mbmFtZShzdG5hbWUsIGl0bmFtZSwgZm5hbWUpIFwKKwlJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKQorCisjZGVmaW5lIElNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJc3RuYW1lICpkMmlfIyNmbmFtZShzdG5hbWUgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKSBcCisJeyBcCisJCXJldHVybiAoc3RuYW1lICopQVNOMV9pdGVtX2QyaSgoQVNOMV9WQUxVRSAqKilhLCBpbiwgbGVuLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTtcCisJfSBcCisJaW50IGkyZF8jI2ZuYW1lKHN0bmFtZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCkgXAorCXsgXAorCQlyZXR1cm4gQVNOMV9pdGVtX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7XAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfTkRFRl9GVU5DVElPTihzdG5hbWUpIFwKKwlpbnQgaTJkXyMjc3RuYW1lIyNfTkRFRihzdG5hbWUgKmEsIHVuc2lnbmVkIGNoYXIgKipvdXQpIFwKKwl7IFwKKwkJcmV0dXJuIEFTTjFfaXRlbV9uZGVmX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoc3RuYW1lKSk7XAorCX0gCisKKy8qIFRoaXMgaW5jbHVkZXMgZXZpbCBjYXN0cyB0byByZW1vdmUgY29uc3Q6IHRoZXkgd2lsbCBnbyBhd2F5IHdoZW4gZnVsbAorICogQVNOMSBjb25zdGlmaWNhdGlvbiBpcyBkb25lLgorICovCisjZGVmaW5lIElNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJc3RuYW1lICpkMmlfIyNmbmFtZShzdG5hbWUgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKSBcCisJeyBcCisJCXJldHVybiAoc3RuYW1lICopQVNOMV9pdGVtX2QyaSgoQVNOMV9WQUxVRSAqKilhLCBpbiwgbGVuLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTtcCisJfSBcCisJaW50IGkyZF8jI2ZuYW1lKGNvbnN0IHN0bmFtZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCkgXAorCXsgXAorCQlyZXR1cm4gQVNOMV9pdGVtX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7XAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRFVQX0ZVTkNUSU9OKHN0bmFtZSkgXAorCXN0bmFtZSAqIHN0bmFtZSMjX2R1cChzdG5hbWUgKngpIFwKKyAgICAgICAgeyBcCisgICAgICAgIHJldHVybiBBU04xX2l0ZW1fZHVwKEFTTjFfSVRFTV9ycHRyKHN0bmFtZSksIHgpOyBcCisgICAgICAgIH0KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9QUklOVF9GVU5DVElPTihzdG5hbWUpIFwKKwlJTVBMRU1FTlRfQVNOMV9QUklOVF9GVU5DVElPTl9mbmFtZShzdG5hbWUsIHN0bmFtZSwgc3RuYW1lKQorCisjZGVmaW5lIElNUExFTUVOVF9BU04xX1BSSU5UX0ZVTkNUSU9OX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCWludCBmbmFtZSMjX3ByaW50X2N0eChCSU8gKm91dCwgc3RuYW1lICp4LCBpbnQgaW5kZW50LCBcCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpIFwKKwl7IFwKKwkJcmV0dXJuIEFTTjFfaXRlbV9wcmludChvdXQsIChBU04xX1ZBTFVFICopeCwgaW5kZW50LCBcCisJCQlBU04xX0lURU1fcnB0cihpdG5hbWUpLCBwY3R4KTsgXAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0KG5hbWUpIFwKKwkJSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKG5hbWUsIG5hbWUsIG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCUlNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkKKworLyogZXh0ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIHByaW1pdGl2ZSB0eXBlcyAqLworCitERUNMQVJFX0FTTjFfSVRFTShBU04xX0JPT0xFQU4pCitERUNMQVJFX0FTTjFfSVRFTShBU04xX1RCT09MRUFOKQorREVDTEFSRV9BU04xX0lURU0oQVNOMV9GQk9PTEVBTikKK0RFQ0xBUkVfQVNOMV9JVEVNKEFTTjFfU0VRVUVOQ0UpCitERUNMQVJFX0FTTjFfSVRFTShDQklHTlVNKQorREVDTEFSRV9BU04xX0lURU0oQklHTlVNKQorREVDTEFSRV9BU04xX0lURU0oTE9ORykKK0RFQ0xBUkVfQVNOMV9JVEVNKFpMT05HKQorCitERUNMQVJFX1NUQUNLX09GKEFTTjFfVkFMVUUpCisKKy8qIEZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEFTTjEgY29kZSAqLworCitpbnQgQVNOMV9pdGVtX2V4X25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7Cit2b2lkIEFTTjFfaXRlbV9leF9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBBU04xX3RlbXBsYXRlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9URU1QTEFURSAqdHQpOworaW50IEFTTjFfcHJpbWl0aXZlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK3ZvaWQgQVNOMV90ZW1wbGF0ZV9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7CitpbnQgQVNOMV90ZW1wbGF0ZV9kMmkoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sIGNvbnN0IEFTTjFfVEVNUExBVEUgKnR0KTsKK2ludCBBU04xX2l0ZW1fZXhfZDJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCWludCB0YWcsIGludCBhY2xhc3MsIGNoYXIgb3B0LCBBU04xX1RMQyAqY3R4KTsKKworaW50IEFTTjFfaXRlbV9leF9pMmQoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCB0YWcsIGludCBhY2xhc3MpOworaW50IEFTTjFfdGVtcGxhdGVfaTJkKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7Cit2b2lkIEFTTjFfcHJpbWl0aXZlX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitpbnQgYXNuMV9leF9pMmMoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCAqcHV0eXBlLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX2V4X2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitpbnQgYXNuMV9nZXRfY2hvaWNlX3NlbGVjdG9yKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX3NldF9jaG9pY2Vfc2VsZWN0b3IoQVNOMV9WQUxVRSAqKnB2YWwsIGludCB2YWx1ZSwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK0FTTjFfVkFMVUUgKiogYXNuMV9nZXRfZmllbGRfcHRyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7CisKK2NvbnN0IEFTTjFfVEVNUExBVEUgKmFzbjFfZG9fYWRiKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCwgaW50IG51bGxlcnIpOworCitpbnQgYXNuMV9kb19sb2NrKEFTTjFfVkFMVUUgKipwdmFsLCBpbnQgb3AsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCit2b2lkIGFzbjFfZW5jX2luaXQoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordm9pZCBhc24xX2VuY19mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX2VuY19yZXN0b3JlKGludCAqbGVuLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgYXNuMV9lbmNfc2F2ZShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmxlbiwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9hc25fbWltZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuX21pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWQxYjEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuX21pbWUuYwpAQCAtMCwwICsxLDk0MiBAQAorLyogYXNuX21pbWUuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDggVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSAiYXNuMV9sb2NsLmgiCisKKy8qIEdlbmVyYWxpc2VkIE1JTUUgbGlrZSB1dGlsaXRpZXMgZm9yIHN0cmVhbWluZyBBU04xLiBBbHRob3VnaCBtYW55CisgKiBoYXZlIGEgUEtDUzcvQ01TIGxpa2UgZmxhdm91ciBvdGhlcnMgYXJlIG1vcmUgZ2VuZXJhbCBwdXJwb3NlLgorICovCisKKy8qIE1JTUUgZm9ybWF0IHN0cnVjdHVyZXMKKyAqIE5vdGUgdGhhdCBhbGwgYXJlIHRyYW5zbGF0ZWQgdG8gbG93ZXIgY2FzZSBhcGFydCBmcm9tCisgKiBwYXJhbWV0ZXIgdmFsdWVzLiBRdW90ZXMgYXJlIHN0cmlwcGVkIG9mZgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKK2NoYXIgKnBhcmFtX25hbWU7CQkJLyogUGFyYW0gbmFtZSBlLmcuICJtaWNhbGciICovCitjaGFyICpwYXJhbV92YWx1ZTsJCQkvKiBQYXJhbSB2YWx1ZSBlLmcuICJzaGExIiAqLworfSBNSU1FX1BBUkFNOworCitERUNMQVJFX1NUQUNLX09GKE1JTUVfUEFSQU0pCitJTVBMRU1FTlRfU1RBQ0tfT0YoTUlNRV9QQVJBTSkKKwordHlwZWRlZiBzdHJ1Y3QgeworY2hhciAqbmFtZTsJCQkJLyogTmFtZSBvZiBsaW5lIGUuZy4gImNvbnRlbnQtdHlwZSIgKi8KK2NoYXIgKnZhbHVlOwkJCQkvKiBWYWx1ZSBvZiBsaW5lIGUuZy4gInRleHQvcGxhaW4iICovCitTVEFDS19PRihNSU1FX1BBUkFNKSAqcGFyYW1zOwkJLyogWmVybyBvciBtb3JlIHBhcmFtZXRlcnMgKi8KK30gTUlNRV9IRUFERVI7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoTUlNRV9IRUFERVIpCitJTVBMRU1FTlRfU1RBQ0tfT0YoTUlNRV9IRUFERVIpCisKK3N0YXRpYyBpbnQgYXNuMV9vdXRwdXRfZGF0YShCSU8gKm91dCwgQklPICpkYXRhLCBBU04xX1ZBTFVFICp2YWwsIGludCBmbGFncywKKwkJCQkJY29uc3QgQVNOMV9JVEVNICppdCk7CitzdGF0aWMgY2hhciAqIHN0cmlwX2VuZHMoY2hhciAqbmFtZSk7CitzdGF0aWMgY2hhciAqIHN0cmlwX3N0YXJ0KGNoYXIgKm5hbWUpOworc3RhdGljIGNoYXIgKiBzdHJpcF9lbmQoY2hhciAqbmFtZSk7CitzdGF0aWMgTUlNRV9IRUFERVIgKm1pbWVfaGRyX25ldyhjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSk7CitzdGF0aWMgaW50IG1pbWVfaGRyX2FkZHBhcmFtKE1JTUVfSEVBREVSICptaGRyLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSk7CitzdGF0aWMgU1RBQ0tfT0YoTUlNRV9IRUFERVIpICptaW1lX3BhcnNlX2hkcihCSU8gKmJpbyk7CitzdGF0aWMgaW50IG1pbWVfaGRyX2NtcChjb25zdCBNSU1FX0hFQURFUiAqIGNvbnN0ICphLAorCQkJY29uc3QgTUlNRV9IRUFERVIgKiBjb25zdCAqYik7CitzdGF0aWMgaW50IG1pbWVfcGFyYW1fY21wKGNvbnN0IE1JTUVfUEFSQU0gKiBjb25zdCAqYSwKKwkJCWNvbnN0IE1JTUVfUEFSQU0gKiBjb25zdCAqYik7CitzdGF0aWMgdm9pZCBtaW1lX3BhcmFtX2ZyZWUoTUlNRV9QQVJBTSAqcGFyYW0pOworc3RhdGljIGludCBtaW1lX2JvdW5kX2NoZWNrKGNoYXIgKmxpbmUsIGludCBsaW5lbGVuLCBjaGFyICpib3VuZCwgaW50IGJsZW4pOworc3RhdGljIGludCBtdWx0aV9zcGxpdChCSU8gKmJpbywgY2hhciAqYm91bmQsIFNUQUNLX09GKEJJTykgKipyZXQpOworc3RhdGljIGludCBzdHJpcF9lb2woY2hhciAqbGluZWJ1ZiwgaW50ICpwbGVuKTsKK3N0YXRpYyBNSU1FX0hFQURFUiAqbWltZV9oZHJfZmluZChTVEFDS19PRihNSU1FX0hFQURFUikgKmhkcnMsIGNoYXIgKm5hbWUpOworc3RhdGljIE1JTUVfUEFSQU0gKm1pbWVfcGFyYW1fZmluZChNSU1FX0hFQURFUiAqaGRyLCBjaGFyICpuYW1lKTsKK3N0YXRpYyB2b2lkIG1pbWVfaGRyX2ZyZWUoTUlNRV9IRUFERVIgKmhkcik7CisKKyNkZWZpbmUgTUFYX1NNTEVOIDEwMjQKKyNkZWZpbmUgbWltZV9kZWJ1Zyh4KSAvKiB4ICovCisKKy8qIE91dHB1dCBhbiBBU04xIHN0cnVjdHVyZSBpbiBCRVIgZm9ybWF0IHN0cmVhbWluZyBpZiBuZWNlc3NhcnkgKi8KKworaW50IGkyZF9BU04xX2Jpb19zdHJlYW0oQklPICpvdXQsIEFTTjFfVkFMVUUgKnZhbCwgQklPICppbiwgaW50IGZsYWdzLAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCS8qIElmIHN0cmVhbWluZyBjcmVhdGUgc3RyZWFtIEJJTyBhbmQgY29weSBhbGwgY29udGVudCB0aHJvdWdoIGl0ICovCisJaWYgKGZsYWdzICYgU01JTUVfU1RSRUFNKQorCQl7CisJCUJJTyAqYmlvLCAqdGJpbzsKKwkJYmlvID0gQklPX25ld19OREVGKG91dCwgdmFsLCBpdCk7CisJCWlmICghYmlvKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfSTJEX0FTTjFfQklPX1NUUkVBTSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJU01JTUVfY3JsZl9jb3B5KGluLCBiaW8sIGZsYWdzKTsKKwkJKHZvaWQpQklPX2ZsdXNoKGJpbyk7CisJCS8qIEZyZWUgdXAgc3VjY2Vzc2l2ZSBCSU9zIHVudGlsIHdlIGhpdCB0aGUgb2xkIG91dHB1dCBCSU8gKi8KKwkJZG8KKwkJCXsKKwkJCXRiaW8gPSBCSU9fcG9wKGJpbyk7CisJCQlCSU9fZnJlZShiaW8pOworCQkJYmlvID0gdGJpbzsKKwkJCX0gd2hpbGUgKGJpbyAhPSBvdXQpOworCQl9CisJLyogZWxzZSBqdXN0IHdyaXRlIG91dCBBU04xIHN0cnVjdHVyZSB3aGljaCB3aWxsIGhhdmUgYWxsIGNvbnRlbnQKKwkgKiBzdG9yZWQgaW50ZXJuYWxseQorCSAqLworCWVsc2UKKwkJQVNOMV9pdGVtX2kyZF9iaW8oaXQsIG91dCwgdmFsKTsKKwlyZXR1cm4gMTsKKwl9CisKKy8qIEJhc2UgNjQgcmVhZCBhbmQgd3JpdGUgb2YgQVNOMSBzdHJ1Y3R1cmUgKi8KKworc3RhdGljIGludCBCNjRfd3JpdGVfQVNOMShCSU8gKm91dCwgQVNOMV9WQUxVRSAqdmFsLCBCSU8gKmluLCBpbnQgZmxhZ3MsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJQklPICpiNjQ7CisJaW50IHI7CisJYjY0ID0gQklPX25ldyhCSU9fZl9iYXNlNjQoKSk7CisJaWYoIWI2NCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9CNjRfV1JJVEVfQVNOMSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJLyogcHJlcGVuZCB0aGUgYjY0IEJJTyBzbyBhbGwgZGF0YSBpcyBiYXNlNjQgZW5jb2RlZC4KKwkgKi8KKwlvdXQgPSBCSU9fcHVzaChiNjQsIG91dCk7CisJciA9IGkyZF9BU04xX2Jpb19zdHJlYW0ob3V0LCB2YWwsIGluLCBmbGFncywgaXQpOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCUJJT19wb3Aob3V0KTsKKwlCSU9fZnJlZShiNjQpOworCXJldHVybiByOworCX0KKworLyogU3RyZWFtaW5nIEFTTjEgUEVNIHdyaXRlICovCisKK2ludCBQRU1fd3JpdGVfYmlvX0FTTjFfc3RyZWFtKEJJTyAqb3V0LCBBU04xX1ZBTFVFICp2YWwsIEJJTyAqaW4sIGludCBmbGFncywKKwkJCQljb25zdCBjaGFyICpoZHIsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJaW50IHI7CisJQklPX3ByaW50ZihvdXQsICItLS0tLUJFR0lOICVzLS0tLS1cbiIsIGhkcik7CisJciA9IEI2NF93cml0ZV9BU04xKG91dCwgdmFsLCBpbiwgZmxhZ3MsIGl0KTsKKwlCSU9fcHJpbnRmKG91dCwgIi0tLS0tRU5EICVzLS0tLS1cbiIsIGhkcik7CisJcmV0dXJuIHI7CisJfQorCitzdGF0aWMgQVNOMV9WQUxVRSAqYjY0X3JlYWRfYXNuMShCSU8gKmJpbywgY29uc3QgQVNOMV9JVEVNICppdCkKK3sKKwlCSU8gKmI2NDsKKwlBU04xX1ZBTFVFICp2YWw7CisJaWYoIShiNjQgPSBCSU9fbmV3KEJJT19mX2Jhc2U2NCgpKSkpIHsKKwkJQVNOMWVycihBU04xX0ZfQjY0X1JFQURfQVNOMSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKwliaW8gPSBCSU9fcHVzaChiNjQsIGJpbyk7CisJdmFsID0gQVNOMV9pdGVtX2QyaV9iaW8oaXQsIGJpbywgTlVMTCk7CisJaWYoIXZhbCkKKwkJQVNOMWVycihBU04xX0ZfQjY0X1JFQURfQVNOMSxBU04xX1JfREVDT0RFX0VSUk9SKTsKKwkodm9pZClCSU9fZmx1c2goYmlvKTsKKwliaW8gPSBCSU9fcG9wKGJpbyk7CisJQklPX2ZyZWUoYjY0KTsKKwlyZXR1cm4gdmFsOworfQorCisvKiBHZW5lcmF0ZSB0aGUgTUlNRSAibWljYWxnIiBwYXJhbWV0ZXIgZnJvbSBSRkMzODUxLCBSRkM0NDkwICovCisKK3N0YXRpYyBpbnQgYXNuMV93cml0ZV9taWNhbGcoQklPICpvdXQsIFNUQUNLX09GKFg1MDlfQUxHT1IpICptZGFsZ3MpCisJeworCWNvbnN0IEVWUF9NRCAqbWQ7CisJaW50IGksIGhhdmVfdW5rbm93biA9IDAsIHdyaXRlX2NvbW1hLCByZXQgPSAwLCBtZF9uaWQ7CisJaGF2ZV91bmtub3duID0gMDsKKwl3cml0ZV9jb21tYSA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfQUxHT1JfbnVtKG1kYWxncyk7IGkrKykKKwkJeworCQlpZiAod3JpdGVfY29tbWEpCisJCQlCSU9fd3JpdGUob3V0LCAiLCIsIDEpOworCQl3cml0ZV9jb21tYSA9IDE7CisJCW1kX25pZCA9IE9CSl9vYmoybmlkKHNrX1g1MDlfQUxHT1JfdmFsdWUobWRhbGdzLCBpKS0+YWxnb3JpdGhtKTsKKwkJbWQgPSBFVlBfZ2V0X2RpZ2VzdGJ5bmlkKG1kX25pZCk7CisJCWlmIChtZCAmJiBtZC0+bWRfY3RybCkKKwkJCXsKKwkJCWludCBydjsKKwkJCWNoYXIgKm1pY3N0cjsKKwkJCXJ2ID0gbWQtPm1kX2N0cmwoTlVMTCwgRVZQX01EX0NUUkxfTUlDQUxHLCAwLCAmbWljc3RyKTsKKwkJCWlmIChydiA+IDApCisJCQkJeworCQkJCUJJT19wdXRzKG91dCwgbWljc3RyKTsKKwkJCQlPUEVOU1NMX2ZyZWUobWljc3RyKTsKKwkJCQljb250aW51ZTsKKwkJCQl9CisJCQlpZiAocnYgIT0gLTIpCisJCQkJZ290byBlcnI7CisJCQl9CisJCXN3aXRjaChtZF9uaWQpCisJCQl7CisJCQljYXNlIE5JRF9zaGExOgorCQkJQklPX3B1dHMob3V0LCAic2hhMSIpOworCQkJYnJlYWs7CisKKwkJCWNhc2UgTklEX21kNToKKwkJCUJJT19wdXRzKG91dCwgIm1kNSIpOworCQkJYnJlYWs7CisKKwkJCWNhc2UgTklEX3NoYTI1NjoKKwkJCUJJT19wdXRzKG91dCwgInNoYS0yNTYiKTsKKwkJCWJyZWFrOworCisJCQljYXNlIE5JRF9zaGEzODQ6CisJCQlCSU9fcHV0cyhvdXQsICJzaGEtMzg0Iik7CisJCQlicmVhazsKKworCQkJY2FzZSBOSURfc2hhNTEyOgorCQkJQklPX3B1dHMob3V0LCAic2hhLTUxMiIpOworCQkJYnJlYWs7CisKKwkJCWNhc2UgTklEX2lkX0dvc3RSMzQxMV85NDoKKwkJCUJJT19wdXRzKG91dCwgImdvc3RyMzQxMS05NCIpOworCQkJCWdvdG8gZXJyOworCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQlpZiAoaGF2ZV91bmtub3duKQorCQkJCXdyaXRlX2NvbW1hID0gMDsKKwkJCWVsc2UKKwkJCQl7CisJCQkJQklPX3B1dHMob3V0LCAidW5rbm93biIpOworCQkJCWhhdmVfdW5rbm93biA9IDE7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJCX0KKwkJfQorCisJcmV0ID0gMTsKKwllcnI6CisKKwlyZXR1cm4gcmV0OworCisJfQorCisvKiBTTUlNRSBzZW5kZXIgKi8KKworaW50IFNNSU1FX3dyaXRlX0FTTjEoQklPICpiaW8sIEFTTjFfVkFMVUUgKnZhbCwgQklPICpkYXRhLCBpbnQgZmxhZ3MsCisJCQkJaW50IGN0eXBlX25pZCwgaW50IGVjb250X25pZCwKKwkJCQlTVEFDS19PRihYNTA5X0FMR09SKSAqbWRhbGdzLAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQpCit7CisJY2hhciBib3VuZFszM10sIGM7CisJaW50IGk7CisJY29uc3QgY2hhciAqbWltZV9wcmVmaXgsICptaW1lX2VvbCwgKmNuYW1lID0gInNtaW1lLnA3bSI7CisJY29uc3QgY2hhciAqbXNnX3R5cGU9TlVMTDsKKwlpZiAoZmxhZ3MgJiBTTUlNRV9PTERNSU1FKQorCQltaW1lX3ByZWZpeCA9ICJhcHBsaWNhdGlvbi94LXBrY3M3LSI7CisJZWxzZQorCQltaW1lX3ByZWZpeCA9ICJhcHBsaWNhdGlvbi9wa2NzNy0iOworCisJaWYgKGZsYWdzICYgU01JTUVfQ1JMRkVPTCkKKwkJbWltZV9lb2wgPSAiXHJcbiI7CisJZWxzZQorCQltaW1lX2VvbCA9ICJcbiI7CisJaWYoKGZsYWdzICYgU01JTUVfREVUQUNIRUQpICYmIGRhdGEpIHsKKwkvKiBXZSB3YW50IG11bHRpcGFydC9zaWduZWQgKi8KKwkJLyogR2VuZXJhdGUgYSByYW5kb20gYm91bmRhcnkgKi8KKwkJUkFORF9wc2V1ZG9fYnl0ZXMoKHVuc2lnbmVkIGNoYXIgKilib3VuZCwgMzIpOworCQlmb3IoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCQljID0gYm91bmRbaV0gJiAweGY7CisJCQlpZihjIDwgMTApIGMgKz0gJzAnOworCQkJZWxzZSBjICs9ICdBJyAtIDEwOworCQkJYm91bmRbaV0gPSBjOworCQl9CisJCWJvdW5kWzMyXSA9IDA7CisJCUJJT19wcmludGYoYmlvLCAiTUlNRS1WZXJzaW9uOiAxLjAlcyIsIG1pbWVfZW9sKTsKKwkJQklPX3ByaW50ZihiaW8sICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9zaWduZWQ7Iik7CisJCUJJT19wcmludGYoYmlvLCAiIHByb3RvY29sPVwiJXNzaWduYXR1cmVcIjsiLCBtaW1lX3ByZWZpeCk7CisJCUJJT19wdXRzKGJpbywgIiBtaWNhbGc9XCIiKTsKKwkJYXNuMV93cml0ZV9taWNhbGcoYmlvLCBtZGFsZ3MpOworCQlCSU9fcHJpbnRmKGJpbywgIlwiOyBib3VuZGFyeT1cIi0tLS0lc1wiJXMlcyIsCisJCQkJCQlib3VuZCwgbWltZV9lb2wsIG1pbWVfZW9sKTsKKwkJQklPX3ByaW50ZihiaW8sICJUaGlzIGlzIGFuIFMvTUlNRSBzaWduZWQgbWVzc2FnZSVzJXMiLAorCQkJCQkJbWltZV9lb2wsIG1pbWVfZW9sKTsKKwkJLyogTm93IHdyaXRlIG91dCB0aGUgZmlyc3QgcGFydCAqLworCQlCSU9fcHJpbnRmKGJpbywgIi0tLS0tLSVzJXMiLCBib3VuZCwgbWltZV9lb2wpOworCQlpZiAoIWFzbjFfb3V0cHV0X2RhdGEoYmlvLCBkYXRhLCB2YWwsIGZsYWdzLCBpdCkpCisJCQlyZXR1cm4gMDsKKwkJQklPX3ByaW50ZihiaW8sICIlcy0tLS0tLSVzJXMiLCBtaW1lX2VvbCwgYm91bmQsIG1pbWVfZW9sKTsKKworCQkvKiBIZWFkZXJzIGZvciBzaWduYXR1cmUgKi8KKworCQlCSU9fcHJpbnRmKGJpbywgIkNvbnRlbnQtVHlwZTogJXNzaWduYXR1cmU7IiwgbWltZV9wcmVmaXgpOyAKKwkJQklPX3ByaW50ZihiaW8sICIgbmFtZT1cInNtaW1lLnA3c1wiJXMiLCBtaW1lX2VvbCk7CisJCUJJT19wcmludGYoYmlvLCAiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0JXMiLAorCQkJCQkJCQltaW1lX2VvbCk7CisJCUJJT19wcmludGYoYmlvLCAiQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsiKTsKKwkJQklPX3ByaW50ZihiaW8sICIgZmlsZW5hbWU9XCJzbWltZS5wN3NcIiVzJXMiLAorCQkJCQkJCW1pbWVfZW9sLCBtaW1lX2VvbCk7CisJCUI2NF93cml0ZV9BU04xKGJpbywgdmFsLCBOVUxMLCAwLCBpdCk7CisJCUJJT19wcmludGYoYmlvLCIlcy0tLS0tLSVzLS0lcyVzIiwgbWltZV9lb2wsIGJvdW5kLAorCQkJCQkJCW1pbWVfZW9sLCBtaW1lX2VvbCk7CisJCXJldHVybiAxOworCX0KKworCS8qIERldGVybWluZSBzbWltZS10eXBlIGhlYWRlciAqLworCisJaWYgKGN0eXBlX25pZCA9PSBOSURfcGtjczdfZW52ZWxvcGVkKQorCQltc2dfdHlwZSA9ICJlbnZlbG9wZWQtZGF0YSI7CisJZWxzZSBpZiAoY3R5cGVfbmlkID09IE5JRF9wa2NzN19zaWduZWQpCisJCXsKKwkJaWYgKGVjb250X25pZCA9PSBOSURfaWRfc21pbWVfY3RfcmVjZWlwdCkKKwkJCW1zZ190eXBlID0gInNpZ25lZC1yZWNlaXB0IjsKKwkJZWxzZSBpZiAoc2tfWDUwOV9BTEdPUl9udW0obWRhbGdzKSA+PSAwKQorCQkJbXNnX3R5cGUgPSAic2lnbmVkLWRhdGEiOworCQllbHNlCisJCQltc2dfdHlwZSA9ICJjZXJ0cy1vbmx5IjsKKwkJfQorCWVsc2UgaWYgKGN0eXBlX25pZCA9PSBOSURfaWRfc21pbWVfY3RfY29tcHJlc3NlZERhdGEpCisJCXsKKwkJbXNnX3R5cGUgPSAiY29tcHJlc3NlZC1kYXRhIjsKKwkJY25hbWUgPSAic21pbWUucDd6IjsKKwkJfQorCS8qIE1JTUUgaGVhZGVycyAqLworCUJJT19wcmludGYoYmlvLCAiTUlNRS1WZXJzaW9uOiAxLjAlcyIsIG1pbWVfZW9sKTsKKwlCSU9fcHJpbnRmKGJpbywgIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7Iik7CisJQklPX3ByaW50ZihiaW8sICIgZmlsZW5hbWU9XCIlc1wiJXMiLCBjbmFtZSwgbWltZV9lb2wpOworCUJJT19wcmludGYoYmlvLCAiQ29udGVudC1UeXBlOiAlc21pbWU7IiwgbWltZV9wcmVmaXgpOworCWlmIChtc2dfdHlwZSkKKwkJQklPX3ByaW50ZihiaW8sICIgc21pbWUtdHlwZT0lczsiLCBtc2dfdHlwZSk7CisJQklPX3ByaW50ZihiaW8sICIgbmFtZT1cIiVzXCIlcyIsIGNuYW1lLCBtaW1lX2VvbCk7CisJQklPX3ByaW50ZihiaW8sICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQlcyVzIiwKKwkJCQkJCW1pbWVfZW9sLCBtaW1lX2VvbCk7CisJaWYgKCFCNjRfd3JpdGVfQVNOMShiaW8sIHZhbCwgZGF0YSwgZmxhZ3MsIGl0KSkKKwkJcmV0dXJuIDA7CisJQklPX3ByaW50ZihiaW8sICIlcyIsIG1pbWVfZW9sKTsKKwlyZXR1cm4gMTsKK30KKworLyogSGFuZGxlIG91dHB1dCBvZiBBU04xIGRhdGEgKi8KKworCitzdGF0aWMgaW50IGFzbjFfb3V0cHV0X2RhdGEoQklPICpvdXQsIEJJTyAqZGF0YSwgQVNOMV9WQUxVRSAqdmFsLCBpbnQgZmxhZ3MsCisJCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCUJJTyAqdG1wYmlvOworCWNvbnN0IEFTTjFfQVVYICphdXggPSBpdC0+ZnVuY3M7CisJQVNOMV9TVFJFQU1fQVJHIHNhcmc7CisKKwlpZiAoIShmbGFncyAmIFNNSU1FX0RFVEFDSEVEKSkKKwkJeworCQlTTUlNRV9jcmxmX2NvcHkoZGF0YSwgb3V0LCBmbGFncyk7CisJCXJldHVybiAxOworCQl9CisKKwlpZiAoIWF1eCB8fCAhYXV4LT5hc24xX2NiKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfT1VUUFVUX0RBVEEsCisJCQkJCUFTTjFfUl9TVFJFQU1JTkdfTk9UX1NVUFBPUlRFRCk7CisJCXJldHVybiAwOworCQl9CisKKwlzYXJnLm91dCA9IG91dDsKKwlzYXJnLm5kZWZfYmlvID0gTlVMTDsKKwlzYXJnLmJvdW5kYXJ5ID0gTlVMTDsKKworCS8qIExldCBBU04xIGNvZGUgcHJlcGVuZCBhbnkgbmVlZGVkIEJJT3MgKi8KKworCWlmIChhdXgtPmFzbjFfY2IoQVNOMV9PUF9ERVRBQ0hFRF9QUkUsICZ2YWwsIGl0LCAmc2FyZykgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBDb3B5IGRhdGEgYWNyb3NzLCBwYXNzaW5nIHRocm91Z2ggZmlsdGVyIEJJT3MgZm9yIHByb2Nlc3NpbmcgKi8KKwlTTUlNRV9jcmxmX2NvcHkoZGF0YSwgc2FyZy5uZGVmX2JpbywgZmxhZ3MpOworCisJLyogRmluYWxpemUgc3RydWN0dXJlICovCisJaWYgKGF1eC0+YXNuMV9jYihBU04xX09QX0RFVEFDSEVEX1BPU1QsICZ2YWwsIGl0LCAmc2FyZykgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBOb3cgcmVtb3ZlIGFueSBkaWdlc3RzIHByZXBlbmRlZCB0byB0aGUgQklPICovCisKKwl3aGlsZSAoc2FyZy5uZGVmX2JpbyAhPSBvdXQpCisJCXsKKwkJdG1wYmlvID0gQklPX3BvcChzYXJnLm5kZWZfYmlvKTsKKwkJQklPX2ZyZWUoc2FyZy5uZGVmX2Jpbyk7CisJCXNhcmcubmRlZl9iaW8gPSB0bXBiaW87CisJCX0KKworCXJldHVybiAxOworCisJfQorCisvKiBTTUlNRSByZWFkZXI6IGhhbmRsZSBtdWx0aXBhcnQvc2lnbmVkIGFuZCBvcGFxdWUgc2lnbmluZy4KKyAqIGluIG11bHRpcGFydCBjYXNlIHRoZSBjb250ZW50IGlzIHBsYWNlZCBpbiBhIG1lbW9yeSBCSU8KKyAqIHBvaW50ZWQgdG8gYnkgImJjb250Ii4gSW4gb3BhcXVlIHRoaXMgaXMgc2V0IHRvIE5VTEwKKyAqLworCitBU04xX1ZBTFVFICpTTUlNRV9yZWFkX0FTTjEoQklPICpiaW8sIEJJTyAqKmJjb250LCBjb25zdCBBU04xX0lURU0gKml0KQoreworCUJJTyAqYXNuaW47CisJU1RBQ0tfT0YoTUlNRV9IRUFERVIpICpoZWFkZXJzID0gTlVMTDsKKwlTVEFDS19PRihCSU8pICpwYXJ0cyA9IE5VTEw7CisJTUlNRV9IRUFERVIgKmhkcjsKKwlNSU1FX1BBUkFNICpwcm07CisJQVNOMV9WQUxVRSAqdmFsOworCWludCByZXQ7CisKKwlpZihiY29udCkgKmJjb250ID0gTlVMTDsKKworCWlmICghKGhlYWRlcnMgPSBtaW1lX3BhcnNlX2hkcihiaW8pKSkgeworCQlBU04xZXJyKEFTTjFfRl9TTUlNRV9SRUFEX0FTTjEsQVNOMV9SX01JTUVfUEFSU0VfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZighKGhkciA9IG1pbWVfaGRyX2ZpbmQoaGVhZGVycywgImNvbnRlbnQtdHlwZSIpKSB8fCAhaGRyLT52YWx1ZSkgeworCQlza19NSU1FX0hFQURFUl9wb3BfZnJlZShoZWFkZXJzLCBtaW1lX2hkcl9mcmVlKTsKKwkJQVNOMWVycihBU04xX0ZfU01JTUVfUkVBRF9BU04xLCBBU04xX1JfTk9fQ09OVEVOVF9UWVBFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogSGFuZGxlIG11bHRpcGFydC9zaWduZWQgKi8KKworCWlmKCFzdHJjbXAoaGRyLT52YWx1ZSwgIm11bHRpcGFydC9zaWduZWQiKSkgeworCQkvKiBTcGxpdCBpbnRvIHR3byBwYXJ0cyAqLworCQlwcm0gPSBtaW1lX3BhcmFtX2ZpbmQoaGRyLCAiYm91bmRhcnkiKTsKKwkJaWYoIXBybSB8fCAhcHJtLT5wYXJhbV92YWx1ZSkgeworCQkJc2tfTUlNRV9IRUFERVJfcG9wX2ZyZWUoaGVhZGVycywgbWltZV9oZHJfZnJlZSk7CisJCQlBU04xZXJyKEFTTjFfRl9TTUlNRV9SRUFEX0FTTjEsIEFTTjFfUl9OT19NVUxUSVBBUlRfQk9VTkRBUlkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcmV0ID0gbXVsdGlfc3BsaXQoYmlvLCBwcm0tPnBhcmFtX3ZhbHVlLCAmcGFydHMpOworCQlza19NSU1FX0hFQURFUl9wb3BfZnJlZShoZWFkZXJzLCBtaW1lX2hkcl9mcmVlKTsKKwkJaWYoIXJldCB8fCAoc2tfQklPX251bShwYXJ0cykgIT0gMikgKSB7CisJCQlBU04xZXJyKEFTTjFfRl9TTUlNRV9SRUFEX0FTTjEsIEFTTjFfUl9OT19NVUxUSVBBUlRfQk9EWV9GQUlMVVJFKTsKKwkJCXNrX0JJT19wb3BfZnJlZShwYXJ0cywgQklPX3ZmcmVlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJLyogUGFyc2UgdGhlIHNpZ25hdHVyZSBwaWVjZSAqLworCQlhc25pbiA9IHNrX0JJT192YWx1ZShwYXJ0cywgMSk7CisKKwkJaWYgKCEoaGVhZGVycyA9IG1pbWVfcGFyc2VfaGRyKGFzbmluKSkpIHsKKwkJCUFTTjFlcnIoQVNOMV9GX1NNSU1FX1JFQURfQVNOMSxBU04xX1JfTUlNRV9TSUdfUEFSU0VfRVJST1IpOworCQkJc2tfQklPX3BvcF9mcmVlKHBhcnRzLCBCSU9fdmZyZWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBHZXQgY29udGVudCB0eXBlICovCisKKwkJaWYoIShoZHIgPSBtaW1lX2hkcl9maW5kKGhlYWRlcnMsICJjb250ZW50LXR5cGUiKSkgfHwKKwkJCQkJCQkJICFoZHItPnZhbHVlKSB7CisJCQlza19NSU1FX0hFQURFUl9wb3BfZnJlZShoZWFkZXJzLCBtaW1lX2hkcl9mcmVlKTsKKwkJCUFTTjFlcnIoQVNOMV9GX1NNSU1FX1JFQURfQVNOMSwgQVNOMV9SX05PX1NJR19DT05URU5UX1RZUEUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZihzdHJjbXAoaGRyLT52YWx1ZSwgImFwcGxpY2F0aW9uL3gtcGtjczctc2lnbmF0dXJlIikgJiYKKwkJCXN0cmNtcChoZHItPnZhbHVlLCAiYXBwbGljYXRpb24vcGtjczctc2lnbmF0dXJlIikpIHsKKwkJCXNrX01JTUVfSEVBREVSX3BvcF9mcmVlKGhlYWRlcnMsIG1pbWVfaGRyX2ZyZWUpOworCQkJQVNOMWVycihBU04xX0ZfU01JTUVfUkVBRF9BU04xLEFTTjFfUl9TSUdfSU5WQUxJRF9NSU1FX1RZUEUpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ0eXBlOiAiLCBoZHItPnZhbHVlKTsKKwkJCXNrX0JJT19wb3BfZnJlZShwYXJ0cywgQklPX3ZmcmVlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNrX01JTUVfSEVBREVSX3BvcF9mcmVlKGhlYWRlcnMsIG1pbWVfaGRyX2ZyZWUpOworCQkvKiBSZWFkIGluIEFTTjEgKi8KKwkJaWYoISh2YWwgPSBiNjRfcmVhZF9hc24xKGFzbmluLCBpdCkpKSB7CisJCQlBU04xZXJyKEFTTjFfRl9TTUlNRV9SRUFEX0FTTjEsQVNOMV9SX0FTTjFfU0lHX1BBUlNFX0VSUk9SKTsKKwkJCXNrX0JJT19wb3BfZnJlZShwYXJ0cywgQklPX3ZmcmVlKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYoYmNvbnQpIHsKKwkJCSpiY29udCA9IHNrX0JJT192YWx1ZShwYXJ0cywgMCk7CisJCQlCSU9fZnJlZShhc25pbik7CisJCQlza19CSU9fZnJlZShwYXJ0cyk7CisJCX0gZWxzZSBza19CSU9fcG9wX2ZyZWUocGFydHMsIEJJT192ZnJlZSk7CisJCXJldHVybiB2YWw7CisJfQorCQkKKwkvKiBPSywgaWYgbm90IG11bHRpcGFydC9zaWduZWQgdHJ5IG9wYXF1ZSBzaWduYXR1cmUgKi8KKworCWlmIChzdHJjbXAgKGhkci0+dmFsdWUsICJhcHBsaWNhdGlvbi94LXBrY3M3LW1pbWUiKSAmJgorCSAgICBzdHJjbXAgKGhkci0+dmFsdWUsICJhcHBsaWNhdGlvbi9wa2NzNy1taW1lIikpIHsKKwkJQVNOMWVycihBU04xX0ZfU01JTUVfUkVBRF9BU04xLEFTTjFfUl9JTlZBTElEX01JTUVfVFlQRSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAidHlwZTogIiwgaGRyLT52YWx1ZSk7CisJCXNrX01JTUVfSEVBREVSX3BvcF9mcmVlKGhlYWRlcnMsIG1pbWVfaGRyX2ZyZWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza19NSU1FX0hFQURFUl9wb3BfZnJlZShoZWFkZXJzLCBtaW1lX2hkcl9mcmVlKTsKKwkKKwlpZighKHZhbCA9IGI2NF9yZWFkX2FzbjEoYmlvLCBpdCkpKSB7CisJCUFTTjFlcnIoQVNOMV9GX1NNSU1FX1JFQURfQVNOMSwgQVNOMV9SX0FTTjFfUEFSU0VfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHZhbDsKKworfQorCisvKiBDb3B5IHRleHQgZnJvbSBvbmUgQklPIHRvIGFub3RoZXIgbWFraW5nIHRoZSBvdXRwdXQgQ1JMRiBhdCBFT0wgKi8KK2ludCBTTUlNRV9jcmxmX2NvcHkoQklPICppbiwgQklPICpvdXQsIGludCBmbGFncykKK3sKKwlCSU8gKmJmOworCWNoYXIgZW9sOworCWludCBsZW47CisJY2hhciBsaW5lYnVmW01BWF9TTUxFTl07CisJLyogQnVmZmVyIG91dHB1dCBzbyB3ZSBkb24ndCB3cml0ZSBvbmUgbGluZSBhdCBhIHRpbWUuIFRoaXMgaXMKKwkgKiB1c2VmdWwgd2hlbiBzdHJlYW1pbmcgYXMgd2UgZG9uJ3QgZW5kIHVwIHdpdGggb25lIE9DVEVUIFNUUklORworCSAqIHBlciBsaW5lLgorCSAqLworCWJmID0gQklPX25ldyhCSU9fZl9idWZmZXIoKSk7CisJaWYgKCFiZikKKwkJcmV0dXJuIDA7CisJb3V0ID0gQklPX3B1c2goYmYsIG91dCk7CisJaWYoZmxhZ3MgJiBTTUlNRV9CSU5BUlkpCisJCXsKKwkJd2hpbGUoKGxlbiA9IEJJT19yZWFkKGluLCBsaW5lYnVmLCBNQVhfU01MRU4pKSA+IDApCisJCQkJCQlCSU9fd3JpdGUob3V0LCBsaW5lYnVmLCBsZW4pOworCQl9CisJZWxzZQorCQl7CisJCWlmKGZsYWdzICYgU01JTUVfVEVYVCkKKwkJCUJJT19wcmludGYob3V0LCAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcblxyXG4iKTsKKwkJd2hpbGUgKChsZW4gPSBCSU9fZ2V0cyhpbiwgbGluZWJ1ZiwgTUFYX1NNTEVOKSkgPiAwKQorCQkJeworCQkJZW9sID0gc3RyaXBfZW9sKGxpbmVidWYsICZsZW4pOworCQkJaWYgKGxlbikKKwkJCQlCSU9fd3JpdGUob3V0LCBsaW5lYnVmLCBsZW4pOworCQkJaWYoZW9sKSBCSU9fd3JpdGUob3V0LCAiXHJcbiIsIDIpOworCQkJfQorCQl9CisJKHZvaWQpQklPX2ZsdXNoKG91dCk7CisJQklPX3BvcChvdXQpOworCUJJT19mcmVlKGJmKTsKKwlyZXR1cm4gMTsKK30KKworLyogU3RyaXAgb2ZmIGhlYWRlcnMgaWYgdGhleSBhcmUgdGV4dC9wbGFpbiAqLworaW50IFNNSU1FX3RleHQoQklPICppbiwgQklPICpvdXQpCit7CisJY2hhciBpb2J1Zls0MDk2XTsKKwlpbnQgbGVuOworCVNUQUNLX09GKE1JTUVfSEVBREVSKSAqaGVhZGVyczsKKwlNSU1FX0hFQURFUiAqaGRyOworCisJaWYgKCEoaGVhZGVycyA9IG1pbWVfcGFyc2VfaGRyKGluKSkpIHsKKwkJQVNOMWVycihBU04xX0ZfU01JTUVfVEVYVCxBU04xX1JfTUlNRV9QQVJTRV9FUlJPUik7CisJCXJldHVybiAwOworCX0KKwlpZighKGhkciA9IG1pbWVfaGRyX2ZpbmQoaGVhZGVycywgImNvbnRlbnQtdHlwZSIpKSB8fCAhaGRyLT52YWx1ZSkgeworCQlBU04xZXJyKEFTTjFfRl9TTUlNRV9URVhULEFTTjFfUl9NSU1FX05PX0NPTlRFTlRfVFlQRSk7CisJCXNrX01JTUVfSEVBREVSX3BvcF9mcmVlKGhlYWRlcnMsIG1pbWVfaGRyX2ZyZWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNtcCAoaGRyLT52YWx1ZSwgInRleHQvcGxhaW4iKSkgeworCQlBU04xZXJyKEFTTjFfRl9TTUlNRV9URVhULEFTTjFfUl9JTlZBTElEX01JTUVfVFlQRSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAidHlwZTogIiwgaGRyLT52YWx1ZSk7CisJCXNrX01JTUVfSEVBREVSX3BvcF9mcmVlKGhlYWRlcnMsIG1pbWVfaGRyX2ZyZWUpOworCQlyZXR1cm4gMDsKKwl9CisJc2tfTUlNRV9IRUFERVJfcG9wX2ZyZWUoaGVhZGVycywgbWltZV9oZHJfZnJlZSk7CisJd2hpbGUgKChsZW4gPSBCSU9fcmVhZChpbiwgaW9idWYsIHNpemVvZihpb2J1ZikpKSA+IDApCisJCQkJCQlCSU9fd3JpdGUob3V0LCBpb2J1ZiwgbGVuKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIFNwbGl0IGEgbXVsdGlwYXJ0L1hYWCBtZXNzYWdlIGJvZHkgaW50byBjb21wb25lbnQgcGFydHM6IHJlc3VsdCBpcworICogY2Fub25pY2FsIHBhcnRzIGluIGEgU1RBQ0sgb2YgYmlvcworICovCisKK3N0YXRpYyBpbnQgbXVsdGlfc3BsaXQoQklPICpiaW8sIGNoYXIgKmJvdW5kLCBTVEFDS19PRihCSU8pICoqcmV0KQoreworCWNoYXIgbGluZWJ1ZltNQVhfU01MRU5dOworCWludCBsZW4sIGJsZW47CisJaW50IGVvbCA9IDAsIG5leHRfZW9sID0gMDsKKwlCSU8gKmJwYXJ0ID0gTlVMTDsKKwlTVEFDS19PRihCSU8pICpwYXJ0czsKKwljaGFyIHN0YXRlLCBwYXJ0LCBmaXJzdDsKKworCWJsZW4gPSBzdHJsZW4oYm91bmQpOworCXBhcnQgPSAwOworCXN0YXRlID0gMDsKKwlmaXJzdCA9IDE7CisJcGFydHMgPSBza19CSU9fbmV3X251bGwoKTsKKwkqcmV0ID0gcGFydHM7CisJd2hpbGUgKChsZW4gPSBCSU9fZ2V0cyhiaW8sIGxpbmVidWYsIE1BWF9TTUxFTikpID4gMCkgeworCQlzdGF0ZSA9IG1pbWVfYm91bmRfY2hlY2sobGluZWJ1ZiwgbGVuLCBib3VuZCwgYmxlbik7CisJCWlmKHN0YXRlID09IDEpIHsKKwkJCWZpcnN0ID0gMTsKKwkJCXBhcnQrKzsKKwkJfSBlbHNlIGlmKHN0YXRlID09IDIpIHsKKwkJCXNrX0JJT19wdXNoKHBhcnRzLCBicGFydCk7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmKHBhcnQpIHsKKwkJCS8qIFN0cmlwIENSK0xGIGZyb20gbGluZWJ1ZiAqLworCQkJbmV4dF9lb2wgPSBzdHJpcF9lb2wobGluZWJ1ZiwgJmxlbik7CisJCQlpZihmaXJzdCkgeworCQkJCWZpcnN0ID0gMDsKKwkJCQlpZihicGFydCkgc2tfQklPX3B1c2gocGFydHMsIGJwYXJ0KTsKKwkJCQlicGFydCA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworCQkJCUJJT19zZXRfbWVtX2VvZl9yZXR1cm4oYnBhcnQsIDApOworCQkJfSBlbHNlIGlmIChlb2wpCisJCQkJQklPX3dyaXRlKGJwYXJ0LCAiXHJcbiIsIDIpOworCQkJZW9sID0gbmV4dF9lb2w7CisJCQlpZiAobGVuKQorCQkJCUJJT193cml0ZShicGFydCwgbGluZWJ1ZiwgbGVuKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpcyB0aGUgYmlnIG9uZTogcGFyc2UgTUlNRSBoZWFkZXIgbGluZXMgdXAgdG8gbWVzc2FnZSBib2R5ICovCisKKyNkZWZpbmUgTUlNRV9JTlZBTElECTAKKyNkZWZpbmUgTUlNRV9TVEFSVAkxCisjZGVmaW5lIE1JTUVfVFlQRQkyCisjZGVmaW5lIE1JTUVfTkFNRQkzCisjZGVmaW5lIE1JTUVfVkFMVUUJNAorI2RlZmluZSBNSU1FX1FVT1RFCTUKKyNkZWZpbmUgTUlNRV9DT01NRU5UCTYKKworCitzdGF0aWMgU1RBQ0tfT0YoTUlNRV9IRUFERVIpICptaW1lX3BhcnNlX2hkcihCSU8gKmJpbykKK3sKKwljaGFyICpwLCAqcSwgYzsKKwljaGFyICpudG1wOworCWNoYXIgbGluZWJ1ZltNQVhfU01MRU5dOworCU1JTUVfSEVBREVSICptaGRyID0gTlVMTDsKKwlTVEFDS19PRihNSU1FX0hFQURFUikgKmhlYWRlcnM7CisJaW50IGxlbiwgc3RhdGUsIHNhdmVfc3RhdGUgPSAwOworCisJaGVhZGVycyA9IHNrX01JTUVfSEVBREVSX25ldyhtaW1lX2hkcl9jbXApOworCXdoaWxlICgobGVuID0gQklPX2dldHMoYmlvLCBsaW5lYnVmLCBNQVhfU01MRU4pKSA+IDApIHsKKwkvKiBJZiB3aGl0ZXNwYWNlIGF0IGxpbmUgc3RhcnQgdGhlbiBjb250aW51YXRpb24gbGluZSAqLworCWlmKG1oZHIgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcilsaW5lYnVmWzBdKSkgc3RhdGUgPSBNSU1FX05BTUU7CisJZWxzZSBzdGF0ZSA9IE1JTUVfU1RBUlQ7CisJbnRtcCA9IE5VTEw7CisJLyogR28gdGhyb3VnaCBhbGwgY2hhcmFjdGVycyAqLworCWZvcihwID0gbGluZWJ1ZiwgcSA9IGxpbmVidWY7IChjID0gKnApICYmIChjIT0nXHInKSAmJiAoYyE9J1xuJyk7IHArKykgeworCisJLyogU3RhdGUgbWFjaGluZSB0byBoYW5kbGUgTUlNRSBoZWFkZXJzCisJICogaWYgdGhpcyBsb29rcyBob3JyaWJsZSB0aGF0J3MgYmVjYXVzZSBpdCAqaXMqCisgICAgICAgICAqLworCisJCXN3aXRjaChzdGF0ZSkgeworCQkJY2FzZSBNSU1FX1NUQVJUOgorCQkJaWYoYyA9PSAnOicpIHsKKwkJCQlzdGF0ZSA9IE1JTUVfVFlQRTsKKwkJCQkqcCA9IDA7CisJCQkJbnRtcCA9IHN0cmlwX2VuZHMocSk7CisJCQkJcSA9IHAgKyAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgTUlNRV9UWVBFOgorCQkJaWYoYyA9PSAnOycpIHsKKwkJCQltaW1lX2RlYnVnKCJGb3VuZCBFbmQgVmFsdWVcbiIpOworCQkJCSpwID0gMDsKKwkJCQltaGRyID0gbWltZV9oZHJfbmV3KG50bXAsIHN0cmlwX2VuZHMocSkpOworCQkJCXNrX01JTUVfSEVBREVSX3B1c2goaGVhZGVycywgbWhkcik7CisJCQkJbnRtcCA9IE5VTEw7CisJCQkJcSA9IHAgKyAxOworCQkJCXN0YXRlID0gTUlNRV9OQU1FOworCQkJfSBlbHNlIGlmKGMgPT0gJygnKSB7CisJCQkJc2F2ZV9zdGF0ZSA9IHN0YXRlOworCQkJCXN0YXRlID0gTUlNRV9DT01NRU5UOworCQkJfQorCQkJYnJlYWs7CisKKwkJCWNhc2UgTUlNRV9DT01NRU5UOgorCQkJaWYoYyA9PSAnKScpIHsKKwkJCQlzdGF0ZSA9IHNhdmVfc3RhdGU7CisJCQl9CisJCQlicmVhazsKKworCQkJY2FzZSBNSU1FX05BTUU6CisJCQlpZihjID09ICc9JykgeworCQkJCXN0YXRlID0gTUlNRV9WQUxVRTsKKwkJCQkqcCA9IDA7CisJCQkJbnRtcCA9IHN0cmlwX2VuZHMocSk7CisJCQkJcSA9IHAgKyAxOworCQkJfQorCQkJYnJlYWsgOworCisJCQljYXNlIE1JTUVfVkFMVUU6CisJCQlpZihjID09ICc7JykgeworCQkJCXN0YXRlID0gTUlNRV9OQU1FOworCQkJCSpwID0gMDsKKwkJCQltaW1lX2hkcl9hZGRwYXJhbShtaGRyLCBudG1wLCBzdHJpcF9lbmRzKHEpKTsKKwkJCQludG1wID0gTlVMTDsKKwkJCQlxID0gcCArIDE7CisJCQl9IGVsc2UgaWYgKGMgPT0gJyInKSB7CisJCQkJbWltZV9kZWJ1ZygiRm91bmQgUXVvdGVcbiIpOworCQkJCXN0YXRlID0gTUlNRV9RVU9URTsKKwkJCX0gZWxzZSBpZihjID09ICcoJykgeworCQkJCXNhdmVfc3RhdGUgPSBzdGF0ZTsKKwkJCQlzdGF0ZSA9IE1JTUVfQ09NTUVOVDsKKwkJCX0KKwkJCWJyZWFrOworCisJCQljYXNlIE1JTUVfUVVPVEU6CisJCQlpZihjID09ICciJykgeworCQkJCW1pbWVfZGVidWcoIkZvdW5kIE1hdGNoIFF1b3RlXG4iKTsKKwkJCQlzdGF0ZSA9IE1JTUVfVkFMVUU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKHN0YXRlID09IE1JTUVfVFlQRSkgeworCQltaGRyID0gbWltZV9oZHJfbmV3KG50bXAsIHN0cmlwX2VuZHMocSkpOworCQlza19NSU1FX0hFQURFUl9wdXNoKGhlYWRlcnMsIG1oZHIpOworCX0gZWxzZSBpZihzdGF0ZSA9PSBNSU1FX1ZBTFVFKQorCQkJIG1pbWVfaGRyX2FkZHBhcmFtKG1oZHIsIG50bXAsIHN0cmlwX2VuZHMocSkpOworCWlmKHAgPT0gbGluZWJ1ZikgYnJlYWs7CS8qIEJsYW5rIGxpbmUgbWVhbnMgZW5kIG9mIGhlYWRlcnMgKi8KK30KKworcmV0dXJuIGhlYWRlcnM7CisKK30KKworc3RhdGljIGNoYXIgKnN0cmlwX2VuZHMoY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gc3RyaXBfZW5kKHN0cmlwX3N0YXJ0KG5hbWUpKTsKK30KKworLyogU3RyaXAgYSBwYXJhbWV0ZXIgb2Ygd2hpdGVzcGFjZSBmcm9tIHN0YXJ0IG9mIHBhcmFtICovCitzdGF0aWMgY2hhciAqc3RyaXBfc3RhcnQoY2hhciAqbmFtZSkKK3sKKwljaGFyICpwLCBjOworCS8qIExvb2sgZm9yIGZpcnN0IG5vbiB3aGl0ZSBzcGFjZSBvciBxdW90ZSAqLworCWZvcihwID0gbmFtZTsgKGMgPSAqcCkgO3ArKykgeworCQlpZihjID09ICciJykgeworCQkJLyogTmV4dCBjaGFyIGlzIHN0YXJ0IG9mIHN0cmluZyBpZiBub24gbnVsbCAqLworCQkJaWYocFsxXSkgcmV0dXJuIHAgKyAxOworCQkJLyogRWxzZSBudWxsIHN0cmluZyAqLworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpYykpIHJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogQXMgYWJvdmUgYnV0IHN0cmlwIGZyb20gZW5kIG9mIHN0cmluZyA6IG1heWJlIHNob3VsZCBoYW5kbGUgYnJhY2tldHM/ICovCitzdGF0aWMgY2hhciAqc3RyaXBfZW5kKGNoYXIgKm5hbWUpCit7CisJY2hhciAqcCwgYzsKKwlpZighbmFtZSkgcmV0dXJuIE5VTEw7CisJLyogTG9vayBmb3IgZmlyc3Qgbm9uIHdoaXRlIHNwYWNlIG9yIHF1b3RlICovCisJZm9yKHAgPSBuYW1lICsgc3RybGVuKG5hbWUpIC0gMTsgcCA+PSBuYW1lIDtwLS0pIHsKKwkJYyA9ICpwOworCQlpZihjID09ICciJykgeworCQkJaWYocCAtIDEgPT0gbmFtZSkgcmV0dXJuIE5VTEw7CisJCQkqcCA9IDA7CisJCQlyZXR1cm4gbmFtZTsKKwkJfQorCQlpZihpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKWMpKSAqcCA9IDA7CQorCQllbHNlIHJldHVybiBuYW1lOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIE1JTUVfSEVBREVSICptaW1lX2hkcl9uZXcoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpCit7CisJTUlNRV9IRUFERVIgKm1oZHI7CisJY2hhciAqdG1wbmFtZSwgKnRtcHZhbCwgKnA7CisJaW50IGM7CisJaWYobmFtZSkgeworCQlpZighKHRtcG5hbWUgPSBCVUZfc3RyZHVwKG5hbWUpKSkgcmV0dXJuIE5VTEw7CisJCWZvcihwID0gdG1wbmFtZSA7ICpwOyBwKyspIHsKKwkJCWMgPSAqcDsKKwkJCWlmKGlzdXBwZXIoYykpIHsKKwkJCQljID0gdG9sb3dlcihjKTsKKwkJCQkqcCA9IGM7CisJCQl9CisJCX0KKwl9IGVsc2UgdG1wbmFtZSA9IE5VTEw7CisJaWYodmFsdWUpIHsKKwkJaWYoISh0bXB2YWwgPSBCVUZfc3RyZHVwKHZhbHVlKSkpIHJldHVybiBOVUxMOworCQlmb3IocCA9IHRtcHZhbCA7ICpwOyBwKyspIHsKKwkJCWMgPSAqcDsKKwkJCWlmKGlzdXBwZXIoYykpIHsKKwkJCQljID0gdG9sb3dlcihjKTsKKwkJCQkqcCA9IGM7CisJCQl9CisJCX0KKwl9IGVsc2UgdG1wdmFsID0gTlVMTDsKKwltaGRyID0gKE1JTUVfSEVBREVSICopIE9QRU5TU0xfbWFsbG9jKHNpemVvZihNSU1FX0hFQURFUikpOworCWlmKCFtaGRyKSByZXR1cm4gTlVMTDsKKwltaGRyLT5uYW1lID0gdG1wbmFtZTsKKwltaGRyLT52YWx1ZSA9IHRtcHZhbDsKKwlpZighKG1oZHItPnBhcmFtcyA9IHNrX01JTUVfUEFSQU1fbmV3KG1pbWVfcGFyYW1fY21wKSkpIHJldHVybiBOVUxMOworCXJldHVybiBtaGRyOworfQorCQkKK3N0YXRpYyBpbnQgbWltZV9oZHJfYWRkcGFyYW0oTUlNRV9IRUFERVIgKm1oZHIsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKQoreworCWNoYXIgKnRtcG5hbWUsICp0bXB2YWwsICpwOworCWludCBjOworCU1JTUVfUEFSQU0gKm1wYXJhbTsKKwlpZihuYW1lKSB7CisJCXRtcG5hbWUgPSBCVUZfc3RyZHVwKG5hbWUpOworCQlpZighdG1wbmFtZSkgcmV0dXJuIDA7CisJCWZvcihwID0gdG1wbmFtZSA7ICpwOyBwKyspIHsKKwkJCWMgPSAqcDsKKwkJCWlmKGlzdXBwZXIoYykpIHsKKwkJCQljID0gdG9sb3dlcihjKTsKKwkJCQkqcCA9IGM7CisJCQl9CisJCX0KKwl9IGVsc2UgdG1wbmFtZSA9IE5VTEw7CisJaWYodmFsdWUpIHsKKwkJdG1wdmFsID0gQlVGX3N0cmR1cCh2YWx1ZSk7CisJCWlmKCF0bXB2YWwpIHJldHVybiAwOworCX0gZWxzZSB0bXB2YWwgPSBOVUxMOworCS8qIFBhcmFtZXRlciB2YWx1ZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlIHNvIGxlYXZlIGFzIGlzICovCisJbXBhcmFtID0gKE1JTUVfUEFSQU0gKikgT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKE1JTUVfUEFSQU0pKTsKKwlpZighbXBhcmFtKSByZXR1cm4gMDsKKwltcGFyYW0tPnBhcmFtX25hbWUgPSB0bXBuYW1lOworCW1wYXJhbS0+cGFyYW1fdmFsdWUgPSB0bXB2YWw7CisJc2tfTUlNRV9QQVJBTV9wdXNoKG1oZHItPnBhcmFtcywgbXBhcmFtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBtaW1lX2hkcl9jbXAoY29uc3QgTUlNRV9IRUFERVIgKiBjb25zdCAqYSwKKwkJCWNvbnN0IE1JTUVfSEVBREVSICogY29uc3QgKmIpCit7CisJcmV0dXJuKHN0cmNtcCgoKmEpLT5uYW1lLCAoKmIpLT5uYW1lKSk7Cit9CisKK3N0YXRpYyBpbnQgbWltZV9wYXJhbV9jbXAoY29uc3QgTUlNRV9QQVJBTSAqIGNvbnN0ICphLAorCQkJY29uc3QgTUlNRV9QQVJBTSAqIGNvbnN0ICpiKQoreworCXJldHVybihzdHJjbXAoKCphKS0+cGFyYW1fbmFtZSwgKCpiKS0+cGFyYW1fbmFtZSkpOworfQorCisvKiBGaW5kIGEgaGVhZGVyIHdpdGggYSBnaXZlbiBuYW1lIChpZiBwb3NzaWJsZSkgKi8KKworc3RhdGljIE1JTUVfSEVBREVSICptaW1lX2hkcl9maW5kKFNUQUNLX09GKE1JTUVfSEVBREVSKSAqaGRycywgY2hhciAqbmFtZSkKK3sKKwlNSU1FX0hFQURFUiBodG1wOworCWludCBpZHg7CisJaHRtcC5uYW1lID0gbmFtZTsKKwlpZHggPSBza19NSU1FX0hFQURFUl9maW5kKGhkcnMsICZodG1wKTsKKwlpZihpZHggPCAwKSByZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2tfTUlNRV9IRUFERVJfdmFsdWUoaGRycywgaWR4KTsKK30KKworc3RhdGljIE1JTUVfUEFSQU0gKm1pbWVfcGFyYW1fZmluZChNSU1FX0hFQURFUiAqaGRyLCBjaGFyICpuYW1lKQoreworCU1JTUVfUEFSQU0gcGFyYW07CisJaW50IGlkeDsKKwlwYXJhbS5wYXJhbV9uYW1lID0gbmFtZTsKKwlpZHggPSBza19NSU1FX1BBUkFNX2ZpbmQoaGRyLT5wYXJhbXMsICZwYXJhbSk7CisJaWYoaWR4IDwgMCkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNrX01JTUVfUEFSQU1fdmFsdWUoaGRyLT5wYXJhbXMsIGlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbWVfaGRyX2ZyZWUoTUlNRV9IRUFERVIgKmhkcikKK3sKKwlpZihoZHItPm5hbWUpIE9QRU5TU0xfZnJlZShoZHItPm5hbWUpOworCWlmKGhkci0+dmFsdWUpIE9QRU5TU0xfZnJlZShoZHItPnZhbHVlKTsKKwlpZihoZHItPnBhcmFtcykgc2tfTUlNRV9QQVJBTV9wb3BfZnJlZShoZHItPnBhcmFtcywgbWltZV9wYXJhbV9mcmVlKTsKKwlPUEVOU1NMX2ZyZWUoaGRyKTsKK30KKworc3RhdGljIHZvaWQgbWltZV9wYXJhbV9mcmVlKE1JTUVfUEFSQU0gKnBhcmFtKQoreworCWlmKHBhcmFtLT5wYXJhbV9uYW1lKSBPUEVOU1NMX2ZyZWUocGFyYW0tPnBhcmFtX25hbWUpOworCWlmKHBhcmFtLT5wYXJhbV92YWx1ZSkgT1BFTlNTTF9mcmVlKHBhcmFtLT5wYXJhbV92YWx1ZSk7CisJT1BFTlNTTF9mcmVlKHBhcmFtKTsKK30KKworLyogQ2hlY2sgZm9yIGEgbXVsdGlwYXJ0IGJvdW5kYXJ5LiBSZXR1cm5zOgorICogMCA6IG5vIGJvdW5kYXJ5CisgKiAxIDogcGFydCBib3VuZGFyeQorICogMiA6IGZpbmFsIGJvdW5kYXJ5CisgKi8KK3N0YXRpYyBpbnQgbWltZV9ib3VuZF9jaGVjayhjaGFyICpsaW5lLCBpbnQgbGluZWxlbiwgY2hhciAqYm91bmQsIGludCBibGVuKQoreworCWlmKGxpbmVsZW4gPT0gLTEpIGxpbmVsZW4gPSBzdHJsZW4obGluZSk7CisJaWYoYmxlbiA9PSAtMSkgYmxlbiA9IHN0cmxlbihib3VuZCk7CisJLyogUXVpY2tseSBlbGltaW5hdGUgaWYgbGluZSBsZW5ndGggdG9vIHNob3J0ICovCisJaWYoYmxlbiArIDIgPiBsaW5lbGVuKSByZXR1cm4gMDsKKwkvKiBDaGVjayBmb3IgcGFydCBib3VuZGFyeSAqLworCWlmKCFzdHJuY21wKGxpbmUsICItLSIsIDIpICYmICFzdHJuY21wKGxpbmUgKyAyLCBib3VuZCwgYmxlbikpIHsKKwkJaWYoIXN0cm5jbXAobGluZSArIGJsZW4gKyAyLCAiLS0iLCAyKSkgcmV0dXJuIDI7CisJCWVsc2UgcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0cmlwX2VvbChjaGFyICpsaW5lYnVmLCBpbnQgKnBsZW4pCisJeworCWludCBsZW4gPSAqcGxlbjsKKwljaGFyICpwLCBjOworCWludCBpc19lb2wgPSAwOworCXAgPSBsaW5lYnVmICsgbGVuIC0gMTsKKwlmb3IgKHAgPSBsaW5lYnVmICsgbGVuIC0gMTsgbGVuID4gMDsgbGVuLS0sIHAtLSkKKwkJeworCQljID0gKnA7CisJCWlmIChjID09ICdcbicpCisJCQlpc19lb2wgPSAxOworCQllbHNlIGlmIChjICE9ICdccicpCisJCQlicmVhazsKKwkJfQorCSpwbGVuID0gbGVuOworCXJldHVybiBpc19lb2w7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuX21vaWQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2Fzbl9tb2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVhNmE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2Fzbl9tb2lkLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qIGFzbl9tb2lkLmMgKi8KKy8qIFdyaXR0ZW4gYnkgU3RlcGhlbiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKy8qIFNpbXBsZSBBU04xIE9JRCBtb2R1bGU6IGFkZCBhbGwgb2JqZWN0cyBpbiBhIGdpdmVuIHNlY3Rpb24gKi8KKworc3RhdGljIGludCBkb19jcmVhdGUoY2hhciAqdmFsdWUsIGNoYXIgKm5hbWUpOworCitzdGF0aWMgaW50IG9pZF9tb2R1bGVfaW5pdChDT05GX0lNT0RVTEUgKm1kLCBjb25zdCBDT05GICpjbmYpCisJeworCWludCBpOworCWNvbnN0IGNoYXIgKm9pZF9zZWN0aW9uOworCVNUQUNLX09GKENPTkZfVkFMVUUpICpza3RtcDsKKwlDT05GX1ZBTFVFICpvdmFsOworCW9pZF9zZWN0aW9uID0gQ09ORl9pbW9kdWxlX2dldF92YWx1ZShtZCk7CisJaWYoIShza3RtcCA9IE5DT05GX2dldF9zZWN0aW9uKGNuZiwgb2lkX3NlY3Rpb24pKSkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9PSURfTU9EVUxFX0lOSVQsIEFTTjFfUl9FUlJPUl9MT0FESU5HX1NFQ1RJT04pOworCQlyZXR1cm4gMDsKKwkJfQorCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHNrdG1wKTsgaSsrKQorCQl7CisJCW92YWwgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHNrdG1wLCBpKTsKKwkJaWYoIWRvX2NyZWF0ZShvdmFsLT52YWx1ZSwgb3ZhbC0+bmFtZSkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9PSURfTU9EVUxFX0lOSVQsIEFTTjFfUl9BRERJTkdfT0JKRUNUKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgdm9pZCBvaWRfbW9kdWxlX2ZpbmlzaChDT05GX0lNT0RVTEUgKm1kKQorCXsKKwlPQkpfY2xlYW51cCgpOworCX0KKwordm9pZCBBU04xX2FkZF9vaWRfbW9kdWxlKHZvaWQpCisJeworCUNPTkZfbW9kdWxlX2FkZCgib2lkX3NlY3Rpb24iLCBvaWRfbW9kdWxlX2luaXQsIG9pZF9tb2R1bGVfZmluaXNoKTsKKwl9CisKKy8qIENyZWF0ZSBhbiBPSUQgYmFzZWQgb24gYSBuYW1lIHZhbHVlIHBhaXIuIEFjY2VwdCB0d28gZm9ybWF0cy4KKyAqIHNob3J0bmFtZSA9IDEuMi4zLjQKKyAqIHNob3J0bmFtZSA9IHNvbWUgbG9uZyBuYW1lLCAxLjIuMy40CisgKi8KKworCitzdGF0aWMgaW50IGRvX2NyZWF0ZShjaGFyICp2YWx1ZSwgY2hhciAqbmFtZSkKKwl7CisJaW50IG5pZDsKKwlBU04xX09CSkVDVCAqb2lkOworCWNoYXIgKmxuLCAqb3N0ciwgKnAsICpsbnRtcDsKKwlwID0gc3RycmNocih2YWx1ZSwgJywnKTsKKwlpZiAoIXApCisJCXsKKwkJbG4gPSBuYW1lOworCQlvc3RyID0gdmFsdWU7CisJCX0KKwllbHNlCisJCXsKKwkJbG4gPSBOVUxMOworCQlvc3RyID0gcCArIDE7CisJCWlmICghKm9zdHIpCisJCQlyZXR1cm4gMDsKKwkJd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqb3N0cikpIG9zdHIrKzsKKwkJfQorCisJbmlkID0gT0JKX2NyZWF0ZShvc3RyLCBuYW1lLCBsbik7CisKKwlpZiAobmlkID09IE5JRF91bmRlZikKKwkJcmV0dXJuIDA7CisKKwlpZiAocCkKKwkJeworCQlsbiA9IHZhbHVlOworCQl3aGlsZShpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpsbikpIGxuKys7CisJCXAtLTsKKwkJd2hpbGUoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcCkpCisJCQl7CisJCQlpZiAocCA9PSBsbikKKwkJCQlyZXR1cm4gMDsKKwkJCXAtLTsKKwkJCX0KKwkJcCsrOworCQlsbnRtcCA9IE9QRU5TU0xfbWFsbG9jKChwIC0gbG4pICsgMSk7CisJCWlmIChsbnRtcCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCW1lbWNweShsbnRtcCwgbG4sIHAgLSBsbik7CisJCWxudG1wW3AgLSBsbl0gPSAwOworCQlvaWQgPSBPQkpfbmlkMm9iaihuaWQpOworCQlvaWQtPmxuID0gbG50bXA7CisJCX0KKworCXJldHVybiAxOworCX0KKwkJCisJCQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYXNuX3BhY2suYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2Fzbl9wYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3MzgyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2Fzbl9wYWNrLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qIGFzbl9wYWNrLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpZm5kZWYgTk9fQVNOMV9PTEQKKworLyogQVNOMSBwYWNraW5nIGFuZCB1bnBhY2tpbmcgZnVuY3Rpb25zICovCisKKy8qIFR1cm4gYW4gQVNOMSBlbmNvZGVkIFNFUVVFTkNFIE9GIGludG8gYSBTVEFDSyBvZiBzdHJ1Y3R1cmVzICovCisKK1NUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpBU04xX3NlcV91bnBhY2soY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLAorCQkJIGQyaV9vZl92b2lkICpkMmksIHZvaWQgKCpmcmVlX2Z1bmMpKE9QRU5TU0xfQkxPQ0spKQoreworICAgIFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpzazsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYnVmOworICAgIHBidWYgPSAgYnVmOworICAgIGlmICghKHNrID0gZDJpX0FTTjFfU0VUKE5VTEwsICZwYnVmLCBsZW4sIGQyaSwgZnJlZV9mdW5jLAorCQkJCQlWX0FTTjFfU0VRVUVOQ0UsIFZfQVNOMV9VTklWRVJTQUwpKSkKKwkJIEFTTjFlcnIoQVNOMV9GX0FTTjFfU0VRX1VOUEFDSyxBU04xX1JfREVDT0RFX0VSUk9SKTsKKyAgICByZXR1cm4gc2s7Cit9CisKKy8qIFR1cm4gYSBTVEFDSyBzdHJ1Y3R1cmVzIGludG8gYW4gQVNOMSBlbmNvZGVkIFNFUVVFTkNFIE9GIHN0cnVjdHVyZSBpbiBhCisgKiBPUEVOU1NMX21hbGxvYydlZCBidWZmZXIKKyAqLworCit1bnNpZ25lZCBjaGFyICpBU04xX3NlcV9wYWNrKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spICpzYWZlcywgaTJkX29mX3ZvaWQgKmkyZCwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqKmJ1ZiwgaW50ICpsZW4pCit7CisJaW50IHNhZmVsZW47CisJdW5zaWduZWQgY2hhciAqc2FmZSwgKnA7CisJaWYgKCEoc2FmZWxlbiA9IGkyZF9BU04xX1NFVChzYWZlcywgTlVMTCwgaTJkLCBWX0FTTjFfU0VRVUVOQ0UsCisJCQkJCSAgICAgIFZfQVNOMV9VTklWRVJTQUwsIElTX1NFUVVFTkNFKSkpIHsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9TRVFfUEFDSyxBU04xX1JfRU5DT0RFX0VSUk9SKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghKHNhZmUgPSBPUEVOU1NMX21hbGxvYyAoc2FmZWxlbikpKSB7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfU0VRX1BBQ0ssRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcCA9IHNhZmU7CisJaTJkX0FTTjFfU0VUKHNhZmVzLCAmcCwgaTJkLCBWX0FTTjFfU0VRVUVOQ0UsIFZfQVNOMV9VTklWRVJTQUwsCisJCQkJCQkJCSBJU19TRVFVRU5DRSk7CisJaWYgKGxlbikgKmxlbiA9IHNhZmVsZW47CisJaWYgKGJ1ZikgKmJ1ZiA9IHNhZmU7CisJcmV0dXJuIHNhZmU7Cit9CisKKy8qIEV4dHJhY3QgYW4gQVNOMSBvYmplY3QgZnJvbSBhbiBBU04xX1NUUklORyAqLworCit2b2lkICpBU04xX3VucGFja19zdHJpbmcoQVNOMV9TVFJJTkcgKm9jdCwgZDJpX29mX3ZvaWQgKmQyaSkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCWNoYXIgKnJldDsKKworCXAgPSBvY3QtPmRhdGE7CisJaWYoIShyZXQgPSBkMmkoTlVMTCwgJnAsIG9jdC0+bGVuZ3RoKSkpCisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVU5QQUNLX1NUUklORyxBU04xX1JfREVDT0RFX0VSUk9SKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBQYWNrIGFuIEFTTjEgb2JqZWN0IGludG8gYW4gQVNOMV9TVFJJTkcgKi8KKworQVNOMV9TVFJJTkcgKkFTTjFfcGFja19zdHJpbmcodm9pZCAqb2JqLCBpMmRfb2Zfdm9pZCAqaTJkLCBBU04xX1NUUklORyAqKm9jdCkKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCUFTTjFfU1RSSU5HICpvY3RtcDsKKworCWlmICghb2N0IHx8ICEqb2N0KSB7CisJCWlmICghKG9jdG1wID0gQVNOMV9TVFJJTkdfbmV3ICgpKSkgeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9QQUNLX1NUUklORyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAob2N0KSAqb2N0ID0gb2N0bXA7CisJfSBlbHNlIG9jdG1wID0gKm9jdDsKKwkJCisJaWYgKCEob2N0bXAtPmxlbmd0aCA9IGkyZChvYmosIE5VTEwpKSkgeworCQlBU04xZXJyKEFTTjFfRl9BU04xX1BBQ0tfU1RSSU5HLEFTTjFfUl9FTkNPREVfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCEocCA9IE9QRU5TU0xfbWFsbG9jIChvY3RtcC0+bGVuZ3RoKSkpIHsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9QQUNLX1NUUklORyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlvY3RtcC0+ZGF0YSA9IHA7CisJaTJkIChvYmosICZwKTsKKwlyZXR1cm4gb2N0bXA7Cit9CisKKyNlbmRpZgorCisvKiBBU04xX0lURU0gdmVyc2lvbnMgb2YgdGhlIGFib3ZlICovCisKK0FTTjFfU1RSSU5HICpBU04xX2l0ZW1fcGFjayh2b2lkICpvYmosIGNvbnN0IEFTTjFfSVRFTSAqaXQsIEFTTjFfU1RSSU5HICoqb2N0KQoreworCUFTTjFfU1RSSU5HICpvY3RtcDsKKworCWlmICghb2N0IHx8ICEqb2N0KSB7CisJCWlmICghKG9jdG1wID0gQVNOMV9TVFJJTkdfbmV3ICgpKSkgeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX1BBQ0ssRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaWYgKG9jdCkgKm9jdCA9IG9jdG1wOworCX0gZWxzZSBvY3RtcCA9ICpvY3Q7CisKKwlpZihvY3RtcC0+ZGF0YSkgeworCQlPUEVOU1NMX2ZyZWUob2N0bXAtPmRhdGEpOworCQlvY3RtcC0+ZGF0YSA9IE5VTEw7CisJfQorCQkKKwlpZiAoIShvY3RtcC0+bGVuZ3RoID0gQVNOMV9pdGVtX2kyZChvYmosICZvY3RtcC0+ZGF0YSwgaXQpKSkgeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fUEFDSyxBU04xX1JfRU5DT0RFX0VSUk9SKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghb2N0bXAtPmRhdGEpIHsKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX1BBQ0ssRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG9jdG1wOworfQorCisvKiBFeHRyYWN0IGFuIEFTTjEgb2JqZWN0IGZyb20gYW4gQVNOMV9TVFJJTkcgKi8KKwordm9pZCAqQVNOMV9pdGVtX3VucGFjayhBU04xX1NUUklORyAqb2N0LCBjb25zdCBBU04xX0lURU0gKml0KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJdm9pZCAqcmV0OworCisJcCA9IG9jdC0+ZGF0YTsKKwlpZighKHJldCA9IEFTTjFfaXRlbV9kMmkoTlVMTCwgJnAsIG9jdC0+bGVuZ3RoLCBpdCkpKQorCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fVU5QQUNLLEFTTjFfUl9ERUNPREVfRVJST1IpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9iaW9fYXNuMS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYmlvX2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzdlZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvYmlvX2FzbjEuYwpAQCAtMCwwICsxLDQ5NSBAQAorLyogYmlvX2FzbjEuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIEV4cGVyaW1lbnRhbCBBU04xIEJJTy4gV2hlbiB3cml0dGVuIHRocm91Z2ggdGhlIGRhdGEgaXMgY29udmVydGVkCisgKiB0byBhbiBBU04xIHN0cmluZyB0eXBlOiBkZWZhdWx0IGlzIE9DVEVUIFNUUklORy4gQWRkaXRpb25hbCBmdW5jdGlvbnMKKyAqIGNhbiBiZSBwcm92aWRlZCB0byBhZGQgcHJlZml4IGFuZCBzdWZmaXggZGF0YS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworLyogTXVzdCBiZSBsYXJnZSBlbm91Z2ggZm9yIGJpZ2dlc3QgdGFnK2xlbmd0aCAqLworI2RlZmluZSBERUZBVUxUX0FTTjFfQlVGX1NJWkUgMjAKKwordHlwZWRlZiBlbnVtIAorCXsKKwlBU04xX1NUQVRFX1NUQVJULAorCUFTTjFfU1RBVEVfUFJFX0NPUFksCisJQVNOMV9TVEFURV9IRUFERVIsCisJQVNOMV9TVEFURV9IRUFERVJfQ09QWSwKKwlBU04xX1NUQVRFX0RBVEFfQ09QWSwKKwlBU04xX1NUQVRFX1BPU1RfQ09QWSwKKwlBU04xX1NUQVRFX0RPTkUKKwl9IGFzbjFfYmlvX3N0YXRlX3Q7CisKK3R5cGVkZWYgc3RydWN0IEJJT19BU04xX0VYX0ZVTkNTX3N0CisJeworCWFzbjFfcHNfZnVuYwkqZXhfZnVuYzsKKwlhc24xX3BzX2Z1bmMJKmV4X2ZyZWVfZnVuYzsKKwl9IEJJT19BU04xX0VYX0ZVTkNTOworCit0eXBlZGVmIHN0cnVjdCBCSU9fQVNOMV9CVUZfQ1RYX3QKKwl7CisJLyogSW50ZXJuYWwgc3RhdGUgKi8KKwlhc24xX2Jpb19zdGF0ZV90IHN0YXRlOworCS8qIEludGVybmFsIGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwkvKiBTaXplIG9mIGJ1ZmZlciAqLworCWludCBidWZzaXplOworCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyICovCisJaW50IGJ1ZnBvczsKKwkvKiBDdXJyZW50IGJ1ZmZlciBsZW5ndGggKi8KKwlpbnQgYnVmbGVuOworCS8qIEFtb3VudCBvZiBkYXRhIHRvIGNvcHkgKi8KKwlpbnQgY29weWxlbjsKKwkvKiBDbGFzcyBhbmQgdGFnIHRvIHVzZSAqLworCWludCBhc24xX2NsYXNzLCBhc24xX3RhZzsKKwlhc24xX3BzX2Z1bmMgKnByZWZpeCwgKnByZWZpeF9mcmVlLCAqc3VmZml4LCAqc3VmZml4X2ZyZWU7CisJLyogRXh0cmEgYnVmZmVyIGZvciBwcmVmaXggYW5kIHN1ZmZpeCBkYXRhICovCisJdW5zaWduZWQgY2hhciAqZXhfYnVmOworCWludCBleF9sZW47CisJaW50IGV4X3BvczsKKwl2b2lkICpleF9hcmc7CisJfSBCSU9fQVNOMV9CVUZfQ1RYOworCisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fd3JpdGUoQklPICpoLCBjb25zdCBjaGFyICpidWYsaW50IG51bSk7CitzdGF0aWMgaW50IGFzbjFfYmlvX3JlYWQoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgYXNuMV9iaW9fcHV0cyhCSU8gKmgsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IGFzbjFfYmlvX2dldHMoQklPICpoLCBjaGFyICpzdHIsIGludCBzaXplKTsKK3N0YXRpYyBsb25nIGFzbjFfYmlvX2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBhc24xX2Jpb19uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgYXNuMV9iaW9fZnJlZShCSU8gKmRhdGEpOworc3RhdGljIGxvbmcgYXNuMV9iaW9fY2FsbGJhY2tfY3RybChCSU8gKmgsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCk7CisKK3N0YXRpYyBpbnQgYXNuMV9iaW9faW5pdChCSU9fQVNOMV9CVUZfQ1RYICpjdHgsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgYXNuMV9iaW9fZmx1c2hfZXgoQklPICpiLCBCSU9fQVNOMV9CVUZfQ1RYICpjdHgsCisJCQkJYXNuMV9wc19mdW5jICpjbGVhbnVwLCBhc24xX2Jpb19zdGF0ZV90IG5leHQpOworc3RhdGljIGludCBhc24xX2Jpb19zZXR1cF9leChCSU8gKmIsIEJJT19BU04xX0JVRl9DVFggKmN0eCwKKwkJCQlhc24xX3BzX2Z1bmMgKnNldHVwLCAKKwkJCQlhc24xX2Jpb19zdGF0ZV90IGV4X3N0YXRlLAorCQkJCWFzbjFfYmlvX3N0YXRlX3Qgb3RoZXJfc3RhdGUpOworCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX2FzbjE9CisJeworCUJJT19UWVBFX0FTTjEsCisJImFzbjEiLAorCWFzbjFfYmlvX3dyaXRlLAorCWFzbjFfYmlvX3JlYWQsCisJYXNuMV9iaW9fcHV0cywKKwlhc24xX2Jpb19nZXRzLAorCWFzbjFfYmlvX2N0cmwsCisJYXNuMV9iaW9fbmV3LAorCWFzbjFfYmlvX2ZyZWUsCisJYXNuMV9iaW9fY2FsbGJhY2tfY3RybCwKKwl9OworCitCSU9fTUVUSE9EICpCSU9fZl9hc24xKHZvaWQpCisJeworCXJldHVybigmbWV0aG9kc19hc24xKTsKKwl9CisKKworc3RhdGljIGludCBhc24xX2Jpb19uZXcoQklPICpiKQorCXsKKwlCSU9fQVNOMV9CVUZfQ1RYICpjdHg7CisJY3R4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJJT19BU04xX0JVRl9DVFgpKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIDA7CisJaWYgKCFhc24xX2Jpb19pbml0KGN0eCwgREVGQVVMVF9BU04xX0JVRl9TSVpFKSkKKwkJcmV0dXJuIDA7CisJYi0+aW5pdCA9IDE7CisJYi0+cHRyID0gKGNoYXIgKiljdHg7CisJYi0+ZmxhZ3MgPSAwOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBhc24xX2Jpb19pbml0KEJJT19BU04xX0JVRl9DVFggKmN0eCwgaW50IHNpemUpCisJeworCWN0eC0+YnVmID0gT1BFTlNTTF9tYWxsb2Moc2l6ZSk7CisJaWYgKCFjdHgtPmJ1ZikKKwkJcmV0dXJuIDA7CisJY3R4LT5idWZzaXplID0gc2l6ZTsKKwljdHgtPmJ1ZnBvcyA9IDA7CisJY3R4LT5idWZsZW4gPSAwOworCWN0eC0+Y29weWxlbiA9IDA7CisJY3R4LT5hc24xX2NsYXNzID0gVl9BU04xX1VOSVZFUlNBTDsKKwljdHgtPmFzbjFfdGFnID0gVl9BU04xX09DVEVUX1NUUklORzsKKwljdHgtPmV4X2J1ZiA9IDA7CisJY3R4LT5leF9wb3MgPSAwOworCWN0eC0+ZXhfbGVuID0gMDsKKwljdHgtPnN0YXRlID0gQVNOMV9TVEFURV9TVEFSVDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fZnJlZShCSU8gKmIpCisJeworCUJJT19BU04xX0JVRl9DVFggKmN0eDsKKwljdHggPSAoQklPX0FTTjFfQlVGX0NUWCAqKSBiLT5wdHI7CisJaWYgKGN0eCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoY3R4LT5idWYpCisJCU9QRU5TU0xfZnJlZShjdHgtPmJ1Zik7CisJT1BFTlNTTF9mcmVlKGN0eCk7CisJYi0+aW5pdCA9IDA7CisJYi0+cHRyID0gTlVMTDsKKwliLT5mbGFncyA9IDA7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGFzbjFfYmlvX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4gLCBpbnQgaW5sKQorCXsKKwlCSU9fQVNOMV9CVUZfQ1RYICpjdHg7CisJaW50IHdybWF4LCB3cmxlbiwgcmV0OworCXVuc2lnbmVkIGNoYXIgKnA7CisJaWYgKCFpbiB8fCAoaW5sIDwgMCkgfHwgKGItPm5leHRfYmlvID09IE5VTEwpKQorCQlyZXR1cm4gMDsKKwljdHggPSAoQklPX0FTTjFfQlVGX0NUWCAqKSBiLT5wdHI7CisJaWYgKGN0eCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXdybGVuID0gMDsKKwlyZXQgPSAtMTsKKworCWZvcig7OykKKwkJeworCQlzd2l0Y2ggKGN0eC0+c3RhdGUpCisJCQl7CisKKwkJCS8qIFNldHVwIHByZWZpeCBkYXRhLCBjYWxsIGl0ICovCisJCQljYXNlIEFTTjFfU1RBVEVfU1RBUlQ6CisJCQlpZiAoIWFzbjFfYmlvX3NldHVwX2V4KGIsIGN0eCwgY3R4LT5wcmVmaXgsCisJCQkJQVNOMV9TVEFURV9QUkVfQ09QWSwgQVNOMV9TVEFURV9IRUFERVIpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisKKwkJCS8qIENvcHkgYW55IHByZSBkYXRhIGZpcnN0ICovCisJCQljYXNlIEFTTjFfU1RBVEVfUFJFX0NPUFk6CisKKwkJCXJldCA9IGFzbjFfYmlvX2ZsdXNoX2V4KGIsIGN0eCwgY3R4LT5wcmVmaXhfZnJlZSwKKwkJCQkJCQlBU04xX1NUQVRFX0hFQURFUik7CisKKwkJCWlmIChyZXQgPD0gMCkKKwkJCQlnb3RvIGRvbmU7CisKKwkJCWJyZWFrOworCisJCQljYXNlIEFTTjFfU1RBVEVfSEVBREVSOgorCQkJY3R4LT5idWZsZW4gPQorCQkJCUFTTjFfb2JqZWN0X3NpemUoMCwgaW5sLCBjdHgtPmFzbjFfdGFnKSAtIGlubDsKKwkJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+YnVmbGVuIDw9IGN0eC0+YnVmc2l6ZSk7CisJCQlwID0gY3R4LT5idWY7CisJCQlBU04xX3B1dF9vYmplY3QoJnAsIDAsIGlubCwKKwkJCQkJY3R4LT5hc24xX3RhZywgY3R4LT5hc24xX2NsYXNzKTsKKwkJCWN0eC0+Y29weWxlbiA9IGlubDsKKwkJCWN0eC0+c3RhdGUgPSBBU04xX1NUQVRFX0hFQURFUl9DT1BZOworCisJCQlicmVhazsKKworCQkJY2FzZSBBU04xX1NUQVRFX0hFQURFUl9DT1BZOgkKKwkJCXJldCA9IEJJT193cml0ZShiLT5uZXh0X2JpbywKKwkJCQkJY3R4LT5idWYgKyBjdHgtPmJ1ZnBvcywgY3R4LT5idWZsZW4pOworCQkJaWYgKHJldCA8PSAwKQorCQkJCWdvdG8gZG9uZTsKKworCQkJY3R4LT5idWZsZW4gLT0gcmV0OworCQkJaWYgKGN0eC0+YnVmbGVuKQorCQkJCWN0eC0+YnVmcG9zICs9IHJldDsKKwkJCWVsc2UKKwkJCQl7CisJCQkJY3R4LT5idWZwb3MgPSAwOworCQkJCWN0eC0+c3RhdGUgPSBBU04xX1NUQVRFX0RBVEFfQ09QWTsKKwkJCQl9CisKKwkJCWJyZWFrOworCisJCQljYXNlIEFTTjFfU1RBVEVfREFUQV9DT1BZOgorCisJCQlpZiAoaW5sID4gY3R4LT5jb3B5bGVuKQorCQkJCXdybWF4ID0gY3R4LT5jb3B5bGVuOworCQkJZWxzZQorCQkJCXdybWF4ID0gaW5sOworCQkJcmV0ID0gQklPX3dyaXRlKGItPm5leHRfYmlvLCBpbiwgd3JtYXgpOworCQkJaWYgKHJldCA8PSAwKQorCQkJCWJyZWFrOworCQkJd3JsZW4gKz0gcmV0OworCQkJY3R4LT5jb3B5bGVuIC09IHJldDsKKwkJCWluICs9IHJldDsKKwkJCWlubCAtPSByZXQ7CisKKwkJCWlmIChjdHgtPmNvcHlsZW4gPT0gMCkKKwkJCQljdHgtPnN0YXRlID0gQVNOMV9TVEFURV9IRUFERVI7CisKKwkJCWlmIChpbmwgPT0gMCkKKwkJCQlnb3RvIGRvbmU7CisKKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCQkJcmV0dXJuIDA7CisKKwkJCX0KKworCQl9CisKKwlkb25lOgorCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCisJcmV0dXJuICh3cmxlbiA+IDApID8gd3JsZW4gOiByZXQ7CisKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fZmx1c2hfZXgoQklPICpiLCBCSU9fQVNOMV9CVUZfQ1RYICpjdHgsCisJCQkJYXNuMV9wc19mdW5jICpjbGVhbnVwLCBhc24xX2Jpb19zdGF0ZV90IG5leHQpCisJeworCWludCByZXQ7CisJaWYgKGN0eC0+ZXhfbGVuIDw9IDApCisJCXJldHVybiAxOworCWZvcig7OykKKwkJeworCQlyZXQgPSBCSU9fd3JpdGUoYi0+bmV4dF9iaW8sIGN0eC0+ZXhfYnVmICsgY3R4LT5leF9wb3MsCisJCQkJCQkJCWN0eC0+ZXhfbGVuKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJYnJlYWs7CisJCWN0eC0+ZXhfbGVuIC09IHJldDsKKwkJaWYgKGN0eC0+ZXhfbGVuID4gMCkKKwkJCWN0eC0+ZXhfcG9zICs9IHJldDsKKwkJZWxzZQorCQkJeworCQkJaWYoY2xlYW51cCkKKwkJCQljbGVhbnVwKGIsICZjdHgtPmV4X2J1ZiwgJmN0eC0+ZXhfbGVuLAorCQkJCQkJCQkmY3R4LT5leF9hcmcpOworCQkJY3R4LT5zdGF0ZSA9IG5leHQ7CisJCQljdHgtPmV4X3BvcyA9IDA7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGFzbjFfYmlvX3NldHVwX2V4KEJJTyAqYiwgQklPX0FTTjFfQlVGX0NUWCAqY3R4LAorCQkJCWFzbjFfcHNfZnVuYyAqc2V0dXAsIAorCQkJCWFzbjFfYmlvX3N0YXRlX3QgZXhfc3RhdGUsCisJCQkJYXNuMV9iaW9fc3RhdGVfdCBvdGhlcl9zdGF0ZSkKKwl7CisJaWYgKHNldHVwICYmICFzZXR1cChiLCAmY3R4LT5leF9idWYsICZjdHgtPmV4X2xlbiwgJmN0eC0+ZXhfYXJnKSkKKwkJeworCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCXJldHVybiAwOworCQl9CisJaWYgKGN0eC0+ZXhfbGVuID4gMCkKKwkJY3R4LT5zdGF0ZSA9IGV4X3N0YXRlOworCWVsc2UKKwkJY3R4LT5zdGF0ZSA9IG90aGVyX3N0YXRlOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBhc24xX2Jpb19yZWFkKEJJTyAqYiwgY2hhciAqaW4gLCBpbnQgaW5sKQorCXsKKwlpZiAoIWItPm5leHRfYmlvKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gQklPX3JlYWQoYi0+bmV4dF9iaW8sIGluICwgaW5sKTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9iaW9fcHV0cyhCSU8gKmIsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJcmV0dXJuIGFzbjFfYmlvX3dyaXRlKGIsIHN0ciwgc3RybGVuKHN0cikpOworCX0KKworc3RhdGljIGludCBhc24xX2Jpb19nZXRzKEJJTyAqYiwgY2hhciAqc3RyLCBpbnQgc2l6ZSkKKwl7CisJaWYgKCFiLT5uZXh0X2JpbykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIEJJT19nZXRzKGItPm5leHRfYmlvLCBzdHIgLCBzaXplKTsKKwl9CisKK3N0YXRpYyBsb25nIGFzbjFfYmlvX2NhbGxiYWNrX2N0cmwoQklPICpiLCBpbnQgY21kLCBiaW9faW5mb19jYiAqZnApCisJeworCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJcmV0dXJuIEJJT19jYWxsYmFja19jdHJsKGItPm5leHRfYmlvLGNtZCxmcCk7CisJfQorCitzdGF0aWMgbG9uZyBhc24xX2Jpb19jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKQorCXsKKwlCSU9fQVNOMV9CVUZfQ1RYICpjdHg7CisJQklPX0FTTjFfRVhfRlVOQ1MgKmV4X2Z1bmM7CisJbG9uZyByZXQgPSAxOworCWN0eCA9IChCSU9fQVNOMV9CVUZfQ1RYICopIGItPnB0cjsKKwlpZiAoY3R4ID09IE5VTEwpCisJCXJldHVybiAwOworCXN3aXRjaChjbWQpCisJCXsKKworCQljYXNlIEJJT19DX1NFVF9QUkVGSVg6CisJCWV4X2Z1bmMgPSBhcmcyOworCQljdHgtPnByZWZpeCAgPSBleF9mdW5jLT5leF9mdW5jOworCQljdHgtPnByZWZpeF9mcmVlICA9IGV4X2Z1bmMtPmV4X2ZyZWVfZnVuYzsKKwkJYnJlYWs7CisKKwkJY2FzZSBCSU9fQ19HRVRfUFJFRklYOgorCQlleF9mdW5jID0gYXJnMjsKKwkJZXhfZnVuYy0+ZXhfZnVuYyA9IGN0eC0+cHJlZml4OworCQlleF9mdW5jLT5leF9mcmVlX2Z1bmMgPSBjdHgtPnByZWZpeF9mcmVlOworCQlicmVhazsKKworCQljYXNlIEJJT19DX1NFVF9TVUZGSVg6CisJCWV4X2Z1bmMgPSBhcmcyOworCQljdHgtPnN1ZmZpeCAgPSBleF9mdW5jLT5leF9mdW5jOworCQljdHgtPnN1ZmZpeF9mcmVlICA9IGV4X2Z1bmMtPmV4X2ZyZWVfZnVuYzsKKwkJYnJlYWs7CisKKwkJY2FzZSBCSU9fQ19HRVRfU1VGRklYOgorCQlleF9mdW5jID0gYXJnMjsKKwkJZXhfZnVuYy0+ZXhfZnVuYyA9IGN0eC0+c3VmZml4OworCQlleF9mdW5jLT5leF9mcmVlX2Z1bmMgPSBjdHgtPnN1ZmZpeF9mcmVlOworCQlicmVhazsKKworCQljYXNlIEJJT19DX1NFVF9FWF9BUkc6CisJCWN0eC0+ZXhfYXJnID0gYXJnMjsKKwkJYnJlYWs7CisKKwkJY2FzZSBCSU9fQ19HRVRfRVhfQVJHOgorCQkqKHZvaWQgKiopYXJnMiA9IGN0eC0+ZXhfYXJnOworCQlicmVhazsKKworCQljYXNlIEJJT19DVFJMX0ZMVVNIOgorCQlpZiAoIWItPm5leHRfYmlvKQorCQkJcmV0dXJuIDA7CisKKwkJLyogQ2FsbCBwb3N0IGZ1bmN0aW9uIGlmIHBvc3NpYmxlICovCisJCWlmIChjdHgtPnN0YXRlID09IEFTTjFfU1RBVEVfSEVBREVSKQorCQkJeworCQkJaWYgKCFhc24xX2Jpb19zZXR1cF9leChiLCBjdHgsIGN0eC0+c3VmZml4LAorCQkJCUFTTjFfU1RBVEVfUE9TVF9DT1BZLCBBU04xX1NUQVRFX0RPTkUpKQorCQkJCXJldHVybiAwOworCQkJfQorCisJCWlmIChjdHgtPnN0YXRlID09IEFTTjFfU1RBVEVfUE9TVF9DT1BZKQorCQkJeworCQkJcmV0ID0gYXNuMV9iaW9fZmx1c2hfZXgoYiwgY3R4LCBjdHgtPnN1ZmZpeF9mcmVlLAorCQkJCQkJCUFTTjFfU1RBVEVfRE9ORSk7CisJCQlpZiAocmV0IDw9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQlpZiAoY3R4LT5zdGF0ZSA9PSBBU04xX1NUQVRFX0RPTkUpCisJCQlyZXR1cm4gQklPX2N0cmwoYi0+bmV4dF9iaW8sIGNtZCwgYXJnMSwgYXJnMik7CisJCWVsc2UKKwkJCXsKKwkJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlicmVhazsKKworCisJCWRlZmF1bHQ6CisJCWlmICghYi0+bmV4dF9iaW8pCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIEJJT19jdHJsKGItPm5leHRfYmlvLCBjbWQsIGFyZzEsIGFyZzIpOworCisJCX0KKworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGFzbjFfYmlvX3NldF9leChCSU8gKmIsIGludCBjbWQsCisJCWFzbjFfcHNfZnVuYyAqZXhfZnVuYywgYXNuMV9wc19mdW5jICpleF9mcmVlX2Z1bmMpCisJeworCUJJT19BU04xX0VYX0ZVTkNTIGV4dG1wOworCWV4dG1wLmV4X2Z1bmMgPSBleF9mdW5jOworCWV4dG1wLmV4X2ZyZWVfZnVuYyA9IGV4X2ZyZWVfZnVuYzsKKwlyZXR1cm4gQklPX2N0cmwoYiwgY21kLCAwLCAmZXh0bXApOworCX0KKworc3RhdGljIGludCBhc24xX2Jpb19nZXRfZXgoQklPICpiLCBpbnQgY21kLAorCQlhc24xX3BzX2Z1bmMgKipleF9mdW5jLCBhc24xX3BzX2Z1bmMgKipleF9mcmVlX2Z1bmMpCisJeworCUJJT19BU04xX0VYX0ZVTkNTIGV4dG1wOworCWludCByZXQ7CisJcmV0ID0gQklPX2N0cmwoYiwgY21kLCAwLCAmZXh0bXApOworCWlmIChyZXQgPiAwKQorCQl7CisJCSpleF9mdW5jID0gZXh0bXAuZXhfZnVuYzsKKwkJKmV4X2ZyZWVfZnVuYyA9IGV4dG1wLmV4X2ZyZWVfZnVuYzsKKwkJfQorCXJldHVybiByZXQ7CisJfQorCitpbnQgQklPX2FzbjFfc2V0X3ByZWZpeChCSU8gKmIsIGFzbjFfcHNfZnVuYyAqcHJlZml4LCBhc24xX3BzX2Z1bmMgKnByZWZpeF9mcmVlKQorCXsKKwlyZXR1cm4gYXNuMV9iaW9fc2V0X2V4KGIsIEJJT19DX1NFVF9QUkVGSVgsIHByZWZpeCwgcHJlZml4X2ZyZWUpOworCX0KKworaW50IEJJT19hc24xX2dldF9wcmVmaXgoQklPICpiLCBhc24xX3BzX2Z1bmMgKipwcHJlZml4LCBhc24xX3BzX2Z1bmMgKipwcHJlZml4X2ZyZWUpCisJeworCXJldHVybiBhc24xX2Jpb19nZXRfZXgoYiwgQklPX0NfR0VUX1BSRUZJWCwgcHByZWZpeCwgcHByZWZpeF9mcmVlKTsKKwl9CisKK2ludCBCSU9fYXNuMV9zZXRfc3VmZml4KEJJTyAqYiwgYXNuMV9wc19mdW5jICpzdWZmaXgsIGFzbjFfcHNfZnVuYyAqc3VmZml4X2ZyZWUpCisJeworCXJldHVybiBhc24xX2Jpb19zZXRfZXgoYiwgQklPX0NfU0VUX1NVRkZJWCwgc3VmZml4LCBzdWZmaXhfZnJlZSk7CisJfQorCitpbnQgQklPX2FzbjFfZ2V0X3N1ZmZpeChCSU8gKmIsIGFzbjFfcHNfZnVuYyAqKnBzdWZmaXgsIGFzbjFfcHNfZnVuYyAqKnBzdWZmaXhfZnJlZSkKKwl7CisJcmV0dXJuIGFzbjFfYmlvX2dldF9leChiLCBCSU9fQ19HRVRfU1VGRklYLCBwc3VmZml4LCBwc3VmZml4X2ZyZWUpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2Jpb19uZGVmLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9iaW9fbmRlZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDM4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9iaW9fbmRlZi5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKiBiaW9fbmRlZi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaWZuZGVmIE9QRU5TU0xfU1lTTkFNRV9ORVRXQVJFCisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBFeHBlcmltZW50YWwgTkRFRiBBU04xIEJJTyBzdXBwb3J0IHJvdXRpbmVzICovCisKKy8qIFRoZSB1c2FnZSBpcyBxdWl0ZSBzaW1wbGUsIGluaXRpYWxpemUgYW4gQVNOMSBzdHJ1Y3R1cmUsCisgKiBnZXQgYSBCSU8gZnJvbSBpdCB0aGVuIGFueSBkYXRhIHdyaXR0ZW4gdGhyb3VnaCB0aGUgQklPCisgKiB3aWxsIGVuZCB1cCB0cmFuc2xhdGVkIHRvIGFwcHJvcHRpYXRlIGZvcm1hdCBvbiB0aGUgZmx5LgorICogVGhlIGRhdGEgaXMgc3RyZWFtZWQgb3V0IGFuZCBkb2VzICpub3QqIG5lZWQgdG8gYmUKKyAqIGFsbCBoZWxkIGluIG1lbW9yeSBhdCBvbmNlLgorICoKKyAqIFdoZW4gdGhlIEJJTyBpcyBmbHVzaGVkIHRoZSBvdXRwdXQgaXMgZmluYWxpemVkIGFuZCBhbnkKKyAqIHNpZ25hdHVyZXMgZXRjIHdyaXR0ZW4gb3V0LgorICoKKyAqIFRoZSBCSU8gaXMgYSAncHJvcGVyJyBCSU8gYW5kIGNhbiBoYW5kbGUgbm9uIGJsb2NraW5nIEkvTworICogY29ycmVjdGx5LgorICoKKyAqIFRoZSB1c2FnZSBpcyBzaW1wbGUuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyAqbm90Ki4uLgorICovCisKKy8qIEJJTyBzdXBwb3J0IGRhdGEgc3RvcmVkIGluIHRoZSBBU04xIEJJTyBleF9hcmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbmRlZl9hdXhfc3QKKwl7CisJLyogQVNOMSBzdHJ1Y3R1cmUgdGhpcyBCSU8gcmVmZXJzIHRvICovCisJQVNOMV9WQUxVRSAqdmFsOworCWNvbnN0IEFTTjFfSVRFTSAqaXQ7CisJLyogVG9wIG9mIHRoZSBCSU8gY2hhaW4gKi8KKwlCSU8gKm5kZWZfYmlvOworCS8qIE91dHB1dCBCSU8gKi8KKwlCSU8gKm91dDsKKwkvKiBCb3VuZGFyeSB3aGVyZSBjb250ZW50IGlzIGluc2VydGVkICovCisJdW5zaWduZWQgY2hhciAqKmJvdW5kYXJ5OworCS8qIERFUiBidWZmZXIgc3RhcnQgKi8KKwl1bnNpZ25lZCBjaGFyICpkZXJidWY7CisJfSBOREVGX1NVUFBPUlQ7CisKK3N0YXRpYyBpbnQgbmRlZl9wcmVmaXgoQklPICpiLCB1bnNpZ25lZCBjaGFyICoqcGJ1ZiwgaW50ICpwbGVuLCB2b2lkICpwYXJnKTsKK3N0YXRpYyBpbnQgbmRlZl9wcmVmaXhfZnJlZShCSU8gKmIsIHVuc2lnbmVkIGNoYXIgKipwYnVmLCBpbnQgKnBsZW4sIHZvaWQgKnBhcmcpOworc3RhdGljIGludCBuZGVmX3N1ZmZpeChCSU8gKmIsIHVuc2lnbmVkIGNoYXIgKipwYnVmLCBpbnQgKnBsZW4sIHZvaWQgKnBhcmcpOworc3RhdGljIGludCBuZGVmX3N1ZmZpeF9mcmVlKEJJTyAqYiwgdW5zaWduZWQgY2hhciAqKnBidWYsIGludCAqcGxlbiwgdm9pZCAqcGFyZyk7CisKK0JJTyAqQklPX25ld19OREVGKEJJTyAqb3V0LCBBU04xX1ZBTFVFICp2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCU5ERUZfU1VQUE9SVCAqbmRlZl9hdXggPSBOVUxMOworCUJJTyAqYXNuX2JpbyA9IE5VTEw7CisJY29uc3QgQVNOMV9BVVggKmF1eCA9IGl0LT5mdW5jczsKKwlBU04xX1NUUkVBTV9BUkcgc2FyZzsKKworCWlmICghYXV4IHx8ICFhdXgtPmFzbjFfY2IpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfQklPX05FV19OREVGLCBBU04xX1JfU1RSRUFNSU5HX05PVF9TVVBQT1JURUQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCW5kZWZfYXV4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKE5ERUZfU1VQUE9SVCkpOworCWFzbl9iaW8gPSBCSU9fbmV3KEJJT19mX2FzbjEoKSk7CisKKwkvKiBBU04xIGJpbyBuZWVkcyB0byBiZSBuZXh0IHRvIG91dHB1dCBCSU8gKi8KKworCW91dCA9IEJJT19wdXNoKGFzbl9iaW8sIG91dCk7CisKKwlpZiAoIW5kZWZfYXV4IHx8ICFhc25fYmlvIHx8ICFvdXQpCisJCWdvdG8gZXJyOworCisJQklPX2FzbjFfc2V0X3ByZWZpeChhc25fYmlvLCBuZGVmX3ByZWZpeCwgbmRlZl9wcmVmaXhfZnJlZSk7CisJQklPX2FzbjFfc2V0X3N1ZmZpeChhc25fYmlvLCBuZGVmX3N1ZmZpeCwgbmRlZl9zdWZmaXhfZnJlZSk7CisKKwkvKiBOb3cgbGV0IGNhbGxiYWNrIHByZXBlbmQgYW55IGRpZ2VzdCwgY2lwaGVyIGV0YyBCSU9zCisJICogQVNOMSBzdHJ1Y3R1cmUgbmVlZHMuCisJICovCisKKwlzYXJnLm91dCA9IG91dDsKKwlzYXJnLm5kZWZfYmlvID0gTlVMTDsKKwlzYXJnLmJvdW5kYXJ5ID0gTlVMTDsKKworCWlmIChhdXgtPmFzbjFfY2IoQVNOMV9PUF9TVFJFQU1fUFJFLCAmdmFsLCBpdCwgJnNhcmcpIDw9IDApCisJCWdvdG8gZXJyOworCisJbmRlZl9hdXgtPnZhbCA9IHZhbDsKKwluZGVmX2F1eC0+aXQgPSBpdDsKKwluZGVmX2F1eC0+bmRlZl9iaW8gPSBzYXJnLm5kZWZfYmlvOworCW5kZWZfYXV4LT5ib3VuZGFyeSA9IHNhcmcuYm91bmRhcnk7CisJbmRlZl9hdXgtPm91dCA9IG91dDsKKworCUJJT19jdHJsKGFzbl9iaW8sIEJJT19DX1NFVF9FWF9BUkcsIDAsIG5kZWZfYXV4KTsKKworCXJldHVybiBzYXJnLm5kZWZfYmlvOworCisJZXJyOgorCWlmIChhc25fYmlvKQorCQlCSU9fZnJlZShhc25fYmlvKTsKKwlpZiAobmRlZl9hdXgpCisJCU9QRU5TU0xfZnJlZShuZGVmX2F1eCk7CisJcmV0dXJuIE5VTEw7CisJfQorCitzdGF0aWMgaW50IG5kZWZfcHJlZml4KEJJTyAqYiwgdW5zaWduZWQgY2hhciAqKnBidWYsIGludCAqcGxlbiwgdm9pZCAqcGFyZykKKwl7CisJTkRFRl9TVVBQT1JUICpuZGVmX2F1eDsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBkZXJsZW47CisKKwlpZiAoIXBhcmcpCisJCXJldHVybiAwOworCisJbmRlZl9hdXggPSAqKE5ERUZfU1VQUE9SVCAqKilwYXJnOworCisJZGVybGVuID0gQVNOMV9pdGVtX25kZWZfaTJkKG5kZWZfYXV4LT52YWwsIE5VTEwsIG5kZWZfYXV4LT5pdCk7CisJcCA9IE9QRU5TU0xfbWFsbG9jKGRlcmxlbik7CisJbmRlZl9hdXgtPmRlcmJ1ZiA9IHA7CisJKnBidWYgPSBwOworCWRlcmxlbiA9IEFTTjFfaXRlbV9uZGVmX2kyZChuZGVmX2F1eC0+dmFsLCAmcCwgbmRlZl9hdXgtPml0KTsKKworCWlmICghKm5kZWZfYXV4LT5ib3VuZGFyeSkKKwkJcmV0dXJuIDA7CisKKwkqcGxlbiA9ICpuZGVmX2F1eC0+Ym91bmRhcnkgLSAqcGJ1ZjsKKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBuZGVmX3ByZWZpeF9mcmVlKEJJTyAqYiwgdW5zaWduZWQgY2hhciAqKnBidWYsIGludCAqcGxlbiwgdm9pZCAqcGFyZykKKwl7CisJTkRFRl9TVVBQT1JUICpuZGVmX2F1eDsKKworCWlmICghcGFyZykKKwkJcmV0dXJuIDA7CisKKwluZGVmX2F1eCA9ICooTkRFRl9TVVBQT1JUICoqKXBhcmc7CisKKwlpZiAobmRlZl9hdXgtPmRlcmJ1ZikKKwkJT1BFTlNTTF9mcmVlKG5kZWZfYXV4LT5kZXJidWYpOworCisJbmRlZl9hdXgtPmRlcmJ1ZiA9IE5VTEw7CisJKnBidWYgPSBOVUxMOworCSpwbGVuID0gMDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgbmRlZl9zdWZmaXhfZnJlZShCSU8gKmIsIHVuc2lnbmVkIGNoYXIgKipwYnVmLCBpbnQgKnBsZW4sIHZvaWQgKnBhcmcpCisJeworCU5ERUZfU1VQUE9SVCAqKnBuZGVmX2F1eCA9IChOREVGX1NVUFBPUlQgKiopcGFyZzsKKwlpZiAoIW5kZWZfcHJlZml4X2ZyZWUoYiwgcGJ1ZiwgcGxlbiwgcGFyZykpCisJCXJldHVybiAwOworCU9QRU5TU0xfZnJlZSgqcG5kZWZfYXV4KTsKKwkqcG5kZWZfYXV4ID0gTlVMTDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgbmRlZl9zdWZmaXgoQklPICpiLCB1bnNpZ25lZCBjaGFyICoqcGJ1ZiwgaW50ICpwbGVuLCB2b2lkICpwYXJnKQorCXsKKwlOREVGX1NVUFBPUlQgKm5kZWZfYXV4OworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGRlcmxlbjsKKwljb25zdCBBU04xX0FVWCAqYXV4OworCUFTTjFfU1RSRUFNX0FSRyBzYXJnOworCisJaWYgKCFwYXJnKQorCQlyZXR1cm4gMDsKKworCW5kZWZfYXV4ID0gKihOREVGX1NVUFBPUlQgKiopcGFyZzsKKworCWF1eCA9IG5kZWZfYXV4LT5pdC0+ZnVuY3M7CisKKwkvKiBGaW5hbGl6ZSBzdHJ1Y3R1cmVzICovCisJc2FyZy5uZGVmX2JpbyA9IG5kZWZfYXV4LT5uZGVmX2JpbzsKKwlzYXJnLm91dCA9IG5kZWZfYXV4LT5vdXQ7CisJc2FyZy5ib3VuZGFyeSA9IG5kZWZfYXV4LT5ib3VuZGFyeTsKKwlpZiAoYXV4LT5hc24xX2NiKEFTTjFfT1BfU1RSRUFNX1BPU1QsCisJCQkJJm5kZWZfYXV4LT52YWwsIG5kZWZfYXV4LT5pdCwgJnNhcmcpIDw9IDApCisJCXJldHVybiAwOworCisJZGVybGVuID0gQVNOMV9pdGVtX25kZWZfaTJkKG5kZWZfYXV4LT52YWwsIE5VTEwsIG5kZWZfYXV4LT5pdCk7CisJcCA9IE9QRU5TU0xfbWFsbG9jKGRlcmxlbik7CisJbmRlZl9hdXgtPmRlcmJ1ZiA9IHA7CisJKnBidWYgPSBwOworCWRlcmxlbiA9IEFTTjFfaXRlbV9uZGVmX2kyZChuZGVmX2F1eC0+dmFsLCAmcCwgbmRlZl9hdXgtPml0KTsKKworCWlmICghKm5kZWZfYXV4LT5ib3VuZGFyeSkKKwkJcmV0dXJuIDA7CisJKnBidWYgPSAqbmRlZl9hdXgtPmJvdW5kYXJ5OworCSpwbGVuID0gZGVybGVuIC0gKCpuZGVmX2F1eC0+Ym91bmRhcnkgLSBuZGVmX2F1eC0+ZGVyYnVmKTsKKworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2NoYXJtYXAuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2NoYXJtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVlNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvY2hhcm1hcC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qIEF1dG8gZ2VuZXJhdGVkIHdpdGggY2hhcnR5cGUucGwgc2NyaXB0LgorICogTWFzayBvZiB2YXJpb3VzIGNoYXJhY3RlciBwcm9wZXJ0aWVzCisgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgY2hhcl90eXBlW10gPSB7CisgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorMTIwLCAwLCAxLDQwLCAwLCAwLCAwLDE2LDE2LDE2LCAwLDI1LDI1LDE2LDE2LDE2LAorMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsIDksIDksMTYsIDksMTYsCisgMCwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwKKzE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LDE2LCAwLCAxLCAwLCAwLCAwLAorIDAsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsMTYsCisxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwxNiwgMCwgMCwgMCwgMCwgMgorfTsKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvY2hhcm1hcC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2NoYXJtYXAucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3NWM1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2NoYXJtYXAucGwKQEAgLTAsMCArMSw4MCBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsIC13CisKK3VzZSBzdHJpY3Q7CisKK215ICgkaSwgQGFycik7CisKKyMgU2V0IHVwIGFuIGFycmF5IHdpdGggdGhlIHR5cGUgb2YgQVNDSUkgY2hhcmFjdGVycworIyBFYWNoIHNldCBiaXQgcmVwcmVzZW50cyBhIGNoYXJhY3RlciBwcm9wZXJ0eS4KKworIyBSRkMyMjUzIGNoYXJhY3RlciBwcm9wZXJ0aWVzCitteSAkUkZDMjI1M19FU0MgPSAxOwkjIENoYXJhY3RlciBlc2NhcGVkIHdpdGggXAorbXkgJEVTQ19DVFJMCT0gMjsJIyBFc2NhcGVkIGNvbnRyb2wgY2hhcmFjdGVyCisjIFRoZXNlIGFyZSB1c2VkIHdpdGggUkZDMTc3OSBxdW90aW5nIHVzaW5nICIKK215ICROT0VTQ19RVU9URQk9IDg7CSMgTm90IGVzY2FwZWQgaWYgcXVvdGVkCitteSAkUFNUUklOR19DSEFSID0gMHgxMDsJIyBWYWxpZCBQcmludGFibGVTdHJpbmcgY2hhcmFjdGVyCitteSAkUkZDMjI1M19GSVJTVF9FU0MgPSAweDIwOyAjIEVzY2FwZWQgd2l0aCBcIGlmIGZpcnN0IGNoYXJhY3RlcgorbXkgJFJGQzIyNTNfTEFTVF9FU0MgPSAweDQwOyAgIyBFc2NhcGVkIHdpdGggXCBpZiBsYXN0IGNoYXJhY3RlcgorCitmb3IoJGkgPSAwOyAkaSA8IDEyODsgJGkrKykgeworCSMgU2V0IHRoZSBSRkMyMjUzIGVzY2FwZSBjaGFyYWN0ZXJzIChjb250cm9sKQorCSRhcnJbJGldID0gMDsKKwlpZigoJGkgPCAzMikgfHwgKCRpID4gMTI2KSkgeworCQkkYXJyWyRpXSB8PSAkRVNDX0NUUkw7CisJfQorCisJIyBTb21lIFByaW50YWJsZVN0cmluZyBjaGFyYWN0ZXJzCisJaWYoCQkgICAoICggJGkgPj0gb3JkKCJhIikpICYmICggJGkgPD0gb3JkKCJ6IikpICkKKwkJCXx8ICggICggJGkgPj0gb3JkKCJBIikpICYmICggJGkgPD0gb3JkKCJaIikpICkKKwkJCXx8ICggICggJGkgPj0gb3JkKCIwIikpICYmICggJGkgPD0gb3JkKCI5IikpICkgICkgeworCQkkYXJyWyRpXSB8PSAkUFNUUklOR19DSEFSOworCX0KK30KKworIyBOb3cgc2V0dXAgdGhlIHJlc3QKKworIyBSZW1haW5pbmcgUkZDMjI1MyBlc2NhcGVkIGNoYXJhY3RlcnMKKworJGFycltvcmQoIiAiKV0gfD0gJE5PRVNDX1FVT1RFIHwgJFJGQzIyNTNfRklSU1RfRVNDIHwgJFJGQzIyNTNfTEFTVF9FU0M7CiskYXJyW29yZCgiIyIpXSB8PSAkTk9FU0NfUVVPVEUgfCAkUkZDMjI1M19GSVJTVF9FU0M7CisKKyRhcnJbb3JkKCIsIildIHw9ICROT0VTQ19RVU9URSB8ICRSRkMyMjUzX0VTQzsKKyRhcnJbb3JkKCIrIildIHw9ICROT0VTQ19RVU9URSB8ICRSRkMyMjUzX0VTQzsKKyRhcnJbb3JkKCJcIiIpXSB8PSAkUkZDMjI1M19FU0M7CiskYXJyW29yZCgiXFwiKV0gfD0gJFJGQzIyNTNfRVNDOworJGFycltvcmQoIjwiKV0gfD0gJE5PRVNDX1FVT1RFIHwgJFJGQzIyNTNfRVNDOworJGFycltvcmQoIj4iKV0gfD0gJE5PRVNDX1FVT1RFIHwgJFJGQzIyNTNfRVNDOworJGFycltvcmQoIjsiKV0gfD0gJE5PRVNDX1FVT1RFIHwgJFJGQzIyNTNfRVNDOworCisjIFJlbWFpbmluZyBQcmludGFibGVTdHJpbmcgY2hhcmFjdGVycworCiskYXJyW29yZCgiICIpXSB8PSAkUFNUUklOR19DSEFSOworJGFycltvcmQoIiciKV0gfD0gJFBTVFJJTkdfQ0hBUjsKKyRhcnJbb3JkKCIoIildIHw9ICRQU1RSSU5HX0NIQVI7CiskYXJyW29yZCgiKSIpXSB8PSAkUFNUUklOR19DSEFSOworJGFycltvcmQoIisiKV0gfD0gJFBTVFJJTkdfQ0hBUjsKKyRhcnJbb3JkKCIsIildIHw9ICRQU1RSSU5HX0NIQVI7CiskYXJyW29yZCgiLSIpXSB8PSAkUFNUUklOR19DSEFSOworJGFycltvcmQoIi4iKV0gfD0gJFBTVFJJTkdfQ0hBUjsKKyRhcnJbb3JkKCIvIildIHw9ICRQU1RSSU5HX0NIQVI7CiskYXJyW29yZCgiOiIpXSB8PSAkUFNUUklOR19DSEFSOworJGFycltvcmQoIj0iKV0gfD0gJFBTVFJJTkdfQ0hBUjsKKyRhcnJbb3JkKCI/IildIHw9ICRQU1RSSU5HX0NIQVI7CisKKyMgTm93IGdlbmVyYXRlIHRoZSBDIGNvZGUKKworcHJpbnQgPDxFT0Y7CisvKiBBdXRvIGdlbmVyYXRlZCB3aXRoIGNoYXJ0eXBlLnBsIHNjcmlwdC4KKyAqIE1hc2sgb2YgdmFyaW91cyBjaGFyYWN0ZXIgcHJvcGVydGllcworICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJfdHlwZVtdID0geworRU9GCisKK2ZvcigkaSA9IDA7ICRpIDwgMTI4OyAkaSsrKSB7CisJcHJpbnQoIlxuIikgaWYoJGkgJiYgKCgkaSAlIDE2KSA9PSAwKSk7CisJcHJpbnRmKCIlMmQiLCAkYXJyWyRpXSk7CisJcHJpbnQoIiwiKSBpZiAoJGkgIT0gMTI3KTsKK30KK3ByaW50KCJcbn07XG5cbiIpOworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9kMmlfcHIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2QyaV9wci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Mjg5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9kMmlfcHIuYwpAQCAtMCwwICsxLDE3MCBAQAorLyogY3J5cHRvL2FzbjEvZDJpX3ByLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSAiYXNuMV9sb2NsLmgiCisKK0VWUF9QS0VZICpkMmlfUHJpdmF0ZUtleShpbnQgdHlwZSwgRVZQX1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCkKKwl7CisJRVZQX1BLRVkgKnJldDsKKworCWlmICgoYSA9PSBOVUxMKSB8fCAoKmEgPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9RVZQX1BLRVlfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9EMklfUFJJVkFURUtFWSxFUlJfUl9FVlBfTElCKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlyZXQ9ICphOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQlpZiAocmV0LT5lbmdpbmUpCisJCQl7CisJCQlFTkdJTkVfZmluaXNoKHJldC0+ZW5naW5lKTsKKwkJCXJldC0+ZW5naW5lID0gTlVMTDsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwlpZiAoIUVWUF9QS0VZX3NldF90eXBlKHJldCwgdHlwZSkpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfRDJJX1BSSVZBVEVLRVksQVNOMV9SX1VOS05PV05fUFVCTElDX0tFWV9UWVBFKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICghcmV0LT5hbWV0aC0+b2xkX3ByaXZfZGVjb2RlIHx8CisJCQkhcmV0LT5hbWV0aC0+b2xkX3ByaXZfZGVjb2RlKHJldCwgcHAsIGxlbmd0aCkpCisJCXsKKwkJaWYgKHJldC0+YW1ldGgtPnByaXZfZGVjb2RlKSAKKwkJCXsKKwkJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4PU5VTEw7CisJCQlwOD1kMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyhOVUxMLHBwLGxlbmd0aCk7CisJCQlpZiAoIXA4KSBnb3RvIGVycjsKKwkJCUVWUF9QS0VZX2ZyZWUocmV0KTsKKwkJCXJldCA9IEVWUF9QS0NTODJQS0VZKHA4KTsKKwkJCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOCk7CisKKwkJCX0gCisJCWVsc2UgCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9EMklfUFJJVkFURUtFWSxFUlJfUl9BU04xX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQkKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKSBFVlBfUEtFWV9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworLyogVGhpcyB3b3JrcyBsaWtlIGQyaV9Qcml2YXRlS2V5KCkgZXhjZXB0IGl0IGF1dG9tYXRpY2FsbHkgd29ya3Mgb3V0IHRoZSB0eXBlICovCisKK0VWUF9QS0VZICpkMmlfQXV0b1ByaXZhdGVLZXkoRVZQX1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCkKK3sKKwlTVEFDS19PRihBU04xX1RZUEUpICppbmtleTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCWludCBrZXl0eXBlOworCXAgPSAqcHA7CisJLyogRGlydHkgdHJpY2s6IHJlYWQgaW4gdGhlIEFTTjEgZGF0YSBpbnRvIGEgU1RBQ0tfT0YoQVNOMV9UWVBFKToKKwkgKiBieSBhbmFseXppbmcgaXQgd2UgY2FuIGRldGVybWluZSB0aGUgcGFzc2VkIHN0cnVjdHVyZTogdGhpcworCSAqIGFzc3VtZXMgdGhlIGlucHV0IGlzIHN1cnJvdW5kZWQgYnkgYW4gQVNOMSBTRVFVRU5DRS4KKwkgKi8KKwlpbmtleSA9IGQyaV9BU04xX1NFUVVFTkNFX0FOWShOVUxMLCAmcCwgbGVuZ3RoKTsKKwkvKiBTaW5jZSB3ZSBvbmx5IG5lZWQgdG8gZGlzY2VybiAidHJhZGl0aW9uYWwgZm9ybWF0IiBSU0EgYW5kIERTQQorCSAqIGtleXMgd2UgY2FuIGp1c3QgY291bnQgdGhlIGVsZW1lbnRzLgorICAgICAgICAgKi8KKwlpZihza19BU04xX1RZUEVfbnVtKGlua2V5KSA9PSA2KSAKKwkJa2V5dHlwZSA9IEVWUF9QS0VZX0RTQTsKKwllbHNlIGlmIChza19BU04xX1RZUEVfbnVtKGlua2V5KSA9PSA0KQorCQlrZXl0eXBlID0gRVZQX1BLRVlfRUM7CisJZWxzZSBpZiAoc2tfQVNOMV9UWVBFX251bShpbmtleSkgPT0gMykgIAorCQl7IC8qIFRoaXMgc2VlbXMgdG8gYmUgUEtDUzgsIG5vdCB0cmFkaXRpb25hbCBmb3JtYXQgKi8KKwkJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4ID0gZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk8oTlVMTCxwcCxsZW5ndGgpOworCQkJRVZQX1BLRVkgKnJldDsKKworCQkJc2tfQVNOMV9UWVBFX3BvcF9mcmVlKGlua2V5LCBBU04xX1RZUEVfZnJlZSk7CisJCQlpZiAoIXA4KSAKKwkJCQl7CisJCQkJQVNOMWVycihBU04xX0ZfRDJJX0FVVE9QUklWQVRFS0VZLEFTTjFfUl9VTlNVUFBPUlRFRF9QVUJMSUNfS0VZX1RZUEUpOworCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCXJldCA9IEVWUF9QS0NTODJQS0VZKHA4KTsKKwkJCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOCk7CisJCQlpZiAoYSkgeworCQkJCSphID0gcmV0OworCQkJfQkKKwkJCXJldHVybiByZXQ7CisJCX0KKwllbHNlIGtleXR5cGUgPSBFVlBfUEtFWV9SU0E7CisJc2tfQVNOMV9UWVBFX3BvcF9mcmVlKGlua2V5LCBBU04xX1RZUEVfZnJlZSk7CisJcmV0dXJuIGQyaV9Qcml2YXRlS2V5KGtleXR5cGUsIGEsIHBwLCBsZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvZDJpX3B1LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9kMmlfcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGYzOWNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvZDJpX3B1LmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIGNyeXB0by9hc24xL2QyaV9wdS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNlbmRpZgorCitFVlBfUEtFWSAqZDJpX1B1YmxpY0tleShpbnQgdHlwZSwgRVZQX1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCkKKwl7CisJRVZQX1BLRVkgKnJldDsKKworCWlmICgoYSA9PSBOVUxMKSB8fCAoKmEgPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9RVZQX1BLRVlfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9EMklfUFVCTElDS0VZLEVSUl9SX0VWUF9MSUIpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQl9CisJZWxzZQlyZXQ9ICphOworCisJaWYgKCFFVlBfUEtFWV9zZXRfdHlwZShyZXQsIHR5cGUpKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0QySV9QVUJMSUNLRVksRVJSX1JfRVZQX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisKKwlzd2l0Y2ggKEVWUF9QS0VZX2lkKHJldCkpCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwljYXNlIEVWUF9QS0VZX1JTQToKKwkJaWYgKChyZXQtPnBrZXkucnNhPWQyaV9SU0FQdWJsaWNLZXkoTlVMTCwKKwkJCShjb25zdCB1bnNpZ25lZCBjaGFyICoqKXBwLGxlbmd0aCkpID09IE5VTEwpIC8qIFRNUCBVR0xZIENBU1QgKi8KKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0QySV9QVUJMSUNLRVksRVJSX1JfQVNOMV9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWJyZWFrOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJY2FzZSBFVlBfUEtFWV9EU0E6CisJCWlmICghZDJpX0RTQVB1YmxpY0tleSgmKHJldC0+cGtleS5kc2EpLAorCQkJKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiopcHAsbGVuZ3RoKSkgLyogVE1QIFVHTFkgQ0FTVCAqLworCQkJeworCQkJQVNOMWVycihBU04xX0ZfRDJJX1BVQkxJQ0tFWSxFUlJfUl9BU04xX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCWNhc2UgRVZQX1BLRVlfRUM6CisJCWlmICghbzJpX0VDUHVibGljS2V5KCYocmV0LT5wa2V5LmVjKSwKKwkJCQkgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyICoqKXBwLCBsZW5ndGgpKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfRDJJX1BVQkxJQ0tFWSwgRVJSX1JfQVNOMV9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlBU04xZXJyKEFTTjFfRl9EMklfUFVCTElDS0VZLEFTTjFfUl9VTktOT1dOX1BVQkxJQ19LRVlfVFlQRSk7CisJCWdvdG8gZXJyOworCQkvKiBicmVhazsgKi8KKwkJfQorCWlmIChhICE9IE5VTEwpICgqYSk9cmV0OworCXJldHVybihyZXQpOworZXJyOgorCWlmICgocmV0ICE9IE5VTEwpICYmICgoYSA9PSBOVUxMKSB8fCAoKmEgIT0gcmV0KSkpIEVWUF9QS0VZX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9ldnBfYXNuMS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvZXZwX2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2Q5ODA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvZXZwX2FzbjEuYwpAQCAtMCwwICsxLDE4OSBAQAorLyogY3J5cHRvL2FzbjEvZXZwX2FzbjEuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMV9tYWMuaD4KKworaW50IEFTTjFfVFlQRV9zZXRfb2N0ZXRzdHJpbmcoQVNOMV9UWVBFICphLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQorCXsKKwlBU04xX1NUUklORyAqb3M7CisKKwlpZiAoKG9zPU1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpID09IE5VTEwpIHJldHVybigwKTsKKwlpZiAoIU1fQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KG9zLGRhdGEsbGVuKSkgcmV0dXJuKDApOworCUFTTjFfVFlQRV9zZXQoYSxWX0FTTjFfT0NURVRfU1RSSU5HLG9zKTsKKwlyZXR1cm4oMSk7CisJfQorCisvKiBpbnQgbWF4X2xlbjogIGZvciByZXR1cm5lZCB2YWx1ZSAgICAqLworaW50IEFTTjFfVFlQRV9nZXRfb2N0ZXRzdHJpbmcoQVNOMV9UWVBFICphLCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCSAgICAgaW50IG1heF9sZW4pCisJeworCWludCByZXQsbnVtOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlpZiAoKGEtPnR5cGUgIT0gVl9BU04xX09DVEVUX1NUUklORykgfHwgKGEtPnZhbHVlLm9jdGV0X3N0cmluZyA9PSBOVUxMKSkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX1RZUEVfR0VUX09DVEVUU1RSSU5HLEFTTjFfUl9EQVRBX0lTX1dST05HKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCXA9TV9BU04xX1NUUklOR19kYXRhKGEtPnZhbHVlLm9jdGV0X3N0cmluZyk7CisJcmV0PU1fQVNOMV9TVFJJTkdfbGVuZ3RoKGEtPnZhbHVlLm9jdGV0X3N0cmluZyk7CisJaWYgKHJldCA8IG1heF9sZW4pCisJCW51bT1yZXQ7CisJZWxzZQorCQludW09bWF4X2xlbjsKKwltZW1jcHkoZGF0YSxwLG51bSk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgQVNOMV9UWVBFX3NldF9pbnRfb2N0ZXRzdHJpbmcoQVNOMV9UWVBFICphLCBsb25nIG51bSwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkgICAgIGludCBsZW4pCisJeworCWludCBuLHNpemU7CisJQVNOMV9PQ1RFVF9TVFJJTkcgb3MsKm9zcDsKKwlBU04xX0lOVEVHRVIgaW47CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszMl07IC8qIHdoZW4gdGhleSBoYXZlIDI1NmJpdCBsb25ncywgCisJCQkJKiBJJ2xsIGJlIGluIHRyb3VibGUgKi8KKwlpbi5kYXRhPWJ1ZjsKKwlpbi5sZW5ndGg9MzI7CisJb3MuZGF0YT1kYXRhOworCW9zLnR5cGU9Vl9BU04xX09DVEVUX1NUUklORzsKKwlvcy5sZW5ndGg9bGVuOworCUFTTjFfSU5URUdFUl9zZXQoJmluLG51bSk7CisJbiA9ICBpMmRfQVNOMV9JTlRFR0VSKCZpbixOVUxMKTsKKwluKz1NX2kyZF9BU04xX09DVEVUX1NUUklORygmb3MsTlVMTCk7CisKKwlzaXplPUFTTjFfb2JqZWN0X3NpemUoMSxuLFZfQVNOMV9TRVFVRU5DRSk7CisKKwlpZiAoKG9zcD1BU04xX1NUUklOR19uZXcoKSkgPT0gTlVMTCkgcmV0dXJuKDApOworCS8qIEdyb3cgdGhlICdzdHJpbmcnICovCisJaWYgKCFBU04xX1NUUklOR19zZXQob3NwLE5VTEwsc2l6ZSkpCisJCXsKKwkJQVNOMV9TVFJJTkdfZnJlZShvc3ApOworCQlyZXR1cm4oMCk7CisJCX0KKworCU1fQVNOMV9TVFJJTkdfbGVuZ3RoX3NldChvc3AsIHNpemUpOworCXA9TV9BU04xX1NUUklOR19kYXRhKG9zcCk7CisKKwlBU04xX3B1dF9vYmplY3QoJnAsMSxuLFZfQVNOMV9TRVFVRU5DRSxWX0FTTjFfVU5JVkVSU0FMKTsKKwkgIGkyZF9BU04xX0lOVEVHRVIoJmluLCZwKTsKKwlNX2kyZF9BU04xX09DVEVUX1NUUklORygmb3MsJnApOworCisJQVNOMV9UWVBFX3NldChhLFZfQVNOMV9TRVFVRU5DRSxvc3ApOworCXJldHVybigxKTsKKwl9CisKKy8qIHdlIHJldHVybiB0aGUgYWN0dWFsIGxlbmd0aC4uLiwgbnVtIG1heSBiZSBtaXNzaW5nLCBpbiB3aGljaAorICogY2FzZSwgc2V0IGl0IHRvIHplcm8gKi8KKy8qIGludCBtYXhfbGVuOiAgZm9yIHJldHVybmVkIHZhbHVlICAgICovCitpbnQgQVNOMV9UWVBFX2dldF9pbnRfb2N0ZXRzdHJpbmcoQVNOMV9UWVBFICphLCBsb25nICpudW0sIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJICAgICBpbnQgbWF4X2xlbikKKwl7CisJaW50IHJldD0gLTEsbjsKKwlBU04xX0lOVEVHRVIgKmFpPU5VTEw7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9zPU5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGxlbmd0aDsKKwlBU04xX2NvbnN0X0NUWCBjOworCisJaWYgKChhLT50eXBlICE9IFZfQVNOMV9TRVFVRU5DRSkgfHwgKGEtPnZhbHVlLnNlcXVlbmNlID09IE5VTEwpKQorCQl7CisJCWdvdG8gZXJyOworCQl9CisJcD1NX0FTTjFfU1RSSU5HX2RhdGEoYS0+dmFsdWUuc2VxdWVuY2UpOworCWxlbmd0aD1NX0FTTjFfU1RSSU5HX2xlbmd0aChhLT52YWx1ZS5zZXF1ZW5jZSk7CisKKwljLnBwPSAmcDsKKwljLnA9cDsKKwljLm1heD1wK2xlbmd0aDsKKwljLmVycm9yPUFTTjFfUl9EQVRBX0lTX1dST05HOworCisJTV9BU04xX0QySV9zdGFydF9zZXF1ZW5jZSgpOworCWMucT1jLnA7CisJaWYgKChhaT1kMmlfQVNOMV9JTlRFR0VSKE5VTEwsJmMucCxjLnNsZW4pKSA9PSBOVUxMKSBnb3RvIGVycjsKKyAgICAgICAgYy5zbGVuLT0oYy5wLWMucSk7CisJYy5xPWMucDsKKwlpZiAoKG9zPWQyaV9BU04xX09DVEVUX1NUUklORyhOVUxMLCZjLnAsYy5zbGVuKSkgPT0gTlVMTCkgZ290byBlcnI7CisgICAgICAgIGMuc2xlbi09KGMucC1jLnEpOworCWlmICghTV9BU04xX0QySV9lbmRfc2VxdWVuY2UoKSkgZ290byBlcnI7CisKKwlpZiAobnVtICE9IE5VTEwpCisJCSpudW09QVNOMV9JTlRFR0VSX2dldChhaSk7CisKKwlyZXQ9TV9BU04xX1NUUklOR19sZW5ndGgob3MpOworCWlmIChtYXhfbGVuID4gcmV0KQorCQluPXJldDsKKwllbHNlCisJCW49bWF4X2xlbjsKKworCWlmIChkYXRhICE9IE5VTEwpCisJCW1lbWNweShkYXRhLE1fQVNOMV9TVFJJTkdfZGF0YShvcyksbik7CisJaWYgKDApCisJCXsKK2VycjoKKwkJQVNOMWVycihBU04xX0ZfQVNOMV9UWVBFX0dFVF9JTlRfT0NURVRTVFJJTkcsQVNOMV9SX0RBVEFfSVNfV1JPTkcpOworCQl9CisJaWYgKG9zICE9IE5VTEwpIE1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvcyk7CisJaWYgKGFpICE9IE5VTEwpIE1fQVNOMV9JTlRFR0VSX2ZyZWUoYWkpOworCXJldHVybihyZXQpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvZl9lbnVtLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9mX2VudW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmUzY2M4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvZl9lbnVtLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qIGNyeXB0by9hc24xL2ZfZW51bS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworLyogQmFzZWQgb24gYV9pbnQuYzogZXF1aXZhbGVudCBFTlVNRVJBVEVEIGZ1bmN0aW9ucyAqLworCitpbnQgaTJhX0FTTjFfRU5VTUVSQVRFRChCSU8gKmJwLCBBU04xX0VOVU1FUkFURUQgKmEpCisJeworCWludCBpLG49MDsKKwlzdGF0aWMgY29uc3QgY2hhciAqaD0iMDEyMzQ1Njc4OUFCQ0RFRiI7CisJY2hhciBidWZbMl07CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwlpZiAoYS0+bGVuZ3RoID09IDApCisJCXsKKwkJaWYgKEJJT193cml0ZShicCwiMDAiLDIpICE9IDIpIGdvdG8gZXJyOworCQluPTI7CisJCX0KKwllbHNlCisJCXsKKwkJZm9yIChpPTA7IGk8YS0+bGVuZ3RoOyBpKyspCisJCQl7CisJCQlpZiAoKGkgIT0gMCkgJiYgKGklMzUgPT0gMCkpCisJCQkJeworCQkJCWlmIChCSU9fd3JpdGUoYnAsIlxcXG4iLDIpICE9IDIpIGdvdG8gZXJyOworCQkJCW4rPTI7CisJCQkJfQorCQkJYnVmWzBdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0+PjQpJjB4MGZdOworCQkJYnVmWzFdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0gICApJjB4MGZdOworCQkJaWYgKEJJT193cml0ZShicCxidWYsMikgIT0gMikgZ290byBlcnI7CisJCQluKz0yOworCQkJfQorCQl9CisJcmV0dXJuKG4pOworZXJyOgorCXJldHVybigtMSk7CisJfQorCitpbnQgYTJpX0FTTjFfRU5VTUVSQVRFRChCSU8gKmJwLCBBU04xX0VOVU1FUkFURUQgKmJzLCBjaGFyICpidWYsIGludCBzaXplKQorCXsKKwlpbnQgcmV0PTA7CisJaW50IGksaixrLG0sbixhZ2FpbixidWZzaXplOworCXVuc2lnbmVkIGNoYXIgKnM9TlVMTCwqc3A7CisJdW5zaWduZWQgY2hhciAqYnVmcDsKKwlpbnQgbnVtPTAsc2xlbj0wLGZpcnN0PTE7CisKKwlicy0+dHlwZT1WX0FTTjFfRU5VTUVSQVRFRDsKKworCWJ1ZnNpemU9QklPX2dldHMoYnAsYnVmLHNpemUpOworCWZvciAoOzspCisJCXsKKwkJaWYgKGJ1ZnNpemUgPCAxKSBnb3RvIGVycl9zbDsKKwkJaT1idWZzaXplOworCQlpZiAoYnVmW2ktMV0gPT0gJ1xuJykgYnVmWy0taV09J1wwJzsKKwkJaWYgKGkgPT0gMCkgZ290byBlcnJfc2w7CisJCWlmIChidWZbaS0xXSA9PSAnXHInKSBidWZbLS1pXT0nXDAnOworCQlpZiAoaSA9PSAwKSBnb3RvIGVycl9zbDsKKwkJYWdhaW49KGJ1ZltpLTFdID09ICdcXCcpOworCisJCWZvciAoaj0wOyBqPGk7IGorKykKKwkJCXsKKwkJCWlmICghKAkoKGJ1ZltqXSA+PSAnMCcpICYmIChidWZbal0gPD0gJzknKSkgfHwKKwkJCQkoKGJ1ZltqXSA+PSAnYScpICYmIChidWZbal0gPD0gJ2YnKSkgfHwKKwkJCQkoKGJ1ZltqXSA+PSAnQScpICYmIChidWZbal0gPD0gJ0YnKSkpKQorCQkJCXsKKwkJCQlpPWo7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlidWZbaV09J1wwJzsKKwkJLyogV2UgaGF2ZSBub3cgY2xlYXJlZCBhbGwgdGhlIGNyYXAgb2ZmIHRoZSBlbmQgb2YgdGhlCisJCSAqIGxpbmUgKi8KKwkJaWYgKGkgPCAyKSBnb3RvIGVycl9zbDsKKworCQlidWZwPSh1bnNpZ25lZCBjaGFyICopYnVmOworCQlpZiAoZmlyc3QpCisJCQl7CisJCQlmaXJzdD0wOworCQkJaWYgKChidWZwWzBdID09ICcwJykgJiYgKGJ1ZlsxXSA9PSAnMCcpKQorCQkJCXsKKwkJCQlidWZwKz0yOworCQkJCWktPTI7CisJCQkJfQorCQkJfQorCQlrPTA7CisJCWktPWFnYWluOworCQlpZiAoaSUyICE9IDApCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BMklfQVNOMV9FTlVNRVJBVEVELEFTTjFfUl9PRERfTlVNQkVSX09GX0NIQVJTKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpLz0yOworCQlpZiAobnVtK2kgPiBzbGVuKQorCQkJeworCQkJaWYgKHMgPT0gTlVMTCkKKwkJCQlzcD0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKAorCQkJCQkodW5zaWduZWQgaW50KW51bStpKjIpOworCQkJZWxzZQorCQkJCXNwPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9yZWFsbG9jKHMsCisJCQkJCSh1bnNpZ25lZCBpbnQpbnVtK2kqMik7CisJCQlpZiAoc3AgPT0gTlVMTCkKKwkJCQl7CisJCQkJQVNOMWVycihBU04xX0ZfQTJJX0FTTjFfRU5VTUVSQVRFRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJaWYgKHMgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHMpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXM9c3A7CisJCQlzbGVuPW51bStpKjI7CisJCQl9CisJCWZvciAoaj0wOyBqPGk7IGorKyxrKz0yKQorCQkJeworCQkJZm9yIChuPTA7IG48MjsgbisrKQorCQkJCXsKKwkJCQltPWJ1ZnBbaytuXTsKKwkJCQlpZiAoKG0gPj0gJzAnKSAmJiAobSA8PSAnOScpKQorCQkJCQltLT0nMCc7CisJCQkJZWxzZSBpZiAoKG0gPj0gJ2EnKSAmJiAobSA8PSAnZicpKQorCQkJCQltPW0tJ2EnKzEwOworCQkJCWVsc2UgaWYgKChtID49ICdBJykgJiYgKG0gPD0gJ0YnKSkKKwkJCQkJbT1tLSdBJysxMDsKKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJQVNOMWVycihBU04xX0ZfQTJJX0FTTjFfRU5VTUVSQVRFRCxBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlzW251bStqXTw8PTQ7CisJCQkJc1tudW0ral18PW07CisJCQkJfQorCQkJfQorCQludW0rPWk7CisJCWlmIChhZ2FpbikKKwkJCWJ1ZnNpemU9QklPX2dldHMoYnAsYnVmLHNpemUpOworCQllbHNlCisJCQlicmVhazsKKwkJfQorCWJzLT5sZW5ndGg9bnVtOworCWJzLT5kYXRhPXM7CisJcmV0PTE7CitlcnI6CisJaWYgKDApCisJCXsKK2Vycl9zbDoKKwkJQVNOMWVycihBU04xX0ZfQTJJX0FTTjFfRU5VTUVSQVRFRCxBU04xX1JfU0hPUlRfTElORSk7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2ZfaW50LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9mX2ludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTRlNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9mX2ludC5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiBjcnlwdG8vYXNuMS9mX2ludC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworaW50IGkyYV9BU04xX0lOVEVHRVIoQklPICpicCwgQVNOMV9JTlRFR0VSICphKQorCXsKKwlpbnQgaSxuPTA7CisJc3RhdGljIGNvbnN0IGNoYXIgKmg9IjAxMjM0NTY3ODlBQkNERUYiOworCWNoYXIgYnVmWzJdOworCisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCisJaWYgKGEtPnR5cGUgJiBWX0FTTjFfTkVHKQorCQl7CisJCWlmIChCSU9fd3JpdGUoYnAsICItIiwgMSkgIT0gMSkgZ290byBlcnI7CisJCW4gPSAxOworCQl9CisKKwlpZiAoYS0+bGVuZ3RoID09IDApCisJCXsKKwkJaWYgKEJJT193cml0ZShicCwiMDAiLDIpICE9IDIpIGdvdG8gZXJyOworCQluICs9IDI7CisJCX0KKwllbHNlCisJCXsKKwkJZm9yIChpPTA7IGk8YS0+bGVuZ3RoOyBpKyspCisJCQl7CisJCQlpZiAoKGkgIT0gMCkgJiYgKGklMzUgPT0gMCkpCisJCQkJeworCQkJCWlmIChCSU9fd3JpdGUoYnAsIlxcXG4iLDIpICE9IDIpIGdvdG8gZXJyOworCQkJCW4rPTI7CisJCQkJfQorCQkJYnVmWzBdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0+PjQpJjB4MGZdOworCQkJYnVmWzFdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0gICApJjB4MGZdOworCQkJaWYgKEJJT193cml0ZShicCxidWYsMikgIT0gMikgZ290byBlcnI7CisJCQluKz0yOworCQkJfQorCQl9CisJcmV0dXJuKG4pOworZXJyOgorCXJldHVybigtMSk7CisJfQorCitpbnQgYTJpX0FTTjFfSU5URUdFUihCSU8gKmJwLCBBU04xX0lOVEVHRVIgKmJzLCBjaGFyICpidWYsIGludCBzaXplKQorCXsKKwlpbnQgcmV0PTA7CisJaW50IGksaixrLG0sbixhZ2FpbixidWZzaXplOworCXVuc2lnbmVkIGNoYXIgKnM9TlVMTCwqc3A7CisJdW5zaWduZWQgY2hhciAqYnVmcDsKKwlpbnQgbnVtPTAsc2xlbj0wLGZpcnN0PTE7CisKKwlicy0+dHlwZT1WX0FTTjFfSU5URUdFUjsKKworCWJ1ZnNpemU9QklPX2dldHMoYnAsYnVmLHNpemUpOworCWZvciAoOzspCisJCXsKKwkJaWYgKGJ1ZnNpemUgPCAxKSBnb3RvIGVycl9zbDsKKwkJaT1idWZzaXplOworCQlpZiAoYnVmW2ktMV0gPT0gJ1xuJykgYnVmWy0taV09J1wwJzsKKwkJaWYgKGkgPT0gMCkgZ290byBlcnJfc2w7CisJCWlmIChidWZbaS0xXSA9PSAnXHInKSBidWZbLS1pXT0nXDAnOworCQlpZiAoaSA9PSAwKSBnb3RvIGVycl9zbDsKKwkJYWdhaW49KGJ1ZltpLTFdID09ICdcXCcpOworCisJCWZvciAoaj0wOyBqPGk7IGorKykKKwkJCXsKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJCWlmICghKAkoKGJ1ZltqXSA+PSAnMCcpICYmIChidWZbal0gPD0gJzknKSkgfHwKKwkJCQkoKGJ1ZltqXSA+PSAnYScpICYmIChidWZbal0gPD0gJ2YnKSkgfHwKKwkJCQkoKGJ1ZltqXSA+PSAnQScpICYmIChidWZbal0gPD0gJ0YnKSkpKQorI2Vsc2UKKwkJCS8qIFRoaXMgI2lmZGVmIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnksIHNpbmNlCisJCQkgKiB0aGUgY2hhcmFjdGVycyBBLi4uRiBhLi4uZiAwLi4uOSBhcmUgY29udGlndW91cworCQkJICogKHllcywgZXZlbiBpbiBFQkNESUMgLSBidXQgbm90IHRoZSB3aG9sZSBhbHBoYWJldCkuCisJCQkgKiBOZXZlcnRoZWxlc3MsIGlzeGRpZ2l0KCkgaXMgZmFzdGVyLgorCQkJICovCisJCQlpZiAoIWlzeGRpZ2l0KGJ1ZltqXSkpCisjZW5kaWYKKwkJCQl7CisJCQkJaT1qOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJYnVmW2ldPSdcMCc7CisJCS8qIFdlIGhhdmUgbm93IGNsZWFyZWQgYWxsIHRoZSBjcmFwIG9mZiB0aGUgZW5kIG9mIHRoZQorCQkgKiBsaW5lICovCisJCWlmIChpIDwgMikgZ290byBlcnJfc2w7CisKKwkJYnVmcD0odW5zaWduZWQgY2hhciAqKWJ1ZjsKKwkJaWYgKGZpcnN0KQorCQkJeworCQkJZmlyc3Q9MDsKKwkJCWlmICgoYnVmcFswXSA9PSAnMCcpICYmIChidWZbMV0gPT0gJzAnKSkKKwkJCQl7CisJCQkJYnVmcCs9MjsKKwkJCQlpLT0yOworCQkJCX0KKwkJCX0KKwkJaz0wOworCQlpLT1hZ2FpbjsKKwkJaWYgKGklMiAhPSAwKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQTJJX0FTTjFfSU5URUdFUixBU04xX1JfT0REX05VTUJFUl9PRl9DSEFSUyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaS89MjsKKwkJaWYgKG51bStpID4gc2xlbikKKwkJCXsKKwkJCWlmIChzID09IE5VTEwpCisJCQkJc3A9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygKKwkJCQkJKHVuc2lnbmVkIGludCludW0raSoyKTsKKwkJCWVsc2UKKwkJCQlzcD1PUEVOU1NMX3JlYWxsb2NfY2xlYW4ocyxzbGVuLG51bStpKjIpOworCQkJaWYgKHNwID09IE5VTEwpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0EySV9BU04xX0lOVEVHRVIsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWlmIChzICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlzPXNwOworCQkJc2xlbj1udW0raSoyOworCQkJfQorCQlmb3IgKGo9MDsgajxpOyBqKyssays9MikKKwkJCXsKKwkJCWZvciAobj0wOyBuPDI7IG4rKykKKwkJCQl7CisJCQkJbT1idWZwW2srbl07CisJCQkJaWYgKChtID49ICcwJykgJiYgKG0gPD0gJzknKSkKKwkJCQkJbS09JzAnOworCQkJCWVsc2UgaWYgKChtID49ICdhJykgJiYgKG0gPD0gJ2YnKSkKKwkJCQkJbT1tLSdhJysxMDsKKwkJCQllbHNlIGlmICgobSA+PSAnQScpICYmIChtIDw9ICdGJykpCisJCQkJCW09bS0nQScrMTA7CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCUFTTjFlcnIoQVNOMV9GX0EySV9BU04xX0lOVEVHRVIsQVNOMV9SX05PTl9IRVhfQ0hBUkFDVEVSUyk7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJc1tudW0ral08PD00OworCQkJCXNbbnVtK2pdfD1tOworCQkJCX0KKwkJCX0KKwkJbnVtKz1pOworCQlpZiAoYWdhaW4pCisJCQlidWZzaXplPUJJT19nZXRzKGJwLGJ1ZixzaXplKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJCX0KKwlicy0+bGVuZ3RoPW51bTsKKwlicy0+ZGF0YT1zOworCXJldD0xOworZXJyOgorCWlmICgwKQorCQl7CitlcnJfc2w6CisJCUFTTjFlcnIoQVNOMV9GX0EySV9BU04xX0lOVEVHRVIsQVNOMV9SX1NIT1JUX0xJTkUpOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9mX3N0cmluZy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvZl9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg2OThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvZl9zdHJpbmcuYwpAQCAtMCwwICsxLDIxMiBAQAorLyogY3J5cHRvL2FzbjEvZl9zdHJpbmcuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKK2ludCBpMmFfQVNOMV9TVFJJTkcoQklPICpicCwgQVNOMV9TVFJJTkcgKmEsIGludCB0eXBlKQorCXsKKwlpbnQgaSxuPTA7CisJc3RhdGljIGNvbnN0IGNoYXIgKmg9IjAxMjM0NTY3ODlBQkNERUYiOworCWNoYXIgYnVmWzJdOworCisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCisJaWYgKGEtPmxlbmd0aCA9PSAwKQorCQl7CisJCWlmIChCSU9fd3JpdGUoYnAsIjAiLDEpICE9IDEpIGdvdG8gZXJyOworCQluPTE7CisJCX0KKwllbHNlCisJCXsKKwkJZm9yIChpPTA7IGk8YS0+bGVuZ3RoOyBpKyspCisJCQl7CisJCQlpZiAoKGkgIT0gMCkgJiYgKGklMzUgPT0gMCkpCisJCQkJeworCQkJCWlmIChCSU9fd3JpdGUoYnAsIlxcXG4iLDIpICE9IDIpIGdvdG8gZXJyOworCQkJCW4rPTI7CisJCQkJfQorCQkJYnVmWzBdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0+PjQpJjB4MGZdOworCQkJYnVmWzFdPWhbKCh1bnNpZ25lZCBjaGFyKWEtPmRhdGFbaV0gICApJjB4MGZdOworCQkJaWYgKEJJT193cml0ZShicCxidWYsMikgIT0gMikgZ290byBlcnI7CisJCQluKz0yOworCQkJfQorCQl9CisJcmV0dXJuKG4pOworZXJyOgorCXJldHVybigtMSk7CisJfQorCitpbnQgYTJpX0FTTjFfU1RSSU5HKEJJTyAqYnAsIEFTTjFfU1RSSU5HICpicywgY2hhciAqYnVmLCBpbnQgc2l6ZSkKKwl7CisJaW50IHJldD0wOworCWludCBpLGosayxtLG4sYWdhaW4sYnVmc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpzPU5VTEwsKnNwOworCXVuc2lnbmVkIGNoYXIgKmJ1ZnA7CisJaW50IG51bT0wLHNsZW49MCxmaXJzdD0xOworCisJYnVmc2l6ZT1CSU9fZ2V0cyhicCxidWYsc2l6ZSk7CisJZm9yICg7OykKKwkJeworCQlpZiAoYnVmc2l6ZSA8IDEpCisJCQl7CisJCQlpZiAoZmlyc3QpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJZ290byBlcnJfc2w7CisJCQl9CisJCWZpcnN0PTA7CisKKwkJaT1idWZzaXplOworCQlpZiAoYnVmW2ktMV0gPT0gJ1xuJykgYnVmWy0taV09J1wwJzsKKwkJaWYgKGkgPT0gMCkgZ290byBlcnJfc2w7CisJCWlmIChidWZbaS0xXSA9PSAnXHInKSBidWZbLS1pXT0nXDAnOworCQlpZiAoaSA9PSAwKSBnb3RvIGVycl9zbDsKKwkJYWdhaW49KGJ1ZltpLTFdID09ICdcXCcpOworCisJCWZvciAoaj1pLTE7IGo+MDsgai0tKQorCQkJeworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCQkJaWYgKCEoCSgoYnVmW2pdID49ICcwJykgJiYgKGJ1ZltqXSA8PSAnOScpKSB8fAorCQkJCSgoYnVmW2pdID49ICdhJykgJiYgKGJ1ZltqXSA8PSAnZicpKSB8fAorCQkJCSgoYnVmW2pdID49ICdBJykgJiYgKGJ1ZltqXSA8PSAnRicpKSkpCisjZWxzZQorCQkJLyogVGhpcyAjaWZkZWYgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgc2luY2UKKwkJCSAqIHRoZSBjaGFyYWN0ZXJzIEEuLi5GIGEuLi5mIDAuLi45IGFyZSBjb250aWd1b3VzCisJCQkgKiAoeWVzLCBldmVuIGluIEVCQ0RJQyAtIGJ1dCBub3QgdGhlIHdob2xlIGFscGhhYmV0KS4KKwkJCSAqIE5ldmVydGhlbGVzcywgaXN4ZGlnaXQoKSBpcyBmYXN0ZXIuCisJCQkgKi8KKwkJCWlmICghaXN4ZGlnaXQoYnVmW2pdKSkKKyNlbmRpZgorCQkJCXsKKwkJCQlpPWo7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlidWZbaV09J1wwJzsKKwkJLyogV2UgaGF2ZSBub3cgY2xlYXJlZCBhbGwgdGhlIGNyYXAgb2ZmIHRoZSBlbmQgb2YgdGhlCisJCSAqIGxpbmUgKi8KKwkJaWYgKGkgPCAyKSBnb3RvIGVycl9zbDsKKworCQlidWZwPSh1bnNpZ25lZCBjaGFyICopYnVmOworCisJCWs9MDsKKwkJaS09YWdhaW47CisJCWlmIChpJTIgIT0gMCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0EySV9BU04xX1NUUklORyxBU04xX1JfT0REX05VTUJFUl9PRl9DSEFSUyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaS89MjsKKwkJaWYgKG51bStpID4gc2xlbikKKwkJCXsKKwkJCWlmIChzID09IE5VTEwpCisJCQkJc3A9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygKKwkJCQkJKHVuc2lnbmVkIGludCludW0raSoyKTsKKwkJCWVsc2UKKwkJCQlzcD0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfcmVhbGxvYyhzLAorCQkJCQkodW5zaWduZWQgaW50KW51bStpKjIpOworCQkJaWYgKHNwID09IE5VTEwpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0EySV9BU04xX1NUUklORyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJaWYgKHMgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHMpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXM9c3A7CisJCQlzbGVuPW51bStpKjI7CisJCQl9CisJCWZvciAoaj0wOyBqPGk7IGorKyxrKz0yKQorCQkJeworCQkJZm9yIChuPTA7IG48MjsgbisrKQorCQkJCXsKKwkJCQltPWJ1ZnBbaytuXTsKKwkJCQlpZiAoKG0gPj0gJzAnKSAmJiAobSA8PSAnOScpKQorCQkJCQltLT0nMCc7CisJCQkJZWxzZSBpZiAoKG0gPj0gJ2EnKSAmJiAobSA8PSAnZicpKQorCQkJCQltPW0tJ2EnKzEwOworCQkJCWVsc2UgaWYgKChtID49ICdBJykgJiYgKG0gPD0gJ0YnKSkKKwkJCQkJbT1tLSdBJysxMDsKKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJQVNOMWVycihBU04xX0ZfQTJJX0FTTjFfU1RSSU5HLEFTTjFfUl9OT05fSEVYX0NIQVJBQ1RFUlMpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCXNbbnVtK2pdPDw9NDsKKwkJCQlzW251bStqXXw9bTsKKwkJCQl9CisJCQl9CisJCW51bSs9aTsKKwkJaWYgKGFnYWluKQorCQkJYnVmc2l6ZT1CSU9fZ2V0cyhicCxidWYsc2l6ZSk7CisJCWVsc2UKKwkJCWJyZWFrOworCQl9CisJYnMtPmxlbmd0aD1udW07CisJYnMtPmRhdGE9czsKKwlyZXQ9MTsKK2VycjoKKwlpZiAoMCkKKwkJeworZXJyX3NsOgorCQlBU04xZXJyKEFTTjFfRl9BMklfQVNOMV9TVFJJTkcsQVNOMV9SX1NIT1JUX0xJTkUpOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9pMmRfcHIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL2kyZF9wci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOThiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9pMmRfcHIuYwpAQCAtMCwwICsxLDgwIEBACisvKiBjcnlwdG8vYXNuMS9pMmRfcHIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSAiYXNuMV9sb2NsLmgiCisKK2ludCBpMmRfUHJpdmF0ZUtleShFVlBfUEtFWSAqYSwgdW5zaWduZWQgY2hhciAqKnBwKQorCXsKKwlpZiAoYS0+YW1ldGggJiYgYS0+YW1ldGgtPm9sZF9wcml2X2VuY29kZSkKKwkJeworCQlyZXR1cm4gYS0+YW1ldGgtPm9sZF9wcml2X2VuY29kZShhLCBwcCk7CisJCX0KKwlpZiAoYS0+YW1ldGggJiYgYS0+YW1ldGgtPnByaXZfZW5jb2RlKSB7CisJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4ID0gRVZQX1BLRVkyUEtDUzgoYSk7CisJCWludCByZXQgPSBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyhwOCxwcCk7CisJCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOCk7CisJCXJldHVybiByZXQ7CisJfQkKKwlBU04xZXJyKEFTTjFfRl9JMkRfUFJJVkFURUtFWSxBU04xX1JfVU5TVVBQT1JURURfUFVCTElDX0tFWV9UWVBFKTsKKwlyZXR1cm4oLTEpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvaTJkX3B1LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9pMmRfcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDI4NmRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvaTJkX3B1LmMKQEAgLTAsMCArMSw5NSBAQAorLyogY3J5cHRvL2FzbjEvaTJkX3B1LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorI2VuZGlmCisKK2ludCBpMmRfUHVibGljS2V5KEVWUF9QS0VZICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCXN3aXRjaCAoYS0+dHlwZSkKKwkJeworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCWNhc2UgRVZQX1BLRVlfUlNBOgorCQlyZXR1cm4oaTJkX1JTQVB1YmxpY0tleShhLT5wa2V5LnJzYSxwcCkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJY2FzZSBFVlBfUEtFWV9EU0E6CisJCXJldHVybihpMmRfRFNBUHVibGljS2V5KGEtPnBrZXkuZHNhLHBwKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCWNhc2UgRVZQX1BLRVlfRUM6CisJCXJldHVybihpMm9fRUNQdWJsaWNLZXkoYS0+cGtleS5lYywgcHApKTsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCUFTTjFlcnIoQVNOMV9GX0kyRF9QVUJMSUNLRVksQVNOMV9SX1VOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRSk7CisJCXJldHVybigtMSk7CisJCX0KKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL25fcGtleS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvbl9wa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiYzQzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL25fcGtleS5jCkBAIC0wLDAgKzEsMzQ0IEBACisvKiBjcnlwdG8vYXNuMS9uX3BrZXkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMV9tYWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKwordHlwZWRlZiBzdHJ1Y3QgbmV0c2NhcGVfcGtleV9zdAorCXsKKwlsb25nIHZlcnNpb247CisJWDUwOV9BTEdPUiAqYWxnb3I7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKnByaXZhdGVfa2V5OworCX0gTkVUU0NBUEVfUEtFWTsKKwordHlwZWRlZiBzdHJ1Y3QgbmV0c2NhcGVfZW5jcnlwdGVkX3BrZXlfc3QKKwl7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9zOworCS8qIFRoaXMgaXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIERpZ2VzdEluZm8gc28gdXNlIGl0OgorCSAqIGFsdGhvdWdoIHRoaXMgaXNuJ3QgcmVhbGx5IGFueXRoaW5nIHRvIGRvIHdpdGgKKwkgKiBkaWdlc3RzLgorCSAqLworCVg1MDlfU0lHICplbmNrZXk7CisJfSBORVRTQ0FQRV9FTkNSWVBURURfUEtFWTsKKworCitBU04xX0JST0tFTl9TRVFVRU5DRShORVRTQ0FQRV9FTkNSWVBURURfUEtFWSkgPSB7CisJQVNOMV9TSU1QTEUoTkVUU0NBUEVfRU5DUllQVEVEX1BLRVksIG9zLCBBU04xX09DVEVUX1NUUklORyksCisJQVNOMV9TSU1QTEUoTkVUU0NBUEVfRU5DUllQVEVEX1BLRVksIGVuY2tleSwgWDUwOV9TSUcpCit9IEFTTjFfQlJPS0VOX1NFUVVFTkNFX0VORChORVRTQ0FQRV9FTkNSWVBURURfUEtFWSkKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OU19jb25zdChORVRTQ0FQRV9FTkNSWVBURURfUEtFWSkKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KE5FVFNDQVBFX0VOQ1JZUFRFRF9QS0VZLE5FVFNDQVBFX0VOQ1JZUFRFRF9QS0VZKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0KE5FVFNDQVBFX0VOQ1JZUFRFRF9QS0VZKQorCitBU04xX1NFUVVFTkNFKE5FVFNDQVBFX1BLRVkpID0geworCUFTTjFfU0lNUExFKE5FVFNDQVBFX1BLRVksIHZlcnNpb24sIExPTkcpLAorCUFTTjFfU0lNUExFKE5FVFNDQVBFX1BLRVksIGFsZ29yLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShORVRTQ0FQRV9QS0VZLCBwcml2YXRlX2tleSwgQVNOMV9PQ1RFVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE5FVFNDQVBFX1BLRVkpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlNfY29uc3QoTkVUU0NBUEVfUEtFWSkKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KE5FVFNDQVBFX1BLRVksTkVUU0NBUEVfUEtFWSkKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OU19jb25zdChORVRTQ0FQRV9QS0VZKQorCitzdGF0aWMgUlNBICpkMmlfUlNBX05FVF8yKFJTQSAqKmEsIEFTTjFfT0NURVRfU1RSSU5HICpvcywKKwkJCSAgaW50ICgqY2IpKGNoYXIgKmJ1ZiwgaW50IGxlbiwgY29uc3QgY2hhciAqcHJvbXB0LAorCQkJCSAgICBpbnQgdmVyaWZ5KSwKKwkJCSAgaW50IHNnY2tleSk7CisKK2ludCBpMmRfTmV0c2NhcGVfUlNBKGNvbnN0IFJTQSAqYSwgdW5zaWduZWQgY2hhciAqKnBwLAorCQkgICAgIGludCAoKmNiKShjaGFyICpidWYsIGludCBsZW4sIGNvbnN0IGNoYXIgKnByb21wdCwKKwkJCSAgICAgICBpbnQgdmVyaWZ5KSkKK3sKKwlyZXR1cm4gaTJkX1JTQV9ORVQoYSwgcHAsIGNiLCAwKTsKK30KKworaW50IGkyZF9SU0FfTkVUKGNvbnN0IFJTQSAqYSwgdW5zaWduZWQgY2hhciAqKnBwLAorCQlpbnQgKCpjYikoY2hhciAqYnVmLCBpbnQgbGVuLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCB2ZXJpZnkpLAorCQlpbnQgc2dja2V5KQorCXsKKwlpbnQgaSwgaiwgcmV0ID0gMDsKKwlpbnQgcnNhbGVuLCBwa2V5bGVuLCBvbGVuOworCU5FVFNDQVBFX1BLRVkgKnBrZXkgPSBOVUxMOworCU5FVFNDQVBFX0VOQ1JZUFRFRF9QS0VZICplbmNrZXkgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgYnVmWzI1Nl0sKnp6OworCXVuc2lnbmVkIGNoYXIga2V5W0VWUF9NQVhfS0VZX0xFTkdUSF07CisJRVZQX0NJUEhFUl9DVFggY3R4OworCisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCisJaWYgKChwa2V5PU5FVFNDQVBFX1BLRVlfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCWlmICgoZW5ja2V5PU5FVFNDQVBFX0VOQ1JZUFRFRF9QS0VZX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlwa2V5LT52ZXJzaW9uID0gMDsKKworCXBrZXktPmFsZ29yLT5hbGdvcml0aG09T0JKX25pZDJvYmooTklEX3JzYUVuY3J5cHRpb24pOworCWlmICgocGtleS0+YWxnb3ItPnBhcmFtZXRlcj1BU04xX1RZUEVfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCXBrZXktPmFsZ29yLT5wYXJhbWV0ZXItPnR5cGU9Vl9BU04xX05VTEw7CisKKwlyc2FsZW4gPSBpMmRfUlNBUHJpdmF0ZUtleShhLCBOVUxMKTsKKworCS8qIEZha2Ugc29tZSBvY3RldCBzdHJpbmdzIGp1c3QgZm9yIHRoZSBpbml0aWFsIGxlbmd0aAorCSAqIGNhbGN1bGF0aW9uLgorIAkgKi8KKworCXBrZXktPnByaXZhdGVfa2V5LT5sZW5ndGg9cnNhbGVuOworCisJcGtleWxlbj1pMmRfTkVUU0NBUEVfUEtFWShwa2V5LE5VTEwpOworCisJZW5ja2V5LT5lbmNrZXktPmRpZ2VzdC0+bGVuZ3RoID0gcGtleWxlbjsKKworCWVuY2tleS0+b3MtPmxlbmd0aCA9IDExOwkvKiAicHJpdmF0ZS1rZXkiICovCisKKwllbmNrZXktPmVuY2tleS0+YWxnb3ItPmFsZ29yaXRobT1PQkpfbmlkMm9iaihOSURfcmM0KTsKKwlpZiAoKGVuY2tleS0+ZW5ja2V5LT5hbGdvci0+cGFyYW1ldGVyPUFTTjFfVFlQRV9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJZW5ja2V5LT5lbmNrZXktPmFsZ29yLT5wYXJhbWV0ZXItPnR5cGU9Vl9BU04xX05VTEw7CisKKwlpZiAocHAgPT0gTlVMTCkKKwkJeworCQlvbGVuID0gaTJkX05FVFNDQVBFX0VOQ1JZUFRFRF9QS0VZKGVuY2tleSwgTlVMTCk7CisJCU5FVFNDQVBFX1BLRVlfZnJlZShwa2V5KTsKKwkJTkVUU0NBUEVfRU5DUllQVEVEX1BLRVlfZnJlZShlbmNrZXkpOworCQlyZXR1cm4gb2xlbjsKKwkJfQorCisKKwkvKiBTaW5jZSBpdHMgUkM0IGVuY3J5cHRlZCBsZW5ndGggaXMgYWN0dWFsIGxlbmd0aCAqLworCWlmICgoeno9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhyc2FsZW4pKSA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0kyRF9SU0FfTkVULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCXBrZXktPnByaXZhdGVfa2V5LT5kYXRhID0geno7CisJLyogV3JpdGUgb3V0IHByaXZhdGUga2V5IGVuY29kaW5nICovCisJaTJkX1JTQVByaXZhdGVLZXkoYSwmenopOworCisJaWYgKCh6ej1PUEVOU1NMX21hbGxvYyhwa2V5bGVuKSkgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9JMkRfUlNBX05FVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoIUFTTjFfU1RSSU5HX3NldChlbmNrZXktPm9zLCAicHJpdmF0ZS1rZXkiLCAtMSkpIAorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0kyRF9SU0FfTkVULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwllbmNrZXktPmVuY2tleS0+ZGlnZXN0LT5kYXRhID0geno7CisJaTJkX05FVFNDQVBFX1BLRVkocGtleSwmenopOworCisJLyogV2lwZSB0aGUgcHJpdmF0ZSBrZXkgZW5jb2RpbmcgKi8KKwlPUEVOU1NMX2NsZWFuc2UocGtleS0+cHJpdmF0ZV9rZXktPmRhdGEsIHJzYWxlbik7CisJCQorCWlmIChjYiA9PSBOVUxMKQorCQljYj1FVlBfcmVhZF9wd19zdHJpbmc7CisJaT1jYigoY2hhciAqKWJ1ZiwyNTYsIkVudGVyIFByaXZhdGUgS2V5IHBhc3N3b3JkOiIsMSk7CisJaWYgKGkgIT0gMCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9JMkRfUlNBX05FVCxBU04xX1JfQkFEX1BBU1NXT1JEX1JFQUQpOworCQlnb3RvIGVycjsKKwkJfQorCWkgPSBzdHJsZW4oKGNoYXIgKilidWYpOworCS8qIElmIHRoZSBrZXkgaXMgdXNlZCBmb3IgU0dDIHRoZSBhbGdvcml0aG0gaXMgbW9kaWZpZWQgYSBsaXR0bGUuICovCisJaWYoc2dja2V5KSB7CisJCUVWUF9EaWdlc3QoYnVmLCBpLCBidWYsIE5VTEwsIEVWUF9tZDUoKSwgTlVMTCk7CisJCW1lbWNweShidWYgKyAxNiwgIlNHQ0tFWVNBTFQiLCAxMCk7CisJCWkgPSAyNjsKKwl9CisKKwlFVlBfQnl0ZXNUb0tleShFVlBfcmM0KCksRVZQX21kNSgpLE5VTEwsYnVmLGksMSxrZXksTlVMTCk7CisJT1BFTlNTTF9jbGVhbnNlKGJ1ZiwyNTYpOworCisJLyogRW5jcnlwdCBwcml2YXRlIGtleSBpbiBwbGFjZSAqLworCXp6ID0gZW5ja2V5LT5lbmNrZXktPmRpZ2VzdC0+ZGF0YTsKKwlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOworCUVWUF9FbmNyeXB0SW5pdF9leCgmY3R4LEVWUF9yYzQoKSxOVUxMLGtleSxOVUxMKTsKKwlFVlBfRW5jcnlwdFVwZGF0ZSgmY3R4LHp6LCZpLHp6LHBrZXlsZW4pOworCUVWUF9FbmNyeXB0RmluYWxfZXgoJmN0eCx6eiArIGksJmopOworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisKKwlyZXQgPSBpMmRfTkVUU0NBUEVfRU5DUllQVEVEX1BLRVkoZW5ja2V5LCBwcCk7CitlcnI6CisJTkVUU0NBUEVfRU5DUllQVEVEX1BLRVlfZnJlZShlbmNrZXkpOworCU5FVFNDQVBFX1BLRVlfZnJlZShwa2V5KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKworUlNBICpkMmlfTmV0c2NhcGVfUlNBKFJTQSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgsCisJCSAgICAgIGludCAoKmNiKShjaGFyICpidWYsIGludCBsZW4sIGNvbnN0IGNoYXIgKnByb21wdCwKKwkJCQlpbnQgdmVyaWZ5KSkKK3sKKwlyZXR1cm4gZDJpX1JTQV9ORVQoYSwgcHAsIGxlbmd0aCwgY2IsIDApOworfQorCitSU0EgKmQyaV9SU0FfTkVUKFJTQSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgsCisJCSBpbnQgKCpjYikoY2hhciAqYnVmLCBpbnQgbGVuLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCB2ZXJpZnkpLAorCQkgaW50IHNnY2tleSkKKwl7CisJUlNBICpyZXQ9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCAqa3A7CisJTkVUU0NBUEVfRU5DUllQVEVEX1BLRVkgKmVuY2tleSA9IE5VTEw7CisKKwlwID0gKnBwOworCisJZW5ja2V5ID0gZDJpX05FVFNDQVBFX0VOQ1JZUFRFRF9QS0VZKE5VTEwsICZwLCBsZW5ndGgpOworCWlmKCFlbmNrZXkpIHsKKwkJQVNOMWVycihBU04xX0ZfRDJJX1JTQV9ORVQsQVNOMV9SX0RFQ09ESU5HX0VSUk9SKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKChlbmNrZXktPm9zLT5sZW5ndGggIT0gMTEpIHx8IChzdHJuY21wKCJwcml2YXRlLWtleSIsCisJCShjaGFyICopZW5ja2V5LT5vcy0+ZGF0YSwxMSkgIT0gMCkpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfRDJJX1JTQV9ORVQsQVNOMV9SX1BSSVZBVEVfS0VZX0hFQURFUl9NSVNTSU5HKTsKKwkJTkVUU0NBUEVfRU5DUllQVEVEX1BLRVlfZnJlZShlbmNrZXkpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmIChPQkpfb2JqMm5pZChlbmNrZXktPmVuY2tleS0+YWxnb3ItPmFsZ29yaXRobSkgIT0gTklEX3JjNCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9EMklfUlNBX05FVCxBU04xX1JfVU5TVVBQT1JURURfRU5DUllQVElPTl9BTEdPUklUSE0pOworCQlnb3RvIGVycjsKKwl9CisJa3AgPSBlbmNrZXktPmVuY2tleS0+ZGlnZXN0LT5kYXRhOworCWlmIChjYiA9PSBOVUxMKQorCQljYj1FVlBfcmVhZF9wd19zdHJpbmc7CisJaWYgKChyZXQ9ZDJpX1JTQV9ORVRfMihhLCBlbmNrZXktPmVuY2tleS0+ZGlnZXN0LGNiLCBzZ2NrZXkpKSA9PSBOVUxMKSBnb3RvIGVycjsKKworCSpwcCA9IHA7CisKKwllcnI6CisJTkVUU0NBUEVfRU5DUllQVEVEX1BLRVlfZnJlZShlbmNrZXkpOworCXJldHVybiByZXQ7CisKKwl9CisKK3N0YXRpYyBSU0EgKmQyaV9SU0FfTkVUXzIoUlNBICoqYSwgQVNOMV9PQ1RFVF9TVFJJTkcgKm9zLAorCQkJICBpbnQgKCpjYikoY2hhciAqYnVmLCBpbnQgbGVuLCBjb25zdCBjaGFyICpwcm9tcHQsCisJCQkJICAgIGludCB2ZXJpZnkpLCBpbnQgc2dja2V5KQorCXsKKwlORVRTQ0FQRV9QS0VZICpwa2V5PU5VTEw7CisJUlNBICpyZXQ9TlVMTDsKKwlpbnQgaSxqOworCXVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07CisJY29uc3QgdW5zaWduZWQgY2hhciAqeno7CisJdW5zaWduZWQgY2hhciBrZXlbRVZQX01BWF9LRVlfTEVOR1RIXTsKKwlFVlBfQ0lQSEVSX0NUWCBjdHg7CisKKwlpPWNiKChjaGFyICopYnVmLDI1NiwiRW50ZXIgUHJpdmF0ZSBLZXkgcGFzc3dvcmQ6IiwwKTsKKwlpZiAoaSAhPSAwKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0QySV9SU0FfTkVUXzIsQVNOMV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJZ290byBlcnI7CisJCX0KKworCWkgPSBzdHJsZW4oKGNoYXIgKilidWYpOworCWlmKHNnY2tleSl7CisJCUVWUF9EaWdlc3QoYnVmLCBpLCBidWYsIE5VTEwsIEVWUF9tZDUoKSwgTlVMTCk7CisJCW1lbWNweShidWYgKyAxNiwgIlNHQ0tFWVNBTFQiLCAxMCk7CisJCWkgPSAyNjsKKwl9CisJCQorCUVWUF9CeXRlc1RvS2V5KEVWUF9yYzQoKSxFVlBfbWQ1KCksTlVMTCxidWYsaSwxLGtleSxOVUxMKTsKKwlPUEVOU1NMX2NsZWFuc2UoYnVmLDI1Nik7CisKKwlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOworCUVWUF9EZWNyeXB0SW5pdF9leCgmY3R4LEVWUF9yYzQoKSxOVUxMLCBrZXksTlVMTCk7CisJRVZQX0RlY3J5cHRVcGRhdGUoJmN0eCxvcy0+ZGF0YSwmaSxvcy0+ZGF0YSxvcy0+bGVuZ3RoKTsKKwlFVlBfRGVjcnlwdEZpbmFsX2V4KCZjdHgsJihvcy0+ZGF0YVtpXSksJmopOworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisJb3MtPmxlbmd0aD1pK2o7CisKKwl6ej1vcy0+ZGF0YTsKKworCWlmICgocGtleT1kMmlfTkVUU0NBUEVfUEtFWShOVUxMLCZ6eixvcy0+bGVuZ3RoKSkgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9EMklfUlNBX05FVF8yLEFTTjFfUl9VTkFCTEVfVE9fREVDT0RFX1JTQV9QUklWQVRFX0tFWSk7CisJCWdvdG8gZXJyOworCQl9CisJCQorCXp6PXBrZXktPnByaXZhdGVfa2V5LT5kYXRhOworCWlmICgocmV0PWQyaV9SU0FQcml2YXRlS2V5KGEsJnp6LHBrZXktPnByaXZhdGVfa2V5LT5sZW5ndGgpKSA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0QySV9SU0FfTkVUXzIsQVNOMV9SX1VOQUJMRV9UT19ERUNPREVfUlNBX0tFWSk7CisJCWdvdG8gZXJyOworCQl9CitlcnI6CisJTkVUU0NBUEVfUEtFWV9mcmVlKHBrZXkpOworCXJldHVybihyZXQpOworCX0KKworI2VuZGlmIC8qIE9QRU5TU0xfTk9fUkM0ICovCisKKyNlbHNlIC8qICFPUEVOU1NMX05PX1JTQSAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL25zc2VxLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9uc3NlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YzQyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9uc3NlcS5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIG5zc2VxLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorCitzdGF0aWMgaW50IG5zc2VxX2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCWlmKG9wZXJhdGlvbiA9PSBBU04xX09QX05FV19QT1NUKSB7CisJCU5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UgKm5zc2VxOworCQluc3NlcSA9IChORVRTQ0FQRV9DRVJUX1NFUVVFTkNFICopKnB2YWw7CisJCW5zc2VxLT50eXBlID0gT0JKX25pZDJvYmooTklEX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UpOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogTmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2Ugc3RydWN0dXJlICovCisKK0FTTjFfU0VRVUVOQ0VfY2IoTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSwgbnNzZXFfY2IpID0geworCUFTTjFfU0lNUExFKE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UsIHR5cGUsIEFTTjFfT0JKRUNUKSwKKwlBU04xX0VYUF9TRVFVRU5DRV9PRl9PUFQoTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSwgY2VydHMsIFg1MDksIDApCit9IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UsIE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhORVRTQ0FQRV9DRVJUX1NFUVVFTkNFKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvcDVfcGJlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9wNV9wYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGJjMzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvcDVfcGJlLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qIHA1X3BiZS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworLyogUEtDUyM1IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gc3RydWN0dXJlICovCisKK0FTTjFfU0VRVUVOQ0UoUEJFUEFSQU0pID0geworCUFTTjFfU0lNUExFKFBCRVBBUkFNLCBzYWx0LCBBU04xX09DVEVUX1NUUklORyksCisJQVNOMV9TSU1QTEUoUEJFUEFSQU0sIGl0ZXIsIEFTTjFfSU5URUdFUikKK30gQVNOMV9TRVFVRU5DRV9FTkQoUEJFUEFSQU0pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQQkVQQVJBTSkKKworCisvKiBTZXQgYW4gYWxnb3JpdGhtIGlkZW50aWZpZXIgZm9yIGEgUEtDUyM1IFBCRSBhbGdvcml0aG0gKi8KKworaW50IFBLQ1M1X3BiZV9zZXQwX2FsZ29yKFg1MDlfQUxHT1IgKmFsZ29yLCBpbnQgYWxnLCBpbnQgaXRlciwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbikKKwl7CisJUEJFUEFSQU0gKnBiZT1OVUxMOworCUFTTjFfU1RSSU5HICpwYmVfc3RyPU5VTEw7CisJdW5zaWduZWQgY2hhciAqc3N0cjsKKworCXBiZSA9IFBCRVBBUkFNX25ldygpOworCWlmICghcGJlKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX1BLQ1M1X1BCRV9TRVQwX0FMR09SLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZihpdGVyIDw9IDApCisJCWl0ZXIgPSBQS0NTNV9ERUZBVUxUX0lURVI7CisJaWYgKCFBU04xX0lOVEVHRVJfc2V0KHBiZS0+aXRlciwgaXRlcikpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfUEtDUzVfUEJFX1NFVDBfQUxHT1IsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmICghc2FsdGxlbikKKwkJc2FsdGxlbiA9IFBLQ1M1X1NBTFRfTEVOOworCWlmICghQVNOMV9TVFJJTkdfc2V0KHBiZS0+c2FsdCwgTlVMTCwgc2FsdGxlbikpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfUEtDUzVfUEJFX1NFVDBfQUxHT1IsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCXNzdHIgPSBBU04xX1NUUklOR19kYXRhKHBiZS0+c2FsdCk7CisJaWYgKHNhbHQpCisJCW1lbWNweShzc3RyLCBzYWx0LCBzYWx0bGVuKTsKKwllbHNlIGlmIChSQU5EX3BzZXVkb19ieXRlcyhzc3RyLCBzYWx0bGVuKSA8IDApCisJCWdvdG8gZXJyOworCisJaWYoIUFTTjFfaXRlbV9wYWNrKHBiZSwgQVNOMV9JVEVNX3JwdHIoUEJFUEFSQU0pLCAmcGJlX3N0cikpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfUEtDUzVfUEJFX1NFVDBfQUxHT1IsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJUEJFUEFSQU1fZnJlZShwYmUpOworCXBiZSA9IE5VTEw7CisKKwlpZiAoWDUwOV9BTEdPUl9zZXQwKGFsZ29yLCBPQkpfbmlkMm9iaihhbGcpLCBWX0FTTjFfU0VRVUVOQ0UsIHBiZV9zdHIpKQorCQlyZXR1cm4gMTsKKworZXJyOgorCWlmIChwYmUgIT0gTlVMTCkKKwkJUEJFUEFSQU1fZnJlZShwYmUpOworCWlmIChwYmVfc3RyICE9IE5VTEwpCisJCUFTTjFfU1RSSU5HX2ZyZWUocGJlX3N0cik7CisJcmV0dXJuIDA7CisJfQorCisvKiBSZXR1cm4gYW4gYWxnb3JpdGhtIGlkZW50aWZpZXIgZm9yIGEgUEtDUyM1IFBCRSBhbGdvcml0aG0gKi8KKworWDUwOV9BTEdPUiAqUEtDUzVfcGJlX3NldChpbnQgYWxnLCBpbnQgaXRlciwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbikKKwl7CisJWDUwOV9BTEdPUiAqcmV0OworCXJldCA9IFg1MDlfQUxHT1JfbmV3KCk7CisJaWYgKCFyZXQpCisJCXsKKwkJQVNOMWVycihBU04xX0ZfUEtDUzVfUEJFX1NFVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAoUEtDUzVfcGJlX3NldDBfYWxnb3IocmV0LCBhbGcsIGl0ZXIsIHNhbHQsIHNhbHRsZW4pKSAKKwkJcmV0dXJuIHJldDsKKworCVg1MDlfQUxHT1JfZnJlZShyZXQpOworCXJldHVybiBOVUxMOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3A1X3BiZXYyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9wNV9wYmV2Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDliNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9wNV9wYmV2Mi5jCkBAIC0wLDAgKzEsMjM1IEBACisvKiBwNV9wYmV2Mi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS0yMDA0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCisvKiBQS0NTIzUgdjIuMCBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIHN0cnVjdHVyZXMgKi8KKworQVNOMV9TRVFVRU5DRShQQkUyUEFSQU0pID0geworCUFTTjFfU0lNUExFKFBCRTJQQVJBTSwga2V5ZnVuYywgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoUEJFMlBBUkFNLCBlbmNyeXB0aW9uLCBYNTA5X0FMR09SKQorfSBBU04xX1NFUVVFTkNFX0VORChQQkUyUEFSQU0pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQQkUyUEFSQU0pCisKK0FTTjFfU0VRVUVOQ0UoUEJLREYyUEFSQU0pID0geworCUFTTjFfU0lNUExFKFBCS0RGMlBBUkFNLCBzYWx0LCBBU04xX0FOWSksCisJQVNOMV9TSU1QTEUoUEJLREYyUEFSQU0sIGl0ZXIsIEFTTjFfSU5URUdFUiksCisJQVNOMV9PUFQoUEJLREYyUEFSQU0sIGtleWxlbmd0aCwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX09QVChQQktERjJQQVJBTSwgcHJmLCBYNTA5X0FMR09SKQorfSBBU04xX1NFUVVFTkNFX0VORChQQktERjJQQVJBTSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBCS0RGMlBBUkFNKQorCisvKiBSZXR1cm4gYW4gYWxnb3JpdGhtIGlkZW50aWZpZXIgZm9yIGEgUEtDUyM1IHYyLjAgUEJFIGFsZ29yaXRobToKKyAqIHllcyBJIGtub3cgdGhpcyBpcyBob3JyaWJsZSEKKyAqCisgKiBFeHRlbmRlZCB2ZXJzaW9uIHRvIGFsbG93IGFwcGxpY2F0aW9uIHN1cHBsaWVkIFBSRiBOSUQgYW5kIElWLgorICovCisKK1g1MDlfQUxHT1IgKlBLQ1M1X3BiZTJfc2V0X2l2KGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgaW50IGl0ZXIsCisJCQkJIHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLAorCQkJCSB1bnNpZ25lZCBjaGFyICphaXYsIGludCBwcmZfbmlkKQoreworCVg1MDlfQUxHT1IgKnNjaGVtZSA9IE5VTEwsICprYWxnID0gTlVMTCwgKnJldCA9IE5VTEw7CisJaW50IGFsZ19uaWQ7CisJRVZQX0NJUEhFUl9DVFggY3R4OworCXVuc2lnbmVkIGNoYXIgaXZbRVZQX01BWF9JVl9MRU5HVEhdOworCVBCS0RGMlBBUkFNICprZGYgPSBOVUxMOworCVBCRTJQQVJBTSAqcGJlMiA9IE5VTEw7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9zYWx0ID0gTlVMTDsKKwlBU04xX09CSkVDVCAqb2JqOworCisJYWxnX25pZCA9IEVWUF9DSVBIRVJfdHlwZShjaXBoZXIpOworCWlmKGFsZ19uaWQgPT0gTklEX3VuZGVmKSB7CisJCUFTTjFlcnIoQVNOMV9GX1BLQ1M1X1BCRTJfU0VUX0lWLAorCQkJCUFTTjFfUl9DSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSKTsKKwkJZ290byBlcnI7CisJfQorCW9iaiA9IE9CSl9uaWQyb2JqKGFsZ19uaWQpOworCisJaWYoIShwYmUyID0gUEJFMlBBUkFNX25ldygpKSkgZ290byBtZXJyOworCisJLyogU2V0dXAgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgZm9yIHRoZSBlbmNyeXB0aW9uIHNjaGVtZSAqLworCXNjaGVtZSA9IHBiZTItPmVuY3J5cHRpb247CisKKwlzY2hlbWUtPmFsZ29yaXRobSA9IG9iajsKKwlpZighKHNjaGVtZS0+cGFyYW1ldGVyID0gQVNOMV9UWVBFX25ldygpKSkgZ290byBtZXJyOworCisJLyogQ3JlYXRlIHJhbmRvbSBJViAqLworCWlmIChFVlBfQ0lQSEVSX2l2X2xlbmd0aChjaXBoZXIpKQorCQl7CisJCWlmIChhaXYpCisJCQltZW1jcHkoaXYsIGFpdiwgRVZQX0NJUEhFUl9pdl9sZW5ndGgoY2lwaGVyKSk7CisJCWVsc2UgaWYgKFJBTkRfcHNldWRvX2J5dGVzKGl2LCBFVlBfQ0lQSEVSX2l2X2xlbmd0aChjaXBoZXIpKSA8IDApCisgIAkJCWdvdG8gZXJyOworCQl9CisKKwlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOworCisJLyogRHVtbXkgY2lwaGVyaW5pdCB0byBqdXN0IHNldHVwIHRoZSBJViwgYW5kIFBSRiAqLworCUVWUF9DaXBoZXJJbml0X2V4KCZjdHgsIGNpcGhlciwgTlVMTCwgTlVMTCwgaXYsIDApOworCWlmKEVWUF9DSVBIRVJfcGFyYW1fdG9fYXNuMSgmY3R4LCBzY2hlbWUtPnBhcmFtZXRlcikgPCAwKSB7CisJCUFTTjFlcnIoQVNOMV9GX1BLQ1M1X1BCRTJfU0VUX0lWLAorCQkJCQlBU04xX1JfRVJST1JfU0VUVElOR19DSVBIRVJfUEFSQU1TKTsKKwkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKwkJZ290byBlcnI7CisJfQorCS8qIElmIHByZiBOSUQgdW5zcGVjaWZpZWQgc2VlIGlmIGNpcGhlciBoYXMgYSBwcmVmZXJlbmNlLgorCSAqIEFuIGVycm9yIGlzIE9LIGhlcmU6IGp1c3QgbWVhbnMgdXNlIGRlZmF1bHQgUFJGLgorCSAqLworCWlmICgocHJmX25pZCA9PSAtMSkgJiYgCisJRVZQX0NJUEhFUl9DVFhfY3RybCgmY3R4LCBFVlBfQ1RSTF9QQkVfUFJGX05JRCwgMCwgJnByZl9uaWQpIDw9IDApCisJCXsKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCXByZl9uaWQgPSBOSURfaG1hY1dpdGhTSEExOworCQl9CisJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKworCWlmKCEoa2RmID0gUEJLREYyUEFSQU1fbmV3KCkpKSBnb3RvIG1lcnI7CisJaWYoIShvc2FsdCA9IE1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpKSBnb3RvIG1lcnI7CisKKwlpZiAoIXNhbHRsZW4pIHNhbHRsZW4gPSBQS0NTNV9TQUxUX0xFTjsKKwlpZiAoIShvc2FsdC0+ZGF0YSA9IE9QRU5TU0xfbWFsbG9jIChzYWx0bGVuKSkpIGdvdG8gbWVycjsKKwlvc2FsdC0+bGVuZ3RoID0gc2FsdGxlbjsKKwlpZiAoc2FsdCkgbWVtY3B5IChvc2FsdC0+ZGF0YSwgc2FsdCwgc2FsdGxlbik7CisJZWxzZSBpZiAoUkFORF9wc2V1ZG9fYnl0ZXMgKG9zYWx0LT5kYXRhLCBzYWx0bGVuKSA8IDApIGdvdG8gbWVycjsKKworCWlmKGl0ZXIgPD0gMCkgaXRlciA9IFBLQ1M1X0RFRkFVTFRfSVRFUjsKKwlpZighQVNOMV9JTlRFR0VSX3NldChrZGYtPml0ZXIsIGl0ZXIpKSBnb3RvIG1lcnI7CisKKwkvKiBOb3cgaW5jbHVkZSBzYWx0IGluIGtkZiBzdHJ1Y3R1cmUgKi8KKwlrZGYtPnNhbHQtPnZhbHVlLm9jdGV0X3N0cmluZyA9IG9zYWx0OworCWtkZi0+c2FsdC0+dHlwZSA9IFZfQVNOMV9PQ1RFVF9TVFJJTkc7CisJb3NhbHQgPSBOVUxMOworCisJLyogSWYgaXRzIFJDMiB0aGVuIHdlJ2QgYmV0dGVyIHNldHVwIHRoZSBrZXkgbGVuZ3RoICovCisKKwlpZihhbGdfbmlkID09IE5JRF9yYzJfY2JjKSB7CisJCWlmKCEoa2RmLT5rZXlsZW5ndGggPSBNX0FTTjFfSU5URUdFUl9uZXcoKSkpIGdvdG8gbWVycjsKKwkJaWYoIUFTTjFfSU5URUdFUl9zZXQgKGtkZi0+a2V5bGVuZ3RoLAorCQkJCSBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoY2lwaGVyKSkpIGdvdG8gbWVycjsKKwl9CisKKwkvKiBwcmYgY2FuIHN0YXkgTlVMTCBpZiB3ZSBhcmUgdXNpbmcgaG1hY1dpdGhTSEExICovCisJaWYgKHByZl9uaWQgIT0gTklEX2htYWNXaXRoU0hBMSkKKwkJeworCQlrZGYtPnByZiA9IFg1MDlfQUxHT1JfbmV3KCk7CisJCWlmICgha2RmLT5wcmYpCisJCQlnb3RvIG1lcnI7CisJCVg1MDlfQUxHT1Jfc2V0MChrZGYtPnByZiwgT0JKX25pZDJvYmoocHJmX25pZCksCisJCQkJCVZfQVNOMV9OVUxMLCBOVUxMKTsKKwkJfQorCisJLyogTm93IHNldHVwIHRoZSBQQkUyUEFSQU0ga2V5ZnVuYyBzdHJ1Y3R1cmUgKi8KKworCXBiZTItPmtleWZ1bmMtPmFsZ29yaXRobSA9IE9CSl9uaWQyb2JqKE5JRF9pZF9wYmtkZjIpOworCisJLyogRW5jb2RlIFBCS0RGMlBBUkFNIGludG8gcGFyYW1ldGVyIG9mIHBiZTIgKi8KKworCWlmKCEocGJlMi0+a2V5ZnVuYy0+cGFyYW1ldGVyID0gQVNOMV9UWVBFX25ldygpKSkgZ290byBtZXJyOworCisJaWYoIUFTTjFfaXRlbV9wYWNrKGtkZiwgQVNOMV9JVEVNX3JwdHIoUEJLREYyUEFSQU0pLAorCQkJICZwYmUyLT5rZXlmdW5jLT5wYXJhbWV0ZXItPnZhbHVlLnNlcXVlbmNlKSkgZ290byBtZXJyOworCXBiZTItPmtleWZ1bmMtPnBhcmFtZXRlci0+dHlwZSA9IFZfQVNOMV9TRVFVRU5DRTsKKworCVBCS0RGMlBBUkFNX2ZyZWUoa2RmKTsKKwlrZGYgPSBOVUxMOworCisJLyogTm93IHNldCB1cCB0b3AgbGV2ZWwgQWxnb3JpdGhtSWRlbnRpZmllciAqLworCisJaWYoIShyZXQgPSBYNTA5X0FMR09SX25ldygpKSkgZ290byBtZXJyOworCWlmKCEocmV0LT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCkpKSBnb3RvIG1lcnI7CisKKwlyZXQtPmFsZ29yaXRobSA9IE9CSl9uaWQyb2JqKE5JRF9wYmVzMik7CisKKwkvKiBFbmNvZGUgUEJFMlBBUkFNIGludG8gcGFyYW1ldGVyICovCisKKwlpZighQVNOMV9pdGVtX3BhY2socGJlMiwgQVNOMV9JVEVNX3JwdHIoUEJFMlBBUkFNKSwKKwkJCQkgJnJldC0+cGFyYW1ldGVyLT52YWx1ZS5zZXF1ZW5jZSkpIGdvdG8gbWVycjsKKwlyZXQtPnBhcmFtZXRlci0+dHlwZSA9IFZfQVNOMV9TRVFVRU5DRTsKKworCVBCRTJQQVJBTV9mcmVlKHBiZTIpOworCXBiZTIgPSBOVUxMOworCisJcmV0dXJuIHJldDsKKworCW1lcnI6CisJQVNOMWVycihBU04xX0ZfUEtDUzVfUEJFMl9TRVRfSVYsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCisJZXJyOgorCVBCRTJQQVJBTV9mcmVlKHBiZTIpOworCS8qIE5vdGUgJ3NjaGVtZScgaXMgZnJlZWQgYXMgcGFydCBvZiBwYmUyICovCisJTV9BU04xX09DVEVUX1NUUklOR19mcmVlKG9zYWx0KTsKKwlQQktERjJQQVJBTV9mcmVlKGtkZik7CisJWDUwOV9BTEdPUl9mcmVlKGthbGcpOworCVg1MDlfQUxHT1JfZnJlZShyZXQpOworCisJcmV0dXJuIE5VTEw7CisKK30KKworWDUwOV9BTEdPUiAqUEtDUzVfcGJlMl9zZXQoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBpbnQgaXRlciwKKwkJCQkgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4pCisJeworCXJldHVybiBQS0NTNV9wYmUyX3NldF9pdihjaXBoZXIsIGl0ZXIsIHNhbHQsIHNhbHRsZW4sIE5VTEwsIC0xKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9wOF9wa2V5LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS9wOF9wa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiNjhkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3A4X3BrZXkuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogcDhfcGtleS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisvKiBNaW5vciB0d2VhayB0byBvcGVyYXRpb246IHplcm8gcHJpdmF0ZSBrZXkgZGF0YSAqLworc3RhdGljIGludCBwa2V5X2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCS8qIFNpbmNlIHRoZSBzdHJ1Y3R1cmUgbXVzdCBzdGlsbCBiZSB2YWxpZCB1c2UgQVNOMV9PUF9GUkVFX1BSRSAqLworCWlmKG9wZXJhdGlvbiA9PSBBU04xX09QX0ZSRUVfUFJFKSB7CisJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKmtleSA9IChQS0NTOF9QUklWX0tFWV9JTkZPICopKnB2YWw7CisJCWlmIChrZXktPnBrZXktPnZhbHVlLm9jdGV0X3N0cmluZykKKwkJT1BFTlNTTF9jbGVhbnNlKGtleS0+cGtleS0+dmFsdWUub2N0ZXRfc3RyaW5nLT5kYXRhLAorCQkJa2V5LT5wa2V5LT52YWx1ZS5vY3RldF9zdHJpbmctPmxlbmd0aCk7CisJfQorCXJldHVybiAxOworfQorCitBU04xX1NFUVVFTkNFX2NiKFBLQ1M4X1BSSVZfS0VZX0lORk8sIHBrZXlfY2IpID0geworCUFTTjFfU0lNUExFKFBLQ1M4X1BSSVZfS0VZX0lORk8sIHZlcnNpb24sIEFTTjFfSU5URUdFUiksCisJQVNOMV9TSU1QTEUoUEtDUzhfUFJJVl9LRVlfSU5GTywgcGtleWFsZywgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoUEtDUzhfUFJJVl9LRVlfSU5GTywgcGtleSwgQVNOMV9BTlkpLAorCUFTTjFfSU1QX1NFVF9PRl9PUFQoUEtDUzhfUFJJVl9LRVlfSU5GTywgYXR0cmlidXRlcywgWDUwOV9BVFRSSUJVVEUsIDApCit9IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKFBLQ1M4X1BSSVZfS0VZX0lORk8sIFBLQ1M4X1BSSVZfS0VZX0lORk8pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQS0NTOF9QUklWX0tFWV9JTkZPKQorCitpbnQgUEtDUzhfcGtleV9zZXQwKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnByaXYsIEFTTjFfT0JKRUNUICphb2JqLAorCQkJCQlpbnQgdmVyc2lvbiwKKwkJCQkJaW50IHB0eXBlLCB2b2lkICpwdmFsLAorCQkJCQl1bnNpZ25lZCBjaGFyICpwZW5jLCBpbnQgcGVuY2xlbikKKwl7CisJdW5zaWduZWQgY2hhciAqKnBwZW5jID0gTlVMTDsKKwlpZiAodmVyc2lvbiA+PSAwKQorCQl7CisJCWlmICghQVNOMV9JTlRFR0VSX3NldChwcml2LT52ZXJzaW9uLCB2ZXJzaW9uKSkKKwkJCXJldHVybiAwOworCQl9CisJaWYgKHBlbmMpCisJCXsKKwkJaW50IHBtdHlwZTsKKwkJQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdDsKKwkJb2N0ID0gQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCk7CisJCWlmICghb2N0KQorCQkJcmV0dXJuIDA7CisJCW9jdC0+ZGF0YSA9IHBlbmM7CisJCXBwZW5jID0gJm9jdC0+ZGF0YTsKKwkJb2N0LT5sZW5ndGggPSBwZW5jbGVuOworCQlpZiAocHJpdi0+YnJva2VuID09IFBLQ1M4X05PX09DVEVUKQorCQkJcG10eXBlID0gVl9BU04xX1NFUVVFTkNFOworCQllbHNlCisJCQlwbXR5cGUgPSBWX0FTTjFfT0NURVRfU1RSSU5HOworCQlBU04xX1RZUEVfc2V0KHByaXYtPnBrZXksIHBtdHlwZSwgb2N0KTsKKwkJfQorCWlmICghWDUwOV9BTEdPUl9zZXQwKHByaXYtPnBrZXlhbGcsIGFvYmosIHB0eXBlLCBwdmFsKSkKKwkJeworCQkvKiBJZiBjYWxsIGZhaWxzIGRvIG5vdCBzd2FsbG93ICdlbmMnICovCisJCWlmIChwcGVuYykKKwkJCSpwcGVuYyA9IE5VTEw7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCitpbnQgUEtDUzhfcGtleV9nZXQwKEFTTjFfT0JKRUNUICoqcHBrYWxnLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGssIGludCAqcHBrbGVuLAorCQlYNTA5X0FMR09SICoqcGEsCisJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KQorCXsKKwlpZiAocHBrYWxnKQorCQkqcHBrYWxnID0gcDgtPnBrZXlhbGctPmFsZ29yaXRobTsKKwlpZihwOC0+cGtleS0+dHlwZSA9PSBWX0FTTjFfT0NURVRfU1RSSU5HKQorCQl7CisJCXA4LT5icm9rZW4gPSBQS0NTOF9PSzsKKwkJaWYgKHBrKQorCQkJeworCQkJKnBrID0gcDgtPnBrZXktPnZhbHVlLm9jdGV0X3N0cmluZy0+ZGF0YTsKKwkJCSpwcGtsZW4gPSBwOC0+cGtleS0+dmFsdWUub2N0ZXRfc3RyaW5nLT5sZW5ndGg7CisJCQl9CisJCX0KKwllbHNlIGlmIChwOC0+cGtleS0+dHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpCisJCXsKKwkJcDgtPmJyb2tlbiA9IFBLQ1M4X05PX09DVEVUOworCQlpZiAocGspCisJCQl7CisJCQkqcGsgPSBwOC0+cGtleS0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisJCQkqcHBrbGVuID0gcDgtPnBrZXktPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGg7CisJCQl9CisJCX0KKwllbHNlCisJCXJldHVybiAwOworCWlmIChwYSkKKwkJKnBhID0gcDgtPnBrZXlhbGc7CisJcmV0dXJuIDE7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90X2JpdHN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90X2JpdHN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1OWEyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3RfYml0c3QuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogdF9iaXRzdC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK2ludCBBU04xX0JJVF9TVFJJTkdfbmFtZV9wcmludChCSU8gKm91dCwgQVNOMV9CSVRfU1RSSU5HICpicywKKwkJCQlCSVRfU1RSSU5HX0JJVE5BTUUgKnRibCwgaW50IGluZGVudCkKK3sKKwlCSVRfU1RSSU5HX0JJVE5BTUUgKmJuYW07CisJY2hhciBmaXJzdCA9IDE7CisJQklPX3ByaW50ZihvdXQsICIlKnMiLCBpbmRlbnQsICIiKTsKKwlmb3IoYm5hbSA9IHRibDsgYm5hbS0+bG5hbWU7IGJuYW0rKykgeworCQlpZihBU04xX0JJVF9TVFJJTkdfZ2V0X2JpdChicywgYm5hbS0+Yml0bnVtKSkgeworCQkJaWYoIWZpcnN0KSBCSU9fcHV0cyhvdXQsICIsICIpOworCQkJQklPX3B1dHMob3V0LCBibmFtLT5sbmFtZSk7CisJCQlmaXJzdCA9IDA7CisJCX0KKwl9CisJQklPX3B1dHMob3V0LCAiXG4iKTsKKwlyZXR1cm4gMTsKK30KKworaW50IEFTTjFfQklUX1NUUklOR19zZXRfYXNjKEFTTjFfQklUX1NUUklORyAqYnMsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKKwkJCQlCSVRfU1RSSU5HX0JJVE5BTUUgKnRibCkKK3sKKwlpbnQgYml0bnVtOworCWJpdG51bSA9IEFTTjFfQklUX1NUUklOR19udW1fYXNjKG5hbWUsIHRibCk7CisJaWYoYml0bnVtIDwgMCkgcmV0dXJuIDA7CisJaWYoYnMpIHsKKwkJaWYoIUFTTjFfQklUX1NUUklOR19zZXRfYml0KGJzLCBiaXRudW0sIHZhbHVlKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IEFTTjFfQklUX1NUUklOR19udW1fYXNjKGNoYXIgKm5hbWUsIEJJVF9TVFJJTkdfQklUTkFNRSAqdGJsKQoreworCUJJVF9TVFJJTkdfQklUTkFNRSAqYm5hbTsKKwlmb3IoYm5hbSA9IHRibDsgYm5hbS0+bG5hbWU7IGJuYW0rKykgeworCQlpZighc3RyY21wKGJuYW0tPnNuYW1lLCBuYW1lKSB8fAorCQkJIXN0cmNtcChibmFtLT5sbmFtZSwgbmFtZSkgKSByZXR1cm4gYm5hbS0+Yml0bnVtOworCX0KKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90X2NybC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvdF9jcmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGIyNDRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvdF9jcmwuYwpAQCAtMCwwICsxLDEzNCBAQAorLyogdF9jcmwuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgWDUwOV9DUkxfcHJpbnRfZnAoRklMRSAqZnAsIFg1MDlfQ1JMICp4KQorICAgICAgICB7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfQ1JMX1BSSU5UX0ZQLEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOworICAgICAgICByZXQ9WDUwOV9DUkxfcHJpbnQoYiwgeCk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK2ludCBYNTA5X0NSTF9wcmludChCSU8gKm91dCwgWDUwOV9DUkwgKngpCit7CisJU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKSAqcmV2OworCVg1MDlfUkVWT0tFRCAqcjsKKwlsb25nIGw7CisJaW50IGksIG47CisJY2hhciAqcDsKKworCUJJT19wcmludGYob3V0LCAiQ2VydGlmaWNhdGUgUmV2b2NhdGlvbiBMaXN0IChDUkwpOlxuIik7CisJbCA9IFg1MDlfQ1JMX2dldF92ZXJzaW9uKHgpOworCUJJT19wcmludGYob3V0LCAiJThzVmVyc2lvbiAlbHUgKDB4JWx4KVxuIiwgIiIsIGwrMSwgbCk7CisJaSA9IE9CSl9vYmoybmlkKHgtPnNpZ19hbGctPmFsZ29yaXRobSk7CisJQklPX3ByaW50ZihvdXQsICIlOHNTaWduYXR1cmUgQWxnb3JpdGhtOiAlc1xuIiwgIiIsCisJCQkJIChpID09IE5JRF91bmRlZikgPyAiTk9ORSIgOiBPQkpfbmlkMmxuKGkpKTsKKwlwPVg1MDlfTkFNRV9vbmVsaW5lKFg1MDlfQ1JMX2dldF9pc3N1ZXIoeCksTlVMTCwwKTsKKwlCSU9fcHJpbnRmKG91dCwiJThzSXNzdWVyOiAlc1xuIiwiIixwKTsKKwlPUEVOU1NMX2ZyZWUocCk7CisJQklPX3ByaW50ZihvdXQsIiU4c0xhc3QgVXBkYXRlOiAiLCIiKTsKKwlBU04xX1RJTUVfcHJpbnQob3V0LFg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKHgpKTsKKwlCSU9fcHJpbnRmKG91dCwiXG4lOHNOZXh0IFVwZGF0ZTogIiwiIik7CisJaWYgKFg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKHgpKQorCQkgQVNOMV9USU1FX3ByaW50KG91dCxYNTA5X0NSTF9nZXRfbmV4dFVwZGF0ZSh4KSk7CisJZWxzZSBCSU9fcHJpbnRmKG91dCwiTk9ORSIpOworCUJJT19wcmludGYob3V0LCJcbiIpOworCisJbj1YNTA5X0NSTF9nZXRfZXh0X2NvdW50KHgpOworCVg1MDlWM19leHRlbnNpb25zX3ByaW50KG91dCwgIkNSTCBleHRlbnNpb25zIiwKKwkJCQkJCXgtPmNybC0+ZXh0ZW5zaW9ucywgMCwgOCk7CisKKwlyZXYgPSBYNTA5X0NSTF9nZXRfUkVWT0tFRCh4KTsKKworCWlmKHNrX1g1MDlfUkVWT0tFRF9udW0ocmV2KSA+IDApCisJICAgIEJJT19wcmludGYob3V0LCAiUmV2b2tlZCBDZXJ0aWZpY2F0ZXM6XG4iKTsKKwllbHNlIEJJT19wcmludGYob3V0LCAiTm8gUmV2b2tlZCBDZXJ0aWZpY2F0ZXMuXG4iKTsKKworCWZvcihpID0gMDsgaSA8IHNrX1g1MDlfUkVWT0tFRF9udW0ocmV2KTsgaSsrKSB7CisJCXIgPSBza19YNTA5X1JFVk9LRURfdmFsdWUocmV2LCBpKTsKKwkJQklPX3ByaW50ZihvdXQsIiAgICBTZXJpYWwgTnVtYmVyOiAiKTsKKwkJaTJhX0FTTjFfSU5URUdFUihvdXQsci0+c2VyaWFsTnVtYmVyKTsKKwkJQklPX3ByaW50ZihvdXQsIlxuICAgICAgICBSZXZvY2F0aW9uIERhdGU6ICIpOworCQlBU04xX1RJTUVfcHJpbnQob3V0LHItPnJldm9jYXRpb25EYXRlKTsKKwkJQklPX3ByaW50ZihvdXQsIlxuIik7CisJCVg1MDlWM19leHRlbnNpb25zX3ByaW50KG91dCwgIkNSTCBlbnRyeSBleHRlbnNpb25zIiwKKwkJCQkJCXItPmV4dGVuc2lvbnMsIDAsIDgpOworCX0KKwlYNTA5X3NpZ25hdHVyZV9wcmludChvdXQsIHgtPnNpZ19hbGcsIHgtPnNpZ25hdHVyZSk7CisKKwlyZXR1cm4gMTsKKworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvdF9wa2V5LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90X3BrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQxOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvdF9wa2V5LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIGNyeXB0by9hc24xL3RfcGtleS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKK2ludCBBU04xX2JuX3ByaW50KEJJTyAqYnAsIGNvbnN0IGNoYXIgKm51bWJlciwgY29uc3QgQklHTlVNICpudW0sCisJCQl1bnNpZ25lZCBjaGFyICpidWYsIGludCBvZmYpCisJeworCWludCBuLGk7CisJY29uc3QgY2hhciAqbmVnOworCisJaWYgKG51bSA9PSBOVUxMKSByZXR1cm4oMSk7CisJbmVnID0gKEJOX2lzX25lZ2F0aXZlKG51bSkpPyItIjoiIjsKKwlpZighQklPX2luZGVudChicCxvZmYsMTI4KSkKKwkJcmV0dXJuIDA7CisJaWYgKEJOX2lzX3plcm8obnVtKSkKKwkJeworCQlpZiAoQklPX3ByaW50ZihicCwgIiVzIDBcbiIsIG51bWJlcikgPD0gMCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gMTsKKwkJfQorCisJaWYgKEJOX251bV9ieXRlcyhudW0pIDw9IEJOX0JZVEVTKQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIlcyAlcyVsdSAoJXMweCVseClcbiIsbnVtYmVyLG5lZywKKwkJCSh1bnNpZ25lZCBsb25nKW51bS0+ZFswXSxuZWcsKHVuc2lnbmVkIGxvbmcpbnVtLT5kWzBdKQorCQkJPD0gMCkgcmV0dXJuKDApOworCQl9CisJZWxzZQorCQl7CisJCWJ1ZlswXT0wOworCQlpZiAoQklPX3ByaW50ZihicCwiJXMlcyIsbnVtYmVyLAorCQkJKG5lZ1swXSA9PSAnLScpPyIgKE5lZ2F0aXZlKSI6IiIpIDw9IDApCisJCQlyZXR1cm4oMCk7CisJCW49Qk5fYm4yYmluKG51bSwmYnVmWzFdKTsKKwkKKwkJaWYgKGJ1ZlsxXSAmIDB4ODApCisJCQluKys7CisJCWVsc2UJYnVmKys7CisKKwkJZm9yIChpPTA7IGk8bjsgaSsrKQorCQkJeworCQkJaWYgKChpJTE1KSA9PSAwKQorCQkJCXsKKwkJCQlpZihCSU9fcHV0cyhicCwiXG4iKSA8PSAwCisJCQkJICAgfHwgIUJJT19pbmRlbnQoYnAsb2ZmKzQsMTI4KSkKKwkJCQkgICAgcmV0dXJuIDA7CisJCQkJfQorCQkJaWYgKEJJT19wcmludGYoYnAsIiUwMnglcyIsYnVmW2ldLCgoaSsxKSA9PSBuKT8iIjoiOiIpCisJCQkJPD0gMCkgcmV0dXJuKDApOworCQkJfQorCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgcmV0dXJuKDApOworCQl9CisJcmV0dXJuKDEpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3RfcmVxLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90X3JlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTc5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90X3JlcS5jCkBAIC0wLDAgKzEsMjY2IEBACisvKiBjcnlwdG8vYXNuMS90X3JlcS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgWDUwOV9SRVFfcHJpbnRfZnAoRklMRSAqZnAsIFg1MDlfUkVRICp4KQorICAgICAgICB7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfUkVRX1BSSU5UX0ZQLEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOworICAgICAgICByZXQ9WDUwOV9SRVFfcHJpbnQoYiwgeCk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK2ludCBYNTA5X1JFUV9wcmludF9leChCSU8gKmJwLCBYNTA5X1JFUSAqeCwgdW5zaWduZWQgbG9uZyBubWZsYWdzLCB1bnNpZ25lZCBsb25nIGNmbGFnKQorCXsKKwl1bnNpZ25lZCBsb25nIGw7CisJaW50IGk7CisJY29uc3QgY2hhciAqbmVnOworCVg1MDlfUkVRX0lORk8gKnJpOworCUVWUF9QS0VZICpwa2V5OworCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2s7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRzOworCWNoYXIgbWxjaCA9ICcgJzsKKwlpbnQgbm1pbmRlbnQgPSAwOworCisJaWYoKG5tZmxhZ3MgJiBYTl9GTEFHX1NFUF9NQVNLKSA9PSBYTl9GTEFHX1NFUF9NVUxUSUxJTkUpIHsKKwkJbWxjaCA9ICdcbic7CisJCW5taW5kZW50ID0gMTI7CisJfQorCisJaWYobm1mbGFncyA9PSBYNTA5X0ZMQUdfQ09NUEFUKQorCQlubWluZGVudCA9IDE2OworCisKKwlyaT14LT5yZXFfaW5mbzsKKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX0hFQURFUikpCisJCXsKKwkJaWYgKEJJT193cml0ZShicCwiQ2VydGlmaWNhdGUgUmVxdWVzdDpcbiIsMjEpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCIgICAgRGF0YTpcbiIsMTApIDw9IDApIGdvdG8gZXJyOworCQl9CisJaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19WRVJTSU9OKSkKKwkJeworCQluZWc9KHJpLT52ZXJzaW9uLT50eXBlID09IFZfQVNOMV9ORUdfSU5URUdFUik/Ii0iOiIiOworCQlsPTA7CisJCWZvciAoaT0wOyBpPHJpLT52ZXJzaW9uLT5sZW5ndGg7IGkrKykKKwkJCXsgbDw8PTg7IGwrPXJpLT52ZXJzaW9uLT5kYXRhW2ldOyB9CisJCWlmKEJJT19wcmludGYoYnAsIiU4c1ZlcnNpb246ICVzJWx1ICglczB4JWx4KVxuIiwiIixuZWcsbCxuZWcsCisJCQkgICAgICBsKSA8PSAwKQorCQkgICAgZ290byBlcnI7CisJCX0KKyAgICAgICAgaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19TVUJKRUNUKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEJJT19wcmludGYoYnAsIiAgICAgICAgU3ViamVjdDolYyIsbWxjaCkgPD0gMCkgZ290byBlcnI7CisgICAgICAgICAgICAgICAgaWYgKFg1MDlfTkFNRV9wcmludF9leChicCxyaS0+c3ViamVjdCxubWluZGVudCwgbm1mbGFncykgPCAwKSBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICBpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlcnI7CisgICAgICAgICAgICAgICAgfQorCWlmKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fUFVCS0VZKSkKKwkJeworCQlpZiAoQklPX3dyaXRlKGJwLCIgICAgICAgIFN1YmplY3QgUHVibGljIEtleSBJbmZvOlxuIiwzMykgPD0gMCkKKwkJCWdvdG8gZXJyOworCQlpZiAoQklPX3ByaW50ZihicCwiJTEyc1B1YmxpYyBLZXkgQWxnb3JpdGhtOiAiLCIiKSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChpMmFfQVNOMV9PQkpFQ1QoYnAsIHJpLT5wdWJrZXktPmFsZ29yLT5hbGdvcml0aG0pIDw9IDApCisJCQlnb3RvIGVycjsKKwkJaWYgKEJJT19wdXRzKGJwLCAiXG4iKSA8PSAwKQorCQkJZ290byBlcnI7CisKKwkJcGtleT1YNTA5X1JFUV9nZXRfcHVia2V5KHgpOworCQlpZiAocGtleSA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihicCwiJTEyc1VuYWJsZSB0byBsb2FkIFB1YmxpYyBLZXlcbiIsIiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhicCk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUVWUF9QS0VZX3ByaW50X3B1YmxpYyhicCwgcGtleSwgMTYsIE5VTEwpOworCQkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwkJCX0KKwkJfQorCisJaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19BVFRSSUJVVEVTKSkKKwkJeworCQkvKiBtYXkgbm90IGJlICovCisJCWlmKEJJT19wcmludGYoYnAsIiU4c0F0dHJpYnV0ZXM6XG4iLCIiKSA8PSAwKQorCQkgICAgZ290byBlcnI7CisKKwkJc2s9eC0+cmVxX2luZm8tPmF0dHJpYnV0ZXM7CisJCWlmIChza19YNTA5X0FUVFJJQlVURV9udW0oc2spID09IDApCisJCQl7CisJCQlpZihCSU9fcHJpbnRmKGJwLCIlMTJzYTA6MDBcbiIsIiIpIDw9IDApCisJCQkgICAgZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWZvciAoaT0wOyBpPHNrX1g1MDlfQVRUUklCVVRFX251bShzayk7IGkrKykKKwkJCQl7CisJCQkJQVNOMV9UWVBFICphdDsKKwkJCQlYNTA5X0FUVFJJQlVURSAqYTsKKwkJCQlBU04xX0JJVF9TVFJJTkcgKmJzPU5VTEw7CisJCQkJQVNOMV9UWVBFICp0OworCQkJCWludCBqLHR5cGU9MCxjb3VudD0xLGlpPTA7CisKKwkJCQlhPXNrX1g1MDlfQVRUUklCVVRFX3ZhbHVlKHNrLGkpOworCQkJCWlmKFg1MDlfUkVRX2V4dGVuc2lvbl9uaWQoT0JKX29iajJuaWQoYS0+b2JqZWN0KSkpCisJCQkJCQkJCQljb250aW51ZTsKKwkJCQlpZihCSU9fcHJpbnRmKGJwLCIlMTJzIiwiIikgPD0gMCkKKwkJCQkgICAgZ290byBlcnI7CisJCQkJaWYgKChqPWkyYV9BU04xX09CSkVDVChicCxhLT5vYmplY3QpKSA+IDApCisJCQkJeworCQkJCWlmIChhLT5zaW5nbGUpCisJCQkJCXsKKwkJCQkJdD1hLT52YWx1ZS5zaW5nbGU7CisJCQkJCXR5cGU9dC0+dHlwZTsKKwkJCQkJYnM9dC0+dmFsdWUuYml0X3N0cmluZzsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpaT0wOworCQkJCQljb3VudD1za19BU04xX1RZUEVfbnVtKGEtPnZhbHVlLnNldCk7CitnZXRfbmV4dDoKKwkJCQkJYXQ9c2tfQVNOMV9UWVBFX3ZhbHVlKGEtPnZhbHVlLnNldCxpaSk7CisJCQkJCXR5cGU9YXQtPnR5cGU7CisJCQkJCWJzPWF0LT52YWx1ZS5hc24xX3N0cmluZzsKKwkJCQkJfQorCQkJCX0KKwkJCQlmb3IgKGo9MjUtajsgaj4wOyBqLS0pCisJCQkJCWlmIChCSU9fd3JpdGUoYnAsIiAiLDEpICE9IDEpIGdvdG8gZXJyOworCQkJCWlmIChCSU9fcHV0cyhicCwiOiIpIDw9IDApIGdvdG8gZXJyOworCQkJCWlmICgJKHR5cGUgPT0gVl9BU04xX1BSSU5UQUJMRVNUUklORykgfHwKKwkJCQkJKHR5cGUgPT0gVl9BU04xX1Q2MVNUUklORykgfHwKKwkJCQkJKHR5cGUgPT0gVl9BU04xX0lBNVNUUklORykpCisJCQkJCXsKKwkJCQkJaWYgKEJJT193cml0ZShicCwoY2hhciAqKWJzLT5kYXRhLGJzLT5sZW5ndGgpCisJCQkJCQkhPSBicy0+bGVuZ3RoKQorCQkJCQkJZ290byBlcnI7CisJCQkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCUJJT19wdXRzKGJwLCJ1bmFibGUgdG8gcHJpbnQgYXR0cmlidXRlXG4iKTsKKwkJCQkJfQorCQkJCWlmICgrK2lpIDwgY291bnQpIGdvdG8gZ2V0X25leHQ7CisJCQkJfQorCQkJfQorCQl9CisJaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19FWFRFTlNJT05TKSkKKwkJeworCQlleHRzID0gWDUwOV9SRVFfZ2V0X2V4dGVuc2lvbnMoeCk7CisJCWlmKGV4dHMpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJwLCIlOHNSZXF1ZXN0ZWQgRXh0ZW5zaW9uczpcbiIsIiIpOworCQkJZm9yIChpPTA7IGk8c2tfWDUwOV9FWFRFTlNJT05fbnVtKGV4dHMpOyBpKyspCisJCQkJeworCQkJCUFTTjFfT0JKRUNUICpvYmo7CisJCQkJWDUwOV9FWFRFTlNJT04gKmV4OworCQkJCWludCBqOworCQkJCWV4PXNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKGV4dHMsIGkpOworCQkJCWlmIChCSU9fcHJpbnRmKGJwLCIlMTJzIiwiIikgPD0gMCkgZ290byBlcnI7CisJCQkJb2JqPVg1MDlfRVhURU5TSU9OX2dldF9vYmplY3QoZXgpOworCQkJCWkyYV9BU04xX09CSkVDVChicCxvYmopOworCQkJCWo9WDUwOV9FWFRFTlNJT05fZ2V0X2NyaXRpY2FsKGV4KTsKKwkJCQlpZiAoQklPX3ByaW50ZihicCwiOiAlc1xuIixqPyJjcml0aWNhbCI6IiIpIDw9IDApCisJCQkJCWdvdG8gZXJyOworCQkJCWlmKCFYNTA5VjNfRVhUX3ByaW50KGJwLCBleCwgY2ZsYWcsIDE2KSkKKwkJCQkJeworCQkJCQlCSU9fcHJpbnRmKGJwLCAiJTE2cyIsICIiKTsKKwkJCQkJTV9BU04xX09DVEVUX1NUUklOR19wcmludChicCxleC0+dmFsdWUpOworCQkJCQl9CisJCQkJaWYgKEJJT193cml0ZShicCwiXG4iLDEpIDw9IDApIGdvdG8gZXJyOworCQkJCX0KKwkJCXNrX1g1MDlfRVhURU5TSU9OX3BvcF9mcmVlKGV4dHMsIFg1MDlfRVhURU5TSU9OX2ZyZWUpOworCQkJfQorCQl9CisKKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1NJR0RVTVApKQorCQl7CisJCWlmKCFYNTA5X3NpZ25hdHVyZV9wcmludChicCwgeC0+c2lnX2FsZywgeC0+c2lnbmF0dXJlKSkgZ290byBlcnI7CisJCX0KKworCXJldHVybigxKTsKK2VycjoKKwlYNTA5ZXJyKFg1MDlfRl9YNTA5X1JFUV9QUklOVF9FWCxFUlJfUl9CVUZfTElCKTsKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgWDUwOV9SRVFfcHJpbnQoQklPICpicCwgWDUwOV9SRVEgKngpCisJeworCXJldHVybiBYNTA5X1JFUV9wcmludF9leChicCwgeCwgWE5fRkxBR19DT01QQVQsIFg1MDlfRkxBR19DT01QQVQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rfc3BraS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvdF9zcGtpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5YzA4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rfc3BraS5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiB0X3Nwa2kuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworLyogUHJpbnQgb3V0IGFuIFNQS0kgKi8KKworaW50IE5FVFNDQVBFX1NQS0lfcHJpbnQoQklPICpvdXQsIE5FVFNDQVBFX1NQS0kgKnNwa2kpCit7CisJRVZQX1BLRVkgKnBrZXk7CisJQVNOMV9JQTVTVFJJTkcgKmNoYWw7CisJaW50IGksIG47CisJY2hhciAqczsKKwlCSU9fcHJpbnRmKG91dCwgIk5ldHNjYXBlIFNQS0k6XG4iKTsKKwlpPU9CSl9vYmoybmlkKHNwa2ktPnNwa2FjLT5wdWJrZXktPmFsZ29yLT5hbGdvcml0aG0pOworCUJJT19wcmludGYob3V0LCIgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiAlc1xuIiwKKwkJCQkoaSA9PSBOSURfdW5kZWYpPyJVTktOT1dOIjpPQkpfbmlkMmxuKGkpKTsKKwlwa2V5ID0gWDUwOV9QVUJLRVlfZ2V0KHNwa2ktPnNwa2FjLT5wdWJrZXkpOworCWlmKCFwa2V5KSBCSU9fcHJpbnRmKG91dCwgIiAgVW5hYmxlIHRvIGxvYWQgcHVibGljIGtleVxuIik7CisJZWxzZQorCQl7CisJCUVWUF9QS0VZX3ByaW50X3B1YmxpYyhvdXQsIHBrZXksIDQsIE5VTEwpOworCQlFVlBfUEtFWV9mcmVlKHBrZXkpOworCQl9CisJY2hhbCA9IHNwa2ktPnNwa2FjLT5jaGFsbGVuZ2U7CisJaWYoY2hhbC0+bGVuZ3RoKQorCQlCSU9fcHJpbnRmKG91dCwgIiAgQ2hhbGxlbmdlIFN0cmluZzogJXNcbiIsIGNoYWwtPmRhdGEpOworCWk9T0JKX29iajJuaWQoc3BraS0+c2lnX2FsZ29yLT5hbGdvcml0aG0pOworCUJJT19wcmludGYob3V0LCIgIFNpZ25hdHVyZSBBbGdvcml0aG06ICVzIiwKKwkJCQkoaSA9PSBOSURfdW5kZWYpPyJVTktOT1dOIjpPQkpfbmlkMmxuKGkpKTsKKworCW49c3BraS0+c2lnbmF0dXJlLT5sZW5ndGg7CisJcz0oY2hhciAqKXNwa2ktPnNpZ25hdHVyZS0+ZGF0YTsKKwlmb3IgKGk9MDsgaTxuOyBpKyspCisJCXsKKwkJaWYgKChpJTE4KSA9PSAwKSBCSU9fd3JpdGUob3V0LCJcbiAgICAgICIsNyk7CisJCUJJT19wcmludGYob3V0LCIlMDJ4JXMiLCh1bnNpZ25lZCBjaGFyKXNbaV0sCisJCQkJCQkoKGkrMSkgPT0gbik/IiI6IjoiKTsKKwkJfQorCUJJT193cml0ZShvdXQsIlxuIiwxKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3RfeDUwOS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEvdF94NTA5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MWYyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3RfeDUwOS5jCkBAIC0wLDAgKzEsNDkzIEBACisvKiBjcnlwdG8vYXNuMS90X3g1MDkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgWDUwOV9wcmludF9mcChGSUxFICpmcCwgWDUwOSAqeCkKKwl7CisJcmV0dXJuIFg1MDlfcHJpbnRfZXhfZnAoZnAsIHgsIFhOX0ZMQUdfQ09NUEFULCBYNTA5X0ZMQUdfQ09NUEFUKTsKKwl9CisKK2ludCBYNTA5X3ByaW50X2V4X2ZwKEZJTEUgKmZwLCBYNTA5ICp4LCB1bnNpZ25lZCBsb25nIG5tZmxhZywgdW5zaWduZWQgbG9uZyBjZmxhZykKKyAgICAgICAgeworICAgICAgICBCSU8gKmI7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1BSSU5UX0VYX0ZQLEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOworICAgICAgICByZXQ9WDUwOV9wcmludF9leChiLCB4LCBubWZsYWcsIGNmbGFnKTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybihyZXQpOworICAgICAgICB9CisjZW5kaWYKKworaW50IFg1MDlfcHJpbnQoQklPICpicCwgWDUwOSAqeCkKK3sKKwlyZXR1cm4gWDUwOV9wcmludF9leChicCwgeCwgWE5fRkxBR19DT01QQVQsIFg1MDlfRkxBR19DT01QQVQpOworfQorCitpbnQgWDUwOV9wcmludF9leChCSU8gKmJwLCBYNTA5ICp4LCB1bnNpZ25lZCBsb25nIG5tZmxhZ3MsIHVuc2lnbmVkIGxvbmcgY2ZsYWcpCisJeworCWxvbmcgbDsKKwlpbnQgcmV0PTAsaTsKKwljaGFyICptPU5VTEwsbWxjaCA9ICcgJzsKKwlpbnQgbm1pbmRlbnQgPSAwOworCVg1MDlfQ0lORiAqY2k7CisJQVNOMV9JTlRFR0VSICpiczsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCWNvbnN0IGNoYXIgKm5lZzsKKworCWlmKChubWZsYWdzICYgWE5fRkxBR19TRVBfTUFTSykgPT0gWE5fRkxBR19TRVBfTVVMVElMSU5FKSB7CisJCQltbGNoID0gJ1xuJzsKKwkJCW5taW5kZW50ID0gMTI7CisJfQorCisJaWYobm1mbGFncyA9PSBYNTA5X0ZMQUdfQ09NUEFUKQorCQlubWluZGVudCA9IDE2OworCisJY2k9eC0+Y2VydF9pbmZvOworCWlmKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fSEVBREVSKSkKKwkJeworCQlpZiAoQklPX3dyaXRlKGJwLCJDZXJ0aWZpY2F0ZTpcbiIsMTMpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCIgICAgRGF0YTpcbiIsMTApIDw9IDApIGdvdG8gZXJyOworCQl9CisJaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19WRVJTSU9OKSkKKwkJeworCQlsPVg1MDlfZ2V0X3ZlcnNpb24oeCk7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIlOHNWZXJzaW9uOiAlbHUgKDB4JWx4KVxuIiwiIixsKzEsbCkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1NFUklBTCkpCisJCXsKKworCQlpZiAoQklPX3dyaXRlKGJwLCIgICAgICAgIFNlcmlhbCBOdW1iZXI6IiwyMikgPD0gMCkgZ290byBlcnI7CisKKwkJYnM9WDUwOV9nZXRfc2VyaWFsTnVtYmVyKHgpOworCQlpZiAoYnMtPmxlbmd0aCA8PSA0KQorCQkJeworCQkJbD1BU04xX0lOVEVHRVJfZ2V0KGJzKTsKKwkJCWlmIChsIDwgMCkKKwkJCQl7CisJCQkJbD0gLWw7CisJCQkJbmVnPSItIjsKKwkJCQl9CisJCQllbHNlCisJCQkJbmVnPSIiOworCQkJaWYgKEJJT19wcmludGYoYnAsIiAlcyVsdSAoJXMweCVseClcbiIsbmVnLGwsbmVnLGwpIDw9IDApCisJCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW5lZz0oYnMtPnR5cGUgPT0gVl9BU04xX05FR19JTlRFR0VSKT8iIChOZWdhdGl2ZSkiOiIiOworCQkJaWYgKEJJT19wcmludGYoYnAsIlxuJTEycyVzIiwiIixuZWcpIDw9IDApIGdvdG8gZXJyOworCisJCQlmb3IgKGk9MDsgaTxicy0+bGVuZ3RoOyBpKyspCisJCQkJeworCQkJCWlmIChCSU9fcHJpbnRmKGJwLCIlMDJ4JWMiLGJzLT5kYXRhW2ldLAorCQkJCQkoKGkrMSA9PSBicy0+bGVuZ3RoKT8nXG4nOic6JykpIDw9IDApCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKworCQl9CisKKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1NJR05BTUUpKQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIlOHNTaWduYXR1cmUgQWxnb3JpdGhtOiAiLCIiKSA8PSAwKSAKKwkJCWdvdG8gZXJyOworCQlpZiAoaTJhX0FTTjFfT0JKRUNUKGJwLCBjaS0+c2lnbmF0dXJlLT5hbGdvcml0aG0pIDw9IDApCisJCQlnb3RvIGVycjsKKwkJaWYgKEJJT19wdXRzKGJwLCAiXG4iKSA8PSAwKQorCQkJZ290byBlcnI7CisJCX0KKworCWlmKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fSVNTVUVSKSkKKwkJeworCQlpZiAoQklPX3ByaW50ZihicCwiICAgICAgICBJc3N1ZXI6JWMiLG1sY2gpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoWDUwOV9OQU1FX3ByaW50X2V4KGJwLFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpLG5taW5kZW50LCBubWZsYWdzKSA8IDApIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1ZBTElESVRZKSkKKwkJeworCQlpZiAoQklPX3dyaXRlKGJwLCIgICAgICAgIFZhbGlkaXR5XG4iLDE3KSA8PSAwKSBnb3RvIGVycjsKKwkJaWYgKEJJT193cml0ZShicCwiICAgICAgICAgICAgTm90IEJlZm9yZTogIiwyNCkgPD0gMCkgZ290byBlcnI7CisJCWlmICghQVNOMV9USU1FX3ByaW50KGJwLFg1MDlfZ2V0X25vdEJlZm9yZSh4KSkpIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCJcbiAgICAgICAgICAgIE5vdCBBZnRlciA6ICIsMjUpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoIUFTTjFfVElNRV9wcmludChicCxYNTA5X2dldF9ub3RBZnRlcih4KSkpIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX1NVQkpFQ1QpKQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIgICAgICAgIFN1YmplY3Q6JWMiLG1sY2gpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoWDUwOV9OQU1FX3ByaW50X2V4KGJwLFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSxubWluZGVudCwgbm1mbGFncykgPCAwKSBnb3RvIGVycjsKKwkJaWYgKEJJT193cml0ZShicCwiXG4iLDEpIDw9IDApIGdvdG8gZXJyOworCQl9CisJaWYoIShjZmxhZyAmIFg1MDlfRkxBR19OT19QVUJLRVkpKQorCQl7CisJCWlmIChCSU9fd3JpdGUoYnAsIiAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86XG4iLDMzKSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIlMTJzUHVibGljIEtleSBBbGdvcml0aG06ICIsIiIpIDw9IDApCisJCQlnb3RvIGVycjsKKwkJaWYgKGkyYV9BU04xX09CSkVDVChicCwgY2ktPmtleS0+YWxnb3ItPmFsZ29yaXRobSkgPD0gMCkKKwkJCWdvdG8gZXJyOworCQlpZiAoQklPX3B1dHMoYnAsICJcbiIpIDw9IDApCisJCQlnb3RvIGVycjsKKworCQlwa2V5PVg1MDlfZ2V0X3B1YmtleSh4KTsKKwkJaWYgKHBrZXkgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT19wcmludGYoYnAsIiUxMnNVbmFibGUgdG8gbG9hZCBQdWJsaWMgS2V5XG4iLCIiKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYnApOworCQkJfQorCQllbHNlCisJCQl7CisJCQlFVlBfUEtFWV9wcmludF9wdWJsaWMoYnAsIHBrZXksIDE2LCBOVUxMKTsKKwkJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCQl9CisJCX0KKworCWlmICghKGNmbGFnICYgWDUwOV9GTEFHX05PX0VYVEVOU0lPTlMpKQorCQlYNTA5VjNfZXh0ZW5zaW9uc19wcmludChicCwgIlg1MDl2MyBleHRlbnNpb25zIiwKKwkJCQkJY2ktPmV4dGVuc2lvbnMsIGNmbGFnLCA4KTsKKworCWlmKCEoY2ZsYWcgJiBYNTA5X0ZMQUdfTk9fU0lHRFVNUCkpCisJCXsKKwkJaWYoWDUwOV9zaWduYXR1cmVfcHJpbnQoYnAsIHgtPnNpZ19hbGcsIHgtPnNpZ25hdHVyZSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZighKGNmbGFnICYgWDUwOV9GTEFHX05PX0FVWCkpCisJCXsKKwkJaWYgKCFYNTA5X0NFUlRfQVVYX3ByaW50KGJwLCB4LT5hdXgsIDApKSBnb3RvIGVycjsKKwkJfQorCXJldD0xOworZXJyOgorCWlmIChtICE9IE5VTEwpIE9QRU5TU0xfZnJlZShtKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBYNTA5X29jc3BpZF9wcmludCAoQklPICpicCwgWDUwOSAqeCkKKwl7CisJdW5zaWduZWQgY2hhciAqZGVyPU5VTEwgOworCXVuc2lnbmVkIGNoYXIgKmRlcnRtcDsKKwlpbnQgZGVybGVuOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgU0hBMW1kW1NIQV9ESUdFU1RfTEVOR1RIXTsKKworCS8qIGRpc3BsYXkgdGhlIGhhc2ggb2YgdGhlIHN1YmplY3QgYXMgaXQgd291bGQgYXBwZWFyCisJICAgaW4gT0NTUCByZXF1ZXN0cyAqLworCWlmIChCSU9fcHJpbnRmKGJwLCIgICAgICAgIFN1YmplY3QgT0NTUCBoYXNoOiAiKSA8PSAwKQorCQlnb3RvIGVycjsKKwlkZXJsZW4gPSBpMmRfWDUwOV9OQU1FKHgtPmNlcnRfaW5mby0+c3ViamVjdCwgTlVMTCk7CisJaWYgKChkZXIgPSBkZXJ0bXAgPSAodW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jIChkZXJsZW4pKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpMmRfWDUwOV9OQU1FKHgtPmNlcnRfaW5mby0+c3ViamVjdCwgJmRlcnRtcCk7CisKKwlFVlBfRGlnZXN0KGRlciwgZGVybGVuLCBTSEExbWQsIE5VTEwsIEVWUF9zaGExKCksIE5VTEwpOworCWZvciAoaT0wOyBpIDwgU0hBX0RJR0VTVF9MRU5HVEg7IGkrKykKKwkJeworCQlpZiAoQklPX3ByaW50ZihicCwiJTAyWCIsU0hBMW1kW2ldKSA8PSAwKSBnb3RvIGVycjsKKwkJfQorCU9QRU5TU0xfZnJlZSAoZGVyKTsKKwlkZXI9TlVMTDsKKworCS8qIGRpc3BsYXkgdGhlIGhhc2ggb2YgdGhlIHB1YmxpYyBrZXkgYXMgaXQgd291bGQgYXBwZWFyCisJICAgaW4gT0NTUCByZXF1ZXN0cyAqLworCWlmIChCSU9fcHJpbnRmKGJwLCJcbiAgICAgICAgUHVibGljIGtleSBPQ1NQIGhhc2g6ICIpIDw9IDApCisJCWdvdG8gZXJyOworCisJRVZQX0RpZ2VzdCh4LT5jZXJ0X2luZm8tPmtleS0+cHVibGljX2tleS0+ZGF0YSwKKwkJeC0+Y2VydF9pbmZvLT5rZXktPnB1YmxpY19rZXktPmxlbmd0aCwgU0hBMW1kLCBOVUxMLCBFVlBfc2hhMSgpLCBOVUxMKTsKKwlmb3IgKGk9MDsgaSA8IFNIQV9ESUdFU1RfTEVOR1RIOyBpKyspCisJCXsKKwkJaWYgKEJJT19wcmludGYoYnAsIiUwMlgiLFNIQTFtZFtpXSkgPD0gMCkKKwkJCWdvdG8gZXJyOworCQl9CisJQklPX3ByaW50ZihicCwiXG4iKTsKKworCXJldHVybiAoMSk7CitlcnI6CisJaWYgKGRlciAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoZGVyKTsKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgWDUwOV9zaWduYXR1cmVfcHJpbnQoQklPICpicCwgWDUwOV9BTEdPUiAqc2lnYWxnLCBBU04xX1NUUklORyAqc2lnKQoreworCXVuc2lnbmVkIGNoYXIgKnM7CisJaW50IGksIG47CisJaWYgKEJJT19wdXRzKGJwLCIgICAgU2lnbmF0dXJlIEFsZ29yaXRobTogIikgPD0gMCkgcmV0dXJuIDA7CisJaWYgKGkyYV9BU04xX09CSkVDVChicCwgc2lnYWxnLT5hbGdvcml0aG0pIDw9IDApIHJldHVybiAwOworCisJbj1zaWctPmxlbmd0aDsKKwlzPXNpZy0+ZGF0YTsKKwlmb3IgKGk9MDsgaTxuOyBpKyspCisJCXsKKwkJaWYgKChpJTE4KSA9PSAwKQorCQkJaWYgKEJJT193cml0ZShicCwiXG4gICAgICAgICIsOSkgPD0gMCkgcmV0dXJuIDA7CisJCQlpZiAoQklPX3ByaW50ZihicCwiJTAyeCVzIixzW2ldLAorCQkJCSgoaSsxKSA9PSBuKT8iIjoiOiIpIDw9IDApIHJldHVybiAwOworCQl9CisJaWYgKEJJT193cml0ZShicCwiXG4iLDEpICE9IDEpIHJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgQVNOMV9TVFJJTkdfcHJpbnQoQklPICpicCwgY29uc3QgQVNOMV9TVFJJTkcgKnYpCisJeworCWludCBpLG47CisJY2hhciBidWZbODBdOworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAodiA9PSBOVUxMKSByZXR1cm4oMCk7CisJbj0wOworCXA9KGNvbnN0IGNoYXIgKil2LT5kYXRhOworCWZvciAoaT0wOyBpPHYtPmxlbmd0aDsgaSsrKQorCQl7CisJCWlmICgocFtpXSA+ICd+JykgfHwgKChwW2ldIDwgJyAnKSAmJgorCQkJKHBbaV0gIT0gJ1xuJykgJiYgKHBbaV0gIT0gJ1xyJykpKQorCQkJYnVmW25dPScuJzsKKwkJZWxzZQorCQkJYnVmW25dPXBbaV07CisJCW4rKzsKKwkJaWYgKG4gPj0gODApCisJCQl7CisJCQlpZiAoQklPX3dyaXRlKGJwLGJ1ZixuKSA8PSAwKQorCQkJCXJldHVybigwKTsKKwkJCW49MDsKKwkJCX0KKwkJfQorCWlmIChuID4gMCkKKwkJaWYgKEJJT193cml0ZShicCxidWYsbikgPD0gMCkKKwkJCXJldHVybigwKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgQVNOMV9USU1FX3ByaW50KEJJTyAqYnAsIGNvbnN0IEFTTjFfVElNRSAqdG0pCit7CisJaWYodG0tPnR5cGUgPT0gVl9BU04xX1VUQ1RJTUUpIHJldHVybiBBU04xX1VUQ1RJTUVfcHJpbnQoYnAsIHRtKTsKKwlpZih0bS0+dHlwZSA9PSBWX0FTTjFfR0VORVJBTElaRURUSU1FKQorCQkJCXJldHVybiBBU04xX0dFTkVSQUxJWkVEVElNRV9wcmludChicCwgdG0pOworCUJJT193cml0ZShicCwiQmFkIHRpbWUgdmFsdWUiLDE0KTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptb25bMTJdPQorICAgIHsKKyAgICAiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwKKyAgICAiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIgorICAgIH07CisKK2ludCBBU04xX0dFTkVSQUxJWkVEVElNRV9wcmludChCSU8gKmJwLCBjb25zdCBBU04xX0dFTkVSQUxJWkVEVElNRSAqdG0pCisJeworCWNoYXIgKnY7CisJaW50IGdtdD0wOworCWludCBpOworCWludCB5PTAsTT0wLGQ9MCxoPTAsbT0wLHM9MDsKKwljaGFyICpmID0gTlVMTDsKKwlpbnQgZl9sZW4gPSAwOworCisJaT10bS0+bGVuZ3RoOworCXY9KGNoYXIgKil0bS0+ZGF0YTsKKworCWlmIChpIDwgMTIpIGdvdG8gZXJyOworCWlmICh2W2ktMV0gPT0gJ1onKSBnbXQ9MTsKKwlmb3IgKGk9MDsgaTwxMjsgaSsrKQorCQlpZiAoKHZbaV0gPiAnOScpIHx8ICh2W2ldIDwgJzAnKSkgZ290byBlcnI7CisJeT0gKHZbMF0tJzAnKSoxMDAwKyh2WzFdLScwJykqMTAwICsgKHZbMl0tJzAnKSoxMCsodlszXS0nMCcpOworCU09ICh2WzRdLScwJykqMTArKHZbNV0tJzAnKTsKKwlpZiAoKE0gPiAxMikgfHwgKE0gPCAxKSkgZ290byBlcnI7CisJZD0gKHZbNl0tJzAnKSoxMCsodls3XS0nMCcpOworCWg9ICh2WzhdLScwJykqMTArKHZbOV0tJzAnKTsKKwltPSAgKHZbMTBdLScwJykqMTArKHZbMTFdLScwJyk7CisJaWYgKHRtLT5sZW5ndGggPj0gMTQgJiYKKwkgICAgKHZbMTJdID49ICcwJykgJiYgKHZbMTJdIDw9ICc5JykgJiYKKwkgICAgKHZbMTNdID49ICcwJykgJiYgKHZbMTNdIDw9ICc5JykpCisJCXsKKwkJcz0gICh2WzEyXS0nMCcpKjEwKyh2WzEzXS0nMCcpOworCQkvKiBDaGVjayBmb3IgZnJhY3Rpb25zIG9mIHNlY29uZHMuICovCisJCWlmICh0bS0+bGVuZ3RoID49IDE1ICYmIHZbMTRdID09ICcuJykKKwkJCXsKKwkJCWludCBsID0gdG0tPmxlbmd0aDsKKwkJCWYgPSAmdlsxNF07CS8qIFRoZSBkZWNpbWFsIHBvaW50LiAqLworCQkJZl9sZW4gPSAxOworCQkJd2hpbGUgKDE0ICsgZl9sZW4gPCBsICYmIGZbZl9sZW5dID49ICcwJyAmJiBmW2ZfbGVuXSA8PSAnOScpCisJCQkJKytmX2xlbjsKKwkJCX0KKwkJfQorCisJaWYgKEJJT19wcmludGYoYnAsIiVzICUyZCAlMDJkOiUwMmQ6JTAyZCUuKnMgJWQlcyIsCisJCW1vbltNLTFdLGQsaCxtLHMsZl9sZW4sZix5LChnbXQpPyIgR01UIjoiIikgPD0gMCkKKwkJcmV0dXJuKDApOworCWVsc2UKKwkJcmV0dXJuKDEpOworZXJyOgorCUJJT193cml0ZShicCwiQmFkIHRpbWUgdmFsdWUiLDE0KTsKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgQVNOMV9VVENUSU1FX3ByaW50KEJJTyAqYnAsIGNvbnN0IEFTTjFfVVRDVElNRSAqdG0pCisJeworCWNvbnN0IGNoYXIgKnY7CisJaW50IGdtdD0wOworCWludCBpOworCWludCB5PTAsTT0wLGQ9MCxoPTAsbT0wLHM9MDsKKworCWk9dG0tPmxlbmd0aDsKKwl2PShjb25zdCBjaGFyICopdG0tPmRhdGE7CisKKwlpZiAoaSA8IDEwKSBnb3RvIGVycjsKKwlpZiAodltpLTFdID09ICdaJykgZ210PTE7CisJZm9yIChpPTA7IGk8MTA7IGkrKykKKwkJaWYgKCh2W2ldID4gJzknKSB8fCAodltpXSA8ICcwJykpIGdvdG8gZXJyOworCXk9ICh2WzBdLScwJykqMTArKHZbMV0tJzAnKTsKKwlpZiAoeSA8IDUwKSB5Kz0xMDA7CisJTT0gKHZbMl0tJzAnKSoxMCsodlszXS0nMCcpOworCWlmICgoTSA+IDEyKSB8fCAoTSA8IDEpKSBnb3RvIGVycjsKKwlkPSAodls0XS0nMCcpKjEwKyh2WzVdLScwJyk7CisJaD0gKHZbNl0tJzAnKSoxMCsodls3XS0nMCcpOworCW09ICAodls4XS0nMCcpKjEwKyh2WzldLScwJyk7CisJaWYgKHRtLT5sZW5ndGggPj0xMiAmJgorCSAgICAodlsxMF0gPj0gJzAnKSAmJiAodlsxMF0gPD0gJzknKSAmJgorCSAgICAodlsxMV0gPj0gJzAnKSAmJiAodlsxMV0gPD0gJzknKSkKKwkJcz0gICh2WzEwXS0nMCcpKjEwKyh2WzExXS0nMCcpOworCisJaWYgKEJJT19wcmludGYoYnAsIiVzICUyZCAlMDJkOiUwMmQ6JTAyZCAlZCVzIiwKKwkJbW9uW00tMV0sZCxoLG0scyx5KzE5MDAsKGdtdCk/IiBHTVQiOiIiKSA8PSAwKQorCQlyZXR1cm4oMCk7CisJZWxzZQorCQlyZXR1cm4oMSk7CitlcnI6CisJQklPX3dyaXRlKGJwLCJCYWQgdGltZSB2YWx1ZSIsMTQpOworCXJldHVybigwKTsKKwl9CisKK2ludCBYNTA5X05BTUVfcHJpbnQoQklPICpicCwgWDUwOV9OQU1FICpuYW1lLCBpbnQgb2Jhc2UpCisJeworCWNoYXIgKnMsKmMsKmI7CisJaW50IHJldD0wLGwsaTsKKworCWw9ODAtMi1vYmFzZTsKKworCWI9WDUwOV9OQU1FX29uZWxpbmUobmFtZSxOVUxMLDApOworCWlmICghKmIpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGIpOworCQlyZXR1cm4gMTsKKwkJfQorCXM9YisxOyAvKiBza2lwIHRoZSBmaXJzdCBzbGFzaCAqLworCisJYz1zOworCWZvciAoOzspCisJCXsKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJaWYgKAkoKCpzID09ICcvJykgJiYKKwkJCQkoKHNbMV0gPj0gJ0EnKSAmJiAoc1sxXSA8PSAnWicpICYmICgKKwkJCQkJKHNbMl0gPT0gJz0nKSB8fAorCQkJCQkoKHNbMl0gPj0gJ0EnKSAmJiAoc1syXSA8PSAnWicpICYmCisJCQkJCShzWzNdID09ICc9JykpCisJCQkJICkpKSB8fAorCQkJKCpzID09ICdcMCcpKQorI2Vsc2UKKwkJaWYgKAkoKCpzID09ICcvJykgJiYKKwkJCQkoaXN1cHBlcihzWzFdKSAmJiAoCisJCQkJCShzWzJdID09ICc9JykgfHwKKwkJCQkJKGlzdXBwZXIoc1syXSkgJiYKKwkJCQkJKHNbM10gPT0gJz0nKSkKKwkJCQkgKSkpIHx8CisJCQkoKnMgPT0gJ1wwJykpCisjZW5kaWYKKwkJCXsKKwkJCWk9cy1jOworCQkJaWYgKEJJT193cml0ZShicCxjLGkpICE9IGkpIGdvdG8gZXJyOworCQkJYz1zKzE7CS8qIHNraXAgZm9sbG93aW5nIHNsYXNoICovCisJCQlpZiAoKnMgIT0gJ1wwJykKKwkJCQl7CisJCQkJaWYgKEJJT193cml0ZShicCwiLCAiLDIpICE9IDIpIGdvdG8gZXJyOworCQkJCX0KKwkJCWwtLTsKKwkJCX0KKwkJaWYgKCpzID09ICdcMCcpIGJyZWFrOworCQlzKys7CisJCWwtLTsKKwkJfQorCQorCXJldD0xOworCWlmICgwKQorCQl7CitlcnI6CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfTkFNRV9QUklOVCxFUlJfUl9CVUZfTElCKTsKKwkJfQorCU9QRU5TU0xfZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90X3g1MDlhLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90X3g1MDlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxODgwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3RfeDUwOWEuYwpAQCAtMCwwICsxLDExMCBAQAorLyogdF94NTA5YS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKy8qIFg1MDlfQ0VSVF9BVVggYW5kIHN0cmluZyBzZXQgcm91dGluZXMKKyAqLworCitpbnQgWDUwOV9DRVJUX0FVWF9wcmludChCSU8gKm91dCwgWDUwOV9DRVJUX0FVWCAqYXV4LCBpbnQgaW5kZW50KQoreworCWNoYXIgb2lkc3RyWzgwXSwgZmlyc3Q7CisJaW50IGk7CisJaWYoIWF1eCkgcmV0dXJuIDE7CisJaWYoYXV4LT50cnVzdCkgeworCQlmaXJzdCA9IDE7CisJCUJJT19wcmludGYob3V0LCAiJSpzVHJ1c3RlZCBVc2VzOlxuJSpzIiwKKwkJCQkJCWluZGVudCwgIiIsIGluZGVudCArIDIsICIiKTsKKwkJZm9yKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKGF1eC0+dHJ1c3QpOyBpKyspIHsKKwkJCWlmKCFmaXJzdCkgQklPX3B1dHMob3V0LCAiLCAiKTsKKwkJCWVsc2UgZmlyc3QgPSAwOworCQkJT0JKX29iajJ0eHQob2lkc3RyLCBzaXplb2Ygb2lkc3RyLAorCQkJCXNrX0FTTjFfT0JKRUNUX3ZhbHVlKGF1eC0+dHJ1c3QsIGkpLCAwKTsKKwkJCUJJT19wdXRzKG91dCwgb2lkc3RyKTsKKwkJfQorCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCX0gZWxzZSBCSU9fcHJpbnRmKG91dCwgIiUqc05vIFRydXN0ZWQgVXNlcy5cbiIsIGluZGVudCwgIiIpOworCWlmKGF1eC0+cmVqZWN0KSB7CisJCWZpcnN0ID0gMTsKKwkJQklPX3ByaW50ZihvdXQsICIlKnNSZWplY3RlZCBVc2VzOlxuJSpzIiwKKwkJCQkJCWluZGVudCwgIiIsIGluZGVudCArIDIsICIiKTsKKwkJZm9yKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKGF1eC0+cmVqZWN0KTsgaSsrKSB7CisJCQlpZighZmlyc3QpIEJJT19wdXRzKG91dCwgIiwgIik7CisJCQllbHNlIGZpcnN0ID0gMDsKKwkJCU9CSl9vYmoydHh0KG9pZHN0ciwgc2l6ZW9mIG9pZHN0ciwKKwkJCQlza19BU04xX09CSkVDVF92YWx1ZShhdXgtPnJlamVjdCwgaSksIDApOworCQkJQklPX3B1dHMob3V0LCBvaWRzdHIpOworCQl9CisJCUJJT19wdXRzKG91dCwgIlxuIik7CisJfSBlbHNlIEJJT19wcmludGYob3V0LCAiJSpzTm8gUmVqZWN0ZWQgVXNlcy5cbiIsIGluZGVudCwgIiIpOworCWlmKGF1eC0+YWxpYXMpIEJJT19wcmludGYob3V0LCAiJSpzQWxpYXM6ICVzXG4iLCBpbmRlbnQsICIiLAorCQkJCQkJCWF1eC0+YWxpYXMtPmRhdGEpOworCWlmKGF1eC0+a2V5aWQpIHsKKwkJQklPX3ByaW50ZihvdXQsICIlKnNLZXkgSWQ6ICIsIGluZGVudCwgIiIpOworCQlmb3IoaSA9IDA7IGkgPCBhdXgtPmtleWlkLT5sZW5ndGg7IGkrKykgCisJCQlCSU9fcHJpbnRmKG91dCwgIiVzJTAyWCIsIAorCQkJCWkgPyAiOiIgOiAiIiwKKwkJCQlhdXgtPmtleWlkLT5kYXRhW2ldKTsKKwkJQklPX3dyaXRlKG91dCwiXG4iLDEpOworCX0KKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fZGVjLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZWU0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX2RlYy5jCkBAIC0wLDAgKzEsMTM0OCBAQAorLyogdGFzbl9kZWMuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCitzdGF0aWMgaW50IGFzbjFfY2hlY2tfZW9jKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4pOworc3RhdGljIGludCBhc24xX2ZpbmRfZW5kKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sIGNoYXIgaW5mKTsKKworc3RhdGljIGludCBhc24xX2NvbGxlY3QoQlVGX01FTSAqYnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLAorCQkJY2hhciBpbmYsIGludCB0YWcsIGludCBhY2xhc3MsIGludCBkZXB0aCk7CisKK3N0YXRpYyBpbnQgY29sbGVjdF9kYXRhKEJVRl9NRU0gKmJ1ZiwgY29uc3QgdW5zaWduZWQgY2hhciAqKnAsIGxvbmcgcGxlbik7CisKK3N0YXRpYyBpbnQgYXNuMV9jaGVja190bGVuKGxvbmcgKm9sZW4sIGludCAqb3RhZywgdW5zaWduZWQgY2hhciAqb2NsYXNzLAorCQkJCWNoYXIgKmluZiwgY2hhciAqY3N0LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQkJaW50IGV4cHRhZywgaW50IGV4cGNsYXNzLCBjaGFyIG9wdCwKKwkJCQlBU04xX1RMQyAqY3R4KTsKKworc3RhdGljIGludCBhc24xX3RlbXBsYXRlX2V4X2QyaShBU04xX1ZBTFVFICoqcHZhbCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLAorCQkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0LCBjaGFyIG9wdCwKKwkJCQlBU04xX1RMQyAqY3R4KTsKK3N0YXRpYyBpbnQgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmkoQVNOMV9WQUxVRSAqKnZhbCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLAorCQkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0LCBjaGFyIG9wdCwKKwkJCQlBU04xX1RMQyAqY3R4KTsKK3N0YXRpYyBpbnQgYXNuMV9kMmlfZXhfcHJpbWl0aXZlKEFTTjFfVkFMVUUgKipwdmFsLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzLCBjaGFyIG9wdCwgQVNOMV9UTEMgKmN0eCk7CisKKy8qIFRhYmxlIHRvIGNvbnZlcnQgdGFncyB0byBiaXQgdmFsdWVzLCB1c2VkIGZvciBNU1RSSU5HIHR5cGUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHRhZzJiaXRbMzJdID0geworMCwJMCwJMCwJQl9BU04xX0JJVF9TVFJJTkcsCS8qIHRhZ3MgIDAgLSAgMyAqLworQl9BU04xX09DVEVUX1NUUklORywJMCwJMCwJCUJfQVNOMV9VTktOT1dOLC8qIHRhZ3MgIDQtIDcgKi8KK0JfQVNOMV9VTktOT1dOLAlCX0FTTjFfVU5LTk9XTiwJQl9BU04xX1VOS05PV04sCUJfQVNOMV9VTktOT1dOLC8qIHRhZ3MgIDgtMTEgKi8KK0JfQVNOMV9VVEY4U1RSSU5HLEJfQVNOMV9VTktOT1dOLEJfQVNOMV9VTktOT1dOLEJfQVNOMV9VTktOT1dOLC8qIHRhZ3MgMTItMTUgKi8KK0JfQVNOMV9TRVFVRU5DRSwwLEJfQVNOMV9OVU1FUklDU1RSSU5HLEJfQVNOMV9QUklOVEFCTEVTVFJJTkcsIC8qIHRhZ3MgMTYtMTkgKi8KK0JfQVNOMV9UNjFTVFJJTkcsQl9BU04xX1ZJREVPVEVYU1RSSU5HLEJfQVNOMV9JQTVTVFJJTkcsICAgICAgIC8qIHRhZ3MgMjAtMjIgKi8KK0JfQVNOMV9VVENUSU1FLCBCX0FTTjFfR0VORVJBTElaRURUSU1FLAkJCSAgICAgICAvKiB0YWdzIDIzLTI0ICovCQorQl9BU04xX0dSQVBISUNTVFJJTkcsQl9BU04xX0lTTzY0U1RSSU5HLEJfQVNOMV9HRU5FUkFMU1RSSU5HLCAgLyogdGFncyAyNS0yNyAqLworQl9BU04xX1VOSVZFUlNBTFNUUklORyxCX0FTTjFfVU5LTk9XTixCX0FTTjFfQk1QU1RSSU5HLEJfQVNOMV9VTktOT1dOLCAvKiB0YWdzIDI4LTMxICovCisJfTsKKwordW5zaWduZWQgbG9uZyBBU04xX3RhZzJiaXQoaW50IHRhZykKKwl7CisJaWYgKCh0YWcgPCAwKSB8fCAodGFnID4gMzApKSByZXR1cm4gMDsKKwlyZXR1cm4gdGFnMmJpdFt0YWddOworCX0KKworLyogTWFjcm8gdG8gaW5pdGlhbGl6ZSBhbmQgaW52YWxpZGF0ZSB0aGUgY2FjaGUgKi8KKworI2RlZmluZSBhc24xX3RsY19jbGVhcihjKQlpZiAoYykgKGMpLT52YWxpZCA9IDAKKy8qIFZlcnNpb24gdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyBhYm91dCAnYycgYWx3YXlzIG5vbi1OVUxMICovCisjZGVmaW5lIGFzbjFfdGxjX2NsZWFyX25jKGMpCShjKS0+dmFsaWQgPSAwCisKKy8qIERlY29kZSBhbiBBU04xIGl0ZW0sIHRoaXMgY3VycmVudGx5IGJlaGF2ZXMganVzdCAKKyAqIGxpa2UgYSBzdGFuZGFyZCAnZDJpJyBmdW5jdGlvbi4gJ2luJyBwb2ludHMgdG8gCisgKiBhIGJ1ZmZlciB0byByZWFkIHRoZSBkYXRhIGZyb20sIGluIGZ1dHVyZSB3ZSB3aWxsCisgKiBoYXZlIG1vcmUgYWR2YW5jZWQgdmVyc2lvbnMgdGhhdCBjYW4gaW5wdXQgZGF0YQorICogYSBwaWVjZSBhdCBhIHRpbWUgYW5kIHRoaXMgd2lsbCBzaW1wbHkgYmUgYSBzcGVjaWFsCisgKiBjYXNlLgorICovCisKK0FTTjFfVkFMVUUgKkFTTjFfaXRlbV9kMmkoQVNOMV9WQUxVRSAqKnB2YWwsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCUFTTjFfVExDIGM7CisJQVNOMV9WQUxVRSAqcHRtcHZhbCA9IE5VTEw7CisJaWYgKCFwdmFsKQorCQlwdmFsID0gJnB0bXB2YWw7CisJYXNuMV90bGNfY2xlYXJfbmMoJmMpOworCWlmIChBU04xX2l0ZW1fZXhfZDJpKHB2YWwsIGluLCBsZW4sIGl0LCAtMSwgMCwgMCwgJmMpID4gMCkgCisJCXJldHVybiAqcHZhbDsKKwlyZXR1cm4gTlVMTDsKKwl9CisKK2ludCBBU04xX3RlbXBsYXRlX2QyaShBU04xX1ZBTFVFICoqcHZhbCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbiwgY29uc3QgQVNOMV9URU1QTEFURSAqdHQpCisJeworCUFTTjFfVExDIGM7CisJYXNuMV90bGNfY2xlYXJfbmMoJmMpOworCXJldHVybiBhc24xX3RlbXBsYXRlX2V4X2QyaShwdmFsLCBpbiwgbGVuLCB0dCwgMCwgJmMpOworCX0KKworCisvKiBEZWNvZGUgYW4gaXRlbSwgdGFraW5nIGNhcmUgb2YgSU1QTElDSVQgdGFnZ2luZywgaWYgYW55LgorICogSWYgJ29wdCcgc2V0IGFuZCB0YWcgbWlzbWF0Y2ggcmV0dXJuIC0xIHRvIGhhbmRsZSBPUFRJT05BTAorICovCisKK2ludCBBU04xX2l0ZW1fZXhfZDJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLAorCQkJY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCWludCB0YWcsIGludCBhY2xhc3MsIGNoYXIgb3B0LCBBU04xX1RMQyAqY3R4KQorCXsKKwljb25zdCBBU04xX1RFTVBMQVRFICp0dCwgKmVycnR0ID0gTlVMTDsKKwljb25zdCBBU04xX0NPTVBBVF9GVU5DUyAqY2Y7CisJY29uc3QgQVNOMV9FWFRFUk5fRlVOQ1MgKmVmOworCWNvbnN0IEFTTjFfQVVYICphdXggPSBpdC0+ZnVuY3M7CisJQVNOMV9hdXhfY2IgKmFzbjFfY2I7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IE5VTEwsICpxOworCXVuc2lnbmVkIGNoYXIgKndwPU5VTEw7CS8qIEJJRyBGQVQgV0FSTklORyEgIEJSRUFLUyBDT05TVCBXSEVSRSBVU0VEICovCisJdW5zaWduZWQgY2hhciBpbXBoYWNrID0gMCwgb2NsYXNzOworCWNoYXIgc2VxX2VvYywgc2VxX25vbGVuLCBjc3QsIGlzb3B0OworCWxvbmcgdG1wbGVuOworCWludCBpOworCWludCBvdGFnOworCWludCByZXQgPSAwOworCUFTTjFfVkFMVUUgKnBjaHZhbCwgKipwY2hwdHIsICpwdG1wdmFsOworCWlmICghcHZhbCkKKwkJcmV0dXJuIDA7CisJaWYgKGF1eCAmJiBhdXgtPmFzbjFfY2IpCisJCWFzbjFfY2IgPSBhdXgtPmFzbjFfY2I7CisJZWxzZSBhc24xX2NiID0gMDsKKworCXN3aXRjaChpdC0+aXR5cGUpCisJCXsKKwkJY2FzZSBBU04xX0lUWVBFX1BSSU1JVElWRToKKwkJaWYgKGl0LT50ZW1wbGF0ZXMpCisJCQl7CisJCQkvKiB0YWdnaW5nIG9yIE9QVElPTkFMIGlzIGN1cnJlbnRseSBpbGxlZ2FsIG9uIGFuIGl0ZW0KKwkJCSAqIHRlbXBsYXRlIGJlY2F1c2UgdGhlIGZsYWdzIGNhbid0IGdldCBwYXNzZWQgZG93bi4KKwkJCSAqIEluIHByYWN0aWNlIHRoaXMgaXNuJ3QgYSBwcm9ibGVtOiB3ZSBpbmNsdWRlIHRoZQorCQkJICogcmVsZXZhbnQgZmxhZ3MgZnJvbSB0aGUgaXRlbSB0ZW1wbGF0ZSBpbiB0aGUKKwkJCSAqIHRlbXBsYXRlIGl0c2VsZi4KKwkJCSAqLworCQkJaWYgKCh0YWcgIT0gLTEpIHx8IG9wdCkKKwkJCQl7CisJCQkJQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX0VYX0QySSwKKwkJCQlBU04xX1JfSUxMRUdBTF9PUFRJT05TX09OX0lURU1fVEVNUExBVEUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXJldHVybiBhc24xX3RlbXBsYXRlX2V4X2QyaShwdmFsLCBpbiwgbGVuLAorCQkJCQlpdC0+dGVtcGxhdGVzLCBvcHQsIGN0eCk7CisJCX0KKwkJcmV0dXJuIGFzbjFfZDJpX2V4X3ByaW1pdGl2ZShwdmFsLCBpbiwgbGVuLCBpdCwKKwkJCQkJCXRhZywgYWNsYXNzLCBvcHQsIGN0eCk7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9NU1RSSU5HOgorCQlwID0gKmluOworCQkvKiBKdXN0IHJlYWQgaW4gdGFnIGFuZCBjbGFzcyAqLworCQlyZXQgPSBhc24xX2NoZWNrX3RsZW4oTlVMTCwgJm90YWcsICZvY2xhc3MsIE5VTEwsIE5VTEwsCisJCQkJCQkmcCwgbGVuLCAtMSwgMCwgMSwgY3R4KTsKKwkJaWYgKCFyZXQpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJLAorCQkJCQlFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBNdXN0IGJlIFVOSVZFUlNBTCBjbGFzcyAqLworCQlpZiAob2NsYXNzICE9IFZfQVNOMV9VTklWRVJTQUwpCisJCQl7CisJCQkvKiBJZiBPUFRJT05BTCwgYXNzdW1lIHRoaXMgaXMgT0sgKi8KKwkJCWlmIChvcHQpIHJldHVybiAtMTsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkksCisJCQkJCUFTTjFfUl9NU1RSSU5HX05PVF9VTklWRVJTQUwpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIENoZWNrIHRhZyBtYXRjaGVzIGJpdCBtYXAgKi8KKwkJaWYgKCEoQVNOMV90YWcyYml0KG90YWcpICYgaXQtPnV0eXBlKSkKKwkJCXsKKwkJCS8qIElmIE9QVElPTkFMLCBhc3N1bWUgdGhpcyBpcyBPSyAqLworCQkJaWYgKG9wdCkKKwkJCQlyZXR1cm4gLTE7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJLAorCQkJCQlBU04xX1JfTVNUUklOR19XUk9OR19UQUcpOworCQkJZ290byBlcnI7CisJCQl9CisJCXJldHVybiBhc24xX2QyaV9leF9wcmltaXRpdmUocHZhbCwgaW4sIGxlbiwKKwkJCQkJCWl0LCBvdGFnLCAwLCAwLCBjdHgpOworCisJCWNhc2UgQVNOMV9JVFlQRV9FWFRFUk46CisJCS8qIFVzZSBuZXcgc3R5bGUgZDJpICovCisJCWVmID0gaXQtPmZ1bmNzOworCQlyZXR1cm4gZWYtPmFzbjFfZXhfZDJpKHB2YWwsIGluLCBsZW4sCisJCQkJCQlpdCwgdGFnLCBhY2xhc3MsIG9wdCwgY3R4KTsKKworCQljYXNlIEFTTjFfSVRZUEVfQ09NUEFUOgorCQkvKiB3ZSBtdXN0IHJlc29ydCB0byBvbGQgc3R5bGUgZXZpbCBoYWNrZXJ5ICovCisJCWNmID0gaXQtPmZ1bmNzOworCisJCS8qIElmIE9QVElPTkFMIHNlZSBpZiBpdCBpcyB0aGVyZSAqLworCQlpZiAob3B0KQorCQkJeworCQkJaW50IGV4cHRhZzsKKwkJCXAgPSAqaW47CisJCQlpZiAodGFnID09IC0xKQorCQkJCWV4cHRhZyA9IGl0LT51dHlwZTsKKwkJCWVsc2UgZXhwdGFnID0gdGFnOworCQkJLyogRG9uJ3QgY2FyZSBhYm91dCBhbnl0aGluZyBvdGhlciB0aGFuIHByZXNlbmNlCisJCQkgKiBvZiBleHBlY3RlZCB0YWcgKi8KKworCQkJcmV0ID0gYXNuMV9jaGVja190bGVuKE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCSZwLCBsZW4sIGV4cHRhZywgYWNsYXNzLCAxLCBjdHgpOworCQkJaWYgKCFyZXQpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkksCisJCQkJCUVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAocmV0ID09IC0xKQorCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkvKiBUaGlzIGlzIHRoZSBvbGQgc3R5bGUgZXZpbCBoYWNrIElNUExJQ0lUIGhhbmRsaW5nOgorCQkgKiBzaW5jZSB0aGUgdW5kZXJseWluZyBjb2RlIGlzIGV4cGVjdGluZyBhIHRhZyBhbmQKKwkJICogY2xhc3Mgb3RoZXIgdGhhbiB0aGUgb25lIHByZXNlbnQgd2UgY2hhbmdlIHRoZQorCQkgKiBidWZmZXIgdGVtcG9yYXJpbHkgdGhlbiBjaGFuZ2UgaXQgYmFjayBhZnRlcndhcmRzLgorCQkgKiBUaGlzIGRvZXNuJ3QgYW5kIG5ldmVyIGRpZCB3b3JrIGZvciB0YWdzID4gMzAuCisJCSAqCisJCSAqIFllcyB0aGlzIGlzICpob3JyaWJsZSogYnV0IGl0IGlzIG9ubHkgbmVlZGVkIGZvcgorCQkgKiBvbGQgc3R5bGUgZDJpIHdoaWNoIHdpbGwgaG9wZWZ1bGx5IG5vdCBiZSBhcm91bmQKKwkJICogZm9yIG11Y2ggbG9uZ2VyLgorCQkgKiBGSVhNRTogc2hvdWxkIGNvcHkgdGhlIGJ1ZmZlciB0aGVuIG1vZGlmeSBpdCBzbworCQkgKiB0aGUgaW5wdXQgYnVmZmVyIGNhbiBiZSBjb25zdDogd2Ugc2hvdWxkICphbHdheXMqCisJCSAqIGNvcHkgYmVjYXVzZSB0aGUgb2xkIHN0eWxlIGQyaSBtaWdodCBtb2RpZnkgdGhlCisJCSAqIGJ1ZmZlci4KKwkJICovCisKKwkJaWYgKHRhZyAhPSAtMSkKKwkJCXsKKwkJCXdwID0gKih1bnNpZ25lZCBjaGFyICoqKWluOworCQkJaW1waGFjayA9ICp3cDsKKwkJCWlmIChwID09IE5VTEwpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkksCisJCQkJCUVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkqd3AgPSAodW5zaWduZWQgY2hhcikoKCpwICYgVl9BU04xX0NPTlNUUlVDVEVEKQorCQkJCQkJCQl8IGl0LT51dHlwZSk7CisJCQl9CisKKwkJcHRtcHZhbCA9IGNmLT5hc24xX2QyaShwdmFsLCBpbiwgbGVuKTsKKworCQlpZiAodGFnICE9IC0xKQorCQkJKndwID0gaW1waGFjazsKKworCQlpZiAocHRtcHZhbCkKKwkJCXJldHVybiAxOworCisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkksIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJZ290byBlcnI7CisKKworCQljYXNlIEFTTjFfSVRZUEVfQ0hPSUNFOgorCQlpZiAoYXNuMV9jYiAmJiAhYXNuMV9jYihBU04xX09QX0QySV9QUkUsIHB2YWwsIGl0LCBOVUxMKSkKKwkJCQlnb3RvIGF1eGVycjsKKworCQkvKiBBbGxvY2F0ZSBzdHJ1Y3R1cmUgKi8KKwkJaWYgKCEqcHZhbCAmJiAhQVNOMV9pdGVtX2V4X25ldyhwdmFsLCBpdCkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJLAorCQkJCQkJRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIENIT0lDRSB0eXBlLCB0cnkgZWFjaCBwb3NzaWJpbGl0eSBpbiB0dXJuICovCisJCXBjaHZhbCA9IE5VTEw7CisJCXAgPSAqaW47CisJCWZvciAoaSA9IDAsIHR0PWl0LT50ZW1wbGF0ZXM7IGkgPCBpdC0+dGNvdW50OyBpKyssIHR0KyspCisJCQl7CisJCQlwY2hwdHIgPSBhc24xX2dldF9maWVsZF9wdHIocHZhbCwgdHQpOworCQkJLyogV2UgbWFyayBmaWVsZCBhcyBPUFRJT05BTCBzbyBpdHMgYWJzZW5jZQorCQkJICogY2FuIGJlIHJlY29nbmlzZWQuCisJCQkgKi8KKwkJCXJldCA9IGFzbjFfdGVtcGxhdGVfZXhfZDJpKHBjaHB0ciwgJnAsIGxlbiwgdHQsIDEsIGN0eCk7CisJCQkvKiBJZiBmaWVsZCBub3QgcHJlc2VudCwgdHJ5IHRoZSBuZXh0IG9uZSAqLworCQkJaWYgKHJldCA9PSAtMSkKKwkJCQljb250aW51ZTsKKwkJCS8qIElmIHBvc2l0aXZlIHJldHVybiwgcmVhZCBPSywgYnJlYWsgbG9vcCAqLworCQkJaWYgKHJldCA+IDApCisJCQkJYnJlYWs7CisJCQkvKiBPdGhlcndpc2UgbXVzdCBiZSBhbiBBU04xIHBhcnNpbmcgZXJyb3IgKi8KKwkJCWVycnR0ID0gdHQ7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJLAorCQkJCQkJRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJLyogRGlkIHdlIGZhbGwgb2ZmIHRoZSBlbmQgd2l0aG91dCByZWFkaW5nIGFueXRoaW5nPyAqLworCQlpZiAoaSA9PSBpdC0+dGNvdW50KQorCQkJeworCQkJLyogSWYgT1BUSU9OQUwsIHRoaXMgaXMgT0sgKi8KKwkJCWlmIChvcHQpCisJCQkJeworCQkJCS8qIEZyZWUgYW5kIHplcm8gaXQgKi8KKwkJCQlBU04xX2l0ZW1fZXhfZnJlZShwdmFsLCBpdCk7CisJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkksCisJCQkJCUFTTjFfUl9OT19NQVRDSElOR19DSE9JQ0VfVFlQRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlhc24xX3NldF9jaG9pY2Vfc2VsZWN0b3IocHZhbCwgaSwgaXQpOworCQkqaW4gPSBwOworCQlpZiAoYXNuMV9jYiAmJiAhYXNuMV9jYihBU04xX09QX0QySV9QT1NULCBwdmFsLCBpdCwgTlVMTCkpCisJCQkJZ290byBhdXhlcnI7CisJCXJldHVybiAxOworCisJCWNhc2UgQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFOgorCQljYXNlIEFTTjFfSVRZUEVfU0VRVUVOQ0U6CisJCXAgPSAqaW47CisJCXRtcGxlbiA9IGxlbjsKKworCQkvKiBJZiBubyBJTVBMSUNJVCB0YWdnaW5nIHNldCB0byBTRVFVRU5DRSwgVU5JVkVSU0FMICovCisJCWlmICh0YWcgPT0gLTEpCisJCQl7CisJCQl0YWcgPSBWX0FTTjFfU0VRVUVOQ0U7CisJCQlhY2xhc3MgPSBWX0FTTjFfVU5JVkVSU0FMOworCQkJfQorCQkvKiBHZXQgU0VRVUVOQ0UgbGVuZ3RoIGFuZCB1cGRhdGUgbGVuLCBwICovCisJCXJldCA9IGFzbjFfY2hlY2tfdGxlbigmbGVuLCBOVUxMLCBOVUxMLCAmc2VxX2VvYywgJmNzdCwKKwkJCQkJJnAsIGxlbiwgdGFnLCBhY2xhc3MsIG9wdCwgY3R4KTsKKwkJaWYgKCFyZXQpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJLAorCQkJCQlFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSBpZiAocmV0ID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYXV4ICYmIChhdXgtPmZsYWdzICYgQVNOMV9BRkxHX0JST0tFTikpCisJCQl7CisJCQlsZW4gPSB0bXBsZW4gLSAocCAtICppbik7CisJCQlzZXFfbm9sZW4gPSAxOworCQkJfQorCQkvKiBJZiBpbmRlZmluaXRlIHdlIGRvbid0IGRvIGEgbGVuZ3RoIGNoZWNrICovCisJCWVsc2Ugc2VxX25vbGVuID0gc2VxX2VvYzsKKwkJaWYgKCFjc3QpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJLAorCQkJCUFTTjFfUl9TRVFVRU5DRV9OT1RfQ09OU1RSVUNURUQpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKCEqcHZhbCAmJiAhQVNOMV9pdGVtX2V4X25ldyhwdmFsLCBpdCkpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJLAorCQkJCUVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfRDJJX1BSRSwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCWdvdG8gYXV4ZXJyOworCisJCS8qIEdldCBlYWNoIGZpZWxkIGVudHJ5ICovCisJCWZvciAoaSA9IDAsIHR0ID0gaXQtPnRlbXBsYXRlczsgaSA8IGl0LT50Y291bnQ7IGkrKywgdHQrKykKKwkJCXsKKwkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnNlcXR0OworCQkJQVNOMV9WQUxVRSAqKnBzZXF2YWw7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKHB2YWwsIHR0LCAxKTsKKwkJCWlmICghc2VxdHQpCisJCQkJZ290byBlcnI7CisJCQlwc2VxdmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHNlcXR0KTsKKwkJCS8qIEhhdmUgd2UgcmFuIG91dCBvZiBkYXRhPyAqLworCQkJaWYgKCFsZW4pCisJCQkJYnJlYWs7CisJCQlxID0gcDsKKwkJCWlmIChhc24xX2NoZWNrX2VvYygmcCwgbGVuKSkKKwkJCQl7CisJCQkJaWYgKCFzZXFfZW9jKQorCQkJCQl7CisJCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkksCisJCQkJCQkJQVNOMV9SX1VORVhQRUNURURfRU9DKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlsZW4gLT0gcCAtIHE7CisJCQkJc2VxX2VvYyA9IDA7CisJCQkJcSA9IHA7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJLyogVGhpcyBkZXRlcm1pbmVzIHRoZSBPUFRJT05BTCBmbGFnIHZhbHVlLiBUaGUgZmllbGQKKwkJCSAqIGNhbm5vdCBiZSBvbWl0dGVkIGlmIGl0IGlzIHRoZSBsYXN0IG9mIGEgU0VRVUVOQ0UKKwkJCSAqIGFuZCB0aGVyZSBpcyBzdGlsbCBkYXRhIHRvIGJlIHJlYWQuIFRoaXMgaXNuJ3QKKwkJCSAqIHN0cmljdGx5IG5lY2Vzc2FyeSBidXQgaXQgaW5jcmVhc2VzIGVmZmljaWVuY3kgaW4KKwkJCSAqIHNvbWUgY2FzZXMuCisJCQkgKi8KKwkJCWlmIChpID09IChpdC0+dGNvdW50IC0gMSkpCisJCQkJaXNvcHQgPSAwOworCQkJZWxzZSBpc29wdCA9IChjaGFyKShzZXF0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfT1BUSU9OQUwpOworCQkJLyogYXR0ZW1wdCB0byByZWFkIGluIGZpZWxkLCBhbGxvd2luZyBlYWNoIHRvIGJlCisJCQkgKiBPUFRJT05BTCAqLworCisJCQlyZXQgPSBhc24xX3RlbXBsYXRlX2V4X2QyaShwc2VxdmFsLCAmcCwgbGVuLAorCQkJCQkJCXNlcXR0LCBpc29wdCwgY3R4KTsKKwkJCWlmICghcmV0KQorCQkJCXsKKwkJCQllcnJ0dCA9IHNlcXR0OworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWVsc2UgaWYgKHJldCA9PSAtMSkKKwkJCQl7CisJCQkJLyogT1BUSU9OQUwgY29tcG9uZW50IGFic2VudC4KKwkJCQkgKiBGcmVlIGFuZCB6ZXJvIHRoZSBmaWVsZC4KKwkJCQkgKi8KKwkJCQlBU04xX3RlbXBsYXRlX2ZyZWUocHNlcXZhbCwgc2VxdHQpOworCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCS8qIFVwZGF0ZSBsZW5ndGggKi8KKwkJCWxlbiAtPSBwIC0gcTsKKwkJCX0KKworCQkvKiBDaGVjayBmb3IgRU9DIGlmIGV4cGVjdGluZyBvbmUgKi8KKwkJaWYgKHNlcV9lb2MgJiYgIWFzbjFfY2hlY2tfZW9jKCZwLCBsZW4pKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9JVEVNX0VYX0QySSwgQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQkvKiBDaGVjayBhbGwgZGF0YSByZWFkICovCisJCWlmICghc2VxX25vbGVuICYmIGxlbikKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkksCisJCQkJCUFTTjFfUl9TRVFVRU5DRV9MRU5HVEhfTUlTTUFUQ0gpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJLyogSWYgd2UgZ2V0IGhlcmUgd2UndmUgZ290IG5vIG1vcmUgZGF0YSBpbiB0aGUgU0VRVUVOQ0UsCisJCSAqIGhvd2V2ZXIgd2UgbWF5IG5vdCBoYXZlIHJlYWQgYWxsIGZpZWxkcyBzbyBjaGVjayBhbGwKKwkJICogcmVtYWluaW5nIGFyZSBPUFRJT05BTCBhbmQgY2xlYXIgYW55IHRoYXQgYXJlLgorCQkgKi8KKwkJZm9yICg7IGkgPCBpdC0+dGNvdW50OyB0dCsrLCBpKyspCisJCQl7CisJCQljb25zdCBBU04xX1RFTVBMQVRFICpzZXF0dDsKKwkJCXNlcXR0ID0gYXNuMV9kb19hZGIocHZhbCwgdHQsIDEpOworCQkJaWYgKCFzZXF0dCkKKwkJCQlnb3RvIGVycjsKKwkJCWlmIChzZXF0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfT1BUSU9OQUwpCisJCQkJeworCQkJCUFTTjFfVkFMVUUgKipwc2VxdmFsOworCQkJCXBzZXF2YWwgPSBhc24xX2dldF9maWVsZF9wdHIocHZhbCwgc2VxdHQpOworCQkJCUFTTjFfdGVtcGxhdGVfZnJlZShwc2VxdmFsLCBzZXF0dCk7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQllcnJ0dCA9IHNlcXR0OworCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9EMkksCisJCQkJCQkJQVNOMV9SX0ZJRUxEX01JU1NJTkcpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJLyogU2F2ZSBlbmNvZGluZyAqLworCQlpZiAoIWFzbjFfZW5jX3NhdmUocHZhbCwgKmluLCBwIC0gKmluLCBpdCkpCisJCQlnb3RvIGF1eGVycjsKKwkJKmluID0gcDsKKwkJaWYgKGFzbjFfY2IgJiYgIWFzbjFfY2IoQVNOMV9PUF9EMklfUE9TVCwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCWdvdG8gYXV4ZXJyOworCQlyZXR1cm4gMTsKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwkJfQorCWF1eGVycjoKKwlBU04xZXJyKEFTTjFfRl9BU04xX0lURU1fRVhfRDJJLCBBU04xX1JfQVVYX0VSUk9SKTsKKwllcnI6CisJQVNOMV9pdGVtX2V4X2ZyZWUocHZhbCwgaXQpOworCWlmIChlcnJ0dCkKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJGaWVsZD0iLCBlcnJ0dC0+ZmllbGRfbmFtZSwKKwkJCQkJIiwgVHlwZT0iLCBpdC0+c25hbWUpOworCWVsc2UKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJUeXBlPSIsIGl0LT5zbmFtZSk7CisJcmV0dXJuIDA7CisJfQorCisvKiBUZW1wbGF0ZXMgYXJlIGhhbmRsZWQgd2l0aCB0d28gc2VwYXJhdGUgZnVuY3Rpb25zLgorICogT25lIGhhbmRsZXMgYW55IEVYUExJQ0lUIHRhZyBhbmQgdGhlIG90aGVyIGhhbmRsZXMgdGhlIHJlc3QuCisgKi8KKworc3RhdGljIGludCBhc24xX3RlbXBsYXRlX2V4X2QyaShBU04xX1ZBTFVFICoqdmFsLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBpbmxlbiwKKwkJCQljb25zdCBBU04xX1RFTVBMQVRFICp0dCwgY2hhciBvcHQsCisJCQkJCQkJQVNOMV9UTEMgKmN0eCkKKwl7CisJaW50IGZsYWdzLCBhY2xhc3M7CisJaW50IHJldDsKKwlsb25nIGxlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCAqcTsKKwljaGFyIGV4cF9lb2M7CisJaWYgKCF2YWwpCisJCXJldHVybiAwOworCWZsYWdzID0gdHQtPmZsYWdzOworCWFjbGFzcyA9IGZsYWdzICYgQVNOMV9URkxHX1RBR19DTEFTUzsKKworCXAgPSAqaW47CisKKwkvKiBDaGVjayBpZiBFWFBMSUNJVCB0YWcgZXhwZWN0ZWQgKi8KKwlpZiAoZmxhZ3MgJiBBU04xX1RGTEdfRVhQVEFHKQorCQl7CisJCWNoYXIgY3N0OworCQkvKiBOZWVkIHRvIHdvcmsgb3V0IGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSB0byB0aGUgaW5uZXIKKwkJICogY29udGVudCBhbmQgd2hlcmUgaXQgc3RhcnRzOiBzbyByZWFkIGluIEVYUExJQ0lUIGhlYWRlciB0bworCQkgKiBnZXQgdGhlIGluZm8uCisJCSAqLworCQlyZXQgPSBhc24xX2NoZWNrX3RsZW4oJmxlbiwgTlVMTCwgTlVMTCwgJmV4cF9lb2MsICZjc3QsCisJCQkJCSZwLCBpbmxlbiwgdHQtPnRhZywgYWNsYXNzLCBvcHQsIGN0eCk7CisJCXEgPSBwOworCQlpZiAoIXJldCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVEVNUExBVEVfRVhfRDJJLAorCQkJCQlFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZWxzZSBpZiAocmV0ID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIWNzdCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVEVNUExBVEVfRVhfRDJJLAorCQkJCQlBU04xX1JfRVhQTElDSVRfVEFHX05PVF9DT05TVFJVQ1RFRCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJLyogV2UndmUgZm91bmQgdGhlIGZpZWxkIHNvIGl0IGNhbid0IGJlIE9QVElPTkFMIG5vdyAqLworCQlyZXQgPSBhc24xX3RlbXBsYXRlX25vZXhwX2QyaSh2YWwsICZwLCBsZW4sIHR0LCAwLCBjdHgpOworCQlpZiAoIXJldCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVEVNUExBVEVfRVhfRDJJLAorCQkJCQlFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJLyogV2UgcmVhZCB0aGUgZmllbGQgaW4gT0sgc28gdXBkYXRlIGxlbmd0aCAqLworCQlsZW4gLT0gcCAtIHE7CisJCWlmIChleHBfZW9jKQorCQkJeworCQkJLyogSWYgTkRFRiB3ZSBtdXN0IGhhdmUgYW4gRU9DIGhlcmUgKi8KKwkJCWlmICghYXNuMV9jaGVja19lb2MoJnAsIGxlbikpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVEVNUExBVEVfRVhfRDJJLAorCQkJCQkJQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCS8qIE90aGVyd2lzZSB3ZSBtdXN0IGhpdCB0aGUgRVhQTElDSVQgdGFnIGVuZCBvciBpdHMKKwkJCSAqIGFuIGVycm9yICovCisJCQlpZiAobGVuKQorCQkJCXsKKwkJCQlBU04xZXJyKEFTTjFfRl9BU04xX1RFTVBMQVRFX0VYX0QySSwKKwkJCQkJQVNOMV9SX0VYUExJQ0lUX0xFTkdUSF9NSVNNQVRDSCk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgCisJCQlyZXR1cm4gYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmkodmFsLCBpbiwgaW5sZW4sCisJCQkJCQkJCXR0LCBvcHQsIGN0eCk7CisKKwkqaW4gPSBwOworCXJldHVybiAxOworCisJZXJyOgorCUFTTjFfdGVtcGxhdGVfZnJlZSh2YWwsIHR0KTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV90ZW1wbGF0ZV9ub2V4cF9kMmkoQVNOMV9WQUxVRSAqKnZhbCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLAorCQkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0LCBjaGFyIG9wdCwKKwkJCQlBU04xX1RMQyAqY3R4KQorCXsKKwlpbnQgZmxhZ3MsIGFjbGFzczsKKwlpbnQgcmV0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsICpxOworCWlmICghdmFsKQorCQlyZXR1cm4gMDsKKwlmbGFncyA9IHR0LT5mbGFnczsKKwlhY2xhc3MgPSBmbGFncyAmIEFTTjFfVEZMR19UQUdfQ0xBU1M7CisKKwlwID0gKmluOworCXEgPSBwOworCisJaWYgKGZsYWdzICYgQVNOMV9URkxHX1NLX01BU0spCisJCXsKKwkJLyogU0VUIE9GLCBTRVFVRU5DRSBPRiAqLworCQlpbnQgc2t0YWcsIHNrYWNsYXNzOworCQljaGFyIHNrX2VvYzsKKwkJLyogRmlyc3Qgd29yayBvdXQgZXhwZWN0ZWQgaW5uZXIgdGFnIHZhbHVlICovCisJCWlmIChmbGFncyAmIEFTTjFfVEZMR19JTVBUQUcpCisJCQl7CisJCQlza3RhZyA9IHR0LT50YWc7CisJCQlza2FjbGFzcyA9IGFjbGFzczsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJc2thY2xhc3MgPSBWX0FTTjFfVU5JVkVSU0FMOworCQkJaWYgKGZsYWdzICYgQVNOMV9URkxHX1NFVF9PRikKKwkJCQlza3RhZyA9IFZfQVNOMV9TRVQ7CisJCQllbHNlCisJCQkJc2t0YWcgPSBWX0FTTjFfU0VRVUVOQ0U7CisJCQl9CisJCS8qIEdldCB0aGUgdGFnICovCisJCXJldCA9IGFzbjFfY2hlY2tfdGxlbigmbGVuLCBOVUxMLCBOVUxMLCAmc2tfZW9jLCBOVUxMLAorCQkJCQkmcCwgbGVuLCBza3RhZywgc2thY2xhc3MsIG9wdCwgY3R4KTsKKwkJaWYgKCFyZXQpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1RFTVBMQVRFX05PRVhQX0QySSwKKwkJCQkJCUVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCXJldHVybiAwOworCQkJfQorCQllbHNlIGlmIChyZXQgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJCWlmICghKnZhbCkKKwkJCSp2YWwgPSAoQVNOMV9WQUxVRSAqKXNrX25ld19udWxsKCk7CisJCWVsc2UKKwkJCXsKKwkJCS8qIFdlJ3ZlIGdvdCBhIHZhbGlkIFNUQUNLOiBmcmVlIHVwIGFueSBpdGVtcyBwcmVzZW50ICovCisJCQlTVEFDS19PRihBU04xX1ZBTFVFKSAqc2t0bXAKKwkJCSAgICA9IChTVEFDS19PRihBU04xX1ZBTFVFKSAqKSp2YWw7CisJCQlBU04xX1ZBTFVFICp2dG1wOworCQkJd2hpbGUoc2tfQVNOMV9WQUxVRV9udW0oc2t0bXApID4gMCkKKwkJCQl7CisJCQkJdnRtcCA9IHNrX0FTTjFfVkFMVUVfcG9wKHNrdG1wKTsKKwkJCQlBU04xX2l0ZW1fZXhfZnJlZSgmdnRtcCwKKwkJCQkJCUFTTjFfSVRFTV9wdHIodHQtPml0ZW0pKTsKKwkJCQl9CisJCQl9CisJCQkJCisJCWlmICghKnZhbCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVEVNUExBVEVfTk9FWFBfRDJJLAorCQkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJLyogUmVhZCBhcyBtYW55IGl0ZW1zIGFzIHdlIGNhbiAqLworCQl3aGlsZShsZW4gPiAwKQorCQkJeworCQkJQVNOMV9WQUxVRSAqc2tmaWVsZDsKKwkJCXEgPSBwOworCQkJLyogU2VlIGlmIEVPQyBmb3VuZCAqLworCQkJaWYgKGFzbjFfY2hlY2tfZW9jKCZwLCBsZW4pKQorCQkJCXsKKwkJCQlpZiAoIXNrX2VvYykKKwkJCQkJeworCQkJCQlBU04xZXJyKEFTTjFfRl9BU04xX1RFTVBMQVRFX05PRVhQX0QySSwKKwkJCQkJCQlBU04xX1JfVU5FWFBFQ1RFRF9FT0MpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWxlbiAtPSBwIC0gcTsKKwkJCQlza19lb2MgPSAwOworCQkJCWJyZWFrOworCQkJCX0KKwkJCXNrZmllbGQgPSBOVUxMOworCQkJaWYgKCFBU04xX2l0ZW1fZXhfZDJpKCZza2ZpZWxkLCAmcCwgbGVuLAorCQkJCQkJQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQktMSwgMCwgMCwgY3R4KSkKKwkJCQl7CisJCQkJQVNOMWVycihBU04xX0ZfQVNOMV9URU1QTEFURV9OT0VYUF9EMkksCisJCQkJCUVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlsZW4gLT0gcCAtIHE7CisJCQlpZiAoIXNrX0FTTjFfVkFMVUVfcHVzaCgoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKikqdmFsLAorCQkJCQkJc2tmaWVsZCkpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVEVNUExBVEVfTk9FWFBfRDJJLAorCQkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJaWYgKHNrX2VvYykKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVEVNUExBVEVfTk9FWFBfRDJJLCBBU04xX1JfTUlTU0lOR19FT0MpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlIGlmIChmbGFncyAmIEFTTjFfVEZMR19JTVBUQUcpCisJCXsKKwkJLyogSU1QTElDSVQgdGFnZ2luZyAqLworCQlyZXQgPSBBU04xX2l0ZW1fZXhfZDJpKHZhbCwgJnAsIGxlbiwKKwkJCUFTTjFfSVRFTV9wdHIodHQtPml0ZW0pLCB0dC0+dGFnLCBhY2xhc3MsIG9wdCwgY3R4KTsKKwkJaWYgKCFyZXQpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1RFTVBMQVRFX05PRVhQX0QySSwKKwkJCQkJCUVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlIGlmIChyZXQgPT0gLTEpCisJCQlyZXR1cm4gLTE7CisJCX0KKwllbHNlCisJCXsKKwkJLyogTm90aGluZyBzcGVjaWFsICovCisJCXJldCA9IEFTTjFfaXRlbV9leF9kMmkodmFsLCAmcCwgbGVuLCBBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKKwkJCQkJCQktMSwgMCwgb3B0LCBjdHgpOworCQlpZiAoIXJldCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfVEVNUExBVEVfTk9FWFBfRDJJLAorCQkJCQlFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSBpZiAocmV0ID09IC0xKQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkqaW4gPSBwOworCXJldHVybiAxOworCisJZXJyOgorCUFTTjFfdGVtcGxhdGVfZnJlZSh2YWwsIHR0KTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9kMmlfZXhfcHJpbWl0aXZlKEFTTjFfVkFMVUUgKipwdmFsLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBpbmxlbiwgCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzLCBjaGFyIG9wdCwgQVNOMV9UTEMgKmN0eCkKKwl7CisJaW50IHJldCA9IDAsIHV0eXBlOworCWxvbmcgcGxlbjsKKwljaGFyIGNzdCwgaW5mLCBmcmVlX2NvbnQgPSAwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJQlVGX01FTSBidWY7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY29udCA9IE5VTEw7CisJbG9uZyBsZW47IAorCWlmICghcHZhbCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0QySV9FWF9QUklNSVRJVkUsIEFTTjFfUl9JTExFR0FMX05VTEwpOworCQlyZXR1cm4gMDsgLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQl9CisKKwlpZiAoaXQtPml0eXBlID09IEFTTjFfSVRZUEVfTVNUUklORykKKwkJeworCQl1dHlwZSA9IHRhZzsKKwkJdGFnID0gLTE7CisJCX0KKwllbHNlCisJCXV0eXBlID0gaXQtPnV0eXBlOworCisJaWYgKHV0eXBlID09IFZfQVNOMV9BTlkpCisJCXsKKwkJLyogSWYgdHlwZSBpcyBBTlkgbmVlZCB0byBmaWd1cmUgb3V0IHR5cGUgZnJvbSB0YWcgKi8KKwkJdW5zaWduZWQgY2hhciBvY2xhc3M7CisJCWlmICh0YWcgPj0gMCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRDJJX0VYX1BSSU1JVElWRSwKKwkJCQkJQVNOMV9SX0lMTEVHQUxfVEFHR0VEX0FOWSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJaWYgKG9wdCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRDJJX0VYX1BSSU1JVElWRSwKKwkJCQkJQVNOMV9SX0lMTEVHQUxfT1BUSU9OQUxfQU5ZKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlwID0gKmluOworCQlyZXQgPSBhc24xX2NoZWNrX3RsZW4oTlVMTCwgJnV0eXBlLCAmb2NsYXNzLCBOVUxMLCBOVUxMLAorCQkJCQkmcCwgaW5sZW4sIC0xLCAwLCAwLCBjdHgpOworCQlpZiAoIXJldCkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRDJJX0VYX1BSSU1JVElWRSwKKwkJCQkJRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmIChvY2xhc3MgIT0gVl9BU04xX1VOSVZFUlNBTCkKKwkJCXV0eXBlID0gVl9BU04xX09USEVSOworCQl9CisJaWYgKHRhZyA9PSAtMSkKKwkJeworCQl0YWcgPSB1dHlwZTsKKwkJYWNsYXNzID0gVl9BU04xX1VOSVZFUlNBTDsKKwkJfQorCXAgPSAqaW47CisJLyogQ2hlY2sgaGVhZGVyICovCisJcmV0ID0gYXNuMV9jaGVja190bGVuKCZwbGVuLCBOVUxMLCBOVUxMLCAmaW5mLCAmY3N0LAorCQkJCSZwLCBpbmxlbiwgdGFnLCBhY2xhc3MsIG9wdCwgY3R4KTsKKwlpZiAoIXJldCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0QySV9FWF9QUklNSVRJVkUsIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJCX0KKwllbHNlIGlmIChyZXQgPT0gLTEpCisJCXJldHVybiAtMTsKKyAgICAgICAgcmV0ID0gMDsKKwkvKiBTRVFVRU5DRSwgU0VUIGFuZCAiT1RIRVIiIGFyZSBsZWZ0IGluIGVuY29kZWQgZm9ybSAqLworCWlmICgodXR5cGUgPT0gVl9BU04xX1NFUVVFTkNFKQorCQl8fCAodXR5cGUgPT0gVl9BU04xX1NFVCkgfHwgKHV0eXBlID09IFZfQVNOMV9PVEhFUikpCisJCXsKKwkJLyogQ2xlYXIgY29udGV4dCBjYWNoZSBmb3IgdHlwZSBPVEhFUiBiZWNhdXNlIHRoZSBhdXRvIGNsZWFyCisJCSAqIHdoZW4gd2UgaGF2ZSBhIGV4YWN0IG1hdGNoIHdvbnQgd29yaworCQkgKi8KKwkJaWYgKHV0eXBlID09IFZfQVNOMV9PVEhFUikKKwkJCXsKKwkJCWFzbjFfdGxjX2NsZWFyKGN0eCk7CisJCQl9CisJCS8qIFNFUVVFTkNFIGFuZCBTRVQgbXVzdCBiZSBjb25zdHJ1Y3RlZCAqLworCQllbHNlIGlmICghY3N0KQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9EMklfRVhfUFJJTUlUSVZFLAorCQkJCUFTTjFfUl9UWVBFX05PVF9DT05TVFJVQ1RFRCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQljb250ID0gKmluOworCQkvKiBJZiBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBmaW5kIHRoZSByZWFsIGVuZCAqLworCQlpZiAoaW5mKQorCQkJeworCQkJaWYgKCFhc24xX2ZpbmRfZW5kKCZwLCBwbGVuLCBpbmYpKQorCQkJCSBnb3RvIGVycjsKKwkJCWxlbiA9IHAgLSBjb250OworCQkJfQorCQllbHNlCisJCQl7CisJCQlsZW4gPSBwIC0gY29udCArIHBsZW47CisJCQlwICs9IHBsZW47CisJCQlidWYuZGF0YSA9IE5VTEw7CisJCQl9CisJCX0KKwllbHNlIGlmIChjc3QpCisJCXsKKwkJYnVmLmxlbmd0aCA9IDA7CisJCWJ1Zi5tYXggPSAwOworCQlidWYuZGF0YSA9IE5VTEw7CisJCS8qIFNob3VsZCByZWFsbHkgY2hlY2sgdGhlIGludGVybmFsIHRhZ3MgYXJlIGNvcnJlY3QgYnV0CisJCSAqIHNvbWUgdGhpbmdzIG1heSBnZXQgdGhpcyB3cm9uZy4gVGhlIHJlbGV2YW50IHNwZWNzCisJCSAqIHNheSB0aGF0IGNvbnN0cnVjdGVkIHN0cmluZyB0eXBlcyBzaG91bGQgYmUgT0NURVQgU1RSSU5HcworCQkgKiBpbnRlcm5hbGx5IGlycmVzcGVjdGl2ZSBvZiB0aGUgdHlwZS4gU28gaW5zdGVhZCBqdXN0IGNoZWNrCisJCSAqIGZvciBVTklWRVJTQUwgY2xhc3MgYW5kIGlnbm9yZSB0aGUgdGFnLgorCQkgKi8KKwkJaWYgKCFhc24xX2NvbGxlY3QoJmJ1ZiwgJnAsIHBsZW4sIGluZiwgLTEsIFZfQVNOMV9VTklWRVJTQUwsIDApKQorCQkJeworCQkJZnJlZV9jb250ID0gMTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlsZW4gPSBidWYubGVuZ3RoOworCQkvKiBBcHBlbmQgYSBmaW5hbCBudWxsIHRvIHN0cmluZyAqLworCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbigmYnVmLCBsZW4gKyAxKSkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRDJJX0VYX1BSSU1JVElWRSwKKwkJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlidWYuZGF0YVtsZW5dID0gMDsKKwkJY29udCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopYnVmLmRhdGE7CisJCWZyZWVfY29udCA9IDE7CisJCX0KKwllbHNlCisJCXsKKwkJY29udCA9IHA7CisJCWxlbiA9IHBsZW47CisJCXAgKz0gcGxlbjsKKwkJfQorCisJLyogV2Ugbm93IGhhdmUgY29udGVudCBsZW5ndGggYW5kIHR5cGU6IHRyYW5zbGF0ZSBpbnRvIGEgc3RydWN0dXJlICovCisJaWYgKCFhc24xX2V4X2MyaShwdmFsLCBjb250LCBsZW4sIHV0eXBlLCAmZnJlZV9jb250LCBpdCkpCisJCWdvdG8gZXJyOworCisJKmluID0gcDsKKwlyZXQgPSAxOworCWVycjoKKwlpZiAoZnJlZV9jb250ICYmIGJ1Zi5kYXRhKSBPUEVOU1NMX2ZyZWUoYnVmLmRhdGEpOworCXJldHVybiByZXQ7CisJfQorCisvKiBUcmFuc2xhdGUgQVNOMSBjb250ZW50IG9jdGV0cyBpbnRvIGEgc3RydWN0dXJlICovCisKK2ludCBhc24xX2V4X2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwKKwkJCWludCB1dHlwZSwgY2hhciAqZnJlZV9jb250LCBjb25zdCBBU04xX0lURU0gKml0KQorCXsKKwlBU04xX1ZBTFVFICoqb3B2YWwgPSBOVUxMOworCUFTTjFfU1RSSU5HICpzdG1wOworCUFTTjFfVFlQRSAqdHlwID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwljb25zdCBBU04xX1BSSU1JVElWRV9GVU5DUyAqcGY7CisJQVNOMV9JTlRFR0VSICoqdGludDsKKwlwZiA9IGl0LT5mdW5jczsKKworCWlmIChwZiAmJiBwZi0+cHJpbV9jMmkpCisJCXJldHVybiBwZi0+cHJpbV9jMmkocHZhbCwgY29udCwgbGVuLCB1dHlwZSwgZnJlZV9jb250LCBpdCk7CisJLyogSWYgQU5ZIHR5cGUgY2xlYXIgdHlwZSBhbmQgc2V0IHBvaW50ZXIgdG8gaW50ZXJuYWwgdmFsdWUgKi8KKwlpZiAoaXQtPnV0eXBlID09IFZfQVNOMV9BTlkpCisJCXsKKwkJaWYgKCEqcHZhbCkKKwkJCXsKKwkJCXR5cCA9IEFTTjFfVFlQRV9uZXcoKTsKKwkJCWlmICh0eXAgPT0gTlVMTCkKKwkJCQlnb3RvIGVycjsKKwkJCSpwdmFsID0gKEFTTjFfVkFMVUUgKil0eXA7CisJCQl9CisJCWVsc2UKKwkJCXR5cCA9IChBU04xX1RZUEUgKikqcHZhbDsKKworCQlpZiAodXR5cGUgIT0gdHlwLT50eXBlKQorCQkJQVNOMV9UWVBFX3NldCh0eXAsIHV0eXBlLCBOVUxMKTsKKwkJb3B2YWwgPSBwdmFsOworCQlwdmFsID0gJnR5cC0+dmFsdWUuYXNuMV92YWx1ZTsKKwkJfQorCXN3aXRjaCh1dHlwZSkKKwkJeworCQljYXNlIFZfQVNOMV9PQkpFQ1Q6CisJCWlmICghYzJpX0FTTjFfT0JKRUNUKChBU04xX09CSkVDVCAqKilwdmFsLCAmY29udCwgbGVuKSkKKwkJCWdvdG8gZXJyOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9OVUxMOgorCQlpZiAobGVuKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9FWF9DMkksCisJCQkJCQlBU04xX1JfTlVMTF9JU19XUk9OR19MRU5HVEgpOworCQkJZ290byBlcnI7CisJCQl9CisJCSpwdmFsID0gKEFTTjFfVkFMVUUgKikxOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9CT09MRUFOOgorCQlpZiAobGVuICE9IDEpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0VYX0MySSwKKwkJCQkJCUFTTjFfUl9CT09MRUFOX0lTX1dST05HX0xFTkdUSCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQVNOMV9CT09MRUFOICp0Ym9vbDsKKwkJCXRib29sID0gKEFTTjFfQk9PTEVBTiAqKXB2YWw7CisJCQkqdGJvb2wgPSAqY29udDsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfQklUX1NUUklORzoKKwkJaWYgKCFjMmlfQVNOMV9CSVRfU1RSSU5HKChBU04xX0JJVF9TVFJJTkcgKiopcHZhbCwgJmNvbnQsIGxlbikpCisJCQlnb3RvIGVycjsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfSU5URUdFUjoKKwkJY2FzZSBWX0FTTjFfTkVHX0lOVEVHRVI6CisJCWNhc2UgVl9BU04xX0VOVU1FUkFURUQ6CisJCWNhc2UgVl9BU04xX05FR19FTlVNRVJBVEVEOgorCQl0aW50ID0gKEFTTjFfSU5URUdFUiAqKilwdmFsOworCQlpZiAoIWMyaV9BU04xX0lOVEVHRVIodGludCwgJmNvbnQsIGxlbikpCisJCQlnb3RvIGVycjsKKwkJLyogRml4dXAgdHlwZSB0byBtYXRjaCB0aGUgZXhwZWN0ZWQgZm9ybSAqLworCQkoKnRpbnQpLT50eXBlID0gdXR5cGUgfCAoKCp0aW50KS0+dHlwZSAmIFZfQVNOMV9ORUcpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9PQ1RFVF9TVFJJTkc6CisJCWNhc2UgVl9BU04xX05VTUVSSUNTVFJJTkc6CisJCWNhc2UgVl9BU04xX1BSSU5UQUJMRVNUUklORzoKKwkJY2FzZSBWX0FTTjFfVDYxU1RSSU5HOgorCQljYXNlIFZfQVNOMV9WSURFT1RFWFNUUklORzoKKwkJY2FzZSBWX0FTTjFfSUE1U1RSSU5HOgorCQljYXNlIFZfQVNOMV9VVENUSU1FOgorCQljYXNlIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUU6CisJCWNhc2UgVl9BU04xX0dSQVBISUNTVFJJTkc6CisJCWNhc2UgVl9BU04xX1ZJU0lCTEVTVFJJTkc6CisJCWNhc2UgVl9BU04xX0dFTkVSQUxTVFJJTkc6CisJCWNhc2UgVl9BU04xX1VOSVZFUlNBTFNUUklORzoKKwkJY2FzZSBWX0FTTjFfQk1QU1RSSU5HOgorCQljYXNlIFZfQVNOMV9VVEY4U1RSSU5HOgorCQljYXNlIFZfQVNOMV9PVEhFUjoKKwkJY2FzZSBWX0FTTjFfU0VUOgorCQljYXNlIFZfQVNOMV9TRVFVRU5DRToKKwkJZGVmYXVsdDoKKwkJaWYgKHV0eXBlID09IFZfQVNOMV9CTVBTVFJJTkcgJiYgKGxlbiAmIDEpKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9FWF9DMkksCisJCQkJCUFTTjFfUl9CTVBTVFJJTkdfSVNfV1JPTkdfTEVOR1RIKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAodXR5cGUgPT0gVl9BU04xX1VOSVZFUlNBTFNUUklORyAmJiAobGVuICYgMykpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX0VYX0MySSwKKwkJCQkJQVNOMV9SX1VOSVZFUlNBTFNUUklOR19JU19XUk9OR19MRU5HVEgpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIEFsbCBiYXNlZCBvbiBBU04xX1NUUklORyBhbmQgaGFuZGxlZCB0aGUgc2FtZSAqLworCQlpZiAoISpwdmFsKQorCQkJeworCQkJc3RtcCA9IEFTTjFfU1RSSU5HX3R5cGVfbmV3KHV0eXBlKTsKKwkJCWlmICghc3RtcCkKKwkJCQl7CisJCQkJQVNOMWVycihBU04xX0ZfQVNOMV9FWF9DMkksCisJCQkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCSpwdmFsID0gKEFTTjFfVkFMVUUgKilzdG1wOworCQkJfQorCQllbHNlCisJCQl7CisJCQlzdG1wID0gKEFTTjFfU1RSSU5HICopKnB2YWw7CisJCQlzdG1wLT50eXBlID0gdXR5cGU7CisJCQl9CisJCS8qIElmIHdlJ3ZlIGFscmVhZHkgYWxsb2NhdGVkIGEgYnVmZmVyIHVzZSBpdCAqLworCQlpZiAoKmZyZWVfY29udCkKKwkJCXsKKwkJCWlmIChzdG1wLT5kYXRhKQorCQkJCU9QRU5TU0xfZnJlZShzdG1wLT5kYXRhKTsKKwkJCXN0bXAtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKWNvbnQ7IC8qIFVHTFkgQ0FTVCEgUkwgKi8KKwkJCXN0bXAtPmxlbmd0aCA9IGxlbjsKKwkJCSpmcmVlX2NvbnQgPSAwOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoIUFTTjFfU1RSSU5HX3NldChzdG1wLCBjb250LCBsZW4pKQorCQkJCXsKKwkJCQlBU04xZXJyKEFTTjFfRl9BU04xX0VYX0MySSwKKwkJCQkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJQVNOMV9TVFJJTkdfZnJlZShzdG1wKTsJCisJCQkJKnB2YWwgPSBOVUxMOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJYnJlYWs7CisJCX0KKwkvKiBJZiBBU04xX0FOWSBhbmQgTlVMTCB0eXBlIGZpeCB1cCB2YWx1ZSAqLworCWlmICh0eXAgJiYgKHV0eXBlID09IFZfQVNOMV9OVUxMKSkKKwkJIHR5cC0+dmFsdWUucHRyID0gTlVMTDsKKworCXJldCA9IDE7CisJZXJyOgorCWlmICghcmV0KQorCQl7CisJCUFTTjFfVFlQRV9mcmVlKHR5cCk7CisJCWlmIChvcHZhbCkKKwkJCSpvcHZhbCA9IE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworCisvKiBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSBlbmQgb2YgYW4gQVNOMSBzdHJ1Y3R1cmUgd2hlbiBwYXNzZWQgaXRzIG1heGltdW0KKyAqIGxlbmd0aCwgd2hldGhlciBpdCBpcyBpbmRlZmluaXRlIGxlbmd0aCBhbmQgYSBwb2ludGVyIHRvIHRoZSBjb250ZW50LgorICogVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcgYXNuMV9jb2xsZWN0IGJlY2F1c2UgaXQgZG9lcyBub3QKKyAqIHJlY3Vyc2Ugb24gZWFjaCBpbmRlZmluaXRlIGxlbmd0aCBoZWFkZXIuCisgKi8KKworc3RhdGljIGludCBhc24xX2ZpbmRfZW5kKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sIGNoYXIgaW5mKQorCXsKKwlpbnQgZXhwZWN0ZWRfZW9jOworCWxvbmcgcGxlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKmluLCAqcTsKKwkvKiBJZiBub3QgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQganVzdCBhZGQgbGVuZ3RoICovCisJaWYgKGluZiA9PSAwKQorCQl7CisJCSppbiArPSBsZW47CisJCXJldHVybiAxOworCQl9CisJZXhwZWN0ZWRfZW9jID0gMTsKKwkvKiBJbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBmb3JtLiBGaW5kIHRoZSBlbmQgd2hlbiBlbm91Z2ggRU9DcworCSAqIGFyZSBmb3VuZC4gSWYgbW9yZSBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBoZWFkZXJzCisJICogYXJlIGVuY291bnRlcmVkIGluY3JlbWVudCB0aGUgZXhwZWN0ZWQgZW9jIGNvdW50IG90aGVyd2lzZSBqdXN0CisJICogc2tpcCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhLgorCSAqLworCXdoaWxlIChsZW4gPiAwKQorCQl7CisJCWlmKGFzbjFfY2hlY2tfZW9jKCZwLCBsZW4pKQorCQkJeworCQkJZXhwZWN0ZWRfZW9jLS07CisJCQlpZiAoZXhwZWN0ZWRfZW9jID09IDApCisJCQkJYnJlYWs7CisJCQlsZW4gLT0gMjsKKwkJCWNvbnRpbnVlOworCQkJfQorCQlxID0gcDsKKwkJLyogSnVzdCByZWFkIGluIGEgaGVhZGVyOiBvbmx5IGNhcmUgYWJvdXQgdGhlIGxlbmd0aCAqLworCQlpZighYXNuMV9jaGVja190bGVuKCZwbGVuLCBOVUxMLCBOVUxMLCAmaW5mLCBOVUxMLCAmcCwgbGVuLAorCQkJCS0xLCAwLCAwLCBOVUxMKSkKKwkJCXsKKwkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfRklORF9FTkQsIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlpZiAoaW5mKQorCQkJZXhwZWN0ZWRfZW9jKys7CisJCWVsc2UKKwkJCXAgKz0gcGxlbjsKKwkJbGVuIC09IHAgLSBxOworCQl9CisJaWYgKGV4cGVjdGVkX2VvYykKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0ZJTkRfRU5ELCBBU04xX1JfTUlTU0lOR19FT0MpOworCQlyZXR1cm4gMDsKKwkJfQorCSppbiA9IHA7CisJcmV0dXJuIDE7CisJfQorLyogVGhpcyBmdW5jdGlvbiBjb2xsZWN0cyB0aGUgYXNuMSBkYXRhIGZyb20gYSBjb25zdHJ1Y3RyZWQgc3RyaW5nCisgKiB0eXBlIGludG8gYSBidWZmZXIuIFRoZSB2YWx1ZXMgb2YgJ2luJyBhbmQgJ2xlbicgc2hvdWxkIHJlZmVyCisgKiB0byB0aGUgY29udGVudHMgb2YgdGhlIGNvbnN0cnVjdGVkIHR5cGUgYW5kICdpbmYnIHNob3VsZCBiZSBzZXQKKyAqIGlmIGl0IGlzIGluZGVmaW5pdGUgbGVuZ3RoLgorICovCisKKyNpZm5kZWYgQVNOMV9NQVhfU1RSSU5HX05FU1QKKy8qIFRoaXMgZGV0ZXJtaW5lcyBob3cgbWFueSBsZXZlbHMgb2YgcmVjdXJzaW9uIGFyZSBwZXJtaXR0ZWQgaW4gQVNOMQorICogc3RyaW5nIHR5cGVzLiBJZiBpdCBpcyBub3QgbGltaXRlZCBzdGFjayBvdmVyZmxvd3MgY2FuIG9jY3VyLiBJZiBzZXQKKyAqIHRvIHplcm8gbm8gcmVjdXJzaW9uIGlzIGFsbG93ZWQgYXQgYWxsLiBBbHRob3VnaCB6ZXJvIHNob3VsZCBiZSBhZGVxdWF0ZQorICogZXhhbXBsZXMgZXhpc3QgdGhhdCByZXF1aXJlIGEgdmFsdWUgb2YgMS4gU28gNSBzaG91bGQgYmUgbW9yZSB0aGFuIGVub3VnaC4KKyAqLworI2RlZmluZSBBU04xX01BWF9TVFJJTkdfTkVTVCA1CisjZW5kaWYKKworCitzdGF0aWMgaW50IGFzbjFfY29sbGVjdChCVUZfTUVNICpidWYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQljaGFyIGluZiwgaW50IHRhZywgaW50IGFjbGFzcywgaW50IGRlcHRoKQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCAqcTsKKwlsb25nIHBsZW47CisJY2hhciBjc3QsIGluaW5mOworCXAgPSAqaW47CisJaW5mICY9IDE7CisJLyogSWYgbm8gYnVmZmVyIGFuZCBub3QgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQganVzdCBwYXNzIG92ZXIKKwkgKiB0aGUgZW5jb2RlZCBkYXRhICovCisJaWYgKCFidWYgJiYgIWluZikKKwkJeworCQkqaW4gKz0gbGVuOworCQlyZXR1cm4gMTsKKwkJfQorCXdoaWxlKGxlbiA+IDApCisJCXsKKwkJcSA9IHA7CisJCS8qIENoZWNrIGZvciBFT0MgKi8KKwkJaWYgKGFzbjFfY2hlY2tfZW9jKCZwLCBsZW4pKQorCQkJeworCQkJLyogRU9DIGlzIGlsbGVnYWwgb3V0c2lkZSBpbmRlZmluaXRlIGxlbmd0aAorCQkJICogY29uc3RydWN0ZWQgZm9ybSAqLworCQkJaWYgKCFpbmYpCisJCQkJeworCQkJCUFTTjFlcnIoQVNOMV9GX0FTTjFfQ09MTEVDVCwKKwkJCQkJQVNOMV9SX1VORVhQRUNURURfRU9DKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlpbmYgPSAwOworCQkJYnJlYWs7CisJCQl9CisKKwkJaWYgKCFhc24xX2NoZWNrX3RsZW4oJnBsZW4sIE5VTEwsIE5VTEwsICZpbmluZiwgJmNzdCwgJnAsCisJCQkJCWxlbiwgdGFnLCBhY2xhc3MsIDAsIE5VTEwpKQorCQkJeworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9DT0xMRUNULCBFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkvKiBJZiBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCB1cGRhdGUgbWF4IGxlbmd0aCAqLworCQlpZiAoY3N0KQorCQkJeworCQkJaWYgKGRlcHRoID49IEFTTjFfTUFYX1NUUklOR19ORVNUKQorCQkJCXsKKwkJCQlBU04xZXJyKEFTTjFfRl9BU04xX0NPTExFQ1QsCisJCQkJCUFTTjFfUl9ORVNURURfQVNOMV9TVFJJTkcpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWlmICghYXNuMV9jb2xsZWN0KGJ1ZiwgJnAsIHBsZW4sIGluaW5mLCB0YWcsIGFjbGFzcywKKwkJCQkJCWRlcHRoICsgMSkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCWVsc2UgaWYgKHBsZW4gJiYgIWNvbGxlY3RfZGF0YShidWYsICZwLCBwbGVuKSkKKwkJCXJldHVybiAwOworCQlsZW4gLT0gcCAtIHE7CisJCX0KKwlpZiAoaW5mKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0FTTjFfQ09MTEVDVCwgQVNOMV9SX01JU1NJTkdfRU9DKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkqaW4gPSBwOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBjb2xsZWN0X2RhdGEoQlVGX01FTSAqYnVmLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcCwgbG9uZyBwbGVuKQorCXsKKwlpbnQgbGVuOworCWlmIChidWYpCisJCXsKKwkJbGVuID0gYnVmLT5sZW5ndGg7CisJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGJ1ZiwgbGVuICsgcGxlbikpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9DT0xMRUNUX0RBVEEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQltZW1jcHkoYnVmLT5kYXRhICsgbGVuLCAqcCwgcGxlbik7CisJCX0KKwkqcCArPSBwbGVuOworCXJldHVybiAxOworCX0KKworLyogQ2hlY2sgZm9yIEFTTjEgRU9DIGFuZCBzd2FsbG93IGl0IGlmIGZvdW5kICovCisKK3N0YXRpYyBpbnQgYXNuMV9jaGVja19lb2MoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbikKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlpZiAobGVuIDwgMikgcmV0dXJuIDA7CisJcCA9ICppbjsKKwlpZiAoIXBbMF0gJiYgIXBbMV0pCisJCXsKKwkJKmluICs9IDI7CisJCXJldHVybiAxOworCQl9CisJcmV0dXJuIDA7CisJfQorCisvKiBDaGVjayBhbiBBU04xIHRhZyBhbmQgbGVuZ3RoOiBhIGJpdCBsaWtlIEFTTjFfZ2V0X29iamVjdAorICogYnV0IGl0IHNldHMgdGhlIGxlbmd0aCBmb3IgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQKKyAqIGZvcm0sIHdlIGRvbid0IGtub3cgdGhlIGV4YWN0IGxlbmd0aCBidXQgd2UgY2FuIHNldCBhbgorICogdXBwZXIgYm91bmQgdG8gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSBtaW51cyB0aGUKKyAqIGhlYWRlciBsZW5ndGgganVzdCByZWFkLgorICovCisKK3N0YXRpYyBpbnQgYXNuMV9jaGVja190bGVuKGxvbmcgKm9sZW4sIGludCAqb3RhZywgdW5zaWduZWQgY2hhciAqb2NsYXNzLAorCQkJCWNoYXIgKmluZiwgY2hhciAqY3N0LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQkJaW50IGV4cHRhZywgaW50IGV4cGNsYXNzLCBjaGFyIG9wdCwKKwkJCQlBU04xX1RMQyAqY3R4KQorCXsKKwlpbnQgaTsKKwlpbnQgcHRhZywgcGNsYXNzOworCWxvbmcgcGxlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCAqcTsKKwlwID0gKmluOworCXEgPSBwOworCisJaWYgKGN0eCAmJiBjdHgtPnZhbGlkKQorCQl7CisJCWkgPSBjdHgtPnJldDsKKwkJcGxlbiA9IGN0eC0+cGxlbjsKKwkJcGNsYXNzID0gY3R4LT5wY2xhc3M7CisJCXB0YWcgPSBjdHgtPnB0YWc7CisJCXAgKz0gY3R4LT5oZHJsZW47CisJCX0KKwllbHNlCisJCXsKKwkJaSA9IEFTTjFfZ2V0X29iamVjdCgmcCwgJnBsZW4sICZwdGFnLCAmcGNsYXNzLCBsZW4pOworCQlpZiAoY3R4KQorCQkJeworCQkJY3R4LT5yZXQgPSBpOworCQkJY3R4LT5wbGVuID0gcGxlbjsKKwkJCWN0eC0+cGNsYXNzID0gcGNsYXNzOworCQkJY3R4LT5wdGFnID0gcHRhZzsKKwkJCWN0eC0+aGRybGVuID0gcCAtIHE7CisJCQljdHgtPnZhbGlkID0gMTsKKwkJCS8qIElmIGRlZmluaXRlIGxlbmd0aCwgYW5kIG5vIGVycm9yLCBsZW5ndGggKworCQkJICogaGVhZGVyIGNhbid0IGV4Y2VlZCB0b3RhbCBhbW91bnQgb2YgZGF0YSBhdmFpbGFibGUuIAorCQkJICovCisJCQlpZiAoIShpICYgMHg4MSkgJiYgKChwbGVuICsgY3R4LT5oZHJsZW4pID4gbGVuKSkKKwkJCQl7CisJCQkJQVNOMWVycihBU04xX0ZfQVNOMV9DSEVDS19UTEVOLAorCQkJCQkJCUFTTjFfUl9UT09fTE9ORyk7CisJCQkJYXNuMV90bGNfY2xlYXIoY3R4KTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCWlmIChpICYgMHg4MCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX0NIRUNLX1RMRU4sIEFTTjFfUl9CQURfT0JKRUNUX0hFQURFUik7CisJCWFzbjFfdGxjX2NsZWFyKGN0eCk7CisJCXJldHVybiAwOworCQl9CisJaWYgKGV4cHRhZyA+PSAwKQorCQl7CisJCWlmICgoZXhwdGFnICE9IHB0YWcpIHx8IChleHBjbGFzcyAhPSBwY2xhc3MpKQorCQkJeworCQkJLyogSWYgdHlwZSBpcyBPUFRJT05BTCwgbm90IGFuIGVycm9yOgorCQkJICogaW5kaWNhdGUgbWlzc2luZyB0eXBlLgorCQkJICovCisJCQlpZiAob3B0KSByZXR1cm4gLTE7CisJCQlhc24xX3RsY19jbGVhcihjdHgpOworCQkJQVNOMWVycihBU04xX0ZfQVNOMV9DSEVDS19UTEVOLCBBU04xX1JfV1JPTkdfVEFHKTsKKwkJCXJldHVybiAwOworCQkJfQorCQkvKiBXZSBoYXZlIGEgdGFnIGFuZCBjbGFzcyBtYXRjaDoKKwkJICogYXNzdW1lIHdlIGFyZSBnb2luZyB0byBkbyBzb21ldGhpbmcgd2l0aCBpdCAqLworCQlhc24xX3RsY19jbGVhcihjdHgpOworCQl9CisKKwlpZiAoaSAmIDEpCisJCXBsZW4gPSBsZW4gLSAocCAtIHEpOworCisJaWYgKGluZikKKwkJKmluZiA9IGkgJiAxOworCisJaWYgKGNzdCkKKwkJKmNzdCA9IGkgJiBWX0FTTjFfQ09OU1RSVUNURUQ7CisKKwlpZiAob2xlbikKKwkJKm9sZW4gPSBwbGVuOworCisJaWYgKG9jbGFzcykKKwkJKm9jbGFzcyA9IHBjbGFzczsKKworCWlmIChvdGFnKQorCQkqb3RhZyA9IHB0YWc7CisKKwkqaW4gPSBwOworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmFkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX2VuYy5jCkBAIC0wLDAgKzEsNjkxIEBACisvKiB0YXNuX2VuYy5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorCitzdGF0aWMgaW50IGFzbjFfaTJkX2V4X3ByaW1pdGl2ZShBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQkJY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQkJaW50IHRhZywgaW50IGFjbGFzcyk7CitzdGF0aWMgaW50IGFzbjFfc2V0X3NlcV9vdXQoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKnNrLCB1bnNpZ25lZCBjaGFyICoqb3V0LAorCQkJCQlpbnQgc2tjb250bGVuLCBjb25zdCBBU04xX0lURU0gKml0ZW0sCisJCQkJCWludCBkb19zb3J0LCBpbnQgaWNsYXNzKTsKK3N0YXRpYyBpbnQgYXNuMV90ZW1wbGF0ZV9leF9pMmQoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0LAorCQkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzKTsKK3N0YXRpYyBpbnQgYXNuMV9pdGVtX2ZsYWdzX2kyZChBU04xX1ZBTFVFICp2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBmbGFncyk7CisKKy8qIFRvcCBsZXZlbCBpMmQgZXF1aXZhbGVudHM6IHRoZSAnbmRlZicgdmFyaWFudCBpbnN0cnVjdHMgdGhlIGVuY29kZXIKKyAqIHRvIHVzZSBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBlbmNvZGluZywgd2hlcmUgYXBwcm9wcmlhdGUKKyAqLworCitpbnQgQVNOMV9pdGVtX25kZWZfaTJkKEFTTjFfVkFMVUUgKnZhbCwgdW5zaWduZWQgY2hhciAqKm91dCwKKwkJCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCXJldHVybiBhc24xX2l0ZW1fZmxhZ3NfaTJkKHZhbCwgb3V0LCBpdCwgQVNOMV9URkxHX05ERUYpOworCX0KKworaW50IEFTTjFfaXRlbV9pMmQoQVNOMV9WQUxVRSAqdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0KQorCXsKKwlyZXR1cm4gYXNuMV9pdGVtX2ZsYWdzX2kyZCh2YWwsIG91dCwgaXQsIDApOworCX0KKworLyogRW5jb2RlIGFuIEFTTjEgaXRlbSwgdGhpcyBpcyB1c2UgYnkgdGhlCisgKiBzdGFuZGFyZCAnaTJkJyBmdW5jdGlvbi4gJ291dCcgcG9pbnRzIHRvIAorICogYSBidWZmZXIgdG8gb3V0cHV0IHRoZSBkYXRhIHRvLgorICoKKyAqIFRoZSBuZXcgaTJkIGhhcyBvbmUgYWRkaXRpb25hbCBmZWF0dXJlLiBJZiB0aGUgb3V0cHV0CisgKiBidWZmZXIgaXMgTlVMTCAoaS5lLiAqb3V0ID09IE5VTEwpIHRoZW4gYSBidWZmZXIgaXMKKyAqIGFsbG9jYXRlZCBhbmQgcG9wdWxhdGVkIHdpdGggdGhlIGVuY29kaW5nLgorICovCisKK3N0YXRpYyBpbnQgYXNuMV9pdGVtX2ZsYWdzX2kyZChBU04xX1ZBTFVFICp2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBmbGFncykKKwl7CisJaWYgKG91dCAmJiAhKm91dCkKKwkJeworCQl1bnNpZ25lZCBjaGFyICpwLCAqYnVmOworCQlpbnQgbGVuOworCQlsZW4gPSBBU04xX2l0ZW1fZXhfaTJkKCZ2YWwsIE5VTEwsIGl0LCAtMSwgZmxhZ3MpOworCQlpZiAobGVuIDw9IDApCisJCQlyZXR1cm4gbGVuOworCQlidWYgPSBPUEVOU1NMX21hbGxvYyhsZW4pOworCQlpZiAoIWJ1ZikKKwkJCXJldHVybiAtMTsKKwkJcCA9IGJ1ZjsKKwkJQVNOMV9pdGVtX2V4X2kyZCgmdmFsLCAmcCwgaXQsIC0xLCBmbGFncyk7CisJCSpvdXQgPSBidWY7CisJCXJldHVybiBsZW47CisJCX0KKworCXJldHVybiBBU04xX2l0ZW1fZXhfaTJkKCZ2YWwsIG91dCwgaXQsIC0xLCBmbGFncyk7CisJfQorCisvKiBFbmNvZGUgYW4gaXRlbSwgdGFraW5nIGNhcmUgb2YgSU1QTElDSVQgdGFnZ2luZyAoaWYgYW55KS4KKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG5vcm1hbCBpdGVtIGhhbmRsaW5nOiBpdCBjYW4gYmUKKyAqIHVzZWQgaW4gZXh0ZXJuYWwgdHlwZXMuCisgKi8KKworaW50IEFTTjFfaXRlbV9leF9pMmQoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQljb25zdCBBU04xX0lURU0gKml0LCBpbnQgdGFnLCBpbnQgYWNsYXNzKQorCXsKKwljb25zdCBBU04xX1RFTVBMQVRFICp0dCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqcCA9IE5VTEw7CisJaW50IGksIHNlcWNvbnRsZW4sIHNlcWxlbiwgbmRlZiA9IDE7CisJY29uc3QgQVNOMV9DT01QQVRfRlVOQ1MgKmNmOworCWNvbnN0IEFTTjFfRVhURVJOX0ZVTkNTICplZjsKKwljb25zdCBBU04xX0FVWCAqYXV4ID0gaXQtPmZ1bmNzOworCUFTTjFfYXV4X2NiICphc24xX2NiID0gMDsKKworCWlmICgoaXQtPml0eXBlICE9IEFTTjFfSVRZUEVfUFJJTUlUSVZFKSAmJiAhKnB2YWwpCisJCXJldHVybiAwOworCisJaWYgKGF1eCAmJiBhdXgtPmFzbjFfY2IpCisJCSBhc24xX2NiID0gYXV4LT5hc24xX2NiOworCisJc3dpdGNoKGl0LT5pdHlwZSkKKwkJeworCisJCWNhc2UgQVNOMV9JVFlQRV9QUklNSVRJVkU6CisJCWlmIChpdC0+dGVtcGxhdGVzKQorCQkJcmV0dXJuIGFzbjFfdGVtcGxhdGVfZXhfaTJkKHB2YWwsIG91dCwgaXQtPnRlbXBsYXRlcywKKwkJCQkJCQkJdGFnLCBhY2xhc3MpOworCQlyZXR1cm4gYXNuMV9pMmRfZXhfcHJpbWl0aXZlKHB2YWwsIG91dCwgaXQsIHRhZywgYWNsYXNzKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0lUWVBFX01TVFJJTkc6CisJCXJldHVybiBhc24xX2kyZF9leF9wcmltaXRpdmUocHZhbCwgb3V0LCBpdCwgLTEsIGFjbGFzcyk7CisKKwkJY2FzZSBBU04xX0lUWVBFX0NIT0lDRToKKwkJaWYgKGFzbjFfY2IgJiYgIWFzbjFfY2IoQVNOMV9PUF9JMkRfUFJFLCBwdmFsLCBpdCwgTlVMTCkpCisJCQkJcmV0dXJuIDA7CisJCWkgPSBhc24xX2dldF9jaG9pY2Vfc2VsZWN0b3IocHZhbCwgaXQpOworCQlpZiAoKGkgPj0gMCkgJiYgKGkgPCBpdC0+dGNvdW50KSkKKwkJCXsKKwkJCUFTTjFfVkFMVUUgKipwY2h2YWw7CisJCQljb25zdCBBU04xX1RFTVBMQVRFICpjaHR0OworCQkJY2h0dCA9IGl0LT50ZW1wbGF0ZXMgKyBpOworCQkJcGNodmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIGNodHQpOworCQkJcmV0dXJuIGFzbjFfdGVtcGxhdGVfZXhfaTJkKHBjaHZhbCwgb3V0LCBjaHR0LAorCQkJCQkJCQktMSwgYWNsYXNzKTsKKwkJCX0KKwkJLyogRml4bWU6IGVycm9yIGNvbmRpdGlvbiBpZiBzZWxlY3RvciBvdXQgb2YgcmFuZ2UgKi8KKwkJaWYgKGFzbjFfY2IgJiYgIWFzbjFfY2IoQVNOMV9PUF9JMkRfUE9TVCwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCXJldHVybiAwOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfRVhURVJOOgorCQkvKiBJZiBuZXcgc3R5bGUgaTJkIGl0IGRvZXMgYWxsIHRoZSB3b3JrICovCisJCWVmID0gaXQtPmZ1bmNzOworCQlyZXR1cm4gZWYtPmFzbjFfZXhfaTJkKHB2YWwsIG91dCwgaXQsIHRhZywgYWNsYXNzKTsKKworCQljYXNlIEFTTjFfSVRZUEVfQ09NUEFUOgorCQkvKiBvbGQgc3R5bGUgaGFja2VyeS4uLiAqLworCQljZiA9IGl0LT5mdW5jczsKKwkJaWYgKG91dCkKKwkJCXAgPSAqb3V0OworCQlpID0gY2YtPmFzbjFfaTJkKCpwdmFsLCBvdXQpOworCQkvKiBGaXh1cCBmb3IgSU1QTElDSVQgdGFnOiBub3RlIHRoaXMgbWVzc2VzIHVwIGZvciB0YWdzID4gMzAsCisJCSAqIGJ1dCBzbyBkaWQgdGhlIG9sZCBjb2RlLiBUYWdzID4gMzAgYXJlIHZlcnkgcmFyZSBhbnl3YXkuCisJCSAqLworCQlpZiAob3V0ICYmICh0YWcgIT0gLTEpKQorCQkJKnAgPSBhY2xhc3MgfCB0YWcgfCAoKnAgJiBWX0FTTjFfQ09OU1RSVUNURUQpOworCQlyZXR1cm4gaTsKKwkJCisJCWNhc2UgQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFOgorCQkvKiBVc2UgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgaWYgcmVxdWVzdGVkICovCisJCWlmIChhY2xhc3MgJiBBU04xX1RGTEdfTkRFRikgbmRlZiA9IDI7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWNhc2UgQVNOMV9JVFlQRV9TRVFVRU5DRToKKwkJaSA9IGFzbjFfZW5jX3Jlc3RvcmUoJnNlcWNvbnRsZW4sIG91dCwgcHZhbCwgaXQpOworCQkvKiBBbiBlcnJvciBvY2N1cnJlZCAqLworCQlpZiAoaSA8IDApCisJCQlyZXR1cm4gMDsKKwkJLyogV2UgaGF2ZSBhIHZhbGlkIGNhY2hlZCBlbmNvZGluZy4uLiAqLworCQlpZiAoaSA+IDApCisJCQlyZXR1cm4gc2VxY29udGxlbjsKKwkJLyogT3RoZXJ3aXNlIGNhcnJ5IG9uICovCisJCXNlcWNvbnRsZW4gPSAwOworCQkvKiBJZiBubyBJTVBMSUNJVCB0YWdnaW5nIHNldCB0byBTRVFVRU5DRSwgVU5JVkVSU0FMICovCisJCWlmICh0YWcgPT0gLTEpCisJCQl7CisJCQl0YWcgPSBWX0FTTjFfU0VRVUVOQ0U7CisJCQkvKiBSZXRhaW4gYW55IG90aGVyIGZsYWdzIGluIGFjbGFzcyAqLworCQkJYWNsYXNzID0gKGFjbGFzcyAmIH5BU04xX1RGTEdfVEFHX0NMQVNTKQorCQkJCQl8IFZfQVNOMV9VTklWRVJTQUw7CisJCQl9CisJCWlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfSTJEX1BSRSwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCXJldHVybiAwOworCQkvKiBGaXJzdCB3b3JrIG91dCBzZXF1ZW5jZSBjb250ZW50IGxlbmd0aCAqLworCQlmb3IgKGkgPSAwLCB0dCA9IGl0LT50ZW1wbGF0ZXM7IGkgPCBpdC0+dGNvdW50OyB0dCsrLCBpKyspCisJCQl7CisJCQljb25zdCBBU04xX1RFTVBMQVRFICpzZXF0dDsKKwkJCUFTTjFfVkFMVUUgKipwc2VxdmFsOworCQkJc2VxdHQgPSBhc24xX2RvX2FkYihwdmFsLCB0dCwgMSk7CisJCQlpZiAoIXNlcXR0KQorCQkJCXJldHVybiAwOworCQkJcHNlcXZhbCA9IGFzbjFfZ2V0X2ZpZWxkX3B0cihwdmFsLCBzZXF0dCk7CisJCQkvKiBGSVhNRTogY2hlY2sgZm9yIGVycm9ycyBpbiBlbmhhbmNlZCB2ZXJzaW9uICovCisJCQlzZXFjb250bGVuICs9IGFzbjFfdGVtcGxhdGVfZXhfaTJkKHBzZXF2YWwsIE5VTEwsIHNlcXR0LAorCQkJCQkJCQktMSwgYWNsYXNzKTsKKwkJCX0KKworCQlzZXFsZW4gPSBBU04xX29iamVjdF9zaXplKG5kZWYsIHNlcWNvbnRsZW4sIHRhZyk7CisJCWlmICghb3V0KQorCQkJcmV0dXJuIHNlcWxlbjsKKwkJLyogT3V0cHV0IFNFUVVFTkNFIGhlYWRlciAqLworCQlBU04xX3B1dF9vYmplY3Qob3V0LCBuZGVmLCBzZXFjb250bGVuLCB0YWcsIGFjbGFzcyk7CisJCWZvciAoaSA9IDAsIHR0ID0gaXQtPnRlbXBsYXRlczsgaSA8IGl0LT50Y291bnQ7IHR0KyssIGkrKykKKwkJCXsKKwkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnNlcXR0OworCQkJQVNOMV9WQUxVRSAqKnBzZXF2YWw7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKHB2YWwsIHR0LCAxKTsKKwkJCWlmICghc2VxdHQpCisJCQkJcmV0dXJuIDA7CisJCQlwc2VxdmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHNlcXR0KTsKKwkJCS8qIEZJWE1FOiBjaGVjayBmb3IgZXJyb3JzIGluIGVuaGFuY2VkIHZlcnNpb24gKi8KKwkJCWFzbjFfdGVtcGxhdGVfZXhfaTJkKHBzZXF2YWwsIG91dCwgc2VxdHQsIC0xLCBhY2xhc3MpOworCQkJfQorCQlpZiAobmRlZiA9PSAyKQorCQkJQVNOMV9wdXRfZW9jKG91dCk7CisJCWlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfSTJEX1BPU1QsIHB2YWwsIGl0LCBOVUxMKSkKKwkJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHNlcWxlbjsKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKworCQl9CisJcmV0dXJuIDA7CisJfQorCitpbnQgQVNOMV90ZW1wbGF0ZV9pMmQoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQkJCQkJY29uc3QgQVNOMV9URU1QTEFURSAqdHQpCisJeworCXJldHVybiBhc24xX3RlbXBsYXRlX2V4X2kyZChwdmFsLCBvdXQsIHR0LCAtMSwgMCk7CisJfQorCitzdGF0aWMgaW50IGFzbjFfdGVtcGxhdGVfZXhfaTJkKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LAorCQkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0LCBpbnQgdGFnLCBpbnQgaWNsYXNzKQorCXsKKwlpbnQgaSwgcmV0LCBmbGFncywgdHRhZywgdGNsYXNzLCBuZGVmOworCWZsYWdzID0gdHQtPmZsYWdzOworCS8qIFdvcmsgb3V0IHRhZyBhbmQgY2xhc3MgdG8gdXNlOiB0YWdnaW5nIG1heSBjb21lCisJICogZWl0aGVyIGZyb20gdGhlIHRlbXBsYXRlIG9yIHRoZSBhcmd1bWVudHMsIG5vdCBib3RoCisJICogYmVjYXVzZSB0aGlzIHdvdWxkIGNyZWF0ZSBhbWJpZ3VpdHkuIEFkZGl0aW9uYWxseQorCSAqIHRoZSBpY2xhc3MgYXJndW1lbnQgbWF5IGNvbnRhaW4gc29tZSBhZGRpdGlvbmFsIGZsYWdzCisJICogd2hpY2ggc2hvdWxkIGJlIG5vdGVkIGFuZCBwYXNzZWQgZG93biB0byBvdGhlciBsZXZlbHMuCisJICovCisJaWYgKGZsYWdzICYgQVNOMV9URkxHX1RBR19NQVNLKQorCQl7CisJCS8qIEVycm9yIGlmIGFyZ3VtZW50IGFuZCB0ZW1wbGF0ZSB0YWdnaW5nICovCisJCWlmICh0YWcgIT0gLTEpCisJCQkvKiBGSVhNRTogZXJyb3IgY29kZSBoZXJlICovCisJCQlyZXR1cm4gLTE7CisJCS8qIEdldCB0YWdnaW5nIGZyb20gdGVtcGxhdGUgKi8KKwkJdHRhZyA9IHR0LT50YWc7CisJCXRjbGFzcyA9IGZsYWdzICYgQVNOMV9URkxHX1RBR19DTEFTUzsKKwkJfQorCWVsc2UgaWYgKHRhZyAhPSAtMSkKKwkJeworCQkvKiBObyB0ZW1wbGF0ZSB0YWdnaW5nLCBnZXQgZnJvbSBhcmd1bWVudHMgKi8KKwkJdHRhZyA9IHRhZzsKKwkJdGNsYXNzID0gaWNsYXNzICYgQVNOMV9URkxHX1RBR19DTEFTUzsKKwkJfQorCWVsc2UKKwkJeworCQl0dGFnID0gLTE7CisJCXRjbGFzcyA9IDA7CisJCX0KKwkvKiAKKwkgKiBSZW1vdmUgYW55IGNsYXNzIG1hc2sgZnJvbSBpZmxhZy4KKwkgKi8KKwlpY2xhc3MgJj0gfkFTTjFfVEZMR19UQUdfQ0xBU1M7CisKKwkvKiBBdCB0aGlzIHBvaW50ICd0dGFnJyBjb250YWlucyB0aGUgb3V0ZXIgdGFnIHRvIHVzZSwKKwkgKiAndGNsYXNzJyBpcyB0aGUgY2xhc3MgYW5kIGljbGFzcyBpcyBhbnkgZmxhZ3MgcGFzc2VkCisJICogdG8gdGhpcyBmdW5jdGlvbi4KKwkgKi8KKworCS8qIGlmIHRlbXBsYXRlIGFuZCBhcmd1bWVudHMgcmVxdWlyZSBuZGVmLCB1c2UgaXQgKi8KKwlpZiAoKGZsYWdzICYgQVNOMV9URkxHX05ERUYpICYmIChpY2xhc3MgJiBBU04xX1RGTEdfTkRFRikpCisJCW5kZWYgPSAyOworCWVsc2UgbmRlZiA9IDE7CisKKwlpZiAoZmxhZ3MgJiBBU04xX1RGTEdfU0tfTUFTSykKKwkJeworCQkvKiBTRVQgT0YsIFNFUVVFTkNFIE9GICovCisJCVNUQUNLX09GKEFTTjFfVkFMVUUpICpzayA9IChTVEFDS19PRihBU04xX1ZBTFVFKSAqKSpwdmFsOworCQlpbnQgaXNzZXQsIHNrdGFnLCBza2FjbGFzczsKKwkJaW50IHNrY29udGxlbiwgc2tsZW47CisJCUFTTjFfVkFMVUUgKnNraXRlbTsKKworCQlpZiAoISpwdmFsKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGZsYWdzICYgQVNOMV9URkxHX1NFVF9PRikKKwkJCXsKKwkJCWlzc2V0ID0gMTsKKwkJCS8qIDIgbWVhbnMgd2UgcmVvcmRlciAqLworCQkJaWYgKGZsYWdzICYgQVNOMV9URkxHX1NFUVVFTkNFX09GKQorCQkJCWlzc2V0ID0gMjsKKwkJCX0KKwkJZWxzZSBpc3NldCA9IDA7CisKKwkJLyogV29yayBvdXQgaW5uZXIgdGFnIHZhbHVlOiBpZiBFWFBMSUNJVAorCQkgKiBvciBubyB0YWdnaW5nIHVzZSB1bmRlcmx5aW5nIHR5cGUuCisJCSAqLworCQlpZiAoKHR0YWcgIT0gLTEpICYmICEoZmxhZ3MgJiBBU04xX1RGTEdfRVhQVEFHKSkKKwkJCXsKKwkJCXNrdGFnID0gdHRhZzsKKwkJCXNrYWNsYXNzID0gdGNsYXNzOworCQkJfQorCQllbHNlCisJCQl7CisJCQlza2FjbGFzcyA9IFZfQVNOMV9VTklWRVJTQUw7CisJCQlpZiAoaXNzZXQpCisJCQkJc2t0YWcgPSBWX0FTTjFfU0VUOworCQkJZWxzZSBza3RhZyA9IFZfQVNOMV9TRVFVRU5DRTsKKwkJCX0KKworCQkvKiBEZXRlcm1pbmUgdG90YWwgbGVuZ3RoIG9mIGl0ZW1zICovCisJCXNrY29udGxlbiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBza19BU04xX1ZBTFVFX251bShzayk7IGkrKykKKwkJCXsKKwkJCXNraXRlbSA9IHNrX0FTTjFfVkFMVUVfdmFsdWUoc2ssIGkpOworCQkJc2tjb250bGVuICs9IEFTTjFfaXRlbV9leF9pMmQoJnNraXRlbSwgTlVMTCwKKwkJCQkJCUFTTjFfSVRFTV9wdHIodHQtPml0ZW0pLAorCQkJCQkJCS0xLCBpY2xhc3MpOworCQkJfQorCQlza2xlbiA9IEFTTjFfb2JqZWN0X3NpemUobmRlZiwgc2tjb250bGVuLCBza3RhZyk7CisJCS8qIElmIEVYUExJQ0lUIG5lZWQgbGVuZ3RoIG9mIHN1cnJvdW5kaW5nIHRhZyAqLworCQlpZiAoZmxhZ3MgJiBBU04xX1RGTEdfRVhQVEFHKQorCQkJcmV0ID0gQVNOMV9vYmplY3Rfc2l6ZShuZGVmLCBza2xlbiwgdHRhZyk7CisJCWVsc2UgcmV0ID0gc2tsZW47CisKKwkJaWYgKCFvdXQpCisJCQlyZXR1cm4gcmV0OworCisJCS8qIE5vdyBlbmNvZGUgdGhpcyBsb3QuLi4gKi8KKwkJLyogRVhQTElDSVQgdGFnICovCisJCWlmIChmbGFncyAmIEFTTjFfVEZMR19FWFBUQUcpCisJCQlBU04xX3B1dF9vYmplY3Qob3V0LCBuZGVmLCBza2xlbiwgdHRhZywgdGNsYXNzKTsKKwkJLyogU0VUIG9yIFNFUVVFTkNFIGFuZCBJTVBMSUNJVCB0YWcgKi8KKwkJQVNOMV9wdXRfb2JqZWN0KG91dCwgbmRlZiwgc2tjb250bGVuLCBza3RhZywgc2thY2xhc3MpOworCQkvKiBBbmQgdGhlIHN0dWZmIGl0c2VsZiAqLworCQlhc24xX3NldF9zZXFfb3V0KHNrLCBvdXQsIHNrY29udGxlbiwgQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQkJCWlzc2V0LCBpY2xhc3MpOworCQlpZiAobmRlZiA9PSAyKQorCQkJeworCQkJQVNOMV9wdXRfZW9jKG91dCk7CisJCQlpZiAoZmxhZ3MgJiBBU04xX1RGTEdfRVhQVEFHKQorCQkJCUFTTjFfcHV0X2VvYyhvdXQpOworCQkJfQorCisJCXJldHVybiByZXQ7CisJCX0KKworCWlmIChmbGFncyAmIEFTTjFfVEZMR19FWFBUQUcpCisJCXsKKwkJLyogRVhQTElDSVQgdGFnZ2luZyAqLworCQkvKiBGaW5kIGxlbmd0aCBvZiB0YWdnZWQgaXRlbSAqLworCQlpID0gQVNOMV9pdGVtX2V4X2kyZChwdmFsLCBOVUxMLCBBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKKwkJCQkJCQkJLTEsIGljbGFzcyk7CisJCWlmICghaSkKKwkJCXJldHVybiAwOworCQkvKiBGaW5kIGxlbmd0aCBvZiBFWFBMSUNJVCB0YWcgKi8KKwkJcmV0ID0gQVNOMV9vYmplY3Rfc2l6ZShuZGVmLCBpLCB0dGFnKTsKKwkJaWYgKG91dCkKKwkJCXsKKwkJCS8qIE91dHB1dCB0YWcgYW5kIGl0ZW0gKi8KKwkJCUFTTjFfcHV0X29iamVjdChvdXQsIG5kZWYsIGksIHR0YWcsIHRjbGFzcyk7CisJCQlBU04xX2l0ZW1fZXhfaTJkKHB2YWwsIG91dCwgQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQkJCS0xLCBpY2xhc3MpOworCQkJaWYgKG5kZWYgPT0gMikKKwkJCQlBU04xX3B1dF9lb2Mob3V0KTsKKwkJCX0KKwkJcmV0dXJuIHJldDsKKwkJfQorCisJLyogRWl0aGVyIG5vcm1hbCBvciBJTVBMSUNJVCB0YWdnaW5nOiBjb21iaW5lIGNsYXNzIGFuZCBmbGFncyAqLworCXJldHVybiBBU04xX2l0ZW1fZXhfaTJkKHB2YWwsIG91dCwgQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQl0dGFnLCB0Y2xhc3MgfCBpY2xhc3MpOworCit9CisKKy8qIFRlbXBvcmFyeSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIERFUiBlbmNvZGluZyBvZiBpdGVtcyBmb3IgU0VUIE9GICovCisKK3R5cGVkZWYJc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBsZW5ndGg7CisJQVNOMV9WQUxVRSAqZmllbGQ7Cit9IERFUl9FTkM7CisKK3N0YXRpYyBpbnQgZGVyX2NtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQorCXsKKwljb25zdCBERVJfRU5DICpkMSA9IGEsICpkMiA9IGI7CisJaW50IGNtcGxlbiwgaTsKKwljbXBsZW4gPSAoZDEtPmxlbmd0aCA8IGQyLT5sZW5ndGgpID8gZDEtPmxlbmd0aCA6IGQyLT5sZW5ndGg7CisJaSA9IG1lbWNtcChkMS0+ZGF0YSwgZDItPmRhdGEsIGNtcGxlbik7CisJaWYgKGkpCisJCXJldHVybiBpOworCXJldHVybiBkMS0+bGVuZ3RoIC0gZDItPmxlbmd0aDsKKwl9CisKKy8qIE91dHB1dCB0aGUgY29udGVudCBvY3RldHMgb2YgU0VUIE9GIG9yIFNFUVVFTkNFIE9GICovCisKK3N0YXRpYyBpbnQgYXNuMV9zZXRfc2VxX291dChTVEFDS19PRihBU04xX1ZBTFVFKSAqc2ssIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQkJCWludCBza2NvbnRsZW4sIGNvbnN0IEFTTjFfSVRFTSAqaXRlbSwKKwkJCQkJaW50IGRvX3NvcnQsIGludCBpY2xhc3MpCisJeworCWludCBpOworCUFTTjFfVkFMVUUgKnNraXRlbTsKKwl1bnNpZ25lZCBjaGFyICp0bXBkYXQgPSBOVUxMLCAqcCA9IE5VTEw7CisJREVSX0VOQyAqZGVybHN0ID0gTlVMTCwgKnRkZXI7CisJaWYgKGRvX3NvcnQpCisJCSB7CisJCS8qIERvbid0IG5lZWQgdG8gc29ydCBsZXNzIHRoYW4gMiBpdGVtcyAqLworCQlpZiAoc2tfQVNOMV9WQUxVRV9udW0oc2spIDwgMikKKwkJCWRvX3NvcnQgPSAwOworCQllbHNlCisJCQl7CisJCQlkZXJsc3QgPSBPUEVOU1NMX21hbGxvYyhza19BU04xX1ZBTFVFX251bShzaykKKwkJCQkJCSogc2l6ZW9mKCpkZXJsc3QpKTsKKwkJCXRtcGRhdCA9IE9QRU5TU0xfbWFsbG9jKHNrY29udGxlbik7CisJCQlpZiAoIWRlcmxzdCB8fCAhdG1wZGF0KQorCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJLyogSWYgbm90IHNvcnRpbmcganVzdCBvdXRwdXQgZWFjaCBpdGVtICovCisJaWYgKCFkb19zb3J0KQorCQl7CisJCWZvciAoaSA9IDA7IGkgPCBza19BU04xX1ZBTFVFX251bShzayk7IGkrKykKKwkJCXsKKwkJCXNraXRlbSA9IHNrX0FTTjFfVkFMVUVfdmFsdWUoc2ssIGkpOworCQkJQVNOMV9pdGVtX2V4X2kyZCgmc2tpdGVtLCBvdXQsIGl0ZW0sIC0xLCBpY2xhc3MpOworCQkJfQorCQlyZXR1cm4gMTsKKwkJfQorCXAgPSB0bXBkYXQ7CisKKwkvKiBEb2luZyBzb3J0OiBidWlsZCB1cCBhIGxpc3Qgb2YgZWFjaCBtZW1iZXIncyBERVIgZW5jb2RpbmcgKi8KKwlmb3IgKGkgPSAwLCB0ZGVyID0gZGVybHN0OyBpIDwgc2tfQVNOMV9WQUxVRV9udW0oc2spOyBpKyssIHRkZXIrKykKKwkJeworCQlza2l0ZW0gPSBza19BU04xX1ZBTFVFX3ZhbHVlKHNrLCBpKTsKKwkJdGRlci0+ZGF0YSA9IHA7CisJCXRkZXItPmxlbmd0aCA9IEFTTjFfaXRlbV9leF9pMmQoJnNraXRlbSwgJnAsIGl0ZW0sIC0xLCBpY2xhc3MpOworCQl0ZGVyLT5maWVsZCA9IHNraXRlbTsKKwkJfQorCisJLyogTm93IHNvcnQgdGhlbSAqLworCXFzb3J0KGRlcmxzdCwgc2tfQVNOMV9WQUxVRV9udW0oc2spLCBzaXplb2YoKmRlcmxzdCksIGRlcl9jbXApOworCS8qIE91dHB1dCBzb3J0ZWQgREVSIGVuY29kaW5nICovCQorCXAgPSAqb3V0OworCWZvciAoaSA9IDAsIHRkZXIgPSBkZXJsc3Q7IGkgPCBza19BU04xX1ZBTFVFX251bShzayk7IGkrKywgdGRlcisrKQorCQl7CisJCW1lbWNweShwLCB0ZGVyLT5kYXRhLCB0ZGVyLT5sZW5ndGgpOworCQlwICs9IHRkZXItPmxlbmd0aDsKKwkJfQorCSpvdXQgPSBwOworCS8qIElmIGRvX3NvcnQgaXMgMiB0aGVuIHJlb3JkZXIgdGhlIFNUQUNLICovCisJaWYgKGRvX3NvcnQgPT0gMikKKwkJeworCQlmb3IgKGkgPSAwLCB0ZGVyID0gZGVybHN0OyBpIDwgc2tfQVNOMV9WQUxVRV9udW0oc2spOworCQkJCQkJCWkrKywgdGRlcisrKQorCQkJKHZvaWQpc2tfQVNOMV9WQUxVRV9zZXQoc2ssIGksIHRkZXItPmZpZWxkKTsKKwkJfQorCU9QRU5TU0xfZnJlZShkZXJsc3QpOworCU9QRU5TU0xfZnJlZSh0bXBkYXQpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBhc24xX2kyZF9leF9wcmltaXRpdmUoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgaW50IHRhZywgaW50IGFjbGFzcykKKwl7CisJaW50IGxlbjsKKwlpbnQgdXR5cGU7CisJaW50IHVzZXRhZzsKKwlpbnQgbmRlZiA9IDA7CisKKwl1dHlwZSA9IGl0LT51dHlwZTsKKworCS8qIEdldCBsZW5ndGggb2YgY29udGVudCBvY3RldHMgYW5kIG1heWJlIGZpbmQKKwkgKiBvdXQgdGhlIHVuZGVybHlpbmcgdHlwZS4KKwkgKi8KKworCWxlbiA9IGFzbjFfZXhfaTJjKHB2YWwsIE5VTEwsICZ1dHlwZSwgaXQpOworCisJLyogSWYgU0VRVUVOQ0UsIFNFVCBvciBPVEhFUiB0aGVuIGhlYWRlciBpcworCSAqIGluY2x1ZGVkIGluIHBzZXVkbyBjb250ZW50IG9jdGV0cyBzbyBkb24ndAorCSAqIGluY2x1ZGUgdGFnK2xlbmd0aC4gV2UgbmVlZCB0byBjaGVjayBoZXJlCisJICogYmVjYXVzZSB0aGUgY2FsbCB0byBhc24xX2V4X2kyYygpIGNvdWxkIGNoYW5nZQorCSAqIHV0eXBlLgorCSAqLworCWlmICgodXR5cGUgPT0gVl9BU04xX1NFUVVFTkNFKSB8fCAodXR5cGUgPT0gVl9BU04xX1NFVCkgfHwKKwkgICAodXR5cGUgPT0gVl9BU04xX09USEVSKSkKKwkJdXNldGFnID0gMDsKKwllbHNlIHVzZXRhZyA9IDE7CisKKwkvKiAtMSBtZWFucyBvbWl0IHR5cGUgKi8KKworCWlmIChsZW4gPT0gLTEpCisJCXJldHVybiAwOworCisJLyogLTIgcmV0dXJuIGlzIHNwZWNpYWwgbWVhbmluZyB1c2UgbmRlZiAqLworCWlmIChsZW4gPT0gLTIpCisJCXsKKwkJbmRlZiA9IDI7CisJCWxlbiA9IDA7CisJCX0KKworCS8qIElmIG5vdCBpbXBsaWNpdGx5IHRhZ2dlZCBnZXQgdGFnIGZyb20gdW5kZXJseWluZyB0eXBlICovCisJaWYgKHRhZyA9PSAtMSkgdGFnID0gdXR5cGU7CisKKwkvKiBPdXRwdXQgdGFnK2xlbmd0aCBmb2xsb3dlZCBieSBjb250ZW50IG9jdGV0cyAqLworCWlmIChvdXQpCisJCXsKKwkJaWYgKHVzZXRhZykKKwkJCUFTTjFfcHV0X29iamVjdChvdXQsIG5kZWYsIGxlbiwgdGFnLCBhY2xhc3MpOworCQlhc24xX2V4X2kyYyhwdmFsLCAqb3V0LCAmdXR5cGUsIGl0KTsKKwkJaWYgKG5kZWYpCisJCQlBU04xX3B1dF9lb2Mob3V0KTsKKwkJZWxzZQorCQkJKm91dCArPSBsZW47CisJCX0KKworCWlmICh1c2V0YWcpCisJCXJldHVybiBBU04xX29iamVjdF9zaXplKG5kZWYsIGxlbiwgdGFnKTsKKwlyZXR1cm4gbGVuOworCX0KKworLyogUHJvZHVjZSBjb250ZW50IG9jdGV0cyBmcm9tIGEgc3RydWN0dXJlICovCisKK2ludCBhc24xX2V4X2kyYyhBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqY291dCwgaW50ICpwdXR5cGUsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJQVNOMV9CT09MRUFOICp0Ym9vbCA9IE5VTEw7CisJQVNOMV9TVFJJTkcgKnN0cnRtcDsKKwlBU04xX09CSkVDVCAqb3RtcDsKKwlpbnQgdXR5cGU7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY29udDsKKwl1bnNpZ25lZCBjaGFyIGM7CisJaW50IGxlbjsKKwljb25zdCBBU04xX1BSSU1JVElWRV9GVU5DUyAqcGY7CisJcGYgPSBpdC0+ZnVuY3M7CisJaWYgKHBmICYmIHBmLT5wcmltX2kyYykKKwkJcmV0dXJuIHBmLT5wcmltX2kyYyhwdmFsLCBjb3V0LCBwdXR5cGUsIGl0KTsKKworCS8qIFNob3VsZCB0eXBlIGJlIG9taXR0ZWQ/ICovCisJaWYgKChpdC0+aXR5cGUgIT0gQVNOMV9JVFlQRV9QUklNSVRJVkUpCisJCXx8IChpdC0+dXR5cGUgIT0gVl9BU04xX0JPT0xFQU4pKQorCQl7CisJCWlmICghKnB2YWwpIHJldHVybiAtMTsKKwkJfQorCisJaWYgKGl0LT5pdHlwZSA9PSBBU04xX0lUWVBFX01TVFJJTkcpCisJCXsKKwkJLyogSWYgTVNUUklORyB0eXBlIHNldCB0aGUgdW5kZXJseWluZyB0eXBlICovCisJCXN0cnRtcCA9IChBU04xX1NUUklORyAqKSpwdmFsOworCQl1dHlwZSA9IHN0cnRtcC0+dHlwZTsKKwkJKnB1dHlwZSA9IHV0eXBlOworCQl9CisJZWxzZSBpZiAoaXQtPnV0eXBlID09IFZfQVNOMV9BTlkpCisJCXsKKwkJLyogSWYgQU5ZIHNldCB0eXBlIGFuZCBwb2ludGVyIHRvIHZhbHVlICovCisJCUFTTjFfVFlQRSAqdHlwOworCQl0eXAgPSAoQVNOMV9UWVBFICopKnB2YWw7CisJCXV0eXBlID0gdHlwLT50eXBlOworCQkqcHV0eXBlID0gdXR5cGU7CisJCXB2YWwgPSAmdHlwLT52YWx1ZS5hc24xX3ZhbHVlOworCQl9CisJZWxzZSB1dHlwZSA9ICpwdXR5cGU7CisKKwlzd2l0Y2godXR5cGUpCisJCXsKKwkJY2FzZSBWX0FTTjFfT0JKRUNUOgorCQlvdG1wID0gKEFTTjFfT0JKRUNUICopKnB2YWw7CisJCWNvbnQgPSBvdG1wLT5kYXRhOworCQlsZW4gPSBvdG1wLT5sZW5ndGg7CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX05VTEw6CisJCWNvbnQgPSBOVUxMOworCQlsZW4gPSAwOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9CT09MRUFOOgorCQl0Ym9vbCA9IChBU04xX0JPT0xFQU4gKilwdmFsOworCQlpZiAoKnRib29sID09IC0xKQorCQkJcmV0dXJuIC0xOworCQlpZiAoaXQtPnV0eXBlICE9IFZfQVNOMV9BTlkpCisJCQl7CisJCQkvKiBEZWZhdWx0IGhhbmRsaW5nIGlmIHZhbHVlID09IHNpemUgZmllbGQgdGhlbiBvbWl0ICovCisJCQlpZiAoKnRib29sICYmIChpdC0+c2l6ZSA+IDApKQorCQkJCXJldHVybiAtMTsKKwkJCWlmICghKnRib29sICYmICFpdC0+c2l6ZSkKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCWMgPSAodW5zaWduZWQgY2hhcikqdGJvb2w7CisJCWNvbnQgPSAmYzsKKwkJbGVuID0gMTsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfQklUX1NUUklORzoKKwkJcmV0dXJuIGkyY19BU04xX0JJVF9TVFJJTkcoKEFTTjFfQklUX1NUUklORyAqKSpwdmFsLAorCQkJCQkJCWNvdXQgPyAmY291dCA6IE5VTEwpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9JTlRFR0VSOgorCQljYXNlIFZfQVNOMV9ORUdfSU5URUdFUjoKKwkJY2FzZSBWX0FTTjFfRU5VTUVSQVRFRDoKKwkJY2FzZSBWX0FTTjFfTkVHX0VOVU1FUkFURUQ6CisJCS8qIFRoZXNlIGFyZSBhbGwgaGF2ZSB0aGUgc2FtZSBjb250ZW50IGZvcm1hdAorCQkgKiBhcyBBU04xX0lOVEVHRVIKKwkJICovCisJCXJldHVybiBpMmNfQVNOMV9JTlRFR0VSKChBU04xX0lOVEVHRVIgKikqcHZhbCwKKwkJCQkJCQljb3V0ID8gJmNvdXQgOiBOVUxMKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfT0NURVRfU1RSSU5HOgorCQljYXNlIFZfQVNOMV9OVU1FUklDU1RSSU5HOgorCQljYXNlIFZfQVNOMV9QUklOVEFCTEVTVFJJTkc6CisJCWNhc2UgVl9BU04xX1Q2MVNUUklORzoKKwkJY2FzZSBWX0FTTjFfVklERU9URVhTVFJJTkc6CisJCWNhc2UgVl9BU04xX0lBNVNUUklORzoKKwkJY2FzZSBWX0FTTjFfVVRDVElNRToKKwkJY2FzZSBWX0FTTjFfR0VORVJBTElaRURUSU1FOgorCQljYXNlIFZfQVNOMV9HUkFQSElDU1RSSU5HOgorCQljYXNlIFZfQVNOMV9WSVNJQkxFU1RSSU5HOgorCQljYXNlIFZfQVNOMV9HRU5FUkFMU1RSSU5HOgorCQljYXNlIFZfQVNOMV9VTklWRVJTQUxTVFJJTkc6CisJCWNhc2UgVl9BU04xX0JNUFNUUklORzoKKwkJY2FzZSBWX0FTTjFfVVRGOFNUUklORzoKKwkJY2FzZSBWX0FTTjFfU0VRVUVOQ0U6CisJCWNhc2UgVl9BU04xX1NFVDoKKwkJZGVmYXVsdDoKKwkJLyogQWxsIGJhc2VkIG9uIEFTTjFfU1RSSU5HIGFuZCBoYW5kbGVkIHRoZSBzYW1lICovCisJCXN0cnRtcCA9IChBU04xX1NUUklORyAqKSpwdmFsOworCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBOREVGICovCisJCWlmICgoaXQtPnNpemUgPT0gQVNOMV9URkxHX05ERUYpCisJCQkmJiAoc3RydG1wLT5mbGFncyAmIEFTTjFfU1RSSU5HX0ZMQUdfTkRFRikpCisJCQl7CisJCQlpZiAoY291dCkKKwkJCQl7CisJCQkJc3RydG1wLT5kYXRhID0gY291dDsKKwkJCQlzdHJ0bXAtPmxlbmd0aCA9IDA7CisJCQkJfQorCQkJLyogU3BlY2lhbCByZXR1cm4gY29kZSAqLworCQkJcmV0dXJuIC0yOworCQkJfQorCQljb250ID0gc3RydG1wLT5kYXRhOworCQlsZW4gPSBzdHJ0bXAtPmxlbmd0aDsKKworCQlicmVhazsKKworCQl9CisJaWYgKGNvdXQgJiYgbGVuKQorCQltZW1jcHkoY291dCwgY29udCwgbGVuKTsKKwlyZXR1cm4gbGVuOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fZnJlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX2ZyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDMwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX2ZyZS5jCkBAIC0wLDAgKzEsMjY2IEBACisvKiB0YXNuX2ZyZS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKK3N0YXRpYyB2b2lkIGFzbjFfaXRlbV9jb21iaW5lX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBjb21iaW5lKTsKKworLyogRnJlZSB1cCBhbiBBU04xIHN0cnVjdHVyZSAqLworCit2b2lkIEFTTjFfaXRlbV9mcmVlKEFTTjFfVkFMVUUgKnZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJYXNuMV9pdGVtX2NvbWJpbmVfZnJlZSgmdmFsLCBpdCwgMCk7CisJfQorCit2b2lkIEFTTjFfaXRlbV9leF9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQorCXsKKwlhc24xX2l0ZW1fY29tYmluZV9mcmVlKHB2YWwsIGl0LCAwKTsKKwl9CisKK3N0YXRpYyB2b2lkIGFzbjFfaXRlbV9jb21iaW5lX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBjb21iaW5lKQorCXsKKwljb25zdCBBU04xX1RFTVBMQVRFICp0dCA9IE5VTEwsICpzZXF0dDsKKwljb25zdCBBU04xX0VYVEVSTl9GVU5DUyAqZWY7CisJY29uc3QgQVNOMV9DT01QQVRfRlVOQ1MgKmNmOworCWNvbnN0IEFTTjFfQVVYICphdXggPSBpdC0+ZnVuY3M7CisJQVNOMV9hdXhfY2IgKmFzbjFfY2I7CisJaW50IGk7CisJaWYgKCFwdmFsKQorCQlyZXR1cm47CisJaWYgKChpdC0+aXR5cGUgIT0gQVNOMV9JVFlQRV9QUklNSVRJVkUpICYmICEqcHZhbCkKKwkJcmV0dXJuOworCWlmIChhdXggJiYgYXV4LT5hc24xX2NiKQorCQlhc24xX2NiID0gYXV4LT5hc24xX2NiOworCWVsc2UKKwkJYXNuMV9jYiA9IDA7CisKKwlzd2l0Y2goaXQtPml0eXBlKQorCQl7CisKKwkJY2FzZSBBU04xX0lUWVBFX1BSSU1JVElWRToKKwkJaWYgKGl0LT50ZW1wbGF0ZXMpCisJCQlBU04xX3RlbXBsYXRlX2ZyZWUocHZhbCwgaXQtPnRlbXBsYXRlcyk7CisJCWVsc2UKKwkJCUFTTjFfcHJpbWl0aXZlX2ZyZWUocHZhbCwgaXQpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfTVNUUklORzoKKwkJQVNOMV9wcmltaXRpdmVfZnJlZShwdmFsLCBpdCk7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9DSE9JQ0U6CisJCWlmIChhc24xX2NiKQorCQkJeworCQkJaSA9IGFzbjFfY2IoQVNOMV9PUF9GUkVFX1BSRSwgcHZhbCwgaXQsIE5VTEwpOworCQkJaWYgKGkgPT0gMikKKwkJCQlyZXR1cm47CisJCQl9CisJCWkgPSBhc24xX2dldF9jaG9pY2Vfc2VsZWN0b3IocHZhbCwgaXQpOworCQlpZiAoKGkgPj0gMCkgJiYgKGkgPCBpdC0+dGNvdW50KSkKKwkJCXsKKwkJCUFTTjFfVkFMVUUgKipwY2h2YWw7CisJCQl0dCA9IGl0LT50ZW1wbGF0ZXMgKyBpOworCQkJcGNodmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHR0KTsKKwkJCUFTTjFfdGVtcGxhdGVfZnJlZShwY2h2YWwsIHR0KTsKKwkJCX0KKwkJaWYgKGFzbjFfY2IpCisJCQlhc24xX2NiKEFTTjFfT1BfRlJFRV9QT1NULCBwdmFsLCBpdCwgTlVMTCk7CisJCWlmICghY29tYmluZSkKKwkJCXsKKwkJCU9QRU5TU0xfZnJlZSgqcHZhbCk7CisJCQkqcHZhbCA9IE5VTEw7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9DT01QQVQ6CisJCWNmID0gaXQtPmZ1bmNzOworCQlpZiAoY2YgJiYgY2YtPmFzbjFfZnJlZSkKKwkJCWNmLT5hc24xX2ZyZWUoKnB2YWwpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfRVhURVJOOgorCQllZiA9IGl0LT5mdW5jczsKKwkJaWYgKGVmICYmIGVmLT5hc24xX2V4X2ZyZWUpCisJCQllZi0+YXNuMV9leF9mcmVlKHB2YWwsIGl0KTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0lUWVBFX05ERUZfU0VRVUVOQ0U6CisJCWNhc2UgQVNOMV9JVFlQRV9TRVFVRU5DRToKKwkJaWYgKGFzbjFfZG9fbG9jayhwdmFsLCAtMSwgaXQpID4gMCkKKwkJCXJldHVybjsKKwkJaWYgKGFzbjFfY2IpCisJCQl7CisJCQlpID0gYXNuMV9jYihBU04xX09QX0ZSRUVfUFJFLCBwdmFsLCBpdCwgTlVMTCk7CisJCQlpZiAoaSA9PSAyKQorCQkJCXJldHVybjsKKwkJCX0JCQorCQlhc24xX2VuY19mcmVlKHB2YWwsIGl0KTsKKwkJLyogSWYgd2UgZnJlZSB1cCBhcyBub3JtYWwgd2Ugd2lsbCBpbnZhbGlkYXRlIGFueQorCQkgKiBBTlkgREVGSU5FRCBCWSBmaWVsZCBhbmQgd2Ugd29udCBiZSBhYmxlIHRvIAorCQkgKiBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgdGhlIGZpZWxkIGl0IGRlZmluZXMuIFNvCisJCSAqIGZyZWUgdXAgaW4gcmV2ZXJzZSBvcmRlci4KKwkJICovCisJCXR0ID0gaXQtPnRlbXBsYXRlcyArIGl0LT50Y291bnQgLSAxOworCQlmb3IgKGkgPSAwOyBpIDwgaXQtPnRjb3VudDsgdHQtLSwgaSsrKQorCQkJeworCQkJQVNOMV9WQUxVRSAqKnBzZXF2YWw7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKHB2YWwsIHR0LCAwKTsKKwkJCWlmICghc2VxdHQpCisJCQkJY29udGludWU7CisJCQlwc2VxdmFsID0gYXNuMV9nZXRfZmllbGRfcHRyKHB2YWwsIHNlcXR0KTsKKwkJCUFTTjFfdGVtcGxhdGVfZnJlZShwc2VxdmFsLCBzZXF0dCk7CisJCQl9CisJCWlmIChhc24xX2NiKQorCQkJYXNuMV9jYihBU04xX09QX0ZSRUVfUE9TVCwgcHZhbCwgaXQsIE5VTEwpOworCQlpZiAoIWNvbWJpbmUpCisJCQl7CisJCQlPUEVOU1NMX2ZyZWUoKnB2YWwpOworCQkJKnB2YWwgPSBOVUxMOworCQkJfQorCQlicmVhazsKKwkJfQorCX0KKwordm9pZCBBU04xX3RlbXBsYXRlX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfVEVNUExBVEUgKnR0KQorCXsKKwlpbnQgaTsKKwlpZiAodHQtPmZsYWdzICYgQVNOMV9URkxHX1NLX01BU0spCisJCXsKKwkJU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKnNrID0gKFNUQUNLX09GKEFTTjFfVkFMVUUpICopKnB2YWw7CisJCWZvciAoaSA9IDA7IGkgPCBza19BU04xX1ZBTFVFX251bShzayk7IGkrKykKKwkJCXsKKwkJCUFTTjFfVkFMVUUgKnZ0bXA7CisJCQl2dG1wID0gc2tfQVNOMV9WQUxVRV92YWx1ZShzaywgaSk7CisJCQlhc24xX2l0ZW1fY29tYmluZV9mcmVlKCZ2dG1wLCBBU04xX0lURU1fcHRyKHR0LT5pdGVtKSwKKwkJCQkJCQkJCTApOworCQkJfQorCQlza19BU04xX1ZBTFVFX2ZyZWUoc2spOworCQkqcHZhbCA9IE5VTEw7CisJCX0KKwllbHNlCisJCWFzbjFfaXRlbV9jb21iaW5lX2ZyZWUocHZhbCwgQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQl0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfQ09NQklORSk7CisJfQorCit2b2lkIEFTTjFfcHJpbWl0aXZlX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCWludCB1dHlwZTsKKwlpZiAoaXQpCisJCXsKKwkJY29uc3QgQVNOMV9QUklNSVRJVkVfRlVOQ1MgKnBmOworCQlwZiA9IGl0LT5mdW5jczsKKwkJaWYgKHBmICYmIHBmLT5wcmltX2ZyZWUpCisJCQl7CisJCQlwZi0+cHJpbV9mcmVlKHB2YWwsIGl0KTsKKwkJCXJldHVybjsKKwkJCX0KKwkJfQorCS8qIFNwZWNpYWwgY2FzZTogaWYgJ2l0JyBpcyBOVUxMIGZyZWUgY29udGVudHMgb2YgQVNOMV9UWVBFICovCisJaWYgKCFpdCkKKwkJeworCQlBU04xX1RZUEUgKnR5cCA9IChBU04xX1RZUEUgKikqcHZhbDsKKwkJdXR5cGUgPSB0eXAtPnR5cGU7CisJCXB2YWwgPSAmdHlwLT52YWx1ZS5hc24xX3ZhbHVlOworCQlpZiAoISpwdmFsKQorCQkJcmV0dXJuOworCQl9CisJZWxzZSBpZiAoaXQtPml0eXBlID09IEFTTjFfSVRZUEVfTVNUUklORykKKwkJeworCQl1dHlwZSA9IC0xOworCQlpZiAoISpwdmFsKQorCQkJcmV0dXJuOworCQl9CisJZWxzZQorCQl7CisJCXV0eXBlID0gaXQtPnV0eXBlOworCQlpZiAoKHV0eXBlICE9IFZfQVNOMV9CT09MRUFOKSAmJiAhKnB2YWwpCisJCQlyZXR1cm47CisJCX0KKworCXN3aXRjaCh1dHlwZSkKKwkJeworCQljYXNlIFZfQVNOMV9PQkpFQ1Q6CisJCUFTTjFfT0JKRUNUX2ZyZWUoKEFTTjFfT0JKRUNUICopKnB2YWwpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9CT09MRUFOOgorCQlpZiAoaXQpCisJCQkqKEFTTjFfQk9PTEVBTiAqKXB2YWwgPSBpdC0+c2l6ZTsKKwkJZWxzZQorCQkJKihBU04xX0JPT0xFQU4gKilwdmFsID0gLTE7CisJCXJldHVybjsKKworCQljYXNlIFZfQVNOMV9OVUxMOgorCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9BTlk6CisJCUFTTjFfcHJpbWl0aXZlX2ZyZWUocHZhbCwgTlVMTCk7CisJCU9QRU5TU0xfZnJlZSgqcHZhbCk7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopKnB2YWwpOworCQkqcHZhbCA9IE5VTEw7CisJCWJyZWFrOworCQl9CisJKnB2YWwgPSBOVUxMOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fbmV3LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX25ldy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOWU3OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX25ldy5jCkBAIC0wLDAgKzEsMzk2IEBACisvKiB0YXNuX25ldy5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitzdGF0aWMgaW50IGFzbjFfaXRlbV9leF9jb21iaW5lX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQkJCQkJaW50IGNvbWJpbmUpOworc3RhdGljIHZvaWQgYXNuMV9pdGVtX2NsZWFyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK3N0YXRpYyB2b2lkIGFzbjFfdGVtcGxhdGVfY2xlYXIoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfVEVNUExBVEUgKnR0KTsKK3N0YXRpYyB2b2lkIGFzbjFfcHJpbWl0aXZlX2NsZWFyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKKworQVNOMV9WQUxVRSAqQVNOMV9pdGVtX25ldyhjb25zdCBBU04xX0lURU0gKml0KQorCXsKKwlBU04xX1ZBTFVFICpyZXQgPSBOVUxMOworCWlmIChBU04xX2l0ZW1fZXhfbmV3KCZyZXQsIGl0KSA+IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIE5VTEw7CisJfQorCisvKiBBbGxvY2F0ZSBhbiBBU04xIHN0cnVjdHVyZSAqLworCitpbnQgQVNOMV9pdGVtX2V4X25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJcmV0dXJuIGFzbjFfaXRlbV9leF9jb21iaW5lX25ldyhwdmFsLCBpdCwgMCk7CisJfQorCitzdGF0aWMgaW50IGFzbjFfaXRlbV9leF9jb21iaW5lX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQkJCQkJaW50IGNvbWJpbmUpCisJeworCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0ID0gTlVMTDsKKwljb25zdCBBU04xX0NPTVBBVF9GVU5DUyAqY2Y7CisJY29uc3QgQVNOMV9FWFRFUk5fRlVOQ1MgKmVmOworCWNvbnN0IEFTTjFfQVVYICphdXggPSBpdC0+ZnVuY3M7CisJQVNOMV9hdXhfY2IgKmFzbjFfY2I7CisJQVNOMV9WQUxVRSAqKnBzZXF2YWw7CisJaW50IGk7CisJaWYgKGF1eCAmJiBhdXgtPmFzbjFfY2IpCisJCWFzbjFfY2IgPSBhdXgtPmFzbjFfY2I7CisJZWxzZQorCQlhc24xX2NiID0gMDsKKworCWlmICghY29tYmluZSkgKnB2YWwgPSBOVUxMOworCisjaWZkZWYgQ1JZUFRPX01ERUJVRworCWlmIChpdC0+c25hbWUpCisJCUNSWVBUT19wdXNoX2luZm8oaXQtPnNuYW1lKTsKKyNlbmRpZgorCisJc3dpdGNoKGl0LT5pdHlwZSkKKwkJeworCisJCWNhc2UgQVNOMV9JVFlQRV9FWFRFUk46CisJCWVmID0gaXQtPmZ1bmNzOworCQlpZiAoZWYgJiYgZWYtPmFzbjFfZXhfbmV3KQorCQkJeworCQkJaWYgKCFlZi0+YXNuMV9leF9uZXcocHZhbCwgaXQpKQorCQkJCWdvdG8gbWVtZXJyOworCQkJfQorCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfQ09NUEFUOgorCQljZiA9IGl0LT5mdW5jczsKKwkJaWYgKGNmICYmIGNmLT5hc24xX25ldykgeworCQkJKnB2YWwgPSBjZi0+YXNuMV9uZXcoKTsKKwkJCWlmICghKnB2YWwpCisJCQkJZ290byBtZW1lcnI7CisJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0lUWVBFX1BSSU1JVElWRToKKwkJaWYgKGl0LT50ZW1wbGF0ZXMpCisJCQl7CisJCQlpZiAoIUFTTjFfdGVtcGxhdGVfbmV3KHB2YWwsIGl0LT50ZW1wbGF0ZXMpKQorCQkJCWdvdG8gbWVtZXJyOworCQkJfQorCQllbHNlIGlmICghQVNOMV9wcmltaXRpdmVfbmV3KHB2YWwsIGl0KSkKKwkJCQlnb3RvIG1lbWVycjsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0lUWVBFX01TVFJJTkc6CisJCWlmICghQVNOMV9wcmltaXRpdmVfbmV3KHB2YWwsIGl0KSkKKwkJCQlnb3RvIG1lbWVycjsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX0lUWVBFX0NIT0lDRToKKwkJaWYgKGFzbjFfY2IpCisJCQl7CisJCQlpID0gYXNuMV9jYihBU04xX09QX05FV19QUkUsIHB2YWwsIGl0LCBOVUxMKTsKKwkJCWlmICghaSkKKwkJCQlnb3RvIGF1eGVycjsKKwkJCWlmIChpPT0yKQorCQkJCXsKKyNpZmRlZiBDUllQVE9fTURFQlVHCisJCQkJaWYgKGl0LT5zbmFtZSkKKwkJCQkJQ1JZUFRPX3BvcF9pbmZvKCk7CisjZW5kaWYKKwkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCWlmICghY29tYmluZSkKKwkJCXsKKwkJCSpwdmFsID0gT1BFTlNTTF9tYWxsb2MoaXQtPnNpemUpOworCQkJaWYgKCEqcHZhbCkKKwkJCQlnb3RvIG1lbWVycjsKKwkJCW1lbXNldCgqcHZhbCwgMCwgaXQtPnNpemUpOworCQkJfQorCQlhc24xX3NldF9jaG9pY2Vfc2VsZWN0b3IocHZhbCwgLTEsIGl0KTsKKwkJaWYgKGFzbjFfY2IgJiYgIWFzbjFfY2IoQVNOMV9PUF9ORVdfUE9TVCwgcHZhbCwgaXQsIE5VTEwpKQorCQkJCWdvdG8gYXV4ZXJyOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfTkRFRl9TRVFVRU5DRToKKwkJY2FzZSBBU04xX0lUWVBFX1NFUVVFTkNFOgorCQlpZiAoYXNuMV9jYikKKwkJCXsKKwkJCWkgPSBhc24xX2NiKEFTTjFfT1BfTkVXX1BSRSwgcHZhbCwgaXQsIE5VTEwpOworCQkJaWYgKCFpKQorCQkJCWdvdG8gYXV4ZXJyOworCQkJaWYgKGk9PTIpCisJCQkJeworI2lmZGVmIENSWVBUT19NREVCVUcKKwkJCQlpZiAoaXQtPnNuYW1lKQorCQkJCQlDUllQVE9fcG9wX2luZm8oKTsKKyNlbmRpZgorCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJaWYgKCFjb21iaW5lKQorCQkJeworCQkJKnB2YWwgPSBPUEVOU1NMX21hbGxvYyhpdC0+c2l6ZSk7CisJCQlpZiAoISpwdmFsKQorCQkJCWdvdG8gbWVtZXJyOworCQkJbWVtc2V0KCpwdmFsLCAwLCBpdC0+c2l6ZSk7CisJCQlhc24xX2RvX2xvY2socHZhbCwgMCwgaXQpOworCQkJYXNuMV9lbmNfaW5pdChwdmFsLCBpdCk7CisJCQl9CisJCWZvciAoaSA9IDAsIHR0ID0gaXQtPnRlbXBsYXRlczsgaSA8IGl0LT50Y291bnQ7IHR0KyssIGkrKykKKwkJCXsKKwkJCXBzZXF2YWwgPSBhc24xX2dldF9maWVsZF9wdHIocHZhbCwgdHQpOworCQkJaWYgKCFBU04xX3RlbXBsYXRlX25ldyhwc2VxdmFsLCB0dCkpCisJCQkJZ290byBtZW1lcnI7CisJCQl9CisJCWlmIChhc24xX2NiICYmICFhc24xX2NiKEFTTjFfT1BfTkVXX1BPU1QsIHB2YWwsIGl0LCBOVUxMKSkKKwkJCQlnb3RvIGF1eGVycjsKKwkJYnJlYWs7CisJfQorI2lmZGVmIENSWVBUT19NREVCVUcKKwlpZiAoaXQtPnNuYW1lKSBDUllQVE9fcG9wX2luZm8oKTsKKyNlbmRpZgorCXJldHVybiAxOworCisJbWVtZXJyOgorCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9DT01CSU5FX05FVywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworI2lmZGVmIENSWVBUT19NREVCVUcKKwlpZiAoaXQtPnNuYW1lKSBDUllQVE9fcG9wX2luZm8oKTsKKyNlbmRpZgorCXJldHVybiAwOworCisJYXV4ZXJyOgorCUFTTjFlcnIoQVNOMV9GX0FTTjFfSVRFTV9FWF9DT01CSU5FX05FVywgQVNOMV9SX0FVWF9FUlJPUik7CisJQVNOMV9pdGVtX2V4X2ZyZWUocHZhbCwgaXQpOworI2lmZGVmIENSWVBUT19NREVCVUcKKwlpZiAoaXQtPnNuYW1lKSBDUllQVE9fcG9wX2luZm8oKTsKKyNlbmRpZgorCXJldHVybiAwOworCisJfQorCitzdGF0aWMgdm9pZCBhc24xX2l0ZW1fY2xlYXIoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCWNvbnN0IEFTTjFfRVhURVJOX0ZVTkNTICplZjsKKworCXN3aXRjaChpdC0+aXR5cGUpCisJCXsKKworCQljYXNlIEFTTjFfSVRZUEVfRVhURVJOOgorCQllZiA9IGl0LT5mdW5jczsKKwkJaWYgKGVmICYmIGVmLT5hc24xX2V4X2NsZWFyKSAKKwkJCWVmLT5hc24xX2V4X2NsZWFyKHB2YWwsIGl0KTsKKwkJZWxzZSAqcHZhbCA9IE5VTEw7CisJCWJyZWFrOworCisKKwkJY2FzZSBBU04xX0lUWVBFX1BSSU1JVElWRToKKwkJaWYgKGl0LT50ZW1wbGF0ZXMpIAorCQkJYXNuMV90ZW1wbGF0ZV9jbGVhcihwdmFsLCBpdC0+dGVtcGxhdGVzKTsKKwkJZWxzZQorCQkJYXNuMV9wcmltaXRpdmVfY2xlYXIocHZhbCwgaXQpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfTVNUUklORzoKKwkJYXNuMV9wcmltaXRpdmVfY2xlYXIocHZhbCwgaXQpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfQ09NUEFUOgorCQljYXNlIEFTTjFfSVRZUEVfQ0hPSUNFOgorCQljYXNlIEFTTjFfSVRZUEVfU0VRVUVOQ0U6CisJCWNhc2UgQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFOgorCQkqcHZhbCA9IE5VTEw7CisJCWJyZWFrOworCQl9CisJfQorCisKK2ludCBBU04xX3RlbXBsYXRlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9URU1QTEFURSAqdHQpCisJeworCWNvbnN0IEFTTjFfSVRFTSAqaXQgPSBBU04xX0lURU1fcHRyKHR0LT5pdGVtKTsKKwlpbnQgcmV0OworCWlmICh0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfT1BUSU9OQUwpCisJCXsKKwkJYXNuMV90ZW1wbGF0ZV9jbGVhcihwdmFsLCB0dCk7CisJCXJldHVybiAxOworCQl9CisJLyogSWYgQU5ZIERFRklORUQgQlkgbm90aGluZyB0byBkbyAqLworCisJaWYgKHR0LT5mbGFncyAmIEFTTjFfVEZMR19BREJfTUFTSykKKwkJeworCQkqcHZhbCA9IE5VTEw7CisJCXJldHVybiAxOworCQl9CisjaWZkZWYgQ1JZUFRPX01ERUJVRworCWlmICh0dC0+ZmllbGRfbmFtZSkKKwkJQ1JZUFRPX3B1c2hfaW5mbyh0dC0+ZmllbGRfbmFtZSk7CisjZW5kaWYKKwkvKiBJZiBTRVQgT0Ygb3IgU0VRVUVOQ0UgT0YsIGl0cyBhIFNUQUNLICovCisJaWYgKHR0LT5mbGFncyAmIEFTTjFfVEZMR19TS19NQVNLKQorCQl7CisJCVNUQUNLX09GKEFTTjFfVkFMVUUpICpza3ZhbDsKKwkJc2t2YWwgPSBza19BU04xX1ZBTFVFX25ld19udWxsKCk7CisJCWlmICghc2t2YWwpCisJCQl7CisJCQlBU04xZXJyKEFTTjFfRl9BU04xX1RFTVBMQVRFX05FVywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJKnB2YWwgPSAoQVNOMV9WQUxVRSAqKXNrdmFsOworCQlyZXQgPSAxOworCQlnb3RvIGRvbmU7CisJCX0KKwkvKiBPdGhlcndpc2UgcGFzcyBpdCBiYWNrIHRvIHRoZSBpdGVtIHJvdXRpbmUgKi8KKwlyZXQgPSBhc24xX2l0ZW1fZXhfY29tYmluZV9uZXcocHZhbCwgaXQsIHR0LT5mbGFncyAmIEFTTjFfVEZMR19DT01CSU5FKTsKKwlkb25lOgorI2lmZGVmIENSWVBUT19NREVCVUcKKwlpZiAoaXQtPnNuYW1lKQorCQlDUllQVE9fcG9wX2luZm8oKTsKKyNlbmRpZgorCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgdm9pZCBhc24xX3RlbXBsYXRlX2NsZWFyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCkKKwl7CisJLyogSWYgQURCIG9yIFNUQUNLIGp1c3QgTlVMTCB0aGUgZmllbGQgKi8KKwlpZiAodHQtPmZsYWdzICYgKEFTTjFfVEZMR19BREJfTUFTS3xBU04xX1RGTEdfU0tfTUFTSykpIAorCQkqcHZhbCA9IE5VTEw7CisJZWxzZQorCQlhc24xX2l0ZW1fY2xlYXIocHZhbCwgQVNOMV9JVEVNX3B0cih0dC0+aXRlbSkpOworCX0KKworCisvKiBOQjogY291bGQgcHJvYmFibHkgY29tYmluZSBtb3N0IG9mIHRoZSByZWFsIFhYWF9uZXcoKSBiZWhhdmlvdXIgYW5kIGp1bmsKKyAqIGFsbCB0aGUgb2xkIGZ1bmN0aW9ucy4KKyAqLworCitpbnQgQVNOMV9wcmltaXRpdmVfbmV3KEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQorCXsKKwlBU04xX1RZUEUgKnR5cDsKKwlBU04xX1NUUklORyAqc3RyOworCWludCB1dHlwZTsKKworCWlmIChpdCAmJiBpdC0+ZnVuY3MpCisJCXsKKwkJY29uc3QgQVNOMV9QUklNSVRJVkVfRlVOQ1MgKnBmID0gaXQtPmZ1bmNzOworCQlpZiAocGYtPnByaW1fbmV3KQorCQkJcmV0dXJuIHBmLT5wcmltX25ldyhwdmFsLCBpdCk7CisJCX0KKworCWlmICghaXQgfHwgKGl0LT5pdHlwZSA9PSBBU04xX0lUWVBFX01TVFJJTkcpKQorCQl1dHlwZSA9IC0xOworCWVsc2UKKwkJdXR5cGUgPSBpdC0+dXR5cGU7CisJc3dpdGNoKHV0eXBlKQorCQl7CisJCWNhc2UgVl9BU04xX09CSkVDVDoKKwkJKnB2YWwgPSAoQVNOMV9WQUxVRSAqKU9CSl9uaWQyb2JqKE5JRF91bmRlZik7CisJCXJldHVybiAxOworCisJCWNhc2UgVl9BU04xX0JPT0xFQU46CisJCSooQVNOMV9CT09MRUFOICopcHZhbCA9IGl0LT5zaXplOworCQlyZXR1cm4gMTsKKworCQljYXNlIFZfQVNOMV9OVUxMOgorCQkqcHZhbCA9IChBU04xX1ZBTFVFICopMTsKKwkJcmV0dXJuIDE7CisKKwkJY2FzZSBWX0FTTjFfQU5ZOgorCQl0eXAgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQVNOMV9UWVBFKSk7CisJCWlmICghdHlwKQorCQkJcmV0dXJuIDA7CisJCXR5cC0+dmFsdWUucHRyID0gTlVMTDsKKwkJdHlwLT50eXBlID0gLTE7CisJCSpwdmFsID0gKEFTTjFfVkFMVUUgKil0eXA7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCXN0ciA9IEFTTjFfU1RSSU5HX3R5cGVfbmV3KHV0eXBlKTsKKwkJaWYgKGl0LT5pdHlwZSA9PSBBU04xX0lUWVBFX01TVFJJTkcgJiYgc3RyKQorCQkJc3RyLT5mbGFncyB8PSBBU04xX1NUUklOR19GTEFHX01TVFJJTkc7CisJCSpwdmFsID0gKEFTTjFfVkFMVUUgKilzdHI7CisJCWJyZWFrOworCQl9CisJaWYgKCpwdmFsKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyB2b2lkIGFzbjFfcHJpbWl0aXZlX2NsZWFyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQorCXsKKwlpbnQgdXR5cGU7CisJaWYgKGl0ICYmIGl0LT5mdW5jcykKKwkJeworCQljb25zdCBBU04xX1BSSU1JVElWRV9GVU5DUyAqcGYgPSBpdC0+ZnVuY3M7CisJCWlmIChwZi0+cHJpbV9jbGVhcikKKwkJCXBmLT5wcmltX2NsZWFyKHB2YWwsIGl0KTsKKwkJZWxzZSAKKwkJCSpwdmFsID0gTlVMTDsKKwkJcmV0dXJuOworCQl9CisJaWYgKCFpdCB8fCAoaXQtPml0eXBlID09IEFTTjFfSVRZUEVfTVNUUklORykpCisJCXV0eXBlID0gLTE7CisJZWxzZQorCQl1dHlwZSA9IGl0LT51dHlwZTsKKwlpZiAodXR5cGUgPT0gVl9BU04xX0JPT0xFQU4pCisJCSooQVNOMV9CT09MRUFOICopcHZhbCA9IGl0LT5zaXplOworCWVsc2UgKnB2YWwgPSBOVUxMOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fcHJuLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX3Bybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzY5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX3Bybi5jCkBAIC0wLDAgKzEsNjI3IEBACisvKiB0YXNuX3Bybi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgImFzbjFfbG9jbC5oIgorCisvKiBQcmludCByb3V0aW5lcy4KKyAqLworCisvKiBBU04xX1BDVFggcm91dGluZXMgKi8KKworQVNOMV9QQ1RYIGRlZmF1bHRfcGN0eCA9IAorCXsKKwlBU04xX1BDVFhfRkxBR1NfU0hPV19BQlNFTlQsCS8qIGZsYWdzICovCisJMCwJLyogbm1fZmxhZ3MgKi8KKwkwLAkvKiBjZXJ0X2ZsYWdzICovCisJMCwJLyogb2lkX2ZsYWdzICovCisJMAkvKiBzdHJfZmxhZ3MgKi8KKwl9OworCQorCitBU04xX1BDVFggKkFTTjFfUENUWF9uZXcodm9pZCkKKwl7CisJQVNOMV9QQ1RYICpyZXQ7CisJcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFTTjFfUENUWCkpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9BU04xX1BDVFhfTkVXLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJcmV0LT5mbGFncyA9IDA7CisJcmV0LT5ubV9mbGFncyA9IDA7CisJcmV0LT5jZXJ0X2ZsYWdzID0gMDsKKwlyZXQtPm9pZF9mbGFncyA9IDA7CisJcmV0LT5zdHJfZmxhZ3MgPSAwOworCXJldHVybiByZXQ7CisJfQorCit2b2lkIEFTTjFfUENUWF9mcmVlKEFTTjFfUENUWCAqcCkKKwl7CisJT1BFTlNTTF9mcmVlKHApOworCX0KKwordW5zaWduZWQgbG9uZyBBU04xX1BDVFhfZ2V0X2ZsYWdzKEFTTjFfUENUWCAqcCkKKwl7CisJcmV0dXJuIHAtPmZsYWdzOworCX0KKwordm9pZCBBU04xX1BDVFhfc2V0X2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJcC0+ZmxhZ3MgPSBmbGFnczsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9ubV9mbGFncyhBU04xX1BDVFggKnApCisJeworCXJldHVybiBwLT5ubV9mbGFnczsKKwl9CisKK3ZvaWQgQVNOMV9QQ1RYX3NldF9ubV9mbGFncyhBU04xX1BDVFggKnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCXAtPm5tX2ZsYWdzID0gZmxhZ3M7CisJfQorCit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfY2VydF9mbGFncyhBU04xX1BDVFggKnApCisJeworCXJldHVybiBwLT5jZXJ0X2ZsYWdzOworCX0KKwordm9pZCBBU04xX1BDVFhfc2V0X2NlcnRfZmxhZ3MoQVNOMV9QQ1RYICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlwLT5jZXJ0X2ZsYWdzID0gZmxhZ3M7CisJfQorCit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfb2lkX2ZsYWdzKEFTTjFfUENUWCAqcCkKKwl7CisJcmV0dXJuIHAtPm9pZF9mbGFnczsKKwl9CisKK3ZvaWQgQVNOMV9QQ1RYX3NldF9vaWRfZmxhZ3MoQVNOMV9QQ1RYICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlwLT5vaWRfZmxhZ3MgPSBmbGFnczsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9zdHJfZmxhZ3MoQVNOMV9QQ1RYICpwKQorCXsKKwlyZXR1cm4gcC0+c3RyX2ZsYWdzOworCX0KKwordm9pZCBBU04xX1BDVFhfc2V0X3N0cl9mbGFncyhBU04xX1BDVFggKnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCXAtPnN0cl9mbGFncyA9IGZsYWdzOworCX0KKworLyogTWFpbiBwcmludCByb3V0aW5lcyAqLworCitzdGF0aWMgaW50IGFzbjFfaXRlbV9wcmludF9jdHgoQklPICpvdXQsIEFTTjFfVkFMVUUgKipmbGQsIGludCBpbmRlbnQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQljb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqc25hbWUsCisJCQkJaW50IG5vaGRyLCBjb25zdCBBU04xX1BDVFggKnBjdHgpOworCitpbnQgYXNuMV90ZW1wbGF0ZV9wcmludF9jdHgoQklPICpvdXQsIEFTTjFfVkFMVUUgKipmbGQsIGludCBpbmRlbnQsCisJCQkJY29uc3QgQVNOMV9URU1QTEFURSAqdHQsIGNvbnN0IEFTTjFfUENUWCAqcGN0eCk7CisKK3N0YXRpYyBpbnQgYXNuMV9wcmltaXRpdmVfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipmbGQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgaW50IGluZGVudCwKKwkJCQljb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqc25hbWUsCisJCQkJY29uc3QgQVNOMV9QQ1RYICpwY3R4KTsKKworc3RhdGljIGludCBhc24xX3ByaW50X2ZzbmFtZShCSU8gKm91dCwgaW50IGluZGVudCwKKwkJCWNvbnN0IGNoYXIgKmZuYW1lLCBjb25zdCBjaGFyICpzbmFtZSwKKwkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCk7CisKK2ludCBBU04xX2l0ZW1fcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKmlmbGQsIGludCBpbmRlbnQsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwgY29uc3QgQVNOMV9QQ1RYICpwY3R4KQorCXsKKwljb25zdCBjaGFyICpzbmFtZTsKKwlpZiAocGN0eCA9PSBOVUxMKQorCQlwY3R4ID0gJmRlZmF1bHRfcGN0eDsKKwlpZiAocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfTk9fU1RSVUNUX05BTUUpCisJCXNuYW1lID0gTlVMTDsKKwllbHNlCisJCXNuYW1lID0gaXQtPnNuYW1lOworCXJldHVybiBhc24xX2l0ZW1fcHJpbnRfY3R4KG91dCwgJmlmbGQsIGluZGVudCwgaXQsCisJCQkJCQkJTlVMTCwgc25hbWUsIDAsIHBjdHgpOworCX0KKworc3RhdGljIGludCBhc24xX2l0ZW1fcHJpbnRfY3R4KEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqZmxkLCBpbnQgaW5kZW50LAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJY29uc3QgY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKnNuYW1lLAorCQkJCWludCBub2hkciwgY29uc3QgQVNOMV9QQ1RYICpwY3R4KQorCXsKKwljb25zdCBBU04xX1RFTVBMQVRFICp0dDsKKwljb25zdCBBU04xX0VYVEVSTl9GVU5DUyAqZWY7CisJQVNOMV9WQUxVRSAqKnRtcGZsZDsKKwljb25zdCBBU04xX0FVWCAqYXV4ID0gaXQtPmZ1bmNzOworCUFTTjFfYXV4X2NiICphc24xX2NiOworCUFTTjFfUFJJTlRfQVJHIHBhcmc7CisJaW50IGk7CisJaWYgKGF1eCAmJiBhdXgtPmFzbjFfY2IpCisJCXsKKwkJcGFyZy5vdXQgPSBvdXQ7CisJCXBhcmcuaW5kZW50ID0gaW5kZW50OworCQlwYXJnLnBjdHggPSBwY3R4OworCQlhc24xX2NiID0gYXV4LT5hc24xX2NiOworCQl9CisJZWxzZSBhc24xX2NiID0gMDsKKworCWlmKCpmbGQgPT0gTlVMTCkKKwkJeworCQlpZiAocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfU0hPV19BQlNFTlQpCisJCQl7CisJCQlpZiAoIW5vaGRyICYmICFhc24xX3ByaW50X2ZzbmFtZShvdXQsIGluZGVudCwKKwkJCQkJCQlmbmFtZSwgc25hbWUsIHBjdHgpKQorCQkJCXJldHVybiAwOworCQkJaWYgKEJJT19wdXRzKG91dCwgIjxBQlNFTlQ+XG4iKSA8PSAwKQorCQkJCXJldHVybiAwOworCQkJfQorCQlyZXR1cm4gMTsKKwkJfQorCisJc3dpdGNoKGl0LT5pdHlwZSkKKwkJeworCQljYXNlIEFTTjFfSVRZUEVfUFJJTUlUSVZFOgorCQlpZihpdC0+dGVtcGxhdGVzKQorCQkJeworCQkJaWYgKCFhc24xX3RlbXBsYXRlX3ByaW50X2N0eChvdXQsIGZsZCwgaW5kZW50LAorCQkJCQkJCWl0LT50ZW1wbGF0ZXMsIHBjdHgpKQorCQkJCXJldHVybiAwOworCQkJfQorCQkvKiBmYWxsIHRocnUgKi8KKwkJY2FzZSBBU04xX0lUWVBFX01TVFJJTkc6CisJCWlmICghYXNuMV9wcmltaXRpdmVfcHJpbnQob3V0LCBmbGQsIGl0LAorCQkJCWluZGVudCwgZm5hbWUsIHNuYW1lLHBjdHgpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9FWFRFUk46CisJCWlmICghbm9oZHIgJiYgIWFzbjFfcHJpbnRfZnNuYW1lKG91dCwgaW5kZW50LCBmbmFtZSwgc25hbWUsIHBjdHgpKQorCQkJcmV0dXJuIDA7CisJCS8qIFVzZSBuZXcgc3R5bGUgcHJpbnQgcm91dGluZSBpZiBwb3NzaWJsZSAqLworCQllZiA9IGl0LT5mdW5jczsKKwkJaWYgKGVmICYmIGVmLT5hc24xX2V4X3ByaW50KQorCQkJeworCQkJaSA9IGVmLT5hc24xX2V4X3ByaW50KG91dCwgZmxkLCBpbmRlbnQsICIiLCBwY3R4KTsKKwkJCWlmICghaSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICgoaSA9PSAyKSAmJiAoQklPX3B1dHMob3V0LCAiXG4iKSA8PSAwKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiAxOworCQkJfQorCQllbHNlIGlmIChzbmFtZSAmJiAKKwkJCUJJT19wcmludGYob3V0LCAiOkVYVEVSTkFMIFRZUEUgJXNcbiIsIHNuYW1lKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9JVFlQRV9DSE9JQ0U6CisjaWYgMAorCQlpZiAoIW5vaGRyICYmICFhc24xX3ByaW50X2ZzbmFtZShvdXQsIGluZGVudCwgZm5hbWUsIHNuYW1lLCBwY3R4KSkKKwkJCXJldHVybiAwOworI2VuZGlmCisJCS8qIENIT0lDRSB0eXBlLCBnZXQgc2VsZWN0b3IgKi8KKwkJaSA9IGFzbjFfZ2V0X2Nob2ljZV9zZWxlY3RvcihmbGQsIGl0KTsKKwkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uICovCisJCWlmKChpIDwgMCkgfHwgKGkgPj0gaXQtPnRjb3VudCkpCisJCQl7CisJCQlpZiAoQklPX3ByaW50ZihvdXQsCisJCQkJIkVSUk9SOiBzZWxlY3RvciBbJWRdIGludmFsaWRcbiIsIGkpIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJdHQgPSBpdC0+dGVtcGxhdGVzICsgaTsKKwkJdG1wZmxkID0gYXNuMV9nZXRfZmllbGRfcHRyKGZsZCwgdHQpOworCQlpZiAoIWFzbjFfdGVtcGxhdGVfcHJpbnRfY3R4KG91dCwgdG1wZmxkLCBpbmRlbnQsIHR0LCBwY3R4KSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKworCQljYXNlIEFTTjFfSVRZUEVfU0VRVUVOQ0U6CisJCWNhc2UgQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFOgorCQlpZiAoIW5vaGRyICYmICFhc24xX3ByaW50X2ZzbmFtZShvdXQsIGluZGVudCwgZm5hbWUsIHNuYW1lLCBwY3R4KSkKKwkJCXJldHVybiAwOworCQlpZiAoZm5hbWUgfHwgc25hbWUpCisJCQl7CisJCQlpZiAocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfU0hPV19TRVFVRU5DRSkKKwkJCQl7CisJCQkJaWYgKEJJT19wdXRzKG91dCwgIiB7XG4iKSA8PSAwKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWlmIChCSU9fcHV0cyhvdXQsICJcbiIpIDw9IDApCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKworCQlpZiAoYXNuMV9jYikKKwkJCXsKKwkJCWkgPSBhc24xX2NiKEFTTjFfT1BfUFJJTlRfUFJFLCBmbGQsIGl0LCAmcGFyZyk7CisJCQlpZiAoaSA9PSAwKQorCQkJCXJldHVybiAwOworCQkJaWYgKGkgPT0gMikKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkvKiBQcmludCBlYWNoIGZpZWxkIGVudHJ5ICovCisJCWZvcihpID0gMCwgdHQgPSBpdC0+dGVtcGxhdGVzOyBpIDwgaXQtPnRjb3VudDsgaSsrLCB0dCsrKQorCQkJeworCQkJY29uc3QgQVNOMV9URU1QTEFURSAqc2VxdHQ7CisJCQlzZXF0dCA9IGFzbjFfZG9fYWRiKGZsZCwgdHQsIDEpOworCQkJdG1wZmxkID0gYXNuMV9nZXRfZmllbGRfcHRyKGZsZCwgc2VxdHQpOworCQkJaWYgKCFhc24xX3RlbXBsYXRlX3ByaW50X2N0eChvdXQsIHRtcGZsZCwKKwkJCQkJCWluZGVudCArIDIsIHNlcXR0LCBwY3R4KSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJaWYgKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfU0VRVUVOQ0UpCisJCQl7CisJCQlpZiAoQklPX3ByaW50ZihvdXQsICIlKnN9XG4iLCBpbmRlbnQsICIiKSA8IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJaWYgKGFzbjFfY2IpCisJCQl7CisJCQlpID0gYXNuMV9jYihBU04xX09QX1BSSU5UX1BPU1QsIGZsZCwgaXQsICZwYXJnKTsKKwkJCWlmIChpID09IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCUJJT19wcmludGYob3V0LCAiVW5wcm9jZXNzZWQgdHlwZSAlZFxuIiwgaXQtPml0eXBlKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworaW50IGFzbjFfdGVtcGxhdGVfcHJpbnRfY3R4KEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqZmxkLCBpbnQgaW5kZW50LAorCQkJCWNvbnN0IEFTTjFfVEVNUExBVEUgKnR0LCBjb25zdCBBU04xX1BDVFggKnBjdHgpCisJeworCWludCBpLCBmbGFnczsKKwljb25zdCBjaGFyICpzbmFtZSwgKmZuYW1lOworCWZsYWdzID0gdHQtPmZsYWdzOworCWlmKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfRklFTERfU1RSVUNUX05BTUUpCisJCXNuYW1lID0gQVNOMV9JVEVNX3B0cih0dC0+aXRlbSktPnNuYW1lOworCWVsc2UKKwkJc25hbWUgPSBOVUxMOworCWlmKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX05PX0ZJRUxEX05BTUUpCisJCWZuYW1lID0gTlVMTDsKKwllbHNlCisJCWZuYW1lID0gdHQtPmZpZWxkX25hbWU7CisJaWYoZmxhZ3MgJiBBU04xX1RGTEdfU0tfTUFTSykKKwkJeworCQljaGFyICp0bmFtZTsKKwkJQVNOMV9WQUxVRSAqc2tpdGVtOworCQlTVEFDS19PRihBU04xX1ZBTFVFKSAqc3RhY2s7CisKKwkJLyogU0VUIE9GLCBTRVFVRU5DRSBPRiAqLworCQlpZiAoZm5hbWUpCisJCQl7CisJCQlpZihwY3R4LT5mbGFncyAmIEFTTjFfUENUWF9GTEFHU19TSE9XX1NTT0YpCisJCQkJeworCQkJCWlmKGZsYWdzICYgQVNOMV9URkxHX1NFVF9PRikKKwkJCQkJdG5hbWUgPSAiU0VUIjsKKwkJCQllbHNlCisJCQkJCXRuYW1lID0gIlNFUVVFTkNFIjsKKwkJCQlpZiAoQklPX3ByaW50ZihvdXQsICIlKnMlcyBPRiAlcyB7XG4iLAorCQkJCQlpbmRlbnQsICIiLCB0bmFtZSwgdHQtPmZpZWxkX25hbWUpIDw9IDApCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWVsc2UgaWYgKEJJT19wcmludGYob3V0LCAiJSpzJXM6XG4iLCBpbmRlbnQsICIiLAorCQkJCQlmbmFtZSkgPD0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJc3RhY2sgPSAoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKikqZmxkOworCQlmb3IoaSA9IDA7IGkgPCBza19BU04xX1ZBTFVFX251bShzdGFjayk7IGkrKykKKwkJCXsKKwkJCWlmICgoaSA+IDApICYmIChCSU9fcHV0cyhvdXQsICJcbiIpIDw9IDApKQorCQkJCXJldHVybiAwOworCisJCQlza2l0ZW0gPSBza19BU04xX1ZBTFVFX3ZhbHVlKHN0YWNrLCBpKTsKKwkJCWlmICghYXNuMV9pdGVtX3ByaW50X2N0eChvdXQsICZza2l0ZW0sIGluZGVudCArIDIsCisJCQkJQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksIE5VTEwsIE5VTEwsIDEsIHBjdHgpKQorCQkJCXJldHVybiAwOworCQkJfQorCQlpZiAoIWkgJiYgQklPX3ByaW50ZihvdXQsICIlKnM8RU1QVFk+XG4iLCBpbmRlbnQgKyAyLCAiIikgPD0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJaWYocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfU0hPV19TRVFVRU5DRSkKKwkJCXsKKwkJCWlmIChCSU9fcHJpbnRmKG91dCwgIiUqc31cbiIsIGluZGVudCwgIiIpIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCXJldHVybiAxOworCQl9CisJcmV0dXJuIGFzbjFfaXRlbV9wcmludF9jdHgob3V0LCBmbGQsIGluZGVudCwgQVNOMV9JVEVNX3B0cih0dC0+aXRlbSksCisJCQkJCQkJZm5hbWUsIHNuYW1lLCAwLCBwY3R4KTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9wcmludF9mc25hbWUoQklPICpvdXQsIGludCBpbmRlbnQsCisJCQljb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqc25hbWUsCisJCQljb25zdCBBU04xX1BDVFggKnBjdHgpCisJeworCXN0YXRpYyBjaGFyIHNwYWNlc1tdID0gIiAgICAgICAgICAgICAgICAgICAgIjsKKwljb25zdCBpbnQgbnNwYWNlcyA9IHNpemVvZihzcGFjZXMpIC0gMTsKKworI2lmIDAKKwlpZiAoIXNuYW1lICYmICFmbmFtZSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworCXdoaWxlIChpbmRlbnQgPiBuc3BhY2VzKQorCQl7CisJCWlmIChCSU9fd3JpdGUob3V0LCBzcGFjZXMsIG5zcGFjZXMpICE9IG5zcGFjZXMpCisJCQlyZXR1cm4gMDsKKwkJaW5kZW50IC09IG5zcGFjZXM7CisJCX0KKwlpZiAoQklPX3dyaXRlKG91dCwgc3BhY2VzLCBpbmRlbnQpICE9IGluZGVudCkKKwkJcmV0dXJuIDA7CisJaWYgKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX05PX1NUUlVDVF9OQU1FKQorCQlzbmFtZSA9IE5VTEw7CisJaWYgKHBjdHgtPmZsYWdzICYgQVNOMV9QQ1RYX0ZMQUdTX05PX0ZJRUxEX05BTUUpCisJCWZuYW1lID0gTlVMTDsKKwlpZiAoIXNuYW1lICYmICFmbmFtZSkKKwkJcmV0dXJuIDE7CisJaWYgKGZuYW1lKQorCQl7CisJCWlmIChCSU9fcHV0cyhvdXQsIGZuYW1lKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoc25hbWUpCisJCXsKKwkJaWYgKGZuYW1lKQorCQkJeworCQkJaWYgKEJJT19wcmludGYob3V0LCAiICglcykiLCBzbmFtZSkgPD0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKEJJT19wdXRzKG91dCwgc25hbWUpIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlpZiAoQklPX3dyaXRlKG91dCwgIjogIiwgMikgIT0gMikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGFzbjFfcHJpbnRfYm9vbGVhbl9jdHgoQklPICpvdXQsIGNvbnN0IGludCBib29sLAorCQkJCQkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCkKKwl7CisJY29uc3QgY2hhciAqc3RyOworCXN3aXRjaCAoYm9vbCkKKwkJeworCQljYXNlIC0xOgorCQlzdHIgPSAiQk9PTCBBQlNFTlQiOworCQlicmVhazsKKworCQljYXNlIDA6CisJCXN0ciA9ICJGQUxTRSI7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCXN0ciA9ICJUUlVFIjsKKwkJYnJlYWs7CisKKwkJfQorCisJaWYgKEJJT19wdXRzKG91dCwgc3RyKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIGludCBhc24xX3ByaW50X2ludGVnZXJfY3R4KEJJTyAqb3V0LCBBU04xX0lOVEVHRVIgKnN0ciwKKwkJCQkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCkKKwl7CisJY2hhciAqczsKKwlpbnQgcmV0ID0gMTsKKwlzID0gaTJzX0FTTjFfSU5URUdFUihOVUxMLCBzdHIpOworCWlmIChCSU9fcHV0cyhvdXQsIHMpIDw9IDApCisJCXJldCA9IDA7CisJT1BFTlNTTF9mcmVlKHMpOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGFzbjFfcHJpbnRfb2lkX2N0eChCSU8gKm91dCwgY29uc3QgQVNOMV9PQkpFQ1QgKm9pZCwKKwkJCQkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCkKKwl7CisJY2hhciBvYmpidWZbODBdOworCWNvbnN0IGNoYXIgKmxuOworCWxuID0gT0JKX25pZDJsbihPQkpfb2JqMm5pZChvaWQpKTsKKwlpZighbG4pCisJCWxuID0gIiI7CisJT0JKX29iajJ0eHQob2JqYnVmLCBzaXplb2Ygb2JqYnVmLCBvaWQsIDEpOworCWlmIChCSU9fcHJpbnRmKG91dCwgIiVzICglcykiLCBsbiwgb2JqYnVmKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgYXNuMV9wcmludF9vYnN0cmluZ19jdHgoQklPICpvdXQsIEFTTjFfU1RSSU5HICpzdHIsIGludCBpbmRlbnQsCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpCisJeworCWlmIChzdHItPnR5cGUgPT0gVl9BU04xX0JJVF9TVFJJTkcpCisJCXsKKwkJaWYgKEJJT19wcmludGYob3V0LCAiICglbGQgdW51c2VkIGJpdHMpXG4iLAorCQkJCQlzdHItPmZsYWdzICYgMHg3KSA8PSAwKQorCQkJCXJldHVybiAwOworCQl9CisJZWxzZSBpZiAoQklPX3B1dHMob3V0LCAiXG4iKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoKHN0ci0+bGVuZ3RoID4gMCkKKwkJJiYgQklPX2R1bXBfaW5kZW50KG91dCwgKGNoYXIgKilzdHItPmRhdGEsIHN0ci0+bGVuZ3RoLAorCQkJCWluZGVudCArIDIpIDw9IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBhc24xX3ByaW1pdGl2ZV9wcmludChCSU8gKm91dCwgQVNOMV9WQUxVRSAqKmZsZCwKKwkJCQljb25zdCBBU04xX0lURU0gKml0LCBpbnQgaW5kZW50LAorCQkJCWNvbnN0IGNoYXIgKmZuYW1lLCBjb25zdCBjaGFyICpzbmFtZSwKKwkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpCisJeworCWxvbmcgdXR5cGU7CisJQVNOMV9TVFJJTkcgKnN0cjsKKwlpbnQgcmV0ID0gMSwgbmVlZGxmID0gMTsKKwljb25zdCBjaGFyICpwbmFtZTsKKwljb25zdCBBU04xX1BSSU1JVElWRV9GVU5DUyAqcGY7CisJcGYgPSBpdC0+ZnVuY3M7CisJaWYgKCFhc24xX3ByaW50X2ZzbmFtZShvdXQsIGluZGVudCwgZm5hbWUsIHNuYW1lLCBwY3R4KSkKKwkJCXJldHVybiAwOworCWlmIChwZiAmJiBwZi0+cHJpbV9wcmludCkKKwkJcmV0dXJuIHBmLT5wcmltX3ByaW50KG91dCwgZmxkLCBpdCwgaW5kZW50LCBwY3R4KTsKKwlzdHIgPSAoQVNOMV9TVFJJTkcgKikqZmxkOworCWlmIChpdC0+aXR5cGUgPT0gQVNOMV9JVFlQRV9NU1RSSU5HKQorCQl1dHlwZSA9IHN0ci0+dHlwZSAmIH5WX0FTTjFfTkVHOworCWVsc2UKKwkJdXR5cGUgPSBpdC0+dXR5cGU7CisJaWYgKHV0eXBlID09IFZfQVNOMV9BTlkpCisJCXsKKwkJQVNOMV9UWVBFICphdHlwZSA9IChBU04xX1RZUEUgKikqZmxkOworCQl1dHlwZSA9IGF0eXBlLT50eXBlOworCQlmbGQgPSAmYXR5cGUtPnZhbHVlLmFzbjFfdmFsdWU7CisJCXN0ciA9IChBU04xX1NUUklORyAqKSpmbGQ7CisJCWlmIChwY3R4LT5mbGFncyAmIEFTTjFfUENUWF9GTEFHU19OT19BTllfVFlQRSkKKwkJCXBuYW1lID0gTlVMTDsKKwkJZWxzZSAKKwkJCXBuYW1lID0gQVNOMV90YWcyc3RyKHV0eXBlKTsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAocGN0eC0+ZmxhZ3MgJiBBU04xX1BDVFhfRkxBR1NfU0hPV19UWVBFKQorCQkJcG5hbWUgPSBBU04xX3RhZzJzdHIodXR5cGUpOworCQllbHNlIAorCQkJcG5hbWUgPSBOVUxMOworCQl9CisKKwlpZiAodXR5cGUgPT0gVl9BU04xX05VTEwpCisJCXsKKwkJaWYgKEJJT19wdXRzKG91dCwgIk5VTExcbiIpIDw9IDApCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIDE7CisJCX0KKworCWlmIChwbmFtZSkKKwkJeworCQlpZiAoQklPX3B1dHMob3V0LCBwbmFtZSkgPD0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoQklPX3B1dHMob3V0LCAiOiIpIDw9IDApCisJCQlyZXR1cm4gMDsKKwkJfQorCisJc3dpdGNoICh1dHlwZSkKKwkJeworCQljYXNlIFZfQVNOMV9CT09MRUFOOgorCQkJeworCQkJaW50IGJvb2wgPSAqKGludCAqKWZsZDsKKwkJCWlmIChib29sID09IC0xKQorCQkJCWJvb2wgPSBpdC0+c2l6ZTsKKwkJCXJldCA9IGFzbjFfcHJpbnRfYm9vbGVhbl9jdHgob3V0LCBib29sLCBwY3R4KTsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBWX0FTTjFfSU5URUdFUjoKKwkJY2FzZSBWX0FTTjFfRU5VTUVSQVRFRDoKKwkJcmV0ID0gYXNuMV9wcmludF9pbnRlZ2VyX2N0eChvdXQsIHN0ciwgcGN0eCk7CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX1VUQ1RJTUU6CisJCXJldCA9IEFTTjFfVVRDVElNRV9wcmludChvdXQsIHN0cik7CisJCWJyZWFrOworCisJCWNhc2UgVl9BU04xX0dFTkVSQUxJWkVEVElNRToKKwkJcmV0ID0gQVNOMV9HRU5FUkFMSVpFRFRJTUVfcHJpbnQob3V0LCBzdHIpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9PQkpFQ1Q6CisJCXJldCA9IGFzbjFfcHJpbnRfb2lkX2N0eChvdXQsIChjb25zdCBBU04xX09CSkVDVCAqKSpmbGQsIHBjdHgpOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9PQ1RFVF9TVFJJTkc6CisJCWNhc2UgVl9BU04xX0JJVF9TVFJJTkc6CisJCXJldCA9IGFzbjFfcHJpbnRfb2JzdHJpbmdfY3R4KG91dCwgc3RyLCBpbmRlbnQsIHBjdHgpOworCQluZWVkbGYgPSAwOworCQlicmVhazsKKworCQljYXNlIFZfQVNOMV9TRVFVRU5DRToKKwkJY2FzZSBWX0FTTjFfU0VUOgorCQljYXNlIFZfQVNOMV9PVEhFUjoKKwkJaWYgKEJJT19wdXRzKG91dCwgIlxuIikgPD0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoQVNOMV9wYXJzZV9kdW1wKG91dCwgc3RyLT5kYXRhLCBzdHItPmxlbmd0aCwKKwkJCQkJCWluZGVudCwgMCkgPD0gMCkKKwkJCXJldCA9IDA7CisJCW5lZWRsZiA9IDA7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCXJldCA9IEFTTjFfU1RSSU5HX3ByaW50X2V4KG91dCwgc3RyLCBwY3R4LT5zdHJfZmxhZ3MpOworCisJCX0KKwlpZiAoIXJldCkKKwkJcmV0dXJuIDA7CisJaWYgKG5lZWRsZiAmJiBCSU9fcHV0cyhvdXQsICJcbiIpIDw9IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fdHlwLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX3R5cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjFjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX3R5cC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiB0YXNuX3R5cC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorCisvKiBEZWNsYXJhdGlvbnMgZm9yIHN0cmluZyB0eXBlcyAqLworCisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9JTlRFR0VSKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfSU5URUdFUikKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX0VOVU1FUkFURUQpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNOMV9FTlVNRVJBVEVEKQorCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfQklUX1NUUklORykKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX0JJVF9TVFJJTkcpCisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9PQ1RFVF9TVFJJTkcpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNOMV9PQ1RFVF9TVFJJTkcpCisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9OVUxMKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfTlVMTCkKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX09CSkVDVCkKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX1VURjhTVFJJTkcpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNOMV9VVEY4U1RSSU5HKQorCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfUFJJTlRBQkxFU1RSSU5HKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfUFJJTlRBQkxFU1RSSU5HKQorCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfVDYxU1RSSU5HKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfVDYxU1RSSU5HKQorCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfSUE1U1RSSU5HKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfSUE1U1RSSU5HKQorCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfR0VORVJBTFNUUklORykKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX0dFTkVSQUxTVFJJTkcpCisKK0lNUExFTUVOVF9BU04xX1RZUEUoQVNOMV9VVENUSU1FKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfVVRDVElNRSkKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX0dFTkVSQUxJWkVEVElNRSkKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBU04xX0dFTkVSQUxJWkVEVElNRSkKKworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX1ZJU0lCTEVTVFJJTkcpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNOMV9WSVNJQkxFU1RSSU5HKQorCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfVU5JVkVSU0FMU1RSSU5HKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfVU5JVkVSU0FMU1RSSU5HKQorCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfQk1QU1RSSU5HKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTTjFfQk1QU1RSSU5HKQorCitJTVBMRU1FTlRfQVNOMV9UWVBFKEFTTjFfQU5ZKQorCisvKiBKdXN0IHN3YWxsb3cgYW4gQVNOMV9TRVFVRU5DRSBpbiBhbiBBU04xX1NUUklORyAqLworSU1QTEVNRU5UX0FTTjFfVFlQRShBU04xX1NFUVVFTkNFKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfZm5hbWUoQVNOMV9UWVBFLCBBU04xX0FOWSwgQVNOMV9UWVBFKQorCisvKiBNdWx0aXN0cmluZyB0eXBlcyAqLworCitJTVBMRU1FTlRfQVNOMV9NU1RSSU5HKEFTTjFfUFJJTlRBQkxFLCBCX0FTTjFfUFJJTlRBQkxFKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX25hbWUoQVNOMV9TVFJJTkcsIEFTTjFfUFJJTlRBQkxFKQorCitJTVBMRU1FTlRfQVNOMV9NU1RSSU5HKERJU1BMQVlURVhULCBCX0FTTjFfRElTUExBWVRFWFQpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfbmFtZShBU04xX1NUUklORywgRElTUExBWVRFWFQpCisKK0lNUExFTUVOVF9BU04xX01TVFJJTkcoRElSRUNUT1JZU1RSSU5HLCBCX0FTTjFfRElSRUNUT1JZU1RSSU5HKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX25hbWUoQVNOMV9TVFJJTkcsIERJUkVDVE9SWVNUUklORykKKworLyogVGhyZWUgc2VwYXJhdGUgQk9PTEVBTiB0eXBlOiBub3JtYWwsIERFRkFVTFQgVFJVRSBhbmQgREVGQVVMVCBGQUxTRSAqLworSU1QTEVNRU5UX0FTTjFfVFlQRV9leChBU04xX0JPT0xFQU4sIEFTTjFfQk9PTEVBTiwgLTEpCitJTVBMRU1FTlRfQVNOMV9UWVBFX2V4KEFTTjFfVEJPT0xFQU4sIEFTTjFfQk9PTEVBTiwgMSkKK0lNUExFTUVOVF9BU04xX1RZUEVfZXgoQVNOMV9GQk9PTEVBTiwgQVNOMV9CT09MRUFOLCAwKQorCisvKiBTcGVjaWFsLCBPQ1RFVCBTVFJJTkcgd2l0aCBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBzdXBwb3J0ICovCisKK0lNUExFTUVOVF9BU04xX1RZUEVfZXgoQVNOMV9PQ1RFVF9TVFJJTkdfTkRFRiwgQVNOMV9PQ1RFVF9TVFJJTkcsIEFTTjFfVEZMR19OREVGKQorCitBU04xX0lURU1fVEVNUExBVEUoQVNOMV9TRVFVRU5DRV9BTlkpID0gCisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRiwgMCwgQVNOMV9TRVFVRU5DRV9BTlksIEFTTjFfQU5ZKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChBU04xX1NFUVVFTkNFX0FOWSkKKworQVNOMV9JVEVNX1RFTVBMQVRFKEFTTjFfU0VUX0FOWSkgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFVF9PRiwgMCwgQVNOMV9TRVRfQU5ZLCBBU04xX0FOWSkKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoQVNOMV9TRVRfQU5ZKQorCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKEFTTjFfU0VRVUVOQ0VfQU5ZLCBBU04xX1NFUVVFTkNFX0FOWSwgQVNOMV9TRVFVRU5DRV9BTlkpCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKEFTTjFfU0VRVUVOQ0VfQU5ZLCBBU04xX1NFVF9BTlksIEFTTjFfU0VUX0FOWSkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3Rhc25fdXRsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX3V0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWVjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS90YXNuX3V0bC5jCkBAIC0wLDAgKzEsMjc5IEBACisvKiB0YXNuX3V0bC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisvKiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIGZpZWxkcyBhbmQgb2Zmc2V0cyAqLworCisvKiBBZGQgJ29mZnNldCcgdG8gJ2FkZHInICovCisjZGVmaW5lIG9mZnNldDJwdHIoYWRkciwgb2Zmc2V0KSAodm9pZCAqKSgoKGNoYXIgKikgYWRkcikgKyBvZmZzZXQpCisKKy8qIEdpdmVuIGFuIEFTTjFfSVRFTSBDSE9JQ0UgdHlwZSByZXR1cm4KKyAqIHRoZSBzZWxlY3RvciB2YWx1ZQorICovCisKK2ludCBhc24xX2dldF9jaG9pY2Vfc2VsZWN0b3IoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCWludCAqc2VsID0gb2Zmc2V0MnB0cigqcHZhbCwgaXQtPnV0eXBlKTsKKwlyZXR1cm4gKnNlbDsKKwl9CisKKy8qIEdpdmVuIGFuIEFTTjFfSVRFTSBDSE9JQ0UgdHlwZSBzZXQKKyAqIHRoZSBzZWxlY3RvciB2YWx1ZSwgcmV0dXJuIG9sZCB2YWx1ZS4KKyAqLworCitpbnQgYXNuMV9zZXRfY2hvaWNlX3NlbGVjdG9yKEFTTjFfVkFMVUUgKipwdmFsLCBpbnQgdmFsdWUsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJewkKKwlpbnQgKnNlbCwgcmV0OworCXNlbCA9IG9mZnNldDJwdHIoKnB2YWwsIGl0LT51dHlwZSk7CisJcmV0ID0gKnNlbDsKKwkqc2VsID0gdmFsdWU7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIERvIHJlZmVyZW5jZSBjb3VudGluZy4gVGhlIHZhbHVlICdvcCcgZGVjaWRlcyB3aGF0IHRvIGRvLiAKKyAqIGlmIGl0IGlzICsxIHRoZW4gdGhlIGNvdW50IGlzIGluY3JlbWVudGVkLiBJZiBvcCBpcyAwIGNvdW50IGlzCisgKiBzZXQgdG8gMS4gSWYgb3AgaXMgLTEgY291bnQgaXMgZGVjcmVtZW50ZWQgYW5kIHRoZSByZXR1cm4gdmFsdWUKKyAqIGlzIHRoZSBjdXJyZW50IHJlZnJlbmNlIGNvdW50IG9yIDAgaWYgbm8gcmVmZXJlbmNlIGNvdW50IGV4aXN0cy4KKyAqLworCitpbnQgYXNuMV9kb19sb2NrKEFTTjFfVkFMVUUgKipwdmFsLCBpbnQgb3AsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCWNvbnN0IEFTTjFfQVVYICphdXg7CisJaW50ICpsY2ssIHJldDsKKwlpZiAoKGl0LT5pdHlwZSAhPSBBU04xX0lUWVBFX1NFUVVFTkNFKQorCSAgICYmIChpdC0+aXR5cGUgIT0gQVNOMV9JVFlQRV9OREVGX1NFUVVFTkNFKSkKKwkJcmV0dXJuIDA7CisJYXV4ID0gaXQtPmZ1bmNzOworCWlmICghYXV4IHx8ICEoYXV4LT5mbGFncyAmIEFTTjFfQUZMR19SRUZDT1VOVCkpCisJCXJldHVybiAwOworCWxjayA9IG9mZnNldDJwdHIoKnB2YWwsIGF1eC0+cmVmX29mZnNldCk7CisJaWYgKG9wID09IDApCisJCXsKKwkJKmxjayA9IDE7CisJCXJldHVybiAxOworCQl9CisJcmV0ID0gQ1JZUFRPX2FkZChsY2ssIG9wLCBhdXgtPnJlZl9sb2NrKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBSZWZlcmVuY2UgQ291bnQ6ICVkXG4iLCBpdC0+c25hbWUsICpsY2spOworI2VuZGlmCisjaWZkZWYgUkVGX0NIRUNLCisJaWYgKHJldCA8IDApIAorCQlmcHJpbnRmKHN0ZGVyciwgIiVzLCBiYWQgcmVmZXJlbmNlIGNvdW50XG4iLCBpdC0+c25hbWUpOworI2VuZGlmCisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBBU04xX0VOQ09ESU5HICphc24xX2dldF9lbmNfcHRyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQorCXsKKwljb25zdCBBU04xX0FVWCAqYXV4OworCWlmICghcHZhbCB8fCAhKnB2YWwpCisJCXJldHVybiBOVUxMOworCWF1eCA9IGl0LT5mdW5jczsKKwlpZiAoIWF1eCB8fCAhKGF1eC0+ZmxhZ3MgJiBBU04xX0FGTEdfRU5DT0RJTkcpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gb2Zmc2V0MnB0cigqcHZhbCwgYXV4LT5lbmNfb2Zmc2V0KTsKKwl9CisKK3ZvaWQgYXNuMV9lbmNfaW5pdChBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKKwl7CisJQVNOMV9FTkNPRElORyAqZW5jOworCWVuYyA9IGFzbjFfZ2V0X2VuY19wdHIocHZhbCwgaXQpOworCWlmIChlbmMpCisJCXsKKwkJZW5jLT5lbmMgPSBOVUxMOworCQllbmMtPmxlbiA9IDA7CisJCWVuYy0+bW9kaWZpZWQgPSAxOworCQl9CisJfQorCit2b2lkIGFzbjFfZW5jX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCUFTTjFfRU5DT0RJTkcgKmVuYzsKKwllbmMgPSBhc24xX2dldF9lbmNfcHRyKHB2YWwsIGl0KTsKKwlpZiAoZW5jKQorCQl7CisJCWlmIChlbmMtPmVuYykKKwkJCU9QRU5TU0xfZnJlZShlbmMtPmVuYyk7CisJCWVuYy0+ZW5jID0gTlVMTDsKKwkJZW5jLT5sZW4gPSAwOworCQllbmMtPm1vZGlmaWVkID0gMTsKKwkJfQorCX0KKworaW50IGFzbjFfZW5jX3NhdmUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaW5sZW4sCisJCQkJCQkJIGNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCUFTTjFfRU5DT0RJTkcgKmVuYzsKKwllbmMgPSBhc24xX2dldF9lbmNfcHRyKHB2YWwsIGl0KTsKKwlpZiAoIWVuYykKKwkJcmV0dXJuIDE7CisKKwlpZiAoZW5jLT5lbmMpCisJCU9QRU5TU0xfZnJlZShlbmMtPmVuYyk7CisJZW5jLT5lbmMgPSBPUEVOU1NMX21hbGxvYyhpbmxlbik7CisJaWYgKCFlbmMtPmVuYykKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGVuYy0+ZW5jLCBpbiwgaW5sZW4pOworCWVuYy0+bGVuID0gaW5sZW47CisJZW5jLT5tb2RpZmllZCA9IDA7CisKKwlyZXR1cm4gMTsKKwl9CisJCQoraW50IGFzbjFfZW5jX3Jlc3RvcmUoaW50ICpsZW4sIHVuc2lnbmVkIGNoYXIgKipvdXQsIEFTTjFfVkFMVUUgKipwdmFsLAorCQkJCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQpCisJeworCUFTTjFfRU5DT0RJTkcgKmVuYzsKKwllbmMgPSBhc24xX2dldF9lbmNfcHRyKHB2YWwsIGl0KTsKKwlpZiAoIWVuYyB8fCBlbmMtPm1vZGlmaWVkKQorCQlyZXR1cm4gMDsKKwlpZiAob3V0KQorCQl7CisJCW1lbWNweSgqb3V0LCBlbmMtPmVuYywgZW5jLT5sZW4pOworCQkqb3V0ICs9IGVuYy0+bGVuOworCQl9CisJaWYgKGxlbikKKwkJKmxlbiA9IGVuYy0+bGVuOworCXJldHVybiAxOworCX0KKworLyogR2l2ZW4gYW4gQVNOMV9URU1QTEFURSBnZXQgYSBwb2ludGVyIHRvIGEgZmllbGQgKi8KK0FTTjFfVkFMVUUgKiogYXNuMV9nZXRfZmllbGRfcHRyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCkKKwl7CisJQVNOMV9WQUxVRSAqKnB2YWx0bXA7CisJaWYgKHR0LT5mbGFncyAmIEFTTjFfVEZMR19DT01CSU5FKQorCQlyZXR1cm4gcHZhbDsKKwlwdmFsdG1wID0gb2Zmc2V0MnB0cigqcHZhbCwgdHQtPm9mZnNldCk7CisJLyogTk9URSBmb3IgQk9PTEVBTiB0eXBlcyB0aGUgZmllbGQgaXMganVzdCBhIHBsYWluCisgCSAqIGludCBzbyB3ZSBjYW4ndCByZXR1cm4gaW50ICoqLCBzbyBzZXR0bGUgZm9yCisJICogKGludCAqKS4KKwkgKi8KKwlyZXR1cm4gcHZhbHRtcDsKKwl9CisKKy8qIEhhbmRsZSBBTlkgREVGSU5FRCBCWSB0ZW1wbGF0ZSwgZmluZCB0aGUgc2VsZWN0b3IsIGxvb2sgdXAKKyAqIHRoZSByZWxldmFudCBBU04xX1RFTVBMQVRFIGluIHRoZSB0YWJsZSBhbmQgcmV0dXJuIGl0LgorICovCisKK2NvbnN0IEFTTjFfVEVNUExBVEUgKmFzbjFfZG9fYWRiKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCwKKwkJCQkJCQkJaW50IG51bGxlcnIpCisJeworCWNvbnN0IEFTTjFfQURCICphZGI7CisJY29uc3QgQVNOMV9BREJfVEFCTEUgKmF0Ymw7CisJbG9uZyBzZWxlY3RvcjsKKwlBU04xX1ZBTFVFICoqc2ZsZDsKKwlpbnQgaTsKKwlpZiAoISh0dC0+ZmxhZ3MgJiBBU04xX1RGTEdfQURCX01BU0spKQorCQlyZXR1cm4gdHQ7CisKKwkvKiBFbHNlIEFOWSBERUZJTkVEIEJZIC4uLiBnZXQgdGhlIHRhYmxlICovCisJYWRiID0gQVNOMV9BREJfcHRyKHR0LT5pdGVtKTsKKworCS8qIEdldCB0aGUgc2VsZWN0b3IgZmllbGQgKi8KKwlzZmxkID0gb2Zmc2V0MnB0cigqcHZhbCwgYWRiLT5vZmZzZXQpOworCisJLyogQ2hlY2sgaWYgTlVMTCAqLworCWlmICghc2ZsZCkKKwkJeworCQlpZiAoIWFkYi0+bnVsbF90dCkKKwkJCWdvdG8gZXJyOworCQlyZXR1cm4gYWRiLT5udWxsX3R0OworCQl9CisKKwkvKiBDb252ZXJ0IHR5cGUgdG8gYSBsb25nOgorCSAqIE5COiBkb24ndCBjaGVjayBmb3IgTklEX3VuZGVmIGhlcmUgYmVjYXVzZSBpdAorCSAqIG1pZ2h0IGJlIGEgbGVnaXRpbWF0ZSB2YWx1ZSBpbiB0aGUgdGFibGUKKwkgKi8KKwlpZiAodHQtPmZsYWdzICYgQVNOMV9URkxHX0FEQl9PSUQpIAorCQlzZWxlY3RvciA9IE9CSl9vYmoybmlkKChBU04xX09CSkVDVCAqKSpzZmxkKTsKKwllbHNlIAorCQlzZWxlY3RvciA9IEFTTjFfSU5URUdFUl9nZXQoKEFTTjFfSU5URUdFUiAqKSpzZmxkKTsKKworCS8qIFRyeSB0byBmaW5kIG1hdGNoaW5nIGVudHJ5IGluIHRhYmxlCisJICogTWF5YmUgc2hvdWxkIGNoZWNrIGFwcGxpY2F0aW9uIHR5cGVzIGZpcnN0IHRvCisJICogYWxsb3cgYXBwbGljYXRpb24gb3ZlcnJpZGU/IE1pZ2h0IGFsc28gYmUgdXNlZnVsCisJICogdG8gaGF2ZSBhIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHRhYmxlIGlzIHNvcnRlZCBhbmQKKwkgKiB3ZSBjYW4gZG8gYSBiaW5hcnkgc2VhcmNoLiBGb3Igbm93IHN0aWNrIHRvIGEKKwkgKiBsaW5lYXIgc2VhcmNoLgorCSAqLworCisJZm9yIChhdGJsID0gYWRiLT50YmwsIGkgPSAwOyBpIDwgYWRiLT50Ymxjb3VudDsgaSsrLCBhdGJsKyspCisJCWlmIChhdGJsLT52YWx1ZSA9PSBzZWxlY3RvcikKKwkJCXJldHVybiAmYXRibC0+dHQ7CisKKwkvKiBGSVhNRTogbmVlZCB0byBzZWFyY2ggYXBwbGljYXRpb24gdGFibGUgdG9vICovCisKKwkvKiBObyBtYXRjaCwgcmV0dXJuIGRlZmF1bHQgdHlwZSAqLworCWlmICghYWRiLT5kZWZhdWx0X3R0KQorCQlnb3RvIGVycjsJCQorCXJldHVybiBhZGItPmRlZmF1bHRfdHQ7CisJCisJZXJyOgorCS8qIEZJWE1FOiBzaG91bGQgbG9nIHRoZSB2YWx1ZSBvciBPSUQgb2YgdW5zdXBwb3J0ZWQgdHlwZSAqLworCWlmIChudWxsZXJyKQorCQlBU04xZXJyKEFTTjFfRl9BU04xX0RPX0FEQiwKKwkJCUFTTjFfUl9VTlNVUFBPUlRFRF9BTllfREVGSU5FRF9CWV9UWVBFKTsKKwlyZXR1cm4gTlVMTDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X2FsZ29yLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X2FsZ29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllNTM0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfYWxnb3IuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogeF9hbGdvci5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorCitBU04xX1NFUVVFTkNFKFg1MDlfQUxHT1IpID0geworCUFTTjFfU0lNUExFKFg1MDlfQUxHT1IsIGFsZ29yaXRobSwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfT1BUKFg1MDlfQUxHT1IsIHBhcmFtZXRlciwgQVNOMV9BTlkpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfQUxHT1IpCisKK0FTTjFfSVRFTV9URU1QTEFURShYNTA5X0FMR09SUykgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBhbGdvcml0aG1zLCBYNTA5X0FMR09SKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChYNTA5X0FMR09SUykKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFg1MDlfQUxHT1IpCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2ZuYW1lKFg1MDlfQUxHT1JTLCBYNTA5X0FMR09SUywgWDUwOV9BTEdPUlMpCitJTVBMRU1FTlRfQVNOMV9EVVBfRlVOQ1RJT04oWDUwOV9BTEdPUikKKworSU1QTEVNRU5UX1NUQUNLX09GKFg1MDlfQUxHT1IpCitJTVBMRU1FTlRfQVNOMV9TRVRfT0YoWDUwOV9BTEdPUikKKworaW50IFg1MDlfQUxHT1Jfc2V0MChYNTA5X0FMR09SICphbGcsIEFTTjFfT0JKRUNUICphb2JqLCBpbnQgcHR5cGUsIHZvaWQgKnB2YWwpCisJeworCWlmICghYWxnKQorCQlyZXR1cm4gMDsKKwlpZiAocHR5cGUgIT0gVl9BU04xX1VOREVGKQorCQl7CisJCWlmIChhbGctPnBhcmFtZXRlciA9PSBOVUxMKQorCQkJYWxnLT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCk7CisJCWlmIChhbGctPnBhcmFtZXRlciA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoYWxnKQorCQl7CisJCWlmIChhbGctPmFsZ29yaXRobSkKKwkJCUFTTjFfT0JKRUNUX2ZyZWUoYWxnLT5hbGdvcml0aG0pOworCQlhbGctPmFsZ29yaXRobSA9IGFvYmo7CisJCX0KKwlpZiAocHR5cGUgPT0gMCkKKwkJcmV0dXJuIDE7CQorCWlmIChwdHlwZSA9PSBWX0FTTjFfVU5ERUYpCisJCXsKKwkJaWYgKGFsZy0+cGFyYW1ldGVyKQorCQkJeworCQkJQVNOMV9UWVBFX2ZyZWUoYWxnLT5wYXJhbWV0ZXIpOworCQkJYWxnLT5wYXJhbWV0ZXIgPSBOVUxMOworCQkJfQorCQl9CisJZWxzZQorCQlBU04xX1RZUEVfc2V0KGFsZy0+cGFyYW1ldGVyLCBwdHlwZSwgcHZhbCk7CisJcmV0dXJuIDE7CisJfQorCit2b2lkIFg1MDlfQUxHT1JfZ2V0MChBU04xX09CSkVDVCAqKnBhb2JqLCBpbnQgKnBwdHlwZSwgdm9pZCAqKnBwdmFsLAorCQkJCQkJWDUwOV9BTEdPUiAqYWxnb3IpCisJeworCWlmIChwYW9iaikKKwkJKnBhb2JqID0gYWxnb3ItPmFsZ29yaXRobTsKKwlpZiAocHB0eXBlKQorCQl7CisJCWlmIChhbGdvci0+cGFyYW1ldGVyID09IE5VTEwpCisJCQl7CisJCQkqcHB0eXBlID0gVl9BU04xX1VOREVGOworCQkJcmV0dXJuOworCQkJfQorCQllbHNlCisJCQkqcHB0eXBlID0gYWxnb3ItPnBhcmFtZXRlci0+dHlwZTsKKwkJaWYgKHBwdmFsKQorCQkJKnBwdmFsID0gYWxnb3ItPnBhcmFtZXRlci0+dmFsdWUucHRyOworCQl9CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X2F0dHJpYi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9hdHRyaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTM3MTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9hdHRyaWIuYwpAQCAtMCwwICsxLDExOCBAQAorLyogY3J5cHRvL2FzbjEveF9hdHRyaWIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworLyogWDUwOV9BVFRSSUJVVEU6IHRoaXMgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybToKKyAqCisgKiB0eXBlZGVmIHN0cnVjdCB4NTA5X2F0dHJpYnV0ZXNfc3QKKyAqCXsKKyAqCUFTTjFfT0JKRUNUICpvYmplY3Q7CisgKglpbnQgc2luZ2xlOworICoJdW5pb24JeworICoJCWNoYXIJCSpwdHI7CisgKiAJCVNUQUNLX09GKEFTTjFfVFlQRSkgKnNldDsKKyAqIAkJQVNOMV9UWVBFCSpzaW5nbGU7CisgKgkJfSB2YWx1ZTsKKyAqCX0gWDUwOV9BVFRSSUJVVEU7CisgKgorICogdGhpcyBuZWVkcyBzb21lIGV4dHJhIHRob3VnaHQgYmVjYXVzZSB0aGUgQ0hPSUNFIHR5cGUgaXMKKyAqIG1lcmdlZCB3aXRoIHRoZSBtYWluIHN0cnVjdHVyZSBhbmQgYmVjYXVzZSB0aGUgdmFsdWUgY2FuCisgKiBiZSBhbnl0aGluZyBhdCBhbGwgd2UgKm11c3QqIHRyeSB0aGUgU0VUIE9GIGZpcnN0IGJlY2F1c2UKKyAqIHRoZSBBU04xX0FOWSB0eXBlIHdpbGwgc3dhbGxvdyBhbnl0aGluZyBpbmNsdWRpbmcgdGhlIHdob2xlCisgKiBTRVQgT0Ygc3RydWN0dXJlLgorICovCisKK0FTTjFfQ0hPSUNFKFg1MDlfQVRUUklCVVRFX1NFVCkgPSB7CisJQVNOMV9TRVRfT0YoWDUwOV9BVFRSSUJVVEUsIHZhbHVlLnNldCwgQVNOMV9BTlkpLAorCUFTTjFfU0lNUExFKFg1MDlfQVRUUklCVVRFLCB2YWx1ZS5zaW5nbGUsIEFTTjFfQU5ZKQorfSBBU04xX0NIT0lDRV9FTkRfc2VsZWN0b3IoWDUwOV9BVFRSSUJVVEUsIFg1MDlfQVRUUklCVVRFX1NFVCwgc2luZ2xlKQorCitBU04xX1NFUVVFTkNFKFg1MDlfQVRUUklCVVRFKSA9IHsKKwlBU04xX1NJTVBMRShYNTA5X0FUVFJJQlVURSwgb2JqZWN0LCBBU04xX09CSkVDVCksCisJLyogQ0hPSUNFIHR5cGUgbWVyZ2VkIHdpdGggcGFyZW50ICovCisJQVNOMV9FWF9DT01CSU5FKDAsIDAsIFg1MDlfQVRUUklCVVRFX1NFVCkKK30gQVNOMV9TRVFVRU5DRV9FTkQoWDUwOV9BVFRSSUJVVEUpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0FUVFJJQlVURSkKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5X0FUVFJJQlVURSkKKworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZShpbnQgbmlkLCBpbnQgYXRydHlwZSwgdm9pZCAqdmFsdWUpCisJeworCVg1MDlfQVRUUklCVVRFICpyZXQ9TlVMTDsKKwlBU04xX1RZUEUgKnZhbD1OVUxMOworCisJaWYgKChyZXQ9WDUwOV9BVFRSSUJVVEVfbmV3KCkpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKwlyZXQtPm9iamVjdD1PQkpfbmlkMm9iaihuaWQpOworCXJldC0+c2luZ2xlPTA7CisJaWYgKChyZXQtPnZhbHVlLnNldD1za19BU04xX1RZUEVfbmV3X251bGwoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKCh2YWw9QVNOMV9UWVBFX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoIXNrX0FTTjFfVFlQRV9wdXNoKHJldC0+dmFsdWUuc2V0LHZhbCkpIGdvdG8gZXJyOworCisJQVNOMV9UWVBFX3NldCh2YWwsYXRydHlwZSx2YWx1ZSk7CisJcmV0dXJuKHJldCk7CitlcnI6CisJaWYgKHJldCAhPSBOVUxMKSBYNTA5X0FUVFJJQlVURV9mcmVlKHJldCk7CisJaWYgKHZhbCAhPSBOVUxMKSBBU04xX1RZUEVfZnJlZSh2YWwpOworCXJldHVybihOVUxMKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X2JpZ251bS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9iaWdudW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2YzMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9iaWdudW0uYwpAQCAtMCwwICsxLDEzOSBAQAorLyogeF9iaWdudW0uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisvKiBDdXN0b20gcHJpbWl0aXZlIHR5cGUgZm9yIEJJR05VTSBoYW5kbGluZy4gVGhpcyByZWFkcyBpbiBhbiBBU04xX0lOVEVHRVIgYXMgYQorICogQklHTlVNIGRpcmVjdGx5LiBDdXJyZW50bHkgaXQgaWdub3JlcyB0aGUgc2lnbiB3aGljaCBpc24ndCBhIHByb2JsZW0gc2luY2UgYWxsCisgKiBCSUdOVU1zIHVzZWQgYXJlIG5vbiBuZWdhdGl2ZSBhbmQgYW55dGhpbmcgdGhhdCBsb29rcyBuZWdhdGl2ZSBpcyBub3JtYWxseSBkdWUKKyAqIHRvIGFuIGVuY29kaW5nIGVycm9yLgorICovCisKKyNkZWZpbmUgQk5fU0VOU0lUSVZFCTEKKworc3RhdGljIGludCBibl9uZXcoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworc3RhdGljIHZvaWQgYm5fZnJlZShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK3N0YXRpYyBpbnQgYm5faTJjKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICpjb250LCBpbnQgKnB1dHlwZSwgY29uc3QgQVNOMV9JVEVNICppdCk7CitzdGF0aWMgaW50IGJuX2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitzdGF0aWMgQVNOMV9QUklNSVRJVkVfRlVOQ1MgYmlnbnVtX3BmID0geworCU5VTEwsIDAsCisJYm5fbmV3LAorCWJuX2ZyZWUsCisJMCwKKwlibl9jMmksCisJYm5faTJjCit9OworCitBU04xX0lURU1fc3RhcnQoQklHTlVNKQorCUFTTjFfSVRZUEVfUFJJTUlUSVZFLCBWX0FTTjFfSU5URUdFUiwgTlVMTCwgMCwgJmJpZ251bV9wZiwgMCwgIkJJR05VTSIKK0FTTjFfSVRFTV9lbmQoQklHTlVNKQorCitBU04xX0lURU1fc3RhcnQoQ0JJR05VTSkKKwlBU04xX0lUWVBFX1BSSU1JVElWRSwgVl9BU04xX0lOVEVHRVIsIE5VTEwsIDAsICZiaWdudW1fcGYsIEJOX1NFTlNJVElWRSwgIkJJR05VTSIKK0FTTjFfSVRFTV9lbmQoQ0JJR05VTSkKKworc3RhdGljIGludCBibl9uZXcoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCit7CisJKnB2YWwgPSAoQVNOMV9WQUxVRSAqKUJOX25ldygpOworCWlmKCpwdmFsKSByZXR1cm4gMTsKKwllbHNlIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBibl9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQoreworCWlmKCEqcHZhbCkgcmV0dXJuOworCWlmKGl0LT5zaXplICYgQk5fU0VOU0lUSVZFKSBCTl9jbGVhcl9mcmVlKChCSUdOVU0gKikqcHZhbCk7CisJZWxzZSBCTl9mcmVlKChCSUdOVU0gKikqcHZhbCk7CisJKnB2YWwgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGJuX2kyYyhBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqY29udCwgaW50ICpwdXR5cGUsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCit7CisJQklHTlVNICpibjsKKwlpbnQgcGFkOworCWlmKCEqcHZhbCkgcmV0dXJuIC0xOworCWJuID0gKEJJR05VTSAqKSpwdmFsOworCS8qIElmIE1TQiBzZXQgaW4gYW4gb2N0ZXQgd2UgbmVlZCBhIHBhZGRpbmcgYnl0ZSAqLworCWlmKEJOX251bV9iaXRzKGJuKSAmIDB4NykgcGFkID0gMDsKKwllbHNlIHBhZCA9IDE7CisJaWYoY29udCkgeworCQlpZihwYWQpICpjb250KysgPSAwOworCQlCTl9ibjJiaW4oYm4sIGNvbnQpOworCX0KKwlyZXR1cm4gcGFkICsgQk5fbnVtX2J5dGVzKGJuKTsKK30KKworc3RhdGljIGludCBibl9jMmkoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCBsZW4sCisJCSAgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCit7CisJQklHTlVNICpibjsKKwlpZighKnB2YWwpIGJuX25ldyhwdmFsLCBpdCk7CisJYm4gID0gKEJJR05VTSAqKSpwdmFsOworCWlmKCFCTl9iaW4yYm4oY29udCwgbGVuLCBibikpIHsKKwkJYm5fZnJlZShwdmFsLCBpdCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X2NybC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9jcmwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTFjNjkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9jcmwuYwpAQCAtMCwwICsxLDUyNyBAQAorLyogY3J5cHRvL2FzbjEveF9jcmwuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgImFzbjFfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCitzdGF0aWMgaW50IFg1MDlfUkVWT0tFRF9jbXAoY29uc3QgWDUwOV9SRVZPS0VEICogY29uc3QgKmEsCisJCQkJY29uc3QgWDUwOV9SRVZPS0VEICogY29uc3QgKmIpOworc3RhdGljIHZvaWQgc2V0dXBfaWRwKFg1MDlfQ1JMICpjcmwsIElTU1VJTkdfRElTVF9QT0lOVCAqaWRwKTsKKworQVNOMV9TRVFVRU5DRShYNTA5X1JFVk9LRUQpID0geworCUFTTjFfU0lNUExFKFg1MDlfUkVWT0tFRCxzZXJpYWxOdW1iZXIsIEFTTjFfSU5URUdFUiksCisJQVNOMV9TSU1QTEUoWDUwOV9SRVZPS0VELHJldm9jYXRpb25EYXRlLCBBU04xX1RJTUUpLAorCUFTTjFfU0VRVUVOQ0VfT0ZfT1BUKFg1MDlfUkVWT0tFRCxleHRlbnNpb25zLCBYNTA5X0VYVEVOU0lPTikKK30gQVNOMV9TRVFVRU5DRV9FTkQoWDUwOV9SRVZPS0VEKQorCitzdGF0aWMgaW50IGRlZl9jcmxfdmVyaWZ5KFg1MDlfQ1JMICpjcmwsIEVWUF9QS0VZICpyKTsKK3N0YXRpYyBpbnQgZGVmX2NybF9sb29rdXAoWDUwOV9DUkwgKmNybCwKKwkJWDUwOV9SRVZPS0VEICoqcmV0LCBBU04xX0lOVEVHRVIgKnNlcmlhbCwgWDUwOV9OQU1FICppc3N1ZXIpOworCitzdGF0aWMgWDUwOV9DUkxfTUVUSE9EIGludF9jcmxfbWV0aCA9CisJeworCTAsCisJMCwwLAorCWRlZl9jcmxfbG9va3VwLAorCWRlZl9jcmxfdmVyaWZ5CisJfTsKKworc3RhdGljIGNvbnN0IFg1MDlfQ1JMX01FVEhPRCAqZGVmYXVsdF9jcmxfbWV0aG9kID0gJmludF9jcmxfbWV0aDsKKworLyogVGhlIFg1MDlfQ1JMX0lORk8gc3RydWN0dXJlIG5lZWRzIGEgYml0IG9mIGN1c3RvbWlzYXRpb24uCisgKiBTaW5jZSB3ZSBjYWNoZSB0aGUgb3JpZ2luYWwgZW5jb2RpbmcgdGhlIHNpZ25hdHVyZSB3b250IGJlIGFmZmVjdGVkIGJ5CisgKiByZW9yZGVyaW5nIG9mIHRoZSByZXZva2VkIGZpZWxkLgorICovCitzdGF0aWMgaW50IGNybF9pbmZfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCVg1MDlfQ1JMX0lORk8gKmEgPSAoWDUwOV9DUkxfSU5GTyAqKSpwdmFsOworCisJaWYoIWEgfHwgIWEtPnJldm9rZWQpIHJldHVybiAxOworCXN3aXRjaChvcGVyYXRpb24pIHsKKwkJLyogSnVzdCBzZXQgY21wIGZ1bmN0aW9uIGhlcmUuIFdlIGRvbid0IHNvcnQgYmVjYXVzZSB0aGF0CisJCSAqIHdvdWxkIGFmZmVjdCB0aGUgb3V0cHV0IG9mIFg1MDlfQ1JMX3ByaW50KCkuCisJCSAqLworCQljYXNlIEFTTjFfT1BfRDJJX1BPU1Q6CisJCSh2b2lkKXNrX1g1MDlfUkVWT0tFRF9zZXRfY21wX2Z1bmMoYS0+cmV2b2tlZCxYNTA5X1JFVk9LRURfY21wKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCisKK0FTTjFfU0VRVUVOQ0VfZW5jKFg1MDlfQ1JMX0lORk8sIGVuYywgY3JsX2luZl9jYikgPSB7CisJQVNOMV9PUFQoWDUwOV9DUkxfSU5GTywgdmVyc2lvbiwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NJTVBMRShYNTA5X0NSTF9JTkZPLCBzaWdfYWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShYNTA5X0NSTF9JTkZPLCBpc3N1ZXIsIFg1MDlfTkFNRSksCisJQVNOMV9TSU1QTEUoWDUwOV9DUkxfSU5GTywgbGFzdFVwZGF0ZSwgQVNOMV9USU1FKSwKKwlBU04xX09QVChYNTA5X0NSTF9JTkZPLCBuZXh0VXBkYXRlLCBBU04xX1RJTUUpLAorCUFTTjFfU0VRVUVOQ0VfT0ZfT1BUKFg1MDlfQ1JMX0lORk8sIHJldm9rZWQsIFg1MDlfUkVWT0tFRCksCisJQVNOMV9FWFBfU0VRVUVOQ0VfT0ZfT1BUKFg1MDlfQ1JMX0lORk8sIGV4dGVuc2lvbnMsIFg1MDlfRVhURU5TSU9OLCAwKQorfSBBU04xX1NFUVVFTkNFX0VORF9lbmMoWDUwOV9DUkxfSU5GTywgWDUwOV9DUkxfSU5GTykKKworLyogU2V0IENSTCBlbnRyeSBpc3N1ZXIgYWNjb3JkaW5nIHRvIENSTCBjZXJ0aWZpY2F0ZSBpc3N1ZXIgZXh0ZW5zaW9uLgorICogQ2hlY2sgZm9yIHVuaGFuZGxlZCBjcml0aWNhbCBDUkwgZW50cnkgZXh0ZW5zaW9ucy4KKyAqLworCitzdGF0aWMgaW50IGNybF9zZXRfaXNzdWVycyhYNTA5X0NSTCAqY3JsKQorCXsKKworCWludCBpLCBqOworCUdFTkVSQUxfTkFNRVMgKmdlbnMsICpndG1wOworCVNUQUNLX09GKFg1MDlfUkVWT0tFRCkgKnJldm9rZWQ7CisKKwlyZXZva2VkID0gWDUwOV9DUkxfZ2V0X1JFVk9LRUQoY3JsKTsKKworCWdlbnMgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X1JFVk9LRURfbnVtKHJldm9rZWQpOyBpKyspCisJCXsKKwkJWDUwOV9SRVZPS0VEICpyZXYgPSBza19YNTA5X1JFVk9LRURfdmFsdWUocmV2b2tlZCwgaSk7CisJCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0czsKKwkJQVNOMV9FTlVNRVJBVEVEICpyZWFzb247CisJCVg1MDlfRVhURU5TSU9OICpleHQ7CisJCWd0bXAgPSBYNTA5X1JFVk9LRURfZ2V0X2V4dF9kMmkocmV2LCAKKwkJCQkJCU5JRF9jZXJ0aWZpY2F0ZV9pc3N1ZXIsCisJCQkJCQkmaiwgTlVMTCk7CisJCWlmICghZ3RtcCAmJiAoaiAhPSAtMSkpCisJCQl7CisJCQljcmwtPmZsYWdzIHw9IEVYRkxBR19JTlZBTElEOworCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJaWYgKGd0bXApCisJCQl7CisJCQlnZW5zID0gZ3RtcDsKKwkJCWlmICghY3JsLT5pc3N1ZXJzKQorCQkJCXsKKwkJCQljcmwtPmlzc3VlcnMgPSBza19HRU5FUkFMX05BTUVTX25ld19udWxsKCk7CisJCQkJaWYgKCFjcmwtPmlzc3VlcnMpCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWlmICghc2tfR0VORVJBTF9OQU1FU19wdXNoKGNybC0+aXNzdWVycywgZ3RtcCkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCXJldi0+aXNzdWVyID0gZ2VuczsKKworCQlyZWFzb24gPSBYNTA5X1JFVk9LRURfZ2V0X2V4dF9kMmkocmV2LCBOSURfY3JsX3JlYXNvbiwKKwkJCQkJCQkJJmosIE5VTEwpOworCQlpZiAoIXJlYXNvbiAmJiAoaiAhPSAtMSkpCisJCQl7CisJCQljcmwtPmZsYWdzIHw9IEVYRkxBR19JTlZBTElEOworCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJaWYgKHJlYXNvbikKKwkJCXsKKwkJCXJldi0+cmVhc29uID0gQVNOMV9FTlVNRVJBVEVEX2dldChyZWFzb24pOworCQkJQVNOMV9FTlVNRVJBVEVEX2ZyZWUocmVhc29uKTsKKwkJCX0KKwkJZWxzZQorCQkJcmV2LT5yZWFzb24gPSBDUkxfUkVBU09OX05PTkU7CQorCisJCS8qIENoZWNrIGZvciBjcml0aWNhbCBDUkwgZW50cnkgZXh0ZW5zaW9ucyAqLworCisJCWV4dHMgPSByZXYtPmV4dGVuc2lvbnM7CisKKwkJZm9yIChqID0gMDsgaiA8IHNrX1g1MDlfRVhURU5TSU9OX251bShleHRzKTsgaisrKQorCQkJeworCQkJZXh0ID0gc2tfWDUwOV9FWFRFTlNJT05fdmFsdWUoZXh0cywgaik7CisJCQlpZiAoZXh0LT5jcml0aWNhbCA+IDApCisJCQkJeworCQkJCWlmIChPQkpfb2JqMm5pZChleHQtPm9iamVjdCkgPT0KKwkJCQkJTklEX2NlcnRpZmljYXRlX2lzc3VlcikKKwkJCQkJY29udGludWU7CisJCQkJY3JsLT5mbGFncyB8PSBFWEZMQUdfQ1JJVElDQUw7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisKKwkJfQorCisJcmV0dXJuIDE7CisKKwl9CisKKy8qIFRoZSBYNTA5X0NSTCBzdHJ1Y3R1cmUgbmVlZHMgYSBiaXQgb2YgY3VzdG9taXNhdGlvbi4gQ2FjaGUgc29tZSBleHRlbnNpb25zCisgKiBhbmQgaGFzaCBvZiB0aGUgd2hvbGUgQ1JMLgorICovCitzdGF0aWMgaW50IGNybF9jYihpbnQgb3BlcmF0aW9uLCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQkJCQkJdm9pZCAqZXhhcmcpCisJeworCVg1MDlfQ1JMICpjcmwgPSAoWDUwOV9DUkwgKikqcHZhbDsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHM7CisJWDUwOV9FWFRFTlNJT04gKmV4dDsKKwlpbnQgaWR4OworCisJc3dpdGNoKG9wZXJhdGlvbikKKwkJeworCQljYXNlIEFTTjFfT1BfTkVXX1BPU1Q6CisJCWNybC0+aWRwID0gTlVMTDsKKwkJY3JsLT5ha2lkID0gTlVMTDsKKwkJY3JsLT5mbGFncyA9IDA7CisJCWNybC0+aWRwX2ZsYWdzID0gMDsKKwkJY3JsLT5pZHBfcmVhc29ucyA9IENSTERQX0FMTF9SRUFTT05TOworCQljcmwtPm1ldGggPSBkZWZhdWx0X2NybF9tZXRob2Q7CisJCWNybC0+bWV0aF9kYXRhID0gTlVMTDsKKwkJY3JsLT5pc3N1ZXJzID0gTlVMTDsKKwkJY3JsLT5jcmxfbnVtYmVyID0gTlVMTDsKKwkJY3JsLT5iYXNlX2NybF9udW1iZXIgPSBOVUxMOworCQlicmVhazsKKworCQljYXNlIEFTTjFfT1BfRDJJX1BPU1Q6CisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisJCVg1MDlfQ1JMX2RpZ2VzdChjcmwsIEVWUF9zaGExKCksIGNybC0+c2hhMV9oYXNoLCBOVUxMKTsKKyNlbmRpZgorCQljcmwtPmlkcCA9IFg1MDlfQ1JMX2dldF9leHRfZDJpKGNybCwKKwkJCQlOSURfaXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQsIE5VTEwsIE5VTEwpOworCQlpZiAoY3JsLT5pZHApCisJCQlzZXR1cF9pZHAoY3JsLCBjcmwtPmlkcCk7CisKKwkJY3JsLT5ha2lkID0gWDUwOV9DUkxfZ2V0X2V4dF9kMmkoY3JsLAorCQkJCU5JRF9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIsIE5VTEwsIE5VTEwpOwkKKworCQljcmwtPmNybF9udW1iZXIgPSBYNTA5X0NSTF9nZXRfZXh0X2QyaShjcmwsCisJCQkJTklEX2NybF9udW1iZXIsIE5VTEwsIE5VTEwpOwkKKworCQljcmwtPmJhc2VfY3JsX251bWJlciA9IFg1MDlfQ1JMX2dldF9leHRfZDJpKGNybCwKKwkJCQlOSURfZGVsdGFfY3JsLCBOVUxMLCBOVUxMKTsJCisJCS8qIERlbHRhIENSTHMgbXVzdCBoYXZlIENSTCBudW1iZXIgKi8KKwkJaWYgKGNybC0+YmFzZV9jcmxfbnVtYmVyICYmICFjcmwtPmNybF9udW1iZXIpCisJCQljcmwtPmZsYWdzIHw9IEVYRkxBR19JTlZBTElEOworCisJCS8qIFNlZSBpZiB3ZSBoYXZlIGFueSB1bmhhbmRsZWQgY3JpdGljYWwgQ1JMIGV4dGVuc2lvbnMgYW5kIAorCQkgKiBpbmRpY2F0ZSB0aGlzIGluIGEgZmxhZy4gV2Ugb25seSBjdXJyZW50bHkgaGFuZGxlIElEUCBzbworCQkgKiBhbnl0aGluZyBlbHNlIGNyaXRpY2FsIHNldHMgdGhlIGZsYWcuCisJCSAqCisJCSAqIFRoaXMgY29kZSBhY2Nlc3NlcyB0aGUgWDUwOV9DUkwgc3RydWN0dXJlIGRpcmVjdGx5OgorCQkgKiBhcHBsaWNhdGlvbnMgc2hvdWxkbid0IGRvIHRoaXMuCisJCSAqLworCisJCWV4dHMgPSBjcmwtPmNybC0+ZXh0ZW5zaW9uczsKKworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHNrX1g1MDlfRVhURU5TSU9OX251bShleHRzKTsgaWR4KyspCisJCQl7CisJCQlpbnQgbmlkOworCQkJZXh0ID0gc2tfWDUwOV9FWFRFTlNJT05fdmFsdWUoZXh0cywgaWR4KTsKKwkJCW5pZCA9IE9CSl9vYmoybmlkKGV4dC0+b2JqZWN0KTsKKwkJCWlmIChuaWQgPT0gTklEX2ZyZXNoZXN0X2NybCkKKwkJCQljcmwtPmZsYWdzIHw9IEVYRkxBR19GUkVTSEVTVDsKKwkJCWlmIChleHQtPmNyaXRpY2FsID4gMCkKKwkJCQl7CisJCQkJLyogV2UgaGFuZGxlIElEUCBhbmQgZGVsdGFzICovCisJCQkJaWYgKChuaWQgPT0gTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50KQorCQkJCQl8fCAobmlkID09IE5JRF9kZWx0YV9jcmwpKQorCQkJCQlicmVhazs7CisJCQkJY3JsLT5mbGFncyB8PSBFWEZMQUdfQ1JJVElDQUw7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisKKwkJaWYgKCFjcmxfc2V0X2lzc3VlcnMoY3JsKSkKKwkJCXJldHVybiAwOworCisJCWlmIChjcmwtPm1ldGgtPmNybF9pbml0KQorCQkJeworCQkJaWYgKGNybC0+bWV0aC0+Y3JsX2luaXQoY3JsKSA9PSAwKQorCQkJCXJldHVybiAwOworCQkJfQorCQlicmVhazsKKworCQljYXNlIEFTTjFfT1BfRlJFRV9QT1NUOgorCQlpZiAoY3JsLT5tZXRoLT5jcmxfZnJlZSkKKwkJCXsKKwkJCWlmICghY3JsLT5tZXRoLT5jcmxfZnJlZShjcmwpKQorCQkJCXJldHVybiAwOworCQkJfQorCQlpZiAoY3JsLT5ha2lkKQorCQkJQVVUSE9SSVRZX0tFWUlEX2ZyZWUoY3JsLT5ha2lkKTsKKwkJaWYgKGNybC0+aWRwKQorCQkJSVNTVUlOR19ESVNUX1BPSU5UX2ZyZWUoY3JsLT5pZHApOworCQlBU04xX0lOVEVHRVJfZnJlZShjcmwtPmNybF9udW1iZXIpOworCQlBU04xX0lOVEVHRVJfZnJlZShjcmwtPmJhc2VfY3JsX251bWJlcik7CisJCXNrX0dFTkVSQUxfTkFNRVNfcG9wX2ZyZWUoY3JsLT5pc3N1ZXJzLCBHRU5FUkFMX05BTUVTX2ZyZWUpOworCQlicmVhazsKKwkJfQorCXJldHVybiAxOworCX0KKworLyogQ29udmVydCBJRFAgaW50byBhIG1vcmUgY29udmVuaWVudCBmb3JtICovCisKK3N0YXRpYyB2b2lkIHNldHVwX2lkcChYNTA5X0NSTCAqY3JsLCBJU1NVSU5HX0RJU1RfUE9JTlQgKmlkcCkKKwl7CisJaW50IGlkcF9vbmx5ID0gMDsKKwkvKiBTZXQgdmFyaW91cyBmbGFncyBhY2NvcmRpbmcgdG8gSURQICovCisJY3JsLT5pZHBfZmxhZ3MgfD0gSURQX1BSRVNFTlQ7CisJaWYgKGlkcC0+b25seXVzZXIgPiAwKQorCQl7CisJCWlkcF9vbmx5Kys7CisJCWNybC0+aWRwX2ZsYWdzIHw9IElEUF9PTkxZVVNFUjsKKwkJfQorCWlmIChpZHAtPm9ubHlDQSA+IDApCisJCXsKKwkJaWRwX29ubHkrKzsKKwkJY3JsLT5pZHBfZmxhZ3MgfD0gSURQX09OTFlDQTsKKwkJfQorCWlmIChpZHAtPm9ubHlhdHRyID4gMCkKKwkJeworCQlpZHBfb25seSsrOworCQljcmwtPmlkcF9mbGFncyB8PSBJRFBfT05MWUFUVFI7CisJCX0KKworCWlmIChpZHBfb25seSA+IDEpCisJCWNybC0+aWRwX2ZsYWdzIHw9IElEUF9JTlZBTElEOworCisJaWYgKGlkcC0+aW5kaXJlY3RDUkwgPiAwKQorCQljcmwtPmlkcF9mbGFncyB8PSBJRFBfSU5ESVJFQ1Q7CisKKwlpZiAoaWRwLT5vbmx5c29tZXJlYXNvbnMpCisJCXsKKwkJY3JsLT5pZHBfZmxhZ3MgfD0gSURQX1JFQVNPTlM7CisJCWlmIChpZHAtPm9ubHlzb21lcmVhc29ucy0+bGVuZ3RoID4gMCkKKwkJCWNybC0+aWRwX3JlYXNvbnMgPSBpZHAtPm9ubHlzb21lcmVhc29ucy0+ZGF0YVswXTsKKwkJaWYgKGlkcC0+b25seXNvbWVyZWFzb25zLT5sZW5ndGggPiAxKQorCQkJY3JsLT5pZHBfcmVhc29ucyB8PQorCQkJCShpZHAtPm9ubHlzb21lcmVhc29ucy0+ZGF0YVsxXSA8PCA4KTsKKwkJY3JsLT5pZHBfcmVhc29ucyAmPSBDUkxEUF9BTExfUkVBU09OUzsKKwkJfQorCisJRElTVF9QT0lOVF9zZXRfZHBuYW1lKGlkcC0+ZGlzdHBvaW50LCBYNTA5X0NSTF9nZXRfaXNzdWVyKGNybCkpOworCX0KKworQVNOMV9TRVFVRU5DRV9yZWYoWDUwOV9DUkwsIGNybF9jYiwgQ1JZUFRPX0xPQ0tfWDUwOV9DUkwpID0geworCUFTTjFfU0lNUExFKFg1MDlfQ1JMLCBjcmwsIFg1MDlfQ1JMX0lORk8pLAorCUFTTjFfU0lNUExFKFg1MDlfQ1JMLCBzaWdfYWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShYNTA5X0NSTCwgc2lnbmF0dXJlLCBBU04xX0JJVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EX3JlZihYNTA5X0NSTCwgWDUwOV9DUkwpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X1JFVk9LRUQpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9DUkxfSU5GTykKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0NSTCkKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5X0NSTCkKKworc3RhdGljIGludCBYNTA5X1JFVk9LRURfY21wKGNvbnN0IFg1MDlfUkVWT0tFRCAqIGNvbnN0ICphLAorCQkJY29uc3QgWDUwOV9SRVZPS0VEICogY29uc3QgKmIpCisJeworCXJldHVybihBU04xX1NUUklOR19jbXAoCisJCShBU04xX1NUUklORyAqKSgqYSktPnNlcmlhbE51bWJlciwKKwkJKEFTTjFfU1RSSU5HICopKCpiKS0+c2VyaWFsTnVtYmVyKSk7CisJfQorCitpbnQgWDUwOV9DUkxfYWRkMF9yZXZva2VkKFg1MDlfQ1JMICpjcmwsIFg1MDlfUkVWT0tFRCAqcmV2KQoreworCVg1MDlfQ1JMX0lORk8gKmluZjsKKwlpbmYgPSBjcmwtPmNybDsKKwlpZighaW5mLT5yZXZva2VkKQorCQlpbmYtPnJldm9rZWQgPSBza19YNTA5X1JFVk9LRURfbmV3KFg1MDlfUkVWT0tFRF9jbXApOworCWlmKCFpbmYtPnJldm9rZWQgfHwgIXNrX1g1MDlfUkVWT0tFRF9wdXNoKGluZi0+cmV2b2tlZCwgcmV2KSkgeworCQlBU04xZXJyKEFTTjFfRl9YNTA5X0NSTF9BREQwX1JFVk9LRUQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCWluZi0+ZW5jLm1vZGlmaWVkID0gMTsKKwlyZXR1cm4gMTsKK30KKworaW50IFg1MDlfQ1JMX3ZlcmlmeShYNTA5X0NSTCAqY3JsLCBFVlBfUEtFWSAqcikKKwl7CisJaWYgKGNybC0+bWV0aC0+Y3JsX3ZlcmlmeSkKKwkJcmV0dXJuIGNybC0+bWV0aC0+Y3JsX3ZlcmlmeShjcmwsIHIpOworCXJldHVybiAwOworCX0KKworaW50IFg1MDlfQ1JMX2dldDBfYnlfc2VyaWFsKFg1MDlfQ1JMICpjcmwsCisJCVg1MDlfUkVWT0tFRCAqKnJldCwgQVNOMV9JTlRFR0VSICpzZXJpYWwpCisJeworCWlmIChjcmwtPm1ldGgtPmNybF9sb29rdXApCisJCXJldHVybiBjcmwtPm1ldGgtPmNybF9sb29rdXAoY3JsLCByZXQsIHNlcmlhbCwgTlVMTCk7CisJcmV0dXJuIDA7CisJfQorCitpbnQgWDUwOV9DUkxfZ2V0MF9ieV9jZXJ0KFg1MDlfQ1JMICpjcmwsIFg1MDlfUkVWT0tFRCAqKnJldCwgWDUwOSAqeCkKKwl7CisJaWYgKGNybC0+bWV0aC0+Y3JsX2xvb2t1cCkKKwkJcmV0dXJuIGNybC0+bWV0aC0+Y3JsX2xvb2t1cChjcmwsIHJldCwKKwkJCQkJCVg1MDlfZ2V0X3NlcmlhbE51bWJlcih4KSwKKwkJCQkJCVg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpKTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgZGVmX2NybF92ZXJpZnkoWDUwOV9DUkwgKmNybCwgRVZQX1BLRVkgKnIpCisJeworCXJldHVybihBU04xX2l0ZW1fdmVyaWZ5KEFTTjFfSVRFTV9ycHRyKFg1MDlfQ1JMX0lORk8pLAorCQljcmwtPnNpZ19hbGcsIGNybC0+c2lnbmF0dXJlLGNybC0+Y3JsLHIpKTsKKwl9CisKK3N0YXRpYyBpbnQgY3JsX3Jldm9rZWRfaXNzdWVyX21hdGNoKFg1MDlfQ1JMICpjcmwsIFg1MDlfTkFNRSAqbm0sCisJCQkJCQlYNTA5X1JFVk9LRUQgKnJldikKKwl7CisJaW50IGk7CisKKwlpZiAoIXJldi0+aXNzdWVyKQorCQl7CisJCWlmICghbm0pCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFYNTA5X05BTUVfY21wKG5tLCBYNTA5X0NSTF9nZXRfaXNzdWVyKGNybCkpKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoIW5tKQorCQlubSA9IFg1MDlfQ1JMX2dldF9pc3N1ZXIoY3JsKTsKKworCWZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKHJldi0+aXNzdWVyKTsgaSsrKQorCQl7CisJCUdFTkVSQUxfTkFNRSAqZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKHJldi0+aXNzdWVyLCBpKTsKKwkJaWYgKGdlbi0+dHlwZSAhPSBHRU5fRElSTkFNRSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIVg1MDlfTkFNRV9jbXAobm0sIGdlbi0+ZC5kaXJlY3RvcnlOYW1lKSkKKwkJCXJldHVybiAxOworCQl9CisJcmV0dXJuIDA7CisKKwl9CisKK3N0YXRpYyBpbnQgZGVmX2NybF9sb29rdXAoWDUwOV9DUkwgKmNybCwKKwkJWDUwOV9SRVZPS0VEICoqcmV0LCBBU04xX0lOVEVHRVIgKnNlcmlhbCwgWDUwOV9OQU1FICppc3N1ZXIpCisJeworCVg1MDlfUkVWT0tFRCBydG1wLCAqcmV2OworCWludCBpZHg7CisJcnRtcC5zZXJpYWxOdW1iZXIgPSBzZXJpYWw7CisJLyogU29ydCByZXZva2VkIGludG8gc2VyaWFsIG51bWJlciBvcmRlciBpZiBub3QgYWxyZWFkeSBzb3J0ZWQuCisJICogRG8gdGhpcyB1bmRlciBhIGxvY2sgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24uCisgCSAqLworCWlmICghc2tfWDUwOV9SRVZPS0VEX2lzX3NvcnRlZChjcmwtPmNybC0+cmV2b2tlZCkpCisJCXsKKwkJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19YNTA5X0NSTCk7CisJCXNrX1g1MDlfUkVWT0tFRF9zb3J0KGNybC0+Y3JsLT5yZXZva2VkKTsKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfQ1JMKTsKKwkJfQorCWlkeCA9IHNrX1g1MDlfUkVWT0tFRF9maW5kKGNybC0+Y3JsLT5yZXZva2VkLCAmcnRtcCk7CisJaWYoaWR4IDwgMCkKKwkJcmV0dXJuIDA7CisJLyogTmVlZCB0byBsb29rIGZvciBtYXRjaGluZyBuYW1lICovCisJZm9yKDtpZHggPCBza19YNTA5X1JFVk9LRURfbnVtKGNybC0+Y3JsLT5yZXZva2VkKTsgaWR4KyspCisJCXsKKwkJcmV2ID0gc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKGNybC0+Y3JsLT5yZXZva2VkLCBpZHgpOworCQlpZiAoQVNOMV9JTlRFR0VSX2NtcChyZXYtPnNlcmlhbE51bWJlciwgc2VyaWFsKSkKKwkJCXJldHVybiAwOworCQlpZiAoY3JsX3Jldm9rZWRfaXNzdWVyX21hdGNoKGNybCwgaXNzdWVyLCByZXYpKQorCQkJeworCQkJaWYgKHJldCkKKwkJCQkqcmV0ID0gcmV2OworCQkJaWYgKHJldi0+cmVhc29uID09IENSTF9SRUFTT05fUkVNT1ZFX0ZST01fQ1JMKQorCQkJCXJldHVybiAyOworCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwlyZXR1cm4gMDsKKwl9CisKK3ZvaWQgWDUwOV9DUkxfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IFg1MDlfQ1JMX01FVEhPRCAqbWV0aCkKKwl7CisJaWYgKG1ldGggPT0gTlVMTCkKKwkJZGVmYXVsdF9jcmxfbWV0aG9kID0gJmludF9jcmxfbWV0aDsKKwllbHNlIAorCQlkZWZhdWx0X2NybF9tZXRob2QgPSBtZXRoOworCX0KKworWDUwOV9DUkxfTUVUSE9EICpYNTA5X0NSTF9NRVRIT0RfbmV3KAorCWludCAoKmNybF9pbml0KShYNTA5X0NSTCAqY3JsKSwKKwlpbnQgKCpjcmxfZnJlZSkoWDUwOV9DUkwgKmNybCksCisJaW50ICgqY3JsX2xvb2t1cCkoWDUwOV9DUkwgKmNybCwgWDUwOV9SRVZPS0VEICoqcmV0LAorCQkJCUFTTjFfSU5URUdFUiAqc2VyLCBYNTA5X05BTUUgKmlzc3VlciksCisJaW50ICgqY3JsX3ZlcmlmeSkoWDUwOV9DUkwgKmNybCwgRVZQX1BLRVkgKnBrKSkKKwl7CisJWDUwOV9DUkxfTUVUSE9EICptOworCW0gPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9DUkxfTUVUSE9EKSk7CisJaWYgKCFtKQorCQlyZXR1cm4gTlVMTDsKKwltLT5jcmxfaW5pdCA9IGNybF9pbml0OworCW0tPmNybF9mcmVlID0gY3JsX2ZyZWU7CisJbS0+Y3JsX2xvb2t1cCA9IGNybF9sb29rdXA7CisJbS0+Y3JsX3ZlcmlmeSA9IGNybF92ZXJpZnk7CisJbS0+ZmxhZ3MgPSBYNTA5X0NSTF9NRVRIT0RfRFlOQU1JQzsKKwlyZXR1cm4gbTsKKwl9CisKK3ZvaWQgWDUwOV9DUkxfTUVUSE9EX2ZyZWUoWDUwOV9DUkxfTUVUSE9EICptKQorCXsKKwlpZiAoIShtLT5mbGFncyAmIFg1MDlfQ1JMX01FVEhPRF9EWU5BTUlDKSkKKwkJcmV0dXJuOworCU9QRU5TU0xfZnJlZShtKTsKKwl9CisKK3ZvaWQgWDUwOV9DUkxfc2V0X21ldGhfZGF0YShYNTA5X0NSTCAqY3JsLCB2b2lkICpkYXQpCisJeworCWNybC0+bWV0aF9kYXRhID0gZGF0OworCX0KKwordm9pZCAqWDUwOV9DUkxfZ2V0X21ldGhfZGF0YShYNTA5X0NSTCAqY3JsKQorCXsKKwlyZXR1cm4gY3JsLT5tZXRoX2RhdGE7CisJfQorCitJTVBMRU1FTlRfU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKQorSU1QTEVNRU5UX0FTTjFfU0VUX09GKFg1MDlfUkVWT0tFRCkKK0lNUExFTUVOVF9TVEFDS19PRihYNTA5X0NSTCkKK0lNUExFTUVOVF9BU04xX1NFVF9PRihYNTA5X0NSTCkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfZXh0ZW4uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfZXh0ZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTIxMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9leHRlbi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIHhfZXh0ZW4uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKworQVNOMV9TRVFVRU5DRShYNTA5X0VYVEVOU0lPTikgPSB7CisJQVNOMV9TSU1QTEUoWDUwOV9FWFRFTlNJT04sIG9iamVjdCwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfT1BUKFg1MDlfRVhURU5TSU9OLCBjcml0aWNhbCwgQVNOMV9CT09MRUFOKSwKKwlBU04xX1NJTVBMRShYNTA5X0VYVEVOU0lPTiwgdmFsdWUsIEFTTjFfT0NURVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORChYNTA5X0VYVEVOU0lPTikKKworQVNOMV9JVEVNX1RFTVBMQVRFKFg1MDlfRVhURU5TSU9OUykgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBFeHRlbnNpb24sIFg1MDlfRVhURU5TSU9OKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChYNTA5X0VYVEVOU0lPTlMpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0VYVEVOU0lPTikKK0lNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfZm5hbWUoWDUwOV9FWFRFTlNJT05TLCBYNTA5X0VYVEVOU0lPTlMsIFg1MDlfRVhURU5TSU9OUykKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5X0VYVEVOU0lPTikKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfaW5mby5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0ZjZjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfaW5mby5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiBjcnlwdG8vYXNuMS94X2luZm8uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKK1g1MDlfSU5GTyAqWDUwOV9JTkZPX25ldyh2b2lkKQorCXsKKwlYNTA5X0lORk8gKnJldD1OVUxMOworCisJcmV0PShYNTA5X0lORk8gKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9JTkZPKSk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX1g1MDlfSU5GT19ORVcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKyAKKyAgICAgICAgcmV0LT5lbmNfY2lwaGVyLmNpcGhlcj1OVUxMOworICAgICAgICByZXQtPmVuY19sZW49MDsKKyAgICAgICAgcmV0LT5lbmNfZGF0YT1OVUxMOworIAorCXJldC0+cmVmZXJlbmNlcz0xOworCXJldC0+eDUwOT1OVUxMOworCXJldC0+Y3JsPU5VTEw7CisJcmV0LT54X3BrZXk9TlVMTDsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3ZvaWQgWDUwOV9JTkZPX2ZyZWUoWDUwOV9JTkZPICp4KQorCXsKKwlpbnQgaTsKKworCWlmICh4ID09IE5VTEwpIHJldHVybjsKKworCWk9Q1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywtMSxDUllQVE9fTE9DS19YNTA5X0lORk8pOworI2lmZGVmIFJFRl9QUklOVAorCVJFRl9QUklOVCgiWDUwOV9JTkZPIix4KTsKKyNlbmRpZgorCWlmIChpID4gMCkgcmV0dXJuOworI2lmZGVmIFJFRl9DSEVDSworCWlmIChpIDwgMCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiWDUwOV9JTkZPX2ZyZWUsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQlhYm9ydCgpOworCQl9CisjZW5kaWYKKworCWlmICh4LT54NTA5ICE9IE5VTEwpIFg1MDlfZnJlZSh4LT54NTA5KTsKKwlpZiAoeC0+Y3JsICE9IE5VTEwpIFg1MDlfQ1JMX2ZyZWUoeC0+Y3JsKTsKKwlpZiAoeC0+eF9wa2V5ICE9IE5VTEwpIFg1MDlfUEtFWV9mcmVlKHgtPnhfcGtleSk7CisJaWYgKHgtPmVuY19kYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZSh4LT5lbmNfZGF0YSk7CisJT1BFTlNTTF9mcmVlKHgpOworCX0KKworSU1QTEVNRU5UX1NUQUNLX09GKFg1MDlfSU5GTykKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9sb25nLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X2xvbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTMxNzQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9sb25nLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qIHhfbG9uZy5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKy8qIEN1c3RvbSBwcmltaXRpdmUgdHlwZSBmb3IgbG9uZyBoYW5kbGluZy4gVGhpcyBjb252ZXJ0cyBiZXR3ZWVuIGFuIEFTTjFfSU5URUdFUgorICogYW5kIGEgbG9uZyBkaXJlY3RseS4KKyAqLworCisKK3N0YXRpYyBpbnQgbG9uZ19uZXcoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworc3RhdGljIHZvaWQgbG9uZ19mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKKworc3RhdGljIGludCBsb25nX2kyYyhBU04xX1ZBTFVFICoqcHZhbCwgdW5zaWduZWQgY2hhciAqY29udCwgaW50ICpwdXR5cGUsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworc3RhdGljIGludCBsb25nX2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworc3RhdGljIGludCBsb25nX3ByaW50KEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwgaW50IGluZGVudCwgY29uc3QgQVNOMV9QQ1RYICpwY3R4KTsKKworc3RhdGljIEFTTjFfUFJJTUlUSVZFX0ZVTkNTIGxvbmdfcGYgPSB7CisJTlVMTCwgMCwKKwlsb25nX25ldywKKwlsb25nX2ZyZWUsCisJbG9uZ19mcmVlLAkvKiBDbGVhciBzaG91bGQgc2V0IHRvIGluaXRpYWwgdmFsdWUgKi8KKwlsb25nX2MyaSwKKwlsb25nX2kyYywKKwlsb25nX3ByaW50Cit9OworCitBU04xX0lURU1fc3RhcnQoTE9ORykKKwlBU04xX0lUWVBFX1BSSU1JVElWRSwgVl9BU04xX0lOVEVHRVIsIE5VTEwsIDAsICZsb25nX3BmLCBBU04xX0xPTkdfVU5ERUYsICJMT05HIgorQVNOMV9JVEVNX2VuZChMT05HKQorCitBU04xX0lURU1fc3RhcnQoWkxPTkcpCisJQVNOMV9JVFlQRV9QUklNSVRJVkUsIFZfQVNOMV9JTlRFR0VSLCBOVUxMLCAwLCAmbG9uZ19wZiwgMCwgIlpMT05HIgorQVNOMV9JVEVNX2VuZChaTE9ORykKKworc3RhdGljIGludCBsb25nX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKK3sKKwkqKGxvbmcgKilwdmFsID0gaXQtPnNpemU7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGxvbmdfZnJlZShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCkKK3sKKwkqKGxvbmcgKilwdmFsID0gaXQtPnNpemU7Cit9CisKK3N0YXRpYyBpbnQgbG9uZ19pMmMoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCAqcHV0eXBlLCBjb25zdCBBU04xX0lURU0gKml0KQoreworCWxvbmcgbHRtcDsKKwl1bnNpZ25lZCBsb25nIHV0bXA7CisJaW50IGNsZW4sIHBhZCwgaTsKKwkvKiB0aGlzIGV4aXN0cyB0byBieXBhc3MgYnJva2VuIGdjYyBvcHRpbWl6YXRpb24gKi8KKwljaGFyICpjcCA9IChjaGFyICopcHZhbDsKKworCS8qIHVzZSBtZW1jcHksIGJlY2F1c2Ugd2UgbWF5IG5vdCBiZSBsb25nIGFsaWduZWQgKi8KKwltZW1jcHkoJmx0bXAsIGNwLCBzaXplb2YobG9uZykpOworCisJaWYobHRtcCA9PSBpdC0+c2l6ZSkgcmV0dXJuIC0xOworCS8qIENvbnZlcnQgdGhlIGxvbmcgdG8gcG9zaXRpdmU6IHdlIHN1YnRyYWN0IG9uZSBpZiBuZWdhdGl2ZSBzbworCSAqIHdlIGNhbiBjbGVhbmx5IGhhbmRsZSB0aGUgcGFkZGluZyBpZiBvbmx5IHRoZSBNU0Igb2YgdGhlIGxlYWRpbmcKKwkgKiBvY3RldCBpcyBzZXQuIAorCSAqLworCWlmKGx0bXAgPCAwKSB1dG1wID0gLWx0bXAgLSAxOworCWVsc2UgdXRtcCA9IGx0bXA7CisJY2xlbiA9IEJOX251bV9iaXRzX3dvcmQodXRtcCk7CisJLyogSWYgTVNCIG9mIGxlYWRpbmcgb2N0ZXQgc2V0IHdlIG5lZWQgdG8gcGFkICovCisJaWYoIShjbGVuICYgMHg3KSkgcGFkID0gMTsKKwllbHNlIHBhZCA9IDA7CisKKwkvKiBDb252ZXJ0IG51bWJlciBvZiBiaXRzIHRvIG51bWJlciBvZiBvY3RldHMgKi8KKwljbGVuID0gKGNsZW4gKyA3KSA+PiAzOworCisJaWYoY29udCkgeworCQlpZihwYWQpICpjb250KysgPSAobHRtcCA8IDApID8gMHhmZiA6IDA7CisJCWZvcihpID0gY2xlbiAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQljb250W2ldID0gKHVuc2lnbmVkIGNoYXIpKHV0bXAgJiAweGZmKTsKKwkJCWlmKGx0bXAgPCAwKSBjb250W2ldIF49IDB4ZmY7CisJCQl1dG1wID4+PSA4OworCQl9CisJfQorCXJldHVybiBjbGVuICsgcGFkOworfQorCitzdGF0aWMgaW50IGxvbmdfYzJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICpjb250LCBpbnQgbGVuLAorCQkgICAgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCit7CisJaW50IG5lZywgaTsKKwlsb25nIGx0bXA7CisJdW5zaWduZWQgbG9uZyB1dG1wID0gMDsKKwljaGFyICpjcCA9IChjaGFyICopcHZhbDsKKwlpZihsZW4gPiAoaW50KXNpemVvZihsb25nKSkgeworCQlBU04xZXJyKEFTTjFfRl9MT05HX0MySSwgQVNOMV9SX0lOVEVHRVJfVE9PX0xBUkdFX0ZPUl9MT05HKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIElzIGl0IG5lZ2F0aXZlPyAqLworCWlmKGxlbiAmJiAoY29udFswXSAmIDB4ODApKSBuZWcgPSAxOworCWVsc2UgbmVnID0gMDsKKwl1dG1wID0gMDsKKwlmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl1dG1wIDw8PSA4OworCQlpZihuZWcpIHV0bXAgfD0gY29udFtpXSBeIDB4ZmY7CisJCWVsc2UgdXRtcCB8PSBjb250W2ldOworCX0KKwlsdG1wID0gKGxvbmcpdXRtcDsKKwlpZihuZWcpIHsKKwkJbHRtcCsrOworCQlsdG1wID0gLWx0bXA7CisJfQorCWlmKGx0bXAgPT0gaXQtPnNpemUpIHsKKwkJQVNOMWVycihBU04xX0ZfTE9OR19DMkksIEFTTjFfUl9JTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9ORyk7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkoY3AsICZsdG1wLCBzaXplb2YobG9uZykpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGxvbmdfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJaW50IGluZGVudCwgY29uc3QgQVNOMV9QQ1RYICpwY3R4KQorCXsKKwlyZXR1cm4gQklPX3ByaW50ZihvdXQsICIlbGRcbiIsICoobG9uZyAqKXB2YWwpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfbmFtZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhNDQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfbmFtZS5jCkBAIC0wLDAgKzEsNTE3IEBACisvKiBjcnlwdG8vYXNuMS94X25hbWUuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgImFzbjFfbG9jbC5oIgorCit0eXBlZGVmIFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZOworREVDTEFSRV9TVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpCisKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2V4X2QyaShBU04xX1ZBTFVFICoqdmFsLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzLCBjaGFyIG9wdCwgQVNOMV9UTEMgKmN0eCk7CisKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2V4X2kyZChBU04xX1ZBTFVFICoqdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LAorCQkJCWNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCB0YWcsIGludCBhY2xhc3MpOworc3RhdGljIGludCB4NTA5X25hbWVfZXhfbmV3KEFTTjFfVkFMVUUgKip2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworc3RhdGljIHZvaWQgeDUwOV9uYW1lX2V4X2ZyZWUoQVNOMV9WQUxVRSAqKnZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2VuY29kZShYNTA5X05BTUUgKmEpOworc3RhdGljIGludCB4NTA5X25hbWVfY2Fub24oWDUwOV9OQU1FICphKTsKK3N0YXRpYyBpbnQgYXNuMV9zdHJpbmdfY2Fub24oQVNOMV9TVFJJTkcgKm91dCwgQVNOMV9TVFJJTkcgKmluKTsKK3N0YXRpYyBpbnQgaTJkX25hbWVfY2Fub24oU1RBQ0tfT0YoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZKSAqaW50bmFtZSwKKwkJCSAgdW5zaWduZWQgY2hhciAqKmluKTsKKworCitzdGF0aWMgaW50IHg1MDlfbmFtZV9leF9wcmludChCSU8gKm91dCwgQVNOMV9WQUxVRSAqKnB2YWwsCisJCQkJCQlpbnQgaW5kZW50LAorCQkJCQkJY29uc3QgY2hhciAqZm5hbWUsIAorCQkJCQkJY29uc3QgQVNOMV9QQ1RYICpwY3R4KTsKKworQVNOMV9TRVFVRU5DRShYNTA5X05BTUVfRU5UUlkpID0geworCUFTTjFfU0lNUExFKFg1MDlfTkFNRV9FTlRSWSwgb2JqZWN0LCBBU04xX09CSkVDVCksCisJQVNOMV9TSU1QTEUoWDUwOV9OQU1FX0VOVFJZLCB2YWx1ZSwgQVNOMV9QUklOVEFCTEUpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfTkFNRV9FTlRSWSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFg1MDlfTkFNRV9FTlRSWSkKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5X05BTUVfRU5UUlkpCisKKy8qIEZvciB0aGUgIk5hbWUiIHR5cGUgd2UgbmVlZCBhIFNFUVVFTkNFIE9GIHsgU0VUIE9GIFg1MDlfTkFNRV9FTlRSWSB9CisgKiBzbyBkZWNsYXJlIHR3byB0ZW1wbGF0ZSB3cmFwcGVycyBmb3IgdGhpcworICovCisKK0FTTjFfSVRFTV9URU1QTEFURShYNTA5X05BTUVfRU5UUklFUykgPQorCUFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VUX09GLCAwLCBSRE5TLCBYNTA5X05BTUVfRU5UUlkpCitBU04xX0lURU1fVEVNUExBVEVfRU5EKFg1MDlfTkFNRV9FTlRSSUVTKQorCitBU04xX0lURU1fVEVNUExBVEUoWDUwOV9OQU1FX0lOVEVSTkFMKSA9CisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRiwgMCwgTmFtZSwgWDUwOV9OQU1FX0VOVFJJRVMpCitBU04xX0lURU1fVEVNUExBVEVfRU5EKFg1MDlfTkFNRV9JTlRFUk5BTCkKKworLyogTm9ybWFsbHkgdGhhdCdzIHdoZXJlIGl0IHdvdWxkIGVuZDogd2UnZCBoYXZlIHR3byBuZXN0ZWQgU1RBQ0sgc3RydWN0dXJlcworICogcmVwcmVzZW50aW5nIHRoZSBBU04xLiBVbmZvcnR1bmF0ZWx5IFg1MDlfTkFNRSB1c2VzIGEgY29tcGxldGVseSBkaWZmZXJlbnQKKyAqIGZvcm0gYW5kIGNhY2hlcyBlbmNvZGluZ3Mgc28gd2UgaGF2ZSB0byBwcm9jZXNzIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCBjb252ZXJ0CisgKiB0byB0aGUgZXh0ZXJuYWwgZm9ybS4KKyAqLworCitjb25zdCBBU04xX0VYVEVSTl9GVU5DUyB4NTA5X25hbWVfZmYgPSB7CisJTlVMTCwKKwl4NTA5X25hbWVfZXhfbmV3LAorCXg1MDlfbmFtZV9leF9mcmVlLAorCTAsCS8qIERlZmF1bHQgY2xlYXIgYmVoYXZpb3VyIGlzIE9LICovCisJeDUwOV9uYW1lX2V4X2QyaSwKKwl4NTA5X25hbWVfZXhfaTJkLAorCXg1MDlfbmFtZV9leF9wcmludAorfTsKKworSU1QTEVNRU5UX0VYVEVSTl9BU04xKFg1MDlfTkFNRSwgVl9BU04xX1NFUVVFTkNFLCB4NTA5X25hbWVfZmYpIAorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9OQU1FKQorSU1QTEVNRU5UX0FTTjFfRFVQX0ZVTkNUSU9OKFg1MDlfTkFNRSkKKworc3RhdGljIGludCB4NTA5X25hbWVfZXhfbmV3KEFTTjFfVkFMVUUgKip2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpCit7CisJWDUwOV9OQU1FICpyZXQgPSBOVUxMOworCXJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X05BTUUpKTsKKwlpZighcmV0KSBnb3RvIG1lbWVycjsKKwlpZiAoKHJldC0+ZW50cmllcz1za19YNTA5X05BTUVfRU5UUllfbmV3X251bGwoKSkgPT0gTlVMTCkKKwkJZ290byBtZW1lcnI7CisJaWYoKHJldC0+Ynl0ZXMgPSBCVUZfTUVNX25ldygpKSA9PSBOVUxMKSBnb3RvIG1lbWVycjsKKwlyZXQtPmNhbm9uX2VuYyA9IE5VTEw7CisJcmV0LT5jYW5vbl9lbmNsZW4gPSAwOworCXJldC0+bW9kaWZpZWQ9MTsKKwkqdmFsID0gKEFTTjFfVkFMVUUgKilyZXQ7CisJcmV0dXJuIDE7CisKKyBtZW1lcnI6CisJQVNOMWVycihBU04xX0ZfWDUwOV9OQU1FX0VYX05FVywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCWlmIChyZXQpCisJCXsKKwkJaWYgKHJldC0+ZW50cmllcykKKwkJCXNrX1g1MDlfTkFNRV9FTlRSWV9mcmVlKHJldC0+ZW50cmllcyk7CisJCU9QRU5TU0xfZnJlZShyZXQpOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHg1MDlfbmFtZV9leF9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KQoreworCVg1MDlfTkFNRSAqYTsKKwlpZighcHZhbCB8fCAhKnB2YWwpCisJICAgIHJldHVybjsKKwlhID0gKFg1MDlfTkFNRSAqKSpwdmFsOworCisJQlVGX01FTV9mcmVlKGEtPmJ5dGVzKTsKKwlza19YNTA5X05BTUVfRU5UUllfcG9wX2ZyZWUoYS0+ZW50cmllcyxYNTA5X05BTUVfRU5UUllfZnJlZSk7CisJaWYgKGEtPmNhbm9uX2VuYykKKwkJT1BFTlNTTF9mcmVlKGEtPmNhbm9uX2VuYyk7CisJT1BFTlNTTF9mcmVlKGEpOworCSpwdmFsID0gTlVMTDsKK30KKworc3RhdGljIGludCB4NTA5X25hbWVfZXhfZDJpKEFTTjFfVkFMVUUgKip2YWwsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCWludCB0YWcsIGludCBhY2xhc3MsIGNoYXIgb3B0LCBBU04xX1RMQyAqY3R4KQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAqaW4sICpxOworCXVuaW9uIHsgU1RBQ0tfT0YoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZKSAqczsKKwkJQVNOMV9WQUxVRSAqYTsgfSBpbnRuYW1lID0ge05VTEx9OworCXVuaW9uIHsgWDUwOV9OQU1FICp4OyBBU04xX1ZBTFVFICphOyB9IG5tID0ge05VTEx9OworCWludCBpLCBqLCByZXQ7CisJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqZW50cmllczsKKwlYNTA5X05BTUVfRU5UUlkgKmVudHJ5OworCXEgPSBwOworCisJLyogR2V0IGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIE5hbWUgKi8KKwlyZXQgPSBBU04xX2l0ZW1fZXhfZDJpKCZpbnRuYW1lLmEsCisJCQkgICAgICAgJnAsIGxlbiwgQVNOMV9JVEVNX3JwdHIoWDUwOV9OQU1FX0lOVEVSTkFMKSwKKwkJCSAgICAgICB0YWcsIGFjbGFzcywgb3B0LCBjdHgpOworCQorCWlmKHJldCA8PSAwKSByZXR1cm4gcmV0OworCisJaWYoKnZhbCkgeDUwOV9uYW1lX2V4X2ZyZWUodmFsLCBOVUxMKTsKKwlpZigheDUwOV9uYW1lX2V4X25ldygmbm0uYSwgTlVMTCkpIGdvdG8gZXJyOworCS8qIFdlJ3ZlIGRlY29kZWQgaXQ6IG5vdyBjYWNoZSBlbmNvZGluZyAqLworCWlmKCFCVUZfTUVNX2dyb3cobm0ueC0+Ynl0ZXMsIHAgLSBxKSkgZ290byBlcnI7CisJbWVtY3B5KG5tLngtPmJ5dGVzLT5kYXRhLCBxLCBwIC0gcSk7CisKKwkvKiBDb252ZXJ0IGludGVybmFsIHJlcHJlc2VudGF0aW9uIHRvIFg1MDlfTkFNRSBzdHJ1Y3R1cmUgKi8KKwlmb3IoaSA9IDA7IGkgPCBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfbnVtKGludG5hbWUucyk7IGkrKykgeworCQllbnRyaWVzID0gc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKGludG5hbWUucywgaSk7CisJCWZvcihqID0gMDsgaiA8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0oZW50cmllcyk7IGorKykgeworCQkJZW50cnkgPSBza19YNTA5X05BTUVfRU5UUllfdmFsdWUoZW50cmllcywgaik7CisJCQllbnRyeS0+c2V0ID0gaTsKKwkJCWlmKCFza19YNTA5X05BTUVfRU5UUllfcHVzaChubS54LT5lbnRyaWVzLCBlbnRyeSkpCisJCQkJZ290byBlcnI7CisJCX0KKwkJc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUoZW50cmllcyk7CisJfQorCXNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9mcmVlKGludG5hbWUucyk7CisJcmV0ID0geDUwOV9uYW1lX2Nhbm9uKG5tLngpOworCWlmICghcmV0KQorCQlnb3RvIGVycjsKKwlubS54LT5tb2RpZmllZCA9IDA7CisJKnZhbCA9IG5tLmE7CisJKmluID0gcDsKKwlyZXR1cm4gcmV0OworCWVycjoKKwlBU04xZXJyKEFTTjFfRl9YNTA5X05BTUVfRVhfRDJJLCBFUlJfUl9ORVNURURfQVNOMV9FUlJPUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2V4X2kyZChBU04xX1ZBTFVFICoqdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0LCBpbnQgdGFnLCBpbnQgYWNsYXNzKQoreworCWludCByZXQ7CisJWDUwOV9OQU1FICphID0gKFg1MDlfTkFNRSAqKSp2YWw7CisJaWYoYS0+bW9kaWZpZWQpIHsKKwkJcmV0ID0geDUwOV9uYW1lX2VuY29kZShhKTsKKwkJaWYocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHg1MDlfbmFtZV9jYW5vbihhKTsKKwkJaWYocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGEtPmJ5dGVzLT5sZW5ndGg7CisJaWYob3V0ICE9IE5VTEwpIHsKKwkJbWVtY3B5KCpvdXQsYS0+Ynl0ZXMtPmRhdGEscmV0KTsKKwkJKm91dCs9cmV0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBsb2NhbF9za19YNTA5X05BTUVfRU5UUllfZnJlZShTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICpuZSkKKwl7CisJc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUobmUpOworCX0KKworc3RhdGljIHZvaWQgbG9jYWxfc2tfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKFNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKm5lKQorCXsKKwlza19YNTA5X05BTUVfRU5UUllfcG9wX2ZyZWUobmUsIFg1MDlfTkFNRV9FTlRSWV9mcmVlKTsKKwl9CisKK3N0YXRpYyBpbnQgeDUwOV9uYW1lX2VuY29kZShYNTA5X05BTUUgKmEpCit7CisJdW5pb24geyBTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICpzOworCQlBU04xX1ZBTFVFICphOyB9IGludG5hbWUgPSB7TlVMTH07CisJaW50IGxlbjsKKwl1bnNpZ25lZCBjaGFyICpwOworCVNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKmVudHJpZXMgPSBOVUxMOworCVg1MDlfTkFNRV9FTlRSWSAqZW50cnk7CisJaW50IGksIHNldCA9IC0xOworCWludG5hbWUucyA9IHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9uZXdfbnVsbCgpOworCWlmKCFpbnRuYW1lLnMpIGdvdG8gbWVtZXJyOworCWZvcihpID0gMDsgaSA8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0oYS0+ZW50cmllcyk7IGkrKykgeworCQllbnRyeSA9IHNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShhLT5lbnRyaWVzLCBpKTsKKwkJaWYoZW50cnktPnNldCAhPSBzZXQpIHsKKwkJCWVudHJpZXMgPSBza19YNTA5X05BTUVfRU5UUllfbmV3X251bGwoKTsKKwkJCWlmKCFlbnRyaWVzKSBnb3RvIG1lbWVycjsKKwkJCWlmKCFza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfcHVzaChpbnRuYW1lLnMsCisJCQkJCQkJICAgICBlbnRyaWVzKSkKKwkJCQlnb3RvIG1lbWVycjsKKwkJCXNldCA9IGVudHJ5LT5zZXQ7CisJCX0KKwkJaWYoIXNrX1g1MDlfTkFNRV9FTlRSWV9wdXNoKGVudHJpZXMsIGVudHJ5KSkgZ290byBtZW1lcnI7CisJfQorCWxlbiA9IEFTTjFfaXRlbV9leF9pMmQoJmludG5hbWUuYSwgTlVMTCwKKwkJCSAgICAgICBBU04xX0lURU1fcnB0cihYNTA5X05BTUVfSU5URVJOQUwpLCAtMSwgLTEpOworCWlmICghQlVGX01FTV9ncm93KGEtPmJ5dGVzLGxlbikpIGdvdG8gbWVtZXJyOworCXA9KHVuc2lnbmVkIGNoYXIgKilhLT5ieXRlcy0+ZGF0YTsKKwlBU04xX2l0ZW1fZXhfaTJkKCZpbnRuYW1lLmEsCisJCQkgJnAsIEFTTjFfSVRFTV9ycHRyKFg1MDlfTkFNRV9JTlRFUk5BTCksIC0xLCAtMSk7CisJc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKGludG5hbWUucywKKwkJCQkJICAgICBsb2NhbF9za19YNTA5X05BTUVfRU5UUllfZnJlZSk7CisJYS0+bW9kaWZpZWQgPSAwOworCXJldHVybiBsZW47CittZW1lcnI6CisJc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKGludG5hbWUucywKKwkJCQkJICAgICBsb2NhbF9za19YNTA5X05BTUVfRU5UUllfZnJlZSk7CisJQVNOMWVycihBU04xX0ZfWDUwOV9OQU1FX0VOQ09ERSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB4NTA5X25hbWVfZXhfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipwdmFsLAorCQkJCQkJaW50IGluZGVudCwKKwkJCQkJCWNvbnN0IGNoYXIgKmZuYW1lLCAKKwkJCQkJCWNvbnN0IEFTTjFfUENUWCAqcGN0eCkKKwl7CisJaWYgKFg1MDlfTkFNRV9wcmludF9leChvdXQsIChYNTA5X05BTUUgKikqcHZhbCwKKwkJCQkJaW5kZW50LCBwY3R4LT5ubV9mbGFncykgPD0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDI7CisJfQorCisvKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyB0aGUgY2Fub25pY2FsIGVuY29kaW5nIG9mIHRoZSBOYW1lIHN0cnVjdHVyZS4KKyAqIEluIGl0IGFsbCBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdG8gVVRGOCwgbGVhZGluZywgdHJhaWxpbmcgYW5kCisgKiBtdWx0aXBsZSBzcGFjZXMgY29sbGFwc2VkLCBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBhbmQgdGhlIGxlYWRpbmcKKyAqIFNFUVVFTkNFIGhlYWRlciByZW1vdmVkLgorICoKKyAqIEluIGZ1dHVyZSB3ZSBjb3VsZCBhbHNvIG5vcm1hbGl6ZSB0aGUgVVRGOCB0b28uCisgKgorICogQnkgZG9pbmcgdGhpcyBjb21wYXJpc29uIG9mIE5hbWUgc3RydWN0dXJlcyBjYW4gYmUgcmFwaWRseQorICogcGVyZm9tZWQgYnkganVzdCB1c2luZyBtZW1jbXAoKSBvZiB0aGUgY2Fub25pY2FsIGVuY29kaW5nLgorICogQnkgb21pdHRpbmcgdGhlIGxlYWRpbmcgU0VRVUVOQ0UgbmFtZSBjb25zdHJhaW50cyBvZiB0eXBlCisgKiBkaXJOYW1lIGNhbiBhbHNvIGJlIGNoZWNrZWQgd2l0aCBhIHNpbXBsZSBtZW1jbXAoKS4KKyAqLworCitzdGF0aWMgaW50IHg1MDlfbmFtZV9jYW5vbihYNTA5X05BTUUgKmEpCisJeworCXVuc2lnbmVkIGNoYXIgKnA7CisJU1RBQ0tfT0YoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZKSAqaW50bmFtZSA9IE5VTEw7CisJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqZW50cmllcyA9IE5VTEw7CisJWDUwOV9OQU1FX0VOVFJZICplbnRyeSwgKnRtcGVudHJ5ID0gTlVMTDsKKwlpbnQgaSwgc2V0ID0gLTEsIHJldCA9IDA7CisKKwlpZiAoYS0+Y2Fub25fZW5jKQorCQl7CisJCU9QRU5TU0xfZnJlZShhLT5jYW5vbl9lbmMpOworCQlhLT5jYW5vbl9lbmMgPSBOVUxMOworCQl9CisJLyogU3BlY2lhbCBjYXNlOiBlbXB0eSBYNTA5X05BTUUgPT4gbnVsbCBlbmNvZGluZyAqLworCWlmIChza19YNTA5X05BTUVfRU5UUllfbnVtKGEtPmVudHJpZXMpID09IDApCisJCXsKKwkJYS0+Y2Fub25fZW5jbGVuID0gMDsKKwkJcmV0dXJuIDE7CisJCX0KKwlpbnRuYW1lID0gc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX25ld19udWxsKCk7CisJaWYoIWludG5hbWUpCisJCWdvdG8gZXJyOworCWZvcihpID0gMDsgaSA8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0oYS0+ZW50cmllcyk7IGkrKykKKwkJeworCQllbnRyeSA9IHNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShhLT5lbnRyaWVzLCBpKTsKKwkJaWYoZW50cnktPnNldCAhPSBzZXQpCisJCQl7CisJCQllbnRyaWVzID0gc2tfWDUwOV9OQU1FX0VOVFJZX25ld19udWxsKCk7CisJCQlpZighZW50cmllcykKKwkJCQlnb3RvIGVycjsKKwkJCWlmKCFza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfcHVzaChpbnRuYW1lLCBlbnRyaWVzKSkKKwkJCQlnb3RvIGVycjsKKwkJCXNldCA9IGVudHJ5LT5zZXQ7CisJCQl9CisJCXRtcGVudHJ5ID0gWDUwOV9OQU1FX0VOVFJZX25ldygpOworCQl0bXBlbnRyeS0+b2JqZWN0ID0gT0JKX2R1cChlbnRyeS0+b2JqZWN0KTsKKwkJaWYgKCFhc24xX3N0cmluZ19jYW5vbih0bXBlbnRyeS0+dmFsdWUsIGVudHJ5LT52YWx1ZSkpCisJCQlnb3RvIGVycjsKKwkJaWYoIXNrX1g1MDlfTkFNRV9FTlRSWV9wdXNoKGVudHJpZXMsIHRtcGVudHJ5KSkKKwkJCWdvdG8gZXJyOworCQl0bXBlbnRyeSA9IE5VTEw7CisJCX0KKworCS8qIEZpbmFsbHkgZ2VuZXJhdGUgZW5jb2RpbmcgKi8KKworCWEtPmNhbm9uX2VuY2xlbiA9IGkyZF9uYW1lX2Nhbm9uKGludG5hbWUsIE5VTEwpOworCisJcCA9IE9QRU5TU0xfbWFsbG9jKGEtPmNhbm9uX2VuY2xlbik7CisKKwlpZiAoIXApCisJCWdvdG8gZXJyOworCisJYS0+Y2Fub25fZW5jID0gcDsKKworCWkyZF9uYW1lX2Nhbm9uKGludG5hbWUsICZwKTsKKworCXJldCA9IDE7CisKKwllcnI6CisKKwlpZiAodG1wZW50cnkpCisJCVg1MDlfTkFNRV9FTlRSWV9mcmVlKHRtcGVudHJ5KTsKKwlpZiAoaW50bmFtZSkKKwkJc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKGludG5hbWUsCisJCQkJCWxvY2FsX3NrX1g1MDlfTkFNRV9FTlRSWV9wb3BfZnJlZSk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIEJpdG1hcCBvZiBhbGwgdGhlIHR5cGVzIG9mIHN0cmluZyB0aGF0IHdpbGwgYmUgY2Fub25pY2FsaXplZC4gKi8KKworI2RlZmluZSBBU04xX01BU0tfQ0FOT04JXAorCShCX0FTTjFfVVRGOFNUUklORyB8IEJfQVNOMV9CTVBTVFJJTkcgfCBCX0FTTjFfVU5JVkVSU0FMU1RSSU5HIFwKKwl8IEJfQVNOMV9QUklOVEFCTEVTVFJJTkcgfCBCX0FTTjFfVDYxU1RSSU5HIHwgQl9BU04xX0lBNVNUUklORyBcCisJfCBCX0FTTjFfVklTSUJMRVNUUklORykKKwkKKworc3RhdGljIGludCBhc24xX3N0cmluZ19jYW5vbihBU04xX1NUUklORyAqb3V0LCBBU04xX1NUUklORyAqaW4pCisJeworCXVuc2lnbmVkIGNoYXIgKnRvLCAqZnJvbTsKKwlpbnQgbGVuLCBpOworCisJLyogSWYgdHlwZSBub3QgaW4gYml0bWFzayBqdXN0IGNvcHkgc3RyaW5nIGFjcm9zcyAqLworCWlmICghKEFTTjFfdGFnMmJpdChpbi0+dHlwZSkgJiBBU04xX01BU0tfQ0FOT04pKQorCQl7CisJCW91dC0+dHlwZSA9IGluLT50eXBlOworCQlpZiAoIUFTTjFfU1RSSU5HX3NldChvdXQsIGluLT5kYXRhLCBpbi0+bGVuZ3RoKSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gMTsKKwkJfQorCisJb3V0LT50eXBlID0gVl9BU04xX1VURjhTVFJJTkc7CisJb3V0LT5sZW5ndGggPSBBU04xX1NUUklOR190b19VVEY4KCZvdXQtPmRhdGEsIGluKTsKKwlpZiAob3V0LT5sZW5ndGggPT0gLTEpCisJCXJldHVybiAwOworCisJdG8gPSBvdXQtPmRhdGE7CisJZnJvbSA9IHRvOworCisJbGVuID0gb3V0LT5sZW5ndGg7CisKKwkvKiBDb252ZXJ0IHN0cmluZyBpbiBwbGFjZSB0byBjYW5vbmljYWwgZm9ybS4KKwkgKiBVbHRpbWF0ZWx5IHdlIG1heSBuZWVkIHRvIGhhbmRsZSBhIHdpZGVyIHJhbmdlIG9mIGNoYXJhY3RlcnMKKwkgKiBidXQgZm9yIG5vdyBpZ25vcmUgYW55dGhpbmcgd2l0aCBNU0Igc2V0IGFuZCByZWx5IG9uIHRoZQorCSAqIGlzc3BhY2UoKSBhbmQgdG9sb3dlcigpIGZ1bmN0aW9ucy4KKwkgKi8KKworCS8qIElnbm9yZSBsZWFkaW5nIHNwYWNlcyAqLworCXdoaWxlKChsZW4gPiAwKSAmJiAhKCpmcm9tICYgMHg4MCkgJiYgaXNzcGFjZSgqZnJvbSkpCisJCXsKKwkJZnJvbSsrOworCQlsZW4tLTsKKwkJfQorCisJdG8gPSBmcm9tICsgbGVuIC0gMTsKKworCS8qIElnbm9yZSB0cmFpbGluZyBzcGFjZXMgKi8KKwl3aGlsZSAoKGxlbiA+IDApICYmICEoKnRvICYgMHg4MCkgJiYgaXNzcGFjZSgqdG8pKQorCQl7CisJCXRvLS07CisJCWxlbi0tOworCQl9CisKKwl0byA9IG91dC0+ZGF0YTsKKworCWkgPSAwOworCXdoaWxlKGkgPCBsZW4pCisJCXsKKwkJLyogSWYgTVNCIHNldCBqdXN0IGNvcHkgYWNyb3NzICovCisJCWlmICgqZnJvbSAmIDB4ODApCisJCQl7CisJCQkqdG8rKyA9ICpmcm9tKys7CisJCQlpKys7CisJCQl9CisJCS8qIENvbGxhcHNlIG11bHRpcGxlIHNwYWNlcyAqLworCQllbHNlIGlmIChpc3NwYWNlKCpmcm9tKSkKKwkJCXsKKwkJCS8qIENvcHkgb25lIHNwYWNlIGFjcm9zcyAqLworCQkJKnRvKysgPSAnICc7CisJCQkvKiBJZ25vcmUgc3Vic2VxdWVudCBzcGFjZXMuIE5vdGU6IGRvbid0IG5lZWQgdG8KKwkJCSAqIGNoZWNrIGxlbiBoZXJlIGJlY2F1c2Ugd2Uga25vdyB0aGUgbGFzdCAKKwkJCSAqIGNoYXJhY3RlciBpcyBhIG5vbi1zcGFjZSBzbyB3ZSBjYW4ndCBvdmVyZmxvdy4KKwkJCSAqLworCQkJZG8KKwkJCQl7CisJCQkJZnJvbSsrOworCQkJCWkrKzsKKwkJCQl9CisJCQl3aGlsZSghKCpmcm9tICYgMHg4MCkgJiYgaXNzcGFjZSgqZnJvbSkpOworCQkJfQorCQllbHNlCisJCQl7CisJCQkqdG8rKyA9IHRvbG93ZXIoKmZyb20rKyk7CisJCQlpKys7CisJCQl9CisJCX0KKworCW91dC0+bGVuZ3RoID0gdG8gLSBvdXQtPmRhdGE7CisKKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIGludCBpMmRfbmFtZV9jYW5vbihTVEFDS19PRihTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpICpfaW50bmFtZSwKKwkJCSAgdW5zaWduZWQgY2hhciAqKmluKQorCXsKKwlpbnQgaSwgbGVuLCBsdG1wOworCUFTTjFfVkFMVUUgKnY7CisJU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKmludG5hbWUgPSAoU1RBQ0tfT0YoQVNOMV9WQUxVRSkgKilfaW50bmFtZTsKKworCWxlbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IHNrX0FTTjFfVkFMVUVfbnVtKGludG5hbWUpOyBpKyspCisJCXsKKwkJdiA9IHNrX0FTTjFfVkFMVUVfdmFsdWUoaW50bmFtZSwgaSk7CisJCWx0bXAgPSBBU04xX2l0ZW1fZXhfaTJkKCZ2LCBpbiwKKwkJCUFTTjFfSVRFTV9ycHRyKFg1MDlfTkFNRV9FTlRSSUVTKSwgLTEsIC0xKTsKKwkJaWYgKGx0bXAgPCAwKQorCQkJcmV0dXJuIGx0bXA7CisJCWxlbiArPSBsdG1wOworCQl9CisJcmV0dXJuIGxlbjsKKwl9CisKK2ludCBYNTA5X05BTUVfc2V0KFg1MDlfTkFNRSAqKnhuLCBYNTA5X05BTUUgKm5hbWUpCisJeworCVg1MDlfTkFNRSAqaW47CisKKwlpZiAoIXhuIHx8ICFuYW1lKSByZXR1cm4oMCk7CisKKwlpZiAoKnhuICE9IG5hbWUpCisJCXsKKwkJaW49WDUwOV9OQU1FX2R1cChuYW1lKTsKKwkJaWYgKGluICE9IE5VTEwpCisJCQl7CisJCQlYNTA5X05BTUVfZnJlZSgqeG4pOworCQkJKnhuPWluOworCQkJfQorCQl9CisJcmV0dXJuKCp4biAhPSBOVUxMKTsKKwl9CisJCitJTVBMRU1FTlRfU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKQorSU1QTEVNRU5UX0FTTjFfU0VUX09GKFg1MDlfTkFNRV9FTlRSWSkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfbng1MDkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfbng1MDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQ5YTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9ueDUwOS5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIHhfbng1MDkuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDUuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKworLyogT2xkIG5ldHNjYXBlIGNlcnRpZmljYXRlIHdyYXBwZXIgZm9ybWF0ICovCisKK0FTTjFfU0VRVUVOQ0UoTkVUU0NBUEVfWDUwOSkgPSB7CisJQVNOMV9TSU1QTEUoTkVUU0NBUEVfWDUwOSwgaGVhZGVyLCBBU04xX09DVEVUX1NUUklORyksCisJQVNOMV9PUFQoTkVUU0NBUEVfWDUwOSwgY2VydCwgWDUwOSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoTkVUU0NBUEVfWDUwOSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKE5FVFNDQVBFX1g1MDkpCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfcGtleS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9wa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1MzYxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfcGtleS5jCkBAIC0wLDAgKzEsMTUxIEBACisvKiBjcnlwdG8vYXNuMS94X3BrZXkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xX21hYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisvKiBuZWVkIHRvIGltcGxlbWVudCAqLworaW50IGkyZF9YNTA5X1BLRVkoWDUwOV9QS0VZICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCXJldHVybigwKTsKKwl9CisKK1g1MDlfUEtFWSAqZDJpX1g1MDlfUEtFWShYNTA5X1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoKQorCXsKKwlpbnQgaTsKKwlNX0FTTjFfRDJJX3ZhcnMoYSxYNTA5X1BLRVkgKixYNTA5X1BLRVlfbmV3KTsKKworCU1fQVNOMV9EMklfSW5pdCgpOworCU1fQVNOMV9EMklfc3RhcnRfc2VxdWVuY2UoKTsKKwlNX0FTTjFfRDJJX2dldF94KFg1MDlfQUxHT1IscmV0LT5lbmNfYWxnb3IsZDJpX1g1MDlfQUxHT1IpOworCU1fQVNOMV9EMklfZ2V0X3goQVNOMV9PQ1RFVF9TVFJJTkcscmV0LT5lbmNfcGtleSxkMmlfQVNOMV9PQ1RFVF9TVFJJTkcpOworCisJcmV0LT5jaXBoZXIuY2lwaGVyPUVWUF9nZXRfY2lwaGVyYnluYW1lKAorCQlPQkpfbmlkMmxuKE9CSl9vYmoybmlkKHJldC0+ZW5jX2FsZ29yLT5hbGdvcml0aG0pKSk7CisJaWYgKHJldC0+Y2lwaGVyLmNpcGhlciA9PSBOVUxMKQorCQl7CisJCWMuZXJyb3I9QVNOMV9SX1VOU1VQUE9SVEVEX0NJUEhFUjsKKwkJYy5saW5lPV9fTElORV9fOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChyZXQtPmVuY19hbGdvci0+cGFyYW1ldGVyLT50eXBlID09IFZfQVNOMV9PQ1RFVF9TVFJJTkcpIAorCQl7CisJCWk9cmV0LT5lbmNfYWxnb3ItPnBhcmFtZXRlci0+dmFsdWUub2N0ZXRfc3RyaW5nLT5sZW5ndGg7CisJCWlmIChpID4gRVZQX01BWF9JVl9MRU5HVEgpCisJCQl7CisJCQljLmVycm9yPUFTTjFfUl9JVl9UT09fTEFSR0U7CisJCQljLmxpbmU9X19MSU5FX187CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJbWVtY3B5KHJldC0+Y2lwaGVyLml2LAorCQkJcmV0LT5lbmNfYWxnb3ItPnBhcmFtZXRlci0+dmFsdWUub2N0ZXRfc3RyaW5nLT5kYXRhLGkpOworCQl9CisJZWxzZQorCQltZW1zZXQocmV0LT5jaXBoZXIuaXYsMCxFVlBfTUFYX0lWX0xFTkdUSCk7CisJTV9BU04xX0QySV9GaW5pc2goYSxYNTA5X1BLRVlfZnJlZSxBU04xX0ZfRDJJX1g1MDlfUEtFWSk7CisJfQorCitYNTA5X1BLRVkgKlg1MDlfUEtFWV9uZXcodm9pZCkKKwl7CisJWDUwOV9QS0VZICpyZXQ9TlVMTDsKKwlBU04xX0NUWCBjOworCisJTV9BU04xX05ld19NYWxsb2MocmV0LFg1MDlfUEtFWSk7CisJcmV0LT52ZXJzaW9uPTA7CisJTV9BU04xX05ldyhyZXQtPmVuY19hbGdvcixYNTA5X0FMR09SX25ldyk7CisJTV9BU04xX05ldyhyZXQtPmVuY19wa2V5LE1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KTsKKwlyZXQtPmRlY19wa2V5PU5VTEw7CisJcmV0LT5rZXlfbGVuZ3RoPTA7CisJcmV0LT5rZXlfZGF0YT1OVUxMOworCXJldC0+a2V5X2ZyZWU9MDsKKwlyZXQtPmNpcGhlci5jaXBoZXI9TlVMTDsKKwltZW1zZXQocmV0LT5jaXBoZXIuaXYsMCxFVlBfTUFYX0lWX0xFTkdUSCk7CisJcmV0LT5yZWZlcmVuY2VzPTE7CisJcmV0dXJuKHJldCk7CisJTV9BU04xX05ld19FcnJvcihBU04xX0ZfWDUwOV9QS0VZX05FVyk7CisJfQorCit2b2lkIFg1MDlfUEtFWV9mcmVlKFg1MDlfUEtFWSAqeCkKKwl7CisJaW50IGk7CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJngtPnJlZmVyZW5jZXMsLTEsQ1JZUFRPX0xPQ0tfWDUwOV9QS0VZKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlg1MDlfUEtFWSIseCk7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIlg1MDlfUEtFWV9mcmVlLCBiYWQgcmVmZXJlbmNlIGNvdW50XG4iKTsKKwkJYWJvcnQoKTsKKwkJfQorI2VuZGlmCisKKwlpZiAoeC0+ZW5jX2FsZ29yICE9IE5VTEwpIFg1MDlfQUxHT1JfZnJlZSh4LT5lbmNfYWxnb3IpOworCWlmICh4LT5lbmNfcGtleSAhPSBOVUxMKSBNX0FTTjFfT0NURVRfU1RSSU5HX2ZyZWUoeC0+ZW5jX3BrZXkpOworCWlmICh4LT5kZWNfcGtleSAhPSBOVUxMKUVWUF9QS0VZX2ZyZWUoeC0+ZGVjX3BrZXkpOworCWlmICgoeC0+a2V5X2RhdGEgIT0gTlVMTCkgJiYgKHgtPmtleV9mcmVlKSkgT1BFTlNTTF9mcmVlKHgtPmtleV9kYXRhKTsKKwlPUEVOU1NMX2ZyZWUoeCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9wdWJrZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfcHVia2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQyYjZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfcHVia2V5LmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qIGNyeXB0by9hc24xL3hfcHVia2V5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSAiYXNuMV9sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKworLyogTWlub3IgdHdlYWsgdG8gb3BlcmF0aW9uOiBmcmVlIHVwIEVWUF9QS0VZICovCitzdGF0aWMgaW50IHB1YmtleV9jYihpbnQgb3BlcmF0aW9uLCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCXZvaWQgKmV4YXJnKQorCXsKKwlpZiAob3BlcmF0aW9uID09IEFTTjFfT1BfRlJFRV9QT1NUKQorCQl7CisJCVg1MDlfUFVCS0VZICpwdWJrZXkgPSAoWDUwOV9QVUJLRVkgKikqcHZhbDsKKwkJRVZQX1BLRVlfZnJlZShwdWJrZXktPnBrZXkpOworCQl9CisJcmV0dXJuIDE7CisJfQorCitBU04xX1NFUVVFTkNFX2NiKFg1MDlfUFVCS0VZLCBwdWJrZXlfY2IpID0geworCUFTTjFfU0lNUExFKFg1MDlfUFVCS0VZLCBhbGdvciwgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoWDUwOV9QVUJLRVksIHB1YmxpY19rZXksIEFTTjFfQklUX1NUUklORykKK30gQVNOMV9TRVFVRU5DRV9FTkRfY2IoWDUwOV9QVUJLRVksIFg1MDlfUFVCS0VZKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9QVUJLRVkpCisKK2ludCBYNTA5X1BVQktFWV9zZXQoWDUwOV9QVUJLRVkgKip4LCBFVlBfUEtFWSAqcGtleSkKKwl7CisJWDUwOV9QVUJLRVkgKnBrPU5VTEw7CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwlpZiAoKHBrPVg1MDlfUFVCS0VZX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycm9yOworCisJaWYgKHBrZXktPmFtZXRoKQorCQl7CisJCWlmIChwa2V5LT5hbWV0aC0+cHViX2VuY29kZSkKKwkJCXsKKwkJCWlmICghcGtleS0+YW1ldGgtPnB1Yl9lbmNvZGUocGssIHBrZXkpKQorCQkJCXsKKwkJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1BVQktFWV9TRVQsCisJCQkJCVg1MDlfUl9QVUJMSUNfS0VZX0VOQ09ERV9FUlJPUik7CisJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCVg1MDllcnIoWDUwOV9GX1g1MDlfUFVCS0VZX1NFVCwKKwkJCQlYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOworCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1BVQktFWV9TRVQsWDUwOV9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CisJCWdvdG8gZXJyb3I7CisJCX0KKworCWlmICgqeCAhPSBOVUxMKQorCQlYNTA5X1BVQktFWV9mcmVlKCp4KTsKKworCSp4PXBrOworCisJcmV0dXJuIDE7CitlcnJvcjoKKwlpZiAocGsgIT0gTlVMTCkgWDUwOV9QVUJLRVlfZnJlZShwayk7CisJcmV0dXJuIDA7CisJfQorCitFVlBfUEtFWSAqWDUwOV9QVUJLRVlfZ2V0KFg1MDlfUFVCS0VZICprZXkpCisJeworCUVWUF9QS0VZICpyZXQ9TlVMTDsKKworCWlmIChrZXkgPT0gTlVMTCkgZ290byBlcnJvcjsKKworCWlmIChrZXktPnBrZXkgIT0gTlVMTCkKKwkJeworCQlDUllQVE9fYWRkKCZrZXktPnBrZXktPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKwkJcmV0dXJuIGtleS0+cGtleTsKKwkJfQorCisJaWYgKGtleS0+cHVibGljX2tleSA9PSBOVUxMKSBnb3RvIGVycm9yOworCisJaWYgKChyZXQgPSBFVlBfUEtFWV9uZXcoKSkgPT0gTlVMTCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1BVQktFWV9HRVQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnJvcjsKKwkJfQorCisJaWYgKCFFVlBfUEtFWV9zZXRfdHlwZShyZXQsIE9CSl9vYmoybmlkKGtleS0+YWxnb3ItPmFsZ29yaXRobSkpKQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfUFVCS0VZX0dFVCxYNTA5X1JfVU5TVVBQT1JURURfQUxHT1JJVEhNKTsKKwkJZ290byBlcnJvcjsKKwkJfQorCisJaWYgKHJldC0+YW1ldGgtPnB1Yl9kZWNvZGUpCisJCXsKKwkJaWYgKCFyZXQtPmFtZXRoLT5wdWJfZGVjb2RlKHJldCwga2V5KSkKKwkJCXsKKwkJCVg1MDllcnIoWDUwOV9GX1g1MDlfUFVCS0VZX0dFVCwKKwkJCQkJCVg1MDlfUl9QVUJMSUNfS0VZX0RFQ09ERV9FUlJPUik7CisJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfUFVCS0VZX0dFVCwgWDUwOV9SX01FVEhPRF9OT1RfU1VQUE9SVEVEKTsKKwkJZ290byBlcnJvcjsKKwkJfQorCisJa2V5LT5wa2V5ID0gcmV0OworCUNSWVBUT19hZGQoJnJldC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworCisJcmV0dXJuIHJldDsKKworCWVycm9yOgorCWlmIChyZXQgIT0gTlVMTCkKKwkJRVZQX1BLRVlfZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKKwl9CisKKy8qIE5vdyB0d28gcHNldWRvIEFTTjEgcm91dGluZXMgdGhhdCB0YWtlIGFuIEVWUF9QS0VZIHN0cnVjdHVyZQorICogYW5kIGVuY29kZSBvciBkZWNvZGUgYXMgWDUwOV9QVUJLRVkKKyAqLworCitFVlBfUEtFWSAqZDJpX1BVQktFWShFVlBfUEtFWSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkgICAgIGxvbmcgbGVuZ3RoKQorCXsKKwlYNTA5X1BVQktFWSAqeHBrOworCUVWUF9QS0VZICpwa3RtcDsKKwl4cGsgPSBkMmlfWDUwOV9QVUJLRVkoTlVMTCwgcHAsIGxlbmd0aCk7CisJaWYoIXhwaykgcmV0dXJuIE5VTEw7CisJcGt0bXAgPSBYNTA5X1BVQktFWV9nZXQoeHBrKTsKKwlYNTA5X1BVQktFWV9mcmVlKHhwayk7CisJaWYoIXBrdG1wKSByZXR1cm4gTlVMTDsKKwlpZihhKQorCQl7CisJCUVWUF9QS0VZX2ZyZWUoKmEpOworCQkqYSA9IHBrdG1wOworCQl9CisJcmV0dXJuIHBrdG1wOworCX0KKworaW50IGkyZF9QVUJLRVkoRVZQX1BLRVkgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisJWDUwOV9QVUJLRVkgKnhwaz1OVUxMOworCWludCByZXQ7CisJaWYoIWEpIHJldHVybiAwOworCWlmKCFYNTA5X1BVQktFWV9zZXQoJnhwaywgYSkpIHJldHVybiAwOworCXJldCA9IGkyZF9YNTA5X1BVQktFWSh4cGssIHBwKTsKKwlYNTA5X1BVQktFWV9mcmVlKHhwayk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnRzIGJ1dCB3aGljaCByZXR1cm4gUlNBIGFuZCBEU0EKKyAqIGtleXMKKyAqLworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorUlNBICpkMmlfUlNBX1BVQktFWShSU0EgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJICAgICBsb25nIGxlbmd0aCkKKwl7CisJRVZQX1BLRVkgKnBrZXk7CisJUlNBICprZXk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcTsKKwlxID0gKnBwOworCXBrZXkgPSBkMmlfUFVCS0VZKE5VTEwsICZxLCBsZW5ndGgpOworCWlmICghcGtleSkgcmV0dXJuIE5VTEw7CisJa2V5ID0gRVZQX1BLRVlfZ2V0MV9SU0EocGtleSk7CisJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlpZiAoIWtleSkgcmV0dXJuIE5VTEw7CisJKnBwID0gcTsKKwlpZiAoYSkKKwkJeworCQlSU0FfZnJlZSgqYSk7CisJCSphID0ga2V5OworCQl9CisJcmV0dXJuIGtleTsKKwl9CisKK2ludCBpMmRfUlNBX1BVQktFWShSU0EgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisJRVZQX1BLRVkgKnBrdG1wOworCWludCByZXQ7CisJaWYgKCFhKSByZXR1cm4gMDsKKwlwa3RtcCA9IEVWUF9QS0VZX25ldygpOworCWlmICghcGt0bXApCisJCXsKKwkJQVNOMWVycihBU04xX0ZfSTJEX1JTQV9QVUJLRVksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlFVlBfUEtFWV9zZXQxX1JTQShwa3RtcCwgYSk7CisJcmV0ID0gaTJkX1BVQktFWShwa3RtcCwgcHApOworCUVWUF9QS0VZX2ZyZWUocGt0bXApOworCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKK0RTQSAqZDJpX0RTQV9QVUJLRVkoRFNBICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCSAgICAgbG9uZyBsZW5ndGgpCisJeworCUVWUF9QS0VZICpwa2V5OworCURTQSAqa2V5OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnE7CisJcSA9ICpwcDsKKwlwa2V5ID0gZDJpX1BVQktFWShOVUxMLCAmcSwgbGVuZ3RoKTsKKwlpZiAoIXBrZXkpIHJldHVybiBOVUxMOworCWtleSA9IEVWUF9QS0VZX2dldDFfRFNBKHBrZXkpOworCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJaWYgKCFrZXkpIHJldHVybiBOVUxMOworCSpwcCA9IHE7CisJaWYgKGEpCisJCXsKKwkJRFNBX2ZyZWUoKmEpOworCQkqYSA9IGtleTsKKwkJfQorCXJldHVybiBrZXk7CisJfQorCitpbnQgaTJkX0RTQV9QVUJLRVkoRFNBICphLCB1bnNpZ25lZCBjaGFyICoqcHApCisJeworCUVWUF9QS0VZICpwa3RtcDsKKwlpbnQgcmV0OworCWlmKCFhKSByZXR1cm4gMDsKKwlwa3RtcCA9IEVWUF9QS0VZX25ldygpOworCWlmKCFwa3RtcCkKKwkJeworCQlBU04xZXJyKEFTTjFfRl9JMkRfRFNBX1BVQktFWSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCUVWUF9QS0VZX3NldDFfRFNBKHBrdG1wLCBhKTsKKwlyZXQgPSBpMmRfUFVCS0VZKHBrdG1wLCBwcCk7CisJRVZQX1BLRVlfZnJlZShwa3RtcCk7CisJcmV0dXJuIHJldDsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0VDCitFQ19LRVkgKmQyaV9FQ19QVUJLRVkoRUNfS0VZICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCkKKwl7CisJRVZQX1BLRVkgKnBrZXk7CisJRUNfS0VZICprZXk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcTsKKwlxID0gKnBwOworCXBrZXkgPSBkMmlfUFVCS0VZKE5VTEwsICZxLCBsZW5ndGgpOworCWlmICghcGtleSkgcmV0dXJuKE5VTEwpOworCWtleSA9IEVWUF9QS0VZX2dldDFfRUNfS0VZKHBrZXkpOworCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJaWYgKCFrZXkpICByZXR1cm4oTlVMTCk7CisJKnBwID0gcTsKKwlpZiAoYSkKKwkJeworCQlFQ19LRVlfZnJlZSgqYSk7CisJCSphID0ga2V5OworCQl9CisJcmV0dXJuKGtleSk7CisJfQorCitpbnQgaTJkX0VDX1BVQktFWShFQ19LRVkgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKKwl7CisJRVZQX1BLRVkgKnBrdG1wOworCWludCByZXQ7CisJaWYgKCFhKQlyZXR1cm4oMCk7CisJaWYgKChwa3RtcCA9IEVWUF9QS0VZX25ldygpKSA9PSBOVUxMKQorCQl7CisJCUFTTjFlcnIoQVNOMV9GX0kyRF9FQ19QVUJLRVksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJRVZQX1BLRVlfc2V0MV9FQ19LRVkocGt0bXAsIGEpOworCXJldCA9IGkyZF9QVUJLRVkocGt0bXAsIHBwKTsKKwlFVlBfUEtFWV9mcmVlKHBrdG1wKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYKKworaW50IFg1MDlfUFVCS0VZX3NldDBfcGFyYW0oWDUwOV9QVUJLRVkgKnB1YiwgQVNOMV9PQkpFQ1QgKmFvYmosCisJCQkJCWludCBwdHlwZSwgdm9pZCAqcHZhbCwKKwkJCQkJdW5zaWduZWQgY2hhciAqcGVuYywgaW50IHBlbmNsZW4pCisJeworCWlmICghWDUwOV9BTEdPUl9zZXQwKHB1Yi0+YWxnb3IsIGFvYmosIHB0eXBlLCBwdmFsKSkKKwkJcmV0dXJuIDA7CisJaWYgKHBlbmMpCisJCXsKKwkJaWYgKHB1Yi0+cHVibGljX2tleS0+ZGF0YSkKKwkJCU9QRU5TU0xfZnJlZShwdWItPnB1YmxpY19rZXktPmRhdGEpOworCQlwdWItPnB1YmxpY19rZXktPmRhdGEgPSBwZW5jOworCQlwdWItPnB1YmxpY19rZXktPmxlbmd0aCA9IHBlbmNsZW47CisgIAkJLyogU2V0IG51bWJlciBvZiB1bnVzZWQgYml0cyB0byB6ZXJvICovCisJCXB1Yi0+cHVibGljX2tleS0+ZmxhZ3MmPSB+KEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUfDB4MDcpOworCQlwdWItPnB1YmxpY19rZXktPmZsYWdzfD1BU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVDsKKwkJfQorCXJldHVybiAxOworCX0KKworaW50IFg1MDlfUFVCS0VZX2dldDBfcGFyYW0oQVNOMV9PQkpFQ1QgKipwcGthbGcsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKipwaywgaW50ICpwcGtsZW4sCisJCVg1MDlfQUxHT1IgKipwYSwKKwkJWDUwOV9QVUJLRVkgKnB1YikKKwl7CisJaWYgKHBwa2FsZykKKwkJKnBwa2FsZyA9IHB1Yi0+YWxnb3ItPmFsZ29yaXRobTsKKwlpZiAocGspCisJCXsKKwkJKnBrID0gcHViLT5wdWJsaWNfa2V5LT5kYXRhOworCQkqcHBrbGVuID0gcHViLT5wdWJsaWNfa2V5LT5sZW5ndGg7CisJCX0KKwlpZiAocGEpCisJCSpwYSA9IHB1Yi0+YWxnb3I7CisJcmV0dXJuIDE7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2FzbjEveF9yZXEuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3NTU1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfcmVxLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qIGNyeXB0by9hc24xL3hfcmVxLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKy8qIFg1MDlfUkVRX0lORk8gaXMgaGFuZGxlZCBpbiBhbiB1bnVzdWFsIHdheSB0byBnZXQgcm91bmQKKyAqIGludmFsaWQgZW5jb2RpbmdzLiBTb21lIGJyb2tlbiBjZXJ0aWZpY2F0ZSByZXF1ZXN0cyBkb24ndAorICogZW5jb2RlIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIGlmIGl0IGlzIGVtcHR5LiBUaGlzIGlzIGluCisgKiB2aW9sYXRpb24gb2YgUEtDUyMxMCBidXQgd2UgbmVlZCB0byB0b2xlcmF0ZSBpdC4gV2UgZG8KKyAqIHRoaXMgYnkgbWFraW5nIHRoZSBhdHRyaWJ1dGVzIGZpZWxkIE9QVElPTkFMIHRoZW4gdXNpbmcKKyAqIHRoZSBjYWxsYmFjayB0byBpbml0aWFsaXNlIGl0IHRvIGFuIGVtcHR5IFNUQUNLLiAKKyAqCisgKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZpZWxkIHdpbGwgYmUgY29ycmVjdGx5IGVuY29kZWQgdW5sZXNzCisgKiB3ZSBOVUxMIG91dCB0aGUgZmllbGQuCisgKgorICogQXMgYSByZXN1bHQgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHJlcV9rbHVkZ2UgZmllbGQgYmVjYXVzZQorICogdGhlIGluZm9ybWF0aW9uIGlzIG5vdyBjb250YWluZWQgaW4gdGhlIGF0dHJpYnV0ZXMgZmllbGQ6CisgKiAxLiBJZiBpdCBpcyBOVUxMIHRoZW4gaXQncyB0aGUgaW52YWxpZCBvbWlzc2lvbi4KKyAqIDIuIElmIGl0IGlzIGVtcHR5IGl0IGlzIHRoZSBjb3JyZWN0IGVuY29kaW5nLgorICogMy4gSWYgaXQgaXMgbm90IGVtcHR5IHRoZW4gc29tZSBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50LgorICoKKyAqLworCitzdGF0aWMgaW50IHJpbmZfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJdm9pZCAqZXhhcmcpCit7CisJWDUwOV9SRVFfSU5GTyAqcmluZiA9IChYNTA5X1JFUV9JTkZPICopKnB2YWw7CisKKwlpZihvcGVyYXRpb24gPT0gQVNOMV9PUF9ORVdfUE9TVCkgeworCQlyaW5mLT5hdHRyaWJ1dGVzID0gc2tfWDUwOV9BVFRSSUJVVEVfbmV3X251bGwoKTsKKwkJaWYoIXJpbmYtPmF0dHJpYnV0ZXMpIHJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworQVNOMV9TRVFVRU5DRV9lbmMoWDUwOV9SRVFfSU5GTywgZW5jLCByaW5mX2NiKSA9IHsKKwlBU04xX1NJTVBMRShYNTA5X1JFUV9JTkZPLCB2ZXJzaW9uLCBBU04xX0lOVEVHRVIpLAorCUFTTjFfU0lNUExFKFg1MDlfUkVRX0lORk8sIHN1YmplY3QsIFg1MDlfTkFNRSksCisJQVNOMV9TSU1QTEUoWDUwOV9SRVFfSU5GTywgcHVia2V5LCBYNTA5X1BVQktFWSksCisJLyogVGhpcyBpc24ndCByZWFsbHkgT1BUSU9OQUwgYnV0IGl0IGdldHMgcm91bmQgaW52YWxpZAorCSAqIGVuY29kaW5ncworCSAqLworCUFTTjFfSU1QX1NFVF9PRl9PUFQoWDUwOV9SRVFfSU5GTywgYXR0cmlidXRlcywgWDUwOV9BVFRSSUJVVEUsIDApCit9IEFTTjFfU0VRVUVOQ0VfRU5EX2VuYyhYNTA5X1JFUV9JTkZPLCBYNTA5X1JFUV9JTkZPKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9SRVFfSU5GTykKKworQVNOMV9TRVFVRU5DRV9yZWYoWDUwOV9SRVEsIDAsIENSWVBUT19MT0NLX1g1MDlfUkVRKSA9IHsKKwlBU04xX1NJTVBMRShYNTA5X1JFUSwgcmVxX2luZm8sIFg1MDlfUkVRX0lORk8pLAorCUFTTjFfU0lNUExFKFg1MDlfUkVRLCBzaWdfYWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShYNTA5X1JFUSwgc2lnbmF0dXJlLCBBU04xX0JJVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EX3JlZihYNTA5X1JFUSwgWDUwOV9SRVEpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X1JFUSkKK0lNUExFTUVOVF9BU04xX0RVUF9GVU5DVElPTihYNTA5X1JFUSkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfc2lnLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3NpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZWZhODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3NpZy5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGNyeXB0by9hc24xL3hfc2lnLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKK0FTTjFfU0VRVUVOQ0UoWDUwOV9TSUcpID0geworCUFTTjFfU0lNUExFKFg1MDlfU0lHLCBhbGdvciwgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoWDUwOV9TSUcsIGRpZ2VzdCwgQVNOMV9PQ1RFVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfU0lHKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9TSUcpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3Nwa2kuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfc3BraS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZWNlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3Nwa2kuYwpAQCAtMCwwICsxLDgxIEBACisvKiBjcnlwdG8vYXNuMS94X3Nwa2kuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisgLyogVGhpcyBtb2R1bGUgd2FzIHNlbmQgdG8gbWUgbXkgUGF0IFJpY2hhcmRzIDxwYXRyQHg1MDkuY29tPiB3aG8KKyAgKiB3cm90ZSBpdC4gIEl0IGlzIHVuZGVyIG15IENvcHlyaWdodCB3aXRoIGhpcyBwZXJtaXNzaW9uCisgICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorCitBU04xX1NFUVVFTkNFKE5FVFNDQVBFX1NQS0FDKSA9IHsKKwlBU04xX1NJTVBMRShORVRTQ0FQRV9TUEtBQywgcHVia2V5LCBYNTA5X1BVQktFWSksCisJQVNOMV9TSU1QTEUoTkVUU0NBUEVfU1BLQUMsIGNoYWxsZW5nZSwgQVNOMV9JQTVTVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE5FVFNDQVBFX1NQS0FDKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfU1BLQUMpCisKK0FTTjFfU0VRVUVOQ0UoTkVUU0NBUEVfU1BLSSkgPSB7CisJQVNOMV9TSU1QTEUoTkVUU0NBUEVfU1BLSSwgc3BrYWMsIE5FVFNDQVBFX1NQS0FDKSwKKwlBU04xX1NJTVBMRShORVRTQ0FQRV9TUEtJLCBzaWdfYWxnb3IsIFg1MDlfQUxHT1IpLAorCUFTTjFfU0lNUExFKE5FVFNDQVBFX1NQS0ksIHNpZ25hdHVyZSwgQVNOMV9CSVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORChORVRTQ0FQRV9TUEtJKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfU1BLSSkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfdmFsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3ZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTdjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3ZhbC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIGNyeXB0by9hc24xL3hfdmFsLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKK0FTTjFfU0VRVUVOQ0UoWDUwOV9WQUwpID0geworCUFTTjFfU0lNUExFKFg1MDlfVkFMLCBub3RCZWZvcmUsIEFTTjFfVElNRSksCisJQVNOMV9TSU1QTEUoWDUwOV9WQUwsIG5vdEFmdGVyLCBBU04xX1RJTUUpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfVkFMKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoWDUwOV9WQUwpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3g1MDkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfeDUwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZmQzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3g1MDkuYwpAQCAtMCwwICsxLDE5NCBAQAorLyogY3J5cHRvL2FzbjEveF94NTA5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCitBU04xX1NFUVVFTkNFKFg1MDlfQ0lORikgPSB7CisJQVNOMV9FWFBfT1BUKFg1MDlfQ0lORiwgdmVyc2lvbiwgQVNOMV9JTlRFR0VSLCAwKSwKKwlBU04xX1NJTVBMRShYNTA5X0NJTkYsIHNlcmlhbE51bWJlciwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NJTVBMRShYNTA5X0NJTkYsIHNpZ25hdHVyZSwgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoWDUwOV9DSU5GLCBpc3N1ZXIsIFg1MDlfTkFNRSksCisJQVNOMV9TSU1QTEUoWDUwOV9DSU5GLCB2YWxpZGl0eSwgWDUwOV9WQUwpLAorCUFTTjFfU0lNUExFKFg1MDlfQ0lORiwgc3ViamVjdCwgWDUwOV9OQU1FKSwKKwlBU04xX1NJTVBMRShYNTA5X0NJTkYsIGtleSwgWDUwOV9QVUJLRVkpLAorCUFTTjFfSU1QX09QVChYNTA5X0NJTkYsIGlzc3VlclVJRCwgQVNOMV9CSVRfU1RSSU5HLCAxKSwKKwlBU04xX0lNUF9PUFQoWDUwOV9DSU5GLCBzdWJqZWN0VUlELCBBU04xX0JJVF9TVFJJTkcsIDIpLAorCUFTTjFfRVhQX1NFUVVFTkNFX09GX09QVChYNTA5X0NJTkYsIGV4dGVuc2lvbnMsIFg1MDlfRVhURU5TSU9OLCAzKQorfSBBU04xX1NFUVVFTkNFX0VORChYNTA5X0NJTkYpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0NJTkYpCisvKiBYNTA5IHRvcCBsZXZlbCBzdHJ1Y3R1cmUgbmVlZHMgYSBiaXQgb2YgY3VzdG9taXNhdGlvbiAqLworCitleHRlcm4gdm9pZCBwb2xpY3lfY2FjaGVfZnJlZShYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUpOworCitzdGF0aWMgaW50IHg1MDlfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCVg1MDkgKnJldCA9IChYNTA5ICopKnB2YWw7CisKKwlzd2l0Y2gob3BlcmF0aW9uKSB7CisKKwkJY2FzZSBBU04xX09QX05FV19QT1NUOgorCQlyZXQtPnZhbGlkPTA7CisJCXJldC0+bmFtZSA9IE5VTEw7CisJCXJldC0+ZXhfZmxhZ3MgPSAwOworCQlyZXQtPmV4X3BhdGhsZW4gPSAtMTsKKwkJcmV0LT5za2lkID0gTlVMTDsKKwkJcmV0LT5ha2lkID0gTlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CisJCXJldC0+cmZjMzc3OV9hZGRyID0gTlVMTDsKKwkJcmV0LT5yZmMzNzc5X2FzaWQgPSBOVUxMOworI2VuZGlmCisJCXJldC0+YXV4ID0gTlVMTDsKKwkJcmV0LT5jcmxkcCA9IE5VTEw7CisJCUNSWVBUT19uZXdfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfWDUwOSwgcmV0LCAmcmV0LT5leF9kYXRhKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX09QX0QySV9QT1NUOgorCQlpZiAocmV0LT5uYW1lICE9IE5VTEwpIE9QRU5TU0xfZnJlZShyZXQtPm5hbWUpOworCQlyZXQtPm5hbWU9WDUwOV9OQU1FX29uZWxpbmUocmV0LT5jZXJ0X2luZm8tPnN1YmplY3QsTlVMTCwwKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX09QX0ZSRUVfUE9TVDoKKwkJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfWDUwOSwgcmV0LCAmcmV0LT5leF9kYXRhKTsKKwkJWDUwOV9DRVJUX0FVWF9mcmVlKHJldC0+YXV4KTsKKwkJQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShyZXQtPnNraWQpOworCQlBVVRIT1JJVFlfS0VZSURfZnJlZShyZXQtPmFraWQpOworCQlDUkxfRElTVF9QT0lOVFNfZnJlZShyZXQtPmNybGRwKTsKKwkJcG9saWN5X2NhY2hlX2ZyZWUocmV0LT5wb2xpY3lfY2FjaGUpOworCQlHRU5FUkFMX05BTUVTX2ZyZWUocmV0LT5hbHRuYW1lKTsKKwkJTkFNRV9DT05TVFJBSU5UU19mcmVlKHJldC0+bmMpOworI2lmbmRlZiBPUEVOU1NMX05PX1JGQzM3NzkKKwkJc2tfSVBBZGRyZXNzRmFtaWx5X3BvcF9mcmVlKHJldC0+cmZjMzc3OV9hZGRyLCBJUEFkZHJlc3NGYW1pbHlfZnJlZSk7CisJCUFTSWRlbnRpZmllcnNfZnJlZShyZXQtPnJmYzM3NzlfYXNpZCk7CisjZW5kaWYKKworCQlpZiAocmV0LT5uYW1lICE9IE5VTEwpIE9QRU5TU0xfZnJlZShyZXQtPm5hbWUpOworCQlicmVhazsKKworCX0KKworCXJldHVybiAxOworCit9CisKK0FTTjFfU0VRVUVOQ0VfcmVmKFg1MDksIHg1MDlfY2IsIENSWVBUT19MT0NLX1g1MDkpID0geworCUFTTjFfU0lNUExFKFg1MDksIGNlcnRfaW5mbywgWDUwOV9DSU5GKSwKKwlBU04xX1NJTVBMRShYNTA5LCBzaWdfYWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShYNTA5LCBzaWduYXR1cmUsIEFTTjFfQklUX1NUUklORykKK30gQVNOMV9TRVFVRU5DRV9FTkRfcmVmKFg1MDksIFg1MDkpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5KQorSU1QTEVNRU5UX0FTTjFfRFVQX0ZVTkNUSU9OKFg1MDkpCisKK2ludCBYNTA5X2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKQorICAgICAgICB7CisJcmV0dXJuIENSWVBUT19nZXRfZXhfbmV3X2luZGV4KENSWVBUT19FWF9JTkRFWF9YNTA5LCBhcmdsLCBhcmdwLAorCQkJCW5ld19mdW5jLCBkdXBfZnVuYywgZnJlZV9mdW5jKTsKKyAgICAgICAgfQorCitpbnQgWDUwOV9zZXRfZXhfZGF0YShYNTA5ICpyLCBpbnQgaWR4LCB2b2lkICphcmcpCisJeworCXJldHVybihDUllQVE9fc2V0X2V4X2RhdGEoJnItPmV4X2RhdGEsaWR4LGFyZykpOworCX0KKwordm9pZCAqWDUwOV9nZXRfZXhfZGF0YShYNTA5ICpyLCBpbnQgaWR4KQorCXsKKwlyZXR1cm4oQ1JZUFRPX2dldF9leF9kYXRhKCZyLT5leF9kYXRhLGlkeCkpOworCX0KKworLyogWDUwOV9BVVggQVNOMSByb3V0aW5lcy4gWDUwOV9BVVggaXMgdGhlIG5hbWUgZ2l2ZW4gdG8KKyAqIGEgY2VydGlmaWNhdGUgd2l0aCBleHRyYSBpbmZvIHRhZ2dlZCBvbiB0aGUgZW5kLiBTaW5jZSB0aGVzZQorICogZnVuY3Rpb25zIHNldCBob3cgYSBjZXJ0aWZpY2F0ZSBpcyB0cnVzdGVkIHRoZXkgc2hvdWxkIG9ubHkKKyAqIGJlIHVzZWQgd2hlbiB0aGUgY2VydGlmaWNhdGUgY29tZXMgZnJvbSBhIHJlbGlhYmxlIHNvdXJjZQorICogc3VjaCBhcyBsb2NhbCBzdG9yYWdlLgorICoKKyAqLworCitYNTA5ICpkMmlfWDUwOV9BVVgoWDUwOSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcTsKKwlYNTA5ICpyZXQ7CisJLyogU2F2ZSBzdGFydCBwb3NpdGlvbiAqLworCXEgPSAqcHA7CisJcmV0ID0gZDJpX1g1MDkoYSwgcHAsIGxlbmd0aCk7CisJLyogSWYgY2VydGlmaWNhdGUgdW5yZWFkYWJsZSB0aGVuIGZvcmdldCBpdCAqLworCWlmKCFyZXQpIHJldHVybiBOVUxMOworCS8qIHVwZGF0ZSBsZW5ndGggKi8KKwlsZW5ndGggLT0gKnBwIC0gcTsKKwlpZighbGVuZ3RoKSByZXR1cm4gcmV0OworCWlmKCFkMmlfWDUwOV9DRVJUX0FVWCgmcmV0LT5hdXgsIHBwLCBsZW5ndGgpKSBnb3RvIGVycjsKKwlyZXR1cm4gcmV0OworCWVycjoKKwlYNTA5X2ZyZWUocmV0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGkyZF9YNTA5X0FVWChYNTA5ICphLCB1bnNpZ25lZCBjaGFyICoqcHApCit7CisJaW50IGxlbmd0aDsKKwlsZW5ndGggPSBpMmRfWDUwOShhLCBwcCk7CisJaWYoYSkgbGVuZ3RoICs9IGkyZF9YNTA5X0NFUlRfQVVYKGEtPmF1eCwgcHApOworCXJldHVybiBsZW5ndGg7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3g1MDlhLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYXNuMS94X3g1MDlhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwM2Y4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9hc24xL3hfeDUwOWEuYwpAQCAtMCwwICsxLDE4MCBAQAorLyogYV94NTA5YS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisvKiBYNTA5X0NFUlRfQVVYIHJvdXRpbmVzLiBUaGVzZSBhcmUgdXNlZCB0byBlbmNvZGUgYWRkaXRpb25hbAorICogdXNlciBtb2RpZmlhYmxlIGRhdGEgYWJvdXQgYSBjZXJ0aWZpY2F0ZS4gVGhpcyBkYXRhIGlzCisgKiBhcHBlbmRlZCB0byB0aGUgWDUwOSBlbmNvZGluZyB3aGVuIHRoZSAqX1g1MDlfQVVYIHJvdXRpbmVzCisgKiBhcmUgdXNlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSAidHJhZGl0aW9uYWwiIFg1MDkgcm91dGluZXMKKyAqIHdpbGwgc2ltcGx5IGlnbm9yZSB0aGUgZXh0cmEgZGF0YS4gCisgKi8KKworc3RhdGljIFg1MDlfQ0VSVF9BVVggKmF1eF9nZXQoWDUwOSAqeCk7CisKK0FTTjFfU0VRVUVOQ0UoWDUwOV9DRVJUX0FVWCkgPSB7CisJQVNOMV9TRVFVRU5DRV9PRl9PUFQoWDUwOV9DRVJUX0FVWCwgdHJ1c3QsIEFTTjFfT0JKRUNUKSwKKwlBU04xX0lNUF9TRVFVRU5DRV9PRl9PUFQoWDUwOV9DRVJUX0FVWCwgcmVqZWN0LCBBU04xX09CSkVDVCwgMCksCisJQVNOMV9PUFQoWDUwOV9DRVJUX0FVWCwgYWxpYXMsIEFTTjFfVVRGOFNUUklORyksCisJQVNOMV9PUFQoWDUwOV9DRVJUX0FVWCwga2V5aWQsIEFTTjFfT0NURVRfU1RSSU5HKSwKKwlBU04xX0lNUF9TRVFVRU5DRV9PRl9PUFQoWDUwOV9DRVJUX0FVWCwgb3RoZXIsIFg1MDlfQUxHT1IsIDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg1MDlfQ0VSVF9BVVgpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0NFUlRfQVVYKQorCitzdGF0aWMgWDUwOV9DRVJUX0FVWCAqYXV4X2dldChYNTA5ICp4KQoreworCWlmKCF4KSByZXR1cm4gTlVMTDsKKwlpZigheC0+YXV4ICYmICEoeC0+YXV4ID0gWDUwOV9DRVJUX0FVWF9uZXcoKSkpIHJldHVybiBOVUxMOworCXJldHVybiB4LT5hdXg7Cit9CisKK2ludCBYNTA5X2FsaWFzX3NldDEoWDUwOSAqeCwgdW5zaWduZWQgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlYNTA5X0NFUlRfQVVYICphdXg7CisJaWYgKCFuYW1lKQorCQl7CisJCWlmICgheCB8fCAheC0+YXV4IHx8ICF4LT5hdXgtPmFsaWFzKQorCQkJcmV0dXJuIDE7CisJCUFTTjFfVVRGOFNUUklOR19mcmVlKHgtPmF1eC0+YWxpYXMpOworCQl4LT5hdXgtPmFsaWFzID0gTlVMTDsKKwkJcmV0dXJuIDE7CisJCX0KKwlpZighKGF1eCA9IGF1eF9nZXQoeCkpKSByZXR1cm4gMDsKKwlpZighYXV4LT5hbGlhcyAmJiAhKGF1eC0+YWxpYXMgPSBBU04xX1VURjhTVFJJTkdfbmV3KCkpKSByZXR1cm4gMDsKKwlyZXR1cm4gQVNOMV9TVFJJTkdfc2V0KGF1eC0+YWxpYXMsIG5hbWUsIGxlbik7Cit9CisKK2ludCBYNTA5X2tleWlkX3NldDEoWDUwOSAqeCwgdW5zaWduZWQgY2hhciAqaWQsIGludCBsZW4pCit7CisJWDUwOV9DRVJUX0FVWCAqYXV4OworCWlmICghaWQpCisJCXsKKwkJaWYgKCF4IHx8ICF4LT5hdXggfHwgIXgtPmF1eC0+a2V5aWQpCisJCQlyZXR1cm4gMTsKKwkJQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZSh4LT5hdXgtPmtleWlkKTsKKwkJeC0+YXV4LT5rZXlpZCA9IE5VTEw7CisJCXJldHVybiAxOworCQl9CisJaWYoIShhdXggPSBhdXhfZ2V0KHgpKSkgcmV0dXJuIDA7CisJaWYoIWF1eC0+a2V5aWQgJiYgIShhdXgtPmtleWlkID0gQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpKSByZXR1cm4gMDsKKwlyZXR1cm4gQVNOMV9TVFJJTkdfc2V0KGF1eC0+a2V5aWQsIGlkLCBsZW4pOworfQorCit1bnNpZ25lZCBjaGFyICpYNTA5X2FsaWFzX2dldDAoWDUwOSAqeCwgaW50ICpsZW4pCit7CisJaWYoIXgtPmF1eCB8fCAheC0+YXV4LT5hbGlhcykgcmV0dXJuIE5VTEw7CisJaWYobGVuKSAqbGVuID0geC0+YXV4LT5hbGlhcy0+bGVuZ3RoOworCXJldHVybiB4LT5hdXgtPmFsaWFzLT5kYXRhOworfQorCit1bnNpZ25lZCBjaGFyICpYNTA5X2tleWlkX2dldDAoWDUwOSAqeCwgaW50ICpsZW4pCit7CisJaWYoIXgtPmF1eCB8fCAheC0+YXV4LT5rZXlpZCkgcmV0dXJuIE5VTEw7CisJaWYobGVuKSAqbGVuID0geC0+YXV4LT5rZXlpZC0+bGVuZ3RoOworCXJldHVybiB4LT5hdXgtPmtleWlkLT5kYXRhOworfQorCitpbnQgWDUwOV9hZGQxX3RydXN0X29iamVjdChYNTA5ICp4LCBBU04xX09CSkVDVCAqb2JqKQoreworCVg1MDlfQ0VSVF9BVVggKmF1eDsKKwlBU04xX09CSkVDVCAqb2JqdG1wOworCWlmKCEob2JqdG1wID0gT0JKX2R1cChvYmopKSkgcmV0dXJuIDA7CisJaWYoIShhdXggPSBhdXhfZ2V0KHgpKSkgcmV0dXJuIDA7CisJaWYoIWF1eC0+dHJ1c3QKKwkJJiYgIShhdXgtPnRydXN0ID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKSkpIHJldHVybiAwOworCXJldHVybiBza19BU04xX09CSkVDVF9wdXNoKGF1eC0+dHJ1c3QsIG9ianRtcCk7Cit9CisKK2ludCBYNTA5X2FkZDFfcmVqZWN0X29iamVjdChYNTA5ICp4LCBBU04xX09CSkVDVCAqb2JqKQoreworCVg1MDlfQ0VSVF9BVVggKmF1eDsKKwlBU04xX09CSkVDVCAqb2JqdG1wOworCWlmKCEob2JqdG1wID0gT0JKX2R1cChvYmopKSkgcmV0dXJuIDA7CisJaWYoIShhdXggPSBhdXhfZ2V0KHgpKSkgcmV0dXJuIDA7CisJaWYoIWF1eC0+cmVqZWN0CisJCSYmICEoYXV4LT5yZWplY3QgPSBza19BU04xX09CSkVDVF9uZXdfbnVsbCgpKSkgcmV0dXJuIDA7CisJcmV0dXJuIHNrX0FTTjFfT0JKRUNUX3B1c2goYXV4LT5yZWplY3QsIG9ianRtcCk7Cit9CisKK3ZvaWQgWDUwOV90cnVzdF9jbGVhcihYNTA5ICp4KQoreworCWlmKHgtPmF1eCAmJiB4LT5hdXgtPnRydXN0KSB7CisJCXNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKHgtPmF1eC0+dHJ1c3QsIEFTTjFfT0JKRUNUX2ZyZWUpOworCQl4LT5hdXgtPnRydXN0ID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgWDUwOV9yZWplY3RfY2xlYXIoWDUwOSAqeCkKK3sKKwlpZih4LT5hdXggJiYgeC0+YXV4LT5yZWplY3QpIHsKKwkJc2tfQVNOMV9PQkpFQ1RfcG9wX2ZyZWUoeC0+YXV4LT5yZWplY3QsIEFTTjFfT0JKRUNUX2ZyZWUpOworCQl4LT5hdXgtPnJlamVjdCA9IE5VTEw7CisJfQorfQorCitBU04xX1NFUVVFTkNFKFg1MDlfQ0VSVF9QQUlSKSA9IHsKKwlBU04xX0VYUF9PUFQoWDUwOV9DRVJUX1BBSVIsIGZvcndhcmQsIFg1MDksIDApLAorCUFTTjFfRVhQX09QVChYNTA5X0NFUlRfUEFJUiwgcmV2ZXJzZSwgWDUwOSwgMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoWDUwOV9DRVJUX1BBSVIpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhYNTA5X0NFUlRfUEFJUikKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9DT1BZUklHSFQgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmYvQ09QWVJJR0hUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTcyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmYvQ09QWVJJR0hUCkBAIC0wLDAgKzEsNDYgQEAKK0NvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworVGhpcyBwYWNrYWdlIGlzIGFuIEJsb3dmaXNoIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KK2J5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKworVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLgorCitDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgordGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKzEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKzMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKK0FOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCitGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKK09SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKK0xJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKK09VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKK1NVQ0ggREFNQUdFLgorCitUaGUgbGljZW5zZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCitjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RydWJ1dGlvbiBsaWNlbnNlCitbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2Vuc2UuXQorCitUaGUgcmVhc29uIGJlaGluZCB0aGlzIGJlaW5nIHN0YXRlZCBpbiB0aGlzIGRpcmVjdCBtYW5uZXIgaXMgcGFzdAorZXhwZXJpZW5jZSBpbiBjb2RlIHNpbXBseSBiZWluZyBjb3BpZWQgYW5kIHRoZSBhdHRyaWJ1dGlvbiByZW1vdmVkCitmcm9tIGl0IGFuZCB0aGVuIGJlaW5nIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2Ygb3RoZXIgcGFja2FnZXMuIFRoaXMKK2ltcGxlbWVudGF0aW9uIHdhcyBhIG5vbi10cml2aWFsIGFuZCB1bnBhaWQgZWZmb3J0LgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JmL2FzbS9iZi01ODYucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmYvYXNtL2JmLTU4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzRjZmJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JmL2FzbS9iZi01ODYucGwKQEAgLTAsMCArMSwxMzcgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworcmVxdWlyZSAiY2JjLnBsIjsKKworJmFzbV9pbml0KCRBUkdWWzBdLCJiZi01ODYucGwiLCRBUkdWWyQjQVJHVl0gZXEgIjM4NiIpOworCiskQkZfUk9VTkRTPTE2OworJEJGX09GRj0oJEJGX1JPVU5EUysyKSo0OworJEw9ImVkaSI7CiskUj0iZXNpIjsKKyRQPSJlYnAiOworJHRtcDE9ImVheCI7CiskdG1wMj0iZWJ4IjsKKyR0bXAzPSJlY3giOworJHRtcDQ9ImVkeCI7CisKKyZCRl9lbmNyeXB0KCJCRl9lbmNyeXB0IiwxKTsKKyZCRl9lbmNyeXB0KCJCRl9kZWNyeXB0IiwwKTsKKyZjYmMoIkJGX2NiY19lbmNyeXB0IiwiQkZfZW5jcnlwdCIsIkJGX2RlY3J5cHQiLDEsNCw1LDMsLTEsLTEpOworJmFzbV9maW5pc2goKTsKKworc3ViIEJGX2VuY3J5cHQKKwl7CisJbG9jYWwoJG5hbWUsJGVuYyk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW5fQigkbmFtZSwiIik7CisKKwkmY29tbWVudCgiIik7CisKKwkmcHVzaCgiZWJwIik7CisJJnB1c2goImVieCIpOworCSZtb3YoJHRtcDIsJndwYXJhbSgwKSk7CisJJm1vdigkUCwmd3BhcmFtKDEpKTsKKwkmcHVzaCgiZXNpIik7CisJJnB1c2goImVkaSIpOworCisJJmNvbW1lbnQoIkxvYWQgdGhlIDIgd29yZHMiKTsKKwkmbW92KCRMLCZEV1AoMCwkdG1wMiwiIiwwKSk7CisJJm1vdigkUiwmRFdQKDQsJHRtcDIsIiIsMCkpOworCisJJnhvcigJJHRtcDEsCSR0bXAxKTsKKworCSMgZW5jcnlwdGluZyBwYXJ0CisKKwlpZiAoJGVuYykKKwkJeworCQkgJm1vdigkdG1wMiwmRFdQKDAsJFAsIiIsMCkpOworCQkmeG9yKAkkdG1wMywJJHRtcDMpOworCisJCSZ4b3IoJEwsJHRtcDIpOworCQlmb3IgKCRpPTA7ICRpPCRCRl9ST1VORFM7ICRpKz0yKQorCQkJeworCQkJJmNvbW1lbnQoIiIpOworCQkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisJCQkmQkZfRU5DUllQVCgkaSsxLCRSLCRMLCRQLCR0bXAxLCR0bXAyLCR0bXAzLCR0bXA0LDEpOworCisJCQkmY29tbWVudCgiIik7CisJCQkmY29tbWVudCgiUm91bmQgIi5zcHJpbnRmKCIlZCIsJGkrMSkpOworCQkJJkJGX0VOQ1JZUFQoJGkrMiwkTCwkUiwkUCwkdG1wMSwkdG1wMiwkdG1wMywkdG1wNCwxKTsKKwkJCX0KKwkJIyAmbW92KCR0bXAxLCZ3cGFyYW0oMCkpOyBJbiBsYXN0IGxvb3AKKwkJJm1vdigkdG1wNCwmRFdQKCgkQkZfUk9VTkRTKzEpKjQsJFAsIiIsMCkpOworCQl9CisJZWxzZQorCQl7CisJCSAmbW92KCR0bXAyLCZEV1AoKCRCRl9ST1VORFMrMSkqNCwkUCwiIiwwKSk7CisJCSZ4b3IoCSR0bXAzLAkkdG1wMyk7CisKKwkJJnhvcigkTCwkdG1wMik7CisJCWZvciAoJGk9JEJGX1JPVU5EUzsgJGk+MDsgJGktPTIpCisJCQl7CisJCQkmY29tbWVudCgiIik7CisJCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKwkJCSZCRl9FTkNSWVBUKCRpLCRSLCRMLCRQLCR0bXAxLCR0bXAyLCR0bXAzLCR0bXA0LDApOworCQkJJmNvbW1lbnQoIiIpOworCQkJJmNvbW1lbnQoIlJvdW5kICIuc3ByaW50ZigiJWQiLCRpLTEpKTsKKwkJCSZCRl9FTkNSWVBUKCRpLTEsJEwsJFIsJFAsJHRtcDEsJHRtcDIsJHRtcDMsJHRtcDQsMCk7CisJCQl9CisJCSMgJm1vdigkdG1wMSwmd3BhcmFtKDApKTsgSW4gbGFzdCBsb29wCisJCSZtb3YoJHRtcDQsJkRXUCgwLCRQLCIiLDApKTsKKwkJfQorCisJJnhvcigkUiwkdG1wNCk7CisJJm1vdigmRFdQKDQsJHRtcDEsIiIsMCksJEwpOworCisJJm1vdigmRFdQKDAsJHRtcDEsIiIsMCksJFIpOworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKworc3ViIEJGX0VOQ1JZUFQKKwl7CisJbG9jYWwoJGksJEwsJFIsJFAsJHRtcDEsJHRtcDIsJHRtcDMsJHRtcDQsJGVuYyk9QF87CisKKwkmbW92KAkkdG1wNCwJCSZEV1AoJm4yYSgkaSo0KSwkUCwiIiwwKSk7ICMgZm9yIG5leHQgcm91bmQKKworCSZtb3YoCSR0bXAyLAkJJFIpOworCSZ4b3IoCSRMLAkJJHRtcDQpOworCisJJnNocigJJHRtcDIsCQkxNik7CisJJm1vdigJJHRtcDQsCQkkUik7CisKKwkmbW92YigJJkxCKCR0bXAxKSwJJkhCKCR0bXAyKSk7CSMgQQorCSZhbmQoCSR0bXAyLAkJMHhmZik7CQkjIEIKKworCSZtb3ZiKAkmTEIoJHRtcDMpLAkmSEIoJHRtcDQpKTsJIyBDCisJJmFuZCgJJHRtcDQsCQkweGZmKTsJCSMgRAorCisJJm1vdigJJHRtcDEsCQkmRFdQKCZuMmEoJEJGX09GRisweDAwMDApLCRQLCR0bXAxLDQpKTsKKwkmbW92KAkkdG1wMiwJCSZEV1AoJm4yYSgkQkZfT0ZGKzB4MDQwMCksJFAsJHRtcDIsNCkpOworCisJJmFkZCgJJHRtcDIsCQkkdG1wMSk7CisJJm1vdigJJHRtcDEsCQkmRFdQKCZuMmEoJEJGX09GRisweDA4MDApLCRQLCR0bXAzLDQpKTsKKworCSZ4b3IoCSR0bXAyLAkJJHRtcDEpOworCSZtb3YoCSR0bXA0LAkJJkRXUCgmbjJhKCRCRl9PRkYrMHgwQzAwKSwkUCwkdG1wNCw0KSk7CisKKwkmYWRkKAkkdG1wMiwJCSR0bXA0KTsKKwlpZiAoKCRlbmMgJiYgKCRpICE9IDE2KSkgfHwgKCghJGVuYykgJiYgKCRpICE9IDEpKSkKKwkJeyAmeG9yKAkkdG1wMSwJCSR0bXAxKTsgfQorCWVsc2UKKwkJeworCQkmY29tbWVudCgiTG9hZCBwYXJhbWV0ZXIgMCAoJGkpIGVuYz0kZW5jIik7CisJCSZtb3YoJHRtcDEsJndwYXJhbSgwKSk7CisJCX0gIyBJbiBsYXN0IGxvb3AKKworCSZ4b3IoCSRMLAkJJHRtcDIpOworCSMgZGVsYXkKKwl9CisKK3N1YiBuMmEKKwl7CisJc3ByaW50ZigiJWQiLCRfWzBdKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9hc20vYmYtNjg2LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2JmL2FzbS9iZi02ODYucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0YzI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9hc20vYmYtNjg2LnBsCkBAIC0wLDAgKzEsMTI3IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworcHVzaChASU5DLCJwZXJsYXNtIiwiLi4vLi4vcGVybGFzbSIpOworcmVxdWlyZSAieDg2YXNtLnBsIjsKK3JlcXVpcmUgImNiYy5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwiYmYtNjg2LnBsIik7CisKKyRCRl9ST1VORFM9MTY7CiskQkZfT0ZGPSgkQkZfUk9VTkRTKzIpKjQ7CiskTD0iZWN4IjsKKyRSPSJlZHgiOworJFA9ImVkaSI7CiskdG90PSJlc2kiOworJHRtcDE9ImVheCI7CiskdG1wMj0iZWJ4IjsKKyR0bXAzPSJlYnAiOworCismZGVzX2VuY3J5cHQoIkJGX2VuY3J5cHQiLDEpOworJmRlc19lbmNyeXB0KCJCRl9kZWNyeXB0IiwwKTsKKyZjYmMoIkJGX2NiY19lbmNyeXB0IiwiQkZfZW5jcnlwdCIsIkJGX2RlY3J5cHQiLDEsNCw1LDMsLTEsLTEpOworCismYXNtX2ZpbmlzaCgpOworCismZmlsZV9lbmQoKTsKKworc3ViIGRlc19lbmNyeXB0CisJeworCWxvY2FsKCRuYW1lLCRlbmMpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luKCRuYW1lLCIiKTsKKworCSZjb21tZW50KCIiKTsKKwkmY29tbWVudCgiTG9hZCB0aGUgMiB3b3JkcyIpOworCSZtb3YoImVheCIsJndwYXJhbSgwKSk7CisJJm1vdigkTCwmRFdQKDAsImVheCIsIiIsMCkpOworCSZtb3YoJFIsJkRXUCg0LCJlYXgiLCIiLDApKTsKKworCSZjb21tZW50KCIiKTsKKwkmY29tbWVudCgiUCBwb2ludGVyLCBzIGFuZCBlbmMgZmxhZyIpOworCSZtb3YoJFAsJndwYXJhbSgxKSk7CisKKwkmeG9yKAkkdG1wMSwJJHRtcDEpOworCSZ4b3IoCSR0bXAyLAkkdG1wMik7CisKKwkjIGVuY3J5cHRpbmcgcGFydAorCisJaWYgKCRlbmMpCisJCXsKKwkJJnhvcigkTCwmRFdQKDAsJFAsIiIsMCkpOworCQlmb3IgKCRpPTA7ICRpPCRCRl9ST1VORFM7ICRpKz0yKQorCQkJeworCQkJJmNvbW1lbnQoIiIpOworCQkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisJCQkmQkZfRU5DUllQVCgkaSsxLCRSLCRMLCRQLCR0b3QsJHRtcDEsJHRtcDIsJHRtcDMpOworCisJCQkmY29tbWVudCgiIik7CisJCQkmY29tbWVudCgiUm91bmQgIi5zcHJpbnRmKCIlZCIsJGkrMSkpOworCQkJJkJGX0VOQ1JZUFQoJGkrMiwkTCwkUiwkUCwkdG90LCR0bXAxLCR0bXAyLCR0bXAzKTsKKwkJCX0KKwkJJnhvcigkUiwmRFdQKCgkQkZfUk9VTkRTKzEpKjQsJFAsIiIsMCkpOworCisJCSZtb3YoImVheCIsJndwYXJhbSgwKSk7CisJCSZtb3YoJkRXUCgwLCJlYXgiLCIiLDApLCRSKTsKKwkJJm1vdigmRFdQKDQsImVheCIsIiIsMCksJEwpOworCQkmZnVuY3Rpb25fZW5kX0EoJG5hbWUpOworCQl9CisJZWxzZQorCQl7CisJCSZ4b3IoJEwsJkRXUCgoJEJGX1JPVU5EUysxKSo0LCRQLCIiLDApKTsKKwkJZm9yICgkaT0kQkZfUk9VTkRTOyAkaT4wOyAkaS09MikKKwkJCXsKKwkJCSZjb21tZW50KCIiKTsKKwkJCSZjb21tZW50KCJSb3VuZCAkaSIpOworCQkJJkJGX0VOQ1JZUFQoJGksJFIsJEwsJFAsJHRvdCwkdG1wMSwkdG1wMiwkdG1wMyk7CisJCQkmY29tbWVudCgiIik7CisJCQkmY29tbWVudCgiUm91bmQgIi5zcHJpbnRmKCIlZCIsJGktMSkpOworCQkJJkJGX0VOQ1JZUFQoJGktMSwkTCwkUiwkUCwkdG90LCR0bXAxLCR0bXAyLCR0bXAzKTsKKwkJCX0KKwkJJnhvcigkUiwmRFdQKDAsJFAsIiIsMCkpOworCisJCSZtb3YoImVheCIsJndwYXJhbSgwKSk7CisJCSZtb3YoJkRXUCgwLCJlYXgiLCIiLDApLCRSKTsKKwkJJm1vdigmRFdQKDQsImVheCIsIiIsMCksJEwpOworCQkmZnVuY3Rpb25fZW5kX0EoJG5hbWUpOworCQl9CisKKwkmZnVuY3Rpb25fZW5kX0IoJG5hbWUpOworCX0KKworc3ViIEJGX0VOQ1JZUFQKKwl7CisJbG9jYWwoJGksJEwsJFIsJFAsJHRvdCwkdG1wMSwkdG1wMiwkdG1wMyk9QF87CisKKwkmcm90cigJJFIsCQkxNik7CisJJm1vdigJJHRvdCwJCSZEV1AoJm4yYSgkaSo0KSwkUCwiIiwwKSk7CisKKwkmbW92YigJJkxCKCR0bXAxKSwJJkhCKCRSKSk7CisJJm1vdmIoCSZMQigkdG1wMiksCSZMQigkUikpOworCisJJnJvdHIoCSRSLAkJMTYpOworCSZ4b3IoCSRMLAkJJHRvdCk7CisKKwkmbW92KAkkdG90LAkJJkRXUCgmbjJhKCRCRl9PRkYrMHgwMDAwKSwkUCwkdG1wMSw0KSk7CisJJm1vdigJJHRtcDMsCQkmRFdQKCZuMmEoJEJGX09GRisweDA0MDApLCRQLCR0bXAyLDQpKTsKKworCSZtb3ZiKAkmTEIoJHRtcDEpLAkmSEIoJFIpKTsKKwkmbW92YigJJkxCKCR0bXAyKSwJJkxCKCRSKSk7CisKKwkmYWRkKAkkdG90LAkJJHRtcDMpOworCSZtb3YoCSR0bXAxLAkJJkRXUCgmbjJhKCRCRl9PRkYrMHgwODAwKSwkUCwkdG1wMSw0KSk7ICMgZGVsYXkKKworCSZ4b3IoCSR0b3QsCQkkdG1wMSk7CisJJm1vdigJJHRtcDMsCQkmRFdQKCZuMmEoJEJGX09GRisweDBDMDApLCRQLCR0bXAyLDQpKTsKKworCSZhZGQoCSR0b3QsCQkkdG1wMyk7CisJJnhvcigJJHRtcDEsCQkkdG1wMSk7CisKKwkmeG9yKAkkTCwJCSR0b3QpOwkJCQkJCisJIyBkZWxheQorCX0KKworc3ViIG4yYQorCXsKKwlzcHJpbnRmKCIlZCIsJF9bMF0pOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX2NmYjY0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmYvYmZfY2ZiNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDUxYzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX2NmYjY0LmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIGNyeXB0by9iZi9iZl9jZmI2NC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jsb3dmaXNoLmg+CisjaW5jbHVkZSAiYmZfbG9jbC5oIgorCisvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBlbmNyeXB0ZWQgYXMgdGhvdWdoIDY0Yml0IGNmYiBtb2RlIGlzIGJlaW5nCisgKiB1c2VkLiAgVGhlIGV4dHJhIHN0YXRlIGluZm9ybWF0aW9uIHRvIHJlY29yZCBob3cgbXVjaCBvZiB0aGUKKyAqIDY0Yml0IGJsb2NrIHdlIGhhdmUgdXNlZCBpcyBjb250YWluZWQgaW4gKm51bTsKKyAqLworCit2b2lkIEJGX2NmYjY0X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwgbG9uZyBsZW5ndGgsCisJICAgICBjb25zdCBCRl9LRVkgKnNjaGVkdWxlLCB1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSwgaW50IGVuY3J5cHQpCisJeworCXJlZ2lzdGVyIEJGX0xPTkcgdjAsdjEsdDsKKwlyZWdpc3RlciBpbnQgbj0gKm51bTsKKwlyZWdpc3RlciBsb25nIGw9bGVuZ3RoOworCUJGX0xPTkcgdGlbMl07CisJdW5zaWduZWQgY2hhciAqaXYsYyxjYzsKKworCWl2PSh1bnNpZ25lZCBjaGFyICopaXZlYzsKKwlpZiAoZW5jcnlwdCkKKwkJeworCQl3aGlsZSAobC0tKQorCQkJeworCQkJaWYgKG4gPT0gMCkKKwkJCQl7CisJCQkJbjJsKGl2LHYwKTsgdGlbMF09djA7CisJCQkJbjJsKGl2LHYxKTsgdGlbMV09djE7CisJCQkJQkZfZW5jcnlwdCgoQkZfTE9ORyAqKXRpLHNjaGVkdWxlKTsKKwkJCQlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJCQkJdD10aVswXTsgbDJuKHQsaXYpOworCQkJCXQ9dGlbMV07IGwybih0LGl2KTsKKwkJCQlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJCQkJfQorCQkJYz0gKihpbisrKV5pdltuXTsKKwkJCSoob3V0KyspPWM7CisJCQlpdltuXT1jOworCQkJbj0obisxKSYweDA3OworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCXdoaWxlIChsLS0pCisJCQl7CisJCQlpZiAobiA9PSAwKQorCQkJCXsKKwkJCQluMmwoaXYsdjApOyB0aVswXT12MDsKKwkJCQluMmwoaXYsdjEpOyB0aVsxXT12MTsKKwkJCQlCRl9lbmNyeXB0KChCRl9MT05HICopdGksc2NoZWR1bGUpOworCQkJCWl2PSh1bnNpZ25lZCBjaGFyICopaXZlYzsKKwkJCQl0PXRpWzBdOyBsMm4odCxpdik7CisJCQkJdD10aVsxXTsgbDJuKHQsaXYpOworCQkJCWl2PSh1bnNpZ25lZCBjaGFyICopaXZlYzsKKwkJCQl9CisJCQljYz0gKihpbisrKTsKKwkJCWM9aXZbbl07CisJCQlpdltuXT1jYzsKKwkJCSoob3V0KyspPWNeY2M7CisJCQluPShuKzEpJjB4MDc7CisJCQl9CisJCX0KKwl2MD12MT10aVswXT10aVsxXT10PWM9Y2M9MDsKKwkqbnVtPW47CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmYvYmZfZWNiLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmYvYmZfZWNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwN2NlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9iZl9lY2IuYwpAQCAtMCwwICsxLDk2IEBACisvKiBjcnlwdG8vYmYvYmZfZWNiLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYmxvd2Zpc2guaD4KKyNpbmNsdWRlICJiZl9sb2NsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorCisvKiBCbG93ZmlzaCBhcyBpbXBsZW1lbnRlZCBmcm9tICdCbG93ZmlzaDogU3ByaW5nZXItVmVybGFnIHBhcGVyJworICogKEZyb20gTEVDVFVSRSBOT1RFUyBJTiBDT01QVVRFUiBTQ0lFTkNFIDgwOSwgRkFTVCBTT0ZUV0FSRSBFTkNSWVBUSU9OLAorICogQ0FNQlJJREdFIFNFQ1VSSVRZIFdPUktTSE9QLCBDQU1CUklER0UsIFUuSy4sIERFQ0VNQkVSIDktMTEsIDE5OTMpCisgKi8KKworY29uc3QgY2hhciBCRl92ZXJzaW9uW109IkJsb3dmaXNoIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKK2NvbnN0IGNoYXIgKkJGX29wdGlvbnModm9pZCkKKwl7CisjaWZkZWYgQkZfUFRSCisJcmV0dXJuKCJibG93ZmlzaChwdHIpIik7CisjZWxpZiBkZWZpbmVkKEJGX1BUUjIpCisJcmV0dXJuKCJibG93ZmlzaChwdHIyKSIpOworI2Vsc2UKKwlyZXR1cm4oImJsb3dmaXNoKGlkeCkiKTsKKyNlbmRpZgorCX0KKwordm9pZCBCRl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCSAgICAgY29uc3QgQkZfS0VZICprZXksIGludCBlbmNyeXB0KQorCXsKKwlCRl9MT05HIGwsZFsyXTsKKworCW4ybChpbixsKTsgZFswXT1sOworCW4ybChpbixsKTsgZFsxXT1sOworCWlmIChlbmNyeXB0KQorCQlCRl9lbmNyeXB0KGQsa2V5KTsKKwllbHNlCisJCUJGX2RlY3J5cHQoZCxrZXkpOworCWw9ZFswXTsgbDJuKGwsb3V0KTsKKwlsPWRbMV07IGwybihsLG91dCk7CisJbD1kWzBdPWRbMV09MDsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9iZl9lbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9iZl9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDIxZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX2VuYy5jCkBAIC0wLDAgKzEsMzA2IEBACisvKiBjcnlwdG8vYmYvYmZfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvYmxvd2Zpc2guaD4KKyNpbmNsdWRlICJiZl9sb2NsLmgiCisKKy8qIEJsb3dmaXNoIGFzIGltcGxlbWVudGVkIGZyb20gJ0Jsb3dmaXNoOiBTcHJpbmdlci1WZXJsYWcgcGFwZXInCisgKiAoRnJvbSBMRUNUVVJFIE5PVEVTIElOIENPTVBVVEVSIFNDSUVOQ0UgODA5LCBGQVNUIFNPRlRXQVJFIEVOQ1JZUFRJT04sCisgKiBDQU1CUklER0UgU0VDVVJJVFkgV09SS1NIT1AsIENBTUJSSURHRSwgVS5LLiwgREVDRU1CRVIgOS0xMSwgMTk5MykKKyAqLworCisjaWYgKEJGX1JPVU5EUyAhPSAxNikgJiYgKEJGX1JPVU5EUyAhPSAyMCkKKyNlcnJvciBJZiB5b3Ugc2V0IEJGX1JPVU5EUyB0byBzb21lIHZhbHVlIG90aGVyIHRoYW4gMTYgb3IgMjAsIHlvdSB3aWxsIGhhdmUgXAordG8gbW9kaWZ5IHRoZSBjb2RlLgorI2VuZGlmCisKK3ZvaWQgQkZfZW5jcnlwdChCRl9MT05HICpkYXRhLCBjb25zdCBCRl9LRVkgKmtleSkKKwl7CisjaWZuZGVmIEJGX1BUUjIKKwlyZWdpc3RlciBCRl9MT05HIGwscjsKKwlyZWdpc3RlciBjb25zdCBCRl9MT05HICpwLCpzOworCisJcD1rZXktPlA7CisJcz0gJihrZXktPlNbMF0pOworCWw9ZGF0YVswXTsKKwlyPWRhdGFbMV07CisKKwlsXj1wWzBdOworCUJGX0VOQyhyLGwscyxwWyAxXSk7CisJQkZfRU5DKGwscixzLHBbIDJdKTsKKwlCRl9FTkMocixsLHMscFsgM10pOworCUJGX0VOQyhsLHIscyxwWyA0XSk7CisJQkZfRU5DKHIsbCxzLHBbIDVdKTsKKwlCRl9FTkMobCxyLHMscFsgNl0pOworCUJGX0VOQyhyLGwscyxwWyA3XSk7CisJQkZfRU5DKGwscixzLHBbIDhdKTsKKwlCRl9FTkMocixsLHMscFsgOV0pOworCUJGX0VOQyhsLHIscyxwWzEwXSk7CisJQkZfRU5DKHIsbCxzLHBbMTFdKTsKKwlCRl9FTkMobCxyLHMscFsxMl0pOworCUJGX0VOQyhyLGwscyxwWzEzXSk7CisJQkZfRU5DKGwscixzLHBbMTRdKTsKKwlCRl9FTkMocixsLHMscFsxNV0pOworCUJGX0VOQyhsLHIscyxwWzE2XSk7CisjaWYgQkZfUk9VTkRTID09IDIwCisJQkZfRU5DKHIsbCxzLHBbMTddKTsKKwlCRl9FTkMobCxyLHMscFsxOF0pOworCUJGX0VOQyhyLGwscyxwWzE5XSk7CisJQkZfRU5DKGwscixzLHBbMjBdKTsKKyNlbmRpZgorCXJePXBbQkZfUk9VTkRTKzFdOworCisJZGF0YVsxXT1sJjB4ZmZmZmZmZmZMOworCWRhdGFbMF09ciYweGZmZmZmZmZmTDsKKyNlbHNlCisJcmVnaXN0ZXIgQkZfTE9ORyBsLHIsdCwqazsKKworCWw9ZGF0YVswXTsKKwlyPWRhdGFbMV07CisJaz0oQkZfTE9ORyopa2V5OworCisJbF49a1swXTsKKwlCRl9FTkMocixsLGssIDEpOworCUJGX0VOQyhsLHIsaywgMik7CisJQkZfRU5DKHIsbCxrLCAzKTsKKwlCRl9FTkMobCxyLGssIDQpOworCUJGX0VOQyhyLGwsaywgNSk7CisJQkZfRU5DKGwscixrLCA2KTsKKwlCRl9FTkMocixsLGssIDcpOworCUJGX0VOQyhsLHIsaywgOCk7CisJQkZfRU5DKHIsbCxrLCA5KTsKKwlCRl9FTkMobCxyLGssMTApOworCUJGX0VOQyhyLGwsaywxMSk7CisJQkZfRU5DKGwscixrLDEyKTsKKwlCRl9FTkMocixsLGssMTMpOworCUJGX0VOQyhsLHIsaywxNCk7CisJQkZfRU5DKHIsbCxrLDE1KTsKKwlCRl9FTkMobCxyLGssMTYpOworI2lmIEJGX1JPVU5EUyA9PSAyMAorCUJGX0VOQyhyLGwsaywxNyk7CisJQkZfRU5DKGwscixrLDE4KTsKKwlCRl9FTkMocixsLGssMTkpOworCUJGX0VOQyhsLHIsaywyMCk7CisjZW5kaWYKKwlyXj1rW0JGX1JPVU5EUysxXTsKKworCWRhdGFbMV09bCYweGZmZmZmZmZmTDsKKwlkYXRhWzBdPXImMHhmZmZmZmZmZkw7CisjZW5kaWYKKwl9CisKKyNpZm5kZWYgQkZfREVGQVVMVF9PUFRJT05TCisKK3ZvaWQgQkZfZGVjcnlwdChCRl9MT05HICpkYXRhLCBjb25zdCBCRl9LRVkgKmtleSkKKwl7CisjaWZuZGVmIEJGX1BUUjIKKwlyZWdpc3RlciBCRl9MT05HIGwscjsKKwlyZWdpc3RlciBjb25zdCBCRl9MT05HICpwLCpzOworCisJcD1rZXktPlA7CisJcz0gJihrZXktPlNbMF0pOworCWw9ZGF0YVswXTsKKwlyPWRhdGFbMV07CisKKwlsXj1wW0JGX1JPVU5EUysxXTsKKyNpZiBCRl9ST1VORFMgPT0gMjAKKwlCRl9FTkMocixsLHMscFsyMF0pOworCUJGX0VOQyhsLHIscyxwWzE5XSk7CisJQkZfRU5DKHIsbCxzLHBbMThdKTsKKwlCRl9FTkMobCxyLHMscFsxN10pOworI2VuZGlmCisJQkZfRU5DKHIsbCxzLHBbMTZdKTsKKwlCRl9FTkMobCxyLHMscFsxNV0pOworCUJGX0VOQyhyLGwscyxwWzE0XSk7CisJQkZfRU5DKGwscixzLHBbMTNdKTsKKwlCRl9FTkMocixsLHMscFsxMl0pOworCUJGX0VOQyhsLHIscyxwWzExXSk7CisJQkZfRU5DKHIsbCxzLHBbMTBdKTsKKwlCRl9FTkMobCxyLHMscFsgOV0pOworCUJGX0VOQyhyLGwscyxwWyA4XSk7CisJQkZfRU5DKGwscixzLHBbIDddKTsKKwlCRl9FTkMocixsLHMscFsgNl0pOworCUJGX0VOQyhsLHIscyxwWyA1XSk7CisJQkZfRU5DKHIsbCxzLHBbIDRdKTsKKwlCRl9FTkMobCxyLHMscFsgM10pOworCUJGX0VOQyhyLGwscyxwWyAyXSk7CisJQkZfRU5DKGwscixzLHBbIDFdKTsKKwlyXj1wWzBdOworCisJZGF0YVsxXT1sJjB4ZmZmZmZmZmZMOworCWRhdGFbMF09ciYweGZmZmZmZmZmTDsKKyNlbHNlCisJcmVnaXN0ZXIgQkZfTE9ORyBsLHIsdCwqazsKKworCWw9ZGF0YVswXTsKKwlyPWRhdGFbMV07CisJaz0oQkZfTE9ORyAqKWtleTsKKworCWxePWtbQkZfUk9VTkRTKzFdOworI2lmIEJGX1JPVU5EUyA9PSAyMAorCUJGX0VOQyhyLGwsaywyMCk7CisJQkZfRU5DKGwscixrLDE5KTsKKwlCRl9FTkMocixsLGssMTgpOworCUJGX0VOQyhsLHIsaywxNyk7CisjZW5kaWYKKwlCRl9FTkMocixsLGssMTYpOworCUJGX0VOQyhsLHIsaywxNSk7CisJQkZfRU5DKHIsbCxrLDE0KTsKKwlCRl9FTkMobCxyLGssMTMpOworCUJGX0VOQyhyLGwsaywxMik7CisJQkZfRU5DKGwscixrLDExKTsKKwlCRl9FTkMocixsLGssMTApOworCUJGX0VOQyhsLHIsaywgOSk7CisJQkZfRU5DKHIsbCxrLCA4KTsKKwlCRl9FTkMobCxyLGssIDcpOworCUJGX0VOQyhyLGwsaywgNik7CisJQkZfRU5DKGwscixrLCA1KTsKKwlCRl9FTkMocixsLGssIDQpOworCUJGX0VOQyhsLHIsaywgMyk7CisJQkZfRU5DKHIsbCxrLCAyKTsKKwlCRl9FTkMobCxyLGssIDEpOworCXJePWtbMF07CisKKwlkYXRhWzFdPWwmMHhmZmZmZmZmZkw7CisJZGF0YVswXT1yJjB4ZmZmZmZmZmZMOworI2VuZGlmCisJfQorCit2b2lkIEJGX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCSAgICAgY29uc3QgQkZfS0VZICpzY2hlZHVsZSwgdW5zaWduZWQgY2hhciAqaXZlYywgaW50IGVuY3J5cHQpCisJeworCXJlZ2lzdGVyIEJGX0xPTkcgdGluMCx0aW4xOworCXJlZ2lzdGVyIEJGX0xPTkcgdG91dDAsdG91dDEseG9yMCx4b3IxOworCXJlZ2lzdGVyIGxvbmcgbD1sZW5ndGg7CisJQkZfTE9ORyB0aW5bMl07CisKKwlpZiAoZW5jcnlwdCkKKwkJeworCQluMmwoaXZlYyx0b3V0MCk7CisJCW4ybChpdmVjLHRvdXQxKTsKKwkJaXZlYy09ODsKKwkJZm9yIChsLT04OyBsPj0wOyBsLT04KQorCQkJeworCQkJbjJsKGluLHRpbjApOworCQkJbjJsKGluLHRpbjEpOworCQkJdGluMF49dG91dDA7CisJCQl0aW4xXj10b3V0MTsKKwkJCXRpblswXT10aW4wOworCQkJdGluWzFdPXRpbjE7CisJCQlCRl9lbmNyeXB0KHRpbixzY2hlZHVsZSk7CisJCQl0b3V0MD10aW5bMF07CisJCQl0b3V0MT10aW5bMV07CisJCQlsMm4odG91dDAsb3V0KTsKKwkJCWwybih0b3V0MSxvdXQpOworCQkJfQorCQlpZiAobCAhPSAtOCkKKwkJCXsKKwkJCW4ybG4oaW4sdGluMCx0aW4xLGwrOCk7CisJCQl0aW4wXj10b3V0MDsKKwkJCXRpbjFePXRvdXQxOworCQkJdGluWzBdPXRpbjA7CisJCQl0aW5bMV09dGluMTsKKwkJCUJGX2VuY3J5cHQodGluLHNjaGVkdWxlKTsKKwkJCXRvdXQwPXRpblswXTsKKwkJCXRvdXQxPXRpblsxXTsKKwkJCWwybih0b3V0MCxvdXQpOworCQkJbDJuKHRvdXQxLG91dCk7CisJCQl9CisJCWwybih0b3V0MCxpdmVjKTsKKwkJbDJuKHRvdXQxLGl2ZWMpOworCQl9CisJZWxzZQorCQl7CisJCW4ybChpdmVjLHhvcjApOworCQluMmwoaXZlYyx4b3IxKTsKKwkJaXZlYy09ODsKKwkJZm9yIChsLT04OyBsPj0wOyBsLT04KQorCQkJeworCQkJbjJsKGluLHRpbjApOworCQkJbjJsKGluLHRpbjEpOworCQkJdGluWzBdPXRpbjA7CisJCQl0aW5bMV09dGluMTsKKwkJCUJGX2RlY3J5cHQodGluLHNjaGVkdWxlKTsKKwkJCXRvdXQwPXRpblswXV54b3IwOworCQkJdG91dDE9dGluWzFdXnhvcjE7CisJCQlsMm4odG91dDAsb3V0KTsKKwkJCWwybih0b3V0MSxvdXQpOworCQkJeG9yMD10aW4wOworCQkJeG9yMT10aW4xOworCQkJfQorCQlpZiAobCAhPSAtOCkKKwkJCXsKKwkJCW4ybChpbix0aW4wKTsKKwkJCW4ybChpbix0aW4xKTsKKwkJCXRpblswXT10aW4wOworCQkJdGluWzFdPXRpbjE7CisJCQlCRl9kZWNyeXB0KHRpbixzY2hlZHVsZSk7CisJCQl0b3V0MD10aW5bMF1eeG9yMDsKKwkJCXRvdXQxPXRpblsxXV54b3IxOworCQkJbDJubih0b3V0MCx0b3V0MSxvdXQsbCs4KTsKKwkJCXhvcjA9dGluMDsKKwkJCXhvcjE9dGluMTsKKwkJCX0KKwkJbDJuKHhvcjAsaXZlYyk7CisJCWwybih4b3IxLGl2ZWMpOworCQl9CisJdGluMD10aW4xPXRvdXQwPXRvdXQxPXhvcjA9eG9yMT0wOworCXRpblswXT10aW5bMV09MDsKKwl9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9iZl9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3YzNlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9iZl9sb2NsLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8qIGNyeXB0by9iZi9iZl9sb2NsLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfQkZfTE9DTF9ICisjZGVmaW5lIEhFQURFUl9CRl9MT0NMX0gKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+IC8qIEJGX1BUUiwgQkZfUFRSMiAqLworCisjdW5kZWYgYzJsCisjZGVmaW5lIGMybChjLGwpCShsID0oKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSkgICAgLCBcCisJCQkgbHw9KCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwgOEwsIFwKKwkJCSBsfD0oKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PDE2TCwgXAorCQkJIGx8PSgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8MjRMKQorCisvKiBOT1RFIC0gYyBpcyBub3QgaW5jcmVtZW50ZWQgYXMgcGVyIGMybCAqLworI3VuZGVmIGMybG4KKyNkZWZpbmUgYzJsbihjLGwxLGwyLG4pCXsgXAorCQkJYys9bjsgXAorCQkJbDE9bDI9MDsgXAorCQkJc3dpdGNoIChuKSB7IFwKKwkJCWNhc2UgODogbDIgPSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MjRMOyBcCisJCQljYXNlIDc6IGwyfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PDE2TDsgXAorCQkJY2FzZSA2OiBsMnw9KCh1bnNpZ25lZCBsb25nKSgqKC0tKGMpKSkpPDwgOEw7IFwKKwkJCWNhc2UgNTogbDJ8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTsgICAgIFwKKwkJCWNhc2UgNDogbDEgPSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MjRMOyBcCisJCQljYXNlIDM6IGwxfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PDE2TDsgXAorCQkJY2FzZSAyOiBsMXw9KCh1bnNpZ25lZCBsb25nKSgqKC0tKGMpKSkpPDwgOEw7IFwKKwkJCWNhc2UgMTogbDF8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTsgICAgIFwKKwkJCQl9IFwKKwkJCX0KKworI3VuZGVmIGwyYworI2RlZmluZSBsMmMobCxjKQkoKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCkgICAgICkmMHhmZiksIFwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+IDhMKSYweGZmKSwgXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4xNkwpJjB4ZmYpLCBcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjI0TCkmMHhmZikpCisKKy8qIE5PVEUgLSBjIGlzIG5vdCBpbmNyZW1lbnRlZCBhcyBwZXIgbDJjICovCisjdW5kZWYgbDJjbgorI2RlZmluZSBsMmNuKGwxLGwyLGMsbikJeyBcCisJCQljKz1uOyBcCisJCQlzd2l0Y2ggKG4pIHsgXAorCQkJY2FzZSA4OiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMik+PjI0TCkmMHhmZik7IFwKKwkJCWNhc2UgNzogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDIpPj4xNkwpJjB4ZmYpOyBcCisJCQljYXNlIDY6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+IDhMKSYweGZmKTsgXAorCQkJY2FzZSA1OiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMikgICAgICkmMHhmZik7IFwKKwkJCWNhc2UgNDogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDEpPj4yNEwpJjB4ZmYpOyBcCisJCQljYXNlIDM6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+MTZMKSYweGZmKTsgXAorCQkJY2FzZSAyOiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMSk+PiA4TCkmMHhmZik7IFwKKwkJCWNhc2UgMTogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDEpICAgICApJjB4ZmYpOyBcCisJCQkJfSBcCisJCQl9CisKKy8qIE5PVEUgLSBjIGlzIG5vdCBpbmNyZW1lbnRlZCBhcyBwZXIgbjJsICovCisjZGVmaW5lIG4ybG4oYyxsMSxsMixuKQl7IFwKKwkJCWMrPW47IFwKKwkJCWwxPWwyPTA7IFwKKwkJCXN3aXRjaCAobikgeyBcCisJCQljYXNlIDg6IGwyID0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSkgICAgOyBcCisJCQljYXNlIDc6IGwyfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PCA4OyBcCisJCQljYXNlIDY6IGwyfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PDE2OyBcCisJCQljYXNlIDU6IGwyfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PDI0OyBcCisJCQljYXNlIDQ6IGwxID0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSkgICAgOyBcCisJCQljYXNlIDM6IGwxfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PCA4OyBcCisJCQljYXNlIDI6IGwxfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PDE2OyBcCisJCQljYXNlIDE6IGwxfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PDI0OyBcCisJCQkJfSBcCisJCQl9CisKKy8qIE5PVEUgLSBjIGlzIG5vdCBpbmNyZW1lbnRlZCBhcyBwZXIgbDJuICovCisjZGVmaW5lIGwybm4obDEsbDIsYyxuKQl7IFwKKwkJCWMrPW47IFwKKwkJCXN3aXRjaCAobikgeyBcCisJCQljYXNlIDg6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKSAgICApJjB4ZmYpOyBcCisJCQljYXNlIDc6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+IDgpJjB4ZmYpOyBcCisJCQljYXNlIDY6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+MTYpJjB4ZmYpOyBcCisJCQljYXNlIDU6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+MjQpJjB4ZmYpOyBcCisJCQljYXNlIDQ6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKSAgICApJjB4ZmYpOyBcCisJCQljYXNlIDM6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+IDgpJjB4ZmYpOyBcCisJCQljYXNlIDI6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+MTYpJjB4ZmYpOyBcCisJCQljYXNlIDE6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+MjQpJjB4ZmYpOyBcCisJCQkJfSBcCisJCQl9CisKKyN1bmRlZiBuMmwKKyNkZWZpbmUgbjJsKGMsbCkgICAgICAgIChsID0oKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PDI0TCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGx8PSgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8MTZMLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgbHw9KCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwgOEwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsfD0oKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSkpCisKKyN1bmRlZiBsMm4KKyNkZWZpbmUgbDJuKGwsYykgICAgICAgICgqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MjRMKSYweGZmKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4xNkwpJjB4ZmYpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PiA4TCkmMHhmZiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKSAgICAgKSYweGZmKSkKKworLyogVGhpcyBpcyBhY3R1YWxseSBhIGJpZyBlbmRpYW4gYWxnb3JpdGhtLCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlCisgKiBpcyB1c2VkIHRvIGxvb2t1cCBhcnJheSAwICovCisKKyNpZiBkZWZpbmVkKEJGX1BUUjIpCisKKy8qCisgKiBUaGlzIGlzIGJhc2ljYWxseSBhIHNwZWNpYWwgSW50ZWwgdmVyc2lvbi4gUG9pbnQgaXMgdGhhdCBJbnRlbAorICogZG9lc24ndCBoYXZlIG1hbnkgcmVnaXN0ZXJzLCBidXQgb2ZmZXJzIGEgcmVhY2ggY2hvaWNlIG9mIGFkZHJlc3NpbmcKKyAqIG1vZGVzLiBTbyB3ZSBzcGFyZSBzb21lIHJlZ2lzdGVycyBieSBkaXJlY3RseSB0cmF2ZXJzaW5nIEJGX0tFWQorICogc3RydWN0dXJlIGFuZCBoaXJpbmcgdGhlIG1vc3QgZGVjb3JhdGVkIGFkZHJlc3NpbmcgbW9kZS4gVGhlIGNvZGUKKyAqIGdlbmVyYXRlZCBieSBFR0NTIGlzICpwZXJmZWN0bHkqIGNvbXBldGl0aXZlIHdpdGggYXNzZW1ibGVyCisgKiBpbXBsZW1lbnRhdGlvbiEKKyAqLworI2RlZmluZSBCRl9FTkMoTEwsUixLRVksUGkpIChcCisJTExePUtFWVtQaV0sIFwKKwl0PSAgS0VZW0JGX1JPVU5EUysyICsgICAwICsgKChSPj4yNCkmMHhGRildLCBcCisJdCs9IEtFWVtCRl9ST1VORFMrMiArIDI1NiArICgoUj4+MTYpJjB4RkYpXSwgXAorCXRePSBLRVlbQkZfUk9VTkRTKzIgKyA1MTIgKyAoKFI+PjggKSYweEZGKV0sIFwKKwl0Kz0gS0VZW0JGX1JPVU5EUysyICsgNzY4ICsgKChSICAgICkmMHhGRildLCBcCisJTExePXQgXAorCSkKKworI2VsaWYgZGVmaW5lZChCRl9QVFIpCisKKyNpZm5kZWYgQkZfTE9OR19MT0cyCisjZGVmaW5lIEJGX0xPTkdfTE9HMiAgMiAgICAgICAvKiBkZWZhdWx0IHRvIEJGX0xPTkcgYmVpbmcgMzIgYml0cyAqLworI2VuZGlmCisjZGVmaW5lIEJGX00gICgweEZGPDxCRl9MT05HX0xPRzIpCisjZGVmaW5lIEJGXzAgICgyNC1CRl9MT05HX0xPRzIpCisjZGVmaW5lIEJGXzEgICgxNi1CRl9MT05HX0xPRzIpCisjZGVmaW5lIEJGXzIgICggOC1CRl9MT05HX0xPRzIpCisjZGVmaW5lIEJGXzMgIEJGX0xPTkdfTE9HMiAvKiBsZWZ0IHNoaWZ0ICovCisKKy8qCisgKiBUaGlzIGlzIG5vcm1hbGx5IHZlcnkgZ29vZCBvbiBSSVNDIHBsYXRmb3JtcyB3aGVyZSBub3JtYWxseSB5b3UKKyAqIGhhdmUgdG8gZXhwbGljaXRseSAibXVsdGlwbHkiIGFycmF5IGluZGV4IGJ5IHNpemVvZihCRl9MT05HKQorICogaW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBlZmZlY3RpdmUgYWRkcmVzcy4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogZXhjdXNlcyBDUFUgZnJvbSB0aGlzIGV4dHJhIHdvcmsuIFBvd2VyW1BDXSB1c2VzIHNob3VsZCBoYXZlIG1vc3QKKyAqIGZ1biBhcyAoUj4+QkZfaSkmQkZfTSBnZXRzIGZvbGRlZCBpbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uLCBuYW1lbHkKKyAqIHJsd2lubS4gU28gbGV0J2VtIGRvdWJsZS1jaGVjayBpZiB0aGVpciBjb21waWxlciBkb2VzIGl0LgorICovCisKKyNkZWZpbmUgQkZfRU5DKExMLFIsUyxQKSAoIFwKKwlMTF49UCwgXAorCUxMXj0gKCgoKihCRl9MT05HICopKCh1bnNpZ25lZCBjaGFyICopJihTWyAgMF0pKygoUj4+QkZfMCkmQkZfTSkpKyBcCisJCSooQkZfTE9ORyAqKSgodW5zaWduZWQgY2hhciAqKSYoU1syNTZdKSsoKFI+PkJGXzEpJkJGX00pKSleIFwKKwkJKihCRl9MT05HICopKCh1bnNpZ25lZCBjaGFyICopJihTWzUxMl0pKygoUj4+QkZfMikmQkZfTSkpKSsgXAorCQkqKEJGX0xPTkcgKikoKHVuc2lnbmVkIGNoYXIgKikmKFNbNzY4XSkrKChSPDxCRl8zKSZCRl9NKSkpIFwKKwkpCisjZWxzZQorCisvKgorICogVGhpcyBpcyBhICpnZW5lcmljKiB2ZXJzaW9uLiBTZWVtIHRvIHBlcmZvcm0gYmVzdCBvbiBwbGF0Zm9ybXMgdGhhdAorICogb2ZmZXIgZXhwbGljaXQgc3VwcG9ydCBmb3IgZXh0cmFjdGlvbiBvZiA4LWJpdCBuaWJibGVzIHByZWZlcmFibHkKKyAqIGNvbXBsZW1lbnRlZCB3aXRoICJtdWx0aXBseWluZyIgb2YgYXJyYXkgaW5kZXggYnkgc2l6ZW9mKEJGX0xPTkcpLgorICogRm9yIHRoZSBtb21lbnQgb2YgdGhpcyB3cml0aW5nIHRoZSBsaXN0IGNvbXByaXNlcyBBbHBoYSBDUFUgZmVhdHVyaW5nCisgKiBleHRibCBhbmQgc1s0OF1hZGRxIGluc3RydWN0aW9ucy4KKyAqLworCisjZGVmaW5lIEJGX0VOQyhMTCxSLFMsUCkgKCBcCisJTExePVAsIFwKKwlMTF49KCgoCVNbICAgICAgICgoaW50KShSPj4yNCkmMHhmZildICsgXAorCQlTWzB4MDEwMCsoKGludCkoUj4+MTYpJjB4ZmYpXSleIFwKKwkJU1sweDAyMDArKChpbnQpKFI+PiA4KSYweGZmKV0pKyBcCisJCVNbMHgwMzAwKygoaW50KShSICAgICkmMHhmZildKSYweGZmZmZmZmZmTCBcCisJKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX29mYjY0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmYvYmZfb2ZiNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmE5ZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX29mYjY0LmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIGNyeXB0by9iZi9iZl9vZmI2NC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jsb3dmaXNoLmg+CisjaW5jbHVkZSAiYmZfbG9jbC5oIgorCisvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBlbmNyeXB0ZWQgYXMgdGhvdWdoIDY0Yml0IG9mYiBtb2RlIGlzIGJlaW5nCisgKiB1c2VkLiAgVGhlIGV4dHJhIHN0YXRlIGluZm9ybWF0aW9uIHRvIHJlY29yZCBob3cgbXVjaCBvZiB0aGUKKyAqIDY0Yml0IGJsb2NrIHdlIGhhdmUgdXNlZCBpcyBjb250YWluZWQgaW4gKm51bTsKKyAqLwordm9pZCBCRl9vZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCSAgICAgY29uc3QgQkZfS0VZICpzY2hlZHVsZSwgdW5zaWduZWQgY2hhciAqaXZlYywgaW50ICpudW0pCisJeworCXJlZ2lzdGVyIEJGX0xPTkcgdjAsdjEsdDsKKwlyZWdpc3RlciBpbnQgbj0gKm51bTsKKwlyZWdpc3RlciBsb25nIGw9bGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgZFs4XTsKKwlyZWdpc3RlciBjaGFyICpkcDsKKwlCRl9MT05HIHRpWzJdOworCXVuc2lnbmVkIGNoYXIgKml2OworCWludCBzYXZlPTA7CisKKwlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJbjJsKGl2LHYwKTsKKwluMmwoaXYsdjEpOworCXRpWzBdPXYwOworCXRpWzFdPXYxOworCWRwPShjaGFyICopZDsKKwlsMm4odjAsZHApOworCWwybih2MSxkcCk7CisJd2hpbGUgKGwtLSkKKwkJeworCQlpZiAobiA9PSAwKQorCQkJeworCQkJQkZfZW5jcnlwdCgoQkZfTE9ORyAqKXRpLHNjaGVkdWxlKTsKKwkJCWRwPShjaGFyICopZDsKKwkJCXQ9dGlbMF07IGwybih0LGRwKTsKKwkJCXQ9dGlbMV07IGwybih0LGRwKTsKKwkJCXNhdmUrKzsKKwkJCX0KKwkJKihvdXQrKyk9ICooaW4rKyleZFtuXTsKKwkJbj0obisxKSYweDA3OworCQl9CisJaWYgKHNhdmUpCisJCXsKKwkJdjA9dGlbMF07CisJCXYxPXRpWzFdOworCQlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJCWwybih2MCxpdik7CisJCWwybih2MSxpdik7CisJCX0KKwl0PXYwPXYxPXRpWzBdPXRpWzFdPTA7CisJKm51bT1uOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX3BpLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vYmYvYmZfcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQ5NTEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX3BpLmgKQEAgLTAsMCArMSwzMjUgQEAKKy8qIGNyeXB0by9iZi9iZl9waS5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKK3N0YXRpYyBjb25zdCBCRl9LRVkgYmZfaW5pdD0geworCXsKKwkweDI0M2Y2YTg4TCwgMHg4NWEzMDhkM0wsIDB4MTMxOThhMmVMLCAweDAzNzA3MzQ0TCwKKwkweGE0MDkzODIyTCwgMHgyOTlmMzFkMEwsIDB4MDgyZWZhOThMLCAweGVjNGU2Yzg5TCwKKwkweDQ1MjgyMWU2TCwgMHgzOGQwMTM3N0wsIDB4YmU1NDY2Y2ZMLCAweDM0ZTkwYzZjTCwKKwkweGMwYWMyOWI3TCwgMHhjOTdjNTBkZEwsIDB4M2Y4NGQ1YjVMLCAweGI1NDcwOTE3TCwKKwkweDkyMTZkNWQ5TCwgMHg4OTc5ZmIxYgorCX0seworCTB4ZDEzMTBiYTZMLCAweDk4ZGZiNWFjTCwgMHgyZmZkNzJkYkwsIDB4ZDAxYWRmYjdMLCAKKwkweGI4ZTFhZmVkTCwgMHg2YTI2N2U5NkwsIDB4YmE3YzkwNDVMLCAweGYxMmM3Zjk5TCwgCisJMHgyNGExOTk0N0wsIDB4YjM5MTZjZjdMLCAweDA4MDFmMmUyTCwgMHg4NThlZmMxNkwsIAorCTB4NjM2OTIwZDhMLCAweDcxNTc0ZTY5TCwgMHhhNDU4ZmVhM0wsIDB4ZjQ5MzNkN2VMLCAKKwkweDBkOTU3NDhmTCwgMHg3MjhlYjY1OEwsIDB4NzE4YmNkNThMLCAweDgyMTU0YWVlTCwgCisJMHg3YjU0YTQxZEwsIDB4YzI1YTU5YjVMLCAweDljMzBkNTM5TCwgMHgyYWYyNjAxM0wsIAorCTB4YzVkMWIwMjNMLCAweDI4NjA4NWYwTCwgMHhjYTQxNzkxOEwsIDB4YjhkYjM4ZWZMLCAKKwkweDhlNzlkY2IwTCwgMHg2MDNhMTgwZUwsIDB4NmM5ZTBlOGJMLCAweGIwMWU4YTNlTCwgCisJMHhkNzE1NzdjMUwsIDB4YmQzMTRiMjdMLCAweDc4YWYyZmRhTCwgMHg1NTYwNWM2MEwsIAorCTB4ZTY1NTI1ZjNMLCAweGFhNTVhYjk0TCwgMHg1NzQ4OTg2MkwsIDB4NjNlODE0NDBMLCAKKwkweDU1Y2EzOTZhTCwgMHgyYWFiMTBiNkwsIDB4YjRjYzVjMzRMLCAweDExNDFlOGNlTCwgCisJMHhhMTU0ODZhZkwsIDB4N2M3MmU5OTNMLCAweGIzZWUxNDExTCwgMHg2MzZmYmMyYUwsIAorCTB4MmJhOWM1NWRMLCAweDc0MTgzMWY2TCwgMHhjZTVjM2UxNkwsIDB4OWI4NzkzMWVMLCAKKwkweGFmZDZiYTMzTCwgMHg2YzI0Y2Y1Y0wsIDB4N2EzMjUzODFMLCAweDI4OTU4Njc3TCwgCisJMHgzYjhmNDg5OEwsIDB4NmI0YmI5YWZMLCAweGM0YmZlODFiTCwgMHg2NjI4MjE5M0wsIAorCTB4NjFkODA5Y2NMLCAweGZiMjFhOTkxTCwgMHg0ODdjYWM2MEwsIDB4NWRlYzgwMzJMLCAKKwkweGVmODQ1ZDVkTCwgMHhlOTg1NzViMUwsIDB4ZGMyNjIzMDJMLCAweGViNjUxYjg4TCwgCisJMHgyMzg5M2U4MUwsIDB4ZDM5NmFjYzVMLCAweDBmNmQ2ZmYzTCwgMHg4M2Y0NDIzOUwsIAorCTB4MmUwYjQ0ODJMLCAweGE0ODQyMDA0TCwgMHg2OWM4ZjA0YUwsIDB4OWUxZjliNWVMLCAKKwkweDIxYzY2ODQyTCwgMHhmNmU5NmM5YUwsIDB4NjcwYzljNjFMLCAweGFiZDM4OGYwTCwgCisJMHg2YTUxYTBkMkwsIDB4ZDg1NDJmNjhMLCAweDk2MGZhNzI4TCwgMHhhYjUxMzNhM0wsIAorCTB4NmVlZjBiNmNMLCAweDEzN2EzYmU0TCwgMHhiYTNiZjA1MEwsIDB4N2VmYjJhOThMLCAKKwkweGExZjE2NTFkTCwgMHgzOWFmMDE3NkwsIDB4NjZjYTU5M2VMLCAweDgyNDMwZTg4TCwgCisJMHg4Y2VlODYxOUwsIDB4NDU2ZjlmYjRMLCAweDdkODRhNWMzTCwgMHgzYjhiNWViZUwsIAorCTB4ZTA2Zjc1ZDhMLCAweDg1YzEyMDczTCwgMHg0MDFhNDQ5ZkwsIDB4NTZjMTZhYTZMLCAKKwkweDRlZDNhYTYyTCwgMHgzNjNmNzcwNkwsIDB4MWJmZWRmNzJMLCAweDQyOWIwMjNkTCwgCisJMHgzN2QwZDcyNEwsIDB4ZDAwYTEyNDhMLCAweGRiMGZlYWQzTCwgMHg0OWYxYzA5YkwsIAorCTB4MDc1MzcyYzlMLCAweDgwOTkxYjdiTCwgMHgyNWQ0NzlkOEwsIDB4ZjZlOGRlZjdMLCAKKwkweGUzZmU1MDFhTCwgMHhiNjc5NGMzYkwsIDB4OTc2Y2UwYmRMLCAweDA0YzAwNmJhTCwgCisJMHhjMWE5NGZiNkwsIDB4NDA5ZjYwYzRMLCAweDVlNWM5ZWMyTCwgMHgxOTZhMjQ2M0wsIAorCTB4NjhmYjZmYWZMLCAweDNlNmM1M2I1TCwgMHgxMzM5YjJlYkwsIDB4M2I1MmVjNmZMLCAKKwkweDZkZmM1MTFmTCwgMHg5YjMwOTUyY0wsIDB4Y2M4MTQ1NDRMLCAweGFmNWViZDA5TCwgCisJMHhiZWUzZDAwNEwsIDB4ZGUzMzRhZmRMLCAweDY2MGYyODA3TCwgMHgxOTJlNGJiM0wsIAorCTB4YzBjYmE4NTdMLCAweDQ1Yzg3NDBmTCwgMHhkMjBiNWYzOUwsIDB4YjlkM2ZiZGJMLCAKKwkweDU1NzljMGJkTCwgMHgxYTYwMzIwYUwsIDB4ZDZhMTAwYzZMLCAweDQwMmM3Mjc5TCwgCisJMHg2NzlmMjVmZUwsIDB4ZmIxZmEzY2NMLCAweDhlYTVlOWY4TCwgMHhkYjMyMjJmOEwsIAorCTB4M2M3NTE2ZGZMLCAweGZkNjE2YjE1TCwgMHgyZjUwMWVjOEwsIDB4YWQwNTUyYWJMLCAKKwkweDMyM2RiNWZhTCwgMHhmZDIzODc2MEwsIDB4NTMzMTdiNDhMLCAweDNlMDBkZjgyTCwgCisJMHg5ZTVjNTdiYkwsIDB4Y2E2ZjhjYTBMLCAweDFhODc1NjJlTCwgMHhkZjE3NjlkYkwsIAorCTB4ZDU0MmE4ZjZMLCAweDI4N2VmZmMzTCwgMHhhYzY3MzJjNkwsIDB4OGM0ZjU1NzNMLCAKKwkweDY5NWIyN2IwTCwgMHhiYmNhNThjOEwsIDB4ZTFmZmEzNWRMLCAweGI4ZjAxMWEwTCwgCisJMHgxMGZhM2Q5OEwsIDB4ZmQyMTgzYjhMLCAweDRhZmNiNTZjTCwgMHgyZGQxZDM1YkwsIAorCTB4OWE1M2U0NzlMLCAweGI2Zjg0NTY1TCwgMHhkMjhlNDliY0wsIDB4NGJmYjk3OTBMLCAKKwkweGUxZGRmMmRhTCwgMHhhNGNiN2UzM0wsIDB4NjJmYjEzNDFMLCAweGNlZTRjNmU4TCwgCisJMHhlZjIwY2FkYUwsIDB4MzY3NzRjMDFMLCAweGQwN2U5ZWZlTCwgMHgyYmYxMWZiNEwsIAorCTB4OTVkYmRhNGRMLCAweGFlOTA5MTk4TCwgMHhlYWFkOGU3MUwsIDB4NmI5M2Q1YTBMLCAKKwkweGQwOGVkMWQwTCwgMHhhZmM3MjVlMEwsIDB4OGUzYzViMmZMLCAweDhlNzU5NGI3TCwgCisJMHg4ZmY2ZTJmYkwsIDB4ZjIxMjJiNjRMLCAweDg4ODhiODEyTCwgMHg5MDBkZjAxY0wsIAorCTB4NGZhZDVlYTBMLCAweDY4OGZjMzFjTCwgMHhkMWNmZjE5MUwsIDB4YjNhOGMxYWRMLCAKKwkweDJmMmYyMjE4TCwgMHhiZTBlMTc3N0wsIDB4ZWE3NTJkZmVMLCAweDhiMDIxZmExTCwgCisJMHhlNWEwY2MwZkwsIDB4YjU2Zjc0ZThMLCAweDE4YWNmM2Q2TCwgMHhjZTg5ZTI5OUwsIAorCTB4YjRhODRmZTBMLCAweGZkMTNlMGI3TCwgMHg3Y2M0M2I4MUwsIDB4ZDJhZGE4ZDlMLCAKKwkweDE2NWZhMjY2TCwgMHg4MDk1NzcwNUwsIDB4OTNjYzczMTRMLCAweDIxMWExNDc3TCwgCisJMHhlNmFkMjA2NUwsIDB4NzdiNWZhODZMLCAweGM3NTQ0MmY1TCwgMHhmYjlkMzVjZkwsIAorCTB4ZWJjZGFmMGNMLCAweDdiM2U4OWEwTCwgMHhkNjQxMWJkM0wsIDB4YWUxZTdlNDlMLCAKKwkweDAwMjUwZTJkTCwgMHgyMDcxYjM1ZUwsIDB4MjI2ODAwYmJMLCAweDU3YjhlMGFmTCwgCisJMHgyNDY0MzY5YkwsIDB4ZjAwOWI5MWVMLCAweDU1NjM5MTFkTCwgMHg1OWRmYTZhYUwsIAorCTB4NzhjMTQzODlMLCAweGQ5NWE1MzdmTCwgMHgyMDdkNWJhMkwsIDB4MDJlNWI5YzVMLCAKKwkweDgzMjYwMzc2TCwgMHg2Mjk1Y2ZhOUwsIDB4MTFjODE5NjhMLCAweDRlNzM0YTQxTCwgCisJMHhiMzQ3MmRjYUwsIDB4N2IxNGE5NGFMLCAweDFiNTEwMDUyTCwgMHg5YTUzMjkxNUwsIAorCTB4ZDYwZjU3M2ZMLCAweGJjOWJjNmU0TCwgMHgyYjYwYTQ3NkwsIDB4ODFlNjc0MDBMLCAKKwkweDA4YmE2ZmI1TCwgMHg1NzFiZTkxZkwsIDB4ZjI5NmVjNmJMLCAweDJhMGRkOTE1TCwgCisJMHhiNjYzNjUyMUwsIDB4ZTdiOWY5YjZMLCAweGZmMzQwNTJlTCwgMHhjNTg1NTY2NEwsIAorCTB4NTNiMDJkNWRMLCAweGE5OWY4ZmExTCwgMHgwOGJhNDc5OUwsIDB4NmU4NTA3NmFMLCAKKwkweDRiN2E3MGU5TCwgMHhiNWIzMjk0NEwsIDB4ZGI3NTA5MmVMLCAweGM0MTkyNjIzTCwgCisJMHhhZDZlYTZiMEwsIDB4NDlhN2RmN2RMLCAweDljZWU2MGI4TCwgMHg4ZmVkYjI2NkwsIAorCTB4ZWNhYThjNzFMLCAweDY5OWExN2ZmTCwgMHg1NjY0NTI2Y0wsIDB4YzJiMTllZTFMLCAKKwkweDE5MzYwMmE1TCwgMHg3NTA5NGMyOUwsIDB4YTA1OTEzNDBMLCAweGU0MTgzYTNlTCwgCisJMHgzZjU0OTg5YUwsIDB4NWI0MjlkNjVMLCAweDZiOGZlNGQ2TCwgMHg5OWY3M2ZkNkwsIAorCTB4YTFkMjljMDdMLCAweGVmZTgzMGY1TCwgMHg0ZDJkMzhlNkwsIDB4ZjAyNTVkYzFMLCAKKwkweDRjZGQyMDg2TCwgMHg4NDcwZWIyNkwsIDB4NjM4MmU5YzZMLCAweDAyMWVjYzVlTCwgCisJMHgwOTY4NmIzZkwsIDB4M2ViYWVmYzlMLCAweDNjOTcxODE0TCwgMHg2YjZhNzBhMUwsIAorCTB4Njg3ZjM1ODRMLCAweDUyYTBlMjg2TCwgMHhiNzljNTMwNUwsIDB4YWE1MDA3MzdMLCAKKwkweDNlMDc4NDFjTCwgMHg3ZmRlYWU1Y0wsIDB4OGU3ZDQ0ZWNMLCAweDU3MTZmMmI4TCwgCisJMHhiMDNhZGEzN0wsIDB4ZjA1MDBjMGRMLCAweGYwMWMxZjA0TCwgMHgwMjAwYjNmZkwsIAorCTB4YWUwY2Y1MWFMLCAweDNjYjU3NGIyTCwgMHgyNTgzN2E1OEwsIDB4ZGMwOTIxYmRMLCAKKwkweGQxOTExM2Y5TCwgMHg3Y2E5MmZmNkwsIDB4OTQzMjQ3NzNMLCAweDIyZjU0NzAxTCwgCisJMHgzYWU1ZTU4MUwsIDB4MzdjMmRhZGNMLCAweGM4YjU3NjM0TCwgMHg5YWYzZGRhN0wsIAorCTB4YTk0NDYxNDZMLCAweDBmZDAwMzBlTCwgMHhlY2M4YzczZUwsIDB4YTQ3NTFlNDFMLCAKKwkweGUyMzhjZDk5TCwgMHgzYmVhMGUyZkwsIDB4MzI4MGJiYTFMLCAweDE4M2ViMzMxTCwgCisJMHg0ZTU0OGIzOEwsIDB4NGY2ZGI5MDhMLCAweDZmNDIwZDAzTCwgMHhmNjBhMDRiZkwsIAorCTB4MmNiODEyOTBMLCAweDI0OTc3Yzc5TCwgMHg1Njc5YjA3MkwsIDB4YmNhZjg5YWZMLCAKKwkweGRlOWE3NzFmTCwgMHhkOTkzMDgxMEwsIDB4YjM4YmFlMTJMLCAweGRjY2YzZjJlTCwgCisJMHg1NTEyNzIxZkwsIDB4MmU2YjcxMjRMLCAweDUwMWFkZGU2TCwgMHg5Zjg0Y2Q4N0wsIAorCTB4N2E1ODQ3MThMLCAweDc0MDhkYTE3TCwgMHhiYzlmOWFiY0wsIDB4ZTk0YjdkOGNMLCAKKwkweGVjN2FlYzNhTCwgMHhkYjg1MWRmYUwsIDB4NjMwOTQzNjZMLCAweGM0NjRjM2QyTCwgCisJMHhlZjFjMTg0N0wsIDB4MzIxNWQ5MDhMLCAweGRkNDMzYjM3TCwgMHgyNGMyYmExNkwsIAorCTB4MTJhMTRkNDNMLCAweDJhNjVjNDUxTCwgMHg1MDk0MDAwMkwsIDB4MTMzYWU0ZGRMLCAKKwkweDcxZGZmODllTCwgMHgxMDMxNGU1NUwsIDB4ODFhYzc3ZDZMLCAweDVmMTExOTliTCwgCisJMHgwNDM1NTZmMUwsIDB4ZDdhM2M3NmJMLCAweDNjMTExODNiTCwgMHg1OTI0YTUwOUwsIAorCTB4ZjI4ZmU2ZWRMLCAweDk3ZjFmYmZhTCwgMHg5ZWJhYmYyY0wsIDB4MWUxNTNjNmVMLCAKKwkweDg2ZTM0NTcwTCwgMHhlYWU5NmZiMUwsIDB4ODYwZTVlMGFMLCAweDVhM2UyYWIzTCwgCisJMHg3NzFmZTcxY0wsIDB4NGUzZDA2ZmFMLCAweDI5NjVkY2I5TCwgMHg5OWU3MWQwZkwsIAorCTB4ODAzZTg5ZDZMLCAweDUyNjZjODI1TCwgMHgyZTRjYzk3OEwsIDB4OWMxMGIzNmFMLCAKKwkweGM2MTUwZWJhTCwgMHg5NGUyZWE3OEwsIDB4YTVmYzNjNTNMLCAweDFlMGEyZGY0TCwgCisJMHhmMmY3NGVhN0wsIDB4MzYxZDJiM2RMLCAweDE5MzkyNjBmTCwgMHgxOWMyNzk2MEwsIAorCTB4NTIyM2E3MDhMLCAweGY3MTMxMmI2TCwgMHhlYmFkZmU2ZUwsIDB4ZWFjMzFmNjZMLCAKKwkweGUzYmM0NTk1TCwgMHhhNjdiYzg4M0wsIDB4YjE3ZjM3ZDFMLCAweDAxOGNmZjI4TCwgCisJMHhjMzMyZGRlZkwsIDB4YmU2YzVhYTVMLCAweDY1NTgyMTg1TCwgMHg2OGFiOTgwMkwsIAorCTB4ZWVjZWE1MGZMLCAweGRiMmY5NTNiTCwgMHgyYWVmN2RhZEwsIDB4NWI2ZTJmODRMLCAKKwkweDE1MjFiNjI4TCwgMHgyOTA3NjE3MEwsIDB4ZWNkZDQ3NzVMLCAweDYxOWYxNTEwTCwgCisJMHgxM2NjYTgzMEwsIDB4ZWI2MWJkOTZMLCAweDAzMzRmZTFlTCwgMHhhYTAzNjNjZkwsIAorCTB4YjU3MzVjOTBMLCAweDRjNzBhMjM5TCwgMHhkNTllOWUwYkwsIDB4Y2JhYWRlMTRMLCAKKwkweGVlY2M4NmJjTCwgMHg2MDYyMmNhN0wsIDB4OWNhYjVjYWJMLCAweGIyZjM4NDZlTCwgCisJMHg2NDhiMWVhZkwsIDB4MTliZGYwY2FMLCAweGEwMjM2OWI5TCwgMHg2NTVhYmI1MEwsIAorCTB4NDA2ODVhMzJMLCAweDNjMmFiNGIzTCwgMHgzMTllZTlkNUwsIDB4YzAyMWI4ZjdMLCAKKwkweDliNTQwYjE5TCwgMHg4NzVmYTA5OUwsIDB4OTVmNzk5N2VMLCAweDYyM2Q3ZGE4TCwgCisJMHhmODM3ODg5YUwsIDB4OTdlMzJkNzdMLCAweDExZWQ5MzVmTCwgMHgxNjY4MTI4MUwsIAorCTB4MGUzNTg4MjlMLCAweGM3ZTYxZmQ2TCwgMHg5NmRlZGZhMUwsIDB4Nzg1OGJhOTlMLCAKKwkweDU3ZjU4NGE1TCwgMHgxYjIyNzI2M0wsIDB4OWI4M2MzZmZMLCAweDFhYzI0Njk2TCwgCisJMHhjZGIzMGFlYkwsIDB4NTMyZTMwNTRMLCAweDhmZDk0OGU0TCwgMHg2ZGJjMzEyOEwsIAorCTB4NThlYmYyZWZMLCAweDM0YzZmZmVhTCwgMHhmZTI4ZWQ2MUwsIDB4ZWU3YzNjNzNMLCAKKwkweDVkNGExNGQ5TCwgMHhlODY0YjdlM0wsIDB4NDIxMDVkMTRMLCAweDIwM2UxM2UwTCwgCisJMHg0NWVlZTJiNkwsIDB4YTNhYWFiZWFMLCAweGRiNmM0ZjE1TCwgMHhmYWNiNGZkMEwsIAorCTB4Yzc0MmY0NDJMLCAweGVmNmFiYmI1TCwgMHg2NTRmM2IxZEwsIDB4NDFjZDIxMDVMLCAKKwkweGQ4MWU3OTllTCwgMHg4Njg1NGRjN0wsIDB4ZTQ0YjQ3NmFMLCAweDNkODE2MjUwTCwgCisJMHhjZjYyYTFmMkwsIDB4NWI4ZDI2NDZMLCAweGZjODg4M2EwTCwgMHhjMWM3YjZhM0wsIAorCTB4N2YxNTI0YzNMLCAweDY5Y2I3NDkyTCwgMHg0Nzg0OGEwYkwsIDB4NTY5MmIyODVMLCAKKwkweDA5NWJiZjAwTCwgMHhhZDE5NDg5ZEwsIDB4MTQ2MmIxNzRMLCAweDIzODIwZTAwTCwgCisJMHg1ODQyOGQyYUwsIDB4MGM1NWY1ZWFMLCAweDFkYWRmNDNlTCwgMHgyMzNmNzA2MUwsIAorCTB4MzM3MmYwOTJMLCAweDhkOTM3ZTQxTCwgMHhkNjVmZWNmMUwsIDB4NmMyMjNiZGJMLCAKKwkweDdjZGUzNzU5TCwgMHhjYmVlNzQ2MEwsIDB4NDA4NWYyYTdMLCAweGNlNzczMjZlTCwgCisJMHhhNjA3ODA4NEwsIDB4MTlmODUwOWVMLCAweGU4ZWZkODU1TCwgMHg2MWQ5OTczNUwsIAorCTB4YTk2OWE3YWFMLCAweGM1MGMwNmMyTCwgMHg1YTA0YWJmY0wsIDB4ODAwYmNhZGNMLCAKKwkweDllNDQ3YTJlTCwgMHhjMzQ1MzQ4NEwsIDB4ZmRkNTY3MDVMLCAweDBlMWU5ZWM5TCwgCisJMHhkYjczZGJkM0wsIDB4MTA1NTg4Y2RMLCAweDY3NWZkYTc5TCwgMHhlMzY3NDM0MEwsIAorCTB4YzVjNDM0NjVMLCAweDcxM2UzOGQ4TCwgMHgzZDI4Zjg5ZUwsIDB4ZjE2ZGZmMjBMLCAKKwkweDE1M2UyMWU3TCwgMHg4ZmIwM2Q0YUwsIDB4ZTZlMzlmMmJMLCAweGRiODNhZGY3TCwgCisJMHhlOTNkNWE2OEwsIDB4OTQ4MTQwZjdMLCAweGY2NGMyNjFjTCwgMHg5NDY5MjkzNEwsIAorCTB4NDExNTIwZjdMLCAweDc2MDJkNGY3TCwgMHhiY2Y0NmIyZUwsIDB4ZDRhMjAwNjhMLCAKKwkweGQ0MDgyNDcxTCwgMHgzMzIwZjQ2YUwsIDB4NDNiN2Q0YjdMLCAweDUwMDA2MWFmTCwgCisJMHgxZTM5ZjYyZUwsIDB4OTcyNDQ1NDZMLCAweDE0MjE0Zjc0TCwgMHhiZjhiODg0MEwsIAorCTB4NGQ5NWZjMWRMLCAweDk2YjU5MWFmTCwgMHg3MGY0ZGRkM0wsIDB4NjZhMDJmNDVMLCAKKwkweGJmYmMwOWVjTCwgMHgwM2JkOTc4NUwsIDB4N2ZhYzZkZDBMLCAweDMxY2I4NTA0TCwgCisJMHg5NmViMjdiM0wsIDB4NTVmZDM5NDFMLCAweGRhMjU0N2U2TCwgMHhhYmNhMGE5YUwsIAorCTB4Mjg1MDc4MjVMLCAweDUzMDQyOWY0TCwgMHgwYTJjODZkYUwsIDB4ZTliNjZkZmJMLCAKKwkweDY4ZGMxNDYyTCwgMHhkNzQ4NjkwMEwsIDB4NjgwZWMwYTRMLCAweDI3YTE4ZGVlTCwgCisJMHg0ZjNmZmVhMkwsIDB4ZTg4N2FkOGNMLCAweGI1OGNlMDA2TCwgMHg3YWY0ZDZiNkwsIAorCTB4YWFjZTFlN2NMLCAweGQzMzc1ZmVjTCwgMHhjZTc4YTM5OUwsIDB4NDA2YjJhNDJMLCAKKwkweDIwZmU5ZTM1TCwgMHhkOWYzODViOUwsIDB4ZWUzOWQ3YWJMLCAweDNiMTI0ZThiTCwgCisJMHgxZGM5ZmFmN0wsIDB4NGI2ZDE4NTZMLCAweDI2YTM2NjMxTCwgMHhlYWUzOTdiMkwsIAorCTB4M2E2ZWZhNzRMLCAweGRkNWI0MzMyTCwgMHg2ODQxZTdmN0wsIDB4Y2E3ODIwZmJMLCAKKwkweGZiMGFmNTRlTCwgMHhkOGZlYjM5N0wsIDB4NDU0MDU2YWNMLCAweGJhNDg5NTI3TCwgCisJMHg1NTUzM2EzYUwsIDB4MjA4MzhkODdMLCAweGZlNmJhOWI3TCwgMHhkMDk2OTU0YkwsIAorCTB4NTVhODY3YmNMLCAweGExMTU5YTU4TCwgMHhjY2E5Mjk2M0wsIDB4OTllMWRiMzNMLCAKKwkweGE2MmE0YTU2TCwgMHgzZjMxMjVmOUwsIDB4NWVmNDdlMWNMLCAweDkwMjkzMTdjTCwgCisJMHhmZGY4ZTgwMkwsIDB4MDQyNzJmNzBMLCAweDgwYmIxNTVjTCwgMHgwNTI4MmNlM0wsIAorCTB4OTVjMTE1NDhMLCAweGU0YzY2ZDIyTCwgMHg0OGMxMTMzZkwsIDB4YzcwZjg2ZGNMLCAKKwkweDA3ZjljOWVlTCwgMHg0MTA0MWYwZkwsIDB4NDA0Nzc5YTRMLCAweDVkODg2ZTE3TCwgCisJMHgzMjVmNTFlYkwsIDB4ZDU5YmMwZDFMLCAweGYyYmNjMThmTCwgMHg0MTExMzU2NEwsIAorCTB4MjU3Yjc4MzRMLCAweDYwMmE5YzYwTCwgMHhkZmY4ZThhM0wsIDB4MWY2MzZjMWJMLCAKKwkweDBlMTJiNGMyTCwgMHgwMmUxMzI5ZUwsIDB4YWY2NjRmZDFMLCAweGNhZDE4MTE1TCwgCisJMHg2YjIzOTVlMEwsIDB4MzMzZTkyZTFMLCAweDNiMjQwYjYyTCwgMHhlZWJlYjkyMkwsIAorCTB4ODViMmEyMGVMLCAweGU2YmEwZDk5TCwgMHhkZTcyMGM4Y0wsIDB4MmRhMmY3MjhMLCAKKwkweGQwMTI3ODQ1TCwgMHg5NWI3OTRmZEwsIDB4NjQ3ZDA4NjJMLCAweGU3Y2NmNWYwTCwgCisJMHg1NDQ5YTM2ZkwsIDB4ODc3ZDQ4ZmFMLCAweGMzOWRmZDI3TCwgMHhmMzNlOGQxZUwsIAorCTB4MGE0NzYzNDFMLCAweDk5MmVmZjc0TCwgMHgzYTZmNmVhYkwsIDB4ZjRmOGZkMzdMLCAKKwkweGE4MTJkYzYwTCwgMHhhMWViZGRmOEwsIDB4OTkxYmUxNGNMLCAweGRiNmU2YjBkTCwgCisJMHhjNjdiNTUxMEwsIDB4NmQ2NzJjMzdMLCAweDI3NjVkNDNiTCwgMHhkY2QwZTgwNEwsIAorCTB4ZjEyOTBkYzdMLCAweGNjMDBmZmEzTCwgMHhiNTM5MGY5MkwsIDB4NjkwZmVkMGJMLCAKKwkweDY2N2I5ZmZiTCwgMHhjZWRiN2Q5Y0wsIDB4YTA5MWNmMGJMLCAweGQ5MTU1ZWEzTCwgCisJMHhiYjEzMmY4OEwsIDB4NTE1YmFkMjRMLCAweDdiOTQ3OWJmTCwgMHg3NjNiZDZlYkwsIAorCTB4MzczOTJlYjNMLCAweGNjMTE1OTc5TCwgMHg4MDI2ZTI5N0wsIDB4ZjQyZTMxMmRMLCAKKwkweDY4NDJhZGE3TCwgMHhjNjZhMmIzYkwsIDB4MTI3NTRjY2NMLCAweDc4MmVmMTFjTCwgCisJMHg2YTEyNDIzN0wsIDB4Yjc5MjUxZTdMLCAweDA2YTFiYmU2TCwgMHg0YmZiNjM1MEwsIAorCTB4MWE2YjEwMThMLCAweDExY2FlZGZhTCwgMHgzZDI1YmRkOEwsIDB4ZTJlMWMzYzlMLCAKKwkweDQ0NDIxNjU5TCwgMHgwYTEyMTM4NkwsIDB4ZDkwY2VjNmVMLCAweGQ1YWJlYTJhTCwgCisJMHg2NGFmNjc0ZUwsIDB4ZGE4NmE4NWZMLCAweGJlYmZlOTg4TCwgMHg2NGU0YzNmZUwsIAorCTB4OWRiYzgwNTdMLCAweGYwZjdjMDg2TCwgMHg2MDc4N2JmOEwsIDB4NjAwMzYwNGRMLCAKKwkweGQxZmQ4MzQ2TCwgMHhmNjM4MWZiMEwsIDB4Nzc0NWFlMDRMLCAweGQ3MzZmY2NjTCwgCisJMHg4MzQyNmIzM0wsIDB4ZjAxZWFiNzFMLCAweGIwODA0MTg3TCwgMHgzYzAwNWU1ZkwsIAorCTB4NzdhMDU3YmVMLCAweGJkZThhZTI0TCwgMHg1NTQ2NDI5OUwsIDB4YmY1ODJlNjFMLCAKKwkweDRlNThmNDhmTCwgMHhmMmRkZmRhMkwsIDB4ZjQ3NGVmMzhMLCAweDg3ODliZGMyTCwgCisJMHg1MzY2ZjljM0wsIDB4YzhiMzhlNzRMLCAweGI0NzVmMjU1TCwgMHg0NmZjZDliOUwsIAorCTB4N2FlYjI2NjFMLCAweDhiMWRkZjg0TCwgMHg4NDZhMGU3OUwsIDB4OTE1Zjk1ZTJMLCAKKwkweDQ2NmU1OThlTCwgMHgyMGI0NTc3MEwsIDB4OGNkNTU1OTFMLCAweGM5MDJkZTRjTCwgCisJMHhiOTBiYWNlMUwsIDB4YmI4MjA1ZDBMLCAweDExYTg2MjQ4TCwgMHg3NTc0YTk5ZUwsIAorCTB4Yjc3ZjE5YjZMLCAweGUwYTlkYzA5TCwgMHg2NjJkMDlhMUwsIDB4YzQzMjQ2MzNMLCAKKwkweGU4NWExZjAyTCwgMHgwOWYwYmU4Y0wsIDB4NGE5OWEwMjVMLCAweDFkNmVmZTEwTCwgCisJMHgxYWI5M2QxZEwsIDB4MGJhNWE0ZGZMLCAweGExODZmMjBmTCwgMHgyODY4ZjE2OUwsIAorCTB4ZGNiN2RhODNMLCAweDU3MzkwNmZlTCwgMHhhMWUyY2U5YkwsIDB4NGZjZDdmNTJMLCAKKwkweDUwMTE1ZTAxTCwgMHhhNzA2ODNmYUwsIDB4YTAwMmI1YzRMLCAweDBkZTZkMDI3TCwgCisJMHg5YWY4OGMyN0wsIDB4NzczZjg2NDFMLCAweGMzNjA0YzA2TCwgMHg2MWE4MDZiNUwsIAorCTB4ZjAxNzdhMjhMLCAweGMwZjU4NmUwTCwgMHgwMDYwNThhYUwsIDB4MzBkYzdkNjJMLCAKKwkweDExZTY5ZWQ3TCwgMHgyMzM4ZWE2M0wsIDB4NTNjMmRkOTRMLCAweGMyYzIxNjM0TCwgCisJMHhiYmNiZWU1NkwsIDB4OTBiY2I2ZGVMLCAweGViZmM3ZGExTCwgMHhjZTU5MWQ3NkwsIAorCTB4NmYwNWU0MDlMLCAweDRiN2MwMTg4TCwgMHgzOTcyMGEzZEwsIDB4N2M5MjdjMjRMLCAKKwkweDg2ZTM3MjVmTCwgMHg3MjRkOWRiOUwsIDB4MWFjMTViYjRMLCAweGQzOWViOGZjTCwgCisJMHhlZDU0NTU3OEwsIDB4MDhmY2E1YjVMLCAweGQ4M2Q3Y2QzTCwgMHg0ZGFkMGZjNEwsIAorCTB4MWU1MGVmNWVMLCAweGIxNjFlNmY4TCwgMHhhMjg1MTRkOUwsIDB4NmM1MTEzM2NMLCAKKwkweDZmZDVjN2U3TCwgMHg1NmUxNGVjNEwsIDB4MzYyYWJmY2VMLCAweGRkYzZjODM3TCwgCisJMHhkNzlhMzIzNEwsIDB4OTI2MzgyMTJMLCAweDY3MGVmYThlTCwgMHg0MDYwMDBlMEwsIAorCTB4M2EzOWNlMzdMLCAweGQzZmFmNWNmTCwgMHhhYmMyNzczN0wsIDB4NWFjNTJkMWJMLCAKKwkweDVjYjA2NzllTCwgMHg0ZmEzMzc0MkwsIDB4ZDM4MjI3NDBMLCAweDk5YmM5YmJlTCwgCisJMHhkNTExOGU5ZEwsIDB4YmYwZjczMTVMLCAweGQ2MmQxYzdlTCwgMHhjNzAwYzQ3YkwsIAorCTB4Yjc4YzFiNmJMLCAweDIxYTE5MDQ1TCwgMHhiMjZlYjFiZUwsIDB4NmEzNjZlYjRMLCAKKwkweDU3NDhhYjJmTCwgMHhiYzk0NmU3OUwsIDB4YzZhMzc2ZDJMLCAweDY1NDljMmM4TCwgCisJMHg1MzBmZjhlZUwsIDB4NDY4ZGRlN2RMLCAweGQ1NzMwYTFkTCwgMHg0Y2QwNGRjNkwsIAorCTB4MjkzOWJiZGJMLCAweGE5YmE0NjUwTCwgMHhhYzk1MjZlOEwsIDB4YmU1ZWUzMDRMLCAKKwkweGExZmFkNWYwTCwgMHg2YTJkNTE5YUwsIDB4NjNlZjhjZTJMLCAweDlhODZlZTIyTCwgCisJMHhjMDg5YzJiOEwsIDB4NDMyNDJlZjZMLCAweGE1MWUwM2FhTCwgMHg5Y2YyZDBhNEwsIAorCTB4ODNjMDYxYmFMLCAweDliZTk2YTRkTCwgMHg4ZmU1MTU1MEwsIDB4YmE2NDViZDZMLCAKKwkweDI4MjZhMmY5TCwgMHhhNzNhM2FlMUwsIDB4NGJhOTk1ODZMLCAweGVmNTU2MmU5TCwgCisJMHhjNzJmZWZkM0wsIDB4Zjc1MmY3ZGFMLCAweDNmMDQ2ZjY5TCwgMHg3N2ZhMGE1OUwsIAorCTB4ODBlNGE5MTVMLCAweDg3YjA4NjAxTCwgMHg5YjA5ZTZhZEwsIDB4M2IzZWU1OTNMLCAKKwkweGU5OTBmZDVhTCwgMHg5ZTM0ZDc5N0wsIDB4MmNmMGI3ZDlMLCAweDAyMmI4YjUxTCwgCisJMHg5NmQ1YWMzYUwsIDB4MDE3ZGE2N2RMLCAweGQxY2YzZWQ2TCwgMHg3YzdkMmQyOEwsIAorCTB4MWY5ZjI1Y2ZMLCAweGFkZjJiODliTCwgMHg1YWQ2YjQ3MkwsIDB4NWE4OGY1NGNMLCAKKwkweGUwMjlhYzcxTCwgMHhlMDE5YTVlNkwsIDB4NDdiMGFjZmRMLCAweGVkOTNmYTliTCwgCisJMHhlOGQzYzQ4ZEwsIDB4MjgzYjU3Y2NMLCAweGY4ZDU2NjI5TCwgMHg3OTEzMmUyOEwsIAorCTB4Nzg1ZjAxOTFMLCAweGVkNzU2MDU1TCwgMHhmNzk2MGU0NEwsIDB4ZTNkMzVlOGNMLCAKKwkweDE1MDU2ZGQ0TCwgMHg4OGY0NmRiYUwsIDB4MDNhMTYxMjVMLCAweDA1NjRmMGJkTCwgCisJMHhjM2ViOWUxNUwsIDB4M2M5MDU3YTJMLCAweDk3MjcxYWVjTCwgMHhhOTNhMDcyYUwsIAorCTB4MWIzZjZkOWJMLCAweDFlNjMyMWY1TCwgMHhmNTljNjZmYkwsIDB4MjZkY2YzMTlMLCAKKwkweDc1MzNkOTI4TCwgMHhiMTU1ZmRmNUwsIDB4MDM1NjM0ODJMLCAweDhhYmEzY2JiTCwgCisJMHgyODUxNzcxMUwsIDB4YzIwYWQ5ZjhMLCAweGFiY2M1MTY3TCwgMHhjY2FkOTI1ZkwsIAorCTB4NGRlODE3NTFMLCAweDM4MzBkYzhlTCwgMHgzNzlkNTg2MkwsIDB4OTMyMGY5OTFMLCAKKwkweGVhN2E5MGMyTCwgMHhmYjNlN2JjZUwsIDB4NTEyMWNlNjRMLCAweDc3NGZiZTMyTCwgCisJMHhhOGI2ZTM3ZUwsIDB4YzMyOTNkNDZMLCAweDQ4ZGU1MzY5TCwgMHg2NDEzZTY4MEwsIAorCTB4YTJhZTA4MTBMLCAweGRkNmRiMjI0TCwgMHg2OTg1MmRmZEwsIDB4MDkwNzIxNjZMLCAKKwkweGIzOWE0NjBhTCwgMHg2NDQ1YzBkZEwsIDB4NTg2Y2RlY2ZMLCAweDFjMjBjOGFlTCwgCisJMHg1YmJlZjdkZEwsIDB4MWI1ODhkNDBMLCAweGNjZDIwMTdmTCwgMHg2YmI0ZTNiYkwsIAorCTB4ZGRhMjZhN2VMLCAweDNhNTlmZjQ1TCwgMHgzZTM1MGE0NEwsIDB4YmNiNGNkZDVMLCAKKwkweDcyZWFjZWE4TCwgMHhmYTY0ODRiYkwsIDB4OGQ2NjEyYWVMLCAweGJmM2M2ZjQ3TCwgCisJMHhkMjliZTQ2M0wsIDB4NTQyZjVkOWVMLCAweGFlYzI3NzFiTCwgMHhmNjRlNjM3MEwsIAorCTB4NzQwZTBkOGRMLCAweGU3NWIxMzU3TCwgMHhmODcyMTY3MUwsIDB4YWY1MzdkNWRMLCAKKwkweDQwNDBjYjA4TCwgMHg0ZWI0ZTJjY0wsIDB4MzRkMjQ2NmFMLCAweDAxMTVhZjg0TCwgCisJMHhlMWIwMDQyOEwsIDB4OTU5ODNhMWRMLCAweDA2Yjg5ZmI0TCwgMHhjZTZlYTA0OEwsIAorCTB4NmYzZjNiODJMLCAweDM1MjBhYjgyTCwgMHgwMTFhMWQ0YkwsIDB4Mjc3MjI3ZjhMLCAKKwkweDYxMTU2MGIxTCwgMHhlNzkzM2ZkY0wsIDB4YmIzYTc5MmJMLCAweDM0NDUyNWJkTCwgCisJMHhhMDg4MzllMUwsIDB4NTFjZTc5NGJMLCAweDJmMzJjOWI3TCwgMHhhMDFmYmFjOUwsIAorCTB4ZTAxY2M4N2VMLCAweGJjYzdkMWY2TCwgMHhjZjAxMTFjM0wsIDB4YTFlOGFhYzdMLCAKKwkweDFhOTA4NzQ5TCwgMHhkNDRmYmQ5YUwsIDB4ZDBkYWRlY2JMLCAweGQ1MGFkYTM4TCwgCisJMHgwMzM5YzMyYUwsIDB4YzY5MTM2NjdMLCAweDhkZjkzMTdjTCwgMHhlMGIxMmI0ZkwsIAorCTB4Zjc5ZTU5YjdMLCAweDQzZjViYjNhTCwgMHhmMmQ1MTlmZkwsIDB4MjdkOTQ1OWNMLCAKKwkweGJmOTcyMjJjTCwgMHgxNWU2ZmMyYUwsIDB4MGY5MWZjNzFMLCAweDliOTQxNTI1TCwgCisJMHhmYWU1OTM2MUwsIDB4Y2ViNjljZWJMLCAweGMyYTg2NDU5TCwgMHgxMmJhYThkMUwsIAorCTB4YjZjMTA3NWVMLCAweGUzMDU2YTBjTCwgMHgxMGQyNTA2NUwsIDB4Y2IwM2E0NDJMLCAKKwkweGUwZWM2ZTBlTCwgMHgxNjk4ZGIzYkwsIDB4NGM5OGEwYmVMLCAweDMyNzhlOTY0TCwgCisJMHg5ZjFmOTUzMkwsIDB4ZTBkMzkyZGZMLCAweGQzYTAzNDJiTCwgMHg4OTcxZjIxZUwsIAorCTB4MWIwYTc0NDFMLCAweDRiYTMzNDhjTCwgMHhjNWJlNzEyMEwsIDB4YzM3NjMyZDhMLCAKKwkweGRmMzU5ZjhkTCwgMHg5Yjk5MmYyZUwsIDB4ZTYwYjZmNDdMLCAweDBmZTNmMTFkTCwgCisJMHhlNTRjZGE1NEwsIDB4MWVkYWQ4OTFMLCAweGNlNjI3OWNmTCwgMHhjZDNlN2U2ZkwsIAorCTB4MTYxOGIxNjZMLCAweGZkMmMxZDA1TCwgMHg4NDhmZDJjNUwsIDB4ZjZmYjIyOTlMLCAKKwkweGY1MjNmMzU3TCwgMHhhNjMyNzYyM0wsIDB4OTNhODM1MzFMLCAweDU2Y2NjZDAyTCwgCisJMHhhY2YwODE2MkwsIDB4NWE3NWViYjVMLCAweDZlMTYzNjk3TCwgMHg4OGQyNzNjY0wsIAorCTB4ZGU5NjYyOTJMLCAweDgxYjk0OWQwTCwgMHg0YzUwOTAxYkwsIDB4NzFjNjU2MTRMLCAKKwkweGU2YzZjN2JkTCwgMHgzMjdhMTQwYUwsIDB4NDVlMWQwMDZMLCAweGMzZjI3YjlhTCwgCisJMHhjOWFhNTNmZEwsIDB4NjJhODBmMDBMLCAweGJiMjViZmUyTCwgMHgzNWJkZDJmNkwsIAorCTB4NzExMjY5MDVMLCAweGIyMDQwMjIyTCwgMHhiNmNiY2Y3Y0wsIDB4Y2Q3NjljMmJMLCAKKwkweDUzMTEzZWMwTCwgMHgxNjQwZTNkM0wsIDB4MzhhYmJkNjBMLCAweDI1NDdhZGYwTCwgCisJMHhiYTM4MjA5Y0wsIDB4Zjc0NmNlNzZMLCAweDc3YWZhMWM1TCwgMHgyMDc1NjA2MEwsIAorCTB4ODVjYmZlNGVMLCAweDhhZTg4ZGQ4TCwgMHg3YWFhZjliMEwsIDB4NGNmOWFhN2VMLCAKKwkweDE5NDhjMjVjTCwgMHgwMmZiOGE4Y0wsIDB4MDFjMzZhZTRMLCAweGQ2ZWJlMWY5TCwgCisJMHg5MGQ0Zjg2OUwsIDB4YTY1Y2RlYTBMLCAweDNmMDkyNTJkTCwgMHhjMjA4ZTY5ZkwsIAorCTB4Yjc0ZTYxMzJMLCAweGNlNzdlMjViTCwgMHg1NzhmZGZlM0wsIDB4M2FjMzcyZTZMLCAKKwl9CisJfTsKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JmL2JmX3NrZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9iZl9za2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3M2NkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iZi9iZl9za2V5LmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIGNyeXB0by9iZi9iZl9za2V5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibG93ZmlzaC5oPgorI2luY2x1ZGUgImJmX2xvY2wuaCIKKyNpbmNsdWRlICJiZl9waS5oIgorCit2b2lkIEJGX3NldF9rZXkoQkZfS0VZICprZXksIGludCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCisJeworCWludCBpOworCUJGX0xPTkcgKnAscmksaW5bMl07CisJY29uc3QgdW5zaWduZWQgY2hhciAqZCwqZW5kOworCisKKwltZW1jcHkoa2V5LCZiZl9pbml0LHNpemVvZihCRl9LRVkpKTsKKwlwPWtleS0+UDsKKworCWlmIChsZW4gPiAoKEJGX1JPVU5EUysyKSo0KSkgbGVuPShCRl9ST1VORFMrMikqNDsKKworCWQ9ZGF0YTsKKwllbmQ9ICYoZGF0YVtsZW5dKTsKKwlmb3IgKGk9MDsgaTwoQkZfUk9VTkRTKzIpOyBpKyspCisJCXsKKwkJcmk9ICooZCsrKTsKKwkJaWYgKGQgPj0gZW5kKSBkPWRhdGE7CisKKwkJcmk8PD04OworCQlyaXw9ICooZCsrKTsKKwkJaWYgKGQgPj0gZW5kKSBkPWRhdGE7CisKKwkJcmk8PD04OworCQlyaXw9ICooZCsrKTsKKwkJaWYgKGQgPj0gZW5kKSBkPWRhdGE7CisKKwkJcmk8PD04OworCQlyaXw9ICooZCsrKTsKKwkJaWYgKGQgPj0gZW5kKSBkPWRhdGE7CisKKwkJcFtpXV49cmk7CisJCX0KKworCWluWzBdPTBMOworCWluWzFdPTBMOworCWZvciAoaT0wOyBpPChCRl9ST1VORFMrMik7IGkrPTIpCisJCXsKKwkJQkZfZW5jcnlwdChpbixrZXkpOworCQlwW2kgIF09aW5bMF07CisJCXBbaSsxXT1pblsxXTsKKwkJfQorCisJcD1rZXktPlM7CisJZm9yIChpPTA7IGk8NCoyNTY7IGkrPTIpCisJCXsKKwkJQkZfZW5jcnlwdChpbixrZXkpOworCQlwW2kgIF09aW5bMF07CisJCXBbaSsxXT1pblsxXTsKKwkJfQorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JmL2Jsb3dmaXNoLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vYmYvYmxvd2Zpc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTdlNzZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JmL2Jsb3dmaXNoLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIGNyeXB0by9iZi9ibG93ZmlzaC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX0JMT1dGSVNIX0gKKyNkZWZpbmUgSEVBREVSX0JMT1dGSVNIX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfTk9fQkYKKyNlcnJvciBCRiBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjZGVmaW5lIEJGX0VOQ1JZUFQJMQorI2RlZmluZSBCRl9ERUNSWVBUCTAKKworLyoKKyAqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqICEgQkZfTE9ORyBoYXMgdG8gYmUgYXQgbGVhc3QgMzIgYml0cyB3aWRlLiBJZiBpdCdzIHdpZGVyLCB0aGVuICEKKyAqICEgQkZfTE9OR19MT0cyIGhhcyB0byBiZSBkZWZpbmVkIGFsb25nLiAgICAgICAgICAgICAgICAgICAgICAgICEKKyAqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqLworCisjaWYgZGVmaW5lZChfX0xQMzJfXykKKyNkZWZpbmUgQkZfTE9ORyB1bnNpZ25lZCBsb25nCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0NSQVkpIHx8IGRlZmluZWQoX19JTFA2NF9fKQorI2RlZmluZSBCRl9MT05HIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgQkZfTE9OR19MT0cyIDMKKy8qCisgKiBfQ1JBWSBub3RlLiBJIGNvdWxkIGRlY2xhcmUgc2hvcnQsIGJ1dCBJIGhhdmUgbm8gaWRlYSB3aGF0IGltcGFjdAorICogZG9lcyBpdCBoYXZlIG9uIHBlcmZvcm1hbmNlIG9uIG5vbmUtVDNFIG1hY2hpbmVzLiBJIGNvdWxkIGRlY2xhcmUKKyAqIGludCwgYnV0IGF0IGxlYXN0IG9uIEM5MCBzaXplb2YoaW50KSBjYW4gYmUgY2hvc2VuIGF0IGNvbXBpbGUgdGltZS4KKyAqIFNvIEkndmUgY2hvc2VuIGxvbmcuLi4KKyAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgKi8KKyNlbHNlCisjZGVmaW5lIEJGX0xPTkcgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSBCRl9ST1VORFMJMTYKKyNkZWZpbmUgQkZfQkxPQ0sJOAorCit0eXBlZGVmIHN0cnVjdCBiZl9rZXlfc3QKKwl7CisJQkZfTE9ORyBQW0JGX1JPVU5EUysyXTsKKwlCRl9MT05HIFNbNCoyNTZdOworCX0gQkZfS0VZOworCisgCit2b2lkIEJGX3NldF9rZXkoQkZfS0VZICprZXksIGludCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpOworCit2b2lkIEJGX2VuY3J5cHQoQkZfTE9ORyAqZGF0YSxjb25zdCBCRl9LRVkgKmtleSk7Cit2b2lkIEJGX2RlY3J5cHQoQkZfTE9ORyAqZGF0YSxjb25zdCBCRl9LRVkgKmtleSk7CisKK3ZvaWQgQkZfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwljb25zdCBCRl9LRVkgKmtleSwgaW50IGVuYyk7Cit2b2lkIEJGX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCWNvbnN0IEJGX0tFWSAqc2NoZWR1bGUsIHVuc2lnbmVkIGNoYXIgKml2ZWMsIGludCBlbmMpOwordm9pZCBCRl9jZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCWNvbnN0IEJGX0tFWSAqc2NoZWR1bGUsIHVuc2lnbmVkIGNoYXIgKml2ZWMsIGludCAqbnVtLCBpbnQgZW5jKTsKK3ZvaWQgQkZfb2ZiNjRfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwljb25zdCBCRl9LRVkgKnNjaGVkdWxlLCB1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSk7Citjb25zdCBjaGFyICpCRl9vcHRpb25zKHZvaWQpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2JfZHVtcC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBlY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iX2R1bXAuYwpAQCAtMCwwICsxLDE4NyBAQAorLyogY3J5cHRvL2Jpby9iX2R1bXAuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiAKKyAqIFN0b2xlbiBmcm9tIHRqaCdzIHNzbC9zc2xfdHJjLmMgc3R1ZmYuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJiaW9fbGNsLmgiCisKKyNkZWZpbmUgVFJVTkNBVEUKKyNkZWZpbmUgRFVNUF9XSURUSAkxNgorI2RlZmluZSBEVU1QX1dJRFRIX0xFU1NfSU5ERU5UKGkpIChEVU1QX1dJRFRILSgoaS0oaT42PzY6aSkrMykvNCkpCisKK2ludCBCSU9fZHVtcF9jYihpbnQgKCpjYikoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgdm9pZCAqdSksCisJdm9pZCAqdSwgY29uc3QgY2hhciAqcywgaW50IGxlbikKKwl7CisJcmV0dXJuIEJJT19kdW1wX2luZGVudF9jYihjYiwgdSwgcywgbGVuLCAwKTsKKwl9CisKK2ludCBCSU9fZHVtcF9pbmRlbnRfY2IoaW50ICgqY2IpKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIHZvaWQgKnUpLAorCXZvaWQgKnUsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4sIGludCBpbmRlbnQpCisJeworCWludCByZXQ9MDsKKwljaGFyIGJ1ZlsyODgrMV0sdG1wWzIwXSxzdHJbMTI4KzFdOworCWludCBpLGoscm93cyx0cmM7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgZHVtcF93aWR0aDsKKworCXRyYz0wOworCisjaWZkZWYgVFJVTkNBVEUKKwlmb3IoOyAobGVuID4gMCkgJiYgKChzW2xlbi0xXSA9PSAnICcpIHx8IChzW2xlbi0xXSA9PSAnXDAnKSk7IGxlbi0tKQorCQl0cmMrKzsKKyNlbmRpZgorCisJaWYgKGluZGVudCA8IDApCisJCWluZGVudCA9IDA7CisJaWYgKGluZGVudCkKKwkJeworCQlpZiAoaW5kZW50ID4gMTI4KSBpbmRlbnQ9MTI4OworCQltZW1zZXQoc3RyLCcgJyxpbmRlbnQpOworCQl9CisJc3RyW2luZGVudF09J1wwJzsKKworCWR1bXBfd2lkdGg9RFVNUF9XSURUSF9MRVNTX0lOREVOVChpbmRlbnQpOworCXJvd3M9KGxlbi9kdW1wX3dpZHRoKTsKKwlpZiAoKHJvd3MqZHVtcF93aWR0aCk8bGVuKQorCQlyb3dzKys7CisJZm9yKGk9MDtpPHJvd3M7aSsrKQorCQl7CisJCWJ1ZlswXT0nXDAnOwkvKiBzdGFydCB3aXRoIGVtcHR5IHN0cmluZyAqLworCQlCVUZfc3RybGNweShidWYsc3RyLHNpemVvZiBidWYpOworCQlCSU9fc25wcmludGYodG1wLHNpemVvZiB0bXAsIiUwNHggLSAiLGkqZHVtcF93aWR0aCk7CisJCUJVRl9zdHJsY2F0KGJ1Zix0bXAsc2l6ZW9mIGJ1Zik7CisJCWZvcihqPTA7ajxkdW1wX3dpZHRoO2orKykKKwkJCXsKKwkJCWlmICgoKGkqZHVtcF93aWR0aCkraik+PWxlbikKKwkJCQl7CisJCQkJQlVGX3N0cmxjYXQoYnVmLCIgICAiLHNpemVvZiBidWYpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJY2g9KCh1bnNpZ25lZCBjaGFyKSoocytpKmR1bXBfd2lkdGgraikpICYgMHhmZjsKKwkJCQlCSU9fc25wcmludGYodG1wLHNpemVvZiB0bXAsIiUwMnglYyIsY2gsCisJCQkJCWo9PTc/Jy0nOicgJyk7CisJCQkJQlVGX3N0cmxjYXQoYnVmLHRtcCxzaXplb2YgYnVmKTsKKwkJCQl9CisJCQl9CisJCUJVRl9zdHJsY2F0KGJ1ZiwiICAiLHNpemVvZiBidWYpOworCQlmb3Ioaj0wO2o8ZHVtcF93aWR0aDtqKyspCisJCQl7CisJCQlpZiAoKChpKmR1bXBfd2lkdGgpK2opPj1sZW4pCisJCQkJYnJlYWs7CisJCQljaD0oKHVuc2lnbmVkIGNoYXIpKihzK2kqZHVtcF93aWR0aCtqKSkgJiAweGZmOworI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworCQkJQklPX3NucHJpbnRmKHRtcCxzaXplb2YgdG1wLCIlYyIsCisJCQkJKChjaD49JyAnKSYmKGNoPD0nficpKT9jaDonLicpOworI2Vsc2UKKwkJCUJJT19zbnByaW50Zih0bXAsc2l6ZW9mIHRtcCwiJWMiLAorCQkJCSgoY2g+PW9zX3RvYXNjaWlbJyAnXSkmJihjaDw9b3NfdG9hc2NpaVsnfiddKSkKKwkJCQk/IG9zX3RvZWJjZGljW2NoXQorCQkJCTogJy4nKTsKKyNlbmRpZgorCQkJQlVGX3N0cmxjYXQoYnVmLHRtcCxzaXplb2YgYnVmKTsKKwkJCX0KKwkJQlVGX3N0cmxjYXQoYnVmLCJcbiIsc2l6ZW9mIGJ1Zik7CisJCS8qIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbCB0aGVuIHVwZGF0ZSB0aGUgZGR0X2R1bXAgdGhpbmcgc28KKwkJICogdGhhdCB3ZSB3aWxsIG1vdmUgdGhlIHNlbGVjdGlvbiBwb2ludCBpbiB0aGUgZGVidWcgd2luZG93CisJCSAqLworCQlyZXQrPWNiKCh2b2lkICopYnVmLHN0cmxlbihidWYpLHUpOworCQl9CisjaWZkZWYgVFJVTkNBVEUKKwlpZiAodHJjID4gMCkKKwkJeworCQlCSU9fc25wcmludGYoYnVmLHNpemVvZiBidWYsIiVzJTA0eCAtIDxTUEFDRVMvTlVMUz5cbiIsc3RyLAorCQkJbGVuK3RyYyk7CisJCXJldCs9Y2IoKHZvaWQgKilidWYsc3RybGVuKGJ1ZiksdSk7CisJCX0KKyNlbmRpZgorCXJldHVybihyZXQpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorc3RhdGljIGludCB3cml0ZV9mcChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB2b2lkICpmcCkKKwl7CisJcmV0dXJuIFVQX2Z3cml0ZShkYXRhLCBsZW4sIDEsIGZwKTsKKwl9CitpbnQgQklPX2R1bXBfZnAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4pCisJeworCXJldHVybiBCSU9fZHVtcF9jYih3cml0ZV9mcCwgZnAsIHMsIGxlbik7CisJfQoraW50IEJJT19kdW1wX2luZGVudF9mcChGSUxFICpmcCwgY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IGluZGVudCkKKwl7CisJcmV0dXJuIEJJT19kdW1wX2luZGVudF9jYih3cml0ZV9mcCwgZnAsIHMsIGxlbiwgaW5kZW50KTsKKwl9CisjZW5kaWYKKworc3RhdGljIGludCB3cml0ZV9iaW8oY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgdm9pZCAqYnApCisJeworCXJldHVybiBCSU9fd3JpdGUoKEJJTyAqKWJwLCAoY29uc3QgY2hhciAqKWRhdGEsIGxlbik7CisJfQoraW50IEJJT19kdW1wKEJJTyAqYnAsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4pCisJeworCXJldHVybiBCSU9fZHVtcF9jYih3cml0ZV9iaW8sIGJwLCBzLCBsZW4pOworCX0KK2ludCBCSU9fZHVtcF9pbmRlbnQoQklPICpicCwgY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IGluZGVudCkKKwl7CisJcmV0dXJuIEJJT19kdW1wX2luZGVudF9jYih3cml0ZV9iaW8sIGJwLCBzLCBsZW4sIGluZGVudCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2JfcHJpbnQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYl9wcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2E3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2JfcHJpbnQuYwpAQCAtMCwwICsxLDg0MiBAQAorLyogY3J5cHRvL2Jpby9iX3ByaW50LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogZGlzYWJsZSBhc3NlcnQoKSB1bmxlc3MgQklPX0RFQlVHIGhhcyBiZWVuIGRlZmluZWQgKi8KKyNpZm5kZWYgQklPX0RFQlVHCisjIGlmbmRlZiBOREVCVUcKKyMgIGRlZmluZSBOREVCVUcKKyMgZW5kaWYKKyNlbmRpZgorCisvKiAKKyAqIFN0b2xlbiBmcm9tIHRqaCdzIHNzbC9zc2xfdHJjLmMgc3R1ZmYuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2lmbmRlZiBOT19TWVNfVFlQRVNfSAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPiAgICAgICAgIC8qIFRvIGdldCBCTl9MTE9ORyBwcm9wZXJseSBkZWZpbmVkICovCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2lmIGRlZmluZWQoQk5fTExPTkcpIHx8IGRlZmluZWQoU0lYVFlfRk9VUl9CSVQpCisjIGlmbmRlZiBIQVZFX0xPTkdfTE9ORworIyAgZGVmaW5lIEhBVkVfTE9OR19MT05HIDEKKyMgZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogQ29weXJpZ2h0IFBhdHJpY2sgUG93ZWxsIDE5OTUKKyAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgUGF0cmljayBQb3dlbGwgPHBhcG93ZWxsQGFzdGFydC5jb20+CisgKiBJdCBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2UgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSByZW1haW5zIGludGFjdAorICogb24gYWxsIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMuCisgKi8KKworLyoKKyAqIFRoaXMgY29kZSBjb250YWlucyBudW1lcmlvdXMgY2hhbmdlcyBhbmQgZW5oYW5jZW1lbnRzIHdoaWNoIHdlcmUKKyAqIG1hZGUgYnkgbG90cyBvZiBjb250cmlidXRvcnMgb3ZlciB0aGUgbGFzdCB5ZWFycyB0byBQYXRyaWNrIFBvd2VsbCdzCisgKiBvcmlnaW5hbCBjb2RlOgorICoKKyAqIG8gUGF0cmljayBQb3dlbGwgPHBhcG93ZWxsQGFzdGFydC5jb20+ICAgICAgKDE5OTUpCisgKiBvIEJyYW5kb24gTG9uZyA8YmxvbmdAZmljdGlvbi5uZXQ+ICAgICAgICAgICgxOTk2LCBmb3IgTXV0dCkKKyAqIG8gVGhvbWFzIFJvZXNzbGVyIDxyb2Vzc2xlckBndXVnLmRlPiAgICAgICAgKDE5OTgsIGZvciBNdXR0KQorICogbyBNaWNoYWVsIEVsa2lucyA8bWVAY3MuaG1jLmVkdT4gICAgICAgICAgICAoMTk5OCwgZm9yIE11dHQpCisgKiBvIEFuZHJldyBUcmlkZ2VsbCA8dHJpZGdlQHNhbWJhLm9yZz4gICAgICAgICgxOTk4LCBmb3IgU2FtYmEpCisgKiBvIEx1a2UgTWV3YnVybiA8bHVrZW1AbmV0YnNkLm9yZz4gICAgICAgICAgICgxOTk5LCBmb3IgTHVrZW1GVFApCisgKiBvIFJhbGYgUy4gRW5nZWxzY2hhbGwgPHJzZUBlbmdlbHNjaGFsbC5jb20+ICgxOTk5LCBmb3IgUHRoKQorICogbyAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIE9wZW5TU0wpCisgKi8KKworI2lmZGVmIEhBVkVfTE9OR19ET1VCTEUKKyNkZWZpbmUgTERPVUJMRSBsb25nIGRvdWJsZQorI2Vsc2UKKyNkZWZpbmUgTERPVUJMRSBkb3VibGUKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyMgaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgTExPTkcgX19pbnQ2NAorIyBlbHNlCisjIGRlZmluZSBMTE9ORyBsb25nIGxvbmcKKyMgZW5kaWYKKyNlbHNlCisjZGVmaW5lIExMT05HIGxvbmcKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmbXRzdHIgICAgIChjaGFyICoqLCBjaGFyICoqLCBzaXplX3QgKiwgc2l6ZV90ICosCisJCQljb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpOworc3RhdGljIHZvaWQgZm10aW50ICAgICAoY2hhciAqKiwgY2hhciAqKiwgc2l6ZV90ICosIHNpemVfdCAqLAorCQkJTExPTkcsIGludCwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBmbXRmcCAgICAgIChjaGFyICoqLCBjaGFyICoqLCBzaXplX3QgKiwgc2l6ZV90ICosCisJCQlMRE9VQkxFLCBpbnQsIGludCwgaW50KTsKK3N0YXRpYyB2b2lkIGRvYXByX291dGNoIChjaGFyICoqLCBjaGFyICoqLCBzaXplX3QgKiwgc2l6ZV90ICosIGludCk7CitzdGF0aWMgdm9pZCBfZG9wcihjaGFyICoqc2J1ZmZlciwgY2hhciAqKmJ1ZmZlciwKKwkJICBzaXplX3QgKm1heGxlbiwgc2l6ZV90ICpyZXRsZW4sIGludCAqdHJ1bmNhdGVkLAorCQkgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKKworLyogZm9ybWF0IHJlYWQgc3RhdGVzICovCisjZGVmaW5lIERQX1NfREVGQVVMVCAgICAwCisjZGVmaW5lIERQX1NfRkxBR1MgICAgICAxCisjZGVmaW5lIERQX1NfTUlOICAgICAgICAyCisjZGVmaW5lIERQX1NfRE9UICAgICAgICAzCisjZGVmaW5lIERQX1NfTUFYICAgICAgICA0CisjZGVmaW5lIERQX1NfTU9EICAgICAgICA1CisjZGVmaW5lIERQX1NfQ09OViAgICAgICA2CisjZGVmaW5lIERQX1NfRE9ORSAgICAgICA3CisKKy8qIGZvcm1hdCBmbGFncyAtIEJpdHMgKi8KKyNkZWZpbmUgRFBfRl9NSU5VUyAgICAgICgxIDw8IDApCisjZGVmaW5lIERQX0ZfUExVUyAgICAgICAoMSA8PCAxKQorI2RlZmluZSBEUF9GX1NQQUNFICAgICAgKDEgPDwgMikKKyNkZWZpbmUgRFBfRl9OVU0gICAgICAgICgxIDw8IDMpCisjZGVmaW5lIERQX0ZfWkVSTyAgICAgICAoMSA8PCA0KQorI2RlZmluZSBEUF9GX1VQICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgRFBfRl9VTlNJR05FRCAgICgxIDw8IDYpCisKKy8qIGNvbnZlcnNpb24gZmxhZ3MgKi8KKyNkZWZpbmUgRFBfQ19TSE9SVCAgICAgIDEKKyNkZWZpbmUgRFBfQ19MT05HICAgICAgIDIKKyNkZWZpbmUgRFBfQ19MRE9VQkxFICAgIDMKKyNkZWZpbmUgRFBfQ19MTE9ORyAgICAgIDQKKworLyogc29tZSBoYW5keSBtYWNyb3MgKi8KKyNkZWZpbmUgY2hhcl90b19pbnQocCkgKHAgLSAnMCcpCisjZGVmaW5lIE9TU0xfTUFYKHAscSkgKChwID49IHEpID8gcCA6IHEpCisKK3N0YXRpYyB2b2lkCitfZG9wcigKKyAgICBjaGFyICoqc2J1ZmZlciwKKyAgICBjaGFyICoqYnVmZmVyLAorICAgIHNpemVfdCAqbWF4bGVuLAorICAgIHNpemVfdCAqcmV0bGVuLAorICAgIGludCAqdHJ1bmNhdGVkLAorICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICB2YV9saXN0IGFyZ3MpCit7CisgICAgY2hhciBjaDsKKyAgICBMTE9ORyB2YWx1ZTsKKyAgICBMRE9VQkxFIGZ2YWx1ZTsKKyAgICBjaGFyICpzdHJ2YWx1ZTsKKyAgICBpbnQgbWluOworICAgIGludCBtYXg7CisgICAgaW50IHN0YXRlOworICAgIGludCBmbGFnczsKKyAgICBpbnQgY2ZsYWdzOworICAgIHNpemVfdCBjdXJybGVuOworCisgICAgc3RhdGUgPSBEUF9TX0RFRkFVTFQ7CisgICAgZmxhZ3MgPSBjdXJybGVuID0gY2ZsYWdzID0gbWluID0gMDsKKyAgICBtYXggPSAtMTsKKyAgICBjaCA9ICpmb3JtYXQrKzsKKworICAgIHdoaWxlIChzdGF0ZSAhPSBEUF9TX0RPTkUpIHsKKyAgICAgICAgaWYgKGNoID09ICdcMCcgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIGN1cnJsZW4gPj0gKm1heGxlbikpCisgICAgICAgICAgICBzdGF0ZSA9IERQX1NfRE9ORTsKKworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgRFBfU19ERUZBVUxUOgorICAgICAgICAgICAgaWYgKGNoID09ICclJykKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IERQX1NfRkxBR1M7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZG9hcHJfb3V0Y2goc2J1ZmZlcixidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIGNoKTsKKyAgICAgICAgICAgIGNoID0gKmZvcm1hdCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFBfU19GTEFHUzoKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJy0nOgorICAgICAgICAgICAgICAgIGZsYWdzIHw9IERQX0ZfTUlOVVM7CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcrJzoKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBEUF9GX1BMVVM7CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcgJzoKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBEUF9GX1NQQUNFOworICAgICAgICAgICAgICAgIGNoID0gKmZvcm1hdCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnIyc6CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRFBfRl9OVU07CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcwJzoKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBEUF9GX1pFUk87CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHN0YXRlID0gRFBfU19NSU47CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEUF9TX01JTjoKKyAgICAgICAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWNoKSkgeworICAgICAgICAgICAgICAgIG1pbiA9IDEwICogbWluICsgY2hhcl90b19pbnQoY2gpOworICAgICAgICAgICAgICAgIGNoID0gKmZvcm1hdCsrOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBtaW4gPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICAgICAgICAgICAgICBjaCA9ICpmb3JtYXQrKzsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IERQX1NfRE9UOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgc3RhdGUgPSBEUF9TX0RPVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERQX1NfRE9UOgorICAgICAgICAgICAgaWYgKGNoID09ICcuJykgeworICAgICAgICAgICAgICAgIHN0YXRlID0gRFBfU19NQVg7CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IERQX1NfTU9EOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRFBfU19NQVg6CisgICAgICAgICAgICBpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhciljaCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobWF4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gMDsKKyAgICAgICAgICAgICAgICBtYXggPSAxMCAqIG1heCArIGNoYXJfdG9faW50KGNoKTsKKyAgICAgICAgICAgICAgICBjaCA9ICpmb3JtYXQrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyonKSB7CisgICAgICAgICAgICAgICAgbWF4ID0gdmFfYXJnKGFyZ3MsIGludCk7CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBEUF9TX01PRDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHN0YXRlID0gRFBfU19NT0Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEUF9TX01PRDoKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgICAgIGNmbGFncyA9IERQX0NfU0hPUlQ7CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdsJzoKKyAgICAgICAgICAgICAgICBpZiAoKmZvcm1hdCA9PSAnbCcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2ZsYWdzID0gRFBfQ19MTE9ORzsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNmbGFncyA9IERQX0NfTE9ORzsKKyAgICAgICAgICAgICAgICBjaCA9ICpmb3JtYXQrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3EnOgorICAgICAgICAgICAgICAgIGNmbGFncyA9IERQX0NfTExPTkc7CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICBjZmxhZ3MgPSBEUF9DX0xET1VCTEU7CisgICAgICAgICAgICAgICAgY2ggPSAqZm9ybWF0Kys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUgPSBEUF9TX0NPTlY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEUF9TX0NPTlY6CisgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgIHN3aXRjaCAoY2ZsYWdzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBEUF9DX1NIT1JUOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IChzaG9ydCBpbnQpdmFfYXJnKGFyZ3MsIGludCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRFBfQ19MT05HOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhX2FyZyhhcmdzLCBsb25nIGludCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRFBfQ19MTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YV9hcmcoYXJncywgTExPTkcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhX2FyZyhhcmdzLCBpbnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm10aW50KHNidWZmZXIsIGJ1ZmZlciwgJmN1cnJsZW4sIG1heGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIDEwLCBtaW4sIG1heCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRFBfRl9VUDsKKyAgICAgICAgICAgICAgICAvKiBGQUxMVEhST1VHSCAqLworICAgICAgICAgICAgY2FzZSAneCc6CisgICAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgICAgIGZsYWdzIHw9IERQX0ZfVU5TSUdORUQ7CisgICAgICAgICAgICAgICAgc3dpdGNoIChjZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERQX0NfU0hPUlQ6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHVuc2lnbmVkIHNob3J0IGludCl2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEUF9DX0xPTkc6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKExMT05HKSB2YV9hcmcoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEUF9DX0xMT05HOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBMTE9ORyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKExMT05HKSB2YV9hcmcoYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmbXRpbnQoc2J1ZmZlciwgYnVmZmVyLCAmY3VycmxlbiwgbWF4bGVuLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2ggPT0gJ28nID8gOCA6IChjaCA9PSAndScgPyAxMCA6IDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWluLCBtYXgsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgICAgIGlmIChjZmxhZ3MgPT0gRFBfQ19MRE9VQkxFKQorICAgICAgICAgICAgICAgICAgICBmdmFsdWUgPSB2YV9hcmcoYXJncywgTERPVUJMRSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmdmFsdWUgPSB2YV9hcmcoYXJncywgZG91YmxlKTsKKyAgICAgICAgICAgICAgICBmbXRmcChzYnVmZmVyLCBidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sCisgICAgICAgICAgICAgICAgICAgICAgZnZhbHVlLCBtaW4sIG1heCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRSc6CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRFBfRl9VUDsKKyAgICAgICAgICAgIGNhc2UgJ2UnOgorICAgICAgICAgICAgICAgIGlmIChjZmxhZ3MgPT0gRFBfQ19MRE9VQkxFKQorICAgICAgICAgICAgICAgICAgICBmdmFsdWUgPSB2YV9hcmcoYXJncywgTERPVUJMRSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmdmFsdWUgPSB2YV9hcmcoYXJncywgZG91YmxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgICAgIGZsYWdzIHw9IERQX0ZfVVA7CisgICAgICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgICAgICAgICBpZiAoY2ZsYWdzID09IERQX0NfTERPVUJMRSkKKyAgICAgICAgICAgICAgICAgICAgZnZhbHVlID0gdmFfYXJnKGFyZ3MsIExET1VCTEUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZnZhbHVlID0gdmFfYXJnKGFyZ3MsIGRvdWJsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgICAgICAgICBkb2Fwcl9vdXRjaChzYnVmZmVyLCBidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyhhcmdzLCBpbnQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICAgIHN0cnZhbHVlID0gdmFfYXJnKGFyZ3MsIGNoYXIgKik7CisgICAgICAgICAgICAgICAgaWYgKG1heCA8IDApIHsKKwkJICAgIGlmIChidWZmZXIpCisJCQltYXggPSBJTlRfTUFYOworCQkgICAgZWxzZQorCQkJbWF4ID0gKm1heGxlbjsKKwkJfQorICAgICAgICAgICAgICAgIGZtdHN0cihzYnVmZmVyLCBidWZmZXIsICZjdXJybGVuLCBtYXhsZW4sIHN0cnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbWluLCBtYXgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAobG9uZyl2YV9hcmcoYXJncywgdm9pZCAqKTsKKyAgICAgICAgICAgICAgICBmbXRpbnQoc2J1ZmZlciwgYnVmZmVyLCAmY3VycmxlbiwgbWF4bGVuLAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgMTYsIG1pbiwgbWF4LCBmbGFnc3xEUF9GX05VTSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICduJzogLyogWFhYICovCisgICAgICAgICAgICAgICAgaWYgKGNmbGFncyA9PSBEUF9DX1NIT1JUKSB7CisgICAgICAgICAgICAgICAgICAgIHNob3J0IGludCAqbnVtOworICAgICAgICAgICAgICAgICAgICBudW0gPSB2YV9hcmcoYXJncywgc2hvcnQgaW50ICopOworICAgICAgICAgICAgICAgICAgICAqbnVtID0gY3VycmxlbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xPTkcpIHsgLyogWFhYICovCisgICAgICAgICAgICAgICAgICAgIGxvbmcgaW50ICpudW07CisgICAgICAgICAgICAgICAgICAgIG51bSA9IHZhX2FyZyhhcmdzLCBsb25nIGludCAqKTsKKyAgICAgICAgICAgICAgICAgICAgKm51bSA9IChsb25nIGludCkgY3VycmxlbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNmbGFncyA9PSBEUF9DX0xMT05HKSB7IC8qIFhYWCAqLworICAgICAgICAgICAgICAgICAgICBMTE9ORyAqbnVtOworICAgICAgICAgICAgICAgICAgICBudW0gPSB2YV9hcmcoYXJncywgTExPTkcgKik7CisgICAgICAgICAgICAgICAgICAgICpudW0gPSAoTExPTkcpIGN1cnJsZW47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ICAgICpudW07CisgICAgICAgICAgICAgICAgICAgIG51bSA9IHZhX2FyZyhhcmdzLCBpbnQgKik7CisgICAgICAgICAgICAgICAgICAgICpudW0gPSBjdXJybGVuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgICAgIGRvYXByX291dGNoKHNidWZmZXIsIGJ1ZmZlciwgJmN1cnJsZW4sIG1heGxlbiwgY2gpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICAgICAgLyogbm90IHN1cHBvcnRlZCB5ZXQsIHRyZWF0IGFzIG5leHQgY2hhciAqLworICAgICAgICAgICAgICAgIGNoID0gKmZvcm1hdCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvKiB1bmtub3duLCBza2lwICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaCA9ICpmb3JtYXQrKzsKKyAgICAgICAgICAgIHN0YXRlID0gRFBfU19ERUZBVUxUOworICAgICAgICAgICAgZmxhZ3MgPSBjZmxhZ3MgPSBtaW4gPSAwOworICAgICAgICAgICAgbWF4ID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEUF9TX0RPTkU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgICp0cnVuY2F0ZWQgPSAoY3VycmxlbiA+ICptYXhsZW4gLSAxKTsKKyAgICBpZiAoKnRydW5jYXRlZCkKKyAgICAgICAgY3VycmxlbiA9ICptYXhsZW4gLSAxOworICAgIGRvYXByX291dGNoKHNidWZmZXIsIGJ1ZmZlciwgJmN1cnJsZW4sIG1heGxlbiwgJ1wwJyk7CisgICAgKnJldGxlbiA9IGN1cnJsZW4gLSAxOworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2ZtdHN0cigKKyAgICBjaGFyICoqc2J1ZmZlciwKKyAgICBjaGFyICoqYnVmZmVyLAorICAgIHNpemVfdCAqY3VycmxlbiwKKyAgICBzaXplX3QgKm1heGxlbiwKKyAgICBjb25zdCBjaGFyICp2YWx1ZSwKKyAgICBpbnQgZmxhZ3MsCisgICAgaW50IG1pbiwKKyAgICBpbnQgbWF4KQoreworICAgIGludCBwYWRsZW4sIHN0cmxuOworICAgIGludCBjbnQgPSAwOworCisgICAgaWYgKHZhbHVlID09IDApCisgICAgICAgIHZhbHVlID0gIjxOVUxMPiI7CisgICAgZm9yIChzdHJsbiA9IDA7IHZhbHVlW3N0cmxuXTsgKytzdHJsbikKKyAgICAgICAgOworICAgIHBhZGxlbiA9IG1pbiAtIHN0cmxuOworICAgIGlmIChwYWRsZW4gPCAwKQorICAgICAgICBwYWRsZW4gPSAwOworICAgIGlmIChmbGFncyAmIERQX0ZfTUlOVVMpCisgICAgICAgIHBhZGxlbiA9IC1wYWRsZW47CisKKyAgICB3aGlsZSAoKHBhZGxlbiA+IDApICYmIChjbnQgPCBtYXgpKSB7CisgICAgICAgIGRvYXByX291dGNoKHNidWZmZXIsIGJ1ZmZlciwgY3VycmxlbiwgbWF4bGVuLCAnICcpOworICAgICAgICAtLXBhZGxlbjsKKyAgICAgICAgKytjbnQ7CisgICAgfQorICAgIHdoaWxlICgqdmFsdWUgJiYgKGNudCA8IG1heCkpIHsKKyAgICAgICAgZG9hcHJfb3V0Y2goc2J1ZmZlciwgYnVmZmVyLCBjdXJybGVuLCBtYXhsZW4sICp2YWx1ZSsrKTsKKyAgICAgICAgKytjbnQ7CisgICAgfQorICAgIHdoaWxlICgocGFkbGVuIDwgMCkgJiYgKGNudCA8IG1heCkpIHsKKyAgICAgICAgZG9hcHJfb3V0Y2goc2J1ZmZlciwgYnVmZmVyLCBjdXJybGVuLCBtYXhsZW4sICcgJyk7CisgICAgICAgICsrcGFkbGVuOworICAgICAgICArK2NudDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitmbXRpbnQoCisgICAgY2hhciAqKnNidWZmZXIsCisgICAgY2hhciAqKmJ1ZmZlciwKKyAgICBzaXplX3QgKmN1cnJsZW4sCisgICAgc2l6ZV90ICptYXhsZW4sCisgICAgTExPTkcgdmFsdWUsCisgICAgaW50IGJhc2UsCisgICAgaW50IG1pbiwKKyAgICBpbnQgbWF4LAorICAgIGludCBmbGFncykKK3sKKyAgICBpbnQgc2lnbnZhbHVlID0gMDsKKyAgICBjb25zdCBjaGFyICpwcmVmaXggPSAiIjsKKyAgICB1bnNpZ25lZCBMTE9ORyB1dmFsdWU7CisgICAgY2hhciBjb252ZXJ0W0RFQ0lNQUxfU0laRSh2YWx1ZSkrM107CisgICAgaW50IHBsYWNlID0gMDsKKyAgICBpbnQgc3BhZGxlbiA9IDA7CisgICAgaW50IHpwYWRsZW4gPSAwOworICAgIGludCBjYXBzID0gMDsKKworICAgIGlmIChtYXggPCAwKQorICAgICAgICBtYXggPSAwOworICAgIHV2YWx1ZSA9IHZhbHVlOworICAgIGlmICghKGZsYWdzICYgRFBfRl9VTlNJR05FRCkpIHsKKyAgICAgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICAgICAgc2lnbnZhbHVlID0gJy0nOworICAgICAgICAgICAgdXZhbHVlID0gLXZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgRFBfRl9QTFVTKQorICAgICAgICAgICAgc2lnbnZhbHVlID0gJysnOworICAgICAgICBlbHNlIGlmIChmbGFncyAmIERQX0ZfU1BBQ0UpCisgICAgICAgICAgICBzaWdudmFsdWUgPSAnICc7CisgICAgfQorICAgIGlmIChmbGFncyAmIERQX0ZfTlVNKSB7CisJaWYgKGJhc2UgPT0gOCkgcHJlZml4ID0gIjAiOworCWlmIChiYXNlID09IDE2KSBwcmVmaXggPSAiMHgiOworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBEUF9GX1VQKQorICAgICAgICBjYXBzID0gMTsKKyAgICBkbyB7CisgICAgICAgIGNvbnZlcnRbcGxhY2UrK10gPQorICAgICAgICAgICAgKGNhcHMgPyAiMDEyMzQ1Njc4OUFCQ0RFRiIgOiAiMDEyMzQ1Njc4OWFiY2RlZiIpCisgICAgICAgICAgICBbdXZhbHVlICUgKHVuc2lnbmVkKSBiYXNlXTsKKyAgICAgICAgdXZhbHVlID0gKHV2YWx1ZSAvICh1bnNpZ25lZCkgYmFzZSk7CisgICAgfSB3aGlsZSAodXZhbHVlICYmIChwbGFjZSA8IChpbnQpc2l6ZW9mKGNvbnZlcnQpKSk7CisgICAgaWYgKHBsYWNlID09IHNpemVvZihjb252ZXJ0KSkKKyAgICAgICAgcGxhY2UtLTsKKyAgICBjb252ZXJ0W3BsYWNlXSA9IDA7CisKKyAgICB6cGFkbGVuID0gbWF4IC0gcGxhY2U7CisgICAgc3BhZGxlbiA9IG1pbiAtIE9TU0xfTUFYKG1heCwgcGxhY2UpIC0gKHNpZ252YWx1ZSA/IDEgOiAwKSAtIHN0cmxlbihwcmVmaXgpOworICAgIGlmICh6cGFkbGVuIDwgMCkKKyAgICAgICAgenBhZGxlbiA9IDA7CisgICAgaWYgKHNwYWRsZW4gPCAwKQorICAgICAgICBzcGFkbGVuID0gMDsKKyAgICBpZiAoZmxhZ3MgJiBEUF9GX1pFUk8pIHsKKyAgICAgICAgenBhZGxlbiA9IE9TU0xfTUFYKHpwYWRsZW4sIHNwYWRsZW4pOworICAgICAgICBzcGFkbGVuID0gMDsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgRFBfRl9NSU5VUykKKyAgICAgICAgc3BhZGxlbiA9IC1zcGFkbGVuOworCisgICAgLyogc3BhY2VzICovCisgICAgd2hpbGUgKHNwYWRsZW4gPiAwKSB7CisgICAgICAgIGRvYXByX291dGNoKHNidWZmZXIsIGJ1ZmZlciwgY3VycmxlbiwgbWF4bGVuLCAnICcpOworICAgICAgICAtLXNwYWRsZW47CisgICAgfQorCisgICAgLyogc2lnbiAqLworICAgIGlmIChzaWdudmFsdWUpCisgICAgICAgIGRvYXByX291dGNoKHNidWZmZXIsIGJ1ZmZlciwgY3VycmxlbiwgbWF4bGVuLCBzaWdudmFsdWUpOworCisgICAgLyogcHJlZml4ICovCisgICAgd2hpbGUgKCpwcmVmaXgpIHsKKwlkb2Fwcl9vdXRjaChzYnVmZmVyLCBidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwgKnByZWZpeCk7CisJcHJlZml4Kys7CisgICAgfQorCisgICAgLyogemVyb3MgKi8KKyAgICBpZiAoenBhZGxlbiA+IDApIHsKKyAgICAgICAgd2hpbGUgKHpwYWRsZW4gPiAwKSB7CisgICAgICAgICAgICBkb2Fwcl9vdXRjaChzYnVmZmVyLCBidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwgJzAnKTsKKyAgICAgICAgICAgIC0tenBhZGxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBkaWdpdHMgKi8KKyAgICB3aGlsZSAocGxhY2UgPiAwKQorICAgICAgICBkb2Fwcl9vdXRjaChzYnVmZmVyLCBidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwgY29udmVydFstLXBsYWNlXSk7CisKKyAgICAvKiBsZWZ0IGp1c3RpZmllZCBzcGFjZXMgKi8KKyAgICB3aGlsZSAoc3BhZGxlbiA8IDApIHsKKyAgICAgICAgZG9hcHJfb3V0Y2goc2J1ZmZlciwgYnVmZmVyLCBjdXJybGVuLCBtYXhsZW4sICcgJyk7CisgICAgICAgICsrc3BhZGxlbjsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgTERPVUJMRQorYWJzX3ZhbChMRE9VQkxFIHZhbHVlKQoreworICAgIExET1VCTEUgcmVzdWx0ID0gdmFsdWU7CisgICAgaWYgKHZhbHVlIDwgMCkKKyAgICAgICAgcmVzdWx0ID0gLXZhbHVlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBMRE9VQkxFCitwb3dfMTAoaW50IGluX2V4cCkKK3sKKyAgICBMRE9VQkxFIHJlc3VsdCA9IDE7CisgICAgd2hpbGUgKGluX2V4cCkgeworICAgICAgICByZXN1bHQgKj0gMTA7CisgICAgICAgIGluX2V4cC0tOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgbG9uZworcm91bmR2KExET1VCTEUgdmFsdWUpCit7CisgICAgbG9uZyBpbnRwYXJ0OworICAgIGludHBhcnQgPSAobG9uZykgdmFsdWU7CisgICAgdmFsdWUgPSB2YWx1ZSAtIGludHBhcnQ7CisgICAgaWYgKHZhbHVlID49IDAuNSkKKyAgICAgICAgaW50cGFydCsrOworICAgIHJldHVybiBpbnRwYXJ0OworfQorCitzdGF0aWMgdm9pZAorZm10ZnAoCisgICAgY2hhciAqKnNidWZmZXIsCisgICAgY2hhciAqKmJ1ZmZlciwKKyAgICBzaXplX3QgKmN1cnJsZW4sCisgICAgc2l6ZV90ICptYXhsZW4sCisgICAgTERPVUJMRSBmdmFsdWUsCisgICAgaW50IG1pbiwKKyAgICBpbnQgbWF4LAorICAgIGludCBmbGFncykKK3sKKyAgICBpbnQgc2lnbnZhbHVlID0gMDsKKyAgICBMRE9VQkxFIHVmdmFsdWU7CisgICAgY2hhciBpY29udmVydFsyMF07CisgICAgY2hhciBmY29udmVydFsyMF07CisgICAgaW50IGlwbGFjZSA9IDA7CisgICAgaW50IGZwbGFjZSA9IDA7CisgICAgaW50IHBhZGxlbiA9IDA7CisgICAgaW50IHpwYWRsZW4gPSAwOworICAgIGludCBjYXBzID0gMDsKKyAgICBsb25nIGludHBhcnQ7CisgICAgbG9uZyBmcmFjcGFydDsKKyAgICBsb25nIG1heDEwOworCisgICAgaWYgKG1heCA8IDApCisgICAgICAgIG1heCA9IDY7CisgICAgdWZ2YWx1ZSA9IGFic192YWwoZnZhbHVlKTsKKyAgICBpZiAoZnZhbHVlIDwgMCkKKyAgICAgICAgc2lnbnZhbHVlID0gJy0nOworICAgIGVsc2UgaWYgKGZsYWdzICYgRFBfRl9QTFVTKQorICAgICAgICBzaWdudmFsdWUgPSAnKyc7CisgICAgZWxzZSBpZiAoZmxhZ3MgJiBEUF9GX1NQQUNFKQorICAgICAgICBzaWdudmFsdWUgPSAnICc7CisKKyAgICBpbnRwYXJ0ID0gKGxvbmcpdWZ2YWx1ZTsKKworICAgIC8qIHNvcnJ5LCB3ZSBvbmx5IHN1cHBvcnQgOSBkaWdpdHMgcGFzdCB0aGUgZGVjaW1hbCBiZWNhdXNlIG9mIG91cgorICAgICAgIGNvbnZlcnNpb24gbWV0aG9kICovCisgICAgaWYgKG1heCA+IDkpCisgICAgICAgIG1heCA9IDk7CisKKyAgICAvKiB3ZSAiY2hlYXQiIGJ5IGNvbnZlcnRpbmcgdGhlIGZyYWN0aW9uYWwgcGFydCB0byBpbnRlZ2VyIGJ5CisgICAgICAgbXVsdGlwbHlpbmcgYnkgYSBmYWN0b3Igb2YgMTAgKi8KKyAgICBtYXgxMCA9IHJvdW5kdihwb3dfMTAobWF4KSk7CisgICAgZnJhY3BhcnQgPSByb3VuZHYocG93XzEwKG1heCkgKiAodWZ2YWx1ZSAtIGludHBhcnQpKTsKKworICAgIGlmIChmcmFjcGFydCA+PSBtYXgxMCkgeworICAgICAgICBpbnRwYXJ0Kys7CisgICAgICAgIGZyYWNwYXJ0IC09IG1heDEwOworICAgIH0KKworICAgIC8qIGNvbnZlcnQgaW50ZWdlciBwYXJ0ICovCisgICAgZG8geworICAgICAgICBpY29udmVydFtpcGxhY2UrK10gPQorICAgICAgICAgICAgKGNhcHMgPyAiMDEyMzQ1Njc4OUFCQ0RFRiIKKyAgICAgICAgICAgICAgOiAiMDEyMzQ1Njc4OWFiY2RlZiIpW2ludHBhcnQgJSAxMF07CisgICAgICAgIGludHBhcnQgPSAoaW50cGFydCAvIDEwKTsKKyAgICB9IHdoaWxlIChpbnRwYXJ0ICYmIChpcGxhY2UgPCAoaW50KXNpemVvZihpY29udmVydCkpKTsKKyAgICBpZiAoaXBsYWNlID09IHNpemVvZiBpY29udmVydCkKKyAgICAgICAgaXBsYWNlLS07CisgICAgaWNvbnZlcnRbaXBsYWNlXSA9IDA7CisKKyAgICAvKiBjb252ZXJ0IGZyYWN0aW9uYWwgcGFydCAqLworICAgIGRvIHsKKyAgICAgICAgZmNvbnZlcnRbZnBsYWNlKytdID0KKyAgICAgICAgICAgIChjYXBzID8gIjAxMjM0NTY3ODlBQkNERUYiCisgICAgICAgICAgICAgIDogIjAxMjM0NTY3ODlhYmNkZWYiKVtmcmFjcGFydCAlIDEwXTsKKyAgICAgICAgZnJhY3BhcnQgPSAoZnJhY3BhcnQgLyAxMCk7CisgICAgfSB3aGlsZSAoZnBsYWNlIDwgbWF4KTsKKyAgICBpZiAoZnBsYWNlID09IHNpemVvZiBmY29udmVydCkKKyAgICAgICAgZnBsYWNlLS07CisgICAgZmNvbnZlcnRbZnBsYWNlXSA9IDA7CisKKyAgICAvKiAtMSBmb3IgZGVjaW1hbCBwb2ludCwgYW5vdGhlciAtMSBpZiB3ZSBhcmUgcHJpbnRpbmcgYSBzaWduICovCisgICAgcGFkbGVuID0gbWluIC0gaXBsYWNlIC0gbWF4IC0gMSAtICgoc2lnbnZhbHVlKSA/IDEgOiAwKTsKKyAgICB6cGFkbGVuID0gbWF4IC0gZnBsYWNlOworICAgIGlmICh6cGFkbGVuIDwgMCkKKyAgICAgICAgenBhZGxlbiA9IDA7CisgICAgaWYgKHBhZGxlbiA8IDApCisgICAgICAgIHBhZGxlbiA9IDA7CisgICAgaWYgKGZsYWdzICYgRFBfRl9NSU5VUykKKyAgICAgICAgcGFkbGVuID0gLXBhZGxlbjsKKworICAgIGlmICgoZmxhZ3MgJiBEUF9GX1pFUk8pICYmIChwYWRsZW4gPiAwKSkgeworICAgICAgICBpZiAoc2lnbnZhbHVlKSB7CisgICAgICAgICAgICBkb2Fwcl9vdXRjaChzYnVmZmVyLCBidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwgc2lnbnZhbHVlKTsKKyAgICAgICAgICAgIC0tcGFkbGVuOworICAgICAgICAgICAgc2lnbnZhbHVlID0gMDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAocGFkbGVuID4gMCkgeworICAgICAgICAgICAgZG9hcHJfb3V0Y2goc2J1ZmZlciwgYnVmZmVyLCBjdXJybGVuLCBtYXhsZW4sICcwJyk7CisgICAgICAgICAgICAtLXBhZGxlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAocGFkbGVuID4gMCkgeworICAgICAgICBkb2Fwcl9vdXRjaChzYnVmZmVyLCBidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwgJyAnKTsKKyAgICAgICAgLS1wYWRsZW47CisgICAgfQorICAgIGlmIChzaWdudmFsdWUpCisgICAgICAgIGRvYXByX291dGNoKHNidWZmZXIsIGJ1ZmZlciwgY3VycmxlbiwgbWF4bGVuLCBzaWdudmFsdWUpOworCisgICAgd2hpbGUgKGlwbGFjZSA+IDApCisgICAgICAgIGRvYXByX291dGNoKHNidWZmZXIsIGJ1ZmZlciwgY3VycmxlbiwgbWF4bGVuLCBpY29udmVydFstLWlwbGFjZV0pOworCisgICAgLyoKKyAgICAgKiBEZWNpbWFsIHBvaW50LiBUaGlzIHNob3VsZCBwcm9iYWJseSB1c2UgbG9jYWxlIHRvIGZpbmQgdGhlIGNvcnJlY3QKKyAgICAgKiBjaGFyIHRvIHByaW50IG91dC4KKyAgICAgKi8KKyAgICBpZiAobWF4ID4gMCB8fCAoZmxhZ3MgJiBEUF9GX05VTSkpIHsKKyAgICAgICAgZG9hcHJfb3V0Y2goc2J1ZmZlciwgYnVmZmVyLCBjdXJybGVuLCBtYXhsZW4sICcuJyk7CisKKyAgICAgICAgd2hpbGUgKGZwbGFjZSA+IDApCisgICAgICAgICAgICBkb2Fwcl9vdXRjaChzYnVmZmVyLCBidWZmZXIsIGN1cnJsZW4sIG1heGxlbiwgZmNvbnZlcnRbLS1mcGxhY2VdKTsKKyAgICB9CisgICAgd2hpbGUgKHpwYWRsZW4gPiAwKSB7CisgICAgICAgIGRvYXByX291dGNoKHNidWZmZXIsIGJ1ZmZlciwgY3VycmxlbiwgbWF4bGVuLCAnMCcpOworICAgICAgICAtLXpwYWRsZW47CisgICAgfQorCisgICAgd2hpbGUgKHBhZGxlbiA8IDApIHsKKyAgICAgICAgZG9hcHJfb3V0Y2goc2J1ZmZlciwgYnVmZmVyLCBjdXJybGVuLCBtYXhsZW4sICcgJyk7CisgICAgICAgICsrcGFkbGVuOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK2RvYXByX291dGNoKAorICAgIGNoYXIgKipzYnVmZmVyLAorICAgIGNoYXIgKipidWZmZXIsCisgICAgc2l6ZV90ICpjdXJybGVuLAorICAgIHNpemVfdCAqbWF4bGVuLAorICAgIGludCBjKQoreworICAgIC8qIElmIHdlIGhhdmVuJ3QgYXQgbGVhc3Qgb25lIGJ1ZmZlciwgc29tZW9uZSBoYXMgZG9lIGEgYmlnIGJvb2JvbyAqLworICAgIGFzc2VydCgqc2J1ZmZlciAhPSBOVUxMIHx8IGJ1ZmZlciAhPSBOVUxMKTsKKworICAgIGlmIChidWZmZXIpIHsKKwl3aGlsZSAoKmN1cnJsZW4gPj0gKm1heGxlbikgeworCSAgICBpZiAoKmJ1ZmZlciA9PSBOVUxMKSB7CisJCWlmICgqbWF4bGVuID09IDApCisJCSAgICAqbWF4bGVuID0gMTAyNDsKKwkJKmJ1ZmZlciA9IE9QRU5TU0xfbWFsbG9jKCptYXhsZW4pOworCQlpZiAoKmN1cnJsZW4gPiAwKSB7CisJCSAgICBhc3NlcnQoKnNidWZmZXIgIT0gTlVMTCk7CisJCSAgICBtZW1jcHkoKmJ1ZmZlciwgKnNidWZmZXIsICpjdXJybGVuKTsKKwkJfQorCQkqc2J1ZmZlciA9IE5VTEw7CisJICAgIH0gZWxzZSB7CisJCSptYXhsZW4gKz0gMTAyNDsKKwkJKmJ1ZmZlciA9IE9QRU5TU0xfcmVhbGxvYygqYnVmZmVyLCAqbWF4bGVuKTsKKwkgICAgfQorCX0KKwkvKiBXaGF0IHRvIGRvIGlmICpidWZmZXIgaXMgTlVMTD8gKi8KKwlhc3NlcnQoKnNidWZmZXIgIT0gTlVMTCB8fCAqYnVmZmVyICE9IE5VTEwpOworICAgIH0KKworICAgIGlmICgqY3VycmxlbiA8ICptYXhsZW4pIHsKKwlpZiAoKnNidWZmZXIpCisJICAgICgqc2J1ZmZlcilbKCpjdXJybGVuKSsrXSA9IChjaGFyKWM7CisJZWxzZQorCSAgICAoKmJ1ZmZlcilbKCpjdXJybGVuKSsrXSA9IChjaGFyKWM7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgQklPX3ByaW50ZiAoQklPICpiaW8sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCXsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJldDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisKKwlyZXQgPSBCSU9fdnByaW50ZihiaW8sIGZvcm1hdCwgYXJncyk7CisKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgQklPX3ZwcmludGYgKEJJTyAqYmlvLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKKwl7CisJaW50IHJldDsKKwlzaXplX3QgcmV0bGVuOworCWNoYXIgaHVnZWJ1ZlsxMDI0KjJdOwkvKiBXYXMgcHJldmlvdXNseSAxMGssIHdoaWNoIGlzIHVucmVhc29uYWJsZQorCQkJCSAgIGluIHNtYWxsLXN0YWNrIGVudmlyb25tZW50cywgbGlrZSB0aHJlYWRzCisJCQkJICAgb3IgRE9TIHByb2dyYW1zLiAqLworCWNoYXIgKmh1Z2VidWZwID0gaHVnZWJ1ZjsKKwlzaXplX3QgaHVnZWJ1ZnNpemUgPSBzaXplb2YoaHVnZWJ1Zik7CisJY2hhciAqZHluYnVmID0gTlVMTDsKKwlpbnQgaWdub3JlZDsKKworCWR5bmJ1ZiA9IE5VTEw7CisJQ1JZUFRPX3B1c2hfaW5mbygiZG9hcHIoKSIpOworCV9kb3ByKCZodWdlYnVmcCwgJmR5bmJ1ZiwgJmh1Z2VidWZzaXplLAorCQkmcmV0bGVuLCAmaWdub3JlZCwgZm9ybWF0LCBhcmdzKTsKKwlpZiAoZHluYnVmKQorCQl7CisJCXJldD1CSU9fd3JpdGUoYmlvLCBkeW5idWYsIChpbnQpcmV0bGVuKTsKKwkJT1BFTlNTTF9mcmVlKGR5bmJ1Zik7CisJCX0KKwllbHNlCisJCXsKKwkJcmV0PUJJT193cml0ZShiaW8sIGh1Z2VidWYsIChpbnQpcmV0bGVuKTsKKwkJfQorCUNSWVBUT19wb3BfaW5mbygpOworCXJldHVybihyZXQpOworCX0KKworLyogQXMgc25wcmludGYgaXMgbm90IGF2YWlsYWJsZSBldmVyeXdoZXJlLCB3ZSBwcm92aWRlIG91ciBvd24gaW1wbGVtZW50YXRpb24uCisgKiBUaGlzIGZ1bmN0aW9uIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggQklPcywgYnV0IGl0J3MgY2xvc2VseSByZWxhdGVkCisgKiB0byBCSU9fcHJpbnRmLCBhbmQgd2UgbmVlZCAqc29tZSogbmFtZSBwcmVmaXggLi4uCisgKiAoWFhYICB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIHJlbmFtZWQsIGJ1dCB0byB3aGF0PykgKi8KK2ludCBCSU9fc25wcmludGYoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJeworCXZhX2xpc3QgYXJnczsKKwlpbnQgcmV0OworCisJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKworCXJldCA9IEJJT192c25wcmludGYoYnVmLCBuLCBmb3JtYXQsIGFyZ3MpOworCisJdmFfZW5kKGFyZ3MpOworCXJldHVybihyZXQpOworCX0KKworaW50IEJJT192c25wcmludGYoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCisJeworCXNpemVfdCByZXRsZW47CisJaW50IHRydW5jYXRlZDsKKworCV9kb3ByKCZidWYsIE5VTEwsICZuLCAmcmV0bGVuLCAmdHJ1bmNhdGVkLCBmb3JtYXQsIGFyZ3MpOworCisJaWYgKHRydW5jYXRlZCkKKwkJLyogSW4gY2FzZSBvZiB0cnVuY2F0aW9uLCByZXR1cm4gLTEgbGlrZSB0cmFkaXRpb25hbCBzbnByaW50Zi4KKwkJICogKEN1cnJlbnQgZHJhZnRzIGZvciBJU08vSUVDIDk4OTkgc2F5IHNucHJpbnRmIHNob3VsZCByZXR1cm4KKwkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4sCisJCSAqIGhhZCB0aGUgYnVmZmVyIGJlZW4gbGFyZ2UgZW5vdWdoLikgKi8KKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIChyZXRsZW4gPD0gSU5UX01BWCkgPyAoaW50KXJldGxlbiA6IC0xOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYl9zb2NrLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jfc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjBhNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jfc29jay5jCkBAIC0wLDAgKzEsOTQ4IEBACisvKiBjcnlwdG8vYmlvL2Jfc29jay5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIFVTRV9TT0NLRVRTCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkgJiYgZGVmaW5lZChORVRXQVJFX0JTRFNPQ0spCisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpZiBkZWZpbmVkKE5FVFdBUkVfQ0xJQikKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KK05FVERCX0RFRklORV9DT05URVhUCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fU09DSworCisjaW5jbHVkZSA8b3BlbnNzbC9kc28uaD4KKworI2RlZmluZSBTT0NLRVRfUFJPVE9DT0wgSVBQUk9UT19UQ1AKKworI2lmZGVmIFNPX01BWENPTk4KKyNkZWZpbmUgTUFYX0xJU1RFTiAgU09fTUFYQ09OTgorI2VsaWYgZGVmaW5lZChTT01BWENPTk4pCisjZGVmaW5lIE1BWF9MSVNURU4gIFNPTUFYQ09OTgorI2Vsc2UKKyNkZWZpbmUgTUFYX0xJU1RFTiAgMzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSB8fCAoZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAmJiAhZGVmaW5lZChORVRXQVJFX0JTRFNPQ0spKQorc3RhdGljIGludCB3c2FfaW5pdF9kb25lPTA7CisjZW5kaWYKKworLyoKKyAqIFdTQUFQSSBzcGVjaWZpZXIgaXMgcmVxdWlyZWQgdG8gbWFrZSBpbmRpcmVjdCBjYWxscyB0byBydW4tdGltZQorICogbGlua2VkIFdpblNvY2sgMiBmdW5jdGlvbnMgdXNlZCBpbiB0aGlzIG1vZHVsZSwgdG8gYmUgc3BlY2lmaWMKKyAqIFtnZXR8ZnJlZV1hZGRyaW5mbyBhbmQgZ2V0bmFtZWluZm8uIFRoaXMgaXMgYmVjYXVzZSBXaW5Tb2NrIHVzZXMKKyAqIHVzZXMgbm9uLUMgY2FsbGluZyBjb252ZW50aW9uLCBfX3N0ZGNhbGwgdnMuIF9fY2RlY2wsIG9uIHg4NgorICogV2luZG93cy4gT24gbm9uLVdpblNvY2sgcGxhdGZvcm1zIFdTQUFQSSBuZWVkcyB0byBiZSB2b2lkLgorICovCisjaWZuZGVmIFdTQUFQSQorI2RlZmluZSBXU0FBUEkKKyNlbmRpZgorCisjaWYgMAorc3RhdGljIHVuc2lnbmVkIGxvbmcgQklPX2doYm5faGl0cz0wTDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEJJT19naGJuX21pc3M9MEw7CisKKyNkZWZpbmUgR0hCTl9OVU0JNAorc3RhdGljIHN0cnVjdCBnaGJuX2NhY2hlX3N0CisJeworCWNoYXIgbmFtZVsxMjldOworCXN0cnVjdCBob3N0ZW50ICplbnQ7CisJdW5zaWduZWQgbG9uZyBvcmRlcjsKKwl9IGdoYm5fY2FjaGVbR0hCTl9OVU1dOworI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X2lwKGNvbnN0IGNoYXIgKnN0cix1bnNpZ25lZCBjaGFyICppcCk7CisjaWYgMAorc3RhdGljIHZvaWQgZ2hibl9mcmVlKHN0cnVjdCBob3N0ZW50ICphKTsKK3N0YXRpYyBzdHJ1Y3QgaG9zdGVudCAqZ2hibl9kdXAoc3RydWN0IGhvc3RlbnQgKmEpOworI2VuZGlmCitpbnQgQklPX2dldF9ob3N0X2lwKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqaXApCisJeworCWludCBpOworCWludCBlcnIgPSAxOworCWludCBsb2NrZWQgPSAwOworCXN0cnVjdCBob3N0ZW50ICpoZTsKKworCWk9Z2V0X2lwKHN0cixpcCk7CisJaWYgKGkgPCAwKQorCQl7CisJCUJJT2VycihCSU9fRl9CSU9fR0VUX0hPU1RfSVAsQklPX1JfSU5WQUxJRF9JUF9BRERSRVNTKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgc29tZXRoaW5nIHRoYXQgaXMgbW9zdCBwcm9iYWJseSBjb3JyZWN0CisJICAgaW4gc29tZSB3YXksIHNvIGxldCdzIGluaXQgdGhlIHNvY2tldC4gKi8KKwlpZiAoQklPX3NvY2tfaW5pdCgpICE9IDEpCisJCXJldHVybiAwOyAvKiBkb24ndCBnZW5lcmF0ZSBhbm90aGVyIGVycm9yIGNvZGUgaGVyZSAqLworCisJLyogSWYgdGhlIHN0cmluZyBhY3R1YWxseSBjb250YWluZWQgYW4gSVAgYWRkcmVzcywgd2UgbmVlZCBub3QgZG8KKwkgICBhbnl0aGluZyBtb3JlICovCisJaWYgKGkgPiAwKSByZXR1cm4oMSk7CisKKwkvKiBkbyBhIGdldGhvc3RieW5hbWUgKi8KKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0dFVEhPU1RCWU5BTUUpOworCWxvY2tlZCA9IDE7CisJaGU9QklPX2dldGhvc3RieW5hbWUoc3RyKTsKKwlpZiAoaGUgPT0gTlVMTCkKKwkJeworCQlCSU9lcnIoQklPX0ZfQklPX0dFVF9IT1NUX0lQLEJJT19SX0JBRF9IT1NUTkFNRV9MT09LVVApOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogY2FzdCB0byBzaG9ydCBiZWNhdXNlIG9mIHdpbjE2IHdpbnNvY2sgZGVmaW5pdGlvbiAqLworCWlmICgoc2hvcnQpaGUtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCkKKwkJeworCQlCSU9lcnIoQklPX0ZfQklPX0dFVF9IT1NUX0lQLEJJT19SX0dFVEhPU1RCWU5BTUVfQUREUl9JU19OT1RfQUZfSU5FVCk7CisJCWdvdG8gZXJyOworCQl9CisJZm9yIChpPTA7IGk8NDsgaSsrKQorCQlpcFtpXT1oZS0+aF9hZGRyX2xpc3RbMF1baV07CisJZXJyID0gMDsKKworIGVycjoKKwlpZiAobG9ja2VkKQorCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfR0VUSE9TVEJZTkFNRSk7CisJaWYgKGVycikKKwkJeworCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwiaG9zdD0iLHN0cik7CisJCXJldHVybiAwOworCQl9CisJZWxzZQorCQlyZXR1cm4gMTsKKwl9CisKK2ludCBCSU9fZ2V0X3BvcnQoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBzaG9ydCAqcG9ydF9wdHIpCisJeworCWludCBpOworCXN0cnVjdCBzZXJ2ZW50ICpzOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQl7CisJCUJJT2VycihCSU9fRl9CSU9fR0VUX1BPUlQsQklPX1JfTk9fUE9SVF9ERUZJTkVEKTsKKwkJcmV0dXJuKDApOworCQl9CisJaT1hdG9pKHN0cik7CisJaWYgKGkgIT0gMCkKKwkJKnBvcnRfcHRyPSh1bnNpZ25lZCBzaG9ydClpOworCWVsc2UKKwkJeworCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0dFVFNFUlZCWU5BTUUpOworCQkvKiBOb3RlOiB1bmRlciBWTVMgd2l0aCBTT0NLRVRTSFIsIGl0IHNlZW1zIGxpa2UgdGhlIGZpcnN0CisJCSAqIHBhcmFtZXRlciBpcyAnY2hhciAqJywgaW5zdGVhZCBvZiAnY29uc3QgY2hhciAqJworCQkgKi8KKyNpZm5kZWYgQ09OU1RfU1RSSUNUCisJCXM9Z2V0c2VydmJ5bmFtZSgoY2hhciAqKXN0ciwidGNwIik7CisjZWxzZQorCQlzPWdldHNlcnZieW5hbWUoc3RyLCJ0Y3AiKTsKKyNlbmRpZgorCQlpZihzICE9IE5VTEwpCisJCQkqcG9ydF9wdHI9bnRvaHMoKHVuc2lnbmVkIHNob3J0KXMtPnNfcG9ydCk7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19HRVRTRVJWQllOQU1FKTsKKwkJaWYocyA9PSBOVUxMKQorCQkJeworCQkJaWYgKHN0cmNtcChzdHIsImh0dHAiKSA9PSAwKQorCQkJCSpwb3J0X3B0cj04MDsKKwkJCWVsc2UgaWYgKHN0cmNtcChzdHIsInRlbG5ldCIpID09IDApCisJCQkJKnBvcnRfcHRyPTIzOworCQkJZWxzZSBpZiAoc3RyY21wKHN0ciwic29ja3MiKSA9PSAwKQorCQkJCSpwb3J0X3B0cj0xMDgwOworCQkJZWxzZSBpZiAoc3RyY21wKHN0ciwiaHR0cHMiKSA9PSAwKQorCQkJCSpwb3J0X3B0cj00NDM7CisJCQllbHNlIGlmIChzdHJjbXAoc3RyLCJzc2wiKSA9PSAwKQorCQkJCSpwb3J0X3B0cj00NDM7CisJCQllbHNlIGlmIChzdHJjbXAoc3RyLCJmdHAiKSA9PSAwKQorCQkJCSpwb3J0X3B0cj0yMTsKKwkJCWVsc2UgaWYgKHN0cmNtcChzdHIsImdvcGhlciIpID09IDApCisJCQkJKnBvcnRfcHRyPTcwOworI2lmIDAKKwkJCWVsc2UgaWYgKHN0cmNtcChzdHIsIndhaXMiKSA9PSAwKQorCQkJCSpwb3J0X3B0cj0yMTsKKyNlbmRpZgorCQkJZWxzZQorCQkJCXsKKwkJCQlTWVNlcnIoU1lTX0ZfR0VUU0VSVkJZTkFNRSxnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSk7CisJCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDMsInNlcnZpY2U9JyIsc3RyLCInIik7CisJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKwkJfQorCXJldHVybigxKTsKKwl9CisKK2ludCBCSU9fc29ja19lcnJvcihpbnQgc29jaykKKwl7CisJaW50IGosaTsKKwlpbnQgc2l6ZTsKKwkJIAorI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfQkVPU19SNSkKKwlyZXR1cm4gMDsKKyNlbmRpZgorCQkgCisJc2l6ZT1zaXplb2YoaW50KTsKKwkvKiBOb3RlOiB1bmRlciBXaW5kb3dzIHRoZSB0aGlyZCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSAoY2hhciAqKQorCSAqIHdoZXJlYXMgdW5kZXIgb3RoZXIgc3lzdGVtcyBpdCBpcyAodm9pZCAqKSBpZiB5b3UgZG9uJ3QgaGF2ZQorCSAqIGEgY2FzdCBpdCB3aWxsIGNob2tlIHRoZSBjb21waWxlcjogaWYgeW91IGRvIGhhdmUgYSBjYXN0IHRoZW4KKwkgKiB5b3UgY2FuIGVpdGhlciBnbyBmb3IgKGNoYXIgKikgb3IgKHZvaWQgKikuCisJICovCisJaT1nZXRzb2Nrb3B0KHNvY2ssU09MX1NPQ0tFVCxTT19FUlJPUiwodm9pZCAqKSZqLCh2b2lkICopJnNpemUpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuKDEpOworCWVsc2UKKwkJcmV0dXJuKGopOworCX0KKworI2lmIDAKK2xvbmcgQklPX2doYm5fY3RybChpbnQgY21kLCBpbnQgaWFyZywgY2hhciAqcGFyZykKKwl7CisJaW50IGk7CisJY2hhciAqKnA7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgQklPX0dIQk5fQ1RSTF9ISVRTOgorCQlyZXR1cm4oQklPX2doYm5faGl0cyk7CisJCS8qIGJyZWFrOyAqLworCWNhc2UgQklPX0dIQk5fQ1RSTF9NSVNTRVM6CisJCXJldHVybihCSU9fZ2hibl9taXNzKTsKKwkJLyogYnJlYWs7ICovCisJY2FzZSBCSU9fR0hCTl9DVFJMX0NBQ0hFX1NJWkU6CisJCXJldHVybihHSEJOX05VTSk7CisJCS8qIGJyZWFrOyAqLworCWNhc2UgQklPX0dIQk5fQ1RSTF9HRVRfRU5UUlk6CisJCWlmICgoaWFyZyA+PSAwKSAmJiAoaWFyZyA8R0hCTl9OVU0pICYmCisJCQkoZ2hibl9jYWNoZVtpYXJnXS5vcmRlciA+IDApKQorCQkJeworCQkJcD0oY2hhciAqKilwYXJnOworCQkJaWYgKHAgPT0gTlVMTCkgcmV0dXJuKDApOworCQkJKnA9Z2hibl9jYWNoZVtpYXJnXS5uYW1lOworCQkJZ2hibl9jYWNoZVtpYXJnXS5uYW1lWzEyOF09J1wwJzsKKwkJCXJldHVybigxKTsKKwkJCX0KKwkJcmV0dXJuKDApOworCQkvKiBicmVhazsgKi8KKwljYXNlIEJJT19HSEJOX0NUUkxfRkxVU0g6CisJCWZvciAoaT0wOyBpPEdIQk5fTlVNOyBpKyspCisJCQlnaGJuX2NhY2hlW2ldLm9yZGVyPTA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybigwKTsKKwkJfQorCXJldHVybigxKTsKKwl9CisjZW5kaWYKKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgaG9zdGVudCAqZ2hibl9kdXAoc3RydWN0IGhvc3RlbnQgKmEpCisJeworCXN0cnVjdCBob3N0ZW50ICpyZXQ7CisJaW50IGksajsKKworCU1lbUNoZWNrX29mZigpOworCXJldD0oc3RydWN0IGhvc3RlbnQgKilPUEVOU1NMX21hbGxvYyhzaXplb2Yoc3RydWN0IGhvc3RlbnQpKTsKKwlpZiAocmV0ID09IE5VTEwpIHJldHVybihOVUxMKTsKKwltZW1zZXQocmV0LDAsc2l6ZW9mKHN0cnVjdCBob3N0ZW50KSk7CisKKwlmb3IgKGk9MDsgYS0+aF9hbGlhc2VzW2ldICE9IE5VTEw7IGkrKykKKwkJOworCWkrKzsKKwlyZXQtPmhfYWxpYXNlcyA9IChjaGFyICoqKU9QRU5TU0xfbWFsbG9jKGkqc2l6ZW9mKGNoYXIgKikpOworCWlmIChyZXQtPmhfYWxpYXNlcyA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwltZW1zZXQocmV0LT5oX2FsaWFzZXMsIDAsIGkqc2l6ZW9mKGNoYXIgKikpOworCisJZm9yIChpPTA7IGEtPmhfYWRkcl9saXN0W2ldICE9IE5VTEw7IGkrKykKKwkJOworCWkrKzsKKwlyZXQtPmhfYWRkcl9saXN0PShjaGFyICoqKU9QRU5TU0xfbWFsbG9jKGkqc2l6ZW9mKGNoYXIgKikpOworCWlmIChyZXQtPmhfYWRkcl9saXN0ID09IE5VTEwpCisJCWdvdG8gZXJyOworCW1lbXNldChyZXQtPmhfYWRkcl9saXN0LCAwLCBpKnNpemVvZihjaGFyICopKTsKKworCWo9c3RybGVuKGEtPmhfbmFtZSkrMTsKKwlpZiAoKHJldC0+aF9uYW1lPU9QRU5TU0xfbWFsbG9jKGopKSA9PSBOVUxMKSBnb3RvIGVycjsKKwltZW1jcHkoKGNoYXIgKilyZXQtPmhfbmFtZSxhLT5oX25hbWUsaik7CisJZm9yIChpPTA7IGEtPmhfYWxpYXNlc1tpXSAhPSBOVUxMOyBpKyspCisJCXsKKwkJaj1zdHJsZW4oYS0+aF9hbGlhc2VzW2ldKSsxOworCQlpZiAoKHJldC0+aF9hbGlhc2VzW2ldPU9QRU5TU0xfbWFsbG9jKGopKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJbWVtY3B5KHJldC0+aF9hbGlhc2VzW2ldLGEtPmhfYWxpYXNlc1tpXSxqKTsKKwkJfQorCXJldC0+aF9sZW5ndGg9YS0+aF9sZW5ndGg7CisJcmV0LT5oX2FkZHJ0eXBlPWEtPmhfYWRkcnR5cGU7CisJZm9yIChpPTA7IGEtPmhfYWRkcl9saXN0W2ldICE9IE5VTEw7IGkrKykKKwkJeworCQlpZiAoKHJldC0+aF9hZGRyX2xpc3RbaV09T1BFTlNTTF9tYWxsb2MoYS0+aF9sZW5ndGgpKSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCW1lbWNweShyZXQtPmhfYWRkcl9saXN0W2ldLGEtPmhfYWRkcl9saXN0W2ldLGEtPmhfbGVuZ3RoKTsKKwkJfQorCWlmICgwKQorCQl7CitlcnI6CQorCQlpZiAocmV0ICE9IE5VTEwpCisJCQlnaGJuX2ZyZWUocmV0KTsKKwkJcmV0PU5VTEw7CisJCX0KKwlNZW1DaGVja19vbigpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIHZvaWQgZ2hibl9mcmVlKHN0cnVjdCBob3N0ZW50ICphKQorCXsKKwlpbnQgaTsKKworCWlmKGEgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCisJaWYgKGEtPmhfYWxpYXNlcyAhPSBOVUxMKQorCQl7CisJCWZvciAoaT0wOyBhLT5oX2FsaWFzZXNbaV0gIT0gTlVMTDsgaSsrKQorCQkJT1BFTlNTTF9mcmVlKGEtPmhfYWxpYXNlc1tpXSk7CisJCU9QRU5TU0xfZnJlZShhLT5oX2FsaWFzZXMpOworCQl9CisJaWYgKGEtPmhfYWRkcl9saXN0ICE9IE5VTEwpCisJCXsKKwkJZm9yIChpPTA7IGEtPmhfYWRkcl9saXN0W2ldICE9IE5VTEw7IGkrKykKKwkJCU9QRU5TU0xfZnJlZShhLT5oX2FkZHJfbGlzdFtpXSk7CisJCU9QRU5TU0xfZnJlZShhLT5oX2FkZHJfbGlzdCk7CisJCX0KKwlpZiAoYS0+aF9uYW1lICE9IE5VTEwpIE9QRU5TU0xfZnJlZShhLT5oX25hbWUpOworCU9QRU5TU0xfZnJlZShhKTsKKwl9CisKKyNlbmRpZgorCitzdHJ1Y3QgaG9zdGVudCAqQklPX2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKKwl7CisjaWYgMQorCS8qIENhY2hpbmcgZ2V0aG9zdGJ5bmFtZSgpIHJlc3VsdHMgZm9yZXZlciBpcyB3cm9uZywKKwkgKiBzbyB3ZSBoYXZlIHRvIGxldCB0aGUgdHJ1ZSBnZXRob3N0YnluYW1lKCkgd29ycnkgYWJvdXQgdGhpcyAqLworI2lmIChkZWZpbmVkKE5FVFdBUkVfQlNEU09DSykgJiYgIWRlZmluZWQoX19OT1ZFTExfTElCQ19fKSkKKwlyZXR1cm4gZ2V0aG9zdGJ5bmFtZSgoY2hhciopbmFtZSk7CisjZWxzZQorCXJldHVybiBnZXRob3N0YnluYW1lKG5hbWUpOworI2VuZGlmCisjZWxzZQorCXN0cnVjdCBob3N0ZW50ICpyZXQ7CisJaW50IGksbG93aT0wLGo7CisJdW5zaWduZWQgbG9uZyBsb3c9ICh1bnNpZ25lZCBsb25nKS0xOworCisKKyMgIGlmIDAKKwkvKiBJdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gdXNlIGxvY2tpbmcgaGVyZTogVGhlIGZ1bmN0aW9uIGludGVyZmFjZQorCSAqIGlzIG5vdCB0aHJlYWQtc2FmZSwgYmVjYXVzZSB0aHJlYWRzIGNhbiBuZXZlciBiZSBzdXJlIHdoZW4KKwkgKiBzb21lIG90aGVyIHRocmVhZCBkZXN0cm95cyB0aGUgZGF0YSB0aGV5IHdlcmUgZ2l2ZW4gYSBwb2ludGVyIHRvLgorCSAqLworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfR0VUSE9TVEJZTkFNRSk7CisjICBlbmRpZgorCWo9c3RybGVuKG5hbWUpOworCWlmIChqIDwgMTI4KQorCQl7CisJCWZvciAoaT0wOyBpPEdIQk5fTlVNOyBpKyspCisJCQl7CisJCQlpZiAobG93ID4gZ2hibl9jYWNoZVtpXS5vcmRlcikKKwkJCQl7CisJCQkJbG93PWdoYm5fY2FjaGVbaV0ub3JkZXI7CisJCQkJbG93aT1pOworCQkJCX0KKwkJCWlmIChnaGJuX2NhY2hlW2ldLm9yZGVyID4gMCkKKwkJCQl7CisJCQkJaWYgKHN0cm5jbXAobmFtZSxnaGJuX2NhY2hlW2ldLm5hbWUsMTI4KSA9PSAwKQorCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwllbHNlCisJCWk9R0hCTl9OVU07CisKKwlpZiAoaSA9PSBHSEJOX05VTSkgLyogbm8gaGl0Ki8KKwkJeworCQlCSU9fZ2hibl9taXNzKys7CisJCS8qIE5vdGU6IHVuZGVyIFZNUyB3aXRoIFNPQ0tFVFNIUiwgaXQgc2VlbXMgbGlrZSB0aGUgZmlyc3QKKwkJICogcGFyYW1ldGVyIGlzICdjaGFyIConLCBpbnN0ZWFkIG9mICdjb25zdCBjaGFyIConCisJCSAqLworIyAgaWZuZGVmIENPTlNUX1NUUklDVAorCQlyZXQ9Z2V0aG9zdGJ5bmFtZSgoY2hhciAqKW5hbWUpOworIyAgZWxzZQorCQlyZXQ9Z2V0aG9zdGJ5bmFtZShuYW1lKTsKKyMgIGVuZGlmCisKKwkJaWYgKHJldCA9PSBOVUxMKQorCQkJZ290byBlbmQ7CisJCWlmIChqID4gMTI4KSAvKiB0b28gYmlnIHRvIGNhY2hlICovCisJCQl7CisjICBpZiAwCisJCQkvKiBJZiB3ZSB3ZXJlIHRyeWluZyB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdGhyZWFkLXNhZmUgKHdoaWNoCisJCQkgKiBpcyBib3VuZCB0byBmYWlsKSwgd2UnZCBoYXZlIHRvIGdpdmUgdXAgaW4gdGhpcyBjYXNlCisJCQkgKiAob3IgYWxsb2NhdGUgbW9yZSBtZW1vcnkpLiAqLworCQkJcmV0ID0gTlVMTDsKKyMgIGVuZGlmCisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQkvKiBlbHNlIGFkZCB0byBjYWNoZSAqLworCQlpZiAoZ2hibl9jYWNoZVtsb3dpXS5lbnQgIT0gTlVMTCkKKwkJCWdoYm5fZnJlZShnaGJuX2NhY2hlW2xvd2ldLmVudCk7IC8qIFhYWCBub3QgdGhyZWFkLXNhZmUgKi8KKwkJZ2hibl9jYWNoZVtsb3dpXS5uYW1lWzBdID0gJ1wwJzsKKworCQlpZigocmV0PWdoYm5fY2FjaGVbbG93aV0uZW50PWdoYm5fZHVwKHJldCkpID09IE5VTEwpCisJCQl7CisJCQlCSU9lcnIoQklPX0ZfQklPX0dFVEhPU1RCWU5BTUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlbmQ7CisJCQl9CisJCXN0cm5jcHkoZ2hibl9jYWNoZVtsb3dpXS5uYW1lLG5hbWUsMTI4KTsKKwkJZ2hibl9jYWNoZVtsb3dpXS5vcmRlcj1CSU9fZ2hibl9taXNzK0JJT19naGJuX2hpdHM7CisJCX0KKwllbHNlCisJCXsKKwkJQklPX2doYm5faGl0cysrOworCQlyZXQ9IGdoYm5fY2FjaGVbaV0uZW50OworCQlnaGJuX2NhY2hlW2ldLm9yZGVyPUJJT19naGJuX21pc3MrQklPX2doYm5faGl0czsKKwkJfQorZW5kOgorIyAgaWYgMAorCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19HRVRIT1NUQllOQU1FKTsKKyMgIGVuZGlmCisJcmV0dXJuKHJldCk7CisjZW5kaWYKKwl9CisKKworaW50IEJJT19zb2NrX2luaXQodm9pZCkKKwl7CisjaWZkZWYgT1BFTlNTTF9TWVNfV0lORE9XUworCXN0YXRpYyBzdHJ1Y3QgV1NBRGF0YSB3c2Ffc3RhdGU7CisKKwlpZiAoIXdzYV9pbml0X2RvbmUpCisJCXsKKwkJaW50IGVycjsKKwkgIAorCQl3c2FfaW5pdF9kb25lPTE7CisJCW1lbXNldCgmd3NhX3N0YXRlLDAsc2l6ZW9mKHdzYV9zdGF0ZSkpOworCQkvKiBOb3QgbWFraW5nIHdzYV9zdGF0ZSBhdmFpbGFibGUgdG8gdGhlIHJlc3Qgb2YgdGhlCisJCSAqIGNvZGUgaXMgZm9ybWFsbHkgd3JvbmcuIEJ1dCB0aGUgc3RydWN0dXJlcyB3ZSB1c2UKKwkJICogYXJlIFtiZWxlaXZlZCB0byBiZV0gaW52YXJpYWJsZSBhbW9uZyBXaW5zb2NrIERMTHMsCisJCSAqIHdoaWxlIEFQSSBhdmFpbGFiaWxpdHkgaXMgW2V4cGVjdGVkIHRvIGJlXSBwcm9iZWQKKwkJICogYXQgcnVuLXRpbWUgd2l0aCBEU09fZ2xvYmFsX2xvb2t1cC4gKi8KKwkJaWYgKFdTQVN0YXJ0dXAoMHgwMjAyLCZ3c2Ffc3RhdGUpIT0wKQorCQkJeworCQkJZXJyPVdTQUdldExhc3RFcnJvcigpOworCQkJU1lTZXJyKFNZU19GX1dTQVNUQVJUVVAsZXJyKTsKKwkJCUJJT2VycihCSU9fRl9CSU9fU09DS19JTklULEJJT19SX1dTQVNUQVJUVVApOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJfQorI2VuZGlmIC8qIE9QRU5TU0xfU1lTX1dJTkRPV1MgKi8KKyNpZmRlZiBXQVRUMzIKKwlleHRlcm4gaW50IF93YXR0X2RvX2V4aXQ7CisJX3dhdHRfZG9fZXhpdCA9IDA7ICAgIC8qIGRvbid0IG1ha2Ugc29ja19pbml0KCkgY2FsbCBleGl0KCkgKi8KKwlpZiAoc29ja19pbml0KCkpCisJCXJldHVybiAoLTEpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpICYmICFkZWZpbmVkKE5FVFdBUkVfQlNEU09DSykKKyAgICBXT1JEIHdWZXJSZXE7CisgICAgV1NBREFUQSB3c2FEYXRhOworICAgIGludCBlcnI7CisKKyAgICBpZiAoIXdzYV9pbml0X2RvbmUpCisgICAgeworICAgICAgICB3c2FfaW5pdF9kb25lPTE7CisgICAgICAgIHdWZXJSZXEgPSBNQUtFV09SRCggMiwgMCApOworICAgICAgICBlcnIgPSBXU0FTdGFydHVwKHdWZXJSZXEsJndzYURhdGEpOworICAgICAgICBpZiAoZXJyICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFNZU2VycihTWVNfRl9XU0FTVEFSVFVQLGVycik7CisgICAgICAgICAgICBCSU9lcnIoQklPX0ZfQklPX1NPQ0tfSU5JVCxCSU9fUl9XU0FTVEFSVFVQKTsKKyAgICAgICAgICAgIHJldHVybigtMSk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJcmV0dXJuKDEpOworCX0KKwordm9pZCBCSU9fc29ja19jbGVhbnVwKHZvaWQpCisJeworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTkRPV1MKKwlpZiAod3NhX2luaXRfZG9uZSkKKwkJeworCQl3c2FfaW5pdF9kb25lPTA7CisjaWYgMAkJLyogdGhpcyBjYWxsIGlzIGNsYWltZWQgdG8gYmUgbm9uLXByZXNlbnQgaW4gV2luc29jazIgKi8KKwkJV1NBQ2FuY2VsQmxvY2tpbmdDYWxsKCk7CisjZW5kaWYKKwkJV1NBQ2xlYW51cCgpOworCQl9CisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpICYmICFkZWZpbmVkKE5FVFdBUkVfQlNEU09DSykKKyAgIGlmICh3c2FfaW5pdF9kb25lKQorICAgICAgICB7CisgICAgICAgIHdzYV9pbml0X2RvbmU9MDsKKyAgICAgICAgV1NBQ2xlYW51cCgpOworCQl9CisjZW5kaWYKKwl9CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpIHx8IF9fVk1TX1ZFUiA+PSA3MDAwMDAwMAorCitpbnQgQklPX3NvY2tldF9pb2N0bChpbnQgZmQsIGxvbmcgdHlwZSwgdm9pZCAqYXJnKQorCXsKKwlpbnQgaTsKKworI2lmZGVmIF9fREpHUFBfXworCWk9aW9jdGxzb2NrZXQoZmQsdHlwZSwoY2hhciAqKWFyZyk7CisjZWxzZQorCWk9aW9jdGxzb2NrZXQoZmQsdHlwZSxhcmcpOworI2VuZGlmIC8qIF9fREpHUFBfXyAqLworCWlmIChpIDwgMCkKKwkJU1lTZXJyKFNZU19GX0lPQ1RMU09DS0VULGdldF9sYXN0X3NvY2tldF9lcnJvcigpKTsKKwlyZXR1cm4oaSk7CisJfQorI2VuZGlmIC8qIF9fVk1TX1ZFUiAqLworCisvKiBUaGUgcmVhc29uIEkgaGF2ZSBpbXBsZW1lbnRlZCB0aGlzIGluc3RlYWQgb2YgdXNpbmcgc3NjYW5mIGlzIGJlY2F1c2UKKyAqIFZpc3VhbCBDIDEuNTJjIGdpdmVzIGFuIHVucmVzb2x2ZWQgZXh0ZXJuYWwgd2hlbiBsaW5raW5nIGEgRExMIDotKCAqLworc3RhdGljIGludCBnZXRfaXAoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBjaGFyIGlwWzRdKQorCXsKKwl1bnNpZ25lZCBpbnQgdG1wWzRdOworCWludCBudW09MCxjLG9rPTA7CisKKwl0bXBbMF09dG1wWzFdPXRtcFsyXT10bXBbM109MDsKKworCWZvciAoOzspCisJCXsKKwkJYz0gKihzdHIrKyk7CisJCWlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpCisJCQl7CisJCQlvaz0xOworCQkJdG1wW251bV09dG1wW251bV0qMTArYy0nMCc7CisJCQlpZiAodG1wW251bV0gPiAyNTUpIHJldHVybigwKTsKKwkJCX0KKwkJZWxzZSBpZiAoYyA9PSAnLicpCisJCQl7CisJCQlpZiAoIW9rKSByZXR1cm4oLTEpOworCQkJaWYgKG51bSA9PSAzKSByZXR1cm4oMCk7CisJCQludW0rKzsKKwkJCW9rPTA7CisJCQl9CisJCWVsc2UgaWYgKGMgPT0gJ1wwJyAmJiAobnVtID09IDMpICYmIG9rKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCXJldHVybigwKTsKKwkJfQorCWlwWzBdPXRtcFswXTsKKwlpcFsxXT10bXBbMV07CisJaXBbMl09dG1wWzJdOworCWlwWzNdPXRtcFszXTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgQklPX2dldF9hY2NlcHRfc29ja2V0KGNoYXIgKmhvc3QsIGludCBiaW5kX21vZGUpCisJeworCWludCByZXQ9MDsKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNhX2luOworI2lmIE9QRU5TU0xfVVNFX0lQVjYKKwkJc3RydWN0IHNvY2thZGRyX2luNiBzYV9pbjY7CisjZW5kaWYKKwl9IHNlcnZlcixjbGllbnQ7CisJaW50IHM9SU5WQUxJRF9TT0NLRVQsY3MsYWRkcmxlbjsKKwl1bnNpZ25lZCBjaGFyIGlwWzRdOworCXVuc2lnbmVkIHNob3J0IHBvcnQ7CisJY2hhciAqc3RyPU5VTEwsKmU7CisJY2hhciAqaCwqcDsKKwl1bnNpZ25lZCBsb25nIGw7CisJaW50IGVycl9udW07CisKKwlpZiAoQklPX3NvY2tfaW5pdCgpICE9IDEpIHJldHVybihJTlZBTElEX1NPQ0tFVCk7CisKKwlpZiAoKHN0cj1CVUZfc3RyZHVwKGhvc3QpKSA9PSBOVUxMKSByZXR1cm4oSU5WQUxJRF9TT0NLRVQpOworCisJaD1wPU5VTEw7CisJaD1zdHI7CisJZm9yIChlPXN0cjsgKmU7IGUrKykKKwkJeworCQlpZiAoKmUgPT0gJzonKQorCQkJeworCQkJcD1lOworCQkJfQorCQllbHNlIGlmICgqZSA9PSAnLycpCisJCQl7CisJCQkqZT0nXDAnOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwlpZiAocCkJKnArKz0nXDAnOwkvKiBwb2ludHMgYXQgbGFzdCAnOicsICc6OnBvcnQnIGlzIHNwZWNpYWwgW3NlZSBiZWxvd10gKi8KKwllbHNlCXA9aCxoPU5VTEw7CisKKyNpZmRlZiBFQUlfRkFNSUxZCisJZG8geworCXN0YXRpYyB1bmlvbiB7CXZvaWQgKnA7CisJCQlpbnQgKFdTQUFQSSAqZikoY29uc3QgY2hhciAqLGNvbnN0IGNoYXIgKiwKKwkJCQkgY29uc3Qgc3RydWN0IGFkZHJpbmZvICosCisJCQkJIHN0cnVjdCBhZGRyaW5mbyAqKik7CisJCQl9IHBfZ2V0YWRkcmluZm8gPSB7TlVMTH07CisJc3RhdGljIHVuaW9uIHsJdm9pZCAqcDsKKwkJCXZvaWQgKFdTQUFQSSAqZikoc3RydWN0IGFkZHJpbmZvICopOworCQkJfSBwX2ZyZWVhZGRyaW5mbyA9IHtOVUxMfTsKKwlzdHJ1Y3QgYWRkcmluZm8gKnJlcyxoaW50OworCisJaWYgKHBfZ2V0YWRkcmluZm8ucD09TlVMTCkKKwkJeworCQlpZiAoKHBfZ2V0YWRkcmluZm8ucD1EU09fZ2xvYmFsX2xvb2t1cCgiZ2V0YWRkcmluZm8iKSk9PU5VTEwgfHwKKwkJICAgIChwX2ZyZWVhZGRyaW5mby5wPURTT19nbG9iYWxfbG9va3VwKCJmcmVlYWRkcmluZm8iKSk9PU5VTEwpCisJCQlwX2dldGFkZHJpbmZvLnA9KHZvaWQqKS0xOworCQl9CisJaWYgKHBfZ2V0YWRkcmluZm8ucD09KHZvaWQgKiktMSkgYnJlYWs7CisKKwkvKiAnOjpwb3J0JyBlbmZvcmNlcyBJUHY2IHdpbGRjYXJkIGxpc3RlbmVyLiBTb21lIE9TZXMsCisJICogZS5nLiBTb2xhcmlzLCBkZWZhdWx0IHRvIElQdjYgd2l0aG91dCBhbnkgaGludC4gQWxzbworCSAqIG5vdGUgdGhhdCBjb21tb25seSBJUHY2IHdpbGRjaGFyZCBzb2NrZXQgY2FuIHNlcnZpY2UKKwkgKiBJUHY0IGNvbm5lY3Rpb25zIGp1c3QgYXMgd2VsbC4uLiAgKi8KKwltZW1zZXQoJmhpbnQsMCxzaXplb2YoaGludCkpOworCWlmIChoKQorCQl7CisJCWlmIChzdHJjaHIoaCwnOicpKQorCQkJeworCQkJaWYgKGhbMV09PSdcMCcpIGg9TlVMTDsKKyNpZiBPUEVOU1NMX1VTRV9JUFY2CisJCQloaW50LmFpX2ZhbWlseSA9IEFGX0lORVQ2OworI2Vsc2UKKwkJCWg9TlVMTDsKKyNlbmRpZgorCQkJfQorCSAgICAJZWxzZSBpZiAoaFswXT09JyonICYmIGhbMV09PSdcMCcpCisJCQloPU5VTEw7CisJCX0KKworCWlmICgoKnBfZ2V0YWRkcmluZm8uZikoaCxwLCZoaW50LCZyZXMpKSBicmVhazsKKworCWFkZHJsZW4gPSByZXMtPmFpX2FkZHJsZW48PXNpemVvZihzZXJ2ZXIpID8KKwkJCXJlcy0+YWlfYWRkcmxlbiA6CisJCQlzaXplb2Yoc2VydmVyKTsKKwltZW1jcHkoJnNlcnZlciwgcmVzLT5haV9hZGRyLCBhZGRybGVuKTsKKworCSgqcF9mcmVlYWRkcmluZm8uZikocmVzKTsKKwlnb3RvIGFnYWluOworCX0gd2hpbGUgKDApOworI2VuZGlmCisKKwlpZiAoIUJJT19nZXRfcG9ydChwLCZwb3J0KSkgZ290byBlcnI7CisKKwltZW1zZXQoKGNoYXIgKikmc2VydmVyLDAsc2l6ZW9mKHNlcnZlcikpOworCXNlcnZlci5zYV9pbi5zaW5fZmFtaWx5PUFGX0lORVQ7CisJc2VydmVyLnNhX2luLnNpbl9wb3J0PWh0b25zKHBvcnQpOworCWFkZHJsZW4gPSBzaXplb2Yoc2VydmVyLnNhX2luKTsKKworCWlmIChoID09IE5VTEwgfHwgc3RyY21wKGgsIioiKSA9PSAwKQorCQlzZXJ2ZXIuc2FfaW4uc2luX2FkZHIuc19hZGRyPUlOQUREUl9BTlk7CisJZWxzZQorCQl7CisgICAgICAgICAgICAgICAgaWYgKCFCSU9fZ2V0X2hvc3RfaXAoaCwmKGlwWzBdKSkpIGdvdG8gZXJyOworCQlsPSh1bnNpZ25lZCBsb25nKQorCQkJKCh1bnNpZ25lZCBsb25nKWlwWzBdPDwyNEwpfAorCQkJKCh1bnNpZ25lZCBsb25nKWlwWzFdPDwxNkwpfAorCQkJKCh1bnNpZ25lZCBsb25nKWlwWzJdPDwgOEwpfAorCQkJKCh1bnNpZ25lZCBsb25nKWlwWzNdKTsKKwkJc2VydmVyLnNhX2luLnNpbl9hZGRyLnNfYWRkcj1odG9ubChsKTsKKwkJfQorCithZ2FpbjoKKwlzPXNvY2tldChzZXJ2ZXIuc2Euc2FfZmFtaWx5LFNPQ0tfU1RSRUFNLFNPQ0tFVF9QUk9UT0NPTCk7CisJaWYgKHMgPT0gSU5WQUxJRF9TT0NLRVQpCisJCXsKKwkJU1lTZXJyKFNZU19GX1NPQ0tFVCxnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgzLCJwb3J0PSciLGhvc3QsIiciKTsKKwkJQklPZXJyKEJJT19GX0JJT19HRVRfQUNDRVBUX1NPQ0tFVCxCSU9fUl9VTkFCTEVfVE9fQ1JFQVRFX1NPQ0tFVCk7CisJCWdvdG8gZXJyOworCQl9CisKKyNpZmRlZiBTT19SRVVTRUFERFIKKwlpZiAoYmluZF9tb2RlID09IEJJT19CSU5EX1JFVVNFQUREUikKKwkJeworCQlpbnQgaT0xOworCisJCXJldD1zZXRzb2Nrb3B0KHMsU09MX1NPQ0tFVCxTT19SRVVTRUFERFIsKGNoYXIgKikmaSxzaXplb2YoaSkpOworCQliaW5kX21vZGU9QklPX0JJTkRfTk9STUFMOworCQl9CisjZW5kaWYKKwlpZiAoYmluZChzLCZzZXJ2ZXIuc2EsYWRkcmxlbikgPT0gLTEpCisJCXsKKyNpZmRlZiBTT19SRVVTRUFERFIKKwkJZXJyX251bT1nZXRfbGFzdF9zb2NrZXRfZXJyb3IoKTsKKwkJaWYgKChiaW5kX21vZGUgPT0gQklPX0JJTkRfUkVVU0VBRERSX0lGX1VOVVNFRCkgJiYKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU5ET1dTCisJCQkvKiBTb21lIHZlcnNpb25zIG9mIFdpbmRvd3MgZGVmaW5lIEVBRERSSU5VU0UgdG8KKwkJCSAqIGEgZHVtbXkgdmFsdWUuCisJCQkgKi8KKwkJCShlcnJfbnVtID09IFdTQUVBRERSSU5VU0UpKQorI2Vsc2UKKwkJCShlcnJfbnVtID09IEVBRERSSU5VU0UpKQorI2VuZGlmCisJCQl7CisJCQljbGllbnQgPSBzZXJ2ZXI7CisJCQlpZiAoaCA9PSBOVUxMIHx8IHN0cmNtcChoLCIqIikgPT0gMCkKKwkJCQl7CisjaWYgT1BFTlNTTF9VU0VfSVBWNgorCQkJCWlmIChjbGllbnQuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJCQl7CisJCQkJCW1lbXNldCgmY2xpZW50LnNhX2luNi5zaW42X2FkZHIsMCxzaXplb2YoY2xpZW50LnNhX2luNi5zaW42X2FkZHIpKTsKKwkJCQkJY2xpZW50LnNhX2luNi5zaW42X2FkZHIuczZfYWRkclsxNV09MTsKKwkJCQkJfQorCQkJCWVsc2UKKyNlbmRpZgorCQkJCWlmIChjbGllbnQuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpCisJCQkJCXsKKwkJCQkJY2xpZW50LnNhX2luLnNpbl9hZGRyLnNfYWRkcj1odG9ubCgweDdGMDAwMDAxKTsKKwkJCQkJfQorCQkJCWVsc2UJZ290byBlcnI7CisJCQkJfQorCQkJY3M9c29ja2V0KGNsaWVudC5zYS5zYV9mYW1pbHksU09DS19TVFJFQU0sU09DS0VUX1BST1RPQ09MKTsKKwkJCWlmIChjcyAhPSBJTlZBTElEX1NPQ0tFVCkKKwkJCQl7CisJCQkJaW50IGlpOworCQkJCWlpPWNvbm5lY3QoY3MsJmNsaWVudC5zYSxhZGRybGVuKTsKKwkJCQljbG9zZXNvY2tldChjcyk7CisJCQkJaWYgKGlpID09IElOVkFMSURfU09DS0VUKQorCQkJCQl7CisJCQkJCWJpbmRfbW9kZT1CSU9fQklORF9SRVVTRUFERFI7CisJCQkJCWNsb3Nlc29ja2V0KHMpOworCQkJCQlnb3RvIGFnYWluOworCQkJCQl9CisJCQkJLyogZWxzZSBlcnJvciAqLworCQkJCX0KKwkJCS8qIGVsc2UgZXJyb3IgKi8KKwkJCX0KKyNlbmRpZgorCQlTWVNlcnIoU1lTX0ZfQklORCxlcnJfbnVtKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDMsInBvcnQ9JyIsaG9zdCwiJyIpOworCQlCSU9lcnIoQklPX0ZfQklPX0dFVF9BQ0NFUFRfU09DS0VULEJJT19SX1VOQUJMRV9UT19CSU5EX1NPQ0tFVCk7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKGxpc3RlbihzLE1BWF9MSVNURU4pID09IC0xKQorCQl7CisJCVNZU2VycihTWVNfRl9CSU5ELGdldF9sYXN0X3NvY2tldF9lcnJvcigpKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDMsInBvcnQ9JyIsaG9zdCwiJyIpOworCQlCSU9lcnIoQklPX0ZfQklPX0dFVF9BQ0NFUFRfU09DS0VULEJJT19SX1VOQUJMRV9UT19MSVNURU5fU09DS0VUKTsKKwkJZ290byBlcnI7CisJCX0KKwlyZXQ9MTsKK2VycjoKKwlpZiAoc3RyICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzdHIpOworCWlmICgocmV0ID09IDApICYmIChzICE9IElOVkFMSURfU09DS0VUKSkKKwkJeworCQljbG9zZXNvY2tldChzKTsKKwkJcz0gSU5WQUxJRF9TT0NLRVQ7CisJCX0KKwlyZXR1cm4ocyk7CisJfQorCitpbnQgQklPX2FjY2VwdChpbnQgc29jaywgY2hhciAqKmFkZHIpCisJeworCWludCByZXQ9SU5WQUxJRF9TT0NLRVQ7CisJdW5zaWduZWQgbG9uZyBsOworCXVuc2lnbmVkIHNob3J0IHBvcnQ7CisJY2hhciAqcDsKKworCXN0cnVjdCB7CisJLyoKKwkgKiBBcyBmb3IgZm9sbG93aW5nIHVuaW9uLiBUcm91YmxlIGlzIHRoYXQgdGhlcmUgYXJlIHBsYXRmb3JtcworCSAqIHRoYXQgaGF2ZSBzb2NrbGVuX3QgYW5kIHRoZXJlIGFyZSBwbGF0Zm9ybXMgdGhhdCBkb24ndCwgb24KKwkgKiBzb21lIHBsYXRmb3JtcyBzb2NrbGVuX3QgaXMgaW50IGFuZCBvbiBzb21lIHNpemVfdC4gU28gd2hhdAorCSAqIG9uZSBjYW4gZG8/IE9uZSBjYW4gY29vayAjaWZkZWYgc3BhZ2hldHRpLCB3aGljaCBpcyBub3RoaW5nCisJICogYnV0IG1hc29jaGlzdGljLiBPciBvbmUgY2FuIGRvIHVuaW9uIGJldHdlZW4gaW50IGFuZCBzaXplX3QuCisJICogT25lIG5hdHVyYWxseSBkb2VzIGl0IHByaW1hcmlseSBmb3IgNjQtYml0IHBsYXRmb3JtcyB3aGVyZQorCSAqIHNpemVvZihpbnQpICE9IHNpemVvZihzaXplX3QpLiBCdXQgd291bGQgaXQgd29yaz8gTm90ZSB0aGF0CisJICogaWYgc2l6ZV90IG1lbWJlciBpcyBpbml0aWFsaXplZCB0byAwLCB0aGVuIGxhdGVyIGludCBtZW1iZXIKKwkgKiBhc3NpZ25tZW50IG5hdHVyYWxseSBkb2VzIHRoZSBqb2Igb24gbGl0dGxlLWVuZGlhbiBwbGF0Zm9ybXMKKwkgKiByZWdhcmRsZXNzIGFjY2VwdCdzIGV4cGVjdGF0aW9ucyEgV2hhdCBhYm91dCBiaWctZW5kaWFucz8KKwkgKiBJZiBhY2NlcHQgZXhwZWN0cyBpbnQqLCB0aGVuIGl0IHdvcmtzLCBhbmQgaWYgc2l6ZV90KiwgdGhlbgorCSAqIGxlbmd0aCB2YWx1ZSB3b3VsZCBhcHBlYXIgYXMgdW5yZWFzb25hYmx5IGxhcmdlLiBCdXQgdGhpcworCSAqIHdvbid0IHByZXZlbnQgaXQgZnJvbSBmaWxsaW5nIGluIHRoZSBhZGRyZXNzIHN0cnVjdHVyZS4gVGhlCisJICogdHJvdWJsZSBvZiBjb3Vyc2Ugd291bGQgYmUgaWYgYWNjZXB0IHJldHVybnMgbW9yZSBkYXRhIHRoYW4KKwkgKiBhY3R1YWwgYnVmZmVyIGNhbiBhY2NvbW9kYXRlIGFuZCBvdmVyd3JpdGUgc3RhY2suLi4gVGhhdCdzCisJICogd2hlcmUgZWFybHkgT1BFTlNTTF9hc3NlcnQgY29tZXMgaW50byBwaWN0dXJlLiBCZXNpZGVzLCB0aGUKKwkgKiBvbmx5IDY0LWJpdCBiaWctZW5kaWFuIHBsYXRmb3JtIGZvdW5kIHNvIGZhciB0aGF0IGV4cGVjdHMKKwkgKiBzaXplX3QqIGlzIEhQLVVYLCB3aGVyZSBzdGFjayBncm93cyB0b3dhcmRzIGhpZ2hlciBhZGRyZXNzLgorCSAqIDxhcHBybz4KKwkgKi8KKwl1bmlvbiB7IHNpemVfdCBzOyBpbnQgaTsgfSBsZW47CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHIgc2E7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzYV9pbjsKKyNpZiBPUEVOU1NMX1VTRV9JUFY2CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2FfaW42OworI2VuZGlmCisJCX0gZnJvbTsKKwl9IHNhOworCisJc2EubGVuLnM9MDsKKwlzYS5sZW4uaT1zaXplb2Yoc2EuZnJvbSk7CisJbWVtc2V0KCZzYS5mcm9tLDAsc2l6ZW9mKHNhLmZyb20pKTsKKwlyZXQ9YWNjZXB0KHNvY2ssJnNhLmZyb20uc2EsKHZvaWQgKikmc2EubGVuKTsKKwlpZiAoc2l6ZW9mKHNhLmxlbi5pKSE9c2l6ZW9mKHNhLmxlbi5zKSAmJiBzYS5sZW4uaT09MCkKKwkJeworCQlPUEVOU1NMX2Fzc2VydChzYS5sZW4uczw9c2l6ZW9mKHNhLmZyb20pKTsKKwkJc2EubGVuLmkgPSAoaW50KXNhLmxlbi5zOworCQkvKiB1c2Ugc2EubGVuLmkgZnJvbSB0aGlzIHBvaW50ICovCisJCX0KKwlpZiAocmV0ID09IElOVkFMSURfU09DS0VUKQorCQl7CisJCWlmKEJJT19zb2NrX3Nob3VsZF9yZXRyeShyZXQpKSByZXR1cm4gLTI7CisJCVNZU2VycihTWVNfRl9BQ0NFUFQsZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkpOworCQlCSU9lcnIoQklPX0ZfQklPX0FDQ0VQVCxCSU9fUl9BQ0NFUFRfRVJST1IpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGFkZHIgPT0gTlVMTCkgZ290byBlbmQ7CisKKyNpZmRlZiBFQUlfRkFNSUxZCisJZG8geworCWNoYXIgICBoW05JX01BWEhPU1RdLHNbTklfTUFYU0VSVl07CisJc2l6ZV90IG5sOworCXN0YXRpYyB1bmlvbiB7CXZvaWQgKnA7CisJCQlpbnQgKFdTQUFQSSAqZikoY29uc3Qgc3RydWN0IHNvY2thZGRyICosc2l6ZV90Lypzb2NrbGVuX3QqLywKKwkJCQkgY2hhciAqLHNpemVfdCxjaGFyICosc2l6ZV90LGludCk7CisJCQl9IHBfZ2V0bmFtZWluZm8gPSB7TlVMTH07CisJCQkvKiAybmQgYXJndW1lbnQgdG8gZ2V0bmFtZWluZm8gaXMgc3BlY2lmaWVkIHRvCisJCQkgKiBiZSBzb2NrbGVuX3QuIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgYSBudW1iZXIKKwkJCSAqIG9mIGVudmlyb25tZW50cyB3aGVyZSBzb2NrbGVuX3QgaXMgbm90IGRlZmluZWQuCisJCQkgKiBBcyBpdCdzIHBhc3NlZCBieSB2YWx1ZSwgaXQncyBzYWZlIHRvIHBhc3MgaXQKKwkJCSAqIGFzIHNpemVfdC4uLiA8YXBwcm8+ICovCisKKwlpZiAocF9nZXRuYW1laW5mby5wPT1OVUxMKQorCQl7CisJCWlmICgocF9nZXRuYW1laW5mby5wPURTT19nbG9iYWxfbG9va3VwKCJnZXRuYW1laW5mbyIpKT09TlVMTCkKKwkJCXBfZ2V0bmFtZWluZm8ucD0odm9pZCopLTE7CisJCX0KKwlpZiAocF9nZXRuYW1laW5mby5wPT0odm9pZCAqKS0xKSBicmVhazsKKworCWlmICgoKnBfZ2V0bmFtZWluZm8uZikoJnNhLmZyb20uc2Esc2EubGVuLmksaCxzaXplb2YoaCkscyxzaXplb2YocyksCisJICAgIE5JX05VTUVSSUNIT1NUfE5JX05VTUVSSUNTRVJWKSkgYnJlYWs7CisJbmwgPSBzdHJsZW4oaCkrc3RybGVuKHMpKzI7CisJcCA9ICphZGRyOworCWlmIChwKQl7ICpwID0gJ1wwJzsgcCA9IE9QRU5TU0xfcmVhbGxvYyhwLG5sKTsJfQorCWVsc2UJeyBwID0gT1BFTlNTTF9tYWxsb2MobmwpOwkJfQorCWlmIChwPT1OVUxMKQorCQl7CisJCUJJT2VycihCSU9fRl9CSU9fQUNDRVBULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlbmQ7CisJCX0KKwkqYWRkciA9IHA7CisJQklPX3NucHJpbnRmKCphZGRyLG5sLCIlczolcyIsaCxzKTsKKwlnb3RvIGVuZDsKKwl9IHdoaWxlKDApOworI2VuZGlmCisJaWYgKHNhLmZyb20uc2Euc2FfZmFtaWx5ICE9IEFGX0lORVQpIGdvdG8gZW5kOworCWw9bnRvaGwoc2EuZnJvbS5zYV9pbi5zaW5fYWRkci5zX2FkZHIpOworCXBvcnQ9bnRvaHMoc2EuZnJvbS5zYV9pbi5zaW5fcG9ydCk7CisJaWYgKCphZGRyID09IE5VTEwpCisJCXsKKwkJaWYgKChwPU9QRU5TU0xfbWFsbG9jKDI0KSkgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT2VycihCSU9fRl9CSU9fQUNDRVBULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQkqYWRkcj1wOworCQl9CisJQklPX3NucHJpbnRmKCphZGRyLDI0LCIlZC4lZC4lZC4lZDolZCIsCisJCSAgICAgKHVuc2lnbmVkIGNoYXIpKGw+PjI0TCkmMHhmZiwKKwkJICAgICAodW5zaWduZWQgY2hhcikobD4+MTZMKSYweGZmLAorCQkgICAgICh1bnNpZ25lZCBjaGFyKShsPj4gOEwpJjB4ZmYsCisJCSAgICAgKHVuc2lnbmVkIGNoYXIpKGwgICAgICkmMHhmZiwKKwkJICAgICBwb3J0KTsKK2VuZDoKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBCSU9fc2V0X3RjcF9uZGVsYXkoaW50IHMsIGludCBvbikKKwl7CisJaW50IHJldD0wOworI2lmIGRlZmluZWQoVENQX05PREVMQVkpICYmIChkZWZpbmVkKElQUFJPVE9fVENQKSB8fCBkZWZpbmVkKFNPTF9UQ1ApKQorCWludCBvcHQ7CisKKyNpZmRlZiBTT0xfVENQCisJb3B0PVNPTF9UQ1A7CisjZWxzZQorI2lmZGVmIElQUFJPVE9fVENQCisJb3B0PUlQUFJPVE9fVENQOworI2VuZGlmCisjZW5kaWYKKwkKKwlyZXQ9c2V0c29ja29wdChzLG9wdCxUQ1BfTk9ERUxBWSwoY2hhciAqKSZvbixzaXplb2Yob24pKTsKKyNlbmRpZgorCXJldHVybihyZXQgPT0gMCk7CisJfQorI2VuZGlmCisKK2ludCBCSU9fc29ja2V0X25iaW8oaW50IHMsIGludCBtb2RlKQorCXsKKwlpbnQgcmV0PSAtMTsKKwlpbnQgbDsKKworCWw9bW9kZTsKKyNpZmRlZiBGSU9OQklPCisJcmV0PUJJT19zb2NrZXRfaW9jdGwocyxGSU9OQklPLCZsKTsKKyNlbmRpZgorCXJldHVybihyZXQgPT0gMCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iZl9idWZmLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2JmX2J1ZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWZkNzVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iZl9idWZmLmMKQEAgLTAsMCArMSw1MTEgQEAKKy8qIGNyeXB0by9iaW8vYmZfYnVmZi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorCitzdGF0aWMgaW50IGJ1ZmZlcl93cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZixpbnQgbnVtKTsKK3N0YXRpYyBpbnQgYnVmZmVyX3JlYWQoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgYnVmZmVyX3B1dHMoQklPICpoLCBjb25zdCBjaGFyICpzdHIpOworc3RhdGljIGludCBidWZmZXJfZ2V0cyhCSU8gKmgsIGNoYXIgKnN0ciwgaW50IHNpemUpOworc3RhdGljIGxvbmcgYnVmZmVyX2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBidWZmZXJfbmV3KEJJTyAqaCk7CitzdGF0aWMgaW50IGJ1ZmZlcl9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgbG9uZyBidWZmZXJfY2FsbGJhY2tfY3RybChCSU8gKmgsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCk7CisjZGVmaW5lIERFRkFVTFRfQlVGRkVSX1NJWkUJNDA5NgorCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX2J1ZmZlcj0KKwl7CisJQklPX1RZUEVfQlVGRkVSLAorCSJidWZmZXIiLAorCWJ1ZmZlcl93cml0ZSwKKwlidWZmZXJfcmVhZCwKKwlidWZmZXJfcHV0cywKKwlidWZmZXJfZ2V0cywKKwlidWZmZXJfY3RybCwKKwlidWZmZXJfbmV3LAorCWJ1ZmZlcl9mcmVlLAorCWJ1ZmZlcl9jYWxsYmFja19jdHJsLAorCX07CisKK0JJT19NRVRIT0QgKkJJT19mX2J1ZmZlcih2b2lkKQorCXsKKwlyZXR1cm4oJm1ldGhvZHNfYnVmZmVyKTsKKwl9CisKK3N0YXRpYyBpbnQgYnVmZmVyX25ldyhCSU8gKmJpKQorCXsKKwlCSU9fRl9CVUZGRVJfQ1RYICpjdHg7CisKKwljdHg9KEJJT19GX0JVRkZFUl9DVFggKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQklPX0ZfQlVGRkVSX0NUWCkpOworCWlmIChjdHggPT0gTlVMTCkgcmV0dXJuKDApOworCWN0eC0+aWJ1Zj0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKERFRkFVTFRfQlVGRkVSX1NJWkUpOworCWlmIChjdHgtPmlidWYgPT0gTlVMTCkgeyBPUEVOU1NMX2ZyZWUoY3R4KTsgcmV0dXJuKDApOyB9CisJY3R4LT5vYnVmPShjaGFyICopT1BFTlNTTF9tYWxsb2MoREVGQVVMVF9CVUZGRVJfU0laRSk7CisJaWYgKGN0eC0+b2J1ZiA9PSBOVUxMKSB7IE9QRU5TU0xfZnJlZShjdHgtPmlidWYpOyBPUEVOU1NMX2ZyZWUoY3R4KTsgcmV0dXJuKDApOyB9CisJY3R4LT5pYnVmX3NpemU9REVGQVVMVF9CVUZGRVJfU0laRTsKKwljdHgtPm9idWZfc2l6ZT1ERUZBVUxUX0JVRkZFUl9TSVpFOworCWN0eC0+aWJ1Zl9sZW49MDsKKwljdHgtPmlidWZfb2ZmPTA7CisJY3R4LT5vYnVmX2xlbj0wOworCWN0eC0+b2J1Zl9vZmY9MDsKKworCWJpLT5pbml0PTE7CisJYmktPnB0cj0oY2hhciAqKWN0eDsKKwliaS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9mcmVlKEJJTyAqYSkKKwl7CisJQklPX0ZfQlVGRkVSX0NUWCAqYjsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKwliPShCSU9fRl9CVUZGRVJfQ1RYICopYS0+cHRyOworCWlmIChiLT5pYnVmICE9IE5VTEwpIE9QRU5TU0xfZnJlZShiLT5pYnVmKTsKKwlpZiAoYi0+b2J1ZiAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYi0+b2J1Zik7CisJT1BFTlNTTF9mcmVlKGEtPnB0cik7CisJYS0+cHRyPU5VTEw7CisJYS0+aW5pdD0wOworCWEtPmZsYWdzPTA7CisJcmV0dXJuKDEpOworCX0KKwkKK3N0YXRpYyBpbnQgYnVmZmVyX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgaSxudW09MDsKKwlCSU9fRl9CVUZGRVJfQ1RYICpjdHg7CisKKwlpZiAob3V0ID09IE5VTEwpIHJldHVybigwKTsKKwljdHg9KEJJT19GX0JVRkZFUl9DVFggKiliLT5wdHI7CisKKwlpZiAoKGN0eCA9PSBOVUxMKSB8fCAoYi0+bmV4dF9iaW8gPT0gTlVMTCkpIHJldHVybigwKTsKKwludW09MDsKKwlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisKK3N0YXJ0OgorCWk9Y3R4LT5pYnVmX2xlbjsKKwkvKiBJZiB0aGVyZSBpcyBzdHVmZiBsZWZ0IG92ZXIsIGdyYWIgaXQgKi8KKwlpZiAoaSAhPSAwKQorCQl7CisJCWlmIChpID4gb3V0bCkgaT1vdXRsOworCQltZW1jcHkob3V0LCYoY3R4LT5pYnVmW2N0eC0+aWJ1Zl9vZmZdKSxpKTsKKwkJY3R4LT5pYnVmX29mZis9aTsKKwkJY3R4LT5pYnVmX2xlbi09aTsKKwkJbnVtKz1pOworCQlpZiAob3V0bCA9PSBpKSAgcmV0dXJuKG51bSk7CisJCW91dGwtPWk7CisJCW91dCs9aTsKKwkJfQorCisJLyogV2UgbWF5IGhhdmUgZG9uZSBhIHBhcnRpYWwgcmVhZC4gdHJ5IHRvIGRvIG1vcmUuCisJICogV2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIuCisJICogSWYgd2UgZ2V0IGFuIGVycm9yIGFuZCBoYXZlIHJlYWQgc29tZSBkYXRhLCBqdXN0IHJldHVybiBpdAorCSAqIGFuZCBsZXQgdGhlbSByZXRyeSB0byBnZXQgdGhlIGVycm9yIGFnYWluLgorCSAqIGNvcHkgZGlyZWN0IHRvIHBhcmVudCBhZGRyZXNzIHNwYWNlICovCisJaWYgKG91dGwgPiBjdHgtPmlidWZfc2l6ZSkKKwkJeworCQlmb3IgKDs7KQorCQkJeworCQkJaT1CSU9fcmVhZChiLT5uZXh0X2JpbyxvdXQsb3V0bCk7CisJCQlpZiAoaSA8PSAwKQorCQkJCXsKKwkJCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCQkJCWlmIChpIDwgMCkgcmV0dXJuKChudW0gPiAwKT9udW06aSk7CisJCQkJaWYgKGkgPT0gMCkgcmV0dXJuKG51bSk7CisJCQkJfQorCQkJbnVtKz1pOworCQkJaWYgKG91dGwgPT0gaSkgcmV0dXJuKG51bSk7CisJCQlvdXQrPWk7CisJCQlvdXRsLT1pOworCQkJfQorCQl9CisJLyogZWxzZSAqLworCisJLyogd2UgYXJlIGdvaW5nIHRvIGJlIGRvaW5nIHNvbWUgYnVmZmVyaW5nICovCisJaT1CSU9fcmVhZChiLT5uZXh0X2JpbyxjdHgtPmlidWYsY3R4LT5pYnVmX3NpemUpOworCWlmIChpIDw9IDApCisJCXsKKwkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJaWYgKGkgPCAwKSByZXR1cm4oKG51bSA+IDApP251bTppKTsKKwkJaWYgKGkgPT0gMCkgcmV0dXJuKG51bSk7CisJCX0KKwljdHgtPmlidWZfb2ZmPTA7CisJY3R4LT5pYnVmX2xlbj1pOworCisJLyogTGV0cyByZS1yZWFkIHVzaW5nIG91cnNlbHZlcyA6LSkgKi8KKwlnb3RvIHN0YXJ0OworCX0KKworc3RhdGljIGludCBidWZmZXJfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkKKwl7CisJaW50IGksbnVtPTA7CisJQklPX0ZfQlVGRkVSX0NUWCAqY3R4OworCisJaWYgKChpbiA9PSBOVUxMKSB8fCAoaW5sIDw9IDApKSByZXR1cm4oMCk7CisJY3R4PShCSU9fRl9CVUZGRVJfQ1RYICopYi0+cHRyOworCWlmICgoY3R4ID09IE5VTEwpIHx8IChiLT5uZXh0X2JpbyA9PSBOVUxMKSkgcmV0dXJuKDApOworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworc3RhcnQ6CisJaT1jdHgtPm9idWZfc2l6ZS0oY3R4LT5vYnVmX2xlbitjdHgtPm9idWZfb2ZmKTsKKwkvKiBhZGQgdG8gYnVmZmVyIGFuZCByZXR1cm4gKi8KKwlpZiAoaSA+PSBpbmwpCisJCXsKKwkJbWVtY3B5KCYoY3R4LT5vYnVmW2N0eC0+b2J1Zl9sZW5dKSxpbixpbmwpOworCQljdHgtPm9idWZfbGVuKz1pbmw7CisJCXJldHVybihudW0raW5sKTsKKwkJfQorCS8qIGVsc2UgKi8KKwkvKiBzdHVmZiBhbHJlYWR5IGluIGJ1ZmZlciwgc28gYWRkIHRvIGl0IGZpcnN0LCB0aGVuIGZsdXNoICovCisJaWYgKGN0eC0+b2J1Zl9sZW4gIT0gMCkKKwkJeworCQlpZiAoaSA+IDApIC8qIGxldHMgZmlsbCBpdCB1cCBpZiB3ZSBjYW4gKi8KKwkJCXsKKwkJCW1lbWNweSgmKGN0eC0+b2J1ZltjdHgtPm9idWZfbGVuXSksaW4saSk7CisJCQlpbis9aTsKKwkJCWlubC09aTsKKwkJCW51bSs9aTsKKwkJCWN0eC0+b2J1Zl9sZW4rPWk7CisJCQl9CisJCS8qIHdlIG5vdyBoYXZlIGEgZnVsbCBidWZmZXIgbmVlZGluZyBmbHVzaGluZyAqLworCQlmb3IgKDs7KQorCQkJeworCQkJaT1CSU9fd3JpdGUoYi0+bmV4dF9iaW8sJihjdHgtPm9idWZbY3R4LT5vYnVmX29mZl0pLAorCQkJCWN0eC0+b2J1Zl9sZW4pOworCQkJaWYgKGkgPD0gMCkKKwkJCQl7CisJCQkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKworCQkJCWlmIChpIDwgMCkgcmV0dXJuKChudW0gPiAwKT9udW06aSk7CisJCQkJaWYgKGkgPT0gMCkgcmV0dXJuKG51bSk7CisJCQkJfQorCQkJY3R4LT5vYnVmX29mZis9aTsKKwkJCWN0eC0+b2J1Zl9sZW4tPWk7CisJCQlpZiAoY3R4LT5vYnVmX2xlbiA9PSAwKSBicmVhazsKKwkJCX0KKwkJfQorCS8qIHdlIG9ubHkgZ2V0IGhlcmUgaWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkIGFuZCB3ZQorCSAqIHN0aWxsIGhhdmUgc3R1ZmYgdG8gd3JpdGUgKi8KKwljdHgtPm9idWZfb2ZmPTA7CisKKwkvKiB3ZSBub3cgaGF2ZSBpbmwgYnl0ZXMgdG8gd3JpdGUgKi8KKwl3aGlsZSAoaW5sID49IGN0eC0+b2J1Zl9zaXplKQorCQl7CisJCWk9QklPX3dyaXRlKGItPm5leHRfYmlvLGluLGlubCk7CisJCWlmIChpIDw9IDApCisJCQl7CisJCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCQkJaWYgKGkgPCAwKSByZXR1cm4oKG51bSA+IDApP251bTppKTsKKwkJCWlmIChpID09IDApIHJldHVybihudW0pOworCQkJfQorCQludW0rPWk7CisJCWluKz1pOworCQlpbmwtPWk7CisJCWlmIChpbmwgPT0gMCkgcmV0dXJuKG51bSk7CisJCX0KKworCS8qIGNvcHkgdGhlIHJlc3QgaW50byB0aGUgYnVmZmVyIHNpbmNlIHdlIGhhdmUgb25seSBhIHNtYWxsIAorCSAqIGFtb3VudCBsZWZ0ICovCisJZ290byBzdGFydDsKKwl9CisKK3N0YXRpYyBsb25nIGJ1ZmZlcl9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJQklPICpkYmlvOworCUJJT19GX0JVRkZFUl9DVFggKmN0eDsKKwlsb25nIHJldD0xOworCWNoYXIgKnAxLCpwMjsKKwlpbnQgcixpLCppcDsKKwlpbnQgaWJzLG9iczsKKworCWN0eD0oQklPX0ZfQlVGRkVSX0NUWCAqKWItPnB0cjsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBCSU9fQ1RSTF9SRVNFVDoKKwkJY3R4LT5pYnVmX29mZj0wOworCQljdHgtPmlidWZfbGVuPTA7CisJCWN0eC0+b2J1Zl9vZmY9MDsKKwkJY3R4LT5vYnVmX2xlbj0wOworCQlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0lORk86CisJCXJldD0obG9uZyljdHgtPm9idWZfbGVuOworCQlicmVhazsKKwljYXNlIEJJT19DX0dFVF9CVUZGX05VTV9MSU5FUzoKKwkJcmV0PTA7CisJCXAxPWN0eC0+aWJ1ZjsKKwkJZm9yIChpPWN0eC0+aWJ1Zl9vZmY7IGk8Y3R4LT5pYnVmX2xlbjsgaSsrKQorCQkJeworCQkJaWYgKHAxW2ldID09ICdcbicpIHJldCsrOworCQkJfQorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCQlyZXQ9KGxvbmcpY3R4LT5vYnVmX2xlbjsKKwkJaWYgKHJldCA9PSAwKQorCQkJeworCQkJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwkJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCQl9CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfUEVORElORzoKKwkJcmV0PShsb25nKWN0eC0+aWJ1Zl9sZW47CisJCWlmIChyZXQgPT0gMCkKKwkJCXsKKwkJCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQkJfQorCQlicmVhazsKKwljYXNlIEJJT19DX1NFVF9CVUZGX1JFQURfREFUQToKKwkJaWYgKG51bSA+IGN0eC0+aWJ1Zl9zaXplKQorCQkJeworCQkJcDE9T1BFTlNTTF9tYWxsb2MoKGludCludW0pOworCQkJaWYgKHAxID09IE5VTEwpIGdvdG8gbWFsbG9jX2Vycm9yOworCQkJaWYgKGN0eC0+aWJ1ZiAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoY3R4LT5pYnVmKTsKKwkJCWN0eC0+aWJ1Zj1wMTsKKwkJCX0KKwkJY3R4LT5pYnVmX29mZj0wOworCQljdHgtPmlidWZfbGVuPShpbnQpbnVtOworCQltZW1jcHkoY3R4LT5pYnVmLHB0ciwoaW50KW51bSk7CisJCXJldD0xOworCQlicmVhazsKKwljYXNlIEJJT19DX1NFVF9CVUZGX1NJWkU6CisJCWlmIChwdHIgIT0gTlVMTCkKKwkJCXsKKwkJCWlwPShpbnQgKilwdHI7CisJCQlpZiAoKmlwID09IDApCisJCQkJeworCQkJCWlicz0oaW50KW51bTsKKwkJCQlvYnM9Y3R4LT5vYnVmX3NpemU7CisJCQkJfQorCQkJZWxzZSAvKiBpZiAoKmlwID09IDEpICovCisJCQkJeworCQkJCWlicz1jdHgtPmlidWZfc2l6ZTsKKwkJCQlvYnM9KGludCludW07CisJCQkJfQorCQkJfQorCQllbHNlCisJCQl7CisJCQlpYnM9KGludCludW07CisJCQlvYnM9KGludCludW07CisJCQl9CisJCXAxPWN0eC0+aWJ1ZjsKKwkJcDI9Y3R4LT5vYnVmOworCQlpZiAoKGlicyA+IERFRkFVTFRfQlVGRkVSX1NJWkUpICYmIChpYnMgIT0gY3R4LT5pYnVmX3NpemUpKQorCQkJeworCQkJcDE9KGNoYXIgKilPUEVOU1NMX21hbGxvYygoaW50KW51bSk7CisJCQlpZiAocDEgPT0gTlVMTCkgZ290byBtYWxsb2NfZXJyb3I7CisJCQl9CisJCWlmICgob2JzID4gREVGQVVMVF9CVUZGRVJfU0laRSkgJiYgKG9icyAhPSBjdHgtPm9idWZfc2l6ZSkpCisJCQl7CisJCQlwMj0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbnVtKTsKKwkJCWlmIChwMiA9PSBOVUxMKQorCQkJCXsKKwkJCQlpZiAocDEgIT0gY3R4LT5pYnVmKSBPUEVOU1NMX2ZyZWUocDEpOworCQkJCWdvdG8gbWFsbG9jX2Vycm9yOworCQkJCX0KKwkJCX0KKwkJaWYgKGN0eC0+aWJ1ZiAhPSBwMSkKKwkJCXsKKwkJCU9QRU5TU0xfZnJlZShjdHgtPmlidWYpOworCQkJY3R4LT5pYnVmPXAxOworCQkJY3R4LT5pYnVmX29mZj0wOworCQkJY3R4LT5pYnVmX2xlbj0wOworCQkJY3R4LT5pYnVmX3NpemU9aWJzOworCQkJfQorCQlpZiAoY3R4LT5vYnVmICE9IHAyKQorCQkJeworCQkJT1BFTlNTTF9mcmVlKGN0eC0+b2J1Zik7CisJCQljdHgtPm9idWY9cDI7CisJCQljdHgtPm9idWZfb2ZmPTA7CisJCQljdHgtPm9idWZfbGVuPTA7CisJCQljdHgtPm9idWZfc2l6ZT1vYnM7CisJCQl9CisJCWJyZWFrOworCWNhc2UgQklPX0NfRE9fU1RBVEVfTUFDSElORToKKwkJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCQlicmVhazsKKworCWNhc2UgQklPX0NUUkxfRkxVU0g6CisJCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJCWlmIChjdHgtPm9idWZfbGVuIDw9IDApCisJCQl7CisJCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQkJYnJlYWs7CisJCQl9CisKKwkJZm9yICg7OykKKwkJCXsKKwkJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJCWlmIChjdHgtPm9idWZfbGVuID4gY3R4LT5vYnVmX29mZikKKwkJCQl7CisJCQkJcj1CSU9fd3JpdGUoYi0+bmV4dF9iaW8sCisJCQkJCSYoY3R4LT5vYnVmW2N0eC0+b2J1Zl9vZmZdKSwKKwkJCQkJY3R4LT5vYnVmX2xlbi1jdHgtPm9idWZfb2ZmKTsKKyNpZiAwCitmcHJpbnRmKHN0ZGVyciwiRkxVU0ggWyUzZF0gJTNkIC0+ICUzZFxuIixjdHgtPm9idWZfb2ZmLGN0eC0+b2J1Zl9sZW4tY3R4LT5vYnVmX29mZixyKTsKKyNlbmRpZgorCQkJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCQkJaWYgKHIgPD0gMCkgcmV0dXJuKChsb25nKXIpOworCQkJCWN0eC0+b2J1Zl9vZmYrPXI7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQljdHgtPm9idWZfbGVuPTA7CisJCQkJY3R4LT5vYnVmX29mZj0wOworCQkJCXJldD0xOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9EVVA6CisJCWRiaW89KEJJTyAqKXB0cjsKKwkJaWYgKAkhQklPX3NldF9yZWFkX2J1ZmZlcl9zaXplKGRiaW8sY3R4LT5pYnVmX3NpemUpIHx8CisJCQkhQklPX3NldF93cml0ZV9idWZmZXJfc2l6ZShkYmlvLGN0eC0+b2J1Zl9zaXplKSkKKwkJCXJldD0wOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworbWFsbG9jX2Vycm9yOgorCUJJT2VycihCSU9fRl9CVUZGRVJfQ1RSTCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJcmV0dXJuKDApOworCX0KKworc3RhdGljIGxvbmcgYnVmZmVyX2NhbGxiYWNrX2N0cmwoQklPICpiLCBpbnQgY21kLCBiaW9faW5mb19jYiAqZnApCisJeworCWxvbmcgcmV0PTE7CisKKwlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCXN3aXRjaCAoY21kKQorCQl7CisJZGVmYXVsdDoKKwkJcmV0PUJJT19jYWxsYmFja19jdHJsKGItPm5leHRfYmlvLGNtZCxmcCk7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9nZXRzKEJJTyAqYiwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKKwl7CisJQklPX0ZfQlVGRkVSX0NUWCAqY3R4OworCWludCBudW09MCxpLGZsYWc7CisJY2hhciAqcDsKKworCWN0eD0oQklPX0ZfQlVGRkVSX0NUWCAqKWItPnB0cjsKKwlzaXplLS07IC8qIHJlc2VydmUgc3BhY2UgZm9yIGEgJ1wwJyAqLworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKworCWZvciAoOzspCisJCXsKKwkJaWYgKGN0eC0+aWJ1Zl9sZW4gPiAwKQorCQkJeworCQkJcD0gJihjdHgtPmlidWZbY3R4LT5pYnVmX29mZl0pOworCQkJZmxhZz0wOworCQkJZm9yIChpPTA7IChpPGN0eC0+aWJ1Zl9sZW4pICYmIChpPHNpemUpOyBpKyspCisJCQkJeworCQkJCSooYnVmKyspPXBbaV07CisJCQkJaWYgKHBbaV0gPT0gJ1xuJykKKwkJCQkJeworCQkJCQlmbGFnPTE7CisJCQkJCWkrKzsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQludW0rPWk7CisJCQlzaXplLT1pOworCQkJY3R4LT5pYnVmX2xlbi09aTsKKwkJCWN0eC0+aWJ1Zl9vZmYrPWk7CisJCQlpZiAoZmxhZyB8fCBzaXplID09IDApCisJCQkJeworCQkJCSpidWY9J1wwJzsKKwkJCQlyZXR1cm4obnVtKTsKKwkJCQl9CisJCQl9CisJCWVsc2UJLyogcmVhZCBhbm90aGVyIGNodW5rICovCisJCQl7CisJCQlpPUJJT19yZWFkKGItPm5leHRfYmlvLGN0eC0+aWJ1ZixjdHgtPmlidWZfc2l6ZSk7CisJCQlpZiAoaSA8PSAwKQorCQkJCXsKKwkJCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCQkJCSpidWY9J1wwJzsKKwkJCQlpZiAoaSA8IDApIHJldHVybigobnVtID4gMCk/bnVtOmkpOworCQkJCWlmIChpID09IDApIHJldHVybihudW0pOworCQkJCX0KKwkJCWN0eC0+aWJ1Zl9sZW49aTsKKwkJCWN0eC0+aWJ1Zl9vZmY9MDsKKwkJCX0KKwkJfQorCX0KKworc3RhdGljIGludCBidWZmZXJfcHV0cyhCSU8gKmIsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJcmV0dXJuKGJ1ZmZlcl93cml0ZShiLHN0cixzdHJsZW4oc3RyKSkpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iZl9sYnVmLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2JmX2xidWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzBmN2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iZl9sYnVmLmMKQEAgLTAsMCArMSwzOTcgQEAKKy8qIGNyeXB0by9iaW8vYmZfYnVmZi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKK3N0YXRpYyBpbnQgbGluZWJ1ZmZlcl93cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZixpbnQgbnVtKTsKK3N0YXRpYyBpbnQgbGluZWJ1ZmZlcl9yZWFkKEJJTyAqaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IGxpbmVidWZmZXJfcHV0cyhCSU8gKmgsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IGxpbmVidWZmZXJfZ2V0cyhCSU8gKmgsIGNoYXIgKnN0ciwgaW50IHNpemUpOworc3RhdGljIGxvbmcgbGluZWJ1ZmZlcl9jdHJsKEJJTyAqaCwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKTsKK3N0YXRpYyBpbnQgbGluZWJ1ZmZlcl9uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgbGluZWJ1ZmZlcl9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgbG9uZyBsaW5lYnVmZmVyX2NhbGxiYWNrX2N0cmwoQklPICpoLCBpbnQgY21kLCBiaW9faW5mb19jYiAqZnApOworCisvKiBBIDEwayBtYXhpbXVtIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgcHVycG9zZXMgKi8KKyNkZWZpbmUgREVGQVVMVF9MSU5FQlVGRkVSX1NJWkUJMTAyNCoxMAorCisvKiAjZGVmaW5lIERFQlVHICovCisKK3N0YXRpYyBCSU9fTUVUSE9EIG1ldGhvZHNfbGluZWJ1ZmZlcj0KKwl7CisJQklPX1RZUEVfTElORUJVRkZFUiwKKwkibGluZWJ1ZmZlciIsCisJbGluZWJ1ZmZlcl93cml0ZSwKKwlsaW5lYnVmZmVyX3JlYWQsCisJbGluZWJ1ZmZlcl9wdXRzLAorCWxpbmVidWZmZXJfZ2V0cywKKwlsaW5lYnVmZmVyX2N0cmwsCisJbGluZWJ1ZmZlcl9uZXcsCisJbGluZWJ1ZmZlcl9mcmVlLAorCWxpbmVidWZmZXJfY2FsbGJhY2tfY3RybCwKKwl9OworCitCSU9fTUVUSE9EICpCSU9fZl9saW5lYnVmZmVyKHZvaWQpCisJeworCXJldHVybigmbWV0aG9kc19saW5lYnVmZmVyKTsKKwl9CisKK3R5cGVkZWYgc3RydWN0IGJpb19saW5lYnVmZmVyX2N0eF9zdHJ1Y3QKKwl7CisJY2hhciAqb2J1ZjsJCS8qIHRoZSBvdXRwdXQgY2hhciBhcnJheSAqLworCWludCBvYnVmX3NpemU7CQkvKiBob3cgYmlnIGlzIHRoZSBvdXRwdXQgYnVmZmVyICovCisJaW50IG9idWZfbGVuOwkJLyogaG93IG1hbnkgYnl0ZXMgYXJlIGluIGl0ICovCisJfSBCSU9fTElORUJVRkZFUl9DVFg7CisKK3N0YXRpYyBpbnQgbGluZWJ1ZmZlcl9uZXcoQklPICpiaSkKKwl7CisJQklPX0xJTkVCVUZGRVJfQ1RYICpjdHg7CisKKwljdHg9KEJJT19MSU5FQlVGRkVSX0NUWCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU9fTElORUJVRkZFUl9DVFgpKTsKKwlpZiAoY3R4ID09IE5VTEwpIHJldHVybigwKTsKKwljdHgtPm9idWY9KGNoYXIgKilPUEVOU1NMX21hbGxvYyhERUZBVUxUX0xJTkVCVUZGRVJfU0laRSk7CisJaWYgKGN0eC0+b2J1ZiA9PSBOVUxMKSB7IE9QRU5TU0xfZnJlZShjdHgpOyByZXR1cm4oMCk7IH0KKwljdHgtPm9idWZfc2l6ZT1ERUZBVUxUX0xJTkVCVUZGRVJfU0laRTsKKwljdHgtPm9idWZfbGVuPTA7CisKKwliaS0+aW5pdD0xOworCWJpLT5wdHI9KGNoYXIgKiljdHg7CisJYmktPmZsYWdzPTA7CisJcmV0dXJuKDEpOworCX0KKworc3RhdGljIGludCBsaW5lYnVmZmVyX2ZyZWUoQklPICphKQorCXsKKwlCSU9fTElORUJVRkZFUl9DVFggKmI7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJYj0oQklPX0xJTkVCVUZGRVJfQ1RYICopYS0+cHRyOworCWlmIChiLT5vYnVmICE9IE5VTEwpIE9QRU5TU0xfZnJlZShiLT5vYnVmKTsKKwlPUEVOU1NMX2ZyZWUoYS0+cHRyKTsKKwlhLT5wdHI9TlVMTDsKKwlhLT5pbml0PTA7CisJYS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCQorc3RhdGljIGludCBsaW5lYnVmZmVyX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgcmV0PTA7CisgCisJaWYgKG91dCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwlyZXQ9QklPX3JlYWQoYi0+bmV4dF9iaW8sb3V0LG91dGwpOworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBsaW5lYnVmZmVyX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpCisJeworCWludCBpLG51bT0wLGZvdW5kbmw7CisJQklPX0xJTkVCVUZGRVJfQ1RYICpjdHg7CisKKwlpZiAoKGluID09IE5VTEwpIHx8IChpbmwgPD0gMCkpIHJldHVybigwKTsKKwljdHg9KEJJT19MSU5FQlVGRkVSX0NUWCAqKWItPnB0cjsKKwlpZiAoKGN0eCA9PSBOVUxMKSB8fCAoYi0+bmV4dF9iaW8gPT0gTlVMTCkpIHJldHVybigwKTsKKworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKworCWRvCisJCXsKKwkJY29uc3QgY2hhciAqcDsKKworCQlmb3IocCA9IGluOyBwIDwgaW4gKyBpbmwgJiYgKnAgIT0gJ1xuJzsgcCsrKQorCQkJOworCQlpZiAoKnAgPT0gJ1xuJykKKwkJCXsKKwkJCXArKzsKKwkJCWZvdW5kbmwgPSAxOworCQkJfQorCQllbHNlCisJCQlmb3VuZG5sID0gMDsKKworCQkvKiBJZiBhIE5MIHdhcyBmb3VuZCBhbmQgd2UgYWxyZWFkeSBoYXZlIHRleHQgaW4gdGhlIHNhdmUKKwkJICAgYnVmZmVyLCBjb25jYXRlbmF0ZSB0aGVtIGFuZCB3cml0ZSAqLworCQl3aGlsZSAoKGZvdW5kbmwgfHwgcCAtIGluID4gY3R4LT5vYnVmX3NpemUgLSBjdHgtPm9idWZfbGVuKQorCQkJJiYgY3R4LT5vYnVmX2xlbiA+IDApCisJCQl7CisJCQlpbnQgb3JpZ19vbGVuID0gY3R4LT5vYnVmX2xlbjsKKwkJCQorCQkJaSA9IGN0eC0+b2J1Zl9zaXplIC0gY3R4LT5vYnVmX2xlbjsKKwkJCWlmIChwIC0gaW4gPiAwKQorCQkJCXsKKwkJCQlpZiAoaSA+PSBwIC0gaW4pCisJCQkJCXsKKwkJCQkJbWVtY3B5KCYoY3R4LT5vYnVmW2N0eC0+b2J1Zl9sZW5dKSwKKwkJCQkJCWluLHAgLSBpbik7CisJCQkJCWN0eC0+b2J1Zl9sZW4gKz0gcCAtIGluOworCQkJCQlpbmwgLT0gcCAtIGluOworCQkJCQludW0gKz0gcCAtIGluOworCQkJCQlpbiA9IHA7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJbWVtY3B5KCYoY3R4LT5vYnVmW2N0eC0+b2J1Zl9sZW5dKSwKKwkJCQkJCWluLGkpOworCQkJCQljdHgtPm9idWZfbGVuICs9IGk7CisJCQkJCWlubCAtPSBpOworCQkJCQlpbiArPSBpOworCQkJCQludW0gKz0gaTsKKwkJCQkJfQorCQkJCX0KKworI2lmIDAKK0JJT193cml0ZShiLT5uZXh0X2JpbywgIjwqPCIsIDMpOworI2VuZGlmCisJCQlpPUJJT193cml0ZShiLT5uZXh0X2JpbywKKwkJCQljdHgtPm9idWYsIGN0eC0+b2J1Zl9sZW4pOworCQkJaWYgKGkgPD0gMCkKKwkJCQl7CisJCQkJY3R4LT5vYnVmX2xlbiA9IG9yaWdfb2xlbjsKKwkJCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCisjaWYgMAorQklPX3dyaXRlKGItPm5leHRfYmlvLCAiPio+IiwgMyk7CisjZW5kaWYKKwkJCQlpZiAoaSA8IDApIHJldHVybigobnVtID4gMCk/bnVtOmkpOworCQkJCWlmIChpID09IDApIHJldHVybihudW0pOworCQkJCX0KKyNpZiAwCitCSU9fd3JpdGUoYi0+bmV4dF9iaW8sICI+Kj4iLCAzKTsKKyNlbmRpZgorCQkJaWYgKGkgPCBjdHgtPm9idWZfbGVuKQorCQkJCW1lbW1vdmUoY3R4LT5vYnVmLCBjdHgtPm9idWYgKyBpLAorCQkJCQljdHgtPm9idWZfbGVuIC0gaSk7CisJCQljdHgtPm9idWZfbGVuLT1pOworCQkJfQorCisJCS8qIE5vdyB0aGF0IHRoZSBzYXZlIGJ1ZmZlciBpcyBlbXB0aWVkLCBsZXQncyB3cml0ZSB0aGUgaW5wdXQKKwkJICAgYnVmZmVyIGlmIGEgTkwgd2FzIGZvdW5kIGFuZCB0aGVyZSBpcyBhbnl0aGluZyB0byB3cml0ZS4gKi8KKwkJaWYgKChmb3VuZG5sIHx8IHAgLSBpbiA+IGN0eC0+b2J1Zl9zaXplKSAmJiBwIC0gaW4gPiAwKQorCQkJeworI2lmIDAKK0JJT193cml0ZShiLT5uZXh0X2JpbywgIjwqPCIsIDMpOworI2VuZGlmCisJCQlpPUJJT193cml0ZShiLT5uZXh0X2JpbyxpbixwIC0gaW4pOworCQkJaWYgKGkgPD0gMCkKKwkJCQl7CisJCQkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKyNpZiAwCitCSU9fd3JpdGUoYi0+bmV4dF9iaW8sICI+Kj4iLCAzKTsKKyNlbmRpZgorCQkJCWlmIChpIDwgMCkgcmV0dXJuKChudW0gPiAwKT9udW06aSk7CisJCQkJaWYgKGkgPT0gMCkgcmV0dXJuKG51bSk7CisJCQkJfQorI2lmIDAKK0JJT193cml0ZShiLT5uZXh0X2JpbywgIj4qPiIsIDMpOworI2VuZGlmCisJCQludW0rPWk7CisJCQlpbis9aTsKKwkJCWlubC09aTsKKwkJCX0KKwkJfQorCXdoaWxlKGZvdW5kbmwgJiYgaW5sID4gMCk7CisJLyogV2UndmUgd3JpdHRlbiBhcyBtdWNoIGFzIHdlIGNhbi4gIFRoZSByZXN0IG9mIHRoZSBpbnB1dCBidWZmZXIsIGlmCisJICAgYW55LCBpcyB0ZXh0IHRoYXQgZG9lc24ndCBhbmQgd2l0aCBhIE5MIGFuZCB0aGVyZWZvcmUgbmVlZHMgdG8gYmUKKwkgICBzYXZlZCBmb3IgdGhlIG5leHQgdHJpcC4gKi8KKwlpZiAoaW5sID4gMCkKKwkJeworCQltZW1jcHkoJihjdHgtPm9idWZbY3R4LT5vYnVmX2xlbl0pLCBpbiwgaW5sKTsKKwkJY3R4LT5vYnVmX2xlbiArPSBpbmw7CisJCW51bSArPSBpbmw7CisJCX0KKwlyZXR1cm4gbnVtOworCX0KKworc3RhdGljIGxvbmcgbGluZWJ1ZmZlcl9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJQklPICpkYmlvOworCUJJT19MSU5FQlVGRkVSX0NUWCAqY3R4OworCWxvbmcgcmV0PTE7CisJY2hhciAqcDsKKwlpbnQgcjsKKwlpbnQgb2JzOworCisJY3R4PShCSU9fTElORUJVRkZFUl9DVFggKiliLT5wdHI7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgQklPX0NUUkxfUkVTRVQ6CisJCWN0eC0+b2J1Zl9sZW49MDsKKwkJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9JTkZPOgorCQlyZXQ9KGxvbmcpY3R4LT5vYnVmX2xlbjsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9XUEVORElORzoKKwkJcmV0PShsb25nKWN0eC0+b2J1Zl9sZW47CisJCWlmIChyZXQgPT0gMCkKKwkJCXsKKwkJCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQkJfQorCQlicmVhazsKKwljYXNlIEJJT19DX1NFVF9CVUZGX1NJWkU6CisJCW9icz0oaW50KW51bTsKKwkJcD1jdHgtPm9idWY7CisJCWlmICgob2JzID4gREVGQVVMVF9MSU5FQlVGRkVSX1NJWkUpICYmIChvYnMgIT0gY3R4LT5vYnVmX3NpemUpKQorCQkJeworCQkJcD0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKChpbnQpbnVtKTsKKwkJCWlmIChwID09IE5VTEwpCisJCQkJZ290byBtYWxsb2NfZXJyb3I7CisJCQl9CisJCWlmIChjdHgtPm9idWYgIT0gcCkKKwkJCXsKKwkJCWlmIChjdHgtPm9idWZfbGVuID4gb2JzKQorCQkJCXsKKwkJCQljdHgtPm9idWZfbGVuID0gb2JzOworCQkJCX0KKwkJCW1lbWNweShwLCBjdHgtPm9idWYsIGN0eC0+b2J1Zl9sZW4pOworCQkJT1BFTlNTTF9mcmVlKGN0eC0+b2J1Zik7CisJCQljdHgtPm9idWY9cDsKKwkJCWN0eC0+b2J1Zl9zaXplPW9iczsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19ET19TVEFURV9NQUNISU5FOgorCQlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCWJyZWFrOworCisJY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKwkJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwkJaWYgKGN0eC0+b2J1Zl9sZW4gPD0gMCkKKwkJCXsKKwkJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCQlicmVhazsKKwkJCX0KKworCQlmb3IgKDs7KQorCQkJeworCQkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCQkJaWYgKGN0eC0+b2J1Zl9sZW4gPiAwKQorCQkJCXsKKwkJCQlyPUJJT193cml0ZShiLT5uZXh0X2JpbywKKwkJCQkJY3R4LT5vYnVmLCBjdHgtPm9idWZfbGVuKTsKKyNpZiAwCitmcHJpbnRmKHN0ZGVyciwiRkxVU0ggJTNkIC0+ICUzZFxuIixjdHgtPm9idWZfbGVuLHIpOworI2VuZGlmCisJCQkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJCQlpZiAociA8PSAwKSByZXR1cm4oKGxvbmcpcik7CisJCQkJaWYgKHIgPCBjdHgtPm9idWZfbGVuKQorCQkJCQltZW1tb3ZlKGN0eC0+b2J1ZiwgY3R4LT5vYnVmICsgciwKKwkJCQkJCWN0eC0+b2J1Zl9sZW4gLSByKTsKKwkJCQljdHgtPm9idWZfbGVuLT1yOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJY3R4LT5vYnVmX2xlbj0wOworCQkJCXJldD0xOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9EVVA6CisJCWRiaW89KEJJTyAqKXB0cjsKKwkJaWYgKAkhQklPX3NldF93cml0ZV9idWZmZXJfc2l6ZShkYmlvLGN0eC0+b2J1Zl9zaXplKSkKKwkJCXJldD0wOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworbWFsbG9jX2Vycm9yOgorCUJJT2VycihCSU9fRl9MSU5FQlVGRkVSX0NUUkwsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyBsb25nIGxpbmVidWZmZXJfY2FsbGJhY2tfY3RybChCSU8gKmIsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCkKKwl7CisJbG9uZyByZXQ9MTsKKworCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJc3dpdGNoIChjbWQpCisJCXsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2NhbGxiYWNrX2N0cmwoYi0+bmV4dF9iaW8sY21kLGZwKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgbGluZWJ1ZmZlcl9nZXRzKEJJTyAqYiwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKKwl7CisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwlyZXR1cm4oQklPX2dldHMoYi0+bmV4dF9iaW8sYnVmLHNpemUpKTsKKwl9CisKK3N0YXRpYyBpbnQgbGluZWJ1ZmZlcl9wdXRzKEJJTyAqYiwgY29uc3QgY2hhciAqc3RyKQorCXsKKwlyZXR1cm4obGluZWJ1ZmZlcl93cml0ZShiLHN0cixzdHJsZW4oc3RyKSkpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iZl9uYmlvLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2JmX25iaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzJhMjNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iZl9uYmlvLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qIGNyeXB0by9iaW8vYmZfbmJpby5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorCisvKiBCSU9fcHV0IGFuZCBCSU9fZ2V0IGJvdGggYWRkIHRvIHRoZSBkaWdlc3QsCisgKiBCSU9fZ2V0cyByZXR1cm5zIHRoZSBkaWdlc3QgKi8KKworc3RhdGljIGludCBuYmlvZl93cml0ZShCSU8gKmgsY29uc3QgY2hhciAqYnVmLGludCBudW0pOworc3RhdGljIGludCBuYmlvZl9yZWFkKEJJTyAqaCxjaGFyICpidWYsaW50IHNpemUpOworc3RhdGljIGludCBuYmlvZl9wdXRzKEJJTyAqaCxjb25zdCBjaGFyICpzdHIpOworc3RhdGljIGludCBuYmlvZl9nZXRzKEJJTyAqaCxjaGFyICpzdHIsaW50IHNpemUpOworc3RhdGljIGxvbmcgbmJpb2ZfY3RybChCSU8gKmgsaW50IGNtZCxsb25nIGFyZzEsdm9pZCAqYXJnMik7CitzdGF0aWMgaW50IG5iaW9mX25ldyhCSU8gKmgpOworc3RhdGljIGludCBuYmlvZl9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgbG9uZyBuYmlvZl9jYWxsYmFja19jdHJsKEJJTyAqaCxpbnQgY21kLGJpb19pbmZvX2NiICpmcCk7Cit0eXBlZGVmIHN0cnVjdCBuYmlvX3Rlc3Rfc3QKKwl7CisJLyogb25seSBzZXQgaWYgd2Ugc2VudCBhICdzaG91bGQgcmV0cnknIGVycm9yICovCisJaW50IGxybjsKKwlpbnQgbHduOworCX0gTkJJT19URVNUOworCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX25iaW9mPQorCXsKKwlCSU9fVFlQRV9OQklPX1RFU1QsCisJIm5vbi1ibG9ja2luZyBJTyB0ZXN0IGZpbHRlciIsCisJbmJpb2Zfd3JpdGUsCisJbmJpb2ZfcmVhZCwKKwluYmlvZl9wdXRzLAorCW5iaW9mX2dldHMsCisJbmJpb2ZfY3RybCwKKwluYmlvZl9uZXcsCisJbmJpb2ZfZnJlZSwKKwluYmlvZl9jYWxsYmFja19jdHJsLAorCX07CisKK0JJT19NRVRIT0QgKkJJT19mX25iaW9fdGVzdCh2b2lkKQorCXsKKwlyZXR1cm4oJm1ldGhvZHNfbmJpb2YpOworCX0KKworc3RhdGljIGludCBuYmlvZl9uZXcoQklPICpiaSkKKwl7CisJTkJJT19URVNUICpudDsKKworCWlmICghKG50PShOQklPX1RFU1QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoTkJJT19URVNUKSkpKSByZXR1cm4oMCk7CisJbnQtPmxybj0gLTE7CisJbnQtPmx3bj0gLTE7CisJYmktPnB0cj0oY2hhciAqKW50OworCWJpLT5pbml0PTE7CisJYmktPmZsYWdzPTA7CisJcmV0dXJuKDEpOworCX0KKworc3RhdGljIGludCBuYmlvZl9mcmVlKEJJTyAqYSkKKwl7CisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCWlmIChhLT5wdHIgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKGEtPnB0cik7CisJYS0+cHRyPU5VTEw7CisJYS0+aW5pdD0wOworCWEtPmZsYWdzPTA7CisJcmV0dXJuKDEpOworCX0KKwkKK3N0YXRpYyBpbnQgbmJpb2ZfcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpCisJeworCU5CSU9fVEVTVCAqbnQ7CisJaW50IHJldD0wOworI2lmIDEKKwlpbnQgbnVtOworCXVuc2lnbmVkIGNoYXIgbjsKKyNlbmRpZgorCisJaWYgKG91dCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwludD0oTkJJT19URVNUICopYi0+cHRyOworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworI2lmIDEKKwlSQU5EX3BzZXVkb19ieXRlcygmbiwxKTsKKwludW09KG4mMHgwNyk7CisKKwlpZiAob3V0bCA+IG51bSkgb3V0bD1udW07CisKKwlpZiAobnVtID09IDApCisJCXsKKwkJcmV0PSAtMTsKKwkJQklPX3NldF9yZXRyeV9yZWFkKGIpOworCQl9CisJZWxzZQorI2VuZGlmCisJCXsKKwkJcmV0PUJJT19yZWFkKGItPm5leHRfYmlvLG91dCxvdXRsKTsKKwkJaWYgKHJldCA8IDApCisJCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IG5iaW9mX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpCisJeworCU5CSU9fVEVTVCAqbnQ7CisJaW50IHJldD0wOworCWludCBudW07CisJdW5zaWduZWQgY2hhciBuOworCisJaWYgKChpbiA9PSBOVUxMKSB8fCAoaW5sIDw9IDApKSByZXR1cm4oMCk7CisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwludD0oTkJJT19URVNUICopYi0+cHRyOworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCisjaWYgMQorCWlmIChudC0+bHduID4gMCkKKwkJeworCQludW09bnQtPmx3bjsKKwkJbnQtPmx3bj0wOworCQl9CisJZWxzZQorCQl7CisJCVJBTkRfcHNldWRvX2J5dGVzKCZuLDEpOworCQludW09KG4mNyk7CisJCX0KKworCWlmIChpbmwgPiBudW0pIGlubD1udW07CisKKwlpZiAobnVtID09IDApCisJCXsKKwkJcmV0PSAtMTsKKwkJQklPX3NldF9yZXRyeV93cml0ZShiKTsKKwkJfQorCWVsc2UKKyNlbmRpZgorCQl7CisJCXJldD1CSU9fd3JpdGUoYi0+bmV4dF9iaW8saW4saW5sKTsKKwkJaWYgKHJldCA8IDApCisJCQl7CisJCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCQkJbnQtPmx3bj1pbmw7CisJCQl9CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIG5iaW9mX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlsb25nIHJldDsKKworCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJc3dpdGNoIChjbWQpCisJCXsKKyAgICAgICAgY2FzZSBCSU9fQ19ET19TVEFURV9NQUNISU5FOgorCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRFVQOgorCQlyZXQ9MEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgbG9uZyBuYmlvZl9jYWxsYmFja19jdHJsKEJJTyAqYiwgaW50IGNtZCwgYmlvX2luZm9fY2IgKmZwKQorCXsKKwlsb25nIHJldD0xOworCisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWRlZmF1bHQ6CisJCXJldD1CSU9fY2FsbGJhY2tfY3RybChiLT5uZXh0X2JpbyxjbWQsZnApOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBuYmlvZl9nZXRzKEJJTyAqYnAsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCisJeworCWlmIChicC0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCXJldHVybihCSU9fZ2V0cyhicC0+bmV4dF9iaW8sYnVmLHNpemUpKTsKKwl9CisKKworc3RhdGljIGludCBuYmlvZl9wdXRzKEJJTyAqYnAsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJaWYgKGJwLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJcmV0dXJuKEJJT19wdXRzKGJwLT5uZXh0X2JpbyxzdHIpKTsKKwl9CisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iZl9udWxsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2JmX251bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWJmMzlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iZl9udWxsLmMKQEAgLTAsMCArMSwxODMgQEAKKy8qIGNyeXB0by9iaW8vYmZfbnVsbC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorCisvKiBCSU9fcHV0IGFuZCBCSU9fZ2V0IGJvdGggYWRkIHRvIHRoZSBkaWdlc3QsCisgKiBCSU9fZ2V0cyByZXR1cm5zIHRoZSBkaWdlc3QgKi8KKworc3RhdGljIGludCBudWxsZl93cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IG51bGxmX3JlYWQoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgbnVsbGZfcHV0cyhCSU8gKmgsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IG51bGxmX2dldHMoQklPICpoLCBjaGFyICpzdHIsIGludCBzaXplKTsKK3N0YXRpYyBsb25nIG51bGxmX2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBudWxsZl9uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgbnVsbGZfZnJlZShCSU8gKmRhdGEpOworc3RhdGljIGxvbmcgbnVsbGZfY2FsbGJhY2tfY3RybChCSU8gKmgsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCk7CitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX251bGxmPQorCXsKKwlCSU9fVFlQRV9OVUxMX0ZJTFRFUiwKKwkiTlVMTCBmaWx0ZXIiLAorCW51bGxmX3dyaXRlLAorCW51bGxmX3JlYWQsCisJbnVsbGZfcHV0cywKKwludWxsZl9nZXRzLAorCW51bGxmX2N0cmwsCisJbnVsbGZfbmV3LAorCW51bGxmX2ZyZWUsCisJbnVsbGZfY2FsbGJhY2tfY3RybCwKKwl9OworCitCSU9fTUVUSE9EICpCSU9fZl9udWxsKHZvaWQpCisJeworCXJldHVybigmbWV0aG9kc19udWxsZik7CisJfQorCitzdGF0aWMgaW50IG51bGxmX25ldyhCSU8gKmJpKQorCXsKKwliaS0+aW5pdD0xOworCWJpLT5wdHI9TlVMTDsKKwliaS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IG51bGxmX2ZyZWUoQklPICphKQorCXsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisvKglhLT5wdHI9TlVMTDsKKwlhLT5pbml0PTA7CisJYS0+ZmxhZ3M9MDsqLworCXJldHVybigxKTsKKwl9CisJCitzdGF0aWMgaW50IG51bGxmX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgcmV0PTA7CisgCisJaWYgKG91dCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwlyZXQ9QklPX3JlYWQoYi0+bmV4dF9iaW8sb3V0LG91dGwpOworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBudWxsZl93cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5sKQorCXsKKwlpbnQgcmV0PTA7CisKKwlpZiAoKGluID09IE5VTEwpIHx8IChpbmwgPD0gMCkpIHJldHVybigwKTsKKwlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCXJldD1CSU9fd3JpdGUoYi0+bmV4dF9iaW8saW4saW5sKTsKKwlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIG51bGxmX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlsb25nIHJldDsKKworCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJc3dpdGNoKGNtZCkKKwkJeworICAgICAgICBjYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6CisJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9EVVA6CisJCXJldD0wTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgbnVsbGZfY2FsbGJhY2tfY3RybChCSU8gKmIsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCkKKwl7CisJbG9uZyByZXQ9MTsKKworCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJc3dpdGNoIChjbWQpCisJCXsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2NhbGxiYWNrX2N0cmwoYi0+bmV4dF9iaW8sY21kLGZwKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgbnVsbGZfZ2V0cyhCSU8gKmJwLCBjaGFyICpidWYsIGludCBzaXplKQorCXsKKwlpZiAoYnAtPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwlyZXR1cm4oQklPX2dldHMoYnAtPm5leHRfYmlvLGJ1ZixzaXplKSk7CisJfQorCisKK3N0YXRpYyBpbnQgbnVsbGZfcHV0cyhCSU8gKmJwLCBjb25zdCBjaGFyICpzdHIpCisJeworCWlmIChicC0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCXJldHVybihCSU9fcHV0cyhicC0+bmV4dF9iaW8sc3RyKSk7CisJfQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYmlvLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjgwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpby5oCkBAIC0wLDAgKzEsNzcwIEBACisvKiBjcnlwdG8vYmlvL2Jpby5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX0JJT19ICisjZGVmaW5lIEhFQURFUl9CSU9fSAorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisjIGluY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZXNlIGFyZSB0aGUgJ3R5cGVzJyBvZiBCSU9zICovCisjZGVmaW5lIEJJT19UWVBFX05PTkUJCTAKKyNkZWZpbmUgQklPX1RZUEVfTUVNCQkoMXwweDA0MDApCisjZGVmaW5lIEJJT19UWVBFX0ZJTEUJCSgyfDB4MDQwMCkKKworI2RlZmluZSBCSU9fVFlQRV9GRAkJKDR8MHgwNDAwfDB4MDEwMCkKKyNkZWZpbmUgQklPX1RZUEVfU09DS0VUCQkoNXwweDA0MDB8MHgwMTAwKQorI2RlZmluZSBCSU9fVFlQRV9OVUxMCQkoNnwweDA0MDApCisjZGVmaW5lIEJJT19UWVBFX1NTTAkJKDd8MHgwMjAwKQorI2RlZmluZSBCSU9fVFlQRV9NRAkJKDh8MHgwMjAwKQkJLyogcGFzc2l2ZSBmaWx0ZXIgKi8KKyNkZWZpbmUgQklPX1RZUEVfQlVGRkVSCQkoOXwweDAyMDApCQkvKiBmaWx0ZXIgKi8KKyNkZWZpbmUgQklPX1RZUEVfQ0lQSEVSCQkoMTB8MHgwMjAwKQkJLyogZmlsdGVyICovCisjZGVmaW5lIEJJT19UWVBFX0JBU0U2NAkJKDExfDB4MDIwMCkJCS8qIGZpbHRlciAqLworI2RlZmluZSBCSU9fVFlQRV9DT05ORUNUCSgxMnwweDA0MDB8MHgwMTAwKQkvKiBzb2NrZXQgLSBjb25uZWN0ICovCisjZGVmaW5lIEJJT19UWVBFX0FDQ0VQVAkJKDEzfDB4MDQwMHwweDAxMDApCS8qIHNvY2tldCBmb3IgYWNjZXB0ICovCisjZGVmaW5lIEJJT19UWVBFX1BST1hZX0NMSUVOVAkoMTR8MHgwMjAwKQkJLyogY2xpZW50IHByb3h5IEJJTyAqLworI2RlZmluZSBCSU9fVFlQRV9QUk9YWV9TRVJWRVIJKDE1fDB4MDIwMCkJCS8qIHNlcnZlciBwcm94eSBCSU8gKi8KKyNkZWZpbmUgQklPX1RZUEVfTkJJT19URVNUCSgxNnwweDAyMDApCQkvKiBzZXJ2ZXIgcHJveHkgQklPICovCisjZGVmaW5lIEJJT19UWVBFX05VTExfRklMVEVSCSgxN3wweDAyMDApCisjZGVmaW5lIEJJT19UWVBFX0JFUgkJKDE4fDB4MDIwMCkJCS8qIEJFUiAtPiBiaW4gZmlsdGVyICovCisjZGVmaW5lIEJJT19UWVBFX0JJTwkJKDE5fDB4MDQwMCkJCS8qIChoYWxmIGEpIEJJTyBwYWlyICovCisjZGVmaW5lIEJJT19UWVBFX0xJTkVCVUZGRVIJKDIwfDB4MDIwMCkJCS8qIGZpbHRlciAqLworI2RlZmluZSBCSU9fVFlQRV9ER1JBTQkJKDIxfDB4MDQwMHwweDAxMDApCisjZGVmaW5lIEJJT19UWVBFX0FTTjEgCQkoMjJ8MHgwMjAwKQkJLyogZmlsdGVyICovCisjZGVmaW5lIEJJT19UWVBFX0NPTVAgCQkoMjN8MHgwMjAwKQkJLyogZmlsdGVyICovCisKKyNkZWZpbmUgQklPX1RZUEVfREVTQ1JJUFRPUgkweDAxMDAJLyogc29ja2V0LCBmZCwgY29ubmVjdCBvciBhY2NlcHQgKi8KKyNkZWZpbmUgQklPX1RZUEVfRklMVEVSCQkweDAyMDAKKyNkZWZpbmUgQklPX1RZUEVfU09VUkNFX1NJTksJMHgwNDAwCisKKy8qIEJJT19GSUxFTkFNRV9SRUFEfEJJT19DTE9TRSB0byBvcGVuIG9yIGNsb3NlIG9uIGZyZWUuCisgKiBCSU9fc2V0X2ZwKGluLHN0ZGluLEJJT19OT0NMT1NFKTsgKi8KKyNkZWZpbmUgQklPX05PQ0xPU0UJCTB4MDAKKyNkZWZpbmUgQklPX0NMT1NFCQkweDAxCisKKy8qIFRoZXNlIGFyZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGFuZCBhcmUgcGFzc2VkIHRvCisgKiBCSU9fY3RybCgpICovCisjZGVmaW5lIEJJT19DVFJMX1JFU0VUCQkxICAvKiBvcHQgLSByZXdpbmQvemVybyBldGMgKi8KKyNkZWZpbmUgQklPX0NUUkxfRU9GCQkyICAvKiBvcHQgLSBhcmUgd2UgYXQgdGhlIGVvZiAqLworI2RlZmluZSBCSU9fQ1RSTF9JTkZPCQkzICAvKiBvcHQgLSBleHRyYSB0aXQtYml0cyAqLworI2RlZmluZSBCSU9fQ1RSTF9TRVQJCTQgIC8qIG1hbiAtIHNldCB0aGUgJ0lPJyB0eXBlICovCisjZGVmaW5lIEJJT19DVFJMX0dFVAkJNSAgLyogbWFuIC0gZ2V0IHRoZSAnSU8nIHR5cGUgKi8KKyNkZWZpbmUgQklPX0NUUkxfUFVTSAkJNiAgLyogb3B0IC0gaW50ZXJuYWwsIHVzZWQgdG8gc2lnbmlmeSBjaGFuZ2UgKi8KKyNkZWZpbmUgQklPX0NUUkxfUE9QCQk3ICAvKiBvcHQgLSBpbnRlcm5hbCwgdXNlZCB0byBzaWduaWZ5IGNoYW5nZSAqLworI2RlZmluZSBCSU9fQ1RSTF9HRVRfQ0xPU0UJOCAgLyogbWFuIC0gc2V0IHRoZSAnY2xvc2UnIG9uIGZyZWUgKi8KKyNkZWZpbmUgQklPX0NUUkxfU0VUX0NMT1NFCTkgIC8qIG1hbiAtIHNldCB0aGUgJ2Nsb3NlJyBvbiBmcmVlICovCisjZGVmaW5lIEJJT19DVFJMX1BFTkRJTkcJMTAgIC8qIG9wdCAtIGlzIHRoZWlyIG1vcmUgZGF0YSBidWZmZXJlZCAqLworI2RlZmluZSBCSU9fQ1RSTF9GTFVTSAkJMTEgIC8qIG9wdCAtICdmbHVzaCcgYnVmZmVyZWQgb3V0cHV0ICovCisjZGVmaW5lIEJJT19DVFJMX0RVUAkJMTIgIC8qIG1hbiAtIGV4dHJhIHN0dWZmIGZvciAnZHVwZWQnIEJJTyAqLworI2RlZmluZSBCSU9fQ1RSTF9XUEVORElORwkxMyAgLyogb3B0IC0gbnVtYmVyIG9mIGJ5dGVzIHN0aWxsIHRvIHdyaXRlICovCisvKiBjYWxsYmFjayBpcyBpbnQgY2IoQklPICpiaW8sc3RhdGUscmV0KTsgKi8KKyNkZWZpbmUgQklPX0NUUkxfU0VUX0NBTExCQUNLCTE0ICAvKiBvcHQgLSBzZXQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQklPX0NUUkxfR0VUX0NBTExCQUNLCTE1ICAvKiBvcHQgLSBzZXQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKworI2RlZmluZSBCSU9fQ1RSTF9TRVRfRklMRU5BTUUJMzAJLyogQklPX3NfZmlsZSBzcGVjaWFsICovCisKKy8qIGRncmFtIEJJTyBzdHVmZiAqLworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9DT05ORUNUICAgICAgIDMxICAvKiBCSU8gZGdyYW0gc3BlY2lhbCAqLworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9TRVRfQ09OTkVDVEVEIDMyICAvKiBhbGxvdyBmb3IgYW4gZXh0ZXJuYWxseQorCQkJCQkgICogY29ubmVjdGVkIHNvY2tldCB0byBiZQorCQkJCQkgICogcGFzc2VkIGluICovIAorI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9TRVRfUkVDVl9USU1FT1VUIDMzIC8qIHNldHNvY2tvcHQsIGVzc2VudGlhbGx5ICovCisjZGVmaW5lIEJJT19DVFJMX0RHUkFNX0dFVF9SRUNWX1RJTUVPVVQgMzQgLyogZ2V0c29ja29wdCwgZXNzZW50aWFsbHkgKi8KKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fU0VUX1NFTkRfVElNRU9VVCAzNSAvKiBzZXRzb2Nrb3B0LCBlc3NlbnRpYWxseSAqLworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9HRVRfU0VORF9USU1FT1VUIDM2IC8qIGdldHNvY2tvcHQsIGVzc2VudGlhbGx5ICovCisKKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fR0VUX1JFQ1ZfVElNRVJfRVhQIDM3IC8qIGZsYWcgd2hldGhlciB0aGUgbGFzdCAqLworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9HRVRfU0VORF9USU1FUl9FWFAgMzggLyogSS9PIG9wZXJhdGlvbiB0aWVtZCBvdXQgKi8KKwkJCQkJCisvKiAjaWZkZWYgSVBfTVRVX0RJU0NPVkVSICovCisjZGVmaW5lIEJJT19DVFJMX0RHUkFNX01UVV9ESVNDT1ZFUiAgICAgICAzOSAvKiBzZXQgREYgYml0IG9uIGVncmVzcyBwYWNrZXRzICovCisvKiAjZW5kaWYgKi8KKworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9RVUVSWV9NVFUgICAgICAgICAgNDAgLyogYXMga2VybmVsIGZvciBjdXJyZW50IE1UVSAqLworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9HRVRfTVRVICAgICAgICAgICAgNDEgLyogZ2V0IGNhY2hlZCB2YWx1ZSBmb3IgTVRVICovCisjZGVmaW5lIEJJT19DVFJMX0RHUkFNX1NFVF9NVFUgICAgICAgICAgICA0MiAvKiBzZXQgY2FjaGVkIHZhbHVlIGZvcgorCQkJCQkgICAgICAqIE1UVS4gd2FudCB0byB1c2UgdGhpcworCQkJCQkgICAgICAqIGlmIGFza2luZyB0aGUga2VybmVsCisJCQkJCSAgICAgICogZmFpbHMgKi8KKworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9NVFVfRVhDRUVERUQgICAgICAgNDMgLyogY2hlY2sgd2hldGhlciB0aGUgTVRVCisJCQkJCSAgICAgICogd2FzIGV4Y2VlZCBpbiB0aGUKKwkJCQkJICAgICAgKiBwcmV2aW91cyB3cml0ZQorCQkJCQkgICAgICAqIG9wZXJhdGlvbiAqLworCisjZGVmaW5lIEJJT19DVFJMX0RHUkFNX0dFVF9QRUVSICAgICAgICAgICA0NgorI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9TRVRfUEVFUiAgICAgICAgICAgNDQgLyogRGVzdGluYXRpb24gZm9yIHRoZSBkYXRhICovCisKKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fU0VUX05FWFRfVElNRU9VVCAgIDQ1IC8qIE5leHQgRFRMUyBoYW5kc2hha2UgdGltZW91dCB0bworCQkJCQkJCQkJCQkgICogYWRqdXN0IHNvY2tldCB0aW1lb3V0cyAqLworCisvKiBtb2RpZmllcnMgKi8KKyNkZWZpbmUgQklPX0ZQX1JFQUQJCTB4MDIKKyNkZWZpbmUgQklPX0ZQX1dSSVRFCQkweDA0CisjZGVmaW5lIEJJT19GUF9BUFBFTkQJCTB4MDgKKyNkZWZpbmUgQklPX0ZQX1RFWFQJCTB4MTAKKworI2RlZmluZSBCSU9fRkxBR1NfUkVBRAkJMHgwMQorI2RlZmluZSBCSU9fRkxBR1NfV1JJVEUJCTB4MDIKKyNkZWZpbmUgQklPX0ZMQUdTX0lPX1NQRUNJQUwJMHgwNAorI2RlZmluZSBCSU9fRkxBR1NfUldTIChCSU9fRkxBR1NfUkVBRHxCSU9fRkxBR1NfV1JJVEV8QklPX0ZMQUdTX0lPX1NQRUNJQUwpCisjZGVmaW5lIEJJT19GTEFHU19TSE9VTERfUkVUUlkJMHgwOAorI2lmbmRlZglCSU9fRkxBR1NfVVBMSU5LCisvKiAiVVBMSU5LIiBmbGFnIGRlbm90ZXMgZmlsZSBkZXNjcmlwdG9ycyBwcm92aWRlZCBieSBhcHBsaWNhdGlvbi4KKyAgIEl0IGRlZmF1bHRzIHRvIDAsIGFzIG1vc3QgcGxhdGZvcm1zIGRvbid0IHJlcXVpcmUgVVBMSU5LIGludGVyZmFjZS4gKi8KKyNkZWZpbmUJQklPX0ZMQUdTX1VQTElOSwkwCisjZW5kaWYKKworLyogVXNlZCBpbiBCSU9fZ2V0aG9zdGJ5bmFtZSgpICovCisjZGVmaW5lIEJJT19HSEJOX0NUUkxfSElUUwkJMQorI2RlZmluZSBCSU9fR0hCTl9DVFJMX01JU1NFUwkJMgorI2RlZmluZSBCSU9fR0hCTl9DVFJMX0NBQ0hFX1NJWkUJMworI2RlZmluZSBCSU9fR0hCTl9DVFJMX0dFVF9FTlRSWQkJNAorI2RlZmluZSBCSU9fR0hCTl9DVFJMX0ZMVVNICQk1CisKKy8qIE1vc3RseSB1c2VkIGluIHRoZSBTU0wgQklPICovCisvKiBOb3QgdXNlZCBhbnltb3JlCisgKiAjZGVmaW5lIEJJT19GTEFHU19QUk9UT0NPTF9ERUxBWUVEX1JFQUQgMHgxMAorICogI2RlZmluZSBCSU9fRkxBR1NfUFJPVE9DT0xfREVMQVlFRF9XUklURSAweDIwCisgKiAjZGVmaW5lIEJJT19GTEFHU19QUk9UT0NPTF9TVEFSVFVQCTB4NDAKKyAqLworCisjZGVmaW5lIEJJT19GTEFHU19CQVNFNjRfTk9fTkwJMHgxMDAKKworLyogVGhpcyBpcyB1c2VkIHdpdGggbWVtb3J5IEJJT3M6IGl0IG1lYW5zIHdlIHNob3VsZG4ndCBmcmVlIHVwIG9yIGNoYW5nZSB0aGUKKyAqIGRhdGEgaW4gYW55IHdheS4KKyAqLworI2RlZmluZSBCSU9fRkxBR1NfTUVNX1JET05MWQkweDIwMAorCit0eXBlZGVmIHN0cnVjdCBiaW9fc3QgQklPOworCit2b2lkIEJJT19zZXRfZmxhZ3MoQklPICpiLCBpbnQgZmxhZ3MpOworaW50ICBCSU9fdGVzdF9mbGFncyhjb25zdCBCSU8gKmIsIGludCBmbGFncyk7Cit2b2lkIEJJT19jbGVhcl9mbGFncyhCSU8gKmIsIGludCBmbGFncyk7CisKKyNkZWZpbmUgQklPX2dldF9mbGFncyhiKSBCSU9fdGVzdF9mbGFncyhiLCB+KDB4MCkpCisjZGVmaW5lIEJJT19zZXRfcmV0cnlfc3BlY2lhbChiKSBcCisJCUJJT19zZXRfZmxhZ3MoYiwgKEJJT19GTEFHU19JT19TUEVDSUFMfEJJT19GTEFHU19TSE9VTERfUkVUUlkpKQorI2RlZmluZSBCSU9fc2V0X3JldHJ5X3JlYWQoYikgXAorCQlCSU9fc2V0X2ZsYWdzKGIsIChCSU9fRkxBR1NfUkVBRHxCSU9fRkxBR1NfU0hPVUxEX1JFVFJZKSkKKyNkZWZpbmUgQklPX3NldF9yZXRyeV93cml0ZShiKSBcCisJCUJJT19zZXRfZmxhZ3MoYiwgKEJJT19GTEFHU19XUklURXxCSU9fRkxBR1NfU0hPVUxEX1JFVFJZKSkKKworLyogVGhlc2UgYXJlIG5vcm1hbGx5IHVzZWQgaW50ZXJuYWxseSBpbiBCSU9zICovCisjZGVmaW5lIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiKSBcCisJCUJJT19jbGVhcl9mbGFncyhiLCAoQklPX0ZMQUdTX1JXU3xCSU9fRkxBR1NfU0hPVUxEX1JFVFJZKSkKKyNkZWZpbmUgQklPX2dldF9yZXRyeV9mbGFncyhiKSBcCisJCUJJT190ZXN0X2ZsYWdzKGIsIChCSU9fRkxBR1NfUldTfEJJT19GTEFHU19TSE9VTERfUkVUUlkpKQorCisvKiBUaGVzZSBzaG91bGQgYmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gdGVsbCB3aHkgd2Ugc2hvdWxkIHJldHJ5ICovCisjZGVmaW5lIEJJT19zaG91bGRfcmVhZChhKQkJQklPX3Rlc3RfZmxhZ3MoYSwgQklPX0ZMQUdTX1JFQUQpCisjZGVmaW5lIEJJT19zaG91bGRfd3JpdGUoYSkJCUJJT190ZXN0X2ZsYWdzKGEsIEJJT19GTEFHU19XUklURSkKKyNkZWZpbmUgQklPX3Nob3VsZF9pb19zcGVjaWFsKGEpCUJJT190ZXN0X2ZsYWdzKGEsIEJJT19GTEFHU19JT19TUEVDSUFMKQorI2RlZmluZSBCSU9fcmV0cnlfdHlwZShhKQkJQklPX3Rlc3RfZmxhZ3MoYSwgQklPX0ZMQUdTX1JXUykKKyNkZWZpbmUgQklPX3Nob3VsZF9yZXRyeShhKQkJQklPX3Rlc3RfZmxhZ3MoYSwgQklPX0ZMQUdTX1NIT1VMRF9SRVRSWSkKKworLyogVGhlIG5leHQgdGhyZWUgYXJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKKyAqIEJJT19zaG91bGRfaW9fc3BlY2lhbCgpIGNvbmRpdGlvbi4gIEFmdGVyIHRoaXMgcmV0dXJucyB0cnVlLAorICogQklPICpCSU9fZ2V0X3JldHJ5X0JJTyhCSU8gKmJpbywgaW50ICpyZWFzb24pOyB3aWxsIHdhbGsgdGhlIEJJTyAKKyAqIHN0YWNrIGFuZCByZXR1cm4gdGhlICdyZWFzb24nIGZvciB0aGUgc3BlY2lhbCBhbmQgdGhlIG9mZmVuZGluZyBCSU8uCisgKiBHaXZlbiBhIEJJTywgQklPX2dldF9yZXRyeV9yZWFzb24oYmlvKSB3aWxsIHJldHVybiB0aGUgY29kZS4gKi8KKy8qIFJldHVybmVkIGZyb20gdGhlIFNTTCBiaW8gd2hlbiB0aGUgY2VydGlmaWNhdGUgcmV0cmlldmFsIGNvZGUgaGFkIGFuIGVycm9yICovCisjZGVmaW5lIEJJT19SUl9TU0xfWDUwOV9MT09LVVAJCTB4MDEKKy8qIFJldHVybmVkIGZyb20gdGhlIGNvbm5lY3QgQklPIHdoZW4gYSBjb25uZWN0IHdvdWxkIGhhdmUgYmxvY2tlZCAqLworI2RlZmluZSBCSU9fUlJfQ09OTkVDVAkJCTB4MDIKKy8qIFJldHVybmVkIGZyb20gdGhlIGFjY2VwdCBCSU8gd2hlbiBhbiBhY2NlcHQgd291bGQgaGF2ZSBibG9ja2VkICovCisjZGVmaW5lIEJJT19SUl9BQ0NFUFQJCQkweDAzCisKKy8qIFRoZXNlIGFyZSBwYXNzZWQgYnkgdGhlIEJJTyBjYWxsYmFjayAqLworI2RlZmluZSBCSU9fQ0JfRlJFRQkweDAxCisjZGVmaW5lIEJJT19DQl9SRUFECTB4MDIKKyNkZWZpbmUgQklPX0NCX1dSSVRFCTB4MDMKKyNkZWZpbmUgQklPX0NCX1BVVFMJMHgwNAorI2RlZmluZSBCSU9fQ0JfR0VUUwkweDA1CisjZGVmaW5lIEJJT19DQl9DVFJMCTB4MDYKKworLyogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSB1bmRlcmxpbmcgb3BlcmF0aW9uLAorICogVGhlIEJJT19DQl9SRVRVUk4gZmxhZyBpbmRpY2F0ZXMgaWYgaXQgaXMgYWZ0ZXIgdGhlIGNhbGwgKi8KKyNkZWZpbmUgQklPX0NCX1JFVFVSTgkweDgwCisjZGVmaW5lIEJJT19DQl9yZXR1cm4oYSkgKChhKXxCSU9fQ0JfUkVUVVJOKSkKKyNkZWZpbmUgQklPX2NiX3ByZShhKQkoISgoYSkmQklPX0NCX1JFVFVSTikpCisjZGVmaW5lIEJJT19jYl9wb3N0KGEpCSgoYSkmQklPX0NCX1JFVFVSTikKKworbG9uZyAoKkJJT19nZXRfY2FsbGJhY2soY29uc3QgQklPICpiKSkgKHN0cnVjdCBiaW9fc3QgKixpbnQsY29uc3QgY2hhciAqLGludCwgbG9uZyxsb25nKTsKK3ZvaWQgQklPX3NldF9jYWxsYmFjayhCSU8gKmIsIAorCWxvbmcgKCpjYWxsYmFjaykoc3RydWN0IGJpb19zdCAqLGludCxjb25zdCBjaGFyICosaW50LCBsb25nLGxvbmcpKTsKK2NoYXIgKkJJT19nZXRfY2FsbGJhY2tfYXJnKGNvbnN0IEJJTyAqYik7Cit2b2lkIEJJT19zZXRfY2FsbGJhY2tfYXJnKEJJTyAqYiwgY2hhciAqYXJnKTsKKworY29uc3QgY2hhciAqIEJJT19tZXRob2RfbmFtZShjb25zdCBCSU8gKmIpOworaW50IEJJT19tZXRob2RfdHlwZShjb25zdCBCSU8gKmIpOworCit0eXBlZGVmIHZvaWQgYmlvX2luZm9fY2Ioc3RydWN0IGJpb19zdCAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBsb25nLCBsb25nKTsKKwordHlwZWRlZiBzdHJ1Y3QgYmlvX21ldGhvZF9zdAorCXsKKwlpbnQgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKmJ3cml0ZSkoQklPICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKwlpbnQgKCpicmVhZCkoQklPICosIGNoYXIgKiwgaW50KTsKKwlpbnQgKCpicHV0cykoQklPICosIGNvbnN0IGNoYXIgKik7CisJaW50ICgqYmdldHMpKEJJTyAqLCBjaGFyICosIGludCk7CisJbG9uZyAoKmN0cmwpKEJJTyAqLCBpbnQsIGxvbmcsIHZvaWQgKik7CisJaW50ICgqY3JlYXRlKShCSU8gKik7CisJaW50ICgqZGVzdHJveSkoQklPICopOworICAgICAgICBsb25nICgqY2FsbGJhY2tfY3RybCkoQklPICosIGludCwgYmlvX2luZm9fY2IgKik7CisJfSBCSU9fTUVUSE9EOworCitzdHJ1Y3QgYmlvX3N0CisJeworCUJJT19NRVRIT0QgKm1ldGhvZDsKKwkvKiBiaW8sIG1vZGUsIGFyZ3AsIGFyZ2ksIGFyZ2wsIHJldCAqLworCWxvbmcgKCpjYWxsYmFjaykoc3RydWN0IGJpb19zdCAqLGludCxjb25zdCBjaGFyICosaW50LCBsb25nLGxvbmcpOworCWNoYXIgKmNiX2FyZzsgLyogZmlyc3QgYXJndW1lbnQgZm9yIHRoZSBjYWxsYmFjayAqLworCisJaW50IGluaXQ7CisJaW50IHNodXRkb3duOworCWludCBmbGFnczsJLyogZXh0cmEgc3RvcmFnZSAqLworCWludCByZXRyeV9yZWFzb247CisJaW50IG51bTsKKwl2b2lkICpwdHI7CisJc3RydWN0IGJpb19zdCAqbmV4dF9iaW87CS8qIHVzZWQgYnkgZmlsdGVyIEJJT3MgKi8KKwlzdHJ1Y3QgYmlvX3N0ICpwcmV2X2JpbzsJLyogdXNlZCBieSBmaWx0ZXIgQklPcyAqLworCWludCByZWZlcmVuY2VzOworCXVuc2lnbmVkIGxvbmcgbnVtX3JlYWQ7CisJdW5zaWduZWQgbG9uZyBudW1fd3JpdGU7CisKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCX07CisKK0RFQ0xBUkVfU1RBQ0tfT0YoQklPKQorCit0eXBlZGVmIHN0cnVjdCBiaW9fZl9idWZmZXJfY3R4X3N0cnVjdAorCXsKKwkvKiBCSU8gKmJpbzsgKi8gLyogdGhpcyBpcyBub3cgaW4gdGhlIEJJTyBzdHJ1Y3QgKi8KKwlpbnQgaWJ1Zl9zaXplOwkvKiBob3cgYmlnIGlzIHRoZSBpbnB1dCBidWZmZXIgKi8KKwlpbnQgb2J1Zl9zaXplOwkvKiBob3cgYmlnIGlzIHRoZSBvdXRwdXQgYnVmZmVyICovCisKKwljaGFyICppYnVmOwkJLyogdGhlIGNoYXIgYXJyYXkgKi8KKwlpbnQgaWJ1Zl9sZW47CQkvKiBob3cgbWFueSBieXRlcyBhcmUgaW4gaXQgKi8KKwlpbnQgaWJ1Zl9vZmY7CQkvKiB3cml0ZS9yZWFkIG9mZnNldCAqLworCisJY2hhciAqb2J1ZjsJCS8qIHRoZSBjaGFyIGFycmF5ICovCisJaW50IG9idWZfbGVuOwkJLyogaG93IG1hbnkgYnl0ZXMgYXJlIGluIGl0ICovCisJaW50IG9idWZfb2ZmOwkJLyogd3JpdGUvcmVhZCBvZmZzZXQgKi8KKwl9IEJJT19GX0JVRkZFUl9DVFg7CisKKy8qIFByZWZpeCBhbmQgc3VmZml4IGNhbGxiYWNrIGluIEFTTjEgQklPICovCit0eXBlZGVmIGludCBhc24xX3BzX2Z1bmMoQklPICpiLCB1bnNpZ25lZCBjaGFyICoqcGJ1ZiwgaW50ICpwbGVuLCB2b2lkICpwYXJnKTsKKworLyogY29ubmVjdCBCSU8gc3R1ZmYgKi8KKyNkZWZpbmUgQklPX0NPTk5fU19CRUZPUkUJCTEKKyNkZWZpbmUgQklPX0NPTk5fU19HRVRfSVAJCTIKKyNkZWZpbmUgQklPX0NPTk5fU19HRVRfUE9SVAkJMworI2RlZmluZSBCSU9fQ09OTl9TX0NSRUFURV9TT0NLRVQJNAorI2RlZmluZSBCSU9fQ09OTl9TX0NPTk5FQ1QJCTUKKyNkZWZpbmUgQklPX0NPTk5fU19PSwkJCTYKKyNkZWZpbmUgQklPX0NPTk5fU19CTE9DS0VEX0NPTk5FQ1QJNworI2RlZmluZSBCSU9fQ09OTl9TX05CSU8JCQk4CisvKiNkZWZpbmUgQklPX0NPTk5fZ2V0X3BhcmFtX2hvc3RuYW1lCUJJT19jdHJsICovCisKKyNkZWZpbmUgQklPX0NfU0VUX0NPTk5FQ1QJCQkxMDAKKyNkZWZpbmUgQklPX0NfRE9fU1RBVEVfTUFDSElORQkJCTEwMQorI2RlZmluZSBCSU9fQ19TRVRfTkJJTwkJCQkxMDIKKyNkZWZpbmUgQklPX0NfU0VUX1BST1hZX1BBUkFNCQkJMTAzCisjZGVmaW5lIEJJT19DX1NFVF9GRAkJCQkxMDQKKyNkZWZpbmUgQklPX0NfR0VUX0ZECQkJCTEwNQorI2RlZmluZSBCSU9fQ19TRVRfRklMRV9QVFIJCQkxMDYKKyNkZWZpbmUgQklPX0NfR0VUX0ZJTEVfUFRSCQkJMTA3CisjZGVmaW5lIEJJT19DX1NFVF9GSUxFTkFNRQkJCTEwOAorI2RlZmluZSBCSU9fQ19TRVRfU1NMCQkJCTEwOQorI2RlZmluZSBCSU9fQ19HRVRfU1NMCQkJCTExMAorI2RlZmluZSBCSU9fQ19TRVRfTUQJCQkJMTExCisjZGVmaW5lIEJJT19DX0dFVF9NRAkJCQkxMTIKKyNkZWZpbmUgQklPX0NfR0VUX0NJUEhFUl9TVEFUVVMJCQkxMTMKKyNkZWZpbmUgQklPX0NfU0VUX0JVRl9NRU0JCQkxMTQKKyNkZWZpbmUgQklPX0NfR0VUX0JVRl9NRU1fUFRSCQkJMTE1CisjZGVmaW5lIEJJT19DX0dFVF9CVUZGX05VTV9MSU5FUwkJMTE2CisjZGVmaW5lIEJJT19DX1NFVF9CVUZGX1NJWkUJCQkxMTcKKyNkZWZpbmUgQklPX0NfU0VUX0FDQ0VQVAkJCTExOAorI2RlZmluZSBCSU9fQ19TU0xfTU9ERQkJCQkxMTkKKyNkZWZpbmUgQklPX0NfR0VUX01EX0NUWAkJCTEyMAorI2RlZmluZSBCSU9fQ19HRVRfUFJPWFlfUEFSQU0JCQkxMjEKKyNkZWZpbmUgQklPX0NfU0VUX0JVRkZfUkVBRF9EQVRBCQkxMjIgLyogZGF0YSB0byByZWFkIGZpcnN0ICovCisjZGVmaW5lIEJJT19DX0dFVF9DT05ORUNUCQkJMTIzCisjZGVmaW5lIEJJT19DX0dFVF9BQ0NFUFQJCQkxMjQKKyNkZWZpbmUgQklPX0NfU0VUX1NTTF9SRU5FR09USUFURV9CWVRFUwkJMTI1CisjZGVmaW5lIEJJT19DX0dFVF9TU0xfTlVNX1JFTkVHT1RJQVRFUwkJMTI2CisjZGVmaW5lIEJJT19DX1NFVF9TU0xfUkVORUdPVElBVEVfVElNRU9VVAkxMjcKKyNkZWZpbmUgQklPX0NfRklMRV9TRUVLCQkJCTEyOAorI2RlZmluZSBCSU9fQ19HRVRfQ0lQSEVSX0NUWAkJCTEyOQorI2RlZmluZSBCSU9fQ19TRVRfQlVGX01FTV9FT0ZfUkVUVVJOCQkxMzAvKnJldHVybiBlbmQgb2YgaW5wdXQgdmFsdWUqLworI2RlZmluZSBCSU9fQ19TRVRfQklORF9NT0RFCQkJMTMxCisjZGVmaW5lIEJJT19DX0dFVF9CSU5EX01PREUJCQkxMzIKKyNkZWZpbmUgQklPX0NfRklMRV9URUxMCQkJCTEzMworI2RlZmluZSBCSU9fQ19HRVRfU09DS1MJCQkJMTM0CisjZGVmaW5lIEJJT19DX1NFVF9TT0NLUwkJCQkxMzUKKworI2RlZmluZSBCSU9fQ19TRVRfV1JJVEVfQlVGX1NJWkUJCTEzNi8qIGZvciBCSU9fc19iaW8gKi8KKyNkZWZpbmUgQklPX0NfR0VUX1dSSVRFX0JVRl9TSVpFCQkxMzcKKyNkZWZpbmUgQklPX0NfTUFLRV9CSU9fUEFJUgkJCTEzOAorI2RlZmluZSBCSU9fQ19ERVNUUk9ZX0JJT19QQUlSCQkJMTM5CisjZGVmaW5lIEJJT19DX0dFVF9XUklURV9HVUFSQU5URUUJCTE0MAorI2RlZmluZSBCSU9fQ19HRVRfUkVBRF9SRVFVRVNUCQkJMTQxCisjZGVmaW5lIEJJT19DX1NIVVRET1dOX1dSCQkJMTQyCisjZGVmaW5lIEJJT19DX05SRUFEMAkJCQkxNDMKKyNkZWZpbmUgQklPX0NfTlJFQUQJCQkJMTQ0CisjZGVmaW5lIEJJT19DX05XUklURTAJCQkJMTQ1CisjZGVmaW5lIEJJT19DX05XUklURQkJCQkxNDYKKyNkZWZpbmUgQklPX0NfUkVTRVRfUkVBRF9SRVFVRVNUCQkxNDcKKyNkZWZpbmUgQklPX0NfU0VUX01EX0NUWAkJCTE0OAorCisjZGVmaW5lIEJJT19DX1NFVF9QUkVGSVgJCQkxNDkKKyNkZWZpbmUgQklPX0NfR0VUX1BSRUZJWAkJCTE1MAorI2RlZmluZSBCSU9fQ19TRVRfU1VGRklYCQkJMTUxCisjZGVmaW5lIEJJT19DX0dFVF9TVUZGSVgJCQkxNTIKKworI2RlZmluZSBCSU9fQ19TRVRfRVhfQVJHCQkJMTUzCisjZGVmaW5lIEJJT19DX0dFVF9FWF9BUkcJCQkxNTQKKworI2RlZmluZSBCSU9fc2V0X2FwcF9kYXRhKHMsYXJnKQkJQklPX3NldF9leF9kYXRhKHMsMCxhcmcpCisjZGVmaW5lIEJJT19nZXRfYXBwX2RhdGEocykJCUJJT19nZXRfZXhfZGF0YShzLDApCisKKy8qIEJJT19zX2Nvbm5lY3QoKSBhbmQgQklPX3Nfc29ja3M0YV9jb25uZWN0KCkgKi8KKyNkZWZpbmUgQklPX3NldF9jb25uX2hvc3RuYW1lKGIsbmFtZSkgQklPX2N0cmwoYixCSU9fQ19TRVRfQ09OTkVDVCwwLChjaGFyICopbmFtZSkKKyNkZWZpbmUgQklPX3NldF9jb25uX3BvcnQoYixwb3J0KSBCSU9fY3RybChiLEJJT19DX1NFVF9DT05ORUNULDEsKGNoYXIgKilwb3J0KQorI2RlZmluZSBCSU9fc2V0X2Nvbm5faXAoYixpcCkJICBCSU9fY3RybChiLEJJT19DX1NFVF9DT05ORUNULDIsKGNoYXIgKilpcCkKKyNkZWZpbmUgQklPX3NldF9jb25uX2ludF9wb3J0KGIscG9ydCkgQklPX2N0cmwoYixCSU9fQ19TRVRfQ09OTkVDVCwzLChjaGFyICopcG9ydCkKKyNkZWZpbmUgQklPX2dldF9jb25uX2hvc3RuYW1lKGIpICBCSU9fcHRyX2N0cmwoYixCSU9fQ19HRVRfQ09OTkVDVCwwKQorI2RlZmluZSBCSU9fZ2V0X2Nvbm5fcG9ydChiKSAgICAgIEJJT19wdHJfY3RybChiLEJJT19DX0dFVF9DT05ORUNULDEpCisjZGVmaW5lIEJJT19nZXRfY29ubl9pcChiKSAJCSBCSU9fcHRyX2N0cmwoYixCSU9fQ19HRVRfQ09OTkVDVCwyKQorI2RlZmluZSBCSU9fZ2V0X2Nvbm5faW50X3BvcnQoYikgQklPX2ludF9jdHJsKGIsQklPX0NfR0VUX0NPTk5FQ1QsMywwKQorCisKKyNkZWZpbmUgQklPX3NldF9uYmlvKGIsbikJQklPX2N0cmwoYixCSU9fQ19TRVRfTkJJTywobiksTlVMTCkKKworLyogQklPX3NfYWNjZXB0X3NvY2tldCgpICovCisjZGVmaW5lIEJJT19zZXRfYWNjZXB0X3BvcnQoYixuYW1lKSBCSU9fY3RybChiLEJJT19DX1NFVF9BQ0NFUFQsMCwoY2hhciAqKW5hbWUpCisjZGVmaW5lIEJJT19nZXRfYWNjZXB0X3BvcnQoYikJQklPX3B0cl9jdHJsKGIsQklPX0NfR0VUX0FDQ0VQVCwwKQorLyogI2RlZmluZSBCSU9fc2V0X25iaW8oYixuKQlCSU9fY3RybChiLEJJT19DX1NFVF9OQklPLChuKSxOVUxMKSAqLworI2RlZmluZSBCSU9fc2V0X25iaW9fYWNjZXB0KGIsbikgQklPX2N0cmwoYixCSU9fQ19TRVRfQUNDRVBULDEsKG4pPyh2b2lkICopImEiOk5VTEwpCisjZGVmaW5lIEJJT19zZXRfYWNjZXB0X2Jpb3MoYixiaW8pIEJJT19jdHJsKGIsQklPX0NfU0VUX0FDQ0VQVCwyLChjaGFyICopYmlvKQorCisjZGVmaW5lIEJJT19CSU5EX05PUk1BTAkJCTAKKyNkZWZpbmUgQklPX0JJTkRfUkVVU0VBRERSX0lGX1VOVVNFRAkxCisjZGVmaW5lIEJJT19CSU5EX1JFVVNFQUREUgkJMgorI2RlZmluZSBCSU9fc2V0X2JpbmRfbW9kZShiLG1vZGUpIEJJT19jdHJsKGIsQklPX0NfU0VUX0JJTkRfTU9ERSxtb2RlLE5VTEwpCisjZGVmaW5lIEJJT19nZXRfYmluZF9tb2RlKGIsbW9kZSkgQklPX2N0cmwoYixCSU9fQ19HRVRfQklORF9NT0RFLDAsTlVMTCkKKworI2RlZmluZSBCSU9fZG9fY29ubmVjdChiKQlCSU9fZG9faGFuZHNoYWtlKGIpCisjZGVmaW5lIEJJT19kb19hY2NlcHQoYikJQklPX2RvX2hhbmRzaGFrZShiKQorI2RlZmluZSBCSU9fZG9faGFuZHNoYWtlKGIpCUJJT19jdHJsKGIsQklPX0NfRE9fU1RBVEVfTUFDSElORSwwLE5VTEwpCisKKy8qIEJJT19zX3Byb3h5X2NsaWVudCgpICovCisjZGVmaW5lIEJJT19zZXRfdXJsKGIsdXJsKQlCSU9fY3RybChiLEJJT19DX1NFVF9QUk9YWV9QQVJBTSwwLChjaGFyICopKHVybCkpCisjZGVmaW5lIEJJT19zZXRfcHJveGllcyhiLHApCUJJT19jdHJsKGIsQklPX0NfU0VUX1BST1hZX1BBUkFNLDEsKGNoYXIgKikocCkpCisvKiBCSU9fc2V0X25iaW8oYixuKSAqLworI2RlZmluZSBCSU9fc2V0X2ZpbHRlcl9iaW8oYixzKSBCSU9fY3RybChiLEJJT19DX1NFVF9QUk9YWV9QQVJBTSwyLChjaGFyICopKHMpKQorLyogQklPICpCSU9fZ2V0X2ZpbHRlcl9iaW8oQklPICpiaW8pOyAqLworI2RlZmluZSBCSU9fc2V0X3Byb3h5X2NiKGIsY2IpIEJJT19jYWxsYmFja19jdHJsKGIsQklPX0NfU0VUX1BST1hZX1BBUkFNLDMsKHZvaWQgKigqY2IpKCkpKQorI2RlZmluZSBCSU9fc2V0X3Byb3h5X2hlYWRlcihiLHNrKSBCSU9fY3RybChiLEJJT19DX1NFVF9QUk9YWV9QQVJBTSw0LChjaGFyICopc2spCisjZGVmaW5lIEJJT19zZXRfbm9fY29ubmVjdF9yZXR1cm4oYixib29sKSBCSU9faW50X2N0cmwoYixCSU9fQ19TRVRfUFJPWFlfUEFSQU0sNSxib29sKQorCisjZGVmaW5lIEJJT19nZXRfcHJveHlfaGVhZGVyKGIsc2twKSBCSU9fY3RybChiLEJJT19DX0dFVF9QUk9YWV9QQVJBTSwwLChjaGFyICopc2twKQorI2RlZmluZSBCSU9fZ2V0X3Byb3hpZXMoYixweHlfcCkgQklPX2N0cmwoYixCSU9fQ19HRVRfUFJPWFlfUEFSQU0sMSwoY2hhciAqKShweHlfcCkpCisjZGVmaW5lIEJJT19nZXRfdXJsKGIsdXJsKQlCSU9fY3RybChiLEJJT19DX0dFVF9QUk9YWV9QQVJBTSwyLChjaGFyICopKHVybCkpCisjZGVmaW5lIEJJT19nZXRfbm9fY29ubmVjdF9yZXR1cm4oYikJQklPX2N0cmwoYixCSU9fQ19HRVRfUFJPWFlfUEFSQU0sNSxOVUxMKQorCisjZGVmaW5lIEJJT19zZXRfZmQoYixmZCxjKQlCSU9faW50X2N0cmwoYixCSU9fQ19TRVRfRkQsYyxmZCkKKyNkZWZpbmUgQklPX2dldF9mZChiLGMpCQlCSU9fY3RybChiLEJJT19DX0dFVF9GRCwwLChjaGFyICopYykKKworI2RlZmluZSBCSU9fc2V0X2ZwKGIsZnAsYykJQklPX2N0cmwoYixCSU9fQ19TRVRfRklMRV9QVFIsYywoY2hhciAqKWZwKQorI2RlZmluZSBCSU9fZ2V0X2ZwKGIsZnBwKQlCSU9fY3RybChiLEJJT19DX0dFVF9GSUxFX1BUUiwwLChjaGFyICopZnBwKQorCisjZGVmaW5lIEJJT19zZWVrKGIsb2ZzKQkoaW50KUJJT19jdHJsKGIsQklPX0NfRklMRV9TRUVLLG9mcyxOVUxMKQorI2RlZmluZSBCSU9fdGVsbChiKQkoaW50KUJJT19jdHJsKGIsQklPX0NfRklMRV9URUxMLDAsTlVMTCkKKworLyogbmFtZSBpcyBjYXN0IHRvIGxvc2UgY29uc3QsIGJ1dCBtaWdodCBiZSBiZXR0ZXIgdG8gcm91dGUgdGhyb3VnaCBhIGZ1bmN0aW9uCisgICBzbyB3ZSBjYW4gZG8gaXQgc2FmZWx5ICovCisjaWZkZWYgQ09OU1RfU1RSSUNUCisvKiBJZiB5b3UgYXJlIHdvbmRlcmluZyB3aHkgdGhpcyBpc24ndCBkZWZpbmVkLCBpdHMgYmVjYXVzZSBDT05TVF9TVFJJQ1QgaXMKKyAqIHB1cmVseSBhIGNvbXBpbGUtdGltZSBrbHVkZ2UgdG8gYWxsb3cgY29uc3QgdG8gYmUgY2hlY2tlZC4KKyAqLworaW50IEJJT19yZWFkX2ZpbGVuYW1lKEJJTyAqYixjb25zdCBjaGFyICpuYW1lKTsKKyNlbHNlCisjZGVmaW5lIEJJT19yZWFkX2ZpbGVuYW1lKGIsbmFtZSkgQklPX2N0cmwoYixCSU9fQ19TRVRfRklMRU5BTUUsIFwKKwkJQklPX0NMT1NFfEJJT19GUF9SRUFELChjaGFyICopbmFtZSkKKyNlbmRpZgorI2RlZmluZSBCSU9fd3JpdGVfZmlsZW5hbWUoYixuYW1lKSBCSU9fY3RybChiLEJJT19DX1NFVF9GSUxFTkFNRSwgXAorCQlCSU9fQ0xPU0V8QklPX0ZQX1dSSVRFLG5hbWUpCisjZGVmaW5lIEJJT19hcHBlbmRfZmlsZW5hbWUoYixuYW1lKSBCSU9fY3RybChiLEJJT19DX1NFVF9GSUxFTkFNRSwgXAorCQlCSU9fQ0xPU0V8QklPX0ZQX0FQUEVORCxuYW1lKQorI2RlZmluZSBCSU9fcndfZmlsZW5hbWUoYixuYW1lKSBCSU9fY3RybChiLEJJT19DX1NFVF9GSUxFTkFNRSwgXAorCQlCSU9fQ0xPU0V8QklPX0ZQX1JFQUR8QklPX0ZQX1dSSVRFLG5hbWUpCisKKy8qIFdBUk5JTkcgV0FSTklORywgdGhpcyB1cHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgcmVhZCBiaW8gb2YgdGhlCisgKiBTU0wgc3RydWN0dXJlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBzc2wgcmVhZCBCSU8gaXMgbm93IHBvaW50ZWQgdG8gYnkKKyAqIHRoZSBuZXh0X2JpbyBmaWVsZCBpbiB0aGUgYmlvLiAgU28gd2hlbiB5b3UgZnJlZSB0aGUgQklPLCBtYWtlIHN1cmUKKyAqIHlvdSBhcmUgZG9pbmcgYSBCSU9fZnJlZV9hbGwoKSB0byBjYXRjaCB0aGUgdW5kZXJseWluZyBCSU8uICovCisjZGVmaW5lIEJJT19zZXRfc3NsKGIsc3NsLGMpCUJJT19jdHJsKGIsQklPX0NfU0VUX1NTTCxjLChjaGFyICopc3NsKQorI2RlZmluZSBCSU9fZ2V0X3NzbChiLHNzbHApCUJJT19jdHJsKGIsQklPX0NfR0VUX1NTTCwwLChjaGFyICopc3NscCkKKyNkZWZpbmUgQklPX3NldF9zc2xfbW9kZShiLGNsaWVudCkJQklPX2N0cmwoYixCSU9fQ19TU0xfTU9ERSxjbGllbnQsTlVMTCkKKyNkZWZpbmUgQklPX3NldF9zc2xfcmVuZWdvdGlhdGVfYnl0ZXMoYixudW0pIFwKKwlCSU9fY3RybChiLEJJT19DX1NFVF9TU0xfUkVORUdPVElBVEVfQllURVMsbnVtLE5VTEwpOworI2RlZmluZSBCSU9fZ2V0X251bV9yZW5lZ290aWF0ZXMoYikgXAorCUJJT19jdHJsKGIsQklPX0NfR0VUX1NTTF9OVU1fUkVORUdPVElBVEVTLDAsTlVMTCk7CisjZGVmaW5lIEJJT19zZXRfc3NsX3JlbmVnb3RpYXRlX3RpbWVvdXQoYixzZWNvbmRzKSBcCisJQklPX2N0cmwoYixCSU9fQ19TRVRfU1NMX1JFTkVHT1RJQVRFX1RJTUVPVVQsc2Vjb25kcyxOVUxMKTsKKworLyogZGVmaW5lZCBpbiBldnAuaCAqLworLyogI2RlZmluZSBCSU9fc2V0X21kKGIsbWQpCUJJT19jdHJsKGIsQklPX0NfU0VUX01ELDEsKGNoYXIgKiltZCkgKi8KKworI2RlZmluZSBCSU9fZ2V0X21lbV9kYXRhKGIscHApCUJJT19jdHJsKGIsQklPX0NUUkxfSU5GTywwLChjaGFyICopcHApCisjZGVmaW5lIEJJT19zZXRfbWVtX2J1ZihiLGJtLGMpCUJJT19jdHJsKGIsQklPX0NfU0VUX0JVRl9NRU0sYywoY2hhciAqKWJtKQorI2RlZmluZSBCSU9fZ2V0X21lbV9wdHIoYixwcCkJQklPX2N0cmwoYixCSU9fQ19HRVRfQlVGX01FTV9QVFIsMCwoY2hhciAqKXBwKQorI2RlZmluZSBCSU9fc2V0X21lbV9lb2ZfcmV0dXJuKGIsdikgXAorCQkJCUJJT19jdHJsKGIsQklPX0NfU0VUX0JVRl9NRU1fRU9GX1JFVFVSTix2LE5VTEwpCisKKy8qIEZvciB0aGUgQklPX2ZfYnVmZmVyKCkgdHlwZSAqLworI2RlZmluZSBCSU9fZ2V0X2J1ZmZlcl9udW1fbGluZXMoYikJQklPX2N0cmwoYixCSU9fQ19HRVRfQlVGRl9OVU1fTElORVMsMCxOVUxMKQorI2RlZmluZSBCSU9fc2V0X2J1ZmZlcl9zaXplKGIsc2l6ZSkJQklPX2N0cmwoYixCSU9fQ19TRVRfQlVGRl9TSVpFLHNpemUsTlVMTCkKKyNkZWZpbmUgQklPX3NldF9yZWFkX2J1ZmZlcl9zaXplKGIsc2l6ZSkgQklPX2ludF9jdHJsKGIsQklPX0NfU0VUX0JVRkZfU0laRSxzaXplLDApCisjZGVmaW5lIEJJT19zZXRfd3JpdGVfYnVmZmVyX3NpemUoYixzaXplKSBCSU9faW50X2N0cmwoYixCSU9fQ19TRVRfQlVGRl9TSVpFLHNpemUsMSkKKyNkZWZpbmUgQklPX3NldF9idWZmZXJfcmVhZF9kYXRhKGIsYnVmLG51bSkgQklPX2N0cmwoYixCSU9fQ19TRVRfQlVGRl9SRUFEX0RBVEEsbnVtLGJ1ZikKKworLyogRG9uJ3QgdXNlIHRoZSBuZXh0IG9uZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIDotKSAqLworI2RlZmluZSBCSU9fZHVwX3N0YXRlKGIscmV0KQlCSU9fY3RybChiLEJJT19DVFJMX0RVUCwwLChjaGFyICopKHJldCkpCisKKyNkZWZpbmUgQklPX3Jlc2V0KGIpCQkoaW50KUJJT19jdHJsKGIsQklPX0NUUkxfUkVTRVQsMCxOVUxMKQorI2RlZmluZSBCSU9fZW9mKGIpCQkoaW50KUJJT19jdHJsKGIsQklPX0NUUkxfRU9GLDAsTlVMTCkKKyNkZWZpbmUgQklPX3NldF9jbG9zZShiLGMpCShpbnQpQklPX2N0cmwoYixCSU9fQ1RSTF9TRVRfQ0xPU0UsKGMpLE5VTEwpCisjZGVmaW5lIEJJT19nZXRfY2xvc2UoYikJKGludClCSU9fY3RybChiLEJJT19DVFJMX0dFVF9DTE9TRSwwLE5VTEwpCisjZGVmaW5lIEJJT19wZW5kaW5nKGIpCQkoaW50KUJJT19jdHJsKGIsQklPX0NUUkxfUEVORElORywwLE5VTEwpCisjZGVmaW5lIEJJT193cGVuZGluZyhiKQkJKGludClCSU9fY3RybChiLEJJT19DVFJMX1dQRU5ESU5HLDAsTlVMTCkKKy8qIC4uLnBlbmRpbmcgbWFjcm9zIGhhdmUgaW5hcHByb3ByaWF0ZSByZXR1cm4gdHlwZSAqLworc2l6ZV90IEJJT19jdHJsX3BlbmRpbmcoQklPICpiKTsKK3NpemVfdCBCSU9fY3RybF93cGVuZGluZyhCSU8gKmIpOworI2RlZmluZSBCSU9fZmx1c2goYikJCShpbnQpQklPX2N0cmwoYixCSU9fQ1RSTF9GTFVTSCwwLE5VTEwpCisjZGVmaW5lIEJJT19nZXRfaW5mb19jYWxsYmFjayhiLGNicCkgKGludClCSU9fY3RybChiLEJJT19DVFJMX0dFVF9DQUxMQkFDSywwLCBcCisJCQkJCQkgICBjYnApCisjZGVmaW5lIEJJT19zZXRfaW5mb19jYWxsYmFjayhiLGNiKSAoaW50KUJJT19jYWxsYmFja19jdHJsKGIsQklPX0NUUkxfU0VUX0NBTExCQUNLLGNiKQorCisvKiBGb3IgdGhlIEJJT19mX2J1ZmZlcigpIHR5cGUgKi8KKyNkZWZpbmUgQklPX2J1ZmZlcl9nZXRfbnVtX2xpbmVzKGIpIEJJT19jdHJsKGIsQklPX0NUUkxfR0VULDAsTlVMTCkKKworLyogRm9yIEJJT19zX2JpbygpICovCisjZGVmaW5lIEJJT19zZXRfd3JpdGVfYnVmX3NpemUoYixzaXplKSAoaW50KUJJT19jdHJsKGIsQklPX0NfU0VUX1dSSVRFX0JVRl9TSVpFLHNpemUsTlVMTCkKKyNkZWZpbmUgQklPX2dldF93cml0ZV9idWZfc2l6ZShiLHNpemUpIChzaXplX3QpQklPX2N0cmwoYixCSU9fQ19HRVRfV1JJVEVfQlVGX1NJWkUsc2l6ZSxOVUxMKQorI2RlZmluZSBCSU9fbWFrZV9iaW9fcGFpcihiMSxiMikgICAoaW50KUJJT19jdHJsKGIxLEJJT19DX01BS0VfQklPX1BBSVIsMCxiMikKKyNkZWZpbmUgQklPX2Rlc3Ryb3lfYmlvX3BhaXIoYikgICAgKGludClCSU9fY3RybChiLEJJT19DX0RFU1RST1lfQklPX1BBSVIsMCxOVUxMKQorI2RlZmluZSBCSU9fc2h1dGRvd25fd3IoYikgKGludClCSU9fY3RybChiLCBCSU9fQ19TSFVURE9XTl9XUiwgMCwgTlVMTCkKKy8qIG1hY3JvcyB3aXRoIGluYXBwcm9wcmlhdGUgdHlwZSAtLSBidXQgLi4ucGVuZGluZyBtYWNyb3MgdXNlIGludCB0b286ICovCisjZGVmaW5lIEJJT19nZXRfd3JpdGVfZ3VhcmFudGVlKGIpIChpbnQpQklPX2N0cmwoYixCSU9fQ19HRVRfV1JJVEVfR1VBUkFOVEVFLDAsTlVMTCkKKyNkZWZpbmUgQklPX2dldF9yZWFkX3JlcXVlc3QoYikgICAgKGludClCSU9fY3RybChiLEJJT19DX0dFVF9SRUFEX1JFUVVFU1QsMCxOVUxMKQorc2l6ZV90IEJJT19jdHJsX2dldF93cml0ZV9ndWFyYW50ZWUoQklPICpiKTsKK3NpemVfdCBCSU9fY3RybF9nZXRfcmVhZF9yZXF1ZXN0KEJJTyAqYik7CitpbnQgQklPX2N0cmxfcmVzZXRfcmVhZF9yZXF1ZXN0KEJJTyAqYik7CisKKy8qIGN0cmwgbWFjcm9zIGZvciBkZ3JhbSAqLworI2RlZmluZSBCSU9fY3RybF9kZ3JhbV9jb25uZWN0KGIscGVlcikgIFwKKyAgICAgICAgICAgICAgICAgICAgIChpbnQpQklPX2N0cmwoYixCSU9fQ1RSTF9ER1JBTV9DT05ORUNULDAsIChjaGFyICopcGVlcikKKyNkZWZpbmUgQklPX2N0cmxfc2V0X2Nvbm5lY3RlZChiLCBzdGF0ZSwgcGVlcikgXAorICAgICAgICAgKGludClCSU9fY3RybChiLCBCSU9fQ1RSTF9ER1JBTV9TRVRfQ09OTkVDVEVELCBzdGF0ZSwgKGNoYXIgKilwZWVyKQorI2RlZmluZSBCSU9fZGdyYW1fcmVjdl90aW1lZG91dChiKSBcCisgICAgICAgICAoaW50KUJJT19jdHJsKGIsIEJJT19DVFJMX0RHUkFNX0dFVF9SRUNWX1RJTUVSX0VYUCwgMCwgTlVMTCkKKyNkZWZpbmUgQklPX2RncmFtX3NlbmRfdGltZWRvdXQoYikgXAorICAgICAgICAgKGludClCSU9fY3RybChiLCBCSU9fQ1RSTF9ER1JBTV9HRVRfU0VORF9USU1FUl9FWFAsIDAsIE5VTEwpCisjZGVmaW5lIEJJT19kZ3JhbV9nZXRfcGVlcihiLHBlZXIpIFwKKyAgICAgICAgIChpbnQpQklPX2N0cmwoYiwgQklPX0NUUkxfREdSQU1fR0VUX1BFRVIsIDAsIChjaGFyICopcGVlcikKKyNkZWZpbmUgQklPX2RncmFtX3NldF9wZWVyKGIscGVlcikgXAorICAgICAgICAgKGludClCSU9fY3RybChiLCBCSU9fQ1RSTF9ER1JBTV9TRVRfUEVFUiwgMCwgKGNoYXIgKilwZWVyKQorCisvKiBUaGVzZSB0d28gYXJlbid0IGN1cnJlbnRseSBpbXBsZW1lbnRlZCAqLworLyogaW50IEJJT19nZXRfZXhfbnVtKEJJTyAqYmlvKTsgKi8KKy8qIHZvaWQgQklPX3NldF9leF9mcmVlX2Z1bmMoQklPICpiaW8saW50IGlkeCx2b2lkICgqY2IpKCkpOyAqLworaW50IEJJT19zZXRfZXhfZGF0YShCSU8gKmJpbyxpbnQgaWR4LHZvaWQgKmRhdGEpOwordm9pZCAqQklPX2dldF9leF9kYXRhKEJJTyAqYmlvLGludCBpZHgpOworaW50IEJJT19nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOwordW5zaWduZWQgbG9uZyBCSU9fbnVtYmVyX3JlYWQoQklPICpiaW8pOwordW5zaWduZWQgbG9uZyBCSU9fbnVtYmVyX3dyaXR0ZW4oQklPICpiaW8pOworCisvKiBGb3IgQklPX2ZfYXNuMSgpICovCitpbnQgQklPX2FzbjFfc2V0X3ByZWZpeChCSU8gKmIsIGFzbjFfcHNfZnVuYyAqcHJlZml4LAorCQkJCQlhc24xX3BzX2Z1bmMgKnByZWZpeF9mcmVlKTsKK2ludCBCSU9fYXNuMV9nZXRfcHJlZml4KEJJTyAqYiwgYXNuMV9wc19mdW5jICoqcHByZWZpeCwKKwkJCQkJYXNuMV9wc19mdW5jICoqcHByZWZpeF9mcmVlKTsKK2ludCBCSU9fYXNuMV9zZXRfc3VmZml4KEJJTyAqYiwgYXNuMV9wc19mdW5jICpzdWZmaXgsCisJCQkJCWFzbjFfcHNfZnVuYyAqc3VmZml4X2ZyZWUpOworaW50IEJJT19hc24xX2dldF9zdWZmaXgoQklPICpiLCBhc24xX3BzX2Z1bmMgKipwc3VmZml4LAorCQkJCQlhc24xX3BzX2Z1bmMgKipwc3VmZml4X2ZyZWUpOworCisjIGlmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorQklPX01FVEhPRCAqQklPX3NfZmlsZSh2b2lkICk7CitCSU8gKkJJT19uZXdfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSk7CitCSU8gKkJJT19uZXdfZnAoRklMRSAqc3RyZWFtLCBpbnQgY2xvc2VfZmxhZyk7CisjIGRlZmluZSBCSU9fc19maWxlX2ludGVybmFsCUJJT19zX2ZpbGUKKyMgZW5kaWYKK0JJTyAqCUJJT19uZXcoQklPX01FVEhPRCAqdHlwZSk7CitpbnQJQklPX3NldChCSU8gKmEsQklPX01FVEhPRCAqdHlwZSk7CitpbnQJQklPX2ZyZWUoQklPICphKTsKK3ZvaWQJQklPX3ZmcmVlKEJJTyAqYSk7CitpbnQJQklPX3JlYWQoQklPICpiLCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK2ludAlCSU9fZ2V0cyhCSU8gKmJwLGNoYXIgKmJ1ZiwgaW50IHNpemUpOworaW50CUJJT193cml0ZShCSU8gKmIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOworaW50CUJJT19wdXRzKEJJTyAqYnAsY29uc3QgY2hhciAqYnVmKTsKK2ludAlCSU9faW5kZW50KEJJTyAqYixpbnQgaW5kZW50LGludCBtYXgpOworbG9uZwlCSU9fY3RybChCSU8gKmJwLGludCBjbWQsbG9uZyBsYXJnLHZvaWQgKnBhcmcpOworbG9uZyBCSU9fY2FsbGJhY2tfY3RybChCSU8gKmIsIGludCBjbWQsIHZvaWQgKCpmcCkoc3RydWN0IGJpb19zdCAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBsb25nLCBsb25nKSk7CitjaGFyICoJQklPX3B0cl9jdHJsKEJJTyAqYnAsaW50IGNtZCxsb25nIGxhcmcpOworbG9uZwlCSU9faW50X2N0cmwoQklPICpicCxpbnQgY21kLGxvbmcgbGFyZyxpbnQgaWFyZyk7CitCSU8gKglCSU9fcHVzaChCSU8gKmIsQklPICphcHBlbmQpOworQklPICoJQklPX3BvcChCSU8gKmIpOwordm9pZAlCSU9fZnJlZV9hbGwoQklPICphKTsKK0JJTyAqCUJJT19maW5kX3R5cGUoQklPICpiLGludCBiaW9fdHlwZSk7CitCSU8gKglCSU9fbmV4dChCSU8gKmIpOworQklPICoJQklPX2dldF9yZXRyeV9CSU8oQklPICpiaW8sIGludCAqcmVhc29uKTsKK2ludAlCSU9fZ2V0X3JldHJ5X3JlYXNvbihCSU8gKmJpbyk7CitCSU8gKglCSU9fZHVwX2NoYWluKEJJTyAqaW4pOworCitpbnQgQklPX25yZWFkMChCSU8gKmJpbywgY2hhciAqKmJ1Zik7CitpbnQgQklPX25yZWFkKEJJTyAqYmlvLCBjaGFyICoqYnVmLCBpbnQgbnVtKTsKK2ludCBCSU9fbndyaXRlMChCSU8gKmJpbywgY2hhciAqKmJ1Zik7CitpbnQgQklPX253cml0ZShCSU8gKmJpbywgY2hhciAqKmJ1ZiwgaW50IG51bSk7CisKK2xvbmcgQklPX2RlYnVnX2NhbGxiYWNrKEJJTyAqYmlvLGludCBjbWQsY29uc3QgY2hhciAqYXJncCxpbnQgYXJnaSwKKwlsb25nIGFyZ2wsbG9uZyByZXQpOworCitCSU9fTUVUSE9EICpCSU9fc19tZW0odm9pZCk7CitCSU8gKkJJT19uZXdfbWVtX2J1Zih2b2lkICpidWYsIGludCBsZW4pOworQklPX01FVEhPRCAqQklPX3Nfc29ja2V0KHZvaWQpOworQklPX01FVEhPRCAqQklPX3NfY29ubmVjdCh2b2lkKTsKK0JJT19NRVRIT0QgKkJJT19zX2FjY2VwdCh2b2lkKTsKK0JJT19NRVRIT0QgKkJJT19zX2ZkKHZvaWQpOworI2lmbmRlZiBPUEVOU1NMX1NZU19PUzIKK0JJT19NRVRIT0QgKkJJT19zX2xvZyh2b2lkKTsKKyNlbmRpZgorQklPX01FVEhPRCAqQklPX3NfYmlvKHZvaWQpOworQklPX01FVEhPRCAqQklPX3NfbnVsbCh2b2lkKTsKK0JJT19NRVRIT0QgKkJJT19mX251bGwodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fZl9idWZmZXIodm9pZCk7CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCitCSU9fTUVUSE9EICpCSU9fZl9saW5lYnVmZmVyKHZvaWQpOworI2VuZGlmCitCSU9fTUVUSE9EICpCSU9fZl9uYmlvX3Rlc3Qodm9pZCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fREdSQU0KK0JJT19NRVRIT0QgKkJJT19zX2RhdGFncmFtKHZvaWQpOworI2VuZGlmCisKKy8qIEJJT19NRVRIT0QgKkJJT19mX2Jlcih2b2lkKTsgKi8KKworaW50IEJJT19zb2NrX3Nob3VsZF9yZXRyeShpbnQgaSk7CitpbnQgQklPX3NvY2tfbm9uX2ZhdGFsX2Vycm9yKGludCBlcnJvcik7CitpbnQgQklPX2RncmFtX25vbl9mYXRhbF9lcnJvcihpbnQgZXJyb3IpOworCitpbnQgQklPX2ZkX3Nob3VsZF9yZXRyeShpbnQgaSk7CitpbnQgQklPX2ZkX25vbl9mYXRhbF9lcnJvcihpbnQgZXJyb3IpOworaW50IEJJT19kdW1wX2NiKGludCAoKmNiKShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB2b2lkICp1KSwKKwkJdm9pZCAqdSwgY29uc3QgY2hhciAqcywgaW50IGxlbik7CitpbnQgQklPX2R1bXBfaW5kZW50X2NiKGludCAoKmNiKShjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCB2b2lkICp1KSwKKwkJICAgICAgIHZvaWQgKnUsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4sIGludCBpbmRlbnQpOworaW50IEJJT19kdW1wKEJJTyAqYixjb25zdCBjaGFyICpieXRlcyxpbnQgbGVuKTsKK2ludCBCSU9fZHVtcF9pbmRlbnQoQklPICpiLGNvbnN0IGNoYXIgKmJ5dGVzLGludCBsZW4saW50IGluZGVudCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgQklPX2R1bXBfZnAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4pOworaW50IEJJT19kdW1wX2luZGVudF9mcChGSUxFICpmcCwgY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IGluZGVudCk7CisjZW5kaWYKK3N0cnVjdCBob3N0ZW50ICpCSU9fZ2V0aG9zdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKTsKKy8qIFdlIG1pZ2h0IHdhbnQgYSB0aHJlYWQtc2FmZSBpbnRlcmZhY2UgdG9vOgorICogc3RydWN0IGhvc3RlbnQgKkJJT19nZXRob3N0YnluYW1lX3IoY29uc3QgY2hhciAqbmFtZSwKKyAqICAgICBzdHJ1Y3QgaG9zdGVudCAqcmVzdWx0LCB2b2lkICpidWZmZXIsIHNpemVfdCBidWZsZW4pOworICogb3Igc29tZXRoaW5nIHNpbWlsYXIgKGNhbGxlciBhbGxvY2F0ZXMgYSBzdHJ1Y3QgaG9zdGVudCwKKyAqIHBvaW50ZWQgdG8gYnkgInJlc3VsdCIsIGFuZCBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZSBmb3IgdGhlIHZhcmlvdXMKKyAqIHN1YnN0cnVjdHVyZXM7IGlmIHRoZSBidWZmZXIgZG9lcyBub3Qgc3VmZmljZSwgTlVMTCBpcyByZXR1cm5lZAorICogYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgaXMgc2V0KS4KKyAqLworaW50IEJJT19zb2NrX2Vycm9yKGludCBzb2NrKTsKK2ludCBCSU9fc29ja2V0X2lvY3RsKGludCBmZCwgbG9uZyB0eXBlLCB2b2lkICphcmcpOworaW50IEJJT19zb2NrZXRfbmJpbyhpbnQgZmQsaW50IG1vZGUpOworaW50IEJJT19nZXRfcG9ydChjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIHNob3J0ICpwb3J0X3B0cik7CitpbnQgQklPX2dldF9ob3N0X2lwKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqaXApOworaW50IEJJT19nZXRfYWNjZXB0X3NvY2tldChjaGFyICpob3N0X3BvcnQsaW50IG1vZGUpOworaW50IEJJT19hY2NlcHQoaW50IHNvY2ssY2hhciAqKmlwX3BvcnQpOworaW50IEJJT19zb2NrX2luaXQodm9pZCApOwordm9pZCBCSU9fc29ja19jbGVhbnVwKHZvaWQpOworaW50IEJJT19zZXRfdGNwX25kZWxheShpbnQgc29jayxpbnQgdHVybl9vbik7CisKK0JJTyAqQklPX25ld19zb2NrZXQoaW50IHNvY2ssIGludCBjbG9zZV9mbGFnKTsKK0JJTyAqQklPX25ld19kZ3JhbShpbnQgZmQsIGludCBjbG9zZV9mbGFnKTsKK0JJTyAqQklPX25ld19mZChpbnQgZmQsIGludCBjbG9zZV9mbGFnKTsKK0JJTyAqQklPX25ld19jb25uZWN0KGNoYXIgKmhvc3RfcG9ydCk7CitCSU8gKkJJT19uZXdfYWNjZXB0KGNoYXIgKmhvc3RfcG9ydCk7CisKK2ludCBCSU9fbmV3X2Jpb19wYWlyKEJJTyAqKmJpbzEsIHNpemVfdCB3cml0ZWJ1ZjEsCisJQklPICoqYmlvMiwgc2l6ZV90IHdyaXRlYnVmMik7CisvKiBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIDEgYW5kIGluICpiaW8xLCAqYmlvMiB0d28gQklPIHBhaXIgZW5kcG9pbnRzLgorICogT3RoZXJ3aXNlIHJldHVybnMgMCBhbmQgc2V0cyAqYmlvMSBhbmQgKmJpbzIgdG8gTlVMTC4KKyAqIFNpemUgMCB1c2VzIGRlZmF1bHQgdmFsdWUuCisgKi8KKwordm9pZCBCSU9fY29weV9uZXh0X3JldHJ5KEJJTyAqYik7CisKKy8qbG9uZyBCSU9fZ2hibl9jdHJsKGludCBjbWQsaW50IGlhcmcsY2hhciAqcGFyZyk7Ki8KKworI2lmZGVmIF9fR05VQ19fCisjICBkZWZpbmUgX19iaW9faF9fYXR0cl9fIF9fYXR0cmlidXRlX18KKyNlbHNlCisjICBkZWZpbmUgX19iaW9faF9fYXR0cl9fKHgpCisjZW5kaWYKK2ludCBCSU9fcHJpbnRmKEJJTyAqYmlvLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwlfX2Jpb19oX19hdHRyX18oKF9fZm9ybWF0X18oX19wcmludGZfXywyLDMpKSk7CitpbnQgQklPX3ZwcmludGYoQklPICpiaW8sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorCV9fYmlvX2hfX2F0dHJfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLDIsMCkpKTsKK2ludCBCSU9fc25wcmludGYoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19iaW9faF9fYXR0cl9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sMyw0KSkpOworaW50IEJJT192c25wcmludGYoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCisJX19iaW9faF9fYXR0cl9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sMywwKSkpOworI3VuZGVmIF9fYmlvX2hfX2F0dHJfXworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0JJT19zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIEJJTyBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBCSU9fRl9BQ1BUX1NUQVRFCQkJCSAxMDAKKyNkZWZpbmUgQklPX0ZfQklPX0FDQ0VQVAkJCQkgMTAxCisjZGVmaW5lIEJJT19GX0JJT19CRVJfR0VUX0hFQURFUgkJCSAxMDIKKyNkZWZpbmUgQklPX0ZfQklPX0NBTExCQUNLX0NUUkwJCQkJIDEzMQorI2RlZmluZSBCSU9fRl9CSU9fQ1RSTAkJCQkJIDEwMworI2RlZmluZSBCSU9fRl9CSU9fR0VUSE9TVEJZTkFNRQkJCQkgMTIwCisjZGVmaW5lIEJJT19GX0JJT19HRVRTCQkJCQkgMTA0CisjZGVmaW5lIEJJT19GX0JJT19HRVRfQUNDRVBUX1NPQ0tFVAkJCSAxMDUKKyNkZWZpbmUgQklPX0ZfQklPX0dFVF9IT1NUX0lQCQkJCSAxMDYKKyNkZWZpbmUgQklPX0ZfQklPX0dFVF9QT1JUCQkJCSAxMDcKKyNkZWZpbmUgQklPX0ZfQklPX01BS0VfUEFJUgkJCQkgMTIxCisjZGVmaW5lIEJJT19GX0JJT19ORVcJCQkJCSAxMDgKKyNkZWZpbmUgQklPX0ZfQklPX05FV19GSUxFCQkJCSAxMDkKKyNkZWZpbmUgQklPX0ZfQklPX05FV19NRU1fQlVGCQkJCSAxMjYKKyNkZWZpbmUgQklPX0ZfQklPX05SRUFECQkJCQkgMTIzCisjZGVmaW5lIEJJT19GX0JJT19OUkVBRDAJCQkJIDEyNAorI2RlZmluZSBCSU9fRl9CSU9fTldSSVRFCQkJCSAxMjUKKyNkZWZpbmUgQklPX0ZfQklPX05XUklURTAJCQkJIDEyMgorI2RlZmluZSBCSU9fRl9CSU9fUFVUUwkJCQkJIDExMAorI2RlZmluZSBCSU9fRl9CSU9fUkVBRAkJCQkJIDExMQorI2RlZmluZSBCSU9fRl9CSU9fU09DS19JTklUCQkJCSAxMTIKKyNkZWZpbmUgQklPX0ZfQklPX1dSSVRFCQkJCQkgMTEzCisjZGVmaW5lIEJJT19GX0JVRkZFUl9DVFJMCQkJCSAxMTQKKyNkZWZpbmUgQklPX0ZfQ09OTl9DVFJMCQkJCQkgMTI3CisjZGVmaW5lIEJJT19GX0NPTk5fU1RBVEUJCQkJIDExNQorI2RlZmluZSBCSU9fRl9GSUxFX0NUUkwJCQkJCSAxMTYKKyNkZWZpbmUgQklPX0ZfRklMRV9SRUFECQkJCQkgMTMwCisjZGVmaW5lIEJJT19GX0xJTkVCVUZGRVJfQ1RSTAkJCQkgMTI5CisjZGVmaW5lIEJJT19GX01FTV9SRUFECQkJCQkgMTI4CisjZGVmaW5lIEJJT19GX01FTV9XUklURQkJCQkJIDExNworI2RlZmluZSBCSU9fRl9TU0xfTkVXCQkJCQkgMTE4CisjZGVmaW5lIEJJT19GX1dTQVNUQVJUVVAJCQkJIDExOQorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIEJJT19SX0FDQ0VQVF9FUlJPUgkJCQkgMTAwCisjZGVmaW5lIEJJT19SX0JBRF9GT1BFTl9NT0RFCQkJCSAxMDEKKyNkZWZpbmUgQklPX1JfQkFEX0hPU1ROQU1FX0xPT0tVUAkJCSAxMDIKKyNkZWZpbmUgQklPX1JfQlJPS0VOX1BJUEUJCQkJIDEyNAorI2RlZmluZSBCSU9fUl9DT05ORUNUX0VSUk9SCQkJCSAxMDMKKyNkZWZpbmUgQklPX1JfRU9GX09OX01FTU9SWV9CSU8JCQkJIDEyNworI2RlZmluZSBCSU9fUl9FUlJPUl9TRVRUSU5HX05CSU8JCQkgMTA0CisjZGVmaW5lIEJJT19SX0VSUk9SX1NFVFRJTkdfTkJJT19PTl9BQ0NFUFRFRF9TT0NLRVQJIDEwNQorI2RlZmluZSBCSU9fUl9FUlJPUl9TRVRUSU5HX05CSU9fT05fQUNDRVBUX1NPQ0tFVAkgMTA2CisjZGVmaW5lIEJJT19SX0dFVEhPU1RCWU5BTUVfQUREUl9JU19OT1RfQUZfSU5FVAkJIDEwNworI2RlZmluZSBCSU9fUl9JTlZBTElEX0FSR1VNRU5UCQkJCSAxMjUKKyNkZWZpbmUgQklPX1JfSU5WQUxJRF9JUF9BRERSRVNTCQkJIDEwOAorI2RlZmluZSBCSU9fUl9JTl9VU0UJCQkJCSAxMjMKKyNkZWZpbmUgQklPX1JfS0VFUEFMSVZFCQkJCQkgMTA5CisjZGVmaW5lIEJJT19SX05CSU9fQ09OTkVDVF9FUlJPUgkJCSAxMTAKKyNkZWZpbmUgQklPX1JfTk9fQUNDRVBUX1BPUlRfU1BFQ0lGSUVECQkJIDExMQorI2RlZmluZSBCSU9fUl9OT19IT1NUTkFNRV9TUEVDSUZJRUQJCQkgMTEyCisjZGVmaW5lIEJJT19SX05PX1BPUlRfREVGSU5FRAkJCQkgMTEzCisjZGVmaW5lIEJJT19SX05PX1BPUlRfU1BFQ0lGSUVECQkJCSAxMTQKKyNkZWZpbmUgQklPX1JfTk9fU1VDSF9GSUxFCQkJCSAxMjgKKyNkZWZpbmUgQklPX1JfTlVMTF9QQVJBTUVURVIJCQkJIDExNQorI2RlZmluZSBCSU9fUl9UQUdfTUlTTUFUQ0gJCQkJIDExNgorI2RlZmluZSBCSU9fUl9VTkFCTEVfVE9fQklORF9TT0NLRVQJCQkgMTE3CisjZGVmaW5lIEJJT19SX1VOQUJMRV9UT19DUkVBVEVfU09DS0VUCQkJIDExOAorI2RlZmluZSBCSU9fUl9VTkFCTEVfVE9fTElTVEVOX1NPQ0tFVAkJCSAxMTkKKyNkZWZpbmUgQklPX1JfVU5JTklUSUFMSVpFRAkJCQkgMTIwCisjZGVmaW5lIEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRAkJCSAxMjEKKyNkZWZpbmUgQklPX1JfV1JJVEVfVE9fUkVBRF9PTkxZX0JJTwkJCSAxMjYKKyNkZWZpbmUgQklPX1JfV1NBU1RBUlRVUAkJCQkgMTIyCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpb19jYi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iaW9fY2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmNiYzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iaW9fY2IuYwpAQCAtMCwwICsxLDE0MyBAQAorLyogY3J5cHRvL2Jpby9iaW9fY2IuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworbG9uZyBNU19DQUxMQkFDSyBCSU9fZGVidWdfY2FsbGJhY2soQklPICpiaW8sIGludCBjbWQsIGNvbnN0IGNoYXIgKmFyZ3AsCisJICAgICBpbnQgYXJnaSwgbG9uZyBhcmdsLCBsb25nIHJldCkKKwl7CisJQklPICpiOworCU1TX1NUQVRJQyBjaGFyIGJ1ZlsyNTZdOworCWNoYXIgKnA7CisJbG9uZyByPTE7CisJc2l6ZV90IHBfbWF4bGVuOworCisJaWYgKEJJT19DQl9SRVRVUk4gJiBjbWQpCisJCXI9cmV0OworCisJQklPX3NucHJpbnRmKGJ1ZixzaXplb2YgYnVmLCJCSU9bJTA4bFhdOiIsKHVuc2lnbmVkIGxvbmcpYmlvKTsKKwlwPSAmKGJ1ZlsxNF0pOworCXBfbWF4bGVuID0gc2l6ZW9mIGJ1ZiAtIDE0OworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBCSU9fQ0JfRlJFRToKKwkJQklPX3NucHJpbnRmKHAscF9tYXhsZW4sIkZyZWUgLSAlc1xuIixiaW8tPm1ldGhvZC0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgQklPX0NCX1JFQUQ6CisJCWlmIChiaW8tPm1ldGhvZC0+dHlwZSAmIEJJT19UWVBFX0RFU0NSSVBUT1IpCisJCQlCSU9fc25wcmludGYocCxwX21heGxlbiwicmVhZCglZCwlbHUpIC0gJXMgZmQ9JWRcbiIsCisJCQkJIGJpby0+bnVtLCh1bnNpZ25lZCBsb25nKWFyZ2ksCisJCQkJIGJpby0+bWV0aG9kLT5uYW1lLGJpby0+bnVtKTsKKwkJZWxzZQorCQkJQklPX3NucHJpbnRmKHAscF9tYXhsZW4sInJlYWQoJWQsJWx1KSAtICVzXG4iLAorCQkJCSBiaW8tPm51bSwodW5zaWduZWQgbG9uZylhcmdpLAorCQkJCSBiaW8tPm1ldGhvZC0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgQklPX0NCX1dSSVRFOgorCQlpZiAoYmlvLT5tZXRob2QtPnR5cGUgJiBCSU9fVFlQRV9ERVNDUklQVE9SKQorCQkJQklPX3NucHJpbnRmKHAscF9tYXhsZW4sIndyaXRlKCVkLCVsdSkgLSAlcyBmZD0lZFxuIiwKKwkJCQkgYmlvLT5udW0sKHVuc2lnbmVkIGxvbmcpYXJnaSwKKwkJCQkgYmlvLT5tZXRob2QtPm5hbWUsYmlvLT5udW0pOworCQllbHNlCisJCQlCSU9fc25wcmludGYocCxwX21heGxlbiwid3JpdGUoJWQsJWx1KSAtICVzXG4iLAorCQkJCSBiaW8tPm51bSwodW5zaWduZWQgbG9uZylhcmdpLAorCQkJCSBiaW8tPm1ldGhvZC0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgQklPX0NCX1BVVFM6CisJCUJJT19zbnByaW50ZihwLHBfbWF4bGVuLCJwdXRzKCkgLSAlc1xuIixiaW8tPm1ldGhvZC0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgQklPX0NCX0dFVFM6CisJCUJJT19zbnByaW50ZihwLHBfbWF4bGVuLCJnZXRzKCVsdSkgLSAlc1xuIiwodW5zaWduZWQgbG9uZylhcmdpLGJpby0+bWV0aG9kLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ0JfQ1RSTDoKKwkJQklPX3NucHJpbnRmKHAscF9tYXhsZW4sImN0cmwoJWx1KSAtICVzXG4iLCh1bnNpZ25lZCBsb25nKWFyZ2ksYmlvLT5tZXRob2QtPm5hbWUpOworCQlicmVhazsKKwljYXNlIEJJT19DQl9SRVRVUk58QklPX0NCX1JFQUQ6CisJCUJJT19zbnByaW50ZihwLHBfbWF4bGVuLCJyZWFkIHJldHVybiAlbGRcbiIscmV0KTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ0JfUkVUVVJOfEJJT19DQl9XUklURToKKwkJQklPX3NucHJpbnRmKHAscF9tYXhsZW4sIndyaXRlIHJldHVybiAlbGRcbiIscmV0KTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ0JfUkVUVVJOfEJJT19DQl9HRVRTOgorCQlCSU9fc25wcmludGYocCxwX21heGxlbiwiZ2V0cyByZXR1cm4gJWxkXG4iLHJldCk7CisJCWJyZWFrOworCWNhc2UgQklPX0NCX1JFVFVSTnxCSU9fQ0JfUFVUUzoKKwkJQklPX3NucHJpbnRmKHAscF9tYXhsZW4sInB1dHMgcmV0dXJuICVsZFxuIixyZXQpOworCQlicmVhazsKKwljYXNlIEJJT19DQl9SRVRVUk58QklPX0NCX0NUUkw6CisJCUJJT19zbnByaW50ZihwLHBfbWF4bGVuLCJjdHJsIHJldHVybiAlbGRcbiIscmV0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQklPX3NucHJpbnRmKHAscF9tYXhsZW4sImJpbyBjYWxsYmFjayAtIHVua25vd24gdHlwZSAoJWQpXG4iLGNtZCk7CisJCWJyZWFrOworCQl9CisKKwliPShCSU8gKiliaW8tPmNiX2FyZzsKKwlpZiAoYiAhPSBOVUxMKQorCQlCSU9fd3JpdGUoYixidWYsc3RybGVuKGJ1ZikpOworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1RESU8pICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjE2KQorCWVsc2UKKwkJZnB1dHMoYnVmLHN0ZGVycik7CisjZW5kaWYKKwlyZXR1cm4ocik7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iaW9fZXJyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpb19lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjI0ZWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9iaW9fZXJyLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qIGNyeXB0by9iaW8vYmlvX2Vyci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogTk9URTogdGhpcyBmaWxlIHdhcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgbWtlcnIucGwgc2NyaXB0OiBhbnkgY2hhbmdlcworICogbWFkZSB0byBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBuZXh0IHVwZGF0ZXMgdGhpcyBmaWxlLAorICogb25seSByZWFzb24gc3RyaW5ncyB3aWxsIGJlIHByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9CSU8sZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9CSU8sMCxyZWFzb24pCisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgQklPX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoQklPX0ZfQUNQVF9TVEFURSksCSJBQ1BUX1NUQVRFIn0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX0FDQ0VQVCksCSJCSU9fYWNjZXB0In0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX0JFUl9HRVRfSEVBREVSKSwJIkJJT19CRVJfR0VUX0hFQURFUiJ9LAore0VSUl9GVU5DKEJJT19GX0JJT19DQUxMQkFDS19DVFJMKSwJIkJJT19jYWxsYmFja19jdHJsIn0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX0NUUkwpLAkiQklPX2N0cmwifSwKK3tFUlJfRlVOQyhCSU9fRl9CSU9fR0VUSE9TVEJZTkFNRSksCSJCSU9fZ2V0aG9zdGJ5bmFtZSJ9LAore0VSUl9GVU5DKEJJT19GX0JJT19HRVRTKSwJIkJJT19nZXRzIn0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX0dFVF9BQ0NFUFRfU09DS0VUKSwJIkJJT19nZXRfYWNjZXB0X3NvY2tldCJ9LAore0VSUl9GVU5DKEJJT19GX0JJT19HRVRfSE9TVF9JUCksCSJCSU9fZ2V0X2hvc3RfaXAifSwKK3tFUlJfRlVOQyhCSU9fRl9CSU9fR0VUX1BPUlQpLAkiQklPX2dldF9wb3J0In0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX01BS0VfUEFJUiksCSJCSU9fTUFLRV9QQUlSIn0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX05FVyksCSJCSU9fbmV3In0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX05FV19GSUxFKSwJIkJJT19uZXdfZmlsZSJ9LAore0VSUl9GVU5DKEJJT19GX0JJT19ORVdfTUVNX0JVRiksCSJCSU9fbmV3X21lbV9idWYifSwKK3tFUlJfRlVOQyhCSU9fRl9CSU9fTlJFQUQpLAkiQklPX25yZWFkIn0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX05SRUFEMCksCSJCSU9fbnJlYWQwIn0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX05XUklURSksCSJCSU9fbndyaXRlIn0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX05XUklURTApLAkiQklPX253cml0ZTAifSwKK3tFUlJfRlVOQyhCSU9fRl9CSU9fUFVUUyksCSJCSU9fcHV0cyJ9LAore0VSUl9GVU5DKEJJT19GX0JJT19SRUFEKSwJIkJJT19yZWFkIn0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX1NPQ0tfSU5JVCksCSJCSU9fc29ja19pbml0In0sCit7RVJSX0ZVTkMoQklPX0ZfQklPX1dSSVRFKSwJIkJJT193cml0ZSJ9LAore0VSUl9GVU5DKEJJT19GX0JVRkZFUl9DVFJMKSwJIkJVRkZFUl9DVFJMIn0sCit7RVJSX0ZVTkMoQklPX0ZfQ09OTl9DVFJMKSwJIkNPTk5fQ1RSTCJ9LAore0VSUl9GVU5DKEJJT19GX0NPTk5fU1RBVEUpLAkiQ09OTl9TVEFURSJ9LAore0VSUl9GVU5DKEJJT19GX0ZJTEVfQ1RSTCksCSJGSUxFX0NUUkwifSwKK3tFUlJfRlVOQyhCSU9fRl9GSUxFX1JFQUQpLAkiRklMRV9SRUFEIn0sCit7RVJSX0ZVTkMoQklPX0ZfTElORUJVRkZFUl9DVFJMKSwJIkxJTkVCVUZGRVJfQ1RSTCJ9LAore0VSUl9GVU5DKEJJT19GX01FTV9SRUFEKSwJIk1FTV9SRUFEIn0sCit7RVJSX0ZVTkMoQklPX0ZfTUVNX1dSSVRFKSwJIk1FTV9XUklURSJ9LAore0VSUl9GVU5DKEJJT19GX1NTTF9ORVcpLAkiU1NMX25ldyJ9LAore0VSUl9GVU5DKEJJT19GX1dTQVNUQVJUVVApLAkiV1NBU1RBUlRVUCJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEJJT19zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKEJJT19SX0FDQ0VQVF9FUlJPUikgICAgICAgICAgLCJhY2NlcHQgZXJyb3IifSwKK3tFUlJfUkVBU09OKEJJT19SX0JBRF9GT1BFTl9NT0RFKSAgICAgICAgLCJiYWQgZm9wZW4gbW9kZSJ9LAore0VSUl9SRUFTT04oQklPX1JfQkFEX0hPU1ROQU1FX0xPT0tVUCkgICAsImJhZCBob3N0bmFtZSBsb29rdXAifSwKK3tFUlJfUkVBU09OKEJJT19SX0JST0tFTl9QSVBFKSAgICAgICAgICAgLCJicm9rZW4gcGlwZSJ9LAore0VSUl9SRUFTT04oQklPX1JfQ09OTkVDVF9FUlJPUikgICAgICAgICAsImNvbm5lY3QgZXJyb3IifSwKK3tFUlJfUkVBU09OKEJJT19SX0VPRl9PTl9NRU1PUllfQklPKSAgICAgLCJFT0Ygb24gbWVtb3J5IEJJTyJ9LAore0VSUl9SRUFTT04oQklPX1JfRVJST1JfU0VUVElOR19OQklPKSAgICAsImVycm9yIHNldHRpbmcgbmJpbyJ9LAore0VSUl9SRUFTT04oQklPX1JfRVJST1JfU0VUVElOR19OQklPX09OX0FDQ0VQVEVEX1NPQ0tFVCksImVycm9yIHNldHRpbmcgbmJpbyBvbiBhY2NlcHRlZCBzb2NrZXQifSwKK3tFUlJfUkVBU09OKEJJT19SX0VSUk9SX1NFVFRJTkdfTkJJT19PTl9BQ0NFUFRfU09DS0VUKSwiZXJyb3Igc2V0dGluZyBuYmlvIG9uIGFjY2VwdCBzb2NrZXQifSwKK3tFUlJfUkVBU09OKEJJT19SX0dFVEhPU1RCWU5BTUVfQUREUl9JU19OT1RfQUZfSU5FVCksImdldGhvc3RieW5hbWUgYWRkciBpcyBub3QgYWYgaW5ldCJ9LAore0VSUl9SRUFTT04oQklPX1JfSU5WQUxJRF9BUkdVTUVOVCkgICAgICAsImludmFsaWQgYXJndW1lbnQifSwKK3tFUlJfUkVBU09OKEJJT19SX0lOVkFMSURfSVBfQUREUkVTUykgICAgLCJpbnZhbGlkIGlwIGFkZHJlc3MifSwKK3tFUlJfUkVBU09OKEJJT19SX0lOX1VTRSkgICAgICAgICAgICAgICAgLCJpbiB1c2UifSwKK3tFUlJfUkVBU09OKEJJT19SX0tFRVBBTElWRSkgICAgICAgICAgICAgLCJrZWVwYWxpdmUifSwKK3tFUlJfUkVBU09OKEJJT19SX05CSU9fQ09OTkVDVF9FUlJPUikgICAgLCJuYmlvIGNvbm5lY3QgZXJyb3IifSwKK3tFUlJfUkVBU09OKEJJT19SX05PX0FDQ0VQVF9QT1JUX1NQRUNJRklFRCksIm5vIGFjY2VwdCBwb3J0IHNwZWNpZmllZCJ9LAore0VSUl9SRUFTT04oQklPX1JfTk9fSE9TVE5BTUVfU1BFQ0lGSUVEKSAsIm5vIGhvc3RuYW1lIHNwZWNpZmllZCJ9LAore0VSUl9SRUFTT04oQklPX1JfTk9fUE9SVF9ERUZJTkVEKSAgICAgICAsIm5vIHBvcnQgZGVmaW5lZCJ9LAore0VSUl9SRUFTT04oQklPX1JfTk9fUE9SVF9TUEVDSUZJRUQpICAgICAsIm5vIHBvcnQgc3BlY2lmaWVkIn0sCit7RVJSX1JFQVNPTihCSU9fUl9OT19TVUNIX0ZJTEUpICAgICAgICAgICwibm8gc3VjaCBmaWxlIn0sCit7RVJSX1JFQVNPTihCSU9fUl9OVUxMX1BBUkFNRVRFUikgICAgICAgICwibnVsbCBwYXJhbWV0ZXIifSwKK3tFUlJfUkVBU09OKEJJT19SX1RBR19NSVNNQVRDSCkgICAgICAgICAgLCJ0YWcgbWlzbWF0Y2gifSwKK3tFUlJfUkVBU09OKEJJT19SX1VOQUJMRV9UT19CSU5EX1NPQ0tFVCkgLCJ1bmFibGUgdG8gYmluZCBzb2NrZXQifSwKK3tFUlJfUkVBU09OKEJJT19SX1VOQUJMRV9UT19DUkVBVEVfU09DS0VUKSwidW5hYmxlIHRvIGNyZWF0ZSBzb2NrZXQifSwKK3tFUlJfUkVBU09OKEJJT19SX1VOQUJMRV9UT19MSVNURU5fU09DS0VUKSwidW5hYmxlIHRvIGxpc3RlbiBzb2NrZXQifSwKK3tFUlJfUkVBU09OKEJJT19SX1VOSU5JVElBTElaRUQpICAgICAgICAgLCJ1bmluaXRpYWxpemVkIn0sCit7RVJSX1JFQVNPTihCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QpICAgICwidW5zdXBwb3J0ZWQgbWV0aG9kIn0sCit7RVJSX1JFQVNPTihCSU9fUl9XUklURV9UT19SRUFEX09OTFlfQklPKSwid3JpdGUgdG8gcmVhZCBvbmx5IEJJTyJ9LAore0VSUl9SRUFTT04oQklPX1JfV1NBU1RBUlRVUCkgICAgICAgICAgICAsIldTQVN0YXJ0dXAifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfQklPX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKEJJT19zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxCSU9fc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxCSU9fc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpb19sY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYmlvX2xjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZjdlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpb19sY2wuaApAQCAtMCwwICsxLDM2IEBACisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2lmIEJJT19GTEFHU19VUExJTks9PTAKKy8qIFNob3J0Y3V0IFVQTElOSyBjYWxscyBvbiBtb3N0IHBsYXRmb3Jtcy4uLiAqLworI2RlZmluZQlVUF9zdGRpbglzdGRpbgorI2RlZmluZQlVUF9zdGRvdXQJc3Rkb3V0CisjZGVmaW5lCVVQX3N0ZGVycglzdGRlcnIKKyNkZWZpbmUJVVBfZnByaW50ZglmcHJpbnRmCisjZGVmaW5lCVVQX2ZnZXRzCWZnZXRzCisjZGVmaW5lCVVQX2ZyZWFkCWZyZWFkCisjZGVmaW5lCVVQX2Z3cml0ZQlmd3JpdGUKKyN1bmRlZglVUF9mc2V0bW9kCisjZGVmaW5lCVVQX2Zlb2YJCWZlb2YKKyNkZWZpbmUJVVBfZmNsb3NlCWZjbG9zZQorCisjZGVmaW5lCVVQX2ZvcGVuCWZvcGVuCisjZGVmaW5lCVVQX2ZzZWVrCWZzZWVrCisjZGVmaW5lCVVQX2Z0ZWxsCWZ0ZWxsCisjZGVmaW5lCVVQX2ZmbHVzaAlmZmx1c2gKKyNkZWZpbmUJVVBfZmVycm9yCWZlcnJvcgorI2lmZGVmIF9XSU4zMgorI2RlZmluZQlVUF9maWxlbm8JX2ZpbGVubworI2RlZmluZQlVUF9vcGVuCQlfb3BlbgorI2RlZmluZQlVUF9yZWFkCQlfcmVhZAorI2RlZmluZQlVUF93cml0ZQlfd3JpdGUKKyNkZWZpbmUJVVBfbHNlZWsJX2xzZWVrCisjZGVmaW5lCVVQX2Nsb3NlCV9jbG9zZQorI2Vsc2UKKyNkZWZpbmUJVVBfZmlsZW5vCWZpbGVubworI2RlZmluZQlVUF9vcGVuCQlvcGVuCisjZGVmaW5lCVVQX3JlYWQJCXJlYWQKKyNkZWZpbmUJVVBfd3JpdGUJd3JpdGUKKyNkZWZpbmUJVVBfbHNlZWsJbHNlZWsKKyNkZWZpbmUJVVBfY2xvc2UJY2xvc2UKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpb19saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYmlvX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjRkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jpb19saWIuYwpAQCAtMCwwICsxLDYwMiBAQAorLyogY3J5cHRvL2Jpby9iaW9fbGliLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisKK0JJTyAqQklPX25ldyhCSU9fTUVUSE9EICptZXRob2QpCisJeworCUJJTyAqcmV0PU5VTEw7CisKKwlyZXQ9KEJJTyAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU8pKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19ORVcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlpZiAoIUJJT19zZXQocmV0LG1ldGhvZCkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldD1OVUxMOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgQklPX3NldChCSU8gKmJpbywgQklPX01FVEhPRCAqbWV0aG9kKQorCXsKKwliaW8tPm1ldGhvZD1tZXRob2Q7CisJYmlvLT5jYWxsYmFjaz1OVUxMOworCWJpby0+Y2JfYXJnPU5VTEw7CisJYmlvLT5pbml0PTA7CisJYmlvLT5zaHV0ZG93bj0xOworCWJpby0+ZmxhZ3M9MDsKKwliaW8tPnJldHJ5X3JlYXNvbj0wOworCWJpby0+bnVtPTA7CisJYmlvLT5wdHI9TlVMTDsKKwliaW8tPnByZXZfYmlvPU5VTEw7CisJYmlvLT5uZXh0X2Jpbz1OVUxMOworCWJpby0+cmVmZXJlbmNlcz0xOworCWJpby0+bnVtX3JlYWQ9MEw7CisJYmlvLT5udW1fd3JpdGU9MEw7CisJQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9CSU8sIGJpbywgJmJpby0+ZXhfZGF0YSk7CisJaWYgKG1ldGhvZC0+Y3JlYXRlICE9IE5VTEwpCisJCWlmICghbWV0aG9kLT5jcmVhdGUoYmlvKSkKKwkJCXsKKwkJCUNSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX0JJTywgYmlvLAorCQkJCQkmYmlvLT5leF9kYXRhKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKwlyZXR1cm4oMSk7CisJfQorCitpbnQgQklPX2ZyZWUoQklPICphKQorCXsKKwlpbnQgcmV0PTAsaTsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKworCWk9Q1JZUFRPX2FkZCgmYS0+cmVmZXJlbmNlcywtMSxDUllQVE9fTE9DS19CSU8pOworI2lmZGVmIFJFRl9QUklOVAorCVJFRl9QUklOVCgiQklPIixhKTsKKyNlbmRpZgorCWlmIChpID4gMCkgcmV0dXJuKDEpOworI2lmZGVmIFJFRl9DSEVDSworCWlmIChpIDwgMCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiQklPX2ZyZWUsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQlhYm9ydCgpOworCQl9CisjZW5kaWYKKwlpZiAoKGEtPmNhbGxiYWNrICE9IE5VTEwpICYmCisJCSgoaT0oaW50KWEtPmNhbGxiYWNrKGEsQklPX0NCX0ZSRUUsTlVMTCwwLDBMLDFMKSkgPD0gMCkpCisJCQlyZXR1cm4oaSk7CisKKwlDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9CSU8sIGEsICZhLT5leF9kYXRhKTsKKworCWlmICgoYS0+bWV0aG9kID09IE5VTEwpIHx8IChhLT5tZXRob2QtPmRlc3Ryb3kgPT0gTlVMTCkpIHJldHVybigxKTsKKwlyZXQ9YS0+bWV0aG9kLT5kZXN0cm95KGEpOworCU9QRU5TU0xfZnJlZShhKTsKKwlyZXR1cm4oMSk7CisJfQorCit2b2lkIEJJT192ZnJlZShCSU8gKmEpCisgICAgeyBCSU9fZnJlZShhKTsgfQorCit2b2lkIEJJT19jbGVhcl9mbGFncyhCSU8gKmIsIGludCBmbGFncykKKwl7CisJYi0+ZmxhZ3MgJj0gfmZsYWdzOworCX0KKworaW50CUJJT190ZXN0X2ZsYWdzKGNvbnN0IEJJTyAqYiwgaW50IGZsYWdzKQorCXsKKwlyZXR1cm4gKGItPmZsYWdzICYgZmxhZ3MpOworCX0KKwordm9pZAlCSU9fc2V0X2ZsYWdzKEJJTyAqYiwgaW50IGZsYWdzKQorCXsKKwliLT5mbGFncyB8PSBmbGFnczsKKwl9CisKK2xvbmcgKCpCSU9fZ2V0X2NhbGxiYWNrKGNvbnN0IEJJTyAqYikpKHN0cnVjdCBiaW9fc3QgKixpbnQsY29uc3QgY2hhciAqLGludCwgbG9uZyxsb25nKQorCXsKKwlyZXR1cm4gYi0+Y2FsbGJhY2s7CisJfQorCit2b2lkIEJJT19zZXRfY2FsbGJhY2soQklPICpiLCBsb25nICgqY2IpKHN0cnVjdCBiaW9fc3QgKixpbnQsY29uc3QgY2hhciAqLGludCwgbG9uZyxsb25nKSkKKwl7CisJYi0+Y2FsbGJhY2sgPSBjYjsKKwl9CisKK3ZvaWQgQklPX3NldF9jYWxsYmFja19hcmcoQklPICpiLCBjaGFyICphcmcpCisJeworCWItPmNiX2FyZyA9IGFyZzsKKwl9CisKK2NoYXIgKiBCSU9fZ2V0X2NhbGxiYWNrX2FyZyhjb25zdCBCSU8gKmIpCisJeworCXJldHVybiBiLT5jYl9hcmc7CisJfQorCitjb25zdCBjaGFyICogQklPX21ldGhvZF9uYW1lKGNvbnN0IEJJTyAqYikKKwl7CisJcmV0dXJuIGItPm1ldGhvZC0+bmFtZTsKKwl9CisKK2ludCBCSU9fbWV0aG9kX3R5cGUoY29uc3QgQklPICpiKQorCXsKKwlyZXR1cm4gYi0+bWV0aG9kLT50eXBlOworCX0KKworCitpbnQgQklPX3JlYWQoQklPICpiLCB2b2lkICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgaTsKKwlsb25nICgqY2IpKEJJTyAqLGludCxjb25zdCBjaGFyICosaW50LGxvbmcsbG9uZyk7CisKKwlpZiAoKGIgPT0gTlVMTCkgfHwgKGItPm1ldGhvZCA9PSBOVUxMKSB8fCAoYi0+bWV0aG9kLT5icmVhZCA9PSBOVUxMKSkKKwkJeworCQlCSU9lcnIoQklPX0ZfQklPX1JFQUQsQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKwkJcmV0dXJuKC0yKTsKKwkJfQorCisJY2I9Yi0+Y2FsbGJhY2s7CisJaWYgKChjYiAhPSBOVUxMKSAmJgorCQkoKGk9KGludCljYihiLEJJT19DQl9SRUFELG91dCxvdXRsLDBMLDFMKSkgPD0gMCkpCisJCQlyZXR1cm4oaSk7CisKKwlpZiAoIWItPmluaXQpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19SRUFELEJJT19SX1VOSU5JVElBTElaRUQpOworCQlyZXR1cm4oLTIpOworCQl9CisKKwlpPWItPm1ldGhvZC0+YnJlYWQoYixvdXQsb3V0bCk7CisKKwlpZiAoaSA+IDApIGItPm51bV9yZWFkKz0odW5zaWduZWQgbG9uZylpOworCisJaWYgKGNiICE9IE5VTEwpCisJCWk9KGludCljYihiLEJJT19DQl9SRUFEfEJJT19DQl9SRVRVUk4sb3V0LG91dGwsCisJCQkwTCwobG9uZylpKTsKKwlyZXR1cm4oaSk7CisJfQorCitpbnQgQklPX3dyaXRlKEJJTyAqYiwgY29uc3Qgdm9pZCAqaW4sIGludCBpbmwpCisJeworCWludCBpOworCWxvbmcgKCpjYikoQklPICosaW50LGNvbnN0IGNoYXIgKixpbnQsbG9uZyxsb25nKTsKKworCWlmIChiID09IE5VTEwpCisJCXJldHVybigwKTsKKworCWNiPWItPmNhbGxiYWNrOworCWlmICgoYi0+bWV0aG9kID09IE5VTEwpIHx8IChiLT5tZXRob2QtPmJ3cml0ZSA9PSBOVUxMKSkKKwkJeworCQlCSU9lcnIoQklPX0ZfQklPX1dSSVRFLEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisJCXJldHVybigtMik7CisJCX0KKworCWlmICgoY2IgIT0gTlVMTCkgJiYKKwkJKChpPShpbnQpY2IoYixCSU9fQ0JfV1JJVEUsaW4saW5sLDBMLDFMKSkgPD0gMCkpCisJCQlyZXR1cm4oaSk7CisKKwlpZiAoIWItPmluaXQpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19XUklURSxCSU9fUl9VTklOSVRJQUxJWkVEKTsKKwkJcmV0dXJuKC0yKTsKKwkJfQorCisJaT1iLT5tZXRob2QtPmJ3cml0ZShiLGluLGlubCk7CisKKwlpZiAoaSA+IDApIGItPm51bV93cml0ZSs9KHVuc2lnbmVkIGxvbmcpaTsKKworCWlmIChjYiAhPSBOVUxMKQorCQlpPShpbnQpY2IoYixCSU9fQ0JfV1JJVEV8QklPX0NCX1JFVFVSTixpbixpbmwsCisJCQkwTCwobG9uZylpKTsKKwlyZXR1cm4oaSk7CisJfQorCitpbnQgQklPX3B1dHMoQklPICpiLCBjb25zdCBjaGFyICppbikKKwl7CisJaW50IGk7CisJbG9uZyAoKmNiKShCSU8gKixpbnQsY29uc3QgY2hhciAqLGludCxsb25nLGxvbmcpOworCisJaWYgKChiID09IE5VTEwpIHx8IChiLT5tZXRob2QgPT0gTlVMTCkgfHwgKGItPm1ldGhvZC0+YnB1dHMgPT0gTlVMTCkpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19QVVRTLEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisJCXJldHVybigtMik7CisJCX0KKworCWNiPWItPmNhbGxiYWNrOworCisJaWYgKChjYiAhPSBOVUxMKSAmJgorCQkoKGk9KGludCljYihiLEJJT19DQl9QVVRTLGluLDAsMEwsMUwpKSA8PSAwKSkKKwkJCXJldHVybihpKTsKKworCWlmICghYi0+aW5pdCkKKwkJeworCQlCSU9lcnIoQklPX0ZfQklPX1BVVFMsQklPX1JfVU5JTklUSUFMSVpFRCk7CisJCXJldHVybigtMik7CisJCX0KKworCWk9Yi0+bWV0aG9kLT5icHV0cyhiLGluKTsKKworCWlmIChpID4gMCkgYi0+bnVtX3dyaXRlKz0odW5zaWduZWQgbG9uZylpOworCisJaWYgKGNiICE9IE5VTEwpCisJCWk9KGludCljYihiLEJJT19DQl9QVVRTfEJJT19DQl9SRVRVUk4saW4sMCwKKwkJCTBMLChsb25nKWkpOworCXJldHVybihpKTsKKwl9CisKK2ludCBCSU9fZ2V0cyhCSU8gKmIsIGNoYXIgKmluLCBpbnQgaW5sKQorCXsKKwlpbnQgaTsKKwlsb25nICgqY2IpKEJJTyAqLGludCxjb25zdCBjaGFyICosaW50LGxvbmcsbG9uZyk7CisKKwlpZiAoKGIgPT0gTlVMTCkgfHwgKGItPm1ldGhvZCA9PSBOVUxMKSB8fCAoYi0+bWV0aG9kLT5iZ2V0cyA9PSBOVUxMKSkKKwkJeworCQlCSU9lcnIoQklPX0ZfQklPX0dFVFMsQklPX1JfVU5TVVBQT1JURURfTUVUSE9EKTsKKwkJcmV0dXJuKC0yKTsKKwkJfQorCisJY2I9Yi0+Y2FsbGJhY2s7CisKKwlpZiAoKGNiICE9IE5VTEwpICYmCisJCSgoaT0oaW50KWNiKGIsQklPX0NCX0dFVFMsaW4saW5sLDBMLDFMKSkgPD0gMCkpCisJCQlyZXR1cm4oaSk7CisKKwlpZiAoIWItPmluaXQpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19HRVRTLEJJT19SX1VOSU5JVElBTElaRUQpOworCQlyZXR1cm4oLTIpOworCQl9CisKKwlpPWItPm1ldGhvZC0+YmdldHMoYixpbixpbmwpOworCisJaWYgKGNiICE9IE5VTEwpCisJCWk9KGludCljYihiLEJJT19DQl9HRVRTfEJJT19DQl9SRVRVUk4saW4saW5sLAorCQkJMEwsKGxvbmcpaSk7CisJcmV0dXJuKGkpOworCX0KKworaW50IEJJT19pbmRlbnQoQklPICpiLGludCBpbmRlbnQsaW50IG1heCkKKwl7CisJaWYoaW5kZW50IDwgMCkKKwkJaW5kZW50PTA7CisJaWYoaW5kZW50ID4gbWF4KQorCQlpbmRlbnQ9bWF4OworCXdoaWxlKGluZGVudC0tKQorCQlpZihCSU9fcHV0cyhiLCIgIikgIT0gMSkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworCX0KKworbG9uZyBCSU9faW50X2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIGxhcmcsIGludCBpYXJnKQorCXsKKwlpbnQgaTsKKworCWk9aWFyZzsKKwlyZXR1cm4oQklPX2N0cmwoYixjbWQsbGFyZywoY2hhciAqKSZpKSk7CisJfQorCitjaGFyICpCSU9fcHRyX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIGxhcmcpCisJeworCWNoYXIgKnA9TlVMTDsKKworCWlmIChCSU9fY3RybChiLGNtZCxsYXJnLChjaGFyICopJnApIDw9IDApCisJCXJldHVybihOVUxMKTsKKwllbHNlCisJCXJldHVybihwKTsKKwl9CisKK2xvbmcgQklPX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpCisJeworCWxvbmcgcmV0OworCWxvbmcgKCpjYikoQklPICosaW50LGNvbnN0IGNoYXIgKixpbnQsbG9uZyxsb25nKTsKKworCWlmIChiID09IE5VTEwpIHJldHVybigwKTsKKworCWlmICgoYi0+bWV0aG9kID09IE5VTEwpIHx8IChiLT5tZXRob2QtPmN0cmwgPT0gTlVMTCkpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19DVFJMLEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisJCXJldHVybigtMik7CisJCX0KKworCWNiPWItPmNhbGxiYWNrOworCisJaWYgKChjYiAhPSBOVUxMKSAmJgorCQkoKHJldD1jYihiLEJJT19DQl9DVFJMLHBhcmcsY21kLGxhcmcsMUwpKSA8PSAwKSkKKwkJcmV0dXJuKHJldCk7CisKKwlyZXQ9Yi0+bWV0aG9kLT5jdHJsKGIsY21kLGxhcmcscGFyZyk7CisKKwlpZiAoY2IgIT0gTlVMTCkKKwkJcmV0PWNiKGIsQklPX0NCX0NUUkx8QklPX0NCX1JFVFVSTixwYXJnLGNtZCwKKwkJCWxhcmcscmV0KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2xvbmcgQklPX2NhbGxiYWNrX2N0cmwoQklPICpiLCBpbnQgY21kLCB2b2lkICgqZnApKHN0cnVjdCBiaW9fc3QgKiwgaW50LCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZykpCisJeworCWxvbmcgcmV0OworCWxvbmcgKCpjYikoQklPICosaW50LGNvbnN0IGNoYXIgKixpbnQsbG9uZyxsb25nKTsKKworCWlmIChiID09IE5VTEwpIHJldHVybigwKTsKKworCWlmICgoYi0+bWV0aG9kID09IE5VTEwpIHx8IChiLT5tZXRob2QtPmNhbGxiYWNrX2N0cmwgPT0gTlVMTCkpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19DQUxMQkFDS19DVFJMLEJJT19SX1VOU1VQUE9SVEVEX01FVEhPRCk7CisJCXJldHVybigtMik7CisJCX0KKworCWNiPWItPmNhbGxiYWNrOworCisJaWYgKChjYiAhPSBOVUxMKSAmJgorCQkoKHJldD1jYihiLEJJT19DQl9DVFJMLCh2b2lkICopJmZwLGNtZCwwLDFMKSkgPD0gMCkpCisJCXJldHVybihyZXQpOworCisJcmV0PWItPm1ldGhvZC0+Y2FsbGJhY2tfY3RybChiLGNtZCxmcCk7CisKKwlpZiAoY2IgIT0gTlVMTCkKKwkJcmV0PWNiKGIsQklPX0NCX0NUUkx8QklPX0NCX1JFVFVSTiwodm9pZCAqKSZmcCxjbWQsCisJCQkwLHJldCk7CisJcmV0dXJuKHJldCk7CisJfQorCisvKiBJdCBpcyB1bmZvcnR1bmF0ZSB0byBkdXBsaWNhdGUgaW4gZnVuY3Rpb25zIHdoYXQgdGhlIEJJT18odylwZW5kaW5nIG1hY3JvcworICogZG87IGJ1dCB0aG9zZSBtYWNyb3MgaGF2ZSBpbmFwcHJvcHJpYXRlIHJldHVybiB0eXBlLCBhbmQgZm9yIGludGVyZmFjaW5nCisgKiBmcm9tIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcywgQyBtYWNyb3MgYXJlbid0IG11Y2ggb2YgYSBoZWxwIGFueXdheS4gKi8KK3NpemVfdCBCSU9fY3RybF9wZW5kaW5nKEJJTyAqYmlvKQorCXsKKwlyZXR1cm4gQklPX2N0cmwoYmlvLCBCSU9fQ1RSTF9QRU5ESU5HLCAwLCBOVUxMKTsKKwl9CisKK3NpemVfdCBCSU9fY3RybF93cGVuZGluZyhCSU8gKmJpbykKKwl7CisJcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NUUkxfV1BFTkRJTkcsIDAsIE5VTEwpOworCX0KKworCisvKiBwdXQgdGhlICdiaW8nIG9uIHRoZSBlbmQgb2YgYidzIGxpc3Qgb2Ygb3BlcmF0b3JzICovCitCSU8gKkJJT19wdXNoKEJJTyAqYiwgQklPICpiaW8pCisJeworCUJJTyAqbGI7CisKKwlpZiAoYiA9PSBOVUxMKSByZXR1cm4oYmlvKTsKKwlsYj1iOworCXdoaWxlIChsYi0+bmV4dF9iaW8gIT0gTlVMTCkKKwkJbGI9bGItPm5leHRfYmlvOworCWxiLT5uZXh0X2Jpbz1iaW87CisJaWYgKGJpbyAhPSBOVUxMKQorCQliaW8tPnByZXZfYmlvPWxiOworCS8qIGNhbGxlZCB0byBkbyBpbnRlcm5hbCBwcm9jZXNzaW5nICovCisJQklPX2N0cmwoYixCSU9fQ1RSTF9QVVNILDAsbGIpOworCXJldHVybihiKTsKKwl9CisKKy8qIFJlbW92ZSB0aGUgZmlyc3QgYW5kIHJldHVybiB0aGUgcmVzdCAqLworQklPICpCSU9fcG9wKEJJTyAqYikKKwl7CisJQklPICpyZXQ7CisKKwlpZiAoYiA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJcmV0PWItPm5leHRfYmlvOworCisJQklPX2N0cmwoYixCSU9fQ1RSTF9QT1AsMCxiKTsKKworCWlmIChiLT5wcmV2X2JpbyAhPSBOVUxMKQorCQliLT5wcmV2X2Jpby0+bmV4dF9iaW89Yi0+bmV4dF9iaW87CisJaWYgKGItPm5leHRfYmlvICE9IE5VTEwpCisJCWItPm5leHRfYmlvLT5wcmV2X2Jpbz1iLT5wcmV2X2JpbzsKKworCWItPm5leHRfYmlvPU5VTEw7CisJYi0+cHJldl9iaW89TlVMTDsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK0JJTyAqQklPX2dldF9yZXRyeV9CSU8oQklPICpiaW8sIGludCAqcmVhc29uKQorCXsKKwlCSU8gKmIsKmxhc3Q7CisKKwliPWxhc3Q9YmlvOworCWZvciAoOzspCisJCXsKKwkJaWYgKCFCSU9fc2hvdWxkX3JldHJ5KGIpKSBicmVhazsKKwkJbGFzdD1iOworCQliPWItPm5leHRfYmlvOworCQlpZiAoYiA9PSBOVUxMKSBicmVhazsKKwkJfQorCWlmIChyZWFzb24gIT0gTlVMTCkgKnJlYXNvbj1sYXN0LT5yZXRyeV9yZWFzb247CisJcmV0dXJuKGxhc3QpOworCX0KKworaW50IEJJT19nZXRfcmV0cnlfcmVhc29uKEJJTyAqYmlvKQorCXsKKwlyZXR1cm4oYmlvLT5yZXRyeV9yZWFzb24pOworCX0KKworQklPICpCSU9fZmluZF90eXBlKEJJTyAqYmlvLCBpbnQgdHlwZSkKKwl7CisJaW50IG10LG1hc2s7CisKKwlpZighYmlvKSByZXR1cm4gTlVMTDsKKwltYXNrPXR5cGUmMHhmZjsKKwlkbwl7CisJCWlmIChiaW8tPm1ldGhvZCAhPSBOVUxMKQorCQkJeworCQkJbXQ9YmlvLT5tZXRob2QtPnR5cGU7CisKKwkJCWlmICghbWFzaykKKwkJCQl7CisJCQkJaWYgKG10ICYgdHlwZSkgcmV0dXJuKGJpbyk7CisJCQkJfQorCQkJZWxzZSBpZiAobXQgPT0gdHlwZSkKKwkJCQlyZXR1cm4oYmlvKTsKKwkJCX0KKwkJYmlvPWJpby0+bmV4dF9iaW87CisJCX0gd2hpbGUgKGJpbyAhPSBOVUxMKTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitCSU8gKkJJT19uZXh0KEJJTyAqYikKKwl7CisJaWYoIWIpIHJldHVybiBOVUxMOworCXJldHVybiBiLT5uZXh0X2JpbzsKKwl9CisKK3ZvaWQgQklPX2ZyZWVfYWxsKEJJTyAqYmlvKQorCXsKKwlCSU8gKmI7CisJaW50IHJlZjsKKworCXdoaWxlIChiaW8gIT0gTlVMTCkKKwkJeworCQliPWJpbzsKKwkJcmVmPWItPnJlZmVyZW5jZXM7CisJCWJpbz1iaW8tPm5leHRfYmlvOworCQlCSU9fZnJlZShiKTsKKwkJLyogU2luY2UgcmVmIGNvdW50ID4gMSwgZG9uJ3QgZnJlZSBhbnlvbmUgZWxzZS4gKi8KKwkJaWYgKHJlZiA+IDEpIGJyZWFrOworCQl9CisJfQorCitCSU8gKkJJT19kdXBfY2hhaW4oQklPICppbikKKwl7CisJQklPICpyZXQ9TlVMTCwqZW9jPU5VTEwsKmJpbywqbmV3OworCisJZm9yIChiaW89aW47IGJpbyAhPSBOVUxMOyBiaW89YmlvLT5uZXh0X2JpbykKKwkJeworCQlpZiAoKG5ldz1CSU9fbmV3KGJpby0+bWV0aG9kKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCW5ldy0+Y2FsbGJhY2s9YmlvLT5jYWxsYmFjazsKKwkJbmV3LT5jYl9hcmc9YmlvLT5jYl9hcmc7CisJCW5ldy0+aW5pdD1iaW8tPmluaXQ7CisJCW5ldy0+c2h1dGRvd249YmlvLT5zaHV0ZG93bjsKKwkJbmV3LT5mbGFncz1iaW8tPmZsYWdzOworCisJCS8qIFRoaXMgd2lsbCBsZXQgU1NMX3Nfc29jaygpIHdvcmsgd2l0aCBzdGRpbi9zdGRvdXQgKi8KKwkJbmV3LT5udW09YmlvLT5udW07CisKKwkJaWYgKCFCSU9fZHVwX3N0YXRlKGJpbywoY2hhciAqKW5ldykpCisJCQl7CisJCQlCSU9fZnJlZShuZXcpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJLyogY29weSBhcHAgZGF0YSAqLworCQlpZiAoIUNSWVBUT19kdXBfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfQklPLCAmbmV3LT5leF9kYXRhLAorCQkJCQkmYmlvLT5leF9kYXRhKSkKKwkJCWdvdG8gZXJyOworCisJCWlmIChyZXQgPT0gTlVMTCkKKwkJCXsKKwkJCWVvYz1uZXc7CisJCQlyZXQ9ZW9jOworCQkJfQorCQllbHNlCisJCQl7CisJCQlCSU9fcHVzaChlb2MsbmV3KTsKKwkJCWVvYz1uZXc7CisJCQl9CisJCX0KKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAocmV0ICE9IE5VTEwpCisJCUJJT19mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOwkKKwl9CisKK3ZvaWQgQklPX2NvcHlfbmV4dF9yZXRyeShCSU8gKmIpCisJeworCUJJT19zZXRfZmxhZ3MoYixCSU9fZ2V0X3JldHJ5X2ZsYWdzKGItPm5leHRfYmlvKSk7CisJYi0+cmV0cnlfcmVhc29uPWItPm5leHRfYmlvLT5yZXRyeV9yZWFzb247CisJfQorCitpbnQgQklPX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKQorCXsKKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX0JJTywgYXJnbCwgYXJncCwKKwkJCQluZXdfZnVuYywgZHVwX2Z1bmMsIGZyZWVfZnVuYyk7CisJfQorCitpbnQgQklPX3NldF9leF9kYXRhKEJJTyAqYmlvLCBpbnQgaWR4LCB2b2lkICpkYXRhKQorCXsKKwlyZXR1cm4oQ1JZUFRPX3NldF9leF9kYXRhKCYoYmlvLT5leF9kYXRhKSxpZHgsZGF0YSkpOworCX0KKwordm9pZCAqQklPX2dldF9leF9kYXRhKEJJTyAqYmlvLCBpbnQgaWR4KQorCXsKKwlyZXR1cm4oQ1JZUFRPX2dldF9leF9kYXRhKCYoYmlvLT5leF9kYXRhKSxpZHgpKTsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgQklPX251bWJlcl9yZWFkKEJJTyAqYmlvKQoreworCWlmKGJpbykgcmV0dXJuIGJpby0+bnVtX3JlYWQ7CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgQklPX251bWJlcl93cml0dGVuKEJJTyAqYmlvKQoreworCWlmKGJpbykgcmV0dXJuIGJpby0+bnVtX3dyaXRlOworCXJldHVybiAwOworfQorCitJTVBMRU1FTlRfU1RBQ0tfT0YoQklPKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfYWNwdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfYWNwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNmY3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19hY3B0LmMKQEAgLTAsMCArMSw0NzkgQEAKKy8qIGNyeXB0by9iaW8vYnNzX2FjcHQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2RlZmluZSBVU0VfU09DS0VUUworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2lmbmRlZiBPUEVOU1NMX05PX1NPQ0sKKworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjE2CisjZGVmaW5lIFNPQ0tFVF9QUk9UT0NPTCAwIC8qIG1vcmUgbWljcm9zb2Z0IHN0dXBpZGl0eSAqLworI2Vsc2UKKyNkZWZpbmUgU09DS0VUX1BST1RPQ09MIElQUFJPVE9fVENQCisjZW5kaWYKKworI2lmIChkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgJiYgX19WTVNfVkVSIDwgNzAwMDAwMDApCisvKiBGSU9OQklPIHVzZWQgYXMgYSBzd2l0Y2ggdG8gZW5hYmxlIGlvY3RsLCBhbmQgdGhhdCBpc24ndCBpbiBWTVMgPCA3LjAgKi8KKyN1bmRlZiBGSU9OQklPCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgYmlvX2FjY2VwdF9zdAorCXsKKwlpbnQgc3RhdGU7CisJY2hhciAqcGFyYW1fYWRkcjsKKworCWludCBhY2NlcHRfc29jazsKKwlpbnQgYWNjZXB0X25iaW87CisKKwljaGFyICphZGRyOworCWludCBuYmlvOworCS8qIElmIDAsIGl0IG1lYW5zIG5vcm1hbCwgaWYgMSwgZG8gYSBjb25uZWN0IG9uIGJpbmQgZmFpbHVyZSwKKwkgKiBhbmQgaWYgdGhlcmUgaXMgbm8tb25lIGxpc3RlbmluZywgYmluZCB3aXRoIFNPX1JFVVNFQUREUi4KKwkgKiBJZiAyLCBhbHdheXMgdXNlIFNPX1JFVVNFQUREUi4gKi8KKwlpbnQgYmluZF9tb2RlOworCUJJTyAqYmlvX2NoYWluOworCX0gQklPX0FDQ0VQVDsKKworc3RhdGljIGludCBhY3B0X3dyaXRlKEJJTyAqaCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtKTsKK3N0YXRpYyBpbnQgYWNwdF9yZWFkKEJJTyAqaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IGFjcHRfcHV0cyhCSU8gKmgsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgbG9uZyBhY3B0X2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBhY3B0X25ldyhCSU8gKmgpOworc3RhdGljIGludCBhY3B0X2ZyZWUoQklPICpkYXRhKTsKK3N0YXRpYyBpbnQgYWNwdF9zdGF0ZShCSU8gKmIsIEJJT19BQ0NFUFQgKmMpOworc3RhdGljIHZvaWQgYWNwdF9jbG9zZV9zb2NrZXQoQklPICpkYXRhKTsKK3N0YXRpYyBCSU9fQUNDRVBUICpCSU9fQUNDRVBUX25ldyh2b2lkICk7CitzdGF0aWMgdm9pZCBCSU9fQUNDRVBUX2ZyZWUoQklPX0FDQ0VQVCAqYSk7CisKKyNkZWZpbmUgQUNQVF9TX0JFRk9SRQkJCTEKKyNkZWZpbmUgQUNQVF9TX0dFVF9BQ0NFUFRfU09DS0VUCTIKKyNkZWZpbmUgQUNQVF9TX09LCQkJMworCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX2FjY2VwdHA9CisJeworCUJJT19UWVBFX0FDQ0VQVCwKKwkic29ja2V0IGFjY2VwdCIsCisJYWNwdF93cml0ZSwKKwlhY3B0X3JlYWQsCisJYWNwdF9wdXRzLAorCU5VTEwsIC8qIGNvbm5lY3RfZ2V0cywgKi8KKwlhY3B0X2N0cmwsCisJYWNwdF9uZXcsCisJYWNwdF9mcmVlLAorCU5VTEwsCisJfTsKKworQklPX01FVEhPRCAqQklPX3NfYWNjZXB0KHZvaWQpCisJeworCXJldHVybigmbWV0aG9kc19hY2NlcHRwKTsKKwl9CisKK3N0YXRpYyBpbnQgYWNwdF9uZXcoQklPICpiaSkKKwl7CisJQklPX0FDQ0VQVCAqYmE7CisKKwliaS0+aW5pdD0wOworCWJpLT5udW09SU5WQUxJRF9TT0NLRVQ7CisJYmktPmZsYWdzPTA7CisJaWYgKChiYT1CSU9fQUNDRVBUX25ldygpKSA9PSBOVUxMKQorCQlyZXR1cm4oMCk7CisJYmktPnB0cj0oY2hhciAqKWJhOworCWJhLT5zdGF0ZT1BQ1BUX1NfQkVGT1JFOworCWJpLT5zaHV0ZG93bj0xOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBCSU9fQUNDRVBUICpCSU9fQUNDRVBUX25ldyh2b2lkKQorCXsKKwlCSU9fQUNDRVBUICpyZXQ7CisKKwlpZiAoKHJldD0oQklPX0FDQ0VQVCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU9fQUNDRVBUKSkpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworCW1lbXNldChyZXQsMCxzaXplb2YoQklPX0FDQ0VQVCkpOworCXJldC0+YWNjZXB0X3NvY2s9SU5WQUxJRF9TT0NLRVQ7CisJcmV0LT5iaW5kX21vZGU9QklPX0JJTkRfTk9STUFMOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIHZvaWQgQklPX0FDQ0VQVF9mcmVlKEJJT19BQ0NFUFQgKmEpCisJeworCWlmKGEgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCisJaWYgKGEtPnBhcmFtX2FkZHIgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGEtPnBhcmFtX2FkZHIpOworCWlmIChhLT5hZGRyICE9IE5VTEwpIE9QRU5TU0xfZnJlZShhLT5hZGRyKTsKKwlpZiAoYS0+YmlvX2NoYWluICE9IE5VTEwpIEJJT19mcmVlKGEtPmJpb19jaGFpbik7CisJT1BFTlNTTF9mcmVlKGEpOworCX0KKworc3RhdGljIHZvaWQgYWNwdF9jbG9zZV9zb2NrZXQoQklPICpiaW8pCisJeworCUJJT19BQ0NFUFQgKmM7CisKKwljPShCSU9fQUNDRVBUICopYmlvLT5wdHI7CisJaWYgKGMtPmFjY2VwdF9zb2NrICE9IElOVkFMSURfU09DS0VUKQorCQl7CisJCXNodXRkb3duKGMtPmFjY2VwdF9zb2NrLDIpOworCQljbG9zZXNvY2tldChjLT5hY2NlcHRfc29jayk7CisJCWMtPmFjY2VwdF9zb2NrPUlOVkFMSURfU09DS0VUOworCQliaW8tPm51bT1JTlZBTElEX1NPQ0tFVDsKKwkJfQorCX0KKworc3RhdGljIGludCBhY3B0X2ZyZWUoQklPICphKQorCXsKKwlCSU9fQUNDRVBUICpkYXRhOworCisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCWRhdGE9KEJJT19BQ0NFUFQgKilhLT5wdHI7CisJIAorCWlmIChhLT5zaHV0ZG93bikKKwkJeworCQlhY3B0X2Nsb3NlX3NvY2tldChhKTsKKwkJQklPX0FDQ0VQVF9mcmVlKGRhdGEpOworCQlhLT5wdHI9TlVMTDsKKwkJYS0+ZmxhZ3M9MDsKKwkJYS0+aW5pdD0wOworCQl9CisJcmV0dXJuKDEpOworCX0KKwkKK3N0YXRpYyBpbnQgYWNwdF9zdGF0ZShCSU8gKmIsIEJJT19BQ0NFUFQgKmMpCisJeworCUJJTyAqYmlvPU5VTEwsKmRiaW87CisJaW50IHM9IC0xOworCWludCBpOworCithZ2FpbjoKKwlzd2l0Y2ggKGMtPnN0YXRlKQorCQl7CisJY2FzZSBBQ1BUX1NfQkVGT1JFOgorCQlpZiAoYy0+cGFyYW1fYWRkciA9PSBOVUxMKQorCQkJeworCQkJQklPZXJyKEJJT19GX0FDUFRfU1RBVEUsQklPX1JfTk9fQUNDRVBUX1BPUlRfU1BFQ0lGSUVEKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCXM9QklPX2dldF9hY2NlcHRfc29ja2V0KGMtPnBhcmFtX2FkZHIsYy0+YmluZF9tb2RlKTsKKwkJaWYgKHMgPT0gSU5WQUxJRF9TT0NLRVQpCisJCQlyZXR1cm4oLTEpOworCisJCWlmIChjLT5hY2NlcHRfbmJpbykKKwkJCXsKKwkJCWlmICghQklPX3NvY2tldF9uYmlvKHMsMSkpCisJCQkJeworCQkJCWNsb3Nlc29ja2V0KHMpOworCQkJCUJJT2VycihCSU9fRl9BQ1BUX1NUQVRFLEJJT19SX0VSUk9SX1NFVFRJTkdfTkJJT19PTl9BQ0NFUFRfU09DS0VUKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCX0KKwkJYy0+YWNjZXB0X3NvY2s9czsKKwkJYi0+bnVtPXM7CisJCWMtPnN0YXRlPUFDUFRfU19HRVRfQUNDRVBUX1NPQ0tFVDsKKwkJcmV0dXJuKDEpOworCQkvKiBicmVhazsgKi8KKwljYXNlIEFDUFRfU19HRVRfQUNDRVBUX1NPQ0tFVDoKKwkJaWYgKGItPm5leHRfYmlvICE9IE5VTEwpCisJCQl7CisJCQljLT5zdGF0ZT1BQ1BUX1NfT0s7CisJCQlnb3RvIGFnYWluOworCQkJfQorCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCWItPnJldHJ5X3JlYXNvbj0wOworCQlpPUJJT19hY2NlcHQoYy0+YWNjZXB0X3NvY2ssJihjLT5hZGRyKSk7CisKKwkJLyogLTIgcmV0dXJuIG1lYW5zIHdlIHNob3VsZCByZXRyeSAqLworCQlpZihpID09IC0yKQorCQkJeworCQkJQklPX3NldF9yZXRyeV9zcGVjaWFsKGIpOworCQkJYi0+cmV0cnlfcmVhc29uPUJJT19SUl9BQ0NFUFQ7CisJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJaWYgKGkgPCAwKSByZXR1cm4oaSk7CisKKwkJYmlvPUJJT19uZXdfc29ja2V0KGksQklPX0NMT1NFKTsKKwkJaWYgKGJpbyA9PSBOVUxMKSBnb3RvIGVycjsKKworCQlCSU9fc2V0X2NhbGxiYWNrKGJpbyxCSU9fZ2V0X2NhbGxiYWNrKGIpKTsKKwkJQklPX3NldF9jYWxsYmFja19hcmcoYmlvLEJJT19nZXRfY2FsbGJhY2tfYXJnKGIpKTsKKworCQlpZiAoYy0+bmJpbykKKwkJCXsKKwkJCWlmICghQklPX3NvY2tldF9uYmlvKGksMSkpCisJCQkJeworCQkJCUJJT2VycihCSU9fRl9BQ1BUX1NUQVRFLEJJT19SX0VSUk9SX1NFVFRJTkdfTkJJT19PTl9BQ0NFUFRFRF9TT0NLRVQpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKworCQkvKiBJZiB0aGUgYWNjZXB0IEJJTyBoYXMgYW4gYmlvX2NoYWluLCB3ZSBkdXAgaXQgYW5kCisJCSAqIHB1dCB0aGUgbmV3IHNvY2tldCBhdCB0aGUgZW5kLiAqLworCQlpZiAoYy0+YmlvX2NoYWluICE9IE5VTEwpCisJCQl7CisJCQlpZiAoKGRiaW89QklPX2R1cF9jaGFpbihjLT5iaW9fY2hhaW4pKSA9PSBOVUxMKQorCQkJCWdvdG8gZXJyOworCQkJaWYgKCFCSU9fcHVzaChkYmlvLGJpbykpIGdvdG8gZXJyOworCQkJYmlvPWRiaW87CisJCQl9CisJCWlmIChCSU9fcHVzaChiLGJpbykgPT0gTlVMTCkgZ290byBlcnI7CisKKwkJYy0+c3RhdGU9QUNQVF9TX09LOworCQlyZXR1cm4oMSk7CitlcnI6CisJCWlmIChiaW8gIT0gTlVMTCkKKwkJCUJJT19mcmVlKGJpbyk7CisJCWVsc2UgaWYgKHMgPj0gMCkKKwkJCWNsb3Nlc29ja2V0KHMpOworCQlyZXR1cm4oMCk7CisJCS8qIGJyZWFrOyAqLworCWNhc2UgQUNQVF9TX09LOgorCQlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkKKwkJCXsKKwkJCWMtPnN0YXRlPUFDUFRfU19HRVRfQUNDRVBUX1NPQ0tFVDsKKwkJCWdvdG8gYWdhaW47CisJCQl9CisJCXJldHVybigxKTsKKwkJLyogYnJlYWs7ICovCisJZGVmYXVsdDoJCisJCXJldHVybigwKTsKKwkJLyogYnJlYWs7ICovCisJCX0KKworCX0KKworc3RhdGljIGludCBhY3B0X3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgcmV0PTA7CisJQklPX0FDQ0VQVCAqZGF0YTsKKworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlkYXRhPShCSU9fQUNDRVBUICopYi0+cHRyOworCisJd2hpbGUgKGItPm5leHRfYmlvID09IE5VTEwpCisJCXsKKwkJcmV0PWFjcHRfc3RhdGUoYixkYXRhKTsKKwkJaWYgKHJldCA8PSAwKSByZXR1cm4ocmV0KTsKKwkJfQorCisJcmV0PUJJT19yZWFkKGItPm5leHRfYmlvLG91dCxvdXRsKTsKKwlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBhY3B0X3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpCisJeworCWludCByZXQ7CisJQklPX0FDQ0VQVCAqZGF0YTsKKworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlkYXRhPShCSU9fQUNDRVBUICopYi0+cHRyOworCisJd2hpbGUgKGItPm5leHRfYmlvID09IE5VTEwpCisJCXsKKwkJcmV0PWFjcHRfc3RhdGUoYixkYXRhKTsKKwkJaWYgKHJldCA8PSAwKSByZXR1cm4ocmV0KTsKKwkJfQorCisJcmV0PUJJT193cml0ZShiLT5uZXh0X2JpbyxpbixpbmwpOworCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgbG9uZyBhY3B0X2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlCSU8gKmRiaW87CisJaW50ICppcDsKKwlsb25nIHJldD0xOworCUJJT19BQ0NFUFQgKmRhdGE7CisJY2hhciAqKnBwOworCisJZGF0YT0oQklPX0FDQ0VQVCAqKWItPnB0cjsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBCSU9fQ1RSTF9SRVNFVDoKKwkJcmV0PTA7CisJCWRhdGEtPnN0YXRlPUFDUFRfU19CRUZPUkU7CisJCWFjcHRfY2xvc2Vfc29ja2V0KGIpOworCQliLT5mbGFncz0wOworCQlicmVhazsKKwljYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6CisJCS8qIHVzZSB0aGlzIG9uZSB0byBzdGFydCB0aGUgY29ubmVjdGlvbiAqLworCQlyZXQ9KGxvbmcpYWNwdF9zdGF0ZShiLGRhdGEpOworCQlicmVhazsKKwljYXNlIEJJT19DX1NFVF9BQ0NFUFQ6CisJCWlmIChwdHIgIT0gTlVMTCkKKwkJCXsKKwkJCWlmIChudW0gPT0gMCkKKwkJCQl7CisJCQkJYi0+aW5pdD0xOworCQkJCWlmIChkYXRhLT5wYXJhbV9hZGRyICE9IE5VTEwpCisJCQkJCU9QRU5TU0xfZnJlZShkYXRhLT5wYXJhbV9hZGRyKTsKKwkJCQlkYXRhLT5wYXJhbV9hZGRyPUJVRl9zdHJkdXAocHRyKTsKKwkJCQl9CisJCQllbHNlIGlmIChudW0gPT0gMSkKKwkJCQl7CisJCQkJZGF0YS0+YWNjZXB0X25iaW89KHB0ciAhPSBOVUxMKTsKKwkJCQl9CisJCQllbHNlIGlmIChudW0gPT0gMikKKwkJCQl7CisJCQkJaWYgKGRhdGEtPmJpb19jaGFpbiAhPSBOVUxMKQorCQkJCQlCSU9fZnJlZShkYXRhLT5iaW9fY2hhaW4pOworCQkJCWRhdGEtPmJpb19jaGFpbj0oQklPICopcHRyOworCQkJCX0KKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19TRVRfTkJJTzoKKwkJZGF0YS0+bmJpbz0oaW50KW51bTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19TRVRfRkQ6CisJCWItPmluaXQ9MTsKKwkJYi0+bnVtPSAqKChpbnQgKilwdHIpOworCQlkYXRhLT5hY2NlcHRfc29jaz1iLT5udW07CisJCWRhdGEtPnN0YXRlPUFDUFRfU19HRVRfQUNDRVBUX1NPQ0tFVDsKKwkJYi0+c2h1dGRvd249KGludCludW07CisJCWItPmluaXQ9MTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19HRVRfRkQ6CisJCWlmIChiLT5pbml0KQorCQkJeworCQkJaXA9KGludCAqKXB0cjsKKwkJCWlmIChpcCAhPSBOVUxMKQorCQkJCSppcD1kYXRhLT5hY2NlcHRfc29jazsKKwkJCXJldD1kYXRhLT5hY2NlcHRfc29jazsKKwkJCX0KKwkJZWxzZQorCQkJcmV0PSAtMTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19HRVRfQUNDRVBUOgorCQlpZiAoYi0+aW5pdCkKKwkJCXsKKwkJCWlmIChwdHIgIT0gTlVMTCkKKwkJCQl7CisJCQkJcHA9KGNoYXIgKiopcHRyOworCQkJCSpwcD1kYXRhLT5wYXJhbV9hZGRyOworCQkJCX0KKwkJCWVsc2UKKwkJCQlyZXQ9IC0xOworCQkJfQorCQllbHNlCisJCQlyZXQ9IC0xOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0dFVF9DTE9TRToKKwkJcmV0PWItPnNodXRkb3duOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKwkJYi0+c2h1dGRvd249KGludCludW07CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfUEVORElORzoKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCQlyZXQ9MDsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19TRVRfQklORF9NT0RFOgorCQlkYXRhLT5iaW5kX21vZGU9KGludCludW07CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX0JJTkRfTU9ERToKKwkJcmV0PShsb25nKWRhdGEtPmJpbmRfbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9EVVA6CisJCWRiaW89KEJJTyAqKXB0cjsKKy8qCQlpZiAoZGF0YS0+cGFyYW1fcG9ydCkgRUFZIEVBWQorCQkJQklPX3NldF9wb3J0KGRiaW8sZGF0YS0+cGFyYW1fcG9ydCk7CisJCWlmIChkYXRhLT5wYXJhbV9ob3N0bmFtZSkKKwkJCUJJT19zZXRfaG9zdG5hbWUoZGJpbyxkYXRhLT5wYXJhbV9ob3N0bmFtZSk7CisJCUJJT19zZXRfbmJpbyhkYmlvLGRhdGEtPm5iaW8pOyAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldD0wOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBhY3B0X3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKQorCXsKKwlpbnQgbixyZXQ7CisKKwluPXN0cmxlbihzdHIpOworCXJldD1hY3B0X3dyaXRlKGJwLHN0cixuKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK0JJTyAqQklPX25ld19hY2NlcHQoY2hhciAqc3RyKQorCXsKKwlCSU8gKnJldDsKKworCXJldD1CSU9fbmV3KEJJT19zX2FjY2VwdCgpKTsKKwlpZiAocmV0ID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlpZiAoQklPX3NldF9hY2NlcHRfcG9ydChyZXQsc3RyKSkKKwkJcmV0dXJuKHJldCk7CisJZWxzZQorCQl7CisJCUJJT19mcmVlKHJldCk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19iaW8uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2Jpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmQ0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19iaW8uYwpAQCAtMCwwICsxLDkyNCBAQAorLyogY3J5cHRvL2Jpby9ic3NfYmlvLmMgIC0qLSBNb2RlOiBDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIFNwZWNpYWwgbWV0aG9kIGZvciBhIEJJTyB3aGVyZSB0aGUgb3RoZXIgZW5kcG9pbnQgaXMgYWxzbyBhIEJJTworICogb2YgdGhpcyBraW5kLCBoYW5kbGVkIGJ5IHRoZSBzYW1lIHRocmVhZCAoaS5lLiB0aGUgInBlZXIiIGlzIGFjdHVhbGx5CisgKiBvdXJzZWx2ZXMsIHdlYXJpbmcgYSBkaWZmZXJlbnQgaGF0KS4KKyAqIFN1Y2ggIkJJTyBwYWlycyIgYXJlIG1haW5seSBmb3IgdXNpbmcgdGhlIFNTTCBsaWJyYXJ5IHdpdGggSS9PIGludGVyZmFjZXMKKyAqIGZvciB3aGljaCBubyBzcGVjaWZpYyBCSU8gbWV0aG9kIGlzIGF2YWlsYWJsZS4KKyAqIFNlZSBzc2wvc3NsdGVzdC5jIGZvciBzb21lIGhpbnRzIG9uIGhvdyB0aGlzIGNhbiBiZSB1c2VkLiAqLworCisvKiBCSU9fREVCVUcgaW1wbGllcyBCSU9fUEFJUl9ERUJVRyAqLworI2lmZGVmIEJJT19ERUJVRworIyBpZm5kZWYgQklPX1BBSVJfREVCVUcKKyMgIGRlZmluZSBCSU9fUEFJUl9ERUJVRworIyBlbmRpZgorI2VuZGlmCisKKy8qIGRpc2FibGUgYXNzZXJ0KCkgdW5sZXNzIEJJT19QQUlSX0RFQlVHIGhhcyBiZWVuIGRlZmluZWQgKi8KKyNpZm5kZWYgQklPX1BBSVJfREVCVUcKKyMgaWZuZGVmIE5ERUJVRworIyAgZGVmaW5lIE5ERUJVRworIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCisjaW5jbHVkZSAiZV9vcy5oIgorCisvKiBWeFdvcmtzIGRlZmluZXMgU1NJWkVfTUFYIHdpdGggYW4gZW1wdHkgdmFsdWUgY2F1c2luZyBjb21waWxlIGVycm9ycyAqLworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfVlhXT1JLUykKKyMgdW5kZWYgU1NJWkVfTUFYCisjZW5kaWYKKyNpZm5kZWYgU1NJWkVfTUFYCisjIGRlZmluZSBTU0laRV9NQVggSU5UX01BWAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYmlvX25ldyhCSU8gKmJpbyk7CitzdGF0aWMgaW50IGJpb19mcmVlKEJJTyAqYmlvKTsKK3N0YXRpYyBpbnQgYmlvX3JlYWQoQklPICpiaW8sIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIGludCBiaW9fd3JpdGUoQklPICpiaW8sIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgbG9uZyBiaW9fY3RybChCSU8gKmJpbywgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cik7CitzdGF0aWMgaW50IGJpb19wdXRzKEJJTyAqYmlvLCBjb25zdCBjaGFyICpzdHIpOworCitzdGF0aWMgaW50IGJpb19tYWtlX3BhaXIoQklPICpiaW8xLCBCSU8gKmJpbzIpOworc3RhdGljIHZvaWQgYmlvX2Rlc3Ryb3lfcGFpcihCSU8gKmJpbyk7CisKK3N0YXRpYyBCSU9fTUVUSE9EIG1ldGhvZHNfYmlvcCA9Cit7CisJQklPX1RZUEVfQklPLAorCSJCSU8gcGFpciIsCisJYmlvX3dyaXRlLAorCWJpb19yZWFkLAorCWJpb19wdXRzLAorCU5VTEwgLyogbm8gYmlvX2dldHMgKi8sCisJYmlvX2N0cmwsCisJYmlvX25ldywKKwliaW9fZnJlZSwKKwlOVUxMIC8qIG5vIGJpb19jYWxsYmFja19jdHJsICovCit9OworCitCSU9fTUVUSE9EICpCSU9fc19iaW8odm9pZCkKKwl7CisJcmV0dXJuICZtZXRob2RzX2Jpb3A7CisJfQorCitzdHJ1Y3QgYmlvX2Jpb19zdAoreworCUJJTyAqcGVlcjsgICAgIC8qIE5VTEwgaWYgYnVmID09IE5VTEwuCisJICAgICAgICAgICAgICAgICogSWYgcGVlciAhPSBOVUxMLCB0aGVuIHBlZXItPnB0ciBpcyBhbHNvIGEgYmlvX2Jpb19zdCwKKwkgICAgICAgICAgICAgICAgKiBhbmQgaXRzICJwZWVyIiBtZW1iZXIgcG9pbnRzIGJhY2sgdG8gdXMuCisJICAgICAgICAgICAgICAgICogcGVlciAhPSBOVUxMIGlmZiBpbml0ICE9IDAgaW4gdGhlIEJJTy4gKi8KKwkKKwkvKiBUaGlzIGlzIGZvciB3aGF0IHdlIHdyaXRlIChpLmUuIHJlYWRpbmcgdXNlcyBwZWVyJ3Mgc3RydWN0KTogKi8KKwlpbnQgY2xvc2VkOyAgICAgLyogdmFsaWQgaWZmIHBlZXIgIT0gTlVMTCAqLworCXNpemVfdCBsZW47ICAgICAvKiB2YWxpZCBpZmYgYnVmICE9IE5VTEw7IDAgaWYgcGVlciA9PSBOVUxMICovCisJc2l6ZV90IG9mZnNldDsgIC8qIHZhbGlkIGlmZiBidWYgIT0gTlVMTDsgMCBpZiBsZW4gPT0gMCAqLworCXNpemVfdCBzaXplOworCWNoYXIgKmJ1ZjsgICAgICAvKiAic2l6ZSIgZWxlbWVudHMgKGlmICE9IE5VTEwpICovCisKKwlzaXplX3QgcmVxdWVzdDsgLyogdmFsaWQgaWZmIHBlZXIgIT0gTlVMTDsgMCBpZiBsZW4gIT0gMCwKKwkgICAgICAgICAgICAgICAgICogb3RoZXJ3aXNlIHNldCBieSBwZWVyIHRvIG51bWJlciBvZiBieXRlcworCSAgICAgICAgICAgICAgICAgKiBpdCAodW5zdWNjZXNzZnVsbHkpIHRyaWVkIHRvIHJlYWQsCisJICAgICAgICAgICAgICAgICAqIG5ldmVyIG1vcmUgdGhhbiBidWZmZXIgc3BhY2UgKHNpemUtbGVuKSB3YXJyYW50cy4gKi8KK307CisKK3N0YXRpYyBpbnQgYmlvX25ldyhCSU8gKmJpbykKKwl7CisJc3RydWN0IGJpb19iaW9fc3QgKmI7CisJCisJYiA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZiAqYik7CisJaWYgKGIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwliLT5wZWVyID0gTlVMTDsKKwliLT5zaXplID0gMTcqMTAyNDsgLyogZW5vdWdoIGZvciBvbmUgVExTIHJlY29yZCAoanVzdCBhIGRlZmF1bHQpICovCisJYi0+YnVmID0gTlVMTDsKKworCWJpby0+cHRyID0gYjsKKwlyZXR1cm4gMTsKKwl9CisKKworc3RhdGljIGludCBiaW9fZnJlZShCSU8gKmJpbykKKwl7CisJc3RydWN0IGJpb19iaW9fc3QgKmI7CisKKwlpZiAoYmlvID09IE5VTEwpCisJCXJldHVybiAwOworCWIgPSBiaW8tPnB0cjsKKworCWFzc2VydChiICE9IE5VTEwpOworCisJaWYgKGItPnBlZXIpCisJCWJpb19kZXN0cm95X3BhaXIoYmlvKTsKKwkKKwlpZiAoYi0+YnVmICE9IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGItPmJ1Zik7CisJCX0KKworCU9QRU5TU0xfZnJlZShiKTsKKworCXJldHVybiAxOworCX0KKworCisKK3N0YXRpYyBpbnQgYmlvX3JlYWQoQklPICpiaW8sIGNoYXIgKmJ1ZiwgaW50IHNpemVfKQorCXsKKwlzaXplX3Qgc2l6ZSA9IHNpemVfOworCXNpemVfdCByZXN0OworCXN0cnVjdCBiaW9fYmlvX3N0ICpiLCAqcGVlcl9iOworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGJpbyk7CisKKwlpZiAoIWJpby0+aW5pdCkKKwkJcmV0dXJuIDA7CisKKwliID0gYmlvLT5wdHI7CisJYXNzZXJ0KGIgIT0gTlVMTCk7CisJYXNzZXJ0KGItPnBlZXIgIT0gTlVMTCk7CisJcGVlcl9iID0gYi0+cGVlci0+cHRyOworCWFzc2VydChwZWVyX2IgIT0gTlVMTCk7CisJYXNzZXJ0KHBlZXJfYi0+YnVmICE9IE5VTEwpOworCisJcGVlcl9iLT5yZXF1ZXN0ID0gMDsgLyogd2lsbCBiZSBzZXQgaW4gInJldHJ5X3JlYWQiIHNpdHVhdGlvbiAqLworCisJaWYgKGJ1ZiA9PSBOVUxMIHx8IHNpemUgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocGVlcl9iLT5sZW4gPT0gMCkKKwkJeworCQlpZiAocGVlcl9iLT5jbG9zZWQpCisJCQlyZXR1cm4gMDsgLyogd3JpdGVyIGhhcyBjbG9zZWQsIGFuZCBubyBkYXRhIGlzIGxlZnQgKi8KKwkJZWxzZQorCQkJeworCQkJQklPX3NldF9yZXRyeV9yZWFkKGJpbyk7IC8qIGJ1ZmZlciBpcyBlbXB0eSAqLworCQkJaWYgKHNpemUgPD0gcGVlcl9iLT5zaXplKQorCQkJCXBlZXJfYi0+cmVxdWVzdCA9IHNpemU7CisJCQllbHNlCisJCQkJLyogZG9uJ3QgYXNrIGZvciBtb3JlIHRoYW4gdGhlIHBlZXIgY2FuCisJCQkJICogZGVsaXZlciBpbiBvbmUgd3JpdGUgKi8KKwkJCQlwZWVyX2ItPnJlcXVlc3QgPSBwZWVyX2ItPnNpemU7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCS8qIHdlIGNhbiByZWFkICovCisJaWYgKHBlZXJfYi0+bGVuIDwgc2l6ZSkKKwkJc2l6ZSA9IHBlZXJfYi0+bGVuOworCisJLyogbm93IHJlYWQgInNpemUiIGJ5dGVzICovCisJCisJcmVzdCA9IHNpemU7CisJCisJYXNzZXJ0KHJlc3QgPiAwKTsKKwlkbyAvKiBvbmUgb3IgdHdvIGl0ZXJhdGlvbnMgKi8KKwkJeworCQlzaXplX3QgY2h1bms7CisJCQorCQlhc3NlcnQocmVzdCA8PSBwZWVyX2ItPmxlbik7CisJCWlmIChwZWVyX2ItPm9mZnNldCArIHJlc3QgPD0gcGVlcl9iLT5zaXplKQorCQkJY2h1bmsgPSByZXN0OworCQllbHNlCisJCQkvKiB3cmFwIGFyb3VuZCByaW5nIGJ1ZmZlciAqLworCQkJY2h1bmsgPSBwZWVyX2ItPnNpemUgLSBwZWVyX2ItPm9mZnNldDsKKwkJYXNzZXJ0KHBlZXJfYi0+b2Zmc2V0ICsgY2h1bmsgPD0gcGVlcl9iLT5zaXplKTsKKwkJCisJCW1lbWNweShidWYsIHBlZXJfYi0+YnVmICsgcGVlcl9iLT5vZmZzZXQsIGNodW5rKTsKKwkJCisJCXBlZXJfYi0+bGVuIC09IGNodW5rOworCQlpZiAocGVlcl9iLT5sZW4pCisJCQl7CisJCQlwZWVyX2ItPm9mZnNldCArPSBjaHVuazsKKwkJCWFzc2VydChwZWVyX2ItPm9mZnNldCA8PSBwZWVyX2ItPnNpemUpOworCQkJaWYgKHBlZXJfYi0+b2Zmc2V0ID09IHBlZXJfYi0+c2l6ZSkKKwkJCQlwZWVyX2ItPm9mZnNldCA9IDA7CisJCQlidWYgKz0gY2h1bms7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCS8qIGJ1ZmZlciBub3cgZW1wdHksIG5vIG5lZWQgdG8gYWR2YW5jZSAiYnVmIiAqLworCQkJYXNzZXJ0KGNodW5rID09IHJlc3QpOworCQkJcGVlcl9iLT5vZmZzZXQgPSAwOworCQkJfQorCQlyZXN0IC09IGNodW5rOworCQl9CisJd2hpbGUgKHJlc3QpOworCQorCXJldHVybiBzaXplOworCX0KKworLyogbm9uLWNvcHlpbmcgaW50ZXJmYWNlOiBwcm92aWRlIHBvaW50ZXIgdG8gYXZhaWxhYmxlIGRhdGEgaW4gYnVmZmVyCisgKiAgICBiaW9fbnJlYWQwOiAgcmV0dXJuIG51bWJlciBvZiBhdmFpbGFibGUgYnl0ZXMKKyAqICAgIGJpb19ucmVhZDogICBhbHNvIGFkdmFuY2UgaW5kZXgKKyAqIChleGFtcGxlIHVzYWdlOiAgYmlvX25yZWFkMCgpLCByZWFkIGZyb20gYnVmZmVyLCBiaW9fbnJlYWQoKQorICogIG9yIGp1c3QgICAgICAgICBiaW9fbnJlYWQoKSwgcmVhZCBmcm9tIGJ1ZmZlcikKKyAqLworLyogV0FSTklORzogVGhlIG5vbi1jb3B5aW5nIGludGVyZmFjZSBpcyBsYXJnZWx5IHVudGVzdGVkIGFzIG9mIHlldAorICogYW5kIG1heSBjb250YWluIGJ1Z3MuICovCitzdGF0aWMgc3NpemVfdCBiaW9fbnJlYWQwKEJJTyAqYmlvLCBjaGFyICoqYnVmKQorCXsKKwlzdHJ1Y3QgYmlvX2Jpb19zdCAqYiwgKnBlZXJfYjsKKwlzc2l6ZV90IG51bTsKKwkKKwlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKworCWlmICghYmlvLT5pbml0KQorCQlyZXR1cm4gMDsKKwkKKwliID0gYmlvLT5wdHI7CisJYXNzZXJ0KGIgIT0gTlVMTCk7CisJYXNzZXJ0KGItPnBlZXIgIT0gTlVMTCk7CisJcGVlcl9iID0gYi0+cGVlci0+cHRyOworCWFzc2VydChwZWVyX2IgIT0gTlVMTCk7CisJYXNzZXJ0KHBlZXJfYi0+YnVmICE9IE5VTEwpOworCQorCXBlZXJfYi0+cmVxdWVzdCA9IDA7CisJCisJaWYgKHBlZXJfYi0+bGVuID09IDApCisJCXsKKwkJY2hhciBkdW1teTsKKwkJCisJCS8qIGF2b2lkIGNvZGUgZHVwbGljYXRpb24gLS0gbm90aGluZyBhdmFpbGFibGUgZm9yIHJlYWRpbmcgKi8KKwkJcmV0dXJuIGJpb19yZWFkKGJpbywgJmR1bW15LCAxKTsgLyogcmV0dXJucyAwIG9yIC0xICovCisJCX0KKworCW51bSA9IHBlZXJfYi0+bGVuOworCWlmIChwZWVyX2ItPnNpemUgPCBwZWVyX2ItPm9mZnNldCArIG51bSkKKwkJLyogbm8gcmluZyBidWZmZXIgd3JhcC1hcm91bmQgZm9yIG5vbi1jb3B5aW5nIGludGVyZmFjZSAqLworCQludW0gPSBwZWVyX2ItPnNpemUgLSBwZWVyX2ItPm9mZnNldDsKKwlhc3NlcnQobnVtID4gMCk7CisKKwlpZiAoYnVmICE9IE5VTEwpCisJCSpidWYgPSBwZWVyX2ItPmJ1ZiArIHBlZXJfYi0+b2Zmc2V0OworCXJldHVybiBudW07CisJfQorCitzdGF0aWMgc3NpemVfdCBiaW9fbnJlYWQoQklPICpiaW8sIGNoYXIgKipidWYsIHNpemVfdCBudW1fKQorCXsKKwlzdHJ1Y3QgYmlvX2Jpb19zdCAqYiwgKnBlZXJfYjsKKwlzc2l6ZV90IG51bSwgYXZhaWxhYmxlOworCisJaWYgKG51bV8gPiBTU0laRV9NQVgpCisJCW51bSA9IFNTSVpFX01BWDsKKwllbHNlCisJCW51bSA9IChzc2l6ZV90KW51bV87CisKKwlhdmFpbGFibGUgPSBiaW9fbnJlYWQwKGJpbywgYnVmKTsKKwlpZiAobnVtID4gYXZhaWxhYmxlKQorCQludW0gPSBhdmFpbGFibGU7CisJaWYgKG51bSA8PSAwKQorCQlyZXR1cm4gbnVtOworCisJYiA9IGJpby0+cHRyOworCXBlZXJfYiA9IGItPnBlZXItPnB0cjsKKworCXBlZXJfYi0+bGVuIC09IG51bTsKKwlpZiAocGVlcl9iLT5sZW4pIAorCQl7CisJCXBlZXJfYi0+b2Zmc2V0ICs9IG51bTsKKwkJYXNzZXJ0KHBlZXJfYi0+b2Zmc2V0IDw9IHBlZXJfYi0+c2l6ZSk7CisJCWlmIChwZWVyX2ItPm9mZnNldCA9PSBwZWVyX2ItPnNpemUpCisJCQlwZWVyX2ItPm9mZnNldCA9IDA7CisJCX0KKwllbHNlCisJCXBlZXJfYi0+b2Zmc2V0ID0gMDsKKworCXJldHVybiBudW07CisJfQorCisKK3N0YXRpYyBpbnQgYmlvX3dyaXRlKEJJTyAqYmlvLCBjb25zdCBjaGFyICpidWYsIGludCBudW1fKQorCXsKKwlzaXplX3QgbnVtID0gbnVtXzsKKwlzaXplX3QgcmVzdDsKKwlzdHJ1Y3QgYmlvX2Jpb19zdCAqYjsKKworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiaW8pOworCisJaWYgKCFiaW8tPmluaXQgfHwgYnVmID09IE5VTEwgfHwgbnVtID09IDApCisJCXJldHVybiAwOworCisJYiA9IGJpby0+cHRyOwkJCisJYXNzZXJ0KGIgIT0gTlVMTCk7CisJYXNzZXJ0KGItPnBlZXIgIT0gTlVMTCk7CisJYXNzZXJ0KGItPmJ1ZiAhPSBOVUxMKTsKKworCWItPnJlcXVlc3QgPSAwOworCWlmIChiLT5jbG9zZWQpCisJCXsKKwkJLyogd2UgYWxyZWFkeSBjbG9zZWQgKi8KKwkJQklPZXJyKEJJT19GX0JJT19XUklURSwgQklPX1JfQlJPS0VOX1BJUEUpOworCQlyZXR1cm4gLTE7CisJCX0KKworCWFzc2VydChiLT5sZW4gPD0gYi0+c2l6ZSk7CisKKwlpZiAoYi0+bGVuID09IGItPnNpemUpCisJCXsKKwkJQklPX3NldF9yZXRyeV93cml0ZShiaW8pOyAvKiBidWZmZXIgaXMgZnVsbCAqLworCQlyZXR1cm4gLTE7CisJCX0KKworCS8qIHdlIGNhbiB3cml0ZSAqLworCWlmIChudW0gPiBiLT5zaXplIC0gYi0+bGVuKQorCQludW0gPSBiLT5zaXplIC0gYi0+bGVuOworCQorCS8qIG5vdyB3cml0ZSAibnVtIiBieXRlcyAqLworCisJcmVzdCA9IG51bTsKKwkKKwlhc3NlcnQocmVzdCA+IDApOworCWRvIC8qIG9uZSBvciB0d28gaXRlcmF0aW9ucyAqLworCQl7CisJCXNpemVfdCB3cml0ZV9vZmZzZXQ7CisJCXNpemVfdCBjaHVuazsKKworCQlhc3NlcnQoYi0+bGVuICsgcmVzdCA8PSBiLT5zaXplKTsKKworCQl3cml0ZV9vZmZzZXQgPSBiLT5vZmZzZXQgKyBiLT5sZW47CisJCWlmICh3cml0ZV9vZmZzZXQgPj0gYi0+c2l6ZSkKKwkJCXdyaXRlX29mZnNldCAtPSBiLT5zaXplOworCQkvKiBiLT5idWZbd3JpdGVfb2Zmc2V0XSBpcyB0aGUgZmlyc3QgYnl0ZSB3ZSBjYW4gd3JpdGUgdG8uICovCisKKwkJaWYgKHdyaXRlX29mZnNldCArIHJlc3QgPD0gYi0+c2l6ZSkKKwkJCWNodW5rID0gcmVzdDsKKwkJZWxzZQorCQkJLyogd3JhcCBhcm91bmQgcmluZyBidWZmZXIgKi8KKwkJCWNodW5rID0gYi0+c2l6ZSAtIHdyaXRlX29mZnNldDsKKwkJCisJCW1lbWNweShiLT5idWYgKyB3cml0ZV9vZmZzZXQsIGJ1ZiwgY2h1bmspOworCQkKKwkJYi0+bGVuICs9IGNodW5rOworCisJCWFzc2VydChiLT5sZW4gPD0gYi0+c2l6ZSk7CisJCQorCQlyZXN0IC09IGNodW5rOworCQlidWYgKz0gY2h1bms7CisJCX0KKwl3aGlsZSAocmVzdCk7CisKKwlyZXR1cm4gbnVtOworCX0KKworLyogbm9uLWNvcHlpbmcgaW50ZXJmYWNlOiBwcm92aWRlIHBvaW50ZXIgdG8gcmVnaW9uIHRvIHdyaXRlIHRvCisgKiAgIGJpb19ud3JpdGUwOiAgY2hlY2sgaG93IG11Y2ggc3BhY2UgaXMgYXZhaWxhYmxlCisgKiAgIGJpb19ud3JpdGU6ICAgYWxzbyBpbmNyZWFzZSBsZW5ndGgKKyAqIChleGFtcGxlIHVzYWdlOiAgYmlvX253cml0ZTAoKSwgd3JpdGUgdG8gYnVmZmVyLCBiaW9fbndyaXRlKCkKKyAqICBvciBqdXN0ICAgICAgICAgYmlvX253cml0ZSgpLCB3cml0ZSB0byBidWZmZXIpCisgKi8KK3N0YXRpYyBzc2l6ZV90IGJpb19ud3JpdGUwKEJJTyAqYmlvLCBjaGFyICoqYnVmKQorCXsKKwlzdHJ1Y3QgYmlvX2Jpb19zdCAqYjsKKwlzaXplX3QgbnVtOworCXNpemVfdCB3cml0ZV9vZmZzZXQ7CisKKwlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKworCWlmICghYmlvLT5pbml0KQorCQlyZXR1cm4gMDsKKworCWIgPSBiaW8tPnB0cjsJCQorCWFzc2VydChiICE9IE5VTEwpOworCWFzc2VydChiLT5wZWVyICE9IE5VTEwpOworCWFzc2VydChiLT5idWYgIT0gTlVMTCk7CisKKwliLT5yZXF1ZXN0ID0gMDsKKwlpZiAoYi0+Y2xvc2VkKQorCQl7CisJCUJJT2VycihCSU9fRl9CSU9fTldSSVRFMCwgQklPX1JfQlJPS0VOX1BJUEUpOworCQlyZXR1cm4gLTE7CisJCX0KKworCWFzc2VydChiLT5sZW4gPD0gYi0+c2l6ZSk7CisKKwlpZiAoYi0+bGVuID09IGItPnNpemUpCisJCXsKKwkJQklPX3NldF9yZXRyeV93cml0ZShiaW8pOworCQlyZXR1cm4gLTE7CisJCX0KKworCW51bSA9IGItPnNpemUgLSBiLT5sZW47CisJd3JpdGVfb2Zmc2V0ID0gYi0+b2Zmc2V0ICsgYi0+bGVuOworCWlmICh3cml0ZV9vZmZzZXQgPj0gYi0+c2l6ZSkKKwkJd3JpdGVfb2Zmc2V0IC09IGItPnNpemU7CisJaWYgKHdyaXRlX29mZnNldCArIG51bSA+IGItPnNpemUpCisJCS8qIG5vIHJpbmcgYnVmZmVyIHdyYXAtYXJvdW5kIGZvciBub24tY29weWluZyBpbnRlcmZhY2UKKwkJICogKHRvIGZ1bGZpbCB0aGUgcHJvbWlzZSBieSBCSU9fY3RybF9nZXRfd3JpdGVfZ3VhcmFudGVlLAorCQkgKiBCSU9fbndyaXRlIG1heSBoYXZlIHRvIGJlIGNhbGxlZCB0d2ljZSkgKi8KKwkJbnVtID0gYi0+c2l6ZSAtIHdyaXRlX29mZnNldDsKKworCWlmIChidWYgIT0gTlVMTCkKKwkJKmJ1ZiA9IGItPmJ1ZiArIHdyaXRlX29mZnNldDsKKwlhc3NlcnQod3JpdGVfb2Zmc2V0ICsgbnVtIDw9IGItPnNpemUpOworCisJcmV0dXJuIG51bTsKKwl9CisKK3N0YXRpYyBzc2l6ZV90IGJpb19ud3JpdGUoQklPICpiaW8sIGNoYXIgKipidWYsIHNpemVfdCBudW1fKQorCXsKKwlzdHJ1Y3QgYmlvX2Jpb19zdCAqYjsKKwlzc2l6ZV90IG51bSwgc3BhY2U7CisKKwlpZiAobnVtXyA+IFNTSVpFX01BWCkKKwkJbnVtID0gU1NJWkVfTUFYOworCWVsc2UKKwkJbnVtID0gKHNzaXplX3QpbnVtXzsKKworCXNwYWNlID0gYmlvX253cml0ZTAoYmlvLCBidWYpOworCWlmIChudW0gPiBzcGFjZSkKKwkJbnVtID0gc3BhY2U7CisJaWYgKG51bSA8PSAwKQorCQlyZXR1cm4gbnVtOworCWIgPSBiaW8tPnB0cjsKKwlhc3NlcnQoYiAhPSBOVUxMKTsKKwliLT5sZW4gKz0gbnVtOworCWFzc2VydChiLT5sZW4gPD0gYi0+c2l6ZSk7CisKKwlyZXR1cm4gbnVtOworCX0KKworCitzdGF0aWMgbG9uZyBiaW9fY3RybChCSU8gKmJpbywgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJbG9uZyByZXQ7CisJc3RydWN0IGJpb19iaW9fc3QgKmIgPSBiaW8tPnB0cjsKKwkKKwlhc3NlcnQoYiAhPSBOVUxMKTsKKworCXN3aXRjaCAoY21kKQorCQl7CisJLyogc3BlY2lmaWMgQ1RSTCBjb2RlcyAqLworCisJY2FzZSBCSU9fQ19TRVRfV1JJVEVfQlVGX1NJWkU6CisJCWlmIChiLT5wZWVyKQorCQkJeworCQkJQklPZXJyKEJJT19GX0JJT19DVFJMLCBCSU9fUl9JTl9VU0UpOworCQkJcmV0ID0gMDsKKwkJCX0KKwkJZWxzZSBpZiAobnVtID09IDApCisJCQl7CisJCQlCSU9lcnIoQklPX0ZfQklPX0NUUkwsIEJJT19SX0lOVkFMSURfQVJHVU1FTlQpOworCQkJcmV0ID0gMDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJc2l6ZV90IG5ld19zaXplID0gbnVtOworCisJCQlpZiAoYi0+c2l6ZSAhPSBuZXdfc2l6ZSkKKwkJCQl7CisJCQkJaWYgKGItPmJ1ZikgCisJCQkJCXsKKwkJCQkJT1BFTlNTTF9mcmVlKGItPmJ1Zik7CisJCQkJCWItPmJ1ZiA9IE5VTEw7CisJCQkJCX0KKwkJCQliLT5zaXplID0gbmV3X3NpemU7CisJCQkJfQorCQkJcmV0ID0gMTsKKwkJCX0KKwkJYnJlYWs7CisKKwljYXNlIEJJT19DX0dFVF9XUklURV9CVUZfU0laRToKKwkJcmV0ID0gKGxvbmcpIGItPnNpemU7CisJCWJyZWFrOworCisJY2FzZSBCSU9fQ19NQUtFX0JJT19QQUlSOgorCQl7CisJCUJJTyAqb3RoZXJfYmlvID0gcHRyOworCQkKKwkJaWYgKGJpb19tYWtlX3BhaXIoYmlvLCBvdGhlcl9iaW8pKQorCQkJcmV0ID0gMTsKKwkJZWxzZQorCQkJcmV0ID0gMDsKKwkJfQorCQlicmVhazsKKwkJCisJY2FzZSBCSU9fQ19ERVNUUk9ZX0JJT19QQUlSOgorCQkvKiBBZmZlY3RzIGJvdGggQklPcyBpbiB0aGUgcGFpciAtLSBjYWxsIGp1c3Qgb25jZSEKKwkJICogT3IgbGV0IEJJT19mcmVlKGJpbzEpOyBCSU9fZnJlZShiaW8yKTsgZG8gdGhlIGpvYi4gKi8KKwkJYmlvX2Rlc3Ryb3lfcGFpcihiaW8pOworCQlyZXQgPSAxOworCQlicmVhazsKKworCWNhc2UgQklPX0NfR0VUX1dSSVRFX0dVQVJBTlRFRToKKwkJLyogSG93IG1hbnkgYnl0ZXMgY2FuIHRoZSBjYWxsZXIgZmVlZCB0byB0aGUgbmV4dCB3cml0ZQorCQkgKiB3aXRob3V0IGhhdmluZyB0byBrZWVwIGFueT8gKi8KKwkJaWYgKGItPnBlZXIgPT0gTlVMTCB8fCBiLT5jbG9zZWQpCisJCQlyZXQgPSAwOworCQllbHNlCisJCQlyZXQgPSAobG9uZykgYi0+c2l6ZSAtIGItPmxlbjsKKwkJYnJlYWs7CisKKwljYXNlIEJJT19DX0dFVF9SRUFEX1JFUVVFU1Q6CisJCS8qIElmIHRoZSBwZWVyIHVuc3VjY2Vzc2Z1bGx5IHRyaWVkIHRvIHJlYWQsIGhvdyBtYW55IGJ5dGVzCisJCSAqIHdlcmUgcmVxdWVzdGVkPyAgKEFzIHdpdGggQklPX0NUUkxfUEVORElORywgdGhhdCBudW1iZXIKKwkJICogY2FuIHVzdWFsbHkgYmUgdHJlYXRlZCBhcyBib29sZWFuLikgKi8KKwkJcmV0ID0gKGxvbmcpIGItPnJlcXVlc3Q7CisJCWJyZWFrOworCisJY2FzZSBCSU9fQ19SRVNFVF9SRUFEX1JFUVVFU1Q6CisJCS8qIFJlc2V0IHJlcXVlc3QuICAoQ2FuIGJlIHVzZWZ1bCBhZnRlciByZWFkIGF0dGVtcHRzCisJCSAqIGF0IHRoZSBvdGhlciBzaWRlIHRoYXQgYXJlIG1lYW50IHRvIGJlIG5vbi1ibG9ja2luZywKKwkJICogZS5nLiB3aGVuIHByb2JpbmcgU1NMX3JlYWQgdG8gc2VlIGlmIGFueSBkYXRhIGlzCisJCSAqIGF2YWlsYWJsZS4pICovCisJCWItPnJlcXVlc3QgPSAwOworCQlyZXQgPSAxOworCQlicmVhazsKKworCWNhc2UgQklPX0NfU0hVVERPV05fV1I6CisJCS8qIHNpbWlsYXIgdG8gc2h1dGRvd24oLi4uLCBTSFVUX1dSKSAqLworCQliLT5jbG9zZWQgPSAxOworCQlyZXQgPSAxOworCQlicmVhazsKKworCWNhc2UgQklPX0NfTlJFQUQwOgorCQkvKiBwcmVwYXJlIGZvciBub24tY29weWluZyByZWFkICovCisJCXJldCA9IChsb25nKSBiaW9fbnJlYWQwKGJpbywgcHRyKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgQklPX0NfTlJFQUQ6CisJCS8qIG5vbi1jb3B5aW5nIHJlYWQgKi8KKwkJcmV0ID0gKGxvbmcpIGJpb19ucmVhZChiaW8sIHB0ciwgKHNpemVfdCkgbnVtKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgQklPX0NfTldSSVRFMDoKKwkJLyogcHJlcGFyZSBmb3Igbm9uLWNvcHlpbmcgd3JpdGUgKi8KKwkJcmV0ID0gKGxvbmcpIGJpb19ud3JpdGUwKGJpbywgcHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIEJJT19DX05XUklURToKKwkJLyogbm9uLWNvcHlpbmcgd3JpdGUgKi8KKwkJcmV0ID0gKGxvbmcpIGJpb19ud3JpdGUoYmlvLCBwdHIsIChzaXplX3QpIG51bSk7CisJCWJyZWFrOworCQkKKworCS8qIHN0YW5kYXJkIENUUkwgY29kZXMgZm9sbG93ICovCisKKwljYXNlIEJJT19DVFJMX1JFU0VUOgorCQlpZiAoYi0+YnVmICE9IE5VTEwpCisJCQl7CisJCQliLT5sZW4gPSAwOworCQkJYi0+b2Zmc2V0ID0gMDsKKwkJCX0KKwkJcmV0ID0gMDsKKwkJYnJlYWs7CQkKKworCWNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorCQlyZXQgPSBiaW8tPnNodXRkb3duOworCQlicmVhazsKKworCWNhc2UgQklPX0NUUkxfU0VUX0NMT1NFOgorCQliaW8tPnNodXRkb3duID0gKGludCkgbnVtOworCQlyZXQgPSAxOworCQlicmVhazsKKworCWNhc2UgQklPX0NUUkxfUEVORElORzoKKwkJaWYgKGItPnBlZXIgIT0gTlVMTCkKKwkJCXsKKwkJCXN0cnVjdCBiaW9fYmlvX3N0ICpwZWVyX2IgPSBiLT5wZWVyLT5wdHI7CisJCQkKKwkJCXJldCA9IChsb25nKSBwZWVyX2ItPmxlbjsKKwkJCX0KKwkJZWxzZQorCQkJcmV0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCQlpZiAoYi0+YnVmICE9IE5VTEwpCisJCQlyZXQgPSAobG9uZykgYi0+bGVuOworCQllbHNlCisJCQlyZXQgPSAwOworCQlicmVhazsKKworCWNhc2UgQklPX0NUUkxfRFVQOgorCQkvKiBTZWUgQklPX2R1cF9jaGFpbiBmb3IgY2lyY3Vtc3RhbmNlcyB3ZSBoYXZlIHRvIGV4cGVjdC4gKi8KKwkJeworCQlCSU8gKm90aGVyX2JpbyA9IHB0cjsKKwkJc3RydWN0IGJpb19iaW9fc3QgKm90aGVyX2I7CisJCQorCQlhc3NlcnQob3RoZXJfYmlvICE9IE5VTEwpOworCQlvdGhlcl9iID0gb3RoZXJfYmlvLT5wdHI7CisJCWFzc2VydChvdGhlcl9iICE9IE5VTEwpOworCQkKKwkJYXNzZXJ0KG90aGVyX2ItPmJ1ZiA9PSBOVUxMKTsgLyogb3RoZXJfYmlvIGlzIGFsd2F5cyBmcmVzaCAqLworCisJCW90aGVyX2ItPnNpemUgPSBiLT5zaXplOworCQl9CisKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIEJJT19DVFJMX0ZMVVNIOgorCQlyZXQgPSAxOworCQlicmVhazsKKworCWNhc2UgQklPX0NUUkxfRU9GOgorCQl7CisJCUJJTyAqb3RoZXJfYmlvID0gcHRyOworCQkKKwkJaWYgKG90aGVyX2JpbykKKwkJCXsKKwkJCXN0cnVjdCBiaW9fYmlvX3N0ICpvdGhlcl9iID0gb3RoZXJfYmlvLT5wdHI7CisJCQkKKwkJCWFzc2VydChvdGhlcl9iICE9IE5VTEwpOworCQkJcmV0ID0gb3RoZXJfYi0+bGVuID09IDAgJiYgb3RoZXJfYi0+Y2xvc2VkOworCQkJfQorCQllbHNlCisJCQlyZXQgPSAxOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwkJfQorCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGJpb19wdXRzKEJJTyAqYmlvLCBjb25zdCBjaGFyICpzdHIpCisJeworCXJldHVybiBiaW9fd3JpdGUoYmlvLCBzdHIsIHN0cmxlbihzdHIpKTsKKwl9CisKKworc3RhdGljIGludCBiaW9fbWFrZV9wYWlyKEJJTyAqYmlvMSwgQklPICpiaW8yKQorCXsKKwlzdHJ1Y3QgYmlvX2Jpb19zdCAqYjEsICpiMjsKKworCWFzc2VydChiaW8xICE9IE5VTEwpOworCWFzc2VydChiaW8yICE9IE5VTEwpOworCisJYjEgPSBiaW8xLT5wdHI7CisJYjIgPSBiaW8yLT5wdHI7CisJCisJaWYgKGIxLT5wZWVyICE9IE5VTEwgfHwgYjItPnBlZXIgIT0gTlVMTCkKKwkJeworCQlCSU9lcnIoQklPX0ZfQklPX01BS0VfUEFJUiwgQklPX1JfSU5fVVNFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkKKwlpZiAoYjEtPmJ1ZiA9PSBOVUxMKQorCQl7CisJCWIxLT5idWYgPSBPUEVOU1NMX21hbGxvYyhiMS0+c2l6ZSk7CisJCWlmIChiMS0+YnVmID09IE5VTEwpCisJCQl7CisJCQlCSU9lcnIoQklPX0ZfQklPX01BS0VfUEFJUiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWIxLT5sZW4gPSAwOworCQliMS0+b2Zmc2V0ID0gMDsKKwkJfQorCQorCWlmIChiMi0+YnVmID09IE5VTEwpCisJCXsKKwkJYjItPmJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGIyLT5zaXplKTsKKwkJaWYgKGIyLT5idWYgPT0gTlVMTCkKKwkJCXsKKwkJCUJJT2VycihCSU9fRl9CSU9fTUFLRV9QQUlSLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJYjItPmxlbiA9IDA7CisJCWIyLT5vZmZzZXQgPSAwOworCQl9CisJCisJYjEtPnBlZXIgPSBiaW8yOworCWIxLT5jbG9zZWQgPSAwOworCWIxLT5yZXF1ZXN0ID0gMDsKKwliMi0+cGVlciA9IGJpbzE7CisJYjItPmNsb3NlZCA9IDA7CisJYjItPnJlcXVlc3QgPSAwOworCisJYmlvMS0+aW5pdCA9IDE7CisJYmlvMi0+aW5pdCA9IDE7CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyB2b2lkIGJpb19kZXN0cm95X3BhaXIoQklPICpiaW8pCisJeworCXN0cnVjdCBiaW9fYmlvX3N0ICpiID0gYmlvLT5wdHI7CisKKwlpZiAoYiAhPSBOVUxMKQorCQl7CisJCUJJTyAqcGVlcl9iaW8gPSBiLT5wZWVyOworCisJCWlmIChwZWVyX2JpbyAhPSBOVUxMKQorCQkJeworCQkJc3RydWN0IGJpb19iaW9fc3QgKnBlZXJfYiA9IHBlZXJfYmlvLT5wdHI7CisKKwkJCWFzc2VydChwZWVyX2IgIT0gTlVMTCk7CisJCQlhc3NlcnQocGVlcl9iLT5wZWVyID09IGJpbyk7CisKKwkJCXBlZXJfYi0+cGVlciA9IE5VTEw7CisJCQlwZWVyX2Jpby0+aW5pdCA9IDA7CisJCQlhc3NlcnQocGVlcl9iLT5idWYgIT0gTlVMTCk7CisJCQlwZWVyX2ItPmxlbiA9IDA7CisJCQlwZWVyX2ItPm9mZnNldCA9IDA7CisJCQkKKwkJCWItPnBlZXIgPSBOVUxMOworCQkJYmlvLT5pbml0ID0gMDsKKwkJCWFzc2VydChiLT5idWYgIT0gTlVMTCk7CisJCQliLT5sZW4gPSAwOworCQkJYi0+b2Zmc2V0ID0gMDsKKwkJCX0KKwkJfQorCX0KKyAKKworLyogRXhwb3J0ZWQgY29udmVuaWVuY2UgZnVuY3Rpb25zICovCitpbnQgQklPX25ld19iaW9fcGFpcihCSU8gKipiaW8xX3AsIHNpemVfdCB3cml0ZWJ1ZjEsCisJQklPICoqYmlvMl9wLCBzaXplX3Qgd3JpdGVidWYyKQorCSB7CisJIEJJTyAqYmlvMSA9IE5VTEwsICpiaW8yID0gTlVMTDsKKwkgbG9uZyByOworCSBpbnQgcmV0ID0gMDsKKworCSBiaW8xID0gQklPX25ldyhCSU9fc19iaW8oKSk7CisJIGlmIChiaW8xID09IE5VTEwpCisJCSBnb3RvIGVycjsKKwkgYmlvMiA9IEJJT19uZXcoQklPX3NfYmlvKCkpOworCSBpZiAoYmlvMiA9PSBOVUxMKQorCQkgZ290byBlcnI7CisKKwkgaWYgKHdyaXRlYnVmMSkKKwkJIHsKKwkJIHIgPSBCSU9fc2V0X3dyaXRlX2J1Zl9zaXplKGJpbzEsIHdyaXRlYnVmMSk7CisJCSBpZiAoIXIpCisJCQkgZ290byBlcnI7CisJCSB9CisJIGlmICh3cml0ZWJ1ZjIpCisJCSB7CisJCSByID0gQklPX3NldF93cml0ZV9idWZfc2l6ZShiaW8yLCB3cml0ZWJ1ZjIpOworCQkgaWYgKCFyKQorCQkJIGdvdG8gZXJyOworCQkgfQorCisJIHIgPSBCSU9fbWFrZV9iaW9fcGFpcihiaW8xLCBiaW8yKTsKKwkgaWYgKCFyKQorCQkgZ290byBlcnI7CisJIHJldCA9IDE7CisKKyBlcnI6CisJIGlmIChyZXQgPT0gMCkKKwkJIHsKKwkJIGlmIChiaW8xKQorCQkJIHsKKwkJCSBCSU9fZnJlZShiaW8xKTsKKwkJCSBiaW8xID0gTlVMTDsKKwkJCSB9CisJCSBpZiAoYmlvMikKKwkJCSB7CisJCQkgQklPX2ZyZWUoYmlvMik7CisJCQkgYmlvMiA9IE5VTEw7CisJCQkgfQorCQkgfQorCisJICpiaW8xX3AgPSBiaW8xOworCSAqYmlvMl9wID0gYmlvMjsKKwkgcmV0dXJuIHJldDsKKwkgfQorCitzaXplX3QgQklPX2N0cmxfZ2V0X3dyaXRlX2d1YXJhbnRlZShCSU8gKmJpbykKKwl7CisJcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfR0VUX1dSSVRFX0dVQVJBTlRFRSwgMCwgTlVMTCk7CisJfQorCitzaXplX3QgQklPX2N0cmxfZ2V0X3JlYWRfcmVxdWVzdChCSU8gKmJpbykKKwl7CisJcmV0dXJuIEJJT19jdHJsKGJpbywgQklPX0NfR0VUX1JFQURfUkVRVUVTVCwgMCwgTlVMTCk7CisJfQorCitpbnQgQklPX2N0cmxfcmVzZXRfcmVhZF9yZXF1ZXN0KEJJTyAqYmlvKQorCXsKKwlyZXR1cm4gKEJJT19jdHJsKGJpbywgQklPX0NfUkVTRVRfUkVBRF9SRVFVRVNULCAwLCBOVUxMKSAhPSAwKTsKKwl9CisKKworLyogQklPX25yZWFkMC9ucmVhZC9ud3JpdGUwL253cml0ZSBhcmUgYXZhaWxhYmxlIG9ubHkgZm9yIEJJTyBwYWlycyBmb3Igbm93CisgKiAoY29uY2VpdmFibHkgc29tZSBvdGhlciBCSU9zIGNvdWxkIGFsbG93IG5vbi1jb3B5aW5nIHJlYWRzIGFuZCB3cml0ZXMgdG9vLikKKyAqLworaW50IEJJT19ucmVhZDAoQklPICpiaW8sIGNoYXIgKipidWYpCisJeworCWxvbmcgcmV0OworCisJaWYgKCFiaW8tPmluaXQpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19OUkVBRDAsIEJJT19SX1VOSU5JVElBTElaRUQpOworCQlyZXR1cm4gLTI7CisJCX0KKworCXJldCA9IEJJT19jdHJsKGJpbywgQklPX0NfTlJFQUQwLCAwLCBidWYpOworCWlmIChyZXQgPiBJTlRfTUFYKQorCQlyZXR1cm4gSU5UX01BWDsKKwllbHNlCisJCXJldHVybiAoaW50KSByZXQ7CisJfQorCitpbnQgQklPX25yZWFkKEJJTyAqYmlvLCBjaGFyICoqYnVmLCBpbnQgbnVtKQorCXsKKwlpbnQgcmV0OworCisJaWYgKCFiaW8tPmluaXQpCisJCXsKKwkJQklPZXJyKEJJT19GX0JJT19OUkVBRCwgQklPX1JfVU5JTklUSUFMSVpFRCk7CisJCXJldHVybiAtMjsKKwkJfQorCisJcmV0ID0gKGludCkgQklPX2N0cmwoYmlvLCBCSU9fQ19OUkVBRCwgbnVtLCBidWYpOworCWlmIChyZXQgPiAwKQorCQliaW8tPm51bV9yZWFkICs9IHJldDsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEJJT19ud3JpdGUwKEJJTyAqYmlvLCBjaGFyICoqYnVmKQorCXsKKwlsb25nIHJldDsKKworCWlmICghYmlvLT5pbml0KQorCQl7CisJCUJJT2VycihCSU9fRl9CSU9fTldSSVRFMCwgQklPX1JfVU5JTklUSUFMSVpFRCk7CisJCXJldHVybiAtMjsKKwkJfQorCisJcmV0ID0gQklPX2N0cmwoYmlvLCBCSU9fQ19OV1JJVEUwLCAwLCBidWYpOworCWlmIChyZXQgPiBJTlRfTUFYKQorCQlyZXR1cm4gSU5UX01BWDsKKwllbHNlCisJCXJldHVybiAoaW50KSByZXQ7CisJfQorCitpbnQgQklPX253cml0ZShCSU8gKmJpbywgY2hhciAqKmJ1ZiwgaW50IG51bSkKKwl7CisJaW50IHJldDsKKworCWlmICghYmlvLT5pbml0KQorCQl7CisJCUJJT2VycihCSU9fRl9CSU9fTldSSVRFLCBCSU9fUl9VTklOSVRJQUxJWkVEKTsKKwkJcmV0dXJuIC0yOworCQl9CisKKwlyZXQgPSBCSU9fY3RybChiaW8sIEJJT19DX05XUklURSwgbnVtLCBidWYpOworCWlmIChyZXQgPiAwKQorCQliaW8tPm51bV93cml0ZSArPSByZXQ7CisJcmV0dXJuIHJldDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19jb25uLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19jb25uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0NzI3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2Nvbm4uYwpAQCAtMCwwICsxLDY1MiBAQAorLyogY3J5cHRvL2Jpby9ic3NfY29ubi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIFVTRV9TT0NLRVRTCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fU09DSworCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMTYKKyNkZWZpbmUgU09DS0VUX1BST1RPQ09MIDAgLyogbW9yZSBtaWNyb3NvZnQgc3R1cGlkaXR5ICovCisjZWxzZQorI2RlZmluZSBTT0NLRVRfUFJPVE9DT0wgSVBQUk9UT19UQ1AKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKSAmJiBfX1ZNU19WRVIgPCA3MDAwMDAwMCkKKy8qIEZJT05CSU8gdXNlZCBhcyBhIHN3aXRjaCB0byBlbmFibGUgaW9jdGwsIGFuZCB0aGF0IGlzbid0IGluIFZNUyA8IDcuMCAqLworI3VuZGVmIEZJT05CSU8KKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IGJpb19jb25uZWN0X3N0CisJeworCWludCBzdGF0ZTsKKworCWNoYXIgKnBhcmFtX2hvc3RuYW1lOworCWNoYXIgKnBhcmFtX3BvcnQ7CisJaW50IG5iaW87CisKKwl1bnNpZ25lZCBjaGFyIGlwWzRdOworCXVuc2lnbmVkIHNob3J0IHBvcnQ7CisKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gdGhlbTsKKworCS8qIGludCBzb2NrZXQ7IHRoaXMgd2lsbCBiZSBrZXB0IGluIGJpby0+bnVtIHNvIHRoYXQgaXQgaXMKKwkgKiBjb21wYXRpYmxlIHdpdGggdGhlIGJzc19zb2NrIGJpbyAqLyAKKworCS8qIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGluaXRpYWxseSBtYWRlCisJICogIGNhbGxiYWNrKEJJTyxzdGF0ZSxyZXQpOyAgVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4KKwkgKiAncmV0Jy4gIHN0YXRlIGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHNzbCBpbmZvX2NhbGxiYWNrICovCisJaW50ICgqaW5mb19jYWxsYmFjaykoY29uc3QgQklPICpiaW8saW50IHN0YXRlLGludCByZXQpOworCX0gQklPX0NPTk5FQ1Q7CisKK3N0YXRpYyBpbnQgY29ubl93cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IGNvbm5fcmVhZChCSU8gKmgsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIGludCBjb25uX3B1dHMoQklPICpoLCBjb25zdCBjaGFyICpzdHIpOworc3RhdGljIGxvbmcgY29ubl9jdHJsKEJJTyAqaCwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKTsKK3N0YXRpYyBpbnQgY29ubl9uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgY29ubl9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgbG9uZyBjb25uX2NhbGxiYWNrX2N0cmwoQklPICpoLCBpbnQgY21kLCBiaW9faW5mb19jYiAqKTsKKworc3RhdGljIGludCBjb25uX3N0YXRlKEJJTyAqYiwgQklPX0NPTk5FQ1QgKmMpOworc3RhdGljIHZvaWQgY29ubl9jbG9zZV9zb2NrZXQoQklPICpkYXRhKTsKK0JJT19DT05ORUNUICpCSU9fQ09OTkVDVF9uZXcodm9pZCApOwordm9pZCBCSU9fQ09OTkVDVF9mcmVlKEJJT19DT05ORUNUICphKTsKKworc3RhdGljIEJJT19NRVRIT0QgbWV0aG9kc19jb25uZWN0cD0KKwl7CisJQklPX1RZUEVfQ09OTkVDVCwKKwkic29ja2V0IGNvbm5lY3QiLAorCWNvbm5fd3JpdGUsCisJY29ubl9yZWFkLAorCWNvbm5fcHV0cywKKwlOVUxMLCAvKiBjb25uZWN0X2dldHMsICovCisJY29ubl9jdHJsLAorCWNvbm5fbmV3LAorCWNvbm5fZnJlZSwKKwljb25uX2NhbGxiYWNrX2N0cmwsCisJfTsKKworc3RhdGljIGludCBjb25uX3N0YXRlKEJJTyAqYiwgQklPX0NPTk5FQ1QgKmMpCisJeworCWludCByZXQ9IC0xLGk7CisJdW5zaWduZWQgbG9uZyBsOworCWNoYXIgKnAsKnE7CisJaW50ICgqY2IpKGNvbnN0IEJJTyAqLGludCxpbnQpPU5VTEw7CisKKwlpZiAoYy0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQljYj1jLT5pbmZvX2NhbGxiYWNrOworCisJZm9yICg7OykKKwkJeworCQlzd2l0Y2ggKGMtPnN0YXRlKQorCQkJeworCQljYXNlIEJJT19DT05OX1NfQkVGT1JFOgorCQkJcD1jLT5wYXJhbV9ob3N0bmFtZTsKKwkJCWlmIChwID09IE5VTEwpCisJCQkJeworCQkJCUJJT2VycihCSU9fRl9DT05OX1NUQVRFLEJJT19SX05PX0hPU1ROQU1FX1NQRUNJRklFRCk7CisJCQkJZ290byBleGl0X2xvb3A7CisJCQkJfQorCQkJZm9yICggOyAqcCAhPSAnXDAnOyBwKyspCisJCQkJeworCQkJCWlmICgoKnAgPT0gJzonKSB8fCAoKnAgPT0gJy8nKSkgYnJlYWs7CisJCQkJfQorCisJCQlpPSAqcDsKKwkJCWlmICgoaSA9PSAnOicpIHx8IChpID09ICcvJykpCisJCQkJeworCisJCQkJKihwKyspPSdcMCc7CisJCQkJaWYgKGkgPT0gJzonKQorCQkJCQl7CisJCQkJCWZvciAocT1wOyAqcTsgcSsrKQorCQkJCQkJaWYgKCpxID09ICcvJykKKwkJCQkJCQl7CisJCQkJCQkJKnE9J1wwJzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCWlmIChjLT5wYXJhbV9wb3J0ICE9IE5VTEwpCisJCQkJCQlPUEVOU1NMX2ZyZWUoYy0+cGFyYW1fcG9ydCk7CisJCQkJCWMtPnBhcmFtX3BvcnQ9QlVGX3N0cmR1cChwKTsKKwkJCQkJfQorCQkJCX0KKworCQkJaWYgKGMtPnBhcmFtX3BvcnQgPT0gTlVMTCkKKwkJCQl7CisJCQkJQklPZXJyKEJJT19GX0NPTk5fU1RBVEUsQklPX1JfTk9fUE9SVF9TUEVDSUZJRUQpOworCQkJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCJob3N0PSIsYy0+cGFyYW1faG9zdG5hbWUpOworCQkJCWdvdG8gZXhpdF9sb29wOworCQkJCX0KKwkJCWMtPnN0YXRlPUJJT19DT05OX1NfR0VUX0lQOworCQkJYnJlYWs7CisKKwkJY2FzZSBCSU9fQ09OTl9TX0dFVF9JUDoKKwkJCWlmIChCSU9fZ2V0X2hvc3RfaXAoYy0+cGFyYW1faG9zdG5hbWUsJihjLT5pcFswXSkpIDw9IDApCisJCQkJZ290byBleGl0X2xvb3A7CisJCQljLT5zdGF0ZT1CSU9fQ09OTl9TX0dFVF9QT1JUOworCQkJYnJlYWs7CisKKwkJY2FzZSBCSU9fQ09OTl9TX0dFVF9QT1JUOgorCQkJaWYgKGMtPnBhcmFtX3BvcnQgPT0gTlVMTCkKKwkJCQl7CisJCQkJLyogYWJvcnQoKTsgKi8KKwkJCQlnb3RvIGV4aXRfbG9vcDsKKwkJCQl9CisJCQllbHNlIGlmIChCSU9fZ2V0X3BvcnQoYy0+cGFyYW1fcG9ydCwmYy0+cG9ydCkgPD0gMCkKKwkJCQlnb3RvIGV4aXRfbG9vcDsKKwkJCWMtPnN0YXRlPUJJT19DT05OX1NfQ1JFQVRFX1NPQ0tFVDsKKwkJCWJyZWFrOworCisJCWNhc2UgQklPX0NPTk5fU19DUkVBVEVfU09DS0VUOgorCQkJLyogbm93IHNldHVwIGFkZHJlc3MgKi8KKwkJCW1lbXNldCgoY2hhciAqKSZjLT50aGVtLDAsc2l6ZW9mKGMtPnRoZW0pKTsKKwkJCWMtPnRoZW0uc2luX2ZhbWlseT1BRl9JTkVUOworCQkJYy0+dGhlbS5zaW5fcG9ydD1odG9ucygodW5zaWduZWQgc2hvcnQpYy0+cG9ydCk7CisJCQlsPSh1bnNpZ25lZCBsb25nKQorCQkJCSgodW5zaWduZWQgbG9uZyljLT5pcFswXTw8MjRMKXwKKwkJCQkoKHVuc2lnbmVkIGxvbmcpYy0+aXBbMV08PDE2TCl8CisJCQkJKCh1bnNpZ25lZCBsb25nKWMtPmlwWzJdPDwgOEwpfAorCQkJCSgodW5zaWduZWQgbG9uZyljLT5pcFszXSk7CisJCQljLT50aGVtLnNpbl9hZGRyLnNfYWRkcj1odG9ubChsKTsKKwkJCWMtPnN0YXRlPUJJT19DT05OX1NfQ1JFQVRFX1NPQ0tFVDsKKworCQkJcmV0PXNvY2tldChBRl9JTkVULFNPQ0tfU1RSRUFNLFNPQ0tFVF9QUk9UT0NPTCk7CisJCQlpZiAocmV0ID09IElOVkFMSURfU09DS0VUKQorCQkJCXsKKwkJCQlTWVNlcnIoU1lTX0ZfU09DS0VULGdldF9sYXN0X3NvY2tldF9lcnJvcigpKTsKKwkJCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwiaG9zdD0iLGMtPnBhcmFtX2hvc3RuYW1lLAorCQkJCQkiOiIsYy0+cGFyYW1fcG9ydCk7CisJCQkJQklPZXJyKEJJT19GX0NPTk5fU1RBVEUsQklPX1JfVU5BQkxFX1RPX0NSRUFURV9TT0NLRVQpOworCQkJCWdvdG8gZXhpdF9sb29wOworCQkJCX0KKwkJCWItPm51bT1yZXQ7CisJCQljLT5zdGF0ZT1CSU9fQ09OTl9TX05CSU87CisJCQlicmVhazsKKworCQljYXNlIEJJT19DT05OX1NfTkJJTzoKKwkJCWlmIChjLT5uYmlvKQorCQkJCXsKKwkJCQlpZiAoIUJJT19zb2NrZXRfbmJpbyhiLT5udW0sMSkpCisJCQkJCXsKKwkJCQkJQklPZXJyKEJJT19GX0NPTk5fU1RBVEUsQklPX1JfRVJST1JfU0VUVElOR19OQklPKTsKKwkJCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsImhvc3Q9IiwKKwkJCQkJCWMtPnBhcmFtX2hvc3RuYW1lLAorCQkJCQkJIjoiLGMtPnBhcmFtX3BvcnQpOworCQkJCQlnb3RvIGV4aXRfbG9vcDsKKwkJCQkJfQorCQkJCX0KKwkJCWMtPnN0YXRlPUJJT19DT05OX1NfQ09OTkVDVDsKKworI2lmIGRlZmluZWQoU09fS0VFUEFMSVZFKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NUEUpCisJCQlpPTE7CisJCQlpPXNldHNvY2tvcHQoYi0+bnVtLFNPTF9TT0NLRVQsU09fS0VFUEFMSVZFLChjaGFyICopJmksc2l6ZW9mKGkpKTsKKwkJCWlmIChpIDwgMCkKKwkJCQl7CisJCQkJU1lTZXJyKFNZU19GX1NPQ0tFVCxnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKSk7CisJCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsImhvc3Q9IixjLT5wYXJhbV9ob3N0bmFtZSwKKwkJCQkJIjoiLGMtPnBhcmFtX3BvcnQpOworCQkJCUJJT2VycihCSU9fRl9DT05OX1NUQVRFLEJJT19SX0tFRVBBTElWRSk7CisJCQkJZ290byBleGl0X2xvb3A7CisJCQkJfQorI2VuZGlmCisJCQlicmVhazsKKworCQljYXNlIEJJT19DT05OX1NfQ09OTkVDVDoKKwkJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJCXJldD1jb25uZWN0KGItPm51bSwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopJmMtPnRoZW0sCisJCQkJc2l6ZW9mKGMtPnRoZW0pKTsKKwkJCWItPnJldHJ5X3JlYXNvbj0wOworCQkJaWYgKHJldCA8IDApCisJCQkJeworCQkJCWlmIChCSU9fc29ja19zaG91bGRfcmV0cnkocmV0KSkKKwkJCQkJeworCQkJCQlCSU9fc2V0X3JldHJ5X3NwZWNpYWwoYik7CisJCQkJCWMtPnN0YXRlPUJJT19DT05OX1NfQkxPQ0tFRF9DT05ORUNUOworCQkJCQliLT5yZXRyeV9yZWFzb249QklPX1JSX0NPTk5FQ1Q7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJU1lTZXJyKFNZU19GX0NPTk5FQ1QsZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkpOworCQkJCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwiaG9zdD0iLAorCQkJCQkJYy0+cGFyYW1faG9zdG5hbWUsCisJCQkJCQkiOiIsYy0+cGFyYW1fcG9ydCk7CisJCQkJCUJJT2VycihCSU9fRl9DT05OX1NUQVRFLEJJT19SX0NPTk5FQ1RfRVJST1IpOworCQkJCQl9CisJCQkJZ290byBleGl0X2xvb3A7CisJCQkJfQorCQkJZWxzZQorCQkJCWMtPnN0YXRlPUJJT19DT05OX1NfT0s7CisJCQlicmVhazsKKworCQljYXNlIEJJT19DT05OX1NfQkxPQ0tFRF9DT05ORUNUOgorCQkJaT1CSU9fc29ja19lcnJvcihiLT5udW0pOworCQkJaWYgKGkpCisJCQkJeworCQkJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJCQlTWVNlcnIoU1lTX0ZfQ09OTkVDVCxpKTsKKwkJCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwiaG9zdD0iLAorCQkJCQljLT5wYXJhbV9ob3N0bmFtZSwKKwkJCQkJIjoiLGMtPnBhcmFtX3BvcnQpOworCQkJCUJJT2VycihCSU9fRl9DT05OX1NUQVRFLEJJT19SX05CSU9fQ09OTkVDVF9FUlJPUik7CisJCQkJcmV0PTA7CisJCQkJZ290byBleGl0X2xvb3A7CisJCQkJfQorCQkJZWxzZQorCQkJCWMtPnN0YXRlPUJJT19DT05OX1NfT0s7CisJCQlicmVhazsKKworCQljYXNlIEJJT19DT05OX1NfT0s6CisJCQlyZXQ9MTsKKwkJCWdvdG8gZXhpdF9sb29wOworCQlkZWZhdWx0OgorCQkJLyogYWJvcnQoKTsgKi8KKwkJCWdvdG8gZXhpdF9sb29wOworCQkJfQorCisJCWlmIChjYiAhPSBOVUxMKQorCQkJeworCQkJaWYgKCEocmV0PWNiKChCSU8gKiliLGMtPnN0YXRlLHJldCkpKQorCQkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwkvKiBMb29wIGRvZXMgbm90IGV4aXQgKi8KK2V4aXRfbG9vcDoKKwlpZiAoY2IgIT0gTlVMTCkKKwkJcmV0PWNiKChCSU8gKiliLGMtPnN0YXRlLHJldCk7CitlbmQ6CisJcmV0dXJuKHJldCk7CisJfQorCitCSU9fQ09OTkVDVCAqQklPX0NPTk5FQ1RfbmV3KHZvaWQpCisJeworCUJJT19DT05ORUNUICpyZXQ7CisKKwlpZiAoKHJldD0oQklPX0NPTk5FQ1QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQklPX0NPTk5FQ1QpKSkgPT0gTlVMTCkKKwkJcmV0dXJuKE5VTEwpOworCXJldC0+c3RhdGU9QklPX0NPTk5fU19CRUZPUkU7CisJcmV0LT5wYXJhbV9ob3N0bmFtZT1OVUxMOworCXJldC0+cGFyYW1fcG9ydD1OVUxMOworCXJldC0+aW5mb19jYWxsYmFjaz1OVUxMOworCXJldC0+bmJpbz0wOworCXJldC0+aXBbMF09MDsKKwlyZXQtPmlwWzFdPTA7CisJcmV0LT5pcFsyXT0wOworCXJldC0+aXBbM109MDsKKwlyZXQtPnBvcnQ9MDsKKwltZW1zZXQoKGNoYXIgKikmcmV0LT50aGVtLDAsc2l6ZW9mKHJldC0+dGhlbSkpOworCXJldHVybihyZXQpOworCX0KKwordm9pZCBCSU9fQ09OTkVDVF9mcmVlKEJJT19DT05ORUNUICphKQorCXsKKwlpZihhID09IE5VTEwpCisJICAgIHJldHVybjsKKworCWlmIChhLT5wYXJhbV9ob3N0bmFtZSAhPSBOVUxMKQorCQlPUEVOU1NMX2ZyZWUoYS0+cGFyYW1faG9zdG5hbWUpOworCWlmIChhLT5wYXJhbV9wb3J0ICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShhLT5wYXJhbV9wb3J0KTsKKwlPUEVOU1NMX2ZyZWUoYSk7CisJfQorCitCSU9fTUVUSE9EICpCSU9fc19jb25uZWN0KHZvaWQpCisJeworCXJldHVybigmbWV0aG9kc19jb25uZWN0cCk7CisJfQorCitzdGF0aWMgaW50IGNvbm5fbmV3KEJJTyAqYmkpCisJeworCWJpLT5pbml0PTA7CisJYmktPm51bT1JTlZBTElEX1NPQ0tFVDsKKwliaS0+ZmxhZ3M9MDsKKwlpZiAoKGJpLT5wdHI9KGNoYXIgKilCSU9fQ09OTkVDVF9uZXcoKSkgPT0gTlVMTCkKKwkJcmV0dXJuKDApOworCWVsc2UKKwkJcmV0dXJuKDEpOworCX0KKworc3RhdGljIHZvaWQgY29ubl9jbG9zZV9zb2NrZXQoQklPICpiaW8pCisJeworCUJJT19DT05ORUNUICpjOworCisJYz0oQklPX0NPTk5FQ1QgKiliaW8tPnB0cjsKKwlpZiAoYmlvLT5udW0gIT0gSU5WQUxJRF9TT0NLRVQpCisJCXsKKwkJLyogT25seSBkbyBhIHNodXRkb3duIGlmIHRoaW5ncyB3ZXJlIGVzdGFibGlzaGVkICovCisJCWlmIChjLT5zdGF0ZSA9PSBCSU9fQ09OTl9TX09LKQorCQkJc2h1dGRvd24oYmlvLT5udW0sMik7CisJCWNsb3Nlc29ja2V0KGJpby0+bnVtKTsKKwkJYmlvLT5udW09SU5WQUxJRF9TT0NLRVQ7CisJCX0KKwl9CisKK3N0YXRpYyBpbnQgY29ubl9mcmVlKEJJTyAqYSkKKwl7CisJQklPX0NPTk5FQ1QgKmRhdGE7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJZGF0YT0oQklPX0NPTk5FQ1QgKilhLT5wdHI7CisJIAorCWlmIChhLT5zaHV0ZG93bikKKwkJeworCQljb25uX2Nsb3NlX3NvY2tldChhKTsKKwkJQklPX0NPTk5FQ1RfZnJlZShkYXRhKTsKKwkJYS0+cHRyPU5VTEw7CisJCWEtPmZsYWdzPTA7CisJCWEtPmluaXQ9MDsKKwkJfQorCXJldHVybigxKTsKKwl9CisJCitzdGF0aWMgaW50IGNvbm5fcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpCisJeworCWludCByZXQ9MDsKKwlCSU9fQ09OTkVDVCAqZGF0YTsKKworCWRhdGE9KEJJT19DT05ORUNUICopYi0+cHRyOworCWlmIChkYXRhLT5zdGF0ZSAhPSBCSU9fQ09OTl9TX09LKQorCQl7CisJCXJldD1jb25uX3N0YXRlKGIsZGF0YSk7CisJCWlmIChyZXQgPD0gMCkKKwkJCQlyZXR1cm4ocmV0KTsKKwkJfQorCisJaWYgKG91dCAhPSBOVUxMKQorCQl7CisJCWNsZWFyX3NvY2tldF9lcnJvcigpOworCQlyZXQ9cmVhZHNvY2tldChiLT5udW0sb3V0LG91dGwpOworCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCWlmIChyZXQgPD0gMCkKKwkJCXsKKwkJCWlmIChCSU9fc29ja19zaG91bGRfcmV0cnkocmV0KSkKKwkJCQlCSU9fc2V0X3JldHJ5X3JlYWQoYik7CisJCQl9CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgY29ubl93cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5sKQorCXsKKwlpbnQgcmV0OworCUJJT19DT05ORUNUICpkYXRhOworCisJZGF0YT0oQklPX0NPTk5FQ1QgKiliLT5wdHI7CisJaWYgKGRhdGEtPnN0YXRlICE9IEJJT19DT05OX1NfT0spCisJCXsKKwkJcmV0PWNvbm5fc3RhdGUoYixkYXRhKTsKKwkJaWYgKHJldCA8PSAwKSByZXR1cm4ocmV0KTsKKwkJfQorCisJY2xlYXJfc29ja2V0X2Vycm9yKCk7CisJcmV0PXdyaXRlc29ja2V0KGItPm51bSxpbixpbmwpOworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlpZiAocmV0IDw9IDApCisJCXsKKwkJaWYgKEJJT19zb2NrX3Nob3VsZF9yZXRyeShyZXQpKQorCQkJQklPX3NldF9yZXRyeV93cml0ZShiKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgY29ubl9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJQklPICpkYmlvOworCWludCAqaXA7CisJY29uc3QgY2hhciAqKnBwdHI7CisJbG9uZyByZXQ9MTsKKwlCSU9fQ09OTkVDVCAqZGF0YTsKKworCWRhdGE9KEJJT19DT05ORUNUICopYi0+cHRyOworCisJc3dpdGNoIChjbWQpCisJCXsKKwljYXNlIEJJT19DVFJMX1JFU0VUOgorCQlyZXQ9MDsKKwkJZGF0YS0+c3RhdGU9QklPX0NPTk5fU19CRUZPUkU7CisJCWNvbm5fY2xvc2Vfc29ja2V0KGIpOworCQliLT5mbGFncz0wOworCQlicmVhazsKKwljYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6CisJCS8qIHVzZSB0aGlzIG9uZSB0byBzdGFydCB0aGUgY29ubmVjdGlvbiAqLworCQlpZiAoZGF0YS0+c3RhdGUgIT0gQklPX0NPTk5fU19PSykKKwkJCXJldD0obG9uZyljb25uX3N0YXRlKGIsZGF0YSk7CisJCWVsc2UKKwkJCXJldD0xOworCQlicmVhazsKKwljYXNlIEJJT19DX0dFVF9DT05ORUNUOgorCQlpZiAocHRyICE9IE5VTEwpCisJCQl7CisJCQlwcHRyPShjb25zdCBjaGFyICoqKXB0cjsKKwkJCWlmIChudW0gPT0gMCkKKwkJCQl7CisJCQkJKnBwdHI9ZGF0YS0+cGFyYW1faG9zdG5hbWU7CisKKwkJCQl9CisJCQllbHNlIGlmIChudW0gPT0gMSkKKwkJCQl7CisJCQkJKnBwdHI9ZGF0YS0+cGFyYW1fcG9ydDsKKwkJCQl9CisJCQllbHNlIGlmIChudW0gPT0gMikKKwkJCQl7CisJCQkJKnBwdHI9IChjaGFyICopJihkYXRhLT5pcFswXSk7CisJCQkJfQorCQkJZWxzZSBpZiAobnVtID09IDMpCisJCQkJeworCQkJCSooKGludCAqKXB0cik9ZGF0YS0+cG9ydDsKKwkJCQl9CisJCQlpZiAoKCFiLT5pbml0KSB8fCAocHRyID09IE5VTEwpKQorCQkJCSpwcHRyPSJub3QgaW5pdGlhbGl6ZWQiOworCQkJcmV0PTE7CisJCQl9CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX0NPTk5FQ1Q6CisJCWlmIChwdHIgIT0gTlVMTCkKKwkJCXsKKwkJCWItPmluaXQ9MTsKKwkJCWlmIChudW0gPT0gMCkKKwkJCQl7CisJCQkJaWYgKGRhdGEtPnBhcmFtX2hvc3RuYW1lICE9IE5VTEwpCisJCQkJCU9QRU5TU0xfZnJlZShkYXRhLT5wYXJhbV9ob3N0bmFtZSk7CisJCQkJZGF0YS0+cGFyYW1faG9zdG5hbWU9QlVGX3N0cmR1cChwdHIpOworCQkJCX0KKwkJCWVsc2UgaWYgKG51bSA9PSAxKQorCQkJCXsKKwkJCQlpZiAoZGF0YS0+cGFyYW1fcG9ydCAhPSBOVUxMKQorCQkJCQlPUEVOU1NMX2ZyZWUoZGF0YS0+cGFyYW1fcG9ydCk7CisJCQkJZGF0YS0+cGFyYW1fcG9ydD1CVUZfc3RyZHVwKHB0cik7CisJCQkJfQorCQkJZWxzZSBpZiAobnVtID09IDIpCisJCQkJeworCQkJCWNoYXIgYnVmWzE2XTsKKwkJCQl1bnNpZ25lZCBjaGFyICpwID0gcHRyOworCisJCQkJQklPX3NucHJpbnRmKGJ1ZixzaXplb2YgYnVmLCIlZC4lZC4lZC4lZCIsCisJCQkJCSAgICAgcFswXSxwWzFdLHBbMl0scFszXSk7CisJCQkJaWYgKGRhdGEtPnBhcmFtX2hvc3RuYW1lICE9IE5VTEwpCisJCQkJCU9QRU5TU0xfZnJlZShkYXRhLT5wYXJhbV9ob3N0bmFtZSk7CisJCQkJZGF0YS0+cGFyYW1faG9zdG5hbWU9QlVGX3N0cmR1cChidWYpOworCQkJCW1lbWNweSgmKGRhdGEtPmlwWzBdKSxwdHIsNCk7CisJCQkJfQorCQkJZWxzZSBpZiAobnVtID09IDMpCisJCQkJeworCQkJCWNoYXIgYnVmW0RFQ0lNQUxfU0laRShpbnQpKzFdOworCisJCQkJQklPX3NucHJpbnRmKGJ1ZixzaXplb2YgYnVmLCIlZCIsKihpbnQgKilwdHIpOworCQkJCWlmIChkYXRhLT5wYXJhbV9wb3J0ICE9IE5VTEwpCisJCQkJCU9QRU5TU0xfZnJlZShkYXRhLT5wYXJhbV9wb3J0KTsKKwkJCQlkYXRhLT5wYXJhbV9wb3J0PUJVRl9zdHJkdXAoYnVmKTsKKwkJCQlkYXRhLT5wb3J0PSAqKGludCAqKXB0cjsKKwkJCQl9CisJCQl9CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX05CSU86CisJCWRhdGEtPm5iaW89KGludCludW07CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX0ZEOgorCQlpZiAoYi0+aW5pdCkKKwkJCXsKKwkJCWlwPShpbnQgKilwdHI7CisJCQlpZiAoaXAgIT0gTlVMTCkKKwkJCQkqaXA9Yi0+bnVtOworCQkJcmV0PWItPm51bTsKKwkJCX0KKwkJZWxzZQorCQkJcmV0PSAtMTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9HRVRfQ0xPU0U6CisJCXJldD1iLT5zaHV0ZG93bjsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9TRVRfQ0xPU0U6CisJCWItPnNodXRkb3duPShpbnQpbnVtOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1BFTkRJTkc6CisJY2FzZSBCSU9fQ1RSTF9XUEVORElORzoKKwkJcmV0PTA7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRkxVU0g6CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRFVQOgorCQl7CisJCWRiaW89KEJJTyAqKXB0cjsKKwkJaWYgKGRhdGEtPnBhcmFtX3BvcnQpCisJCQlCSU9fc2V0X2Nvbm5fcG9ydChkYmlvLGRhdGEtPnBhcmFtX3BvcnQpOworCQlpZiAoZGF0YS0+cGFyYW1faG9zdG5hbWUpCisJCQlCSU9fc2V0X2Nvbm5faG9zdG5hbWUoZGJpbyxkYXRhLT5wYXJhbV9ob3N0bmFtZSk7CisJCUJJT19zZXRfbmJpbyhkYmlvLGRhdGEtPm5iaW8pOworCQkvKiBGSVhNRTogdGhlIGNhc3Qgb2YgdGhlIGZ1bmN0aW9uIHNlZW1zIHVubGlrZWx5IHRvIGJlIGEgZ29vZCBpZGVhICovCisgICAgICAgICAgICAgICAgKHZvaWQpQklPX3NldF9pbmZvX2NhbGxiYWNrKGRiaW8sKGJpb19pbmZvX2NiICopZGF0YS0+aW5mb19jYWxsYmFjayk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9TRVRfQ0FMTEJBQ0s6CisJCXsKKyNpZiAwIC8qIEZJWE1FOiBTaG91bGQgdGhpcyBiZSB1c2VkPyAgLS0gUmljaGFyZCBMZXZpdHRlICovCisJCUJJT2VycihCSU9fRl9DT05OX0NUUkwsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldCA9IC0xOworI2Vsc2UKKwkJcmV0PTA7CisjZW5kaWYKKwkJfQorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0dFVF9DQUxMQkFDSzoKKwkJeworCQlpbnQgKCoqZnB0cikoY29uc3QgQklPICpiaW8saW50IHN0YXRlLGludCB4cmV0KTsKKworCQlmcHRyPShpbnQgKCoqKShjb25zdCBCSU8gKmJpbyxpbnQgc3RhdGUsaW50IHhyZXQpKXB0cjsKKwkJKmZwdHI9ZGF0YS0+aW5mb19jYWxsYmFjazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQ9MDsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIGNvbm5fY2FsbGJhY2tfY3RybChCSU8gKmIsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCkKKwl7CisJbG9uZyByZXQ9MTsKKwlCSU9fQ09OTkVDVCAqZGF0YTsKKworCWRhdGE9KEJJT19DT05ORUNUICopYi0+cHRyOworCisJc3dpdGNoIChjbWQpCisJCXsKKwljYXNlIEJJT19DVFJMX1NFVF9DQUxMQkFDSzoKKwkJeworCQlkYXRhLT5pbmZvX2NhbGxiYWNrPShpbnQgKCopKGNvbnN0IHN0cnVjdCBiaW9fc3QgKiwgaW50LCBpbnQpKWZwOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldD0wOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBjb25uX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKQorCXsKKwlpbnQgbixyZXQ7CisKKwluPXN0cmxlbihzdHIpOworCXJldD1jb25uX3dyaXRlKGJwLHN0cixuKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK0JJTyAqQklPX25ld19jb25uZWN0KGNoYXIgKnN0cikKKwl7CisJQklPICpyZXQ7CisKKwlyZXQ9QklPX25ldyhCSU9fc19jb25uZWN0KCkpOworCWlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCWlmIChCSU9fc2V0X2Nvbm5faG9zdG5hbWUocmV0LHN0cikpCisJCXJldHVybihyZXQpOworCWVsc2UKKwkJeworCQlCSU9fZnJlZShyZXQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwl9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19kZ3JhbS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfZGdyYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjdlMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfZGdyYW0uYwpAQCAtMCwwICsxLDgzMCBAQAorLyogY3J5cHRvL2Jpby9iaW9fZGdyYW0uYyAqLworLyogCisgKiBEVExTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgTmFnZW5kcmEgTW9kYWR1Z3UKKyAqIChuYWdlbmRyYUBjcy5zdGFuZm9yZC5lZHUpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0IDIwMDUuICAKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ER1JBTQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2RlZmluZSBVU0VfU09DS0VUUworI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpCisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfU1lTX0xJTlVYCisjZGVmaW5lIElQX01UVSAgICAgIDE0IC8qIGxpbnV4IGlzIGxhbWUgKi8KKyNlbmRpZgorCisjaWZkZWYgV0FUVDMyCisjZGVmaW5lIHNvY2tfd3JpdGUgU29ja1dyaXRlICAvKiBXYXR0LTMyIHVzZXMgc2FtZSBuYW1lcyAqLworI2RlZmluZSBzb2NrX3JlYWQgIFNvY2tSZWFkCisjZGVmaW5lIHNvY2tfcHV0cyAgU29ja1B1dHMKKyNlbmRpZgorCitzdGF0aWMgaW50IGRncmFtX3dyaXRlKEJJTyAqaCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtKTsKK3N0YXRpYyBpbnQgZGdyYW1fcmVhZChCSU8gKmgsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIGludCBkZ3JhbV9wdXRzKEJJTyAqaCwgY29uc3QgY2hhciAqc3RyKTsKK3N0YXRpYyBsb25nIGRncmFtX2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBkZ3JhbV9uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgZGdyYW1fZnJlZShCSU8gKmRhdGEpOworc3RhdGljIGludCBkZ3JhbV9jbGVhcihCSU8gKmJpbyk7CisKK3N0YXRpYyBpbnQgQklPX2RncmFtX3Nob3VsZF9yZXRyeShpbnQgcyk7CisKK3N0YXRpYyB2b2lkIGdldF9jdXJyZW50X3RpbWUoc3RydWN0IHRpbWV2YWwgKnQpOworCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX2RncmFtcD0KKwl7CisJQklPX1RZUEVfREdSQU0sCisJImRhdGFncmFtIHNvY2tldCIsCisJZGdyYW1fd3JpdGUsCisJZGdyYW1fcmVhZCwKKwlkZ3JhbV9wdXRzLAorCU5VTEwsIC8qIGRncmFtX2dldHMsICovCisJZGdyYW1fY3RybCwKKwlkZ3JhbV9uZXcsCisJZGdyYW1fZnJlZSwKKwlOVUxMLAorCX07CisKK3R5cGVkZWYgc3RydWN0IGJpb19kZ3JhbV9kYXRhX3N0CisJeworCXVuaW9uIHsKKwkJc3RydWN0IHNvY2thZGRyIHNhOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FfaW47CisjaWYgT1BFTlNTTF9VU0VfSVBWNgorCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNhX2luNjsKKyNlbmRpZgorCX0gcGVlcjsKKwl1bnNpZ25lZCBpbnQgY29ubmVjdGVkOworCXVuc2lnbmVkIGludCBfZXJybm87CisJdW5zaWduZWQgaW50IG10dTsKKwlzdHJ1Y3QgdGltZXZhbCBuZXh0X3RpbWVvdXQ7CisJc3RydWN0IHRpbWV2YWwgc29ja2V0X3RpbWVvdXQ7CisJfSBiaW9fZGdyYW1fZGF0YTsKKworQklPX01FVEhPRCAqQklPX3NfZGF0YWdyYW0odm9pZCkKKwl7CisJcmV0dXJuKCZtZXRob2RzX2RncmFtcCk7CisJfQorCitCSU8gKkJJT19uZXdfZGdyYW0oaW50IGZkLCBpbnQgY2xvc2VfZmxhZykKKwl7CisJQklPICpyZXQ7CisKKwlyZXQ9QklPX25ldyhCSU9fc19kYXRhZ3JhbSgpKTsKKwlpZiAocmV0ID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlCSU9fc2V0X2ZkKHJldCxmZCxjbG9zZV9mbGFnKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgZGdyYW1fbmV3KEJJTyAqYmkpCisJeworCWJpb19kZ3JhbV9kYXRhICpkYXRhID0gTlVMTDsKKworCWJpLT5pbml0PTA7CisJYmktPm51bT0wOworCWRhdGEgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoYmlvX2RncmFtX2RhdGEpKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwltZW1zZXQoZGF0YSwgMHgwMCwgc2l6ZW9mKGJpb19kZ3JhbV9kYXRhKSk7CisgICAgYmktPnB0ciA9IGRhdGE7CisKKwliaS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IGRncmFtX2ZyZWUoQklPICphKQorCXsKKwliaW9fZGdyYW1fZGF0YSAqZGF0YTsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKwlpZiAoICEgZGdyYW1fY2xlYXIoYSkpCisJCXJldHVybiAwOworCisJZGF0YSA9IChiaW9fZGdyYW1fZGF0YSAqKWEtPnB0cjsKKwlpZihkYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShkYXRhKTsKKworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgZGdyYW1fY2xlYXIoQklPICphKQorCXsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKGEtPnNodXRkb3duKQorCQl7CisJCWlmIChhLT5pbml0KQorCQkJeworCQkJU0hVVERPV04yKGEtPm51bSk7CisJCQl9CisJCWEtPmluaXQ9MDsKKwkJYS0+ZmxhZ3M9MDsKKwkJfQorCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyB2b2lkIGRncmFtX2FkanVzdF9yY3ZfdGltZW91dChCSU8gKmIpCisJeworI2lmIGRlZmluZWQoU09fUkNWVElNRU8pCisJYmlvX2RncmFtX2RhdGEgKmRhdGEgPSAoYmlvX2RncmFtX2RhdGEgKiliLT5wdHI7CisJaW50IHN6ID0gc2l6ZW9mKGludCk7CisKKwkvKiBJcyBhIHRpbWVyIGFjdGl2ZT8gKi8KKwlpZiAoZGF0YS0+bmV4dF90aW1lb3V0LnR2X3NlYyA+IDAgfHwgZGF0YS0+bmV4dF90aW1lb3V0LnR2X3VzZWMgPiAwKQorCQl7CisJCXN0cnVjdCB0aW1ldmFsIHRpbWVub3csIHRpbWVsZWZ0OworCisJCS8qIFJlYWQgY3VycmVudCBzb2NrZXQgdGltZW91dCAqLworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTkRPV1MKKwkJaW50IHRpbWVvdXQ7CisJCWlmIChnZXRzb2Nrb3B0KGItPm51bSwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sCisJCQkJCSAgICh2b2lkKikmdGltZW91dCwgJnN6KSA8IDApCisJCQl7IHBlcnJvcigiZ2V0c29ja29wdCIpOyB9CisJCWVsc2UKKwkJCXsKKwkJCWRhdGEtPnNvY2tldF90aW1lb3V0LnR2X3NlYyA9IHRpbWVvdXQgLyAxMDAwOworCQkJZGF0YS0+c29ja2V0X3RpbWVvdXQudHZfdXNlYyA9ICh0aW1lb3V0ICUgMTAwMCkgKiAxMDAwOworCQkJfQorI2Vsc2UKKwkJaWYgKCBnZXRzb2Nrb3B0KGItPm51bSwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sIAorCQkJCQkJJihkYXRhLT5zb2NrZXRfdGltZW91dCksICh2b2lkICopJnN6KSA8IDApCisJCQl7IHBlcnJvcigiZ2V0c29ja29wdCIpOyB9CisjZW5kaWYKKworCQkvKiBHZXQgY3VycmVudCB0aW1lICovCisJCWdldF9jdXJyZW50X3RpbWUoJnRpbWVub3cpOworCisJCS8qIENhbGN1bGF0ZSB0aW1lIGxlZnQgdW50aWwgdGltZXIgZXhwaXJlcyAqLworCQltZW1jcHkoJnRpbWVsZWZ0LCAmKGRhdGEtPm5leHRfdGltZW91dCksIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCQl0aW1lbGVmdC50dl9zZWMgLT0gdGltZW5vdy50dl9zZWM7CisJCXRpbWVsZWZ0LnR2X3VzZWMgLT0gdGltZW5vdy50dl91c2VjOworCQlpZiAodGltZWxlZnQudHZfdXNlYyA8IDApCisJCQl7CisJCQl0aW1lbGVmdC50dl9zZWMtLTsKKwkJCXRpbWVsZWZ0LnR2X3VzZWMgKz0gMTAwMDAwMDsKKwkJCX0KKworCQlpZiAodGltZWxlZnQudHZfc2VjIDwgMCkKKwkJCXsKKwkJCXRpbWVsZWZ0LnR2X3NlYyA9IDA7CisJCQl0aW1lbGVmdC50dl91c2VjID0gMTsKKwkJCX0KKworCQkvKiBBZGp1c3Qgc29ja2V0IHRpbWVvdXQgaWYgbmV4dCBoYW5kaGFrZSBtZXNzYWdlIHRpbWVyCisJCSAqIHdpbGwgZXhwaXJlIGVhcmxpZXIuCisJCSAqLworCQlpZiAoKGRhdGEtPnNvY2tldF90aW1lb3V0LnR2X3NlYyA9PSAwICYmIGRhdGEtPnNvY2tldF90aW1lb3V0LnR2X3VzZWMgPT0gMCkgfHwKKwkJCShkYXRhLT5zb2NrZXRfdGltZW91dC50dl9zZWMgPiB0aW1lbGVmdC50dl9zZWMpIHx8CisJCQkoZGF0YS0+c29ja2V0X3RpbWVvdXQudHZfc2VjID09IHRpbWVsZWZ0LnR2X3NlYyAmJgorCQkJIGRhdGEtPnNvY2tldF90aW1lb3V0LnR2X3VzZWMgPj0gdGltZWxlZnQudHZfdXNlYykpCisJCQl7CisjaWZkZWYgT1BFTlNTTF9TWVNfV0lORE9XUworCQkJdGltZW91dCA9IHRpbWVsZWZ0LnR2X3NlYyAqIDEwMDAgKyB0aW1lbGVmdC50dl91c2VjIC8gMTAwMDsKKwkJCWlmIChzZXRzb2Nrb3B0KGItPm51bSwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sCisJCQkJCQkgICAodm9pZCopJnRpbWVvdXQsIHNpemVvZih0aW1lb3V0KSkgPCAwKQorCQkJCXsgcGVycm9yKCJzZXRzb2Nrb3B0Iik7IH0KKyNlbHNlCisJCQlpZiAoIHNldHNvY2tvcHQoYi0+bnVtLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgJnRpbWVsZWZ0LAorCQkJCQkJCXNpemVvZihzdHJ1Y3QgdGltZXZhbCkpIDwgMCkKKwkJCQl7IHBlcnJvcigic2V0c29ja29wdCIpOyB9CisjZW5kaWYKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCitzdGF0aWMgdm9pZCBkZ3JhbV9yZXNldF9yY3ZfdGltZW91dChCSU8gKmIpCisJeworI2lmIGRlZmluZWQoU09fUkNWVElNRU8pCisJYmlvX2RncmFtX2RhdGEgKmRhdGEgPSAoYmlvX2RncmFtX2RhdGEgKiliLT5wdHI7CisKKwkvKiBJcyBhIHRpbWVyIGFjdGl2ZT8gKi8KKwlpZiAoZGF0YS0+bmV4dF90aW1lb3V0LnR2X3NlYyA+IDAgfHwgZGF0YS0+bmV4dF90aW1lb3V0LnR2X3VzZWMgPiAwKQorCQl7CisjaWZkZWYgT1BFTlNTTF9TWVNfV0lORE9XUworCQlpbnQgdGltZW91dCA9IGRhdGEtPnNvY2tldF90aW1lb3V0LnR2X3NlYyAqIDEwMDAgKworCQkJCQkgIGRhdGEtPnNvY2tldF90aW1lb3V0LnR2X3VzZWMgLyAxMDAwOworCQlpZiAoc2V0c29ja29wdChiLT5udW0sIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLAorCQkJCQkgICAodm9pZCopJnRpbWVvdXQsIHNpemVvZih0aW1lb3V0KSkgPCAwKQorCQkJeyBwZXJyb3IoInNldHNvY2tvcHQiKTsgfQorI2Vsc2UKKwkJaWYgKCBzZXRzb2Nrb3B0KGItPm51bSwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sICYoZGF0YS0+c29ja2V0X3RpbWVvdXQpLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSkgPCAwKQorCQkJeyBwZXJyb3IoInNldHNvY2tvcHQiKTsgfQorI2VuZGlmCisJCX0KKyNlbmRpZgorCX0KKworc3RhdGljIGludCBkZ3JhbV9yZWFkKEJJTyAqYiwgY2hhciAqb3V0LCBpbnQgb3V0bCkKKwl7CisJaW50IHJldD0wOworCWJpb19kZ3JhbV9kYXRhICpkYXRhID0gKGJpb19kZ3JhbV9kYXRhICopYi0+cHRyOworCisJc3RydWN0CXsKKwkvKgorCSAqIFNlZSBjb21tZW50YXJ5IGluIGJfc29jay5jLiA8YXBwcm8+CisJICovCisJdW5pb24JeyBzaXplX3QgczsgaW50IGk7IH0gbGVuOworCXVuaW9uCXsKKwkJc3RydWN0IHNvY2thZGRyIHNhOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FfaW47CisjaWYgT1BFTlNTTF9VU0VfSVBWNgorCQlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNhX2luNjsKKyNlbmRpZgorCQl9IHBlZXI7CisJfSBzYTsKKworCXNhLmxlbi5zPTA7CisJc2EubGVuLmk9c2l6ZW9mKHNhLnBlZXIpOworCisJaWYgKG91dCAhPSBOVUxMKQorCQl7CisJCWNsZWFyX3NvY2tldF9lcnJvcigpOworCQltZW1zZXQoJnNhLnBlZXIsIDB4MDAsIHNpemVvZihzYS5wZWVyKSk7CisJCWRncmFtX2FkanVzdF9yY3ZfdGltZW91dChiKTsKKwkJcmV0PXJlY3Zmcm9tKGItPm51bSxvdXQsb3V0bCwwLCZzYS5wZWVyLnNhLCh2b2lkICopJnNhLmxlbik7CisJCWlmIChzaXplb2Yoc2EubGVuLmkpIT1zaXplb2Yoc2EubGVuLnMpICYmIHNhLmxlbi5pPT0wKQorCQkJeworCQkJT1BFTlNTTF9hc3NlcnQoc2EubGVuLnM8PXNpemVvZihzYS5wZWVyKSk7CisJCQlzYS5sZW4uaSA9IChpbnQpc2EubGVuLnM7CisJCQl9CisJCWRncmFtX3Jlc2V0X3Jjdl90aW1lb3V0KGIpOworCisJCWlmICggISBkYXRhLT5jb25uZWN0ZWQgICYmIHJldCA+PSAwKQorCQkJQklPX2N0cmwoYiwgQklPX0NUUkxfREdSQU1fU0VUX1BFRVIsIDAsICZzYS5wZWVyKTsKKworCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCWlmIChyZXQgPCAwKQorCQkJeworCQkJaWYgKEJJT19kZ3JhbV9zaG91bGRfcmV0cnkocmV0KSkKKwkJCQl7CisJCQkJQklPX3NldF9yZXRyeV9yZWFkKGIpOworCQkJCWRhdGEtPl9lcnJubyA9IGdldF9sYXN0X3NvY2tldF9lcnJvcigpOworCQkJCX0KKwkJCX0KKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBkZ3JhbV93cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5sKQorCXsKKwlpbnQgcmV0OworCWJpb19kZ3JhbV9kYXRhICpkYXRhID0gKGJpb19kZ3JhbV9kYXRhICopYi0+cHRyOworCWNsZWFyX3NvY2tldF9lcnJvcigpOworCisJaWYgKCBkYXRhLT5jb25uZWN0ZWQgKQorCQlyZXQ9d3JpdGVzb2NrZXQoYi0+bnVtLGluLGlubCk7CisJZWxzZQorCQl7CisJCWludCBwZWVybGVuID0gc2l6ZW9mKGRhdGEtPnBlZXIpOworCisJCWlmIChkYXRhLT5wZWVyLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKQorCQkJcGVlcmxlbiA9IHNpemVvZihkYXRhLT5wZWVyLnNhX2luKTsKKyNpZiBPUEVOU1NMX1VTRV9JVlA2CisJCWVsc2UgaWYgKGRhdGEtPnBlZXIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJcGVlcmxlbiA9IHNpemVvZihkYXRhLT5wZWVyLnNhX2luNik7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE5FVFdBUkVfQ0xJQikgJiYgZGVmaW5lZChORVRXQVJFX0JTRFNPQ0spCisJCXJldD1zZW5kdG8oYi0+bnVtLCAoY2hhciAqKWluLCBpbmwsIDAsICZkYXRhLT5wZWVyLnNhLCBwZWVybGVuKTsKKyNlbHNlCisJCXJldD1zZW5kdG8oYi0+bnVtLCBpbiwgaW5sLCAwLCAmZGF0YS0+cGVlci5zYSwgcGVlcmxlbik7CisjZW5kaWYKKwkJfQorCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCWlmIChyZXQgPD0gMCkKKwkJeworCQlpZiAoQklPX2RncmFtX3Nob3VsZF9yZXRyeShyZXQpKQorCQkJeworCQkJQklPX3NldF9yZXRyeV93cml0ZShiKTsgIAorCQkJZGF0YS0+X2Vycm5vID0gZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk7CisKKyNpZiAwIC8qIGhpZ2hlciBsYXllcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBxdWVyeWluZyBNVFUsIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYgKCBkYXRhLT5fZXJybm8gPT0gRU1TR1NJWkUpCisJCQkJLyogcmV0cmlldmUgdGhlIG5ldyBNVFUgKi8KKwkJCQlCSU9fY3RybChiLCBCSU9fQ1RSTF9ER1JBTV9RVUVSWV9NVFUsIDAsIE5VTEwpOworI2VuZGlmCisJCQl9CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIGRncmFtX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlsb25nIHJldD0xOworCWludCAqaXA7CisJc3RydWN0IHNvY2thZGRyICp0byA9IE5VTEw7CisJYmlvX2RncmFtX2RhdGEgKmRhdGEgPSBOVUxMOworI2lmIGRlZmluZWQoSVBfTVRVX0RJU0NPVkVSKSB8fCBkZWZpbmVkKElQX01UVSkKKwlsb25nIHNvY2tvcHRfdmFsID0gMDsKKwl1bnNpZ25lZCBpbnQgc29ja29wdF9sZW4gPSAwOworI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9TWVNfTElOVVgKKwlzb2NrbGVuX3QgYWRkcl9sZW47CisJdW5pb24JeworCQlzdHJ1Y3Qgc29ja2FkZHIJc2E7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBzNDsKKyNpZiBPUEVOU1NMX1VTRV9JUFY2CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgczY7CisjZW5kaWYKKwkJfSBhZGRyOworI2VuZGlmCisKKwlkYXRhID0gKGJpb19kZ3JhbV9kYXRhICopYi0+cHRyOworCisJc3dpdGNoIChjbWQpCisJCXsKKwljYXNlIEJJT19DVFJMX1JFU0VUOgorCQludW09MDsKKwljYXNlIEJJT19DX0ZJTEVfU0VFSzoKKwkJcmV0PTA7CisJCWJyZWFrOworCWNhc2UgQklPX0NfRklMRV9URUxMOgorCWNhc2UgQklPX0NUUkxfSU5GTzoKKwkJcmV0PTA7CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX0ZEOgorCQlkZ3JhbV9jbGVhcihiKTsKKwkJYi0+bnVtPSAqKChpbnQgKilwdHIpOworCQliLT5zaHV0ZG93bj0oaW50KW51bTsKKwkJYi0+aW5pdD0xOworCQlicmVhazsKKwljYXNlIEJJT19DX0dFVF9GRDoKKwkJaWYgKGItPmluaXQpCisJCQl7CisJCQlpcD0oaW50ICopcHRyOworCQkJaWYgKGlwICE9IE5VTEwpICppcD1iLT5udW07CisJCQlyZXQ9Yi0+bnVtOworCQkJfQorCQllbHNlCisJCQlyZXQ9IC0xOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0dFVF9DTE9TRToKKwkJcmV0PWItPnNodXRkb3duOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKwkJYi0+c2h1dGRvd249KGludCludW07CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfUEVORElORzoKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCQlyZXQ9MDsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9EVVA6CisJY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKwkJcmV0PTE7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfREdSQU1fQ09OTkVDVDoKKwkJdG8gPSAoc3RydWN0IHNvY2thZGRyICopcHRyOworI2lmIDAKKwkJaWYgKGNvbm5lY3QoYi0+bnVtLCB0bywgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpIDwgMCkKKwkJCXsgcGVycm9yKCJjb25uZWN0Iik7IHJldCA9IDA7IH0KKwkJZWxzZQorCQkJeworI2VuZGlmCisJCQlzd2l0Y2ggKHRvLT5zYV9mYW1pbHkpCisJCQkJeworCQkJCWNhc2UgQUZfSU5FVDoKKwkJCQkJbWVtY3B5KCZkYXRhLT5wZWVyLHRvLHNpemVvZihkYXRhLT5wZWVyLnNhX2luKSk7CisJCQkJCWJyZWFrOworI2lmIE9QRU5TU0xfVVNFX0lQVjYKKwkJCQljYXNlIEFGX0lORVQ2OgorCQkJCQltZW1jcHkoJmRhdGEtPnBlZXIsdG8sc2l6ZW9mKGRhdGEtPnBlZXIuc2FfaW42KSk7CisJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJZGVmYXVsdDoKKwkJCQkJbWVtY3B5KCZkYXRhLT5wZWVyLHRvLHNpemVvZihkYXRhLT5wZWVyLnNhKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKyNpZiAwCisJCQl9CisjZW5kaWYKKwkJYnJlYWs7CisJCS8qIChMaW51eClrZXJuZWwgc2V0cyBERiBiaXQgb24gb3V0Z29pbmcgSVAgcGFja2V0cyAqLworCWNhc2UgQklPX0NUUkxfREdSQU1fTVRVX0RJU0NPVkVSOgorI2lmZGVmIE9QRU5TU0xfU1lTX0xJTlVYCisJCWFkZHJfbGVuID0gKHNvY2tsZW5fdClzaXplb2YoYWRkcik7CisJCW1lbXNldCgodm9pZCAqKSZhZGRyLCAwLCBzaXplb2YoYWRkcikpOworCQlpZiAoZ2V0c29ja25hbWUoYi0+bnVtLCAmYWRkci5zYSwgJmFkZHJfbGVuKSA8IDApCisJCQl7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCQl9CisJCXNvY2tvcHRfbGVuID0gc2l6ZW9mKHNvY2tvcHRfdmFsKTsKKwkJc3dpdGNoIChhZGRyLnNhLnNhX2ZhbWlseSkKKwkJCXsKKwkJY2FzZSBBRl9JTkVUOgorCQkJc29ja29wdF92YWwgPSBJUF9QTVRVRElTQ19ETzsKKwkJCWlmICgocmV0ID0gc2V0c29ja29wdChiLT5udW0sIElQUFJPVE9fSVAsIElQX01UVV9ESVNDT1ZFUiwKKwkJCQkmc29ja29wdF92YWwsIHNpemVvZihzb2Nrb3B0X3ZhbCkpKSA8IDApCisJCQkJcGVycm9yKCJzZXRzb2Nrb3B0Iik7CisJCQlicmVhazsKKyNpZiBPUEVOU1NMX1VTRV9JUFY2ICYmIGRlZmluZWQoSVBWNl9NVFVfRElTQ09WRVIpCisJCWNhc2UgQUZfSU5FVDY6CisJCQlzb2Nrb3B0X3ZhbCA9IElQVjZfUE1UVURJU0NfRE87CisJCQlpZiAoKHJldCA9IHNldHNvY2tvcHQoYi0+bnVtLCBJUFBST1RPX0lQVjYsIElQVjZfTVRVX0RJU0NPVkVSLAorCQkJCSZzb2Nrb3B0X3ZhbCwgc2l6ZW9mKHNvY2tvcHRfdmFsKSkpIDwgMCkKKwkJCQlwZXJyb3IoInNldHNvY2tvcHQiKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQkJfQorCQlyZXQgPSAtMTsKKyNlbHNlCisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBCSU9fQ1RSTF9ER1JBTV9RVUVSWV9NVFU6CisjaWZkZWYgT1BFTlNTTF9TWVNfTElOVVgKKwkJYWRkcl9sZW4gPSAoc29ja2xlbl90KXNpemVvZihhZGRyKTsKKwkJbWVtc2V0KCh2b2lkICopJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJCWlmIChnZXRzb2NrbmFtZShiLT5udW0sICZhZGRyLnNhLCAmYWRkcl9sZW4pIDwgMCkKKwkJCXsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJCX0KKwkJc29ja29wdF9sZW4gPSBzaXplb2Yoc29ja29wdF92YWwpOworCQlzd2l0Y2ggKGFkZHIuc2Euc2FfZmFtaWx5KQorCQkJeworCQljYXNlIEFGX0lORVQ6CisJCQlpZiAoKHJldCA9IGdldHNvY2tvcHQoYi0+bnVtLCBJUFBST1RPX0lQLCBJUF9NVFUsICh2b2lkICopJnNvY2tvcHRfdmFsLAorCQkJCSZzb2Nrb3B0X2xlbikpIDwgMCB8fCBzb2Nrb3B0X3ZhbCA8IDApCisJCQkJeworCQkJCXJldCA9IDA7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkvKiB3ZSBhc3N1bWUgdGhhdCB0aGUgdHJhbnNwb3J0IHByb3RvY29sIGlzIFVEUCBhbmQgbm8KKwkJCQkgKiBJUCBvcHRpb25zIGFyZSB1c2VkLgorCQkJCSAqLworCQkJCWRhdGEtPm10dSA9IHNvY2tvcHRfdmFsIC0gOCAtIDIwOworCQkJCXJldCA9IGRhdGEtPm10dTsKKwkJCQl9CisJCQlicmVhazsKKyNpZiBPUEVOU1NMX1VTRV9JUFY2ICYmIGRlZmluZWQoSVBWNl9NVFUpCisJCWNhc2UgQUZfSU5FVDY6CisJCQlpZiAoKHJldCA9IGdldHNvY2tvcHQoYi0+bnVtLCBJUFBST1RPX0lQVjYsIElQVjZfTVRVLCAodm9pZCAqKSZzb2Nrb3B0X3ZhbCwKKwkJCQkmc29ja29wdF9sZW4pKSA8IDAgfHwgc29ja29wdF92YWwgPCAwKQorCQkJCXsKKwkJCQlyZXQgPSAwOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJLyogd2UgYXNzdW1lIHRoYXQgdGhlIHRyYW5zcG9ydCBwcm90b2NvbCBpcyBVRFAgYW5kIG5vCisJCQkJICogSVBWNiBvcHRpb25zIGFyZSB1c2VkLgorCQkJCSAqLworCQkJCWRhdGEtPm10dSA9IHNvY2tvcHRfdmFsIC0gOCAtIDQwOworCQkJCXJldCA9IGRhdGEtPm10dTsKKwkJCQl9CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQkJfQorI2Vsc2UKKwkJcmV0ID0gMDsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0RHUkFNX0dFVF9NVFU6CisJCXJldHVybiBkYXRhLT5tdHU7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfREdSQU1fU0VUX01UVToKKwkJZGF0YS0+bXR1ID0gbnVtOworCQlyZXQgPSBudW07CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfREdSQU1fU0VUX0NPTk5FQ1RFRDoKKwkJdG8gPSAoc3RydWN0IHNvY2thZGRyICopcHRyOworCisJCWlmICggdG8gIT0gTlVMTCkKKwkJCXsKKwkJCWRhdGEtPmNvbm5lY3RlZCA9IDE7CisJCQlzd2l0Y2ggKHRvLT5zYV9mYW1pbHkpCisJCQkJeworCQkJCWNhc2UgQUZfSU5FVDoKKwkJCQkJbWVtY3B5KCZkYXRhLT5wZWVyLHRvLHNpemVvZihkYXRhLT5wZWVyLnNhX2luKSk7CisJCQkJCWJyZWFrOworI2lmIE9QRU5TU0xfVVNFX0lQVjYKKwkJCQljYXNlIEFGX0lORVQ2OgorCQkJCQltZW1jcHkoJmRhdGEtPnBlZXIsdG8sc2l6ZW9mKGRhdGEtPnBlZXIuc2FfaW42KSk7CisJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJZGVmYXVsdDoKKwkJCQkJbWVtY3B5KCZkYXRhLT5wZWVyLHRvLHNpemVvZihkYXRhLT5wZWVyLnNhKSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJZGF0YS0+Y29ubmVjdGVkID0gMDsKKwkJCW1lbXNldCgmKGRhdGEtPnBlZXIpLCAweDAwLCBzaXplb2YoZGF0YS0+cGVlcikpOworCQkJfQorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0RHUkFNX0dFVF9QRUVSOgorCQlzd2l0Y2ggKGRhdGEtPnBlZXIuc2Euc2FfZmFtaWx5KQorCQkJeworCQkJY2FzZSBBRl9JTkVUOgorCQkJCXJldD1zaXplb2YoZGF0YS0+cGVlci5zYV9pbik7CisJCQkJYnJlYWs7CisjaWYgT1BFTlNTTF9VU0VfSVBWNgorCQkJY2FzZSBBRl9JTkVUNjoKKwkJCQlyZXQ9c2l6ZW9mKGRhdGEtPnBlZXIuc2FfaW42KTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQlyZXQ9c2l6ZW9mKGRhdGEtPnBlZXIuc2EpOworCQkJCWJyZWFrOworCQkJfQorCQlpZiAobnVtPT0wIHx8IG51bT5yZXQpCisJCQludW09cmV0OworCQltZW1jcHkocHRyLCZkYXRhLT5wZWVyLChyZXQ9bnVtKSk7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfREdSQU1fU0VUX1BFRVI6CisJCXRvID0gKHN0cnVjdCBzb2NrYWRkciAqKSBwdHI7CisJCXN3aXRjaCAodG8tPnNhX2ZhbWlseSkKKwkJCXsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQltZW1jcHkoJmRhdGEtPnBlZXIsdG8sc2l6ZW9mKGRhdGEtPnBlZXIuc2FfaW4pKTsKKwkJCQlicmVhazsKKyNpZiBPUEVOU1NMX1VTRV9JUFY2CisJCQljYXNlIEFGX0lORVQ2OgorCQkJCW1lbWNweSgmZGF0YS0+cGVlcix0byxzaXplb2YoZGF0YS0+cGVlci5zYV9pbjYpKTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQltZW1jcHkoJmRhdGEtPnBlZXIsdG8sc2l6ZW9mKGRhdGEtPnBlZXIuc2EpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9ER1JBTV9TRVRfTkVYVF9USU1FT1VUOgorCQltZW1jcHkoJihkYXRhLT5uZXh0X3RpbWVvdXQpLCBwdHIsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCQlicmVhazsKKyNpZiBkZWZpbmVkKFNPX1JDVlRJTUVPKQorCWNhc2UgQklPX0NUUkxfREdSQU1fU0VUX1JFQ1ZfVElNRU9VVDoKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU5ET1dTCisJCXsKKwkJc3RydWN0IHRpbWV2YWwgKnR2ID0gKHN0cnVjdCB0aW1ldmFsICopcHRyOworCQlpbnQgdGltZW91dCA9IHR2LT50dl9zZWMgKiAxMDAwICsgdHYtPnR2X3VzZWMvMTAwMDsKKwkJaWYgKHNldHNvY2tvcHQoYi0+bnVtLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywKKwkJCSh2b2lkKikmdGltZW91dCwgc2l6ZW9mKHRpbWVvdXQpKSA8IDApCisJCQl7IHBlcnJvcigic2V0c29ja29wdCIpOyByZXQgPSAtMTsgfQorCQl9CisjZWxzZQorCQlpZiAoIHNldHNvY2tvcHQoYi0+bnVtLCBTT0xfU09DS0VULCBTT19SQ1ZUSU1FTywgcHRyLAorCQkJc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSkgPCAwKQorCQkJeyBwZXJyb3IoInNldHNvY2tvcHQiKTsJcmV0ID0gLTE7IH0KKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0RHUkFNX0dFVF9SRUNWX1RJTUVPVVQ6CisjaWZkZWYgT1BFTlNTTF9TWVNfV0lORE9XUworCQl7CisJCWludCB0aW1lb3V0LCBzeiA9IHNpemVvZih0aW1lb3V0KTsKKwkJc3RydWN0IHRpbWV2YWwgKnR2ID0gKHN0cnVjdCB0aW1ldmFsICopcHRyOworCQlpZiAoZ2V0c29ja29wdChiLT5udW0sIFNPTF9TT0NLRVQsIFNPX1JDVlRJTUVPLAorCQkJKHZvaWQqKSZ0aW1lb3V0LCAmc3opIDwgMCkKKwkJCXsgcGVycm9yKCJnZXRzb2Nrb3B0Iik7IHJldCA9IC0xOyB9CisJCWVsc2UKKwkJCXsKKwkJCXR2LT50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDsKKwkJCXR2LT50dl91c2VjID0gKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDA7CisJCQlyZXQgPSBzaXplb2YoKnR2KTsKKwkJCX0KKwkJfQorI2Vsc2UKKwkJaWYgKCBnZXRzb2Nrb3B0KGItPm51bSwgU09MX1NPQ0tFVCwgU09fUkNWVElNRU8sIAorCQkJcHRyLCAodm9pZCAqKSZyZXQpIDwgMCkKKwkJCXsgcGVycm9yKCJnZXRzb2Nrb3B0Iik7IHJldCA9IC0xOyB9CisjZW5kaWYKKwkJYnJlYWs7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFNPX1NORFRJTUVPKQorCWNhc2UgQklPX0NUUkxfREdSQU1fU0VUX1NFTkRfVElNRU9VVDoKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU5ET1dTCisJCXsKKwkJc3RydWN0IHRpbWV2YWwgKnR2ID0gKHN0cnVjdCB0aW1ldmFsICopcHRyOworCQlpbnQgdGltZW91dCA9IHR2LT50dl9zZWMgKiAxMDAwICsgdHYtPnR2X3VzZWMvMTAwMDsKKwkJaWYgKHNldHNvY2tvcHQoYi0+bnVtLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywKKwkJCSh2b2lkKikmdGltZW91dCwgc2l6ZW9mKHRpbWVvdXQpKSA8IDApCisJCQl7IHBlcnJvcigic2V0c29ja29wdCIpOyByZXQgPSAtMTsgfQorCQl9CisjZWxzZQorCQlpZiAoIHNldHNvY2tvcHQoYi0+bnVtLCBTT0xfU09DS0VULCBTT19TTkRUSU1FTywgcHRyLAorCQkJc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSkgPCAwKQorCQkJeyBwZXJyb3IoInNldHNvY2tvcHQiKTsJcmV0ID0gLTE7IH0KKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0RHUkFNX0dFVF9TRU5EX1RJTUVPVVQ6CisjaWZkZWYgT1BFTlNTTF9TWVNfV0lORE9XUworCQl7CisJCWludCB0aW1lb3V0LCBzeiA9IHNpemVvZih0aW1lb3V0KTsKKwkJc3RydWN0IHRpbWV2YWwgKnR2ID0gKHN0cnVjdCB0aW1ldmFsICopcHRyOworCQlpZiAoZ2V0c29ja29wdChiLT5udW0sIFNPTF9TT0NLRVQsIFNPX1NORFRJTUVPLAorCQkJKHZvaWQqKSZ0aW1lb3V0LCAmc3opIDwgMCkKKwkJCXsgcGVycm9yKCJnZXRzb2Nrb3B0Iik7IHJldCA9IC0xOyB9CisJCWVsc2UKKwkJCXsKKwkJCXR2LT50dl9zZWMgPSB0aW1lb3V0IC8gMTAwMDsKKwkJCXR2LT50dl91c2VjID0gKHRpbWVvdXQgJSAxMDAwKSAqIDEwMDA7CisJCQlyZXQgPSBzaXplb2YoKnR2KTsKKwkJCX0KKwkJfQorI2Vsc2UKKwkJaWYgKCBnZXRzb2Nrb3B0KGItPm51bSwgU09MX1NPQ0tFVCwgU09fU05EVElNRU8sIAorCQkJcHRyLCAodm9pZCAqKSZyZXQpIDwgMCkKKwkJCXsgcGVycm9yKCJnZXRzb2Nrb3B0Iik7IHJldCA9IC0xOyB9CisjZW5kaWYKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIEJJT19DVFJMX0RHUkFNX0dFVF9TRU5EX1RJTUVSX0VYUDoKKwkJLyogZmFsbC10aHJvdWdoICovCisJY2FzZSBCSU9fQ1RSTF9ER1JBTV9HRVRfUkVDVl9USU1FUl9FWFA6CisjaWZkZWYgT1BFTlNTTF9TWVNfV0lORE9XUworCQlpZiAoIGRhdGEtPl9lcnJubyA9PSBXU0FFVElNRURPVVQpCisjZWxzZQorCQlpZiAoIGRhdGEtPl9lcnJubyA9PSBFQUdBSU4pCisjZW5kaWYKKwkJCXsKKwkJCXJldCA9IDE7CisJCQlkYXRhLT5fZXJybm8gPSAwOworCQkJfQorCQllbHNlCisJCQlyZXQgPSAwOworCQlicmVhazsKKyNpZmRlZiBFTVNHU0laRQorCWNhc2UgQklPX0NUUkxfREdSQU1fTVRVX0VYQ0VFREVEOgorCQlpZiAoIGRhdGEtPl9lcnJubyA9PSBFTVNHU0laRSkKKwkJCXsKKwkJCXJldCA9IDE7CisJCQlkYXRhLT5fZXJybm8gPSAwOworCQkJfQorCQllbHNlCisJCQlyZXQgPSAwOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldD0wOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBkZ3JhbV9wdXRzKEJJTyAqYnAsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJaW50IG4scmV0OworCisJbj1zdHJsZW4oc3RyKTsKKwlyZXQ9ZGdyYW1fd3JpdGUoYnAsc3RyLG4pOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBCSU9fZGdyYW1fc2hvdWxkX3JldHJ5KGludCBpKQorCXsKKwlpbnQgZXJyOworCisJaWYgKChpID09IDApIHx8IChpID09IC0xKSkKKwkJeworCQllcnI9Z2V0X2xhc3Rfc29ja2V0X2Vycm9yKCk7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpICYmIDAgLyogbW9yZSBtaWNyb3NvZnQgc3R1cGlkaXR5PyBwZXJoYXBzIG5vdD8gQmVuIDQvMS85OSAqLworCQlpZiAoKGkgPT0gLTEpICYmIChlcnIgPT0gMCkpCisJCQlyZXR1cm4oMSk7CisjZW5kaWYKKworCQlyZXR1cm4oQklPX2RncmFtX25vbl9mYXRhbF9lcnJvcihlcnIpKTsKKwkJfQorCXJldHVybigwKTsKKwl9CisKK2ludCBCSU9fZGdyYW1fbm9uX2ZhdGFsX2Vycm9yKGludCBlcnIpCisJeworCXN3aXRjaCAoZXJyKQorCQl7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKQorIyBpZiBkZWZpbmVkKFdTQUVXT1VMREJMT0NLKQorCWNhc2UgV1NBRVdPVUxEQkxPQ0s6CisjIGVuZGlmCisKKyMgaWYgMCAvKiBUaGlzIGFwcGVhcnMgdG8gYWx3YXlzIGJlIGFuIGVycm9yICovCisjICBpZiBkZWZpbmVkKFdTQUVOT1RDT05OKQorCWNhc2UgV1NBRU5PVENPTk46CisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBFV09VTERCTE9DSworIyBpZmRlZiBXU0FFV09VTERCTE9DSworIyAgaWYgV1NBRVdPVUxEQkxPQ0sgIT0gRVdPVUxEQkxPQ0sKKwljYXNlIEVXT1VMREJMT0NLOgorIyAgZW5kaWYKKyMgZWxzZQorCWNhc2UgRVdPVUxEQkxPQ0s6CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEVJTlRSCisJY2FzZSBFSU5UUjoKKyNlbmRpZgorCisjaWZkZWYgRUFHQUlOCisjaWYgRVdPVUxEQkxPQ0sgIT0gRUFHQUlOCisJY2FzZSBFQUdBSU46CisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEVQUk9UTworCWNhc2UgRVBST1RPOgorI2VuZGlmCisKKyNpZmRlZiBFSU5QUk9HUkVTUworCWNhc2UgRUlOUFJPR1JFU1M6CisjZW5kaWYKKworI2lmZGVmIEVBTFJFQURZCisJY2FzZSBFQUxSRUFEWToKKyNlbmRpZgorCisJCXJldHVybigxKTsKKwkJLyogYnJlYWs7ICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4oMCk7CisJfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGdldF9jdXJyZW50X3RpbWUoc3RydWN0IHRpbWV2YWwgKnQpCisJeworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjMyCisJc3RydWN0IF90aW1lYiB0YjsKKwlfZnRpbWUoJnRiKTsKKwl0LT50dl9zZWMgPSAobG9uZyl0Yi50aW1lOworCXQtPnR2X3VzZWMgPSAobG9uZyl0Yi5taWxsaXRtICogMTAwMDsKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorCXN0cnVjdCB0aW1lYiB0YjsKKwlmdGltZSgmdGIpOworCXQtPnR2X3NlYyA9IChsb25nKXRiLnRpbWU7CisJdC0+dHZfdXNlYyA9IChsb25nKXRiLm1pbGxpdG0gKiAxMDAwOworI2Vsc2UKKwlnZXR0aW1lb2ZkYXkodCwgTlVMTCk7CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19mZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfZmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJmODVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfZmQuYwpAQCAtMCwwICsxLDMxOSBAQAorLyogY3J5cHRvL2Jpby9ic3NfZmQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2RlZmluZSBVU0VfU09DS0VUUworI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfTk9fUE9TSVhfSU8pCisvKgorICogT25lIGNhbiBhcmd1ZSB0aGF0IG9uZSBzaG91bGQgaW1wbGVtZW50IGR1bW15IHBsYWNlaG9sZGVyIGZvcgorICogQklPX3NfZmQgaGVyZS4uLgorICovCisjZWxzZQorLyoKKyAqIEFzIGZvciB1bmNvbmRpdGlvbmFsIHVzYWdlIG9mICJVUExJTksiIGludGVyZmFjZSBpbiB0aGlzIG1vZHVsZS4KKyAqIFRyb3VibGUgaXMgdGhhdCB1bmxpa2UgVW5peCBmaWxlIGRlc2NyaXB0b3JzIFt3aGljaCBhcmUgaW5kZXhlcworICogaW4ga2VybmVsLXNpZGUgcGVyLXByb2Nlc3MgdGFibGVdLCBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3JzIG9uCisgKiBwbGF0Zm9ybXMgd2hpY2ggcmVxdWlyZSAiVVBMSU5LIiBpbnRlcmZhY2Ugc2VlbSB0byBiZSBpbmRleGVzCisgKiBpbiBhIHVzZXItbGFuZCwgbm9uLWdsb2JhbCB0YWJsZS4gV2VsbCwgaW4gZmFjdCB0aGV5IGFyZSBpbmRleGVzCisgKiBpbiBzdGRpbyBfaW9iW10sIGFuZCByZWNhbGwgdGhhdCBfaW9iW10gd2FzIHRoZSB2ZXJ5IHJlYXNvbiB3aHkKKyAqICJVUExJTksiIGludGVyZmFjZSB3YXMgaW50cm9kdWNlZCBpbiBmaXJzdCBwbGFjZS4gQnV0IG9uZSB3YXkgb24KKyAqIGFub3RoZXIuIE5laXRoZXIgbGliY3J5cHRvIG9yIGxpYnNzbCB1c2UgdGhpcyBCSU8gbWVhbmluZyB0aGF0CisgKiBmaWxlIGRlc2NyaXB0b3JzIGNhbiBvbmx5IGJlIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uLiBUaGVyZWZvcmUKKyAqICJVUExJTksiIGNhbGxzIGFyZSBkdWUuLi4KKyAqLworI2luY2x1ZGUgImJpb19sY2wuaCIKKworc3RhdGljIGludCBmZF93cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IGZkX3JlYWQoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgZmRfcHV0cyhCSU8gKmgsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IGZkX2dldHMoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBsb25nIGZkX2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBmZF9uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgZmRfZnJlZShCSU8gKmRhdGEpOworaW50IEJJT19mZF9zaG91bGRfcmV0cnkoaW50IHMpOworCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX2ZkcD0KKwl7CisJQklPX1RZUEVfRkQsImZpbGUgZGVzY3JpcHRvciIsCisJZmRfd3JpdGUsCisJZmRfcmVhZCwKKwlmZF9wdXRzLAorCWZkX2dldHMsCisJZmRfY3RybCwKKwlmZF9uZXcsCisJZmRfZnJlZSwKKwlOVUxMLAorCX07CisKK0JJT19NRVRIT0QgKkJJT19zX2ZkKHZvaWQpCisJeworCXJldHVybigmbWV0aG9kc19mZHApOworCX0KKworQklPICpCSU9fbmV3X2ZkKGludCBmZCxpbnQgY2xvc2VfZmxhZykKKwl7CisJQklPICpyZXQ7CisJcmV0PUJJT19uZXcoQklPX3NfZmQoKSk7CisJaWYgKHJldCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJQklPX3NldF9mZChyZXQsZmQsY2xvc2VfZmxhZyk7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGZkX25ldyhCSU8gKmJpKQorCXsKKwliaS0+aW5pdD0wOworCWJpLT5udW09LTE7CisJYmktPnB0cj1OVUxMOworCWJpLT5mbGFncz1CSU9fRkxBR1NfVVBMSU5LOyAvKiBlc3NlbnRpYWxseSByZWR1bmRhbnQgKi8KKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IGZkX2ZyZWUoQklPICphKQorCXsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKGEtPnNodXRkb3duKQorCQl7CisJCWlmIChhLT5pbml0KQorCQkJeworCQkJVVBfY2xvc2UoYS0+bnVtKTsKKwkJCX0KKwkJYS0+aW5pdD0wOworCQlhLT5mbGFncz1CSU9fRkxBR1NfVVBMSU5LOworCQl9CisJcmV0dXJuKDEpOworCX0KKwkKK3N0YXRpYyBpbnQgZmRfcmVhZChCSU8gKmIsIGNoYXIgKm91dCxpbnQgb3V0bCkKKwl7CisJaW50IHJldD0wOworCisJaWYgKG91dCAhPSBOVUxMKQorCQl7CisJCWNsZWFyX3N5c19lcnJvcigpOworCQlyZXQ9VVBfcmVhZChiLT5udW0sb3V0LG91dGwpOworCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCWlmIChyZXQgPD0gMCkKKwkJCXsKKwkJCWlmIChCSU9fZmRfc2hvdWxkX3JldHJ5KHJldCkpCisJCQkJQklPX3NldF9yZXRyeV9yZWFkKGIpOworCQkJfQorCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGZkX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpCisJeworCWludCByZXQ7CisJY2xlYXJfc3lzX2Vycm9yKCk7CisJcmV0PVVQX3dyaXRlKGItPm51bSxpbixpbmwpOworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlpZiAocmV0IDw9IDApCisJCXsKKwkJaWYgKEJJT19mZF9zaG91bGRfcmV0cnkocmV0KSkKKwkJCUJJT19zZXRfcmV0cnlfd3JpdGUoYik7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIGZkX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlsb25nIHJldD0xOworCWludCAqaXA7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgQklPX0NUUkxfUkVTRVQ6CisJCW51bT0wOworCWNhc2UgQklPX0NfRklMRV9TRUVLOgorCQlyZXQ9KGxvbmcpVVBfbHNlZWsoYi0+bnVtLG51bSwwKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19GSUxFX1RFTEw6CisJY2FzZSBCSU9fQ1RSTF9JTkZPOgorCQlyZXQ9KGxvbmcpVVBfbHNlZWsoYi0+bnVtLDAsMSk7CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX0ZEOgorCQlmZF9mcmVlKGIpOworCQliLT5udW09ICooKGludCAqKXB0cik7CisJCWItPnNodXRkb3duPShpbnQpbnVtOworCQliLT5pbml0PTE7CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX0ZEOgorCQlpZiAoYi0+aW5pdCkKKwkJCXsKKwkJCWlwPShpbnQgKilwdHI7CisJCQlpZiAoaXAgIT0gTlVMTCkgKmlwPWItPm51bTsKKwkJCXJldD1iLT5udW07CisJCQl9CisJCWVsc2UKKwkJCXJldD0gLTE7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorCQlyZXQ9Yi0+c2h1dGRvd247CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfU0VUX0NMT1NFOgorCQliLT5zaHV0ZG93bj0oaW50KW51bTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9QRU5ESU5HOgorCWNhc2UgQklPX0NUUkxfV1BFTkRJTkc6CisJCXJldD0wOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0RVUDoKKwljYXNlIEJJT19DVFJMX0ZMVVNIOgorCQlyZXQ9MTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0PTA7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGZkX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKQorCXsKKwlpbnQgbixyZXQ7CisKKwluPXN0cmxlbihzdHIpOworCXJldD1mZF93cml0ZShicCxzdHIsbik7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGZkX2dldHMoQklPICpicCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKKyAgICAgICAgeworCWludCByZXQ9MDsKKwljaGFyICpwdHI9YnVmOworCWNoYXIgKmVuZD1idWYrc2l6ZS0xOworCisJd2hpbGUgKCAocHRyIDwgZW5kKSAmJiAoZmRfcmVhZChicCwgcHRyLCAxKSA+IDApICYmIChwdHJbMF0gIT0gJ1xuJykgKQorCQlwdHIrKzsKKworCXB0clswXT0nXDAnOworCisJaWYgKGJ1ZlswXSAhPSAnXDAnKQorCQlyZXQ9c3RybGVuKGJ1Zik7CisJcmV0dXJuKHJldCk7CisgICAgICAgIH0KKworaW50IEJJT19mZF9zaG91bGRfcmV0cnkoaW50IGkpCisJeworCWludCBlcnI7CisKKwlpZiAoKGkgPT0gMCkgfHwgKGkgPT0gLTEpKQorCQl7CisJCWVycj1nZXRfbGFzdF9zeXNfZXJyb3IoKTsKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgJiYgMCAvKiBtb3JlIG1pY3Jvc29mdCBzdHVwaWRpdHk/IHBlcmhhcHMgbm90PyBCZW4gNC8xLzk5ICovCisJCWlmICgoaSA9PSAtMSkgJiYgKGVyciA9PSAwKSkKKwkJCXJldHVybigxKTsKKyNlbmRpZgorCisJCXJldHVybihCSU9fZmRfbm9uX2ZhdGFsX2Vycm9yKGVycikpOworCQl9CisJcmV0dXJuKDApOworCX0KKworaW50IEJJT19mZF9ub25fZmF0YWxfZXJyb3IoaW50IGVycikKKwl7CisJc3dpdGNoIChlcnIpCisJCXsKKworI2lmZGVmIEVXT1VMREJMT0NLCisjIGlmZGVmIFdTQUVXT1VMREJMT0NLCisjICBpZiBXU0FFV09VTERCTE9DSyAhPSBFV09VTERCTE9DSworCWNhc2UgRVdPVUxEQkxPQ0s6CisjICBlbmRpZgorIyBlbHNlCisJY2FzZSBFV09VTERCTE9DSzoKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChFTk9UQ09OTikKKwljYXNlIEVOT1RDT05OOgorI2VuZGlmCisKKyNpZmRlZiBFSU5UUgorCWNhc2UgRUlOVFI6CisjZW5kaWYKKworI2lmZGVmIEVBR0FJTgorI2lmIEVXT1VMREJMT0NLICE9IEVBR0FJTgorCWNhc2UgRUFHQUlOOgorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBFUFJPVE8KKwljYXNlIEVQUk9UTzoKKyNlbmRpZgorCisjaWZkZWYgRUlOUFJPR1JFU1MKKwljYXNlIEVJTlBST0dSRVNTOgorI2VuZGlmCisKKyNpZmRlZiBFQUxSRUFEWQorCWNhc2UgRUFMUkVBRFk6CisjZW5kaWYKKwkJcmV0dXJuKDEpOworCQkvKiBicmVhazsgKi8KKwlkZWZhdWx0OgorCQlicmVhazsKKwkJfQorCXJldHVybigwKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2ZpbGUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmZhMGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfZmlsZS5jCkBAIC0wLDAgKzEsNDcxIEBACisvKiBjcnlwdG8vYmlvL2Jzc19maWxlLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyoKKyAqIDAzLURlYy0xOTk3CXJkZW5ueUBkYzMuY29tICBGaXggYnVnIHByZXZlbnRpbmcgdXNlIG9mIHN0ZGluL3N0ZG91dAorICoJCXdpdGggYmluYXJ5IGRhdGEgKGUuZy4gYXNuMXBhcnNlIC1pbmZvcm0gREVSIDwgeHh4KSB1bmRlcgorICoJCVdpbmRvd3MKKyAqLworCisjaWZuZGVmIEhFQURFUl9CU1NfRklMRV9DCisjZGVmaW5lIEhFQURFUl9CU1NfRklMRV9DCisKKyNpZiBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQoX19zdW4pIHx8IGRlZmluZWQoX19ocHV4KQorLyogRm9sbG93aW5nIGRlZmluaXRpb24gYWxpYXNlcyBmb3BlbiB0byBmb3BlbjY0IG9uIGFib3ZlIG1lbnRpb25lZAorICogcGxhdGZvcm1zLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG9wZW4gYW5kIHNlcXVlbnRpYWxseSBhY2Nlc3MKKyAqIGZpbGVzIGxhcmdlciB0aGFuIDJHQiBmcm9tIDMyLWJpdCBhcHBsaWNhdGlvbi4gSXQgZG9lcyBub3QgYWxsb3cgdG8KKyAqIHRyYXZlcnNlIHRoZW0gYmV5b25kIDJHQiB3aXRoIGZzZWVrL2Z0ZWxsLCBidXQgb24gdGhlIG90aGVyIGhhbmQgKm5vKgorICogMzItYml0IHBsYXRmb3JtIHBlcm1pdHMgdGhhdCwgbm90IHdpdGggZnNlZWsvZnRlbGwuIE5vdCB0byBtZW50aW9uCisgKiB0aGF0IGJyZWFraW5nIDJHQiBsaW1pdCBmb3Igc2Vla2luZyB3b3VsZCByZXF1aXJlIHN1cmdlcnkgdG8gKm91cioKKyAqIEFQSS4gQnV0IHNlcXVlbnRpYWwgYWNjZXNzIHN1ZmZpY2VzIGZvciBwcmFjdGljYWwgY2FzZXMgd2hlbiB5b3UKKyAqIGNhbiBydW4gaW50byBsYXJnZSBmaWxlcywgc3VjaCBhcyBmaW5nZXJwcmludGluZywgc28gd2UgY2FuIGxldCBBUEkKKyAqIGFsb25lLiBGb3IgcmVmZXJlbmNlLCB0aGUgbGlzdCBvZiAzMi1iaXQgcGxhdGZvcm1zIHdoaWNoIGFsbG93IGZvcgorICogc2VxdWVudGlhbCBhY2Nlc3Mgb2YgbGFyZ2UgZmlsZXMgd2l0aG91dCBleHRyYSAibWFnaWMiIGNvbXByaXNlICpCU0QsCisgKiBEYXJ3aW4sIElSSVguLi4KKyAqLworI2lmbmRlZiBfRklMRV9PRkZTRVRfQklUUworI2RlZmluZSBfRklMRV9PRkZTRVRfQklUUyA2NAorI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgImJpb19sY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAmJiBkZWZpbmVkKE5FVFdBUkVfQ0xJQikKKyNpbmNsdWRlIDxud2ZpbGVpby5oPgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NURElPKQorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfd3JpdGUoQklPICpoLCBjb25zdCBjaGFyICpidWYsIGludCBudW0pOworc3RhdGljIGludCBNU19DQUxMQkFDSyBmaWxlX3JlYWQoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZmlsZV9wdXRzKEJJTyAqaCwgY29uc3QgY2hhciAqc3RyKTsKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZmlsZV9nZXRzKEJJTyAqaCwgY2hhciAqc3RyLCBpbnQgc2l6ZSk7CitzdGF0aWMgbG9uZyBNU19DQUxMQkFDSyBmaWxlX2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBNU19DQUxMQkFDSyBmaWxlX25ldyhCSU8gKmgpOworc3RhdGljIGludCBNU19DQUxMQkFDSyBmaWxlX2ZyZWUoQklPICpkYXRhKTsKK3N0YXRpYyBCSU9fTUVUSE9EIG1ldGhvZHNfZmlsZXA9CisJeworCUJJT19UWVBFX0ZJTEUsCisJIkZJTEUgcG9pbnRlciIsCisJZmlsZV93cml0ZSwKKwlmaWxlX3JlYWQsCisJZmlsZV9wdXRzLAorCWZpbGVfZ2V0cywKKwlmaWxlX2N0cmwsCisJZmlsZV9uZXcsCisJZmlsZV9mcmVlLAorCU5VTEwsCisJfTsKKworQklPICpCSU9fbmV3X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpCisJeworCUJJTyAgKnJldDsKKwlGSUxFICpmaWxlPU5VTEw7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgZGVmaW5lZChDUF9VVEY4KQorCWludCBzeiwgbGVuXzAgPSAoaW50KXN0cmxlbihmaWxlbmFtZSkrMTsKKworCS8qCisJICogQmFzaWNhbGx5IHRoZXJlIGFyZSB0aHJlZSBjYXNlcyB0byBjb3ZlcjogYSkgZmlsZW5hbWUgaXMKKwkgKiBwdXJlIEFTQ0lJIHN0cmluZzsgYikgYWN0dWFsIFVURi04IGVuY29kZWQgc3RyaW5nIGFuZAorCSAqIGMpIGxvY2FsZS1pemVkIHN0cmluZywgaS5lLiBvbmUgY29udGFpbmluZyA4LWJpdAorCSAqIGNoYXJhY3RlcnMgdGhhdCBhcmUgbWVhbmluZ2Z1bCBpbiBjdXJyZW50IHN5c3RlbSBsb2NhbGUuCisJICogSWYgZmlsZW5hbWUgaXMgcHVyZSBBU0NJSSBvciByZWFsIFVURi04IGVuY29kZWQgc3RyaW5nLAorCSAqIE11bHRpQnl0ZVRvV2lkZUNoYXIgc3VjY2VlZHMgYW5kIF93Zm9wZW4gd29ya3MuIElmCisJICogZmlsZW5hbWUgaXMgbG9jYWxlLWl6ZWQgc3RyaW5nLCBjaGFuY2VzIGFyZSB0aGF0CisJICogTXVsdGlCeXRlVG9XaWRlQ2hhciBmYWlscyByZXBvcnRpbmcKKwkgKiBFUlJPUl9OT19VTklDT0RFX1RSQU5TTEFUSU9OLCBpbiB3aGljaCBjYXNlIHdlIGZhbGwKKwkgKiBiYWNrIHRvIGZvcGVuLi4uCisJICovCisJaWYgKChzej1NdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsTUJfRVJSX0lOVkFMSURfQ0hBUlMsCisJCQkJCWZpbGVuYW1lLGxlbl8wLE5VTEwsMCkpPjApCisJCXsKKwkJV0NIQVIgIHdtb2RlWzhdOworCQlXQ0hBUiAqd2ZpbGVuYW1lID0gX2FsbG9jYShzeipzaXplb2YoV0NIQVIpKTsKKworCQlpZiAoTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9VVEY4LE1CX0VSUl9JTlZBTElEX0NIQVJTLAorCQkJCQlmaWxlbmFtZSxsZW5fMCx3ZmlsZW5hbWUsc3opICYmCisJCSAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX1VURjgsMCxtb2RlLHN0cmxlbihtb2RlKSsxLAorCQkJICAgIAkJd21vZGUsc2l6ZW9mKHdtb2RlKS9zaXplb2Yod21vZGVbMF0pKSAmJgorCQkgICAgKGZpbGU9X3dmb3Blbih3ZmlsZW5hbWUsd21vZGUpKT09TlVMTCAmJiBlcnJubz09RU5PRU5UCisJCSAgICkJLyogVVRGLTggZGVjb2RlIHN1Y2NlZWRlZCwgYnV0IG5vIGZpbGUsIGZpbGVuYW1lCisJCQkgKiBjb3VsZCBzdGlsbCBoYXZlIGJlZW4gbG9jYWxlLWl6ZWQuLi4gKi8KKwkJCWZpbGUgPSBmb3BlbihmaWxlbmFtZSxtb2RlKTsKKwkJfQorCWVsc2UgaWYgKEdldExhc3RFcnJvcigpPT1FUlJPUl9OT19VTklDT0RFX1RSQU5TTEFUSU9OKQorCQl7CisJCWZpbGUgPSBmb3BlbihmaWxlbmFtZSxtb2RlKTsKKwkJfQorI2Vsc2UKKwlmaWxlPWZvcGVuKGZpbGVuYW1lLG1vZGUpOwkKKyNlbmRpZgorCWlmIChmaWxlID09IE5VTEwpCisJCXsKKwkJU1lTZXJyKFNZU19GX0ZPUEVOLGdldF9sYXN0X3N5c19lcnJvcigpKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDUsImZvcGVuKCciLGZpbGVuYW1lLCInLCciLG1vZGUsIicpIik7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlCSU9lcnIoQklPX0ZfQklPX05FV19GSUxFLEJJT19SX05PX1NVQ0hfRklMRSk7CisJCWVsc2UKKwkJCUJJT2VycihCSU9fRl9CSU9fTkVXX0ZJTEUsRVJSX1JfU1lTX0xJQik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmICgocmV0PUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlmY2xvc2UoZmlsZSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCisJQklPX2NsZWFyX2ZsYWdzKHJldCxCSU9fRkxBR1NfVVBMSU5LKTsgLyogd2UgZGlkIGZvcGVuIC0+IHdlIGRpc2VuZ2FnZSBVUExJTksgKi8KKwlCSU9fc2V0X2ZwKHJldCxmaWxlLEJJT19DTE9TRSk7CisJcmV0dXJuKHJldCk7CisJfQorCitCSU8gKkJJT19uZXdfZnAoRklMRSAqc3RyZWFtLCBpbnQgY2xvc2VfZmxhZykKKwl7CisJQklPICpyZXQ7CisKKwlpZiAoKHJldD1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworCUJJT19zZXRfZmxhZ3MocmV0LEJJT19GTEFHU19VUExJTkspOyAvKiByZWR1bmRhbnQsIGxlZnQgZm9yIGRvY3VtZW50YXRpb24gcHVwb3NlcyAqLworCUJJT19zZXRfZnAocmV0LHN0cmVhbSxjbG9zZV9mbGFnKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK0JJT19NRVRIT0QgKkJJT19zX2ZpbGUodm9pZCkKKwl7CisJcmV0dXJuKCZtZXRob2RzX2ZpbGVwKTsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZmlsZV9uZXcoQklPICpiaSkKKwl7CisJYmktPmluaXQ9MDsKKwliaS0+bnVtPTA7CisJYmktPnB0cj1OVUxMOworCWJpLT5mbGFncz1CSU9fRkxBR1NfVVBMSU5LOyAvKiBkZWZhdWx0IHRvIFVQTElOSyAqLworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZmlsZV9mcmVlKEJJTyAqYSkKKwl7CisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCWlmIChhLT5zaHV0ZG93bikKKwkJeworCQlpZiAoKGEtPmluaXQpICYmIChhLT5wdHIgIT0gTlVMTCkpCisJCQl7CisJCQlpZiAoYS0+ZmxhZ3MmQklPX0ZMQUdTX1VQTElOSykKKwkJCQlVUF9mY2xvc2UgKGEtPnB0cik7CisJCQllbHNlCisJCQkJZmNsb3NlIChhLT5wdHIpOworCQkJYS0+cHRyPU5VTEw7CisJCQlhLT5mbGFncz1CSU9fRkxBR1NfVVBMSU5LOworCQkJfQorCQlhLT5pbml0PTA7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCQorc3RhdGljIGludCBNU19DQUxMQkFDSyBmaWxlX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgcmV0PTA7CisKKwlpZiAoYi0+aW5pdCAmJiAob3V0ICE9IE5VTEwpKQorCQl7CisJCWlmIChiLT5mbGFncyZCSU9fRkxBR1NfVVBMSU5LKQorCQkJcmV0PVVQX2ZyZWFkKG91dCwxLChpbnQpb3V0bCxiLT5wdHIpOworCQllbHNlCisJCQlyZXQ9ZnJlYWQob3V0LDEsKGludClvdXRsLChGSUxFICopYi0+cHRyKTsKKwkJaWYocmV0ID09IDAgJiYgKGItPmZsYWdzJkJJT19GTEFHU19VUExJTkspP1VQX2ZlcnJvcigoRklMRSAqKWItPnB0cik6ZmVycm9yKChGSUxFICopYi0+cHRyKSkKKwkJCXsKKwkJCVNZU2VycihTWVNfRl9GUkVBRCxnZXRfbGFzdF9zeXNfZXJyb3IoKSk7CisJCQlCSU9lcnIoQklPX0ZfRklMRV9SRUFELEVSUl9SX1NZU19MSUIpOworCQkJcmV0PS0xOworCQkJfQorCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkKKwl7CisJaW50IHJldD0wOworCisJaWYgKGItPmluaXQgJiYgKGluICE9IE5VTEwpKQorCQl7CisJCWlmIChiLT5mbGFncyZCSU9fRkxBR1NfVVBMSU5LKQorCQkJcmV0PVVQX2Z3cml0ZShpbiwoaW50KWlubCwxLGItPnB0cik7CisJCWVsc2UKKwkJCXJldD1md3JpdGUoaW4sKGludClpbmwsMSwoRklMRSAqKWItPnB0cik7CisJCWlmIChyZXQpCisJCQlyZXQ9aW5sOworCQkvKiByZXQ9ZndyaXRlKGluLDEsKGludClpbmwsKEZJTEUgKiliLT5wdHIpOyAqLworCQkvKiBhY2NvcmRpbmcgdG8gVGltIEh1ZHNvbiA8dGpoQGNyeXB0c29mdC5jb20+LCB0aGUgY29tbWVudGVkCisJCSAqIG91dCB2ZXJzaW9uIGFib3ZlIGNhbiBjYXVzZSAnaW5sJyB3cml0ZSBjYWxscyB1bmRlcgorCQkgKiBzb21lIHN0dXBpZCBzdGRpbyBpbXBsZW1lbnRhdGlvbnMgKFZNUykgKi8KKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgTVNfQ0FMTEJBQ0sgZmlsZV9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJbG9uZyByZXQ9MTsKKwlGSUxFICpmcD0oRklMRSAqKWItPnB0cjsKKwlGSUxFICoqZnBwOworCWNoYXIgcFs0XTsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBCSU9fQ19GSUxFX1NFRUs6CisJY2FzZSBCSU9fQ1RSTF9SRVNFVDoKKwkJaWYgKGItPmZsYWdzJkJJT19GTEFHU19VUExJTkspCisJCQlyZXQ9KGxvbmcpVVBfZnNlZWsoYi0+cHRyLG51bSwwKTsKKwkJZWxzZQorCQkJcmV0PShsb25nKWZzZWVrKGZwLG51bSwwKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9FT0Y6CisJCWlmIChiLT5mbGFncyZCSU9fRkxBR1NfVVBMSU5LKQorCQkJcmV0PShsb25nKVVQX2Zlb2YoZnApOworCQllbHNlCisJCQlyZXQ9KGxvbmcpZmVvZihmcCk7CisJCWJyZWFrOworCWNhc2UgQklPX0NfRklMRV9URUxMOgorCWNhc2UgQklPX0NUUkxfSU5GTzoKKwkJaWYgKGItPmZsYWdzJkJJT19GTEFHU19VUExJTkspCisJCQlyZXQ9VVBfZnRlbGwoYi0+cHRyKTsKKwkJZWxzZQorCQkJcmV0PWZ0ZWxsKGZwKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19TRVRfRklMRV9QVFI6CisJCWZpbGVfZnJlZShiKTsKKwkJYi0+c2h1dGRvd249KGludCludW0mQklPX0NMT1NFOworCQliLT5wdHI9cHRyOworCQliLT5pbml0PTE7CisjaWYgQklPX0ZMQUdTX1VQTElOSyE9MAorI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmIGRlZmluZWQoX19NU1ZDUlRfXykgJiYgIWRlZmluZWQoX0lPQl9FTlRSSUVTKQorI2RlZmluZSBfSU9CX0VOVFJJRVMgMjAKKyNlbmRpZgorI2lmIGRlZmluZWQoX0lPQl9FTlRSSUVTKQorCQkvKiBTYWZldHkgbmV0IHRvIGNhdGNoIHB1cmVseSBpbnRlcm5hbCBCSU9fc2V0X2ZwIGNhbGxzICovCisJCWlmICgoc2l6ZV90KXB0ciA+PSAoc2l6ZV90KXN0ZGluICYmCisJCSAgICAoc2l6ZV90KXB0ciA8ICAoc2l6ZV90KShzdGRpbitfSU9CX0VOVFJJRVMpKQorCQkJQklPX2NsZWFyX2ZsYWdzKGIsQklPX0ZMQUdTX1VQTElOSyk7CisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIFVQX2ZzZXRtb2QKKwkJaWYgKGItPmZsYWdzJkJJT19GTEFHU19VUExJTkspCisJCQlVUF9mc2V0bW9kKGItPnB0ciwoY2hhcikoKG51bSZCSU9fRlBfVEVYVCk/J3QnOidiJykpOworCQllbHNlCisjZW5kaWYKKwkJeworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykKKwkJaW50IGZkID0gX2ZpbGVubygoRklMRSopcHRyKTsKKwkJaWYgKG51bSAmIEJJT19GUF9URVhUKQorCQkJX3NldG1vZGUoZmQsX09fVEVYVCk7CisJCWVsc2UKKwkJCV9zZXRtb2RlKGZkLF9PX0JJTkFSWSk7CisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpICYmIGRlZmluZWQoTkVUV0FSRV9DTElCKQorCQlpbnQgZmQgPSBmaWxlbm8oKEZJTEUqKXB0cik7CisJCS8qIFVuZGVyIENMaWIgdGhlcmUgYXJlIGRpZmZlcmVuY2VzIGluIGZpbGUgbW9kZXMgKi8KKwkJaWYgKG51bSAmIEJJT19GUF9URVhUKQorCQkJc2V0bW9kZShmZCxPX1RFWFQpOworCQllbHNlCisJCQlzZXRtb2RlKGZkLE9fQklOQVJZKTsKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpCisJCWludCBmZCA9IGZpbGVubygoRklMRSopcHRyKTsKKwkJLyogU2V0IGNvcnJlY3QgdGV4dC9iaW5hcnkgbW9kZSAqLworCQlpZiAobnVtICYgQklPX0ZQX1RFWFQpCisJCQlfc2V0bW9kZShmZCxfT19URVhUKTsKKwkJLyogRGFuZ2Vyb3VzIHRvIHNldCBzdGRpbi9zdGRvdXQgdG8gcmF3ICh1bmxlc3MgcmVkaXJlY3RlZCkgKi8KKwkJZWxzZQorCQkJeworCQkJaWYgKGZkID09IFNURElOX0ZJTEVOTyB8fCBmZCA9PSBTVERPVVRfRklMRU5PKQorCQkJCXsKKwkJCQlpZiAoaXNhdHR5KGZkKSA8PSAwKQorCQkJCQlfc2V0bW9kZShmZCxfT19CSU5BUlkpOworCQkJCX0KKwkJCWVsc2UKKwkJCQlfc2V0bW9kZShmZCxfT19CSU5BUlkpOworCQkJfQorI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19PUzIpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzJfQ1lHV0lOKQorCQlpbnQgZmQgPSBmaWxlbm8oKEZJTEUqKXB0cik7CisJCWlmIChudW0gJiBCSU9fRlBfVEVYVCkKKwkJCXNldG1vZGUoZmQsIE9fVEVYVCk7CisJCWVsc2UKKwkJCXNldG1vZGUoZmQsIE9fQklOQVJZKTsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX0ZJTEVOQU1FOgorCQlmaWxlX2ZyZWUoYik7CisJCWItPnNodXRkb3duPShpbnQpbnVtJkJJT19DTE9TRTsKKwkJaWYgKG51bSAmIEJJT19GUF9BUFBFTkQpCisJCQl7CisJCQlpZiAobnVtICYgQklPX0ZQX1JFQUQpCisJCQkJQlVGX3N0cmxjcHkocCwiYSsiLHNpemVvZiBwKTsKKwkJCWVsc2UJQlVGX3N0cmxjcHkocCwiYSIsc2l6ZW9mIHApOworCQkJfQorCQllbHNlIGlmICgobnVtICYgQklPX0ZQX1JFQUQpICYmIChudW0gJiBCSU9fRlBfV1JJVEUpKQorCQkJQlVGX3N0cmxjcHkocCwicisiLHNpemVvZiBwKTsKKwkJZWxzZSBpZiAobnVtICYgQklPX0ZQX1dSSVRFKQorCQkJQlVGX3N0cmxjcHkocCwidyIsc2l6ZW9mIHApOworCQllbHNlIGlmIChudW0gJiBCSU9fRlBfUkVBRCkKKwkJCUJVRl9zdHJsY3B5KHAsInIiLHNpemVvZiBwKTsKKwkJZWxzZQorCQkJeworCQkJQklPZXJyKEJJT19GX0ZJTEVfQ1RSTCxCSU9fUl9CQURfRk9QRU5fTU9ERSk7CisJCQlyZXQ9MDsKKwkJCWJyZWFrOworCQkJfQorI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19PUzIpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzJfQ1lHV0lOKQorCQlpZiAoIShudW0gJiBCSU9fRlBfVEVYVCkpCisJCQlzdHJjYXQocCwiYiIpOworCQllbHNlCisJCQlzdHJjYXQocCwidCIpOworI2VuZGlmCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKQorCQlpZiAoIShudW0gJiBCSU9fRlBfVEVYVCkpCisJCQlzdHJjYXQocCwiYiIpOworCQllbHNlCisJCQlzdHJjYXQocCwidCIpOworI2VuZGlmCisJCWZwPWZvcGVuKHB0cixwKTsKKwkJaWYgKGZwID09IE5VTEwpCisJCQl7CisJCQlTWVNlcnIoU1lTX0ZfRk9QRU4sZ2V0X2xhc3Rfc3lzX2Vycm9yKCkpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDUsImZvcGVuKCciLHB0ciwiJywnIixwLCInKSIpOworCQkJQklPZXJyKEJJT19GX0ZJTEVfQ1RSTCxFUlJfUl9TWVNfTElCKTsKKwkJCXJldD0wOworCQkJYnJlYWs7CisJCQl9CisJCWItPnB0cj1mcDsKKwkJYi0+aW5pdD0xOworCQlCSU9fY2xlYXJfZmxhZ3MoYixCSU9fRkxBR1NfVVBMSU5LKTsgLyogd2UgZGlkIGZvcGVuIC0+IHdlIGRpc2VuZ2FnZSBVUExJTksgKi8KKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19HRVRfRklMRV9QVFI6CisJCS8qIHRoZSBwdHIgcGFyYW1ldGVyIGlzIGFjdHVhbGx5IGEgRklMRSAqKiBpbiB0aGlzIGNhc2UuICovCisJCWlmIChwdHIgIT0gTlVMTCkKKwkJCXsKKwkJCWZwcD0oRklMRSAqKilwdHI7CisJCQkqZnBwPShGSUxFICopYi0+cHRyOworCQkJfQorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0dFVF9DTE9TRToKKwkJcmV0PShsb25nKWItPnNodXRkb3duOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKwkJYi0+c2h1dGRvd249KGludCludW07CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRkxVU0g6CisJCWlmIChiLT5mbGFncyZCSU9fRkxBR1NfVVBMSU5LKQorCQkJVVBfZmZsdXNoKGItPnB0cik7CisJCWVsc2UKKwkJCWZmbHVzaCgoRklMRSAqKWItPnB0cik7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRFVQOgorCQlyZXQ9MTsKKwkJYnJlYWs7CisKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCWNhc2UgQklPX0NUUkxfUEVORElORzoKKwljYXNlIEJJT19DVFJMX1BVU0g6CisJY2FzZSBCSU9fQ1RSTF9QT1A6CisJZGVmYXVsdDoKKwkJcmV0PTA7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIGZpbGVfZ2V0cyhCSU8gKmJwLCBjaGFyICpidWYsIGludCBzaXplKQorCXsKKwlpbnQgcmV0PTA7CisKKwlidWZbMF09J1wwJzsKKwlpZiAoYnAtPmZsYWdzJkJJT19GTEFHU19VUExJTkspCisJCXsKKwkJaWYgKCFVUF9mZ2V0cyhidWYsc2l6ZSxicC0+cHRyKSkKKwkJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghZmdldHMoYnVmLHNpemUsKEZJTEUgKilicC0+cHRyKSkKKwkJCWdvdG8gZXJyOworCQl9CisJaWYgKGJ1ZlswXSAhPSAnXDAnKQorCQlyZXQ9c3RybGVuKGJ1Zik7CisJZXJyOgorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBNU19DQUxMQkFDSyBmaWxlX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKQorCXsKKwlpbnQgbixyZXQ7CisKKwluPXN0cmxlbihzdHIpOworCXJldD1maWxlX3dyaXRlKGJwLHN0cixuKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1NURElPICovCisKKyNlbmRpZiAvKiBIRUFERVJfQlNTX0ZJTEVfQyAqLworCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2xvZy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhZDA0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX2xvZy5jCkBAIC0wLDAgKzEsMzczIEBACisvKiBjcnlwdG8vYmlvL2Jzc19sb2cuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKgorCVdoeSBCSU9fc19sb2c/CisKKwlCSU9fc19sb2cgaXMgdXNlZnVsIGZvciBzeXN0ZW0gZGFlbW9ucyAob3Igc2VydmljZXMgdW5kZXIgTlQpLgorCUl0IGlzIG9uZS13YXkgQklPLCBpdCBzZW5kcyBhbGwgc3R1ZmYgdG8gc3lzbG9nZCAob24gc3lzdGVtIHRoYXQKKwljb21tb25seSB1c2UgdGhhdCksIG9yIGV2ZW50IGxvZyAob24gTlQpLCBvciBPUENPTSAob24gT3BlblZNUykuCisKKyovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkNFKQorI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorIyAgaW5jbHVkZSA8b3BjZGVmLmg+CisjICBpbmNsdWRlIDxkZXNjcmlwLmg+CisjICBpbmNsdWRlIDxsaWIkcm91dGluZXMuaD4KKyMgIGluY2x1ZGUgPHN0YXJsZXQuaD4KKyNlbGlmIGRlZmluZWQoX191bHRyaXgpCisjICBpbmNsdWRlIDxzeXMvc3lzbG9nLmg+CisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisjICBkZWZpbmUgTk9fU1lTTE9HCisjZWxpZiAoIWRlZmluZWQoTVNET1MpIHx8IGRlZmluZWQoV0FUVDMyKSkgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfVlhXT1JLUykgJiYgIWRlZmluZWQoTk9fU1lTTE9HKQorIyAgaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2lmbmRlZiBOT19TWVNMT0cKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpCisjZGVmaW5lIExPR19FTUVSRwkwCisjZGVmaW5lIExPR19BTEVSVAkxCisjZGVmaW5lIExPR19DUklUCTIKKyNkZWZpbmUgTE9HX0VSUgkJMworI2RlZmluZSBMT0dfV0FSTklORwk0CisjZGVmaW5lIExPR19OT1RJQ0UJNQorI2RlZmluZSBMT0dfSU5GTwk2CisjZGVmaW5lIExPR19ERUJVRwk3CisKKyNkZWZpbmUgTE9HX0RBRU1PTgkoMzw8MykKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorLyogT24gVk1TLCB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCB0aGVzZSwgYnV0IHdlIG5lZWQgdGhlbSB0byBjb21waWxlICovCisjZGVmaW5lIExPR19FTUVSRwkwCisjZGVmaW5lIExPR19BTEVSVAkxCisjZGVmaW5lIExPR19DUklUCTIKKyNkZWZpbmUgTE9HX0VSUgkJMworI2RlZmluZSBMT0dfV0FSTklORwk0CisjZGVmaW5lIExPR19OT1RJQ0UJNQorI2RlZmluZSBMT0dfSU5GTwk2CisjZGVmaW5lIExPR19ERUJVRwk3CisKKyNkZWZpbmUgTE9HX0RBRU1PTglPUEMkTV9OTV9OVFdPUksKKyNlbmRpZgorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIHNsZ193cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IE1TX0NBTExCQUNLIHNsZ19wdXRzKEJJTyAqaCwgY29uc3QgY2hhciAqc3RyKTsKK3N0YXRpYyBsb25nIE1TX0NBTExCQUNLIHNsZ19jdHJsKEJJTyAqaCwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKTsKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgc2xnX25ldyhCSU8gKmgpOworc3RhdGljIGludCBNU19DQUxMQkFDSyBzbGdfZnJlZShCSU8gKmRhdGEpOworc3RhdGljIHZvaWQgeG9wZW5sb2coQklPKiBicCwgY2hhciogbmFtZSwgaW50IGxldmVsKTsKK3N0YXRpYyB2b2lkIHhzeXNsb2coQklPKiBicCwgaW50IHByaW9yaXR5LCBjb25zdCBjaGFyKiBzdHJpbmcpOworc3RhdGljIHZvaWQgeGNsb3NlbG9nKEJJTyogYnApOworCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX3NsZz0KKwl7CisJQklPX1RZUEVfTUVNLCJzeXNsb2ciLAorCXNsZ193cml0ZSwKKwlOVUxMLAorCXNsZ19wdXRzLAorCU5VTEwsCisJc2xnX2N0cmwsCisJc2xnX25ldywKKwlzbGdfZnJlZSwKKwlOVUxMLAorCX07CisKK0JJT19NRVRIT0QgKkJJT19zX2xvZyh2b2lkKQorCXsKKwlyZXR1cm4oJm1ldGhvZHNfc2xnKTsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgc2xnX25ldyhCSU8gKmJpKQorCXsKKwliaS0+aW5pdD0xOworCWJpLT5udW09MDsKKwliaS0+cHRyPU5VTEw7CisJeG9wZW5sb2coYmksICJhcHBsaWNhdGlvbiIsIExPR19EQUVNT04pOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgc2xnX2ZyZWUoQklPICphKQorCXsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJeGNsb3NlbG9nKGEpOworCXJldHVybigxKTsKKwl9CisJCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIHNsZ193cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5sKQorCXsKKwlpbnQgcmV0PSBpbmw7CisJY2hhciogYnVmOworCWNoYXIqIHBwOworCWludCBwcmlvcml0eSwgaTsKKwlzdGF0aWMgY29uc3Qgc3RydWN0CisJCXsKKwkJaW50IHN0cmw7CisJCWNoYXIgc3RyWzEwXTsKKwkJaW50IGxvZ19sZXZlbDsKKwkJfQorCW1hcHBpbmdbXSA9CisJCXsKKwkJeyA2LCAiUEFOSUMgIiwgTE9HX0VNRVJHIH0sCisJCXsgNiwgIkVNRVJHICIsIExPR19FTUVSRyB9LAorCQl7IDQsICJFTVIgIiwgTE9HX0VNRVJHIH0sCisJCXsgNiwgIkFMRVJUICIsIExPR19BTEVSVCB9LAorCQl7IDQsICJBTFIgIiwgTE9HX0FMRVJUIH0sCisJCXsgNSwgIkNSSVQgIiwgTE9HX0NSSVQgfSwKKwkJeyA0LCAiQ1JJICIsIExPR19DUklUIH0sCisJCXsgNiwgIkVSUk9SICIsIExPR19FUlIgfSwKKwkJeyA0LCAiRVJSICIsIExPR19FUlIgfSwKKwkJeyA4LCAiV0FSTklORyAiLCBMT0dfV0FSTklORyB9LAorCQl7IDUsICJXQVJOICIsIExPR19XQVJOSU5HIH0sCisJCXsgNCwgIldBUiAiLCBMT0dfV0FSTklORyB9LAorCQl7IDcsICJOT1RJQ0UgIiwgTE9HX05PVElDRSB9LAorCQl7IDUsICJOT1RFICIsIExPR19OT1RJQ0UgfSwKKwkJeyA0LCAiTk9UICIsIExPR19OT1RJQ0UgfSwKKwkJeyA1LCAiSU5GTyAiLCBMT0dfSU5GTyB9LAorCQl7IDQsICJJTkYgIiwgTE9HX0lORk8gfSwKKwkJeyA2LCAiREVCVUcgIiwgTE9HX0RFQlVHIH0sCisJCXsgNCwgIkRCRyAiLCBMT0dfREVCVUcgfSwKKwkJeyAwLCAiIiwgTE9HX0VSUiB9IC8qIFRoZSBkZWZhdWx0ICovCisJCX07CisKKwlpZigoYnVmPSAoY2hhciAqKU9QRU5TU0xfbWFsbG9jKGlubCsgMSkpID09IE5VTEwpeworCQlyZXR1cm4oMCk7CisJfQorCXN0cm5jcHkoYnVmLCBpbiwgaW5sKTsKKwlidWZbaW5sXT0gJ1wwJzsKKworCWkgPSAwOworCXdoaWxlKHN0cm5jbXAoYnVmLCBtYXBwaW5nW2ldLnN0ciwgbWFwcGluZ1tpXS5zdHJsKSAhPSAwKSBpKys7CisJcHJpb3JpdHkgPSBtYXBwaW5nW2ldLmxvZ19sZXZlbDsKKwlwcCA9IGJ1ZiArIG1hcHBpbmdbaV0uc3RybDsKKworCXhzeXNsb2coYiwgcHJpb3JpdHksIHBwKTsKKworCU9QRU5TU0xfZnJlZShidWYpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgTVNfQ0FMTEJBQ0sgc2xnX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgQklPX0NUUkxfU0VUOgorCQl4Y2xvc2Vsb2coYik7CisJCXhvcGVubG9nKGIsIHB0ciwgbnVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCitzdGF0aWMgaW50IE1TX0NBTExCQUNLIHNsZ19wdXRzKEJJTyAqYnAsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJaW50IG4scmV0OworCisJbj1zdHJsZW4oc3RyKTsKKwlyZXQ9c2xnX3dyaXRlKGJwLHN0cixuKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKQorCitzdGF0aWMgdm9pZCB4b3BlbmxvZyhCSU8qIGJwLCBjaGFyKiBuYW1lLCBpbnQgbGV2ZWwpCit7CisJaWYgKEdldFZlcnNpb24oKSA8IDB4ODAwMDAwMDApCisJCWJwLT5wdHIgPSBSZWdpc3RlckV2ZW50U291cmNlQShOVUxMLG5hbWUpOworCWVsc2UKKwkJYnAtPnB0ciA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHhzeXNsb2coQklPICpicCwgaW50IHByaW9yaXR5LCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJTFBDU1RSIGxwc3pTdHJpbmdzWzJdOworCVdPUkQgZXZ0eXBlPSBFVkVOVExPR19FUlJPUl9UWVBFOworCWNoYXIgcGlkYnVmW0RFQ0lNQUxfU0laRShEV09SRCkrNF07CisKKwlpZiAoYnAtPnB0ciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHByaW9yaXR5KQorCQl7CisJY2FzZSBMT0dfRU1FUkc6CisJY2FzZSBMT0dfQUxFUlQ6CisJY2FzZSBMT0dfQ1JJVDoKKwljYXNlIExPR19FUlI6CisJCWV2dHlwZSA9IEVWRU5UTE9HX0VSUk9SX1RZUEU7CisJCWJyZWFrOworCWNhc2UgTE9HX1dBUk5JTkc6CisJCWV2dHlwZSA9IEVWRU5UTE9HX1dBUk5JTkdfVFlQRTsKKwkJYnJlYWs7CisJY2FzZSBMT0dfTk9USUNFOgorCWNhc2UgTE9HX0lORk86CisJY2FzZSBMT0dfREVCVUc6CisJCWV2dHlwZSA9IEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CQkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgc2V0IGl0CisJCQkJICAgYXMgZXJyb3IgYW55d2F5LiAqLworCQlldnR5cGUgPSBFVkVOVExPR19FUlJPUl9UWVBFOworCQlicmVhazsKKwkJfQorCisJc3ByaW50ZihwaWRidWYsICJbJXVdICIsIEdldEN1cnJlbnRQcm9jZXNzSWQoKSk7CisJbHBzelN0cmluZ3NbMF0gPSBwaWRidWY7CisJbHBzelN0cmluZ3NbMV0gPSBzdHJpbmc7CisKKwlSZXBvcnRFdmVudEEoYnAtPnB0ciwgZXZ0eXBlLCAwLCAxMDI0LCBOVUxMLCAyLCAwLAorCQkJCWxwc3pTdHJpbmdzLCBOVUxMKTsKK30KKwkKK3N0YXRpYyB2b2lkIHhjbG9zZWxvZyhCSU8qIGJwKQoreworCWlmKGJwLT5wdHIpCisJCURlcmVnaXN0ZXJFdmVudFNvdXJjZSgoSEFORExFKShicC0+cHRyKSk7CisJYnAtPnB0cj0gTlVMTDsKK30KKworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpCisKK3N0YXRpYyBpbnQgVk1TX09QQ190YXJnZXQgPSBMT0dfREFFTU9OOworCitzdGF0aWMgdm9pZCB4b3BlbmxvZyhCSU8qIGJwLCBjaGFyKiBuYW1lLCBpbnQgbGV2ZWwpCit7CisJVk1TX09QQ190YXJnZXQgPSBsZXZlbDsgCit9CisKK3N0YXRpYyB2b2lkIHhzeXNsb2coQklPICpicCwgaW50IHByaW9yaXR5LCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJc3RydWN0IGRzYyRkZXNjcmlwdG9yX3Mgb3BjX2RzYzsKKwlzdHJ1Y3Qgb3BjZGVmICpvcGNkZWZfcDsKKwljaGFyIGJ1ZlsxMDI0MF07CisJdW5zaWduZWQgaW50IGxlbjsKKyAgICAgICAgc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MgYnVmX2RzYzsKKwkkREVTQ1JJUFRPUihmYW9fY21kLCAiIUFaOiAhQVoiKTsKKwljaGFyICpwcmlvcml0eV90YWc7CisKKwlzd2l0Y2ggKHByaW9yaXR5KQorCSAgeworCSAgY2FzZSBMT0dfRU1FUkc6IHByaW9yaXR5X3RhZyA9ICJFbWVyZ2VuY3kiOyBicmVhazsKKwkgIGNhc2UgTE9HX0FMRVJUOiBwcmlvcml0eV90YWcgPSAiQWxlcnQiOyBicmVhazsKKwkgIGNhc2UgTE9HX0NSSVQ6IHByaW9yaXR5X3RhZyA9ICJDcml0aWNhbCI7IGJyZWFrOworCSAgY2FzZSBMT0dfRVJSOiBwcmlvcml0eV90YWcgPSAiRXJyb3IiOyBicmVhazsKKwkgIGNhc2UgTE9HX1dBUk5JTkc6IHByaW9yaXR5X3RhZyA9ICJXYXJuaW5nIjsgYnJlYWs7CisJICBjYXNlIExPR19OT1RJQ0U6IHByaW9yaXR5X3RhZyA9ICJOb3RpY2UiOyBicmVhazsKKwkgIGNhc2UgTE9HX0lORk86IHByaW9yaXR5X3RhZyA9ICJJbmZvIjsgYnJlYWs7CisJICBjYXNlIExPR19ERUJVRzogcHJpb3JpdHlfdGFnID0gIkRFQlVHIjsgYnJlYWs7CisJICB9CisKKwlidWZfZHNjLmRzYyRiX2R0eXBlID0gRFNDJEtfRFRZUEVfVDsKKwlidWZfZHNjLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfUzsKKwlidWZfZHNjLmRzYyRhX3BvaW50ZXIgPSBidWY7CisJYnVmX2RzYy5kc2Mkd19sZW5ndGggPSBzaXplb2YoYnVmKSAtIDE7CisKKwlsaWIkc3lzX2ZhbygmZmFvX2NtZCwgJmxlbiwgJmJ1Zl9kc2MsIHByaW9yaXR5X3RhZywgc3RyaW5nKTsKKworCS8qIHdlIGtub3cgdGhlcmUncyBhbiA4IGJ5dGUgaGVhZGVyLiAgVGhhdCdzIGRvY3VtZW50ZWQgKi8KKwlvcGNkZWZfcCA9IChzdHJ1Y3Qgb3BjZGVmICopIE9QRU5TU0xfbWFsbG9jKDggKyBsZW4pOworCW9wY2RlZl9wLT5vcGMkYl9tc190eXBlID0gT1BDJF9SUV9SUVNUOworCW1lbWNweShvcGNkZWZfcC0+b3BjJHpfbXNfdGFyZ2V0X2NsYXNzZXMsICZWTVNfT1BDX3RhcmdldCwgMyk7CisJb3BjZGVmX3AtPm9wYyRsX21zX3Jxc3RpZCA9IDA7CisJbWVtY3B5KCZvcGNkZWZfcC0+b3BjJGxfbXNfdGV4dCwgYnVmLCBsZW4pOworCisJb3BjX2RzYy5kc2MkYl9kdHlwZSA9IERTQyRLX0RUWVBFX1Q7CisJb3BjX2RzYy5kc2MkYl9jbGFzcyA9IERTQyRLX0NMQVNTX1M7CisJb3BjX2RzYy5kc2MkYV9wb2ludGVyID0gKGNoYXIgKilvcGNkZWZfcDsKKwlvcGNfZHNjLmRzYyR3X2xlbmd0aCA9IGxlbiArIDg7CisKKwlzeXMkc25kb3ByKG9wY19kc2MsIDApOworCisJT1BFTlNTTF9mcmVlKG9wY2RlZl9wKTsKK30KKworc3RhdGljIHZvaWQgeGNsb3NlbG9nKEJJTyogYnApCit7Cit9CisKKyNlbHNlIC8qIFVuaXgvV2F0dDMyICovCisKK3N0YXRpYyB2b2lkIHhvcGVubG9nKEJJTyogYnAsIGNoYXIqIG5hbWUsIGludCBsZXZlbCkKK3sKKyNpZmRlZiBXQVRUMzIgICAvKiBkamdwcC9ET1MgKi8KKwlvcGVubG9nKG5hbWUsIExPR19QSUR8TE9HX0NPTlN8TE9HX05ERUxBWSwgbGV2ZWwpOworI2Vsc2UKKwlvcGVubG9nKG5hbWUsIExPR19QSUR8TE9HX0NPTlMsIGxldmVsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCB4c3lzbG9nKEJJTyAqYnAsIGludCBwcmlvcml0eSwgY29uc3QgY2hhciAqc3RyaW5nKQoreworCXN5c2xvZyhwcmlvcml0eSwgIiVzIiwgc3RyaW5nKTsKK30KKworc3RhdGljIHZvaWQgeGNsb3NlbG9nKEJJTyogYnApCit7CisJY2xvc2Vsb2coKTsKK30KKworI2VuZGlmIC8qIFVuaXggKi8KKworI2VuZGlmIC8qIE5PX1NZU0xPRyAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfbWVtLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Q0MTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfbWVtLmMKQEAgLTAsMCArMSwzMTkgQEAKKy8qIGNyeXB0by9iaW8vYnNzX21lbS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorCitzdGF0aWMgaW50IG1lbV93cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IG1lbV9yZWFkKEJJTyAqaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IG1lbV9wdXRzKEJJTyAqaCwgY29uc3QgY2hhciAqc3RyKTsKK3N0YXRpYyBpbnQgbWVtX2dldHMoQklPICpoLCBjaGFyICpzdHIsIGludCBzaXplKTsKK3N0YXRpYyBsb25nIG1lbV9jdHJsKEJJTyAqaCwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKTsKK3N0YXRpYyBpbnQgbWVtX25ldyhCSU8gKmgpOworc3RhdGljIGludCBtZW1fZnJlZShCSU8gKmRhdGEpOworc3RhdGljIEJJT19NRVRIT0QgbWVtX21ldGhvZD0KKwl7CisJQklPX1RZUEVfTUVNLAorCSJtZW1vcnkgYnVmZmVyIiwKKwltZW1fd3JpdGUsCisJbWVtX3JlYWQsCisJbWVtX3B1dHMsCisJbWVtX2dldHMsCisJbWVtX2N0cmwsCisJbWVtX25ldywKKwltZW1fZnJlZSwKKwlOVUxMLAorCX07CisKKy8qIGJpby0+bnVtIGlzIHVzZWQgdG8gaG9sZCB0aGUgdmFsdWUgdG8gcmV0dXJuIG9uICdlbXB0eScsIGlmIGl0IGlzCisgKiAwLCBzaG91bGRfcmV0cnkgaXMgbm90IHNldCAqLworCitCSU9fTUVUSE9EICpCSU9fc19tZW0odm9pZCkKKwl7CisJcmV0dXJuKCZtZW1fbWV0aG9kKTsKKwl9CisKK0JJTyAqQklPX25ld19tZW1fYnVmKHZvaWQgKmJ1ZiwgaW50IGxlbikKK3sKKwlCSU8gKnJldDsKKwlCVUZfTUVNICpiOworCXNpemVfdCBzejsKKworCWlmICghYnVmKSB7CisJCUJJT2VycihCSU9fRl9CSU9fTkVXX01FTV9CVUYsQklPX1JfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3ogPSAobGVuPDApID8gc3RybGVuKGJ1ZikgOiAoc2l6ZV90KWxlbjsKKwlpZighKHJldCA9IEJJT19uZXcoQklPX3NfbWVtKCkpKSApIHJldHVybiBOVUxMOworCWIgPSAoQlVGX01FTSAqKXJldC0+cHRyOworCWItPmRhdGEgPSBidWY7CisJYi0+bGVuZ3RoID0gc3o7CisJYi0+bWF4ID0gc3o7CisJcmV0LT5mbGFncyB8PSBCSU9fRkxBR1NfTUVNX1JET05MWTsKKwkvKiBTaW5jZSB0aGlzIGlzIHN0YXRpYyBkYXRhIHJldHJ5aW5nIHdvbnQgaGVscCAqLworCXJldC0+bnVtID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lbV9uZXcoQklPICpiaSkKKwl7CisJQlVGX01FTSAqYjsKKworCWlmICgoYj1CVUZfTUVNX25ldygpKSA9PSBOVUxMKQorCQlyZXR1cm4oMCk7CisJYmktPnNodXRkb3duPTE7CisJYmktPmluaXQ9MTsKKwliaS0+bnVtPSAtMTsKKwliaS0+cHRyPShjaGFyICopYjsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IG1lbV9mcmVlKEJJTyAqYSkKKwl7CisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCWlmIChhLT5zaHV0ZG93bikKKwkJeworCQlpZiAoKGEtPmluaXQpICYmIChhLT5wdHIgIT0gTlVMTCkpCisJCQl7CisJCQlCVUZfTUVNICpiOworCQkJYiA9IChCVUZfTUVNICopYS0+cHRyOworCQkJaWYoYS0+ZmxhZ3MgJiBCSU9fRkxBR1NfTUVNX1JET05MWSkgYi0+ZGF0YSA9IE5VTEw7CisJCQlCVUZfTUVNX2ZyZWUoYik7CisJCQlhLT5wdHI9TlVMTDsKKwkJCX0KKwkJfQorCXJldHVybigxKTsKKwl9CisJCitzdGF0aWMgaW50IG1lbV9yZWFkKEJJTyAqYiwgY2hhciAqb3V0LCBpbnQgb3V0bCkKKwl7CisJaW50IHJldD0gLTE7CisJQlVGX01FTSAqYm07CisKKwlibT0oQlVGX01FTSAqKWItPnB0cjsKKwlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJcmV0PShvdXRsID49MCAmJiAoc2l6ZV90KW91dGwgPiBibS0+bGVuZ3RoKT8oaW50KWJtLT5sZW5ndGg6b3V0bDsKKwlpZiAoKG91dCAhPSBOVUxMKSAmJiAocmV0ID4gMCkpIHsKKwkJbWVtY3B5KG91dCxibS0+ZGF0YSxyZXQpOworCQlibS0+bGVuZ3RoLT1yZXQ7CisJCWlmKGItPmZsYWdzICYgQklPX0ZMQUdTX01FTV9SRE9OTFkpIGJtLT5kYXRhICs9IHJldDsKKwkJZWxzZSB7CisJCQltZW1tb3ZlKCYoYm0tPmRhdGFbMF0pLCYoYm0tPmRhdGFbcmV0XSksYm0tPmxlbmd0aCk7CisJCX0KKwl9IGVsc2UgaWYgKGJtLT5sZW5ndGggPT0gMCkKKwkJeworCQlyZXQgPSBiLT5udW07CisJCWlmIChyZXQgIT0gMCkKKwkJCUJJT19zZXRfcmV0cnlfcmVhZChiKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBtZW1fd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkKKwl7CisJaW50IHJldD0gLTE7CisJaW50IGJsZW47CisJQlVGX01FTSAqYm07CisKKwlibT0oQlVGX01FTSAqKWItPnB0cjsKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlCSU9lcnIoQklPX0ZfTUVNX1dSSVRFLEJJT19SX05VTExfUEFSQU1FVEVSKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmKGItPmZsYWdzICYgQklPX0ZMQUdTX01FTV9SRE9OTFkpIHsKKwkJQklPZXJyKEJJT19GX01FTV9XUklURSxCSU9fUl9XUklURV9UT19SRUFEX09OTFlfQklPKTsKKwkJZ290byBlbmQ7CisJfQorCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCWJsZW49Ym0tPmxlbmd0aDsKKwlpZiAoQlVGX01FTV9ncm93X2NsZWFuKGJtLGJsZW4raW5sKSAhPSAoYmxlbitpbmwpKQorCQlnb3RvIGVuZDsKKwltZW1jcHkoJihibS0+ZGF0YVtibGVuXSksaW4saW5sKTsKKwlyZXQ9aW5sOworZW5kOgorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgbWVtX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlsb25nIHJldD0xOworCWNoYXIgKipwcHRyOworCisJQlVGX01FTSAqYm09KEJVRl9NRU0gKiliLT5wdHI7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgQklPX0NUUkxfUkVTRVQ6CisJCWlmIChibS0+ZGF0YSAhPSBOVUxMKQorCQkJeworCQkJLyogRm9yIHJlYWQgb25seSBjYXNlIHJlc2V0IHRvIHRoZSBzdGFydCBhZ2FpbiAqLworCQkJaWYoYi0+ZmxhZ3MgJiBCSU9fRkxBR1NfTUVNX1JET05MWSkgCisJCQkJeworCQkJCWJtLT5kYXRhIC09IGJtLT5tYXggLSBibS0+bGVuZ3RoOworCQkJCWJtLT5sZW5ndGggPSBibS0+bWF4OworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJbWVtc2V0KGJtLT5kYXRhLDAsYm0tPm1heCk7CisJCQkJYm0tPmxlbmd0aD0wOworCQkJCX0KKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9FT0Y6CisJCXJldD0obG9uZykoYm0tPmxlbmd0aCA9PSAwKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19TRVRfQlVGX01FTV9FT0ZfUkVUVVJOOgorCQliLT5udW09KGludCludW07CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfSU5GTzoKKwkJcmV0PShsb25nKWJtLT5sZW5ndGg7CisJCWlmIChwdHIgIT0gTlVMTCkKKwkJCXsKKwkJCXBwdHI9KGNoYXIgKiopcHRyOworCQkJKnBwdHI9KGNoYXIgKikmKGJtLT5kYXRhWzBdKTsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19TRVRfQlVGX01FTToKKwkJbWVtX2ZyZWUoYik7CisJCWItPnNodXRkb3duPShpbnQpbnVtOworCQliLT5wdHI9cHRyOworCQlicmVhazsKKwljYXNlIEJJT19DX0dFVF9CVUZfTUVNX1BUUjoKKwkJaWYgKHB0ciAhPSBOVUxMKQorCQkJeworCQkJcHB0cj0oY2hhciAqKilwdHI7CisJCQkqcHB0cj0oY2hhciAqKWJtOworCQkJfQorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0dFVF9DTE9TRToKKwkJcmV0PShsb25nKWItPnNodXRkb3duOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKwkJYi0+c2h1dGRvd249KGludCludW07CisJCWJyZWFrOworCisJY2FzZSBCSU9fQ1RSTF9XUEVORElORzoKKwkJcmV0PTBMOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1BFTkRJTkc6CisJCXJldD0obG9uZylibS0+bGVuZ3RoOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0RVUDoKKwljYXNlIEJJT19DVFJMX0ZMVVNIOgorCQlyZXQ9MTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9QVVNIOgorCWNhc2UgQklPX0NUUkxfUE9QOgorCWRlZmF1bHQ6CisJCXJldD0wOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBtZW1fZ2V0cyhCSU8gKmJwLCBjaGFyICpidWYsIGludCBzaXplKQorCXsKKwlpbnQgaSxqOworCWludCByZXQ9IC0xOworCWNoYXIgKnA7CisJQlVGX01FTSAqYm09KEJVRl9NRU0gKilicC0+cHRyOworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGJwKTsKKwlqPWJtLT5sZW5ndGg7CisJaWYgKChzaXplLTEpIDwgaikgaj1zaXplLTE7CisJaWYgKGogPD0gMCkKKwkJeworCQkqYnVmPSdcMCc7CisJCXJldHVybiAwOworCQl9CisJcD1ibS0+ZGF0YTsKKwlmb3IgKGk9MDsgaTxqOyBpKyspCisJCXsKKwkJaWYgKHBbaV0gPT0gJ1xuJykKKwkJCXsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQkJfQorCQl9CisKKwkvKgorCSAqIGkgaXMgbm93IHRoZSBtYXggbnVtIG9mIGJ5dGVzIHRvIGNvcHksIGVpdGhlciBqIG9yIHVwIHRvCisJICogYW5kIGluY2x1ZGluZyB0aGUgZmlyc3QgbmV3bGluZQorCSAqLyAKKworCWk9bWVtX3JlYWQoYnAsYnVmLGkpOworCWlmIChpID4gMCkgYnVmW2ldPSdcMCc7CisJcmV0PWk7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IG1lbV9wdXRzKEJJTyAqYnAsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJaW50IG4scmV0OworCisJbj1zdHJsZW4oc3RyKTsKKwlyZXQ9bWVtX3dyaXRlKGJwLHN0cixuKTsKKwkvKiBtZW1vcnkgc2VtYW50aWNzIGlzIHRoYXQgaXQgd2lsbCBhbHdheXMgd29yayAqLworCXJldHVybihyZXQpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfbnVsbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfbnVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YjczMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19udWxsLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qIGNyeXB0by9iaW8vYnNzX251bGwuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworc3RhdGljIGludCBudWxsX3dyaXRlKEJJTyAqaCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtKTsKK3N0YXRpYyBpbnQgbnVsbF9yZWFkKEJJTyAqaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IG51bGxfcHV0cyhCSU8gKmgsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IG51bGxfZ2V0cyhCSU8gKmgsIGNoYXIgKnN0ciwgaW50IHNpemUpOworc3RhdGljIGxvbmcgbnVsbF9jdHJsKEJJTyAqaCwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKTsKK3N0YXRpYyBpbnQgbnVsbF9uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgbnVsbF9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgQklPX01FVEhPRCBudWxsX21ldGhvZD0KKwl7CisJQklPX1RZUEVfTlVMTCwKKwkiTlVMTCIsCisJbnVsbF93cml0ZSwKKwludWxsX3JlYWQsCisJbnVsbF9wdXRzLAorCW51bGxfZ2V0cywKKwludWxsX2N0cmwsCisJbnVsbF9uZXcsCisJbnVsbF9mcmVlLAorCU5VTEwsCisJfTsKKworQklPX01FVEhPRCAqQklPX3NfbnVsbCh2b2lkKQorCXsKKwlyZXR1cm4oJm51bGxfbWV0aG9kKTsKKwl9CisKK3N0YXRpYyBpbnQgbnVsbF9uZXcoQklPICpiaSkKKwl7CisJYmktPmluaXQ9MTsKKwliaS0+bnVtPTA7CisJYmktPnB0cj0oTlVMTCk7CisJcmV0dXJuKDEpOworCX0KKworc3RhdGljIGludCBudWxsX2ZyZWUoQklPICphKQorCXsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJcmV0dXJuKDEpOworCX0KKwkKK3N0YXRpYyBpbnQgbnVsbF9yZWFkKEJJTyAqYiwgY2hhciAqb3V0LCBpbnQgb3V0bCkKKwl7CisJcmV0dXJuKDApOworCX0KKworc3RhdGljIGludCBudWxsX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpCisJeworCXJldHVybihpbmwpOworCX0KKworc3RhdGljIGxvbmcgbnVsbF9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJbG9uZyByZXQ9MTsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBCSU9fQ1RSTF9SRVNFVDoKKwljYXNlIEJJT19DVFJMX0VPRjoKKwljYXNlIEJJT19DVFJMX1NFVDoKKwljYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKwljYXNlIEJJT19DVFJMX0ZMVVNIOgorCWNhc2UgQklPX0NUUkxfRFVQOgorCQlyZXQ9MTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9HRVRfQ0xPU0U6CisJY2FzZSBCSU9fQ1RSTF9JTkZPOgorCWNhc2UgQklPX0NUUkxfR0VUOgorCWNhc2UgQklPX0NUUkxfUEVORElORzoKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCWRlZmF1bHQ6CisJCXJldD0wOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBudWxsX2dldHMoQklPICpicCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKKwl7CisJcmV0dXJuKDApOworCX0KKworc3RhdGljIGludCBudWxsX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKQorCXsKKwlpZiAoc3RyID09IE5VTEwpIHJldHVybigwKTsKKwlyZXR1cm4oc3RybGVuKHN0cikpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfcnRjcC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Jpby9ic3NfcnRjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYWU0ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19ydGNwLmMKQEAgLTAsMCArMSwyOTQgQEAKKy8qIGNyeXB0by9iaW8vYnNzX3J0Y3AuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBXcml0dGVuIGJ5IERhdmlkIEwuIEpvbmVzIDxqb25lc2RAa2NnbDEuZW5nLm9oaW8tc3RhdGUuZWR1PgorICogRGF0ZTogICAyMi1KVUwtMTk5NgorICogUmV2aXNlZDogMjUtU0VQLTE5OTcJCVVwZGF0ZSBmb3IgMC44LjEsIEJJT19DVFJMX1NFVCAtPiBCSU9fQ19TRVRfRkQKKyAqLworLyogVk1TICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKworI2luY2x1ZGUgPGlvZGVmLmg+CQkvKiBWTVMgSU8kXyBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgPHN0YXJsZXQuaD4KKwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpb19jaGFubmVsOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdHJ1Y3QgaW9fc3RhdHVzIHsgc2hvcnQgc3RhdHVzLCBjb3VudDsgbG9uZyBmbGFnczsgfTsKKworc3RydWN0IHJwY19tc2cgewkJLyogU2hvdWxkIGhhdmUgbWVtYmVyIGFsaWdubWVudCBpbmhpYml0ZWQgKi8KKyAgIGNoYXIgY2hhbm5lbDsJCS8qICdBJy1hcHAgZGF0YS4gJ1InLXJlbW90ZSBjbGllbnQgJ0cnLWdsb2JhbCAqLworICAgY2hhciBmdW5jdGlvbjsJCS8qICdHJy1nZXQsICdQJy1wdXQsICdDJy1jb25maXJtLCAnWCctY2xvc2UgKi8KKyAgIHVuc2lnbmVkIHNob3J0IGludCBsZW5ndGg7CS8qIEFtb3VudCBvZiBkYXRhIHJldHVybmVkIG9yIG1heCB0byByZXR1cm4gKi8KKyAgIGNoYXIgZGF0YVs0MDkyXTsJCS8qIHZhcmlhYmxlIGRhdGEgKi8KK307CisjZGVmaW5lIFJQQ19IRFJfU0laRSAoc2l6ZW9mKHN0cnVjdCBycGNfbXNnKSAtIDQwOTIpCisKK3N0cnVjdCBycGNfY3R4IHsKKyAgICBpbnQgZmlsbGVkLCBwb3M7CisgICAgc3RydWN0IHJwY19tc2cgbXNnOworfTsKKworc3RhdGljIGludCBydGNwX3dyaXRlKEJJTyAqaCxjb25zdCBjaGFyICpidWYsaW50IG51bSk7CitzdGF0aWMgaW50IHJ0Y3BfcmVhZChCSU8gKmgsY2hhciAqYnVmLGludCBzaXplKTsKK3N0YXRpYyBpbnQgcnRjcF9wdXRzKEJJTyAqaCxjb25zdCBjaGFyICpzdHIpOworc3RhdGljIGludCBydGNwX2dldHMoQklPICpoLGNoYXIgKnN0cixpbnQgc2l6ZSk7CitzdGF0aWMgbG9uZyBydGNwX2N0cmwoQklPICpoLGludCBjbWQsbG9uZyBhcmcxLHZvaWQgKmFyZzIpOworc3RhdGljIGludCBydGNwX25ldyhCSU8gKmgpOworc3RhdGljIGludCBydGNwX2ZyZWUoQklPICpkYXRhKTsKKworc3RhdGljIEJJT19NRVRIT0QgcnRjcF9tZXRob2Q9CisJeworCUJJT19UWVBFX0ZELAorCSJSVENQIiwKKwlydGNwX3dyaXRlLAorCXJ0Y3BfcmVhZCwKKwlydGNwX3B1dHMsCisJcnRjcF9nZXRzLAorCXJ0Y3BfY3RybCwKKwlydGNwX25ldywKKwlydGNwX2ZyZWUsCisJTlVMTCwKKwl9OworCitCSU9fTUVUSE9EICpCSU9fc19ydGNwKHZvaWQpCisJeworCXJldHVybigmcnRjcF9tZXRob2QpOworCX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERlY25ldCBJL08gcm91dGluZXMuCisgKi8KKworI2lmZGVmIF9fREVDQworI3ByYWdtYSBtZXNzYWdlIHNhdmUKKyNwcmFnbWEgbWVzc2FnZSBkaXNhYmxlIERPTExBUklECisjZW5kaWYKKworc3RhdGljIGludCBnZXQgKCBpb19jaGFubmVsIGNoYW4sIGNoYXIgKmJ1ZmZlciwgaW50IG1heGxlbiwgaW50ICpsZW5ndGggKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RydWN0IGlvX3N0YXR1cyBpb3NiOworICAgIHN0YXR1cyA9IHN5cyRxaW93ICggMCwgY2hhbiwgSU8kX1JFQURWQkxLLCAmaW9zYiwgMCwgMCwKKwlidWZmZXIsIG1heGxlbiwgMCwgMCwgMCwgMCApOworICAgIGlmICggKHN0YXR1cyYxKSA9PSAxICkgc3RhdHVzID0gaW9zYi5zdGF0dXM7CisgICAgaWYgKCAoc3RhdHVzJjEpID09IDEgKSAqbGVuZ3RoID0gaW9zYi5jb3VudDsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHB1dCAoIGlvX2NoYW5uZWwgY2hhbiwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoICkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIHN0cnVjdCBpb19zdGF0dXMgaW9zYjsKKyAgICBzdGF0dXMgPSBzeXMkcWlvdyAoIDAsIGNoYW4sIElPJF9XUklURVZCTEssICZpb3NiLCAwLCAwLAorCWJ1ZmZlciwgbGVuZ3RoLCAwLCAwLCAwLCAwICk7CisgICAgaWYgKCAoc3RhdHVzJjEpID09IDEgKSBzdGF0dXMgPSBpb3NiLnN0YXR1czsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisjaWZkZWYgX19ERUNDCisjcHJhZ21hIG1lc3NhZ2UgcmVzdG9yZQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgcnRjcF9uZXcoQklPICpiaSkKK3sKKyAgICBzdHJ1Y3QgcnBjX2N0eCAqY3R4OworCWJpLT5pbml0PTE7CisJYmktPm51bT0wOworCWJpLT5mbGFncyA9IDA7CisJYmktPnB0cj1PUEVOU1NMX21hbGxvYyhzaXplb2Yoc3RydWN0IHJwY19jdHgpKTsKKwljdHggPSAoc3RydWN0IHJwY19jdHggKikgYmktPnB0cjsKKwljdHgtPmZpbGxlZCA9IDA7CisJY3R4LT5wb3MgPSAwOworCXJldHVybigxKTsKK30KKworc3RhdGljIGludCBydGNwX2ZyZWUoQklPICphKQoreworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKwlpZiAoIGEtPnB0ciApIE9QRU5TU0xfZnJlZSAoIGEtPnB0ciApOworCWEtPnB0ciA9IE5VTEw7CisJcmV0dXJuKDEpOworfQorCQorc3RhdGljIGludCBydGNwX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQoreworICAgIGludCBzdGF0dXMsIGxlbmd0aDsKKyAgICBzdHJ1Y3QgcnBjX2N0eCAqY3R4OworICAgIC8qCisgICAgICogcmVhZCBkYXRhLCByZXR1cm4gZXhpc3RpbmcuCisgICAgICovCisgICAgY3R4ID0gKHN0cnVjdCBycGNfY3R4ICopIGItPnB0cjsKKyAgICBpZiAoIGN0eC0+cG9zIDwgY3R4LT5maWxsZWQgKSB7CisJbGVuZ3RoID0gY3R4LT5maWxsZWQgLSBjdHgtPnBvczsKKwlpZiAoIGxlbmd0aCA+IG91dGwgKSBsZW5ndGggPSBvdXRsOworCW1lbW1vdmUgKCBvdXQsICZjdHgtPm1zZy5kYXRhW2N0eC0+cG9zXSwgbGVuZ3RoICk7CisJY3R4LT5wb3MgKz0gbGVuZ3RoOworCXJldHVybiBsZW5ndGg7CisgICAgfQorICAgIC8qCisgICAgICogUmVxdXN0IG1vcmUgZGF0YSBmcm9tIFIgY2hhbm5lbC4KKyAgICAgKi8KKyAgICBjdHgtPm1zZy5jaGFubmVsID0gJ1InOworICAgIGN0eC0+bXNnLmZ1bmN0aW9uID0gJ0cnOworICAgIGN0eC0+bXNnLmxlbmd0aCA9IHNpemVvZihjdHgtPm1zZy5kYXRhKTsKKyAgICBzdGF0dXMgPSBwdXQgKCBiLT5udW0sIChjaGFyICopICZjdHgtPm1zZywgUlBDX0hEUl9TSVpFICk7CisgICAgaWYgKCAoc3RhdHVzJjEpID09IDAgKSB7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICAvKgorICAgICAqIFJlYWQuCisgICAgICovCisgICAgY3R4LT5wb3MgPSBjdHgtPmZpbGxlZCA9IDA7CisgICAgc3RhdHVzID0gZ2V0ICggYi0+bnVtLCAoY2hhciAqKSAmY3R4LT5tc2csIHNpemVvZihjdHgtPm1zZyksICZsZW5ndGggKTsKKyAgICBpZiAoIChzdGF0dXMmMSkgPT0gMCApIGxlbmd0aCA9IC0xOworICAgIGlmICggY3R4LT5tc2cuY2hhbm5lbCAhPSAnUicgfHwgY3R4LT5tc2cuZnVuY3Rpb24gIT0gJ0MnICkgeworCWxlbmd0aCA9IC0xOworICAgIH0KKyAgICBjdHgtPmZpbGxlZCA9IGxlbmd0aCAtIFJQQ19IRFJfU0laRTsKKyAgICAKKyAgICBpZiAoIGN0eC0+cG9zIDwgY3R4LT5maWxsZWQgKSB7CisJbGVuZ3RoID0gY3R4LT5maWxsZWQgLSBjdHgtPnBvczsKKwlpZiAoIGxlbmd0aCA+IG91dGwgKSBsZW5ndGggPSBvdXRsOworCW1lbW1vdmUgKCBvdXQsIGN0eC0+bXNnLmRhdGEsIGxlbmd0aCApOworCWN0eC0+cG9zICs9IGxlbmd0aDsKKwlyZXR1cm4gbGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQgcnRjcF93cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5sKQoreworICAgIGludCBzdGF0dXMsIGksIHNlZ21lbnQsIGxlbmd0aDsKKyAgICBzdHJ1Y3QgcnBjX2N0eCAqY3R4OworICAgIC8qCisgICAgICogT3V0cHV0IGRhdGEsIHNlbmQgaW4gY2h1bmtzIG5vIGxhcmdlciB0aGF0IHNpemVvZihjdHgtPm1zZy5kYXRhKS4KKyAgICAgKi8KKyAgICBjdHggPSAoc3RydWN0IHJwY19jdHggKikgYi0+cHRyOworICAgIGZvciAoIGkgPSAwOyBpIDwgaW5sOyBpICs9IHNlZ21lbnQgKSB7CisJc2VnbWVudCA9IGlubCAtIGk7CisJaWYgKCBzZWdtZW50ID4gc2l6ZW9mKGN0eC0+bXNnLmRhdGEpICkgc2VnbWVudCA9IHNpemVvZihjdHgtPm1zZy5kYXRhKTsKKwljdHgtPm1zZy5jaGFubmVsID0gJ1InOworCWN0eC0+bXNnLmZ1bmN0aW9uID0gJ1AnOworCWN0eC0+bXNnLmxlbmd0aCA9IHNlZ21lbnQ7CisJbWVtbW92ZSAoIGN0eC0+bXNnLmRhdGEsICZpbltpXSwgc2VnbWVudCApOworCXN0YXR1cyA9IHB1dCAoIGItPm51bSwgKGNoYXIgKikgJmN0eC0+bXNnLCBzZWdtZW50ICsgUlBDX0hEUl9TSVpFICk7CisJaWYgKChzdGF0dXMmMSkgPT0gMCApIHsgaSA9IC0xOyBicmVhazsgfQorCisJc3RhdHVzID0gZ2V0ICggYi0+bnVtLCAoY2hhciAqKSAmY3R4LT5tc2csIHNpemVvZihjdHgtPm1zZyksICZsZW5ndGggKTsKKwlpZiAoICgoc3RhdHVzJjEpID09IDApIHx8IChsZW5ndGggPCBSUENfSERSX1NJWkUpICkgeyBpID0gLTE7IGJyZWFrOyB9CisJaWYgKCAoY3R4LT5tc2cuY2hhbm5lbCAhPSAnUicpIHx8IChjdHgtPm1zZy5mdW5jdGlvbiAhPSAnQycpICkgeworCSAgIHByaW50ZigidW5leHBlY3RlZCByZXNwb25zZSB3aGVuIGNvbmZpcm1pbmcgcHV0ICVjICVjXG4iLAorCQljdHgtPm1zZy5jaGFubmVsLCBjdHgtPm1zZy5mdW5jdGlvbiApOworCisJfQorICAgIH0KKyAgICByZXR1cm4oaSk7Cit9CisKK3N0YXRpYyBsb25nIHJ0Y3BfY3RybChCSU8gKmIsIGludCBjbWQsIGxvbmcgbnVtLCB2b2lkICpwdHIpCisJeworCWxvbmcgcmV0PTE7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgQklPX0NUUkxfUkVTRVQ6CisJY2FzZSBCSU9fQ1RSTF9FT0Y6CisJCXJldCA9IDE7CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX0ZEOgorCQliLT5udW0gPSBudW07CisJCXJldCA9IDE7CisJIAlicmVhazsKKwljYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKwljYXNlIEJJT19DVFJMX0ZMVVNIOgorCWNhc2UgQklPX0NUUkxfRFVQOgorCQlyZXQ9MTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9HRVRfQ0xPU0U6CisJY2FzZSBCSU9fQ1RSTF9JTkZPOgorCWNhc2UgQklPX0NUUkxfR0VUOgorCWNhc2UgQklPX0NUUkxfUEVORElORzoKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCWRlZmF1bHQ6CisJCXJldD0wOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBydGNwX2dldHMoQklPICpicCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKKwl7CisJcmV0dXJuKDApOworCX0KKworc3RhdGljIGludCBydGNwX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKQoreworICAgIGludCBsZW5ndGg7CisgICAgaWYgKHN0ciA9PSBOVUxMKSByZXR1cm4oMCk7CisgICAgbGVuZ3RoID0gc3RybGVuICggc3RyICk7CisgICAgaWYgKCBsZW5ndGggPT0gMCApIHJldHVybiAoMCk7CisgICAgcmV0dXJuIHJ0Y3Bfd3JpdGUgKCBicCxzdHIsIGxlbmd0aCApOworfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19zb2NrLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYmlvL2Jzc19zb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmMzE5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9iaW8vYnNzX3NvY2suYwpAQCAtMCwwICsxLDI5NCBAQAorLyogY3J5cHRvL2Jpby9ic3Nfc29jay5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIFVTRV9TT0NLRVRTCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKworI2lmbmRlZiBPUEVOU1NMX05PX1NPQ0sKKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKKyNpZmRlZiBXQVRUMzIKKyNkZWZpbmUgc29ja193cml0ZSBTb2NrV3JpdGUgIC8qIFdhdHQtMzIgdXNlcyBzYW1lIG5hbWVzICovCisjZGVmaW5lIHNvY2tfcmVhZCAgU29ja1JlYWQKKyNkZWZpbmUgc29ja19wdXRzICBTb2NrUHV0cworI2VuZGlmCisKK3N0YXRpYyBpbnQgc29ja193cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IHNvY2tfcmVhZChCSU8gKmgsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworc3RhdGljIGludCBzb2NrX3B1dHMoQklPICpoLCBjb25zdCBjaGFyICpzdHIpOworc3RhdGljIGxvbmcgc29ja19jdHJsKEJJTyAqaCwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKTsKK3N0YXRpYyBpbnQgc29ja19uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgc29ja19mcmVlKEJJTyAqZGF0YSk7CitpbnQgQklPX3NvY2tfc2hvdWxkX3JldHJ5KGludCBzKTsKKworc3RhdGljIEJJT19NRVRIT0QgbWV0aG9kc19zb2NrcD0KKwl7CisJQklPX1RZUEVfU09DS0VULAorCSJzb2NrZXQiLAorCXNvY2tfd3JpdGUsCisJc29ja19yZWFkLAorCXNvY2tfcHV0cywKKwlOVUxMLCAvKiBzb2NrX2dldHMsICovCisJc29ja19jdHJsLAorCXNvY2tfbmV3LAorCXNvY2tfZnJlZSwKKwlOVUxMLAorCX07CisKK0JJT19NRVRIT0QgKkJJT19zX3NvY2tldCh2b2lkKQorCXsKKwlyZXR1cm4oJm1ldGhvZHNfc29ja3ApOworCX0KKworQklPICpCSU9fbmV3X3NvY2tldChpbnQgZmQsIGludCBjbG9zZV9mbGFnKQorCXsKKwlCSU8gKnJldDsKKworCXJldD1CSU9fbmV3KEJJT19zX3NvY2tldCgpKTsKKwlpZiAocmV0ID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlCSU9fc2V0X2ZkKHJldCxmZCxjbG9zZV9mbGFnKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgc29ja19uZXcoQklPICpiaSkKKwl7CisJYmktPmluaXQ9MDsKKwliaS0+bnVtPTA7CisJYmktPnB0cj1OVUxMOworCWJpLT5mbGFncz0wOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgc29ja19mcmVlKEJJTyAqYSkKKwl7CisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuKDApOworCWlmIChhLT5zaHV0ZG93bikKKwkJeworCQlpZiAoYS0+aW5pdCkKKwkJCXsKKwkJCVNIVVRET1dOMihhLT5udW0pOworCQkJfQorCQlhLT5pbml0PTA7CisJCWEtPmZsYWdzPTA7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCQorc3RhdGljIGludCBzb2NrX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgcmV0PTA7CisKKwlpZiAob3V0ICE9IE5VTEwpCisJCXsKKwkJY2xlYXJfc29ja2V0X2Vycm9yKCk7CisJCXJldD1yZWFkc29ja2V0KGItPm51bSxvdXQsb3V0bCk7CisJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJeworCQkJaWYgKEJJT19zb2NrX3Nob3VsZF9yZXRyeShyZXQpKQorCQkJCUJJT19zZXRfcmV0cnlfcmVhZChiKTsKKwkJCX0KKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBzb2NrX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpCisJeworCWludCByZXQ7CisJCisJY2xlYXJfc29ja2V0X2Vycm9yKCk7CisJcmV0PXdyaXRlc29ja2V0KGItPm51bSxpbixpbmwpOworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlpZiAocmV0IDw9IDApCisJCXsKKwkJaWYgKEJJT19zb2NrX3Nob3VsZF9yZXRyeShyZXQpKQorCQkJQklPX3NldF9yZXRyeV93cml0ZShiKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgc29ja19jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJbG9uZyByZXQ9MTsKKwlpbnQgKmlwOworCisJc3dpdGNoIChjbWQpCisJCXsKKwljYXNlIEJJT19DX1NFVF9GRDoKKwkJc29ja19mcmVlKGIpOworCQliLT5udW09ICooKGludCAqKXB0cik7CisJCWItPnNodXRkb3duPShpbnQpbnVtOworCQliLT5pbml0PTE7CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX0ZEOgorCQlpZiAoYi0+aW5pdCkKKwkJCXsKKwkJCWlwPShpbnQgKilwdHI7CisJCQlpZiAoaXAgIT0gTlVMTCkgKmlwPWItPm51bTsKKwkJCXJldD1iLT5udW07CisJCQl9CisJCWVsc2UKKwkJCXJldD0gLTE7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfR0VUX0NMT1NFOgorCQlyZXQ9Yi0+c2h1dGRvd247CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfU0VUX0NMT1NFOgorCQliLT5zaHV0ZG93bj0oaW50KW51bTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9EVVA6CisJY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKwkJcmV0PTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldD0wOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBzb2NrX3B1dHMoQklPICpicCwgY29uc3QgY2hhciAqc3RyKQorCXsKKwlpbnQgbixyZXQ7CisKKwluPXN0cmxlbihzdHIpOworCXJldD1zb2NrX3dyaXRlKGJwLHN0cixuKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBCSU9fc29ja19zaG91bGRfcmV0cnkoaW50IGkpCisJeworCWludCBlcnI7CisKKwlpZiAoKGkgPT0gMCkgfHwgKGkgPT0gLTEpKQorCQl7CisJCWVycj1nZXRfbGFzdF9zb2NrZXRfZXJyb3IoKTsKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgJiYgMCAvKiBtb3JlIG1pY3Jvc29mdCBzdHVwaWRpdHk/IHBlcmhhcHMgbm90PyBCZW4gNC8xLzk5ICovCisJCWlmICgoaSA9PSAtMSkgJiYgKGVyciA9PSAwKSkKKwkJCXJldHVybigxKTsKKyNlbmRpZgorCisJCXJldHVybihCSU9fc29ja19ub25fZmF0YWxfZXJyb3IoZXJyKSk7CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCitpbnQgQklPX3NvY2tfbm9uX2ZhdGFsX2Vycm9yKGludCBlcnIpCisJeworCXN3aXRjaCAoZXJyKQorCQl7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisjIGlmIGRlZmluZWQoV1NBRVdPVUxEQkxPQ0spCisJY2FzZSBXU0FFV09VTERCTE9DSzoKKyMgZW5kaWYKKworIyBpZiAwIC8qIFRoaXMgYXBwZWFycyB0byBhbHdheXMgYmUgYW4gZXJyb3IgKi8KKyMgIGlmIGRlZmluZWQoV1NBRU5PVENPTk4pCisJY2FzZSBXU0FFTk9UQ09OTjoKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEVXT1VMREJMT0NLCisjIGlmZGVmIFdTQUVXT1VMREJMT0NLCisjICBpZiBXU0FFV09VTERCTE9DSyAhPSBFV09VTERCTE9DSworCWNhc2UgRVdPVUxEQkxPQ0s6CisjICBlbmRpZgorIyBlbHNlCisJY2FzZSBFV09VTERCTE9DSzoKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChFTk9UQ09OTikKKwljYXNlIEVOT1RDT05OOgorI2VuZGlmCisKKyNpZmRlZiBFSU5UUgorCWNhc2UgRUlOVFI6CisjZW5kaWYKKworI2lmZGVmIEVBR0FJTgorIyBpZiBFV09VTERCTE9DSyAhPSBFQUdBSU4KKwljYXNlIEVBR0FJTjoKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgRVBST1RPCisJY2FzZSBFUFJPVE86CisjZW5kaWYKKworI2lmZGVmIEVJTlBST0dSRVNTCisJY2FzZSBFSU5QUk9HUkVTUzoKKyNlbmRpZgorCisjaWZkZWYgRUFMUkVBRFkKKwljYXNlIEVBTFJFQURZOgorI2VuZGlmCisJCXJldHVybigxKTsKKwkJLyogYnJlYWs7ICovCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCisjZW5kaWYgIC8qICNpZm5kZWYgT1BFTlNTTF9OT19TT0NLICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL1JFQURNRSBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZjNhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL1JFQURNRQpAQCAtMCwwICsxLDI3IEBACis8T0JTT0xFVEU+CisKK0FsbCBhc3NlbWJlciBpbiB0aGlzIGRpcmVjdG9yeSBhcmUganVzdCB2ZXJzaW9uIG9mIHRoZSBmaWxlCitjcnlwdG8vYm4vYm5fYXNtLmMuCisKK1F1aXRlIGEgZmV3IG9mIHRoZXNlIGZpbGVzIGFyZSBqdXN0IHRoZSBhc3NlbWJlciBvdXRwdXQgZnJvbSBnY2Mgc2luY2Ugb24gCitxdWl0ZSBhIGZldyBtYWNoaW5lcyB0aGV5IGFyZSAyIHRpbWVzIGZhc3RlciB0aGFuIHRoZSBzeXN0ZW0gY29tcGlsZXIuCisKK0ZvciB0aGUgeDg2LCBJIGhhdmUgaGFuZCB3cml0dGVuIGFzc2VtYmVyIGJlY2F1c2Ugb2YgdGhlIGJhZCBqb2IgYWxsCitjb21waWxlcnMgc2VlbSB0byBkbyBvbiBpdC4gIFRoaXMgbm9ybWFsbHkgZ2l2ZXMgYSAyIHRpbWUgc3BlZWQgdXAgaW4gdGhlIFJTQQorcm91dGluZXMuCisKK0ZvciB0aGUgREVDIGFscGhhLCBJIGFsc28gaGFuZCB3cm90ZSB0aGUgYXNzZW1iZXIgKGV4Y2VwdCB0aGUgZGl2aXNpb24gd2hpY2gKK2lzIGp1c3QgdGhlIG91dHB1dCBmcm9tIHRoZSBDIGNvbXBpbGVyIHBhc3RlZCBvbiB0aGUgZW5kIG9mIHRoZSBmaWxlKS4KK09uIHRoZSAyIGFscGhhIEMgY29tcGlsZXJzIEkgaGFkIGFjY2VzcyB0bywgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkbworNjRiIHggNjRiIC0+IDEyOGIgY2FsY3VsYXRpb25zIChib3RoIGxvbmcgYW5kIHRoZSBsb25nIGxvbmcgZGF0YSB0eXBlcword2VyZSA2NCBiaXRzKS4gIFNvIHRoZSBoYW5kIGFzc2VtYmVyIGdpdmVzIGFjY2VzcyB0byB0aGUgMTI4IGJpdCByZXN1bHQgYW5kCithIDIgdGltZXMgc3BlZWR1cCA6LSkuCisKK1RoZXJlIGFyZSAzIHZlcnNpb25zIG9mIGFzc2VtYmVyIGZvciB0aGUgSFAgUEEtUklTQy4KKworcGEtcmlzYy5zIGlzIHRoZSBvcmlnaW9uYWwgb25lIHdoaWNoIHdvcmtzIGZpbmUgYW5kIGdlbmVyYXRlZCB1c2luZyBnY2MgOi0pCisKK3BhLXJpc2MyVy5zIGFuZCBwYS1yaXNjMi5zIGFyZSA2NCBhbmQgMzItYml0IFBBLVJJU0MgMi4wIGltcGxlbWVudGF0aW9ucworYnkgQ2hyaXMgUnVlbW1sZXIgZnJvbSBIUCAod2l0aCBzb21lIGhlbHAgZnJvbSB0aGUgSFAgQyBjb21waWxlcikuCisKKzwvT0JTT0xFVEU+CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL2FscGhhLW1vbnQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL2FscGhhLW1vbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlMGNhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vYWxwaGEtbW9udC5wbApAQCAtMCwwICsxLDMxNyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgT24gMjEyNjQgUlNBIHNpZ24gcGVyZm9ybWFuY2UgaW1wcm92ZXMgYnkgNzAvMzUvMjAvMTUgcGVyY2VudCBmb3IKKyMgNTEyLzEwMjQvMjA0OC80MDk2IGJpdCBrZXkgbGVuZ3Rocy4gVGhpcyBpcyBhZ2FpbnN0IHZlbmRvciBjb21waWxlcgorIyBpbnN0cnVjdGVkIHRvICctdHVuZSBob3N0JyBjb2RlIHdpdGggaW4tbGluZSBhc3NlbWJsZXIuIE90aGVyCisjIGJlbmNobWFya3MgaW1wcm92ZSBieSAxNS0yMCUuIFRvIGFuY2hvciBpdCB0byBzb21ldGhpbmcgZWxzZSwgdGhlCisjIGNvZGUgcHJvdmlkZXMgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBwZXJmb3JtYW5jZSBwZXIgR0h6IGFzIEFNRDY0LgorIyBJLmUuIGlmIHlvdSBjb21wYXJlIDFHSHogMjEyNjQgYW5kIDJHSHogT3B0ZXJvbiwgeW91J2xsIG9ic2VydmUgfjJ4CisjIGRpZmZlcmVuY2UuCisKKyMgaW50IGJuX211bF9tb250KAorJHJwPSJhMCI7CSMgQk5fVUxPTkcgKnJwLAorJGFwPSJhMSI7CSMgY29uc3QgQk5fVUxPTkcgKmFwLAorJGJwPSJhMiI7CSMgY29uc3QgQk5fVUxPTkcgKmJwLAorJG5wPSJhMyI7CSMgY29uc3QgQk5fVUxPTkcgKm5wLAorJG4wPSJhNCI7CSMgY29uc3QgQk5fVUxPTkcgKm4wLAorJG51bT0iYTUiOwkjIGludCBudW0pOworCiskbG8wPSJ0MCI7CiskaGkwPSJ0MSI7CiskbG8xPSJ0MiI7CiskaGkxPSJ0MyI7CiskYWo9InQ0IjsKKyRiaT0idDUiOworJG5qPSJ0NiI7CiskdHA9InQ3IjsKKyRhbG89InQ4IjsKKyRhaGk9InQ5IjsKKyRubG89InQxMCI7CiskbmhpPSJ0MTEiOworJHRqPSJ0MTIiOworJGk9InMzIjsKKyRqPSJzNCI7CiskbTE9InM1IjsKKworJGNvZGU9PDxfX187CisjaW5jbHVkZSA8YXNtLmg+CisjaW5jbHVkZSA8cmVnZGVmLmg+CisKKy50ZXh0CisKKy5zZXQJbm9hdAorLnNldAlub3Jlb3JkZXIKKworLmdsb2JsCWJuX211bF9tb250CisuYWxpZ24JNQorLmVudAlibl9tdWxfbW9udAorYm5fbXVsX21vbnQ6CisJbGRhCXNwLC00OChzcCkKKwlzdHEJcmEsMChzcCkKKwlzdHEJczMsOChzcCkKKwlzdHEJczQsMTYoc3ApCisJc3RxCXM1LDI0KHNwKQorCXN0cQlmcCwzMihzcCkKKwltb3YJc3AsZnAKKwkubWFzawkweDA0MDBmMDAwLC00OAorCS5mcmFtZQlmcCw0OCxyYQorCS5wcm9sb2d1ZSAwCisKKwkuYWxpZ24JNAorCS5zZXQJcmVvcmRlcgorCXNleHRsCSRudW0sJG51bQorCW1vdgkwLHYwCisJY21wbHQJJG51bSw0LEFUCisJYm5lCUFULC5MZXhpdAorCisJbGRxCSRoaTAsMCgkYXApCSMgYXBbMF0KKwlzOGFkZHEJJG51bSwxNixBVAorCWxkcQkkYWosOCgkYXApCisJc3VicQlzcCxBVCxzcAorCWxkcQkkYmksMCgkYnApCSMgYnBbMF0KKwltb3YJLTQwOTYsQVQKKwlsZHEJJG4wLDAoJG4wKQorCWFuZAlzcCxBVCxzcAorCisJbXVscQkkaGkwLCRiaSwkbG8wCisJbGRxCSRoaTEsMCgkbnApCSMgbnBbMF0KKwl1bXVsaAkkaGkwLCRiaSwkaGkwCisJbGRxCSRuaiw4KCRucCkKKworCW11bHEJJGxvMCwkbjAsJG0xCisKKwltdWxxCSRoaTEsJG0xLCRsbzEKKwl1bXVsaAkkaGkxLCRtMSwkaGkxCisKKwlhZGRxCSRsbzEsJGxvMCwkbG8xCisJY21wdWx0CSRsbzEsJGxvMCxBVAorCWFkZHEJJGhpMSxBVCwkaGkxCisKKwltdWxxCSRhaiwkYmksJGFsbworCW1vdgkyLCRqCisJdW11bGgJJGFqLCRiaSwkYWhpCisJbW92CXNwLCR0cAorCisJbXVscQkkbmosJG0xLCRubG8KKwlzOGFkZHEJJGosJGFwLCRhagorCXVtdWxoCSRuaiwkbTEsJG5oaQorCXM4YWRkcQkkaiwkbnAsJG5qCisuYWxpZ24JNAorLkwxc3Q6CisJLnNldAlub3Jlb3JkZXIKKwlsZHEJJGFqLCgkYWopCisJYWRkbAkkaiwxLCRqCisJbGRxCSRuaiwoJG5qKQorCWxkYQkkdHAsOCgkdHApCisKKwlhZGRxCSRhbG8sJGhpMCwkbG8wCisJbXVscQkkYWosJGJpLCRhbG8KKwljbXB1bHQJJGxvMCwkaGkwLEFUCisJYWRkcQkkbmxvLCRoaTEsJGxvMQorCisJbXVscQkkbmosJG0xLCRubG8KKwlhZGRxCSRhaGksQVQsJGhpMAorCWNtcHVsdAkkbG8xLCRoaTEsdjAKKwljbXBsdAkkaiwkbnVtLCR0agorCisJdW11bGgJJGFqLCRiaSwkYWhpCisJYWRkcQkkbmhpLHYwLCRoaTEKKwlhZGRxCSRsbzEsJGxvMCwkbG8xCisJczhhZGRxCSRqLCRhcCwkYWoKKworCXVtdWxoCSRuaiwkbTEsJG5oaQorCWNtcHVsdAkkbG8xLCRsbzAsdjAKKwlhZGRxCSRoaTEsdjAsJGhpMQorCXM4YWRkcQkkaiwkbnAsJG5qCisKKwlzdHEJJGxvMSwtOCgkdHApCisJbm9wCisJdW5vcAorCWJuZQkkdGosLkwxc3QKKwkuc2V0CXJlb3JkZXIKKworCWFkZHEJJGFsbywkaGkwLCRsbzAKKwlhZGRxCSRubG8sJGhpMSwkbG8xCisJY21wdWx0CSRsbzAsJGhpMCxBVAorCWNtcHVsdAkkbG8xLCRoaTEsdjAKKwlhZGRxCSRhaGksQVQsJGhpMAorCWFkZHEJJG5oaSx2MCwkaGkxCisKKwlhZGRxCSRsbzEsJGxvMCwkbG8xCisJY21wdWx0CSRsbzEsJGxvMCx2MAorCWFkZHEJJGhpMSx2MCwkaGkxCisKKwlzdHEJJGxvMSwwKCR0cCkKKworCWFkZHEJJGhpMSwkaGkwLCRoaTEKKwljbXB1bHQJJGhpMSwkaGkwLEFUCisJc3RxCSRoaTEsOCgkdHApCisJc3RxCUFULDE2KCR0cCkKKworCW1vdgkxLCRpCisuYWxpZ24JNAorLkxvdXRlcjoKKwlzOGFkZHEJJGksJGJwLCRiaQorCWxkcQkkaGkwLCgkYXApCisJbGRxCSRhaiw4KCRhcCkKKwlsZHEJJGJpLCgkYmkpCisJbGRxCSRoaTEsKCRucCkKKwlsZHEJJG5qLDgoJG5wKQorCWxkcQkkdGosKHNwKQorCisJbXVscQkkaGkwLCRiaSwkbG8wCisJdW11bGgJJGhpMCwkYmksJGhpMAorCisJYWRkcQkkbG8wLCR0aiwkbG8wCisJY21wdWx0CSRsbzAsJHRqLEFUCisJYWRkcQkkaGkwLEFULCRoaTAKKworCW11bHEJJGxvMCwkbjAsJG0xCisKKwltdWxxCSRoaTEsJG0xLCRsbzEKKwl1bXVsaAkkaGkxLCRtMSwkaGkxCisKKwlhZGRxCSRsbzEsJGxvMCwkbG8xCisJY21wdWx0CSRsbzEsJGxvMCxBVAorCW1vdgkyLCRqCisJYWRkcQkkaGkxLEFULCRoaTEKKworCW11bHEJJGFqLCRiaSwkYWxvCisJbW92CXNwLCR0cAorCXVtdWxoCSRhaiwkYmksJGFoaQorCisJbXVscQkkbmosJG0xLCRubG8KKwlzOGFkZHEJJGosJGFwLCRhagorCXVtdWxoCSRuaiwkbTEsJG5oaQorLmFsaWduCTQKKy5MaW5uZXI6CisJLnNldAlub3Jlb3JkZXIKKwlsZHEJJHRqLDgoJHRwKQkjTDAKKwlub3AJCQkjVTEKKwlsZHEJJGFqLCgkYWopCSNMMQorCXM4YWRkcQkkaiwkbnAsJG5qCSNVMAorCisJbGRxCSRuaiwoJG5qKQkjTDAKKwlub3AJCQkjVTEKKwlhZGRxCSRhbG8sJGhpMCwkbG8wCSNMMQorCWxkYQkkdHAsOCgkdHApCisKKwltdWxxCSRhaiwkYmksJGFsbwkjVTEKKwljbXB1bHQJJGxvMCwkaGkwLEFUCSNMMAorCWFkZHEJJG5sbywkaGkxLCRsbzEJI0wxCisJYWRkbAkkaiwxLCRqCisKKwltdWxxCSRuaiwkbTEsJG5sbwkjVTEKKwlhZGRxCSRhaGksQVQsJGhpMAkjTDAKKwlhZGRxCSRsbzAsJHRqLCRsbzAJI0wxCisJY21wdWx0CSRsbzEsJGhpMSx2MAkjVTAKKworCXVtdWxoCSRhaiwkYmksJGFoaQkjVTEKKwljbXB1bHQJJGxvMCwkdGosQVQJI0wwCisJYWRkcQkkbG8xLCRsbzAsJGxvMQkjTDEKKwlhZGRxCSRuaGksdjAsJGhpMQkjVTAKKworCXVtdWxoCSRuaiwkbTEsJG5oaQkjVTEKKwlzOGFkZHEJJGosJGFwLCRhagkjTDAKKwljbXB1bHQJJGxvMSwkbG8wLHYwCSNMMQorCWNtcGx0CSRqLCRudW0sJHRqCSNVMAkjIGJvcnJvdyAkdGoKKworCWFkZHEJJGhpMCxBVCwkaGkwCSNMMAorCWFkZHEJJGhpMSx2MCwkaGkxCSNVMQorCXN0cQkkbG8xLC04KCR0cCkJI0wxCisJYm5lCSR0aiwuTGlubmVyCSNVMAorCS5zZXQJcmVvcmRlcgorCisJbGRxCSR0aiw4KCR0cCkKKwlhZGRxCSRhbG8sJGhpMCwkbG8wCisJYWRkcQkkbmxvLCRoaTEsJGxvMQorCWNtcHVsdAkkbG8wLCRoaTAsQVQKKwljbXB1bHQJJGxvMSwkaGkxLHYwCisJYWRkcQkkYWhpLEFULCRoaTAKKwlhZGRxCSRuaGksdjAsJGhpMQorCisJYWRkcQkkbG8wLCR0aiwkbG8wCisJY21wdWx0CSRsbzAsJHRqLEFUCisJYWRkcQkkaGkwLEFULCRoaTAKKworCWxkcQkkdGosMTYoJHRwKQorCWFkZHEJJGxvMSwkbG8wLCRqCisJY21wdWx0CSRqLCRsbzAsdjAKKwlhZGRxCSRoaTEsdjAsJGhpMQorCisJYWRkcQkkaGkxLCRoaTAsJGxvMQorCXN0cQkkaiwoJHRwKQorCWNtcHVsdAkkbG8xLCRoaTAsJGhpMQorCWFkZHEJJGxvMSwkdGosJGxvMQorCWNtcHVsdAkkbG8xLCR0aixBVAorCWFkZGwJJGksMSwkaQorCWFkZHEJJGhpMSxBVCwkaGkxCisJc3RxCSRsbzEsOCgkdHApCisJY21wbHQJJGksJG51bSwkdGoJIyBib3Jyb3cgJHRqCisJc3RxCSRoaTEsMTYoJHRwKQorCWJuZQkkdGosLkxvdXRlcgorDAorCXM4YWRkcQkkbnVtLHNwLCR0agkjICZ0cFtudW1dCisJbW92CSRycCwkYnAJCSMgcHV0IHJwIGFzaWRlCisJbW92CXNwLCR0cAorCW1vdglzcCwkYXAKKwltb3YJMCwkaGkwCQkjIGNsZWFyIGJvcnJvdyBiaXQKKworLmFsaWduCTQKKy5Mc3ViOglsZHEJJGxvMCwoJHRwKQorCWxkcQkkbG8xLCgkbnApCisJbGRhCSR0cCw4KCR0cCkKKwlsZGEJJG5wLDgoJG5wKQorCXN1YnEJJGxvMCwkbG8xLCRsbzEJIyB0cFtpXS1ucFtpXQorCWNtcHVsdAkkbG8wLCRsbzEsQVQKKwlzdWJxCSRsbzEsJGhpMCwkbG8wCisJY21wdWx0CSRsbzEsJGxvMCwkaGkwCisJb3IJJGhpMCxBVCwkaGkwCisJc3RxCSRsbzAsKCRycCkKKwljbXB1bHQJJHRwLCR0aix2MAorCWxkYQkkcnAsOCgkcnApCisJYm5lCXYwLC5Mc3ViCisKKwlzdWJxCSRoaTEsJGhpMCwkaGkwCSMgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwltb3YJc3AsJHRwCisJbW92CSRicCwkcnAJCSMgcmVzdG9yZSBycAorCisJYW5kCXNwLCRoaTAsJGFwCisJYmljCSRicCwkaGkwLCRicAorCWJpcwkkYnAsJGFwLCRhcAkjIGFwPWJvcnJvdz90cDpycAorCisuYWxpZ24JNAorLkxjb3B5OglsZHEJJGFqLCgkYXApCSMgY29weSBvciBpbi1wbGFjZSByZWZyZXNoCisJbGRhCSR0cCw4KCR0cCkKKwlsZGEJJHJwLDgoJHJwKQorCWxkYQkkYXAsOCgkYXApCisJc3RxCXplcm8sLTgoJHRwKQkjIHphcCB0cAorCWNtcHVsdAkkdHAsJHRqLEFUCisJc3RxCSRhaiwtOCgkcnApCisJYm5lCUFULC5MY29weQorCW1vdgkxLHYwCisKKy5MZXhpdDoKKwkuc2V0CW5vcmVvcmRlcgorCW1vdglmcCxzcAorCS8qbGRxCXJhLDAoc3ApKi8KKwlsZHEJczMsOChzcCkKKwlsZHEJczQsMTYoc3ApCisJbGRxCXM1LDI0KHNwKQorCWxkcQlmcCwzMihzcCkKKwlsZGEJc3AsNDgoc3ApCisJcmV0CShyYSkKKy5lbmQJYm5fbXVsX21vbnQKKy5yZGF0YQorLmFzY2lpegkiTW9udGdvbWVyeSBNdWx0aXBsaWNhdGlvbiBmb3IgQWxwaGEsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCitfX18KKworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL2FybXY0LW1vbnQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL2FybXY0LW1vbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlMGQyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vYXJtdjQtbW9udC5wbApAQCAtMCwwICsxLDIwMSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIEphbnVhcnkgMjAwNy4KKworIyBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIGZvciBBUk12NC4KKyMKKyMgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgbmF0dXJhbGx5IHZhcmllcyBhbW9uZyBDUFUgaW1wbGVtZW50YXRpb25zCisjIGFuZCBjb21waWxlcnMuIFRoZSBjb2RlIHdhcyBvYnNlcnZlZCB0byBwcm92aWRlICs2NS0zNSUgaW1wcm92ZW1lbnQKKyMgW2RlcGVuZGluZyBvbiBrZXkgbGVuZ3RoLCBsZXNzIGZvciBsb25nZXIga2V5c10gb24gQVJNOTIwVCwgYW5kCisjICsxMTUtODAlIG9uIEludGVsIElYUDQyNS4gVGhpcyBpcyBjb21wYXJlZCB0byBwcmUtYm5fbXVsX21vbnQgY29kZQorIyBiYXNlIGFuZCBjb21waWxlciBnZW5lcmF0ZWQgY29kZSB3aXRoIGluLWxpbmVkIHVtdWxsIGFuZCBldmVuIHVtbGFsCisjIGluc3RydWN0aW9ucy4gVGhlIGxhdHRlciBtZWFucyB0aGF0IHRoaXMgY29kZSBkaWRuJ3QgcmVhbGx5IGhhdmUgYW4gCisjICJhZHZhbnRhZ2UiIG9mIHV0aWxpemluZyBzb21lICJzZWNyZXQiIGluc3RydWN0aW9uLgorIworIyBUaGUgY29kZSBpcyBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBIGFuZCBpcyByYXRoZXIgY29tcGFjdCwgbGVzcworIyB0aGFuIDEvMktCLiBXaW5kb3dzIENFIHBvcnQgd291bGQgYmUgdHJpdmlhbCwgYXMgaXQncyBleGNsdXNpdmVseQorIyBhYm91dCBkZWNvcmF0aW9ucywgQUJJIGFuZCBpbnN0cnVjdGlvbiBzeW50YXggYXJlIGlkZW50aWNhbC4KKworJG51bT0icjAiOwkjIHN0YXJ0cyBhcyBudW0gYXJndW1lbnQsIGJ1dCBob2xkcyAmdHBbbnVtLTFdCiskYXA9InIxIjsKKyRicD0icjIiOyAkYmk9InIyIjsgJHJwPSJyMiI7CiskbnA9InIzIjsKKyR0cD0icjQiOworJGFqPSJyNSI7Ciskbmo9InI2IjsKKyR0aj0icjciOworJG4wPSJyOCI7CisjIyMjIyMjIyMjIwkjIHI5IGlzIHJlc2VydmVkIGJ5IEVMRiBhcyBwbGF0Zm9ybSBzcGVjaWZpYywgZS5nLiBUTFMgcG9pbnRlcgorJGFsbz0icjEwIjsJIyBzbCwgZ2NjIHVzZXMgaXQgdG8ga2VlcCBAR09UCiskYWhpPSJyMTEiOwkjIGZwCiskbmxvPSJyMTIiOwkjIGlwCisjIyMjIyMjIyMjIwkjIHIxMyBpcyBzdGFjayBwb2ludGVyCiskbmhpPSJyMTQiOwkjIGxyCisjIyMjIyMjIyMjIwkjIHIxNSBpcyBwcm9ncmFtIGNvdW50ZXIKKworIyMjIyBhcmd1bWVudCBibG9jayBsYXlvdXQgcmVsYXRpdmUgdG8gJnRwW251bS0xXSwgYS5rLmEuICRudW0KKyRfcnA9IiRudW0sIzEyKjQiOworIyBhcCBwZXJtYW5lbnRseSByZXNpZGVzIGluIHIxCiskX2JwPSIkbnVtLCMxMyo0IjsKKyMgbnAgcGVybWFuZW50bHkgcmVzaWRlcyBpbiByMworJF9uMD0iJG51bSwjMTQqNCI7CiskX251bT0iJG51bSwjMTUqNCI7CSRfYnBlbmQ9JF9udW07CisKKyRjb2RlPTw8X19fOworLnRleHQKKworLmdsb2JhbAlibl9tdWxfbW9udAorLnR5cGUJYm5fbXVsX21vbnQsJWZ1bmN0aW9uCisKKy5hbGlnbgkyCitibl9tdWxfbW9udDoKKwlzdG1kYglzcCEse3IwLHIyfQkJQCBzcCBwb2ludHMgYXQgYXJndW1lbnQgYmxvY2sKKwlsZHIJJG51bSxbc3AsIzMqNF0JCUAgbG9hZCBudW0KKwljbXAJJG51bSwjMgorCW1vdmx0CXIwLCMwCisJYWRkbHQJc3Asc3AsIzIqNAorCWJsdAkuTGFicnQKKworCXN0bWRiCXNwISx7cjQtcjEyLGxyfQkJQCBzYXZlIDEwIHJlZ2lzdGVycworCisJbW92CSRudW0sJG51bSxsc2wjMgkJQCByZXNjYWxlICRudW0gZm9yIGJ5dGUgY291bnQKKwlzdWIJc3Asc3AsJG51bQkJQCBhbGxvY2EoNCpudW0pCisJc3ViCXNwLHNwLCM0CQlAICtleHRyYSBkd29yZAorCXN1YgkkbnVtLCRudW0sIzQJCUAgIm51bT1udW0tMSIKKwlhZGQJJHRwLCRicCwkbnVtCQlAICZicFtudW0tMV0KKworCWFkZAkkbnVtLHNwLCRudW0JCUAgJG51bSB0byBwb2ludCBhdCAmdHBbbnVtLTFdCisJbGRyCSRuMCxbJF9uMF0JCUAgJm4wCisJbGRyCSRiaSxbJGJwXQkJQCBicFswXQorCWxkcgkkYWosWyRhcF0sIzQJCUAgYXBbMF0sYXArKworCWxkcgkkbmosWyRucF0sIzQJCUAgbnBbMF0sbnArKworCWxkcgkkbjAsWyRuMF0JCUAgKm4wCisJc3RyCSR0cCxbJF9icGVuZF0JCUAgc2F2ZSAmYnBbbnVtXQorCisJdW11bGwJJGFsbywkYWhpLCRhaiwkYmkJQCBhcFswXSpicFswXQorCXN0cgkkbjAsWyRfbjBdCQlAIHNhdmUgbjAgdmFsdWUKKwltdWwJJG4wLCRhbG8sJG4wCQlAICJ0cFswXSIqbjAKKwltb3YJJG5sbywjMAorCXVtbGFsCSRhbG8sJG5sbywkbmosJG4wCUAgbnBbMF0qbjArInRbMF0iCisJbW92CSR0cCxzcAorCisuTDFzdDoKKwlsZHIJJGFqLFskYXBdLCM0CQlAIGFwW2pdLGFwKysKKwltb3YJJGFsbywkYWhpCisJbW92CSRhaGksIzAKKwl1bWxhbAkkYWxvLCRhaGksJGFqLCRiaQlAIGFwW2pdKmJwWzBdCisJbGRyCSRuaixbJG5wXSwjNAkJQCBucFtqXSxucCsrCisJbW92CSRuaGksIzAKKwl1bWxhbAkkbmxvLCRuaGksJG5qLCRuMAlAIG5wW2pdKm4wCisJYWRkcwkkbmxvLCRubG8sJGFsbworCXN0cgkkbmxvLFskdHBdLCM0CQlAIHRwW2otMV09LHRwKysKKwlhZGMJJG5sbywkbmhpLCMwCisJY21wCSR0cCwkbnVtCisJYm5lCS5MMXN0CisKKwlhZGRzCSRubG8sJG5sbywkYWhpCisJbW92CSRuaGksIzAKKwlhZGMJJG5oaSwkbmhpLCMwCisJbGRyCSR0cCxbJF9icF0JCUAgcmVzdG9yZSBicAorCXN0cgkkbmxvLFskbnVtXQkJQCB0cFtudW0tMV09CisJbGRyCSRuMCxbJF9uMF0JCUAgcmVzdG9yZSBuMAorCXN0cgkkbmhpLFskbnVtLCM0XQkJQCB0cFtudW1dPQorDAorLkxvdXRlcjoKKwlzdWIJJHRqLCRudW0sc3AJCUAgIm9yaWdpbmFsIiAkbnVtLTEgdmFsdWUKKwlzdWIJJGFwLCRhcCwkdGoJCUAgInJld2luZCIgYXAgdG8gJmFwWzFdCisJc3ViCSRucCwkbnAsJHRqCQlAICJyZXdpbmQiIG5wIHRvICZucFsxXQorCWxkcgkkYmksWyR0cCwjNF0hCQlAICooKyticCkKKwlsZHIJJGFqLFskYXAsIy00XQkJQCBhcFswXQorCWxkcgkkbmosWyRucCwjLTRdCQlAIG5wWzBdCisJbGRyCSRhbG8sW3NwXQkJQCB0cFswXQorCWxkcgkkdGosW3NwLCM0XQkJQCB0cFsxXQorCisJbW92CSRhaGksIzAKKwl1bWxhbAkkYWxvLCRhaGksJGFqLCRiaQlAIGFwWzBdKmJwW2ldK3RwWzBdCisJc3RyCSR0cCxbJF9icF0JCUAgc2F2ZSBicAorCW11bAkkbjAsJGFsbywkbjAKKwltb3YJJG5sbywjMAorCXVtbGFsCSRhbG8sJG5sbywkbmosJG4wCUAgbnBbMF0qbjArInRwWzBdIgorCW1vdgkkdHAsc3AKKworLkxpbm5lcjoKKwlsZHIJJGFqLFskYXBdLCM0CQlAIGFwW2pdLGFwKysKKwlhZGRzCSRhbG8sJGFoaSwkdGoJCUAgKz10cFtqXQorCW1vdgkkYWhpLCMwCisJdW1sYWwJJGFsbywkYWhpLCRhaiwkYmkJQCBhcFtqXSpicFtpXQorCWxkcgkkbmosWyRucF0sIzQJCUAgbnBbal0sbnArKworCW1vdgkkbmhpLCMwCisJdW1sYWwJJG5sbywkbmhpLCRuaiwkbjAJQCBucFtqXSpuMAorCWxkcgkkdGosWyR0cCwjOF0JCUAgdHBbaisxXQorCWFkYwkkYWhpLCRhaGksIzAKKwlhZGRzCSRubG8sJG5sbywkYWxvCisJc3RyCSRubG8sWyR0cF0sIzQJCUAgdHBbai0xXT0sdHArKworCWFkYwkkbmxvLCRuaGksIzAKKwljbXAJJHRwLCRudW0KKwlibmUJLkxpbm5lcgorCisJYWRkcwkkbmxvLCRubG8sJGFoaQorCW1vdgkkbmhpLCMwCisJYWRjCSRuaGksJG5oaSwjMAorCWFkZHMJJG5sbywkbmxvLCR0agorCWFkYwkkbmhpLCRuaGksIzAKKwlsZHIJJHRwLFskX2JwXQkJQCByZXN0b3JlIGJwCisJbGRyCSR0aixbJF9icGVuZF0JCUAgcmVzdG9yZSAmYnBbbnVtXQorCXN0cgkkbmxvLFskbnVtXQkJQCB0cFtudW0tMV09CisJbGRyCSRuMCxbJF9uMF0JCUAgcmVzdG9yZSBuMAorCXN0cgkkbmhpLFskbnVtLCM0XQkJQCB0cFtudW1dPQorCisJY21wCSR0cCwkdGoKKwlibmUJLkxvdXRlcgorDAorCWxkcgkkcnAsWyRfcnBdCQlAIHB1bGwgcnAKKwlhZGQJJG51bSwkbnVtLCM0CQlAICRudW0gdG8gcG9pbnQgYXQgJnRwW251bV0KKwlzdWIJJGFqLCRudW0sc3AJCUAgIm9yaWdpbmFsIiBudW0gdmFsdWUKKwltb3YJJHRwLHNwCQkJQCAicmV3aW5kIiAkdHAKKwltb3YJJGFwLCR0cAkJCUAgImJvcnJvdyIgJGFwCisJc3ViCSRucCwkbnAsJGFqCQlAICJyZXdpbmQiICRucCB0byAmbnBbMF0KKworCXN1YnMJJHRqLCR0aiwkdGoJCUAgImNsZWFyIiBjYXJyeSBmbGFnCisuTHN1YjoJbGRyCSR0aixbJHRwXSwjNAorCWxkcgkkbmosWyRucF0sIzQKKwlzYmNzCSR0aiwkdGosJG5qCQlAIHRwW2pdLW5wW2pdCisJc3RyCSR0aixbJHJwXSwjNAkJQCBycFtqXT0KKwl0ZXEJJHRwLCRudW0JCUAgcHJlc2VydmUgY2FycnkKKwlibmUJLkxzdWIKKwlzYmNzCSRuaGksJG5oaSwjMAkJQCB1cG1vc3QgY2FycnkKKwltb3YJJHRwLHNwCQkJQCAicmV3aW5kIiAkdHAKKwlzdWIJJHJwLCRycCwkYWoJCUAgInJld2luZCIgJHJwCisKKwlhbmQJJGFwLCR0cCwkbmhpCisJYmljCSRucCwkcnAsJG5oaQorCW9ycgkkYXAsJGFwLCRucAkJQCBhcD1ib3Jyb3c/dHA6cnAKKworLkxjb3B5OglsZHIJJHRqLFskYXBdLCM0CQlAIGNvcHkgb3IgaW4tcGxhY2UgcmVmcmVzaAorCXN0cglzcCxbJHRwXSwjNAkJQCB6YXAgdHAKKwlzdHIJJHRqLFskcnBdLCM0CisJY21wCSR0cCwkbnVtCisJYm5lCS5MY29weQorCisJYWRkCXNwLCRudW0sIzQJCUAgc2tpcCBvdmVyIHRwW251bSsxXQorCWxkbWlhCXNwISx7cjQtcjEyLGxyfQkJQCByZXN0b3JlIHJlZ2lzdGVycworCWFkZAlzcCxzcCwjMio0CQlAIHNraXAgb3ZlciB7cjAscjJ9CisJbW92CXIwLCMxCisuTGFicnQ6CXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwlieAlscgkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorLnNpemUJYm5fbXVsX21vbnQsLi1ibl9tdWxfbW9udAorLmFzY2l6CSJNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIGZvciBBUk12NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkyCitfX18KKworJGNvZGUgPX4gcy9cYmJ4XHMrbHJcYi8ud29yZFx0MHhlMTJmZmYxZS9nbTsJIyBtYWtlIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgd2l0aCAtbWFyY2g9YXJtdjQKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9hcm12NC1tb250LnMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL2FybXY0LW1vbnQucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDg4NDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9hcm12NC1tb250LnMKQEAgLTAsMCArMSwxNDUgQEAKKy50ZXh0CisKKy5nbG9iYWwJYm5fbXVsX21vbnQKKy50eXBlCWJuX211bF9tb250LCVmdW5jdGlvbgorCisuYWxpZ24JMgorYm5fbXVsX21vbnQ6CisJc3RtZGIJc3AhLHtyMCxyMn0JCUAgc3AgcG9pbnRzIGF0IGFyZ3VtZW50IGJsb2NrCisJbGRyCXIwLFtzcCwjMyo0XQkJQCBsb2FkIG51bQorCWNtcAlyMCwjMgorCW1vdmx0CXIwLCMwCisJYWRkbHQJc3Asc3AsIzIqNAorCWJsdAkuTGFicnQKKworCXN0bWRiCXNwISx7cjQtcjEyLGxyfQkJQCBzYXZlIDEwIHJlZ2lzdGVycworCisJbW92CXIwLHIwLGxzbCMyCQlAIHJlc2NhbGUgcjAgZm9yIGJ5dGUgY291bnQKKwlzdWIJc3Asc3AscjAJCUAgYWxsb2NhKDQqbnVtKQorCXN1YglzcCxzcCwjNAkJQCArZXh0cmEgZHdvcmQKKwlzdWIJcjAscjAsIzQJCUAgIm51bT1udW0tMSIKKwlhZGQJcjQscjIscjAJCUAgJmJwW251bS0xXQorCisJYWRkCXIwLHNwLHIwCQlAIHIwIHRvIHBvaW50IGF0ICZ0cFtudW0tMV0KKwlsZHIJcjgsW3IwLCMxNCo0XQkJQCAmbjAKKwlsZHIJcjIsW3IyXQkJQCBicFswXQorCWxkcglyNSxbcjFdLCM0CQlAIGFwWzBdLGFwKysKKwlsZHIJcjYsW3IzXSwjNAkJQCBucFswXSxucCsrCisJbGRyCXI4LFtyOF0JCUAgKm4wCisJc3RyCXI0LFtyMCwjMTUqNF0JCUAgc2F2ZSAmYnBbbnVtXQorCisJdW11bGwJcjEwLHIxMSxyNSxyMglAIGFwWzBdKmJwWzBdCisJc3RyCXI4LFtyMCwjMTQqNF0JCUAgc2F2ZSBuMCB2YWx1ZQorCW11bAlyOCxyMTAscjgJCUAgInRwWzBdIipuMAorCW1vdglyMTIsIzAKKwl1bWxhbAlyMTAscjEyLHI2LHI4CUAgbnBbMF0qbjArInRbMF0iCisJbW92CXI0LHNwCisKKy5MMXN0OgorCWxkcglyNSxbcjFdLCM0CQlAIGFwW2pdLGFwKysKKwltb3YJcjEwLHIxMQorCW1vdglyMTEsIzAKKwl1bWxhbAlyMTAscjExLHI1LHIyCUAgYXBbal0qYnBbMF0KKwlsZHIJcjYsW3IzXSwjNAkJQCBucFtqXSxucCsrCisJbW92CXIxNCwjMAorCXVtbGFsCXIxMixyMTQscjYscjgJQCBucFtqXSpuMAorCWFkZHMJcjEyLHIxMixyMTAKKwlzdHIJcjEyLFtyNF0sIzQJCUAgdHBbai0xXT0sdHArKworCWFkYwlyMTIscjE0LCMwCisJY21wCXI0LHIwCisJYm5lCS5MMXN0CisKKwlhZGRzCXIxMixyMTIscjExCisJbW92CXIxNCwjMAorCWFkYwlyMTQscjE0LCMwCisJbGRyCXI0LFtyMCwjMTMqNF0JCUAgcmVzdG9yZSBicAorCXN0cglyMTIsW3IwXQkJQCB0cFtudW0tMV09CisJbGRyCXI4LFtyMCwjMTQqNF0JCUAgcmVzdG9yZSBuMAorCXN0cglyMTQsW3IwLCM0XQkJQCB0cFtudW1dPQorDAorLkxvdXRlcjoKKwlzdWIJcjcscjAsc3AJCUAgIm9yaWdpbmFsIiByMC0xIHZhbHVlCisJc3ViCXIxLHIxLHI3CQlAICJyZXdpbmQiIGFwIHRvICZhcFsxXQorCXN1YglyMyxyMyxyNwkJQCAicmV3aW5kIiBucCB0byAmbnBbMV0KKwlsZHIJcjIsW3I0LCM0XSEJCUAgKigrK2JwKQorCWxkcglyNSxbcjEsIy00XQkJQCBhcFswXQorCWxkcglyNixbcjMsIy00XQkJQCBucFswXQorCWxkcglyMTAsW3NwXQkJQCB0cFswXQorCWxkcglyNyxbc3AsIzRdCQlAIHRwWzFdCisKKwltb3YJcjExLCMwCisJdW1sYWwJcjEwLHIxMSxyNSxyMglAIGFwWzBdKmJwW2ldK3RwWzBdCisJc3RyCXI0LFtyMCwjMTMqNF0JCUAgc2F2ZSBicAorCW11bAlyOCxyMTAscjgKKwltb3YJcjEyLCMwCisJdW1sYWwJcjEwLHIxMixyNixyOAlAIG5wWzBdKm4wKyJ0cFswXSIKKwltb3YJcjQsc3AKKworLkxpbm5lcjoKKwlsZHIJcjUsW3IxXSwjNAkJQCBhcFtqXSxhcCsrCisJYWRkcwlyMTAscjExLHI3CQlAICs9dHBbal0KKwltb3YJcjExLCMwCisJdW1sYWwJcjEwLHIxMSxyNSxyMglAIGFwW2pdKmJwW2ldCisJbGRyCXI2LFtyM10sIzQJCUAgbnBbal0sbnArKworCW1vdglyMTQsIzAKKwl1bWxhbAlyMTIscjE0LHI2LHI4CUAgbnBbal0qbjAKKwlsZHIJcjcsW3I0LCM4XQkJQCB0cFtqKzFdCisJYWRjCXIxMSxyMTEsIzAKKwlhZGRzCXIxMixyMTIscjEwCisJc3RyCXIxMixbcjRdLCM0CQlAIHRwW2otMV09LHRwKysKKwlhZGMJcjEyLHIxNCwjMAorCWNtcAlyNCxyMAorCWJuZQkuTGlubmVyCisKKwlhZGRzCXIxMixyMTIscjExCisJbW92CXIxNCwjMAorCWFkYwlyMTQscjE0LCMwCisJYWRkcwlyMTIscjEyLHI3CisJYWRjCXIxNCxyMTQsIzAKKwlsZHIJcjQsW3IwLCMxMyo0XQkJQCByZXN0b3JlIGJwCisJbGRyCXI3LFtyMCwjMTUqNF0JCUAgcmVzdG9yZSAmYnBbbnVtXQorCXN0cglyMTIsW3IwXQkJQCB0cFtudW0tMV09CisJbGRyCXI4LFtyMCwjMTQqNF0JCUAgcmVzdG9yZSBuMAorCXN0cglyMTQsW3IwLCM0XQkJQCB0cFtudW1dPQorCisJY21wCXI0LHI3CisJYm5lCS5Mb3V0ZXIKKwwKKwlsZHIJcjIsW3IwLCMxMio0XQkJQCBwdWxsIHJwCisJYWRkCXIwLHIwLCM0CQlAIHIwIHRvIHBvaW50IGF0ICZ0cFtudW1dCisJc3ViCXI1LHIwLHNwCQlAICJvcmlnaW5hbCIgbnVtIHZhbHVlCisJbW92CXI0LHNwCQkJQCAicmV3aW5kIiByNAorCW1vdglyMSxyNAkJCUAgImJvcnJvdyIgcjEKKwlzdWIJcjMscjMscjUJCUAgInJld2luZCIgcjMgdG8gJm5wWzBdCisKKwlzdWJzCXI3LHI3LHI3CQlAICJjbGVhciIgY2FycnkgZmxhZworLkxzdWI6CWxkcglyNyxbcjRdLCM0CisJbGRyCXI2LFtyM10sIzQKKwlzYmNzCXI3LHI3LHI2CQlAIHRwW2pdLW5wW2pdCisJc3RyCXI3LFtyMl0sIzQJCUAgcnBbal09CisJdGVxCXI0LHIwCQlAIHByZXNlcnZlIGNhcnJ5CisJYm5lCS5Mc3ViCisJc2JjcwlyMTQscjE0LCMwCQlAIHVwbW9zdCBjYXJyeQorCW1vdglyNCxzcAkJCUAgInJld2luZCIgcjQKKwlzdWIJcjIscjIscjUJCUAgInJld2luZCIgcjIKKworCWFuZAlyMSxyNCxyMTQKKwliaWMJcjMscjIscjE0CisJb3JyCXIxLHIxLHIzCQlAIGFwPWJvcnJvdz90cDpycAorCisuTGNvcHk6CWxkcglyNyxbcjFdLCM0CQlAIGNvcHkgb3IgaW4tcGxhY2UgcmVmcmVzaAorCXN0cglzcCxbcjRdLCM0CQlAIHphcCB0cAorCXN0cglyNyxbcjJdLCM0CisJY21wCXI0LHIwCisJYm5lCS5MY29weQorCisJYWRkCXNwLHIwLCM0CQlAIHNraXAgb3ZlciB0cFtudW0rMV0KKwlsZG1pYQlzcCEse3I0LXIxMixscn0JCUAgcmVzdG9yZSByZWdpc3RlcnMKKwlhZGQJc3Asc3AsIzIqNAkJQCBza2lwIG92ZXIge3IwLHIyfQorCW1vdglyMCwjMQorLkxhYnJ0Ogl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0CisJLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorLnNpemUJYm5fbXVsX21vbnQsLi1ibl9tdWxfbW9udAorLmFzY2l6CSJNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIGZvciBBUk12NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9Ab3BlbnNzbC5vcmc+IgorLmFsaWduCTIKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vYm4tNTg2LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9ibi01ODYucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyZWYzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vYm4tNTg2LnBsCkBAIC0wLDAgKzEsNzc0IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKK3B1c2goQElOQywiJHtkaXJ9IiwiJHtkaXJ9Li4vLi4vcGVybGFzbSIpOworcmVxdWlyZSAieDg2YXNtLnBsIjsKKworJmFzbV9pbml0KCRBUkdWWzBdLCQwKTsKKworJHNzZTI9MDsKK2ZvciAoQEFSR1YpIHsgJHNzZTI9MSBpZiAoLy1ET1BFTlNTTF9JQTMyX1NTRTIvKTsgfQorCismZXh0ZXJuYWxfbGFiZWwoIk9QRU5TU0xfaWEzMmNhcF9QIikgaWYgKCRzc2UyKTsKKworJmJuX211bF9hZGRfd29yZHMoImJuX211bF9hZGRfd29yZHMiKTsKKyZibl9tdWxfd29yZHMoImJuX211bF93b3JkcyIpOworJmJuX3Nxcl93b3JkcygiYm5fc3FyX3dvcmRzIik7CismYm5fZGl2X3dvcmRzKCJibl9kaXZfd29yZHMiKTsKKyZibl9hZGRfd29yZHMoImJuX2FkZF93b3JkcyIpOworJmJuX3N1Yl93b3JkcygiYm5fc3ViX3dvcmRzIik7CismYm5fc3ViX3BhcnRfd29yZHMoImJuX3N1Yl9wYXJ0X3dvcmRzIik7CisKKyZhc21fZmluaXNoKCk7CisKK3N1YiBibl9tdWxfYWRkX3dvcmRzCisJeworCWxvY2FsKCRuYW1lKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCRzc2UyPyJFWFRSTlx0X09QRU5TU0xfaWEzMmNhcF9QOkRXT1JEIjoiIik7CisKKwkkcj0iZWF4IjsKKwkkYT0iZWR4IjsKKwkkYz0iZWN4IjsKKworCWlmICgkc3NlMikgeworCQkmcGljbWV1cCgiZWF4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkJJmJ0KCZEV1AoMCwiZWF4IiksMjYpOworCQkmam5jKCZsYWJlbCgibWF3X25vbl9zc2UyIikpOworCisJCSZtb3YoJHIsJndwYXJhbSgwKSk7CisJCSZtb3YoJGEsJndwYXJhbSgxKSk7CisJCSZtb3YoJGMsJndwYXJhbSgyKSk7CisJCSZtb3ZkKCJtbTAiLCZ3cGFyYW0oMykpOwkjIG1tMCA9IHcKKwkJJnB4b3IoIm1tMSIsIm1tMSIpOwkJIyBtbTEgPSBjYXJyeV9pbgorCQkmam1wKCZsYWJlbCgibWF3X3NzZTJfZW50cnkiKSk7CisJCQorCSZzZXRfbGFiZWwoIm1hd19zc2UyX3Vucm9sbGVkIiwxNik7CisJCSZtb3ZkKCJtbTMiLCZEV1AoMCwkciwiIiwwKSk7CSMgbW0zID0gclswXQorCQkmcGFkZHEoIm1tMSIsIm1tMyIpOwkJIyBtbTEgPSBjYXJyeV9pbiArIHJbMF0KKwkJJm1vdmQoIm1tMiIsJkRXUCgwLCRhLCIiLDApKTsJIyBtbTIgPSBhWzBdCisJCSZwbXVsdWRxKCJtbTIiLCJtbTAiKTsJCSMgbW0yID0gdyphWzBdCisJCSZtb3ZkKCJtbTQiLCZEV1AoNCwkYSwiIiwwKSk7CSMgbW00ID0gYVsxXQorCQkmcG11bHVkcSgibW00IiwibW0wIik7CQkjIG1tNCA9IHcqYVsxXQorCQkmbW92ZCgibW02IiwmRFdQKDgsJGEsIiIsMCkpOwkjIG1tNiA9IGFbMl0KKwkJJnBtdWx1ZHEoIm1tNiIsIm1tMCIpOwkJIyBtbTYgPSB3KmFbMl0KKwkJJm1vdmQoIm1tNyIsJkRXUCgxMiwkYSwiIiwwKSk7CSMgbW03ID0gYVszXQorCQkmcG11bHVkcSgibW03IiwibW0wIik7CQkjIG1tNyA9IHcqYVszXQorCQkmcGFkZHEoIm1tMSIsIm1tMiIpOwkJIyBtbTEgPSBjYXJyeV9pbiArIHJbMF0gKyB3KmFbMF0KKwkJJm1vdmQoIm1tMyIsJkRXUCg0LCRyLCIiLDApKTsJIyBtbTMgPSByWzFdCisJCSZwYWRkcSgibW0zIiwibW00Iik7CQkjIG1tMyA9IHJbMV0gKyB3KmFbMV0KKwkJJm1vdmQoIm1tNSIsJkRXUCg4LCRyLCIiLDApKTsJIyBtbTUgPSByWzJdCisJCSZwYWRkcSgibW01IiwibW02Iik7CQkjIG1tNSA9IHJbMl0gKyB3KmFbMl0KKwkJJm1vdmQoIm1tNCIsJkRXUCgxMiwkciwiIiwwKSk7CSMgbW00ID0gclszXQorCQkmcGFkZHEoIm1tNyIsIm1tNCIpOwkJIyBtbTcgPSByWzNdICsgdyphWzNdCisJCSZtb3ZkKCZEV1AoMCwkciwiIiwwKSwibW0xIik7CisJCSZtb3ZkKCJtbTIiLCZEV1AoMTYsJGEsIiIsMCkpOwkjIG1tMiA9IGFbNF0KKwkJJnBtdWx1ZHEoIm1tMiIsIm1tMCIpOwkJIyBtbTIgPSB3KmFbNF0KKwkJJnBzcmxxKCJtbTEiLDMyKTsJCSMgbW0xID0gY2FycnkwCisJCSZtb3ZkKCJtbTQiLCZEV1AoMjAsJGEsIiIsMCkpOwkjIG1tNCA9IGFbNV0KKwkJJnBtdWx1ZHEoIm1tNCIsIm1tMCIpOwkJIyBtbTQgPSB3KmFbNV0KKwkJJnBhZGRxKCJtbTEiLCJtbTMiKTsJCSMgbW0xID0gY2FycnkwICsgclsxXSArIHcqYVsxXQorCQkmbW92ZCgibW02IiwmRFdQKDI0LCRhLCIiLDApKTsJIyBtbTYgPSBhWzZdCisJCSZwbXVsdWRxKCJtbTYiLCJtbTAiKTsJCSMgbW02ID0gdyphWzZdCisJCSZtb3ZkKCZEV1AoNCwkciwiIiwwKSwibW0xIik7CisJCSZwc3JscSgibW0xIiwzMik7CQkjIG1tMSA9IGNhcnJ5MQorCQkmbW92ZCgibW0zIiwmRFdQKDI4LCRhLCIiLDApKTsJIyBtbTMgPSBhWzddCisJCSZhZGQoJGEsMzIpOworCQkmcG11bHVkcSgibW0zIiwibW0wIik7CQkjIG1tMyA9IHcqYVs3XQorCQkmcGFkZHEoIm1tMSIsIm1tNSIpOwkJIyBtbTEgPSBjYXJyeTEgKyByWzJdICsgdyphWzJdCisJCSZtb3ZkKCJtbTUiLCZEV1AoMTYsJHIsIiIsMCkpOwkjIG1tNSA9IHJbNF0KKwkJJnBhZGRxKCJtbTIiLCJtbTUiKTsJCSMgbW0yID0gcls0XSArIHcqYVs0XQorCQkmbW92ZCgmRFdQKDgsJHIsIiIsMCksIm1tMSIpOworCQkmcHNybHEoIm1tMSIsMzIpOwkJIyBtbTEgPSBjYXJyeTIKKwkJJnBhZGRxKCJtbTEiLCJtbTciKTsJCSMgbW0xID0gY2FycnkyICsgclszXSArIHcqYVszXQorCQkmbW92ZCgibW01IiwmRFdQKDIwLCRyLCIiLDApKTsJIyBtbTUgPSByWzVdCisJCSZwYWRkcSgibW00IiwibW01Iik7CQkjIG1tNCA9IHJbNV0gKyB3KmFbNV0KKwkJJm1vdmQoJkRXUCgxMiwkciwiIiwwKSwibW0xIik7CisJCSZwc3JscSgibW0xIiwzMik7CQkjIG1tMSA9IGNhcnJ5MworCQkmcGFkZHEoIm1tMSIsIm1tMiIpOwkJIyBtbTEgPSBjYXJyeTMgKyByWzRdICsgdyphWzRdCisJCSZtb3ZkKCJtbTUiLCZEV1AoMjQsJHIsIiIsMCkpOwkjIG1tNSA9IHJbNl0KKwkJJnBhZGRxKCJtbTYiLCJtbTUiKTsJCSMgbW02ID0gcls2XSArIHcqYVs2XQorCQkmbW92ZCgmRFdQKDE2LCRyLCIiLDApLCJtbTEiKTsKKwkJJnBzcmxxKCJtbTEiLDMyKTsJCSMgbW0xID0gY2Fycnk0CisJCSZwYWRkcSgibW0xIiwibW00Iik7CQkjIG1tMSA9IGNhcnJ5NCArIHJbNV0gKyB3KmFbNV0KKwkJJm1vdmQoIm1tNSIsJkRXUCgyOCwkciwiIiwwKSk7CSMgbW01ID0gcls3XQorCQkmcGFkZHEoIm1tMyIsIm1tNSIpOwkJIyBtbTMgPSByWzddICsgdyphWzddCisJCSZtb3ZkKCZEV1AoMjAsJHIsIiIsMCksIm1tMSIpOworCQkmcHNybHEoIm1tMSIsMzIpOwkJIyBtbTEgPSBjYXJyeTUKKwkJJnBhZGRxKCJtbTEiLCJtbTYiKTsJCSMgbW0xID0gY2Fycnk1ICsgcls2XSArIHcqYVs2XQorCQkmbW92ZCgmRFdQKDI0LCRyLCIiLDApLCJtbTEiKTsKKwkJJnBzcmxxKCJtbTEiLDMyKTsJCSMgbW0xID0gY2Fycnk2CisJCSZwYWRkcSgibW0xIiwibW0zIik7CQkjIG1tMSA9IGNhcnJ5NiArIHJbN10gKyB3KmFbN10KKwkJJm1vdmQoJkRXUCgyOCwkciwiIiwwKSwibW0xIik7CisJCSZsZWEoJHIsJkRXUCgzMiwkcikpOworCQkmcHNybHEoIm1tMSIsMzIpOwkJIyBtbTEgPSBjYXJyeV9vdXQKKworCQkmc3ViKCRjLDgpOworCQkmanooJmxhYmVsKCJtYXdfc3NlMl9leGl0IikpOworCSZzZXRfbGFiZWwoIm1hd19zc2UyX2VudHJ5Iik7CisJCSZ0ZXN0KCRjLDB4ZmZmZmZmZjgpOworCQkmam56KCZsYWJlbCgibWF3X3NzZTJfdW5yb2xsZWQiKSk7CisKKwkmc2V0X2xhYmVsKCJtYXdfc3NlMl9sb29wIiw0KTsKKwkJJm1vdmQoIm1tMiIsJkRXUCgwLCRhKSk7CSMgbW0yID0gYVtpXQorCQkmbW92ZCgibW0zIiwmRFdQKDAsJHIpKTsJIyBtbTMgPSByW2ldCisJCSZwbXVsdWRxKCJtbTIiLCJtbTAiKTsJCSMgYVtpXSAqPSB3CisJCSZsZWEoJGEsJkRXUCg0LCRhKSk7CisJCSZwYWRkcSgibW0xIiwibW0zIik7CQkjIGNhcnJ5ICs9IHJbaV0KKwkJJnBhZGRxKCJtbTEiLCJtbTIiKTsJCSMgY2FycnkgKz0gYVtpXSp3CisJCSZtb3ZkKCZEV1AoMCwkciksIm1tMSIpOwkjIHJbaV0gPSBjYXJyeV9sb3cKKwkJJnN1YigkYywxKTsKKwkJJnBzcmxxKCJtbTEiLDMyKTsJCSMgY2FycnkgPSBjYXJyeV9oaWdoCisJCSZsZWEoJHIsJkRXUCg0LCRyKSk7CisJCSZqbnooJmxhYmVsKCJtYXdfc3NlMl9sb29wIikpOworCSZzZXRfbGFiZWwoIm1hd19zc2UyX2V4aXQiKTsKKwkJJm1vdmQoImVheCIsIm1tMSIpOwkJIyBjID0gY2Fycnlfb3V0CisJCSZlbW1zKCk7CisJCSZyZXQoKTsKKworCSZzZXRfbGFiZWwoIm1hd19ub25fc3NlMiIsMTYpOworCX0KKworCSMgZnVuY3Rpb25fYmVnaW4gcHJvbG9ndWUKKwkmcHVzaCgiZWJwIik7CisJJnB1c2goImVieCIpOworCSZwdXNoKCJlc2kiKTsKKwkmcHVzaCgiZWRpIik7CisKKwkmY29tbWVudCgiIik7CisJJExvdz0iZWF4IjsKKwkkSGlnaD0iZWR4IjsKKwkkYT0iZWJ4IjsKKwkkdz0iZWJwIjsKKwkkcj0iZWRpIjsKKwkkYz0iZXNpIjsKKworCSZ4b3IoJGMsJGMpOwkJIyBjbGVhciBjYXJyeQorCSZtb3YoJHIsJndwYXJhbSgwKSk7CSMKKworCSZtb3YoImVjeCIsJndwYXJhbSgyKSk7CSMKKwkmbW92KCRhLCZ3cGFyYW0oMSkpOwkjCisKKwkmYW5kKCJlY3giLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKwkmbW92KCR3LCZ3cGFyYW0oMykpOwkjCisKKwkmcHVzaCgiZWN4Iik7CQkjIFVwIHRoZSBzdGFjayBmb3IgYSB0bXAgdmFyaWFibGUKKworCSZqeigmbGFiZWwoIm1hd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJtYXdfbG9vcCIsMTYpOworCisJZm9yICgkaT0wOyAkaTwzMjsgJGkrPTQpCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisKKwkJICZtb3YoImVheCIsJkRXUCgkaSwkYSkpOyAJIyAqYQorCQkmbXVsKCR3KTsJCQkjICphICogdworCQkmYWRkKCJlYXgiLCRjKTsJCQkjIEwodCkrPSBjCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJmFkZCgiZWF4IiwmRFdQKCRpLCRyKSk7CSMgTCh0KSs9ICpyCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJm1vdigmRFdQKCRpLCRyKSwiZWF4Iik7CSMgKnI9IEwodCk7CisJCSZtb3YoJGMsImVkeCIpOwkJCSMgYz0gIEgodCk7CisJCX0KKworCSZjb21tZW50KCIiKTsKKwkmc3ViKCJlY3giLDgpOworCSZsZWEoJGEsJkRXUCgzMiwkYSkpOworCSZsZWEoJHIsJkRXUCgzMiwkcikpOworCSZqbnooJmxhYmVsKCJtYXdfbG9vcCIpKTsKKworCSZzZXRfbGFiZWwoIm1hd19maW5pc2giLDApOworCSZtb3YoImVjeCIsJndwYXJhbSgyKSk7CSMgZ2V0IG51bQorCSZhbmQoImVjeCIsNyk7CisJJmpueigmbGFiZWwoIm1hd19maW5pc2gyIikpOwkjIGhlbHBzIGJyYW5jaCBwcmVkaWN0aW9uCisJJmptcCgmbGFiZWwoIm1hd19lbmQiKSk7CisKKwkmc2V0X2xhYmVsKCJtYXdfZmluaXNoMiIsMSk7CisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJUYWlsIFJvdW5kICRpIik7CisJCSAmbW92KCJlYXgiLCZEV1AoJGkqNCwkYSkpOwkjICphCisJCSZtdWwoJHcpOwkJCSMgKmEgKiB3CisJCSZhZGQoImVheCIsJGMpOwkJCSMgTCh0KSs9YworCQkmYWRjKCJlZHgiLDApOwkJCSMgSCh0KSs9Y2FycnkKKwkJICZhZGQoImVheCIsJkRXUCgkaSo0LCRyKSk7CSMgTCh0KSs9ICpyCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJmRlYygiZWN4IikgaWYgKCRpICE9IDctMSk7CisJCSZtb3YoJkRXUCgkaSo0LCRyKSwiZWF4Iik7CSMgKnI9IEwodCk7CisJCSAmbW92KCRjLCJlZHgiKTsJCSMgYz0gIEgodCk7CisJCSZqeigmbGFiZWwoIm1hd19lbmQiKSkgaWYgKCRpICE9IDctMSk7CisJCX0KKwkmc2V0X2xhYmVsKCJtYXdfZW5kIiwwKTsKKwkmbW92KCJlYXgiLCRjKTsKKworCSZwb3AoImVjeCIpOwkjIGNsZWFyIHZhcmlhYmxlIGZyb20KKworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKworc3ViIGJuX211bF93b3JkcworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW5fQigkbmFtZSwkc3NlMj8iRVhUUk5cdF9PUEVOU1NMX2lhMzJjYXBfUDpEV09SRCI6IiIpOworCisJJHI9ImVheCI7CisJJGE9ImVkeCI7CisJJGM9ImVjeCI7CisKKwlpZiAoJHNzZTIpIHsKKwkJJnBpY21ldXAoImVheCIsIk9QRU5TU0xfaWEzMmNhcF9QIik7CisJCSZidCgmRFdQKDAsImVheCIpLDI2KTsKKwkJJmpuYygmbGFiZWwoIm13X25vbl9zc2UyIikpOworCisJCSZtb3YoJHIsJndwYXJhbSgwKSk7CisJCSZtb3YoJGEsJndwYXJhbSgxKSk7CisJCSZtb3YoJGMsJndwYXJhbSgyKSk7CisJCSZtb3ZkKCJtbTAiLCZ3cGFyYW0oMykpOwkjIG1tMCA9IHcKKwkJJnB4b3IoIm1tMSIsIm1tMSIpOwkJIyBtbTEgPSBjYXJyeSA9IDAKKworCSZzZXRfbGFiZWwoIm13X3NzZTJfbG9vcCIsMTYpOworCQkmbW92ZCgibW0yIiwmRFdQKDAsJGEpKTsJIyBtbTIgPSBhW2ldCisJCSZwbXVsdWRxKCJtbTIiLCJtbTAiKTsJCSMgYVtpXSAqPSB3CisJCSZsZWEoJGEsJkRXUCg0LCRhKSk7CisJCSZwYWRkcSgibW0xIiwibW0yIik7CQkjIGNhcnJ5ICs9IGFbaV0qdworCQkmbW92ZCgmRFdQKDAsJHIpLCJtbTEiKTsJIyByW2ldID0gY2FycnlfbG93CisJCSZzdWIoJGMsMSk7CisJCSZwc3JscSgibW0xIiwzMik7CQkjIGNhcnJ5ID0gY2FycnlfaGlnaAorCQkmbGVhKCRyLCZEV1AoNCwkcikpOworCQkmam56KCZsYWJlbCgibXdfc3NlMl9sb29wIikpOworCisJCSZtb3ZkKCJlYXgiLCJtbTEiKTsJCSMgcmV0dXJuIGNhcnJ5CisJCSZlbW1zKCk7CisJCSZyZXQoKTsKKwkmc2V0X2xhYmVsKCJtd19ub25fc3NlMiIsMTYpOworCX0KKworCSMgZnVuY3Rpb25fYmVnaW4gcHJvbG9ndWUKKwkmcHVzaCgiZWJwIik7CisJJnB1c2goImVieCIpOworCSZwdXNoKCJlc2kiKTsKKwkmcHVzaCgiZWRpIik7CisKKwkmY29tbWVudCgiIik7CisJJExvdz0iZWF4IjsKKwkkSGlnaD0iZWR4IjsKKwkkYT0iZWJ4IjsKKwkkdz0iZWN4IjsKKwkkcj0iZWRpIjsKKwkkYz0iZXNpIjsKKwkkbnVtPSJlYnAiOworCisJJnhvcigkYywkYyk7CQkjIGNsZWFyIGNhcnJ5CisJJm1vdigkciwmd3BhcmFtKDApKTsJIworCSZtb3YoJGEsJndwYXJhbSgxKSk7CSMKKwkmbW92KCRudW0sJndwYXJhbSgyKSk7CSMKKwkmbW92KCR3LCZ3cGFyYW0oMykpOwkjCisKKwkmYW5kKCRudW0sMHhmZmZmZmZmOCk7CSMgbnVtIC8gOAorCSZqeigmbGFiZWwoIm13X2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoIm13X2xvb3AiLDApOworCWZvciAoJGk9MDsgJGk8MzI7ICRpKz00KQorCQl7CisJCSZjb21tZW50KCJSb3VuZCAkaSIpOworCisJCSAmbW92KCJlYXgiLCZEV1AoJGksJGEsIiIsMCkpOyAJIyAqYQorCQkmbXVsKCR3KTsJCQkjICphICogdworCQkmYWRkKCJlYXgiLCRjKTsJCQkjIEwodCkrPWMKKwkJICMgWFhYCisKKwkJJmFkYygiZWR4IiwwKTsJCQkjIEgodCkrPWNhcnJ5CisJCSAmbW92KCZEV1AoJGksJHIsIiIsMCksImVheCIpOwkjICpyPSBMKHQpOworCisJCSZtb3YoJGMsImVkeCIpOwkJCSMgYz0gIEgodCk7CisJCX0KKworCSZjb21tZW50KCIiKTsKKwkmYWRkKCRhLDMyKTsKKwkmYWRkKCRyLDMyKTsKKwkmc3ViKCRudW0sOCk7CisJJmp6KCZsYWJlbCgibXdfZmluaXNoIikpOworCSZqbXAoJmxhYmVsKCJtd19sb29wIikpOworCisJJnNldF9sYWJlbCgibXdfZmluaXNoIiwwKTsKKwkmbW92KCRudW0sJndwYXJhbSgyKSk7CSMgZ2V0IG51bQorCSZhbmQoJG51bSw3KTsKKwkmam56KCZsYWJlbCgibXdfZmluaXNoMiIpKTsKKwkmam1wKCZsYWJlbCgibXdfZW5kIikpOworCisJJnNldF9sYWJlbCgibXdfZmluaXNoMiIsMSk7CisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJUYWlsIFJvdW5kICRpIik7CisJCSAmbW92KCJlYXgiLCZEV1AoJGkqNCwkYSwiIiwwKSk7IyAqYQorCQkmbXVsKCR3KTsJCQkjICphICogdworCQkmYWRkKCJlYXgiLCRjKTsJCQkjIEwodCkrPWMKKwkJICMgWFhYCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksImVheCIpOyMgKnI9IEwodCk7CisJCSZtb3YoJGMsImVkeCIpOwkJCSMgYz0gIEgodCk7CisJCSAmZGVjKCRudW0pIGlmICgkaSAhPSA3LTEpOworCQkmanooJmxhYmVsKCJtd19lbmQiKSkgaWYgKCRpICE9IDctMSk7CisJCX0KKwkmc2V0X2xhYmVsKCJtd19lbmQiLDApOworCSZtb3YoImVheCIsJGMpOworCisJJmZ1bmN0aW9uX2VuZCgkbmFtZSk7CisJfQorCitzdWIgYm5fc3FyX3dvcmRzCisJeworCWxvY2FsKCRuYW1lKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCRzc2UyPyJFWFRSTlx0X09QRU5TU0xfaWEzMmNhcF9QOkRXT1JEIjoiIik7CisKKwkkcj0iZWF4IjsKKwkkYT0iZWR4IjsKKwkkYz0iZWN4IjsKKworCWlmICgkc3NlMikgeworCQkmcGljbWV1cCgiZWF4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkJJmJ0KCZEV1AoMCwiZWF4IiksMjYpOworCQkmam5jKCZsYWJlbCgic3FyX25vbl9zc2UyIikpOworCisJCSZtb3YoJHIsJndwYXJhbSgwKSk7CisJCSZtb3YoJGEsJndwYXJhbSgxKSk7CisJCSZtb3YoJGMsJndwYXJhbSgyKSk7CisKKwkmc2V0X2xhYmVsKCJzcXJfc3NlMl9sb29wIiwxNik7CisJCSZtb3ZkKCJtbTAiLCZEV1AoMCwkYSkpOwkjIG1tMCA9IGFbaV0KKwkJJnBtdWx1ZHEoIm1tMCIsIm1tMCIpOwkJIyBhW2ldICo9IGFbaV0KKwkJJmxlYSgkYSwmRFdQKDQsJGEpKTsJCSMgYSsrCisJCSZtb3ZxKCZRV1AoMCwkciksIm1tMCIpOwkjIHJbaV0gPSBhW2ldKmFbaV0KKwkJJnN1YigkYywxKTsKKwkJJmxlYSgkciwmRFdQKDgsJHIpKTsJCSMgciArPSAyCisJCSZqbnooJmxhYmVsKCJzcXJfc3NlMl9sb29wIikpOworCisJCSZlbW1zKCk7CisJCSZyZXQoKTsKKwkmc2V0X2xhYmVsKCJzcXJfbm9uX3NzZTIiLDE2KTsKKwl9CisKKwkjIGZ1bmN0aW9uX2JlZ2luIHByb2xvZ3VlCisJJnB1c2goImVicCIpOworCSZwdXNoKCJlYngiKTsKKwkmcHVzaCgiZXNpIik7CisJJnB1c2goImVkaSIpOworCisJJmNvbW1lbnQoIiIpOworCSRyPSJlc2kiOworCSRhPSJlZGkiOworCSRudW09ImVieCI7CisKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOwkjCisJJm1vdigkYSwmd3BhcmFtKDEpKTsJIworCSZtb3YoJG51bSwmd3BhcmFtKDIpKTsJIworCisJJmFuZCgkbnVtLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKwkmanooJmxhYmVsKCJzd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJzd19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDMyOyAkaSs9NCkKKwkJeworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKwkJJm1vdigiZWF4IiwmRFdQKCRpLCRhLCIiLDApKTsgCSMgKmEKKwkJICMgWFhYCisJCSZtdWwoImVheCIpOwkJCSMgKmEgKiAqYQorCQkmbW92KCZEV1AoJGkqMiwkciwiIiwwKSwiZWF4Iik7CSMKKwkJICZtb3YoJkRXUCgkaSoyKzQsJHIsIiIsMCksImVkeCIpOyMKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGEsMzIpOworCSZhZGQoJHIsNjQpOworCSZzdWIoJG51bSw4KTsKKwkmam56KCZsYWJlbCgic3dfbG9vcCIpKTsKKworCSZzZXRfbGFiZWwoInN3X2ZpbmlzaCIsMCk7CisJJm1vdigkbnVtLCZ3cGFyYW0oMikpOwkjIGdldCBudW0KKwkmYW5kKCRudW0sNyk7CisJJmp6KCZsYWJlbCgic3dfZW5kIikpOworCisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJUYWlsIFJvdW5kICRpIik7CisJCSZtb3YoImVheCIsJkRXUCgkaSo0LCRhLCIiLDApKTsJIyAqYQorCQkgIyBYWFgKKwkJJm11bCgiZWF4Iik7CQkJIyAqYSAqICphCisJCSZtb3YoJkRXUCgkaSo4LCRyLCIiLDApLCJlYXgiKTsJIworCQkgJmRlYygkbnVtKSBpZiAoJGkgIT0gNy0xKTsKKwkJJm1vdigmRFdQKCRpKjgrNCwkciwiIiwwKSwiZWR4Iik7CisJCSAmanooJmxhYmVsKCJzd19lbmQiKSkgaWYgKCRpICE9IDctMSk7CisJCX0KKwkmc2V0X2xhYmVsKCJzd19lbmQiLDApOworCisJJmZ1bmN0aW9uX2VuZCgkbmFtZSk7CisJfQorCitzdWIgYm5fZGl2X3dvcmRzCisJeworCWxvY2FsKCRuYW1lKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCIiKTsKKwkmbW92KCJlZHgiLCZ3cGFyYW0oMCkpOwkjCisJJm1vdigiZWF4Iiwmd3BhcmFtKDEpKTsJIworCSZtb3YoImVjeCIsJndwYXJhbSgyKSk7CSMKKwkmZGl2KCJlY3giKTsKKwkmcmV0KCk7CisJJmZ1bmN0aW9uX2VuZF9CKCRuYW1lKTsKKwl9CisKK3N1YiBibl9hZGRfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luKCRuYW1lLCIiKTsKKworCSZjb21tZW50KCIiKTsKKwkkYT0iZXNpIjsKKwkkYj0iZWRpIjsKKwkkYz0iZWF4IjsKKwkkcj0iZWJ4IjsKKwkkdG1wMT0iZWN4IjsKKwkkdG1wMj0iZWR4IjsKKwkkbnVtPSJlYnAiOworCisJJm1vdigkciwmd3BhcmFtKDApKTsJIyBnZXQgcgorCSAmbW92KCRhLCZ3cGFyYW0oMSkpOwkjIGdldCBhCisJJm1vdigkYiwmd3BhcmFtKDIpKTsJIyBnZXQgYgorCSAmbW92KCRudW0sJndwYXJhbSgzKSk7CSMgZ2V0IG51bQorCSZ4b3IoJGMsJGMpOwkJIyBjbGVhciBjYXJyeQorCSAmYW5kKCRudW0sMHhmZmZmZmZmOCk7CSMgbnVtIC8gOAorCisJJmp6KCZsYWJlbCgiYXdfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgiYXdfbG9vcCIsMCk7CisJZm9yICgkaT0wOyAkaTw4OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJSb3VuZCAkaSIpOworCisJCSZtb3YoJHRtcDEsJkRXUCgkaSo0LCRhLCIiLDApKTsgCSMgKmEKKwkJICZtb3YoJHRtcDIsJkRXUCgkaSo0LCRiLCIiLDApKTsgCSMgKmIKKwkJJmFkZCgkdG1wMSwkYyk7CisJCSAmbW92KCRjLDApOworCQkmYWRjKCRjLCRjKTsKKwkJICZhZGQoJHRtcDEsJHRtcDIpOworCQkmYWRjKCRjLDApOworCQkgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOyAJIyAqcgorCQl9CisKKwkmY29tbWVudCgiIik7CisJJmFkZCgkYSwzMik7CisJICZhZGQoJGIsMzIpOworCSZhZGQoJHIsMzIpOworCSAmc3ViKCRudW0sOCk7CisJJmpueigmbGFiZWwoImF3X2xvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJhd19maW5pc2giLDApOworCSZtb3YoJG51bSwmd3BhcmFtKDMpKTsJIyBnZXQgbnVtCisJJmFuZCgkbnVtLDcpOworCSAmanooJmxhYmVsKCJhd19lbmQiKSk7CisKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlRhaWwgUm91bmQgJGkiKTsKKwkJJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOwkjICphCisJCSAmbW92KCR0bXAyLCZEV1AoJGkqNCwkYiwiIiwwKSk7IyAqYgorCQkmYWRkKCR0bXAxLCRjKTsKKwkJICZtb3YoJGMsMCk7CisJCSZhZGMoJGMsJGMpOworCQkgJmFkZCgkdG1wMSwkdG1wMik7CisJCSZhZGMoJGMsMCk7CisJCSAmZGVjKCRudW0pIGlmICgkaSAhPSA2KTsKKwkJJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOwkjICpyCisJCSAmanooJmxhYmVsKCJhd19lbmQiKSkgaWYgKCRpICE9IDYpOworCQl9CisJJnNldF9sYWJlbCgiYXdfZW5kIiwwKTsKKworIwkmbW92KCJlYXgiLCRjKTsJCSMgJGMgaXMgImVheCIKKworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKworc3ViIGJuX3N1Yl93b3JkcworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW4oJG5hbWUsIiIpOworCisJJmNvbW1lbnQoIiIpOworCSRhPSJlc2kiOworCSRiPSJlZGkiOworCSRjPSJlYXgiOworCSRyPSJlYngiOworCSR0bXAxPSJlY3giOworCSR0bXAyPSJlZHgiOworCSRudW09ImVicCI7CisKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOwkjIGdldCByCisJICZtb3YoJGEsJndwYXJhbSgxKSk7CSMgZ2V0IGEKKwkmbW92KCRiLCZ3cGFyYW0oMikpOwkjIGdldCBiCisJICZtb3YoJG51bSwmd3BhcmFtKDMpKTsJIyBnZXQgbnVtCisJJnhvcigkYywkYyk7CQkjIGNsZWFyIGNhcnJ5CisJICZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisKKwkmanooJmxhYmVsKCJhd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJhd19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDg7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisKKwkJJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOyAJIyAqYQorCQkgJm1vdigkdG1wMiwmRFdQKCRpKjQsJGIsIiIsMCkpOyAJIyAqYgorCQkmc3ViKCR0bXAxLCRjKTsKKwkJICZtb3YoJGMsMCk7CisJCSZhZGMoJGMsJGMpOworCQkgJnN1YigkdG1wMSwkdG1wMik7CisJCSZhZGMoJGMsMCk7CisJCSAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7IAkjICpyCisJCX0KKworCSZjb21tZW50KCIiKTsKKwkmYWRkKCRhLDMyKTsKKwkgJmFkZCgkYiwzMik7CisJJmFkZCgkciwzMik7CisJICZzdWIoJG51bSw4KTsKKwkmam56KCZsYWJlbCgiYXdfbG9vcCIpKTsKKworCSZzZXRfbGFiZWwoImF3X2ZpbmlzaCIsMCk7CisJJm1vdigkbnVtLCZ3cGFyYW0oMykpOwkjIGdldCBudW0KKwkmYW5kKCRudW0sNyk7CisJICZqeigmbGFiZWwoImF3X2VuZCIpKTsKKworCWZvciAoJGk9MDsgJGk8NzsgJGkrKykKKwkJeworCQkmY29tbWVudCgiVGFpbCBSb3VuZCAkaSIpOworCQkmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7CSMgKmEKKwkJICZtb3YoJHRtcDIsJkRXUCgkaSo0LCRiLCIiLDApKTsjICpiCisJCSZzdWIoJHRtcDEsJGMpOworCQkgJm1vdigkYywwKTsKKwkJJmFkYygkYywkYyk7CisJCSAmc3ViKCR0bXAxLCR0bXAyKTsKKwkJJmFkYygkYywwKTsKKwkJICZkZWMoJG51bSkgaWYgKCRpICE9IDYpOworCQkmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7CSMgKnIKKwkJICZqeigmbGFiZWwoImF3X2VuZCIpKSBpZiAoJGkgIT0gNik7CisJCX0KKwkmc2V0X2xhYmVsKCJhd19lbmQiLDApOworCisjCSZtb3YoImVheCIsJGMpOwkJIyAkYyBpcyAiZWF4IgorCisJJmZ1bmN0aW9uX2VuZCgkbmFtZSk7CisJfQorCitzdWIgYm5fc3ViX3BhcnRfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luKCRuYW1lLCIiKTsKKworCSZjb21tZW50KCIiKTsKKwkkYT0iZXNpIjsKKwkkYj0iZWRpIjsKKwkkYz0iZWF4IjsKKwkkcj0iZWJ4IjsKKwkkdG1wMT0iZWN4IjsKKwkkdG1wMj0iZWR4IjsKKwkkbnVtPSJlYnAiOworCisJJm1vdigkciwmd3BhcmFtKDApKTsJIyBnZXQgcgorCSAmbW92KCRhLCZ3cGFyYW0oMSkpOwkjIGdldCBhCisJJm1vdigkYiwmd3BhcmFtKDIpKTsJIyBnZXQgYgorCSAmbW92KCRudW0sJndwYXJhbSgzKSk7CSMgZ2V0IG51bQorCSZ4b3IoJGMsJGMpOwkJIyBjbGVhciBjYXJyeQorCSAmYW5kKCRudW0sMHhmZmZmZmZmOCk7CSMgbnVtIC8gOAorCisJJmp6KCZsYWJlbCgiYXdfZmluaXNoIikpOworCisJJnNldF9sYWJlbCgiYXdfbG9vcCIsMCk7CisJZm9yICgkaT0wOyAkaTw4OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJSb3VuZCAkaSIpOworCisJCSZtb3YoJHRtcDEsJkRXUCgkaSo0LCRhLCIiLDApKTsgCSMgKmEKKwkJICZtb3YoJHRtcDIsJkRXUCgkaSo0LCRiLCIiLDApKTsgCSMgKmIKKwkJJnN1YigkdG1wMSwkYyk7CisJCSAmbW92KCRjLDApOworCQkmYWRjKCRjLCRjKTsKKwkJICZzdWIoJHRtcDEsJHRtcDIpOworCQkmYWRjKCRjLDApOworCQkgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOyAJIyAqcgorCQl9CisKKwkmY29tbWVudCgiIik7CisJJmFkZCgkYSwzMik7CisJICZhZGQoJGIsMzIpOworCSZhZGQoJHIsMzIpOworCSAmc3ViKCRudW0sOCk7CisJJmpueigmbGFiZWwoImF3X2xvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJhd19maW5pc2giLDApOworCSZtb3YoJG51bSwmd3BhcmFtKDMpKTsJIyBnZXQgbnVtCisJJmFuZCgkbnVtLDcpOworCSAmanooJmxhYmVsKCJhd19lbmQiKSk7CisKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJCXsKKwkJJmNvbW1lbnQoIlRhaWwgUm91bmQgJGkiKTsKKwkJJm1vdigkdG1wMSwmRFdQKDAsJGEsIiIsMCkpOwkjICphCisJCSAmbW92KCR0bXAyLCZEV1AoMCwkYiwiIiwwKSk7IyAqYgorCQkmc3ViKCR0bXAxLCRjKTsKKwkJICZtb3YoJGMsMCk7CisJCSZhZGMoJGMsJGMpOworCQkgJnN1YigkdG1wMSwkdG1wMik7CisJCSZhZGMoJGMsMCk7CisJCSZtb3YoJkRXUCgwLCRyLCIiLDApLCR0bXAxKTsJIyAqcgorCQkmYWRkKCRhLCA0KTsKKwkJJmFkZCgkYiwgNCk7CisJCSZhZGQoJHIsIDQpOworCQkgJmRlYygkbnVtKSBpZiAoJGkgIT0gNik7CisJCSAmanooJmxhYmVsKCJhd19lbmQiKSkgaWYgKCRpICE9IDYpOworCQl9CisJJnNldF9sYWJlbCgiYXdfZW5kIiwwKTsKKworCSZjbXAoJndwYXJhbSg0KSwwKTsKKwkmamUoJmxhYmVsKCJwd19lbmQiKSk7CisKKwkmbW92KCRudW0sJndwYXJhbSg0KSk7CSMgZ2V0IGRsCisJJmNtcCgkbnVtLDApOworCSZqZSgmbGFiZWwoInB3X2VuZCIpKTsKKwkmamdlKCZsYWJlbCgicHdfcG9zIikpOworCisJJmNvbW1lbnQoInB3X25lZyIpOworCSZtb3YoJHRtcDIsMCk7CisJJnN1YigkdG1wMiwkbnVtKTsKKwkmbW92KCRudW0sJHRtcDIpOworCSZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisJJmp6KCZsYWJlbCgicHdfbmVnX2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoInB3X25lZ19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDg7ICRpKyspCisJeworCSAgICAmY29tbWVudCgiZGw8MCBSb3VuZCAkaSIpOworCisJICAgICZtb3YoJHRtcDEsMCk7CisJICAgICZtb3YoJHRtcDIsJkRXUCgkaSo0LCRiLCIiLDApKTsgCSMgKmIKKwkgICAgJnN1YigkdG1wMSwkYyk7CisJICAgICZtb3YoJGMsMCk7CisJICAgICZhZGMoJGMsJGMpOworCSAgICAmc3ViKCR0bXAxLCR0bXAyKTsKKwkgICAgJmFkYygkYywwKTsKKwkgICAgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOyAJIyAqcgorCX0KKwkgICAgCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGIsMzIpOworCSZhZGQoJHIsMzIpOworCSZzdWIoJG51bSw4KTsKKwkmam56KCZsYWJlbCgicHdfbmVnX2xvb3AiKSk7CisJICAgIAorCSZzZXRfbGFiZWwoInB3X25lZ19maW5pc2giLDApOworCSZtb3YoJHRtcDIsJndwYXJhbSg0KSk7CSMgZ2V0IGRsCisJJm1vdigkbnVtLDApOworCSZzdWIoJG51bSwkdG1wMik7CisJJmFuZCgkbnVtLDcpOworCSZqeigmbGFiZWwoInB3X2VuZCIpKTsKKwkgICAgCisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCXsKKwkgICAgJmNvbW1lbnQoImRsPDAgVGFpbCBSb3VuZCAkaSIpOworCSAgICAmbW92KCR0bXAxLDApOworCSAgICAmbW92KCR0bXAyLCZEV1AoJGkqNCwkYiwiIiwwKSk7IyAqYgorCSAgICAmc3ViKCR0bXAxLCRjKTsKKwkgICAgJm1vdigkYywwKTsKKwkgICAgJmFkYygkYywkYyk7CisJICAgICZzdWIoJHRtcDEsJHRtcDIpOworCSAgICAmYWRjKCRjLDApOworCSAgICAmZGVjKCRudW0pIGlmICgkaSAhPSA2KTsKKwkgICAgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOwkjICpyCisJICAgICZqeigmbGFiZWwoInB3X2VuZCIpKSBpZiAoJGkgIT0gNik7CisJfQorCisJJmptcCgmbGFiZWwoInB3X2VuZCIpKTsKKwkKKwkmc2V0X2xhYmVsKCJwd19wb3MiLDApOworCQorCSZhbmQoJG51bSwweGZmZmZmZmY4KTsJIyBudW0gLyA4CisJJmp6KCZsYWJlbCgicHdfcG9zX2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoInB3X3Bvc19sb29wIiwwKTsKKworCWZvciAoJGk9MDsgJGk8ODsgJGkrKykKKwl7CisJICAgICZjb21tZW50KCJkbD4wIFJvdW5kICRpIik7CisKKwkgICAgJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOwkjICphCisJICAgICZzdWIoJHRtcDEsJGMpOworCSAgICAmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkdG1wMSk7CSMgKnIKKwkgICAgJmpuYygmbGFiZWwoInB3X25jIi4kaSkpOworCX0KKwkgICAgCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGEsMzIpOworCSZhZGQoJHIsMzIpOworCSZzdWIoJG51bSw4KTsKKwkmam56KCZsYWJlbCgicHdfcG9zX2xvb3AiKSk7CisJICAgIAorCSZzZXRfbGFiZWwoInB3X3Bvc19maW5pc2giLDApOworCSZtb3YoJG51bSwmd3BhcmFtKDQpKTsJIyBnZXQgZGwKKwkmYW5kKCRudW0sNyk7CisJJmp6KCZsYWJlbCgicHdfZW5kIikpOworCSAgICAKKwlmb3IgKCRpPTA7ICRpPDc7ICRpKyspCisJeworCSAgICAmY29tbWVudCgiZGw+MCBUYWlsIFJvdW5kICRpIik7CisJICAgICZtb3YoJHRtcDEsJkRXUCgkaSo0LCRhLCIiLDApKTsJIyAqYQorCSAgICAmc3ViKCR0bXAxLCRjKTsKKwkgICAgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJHRtcDEpOwkjICpyCisJICAgICZqbmMoJmxhYmVsKCJwd190YWlsX25jIi4kaSkpOworCSAgICAmZGVjKCRudW0pIGlmICgkaSAhPSA2KTsKKwkgICAgJmp6KCZsYWJlbCgicHdfZW5kIikpIGlmICgkaSAhPSA2KTsKKwl9CisJJm1vdigkYywxKTsKKwkmam1wKCZsYWJlbCgicHdfZW5kIikpOworCisJJnNldF9sYWJlbCgicHdfbmNfbG9vcCIsMCk7CisJZm9yICgkaT0wOyAkaTw4OyAkaSsrKQorCXsKKwkgICAgJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOwkjICphCisJICAgICZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsJIyAqcgorCSAgICAmc2V0X2xhYmVsKCJwd19uYyIuJGksMCk7CisJfQorCSAgICAKKwkmY29tbWVudCgiIik7CisJJmFkZCgkYSwzMik7CisJJmFkZCgkciwzMik7CisJJnN1YigkbnVtLDgpOworCSZqbnooJmxhYmVsKCJwd19uY19sb29wIikpOworCSAgICAKKwkmbW92KCRudW0sJndwYXJhbSg0KSk7CSMgZ2V0IGRsCisJJmFuZCgkbnVtLDcpOworCSZqeigmbGFiZWwoInB3X25jX2VuZCIpKTsKKwkgICAgCisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCXsKKwkgICAgJm1vdigkdG1wMSwmRFdQKCRpKjQsJGEsIiIsMCkpOwkjICphCisJICAgICZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsJIyAqcgorCSAgICAmc2V0X2xhYmVsKCJwd190YWlsX25jIi4kaSwwKTsKKwkgICAgJmRlYygkbnVtKSBpZiAoJGkgIT0gNik7CisJICAgICZqeigmbGFiZWwoInB3X25jX2VuZCIpKSBpZiAoJGkgIT0gNik7CisJfQorCisJJnNldF9sYWJlbCgicHdfbmNfZW5kIiwwKTsKKwkmbW92KCRjLDApOworCisJJnNldF9sYWJlbCgicHdfZW5kIiwwKTsKKworIwkmbW92KCJlYXgiLCRjKTsJCSMgJGMgaXMgImVheCIKKworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9jby01ODYucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL2NvLTU4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzEwMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9jby01ODYucGwKQEAgLTAsMCArMSwyODcgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sJDApOworCismYm5fbXVsX2NvbWJhKCJibl9tdWxfY29tYmE4Iiw4KTsKKyZibl9tdWxfY29tYmEoImJuX211bF9jb21iYTQiLDQpOworJmJuX3Nxcl9jb21iYSgiYm5fc3FyX2NvbWJhOCIsOCk7CismYm5fc3FyX2NvbWJhKCJibl9zcXJfY29tYmE0Iiw0KTsKKworJmFzbV9maW5pc2goKTsKKworc3ViIG11bF9hZGRfYworCXsKKwlsb2NhbCgkYSwkYWksJGIsJGJpLCRjMCwkYzEsJGMyLCRwb3MsJGksJG5hLCRuYik9QF87CisKKwkjIHBvcyA9PSAtMSBpZiBlYXggYW5kIGVkeCBhcmUgcHJlLWxvYWRlZCwgMCB0byBsb2FkIGZyb20gbmV4dAorCSMgd29yZHMsIGFuZCAxIGlmIGxvYWQgcmV0dXJuIHZhbHVlCisKKwkmY29tbWVudCgibXVsIGFbJGFpXSpiWyRiaV0iKTsKKworCSMgImVheCIgYW5kICJlZHgiIHdpbGwgYWx3YXlzIGJlIHByZS1sb2FkZWQuCisJIyAmbW92KCJlYXgiLCZEV1AoJGFpKjQsJGEsIiIsMCkpIDsKKwkjICZtb3YoImVkeCIsJkRXUCgkYmkqNCwkYiwiIiwwKSk7CisKKwkmbXVsKCJlZHgiKTsKKwkmYWRkKCRjMCwiZWF4Iik7CisJICZtb3YoImVheCIsJkRXUCgoJG5hKSo0LCRhLCIiLDApKSBpZiAkcG9zID09IDA7CSMgbGFvZCBuZXh0IGEKKwkgJm1vdigiZWF4Iiwmd3BhcmFtKDApKSBpZiAkcG9zID4gMDsJCQkjIGxvYWQgcltdCisJICMjIworCSZhZGMoJGMxLCJlZHgiKTsKKwkgJm1vdigiZWR4IiwmRFdQKCgkbmIpKjQsJGIsIiIsMCkpIGlmICRwb3MgPT0gMDsJIyBsYW9kIG5leHQgYgorCSAmbW92KCJlZHgiLCZEV1AoKCRuYikqNCwkYiwiIiwwKSkgaWYgJHBvcyA9PSAxOwkjIGxhb2QgbmV4dCBiCisJICMjIworCSZhZGMoJGMyLDApOworCSAjIGlzIHBvcyA+IDEsIGl0IG1lYW5zIGl0IGlzIHRoZSBsYXN0IGxvb3AgCisJICZtb3YoJkRXUCgkaSo0LCJlYXgiLCIiLDApLCRjMCkgaWYgJHBvcyA+IDA7CQkjIHNhdmUgcltdOworCSZtb3YoImVheCIsJkRXUCgoJG5hKSo0LCRhLCIiLDApKSBpZiAkcG9zID09IDE7CQkjIGxhb2QgbmV4dCBhCisJfQorCitzdWIgc3FyX2FkZF9jCisJeworCWxvY2FsKCRyLCRhLCRhaSwkYmksJGMwLCRjMSwkYzIsJHBvcywkaSwkbmEsJG5iKT1AXzsKKworCSMgcG9zID09IC0xIGlmIGVheCBhbmQgZWR4IGFyZSBwcmUtbG9hZGVkLCAwIHRvIGxvYWQgZnJvbSBuZXh0CisJIyB3b3JkcywgYW5kIDEgaWYgbG9hZCByZXR1cm4gdmFsdWUKKworCSZjb21tZW50KCJzcXIgYVskYWldKmFbJGJpXSIpOworCisJIyAiZWF4IiBhbmQgImVkeCIgd2lsbCBhbHdheXMgYmUgcHJlLWxvYWRlZC4KKwkjICZtb3YoImVheCIsJkRXUCgkYWkqNCwkYSwiIiwwKSkgOworCSMgJm1vdigiZWR4IiwmRFdQKCRiaSo0LCRiLCIiLDApKTsKKworCWlmICgkYWkgPT0gJGJpKQorCQl7ICZtdWwoImVheCIpO30KKwllbHNlCisJCXsgJm11bCgiZWR4Iik7fQorCSZhZGQoJGMwLCJlYXgiKTsKKwkgJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMDsJIyBsb2FkIG5leHQgYQorCSAjIyMKKwkmYWRjKCRjMSwiZWR4Iik7CisJICZtb3YoImVkeCIsJkRXUCgoJG5iKSo0LCRhLCIiLDApKSBpZiAoJHBvcyA9PSAxKSAmJiAoJG5hICE9ICRuYik7CisJICMjIworCSZhZGMoJGMyLDApOworCSAjIGlzIHBvcyA+IDEsIGl0IG1lYW5zIGl0IGlzIHRoZSBsYXN0IGxvb3AgCisJICZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCRjMCkgaWYgJHBvcyA+IDA7CQkjIHNhdmUgcltdOworCSZtb3YoImVheCIsJkRXUCgoJG5hKSo0LCRhLCIiLDApKSBpZiAkcG9zID09IDE7CQkjIGxvYWQgbmV4dCBiCisJfQorCitzdWIgc3FyX2FkZF9jMgorCXsKKwlsb2NhbCgkciwkYSwkYWksJGJpLCRjMCwkYzEsJGMyLCRwb3MsJGksJG5hLCRuYik9QF87CisKKwkjIHBvcyA9PSAtMSBpZiBlYXggYW5kIGVkeCBhcmUgcHJlLWxvYWRlZCwgMCB0byBsb2FkIGZyb20gbmV4dAorCSMgd29yZHMsIGFuZCAxIGlmIGxvYWQgcmV0dXJuIHZhbHVlCisKKwkmY29tbWVudCgic3FyIGFbJGFpXSphWyRiaV0iKTsKKworCSMgImVheCIgYW5kICJlZHgiIHdpbGwgYWx3YXlzIGJlIHByZS1sb2FkZWQuCisJIyAmbW92KCJlYXgiLCZEV1AoJGFpKjQsJGEsIiIsMCkpIDsKKwkjICZtb3YoImVkeCIsJkRXUCgkYmkqNCwkYSwiIiwwKSk7CisKKwlpZiAoJGFpID09ICRiaSkKKwkJeyAmbXVsKCJlYXgiKTt9CisJZWxzZQorCQl7ICZtdWwoImVkeCIpO30KKwkmYWRkKCJlYXgiLCJlYXgiKTsKKwkgIyMjCisJJmFkYygiZWR4IiwiZWR4Iik7CisJICMjIworCSZhZGMoJGMyLDApOworCSAmYWRkKCRjMCwiZWF4Iik7CisJJmFkYygkYzEsImVkeCIpOworCSAmbW92KCJlYXgiLCZEV1AoKCRuYSkqNCwkYSwiIiwwKSkgaWYgJHBvcyA9PSAwOwkjIGxvYWQgbmV4dCBhCisJICZtb3YoImVheCIsJkRXUCgoJG5hKSo0LCRhLCIiLDApKSBpZiAkcG9zID09IDE7CSMgbG9hZCBuZXh0IGIKKwkmYWRjKCRjMiwwKTsKKwkmbW92KCZEV1AoJGkqNCwkciwiIiwwKSwkYzApIGlmICRwb3MgPiAwOwkJIyBzYXZlIHJbXTsKKwkgJm1vdigiZWR4IiwmRFdQKCgkbmIpKjQsJGEsIiIsMCkpIGlmICgkcG9zIDw9IDEpICYmICgkbmEgIT0gJG5iKTsKKwkgIyMjCisJfQorCitzdWIgYm5fbXVsX2NvbWJhCisJeworCWxvY2FsKCRuYW1lLCRudW0pPUBfOworCWxvY2FsKCRhLCRiLCRjMCwkYzEsJGMyKTsKKwlsb2NhbCgkaSwkYXMsJGFlLCRicywkYmUsJGFpLCRiaSk7CisJbG9jYWwoJHRvdCwkZW5kKTsKKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCIiKTsKKworCSRjMD0iZWJ4IjsKKwkkYzE9ImVjeCI7CisJJGMyPSJlYnAiOworCSRhPSJlc2kiOworCSRiPSJlZGkiOworCQorCSRhcz0wOworCSRhZT0wOworCSRicz0wOworCSRiZT0wOworCSR0b3Q9JG51bSskbnVtLTE7CisKKwkmcHVzaCgiZXNpIik7CisJICZtb3YoJGEsJndwYXJhbSgxKSk7CisJJnB1c2goImVkaSIpOworCSAmbW92KCRiLCZ3cGFyYW0oMikpOworCSZwdXNoKCJlYnAiKTsKKwkgJnB1c2goImVieCIpOworCisJJnhvcigkYzAsJGMwKTsKKwkgJm1vdigiZWF4IiwmRFdQKDAsJGEsIiIsMCkpOwkjIGxvYWQgdGhlIGZpcnN0IHdvcmQgCisJJnhvcigkYzEsJGMxKTsKKwkgJm1vdigiZWR4IiwmRFdQKDAsJGIsIiIsMCkpOwkjIGxvYWQgdGhlIGZpcnN0IHNlY29uZCAKKworCWZvciAoJGk9MDsgJGk8JHRvdDsgJGkrKykKKwkJeworCQkkYWk9JGFzOworCQkkYmk9JGJzOworCQkkZW5kPSRiZSsxOworCisJCSZjb21tZW50KCIjIyMjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgJGkiKTsgCisKKwkJZm9yICgkaj0kYnM7ICRqPCRlbmQ7ICRqKyspCisJCQl7CisJCQkmeG9yKCRjMiwkYzIpIGlmICgkaiA9PSAkYnMpOworCQkJaWYgKCgkaisxKSA9PSAkZW5kKQorCQkJCXsKKwkJCQkkdj0xOworCQkJCSR2PTIgaWYgKCgkaSsxKSA9PSAkdG90KTsKKwkJCQl9CisJCQllbHNlCisJCQkJeyAkdj0wOyB9CisJCQlpZiAoKCRqKzEpICE9ICRlbmQpCisJCQkJeworCQkJCSRuYT0oJGFpLTEpOworCQkJCSRuYj0oJGJpKzEpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJJG5hPSRhcysoJGkgPCAoJG51bS0xKSk7CisJCQkJJG5iPSRicysoJGkgPj0gKCRudW0tMSkpOworCQkJCX0KKyNwcmludGYgU1RERVJSICJbJGFpLCRiaV0gLT4gWyRuYSwkbmJdXG4iOworCQkJJm11bF9hZGRfYygkYSwkYWksJGIsJGJpLCRjMCwkYzEsJGMyLCR2LCRpLCRuYSwkbmIpOworCQkJaWYgKCR2KQorCQkJCXsKKwkJCQkmY29tbWVudCgic2F2ZWQgclskaV0iKTsKKwkJCQkjICZtb3YoImVheCIsJndwYXJhbSgwKSk7CisJCQkJIyAmbW92KCZEV1AoJGkqNCwiZWF4IiwiIiwwKSwkYzApOworCQkJCSgkYzAsJGMxLCRjMik9KCRjMSwkYzIsJGMwKTsKKwkJCQl9CisJCQkkYWktLTsKKwkJCSRiaSsrOworCQkJfQorCQkkYXMrKyBpZiAoJGkgPCAoJG51bS0xKSk7CisJCSRhZSsrIGlmICgkaSA+PSAoJG51bS0xKSk7CisKKwkJJGJzKysgaWYgKCRpID49ICgkbnVtLTEpKTsKKwkJJGJlKysgaWYgKCRpIDwgKCRudW0tMSkpOworCQl9CisJJmNvbW1lbnQoInNhdmUgclskaV0iKTsKKwkjICZtb3YoImVheCIsJndwYXJhbSgwKSk7CisJJm1vdigmRFdQKCRpKjQsImVheCIsIiIsMCksJGMwKTsKKworCSZwb3AoImVieCIpOworCSZwb3AoImVicCIpOworCSZwb3AoImVkaSIpOworCSZwb3AoImVzaSIpOworCSZyZXQoKTsKKwkmZnVuY3Rpb25fZW5kX0IoJG5hbWUpOworCX0KKworc3ViIGJuX3Nxcl9jb21iYQorCXsKKwlsb2NhbCgkbmFtZSwkbnVtKT1AXzsKKwlsb2NhbCgkciwkYSwkYzAsJGMxLCRjMik9QF87CisJbG9jYWwoJGksJGFzLCRhZSwkYnMsJGJlLCRhaSwkYmkpOworCWxvY2FsKCRiLCR0b3QsJGVuZCwkaGFsZik7CisKKwkmZnVuY3Rpb25fYmVnaW5fQigkbmFtZSwiIik7CisKKwkkYzA9ImVieCI7CisJJGMxPSJlY3giOworCSRjMj0iZWJwIjsKKwkkYT0iZXNpIjsKKwkkcj0iZWRpIjsKKworCSZwdXNoKCJlc2kiKTsKKwkgJnB1c2goImVkaSIpOworCSZwdXNoKCJlYnAiKTsKKwkgJnB1c2goImVieCIpOworCSZtb3YoJHIsJndwYXJhbSgwKSk7CisJICZtb3YoJGEsJndwYXJhbSgxKSk7CisJJnhvcigkYzAsJGMwKTsKKwkgJnhvcigkYzEsJGMxKTsKKwkmbW92KCJlYXgiLCZEV1AoMCwkYSwiIiwwKSk7ICMgbG9hZCB0aGUgZmlyc3Qgd29yZAorCisJJGFzPTA7CisJJGFlPTA7CisJJGJzPTA7CisJJGJlPTA7CisJJHRvdD0kbnVtKyRudW0tMTsKKworCWZvciAoJGk9MDsgJGk8JHRvdDsgJGkrKykKKwkJeworCQkkYWk9JGFzOworCQkkYmk9JGJzOworCQkkZW5kPSRiZSsxOworCisJCSZjb21tZW50KCIjIyMjIyMjIyMjIyMjIyMgQ2FsY3VsYXRlIHdvcmQgJGkiKTsKKwkJZm9yICgkaj0kYnM7ICRqPCRlbmQ7ICRqKyspCisJCQl7CisJCQkmeG9yKCRjMiwkYzIpIGlmICgkaiA9PSAkYnMpOworCQkJaWYgKCgkYWktMSkgPCAoJGJpKzEpKQorCQkJCXsKKwkJCQkkdj0xOworCQkJCSR2PTIgaWYgKCRpKzEpID09ICR0b3Q7CisJCQkJfQorCQkJZWxzZQorCQkJCXsgJHY9MDsgfQorCQkJaWYgKCEkdikKKwkJCQl7CisJCQkJJG5hPSRhaS0xOworCQkJCSRuYj0kYmkrMTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCSRuYT0kYXMrKCRpIDwgKCRudW0tMSkpOworCQkJCSRuYj0kYnMrKCRpID49ICgkbnVtLTEpKTsKKwkJCQl9CisJCQlpZiAoJGFpID09ICRiaSkKKwkJCQl7CisJCQkJJnNxcl9hZGRfYygkciwkYSwkYWksJGJpLAorCQkJCQkkYzAsJGMxLCRjMiwkdiwkaSwkbmEsJG5iKTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCSZzcXJfYWRkX2MyKCRyLCRhLCRhaSwkYmksCisJCQkJCSRjMCwkYzEsJGMyLCR2LCRpLCRuYSwkbmIpOworCQkJCX0KKwkJCWlmICgkdikKKwkJCQl7CisJCQkJJmNvbW1lbnQoInNhdmVkIHJbJGldIik7CisJCQkJIyZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCRjMCk7CisJCQkJKCRjMCwkYzEsJGMyKT0oJGMxLCRjMiwkYzApOworCQkJCWxhc3Q7CisJCQkJfQorCQkJJGFpLS07CisJCQkkYmkrKzsKKwkJCX0KKwkJJGFzKysgaWYgKCRpIDwgKCRudW0tMSkpOworCQkkYWUrKyBpZiAoJGkgPj0gKCRudW0tMSkpOworCisJCSRicysrIGlmICgkaSA+PSAoJG51bS0xKSk7CisJCSRiZSsrIGlmICgkaSA8ICgkbnVtLTEpKTsKKwkJfQorCSZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCRjMCk7CisJJnBvcCgiZWJ4Iik7CisJJnBvcCgiZWJwIik7CisJJnBvcCgiZWRpIik7CisJJnBvcCgiZXNpIik7CisJJnJldCgpOworCSZmdW5jdGlvbl9lbmRfQigkbmFtZSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9pYTY0LlMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL2lhNjQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTFhYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9pYTY0LlMKQEAgLTAsMCArMSwxNTU1IEBACisuZXhwbGljaXQKKy50ZXh0CisuaWRlbnQJImlhNjQuUywgVmVyc2lvbiAyLjEiCisuaWRlbnQJIklBLTY0IElTQSBhcnR3b3JrIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiIKKworLy8KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKy8vIHByb2plY3QuCisvLworLy8gUmlnaHRzIGZvciByZWRpc3RyaWJ1dGlvbiBhbmQgdXNhZ2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlCisvLyBncmFudGVkIGFjY29yZGluZyB0byB0aGUgT3BlblNTTCBsaWNlbnNlLiBXYXJyYW50eSBvZiBhbnkga2luZCBpcworLy8gZGlzY2xhaW1lZC4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLworLy8gVmVyc2lvbiAyLnggaXMgSXRhbml1bTIgcmUtdHVuZS4gRmV3IHdvcmRzIGFib3V0IGhvdyBJdGFudW0yIGlzCisvLyBkaWZmZXJlbnQgZnJvbSBJdGFuaXVtIHRvIHRoaXMgbW9kdWxlIHZpZXdwb2ludC4gTW9zdCBub3RhYmx5LCBpcyBpdAorLy8gIndpZGVyIiB0aGFuIEl0YW5pdW0/IENhbiB5b3UgZXhwZXJpZW5jZSBsb29wIHNjYWxhYmlsaXR5IGFzCisvLyBkaXNjdXNzZWQgaW4gY29tbWVudGFyeSBzZWN0aW9ucz8gTm90IHJlYWxseTotKCBJdGFuaXVtMiBoYXMgNgorLy8gaW50ZWdlciBBTFUgcG9ydHMsIGkuZS4gaXQncyAyIHBvcnRzIHdpZGVyLCBidXQgaXQncyBub3QgZW5vdWdoIHRvCisvLyBzcGluIHR3aWNlIGFzIGZhc3QsIGFzIEkgbmVlZCA4IElBTFUgcG9ydHMuIEFtb3VudCBvZiBmbG9hdGluZyBwb2ludAorLy8gcG9ydHMgaXMgdGhlIHNhbWUsIGkuZS4gMiwgd2hpbGUgSSBuZWVkIDQuIEluIG90aGVyIHdvcmRzLCB0byB0aGlzCisvLyBtb2R1bGUgSXRhbml1bTIgcmVtYWlucyBlZmZlY3RpdmVseSBhcyAid2lkZSIgYXMgSXRhbml1bS4gWWV0IGl0J3MKKy8vIGVzc2VudGlhbGx5IGRpZmZlcmVudCBpbiByZXNwZWN0IHRvIHRoaXMgbW9kdWxlLCBhbmQgYSByZS10dW5lIHdhcworLy8gcmVxdWlyZWQuIFdlbGwsIGJlY2F1c2Ugc29tZSBpbnRydWN0aW9uIGxhdGVuY2llcyBoYXMgY2hhbmdlZC4gTW9zdAorLy8gbm90aWNlYWJseSB0aG9zZSBpbnRlbnNpdmVseSB1c2VkOgorLy8KKy8vCQkJSXRhbml1bQlJdGFuaXVtMgorLy8JbGRmOAkJOQk2CQlMMiBoaXQKKy8vCWxkOAkJMgkxCQlMMSBoaXQKKy8vCWdldGYJCTIJNQorLy8JeG1hWy0+Z2V0Zl0JN1srMV0JNFsrMF0KKy8vCWFkZFstPnN0OF0JMVsrMV0JMVsrMF0KKy8vCisvLyBXaGF0IGRvZXMgaXQgbWVhbj8gWW91IG1pZ2h0IHJhdGlvY2luYXRlIHRoYXQgdGhlIG9yaWdpbmFsIGNvZGUKKy8vIHNob3VsZCBydW4ganVzdCBmYXN0ZXIuLi4gQmVjYXVzZSBzdW0gb2YgbGF0ZW5jaWVzIGlzIHNtYWxsZXIuLi4KKy8vIFdyb25nISBOb3RlIHRoYXQgZ2V0ZiBsYXRlbmN5IGluY3JlYXNlZC4gVGhpcyBtZWFucyB0aGF0IGlmIGEgbG9vcCBpcworLy8gc2NoZWR1bGVkIGZvciBsb3dlciBsYXRlbmN5IChhcyB0aGV5IHdlcmUpLCB0aGVuIGl0IHdpbGwgc3VmZmVyIGZyb20KKy8vIHN0YWxsIGNvbmRpdGlvbiBhbmQgdGhlIGNvZGUgd2lsbCB0aGVyZWZvcmUgdHVybiBhbnRpLXNjYWxhYmxlLCBlLmcuCisvLyBvcmlnaW5hbCBibl9tdWxfd29yZHMgc3B1biBhdCA1Km4gb3IgMi41IHRpbWVzIHNsb3dlciB0aGFuIGV4cGVjdGVkCisvLyBvbiBJdGFuaXVtMiEgV2hhdCB0byBkbz8gUmVzY2hlZHVsZSBsb29wcyBmb3IgSXRhbml1bTI/IEJ1dCB0aGVuCisvLyBJdGFuaXVtIHdvdWxkIGV4aGliaXQgYW50aS1zY2FsYWJpbGl0eS4gU28gSSd2ZSBjaG9zZW4gdG8gcmVzY2hlZHVsZQorLy8gZm9yIHdvcnN0IGxhdGVuY3kgZm9yIGV2ZXJ5IGluc3RydWN0aW9uIGFpbWluZyBmb3IgYmVzdCAqYWxsLXJvdW5kKgorLy8gcGVyZm9ybWFuY2UuICAKKworLy8gUS4JSG93IG11Y2ggZmFzdGVyIGRvZXMgaXQgZ2V0PworLy8gQS4JSGVyZSBpcyB0aGUgb3V0cHV0IGZyb20gJ29wZW5zc2wgc3BlZWQgcnNhIGRzYScgZm9yIHZhbmlsbGEKKy8vCTAuOS42YSBjb21waWxlZCB3aXRoIGdjYyB2ZXJzaW9uIDIuOTYgMjAwMDA3MzEgKFJlZCBIYXQKKy8vCUxpbnV4IDcuMSAyLjk2LTgxKToKKy8vCisvLwkgICAgICAgICAgICAgICAgICBzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3MKKy8vCXJzYSAgNTEyIGJpdHMgICAwLjAwMzZzICAgMC4wMDAzcyAgICAyNzUuMyAgIDI5OTkuMgorLy8JcnNhIDEwMjQgYml0cyAgIDAuMDIwM3MgICAwLjAwMTFzICAgICA0OS4zICAgIDg5NC4xCisvLwlyc2EgMjA0OCBiaXRzICAgMC4xMzMxcyAgIDAuMDA0MHMgICAgICA3LjUgICAgMjUwLjkKKy8vCXJzYSA0MDk2IGJpdHMgICAwLjkyNzBzICAgMC4wMTQ3cyAgICAgIDEuMSAgICAgNjguMQorLy8JICAgICAgICAgICAgICAgICAgc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zCisvLwlkc2EgIDUxMiBiaXRzICAgMC4wMDM1cyAgIDAuMDA0M3MgICAgMjg4LjMgICAgMjM0LjgKKy8vCWRzYSAxMDI0IGJpdHMgICAwLjAxMTFzICAgMC4wMTM1cyAgICAgOTAuMCAgICAgNzQuMgorLy8KKy8vCUFuZCBoZXJlIGlzIHNpbWlsYXIgb3V0cHV0IGJ1dCBmb3IgdGhpcyBhc3NlbWJsZXIKKy8vCWltcGxlbWVudGF0aW9uOi0pCisvLworLy8JICAgICAgICAgICAgICAgICAgc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zCisvLwlyc2EgIDUxMiBiaXRzICAgMC4wMDIxcyAgIDAuMDAwMXMgICAgNTQ5LjQgICA5NjM4LjUKKy8vCXJzYSAxMDI0IGJpdHMgICAwLjAwNTVzICAgMC4wMDAycyAgICAxODMuOCAgIDQ0ODEuMQorLy8JcnNhIDIwNDggYml0cyAgIDAuMDI0NHMgICAwLjAwMDZzICAgICA0MS40ICAgMTcyNi4zCisvLwlyc2EgNDA5NiBiaXRzICAgMC4xMjk1cyAgIDAuMDAxOHMgICAgICA3LjcgICAgNTYxLjUKKy8vCSAgICAgICAgICAgICAgICAgIHNpZ24gICAgdmVyaWZ5ICAgIHNpZ24vcyB2ZXJpZnkvcworLy8JZHNhICA1MTIgYml0cyAgIDAuMDAxMnMgICAwLjAwMTNzICAgIDg5MS45ICAgIDc1Ni42CisvLwlkc2EgMTAyNCBiaXRzICAgMC4wMDIzcyAgIDAuMDAyOHMgICAgNDQwLjQgICAgMzc2LjIKKy8vCQorLy8JWWVzLCB5b3UgbWF5IGFyZ3VlIHRoYXQgaXQncyBub3QgZmFpciBjb21wYXJpc29uIGFzIGl0J3MKKy8vCXBvc3NpYmxlIHRvIGNyYWZ0IHRoZSBDIGltcGxlbWVudGF0aW9uIHdpdGggQk5fVU1VTFRfSElHSAorLy8JaW5saW5lIGFzc2VtYmxlciBtYWNyby4gQnV0IG9mIGNvdXJzZSEgSGVyZSBpcyB0aGUgb3V0cHV0CisvLwl3aXRoIHRoZSBtYWNybzoKKy8vCisvLwkgICAgICAgICAgICAgICAgICBzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3MKKy8vCXJzYSAgNTEyIGJpdHMgICAwLjAwMjBzICAgMC4wMDAycyAgICA0OTUuMCAgIDY1NjEuMAorLy8JcnNhIDEwMjQgYml0cyAgIDAuMDA4NnMgICAwLjAwMDRzICAgIDExNi4yICAgMjIzNS43CisvLwlyc2EgMjA0OCBiaXRzICAgMC4wNTE5cyAgIDAuMDAxNXMgICAgIDE5LjMgICAgNjY3LjMKKy8vCXJzYSA0MDk2IGJpdHMgICAwLjM0NjRzICAgMC4wMDUzcyAgICAgIDIuOSAgICAxODcuNworLy8JICAgICAgICAgICAgICAgICAgc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zCisvLwlkc2EgIDUxMiBiaXRzICAgMC4wMDE2cyAgIDAuMDAyMHMgICAgNjEzLjEgICAgNTEwLjUKKy8vCWRzYSAxMDI0IGJpdHMgICAwLjAwNDVzICAgMC4wMDU0cyAgICAyMjEuMCAgICAxODMuOQorLy8KKy8vCU15IGNvZGUgaXMgc3RpbGwgd2F5IGZhc3RlciwgaHVoOi0pIEFuZCBJIGJlbGlldmUgdGhhdCBldmVuCisvLwloaWdoZXIgcGVyZm9ybWFuY2UgY2FuIGJlIGFjaGlldmVkLiBOb3RlIHRoYXQgYXMga2V5cyBnZXQKKy8vCWxvbmdlciwgcGVyZm9ybWFuY2UgZ2FpbiBpcyBsYXJnZXIuIFdoeT8gQWNjb3JkaW5nIHRvIHRoZQorLy8JcHJvZmlsZXIgdGhlcmUgaXMgYW5vdGhlciBwbGF5ZXIgaW4gdGhlIGZpZWxkLCBuYW1lbHkKKy8vCUJOX2Zyb21fbW9udGdvbWVyeSBjb25zdW1pbmcgbGFyZ2VyIGFuZCBsYXJnZXIgcG9ydGlvbiBvZiBDUFUKKy8vCXRpbWUgYXMga2V5c2l6ZSBkZWNyZWFzZXMuIEkgdGhlcmVmb3JlIGNvbnNpZGVyIHB1dHRpbmcgZWZmb3J0CisvLwl0byBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZvbGxvd2luZyByb3V0aW5lOgorLy8KKy8vCXZvaWQgYm5fbXVsX2FkZF9tb250IChCTl9VTE9ORyAqcnAsQk5fVUxPTkcgKm5wLGludCBubCxCTl9VTE9ORyBuMCkKKy8vCXsKKy8vCWludCAgICAgIGksajsKKy8vCUJOX1VMT05HIHY7CisvLworLy8JZm9yIChpPTA7IGk8bmw7IGkrKykKKy8vCQl7CisvLwkJdj1ibl9tdWxfYWRkX3dvcmRzKHJwLG5wLG5sLChycFswXSpuMCkmQk5fTUFTSzIpOworLy8JCW5ycCsrOworLy8JCXJwKys7CisvLwkJaWYgKCgobnJwWy0xXSs9dikmQk5fTUFTSzIpIDwgdikKKy8vCQkJZm9yIChqPTA7ICgoKytucnBbal0pJkJOX01BU0syKSA9PSAwOyBqKyspIDsKKy8vCQl9CisvLwl9CisvLworLy8JSXQgbWlnaHQgYXMgd2VsbCBiZSBiZW5lZmljaWFsIHRvIGltcGxlbWVudCBldmVuIGNvbWJhWAorLy8JdmFyaWFudHMsIGFzIGl0IGFwcGVhcnMgYXMgaXQgY2FuIGxpdGVyYWxseSB1bmxlYXNoIHRoZQorLy8JcGVyZm9ybWFuY2UgKHNlZSBjb21tZW50IHNlY3Rpb24gdG8gYm5fbXVsX2NvbWJhOCBiZWxvdykuCisvLworLy8JQW5kIGZpbmFsbHkgZm9yIHlvdXIgcmVmZXJlbmNlIHRoZSBvdXRwdXQgZm9yIDAuOS42YSBjb21waWxlZAorLy8Jd2l0aCBTR0ljYyB2ZXJzaW9uIDAuMDEuMC0xMiAoa2VlcCBpbiBtaW5kIHRoYXQgZm9yIHRoZSBtb21lbnQKKy8vCW9mIHRoaXMgd3JpdGluZyBpdCdzIG5vdCBwb3NzaWJsZSB0byBjb252aW5jZSBTR0ljYyB0byB1c2UKKy8vCUJOX1VNVUxUX0hJR0ggaW5saW5lIGFzc2VtYmxlciBtYWNybywgeWV0IHRoZSBjb2RlIGlzIGZhc3QsCisvLwlpLmUuIGZvciBhIGNvbXBpbGVyIGdlbmVyYXRlZCBvbmU6LSk6CisvLworLy8JICAgICAgICAgICAgICAgICAgc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zCisvLwlyc2EgIDUxMiBiaXRzICAgMC4wMDIycyAgIDAuMDAwMnMgICAgNDUyLjcgICA1ODk0LjMKKy8vCXJzYSAxMDI0IGJpdHMgICAwLjAwOTdzICAgMC4wMDA1cyAgICAxMDIuNyAgIDIwMDIuOQorLy8JcnNhIDIwNDggYml0cyAgIDAuMDU3OHMgICAwLjAwMTdzICAgICAxNy4zICAgIDYwMC4yCisvLwlyc2EgNDA5NiBiaXRzICAgMC4zODM4cyAgIDAuMDA2MXMgICAgICAyLjYgICAgMTY0LjUKKy8vCSAgICAgICAgICAgICAgICAgIHNpZ24gICAgdmVyaWZ5ICAgIHNpZ24vcyB2ZXJpZnkvcworLy8JZHNhICA1MTIgYml0cyAgIDAuMDAxOHMgICAwLjAwMjJzICAgIDU0Ny4zICAgIDQ1OS42CisvLwlkc2EgMTAyNCBiaXRzICAgMC4wMDUxcyAgIDAuMDA2MnMgICAgMTk2LjYgICAgMTYxLjMKKy8vCisvLwlPaCEgQmVuY2htYXJrcyB3ZXJlIHBlcmZvcm1lZCBvbiA3MzNNSHogTGlvbi1jbGFzcyBJdGFuaXVtCisvLwlzeXN0ZW0gcnVubmluZyBSZWRoYXQgTGludXggNy4xICh2ZXJ5IHNwZWNpYWwgdGhhbmtzIHRvIFJheQorLy8JTWNDYWZmaXR5IG9mIFdpbGxpYW1zIENvbW11bmljYXRpb25zIGZvciBwcm92aWRpbmcgYW4gYWNjb3VudCkuCisvLworLy8gUS4JV2hhdCdzIHRoZSBoZWNrIHdpdGggJ3J1bSAxPDw1JyBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGZ1bmN0aW9uPworLy8gQS4JV2VsbCwgYnkgY2xlYXJpbmcgdGhlICJ1cHBlciBGUCByZWdpc3RlcnMgd3JpdHRlbiIgYml0IG9mIHRoZQorLy8JVXNlciBNYXNrIEkgd2FudCB0byBleGN1c2UgdGhlIGtlcm5lbCBmcm9tIHByZXNlcnZpbmcgdXBwZXIKKy8vCShmMzItZjEyOCkgRlAgcmVnaXN0ZXIgYmFuayBvdmVyIHByb2Nlc3MgY29udGV4dCBzd2l0Y2gsIHRodXMKKy8vCW1pbmltaXppbmcgYnVzIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBkdXJpbmcgdGhlIHN3aXRjaCAoaS5lLgorLy8JYWZ0ZXIgUEtJIG9wcmF0aW9uIGNvbXBsZXRlcyBhbmQgdGhlIHByb2dyYW0gaXMgb2ZmIGRvaW5nCisvLwlzb21ldGhpbmcgZWxzZSBsaWtlIGJ1bGsgc3ltbWV0cmljIGVuY3J5cHRpb24pLiBIYXZpbmcgc2FpZAorLy8JdGhpcywgSSBhbHNvIHdhbnQgdG8gcG9pbnQgb3V0IHRoYXQgaXQgbWlnaHQgYmUgZ29vZCBpZGVhCisvLwl0byBjb21waWxlIHRoZSB3aG9sZSB0b29sa2l0IChhcyB3ZWxsIGFzIG1ham9yaXR5IG9mIHRoZQorLy8JcHJvZ3JhbXMgZm9yIHRoYXQgbWF0dGVyKSB3aXRoIC1tZml4ZWQtcmFuZ2U9ZjMyLWYxMjcgY29tbWFuZAorLy8JbGluZSBvcHRpb24uIE5vLCBpdCBkb2Vzbid0IHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gd3JpdGluZworLy8JdG8gdXBwZXIgYmFuaywgYnV0IGF0IGxlYXN0IGRpc2NvdXJhZ2VzIHRvIGRvIHNvLiBJZiB5b3UgZG9uJ3QKKy8vCWxpa2UgdGhlIGlkZWEgeW91IGhhdmUgdGhlIG9wdGlvbiB0byBjb21waWxlIHRoZSBtb2R1bGUgd2l0aAorLy8JLURydW09bm9wLm0gaW4gY29tbWFuZCBsaW5lLgorLy8KKworI2lmIGRlZmluZWQoX0hQVVhfU09VUkNFKSAmJiAhZGVmaW5lZChfTFA2NCkKKyNkZWZpbmUJQUREUAlhZGRwNAorI2Vsc2UKKyNkZWZpbmUJQUREUAlhZGQKKyNlbmRpZgorCisjaWYgMQorLy8KKy8vIGJuX1thZGR8c3ViXV93b3JkcyByb3V0aW5lcy4KKy8vCisvLyBMb29wcyBhcmUgc3Bpbm5pbmcgaW4gMioobis1KSB0aWNrcyBvbiBJdGFudWltIChwcm92aWRlZCB0aGF0IHRoZQorLy8gZGF0YSByZXNpZGUgaW4gTDEgY2FjaGUsIGkuZS4gMiB0aWNrcyBhd2F5KS4gSXQncyBwb3NzaWJsZSB0bworLy8gY29tcHJlc3MgdGhlIGVwaWxvZ3VlIGFuZCBnZXQgZG93biB0byAyKm4rNiwgYnV0IGF0IHRoZSBjb3N0IG9mCisvLyBzY2FsYWJpbGl0eSAodGhlIG5lYXQgZmVhdHVyZSBvZiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIHRoYXQgaXQKKy8vIHNoYWxsIGF1dG9tYWdpY2FsbHkgc3BpbiBpbiBuKzUgb24gIndpZGVyIiBJQS02NCBpbXBsZW1lbnRhdGlvbnM6LSkKKy8vIEkgY29uc2lkZXIgdGhhdCB0aGUgZXBpbG9ndWUgaXMgc2hvcnQgZW5vdWdoIGFzIGl0IGlzIHRvIHRyYWRlIHRpbnkKKy8vIHBlcmZvcm1hbmNlIGxvc3Mgb24gSXRhbml1bSBmb3Igc2NhbGFiaWxpdHkuCisvLworLy8gQk5fVUxPTkcgYm5fYWRkX3dvcmRzKEJOX1VMT05HICpycCwgQk5fVUxPTkcgKmFwLCBCTl9VTE9ORyAqYnAsaW50IG51bSkKKy8vCisuZ2xvYmFsCWJuX2FkZF93b3JkcyMKKy5wcm9jCWJuX2FkZF93b3JkcyMKKy5hbGlnbgk2NAorLnNraXAJMzIJLy8gbWFrZXMgdGhlIGxvb3AgYm9keSBhbGlnbmVkIGF0IDY0LWJ5dGUgYm91bmRhcnkKK2JuX2FkZF93b3JkczoKKwkucHJvbG9ndWUKKwkuc2F2ZQlhci5wZnMscjIKK3sgLm1paTsJYWxsb2MJCXIyPWFyLnBmcyw0LDEyLDAsMTYKKwljbXA0LmxlCQlwNixwMD1yMzUscjAJfTs7Cit7IC5tZmI7CW1vdgkJcjg9cjAJCQkvLyByZXR1cm4gdmFsdWUKKyhwNikJYnIucmV0LnNwbnQubWFueQliMAl9OzsKKworeyAubWliOwlzdWIJCXIxMD1yMzUscjAsMQorCS5zYXZlCWFyLmxjLHIzCisJbW92CQlyMz1hci5sYworCWJycC5sb29wLmltcAkuTF9ibl9hZGRfd29yZHNfY3RvcCwuTF9ibl9hZGRfd29yZHNfY2VuZC0xNgorCQkJCQl9Cit7IC5taWI7CUFERFAJCXIxND0wLHIzMgkJLy8gcnAKKwkuc2F2ZQlwcixyOQorCW1vdgkJcjk9cHIJCX07OworCS5ib2R5Cit7IC5taWk7CUFERFAJCXIxNT0wLHIzMwkJLy8gYXAKKwltb3YJCWFyLmxjPXIxMAorCW1vdgkJYXIuZWM9NgkJfQoreyAubWliOwlBRERQCQlyMTY9MCxyMzQJCS8vIGJwCisJbW92CQlwci5yb3Q9MTw8MTYJfTs7CisKKy5MX2JuX2FkZF93b3Jkc19jdG9wOgoreyAubWlpOwkocDE2KQlsZDgJCXIzMj1bcjE2XSw4CSAgLy8gYj0qKGJwKyspCisJKHAxOCkJYWRkCQlyMzk9cjM3LHIzNAorCShwMTkpCWNtcC5sdHUudW5jCXA1NixwMD1yNDAscjM4CX0KK3sgLm1mYjsJKHAwKQlub3AubQkJMHgwCisJKHAwKQlub3AuZgkJMHgwCisJKHAwKQlub3AuYgkJMHgwCQl9Cit7IC5taWk7CShwMTYpCWxkOAkJcjM1PVtyMTVdLDgJICAvLyBhPSooYXArKykKKwkocDU4KQljbXAuZXEub3IJcDU3LHAwPS0xLHI0MQkgIC8vIChwMjApCisJKHA1OCkJYWRkCQlyNDE9MSxyNDEJfSAvLyAocDIwKQoreyAubWZiOwkocDIxKQlzdDgJCVtyMTRdPXI0Miw4CSAgLy8gKihycCsrKT1yCisJKHAwKQlub3AuZgkJMHgwCisJYnIuY3RvcC5zcHRrCS5MX2JuX2FkZF93b3Jkc19jdG9wCX07OworLkxfYm5fYWRkX3dvcmRzX2NlbmQ6CisKK3sgLm1paTsKKyhwNTkpCWFkZAkJcjg9MSxyOAkJLy8gcmV0dXJuIHZhbHVlCisJbW92CQlwcj1yOSwweDFmZmZmCisJbW92CQlhci5sYz1yMwl9Cit7IC5tYmI7CW5vcC5iCQkweDAKKwlici5yZXQuc3B0ay5tYW55CWIwCX07OworLmVuZHAJYm5fYWRkX3dvcmRzIworCisvLworLy8gQk5fVUxPTkcgYm5fc3ViX3dvcmRzKEJOX1VMT05HICpycCwgQk5fVUxPTkcgKmFwLCBCTl9VTE9ORyAqYnAsaW50IG51bSkKKy8vCisuZ2xvYmFsCWJuX3N1Yl93b3JkcyMKKy5wcm9jCWJuX3N1Yl93b3JkcyMKKy5hbGlnbgk2NAorLnNraXAJMzIJLy8gbWFrZXMgdGhlIGxvb3AgYm9keSBhbGlnbmVkIGF0IDY0LWJ5dGUgYm91bmRhcnkKK2JuX3N1Yl93b3JkczoKKwkucHJvbG9ndWUKKwkuc2F2ZQlhci5wZnMscjIKK3sgLm1paTsJYWxsb2MJCXIyPWFyLnBmcyw0LDEyLDAsMTYKKwljbXA0LmxlCQlwNixwMD1yMzUscjAJfTs7Cit7IC5tZmI7CW1vdgkJcjg9cjAJCQkvLyByZXR1cm4gdmFsdWUKKyhwNikJYnIucmV0LnNwbnQubWFueQliMAl9OzsKKworeyAubWliOwlzdWIJCXIxMD1yMzUscjAsMQorCS5zYXZlCWFyLmxjLHIzCisJbW92CQlyMz1hci5sYworCWJycC5sb29wLmltcAkuTF9ibl9zdWJfd29yZHNfY3RvcCwuTF9ibl9zdWJfd29yZHNfY2VuZC0xNgorCQkJCQl9Cit7IC5taWI7CUFERFAJCXIxND0wLHIzMgkJLy8gcnAKKwkuc2F2ZQlwcixyOQorCW1vdgkJcjk9cHIJCX07OworCS5ib2R5Cit7IC5taWk7CUFERFAJCXIxNT0wLHIzMwkJLy8gYXAKKwltb3YJCWFyLmxjPXIxMAorCW1vdgkJYXIuZWM9NgkJfQoreyAubWliOwlBRERQCQlyMTY9MCxyMzQJCS8vIGJwCisJbW92CQlwci5yb3Q9MTw8MTYJfTs7CisKKy5MX2JuX3N1Yl93b3Jkc19jdG9wOgoreyAubWlpOwkocDE2KQlsZDgJCXIzMj1bcjE2XSw4CSAgLy8gYj0qKGJwKyspCisJKHAxOCkJc3ViCQlyMzk9cjM3LHIzNAorCShwMTkpCWNtcC5ndHUudW5jCXA1NixwMD1yNDAscjM4CX0KK3sgLm1mYjsJKHAwKQlub3AubQkJMHgwCisJKHAwKQlub3AuZgkJMHgwCisJKHAwKQlub3AuYgkJMHgwCQl9Cit7IC5taWk7CShwMTYpCWxkOAkJcjM1PVtyMTVdLDgJICAvLyBhPSooYXArKykKKwkocDU4KQljbXAuZXEub3IJcDU3LHAwPTAscjQxCSAgLy8gKHAyMCkKKwkocDU4KQlhZGQJCXI0MT0tMSxyNDEJfSAvLyAocDIwKQoreyAubWJiOwkocDIxKQlzdDgJCVtyMTRdPXI0Miw4CSAgLy8gKihycCsrKT1yCisJKHAwKQlub3AuYgkJMHgwCisJYnIuY3RvcC5zcHRrCS5MX2JuX3N1Yl93b3Jkc19jdG9wCX07OworLkxfYm5fc3ViX3dvcmRzX2NlbmQ6CisKK3sgLm1paTsKKyhwNTkpCWFkZAkJcjg9MSxyOAkJLy8gcmV0dXJuIHZhbHVlCisJbW92CQlwcj1yOSwweDFmZmZmCisJbW92CQlhci5sYz1yMwl9Cit7IC5tYmI7CW5vcC5iCQkweDAKKwlici5yZXQuc3B0ay5tYW55CWIwCX07OworLmVuZHAJYm5fc3ViX3dvcmRzIworI2VuZGlmCisKKyNpZiAwCisjZGVmaW5lIFhNQV9URU1QVEFUSU9OCisjZW5kaWYKKworI2lmIDEKKy8vCisvLyBCTl9VTE9ORyBibl9tdWxfd29yZHMoQk5fVUxPTkcgKnJwLCBCTl9VTE9ORyAqYXAsIGludCBudW0sIEJOX1VMT05HIHcpCisvLworLmdsb2JhbAlibl9tdWxfd29yZHMjCisucHJvYwlibl9tdWxfd29yZHMjCisuYWxpZ24JNjQKKy5za2lwCTMyCS8vIG1ha2VzIHRoZSBsb29wIGJvZHkgYWxpZ25lZCBhdCA2NC1ieXRlIGJvdW5kYXJ5Citibl9tdWxfd29yZHM6CisJLnByb2xvZ3VlCisJLnNhdmUJYXIucGZzLHIyCisjaWZkZWYgWE1BX1RFTVBUQVRJT04KK3sgLm1maTsJYWxsb2MJCXIyPWFyLnBmcyw0LDAsMCwwCX07OworI2Vsc2UKK3sgLm1maTsJYWxsb2MJCXIyPWFyLnBmcyw0LDEyLDAsMTYJfTs7CisjZW5kaWYKK3sgLm1pYjsJbW92CQlyOD1yMAkJCS8vIHJldHVybiB2YWx1ZQorCWNtcDQubGUJCXA2LHAwPXIzNCxyMAorKHA2KQlici5yZXQuc3BudC5tYW55CWIwCQl9OzsKKworeyAubWlpOwlzdWIJcjEwPXIzNCxyMCwxCisJLnNhdmUJYXIubGMscjMKKwltb3YJcjM9YXIubGMKKwkuc2F2ZQlwcixyOQorCW1vdglyOT1wcgkJCX07OworCisJLmJvZHkKK3sgLm1pYjsJc2V0Zi5zaWcJZjg9cjM1CS8vIHcKKwltb3YJCXByLnJvdD0weDgwMDAwMTw8MTYKKwkJCS8vIC0tLS0tLV4tLS0tLSBzZXJ2ZXMgYXMgKHA1MCkgYXQgZmlyc3QgKHAyNykKKwlicnAubG9vcC5pbXAJLkxfYm5fbXVsX3dvcmRzX2N0b3AsLkxfYm5fbXVsX3dvcmRzX2NlbmQtMTYKKwkJCQkJfQorCisjaWZuZGVmIFhNQV9URU1QVEFUSU9OCisKK3sgLm1taTsJQUREUAkJcjE0PTAscjMyCS8vIHJwCisJQUREUAkJcjE1PTAscjMzCS8vIGFwCisJbW92CQlhci5sYz1yMTAJfQoreyAubW1pOwltb3YJCXI0MD0wCQkvLyBzZXJ2ZXMgYXMgcjM1IGF0IGZpcnN0IChwMjcpCisJbW92CQlhci5lYz0xMwl9OzsKKworLy8gVGhpcyBsb29wIHNwaW5zIGluIDIqKG4rMTIpIHRpY2tzLiBJdCdzIHNjaGVkdWxlZCBmb3IgZGF0YSBpbiBJdGFuaXVtCisvLyBMMiBjYWNoZSAoaS5lLiA5IHRpY2tzIGF3YXkpIGFzIGZsb2F0aW5nIHBvaW50IGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zCisvLyBieXBhc3MgTDEgY2FjaGUgYW5kIEwyIGxhdGVuY3kgaXMgYWN0dWFsbHkgYmVzdC1jYXNlIHNjZW5hcmlvIGZvcgorLy8gbGRmOC4gVGhlIGxvb3AgaXMgbm90IHNjYWxhYmxlIGFuZCBzaGFsbCBydW4gaW4gMioobisxMikgZXZlbiBvbgorLy8gIndpZGVyIiBJQS02NCBpbXBsZW1lbnRhdGlvbnMuIEl0J3MgYSB0cmFkZS1vZmYgaGVyZS4gbisyNCBsb29wCisvLyB3b3VsZCBnaXZlIHVzIH41JSBpbiAqb3ZlcmFsbCogcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb24gIndpZGVyIgorLy8gSUEtNjQsIGJ1dCB3b3VsZCBodXJ0IEl0YW5pdW0gZm9yIGFib3V0IHNhbWUgYmVjYXVzZSBvZiBsb25nZXIKKy8vIGVwaWxvZ3VlLiBBcyBpdCdzIGEgbWF0dGVyIG9mIGZldyBwZXJjZW50cyBpbiBlaXRoZXIgY2FzZSBJJ3ZlCisvLyBjaG9zZW4gdG8gdHJhZGUgdGhlIHNjYWxhYmlsaXR5IGZvciBkZXZlbG9wbWVudCB0aW1lICh5b3UgY2FuIHNlZQorLy8gdGhpcyB2ZXJ5IGluc3RydWN0aW9uIHNlcXVlbmNlIGluIGJuX211bF9hZGRfd29yZHMgbG9vcCB3aGljaCBpbgorLy8gdHVybiBpcyBzY2FsYWJsZSkuCisuTF9ibl9tdWxfd29yZHNfY3RvcDoKK3sgLm1maTsJKHAyNSkJZ2V0Zi5zaWcJcjM2PWY1MgkJCS8vIGxvdworCShwMjEpCXhtcHkubHUJCWY0OD1mMzcsZjgKKwkocDI4KQljbXAubHR1CQlwNTQscDUwPXI0MSxyMzkJfQoreyAubWZpOwkocDE2KQlsZGY4CQlmMzI9W3IxNV0sOAorCShwMjEpCXhtcHkuaHUJCWY0MD1mMzcsZjgKKwkocDApCW5vcC5pCQkweDAJCX07OworeyAubWlpOwkocDI1KQlnZXRmLnNpZwlyMzI9ZjQ0CQkJLy8gaGlnaAorCS5wcmVkLnJlbAkibXV0ZXgiLHA1MCxwNTQKKwkocDUwKQlhZGQJCXI0MD1yMzgscjM1CQkvLyAocDI3KQorCShwNTQpCWFkZAkJcjQwPXIzOCxyMzUsMQl9CS8vIChwMjcpCit7IC5tZmI7CShwMjgpCXN0OAkJW3IxNF09cjQxLDgKKwkocDApCW5vcC5mCQkweDAKKwlici5jdG9wLnNwdGsJLkxfYm5fbXVsX3dvcmRzX2N0b3AJfTs7CisuTF9ibl9tdWxfd29yZHNfY2VuZDoKKworeyAubWlpOwlub3AubQkJMHgwCisucHJlZC5yZWwJIm11dGV4IixwNTEscDU1CisocDUxKQlhZGQJCXI4PXIzNixyMAorKHA1NSkJYWRkCQlyOD1yMzYscjAsMQl9Cit7IC5tZmI7CW5vcC5tCTB4MAorCW5vcC5mCTB4MAorCW5vcC5iCTB4MAkJCX0KKworI2Vsc2UJLy8gWE1BX1RFTVBUQVRJT04KKworCXNldGYuc2lnCWYzNz1yMAkvLyBzZXJ2ZXMgYXMgY2FycnkgYXQgKHAxOCkgdGljaworCW1vdgkJYXIubGM9cjEwCisJbW92CQlhci5lYz01OzsKKworLy8gTW9zdCBvZiB5b3UgZXhhbWluaW5nIHRoaXMgY29kZSB2ZXJ5IGxpa2VseSB3b25kZXIgd2h5IGluIHRoZSBuYW1lCisvLyBvZiBJbnRlbCB0aGUgZm9sbG93aW5nIGxvb3AgaXMgY29tbWVudGVkIG91dD8gSW5kZWVkLCBpdCBsb29rcyBzbworLy8gbmVhdCB0aGF0IHlvdSBmaW5kIGl0IGhhcmQgdG8gYmVsaWV2ZSB0aGF0IGl0J3Mgc29tZXRoaW5nIHdyb25nCisvLyB3aXRoIGl0LCByaWdodD8gVGhlIGNhdGNoIGlzIHRoYXQgZXZlcnkgaXRlcmF0aW9uIGRlcGVuZHMgb24gdGhlCisvLyByZXN1bHQgZnJvbSBwcmV2aW91cyBvbmUgYW5kIHRoZSBsYXR0ZXIgaXNuJ3QgYXZhaWxhYmxlIGluc3RhbnRseS4KKy8vIFRoZSBsb29wIHRoZXJlZm9yZSBzcGlucyBhdCB0aGUgbGF0ZW5jeSBvZiB4bWEgbWludXMgMSwgb3IgaW4gb3RoZXIKKy8vIHdvcmRzIGF0IDYqKG4rNCkgdGlja3M6LSggQ29tcGFyZSB0byB0aGUgInByb2R1Y3Rpb24iIGxvb3AgYWJvdmUKKy8vIHRoYXQgcnVucyBpbiAyKihuKzExKSB3aGVyZSB0aGUgbG93IGxhdGVuY3kgcHJvYmxlbSBpcyB3b3JrZWQgYXJvdW5kCisvLyBieSBtb3ZpbmcgdGhlIGRlcGVuZGVuY3kgdG8gb25lLXRpY2sgbGF0ZW50IGludGVyZ2VyIEFMVS4gTm90ZSB0aGF0CisvLyAiZGlzdGFuY2UiIGJldHdlZW4gbGRmOCBhbmQgeG1hIGlzIG5vdCBsYXRlbmN5IG9mIGxkZjgsIGJ1dCB0aGUKKy8vICpkaWZmZXJlbmNlKiBiZXR3ZWVuIHhtYSBhbmQgbGRmOCBsYXRlbmNpZXMuCisuTF9ibl9tdWxfd29yZHNfY3RvcDoKK3sgLm1maTsJKHAxNikJbGRmOAkJZjMyPVtyMzNdLDgKKwkocDE4KQl4bWEuaHUJCWYzOD1mMzQsZjgsZjM5CX0KK3sgLm1mYjsJKHAyMCkJc3RmOAkJW3IzMl09ZjM3LDgKKwkocDE4KQl4bWEubHUJCWYzNT1mMzQsZjgsZjM5CisJYnIuY3RvcC5zcHRrCS5MX2JuX211bF93b3Jkc19jdG9wCX07OworLkxfYm5fbXVsX3dvcmRzX2NlbmQ6CisKKwlnZXRmLnNpZwlyOD1mNDEJCS8vIHRoZSByZXR1cm4gdmFsdWUKKworI2VuZGlmCS8vIFhNQV9URU1QVEFUSU9OCisKK3sgLm1paTsJbm9wLm0JCTB4MAorCW1vdgkJcHI9cjksMHgxZmZmZgorCW1vdgkJYXIubGM9cjMJfQoreyAubWZiOwlydW0JCTE8PDUJCS8vIGNsZWFyIHVtLm1maAorCW5vcC5mCQkweDAKKwlici5yZXQuc3B0ay5tYW55CWIwCX07OworLmVuZHAJYm5fbXVsX3dvcmRzIworI2VuZGlmCisKKyNpZiAxCisvLworLy8gQk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdykKKy8vCisuZ2xvYmFsCWJuX211bF9hZGRfd29yZHMjCisucHJvYwlibl9tdWxfYWRkX3dvcmRzIworLmFsaWduCTY0Cisuc2tpcAk0OAkvLyBtYWtlcyB0aGUgbG9vcCBib2R5IGFsaWduZWQgYXQgNjQtYnl0ZSBib3VuZGFyeQorYm5fbXVsX2FkZF93b3JkczoKKwkucHJvbG9ndWUKKwkuc2F2ZQlhci5wZnMscjIKK3sgLm1taTsJYWxsb2MJCXIyPWFyLnBmcyw0LDQsMCw4CisJY21wNC5sZQkJcDYscDA9cjM0LHIwCisJLnNhdmUJYXIubGMscjMKKwltb3YJCXIzPWFyLmxjCX07OworeyAubWliOwltb3YJCXI4PXIwCQkvLyByZXR1cm4gdmFsdWUKKwlzdWIJCXIxMD1yMzQscjAsMQorKHA2KQlici5yZXQuc3BudC5tYW55CWIwCX07OworCit7IC5taWI7CXNldGYuc2lnCWY4PXIzNQkJLy8gdworCS5zYXZlCXByLHI5CisJbW92CQlyOT1wcgorCWJycC5sb29wLmltcAkuTF9ibl9tdWxfYWRkX3dvcmRzX2N0b3AsLkxfYm5fbXVsX2FkZF93b3Jkc19jZW5kLTE2CisJCQkJCX0KKwkuYm9keQoreyAubW1pOwlBRERQCQlyMTQ9MCxyMzIJLy8gcnAKKwlBRERQCQlyMTU9MCxyMzMJLy8gYXAKKwltb3YJCWFyLmxjPXIxMAl9Cit7IC5taWk7CUFERFAJCXIxNj0wLHIzMgkvLyBycCBjb3B5CisJbW92CQlwci5yb3Q9MHgyMDAxPDwxNgorCQkJLy8gLS0tLS0tXi0tLS0tIHNlcnZlcyBhcyAocDQwKSBhdCBmaXJzdCAocDI3KQorCW1vdgkJYXIuZWM9MTEJfTs7CisKKy8vIFRoaXMgbG9vcCBzcGlucyBpbiAzKihuKzEwKSB0aWNrcyBvbiBJdGFuaXVtIGFuZCBpbiAyKihuKzEwKSBvbgorLy8gSXRhbml1bSAyLiBZZXMsIHVubGlrZSBwcmV2aW91cyB2ZXJzaW9ucyBpdCBzY2FsZXM6LSkgUHJldmlvdXMKKy8vIHZlcnNpb24gd2FzIHBlZm9ybWluZyAqYWxsKiBhZGRpdGlvbnMgaW4gSUFMVSBhbmQgd2FzIHN0YXJ2aW5nCisvLyBmb3IgdGhvc2UgZXZlbiBvbiBJdGFuaXVtIDIuIEluIHRoaXMgdmVyc2lvbiBvbmUgYWRkaXRpb24gaXMKKy8vIG1vdmVkIHRvIEZQVSBhbmQgaXMgZm9sZGVkIHdpdGggbXVsdGlwbGljYXRpb24uIFRoaXMgaXMgYXQgY29zdAorLy8gb2YgcHJvcG9nYXRpbmcgdGhlIHJlc3VsdCBmcm9tIHByZXZpb3VzIGNhbGwgdG8gdGhpcyBzdWJyb3V0aW5lCisvLyB0byBMMiBjYWNoZS4uLiBJbiBvdGhlciB3b3JkcyBuZWdsaWdpYmxlIGV2ZW4gZm9yIHNob3J0ZXIga2V5cy4KKy8vICpPdmVyYWxsKiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBbb3ZlciBwcmV2aW91cyB2ZXJzaW9uXSB2YXJpZXMKKy8vIGZyb20gMTEgdG8gMjIgcGVyY2VudCBkZXBlbmRpbmcgb24ga2V5IGxlbmd0aC4KKy5MX2JuX211bF9hZGRfd29yZHNfY3RvcDoKKy5wcmVkLnJlbAkibXV0ZXgiLHA0MCxwNDIKK3sgLm1maTsJKHAyMykJZ2V0Zi5zaWcJcjM2PWY0NQkJCS8vIGxvdworCShwMjApCXhtYS5sdQkJZjQyPWYzNixmOCxmNTAJCS8vIGxvdworCShwNDApCWFkZAkJcjM5PXIzOSxyMzUJfQkvLyAocDI3KQoreyAubWZpOwkocDE2KQlsZGY4CQlmMzI9W3IxNV0sOAkJLy8gKihhcCsrKQorCShwMjApCXhtYS5odQkJZjM2PWYzNixmOCxmNTAJCS8vIGhpZ2gKKwkocDQyKQlhZGQJCXIzOT1yMzkscjM1LDEJfTs7CS8vIChwMjcpCit7IC5tbWk7CShwMjQpCWdldGYuc2lnCXIzMj1mNDAJCQkvLyBoaWdoCisJKHAxNikJbGRmOAkJZjQ2PVtyMTZdLDgJCS8vICoocnAxKyspCisJKHA0MCkJY21wLmx0dQkJcDQxLHAzOT1yMzkscjM1CX0JLy8gKHAyNykKK3sgLm1pYjsJKHAyNikJc3Q4CQlbcjE0XT1yMzksOAkJLy8gKihycDIrKykKKwkocDQyKQljbXAubGV1CQlwNDEscDM5PXIzOSxyMzUJCS8vIChwMjcpCisJYnIuY3RvcC5zcHRrCS5MX2JuX211bF9hZGRfd29yZHNfY3RvcH07OworLkxfYm5fbXVsX2FkZF93b3Jkc19jZW5kOgorCit7IC5tbWk7CS5wcmVkLnJlbAkibXV0ZXgiLHA0MCxwNDIKKyhwNDApCWFkZAkJcjg9cjM1LHIwCisocDQyKQlhZGQJCXI4PXIzNSxyMCwxCisJbW92CQlwcj1yOSwweDFmZmZmCX0KK3sgLm1pYjsJcnVtCQkxPDw1CQkvLyBjbGVhciB1bS5tZmgKKwltb3YJCWFyLmxjPXIzCisJYnIucmV0LnNwdGsubWFueQliMAl9OzsKKy5lbmRwCWJuX211bF9hZGRfd29yZHMjCisjZW5kaWYKKworI2lmIDEKKy8vCisvLyB2b2lkIGJuX3Nxcl93b3JkcyhCTl9VTE9ORyAqcnAsIEJOX1VMT05HICphcCwgaW50IG51bSkKKy8vCisuZ2xvYmFsCWJuX3Nxcl93b3JkcyMKKy5wcm9jCWJuX3Nxcl93b3JkcyMKKy5hbGlnbgk2NAorLnNraXAJMzIJLy8gbWFrZXMgdGhlIGxvb3AgYm9keSBhbGlnbmVkIGF0IDY0LWJ5dGUgYm91bmRhcnkgCitibl9zcXJfd29yZHM6CisJLnByb2xvZ3VlCisJLnNhdmUJYXIucGZzLHIyCit7IC5taWk7CWFsbG9jCQlyMj1hci5wZnMsMywwLDAsMAorCXN4dDQJCXIzND1yMzQJCX07OworeyAubWlpOwljbXAubGUJCXA2LHAwPXIzNCxyMAorCW1vdgkJcjg9cjAJCX0JLy8gcmV0dXJuIHZhbHVlCit7IC5tZmI7CUFERFAJCXIzMj0wLHIzMgorCW5vcC5mCQkweDAKKyhwNikJYnIucmV0LnNwbnQubWFueQliMAl9OzsKKworeyAubWlpOwlzdWIJcjEwPXIzNCxyMCwxCisJLnNhdmUJYXIubGMscjMKKwltb3YJcjM9YXIubGMKKwkuc2F2ZQlwcixyOQorCW1vdglyOT1wcgkJCX07OworCisJLmJvZHkKK3sgLm1pYjsJQUREUAkJcjMzPTAscjMzCisJbW92CQlwci5yb3Q9MTw8MTYKKwlicnAubG9vcC5pbXAJLkxfYm5fc3FyX3dvcmRzX2N0b3AsLkxfYm5fc3FyX3dvcmRzX2NlbmQtMTYKKwkJCQkJfQoreyAubWlpOwlhZGQJCXIzND04LHIzMgorCW1vdgkJYXIubGM9cjEwCisJbW92CQlhci5lYz0xOAl9OzsKKworLy8gMioobisxNykgb24gSXRhbml1bSwgKG4rMTcpIG9uICJ3aWRlciIgSUEtNjQgaW1wbGVtZW50YXRpb25zLiBJdCdzCisvLyBwb3NzaWJsZSB0byBjb21wcmVzcyB0aGUgZXBpbG9ndWUgKEknbSBnZXR0aW5nIHRpcmVkIHRvIHdyaXRlIHRoaXMKKy8vIGNvbW1lbnQgb3ZlciBhbmQgb3ZlcikgYW5kIGdldCBkb3duIHRvIDIqbisxNiBhdCB0aGUgY29zdCBvZgorLy8gc2NhbGFiaWxpdHkuIFRoZSBkZWNpc2lvbiB3aWxsIHZlcnkgbGlrZWx5IGJlIHJlY29uc2lkZXJlZCBhZnRlciB0aGUKKy8vIGJlbmNobWFyayBwcm9ncmFtIGlzIHByb2ZpbGVkLiBJLmUuIGlmIHBlcmZvbWFuY2UgZ2FpbiBvbiBJdGFuaXVtCisvLyB3aWxsIGFwcGVhciBsYXJnZXIgdGhhbiBsb3NzIG9uICJ3aWRlciIgSUEtNjQsIHRoZW4gdGhlIGxvb3Agc2hvdWxkCisvLyBiZSBleHBsaWNpdGVseSBzcGxpdCBhbmQgdGhlIGVwaWxvZ3VlIGNvbXByZXNzZWQuCisuTF9ibl9zcXJfd29yZHNfY3RvcDoKK3sgLm1maTsJKHAxNikJbGRmOAkJZjMyPVtyMzNdLDgKKwkocDI1KQl4bXB5Lmx1CQlmNDI9ZjQxLGY0MQorCShwMCkJbm9wLmkJCTB4MAkJfQoreyAubWliOwkocDMzKQlzdGY4CQlbcjMyXT1mNTAsMTYKKwkocDApCW5vcC5pCQkweDAKKwkocDApCW5vcC5iCQkweDAJCX0KK3sgLm1maTsJKHAwKQlub3AubQkJMHgwCisJKHAyNSkJeG1weS5odQkJZjUyPWY0MSxmNDEKKwkocDApCW5vcC5pCQkweDAJCX0KK3sgLm1pYjsJKHAzMykJc3RmOAkJW3IzNF09ZjYwLDE2CisJKHAwKQlub3AuaQkJMHgwCisJYnIuY3RvcC5zcHRrCS5MX2JuX3Nxcl93b3Jkc19jdG9wCX07OworLkxfYm5fc3FyX3dvcmRzX2NlbmQ6CisKK3sgLm1paTsJbm9wLm0JCTB4MAorCW1vdgkJcHI9cjksMHgxZmZmZgorCW1vdgkJYXIubGM9cjMJfQoreyAubWZiOwlydW0JCTE8PDUJCS8vIGNsZWFyIHVtLm1maAorCW5vcC5mCQkweDAKKwlici5yZXQuc3B0ay5tYW55CWIwCX07OworLmVuZHAJYm5fc3FyX3dvcmRzIworI2VuZGlmCisKKyNpZiAxCisvLyBBcHBhcmVudGx5IHdlIHdpbiBub3RoaW5nIGJ5IGltcGxlbWVudGluZyBzcGVjaWFsIGJuX3Nxcl9jb21iYTguCisvLyBZZXMsIGl0IGlzIHBvc3NpYmxlIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG11bHRpcGxpY2F0aW9ucyBieQorLy8gYWxtb3N0IGZhY3RvciBvZiB0d28sIGJ1dCB0aGVuIHRoZSBhbW91bnQgb2YgYWRkaXRpb25zIHdvdWxkCisvLyBpbmNyZWFzZSBieSBmYWN0b3Igb2YgdHdvIChhcyB3ZSB3b3VsZCBoYXZlIHRvIHBlcmZvcm0gdGhvc2UKKy8vIG90aGVyd2lzZSBwZXJmb3JtZWQgYnkgeG1hIG91cnNlbHZlcykuIE5vcm1hbGx5IHdlIHdvdWxkIHRyYWRlCisvLyBhbnl3YXkgYXMgbXVsdGlwbGljYXRpb25zIGFyZSB3YXkgbW9yZSBleHBlbnNpdmUsIGJ1dCBub3QgdGhpcworLy8gdGltZS4uLiBNdWx0aXBsaWNhdGlvbiBrZXJuZWwgaXMgZnVsbHkgcGlwZWxpbmVkIGFuZCBhcyB3ZSBkcmFpbgorLy8gb25lIDEyOC1iaXQgbXVsdGlwbGljYXRpb24gcmVzdWx0IHBlciBjbG9jayBjeWNsZSBtdWx0aXBsaWNhdGlvbnMKKy8vIGFyZSBlZmZlY3RpdmVseSBhcyBpbmV4cGVuc2l2ZSBhcyBhZGRpdGlvbnMuIFNwZWNpYWwgaW1wbGVtZW50YXRpb24KKy8vIG1pZ2h0IGJlY29tZSBvZiBpbnRlcmVzdCBmb3IgIndpZGVyIiBJQS02NCBpbXBsZW1lbnRhdGlvbiBhcyB5b3UnbGwKKy8vIGJlIGFibGUgdG8gZ2V0IHRocm91Z2ggdGhlIG11bHRpcGxpY2F0aW9uIHBoYXNlIGZhc3RlciAodGhlcmUgd29uJ3QKKy8vIGJlIGFueSBzdGFsbCBpc3N1ZXMgYXMgZGlzY3Vzc2VkIGluIHRoZSBjb21tZW50YXJ5IHNlY3Rpb24gYmVsb3cgYW5kCisvLyB5b3UgdGhlcmVmb3JlIHdpbGwgYmUgYWJsZSB0byBlbXBsb3kgYWxsIDQgRlAgdW5pdHMpLi4uIEJ1dCB0aGVzZQorLy8gSXRhbml1bSBkYXlzIGl0J3Mgc2ltcGx5IHRvbyBoYXJkIHRvIGp1c3RpZnkgdGhlIGVmZm9ydCBzbyBJIGp1c3QKKy8vIGRyb3AgZG93biB0byBibl9tdWxfY29tYmE4IGNvZGU6LSkKKy8vCisvLyB2b2lkIGJuX3Nxcl9jb21iYTgoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphKQorLy8KKy5nbG9iYWwJYm5fc3FyX2NvbWJhOCMKKy5wcm9jCWJuX3Nxcl9jb21iYTgjCisuYWxpZ24JNjQKK2JuX3Nxcl9jb21iYTg6CisJLnByb2xvZ3VlCisJLnNhdmUJYXIucGZzLHIyCisjaWYgZGVmaW5lZChfSFBVWF9TT1VSQ0UpICYmICFkZWZpbmVkKF9MUDY0KQoreyAubWlpOwlhbGxvYwlyMj1hci5wZnMsMiwxLDAsMAorCWFkZHA0CXIzMz0wLHIzMworCWFkZHA0CXIzMj0wLHIzMgkJfTs7Cit7IC5taWk7CisjZWxzZQoreyAubWlpOwlhbGxvYwlyMj1hci5wZnMsMiwxLDAsMAorI2VuZGlmCisJbW92CXIzND1yMzMKKwlhZGQJcjE0PTgscjMzCQl9OzsKKwkuYm9keQoreyAubWlpOwlhZGQJcjE3PTgscjM0CisJYWRkCXIxNT0xNixyMzMKKwlhZGQJcjE4PTE2LHIzNAkJfQoreyAubWZiOwlhZGQJcjE2PTI0LHIzMworCWJyCS5MX2NoZWF0X2VudHJ5X3BvaW50OAl9OzsKKy5lbmRwCWJuX3Nxcl9jb21iYTgjCisjZW5kaWYKKworI2lmIDEKKy8vIEkndmUgZXN0aW1hdGVkIHRoaXMgcm91dGluZSB0byBydW4gaW4gfjEyMCB0aWNrcywgYnV0IGluIHJlYWxpdHkKKy8vIChpLmUuIGFjY29yZGluZyB0byBhci5pdGMpIGl0IHRha2VzIH4xNjAgdGlja3MuIEFyZSB0aG9zZSBleHRyYQorLy8gY3ljbGVzIGNvbnN1bWVkIGZvciBpbnN0cnVjdGlvbnMgZmV0Y2g/IE9yIGRpZCBJIG1pc2ludGVycHJldCBzb21lCisvLyBjbGF1c2UgaW4gSXRhbml1bSC1LWFyY2hpdGVjdHVyZSBtYW51YWw/IENvbW1lbnRzIGFyZSB3ZWxjb21lZCBhbmQKKy8vIGhpZ2hseSBhcHByZWNpYXRlZC4KKy8vCisvLyBPbiBJdGFuaXVtIDIgaXQgdGFrZXMgfjE5MCB0aWNrcy4gVGhpcyBpcyBiZWNhdXNlIG9mIHN0YWxscyBvbgorLy8gcmVzdWx0IGZyb20gZ2V0Zi5zaWcuIEkgZG8gbm90aGluZyBhYm91dCBpdCBhdCB0aGlzIHBvaW50IGZvcgorLy8gcmVhc29ucyBkZXBpY3RlZCBiZWxvdy4KKy8vCisvLyBIb3dldmVyISBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBldmVuIDE2MCB0aWNrcyBpcyBkYXJuIGdvb2QgcmVzdWx0CisvLyBhcyBpdCdzIG92ZXIgMTAgKHllcywgdGVuLCBzcGVsbGVkIGFzIHQtZS1uKSB0aW1lcyBmYXN0ZXIgdGhhbiB0aGUKKy8vIEMgdmVyc2lvbiAoY29tcGlsZWQgd2l0aCBnY2Mgd2l0aCBpbmxpbmUgYXNzZW1ibGVyKS4gSSByZWFsbHkKKy8vIGtpY2tlZCBjb21waWxlcidzIGJ1dHQgaGVyZSwgZGlkbid0IEk/IFllYWghIFRoaXMgYnJpbmdzIHVzIHRvIHRoZQorLy8gZm9sbG93aW5nIHN0YXRlbWVudC4gSXQncyBkYW1uIHNoYW1lIHRoYXQgdGhpcyByb3V0aW5lIGlzbid0IGNhbGxlZAorLy8gdmVyeSBvZnRlbiBub3dhZGF5cyEgQWNjb3JkaW5nIHRvIHRoZSBwcm9maWxlciBtb3N0IENQVSB0aW1lIGlzCisvLyBjb25zdW1lZCBieSBibl9tdWxfYWRkX3dvcmRzIGNhbGxlZCBmcm9tIEJOX2Zyb21fbW9udGdvbWVyeS4gSW4KKy8vIG9yZGVyIHRvIGVzdGltYXRlIHdoYXQgd2UncmUgbWlzc2luZywgSSd2ZSBjb21wYXJlZCB0aGUgcGVyZm9ybWFuY2UKKy8vIG9mIHRoaXMgcm91dGluZSBhZ2FpbnN0ICJ0cmFkaXRpb25hbCIgaW1wbGVtZW50YXRpb24sIGkuZS4gYWdhaW5zdAorLy8gZm9sbG93aW5nIHJvdXRpbmU6CisvLworLy8gdm9pZCBibl9tdWxfY29tYmE4KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpCisvLyB7CXJbIDhdPWJuX211bF93b3JkcyggICAgJihyWzBdKSxhLDgsYlswXSk7CisvLwlyWyA5XT1ibl9tdWxfYWRkX3dvcmRzKCYoclsxXSksYSw4LGJbMV0pOworLy8JclsxMF09Ym5fbXVsX2FkZF93b3JkcygmKHJbMl0pLGEsOCxiWzJdKTsKKy8vCXJbMTFdPWJuX211bF9hZGRfd29yZHMoJihyWzNdKSxhLDgsYlszXSk7CisvLwlyWzEyXT1ibl9tdWxfYWRkX3dvcmRzKCYocls0XSksYSw4LGJbNF0pOworLy8JclsxM109Ym5fbXVsX2FkZF93b3JkcygmKHJbNV0pLGEsOCxiWzVdKTsKKy8vCXJbMTRdPWJuX211bF9hZGRfd29yZHMoJihyWzZdKSxhLDgsYls2XSk7CisvLwlyWzE1XT1ibl9tdWxfYWRkX3dvcmRzKCYocls3XSksYSw4LGJbN10pOworLy8gfQorLy8KKy8vIFRoZSBvbmUgYmVsb3cgaXMgb3ZlciA4IHRpbWVzIGZhc3RlciB0aGFuIHRoZSBvbmUgYWJvdmU6LSggRXZlbgorLy8gbW9yZSByZWFzb25zIHRvICJjb21iYWZ5IiBibl9tdWxfYWRkX21vbnQuLi4KKy8vCisvLyBBbmQgeWVzLCB0aGlzIHJvdXRpbmUgcmVhbGx5IG1hZGUgbWUgd2lzaCB0aGVyZSB3ZXJlIGFuIG9wdGltaXppbmcKKy8vIGFzc2VtYmxlciEgSXQgYWxzbyBmZWVscyBsaWtlIGl0IGRlc2VydmVzIGEgZGVkaWNhdGlvbi4KKy8vCisvLwlUbyBteSB3aWZlIGZvciBiZWluZyB0aGVyZSBhbmQgdG8gbXkga2lkcy4uLgorLy8KKy8vIHZvaWQgYm5fbXVsX2NvbWJhOChCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIEJOX1VMT05HICpiKQorLy8KKyNkZWZpbmUJY2FycnkxCXIxNAorI2RlZmluZQljYXJyeTIJcjE1CisjZGVmaW5lCWNhcnJ5MwlyMzQKKy5nbG9iYWwJYm5fbXVsX2NvbWJhOCMKKy5wcm9jCWJuX211bF9jb21iYTgjCisuYWxpZ24JNjQKK2JuX211bF9jb21iYTg6CisJLnByb2xvZ3VlCisJLnNhdmUJYXIucGZzLHIyCisjaWYgZGVmaW5lZChfSFBVWF9TT1VSQ0UpICYmICFkZWZpbmVkKF9MUDY0KQoreyAubWlpOwlhbGxvYwlyMj1hci5wZnMsMywwLDAsMAorCWFkZHA0CXIzMz0wLHIzMworCWFkZHA0CXIzND0wLHIzNAkJfTs7Cit7IC5taWk7CWFkZHA0CXIzMj0wLHIzMgorI2Vsc2UKK3sgLm1paTsJYWxsb2MgICByMj1hci5wZnMsMywwLDAsMAorI2VuZGlmCisJYWRkCXIxND04LHIzMworCWFkZAlyMTc9OCxyMzQJCX0KKwkuYm9keQoreyAubWlpOwlhZGQJcjE1PTE2LHIzMworCWFkZAlyMTg9MTYscjM0CisJYWRkCXIxNj0yNCxyMzMJCX0KKy5MX2NoZWF0X2VudHJ5X3BvaW50ODoKK3sgLm1taTsJYWRkCXIxOT0yNCxyMzQKKworCWxkZjgJZjMyPVtyMzNdLDMyCQl9OzsKKworeyAubW1pOwlsZGY4CWYxMjA9W3IzNF0sMzIKKwlsZGY4CWYxMjE9W3IxN10sMzIJCX0KK3sgLm1taTsJbGRmOAlmMTIyPVtyMThdLDMyCisJbGRmOAlmMTIzPVtyMTldLDMyCQl9OzsKK3sgLm1taTsJbGRmOAlmMTI0PVtyMzRdCisJbGRmOAlmMTI1PVtyMTddCQl9Cit7IC5tbWk7CWxkZjgJZjEyNj1bcjE4XQorCWxkZjgJZjEyNz1bcjE5XQkJfQorCit7IC5tbWk7CWxkZjgJZjMzPVtyMTRdLDMyCisJbGRmOAlmMzQ9W3IxNV0sMzIJCX0KK3sgLm1taTsJbGRmOAlmMzU9W3IxNl0sMzI7OworCWxkZjgJZjM2PVtyMzNdCQl9Cit7IC5tbWk7CWxkZjgJZjM3PVtyMTRdCisJbGRmOAlmMzg9W3IxNV0JCX0KK3sgLm1maTsJbGRmOAlmMzk9W3IxNl0KKy8vIC0tLS0tLS1cIEVudGVyaW5nIG11bHRpcGxpZXIncyBoZWF2ZW4gLy0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLVwgICAgICAgICAgICAgICAgICAgIC8tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tXCAgICAgICAgICAvLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkJeG1hLmh1CWY0MT1mMzIsZjEyMCxmMAkJfQoreyAubWZpOwkJeG1hLmx1CWY0MD1mMzIsZjEyMCxmMAkJfTs7IC8vICgqKQoreyAubWZpOwkJeG1hLmh1CWY1MT1mMzIsZjEyMSxmMAkJfQoreyAubWZpOwkJeG1hLmx1CWY1MD1mMzIsZjEyMSxmMAkJfTs7Cit7IC5tZmk7CQl4bWEuaHUJZjYxPWYzMixmMTIyLGYwCQl9Cit7IC5tZmk7CQl4bWEubHUJZjYwPWYzMixmMTIyLGYwCQl9OzsKK3sgLm1maTsJCXhtYS5odQlmNzE9ZjMyLGYxMjMsZjAJCX0KK3sgLm1maTsJCXhtYS5sdQlmNzA9ZjMyLGYxMjMsZjAJCX07OworeyAubWZpOwkJeG1hLmh1CWY4MT1mMzIsZjEyNCxmMAkJfQoreyAubWZpOwkJeG1hLmx1CWY4MD1mMzIsZjEyNCxmMAkJfTs7Cit7IC5tZmk7CQl4bWEuaHUJZjkxPWYzMixmMTI1LGYwCQl9Cit7IC5tZmk7CQl4bWEubHUJZjkwPWYzMixmMTI1LGYwCQl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTAxPWYzMixmMTI2LGYwCX0KK3sgLm1maTsJCXhtYS5sdQlmMTAwPWYzMixmMTI2LGYwCX07OworeyAubWZpOwkJeG1hLmh1CWYxMTE9ZjMyLGYxMjcsZjAJfQoreyAubWZpOwkJeG1hLmx1CWYxMTA9ZjMyLGYxMjcsZjAJfTs7Ly8KKy8vICgqKQlZb3UgY2FuIGFyZ3VlIHRoYXQgc3BsaXR0aW5nIGF0IGV2ZXJ5IHNlY29uZCBidW5kbGUgd291bGQKKy8vCXByZXZlbnQgIndpZGVyIiBJQS02NCBpbXBsZW1lbnRhdGlvbnMgZnJvbSBhY2hpZXZpbmcgdGhlIHBlYWsKKy8vCXBlcmZvcm1hbmNlLiBXZWxsLCBub3QgcmVhbGx5Li4uIFRoZSBjYXRjaCBpcyB0aGF0IGlmIHlvdQorLy8JaW50ZW5kIHRvIGtlZXAgNCBGUCB1bml0cyBidXN5IGJ5IHNwbGl0dGluZyBhdCBldmVyeSBmb3VydGgKKy8vCWJ1bmRsZSBhbmQgdGh1cyBwZXJmb3JtIHRoZXNlIDE2IG11bHRpcGxpY2F0aW9ucyBpbiA0IHRpY2tzLAorLy8JdGhlIGZpcnN0IGJ1bmRsZSAqYmVsb3cqIHdvdWxkIHN0YWxsIGJlY2F1c2UgdGhlIHJlc3VsdCBmcm9tCisvLwl0aGUgZmlyc3QgeG1hIGJ1bmRsZSAqYWJvdmUqIHdvbid0IGJlIGF2YWlsYWJsZSBmb3IgYW5vdGhlciAzCisvLwl0aWNrcyAoaWYgbm90IG1vcmUsIGJlaW5nIGFuIG9wdGltaXN0LCBJIGFzc3VtZSB0aGF0ICJ3aWRlciIKKy8vCWltcGxlbWVudGF0aW9uIHdpbGwgaGF2ZSBzYW1lIGxhdGVuY3k6LSkuIFRoaXMgc3RhbGwgd2lsbCBob2xkCisvLwl5b3UgYmFjayBhbmQgdGhlIHBlcmZvcm1hbmNlIHdvdWxkIGJlIGFzIGlmIGV2ZXJ5IHNlY29uZCBidW5kbGUKKy8vCXdlcmUgc3BsaXQgKmFueXdheSouLi4KK3sgLm1maTsJZ2V0Zi5zaWcJcjE2PWY0MAorCQl4bWEuaHUJZjQyPWYzMyxmMTIwLGY0MQorCWFkZAkJcjMzPTgscjMyCQl9Cit7IC5tZmk7CQl4bWEubHUJZjQxPWYzMyxmMTIwLGY0MQl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjI0PWY1MAorCQl4bWEuaHUJZjUyPWYzMyxmMTIxLGY1MQl9Cit7IC5tZmk7CQl4bWEubHUJZjUxPWYzMyxmMTIxLGY1MQl9OzsKK3sgLm1maTsJc3Q4CQlbcjMyXT1yMTYsMTYKKwkJeG1hLmh1CWY2Mj1mMzMsZjEyMixmNjEJfQoreyAubWZpOwkJeG1hLmx1CWY2MT1mMzMsZjEyMixmNjEJfTs7Cit7IC5tZmk7CQl4bWEuaHUJZjcyPWYzMyxmMTIzLGY3MQl9Cit7IC5tZmk7CQl4bWEubHUJZjcxPWYzMyxmMTIzLGY3MQl9OzsKK3sgLm1maTsJCXhtYS5odQlmODI9ZjMzLGYxMjQsZjgxCX0KK3sgLm1maTsJCXhtYS5sdQlmODE9ZjMzLGYxMjQsZjgxCX07OworeyAubWZpOwkJeG1hLmh1CWY5Mj1mMzMsZjEyNSxmOTEJfQoreyAubWZpOwkJeG1hLmx1CWY5MT1mMzMsZjEyNSxmOTEJfTs7Cit7IC5tZmk7CQl4bWEuaHUJZjEwMj1mMzMsZjEyNixmMTAxCX0KK3sgLm1maTsJCXhtYS5sdQlmMTAxPWYzMyxmMTI2LGYxMDEJfTs7Cit7IC5tZmk7CQl4bWEuaHUJZjExMj1mMzMsZjEyNyxmMTExCX0KK3sgLm1maTsJCXhtYS5sdQlmMTExPWYzMyxmMTI3LGYxMTEJfTs7Ly8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCit7IC5tZmk7CWdldGYuc2lnCXIyNT1mNDEKKwkJeG1hLmh1CWY0Mz1mMzQsZjEyMCxmNDIJfQoreyAubWZpOwkJeG1hLmx1CWY0Mj1mMzQsZjEyMCxmNDIJfTs7Cit7IC5tZmk7CWdldGYuc2lnCXIxNj1mNjAKKwkJeG1hLmh1CWY1Mz1mMzQsZjEyMSxmNTIJfQoreyAubWZpOwkJeG1hLmx1CWY1Mj1mMzQsZjEyMSxmNTIJfTs7Cit7IC5tZmk7CWdldGYuc2lnCXIxNz1mNTEKKwkJeG1hLmh1CWY2Mz1mMzQsZjEyMixmNjIKKwlhZGQJCXIyNT1yMjUscjI0CQl9Cit7IC5tZmk7CQl4bWEubHUJZjYyPWYzNCxmMTIyLGY2MgorCW1vdgkJY2FycnkxPTAJCX07OworeyAubWZpOwljbXAubHR1CQlwNixwMD1yMjUscjI0CisJCXhtYS5odQlmNzM9ZjM0LGYxMjMsZjcyCX0KK3sgLm1maTsJCXhtYS5sdQlmNzI9ZjM0LGYxMjMsZjcyCX07OworeyAubWZpOwlzdDgJCVtyMzNdPXIyNSwxNgorCQl4bWEuaHUJZjgzPWYzNCxmMTI0LGY4MgorKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQkJfQoreyAubWZpOwkJeG1hLmx1CWY4Mj1mMzQsZjEyNCxmODIJfTs7Cit7IC5tZmk7CQl4bWEuaHUJZjkzPWYzNCxmMTI1LGY5Mgl9Cit7IC5tZmk7CQl4bWEubHUJZjkyPWYzNCxmMTI1LGY5Mgl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTAzPWYzNCxmMTI2LGYxMDIJfQoreyAubWZpOwkJeG1hLmx1CWYxMDI9ZjM0LGYxMjYsZjEwMgl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTEzPWYzNCxmMTI3LGYxMTIJfQoreyAubWZpOwkJeG1hLmx1CWYxMTI9ZjM0LGYxMjcsZjExMgl9OzsvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK3sgLm1maTsJZ2V0Zi5zaWcJcjE4PWY0MgorCQl4bWEuaHUJZjQ0PWYzNSxmMTIwLGY0MworCWFkZAkJcjE3PXIxNyxyMTYJCX0KK3sgLm1maTsJCXhtYS5sdQlmNDM9ZjM1LGYxMjAsZjQzCX07OworeyAubWZpOwlnZXRmLnNpZwlyMjQ9ZjcwCisJCXhtYS5odQlmNTQ9ZjM1LGYxMjEsZjUzCX0KK3sgLm1maTsJbW92CQljYXJyeTI9MAorCQl4bWEubHUJZjUzPWYzNSxmMTIxLGY1Mwl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjI1PWY2MQorCQl4bWEuaHUJZjY0PWYzNSxmMTIyLGY2MworCWNtcC5sdHUJCXA3LHAwPXIxNyxyMTYJCX0KK3sgLm1maTsJYWRkCQlyMTg9cjE4LHIxNworCQl4bWEubHUJZjYzPWYzNSxmMTIyLGY2Mwl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjI2PWY1MgorCQl4bWEuaHUJZjc0PWYzNSxmMTIzLGY3MworKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgkJfQoreyAubWZpOwljbXAubHR1CQlwNyxwMD1yMTgscjE3CisJCXhtYS5sdQlmNzM9ZjM1LGYxMjMsZjczCisJYWRkCQlyMTg9cjE4LGNhcnJ5MQkJfTs7Cit7IC5tZmk7CisJCXhtYS5odQlmODQ9ZjM1LGYxMjQsZjgzCisocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCQl9Cit7IC5tZmk7CWNtcC5sdHUJCXA3LHAwPXIxOCxjYXJyeTEKKwkJeG1hLmx1CWY4Mz1mMzUsZjEyNCxmODMJfTs7Cit7IC5tZmk7CXN0OAkJW3IzMl09cjE4LDE2CisJCXhtYS5odQlmOTQ9ZjM1LGYxMjUsZjkzCisocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCQl9Cit7IC5tZmk7CQl4bWEubHUJZjkzPWYzNSxmMTI1LGY5Mwl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTA0PWYzNSxmMTI2LGYxMDMJfQoreyAubWZpOwkJeG1hLmx1CWYxMDM9ZjM1LGYxMjYsZjEwMwl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTE0PWYzNSxmMTI3LGYxMTMJfQoreyAubWZpOwltb3YJCWNhcnJ5MT0wCisJCXhtYS5sdQlmMTEzPWYzNSxmMTI3LGYxMTMKKwlhZGQJCXIyNT1yMjUscjI0CQl9OzsvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK3sgLm1maTsJZ2V0Zi5zaWcJcjI3PWY0MworCQl4bWEuaHUJZjQ1PWYzNixmMTIwLGY0NAorCWNtcC5sdHUJCXA2LHAwPXIyNSxyMjQJCX0KK3sgLm1maTsJCXhtYS5sdQlmNDQ9ZjM2LGYxMjAsZjQ0CQorCWFkZAkJcjI2PXIyNixyMjUJCX07OworeyAubWZpOwlnZXRmLnNpZwlyMTY9ZjgwCisJCXhtYS5odQlmNTU9ZjM2LGYxMjEsZjU0CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9Cit7IC5tZmk7CQl4bWEubHUJZjU0PWYzNixmMTIxLGY1NAl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjE3PWY3MQorCQl4bWEuaHUJZjY1PWYzNixmMTIyLGY2NAorCWNtcC5sdHUJCXA2LHAwPXIyNixyMjUJCX0KK3sgLm1maTsJCXhtYS5sdQlmNjQ9ZjM2LGYxMjIsZjY0CisJYWRkCQlyMjc9cjI3LHIyNgkJfTs7Cit7IC5tZmk7CWdldGYuc2lnCXIxOD1mNjIKKwkJeG1hLmh1CWY3NT1mMzYsZjEyMyxmNzQKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEJCX0KK3sgLm1maTsJY21wLmx0dQkJcDYscDA9cjI3LHIyNgorCQl4bWEubHUJZjc0PWYzNixmMTIzLGY3NAorCWFkZAkJcjI3PXIyNyxjYXJyeTIJCX07OworeyAubWZpOwlnZXRmLnNpZwlyMTk9ZjUzCisJCXhtYS5odQlmODU9ZjM2LGYxMjQsZjg0CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9Cit7IC5tZmk7CQl4bWEubHUJZjg0PWYzNixmMTI0LGY4NAorCWNtcC5sdHUJCXA2LHAwPXIyNyxjYXJyeTIJfTs7Cit7IC5tZmk7CXN0OAkJW3IzM109cjI3LDE2CisJCXhtYS5odQlmOTU9ZjM2LGYxMjUsZjk0CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9Cit7IC5tZmk7CQl4bWEubHUJZjk0PWYzNixmMTI1LGY5NAl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTA1PWYzNixmMTI2LGYxMDQJfQoreyAubWZpOwltb3YJCWNhcnJ5Mj0wCisJCXhtYS5sdQlmMTA0PWYzNixmMTI2LGYxMDQKKwlhZGQJCXIxNz1yMTcscjE2CQl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTE1PWYzNixmMTI3LGYxMTQKKwljbXAubHR1CQlwNyxwMD1yMTcscjE2CQl9Cit7IC5tZmk7CQl4bWEubHUJZjExND1mMzYsZjEyNyxmMTE0CisJYWRkCQlyMTg9cjE4LHIxNwkJfTs7Ly8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCit7IC5tZmk7CWdldGYuc2lnCXIyMD1mNDQKKwkJeG1hLmh1CWY0Nj1mMzcsZjEyMCxmNDUKKyhwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIJCX0KK3sgLm1maTsJY21wLmx0dQkJcDcscDA9cjE4LHIxNworCQl4bWEubHUJZjQ1PWYzNyxmMTIwLGY0NQorCWFkZAkJcjE5PXIxOSxyMTgJCX07OworeyAubWZpOwlnZXRmLnNpZwlyMjQ9ZjkwCisJCXhtYS5odQlmNTY9ZjM3LGYxMjEsZjU1CX0KK3sgLm1maTsJCXhtYS5sdQlmNTU9ZjM3LGYxMjEsZjU1CX07OworeyAubWZpOwlnZXRmLnNpZwlyMjU9ZjgxCisJCXhtYS5odQlmNjY9ZjM3LGYxMjIsZjY1CisocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCQl9Cit7IC5tZmk7CWNtcC5sdHUJCXA3LHAwPXIxOSxyMTgKKwkJeG1hLmx1CWY2NT1mMzcsZjEyMixmNjUKKwlhZGQJCXIyMD1yMjAscjE5CQl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjI2PWY3MgorCQl4bWEuaHUJZjc2PWYzNyxmMTIzLGY3NQorKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgkJfQoreyAubWZpOwljbXAubHR1CQlwNyxwMD1yMjAscjE5CisJCXhtYS5sdQlmNzU9ZjM3LGYxMjMsZjc1CisJYWRkCQlyMjA9cjIwLGNhcnJ5MQkJfTs7Cit7IC5tZmk7CWdldGYuc2lnCXIyNz1mNjMKKwkJeG1hLmh1CWY4Nj1mMzcsZjEyNCxmODUKKyhwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIJCX0KK3sgLm1maTsJCXhtYS5sdQlmODU9ZjM3LGYxMjQsZjg1CisJY21wLmx0dQkJcDcscDA9cjIwLGNhcnJ5MQl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjI4PWY1NAorCQl4bWEuaHUJZjk2PWYzNyxmMTI1LGY5NQorKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgkJfQoreyAubWZpOwlzdDgJCVtyMzJdPXIyMCwxNgorCQl4bWEubHUJZjk1PWYzNyxmMTI1LGY5NQl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTA2PWYzNyxmMTI2LGYxMDUJfQoreyAubWZpOwltb3YJCWNhcnJ5MT0wCisJCXhtYS5sdQlmMTA1PWYzNyxmMTI2LGYxMDUKKwlhZGQJCXIyNT1yMjUscjI0CQl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTE2PWYzNyxmMTI3LGYxMTUKKwljbXAubHR1CQlwNixwMD1yMjUscjI0CQl9Cit7IC5tZmk7CQl4bWEubHUJZjExNT1mMzcsZjEyNyxmMTE1CisJYWRkCQlyMjY9cjI2LHIyNQkJfTs7Ly8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCit7IC5tZmk7CWdldGYuc2lnCXIyOT1mNDUKKwkJeG1hLmh1CWY0Nz1mMzgsZjEyMCxmNDYKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEJCX0KK3sgLm1maTsJY21wLmx0dQkJcDYscDA9cjI2LHIyNQorCQl4bWEubHUJZjQ2PWYzOCxmMTIwLGY0NgorCWFkZAkJcjI3PXIyNyxyMjYJCX07OworeyAubWZpOwlnZXRmLnNpZwlyMTY9ZjEwMAorCQl4bWEuaHUJZjU3PWYzOCxmMTIxLGY1NgorKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQkJfQoreyAubWZpOwljbXAubHR1CQlwNixwMD1yMjcscjI2CisJCXhtYS5sdQlmNTY9ZjM4LGYxMjEsZjU2CisJYWRkCQlyMjg9cjI4LHIyNwkJfTs7Cit7IC5tZmk7CWdldGYuc2lnCXIxNz1mOTEKKwkJeG1hLmh1CWY2Nz1mMzgsZjEyMixmNjYKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEJCX0KK3sgLm1maTsJY21wLmx0dQkJcDYscDA9cjI4LHIyNworCQl4bWEubHUJZjY2PWYzOCxmMTIyLGY2NgorCWFkZAkJcjI5PXIyOSxyMjgJCX07OworeyAubWZpOwlnZXRmLnNpZwlyMTg9ZjgyCisJCXhtYS5odQlmNzc9ZjM4LGYxMjMsZjc2CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9Cit7IC5tZmk7CWNtcC5sdHUJCXA2LHAwPXIyOSxyMjgKKwkJeG1hLmx1CWY3Nj1mMzgsZjEyMyxmNzYKKwlhZGQJCXIyOT1yMjksY2FycnkyCQl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjE5PWY3MworCQl4bWEuaHUJZjg3PWYzOCxmMTI0LGY4NgorKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQkJfQoreyAubWZpOwkJeG1hLmx1CWY4Nj1mMzgsZjEyNCxmODYKKwljbXAubHR1CQlwNixwMD1yMjksY2FycnkyCX07OworeyAubWZpOwlnZXRmLnNpZwlyMjA9ZjY0CisJCXhtYS5odQlmOTc9ZjM4LGYxMjUsZjk2CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9Cit7IC5tZmk7CXN0OAkJW3IzM109cjI5LDE2CisJCXhtYS5sdQlmOTY9ZjM4LGYxMjUsZjk2CX07OworeyAubWZpOwlnZXRmLnNpZwlyMjE9ZjU1CisJCXhtYS5odQlmMTA3PWYzOCxmMTI2LGYxMDYJfQoreyAubWZpOwltb3YJCWNhcnJ5Mj0wCisJCXhtYS5sdQlmMTA2PWYzOCxmMTI2LGYxMDYKKwlhZGQJCXIxNz1yMTcscjE2CQl9OzsKK3sgLm1maTsJCXhtYS5odQlmMTE3PWYzOCxmMTI3LGYxMTYKKwljbXAubHR1CQlwNyxwMD1yMTcscjE2CQl9Cit7IC5tZmk7CQl4bWEubHUJZjExNj1mMzgsZjEyNyxmMTE2CisJYWRkCQlyMTg9cjE4LHIxNwkJfTs7Ly8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCit7IC5tZmk7CWdldGYuc2lnCXIyMj1mNDYKKwkJeG1hLmh1CWY0OD1mMzksZjEyMCxmNDcKKyhwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIJCX0KK3sgLm1maTsJY21wLmx0dQkJcDcscDA9cjE4LHIxNworCQl4bWEubHUJZjQ3PWYzOSxmMTIwLGY0NworCWFkZAkJcjE5PXIxOSxyMTgJCX07OworeyAubWZpOwlnZXRmLnNpZwlyMjQ9ZjExMAorCQl4bWEuaHUJZjU4PWYzOSxmMTIxLGY1NworKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgkJfQoreyAubWZpOwljbXAubHR1CQlwNyxwMD1yMTkscjE4CisJCXhtYS5sdQlmNTc9ZjM5LGYxMjEsZjU3CisJYWRkCQlyMjA9cjIwLHIxOQkJfTs7Cit7IC5tZmk7CWdldGYuc2lnCXIyNT1mMTAxCisJCXhtYS5odQlmNjg9ZjM5LGYxMjIsZjY3CisocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCQl9Cit7IC5tZmk7CWNtcC5sdHUJCXA3LHAwPXIyMCxyMTkKKwkJeG1hLmx1CWY2Nz1mMzksZjEyMixmNjcKKwlhZGQJCXIyMT1yMjEscjIwCQl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjI2PWY5MgorCQl4bWEuaHUJZjc4PWYzOSxmMTIzLGY3NworKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgkJfQoreyAubWZpOwljbXAubHR1CQlwNyxwMD1yMjEscjIwCisJCXhtYS5sdQlmNzc9ZjM5LGYxMjMsZjc3CisJYWRkCQlyMjI9cjIyLHIyMQkJfTs7Cit7IC5tZmk7CWdldGYuc2lnCXIyNz1mODMKKwkJeG1hLmh1CWY4OD1mMzksZjEyNCxmODcKKyhwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIJCX0KK3sgLm1maTsJY21wLmx0dQkJcDcscDA9cjIyLHIyMQorCQl4bWEubHUJZjg3PWYzOSxmMTI0LGY4NworCWFkZAkJcjIyPXIyMixjYXJyeTEJCX07OworeyAubWZpOwlnZXRmLnNpZwlyMjg9Zjc0CisJCXhtYS5odQlmOTg9ZjM5LGYxMjUsZjk3CisocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCQl9Cit7IC5tZmk7CQl4bWEubHUJZjk3PWYzOSxmMTI1LGY5NworCWNtcC5sdHUJCXA3LHAwPXIyMixjYXJyeTEJfTs7Cit7IC5tZmk7CWdldGYuc2lnCXIyOT1mNjUKKwkJeG1hLmh1CWYxMDg9ZjM5LGYxMjYsZjEwNworKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgkJfQoreyAubWZpOwlzdDgJCVtyMzJdPXIyMiwxNgorCQl4bWEubHUJZjEwNz1mMzksZjEyNixmMTA3CX07OworeyAubWZpOwlnZXRmLnNpZwlyMzA9ZjU2CisJCXhtYS5odQlmMTE4PWYzOSxmMTI3LGYxMTcJfQoreyAubWZpOwkJeG1hLmx1CWYxMTc9ZjM5LGYxMjcsZjExNwl9OzsvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIExlYXZpbmcgbXVsaXBsaWVyJ3MgaGVhdmVuLi4uIFF1aXRlIGEgcmlkZSwgaHVoPworCit7IC5taWk7CWdldGYuc2lnCXIzMT1mNDcKKwlhZGQJCXIyNT1yMjUscjI0CisJbW92CQljYXJyeTE9MAkJfTs7Cit7IC5taWk7CQlnZXRmLnNpZwlyMTY9ZjExMQorCWNtcC5sdHUJCXA2LHAwPXIyNSxyMjQKKwlhZGQJCXIyNj1yMjYscjI1CQl9OzsKK3sgLm1mYjsJCWdldGYuc2lnCXIxNz1mMTAyCX0KK3sgLm1paTsKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEKKwljbXAubHR1CQlwNixwMD1yMjYscjI1CisJYWRkCQlyMjc9cjI3LHIyNgkJfTs7Cit7IC5tZmI7CW5vcC5tCTB4MAkJCQl9Cit7IC5taWk7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI3LHIyNgorCWFkZAkJcjI4PXIyOCxyMjcJCX07OworeyAubWlpOwkJZ2V0Zi5zaWcJcjE4PWY5MworCQlhZGQJCXIxNz1yMTcscjE2CisJCW1vdgkJY2FycnkzPTAJfQoreyAubWlpOworKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQorCWNtcC5sdHUJCXA2LHAwPXIyOCxyMjcKKwlhZGQJCXIyOT1yMjkscjI4CQl9OzsKK3sgLm1paTsJCWdldGYuc2lnCXIxOT1mODQKKwkJY21wLmx0dQkJcDcscDA9cjE3LHIxNgl9Cit7IC5taWk7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI5LHIyOAorCWFkZAkJcjMwPXIzMCxyMjkJCX07OworeyAubWlpOwkJZ2V0Zi5zaWcJcjIwPWY3NQorCQlhZGQJCXIxOD1yMTgscjE3CX0KK3sgLm1paTsKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEKKwljbXAubHR1CQlwNixwMD1yMzAscjI5CisJYWRkCQlyMzE9cjMxLHIzMAkJfTs7Cit7IC5tZmI7CQlnZXRmLnNpZwlyMjE9ZjY2CQl9Cit7IC5taWk7CShwNykJYWRkCQljYXJyeTM9MSxjYXJyeTMKKwkJY21wLmx0dQkJcDcscDA9cjE4LHIxNworCQlhZGQJCXIxOT1yMTkscjE4CX0KK3sgLm1mYjsJbm9wLm0JMHgwCQkJCX0KK3sgLm1paTsKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEKKwljbXAubHR1CQlwNixwMD1yMzEscjMwCisJYWRkCQlyMzE9cjMxLGNhcnJ5MgkJfTs7Cit7IC5tZmI7CQlnZXRmLnNpZwlyMjI9ZjU3CQl9Cit7IC5taWk7CShwNykJYWRkCQljYXJyeTM9MSxjYXJyeTMKKwkJY21wLmx0dQkJcDcscDA9cjE5LHIxOAorCQlhZGQJCXIyMD1yMjAscjE5CX0KK3sgLm1mYjsJbm9wLm0JMHgwCQkJCX0KK3sgLm1paTsKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEKKwljbXAubHR1CQlwNixwMD1yMzEsY2FycnkyCX07OworeyAubWZiOwkJZ2V0Zi5zaWcJcjIzPWY0OAkJfQoreyAubWlpOwkocDcpCWFkZAkJY2FycnkzPTEsY2FycnkzCisJCWNtcC5sdHUJCXA3LHAwPXIyMCxyMTkKKwkJYWRkCQlyMjE9cjIxLHIyMAl9Cit7IC5taWk7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9Cit7IC5tZmI7CXN0OAkJW3IzM109cjMxLDE2CQl9OzsKKworeyAubWZiOwlnZXRmLnNpZwlyMjQ9ZjExMgkJfQoreyAubWlpOwkocDcpCWFkZAkJY2FycnkzPTEsY2FycnkzCisJCWNtcC5sdHUJCXA3LHAwPXIyMSxyMjAKKwkJYWRkCQlyMjI9cjIyLHIyMQl9OzsKK3sgLm1mYjsJZ2V0Zi5zaWcJcjI1PWYxMDMJCX0KK3sgLm1paTsJKHA3KQlhZGQJCWNhcnJ5Mz0xLGNhcnJ5MworCQljbXAubHR1CQlwNyxwMD1yMjIscjIxCisJCWFkZAkJcjIzPXIyMyxyMjIJfTs7Cit7IC5tZmI7CWdldGYuc2lnCXIyNj1mOTQJCQl9Cit7IC5taWk7CShwNykJYWRkCQljYXJyeTM9MSxjYXJyeTMKKwkJY21wLmx0dQkJcDcscDA9cjIzLHIyMgorCQlhZGQJCXIyMz1yMjMsY2FycnkxCX07OworeyAubWZiOwlnZXRmLnNpZwlyMjc9Zjg1CQkJfQoreyAubWlpOwkocDcpCWFkZAkJY2FycnkzPTEsY2FycnkzCisJCWNtcC5sdHUJCXA3LHA4PXIyMyxjYXJyeTF9OzsKK3sgLm1paTsJZ2V0Zi5zaWcJcjI4PWY3NgorCWFkZAkJcjI1PXIyNSxyMjQKKwltb3YJCWNhcnJ5MT0wCQl9Cit7IC5taWk7CQlzdDgJCVtyMzJdPXIyMywxNgorCShwNykJYWRkCQljYXJyeTI9MSxjYXJyeTMKKwkocDgpCWFkZAkJY2FycnkyPTAsY2FycnkzCX07OworCit7IC5tZmI7CW5vcC5tCTB4MAkJCQl9Cit7IC5taWk7CWdldGYuc2lnCXIyOT1mNjcKKwljbXAubHR1CQlwNixwMD1yMjUscjI0CisJYWRkCQlyMjY9cjI2LHIyNQkJfTs7Cit7IC5tZmI7CWdldGYuc2lnCXIzMD1mNTgJCQl9Cit7IC5taWk7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI2LHIyNQorCWFkZAkJcjI3PXIyNyxyMjYJCX07OworeyAubWZiOwkJZ2V0Zi5zaWcJcjE2PWYxMTMJfQoreyAubWlpOworKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQorCWNtcC5sdHUJCXA2LHAwPXIyNyxyMjYKKwlhZGQJCXIyOD1yMjgscjI3CQl9OzsKK3sgLm1mYjsJCWdldGYuc2lnCXIxNz1mMTA0CX0KK3sgLm1paTsKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEKKwljbXAubHR1CQlwNixwMD1yMjgscjI3CisJYWRkCQlyMjk9cjI5LHIyOAkJfTs7Cit7IC5tZmI7CQlnZXRmLnNpZwlyMTg9Zjk1CQl9Cit7IC5taWk7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI5LHIyOAorCWFkZAkJcjMwPXIzMCxyMjkJCX07OworeyAubWlpOwkJZ2V0Zi5zaWcJcjE5PWY4NgorCQlhZGQJCXIxNz1yMTcscjE2CisJCW1vdgkJY2FycnkzPTAJfQoreyAubWlpOworKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQorCWNtcC5sdHUJCXA2LHAwPXIzMCxyMjkKKwlhZGQJCXIzMD1yMzAsY2FycnkyCQl9OzsKK3sgLm1paTsJCWdldGYuc2lnCXIyMD1mNzcKKwkJY21wLmx0dQkJcDcscDA9cjE3LHIxNgorCQlhZGQJCXIxOD1yMTgscjE3CX0KK3sgLm1paTsKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEKKwljbXAubHR1CQlwNixwMD1yMzAsY2FycnkyCX07OworeyAubWZiOwkJZ2V0Zi5zaWcJcjIxPWY2OAkJfQoreyAubWlpOwlzdDgJCVtyMzNdPXIzMCwxNgorKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQkJfTs7CisKK3sgLm1mYjsJZ2V0Zi5zaWcJcjI0PWYxMTQJCX0KK3sgLm1paTsJKHA3KQlhZGQJCWNhcnJ5Mz0xLGNhcnJ5MworCQljbXAubHR1CQlwNyxwMD1yMTgscjE3CisJCWFkZAkJcjE5PXIxOSxyMTgJfTs7Cit7IC5tZmI7CWdldGYuc2lnCXIyNT1mMTA1CQl9Cit7IC5taWk7CShwNykJYWRkCQljYXJyeTM9MSxjYXJyeTMKKwkJY21wLmx0dQkJcDcscDA9cjE5LHIxOAorCQlhZGQJCXIyMD1yMjAscjE5CX07OworeyAubWZiOwlnZXRmLnNpZwlyMjY9Zjk2CQkJfQoreyAubWlpOwkocDcpCWFkZAkJY2FycnkzPTEsY2FycnkzCisJCWNtcC5sdHUJCXA3LHAwPXIyMCxyMTkKKwkJYWRkCQlyMjE9cjIxLHIyMAl9OzsKK3sgLm1mYjsJZ2V0Zi5zaWcJcjI3PWY4NwkJCX0KK3sgLm1paTsJKHA3KQlhZGQJCWNhcnJ5Mz0xLGNhcnJ5MworCQljbXAubHR1CQlwNyxwMD1yMjEscjIwCisJCWFkZAkJcjIxPXIyMSxjYXJyeTEJfTs7Cit7IC5taWI7CWdldGYuc2lnCXIyOD1mNzgJCQkKKwlhZGQJCXIyNT1yMjUscjI0CQl9Cit7IC5taWI7CShwNykJYWRkCQljYXJyeTM9MSxjYXJyeTMKKwkJY21wLmx0dQkJcDcscDg9cjIxLGNhcnJ5MX07OworeyAubWlpOwkJc3Q4CQlbcjMyXT1yMjEsMTYKKwkocDcpCWFkZAkJY2FycnkyPTEsY2FycnkzCisJKHA4KQlhZGQJCWNhcnJ5Mj0wLGNhcnJ5Mwl9CisKK3sgLm1paTsJbW92CQljYXJyeTE9MAorCWNtcC5sdHUJCXA2LHAwPXIyNSxyMjQKKwlhZGQJCXIyNj1yMjYscjI1CQl9OzsKK3sgLm1mYjsJCWdldGYuc2lnCXIxNj1mMTE1CX0KK3sgLm1paTsKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEKKwljbXAubHR1CQlwNixwMD1yMjYscjI1CisJYWRkCQlyMjc9cjI3LHIyNgkJfTs7Cit7IC5tZmI7CQlnZXRmLnNpZwlyMTc9ZjEwNgl9Cit7IC5taWk7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI3LHIyNgorCWFkZAkJcjI4PXIyOCxyMjcJCX07OworeyAubWZiOwkJZ2V0Zi5zaWcJcjE4PWY5NwkJfQoreyAubWlpOworKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQorCWNtcC5sdHUJCXA2LHAwPXIyOCxyMjcKKwlhZGQJCXIyOD1yMjgsY2FycnkyCQl9OzsKK3sgLm1pYjsJCWdldGYuc2lnCXIxOT1mODgKKwkJYWRkCQlyMTc9cjE3LHIxNgl9Cit7IC5taWI7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI4LGNhcnJ5Mgl9OzsKK3sgLm1paTsJc3Q4CQlbcjMzXT1yMjgsMTYKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEJCX0KKworeyAubWlpOwkJbW92CQljYXJyeTI9MAorCQljbXAubHR1CQlwNyxwMD1yMTcscjE2CisJCWFkZAkJcjE4PXIxOCxyMTcJfTs7Cit7IC5tZmI7CWdldGYuc2lnCXIyND1mMTE2CQl9Cit7IC5taWk7CShwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIKKwkJY21wLmx0dQkJcDcscDA9cjE4LHIxNworCQlhZGQJCXIxOT1yMTkscjE4CX07OworeyAubWZiOwlnZXRmLnNpZwlyMjU9ZjEwNwkJfQoreyAubWlpOwkocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCisJCWNtcC5sdHUJCXA3LHAwPXIxOSxyMTgKKwkJYWRkCQlyMTk9cjE5LGNhcnJ5MQl9OzsKK3sgLm1mYjsJZ2V0Zi5zaWcJcjI2PWY5OAkJCX0KK3sgLm1paTsJKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgorCQljbXAubHR1CQlwNyxwMD1yMTksY2FycnkxfTs7Cit7IC5taWk7CQlzdDgJCVtyMzJdPXIxOSwxNgorCShwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIJfQorCit7IC5tZmI7CWFkZAkJcjI1PXIyNSxyMjQJCX07OworCit7IC5tZmI7CQlnZXRmLnNpZwlyMTY9ZjExNwl9Cit7IC5taWk7CW1vdgkJY2FycnkxPTAKKwljbXAubHR1CQlwNixwMD1yMjUscjI0CisJYWRkCQlyMjY9cjI2LHIyNQkJfTs7Cit7IC5tZmI7CQlnZXRmLnNpZwlyMTc9ZjEwOAl9Cit7IC5taWk7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI2LHIyNQorCWFkZAkJcjI2PXIyNixjYXJyeTIJCX07OworeyAubWZiOwlub3AubQkweDAJCQkJfQoreyAubWlpOworKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQorCWNtcC5sdHUJCXA2LHAwPXIyNixjYXJyeTIJfTs7Cit7IC5taWk7CXN0OAkJW3IzM109cjI2LDE2CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9CisKK3sgLm1mYjsJCWFkZAkJcjE3PXIxNyxyMTYJfTs7Cit7IC5tZmI7CWdldGYuc2lnCXIyND1mMTE4CQl9Cit7IC5taWk7CQltb3YJCWNhcnJ5Mj0wCisJCWNtcC5sdHUJCXA3LHAwPXIxNyxyMTYKKwkJYWRkCQlyMTc9cjE3LGNhcnJ5MQl9OzsKK3sgLm1paTsJKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgorCQljbXAubHR1CQlwNyxwMD1yMTcsY2FycnkxfTs7Cit7IC5taWk7CQlzdDgJCVtyMzJdPXIxNworCShwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIJfTs7Cit7IC5tZmI7CWFkZAkJcjI0PXIyNCxjYXJyeTIJCX07OworeyAubWliOwlzdDgJCVtyMzNdPXIyNAkJfQorCit7IC5taWI7CXJ1bQkJMTw8NQkJLy8gY2xlYXIgdW0ubWZoCisJYnIucmV0LnNwdGsubWFueQliMAl9OzsKKy5lbmRwCWJuX211bF9jb21iYTgjCisjdW5kZWYJY2FycnkzCisjdW5kZWYJY2FycnkyCisjdW5kZWYJY2FycnkxCisjZW5kaWYKKworI2lmIDEKKy8vIEl0J3MgcG9zc2libGUgdG8gbWFrZSBpdCBmYXN0ZXIgKHNlZSBjb21tZW50IHRvIGJuX3Nxcl9jb21iYTgpLCBidXQKKy8vIEkgcmVja29uIGl0IGRvZXNuJ3Qgd29ydGggdGhlIGVmZm9ydC4gQmFzaWNhbGx5IGJlY2F1c2UgdGhlIHJvdXRpbmUKKy8vIChhY3R1YWxseSBib3RoIG9mIHRoZW0pIHByYWN0aWNhbGx5IG5ldmVyIGNhbGxlZC4uLiBTbyBJIGp1c3QgcGxheQorLy8gc2FtZSB0cmljayBhcyB3aXRoIGJuX3Nxcl9jb21iYTguCisvLworLy8gdm9pZCBibl9zcXJfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSkKKy8vCisuZ2xvYmFsCWJuX3Nxcl9jb21iYTQjCisucHJvYwlibl9zcXJfY29tYmE0IworLmFsaWduCTY0Citibl9zcXJfY29tYmE0OgorCS5wcm9sb2d1ZQorCS5zYXZlCWFyLnBmcyxyMgorI2lmIGRlZmluZWQoX0hQVVhfU09VUkNFKSAmJiAhZGVmaW5lZChfTFA2NCkKK3sgLm1paTsJYWxsb2MgICByMj1hci5wZnMsMiwxLDAsMAorCWFkZHA0CXIzMj0wLHIzMgorCWFkZHA0CXIzMz0wLHIzMwkJfTs7Cit7IC5taWk7CisjZWxzZQoreyAubWlpOwlhbGxvYwlyMj1hci5wZnMsMiwxLDAsMAorI2VuZGlmCisJbW92CXIzND1yMzMKKwlhZGQJcjE0PTgscjMzCQl9OzsKKwkuYm9keQoreyAubWlpOwlhZGQJcjE3PTgscjM0CisJYWRkCXIxNT0xNixyMzMKKwlhZGQJcjE4PTE2LHIzNAkJfQoreyAubWZiOwlhZGQJcjE2PTI0LHIzMworCWJyCS5MX2NoZWF0X2VudHJ5X3BvaW50NAl9OzsKKy5lbmRwCWJuX3Nxcl9jb21iYTQjCisjZW5kaWYKKworI2lmIDEKKy8vIFJ1bnMgaW4gfjExNSBjeWNsZXMgYW5kIH40LjUgdGltZXMgZmFzdGVyIHRoYW4gQy4gV2VsbCwgd2hhdGV2ZXIuLi4KKy8vCisvLyB2b2lkIGJuX211bF9jb21iYTQoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikKKy8vCisjZGVmaW5lCWNhcnJ5MQlyMTQKKyNkZWZpbmUJY2FycnkyCXIxNQorLmdsb2JhbAlibl9tdWxfY29tYmE0IworLnByb2MJYm5fbXVsX2NvbWJhNCMKKy5hbGlnbgk2NAorYm5fbXVsX2NvbWJhNDoKKwkucHJvbG9ndWUKKwkuc2F2ZQlhci5wZnMscjIKKyNpZiBkZWZpbmVkKF9IUFVYX1NPVVJDRSkgJiYgIWRlZmluZWQoX0xQNjQpCit7IC5taWk7CWFsbG9jICAgcjI9YXIucGZzLDMsMCwwLDAKKwlhZGRwNAlyMzM9MCxyMzMKKwlhZGRwNAlyMzQ9MCxyMzQJCX07OworeyAubWlpOwlhZGRwNAlyMzI9MCxyMzIKKyNlbHNlCit7IC5taWk7CWFsbG9jCXIyPWFyLnBmcywzLDAsMCwwCisjZW5kaWYKKwlhZGQJcjE0PTgscjMzCisJYWRkCXIxNz04LHIzNAkJfQorCS5ib2R5Cit7IC5taWk7CWFkZAlyMTU9MTYscjMzCisJYWRkCXIxOD0xNixyMzQKKwlhZGQJcjE2PTI0LHIzMwkJfTs7CisuTF9jaGVhdF9lbnRyeV9wb2ludDQ6Cit7IC5tbWk7CWFkZAlyMTk9MjQscjM0CisKKwlsZGY4CWYzMj1bcjMzXQkJfQorCit7IC5tbWk7CWxkZjgJZjEyMD1bcjM0XQorCWxkZjgJZjEyMT1bcjE3XQkJfTs7Cit7IC5tbWk7CWxkZjgJZjEyMj1bcjE4XQorCWxkZjgJZjEyMz1bcjE5XQkJfQorCit7IC5tbWk7CWxkZjgJZjMzPVtyMTRdCisJbGRmOAlmMzQ9W3IxNV0JCX0KK3sgLm1maTsJbGRmOAlmMzU9W3IxNl0KKworCQl4bWEuaHUJZjQxPWYzMixmMTIwLGYwCQl9Cit7IC5tZmk7CQl4bWEubHUJZjQwPWYzMixmMTIwLGYwCQl9OzsKK3sgLm1maTsJCXhtYS5odQlmNTE9ZjMyLGYxMjEsZjAJCX0KK3sgLm1maTsJCXhtYS5sdQlmNTA9ZjMyLGYxMjEsZjAJCX07OworeyAubWZpOwkJeG1hLmh1CWY2MT1mMzIsZjEyMixmMAkJfQoreyAubWZpOwkJeG1hLmx1CWY2MD1mMzIsZjEyMixmMAkJfTs7Cit7IC5tZmk7CQl4bWEuaHUJZjcxPWYzMixmMTIzLGYwCQl9Cit7IC5tZmk7CQl4bWEubHUJZjcwPWYzMixmMTIzLGYwCQl9OzsvLworLy8gTWFqb3Igc3RhbGwgdGFrZXMgcGxhY2UgaGVyZSwgYW5kIDMgbW9yZSBwbGFjZXMgYmVsb3cuIFJlc3VsdCBmcm9tCisvLyBmaXJzdCB4bWEgaXMgbm90IGF2YWlsYWJsZSBmb3IgYW5vdGhlciAzIHRpY2tzLgoreyAubWZpOwlnZXRmLnNpZwlyMTY9ZjQwCisJCXhtYS5odQlmNDI9ZjMzLGYxMjAsZjQxCisJYWRkCQlyMzM9OCxyMzIJCX0KK3sgLm1maTsJCXhtYS5sdQlmNDE9ZjMzLGYxMjAsZjQxCX07OworeyAubWZpOwlnZXRmLnNpZwlyMjQ9ZjUwCisJCXhtYS5odQlmNTI9ZjMzLGYxMjEsZjUxCX0KK3sgLm1maTsJCXhtYS5sdQlmNTE9ZjMzLGYxMjEsZjUxCX07OworeyAubWZpOwlzdDgJCVtyMzJdPXIxNiwxNgorCQl4bWEuaHUJZjYyPWYzMyxmMTIyLGY2MQl9Cit7IC5tZmk7CQl4bWEubHUJZjYxPWYzMyxmMTIyLGY2MQl9OzsKK3sgLm1maTsJCXhtYS5odQlmNzI9ZjMzLGYxMjMsZjcxCX0KK3sgLm1maTsJCXhtYS5sdQlmNzE9ZjMzLGYxMjMsZjcxCX07Oy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworeyAubWZpOwlnZXRmLnNpZwlyMjU9ZjQxCisJCXhtYS5odQlmNDM9ZjM0LGYxMjAsZjQyCX0KK3sgLm1maTsJCXhtYS5sdQlmNDI9ZjM0LGYxMjAsZjQyCX07OworeyAubWZpOwlnZXRmLnNpZwlyMTY9ZjYwCisJCXhtYS5odQlmNTM9ZjM0LGYxMjEsZjUyCX0KK3sgLm1maTsJCXhtYS5sdQlmNTI9ZjM0LGYxMjEsZjUyCX07OworeyAubWZpOwlnZXRmLnNpZwlyMTc9ZjUxCisJCXhtYS5odQlmNjM9ZjM0LGYxMjIsZjYyCisJYWRkCQlyMjU9cjI1LHIyNAkJfQoreyAubWZpOwltb3YJCWNhcnJ5MT0wCisJCXhtYS5sdQlmNjI9ZjM0LGYxMjIsZjYyCX07OworeyAubWZpOwlzdDgJCVtyMzNdPXIyNSwxNgorCQl4bWEuaHUJZjczPWYzNCxmMTIzLGY3MgorCWNtcC5sdHUJCXA2LHAwPXIyNSxyMjQJCX0KK3sgLm1maTsJCXhtYS5sdQlmNzI9ZjM0LGYxMjMsZjcyCX07Oy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0vLworeyAubWZpOwlnZXRmLnNpZwlyMTg9ZjQyCisJCXhtYS5odQlmNDQ9ZjM1LGYxMjAsZjQzCisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9Cit7IC5tZmk7CWFkZAkJcjE3PXIxNyxyMTYKKwkJeG1hLmx1CWY0Mz1mMzUsZjEyMCxmNDMKKwltb3YJCWNhcnJ5Mj0wCQl9OzsKK3sgLm1maTsJZ2V0Zi5zaWcJcjI0PWY3MAorCQl4bWEuaHUJZjU0PWYzNSxmMTIxLGY1MworCWNtcC5sdHUJCXA3LHAwPXIxNyxyMTYJCX0KK3sgLm1maTsJCXhtYS5sdQlmNTM9ZjM1LGYxMjEsZjUzCX07OworeyAubWZpOwlnZXRmLnNpZwlyMjU9ZjYxCisJCXhtYS5odQlmNjQ9ZjM1LGYxMjIsZjYzCisJYWRkCQlyMTg9cjE4LHIxNwkJfQoreyAubWZpOwkJeG1hLmx1CWY2Mz1mMzUsZjEyMixmNjMKKyhwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIJCX07OworeyAubWZpOwlnZXRmLnNpZwlyMjY9ZjUyCisJCXhtYS5odQlmNzQ9ZjM1LGYxMjMsZjczCisJY21wLmx0dQkJcDcscDA9cjE4LHIxNwkJfQoreyAubWZpOwkJeG1hLmx1CWY3Mz1mMzUsZjEyMyxmNzMKKwlhZGQJCXIxOD1yMTgsY2FycnkxCQl9OzsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCit7IC5taWk7CXN0OAkJW3IzMl09cjE4LDE2CisocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCisJY21wLmx0dQkJcDcscDA9cjE4LGNhcnJ5MQl9OzsKKworeyAubWZpOwlnZXRmLnNpZwlyMjc9ZjQzCS8vIGxhc3QgbWFqb3Igc3RhbGwKKyhwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIJCX07OworeyAubWlpOwkJZ2V0Zi5zaWcJcjE2PWY3MQorCWFkZAkJcjI1PXIyNSxyMjQKKwltb3YJCWNhcnJ5MT0wCQl9OzsKK3sgLm1paTsJCWdldGYuc2lnCXIxNz1mNjIJCisJY21wLmx0dQkJcDYscDA9cjI1LHIyNAorCWFkZAkJcjI2PXIyNixyMjUJCX07OworeyAubWlpOworKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQorCWNtcC5sdHUJCXA2LHAwPXIyNixyMjUKKwlhZGQJCXIyNz1yMjcscjI2CQl9OzsKK3sgLm1paTsKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEKKwljbXAubHR1CQlwNixwMD1yMjcscjI2CisJYWRkCQlyMjc9cjI3LGNhcnJ5MgkJfTs7Cit7IC5taWk7CQlnZXRmLnNpZwlyMTg9ZjUzCisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI3LGNhcnJ5Mgl9OzsKK3sgLm1maTsJc3Q4CQlbcjMzXT1yMjcsMTYKKyhwNikJYWRkCQljYXJyeTE9MSxjYXJyeTEJCX0KKworeyAubWlpOwkJZ2V0Zi5zaWcJcjE5PWY0NAorCQlhZGQJCXIxNz1yMTcscjE2CisJCW1vdgkJY2FycnkyPTAJfTs7Cit7IC5taWk7CWdldGYuc2lnCXIyND1mNzIKKwkJY21wLmx0dQkJcDcscDA9cjE3LHIxNgorCQlhZGQJCXIxOD1yMTgscjE3CX07OworeyAubWlpOwkocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCisJCWNtcC5sdHUJCXA3LHAwPXIxOCxyMTcKKwkJYWRkCQlyMTk9cjE5LHIxOAl9OzsKK3sgLm1paTsJKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5MgorCQljbXAubHR1CQlwNyxwMD1yMTkscjE4CisJCWFkZAkJcjE5PXIxOSxjYXJyeTEJfTs7Cit7IC5taWk7CWdldGYuc2lnCXIyNT1mNjMKKwkocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCisJCWNtcC5sdHUJCXA3LHAwPXIxOSxjYXJyeTF9OzsKK3sgLm1paTsJCXN0OAkJW3IzMl09cjE5LDE2CisJKHA3KQlhZGQJCWNhcnJ5Mj0xLGNhcnJ5Mgl9CisKK3sgLm1paTsJZ2V0Zi5zaWcJcjI2PWY1NAorCWFkZAkJcjI1PXIyNSxyMjQKKwltb3YJCWNhcnJ5MT0wCQl9OzsKK3sgLm1paTsJCWdldGYuc2lnCXIxNj1mNzMKKwljbXAubHR1CQlwNixwMD1yMjUscjI0CisJYWRkCQlyMjY9cjI2LHIyNQkJfTs7Cit7IC5taWk7CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCisJY21wLmx0dQkJcDYscDA9cjI2LHIyNQorCWFkZAkJcjI2PXIyNixjYXJyeTIJCX07OworeyAubWlpOwkJZ2V0Zi5zaWcJcjE3PWY2NAorKHA2KQlhZGQJCWNhcnJ5MT0xLGNhcnJ5MQorCWNtcC5sdHUJCXA2LHAwPXIyNixjYXJyeTIJfTs7Cit7IC5taWk7CXN0OAkJW3IzM109cjI2LDE2CisocDYpCWFkZAkJY2FycnkxPTEsY2FycnkxCQl9CisKK3sgLm1paTsJZ2V0Zi5zaWcJcjI0PWY3NAorCQlhZGQJCXIxNz1yMTcscjE2CQorCQltb3YJCWNhcnJ5Mj0wCX07OworeyAubWlpOwkJY21wLmx0dQkJcDcscDA9cjE3LHIxNgorCQlhZGQJCXIxNz1yMTcsY2FycnkxCX07OworCit7IC5taWk7CShwNykJYWRkCQljYXJyeTI9MSxjYXJyeTIKKwkJY21wLmx0dQkJcDcscDA9cjE3LGNhcnJ5MX07OworeyAubWlpOwkJc3Q4CQlbcjMyXT1yMTcsMTYKKwkocDcpCWFkZAkJY2FycnkyPTEsY2FycnkyCX07OworCit7IC5taWk7CWFkZAkJcjI0PXIyNCxjYXJyeTIJCX07OworeyAubWlpOwlzdDgJCVtyMzNdPXIyNAkJfQorCit7IC5taWI7CXJ1bQkJMTw8NQkJLy8gY2xlYXIgdW0ubWZoCisJYnIucmV0LnNwdGsubWFueQliMAl9OzsKKy5lbmRwCWJuX211bF9jb21iYTQjCisjdW5kZWYJY2FycnkyCisjdW5kZWYJY2FycnkxCisjZW5kaWYKKworI2lmIDEKKy8vCisvLyBCTl9VTE9ORyBibl9kaXZfd29yZHMoQk5fVUxPTkcgaCwgQk5fVUxPTkcgbCwgQk5fVUxPTkcgZCkKKy8vCisvLyBJbiB0aGUgbnV0c2hlbGwgaXQncyBhIHBvcnQgb2YgbXkgTUlQUyBJSUkvSVYgaW1wbGVtZW50YXRpb24uCisvLworI2RlZmluZQlBVAlyMTQKKyNkZWZpbmUJSAlyMTYKKyNkZWZpbmUJSEgJcjIwCisjZGVmaW5lCUwJcjE3CisjZGVmaW5lCUQJcjE4CisjZGVmaW5lCURICXIyMgorI2RlZmluZQlJCXIyMQorCisjaWYgMAorLy8gU29tZSBwcmVwcm9jZXNzb3JzIChtb3N0IG5vdGFibHkgSFAtVVgpIGFwcGVhciB0byBiZSBhbGxlcmdpYyB0bworLy8gbWFjcm9zIGVuY2xvc2VkIHRvIHBhcmVudGhlc2lzIFthcyB0aGVzZSB0aHJlZSB3ZXJlXS4KKyNkZWZpbmUJY29udAlwMTYKKyNkZWZpbmUJYnJlYWsJcDAJLy8gcDIwCisjZGVmaW5lCWVxdQlwMjQKKyNlbHNlCitjb250PXAxNgorYnJlYWs9cDAKK2VxdT1wMjQKKyNlbmRpZgorCisuZ2xvYmFsCWFib3J0IworLmdsb2JhbAlibl9kaXZfd29yZHMjCisucHJvYwlibl9kaXZfd29yZHMjCisuYWxpZ24JNjQKK2JuX2Rpdl93b3JkczoKKwkucHJvbG9ndWUKKwkuc2F2ZQlhci5wZnMscjIKK3sgLm1paTsJYWxsb2MJCXIyPWFyLnBmcywzLDUsMCw4CisJLnNhdmUJYjAscjMKKwltb3YJCXIzPWIwCisJLnNhdmUJcHIscjEwCisJbW92CQlyMTA9cHIJCX07OworeyAubW1iOwljbXAuZXEJCXA2LHAwPXIzNCxyMAorCW1vdgkJcjg9LTEKKyhwNikJYnIucmV0LnNwbnQubWFueQliMAl9OzsKKworCS5ib2R5Cit7IC5taWk7CW1vdgkJSD1yMzIJCS8vIHNhdmUgaAorCW1vdgkJYXIuZWM9MAkJLy8gZG9uJ3Qgcm90YXRlIGF0IGV4aXQKKwltb3YJCXByLnJvdD0wCX0KK3sgLm1paTsJbW92CQlMPXIzMwkJLy8gc2F2ZSBsCisJbW92CQlyMzY9cjAJCX07OworCisuTF9kaXZ3X3NoaWZ0OgkvLyAtdnYtIG5vdGUgc2lnbmVkIGNvbXBhcmlzb24KK3sgLm1maTsJKHAwKQljbXAubHQJCXAxNixwMD1yMCxyMzQJLy8gZAorCShwMCkJc2hsYWRkCQlyMzM9cjM0LDEscjAJfQoreyAubWZiOwkocDApCWFkZAkJcjM1PTEscjM2CisJKHAwKQlub3AuZgkJMHgwCisocDE2KQlici53dG9wLmRwbnQJCS5MX2Rpdndfc2hpZnQJfTs7CisKK3sgLm1paTsJbW92CQlEPXIzNAorCXNoci51CQlESD1yMzQsMzIKKwlzdWIJCXIzNT02NCxyMzYJCX07OworeyAubWlpOwlzZXRmLnNpZwlmNz1ESAorCXNoci51CQlBVD1ILHIzNQorCW1vdgkJST1yMzYJCQl9OzsKK3sgLm1pYjsJY21wLm5lCQlwNixwMD1yMCxBVAorCXNobAkJSD1ILHIzNgorKHA2KQlici5jYWxsLnNwbnQuY2xyCWIwPWFib3J0CX07OwkvLyBvdmVyZmxvdywgZGllLi4uCisKK3sgLm1maTsJZmN2dC54dWYuczEJZjc9ZjcKKwlzaHIudQkJQVQ9TCxyMzUJCX07OworeyAubWlpOwlzaGwJCUw9TCxyMzYKKwlvcgkJSD1ILEFUCQkJfTs7CisKK3sgLm1paTsJbm9wLm0JCTB4MAorCWNtcC5sZXUJCXA2LHAwPUQsSDs7CisocDYpCXN1YgkJSD1ILEQJCQl9CisKK3sgLm1seDsJc2V0Zi5zaWcJZjE0PUQKKwltb3ZsCQlBVD0weGZmZmZmZmZmCQl9OzsKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit7IC5taWk7CXNldGYuc2lnCWY2PUgKKwlzaHIudQkJSEg9SCwzMjs7CisJY21wLmVxCQlwNixwNz1ISCxESAkJfTs7Cit7IC5tZmI7CisocDYpCXNldGYuc2lnCWY4PUFUCisocDcpCWZjdnQueHVmLnMxCWY2PWY2CisocDcpCWJyLmNhbGwuc3B0awliNj0uTF91ZGl2NjRfMzJfYjYJfTs7CisKK3sgLm1maTsJZ2V0Zi5zaWcJcjMzPWY4CQkJCS8vIHEKKwl4bXB5Lmx1CQlmOT1mOCxmMTQJCX0KK3sgLm1maTsJeG1weS5odQkJZjEwPWY4LGYxNAorCXNocnAJCUg9SCxMLDMyCQl9OzsKKworeyAubW1pOwlnZXRmLnNpZwlyMzU9ZjkJCQkJLy8gdGwKKwlnZXRmLnNpZwlyMzE9ZjEwCQkJfTs7CS8vIHRoCisKKy5MX2RpdndfMXN0X2l0ZXI6Cit7IC5taWk7CShwMCkJYWRkCQlyMzI9LTEscjMzCisJKHAwKQljbXAuZXEJCWVxdSxjb250PUhILHIzMQkJfTs7Cit7IC5taWk7CShwMCkJY21wLmx0dQkJcDgscDA9cjM1LEQKKwkocDApCXN1YgkJcjM0PXIzNSxECisJKGVxdSkJY21wLmxldQkJYnJlYWssY29udD1yMzUsSAl9OzsKK3sgLm1pYjsJKGNvbnQpCWNtcC5sZXUJCWNvbnQsYnJlYWs9SEgscjMxCisJKHA4KQlhZGQJCXIzMT0tMSxyMzEKKyhjb250KQlici53dG9wLnNwbnQJCS5MX2RpdndfMXN0X2l0ZXIJfTs7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworeyAubWlpOwlzdWIJCUg9SCxyMzUKKwlzaGwJCXI4PXIzMywzMgorCXNobAkJTD1MLDMyCQkJfTs7CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworeyAubWlpOwlzZXRmLnNpZwlmNj1ICisJc2hyLnUJCUhIPUgsMzI7OworCWNtcC5lcQkJcDYscDc9SEgsREgJCX07OworeyAubWZiOworKHA2KQlzZXRmLnNpZwlmOD1BVAorKHA3KQlmY3Z0Lnh1Zi5zMQlmNj1mNgorKHA3KQlici5jYWxsLnNwdGsJYjY9LkxfdWRpdjY0XzMyX2I2CX07OworCit7IC5tZmk7CWdldGYuc2lnCXIzMz1mOAkJCQkvLyBxCisJeG1weS5sdQkJZjk9ZjgsZjE0CQl9Cit7IC5tZmk7CXhtcHkuaHUJCWYxMD1mOCxmMTQKKwlzaHJwCQlIPUgsTCwzMgkJfTs7CisKK3sgLm1taTsJZ2V0Zi5zaWcJcjM1PWY5CQkJCS8vIHRsCisJZ2V0Zi5zaWcJcjMxPWYxMAkJCX07OwkvLyB0aAorCisuTF9kaXZ3XzJuZF9pdGVyOgoreyAubWlpOwkocDApCWFkZAkJcjMyPS0xLHIzMworCShwMCkJY21wLmVxCQllcXUsY29udD1ISCxyMzEJCX07OworeyAubWlpOwkocDApCWNtcC5sdHUJCXA4LHAwPXIzNSxECisJKHAwKQlzdWIJCXIzND1yMzUsRAorCShlcXUpCWNtcC5sZXUJCWJyZWFrLGNvbnQ9cjM1LEgJfTs7Cit7IC5taWI7CShjb250KQljbXAubGV1CQljb250LGJyZWFrPUhILHIzMQorCShwOCkJYWRkCQlyMzE9LTEscjMxCisoY29udCkJYnIud3RvcC5zcG50CQkuTF9kaXZ3XzJuZF9pdGVyCX07OworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3sgLm1paTsJc3ViCUg9SCxyMzUKKwlvcglyOD1yOCxyMzMKKwltb3YJYXIucGZzPXIyCQl9OzsKK3sgLm1paTsJc2hyLnUJcjk9SCxJCQkJLy8gcmVtYWluZGVyIGlmIGFueWJvZHkgd2FudHMgaXQKKwltb3YJcHI9cjEwLDB4MWZmZmYJCX0KK3sgLm1mYjsJYnIucmV0LnNwdGsubWFueQliMAl9OzsKKworLy8gVW5zaWduZWQgNjQgYnkgMzIgKHdlbGwsIGJ5IDY0IGZvciB0aGUgbW9tZW50KSBiaXQgaW50ZWdlciBkaXZpc2lvbgorLy8gcHJvY2VkdXJlLgorLy8KKy8vIGlucHV0czoJZjYgPSAoZG91YmxlKWEsIGY3ID0gKGRvdWJsZSliCisvLyBvdXRwdXQ6CWY4ID0gKGludCkoYS9iKQorLy8gY2xvYmJlcmVkOglmOCxmOSxmMTAsZjExLHByZWQKK3ByZWQ9cDE1CisvLyBPbmUgY2FuIGFyZ3VlIHRoYXQgdGhpcyBzbmlwcGV0IGlzIGNvcHlyaWdodGVkIHRvIEludGVsCisvLyBDb3Jwb3JhdGlvbiwgYXMgaXQncyBlc3NlbnRpYWxseSBpZGVudGljYWwgdG8gb25lIG9mIHRob3NlCisvLyBmb3VuZCBpbiAiRGl2aWRlLCBTcXVhcmUgUm9vdCBhbmQgUmVtYWluZGVyIiBzZWN0aW9uIGF0CisvLyBodHRwOi8vd3d3LmludGVsLmNvbS9zb2Z0d2FyZS9wcm9kdWN0cy9vcGVuc291cmNlL2xpYnJhcmllcy9udW0uaHRtLgorLy8gWWVzLCBJIGFkbWl0IHRoYXQgdGhlIHJlZmVycmVkIGNvZGUgd2FzIHVzZWQgYXMgdGVtcGxhdGUsCisvLyBidXQgYWZ0ZXIgSSByZWFsaXplZCB0aGF0IHRoZXJlIGhhcmRseSBpcyBhbnkgb3RoZXIgaW5zdHJ1Y3Rpb24KKy8vIHNlcXVlbmNlIHdoaWNoIHdvdWxkIHBlcmZvcm0gdGhpcyBvcGVyYXRpb24uIEkgbWVhbiBJIGZpZ3VyZSB0aGF0CisvLyBhbnkgaW5kZXBlbmRlbnQgYXR0ZW1wdCB0byBpbXBsZW1lbnQgaGlnaC1wZXJmb3JtYW5jZSBkaXZpc2lvbgorLy8gd2lsbCByZXN1bHQgaW4gY29kZSB2aXJ0dWFsbHkgaWRlbnRpY2FsIHRvIHRoZSBJbnRlbCBjb2RlLiBJdAorLy8gc2hvdWxkIGJlIG5vdGVkIHRob3VnaCB0aGF0IGJlbG93IGRpdmlzaW9uIGtlcm5lbCBpcyAxIGN5Y2xlCisvLyBmYXN0ZXIgdGhhbiBJbnRlbCBvbmUgKG5vdGUgY29tbWVudGVkIHNwbGl0czotKSwgbm90IHRvIG1lbnRpb24KKy8vIG9yaWdpbmFsIHByb2xvZ3VlIChyYXRoZXIgbGFjayBvZiBvbmUpIGFuZCBlcGlsb2d1ZS4KKy5hbGlnbgkzMgorLnNraXAJMTYKKy5MX3VkaXY2NF8zMl9iNjoKKwlmcmNwYS5zMQlmOCxwcmVkPWY2LGY3OzsJCS8vIFswXSAgeTAgPSAxIC8gYgorCisocHJlZCkJZm5tYS5zMQkJZjk9ZjcsZjgsZjEJCS8vIFs1XSAgZTAgPSAxIC0gYiAqIHkwCisocHJlZCkJZm1weS5zMQkJZjEwPWY2LGY4OzsJCS8vIFs1XSAgcTAgPSBhICogeTAKKyhwcmVkKQlmbXB5LnMxCQlmMTE9ZjksZjkJCS8vIFsxMF0gZTEgPSBlMCAqIGUwCisocHJlZCkJZm1hLnMxCQlmMTA9ZjksZjEwLGYxMDs7CS8vIFsxMF0gcTEgPSBxMCArIGUwICogcTAKKyhwcmVkKQlmbWEuczEJCWY4PWY5LGY4LGY4CS8vOzsJLy8gWzE1XSB5MSA9IHkwICsgZTAgKiB5MAorKHByZWQpCWZtYS5zMQkJZjk9ZjExLGYxMCxmMTA7OwkvLyBbMTVdIHEyID0gcTEgKyBlMSAqIHExCisocHJlZCkJZm1hLnMxCQlmOD1mMTEsZjgsZjgJLy87OwkvLyBbMjBdIHkyID0geTEgKyBlMSAqIHkxCisocHJlZCkJZm5tYS5zMQkJZjEwPWY3LGY5LGY2OzsJCS8vIFsyMF0gcjIgPSBhIC0gYiAqIHEyCisocHJlZCkJZm1hLnMxCQlmOD1mMTAsZjgsZjk7OwkJLy8gWzI1XSBxMyA9IHEyICsgcjIgKiB5MgorCisJZmN2dC5meHUudHJ1bmMuczEJZjg9ZjgJCS8vIFszMF0gcSA9IHRydW5jKHEzKQorCWJyLnJldC5zcHRrLm1hbnkJYjY7OworLmVuZHAJYm5fZGl2X3dvcmRzIworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL21pcHMzLW1vbnQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL21pcHMzLW1vbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5MTU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vbWlwczMtbW9udC5wbApAQCAtMCwwICsxLDMyNyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBUaGlzIG1vZHVsZSBkb2Vzbid0IHByZXNlbnQgZGlyZWN0IGludGVyZXN0IGZvciBPcGVuU1NMLCBiZWNhdXNlIGl0CisjIGRvZXNuJ3QgcHJvdmlkZSBiZXR0ZXIgcGVyZm9ybWFuY2UgZm9yIGxvbmdlciBrZXlzLiBXaGlsZSA1MTItYml0CisjIFJTQSBwcml2YXRlIGtleSBvcGVyYXRpb25zIGFyZSA0MCUgZmFzdGVyLCAxMDI0LWJpdCBvbmVzIGFyZSBoYXJkbHkKKyMgZmFzdGVyIGF0IGFsbCwgd2hpbGUgbG9uZ2VyIGtleSBvcGVyYXRpb25zIGFyZSBzbG93ZXIgYnkgdXAgdG8gMjAlLgorIyBJdCBtaWdodCBiZSBvZiBpbnRlcmVzdCB0byBlbWJlZGRlZCBzeXN0ZW0gZGV2ZWxvcGVycyB0aG91Z2gsIGFzCisjIGl0J3Mgc21hbGxlciB0aGFuIDFLQiwgeWV0IG9mZmVycyB+M3ggaW1wcm92ZW1lbnQgb3ZlciBjb21waWxlcgorIyBnZW5lcmF0ZWQgY29kZS4KKyMKKyMgVGhlIG1vZHVsZSB0YXJnZXRzIE4zMiBhbmQgTjY0IE1JUFMgQUJJcyBhbmQgY3VycmVudGx5IGlzIGEgYml0CisjIElSSVgtY2VudHJpYywgaS5lLiBpcyBsaWtlbHkgdG8gcmVxdWlyZSBhZGFwdGF0aW9uIGZvciBvdGhlciBPU2VzLgorCisjIGludCBibl9tdWxfbW9udCgKKyRycD0iYTAiOwkjIEJOX1VMT05HICpycCwKKyRhcD0iYTEiOwkjIGNvbnN0IEJOX1VMT05HICphcCwKKyRicD0iYTIiOwkjIGNvbnN0IEJOX1VMT05HICpicCwKKyRucD0iYTMiOwkjIGNvbnN0IEJOX1VMT05HICpucCwKKyRuMD0iYTQiOwkjIGNvbnN0IEJOX1VMT05HICpuMCwKKyRudW09ImE1IjsJIyBpbnQgbnVtKTsKKworJGxvMD0iYTYiOworJGhpMD0iYTciOworJGxvMT0idjAiOworJGhpMT0idjEiOworJGFqPSJ0MCI7CiskYmk9InQxIjsKKyRuaj0idDIiOworJHRwPSJ0MyI7CiskYWxvPSJzMCI7CiskYWhpPSJzMSI7CiskbmxvPSJzMiI7CiskbmhpPSJzMyI7CiskdGo9InM0IjsKKyRpPSJzNSI7Ciskaj0iczYiOworJGZwPSJ0OCI7CiskbTE9InQ5IjsKKworJEZSQU1FPTgqKDIrOCk7CisKKyRjb2RlPTw8X19fOworI2luY2x1ZGUgPGFzbS5oPgorI2luY2x1ZGUgPHJlZ2RlZi5oPgorCisudGV4dAorCisuc2V0CW5vYXQKKy5zZXQJcmVvcmRlcgorCisuYWxpZ24JNQorLmdsb2JsCWJuX211bF9tb250CisuZW50CWJuX211bF9tb250Citibl9tdWxfbW9udDoKKwkuc2V0CW5vcmVvcmRlcgorCVBUUl9TVUIJc3AsNjQKKwltb3ZlCSRmcCxzcAorCS5mcmFtZQkkZnAsNjQscmEKKwlzbHQJQVQsJG51bSw0CisJbGkJdjAsMAorCWJlcXpsCUFULC5McHJvY2VlZAorCW5vcAorCWpyCXJhCisJUFRSX0FERAlzcCwkZnAsNjQKKwkuc2V0CXJlb3JkZXIKKy5hbGlnbgk1CisuTHByb2NlZWQ6CisJbGQJJG4wLDAoJG4wKQorCWxkCSRiaSwwKCRicCkJIyBicFswXQorCWxkCSRhaiwwKCRhcCkJIyBhcFswXQorCWxkCSRuaiwwKCRucCkJIyBucFswXQorCVBUUl9TVUIJc3AsMTYJCSMgcGxhY2UgZm9yIHR3byBleHRyYSB3b3JkcworCXNsbAkkbnVtLDMKKwlsaQlBVCwtNDA5NgorCVBUUl9TVUIJc3AsJG51bQorCWFuZAlzcCxBVAorCisJc2QJczAsMCgkZnApCisJc2QJczEsOCgkZnApCisJc2QJczIsMTYoJGZwKQorCXNkCXMzLDI0KCRmcCkKKwlzZAlzNCwzMigkZnApCisJc2QJczUsNDAoJGZwKQorCXNkCXM2LDQ4KCRmcCkKKwlzZAlzNyw1NigkZnApCisKKwlkbXVsdHUJJGFqLCRiaQorCWxkCSRhbG8sOCgkYXApCisJbGQJJG5sbyw4KCRucCkKKwltZmxvCSRsbzAKKwltZmhpCSRoaTAKKwlkbXVsdHUJJGxvMCwkbjAKKwltZmxvCSRtMQorCisJZG11bHR1CSRhbG8sJGJpCisJbWZsbwkkYWxvCisJbWZoaQkkYWhpCisKKwlkbXVsdHUJJG5qLCRtMQorCW1mbG8JJGxvMQorCW1maGkJJGhpMQorCWRtdWx0dQkkbmxvLCRtMQorCWRhZGR1CSRsbzEsJGxvMAorCXNsdHUJQVQsJGxvMSwkbG8wCisJZGFkZHUJJGhpMSxBVAorCW1mbG8JJG5sbworCW1maGkJJG5oaQorCisJbW92ZQkkdHAsc3AKKwlsaQkkaiwxNgorLmFsaWduCTQKKy5MMXN0OgorCS5zZXQJbm9yZW9yZGVyCisJUFRSX0FERAkkYWosJGFwLCRqCisJbGQJJGFqLCgkYWopCisJUFRSX0FERAkkbmosJG5wLCRqCisJbGQJJG5qLCgkbmopCisKKwlkbXVsdHUJJGFqLCRiaQorCWRhZGR1CSRsbzAsJGFsbywkaGkwCisJZGFkZHUJJGxvMSwkbmxvLCRoaTEKKwlzbHR1CUFULCRsbzAsJGhpMAorCXNsdHUJczcsJGxvMSwkaGkxCisJZGFkZHUJJGhpMCwkYWhpLEFUCisJZGFkZHUJJGhpMSwkbmhpLHM3CisJbWZsbwkkYWxvCisJbWZoaQkkYWhpCisKKwlkYWRkdQkkbG8xLCRsbzAKKwlzbHR1CUFULCRsbzEsJGxvMAorCWRtdWx0dQkkbmosJG0xCisJZGFkZHUJJGhpMSxBVAorCWFkZHUJJGosOAorCXNkCSRsbzEsKCR0cCkKKwlzbHR1CXM3LCRqLCRudW0KKwltZmxvCSRubG8KKwltZmhpCSRuaGkKKworCWJuZXoJczcsLkwxc3QKKwlQVFJfQURECSR0cCw4CisJLnNldAlyZW9yZGVyCisKKwlkYWRkdQkkbG8wLCRhbG8sJGhpMAorCXNsdHUJQVQsJGxvMCwkaGkwCisJZGFkZHUJJGhpMCwkYWhpLEFUCisKKwlkYWRkdQkkbG8xLCRubG8sJGhpMQorCXNsdHUJczcsJGxvMSwkaGkxCisJZGFkZHUJJGhpMSwkbmhpLHM3CisJZGFkZHUJJGxvMSwkbG8wCisJc2x0dQlBVCwkbG8xLCRsbzAKKwlkYWRkdQkkaGkxLEFUCisKKwlzZAkkbG8xLCgkdHApCisKKwlkYWRkdQkkaGkxLCRoaTAKKwlzbHR1CUFULCRoaTEsJGhpMAorCXNkCSRoaTEsOCgkdHApCisJc2QJQVQsMTYoJHRwKQorCisJbGkJJGksOAorLmFsaWduCTQKKy5Mb3V0ZXI6CisJUFRSX0FERAkkYmksJGJwLCRpCisJbGQJJGJpLCgkYmkpCisJbGQJJGFqLCgkYXApCisJbGQJJGFsbyw4KCRhcCkKKwlsZAkkdGosKHNwKQorCisJZG11bHR1CSRhaiwkYmkKKwlsZAkkbmosKCRucCkKKwlsZAkkbmxvLDgoJG5wKQorCW1mbG8JJGxvMAorCW1maGkJJGhpMAorCWRhZGR1CSRsbzAsJHRqCisJZG11bHR1CSRsbzAsJG4wCisJc2x0dQlBVCwkbG8wLCR0agorCWRhZGR1CSRoaTAsQVQKKwltZmxvCSRtMQorCisJZG11bHR1CSRhbG8sJGJpCisJbWZsbwkkYWxvCisJbWZoaQkkYWhpCisKKwlkbXVsdHUJJG5qLCRtMQorCW1mbG8JJGxvMQorCW1maGkJJGhpMQorCisJZG11bHR1CSRubG8sJG0xCisJZGFkZHUJJGxvMSwkbG8wCisJc2x0dQlBVCwkbG8xLCRsbzAKKwlkYWRkdQkkaGkxLEFUCisJbWZsbwkkbmxvCisJbWZoaQkkbmhpCisKKwltb3ZlCSR0cCxzcAorCWxpCSRqLDE2CisJbGQJJHRqLDgoJHRwKQorLmFsaWduCTQKKy5MaW5uZXI6CisJLnNldAlub3Jlb3JkZXIKKwlQVFJfQURECSRhaiwkYXAsJGoKKwlsZAkkYWosKCRhaikKKwlQVFJfQURECSRuaiwkbnAsJGoKKwlsZAkkbmosKCRuaikKKworCWRtdWx0dQkkYWosJGJpCisJZGFkZHUJJGxvMCwkYWxvLCRoaTAKKwlkYWRkdQkkbG8xLCRubG8sJGhpMQorCXNsdHUJQVQsJGxvMCwkaGkwCisJc2x0dQlzNywkbG8xLCRoaTEKKwlkYWRkdQkkaGkwLCRhaGksQVQKKwlkYWRkdQkkaGkxLCRuaGksczcKKwltZmxvCSRhbG8KKwltZmhpCSRhaGkKKworCWRhZGR1CSRsbzAsJHRqCisJYWRkdQkkaiw4CisJZG11bHR1CSRuaiwkbTEKKwlzbHR1CUFULCRsbzAsJHRqCisJZGFkZHUJJGxvMSwkbG8wCisJZGFkZHUJJGhpMCxBVAorCXNsdHUJczcsJGxvMSwkbG8wCisJbGQJJHRqLDE2KCR0cCkKKwlkYWRkdQkkaGkxLHM3CisJc2x0dQlBVCwkaiwkbnVtCisJbWZsbwkkbmxvCisJbWZoaQkkbmhpCisJc2QJJGxvMSwoJHRwKQorCWJuZXoJQVQsLkxpbm5lcgorCVBUUl9BREQJJHRwLDgKKwkuc2V0CXJlb3JkZXIKKworCWRhZGR1CSRsbzAsJGFsbywkaGkwCisJc2x0dQlBVCwkbG8wLCRoaTAKKwlkYWRkdQkkaGkwLCRhaGksQVQKKwlkYWRkdQkkbG8wLCR0agorCXNsdHUJczcsJGxvMCwkdGoKKwlkYWRkdQkkaGkwLHM3CisKKwlsZAkkdGosMTYoJHRwKQorCWRhZGR1CSRsbzEsJG5sbywkaGkxCisJc2x0dQlBVCwkbG8xLCRoaTEKKwlkYWRkdQkkaGkxLCRuaGksQVQKKwlkYWRkdQkkbG8xLCRsbzAKKwlzbHR1CXM3LCRsbzEsJGxvMAorCWRhZGR1CSRoaTEsczcKKwlzZAkkbG8xLCgkdHApCisKKwlkYWRkdQkkbG8xLCRoaTEsJGhpMAorCXNsdHUJJGhpMSwkbG8xLCRoaTAKKwlkYWRkdQkkbG8xLCR0agorCXNsdHUJQVQsJGxvMSwkdGoKKwlkYWRkdQkkaGkxLEFUCisJc2QJJGxvMSw4KCR0cCkKKwlzZAkkaGkxLDE2KCR0cCkKKworCWFkZHUJJGksOAorCXNsdHUJczcsJGksJG51bQorCWJuZXoJczcsLkxvdXRlcgorDAorCS5zZXQJbm9yZW9yZGVyCisJUFRSX0FERAkkdGosc3AsJG51bQkjICZ0cFtudW1dCisJbW92ZQkkdHAsc3AKKwltb3ZlCSRhcCxzcAorCWxpCSRoaTAsMAkJIyBjbGVhciBib3Jyb3cgYml0CisKKy5hbGlnbgk0CisuTHN1YjoJbGQJJGxvMCwoJHRwKQorCWxkCSRsbzEsKCRucCkKKwlQVFJfQURECSR0cCw4CisJUFRSX0FERAkkbnAsOAorCWRzdWJ1CSRsbzEsJGxvMCwkbG8xCSMgdHBbaV0tbnBbaV0KKwlzZ3R1CUFULCRsbzEsJGxvMAorCWRzdWJ1CSRsbzAsJGxvMSwkaGkwCisJc2d0dQkkaGkwLCRsbzAsJGxvMQorCXNkCSRsbzAsKCRycCkKKwlvcgkkaGkwLEFUCisJc2x0dQlBVCwkdHAsJHRqCisJYm5leglBVCwuTHN1YgorCVBUUl9BREQJJHJwLDgKKworCWRzdWJ1CSRoaTAsJGhpMSwkaGkwCSMgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwltb3ZlCSR0cCxzcAorCVBUUl9TVUIJJHJwLCRudW0JIyByZXN0b3JlIHJwCisJbm90CSRoaTEsJGhpMAorCisJYW5kCSRhcCwkaGkwLHNwCisJYW5kCSRicCwkaGkxLCRycAorCW9yCSRhcCwkYXAsJGJwCSMgYXA9Ym9ycm93P3RwOnJwCisKKy5hbGlnbgk0CisuTGNvcHk6CWxkCSRhaiwoJGFwKQorCVBUUl9BREQJJGFwLDgKKwlQVFJfQURECSR0cCw4CisJc2QJemVybywtOCgkdHApCisJc2x0dQlBVCwkdHAsJHRqCisJc2QJJGFqLCgkcnApCisJYm5leglBVCwuTGNvcHkKKwlQVFJfQURECSRycCw4CisKKwlsZAlzMCwwKCRmcCkKKwlsZAlzMSw4KCRmcCkKKwlsZAlzMiwxNigkZnApCisJbGQJczMsMjQoJGZwKQorCWxkCXM0LDMyKCRmcCkKKwlsZAlzNSw0MCgkZnApCisJbGQJczYsNDgoJGZwKQorCWxkCXM3LDU2KCRmcCkKKwlsaQl2MCwxCisJanIJcmEKKwlQVFJfQURECXNwLCRmcCw2NAorCS5zZXQJcmVvcmRlcgorRU5EKGJuX211bF9tb250KQorLnJkYXRhCisuYXNjaWl6CSJNb250Z29tZXJ5IE11bHRpcGxpY2F0aW9uIGZvciBNSVBTIElJSS9JViwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworCitwcmludCAkY29kZTsKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vbWlwczMucyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vbWlwczMucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E0MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9taXBzMy5zCkBAIC0wLDAgKzEsMjIwMSBAQAorLnJkYXRhCisuYXNjaWl6CSJtaXBzMy5zLCBWZXJzaW9uIDEuMSIKKy5hc2NpaXoJIk1JUFMgSUlJL0lWIElTQSBhcnR3b3JrIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiIKKworLyoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuCisgKgorICogUmlnaHRzIGZvciByZWRpc3RyaWJ1dGlvbiBhbmQgdXNhZ2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlCisgKiBncmFudGVkIGFjY29yZGluZyB0byB0aGUgT3BlblNTTCBsaWNlbnNlLiBXYXJyYW50eSBvZiBhbnkga2luZCBpcworICogZGlzY2xhaW1lZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyoKKyAqIFRoaXMgaXMgbXkgbW9kZXN0IGNvbnRyaWJ1dG9uIHRvIHRoZSBPcGVuU1NMIHByb2plY3QgKHNlZQorICogaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaXQpIGFuZCBpcworICogYSBkcm9wLWluIE1JUFMgSUlJL0lWIElTQSByZXBsYWNlbWVudCBmb3IgY3J5cHRvL2JuL2JuX2FzbS5jCisgKiBtb2R1bGUuIEZvciB1cGRhdGVzIHNlZSBodHRwOi8vZnkuY2hhbG1lcnMuc2UvfmFwcHJvL2hwZS8uCisgKgorICogVGhlIG1vZHVsZSBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggZWl0aGVyIG9mIHRoZSAibmV3IiBNSVBTIEFCSSg1KSwKKyAqIG5hbWVseSBOMzIgb3IgTjY0LCBvZmZlcmVkIGJ5IElSSVggNi54LiBJdCdzIG5vdCBtZW50IHRvIHdvcmsgdW5kZXIKKyAqIElSSVggNS54IG5vdCBvbmx5IGJlY2F1c2UgaXQgZG9lc24ndCBzdXBwb3J0IG5ldyBBQklzIGJ1dCBhbHNvCisgKiBiZWNhdXNlIDUueCBrZXJuZWxzIHB1dCBSNHgwMCBDUFUgaW50byAzMi1iaXQgbW9kZSBhbmQgYWxsIHRob3NlCisgKiA2NC1iaXQgaW5zdHJ1Y3Rpb25zIChkYWRkdSwgZG11bHR1LCBldGMuKSBmb3VuZCBiZWxvdyBnb25uYSBvbmx5CisgKiBjYXVzZSBpbGxlZ2FsIGluc3RydWN0aW9uIGV4Y2VwdGlvbjotKAorICoKKyAqIEluIGFkZGl0aW9uIHRoZSBjb2RlIGRlcGVuZHMgb24gcHJlcHJvY2Vzc29yIGZsYWdzIHNldCB1cCBieSBNSVBTcHJvCisgKiBjb21waWxlciBkcml2ZXIgKGVpdGhlciBhcyBvciBjYykgYW5kIHRoZXJlZm9yZSAocHJvYmFibHk/KSBjYW4ndCBiZQorICogY29tcGlsZWQgYnkgdGhlIEdOVSBhc3NlbWJsZXIuIEdOVSBDIGRyaXZlciBtYW5hZ2VzIGZpbmUgdGhvdWdoLi4uCisgKiBJIG1lYW4gYXMgbG9uZyBhcyAtbW1pcHMtYXMgaXMgc3BlY2lmaWVkIG9yIGlzIHRoZSBkZWZhdWx0IG9wdGlvbiwKKyAqIGJlY2F1c2UgdGhlbiBpdCBzaW1wbHkgaW52b2tlcyAvdXNyL2Jpbi9hcyB3aGljaCBpbiB0dXJuIHRha2VzCisgKiBwZXJmZWN0IGNhcmUgb2YgdGhlIHByZXByb2Nlc3NvciBkZWZpbml0aW9ucy4gQW5vdGhlciBuZWF0IGZlYXR1cmUKKyAqIG9mZmVyZWQgYnkgdGhlIE1JUFNwcm8gYXNzZW1ibGVyIGlzIGFuIG9wdGltaXphdGlvbiBwYXNzLiBUaGlzIGdhdmUKKyAqIG1lIHRoZSBvcHBvcnR1bml0eSB0byBoYXZlIHRoZSBjb2RlIGxvb2tpbmcgbW9yZSByZWd1bGFyIGFzIGFsbCB0aG9zZQorICogYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBpbnN0cnVjdGlvbiByZXNjaGVkdWxpbmcgZGV0YWlscyB3ZXJlIGxlZnQgdG8KKyAqIHRoZSBhc3NlbWJsZXIuIENvb2wsIGh1aD8KKyAqCisgKiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpcyBhc3RvbmlzaGluZyEgJ2FwcHMvb3BlbnNzbCBzcGVlZCByc2EgZHNhJworICogZ29lcyB3YXkgb3ZlciAzIHRpbWVzIGZhc3RlciEKKyAqCisgKgkJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorICovCisjaW5jbHVkZSA8YXNtLmg+CisjaW5jbHVkZSA8cmVnZGVmLmg+CisKKyNpZiBfTUlQU19JU0E+PTQKKyNkZWZpbmUJTU9WTlooY29uZCxkc3Qsc3JjKQlcCisJbW92bglkc3Qsc3JjLGNvbmQKKyNlbHNlCisjZGVmaW5lCU1PVk5aKGNvbmQsZHN0LHNyYykJXAorCS5zZXQJbm9yZW9yZGVyOwlcCisJYm5lemwJY29uZCwuKzg7CVwKKwltb3ZlCWRzdCxzcmM7CVwKKwkuc2V0CXJlb3JkZXIKKyNlbmRpZgorCisudGV4dAorCisuc2V0CW5vYXQKKy5zZXQJcmVvcmRlcgorCisjZGVmaW5lCU1JTlVTNAl2MQorCisuYWxpZ24JNQorTEVBRihibl9tdWxfYWRkX3dvcmRzKQorCS5zZXQJbm9yZW9yZGVyCisJYmd0emwJYTIsLkxfYm5fbXVsX2FkZF93b3Jkc19wcm9jZWVkCisJbGQJdDAsMChhMSkKKwlqcglyYQorCW1vdmUJdjAsemVybworCS5zZXQJcmVvcmRlcgorCisuTF9ibl9tdWxfYWRkX3dvcmRzX3Byb2NlZWQ6CisJbGkJTUlOVVM0LC00CisJYW5kCXRhMCxhMixNSU5VUzQKKwltb3ZlCXYwLHplcm8KKwliZXF6CXRhMCwuTF9ibl9tdWxfYWRkX3dvcmRzX3RhaWwKKworLkxfYm5fbXVsX2FkZF93b3Jkc19sb29wOgorCWRtdWx0dQl0MCxhMworCWxkCXQxLDAoYTApCisJbGQJdDIsOChhMSkKKwlsZAl0Myw4KGEwKQorCWxkCXRhMCwxNihhMSkKKwlsZAl0YTEsMTYoYTApCisJZGFkZHUJdDEsdjAKKwlzbHR1CXYwLHQxLHYwCS8qIEFsbCBtYW51YWxzIHNheSBpdCAiY29tcGFyZXMgMzItYml0CisJCQkJICogdmFsdWVzIiwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgZmluZQorCQkJCSAqIGV2ZW4gb24gNjQtYml0IHJlZ2lzdGVycy4gKi8KKwltZmxvCUFUCisJbWZoaQl0MAorCWRhZGR1CXQxLEFUCisJZGFkZHUJdjAsdDAKKwlzbHR1CUFULHQxLEFUCisJc2QJdDEsMChhMCkKKwlkYWRkdQl2MCxBVAorCisJZG11bHR1CXQyLGEzCisJbGQJdGEyLDI0KGExKQorCWxkCXRhMywyNChhMCkKKwlkYWRkdQl0Myx2MAorCXNsdHUJdjAsdDMsdjAKKwltZmxvCUFUCisJbWZoaQl0MgorCWRhZGR1CXQzLEFUCisJZGFkZHUJdjAsdDIKKwlzbHR1CUFULHQzLEFUCisJc2QJdDMsOChhMCkKKwlkYWRkdQl2MCxBVAorCisJZG11bHR1CXRhMCxhMworCXN1YnUJYTIsNAorCVBUUl9BREQJYTAsMzIKKwlQVFJfQURECWExLDMyCisJZGFkZHUJdGExLHYwCisJc2x0dQl2MCx0YTEsdjAKKwltZmxvCUFUCisJbWZoaQl0YTAKKwlkYWRkdQl0YTEsQVQKKwlkYWRkdQl2MCx0YTAKKwlzbHR1CUFULHRhMSxBVAorCXNkCXRhMSwtMTYoYTApCisJZGFkZHUJdjAsQVQKKworCisJZG11bHR1CXRhMixhMworCWFuZAl0YTAsYTIsTUlOVVM0CisJZGFkZHUJdGEzLHYwCisJc2x0dQl2MCx0YTMsdjAKKwltZmxvCUFUCisJbWZoaQl0YTIKKwlkYWRkdQl0YTMsQVQKKwlkYWRkdQl2MCx0YTIKKwlzbHR1CUFULHRhMyxBVAorCXNkCXRhMywtOChhMCkKKwlkYWRkdQl2MCxBVAorCS5zZXQJbm9yZW9yZGVyCisJYmd0emwJdGEwLC5MX2JuX211bF9hZGRfd29yZHNfbG9vcAorCWxkCXQwLDAoYTEpCisKKwlibmV6bAlhMiwuTF9ibl9tdWxfYWRkX3dvcmRzX3RhaWwKKwlsZAl0MCwwKGExKQorCS5zZXQJcmVvcmRlcgorCisuTF9ibl9tdWxfYWRkX3dvcmRzX3JldHVybjoKKwlqcglyYQorCisuTF9ibl9tdWxfYWRkX3dvcmRzX3RhaWw6CisJZG11bHR1CXQwLGEzCisJbGQJdDEsMChhMCkKKwlzdWJ1CWEyLDEKKwlkYWRkdQl0MSx2MAorCXNsdHUJdjAsdDEsdjAKKwltZmxvCUFUCisJbWZoaQl0MAorCWRhZGR1CXQxLEFUCisJZGFkZHUJdjAsdDAKKwlzbHR1CUFULHQxLEFUCisJc2QJdDEsMChhMCkKKwlkYWRkdQl2MCxBVAorCWJlcXoJYTIsLkxfYm5fbXVsX2FkZF93b3Jkc19yZXR1cm4KKworCWxkCXQwLDgoYTEpCisJZG11bHR1CXQwLGEzCisJbGQJdDEsOChhMCkKKwlzdWJ1CWEyLDEKKwlkYWRkdQl0MSx2MAorCXNsdHUJdjAsdDEsdjAKKwltZmxvCUFUCisJbWZoaQl0MAorCWRhZGR1CXQxLEFUCisJZGFkZHUJdjAsdDAKKwlzbHR1CUFULHQxLEFUCisJc2QJdDEsOChhMCkKKwlkYWRkdQl2MCxBVAorCWJlcXoJYTIsLkxfYm5fbXVsX2FkZF93b3Jkc19yZXR1cm4KKworCWxkCXQwLDE2KGExKQorCWRtdWx0dQl0MCxhMworCWxkCXQxLDE2KGEwKQorCWRhZGR1CXQxLHYwCisJc2x0dQl2MCx0MSx2MAorCW1mbG8JQVQKKwltZmhpCXQwCisJZGFkZHUJdDEsQVQKKwlkYWRkdQl2MCx0MAorCXNsdHUJQVQsdDEsQVQKKwlzZAl0MSwxNihhMCkKKwlkYWRkdQl2MCxBVAorCWpyCXJhCitFTkQoYm5fbXVsX2FkZF93b3JkcykKKworLmFsaWduCTUKK0xFQUYoYm5fbXVsX3dvcmRzKQorCS5zZXQJbm9yZW9yZGVyCisJYmd0emwJYTIsLkxfYm5fbXVsX3dvcmRzX3Byb2NlZWQKKwlsZAl0MCwwKGExKQorCWpyCXJhCisJbW92ZQl2MCx6ZXJvCisJLnNldAlyZW9yZGVyCisKKy5MX2JuX211bF93b3Jkc19wcm9jZWVkOgorCWxpCU1JTlVTNCwtNAorCWFuZAl0YTAsYTIsTUlOVVM0CisJbW92ZQl2MCx6ZXJvCisJYmVxegl0YTAsLkxfYm5fbXVsX3dvcmRzX3RhaWwKKworLkxfYm5fbXVsX3dvcmRzX2xvb3A6CisJZG11bHR1CXQwLGEzCisJbGQJdDIsOChhMSkKKwlsZAl0YTAsMTYoYTEpCisJbGQJdGEyLDI0KGExKQorCW1mbG8JQVQKKwltZmhpCXQwCisJZGFkZHUJdjAsQVQKKwlzbHR1CXQxLHYwLEFUCisJc2QJdjAsMChhMCkKKwlkYWRkdQl2MCx0MSx0MAorCisJZG11bHR1CXQyLGEzCisJc3VidQlhMiw0CisJUFRSX0FERAlhMCwzMgorCVBUUl9BREQJYTEsMzIKKwltZmxvCUFUCisJbWZoaQl0MgorCWRhZGR1CXYwLEFUCisJc2x0dQl0Myx2MCxBVAorCXNkCXYwLC0yNChhMCkKKwlkYWRkdQl2MCx0Myx0MgorCisJZG11bHR1CXRhMCxhMworCW1mbG8JQVQKKwltZmhpCXRhMAorCWRhZGR1CXYwLEFUCisJc2x0dQl0YTEsdjAsQVQKKwlzZAl2MCwtMTYoYTApCisJZGFkZHUJdjAsdGExLHRhMAorCisKKwlkbXVsdHUJdGEyLGEzCisJYW5kCXRhMCxhMixNSU5VUzQKKwltZmxvCUFUCisJbWZoaQl0YTIKKwlkYWRkdQl2MCxBVAorCXNsdHUJdGEzLHYwLEFUCisJc2QJdjAsLTgoYTApCisJZGFkZHUJdjAsdGEzLHRhMgorCS5zZXQJbm9yZW9yZGVyCisJYmd0emwJdGEwLC5MX2JuX211bF93b3Jkc19sb29wCisJbGQJdDAsMChhMSkKKworCWJuZXpsCWEyLC5MX2JuX211bF93b3Jkc190YWlsCisJbGQJdDAsMChhMSkKKwkuc2V0CXJlb3JkZXIKKworLkxfYm5fbXVsX3dvcmRzX3JldHVybjoKKwlqcglyYQorCisuTF9ibl9tdWxfd29yZHNfdGFpbDoKKwlkbXVsdHUJdDAsYTMKKwlzdWJ1CWEyLDEKKwltZmxvCUFUCisJbWZoaQl0MAorCWRhZGR1CXYwLEFUCisJc2x0dQl0MSx2MCxBVAorCXNkCXYwLDAoYTApCisJZGFkZHUJdjAsdDEsdDAKKwliZXF6CWEyLC5MX2JuX211bF93b3Jkc19yZXR1cm4KKworCWxkCXQwLDgoYTEpCisJZG11bHR1CXQwLGEzCisJc3VidQlhMiwxCisJbWZsbwlBVAorCW1maGkJdDAKKwlkYWRkdQl2MCxBVAorCXNsdHUJdDEsdjAsQVQKKwlzZAl2MCw4KGEwKQorCWRhZGR1CXYwLHQxLHQwCisJYmVxeglhMiwuTF9ibl9tdWxfd29yZHNfcmV0dXJuCisKKwlsZAl0MCwxNihhMSkKKwlkbXVsdHUJdDAsYTMKKwltZmxvCUFUCisJbWZoaQl0MAorCWRhZGR1CXYwLEFUCisJc2x0dQl0MSx2MCxBVAorCXNkCXYwLDE2KGEwKQorCWRhZGR1CXYwLHQxLHQwCisJanIJcmEKK0VORChibl9tdWxfd29yZHMpCisKKy5hbGlnbgk1CitMRUFGKGJuX3Nxcl93b3JkcykKKwkuc2V0CW5vcmVvcmRlcgorCWJndHpsCWEyLC5MX2JuX3Nxcl93b3Jkc19wcm9jZWVkCisJbGQJdDAsMChhMSkKKwlqcglyYQorCW1vdmUJdjAsemVybworCS5zZXQJcmVvcmRlcgorCisuTF9ibl9zcXJfd29yZHNfcHJvY2VlZDoKKwlsaQlNSU5VUzQsLTQKKwlhbmQJdGEwLGEyLE1JTlVTNAorCW1vdmUJdjAsemVybworCWJlcXoJdGEwLC5MX2JuX3Nxcl93b3Jkc190YWlsCisKKy5MX2JuX3Nxcl93b3Jkc19sb29wOgorCWRtdWx0dQl0MCx0MAorCWxkCXQyLDgoYTEpCisJbGQJdGEwLDE2KGExKQorCWxkCXRhMiwyNChhMSkKKwltZmxvCXQxCisJbWZoaQl0MAorCXNkCXQxLDAoYTApCisJc2QJdDAsOChhMCkKKworCWRtdWx0dQl0Mix0MgorCXN1YnUJYTIsNAorCVBUUl9BREQJYTAsNjQKKwlQVFJfQURECWExLDMyCisJbWZsbwl0MworCW1maGkJdDIKKwlzZAl0MywtNDgoYTApCisJc2QJdDIsLTQwKGEwKQorCisJZG11bHR1CXRhMCx0YTAKKwltZmxvCXRhMQorCW1maGkJdGEwCisJc2QJdGExLC0zMihhMCkKKwlzZAl0YTAsLTI0KGEwKQorCisKKwlkbXVsdHUJdGEyLHRhMgorCWFuZAl0YTAsYTIsTUlOVVM0CisJbWZsbwl0YTMKKwltZmhpCXRhMgorCXNkCXRhMywtMTYoYTApCisJc2QJdGEyLC04KGEwKQorCisJLnNldAlub3Jlb3JkZXIKKwliZ3R6bAl0YTAsLkxfYm5fc3FyX3dvcmRzX2xvb3AKKwlsZAl0MCwwKGExKQorCisJYm5lemwJYTIsLkxfYm5fc3FyX3dvcmRzX3RhaWwKKwlsZAl0MCwwKGExKQorCS5zZXQJcmVvcmRlcgorCisuTF9ibl9zcXJfd29yZHNfcmV0dXJuOgorCW1vdmUJdjAsemVybworCWpyCXJhCisKKy5MX2JuX3Nxcl93b3Jkc190YWlsOgorCWRtdWx0dQl0MCx0MAorCXN1YnUJYTIsMQorCW1mbG8JdDEKKwltZmhpCXQwCisJc2QJdDEsMChhMCkKKwlzZAl0MCw4KGEwKQorCWJlcXoJYTIsLkxfYm5fc3FyX3dvcmRzX3JldHVybgorCisJbGQJdDAsOChhMSkKKwlkbXVsdHUJdDAsdDAKKwlzdWJ1CWEyLDEKKwltZmxvCXQxCisJbWZoaQl0MAorCXNkCXQxLDE2KGEwKQorCXNkCXQwLDI0KGEwKQorCWJlcXoJYTIsLkxfYm5fc3FyX3dvcmRzX3JldHVybgorCisJbGQJdDAsMTYoYTEpCisJZG11bHR1CXQwLHQwCisJbWZsbwl0MQorCW1maGkJdDAKKwlzZAl0MSwzMihhMCkKKwlzZAl0MCw0MChhMCkKKwlqcglyYQorRU5EKGJuX3Nxcl93b3JkcykKKworLmFsaWduCTUKK0xFQUYoYm5fYWRkX3dvcmRzKQorCS5zZXQJbm9yZW9yZGVyCisJYmd0emwJYTMsLkxfYm5fYWRkX3dvcmRzX3Byb2NlZWQKKwlsZAl0MCwwKGExKQorCWpyCXJhCisJbW92ZQl2MCx6ZXJvCisJLnNldAlyZW9yZGVyCisKKy5MX2JuX2FkZF93b3Jkc19wcm9jZWVkOgorCWxpCU1JTlVTNCwtNAorCWFuZAlBVCxhMyxNSU5VUzQKKwltb3ZlCXYwLHplcm8KKwliZXF6CUFULC5MX2JuX2FkZF93b3Jkc190YWlsCisKKy5MX2JuX2FkZF93b3Jkc19sb29wOgorCWxkCXRhMCwwKGEyKQorCXN1YnUJYTMsNAorCWxkCXQxLDgoYTEpCisJYW5kCUFULGEzLE1JTlVTNAorCWxkCXQyLDE2KGExKQorCVBUUl9BREQJYTIsMzIKKwlsZAl0MywyNChhMSkKKwlQVFJfQURECWEwLDMyCisJbGQJdGExLC0yNChhMikKKwlQVFJfQURECWExLDMyCisJbGQJdGEyLC0xNihhMikKKwlsZAl0YTMsLTgoYTIpCisJZGFkZHUJdGEwLHQwCisJc2x0dQl0OCx0YTAsdDAKKwlkYWRkdQl0MCx0YTAsdjAKKwlzbHR1CXYwLHQwLHRhMAorCXNkCXQwLC0zMihhMCkKKwlkYWRkdQl2MCx0OAorCisJZGFkZHUJdGExLHQxCisJc2x0dQl0OSx0YTEsdDEKKwlkYWRkdQl0MSx0YTEsdjAKKwlzbHR1CXYwLHQxLHRhMQorCXNkCXQxLC0yNChhMCkKKwlkYWRkdQl2MCx0OQorCisJZGFkZHUJdGEyLHQyCisJc2x0dQl0OCx0YTIsdDIKKwlkYWRkdQl0Mix0YTIsdjAKKwlzbHR1CXYwLHQyLHRhMgorCXNkCXQyLC0xNihhMCkKKwlkYWRkdQl2MCx0OAorCQorCWRhZGR1CXRhMyx0MworCXNsdHUJdDksdGEzLHQzCisJZGFkZHUJdDMsdGEzLHYwCisJc2x0dQl2MCx0Myx0YTMKKwlzZAl0MywtOChhMCkKKwlkYWRkdQl2MCx0OQorCQorCS5zZXQJbm9yZW9yZGVyCisJYmd0emwJQVQsLkxfYm5fYWRkX3dvcmRzX2xvb3AKKwlsZAl0MCwwKGExKQorCisJYm5lemwJYTMsLkxfYm5fYWRkX3dvcmRzX3RhaWwKKwlsZAl0MCwwKGExKQorCS5zZXQJcmVvcmRlcgorCisuTF9ibl9hZGRfd29yZHNfcmV0dXJuOgorCWpyCXJhCisKKy5MX2JuX2FkZF93b3Jkc190YWlsOgorCWxkCXRhMCwwKGEyKQorCWRhZGR1CXRhMCx0MAorCXN1YnUJYTMsMQorCXNsdHUJdDgsdGEwLHQwCisJZGFkZHUJdDAsdGEwLHYwCisJc2x0dQl2MCx0MCx0YTAKKwlzZAl0MCwwKGEwKQorCWRhZGR1CXYwLHQ4CisJYmVxeglhMywuTF9ibl9hZGRfd29yZHNfcmV0dXJuCisKKwlsZAl0MSw4KGExKQorCWxkCXRhMSw4KGEyKQorCWRhZGR1CXRhMSx0MQorCXN1YnUJYTMsMQorCXNsdHUJdDksdGExLHQxCisJZGFkZHUJdDEsdGExLHYwCisJc2x0dQl2MCx0MSx0YTEKKwlzZAl0MSw4KGEwKQorCWRhZGR1CXYwLHQ5CisJYmVxeglhMywuTF9ibl9hZGRfd29yZHNfcmV0dXJuCisKKwlsZAl0MiwxNihhMSkKKwlsZAl0YTIsMTYoYTIpCisJZGFkZHUJdGEyLHQyCisJc2x0dQl0OCx0YTIsdDIKKwlkYWRkdQl0Mix0YTIsdjAKKwlzbHR1CXYwLHQyLHRhMgorCXNkCXQyLDE2KGEwKQorCWRhZGR1CXYwLHQ4CisJanIJcmEKK0VORChibl9hZGRfd29yZHMpCisKKy5hbGlnbgk1CitMRUFGKGJuX3N1Yl93b3JkcykKKwkuc2V0CW5vcmVvcmRlcgorCWJndHpsCWEzLC5MX2JuX3N1Yl93b3Jkc19wcm9jZWVkCisJbGQJdDAsMChhMSkKKwlqcglyYQorCW1vdmUJdjAsemVybworCS5zZXQJcmVvcmRlcgorCisuTF9ibl9zdWJfd29yZHNfcHJvY2VlZDoKKwlsaQlNSU5VUzQsLTQKKwlhbmQJQVQsYTMsTUlOVVM0CisJbW92ZQl2MCx6ZXJvCisJYmVxeglBVCwuTF9ibl9zdWJfd29yZHNfdGFpbAorCisuTF9ibl9zdWJfd29yZHNfbG9vcDoKKwlsZAl0YTAsMChhMikKKwlzdWJ1CWEzLDQKKwlsZAl0MSw4KGExKQorCWFuZAlBVCxhMyxNSU5VUzQKKwlsZAl0MiwxNihhMSkKKwlQVFJfQURECWEyLDMyCisJbGQJdDMsMjQoYTEpCisJUFRSX0FERAlhMCwzMgorCWxkCXRhMSwtMjQoYTIpCisJUFRSX0FERAlhMSwzMgorCWxkCXRhMiwtMTYoYTIpCisJbGQJdGEzLC04KGEyKQorCXNsdHUJdDgsdDAsdGEwCisJZHN1YnUJdDAsdGEwCisJZHN1YnUJdGEwLHQwLHYwCisJc2QJdGEwLC0zMihhMCkKKwlNT1ZOWgkodDAsdjAsdDgpCisKKwlzbHR1CXQ5LHQxLHRhMQorCWRzdWJ1CXQxLHRhMQorCWRzdWJ1CXRhMSx0MSx2MAorCXNkCXRhMSwtMjQoYTApCisJTU9WTloJKHQxLHYwLHQ5KQorCisKKwlzbHR1CXQ4LHQyLHRhMgorCWRzdWJ1CXQyLHRhMgorCWRzdWJ1CXRhMix0Mix2MAorCXNkCXRhMiwtMTYoYTApCisJTU9WTloJKHQyLHYwLHQ4KQorCisJc2x0dQl0OSx0Myx0YTMKKwlkc3VidQl0Myx0YTMKKwlkc3VidQl0YTMsdDMsdjAKKwlzZAl0YTMsLTgoYTApCisJTU9WTloJKHQzLHYwLHQ5KQorCisJLnNldAlub3Jlb3JkZXIKKwliZ3R6bAlBVCwuTF9ibl9zdWJfd29yZHNfbG9vcAorCWxkCXQwLDAoYTEpCisKKwlibmV6bAlhMywuTF9ibl9zdWJfd29yZHNfdGFpbAorCWxkCXQwLDAoYTEpCisJLnNldAlyZW9yZGVyCisKKy5MX2JuX3N1Yl93b3Jkc19yZXR1cm46CisJanIJcmEKKworLkxfYm5fc3ViX3dvcmRzX3RhaWw6CisJbGQJdGEwLDAoYTIpCisJc3VidQlhMywxCisJc2x0dQl0OCx0MCx0YTAKKwlkc3VidQl0MCx0YTAKKwlkc3VidQl0YTAsdDAsdjAKKwlNT1ZOWgkodDAsdjAsdDgpCisJc2QJdGEwLDAoYTApCisJYmVxeglhMywuTF9ibl9zdWJfd29yZHNfcmV0dXJuCisKKwlsZAl0MSw4KGExKQorCXN1YnUJYTMsMQorCWxkCXRhMSw4KGEyKQorCXNsdHUJdDksdDEsdGExCisJZHN1YnUJdDEsdGExCisJZHN1YnUJdGExLHQxLHYwCisJTU9WTloJKHQxLHYwLHQ5KQorCXNkCXRhMSw4KGEwKQorCWJlcXoJYTMsLkxfYm5fc3ViX3dvcmRzX3JldHVybgorCisJbGQJdDIsMTYoYTEpCisJbGQJdGEyLDE2KGEyKQorCXNsdHUJdDgsdDIsdGEyCisJZHN1YnUJdDIsdGEyCisJZHN1YnUJdGEyLHQyLHYwCisJTU9WTloJKHQyLHYwLHQ4KQorCXNkCXRhMiwxNihhMCkKKwlqcglyYQorRU5EKGJuX3N1Yl93b3JkcykKKworI3VuZGVmCU1JTlVTNAorCisuYWxpZ24gNQorTEVBRihibl9kaXZfM193b3JkcykKKwkuc2V0CXJlb3JkZXIKKwltb3ZlCWEzLGEwCQkvKiB3ZSBrbm93IHRoYXQgYm5fZGl2X3dvcmRzIGRvZXNuJ3QKKwkJCQkgKiB0b3VjaCBhMywgdGEyLCB0YTMgYW5kIHByZXNlcnZlcyBhMgorCQkJCSAqIHNvIHRoYXQgd2UgY2FuIHNhdmUgdHdvIGFyZ3VtZW50cworCQkJCSAqIGFuZCByZXR1cm4gYWRkcmVzcyBpbiByZWdpc3RlcnMKKwkJCQkgKiBpbnN0ZWFkIG9mIHN0YWNrOi0pCisJCQkJICovCisJbGQJYTAsKGEzKQorCW1vdmUJdGEyLGExCisJbGQJYTEsLTgoYTMpCisJYm5lCWEwLGEyLC5MX2JuX2Rpdl8zX3dvcmRzX3Byb2NlZWQKKwlsaQl2MCwtMQorCWpyCXJhCisuTF9ibl9kaXZfM193b3Jkc19wcm9jZWVkOgorCW1vdmUJdGEzLHJhCisJYmFsCWJuX2Rpdl93b3JkcworCW1vdmUJcmEsdGEzCisJZG11bHR1CXRhMix2MAorCWxkCXQyLC0xNihhMykKKwltb3ZlCXRhMCx6ZXJvCisJbWZoaQl0MQorCW1mbG8JdDAKKwlzbHR1CXQ4LHQxLHYxCisuTF9ibl9kaXZfM193b3Jkc19pbm5lcl9sb29wOgorCWJuZXoJdDgsLkxfYm5fZGl2XzNfd29yZHNfaW5uZXJfbG9vcF9kb25lCisJc2dldQlBVCx0Mix0MAorCXNlcQl0OSx0MSx2MQorCWFuZAlBVCx0OQorCXNsdHUJdDMsdDAsdGEyCisJZGFkZHUJdjEsYTIKKwlkc3VidQl0MSx0MworCWRzdWJ1CXQwLHRhMgorCXNsdHUJdDgsdDEsdjEKKwlzbHR1CXRhMCx2MSxhMgorCW9yCXQ4LHRhMAorCS5zZXQJbm9yZW9yZGVyCisJYmVxemwJQVQsLkxfYm5fZGl2XzNfd29yZHNfaW5uZXJfbG9vcAorCWRzdWJ1CXYwLDEKKwkuc2V0CXJlb3JkZXIKKy5MX2JuX2Rpdl8zX3dvcmRzX2lubmVyX2xvb3BfZG9uZToKKwlqcglyYQorRU5EKGJuX2Rpdl8zX3dvcmRzKQorCisuYWxpZ24JNQorTEVBRihibl9kaXZfd29yZHMpCisJLnNldAlub3Jlb3JkZXIKKwlibmV6bAlhMiwuTF9ibl9kaXZfd29yZHNfcHJvY2VlZAorCW1vdmUJdjEsemVybworCWpyCXJhCisJbGkJdjAsLTEJCS8qIEknZCByYXRoZXIgc2lnbmFsIGRpdi1ieS16ZXJvCisJCQkJICogd2hpY2ggY2FuIGJlIGRvbmUgd2l0aCAnYnJlYWsgNycgKi8KKworLkxfYm5fZGl2X3dvcmRzX3Byb2NlZWQ6CisJYmx0eglhMiwuTF9ibl9kaXZfd29yZHNfYm9keQorCW1vdmUJdDksdjEKKwlkc2xsCWEyLDEKKwliZ3R6CWEyLC4tNAorCWFkZHUJdDksMQorCisJLnNldAlyZW9yZGVyCisJbmVndQl0MSx0OQorCWxpCXQyLC0xCisJZHNsbAl0Mix0MQorCWFuZAl0MixhMAorCWRzcmwJQVQsYTEsdDEKKwkuc2V0CW5vcmVvcmRlcgorCWJuZXpsCXQyLC4rOAorCWJyZWFrCTYJCS8qIHNpZ25hbCBvdmVyZmxvdyAqLworCS5zZXQJcmVvcmRlcgorCWRzbGwJYTAsdDkKKwlkc2xsCWExLHQ5CisJb3IJYTAsQVQKKworI2RlZmluZQlRVAl0YTAKKyNkZWZpbmUJSEgJdGExCisjZGVmaW5lCURICXYxCisuTF9ibl9kaXZfd29yZHNfYm9keToKKwlkc3JsCURILGEyLDMyCisJc2dldQlBVCxhMCxhMgorCS5zZXQJbm9yZW9yZGVyCisJYm5lemwJQVQsLis4CisJZHN1YnUJYTAsYTIKKwkuc2V0CXJlb3JkZXIKKworCWxpCVFULC0xCisJZHNybAlISCxhMCwzMgorCWRzcmwJUVQsMzIJLyogcT0weGZmZmZmZmZmICovCisJYmVxCURILEhILC5MX2JuX2Rpdl93b3Jkc19za2lwX2RpdjEKKwlkZGl2dQl6ZXJvLGEwLERICisJbWZsbwlRVAorLkxfYm5fZGl2X3dvcmRzX3NraXBfZGl2MToKKwlkbXVsdHUJYTIsUVQKKwlkc2xsCXQzLGEwLDMyCisJZHNybAlBVCxhMSwzMgorCW9yCXQzLEFUCisJbWZsbwl0MAorCW1maGkJdDEKKy5MX2JuX2Rpdl93b3Jkc19pbm5lcl9sb29wMToKKwlzbHR1CXQyLHQzLHQwCisJc2VxCXQ4LEhILHQxCisJc2x0dQlBVCxISCx0MQorCWFuZAl0Mix0OAorCXNsdHUJdjAsdDAsYTIKKwlvcglBVCx0MgorCS5zZXQJbm9yZW9yZGVyCisJYmVxeglBVCwuTF9ibl9kaXZfd29yZHNfaW5uZXJfbG9vcDFfZG9uZQorCWRzdWJ1CXQxLHYwCisJZHN1YnUJdDAsYTIKKwliCS5MX2JuX2Rpdl93b3Jkc19pbm5lcl9sb29wMQorCWRzdWJ1CVFULDEKKwkuc2V0CXJlb3JkZXIKKy5MX2JuX2Rpdl93b3Jkc19pbm5lcl9sb29wMV9kb25lOgorCisJZHNsbAlhMSwzMgorCWRzdWJ1CWEwLHQzLHQwCisJZHNsbAl2MCxRVCwzMgorCisJbGkJUVQsLTEKKwlkc3JsCUhILGEwLDMyCisJZHNybAlRVCwzMgkvKiBxPTB4ZmZmZmZmZmYgKi8KKwliZXEJREgsSEgsLkxfYm5fZGl2X3dvcmRzX3NraXBfZGl2MgorCWRkaXZ1CXplcm8sYTAsREgKKwltZmxvCVFUCisuTF9ibl9kaXZfd29yZHNfc2tpcF9kaXYyOgorI3VuZGVmCURICisJZG11bHR1CWEyLFFUCisJZHNsbAl0MyxhMCwzMgorCWRzcmwJQVQsYTEsMzIKKwlvcgl0MyxBVAorCW1mbG8JdDAKKwltZmhpCXQxCisuTF9ibl9kaXZfd29yZHNfaW5uZXJfbG9vcDI6CisJc2x0dQl0Mix0Myx0MAorCXNlcQl0OCxISCx0MQorCXNsdHUJQVQsSEgsdDEKKwlhbmQJdDIsdDgKKwlzbHR1CXYxLHQwLGEyCisJb3IJQVQsdDIKKwkuc2V0CW5vcmVvcmRlcgorCWJlcXoJQVQsLkxfYm5fZGl2X3dvcmRzX2lubmVyX2xvb3AyX2RvbmUKKwlkc3VidQl0MSx2MQorCWRzdWJ1CXQwLGEyCisJYgkuTF9ibl9kaXZfd29yZHNfaW5uZXJfbG9vcDIKKwlkc3VidQlRVCwxCisJLnNldAlyZW9yZGVyCisuTF9ibl9kaXZfd29yZHNfaW5uZXJfbG9vcDJfZG9uZToJCisjdW5kZWYJSEgKKworCWRzdWJ1CWEwLHQzLHQwCisJb3IJdjAsUVQKKwlkc3JsCXYxLGEwLHQ5CS8qIHYxIGNvbnRhaW5zIHJlbWFpbmRlciBpZiBhbnlib2R5IHdhbnRzIGl0ICovCisJZHNybAlhMix0OQkJLyogcmVzdG9yZSBhMiAqLworCWpyCXJhCisjdW5kZWYJUVQKK0VORChibl9kaXZfd29yZHMpCisKKyNkZWZpbmUJYV8wCXQwCisjZGVmaW5lCWFfMQl0MQorI2RlZmluZQlhXzIJdDIKKyNkZWZpbmUJYV8zCXQzCisjZGVmaW5lCWJfMAl0YTAKKyNkZWZpbmUJYl8xCXRhMQorI2RlZmluZQliXzIJdGEyCisjZGVmaW5lCWJfMwl0YTMKKworI2RlZmluZQlhXzQJczAKKyNkZWZpbmUJYV81CXMyCisjZGVmaW5lCWFfNglzNAorI2RlZmluZQlhXzcJYTEJLyogb25jZSB3ZSBsb2FkIGFbN10gd2UgZG9uJ3QgbmVlZCBhIGFueW1vcmUgKi8KKyNkZWZpbmUJYl80CXMxCisjZGVmaW5lCWJfNQlzMworI2RlZmluZQliXzYJczUKKyNkZWZpbmUJYl83CWEyCS8qIG9uY2Ugd2UgbG9hZCBiWzddIHdlIGRvbid0IG5lZWQgYiBhbnltb3JlICovCisKKyNkZWZpbmUJdF8xCXQ4CisjZGVmaW5lCXRfMgl0OQorCisjZGVmaW5lCWNfMQl2MAorI2RlZmluZQljXzIJdjEKKyNkZWZpbmUJY18zCWEzCisKKyNkZWZpbmUJRlJBTUVfU0laRQk0OAorCisuYWxpZ24JNQorTEVBRihibl9tdWxfY29tYmE4KQorCS5zZXQJbm9yZW9yZGVyCisJUFRSX1NVQglzcCxGUkFNRV9TSVpFCisJLmZyYW1lCXNwLDY0LHJhCisJLnNldAlyZW9yZGVyCisJbGQJYV8wLDAoYTEpCS8qIElmIGNvbXBpbGVkIHdpdGggLW1pcHMzIG9wdGlvbiBvbgorCQkJCSAqIFI1MDAwIGJveCBhc3NlbWJsZXIgYmFya3Mgb24gdGhpcworCQkJCSAqIGxpbmUgd2l0aCAic2hvdWxkbid0IGhhdmUgbXVsdC9kaXYKKwkJCQkgKiBhcyBsYXN0IGluc3RydWN0aW9uIGluIGJiIChSMTBLCisJCQkJICogYnVnKSIgd2FybmluZy4gSWYgYW55Ym9keSBvdXQgdGhlcmUKKwkJCQkgKiBoYXMgYSBjbHVlIGFib3V0IGhvdyB0byBjaXJjdW12ZW50CisJCQkJICogdGhpcyBkbyBzZW5kIG1lIGEgbm90ZS4KKwkJCQkgKgkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorCQkJCSAqLworCWxkCWJfMCwwKGEyKQorCWxkCWFfMSw4KGExKQorCWxkCWFfMiwxNihhMSkKKwlsZAlhXzMsMjQoYTEpCisJbGQJYl8xLDgoYTIpCisJbGQJYl8yLDE2KGEyKQorCWxkCWJfMywyNChhMikKKwlkbXVsdHUJYV8wLGJfMAkJLyogbXVsX2FkZF9jKGFbMF0sYlswXSxjMSxjMixjMyk7ICovCisJc2QJczAsMChzcCkKKwlzZAlzMSw4KHNwKQorCXNkCXMyLDE2KHNwKQorCXNkCXMzLDI0KHNwKQorCXNkCXM0LDMyKHNwKQorCXNkCXM1LDQwKHNwKQorCW1mbG8JY18xCisJbWZoaQljXzIKKworCWRtdWx0dQlhXzAsYl8xCQkvKiBtdWxfYWRkX2MoYVswXSxiWzFdLGMyLGMzLGMxKTsgKi8KKwlsZAlhXzQsMzIoYTEpCisJbGQJYV81LDQwKGExKQorCWxkCWFfNiw0OChhMSkKKwlsZAlhXzcsNTYoYTEpCisJbGQJYl80LDMyKGEyKQorCWxkCWJfNSw0MChhMikKKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CWNfMyx0XzIsQVQKKwlkbXVsdHUJYV8xLGJfMAkJLyogbXVsX2FkZF9jKGFbMV0sYlswXSxjMixjMyxjMSk7ICovCisJbGQJYl82LDQ4KGEyKQorCWxkCWJfNyw1NihhMikKKwlzZAljXzEsMChhMCkJLyogclswXT1jMTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CWNfMSxjXzMsdF8yCisJc2QJY18yLDgoYTApCS8qIHJbMV09YzI7ICovCisKKwlkbXVsdHUJYV8yLGJfMAkJLyogbXVsX2FkZF9jKGFbMl0sYlswXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJZG11bHR1CWFfMSxiXzEJCS8qIG11bF9hZGRfYyhhWzFdLGJbMV0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJY18yLGNfMSx0XzIKKwlkbXVsdHUJYV8wLGJfMgkJLyogbXVsX2FkZF9jKGFbMF0sYlsyXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJc2QJY18zLDE2KGEwKQkvKiByWzJdPWMzOyAqLworCisJZG11bHR1CWFfMCxiXzMJCS8qIG11bF9hZGRfYyhhWzBdLGJbM10sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJY18zLGNfMix0XzIKKwlkbXVsdHUJYV8xLGJfMgkJLyogbXVsX2FkZF9jKGFbMV0sYlsyXSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJZG11bHR1CWFfMixiXzEJCS8qIG11bF9hZGRfYyhhWzJdLGJbMV0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCWRtdWx0dQlhXzMsYl8wCQkvKiBtdWxfYWRkX2MoYVszXSxiWzBdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlzZAljXzEsMjQoYTApCS8qIHJbM109YzE7ICovCisKKwlkbXVsdHUJYV80LGJfMAkJLyogbXVsX2FkZF9jKGFbNF0sYlswXSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQljXzEsY18zLHRfMgorCWRtdWx0dQlhXzMsYl8xCQkvKiBtdWxfYWRkX2MoYVszXSxiWzFdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlkbXVsdHUJYV8yLGJfMgkJLyogbXVsX2FkZF9jKGFbMl0sYlsyXSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfMSxiXzMJCS8qIG11bF9hZGRfYyhhWzFdLGJbM10sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCWRtdWx0dQlhXzAsYl80CQkvKiBtdWxfYWRkX2MoYVswXSxiWzRdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlzZAljXzIsMzIoYTApCS8qIHJbNF09YzI7ICovCisKKwlkbXVsdHUJYV8wLGJfNQkJLyogbXVsX2FkZF9jKGFbMF0sYls1XSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQljXzIsY18xLHRfMgorCWRtdWx0dQlhXzEsYl80CQkvKiBtdWxfYWRkX2MoYVsxXSxiWzRdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlkbXVsdHUJYV8yLGJfMwkJLyogbXVsX2FkZF9jKGFbMl0sYlszXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJZG11bHR1CWFfMyxiXzIJCS8qIG11bF9hZGRfYyhhWzNdLGJbMl0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCWRtdWx0dQlhXzQsYl8xCQkvKiBtdWxfYWRkX2MoYVs0XSxiWzFdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlkbXVsdHUJYV81LGJfMAkJLyogbXVsX2FkZF9jKGFbNV0sYlswXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJc2QJY18zLDQwKGEwKQkvKiByWzVdPWMzOyAqLworCisJZG11bHR1CWFfNixiXzAJCS8qIG11bF9hZGRfYyhhWzZdLGJbMF0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJY18zLGNfMix0XzIKKwlkbXVsdHUJYV81LGJfMQkJLyogbXVsX2FkZF9jKGFbNV0sYlsxXSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJZG11bHR1CWFfNCxiXzIJCS8qIG11bF9hZGRfYyhhWzRdLGJbMl0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCWRtdWx0dQlhXzMsYl8zCQkvKiBtdWxfYWRkX2MoYVszXSxiWzNdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlkbXVsdHUJYV8yLGJfNAkJLyogbXVsX2FkZF9jKGFbMl0sYls0XSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJZG11bHR1CWFfMSxiXzUJCS8qIG11bF9hZGRfYyhhWzFdLGJbNV0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCWRtdWx0dQlhXzAsYl82CQkvKiBtdWxfYWRkX2MoYVswXSxiWzZdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlzZAljXzEsNDgoYTApCS8qIHJbNl09YzE7ICovCisKKwlkbXVsdHUJYV8wLGJfNwkJLyogbXVsX2FkZF9jKGFbMF0sYls3XSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQljXzEsY18zLHRfMgorCWRtdWx0dQlhXzEsYl82CQkvKiBtdWxfYWRkX2MoYVsxXSxiWzZdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlkbXVsdHUJYV8yLGJfNQkJLyogbXVsX2FkZF9jKGFbMl0sYls1XSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfMyxiXzQJCS8qIG11bF9hZGRfYyhhWzNdLGJbNF0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCWRtdWx0dQlhXzQsYl8zCQkvKiBtdWxfYWRkX2MoYVs0XSxiWzNdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlkbXVsdHUJYV81LGJfMgkJLyogbXVsX2FkZF9jKGFbNV0sYlsyXSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfNixiXzEJCS8qIG11bF9hZGRfYyhhWzZdLGJbMV0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCWRtdWx0dQlhXzcsYl8wCQkvKiBtdWxfYWRkX2MoYVs3XSxiWzBdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlzZAljXzIsNTYoYTApCS8qIHJbN109YzI7ICovCisKKwlkbXVsdHUJYV83LGJfMQkJLyogbXVsX2FkZF9jKGFbN10sYlsxXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQljXzIsY18xLHRfMgorCWRtdWx0dQlhXzYsYl8yCQkvKiBtdWxfYWRkX2MoYVs2XSxiWzJdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlkbXVsdHUJYV81LGJfMwkJLyogbXVsX2FkZF9jKGFbNV0sYlszXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJZG11bHR1CWFfNCxiXzQJCS8qIG11bF9hZGRfYyhhWzRdLGJbNF0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCWRtdWx0dQlhXzMsYl81CQkvKiBtdWxfYWRkX2MoYVszXSxiWzVdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlkbXVsdHUJYV8yLGJfNgkJLyogbXVsX2FkZF9jKGFbMl0sYls2XSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJZG11bHR1CWFfMSxiXzcJCS8qIG11bF9hZGRfYyhhWzFdLGJbN10sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCXNkCWNfMyw2NChhMCkJLyogcls4XT1jMzsgKi8KKworCWRtdWx0dQlhXzIsYl83CQkvKiBtdWxfYWRkX2MoYVsyXSxiWzddLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CWNfMyxjXzIsdF8yCisJZG11bHR1CWFfMyxiXzYJCS8qIG11bF9hZGRfYyhhWzNdLGJbNl0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCWRtdWx0dQlhXzQsYl81CQkvKiBtdWxfYWRkX2MoYVs0XSxiWzVdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlkbXVsdHUJYV81LGJfNAkJLyogbXVsX2FkZF9jKGFbNV0sYls0XSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJZG11bHR1CWFfNixiXzMJCS8qIG11bF9hZGRfYyhhWzZdLGJbM10sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCWRtdWx0dQlhXzcsYl8yCQkvKiBtdWxfYWRkX2MoYVs3XSxiWzJdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlzZAljXzEsNzIoYTApCS8qIHJbOV09YzE7ICovCisKKwlkbXVsdHUJYV83LGJfMwkJLyogbXVsX2FkZF9jKGFbN10sYlszXSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQljXzEsY18zLHRfMgorCWRtdWx0dQlhXzYsYl80CQkvKiBtdWxfYWRkX2MoYVs2XSxiWzRdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlkbXVsdHUJYV81LGJfNQkJLyogbXVsX2FkZF9jKGFbNV0sYls1XSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfNCxiXzYJCS8qIG11bF9hZGRfYyhhWzRdLGJbNl0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCWRtdWx0dQlhXzMsYl83CQkvKiBtdWxfYWRkX2MoYVszXSxiWzddLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlzZAljXzIsODAoYTApCS8qIHJbMTBdPWMyOyAqLworCisJZG11bHR1CWFfNCxiXzcJCS8qIG11bF9hZGRfYyhhWzRdLGJbN10sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJY18yLGNfMSx0XzIKKwlkbXVsdHUJYV81LGJfNgkJLyogbXVsX2FkZF9jKGFbNV0sYls2XSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJZG11bHR1CWFfNixiXzUJCS8qIG11bF9hZGRfYyhhWzZdLGJbNV0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCWRtdWx0dQlhXzcsYl80CQkvKiBtdWxfYWRkX2MoYVs3XSxiWzRdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlzZAljXzMsODgoYTApCS8qIHJbMTFdPWMzOyAqLworCisJZG11bHR1CWFfNyxiXzUJCS8qIG11bF9hZGRfYyhhWzddLGJbNV0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJY18zLGNfMix0XzIKKwlkbXVsdHUJYV82LGJfNgkJLyogbXVsX2FkZF9jKGFbNl0sYls2XSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJZG11bHR1CWFfNSxiXzcJCS8qIG11bF9hZGRfYyhhWzVdLGJbN10sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCXNkCWNfMSw5NihhMCkJLyogclsxMl09YzE7ICovCisKKwlkbXVsdHUJYV82LGJfNwkJLyogbXVsX2FkZF9jKGFbNl0sYls3XSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQljXzEsY18zLHRfMgorCWRtdWx0dQlhXzcsYl82CQkvKiBtdWxfYWRkX2MoYVs3XSxiWzZdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlzZAljXzIsMTA0KGEwKQkvKiByWzEzXT1jMjsgKi8KKworCWRtdWx0dQlhXzcsYl83CQkvKiBtdWxfYWRkX2MoYVs3XSxiWzddLGMzLGMxLGMyKTsgKi8KKwlsZAlzMCwwKHNwKQorCWxkCXMxLDgoc3ApCisJbGQJczIsMTYoc3ApCisJbGQJczMsMjQoc3ApCisJbGQJczQsMzIoc3ApCisJbGQJczUsNDAoc3ApCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2QJY18zLDExMihhMCkJLyogclsxNF09YzM7ICovCisJc2QJY18xLDEyMChhMCkJLyogclsxNV09YzE7ICovCisKKwlQVFJfQURECXNwLEZSQU1FX1NJWkUKKworCWpyCXJhCitFTkQoYm5fbXVsX2NvbWJhOCkKKworLmFsaWduCTUKK0xFQUYoYm5fbXVsX2NvbWJhNCkKKwkuc2V0CXJlb3JkZXIKKwlsZAlhXzAsMChhMSkKKwlsZAliXzAsMChhMikKKwlsZAlhXzEsOChhMSkKKwlsZAlhXzIsMTYoYTEpCisJZG11bHR1CWFfMCxiXzAJCS8qIG11bF9hZGRfYyhhWzBdLGJbMF0sYzEsYzIsYzMpOyAqLworCWxkCWFfMywyNChhMSkKKwlsZAliXzEsOChhMikKKwlsZAliXzIsMTYoYTIpCisJbGQJYl8zLDI0KGEyKQorCW1mbG8JY18xCisJbWZoaQljXzIKKwlzZAljXzEsMChhMCkKKworCWRtdWx0dQlhXzAsYl8xCQkvKiBtdWxfYWRkX2MoYVswXSxiWzFdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CWNfMyx0XzIsQVQKKwlkbXVsdHUJYV8xLGJfMAkJLyogbXVsX2FkZF9jKGFbMV0sYlswXSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQljXzEsY18zLHRfMgorCXNkCWNfMiw4KGEwKQorCisJZG11bHR1CWFfMixiXzAJCS8qIG11bF9hZGRfYyhhWzJdLGJbMF0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCWRtdWx0dQlhXzEsYl8xCQkvKiBtdWxfYWRkX2MoYVsxXSxiWzFdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CWNfMixjXzEsdF8yCisJZG11bHR1CWFfMCxiXzIJCS8qIG11bF9hZGRfYyhhWzBdLGJbMl0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCXNkCWNfMywxNihhMCkKKworCWRtdWx0dQlhXzAsYl8zCQkvKiBtdWxfYWRkX2MoYVswXSxiWzNdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CWNfMyxjXzIsdF8yCisJZG11bHR1CWFfMSxiXzIJCS8qIG11bF9hZGRfYyhhWzFdLGJbMl0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCWRtdWx0dQlhXzIsYl8xCQkvKiBtdWxfYWRkX2MoYVsyXSxiWzFdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlkbXVsdHUJYV8zLGJfMAkJLyogbXVsX2FkZF9jKGFbM10sYlswXSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJc2QJY18xLDI0KGEwKQorCisJZG11bHR1CWFfMyxiXzEJCS8qIG11bF9hZGRfYyhhWzNdLGJbMV0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJY18xLGNfMyx0XzIKKwlkbXVsdHUJYV8yLGJfMgkJLyogbXVsX2FkZF9jKGFbMl0sYlsyXSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfMSxiXzMJCS8qIG11bF9hZGRfYyhhWzFdLGJbM10sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCXNkCWNfMiwzMihhMCkKKworCWRtdWx0dQlhXzIsYl8zCQkvKiBtdWxfYWRkX2MoYVsyXSxiWzNdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CWNfMixjXzEsdF8yCisJZG11bHR1CWFfMyxiXzIJCS8qIG11bF9hZGRfYyhhWzNdLGJbMl0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCXNkCWNfMyw0MChhMCkKKworCWRtdWx0dQlhXzMsYl8zCQkvKiBtdWxfYWRkX2MoYVszXSxiWzNdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzZAljXzEsNDgoYTApCisJc2QJY18yLDU2KGEwKQorCisJanIJcmEKK0VORChibl9tdWxfY29tYmE0KQorCisjdW5kZWYJYV80CisjdW5kZWYJYV81CisjdW5kZWYJYV82CisjdW5kZWYJYV83CisjZGVmaW5lCWFfNAliXzAKKyNkZWZpbmUJYV81CWJfMQorI2RlZmluZQlhXzYJYl8yCisjZGVmaW5lCWFfNwliXzMKKworLmFsaWduCTUKK0xFQUYoYm5fc3FyX2NvbWJhOCkKKwkuc2V0CXJlb3JkZXIKKwlsZAlhXzAsMChhMSkKKwlsZAlhXzEsOChhMSkKKwlsZAlhXzIsMTYoYTEpCisJbGQJYV8zLDI0KGExKQorCisJZG11bHR1CWFfMCxhXzAJCS8qIG11bF9hZGRfYyhhWzBdLGJbMF0sYzEsYzIsYzMpOyAqLworCWxkCWFfNCwzMihhMSkKKwlsZAlhXzUsNDAoYTEpCisJbGQJYV82LDQ4KGExKQorCWxkCWFfNyw1NihhMSkKKwltZmxvCWNfMQorCW1maGkJY18yCisJc2QJY18xLDAoYTApCisKKwlkbXVsdHUJYV8wLGFfMQkJLyogbXVsX2FkZF9jMihhWzBdLGJbMV0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJY18xLHRfMix6ZXJvCisJZHNsbAl0XzIsMQorCXNsdAlhMix0XzEsemVybworCWRhZGR1CXRfMixhMgorCWRzbGwJdF8xLDEKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJY18zLHRfMixBVAorCXNkCWNfMiw4KGEwKQorCisJZG11bHR1CWFfMixhXzAJCS8qIG11bF9hZGRfYzIoYVsyXSxiWzBdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CWNfMix0XzIsemVybworCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlkbXVsdHUJYV8xLGFfMQkJLyogbXVsX2FkZF9jKGFbMV0sYlsxXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJc2QJY18zLDE2KGEwKQorCisJZG11bHR1CWFfMCxhXzMJCS8qIG11bF9hZGRfYzIoYVswXSxiWzNdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CWNfMyx0XzIsemVybworCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlkbXVsdHUJYV8xLGFfMgkJLyogbXVsX2FkZF9jMihhWzFdLGJbMl0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJQVQsdF8yLHplcm8KKwlkYWRkdQljXzMsQVQKKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJc2QJY18xLDI0KGEwKQorCisJZG11bHR1CWFfNCxhXzAJCS8qIG11bF9hZGRfYzIoYVs0XSxiWzBdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CWNfMSx0XzIsemVybworCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlkbXVsdHUJYV8zLGFfMQkJLyogbXVsX2FkZF9jMihhWzNdLGJbMV0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJQVQsdF8yLHplcm8KKwlkYWRkdQljXzEsQVQKKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfMixhXzIJCS8qIG11bF9hZGRfYyhhWzJdLGJbMl0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCXNkCWNfMiwzMihhMCkKKworCWRtdWx0dQlhXzAsYV81CQkvKiBtdWxfYWRkX2MyKGFbMF0sYls1XSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzIsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJZG11bHR1CWFfMSxhXzQJCS8qIG11bF9hZGRfYzIoYVsxXSxiWzRdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CUFULHRfMix6ZXJvCisJZGFkZHUJY18yLEFUCisJZHNsbAl0XzIsMQorCXNsdAlhMix0XzEsemVybworCWRhZGR1CXRfMixhMgorCWRzbGwJdF8xLDEKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCWRtdWx0dQlhXzIsYV8zCQkvKiBtdWxfYWRkX2MyKGFbMl0sYlszXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAlBVCx0XzIsemVybworCWRhZGR1CWNfMixBVAorCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlzZAljXzMsNDAoYTApCisKKwlkbXVsdHUJYV82LGFfMAkJLyogbXVsX2FkZF9jMihhWzZdLGJbMF0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJY18zLHRfMix6ZXJvCisJZHNsbAl0XzIsMQorCXNsdAlhMix0XzEsemVybworCWRhZGR1CXRfMixhMgorCWRzbGwJdF8xLDEKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCWRtdWx0dQlhXzUsYV8xCQkvKiBtdWxfYWRkX2MyKGFbNV0sYlsxXSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAlBVCx0XzIsemVybworCWRhZGR1CWNfMyxBVAorCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlkbXVsdHUJYV80LGFfMgkJLyogbXVsX2FkZF9jMihhWzRdLGJbMl0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJQVQsdF8yLHplcm8KKwlkYWRkdQljXzMsQVQKKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJZG11bHR1CWFfMyxhXzMJCS8qIG11bF9hZGRfYyhhWzNdLGJbM10sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCXNkCWNfMSw0OChhMCkKKworCWRtdWx0dQlhXzAsYV83CQkvKiBtdWxfYWRkX2MyKGFbMF0sYls3XSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzEsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfMSxhXzYJCS8qIG11bF9hZGRfYzIoYVsxXSxiWzZdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CUFULHRfMix6ZXJvCisJZGFkZHUJY18xLEFUCisJZHNsbAl0XzIsMQorCXNsdAlhMix0XzEsemVybworCWRhZGR1CXRfMixhMgorCWRzbGwJdF8xLDEKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCWRtdWx0dQlhXzIsYV81CQkvKiBtdWxfYWRkX2MyKGFbMl0sYls1XSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAlBVCx0XzIsemVybworCWRhZGR1CWNfMSxBVAorCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlkbXVsdHUJYV8zLGFfNAkJLyogbXVsX2FkZF9jMihhWzNdLGJbNF0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJQVQsdF8yLHplcm8KKwlkYWRkdQljXzEsQVQKKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJc2QJY18yLDU2KGEwKQorCisJZG11bHR1CWFfNyxhXzEJCS8qIG11bF9hZGRfYzIoYVs3XSxiWzFdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CWNfMix0XzIsemVybworCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlkbXVsdHUJYV82LGFfMgkJLyogbXVsX2FkZF9jMihhWzZdLGJbMl0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJQVQsdF8yLHplcm8KKwlkYWRkdQljXzIsQVQKKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJZG11bHR1CWFfNSxhXzMJCS8qIG11bF9hZGRfYzIoYVs1XSxiWzNdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CUFULHRfMix6ZXJvCisJZGFkZHUJY18yLEFUCisJZHNsbAl0XzIsMQorCXNsdAlhMix0XzEsemVybworCWRhZGR1CXRfMixhMgorCWRzbGwJdF8xLDEKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCWRtdWx0dQlhXzQsYV80CQkvKiBtdWxfYWRkX2MoYVs0XSxiWzRdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzbHR1CUFULGNfMSx0XzIKKwlkYWRkdQljXzIsQVQKKwlzZAljXzMsNjQoYTApCisKKwlkbXVsdHUJYV8yLGFfNwkJLyogbXVsX2FkZF9jMihhWzJdLGJbN10sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJY18zLHRfMix6ZXJvCisJZHNsbAl0XzIsMQorCXNsdAlhMix0XzEsemVybworCWRhZGR1CXRfMixhMgorCWRzbGwJdF8xLDEKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCWRtdWx0dQlhXzMsYV82CQkvKiBtdWxfYWRkX2MyKGFbM10sYls2XSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAlBVCx0XzIsemVybworCWRhZGR1CWNfMyxBVAorCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18xLHRfMQorCXNsdHUJQVQsY18xLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMix0XzIKKwlzbHR1CUFULGNfMix0XzIKKwlkYWRkdQljXzMsQVQKKwlkbXVsdHUJYV80LGFfNQkJLyogbXVsX2FkZF9jMihhWzRdLGJbNV0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJQVQsdF8yLHplcm8KKwlkYWRkdQljXzMsQVQKKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJc2QJY18xLDcyKGEwKQorCisJZG11bHR1CWFfNyxhXzMJCS8qIG11bF9hZGRfYzIoYVs3XSxiWzNdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CWNfMSx0XzIsemVybworCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMyx0XzIKKwlzbHR1CUFULGNfMyx0XzIKKwlkYWRkdQljXzEsQVQKKwlkbXVsdHUJYV82LGFfNAkJLyogbXVsX2FkZF9jMihhWzZdLGJbNF0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlzbHQJQVQsdF8yLHplcm8KKwlkYWRkdQljXzEsQVQKKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfNSxhXzUJCS8qIG11bF9hZGRfYyhhWzVdLGJbNV0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCXNkCWNfMiw4MChhMCkKKworCWRtdWx0dQlhXzQsYV83CQkvKiBtdWxfYWRkX2MyKGFbNF0sYls3XSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzIsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJZG11bHR1CWFfNSxhXzYJCS8qIG11bF9hZGRfYzIoYVs1XSxiWzZdLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CUFULHRfMix6ZXJvCisJZGFkZHUJY18yLEFUCisJZHNsbAl0XzIsMQorCXNsdAlhMix0XzEsemVybworCWRhZGR1CXRfMixhMgorCWRzbGwJdF8xLDEKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCXNkCWNfMyw4OChhMCkKKworCWRtdWx0dQlhXzcsYV81CQkvKiBtdWxfYWRkX2MyKGFbN10sYls1XSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzMsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJZG11bHR1CWFfNixhXzYJCS8qIG11bF9hZGRfYyhhWzZdLGJbNl0sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCXNkCWNfMSw5NihhMCkKKworCWRtdWx0dQlhXzYsYV83CQkvKiBtdWxfYWRkX2MyKGFbNl0sYls3XSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzEsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJc2QJY18yLDEwNChhMCkKKworCWRtdWx0dQlhXzcsYV83CQkvKiBtdWxfYWRkX2MoYVs3XSxiWzddLGMzLGMxLGMyKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJZGFkZHUJY18zLHRfMQorCXNsdHUJQVQsY18zLHRfMQorCWRhZGR1CXRfMixBVAorCWRhZGR1CWNfMSx0XzIKKwlzZAljXzMsMTEyKGEwKQorCXNkCWNfMSwxMjAoYTApCisKKwlqcglyYQorRU5EKGJuX3Nxcl9jb21iYTgpCisKKy5hbGlnbgk1CitMRUFGKGJuX3Nxcl9jb21iYTQpCisJLnNldAlyZW9yZGVyCisJbGQJYV8wLDAoYTEpCisJbGQJYV8xLDgoYTEpCisJbGQJYV8yLDE2KGExKQorCWxkCWFfMywyNChhMSkKKwlkbXVsdHUJYV8wLGFfMAkJLyogbXVsX2FkZF9jKGFbMF0sYlswXSxjMSxjMixjMyk7ICovCisJbWZsbwljXzEKKwltZmhpCWNfMgorCXNkCWNfMSwwKGEwKQorCisJZG11bHR1CWFfMCxhXzEJCS8qIG11bF9hZGRfYzIoYVswXSxiWzFdLGMyLGMzLGMxKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CWNfMSx0XzIsemVybworCWRzbGwJdF8yLDEKKwlzbHQJYTIsdF8xLHplcm8KKwlkYWRkdQl0XzIsYTIKKwlkc2xsCXRfMSwxCisJZGFkZHUJY18yLHRfMQorCXNsdHUJQVQsY18yLHRfMQorCWRhZGR1CWNfMyx0XzIsQVQKKwlzZAljXzIsOChhMCkKKworCWRtdWx0dQlhXzIsYV8wCQkvKiBtdWxfYWRkX2MyKGFbMl0sYlswXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzIsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJZG11bHR1CWFfMSxhXzEJCS8qIG11bF9hZGRfYyhhWzFdLGJbMV0sYzMsYzEsYzIpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzMsdF8xCisJc2x0dQlBVCxjXzMsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18xLHRfMgorCXNsdHUJQVQsY18xLHRfMgorCWRhZGR1CWNfMixBVAorCXNkCWNfMywxNihhMCkKKworCWRtdWx0dQlhXzAsYV8zCQkvKiBtdWxfYWRkX2MyKGFbMF0sYlszXSxjMSxjMixjMyk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzMsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMSx0XzEKKwlzbHR1CUFULGNfMSx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzIsdF8yCisJc2x0dQlBVCxjXzIsdF8yCisJZGFkZHUJY18zLEFUCisJZG11bHR1CWFfMSxhXzIJCS8qIG11bF9hZGRfYyhhMlsxXSxiWzJdLGMxLGMyLGMzKTsgKi8KKwltZmxvCXRfMQorCW1maGkJdF8yCisJc2x0CUFULHRfMix6ZXJvCisJZGFkZHUJY18zLEFUCisJZHNsbAl0XzIsMQorCXNsdAlhMix0XzEsemVybworCWRhZGR1CXRfMixhMgorCWRzbGwJdF8xLDEKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNsdHUJQVQsY18yLHRfMgorCWRhZGR1CWNfMyxBVAorCXNkCWNfMSwyNChhMCkKKworCWRtdWx0dQlhXzMsYV8xCQkvKiBtdWxfYWRkX2MyKGFbM10sYlsxXSxjMixjMyxjMSk7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzEsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMix0XzEKKwlzbHR1CUFULGNfMix0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzMsdF8yCisJc2x0dQlBVCxjXzMsdF8yCisJZGFkZHUJY18xLEFUCisJZG11bHR1CWFfMixhXzIJCS8qIG11bF9hZGRfYyhhWzJdLGJbMl0sYzIsYzMsYzEpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzIsdF8xCisJc2x0dQlBVCxjXzIsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18zLHRfMgorCXNsdHUJQVQsY18zLHRfMgorCWRhZGR1CWNfMSxBVAorCXNkCWNfMiwzMihhMCkKKworCWRtdWx0dQlhXzIsYV8zCQkvKiBtdWxfYWRkX2MyKGFbMl0sYlszXSxjMyxjMSxjMik7ICovCisJbWZsbwl0XzEKKwltZmhpCXRfMgorCXNsdAljXzIsdF8yLHplcm8KKwlkc2xsCXRfMiwxCisJc2x0CWEyLHRfMSx6ZXJvCisJZGFkZHUJdF8yLGEyCisJZHNsbAl0XzEsMQorCWRhZGR1CWNfMyx0XzEKKwlzbHR1CUFULGNfMyx0XzEKKwlkYWRkdQl0XzIsQVQKKwlkYWRkdQljXzEsdF8yCisJc2x0dQlBVCxjXzEsdF8yCisJZGFkZHUJY18yLEFUCisJc2QJY18zLDQwKGEwKQorCisJZG11bHR1CWFfMyxhXzMJCS8qIG11bF9hZGRfYyhhWzNdLGJbM10sYzEsYzIsYzMpOyAqLworCW1mbG8JdF8xCisJbWZoaQl0XzIKKwlkYWRkdQljXzEsdF8xCisJc2x0dQlBVCxjXzEsdF8xCisJZGFkZHUJdF8yLEFUCisJZGFkZHUJY18yLHRfMgorCXNkCWNfMSw0OChhMCkKKwlzZAljXzIsNTYoYTApCisKKwlqcglyYQorRU5EKGJuX3Nxcl9jb21iYTQpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3BhLXJpc2MyLnMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3BhLXJpc2MyLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiMTYyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vcGEtcmlzYzIucwpAQCAtMCwwICsxLDE2MTggQEAKKzsKKzsgUEEtUklTQyAyLjAgaW1wbGVtZW50YXRpb24gb2YgYm5fYXNtIGNvZGUsIGJhc2VkIG9uIHRoZQorOyA2NC1iaXQgdmVyc2lvbiBvZiB0aGUgY29kZS4gIFRoaXMgY29kZSBpcyBlZmZlY3RpdmVseSB0aGUKKzsgc2FtZSBhcyB0aGUgNjQtYml0IHZlcnNpb24gZXhjZXB0IHRoZSByZWdpc3RlciBtb2RlbCBpcworOyBzbGlnaHRseSBkaWZmZXJlbnQgZ2l2ZW4gYWxsIHZhbHVlcyBtdXN0IGJlIDMyLWJpdCBiZXR3ZWVuCis7IGZ1bmN0aW9uIGNhbGxzLiAgVGh1cyB0aGUgNjQtYml0IHJldHVybiB2YWx1ZXMgYXJlIHJldHVybmVkCis7IGluICVyZXQwIGFuZCAlcmV0MSB2cyBqdXN0ICVyZXQwIGFzIGlzIGRvbmUgaW4gNjQtYml0Cis7Cis7Cis7IFRoaXMgY29kZSBpcyBhcHByb3hpbWF0ZWx5IDJ4IGZhc3RlciB0aGFuIHRoZSBDIHZlcnNpb24KKzsgZm9yIFJTQS9EU0EuCis7Cis7IFNlZSBodHRwOi8vZGV2cmVzb3VyY2UuaHAuY29tLyAgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgUEEtUklTQworOyBhcmNoaXRlY3R1cmUuICBBbHNvIHNlZSB0aGUgYm9vayAiUEEtUklTQyAyLjAgQXJjaGl0ZWN0dXJlIgorOyBieSBHZXJyeSBLYW5lIGZvciBpbmZvcm1hdGlvbiBvbiB0aGUgaW5zdHJ1Y3Rpb24gc2V0IGFyY2hpdGVjdHVyZS4KKzsKKzsgQ29kZSB3cml0dGVuIGJ5IENocmlzIFJ1ZW1tbGVyICh3aXRoIHNvbWUgaGVscCBmcm9tIHRoZSBIUCBDCis7IGNvbXBpbGVyKS4KKzsKKzsgVGhlIGNvZGUgY29tcGlsZXMgd2l0aCBIUCdzIGFzc2VtYmxlcgorOworCisJLmxldmVsCTIuME4KKwkuc3BhY2UJJFRFWFQkCisJLnN1YnNwYQkkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTB4MmMsQ09ERV9PTkxZCisKKzsKKzsgR2xvYmFsIFJlZ2lzdGVyIGRlZmluaXRpb25zIHVzZWQgZm9yIHRoZSByb3V0aW5lcy4KKzsKKzsgU29tZSBpbmZvcm1hdGlvbiBhYm91dCBIUCdzIHJ1bnRpbWUgYXJjaGl0ZWN0dXJlIGZvciAzMi1iaXRzLgorOworOyAiQ2FsbGVyIHNhdmUiIG1lYW5zIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIG11c3Qgc2F2ZSB0aGUgcmVnaXN0ZXIKKzsgaWYgaXQgd2FudHMgdGhlIHJlZ2lzdGVyIHRvIGJlIHByZXNlcnZlZC4KKzsgIkNhbGxlZSBzYXZlIiBtZWFucyBpZiBhIGZ1bmN0aW9uIHVzZXMgdGhlIHJlZ2lzdGVyLCBpdCBtdXN0IHNhdmUKKzsgdGhlIHZhbHVlIGJlZm9yZSB1c2luZyBpdC4KKzsKKzsgRm9yIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgCis7Cis7ICAgICJjYWxsZXIgc2F2ZSIgcmVnaXN0ZXJzOiBmcjQtZnIxMSwgZnIyMi1mcjMxCis7ICAgICJjYWxsZWUgc2F2ZSIgcmVnaXN0ZXJzOiBmcjEyLWZyMjEKKzsgICAgInNwZWNpYWwiIHJlZ2lzdGVyczogZnIwLWZyMyAoc3RhdHVzIGFuZCBleGNlcHRpb24gcmVnaXN0ZXJzKQorOworOyBGb3IgdGhlIGludGVnZXIgcmVnaXN0ZXJzCis7ICAgICB2YWx1ZSB6ZXJvICAgICAgICAgICAgIDogIHIwCis7ICAgICAiY2FsbGVyIHNhdmUiIHJlZ2lzdGVyczogcjEscjE5LXIyNgorOyAgICAgImNhbGxlZSBzYXZlIiByZWdpc3RlcnM6IHIzLXIxOAorOyAgICAgcmV0dXJuIHJlZ2lzdGVyICAgICAgICA6ICByMiAgKHJwKQorOyAgICAgcmV0dXJuIHZhbHVlcyAgICAgICAgICA7IHIyOCxyMjkgIChyZXQwLHJldDEpCis7ICAgICBTdGFjayBwb2ludGVyICAgICAgICAgIDsgcjMwICAoc3ApIAorOyAgICAgbWlsbGljb2RlIHJldHVybiBwdHIgICA7IHIzMSAgKGFsc28gYSBjYWxsZXIgc2F2ZSByZWdpc3RlcikKKworCis7Cis7IEFyZ3VtZW50cyB0byB0aGUgcm91dGluZXMKKzsKK3JfcHRyICAgICAgIC5yZWcgJXIyNgorYV9wdHIgICAgICAgLnJlZyAlcjI1CitiX3B0ciAgICAgICAucmVnICVyMjQKK251bSAgICAgICAgIC5yZWcgJXIyNAorbiAgICAgICAgICAgLnJlZyAlcjIzCisKKzsKKzsgTm90ZSB0aGF0IHRoZSAidyIgYXJndW1lbnQgZm9yIGJuX211bF9hZGRfd29yZHMgYW5kIGJuX211bF93b3JkcworOyBpcyBwYXNzZWQgb24gdGhlIHN0YWNrIGF0IGEgZGVsdGEgb2YgLTU2IGZyb20gdGhlIHRvcCBvZiBzdGFjaworOyBhcyB0aGUgcm91dGluZSBpcyBlbnRlcmVkLgorOworCis7Cis7IEdsb2JhbHMgdXNlZCBpbiBzb21lIHJvdXRpbmVzCis7CisKK3RvcF9vdmVyZmxvdyAucmVnICVyMjMKK2hpZ2hfbWFzayAgICAucmVnICVyMjIgICAgOyB2YWx1ZSAweGZmZmZmZmZmODAwMDAwMDBMCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBibl9tdWxfYWRkX3dvcmRzCis7Cis7Qk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcl9wdHIsIEJOX1VMT05HICphX3B0ciwgCis7CQkJCQkJCQlpbnQgbnVtLCBCTl9VTE9ORyB3KQorOworOyBhcmcwID0gcl9wdHIKKzsgYXJnMSA9IGFfcHRyCis7IGFyZzMgPSBudW0KKzsgLTU2KHNwKSA9ICB3Cis7Cis7IExvY2FsIHJlZ2lzdGVyIGRlZmluaXRpb25zCis7CisKK2ZtMSAgICAgICAgICAucmVnICVmcjIyCitmbSAgICAgICAgICAgLnJlZyAlZnIyMworaHRfdGVtcCAgICAgIC5yZWcgJWZyMjQKK2h0X3RlbXBfMSAgICAucmVnICVmcjI1CitsdF90ZW1wICAgICAgLnJlZyAlZnIyNgorbHRfdGVtcF8xICAgIC5yZWcgJWZyMjcKK2ZtMV8xICAgICAgICAucmVnICVmcjI4CitmbV8xICAgICAgICAgLnJlZyAlZnIyOQorCitmd19oICAgICAgICAgLnJlZyAlZnI3TAorZndfbCAgICAgICAgIC5yZWcgJWZyN1IKK2Z3ICAgICAgICAgICAucmVnICVmcjcKKworZmh0XzAgICAgICAgIC5yZWcgJWZyOEwKK2ZsdF8wICAgICAgICAucmVnICVmcjhSCit0X2Zsb2F0XzAgICAgLnJlZyAlZnI4CisKK2ZodF8xICAgICAgICAucmVnICVmcjlMCitmbHRfMSAgICAgICAgLnJlZyAlZnI5UgordF9mbG9hdF8xICAgIC5yZWcgJWZyOQorCit0bXBfMCAgICAgICAgLnJlZyAlcjMxCit0bXBfMSAgICAgICAgLnJlZyAlcjIxCittXzAgICAgICAgICAgLnJlZyAlcjIwIAorbV8xICAgICAgICAgIC5yZWcgJXIxOSAKK2h0XzAgICAgICAgICAucmVnICVyMSAgCitodF8xICAgICAgICAgLnJlZyAlcjMKK2x0XzAgICAgICAgICAucmVnICVyNAorbHRfMSAgICAgICAgIC5yZWcgJXI1CittMV8wICAgICAgICAgLnJlZyAlcjYgCittMV8xICAgICAgICAgLnJlZyAlcjcgCitycF92YWwgICAgICAgLnJlZyAlcjgKK3JwX3ZhbF8xICAgICAucmVnICVyOQorCitibl9tdWxfYWRkX3dvcmRzCisJLmV4cG9ydAlibl9tdWxfYWRkX3dvcmRzLGVudHJ5LE5PX1JFTE9DQVRJT04sTE9OR19SRVRVUk4KKwkucHJvYworCS5jYWxsaW5mbyBmcmFtZT0xMjgKKyAgICAuZW50cnkKKwkuYWxpZ24gNjQKKworICAgIFNURCAgICAgJXIzLDAoJXNwKSAgICAgICAgICA7IHNhdmUgcjMgIAorICAgIFNURCAgICAgJXI0LDgoJXNwKSAgICAgICAgICA7IHNhdmUgcjQgIAorCU5PUCAgICAgICAgICAgICAgICAgICAgICAgICA7IE5lZWRlZCB0byBtYWtlIHRoZSBsb29wIDE2LWJ5dGUgYWxpZ25lZAorCU5PUCAgICAgICAgICAgICAgICAgICAgICAgICA7IG5lZWRlZCB0byBtYWtlIHRoZSBsb29wIDE2LWJ5dGUgYWxpZ25lZAorCisgICAgU1REICAgICAlcjUsMTYoJXNwKSAgICAgICAgIDsgc2F2ZSByNSAgCisJTk9QCisgICAgU1REICAgICAlcjYsMjQoJXNwKSAgICAgICAgIDsgc2F2ZSByNiAgCisgICAgU1REICAgICAlcjcsMzIoJXNwKSAgICAgICAgIDsgc2F2ZSByNyAgCisKKyAgICBTVEQgICAgICVyOCw0MCglc3ApICAgICAgICAgOyBzYXZlIHI4ICAKKyAgICBTVEQgICAgICVyOSw0OCglc3ApICAgICAgICAgOyBzYXZlIHI5ICAKKyAgICBDT1BZICAgICVyMCwlcmV0MSAgICAgICAgICAgOyByZXR1cm4gMCBieSBkZWZhdWx0CisgICAgREVQREksWiAxLDMxLDEsdG9wX292ZXJmbG93IDsgdG9wX292ZXJmbG93ID0gMSA8PCAzMiAgICAKKworICAgIENNUElCLD49IDAsbnVtLGJuX211bF9hZGRfd29yZHNfZXhpdCAgOyBpZiAobnVtIDw9IDApIHRoZW4gZXhpdAorCUxETyAgICAgMTI4KCVzcCksJXNwICAgICAgICA7IGJ1bXAgc3RhY2sKKworCTsKKwk7IFRoZSBsb29wIGlzIHVucm9sbGVkIHR3aWNlLCBzbyBpZiB0aGVyZSBpcyBvbmx5IDEgbnVtYmVyCisgICAgOyB0aGVuIGdvIHN0cmFpZ2h0IHRvIHRoZSBjbGVhbnVwIGNvZGUuCisJOworCUNNUElCLD0gMSxudW0sYm5fbXVsX2FkZF93b3Jkc19zaW5nbGVfdG9wCisJRkxERCAgICAtMTg0KCVzcCksZncgICAgICAgIDsgKC01Ni0xMjgpIGxvYWQgdXAgdyBpbnRvIGZ3IChmd19oL2Z3X2wpCisKKwk7CisJOyBUaGlzIGxvb3AgaXMgdW5yb2xsZWQgMiB0aW1lcyAoNjQtYnl0ZSBhbGlnbmVkIGFzIHdlbGwpCisJOworCTsgUEEtUklTQyAyLjAgY2hpcHMgaGF2ZSB0d28gZnVsbHkgcGlwZWxpbmVkIG11bHRpcGxpZXJzLCB0aHVzCisgICAgOyB0d28gMzItYml0IG11dGlwbGllcyBjYW4gYmUgaXNzdWVkIHBlciBjeWNsZS4KKyAgICA7IAorYm5fbXVsX2FkZF93b3Jkc191bnJvbGwyCisKKyAgICBGTEREICAgIDAoYV9wdHIpLHRfZmxvYXRfMCAgICAgICA7IGxvYWQgdXAgNjQtYml0IHZhbHVlIChmcjhMKSBodChMKS9sdChSKQorICAgIEZMREQgICAgOChhX3B0ciksdF9mbG9hdF8xICAgICAgIDsgbG9hZCB1cCA2NC1iaXQgdmFsdWUgKGZyOEwpIGh0KEwpL2x0KFIpCisgICAgTEREICAgICAwKHJfcHRyKSxycF92YWwgICAgICAgICAgOyBycFswXQorICAgIExERCAgICAgOChyX3B0cikscnBfdmFsXzEgICAgICAgIDsgcnBbMV0KKworICAgIFhNUFlVICAgZmh0XzAsZndfbCxmbTEgICAgICAgICAgIDsgbTFbMF0gPSBmaHRfMCpmd19sCisgICAgWE1QWVUgICBmaHRfMSxmd19sLGZtMV8xICAgICAgICAgOyBtMVsxXSA9IGZodF8xKmZ3X2wKKyAgICBGU1REICAgIGZtMSwtMTYoJXNwKSAgICAgICAgICAgICA7IC0xNihzcCkgPSBtMVswXQorICAgIEZTVEQgICAgZm0xXzEsLTQ4KCVzcCkgICAgICAgICAgIDsgLTQ4KHNwKSA9IG0xWzFdCisKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2gsZm0gICAgICAgICAgICA7IG1bMF0gPSBmbHRfMCpmd19oCisgICAgWE1QWVUgICBmbHRfMSxmd19oLGZtXzEgICAgICAgICAgOyBtWzFdID0gZmx0XzEqZndfaAorICAgIEZTVEQgICAgZm0sLTgoJXNwKSAgICAgICAgICAgICAgIDsgLTgoc3ApID0gbVswXQorICAgIEZTVEQgICAgZm1fMSwtNDAoJXNwKSAgICAgICAgICAgIDsgLTQwKHNwKSA9IG1bMV0KKworICAgIFhNUFlVICAgZmh0XzAsZndfaCxodF90ZW1wICAgICAgIDsgaHRfdGVtcCAgID0gZmh0XzAqZndfaAorICAgIFhNUFlVICAgZmh0XzEsZndfaCxodF90ZW1wXzEgICAgIDsgaHRfdGVtcF8xID0gZmh0XzEqZndfaAorICAgIEZTVEQgICAgaHRfdGVtcCwtMjQoJXNwKSAgICAgICAgIDsgLTI0KHNwKSAgID0gaHRfdGVtcAorICAgIEZTVEQgICAgaHRfdGVtcF8xLC01Niglc3ApICAgICAgIDsgLTU2KHNwKSAgID0gaHRfdGVtcF8xCisKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2wsbHRfdGVtcCAgICAgICA7IGx0X3RlbXAgPSBsdCpmd19sCisgICAgWE1QWVUgICBmbHRfMSxmd19sLGx0X3RlbXBfMSAgICAgOyBsdF90ZW1wID0gbHQqZndfbAorICAgIEZTVEQgICAgbHRfdGVtcCwtMzIoJXNwKSAgICAgICAgIDsgLTMyKHNwKSA9IGx0X3RlbXAgCisgICAgRlNURCAgICBsdF90ZW1wXzEsLTY0KCVzcCkgICAgICAgOyAtNjQoc3ApID0gbHRfdGVtcF8xIAorCisgICAgTEREICAgICAtOCglc3ApLG1fMCAgICAgICAgICAgICAgOyBtWzBdIAorICAgIExERCAgICAgLTQwKCVzcCksbV8xICAgICAgICAgICAgIDsgbVsxXQorICAgIExERCAgICAgLTE2KCVzcCksbTFfMCAgICAgICAgICAgIDsgbTFbMF0KKyAgICBMREQgICAgIC00OCglc3ApLG0xXzEgICAgICAgICAgICA7IG0xWzFdCisKKyAgICBMREQgICAgIC0yNCglc3ApLGh0XzAgICAgICAgICAgICA7IGh0WzBdCisgICAgTEREICAgICAtNTYoJXNwKSxodF8xICAgICAgICAgICAgOyBodFsxXQorICAgIEFERCxMICAgbTFfMCxtXzAsdG1wXzAgICAgICAgICAgIDsgdG1wXzAgPSBtWzBdICsgbTFbMF07IAorICAgIEFERCxMICAgbTFfMSxtXzEsdG1wXzEgICAgICAgICAgIDsgdG1wXzEgPSBtWzFdICsgbTFbMV07IAorCisgICAgTEREICAgICAtMzIoJXNwKSxsdF8wICAgICAgICAgICAgCisgICAgTEREICAgICAtNjQoJXNwKSxsdF8xICAgICAgICAgICAgCisgICAgQ01QQ0xSLCo+Pj0gdG1wXzAsbTFfMCwgJXIwICAgICAgOyBpZiAobVswXSA8IG0xWzBdKQorICAgIEFERCxMICAgaHRfMCx0b3Bfb3ZlcmZsb3csaHRfMCAgIDsgaHRbMF0gKz0gKDE8PDMyKQorCisgICAgQ01QQ0xSLCo+Pj0gdG1wXzEsbTFfMSwlcjAgICAgICAgOyBpZiAobVsxXSA8IG0xWzFdKQorICAgIEFERCxMICAgaHRfMSx0b3Bfb3ZlcmZsb3csaHRfMSAgIDsgaHRbMV0gKz0gKDE8PDMyKQorICAgIEVYVFJELFUgdG1wXzAsMzEsMzIsbV8wICAgICAgICAgIDsgbVswXT4+MzIgIAorICAgIERFUEQsWiAgdG1wXzAsMzEsMzIsbTFfMCAgICAgICAgIDsgbTFbMF0gPSBtWzBdPDwzMiAKKworICAgIEVYVFJELFUgdG1wXzEsMzEsMzIsbV8xICAgICAgICAgIDsgbVsxXT4+MzIgIAorICAgIERFUEQsWiAgdG1wXzEsMzEsMzIsbTFfMSAgICAgICAgIDsgbTFbMV0gPSBtWzFdPDwzMiAKKyAgICBBREQsTCAgIGh0XzAsbV8wLGh0XzAgICAgICAgICAgICA7IGh0WzBdKz0gKG1bMF0+PjMyKQorICAgIEFERCxMICAgaHRfMSxtXzEsaHRfMSAgICAgICAgICAgIDsgaHRbMV0rPSAobVsxXT4+MzIpCisKKyAgICBBREQgICAgIGx0XzAsbTFfMCxsdF8wICAgICAgICAgICA7IGx0WzBdID0gbHRbMF0rbTFbMF07CisJQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgOyBodFswXSsrCisgICAgQUREICAgICBsdF8xLG0xXzEsbHRfMSAgICAgICAgICAgOyBsdFsxXSA9IGx0WzFdK20xWzFdOworICAgIEFERCxEQyAgaHRfMSwlcjAsaHRfMSAgICAgICAgICAgIDsgaHRbMV0rKworCisgICAgQUREICAgICVyZXQxLGx0XzAsbHRfMCAgICAgICAgICAgOyBsdFswXSA9IGx0WzBdICsgYzsKKwlBREQsREMgIGh0XzAsJXIwLGh0XzAgICAgICAgICAgICA7IGh0WzBdKysKKyAgICBBREQgICAgIGx0XzAscnBfdmFsLGx0XzAgICAgICAgICA7IGx0WzBdID0gbHRbMF0rcnBbMF0KKyAgICBBREQsREMgIGh0XzAsJXIwLGh0XzAgICAgICAgICAgICA7IGh0WzBdKysKKworCUxETyAgICAtMihudW0pLG51bSAgICAgICAgICAgICAgIDsgbnVtID0gbnVtIC0gMjsKKyAgICBBREQgICAgIGh0XzAsbHRfMSxsdF8xICAgICAgICAgICA7IGx0WzFdID0gbHRbMV0gKyBodF8wIChjKTsKKyAgICBBREQsREMgIGh0XzEsJXIwLGh0XzEgICAgICAgICAgICA7IGh0WzFdKysKKyAgICBTVEQgICAgIGx0XzAsMChyX3B0cikgICAgICAgICAgICA7IHJwWzBdID0gbHRbMF0KKworICAgIEFERCAgICAgbHRfMSxycF92YWxfMSxsdF8xICAgICAgIDsgbHRbMV0gPSBsdFsxXStycFsxXQorICAgIEFERCxEQyAgaHRfMSwlcjAsJXJldDEgICAgICAgICAgIDsgaHRbMV0rKworICAgIExETyAgICAgMTYoYV9wdHIpLGFfcHRyICAgICAgICAgIDsgYV9wdHIgKz0gMgorCisgICAgU1REICAgICBsdF8xLDgocl9wdHIpICAgICAgICAgICAgOyBycFsxXSA9IGx0WzFdCisJQ01QSUIsPD0gMixudW0sYm5fbXVsX2FkZF93b3Jkc191bnJvbGwyIDsgZ28gYWdhaW4gaWYgbW9yZSB0byBkbworICAgIExETyAgICAgMTYocl9wdHIpLHJfcHRyICAgICAgICAgIDsgcl9wdHIgKz0gMgorCisgICAgQ01QSUIsPSxOIDAsbnVtLGJuX211bF9hZGRfd29yZHNfZXhpdCA7IGFyZSB3ZSBkb25lLCBvciBjbGVhbnVwIGxhc3Qgb25lCisKKwk7CisJOyBUb3Agb2YgbG9vcCBhbGlnbmVkIG9uIDY0LWJ5dGUgYm91bmRhcnkKKwk7Citibl9tdWxfYWRkX3dvcmRzX3NpbmdsZV90b3AKKyAgICBGTEREICAgIDAoYV9wdHIpLHRfZmxvYXRfMCAgICAgICAgOyBsb2FkIHVwIDY0LWJpdCB2YWx1ZSAoZnI4TCkgaHQoTCkvbHQoUikKKyAgICBMREQgICAgIDAocl9wdHIpLHJwX3ZhbCAgICAgICAgICAgOyBycFswXQorICAgIExETyAgICAgOChhX3B0ciksYV9wdHIgICAgICAgICAgICA7IGFfcHRyKysKKyAgICBYTVBZVSAgIGZodF8wLGZ3X2wsZm0xICAgICAgICAgICAgOyBtMSA9IGh0KmZ3X2wKKyAgICBGU1REICAgIGZtMSwtMTYoJXNwKSAgICAgICAgICAgICAgOyAtMTYoc3ApID0gbTEKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2gsZm0gICAgICAgICAgICAgOyBtID0gbHQqZndfaAorICAgIEZTVEQgICAgZm0sLTgoJXNwKSAgICAgICAgICAgICAgICA7IC04KHNwKSA9IG0KKyAgICBYTVBZVSAgIGZodF8wLGZ3X2gsaHRfdGVtcCAgICAgICAgOyBodF90ZW1wID0gaHQqZndfaAorICAgIEZTVEQgICAgaHRfdGVtcCwtMjQoJXNwKSAgICAgICAgICA7IC0yNChzcCkgPSBodAorICAgIFhNUFlVICAgZmx0XzAsZndfbCxsdF90ZW1wICAgICAgICA7IGx0X3RlbXAgPSBsdCpmd19sCisgICAgRlNURCAgICBsdF90ZW1wLC0zMiglc3ApICAgICAgICAgIDsgLTMyKHNwKSA9IGx0IAorCisgICAgTEREICAgICAtOCglc3ApLG1fMCAgICAgICAgICAgICAgIAorICAgIExERCAgICAtMTYoJXNwKSxtMV8wICAgICAgICAgICAgICA7IG0xID0gdGVtcDEgCisgICAgQURELEwgICBtXzAsbTFfMCx0bXBfMCAgICAgICAgICAgIDsgdG1wXzAgPSBtICsgbTE7IAorICAgIExERCAgICAgLTI0KCVzcCksaHRfMCAgICAgICAgICAgICAKKyAgICBMREQgICAgIC0zMiglc3ApLGx0XzAgICAgICAgICAgICAgCisKKyAgICBDTVBDTFIsKj4+PSB0bXBfMCxtMV8wLCVyMCAgICAgICAgOyBpZiAobSA8IG0xKQorICAgIEFERCxMICAgaHRfMCx0b3Bfb3ZlcmZsb3csaHRfMCAgICA7IGh0ICs9ICgxPDwzMikKKworICAgIEVYVFJELFUgdG1wXzAsMzEsMzIsbV8wICAgICAgICAgICA7IG0+PjMyICAKKyAgICBERVBELFogIHRtcF8wLDMxLDMyLG0xXzAgICAgICAgICAgOyBtMSA9IG08PDMyIAorCisgICAgQURELEwgICBodF8wLG1fMCxodF8wICAgICAgICAgICAgIDsgaHQrPSAobT4+MzIpCisgICAgQUREICAgICBsdF8wLG0xXzAsdG1wXzAgICAgICAgICAgIDsgdG1wXzAgPSBsdCttMTsKKyAgICBBREQsREMgIGh0XzAsJXIwLGh0XzAgICAgICAgICAgICAgOyBodCsrCisgICAgQUREICAgICAlcmV0MSx0bXBfMCxsdF8wICAgICAgICAgIDsgbHQgPSBsdCArIGM7CisgICAgQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworICAgIEFERCAgICAgbHRfMCxycF92YWwsbHRfMCAgICAgICAgICA7IGx0ID0gbHQrcnBbMF0KKyAgICBBREQsREMgIGh0XzAsJXIwLCVyZXQxICAgICAgICAgICAgOyBodCsrCisgICAgU1REICAgICBsdF8wLDAocl9wdHIpICAgICAgICAgICAgIDsgcnBbMF0gPSBsdAorCitibl9tdWxfYWRkX3dvcmRzX2V4aXQKKyAgICAuRVhJVAorCQorICAgIEVYVFJELFUgJXJldDEsMzEsMzIsJXJldDAgICAgICAgICA7IGZvciAzMi1iaXQsIHJldHVybiBpbiByZXQwL3JldDEKKyAgICBMREQgICAgIC04MCglc3ApLCVyOSAgICAgICAgICAgICAgOyByZXN0b3JlIHI5ICAKKyAgICBMREQgICAgIC04OCglc3ApLCVyOCAgICAgICAgICAgICAgOyByZXN0b3JlIHI4ICAKKyAgICBMREQgICAgIC05Niglc3ApLCVyNyAgICAgICAgICAgICAgOyByZXN0b3JlIHI3ICAKKyAgICBMREQgICAgIC0xMDQoJXNwKSwlcjYgICAgICAgICAgICAgOyByZXN0b3JlIHI2ICAKKyAgICBMREQgICAgIC0xMTIoJXNwKSwlcjUgICAgICAgICAgICAgOyByZXN0b3JlIHI1ICAKKyAgICBMREQgICAgIC0xMjAoJXNwKSwlcjQgICAgICAgICAgICAgOyByZXN0b3JlIHI0ICAKKyAgICBCVkUgICAgICglcnApCisgICAgTERELE1CICAtMTI4KCVzcCksJXIzICAgICAgICAgICAgIDsgcmVzdG9yZSByMworCS5QUk9DRU5ECTtpbj0yMywyNCwyNSwyNiwyOTtvdXQ9Mjg7CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7Qk5fVUxPTkcgYm5fbXVsX3dvcmRzKEJOX1VMT05HICpycCwgQk5fVUxPTkcgKmFwLCBpbnQgbnVtLCBCTl9VTE9ORyB3KQorOworOyBhcmcwID0gcnAKKzsgYXJnMSA9IGFwCis7IGFyZzMgPSBudW0KKzsgdyBvbiBzdGFjayBhdCAtNTYoc3ApCisKK2JuX211bF93b3JkcworCS5wcm9jCisJLmNhbGxpbmZvIGZyYW1lPTEyOAorICAgIC5lbnRyeQorCS5FWFBPUlQJYm5fbXVsX3dvcmRzLEVOVFJZLFBSSVZfTEVWPTMsTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorCS5hbGlnbiA2NAorCisgICAgU1REICAgICAlcjMsMCglc3ApICAgICAgICAgIDsgc2F2ZSByMyAgCisgICAgU1REICAgICAlcjQsOCglc3ApICAgICAgICAgIDsgc2F2ZSByNCAgCisJTk9QCisgICAgU1REICAgICAlcjUsMTYoJXNwKSAgICAgICAgIDsgc2F2ZSByNSAgCisKKyAgICBTVEQgICAgICVyNiwyNCglc3ApICAgICAgICAgOyBzYXZlIHI2ICAKKyAgICBTVEQgICAgICVyNywzMiglc3ApICAgICAgICAgOyBzYXZlIHI3ICAKKyAgICBDT1BZICAgICVyMCwlcmV0MSAgICAgICAgICAgOyByZXR1cm4gMCBieSBkZWZhdWx0CisgICAgREVQREksWiAxLDMxLDEsdG9wX292ZXJmbG93IDsgdG9wX292ZXJmbG93ID0gMSA8PCAzMiAgICAKKworICAgIENNUElCLD49IDAsbnVtLGJuX211bF93b3Jkc19leGl0CisJTERPICAgICAxMjgoJXNwKSwlc3AgICAgOyBidW1wIHN0YWNrCisKKwk7CisJOyBTZWUgaWYgb25seSAxIHdvcmQgdG8gZG8sIHRodXMganVzdCBkbyBjbGVhbnVwCisJOworCUNNUElCLD0gMSxudW0sYm5fbXVsX3dvcmRzX3NpbmdsZV90b3AKKwlGTEREICAgIC0xODQoJXNwKSxmdyAgICAgICAgOyAoLTU2LTEyOCkgbG9hZCB1cCB3IGludG8gZncgKGZ3X2gvZndfbCkKKworCTsKKwk7IFRoaXMgbG9vcCBpcyB1bnJvbGxlZCAyIHRpbWVzICg2NC1ieXRlIGFsaWduZWQgYXMgd2VsbCkKKwk7CisJOyBQQS1SSVNDIDIuMCBjaGlwcyBoYXZlIHR3byBmdWxseSBwaXBlbGluZWQgbXVsdGlwbGllcnMsIHRodXMKKyAgICA7IHR3byAzMi1iaXQgbXV0aXBsaWVzIGNhbiBiZSBpc3N1ZWQgcGVyIGN5Y2xlLgorICAgIDsgCitibl9tdWxfd29yZHNfdW5yb2xsMgorCisgICAgRkxERCAgICAwKGFfcHRyKSx0X2Zsb2F0XzAgICAgICAgIDsgbG9hZCB1cCA2NC1iaXQgdmFsdWUgKGZyOEwpIGh0KEwpL2x0KFIpCisgICAgRkxERCAgICA4KGFfcHRyKSx0X2Zsb2F0XzEgICAgICAgIDsgbG9hZCB1cCA2NC1iaXQgdmFsdWUgKGZyOEwpIGh0KEwpL2x0KFIpCisgICAgWE1QWVUgICBmaHRfMCxmd19sLGZtMSAgICAgICAgICAgIDsgbTFbMF0gPSBmaHRfMCpmd19sCisgICAgWE1QWVUgICBmaHRfMSxmd19sLGZtMV8xICAgICAgICAgIDsgbTFbMV0gPSBodCpmd19sCisKKyAgICBGU1REICAgIGZtMSwtMTYoJXNwKSAgICAgICAgICAgICAgOyAtMTYoc3ApID0gbTEKKyAgICBGU1REICAgIGZtMV8xLC00OCglc3ApICAgICAgICAgICAgOyAtNDgoc3ApID0gbTEKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2gsZm0gICAgICAgICAgICAgOyBtID0gbHQqZndfaAorICAgIFhNUFlVICAgZmx0XzEsZndfaCxmbV8xICAgICAgICAgICA7IG0gPSBsdCpmd19oCisKKyAgICBGU1REICAgIGZtLC04KCVzcCkgICAgICAgICAgICAgICAgOyAtOChzcCkgPSBtCisgICAgRlNURCAgICBmbV8xLC00MCglc3ApICAgICAgICAgICAgIDsgLTQwKHNwKSA9IG0KKyAgICBYTVBZVSAgIGZodF8wLGZ3X2gsaHRfdGVtcCAgICAgICAgOyBodF90ZW1wID0gZmh0XzAqZndfaAorICAgIFhNUFlVICAgZmh0XzEsZndfaCxodF90ZW1wXzEgICAgICA7IGh0X3RlbXAgPSBodCpmd19oCisKKyAgICBGU1REICAgIGh0X3RlbXAsLTI0KCVzcCkgICAgICAgICAgOyAtMjQoc3ApID0gaHQKKyAgICBGU1REICAgIGh0X3RlbXBfMSwtNTYoJXNwKSAgICAgICAgOyAtNTYoc3ApID0gaHQKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2wsbHRfdGVtcCAgICAgICAgOyBsdF90ZW1wID0gbHQqZndfbAorICAgIFhNUFlVICAgZmx0XzEsZndfbCxsdF90ZW1wXzEgICAgICA7IGx0X3RlbXAgPSBsdCpmd19sCisKKyAgICBGU1REICAgIGx0X3RlbXAsLTMyKCVzcCkgICAgICAgICAgOyAtMzIoc3ApID0gbHQgCisgICAgRlNURCAgICBsdF90ZW1wXzEsLTY0KCVzcCkgICAgICAgIDsgLTY0KHNwKSA9IGx0IAorICAgIExERCAgICAgLTgoJXNwKSxtXzAgICAgICAgICAgICAgICAKKyAgICBMREQgICAgIC00MCglc3ApLG1fMSAgICAgICAgICAgICAgCisKKyAgICBMREQgICAgLTE2KCVzcCksbTFfMCAgICAgICAgICAgICAgCisgICAgTEREICAgIC00OCglc3ApLG0xXzEgICAgICAgICAgICAgIAorICAgIExERCAgICAgLTI0KCVzcCksaHRfMCAgICAgICAgICAgICAKKyAgICBMREQgICAgIC01Niglc3ApLGh0XzEgICAgICAgICAgICAgCisKKyAgICBBREQsTCAgIG0xXzAsbV8wLHRtcF8wICAgICAgICAgICAgOyB0bXBfMCA9IG0gKyBtMTsgCisgICAgQURELEwgICBtMV8xLG1fMSx0bXBfMSAgICAgICAgICAgIDsgdG1wXzEgPSBtICsgbTE7IAorICAgIExERCAgICAgLTMyKCVzcCksbHRfMCAgICAgICAgICAgICAKKyAgICBMREQgICAgIC02NCglc3ApLGx0XzEgICAgICAgICAgICAgCisKKyAgICBDTVBDTFIsKj4+PSB0bXBfMCxtMV8wLCAlcjAgICAgICAgOyBpZiAobSA8IG0xKQorICAgIEFERCxMICAgaHRfMCx0b3Bfb3ZlcmZsb3csaHRfMCAgICA7IGh0ICs9ICgxPDwzMikKKyAgICBDTVBDTFIsKj4+PSB0bXBfMSxtMV8xLCVyMCAgICAgICAgOyBpZiAobSA8IG0xKQorICAgIEFERCxMICAgaHRfMSx0b3Bfb3ZlcmZsb3csaHRfMSAgICA7IGh0ICs9ICgxPDwzMikKKworICAgIEVYVFJELFUgdG1wXzAsMzEsMzIsbV8wICAgICAgICAgICA7IG0+PjMyICAKKyAgICBERVBELFogIHRtcF8wLDMxLDMyLG0xXzAgICAgICAgICAgOyBtMSA9IG08PDMyIAorICAgIEVYVFJELFUgdG1wXzEsMzEsMzIsbV8xICAgICAgICAgICA7IG0+PjMyICAKKyAgICBERVBELFogIHRtcF8xLDMxLDMyLG0xXzEgICAgICAgICAgOyBtMSA9IG08PDMyIAorCisgICAgQURELEwgICBodF8wLG1fMCxodF8wICAgICAgICAgICAgIDsgaHQrPSAobT4+MzIpCisgICAgQURELEwgICBodF8xLG1fMSxodF8xICAgICAgICAgICAgIDsgaHQrPSAobT4+MzIpCisgICAgQUREICAgICBsdF8wLG0xXzAsbHRfMCAgICAgICAgICAgIDsgbHQgPSBsdCttMTsKKwlBREQsREMgIGh0XzAsJXIwLGh0XzAgICAgICAgICAgICAgOyBodCsrCisKKyAgICBBREQgICAgIGx0XzEsbTFfMSxsdF8xICAgICAgICAgICAgOyBsdCA9IGx0K20xOworICAgIEFERCxEQyAgaHRfMSwlcjAsaHRfMSAgICAgICAgICAgICA7IGh0KysKKyAgICBBREQgICAgJXJldDEsbHRfMCxsdF8wICAgICAgICAgICAgOyBsdCA9IGx0ICsgYyAocmV0MSk7CisJQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworCisgICAgQUREICAgICBodF8wLGx0XzEsbHRfMSAgICAgICAgICAgIDsgbHQgPSBsdCArIGMgKGh0XzApCisgICAgQURELERDICBodF8xLCVyMCxodF8xICAgICAgICAgICAgIDsgaHQrKworICAgIFNURCAgICAgbHRfMCwwKHJfcHRyKSAgICAgICAgICAgICA7IHJwWzBdID0gbHQKKyAgICBTVEQgICAgIGx0XzEsOChyX3B0cikgICAgICAgICAgICAgOyBycFsxXSA9IGx0CisKKwlDT1BZICAgIGh0XzEsJXJldDEgICAgICAgICAgICAgICAgOyBjYXJyeSA9IGh0CisJTERPICAgIC0yKG51bSksbnVtICAgICAgICAgICAgICAgIDsgbnVtID0gbnVtIC0gMjsKKyAgICBMRE8gICAgIDE2KGFfcHRyKSxhX3B0ciAgICAgICAgICAgOyBhcCArPSAyCisJQ01QSUIsPD0gMixudW0sYm5fbXVsX3dvcmRzX3Vucm9sbDIKKyAgICBMRE8gICAgIDE2KHJfcHRyKSxyX3B0ciAgICAgICAgICAgOyBycCsrCisKKyAgICBDTVBJQiw9LE4gMCxudW0sYm5fbXVsX3dvcmRzX2V4aXQgOyBhcmUgd2UgZG9uZT8KKworCTsKKwk7IFRvcCBvZiBsb29wIGFsaWduZWQgb24gNjQtYnl0ZSBib3VuZGFyeQorCTsKK2JuX211bF93b3Jkc19zaW5nbGVfdG9wCisgICAgRkxERCAgICAwKGFfcHRyKSx0X2Zsb2F0XzAgICAgICAgIDsgbG9hZCB1cCA2NC1iaXQgdmFsdWUgKGZyOEwpIGh0KEwpL2x0KFIpCisKKyAgICBYTVBZVSAgIGZodF8wLGZ3X2wsZm0xICAgICAgICAgICAgOyBtMSA9IGh0KmZ3X2wKKyAgICBGU1REICAgIGZtMSwtMTYoJXNwKSAgICAgICAgICAgICAgOyAtMTYoc3ApID0gbTEKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2gsZm0gICAgICAgICAgICAgOyBtID0gbHQqZndfaAorICAgIEZTVEQgICAgZm0sLTgoJXNwKSAgICAgICAgICAgICAgICA7IC04KHNwKSA9IG0KKyAgICBYTVBZVSAgIGZodF8wLGZ3X2gsaHRfdGVtcCAgICAgICAgOyBodF90ZW1wID0gaHQqZndfaAorICAgIEZTVEQgICAgaHRfdGVtcCwtMjQoJXNwKSAgICAgICAgICA7IC0yNChzcCkgPSBodAorICAgIFhNUFlVICAgZmx0XzAsZndfbCxsdF90ZW1wICAgICAgICA7IGx0X3RlbXAgPSBsdCpmd19sCisgICAgRlNURCAgICBsdF90ZW1wLC0zMiglc3ApICAgICAgICAgIDsgLTMyKHNwKSA9IGx0IAorCisgICAgTEREICAgICAtOCglc3ApLG1fMCAgICAgICAgICAgICAgIAorICAgIExERCAgICAtMTYoJXNwKSxtMV8wICAgICAgICAgICAgICAKKyAgICBBREQsTCAgIG1fMCxtMV8wLHRtcF8wICAgICAgICAgICAgOyB0bXBfMCA9IG0gKyBtMTsgCisgICAgTEREICAgICAtMjQoJXNwKSxodF8wICAgICAgICAgICAgIAorICAgIExERCAgICAgLTMyKCVzcCksbHRfMCAgICAgICAgICAgICAKKworICAgIENNUENMUiwqPj49IHRtcF8wLG0xXzAsJXIwICAgICAgICA7IGlmIChtIDwgbTEpCisgICAgQURELEwgICBodF8wLHRvcF9vdmVyZmxvdyxodF8wICAgIDsgaHQgKz0gKDE8PDMyKQorCisgICAgRVhUUkQsVSB0bXBfMCwzMSwzMixtXzAgICAgICAgICAgIDsgbT4+MzIgIAorICAgIERFUEQsWiAgdG1wXzAsMzEsMzIsbTFfMCAgICAgICAgICA7IG0xID0gbTw8MzIgCisKKyAgICBBREQsTCAgIGh0XzAsbV8wLGh0XzAgICAgICAgICAgICAgOyBodCs9IChtPj4zMikKKyAgICBBREQgICAgIGx0XzAsbTFfMCxsdF8wICAgICAgICAgICAgOyBsdD0gbHQrbTE7CisgICAgQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworCisgICAgQUREICAgICAlcmV0MSxsdF8wLGx0XzAgICAgICAgICAgIDsgbHQgPSBsdCArIGM7CisgICAgQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworCisgICAgQ09QWSAgICBodF8wLCVyZXQxICAgICAgICAgICAgICAgIDsgY29weSBjYXJyeQorICAgIFNURCAgICAgbHRfMCwwKHJfcHRyKSAgICAgICAgICAgICA7IHJwWzBdID0gbHQKKworYm5fbXVsX3dvcmRzX2V4aXQKKyAgICAuRVhJVAorICAgIEVYVFJELFUgJXJldDEsMzEsMzIsJXJldDAgICAgICAgICAgIDsgZm9yIDMyLWJpdCwgcmV0dXJuIGluIHJldDAvcmV0MQorICAgIExERCAgICAgLTk2KCVzcCksJXI3ICAgICAgICAgICAgICA7IHJlc3RvcmUgcjcgIAorICAgIExERCAgICAgLTEwNCglc3ApLCVyNiAgICAgICAgICAgICA7IHJlc3RvcmUgcjYgIAorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgICAgICA7IHJlc3RvcmUgcjUgIAorICAgIExERCAgICAgLTEyMCglc3ApLCVyNCAgICAgICAgICAgICA7IHJlc3RvcmUgcjQgIAorICAgIEJWRSAgICAgKCVycCkKKyAgICBMREQsTUIgIC0xMjgoJXNwKSwlcjMgICAgICAgICAgICAgOyByZXN0b3JlIHIzCisJLlBST0NFTkQJCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7dm9pZCBibl9zcXJfd29yZHMoQk5fVUxPTkcgKnJwLCBCTl9VTE9ORyAqYXAsIGludCBudW0pCis7Cis7IGFyZzAgPSBycAorOyBhcmcxID0gYXAKKzsgYXJnMiA9IG51bQorOworCitibl9zcXJfd29yZHMKKwkucHJvYworCS5jYWxsaW5mbyBGUkFNRT0xMjgsRU5UUllfR1I9JXIzLEFSR1NfU0FWRUQsT1JERVJJTkdfQVdBUkUKKwkuRVhQT1JUCWJuX3Nxcl93b3JkcyxFTlRSWSxQUklWX0xFVj0zLE5PX1JFTE9DQVRJT04sTE9OR19SRVRVUk4KKyAgICAuZW50cnkKKwkuYWxpZ24gNjQKKworICAgIFNURCAgICAgJXIzLDAoJXNwKSAgICAgICAgICA7IHNhdmUgcjMgIAorICAgIFNURCAgICAgJXI0LDgoJXNwKSAgICAgICAgICA7IHNhdmUgcjQgIAorCU5PUAorICAgIFNURCAgICAgJXI1LDE2KCVzcCkgICAgICAgICA7IHNhdmUgcjUgIAorCisgICAgQ01QSUIsPj0gMCxudW0sYm5fc3FyX3dvcmRzX2V4aXQKKwlMRE8gICAgIDEyOCglc3ApLCVzcCAgICAgICA7IGJ1bXAgc3RhY2sKKworCTsKKwk7IElmIG9ubHkgMSwgdGhlIGdvdG8gc3RyYWlnaHQgdG8gY2xlYW51cAorCTsKKwlDTVBJQiw9IDEsbnVtLGJuX3Nxcl93b3Jkc19zaW5nbGVfdG9wCisgICAgREVQREksWiAtMSwzMiwzMyxoaWdoX21hc2sgICA7IENyZWF0ZSBNYXNrIDB4ZmZmZmZmZmY4MDAwMDAwMEwKKworCTsKKwk7IFRoaXMgbG9vcCBpcyB1bnJvbGxlZCAyIHRpbWVzICg2NC1ieXRlIGFsaWduZWQgYXMgd2VsbCkKKwk7CisKK2JuX3Nxcl93b3Jkc191bnJvbGwyCisgICAgRkxERCAgICAwKGFfcHRyKSx0X2Zsb2F0XzAgICAgICAgIDsgYVswXQorICAgIEZMREQgICAgOChhX3B0ciksdF9mbG9hdF8xICAgICAgICA7IGFbMV0KKyAgICBYTVBZVSAgIGZodF8wLGZsdF8wLGZtICAgICAgICAgICAgOyBtWzBdCisgICAgWE1QWVUgICBmaHRfMSxmbHRfMSxmbV8xICAgICAgICAgIDsgbVsxXQorCisgICAgRlNURCAgICBmbSwtMjQoJXNwKSAgICAgICAgICAgICAgIDsgc3RvcmUgbVswXQorICAgIEZTVEQgICAgZm1fMSwtNTYoJXNwKSAgICAgICAgICAgICA7IHN0b3JlIG1bMV0KKyAgICBYTVBZVSAgIGZsdF8wLGZsdF8wLGx0X3RlbXAgICAgICAgOyBsdFswXQorICAgIFhNUFlVICAgZmx0XzEsZmx0XzEsbHRfdGVtcF8xICAgICA7IGx0WzFdCisKKyAgICBGU1REICAgIGx0X3RlbXAsLTE2KCVzcCkgICAgICAgICAgOyBzdG9yZSBsdFswXQorICAgIEZTVEQgICAgbHRfdGVtcF8xLC00OCglc3ApICAgICAgICA7IHN0b3JlIGx0WzFdCisgICAgWE1QWVUgICBmaHRfMCxmaHRfMCxodF90ZW1wICAgICAgIDsgaHRbMF0KKyAgICBYTVBZVSAgIGZodF8xLGZodF8xLGh0X3RlbXBfMSAgICAgOyBodFsxXQorCisgICAgRlNURCAgICBodF90ZW1wLC04KCVzcCkgICAgICAgICAgIDsgc3RvcmUgaHRbMF0KKyAgICBGU1REICAgIGh0X3RlbXBfMSwtNDAoJXNwKSAgICAgICAgOyBzdG9yZSBodFsxXQorICAgIExERCAgICAgLTI0KCVzcCksbV8wICAgICAgICAgICAgIAorICAgIExERCAgICAgLTU2KCVzcCksbV8xICAgICAgICAgICAgICAKKworICAgIEFORCAgICAgbV8wLGhpZ2hfbWFzayx0bXBfMCAgICAgICA7IG1bMF0gJiBNYXNrCisgICAgQU5EICAgICBtXzEsaGlnaF9tYXNrLHRtcF8xICAgICAgIDsgbVsxXSAmIE1hc2sKKyAgICBERVBELFogIG1fMCwzMCwzMSxtXzAgICAgICAgICAgICAgOyBtWzBdIDw8IDMyKzEKKyAgICBERVBELFogIG1fMSwzMCwzMSxtXzEgICAgICAgICAgICAgOyBtWzFdIDw8IDMyKzEKKworICAgIExERCAgICAgLTE2KCVzcCksbHRfMCAgICAgICAgCisgICAgTEREICAgICAtNDgoJXNwKSxsdF8xICAgICAgICAKKyAgICBFWFRSRCxVIHRtcF8wLDMyLDMzLHRtcF8wICAgICAgICAgOyB0bXBfMCA9IG1bMF0mTWFzayA+PiAzMi0xCisgICAgRVhUUkQsVSB0bXBfMSwzMiwzMyx0bXBfMSAgICAgICAgIDsgdG1wXzEgPSBtWzFdJk1hc2sgPj4gMzItMQorCisgICAgTEREICAgICAtOCglc3ApLGh0XzAgICAgICAgICAgICAKKyAgICBMREQgICAgIC00MCglc3ApLGh0XzEgICAgICAgICAgIAorICAgIEFERCxMICAgaHRfMCx0bXBfMCxodF8wICAgICAgICAgICA7IGh0WzBdICs9IHRtcF8wCisgICAgQURELEwgICBodF8xLHRtcF8xLGh0XzEgICAgICAgICAgIDsgaHRbMV0gKz0gdG1wXzEKKworICAgIEFERCAgICAgbHRfMCxtXzAsbHRfMCAgICAgICAgICAgICA7IGx0ID0gbHQrbQorICAgIEFERCxEQyAgaHRfMCwlcjAsaHRfMCAgICAgICAgICAgICA7IGh0WzBdKysKKyAgICBTVEQgICAgIGx0XzAsMChyX3B0cikgICAgICAgICAgICAgOyBycFswXSA9IGx0WzBdCisgICAgU1REICAgICBodF8wLDgocl9wdHIpICAgICAgICAgICAgIDsgcnBbMV0gPSBodFsxXQorCisgICAgQUREICAgICBsdF8xLG1fMSxsdF8xICAgICAgICAgICAgIDsgbHQgPSBsdCttCisgICAgQURELERDICBodF8xLCVyMCxodF8xICAgICAgICAgICAgIDsgaHRbMV0rKworICAgIFNURCAgICAgbHRfMSwxNihyX3B0cikgICAgICAgICAgICA7IHJwWzJdID0gbHRbMV0KKyAgICBTVEQgICAgIGh0XzEsMjQocl9wdHIpICAgICAgICAgICAgOyBycFszXSA9IGh0WzFdCisKKwlMRE8gICAgLTIobnVtKSxudW0gICAgICAgICAgICAgICAgOyBudW0gPSBudW0gLSAyOworICAgIExETyAgICAgMTYoYV9wdHIpLGFfcHRyICAgICAgICAgICA7IGFwICs9IDIKKwlDTVBJQiw8PSAyLG51bSxibl9zcXJfd29yZHNfdW5yb2xsMgorICAgIExETyAgICAgMzIocl9wdHIpLHJfcHRyICAgICAgICAgICA7IHJwICs9IDQKKworICAgIENNUElCLD0sTiAwLG51bSxibl9zcXJfd29yZHNfZXhpdCA7IGFyZSB3ZSBkb25lPworCisJOworCTsgVG9wIG9mIGxvb3AgYWxpZ25lZCBvbiA2NC1ieXRlIGJvdW5kYXJ5CisJOworYm5fc3FyX3dvcmRzX3NpbmdsZV90b3AKKyAgICBGTEREICAgIDAoYV9wdHIpLHRfZmxvYXRfMCAgICAgICAgOyBsb2FkIHVwIDY0LWJpdCB2YWx1ZSAoZnI4TCkgaHQoTCkvbHQoUikKKworICAgIFhNUFlVICAgZmh0XzAsZmx0XzAsZm0gICAgICAgICAgICA7IG0KKyAgICBGU1REICAgIGZtLC0yNCglc3ApICAgICAgICAgICAgICAgOyBzdG9yZSBtCisKKyAgICBYTVBZVSAgIGZsdF8wLGZsdF8wLGx0X3RlbXAgICAgICAgOyBsdAorICAgIEZTVEQgICAgbHRfdGVtcCwtMTYoJXNwKSAgICAgICAgICA7IHN0b3JlIGx0CisKKyAgICBYTVBZVSAgIGZodF8wLGZodF8wLGh0X3RlbXAgICAgICAgOyBodAorICAgIEZTVEQgICAgaHRfdGVtcCwtOCglc3ApICAgICAgICAgICA7IHN0b3JlIGh0CisKKyAgICBMREQgICAgIC0yNCglc3ApLG1fMCAgICAgICAgICAgICAgOyBsb2FkIG0KKyAgICBBTkQgICAgIG1fMCxoaWdoX21hc2ssdG1wXzAgICAgICAgOyBtICYgTWFzaworICAgIERFUEQsWiAgbV8wLDMwLDMxLG1fMCAgICAgICAgICAgICA7IG0gPDwgMzIrMQorICAgIExERCAgICAgLTE2KCVzcCksbHRfMCAgICAgICAgICAgICA7IGx0CisKKyAgICBMREQgICAgIC04KCVzcCksaHRfMCAgICAgICAgICAgICAgOyBodAorICAgIEVYVFJELFUgdG1wXzAsMzIsMzMsdG1wXzAgICAgICAgICA7IHRtcF8wID0gbSZNYXNrID4+IDMyLTEKKyAgICBBREQgICAgIG1fMCxsdF8wLGx0XzAgICAgICAgICAgICAgOyBsdCA9IGx0K20KKyAgICBBREQsTCAgIGh0XzAsdG1wXzAsaHRfMCAgICAgICAgICAgOyBodCArPSB0bXBfMAorICAgIEFERCxEQyAgaHRfMCwlcjAsaHRfMCAgICAgICAgICAgICA7IGh0KysKKworICAgIFNURCAgICAgbHRfMCwwKHJfcHRyKSAgICAgICAgICAgICA7IHJwWzBdID0gbHQKKyAgICBTVEQgICAgIGh0XzAsOChyX3B0cikgICAgICAgICAgICAgOyBycFsxXSA9IGh0CisKK2JuX3Nxcl93b3Jkc19leGl0CisgICAgLkVYSVQKKyAgICBMREQgICAgIC0xMTIoJXNwKSwlcjUgICAgICAgOyByZXN0b3JlIHI1ICAKKyAgICBMREQgICAgIC0xMjAoJXNwKSwlcjQgICAgICAgOyByZXN0b3JlIHI0ICAKKyAgICBCVkUgICAgICglcnApCisgICAgTERELE1CICAtMTI4KCVzcCksJXIzIAorCS5QUk9DRU5ECTtpbj0yMywyNCwyNSwyNiwyOTtvdXQ9Mjg7CisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKztCTl9VTE9ORyBibl9hZGRfd29yZHMoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYiwgaW50IG4pCis7Cis7IGFyZzAgPSBycCAKKzsgYXJnMSA9IGFwCis7IGFyZzIgPSBicCAKKzsgYXJnMyA9IG4KKwordCAgLnJlZyAlcjIyCitiICAucmVnICVyMjEKK2wgIC5yZWcgJXIyMAorCitibl9hZGRfd29yZHMKKwkucHJvYworICAgIC5lbnRyeQorCS5jYWxsaW5mbworCS5FWFBPUlQJYm5fYWRkX3dvcmRzLEVOVFJZLFBSSVZfTEVWPTMsTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorCS5hbGlnbiA2NAorCisgICAgQ01QSUIsPj0gMCxuLGJuX2FkZF93b3Jkc19leGl0CisgICAgQ09QWSAgICAlcjAsJXJldDEgICAgICAgICAgIDsgcmV0dXJuIDAgYnkgZGVmYXVsdAorCisJOworCTsgSWYgMiBvciBtb3JlIG51bWJlcnMgZG8gdGhlIGxvb3AKKwk7CisJQ01QSUIsPSAxLG4sYm5fYWRkX3dvcmRzX3NpbmdsZV90b3AKKwlOT1AKKworCTsKKwk7IFRoaXMgbG9vcCBpcyB1bnJvbGxlZCAyIHRpbWVzICg2NC1ieXRlIGFsaWduZWQgYXMgd2VsbCkKKwk7Citibl9hZGRfd29yZHNfdW5yb2xsMgorCUxERCAgICAgMChhX3B0ciksdAorCUxERCAgICAgMChiX3B0ciksYgorCUFERCAgICAgdCwlcmV0MSx0ICAgICAgICAgICAgICAgICAgICA7IHQgPSB0K2M7CisJQURELERDICAlcjAsJXIwLCVyZXQxICAgICAgICAgICAgICAgIDsgc2V0IGMgdG8gY2FycnkKKwlBREQgICAgIHQsYixsICAgICAgICAgICAgICAgICAgICAgICAgOyBsID0gdCArIGJbMF0KKwlBREQsREMgICVyZXQxLCVyMCwlcmV0MSAgICAgICAgICAgICAgOyBjKz0gY2FycnkKKwlTVEQgICAgIGwsMChyX3B0cikKKworCUxERCAgICAgOChhX3B0ciksdAorCUxERCAgICAgOChiX3B0ciksYgorCUFERCAgICAgdCwlcmV0MSx0ICAgICAgICAgICAgICAgICAgICAgOyB0ID0gdCtjOworCUFERCxEQyAgJXIwLCVyMCwlcmV0MSAgICAgICAgICAgICAgICAgOyBzZXQgYyB0byBjYXJyeQorCUFERCAgICAgdCxiLGwgICAgICAgICAgICAgICAgICAgICAgICAgOyBsID0gdCArIGJbMF0KKwlBREQsREMgICVyZXQxLCVyMCwlcmV0MSAgICAgICAgICAgICAgIDsgYys9IGNhcnJ5CisJU1REICAgICBsLDgocl9wdHIpCisKKwlMRE8gICAgIC0yKG4pLG4KKwlMRE8gICAgIDE2KGFfcHRyKSxhX3B0cgorCUxETyAgICAgMTYoYl9wdHIpLGJfcHRyCisKKwlDTVBJQiw8PSAyLG4sYm5fYWRkX3dvcmRzX3Vucm9sbDIKKwlMRE8gICAgIDE2KHJfcHRyKSxyX3B0cgorCisgICAgQ01QSUIsPSxOIDAsbixibl9hZGRfd29yZHNfZXhpdCA7IGFyZSB3ZSBkb25lPworCitibl9hZGRfd29yZHNfc2luZ2xlX3RvcAorCUxERCAgICAgMChhX3B0ciksdAorCUxERCAgICAgMChiX3B0ciksYgorCisJQUREICAgICB0LCVyZXQxLHQgICAgICAgICAgICAgICAgIDsgdCA9IHQrYzsKKwlBREQsREMgICVyMCwlcjAsJXJldDEgICAgICAgICAgICAgOyBzZXQgYyB0byBjYXJyeSAoY291bGQgdXNlIENNUENMUj8/KQorCUFERCAgICAgdCxiLGwgICAgICAgICAgICAgICAgICAgICA7IGwgPSB0ICsgYlswXQorCUFERCxEQyAgJXJldDEsJXIwLCVyZXQxICAgICAgICAgICA7IGMrPSBjYXJyeQorCVNURCAgICAgbCwwKHJfcHRyKQorCitibl9hZGRfd29yZHNfZXhpdAorICAgIC5FWElUCisgICAgQlZFICAgICAoJXJwKQorICAgIEVYVFJELFUgJXJldDEsMzEsMzIsJXJldDAgICAgICAgICAgIDsgZm9yIDMyLWJpdCwgcmV0dXJuIGluIHJldDAvcmV0MQorCS5QUk9DRU5ECTtpbj0yMywyNCwyNSwyNiwyOTtvdXQ9Mjg7CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7Qk5fVUxPTkcgYm5fc3ViX3dvcmRzKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIsIGludCBuKQorOworOyBhcmcwID0gcnAgCis7IGFyZzEgPSBhcAorOyBhcmcyID0gYnAgCis7IGFyZzMgPSBuCisKK3QxICAgICAgIC5yZWcgJXIyMgordDIgICAgICAgLnJlZyAlcjIxCitzdWJfdG1wMSAucmVnICVyMjAKK3N1Yl90bXAyIC5yZWcgJXIxOQorCisKK2JuX3N1Yl93b3JkcworCS5wcm9jCisJLmNhbGxpbmZvIAorCS5FWFBPUlQJYm5fc3ViX3dvcmRzLEVOVFJZLFBSSVZfTEVWPTMsTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorICAgIC5lbnRyeQorCS5hbGlnbiA2NAorCisgICAgQ01QSUIsPj0gIDAsbixibl9zdWJfd29yZHNfZXhpdAorICAgIENPUFkgICAgJXIwLCVyZXQxICAgICAgICAgICA7IHJldHVybiAwIGJ5IGRlZmF1bHQKKworCTsKKwk7IElmIDIgb3IgbW9yZSBudW1iZXJzIGRvIHRoZSBsb29wCisJOworCUNNUElCLD0gMSxuLGJuX3N1Yl93b3Jkc19zaW5nbGVfdG9wCisJTk9QCisKKwk7CisJOyBUaGlzIGxvb3AgaXMgdW5yb2xsZWQgMiB0aW1lcyAoNjQtYnl0ZSBhbGlnbmVkIGFzIHdlbGwpCisJOworYm5fc3ViX3dvcmRzX3Vucm9sbDIKKwlMREQgICAgIDAoYV9wdHIpLHQxCisJTEREICAgICAwKGJfcHRyKSx0MgorCVNVQiAgICAgdDEsdDIsc3ViX3RtcDEgICAgICAgICAgIDsgdDMgPSB0MS10MjsgCisJU1VCICAgICBzdWJfdG1wMSwlcmV0MSxzdWJfdG1wMSAgOyB0MyA9IHQzLSBjOyAKKworCUNNUENMUiwqPj4gdDEsdDIsc3ViX3RtcDIgICAgICAgIDsgY2xlYXIgaWYgdDEgPiB0MgorCUxETyAgICAgIDEoJXIwKSxzdWJfdG1wMgorCQorCUNNUENMUiwqPSB0MSx0MiwlcjAKKwlDT1BZICAgIHN1Yl90bXAyLCVyZXQxCisJU1REICAgICBzdWJfdG1wMSwwKHJfcHRyKQorCisJTEREICAgICA4KGFfcHRyKSx0MQorCUxERCAgICAgOChiX3B0ciksdDIKKwlTVUIgICAgIHQxLHQyLHN1Yl90bXAxICAgICAgICAgICAgOyB0MyA9IHQxLXQyOyAKKwlTVUIgICAgIHN1Yl90bXAxLCVyZXQxLHN1Yl90bXAxICAgOyB0MyA9IHQzLSBjOyAKKwlDTVBDTFIsKj4+IHQxLHQyLHN1Yl90bXAyICAgICAgICAgOyBjbGVhciBpZiB0MSA+IHQyCisJTERPICAgICAgMSglcjApLHN1Yl90bXAyCisJCisJQ01QQ0xSLCo9IHQxLHQyLCVyMAorCUNPUFkgICAgc3ViX3RtcDIsJXJldDEKKwlTVEQgICAgIHN1Yl90bXAxLDgocl9wdHIpCisKKwlMRE8gICAgIC0yKG4pLG4KKwlMRE8gICAgIDE2KGFfcHRyKSxhX3B0cgorCUxETyAgICAgMTYoYl9wdHIpLGJfcHRyCisKKwlDTVBJQiw8PSAyLG4sYm5fc3ViX3dvcmRzX3Vucm9sbDIKKwlMRE8gICAgIDE2KHJfcHRyKSxyX3B0cgorCisgICAgQ01QSUIsPSxOIDAsbixibl9zdWJfd29yZHNfZXhpdCA7IGFyZSB3ZSBkb25lPworCitibl9zdWJfd29yZHNfc2luZ2xlX3RvcAorCUxERCAgICAgMChhX3B0ciksdDEKKwlMREQgICAgIDAoYl9wdHIpLHQyCisJU1VCICAgICB0MSx0MixzdWJfdG1wMSAgICAgICAgICAgIDsgdDMgPSB0MS10MjsgCisJU1VCICAgICBzdWJfdG1wMSwlcmV0MSxzdWJfdG1wMSAgIDsgdDMgPSB0My0gYzsgCisJQ01QQ0xSLCo+PiB0MSx0MixzdWJfdG1wMiAgICAgICAgIDsgY2xlYXIgaWYgdDEgPiB0MgorCUxETyAgICAgIDEoJXIwKSxzdWJfdG1wMgorCQorCUNNUENMUiwqPSB0MSx0MiwlcjAKKwlDT1BZICAgIHN1Yl90bXAyLCVyZXQxCisKKwlTVEQgICAgIHN1Yl90bXAxLDAocl9wdHIpCisKK2JuX3N1Yl93b3Jkc19leGl0CisgICAgLkVYSVQKKyAgICBCVkUgICAgICglcnApCisgICAgRVhUUkQsVSAlcmV0MSwzMSwzMiwlcmV0MCAgICAgICAgICAgOyBmb3IgMzItYml0LCByZXR1cm4gaW4gcmV0MC9yZXQxCisJLlBST0NFTkQJO2luPTIzLDI0LDI1LDI2LDI5O291dD0yODsKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyB1bnNpZ25lZCBsb25nIGJuX2Rpdl93b3Jkcyh1bnNpZ25lZCBsb25nIGgsIHVuc2lnbmVkIGxvbmcgbCwgdW5zaWduZWQgbG9uZyBkKQorOworOyBhcmcwID0gaAorOyBhcmcxID0gbAorOyBhcmcyID0gZAorOworOyBUaGlzIGlzIG1haW5seSBqdXN0IG91dHB1dCBmcm9tIHRoZSBIUCBDIGNvbXBpbGVyLiAgCis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitibl9kaXZfd29yZHMKKwkuUFJPQworCS5FWFBPUlQJYm5fZGl2X3dvcmRzLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IsUlROVkFMPUdSLExPTkdfUkVUVVJOCisJLklNUE9SVAlCTl9udW1fYml0c193b3JkLENPREUKKwk7LS0tIG5vdCBQSUMJLklNUE9SVAlfX2lvYixEQVRBCisJOy0tLSBub3QgUElDCS5JTVBPUlQJZnByaW50ZixDT0RFCisJLklNUE9SVAlhYm9ydCxDT0RFCisJLklNUE9SVAkkJGRpdjJVLE1JTExJQ09ERQorCS5DQUxMSU5GTyBDQUxMRVIsRlJBTUU9MTQ0LEVOVFJZX0dSPSVyOSxTQVZFX1JQLEFSR1NfU0FWRUQsT1JERVJJTkdfQVdBUkUKKyAgICAgICAgLkVOVFJZCisgICAgICAgIFNUVyAgICAgJXIyLC0yMCglcjMwKSAgIDtvZmZzZXQgMHg4ZWMKKyAgICAgICAgU1RXLE1BICAlcjMsMTkyKCVyMzApICAgO29mZnNldCAweDhmMAorICAgICAgICBTVFcgICAgICVyNCwtMTg4KCVyMzApICA7b2Zmc2V0IDB4OGY0CisgICAgICAgIERFUEQgICAgJXI1LDMxLDMyLCVyNiAgIDtvZmZzZXQgMHg4ZjgKKyAgICAgICAgU1REICAgICAlcjYsLTE4NCglcjMwKSAgO29mZnNldCAweDhmYworICAgICAgICBERVBEICAgICVyNywzMSwzMiwlcjggICA7b2Zmc2V0IDB4OTAwCisgICAgICAgIFNURCAgICAgJXI4LC0xNzYoJXIzMCkgIDtvZmZzZXQgMHg5MDQKKyAgICAgICAgU1RXICAgICAlcjksLTE2OCglcjMwKSAgO29mZnNldCAweDkwOAorICAgICAgICBMREQgICAgIC0yNDgoJXIzMCksJXIzICA7b2Zmc2V0IDB4OTBjCisgICAgICAgIENPUFkgICAgJXIyNiwlcjQgICAgICAgIDtvZmZzZXQgMHg5MTAKKyAgICAgICAgQ09QWSAgICAlcjI0LCVyNSAgICAgICAgO29mZnNldCAweDkxNAorICAgICAgICBERVBEICAgICVyMjUsMzEsMzIsJXI0ICA7b2Zmc2V0IDB4OTE4CisgICAgICAgIENNUEIsKjw+ICAgICAgICAlcjMsJXIwLCQwMDA2MDAwQyAgICAgICA7b2Zmc2V0IDB4OTFjCisgICAgICAgIERFUEQgICAgJXIyMywzMSwzMiwlcjUgIDtvZmZzZXQgMHg5MjAKKyAgICAgICAgTU9WSUIsVFIgICAgICAgIC0xLCVyMjksJDAwMDYwMDAyICAgICAgIDtvZmZzZXQgMHg5MjQKKyAgICAgICAgRVhUUkQsVSAlcjI5LDMxLDMyLCVyMjggO29mZnNldCAweDkyOAorJDAwMDYwMDJBCisgICAgICAgIExETyAgICAgLTEoJXIyOSksJXIyOSAgIDtvZmZzZXQgMHg5MmMKKyAgICAgICAgU1VCICAgICAlcjIzLCVyNywlcjIzICAgO29mZnNldCAweDkzMAorJDAwMDYwMDI0CisgICAgICAgIFNVQiAgICAgJXI0LCVyMzEsJXIyNSAgIDtvZmZzZXQgMHg5MzQKKyAgICAgICAgQU5EICAgICAlcjI1LCVyMTksJXIyNiAgO29mZnNldCAweDkzOAorICAgICAgICBDTVBCLCo8PixOICAgICAgJXIwLCVyMjYsJDAwMDYwMDQ2ICAgICAgO29mZnNldCAweDkzYworICAgICAgICBERVBELFogICVyMjUsMzEsMzIsJXIyMCA7b2Zmc2V0IDB4OTQwCisgICAgICAgIE9SICAgICAgJXIyMCwlcjI0LCVyMjEgIDtvZmZzZXQgMHg5NDQKKyAgICAgICAgQ01QQiwqPDwsTiAgICAgICVyMjEsJXIyMywkMDAwNjAwMkEgICAgIDtvZmZzZXQgMHg5NDgKKyAgICAgICAgU1VCICAgICAlcjMxLCVyMiwlcjMxICAgO29mZnNldCAweDk0YworJDAwMDYwMDQ2CiskMDAwNjAwMkUKKyAgICAgICAgREVQRCxaICAlcjIzLDMxLDMyLCVyMjUgO29mZnNldCAweDk1MAorICAgICAgICBFWFRSRCxVICVyMjMsMzEsMzIsJXIyNiA7b2Zmc2V0IDB4OTU0CisgICAgICAgIEFORCAgICAgJXIyNSwlcjE5LCVyMjQgIDtvZmZzZXQgMHg5NTgKKyAgICAgICAgQURELEwgICAlcjMxLCVyMjYsJXIzMSAgO29mZnNldCAweDk1YworICAgICAgICBDTVBDTFIsKj4+PSAgICAgJXI1LCVyMjQsJXIwICAgIDtvZmZzZXQgMHg5NjAKKyAgICAgICAgTERPICAgICAxKCVyMzEpLCVyMzEgICAgO29mZnNldCAweDk2NAorJDAwMDYwMDMyCisgICAgICAgIENNUEIsKjw8PSxOICAgICAlcjMxLCVyNCwkMDAwNjAwMzYgICAgICA7b2Zmc2V0IDB4OTY4CisgICAgICAgIExETyAgICAgLTEoJXIyOSksJXIyOSAgIDtvZmZzZXQgMHg5NmMKKyAgICAgICAgQURELEwgICAlcjQsJXIzLCVyNCAgICAgO29mZnNldCAweDk3MAorJDAwMDYwMDM2CisgICAgICAgIEFERElCLD0sTiAgICAgICAtMSwlcjgsJEQwICAgICAgO29mZnNldCAweDk3NAorICAgICAgICBTVUIgICAgICVyNSwlcjI0LCVyMjggICA7b2Zmc2V0IDB4OTc4CiskMDAwNjAwM0EKKyAgICAgICAgU1VCICAgICAlcjQsJXIzMSwlcjI0ICAgO29mZnNldCAweDk3YworICAgICAgICBTSFJQRCAgICVyMjQsJXIyOCwzMiwlcjQgICAgICAgIDtvZmZzZXQgMHg5ODAKKyAgICAgICAgREVQRCxaICAlcjI5LDMxLDMyLCVyOSAgO29mZnNldCAweDk4NAorICAgICAgICBERVBELFogICVyMjgsMzEsMzIsJXI1ICA7b2Zmc2V0IDB4OTg4CiskMDAwNjAwMUMKKyAgICAgICAgRVhUUkQsVSAlcjQsMzEsMzIsJXIzMSAgO29mZnNldCAweDk4YworICAgICAgICBDTVBCLCo8PixOICAgICAgJXIzMSwlcjIsJDAwMDYwMDIwICAgICAgO29mZnNldCAweDk5MAorICAgICAgICBNT1ZCLFRSICVyNiwlcjI5LCREMSAgICA7b2Zmc2V0IDB4OTk0CisgICAgICAgIFNURCAgICAgJXIyOSwtMTUyKCVyMzApIDtvZmZzZXQgMHg5OTgKKyQwMDA2MDAwQworICAgICAgICBFWFRSRCxVICVyMywzMSwzMiwlcjI1ICA7b2Zmc2V0IDB4OTljCisgICAgICAgIENPUFkgICAgJXIzLCVyMjYgICAgICAgIDtvZmZzZXQgMHg5YTAKKyAgICAgICAgRVhUUkQsVSAlcjMsMzEsMzIsJXI5ICAgO29mZnNldCAweDlhNAorICAgICAgICBFWFRSRCxVICVyNCwzMSwzMiwlcjggICA7b2Zmc2V0IDB4OWE4CisgICAgICAgIC5DQUxMICAgQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSICAgICA7aW49MjUsMjY7b3V0PTI4OworICAgICAgICBCLEwgICAgIEJOX251bV9iaXRzX3dvcmQsJXIyICAgIDtvZmZzZXQgMHg5YWMKKyAgICAgICAgRVhUUkQsVSAlcjUsMzEsMzIsJXI3ICAgO29mZnNldCAweDliMAorICAgICAgICBMREkgICAgIDY0LCVyMjAgO29mZnNldCAweDliNAorICAgICAgICBERVBEICAgICVyNywzMSwzMiwlcjUgICA7b2Zmc2V0IDB4OWI4CisgICAgICAgIERFUEQgICAgJXI4LDMxLDMyLCVyNCAgIDtvZmZzZXQgMHg5YmMKKyAgICAgICAgREVQRCAgICAlcjksMzEsMzIsJXIzICAgO29mZnNldCAweDljMAorICAgICAgICBDTVBCLD0gICVyMjgsJXIyMCwkMDAwNjAwMTIgICAgIDtvZmZzZXQgMHg5YzQKKyAgICAgICAgQ09QWSAgICAlcjI4LCVyMjQgICAgICAgO29mZnNldCAweDljOAorICAgICAgICBNVFNBUkNNICVyMjQgICAgO29mZnNldCAweDljYworICAgICAgICBERVBESSxaIC0xLCVzYXIsMSwlcjE5ICA7b2Zmc2V0IDB4OWQwCisgICAgICAgIENNUEIsKj4+LE4gICAgICAlcjQsJXIxOSwkRDIgICAgO29mZnNldCAweDlkNAorJDAwMDYwMDEyCisgICAgICAgIFNVQkkgICAgNjQsJXIyNCwlcjMxICAgIDtvZmZzZXQgMHg5ZDgKKyAgICAgICAgQ01QQ0xSLCo8PCAgICAgICVyNCwlcjMsJXIwICAgICA7b2Zmc2V0IDB4OWRjCisgICAgICAgIFNVQiAgICAgJXI0LCVyMywlcjQgICAgIDtvZmZzZXQgMHg5ZTAKKyQwMDA2MDAxNgorICAgICAgICBDTVBCLD0gICVyMzEsJXIwLCQwMDA2MDAxQSAgICAgIDtvZmZzZXQgMHg5ZTQKKyAgICAgICAgQ09QWSAgICAlcjAsJXI5IDtvZmZzZXQgMHg5ZTgKKyAgICAgICAgTVRTQVJDTSAlcjMxICAgIDtvZmZzZXQgMHg5ZWMKKyAgICAgICAgREVQRCxaICAlcjMsJXNhciw2NCwlcjMgO29mZnNldCAweDlmMAorICAgICAgICBTVUJJICAgIDY0LCVyMzEsJXIyNiAgICA7b2Zmc2V0IDB4OWY0CisgICAgICAgIE1UU0FSICAgJXIyNiAgICA7b2Zmc2V0IDB4OWY4CisgICAgICAgIFNIUlBEICAgJXI0LCVyNSwlc2FyLCVyNCAgICAgICAgO29mZnNldCAweDlmYworICAgICAgICBNVFNBUkNNICVyMzEgICAgO29mZnNldCAweGEwMAorICAgICAgICBERVBELFogICVyNSwlc2FyLDY0LCVyNSA7b2Zmc2V0IDB4YTA0CiskMDAwNjAwMUEKKyAgICAgICAgREVQREksWiAtMSwzMSwzMiwlcjE5ICAgO29mZnNldCAweGEwOAorICAgICAgICBBTkQgICAgICVyMywlcjE5LCVyMjkgICA7b2Zmc2V0IDB4YTBjCisgICAgICAgIEVYVFJELFUgJXIyOSwzMSwzMiwlcjIgIDtvZmZzZXQgMHhhMTAKKyAgICAgICAgREVQREksWiAtMSw2MywzMiwlcjYgICAgO29mZnNldCAweGExNAorICAgICAgICBNT1ZJQixUUiAgICAgICAgMiwlcjgsJDAwMDYwMDFDIDtvZmZzZXQgMHhhMTgKKyAgICAgICAgRVhUUkQsVSAlcjMsNjMsMzIsJXI3ICAgO29mZnNldCAweGExYworJEQyCisgICAgICAgIDstLS0gbm90IFBJQwlBRERJTCAgIExSJ19faW9iLSRnbG9iYWwkLCVyMjcsJXIxICAgICAgO29mZnNldCAweGEyMAorICAgICAgICA7LS0tIG5vdCBQSUMJTERJTCAgICBMUidDJDcsJXIyMSAgICAgO29mZnNldCAweGEyNAorICAgICAgICA7LS0tIG5vdCBQSUMJTERPICAgICBSUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjYgIDtvZmZzZXQgMHhhMjgKKyAgICAgICAgOy0tLSBub3QgUElDCS5DQUxMICAgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSICAgIDtpbj0yNCwyNSwyNjtvdXQ9Mjg7CisgICAgICAgIDstLS0gbm90IFBJQwlCLEwgICAgIGZwcmludGYsJXIyICAgICA7b2Zmc2V0IDB4YTJjCisgICAgICAgIDstLS0gbm90IFBJQwlMRE8gICAgIFJSJ0MkNyglcjIxKSwlcjI1ICAgICAgIDtvZmZzZXQgMHhhMzAKKyAgICAgICAgLkNBTEwgICAgICAgICAgIDsKKyAgICAgICAgQixMICAgICBhYm9ydCwlcjIgICAgICAgO29mZnNldCAweGEzNAorICAgICAgICBOT1AgICAgICAgICAgICAgO29mZnNldCAweGEzOAorICAgICAgICBCICAgICAgICREMyAgICAgO29mZnNldCAweGEzYworICAgICAgICBMRFcgICAgIC0yMTIoJXIzMCksJXIyICA7b2Zmc2V0IDB4YTQwCiskMDAwNjAwMjAKKyAgICAgICAgQ09QWSAgICAlcjQsJXIyNiAgICAgICAgO29mZnNldCAweGE0NAorICAgICAgICBFWFRSRCxVICVyNCwzMSwzMiwlcjI1ICA7b2Zmc2V0IDB4YTQ4CisgICAgICAgIENPUFkgICAgJXIyLCVyMjQgICAgICAgIDtvZmZzZXQgMHhhNGMKKyAgICAgICAgLkNBTEwgICA7aW49MjMsMjQsMjUsMjY7b3V0PTIwLDIxLDIyLDI4LDI5OyAoTUlMTElDQUxMKQorICAgICAgICBCLEwgICAgICQkZGl2MlUsJXIzMSAgICA7b2Zmc2V0IDB4YTUwCisgICAgICAgIEVYVFJELFUgJXIyLDMxLDMyLCVyMjMgIDtvZmZzZXQgMHhhNTQKKyAgICAgICAgREVQRCAgICAlcjI4LDMxLDMyLCVyMjkgO29mZnNldCAweGE1OAorJDAwMDYwMDIyCisgICAgICAgIFNURCAgICAgJXIyOSwtMTUyKCVyMzApIDtvZmZzZXQgMHhhNWMKKyREMQorICAgICAgICBBTkQgICAgICVyNSwlcjE5LCVyMjQgICA7b2Zmc2V0IDB4YTYwCisgICAgICAgIEVYVFJELFUgJXIyNCwzMSwzMiwlcjI0IDtvZmZzZXQgMHhhNjQKKyAgICAgICAgU1RXICAgICAlcjIsLTE2MCglcjMwKSAgO29mZnNldCAweGE2OAorICAgICAgICBTVFcgICAgICVyNywtMTI4KCVyMzApICA7b2Zmc2V0IDB4YTZjCisgICAgICAgIEZMREQgICAgLTE1MiglcjMwKSwlZnI0IDtvZmZzZXQgMHhhNzAKKyAgICAgICAgRkxERCAgICAtMTUyKCVyMzApLCVmcjcgO29mZnNldCAweGE3NAorICAgICAgICBGTERXICAgIC0xNjAoJXIzMCksJWZyOEwgICAgICAgIDtvZmZzZXQgMHhhNzgKKyAgICAgICAgRkxEVyAgICAtMTI4KCVyMzApLCVmcjVMICAgICAgICA7b2Zmc2V0IDB4YTdjCisgICAgICAgIFhNUFlVICAgJWZyOEwsJWZyN0wsJWZyMTAgICAgICAgO29mZnNldCAweGE4MAorICAgICAgICBGU1REICAgICVmcjEwLC0xMzYoJXIzMCkgICAgICAgIDtvZmZzZXQgMHhhODQKKyAgICAgICAgWE1QWVUgICAlZnI4TCwlZnI3UiwlZnIyMiAgICAgICA7b2Zmc2V0IDB4YTg4CisgICAgICAgIEZTVEQgICAgJWZyMjIsLTE0NCglcjMwKSAgICAgICAgO29mZnNldCAweGE4YworICAgICAgICBYTVBZVSAgICVmcjVMLCVmcjRMLCVmcjExICAgICAgIDtvZmZzZXQgMHhhOTAKKyAgICAgICAgWE1QWVUgICAlZnI1TCwlZnI0UiwlZnIyMyAgICAgICA7b2Zmc2V0IDB4YTk0CisgICAgICAgIEZTVEQgICAgJWZyMTEsLTExMiglcjMwKSAgICAgICAgO29mZnNldCAweGE5OAorICAgICAgICBGU1REICAgICVmcjIzLC0xMjAoJXIzMCkgICAgICAgIDtvZmZzZXQgMHhhOWMKKyAgICAgICAgTEREICAgICAtMTM2KCVyMzApLCVyMjggO29mZnNldCAweGFhMAorICAgICAgICBERVBELFogICVyMjgsMzEsMzIsJXIzMSA7b2Zmc2V0IDB4YWE0CisgICAgICAgIExERCAgICAgLTE0NCglcjMwKSwlcjIwIDtvZmZzZXQgMHhhYTgKKyAgICAgICAgQURELEwgICAlcjIwLCVyMzEsJXIzMSAgO29mZnNldCAweGFhYworICAgICAgICBMREQgICAgIC0xMTIoJXIzMCksJXIyMiA7b2Zmc2V0IDB4YWIwCisgICAgICAgIERFUEQsWiAgJXIyMiwzMSwzMiwlcjIyIDtvZmZzZXQgMHhhYjQKKyAgICAgICAgTEREICAgICAtMTIwKCVyMzApLCVyMjEgO29mZnNldCAweGFiOAorICAgICAgICBCICAgICAgICQwMDA2MDAyNCAgICAgICA7b2Zmc2V0IDB4YWJjCisgICAgICAgIEFERCxMICAgJXIyMSwlcjIyLCVyMjMgIDtvZmZzZXQgMHhhYzAKKyREMAorICAgICAgICBPUiAgICAgICVyOSwlcjI5LCVyMjkgICA7b2Zmc2V0IDB4YWM0CiskMDAwNjAwNDAKKyAgICAgICAgRVhUUkQsVSAlcjI5LDMxLDMyLCVyMjggO29mZnNldCAweGFjOAorJDAwMDYwMDAyCiskTDIKKyAgICAgICAgTERXICAgICAtMjEyKCVyMzApLCVyMiAgO29mZnNldCAweGFjYworJEQzCisgICAgICAgIExEVyAgICAgLTE2OCglcjMwKSwlcjkgIDtvZmZzZXQgMHhhZDAKKyAgICAgICAgTEREICAgICAtMTc2KCVyMzApLCVyOCAgO29mZnNldCAweGFkNAorICAgICAgICBFWFRSRCxVICVyOCwzMSwzMiwlcjcgICA7b2Zmc2V0IDB4YWQ4CisgICAgICAgIExERCAgICAgLTE4NCglcjMwKSwlcjYgIDtvZmZzZXQgMHhhZGMKKyAgICAgICAgRVhUUkQsVSAlcjYsMzEsMzIsJXI1ICAgO29mZnNldCAweGFlMAorICAgICAgICBMRFcgICAgIC0xODgoJXIzMCksJXI0ICA7b2Zmc2V0IDB4YWU0CisgICAgICAgIEJWRSAgICAgKCVyMikgICA7b2Zmc2V0IDB4YWU4CisgICAgICAgIC5FWElUCisgICAgICAgIExEVyxNQiAgLTE5MiglcjMwKSwlcjMgIDtvZmZzZXQgMHhhZWMKKwkuUFJPQ0VORAk7aW49MjMsMjU7b3V0PTI4LDI5O2ZwaW49MTA1LDEwNzsKKworCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgUmVnaXN0ZXJzIHRvIGhvbGQgNjQtYml0IHZhbHVlcyB0byBtYW5pcHVsYXRlLiAgVGhlICJMIiBwYXJ0Cis7IG9mIHRoZSByZWdpc3RlciBjb3JyZXNwb25kcyB0byB0aGUgdXBwZXIgMzItYml0cywgd2hpbGUgdGhlICJSIgorOyBwYXJ0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb3dlciAzMi1iaXRzCis7IAorOyBOb3RlLCB0aGF0IHdoZW4gdXNpbmcgYjYgYW5kIGI3LCB0aGUgY29kZSBtdXN0IHNhdmUgdGhlc2UgYmVmb3JlCis7IHVzaW5nIHRoZW0gYmVjYXVzZSB0aGV5IGFyZSBjYWxsZWUgc2F2ZSByZWdpc3RlcnMgCis7IAorOworOyBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdG8gdXNlIHRvIHNhdmUgdmFsdWVzIHRoYXQKKzsgYXJlIG1hbmlwdWxhdGVkLiAgVGhlc2UgZG9uJ3QgY29sbGlkZSB3aXRoIGZ0ZW1wMS02IGFuZAorOyBhcmUgYWxsIGNhbGxlciBzYXZlIHJlZ2lzdGVycworOworYTAgICAgICAgIC5yZWcgJWZyMjIKK2EwTCAgICAgICAucmVnICVmcjIyTAorYTBSICAgICAgIC5yZWcgJWZyMjJSCisKK2ExICAgICAgICAucmVnICVmcjIzCithMUwgICAgICAgLnJlZyAlZnIyM0wKK2ExUiAgICAgICAucmVnICVmcjIzUgorCithMiAgICAgICAgLnJlZyAlZnIyNAorYTJMICAgICAgIC5yZWcgJWZyMjRMCithMlIgICAgICAgLnJlZyAlZnIyNFIKKworYTMgICAgICAgIC5yZWcgJWZyMjUKK2EzTCAgICAgICAucmVnICVmcjI1TAorYTNSICAgICAgIC5yZWcgJWZyMjVSCisKK2E0ICAgICAgICAucmVnICVmcjI2CithNEwgICAgICAgLnJlZyAlZnIyNkwKK2E0UiAgICAgICAucmVnICVmcjI2UgorCithNSAgICAgICAgLnJlZyAlZnIyNworYTVMICAgICAgIC5yZWcgJWZyMjdMCithNVIgICAgICAgLnJlZyAlZnIyN1IKKworYTYgICAgICAgIC5yZWcgJWZyMjgKK2E2TCAgICAgICAucmVnICVmcjI4TAorYTZSICAgICAgIC5yZWcgJWZyMjhSCisKK2E3ICAgICAgICAucmVnICVmcjI5CithN0wgICAgICAgLnJlZyAlZnIyOUwKK2E3UiAgICAgICAucmVnICVmcjI5UgorCitiMCAgICAgICAgLnJlZyAlZnIzMAorYjBMICAgICAgIC5yZWcgJWZyMzBMCitiMFIgICAgICAgLnJlZyAlZnIzMFIKKworYjEgICAgICAgIC5yZWcgJWZyMzEKK2IxTCAgICAgICAucmVnICVmcjMxTAorYjFSICAgICAgIC5yZWcgJWZyMzFSCisKKzsKKzsgVGVtcG9yYXJ5IGZsb2F0aW5nIHBvaW50IHZhcmlhYmxlcywgdGhlc2UgYXJlIGFsbCBjYWxsZXIgc2F2ZQorOyByZWdpc3RlcnMKKzsKK2Z0ZW1wMSAgICAucmVnICVmcjQKK2Z0ZW1wMiAgICAucmVnICVmcjUKK2Z0ZW1wMyAgICAucmVnICVmcjYKK2Z0ZW1wNCAgICAucmVnICVmcjcKKworOworOyBUaGUgQiBzZXQgb2YgcmVnaXN0ZXJzIHdoZW4gdXNlZC4KKzsKKworYjIgICAgICAgIC5yZWcgJWZyOAorYjJMICAgICAgIC5yZWcgJWZyOEwKK2IyUiAgICAgICAucmVnICVmcjhSCisKK2IzICAgICAgICAucmVnICVmcjkKK2IzTCAgICAgICAucmVnICVmcjlMCitiM1IgICAgICAgLnJlZyAlZnI5UgorCitiNCAgICAgICAgLnJlZyAlZnIxMAorYjRMICAgICAgIC5yZWcgJWZyMTBMCitiNFIgICAgICAgLnJlZyAlZnIxMFIKKworYjUgICAgICAgIC5yZWcgJWZyMTEKK2I1TCAgICAgICAucmVnICVmcjExTAorYjVSICAgICAgIC5yZWcgJWZyMTFSCisKK2I2ICAgICAgICAucmVnICVmcjEyCitiNkwgICAgICAgLnJlZyAlZnIxMkwKK2I2UiAgICAgICAucmVnICVmcjEyUgorCitiNyAgICAgICAgLnJlZyAlZnIxMworYjdMICAgICAgIC5yZWcgJWZyMTNMCitiN1IgICAgICAgLnJlZyAlZnIxM1IKKworYzEgICAgICAgICAgIC5yZWcgJXIyMSAgIDsgb25seSByZWcKK3RlbXAxICAgICAgICAucmVnICVyMjAgICA7IG9ubHkgcmVnCit0ZW1wMiAgICAgICAgLnJlZyAlcjE5ICAgOyBvbmx5IHJlZwordGVtcDMgICAgICAgIC5yZWcgJXIzMSAgIDsgb25seSByZWcKKworbTEgICAgICAgICAgIC5yZWcgJXIyOCAgIAorYzIgICAgICAgICAgIC5yZWcgJXIyMyAgIAoraGlnaF9vbmUgICAgIC5yZWcgJXIxCitodCAgICAgICAgICAgLnJlZyAlcjYKK2x0ICAgICAgICAgICAucmVnICVyNQorbSAgICAgICAgICAgIC5yZWcgJXI0CitjMyAgICAgICAgICAgLnJlZyAlcjMKKworU1FSX0FERF9DICAubWFjcm8gIEEwTCxBMFIsQzEsQzIsQzMKKyAgICBYTVBZVSAgIEEwTCxBMFIsZnRlbXAxICAgICAgIDsgbQorICAgIEZTVEQgICAgZnRlbXAxLC0yNCglc3ApICAgICAgOyBzdG9yZSBtCisKKyAgICBYTVBZVSAgIEEwUixBMFIsZnRlbXAyICAgICAgIDsgbHQKKyAgICBGU1REICAgIGZ0ZW1wMiwtMTYoJXNwKSAgICAgIDsgc3RvcmUgbHQKKworICAgIFhNUFlVICAgQTBMLEEwTCxmdGVtcDMgICAgICAgOyBodAorICAgIEZTVEQgICAgZnRlbXAzLC04KCVzcCkgICAgICAgOyBzdG9yZSBodAorCisgICAgTEREICAgICAtMjQoJXNwKSxtICAgICAgICAgICA7IGxvYWQgbQorICAgIEFORCAgICAgbSxoaWdoX21hc2ssdGVtcDIgICAgOyBtICYgTWFzaworICAgIERFUEQsWiAgbSwzMCwzMSx0ZW1wMyAgICAgICAgOyBtIDw8IDMyKzEKKyAgICBMREQgICAgIC0xNiglc3ApLGx0ICAgICAgICAgIDsgbHQKKworICAgIExERCAgICAgLTgoJXNwKSxodCAgICAgICAgICAgOyBodAorICAgIEVYVFJELFUgdGVtcDIsMzIsMzMsdGVtcDEgICAgOyB0ZW1wMSA9IG0mTWFzayA+PiAzMi0xCisgICAgQUREICAgICB0ZW1wMyxsdCxsdCAgICAgICAgICA7IGx0ID0gbHQrbQorICAgIEFERCxMICAgaHQsdGVtcDEsaHQgICAgICAgICAgOyBodCArPSB0ZW1wMQorICAgIEFERCxEQyAgaHQsJXIwLGh0ICAgICAgICAgICAgOyBodCsrCisKKyAgICBBREQgICAgIEMxLGx0LEMxICAgICAgICAgICAgIDsgYzE9YzErbHQKKyAgICBBREQsREMgIGh0LCVyMCxodCAgICAgICAgICAgIDsgaHQrKworCisgICAgQUREICAgICBDMixodCxDMiAgICAgICAgICAgICA7IGMyPWMyK2h0CisgICAgQURELERDICBDMywlcjAsQzMgICAgICAgICAgICA7IGMzKysKKy5lbmRtCisKK1NRUl9BRERfQzIgLm1hY3JvICBBMEwsQTBSLEExTCxBMVIsQzEsQzIsQzMKKyAgICBYTVBZVSAgIEEwTCxBMVIsZnRlbXAxICAgICAgICAgIDsgbTEgPSBibCpodAorICAgIEZTVEQgICAgZnRlbXAxLC0xNiglc3ApICAgICAgICAgOworICAgIFhNUFlVICAgQTBSLEExTCxmdGVtcDIgICAgICAgICAgOyBtID0gYmgqbHQKKyAgICBGU1REICAgIGZ0ZW1wMiwtOCglc3ApICAgICAgICAgIDsKKyAgICBYTVBZVSAgIEEwUixBMVIsZnRlbXAzICAgICAgICAgIDsgbHQgPSBibCpsdAorICAgIEZTVEQgICAgZnRlbXAzLC0zMiglc3ApCisgICAgWE1QWVUgICBBMEwsQTFMLGZ0ZW1wNCAgICAgICAgICA7IGh0ID0gYmgqaHQKKyAgICBGU1REICAgIGZ0ZW1wNCwtMjQoJXNwKSAgICAgICAgIDsKKworICAgIExERCAgICAgLTgoJXNwKSxtICAgICAgICAgICAgICAgOyByMjEgPSBtCisgICAgTEREICAgICAtMTYoJXNwKSxtMSAgICAgICAgICAgICA7IHIxOSA9IG0xCisgICAgQURELEwgICBtLG0xLG0gICAgICAgICAgICAgICAgICA7IG0rbTEKKworICAgIERFUEQsWiAgbSwzMSwzMix0ZW1wMyAgICAgICAgICAgOyAobSttMTw8MzIpCisgICAgTEREICAgICAtMjQoJXNwKSxodCAgICAgICAgICAgICA7IHIyNCA9IGh0CisKKyAgICBDTVBDTFIsKj4+PSBtLG0xLCVyMCAgICAgICAgICAgIDsgaWYgKG0gPCBtMSkKKyAgICBBREQsTCAgIGh0LGhpZ2hfb25lLGh0ICAgICAgICAgIDsgaHQrPWhpZ2hfb25lCisKKyAgICBFWFRSRCxVIG0sMzEsMzIsdGVtcDEgICAgICAgICAgIDsgbSA+PiAzMgorICAgIExERCAgICAgLTMyKCVzcCksbHQgICAgICAgICAgICAgOyBsdAorICAgIEFERCxMICAgaHQsdGVtcDEsaHQgICAgICAgICAgICAgOyBodCs9IG0+PjMyCisgICAgQUREICAgICBsdCx0ZW1wMyxsdCAgICAgICAgICAgICA7IGx0ID0gbHQrbTEKKyAgICBBREQsREMgIGh0LCVyMCxodCAgICAgICAgICAgICAgIDsgaHQrKworCisgICAgQUREICAgICBodCxodCxodCAgICAgICAgICAgICAgICA7IGh0PWh0K2h0OworICAgIEFERCxEQyAgQzMsJXIwLEMzICAgICAgICAgICAgICAgOyBhZGQgaW4gY2FycnkgKGMzKyspCisKKyAgICBBREQgICAgIGx0LGx0LGx0ICAgICAgICAgICAgICAgIDsgbHQ9bHQrbHQ7CisgICAgQURELERDICBodCwlcjAsaHQgICAgICAgICAgICAgICA7IGFkZCBpbiBjYXJyeSAoaHQrKykKKworICAgIEFERCAgICAgQzEsbHQsQzEgICAgICAgICAgICAgICAgOyBjMT1jMStsdAorICAgIEFERCxEQywqTlVWIGh0LCVyMCxodCAgICAgICAgICAgOyBhZGQgaW4gY2FycnkgKGh0KyspCisgICAgTERPICAgICAxKEMzKSxDMyAgICAgICAgICAgICAgOyBidW1wIGMzIGlmIG92ZXJmbG93LG51bGxpZnkgb3RoZXJ3aXNlCisKKyAgICBBREQgICAgIEMyLGh0LEMyICAgICAgICAgICAgICAgIDsgYzIgPSBjMiArIGh0CisgICAgQURELERDICBDMywlcjAsQzMgICAgICAgICAgICAgOyBhZGQgaW4gY2FycnkgKGMzKyspCisuZW5kbQorCis7Cis7dm9pZCBibl9zcXJfY29tYmE4KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSkKKzsgYXJnMCA9IHJfcHRyCis7IGFyZzEgPSBhX3B0cgorOworCitibl9zcXJfY29tYmE4CisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTI4LEVOVFJZX0dSPSVyMyxBUkdTX1NBVkVELE9SREVSSU5HX0FXQVJFCisJLkVYUE9SVAlibl9zcXJfY29tYmE4LEVOVFJZLFBSSVZfTEVWPTMsTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorICAgIC5FTlRSWQorCS5hbGlnbiA2NAorCisgICAgU1REICAgICAlcjMsMCglc3ApICAgICAgICAgIDsgc2F2ZSByMworICAgIFNURCAgICAgJXI0LDgoJXNwKSAgICAgICAgICA7IHNhdmUgcjQKKyAgICBTVEQgICAgICVyNSwxNiglc3ApICAgICAgICAgOyBzYXZlIHI1CisgICAgU1REICAgICAlcjYsMjQoJXNwKSAgICAgICAgIDsgc2F2ZSByNgorCisJOworCTsgWmVybyBvdXQgY2FycmllcworCTsKKwlDT1BZICAgICAlcjAsYzEKKwlDT1BZICAgICAlcjAsYzIKKwlDT1BZICAgICAlcjAsYzMKKworCUxETyAgICAgIDEyOCglc3ApLCVzcCAgICAgICA7IGJ1bXAgc3RhY2sKKyAgICBERVBESSxaIC0xLDMyLDMzLGhpZ2hfbWFzayAgIDsgQ3JlYXRlIE1hc2sgMHhmZmZmZmZmZjgwMDAwMDAwTAorICAgIERFUERJLFogIDEsMzEsMSxoaWdoX29uZSAgICAgOyBDcmVhdGUgVmFsdWUgIDEgPDwgMzIKKworCTsKKwk7IExvYWQgdXAgYWxsIG9mIHRoZSB2YWx1ZXMgd2UgYXJlIGdvaW5nIHRvIHVzZQorCTsKKyAgICBGTEREICAgICAwKGFfcHRyKSxhMCAgICAgICAKKyAgICBGTEREICAgICA4KGFfcHRyKSxhMSAgICAgICAKKyAgICBGTEREICAgIDE2KGFfcHRyKSxhMiAgICAgICAKKyAgICBGTEREICAgIDI0KGFfcHRyKSxhMyAgICAgICAKKyAgICBGTEREICAgIDMyKGFfcHRyKSxhNCAgICAgICAKKyAgICBGTEREICAgIDQwKGFfcHRyKSxhNSAgICAgICAKKyAgICBGTEREICAgIDQ4KGFfcHRyKSxhNiAgICAgICAKKyAgICBGTEREICAgIDU2KGFfcHRyKSxhNyAgICAgICAKKworCVNRUl9BRERfQyBhMEwsYTBSLGMxLGMyLGMzCisJU1REICAgICBjMSwwKHJfcHRyKSAgICAgICAgICA7IHJbMF0gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DMiBhMUwsYTFSLGEwTCxhMFIsYzIsYzMsYzEKKwlTVEQgICAgIGMyLDgocl9wdHIpICAgICAgICAgIDsgclsxXSA9IGMyOworCUNPUFkgICAgJXIwLGMyCisKKwlTUVJfQUREX0MgYTFMLGExUixjMyxjMSxjMgorCVNRUl9BRERfQzIgYTJMLGEyUixhMEwsYTBSLGMzLGMxLGMyCisJU1REICAgICBjMywxNihyX3B0cikgICAgICAgICAgICA7IHJbMl0gPSBjMzsKKwlDT1BZICAgICVyMCxjMworCisJU1FSX0FERF9DMiBhM0wsYTNSLGEwTCxhMFIsYzEsYzIsYzMKKwlTUVJfQUREX0MyIGEyTCxhMlIsYTFMLGExUixjMSxjMixjMworCVNURCAgICAgYzEsMjQocl9wdHIpICAgICAgICAgICA7IHJbM10gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DIGEyTCxhMlIsYzIsYzMsYzEKKwlTUVJfQUREX0MyIGEzTCxhM1IsYTFMLGExUixjMixjMyxjMQorCVNRUl9BRERfQzIgYTRMLGE0UixhMEwsYTBSLGMyLGMzLGMxCisJU1REICAgICBjMiwzMihyX3B0cikgICAgICAgICAgOyByWzRdID0gYzI7CisJQ09QWSAgICAlcjAsYzIKKworCVNRUl9BRERfQzIgYTVMLGE1UixhMEwsYTBSLGMzLGMxLGMyCisJU1FSX0FERF9DMiBhNEwsYTRSLGExTCxhMVIsYzMsYzEsYzIKKwlTUVJfQUREX0MyIGEzTCxhM1IsYTJMLGEyUixjMyxjMSxjMgorCVNURCAgICAgYzMsNDAocl9wdHIpICAgICAgICAgIDsgcls1XSA9IGMzOworCUNPUFkgICAgJXIwLGMzCisKKwlTUVJfQUREX0MgYTNMLGEzUixjMSxjMixjMworCVNRUl9BRERfQzIgYTRMLGE0UixhMkwsYTJSLGMxLGMyLGMzCisJU1FSX0FERF9DMiBhNUwsYTVSLGExTCxhMVIsYzEsYzIsYzMKKwlTUVJfQUREX0MyIGE2TCxhNlIsYTBMLGEwUixjMSxjMixjMworCVNURCAgICAgYzEsNDgocl9wdHIpICAgICAgICAgIDsgcls2XSA9IGMxOworCUNPUFkgICAgJXIwLGMxCisKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTBMLGEwUixjMixjMyxjMQorCVNRUl9BRERfQzIgYTZMLGE2UixhMUwsYTFSLGMyLGMzLGMxCisJU1FSX0FERF9DMiBhNUwsYTVSLGEyTCxhMlIsYzIsYzMsYzEKKwlTUVJfQUREX0MyIGE0TCxhNFIsYTNMLGEzUixjMixjMyxjMQorCVNURCAgICAgYzIsNTYocl9wdHIpICAgICAgICAgIDsgcls3XSA9IGMyOworCUNPUFkgICAgJXIwLGMyCisKKwlTUVJfQUREX0MgYTRMLGE0UixjMyxjMSxjMgorCVNRUl9BRERfQzIgYTVMLGE1UixhM0wsYTNSLGMzLGMxLGMyCisJU1FSX0FERF9DMiBhNkwsYTZSLGEyTCxhMlIsYzMsYzEsYzIKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTFMLGExUixjMyxjMSxjMgorCVNURCAgICAgYzMsNjQocl9wdHIpICAgICAgICAgIDsgcls4XSA9IGMzOworCUNPUFkgICAgJXIwLGMzCisKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTJMLGEyUixjMSxjMixjMworCVNRUl9BRERfQzIgYTZMLGE2UixhM0wsYTNSLGMxLGMyLGMzCisJU1FSX0FERF9DMiBhNUwsYTVSLGE0TCxhNFIsYzEsYzIsYzMKKwlTVEQgICAgIGMxLDcyKHJfcHRyKSAgICAgICAgICA7IHJbOV0gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DIGE1TCxhNVIsYzIsYzMsYzEKKwlTUVJfQUREX0MyIGE2TCxhNlIsYTRMLGE0UixjMixjMyxjMQorCVNRUl9BRERfQzIgYTdMLGE3UixhM0wsYTNSLGMyLGMzLGMxCisJU1REICAgICBjMiw4MChyX3B0cikgICAgICAgICAgOyByWzEwXSA9IGMyOworCUNPUFkgICAgJXIwLGMyCisKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTRMLGE0UixjMyxjMSxjMgorCVNRUl9BRERfQzIgYTZMLGE2UixhNUwsYTVSLGMzLGMxLGMyCisJU1REICAgICBjMyw4OChyX3B0cikgICAgICAgICAgOyByWzExXSA9IGMzOworCUNPUFkgICAgJXIwLGMzCisJCisJU1FSX0FERF9DIGE2TCxhNlIsYzEsYzIsYzMKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTVMLGE1UixjMSxjMixjMworCVNURCAgICAgYzEsOTYocl9wdHIpICAgICAgICAgIDsgclsxMl0gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DMiBhN0wsYTdSLGE2TCxhNlIsYzIsYzMsYzEKKwlTVEQgICAgIGMyLDEwNChyX3B0cikgICAgICAgICA7IHJbMTNdID0gYzI7CisJQ09QWSAgICAlcjAsYzIKKworCVNRUl9BRERfQyBhN0wsYTdSLGMzLGMxLGMyCisJU1REICAgICBjMywgMTEyKHJfcHRyKSAgICAgICA7IHJbMTRdID0gYzMKKwlTVEQgICAgIGMxLCAxMjAocl9wdHIpICAgICAgIDsgclsxNV0gPSBjMQorCisgICAgLkVYSVQKKyAgICBMREQgICAgIC0xMDQoJXNwKSwlcjYgICAgICAgIDsgcmVzdG9yZSByNgorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgOyByZXN0b3JlIHI1CisgICAgTEREICAgICAtMTIwKCVzcCksJXI0ICAgICAgICA7IHJlc3RvcmUgcjQKKyAgICBCVkUgICAgICglcnApCisgICAgTERELE1CICAtMTI4KCVzcCksJXIzCisKKwkuUFJPQ0VORAkKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7dm9pZCBibl9zcXJfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSkKKzsgYXJnMCA9IHJfcHRyCis7IGFyZzEgPSBhX3B0cgorOworCitibl9zcXJfY29tYmE0CisJLnByb2MKKwkuY2FsbGluZm8gRlJBTUU9MTI4LEVOVFJZX0dSPSVyMyxBUkdTX1NBVkVELE9SREVSSU5HX0FXQVJFCisJLkVYUE9SVAlibl9zcXJfY29tYmE0LEVOVFJZLFBSSVZfTEVWPTMsTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorICAgIC5lbnRyeQorCS5hbGlnbiA2NAorICAgIFNURCAgICAgJXIzLDAoJXNwKSAgICAgICAgICA7IHNhdmUgcjMKKyAgICBTVEQgICAgICVyNCw4KCVzcCkgICAgICAgICAgOyBzYXZlIHI0CisgICAgU1REICAgICAlcjUsMTYoJXNwKSAgICAgICAgIDsgc2F2ZSByNQorICAgIFNURCAgICAgJXI2LDI0KCVzcCkgICAgICAgICA7IHNhdmUgcjYKKworCTsKKwk7IFplcm8gb3V0IGNhcnJpZXMKKwk7CisJQ09QWSAgICAgJXIwLGMxCisJQ09QWSAgICAgJXIwLGMyCisJQ09QWSAgICAgJXIwLGMzCisKKwlMRE8gICAgICAxMjgoJXNwKSwlc3AgICAgICAgOyBidW1wIHN0YWNrCisgICAgREVQREksWiAtMSwzMiwzMyxoaWdoX21hc2sgICA7IENyZWF0ZSBNYXNrIDB4ZmZmZmZmZmY4MDAwMDAwMEwKKyAgICBERVBESSxaICAxLDMxLDEsaGlnaF9vbmUgICAgIDsgQ3JlYXRlIFZhbHVlICAxIDw8IDMyCisKKwk7CisJOyBMb2FkIHVwIGFsbCBvZiB0aGUgdmFsdWVzIHdlIGFyZSBnb2luZyB0byB1c2UKKwk7CisgICAgRkxERCAgICAgMChhX3B0ciksYTAgICAgICAgCisgICAgRkxERCAgICAgOChhX3B0ciksYTEgICAgICAgCisgICAgRkxERCAgICAxNihhX3B0ciksYTIgICAgICAgCisgICAgRkxERCAgICAyNChhX3B0ciksYTMgICAgICAgCisgICAgRkxERCAgICAzMihhX3B0ciksYTQgICAgICAgCisgICAgRkxERCAgICA0MChhX3B0ciksYTUgICAgICAgCisgICAgRkxERCAgICA0OChhX3B0ciksYTYgICAgICAgCisgICAgRkxERCAgICA1NihhX3B0ciksYTcgICAgICAgCisKKwlTUVJfQUREX0MgYTBMLGEwUixjMSxjMixjMworCisJU1REICAgICBjMSwwKHJfcHRyKSAgICAgICAgICA7IHJbMF0gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DMiBhMUwsYTFSLGEwTCxhMFIsYzIsYzMsYzEKKworCVNURCAgICAgYzIsOChyX3B0cikgICAgICAgICAgOyByWzFdID0gYzI7CisJQ09QWSAgICAlcjAsYzIKKworCVNRUl9BRERfQyBhMUwsYTFSLGMzLGMxLGMyCisJU1FSX0FERF9DMiBhMkwsYTJSLGEwTCxhMFIsYzMsYzEsYzIKKworCVNURCAgICAgYzMsMTYocl9wdHIpICAgICAgICAgICAgOyByWzJdID0gYzM7CisJQ09QWSAgICAlcjAsYzMKKworCVNRUl9BRERfQzIgYTNMLGEzUixhMEwsYTBSLGMxLGMyLGMzCisJU1FSX0FERF9DMiBhMkwsYTJSLGExTCxhMVIsYzEsYzIsYzMKKworCVNURCAgICAgYzEsMjQocl9wdHIpICAgICAgICAgICA7IHJbM10gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DIGEyTCxhMlIsYzIsYzMsYzEKKwlTUVJfQUREX0MyIGEzTCxhM1IsYTFMLGExUixjMixjMyxjMQorCisJU1REICAgICBjMiwzMihyX3B0cikgICAgICAgICAgIDsgcls0XSA9IGMyOworCUNPUFkgICAgJXIwLGMyCisKKwlTUVJfQUREX0MyIGEzTCxhM1IsYTJMLGEyUixjMyxjMSxjMgorCVNURCAgICAgYzMsNDAocl9wdHIpICAgICAgICAgICA7IHJbNV0gPSBjMzsKKwlDT1BZICAgICVyMCxjMworCisJU1FSX0FERF9DIGEzTCxhM1IsYzEsYzIsYzMKKwlTVEQgICAgIGMxLDQ4KHJfcHRyKSAgICAgICAgICAgOyByWzZdID0gYzE7CisJU1REICAgICBjMiw1NihyX3B0cikgICAgICAgICAgIDsgcls3XSA9IGMyOworCisgICAgLkVYSVQKKyAgICBMREQgICAgIC0xMDQoJXNwKSwlcjYgICAgICAgIDsgcmVzdG9yZSByNgorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgOyByZXN0b3JlIHI1CisgICAgTEREICAgICAtMTIwKCVzcCksJXI0ICAgICAgICA7IHJlc3RvcmUgcjQKKyAgICBCVkUgICAgICglcnApCisgICAgTERELE1CICAtMTI4KCVzcCksJXIzCisKKwkuUFJPQ0VORAkKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01VTF9BRERfQyAgLm1hY3JvICBBMEwsQTBSLEIwTCxCMFIsQzEsQzIsQzMKKyAgICBYTVBZVSAgIEEwTCxCMFIsZnRlbXAxICAgICAgICA7IG0xID0gYmwqaHQKKyAgICBGU1REICAgIGZ0ZW1wMSwtMTYoJXNwKSAgICAgICA7CisgICAgWE1QWVUgICBBMFIsQjBMLGZ0ZW1wMiAgICAgICAgOyBtID0gYmgqbHQKKyAgICBGU1REICAgIGZ0ZW1wMiwtOCglc3ApICAgICAgICA7CisgICAgWE1QWVUgICBBMFIsQjBSLGZ0ZW1wMyAgICAgICAgOyBsdCA9IGJsKmx0CisgICAgRlNURCAgICBmdGVtcDMsLTMyKCVzcCkKKyAgICBYTVBZVSAgIEEwTCxCMEwsZnRlbXA0ICAgICAgICA7IGh0ID0gYmgqaHQKKyAgICBGU1REICAgIGZ0ZW1wNCwtMjQoJXNwKSAgICAgICA7CisKKyAgICBMREQgICAgIC04KCVzcCksbSAgICAgICAgICAgICA7IHIyMSA9IG0KKyAgICBMREQgICAgIC0xNiglc3ApLG0xICAgICAgICAgICA7IHIxOSA9IG0xCisgICAgQURELEwgICBtLG0xLG0gICAgICAgICAgICAgICAgOyBtK20xCisKKyAgICBERVBELFogIG0sMzEsMzIsdGVtcDMgICAgICAgICA7IChtK20xPDwzMikKKyAgICBMREQgICAgIC0yNCglc3ApLGh0ICAgICAgICAgICA7IHIyNCA9IGh0CisKKyAgICBDTVBDTFIsKj4+PSBtLG0xLCVyMCAgICAgICAgICA7IGlmIChtIDwgbTEpCisgICAgQURELEwgICBodCxoaWdoX29uZSxodCAgICAgICAgOyBodCs9aGlnaF9vbmUKKworICAgIEVYVFJELFUgbSwzMSwzMix0ZW1wMSAgICAgICAgIDsgbSA+PiAzMgorICAgIExERCAgICAgLTMyKCVzcCksbHQgICAgICAgICAgIDsgbHQKKyAgICBBREQsTCAgIGh0LHRlbXAxLGh0ICAgICAgICAgICA7IGh0Kz0gbT4+MzIKKyAgICBBREQgICAgIGx0LHRlbXAzLGx0ICAgICAgICAgICA7IGx0ID0gbHQrbTEKKyAgICBBREQsREMgIGh0LCVyMCxodCAgICAgICAgICAgICA7IGh0KysKKworICAgIEFERCAgICAgQzEsbHQsQzEgICAgICAgICAgICAgIDsgYzE9YzErbHQKKyAgICBBREQsREMgIGh0LCVyMCxodCAgICAgICAgICAgICA7IGJ1bXAgYzMgaWYgb3ZlcmZsb3csbnVsbGlmeSBvdGhlcndpc2UKKworICAgIEFERCAgICAgQzIsaHQsQzIgICAgICAgICAgICAgIDsgYzIgPSBjMiArIGh0CisgICAgQURELERDICBDMywlcjAsQzMgICAgICAgICAgICAgOyBhZGQgaW4gY2FycnkgKGMzKyspCisuZW5kbQorCisKKzsKKzt2b2lkIGJuX211bF9jb21iYTgoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikKKzsgYXJnMCA9IHJfcHRyCis7IGFyZzEgPSBhX3B0cgorOyBhcmcyID0gYl9wdHIKKzsKKworYm5fbXVsX2NvbWJhOAorCS5wcm9jCisJLmNhbGxpbmZvIEZSQU1FPTEyOCxFTlRSWV9HUj0lcjMsQVJHU19TQVZFRCxPUkRFUklOR19BV0FSRQorCS5FWFBPUlQJYm5fbXVsX2NvbWJhOCxFTlRSWSxQUklWX0xFVj0zLE5PX1JFTE9DQVRJT04sTE9OR19SRVRVUk4KKyAgICAuZW50cnkKKwkuYWxpZ24gNjQKKworICAgIFNURCAgICAgJXIzLDAoJXNwKSAgICAgICAgICA7IHNhdmUgcjMKKyAgICBTVEQgICAgICVyNCw4KCVzcCkgICAgICAgICAgOyBzYXZlIHI0CisgICAgU1REICAgICAlcjUsMTYoJXNwKSAgICAgICAgIDsgc2F2ZSByNQorICAgIFNURCAgICAgJXI2LDI0KCVzcCkgICAgICAgICA7IHNhdmUgcjYKKyAgICBGU1REICAgICVmcjEyLDMyKCVzcCkgICAgICAgOyBzYXZlIHI2CisgICAgRlNURCAgICAlZnIxMyw0MCglc3ApICAgICAgIDsgc2F2ZSByNworCisJOworCTsgWmVybyBvdXQgY2FycmllcworCTsKKwlDT1BZICAgICAlcjAsYzEKKwlDT1BZICAgICAlcjAsYzIKKwlDT1BZICAgICAlcjAsYzMKKworCUxETyAgICAgIDEyOCglc3ApLCVzcCAgICAgICA7IGJ1bXAgc3RhY2sKKyAgICBERVBESSxaICAxLDMxLDEsaGlnaF9vbmUgICAgIDsgQ3JlYXRlIFZhbHVlICAxIDw8IDMyCisKKwk7CisJOyBMb2FkIHVwIGFsbCBvZiB0aGUgdmFsdWVzIHdlIGFyZSBnb2luZyB0byB1c2UKKwk7CisgICAgRkxERCAgICAgIDAoYV9wdHIpLGEwICAgICAgIAorICAgIEZMREQgICAgICA4KGFfcHRyKSxhMSAgICAgICAKKyAgICBGTEREICAgICAxNihhX3B0ciksYTIgICAgICAgCisgICAgRkxERCAgICAgMjQoYV9wdHIpLGEzICAgICAgIAorICAgIEZMREQgICAgIDMyKGFfcHRyKSxhNCAgICAgICAKKyAgICBGTEREICAgICA0MChhX3B0ciksYTUgICAgICAgCisgICAgRkxERCAgICAgNDgoYV9wdHIpLGE2ICAgICAgIAorICAgIEZMREQgICAgIDU2KGFfcHRyKSxhNyAgICAgICAKKworICAgIEZMREQgICAgICAwKGJfcHRyKSxiMCAgICAgICAKKyAgICBGTEREICAgICAgOChiX3B0ciksYjEgICAgICAgCisgICAgRkxERCAgICAgMTYoYl9wdHIpLGIyICAgICAgIAorICAgIEZMREQgICAgIDI0KGJfcHRyKSxiMyAgICAgICAKKyAgICBGTEREICAgICAzMihiX3B0ciksYjQgICAgICAgCisgICAgRkxERCAgICAgNDAoYl9wdHIpLGI1ICAgICAgIAorICAgIEZMREQgICAgIDQ4KGJfcHRyKSxiNiAgICAgICAKKyAgICBGTEREICAgICA1NihiX3B0ciksYjcgICAgICAgCisKKwlNVUxfQUREX0MgYTBMLGEwUixiMEwsYjBSLGMxLGMyLGMzCisJU1REICAgICAgIGMxLDAocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMQorCisJTVVMX0FERF9DIGEwTCxhMFIsYjFMLGIxUixjMixjMyxjMQorCU1VTF9BRERfQyBhMUwsYTFSLGIwTCxiMFIsYzIsYzMsYzEKKwlTVEQgICAgICAgYzIsOChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMyCisKKwlNVUxfQUREX0MgYTJMLGEyUixiMEwsYjBSLGMzLGMxLGMyCisJTVVMX0FERF9DIGExTCxhMVIsYjFMLGIxUixjMyxjMSxjMgorCU1VTF9BRERfQyBhMEwsYTBSLGIyTCxiMlIsYzMsYzEsYzIKKwlTVEQgICAgICAgYzMsMTYocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMworCisJTVVMX0FERF9DIGEwTCxhMFIsYjNMLGIzUixjMSxjMixjMworCU1VTF9BRERfQyBhMUwsYTFSLGIyTCxiMlIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTJMLGEyUixiMUwsYjFSLGMxLGMyLGMzCisJTVVMX0FERF9DIGEzTCxhM1IsYjBMLGIwUixjMSxjMixjMworCVNURCAgICAgICBjMSwyNChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMxCisKKwlNVUxfQUREX0MgYTRMLGE0UixiMEwsYjBSLGMyLGMzLGMxCisJTVVMX0FERF9DIGEzTCxhM1IsYjFMLGIxUixjMixjMyxjMQorCU1VTF9BRERfQyBhMkwsYTJSLGIyTCxiMlIsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTFMLGExUixiM0wsYjNSLGMyLGMzLGMxCisJTVVMX0FERF9DIGEwTCxhMFIsYjRMLGI0UixjMixjMyxjMQorCVNURCAgICAgICBjMiwzMihyX3B0cikKKwlDT1BZICAgICAgJXIwLGMyCisKKwlNVUxfQUREX0MgYTBMLGEwUixiNUwsYjVSLGMzLGMxLGMyCisJTVVMX0FERF9DIGExTCxhMVIsYjRMLGI0UixjMyxjMSxjMgorCU1VTF9BRERfQyBhMkwsYTJSLGIzTCxiM1IsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTNMLGEzUixiMkwsYjJSLGMzLGMxLGMyCisJTVVMX0FERF9DIGE0TCxhNFIsYjFMLGIxUixjMyxjMSxjMgorCU1VTF9BRERfQyBhNUwsYTVSLGIwTCxiMFIsYzMsYzEsYzIKKwlTVEQgICAgICAgYzMsNDAocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMworCisJTVVMX0FERF9DIGE2TCxhNlIsYjBMLGIwUixjMSxjMixjMworCU1VTF9BRERfQyBhNUwsYTVSLGIxTCxiMVIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTRMLGE0UixiMkwsYjJSLGMxLGMyLGMzCisJTVVMX0FERF9DIGEzTCxhM1IsYjNMLGIzUixjMSxjMixjMworCU1VTF9BRERfQyBhMkwsYTJSLGI0TCxiNFIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTFMLGExUixiNUwsYjVSLGMxLGMyLGMzCisJTVVMX0FERF9DIGEwTCxhMFIsYjZMLGI2UixjMSxjMixjMworCVNURCAgICAgICBjMSw0OChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMxCisJCisJTVVMX0FERF9DIGEwTCxhMFIsYjdMLGI3UixjMixjMyxjMQorCU1VTF9BRERfQyBhMUwsYTFSLGI2TCxiNlIsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTJMLGEyUixiNUwsYjVSLGMyLGMzLGMxCisJTVVMX0FERF9DIGEzTCxhM1IsYjRMLGI0UixjMixjMyxjMQorCU1VTF9BRERfQyBhNEwsYTRSLGIzTCxiM1IsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTVMLGE1UixiMkwsYjJSLGMyLGMzLGMxCisJTVVMX0FERF9DIGE2TCxhNlIsYjFMLGIxUixjMixjMyxjMQorCU1VTF9BRERfQyBhN0wsYTdSLGIwTCxiMFIsYzIsYzMsYzEKKwlTVEQgICAgICAgYzIsNTYocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMgorCisJTVVMX0FERF9DIGE3TCxhN1IsYjFMLGIxUixjMyxjMSxjMgorCU1VTF9BRERfQyBhNkwsYTZSLGIyTCxiMlIsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTVMLGE1UixiM0wsYjNSLGMzLGMxLGMyCisJTVVMX0FERF9DIGE0TCxhNFIsYjRMLGI0UixjMyxjMSxjMgorCU1VTF9BRERfQyBhM0wsYTNSLGI1TCxiNVIsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTJMLGEyUixiNkwsYjZSLGMzLGMxLGMyCisJTVVMX0FERF9DIGExTCxhMVIsYjdMLGI3UixjMyxjMSxjMgorCVNURCAgICAgICBjMyw2NChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMzCisKKwlNVUxfQUREX0MgYTJMLGEyUixiN0wsYjdSLGMxLGMyLGMzCisJTVVMX0FERF9DIGEzTCxhM1IsYjZMLGI2UixjMSxjMixjMworCU1VTF9BRERfQyBhNEwsYTRSLGI1TCxiNVIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTVMLGE1UixiNEwsYjRSLGMxLGMyLGMzCisJTVVMX0FERF9DIGE2TCxhNlIsYjNMLGIzUixjMSxjMixjMworCU1VTF9BRERfQyBhN0wsYTdSLGIyTCxiMlIsYzEsYzIsYzMKKwlTVEQgICAgICAgYzEsNzIocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMQorCisJTVVMX0FERF9DIGE3TCxhN1IsYjNMLGIzUixjMixjMyxjMQorCU1VTF9BRERfQyBhNkwsYTZSLGI0TCxiNFIsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTVMLGE1UixiNUwsYjVSLGMyLGMzLGMxCisJTVVMX0FERF9DIGE0TCxhNFIsYjZMLGI2UixjMixjMyxjMQorCU1VTF9BRERfQyBhM0wsYTNSLGI3TCxiN1IsYzIsYzMsYzEKKwlTVEQgICAgICAgYzIsODAocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMgorCisJTVVMX0FERF9DIGE0TCxhNFIsYjdMLGI3UixjMyxjMSxjMgorCU1VTF9BRERfQyBhNUwsYTVSLGI2TCxiNlIsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTZMLGE2UixiNUwsYjVSLGMzLGMxLGMyCisJTVVMX0FERF9DIGE3TCxhN1IsYjRMLGI0UixjMyxjMSxjMgorCVNURCAgICAgICBjMyw4OChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMzCisKKwlNVUxfQUREX0MgYTdMLGE3UixiNUwsYjVSLGMxLGMyLGMzCisJTVVMX0FERF9DIGE2TCxhNlIsYjZMLGI2UixjMSxjMixjMworCU1VTF9BRERfQyBhNUwsYTVSLGI3TCxiN1IsYzEsYzIsYzMKKwlTVEQgICAgICAgYzEsOTYocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMQorCisJTVVMX0FERF9DIGE2TCxhNlIsYjdMLGI3UixjMixjMyxjMQorCU1VTF9BRERfQyBhN0wsYTdSLGI2TCxiNlIsYzIsYzMsYzEKKwlTVEQgICAgICAgYzIsMTA0KHJfcHRyKQorCUNPUFkgICAgICAlcjAsYzIKKworCU1VTF9BRERfQyBhN0wsYTdSLGI3TCxiN1IsYzMsYzEsYzIKKwlTVEQgICAgICAgYzMsMTEyKHJfcHRyKQorCVNURCAgICAgICBjMSwxMjAocl9wdHIpCisKKyAgICAuRVhJVAorICAgIEZMREQgICAgLTg4KCVzcCksJWZyMTMgCisgICAgRkxERCAgICAtOTYoJXNwKSwlZnIxMiAKKyAgICBMREQgICAgIC0xMDQoJXNwKSwlcjYgICAgICAgIDsgcmVzdG9yZSByNgorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgOyByZXN0b3JlIHI1CisgICAgTEREICAgICAtMTIwKCVzcCksJXI0ICAgICAgICA7IHJlc3RvcmUgcjQKKyAgICBCVkUgICAgICglcnApCisgICAgTERELE1CICAtMTI4KCVzcCksJXIzCisKKwkuUFJPQ0VORAkKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7dm9pZCBibl9tdWxfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpCis7IGFyZzAgPSByX3B0cgorOyBhcmcxID0gYV9wdHIKKzsgYXJnMiA9IGJfcHRyCis7CisKK2JuX211bF9jb21iYTQKKwkucHJvYworCS5jYWxsaW5mbyBGUkFNRT0xMjgsRU5UUllfR1I9JXIzLEFSR1NfU0FWRUQsT1JERVJJTkdfQVdBUkUKKwkuRVhQT1JUCWJuX211bF9jb21iYTQsRU5UUlksUFJJVl9MRVY9MyxOT19SRUxPQ0FUSU9OLExPTkdfUkVUVVJOCisgICAgLmVudHJ5CisJLmFsaWduIDY0CisKKyAgICBTVEQgICAgICVyMywwKCVzcCkgICAgICAgICAgOyBzYXZlIHIzCisgICAgU1REICAgICAlcjQsOCglc3ApICAgICAgICAgIDsgc2F2ZSByNAorICAgIFNURCAgICAgJXI1LDE2KCVzcCkgICAgICAgICA7IHNhdmUgcjUKKyAgICBTVEQgICAgICVyNiwyNCglc3ApICAgICAgICAgOyBzYXZlIHI2CisgICAgRlNURCAgICAlZnIxMiwzMiglc3ApICAgICAgIDsgc2F2ZSByNgorICAgIEZTVEQgICAgJWZyMTMsNDAoJXNwKSAgICAgICA7IHNhdmUgcjcKKworCTsKKwk7IFplcm8gb3V0IGNhcnJpZXMKKwk7CisJQ09QWSAgICAgJXIwLGMxCisJQ09QWSAgICAgJXIwLGMyCisJQ09QWSAgICAgJXIwLGMzCisKKwlMRE8gICAgICAxMjgoJXNwKSwlc3AgICAgICAgOyBidW1wIHN0YWNrCisgICAgREVQREksWiAgMSwzMSwxLGhpZ2hfb25lICAgICA7IENyZWF0ZSBWYWx1ZSAgMSA8PCAzMgorCisJOworCTsgTG9hZCB1cCBhbGwgb2YgdGhlIHZhbHVlcyB3ZSBhcmUgZ29pbmcgdG8gdXNlCisJOworICAgIEZMREQgICAgICAwKGFfcHRyKSxhMCAgICAgICAKKyAgICBGTEREICAgICAgOChhX3B0ciksYTEgICAgICAgCisgICAgRkxERCAgICAgMTYoYV9wdHIpLGEyICAgICAgIAorICAgIEZMREQgICAgIDI0KGFfcHRyKSxhMyAgICAgICAKKworICAgIEZMREQgICAgICAwKGJfcHRyKSxiMCAgICAgICAKKyAgICBGTEREICAgICAgOChiX3B0ciksYjEgICAgICAgCisgICAgRkxERCAgICAgMTYoYl9wdHIpLGIyICAgICAgIAorICAgIEZMREQgICAgIDI0KGJfcHRyKSxiMyAgICAgICAKKworCU1VTF9BRERfQyBhMEwsYTBSLGIwTCxiMFIsYzEsYzIsYzMKKwlTVEQgICAgICAgYzEsMChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMxCisKKwlNVUxfQUREX0MgYTBMLGEwUixiMUwsYjFSLGMyLGMzLGMxCisJTVVMX0FERF9DIGExTCxhMVIsYjBMLGIwUixjMixjMyxjMQorCVNURCAgICAgICBjMiw4KHJfcHRyKQorCUNPUFkgICAgICAlcjAsYzIKKworCU1VTF9BRERfQyBhMkwsYTJSLGIwTCxiMFIsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTFMLGExUixiMUwsYjFSLGMzLGMxLGMyCisJTVVMX0FERF9DIGEwTCxhMFIsYjJMLGIyUixjMyxjMSxjMgorCVNURCAgICAgICBjMywxNihyX3B0cikKKwlDT1BZICAgICAgJXIwLGMzCisKKwlNVUxfQUREX0MgYTBMLGEwUixiM0wsYjNSLGMxLGMyLGMzCisJTVVMX0FERF9DIGExTCxhMVIsYjJMLGIyUixjMSxjMixjMworCU1VTF9BRERfQyBhMkwsYTJSLGIxTCxiMVIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTNMLGEzUixiMEwsYjBSLGMxLGMyLGMzCisJU1REICAgICAgIGMxLDI0KHJfcHRyKQorCUNPUFkgICAgICAlcjAsYzEKKworCU1VTF9BRERfQyBhM0wsYTNSLGIxTCxiMVIsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTJMLGEyUixiMkwsYjJSLGMyLGMzLGMxCisJTVVMX0FERF9DIGExTCxhMVIsYjNMLGIzUixjMixjMyxjMQorCVNURCAgICAgICBjMiwzMihyX3B0cikKKwlDT1BZICAgICAgJXIwLGMyCisKKwlNVUxfQUREX0MgYTJMLGEyUixiM0wsYjNSLGMzLGMxLGMyCisJTVVMX0FERF9DIGEzTCxhM1IsYjJMLGIyUixjMyxjMSxjMgorCVNURCAgICAgICBjMyw0MChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMzCisKKwlNVUxfQUREX0MgYTNMLGEzUixiM0wsYjNSLGMxLGMyLGMzCisJU1REICAgICAgIGMxLDQ4KHJfcHRyKQorCVNURCAgICAgICBjMiw1NihyX3B0cikKKworICAgIC5FWElUCisgICAgRkxERCAgICAtODgoJXNwKSwlZnIxMyAKKyAgICBGTEREICAgIC05Niglc3ApLCVmcjEyIAorICAgIExERCAgICAgLTEwNCglc3ApLCVyNiAgICAgICAgOyByZXN0b3JlIHI2CisgICAgTEREICAgICAtMTEyKCVzcCksJXI1ICAgICAgICA7IHJlc3RvcmUgcjUKKyAgICBMREQgICAgIC0xMjAoJXNwKSwlcjQgICAgICAgIDsgcmVzdG9yZSByNAorICAgIEJWRSAgICAgKCVycCkKKyAgICBMREQsTUIgIC0xMjgoJXNwKSwlcjMKKworCS5QUk9DRU5ECQorCisKKzstLS0gbm90IFBJQwkuU1BBQ0UJJFRFWFQkCis7LS0tIG5vdCBQSUMJLlNVQlNQQQkkQ09ERSQKKzstLS0gbm90IFBJQwkuU1BBQ0UJJFBSSVZBVEUkLFNPUlQ9MTYKKzstLS0gbm90IFBJQwkuSU1QT1JUCSRnbG9iYWwkLERBVEEKKzstLS0gbm90IFBJQwkuU1BBQ0UJJFRFWFQkCis7LS0tIG5vdCBQSUMJLlNVQlNQQQkkQ09ERSQKKzstLS0gbm90IFBJQwkuU1VCU1BBCSRMSVQkLEFDQ0VTUz0weDJjCis7LS0tIG5vdCBQSUMJQyQ3Cis7LS0tIG5vdCBQSUMJLkFMSUdOCTgKKzstLS0gbm90IFBJQwkuU1RSSU5HWgkiRGl2aXNpb24gd291bGQgb3ZlcmZsb3cgKCVkKVxuIgorCS5FTkQKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vcGEtcmlzYzJXLnMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3BhLXJpc2MyVy5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OTU0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3BhLXJpc2MyVy5zCkBAIC0wLDAgKzEsMTYwNSBAQAorOworOyBQQS1SSVNDIDY0LWJpdCBpbXBsZW1lbnRhdGlvbiBvZiBibl9hc20gY29kZQorOworOyBUaGlzIGNvZGUgaXMgYXBwcm94aW1hdGVseSAyeCBmYXN0ZXIgdGhhbiB0aGUgQyB2ZXJzaW9uCis7IGZvciBSU0EvRFNBLgorOworOyBTZWUgaHR0cDovL2RldnJlc291cmNlLmhwLmNvbS8gIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIFBBLVJJU0MKKzsgYXJjaGl0ZWN0dXJlLiAgQWxzbyBzZWUgdGhlIGJvb2sgIlBBLVJJU0MgMi4wIEFyY2hpdGVjdHVyZSIKKzsgYnkgR2VycnkgS2FuZSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIGluc3RydWN0aW9uIHNldCBhcmNoaXRlY3R1cmUuCis7Cis7IENvZGUgd3JpdHRlbiBieSBDaHJpcyBSdWVtbWxlciAod2l0aCBzb21lIGhlbHAgZnJvbSB0aGUgSFAgQworOyBjb21waWxlcikuCis7Cis7IFRoZSBjb2RlIGNvbXBpbGVzIHdpdGggSFAncyBhc3NlbWJsZXIKKzsKKworCS5sZXZlbAkyLjBXCisJLnNwYWNlCSRURVhUJAorCS5zdWJzcGEJJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz0weDJjLENPREVfT05MWQorCis7Cis7IEdsb2JhbCBSZWdpc3RlciBkZWZpbml0aW9ucyB1c2VkIGZvciB0aGUgcm91dGluZXMuCis7Cis7IFNvbWUgaW5mb3JtYXRpb24gYWJvdXQgSFAncyBydW50aW1lIGFyY2hpdGVjdHVyZSBmb3IgNjQtYml0cy4KKzsKKzsgIkNhbGxlciBzYXZlIiBtZWFucyB0aGUgY2FsbGluZyBmdW5jdGlvbiBtdXN0IHNhdmUgdGhlIHJlZ2lzdGVyCis7IGlmIGl0IHdhbnRzIHRoZSByZWdpc3RlciB0byBiZSBwcmVzZXJ2ZWQuCis7ICJDYWxsZWUgc2F2ZSIgbWVhbnMgaWYgYSBmdW5jdGlvbiB1c2VzIHRoZSByZWdpc3RlciwgaXQgbXVzdCBzYXZlCis7IHRoZSB2YWx1ZSBiZWZvcmUgdXNpbmcgaXQuCis7Cis7IEZvciB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIAorOworOyAgICAiY2FsbGVyIHNhdmUiIHJlZ2lzdGVyczogZnI0LWZyMTEsIGZyMjItZnIzMQorOyAgICAiY2FsbGVlIHNhdmUiIHJlZ2lzdGVyczogZnIxMi1mcjIxCis7ICAgICJzcGVjaWFsIiByZWdpc3RlcnM6IGZyMC1mcjMgKHN0YXR1cyBhbmQgZXhjZXB0aW9uIHJlZ2lzdGVycykKKzsKKzsgRm9yIHRoZSBpbnRlZ2VyIHJlZ2lzdGVycworOyAgICAgdmFsdWUgemVybyAgICAgICAgICAgICA6ICByMAorOyAgICAgImNhbGxlciBzYXZlIiByZWdpc3RlcnM6IHIxLHIxOS1yMjYKKzsgICAgICJjYWxsZWUgc2F2ZSIgcmVnaXN0ZXJzOiByMy1yMTgKKzsgICAgIHJldHVybiByZWdpc3RlciAgICAgICAgOiAgcjIgIChycCkKKzsgICAgIHJldHVybiB2YWx1ZXMgICAgICAgICAgOyByMjggIChyZXQwLHJldDEpCis7ICAgICBTdGFjayBwb2ludGVyICAgICAgICAgIDsgcjMwICAoc3ApIAorOyAgICAgZ2xvYmFsIGRhdGEgcG9pbnRlciAgICA7IHIyNyAgKGRwKQorOyAgICAgYXJndW1lbnQgcG9pbnRlciAgICAgICA7IHIyOSAgKGFwKQorOyAgICAgbWlsbGljb2RlIHJldHVybiBwdHIgICA7IHIzMSAgKGFsc28gYSBjYWxsZXIgc2F2ZSByZWdpc3RlcikKKworCis7Cis7IEFyZ3VtZW50cyB0byB0aGUgcm91dGluZXMKKzsKK3JfcHRyICAgICAgIC5yZWcgJXIyNgorYV9wdHIgICAgICAgLnJlZyAlcjI1CitiX3B0ciAgICAgICAucmVnICVyMjQKK251bSAgICAgICAgIC5yZWcgJXIyNAordyAgICAgICAgICAgLnJlZyAlcjIzCituICAgICAgICAgICAucmVnICVyMjMKKworCis7Cis7IEdsb2JhbHMgdXNlZCBpbiBzb21lIHJvdXRpbmVzCis7CisKK3RvcF9vdmVyZmxvdyAucmVnICVyMjkKK2hpZ2hfbWFzayAgICAucmVnICVyMjIgICAgOyB2YWx1ZSAweGZmZmZmZmZmODAwMDAwMDBMCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBibl9tdWxfYWRkX3dvcmRzCis7Cis7Qk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcl9wdHIsIEJOX1VMT05HICphX3B0ciwgCis7CQkJCQkJCQlpbnQgbnVtLCBCTl9VTE9ORyB3KQorOworOyBhcmcwID0gcl9wdHIKKzsgYXJnMSA9IGFfcHRyCis7IGFyZzIgPSBudW0KKzsgYXJnMyA9IHcKKzsKKzsgTG9jYWwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKzsKKworZm0xICAgICAgICAgIC5yZWcgJWZyMjIKK2ZtICAgICAgICAgICAucmVnICVmcjIzCitodF90ZW1wICAgICAgLnJlZyAlZnIyNAoraHRfdGVtcF8xICAgIC5yZWcgJWZyMjUKK2x0X3RlbXAgICAgICAucmVnICVmcjI2CitsdF90ZW1wXzEgICAgLnJlZyAlZnIyNworZm0xXzEgICAgICAgIC5yZWcgJWZyMjgKK2ZtXzEgICAgICAgICAucmVnICVmcjI5CisKK2Z3X2ggICAgICAgICAucmVnICVmcjdMCitmd19sICAgICAgICAgLnJlZyAlZnI3UgorZncgICAgICAgICAgIC5yZWcgJWZyNworCitmaHRfMCAgICAgICAgLnJlZyAlZnI4TAorZmx0XzAgICAgICAgIC5yZWcgJWZyOFIKK3RfZmxvYXRfMCAgICAucmVnICVmcjgKKworZmh0XzEgICAgICAgIC5yZWcgJWZyOUwKK2ZsdF8xICAgICAgICAucmVnICVmcjlSCit0X2Zsb2F0XzEgICAgLnJlZyAlZnI5CisKK3RtcF8wICAgICAgICAucmVnICVyMzEKK3RtcF8xICAgICAgICAucmVnICVyMjEKK21fMCAgICAgICAgICAucmVnICVyMjAgCittXzEgICAgICAgICAgLnJlZyAlcjE5IAoraHRfMCAgICAgICAgIC5yZWcgJXIxICAKK2h0XzEgICAgICAgICAucmVnICVyMworbHRfMCAgICAgICAgIC5yZWcgJXI0CitsdF8xICAgICAgICAgLnJlZyAlcjUKK20xXzAgICAgICAgICAucmVnICVyNiAKK20xXzEgICAgICAgICAucmVnICVyNyAKK3JwX3ZhbCAgICAgICAucmVnICVyOAorcnBfdmFsXzEgICAgIC5yZWcgJXI5CisKK2JuX211bF9hZGRfd29yZHMKKwkuZXhwb3J0CWJuX211bF9hZGRfd29yZHMsZW50cnksTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorCS5wcm9jCisJLmNhbGxpbmZvIGZyYW1lPTEyOAorICAgIC5lbnRyeQorCS5hbGlnbiA2NAorCisgICAgU1REICAgICAlcjMsMCglc3ApICAgICAgICAgIDsgc2F2ZSByMyAgCisgICAgU1REICAgICAlcjQsOCglc3ApICAgICAgICAgIDsgc2F2ZSByNCAgCisJTk9QICAgICAgICAgICAgICAgICAgICAgICAgIDsgTmVlZGVkIHRvIG1ha2UgdGhlIGxvb3AgMTYtYnl0ZSBhbGlnbmVkCisJTk9QICAgICAgICAgICAgICAgICAgICAgICAgIDsgTmVlZGVkIHRvIG1ha2UgdGhlIGxvb3AgMTYtYnl0ZSBhbGlnbmVkCisKKyAgICBTVEQgICAgICVyNSwxNiglc3ApICAgICAgICAgOyBzYXZlIHI1ICAKKyAgICBTVEQgICAgICVyNiwyNCglc3ApICAgICAgICAgOyBzYXZlIHI2ICAKKyAgICBTVEQgICAgICVyNywzMiglc3ApICAgICAgICAgOyBzYXZlIHI3ICAKKyAgICBTVEQgICAgICVyOCw0MCglc3ApICAgICAgICAgOyBzYXZlIHI4ICAKKworICAgIFNURCAgICAgJXI5LDQ4KCVzcCkgICAgICAgICA7IHNhdmUgcjkgIAorICAgIENPUFkgICAgJXIwLCVyZXQwICAgICAgICAgICA7IHJldHVybiAwIGJ5IGRlZmF1bHQKKyAgICBERVBESSxaIDEsMzEsMSx0b3Bfb3ZlcmZsb3cgOyB0b3Bfb3ZlcmZsb3cgPSAxIDw8IDMyICAgIAorCVNURCAgICAgdyw1Niglc3ApICAgICAgICAgICA7IHN0b3JlIHcgb24gc3RhY2sKKworICAgIENNUElCLD49IDAsbnVtLGJuX211bF9hZGRfd29yZHNfZXhpdCAgOyBpZiAobnVtIDw9IDApIHRoZW4gZXhpdAorCUxETyAgICAgMTI4KCVzcCksJXNwICAgICAgIDsgYnVtcCBzdGFjaworCisJOworCTsgVGhlIGxvb3AgaXMgdW5yb2xsZWQgdHdpY2UsIHNvIGlmIHRoZXJlIGlzIG9ubHkgMSBudW1iZXIKKyAgICA7IHRoZW4gZ28gc3RyYWlnaHQgdG8gdGhlIGNsZWFudXAgY29kZS4KKwk7CisJQ01QSUIsPSAxLG51bSxibl9tdWxfYWRkX3dvcmRzX3NpbmdsZV90b3AKKwlGTEREICAgIC03Miglc3ApLGZ3ICAgICA7IGxvYWQgdXAgdyBpbnRvIGZwIHJlZ2lzdGVyIGZ3IChmd19oL2Z3X2wpCisKKwk7CisJOyBUaGlzIGxvb3AgaXMgdW5yb2xsZWQgMiB0aW1lcyAoNjQtYnl0ZSBhbGlnbmVkIGFzIHdlbGwpCisJOworCTsgUEEtUklTQyAyLjAgY2hpcHMgaGF2ZSB0d28gZnVsbHkgcGlwZWxpbmVkIG11bHRpcGxpZXJzLCB0aHVzCisgICAgOyB0d28gMzItYml0IG11dGlwbGllcyBjYW4gYmUgaXNzdWVkIHBlciBjeWNsZS4KKyAgICA7IAorYm5fbXVsX2FkZF93b3Jkc191bnJvbGwyCisKKyAgICBGTEREICAgIDAoYV9wdHIpLHRfZmxvYXRfMCAgICAgICA7IGxvYWQgdXAgNjQtYml0IHZhbHVlIChmcjhMKSBodChMKS9sdChSKQorICAgIEZMREQgICAgOChhX3B0ciksdF9mbG9hdF8xICAgICAgIDsgbG9hZCB1cCA2NC1iaXQgdmFsdWUgKGZyOEwpIGh0KEwpL2x0KFIpCisgICAgTEREICAgICAwKHJfcHRyKSxycF92YWwgICAgICAgICAgOyBycFswXQorICAgIExERCAgICAgOChyX3B0cikscnBfdmFsXzEgICAgICAgIDsgcnBbMV0KKworICAgIFhNUFlVICAgZmh0XzAsZndfbCxmbTEgICAgICAgICAgIDsgbTFbMF0gPSBmaHRfMCpmd19sCisgICAgWE1QWVUgICBmaHRfMSxmd19sLGZtMV8xICAgICAgICAgOyBtMVsxXSA9IGZodF8xKmZ3X2wKKyAgICBGU1REICAgIGZtMSwtMTYoJXNwKSAgICAgICAgICAgICA7IC0xNihzcCkgPSBtMVswXQorICAgIEZTVEQgICAgZm0xXzEsLTQ4KCVzcCkgICAgICAgICAgIDsgLTQ4KHNwKSA9IG0xWzFdCisKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2gsZm0gICAgICAgICAgICA7IG1bMF0gPSBmbHRfMCpmd19oCisgICAgWE1QWVUgICBmbHRfMSxmd19oLGZtXzEgICAgICAgICAgOyBtWzFdID0gZmx0XzEqZndfaAorICAgIEZTVEQgICAgZm0sLTgoJXNwKSAgICAgICAgICAgICAgIDsgLTgoc3ApID0gbVswXQorICAgIEZTVEQgICAgZm1fMSwtNDAoJXNwKSAgICAgICAgICAgIDsgLTQwKHNwKSA9IG1bMV0KKworICAgIFhNUFlVICAgZmh0XzAsZndfaCxodF90ZW1wICAgICAgIDsgaHRfdGVtcCAgID0gZmh0XzAqZndfaAorICAgIFhNUFlVICAgZmh0XzEsZndfaCxodF90ZW1wXzEgICAgIDsgaHRfdGVtcF8xID0gZmh0XzEqZndfaAorICAgIEZTVEQgICAgaHRfdGVtcCwtMjQoJXNwKSAgICAgICAgIDsgLTI0KHNwKSAgID0gaHRfdGVtcAorICAgIEZTVEQgICAgaHRfdGVtcF8xLC01Niglc3ApICAgICAgIDsgLTU2KHNwKSAgID0gaHRfdGVtcF8xCisKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2wsbHRfdGVtcCAgICAgICA7IGx0X3RlbXAgPSBsdCpmd19sCisgICAgWE1QWVUgICBmbHRfMSxmd19sLGx0X3RlbXBfMSAgICAgOyBsdF90ZW1wID0gbHQqZndfbAorICAgIEZTVEQgICAgbHRfdGVtcCwtMzIoJXNwKSAgICAgICAgIDsgLTMyKHNwKSA9IGx0X3RlbXAgCisgICAgRlNURCAgICBsdF90ZW1wXzEsLTY0KCVzcCkgICAgICAgOyAtNjQoc3ApID0gbHRfdGVtcF8xIAorCisgICAgTEREICAgICAtOCglc3ApLG1fMCAgICAgICAgICAgICAgOyBtWzBdIAorICAgIExERCAgICAgLTQwKCVzcCksbV8xICAgICAgICAgICAgIDsgbVsxXQorICAgIExERCAgICAgLTE2KCVzcCksbTFfMCAgICAgICAgICAgIDsgbTFbMF0KKyAgICBMREQgICAgIC00OCglc3ApLG0xXzEgICAgICAgICAgICA7IG0xWzFdCisKKyAgICBMREQgICAgIC0yNCglc3ApLGh0XzAgICAgICAgICAgICA7IGh0WzBdCisgICAgTEREICAgICAtNTYoJXNwKSxodF8xICAgICAgICAgICAgOyBodFsxXQorICAgIEFERCxMICAgbTFfMCxtXzAsdG1wXzAgICAgICAgICAgIDsgdG1wXzAgPSBtWzBdICsgbTFbMF07IAorICAgIEFERCxMICAgbTFfMSxtXzEsdG1wXzEgICAgICAgICAgIDsgdG1wXzEgPSBtWzFdICsgbTFbMV07IAorCisgICAgTEREICAgICAtMzIoJXNwKSxsdF8wICAgICAgICAgICAgCisgICAgTEREICAgICAtNjQoJXNwKSxsdF8xICAgICAgICAgICAgCisgICAgQ01QQ0xSLCo+Pj0gdG1wXzAsbTFfMCwgJXIwICAgICAgOyBpZiAobVswXSA8IG0xWzBdKQorICAgIEFERCxMICAgaHRfMCx0b3Bfb3ZlcmZsb3csaHRfMCAgIDsgaHRbMF0gKz0gKDE8PDMyKQorCisgICAgQ01QQ0xSLCo+Pj0gdG1wXzEsbTFfMSwlcjAgICAgICAgOyBpZiAobVsxXSA8IG0xWzFdKQorICAgIEFERCxMICAgaHRfMSx0b3Bfb3ZlcmZsb3csaHRfMSAgIDsgaHRbMV0gKz0gKDE8PDMyKQorICAgIEVYVFJELFUgdG1wXzAsMzEsMzIsbV8wICAgICAgICAgIDsgbVswXT4+MzIgIAorICAgIERFUEQsWiAgdG1wXzAsMzEsMzIsbTFfMCAgICAgICAgIDsgbTFbMF0gPSBtWzBdPDwzMiAKKworICAgIEVYVFJELFUgdG1wXzEsMzEsMzIsbV8xICAgICAgICAgIDsgbVsxXT4+MzIgIAorICAgIERFUEQsWiAgdG1wXzEsMzEsMzIsbTFfMSAgICAgICAgIDsgbTFbMV0gPSBtWzFdPDwzMiAKKyAgICBBREQsTCAgIGh0XzAsbV8wLGh0XzAgICAgICAgICAgICA7IGh0WzBdKz0gKG1bMF0+PjMyKQorICAgIEFERCxMICAgaHRfMSxtXzEsaHRfMSAgICAgICAgICAgIDsgaHRbMV0rPSAobVsxXT4+MzIpCisKKyAgICBBREQgICAgIGx0XzAsbTFfMCxsdF8wICAgICAgICAgICA7IGx0WzBdID0gbHRbMF0rbTFbMF07CisJQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgOyBodFswXSsrCisgICAgQUREICAgICBsdF8xLG0xXzEsbHRfMSAgICAgICAgICAgOyBsdFsxXSA9IGx0WzFdK20xWzFdOworICAgIEFERCxEQyAgaHRfMSwlcjAsaHRfMSAgICAgICAgICAgIDsgaHRbMV0rKworCisgICAgQUREICAgICVyZXQwLGx0XzAsbHRfMCAgICAgICAgICAgOyBsdFswXSA9IGx0WzBdICsgYzsKKwlBREQsREMgIGh0XzAsJXIwLGh0XzAgICAgICAgICAgICA7IGh0WzBdKysKKyAgICBBREQgICAgIGx0XzAscnBfdmFsLGx0XzAgICAgICAgICA7IGx0WzBdID0gbHRbMF0rcnBbMF0KKyAgICBBREQsREMgIGh0XzAsJXIwLGh0XzAgICAgICAgICAgICA7IGh0WzBdKysKKworCUxETyAgICAtMihudW0pLG51bSAgICAgICAgICAgICAgIDsgbnVtID0gbnVtIC0gMjsKKyAgICBBREQgICAgIGh0XzAsbHRfMSxsdF8xICAgICAgICAgICA7IGx0WzFdID0gbHRbMV0gKyBodF8wIChjKTsKKyAgICBBREQsREMgIGh0XzEsJXIwLGh0XzEgICAgICAgICAgICA7IGh0WzFdKysKKyAgICBTVEQgICAgIGx0XzAsMChyX3B0cikgICAgICAgICAgICA7IHJwWzBdID0gbHRbMF0KKworICAgIEFERCAgICAgbHRfMSxycF92YWxfMSxsdF8xICAgICAgIDsgbHRbMV0gPSBsdFsxXStycFsxXQorICAgIEFERCxEQyAgaHRfMSwlcjAsJXJldDAgICAgICAgICAgIDsgaHRbMV0rKworICAgIExETyAgICAgMTYoYV9wdHIpLGFfcHRyICAgICAgICAgIDsgYV9wdHIgKz0gMgorCisgICAgU1REICAgICBsdF8xLDgocl9wdHIpICAgICAgICAgICAgOyBycFsxXSA9IGx0WzFdCisJQ01QSUIsPD0gMixudW0sYm5fbXVsX2FkZF93b3Jkc191bnJvbGwyIDsgZ28gYWdhaW4gaWYgbW9yZSB0byBkbworICAgIExETyAgICAgMTYocl9wdHIpLHJfcHRyICAgICAgICAgIDsgcl9wdHIgKz0gMgorCisgICAgQ01QSUIsPSxOIDAsbnVtLGJuX211bF9hZGRfd29yZHNfZXhpdCA7IGFyZSB3ZSBkb25lLCBvciBjbGVhbnVwIGxhc3Qgb25lCisKKwk7CisJOyBUb3Agb2YgbG9vcCBhbGlnbmVkIG9uIDY0LWJ5dGUgYm91bmRhcnkKKwk7Citibl9tdWxfYWRkX3dvcmRzX3NpbmdsZV90b3AKKyAgICBGTEREICAgIDAoYV9wdHIpLHRfZmxvYXRfMCAgICAgICAgOyBsb2FkIHVwIDY0LWJpdCB2YWx1ZSAoZnI4TCkgaHQoTCkvbHQoUikKKyAgICBMREQgICAgIDAocl9wdHIpLHJwX3ZhbCAgICAgICAgICAgOyBycFswXQorICAgIExETyAgICAgOChhX3B0ciksYV9wdHIgICAgICAgICAgICA7IGFfcHRyKysKKyAgICBYTVBZVSAgIGZodF8wLGZ3X2wsZm0xICAgICAgICAgICAgOyBtMSA9IGh0KmZ3X2wKKyAgICBGU1REICAgIGZtMSwtMTYoJXNwKSAgICAgICAgICAgICAgOyAtMTYoc3ApID0gbTEKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2gsZm0gICAgICAgICAgICAgOyBtID0gbHQqZndfaAorICAgIEZTVEQgICAgZm0sLTgoJXNwKSAgICAgICAgICAgICAgICA7IC04KHNwKSA9IG0KKyAgICBYTVBZVSAgIGZodF8wLGZ3X2gsaHRfdGVtcCAgICAgICAgOyBodF90ZW1wID0gaHQqZndfaAorICAgIEZTVEQgICAgaHRfdGVtcCwtMjQoJXNwKSAgICAgICAgICA7IC0yNChzcCkgPSBodAorICAgIFhNUFlVICAgZmx0XzAsZndfbCxsdF90ZW1wICAgICAgICA7IGx0X3RlbXAgPSBsdCpmd19sCisgICAgRlNURCAgICBsdF90ZW1wLC0zMiglc3ApICAgICAgICAgIDsgLTMyKHNwKSA9IGx0IAorCisgICAgTEREICAgICAtOCglc3ApLG1fMCAgICAgICAgICAgICAgIAorICAgIExERCAgICAtMTYoJXNwKSxtMV8wICAgICAgICAgICAgICA7IG0xID0gdGVtcDEgCisgICAgQURELEwgICBtXzAsbTFfMCx0bXBfMCAgICAgICAgICAgIDsgdG1wXzAgPSBtICsgbTE7IAorICAgIExERCAgICAgLTI0KCVzcCksaHRfMCAgICAgICAgICAgICAKKyAgICBMREQgICAgIC0zMiglc3ApLGx0XzAgICAgICAgICAgICAgCisKKyAgICBDTVBDTFIsKj4+PSB0bXBfMCxtMV8wLCVyMCAgICAgICAgOyBpZiAobSA8IG0xKQorICAgIEFERCxMICAgaHRfMCx0b3Bfb3ZlcmZsb3csaHRfMCAgICA7IGh0ICs9ICgxPDwzMikKKworICAgIEVYVFJELFUgdG1wXzAsMzEsMzIsbV8wICAgICAgICAgICA7IG0+PjMyICAKKyAgICBERVBELFogIHRtcF8wLDMxLDMyLG0xXzAgICAgICAgICAgOyBtMSA9IG08PDMyIAorCisgICAgQURELEwgICBodF8wLG1fMCxodF8wICAgICAgICAgICAgIDsgaHQrPSAobT4+MzIpCisgICAgQUREICAgICBsdF8wLG0xXzAsdG1wXzAgICAgICAgICAgIDsgdG1wXzAgPSBsdCttMTsKKyAgICBBREQsREMgIGh0XzAsJXIwLGh0XzAgICAgICAgICAgICAgOyBodCsrCisgICAgQUREICAgICAlcmV0MCx0bXBfMCxsdF8wICAgICAgICAgIDsgbHQgPSBsdCArIGM7CisgICAgQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworICAgIEFERCAgICAgbHRfMCxycF92YWwsbHRfMCAgICAgICAgICA7IGx0ID0gbHQrcnBbMF0KKyAgICBBREQsREMgIGh0XzAsJXIwLCVyZXQwICAgICAgICAgICAgOyBodCsrCisgICAgU1REICAgICBsdF8wLDAocl9wdHIpICAgICAgICAgICAgIDsgcnBbMF0gPSBsdAorCitibl9tdWxfYWRkX3dvcmRzX2V4aXQKKyAgICAuRVhJVAorICAgIExERCAgICAgLTgwKCVzcCksJXI5ICAgICAgICAgICAgICA7IHJlc3RvcmUgcjkgIAorICAgIExERCAgICAgLTg4KCVzcCksJXI4ICAgICAgICAgICAgICA7IHJlc3RvcmUgcjggIAorICAgIExERCAgICAgLTk2KCVzcCksJXI3ICAgICAgICAgICAgICA7IHJlc3RvcmUgcjcgIAorICAgIExERCAgICAgLTEwNCglc3ApLCVyNiAgICAgICAgICAgICA7IHJlc3RvcmUgcjYgIAorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgICAgICA7IHJlc3RvcmUgcjUgIAorICAgIExERCAgICAgLTEyMCglc3ApLCVyNCAgICAgICAgICAgICA7IHJlc3RvcmUgcjQgIAorICAgIEJWRSAgICAgKCVycCkKKyAgICBMREQsTUIgIC0xMjgoJXNwKSwlcjMgICAgICAgICAgICAgOyByZXN0b3JlIHIzCisJLlBST0NFTkQJO2luPTIzLDI0LDI1LDI2LDI5O291dD0yODsKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKztCTl9VTE9ORyBibl9tdWxfd29yZHMoQk5fVUxPTkcgKnJwLCBCTl9VTE9ORyAqYXAsIGludCBudW0sIEJOX1VMT05HIHcpCis7Cis7IGFyZzAgPSBycAorOyBhcmcxID0gYXAKKzsgYXJnMiA9IG51bQorOyBhcmczID0gdworCitibl9tdWxfd29yZHMKKwkucHJvYworCS5jYWxsaW5mbyBmcmFtZT0xMjgKKyAgICAuZW50cnkKKwkuRVhQT1JUCWJuX211bF93b3JkcyxFTlRSWSxQUklWX0xFVj0zLE5PX1JFTE9DQVRJT04sTE9OR19SRVRVUk4KKwkuYWxpZ24gNjQKKworICAgIFNURCAgICAgJXIzLDAoJXNwKSAgICAgICAgICA7IHNhdmUgcjMgIAorICAgIFNURCAgICAgJXI0LDgoJXNwKSAgICAgICAgICA7IHNhdmUgcjQgIAorICAgIFNURCAgICAgJXI1LDE2KCVzcCkgICAgICAgICA7IHNhdmUgcjUgIAorICAgIFNURCAgICAgJXI2LDI0KCVzcCkgICAgICAgICA7IHNhdmUgcjYgIAorCisgICAgU1REICAgICAlcjcsMzIoJXNwKSAgICAgICAgIDsgc2F2ZSByNyAgCisgICAgQ09QWSAgICAlcjAsJXJldDAgICAgICAgICAgIDsgcmV0dXJuIDAgYnkgZGVmYXVsdAorICAgIERFUERJLFogMSwzMSwxLHRvcF9vdmVyZmxvdyA7IHRvcF9vdmVyZmxvdyA9IDEgPDwgMzIgICAgCisJU1REICAgICB3LDU2KCVzcCkgICAgICAgICAgIDsgdyBvbiBzdGFjaworCisgICAgQ01QSUIsPj0gMCxudW0sYm5fbXVsX3dvcmRzX2V4aXQKKwlMRE8gICAgIDEyOCglc3ApLCVzcCAgICAgICA7IGJ1bXAgc3RhY2sKKworCTsKKwk7IFNlZSBpZiBvbmx5IDEgd29yZCB0byBkbywgdGh1cyBqdXN0IGRvIGNsZWFudXAKKwk7CisJQ01QSUIsPSAxLG51bSxibl9tdWxfd29yZHNfc2luZ2xlX3RvcAorCUZMREQgICAgLTcyKCVzcCksZncgICAgIDsgbG9hZCB1cCB3IGludG8gZnAgcmVnaXN0ZXIgZncgKGZ3X2gvZndfbCkKKworCTsKKwk7IFRoaXMgbG9vcCBpcyB1bnJvbGxlZCAyIHRpbWVzICg2NC1ieXRlIGFsaWduZWQgYXMgd2VsbCkKKwk7CisJOyBQQS1SSVNDIDIuMCBjaGlwcyBoYXZlIHR3byBmdWxseSBwaXBlbGluZWQgbXVsdGlwbGllcnMsIHRodXMKKyAgICA7IHR3byAzMi1iaXQgbXV0aXBsaWVzIGNhbiBiZSBpc3N1ZWQgcGVyIGN5Y2xlLgorICAgIDsgCitibl9tdWxfd29yZHNfdW5yb2xsMgorCisgICAgRkxERCAgICAwKGFfcHRyKSx0X2Zsb2F0XzAgICAgICAgIDsgbG9hZCB1cCA2NC1iaXQgdmFsdWUgKGZyOEwpIGh0KEwpL2x0KFIpCisgICAgRkxERCAgICA4KGFfcHRyKSx0X2Zsb2F0XzEgICAgICAgIDsgbG9hZCB1cCA2NC1iaXQgdmFsdWUgKGZyOEwpIGh0KEwpL2x0KFIpCisgICAgWE1QWVUgICBmaHRfMCxmd19sLGZtMSAgICAgICAgICAgIDsgbTFbMF0gPSBmaHRfMCpmd19sCisgICAgWE1QWVUgICBmaHRfMSxmd19sLGZtMV8xICAgICAgICAgIDsgbTFbMV0gPSBodCpmd19sCisKKyAgICBGU1REICAgIGZtMSwtMTYoJXNwKSAgICAgICAgICAgICAgOyAtMTYoc3ApID0gbTEKKyAgICBGU1REICAgIGZtMV8xLC00OCglc3ApICAgICAgICAgICAgOyAtNDgoc3ApID0gbTEKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2gsZm0gICAgICAgICAgICAgOyBtID0gbHQqZndfaAorICAgIFhNUFlVICAgZmx0XzEsZndfaCxmbV8xICAgICAgICAgICA7IG0gPSBsdCpmd19oCisKKyAgICBGU1REICAgIGZtLC04KCVzcCkgICAgICAgICAgICAgICAgOyAtOChzcCkgPSBtCisgICAgRlNURCAgICBmbV8xLC00MCglc3ApICAgICAgICAgICAgIDsgLTQwKHNwKSA9IG0KKyAgICBYTVBZVSAgIGZodF8wLGZ3X2gsaHRfdGVtcCAgICAgICAgOyBodF90ZW1wID0gZmh0XzAqZndfaAorICAgIFhNUFlVICAgZmh0XzEsZndfaCxodF90ZW1wXzEgICAgICA7IGh0X3RlbXAgPSBodCpmd19oCisKKyAgICBGU1REICAgIGh0X3RlbXAsLTI0KCVzcCkgICAgICAgICAgOyAtMjQoc3ApID0gaHQKKyAgICBGU1REICAgIGh0X3RlbXBfMSwtNTYoJXNwKSAgICAgICAgOyAtNTYoc3ApID0gaHQKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2wsbHRfdGVtcCAgICAgICAgOyBsdF90ZW1wID0gbHQqZndfbAorICAgIFhNUFlVICAgZmx0XzEsZndfbCxsdF90ZW1wXzEgICAgICA7IGx0X3RlbXAgPSBsdCpmd19sCisKKyAgICBGU1REICAgIGx0X3RlbXAsLTMyKCVzcCkgICAgICAgICAgOyAtMzIoc3ApID0gbHQgCisgICAgRlNURCAgICBsdF90ZW1wXzEsLTY0KCVzcCkgICAgICAgIDsgLTY0KHNwKSA9IGx0IAorICAgIExERCAgICAgLTgoJXNwKSxtXzAgICAgICAgICAgICAgICAKKyAgICBMREQgICAgIC00MCglc3ApLG1fMSAgICAgICAgICAgICAgCisKKyAgICBMREQgICAgLTE2KCVzcCksbTFfMCAgICAgICAgICAgICAgCisgICAgTEREICAgIC00OCglc3ApLG0xXzEgICAgICAgICAgICAgIAorICAgIExERCAgICAgLTI0KCVzcCksaHRfMCAgICAgICAgICAgICAKKyAgICBMREQgICAgIC01Niglc3ApLGh0XzEgICAgICAgICAgICAgCisKKyAgICBBREQsTCAgIG0xXzAsbV8wLHRtcF8wICAgICAgICAgICAgOyB0bXBfMCA9IG0gKyBtMTsgCisgICAgQURELEwgICBtMV8xLG1fMSx0bXBfMSAgICAgICAgICAgIDsgdG1wXzEgPSBtICsgbTE7IAorICAgIExERCAgICAgLTMyKCVzcCksbHRfMCAgICAgICAgICAgICAKKyAgICBMREQgICAgIC02NCglc3ApLGx0XzEgICAgICAgICAgICAgCisKKyAgICBDTVBDTFIsKj4+PSB0bXBfMCxtMV8wLCAlcjAgICAgICAgOyBpZiAobSA8IG0xKQorICAgIEFERCxMICAgaHRfMCx0b3Bfb3ZlcmZsb3csaHRfMCAgICA7IGh0ICs9ICgxPDwzMikKKyAgICBDTVBDTFIsKj4+PSB0bXBfMSxtMV8xLCVyMCAgICAgICAgOyBpZiAobSA8IG0xKQorICAgIEFERCxMICAgaHRfMSx0b3Bfb3ZlcmZsb3csaHRfMSAgICA7IGh0ICs9ICgxPDwzMikKKworICAgIEVYVFJELFUgdG1wXzAsMzEsMzIsbV8wICAgICAgICAgICA7IG0+PjMyICAKKyAgICBERVBELFogIHRtcF8wLDMxLDMyLG0xXzAgICAgICAgICAgOyBtMSA9IG08PDMyIAorICAgIEVYVFJELFUgdG1wXzEsMzEsMzIsbV8xICAgICAgICAgICA7IG0+PjMyICAKKyAgICBERVBELFogIHRtcF8xLDMxLDMyLG0xXzEgICAgICAgICAgOyBtMSA9IG08PDMyIAorCisgICAgQURELEwgICBodF8wLG1fMCxodF8wICAgICAgICAgICAgIDsgaHQrPSAobT4+MzIpCisgICAgQURELEwgICBodF8xLG1fMSxodF8xICAgICAgICAgICAgIDsgaHQrPSAobT4+MzIpCisgICAgQUREICAgICBsdF8wLG0xXzAsbHRfMCAgICAgICAgICAgIDsgbHQgPSBsdCttMTsKKwlBREQsREMgIGh0XzAsJXIwLGh0XzAgICAgICAgICAgICAgOyBodCsrCisKKyAgICBBREQgICAgIGx0XzEsbTFfMSxsdF8xICAgICAgICAgICAgOyBsdCA9IGx0K20xOworICAgIEFERCxEQyAgaHRfMSwlcjAsaHRfMSAgICAgICAgICAgICA7IGh0KysKKyAgICBBREQgICAgJXJldDAsbHRfMCxsdF8wICAgICAgICAgICAgOyBsdCA9IGx0ICsgYyAocmV0MCk7CisJQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworCisgICAgQUREICAgICBodF8wLGx0XzEsbHRfMSAgICAgICAgICAgIDsgbHQgPSBsdCArIGMgKGh0XzApCisgICAgQURELERDICBodF8xLCVyMCxodF8xICAgICAgICAgICAgIDsgaHQrKworICAgIFNURCAgICAgbHRfMCwwKHJfcHRyKSAgICAgICAgICAgICA7IHJwWzBdID0gbHQKKyAgICBTVEQgICAgIGx0XzEsOChyX3B0cikgICAgICAgICAgICAgOyBycFsxXSA9IGx0CisKKwlDT1BZICAgIGh0XzEsJXJldDAgICAgICAgICAgICAgICAgOyBjYXJyeSA9IGh0CisJTERPICAgIC0yKG51bSksbnVtICAgICAgICAgICAgICAgIDsgbnVtID0gbnVtIC0gMjsKKyAgICBMRE8gICAgIDE2KGFfcHRyKSxhX3B0ciAgICAgICAgICAgOyBhcCArPSAyCisJQ01QSUIsPD0gMixudW0sYm5fbXVsX3dvcmRzX3Vucm9sbDIKKyAgICBMRE8gICAgIDE2KHJfcHRyKSxyX3B0ciAgICAgICAgICAgOyBycCsrCisKKyAgICBDTVBJQiw9LE4gMCxudW0sYm5fbXVsX3dvcmRzX2V4aXQgOyBhcmUgd2UgZG9uZT8KKworCTsKKwk7IFRvcCBvZiBsb29wIGFsaWduZWQgb24gNjQtYnl0ZSBib3VuZGFyeQorCTsKK2JuX211bF93b3Jkc19zaW5nbGVfdG9wCisgICAgRkxERCAgICAwKGFfcHRyKSx0X2Zsb2F0XzAgICAgICAgIDsgbG9hZCB1cCA2NC1iaXQgdmFsdWUgKGZyOEwpIGh0KEwpL2x0KFIpCisKKyAgICBYTVBZVSAgIGZodF8wLGZ3X2wsZm0xICAgICAgICAgICAgOyBtMSA9IGh0KmZ3X2wKKyAgICBGU1REICAgIGZtMSwtMTYoJXNwKSAgICAgICAgICAgICAgOyAtMTYoc3ApID0gbTEKKyAgICBYTVBZVSAgIGZsdF8wLGZ3X2gsZm0gICAgICAgICAgICAgOyBtID0gbHQqZndfaAorICAgIEZTVEQgICAgZm0sLTgoJXNwKSAgICAgICAgICAgICAgICA7IC04KHNwKSA9IG0KKyAgICBYTVBZVSAgIGZodF8wLGZ3X2gsaHRfdGVtcCAgICAgICAgOyBodF90ZW1wID0gaHQqZndfaAorICAgIEZTVEQgICAgaHRfdGVtcCwtMjQoJXNwKSAgICAgICAgICA7IC0yNChzcCkgPSBodAorICAgIFhNUFlVICAgZmx0XzAsZndfbCxsdF90ZW1wICAgICAgICA7IGx0X3RlbXAgPSBsdCpmd19sCisgICAgRlNURCAgICBsdF90ZW1wLC0zMiglc3ApICAgICAgICAgIDsgLTMyKHNwKSA9IGx0IAorCisgICAgTEREICAgICAtOCglc3ApLG1fMCAgICAgICAgICAgICAgIAorICAgIExERCAgICAtMTYoJXNwKSxtMV8wICAgICAgICAgICAgICAKKyAgICBBREQsTCAgIG1fMCxtMV8wLHRtcF8wICAgICAgICAgICAgOyB0bXBfMCA9IG0gKyBtMTsgCisgICAgTEREICAgICAtMjQoJXNwKSxodF8wICAgICAgICAgICAgIAorICAgIExERCAgICAgLTMyKCVzcCksbHRfMCAgICAgICAgICAgICAKKworICAgIENNUENMUiwqPj49IHRtcF8wLG0xXzAsJXIwICAgICAgICA7IGlmIChtIDwgbTEpCisgICAgQURELEwgICBodF8wLHRvcF9vdmVyZmxvdyxodF8wICAgIDsgaHQgKz0gKDE8PDMyKQorCisgICAgRVhUUkQsVSB0bXBfMCwzMSwzMixtXzAgICAgICAgICAgIDsgbT4+MzIgIAorICAgIERFUEQsWiAgdG1wXzAsMzEsMzIsbTFfMCAgICAgICAgICA7IG0xID0gbTw8MzIgCisKKyAgICBBREQsTCAgIGh0XzAsbV8wLGh0XzAgICAgICAgICAgICAgOyBodCs9IChtPj4zMikKKyAgICBBREQgICAgIGx0XzAsbTFfMCxsdF8wICAgICAgICAgICAgOyBsdD0gbHQrbTE7CisgICAgQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworCisgICAgQUREICAgICAlcmV0MCxsdF8wLGx0XzAgICAgICAgICAgIDsgbHQgPSBsdCArIGM7CisgICAgQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworCisgICAgQ09QWSAgICBodF8wLCVyZXQwICAgICAgICAgICAgICAgIDsgY29weSBjYXJyeQorICAgIFNURCAgICAgbHRfMCwwKHJfcHRyKSAgICAgICAgICAgICA7IHJwWzBdID0gbHQKKworYm5fbXVsX3dvcmRzX2V4aXQKKyAgICAuRVhJVAorICAgIExERCAgICAgLTk2KCVzcCksJXI3ICAgICAgICAgICAgICA7IHJlc3RvcmUgcjcgIAorICAgIExERCAgICAgLTEwNCglc3ApLCVyNiAgICAgICAgICAgICA7IHJlc3RvcmUgcjYgIAorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgICAgICA7IHJlc3RvcmUgcjUgIAorICAgIExERCAgICAgLTEyMCglc3ApLCVyNCAgICAgICAgICAgICA7IHJlc3RvcmUgcjQgIAorICAgIEJWRSAgICAgKCVycCkKKyAgICBMREQsTUIgIC0xMjgoJXNwKSwlcjMgICAgICAgICAgICAgOyByZXN0b3JlIHIzCisJLlBST0NFTkQJO2luPTIzLDI0LDI1LDI2LDI5O291dD0yODsKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzt2b2lkIGJuX3Nxcl93b3JkcyhCTl9VTE9ORyAqcnAsIEJOX1VMT05HICphcCwgaW50IG51bSkKKzsKKzsgYXJnMCA9IHJwCis7IGFyZzEgPSBhcAorOyBhcmcyID0gbnVtCis7CisKK2JuX3Nxcl93b3JkcworCS5wcm9jCisJLmNhbGxpbmZvIEZSQU1FPTEyOCxFTlRSWV9HUj0lcjMsQVJHU19TQVZFRCxPUkRFUklOR19BV0FSRQorCS5FWFBPUlQJYm5fc3FyX3dvcmRzLEVOVFJZLFBSSVZfTEVWPTMsTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorICAgIC5lbnRyeQorCS5hbGlnbiA2NAorCisgICAgU1REICAgICAlcjMsMCglc3ApICAgICAgICAgIDsgc2F2ZSByMyAgCisgICAgU1REICAgICAlcjQsOCglc3ApICAgICAgICAgIDsgc2F2ZSByNCAgCisJTk9QCisgICAgU1REICAgICAlcjUsMTYoJXNwKSAgICAgICAgIDsgc2F2ZSByNSAgCisKKyAgICBDTVBJQiw+PSAwLG51bSxibl9zcXJfd29yZHNfZXhpdAorCUxETyAgICAgMTI4KCVzcCksJXNwICAgICAgIDsgYnVtcCBzdGFjaworCisJOworCTsgSWYgb25seSAxLCB0aGUgZ290byBzdHJhaWdodCB0byBjbGVhbnVwCisJOworCUNNUElCLD0gMSxudW0sYm5fc3FyX3dvcmRzX3NpbmdsZV90b3AKKyAgICBERVBESSxaIC0xLDMyLDMzLGhpZ2hfbWFzayAgIDsgQ3JlYXRlIE1hc2sgMHhmZmZmZmZmZjgwMDAwMDAwTAorCisJOworCTsgVGhpcyBsb29wIGlzIHVucm9sbGVkIDIgdGltZXMgKDY0LWJ5dGUgYWxpZ25lZCBhcyB3ZWxsKQorCTsKKworYm5fc3FyX3dvcmRzX3Vucm9sbDIKKyAgICBGTEREICAgIDAoYV9wdHIpLHRfZmxvYXRfMCAgICAgICAgOyBhWzBdCisgICAgRkxERCAgICA4KGFfcHRyKSx0X2Zsb2F0XzEgICAgICAgIDsgYVsxXQorICAgIFhNUFlVICAgZmh0XzAsZmx0XzAsZm0gICAgICAgICAgICA7IG1bMF0KKyAgICBYTVBZVSAgIGZodF8xLGZsdF8xLGZtXzEgICAgICAgICAgOyBtWzFdCisKKyAgICBGU1REICAgIGZtLC0yNCglc3ApICAgICAgICAgICAgICAgOyBzdG9yZSBtWzBdCisgICAgRlNURCAgICBmbV8xLC01Niglc3ApICAgICAgICAgICAgIDsgc3RvcmUgbVsxXQorICAgIFhNUFlVICAgZmx0XzAsZmx0XzAsbHRfdGVtcCAgICAgICA7IGx0WzBdCisgICAgWE1QWVUgICBmbHRfMSxmbHRfMSxsdF90ZW1wXzEgICAgIDsgbHRbMV0KKworICAgIEZTVEQgICAgbHRfdGVtcCwtMTYoJXNwKSAgICAgICAgICA7IHN0b3JlIGx0WzBdCisgICAgRlNURCAgICBsdF90ZW1wXzEsLTQ4KCVzcCkgICAgICAgIDsgc3RvcmUgbHRbMV0KKyAgICBYTVBZVSAgIGZodF8wLGZodF8wLGh0X3RlbXAgICAgICAgOyBodFswXQorICAgIFhNUFlVICAgZmh0XzEsZmh0XzEsaHRfdGVtcF8xICAgICA7IGh0WzFdCisKKyAgICBGU1REICAgIGh0X3RlbXAsLTgoJXNwKSAgICAgICAgICAgOyBzdG9yZSBodFswXQorICAgIEZTVEQgICAgaHRfdGVtcF8xLC00MCglc3ApICAgICAgICA7IHN0b3JlIGh0WzFdCisgICAgTEREICAgICAtMjQoJXNwKSxtXzAgICAgICAgICAgICAgCisgICAgTEREICAgICAtNTYoJXNwKSxtXzEgICAgICAgICAgICAgIAorCisgICAgQU5EICAgICBtXzAsaGlnaF9tYXNrLHRtcF8wICAgICAgIDsgbVswXSAmIE1hc2sKKyAgICBBTkQgICAgIG1fMSxoaWdoX21hc2ssdG1wXzEgICAgICAgOyBtWzFdICYgTWFzaworICAgIERFUEQsWiAgbV8wLDMwLDMxLG1fMCAgICAgICAgICAgICA7IG1bMF0gPDwgMzIrMQorICAgIERFUEQsWiAgbV8xLDMwLDMxLG1fMSAgICAgICAgICAgICA7IG1bMV0gPDwgMzIrMQorCisgICAgTEREICAgICAtMTYoJXNwKSxsdF8wICAgICAgICAKKyAgICBMREQgICAgIC00OCglc3ApLGx0XzEgICAgICAgIAorICAgIEVYVFJELFUgdG1wXzAsMzIsMzMsdG1wXzAgICAgICAgICA7IHRtcF8wID0gbVswXSZNYXNrID4+IDMyLTEKKyAgICBFWFRSRCxVIHRtcF8xLDMyLDMzLHRtcF8xICAgICAgICAgOyB0bXBfMSA9IG1bMV0mTWFzayA+PiAzMi0xCisKKyAgICBMREQgICAgIC04KCVzcCksaHRfMCAgICAgICAgICAgIAorICAgIExERCAgICAgLTQwKCVzcCksaHRfMSAgICAgICAgICAgCisgICAgQURELEwgICBodF8wLHRtcF8wLGh0XzAgICAgICAgICAgIDsgaHRbMF0gKz0gdG1wXzAKKyAgICBBREQsTCAgIGh0XzEsdG1wXzEsaHRfMSAgICAgICAgICAgOyBodFsxXSArPSB0bXBfMQorCisgICAgQUREICAgICBsdF8wLG1fMCxsdF8wICAgICAgICAgICAgIDsgbHQgPSBsdCttCisgICAgQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHRbMF0rKworICAgIFNURCAgICAgbHRfMCwwKHJfcHRyKSAgICAgICAgICAgICA7IHJwWzBdID0gbHRbMF0KKyAgICBTVEQgICAgIGh0XzAsOChyX3B0cikgICAgICAgICAgICAgOyBycFsxXSA9IGh0WzFdCisKKyAgICBBREQgICAgIGx0XzEsbV8xLGx0XzEgICAgICAgICAgICAgOyBsdCA9IGx0K20KKyAgICBBREQsREMgIGh0XzEsJXIwLGh0XzEgICAgICAgICAgICAgOyBodFsxXSsrCisgICAgU1REICAgICBsdF8xLDE2KHJfcHRyKSAgICAgICAgICAgIDsgcnBbMl0gPSBsdFsxXQorICAgIFNURCAgICAgaHRfMSwyNChyX3B0cikgICAgICAgICAgICA7IHJwWzNdID0gaHRbMV0KKworCUxETyAgICAtMihudW0pLG51bSAgICAgICAgICAgICAgICA7IG51bSA9IG51bSAtIDI7CisgICAgTERPICAgICAxNihhX3B0ciksYV9wdHIgICAgICAgICAgIDsgYXAgKz0gMgorCUNNUElCLDw9IDIsbnVtLGJuX3Nxcl93b3Jkc191bnJvbGwyCisgICAgTERPICAgICAzMihyX3B0cikscl9wdHIgICAgICAgICAgIDsgcnAgKz0gNAorCisgICAgQ01QSUIsPSxOIDAsbnVtLGJuX3Nxcl93b3Jkc19leGl0IDsgYXJlIHdlIGRvbmU/CisKKwk7CisJOyBUb3Agb2YgbG9vcCBhbGlnbmVkIG9uIDY0LWJ5dGUgYm91bmRhcnkKKwk7Citibl9zcXJfd29yZHNfc2luZ2xlX3RvcAorICAgIEZMREQgICAgMChhX3B0ciksdF9mbG9hdF8wICAgICAgICA7IGxvYWQgdXAgNjQtYml0IHZhbHVlIChmcjhMKSBodChMKS9sdChSKQorCisgICAgWE1QWVUgICBmaHRfMCxmbHRfMCxmbSAgICAgICAgICAgIDsgbQorICAgIEZTVEQgICAgZm0sLTI0KCVzcCkgICAgICAgICAgICAgICA7IHN0b3JlIG0KKworICAgIFhNUFlVICAgZmx0XzAsZmx0XzAsbHRfdGVtcCAgICAgICA7IGx0CisgICAgRlNURCAgICBsdF90ZW1wLC0xNiglc3ApICAgICAgICAgIDsgc3RvcmUgbHQKKworICAgIFhNUFlVICAgZmh0XzAsZmh0XzAsaHRfdGVtcCAgICAgICA7IGh0CisgICAgRlNURCAgICBodF90ZW1wLC04KCVzcCkgICAgICAgICAgIDsgc3RvcmUgaHQKKworICAgIExERCAgICAgLTI0KCVzcCksbV8wICAgICAgICAgICAgICA7IGxvYWQgbQorICAgIEFORCAgICAgbV8wLGhpZ2hfbWFzayx0bXBfMCAgICAgICA7IG0gJiBNYXNrCisgICAgREVQRCxaICBtXzAsMzAsMzEsbV8wICAgICAgICAgICAgIDsgbSA8PCAzMisxCisgICAgTEREICAgICAtMTYoJXNwKSxsdF8wICAgICAgICAgICAgIDsgbHQKKworICAgIExERCAgICAgLTgoJXNwKSxodF8wICAgICAgICAgICAgICA7IGh0CisgICAgRVhUUkQsVSB0bXBfMCwzMiwzMyx0bXBfMCAgICAgICAgIDsgdG1wXzAgPSBtJk1hc2sgPj4gMzItMQorICAgIEFERCAgICAgbV8wLGx0XzAsbHRfMCAgICAgICAgICAgICA7IGx0ID0gbHQrbQorICAgIEFERCxMICAgaHRfMCx0bXBfMCxodF8wICAgICAgICAgICA7IGh0ICs9IHRtcF8wCisgICAgQURELERDICBodF8wLCVyMCxodF8wICAgICAgICAgICAgIDsgaHQrKworCisgICAgU1REICAgICBsdF8wLDAocl9wdHIpICAgICAgICAgICAgIDsgcnBbMF0gPSBsdAorICAgIFNURCAgICAgaHRfMCw4KHJfcHRyKSAgICAgICAgICAgICA7IHJwWzFdID0gaHQKKworYm5fc3FyX3dvcmRzX2V4aXQKKyAgICAuRVhJVAorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICA7IHJlc3RvcmUgcjUgIAorICAgIExERCAgICAgLTEyMCglc3ApLCVyNCAgICAgICA7IHJlc3RvcmUgcjQgIAorICAgIEJWRSAgICAgKCVycCkKKyAgICBMREQsTUIgIC0xMjgoJXNwKSwlcjMgCisJLlBST0NFTkQJO2luPTIzLDI0LDI1LDI2LDI5O291dD0yODsKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworO0JOX1VMT05HIGJuX2FkZF93b3JkcyhCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIEJOX1VMT05HICpiLCBpbnQgbikKKzsKKzsgYXJnMCA9IHJwIAorOyBhcmcxID0gYXAKKzsgYXJnMiA9IGJwIAorOyBhcmczID0gbgorCit0ICAucmVnICVyMjIKK2IgIC5yZWcgJXIyMQorbCAgLnJlZyAlcjIwCisKK2JuX2FkZF93b3JkcworCS5wcm9jCisgICAgLmVudHJ5CisJLmNhbGxpbmZvCisJLkVYUE9SVAlibl9hZGRfd29yZHMsRU5UUlksUFJJVl9MRVY9MyxOT19SRUxPQ0FUSU9OLExPTkdfUkVUVVJOCisJLmFsaWduIDY0CisKKyAgICBDTVBJQiw+PSAwLG4sYm5fYWRkX3dvcmRzX2V4aXQKKyAgICBDT1BZICAgICVyMCwlcmV0MCAgICAgICAgICAgOyByZXR1cm4gMCBieSBkZWZhdWx0CisKKwk7CisJOyBJZiAyIG9yIG1vcmUgbnVtYmVycyBkbyB0aGUgbG9vcAorCTsKKwlDTVBJQiw9IDEsbixibl9hZGRfd29yZHNfc2luZ2xlX3RvcAorCU5PUAorCisJOworCTsgVGhpcyBsb29wIGlzIHVucm9sbGVkIDIgdGltZXMgKDY0LWJ5dGUgYWxpZ25lZCBhcyB3ZWxsKQorCTsKK2JuX2FkZF93b3Jkc191bnJvbGwyCisJTEREICAgICAwKGFfcHRyKSx0CisJTEREICAgICAwKGJfcHRyKSxiCisJQUREICAgICB0LCVyZXQwLHQgICAgICAgICAgICAgICAgICAgIDsgdCA9IHQrYzsKKwlBREQsREMgICVyMCwlcjAsJXJldDAgICAgICAgICAgICAgICAgOyBzZXQgYyB0byBjYXJyeQorCUFERCAgICAgdCxiLGwgICAgICAgICAgICAgICAgICAgICAgICA7IGwgPSB0ICsgYlswXQorCUFERCxEQyAgJXJldDAsJXIwLCVyZXQwICAgICAgICAgICAgICA7IGMrPSBjYXJyeQorCVNURCAgICAgbCwwKHJfcHRyKQorCisJTEREICAgICA4KGFfcHRyKSx0CisJTEREICAgICA4KGJfcHRyKSxiCisJQUREICAgICB0LCVyZXQwLHQgICAgICAgICAgICAgICAgICAgICA7IHQgPSB0K2M7CisJQURELERDICAlcjAsJXIwLCVyZXQwICAgICAgICAgICAgICAgICA7IHNldCBjIHRvIGNhcnJ5CisJQUREICAgICB0LGIsbCAgICAgICAgICAgICAgICAgICAgICAgICA7IGwgPSB0ICsgYlswXQorCUFERCxEQyAgJXJldDAsJXIwLCVyZXQwICAgICAgICAgICAgICAgOyBjKz0gY2FycnkKKwlTVEQgICAgIGwsOChyX3B0cikKKworCUxETyAgICAgLTIobiksbgorCUxETyAgICAgMTYoYV9wdHIpLGFfcHRyCisJTERPICAgICAxNihiX3B0ciksYl9wdHIKKworCUNNUElCLDw9IDIsbixibl9hZGRfd29yZHNfdW5yb2xsMgorCUxETyAgICAgMTYocl9wdHIpLHJfcHRyCisKKyAgICBDTVBJQiw9LE4gMCxuLGJuX2FkZF93b3Jkc19leGl0IDsgYXJlIHdlIGRvbmU/CisKK2JuX2FkZF93b3Jkc19zaW5nbGVfdG9wCisJTEREICAgICAwKGFfcHRyKSx0CisJTEREICAgICAwKGJfcHRyKSxiCisKKwlBREQgICAgIHQsJXJldDAsdCAgICAgICAgICAgICAgICAgOyB0ID0gdCtjOworCUFERCxEQyAgJXIwLCVyMCwlcmV0MCAgICAgICAgICAgICA7IHNldCBjIHRvIGNhcnJ5IChjb3VsZCB1c2UgQ01QQ0xSPz8pCisJQUREICAgICB0LGIsbCAgICAgICAgICAgICAgICAgICAgIDsgbCA9IHQgKyBiWzBdCisJQURELERDICAlcmV0MCwlcjAsJXJldDAgICAgICAgICAgIDsgYys9IGNhcnJ5CisJU1REICAgICBsLDAocl9wdHIpCisKK2JuX2FkZF93b3Jkc19leGl0CisgICAgLkVYSVQKKyAgICBCVkUgICAgICglcnApCisJTk9QCisJLlBST0NFTkQJO2luPTIzLDI0LDI1LDI2LDI5O291dD0yODsKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKztCTl9VTE9ORyBibl9zdWJfd29yZHMoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYiwgaW50IG4pCis7Cis7IGFyZzAgPSBycCAKKzsgYXJnMSA9IGFwCis7IGFyZzIgPSBicCAKKzsgYXJnMyA9IG4KKwordDEgICAgICAgLnJlZyAlcjIyCit0MiAgICAgICAucmVnICVyMjEKK3N1Yl90bXAxIC5yZWcgJXIyMAorc3ViX3RtcDIgLnJlZyAlcjE5CisKKworYm5fc3ViX3dvcmRzCisJLnByb2MKKwkuY2FsbGluZm8gCisJLkVYUE9SVAlibl9zdWJfd29yZHMsRU5UUlksUFJJVl9MRVY9MyxOT19SRUxPQ0FUSU9OLExPTkdfUkVUVVJOCisgICAgLmVudHJ5CisJLmFsaWduIDY0CisKKyAgICBDTVBJQiw+PSAgMCxuLGJuX3N1Yl93b3Jkc19leGl0CisgICAgQ09QWSAgICAlcjAsJXJldDAgICAgICAgICAgIDsgcmV0dXJuIDAgYnkgZGVmYXVsdAorCisJOworCTsgSWYgMiBvciBtb3JlIG51bWJlcnMgZG8gdGhlIGxvb3AKKwk7CisJQ01QSUIsPSAxLG4sYm5fc3ViX3dvcmRzX3NpbmdsZV90b3AKKwlOT1AKKworCTsKKwk7IFRoaXMgbG9vcCBpcyB1bnJvbGxlZCAyIHRpbWVzICg2NC1ieXRlIGFsaWduZWQgYXMgd2VsbCkKKwk7Citibl9zdWJfd29yZHNfdW5yb2xsMgorCUxERCAgICAgMChhX3B0ciksdDEKKwlMREQgICAgIDAoYl9wdHIpLHQyCisJU1VCICAgICB0MSx0MixzdWJfdG1wMSAgICAgICAgICAgOyB0MyA9IHQxLXQyOyAKKwlTVUIgICAgIHN1Yl90bXAxLCVyZXQwLHN1Yl90bXAxICA7IHQzID0gdDMtIGM7IAorCisJQ01QQ0xSLCo+PiB0MSx0MixzdWJfdG1wMiAgICAgICAgOyBjbGVhciBpZiB0MSA+IHQyCisJTERPICAgICAgMSglcjApLHN1Yl90bXAyCisJCisJQ01QQ0xSLCo9IHQxLHQyLCVyMAorCUNPUFkgICAgc3ViX3RtcDIsJXJldDAKKwlTVEQgICAgIHN1Yl90bXAxLDAocl9wdHIpCisKKwlMREQgICAgIDgoYV9wdHIpLHQxCisJTEREICAgICA4KGJfcHRyKSx0MgorCVNVQiAgICAgdDEsdDIsc3ViX3RtcDEgICAgICAgICAgICA7IHQzID0gdDEtdDI7IAorCVNVQiAgICAgc3ViX3RtcDEsJXJldDAsc3ViX3RtcDEgICA7IHQzID0gdDMtIGM7IAorCUNNUENMUiwqPj4gdDEsdDIsc3ViX3RtcDIgICAgICAgICA7IGNsZWFyIGlmIHQxID4gdDIKKwlMRE8gICAgICAxKCVyMCksc3ViX3RtcDIKKwkKKwlDTVBDTFIsKj0gdDEsdDIsJXIwCisJQ09QWSAgICBzdWJfdG1wMiwlcmV0MAorCVNURCAgICAgc3ViX3RtcDEsOChyX3B0cikKKworCUxETyAgICAgLTIobiksbgorCUxETyAgICAgMTYoYV9wdHIpLGFfcHRyCisJTERPICAgICAxNihiX3B0ciksYl9wdHIKKworCUNNUElCLDw9IDIsbixibl9zdWJfd29yZHNfdW5yb2xsMgorCUxETyAgICAgMTYocl9wdHIpLHJfcHRyCisKKyAgICBDTVBJQiw9LE4gMCxuLGJuX3N1Yl93b3Jkc19leGl0IDsgYXJlIHdlIGRvbmU/CisKK2JuX3N1Yl93b3Jkc19zaW5nbGVfdG9wCisJTEREICAgICAwKGFfcHRyKSx0MQorCUxERCAgICAgMChiX3B0ciksdDIKKwlTVUIgICAgIHQxLHQyLHN1Yl90bXAxICAgICAgICAgICAgOyB0MyA9IHQxLXQyOyAKKwlTVUIgICAgIHN1Yl90bXAxLCVyZXQwLHN1Yl90bXAxICAgOyB0MyA9IHQzLSBjOyAKKwlDTVBDTFIsKj4+IHQxLHQyLHN1Yl90bXAyICAgICAgICAgOyBjbGVhciBpZiB0MSA+IHQyCisJTERPICAgICAgMSglcjApLHN1Yl90bXAyCisJCisJQ01QQ0xSLCo9IHQxLHQyLCVyMAorCUNPUFkgICAgc3ViX3RtcDIsJXJldDAKKworCVNURCAgICAgc3ViX3RtcDEsMChyX3B0cikKKworYm5fc3ViX3dvcmRzX2V4aXQKKyAgICAuRVhJVAorICAgIEJWRSAgICAgKCVycCkKKwlOT1AKKwkuUFJPQ0VORAk7aW49MjMsMjQsMjUsMjYsMjk7b3V0PTI4OworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IHVuc2lnbmVkIGxvbmcgYm5fZGl2X3dvcmRzKHVuc2lnbmVkIGxvbmcgaCwgdW5zaWduZWQgbG9uZyBsLCB1bnNpZ25lZCBsb25nIGQpCis7Cis7IGFyZzAgPSBoCis7IGFyZzEgPSBsCis7IGFyZzIgPSBkCis7Cis7IFRoaXMgaXMgbWFpbmx5IGp1c3QgbW9kaWZpZWQgYXNzZW1ibHkgZnJvbSB0aGUgY29tcGlsZXIsIHRodXMgdGhlCis7IGxhY2sgb2YgdmFyaWFibGUgbmFtZXMuCis7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitibl9kaXZfd29yZHMKKwkucHJvYworCS5jYWxsaW5mbyBDQUxMRVIsRlJBTUU9MjcyLEVOVFJZX0dSPSVyMTAsU0FWRV9SUCxBUkdTX1NBVkVELE9SREVSSU5HX0FXQVJFCisJLkVYUE9SVAlibl9kaXZfd29yZHMsRU5UUlksUFJJVl9MRVY9MyxOT19SRUxPQ0FUSU9OLExPTkdfUkVUVVJOCisJLklNUE9SVAlCTl9udW1fYml0c193b3JkLENPREUsTk9fUkVMT0NBVElPTgorCS5JTVBPUlQJX19pb2IsREFUQQorCS5JTVBPUlQJZnByaW50ZixDT0RFLE5PX1JFTE9DQVRJT04KKwkuSU1QT1JUCWFib3J0LENPREUsTk9fUkVMT0NBVElPTgorCS5JTVBPUlQJJCRkaXYyVSxNSUxMSUNPREUKKyAgICAuZW50cnkKKyAgICBTVEQgICAgICVyMiwtMTYoJXIzMCkgICAKKyAgICBTVEQsTUEgICVyMywzNTIoJXIzMCkgICAKKyAgICBTVEQgICAgICVyNCwtMzQ0KCVyMzApICAKKyAgICBTVEQgICAgICVyNSwtMzM2KCVyMzApICAKKyAgICBTVEQgICAgICVyNiwtMzI4KCVyMzApICAKKyAgICBTVEQgICAgICVyNywtMzIwKCVyMzApICAKKyAgICBTVEQgICAgICVyOCwtMzEyKCVyMzApICAKKyAgICBTVEQgICAgICVyOSwtMzA0KCVyMzApICAKKyAgICBTVEQgICAgICVyMTAsLTI5NiglcjMwKQorCisgICAgU1REICAgICAlcjI3LC0yODgoJXIzMCkgICAgICAgICAgICAgOyBzYXZlIGdwCisKKyAgICBDT1BZICAgICVyMjQsJXIzICAgICAgICAgICA7IHNhdmUgZCAKKyAgICBDT1BZICAgICVyMjYsJXI0ICAgICAgICAgICA7IHNhdmUgaCAoaGlnaCA2NC1iaXRzKQorICAgIExETyAgICAgIC0xKCVyMCksJXJldDAgICAgIDsgcmV0dXJuIC0xIGJ5IGRlZmF1bHQJCisKKyAgICBDTVBCLCo9ICAlcjAsJWFyZzIsJEQzICAgICA7IGlmIChkID09IDApCisgICAgQ09QWSAgICAlcjI1LCVyNSAgICAgICAgICAgOyBzYXZlIGwgKGxvdyA2NC1iaXRzKQorCisgICAgTERPICAgICAtNDgoJXIzMCksJXIyOSAgICAgOyBjcmVhdGUgYXAgCisgICAgLkNBTEwgICA7aW49MjYsMjk7b3V0PTI4OworICAgIEIsTCAgICAgQk5fbnVtX2JpdHNfd29yZCwlcjIgCisgICAgQ09QWSAgICAlcjMsJXIyNiAgICAgICAgCisgICAgTEREICAgICAtMjg4KCVyMzApLCVyMjcgICAgOyByZXN0b3JlIGdwIAorICAgIExESSAgICAgNjQsJXIyMSAKKworICAgIENNUEIsPSAgJXIyMSwlcmV0MCwkMDAwMDAwMTIgICA7aWYgKGkgPT0gNjQpIChmb3J3YXJkKSAKKyAgICBDT1BZICAgICVyZXQwLCVyMjQgICAgICAgICAgICAgOyBpICAgCisgICAgTVRTQVJDTSAlcjI0ICAgIAorICAgIERFUERJLFogLTEsJXNhciwxLCVyMjkgIAorICAgIENNUEIsKjw8LE4gJXIyOSwlcjQsYm5fZGl2X2Vycl9jYXNlIDsgaWYgKGggPiAxPDxpKSAoZm9yd2FyZCkgCisKKyQwMDAwMDAxMgorICAgIFNVQkkgICAgNjQsJXIyNCwlcjMxICAgICAgICAgICAgICAgICAgICAgICA7IGkgPSA2NCAtIGk7CisgICAgQ01QQ0xSLCo8PCAlcjQsJXIzLCVyMCAgICAgICAgICAgICAgICAgICAgIDsgaWYgKGggPj0gZCkKKyAgICBTVUIgICAgICVyNCwlcjMsJXI0ICAgICAgICAgICAgICAgICAgICAgICAgOyBoIC09IGQKKyAgICBDTVBCLD0gICVyMzEsJXIwLCQwMDAwMDAxQSAgICAgICAgICAgICAgICAgOyBpZiAoaSkKKyAgICBDT1BZICAgICVyMCwlcjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgOyByZXQgPSAwCisgICAgTVRTQVJDTSAlcjMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaSB0byBzaGlmdAorICAgIERFUEQsWiAgJXIzLCVzYXIsNjQsJXIzICAgICAgICAgICAgICAgICAgICA7IGQgPDw9IGk7CisgICAgU1VCSSAgICA2NCwlcjMxLCVyMTkgICAgICAgICAgICAgICAgICAgICAgIDsgNjQgLSBpOyByZWR1bmRlbnQKKyAgICBNVFNBUiAgICVyMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyAoNjQgLWkpIHRvIHNoaWZ0CisgICAgU0hSUEQgICAlcjQsJXI1LCVzYXIsJXI0ICAgICAgICAgICAgICAgICAgIDsgbD4+ICg2NC1pKQorICAgIE1UU0FSQ00gJXIzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGkgdG8gc2hpZnQKKyAgICBERVBELFogICVyNSwlc2FyLDY0LCVyNSAgICAgICAgICAgICAgICAgICAgOyBsIDw8PSBpOworCiskMDAwMDAwMUEKKyAgICBERVBESSxaIC0xLDMxLDMyLCVyMTkgICAgICAgICAgICAgICAgICAgICAgCisgICAgRVhUUkQsVSAlcjMsMzEsMzIsJXI2ICAgICAgICAgICAgICAgICAgICAgIDsgZGg9KGQmMHhmZmYpPj4zMgorICAgIEVYVFJELFUgJXIzLDYzLDMyLCVyOCAgICAgICAgICAgICAgICAgICAgICA7IGRsID0gZCYweGZmZmZmZgorICAgIExETyAgICAgMiglcjApLCVyOQorICAgIFNURCAgICAlcjMsLTI4MCglcjMwKSAgICAgICAgICAgICAgICAgICAgICA7ICJkIiB0byBzdGFjaworCiskMDAwMDAwMUMKKyAgICBERVBESSxaIC0xLDYzLDMyLCVyMjkgICAgICAgICAgICAgICAgICAgICAgOyAKKyAgICBFWFRSRCxVICVyNCwzMSwzMiwlcjMxICAgICAgICAgICAgICAgICAgICAgOyBoID4+IDMyCisgICAgQ01QQiwqPSxOICAlcjMxLCVyNiwkRDIgICAgIAkgICAgICAgOyBpZiAoKGg+PjMyKSAhPSBkaCkoZm9yd2FyZCkgZGl2CisgICAgQ09QWSAgICAlcjQsJXIyNiAgICAgICAKKyAgICBFWFRSRCxVICVyNCwzMSwzMiwlcjI1IAorICAgIENPUFkgICAgJXI2LCVyMjQgICAgICAKKyAgICAuQ0FMTCAgIDtpbj0yMywyNCwyNSwyNjtvdXQ9MjAsMjEsMjIsMjgsMjk7IChNSUxMSUNBTEwpCisgICAgQixMICAgICAkJGRpdjJVLCVyMiAgICAgCisgICAgRVhUUkQsVSAlcjYsMzEsMzIsJXIyMyAgCisgICAgREVQRCAgICAlcjI4LDMxLDMyLCVyMjkgCiskRDIKKyAgICBTVEQgICAgICVyMjksLTI3MiglcjMwKSAgICAgICAgICAgICAgICAgICA7IHEKKyAgICBBTkQgICAgICVyNSwlcjE5LCVyMjQgICAgICAgICAgICAgICAgICAgOyB0ICYgMHhmZmZmZmZmZjAwMDAwMDAwOworICAgIEVYVFJELFUgJXIyNCwzMSwzMiwlcjI0ICAgICAgICAgICAgICAgICA7ID8/PyAKKyAgICBGTEREICAgIC0yNzIoJXIzMCksJWZyNyAgICAgICAgICAgICAgICAgOyBxCisgICAgRkxERCAgICAtMjgwKCVyMzApLCVmcjggICAgICAgICAgICAgICAgIDsgZAorICAgIFhNUFlVICAgJWZyOEwsJWZyN0wsJWZyMTAgIAorICAgIEZTVEQgICAgJWZyMTAsLTI1NiglcjMwKSAgIAorICAgIFhNUFlVICAgJWZyOEwsJWZyN1IsJWZyMjIgIAorICAgIEZTVEQgICAgJWZyMjIsLTI2NCglcjMwKSAgIAorICAgIFhNUFlVICAgJWZyOFIsJWZyN0wsJWZyMTEgCisgICAgWE1QWVUgICAlZnI4UiwlZnI3UiwlZnIyMworICAgIEZTVEQgICAgJWZyMTEsLTIzMiglcjMwKQorICAgIEZTVEQgICAgJWZyMjMsLTI0MCglcjMwKQorICAgIExERCAgICAgLTI1NiglcjMwKSwlcjI4CisgICAgREVQRCxaICAlcjI4LDMxLDMyLCVyMiAKKyAgICBMREQgICAgIC0yNjQoJXIzMCksJXIyMAorICAgIEFERCxMICAgJXIyMCwlcjIsJXIzMSAgIAorICAgIExERCAgICAgLTIzMiglcjMwKSwlcjIyIAorICAgIERFUEQsWiAgJXIyMiwzMSwzMiwlcjIyIAorICAgIExERCAgICAgLTI0MCglcjMwKSwlcjIxIAorICAgIEIgICAgICAgJDAwMDAwMDI0ICAgICAgIDsgZW50ZXIgbG9vcCAgCisgICAgQURELEwgICAlcjIxLCVyMjIsJXIyMyAKKworJDAwMDAwMDJBCisgICAgTERPICAgICAtMSglcjI5KSwlcjI5ICAgCisgICAgU1VCICAgICAlcjIzLCVyOCwlcjIzICAgCiskMDAwMDAwMjQKKyAgICBTVUIgICAgICVyNCwlcjMxLCVyMjUgICAKKyAgICBBTkQgICAgICVyMjUsJXIxOSwlcjI2ICAKKyAgICBDTVBCLCo8PixOICAgICAgJXIwLCVyMjYsJDAwMDAwMDQ2ICA7IChmb3J3YXJkKQorICAgIERFUEQsWiAgJXIyNSwzMSwzMiwlcjIwIAorICAgIE9SICAgICAgJXIyMCwlcjI0LCVyMjEgIAorICAgIENNUEIsKjw8LE4gICVyMjEsJXIyMywkMDAwMDAwMkEgOyhiYWNrd2FyZCkgCisgICAgU1VCICAgICAlcjMxLCVyNiwlcjMxICAgCis7LS0tLS0tLS0tLS0tLUJyZWFrIHBhdGgtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJDAwMDAwMDQ2CisgICAgREVQRCxaICAlcjIzLDMxLDMyLCVyMjUgICAgICAgICAgICAgIDt0bAorICAgIEVYVFJELFUgJXIyMywzMSwzMiwlcjI2ICAgICAgICAgICAgICA7dAorICAgIEFORCAgICAgJXIyNSwlcjE5LCVyMjQgICAgICAgICAgICAgICA7dGwgPSAodGw8PDMyKSYweGZmZmZmZmYwMDAwMDAwTAorICAgIEFERCxMICAgJXIzMSwlcjI2LCVyMzEgICAgICAgICAgICAgICA7dGggKz0gdDsgCisgICAgQ01QQ0xSLCo+Pj0gICAgICVyNSwlcjI0LCVyMCAgICAgICAgIDtpZiAobDx0bCkKKyAgICBMRE8gICAgIDEoJXIzMSksJXIzMSAgICAgICAgICAgICAgICAgOyB0aCsrOworICAgIENNUEIsKjw8PSxOICAgICAlcjMxLCVyNCwkMDAwMDAwMzYgICA7aWYgKG4gPCB0aCkgKGZvcndhcmQpCisgICAgTERPICAgICAtMSglcjI5KSwlcjI5ICAgICAgICAgICAgICAgIDtxLS07IAorICAgIEFERCxMICAgJXI0LCVyMywlcjQgICAgICAgICAgICAgICAgICA7aCArPSBkOworJDAwMDAwMDM2CisgICAgQURESUIsPSxOICAgICAgIC0xLCVyOSwkRDEgO2lmICgtLWNvdW50ID09IDApIGJyZWFrIChmb3J3YXJkKSAKKyAgICBTVUIgICAgICVyNSwlcjI0LCVyMjggICAgICAgICAgICAgICAgOyBsIC09IHRsOworICAgIFNVQiAgICAgJXI0LCVyMzEsJXIyNCAgICAgICAgICAgICAgICA7IGggLT0gdGg7CisgICAgU0hSUEQgICAlcjI0LCVyMjgsMzIsJXI0ICAgICAgICAgICAgIDsgaCA9ICgoaDw8MzIpfChsPj4zMikpOworICAgIERFUEQsWiAgJXIyOSwzMSwzMiwlcjEwICAgICAgICAgICAgICA7IHJldCA9IHE8PDMyCisgICAgYiAgICAgICQwMDAwMDAxQworICAgIERFUEQsWiAgJXIyOCwzMSwzMiwlcjUgICAgICAgICAgICAgICA7IGwgPSBsIDw8IDMyIAorCiskRDEKKyAgICBPUiAgICAgICVyMTAsJXIyOSwlcjI4ICAgICAgICAgICA7IHJldCB8PSBxCiskRDMKKyAgICBMREQgICAgIC0zNjgoJXIzMCksJXIyICAKKyREMAorICAgIExERCAgICAgLTI5NiglcjMwKSwlcjEwIAorICAgIExERCAgICAgLTMwNCglcjMwKSwlcjkgIAorICAgIExERCAgICAgLTMxMiglcjMwKSwlcjggIAorICAgIExERCAgICAgLTMyMCglcjMwKSwlcjcgIAorICAgIExERCAgICAgLTMyOCglcjMwKSwlcjYgIAorICAgIExERCAgICAgLTMzNiglcjMwKSwlcjUgIAorICAgIExERCAgICAgLTM0NCglcjMwKSwlcjQgIAorICAgIEJWRSAgICAgKCVyMikgICAKKyAgICAgICAgLkVYSVQKKyAgICBMREQsTUIgIC0zNTIoJXIzMCksJXIzIAorCitibl9kaXZfZXJyX2Nhc2UKKyAgICBNRklBICAgICVyNiAgICAgCisgICAgQURESUwgICBMJ2JuX2Rpdl93b3Jkcy1ibl9kaXZfZXJyX2Nhc2UsJXI2LCVyMSAKKyAgICBMRE8gICAgIFInYm5fZGl2X3dvcmRzLWJuX2Rpdl9lcnJfY2FzZSglcjEpLCVyNiAgCisgICAgQURESUwgICBMVCdfX2lvYiwlcjI3LCVyMSAgICAgICAKKyAgICBMREQgICAgIFJUJ19faW9iKCVyMSksJXIyNiAgICAgIAorICAgIEFERElMICAgTCdDJDQtYm5fZGl2X3dvcmRzLCVyNiwlcjEgICAgCisgICAgTERPICAgICBSJ0MkNC1ibl9kaXZfd29yZHMoJXIxKSwlcjI1ICAKKyAgICBMRE8gICAgIDY0KCVyMjYpLCVyMjYgICAKKyAgICAuQ0FMTCAgICAgICAgICAgO2luPTI0LDI1LDI2LDI5O291dD0yODsKKyAgICBCLEwgICAgIGZwcmludGYsJXIyICAgIAorICAgIExETyAgICAgLTQ4KCVyMzApLCVyMjkgCisgICAgTEREICAgICAtMjg4KCVyMzApLCVyMjcKKyAgICAuQ0FMTCAgICAgICAgICAgO2luPTI5OworICAgIEIsTCAgICAgYWJvcnQsJXIyICAgICAgCisgICAgTERPICAgICAtNDgoJXIzMCksJXIyOSAKKyAgICBMREQgICAgIC0yODgoJXIzMCksJXIyNworICAgIEIgICAgICAgJEQwICAgICAgICAgCisgICAgTEREICAgICAtMzY4KCVyMzApLCVyMiAgCisJLlBST0NFTkQJO2luPTI0LDI1LDI2LDI5O291dD0yODsKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgUmVnaXN0ZXJzIHRvIGhvbGQgNjQtYml0IHZhbHVlcyB0byBtYW5pcHVsYXRlLiAgVGhlICJMIiBwYXJ0Cis7IG9mIHRoZSByZWdpc3RlciBjb3JyZXNwb25kcyB0byB0aGUgdXBwZXIgMzItYml0cywgd2hpbGUgdGhlICJSIgorOyBwYXJ0IGNvcnJlc3BvbmRzIHRvIHRoZSBsb3dlciAzMi1iaXRzCis7IAorOyBOb3RlLCB0aGF0IHdoZW4gdXNpbmcgYjYgYW5kIGI3LCB0aGUgY29kZSBtdXN0IHNhdmUgdGhlc2UgYmVmb3JlCis7IHVzaW5nIHRoZW0gYmVjYXVzZSB0aGV5IGFyZSBjYWxsZWUgc2F2ZSByZWdpc3RlcnMgCis7IAorOworOyBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdG8gdXNlIHRvIHNhdmUgdmFsdWVzIHRoYXQKKzsgYXJlIG1hbmlwdWxhdGVkLiAgVGhlc2UgZG9uJ3QgY29sbGlkZSB3aXRoIGZ0ZW1wMS02IGFuZAorOyBhcmUgYWxsIGNhbGxlciBzYXZlIHJlZ2lzdGVycworOworYTAgICAgICAgIC5yZWcgJWZyMjIKK2EwTCAgICAgICAucmVnICVmcjIyTAorYTBSICAgICAgIC5yZWcgJWZyMjJSCisKK2ExICAgICAgICAucmVnICVmcjIzCithMUwgICAgICAgLnJlZyAlZnIyM0wKK2ExUiAgICAgICAucmVnICVmcjIzUgorCithMiAgICAgICAgLnJlZyAlZnIyNAorYTJMICAgICAgIC5yZWcgJWZyMjRMCithMlIgICAgICAgLnJlZyAlZnIyNFIKKworYTMgICAgICAgIC5yZWcgJWZyMjUKK2EzTCAgICAgICAucmVnICVmcjI1TAorYTNSICAgICAgIC5yZWcgJWZyMjVSCisKK2E0ICAgICAgICAucmVnICVmcjI2CithNEwgICAgICAgLnJlZyAlZnIyNkwKK2E0UiAgICAgICAucmVnICVmcjI2UgorCithNSAgICAgICAgLnJlZyAlZnIyNworYTVMICAgICAgIC5yZWcgJWZyMjdMCithNVIgICAgICAgLnJlZyAlZnIyN1IKKworYTYgICAgICAgIC5yZWcgJWZyMjgKK2E2TCAgICAgICAucmVnICVmcjI4TAorYTZSICAgICAgIC5yZWcgJWZyMjhSCisKK2E3ICAgICAgICAucmVnICVmcjI5CithN0wgICAgICAgLnJlZyAlZnIyOUwKK2E3UiAgICAgICAucmVnICVmcjI5UgorCitiMCAgICAgICAgLnJlZyAlZnIzMAorYjBMICAgICAgIC5yZWcgJWZyMzBMCitiMFIgICAgICAgLnJlZyAlZnIzMFIKKworYjEgICAgICAgIC5yZWcgJWZyMzEKK2IxTCAgICAgICAucmVnICVmcjMxTAorYjFSICAgICAgIC5yZWcgJWZyMzFSCisKKzsKKzsgVGVtcG9yYXJ5IGZsb2F0aW5nIHBvaW50IHZhcmlhYmxlcywgdGhlc2UgYXJlIGFsbCBjYWxsZXIgc2F2ZQorOyByZWdpc3RlcnMKKzsKK2Z0ZW1wMSAgICAucmVnICVmcjQKK2Z0ZW1wMiAgICAucmVnICVmcjUKK2Z0ZW1wMyAgICAucmVnICVmcjYKK2Z0ZW1wNCAgICAucmVnICVmcjcKKworOworOyBUaGUgQiBzZXQgb2YgcmVnaXN0ZXJzIHdoZW4gdXNlZC4KKzsKKworYjIgICAgICAgIC5yZWcgJWZyOAorYjJMICAgICAgIC5yZWcgJWZyOEwKK2IyUiAgICAgICAucmVnICVmcjhSCisKK2IzICAgICAgICAucmVnICVmcjkKK2IzTCAgICAgICAucmVnICVmcjlMCitiM1IgICAgICAgLnJlZyAlZnI5UgorCitiNCAgICAgICAgLnJlZyAlZnIxMAorYjRMICAgICAgIC5yZWcgJWZyMTBMCitiNFIgICAgICAgLnJlZyAlZnIxMFIKKworYjUgICAgICAgIC5yZWcgJWZyMTEKK2I1TCAgICAgICAucmVnICVmcjExTAorYjVSICAgICAgIC5yZWcgJWZyMTFSCisKK2I2ICAgICAgICAucmVnICVmcjEyCitiNkwgICAgICAgLnJlZyAlZnIxMkwKK2I2UiAgICAgICAucmVnICVmcjEyUgorCitiNyAgICAgICAgLnJlZyAlZnIxMworYjdMICAgICAgIC5yZWcgJWZyMTNMCitiN1IgICAgICAgLnJlZyAlZnIxM1IKKworYzEgICAgICAgICAgIC5yZWcgJXIyMSAgIDsgb25seSByZWcKK3RlbXAxICAgICAgICAucmVnICVyMjAgICA7IG9ubHkgcmVnCit0ZW1wMiAgICAgICAgLnJlZyAlcjE5ICAgOyBvbmx5IHJlZwordGVtcDMgICAgICAgIC5yZWcgJXIzMSAgIDsgb25seSByZWcKKworbTEgICAgICAgICAgIC5yZWcgJXIyOCAgIAorYzIgICAgICAgICAgIC5yZWcgJXIyMyAgIAoraGlnaF9vbmUgICAgIC5yZWcgJXIxCitodCAgICAgICAgICAgLnJlZyAlcjYKK2x0ICAgICAgICAgICAucmVnICVyNQorbSAgICAgICAgICAgIC5yZWcgJXI0CitjMyAgICAgICAgICAgLnJlZyAlcjMKKworU1FSX0FERF9DICAubWFjcm8gIEEwTCxBMFIsQzEsQzIsQzMKKyAgICBYTVBZVSAgIEEwTCxBMFIsZnRlbXAxICAgICAgIDsgbQorICAgIEZTVEQgICAgZnRlbXAxLC0yNCglc3ApICAgICAgOyBzdG9yZSBtCisKKyAgICBYTVBZVSAgIEEwUixBMFIsZnRlbXAyICAgICAgIDsgbHQKKyAgICBGU1REICAgIGZ0ZW1wMiwtMTYoJXNwKSAgICAgIDsgc3RvcmUgbHQKKworICAgIFhNUFlVICAgQTBMLEEwTCxmdGVtcDMgICAgICAgOyBodAorICAgIEZTVEQgICAgZnRlbXAzLC04KCVzcCkgICAgICAgOyBzdG9yZSBodAorCisgICAgTEREICAgICAtMjQoJXNwKSxtICAgICAgICAgICA7IGxvYWQgbQorICAgIEFORCAgICAgbSxoaWdoX21hc2ssdGVtcDIgICAgOyBtICYgTWFzaworICAgIERFUEQsWiAgbSwzMCwzMSx0ZW1wMyAgICAgICAgOyBtIDw8IDMyKzEKKyAgICBMREQgICAgIC0xNiglc3ApLGx0ICAgICAgICAgIDsgbHQKKworICAgIExERCAgICAgLTgoJXNwKSxodCAgICAgICAgICAgOyBodAorICAgIEVYVFJELFUgdGVtcDIsMzIsMzMsdGVtcDEgICAgOyB0ZW1wMSA9IG0mTWFzayA+PiAzMi0xCisgICAgQUREICAgICB0ZW1wMyxsdCxsdCAgICAgICAgICA7IGx0ID0gbHQrbQorICAgIEFERCxMICAgaHQsdGVtcDEsaHQgICAgICAgICAgOyBodCArPSB0ZW1wMQorICAgIEFERCxEQyAgaHQsJXIwLGh0ICAgICAgICAgICAgOyBodCsrCisKKyAgICBBREQgICAgIEMxLGx0LEMxICAgICAgICAgICAgIDsgYzE9YzErbHQKKyAgICBBREQsREMgIGh0LCVyMCxodCAgICAgICAgICAgIDsgaHQrKworCisgICAgQUREICAgICBDMixodCxDMiAgICAgICAgICAgICA7IGMyPWMyK2h0CisgICAgQURELERDICBDMywlcjAsQzMgICAgICAgICAgICA7IGMzKysKKy5lbmRtCisKK1NRUl9BRERfQzIgLm1hY3JvICBBMEwsQTBSLEExTCxBMVIsQzEsQzIsQzMKKyAgICBYTVBZVSAgIEEwTCxBMVIsZnRlbXAxICAgICAgICAgIDsgbTEgPSBibCpodAorICAgIEZTVEQgICAgZnRlbXAxLC0xNiglc3ApICAgICAgICAgOworICAgIFhNUFlVICAgQTBSLEExTCxmdGVtcDIgICAgICAgICAgOyBtID0gYmgqbHQKKyAgICBGU1REICAgIGZ0ZW1wMiwtOCglc3ApICAgICAgICAgIDsKKyAgICBYTVBZVSAgIEEwUixBMVIsZnRlbXAzICAgICAgICAgIDsgbHQgPSBibCpsdAorICAgIEZTVEQgICAgZnRlbXAzLC0zMiglc3ApCisgICAgWE1QWVUgICBBMEwsQTFMLGZ0ZW1wNCAgICAgICAgICA7IGh0ID0gYmgqaHQKKyAgICBGU1REICAgIGZ0ZW1wNCwtMjQoJXNwKSAgICAgICAgIDsKKworICAgIExERCAgICAgLTgoJXNwKSxtICAgICAgICAgICAgICAgOyByMjEgPSBtCisgICAgTEREICAgICAtMTYoJXNwKSxtMSAgICAgICAgICAgICA7IHIxOSA9IG0xCisgICAgQURELEwgICBtLG0xLG0gICAgICAgICAgICAgICAgICA7IG0rbTEKKworICAgIERFUEQsWiAgbSwzMSwzMix0ZW1wMyAgICAgICAgICAgOyAobSttMTw8MzIpCisgICAgTEREICAgICAtMjQoJXNwKSxodCAgICAgICAgICAgICA7IHIyNCA9IGh0CisKKyAgICBDTVBDTFIsKj4+PSBtLG0xLCVyMCAgICAgICAgICAgIDsgaWYgKG0gPCBtMSkKKyAgICBBREQsTCAgIGh0LGhpZ2hfb25lLGh0ICAgICAgICAgIDsgaHQrPWhpZ2hfb25lCisKKyAgICBFWFRSRCxVIG0sMzEsMzIsdGVtcDEgICAgICAgICAgIDsgbSA+PiAzMgorICAgIExERCAgICAgLTMyKCVzcCksbHQgICAgICAgICAgICAgOyBsdAorICAgIEFERCxMICAgaHQsdGVtcDEsaHQgICAgICAgICAgICAgOyBodCs9IG0+PjMyCisgICAgQUREICAgICBsdCx0ZW1wMyxsdCAgICAgICAgICAgICA7IGx0ID0gbHQrbTEKKyAgICBBREQsREMgIGh0LCVyMCxodCAgICAgICAgICAgICAgIDsgaHQrKworCisgICAgQUREICAgICBodCxodCxodCAgICAgICAgICAgICAgICA7IGh0PWh0K2h0OworICAgIEFERCxEQyAgQzMsJXIwLEMzICAgICAgICAgICAgICAgOyBhZGQgaW4gY2FycnkgKGMzKyspCisKKyAgICBBREQgICAgIGx0LGx0LGx0ICAgICAgICAgICAgICAgIDsgbHQ9bHQrbHQ7CisgICAgQURELERDICBodCwlcjAsaHQgICAgICAgICAgICAgICA7IGFkZCBpbiBjYXJyeSAoaHQrKykKKworICAgIEFERCAgICAgQzEsbHQsQzEgICAgICAgICAgICAgICAgOyBjMT1jMStsdAorICAgIEFERCxEQywqTlVWIGh0LCVyMCxodCAgICAgICAgICAgOyBhZGQgaW4gY2FycnkgKGh0KyspCisgICAgTERPICAgICAxKEMzKSxDMyAgICAgICAgICAgICAgOyBidW1wIGMzIGlmIG92ZXJmbG93LG51bGxpZnkgb3RoZXJ3aXNlCisKKyAgICBBREQgICAgIEMyLGh0LEMyICAgICAgICAgICAgICAgIDsgYzIgPSBjMiArIGh0CisgICAgQURELERDICBDMywlcjAsQzMgICAgICAgICAgICAgOyBhZGQgaW4gY2FycnkgKGMzKyspCisuZW5kbQorCis7Cis7dm9pZCBibl9zcXJfY29tYmE4KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSkKKzsgYXJnMCA9IHJfcHRyCis7IGFyZzEgPSBhX3B0cgorOworCitibl9zcXJfY29tYmE4CisJLlBST0MKKwkuQ0FMTElORk8gRlJBTUU9MTI4LEVOVFJZX0dSPSVyMyxBUkdTX1NBVkVELE9SREVSSU5HX0FXQVJFCisJLkVYUE9SVAlibl9zcXJfY29tYmE4LEVOVFJZLFBSSVZfTEVWPTMsTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorICAgIC5FTlRSWQorCS5hbGlnbiA2NAorCisgICAgU1REICAgICAlcjMsMCglc3ApICAgICAgICAgIDsgc2F2ZSByMworICAgIFNURCAgICAgJXI0LDgoJXNwKSAgICAgICAgICA7IHNhdmUgcjQKKyAgICBTVEQgICAgICVyNSwxNiglc3ApICAgICAgICAgOyBzYXZlIHI1CisgICAgU1REICAgICAlcjYsMjQoJXNwKSAgICAgICAgIDsgc2F2ZSByNgorCisJOworCTsgWmVybyBvdXQgY2FycmllcworCTsKKwlDT1BZICAgICAlcjAsYzEKKwlDT1BZICAgICAlcjAsYzIKKwlDT1BZICAgICAlcjAsYzMKKworCUxETyAgICAgIDEyOCglc3ApLCVzcCAgICAgICA7IGJ1bXAgc3RhY2sKKyAgICBERVBESSxaIC0xLDMyLDMzLGhpZ2hfbWFzayAgIDsgQ3JlYXRlIE1hc2sgMHhmZmZmZmZmZjgwMDAwMDAwTAorICAgIERFUERJLFogIDEsMzEsMSxoaWdoX29uZSAgICAgOyBDcmVhdGUgVmFsdWUgIDEgPDwgMzIKKworCTsKKwk7IExvYWQgdXAgYWxsIG9mIHRoZSB2YWx1ZXMgd2UgYXJlIGdvaW5nIHRvIHVzZQorCTsKKyAgICBGTEREICAgICAwKGFfcHRyKSxhMCAgICAgICAKKyAgICBGTEREICAgICA4KGFfcHRyKSxhMSAgICAgICAKKyAgICBGTEREICAgIDE2KGFfcHRyKSxhMiAgICAgICAKKyAgICBGTEREICAgIDI0KGFfcHRyKSxhMyAgICAgICAKKyAgICBGTEREICAgIDMyKGFfcHRyKSxhNCAgICAgICAKKyAgICBGTEREICAgIDQwKGFfcHRyKSxhNSAgICAgICAKKyAgICBGTEREICAgIDQ4KGFfcHRyKSxhNiAgICAgICAKKyAgICBGTEREICAgIDU2KGFfcHRyKSxhNyAgICAgICAKKworCVNRUl9BRERfQyBhMEwsYTBSLGMxLGMyLGMzCisJU1REICAgICBjMSwwKHJfcHRyKSAgICAgICAgICA7IHJbMF0gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DMiBhMUwsYTFSLGEwTCxhMFIsYzIsYzMsYzEKKwlTVEQgICAgIGMyLDgocl9wdHIpICAgICAgICAgIDsgclsxXSA9IGMyOworCUNPUFkgICAgJXIwLGMyCisKKwlTUVJfQUREX0MgYTFMLGExUixjMyxjMSxjMgorCVNRUl9BRERfQzIgYTJMLGEyUixhMEwsYTBSLGMzLGMxLGMyCisJU1REICAgICBjMywxNihyX3B0cikgICAgICAgICAgICA7IHJbMl0gPSBjMzsKKwlDT1BZICAgICVyMCxjMworCisJU1FSX0FERF9DMiBhM0wsYTNSLGEwTCxhMFIsYzEsYzIsYzMKKwlTUVJfQUREX0MyIGEyTCxhMlIsYTFMLGExUixjMSxjMixjMworCVNURCAgICAgYzEsMjQocl9wdHIpICAgICAgICAgICA7IHJbM10gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DIGEyTCxhMlIsYzIsYzMsYzEKKwlTUVJfQUREX0MyIGEzTCxhM1IsYTFMLGExUixjMixjMyxjMQorCVNRUl9BRERfQzIgYTRMLGE0UixhMEwsYTBSLGMyLGMzLGMxCisJU1REICAgICBjMiwzMihyX3B0cikgICAgICAgICAgOyByWzRdID0gYzI7CisJQ09QWSAgICAlcjAsYzIKKworCVNRUl9BRERfQzIgYTVMLGE1UixhMEwsYTBSLGMzLGMxLGMyCisJU1FSX0FERF9DMiBhNEwsYTRSLGExTCxhMVIsYzMsYzEsYzIKKwlTUVJfQUREX0MyIGEzTCxhM1IsYTJMLGEyUixjMyxjMSxjMgorCVNURCAgICAgYzMsNDAocl9wdHIpICAgICAgICAgIDsgcls1XSA9IGMzOworCUNPUFkgICAgJXIwLGMzCisKKwlTUVJfQUREX0MgYTNMLGEzUixjMSxjMixjMworCVNRUl9BRERfQzIgYTRMLGE0UixhMkwsYTJSLGMxLGMyLGMzCisJU1FSX0FERF9DMiBhNUwsYTVSLGExTCxhMVIsYzEsYzIsYzMKKwlTUVJfQUREX0MyIGE2TCxhNlIsYTBMLGEwUixjMSxjMixjMworCVNURCAgICAgYzEsNDgocl9wdHIpICAgICAgICAgIDsgcls2XSA9IGMxOworCUNPUFkgICAgJXIwLGMxCisKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTBMLGEwUixjMixjMyxjMQorCVNRUl9BRERfQzIgYTZMLGE2UixhMUwsYTFSLGMyLGMzLGMxCisJU1FSX0FERF9DMiBhNUwsYTVSLGEyTCxhMlIsYzIsYzMsYzEKKwlTUVJfQUREX0MyIGE0TCxhNFIsYTNMLGEzUixjMixjMyxjMQorCVNURCAgICAgYzIsNTYocl9wdHIpICAgICAgICAgIDsgcls3XSA9IGMyOworCUNPUFkgICAgJXIwLGMyCisKKwlTUVJfQUREX0MgYTRMLGE0UixjMyxjMSxjMgorCVNRUl9BRERfQzIgYTVMLGE1UixhM0wsYTNSLGMzLGMxLGMyCisJU1FSX0FERF9DMiBhNkwsYTZSLGEyTCxhMlIsYzMsYzEsYzIKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTFMLGExUixjMyxjMSxjMgorCVNURCAgICAgYzMsNjQocl9wdHIpICAgICAgICAgIDsgcls4XSA9IGMzOworCUNPUFkgICAgJXIwLGMzCisKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTJMLGEyUixjMSxjMixjMworCVNRUl9BRERfQzIgYTZMLGE2UixhM0wsYTNSLGMxLGMyLGMzCisJU1FSX0FERF9DMiBhNUwsYTVSLGE0TCxhNFIsYzEsYzIsYzMKKwlTVEQgICAgIGMxLDcyKHJfcHRyKSAgICAgICAgICA7IHJbOV0gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DIGE1TCxhNVIsYzIsYzMsYzEKKwlTUVJfQUREX0MyIGE2TCxhNlIsYTRMLGE0UixjMixjMyxjMQorCVNRUl9BRERfQzIgYTdMLGE3UixhM0wsYTNSLGMyLGMzLGMxCisJU1REICAgICBjMiw4MChyX3B0cikgICAgICAgICAgOyByWzEwXSA9IGMyOworCUNPUFkgICAgJXIwLGMyCisKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTRMLGE0UixjMyxjMSxjMgorCVNRUl9BRERfQzIgYTZMLGE2UixhNUwsYTVSLGMzLGMxLGMyCisJU1REICAgICBjMyw4OChyX3B0cikgICAgICAgICAgOyByWzExXSA9IGMzOworCUNPUFkgICAgJXIwLGMzCisJCisJU1FSX0FERF9DIGE2TCxhNlIsYzEsYzIsYzMKKwlTUVJfQUREX0MyIGE3TCxhN1IsYTVMLGE1UixjMSxjMixjMworCVNURCAgICAgYzEsOTYocl9wdHIpICAgICAgICAgIDsgclsxMl0gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DMiBhN0wsYTdSLGE2TCxhNlIsYzIsYzMsYzEKKwlTVEQgICAgIGMyLDEwNChyX3B0cikgICAgICAgICA7IHJbMTNdID0gYzI7CisJQ09QWSAgICAlcjAsYzIKKworCVNRUl9BRERfQyBhN0wsYTdSLGMzLGMxLGMyCisJU1REICAgICBjMywgMTEyKHJfcHRyKSAgICAgICA7IHJbMTRdID0gYzMKKwlTVEQgICAgIGMxLCAxMjAocl9wdHIpICAgICAgIDsgclsxNV0gPSBjMQorCisgICAgLkVYSVQKKyAgICBMREQgICAgIC0xMDQoJXNwKSwlcjYgICAgICAgIDsgcmVzdG9yZSByNgorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgOyByZXN0b3JlIHI1CisgICAgTEREICAgICAtMTIwKCVzcCksJXI0ICAgICAgICA7IHJlc3RvcmUgcjQKKyAgICBCVkUgICAgICglcnApCisgICAgTERELE1CICAtMTI4KCVzcCksJXIzCisKKwkuUFJPQ0VORAkKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7dm9pZCBibl9zcXJfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSkKKzsgYXJnMCA9IHJfcHRyCis7IGFyZzEgPSBhX3B0cgorOworCitibl9zcXJfY29tYmE0CisJLnByb2MKKwkuY2FsbGluZm8gRlJBTUU9MTI4LEVOVFJZX0dSPSVyMyxBUkdTX1NBVkVELE9SREVSSU5HX0FXQVJFCisJLkVYUE9SVAlibl9zcXJfY29tYmE0LEVOVFJZLFBSSVZfTEVWPTMsTk9fUkVMT0NBVElPTixMT05HX1JFVFVSTgorICAgIC5lbnRyeQorCS5hbGlnbiA2NAorICAgIFNURCAgICAgJXIzLDAoJXNwKSAgICAgICAgICA7IHNhdmUgcjMKKyAgICBTVEQgICAgICVyNCw4KCVzcCkgICAgICAgICAgOyBzYXZlIHI0CisgICAgU1REICAgICAlcjUsMTYoJXNwKSAgICAgICAgIDsgc2F2ZSByNQorICAgIFNURCAgICAgJXI2LDI0KCVzcCkgICAgICAgICA7IHNhdmUgcjYKKworCTsKKwk7IFplcm8gb3V0IGNhcnJpZXMKKwk7CisJQ09QWSAgICAgJXIwLGMxCisJQ09QWSAgICAgJXIwLGMyCisJQ09QWSAgICAgJXIwLGMzCisKKwlMRE8gICAgICAxMjgoJXNwKSwlc3AgICAgICAgOyBidW1wIHN0YWNrCisgICAgREVQREksWiAtMSwzMiwzMyxoaWdoX21hc2sgICA7IENyZWF0ZSBNYXNrIDB4ZmZmZmZmZmY4MDAwMDAwMEwKKyAgICBERVBESSxaICAxLDMxLDEsaGlnaF9vbmUgICAgIDsgQ3JlYXRlIFZhbHVlICAxIDw8IDMyCisKKwk7CisJOyBMb2FkIHVwIGFsbCBvZiB0aGUgdmFsdWVzIHdlIGFyZSBnb2luZyB0byB1c2UKKwk7CisgICAgRkxERCAgICAgMChhX3B0ciksYTAgICAgICAgCisgICAgRkxERCAgICAgOChhX3B0ciksYTEgICAgICAgCisgICAgRkxERCAgICAxNihhX3B0ciksYTIgICAgICAgCisgICAgRkxERCAgICAyNChhX3B0ciksYTMgICAgICAgCisgICAgRkxERCAgICAzMihhX3B0ciksYTQgICAgICAgCisgICAgRkxERCAgICA0MChhX3B0ciksYTUgICAgICAgCisgICAgRkxERCAgICA0OChhX3B0ciksYTYgICAgICAgCisgICAgRkxERCAgICA1NihhX3B0ciksYTcgICAgICAgCisKKwlTUVJfQUREX0MgYTBMLGEwUixjMSxjMixjMworCisJU1REICAgICBjMSwwKHJfcHRyKSAgICAgICAgICA7IHJbMF0gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DMiBhMUwsYTFSLGEwTCxhMFIsYzIsYzMsYzEKKworCVNURCAgICAgYzIsOChyX3B0cikgICAgICAgICAgOyByWzFdID0gYzI7CisJQ09QWSAgICAlcjAsYzIKKworCVNRUl9BRERfQyBhMUwsYTFSLGMzLGMxLGMyCisJU1FSX0FERF9DMiBhMkwsYTJSLGEwTCxhMFIsYzMsYzEsYzIKKworCVNURCAgICAgYzMsMTYocl9wdHIpICAgICAgICAgICAgOyByWzJdID0gYzM7CisJQ09QWSAgICAlcjAsYzMKKworCVNRUl9BRERfQzIgYTNMLGEzUixhMEwsYTBSLGMxLGMyLGMzCisJU1FSX0FERF9DMiBhMkwsYTJSLGExTCxhMVIsYzEsYzIsYzMKKworCVNURCAgICAgYzEsMjQocl9wdHIpICAgICAgICAgICA7IHJbM10gPSBjMTsKKwlDT1BZICAgICVyMCxjMQorCisJU1FSX0FERF9DIGEyTCxhMlIsYzIsYzMsYzEKKwlTUVJfQUREX0MyIGEzTCxhM1IsYTFMLGExUixjMixjMyxjMQorCisJU1REICAgICBjMiwzMihyX3B0cikgICAgICAgICAgIDsgcls0XSA9IGMyOworCUNPUFkgICAgJXIwLGMyCisKKwlTUVJfQUREX0MyIGEzTCxhM1IsYTJMLGEyUixjMyxjMSxjMgorCVNURCAgICAgYzMsNDAocl9wdHIpICAgICAgICAgICA7IHJbNV0gPSBjMzsKKwlDT1BZICAgICVyMCxjMworCisJU1FSX0FERF9DIGEzTCxhM1IsYzEsYzIsYzMKKwlTVEQgICAgIGMxLDQ4KHJfcHRyKSAgICAgICAgICAgOyByWzZdID0gYzE7CisJU1REICAgICBjMiw1NihyX3B0cikgICAgICAgICAgIDsgcls3XSA9IGMyOworCisgICAgLkVYSVQKKyAgICBMREQgICAgIC0xMDQoJXNwKSwlcjYgICAgICAgIDsgcmVzdG9yZSByNgorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgOyByZXN0b3JlIHI1CisgICAgTEREICAgICAtMTIwKCVzcCksJXI0ICAgICAgICA7IHJlc3RvcmUgcjQKKyAgICBCVkUgICAgICglcnApCisgICAgTERELE1CICAtMTI4KCVzcCksJXIzCisKKwkuUFJPQ0VORAkKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01VTF9BRERfQyAgLm1hY3JvICBBMEwsQTBSLEIwTCxCMFIsQzEsQzIsQzMKKyAgICBYTVBZVSAgIEEwTCxCMFIsZnRlbXAxICAgICAgICA7IG0xID0gYmwqaHQKKyAgICBGU1REICAgIGZ0ZW1wMSwtMTYoJXNwKSAgICAgICA7CisgICAgWE1QWVUgICBBMFIsQjBMLGZ0ZW1wMiAgICAgICAgOyBtID0gYmgqbHQKKyAgICBGU1REICAgIGZ0ZW1wMiwtOCglc3ApICAgICAgICA7CisgICAgWE1QWVUgICBBMFIsQjBSLGZ0ZW1wMyAgICAgICAgOyBsdCA9IGJsKmx0CisgICAgRlNURCAgICBmdGVtcDMsLTMyKCVzcCkKKyAgICBYTVBZVSAgIEEwTCxCMEwsZnRlbXA0ICAgICAgICA7IGh0ID0gYmgqaHQKKyAgICBGU1REICAgIGZ0ZW1wNCwtMjQoJXNwKSAgICAgICA7CisKKyAgICBMREQgICAgIC04KCVzcCksbSAgICAgICAgICAgICA7IHIyMSA9IG0KKyAgICBMREQgICAgIC0xNiglc3ApLG0xICAgICAgICAgICA7IHIxOSA9IG0xCisgICAgQURELEwgICBtLG0xLG0gICAgICAgICAgICAgICAgOyBtK20xCisKKyAgICBERVBELFogIG0sMzEsMzIsdGVtcDMgICAgICAgICA7IChtK20xPDwzMikKKyAgICBMREQgICAgIC0yNCglc3ApLGh0ICAgICAgICAgICA7IHIyNCA9IGh0CisKKyAgICBDTVBDTFIsKj4+PSBtLG0xLCVyMCAgICAgICAgICA7IGlmIChtIDwgbTEpCisgICAgQURELEwgICBodCxoaWdoX29uZSxodCAgICAgICAgOyBodCs9aGlnaF9vbmUKKworICAgIEVYVFJELFUgbSwzMSwzMix0ZW1wMSAgICAgICAgIDsgbSA+PiAzMgorICAgIExERCAgICAgLTMyKCVzcCksbHQgICAgICAgICAgIDsgbHQKKyAgICBBREQsTCAgIGh0LHRlbXAxLGh0ICAgICAgICAgICA7IGh0Kz0gbT4+MzIKKyAgICBBREQgICAgIGx0LHRlbXAzLGx0ICAgICAgICAgICA7IGx0ID0gbHQrbTEKKyAgICBBREQsREMgIGh0LCVyMCxodCAgICAgICAgICAgICA7IGh0KysKKworICAgIEFERCAgICAgQzEsbHQsQzEgICAgICAgICAgICAgIDsgYzE9YzErbHQKKyAgICBBREQsREMgIGh0LCVyMCxodCAgICAgICAgICAgICA7IGJ1bXAgYzMgaWYgb3ZlcmZsb3csbnVsbGlmeSBvdGhlcndpc2UKKworICAgIEFERCAgICAgQzIsaHQsQzIgICAgICAgICAgICAgIDsgYzIgPSBjMiArIGh0CisgICAgQURELERDICBDMywlcjAsQzMgICAgICAgICAgICAgOyBhZGQgaW4gY2FycnkgKGMzKyspCisuZW5kbQorCisKKzsKKzt2b2lkIGJuX211bF9jb21iYTgoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikKKzsgYXJnMCA9IHJfcHRyCis7IGFyZzEgPSBhX3B0cgorOyBhcmcyID0gYl9wdHIKKzsKKworYm5fbXVsX2NvbWJhOAorCS5wcm9jCisJLmNhbGxpbmZvIEZSQU1FPTEyOCxFTlRSWV9HUj0lcjMsQVJHU19TQVZFRCxPUkRFUklOR19BV0FSRQorCS5FWFBPUlQJYm5fbXVsX2NvbWJhOCxFTlRSWSxQUklWX0xFVj0zLE5PX1JFTE9DQVRJT04sTE9OR19SRVRVUk4KKyAgICAuZW50cnkKKwkuYWxpZ24gNjQKKworICAgIFNURCAgICAgJXIzLDAoJXNwKSAgICAgICAgICA7IHNhdmUgcjMKKyAgICBTVEQgICAgICVyNCw4KCVzcCkgICAgICAgICAgOyBzYXZlIHI0CisgICAgU1REICAgICAlcjUsMTYoJXNwKSAgICAgICAgIDsgc2F2ZSByNQorICAgIFNURCAgICAgJXI2LDI0KCVzcCkgICAgICAgICA7IHNhdmUgcjYKKyAgICBGU1REICAgICVmcjEyLDMyKCVzcCkgICAgICAgOyBzYXZlIHI2CisgICAgRlNURCAgICAlZnIxMyw0MCglc3ApICAgICAgIDsgc2F2ZSByNworCisJOworCTsgWmVybyBvdXQgY2FycmllcworCTsKKwlDT1BZICAgICAlcjAsYzEKKwlDT1BZICAgICAlcjAsYzIKKwlDT1BZICAgICAlcjAsYzMKKworCUxETyAgICAgIDEyOCglc3ApLCVzcCAgICAgICA7IGJ1bXAgc3RhY2sKKyAgICBERVBESSxaICAxLDMxLDEsaGlnaF9vbmUgICAgIDsgQ3JlYXRlIFZhbHVlICAxIDw8IDMyCisKKwk7CisJOyBMb2FkIHVwIGFsbCBvZiB0aGUgdmFsdWVzIHdlIGFyZSBnb2luZyB0byB1c2UKKwk7CisgICAgRkxERCAgICAgIDAoYV9wdHIpLGEwICAgICAgIAorICAgIEZMREQgICAgICA4KGFfcHRyKSxhMSAgICAgICAKKyAgICBGTEREICAgICAxNihhX3B0ciksYTIgICAgICAgCisgICAgRkxERCAgICAgMjQoYV9wdHIpLGEzICAgICAgIAorICAgIEZMREQgICAgIDMyKGFfcHRyKSxhNCAgICAgICAKKyAgICBGTEREICAgICA0MChhX3B0ciksYTUgICAgICAgCisgICAgRkxERCAgICAgNDgoYV9wdHIpLGE2ICAgICAgIAorICAgIEZMREQgICAgIDU2KGFfcHRyKSxhNyAgICAgICAKKworICAgIEZMREQgICAgICAwKGJfcHRyKSxiMCAgICAgICAKKyAgICBGTEREICAgICAgOChiX3B0ciksYjEgICAgICAgCisgICAgRkxERCAgICAgMTYoYl9wdHIpLGIyICAgICAgIAorICAgIEZMREQgICAgIDI0KGJfcHRyKSxiMyAgICAgICAKKyAgICBGTEREICAgICAzMihiX3B0ciksYjQgICAgICAgCisgICAgRkxERCAgICAgNDAoYl9wdHIpLGI1ICAgICAgIAorICAgIEZMREQgICAgIDQ4KGJfcHRyKSxiNiAgICAgICAKKyAgICBGTEREICAgICA1NihiX3B0ciksYjcgICAgICAgCisKKwlNVUxfQUREX0MgYTBMLGEwUixiMEwsYjBSLGMxLGMyLGMzCisJU1REICAgICAgIGMxLDAocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMQorCisJTVVMX0FERF9DIGEwTCxhMFIsYjFMLGIxUixjMixjMyxjMQorCU1VTF9BRERfQyBhMUwsYTFSLGIwTCxiMFIsYzIsYzMsYzEKKwlTVEQgICAgICAgYzIsOChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMyCisKKwlNVUxfQUREX0MgYTJMLGEyUixiMEwsYjBSLGMzLGMxLGMyCisJTVVMX0FERF9DIGExTCxhMVIsYjFMLGIxUixjMyxjMSxjMgorCU1VTF9BRERfQyBhMEwsYTBSLGIyTCxiMlIsYzMsYzEsYzIKKwlTVEQgICAgICAgYzMsMTYocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMworCisJTVVMX0FERF9DIGEwTCxhMFIsYjNMLGIzUixjMSxjMixjMworCU1VTF9BRERfQyBhMUwsYTFSLGIyTCxiMlIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTJMLGEyUixiMUwsYjFSLGMxLGMyLGMzCisJTVVMX0FERF9DIGEzTCxhM1IsYjBMLGIwUixjMSxjMixjMworCVNURCAgICAgICBjMSwyNChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMxCisKKwlNVUxfQUREX0MgYTRMLGE0UixiMEwsYjBSLGMyLGMzLGMxCisJTVVMX0FERF9DIGEzTCxhM1IsYjFMLGIxUixjMixjMyxjMQorCU1VTF9BRERfQyBhMkwsYTJSLGIyTCxiMlIsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTFMLGExUixiM0wsYjNSLGMyLGMzLGMxCisJTVVMX0FERF9DIGEwTCxhMFIsYjRMLGI0UixjMixjMyxjMQorCVNURCAgICAgICBjMiwzMihyX3B0cikKKwlDT1BZICAgICAgJXIwLGMyCisKKwlNVUxfQUREX0MgYTBMLGEwUixiNUwsYjVSLGMzLGMxLGMyCisJTVVMX0FERF9DIGExTCxhMVIsYjRMLGI0UixjMyxjMSxjMgorCU1VTF9BRERfQyBhMkwsYTJSLGIzTCxiM1IsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTNMLGEzUixiMkwsYjJSLGMzLGMxLGMyCisJTVVMX0FERF9DIGE0TCxhNFIsYjFMLGIxUixjMyxjMSxjMgorCU1VTF9BRERfQyBhNUwsYTVSLGIwTCxiMFIsYzMsYzEsYzIKKwlTVEQgICAgICAgYzMsNDAocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMworCisJTVVMX0FERF9DIGE2TCxhNlIsYjBMLGIwUixjMSxjMixjMworCU1VTF9BRERfQyBhNUwsYTVSLGIxTCxiMVIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTRMLGE0UixiMkwsYjJSLGMxLGMyLGMzCisJTVVMX0FERF9DIGEzTCxhM1IsYjNMLGIzUixjMSxjMixjMworCU1VTF9BRERfQyBhMkwsYTJSLGI0TCxiNFIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTFMLGExUixiNUwsYjVSLGMxLGMyLGMzCisJTVVMX0FERF9DIGEwTCxhMFIsYjZMLGI2UixjMSxjMixjMworCVNURCAgICAgICBjMSw0OChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMxCisJCisJTVVMX0FERF9DIGEwTCxhMFIsYjdMLGI3UixjMixjMyxjMQorCU1VTF9BRERfQyBhMUwsYTFSLGI2TCxiNlIsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTJMLGEyUixiNUwsYjVSLGMyLGMzLGMxCisJTVVMX0FERF9DIGEzTCxhM1IsYjRMLGI0UixjMixjMyxjMQorCU1VTF9BRERfQyBhNEwsYTRSLGIzTCxiM1IsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTVMLGE1UixiMkwsYjJSLGMyLGMzLGMxCisJTVVMX0FERF9DIGE2TCxhNlIsYjFMLGIxUixjMixjMyxjMQorCU1VTF9BRERfQyBhN0wsYTdSLGIwTCxiMFIsYzIsYzMsYzEKKwlTVEQgICAgICAgYzIsNTYocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMgorCisJTVVMX0FERF9DIGE3TCxhN1IsYjFMLGIxUixjMyxjMSxjMgorCU1VTF9BRERfQyBhNkwsYTZSLGIyTCxiMlIsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTVMLGE1UixiM0wsYjNSLGMzLGMxLGMyCisJTVVMX0FERF9DIGE0TCxhNFIsYjRMLGI0UixjMyxjMSxjMgorCU1VTF9BRERfQyBhM0wsYTNSLGI1TCxiNVIsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTJMLGEyUixiNkwsYjZSLGMzLGMxLGMyCisJTVVMX0FERF9DIGExTCxhMVIsYjdMLGI3UixjMyxjMSxjMgorCVNURCAgICAgICBjMyw2NChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMzCisKKwlNVUxfQUREX0MgYTJMLGEyUixiN0wsYjdSLGMxLGMyLGMzCisJTVVMX0FERF9DIGEzTCxhM1IsYjZMLGI2UixjMSxjMixjMworCU1VTF9BRERfQyBhNEwsYTRSLGI1TCxiNVIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTVMLGE1UixiNEwsYjRSLGMxLGMyLGMzCisJTVVMX0FERF9DIGE2TCxhNlIsYjNMLGIzUixjMSxjMixjMworCU1VTF9BRERfQyBhN0wsYTdSLGIyTCxiMlIsYzEsYzIsYzMKKwlTVEQgICAgICAgYzEsNzIocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMQorCisJTVVMX0FERF9DIGE3TCxhN1IsYjNMLGIzUixjMixjMyxjMQorCU1VTF9BRERfQyBhNkwsYTZSLGI0TCxiNFIsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTVMLGE1UixiNUwsYjVSLGMyLGMzLGMxCisJTVVMX0FERF9DIGE0TCxhNFIsYjZMLGI2UixjMixjMyxjMQorCU1VTF9BRERfQyBhM0wsYTNSLGI3TCxiN1IsYzIsYzMsYzEKKwlTVEQgICAgICAgYzIsODAocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMgorCisJTVVMX0FERF9DIGE0TCxhNFIsYjdMLGI3UixjMyxjMSxjMgorCU1VTF9BRERfQyBhNUwsYTVSLGI2TCxiNlIsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTZMLGE2UixiNUwsYjVSLGMzLGMxLGMyCisJTVVMX0FERF9DIGE3TCxhN1IsYjRMLGI0UixjMyxjMSxjMgorCVNURCAgICAgICBjMyw4OChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMzCisKKwlNVUxfQUREX0MgYTdMLGE3UixiNUwsYjVSLGMxLGMyLGMzCisJTVVMX0FERF9DIGE2TCxhNlIsYjZMLGI2UixjMSxjMixjMworCU1VTF9BRERfQyBhNUwsYTVSLGI3TCxiN1IsYzEsYzIsYzMKKwlTVEQgICAgICAgYzEsOTYocl9wdHIpCisJQ09QWSAgICAgICVyMCxjMQorCisJTVVMX0FERF9DIGE2TCxhNlIsYjdMLGI3UixjMixjMyxjMQorCU1VTF9BRERfQyBhN0wsYTdSLGI2TCxiNlIsYzIsYzMsYzEKKwlTVEQgICAgICAgYzIsMTA0KHJfcHRyKQorCUNPUFkgICAgICAlcjAsYzIKKworCU1VTF9BRERfQyBhN0wsYTdSLGI3TCxiN1IsYzMsYzEsYzIKKwlTVEQgICAgICAgYzMsMTEyKHJfcHRyKQorCVNURCAgICAgICBjMSwxMjAocl9wdHIpCisKKyAgICAuRVhJVAorICAgIEZMREQgICAgLTg4KCVzcCksJWZyMTMgCisgICAgRkxERCAgICAtOTYoJXNwKSwlZnIxMiAKKyAgICBMREQgICAgIC0xMDQoJXNwKSwlcjYgICAgICAgIDsgcmVzdG9yZSByNgorICAgIExERCAgICAgLTExMiglc3ApLCVyNSAgICAgICAgOyByZXN0b3JlIHI1CisgICAgTEREICAgICAtMTIwKCVzcCksJXI0ICAgICAgICA7IHJlc3RvcmUgcjQKKyAgICBCVkUgICAgICglcnApCisgICAgTERELE1CICAtMTI4KCVzcCksJXIzCisKKwkuUFJPQ0VORAkKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7dm9pZCBibl9tdWxfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpCis7IGFyZzAgPSByX3B0cgorOyBhcmcxID0gYV9wdHIKKzsgYXJnMiA9IGJfcHRyCis7CisKK2JuX211bF9jb21iYTQKKwkucHJvYworCS5jYWxsaW5mbyBGUkFNRT0xMjgsRU5UUllfR1I9JXIzLEFSR1NfU0FWRUQsT1JERVJJTkdfQVdBUkUKKwkuRVhQT1JUCWJuX211bF9jb21iYTQsRU5UUlksUFJJVl9MRVY9MyxOT19SRUxPQ0FUSU9OLExPTkdfUkVUVVJOCisgICAgLmVudHJ5CisJLmFsaWduIDY0CisKKyAgICBTVEQgICAgICVyMywwKCVzcCkgICAgICAgICAgOyBzYXZlIHIzCisgICAgU1REICAgICAlcjQsOCglc3ApICAgICAgICAgIDsgc2F2ZSByNAorICAgIFNURCAgICAgJXI1LDE2KCVzcCkgICAgICAgICA7IHNhdmUgcjUKKyAgICBTVEQgICAgICVyNiwyNCglc3ApICAgICAgICAgOyBzYXZlIHI2CisgICAgRlNURCAgICAlZnIxMiwzMiglc3ApICAgICAgIDsgc2F2ZSByNgorICAgIEZTVEQgICAgJWZyMTMsNDAoJXNwKSAgICAgICA7IHNhdmUgcjcKKworCTsKKwk7IFplcm8gb3V0IGNhcnJpZXMKKwk7CisJQ09QWSAgICAgJXIwLGMxCisJQ09QWSAgICAgJXIwLGMyCisJQ09QWSAgICAgJXIwLGMzCisKKwlMRE8gICAgICAxMjgoJXNwKSwlc3AgICAgICAgOyBidW1wIHN0YWNrCisgICAgREVQREksWiAgMSwzMSwxLGhpZ2hfb25lICAgICA7IENyZWF0ZSBWYWx1ZSAgMSA8PCAzMgorCisJOworCTsgTG9hZCB1cCBhbGwgb2YgdGhlIHZhbHVlcyB3ZSBhcmUgZ29pbmcgdG8gdXNlCisJOworICAgIEZMREQgICAgICAwKGFfcHRyKSxhMCAgICAgICAKKyAgICBGTEREICAgICAgOChhX3B0ciksYTEgICAgICAgCisgICAgRkxERCAgICAgMTYoYV9wdHIpLGEyICAgICAgIAorICAgIEZMREQgICAgIDI0KGFfcHRyKSxhMyAgICAgICAKKworICAgIEZMREQgICAgICAwKGJfcHRyKSxiMCAgICAgICAKKyAgICBGTEREICAgICAgOChiX3B0ciksYjEgICAgICAgCisgICAgRkxERCAgICAgMTYoYl9wdHIpLGIyICAgICAgIAorICAgIEZMREQgICAgIDI0KGJfcHRyKSxiMyAgICAgICAKKworCU1VTF9BRERfQyBhMEwsYTBSLGIwTCxiMFIsYzEsYzIsYzMKKwlTVEQgICAgICAgYzEsMChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMxCisKKwlNVUxfQUREX0MgYTBMLGEwUixiMUwsYjFSLGMyLGMzLGMxCisJTVVMX0FERF9DIGExTCxhMVIsYjBMLGIwUixjMixjMyxjMQorCVNURCAgICAgICBjMiw4KHJfcHRyKQorCUNPUFkgICAgICAlcjAsYzIKKworCU1VTF9BRERfQyBhMkwsYTJSLGIwTCxiMFIsYzMsYzEsYzIKKwlNVUxfQUREX0MgYTFMLGExUixiMUwsYjFSLGMzLGMxLGMyCisJTVVMX0FERF9DIGEwTCxhMFIsYjJMLGIyUixjMyxjMSxjMgorCVNURCAgICAgICBjMywxNihyX3B0cikKKwlDT1BZICAgICAgJXIwLGMzCisKKwlNVUxfQUREX0MgYTBMLGEwUixiM0wsYjNSLGMxLGMyLGMzCisJTVVMX0FERF9DIGExTCxhMVIsYjJMLGIyUixjMSxjMixjMworCU1VTF9BRERfQyBhMkwsYTJSLGIxTCxiMVIsYzEsYzIsYzMKKwlNVUxfQUREX0MgYTNMLGEzUixiMEwsYjBSLGMxLGMyLGMzCisJU1REICAgICAgIGMxLDI0KHJfcHRyKQorCUNPUFkgICAgICAlcjAsYzEKKworCU1VTF9BRERfQyBhM0wsYTNSLGIxTCxiMVIsYzIsYzMsYzEKKwlNVUxfQUREX0MgYTJMLGEyUixiMkwsYjJSLGMyLGMzLGMxCisJTVVMX0FERF9DIGExTCxhMVIsYjNMLGIzUixjMixjMyxjMQorCVNURCAgICAgICBjMiwzMihyX3B0cikKKwlDT1BZICAgICAgJXIwLGMyCisKKwlNVUxfQUREX0MgYTJMLGEyUixiM0wsYjNSLGMzLGMxLGMyCisJTVVMX0FERF9DIGEzTCxhM1IsYjJMLGIyUixjMyxjMSxjMgorCVNURCAgICAgICBjMyw0MChyX3B0cikKKwlDT1BZICAgICAgJXIwLGMzCisKKwlNVUxfQUREX0MgYTNMLGEzUixiM0wsYjNSLGMxLGMyLGMzCisJU1REICAgICAgIGMxLDQ4KHJfcHRyKQorCVNURCAgICAgICBjMiw1NihyX3B0cikKKworICAgIC5FWElUCisgICAgRkxERCAgICAtODgoJXNwKSwlZnIxMyAKKyAgICBGTEREICAgIC05Niglc3ApLCVmcjEyIAorICAgIExERCAgICAgLTEwNCglc3ApLCVyNiAgICAgICAgOyByZXN0b3JlIHI2CisgICAgTEREICAgICAtMTEyKCVzcCksJXI1ICAgICAgICA7IHJlc3RvcmUgcjUKKyAgICBMREQgICAgIC0xMjAoJXNwKSwlcjQgICAgICAgIDsgcmVzdG9yZSByNAorICAgIEJWRSAgICAgKCVycCkKKyAgICBMREQsTUIgIC0xMjgoJXNwKSwlcjMKKworCS5QUk9DRU5ECQorCisKKwkuU1BBQ0UJJFRFWFQkCisJLlNVQlNQQQkkQ09ERSQKKwkuU1BBQ0UJJFBSSVZBVEUkLFNPUlQ9MTYKKwkuSU1QT1JUCSRnbG9iYWwkLERBVEEKKwkuU1BBQ0UJJFRFWFQkCisJLlNVQlNQQQkkQ09ERSQKKwkuU1VCU1BBCSRMSVQkLEFDQ0VTUz0weDJjCitDJDQKKwkuQUxJR04JOAorCS5TVFJJTkdaCSJEaXZpc2lvbiB3b3VsZCBvdmVyZmxvdyAoJWQpXG4iCisJLkVORApkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9wcGMtbW9udC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vcHBjLW1vbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0OWVhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vcHBjLW1vbnQucGwKQEAgLTAsMCArMSwzMjMgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBBcHJpbCAyMDA2CisKKyMgIlRlYXNlciIgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBtb2R1bGUgZm9yIFBvd2VyUEMuIEl0J3MgcG9zc2libGUKKyMgdG8gZ2FpbiBhIGJpdCBtb3JlIGJ5IG1vZHVsby1zY2hlZHVsaW5nIG91dGVyIGxvb3AsIHRoZW4gZGVkaWNhdGVkCisjIHNxdWFyaW5nIHByb2NlZHVyZSBzaG91bGQgZ2l2ZSBmdXJ0aGVyIDIwJSBhbmQgY29kZSBjYW4gYmUgYWRhcHRlZAorIyBmb3IgMzItYml0IGFwcGxpY2F0aW9uIHJ1bm5pbmcgb24gNjQtYml0IENQVS4gQXMgZm9yIHRoZSBsYXR0ZXIuCisjIEl0IHdvbid0IGJlIGFibGUgdG8gYWNoaWV2ZSAibmF0aXZlIiA2NC1iaXQgcGVyZm9ybWFuY2UsIGJlY2F1c2UgaW4KKyMgMzItYml0IGFwcGxpY2F0aW9uIGNvbnRleHQgZXZlcnkgYWRkYyBpbnN0cnVjdGlvbiB3aWxsIGhhdmUgdG8gYmUKKyMgZXhwYW5kZWQgYXMgYWRkYywgdHdpY2UgcmlnaHQgc2hpZnQgYnkgMzIgYW5kIGZpbmFsbHkgYWRkZSwgZXRjLgorIyBTbyBmYXIgUlNBICpzaWduKiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIHByZS1ibl9tdWxfbW9udCBhc20KKyMgZm9yIDY0LWJpdCBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIFBQQzk3MC9HNSBpczoKKyMKKyMgNTEyLWJpdAkrNjUlCQorIyAxMDI0LWJpdAkrMzUlCisjIDIwNDgtYml0CSsxOCUKKyMgNDA5Ni1iaXQJKzQlCisKKyRmbGF2b3VyID0gc2hpZnQ7CisKK2lmICgkZmxhdm91ciA9fiAvMzIvKSB7CisJJEJJVFM9CTMyOworCSRCTlNaPQkkQklUUy84OworCSRTSVpFX1Q9NDsKKwkkUlpPTkU9CTIyNDsKKwkkRlJBTUU9CSRTSVpFX1QqMTY7CisKKwkkTEQ9CSJsd3oiOwkJIyBsb2FkCisJJExEVT0JImx3enUiOwkJIyBsb2FkIGFuZCB1cGRhdGUKKwkkTERYPQkibHd6eCI7CQkjIGxvYWQgaW5kZXhlZAorCSRTVD0JInN0dyI7CQkjIHN0b3JlCisJJFNUVT0JInN0d3UiOwkJIyBzdG9yZSBhbmQgdXBkYXRlCisJJFNUWD0JInN0d3giOwkJIyBzdG9yZSBpbmRleGVkCisJJFNUVVg9CSJzdHd1eCI7CSMgc3RvcmUgaW5kZXhlZCBhbmQgdXBkYXRlCisJJFVNVUxMPQkibXVsbHciOwkjIHVuc2lnbmVkIG11bHRpcGx5IGxvdworCSRVTVVMSD0JIm11bGh3dSI7CSMgdW5zaWduZWQgbXVsdGlwbHkgaGlnaAorCSRVQ01QPQkiY21wbHciOwkjIHVuc2lnbmVkIGNvbXBhcmUKKwkkU0hSST0JInNyd2kiOwkJIyB1bnNpZ25lZCBzaGlmdCByaWdodCBieSBpbW1lZGlhdGUJCisJJFBVU0g9CSRTVDsKKwkkUE9QPQkkTEQ7Cit9IGVsc2lmICgkZmxhdm91ciA9fiAvNjQvKSB7CisJJEJJVFM9CTY0OworCSRCTlNaPQkkQklUUy84OworCSRTSVpFX1Q9ODsKKwkkUlpPTkU9CTI4ODsKKwkkRlJBTUU9CSRTSVpFX1QqMTY7CisKKwkjIHNhbWUgYXMgYWJvdmUsIGJ1dCA2NC1iaXQgbW5lbW9uaWNzLi4uCisJJExEPQkibGQiOwkJIyBsb2FkCisJJExEVT0JImxkdSI7CQkjIGxvYWQgYW5kIHVwZGF0ZQorCSRMRFg9CSJsZHgiOwkJIyBsb2FkIGluZGV4ZWQKKwkkU1Q9CSJzdGQiOwkJIyBzdG9yZQorCSRTVFU9CSJzdGR1IjsJCSMgc3RvcmUgYW5kIHVwZGF0ZQorCSRTVFg9CSJzdGR4IjsJCSMgc3RvcmUgaW5kZXhlZAorCSRTVFVYPQkic3RkdXgiOwkjIHN0b3JlIGluZGV4ZWQgYW5kIHVwZGF0ZQorCSRVTVVMTD0JIm11bGxkIjsJIyB1bnNpZ25lZCBtdWx0aXBseSBsb3cKKwkkVU1VTEg9CSJtdWxoZHUiOwkjIHVuc2lnbmVkIG11bHRpcGx5IGhpZ2gKKwkkVUNNUD0JImNtcGxkIjsJIyB1bnNpZ25lZCBjb21wYXJlCisJJFNIUkk9CSJzcmRpIjsJCSMgdW5zaWduZWQgc2hpZnQgcmlnaHQgYnkgaW1tZWRpYXRlCQorCSRQVVNIPQkkU1Q7CisJJFBPUD0JJExEOworfSBlbHNlIHsgZGllICJub25zZW5zZSAkZmxhdm91ciI7IH0KKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKKyggJHhsYXRlPSIke2Rpcn1wcGMteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgorKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20vcHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgorZGllICJjYW4ndCBsb2NhdGUgcHBjLXhsYXRlLnBsIjsKKworb3BlbiBTVERPVVQsInwgJF5YICR4bGF0ZSAkZmxhdm91ciAiLnNoaWZ0IHx8IGRpZSAiY2FuJ3QgY2FsbCAkeGxhdGU6ICQhIjsKKworJHNwPSJyMSI7CiskdG9jPSJyMiI7CiskcnA9InIzIjsJJG92Zj0icjMiOworJGFwPSJyNCI7CiskYnA9InI1IjsKKyRucD0icjYiOworJG4wPSJyNyI7CiskbnVtPSJyOCI7CiskcnA9InI5IjsJIyAkcnAgaXMgcmVhc3NpZ25lZAorJGFqPSJyMTAiOworJG5qPSJyMTEiOworJHRqPSJyMTIiOworIyBub24tdm9sYXRpbGUgcmVnaXN0ZXJzCiskaT0icjE0IjsKKyRqPSJyMTUiOworJHRwPSJyMTYiOworJG0wPSJyMTciOworJG0xPSJyMTgiOworJGxvMD0icjE5IjsKKyRoaTA9InIyMCI7CiskbG8xPSJyMjEiOworJGhpMT0icjIyIjsKKyRhbG89InIyMyI7CiskYWhpPSJyMjQiOworJG5sbz0icjI1IjsKKyMKKyRuaGk9InIwIjsKKworJGNvZGU9PDxfX187CisubWFjaGluZSAiYW55IgorLnRleHQKKworLmdsb2JsCS5ibl9tdWxfbW9udAorLmFsaWduCTQKKy5ibl9tdWxfbW9udDoKKwljbXB3aQkkbnVtLDQKKwltcgkkcnAscjMJCTsgJHJwIGlzIHJlYXNzaWduZWQKKwlsaQlyMywwCisJYmx0bHIKKworCXNsd2kJJG51bSwkbnVtLGBsb2coJEJOU1opL2xvZygyKWAKKwlsaQkkdGosLTQwOTYKKwlhZGRpCSRvdmYsJG51bSxgJEZSQU1FKyRSWk9ORWAKKwlzdWJmCSRvdmYsJG92Ziwkc3AJOyAkc3AtJG92ZgorCWFuZAkkb3ZmLCRvdmYsJHRqCTsgbWluaW1pemUgVExCIHVzYWdlCisJc3ViZgkkb3ZmLCRzcCwkb3ZmCTsgJG92Zi0kc3AKKwlzcndpCSRudW0sJG51bSxgbG9nKCRCTlNaKS9sb2coMilgCisJJFNUVVgJJHNwLCRzcCwkb3ZmCisKKwkkUFVTSAlyMTQsYDQqJFNJWkVfVGAoJHNwKQorCSRQVVNICXIxNSxgNSokU0laRV9UYCgkc3ApCisJJFBVU0gJcjE2LGA2KiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMTcsYDcqJFNJWkVfVGAoJHNwKQorCSRQVVNICXIxOCxgOCokU0laRV9UYCgkc3ApCisJJFBVU0gJcjE5LGA5KiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMjAsYDEwKiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMjEsYDExKiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMjIsYDEyKiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMjMsYDEzKiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMjQsYDE0KiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMjUsYDE1KiRTSVpFX1RgKCRzcCkKKworCSRMRAkkbjAsMCgkbjApCTsgcHVsbCBuMFswXSB2YWx1ZQorCWFkZGkJJG51bSwkbnVtLC0yCTsgYWRqdXN0ICRudW0gZm9yIGNvdW50ZXIgcmVnaXN0ZXIKKwwKKwkkTEQJJG0wLDAoJGJwKQk7IG0wPWJwWzBdCisJJExECSRhaiwwKCRhcCkJOyBhcFswXQorCWFkZGkJJHRwLCRzcCwkRlJBTUUKKwkkVU1VTEwJJGxvMCwkYWosJG0wCTsgYXBbMF0qYnBbMF0KKwkkVU1VTEgJJGhpMCwkYWosJG0wCisKKwkkTEQJJGFqLCRCTlNaKCRhcCkJOyBhcFsxXQorCSRMRAkkbmosMCgkbnApCTsgbnBbMF0KKworCSRVTVVMTAkkbTEsJGxvMCwkbjAJOyAidHBbMF0iKm4wCisKKwkkVU1VTEwJJGFsbywkYWosJG0wCTsgYXBbMV0qYnBbMF0KKwkkVU1VTEgJJGFoaSwkYWosJG0wCisKKwkkVU1VTEwJJGxvMSwkbmosJG0xCTsgbnBbMF0qbTEKKwkkVU1VTEgJJGhpMSwkbmosJG0xCisJJExECSRuaiwkQk5TWigkbnApCTsgbnBbMV0KKwlhZGRjCSRsbzEsJGxvMSwkbG8wCisJYWRkemUJJGhpMSwkaGkxCisKKwkkVU1VTEwJJG5sbywkbmosJG0xCTsgbnBbMV0qbTEKKwkkVU1VTEgJJG5oaSwkbmosJG0xCisKKwltdGN0cgkkbnVtCisJbGkJJGosYDIqJEJOU1pgCisuYWxpZ24JNAorTDFzdDoKKwkkTERYCSRhaiwkYXAsJGoJOyBhcFtqXQorCWFkZGMJJGxvMCwkYWxvLCRoaTAKKwkkTERYCSRuaiwkbnAsJGoJOyBucFtqXQorCWFkZHplCSRoaTAsJGFoaQorCSRVTVVMTAkkYWxvLCRhaiwkbTAJOyBhcFtqXSpicFswXQorCWFkZGMJJGxvMSwkbmxvLCRoaTEKKwkkVU1VTEgJJGFoaSwkYWosJG0wCisJYWRkemUJJGhpMSwkbmhpCisJJFVNVUxMCSRubG8sJG5qLCRtMQk7IG5wW2pdKm0xCisJYWRkYwkkbG8xLCRsbzEsJGxvMAk7IG5wW2pdKm0xK2FwW2pdKmJwWzBdCisJJFVNVUxICSRuaGksJG5qLCRtMQorCWFkZHplCSRoaTEsJGhpMQorCSRTVAkkbG8xLDAoJHRwKQk7IHRwW2otMV0KKworCWFkZGkJJGosJGosJEJOU1oJOyBqKysKKwlhZGRpCSR0cCwkdHAsJEJOU1oJOyB0cCsrCisJYmRuei0JTDFzdAorO0wxc3QKKwlhZGRjCSRsbzAsJGFsbywkaGkwCisJYWRkemUJJGhpMCwkYWhpCisKKwlhZGRjCSRsbzEsJG5sbywkaGkxCisJYWRkemUJJGhpMSwkbmhpCisJYWRkYwkkbG8xLCRsbzEsJGxvMAk7IG5wW2pdKm0xK2FwW2pdKmJwWzBdCisJYWRkemUJJGhpMSwkaGkxCisJJFNUCSRsbzEsMCgkdHApCTsgdHBbai0xXQorCisJbGkJJG92ZiwwCisJYWRkYwkkaGkxLCRoaTEsJGhpMAorCWFkZHplCSRvdmYsJG92Zgk7IHVwbW9zdCBvdmVyZmxvdyBiaXQKKwkkU1QJJGhpMSwkQk5TWigkdHApCisMCisJbGkJJGksJEJOU1oKKy5hbGlnbgk0CitMb3V0ZXI6CisJJExEWAkkbTAsJGJwLCRpCTsgbTA9YnBbaV0KKwkkTEQJJGFqLDAoJGFwKQk7IGFwWzBdCisJYWRkaQkkdHAsJHNwLCRGUkFNRQorCSRMRAkkdGosJEZSQU1FKCRzcCkJOyB0cFswXQorCSRVTVVMTAkkbG8wLCRhaiwkbTAJOyBhcFswXSpicFtpXQorCSRVTVVMSAkkaGkwLCRhaiwkbTAKKwkkTEQJJGFqLCRCTlNaKCRhcCkJOyBhcFsxXQorCSRMRAkkbmosMCgkbnApCTsgbnBbMF0KKwlhZGRjCSRsbzAsJGxvMCwkdGoJOyBhcFswXSpicFtpXSt0cFswXQorCSRVTVVMTAkkYWxvLCRhaiwkbTAJOyBhcFtqXSpicFtpXQorCWFkZHplCSRoaTAsJGhpMAorCSRVTVVMTAkkbTEsJGxvMCwkbjAJOyB0cFswXSpuMAorCSRVTVVMSAkkYWhpLCRhaiwkbTAKKwkkVU1VTEwJJGxvMSwkbmosJG0xCTsgbnBbMF0qbTEKKwkkVU1VTEgJJGhpMSwkbmosJG0xCisJJExECSRuaiwkQk5TWigkbnApCTsgbnBbMV0KKwlhZGRjCSRsbzEsJGxvMSwkbG8wCisJJFVNVUxMCSRubG8sJG5qLCRtMQk7IG5wWzFdKm0xCisJYWRkemUJJGhpMSwkaGkxCisJJFVNVUxICSRuaGksJG5qLCRtMQorDAorCW10Y3RyCSRudW0KKwlsaQkkaixgMiokQk5TWmAKKy5hbGlnbgk0CitMaW5uZXI6CisJJExEWAkkYWosJGFwLCRqCTsgYXBbal0KKwlhZGRjCSRsbzAsJGFsbywkaGkwCisJJExECSR0aiwkQk5TWigkdHApCTsgdHBbal0KKwlhZGR6ZQkkaGkwLCRhaGkKKwkkTERYCSRuaiwkbnAsJGoJOyBucFtqXQorCWFkZGMJJGxvMSwkbmxvLCRoaTEKKwkkVU1VTEwJJGFsbywkYWosJG0wCTsgYXBbal0qYnBbaV0KKwlhZGR6ZQkkaGkxLCRuaGkKKwkkVU1VTEgJJGFoaSwkYWosJG0wCisJYWRkYwkkbG8wLCRsbzAsJHRqCTsgYXBbal0qYnBbaV0rdHBbal0KKwkkVU1VTEwJJG5sbywkbmosJG0xCTsgbnBbal0qbTEKKwlhZGR6ZQkkaGkwLCRoaTAKKwkkVU1VTEgJJG5oaSwkbmosJG0xCisJYWRkYwkkbG8xLCRsbzEsJGxvMAk7IG5wW2pdKm0xK2FwW2pdKmJwW2ldK3RwW2pdCisJYWRkaQkkaiwkaiwkQk5TWgk7IGorKworCWFkZHplCSRoaTEsJGhpMQorCSRTVAkkbG8xLDAoJHRwKQk7IHRwW2otMV0KKwlhZGRpCSR0cCwkdHAsJEJOU1oJOyB0cCsrCisJYmRuei0JTGlubmVyCis7TGlubmVyCisJJExECSR0aiwkQk5TWigkdHApCTsgdHBbal0KKwlhZGRjCSRsbzAsJGFsbywkaGkwCisJYWRkemUJJGhpMCwkYWhpCisJYWRkYwkkbG8wLCRsbzAsJHRqCTsgYXBbal0qYnBbaV0rdHBbal0KKwlhZGR6ZQkkaGkwLCRoaTAKKworCWFkZGMJJGxvMSwkbmxvLCRoaTEKKwlhZGR6ZQkkaGkxLCRuaGkKKwlhZGRjCSRsbzEsJGxvMSwkbG8wCTsgbnBbal0qbTErYXBbal0qYnBbaV0rdHBbal0KKwlhZGR6ZQkkaGkxLCRoaTEKKwkkU1QJJGxvMSwwKCR0cCkJOyB0cFtqLTFdCisKKwlhZGRpYwkkb3ZmLCRvdmYsLTEJOyBtb3ZlIHVwbW9zdCBvdmVyZmxvdyB0byBYRVJbQ0FdCisJbGkJJG92ZiwwCisJYWRkZQkkaGkxLCRoaTEsJGhpMAorCWFkZHplCSRvdmYsJG92ZgorCSRTVAkkaGkxLCRCTlNaKCR0cCkKKzsKKwlzbHdpCSR0aiwkbnVtLGBsb2coJEJOU1opL2xvZygyKWAKKwkkVUNNUAkkaSwkdGoKKwlhZGRpCSRpLCRpLCRCTlNaCisJYmxlLQlMb3V0ZXIKKwwKKwlhZGRpCSRudW0sJG51bSwyCTsgcmVzdG9yZSAkbnVtCisJc3ViZmMJJGosJGosJGoJOyBqPTAgYW5kICJjbGVhciIgWEVSW0NBXQorCWFkZGkJJHRwLCRzcCwkRlJBTUUKKwltdGN0cgkkbnVtCisKKy5hbGlnbgk0CitMc3ViOgkkTERYCSR0aiwkdHAsJGoKKwkkTERYCSRuaiwkbnAsJGoKKwlzdWJmZQkkYWosJG5qLCR0agk7IHRwW2pdLW5wW2pdCisJJFNUWAkkYWosJHJwLCRqCisJYWRkaQkkaiwkaiwkQk5TWgorCWJkbnotCUxzdWIKKworCWxpCSRqLDAKKwltdGN0cgkkbnVtCisJc3ViZmUJJG92Ziwkaiwkb3ZmCTsgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwlhbmQJJGFwLCR0cCwkb3ZmCisJYW5kYwkkbnAsJHJwLCRvdmYKKwlvcgkkYXAsJGFwLCRucAk7IGFwPWJvcnJvdz90cDpycAorCisuYWxpZ24JNAorTGNvcHk6CQkJCTsgY29weSBvciBpbi1wbGFjZSByZWZyZXNoCisJJExEWAkkdGosJGFwLCRqCisJJFNUWAkkdGosJHJwLCRqCisJJFNUWAkkaiwkdHAsJGoJOyB6YXAgYXQgb25jZQorCWFkZGkJJGosJGosJEJOU1oKKwliZG56LQlMY29weQorCisJJFBPUAlyMTQsYDQqJFNJWkVfVGAoJHNwKQorCSRQT1AJcjE1LGA1KiRTSVpFX1RgKCRzcCkKKwkkUE9QCXIxNixgNiokU0laRV9UYCgkc3ApCisJJFBPUAlyMTcsYDcqJFNJWkVfVGAoJHNwKQorCSRQT1AJcjE4LGA4KiRTSVpFX1RgKCRzcCkKKwkkUE9QCXIxOSxgOSokU0laRV9UYCgkc3ApCisJJFBPUAlyMjAsYDEwKiRTSVpFX1RgKCRzcCkKKwkkUE9QCXIyMSxgMTEqJFNJWkVfVGAoJHNwKQorCSRQT1AJcjIyLGAxMiokU0laRV9UYCgkc3ApCisJJFBPUAlyMjMsYDEzKiRTSVpFX1RgKCRzcCkKKwkkUE9QCXIyNCxgMTQqJFNJWkVfVGAoJHNwKQorCSRQT1AJcjI1LGAxNSokU0laRV9UYCgkc3ApCisJJFBPUAkkc3AsMCgkc3ApCisJbGkJcjMsMQorCWJscgorCS5sb25nCTAKKy5hc2NpeiAgIk1vbnRnb21lcnkgTXVsdGlwbGljYXRpb24gZm9yIFBQQywgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQGZ5LmNoYWxtZXJzLnNlPiIKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9wcGMucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3BwYy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2M2NWQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9wcGMucGwKQEAgLTAsMCArMSwxOTgxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjIEltcGxlbWVudGVkIGFzIGEgUGVybCB3cmFwcGVyIGFzIHdlIHdhbnQgdG8gc3VwcG9ydCBzZXZlcmFsIGRpZmZlcmVudAorIyBhcmNoaXRlY3R1cmVzIHdpdGggc2luZ2xlIGZpbGUuIFdlIHBpY2sgdXAgdGhlIHRhcmdldCBiYXNlZCBvbiB0aGUKKyMgZmlsZSBuYW1lIHdlIGFyZSBhc2tlZCB0byBnZW5lcmF0ZS4KKyMKKyMgSXQgc2hvdWxkIGJlIG5vdGVkIHRob3VnaCB0aGF0IHRoaXMgcGVybCBjb2RlIGlzIG5vdGhpbmcgbGlrZQorIyA8b3BlbnNzbD4vY3J5cHRvL3Blcmxhc20veDg2Ki4gSW4gdGhpcyBjYXNlIHBlcmwgaXMgdXNlZCBwcmV0dHkgbXVjaAorIyBhcyBwcmUtcHJvY2Vzc29yIHRvIGNvdmVyIGZvciBwbGF0Zm9ybSBkaWZmZXJlbmNlcyBpbiBuYW1lIGRlY29yYXRpb24sCisjIGxpbmtlciB0YWJsZXMsIDMyLS82NC1iaXQgaW5zdHJ1Y3Rpb24gc2V0cy4uLgorIworIyBBcyB5b3UgbWlnaHQga25vdyB0aGVyZSdyZSBzZXZlcmFsIFBvd2VyUEMgQUJJIGluIHVzZS4gTW9zdCBub3RhYmx5CisjIExpbnV4IGFuZCBBSVggdXNlIGRpZmZlcmVudCAzMi1iaXQgQUJJcy4gR29vZCBuZXdzIGFyZSB0aGF0IHRoZXNlIEFCSXMKKyMgYXJlIHNpbWlsYXIgZW5vdWdoIHRvIGltcGxlbWVudCBsZWFmKCEpIGZ1bmN0aW9ucywgd2hpY2ggd291bGQgYmUgQUJJCisjIG5ldXRyYWwuIEFuZCB0aGF0J3Mgd2hhdCB5b3UgZmluZCBoZXJlOiBBQkkgbmV1dHJhbCBsZWFmIGZ1bmN0aW9ucy4KKyMgSW4gY2FzZSB5b3Ugd29uZGVyIHdoYXQgdGhhdCBpcy4uLgorIworIyAgICAgICBBSVggcGVyZm9ybWFuY2UKKyMKKyMJTUVBU1VSRU1FTlRTIFdJVEggY2MgT04gYSAyMDAgTWhaIFBvd2VyUEMgNjA0ZS4KKyMKKyMJVGhlIGZvbGxvd2luZyBpcyB0aGUgcGVyZm9ybWFuY2Ugb2YgMzItYml0IGNvbXBpbGVyCisjCWdlbmVyYXRlZCBjb2RlOgorIworIwlPcGVuU1NMIDAuOS42YyAyMSBkZWMgMjAwMQorIwlidWlsdCBvbjogVHVlIEp1biAxMSAxMTowNjo1MSBFRFQgMjAwMgorIwlvcHRpb25zOmJuKDY0LDMyKSAuLi4KKyNjb21waWxlcjogY2MgLURUSFJFQURTICAtREFJWCAtREJfRU5ESUFOIC1EQk5fTExPTkcgLU8zCisjICAgICAgICAgICAgICAgICAgc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zCisjcnNhICA1MTIgYml0cyAgIDAuMDA5OHMgICAwLjAwMDlzICAgIDEwMi4wICAgMTE3MC42CisjcnNhIDEwMjQgYml0cyAgIDAuMDUwN3MgICAwLjAwMjZzICAgICAxOS43ICAgIDM4Ny41CisjcnNhIDIwNDggYml0cyAgIDAuMzAzNnMgICAwLjAwODVzICAgICAgMy4zICAgIDExNy4xCisjcnNhIDQwOTYgYml0cyAgIDIuMDA0MHMgICAwLjAyOTlzICAgICAgMC41ICAgICAzMy40CisjZHNhICA1MTIgYml0cyAgIDAuMDA4N3MgICAwLjAxMDZzICAgIDExNC4zICAgICA5NC41CisjZHNhIDEwMjQgYml0cyAgIDAuMDI1NnMgICAwLjAzMTNzICAgICAzOS4wICAgICAzMi4wCQorIworIwlTYW1lIGJlY2htYXJrIHdpdGggdGhpcyBhc3NlbWJsZXIgY29kZToKKyMKKyNyc2EgIDUxMiBiaXRzICAgMC4wMDU2cyAgIDAuMDAwNXMgICAgMTc4LjYgICAyMDQ5LjIKKyNyc2EgMTAyNCBiaXRzICAgMC4wMjgzcyAgIDAuMDAxNXMgICAgIDM1LjMgICAgNjc0LjEKKyNyc2EgMjA0OCBiaXRzICAgMC4xNzQ0cyAgIDAuMDA1MHMgICAgICA1LjcgICAgMjAxLjIKKyNyc2EgNDA5NiBiaXRzICAgMS4xNjQ0cyAgIDAuMDE3OXMgICAgICAwLjkgICAgIDU1LjcKKyNkc2EgIDUxMiBiaXRzICAgMC4wMDUycyAgIDAuMDA2MnMgICAgMTkxLjYgICAgMTYyLjAKKyNkc2EgMTAyNCBiaXRzICAgMC4wMTQ5cyAgIDAuMDE4MHMgICAgIDY3LjAgICAgIDU1LjUKKyMKKyMJTnVtYmVyIG9mIG9wZXJhdGlvbnMgaW5jcmVhc2VzIGJ5IGF0IGFsbW9zdCA3NSUKKyMKKyMJSGVyZSBhcmUgcGVyZm9ybWFuY2UgbnVtYmVycyBmb3IgNjQtYml0IGNvbXBpbGVyCisjCWdlbmVyYXRlZCBjb2RlOgorIworIwlPcGVuU1NMIDAuOS42ZyBbZW5naW5lXSA5IEF1ZyAyMDAyCisjCWJ1aWx0IG9uOiBGcmkgQXByIDE4IDE2OjU5OjIwIEVEVCAyMDAzCisjCW9wdGlvbnM6Ym4oNjQsNjQpIC4uLgorIwljb21waWxlcjogY2MgLURUSFJFQURTIC1EX1JFRU5UUkFOVCAtcTY0IC1EQl9FTkRJQU4gLU8zCisjICAgICAgICAgICAgICAgICAgc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zCisjcnNhICA1MTIgYml0cyAgIDAuMDAyOHMgICAwLjAwMDNzICAgIDM1Ny4xICAgMzg0NC40CisjcnNhIDEwMjQgYml0cyAgIDAuMDE0OHMgICAwLjAwMDhzICAgICA2Ny41ICAgMTIzOS43CisjcnNhIDIwNDggYml0cyAgIDAuMDk2M3MgICAwLjAwMjhzICAgICAxMC40ICAgIDM1My4wCisjcnNhIDQwOTYgYml0cyAgIDAuNjUzOHMgICAwLjAxMDJzICAgICAgMS41ICAgICA5OC4xCisjZHNhICA1MTIgYml0cyAgIDAuMDAyNnMgICAwLjAwMzJzICAgIDM4Mi41ICAgIDMxMy43CisjZHNhIDEwMjQgYml0cyAgIDAuMDA4MXMgICAwLjAwOTlzICAgIDEyMi44ICAgIDEwMC42CisjCisjCVNhbWUgYmVuY2htYXJrIHdpdGggdGhpcyBhc3NlbWJsZXIgY29kZToKKyMKKyNyc2EgIDUxMiBiaXRzICAgMC4wMDIwcyAgIDAuMDAwMnMgICAgNTEwLjQgICA2MjczLjcKKyNyc2EgMTAyNCBiaXRzICAgMC4wMDg4cyAgIDAuMDAwNXMgICAgMTE0LjEgICAyMTI4LjMKKyNyc2EgMjA0OCBiaXRzICAgMC4wNTQwcyAgIDAuMDAxNnMgICAgIDE4LjUgICAgNjIyLjUKKyNyc2EgNDA5NiBiaXRzICAgMC4zNzAwcyAgIDAuMDA1OHMgICAgICAyLjcgICAgMTcxLjAKKyNkc2EgIDUxMiBiaXRzICAgMC4wMDE2cyAgIDAuMDAyMHMgICAgNjEwLjcgICAgNTA3LjEKKyNkc2EgMTAyNCBiaXRzICAgMC4wMDQ3cyAgIDAuMDA1OHMgICAgMjEyLjUgICAgMTczLjIKKyMJCisjCUFnYWluLCBwZXJmb3JtYW5jZSBpbmNyZWFzZXMgYnkgYXQgYWJvdXQgNzUlCisjCisjICAgICAgIE1hYyBPUyBYLCBBcHBsZSBHNSAxLjhHSHogKE5vdGUgdGhpcyBpcyAzMiBiaXQgY29kZSkKKyMgICAgICAgT3BlblNTTCAwLjkuN2MgMzAgU2VwIDIwMDMKKyMKKyMgICAgICAgT3JpZ2luYWwgY29kZS4KKyMKKyNyc2EgIDUxMiBiaXRzICAgMC4wMDExcyAgIDAuMDAwMXMgICAgOTA2LjEgIDExMDEyLjUKKyNyc2EgMTAyNCBiaXRzICAgMC4wMDYwcyAgIDAuMDAwM3MgICAgMTY2LjYgICAzMzYzLjEKKyNyc2EgMjA0OCBiaXRzICAgMC4wMzcwcyAgIDAuMDAxMHMgICAgIDI3LjEgICAgOTgyLjQKKyNyc2EgNDA5NiBiaXRzICAgMC4yNDI2cyAgIDAuMDAzNnMgICAgICA0LjEgICAgMjgwLjQKKyNkc2EgIDUxMiBiaXRzICAgMC4wMDEwcyAgIDAuMDAxMnMgICAxMDM4LjEgICAgODQxLjUKKyNkc2EgMTAyNCBiaXRzICAgMC4wMDMwcyAgIDAuMDAzN3MgICAgMzI5LjYgICAgMjY5LjcKKyNkc2EgMjA0OCBiaXRzICAgMC4wMTAxcyAgIDAuMDEyN3MgICAgIDk4LjkgICAgIDc4LjYKKyMKKyMgICAgICAgU2FtZSBiZW5jaG1hcmsgd2l0aCB0aGlzIGFzc2VtYmxlciBjb2RlOgorIworI3JzYSAgNTEyIGJpdHMgICAwLjAwMDdzICAgMC4wMDAxcyAgIDE0MTYuMiAgMTY2NDUuOQorI3JzYSAxMDI0IGJpdHMgICAwLjAwMzZzICAgMC4wMDAycyAgICAyNzQuNCAgIDUzODAuNgorI3JzYSAyMDQ4IGJpdHMgICAwLjAyMjJzICAgMC4wMDA2cyAgICAgNDUuMSAgIDE1ODkuNQorI3JzYSA0MDk2IGJpdHMgICAwLjE0NjlzICAgMC4wMDIycyAgICAgIDYuOCAgICA0NDkuNgorI2RzYSAgNTEyIGJpdHMgICAwLjAwMDZzICAgMC4wMDA3cyAgIDE2NjQuMiAgIDEzNzYuMgorI2RzYSAxMDI0IGJpdHMgICAwLjAwMThzICAgMC4wMDIzcyAgICA1NDUuMCAgICA0NDIuMgorI2RzYSAyMDQ4IGJpdHMgICAwLjAwNjFzICAgMC4wMDc1cyAgICAxNjMuNSAgICAxMzIuOAorIworIyAgICAgICAgUGVyZm9ybWFuY2UgaW5jcmVhc2Ugb2YgfjYwJQorIworIwlJZiB5b3UgaGF2ZSBjb21tZW50cyBvciBzdWdnZXN0aW9ucyB0byBpbXByb3ZlIGNvZGUgc2VuZAorIwltZSBhIG5vdGUgYXQgc2NoYXJpQHVzLmlibS5jb20KKyMKKworJGZsYXZvdXIgPSBzaGlmdDsKKworaWYgKCRmbGF2b3VyID1+IC8zMi8pIHsKKwkkQklUUz0JMzI7CisJJEJOU1o9CSRCSVRTLzg7CisJJElTQT0JIlwicHBjXCIiOworCisJJExEPQkibHd6IjsJCSMgbG9hZAorCSRMRFU9CSJsd3p1IjsJCSMgbG9hZCBhbmQgdXBkYXRlCisJJFNUPQkic3R3IjsJCSMgc3RvcmUKKwkkU1RVPQkic3R3dSI7CQkjIHN0b3JlIGFuZCB1cGRhdGUKKwkkVU1VTEw9CSJtdWxsdyI7CSMgdW5zaWduZWQgbXVsdGlwbHkgbG93CisJJFVNVUxIPQkibXVsaHd1IjsJIyB1bnNpZ25lZCBtdWx0aXBseSBoaWdoCisJJFVESVY9CSJkaXZ3dSI7CSMgdW5zaWduZWQgZGl2aWRlCisJJFVDTVBJPQkiY21wbHdpIjsJIyB1bnNpZ25lZCBjb21wYXJlIHdpdGggaW1tZWRpYXRlCisJJFVDTVA9CSJjbXBsdyI7CSMgdW5zaWduZWQgY29tcGFyZQorCSRDTlRMWj0JImNudGx6dyI7CSMgY291bnQgbGVhZGluZyB6ZXJvcworCSRTSEw9CSJzbHciOwkJIyBzaGlmdCBsZWZ0CisJJFNIUj0JInNydyI7CQkjIHVuc2lnbmVkIHNoaWZ0IHJpZ2h0CisJJFNIUkk9CSJzcndpIjsJCSMgdW5zaWduZWQgc2hpZnQgcmlnaHQgYnkgaW1tZWRpYXRlCQorCSRTSExJPQkic2x3aSI7CQkjIHNoaWZ0IGxlZnQgYnkgaW1tZWRpYXRlCisJJENMUlU9CSJjbHJsd2kiOwkjIGNsZWFyIHVwcGVyIGJpdHMKKwkkSU5TUj0JImluc3J3aSI7CSMgaW5zZXJ0IHJpZ2h0CisJJFJPVEw9CSJyb3Rsd2kiOwkjIHJvdGF0ZSBsZWZ0IGJ5IGltbWVkaWF0ZQorCSRUUj0JInR3IjsJCSMgY29uZGl0aW9uYWwgdHJhcAorfSBlbHNpZiAoJGZsYXZvdXIgPX4gLzY0LykgeworCSRCSVRTPQk2NDsKKwkkQk5TWj0JJEJJVFMvODsKKwkkSVNBPQkiXCJwcGM2NFwiIjsKKworCSMgc2FtZSBhcyBhYm92ZSwgYnV0IDY0LWJpdCBtbmVtb25pY3MuLi4KKwkkTEQ9CSJsZCI7CQkjIGxvYWQKKwkkTERVPQkibGR1IjsJCSMgbG9hZCBhbmQgdXBkYXRlCisJJFNUPQkic3RkIjsJCSMgc3RvcmUKKwkkU1RVPQkic3RkdSI7CQkjIHN0b3JlIGFuZCB1cGRhdGUKKwkkVU1VTEw9CSJtdWxsZCI7CSMgdW5zaWduZWQgbXVsdGlwbHkgbG93CisJJFVNVUxIPQkibXVsaGR1IjsJIyB1bnNpZ25lZCBtdWx0aXBseSBoaWdoCisJJFVESVY9CSJkaXZkdSI7CSMgdW5zaWduZWQgZGl2aWRlCisJJFVDTVBJPQkiY21wbGRpIjsJIyB1bnNpZ25lZCBjb21wYXJlIHdpdGggaW1tZWRpYXRlCisJJFVDTVA9CSJjbXBsZCI7CSMgdW5zaWduZWQgY29tcGFyZQorCSRDTlRMWj0JImNudGx6ZCI7CSMgY291bnQgbGVhZGluZyB6ZXJvcworCSRTSEw9CSJzbGQiOwkJIyBzaGlmdCBsZWZ0CisJJFNIUj0JInNyZCI7CQkjIHVuc2lnbmVkIHNoaWZ0IHJpZ2h0CisJJFNIUkk9CSJzcmRpIjsJCSMgdW5zaWduZWQgc2hpZnQgcmlnaHQgYnkgaW1tZWRpYXRlCQorCSRTSExJPQkic2xkaSI7CQkjIHNoaWZ0IGxlZnQgYnkgaW1tZWRpYXRlCisJJENMUlU9CSJjbHJsZGkiOwkjIGNsZWFyIHVwcGVyIGJpdHMKKwkkSU5TUj0JImluc3JkaSI7CSMgaW5zZXJ0IHJpZ2h0IAorCSRST1RMPQkicm90bGRpIjsJIyByb3RhdGUgbGVmdCBieSBpbW1lZGlhdGUKKwkkVFI9CSJ0ZCI7CQkjIGNvbmRpdGlvbmFsIHRyYXAKK30gZWxzZSB7IGRpZSAibm9uc2Vuc2UgJGZsYXZvdXIiOyB9CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9cHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3BwYy14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHBwYy14bGF0ZS5wbCI7CisKK29wZW4gU1RET1VULCJ8ICReWCAkeGxhdGUgJGZsYXZvdXIgIi5zaGlmdCB8fCBkaWUgImNhbid0IGNhbGwgJHhsYXRlOiAkISI7CisKKyRkYXRhPTw8RU9GOworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjCisjCisjCisjCUZpbGU6CQlwcGMzMi5zCisjCisjCUNyZWF0ZWQgYnk6CVN1cmVzaCBDaGFyaQorIwkJCUlCTSBUaG9tYXMgSi4gV2F0c29uIFJlc2VhcmNoIExpYnJhcnkKKyMJCQlIYXd0aG9ybmUsIE5ZCisjCisjCisjCURlc2NyaXB0aW9uOglPcHRpbWl6ZWQgYXNzZW1ibHkgcm91dGluZXMgZm9yIE9wZW5TU0wgY3J5cHRvCisjCQkJb24gdGhlIDMyIGJpdFBvd2VyUEMgcGxhdGZvcm0uCisjCisjCisjCVZlcnNpb24gSGlzdG9yeQorIworIwkyLiBGaXhlZCBibl9hZGQsYm5fc3ViIGFuZCBibl9kaXZfd29yZHMsIGFkZGVkIGNvbW1lbnRzLAorIwkgICBjbGVhbmVkIHVwIGNvZGUuIEFsc28gbWFkZSBhIHNpbmdsZSB2ZXJzaW9uIHdoaWNoIGNhbgorIwkgICBiZSB1c2VkIGZvciBib3RoIHRoZSBBSVggYW5kIExpbnV4IGNvbXBpbGVycy4gU2VlIE5PVEUKKyMJICAgYmVsb3cuCisjCQkJCTEyLzA1LzAzCQlTdXJlc2ggQ2hhcmkKKyMJCQkod2l0aCBsb3RzIG9mIGhlbHAgZnJvbSkgICAgICAgIEFuZHkgUG9seWFrb3YKKyMjCQorIwkxLiBJbml0aWFsIHZlcnNpb24JMTAvMjAvMDIJCVN1cmVzaCBDaGFyaQorIworIworIwlUaGUgZm9sbG93aW5nIGZpbGUgd29ya3MgZm9yIHRoZSB4bGMsY2MKKyMJYW5kIGdjYyBjb21waWxlcnMuCisjCisjCU5PVEU6CVRvIGdldCB0aGUgZmlsZSB0byBsaW5rIGNvcnJlY3RseSB3aXRoIHRoZSBnY2MgY29tcGlsZXIKKyMJICAgICAgICB5b3UgaGF2ZSB0byBjaGFuZ2UgdGhlIG5hbWVzIG9mIHRoZSByb3V0aW5lcyBhbmQgcmVtb3ZlCisjCQl0aGUgZmlyc3QgLihkb3QpIGNoYXJhY3Rlci4gVGhpcyBzaG91bGQgYXV0b21hdGljYWxseQorIwkJYmUgZG9uZSBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4KKyMKKyMJSGFuZCBvcHRpbWl6ZWQgYXNzZW1ibHkgY29kZSBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lcworIwkKKyMJYm5fc3FyX2NvbWJhNAorIwlibl9zcXJfY29tYmE4CisjCWJuX211bF9jb21iYTQKKyMJYm5fbXVsX2NvbWJhOAorIwlibl9zdWJfd29yZHMKKyMJYm5fYWRkX3dvcmRzCisjCWJuX2Rpdl93b3JkcworIwlibl9zcXJfd29yZHMKKyMJYm5fbXVsX3dvcmRzCisjCWJuX211bF9hZGRfd29yZHMKKyMKKyMJTk9URToJSXQgaXMgcG9zc2libGUgdG8gb3B0aW1pemUgdGhpcyBjb2RlIG1vcmUgZm9yCisjCXNwZWNpZmljIFBvd2VyUEMgb3IgUG93ZXIgYXJjaGl0ZWN0dXJlcy4gT24gdGhlIE5vcnRoc3RhcgorIwlhcmNoaXRlY3R1cmUgdGhlIG9wdGltaXphdGlvbnMgaW4gdGhpcyBmaWxlIGRvCisjCSBOT1QgcHJvdmlkZSBtdWNoIGltcHJvdmVtZW50LgorIworIwlJZiB5b3UgaGF2ZSBjb21tZW50cyBvciBzdWdnZXN0aW9ucyB0byBpbXByb3ZlIGNvZGUgc2VuZAorIwltZSBhIG5vdGUgYXQgc2NoYXJpXEB1cy5pYm0uY29tCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMJRGVmaW5lcyB0byBiZSB1c2VkIGluIHRoZSBhc3NlbWJseSBjb2RlLgorIwkKKyMuc2V0IHIwLDAJIyB3ZSB1c2UgaXQgYXMgc3RvcmFnZSBmb3IgdmFsdWUgb2YgMAorIy5zZXQgU1AsMQkjIHByZXNlcnZlZAorIy5zZXQgUlRPQywyCSMgcHJlc2VydmVkIAorIy5zZXQgcjMsMwkjIDFzdCBhcmd1bWVudC9yZXR1cm4gdmFsdWUKKyMuc2V0IHI0LDQJIyAybmQgYXJndW1lbnQvdm9sYXRpbGUgcmVnaXN0ZXIKKyMuc2V0IHI1LDUJIyAzcmQgYXJndW1lbnQvdm9sYXRpbGUgcmVnaXN0ZXIKKyMuc2V0IHI2LDYJIyAuLi4KKyMuc2V0IHI3LDcKKyMuc2V0IHI4LDgKKyMuc2V0IHI5LDkKKyMuc2V0IHIxMCwxMAorIy5zZXQgcjExLDExCisjLnNldCByMTIsMTIKKyMuc2V0IHIxMywxMwkjIG5vdCB1c2VkLCBub3IgYW55IG90aGVyICJiZWxvdyIgaXQuLi4KKworIwlEZWNsYXJlIGZ1bmN0aW9uIG5hbWVzIHRvIGJlIGdsb2JhbAorIwlOT1RFOglGb3IgZ2NjIHRoZXNlIG5hbWVzIE1VU1QgYmUgY2hhbmdlZCB0byByZW1vdmUKKyMJICAgICAgICB0aGUgZmlyc3QgLiBpLmUuIGZvciBleGFtcGxlIGNoYW5nZSAiLmJuX3Nxcl9jb21iYTQiCisjCQl0byAiYm5fc3FyX2NvbWJhNCIuIFRoaXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZG9uZQorIwkJaW4gdGhlIGJ1aWxkLgorCQorCS5nbG9ibAkuYm5fc3FyX2NvbWJhNAorCS5nbG9ibAkuYm5fc3FyX2NvbWJhOAorCS5nbG9ibAkuYm5fbXVsX2NvbWJhNAorCS5nbG9ibAkuYm5fbXVsX2NvbWJhOAorCS5nbG9ibAkuYm5fc3ViX3dvcmRzCisJLmdsb2JsCS5ibl9hZGRfd29yZHMKKwkuZ2xvYmwJLmJuX2Rpdl93b3JkcworCS5nbG9ibAkuYm5fc3FyX3dvcmRzCisJLmdsb2JsCS5ibl9tdWxfd29yZHMKKwkuZ2xvYmwJLmJuX211bF9hZGRfd29yZHMKKwkKKyMgLnRleHQgc2VjdGlvbgorCQorCS5tYWNoaW5lCSJhbnkiCisKKyMKKyMJTk9URToJVGhlIGZvbGxvd2luZyBsYWJlbCBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvCisjCQkiYm5fc3FyX2NvbWJhNCIgaS5lLiByZW1vdmUgdGhlIGZpcnN0IGRvdAorIwkJZm9yIHRoZSBnY2MgY29tcGlsZXIuIFRoaXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkKKyMJCWRvbmUgaW4gdGhlIGJ1aWxkCisjCisKKy5hbGlnbgk0CisuYm5fc3FyX2NvbWJhNDoKKyMKKyMgT3B0aW1pemVkIHZlcnNpb24gb2YgYm5fc3FyX2NvbWJhNC4KKyMKKyMgdm9pZCBibl9zcXJfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSkKKyMgcjMgY29udGFpbnMgcgorIyByNCBjb250YWlucyBhCisjCisjIEZyZWVseSB1c2UgcmVnaXN0ZXJzIHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEgYXMgZm9sbG93czoJCisjIAorIyByNSxyNiBhcmUgdGhlIHR3byBCTl9VTE9OR3MgYmVpbmcgbXVsdGlwbGllZC4KKyMgcjcscjggYXJlIHRoZSByZXN1bHRzIG9mIHRoZSAzMngzMiBnaXZpbmcgNjQgYml0IG11bHRpcGx5LgorIyByOSxyMTAsIHIxMSBhcmUgdGhlIGVxdWl2YWxlbnRzIG9mIGMxLGMyLCBjMy4KKyMgSGVyZSdzIHRoZSBhc3NlbWJseQorIworIworCXhvcgkJcjAscjAscjAJCSMgc2V0IHIwID0gMC4gVXNlZCBpbiB0aGUgYWRkemUKKwkJCQkJCSMgaW5zdHJ1Y3Rpb25zIGJlbG93CisJCisJCQkJCQkjc3FyX2FkZF9jKGEsMCxjMSxjMixjMykKKwkkTEQJCXI1LGAwKiRCTlNaYChyNCkJCQorCSRVTVVMTAkJcjkscjUscjUJCQorCSRVTVVMSAkJcjEwLHI1LHI1CQkjaW4gZmlyc3QgaXRlcmF0aW9uLiBObyBuZWVkCisJCQkJCQkjdG8gYWRkIHNpbmNlIGMxPWMyPWMzPTAuCisJCQkJCQkjIE5vdGUgYzMocjExKSBpcyBOT1Qgc2V0IHRvIDAKKwkJCQkJCSMgYnV0IHdpbGwgYmUuCisKKwkkU1QJCXI5LGAwKiRCTlNaYChyMykJIyByWzBdPWMxOworCQkJCQkJIyBzcXJfYWRkX2MyKGEsMSwwLGMyLGMzLGMxKTsKKwkkTEQJCXI2LGAxKiRCTlNaYChyNCkJCQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJCQkJCQorCWFkZGMJCXI3LHI3LHI3CQkjIGNvbXB1dGUgKHI3LHI4KT0yKihyNyxyOCkKKwlhZGRlCQlyOCxyOCxyOAorCWFkZHplCQlyOSxyMAkJCSMgY2F0Y2ggY2FycnkgaWYgYW55LgorCQkJCQkJIyByOT0gcjAoPTApIGFuZCBjYXJyeSAKKwkKKwlhZGRjCQlyMTAscjcscjEwCQkjIG5vdyBhZGQgdG8gdGVtcCByZXN1bHQuCisJYWRkemUJCXIxMSxyOCAgICAgICAgICAgICAgICAgICMgcjggYWRkZWQgdG8gcjExIHdoaWNoIGlzIDAgCisJYWRkemUJCXI5LHI5CisJCisJJFNUCQlyMTAsYDEqJEJOU1pgKHIzKQkjclsxXT1jMjsgCisJCQkJCQkjc3FyX2FkZF9jKGEsMSxjMyxjMSxjMikKKwkkVU1VTEwJCXI3LHI2LHI2CisJJFVNVUxICQlyOCxyNixyNgorCWFkZGMJCXIxMSxyNyxyMTEKKwlhZGRlCQlyOSxyOCxyOQorCWFkZHplCQlyMTAscjAKKwkJCQkJCSNzcXJfYWRkX2MyKGEsMiwwLGMzLGMxLGMyKQorCSRMRAkJcjYsYDIqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJCisJYWRkYwkJcjcscjcscjcKKwlhZGRlCQlyOCxyOCxyOAorCWFkZHplCQlyMTAscjEwCisJCisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMTAKKwkkU1QJCXIxMSxgMiokQk5TWmAocjMpCSNyWzJdPWMzIAorCQkJCQkJI3Nxcl9hZGRfYzIoYSwzLDAsYzEsYzIsYzMpOworCSRMRAkJcjYsYDMqJEJOU1pgKHI0KQkJCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYKKwlhZGRjCQlyNyxyNyxyNworCWFkZGUJCXI4LHI4LHI4CisJYWRkemUJCXIxMSxyMAorCQorCWFkZGMJCXI5LHI3LHI5CisJYWRkZQkJcjEwLHI4LHIxMAorCWFkZHplCQlyMTEscjExCisJCQkJCQkjc3FyX2FkZF9jMihhLDIsMSxjMSxjMixjMyk7CisJJExECQlyNSxgMSokQk5TWmAocjQpCisJJExECQlyNixgMiokQk5TWmAocjQpCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYKKwkKKwlhZGRjCQlyNyxyNyxyNworCWFkZGUJCXI4LHI4LHI4CisJYWRkemUJCXIxMSxyMTEKKwlhZGRjCQlyOSxyNyxyOQorCWFkZGUJCXIxMCxyOCxyMTAKKwlhZGR6ZQkJcjExLHIxMQorCSRTVAkJcjksYDMqJEJOU1pgKHIzKQkjclszXT1jMQorCQkJCQkJI3Nxcl9hZGRfYyhhLDIsYzIsYzMsYzEpOworCSRVTVVMTAkJcjcscjYscjYKKwkkVU1VTEgJCXI4LHI2LHI2CisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjAKKwkJCQkJCSNzcXJfYWRkX2MyKGEsMywxLGMyLGMzLGMxKTsKKwkkTEQJCXI2LGAzKiRCTlNaYChyNCkJCQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjcscjcscjcKKwlhZGRlCQlyOCxyOCxyOAorCWFkZHplCQlyOSxyOQorCQorCWFkZGMJCXIxMCxyNyxyMTAKKwlhZGRlCQlyMTEscjgscjExCisJYWRkemUJCXI5LHI5CisJJFNUCQlyMTAsYDQqJEJOU1pgKHIzKQkjcls0XT1jMgorCQkJCQkJI3Nxcl9hZGRfYzIoYSwzLDIsYzMsYzEsYzIpOworCSRMRAkJcjUsYDIqJEJOU1pgKHI0KQkJCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYKKwlhZGRjCQlyNyxyNyxyNworCWFkZGUJCXI4LHI4LHI4CisJYWRkemUJCXIxMCxyMAorCQorCWFkZGMJCXIxMSxyNyxyMTEKKwlhZGRlCQlyOSxyOCxyOQorCWFkZHplCQlyMTAscjEwCisJJFNUCQlyMTEsYDUqJEJOU1pgKHIzKQkjcls1XSA9IGMzCisJCQkJCQkjc3FyX2FkZF9jKGEsMyxjMSxjMixjMyk7CisJJFVNVUxMCQlyNyxyNixyNgkJCisJJFVNVUxICQlyOCxyNixyNgorCWFkZGMJCXI5LHI3LHI5CisJYWRkZQkJcjEwLHI4LHIxMAorCisJJFNUCQlyOSxgNiokQk5TWmAocjMpCSNyWzZdPWMxCisJJFNUCQlyMTAsYDcqJEJOU1pgKHIzKQkjcls3XT1jMgorCWJscgorCS5sb25nCTB4MDAwMDAwMDAKKworIworIwlOT1RFOglUaGUgZm9sbG93aW5nIGxhYmVsIG5hbWUgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKyMJCSJibl9zcXJfY29tYmE4IiBpLmUuIHJlbW92ZSB0aGUgZmlyc3QgZG90CisjCQlmb3IgdGhlIGdjYyBjb21waWxlci4gVGhpcyBzaG91bGQgYmUgYXV0b21hdGljYWxseQorIwkJZG9uZSBpbiB0aGUgYnVpbGQKKyMKKwkKKy5hbGlnbgk0CisuYm5fc3FyX2NvbWJhODoKKyMKKyMgVGhpcyBpcyBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgYm5fc3FyX2NvbWJhOCByb3V0aW5lLgorIyBUaWdodGx5IHVzZXMgdGhlIGFkZGUgaW5zdHJ1Y3Rpb24KKyMKKyMKKyMgdm9pZCBibl9zcXJfY29tYmE4KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSkKKyMgcjMgY29udGFpbnMgcgorIyByNCBjb250YWlucyBhCisjCisjIEZyZWVseSB1c2UgcmVnaXN0ZXJzIHI1LHI2LHI3LHI4LHI5LHIxMCxyMTEgYXMgZm9sbG93czoJCisjIAorIyByNSxyNiBhcmUgdGhlIHR3byBCTl9VTE9OR3MgYmVpbmcgbXVsdGlwbGllZC4KKyMgcjcscjggYXJlIHRoZSByZXN1bHRzIG9mIHRoZSAzMngzMiBnaXZpbmcgNjQgYml0IG11bHRpcGx5LgorIyByOSxyMTAsIHIxMSBhcmUgdGhlIGVxdWl2YWxlbnRzIG9mIGMxLGMyLCBjMy4KKyMKKyMgUG9zc2libGUgb3B0aW1pemF0aW9uIG9mIGxvYWRpbmcgYWxsIDggbG9uZ3Mgb2YgYSBpbnRvIHJlZ2lzdGVycworIyBkb2VzbnQgcHJvdmlkZSBhbnkgc3BlZWR1cAorIyAKKworCXhvcgkJcjAscjAscjAJCSNzZXQgcjAgPSAwLlVzZWQgaW4gYWRkemUKKwkJCQkJCSNpbnN0cnVjdGlvbnMgYmVsb3cuCisKKwkJCQkJCSNzcXJfYWRkX2MoYSwwLGMxLGMyLGMzKTsKKwkkTEQJCXI1LGAwKiRCTlNaYChyNCkKKwkkVU1VTEwJCXI5LHI1LHI1CQkjMXN0IGl0ZXJhdGlvbjoJbm8gY2Fycmllcy4KKwkkVU1VTEgJCXIxMCxyNSxyNQorCSRTVAkJcjksYDAqJEJOU1pgKHIzKQkjIHJbMF09YzE7CisJCQkJCQkjc3FyX2FkZF9jMihhLDEsMCxjMixjMyxjMSk7CisJJExECQlyNixgMSokQk5TWmAocjQpCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYJCisJCisJYWRkYwkJcjEwLHI3LHIxMAkJI2FkZCB0aGUgdHdvIHJlZ2lzdGVyIG51bWJlcgorCWFkZGUJCXIxMSxyOCxyMCAJCSMgKHI4LHI3KSB0byB0aGUgdGhyZWUgcmVnaXN0ZXIKKwlhZGR6ZQkJcjkscjAJCQkjIG51bWJlciAocjkscjExLHIxMCkuTk9URTpyMD0wCisJCisJYWRkYwkJcjEwLHI3LHIxMAkJI2FkZCB0aGUgdHdvIHJlZ2lzdGVyIG51bWJlcgorCWFkZGUJCXIxMSxyOCxyMTEgCQkjIChyOCxyNykgdG8gdGhlIHRocmVlIHJlZ2lzdGVyCisJYWRkemUJCXI5LHI5CQkJIyBudW1iZXIgKHI5LHIxMSxyMTApLgorCQorCSRTVAkJcjEwLGAxKiRCTlNaYChyMykJIyByWzFdPWMyCisJCQkJCisJCQkJCQkjc3FyX2FkZF9jKGEsMSxjMyxjMSxjMik7CisJJFVNVUxMCQlyNyxyNixyNgorCSRVTVVMSAkJcjgscjYscjYKKwlhZGRjCQlyMTEscjcscjExCisJYWRkZQkJcjkscjgscjkKKwlhZGR6ZQkJcjEwLHIwCisJCQkJCQkjc3FyX2FkZF9jMihhLDIsMCxjMyxjMSxjMik7CisJJExECQlyNixgMiokQk5TWmAocjQpCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYKKwkKKwlhZGRjCQlyMTEscjcscjExCisJYWRkZQkJcjkscjgscjkKKwlhZGR6ZQkJcjEwLHIxMAorCQorCWFkZGMJCXIxMSxyNyxyMTEKKwlhZGRlCQlyOSxyOCxyOQorCWFkZHplCQlyMTAscjEwCisJCisJJFNUCQlyMTEsYDIqJEJOU1pgKHIzKQkjclsyXT1jMworCQkJCQkJI3Nxcl9hZGRfYzIoYSwzLDAsYzEsYzIsYzMpOworCSRMRAkJcjYsYDMqJEJOU1pgKHI0KQkjcjYgPSBhWzNdLiByNSBpcyBhbHJlYWR5IGFbMF0uCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYKKwkKKwlhZGRjCQlyOSxyNyxyOQorCWFkZGUJCXIxMCxyOCxyMTAKKwlhZGR6ZQkJcjExLHIwCisJCisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwkJCQkJCSNzcXJfYWRkX2MyKGEsMiwxLGMxLGMyLGMzKTsKKwkkTEQJCXI1LGAxKiRCTlNaYChyNCkKKwkkTEQJCXI2LGAyKiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCQorCWFkZGMJCXI5LHI3LHI5CisJYWRkZQkJcjEwLHI4LHIxMAorCWFkZHplCQlyMTEscjExCisJCisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwkKKwkkU1QJCXI5LGAzKiRCTlNaYChyMykJI3JbM109YzE7CisJCQkJCQkjc3FyX2FkZF9jKGEsMixjMixjMyxjMSk7CisJJFVNVUxMCQlyNyxyNixyNgorCSRVTVVMSAkJcjgscjYscjYKKwkKKwlhZGRjCQlyMTAscjcscjEwCisJYWRkZQkJcjExLHI4LHIxMQorCWFkZHplCQlyOSxyMAorCQkJCQkJI3Nxcl9hZGRfYzIoYSwzLDEsYzIsYzMsYzEpOworCSRMRAkJcjYsYDMqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJCisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjkKKwkKKwlhZGRjCQlyMTAscjcscjEwCisJYWRkZQkJcjExLHI4LHIxMQorCWFkZHplCQlyOSxyOQorCQkJCQkJI3Nxcl9hZGRfYzIoYSw0LDAsYzIsYzMsYzEpOworCSRMRAkJcjUsYDAqJEJOU1pgKHI0KQorCSRMRAkJcjYsYDQqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJCisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjkKKwkKKwlhZGRjCQlyMTAscjcscjEwCisJYWRkZQkJcjExLHI4LHIxMQorCWFkZHplCQlyOSxyOQorCSRTVAkJcjEwLGA0KiRCTlNaYChyMykJI3JbNF09YzI7CisJCQkJCQkjc3FyX2FkZF9jMihhLDUsMCxjMyxjMSxjMik7CisJJExECQlyNixgNSokQk5TWmAocjQpCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYKKwkKKwlhZGRjCQlyMTEscjcscjExCisJYWRkZQkJcjkscjgscjkKKwlhZGR6ZQkJcjEwLHIwCisJCisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMTAKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNCwxLGMzLGMxLGMyKTsKKwkkTEQJCXI1LGAxKiRCTlNaYChyNCkKKwkkTEQJCXI2LGA0KiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCQorCWFkZGMJCXIxMSxyNyxyMTEKKwlhZGRlCQlyOSxyOCxyOQorCWFkZHplCQlyMTAscjEwCisJCisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMTAKKwkJCQkJCSNzcXJfYWRkX2MyKGEsMywyLGMzLGMxLGMyKTsKKwkkTEQJCXI1LGAyKiRCTlNaYChyNCkKKwkkTEQJCXI2LGAzKiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCQorCWFkZGMJCXIxMSxyNyxyMTEKKwlhZGRlCQlyOSxyOCxyOQorCWFkZHplCQlyMTAscjEwCisJCisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMTAKKwkkU1QJCXIxMSxgNSokQk5TWmAocjMpCSNyWzVdPWMzOworCQkJCQkJI3Nxcl9hZGRfYyhhLDMsYzEsYzIsYzMpOworCSRVTVVMTAkJcjcscjYscjYKKwkkVU1VTEgJCXI4LHI2LHI2CisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMAorCQkJCQkJI3Nxcl9hZGRfYzIoYSw0LDIsYzEsYzIsYzMpOworCSRMRAkJcjYsYDQqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJCisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwkKKwlhZGRjCQlyOSxyNyxyOQorCWFkZGUJCXIxMCxyOCxyMTAKKwlhZGR6ZQkJcjExLHIxMQorCQkJCQkJI3Nxcl9hZGRfYzIoYSw1LDEsYzEsYzIsYzMpOworCSRMRAkJcjUsYDEqJEJOU1pgKHI0KQorCSRMRAkJcjYsYDUqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJCisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwkKKwlhZGRjCQlyOSxyNyxyOQorCWFkZGUJCXIxMCxyOCxyMTAKKwlhZGR6ZQkJcjExLHIxMQorCQkJCQkJI3Nxcl9hZGRfYzIoYSw2LDAsYzEsYzIsYzMpOworCSRMRAkJcjUsYDAqJEJOU1pgKHI0KQorCSRMRAkJcjYsYDYqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwlhZGRjCQlyOSxyNyxyOQorCWFkZGUJCXIxMCxyOCxyMTAKKwlhZGR6ZQkJcjExLHIxMQorCSRTVAkJcjksYDYqJEJOU1pgKHIzKQkjcls2XT1jMTsKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNywwLGMyLGMzLGMxKTsKKwkkTEQJCXI2LGA3KiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCQorCWFkZGMJCXIxMCxyNyxyMTAKKwlhZGRlCQlyMTEscjgscjExCisJYWRkemUJCXI5LHIwCisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjkKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNiwxLGMyLGMzLGMxKTsKKwkkTEQJCXI1LGAxKiRCTlNaYChyNCkKKwkkTEQJCXI2LGA2KiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCQorCWFkZGMJCXIxMCxyNyxyMTAKKwlhZGRlCQlyMTEscjgscjExCisJYWRkemUJCXI5LHI5CisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjkKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNSwyLGMyLGMzLGMxKTsKKwkkTEQJCXI1LGAyKiRCTlNaYChyNCkKKwkkTEQJCXI2LGA1KiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCWFkZGMJCXIxMCxyNyxyMTAKKwlhZGRlCQlyMTEscjgscjExCisJYWRkemUJCXI5LHI5CisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjkKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNCwzLGMyLGMzLGMxKTsKKwkkTEQJCXI1LGAzKiRCTlNaYChyNCkKKwkkTEQJCXI2LGA0KiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCQorCWFkZGMJCXIxMCxyNyxyMTAKKwlhZGRlCQlyMTEscjgscjExCisJYWRkemUJCXI5LHI5CisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjkKKwkkU1QJCXIxMCxgNyokQk5TWmAocjMpCSNyWzddPWMyOworCQkJCQkJI3Nxcl9hZGRfYyhhLDQsYzMsYzEsYzIpOworCSRVTVVMTAkJcjcscjYscjYKKwkkVU1VTEgJCXI4LHI2LHI2CisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMAorCQkJCQkJI3Nxcl9hZGRfYzIoYSw1LDMsYzMsYzEsYzIpOworCSRMRAkJcjYsYDUqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMTAKKwlhZGRjCQlyMTEscjcscjExCisJYWRkZQkJcjkscjgscjkKKwlhZGR6ZQkJcjEwLHIxMAorCQkJCQkJI3Nxcl9hZGRfYzIoYSw2LDIsYzMsYzEsYzIpOworCSRMRAkJcjUsYDIqJEJOU1pgKHI0KQorCSRMRAkJcjYsYDYqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMTAKKwkKKwlhZGRjCQlyMTEscjcscjExCisJYWRkZQkJcjkscjgscjkKKwlhZGR6ZQkJcjEwLHIxMAorCQkJCQkJI3Nxcl9hZGRfYzIoYSw3LDEsYzMsYzEsYzIpOworCSRMRAkJcjUsYDEqJEJOU1pgKHI0KQorCSRMRAkJcjYsYDcqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMTAKKwlhZGRjCQlyMTEscjcscjExCisJYWRkZQkJcjkscjgscjkKKwlhZGR6ZQkJcjEwLHIxMAorCSRTVAkJcjExLGA4KiRCTlNaYChyMykJI3JbOF09YzM7CisJCQkJCQkjc3FyX2FkZF9jMihhLDcsMixjMSxjMixjMyk7CisJJExECQlyNSxgMiokQk5TWmAocjQpCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYKKwkKKwlhZGRjCQlyOSxyNyxyOQorCWFkZGUJCXIxMCxyOCxyMTAKKwlhZGR6ZQkJcjExLHIwCisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNiwzLGMxLGMyLGMzKTsKKwkkTEQJCXI1LGAzKiRCTlNaYChyNCkKKwkkTEQJCXI2LGA2KiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCWFkZGMJCXI5LHI3LHI5CisJYWRkZQkJcjEwLHI4LHIxMAorCWFkZHplCQlyMTEscjExCisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNSw0LGMxLGMyLGMzKTsKKwkkTEQJCXI1LGA0KiRCTlNaYChyNCkKKwkkTEQJCXI2LGA1KiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCWFkZGMJCXI5LHI3LHI5CisJYWRkZQkJcjEwLHI4LHIxMAorCWFkZHplCQlyMTEscjExCisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwkkU1QJCXI5LGA5KiRCTlNaYChyMykJI3JbOV09YzE7CisJCQkJCQkjc3FyX2FkZF9jKGEsNSxjMixjMyxjMSk7CisJJFVNVUxMCQlyNyxyNixyNgorCSRVTVVMSAkJcjgscjYscjYKKwlhZGRjCQlyMTAscjcscjEwCisJYWRkZQkJcjExLHI4LHIxMQorCWFkZHplCQlyOSxyMAorCQkJCQkJI3Nxcl9hZGRfYzIoYSw2LDQsYzIsYzMsYzEpOworCSRMRAkJcjYsYDYqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjkKKwlhZGRjCQlyMTAscjcscjEwCisJYWRkZQkJcjExLHI4LHIxMQorCWFkZHplCQlyOSxyOQorCQkJCQkJI3Nxcl9hZGRfYzIoYSw3LDMsYzIsYzMsYzEpOworCSRMRAkJcjUsYDMqJEJOU1pgKHI0KQorCSRMRAkJcjYsYDcqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjEwLHI3LHIxMAorCWFkZGUJCXIxMSxyOCxyMTEKKwlhZGR6ZQkJcjkscjkKKwlhZGRjCQlyMTAscjcscjEwCisJYWRkZQkJcjExLHI4LHIxMQorCWFkZHplCQlyOSxyOQorCSRTVAkJcjEwLGAxMCokQk5TWmAocjMpCSNyWzEwXT1jMjsKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNyw0LGMzLGMxLGMyKTsKKwkkTEQJCXI1LGA0KiRCTlNaYChyNCkKKwkkVU1VTEwJCXI3LHI1LHI2CisJJFVNVUxICQlyOCxyNSxyNgorCWFkZGMJCXIxMSxyNyxyMTEKKwlhZGRlCQlyOSxyOCxyOQorCWFkZHplCQlyMTAscjAKKwlhZGRjCQlyMTEscjcscjExCisJYWRkZQkJcjkscjgscjkKKwlhZGR6ZQkJcjEwLHIxMAorCQkJCQkJI3Nxcl9hZGRfYzIoYSw2LDUsYzMsYzEsYzIpOworCSRMRAkJcjUsYDUqJEJOU1pgKHI0KQorCSRMRAkJcjYsYDYqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJYWRkemUJCXIxMCxyMTAKKwlhZGRjCQlyMTEscjcscjExCisJYWRkZQkJcjkscjgscjkKKwlhZGR6ZQkJcjEwLHIxMAorCSRTVAkJcjExLGAxMSokQk5TWmAocjMpCSNyWzExXT1jMzsKKwkJCQkJCSNzcXJfYWRkX2MoYSw2LGMxLGMyLGMzKTsKKwkkVU1VTEwJCXI3LHI2LHI2CisJJFVNVUxICQlyOCxyNixyNgorCWFkZGMJCXI5LHI3LHI5CisJYWRkZQkJcjEwLHI4LHIxMAorCWFkZHplCQlyMTEscjAKKwkJCQkJCSNzcXJfYWRkX2MyKGEsNyw1LGMxLGMyLGMzKQorCSRMRAkJcjYsYDcqJEJOU1pgKHI0KQorCSRVTVVMTAkJcjcscjUscjYKKwkkVU1VTEgJCXI4LHI1LHI2CisJYWRkYwkJcjkscjcscjkKKwlhZGRlCQlyMTAscjgscjEwCisJYWRkemUJCXIxMSxyMTEKKwlhZGRjCQlyOSxyNyxyOQorCWFkZGUJCXIxMCxyOCxyMTAKKwlhZGR6ZQkJcjExLHIxMQorCSRTVAkJcjksYDEyKiRCTlNaYChyMykJI3JbMTJdPWMxOworCQorCQkJCQkJI3Nxcl9hZGRfYzIoYSw3LDYsYzIsYzMsYzEpCisJJExECQlyNSxgNiokQk5TWmAocjQpCisJJFVNVUxMCQlyNyxyNSxyNgorCSRVTVVMSAkJcjgscjUscjYKKwlhZGRjCQlyMTAscjcscjEwCisJYWRkZQkJcjExLHI4LHIxMQorCWFkZHplCQlyOSxyMAorCWFkZGMJCXIxMCxyNyxyMTAKKwlhZGRlCQlyMTEscjgscjExCisJYWRkemUJCXI5LHI5CisJJFNUCQlyMTAsYDEzKiRCTlNaYChyMykJI3JbMTNdPWMyOworCQkJCQkJI3Nxcl9hZGRfYyhhLDcsYzMsYzEsYzIpOworCSRVTVVMTAkJcjcscjYscjYKKwkkVU1VTEgJCXI4LHI2LHI2CisJYWRkYwkJcjExLHI3LHIxMQorCWFkZGUJCXI5LHI4LHI5CisJJFNUCQlyMTEsYDE0KiRCTlNaYChyMykJI3JbMTRdPWMzOworCSRTVAkJcjksIGAxNSokQk5TWmAocjMpCSNyWzE1XT1jMTsKKworCisJYmxyCisKKwkubG9uZwkweDAwMDAwMDAwCisKKyMKKyMJTk9URToJVGhlIGZvbGxvd2luZyBsYWJlbCBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvCisjCQkiYm5fbXVsX2NvbWJhNCIgaS5lLiByZW1vdmUgdGhlIGZpcnN0IGRvdAorIwkJZm9yIHRoZSBnY2MgY29tcGlsZXIuIFRoaXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkKKyMJCWRvbmUgaW4gdGhlIGJ1aWxkCisjCisKKy5hbGlnbgk0CisuYm5fbXVsX2NvbWJhNDoKKyMKKyMgVGhpcyBpcyBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgYm5fbXVsX2NvbWJhNCByb3V0aW5lLgorIworIyB2b2lkIGJuX211bF9jb21iYTQoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikKKyMgcjMgY29udGFpbnMgcgorIyByNCBjb250YWlucyBhCisjIHI1IGNvbnRhaW5zIGIKKyMgcjYsIHI3IGFyZSB0aGUgMiBCTl9VTE9OR3MgYmVpbmcgbXVsdGlwbGllZC4KKyMgcjgsIHI5IGFyZSB0aGUgcmVzdWx0cyBvZiB0aGUgMzJ4MzIgZ2l2aW5nIDY0IG11bHRpcGx5LgorIyByMTAsIHIxMSwgcjEyIGFyZSB0aGUgZXF1aXZhbGVudHMgb2YgYzEsIGMyLCBhbmQgYzMuCisjCisJeG9yCXIwLHIwLHIwCQkjcjA9MC4gVXNlZCBpbiBhZGR6ZSBiZWxvdy4KKwkJCQkJI211bF9hZGRfYyhhWzBdLGJbMF0sYzEsYzIsYzMpOworCSRMRAlyNixgMCokQk5TWmAocjQpCQkKKwkkTEQJcjcsYDAqJEJOU1pgKHI1KQkJCisJJFVNVUxMCXIxMCxyNixyNwkJCisJJFVNVUxICXIxMSxyNixyNwkJCisJJFNUCXIxMCxgMCokQk5TWmAocjMpCSNyWzBdPWMxCisJCQkJCSNtdWxfYWRkX2MoYVswXSxiWzFdLGMyLGMzLGMxKTsKKwkkTEQJcjcsYDEqJEJOU1pgKHI1KQkJCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjgscjExCisJYWRkZQlyMTIscjkscjAKKwlhZGR6ZQlyMTAscjAKKwkJCQkJI211bF9hZGRfYyhhWzFdLGJbMF0sYzIsYzMsYzEpOworCSRMRAlyNiwgYDEqJEJOU1pgKHI0KQkJCisJJExECXI3LCBgMCokQk5TWmAocjUpCQkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMSxyOCxyMTEKKwlhZGRlCXIxMixyOSxyMTIKKwlhZGR6ZQlyMTAscjEwCisJJFNUCXIxMSxgMSokQk5TWmAocjMpCSNyWzFdPWMyCisJCQkJCSNtdWxfYWRkX2MoYVsyXSxiWzBdLGMzLGMxLGMyKTsKKwkkTEQJcjYsYDIqJEJOU1pgKHI0KQkJCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTIscjgscjEyCisJYWRkZQlyMTAscjkscjEwCisJYWRkemUJcjExLHIwCisJCQkJCSNtdWxfYWRkX2MoYVsxXSxiWzFdLGMzLGMxLGMyKTsKKwkkTEQJcjYsYDEqJEJOU1pgKHI0KQkJCisJJExECXI3LGAxKiRCTlNaYChyNSkJCQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHI4LHIxMgorCWFkZGUJcjEwLHI5LHIxMAorCWFkZHplCXIxMSxyMTEKKwkJCQkJI211bF9hZGRfYyhhWzBdLGJbMl0sYzMsYzEsYzIpOworCSRMRAlyNixgMCokQk5TWmAocjQpCQkKKwkkTEQJcjcsYDIqJEJOU1pgKHI1KQkJCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTIscjgscjEyCisJYWRkZQlyMTAscjkscjEwCisJYWRkemUJcjExLHIxMQorCSRTVAlyMTIsYDIqJEJOU1pgKHIzKQkjclsyXT1jMworCQkJCQkjbXVsX2FkZF9jKGFbMF0sYlszXSxjMSxjMixjMyk7CisJJExECXI3LGAzKiRCTlNaYChyNSkJCQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHI4LHIxMAorCWFkZGUJcjExLHI5LHIxMQorCWFkZHplCXIxMixyMAorCQkJCQkjbXVsX2FkZF9jKGFbMV0sYlsyXSxjMSxjMixjMyk7CisJJExECXI2LGAxKiRCTlNaYChyNCkKKwkkTEQJcjcsYDIqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHI4LHIxMAorCWFkZGUJcjExLHI5LHIxMQorCWFkZHplCXIxMixyMTIKKwkJCQkJI211bF9hZGRfYyhhWzJdLGJbMV0sYzEsYzIsYzMpOworCSRMRAlyNixgMiokQk5TWmAocjQpCisJJExECXI3LGAxKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyOCxyMTAKKwlhZGRlCXIxMSxyOSxyMTEKKwlhZGR6ZQlyMTIscjEyCisJCQkJCSNtdWxfYWRkX2MoYVszXSxiWzBdLGMxLGMyLGMzKTsKKwkkTEQJcjYsYDMqJEJOU1pgKHI0KQorCSRMRAlyNyxgMCokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTAscjgscjEwCisJYWRkZQlyMTEscjkscjExCisJYWRkemUJcjEyLHIxMgorCSRTVAlyMTAsYDMqJEJOU1pgKHIzKQkjclszXT1jMQorCQkJCQkjbXVsX2FkZF9jKGFbM10sYlsxXSxjMixjMyxjMSk7CisJJExECXI3LGAxKiRCTlNaYChyNSkJCQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjExLHI4LHIxMQorCWFkZGUJcjEyLHI5LHIxMgorCWFkZHplCXIxMCxyMAorCQkJCQkjbXVsX2FkZF9jKGFbMl0sYlsyXSxjMixjMyxjMSk7CisJJExECXI2LGAyKiRCTlNaYChyNCkKKwkkTEQJcjcsYDIqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjExLHI4LHIxMQorCWFkZGUJcjEyLHI5LHIxMgorCWFkZHplCXIxMCxyMTAKKwkJCQkJI211bF9hZGRfYyhhWzFdLGJbM10sYzIsYzMsYzEpOworCSRMRAlyNixgMSokQk5TWmAocjQpCisJJExECXI3LGAzKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMSxyOCxyMTEKKwlhZGRlCXIxMixyOSxyMTIKKwlhZGR6ZQlyMTAscjEwCisJJFNUCXIxMSxgNCokQk5TWmAocjMpCSNyWzRdPWMyCisJCQkJCSNtdWxfYWRkX2MoYVsyXSxiWzNdLGMzLGMxLGMyKTsKKwkkTEQJcjYsYDIqJEJOU1pgKHI0KQkJCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTIscjgscjEyCisJYWRkZQlyMTAscjkscjEwCisJYWRkemUJcjExLHIwCisJCQkJCSNtdWxfYWRkX2MoYVszXSxiWzJdLGMzLGMxLGMyKTsKKwkkTEQJcjYsYDMqJEJOU1pgKHI0KQorCSRMRAlyNyxgMiokQk5TWmAocjQpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTIscjgscjEyCisJYWRkZQlyMTAscjkscjEwCisJYWRkemUJcjExLHIxMQorCSRTVAlyMTIsYDUqJEJOU1pgKHIzKQkjcls1XT1jMworCQkJCQkjbXVsX2FkZF9jKGFbM10sYlszXSxjMSxjMixjMyk7CisJJExECXI3LGAzKiRCTlNaYChyNSkJCQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHI4LHIxMAorCWFkZGUJcjExLHI5LHIxMQorCisJJFNUCXIxMCxgNiokQk5TWmAocjMpCSNyWzZdPWMxCisJJFNUCXIxMSxgNyokQk5TWmAocjMpCSNyWzddPWMyCisJYmxyCisJLmxvbmcJMHgwMDAwMDAwMAorCisjCisjCU5PVEU6CVRoZSBmb2xsb3dpbmcgbGFiZWwgbmFtZSBzaG91bGQgYmUgY2hhbmdlZCB0bworIwkJImJuX211bF9jb21iYTgiIGkuZS4gcmVtb3ZlIHRoZSBmaXJzdCBkb3QKKyMJCWZvciB0aGUgZ2NjIGNvbXBpbGVyLiBUaGlzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5CisjCQlkb25lIGluIHRoZSBidWlsZAorIworCQorLmFsaWduCTQKKy5ibl9tdWxfY29tYmE4OgorIworIyBPcHRpbWl6ZWQgdmVyc2lvbiBvZiB0aGUgYm5fbXVsX2NvbWJhOCByb3V0aW5lLgorIworIyB2b2lkIGJuX211bF9jb21iYTgoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikKKyMgcjMgY29udGFpbnMgcgorIyByNCBjb250YWlucyBhCisjIHI1IGNvbnRhaW5zIGIKKyMgcjYsIHI3IGFyZSB0aGUgMiBCTl9VTE9OR3MgYmVpbmcgbXVsdGlwbGllZC4KKyMgcjgsIHI5IGFyZSB0aGUgcmVzdWx0cyBvZiB0aGUgMzJ4MzIgZ2l2aW5nIDY0IG11bHRpcGx5LgorIyByMTAsIHIxMSwgcjEyIGFyZSB0aGUgZXF1aXZhbGVudHMgb2YgYzEsIGMyLCBhbmQgYzMuCisjCisJeG9yCXIwLHIwLHIwCQkjcjA9MC4gVXNlZCBpbiBhZGR6ZSBiZWxvdy4KKwkKKwkJCQkJI211bF9hZGRfYyhhWzBdLGJbMF0sYzEsYzIsYzMpOworCSRMRAlyNixgMCokQk5TWmAocjQpCSNhWzBdCisJJExECXI3LGAwKiRCTlNaYChyNSkJI2JbMF0KKwkkVU1VTEwJcjEwLHI2LHI3CisJJFVNVUxICXIxMSxyNixyNworCSRTVAlyMTAsYDAqJEJOU1pgKHIzKQkjclswXT1jMTsKKwkJCQkJI211bF9hZGRfYyhhWzBdLGJbMV0sYzIsYzMsYzEpOworCSRMRAlyNyxgMSokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkemUJcjEyLHI5CQkJIyBzaW5jZSB3ZSBkaWRudCBzZXQgcjEyIHRvIHplcm8gYmVmb3JlLgorCWFkZHplCXIxMCxyMAorCQkJCQkjbXVsX2FkZF9jKGFbMV0sYlswXSxjMixjMyxjMSk7CisJJExECXI2LGAxKiRCTlNaYChyNCkKKwkkTEQJcjcsYDAqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjExLHIxMSxyOAorCWFkZGUJcjEyLHIxMixyOQorCWFkZHplCXIxMCxyMTAKKwkkU1QJcjExLGAxKiRCTlNaYChyMykJI3JbMV09YzI7CisJCQkJCSNtdWxfYWRkX2MoYVsyXSxiWzBdLGMzLGMxLGMyKTsKKwkkTEQJcjYsYDIqJEJOU1pgKHI0KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMAorCQkJCQkjbXVsX2FkZF9jKGFbMV0sYlsxXSxjMyxjMSxjMik7CisJJExECXI2LGAxKiRCTlNaYChyNCkKKwkkTEQJcjcsYDEqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkJCQkJI211bF9hZGRfYyhhWzBdLGJbMl0sYzMsYzEsYzIpOworCSRMRAlyNixgMCokQk5TWmAocjQpCisJJExECXI3LGAyKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMixyMTIscjgKKwlhZGRlCXIxMCxyMTAscjkKKwlhZGR6ZQlyMTEscjExCisJJFNUCXIxMixgMiokQk5TWmAocjMpCSNyWzJdPWMzOworCQkJCQkjbXVsX2FkZF9jKGFbMF0sYlszXSxjMSxjMixjMyk7CisJJExECXI3LGAzKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyMTAscjgKKwlhZGRlCXIxMSxyMTEscjkKKwlhZGR6ZQlyMTIscjAKKwkJCQkJI211bF9hZGRfYyhhWzFdLGJbMl0sYzEsYzIsYzMpOworCSRMRAlyNixgMSokQk5TWmAocjQpCisJJExECXI3LGAyKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyMTAscjgKKwlhZGRlCXIxMSxyMTEscjkKKwlhZGR6ZQlyMTIscjEyCisJCQorCQkJCQkjbXVsX2FkZF9jKGFbMl0sYlsxXSxjMSxjMixjMyk7CisJJExECXI2LGAyKiRCTlNaYChyNCkKKwkkTEQJcjcsYDEqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHIxMCxyOAorCWFkZGUJcjExLHIxMSxyOQorCWFkZHplCXIxMixyMTIKKwkJCQkJI211bF9hZGRfYyhhWzNdLGJbMF0sYzEsYzIsYzMpOworCSRMRAlyNixgMyokQk5TWmAocjQpCisJJExECXI3LGAwKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyMTAscjgKKwlhZGRlCXIxMSxyMTEscjkKKwlhZGR6ZQlyMTIscjEyCisJJFNUCXIxMCxgMyokQk5TWmAocjMpCSNyWzNdPWMxOworCQkJCQkjbXVsX2FkZF9jKGFbNF0sYlswXSxjMixjMyxjMSk7CisJJExECXI2LGA0KiRCTlNaYChyNCkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMSxyMTEscjgKKwlhZGRlCXIxMixyMTIscjkKKwlhZGR6ZQlyMTAscjAKKwkJCQkJI211bF9hZGRfYyhhWzNdLGJbMV0sYzIsYzMsYzEpOworCSRMRAlyNixgMyokQk5TWmAocjQpCisJJExECXI3LGAxKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMSxyMTEscjgKKwlhZGRlCXIxMixyMTIscjkKKwlhZGR6ZQlyMTAscjEwCisJCQkJCSNtdWxfYWRkX2MoYVsyXSxiWzJdLGMyLGMzLGMxKTsKKwkkTEQJcjYsYDIqJEJOU1pgKHI0KQorCSRMRAlyNyxgMiokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIxMAorCQkJCQkjbXVsX2FkZF9jKGFbMV0sYlszXSxjMixjMyxjMSk7CisJJExECXI2LGAxKiRCTlNaYChyNCkKKwkkTEQJcjcsYDMqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjExLHIxMSxyOAorCWFkZGUJcjEyLHIxMixyOQorCWFkZHplCXIxMCxyMTAKKwkJCQkJI211bF9hZGRfYyhhWzBdLGJbNF0sYzIsYzMsYzEpOworCSRMRAlyNixgMCokQk5TWmAocjQpCisJJExECXI3LGA0KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMSxyMTEscjgKKwlhZGRlCXIxMixyMTIscjkKKwlhZGR6ZQlyMTAscjEwCisJJFNUCXIxMSxgNCokQk5TWmAocjMpCSNyWzRdPWMyOworCQkJCQkjbXVsX2FkZF9jKGFbMF0sYls1XSxjMyxjMSxjMik7CisJJExECXI3LGA1KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMixyMTIscjgKKwlhZGRlCXIxMCxyMTAscjkKKwlhZGR6ZQlyMTEscjAKKwkJCQkJI211bF9hZGRfYyhhWzFdLGJbNF0sYzMsYzEsYzIpOworCSRMRAlyNixgMSokQk5TWmAocjQpCQkKKwkkTEQJcjcsYDQqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkJCQkJI211bF9hZGRfYyhhWzJdLGJbM10sYzMsYzEsYzIpOworCSRMRAlyNixgMiokQk5TWmAocjQpCQkKKwkkTEQJcjcsYDMqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkJCQkJI211bF9hZGRfYyhhWzNdLGJbMl0sYzMsYzEsYzIpOworCSRMRAlyNixgMyokQk5TWmAocjQpCQkKKwkkTEQJcjcsYDIqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkJCQkJI211bF9hZGRfYyhhWzRdLGJbMV0sYzMsYzEsYzIpOworCSRMRAlyNixgNCokQk5TWmAocjQpCQkKKwkkTEQJcjcsYDEqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkJCQkJI211bF9hZGRfYyhhWzVdLGJbMF0sYzMsYzEsYzIpOworCSRMRAlyNixgNSokQk5TWmAocjQpCQkKKwkkTEQJcjcsYDAqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkkU1QJcjEyLGA1KiRCTlNaYChyMykJI3JbNV09YzM7CisJCQkJCSNtdWxfYWRkX2MoYVs2XSxiWzBdLGMxLGMyLGMzKTsKKwkkTEQJcjYsYDYqJEJOU1pgKHI0KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHIxMCxyOAorCWFkZGUJcjExLHIxMSxyOQorCWFkZHplCXIxMixyMAorCQkJCQkjbXVsX2FkZF9jKGFbNV0sYlsxXSxjMSxjMixjMyk7CisJJExECXI2LGA1KiRCTlNaYChyNCkKKwkkTEQJcjcsYDEqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHIxMCxyOAorCWFkZGUJcjExLHIxMSxyOQorCWFkZHplCXIxMixyMTIKKwkJCQkJI211bF9hZGRfYyhhWzRdLGJbMl0sYzEsYzIsYzMpOworCSRMRAlyNixgNCokQk5TWmAocjQpCisJJExECXI3LGAyKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyMTAscjgKKwlhZGRlCXIxMSxyMTEscjkKKwlhZGR6ZQlyMTIscjEyCisJCQkJCSNtdWxfYWRkX2MoYVszXSxiWzNdLGMxLGMyLGMzKTsKKwkkTEQJcjYsYDMqJEJOU1pgKHI0KQorCSRMRAlyNyxgMyokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTAscjEwLHI4CisJYWRkZQlyMTEscjExLHI5CisJYWRkemUJcjEyLHIxMgorCQkJCQkjbXVsX2FkZF9jKGFbMl0sYls0XSxjMSxjMixjMyk7CisJJExECXI2LGAyKiRCTlNaYChyNCkKKwkkTEQJcjcsYDQqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHIxMCxyOAorCWFkZGUJcjExLHIxMSxyOQorCWFkZHplCXIxMixyMTIKKwkJCQkJI211bF9hZGRfYyhhWzFdLGJbNV0sYzEsYzIsYzMpOworCSRMRAlyNixgMSokQk5TWmAocjQpCisJJExECXI3LGA1KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyMTAscjgKKwlhZGRlCXIxMSxyMTEscjkKKwlhZGR6ZQlyMTIscjEyCisJCQkJCSNtdWxfYWRkX2MoYVswXSxiWzZdLGMxLGMyLGMzKTsKKwkkTEQJcjYsYDAqJEJOU1pgKHI0KQorCSRMRAlyNyxgNiokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTAscjEwLHI4CisJYWRkZQlyMTEscjExLHI5CisJYWRkemUJcjEyLHIxMgorCSRTVAlyMTAsYDYqJEJOU1pgKHIzKQkjcls2XT1jMTsKKwkJCQkJI211bF9hZGRfYyhhWzBdLGJbN10sYzIsYzMsYzEpOworCSRMRAlyNyxgNyokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIwCisJCQkJCSNtdWxfYWRkX2MoYVsxXSxiWzZdLGMyLGMzLGMxKTsKKwkkTEQJcjYsYDEqJEJOU1pgKHI0KQorCSRMRAlyNyxgNiokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIxMAorCQkJCQkjbXVsX2FkZF9jKGFbMl0sYls1XSxjMixjMyxjMSk7CisJJExECXI2LGAyKiRCTlNaYChyNCkKKwkkTEQJcjcsYDUqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjExLHIxMSxyOAorCWFkZGUJcjEyLHIxMixyOQorCWFkZHplCXIxMCxyMTAKKwkJCQkJI211bF9hZGRfYyhhWzNdLGJbNF0sYzIsYzMsYzEpOworCSRMRAlyNixgMyokQk5TWmAocjQpCisJJExECXI3LGA0KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMSxyMTEscjgKKwlhZGRlCXIxMixyMTIscjkKKwlhZGR6ZQlyMTAscjEwCisJCQkJCSNtdWxfYWRkX2MoYVs0XSxiWzNdLGMyLGMzLGMxKTsKKwkkTEQJcjYsYDQqJEJOU1pgKHI0KQorCSRMRAlyNyxgMyokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIxMAorCQkJCQkjbXVsX2FkZF9jKGFbNV0sYlsyXSxjMixjMyxjMSk7CisJJExECXI2LGA1KiRCTlNaYChyNCkKKwkkTEQJcjcsYDIqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjExLHIxMSxyOAorCWFkZGUJcjEyLHIxMixyOQorCWFkZHplCXIxMCxyMTAKKwkJCQkJI211bF9hZGRfYyhhWzZdLGJbMV0sYzIsYzMsYzEpOworCSRMRAlyNixgNiokQk5TWmAocjQpCisJJExECXI3LGAxKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMSxyMTEscjgKKwlhZGRlCXIxMixyMTIscjkKKwlhZGR6ZQlyMTAscjEwCisJCQkJCSNtdWxfYWRkX2MoYVs3XSxiWzBdLGMyLGMzLGMxKTsKKwkkTEQJcjYsYDcqJEJOU1pgKHI0KQorCSRMRAlyNyxgMCokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIxMAorCSRTVAlyMTEsYDcqJEJOU1pgKHIzKQkjcls3XT1jMjsKKwkJCQkJI211bF9hZGRfYyhhWzddLGJbMV0sYzMsYzEsYzIpOworCSRMRAlyNyxgMSokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTIscjEyLHI4CisJYWRkZQlyMTAscjEwLHI5CisJYWRkemUJcjExLHIwCisJCQkJCSNtdWxfYWRkX2MoYVs2XSxiWzJdLGMzLGMxLGMyKTsKKwkkTEQJcjYsYDYqJEJOU1pgKHI0KQorCSRMRAlyNyxgMiokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTIscjEyLHI4CisJYWRkZQlyMTAscjEwLHI5CisJYWRkemUJcjExLHIxMQorCQkJCQkjbXVsX2FkZF9jKGFbNV0sYlszXSxjMyxjMSxjMik7CisJJExECXI2LGA1KiRCTlNaYChyNCkKKwkkTEQJcjcsYDMqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkJCQkJI211bF9hZGRfYyhhWzRdLGJbNF0sYzMsYzEsYzIpOworCSRMRAlyNixgNCokQk5TWmAocjQpCisJJExECXI3LGA0KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMixyMTIscjgKKwlhZGRlCXIxMCxyMTAscjkKKwlhZGR6ZQlyMTEscjExCisJCQkJCSNtdWxfYWRkX2MoYVszXSxiWzVdLGMzLGMxLGMyKTsKKwkkTEQJcjYsYDMqJEJOU1pgKHI0KQorCSRMRAlyNyxgNSokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTIscjEyLHI4CisJYWRkZQlyMTAscjEwLHI5CisJYWRkemUJcjExLHIxMQorCQkJCQkjbXVsX2FkZF9jKGFbMl0sYls2XSxjMyxjMSxjMik7CisJJExECXI2LGAyKiRCTlNaYChyNCkKKwkkTEQJcjcsYDYqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkJCQkJI211bF9hZGRfYyhhWzFdLGJbN10sYzMsYzEsYzIpOworCSRMRAlyNixgMSokQk5TWmAocjQpCisJJExECXI3LGA3KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMixyMTIscjgKKwlhZGRlCXIxMCxyMTAscjkKKwlhZGR6ZQlyMTEscjExCisJJFNUCXIxMixgOCokQk5TWmAocjMpCSNyWzhdPWMzOworCQkJCQkjbXVsX2FkZF9jKGFbMl0sYls3XSxjMSxjMixjMyk7CisJJExECXI2LGAyKiRCTlNaYChyNCkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyMTAscjgKKwlhZGRlCXIxMSxyMTEscjkKKwlhZGR6ZQlyMTIscjAKKwkJCQkJI211bF9hZGRfYyhhWzNdLGJbNl0sYzEsYzIsYzMpOworCSRMRAlyNixgMyokQk5TWmAocjQpCisJJExECXI3LGA2KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyMTAscjgKKwlhZGRlCXIxMSxyMTEscjkKKwlhZGR6ZQlyMTIscjEyCisJCQkJCSNtdWxfYWRkX2MoYVs0XSxiWzVdLGMxLGMyLGMzKTsKKwkkTEQJcjYsYDQqJEJOU1pgKHI0KQorCSRMRAlyNyxgNSokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTAscjEwLHI4CisJYWRkZQlyMTEscjExLHI5CisJYWRkemUJcjEyLHIxMgorCQkJCQkjbXVsX2FkZF9jKGFbNV0sYls0XSxjMSxjMixjMyk7CisJJExECXI2LGA1KiRCTlNaYChyNCkKKwkkTEQJcjcsYDQqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHIxMCxyOAorCWFkZGUJcjExLHIxMSxyOQorCWFkZHplCXIxMixyMTIKKwkJCQkJI211bF9hZGRfYyhhWzZdLGJbM10sYzEsYzIsYzMpOworCSRMRAlyNixgNiokQk5TWmAocjQpCisJJExECXI3LGAzKiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMCxyMTAscjgKKwlhZGRlCXIxMSxyMTEscjkKKwlhZGR6ZQlyMTIscjEyCisJCQkJCSNtdWxfYWRkX2MoYVs3XSxiWzJdLGMxLGMyLGMzKTsKKwkkTEQJcjYsYDcqJEJOU1pgKHI0KQorCSRMRAlyNyxgMiokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTAscjEwLHI4CisJYWRkZQlyMTEscjExLHI5CisJYWRkemUJcjEyLHIxMgorCSRTVAlyMTAsYDkqJEJOU1pgKHIzKQkjcls5XT1jMTsKKwkJCQkJI211bF9hZGRfYyhhWzddLGJbM10sYzIsYzMsYzEpOworCSRMRAlyNyxgMyokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIwCisJCQkJCSNtdWxfYWRkX2MoYVs2XSxiWzRdLGMyLGMzLGMxKTsKKwkkTEQJcjYsYDYqJEJOU1pgKHI0KQorCSRMRAlyNyxgNCokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIxMAorCQkJCQkjbXVsX2FkZF9jKGFbNV0sYls1XSxjMixjMyxjMSk7CisJJExECXI2LGA1KiRCTlNaYChyNCkKKwkkTEQJcjcsYDUqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjExLHIxMSxyOAorCWFkZGUJcjEyLHIxMixyOQorCWFkZHplCXIxMCxyMTAKKwkJCQkJI211bF9hZGRfYyhhWzRdLGJbNl0sYzIsYzMsYzEpOworCSRMRAlyNixgNCokQk5TWmAocjQpCisJJExECXI3LGA2KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMSxyMTEscjgKKwlhZGRlCXIxMixyMTIscjkKKwlhZGR6ZQlyMTAscjEwCisJCQkJCSNtdWxfYWRkX2MoYVszXSxiWzddLGMyLGMzLGMxKTsKKwkkTEQJcjYsYDMqJEJOU1pgKHI0KQorCSRMRAlyNyxgNyokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIxMAorCSRTVAlyMTEsYDEwKiRCTlNaYChyMykJI3JbMTBdPWMyOworCQkJCQkjbXVsX2FkZF9jKGFbNF0sYls3XSxjMyxjMSxjMik7CisJJExECXI2LGA0KiRCTlNaYChyNCkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMixyMTIscjgKKwlhZGRlCXIxMCxyMTAscjkKKwlhZGR6ZQlyMTEscjAKKwkJCQkJI211bF9hZGRfYyhhWzVdLGJbNl0sYzMsYzEsYzIpOworCSRMRAlyNixgNSokQk5TWmAocjQpCisJJExECXI3LGA2KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMixyMTIscjgKKwlhZGRlCXIxMCxyMTAscjkKKwlhZGR6ZQlyMTEscjExCisJCQkJCSNtdWxfYWRkX2MoYVs2XSxiWzVdLGMzLGMxLGMyKTsKKwkkTEQJcjYsYDYqJEJOU1pgKHI0KQorCSRMRAlyNyxgNSokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTIscjEyLHI4CisJYWRkZQlyMTAscjEwLHI5CisJYWRkemUJcjExLHIxMQorCQkJCQkjbXVsX2FkZF9jKGFbN10sYls0XSxjMyxjMSxjMik7CisJJExECXI2LGA3KiRCTlNaYChyNCkKKwkkTEQJcjcsYDQqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEyLHIxMixyOAorCWFkZGUJcjEwLHIxMCxyOQorCWFkZHplCXIxMSxyMTEKKwkkU1QJcjEyLGAxMSokQk5TWmAocjMpCSNyWzExXT1jMzsKKwkJCQkJI211bF9hZGRfYyhhWzddLGJbNV0sYzEsYzIsYzMpOworCSRMRAlyNyxgNSokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTAscjEwLHI4CisJYWRkZQlyMTEscjExLHI5CisJYWRkemUJcjEyLHIwCisJCQkJCSNtdWxfYWRkX2MoYVs2XSxiWzZdLGMxLGMyLGMzKTsKKwkkTEQJcjYsYDYqJEJOU1pgKHI0KQorCSRMRAlyNyxgNiokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTAscjEwLHI4CisJYWRkZQlyMTEscjExLHI5CisJYWRkemUJcjEyLHIxMgorCQkJCQkjbXVsX2FkZF9jKGFbNV0sYls3XSxjMSxjMixjMyk7CisJJExECXI2LGA1KiRCTlNaYChyNCkKKwkkTEQJcjcsYDcqJEJOU1pgKHI1KQorCSRVTVVMTAlyOCxyNixyNworCSRVTVVMSAlyOSxyNixyNworCWFkZGMJcjEwLHIxMCxyOAorCWFkZGUJcjExLHIxMSxyOQorCWFkZHplCXIxMixyMTIKKwkkU1QJcjEwLGAxMiokQk5TWmAocjMpCSNyWzEyXT1jMTsKKwkJCQkJI211bF9hZGRfYyhhWzZdLGJbN10sYzIsYzMsYzEpOworCSRMRAlyNixgNiokQk5TWmAocjQpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIwCisJCQkJCSNtdWxfYWRkX2MoYVs3XSxiWzZdLGMyLGMzLGMxKTsKKwkkTEQJcjYsYDcqJEJOU1pgKHI0KQorCSRMRAlyNyxgNiokQk5TWmAocjUpCisJJFVNVUxMCXI4LHI2LHI3CisJJFVNVUxICXI5LHI2LHI3CisJYWRkYwlyMTEscjExLHI4CisJYWRkZQlyMTIscjEyLHI5CisJYWRkemUJcjEwLHIxMAorCSRTVAlyMTEsYDEzKiRCTlNaYChyMykJI3JbMTNdPWMyOworCQkJCQkjbXVsX2FkZF9jKGFbN10sYls3XSxjMyxjMSxjMik7CisJJExECXI3LGA3KiRCTlNaYChyNSkKKwkkVU1VTEwJcjgscjYscjcKKwkkVU1VTEgJcjkscjYscjcKKwlhZGRjCXIxMixyMTIscjgKKwlhZGRlCXIxMCxyMTAscjkKKwkkU1QJcjEyLGAxNCokQk5TWmAocjMpCSNyWzE0XT1jMzsKKwkkU1QJcjEwLGAxNSokQk5TWmAocjMpCSNyWzE1XT1jMTsKKwlibHIKKwkubG9uZwkweDAwMDAwMDAwCisKKyMKKyMJTk9URToJVGhlIGZvbGxvd2luZyBsYWJlbCBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvCisjCQkiYm5fc3ViX3dvcmRzIiBpLmUuIHJlbW92ZSB0aGUgZmlyc3QgZG90CisjCQlmb3IgdGhlIGdjYyBjb21waWxlci4gVGhpcyBzaG91bGQgYmUgYXV0b21hdGljYWxseQorIwkJZG9uZSBpbiB0aGUgYnVpbGQKKyMKKyMKKy5hbGlnbgk0CisuYm5fc3ViX3dvcmRzOgorIworIwlIYW5kY29kZWQgdmVyc2lvbiBvZiBibl9zdWJfd29yZHMKKyMKKyNCTl9VTE9ORyBibl9zdWJfd29yZHMoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYiwgaW50IG4pCisjCisjCXIzID0gcgorIwlyNCA9IGEKKyMJcjUgPSBiCisjCXI2ID0gbgorIworIyAgICAgICBOb3RlOglObyBsb29wIHVucm9sbGluZyBkb25lIHNpbmNlIHRoaXMgaXMgbm90IGEgcGVyZm9ybWFuY2UKKyMgICAgICAgICAgICAgICBjcml0aWNhbCBsb29wLgorCisJeG9yCXIwLHIwLHIwCSNzZXQgcjAgPSAwCisjCisjCWNoZWNrIGZvciByNiA9IDAgQU5EIHNldCBjYXJyeSBiaXQuCisjCisJc3ViZmMuCXI3LHIwLHI2ICAgICAgICAjIElmIHI2IGlzIDAgdGhlbiByZXN1bHQgaXMgMC4KKwkJCQkjIGlmIHI2ID4gMCB0aGVuIHJlc3VsdCAhPTAKKwkJCQkjIEluIGVpdGhlciBjYXNlIGNhcnJ5IGJpdCBpcyBzZXQuCisJYmVxCUxwcGNhc21fc3ViX2FkaW9zCisJYWRkaQlyNCxyNCwtJEJOU1oKKwlhZGRpCXIzLHIzLC0kQk5TWgorCWFkZGkJcjUscjUsLSRCTlNaCisJbXRjdHIJcjYKK0xwcGNhc21fc3ViX21haW5sb29wOgkKKwkkTERVCXI3LCRCTlNaKHI0KQorCSRMRFUJcjgsJEJOU1oocjUpCisJc3ViZmUJcjYscjgscjcJIyByNiA9IHI3K2NhcnJ5IGJpdCArIG9uZXNjb21wbGVtZW50KHI4KQorCQkJCSMgaWYgY2FycnkgPSAxIHRoaXMgaXMgcjctcjguIEVsc2UgaXQKKwkJCQkjIGlzIHI3LXI4IC0xIGFzIHdlIG5lZWQuCisJJFNUVQlyNiwkQk5TWihyMykKKwliZG56LQlMcHBjYXNtX3N1Yl9tYWlubG9vcAorTHBwY2FzbV9zdWJfYWRpb3M6CQorCXN1YmZ6ZQlyMyxyMAkJIyBpZiBjYXJyeSBiaXQgaXMgc2V0IHRoZW4gcjMgPSAwIGVsc2UgLTEKKwlhbmRpLglyMyxyMywxICAgICAgICAgIyBrZWVwIG9ubHkgbGFzdCBiaXQuCisJYmxyCisJLmxvbmcJMHgwMDAwMDAwMAorCisKKyMKKyMJTk9URToJVGhlIGZvbGxvd2luZyBsYWJlbCBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvCisjCQkiYm5fYWRkX3dvcmRzIiBpLmUuIHJlbW92ZSB0aGUgZmlyc3QgZG90CisjCQlmb3IgdGhlIGdjYyBjb21waWxlci4gVGhpcyBzaG91bGQgYmUgYXV0b21hdGljYWxseQorIwkJZG9uZSBpbiB0aGUgYnVpbGQKKyMKKworLmFsaWduCTQKKy5ibl9hZGRfd29yZHM6CisjCisjCUhhbmRjb2RlZCB2ZXJzaW9uIG9mIGJuX2FkZF93b3JkcworIworI0JOX1VMT05HIGJuX2FkZF93b3JkcyhCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIEJOX1VMT05HICpiLCBpbnQgbikKKyMKKyMJcjMgPSByCisjCXI0ID0gYQorIwlyNSA9IGIKKyMJcjYgPSBuCisjCisjICAgICAgIE5vdGU6CU5vIGxvb3AgdW5yb2xsaW5nIGRvbmUgc2luY2UgdGhpcyBpcyBub3QgYSBwZXJmb3JtYW5jZQorIyAgICAgICAgICAgICAgIGNyaXRpY2FsIGxvb3AuCisKKwl4b3IJcjAscjAscjAKKyMKKyMJY2hlY2sgZm9yIHI2ID0gMC4gSXMgdGhpcyBuZWVkZWQ/CisjCisJYWRkaWMuCXI2LHI2LDAJCSN0ZXN0IHI2IGFuZCBjbGVhciBjYXJyeSBiaXQuCisJYmVxCUxwcGNhc21fYWRkX2FkaW9zCisJYWRkaQlyNCxyNCwtJEJOU1oKKwlhZGRpCXIzLHIzLC0kQk5TWgorCWFkZGkJcjUscjUsLSRCTlNaCisJbXRjdHIJcjYKK0xwcGNhc21fYWRkX21haW5sb29wOgkKKwkkTERVCXI3LCRCTlNaKHI0KQorCSRMRFUJcjgsJEJOU1oocjUpCisJYWRkZQlyOCxyNyxyOAorCSRTVFUJcjgsJEJOU1oocjMpCisJYmRuei0JTHBwY2FzbV9hZGRfbWFpbmxvb3AKK0xwcGNhc21fYWRkX2FkaW9zOgkKKwlhZGR6ZQlyMyxyMAkJCSNyZXR1cm4gY2FycnkgYml0LgorCWJscgorCS5sb25nCTB4MDAwMDAwMDAKKworIworIwlOT1RFOglUaGUgZm9sbG93aW5nIGxhYmVsIG5hbWUgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKyMJCSJibl9kaXZfd29yZHMiIGkuZS4gcmVtb3ZlIHRoZSBmaXJzdCBkb3QKKyMJCWZvciB0aGUgZ2NjIGNvbXBpbGVyLiBUaGlzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5CisjCQlkb25lIGluIHRoZSBidWlsZAorIworCisuYWxpZ24JNAorLmJuX2Rpdl93b3JkczoKKyMKKyMJVGhpcyBpcyBhIGNsZWFuZWQgdXAgdmVyc2lvbiBvZiBjb2RlIGdlbmVyYXRlZCBieQorIwl0aGUgQUlYIGNvbXBpbGVyLiBUaGUgb25seSBvcHRpbWl6YXRpb24gaXMgdG8gdXNlCisjCXRoZSBQUEMgaW5zdHJ1Y3Rpb24gdG8gY291bnQgbGVhZGluZyB6ZXJvcyBpbnN0ZWFkCisjCW9mIGNhbGwgdG8gbnVtX2JpdHNfd29yZC4gU2luY2UgdGhpcyB3YXMgY29tcGlsZWQKKyMJb25seSBhdCBsZXZlbCAtTzIgd2UgY2FuIHBvc3NpYmx5IHNxdWVlemUgaXQgbW9yZT8KKyMJCisjCXIzID0gaAorIwlyNCA9IGwKKyMJcjUgPSBkCisJCisJJFVDTVBJCTAscjUsMAkJCSMgY29tcGFyZSByNSBhbmQgMAorCWJuZQlMcHBjYXNtX2RpdjEJCSMgcHJvY2VlZCBpZiBkIT0wCisJbGkJcjMsLTEJCQkjIGQ9MCByZXR1cm4gLTEKKwlibHIKK0xwcGNhc21fZGl2MToKKwl4b3IJcjAscjAscjAJCSNyMD0wCisJbGkJcjgsJEJJVFMKKwkkQ05UTFouCXI3LHI1CQkJI3I3ID0gbnVtIGxlYWRpbmcgMHMgaW4gZC4KKwliZXEJTHBwY2FzbV9kaXYyCQkjcHJvY2VlZCBpZiBubyBsZWFkaW5nIHplcm9zCisJc3ViZglyOCxyNyxyOAkJI3I4ID0gQk5fbnVtX2JpdHNfd29yZChkKQorCSRTSFIuCXI5LHIzLHI4CQkjYXJlIHRoZXJlIGFueSBiaXRzIGFib3ZlIHI4J3RoPworCSRUUgkxNixyOSxyMAkJI2lmIHRoZXJlJ3JlLCBzaWduYWwgdG8gZHVtcCBjb3JlLi4uCitMcHBjYXNtX2RpdjI6CisJJFVDTVAJMCxyMyxyNQkJCSNoPj1kPworCWJsdAlMcHBjYXNtX2RpdjMJCSNnb3RvIExwcGNhc21fZGl2MyBpZiBub3QKKwlzdWJmCXIzLHI1LHIzCQkjaC09ZCA7IAorTHBwY2FzbV9kaXYzOgkJCQkjcjcgPSBCTl9CSVRTMi1pLiBzbyByNz1pCisJY21waQkwLDAscjcsMAkJIyBpcyAoaSA9PSAwKT8KKwliZXEJTHBwY2FzbV9kaXY0CisJJFNITAlyMyxyMyxyNwkJIyBoID0gKGg8PCBpKQorCSRTSFIJcjgscjQscjgJCSMgcjggPSAobCA+PiBCTl9CSVRTMiAtaSkKKwkkU0hMCXI1LHI1LHI3CQkjIGQ8PD1pCisJb3IJcjMscjMscjgJCSMgaCA9IChoPDxpKXwobD4+KEJOX0JJVFMyLWkpKQorCSRTSEwJcjQscjQscjcJCSMgbCA8PD1pCitMcHBjYXNtX2RpdjQ6CisJJFNIUkkJcjkscjUsYCRCSVRTLzJgCQkjIHI5ID0gZGgKKwkJCQkJIyBkbCB3aWxsIGJlIGNvbXB1dGVkIHdoZW4gbmVlZGVkCisJCQkJCSMgYXMgaXQgc2F2ZXMgcmVnaXN0ZXJzLgorCWxpCXI2LDIJCQkjcjY9MgorCW10Y3RyCXI2CQkJI2NvdW50ZXIgd2lsbCBiZSBpbiBjb3VudC4KK0xwcGNhc21fZGl2b3V0ZXJsb29wOiAKKwkkU0hSSQlyOCxyMyxgJEJJVFMvMmAJCSNyOCA9IChoPj5CTl9CSVRTNCkKKwkkU0hSSQlyMTEscjQsYCRCSVRTLzJgCSNyMTE9IChsJkJOX01BU0syaCk+PkJOX0JJVFM0CisJCQkJCSMgY29tcHV0ZSBoZXJlIGZvciBpbm5lcmxvb3AuCisJJFVDTVAJMCxyOCxyOQkJCSMgaXMgKGg+PkJOX0JJVFM0KT09ZGgKKwlibmUJTHBwY2FzbV9kaXY1CQkjIGdvdG8gTHBwY2FzbV9kaXY1IGlmIG5vdAorCisJbGkJcjgsLTEKKwkkQ0xSVQlyOCxyOCxgJEJJVFMvMmAJCSNxID0gQk5fTUFTSzJsIAorCWIJTHBwY2FzbV9kaXY2CitMcHBjYXNtX2RpdjU6CisJJFVESVYJcjgscjMscjkJCSNxID0gaC9kaAorTHBwY2FzbV9kaXY2OgorCSRVTVVMTAlyMTIscjkscjgJCSN0aCA9IHEqZGgKKwkkQ0xSVQlyMTAscjUsYCRCSVRTLzJgCSNyMTA9ZGwKKwkkVU1VTEwJcjYscjgscjEwCQkjdGwgPSBxKmRsCisJCitMcHBjYXNtX2RpdmlubmVybG9vcDoKKwlzdWJmCXIxMCxyMTIscjMJCSN0ID0gaCAtdGgKKwkkU0hSSQlyNyxyMTAsYCRCSVRTLzJgCSNyNz0gKHQgJkJOX01BU0sySCksIHNvcnQgb2YuLi4KKwlhZGRpYy4JcjcscjcsMAkJCSN0ZXN0IGlmIHI3ID09IDAuIHVzZWQgYmVsb3cuCisJCQkJCSMgbm93IHdhbnQgdG8gY29tcHV0ZQorCQkJCQkjIHI3ID0gKHQ8PEJOX0JJVFM0KXwoKGwmQk5fTUFTSzJoKT4+Qk5fQklUUzQpCisJCQkJCSMgdGhlIGZvbGxvd2luZyAyIGluc3RydWN0aW9ucyBkbyB0aGF0CisJJFNITEkJcjcscjEwLGAkQklUUy8yYAkjIHI3ID0gKHQ8PEJOX0JJVFM0KQorCW9yCXI3LHI3LHIxMQkJIyByN3w9KChsJkJOX01BU0syaCk+PkJOX0JJVFM0KQorCSRVQ01QCWNyMSxyNixyNwkJIyBjb21wYXJlICh0bCA8PSByNykKKwlibmUJTHBwY2FzbV9kaXZpbm5lcmV4aXQKKwlibGUJY3IxLExwcGNhc21fZGl2aW5uZXJleGl0CisJYWRkaQlyOCxyOCwtMQkJI3EtLQorCXN1YmYJcjEyLHI5LHIxMgkJI3RoIC09ZGgKKwkkQ0xSVQlyMTAscjUsYCRCSVRTLzJgCSNyMTA9ZGwuIHQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpbiBsb29wLgorCXN1YmYJcjYscjEwLHI2CQkjdGwgLT1kbAorCWIJTHBwY2FzbV9kaXZpbm5lcmxvb3AKK0xwcGNhc21fZGl2aW5uZXJleGl0OgorCSRTSFJJCXIxMCxyNixgJEJJVFMvMmAJI3Q9KHRsPj5CTl9CSVRTNCkKKwkkU0hMSQlyMTEscjYsYCRCSVRTLzJgCSN0bD0odGw8PEJOX0JJVFM0KSZCTl9NQVNLMmg7CisJJFVDTVAJY3IxLHI0LHIxMQkJIyBjb21wYXJlIGwgYW5kIHRsCisJYWRkCXIxMixyMTIscjEwCQkjIHRoKz10CisJYmdlCWNyMSxMcHBjYXNtX2RpdjcJIyBpZiAobD49dGwpIGdvdG8gTHBwY2FzbV9kaXY3CisJYWRkaQlyMTIscjEyLDEJCSMgdGgrKworTHBwY2FzbV9kaXY3OgorCXN1YmYJcjExLHIxMSxyNAkJI3IxMT1sLXRsCisJJFVDTVAJY3IxLHIzLHIxMgkJI2NvbXBhcmUgaCBhbmQgdGgKKwliZ2UJY3IxLExwcGNhc21fZGl2OAkjaWYgKGg+PXRoKSBnb3RvIExwcGNhc21fZGl2OAorCWFkZGkJcjgscjgsLTEJCSMgcS0tCisJYWRkCXIzLHI1LHIzCQkjIGgrPWQKK0xwcGNhc21fZGl2ODoKKwlzdWJmCXIxMixyMTIscjMJCSNyMTIgPSBoLXRoCisJJFNITEkJcjQscjExLGAkQklUUy8yYAkjbD0obCZCTl9NQVNLMmwpPDxCTl9CSVRTNAorCQkJCQkjIHdhbnQgdG8gY29tcHV0ZQorCQkJCQkjIGggPSAoKGg8PEJOX0JJVFM0KXwobD4+Qk5fQklUUzQpKSZCTl9NQVNLMgorCQkJCQkjIHRoZSBmb2xsb3dpbmcgMiBpbnN0cnVjdGlvbnMgd2lsbCBkbyB0aGlzLgorCSRJTlNSCXIxMSxyMTIsYCRCSVRTLzJgLGAkQklUUy8yYAkjIHIxMSBpcyB0aGUgdmFsdWUgd2Ugd2FudCByb3RhdGVkICRCSVRTLzIuCisJJFJPVEwJcjMscjExLGAkQklUUy8yYAkjIHJvdGF0ZSBieSAkQklUUy8yIGFuZCBzdG9yZSBpbiByMworCWJkeglMcHBjYXNtX2RpdjkJCSNpZiAoY291bnQ9PTApIGJyZWFrIDsKKwkkU0hMSQlyMCxyOCxgJEJJVFMvMmAJCSNyZXQgPXE8PEJOX0JJVFM0CisJYglMcHBjYXNtX2Rpdm91dGVybG9vcAorTHBwY2FzbV9kaXY5OgorCW9yCXIzLHI4LHIwCisJYmxyCisJLmxvbmcJMHgwMDAwMDAwMAorCisjCisjCU5PVEU6CVRoZSBmb2xsb3dpbmcgbGFiZWwgbmFtZSBzaG91bGQgYmUgY2hhbmdlZCB0bworIwkJImJuX3Nxcl93b3JkcyIgaS5lLiByZW1vdmUgdGhlIGZpcnN0IGRvdAorIwkJZm9yIHRoZSBnY2MgY29tcGlsZXIuIFRoaXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkKKyMJCWRvbmUgaW4gdGhlIGJ1aWxkCisjCisuYWxpZ24JNAorLmJuX3Nxcl93b3JkczoKKyMKKyMJT3B0aW1pemVkIHZlcnNpb24gb2YgYm5fc3FyX3dvcmRzCisjCisjCXZvaWQgYm5fc3FyX3dvcmRzKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgaW50IG4pCisjCisjCXIzID0gcgorIwlyNCA9IGEKKyMJcjUgPSBuCisjCisjCXI2ID0gYVtpXS4KKyMJcjcscjggPSBwcm9kdWN0LgorIworIwlObyB1bnJvbGxpbmcgZG9uZSBoZXJlLiBOb3QgcGVyZm9ybWFuY2UgY3JpdGljYWwuCisKKwlhZGRpYy4JcjUscjUsMAkJCSN0ZXN0IHI1LgorCWJlcQlMcHBjYXNtX3Nxcl9hZGlvcworCWFkZGkJcjQscjQsLSRCTlNaCisJYWRkaQlyMyxyMywtJEJOU1oKKwltdGN0cglyNQorTHBwY2FzbV9zcXJfbWFpbmxvb3A6CQorCQkJCQkjc3FyKHJbMF0sclsxXSxhWzBdKTsKKwkkTERVCXI2LCRCTlNaKHI0KQorCSRVTVVMTAlyNyxyNixyNgorCSRVTVVMSCAgcjgscjYscjYKKwkkU1RVCXI3LCRCTlNaKHIzKQorCSRTVFUJcjgsJEJOU1oocjMpCisJYmRuei0JTHBwY2FzbV9zcXJfbWFpbmxvb3AKK0xwcGNhc21fc3FyX2FkaW9zOgkKKwlibHIKKwkubG9uZwkweDAwMDAwMDAwCisKKworIworIwlOT1RFOglUaGUgZm9sbG93aW5nIGxhYmVsIG5hbWUgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKyMJCSJibl9tdWxfd29yZHMiIGkuZS4gcmVtb3ZlIHRoZSBmaXJzdCBkb3QKKyMJCWZvciB0aGUgZ2NjIGNvbXBpbGVyLiBUaGlzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5CisjCQlkb25lIGluIHRoZSBidWlsZAorIworCisuYWxpZ24JNAkKKy5ibl9tdWxfd29yZHM6CisjCisjIEJOX1VMT05HIGJuX211bF93b3JkcyhCTl9VTE9ORyAqcnAsIEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdykKKyMKKyMgcjMgPSBycAorIyByNCA9IGFwCisjIHI1ID0gbnVtCisjIHI2ID0gdworCXhvcglyMCxyMCxyMAorCXhvcglyMTIscjEyLHIxMgkJIyB1c2VkIGZvciBjYXJyeQorCXJsd2lubS4JcjcscjUsMzAsMiwzMQkJIyBudW0gPj4gMgorCWJlcQlMcHBjYXNtX213X1JFTQorCW10Y3RyCXI3CitMcHBjYXNtX213X0xPT1A6CQorCQkJCQkjbXVsKHJwWzBdLGFwWzBdLHcsYzEpOworCSRMRAlyOCxgMCokQk5TWmAocjQpCisJJFVNVUxMCXI5LHI2LHI4CisJJFVNVUxIICByMTAscjYscjgKKwlhZGRjCXI5LHI5LHIxMgorCSNhZGR6ZQlyMTAscjEwCQkJI2NhcnJ5IGlzIE5PVCBpZ25vcmVkLgorCQkJCQkjd2lsbCBiZSB0YWtlbiBjYXJlIG9mCisJCQkJCSNpbiBzZWNvbmQgc3BpbiBiZWxvdworCQkJCQkjdXNpbmcgYWRkZS4KKwkkU1QJcjksYDAqJEJOU1pgKHIzKQorCQkJCQkjbXVsKHJwWzFdLGFwWzFdLHcsYzEpOworCSRMRAlyOCxgMSokQk5TWmAocjQpCQorCSRVTVVMTAlyMTEscjYscjgKKwkkVU1VTEggIHIxMixyNixyOAorCWFkZGUJcjExLHIxMSxyMTAKKwkjYWRkemUJcjEyLHIxMgorCSRTVAlyMTEsYDEqJEJOU1pgKHIzKQorCQkJCQkjbXVsKHJwWzJdLGFwWzJdLHcsYzEpOworCSRMRAlyOCxgMiokQk5TWmAocjQpCisJJFVNVUxMCXI5LHI2LHI4CisJJFVNVUxIICByMTAscjYscjgKKwlhZGRlCXI5LHI5LHIxMgorCSNhZGR6ZQlyMTAscjEwCisJJFNUCXI5LGAyKiRCTlNaYChyMykKKwkJCQkJI211bF9hZGQocnBbM10sYXBbM10sdyxjMSk7CisJJExECXI4LGAzKiRCTlNaYChyNCkKKwkkVU1VTEwJcjExLHI2LHI4CisJJFVNVUxIICByMTIscjYscjgKKwlhZGRlCXIxMSxyMTEscjEwCisJYWRkemUJcjEyLHIxMgkJCSN0aGlzIHNwaW4gd2UgY29sbGVjdCBjYXJyeSBpbnRvCisJCQkJCSNyMTIKKwkkU1QJcjExLGAzKiRCTlNaYChyMykKKwkKKwlhZGRpCXIzLHIzLGA0KiRCTlNaYAorCWFkZGkJcjQscjQsYDQqJEJOU1pgCisJYmRuei0JTHBwY2FzbV9td19MT09QCisKK0xwcGNhc21fbXdfUkVNOgorCWFuZGkuCXI1LHI1LDB4MworCWJlcQlMcHBjYXNtX213X09WRVIKKwkJCQkJI211bChycFswXSxhcFswXSx3LGMxKTsKKwkkTEQJcjgsYDAqJEJOU1pgKHI0KQorCSRVTVVMTAlyOSxyNixyOAorCSRVTVVMSCAgcjEwLHI2LHI4CisJYWRkYwlyOSxyOSxyMTIKKwlhZGR6ZQlyMTAscjEwCisJJFNUCXI5LGAwKiRCTlNaYChyMykKKwlhZGRpCXIxMixyMTAsMAorCQorCWFkZGkJcjUscjUsLTEKKwljbXBsaQkwLDAscjUsMAorCWJlcQlMcHBjYXNtX213X09WRVIKKworCQorCQkJCQkjbXVsKHJwWzFdLGFwWzFdLHcsYzEpOworCSRMRAlyOCxgMSokQk5TWmAocjQpCQorCSRVTVVMTAlyOSxyNixyOAorCSRVTVVMSCAgcjEwLHI2LHI4CisJYWRkYwlyOSxyOSxyMTIKKwlhZGR6ZQlyMTAscjEwCisJJFNUCXI5LGAxKiRCTlNaYChyMykKKwlhZGRpCXIxMixyMTAsMAorCQorCWFkZGkJcjUscjUsLTEKKwljbXBsaQkwLDAscjUsMAorCWJlcQlMcHBjYXNtX213X09WRVIKKwkKKwkJCQkJI211bF9hZGQocnBbMl0sYXBbMl0sdyxjMSk7CisJJExECXI4LGAyKiRCTlNaYChyNCkKKwkkVU1VTEwJcjkscjYscjgKKwkkVU1VTEggIHIxMCxyNixyOAorCWFkZGMJcjkscjkscjEyCisJYWRkemUJcjEwLHIxMAorCSRTVAlyOSxgMiokQk5TWmAocjMpCisJYWRkaQlyMTIscjEwLDAKKwkJCitMcHBjYXNtX213X09WRVI6CQorCWFkZGkJcjMscjEyLDAKKwlibHIKKwkubG9uZwkweDAwMDAwMDAwCisKKyMKKyMJTk9URToJVGhlIGZvbGxvd2luZyBsYWJlbCBuYW1lIHNob3VsZCBiZSBjaGFuZ2VkIHRvCisjCQkiYm5fbXVsX2FkZF93b3JkcyIgaS5lLiByZW1vdmUgdGhlIGZpcnN0IGRvdAorIwkJZm9yIHRoZSBnY2MgY29tcGlsZXIuIFRoaXMgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkKKyMJCWRvbmUgaW4gdGhlIGJ1aWxkCisjCisKKy5hbGlnbgk0CisuYm5fbXVsX2FkZF93b3JkczoKKyMKKyMgQk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdykKKyMKKyMgcjMgPSBycAorIyByNCA9IGFwCisjIHI1ID0gbnVtCisjIHI2ID0gdworIworIyBlbXBpcmljYWwgZXZpZGVuY2Ugc3VnZ2VzdHMgdGhhdCB1bnJvbGxlZCB2ZXJzaW9uIHBlcmZvcm1zIGJlc3QhIQorIworCXhvcglyMCxyMCxyMAkJI3IwID0gMAorCXhvcglyMTIscjEyLHIxMiAgCQkjcjEyID0gMCAuIHVzZWQgZm9yIGNhcnJ5CQkKKwlybHdpbm0uCXI3LHI1LDMwLDIsMzEJCSMgbnVtID4+IDIKKwliZXEJTHBwY2FzbV9tYXdfbGVmdG92ZXIJIyBpZiAobnVtIDwgNCkgZ28gTFBQQ0FTTV9tYXdfbGVmdG92ZXIKKwltdGN0cglyNworTHBwY2FzbV9tYXdfbWFpbmxvb3A6CQorCQkJCQkjbXVsX2FkZChycFswXSxhcFswXSx3LGMxKTsKKwkkTEQJcjgsYDAqJEJOU1pgKHI0KQorCSRMRAlyMTEsYDAqJEJOU1pgKHIzKQorCSRVTVVMTAlyOSxyNixyOAorCSRVTVVMSCAgcjEwLHI2LHI4CisJYWRkYwlyOSxyOSxyMTIJCSNyMTIgaXMgY2FycnkuCisJYWRkemUJcjEwLHIxMAorCWFkZGMJcjkscjkscjExCisJI2FkZHplCXIxMCxyMTAKKwkJCQkJI3RoZSBhYm92ZSBpbnN0cnVjdGlvbiBhZGR6ZQorCQkJCQkjaXMgTk9UIG5lZWRlZC4gQ2Fycnkgd2lsbCBOT1QKKwkJCQkJI2JlIGlnbm9yZWQuIEl0J3Mgbm90IGFmZmVjdGVkCisJCQkJCSNieSBtdWx0aXBseSBhbmQgd2lsbCBiZSBjb2xsZWN0ZWQKKwkJCQkJI2luIHRoZSBuZXh0IHNwaW4KKwkkU1QJcjksYDAqJEJOU1pgKHIzKQorCQorCQkJCQkjbXVsX2FkZChycFsxXSxhcFsxXSx3LGMxKTsKKwkkTEQJcjgsYDEqJEJOU1pgKHI0KQkKKwkkTEQJcjksYDEqJEJOU1pgKHIzKQorCSRVTVVMTAlyMTEscjYscjgKKwkkVU1VTEggIHIxMixyNixyOAorCWFkZGUJcjExLHIxMSxyMTAJCSNyMTAgaXMgY2FycnkuCisJYWRkemUJcjEyLHIxMgorCWFkZGMJcjExLHIxMSxyOQorCSNhZGR6ZQlyMTIscjEyCisJJFNUCXIxMSxgMSokQk5TWmAocjMpCisJCisJCQkJCSNtdWxfYWRkKHJwWzJdLGFwWzJdLHcsYzEpOworCSRMRAlyOCxgMiokQk5TWmAocjQpCisJJFVNVUxMCXI5LHI2LHI4CisJJExECXIxMSxgMiokQk5TWmAocjMpCisJJFVNVUxIICByMTAscjYscjgKKwlhZGRlCXI5LHI5LHIxMgorCWFkZHplCXIxMCxyMTAKKwlhZGRjCXI5LHI5LHIxMQorCSNhZGR6ZQlyMTAscjEwCisJJFNUCXI5LGAyKiRCTlNaYChyMykKKwkKKwkJCQkJI211bF9hZGQocnBbM10sYXBbM10sdyxjMSk7CisJJExECXI4LGAzKiRCTlNaYChyNCkKKwkkVU1VTEwJcjExLHI2LHI4CisJJExECXI5LGAzKiRCTlNaYChyMykKKwkkVU1VTEggIHIxMixyNixyOAorCWFkZGUJcjExLHIxMSxyMTAKKwlhZGR6ZQlyMTIscjEyCisJYWRkYwlyMTEscjExLHI5CisJYWRkemUJcjEyLHIxMgorCSRTVAlyMTEsYDMqJEJOU1pgKHIzKQorCWFkZGkJcjMscjMsYDQqJEJOU1pgCisJYWRkaQlyNCxyNCxgNCokQk5TWmAKKwliZG56LQlMcHBjYXNtX21hd19tYWlubG9vcAorCQorTHBwY2FzbV9tYXdfbGVmdG92ZXI6CisJYW5kaS4JcjUscjUsMHgzCisJYmVxCUxwcGNhc21fbWF3X2FkaW9zCisJYWRkaQlyMyxyMywtJEJOU1oKKwlhZGRpCXI0LHI0LC0kQk5TWgorCQkJCQkjbXVsX2FkZChycFswXSxhcFswXSx3LGMxKTsKKwltdGN0cglyNQorCSRMRFUJcjgsJEJOU1oocjQpCisJJFVNVUxMCXI5LHI2LHI4CisJJFVNVUxIICByMTAscjYscjgKKwkkTERVCXIxMSwkQk5TWihyMykKKwlhZGRjCXI5LHI5LHIxMQorCWFkZHplCXIxMCxyMTAKKwlhZGRjCXI5LHI5LHIxMgorCWFkZHplCXIxMixyMTAKKwkkU1QJcjksMChyMykKKwkKKwliZHoJTHBwY2FzbV9tYXdfYWRpb3MKKwkJCQkJI211bF9hZGQocnBbMV0sYXBbMV0sdyxjMSk7CisJJExEVQlyOCwkQk5TWihyNCkJCisJJFVNVUxMCXI5LHI2LHI4CisJJFVNVUxIICByMTAscjYscjgKKwkkTERVCXIxMSwkQk5TWihyMykKKwlhZGRjCXI5LHI5LHIxMQorCWFkZHplCXIxMCxyMTAKKwlhZGRjCXI5LHI5LHIxMgorCWFkZHplCXIxMixyMTAKKwkkU1QJcjksMChyMykKKwkKKwliZHoJTHBwY2FzbV9tYXdfYWRpb3MKKwkJCQkJI211bF9hZGQocnBbMl0sYXBbMl0sdyxjMSk7CisJJExEVQlyOCwkQk5TWihyNCkKKwkkVU1VTEwJcjkscjYscjgKKwkkVU1VTEggIHIxMCxyNixyOAorCSRMRFUJcjExLCRCTlNaKHIzKQorCWFkZGMJcjkscjkscjExCisJYWRkemUJcjEwLHIxMAorCWFkZGMJcjkscjkscjEyCisJYWRkemUJcjEyLHIxMAorCSRTVAlyOSwwKHIzKQorCQkKK0xwcGNhc21fbWF3X2FkaW9zOgkKKwlhZGRpCXIzLHIxMiwwCisJYmxyCisJLmxvbmcJMHgwMDAwMDAwMAorCS5hbGlnbgk0CitFT0YKKyRkYXRhID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworcHJpbnQgJGRhdGE7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3BwYzY0LW1vbnQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3BwYzY0LW1vbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0OWIzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vcHBjNjQtbW9udC5wbApAQCAtMCwwICsxLDkxOCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIERlY2VtYmVyIDIwMDcKKworIyBUaGUgcmVhc29uIGZvciB1bmRlcnRha2VuIGVmZm9ydCBpcyBiYXNpY2FsbHkgZm9sbG93aW5nLiBFdmVuIHRob3VnaAorIyBQb3dlciA2IENQVSBvcGVyYXRlcyBhdCBpbmNyZWRpYmxlIDQuN0dIeiBjbG9jayBmcmVxdWVuY3ksIGl0cyBQS0kKKyMgcGVyZm9ybWFuY2Ugd2FzIG9ic2VydmVkIHRvIGJlIGxlc3MgdGhhbiBpbXByZXNzaXZlLCBlc3NlbnRpYWxseSBhcworIyBmYXN0IGFzIDEuOEdIeiBQUEM5NzAsIG9yIDIuNiB0aW1lcyghKSBzbG93ZXIgdGhhbiBvbmUgd291bGQgaG9wZS4KKyMgV2VsbCwgaXQncyBub3Qgc3VycHJpc2luZyB0aGF0IElCTSBoYWQgdG8gbWFrZSBzb21lIHNhY3JpZmljZXMgdG8KKyMgYm9vc3QgdGhlIGNsb2NrIGZyZXF1ZW5jeSB0aGF0IG11Y2gsIGJ1dCBubyBvdmVyYWxsIGltcHJvdmVtZW50PworIyBIYXZpbmcgb2JzZXJ2ZWQgaG93IG11Y2ggZGlmZmVyZW5jZSBkaWQgc3dpdGNoaW5nIHRvIEZQVSBtYWtlIG9uCisjIFVsdHJhU1BBUkMsIHBsYXlpbmcgc2FtZSBzdHVudCBvbiBQb3dlciA2IGFwcGVhcmVkIGFwcHJvcHJpYXRlLi4uCisjIFVuZm9ydHVuYXRlbHkgdGhlIHJlc3VsdGluZyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpcyBub3QgYXMKKyMgaW1wcmVzc2l2ZSwgfjMwJSwgYW5kIGluIGFic29sdXRlIHRlcm1zIGlzIHN0aWxsIHZlcnkgZmFyIGZyb20gd2hhdAorIyBvbmUgd291bGQgZXhwZWN0IGZyb20gNC43R0h6IENQVS4gVGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBJJ20gZG9pbmcKKyMgc29tZXRoaW5nIHdyb25nLCBidXQgaW4gdGhlIGxhY2sgb2YgYXNzZW1ibGVyIGxldmVsIG1pY3JvLXByb2ZpbGluZworIyBkYXRhIG9yIGF0IGxlYXN0IGRlY2VudCBwbGF0Zm9ybSBndWlkZSBJIGNhbid0IHRlbGwuLi4gT3IgYmV0dGVyCisjIHJlc3VsdHMgbWlnaHQgYmUgYWNoaWV2ZWQgd2l0aCBWTVguLi4gQW55d2F5LCB0aGlzIG1vZHVsZSBwcm92aWRlcworIyAqd29yc2UqIHBlcmZvcm1hbmNlIG9uIG90aGVyIFBvd2VyUEMgaW1wbGVtZW50YXRpb25zLCB+NDAtMTUlIHNsb3dlcgorIyBvbiBQUEM5NzAgZGVwZW5kaW5nIG9uIGtleSBsZW5ndGggYW5kIH40MCUgc2xvd2VyIG9uIFBvd2VyIDUgZm9yIGFsbAorIyBrZXkgbGVuZ3Rocy4gQXMgaXQncyBvYnZpb3VzbHkgaW5hcHByb3ByaWF0ZSBhcyAiYmVzdCBhbGwtcm91bmQiCisjIGFsdGVybmF0aXZlLCBpdCBoYXMgdG8gYmUgY29tcGxlbWVudGVkIHdpdGggcnVuLXRpbWUgQ1BVIGZhbWlseQorIyBkZXRlY3Rpb24uIE9oISBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IHVubGlrZSBvdGhlciBQb3dlclBDCisjIGltcGxlbWVudGF0aW9uIElBTFUgcHBjLW1vbnQucGwgbW9kdWxlIHBlcmZvcm1zICpzdWJvcHRpbWFseSogb24KKyMgPj0xMDI0LWJpdCBrZXkgbGVuZ3RocyBvbiBQb3dlciA2LiBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0CisjICpldmVyeXRoaW5nKiBzYWlkIHNvIGZhciBhcHBsaWVzIHRvIDY0LWJpdCBidWlsZHMhIEFzIGZhciBhcyAzMi1iaXQKKyMgYXBwbGljYXRpb24gZXhlY3V0ZWQgb24gNjQtYml0IENQVSBnb2VzLCB0aGlzIG1vZHVsZSBpcyBsaWtlbHkgdG8KKyMgYmVjb21lIHByZWZlcnJlZCBjaG9pY2UsIGJlY2F1c2UgaXQncyBlYXN5IHRvIGFkYXB0IGl0IGZvciBzdWNoCisjIGNhc2UgYW5kICppcyogZmFzdGVyIHRoYW4gMzItYml0IHBwYy1tb250LnBsIG9uICphbGwqIHByb2Nlc3NvcnMuCisKKyMgRmVicnVhcnkgMjAwOAorCisjIE1pY3JvLXByb2ZpbGluZyBhc3Npc3RlZCBvcHRpbWl6YXRpb24gcmVzdWx0cyBpbiB+MTUlIGltcHJvdmVtZW50CisjIG92ZXIgb3JpZ2luYWwgcHBjNjQtbW9udC5wbCB2ZXJzaW9uLCBvciBvdmVyYWxsIH41MCUgaW1wcm92ZW1lbnQKKyMgb3ZlciBwcGMucGwgbW9kdWxlIG9uIFBvd2VyIDYuIElmIGNvbXBhcmVkIHRvIHBwYy1tb250LnBsIG9uIHNhbWUKKyMgUG93ZXIgNiBDUFUsIHRoaXMgbW9kdWxlIGlzIDUtMTUwJSBmYXN0ZXIgZGVwZW5kaW5nIG9uIGtleSBsZW5ndGgsCisjIFtoZXJlYWZ0ZXJdIG1vcmUgZm9yIGxvbmdlciBrZXlzLiBCdXQgaWYgY29tcGFyZWQgdG8gcHBjLW1vbnQucGwKKyMgb24gMS44R0h6IFBQQzk3MCwgaXQncyBvbmx5IDUtNTUlIGZhc3Rlci4gU3RpbGwgZmFyIGZyb20gaW1wcmVzc2l2ZQorIyBpbiBhYnNvbHV0ZSB0ZXJtcywgYnV0IGl0J3MgYXBwYXJlbnRseSB0aGUgd2F5IFBvd2VyIDYgaXMuLi4KKworJGZsYXZvdXIgPSBzaGlmdDsKKworaWYgKCRmbGF2b3VyID1+IC8zMi8pIHsKKwkkU0laRV9UPTQ7CisJJFJaT05FPQkyMjQ7CisJJEZSQU1FPQkkU0laRV9UKjEyKzgqMTI7CisJJGZuYW1lPQkiYm5fbXVsX21vbnRfcHBjNjQiOworCisJJFNUVVg9CSJzdHd1eCI7CSMgc3RvcmUgaW5kZXhlZCBhbmQgdXBkYXRlCisJJFBVU0g9CSJzdHciOworCSRQT1A9CSJsd3oiOworCWRpZSAibm90IGltcGxlbWVudGVkIHlldCI7Cit9IGVsc2lmICgkZmxhdm91ciA9fiAvNjQvKSB7CisJJFNJWkVfVD04OworCSRSWk9ORT0JMjg4OworCSRGUkFNRT0JJFNJWkVfVCoxMis4KjEyOworCSRmbmFtZT0JImJuX211bF9tb250IjsKKworCSMgc2FtZSBhcyBhYm92ZSwgYnV0IDY0LWJpdCBtbmVtb25pY3MuLi4KKwkkU1RVWD0JInN0ZHV4IjsJIyBzdG9yZSBpbmRleGVkIGFuZCB1cGRhdGUKKwkkUFVTSD0JInN0ZCI7CisJJFBPUD0JImxkIjsKK30gZWxzZSB7IGRpZSAibm9uc2Vuc2UgJGZsYXZvdXIiOyB9CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9cHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3BwYy14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHBwYy14bGF0ZS5wbCI7CisKK29wZW4gU1RET1VULCJ8ICReWCAkeGxhdGUgJGZsYXZvdXIgIi5zaGlmdCB8fCBkaWUgImNhbid0IGNhbGwgJHhsYXRlOiAkISI7CisKKyRGUkFNRT0oJEZSQU1FKzYzKSZ+NjM7CiskVFJBTlNGRVI9MTYqODsKKworJGNhcnJ5PSJyMCI7Ciskc3A9InIxIjsKKyR0b2M9InIyIjsKKyRycD0icjMiOwkkb3ZmPSJyMyI7CiskYXA9InI0IjsKKyRicD0icjUiOworJG5wPSJyNiI7CiskbjA9InI3IjsKKyRudW09InI4IjsKKyRycD0icjkiOwkjICRycCBpcyByZWFzc2lnbmVkCiskdHA9InIxMCI7Ciskaj0icjExIjsKKyRpPSJyMTIiOworIyBub24tdm9sYXRpbGUgcmVnaXN0ZXJzCiskbmFwX2Q9InIxNCI7CSMgaW50ZXJsZWF2ZWQgYXAgYW5kIG5wIGluIGRvdWJsZSBmb3JtYXQKKyRhMD0icjE1IjsJIyBhcFswXQorJHQwPSJyMTYiOwkjIHRlbXBvcmFyeSByZWdpc3RlcnMKKyR0MT0icjE3IjsKKyR0Mj0icjE4IjsKKyR0Mz0icjE5IjsKKyR0ND0icjIwIjsKKyR0NT0icjIxIjsKKyR0Nj0icjIyIjsKKyR0Nz0icjIzIjsKKworIyBQUEMgb2ZmZXJzIGVub3VnaCByZWdpc3RlciBiYW5rIGNhcGFjaXR5IHRvIHVucm9sbCBpbm5lciBsb29wcyB0d2ljZQorIworIyAgICAgLi5BM0EyQTFBMAorIyAgICAgICAgICAgZGNiYQorIyAgICAtLS0tLS0tLS0tLQorIyAgICAgICAgICAgIEEwYQorIyAgICAgICAgICAgQTBiCisjICAgICAgICAgIEEwYworIyAgICAgICAgIEEwZAorIyAgICAgICAgICBBMWEKKyMgICAgICAgICBBMWIKKyMgICAgICAgIEExYworIyAgICAgICBBMWQKKyMgICAgICAgIEEyYQorIyAgICAgICBBMmIKKyMgICAgICBBMmMKKyMgICAgIEEyZAorIyAgICAgIEEzYQorIyAgICAgQTNiCisjICAgIEEzYworIyAgIEEzZAorIyAgICAuLmEKKyMgICAuLmIKKyMKKyRiYT0iZjAiOwkkYmI9ImYxIjsJJGJjPSJmMiI7CSRiZD0iZjMiOworJG5hPSJmNCI7CSRuYj0iZjUiOwkkbmM9ImY2IjsJJG5kPSJmNyI7CiskZG90YT0iZjgiOwkkZG90Yj0iZjkiOworJEEwPSJmMTAiOwkkQTE9ImYxMSI7CSRBMj0iZjEyIjsJJEEzPSJmMTMiOworJE4wPSJmMTQiOwkkTjE9ImYxNSI7CSROMj0iZjE2IjsJJE4zPSJmMTciOworJFQwYT0iZjE4IjsJJFQwYj0iZjE5IjsKKyRUMWE9ImYyMCI7CSRUMWI9ImYyMSI7CiskVDJhPSJmMjIiOwkkVDJiPSJmMjMiOworJFQzYT0iZjI0IjsJJFQzYj0iZjI1IjsKKwwKKyMgc3AtLS0tLS0tLS0tLT4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyMJCXwgc2F2ZWQgc3AJCQl8CisjCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyMJCXwJCQkJfAorIwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisjCQl8IDEwIHNhdmVkIGdwciwgcjE0LXIyMwkJfAorIwkJLgkJCQkuCisjCQkuCQkJCS4KKyMgICArMTIqc2l6ZV90CSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIwkJfCAxMiBzYXZlZCBmcHIsIGYxNC1mMjUJCXwKKyMJCS4JCQkJLgorIwkJLgkJCQkuCisjICAgKzEyKjgJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisjCQl8IHBhZGRpbmcgdG8gNjQgYnl0ZSBib3VuZGFyeQl8CisjCQkuCQkJCS4KKyMgICArWAkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisjCQl8IDE2IGdwcjwtPmZwciB0cmFuc2ZlciB6b25lCXwKKyMJCS4JCQkJLgorIwkJLgkJCQkuCisjICAgKzE2KjgJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisjCQl8IF9faW50NjQgdG1wWy0xXQkJfAorIwkJKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisjCQl8IF9faW50NjQgdG1wW251bV0JCXwKKyMJCS4JCQkJLgorIwkJLgkJCQkuCisjCQkuCQkJCS4KKyMgICArKG51bSsxKSo4CSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIwkJfCBwYWRkaW5nIHRvIDY0IGJ5dGUgYm91bmRhcnkJfAorIwkJLgkJCQkuCisjICAgK1gJCSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworIwkJfCBkb3VibGUgbmFwX2RbNCpudW1dCQl8CisjCQkuCQkJCS4KKyMJCS4JCQkJLgorIwkJLgkJCQkuCisjCQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKwwKKyRjb2RlPTw8X19fOworLm1hY2hpbmUgImFueSIKKy50ZXh0CisKKy5nbG9ibAkuJGZuYW1lCisuYWxpZ24JNQorLiRmbmFtZToKKwljbXB3aQkkbnVtLDQKKwltcgkkcnAscjMJCTsgJHJwIGlzIHJlYXNzaWduZWQKKwlsaQlyMywwCQk7IHBvc3NpYmxlICJub3QgaGFuZGxlZCIgcmV0dXJuIGNvZGUKKwlibHRsci0KKwlhbmRpLglyMCwkbnVtLDEJOyAkbnVtIGhhcyB0byBiZSBldmVuCisJYm5lbHItCisKKwlzbHdpCSRudW0sJG51bSwzCTsgbnVtKj04CisJbGkJJGksLTQwOTYKKwlzbHdpCSR0cCwkbnVtLDIJOyBwbGFjZSBmb3Ige2FufXBfe2xofVtudW1dLCBpLmUuIDQqbnVtCisJYWRkCSR0cCwkdHAsJG51bQk7IHBsYWNlIGZvciB0cFtudW0rMV0KKwlhZGRpCSR0cCwkdHAsYCRGUkFNRSskVFJBTlNGRVIrOCs2NCskUlpPTkVgCisJc3ViZgkkdHAsJHRwLCRzcAk7ICRzcC0kdHAKKwlhbmQJJHRwLCR0cCwkaQk7IG1pbmltaXplIFRMQiB1c2FnZQorCXN1YmYJJHRwLCRzcCwkdHAJOyAkdHAtJHNwCisJJFNUVVgJJHNwLCRzcCwkdHAJOyBhbGxvY2EKKworCSRQVVNICXIxNCxgMiokU0laRV9UYCgkc3ApCisJJFBVU0gJcjE1LGAzKiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMTYsYDQqJFNJWkVfVGAoJHNwKQorCSRQVVNICXIxNyxgNSokU0laRV9UYCgkc3ApCisJJFBVU0gJcjE4LGA2KiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMTksYDcqJFNJWkVfVGAoJHNwKQorCSRQVVNICXIyMCxgOCokU0laRV9UYCgkc3ApCisJJFBVU0gJcjIxLGA5KiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMjIsYDEwKiRTSVpFX1RgKCRzcCkKKwkkUFVTSAlyMjMsYDExKiRTSVpFX1RgKCRzcCkKKwlzdGZkCWYxNCxgMTIqJFNJWkVfVCswYCgkc3ApCisJc3RmZAlmMTUsYDEyKiRTSVpFX1QrOGAoJHNwKQorCXN0ZmQJZjE2LGAxMiokU0laRV9UKzE2YCgkc3ApCisJc3RmZAlmMTcsYDEyKiRTSVpFX1QrMjRgKCRzcCkKKwlzdGZkCWYxOCxgMTIqJFNJWkVfVCszMmAoJHNwKQorCXN0ZmQJZjE5LGAxMiokU0laRV9UKzQwYCgkc3ApCisJc3RmZAlmMjAsYDEyKiRTSVpFX1QrNDhgKCRzcCkKKwlzdGZkCWYyMSxgMTIqJFNJWkVfVCs1NmAoJHNwKQorCXN0ZmQJZjIyLGAxMiokU0laRV9UKzY0YCgkc3ApCisJc3RmZAlmMjMsYDEyKiRTSVpFX1QrNzJgKCRzcCkKKwlzdGZkCWYyNCxgMTIqJFNJWkVfVCs4MGAoJHNwKQorCXN0ZmQJZjI1LGAxMiokU0laRV9UKzg4YCgkc3ApCisKKwlsZAkkYTAsMCgkYXApCTsgcHVsbCBhcFswXSB2YWx1ZQorCWxkCSRuMCwwKCRuMCkJOyBwdWxsIG4wWzBdIHZhbHVlCisJbGQJJHQzLDAoJGJwKQk7IGJwWzBdCisKKwlhZGRpCSR0cCwkc3AsYCRGUkFNRSskVFJBTlNGRVIrOCs2NGAKKwlsaQkkaSwtNjQKKwlhZGQJJG5hcF9kLCR0cCwkbnVtCisJYW5kCSRuYXBfZCwkbmFwX2QsJGkJOyBhbGlnbiB0byA2NCBieXRlcworDAorCW11bGxkCSR0NywkYTAsJHQzCTsgYXBbMF0qYnBbMF0KKwk7IG5hcF9kIGlzIG9mZiBieSAxLCBiZWNhdXNlIGl0J3MgdXNlZCB3aXRoIHN0ZmR1L2xmZHUKKwlhZGRpCSRuYXBfZCwkbmFwX2QsLTgKKwlzcndpCSRqLCRudW0sYDMrMWAJOyBjb3VudGVyIHJlZ2lzdGVyLCBudW0vMgorCW11bGxkCSR0NywkdDcsJG4wCTsgdHBbMF0qbjAKKwlhZGRpCSRqLCRqLC0xCisJYWRkaQkkdHAsJHNwLGAkRlJBTUUrJFRSQU5TRkVSLThgCisJbGkJJGNhcnJ5LDAKKwltdGN0cgkkagorCisJOyB0cmFuc2ZlciBicFswXSB0byBGUFUgYXMgNHgxNi1iaXQgdmFsdWVzCisJZXh0cmRpCSR0MCwkdDMsMTYsNDgKKwlleHRyZGkJJHQxLCR0MywxNiwzMgorCWV4dHJkaQkkdDIsJHQzLDE2LDE2CisJZXh0cmRpCSR0MywkdDMsMTYsMAorCXN0ZAkkdDAsYCRGUkFNRSswYCgkc3ApCisJc3RkCSR0MSxgJEZSQU1FKzhgKCRzcCkKKwlzdGQJJHQyLGAkRlJBTUUrMTZgKCRzcCkKKwlzdGQJJHQzLGAkRlJBTUUrMjRgKCRzcCkKKwk7IHRyYW5zZmVyIChhcFswXSpicFswXSkqbjAgdG8gRlBVIGFzIDR4MTYtYml0IHZhbHVlcworCWV4dHJkaQkkdDQsJHQ3LDE2LDQ4CisJZXh0cmRpCSR0NSwkdDcsMTYsMzIKKwlleHRyZGkJJHQ2LCR0NywxNiwxNgorCWV4dHJkaQkkdDcsJHQ3LDE2LDAKKwlzdGQJJHQ0LGAkRlJBTUUrMzJgKCRzcCkKKwlzdGQJJHQ1LGAkRlJBTUUrNDBgKCRzcCkKKwlzdGQJJHQ2LGAkRlJBTUUrNDhgKCRzcCkKKwlzdGQJJHQ3LGAkRlJBTUUrNTZgKCRzcCkKKwlsd3oJJHQwLDQoJGFwKQkJOyBsb2FkIGFbal0gYXMgMzItYml0IHdvcmQgcGFpcgorCWx3egkkdDEsMCgkYXApCisJbHd6CSR0MiwxMigkYXApCQk7IGxvYWQgYVtqKzFdIGFzIDMyLWJpdCB3b3JkIHBhaXIKKwlsd3oJJHQzLDgoJGFwKQorCWx3egkkdDQsNCgkbnApCQk7IGxvYWQgbltqXSBhcyAzMi1iaXQgd29yZCBwYWlyCisJbHd6CSR0NSwwKCRucCkKKwlsd3oJJHQ2LDEyKCRucCkJCTsgbG9hZCBuW2orMV0gYXMgMzItYml0IHdvcmQgcGFpcgorCWx3egkkdDcsOCgkbnApCisJbGZkCSRiYSxgJEZSQU1FKzBgKCRzcCkKKwlsZmQJJGJiLGAkRlJBTUUrOGAoJHNwKQorCWxmZAkkYmMsYCRGUkFNRSsxNmAoJHNwKQorCWxmZAkkYmQsYCRGUkFNRSsyNGAoJHNwKQorCWxmZAkkbmEsYCRGUkFNRSszMmAoJHNwKQorCWxmZAkkbmIsYCRGUkFNRSs0MGAoJHNwKQorCWxmZAkkbmMsYCRGUkFNRSs0OGAoJHNwKQorCWxmZAkkbmQsYCRGUkFNRSs1NmAoJHNwKQorCXN0ZAkkdDAsYCRGUkFNRSs2NGAoJHNwKQorCXN0ZAkkdDEsYCRGUkFNRSs3MmAoJHNwKQorCXN0ZAkkdDIsYCRGUkFNRSs4MGAoJHNwKQorCXN0ZAkkdDMsYCRGUkFNRSs4OGAoJHNwKQorCXN0ZAkkdDQsYCRGUkFNRSs5NmAoJHNwKQorCXN0ZAkkdDUsYCRGUkFNRSsxMDRgKCRzcCkKKwlzdGQJJHQ2LGAkRlJBTUUrMTEyYCgkc3ApCisJc3RkCSR0NyxgJEZSQU1FKzEyMGAoJHNwKQorCWZjZmlkCSRiYSwkYmEKKwlmY2ZpZAkkYmIsJGJiCisJZmNmaWQJJGJjLCRiYworCWZjZmlkCSRiZCwkYmQKKwlmY2ZpZAkkbmEsJG5hCisJZmNmaWQJJG5iLCRuYgorCWZjZmlkCSRuYywkbmMKKwlmY2ZpZAkkbmQsJG5kCisKKwlsZmQJJEEwLGAkRlJBTUUrNjRgKCRzcCkKKwlsZmQJJEExLGAkRlJBTUUrNzJgKCRzcCkKKwlsZmQJJEEyLGAkRlJBTUUrODBgKCRzcCkKKwlsZmQJJEEzLGAkRlJBTUUrODhgKCRzcCkKKwlsZmQJJE4wLGAkRlJBTUUrOTZgKCRzcCkKKwlsZmQJJE4xLGAkRlJBTUUrMTA0YCgkc3ApCisJbGZkCSROMixgJEZSQU1FKzExMmAoJHNwKQorCWxmZAkkTjMsYCRGUkFNRSsxMjBgKCRzcCkKKwlmY2ZpZAkkQTAsJEEwCisJZmNmaWQJJEExLCRBMQorCWZjZmlkCSRBMiwkQTIKKwlmY2ZpZAkkQTMsJEEzCisJZmNmaWQJJE4wLCROMAorCWZjZmlkCSROMSwkTjEKKwlmY2ZpZAkkTjIsJE4yCisJZmNmaWQJJE4zLCROMworCWFkZGkJJGFwLCRhcCwxNgorCWFkZGkJJG5wLCRucCwxNgorCisJZm11bAkkVDFhLCRBMSwkYmEKKwlmbXVsCSRUMWIsJEExLCRiYgorCXN0ZmQJJEEwLDgoJG5hcF9kKQkJOyBzYXZlIGFbal0gaW4gZG91YmxlIGZvcm1hdAorCXN0ZmQJJEExLDE2KCRuYXBfZCkKKwlmbXVsCSRUMmEsJEEyLCRiYQorCWZtdWwJJFQyYiwkQTIsJGJiCisJc3RmZAkkQTIsMjQoJG5hcF9kKQkJOyBzYXZlIGFbaisxXSBpbiBkb3VibGUgZm9ybWF0CisJc3RmZAkkQTMsMzIoJG5hcF9kKQorCWZtdWwJJFQzYSwkQTMsJGJhCisJZm11bAkkVDNiLCRBMywkYmIKKwlzdGZkCSROMCw0MCgkbmFwX2QpCQk7IHNhdmUgbltqXSBpbiBkb3VibGUgZm9ybWF0CisJc3RmZAkkTjEsNDgoJG5hcF9kKQorCWZtdWwJJFQwYSwkQTAsJGJhCisJZm11bAkkVDBiLCRBMCwkYmIKKwlzdGZkCSROMiw1NigkbmFwX2QpCQk7IHNhdmUgbltqKzFdIGluIGRvdWJsZSBmb3JtYXQKKwlzdGZkdQkkTjMsNjQoJG5hcF9kKQorCisJZm1hZGQJJFQxYSwkQTAsJGJjLCRUMWEKKwlmbWFkZAkkVDFiLCRBMCwkYmQsJFQxYgorCWZtYWRkCSRUMmEsJEExLCRiYywkVDJhCisJZm1hZGQJJFQyYiwkQTEsJGJkLCRUMmIKKwlmbWFkZAkkVDNhLCRBMiwkYmMsJFQzYQorCWZtYWRkCSRUM2IsJEEyLCRiZCwkVDNiCisJZm11bAkkZG90YSwkQTMsJGJjCisJZm11bAkkZG90YiwkQTMsJGJkCisKKwlmbWFkZAkkVDFhLCROMSwkbmEsJFQxYQorCWZtYWRkCSRUMWIsJE4xLCRuYiwkVDFiCisJZm1hZGQJJFQyYSwkTjIsJG5hLCRUMmEKKwlmbWFkZAkkVDJiLCROMiwkbmIsJFQyYgorCWZtYWRkCSRUM2EsJE4zLCRuYSwkVDNhCisJZm1hZGQJJFQzYiwkTjMsJG5iLCRUM2IKKwlmbWFkZAkkVDBhLCROMCwkbmEsJFQwYQorCWZtYWRkCSRUMGIsJE4wLCRuYiwkVDBiCisKKwlmbWFkZAkkVDFhLCROMCwkbmMsJFQxYQorCWZtYWRkCSRUMWIsJE4wLCRuZCwkVDFiCisJZm1hZGQJJFQyYSwkTjEsJG5jLCRUMmEKKwlmbWFkZAkkVDJiLCROMSwkbmQsJFQyYgorCWZtYWRkCSRUM2EsJE4yLCRuYywkVDNhCisJZm1hZGQJJFQzYiwkTjIsJG5kLCRUM2IKKwlmbWFkZAkkZG90YSwkTjMsJG5jLCRkb3RhCisJZm1hZGQJJGRvdGIsJE4zLCRuZCwkZG90YgorCisJZmN0aWQJJFQwYSwkVDBhCisJZmN0aWQJJFQwYiwkVDBiCisJZmN0aWQJJFQxYSwkVDFhCisJZmN0aWQJJFQxYiwkVDFiCisJZmN0aWQJJFQyYSwkVDJhCisJZmN0aWQJJFQyYiwkVDJiCisJZmN0aWQJJFQzYSwkVDNhCisJZmN0aWQJJFQzYiwkVDNiCisKKwlzdGZkCSRUMGEsYCRGUkFNRSswYCgkc3ApCisJc3RmZAkkVDBiLGAkRlJBTUUrOGAoJHNwKQorCXN0ZmQJJFQxYSxgJEZSQU1FKzE2YCgkc3ApCisJc3RmZAkkVDFiLGAkRlJBTUUrMjRgKCRzcCkKKwlzdGZkCSRUMmEsYCRGUkFNRSszMmAoJHNwKQorCXN0ZmQJJFQyYixgJEZSQU1FKzQwYCgkc3ApCisJc3RmZAkkVDNhLGAkRlJBTUUrNDhgKCRzcCkKKwlzdGZkCSRUM2IsYCRGUkFNRSs1NmAoJHNwKQorDAorLmFsaWduCTUKK0wxc3Q6CisJbHd6CSR0MCw0KCRhcCkJCTsgbG9hZCBhW2pdIGFzIDMyLWJpdCB3b3JkIHBhaXIKKwlsd3oJJHQxLDAoJGFwKQorCWx3egkkdDIsMTIoJGFwKQkJOyBsb2FkIGFbaisxXSBhcyAzMi1iaXQgd29yZCBwYWlyCisJbHd6CSR0Myw4KCRhcCkKKwlsd3oJJHQ0LDQoJG5wKQkJOyBsb2FkIG5bal0gYXMgMzItYml0IHdvcmQgcGFpcgorCWx3egkkdDUsMCgkbnApCisJbHd6CSR0NiwxMigkbnApCQk7IGxvYWQgbltqKzFdIGFzIDMyLWJpdCB3b3JkIHBhaXIKKwlsd3oJJHQ3LDgoJG5wKQorCXN0ZAkkdDAsYCRGUkFNRSs2NGAoJHNwKQorCXN0ZAkkdDEsYCRGUkFNRSs3MmAoJHNwKQorCXN0ZAkkdDIsYCRGUkFNRSs4MGAoJHNwKQorCXN0ZAkkdDMsYCRGUkFNRSs4OGAoJHNwKQorCXN0ZAkkdDQsYCRGUkFNRSs5NmAoJHNwKQorCXN0ZAkkdDUsYCRGUkFNRSsxMDRgKCRzcCkKKwlzdGQJJHQ2LGAkRlJBTUUrMTEyYCgkc3ApCisJc3RkCSR0NyxgJEZSQU1FKzEyMGAoJHNwKQorCWxkCSR0MCxgJEZSQU1FKzBgKCRzcCkKKwlsZAkkdDEsYCRGUkFNRSs4YCgkc3ApCisJbGQJJHQyLGAkRlJBTUUrMTZgKCRzcCkKKwlsZAkkdDMsYCRGUkFNRSsyNGAoJHNwKQorCWxkCSR0NCxgJEZSQU1FKzMyYCgkc3ApCisJbGQJJHQ1LGAkRlJBTUUrNDBgKCRzcCkKKwlsZAkkdDYsYCRGUkFNRSs0OGAoJHNwKQorCWxkCSR0NyxgJEZSQU1FKzU2YCgkc3ApCisJbGZkCSRBMCxgJEZSQU1FKzY0YCgkc3ApCisJbGZkCSRBMSxgJEZSQU1FKzcyYCgkc3ApCisJbGZkCSRBMixgJEZSQU1FKzgwYCgkc3ApCisJbGZkCSRBMyxgJEZSQU1FKzg4YCgkc3ApCisJbGZkCSROMCxgJEZSQU1FKzk2YCgkc3ApCisJbGZkCSROMSxgJEZSQU1FKzEwNGAoJHNwKQorCWxmZAkkTjIsYCRGUkFNRSsxMTJgKCRzcCkKKwlsZmQJJE4zLGAkRlJBTUUrMTIwYCgkc3ApCisJZmNmaWQJJEEwLCRBMAorCWZjZmlkCSRBMSwkQTEKKwlmY2ZpZAkkQTIsJEEyCisJZmNmaWQJJEEzLCRBMworCWZjZmlkCSROMCwkTjAKKwlmY2ZpZAkkTjEsJE4xCisJZmNmaWQJJE4yLCROMgorCWZjZmlkCSROMywkTjMKKwlhZGRpCSRhcCwkYXAsMTYKKwlhZGRpCSRucCwkbnAsMTYKKworCWZtdWwJJFQxYSwkQTEsJGJhCisJZm11bAkkVDFiLCRBMSwkYmIKKwlmbXVsCSRUMmEsJEEyLCRiYQorCWZtdWwJJFQyYiwkQTIsJGJiCisJc3RmZAkkQTAsOCgkbmFwX2QpCQk7IHNhdmUgYVtqXSBpbiBkb3VibGUgZm9ybWF0CisJc3RmZAkkQTEsMTYoJG5hcF9kKQorCWZtdWwJJFQzYSwkQTMsJGJhCisJZm11bAkkVDNiLCRBMywkYmIKKwlmbWFkZAkkVDBhLCRBMCwkYmEsJGRvdGEKKwlmbWFkZAkkVDBiLCRBMCwkYmIsJGRvdGIKKwlzdGZkCSRBMiwyNCgkbmFwX2QpCQk7IHNhdmUgYVtqKzFdIGluIGRvdWJsZSBmb3JtYXQKKwlzdGZkCSRBMywzMigkbmFwX2QpCisKKwlmbWFkZAkkVDFhLCRBMCwkYmMsJFQxYQorCWZtYWRkCSRUMWIsJEEwLCRiZCwkVDFiCisJZm1hZGQJJFQyYSwkQTEsJGJjLCRUMmEKKwlmbWFkZAkkVDJiLCRBMSwkYmQsJFQyYgorCXN0ZmQJJE4wLDQwKCRuYXBfZCkJCTsgc2F2ZSBuW2pdIGluIGRvdWJsZSBmb3JtYXQKKwlzdGZkCSROMSw0OCgkbmFwX2QpCisJZm1hZGQJJFQzYSwkQTIsJGJjLCRUM2EKKwlmbWFkZAkkVDNiLCRBMiwkYmQsJFQzYgorCSBhZGQJJHQwLCR0MCwkY2FycnkJCTsgY2FuIG5vdCBvdmVyZmxvdworCWZtdWwJJGRvdGEsJEEzLCRiYworCWZtdWwJJGRvdGIsJEEzLCRiZAorCXN0ZmQJJE4yLDU2KCRuYXBfZCkJCTsgc2F2ZSBuW2orMV0gaW4gZG91YmxlIGZvcm1hdAorCXN0ZmR1CSROMyw2NCgkbmFwX2QpCisJIHNyZGkJJGNhcnJ5LCR0MCwxNgorCSBhZGQJJHQxLCR0MSwkY2FycnkKKwkgc3JkaQkkY2FycnksJHQxLDE2CisKKwlmbWFkZAkkVDFhLCROMSwkbmEsJFQxYQorCWZtYWRkCSRUMWIsJE4xLCRuYiwkVDFiCisJIGluc3JkaQkkdDAsJHQxLDE2LDMyCisJZm1hZGQJJFQyYSwkTjIsJG5hLCRUMmEKKwlmbWFkZAkkVDJiLCROMiwkbmIsJFQyYgorCSBhZGQJJHQyLCR0MiwkY2FycnkKKwlmbWFkZAkkVDNhLCROMywkbmEsJFQzYQorCWZtYWRkCSRUM2IsJE4zLCRuYiwkVDNiCisJIHNyZGkJJGNhcnJ5LCR0MiwxNgorCWZtYWRkCSRUMGEsJE4wLCRuYSwkVDBhCisJZm1hZGQJJFQwYiwkTjAsJG5iLCRUMGIKKwkgaW5zcmRpCSR0MCwkdDIsMTYsMTYKKwkgYWRkCSR0MywkdDMsJGNhcnJ5CisJIHNyZGkJJGNhcnJ5LCR0MywxNgorCisJZm1hZGQJJFQxYSwkTjAsJG5jLCRUMWEKKwlmbWFkZAkkVDFiLCROMCwkbmQsJFQxYgorCSBpbnNyZGkJJHQwLCR0MywxNiwwCQk7IDAuLjYzIGJpdHMKKwlmbWFkZAkkVDJhLCROMSwkbmMsJFQyYQorCWZtYWRkCSRUMmIsJE4xLCRuZCwkVDJiCisJIGFkZAkkdDQsJHQ0LCRjYXJyeQorCWZtYWRkCSRUM2EsJE4yLCRuYywkVDNhCisJZm1hZGQJJFQzYiwkTjIsJG5kLCRUM2IKKwkgc3JkaQkkY2FycnksJHQ0LDE2CisJZm1hZGQJJGRvdGEsJE4zLCRuYywkZG90YQorCWZtYWRkCSRkb3RiLCROMywkbmQsJGRvdGIKKwkgYWRkCSR0NSwkdDUsJGNhcnJ5CisJIHNyZGkJJGNhcnJ5LCR0NSwxNgorCSBpbnNyZGkJJHQ0LCR0NSwxNiwzMgorCisJZmN0aWQJJFQwYSwkVDBhCisJZmN0aWQJJFQwYiwkVDBiCisJIGFkZAkkdDYsJHQ2LCRjYXJyeQorCWZjdGlkCSRUMWEsJFQxYQorCWZjdGlkCSRUMWIsJFQxYgorCSBzcmRpCSRjYXJyeSwkdDYsMTYKKwlmY3RpZAkkVDJhLCRUMmEKKwlmY3RpZAkkVDJiLCRUMmIKKwkgaW5zcmRpCSR0NCwkdDYsMTYsMTYKKwlmY3RpZAkkVDNhLCRUM2EKKwlmY3RpZAkkVDNiLCRUM2IKKwkgYWRkCSR0NywkdDcsJGNhcnJ5CisJIGluc3JkaQkkdDQsJHQ3LDE2LDAJCTsgNjQuLjEyNyBiaXRzCisJIHNyZGkJJGNhcnJ5LCR0NywxNgkJOyB1cHBlciAzMyBiaXRzCisKKwlzdGZkCSRUMGEsYCRGUkFNRSswYCgkc3ApCisJc3RmZAkkVDBiLGAkRlJBTUUrOGAoJHNwKQorCXN0ZmQJJFQxYSxgJEZSQU1FKzE2YCgkc3ApCisJc3RmZAkkVDFiLGAkRlJBTUUrMjRgKCRzcCkKKwlzdGZkCSRUMmEsYCRGUkFNRSszMmAoJHNwKQorCXN0ZmQJJFQyYixgJEZSQU1FKzQwYCgkc3ApCisJc3RmZAkkVDNhLGAkRlJBTUUrNDhgKCRzcCkKKwlzdGZkCSRUM2IsYCRGUkFNRSs1NmAoJHNwKQorCSBzdGQJJHQwLDgoJHRwKQkJOyB0cFtqLTFdCisJIHN0ZHUJJHQ0LDE2KCR0cCkJCTsgdHBbal0KKwliZG56LQlMMXN0CisMCisJZmN0aWQJJGRvdGEsJGRvdGEKKwlmY3RpZAkkZG90YiwkZG90YgorCisJbGQJJHQwLGAkRlJBTUUrMGAoJHNwKQorCWxkCSR0MSxgJEZSQU1FKzhgKCRzcCkKKwlsZAkkdDIsYCRGUkFNRSsxNmAoJHNwKQorCWxkCSR0MyxgJEZSQU1FKzI0YCgkc3ApCisJbGQJJHQ0LGAkRlJBTUUrMzJgKCRzcCkKKwlsZAkkdDUsYCRGUkFNRSs0MGAoJHNwKQorCWxkCSR0NixgJEZSQU1FKzQ4YCgkc3ApCisJbGQJJHQ3LGAkRlJBTUUrNTZgKCRzcCkKKwlzdGZkCSRkb3RhLGAkRlJBTUUrNjRgKCRzcCkKKwlzdGZkCSRkb3RiLGAkRlJBTUUrNzJgKCRzcCkKKworCWFkZAkkdDAsJHQwLCRjYXJyeQkJOyBjYW4gbm90IG92ZXJmbG93CisJc3JkaQkkY2FycnksJHQwLDE2CisJYWRkCSR0MSwkdDEsJGNhcnJ5CisJc3JkaQkkY2FycnksJHQxLDE2CisJaW5zcmRpCSR0MCwkdDEsMTYsMzIKKwlhZGQJJHQyLCR0MiwkY2FycnkKKwlzcmRpCSRjYXJyeSwkdDIsMTYKKwlpbnNyZGkJJHQwLCR0MiwxNiwxNgorCWFkZAkkdDMsJHQzLCRjYXJyeQorCXNyZGkJJGNhcnJ5LCR0MywxNgorCWluc3JkaQkkdDAsJHQzLDE2LDAJCTsgMC4uNjMgYml0cworCWFkZAkkdDQsJHQ0LCRjYXJyeQorCXNyZGkJJGNhcnJ5LCR0NCwxNgorCWFkZAkkdDUsJHQ1LCRjYXJyeQorCXNyZGkJJGNhcnJ5LCR0NSwxNgorCWluc3JkaQkkdDQsJHQ1LDE2LDMyCisJYWRkCSR0NiwkdDYsJGNhcnJ5CisJc3JkaQkkY2FycnksJHQ2LDE2CisJaW5zcmRpCSR0NCwkdDYsMTYsMTYKKwlhZGQJJHQ3LCR0NywkY2FycnkKKwlpbnNyZGkJJHQ0LCR0NywxNiwwCQk7IDY0Li4xMjcgYml0cworCXNyZGkJJGNhcnJ5LCR0NywxNgkJOyB1cHBlciAzMyBiaXRzCisJbGQJJHQ2LGAkRlJBTUUrNjRgKCRzcCkKKwlsZAkkdDcsYCRGUkFNRSs3MmAoJHNwKQorCisJc3RkCSR0MCw4KCR0cCkJCTsgdHBbai0xXQorCXN0ZHUJJHQ0LDE2KCR0cCkJCTsgdHBbal0KKworCWFkZAkkdDYsJHQ2LCRjYXJyeQkJOyBjYW4gbm90IG92ZXJmbG93CisJc3JkaQkkY2FycnksJHQ2LDE2CisJYWRkCSR0NywkdDcsJGNhcnJ5CisJaW5zcmRpCSR0NiwkdDcsNDgsMAorCXNyZGkJJG92ZiwkdDcsNDgKKwlzdGQJJHQ2LDgoJHRwKQkJOyB0cFtudW0tMV0KKworCXNsd2kJJHQ3LCRudW0sMgorCXN1YmYJJG5hcF9kLCR0NywkbmFwX2QJOyByZXdpbmQgcG9pbnRlcgorDAorCWxpCSRpLDgJCQk7IGk9MQorLmFsaWduCTUKK0xvdXRlcjoKKwlsZHgJJHQzLCRicCwkaQk7IGJwW2ldCisJbGQJJHQ2LGAkRlJBTUUrJFRSQU5TRkVSKzhgKCRzcCkJOyB0cFswXQorCW11bGxkCSR0NywkYTAsJHQzCTsgYXBbMF0qYnBbaV0KKworCWFkZGkJJHRwLCRzcCxgJEZSQU1FKyRUUkFOU0ZFUmAKKwlhZGQJJHQ3LCR0NywkdDYJOyBhcFswXSpicFtpXSt0cFswXQorCWxpCSRjYXJyeSwwCisJbXVsbGQJJHQ3LCR0NywkbjAJOyB0cFswXSpuMAorCW10Y3RyCSRqCisKKwk7IHRyYW5zZmVyIGJwW2ldIHRvIEZQVSBhcyA0eDE2LWJpdCB2YWx1ZXMKKwlleHRyZGkJJHQwLCR0MywxNiw0OAorCWV4dHJkaQkkdDEsJHQzLDE2LDMyCisJZXh0cmRpCSR0MiwkdDMsMTYsMTYKKwlleHRyZGkJJHQzLCR0MywxNiwwCisJc3RkCSR0MCxgJEZSQU1FKzBgKCRzcCkKKwlzdGQJJHQxLGAkRlJBTUUrOGAoJHNwKQorCXN0ZAkkdDIsYCRGUkFNRSsxNmAoJHNwKQorCXN0ZAkkdDMsYCRGUkFNRSsyNGAoJHNwKQorCTsgdHJhbnNmZXIgKGFwWzBdKmJwW2ldK3RwWzBdKSpuMCB0byBGUFUgYXMgNHgxNi1iaXQgdmFsdWVzCisJZXh0cmRpCSR0NCwkdDcsMTYsNDgKKwlleHRyZGkJJHQ1LCR0NywxNiwzMgorCWV4dHJkaQkkdDYsJHQ3LDE2LDE2CisJZXh0cmRpCSR0NywkdDcsMTYsMAorCXN0ZAkkdDQsYCRGUkFNRSszMmAoJHNwKQorCXN0ZAkkdDUsYCRGUkFNRSs0MGAoJHNwKQorCXN0ZAkkdDYsYCRGUkFNRSs0OGAoJHNwKQorCXN0ZAkkdDcsYCRGUkFNRSs1NmAoJHNwKQorCisJbGZkCSRBMCw4KCRuYXBfZCkJCTsgbG9hZCBhW2pdIGluIGRvdWJsZSBmb3JtYXQKKwlsZmQJJEExLDE2KCRuYXBfZCkKKwlsZmQJJEEyLDI0KCRuYXBfZCkJCTsgbG9hZCBhW2orMV0gaW4gZG91YmxlIGZvcm1hdAorCWxmZAkkQTMsMzIoJG5hcF9kKQorCWxmZAkkTjAsNDAoJG5hcF9kKQkJOyBsb2FkIG5bal0gaW4gZG91YmxlIGZvcm1hdAorCWxmZAkkTjEsNDgoJG5hcF9kKQorCWxmZAkkTjIsNTYoJG5hcF9kKQkJOyBsb2FkIG5baisxXSBpbiBkb3VibGUgZm9ybWF0CisJbGZkdQkkTjMsNjQoJG5hcF9kKQorCisJbGZkCSRiYSxgJEZSQU1FKzBgKCRzcCkKKwlsZmQJJGJiLGAkRlJBTUUrOGAoJHNwKQorCWxmZAkkYmMsYCRGUkFNRSsxNmAoJHNwKQorCWxmZAkkYmQsYCRGUkFNRSsyNGAoJHNwKQorCWxmZAkkbmEsYCRGUkFNRSszMmAoJHNwKQorCWxmZAkkbmIsYCRGUkFNRSs0MGAoJHNwKQorCWxmZAkkbmMsYCRGUkFNRSs0OGAoJHNwKQorCWxmZAkkbmQsYCRGUkFNRSs1NmAoJHNwKQorCisJZmNmaWQJJGJhLCRiYQorCWZjZmlkCSRiYiwkYmIKKwlmY2ZpZAkkYmMsJGJjCisJZmNmaWQJJGJkLCRiZAorCWZjZmlkCSRuYSwkbmEKKwlmY2ZpZAkkbmIsJG5iCisJZmNmaWQJJG5jLCRuYworCWZjZmlkCSRuZCwkbmQKKworCWZtdWwJJFQxYSwkQTEsJGJhCisJZm11bAkkVDFiLCRBMSwkYmIKKwlmbXVsCSRUMmEsJEEyLCRiYQorCWZtdWwJJFQyYiwkQTIsJGJiCisJZm11bAkkVDNhLCRBMywkYmEKKwlmbXVsCSRUM2IsJEEzLCRiYgorCWZtdWwJJFQwYSwkQTAsJGJhCisJZm11bAkkVDBiLCRBMCwkYmIKKworCWZtYWRkCSRUMWEsJEEwLCRiYywkVDFhCisJZm1hZGQJJFQxYiwkQTAsJGJkLCRUMWIKKwlmbWFkZAkkVDJhLCRBMSwkYmMsJFQyYQorCWZtYWRkCSRUMmIsJEExLCRiZCwkVDJiCisJZm1hZGQJJFQzYSwkQTIsJGJjLCRUM2EKKwlmbWFkZAkkVDNiLCRBMiwkYmQsJFQzYgorCWZtdWwJJGRvdGEsJEEzLCRiYworCWZtdWwJJGRvdGIsJEEzLCRiZAorCisJZm1hZGQJJFQxYSwkTjEsJG5hLCRUMWEKKwlmbWFkZAkkVDFiLCROMSwkbmIsJFQxYgorCSBsZmQJJEEwLDgoJG5hcF9kKQkJOyBsb2FkIGFbal0gaW4gZG91YmxlIGZvcm1hdAorCSBsZmQJJEExLDE2KCRuYXBfZCkKKwlmbWFkZAkkVDJhLCROMiwkbmEsJFQyYQorCWZtYWRkCSRUMmIsJE4yLCRuYiwkVDJiCisJIGxmZAkkQTIsMjQoJG5hcF9kKQkJOyBsb2FkIGFbaisxXSBpbiBkb3VibGUgZm9ybWF0CisJIGxmZAkkQTMsMzIoJG5hcF9kKQorCWZtYWRkCSRUM2EsJE4zLCRuYSwkVDNhCisJZm1hZGQJJFQzYiwkTjMsJG5iLCRUM2IKKwlmbWFkZAkkVDBhLCROMCwkbmEsJFQwYQorCWZtYWRkCSRUMGIsJE4wLCRuYiwkVDBiCisKKwlmbWFkZAkkVDFhLCROMCwkbmMsJFQxYQorCWZtYWRkCSRUMWIsJE4wLCRuZCwkVDFiCisJZm1hZGQJJFQyYSwkTjEsJG5jLCRUMmEKKwlmbWFkZAkkVDJiLCROMSwkbmQsJFQyYgorCWZtYWRkCSRUM2EsJE4yLCRuYywkVDNhCisJZm1hZGQJJFQzYiwkTjIsJG5kLCRUM2IKKwlmbWFkZAkkZG90YSwkTjMsJG5jLCRkb3RhCisJZm1hZGQJJGRvdGIsJE4zLCRuZCwkZG90YgorCisJZmN0aWQJJFQwYSwkVDBhCisJZmN0aWQJJFQwYiwkVDBiCisJZmN0aWQJJFQxYSwkVDFhCisJZmN0aWQJJFQxYiwkVDFiCisJZmN0aWQJJFQyYSwkVDJhCisJZmN0aWQJJFQyYiwkVDJiCisJZmN0aWQJJFQzYSwkVDNhCisJZmN0aWQJJFQzYiwkVDNiCisKKwlzdGZkCSRUMGEsYCRGUkFNRSswYCgkc3ApCisJc3RmZAkkVDBiLGAkRlJBTUUrOGAoJHNwKQorCXN0ZmQJJFQxYSxgJEZSQU1FKzE2YCgkc3ApCisJc3RmZAkkVDFiLGAkRlJBTUUrMjRgKCRzcCkKKwlzdGZkCSRUMmEsYCRGUkFNRSszMmAoJHNwKQorCXN0ZmQJJFQyYixgJEZSQU1FKzQwYCgkc3ApCisJc3RmZAkkVDNhLGAkRlJBTUUrNDhgKCRzcCkKKwlzdGZkCSRUM2IsYCRGUkFNRSs1NmAoJHNwKQorDAorLmFsaWduCTUKK0xpbm5lcjoKKwlmbXVsCSRUMWEsJEExLCRiYQorCWZtdWwJJFQxYiwkQTEsJGJiCisJZm11bAkkVDJhLCRBMiwkYmEKKwlmbXVsCSRUMmIsJEEyLCRiYgorCWxmZAkkTjAsNDAoJG5hcF9kKQkJOyBsb2FkIG5bal0gaW4gZG91YmxlIGZvcm1hdAorCWxmZAkkTjEsNDgoJG5hcF9kKQorCWZtdWwJJFQzYSwkQTMsJGJhCisJZm11bAkkVDNiLCRBMywkYmIKKwlmbWFkZAkkVDBhLCRBMCwkYmEsJGRvdGEKKwlmbWFkZAkkVDBiLCRBMCwkYmIsJGRvdGIKKwlsZmQJJE4yLDU2KCRuYXBfZCkJCTsgbG9hZCBuW2orMV0gaW4gZG91YmxlIGZvcm1hdAorCWxmZHUJJE4zLDY0KCRuYXBfZCkKKworCWZtYWRkCSRUMWEsJEEwLCRiYywkVDFhCisJZm1hZGQJJFQxYiwkQTAsJGJkLCRUMWIKKwlmbWFkZAkkVDJhLCRBMSwkYmMsJFQyYQorCWZtYWRkCSRUMmIsJEExLCRiZCwkVDJiCisJIGxmZAkkQTAsOCgkbmFwX2QpCQk7IGxvYWQgYVtqXSBpbiBkb3VibGUgZm9ybWF0CisJIGxmZAkkQTEsMTYoJG5hcF9kKQorCWZtYWRkCSRUM2EsJEEyLCRiYywkVDNhCisJZm1hZGQJJFQzYiwkQTIsJGJkLCRUM2IKKwlmbXVsCSRkb3RhLCRBMywkYmMKKwlmbXVsCSRkb3RiLCRBMywkYmQKKwkgbGZkCSRBMiwyNCgkbmFwX2QpCQk7IGxvYWQgYVtqKzFdIGluIGRvdWJsZSBmb3JtYXQKKwkgbGZkCSRBMywzMigkbmFwX2QpCisKKwlmbWFkZAkkVDFhLCROMSwkbmEsJFQxYQorCWZtYWRkCSRUMWIsJE4xLCRuYiwkVDFiCisJIGxkCSR0MCxgJEZSQU1FKzBgKCRzcCkKKwkgbGQJJHQxLGAkRlJBTUUrOGAoJHNwKQorCWZtYWRkCSRUMmEsJE4yLCRuYSwkVDJhCisJZm1hZGQJJFQyYiwkTjIsJG5iLCRUMmIKKwkgbGQJJHQyLGAkRlJBTUUrMTZgKCRzcCkKKwkgbGQJJHQzLGAkRlJBTUUrMjRgKCRzcCkKKwlmbWFkZAkkVDNhLCROMywkbmEsJFQzYQorCWZtYWRkCSRUM2IsJE4zLCRuYiwkVDNiCisJIGFkZAkkdDAsJHQwLCRjYXJyeQkJOyBjYW4gbm90IG92ZXJmbG93CisJIGxkCSR0NCxgJEZSQU1FKzMyYCgkc3ApCisJIGxkCSR0NSxgJEZSQU1FKzQwYCgkc3ApCisJZm1hZGQJJFQwYSwkTjAsJG5hLCRUMGEKKwlmbWFkZAkkVDBiLCROMCwkbmIsJFQwYgorCSBzcmRpCSRjYXJyeSwkdDAsMTYKKwkgYWRkCSR0MSwkdDEsJGNhcnJ5CisJIHNyZGkJJGNhcnJ5LCR0MSwxNgorCSBsZAkkdDYsYCRGUkFNRSs0OGAoJHNwKQorCSBsZAkkdDcsYCRGUkFNRSs1NmAoJHNwKQorCisJZm1hZGQJJFQxYSwkTjAsJG5jLCRUMWEKKwlmbWFkZAkkVDFiLCROMCwkbmQsJFQxYgorCSBpbnNyZGkJJHQwLCR0MSwxNiwzMgorCSBsZAkkdDEsOCgkdHApCQk7IHRwW2pdCisJZm1hZGQJJFQyYSwkTjEsJG5jLCRUMmEKKwlmbWFkZAkkVDJiLCROMSwkbmQsJFQyYgorCSBhZGQJJHQyLCR0MiwkY2FycnkKKwlmbWFkZAkkVDNhLCROMiwkbmMsJFQzYQorCWZtYWRkCSRUM2IsJE4yLCRuZCwkVDNiCisJIHNyZGkJJGNhcnJ5LCR0MiwxNgorCSBpbnNyZGkJJHQwLCR0MiwxNiwxNgorCWZtYWRkCSRkb3RhLCROMywkbmMsJGRvdGEKKwlmbWFkZAkkZG90YiwkTjMsJG5kLCRkb3RiCisJIGFkZAkkdDMsJHQzLCRjYXJyeQorCSBsZHUJJHQyLDE2KCR0cCkJCTsgdHBbaisxXQorCSBzcmRpCSRjYXJyeSwkdDMsMTYKKwkgaW5zcmRpCSR0MCwkdDMsMTYsMAkJOyAwLi42MyBiaXRzCisJIGFkZAkkdDQsJHQ0LCRjYXJyeQorCisJZmN0aWQJJFQwYSwkVDBhCisJZmN0aWQJJFQwYiwkVDBiCisJIHNyZGkJJGNhcnJ5LCR0NCwxNgorCWZjdGlkCSRUMWEsJFQxYQorCWZjdGlkCSRUMWIsJFQxYgorCSBhZGQJJHQ1LCR0NSwkY2FycnkKKwlmY3RpZAkkVDJhLCRUMmEKKwlmY3RpZAkkVDJiLCRUMmIKKwkgc3JkaQkkY2FycnksJHQ1LDE2CisJIGluc3JkaQkkdDQsJHQ1LDE2LDMyCisJZmN0aWQJJFQzYSwkVDNhCisJZmN0aWQJJFQzYiwkVDNiCisJIGFkZAkkdDYsJHQ2LCRjYXJyeQorCSBzcmRpCSRjYXJyeSwkdDYsMTYKKwkgaW5zcmRpCSR0NCwkdDYsMTYsMTYKKworCXN0ZmQJJFQwYSxgJEZSQU1FKzBgKCRzcCkKKwlzdGZkCSRUMGIsYCRGUkFNRSs4YCgkc3ApCisJIGFkZAkkdDcsJHQ3LCRjYXJyeQorCSBhZGRjCSR0MywkdDAsJHQxCisJc3RmZAkkVDFhLGAkRlJBTUUrMTZgKCRzcCkKKwlzdGZkCSRUMWIsYCRGUkFNRSsyNGAoJHNwKQorCSBpbnNyZGkJJHQ0LCR0NywxNiwwCQk7IDY0Li4xMjcgYml0cworCSBzcmRpCSRjYXJyeSwkdDcsMTYJCTsgdXBwZXIgMzMgYml0cworCXN0ZmQJJFQyYSxgJEZSQU1FKzMyYCgkc3ApCisJc3RmZAkkVDJiLGAkRlJBTUUrNDBgKCRzcCkKKwkgYWRkZQkkdDUsJHQ0LCR0MgorCXN0ZmQJJFQzYSxgJEZSQU1FKzQ4YCgkc3ApCisJc3RmZAkkVDNiLGAkRlJBTUUrNTZgKCRzcCkKKwkgYWRkemUJJGNhcnJ5LCRjYXJyeQorCSBzdGQJJHQzLC0xNigkdHApCQk7IHRwW2otMV0KKwkgc3RkCSR0NSwtOCgkdHApCQk7IHRwW2pdCisJYmRuei0JTGlubmVyCisMCisJZmN0aWQJJGRvdGEsJGRvdGEKKwlmY3RpZAkkZG90YiwkZG90YgorCWxkCSR0MCxgJEZSQU1FKzBgKCRzcCkKKwlsZAkkdDEsYCRGUkFNRSs4YCgkc3ApCisJbGQJJHQyLGAkRlJBTUUrMTZgKCRzcCkKKwlsZAkkdDMsYCRGUkFNRSsyNGAoJHNwKQorCWxkCSR0NCxgJEZSQU1FKzMyYCgkc3ApCisJbGQJJHQ1LGAkRlJBTUUrNDBgKCRzcCkKKwlsZAkkdDYsYCRGUkFNRSs0OGAoJHNwKQorCWxkCSR0NyxgJEZSQU1FKzU2YCgkc3ApCisJc3RmZAkkZG90YSxgJEZSQU1FKzY0YCgkc3ApCisJc3RmZAkkZG90YixgJEZSQU1FKzcyYCgkc3ApCisKKwlhZGQJJHQwLCR0MCwkY2FycnkJCTsgY2FuIG5vdCBvdmVyZmxvdworCXNyZGkJJGNhcnJ5LCR0MCwxNgorCWFkZAkkdDEsJHQxLCRjYXJyeQorCXNyZGkJJGNhcnJ5LCR0MSwxNgorCWluc3JkaQkkdDAsJHQxLDE2LDMyCisJYWRkCSR0MiwkdDIsJGNhcnJ5CisJbGQJJHQxLDgoJHRwKQkJOyB0cFtqXQorCXNyZGkJJGNhcnJ5LCR0MiwxNgorCWluc3JkaQkkdDAsJHQyLDE2LDE2CisJYWRkCSR0MywkdDMsJGNhcnJ5CisJbGR1CSR0MiwxNigkdHApCQk7IHRwW2orMV0KKwlzcmRpCSRjYXJyeSwkdDMsMTYKKwlpbnNyZGkJJHQwLCR0MywxNiwwCQk7IDAuLjYzIGJpdHMKKwlhZGQJJHQ0LCR0NCwkY2FycnkKKwlzcmRpCSRjYXJyeSwkdDQsMTYKKwlhZGQJJHQ1LCR0NSwkY2FycnkKKwlzcmRpCSRjYXJyeSwkdDUsMTYKKwlpbnNyZGkJJHQ0LCR0NSwxNiwzMgorCWFkZAkkdDYsJHQ2LCRjYXJyeQorCXNyZGkJJGNhcnJ5LCR0NiwxNgorCWluc3JkaQkkdDQsJHQ2LDE2LDE2CisJYWRkCSR0NywkdDcsJGNhcnJ5CisJaW5zcmRpCSR0NCwkdDcsMTYsMAkJOyA2NC4uMTI3IGJpdHMKKwlzcmRpCSRjYXJyeSwkdDcsMTYJCTsgdXBwZXIgMzMgYml0cworCWxkCSR0NixgJEZSQU1FKzY0YCgkc3ApCisJbGQJJHQ3LGAkRlJBTUUrNzJgKCRzcCkKKworCWFkZGMJJHQzLCR0MCwkdDEKKwlhZGRlCSR0NSwkdDQsJHQyCisJYWRkemUJJGNhcnJ5LCRjYXJyeQorCisJc3RkCSR0MywtMTYoJHRwKQkJOyB0cFtqLTFdCisJc3RkCSR0NSwtOCgkdHApCQk7IHRwW2pdCisKKwlhZGQJJGNhcnJ5LCRjYXJyeSwkb3ZmCTsgY29tc3VtZSB1cG1vc3Qgb3ZlcmZsb3cKKwlhZGQJJHQ2LCR0NiwkY2FycnkJCTsgY2FuIG5vdCBvdmVyZmxvdworCXNyZGkJJGNhcnJ5LCR0NiwxNgorCWFkZAkkdDcsJHQ3LCRjYXJyeQorCWluc3JkaQkkdDYsJHQ3LDQ4LDAKKwlzcmRpCSRvdmYsJHQ3LDQ4CisJc3RkCSR0NiwwKCR0cCkJCTsgdHBbbnVtLTFdCisKKwlzbHdpCSR0NywkbnVtLDIKKwlhZGRpCSRpLCRpLDgKKwlzdWJmCSRuYXBfZCwkdDcsJG5hcF9kCTsgcmV3aW5kIHBvaW50ZXIKKwljbXB3CSRpLCRudW0KKwlibHQtCUxvdXRlcgorDAorCXN1YmYJJG5wLCRudW0sJG5wCTsgcmV3aW5kIG5wCisJYWRkaQkkaiwkaiwxCQk7IHJlc3RvcmUgY291bnRlcgorCXN1YmZjCSRpLCRpLCRpCTsgaj0wIGFuZCAiY2xlYXIiIFhFUltDQV0KKwlhZGRpCSR0cCwkc3AsYCRGUkFNRSskVFJBTlNGRVIrOGAKKwlhZGRpCSR0NCwkc3AsYCRGUkFNRSskVFJBTlNGRVIrMTZgCisJYWRkaQkkdDUsJG5wLDgKKwlhZGRpCSR0NiwkcnAsOAorCW10Y3RyCSRqCisKKy5hbGlnbgk0CitMc3ViOglsZHgJJHQwLCR0cCwkaQorCWxkeAkkdDEsJG5wLCRpCisJbGR4CSR0MiwkdDQsJGkKKwlsZHgJJHQzLCR0NSwkaQorCXN1YmZlCSR0MCwkdDEsJHQwCTsgdHBbal0tbnBbal0KKwlzdWJmZQkkdDIsJHQzLCR0Mgk7IHRwW2orMV0tbnBbaisxXQorCXN0ZHgJJHQwLCRycCwkaQorCXN0ZHgJJHQyLCR0NiwkaQorCWFkZGkJJGksJGksMTYKKwliZG56LQlMc3ViCisKKwlsaQkkaSwwCisJc3ViZmUJJG92ZiwkaSwkb3ZmCTsgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwlhbmQJJGFwLCR0cCwkb3ZmCisJYW5kYwkkbnAsJHJwLCRvdmYKKwlvcgkkYXAsJGFwLCRucAk7IGFwPWJvcnJvdz90cDpycAorCWFkZGkJJHQ3LCRhcCw4CisJbXRjdHIJJGoKKworLmFsaWduCTQKK0xjb3B5OgkJCQk7IGNvcHkgb3IgaW4tcGxhY2UgcmVmcmVzaAorCWxkeAkkdDAsJGFwLCRpCisJbGR4CSR0MSwkdDcsJGkKKwlzdGQJJGksOCgkbmFwX2QpCTsgemFwIG5hcF9kCisJc3RkCSRpLDE2KCRuYXBfZCkKKwlzdGQJJGksMjQoJG5hcF9kKQorCXN0ZAkkaSwzMigkbmFwX2QpCisJc3RkCSRpLDQwKCRuYXBfZCkKKwlzdGQJJGksNDgoJG5hcF9kKQorCXN0ZAkkaSw1NigkbmFwX2QpCisJc3RkdQkkaSw2NCgkbmFwX2QpCisJc3RkeAkkdDAsJHJwLCRpCisJc3RkeAkkdDEsJHQ2LCRpCisJc3RkeAkkaSwkdHAsJGkJOyB6YXAgdHAgYXQgb25jZQorCXN0ZHgJJGksJHQ0LCRpCisJYWRkaQkkaSwkaSwxNgorCWJkbnotCUxjb3B5CisMCisJJFBPUAlyMTQsYDIqJFNJWkVfVGAoJHNwKQorCSRQT1AJcjE1LGAzKiRTSVpFX1RgKCRzcCkKKwkkUE9QCXIxNixgNCokU0laRV9UYCgkc3ApCisJJFBPUAlyMTcsYDUqJFNJWkVfVGAoJHNwKQorCSRQT1AJcjE4LGA2KiRTSVpFX1RgKCRzcCkKKwkkUE9QCXIxOSxgNyokU0laRV9UYCgkc3ApCisJJFBPUAlyMjAsYDgqJFNJWkVfVGAoJHNwKQorCSRQT1AJcjIxLGA5KiRTSVpFX1RgKCRzcCkKKwkkUE9QCXIyMixgMTAqJFNJWkVfVGAoJHNwKQorCSRQT1AJcjIzLGAxMSokU0laRV9UYCgkc3ApCisJbGZkCWYxNCxgMTIqJFNJWkVfVCswYCgkc3ApCisJbGZkCWYxNSxgMTIqJFNJWkVfVCs4YCgkc3ApCisJbGZkCWYxNixgMTIqJFNJWkVfVCsxNmAoJHNwKQorCWxmZAlmMTcsYDEyKiRTSVpFX1QrMjRgKCRzcCkKKwlsZmQJZjE4LGAxMiokU0laRV9UKzMyYCgkc3ApCisJbGZkCWYxOSxgMTIqJFNJWkVfVCs0MGAoJHNwKQorCWxmZAlmMjAsYDEyKiRTSVpFX1QrNDhgKCRzcCkKKwlsZmQJZjIxLGAxMiokU0laRV9UKzU2YCgkc3ApCisJbGZkCWYyMixgMTIqJFNJWkVfVCs2NGAoJHNwKQorCWxmZAlmMjMsYDEyKiRTSVpFX1QrNzJgKCRzcCkKKwlsZmQJZjI0LGAxMiokU0laRV9UKzgwYCgkc3ApCisJbGZkCWYyNSxgMTIqJFNJWkVfVCs4OGAoJHNwKQorCSRQT1AJJHNwLDAoJHNwKQorCWxpCXIzLDEJOyBzaWduYWwgImhhbmRsZWQiCisJYmxyCisJLmxvbmcJMAorLmFzY2l6ICAiTW9udGdvbWVyeSBNdWx0aXBsaWNhdGlvbiBmb3IgUFBDNjQsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBmeS5jaGFsbWVycy5zZT4iCitfX18KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CitwcmludCAkY29kZTsKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vczM5MHgtbW9udC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vczM5MHgtbW9udC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjMyNTEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9zMzkweC1tb250LnBsCkBAIC0wLDAgKzEsMjI1IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgQXByaWwgMjAwNy4KKyMKKyMgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb3ZlciB2YW5pbGxhIEMgY29kZSB2YXJpZXMgZnJvbSA4NSUgdG8gNDUlCisjIGRlcGVuZGluZyBvbiBrZXkgbGVuZ3RoIGFuZCBiZW5jaG1hcmsuIFVuZm9ydHVuYXRlbHkgaW4gdGhpcyBjb250ZXh0CisjIHRoZXNlIGFyZSBub3QgdmVyeSBpbXByZXNzaXZlIHJlc3VsdHMgW2ZvciBjb2RlIHRoYXQgdXRpbGl6ZXMgIndpZGUiCisjIDY0eDY0PTEyOC1iaXQgbXVsdGlwbGljYXRpb24sIHdoaWNoIGlzIG5vdCBjb21tb25seSBhdmFpbGFibGUgdG8gQworIyBwcm9ncmFtbWVyc10sIGF0IGxlYXN0IGhhbmQtY29kZWQgYm5fYXNtLmMgcmVwbGFjZW1lbnQgaXMga25vd24gdG8KKyMgcHJvdmlkZSAzMC00MCUgYmV0dGVyIHJlc3VsdHMgZm9yIGxvbmdlc3Qga2V5cy4gV2VsbCwgb24gYSBzZWNvbmQKKyMgdGhvdWdodCBpdCdzIG5vdCB2ZXJ5IHN1cnByaXNpbmcsIGJlY2F1c2Ugei1DUFVzIGFyZSBzaW5nbGUtaXNzdWUKKyMgYW5kIF9zdHJpY3RseV8gaW4tb3JkZXIgZXhlY3V0aW9uLCB3aGlsZSBibl9tdWxfbW9udCBpcyBtb3JlIG9yIGxlc3MKKyMgZGVwZW5kZW50IG9uIENQVSBhYmlsaXR5IHRvIHBpcGUtbGluZSBpbnN0cnVjdGlvbnMgYW5kIGhhdmUgc2V2ZXJhbAorIyBvZiB0aGVtICJpbi1mbGlnaHQiIGF0IHRoZSBzYW1lIHRpbWUuIEkgbWVhbiB3aGlsZSBvdGhlciBtZXRob2RzLAorIyBmb3IgZXhhbXBsZSBLYXJhdHN1YmEsIGFpbSB0byBtaW5pbWl6ZSBhbW91bnQgb2YgbXVsdGlwbGljYXRpb25zIGF0CisjIHRoZSBjb3N0IG9mIG90aGVyIG9wZXJhdGlvbnMgaW5jcmVhc2UsIGJuX211bF9tb250IGFpbSB0byBuZWF0bHkKKyMgIm92ZXJsYXAiIG11bHRpcGxpY2F0aW9ucyBhbmQgdGhlIG90aGVyIG9wZXJhdGlvbnMgW2FuZCBvbiBtb3N0CisjIHBsYXRmb3JtcyBldmVuIG1pbmltaXplIHRoZSBhbW91bnQgb2YgdGhlIG90aGVyIG9wZXJhdGlvbnMsIGluCisjIHBhcnRpY3VsYXIgcmVmZXJlbmNlcyB0byBtZW1vcnldLiBCdXQgaXQncyBwb3NzaWJsZSB0byBpbXByb3ZlIHRoaXMKKyMgbW9kdWxlIHBlcmZvcm1hbmNlIGJ5IGltcGxlbWVudGluZyBkZWRpY2F0ZWQgc3F1YXJpbmcgY29kZS1wYXRoIGFuZAorIyBwb3NzaWJseSBieSB1bnJvbGxpbmcgbG9vcHMuLi4KKworIyBKYW51YXJ5IDIwMDkuCisjCisjIFJlc2NoZWR1bGUgdG8gbWluaW1pemUvYXZvaWQgQWRkcmVzcyBHZW5lcmF0aW9uIEludGVybG9jayBoYXphcmQsCisjIG1ha2UgaW5uZXIgbG9vcHMgY291bnRlci1iYXNlZC4KKworJG1uMD0iJXIwIjsKKyRudW09IiVyMSI7CisKKyMgaW50IGJuX211bF9tb250KAorJHJwPSIlcjIiOwkJIyBCTl9VTE9ORyAqcnAsCiskYXA9IiVyMyI7CQkjIGNvbnN0IEJOX1VMT05HICphcCwKKyRicD0iJXI0IjsJCSMgY29uc3QgQk5fVUxPTkcgKmJwLAorJG5wPSIlcjUiOwkJIyBjb25zdCBCTl9VTE9ORyAqbnAsCiskbjA9IiVyNiI7CQkjIGNvbnN0IEJOX1VMT05HICpuMCwKKyMkbnVtPSIxNjAoJXIxNSkiCSMgaW50IG51bSk7CisKKyRiaT0iJXIyIjsJIyB6YXBzIHJwCiskaj0iJXI3IjsKKworJGFoaT0iJXI4IjsKKyRhbG89IiVyOSI7CiskbmhpPSIlcjEwIjsKKyRubG89IiVyMTEiOworJEFIST0iJXIxMiI7CiskTkhJPSIlcjEzIjsKKyRjb3VudD0iJXIxNCI7Ciskc3A9IiVyMTUiOworCiskY29kZS49PDxfX187CisudGV4dAorLmdsb2JsCWJuX211bF9tb250CisudHlwZQlibl9tdWxfbW9udCxcQGZ1bmN0aW9uCitibl9tdWxfbW9udDoKKwlsZ2YJJG51bSwxNjQoJHNwKQkjIHB1bGwgJG51bQorCXNsYQkkbnVtLDMJCSMgJG51bSB0byBlbnVtZXJhdGUgYnl0ZXMKKwlsYQkkYnAsMCgkbnVtLCRicCkKKworCXN0ZwklcjIsMTYoJHNwKQorCisJY2doaQkkbnVtLDE2CQkjCisJbGdoaQklcjIsMAkJIworCWJscgklcjE0CQkjIGlmKCRudW08MTYpIHJldHVybiAwOworCWNnaGkJJG51bSwxMjgJIworCWJocgklcjE0CQkjIGlmKCRudW0+MTI4KSByZXR1cm4gMDsKKworCXN0bWcJJXIzLCVyMTUsMjQoJHNwKQorCisJbGdoaQkkcnAsLTE2MC04CSMgbGVhdmUgcm9vbSBmb3IgY2FycnkgYml0CisJbGNncgkkaiwkbnVtCQkjIC0kbnVtCisJbGdyCSVyMCwkc3AKKwlsYQkkcnAsMCgkcnAsJHNwKQorCWxhCSRzcCwwKCRqLCRycCkJIyBhbGxvY2EKKwlzdGcJJXIwLDAoJHNwKQkjIGJhY2sgY2hhaW4KKworCXNyYQkkbnVtLDMJCSMgcmVzdG9yZSAkbnVtCisJbGEJJGJwLDAoJGosJGJwKQkjIHJlc3RvcmUgJGJwCisJYWhpCSRudW0sLTEJCSMgYWRqdXN0ICRudW0gZm9yIGlubmVyIGxvb3AKKwlsZwkkbjAsMCgkbjApCSMgcHVsbCBuMAorCisJbGcJJGJpLDAoJGJwKQorCWxnCSRhbG8sMCgkYXApCisJbWxncgkkYWhpLCRiaQkjIGFwWzBdKmJwWzBdCisJbGdyCSRBSEksJGFoaQorCisJbGdyCSRtbjAsJGFsbwkjICJ0cFswXSIqbjAKKwltc2dyCSRtbjAsJG4wCisKKwlsZwkkbmxvLDAoJG5wKQkjCisJbWxncgkkbmhpLCRtbjAJIyBucFswXSptMQorCWFsZ3IJJG5sbywkYWxvCSMgKz0idHBbMF0iCisJbGdoaQkkTkhJLDAKKwlhbGNncgkkTkhJLCRuaGkKKworCWxhCSRqLDgoJXIwKQkjIGo9MQorCWxyCSRjb3VudCwkbnVtCisKKy5hbGlnbgkxNgorLkwxc3Q6CisJbGcJJGFsbywwKCRqLCRhcCkKKwltbGdyCSRhaGksJGJpCSMgYXBbal0qYnBbMF0KKwlhbGdyCSRhbG8sJEFISQorCWxnaGkJJEFISSwwCisJYWxjZ3IJJEFISSwkYWhpCisKKwlsZwkkbmxvLDAoJGosJG5wKQorCW1sZ3IJJG5oaSwkbW4wCSMgbnBbal0qbTEKKwlhbGdyCSRubG8sJE5ISQorCWxnaGkJJE5ISSwwCisJYWxjZ3IJJG5oaSwkTkhJCSMgKz0idHBbal0iCisJYWxncgkkbmxvLCRhbG8KKwlhbGNncgkkTkhJLCRuaGkKKworCXN0ZwkkbmxvLDE2MC04KCRqLCRzcCkJIyB0cFtqLTFdPQorCWxhCSRqLDgoJGopCSMgaisrCisJYnJjdAkkY291bnQsLkwxc3QKKworCWFsZ3IJJE5ISSwkQUhJCisJbGdoaQkkQUhJLDAKKwlhbGNncgkkQUhJLCRBSEkJIyB1cG1vc3Qgb3ZlcmZsb3cgYml0CisJc3RnCSROSEksMTYwLTgoJGosJHNwKQorCXN0ZwkkQUhJLDE2MCgkaiwkc3ApCisJbGEJJGJwLDgoJGJwKQkjIGJwKysKKworLkxvdXRlcjoKKwlsZwkkYmksMCgkYnApCSMgYnBbaV0KKwlsZwkkYWxvLDAoJGFwKQorCW1sZ3IJJGFoaSwkYmkJIyBhcFswXSpicFtpXQorCWFsZwkkYWxvLDE2MCgkc3ApCSMgKz10cFswXQorCWxnaGkJJEFISSwwCisJYWxjZ3IJJEFISSwkYWhpCisKKwlsZ3IJJG1uMCwkYWxvCisJbXNncgkkbW4wLCRuMAkjIHRwWzBdKm4wCisKKwlsZwkkbmxvLDAoJG5wKQkjIG5wWzBdCisJbWxncgkkbmhpLCRtbjAJIyBucFswXSptMQorCWFsZ3IJJG5sbywkYWxvCSMgKz0idHBbMF0iCisJbGdoaQkkTkhJLDAKKwlhbGNncgkkTkhJLCRuaGkKKworCWxhCSRqLDgoJXIwKQkjIGo9MQorCWxyCSRjb3VudCwkbnVtCisKKy5hbGlnbgkxNgorLkxpbm5lcjoKKwlsZwkkYWxvLDAoJGosJGFwKQorCW1sZ3IJJGFoaSwkYmkJIyBhcFtqXSpicFtpXQorCWFsZ3IJJGFsbywkQUhJCisJbGdoaQkkQUhJLDAKKwlhbGNncgkkYWhpLCRBSEkKKwlhbGcJJGFsbywxNjAoJGosJHNwKSMgKz10cFtqXQorCWFsY2dyCSRBSEksJGFoaQorCisJbGcJJG5sbywwKCRqLCRucCkKKwltbGdyCSRuaGksJG1uMAkjIG5wW2pdKm0xCisJYWxncgkkbmxvLCROSEkKKwlsZ2hpCSROSEksMAorCWFsY2dyCSRuaGksJE5ISQorCWFsZ3IJJG5sbywkYWxvCSMgKz0idHBbal0iCisJYWxjZ3IJJE5ISSwkbmhpCisKKwlzdGcJJG5sbywxNjAtOCgkaiwkc3ApCSMgdHBbai0xXT0KKwlsYQkkaiw4KCRqKQkjIGorKworCWJyY3QJJGNvdW50LC5MaW5uZXIKKworCWFsZ3IJJE5ISSwkQUhJCisJbGdoaQkkQUhJLDAKKwlhbGNncgkkQUhJLCRBSEkKKwlhbGcJJE5ISSwxNjAoJGosJHNwKSMgYWNjdW11bGF0ZSBwcmV2aW91cyB1cG1vc3Qgb3ZlcmZsb3cgYml0CisJbGdoaQkkYWhpLDAKKwlhbGNncgkkQUhJLCRhaGkJIyBuZXcgdXBtb3N0IG92ZXJmbG93IGJpdAorCXN0ZwkkTkhJLDE2MC04KCRqLCRzcCkKKwlzdGcJJEFISSwxNjAoJGosJHNwKQorCisJbGEJJGJwLDgoJGJwKQkjIGJwKysKKwljbGcJJGJwLDE2MCs4KzMyKCRqLCRzcCkJIyBjb21wYXJlIHRvICZicFtudW1dCisJam5lCS5Mb3V0ZXIKKworCWxnCSRycCwxNjArOCsxNigkaiwkc3ApCSMgcmVpbmNhcm5hdGUgcnAKKwlsYQkkYXAsMTYwKCRzcCkKKwlhaGkJJG51bSwxCQkjIHJlc3RvcmUgJG51bSwgaW5jaWRlbnRhbGx5IGNsZWFycyAiYm9ycm93IgorCisJbGEJJGosMCglcjApCisJbHIJJGNvdW50LCRudW0KKy5Mc3ViOglsZwkkYWxvLDAoJGosJGFwKQorCXNsYmcJJGFsbywwKCRqLCRucCkKKwlzdGcJJGFsbywwKCRqLCRycCkKKwlsYQkkaiw4KCRqKQorCWJyY3QJJGNvdW50LC5Mc3ViCisJbGdoaQkkYWhpLDAKKwlzbGJncgkkQUhJLCRhaGkJIyBoYW5kbGUgdXBtb3N0IGNhcnJ5CisKKwluZ3IJJGFwLCRBSEkKKwlsZ2hpCSRucCwtMQorCXhncgkkbnAsJEFISQorCW5ncgkkbnAsJHJwCisJb2dyCSRhcCwkbnAJCSMgYXA9Ym9ycm93P3RwOnJwCisKKwlsYQkkaiwwKCVyMCkKKwlsZ3IJJGNvdW50LCRudW0KKy5MY29weToJbGcJJGFsbywwKCRqLCRhcCkJIyBjb3B5IG9yIGluLXBsYWNlIHJlZnJlc2gKKwlzdGcJJGosMTYwKCRqLCRzcCkJIyB6YXAgdHAKKwlzdGcJJGFsbywwKCRqLCRycCkKKwlsYQkkaiw4KCRqKQorCWJyY3QJJGNvdW50LC5MY29weQorCisJbGEJJXIxLDE2MCs4KzQ4KCRqLCRzcCkKKwlsbWcJJXI2LCVyMTUsMCglcjEpCisJbGdoaQklcjIsMQkJIyBzaWduYWwgInByb2Nlc3NlZCIKKwlicgklcjE0Cisuc2l6ZQlibl9tdWxfbW9udCwuLWJuX211bF9tb250Cisuc3RyaW5nCSJNb250Z29tZXJ5IE11bHRpcGxpY2F0aW9uIGZvciBzMzkweCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworCitwcmludCAkY29kZTsKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vczM5MHguUyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vczM5MHguUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ1ZjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9zMzkweC5TCkBAIC0wLDAgKzEsNjc4IEBACisuaWRlbnQgInMzOTB4LlMsIHZlcnNpb24gMS4wIgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorLy8gcHJvamVjdC4KKy8vCisvLyBSaWdodHMgZm9yIHJlZGlzdHJpYnV0aW9uIGFuZCB1c2FnZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUKKy8vIGdyYW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBPcGVuU1NMIGxpY2Vuc2UuIFdhcnJhbnR5IG9mIGFueSBraW5kIGlzCisvLyBkaXNjbGFpbWVkLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLnRleHQKKworI2RlZmluZSB6ZXJvCSVyMAorCisvLyBCTl9VTE9ORyBibl9tdWxfYWRkX3dvcmRzKEJOX1VMT05HICpyMixCTl9VTE9ORyAqcjMsaW50IHI0LEJOX1VMT05HIHI1KTsKKy5nbG9ibAlibl9tdWxfYWRkX3dvcmRzCisudHlwZQlibl9tdWxfYWRkX3dvcmRzLEBmdW5jdGlvbgorLmFsaWduCTQKK2JuX211bF9hZGRfd29yZHM6CisJbGdoaQl6ZXJvLDAJCS8vIHplcm8gPSAwCisJbGEJJXIxLDAoJXIyKQkvLyBwdXQgcnAgYXNpZGUKKwlsZ2hpCSVyMiwwCQkvLyBpPTA7CisJbHRnZnIJJXI0LCVyNAorCWJsZXIJJXIxNAkJLy8gaWYgKGxlbjw9MCkgcmV0dXJuIDA7CisKKwlzdG1nCSVyNiwlcjEwLDQ4KCVyMTUpCisJbGdoaQklcjgsMAkJLy8gY2FycnkgPSAwCisJc3JhZwklcjEwLCVyNCwyCS8vIGNudD1sZW4vNAorCWp6CS5Mb29wMV9tYWRkCisKKy5Mb29wNF9tYWRkOgorCWxnCSVyNywwKCVyMiwlcjMpCS8vIGFwW2ldCisJbWxncgklcjYsJXI1CQkvLyAqPXcKKwlhbGdyCSVyNywlcjgJCS8vICs9Y2FycnkKKwlhbGNncgklcjYsemVybworCWFsZwklcjcsMCglcjIsJXIxKQkvLyArPXJwW2ldCisJYWxjZ3IJJXI2LHplcm8KKwlzdGcJJXI3LDAoJXIyLCVyMSkJLy8gcnBbaV09CisKKwlsZwklcjksOCglcjIsJXIzKQorCW1sZ3IJJXI4LCVyNQorCWFsZ3IJJXI5LCVyNgorCWFsY2dyCSVyOCx6ZXJvCisJYWxnCSVyOSw4KCVyMiwlcjEpCisJYWxjZ3IJJXI4LHplcm8KKwlzdGcJJXI5LDgoJXIyLCVyMSkKKworCWxnCSVyNywxNiglcjIsJXIzKQorCW1sZ3IJJXI2LCVyNQorCWFsZ3IJJXI3LCVyOAorCWFsY2dyCSVyNix6ZXJvCisJYWxnCSVyNywxNiglcjIsJXIxKQorCWFsY2dyCSVyNix6ZXJvCisJc3RnCSVyNywxNiglcjIsJXIxKQorCisJbGcJJXI5LDI0KCVyMiwlcjMpCisJbWxncgklcjgsJXI1CisJYWxncgklcjksJXI2CisJYWxjZ3IJJXI4LHplcm8KKwlhbGcJJXI5LDI0KCVyMiwlcjEpCisJYWxjZ3IJJXI4LHplcm8KKwlzdGcJJXI5LDI0KCVyMiwlcjEpCisKKwlsYQklcjIsMzIoJXIyKQkvLyBpKz00CisJYnJjdAklcjEwLC5Mb29wNF9tYWRkCisKKwlsZ2hpCSVyMTAsMworCW5yCSVyNCwlcjEwCS8vIGNudD1sZW4lNAorCWp6CS5MZW5kX21hZGQKKworLkxvb3AxX21hZGQ6CisJbGcJJXI3LDAoJXIyLCVyMykJLy8gYXBbaV0KKwltbGdyCSVyNiwlcjUJCS8vICo9dworCWFsZ3IJJXI3LCVyOAkJLy8gKz1jYXJyeQorCWFsY2dyCSVyNix6ZXJvCisJYWxnCSVyNywwKCVyMiwlcjEpCS8vICs9cnBbaV0KKwlhbGNncgklcjYsemVybworCXN0ZwklcjcsMCglcjIsJXIxKQkvLyBycFtpXT0KKworCWxncgklcjgsJXI2CisJbGEJJXIyLDgoJXIyKQkvLyBpKysKKwlicmN0CSVyNCwuTG9vcDFfbWFkZAorCisuTGVuZF9tYWRkOgorCWxncgklcjIsJXI4CisJbG1nCSVyNiwlcjEwLDQ4KCVyMTUpCisJYnIJJXIxNAorLnNpemUJYm5fbXVsX2FkZF93b3JkcywuLWJuX211bF9hZGRfd29yZHMKKworLy8gQk5fVUxPTkcgYm5fbXVsX3dvcmRzKEJOX1VMT05HICpyMixCTl9VTE9ORyAqcjMsaW50IHI0LEJOX1VMT05HIHI1KTsKKy5nbG9ibAlibl9tdWxfd29yZHMKKy50eXBlCWJuX211bF93b3JkcyxAZnVuY3Rpb24KKy5hbGlnbgk0Citibl9tdWxfd29yZHM6CisJbGdoaQl6ZXJvLDAJCS8vIHplcm8gPSAwCisJbGEJJXIxLDAoJXIyKQkvLyBwdXQgcnAgYXNpZGUKKwlsZ2hpCSVyMiwwCQkvLyBpPTA7CisJbHRnZnIJJXI0LCVyNAorCWJsZXIJJXIxNAkJLy8gaWYgKGxlbjw9MCkgcmV0dXJuIDA7CisKKwlzdG1nCSVyNiwlcjEwLDQ4KCVyMTUpCisJbGdoaQklcjgsMAkJLy8gY2FycnkgPSAwCisJc3JhZwklcjEwLCVyNCwyCS8vIGNudD1sZW4vNAorCWp6CS5Mb29wMV9tdWwKKworLkxvb3A0X211bDoKKwlsZwklcjcsMCglcjIsJXIzKQkvLyBhcFtpXQorCW1sZ3IJJXI2LCVyNQkJLy8gKj13CisJYWxncgklcjcsJXI4CQkvLyArPWNhcnJ5CisJYWxjZ3IJJXI2LHplcm8KKwlzdGcJJXI3LDAoJXIyLCVyMSkJLy8gcnBbaV09CisKKwlsZwklcjksOCglcjIsJXIzKQorCW1sZ3IJJXI4LCVyNQorCWFsZ3IJJXI5LCVyNgorCWFsY2dyCSVyOCx6ZXJvCisJc3RnCSVyOSw4KCVyMiwlcjEpCisKKwlsZwklcjcsMTYoJXIyLCVyMykKKwltbGdyCSVyNiwlcjUKKwlhbGdyCSVyNywlcjgKKwlhbGNncgklcjYsemVybworCXN0ZwklcjcsMTYoJXIyLCVyMSkKKworCWxnCSVyOSwyNCglcjIsJXIzKQorCW1sZ3IJJXI4LCVyNQorCWFsZ3IJJXI5LCVyNgorCWFsY2dyCSVyOCx6ZXJvCisJc3RnCSVyOSwyNCglcjIsJXIxKQorCisJbGEJJXIyLDMyKCVyMikJLy8gaSs9NAorCWJyY3QJJXIxMCwuTG9vcDRfbXVsCisKKwlsZ2hpCSVyMTAsMworCW5yCSVyNCwlcjEwCS8vIGNudD1sZW4lNAorCWp6CS5MZW5kX211bAorCisuTG9vcDFfbXVsOgorCWxnCSVyNywwKCVyMiwlcjMpCS8vIGFwW2ldCisJbWxncgklcjYsJXI1CQkvLyAqPXcKKwlhbGdyCSVyNywlcjgJCS8vICs9Y2FycnkKKwlhbGNncgklcjYsemVybworCXN0ZwklcjcsMCglcjIsJXIxKQkvLyBycFtpXT0KKworCWxncgklcjgsJXI2CisJbGEJJXIyLDgoJXIyKQkvLyBpKysKKwlicmN0CSVyNCwuTG9vcDFfbXVsCisKKy5MZW5kX211bDoKKwlsZ3IJJXIyLCVyOAorCWxtZwklcjYsJXIxMCw0OCglcjE1KQorCWJyCSVyMTQKKy5zaXplCWJuX211bF93b3JkcywuLWJuX211bF93b3JkcworCisvLyB2b2lkIGJuX3Nxcl93b3JkcyhCTl9VTE9ORyAqcjIsQk5fVUxPTkcgKnIyLGludCByNCkKKy5nbG9ibAlibl9zcXJfd29yZHMKKy50eXBlCWJuX3Nxcl93b3JkcyxAZnVuY3Rpb24KKy5hbGlnbgk0Citibl9zcXJfd29yZHM6CisJbHRnZnIJJXI0LCVyNAorCWJsZXIJJXIxNAorCisJc3RtZwklcjYsJXI3LDQ4KCVyMTUpCisJc3JhZwklcjEsJXI0LDIJLy8gY250PWxlbi80CisJanoJLkxvb3AxX3NxcgorCisuTG9vcDRfc3FyOgorCWxnCSVyNywwKCVyMykKKwltbGdyCSVyNiwlcjcKKwlzdGcJJXI3LDAoJXIyKQorCXN0ZwklcjYsOCglcjIpCisKKwlsZwklcjcsOCglcjMpCisJbWxncgklcjYsJXI3CisJc3RnCSVyNywxNiglcjIpCisJc3RnCSVyNiwyNCglcjIpCisKKwlsZwklcjcsMTYoJXIzKQorCW1sZ3IJJXI2LCVyNworCXN0ZwklcjcsMzIoJXIyKQorCXN0ZwklcjYsNDAoJXIyKQorCisJbGcJJXI3LDI0KCVyMykKKwltbGdyCSVyNiwlcjcKKwlzdGcJJXI3LDQ4KCVyMikKKwlzdGcJJXI2LDU2KCVyMikKKworCWxhCSVyMywzMiglcjMpCisJbGEJJXIyLDY0KCVyMikKKwlicmN0CSVyMSwuTG9vcDRfc3FyCisKKwlsZ2hpCSVyMSwzCisJbnIJJXI0LCVyMQkJLy8gY250PWxlbiU0CisJanoJLkxlbmRfc3FyCisKKy5Mb29wMV9zcXI6CisJbGcJJXI3LDAoJXIzKQorCW1sZ3IJJXI2LCVyNworCXN0ZwklcjcsMCglcjIpCisJc3RnCSVyNiw4KCVyMikKKworCWxhCSVyMyw4KCVyMykKKwlsYQklcjIsMTYoJXIyKQorCWJyY3QJJXI0LC5Mb29wMV9zcXIKKworLkxlbmRfc3FyOgorCWxtZwklcjYsJXI3LDQ4KCVyMTUpCisJYnIJJXIxNAorLnNpemUJYm5fc3FyX3dvcmRzLC4tYm5fc3FyX3dvcmRzCisKKy8vIEJOX1VMT05HIGJuX2Rpdl93b3JkcyhCTl9VTE9ORyBoLEJOX1VMT05HIGwsQk5fVUxPTkcgZCk7CisuZ2xvYmwJYm5fZGl2X3dvcmRzCisudHlwZQlibl9kaXZfd29yZHMsQGZ1bmN0aW9uCisuYWxpZ24JNAorYm5fZGl2X3dvcmRzOgorCWRsZ3IJJXIyLCVyNAorCWxncgklcjIsJXIzCisJYnIJJXIxNAorLnNpemUJYm5fZGl2X3dvcmRzLC4tYm5fZGl2X3dvcmRzCisKKy8vIEJOX1VMT05HIGJuX2FkZF93b3JkcyhCTl9VTE9ORyAqcjIsQk5fVUxPTkcgKnIzLEJOX1VMT05HICpyNCxpbnQgcjUpOworLmdsb2JsCWJuX2FkZF93b3JkcworLnR5cGUJYm5fYWRkX3dvcmRzLEBmdW5jdGlvbgorLmFsaWduCTQKK2JuX2FkZF93b3JkczoKKwlsYQklcjEsMCglcjIpCS8vIHB1dCBycCBhc2lkZQorCWxnaGkJJXIyLDAJCS8vIGk9MAorCWx0Z2ZyCSVyNSwlcjUKKwlibGVyCSVyMTQJCS8vIGlmIChsZW48PTApIHJldHVybiAwOworCisJc3RnCSVyNiw0OCglcjE1KQorCWxnaGkJJXI2LDMKKwlucgklcjYsJXI1CQkvLyBsZW4lNAorCXNyYQklcjUsMgkJLy8gbGVuLzQsIHVzZSBzcmEgYmVjYXVzZSBpdCBzZXRzIGNvbmRpdGlvbiBjb2RlCisJanoJLkxvb3AxX2FkZAkvLyBjYXJyeSBpcyBpbmNpZGVudGFsbHkgY2xlYXJlZCBpZiBicmFuY2ggdGFrZW4KKwlhbGdyCSVyMiwlcjIJCS8vIGNsZWFyIGNhcnJ5CisKKy5Mb29wNF9hZGQ6CisJbGcJJXIwLDAoJXIyLCVyMykKKwlhbGNnCSVyMCwwKCVyMiwlcjQpCisJc3RnCSVyMCwwKCVyMiwlcjEpCisJbGcJJXIwLDgoJXIyLCVyMykKKwlhbGNnCSVyMCw4KCVyMiwlcjQpCisJc3RnCSVyMCw4KCVyMiwlcjEpCisJbGcJJXIwLDE2KCVyMiwlcjMpCisJYWxjZwklcjAsMTYoJXIyLCVyNCkKKwlzdGcJJXIwLDE2KCVyMiwlcjEpCisJbGcJJXIwLDI0KCVyMiwlcjMpCisJYWxjZwklcjAsMjQoJXIyLCVyNCkKKwlzdGcJJXIwLDI0KCVyMiwlcjEpCisKKwlsYQklcjIsMzIoJXIyKQkvLyBpKz00CisJYnJjdAklcjUsLkxvb3A0X2FkZAorCisJbGEJJXI2LDEoJXI2KQkvLyBzZWUgaWYgbGVuJTQgaXMgemVybyAuLi4KKwlicmN0CSVyNiwuTG9vcDFfYWRkCS8vIHdpdGhvdXQgdG91Y2hpbmcgY29uZGl0aW9uIGNvZGU6LSkKKworLkxleGl0X2FkZDoKKwlsZ2hpCSVyMiwwCisJYWxjZ3IJJXIyLCVyMgorCWxnCSVyNiw0OCglcjE1KQorCWJyCSVyMTQKKworLkxvb3AxX2FkZDoKKwlsZwklcjAsMCglcjIsJXIzKQorCWFsY2cJJXIwLDAoJXIyLCVyNCkKKwlzdGcJJXIwLDAoJXIyLCVyMSkKKworCWxhCSVyMiw4KCVyMikJLy8gaSsrCisJYnJjdAklcjYsLkxvb3AxX2FkZAorCisJagkuTGV4aXRfYWRkCisuc2l6ZQlibl9hZGRfd29yZHMsLi1ibl9hZGRfd29yZHMKKworLy8gQk5fVUxPTkcgYm5fc3ViX3dvcmRzKEJOX1VMT05HICpyMixCTl9VTE9ORyAqcjMsQk5fVUxPTkcgKnI0LGludCByNSk7CisuZ2xvYmwJYm5fc3ViX3dvcmRzCisudHlwZQlibl9zdWJfd29yZHMsQGZ1bmN0aW9uCisuYWxpZ24JNAorYm5fc3ViX3dvcmRzOgorCWxhCSVyMSwwKCVyMikJLy8gcHV0IHJwIGFzaWRlCisJbGdoaQklcjIsMAkJLy8gaT0wCisJbHRnZnIJJXI1LCVyNQorCWJsZXIJJXIxNAkJLy8gaWYgKGxlbjw9MCkgcmV0dXJuIDA7CisKKwlzdGcJJXI2LDQ4KCVyMTUpCisJbGdoaQklcjYsMworCW5yCSVyNiwlcjUJCS8vIGxlbiU0CisJc3JhCSVyNSwyCQkvLyBsZW4vNCwgdXNlIHNyYSBiZWNhdXNlIGl0IHNldHMgY29uZGl0aW9uIGNvZGUKKwlqbnoJLkxvb3A0X3N1YgkvLyBib3Jyb3cgaXMgaW5jaWRlbnRhbGx5IGNsZWFyZWQgaWYgYnJhbmNoIHRha2VuCisJc2xncgklcjIsJXIyCQkvLyBjbGVhciBib3Jyb3cKKworLkxvb3AxX3N1YjoKKwlsZwklcjAsMCglcjIsJXIzKQorCXNsYmcJJXIwLDAoJXIyLCVyNCkKKwlzdGcJJXIwLDAoJXIyLCVyMSkKKworCWxhCSVyMiw4KCVyMikJLy8gaSsrCisJYnJjdAklcjYsLkxvb3AxX3N1YgorCWoJLkxleGl0X3N1YgorCisuTG9vcDRfc3ViOgorCWxnCSVyMCwwKCVyMiwlcjMpCisJc2xiZwklcjAsMCglcjIsJXI0KQorCXN0ZwklcjAsMCglcjIsJXIxKQorCWxnCSVyMCw4KCVyMiwlcjMpCisJc2xiZwklcjAsOCglcjIsJXI0KQorCXN0ZwklcjAsOCglcjIsJXIxKQorCWxnCSVyMCwxNiglcjIsJXIzKQorCXNsYmcJJXIwLDE2KCVyMiwlcjQpCisJc3RnCSVyMCwxNiglcjIsJXIxKQorCWxnCSVyMCwyNCglcjIsJXIzKQorCXNsYmcJJXIwLDI0KCVyMiwlcjQpCisJc3RnCSVyMCwyNCglcjIsJXIxKQorCisJbGEJJXIyLDMyKCVyMikJLy8gaSs9NAorCWJyY3QJJXI1LC5Mb29wNF9zdWIKKworCWxhCSVyNiwxKCVyNikJLy8gc2VlIGlmIGxlbiU0IGlzIHplcm8gLi4uCisJYnJjdAklcjYsLkxvb3AxX3N1YgkvLyB3aXRob3V0IHRvdWNoaW5nIGNvbmRpdGlvbiBjb2RlOi0pCisKKy5MZXhpdF9zdWI6CisJbGdoaQklcjIsMAorCXNsYmdyCSVyMiwlcjIKKwlsY2dyCSVyMiwlcjIKKwlsZwklcjYsNDgoJXIxNSkKKwlicgklcjE0Cisuc2l6ZQlibl9zdWJfd29yZHMsLi1ibl9zdWJfd29yZHMKKworI2RlZmluZSBjMQklcjEKKyNkZWZpbmUgYzIJJXI1CisjZGVmaW5lIGMzCSVyOAorCisjZGVmaW5lIG11bF9hZGRfYyhhaSxiaSxjMSxjMixjMykJXAorCWxnCSVyNyxhaSo4KCVyMyk7CQlcCisJbWxnCSVyNixiaSo4KCVyNCk7CQlcCisJYWxncgljMSwlcjc7CQkJXAorCWFsY2dyCWMyLCVyNjsJCQlcCisJYWxjZ3IJYzMsemVybworCisvLyB2b2lkIGJuX211bF9jb21iYTgoQk5fVUxPTkcgKnIyLEJOX1VMT05HICpyMyxCTl9VTE9ORyAqcjQpOworLmdsb2JsCWJuX211bF9jb21iYTgKKy50eXBlCWJuX211bF9jb21iYTgsQGZ1bmN0aW9uCisuYWxpZ24JNAorYm5fbXVsX2NvbWJhODoKKwlzdG1nCSVyNiwlcjgsNDgoJXIxNSkKKworCWxnaGkJYzEsMAorCWxnaGkJYzIsMAorCWxnaGkJYzMsMAorCWxnaGkJemVybywwCisKKwltdWxfYWRkX2MoMCwwLGMxLGMyLGMzKTsKKwlzdGcJYzEsMCo4KCVyMikKKwlsZ2hpCWMxLDAKKworCW11bF9hZGRfYygwLDEsYzIsYzMsYzEpOworCW11bF9hZGRfYygxLDAsYzIsYzMsYzEpOworCXN0ZwljMiwxKjgoJXIyKQorCWxnaGkJYzIsMAorCisJbXVsX2FkZF9jKDIsMCxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDEsMSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDAsMixjMyxjMSxjMik7CisJc3RnCWMzLDIqOCglcjIpCisJbGdoaQljMywwCisKKwltdWxfYWRkX2MoMCwzLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoMSwyLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoMiwxLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoMywwLGMxLGMyLGMzKTsKKwlzdGcJYzEsMyo4KCVyMikKKwlsZ2hpCWMxLDAKKworCW11bF9hZGRfYyg0LDAsYzIsYzMsYzEpOworCW11bF9hZGRfYygzLDEsYzIsYzMsYzEpOworCW11bF9hZGRfYygyLDIsYzIsYzMsYzEpOworCW11bF9hZGRfYygxLDMsYzIsYzMsYzEpOworCW11bF9hZGRfYygwLDQsYzIsYzMsYzEpOworCXN0ZwljMiw0KjgoJXIyKQorCWxnaGkJYzIsMAorCisJbXVsX2FkZF9jKDAsNSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDEsNCxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDIsMyxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDMsMixjMyxjMSxjMik7CisJbXVsX2FkZF9jKDQsMSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDUsMCxjMyxjMSxjMik7CisJc3RnCWMzLDUqOCglcjIpCisJbGdoaQljMywwCisKKwltdWxfYWRkX2MoNiwwLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoNSwxLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoNCwyLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoMywzLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoMiw0LGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoMSw1LGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoMCw2LGMxLGMyLGMzKTsKKwlzdGcJYzEsNio4KCVyMikKKwlsZ2hpCWMxLDAKKworCW11bF9hZGRfYygwLDcsYzIsYzMsYzEpOworCW11bF9hZGRfYygxLDYsYzIsYzMsYzEpOworCW11bF9hZGRfYygyLDUsYzIsYzMsYzEpOworCW11bF9hZGRfYygzLDQsYzIsYzMsYzEpOworCW11bF9hZGRfYyg0LDMsYzIsYzMsYzEpOworCW11bF9hZGRfYyg1LDIsYzIsYzMsYzEpOworCW11bF9hZGRfYyg2LDEsYzIsYzMsYzEpOworCW11bF9hZGRfYyg3LDAsYzIsYzMsYzEpOworCXN0ZwljMiw3KjgoJXIyKQorCWxnaGkJYzIsMAorCisJbXVsX2FkZF9jKDcsMSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDYsMixjMyxjMSxjMik7CisJbXVsX2FkZF9jKDUsMyxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDQsNCxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDMsNSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKDIsNixjMyxjMSxjMik7CisJbXVsX2FkZF9jKDEsNyxjMyxjMSxjMik7CisJc3RnCWMzLDgqOCglcjIpCisJbGdoaQljMywwCisKKwltdWxfYWRkX2MoMiw3LGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoMyw2LGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoNCw1LGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoNSw0LGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoNiwzLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoNywyLGMxLGMyLGMzKTsKKwlzdGcJYzEsOSo4KCVyMikKKwlsZ2hpCWMxLDAKKworCW11bF9hZGRfYyg3LDMsYzIsYzMsYzEpOworCW11bF9hZGRfYyg2LDQsYzIsYzMsYzEpOworCW11bF9hZGRfYyg1LDUsYzIsYzMsYzEpOworCW11bF9hZGRfYyg0LDYsYzIsYzMsYzEpOworCW11bF9hZGRfYygzLDcsYzIsYzMsYzEpOworCXN0ZwljMiwxMCo4KCVyMikKKwlsZ2hpCWMyLDAKKworCW11bF9hZGRfYyg0LDcsYzMsYzEsYzIpOworCW11bF9hZGRfYyg1LDYsYzMsYzEsYzIpOworCW11bF9hZGRfYyg2LDUsYzMsYzEsYzIpOworCW11bF9hZGRfYyg3LDQsYzMsYzEsYzIpOworCXN0ZwljMywxMSo4KCVyMikKKwlsZ2hpCWMzLDAKKworCW11bF9hZGRfYyg3LDUsYzEsYzIsYzMpOworCW11bF9hZGRfYyg2LDYsYzEsYzIsYzMpOworCW11bF9hZGRfYyg1LDcsYzEsYzIsYzMpOworCXN0ZwljMSwxMio4KCVyMikKKwlsZ2hpCWMxLDAKKworCisJbXVsX2FkZF9jKDYsNyxjMixjMyxjMSk7CisJbXVsX2FkZF9jKDcsNixjMixjMyxjMSk7CisJc3RnCWMyLDEzKjgoJXIyKQorCWxnaGkJYzIsMAorCisJbXVsX2FkZF9jKDcsNyxjMyxjMSxjMik7CisJc3RnCWMzLDE0KjgoJXIyKQorCXN0ZwljMSwxNSo4KCVyMikKKworCWxtZwklcjYsJXI4LDQ4KCVyMTUpCisJYnIJJXIxNAorLnNpemUJYm5fbXVsX2NvbWJhOCwuLWJuX211bF9jb21iYTgKKworLy8gdm9pZCBibl9tdWxfY29tYmE0KEJOX1VMT05HICpyMixCTl9VTE9ORyAqcjMsQk5fVUxPTkcgKnI0KTsKKy5nbG9ibAlibl9tdWxfY29tYmE0CisudHlwZQlibl9tdWxfY29tYmE0LEBmdW5jdGlvbgorLmFsaWduCTQKK2JuX211bF9jb21iYTQ6CisJc3RtZwklcjYsJXI4LDQ4KCVyMTUpCisKKwlsZ2hpCWMxLDAKKwlsZ2hpCWMyLDAKKwlsZ2hpCWMzLDAKKwlsZ2hpCXplcm8sMAorCisJbXVsX2FkZF9jKDAsMCxjMSxjMixjMyk7CisJc3RnCWMxLDAqOCglcjMpCisJbGdoaQljMSwwCisKKwltdWxfYWRkX2MoMCwxLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoMSwwLGMyLGMzLGMxKTsKKwlzdGcJYzIsMSo4KCVyMikKKwlsZ2hpCWMyLDAKKworCW11bF9hZGRfYygyLDAsYzMsYzEsYzIpOworCW11bF9hZGRfYygxLDEsYzMsYzEsYzIpOworCW11bF9hZGRfYygwLDIsYzMsYzEsYzIpOworCXN0ZwljMywyKjgoJXIyKQorCWxnaGkJYzMsMAorCisJbXVsX2FkZF9jKDAsMyxjMSxjMixjMyk7CisJbXVsX2FkZF9jKDEsMixjMSxjMixjMyk7CisJbXVsX2FkZF9jKDIsMSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKDMsMCxjMSxjMixjMyk7CisJc3RnCWMxLDMqOCglcjIpCisJbGdoaQljMSwwCisKKwltdWxfYWRkX2MoMywxLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoMiwyLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoMSwzLGMyLGMzLGMxKTsKKwlzdGcJYzIsNCo4KCVyMikKKwlsZ2hpCWMyLDAKKworCW11bF9hZGRfYygyLDMsYzMsYzEsYzIpOworCW11bF9hZGRfYygzLDIsYzMsYzEsYzIpOworCXN0ZwljMyw1KjgoJXIyKQorCWxnaGkJYzMsMAorCisJbXVsX2FkZF9jKDMsMyxjMSxjMixjMyk7CisJc3RnCWMxLDYqOCglcjIpCisJc3RnCWMyLDcqOCglcjIpCisKKwlzdG1nCSVyNiwlcjgsNDgoJXIxNSkKKwlicgklcjE0Cisuc2l6ZQlibl9tdWxfY29tYmE0LC4tYm5fbXVsX2NvbWJhNAorCisjZGVmaW5lIHNxcl9hZGRfYyhhaSxjMSxjMixjMykJCVwKKwlsZwklcjcsYWkqOCglcjMpOwkJXAorCW1sZ3IJJXI2LCVyNzsJCVwKKwlhbGdyCWMxLCVyNzsJCQlcCisJYWxjZ3IJYzIsJXI2OwkJCVwKKwlhbGNncgljMyx6ZXJvCisKKyNkZWZpbmUgc3FyX2FkZF9jMihhaSxhaixjMSxjMixjMykJXAorCWxnCSVyNyxhaSo4KCVyMyk7CQlcCisJbWxnCSVyNixhaio4KCVyMyk7CQlcCisJYWxncgljMSwlcjc7CQkJXAorCWFsY2dyCWMyLCVyNjsJCQlcCisJYWxjZ3IJYzMsemVybzsJCVwKKwlhbGdyCWMxLCVyNzsJCQlcCisJYWxjZ3IJYzIsJXI2OwkJCVwKKwlhbGNncgljMyx6ZXJvCisKKy8vIHZvaWQgYm5fc3FyX2NvbWJhOChCTl9VTE9ORyAqcjIsQk5fVUxPTkcgKnIzKTsKKy5nbG9ibAlibl9zcXJfY29tYmE4CisudHlwZQlibl9zcXJfY29tYmE4LEBmdW5jdGlvbgorLmFsaWduCTQKK2JuX3Nxcl9jb21iYTg6CisJc3RtZwklcjYsJXI4LDQ4KCVyMTUpCisKKwlsZ2hpCWMxLDAKKwlsZ2hpCWMyLDAKKwlsZ2hpCWMzLDAKKwlsZ2hpCXplcm8sMAorCisJc3FyX2FkZF9jKDAsYzEsYzIsYzMpOworCXN0ZwljMSwwKjgoJXIyKQorCWxnaGkJYzEsMAorCisJc3FyX2FkZF9jMigxLDAsYzIsYzMsYzEpOworCXN0ZwljMiwxKjgoJXIyKQorCWxnaGkJYzIsMAorCisJc3FyX2FkZF9jKDEsYzMsYzEsYzIpOworCXNxcl9hZGRfYzIoMiwwLGMzLGMxLGMyKTsKKwlzdGcJYzMsMio4KCVyMikKKwlsZ2hpCWMzLDAKKworCXNxcl9hZGRfYzIoMywwLGMxLGMyLGMzKTsKKwlzcXJfYWRkX2MyKDIsMSxjMSxjMixjMyk7CisJc3RnCWMxLDMqOCglcjIpCisJbGdoaQljMSwwCisKKwlzcXJfYWRkX2MoMixjMixjMyxjMSk7CisJc3FyX2FkZF9jMigzLDEsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoNCwwLGMyLGMzLGMxKTsKKwlzdGcJYzIsNCo4KCVyMikKKwlsZ2hpCWMyLDAKKworCXNxcl9hZGRfYzIoNSwwLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKDQsMSxjMyxjMSxjMik7CisJc3FyX2FkZF9jMigzLDIsYzMsYzEsYzIpOworCXN0ZwljMyw1KjgoJXIyKQorCWxnaGkJYzMsMAorCisJc3FyX2FkZF9jKDMsYzEsYzIsYzMpOworCXNxcl9hZGRfYzIoNCwyLGMxLGMyLGMzKTsKKwlzcXJfYWRkX2MyKDUsMSxjMSxjMixjMyk7CisJc3FyX2FkZF9jMig2LDAsYzEsYzIsYzMpOworCXN0ZwljMSw2KjgoJXIyKQorCWxnaGkJYzEsMAorCisJc3FyX2FkZF9jMig3LDAsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoNiwxLGMyLGMzLGMxKTsKKwlzcXJfYWRkX2MyKDUsMixjMixjMyxjMSk7CisJc3FyX2FkZF9jMig0LDMsYzIsYzMsYzEpOworCXN0ZwljMiw3KjgoJXIyKQorCWxnaGkJYzIsMAorCisJc3FyX2FkZF9jKDQsYzMsYzEsYzIpOworCXNxcl9hZGRfYzIoNSwzLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKDYsMixjMyxjMSxjMik7CisJc3FyX2FkZF9jMig3LDEsYzMsYzEsYzIpOworCXN0ZwljMyw4KjgoJXIyKQorCWxnaGkJYzMsMAorCisJc3FyX2FkZF9jMig3LDIsYzEsYzIsYzMpOworCXNxcl9hZGRfYzIoNiwzLGMxLGMyLGMzKTsKKwlzcXJfYWRkX2MyKDUsNCxjMSxjMixjMyk7CisJc3RnCWMxLDkqOCglcjIpCisJbGdoaQljMSwwCisKKwlzcXJfYWRkX2MoNSxjMixjMyxjMSk7CisJc3FyX2FkZF9jMig2LDQsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoNywzLGMyLGMzLGMxKTsKKwlzdGcJYzIsMTAqOCglcjIpCisJbGdoaQljMiwwCisKKwlzcXJfYWRkX2MyKDcsNCxjMyxjMSxjMik7CisJc3FyX2FkZF9jMig2LDUsYzMsYzEsYzIpOworCXN0ZwljMywxMSo4KCVyMikKKwlsZ2hpCWMzLDAKKworCXNxcl9hZGRfYyg2LGMxLGMyLGMzKTsKKwlzcXJfYWRkX2MyKDcsNSxjMSxjMixjMyk7CisJc3RnCWMxLDEyKjgoJXIyKQorCWxnaGkJYzEsMAorCisJc3FyX2FkZF9jMig3LDYsYzIsYzMsYzEpOworCXN0ZwljMiwxMyo4KCVyMikKKwlsZ2hpCWMyLDAKKworCXNxcl9hZGRfYyg3LGMzLGMxLGMyKTsKKwlzdGcJYzMsMTQqOCglcjIpCisJc3RnCWMxLDE1KjgoJXIyKQorCisJbG1nCSVyNiwlcjgsNDgoJXIxNSkKKwlicgklcjE0Cisuc2l6ZQlibl9zcXJfY29tYmE4LC4tYm5fc3FyX2NvbWJhOAorCisvLyB2b2lkIGJuX3Nxcl9jb21iYTQoQk5fVUxPTkcgKnIyLEJOX1VMT05HICpyMyk7CisuZ2xvYmwgYm5fc3FyX2NvbWJhNAorLnR5cGUJYm5fc3FyX2NvbWJhNCxAZnVuY3Rpb24KKy5hbGlnbgk0Citibl9zcXJfY29tYmE0OgorCXN0bWcJJXI2LCVyOCw0OCglcjE1KQorCisJbGdoaQljMSwwCisJbGdoaQljMiwwCisJbGdoaQljMywwCisJbGdoaQl6ZXJvLDAKKworCXNxcl9hZGRfYygwLGMxLGMyLGMzKTsKKwlzdGcJYzEsMCo4KCVyMikKKwlsZ2hpCWMxLDAKKworCXNxcl9hZGRfYzIoMSwwLGMyLGMzLGMxKTsKKwlzdGcJYzIsMSo4KCVyMikKKwlsZ2hpCWMyLDAKKworCXNxcl9hZGRfYygxLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKDIsMCxjMyxjMSxjMik7CisJc3RnCWMzLDIqOCglcjIpCisJbGdoaQljMywwCisKKwlzcXJfYWRkX2MyKDMsMCxjMSxjMixjMyk7CisJc3FyX2FkZF9jMigyLDEsYzEsYzIsYzMpOworCXN0ZwljMSwzKjgoJXIyKQorCWxnaGkJYzEsMAorCisJc3FyX2FkZF9jKDIsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoMywxLGMyLGMzLGMxKTsKKwlzdGcJYzIsNCo4KCVyMikKKwlsZ2hpCWMyLDAKKworCXNxcl9hZGRfYzIoMywyLGMzLGMxLGMyKTsKKwlzdGcJYzMsNSo4KCVyMikKKwlsZ2hpCWMzLDAKKworCXNxcl9hZGRfYygzLGMxLGMyLGMzKTsKKwlzdGcJYzEsNio4KCVyMikKKwlzdGcJYzIsNyo4KCVyMikKKworCWxtZwklcjYsJXI4LDQ4KCVyMTUpCisJYnIJJXIxNAorLnNpemUJYm5fc3FyX2NvbWJhNCwuLWJuX3Nxcl9jb21iYTQKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vc3BhcmN2OC5TIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9zcGFyY3Y4LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjNWRjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vc3BhcmN2OC5TCkBAIC0wLDAgKzEsMTQ1OCBAQAorLmlkZW50CSJzcGFyY3Y4LnMsIFZlcnNpb24gMS40IgorLmlkZW50CSJTUEFSQyB2OCBJU0EgYXJ0d29yayBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4iCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICoKKyAqIFJpZ2h0cyBmb3IgcmVkaXN0cmlidXRpb24gYW5kIHVzYWdlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZQorICogZ3JhbnRlZCBhY2NvcmRpbmcgdG8gdGhlIE9wZW5TU0wgbGljZW5zZS4gV2FycmFudHkgb2YgYW55IGtpbmQgaXMKKyAqIGRpc2NsYWltZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBUaGlzIGlzIG15IG1vZGVzdCBjb250cmlidXRvbiB0byBPcGVuU1NMIHByb2plY3QgKHNlZQorICogaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaXQpIGFuZCBpcworICogYSBkcm9wLWluIFN1cGVyU1BBUkMgSVNBIHJlcGxhY2VtZW50IGZvciBjcnlwdG8vYm4vYm5fYXNtLmMKKyAqIG1vZHVsZS4gRm9yIHVwZGF0ZXMgc2VlIGh0dHA6Ly9meS5jaGFsbWVycy5zZS9+YXBwcm8vaHBlLy4KKyAqCisgKiBTZWUgYm5fYXNtLnNwYXJjLnY4cGx1cy5TIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIFJldmlzaW9uIGhpc3RvcnkuCisgKgorICogMS4xCS0gbmV3IGxvb3AgdW5yb2xsaW5nIG1vZGVsKCopOworICogMS4yCS0gbWFkZSBnYXMgZnJpZW5kbHk7CisgKiAxLjMJLSBmaXhlZCBwcm9ibGVtIHdpdGggL3Vzci9jY3MvbGliL2NwcDsKKyAqIDEuNAktIHNvbWUgcmV0dW5lczsKKyAqCisgKiAoKikJc2VlIGJuX2FzbS5zcGFyYy52OHBsdXMuUyBmb3IgZGV0YWlscworICovCisKKy5zZWN0aW9uCSIudGV4dCIsI2FsbG9jLCNleGVjaW5zdHIKKy5maWxlCQkiYm5fYXNtLnNwYXJjLnY4LlMiCisKKy5hbGlnbgkzMgorCisuZ2xvYmFsIGJuX211bF9hZGRfd29yZHMKKy8qCisgKiBCTl9VTE9ORyBibl9tdWxfYWRkX3dvcmRzKHJwLGFwLG51bSx3KQorICogQk5fVUxPTkcgKnJwLCphcDsKKyAqIGludCBudW07CisgKiBCTl9VTE9ORyB3OworICovCitibl9tdWxfYWRkX3dvcmRzOgorCWNtcAklbzIsMAorCWJnLGEJLkxfYm5fbXVsX2FkZF93b3Jkc19wcm9jZWVkCisJbGQJWyVvMV0sJWcyCisJcmV0bAorCWNscgklbzAKKworLkxfYm5fbXVsX2FkZF93b3Jkc19wcm9jZWVkOgorCWFuZGNjCSVvMiwtNCwlZzAKKwliegkuTF9ibl9tdWxfYWRkX3dvcmRzX3RhaWwKKwljbHIJJW81CisKKy5MX2JuX211bF9hZGRfd29yZHNfbG9vcDoKKwlsZAlbJW8wXSwlbzQKKwlsZAlbJW8xKzRdLCVnMworCXVtdWwJJW8zLCVnMiwlZzIKKwlyZAkleSwlZzEKKwlhZGRjYwklbzQsJW81LCVvNAorCWFkZHgJJWcxLDAsJWcxCisJYWRkY2MJJW80LCVnMiwlbzQKKwlzdAklbzQsWyVvMF0KKwlhZGR4CSVnMSwwLCVvNQorCisJbGQJWyVvMCs0XSwlbzQKKwlsZAlbJW8xKzhdLCVnMgorCXVtdWwJJW8zLCVnMywlZzMKKwlkZWMJNCwlbzIKKwlyZAkleSwlZzEKKwlhZGRjYwklbzQsJW81LCVvNAorCWFkZHgJJWcxLDAsJWcxCisJYWRkY2MJJW80LCVnMywlbzQKKwlzdAklbzQsWyVvMCs0XQorCWFkZHgJJWcxLDAsJW81CisKKwlsZAlbJW8wKzhdLCVvNAorCWxkCVslbzErMTJdLCVnMworCXVtdWwJJW8zLCVnMiwlZzIKKwlpbmMJMTYsJW8xCisJcmQJJXksJWcxCisJYWRkY2MJJW80LCVvNSwlbzQKKwlhZGR4CSVnMSwwLCVnMQorCWFkZGNjCSVvNCwlZzIsJW80CisJc3QJJW80LFslbzArOF0KKwlhZGR4CSVnMSwwLCVvNQorCisJbGQJWyVvMCsxMl0sJW80CisJdW11bAklbzMsJWczLCVnMworCWluYwkxNiwlbzAKKwlyZAkleSwlZzEKKwlhZGRjYwklbzQsJW81LCVvNAorCWFkZHgJJWcxLDAsJWcxCisJYWRkY2MJJW80LCVnMywlbzQKKwlzdAklbzQsWyVvMC00XQorCWFkZHgJJWcxLDAsJW81CisJYW5kY2MJJW8yLC00LCVnMAorCWJueixhCS5MX2JuX211bF9hZGRfd29yZHNfbG9vcAorCWxkCVslbzFdLCVnMgorCisJdHN0CSVvMgorCWJueixhCS5MX2JuX211bF9hZGRfd29yZHNfdGFpbAorCWxkCVslbzFdLCVnMgorLkxfYm5fbXVsX2FkZF93b3Jkc19yZXR1cm46CisJcmV0bAorCW1vdgklbzUsJW8wCisJbm9wCisKKy5MX2JuX211bF9hZGRfd29yZHNfdGFpbDoKKwlsZAlbJW8wXSwlbzQKKwl1bXVsCSVvMywlZzIsJWcyCisJYWRkY2MJJW80LCVvNSwlbzQKKwlyZAkleSwlZzEKKwlhZGR4CSVnMSwwLCVnMQorCWFkZGNjCSVvNCwlZzIsJW80CisJYWRkeAklZzEsMCwlbzUKKwlkZWNjYwklbzIKKwliegkuTF9ibl9tdWxfYWRkX3dvcmRzX3JldHVybgorCXN0CSVvNCxbJW8wXQorCisJbGQJWyVvMSs0XSwlZzIKKwlsZAlbJW8wKzRdLCVvNAorCXVtdWwJJW8zLCVnMiwlZzIKKwlyZAkleSwlZzEKKwlhZGRjYwklbzQsJW81LCVvNAorCWFkZHgJJWcxLDAsJWcxCisJYWRkY2MJJW80LCVnMiwlbzQKKwlhZGR4CSVnMSwwLCVvNQorCWRlY2NjCSVvMgorCWJ6CS5MX2JuX211bF9hZGRfd29yZHNfcmV0dXJuCisJc3QJJW80LFslbzArNF0KKworCWxkCVslbzErOF0sJWcyCisJbGQJWyVvMCs4XSwlbzQKKwl1bXVsCSVvMywlZzIsJWcyCisJcmQJJXksJWcxCisJYWRkY2MJJW80LCVvNSwlbzQKKwlhZGR4CSVnMSwwLCVnMQorCWFkZGNjCSVvNCwlZzIsJW80CisJc3QJJW80LFslbzArOF0KKwlyZXRsCisJYWRkeAklZzEsMCwlbzAKKworLnR5cGUJYm5fbXVsX2FkZF93b3JkcywjZnVuY3Rpb24KKy5zaXplCWJuX211bF9hZGRfd29yZHMsKC4tYm5fbXVsX2FkZF93b3JkcykKKworLmFsaWduCTMyCisKKy5nbG9iYWwgYm5fbXVsX3dvcmRzCisvKgorICogQk5fVUxPTkcgYm5fbXVsX3dvcmRzKHJwLGFwLG51bSx3KQorICogQk5fVUxPTkcgKnJwLCphcDsKKyAqIGludCBudW07CisgKiBCTl9VTE9ORyB3OworICovCitibl9tdWxfd29yZHM6CisJY21wCSVvMiwwCisJYmcsYQkuTF9ibl9tdWxfd29yZHNfcHJvY2VlZWQKKwlsZAlbJW8xXSwlZzIKKwlyZXRsCisJY2xyCSVvMAorCisuTF9ibl9tdWxfd29yZHNfcHJvY2VlZWQ6CisJYW5kY2MJJW8yLC00LCVnMAorCWJ6CS5MX2JuX211bF93b3Jkc190YWlsCisJY2xyCSVvNQorCisuTF9ibl9tdWxfd29yZHNfbG9vcDoKKwlsZAlbJW8xKzRdLCVnMworCXVtdWwJJW8zLCVnMiwlZzIKKwlhZGRjYwklZzIsJW81LCVnMgorCXJkCSV5LCVnMQorCWFkZHgJJWcxLDAsJW81CisJc3QJJWcyLFslbzBdCisKKwlsZAlbJW8xKzhdLCVnMgorCXVtdWwJJW8zLCVnMywlZzMKKwlhZGRjYwklZzMsJW81LCVnMworCXJkCSV5LCVnMQorCWRlYwk0LCVvMgorCWFkZHgJJWcxLDAsJW81CisJc3QJJWczLFslbzArNF0KKworCWxkCVslbzErMTJdLCVnMworCXVtdWwJJW8zLCVnMiwlZzIKKwlhZGRjYwklZzIsJW81LCVnMgorCXJkCSV5LCVnMQorCWluYwkxNiwlbzEKKwlzdAklZzIsWyVvMCs4XQorCWFkZHgJJWcxLDAsJW81CisKKwl1bXVsCSVvMywlZzMsJWczCisJYWRkY2MJJWczLCVvNSwlZzMKKwlyZAkleSwlZzEKKwlpbmMJMTYsJW8wCisJYWRkeAklZzEsMCwlbzUKKwlzdAklZzMsWyVvMC00XQorCWFuZGNjCSVvMiwtNCwlZzAKKwlub3AKKwlibnosYQkuTF9ibl9tdWxfd29yZHNfbG9vcAorCWxkCVslbzFdLCVnMgorCisJdHN0CSVvMgorCWJueixhCS5MX2JuX211bF93b3Jkc190YWlsCisJbGQJWyVvMV0sJWcyCisuTF9ibl9tdWxfd29yZHNfcmV0dXJuOgorCXJldGwKKwltb3YJJW81LCVvMAorCW5vcAorCisuTF9ibl9tdWxfd29yZHNfdGFpbDoKKwl1bXVsCSVvMywlZzIsJWcyCisJYWRkY2MJJWcyLCVvNSwlZzIKKwlyZAkleSwlZzEKKwlhZGR4CSVnMSwwLCVvNQorCWRlY2NjCSVvMgorCWJ6CS5MX2JuX211bF93b3Jkc19yZXR1cm4KKwlzdAklZzIsWyVvMF0KKwlub3AKKworCWxkCVslbzErNF0sJWcyCisJdW11bAklbzMsJWcyLCVnMgorCWFkZGNjCSVnMiwlbzUsJWcyCisJcmQJJXksJWcxCisJYWRkeAklZzEsMCwlbzUKKwlkZWNjYwklbzIKKwliegkuTF9ibl9tdWxfd29yZHNfcmV0dXJuCisJc3QJJWcyLFslbzArNF0KKworCWxkCVslbzErOF0sJWcyCisJdW11bAklbzMsJWcyLCVnMgorCWFkZGNjCSVnMiwlbzUsJWcyCisJcmQJJXksJWcxCisJc3QJJWcyLFslbzArOF0KKwlyZXRsCisJYWRkeAklZzEsMCwlbzAKKworLnR5cGUJYm5fbXVsX3dvcmRzLCNmdW5jdGlvbgorLnNpemUJYm5fbXVsX3dvcmRzLCguLWJuX211bF93b3JkcykKKworLmFsaWduICAzMgorLmdsb2JhbAlibl9zcXJfd29yZHMKKy8qCisgKiB2b2lkIGJuX3Nxcl93b3JkcyhyLGEsbikKKyAqIEJOX1VMT05HICpyLCphOworICogaW50IG47CisgKi8KK2JuX3Nxcl93b3JkczoKKwljbXAJJW8yLDAKKwliZyxhCS5MX2JuX3Nxcl93b3Jkc19wcm9jZWVlZAorCWxkCVslbzFdLCVnMgorCXJldGwKKwljbHIJJW8wCisKKy5MX2JuX3Nxcl93b3Jkc19wcm9jZWVlZDoKKwlhbmRjYwklbzIsLTQsJWcwCisJYnoJLkxfYm5fc3FyX3dvcmRzX3RhaWwKKwljbHIJJW81CisKKy5MX2JuX3Nxcl93b3Jkc19sb29wOgorCWxkCVslbzErNF0sJWczCisJdW11bAklZzIsJWcyLCVvNAorCXN0CSVvNCxbJW8wXQorCXJkCSV5LCVvNQorCXN0CSVvNSxbJW8wKzRdCisKKwlsZAlbJW8xKzhdLCVnMgorCXVtdWwJJWczLCVnMywlbzQKKwlkZWMJNCwlbzIKKwlzdAklbzQsWyVvMCs4XQorCXJkCSV5LCVvNQorCXN0CSVvNSxbJW8wKzEyXQorCW5vcAorCisJbGQJWyVvMSsxMl0sJWczCisJdW11bAklZzIsJWcyLCVvNAorCXN0CSVvNCxbJW8wKzE2XQorCXJkCSV5LCVvNQorCWluYwkxNiwlbzEKKwlzdAklbzUsWyVvMCsyMF0KKworCXVtdWwJJWczLCVnMywlbzQKKwlpbmMJMzIsJW8wCisJc3QJJW80LFslbzAtOF0KKwlyZAkleSwlbzUKKwlzdAklbzUsWyVvMC00XQorCWFuZGNjCSVvMiwtNCwlZzIKKwlibnosYQkuTF9ibl9zcXJfd29yZHNfbG9vcAorCWxkCVslbzFdLCVnMgorCisJdHN0CSVvMgorCW5vcAorCWJueixhCS5MX2JuX3Nxcl93b3Jkc190YWlsCisJbGQJWyVvMV0sJWcyCisuTF9ibl9zcXJfd29yZHNfcmV0dXJuOgorCXJldGwKKwljbHIJJW8wCisKKy5MX2JuX3Nxcl93b3Jkc190YWlsOgorCXVtdWwJJWcyLCVnMiwlbzQKKwlzdAklbzQsWyVvMF0KKwlkZWNjYwklbzIKKwlyZAkleSwlbzUKKwliegkuTF9ibl9zcXJfd29yZHNfcmV0dXJuCisJc3QJJW81LFslbzArNF0KKworCWxkCVslbzErNF0sJWcyCisJdW11bAklZzIsJWcyLCVvNAorCXN0CSVvNCxbJW8wKzhdCisJZGVjY2MJJW8yCisJcmQJJXksJW81CisJbm9wCisJYnoJLkxfYm5fc3FyX3dvcmRzX3JldHVybgorCXN0CSVvNSxbJW8wKzEyXQorCisJbGQJWyVvMSs4XSwlZzIKKwl1bXVsCSVnMiwlZzIsJW80CisJc3QJJW80LFslbzArMTZdCisJcmQJJXksJW81CisJc3QJJW81LFslbzArMjBdCisJcmV0bAorCWNscgklbzAKKworLnR5cGUJYm5fc3FyX3dvcmRzLCNmdW5jdGlvbgorLnNpemUJYm5fc3FyX3dvcmRzLCguLWJuX3Nxcl93b3JkcykKKworLmFsaWduCTMyCisKKy5nbG9iYWwgYm5fZGl2X3dvcmRzCisvKgorICogQk5fVUxPTkcgYm5fZGl2X3dvcmRzKGgsbCxkKQorICogQk5fVUxPTkcgaCxsLGQ7CisgKi8KK2JuX2Rpdl93b3JkczoKKwl3cgklbzAsJXkKKwl1ZGl2CSVvMSwlbzIsJW8wCisJcmV0bAorCW5vcAorCisudHlwZQlibl9kaXZfd29yZHMsI2Z1bmN0aW9uCisuc2l6ZQlibl9kaXZfd29yZHMsKC4tYm5fZGl2X3dvcmRzKQorCisuYWxpZ24JMzIKKworLmdsb2JhbCBibl9hZGRfd29yZHMKKy8qCisgKiBCTl9VTE9ORyBibl9hZGRfd29yZHMocnAsYXAsYnAsbikKKyAqIEJOX1VMT05HICpycCwqYXAsKmJwOworICogaW50IG47CisgKi8KK2JuX2FkZF93b3JkczoKKwljbXAJJW8zLDAKKwliZyxhCS5MX2JuX2FkZF93b3Jkc19wcm9jZWVkCisJbGQJWyVvMV0sJW80CisJcmV0bAorCWNscgklbzAKKworLkxfYm5fYWRkX3dvcmRzX3Byb2NlZWQ6CisJYW5kY2MJJW8zLC00LCVnMAorCWJ6CS5MX2JuX2FkZF93b3Jkc190YWlsCisJY2xyCSVnMQorCWJhCS5MX2JuX2FkZF93b3Jkc193YXJuX2xvb3AKKwlhZGRjYwklZzAsMCwlZzAJISBjbGVhciBjYXJyeSBmbGFnCisKKy5MX2JuX2FkZF93b3Jkc19sb29wOgorCWxkCVslbzFdLCVvNAorLkxfYm5fYWRkX3dvcmRzX3dhcm5fbG9vcDoKKwlsZAlbJW8yXSwlbzUKKwlsZAlbJW8xKzRdLCVnMworCWxkCVslbzIrNF0sJWc0CisJZGVjCTQsJW8zCisJYWRkeGNjCSVvNSwlbzQsJW81CisJc3QJJW81LFslbzBdCisKKwlsZAlbJW8xKzhdLCVvNAorCWxkCVslbzIrOF0sJW81CisJaW5jCTE2LCVvMQorCWFkZHhjYwklZzMsJWc0LCVnMworCXN0CSVnMyxbJW8wKzRdCisJCisJbGQJWyVvMS00XSwlZzMKKwlsZAlbJW8yKzEyXSwlZzQKKwlpbmMJMTYsJW8yCisJYWRkeGNjCSVvNSwlbzQsJW81CisJc3QJJW81LFslbzArOF0KKworCWluYwkxNiwlbzAKKwlhZGR4Y2MJJWczLCVnNCwlZzMKKwlzdAklZzMsWyVvMC00XQorCWFkZHgJJWcwLDAsJWcxCisJYW5kY2MJJW8zLC00LCVnMAorCWJueixhCS5MX2JuX2FkZF93b3Jkc19sb29wCisJYWRkY2MJJWcxLC0xLCVnMAorCisJdHN0CSVvMworCWJueixhCS5MX2JuX2FkZF93b3Jkc190YWlsCisJbGQJWyVvMV0sJW80CisuTF9ibl9hZGRfd29yZHNfcmV0dXJuOgorCXJldGwKKwltb3YJJWcxLCVvMAorCisuTF9ibl9hZGRfd29yZHNfdGFpbDoKKwlhZGRjYwklZzEsLTEsJWcwCisJbGQJWyVvMl0sJW81CisJYWRkeGNjCSVvNSwlbzQsJW81CisJYWRkeAklZzAsMCwlZzEKKwlkZWNjYwklbzMKKwliegkuTF9ibl9hZGRfd29yZHNfcmV0dXJuCisJc3QJJW81LFslbzBdCisKKwlsZAlbJW8xKzRdLCVvNAorCWFkZGNjCSVnMSwtMSwlZzAKKwlsZAlbJW8yKzRdLCVvNQorCWFkZHhjYwklbzUsJW80LCVvNQorCWFkZHgJJWcwLDAsJWcxCisJZGVjY2MJJW8zCisJYnoJLkxfYm5fYWRkX3dvcmRzX3JldHVybgorCXN0CSVvNSxbJW8wKzRdCisKKwlsZAlbJW8xKzhdLCVvNAorCWFkZGNjCSVnMSwtMSwlZzAKKwlsZAlbJW8yKzhdLCVvNQorCWFkZHhjYwklbzUsJW80LCVvNQorCXN0CSVvNSxbJW8wKzhdCisJcmV0bAorCWFkZHgJJWcwLDAsJW8wCisKKy50eXBlCWJuX2FkZF93b3JkcywjZnVuY3Rpb24KKy5zaXplCWJuX2FkZF93b3JkcywoLi1ibl9hZGRfd29yZHMpCisKKy5hbGlnbgkzMgorCisuZ2xvYmFsIGJuX3N1Yl93b3JkcworLyoKKyAqIEJOX1VMT05HIGJuX3N1Yl93b3JkcyhycCxhcCxicCxuKQorICogQk5fVUxPTkcgKnJwLCphcCwqYnA7CisgKiBpbnQgbjsKKyAqLworYm5fc3ViX3dvcmRzOgorCWNtcAklbzMsMAorCWJnLGEJLkxfYm5fc3ViX3dvcmRzX3Byb2NlZWQKKwlsZAlbJW8xXSwlbzQKKwlyZXRsCisJY2xyCSVvMAorCisuTF9ibl9zdWJfd29yZHNfcHJvY2VlZDoKKwlhbmRjYwklbzMsLTQsJWcwCisJYnoJLkxfYm5fc3ViX3dvcmRzX3RhaWwKKwljbHIJJWcxCisJYmEJLkxfYm5fc3ViX3dvcmRzX3dhcm1fbG9vcAorCWFkZGNjCSVnMCwwLCVnMAkhIGNsZWFyIGNhcnJ5IGZsYWcKKworLkxfYm5fc3ViX3dvcmRzX2xvb3A6CisJbGQJWyVvMV0sJW80CisuTF9ibl9zdWJfd29yZHNfd2FybV9sb29wOgorCWxkCVslbzJdLCVvNQorCWxkCVslbzErNF0sJWczCisJbGQJWyVvMis0XSwlZzQKKwlkZWMJNCwlbzMKKwlzdWJ4Y2MJJW80LCVvNSwlbzUKKwlzdAklbzUsWyVvMF0KKworCWxkCVslbzErOF0sJW80CisJbGQJWyVvMis4XSwlbzUKKwlpbmMJMTYsJW8xCisJc3VieGNjCSVnMywlZzQsJWc0CisJc3QJJWc0LFslbzArNF0KKwkKKwlsZAlbJW8xLTRdLCVnMworCWxkCVslbzIrMTJdLCVnNAorCWluYwkxNiwlbzIKKwlzdWJ4Y2MJJW80LCVvNSwlbzUKKwlzdAklbzUsWyVvMCs4XQorCisJaW5jCTE2LCVvMAorCXN1YnhjYwklZzMsJWc0LCVnNAorCXN0CSVnNCxbJW8wLTRdCisJYWRkeAklZzAsMCwlZzEKKwlhbmRjYwklbzMsLTQsJWcwCisJYm56LGEJLkxfYm5fc3ViX3dvcmRzX2xvb3AKKwlhZGRjYwklZzEsLTEsJWcwCisKKwl0c3QJJW8zCisJbm9wCisJYm56LGEJLkxfYm5fc3ViX3dvcmRzX3RhaWwKKwlsZAlbJW8xXSwlbzQKKy5MX2JuX3N1Yl93b3Jkc19yZXR1cm46CisJcmV0bAorCW1vdgklZzEsJW8wCisKKy5MX2JuX3N1Yl93b3Jkc190YWlsOgorCWFkZGNjCSVnMSwtMSwlZzAKKwlsZAlbJW8yXSwlbzUKKwlzdWJ4Y2MJJW80LCVvNSwlbzUKKwlhZGR4CSVnMCwwLCVnMQorCWRlY2NjCSVvMworCWJ6CS5MX2JuX3N1Yl93b3Jkc19yZXR1cm4KKwlzdAklbzUsWyVvMF0KKwlub3AKKworCWxkCVslbzErNF0sJW80CisJYWRkY2MJJWcxLC0xLCVnMAorCWxkCVslbzIrNF0sJW81CisJc3VieGNjCSVvNCwlbzUsJW81CisJYWRkeAklZzAsMCwlZzEKKwlkZWNjYwklbzMKKwliegkuTF9ibl9zdWJfd29yZHNfcmV0dXJuCisJc3QJJW81LFslbzArNF0KKworCWxkCVslbzErOF0sJW80CisJYWRkY2MJJWcxLC0xLCVnMAorCWxkCVslbzIrOF0sJW81CisJc3VieGNjCSVvNCwlbzUsJW81CisJc3QJJW81LFslbzArOF0KKwlyZXRsCisJYWRkeAklZzAsMCwlbzAKKworLnR5cGUJYm5fc3ViX3dvcmRzLCNmdW5jdGlvbgorLnNpemUJYm5fc3ViX3dvcmRzLCguLWJuX3N1Yl93b3JkcykKKworI2RlZmluZSBGUkFNRV9TSVpFCS05NgorCisvKgorICogSGVyZSBpcyByZWdpc3RlciB1c2FnZSBtYXAgZm9yICphbGwqIHJvdXRpbmVzIGJlbG93LgorICovCisjZGVmaW5lIHRfMQklbzAKKyNkZWZpbmUJdF8yCSVvMQorI2RlZmluZSBjXzEJJW8yCisjZGVmaW5lIGNfMgklbzMKKyNkZWZpbmUgY18zCSVvNAorCisjZGVmaW5lIGFwKEkpCVslaTErNCpJXQorI2RlZmluZSBicChJKQlbJWkyKzQqSV0KKyNkZWZpbmUgcnAoSSkJWyVpMCs0KkldCisKKyNkZWZpbmUJYV8wCSVsMAorI2RlZmluZQlhXzEJJWwxCisjZGVmaW5lCWFfMgklbDIKKyNkZWZpbmUJYV8zCSVsMworI2RlZmluZQlhXzQJJWw0CisjZGVmaW5lCWFfNQklbDUKKyNkZWZpbmUJYV82CSVsNgorI2RlZmluZQlhXzcJJWw3CisKKyNkZWZpbmUJYl8wCSVpMworI2RlZmluZQliXzEJJWk0CisjZGVmaW5lCWJfMgklaTUKKyNkZWZpbmUJYl8zCSVvNQorI2RlZmluZQliXzQJJWcxCisjZGVmaW5lCWJfNQklZzIKKyNkZWZpbmUJYl82CSVnMworI2RlZmluZQliXzcJJWc0CisKKy5hbGlnbgkzMgorLmdsb2JhbCBibl9tdWxfY29tYmE4CisvKgorICogdm9pZCBibl9tdWxfY29tYmE4KHIsYSxiKQorICogQk5fVUxPTkcgKnIsKmEsKmI7CisgKi8KK2JuX211bF9jb21iYTg6CisJc2F2ZQklc3AsRlJBTUVfU0laRSwlc3AKKwlsZAlhcCgwKSxhXzAKKwlsZAlicCgwKSxiXzAKKwl1bXVsCWFfMCxiXzAsY18xCSE9IW11bF9hZGRfYyhhWzBdLGJbMF0sYzEsYzIsYzMpOworCWxkCWJwKDEpLGJfMQorCXJkCSV5LGNfMgorCXN0CWNfMSxycCgwKQkhclswXT1jMTsKKworCXVtdWwJYV8wLGJfMSx0XzEJIT0hbXVsX2FkZF9jKGFbMF0sYlsxXSxjMixjMyxjMSk7CisJbGQJYXAoMSksYV8xCisJYWRkY2MJY18yLHRfMSxjXzIKKwlyZAkleSx0XzIKKwlhZGR4Y2MJJWcwLHRfMixjXzMJIT0KKwlhZGR4CSVnMCwlZzAsY18xCisJbGQJYXAoMiksYV8yCisJdW11bAlhXzEsYl8wLHRfMQkhbXVsX2FkZF9jKGFbMV0sYlswXSxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlzdAljXzIscnAoMSkJIXJbMV09YzI7CisJYWRkeAljXzEsJWcwLGNfMQkhPQorCisJdW11bAlhXzIsYl8wLHRfMQkhbXVsX2FkZF9jKGFbMl0sYlswXSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEJIT0KKwlhZGR4CSVnMCwlZzAsY18yCisJbGQJYnAoMiksYl8yCisJdW11bAlhXzEsYl8xLHRfMQkhbXVsX2FkZF9jKGFbMV0sYlsxXSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlsZAlicCgzKSxiXzMKKwlhZGR4CWNfMiwlZzAsY18yCSE9CisJdW11bAlhXzAsYl8yLHRfMQkhbXVsX2FkZF9jKGFbMF0sYlsyXSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEJIT0KKwlhZGR4CWNfMiwlZzAsY18yCisJc3QJY18zLHJwKDIpCSFyWzJdPWMzOworCisJdW11bAlhXzAsYl8zLHRfMQkhbXVsX2FkZF9jKGFbMF0sYlszXSxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CSVnMCwlZzAsY18zCisJdW11bAlhXzEsYl8yLHRfMQkhPSFtdWxfYWRkX2MoYVsxXSxiWzJdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwlsZAlhcCgzKSxhXzMKKwl1bXVsCWFfMixiXzEsdF8xCSFtdWxfYWRkX2MoYVsyXSxiWzFdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CWNfMywlZzAsY18zCisJbGQJYXAoNCksYV80CisJdW11bAlhXzMsYl8wLHRfMQkhbXVsX2FkZF9jKGFbM10sYlswXSxjMSxjMixjMyk7IT0KKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwlzdAljXzEscnAoMykJIXJbM109YzE7CisKKwl1bXVsCWFfNCxiXzAsdF8xCSFtdWxfYWRkX2MoYVs0XSxiWzBdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CSVnMCwlZzAsY18xCisJdW11bAlhXzMsYl8xLHRfMQkhbXVsX2FkZF9jKGFbM10sYlsxXSxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJdW11bAlhXzIsYl8yLHRfMQkhPSFtdWxfYWRkX2MoYVsyXSxiWzJdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEJIT0KKwlsZAlicCg0KSxiXzQKKwl1bXVsCWFfMSxiXzMsdF8xCSFtdWxfYWRkX2MoYVsxXSxiWzNdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJbGQJYnAoNSksYl81CisJdW11bAlhXzAsYl80LHRfMQkhPSFtdWxfYWRkX2MoYVswXSxiWzRdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEJIT0KKwlzdAljXzIscnAoNCkJIXJbNF09YzI7CisKKwl1bXVsCWFfMCxiXzUsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzVdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlhZGR4CSVnMCwlZzAsY18yCisJdW11bAlhXzEsYl80LHRfMQkhbXVsX2FkZF9jKGFbMV0sYls0XSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlhZGR4CWNfMiwlZzAsY18yCisJdW11bAlhXzIsYl8zLHRfMQkhPSFtdWxfYWRkX2MoYVsyXSxiWzNdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIJIT0KKwl1bXVsCWFfMyxiXzIsdF8xCSFtdWxfYWRkX2MoYVszXSxiWzJdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQkhPQorCWFkZHgJY18yLCVnMCxjXzIKKwlsZAlhcCg1KSxhXzUKKwl1bXVsCWFfNCxiXzEsdF8xCSFtdWxfYWRkX2MoYVs0XSxiWzFdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCWxkCWFwKDYpLGFfNgorCWFkZHgJY18yLCVnMCxjXzIJIT0KKwl1bXVsCWFfNSxiXzAsdF8xCSFtdWxfYWRkX2MoYVs1XSxiWzBdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQkhPQorCWFkZHgJY18yLCVnMCxjXzIKKwlzdAljXzMscnAoNSkJIXJbNV09YzM7CisKKwl1bXVsCWFfNixiXzAsdF8xCSFtdWxfYWRkX2MoYVs2XSxiWzBdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJJWcwLCVnMCxjXzMKKwl1bXVsCWFfNSxiXzEsdF8xCSE9IW11bF9hZGRfYyhhWzVdLGJbMV0sYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMix0XzIsY18yCisJYWRkeAljXzMsJWcwLGNfMwkhPQorCXVtdWwJYV80LGJfMix0XzEJIW11bF9hZGRfYyhhWzRdLGJbMl0sYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMix0XzIsY18yCSE9CisJYWRkeAljXzMsJWcwLGNfMworCXVtdWwJYV8zLGJfMyx0XzEJIW11bF9hZGRfYyhhWzNdLGJbM10sYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMKKwl1bXVsCWFfMixiXzQsdF8xCSFtdWxfYWRkX2MoYVsyXSxiWzRdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWxkCWJwKDYpLGJfNgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwl1bXVsCWFfMSxiXzUsdF8xCSFtdWxfYWRkX2MoYVsxXSxiWzVdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgkhPQorCWFkZHgJY18zLCVnMCxjXzMKKwlsZAlicCg3KSxiXzcKKwl1bXVsCWFfMCxiXzYsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzZdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCXN0CWNfMSxycCg2KQkhcls2XT1jMTsKKwlhZGR4CWNfMywlZzAsY18zCSE9CisKKwl1bXVsCWFfMCxiXzcsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzddLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMwkhPQorCWFkZHgJJWcwLCVnMCxjXzEKKwl1bXVsCWFfMSxiXzYsdF8xCSFtdWxfYWRkX2MoYVsxXSxiWzZdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJdW11bAlhXzIsYl81LHRfMQkhbXVsX2FkZF9jKGFbMl0sYls1XSxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJdW11bAlhXzMsYl80LHRfMQkhPSFtdWxfYWRkX2MoYVszXSxiWzRdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEJIT0KKwl1bXVsCWFfNCxiXzMsdF8xCSFtdWxfYWRkX2MoYVs0XSxiWzNdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMwkhPQorCWFkZHgJY18xLCVnMCxjXzEKKwl1bXVsCWFfNSxiXzIsdF8xCSFtdWxfYWRkX2MoYVs1XSxiWzJdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJbGQJYXAoNyksYV83CisJdW11bAlhXzYsYl8xLHRfMQkhPSFtdWxfYWRkX2MoYVs2XSxiWzFdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEJIT0KKwl1bXVsCWFfNyxiXzAsdF8xCSFtdWxfYWRkX2MoYVs3XSxiWzBdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMwkhPQorCWFkZHgJY18xLCVnMCxjXzEKKwlzdAljXzIscnAoNykJIXJbN109YzI7CisKKwl1bXVsCWFfNyxiXzEsdF8xCSFtdWxfYWRkX2MoYVs3XSxiWzFdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJJWcwLCVnMCxjXzIKKwl1bXVsCWFfNixiXzIsdF8xCSE9IW11bF9hZGRfYyhhWzZdLGJbMl0sYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCisJYWRkeAljXzIsJWcwLGNfMgkhPQorCXVtdWwJYV81LGJfMyx0XzEJIW11bF9hZGRfYyhhWzVdLGJbM10sYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCSE9CisJYWRkeAljXzIsJWcwLGNfMgorCXVtdWwJYV80LGJfNCx0XzEJIW11bF9hZGRfYyhhWzRdLGJbNF0sYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwl1bXVsCWFfMyxiXzUsdF8xCSFtdWxfYWRkX2MoYVszXSxiWzVdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwl1bXVsCWFfMixiXzYsdF8xCSE9IW11bF9hZGRfYyhhWzJdLGJbNl0sYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCisJYWRkeAljXzIsJWcwLGNfMgkhPQorCXVtdWwJYV8xLGJfNyx0XzEJIW11bF9hZGRfYyhhWzFdLGJbN10sYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCSEKKwlhZGR4CWNfMiwlZzAsY18yCisJc3QJY18zLHJwKDgpCSFyWzhdPWMzOworCisJdW11bAlhXzIsYl83LHRfMQkhbXVsX2FkZF9jKGFbMl0sYls3XSxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CSVnMCwlZzAsY18zCisJdW11bAlhXzMsYl82LHRfMQkhPSFtdWxfYWRkX2MoYVszXSxiWzZdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwl1bXVsCWFfNCxiXzUsdF8xCSFtdWxfYWRkX2MoYVs0XSxiWzVdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgkhPQorCWFkZHgJY18zLCVnMCxjXzMKKwl1bXVsCWFfNSxiXzQsdF8xCSFtdWxfYWRkX2MoYVs1XSxiWzRdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CWNfMywlZzAsY18zCisJdW11bAlhXzYsYl8zLHRfMQkhbXVsX2FkZF9jKGFbNl0sYlszXSxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CWNfMywlZzAsY18zCisJdW11bAlhXzcsYl8yLHRfMQkhPSFtdWxfYWRkX2MoYVs3XSxiWzJdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwlzdAljXzEscnAoOSkJIXJbOV09YzE7CisKKwl1bXVsCWFfNyxiXzMsdF8xCSFtdWxfYWRkX2MoYVs3XSxiWzNdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CSVnMCwlZzAsY18xCisJdW11bAlhXzYsYl80LHRfMQkhbXVsX2FkZF9jKGFbNl0sYls0XSxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJdW11bAlhXzUsYl81LHRfMQkhPSFtdWxfYWRkX2MoYVs1XSxiWzVdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEJIT0KKwl1bXVsCWFfNCxiXzYsdF8xCSFtdWxfYWRkX2MoYVs0XSxiWzZdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMwkhPQorCWFkZHgJY18xLCVnMCxjXzEKKwl1bXVsCWFfMyxiXzcsdF8xCSFtdWxfYWRkX2MoYVszXSxiWzddLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJc3QJY18yLHJwKDEwKQkhclsxMF09YzI7CisKKwl1bXVsCWFfNCxiXzcsdF8xCSE9IW11bF9hZGRfYyhhWzRdLGJbN10sYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCisJYWRkeAklZzAsJWcwLGNfMgkhPQorCXVtdWwJYV81LGJfNix0XzEJIW11bF9hZGRfYyhhWzVdLGJbNl0sYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCSE9CisJYWRkeAljXzIsJWcwLGNfMgorCXVtdWwJYV82LGJfNSx0XzEJIW11bF9hZGRfYyhhWzZdLGJbNV0sYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwl1bXVsCWFfNyxiXzQsdF8xCSFtdWxfYWRkX2MoYVs3XSxiWzRdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCXN0CWNfMyxycCgxMSkJIXJbMTFdPWMzOworCWFkZHgJY18yLCVnMCxjXzIJIT0KKworCXVtdWwJYV83LGJfNSx0XzEJIW11bF9hZGRfYyhhWzddLGJbNV0sYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMix0XzIsY18yCSE9CisJYWRkeAklZzAsJWcwLGNfMworCXVtdWwJYV82LGJfNix0XzEJIW11bF9hZGRfYyhhWzZdLGJbNl0sYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMKKwl1bXVsCWFfNSxiXzcsdF8xCSFtdWxfYWRkX2MoYVs1XSxiWzddLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCXN0CWNfMSxycCgxMikJIXJbMTJdPWMxOworCWFkZHgJY18zLCVnMCxjXzMJIT0KKworCXVtdWwJYV82LGJfNyx0XzEJIW11bF9hZGRfYyhhWzZdLGJbN10sYzIsYzMsYzEpOworCWFkZGNjCWNfMix0XzEsY18yCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMyx0XzIsY18zCSE9CisJYWRkeAklZzAsJWcwLGNfMQorCXVtdWwJYV83LGJfNix0XzEJIW11bF9hZGRfYyhhWzddLGJbNl0sYzIsYzMsYzEpOworCWFkZGNjCWNfMix0XzEsY18yCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEKKwlzdAljXzIscnAoMTMpCSFyWzEzXT1jMjsKKworCXVtdWwJYV83LGJfNyx0XzEJIT0hbXVsX2FkZF9jKGFbN10sYls3XSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlub3AJCQkhPQorCXN0CWNfMyxycCgxNCkJIXJbMTRdPWMzOworCXN0CWNfMSxycCgxNSkJIXJbMTVdPWMxOworCisJcmV0CisJcmVzdG9yZQklZzAsJWcwLCVvMAorCisudHlwZQlibl9tdWxfY29tYmE4LCNmdW5jdGlvbgorLnNpemUJYm5fbXVsX2NvbWJhOCwoLi1ibl9tdWxfY29tYmE4KQorCisuYWxpZ24JMzIKKworLmdsb2JhbCBibl9tdWxfY29tYmE0CisvKgorICogdm9pZCBibl9tdWxfY29tYmE0KHIsYSxiKQorICogQk5fVUxPTkcgKnIsKmEsKmI7CisgKi8KK2JuX211bF9jb21iYTQ6CisJc2F2ZQklc3AsRlJBTUVfU0laRSwlc3AKKwlsZAlhcCgwKSxhXzAKKwlsZAlicCgwKSxiXzAKKwl1bXVsCWFfMCxiXzAsY18xCSE9IW11bF9hZGRfYyhhWzBdLGJbMF0sYzEsYzIsYzMpOworCWxkCWJwKDEpLGJfMQorCXJkCSV5LGNfMgorCXN0CWNfMSxycCgwKQkhclswXT1jMTsKKworCXVtdWwJYV8wLGJfMSx0XzEJIT0hbXVsX2FkZF9jKGFbMF0sYlsxXSxjMixjMyxjMSk7CisJbGQJYXAoMSksYV8xCisJYWRkY2MJY18yLHRfMSxjXzIKKwlyZAkleSx0XzIJCSE9CisJYWRkeGNjCSVnMCx0XzIsY18zCisJYWRkeAklZzAsJWcwLGNfMQorCWxkCWFwKDIpLGFfMgorCXVtdWwJYV8xLGJfMCx0XzEJIT0hbXVsX2FkZF9jKGFbMV0sYlswXSxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCSE9CisJc3QJY18yLHJwKDEpCSFyWzFdPWMyOworCisJdW11bAlhXzIsYl8wLHRfMQkhbXVsX2FkZF9jKGFbMl0sYlswXSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMKKwlyZAkleSx0XzIJCSE9CisJYWRkeGNjCWNfMSx0XzIsY18xCisJYWRkeAklZzAsJWcwLGNfMgorCWxkCWJwKDIpLGJfMgorCXVtdWwJYV8xLGJfMSx0XzEJIT0hbXVsX2FkZF9jKGFbMV0sYlsxXSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlhZGR4CWNfMiwlZzAsY18yCSE9CisJbGQJYnAoMyksYl8zCisJdW11bAlhXzAsYl8yLHRfMQkhbXVsX2FkZF9jKGFbMF0sYlsyXSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMKKwlyZAkleSx0XzIJCSE9CisJYWRkeGNjCWNfMSx0XzIsY18xCisJYWRkeAljXzIsJWcwLGNfMgorCXN0CWNfMyxycCgyKQkhclsyXT1jMzsKKworCXVtdWwJYV8wLGJfMyx0XzEJIT0hbXVsX2FkZF9jKGFbMF0sYlszXSxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CSVnMCwlZzAsY18zCSE9CisJdW11bAlhXzEsYl8yLHRfMQkhbXVsX2FkZF9jKGFbMV0sYlsyXSxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIJIT0KKwlhZGR4CWNfMywlZzAsY18zCisJbGQJYXAoMyksYV8zCisJdW11bAlhXzIsYl8xLHRfMQkhbXVsX2FkZF9jKGFbMl0sYlsxXSxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CWNfMywlZzAsY18zCisJdW11bAlhXzMsYl8wLHRfMQkhPSFtdWxfYWRkX2MoYVszXSxiWzBdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwlzdAljXzEscnAoMykJIXJbM109YzE7CisKKwl1bXVsCWFfMyxiXzEsdF8xCSFtdWxfYWRkX2MoYVszXSxiWzFdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CSVnMCwlZzAsY18xCisJdW11bAlhXzIsYl8yLHRfMQkhbXVsX2FkZF9jKGFbMl0sYlsyXSxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJdW11bAlhXzEsYl8zLHRfMQkhPSFtdWxfYWRkX2MoYVsxXSxiWzNdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEJIT0KKwlzdAljXzIscnAoNCkJIXJbNF09YzI7CisKKwl1bXVsCWFfMixiXzMsdF8xCSFtdWxfYWRkX2MoYVsyXSxiWzNdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlhZGR4CSVnMCwlZzAsY18yCisJdW11bAlhXzMsYl8yLHRfMQkhbXVsX2FkZF9jKGFbM10sYlsyXSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlzdAljXzMscnAoNSkJIXJbNV09YzM7CisJYWRkeAljXzIsJWcwLGNfMgkhPQorCisJdW11bAlhXzMsYl8zLHRfMQkhbXVsX2FkZF9jKGFbM10sYlszXSxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIJIT0KKwlzdAljXzEscnAoNikJIXJbNl09YzE7CisJc3QJY18yLHJwKDcpCSFyWzddPWMyOworCQorCXJldAorCXJlc3RvcmUJJWcwLCVnMCwlbzAKKworLnR5cGUJYm5fbXVsX2NvbWJhNCwjZnVuY3Rpb24KKy5zaXplCWJuX211bF9jb21iYTQsKC4tYm5fbXVsX2NvbWJhNCkKKworLmFsaWduCTMyCisKKy5nbG9iYWwgYm5fc3FyX2NvbWJhOAorYm5fc3FyX2NvbWJhODoKKwlzYXZlCSVzcCxGUkFNRV9TSVpFLCVzcAorCWxkCWFwKDApLGFfMAorCWxkCWFwKDEpLGFfMQorCXVtdWwJYV8wLGFfMCxjXzEJIT0hc3FyX2FkZF9jKGEsMCxjMSxjMixjMyk7CisJcmQJJXksY18yCisJc3QJY18xLHJwKDApCSFyWzBdPWMxOworCisJbGQJYXAoMiksYV8yCisJdW11bAlhXzAsYV8xLHRfMQkhPSFzcXJfYWRkX2MyKGEsMSwwLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwklZzAsdF8yLGNfMworCWFkZHgJJWcwLCVnMCxjXzEJIT0KKwlhZGRjYwljXzIsdF8xLGNfMgorCWFkZHhjYwljXzMsdF8yLGNfMworCXN0CWNfMixycCgxKQkhclsxXT1jMjsKKwlhZGR4CWNfMSwlZzAsY18xCSE9CisKKwl1bXVsCWFfMixhXzAsdF8xCSFzcXJfYWRkX2MyKGEsMiwwLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQkhPQorCWFkZHgJJWcwLCVnMCxjXzIKKwlhZGRjYwljXzMsdF8xLGNfMworCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIJIT0KKwlsZAlhcCgzKSxhXzMKKwl1bXVsCWFfMSxhXzEsdF8xCSFzcXJfYWRkX2MoYSwxLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlhZGR4CWNfMiwlZzAsY18yCisJc3QJY18zLHJwKDIpCSFyWzJdPWMzOworCisJdW11bAlhXzAsYV8zLHRfMQkhPSFzcXJfYWRkX2MyKGEsMywwLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJJWcwLCVnMCxjXzMJIT0KKwlhZGRjYwljXzEsdF8xLGNfMQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWxkCWFwKDQpLGFfNAorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwl1bXVsCWFfMSxhXzIsdF8xCSFzcXJfYWRkX2MyKGEsMiwxLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgkhPQorCWFkZHgJY18zLCVnMCxjXzMKKwlhZGRjYwljXzEsdF8xLGNfMQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwlzdAljXzEscnAoMykJIXJbM109YzE7CisKKwl1bXVsCWFfNCxhXzAsdF8xCSFzcXJfYWRkX2MyKGEsNCwwLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CSVnMCwlZzAsY18xCisJYWRkY2MJY18yLHRfMSxjXzIKKwlhZGR4Y2MJY18zLHRfMixjXzMJIT0KKwlhZGR4CWNfMSwlZzAsY18xCisJdW11bAlhXzMsYV8xLHRfMQkhc3FyX2FkZF9jMihhLDMsMSxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIKKwlyZAkleSx0XzIJCSE9CisJYWRkeGNjCWNfMyx0XzIsY18zCisJYWRkeAljXzEsJWcwLGNfMQorCWFkZGNjCWNfMix0XzEsY18yCisJYWRkeGNjCWNfMyx0XzIsY18zCSE9CisJYWRkeAljXzEsJWcwLGNfMQorCWxkCWFwKDUpLGFfNQorCXVtdWwJYV8yLGFfMix0XzEJIXNxcl9hZGRfYyhhLDIsYzIsYzMsYzEpOworCWFkZGNjCWNfMix0XzEsY18yCSE9CisJcmQJJXksdF8yCisJYWRkeGNjCWNfMyx0XzIsY18zCisJc3QJY18yLHJwKDQpCSFyWzRdPWMyOworCWFkZHgJY18xLCVnMCxjXzEJIT0KKworCXVtdWwJYV8wLGFfNSx0XzEJIXNxcl9hZGRfYzIoYSw1LDAsYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCSE9CisJYWRkeAklZzAsJWcwLGNfMgorCWFkZGNjCWNfMyx0XzEsY18zCisJYWRkeGNjCWNfMSx0XzIsY18xCisJYWRkeAljXzIsJWcwLGNfMgkhPQorCXVtdWwJYV8xLGFfNCx0XzEJIXNxcl9hZGRfYzIoYSw0LDEsYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCSE9CisJYWRkeAljXzIsJWcwLGNfMgorCWFkZGNjCWNfMyx0XzEsY18zCisJYWRkeGNjCWNfMSx0XzIsY18xCisJYWRkeAljXzIsJWcwLGNfMgkhPQorCWxkCWFwKDYpLGFfNgorCXVtdWwJYV8yLGFfMyx0XzEJIXNxcl9hZGRfYzIoYSwzLDIsYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwlhZGRjYwljXzMsdF8xLGNfMworCWFkZHhjYwljXzEsdF8yLGNfMQkhPQorCWFkZHgJY18yLCVnMCxjXzIKKwlzdAljXzMscnAoNSkJIXJbNV09YzM7CisKKwl1bXVsCWFfNixhXzAsdF8xCSFzcXJfYWRkX2MyKGEsNiwwLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJJWcwLCVnMCxjXzMKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMKKwl1bXVsCWFfNSxhXzEsdF8xCSFzcXJfYWRkX2MyKGEsNSwxLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMKKwl1bXVsCWFfNCxhXzIsdF8xCSFzcXJfYWRkX2MyKGEsNCwyLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMKKwlhZGRjYwljXzEsdF8xLGNfMQkhPQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMKKwlsZAlhcCg3KSxhXzcKKwl1bXVsCWFfMyxhXzMsdF8xCSE9IXNxcl9hZGRfYyhhLDMsYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMix0XzIsY18yCisJYWRkeAljXzMsJWcwLGNfMwkhPQorCXN0CWNfMSxycCg2KQkhcls2XT1jMTsKKworCXVtdWwJYV8wLGFfNyx0XzEJIXNxcl9hZGRfYzIoYSw3LDAsYzIsYzMsYzEpOworCWFkZGNjCWNfMix0XzEsY18yCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJJWcwLCVnMCxjXzEKKwlhZGRjYwljXzIsdF8xLGNfMgorCWFkZHhjYwljXzMsdF8yLGNfMwkhPQorCWFkZHgJY18xLCVnMCxjXzEKKwl1bXVsCWFfMSxhXzYsdF8xCSFzcXJfYWRkX2MyKGEsNiwxLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CWNfMSwlZzAsY18xCisJYWRkY2MJY18yLHRfMSxjXzIKKwlhZGR4Y2MJY18zLHRfMixjXzMJIT0KKwlhZGR4CWNfMSwlZzAsY18xCisJdW11bAlhXzIsYV81LHRfMQkhc3FyX2FkZF9jMihhLDUsMixjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIKKwlyZAkleSx0XzIJCSE9CisJYWRkeGNjCWNfMyx0XzIsY18zCisJYWRkeAljXzEsJWcwLGNfMQorCWFkZGNjCWNfMix0XzEsY18yCisJYWRkeGNjCWNfMyx0XzIsY18zCSE9CisJYWRkeAljXzEsJWcwLGNfMQorCXVtdWwJYV8zLGFfNCx0XzEJIXNxcl9hZGRfYzIoYSw0LDMsYzIsYzMsYzEpOworCWFkZGNjCWNfMix0XzEsY18yCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEKKwlhZGRjYwljXzIsdF8xLGNfMgorCWFkZHhjYwljXzMsdF8yLGNfMwkhPQorCWFkZHgJY18xLCVnMCxjXzEKKwlzdAljXzIscnAoNykJIXJbN109YzI7CisKKwl1bXVsCWFfNyxhXzEsdF8xCSFzcXJfYWRkX2MyKGEsNywxLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJJWcwLCVnMCxjXzIKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwl1bXVsCWFfNixhXzIsdF8xCSFzcXJfYWRkX2MyKGEsNiwyLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwl1bXVsCWFfNSxhXzMsdF8xCSFzcXJfYWRkX2MyKGEsNSwzLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIKKwl1bXVsCWFfNCxhXzQsdF8xCSFzcXJfYWRkX2MoYSw0LGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMwkhPQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCXN0CWNfMyxycCg4KQkhcls4XT1jMzsKKwlhZGR4CWNfMiwlZzAsY18yCSE9CisKKwl1bXVsCWFfMixhXzcsdF8xCSFzcXJfYWRkX2MyKGEsNywyLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgkhPQorCWFkZHgJJWcwLCVnMCxjXzMKKwlhZGRjYwljXzEsdF8xLGNfMQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwl1bXVsCWFfMyxhXzYsdF8xCSFzcXJfYWRkX2MyKGEsNiwzLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgkhPQorCWFkZHgJY18zLCVnMCxjXzMKKwlhZGRjYwljXzEsdF8xLGNfMQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwl1bXVsCWFfNCxhXzUsdF8xCSFzcXJfYWRkX2MyKGEsNSw0LGMxLGMyLGMzKTsKKwlhZGRjYwljXzEsdF8xLGNfMQorCXJkCSV5LHRfMgorCWFkZHhjYwljXzIsdF8yLGNfMgkhPQorCWFkZHgJY18zLCVnMCxjXzMKKwlhZGRjYwljXzEsdF8xLGNfMQorCWFkZHhjYwljXzIsdF8yLGNfMgorCWFkZHgJY18zLCVnMCxjXzMJIT0KKwlzdAljXzEscnAoOSkJIXJbOV09YzE7CisKKwl1bXVsCWFfNyxhXzMsdF8xCSFzcXJfYWRkX2MyKGEsNywzLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CSVnMCwlZzAsY18xCisJYWRkY2MJY18yLHRfMSxjXzIKKwlhZGR4Y2MJY18zLHRfMixjXzMJIT0KKwlhZGR4CWNfMSwlZzAsY18xCisJdW11bAlhXzYsYV80LHRfMQkhc3FyX2FkZF9jMihhLDYsNCxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIKKwlyZAkleSx0XzIJCSE9CisJYWRkeGNjCWNfMyx0XzIsY18zCisJYWRkeAljXzEsJWcwLGNfMQorCWFkZGNjCWNfMix0XzEsY18yCisJYWRkeGNjCWNfMyx0XzIsY18zCSE9CisJYWRkeAljXzEsJWcwLGNfMQorCXVtdWwJYV81LGFfNSx0XzEJIXNxcl9hZGRfYyhhLDUsYzIsYzMsYzEpOworCWFkZGNjCWNfMix0XzEsY18yCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEKKwlzdAljXzIscnAoMTApCSFyWzEwXT1jMjsKKworCXVtdWwJYV80LGFfNyx0XzEJIT0hc3FyX2FkZF9jMihhLDcsNCxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlhZGR4CSVnMCwlZzAsY18yCSE9CisJYWRkY2MJY18zLHRfMSxjXzMKKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlhZGR4CWNfMiwlZzAsY18yCisJdW11bAlhXzUsYV82LHRfMQkhPSFzcXJfYWRkX2MyKGEsNiw1LGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQorCWFkZHgJY18yLCVnMCxjXzIJIT0KKwlhZGRjYwljXzMsdF8xLGNfMworCWFkZHhjYwljXzEsdF8yLGNfMQorCXN0CWNfMyxycCgxMSkJIXJbMTFdPWMzOworCWFkZHgJY18yLCVnMCxjXzIJIT0KKworCXVtdWwJYV83LGFfNSx0XzEJIXNxcl9hZGRfYzIoYSw3LDUsYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMix0XzIsY18yCSE9CisJYWRkeAklZzAsJWcwLGNfMworCWFkZGNjCWNfMSx0XzEsY18xCisJYWRkeGNjCWNfMix0XzIsY18yCisJYWRkeAljXzMsJWcwLGNfMwkhPQorCXVtdWwJYV82LGFfNix0XzEJIXNxcl9hZGRfYyhhLDYsYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMix0XzIsY18yCSE9CisJYWRkeAljXzMsJWcwLGNfMworCXN0CWNfMSxycCgxMikJIXJbMTJdPWMxOworCisJdW11bAlhXzYsYV83LHRfMQkhc3FyX2FkZF9jMihhLDcsNixjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlhZGR4CSVnMCwlZzAsY18xCisJYWRkY2MJY18yLHRfMSxjXzIJIT0KKwlhZGR4Y2MJY18zLHRfMixjXzMKKwlzdAljXzIscnAoMTMpCSFyWzEzXT1jMjsKKwlhZGR4CWNfMSwlZzAsY18xCSE9CisKKwl1bXVsCWFfNyxhXzcsdF8xCSFzcXJfYWRkX2MoYSw3LGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgorCWFkZHhjYwljXzEsdF8yLGNfMQkhPQorCXN0CWNfMyxycCgxNCkJIXJbMTRdPWMzOworCXN0CWNfMSxycCgxNSkJIXJbMTVdPWMxOworCisJcmV0CisJcmVzdG9yZQklZzAsJWcwLCVvMAorCisudHlwZQlibl9zcXJfY29tYmE4LCNmdW5jdGlvbgorLnNpemUJYm5fc3FyX2NvbWJhOCwoLi1ibl9zcXJfY29tYmE4KQorCisuYWxpZ24JMzIKKworLmdsb2JhbCBibl9zcXJfY29tYmE0CisvKgorICogdm9pZCBibl9zcXJfY29tYmE0KHIsYSkKKyAqIEJOX1VMT05HICpyLCphOworICovCitibl9zcXJfY29tYmE0OgorCXNhdmUJJXNwLEZSQU1FX1NJWkUsJXNwCisJbGQJYXAoMCksYV8wCisJdW11bAlhXzAsYV8wLGNfMQkhc3FyX2FkZF9jKGEsMCxjMSxjMixjMyk7CisJbGQJYXAoMSksYV8xCSE9CisJcmQJJXksY18yCisJc3QJY18xLHJwKDApCSFyWzBdPWMxOworCisJbGQJYXAoMiksYV8yCisJdW11bAlhXzAsYV8xLHRfMQkhPSFzcXJfYWRkX2MyKGEsMSwwLGMyLGMzLGMxKTsKKwlhZGRjYwljXzIsdF8xLGNfMgorCXJkCSV5LHRfMgorCWFkZHhjYwklZzAsdF8yLGNfMworCWFkZHgJJWcwLCVnMCxjXzEJIT0KKwlhZGRjYwljXzIsdF8xLGNfMgorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEJIT0KKwlzdAljXzIscnAoMSkJIXJbMV09YzI7CisKKwl1bXVsCWFfMixhXzAsdF8xCSFzcXJfYWRkX2MyKGEsMiwwLGMzLGMxLGMyKTsKKwlhZGRjYwljXzMsdF8xLGNfMworCXJkCSV5LHRfMgkJIT0KKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlhZGR4CSVnMCwlZzAsY18yCisJYWRkY2MJY18zLHRfMSxjXzMKKwlhZGR4Y2MJY18xLHRfMixjXzEJIT0KKwlhZGR4CWNfMiwlZzAsY18yCisJbGQJYXAoMyksYV8zCisJdW11bAlhXzEsYV8xLHRfMQkhc3FyX2FkZF9jKGEsMSxjMyxjMSxjMik7CisJYWRkY2MJY18zLHRfMSxjXzMJIT0KKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18xLHRfMixjXzEKKwlzdAljXzMscnAoMikJIXJbMl09YzM7CisJYWRkeAljXzIsJWcwLGNfMgkhPQorCisJdW11bAlhXzAsYV8zLHRfMQkhc3FyX2FkZF9jMihhLDMsMCxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIJIT0KKwlhZGR4CSVnMCwlZzAsY18zCisJYWRkY2MJY18xLHRfMSxjXzEKKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CWNfMywlZzAsY18zCSE9CisJdW11bAlhXzEsYV8yLHRfMQkhc3FyX2FkZF9jMihhLDIsMSxjMSxjMixjMyk7CisJYWRkY2MJY18xLHRfMSxjXzEKKwlyZAkleSx0XzIKKwlhZGR4Y2MJY18yLHRfMixjXzIJIT0KKwlhZGR4CWNfMywlZzAsY18zCisJYWRkY2MJY18xLHRfMSxjXzEKKwlhZGR4Y2MJY18yLHRfMixjXzIKKwlhZGR4CWNfMywlZzAsY18zCSE9CisJc3QJY18xLHJwKDMpCSFyWzNdPWMxOworCisJdW11bAlhXzMsYV8xLHRfMQkhc3FyX2FkZF9jMihhLDMsMSxjMixjMyxjMSk7CisJYWRkY2MJY18yLHRfMSxjXzIKKwlyZAkleSx0XzIJCSE9CisJYWRkeGNjCWNfMyx0XzIsY18zCisJYWRkeAklZzAsJWcwLGNfMQorCWFkZGNjCWNfMix0XzEsY18yCisJYWRkeGNjCWNfMyx0XzIsY18zCSE9CisJYWRkeAljXzEsJWcwLGNfMQorCXVtdWwJYV8yLGFfMix0XzEJIXNxcl9hZGRfYyhhLDIsYzIsYzMsYzEpOworCWFkZGNjCWNfMix0XzEsY18yCisJcmQJJXksdF8yCQkhPQorCWFkZHhjYwljXzMsdF8yLGNfMworCWFkZHgJY18xLCVnMCxjXzEKKwlzdAljXzIscnAoNCkJIXJbNF09YzI7CisKKwl1bXVsCWFfMixhXzMsdF8xCSE9IXNxcl9hZGRfYzIoYSwzLDIsYzMsYzEsYzIpOworCWFkZGNjCWNfMyx0XzEsY18zCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMSx0XzIsY18xCisJYWRkeAklZzAsJWcwLGNfMgkhPQorCWFkZGNjCWNfMyx0XzEsY18zCisJYWRkeGNjCWNfMSx0XzIsY18xCisJc3QJY18zLHJwKDUpCSFyWzVdPWMzOworCWFkZHgJY18yLCVnMCxjXzIJIT0KKworCXVtdWwJYV8zLGFfMyx0XzEJIXNxcl9hZGRfYyhhLDMsYzEsYzIsYzMpOworCWFkZGNjCWNfMSx0XzEsY18xCisJcmQJJXksdF8yCisJYWRkeGNjCWNfMix0XzIsY18yCSE9CisJc3QJY18xLHJwKDYpCSFyWzZdPWMxOworCXN0CWNfMixycCg3KQkhcls3XT1jMjsKKwkKKwlyZXQKKwlyZXN0b3JlCSVnMCwlZzAsJW8wCisKKy50eXBlCWJuX3Nxcl9jb21iYTQsI2Z1bmN0aW9uCisuc2l6ZQlibl9zcXJfY29tYmE0LCguLWJuX3Nxcl9jb21iYTQpCisKKy5hbGlnbgkzMgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9zcGFyY3Y4cGx1cy5TIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9zcGFyY3Y4cGx1cy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGUxODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3NwYXJjdjhwbHVzLlMKQEAgLTAsMCArMSwxNTU4IEBACisuaWRlbnQJInNwYXJjdjhwbHVzLnMsIFZlcnNpb24gMS40IgorLmlkZW50CSJTUEFSQyB2OSBJU0EgYXJ0d29yayBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4iCisKKy8qCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICoKKyAqIFJpZ2h0cyBmb3IgcmVkaXN0cmlidXRpb24gYW5kIHVzYWdlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZQorICogZ3JhbnRlZCBhY2NvcmRpbmcgdG8gdGhlIE9wZW5TU0wgbGljZW5zZS4gV2FycmFudHkgb2YgYW55IGtpbmQgaXMKKyAqIGRpc2NsYWltZWQuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qCisgKiBUaGlzIGlzIG15IG1vZGVzdCBjb250cmlidXRvbiB0byBPcGVuU1NMIHByb2plY3QgKHNlZQorICogaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaXQpIGFuZCBpcworICogYSBkcm9wLWluIFVsdHJhU1BBUkMgSVNBIHJlcGxhY2VtZW50IGZvciBjcnlwdG8vYm4vYm5fYXNtLmMKKyAqIG1vZHVsZS4gRm9yIHVwZGF0ZXMgc2VlIGh0dHA6Ly9meS5jaGFsbWVycy5zZS9+YXBwcm8vaHBlLy4KKyAqCisgKiBRdWVzdGlvbnMtbi1hbnN3ZXJzLgorICoKKyAqIFEuIEhvdyB0byBjb21waWxlPworICogQS4gV2l0aCBTQzQueC9TQzUueDoKKyAqCisgKgljYyAteGFyY2g9djhwbHVzIC1jIGJuX2FzbS5zcGFyYy52OHBsdXMuUyAtbyBibl9hc20ubworICoKKyAqICAgIGFuZCB3aXRoIGdjYzoKKyAqCisgKglnY2MgLW1jcHU9dWx0cmFzcGFyYyAtYyBibl9hc20uc3BhcmMudjhwbHVzLlMgLW8gYm5fYXNtLm8KKyAqCisgKiAgICBvciBpZiBhYm92ZSBmYWlscyAoaXQgZG9lcyBpZiB5b3UgaGF2ZSBnYXMgaW5zdGFsbGVkKToKKyAqCisgKglnY2MgLUUgYm5fYXNtLnNwYXJjLnY4cGx1cy5TIHwgYXMgLXhhcmNoPXY4cGx1cyAvZGV2L2ZkLzAgLW8gYm5fYXNtLm8KKyAqCisgKiAgICBRdWljay1uLWRpcnR5IHdheSB0byBmdXNlIHRoZSBtb2R1bGUgaW50byB0aGUgbGlicmFyeS4KKyAqICAgIFByb3ZpZGVkIHRoYXQgdGhlIGxpYnJhcnkgaXMgYWxyZWFkeSBjb25maWd1cmVkIGFuZCBidWlsdAorICogICAgKGluIDAuOS4yIGNhc2Ugd2l0aCBuby1hc20gb3B0aW9uKToKKyAqCisgKgkjIGNkIGNyeXB0by9ibgorICoJIyBjcCAvc29tZS9wbGFjZS9ibl9hc20uc3BhcmMudjhwbHVzLlMgLgorICoJIyBjYyAteGFyY2g9djhwbHVzIC1jIGJuX2FzbS5zcGFyYy52OHBsdXMuUyAtbyBibl9hc20ubworICoJIyBtYWtlCisgKgkjIGNkIC4uLy4uCisgKgkjIG1ha2U7IG1ha2UgdGVzdAorICoKKyAqICAgIFF1aWNrLW4tZGlydHkgd2F5IHRvIGdldCByaWQgb2YgaXQ6CisgKgorICoJIyBjZCBjcnlwdG8vYm4KKyAqCSMgdG91Y2ggYm5fYXNtLmMKKyAqCSMgbWFrZQorICoJIyBjZCAuLi8uLgorICoJIyBtYWtlOyBtYWtlIHRlc3QKKyAqCisgKiBRLiBWOHBsdXMgYWNoaXRlY3R1cmU/IFdoYXQga2luZCBvZiBiZWFzdCBpcyB0aGF0PworICogQS4gV2VsbCwgaXQncyByYXRoZXIgYSBwcm9ncmFtbWluZyBtb2RlbCB0aGFuIGFuIGFyY2hpdGVjdHVyZS4uLgorICogICAgSXQncyBhY3R1YWxseSB2OS1jb21wbGlhbnQsIGkuZS4gKmFueSogVWx0cmFTUEFSQywgQ1BVIHVuZGVyCisgKiAgICBzcGVjaWFsIGNvbmRpdGlvbnMsIG5hbWVseSB3aGVuIGtlcm5lbCBkb2Vzbid0IHByZXNlcnZlIHVwcGVyCisgKiAgICAzMiBiaXRzIG9mIG90aGVyd2lzZSA2NC1iaXQgcmVnaXN0ZXJzIGR1cmluZyBhIGNvbnRleHQgc3dpdGNoLgorICoKKyAqIFEuIFdoeSBqdXN0IFVsdHJhU1BBUkM/IFdoYXQgYWJvdXQgU3VwZXJTUEFSQz8KKyAqIEEuIE9yaWdpbmFsIHJlbGVhc2UgZGlkIHRhcmdldCBVbHRyYVNQQVJDIG9ubHkuIE5vdyBTdXBlclNQQVJDCisgKiAgICB2ZXJzaW9uIGlzIHByb3ZpZGVkIGFsb25nLiBCb3RoIHZlcnNpb24gc2hhcmUgYm5fKmNvbWJhWzQ4XQorICogICAgaW1wbGVtZW50YXRpb25zIChzZWUgY29tbWVudCBsYXRlciBpbiBjb2RlIGZvciBleHBsYW5hdGlvbikuCisgKiAgICBCdXQgd2hhdCdzIHNvIHNwZWNpYWwgYWJvdXQgdGhpcyBVbHRyYVNQQVJDIGltcGxlbWVudGF0aW9uPworICogICAgV2h5IGRpZG4ndCBJIGxldCBjb21waWxlciBkbyB0aGUgam9iPyBUcm91YmxlIGlzIHRoYXQgbW9zdCBvZgorICogICAgYXZhaWxhYmxlIGNvbXBpbGVycyAod2VsbCwgU0M1LjAgaXMgdGhlIG9ubHkgZXhjZXB0aW9uKSBkb24ndAorICogICAgYXR0ZW1wdCB0byB0YWtlIGFkdmFudGFnZSBvZiBVbHRyYVNQQVJDJ3MgNjQtYml0bmVzcyB1bmRlcgorICogICAgMzItYml0IGtlcm5lbHMgZXZlbiB0aG91Z2ggaXQncyBwZXJmZWN0bHkgcG9zc2libGUgKHNlZSBuZXh0CisgKiAgICBxdWVzdGlvbikuCisgKgorICogUS4gNjQtYml0IHJlZ2lzdGVycyB1bmRlciAzMi1iaXQga2VybmVscz8gRGlkbid0IHlvdSBqdXN0IHNheSBpdAorICogICAgZG9lc24ndCB3b3JrPworICogQS4gWW91IGNhbid0IGFkcmVzcyAqYWxsKiByZWdpc3RlcnMgYXMgNjQtYml0IHdpZGU6LSggVGhlIGNhdGNoIGlzCisgKiAgICB0aGF0IHlvdSBhY3R1YWxseSBtYXkgcmVseSB1cG9uICVvMC0lbzUgYW5kICVnMS0lZzQgYmVpbmcgZnVsbHkKKyAqICAgIHByZXNlcnZlZCBpZiB5b3UncmUgaW4gYSBsZWFmIGZ1bmN0aW9uLCBpLmUuIHN1Y2ggbmV2ZXIgY2FsbGluZworICogICAgYW55IG90aGVyIGZ1bmN0aW9ucy4gQWxsIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSBhcmUgbGVhZiBhbmQKKyAqICAgIDEwIHJlZ2lzdGVycyBpcyBhIGhhbmRmdWwuIEFuZCBhcyBhIG1hdHRlciBvZiBmYWN0IG5vbmUtImNvbWJhIgorICogICAgcm91dGluZXMgZG9uJ3QgcmVxdWlyZSBldmVuIHRoYXQgbXVjaCBhbmQgSSBjb3VsZCBldmVuIGFmZm9yZCB0bworICogICAgbm90IGFsbG9jYXRlIG93biBzdGFjayBmcmFtZSBmb3IgJ2VtOi0pCisgKgorICogUS4gV2hhdCBhYm91dCA2NC1iaXQga2VybmVscz8KKyAqIEEuIFdoYXQgYWJvdXQgJ2VtPyBKdXN0IGtpZGRpbmc6LSkgUHVyZSA2NC1iaXQgdmVyc2lvbiBpcyBjdXJyZW50bHkKKyAqICAgIHVuZGVyIGV2YWx1YXRpb24gYW5kIGRldmVsb3BtZW50Li4uCisgKgorICogUS4gV2hhdCBhYm91dCBzaGFyZWQgbGlicmFyaWVzPworICogQS4gV2hhdCBhYm91dCAnZW0/IEtpZGRpbmcgYWdhaW46LSkgQ29kZSBkb2VzICpub3QqIGNvbnRhaW4gYW55CisgKiAgICBjb2RlIHBvc2l0aW9uIGRlcGVuZGVuY2llcyBhbmQgaXQncyBzYWZlIHRvIGluY2x1ZGUgaXQgaW50bworICogICAgc2hhcmVkIGxpYnJhcnkgYXMgaXMuCisgKgorICogUS4gSG93IG11Y2ggZmFzdGVyIGRvZXMgaXQgZ28/CisgKiBBLiBEbyB5b3UgaGF2ZSBhIGdvb2QgYmVuY2htYXJrPyBJbiBlaXRoZXIgY2FzZSBiZWxvdyBpcyB3aGF0IEkKKyAqICAgIGV4cGVyaWVuY2Ugd2l0aCBjcnlwdG8vYm4vZXhwc3BlZWQuYyB0ZXN0IHByb2dyYW06CisgKgorICoJdjhwbHVzIG1vZHVsZSBvbiBVMTAvMzAwTUh6IGFnYWluc3QgYm5fYXNtLmMgY29tcGlsZWQgd2l0aDoKKyAqCisgKgljYy01LjAgLXhhcmNoPXY4cGx1cyAteE81IC14ZGVwZW5kCSs3LTEyJQorICoJY2MtNC4yIC14YXJjaD12OHBsdXMgLXhPNSAteGRlcGVuZAkrMjUtMzUlCisgKgllZ2NzLTEuMS4yIC1tY3B1PXVsdHJhc3BhcmMgLU8zCQkrMzUtNDUlCisgKgorICoJdjggbW9kdWxlIG9uIFNTMTAvNjBNSHogYWdhaW5zdCBibl9hc20uYyBjb21waWxlZCB3aXRoOgorICoKKyAqCWNjLTUuMCAteGFyY2g9djggLXhPNSAteGRlcGVuZAkJKzctMTAlCisgKgljYy00LjIgLXhhcmNoPXY4IC14TzUgLXhkZXBlbmQJCSsxMCUKKyAqCWVnY3MtMS4xLjIgLW12OCAtTzMJCQkrMzUtNDUlCisgKgorICogICAgQXMgeW91IGNhbiBzZWUgaXQncyBkYW1uIGhhcmQgdG8gYmVhdCB0aGUgbmV3IFN1biBDIGNvbXBpbGVyCisgKiAgICBhbmQgaXQncyBpbiBmaXJzdCBwbGFjZSBHTlUgQyB1c2VycyB3aG8gd2lsbCBhcHByZWNpYXRlIHRoaXMKKyAqICAgIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbjotKQkKKyAqLworCisvKgorICogUmV2aXNpb24gaGlzdG9yeS4KKyAqCisgKiAxLjAJLSBpbml0aWFsIHJlbGVhc2U7CisgKiAxLjEJLSBuZXcgbG9vcCB1bnJvbGxpbmcgbW9kZWwoKik7CisgKgktIHNvbWUgbW9yZSBmaW5lIHR1bmluZzsKKyAqIDEuMgktIG1hZGUgZ2FzIGZyaWVuZGx5OworICoJLSB1cGRhdGVzIHRvIGRvY3VtZW50YXRpb24gY29uY2VybmluZyB2OTsKKyAqCS0gbmV3IHBlcmZvcm1hbmNlIGNvbXBhcmlzb24gbWF0cml4OworICogMS4zCS0gZml4ZWQgcHJvYmxlbSB3aXRoIC91c3IvY2NzL2xpYi9jcHA7CisgKiAxLjQJLSBuYXRpdmUgVjkgYm5fKl9jb21iYVs0OF0gaW1wbGVtZW50YXRpb24gKDE1JSBtb3JlIGVmZmljaWVudCkKKyAqCSAgcmVzdWx0aW5nIGluIHNsaWdodCBvdmVyYWxsIHBlcmZvcm1hbmNlIGtpY2s7CisgKgktIHNvbWUgcmV0dW5lczsKKyAqCS0gc3VwcG9ydCBmb3IgR05VIGFzIGFkZGVkOworICoKKyAqICgqKQlPcmlnaW5hbGx5IHVucm9sbGVkIGxvb3AgbG9va2VkIGxpa2UgdGhpczoKKyAqCSAgICBmb3IgKDs7KSB7CisgKgkJb3AocCswKTsgaWYgKC0tbj09MCkgYnJlYWs7CisgKgkJb3AocCsxKTsgaWYgKC0tbj09MCkgYnJlYWs7CisgKgkJb3AocCsyKTsgaWYgKC0tbj09MCkgYnJlYWs7CisgKgkJb3AocCszKTsgaWYgKC0tbj09MCkgYnJlYWs7CisgKgkJcCs9NDsKKyAqCSAgICB9CisgKglJIHVucm9sbCBhY2NvcmRpbmcgdG8gZm9sbG93aW5nOgorICoJICAgIHdoaWxlIChuJn4zKSB7CisgKgkJb3AocCswKTsgb3AocCsxKTsgb3AocCsyKTsgb3AocCszKTsKKyAqCQlwKz00OyBuPS00OworICoJICAgIH0KKyAqCSAgICBpZiAobikgeworICoJCW9wKHArMCk7IGlmICgtLW49PTApIHJldHVybjsKKyAqCQlvcChwKzIpOyBpZiAoLS1uPT0wKSByZXR1cm47CisgKgkJb3AocCszKTsgcmV0dXJuOworICoJICAgIH0KKyAqLworCisjaWYgZGVmaW5lZChfX1NVTlBST19DKSAmJiBkZWZpbmVkKF9fc3BhcmN2OSkKKyAgLyogVGhleSd2ZSBzYWlkIC14YXJjaD12OSBhdCBjb21tYW5kIGxpbmUgKi8KKyAgLnJlZ2lzdGVyCSVnMiwjc2NyYXRjaAorICAucmVnaXN0ZXIJJWczLCNzY3JhdGNoCisjIGRlZmluZQlGUkFNRV9TSVpFCS0xOTIKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKKyAgLyogVGhleSd2ZSBzYWlkIC1tNjQgYXQgY29tbWFuZCBsaW5lICovCisgIC5yZWdpc3RlcgklZzIsI3NjcmF0Y2gKKyAgLnJlZ2lzdGVyCSVnMywjc2NyYXRjaAorIyBkZWZpbmUJRlJBTUVfU0laRQktMTkyCisjZWxzZSAKKyMgZGVmaW5lCUZSQU1FX1NJWkUJLTk2CisjZW5kaWYgCisvKgorICogR05VIGFzc2VtYmxlciBjYW4ndCBzdGFuZCBzdHV3Oi0oCisgKi8KKyNkZWZpbmUgc3R1dyBzdAorCisuc2VjdGlvbgkiLnRleHQiLCNhbGxvYywjZXhlY2luc3RyCisuZmlsZQkJImJuX2FzbS5zcGFyYy52OHBsdXMuUyIKKworLmFsaWduCTMyCisKKy5nbG9iYWwgYm5fbXVsX2FkZF93b3JkcworLyoKKyAqIEJOX1VMT05HIGJuX211bF9hZGRfd29yZHMocnAsYXAsbnVtLHcpCisgKiBCTl9VTE9ORyAqcnAsKmFwOworICogaW50IG51bTsKKyAqIEJOX1VMT05HIHc7CisgKi8KK2JuX211bF9hZGRfd29yZHM6CisJc3JhCSVvMiwlZzAsJW8yCSEgc2lnbnggJW8yCisJYnJneixhCSVvMiwuTF9ibl9tdWxfYWRkX3dvcmRzX3Byb2NlZWQKKwlsZHV3CVslbzFdLCVnMgorCXJldGwKKwljbHIJJW8wCisJbm9wCisJbm9wCisJbm9wCisKKy5MX2JuX211bF9hZGRfd29yZHNfcHJvY2VlZDoKKwlzcmwJJW8zLCVnMCwlbzMJISBjbHJ1dwklbzMKKwlhbmRjYwklbzIsLTQsJWcwCisJYnoscG4JJWljYywuTF9ibl9tdWxfYWRkX3dvcmRzX3RhaWwKKwljbHIJJW81CisKKy5MX2JuX211bF9hZGRfd29yZHNfbG9vcDoJISB3b3chIDMyIGFsaWduZWQhCisJbGR1dwlbJW8wXSwlZzEKKwlsZHV3CVslbzErNF0sJWczCisJbXVseAklbzMsJWcyLCVnMgorCWFkZAklZzEsJW81LCVvNAorCW5vcAorCWFkZAklbzQsJWcyLCVvNAorCXN0dXcJJW80LFslbzBdCisJc3JseAklbzQsMzIsJW81CisKKwlsZHV3CVslbzArNF0sJWcxCisJbGR1dwlbJW8xKzhdLCVnMgorCW11bHgJJW8zLCVnMywlZzMKKwlhZGQJJWcxLCVvNSwlbzQKKwlkZWMJNCwlbzIKKwlhZGQJJW80LCVnMywlbzQKKwlzdHV3CSVvNCxbJW8wKzRdCisJc3JseAklbzQsMzIsJW81CisKKwlsZHV3CVslbzArOF0sJWcxCisJbGR1dwlbJW8xKzEyXSwlZzMKKwltdWx4CSVvMywlZzIsJWcyCisJYWRkCSVnMSwlbzUsJW80CisJaW5jCTE2LCVvMQorCWFkZAklbzQsJWcyLCVvNAorCXN0dXcJJW80LFslbzArOF0KKwlzcmx4CSVvNCwzMiwlbzUKKworCWxkdXcJWyVvMCsxMl0sJWcxCisJbXVseAklbzMsJWczLCVnMworCWFkZAklZzEsJW81LCVvNAorCWluYwkxNiwlbzAKKwlhZGQJJW80LCVnMywlbzQKKwlhbmRjYwklbzIsLTQsJWcwCisJc3R1dwklbzQsWyVvMC00XQorCXNybHgJJW80LDMyLCVvNQorCWJueixhLHB0CSVpY2MsLkxfYm5fbXVsX2FkZF93b3Jkc19sb29wCisJbGR1dwlbJW8xXSwlZzIKKworCWJybnosYSxwbgklbzIsLkxfYm5fbXVsX2FkZF93b3Jkc190YWlsCisJbGR1dwlbJW8xXSwlZzIKKy5MX2JuX211bF9hZGRfd29yZHNfcmV0dXJuOgorCXJldGwKKwltb3YJJW81LCVvMAorCisuTF9ibl9tdWxfYWRkX3dvcmRzX3RhaWw6CisJbGR1dwlbJW8wXSwlZzEKKwltdWx4CSVvMywlZzIsJWcyCisJYWRkCSVnMSwlbzUsJW80CisJZGVjCSVvMgorCWFkZAklbzQsJWcyLCVvNAorCXNybHgJJW80LDMyLCVvNQorCWJyeixwdAklbzIsLkxfYm5fbXVsX2FkZF93b3Jkc19yZXR1cm4KKwlzdHV3CSVvNCxbJW8wXQorCisJbGR1dwlbJW8xKzRdLCVnMgorCWxkdXcJWyVvMCs0XSwlZzEKKwltdWx4CSVvMywlZzIsJWcyCisJYWRkCSVnMSwlbzUsJW80CisJZGVjCSVvMgorCWFkZAklbzQsJWcyLCVvNAorCXNybHgJJW80LDMyLCVvNQorCWJyeixwdAklbzIsLkxfYm5fbXVsX2FkZF93b3Jkc19yZXR1cm4KKwlzdHV3CSVvNCxbJW8wKzRdCisKKwlsZHV3CVslbzErOF0sJWcyCisJbGR1dwlbJW8wKzhdLCVnMQorCW11bHgJJW8zLCVnMiwlZzIKKwlhZGQJJWcxLCVvNSwlbzQKKwlhZGQJJW80LCVnMiwlbzQKKwlzdHV3CSVvNCxbJW8wKzhdCisJcmV0bAorCXNybHgJJW80LDMyLCVvMAorCisudHlwZQlibl9tdWxfYWRkX3dvcmRzLCNmdW5jdGlvbgorLnNpemUJYm5fbXVsX2FkZF93b3JkcywoLi1ibl9tdWxfYWRkX3dvcmRzKQorCisuYWxpZ24JMzIKKworLmdsb2JhbCBibl9tdWxfd29yZHMKKy8qCisgKiBCTl9VTE9ORyBibl9tdWxfd29yZHMocnAsYXAsbnVtLHcpCisgKiBCTl9VTE9ORyAqcnAsKmFwOworICogaW50IG51bTsKKyAqIEJOX1VMT05HIHc7CisgKi8KK2JuX211bF93b3JkczoKKwlzcmEJJW8yLCVnMCwlbzIJISBzaWdueCAlbzIKKwlicmd6LGEJJW8yLC5MX2JuX211bF93b3Jkc19wcm9jZWVlZAorCWxkdXcJWyVvMV0sJWcyCisJcmV0bAorCWNscgklbzAKKwlub3AKKwlub3AKKwlub3AKKworLkxfYm5fbXVsX3dvcmRzX3Byb2NlZWVkOgorCXNybAklbzMsJWcwLCVvMwkhIGNscnV3CSVvMworCWFuZGNjCSVvMiwtNCwlZzAKKwlieixwbgklaWNjLC5MX2JuX211bF93b3Jkc190YWlsCisJY2xyCSVvNQorCisuTF9ibl9tdWxfd29yZHNfbG9vcDoJCSEgd293ISAzMiBhbGlnbmVkIQorCWxkdXcJWyVvMSs0XSwlZzMKKwltdWx4CSVvMywlZzIsJWcyCisJYWRkCSVnMiwlbzUsJW80CisJbm9wCisJc3R1dwklbzQsWyVvMF0KKwlzcmx4CSVvNCwzMiwlbzUKKworCWxkdXcJWyVvMSs4XSwlZzIKKwltdWx4CSVvMywlZzMsJWczCisJYWRkCSVnMywlbzUsJW80CisJZGVjCTQsJW8yCisJc3R1dwklbzQsWyVvMCs0XQorCXNybHgJJW80LDMyLCVvNQorCisJbGR1dwlbJW8xKzEyXSwlZzMKKwltdWx4CSVvMywlZzIsJWcyCisJYWRkCSVnMiwlbzUsJW80CisJaW5jCTE2LCVvMQorCXN0dXcJJW80LFslbzArOF0KKwlzcmx4CSVvNCwzMiwlbzUKKworCW11bHgJJW8zLCVnMywlZzMKKwlhZGQJJWczLCVvNSwlbzQKKwlpbmMJMTYsJW8wCisJc3R1dwklbzQsWyVvMC00XQorCXNybHgJJW80LDMyLCVvNQorCWFuZGNjCSVvMiwtNCwlZzAKKwlibnosYSxwdAklaWNjLC5MX2JuX211bF93b3Jkc19sb29wCisJbGR1dwlbJW8xXSwlZzIKKwlub3AKKwlub3AKKworCWJybnosYSxwbgklbzIsLkxfYm5fbXVsX3dvcmRzX3RhaWwKKwlsZHV3CVslbzFdLCVnMgorLkxfYm5fbXVsX3dvcmRzX3JldHVybjoKKwlyZXRsCisJbW92CSVvNSwlbzAKKworLkxfYm5fbXVsX3dvcmRzX3RhaWw6CisJbXVseAklbzMsJWcyLCVnMgorCWFkZAklZzIsJW81LCVvNAorCWRlYwklbzIKKwlzcmx4CSVvNCwzMiwlbzUKKwlicnoscHQJJW8yLC5MX2JuX211bF93b3Jkc19yZXR1cm4KKwlzdHV3CSVvNCxbJW8wXQorCisJbGR1dwlbJW8xKzRdLCVnMgorCW11bHgJJW8zLCVnMiwlZzIKKwlhZGQJJWcyLCVvNSwlbzQKKwlkZWMJJW8yCisJc3JseAklbzQsMzIsJW81CisJYnJ6LHB0CSVvMiwuTF9ibl9tdWxfd29yZHNfcmV0dXJuCisJc3R1dwklbzQsWyVvMCs0XQorCisJbGR1dwlbJW8xKzhdLCVnMgorCW11bHgJJW8zLCVnMiwlZzIKKwlhZGQJJWcyLCVvNSwlbzQKKwlzdHV3CSVvNCxbJW8wKzhdCisJcmV0bAorCXNybHgJJW80LDMyLCVvMAorCisudHlwZQlibl9tdWxfd29yZHMsI2Z1bmN0aW9uCisuc2l6ZQlibl9tdWxfd29yZHMsKC4tYm5fbXVsX3dvcmRzKQorCisuYWxpZ24gIDMyCisuZ2xvYmFsCWJuX3Nxcl93b3JkcworLyoKKyAqIHZvaWQgYm5fc3FyX3dvcmRzKHIsYSxuKQorICogQk5fVUxPTkcgKnIsKmE7CisgKiBpbnQgbjsKKyAqLworYm5fc3FyX3dvcmRzOgorCXNyYQklbzIsJWcwLCVvMgkhIHNpZ254ICVvMgorCWJyZ3osYQklbzIsLkxfYm5fc3FyX3dvcmRzX3Byb2NlZWVkCisJbGR1dwlbJW8xXSwlZzIKKwlyZXRsCisJY2xyCSVvMAorCW5vcAorCW5vcAorCW5vcAorCisuTF9ibl9zcXJfd29yZHNfcHJvY2VlZWQ6CisJYW5kY2MJJW8yLC00LCVnMAorCW5vcAorCWJ6LHBuCSVpY2MsLkxfYm5fc3FyX3dvcmRzX3RhaWwKKwlub3AKKworLkxfYm5fc3FyX3dvcmRzX2xvb3A6CQkhIHdvdyEgMzIgYWxpZ25lZCEKKwlsZHV3CVslbzErNF0sJWczCisJbXVseAklZzIsJWcyLCVvNAorCXN0dXcJJW80LFslbzBdCisJc3JseAklbzQsMzIsJW81CisJc3R1dwklbzUsWyVvMCs0XQorCW5vcAorCisJbGR1dwlbJW8xKzhdLCVnMgorCW11bHgJJWczLCVnMywlbzQKKwlkZWMJNCwlbzIKKwlzdHV3CSVvNCxbJW8wKzhdCisJc3JseAklbzQsMzIsJW81CisJc3R1dwklbzUsWyVvMCsxMl0KKworCWxkdXcJWyVvMSsxMl0sJWczCisJbXVseAklZzIsJWcyLCVvNAorCXNybHgJJW80LDMyLCVvNQorCXN0dXcJJW80LFslbzArMTZdCisJaW5jCTE2LCVvMQorCXN0dXcJJW81LFslbzArMjBdCisKKwltdWx4CSVnMywlZzMsJW80CisJaW5jCTMyLCVvMAorCXN0dXcJJW80LFslbzAtOF0KKwlzcmx4CSVvNCwzMiwlbzUKKwlhbmRjYwklbzIsLTQsJWcyCisJc3R1dwklbzUsWyVvMC00XQorCWJueixhLHB0CSVpY2MsLkxfYm5fc3FyX3dvcmRzX2xvb3AKKwlsZHV3CVslbzFdLCVnMgorCW5vcAorCisJYnJueixhLHBuCSVvMiwuTF9ibl9zcXJfd29yZHNfdGFpbAorCWxkdXcJWyVvMV0sJWcyCisuTF9ibl9zcXJfd29yZHNfcmV0dXJuOgorCXJldGwKKwljbHIJJW8wCisKKy5MX2JuX3Nxcl93b3Jkc190YWlsOgorCW11bHgJJWcyLCVnMiwlbzQKKwlkZWMJJW8yCisJc3R1dwklbzQsWyVvMF0KKwlzcmx4CSVvNCwzMiwlbzUKKwlicnoscHQJJW8yLC5MX2JuX3Nxcl93b3Jkc19yZXR1cm4KKwlzdHV3CSVvNSxbJW8wKzRdCisKKwlsZHV3CVslbzErNF0sJWcyCisJbXVseAklZzIsJWcyLCVvNAorCWRlYwklbzIKKwlzdHV3CSVvNCxbJW8wKzhdCisJc3JseAklbzQsMzIsJW81CisJYnJ6LHB0CSVvMiwuTF9ibl9zcXJfd29yZHNfcmV0dXJuCisJc3R1dwklbzUsWyVvMCsxMl0KKworCWxkdXcJWyVvMSs4XSwlZzIKKwltdWx4CSVnMiwlZzIsJW80CisJc3JseAklbzQsMzIsJW81CisJc3R1dwklbzQsWyVvMCsxNl0KKwlzdHV3CSVvNSxbJW8wKzIwXQorCXJldGwKKwljbHIJJW8wCisKKy50eXBlCWJuX3Nxcl93b3JkcywjZnVuY3Rpb24KKy5zaXplCWJuX3Nxcl93b3JkcywoLi1ibl9zcXJfd29yZHMpCisKKy5hbGlnbgkzMgorLmdsb2JhbCBibl9kaXZfd29yZHMKKy8qCisgKiBCTl9VTE9ORyBibl9kaXZfd29yZHMoaCxsLGQpCisgKiBCTl9VTE9ORyBoLGwsZDsKKyAqLworYm5fZGl2X3dvcmRzOgorCXNsbHgJJW8wLDMyLCVvMAorCW9yCSVvMCwlbzEsJW8wCisJdWRpdngJJW8wLCVvMiwlbzAKKwlyZXRsCisJc3JsCSVvMCwlZzAsJW8wCSEgY2xydXcJJW8wCisKKy50eXBlCWJuX2Rpdl93b3JkcywjZnVuY3Rpb24KKy5zaXplCWJuX2Rpdl93b3JkcywoLi1ibl9kaXZfd29yZHMpCisKKy5hbGlnbgkzMgorCisuZ2xvYmFsIGJuX2FkZF93b3JkcworLyoKKyAqIEJOX1VMT05HIGJuX2FkZF93b3JkcyhycCxhcCxicCxuKQorICogQk5fVUxPTkcgKnJwLCphcCwqYnA7CisgKiBpbnQgbjsKKyAqLworYm5fYWRkX3dvcmRzOgorCXNyYQklbzMsJWcwLCVvMwkhIHNpZ254ICVvMworCWJyZ3osYQklbzMsLkxfYm5fYWRkX3dvcmRzX3Byb2NlZWQKKwlsZHV3CVslbzFdLCVvNAorCXJldGwKKwljbHIJJW8wCisKKy5MX2JuX2FkZF93b3Jkc19wcm9jZWVkOgorCWFuZGNjCSVvMywtNCwlZzAKKwlieixwbgklaWNjLC5MX2JuX2FkZF93b3Jkc190YWlsCisJYWRkY2MJJWcwLDAsJWcwCSEgY2xlYXIgY2FycnkgZmxhZworCisuTF9ibl9hZGRfd29yZHNfbG9vcDoJCSEgd293ISAzMiBhbGlnbmVkIQorCWRlYwk0LCVvMworCWxkdXcJWyVvMl0sJW81CisJbGR1dwlbJW8xKzRdLCVnMQorCWxkdXcJWyVvMis0XSwlZzIKKwlsZHV3CVslbzErOF0sJWczCisJbGR1dwlbJW8yKzhdLCVnNAorCWFkZGNjYwklbzUsJW80LCVvNQorCXN0dXcJJW81LFslbzBdCisKKwlsZHV3CVslbzErMTJdLCVvNAorCWxkdXcJWyVvMisxMl0sJW81CisJaW5jCTE2LCVvMQorCWFkZGNjYwklZzEsJWcyLCVnMQorCXN0dXcJJWcxLFslbzArNF0KKwkKKwlpbmMJMTYsJW8yCisJYWRkY2NjCSVnMywlZzQsJWczCisJc3R1dwklZzMsWyVvMCs4XQorCisJaW5jCTE2LCVvMAorCWFkZGNjYwklbzUsJW80LCVvNQorCXN0dXcJJW81LFslbzAtNF0KKwlhbmQJJW8zLC00LCVnMQorCWJybnosYSxwdAklZzEsLkxfYm5fYWRkX3dvcmRzX2xvb3AKKwlsZHV3CVslbzFdLCVvNAorCisJYnJueixhLHBuCSVvMywuTF9ibl9hZGRfd29yZHNfdGFpbAorCWxkdXcJWyVvMV0sJW80CisuTF9ibl9hZGRfd29yZHNfcmV0dXJuOgorCWNscgklbzAKKwlyZXRsCisJbW92Y3MJJWljYywxLCVvMAorCW5vcAorCisuTF9ibl9hZGRfd29yZHNfdGFpbDoKKwlsZHV3CVslbzJdLCVvNQorCWRlYwklbzMKKwlhZGRjY2MJJW81LCVvNCwlbzUKKwlicnoscHQJJW8zLC5MX2JuX2FkZF93b3Jkc19yZXR1cm4KKwlzdHV3CSVvNSxbJW8wXQorCisJbGR1dwlbJW8xKzRdLCVvNAorCWxkdXcJWyVvMis0XSwlbzUKKwlkZWMJJW8zCisJYWRkY2NjCSVvNSwlbzQsJW81CisJYnJ6LHB0CSVvMywuTF9ibl9hZGRfd29yZHNfcmV0dXJuCisJc3R1dwklbzUsWyVvMCs0XQorCisJbGR1dwlbJW8xKzhdLCVvNAorCWxkdXcJWyVvMis4XSwlbzUKKwlhZGRjY2MJJW81LCVvNCwlbzUKKwlzdHV3CSVvNSxbJW8wKzhdCisJY2xyCSVvMAorCXJldGwKKwltb3ZjcwklaWNjLDEsJW8wCisKKy50eXBlCWJuX2FkZF93b3JkcywjZnVuY3Rpb24KKy5zaXplCWJuX2FkZF93b3JkcywoLi1ibl9hZGRfd29yZHMpCisKKy5nbG9iYWwgYm5fc3ViX3dvcmRzCisvKgorICogQk5fVUxPTkcgYm5fc3ViX3dvcmRzKHJwLGFwLGJwLG4pCisgKiBCTl9VTE9ORyAqcnAsKmFwLCpicDsKKyAqIGludCBuOworICovCitibl9zdWJfd29yZHM6CisJc3JhCSVvMywlZzAsJW8zCSEgc2lnbnggJW8zCisJYnJneixhCSVvMywuTF9ibl9zdWJfd29yZHNfcHJvY2VlZAorCWxkdXcJWyVvMV0sJW80CisJcmV0bAorCWNscgklbzAKKworLkxfYm5fc3ViX3dvcmRzX3Byb2NlZWQ6CisJYW5kY2MJJW8zLC00LCVnMAorCWJ6LHBuCSVpY2MsLkxfYm5fc3ViX3dvcmRzX3RhaWwKKwlhZGRjYwklZzAsMCwlZzAJISBjbGVhciBjYXJyeSBmbGFnCisKKy5MX2JuX3N1Yl93b3Jkc19sb29wOgkJISB3b3chIDMyIGFsaWduZWQhCisJZGVjCTQsJW8zCisJbGR1dwlbJW8yXSwlbzUKKwlsZHV3CVslbzErNF0sJWcxCisJbGR1dwlbJW8yKzRdLCVnMgorCWxkdXcJWyVvMSs4XSwlZzMKKwlsZHV3CVslbzIrOF0sJWc0CisJc3ViY2NjCSVvNCwlbzUsJW81CisJc3R1dwklbzUsWyVvMF0KKworCWxkdXcJWyVvMSsxMl0sJW80CisJbGR1dwlbJW8yKzEyXSwlbzUKKwlpbmMJMTYsJW8xCisJc3ViY2NjCSVnMSwlZzIsJWcyCisJc3R1dwklZzIsWyVvMCs0XQorCisJaW5jCTE2LCVvMgorCXN1YmNjYwklZzMsJWc0LCVnNAorCXN0dXcJJWc0LFslbzArOF0KKworCWluYwkxNiwlbzAKKwlzdWJjY2MJJW80LCVvNSwlbzUKKwlzdHV3CSVvNSxbJW8wLTRdCisJYW5kCSVvMywtNCwlZzEKKwlicm56LGEscHQJJWcxLC5MX2JuX3N1Yl93b3Jkc19sb29wCisJbGR1dwlbJW8xXSwlbzQKKworCWJybnosYSxwbgklbzMsLkxfYm5fc3ViX3dvcmRzX3RhaWwKKwlsZHV3CVslbzFdLCVvNAorLkxfYm5fc3ViX3dvcmRzX3JldHVybjoKKwljbHIJJW8wCisJcmV0bAorCW1vdmNzCSVpY2MsMSwlbzAKKwlub3AKKworLkxfYm5fc3ViX3dvcmRzX3RhaWw6CQkhIHdvdyEgMzIgYWxpZ25lZCEKKwlsZHV3CVslbzJdLCVvNQorCWRlYwklbzMKKwlzdWJjY2MJJW80LCVvNSwlbzUKKwlicnoscHQJJW8zLC5MX2JuX3N1Yl93b3Jkc19yZXR1cm4KKwlzdHV3CSVvNSxbJW8wXQorCisJbGR1dwlbJW8xKzRdLCVvNAorCWxkdXcJWyVvMis0XSwlbzUKKwlkZWMJJW8zCisJc3ViY2NjCSVvNCwlbzUsJW81CisJYnJ6LHB0CSVvMywuTF9ibl9zdWJfd29yZHNfcmV0dXJuCisJc3R1dwklbzUsWyVvMCs0XQorCisJbGR1dwlbJW8xKzhdLCVvNAorCWxkdXcJWyVvMis4XSwlbzUKKwlzdWJjY2MJJW80LCVvNSwlbzUKKwlzdHV3CSVvNSxbJW8wKzhdCisJY2xyCSVvMAorCXJldGwKKwltb3ZjcwklaWNjLDEsJW8wCisKKy50eXBlCWJuX3N1Yl93b3JkcywjZnVuY3Rpb24KKy5zaXplCWJuX3N1Yl93b3JkcywoLi1ibl9zdWJfd29yZHMpCisKKy8qCisgKiBDb2RlIGJlbG93IGRlcGVuZHMgb24gdGhlIGZhY3QgdGhhdCB1cHBlciBwYXJ0cyBvZiB0aGUgJWwwLSVsNworICogYW5kICVpMC0laTcgYXJlIHplcm9lZCBieSBrZXJuZWwgYWZ0ZXIgY29udGV4dCBzd2l0Y2guIEluCisgKiBwcmV2aW91cyB2ZXJzaW9ucyB0aGlzIGNvbW1lbnQgc3RhdGVkIHRoYXQgInRoZSB0cm91YmxlIGlzIHRoYXQKKyAqIGl0J3Mgbm90IGZlYXNpYmxlIHRvIGltcGxlbWVudCB0aGUgbXVtYm8tanVtYm8gaW4gbGVzcyBWOQorICogaW5zdHJ1Y3Rpb25zOi0oIiB3aGljaCBhcHBhcmVudGx5IGlzbid0IHRydWUgdGhhbmtzIHRvCisgKiAnYmNzLGEgJXhjYywuKzg7IGluYyAlcmQnIHBhaXIuIEJ1dCB0aGUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQKKyAqIHJlc3VsdHMgbm90IGZyb20gdGhlIHNob3J0ZXIgY29kZSwgYnV0IGZyb20gZWxpbWluYXRpb24gb2YKKyAqIG11bHRpY3ljbGUgbm9uZS1wYWlyYWJsZSAncmQgJXksJXJkJyBpbnN0cnVjdGlvbnMuCisgKgorICoJCQkJCQkJQW5keS4KKyAqLworCisvKgorICogSGVyZSBpcyByZWdpc3RlciB1c2FnZSBtYXAgZm9yICphbGwqIHJvdXRpbmVzIGJlbG93LgorICovCisjZGVmaW5lIHRfMQklbzAKKyNkZWZpbmUJdF8yCSVvMQorI2RlZmluZSBjXzEyCSVvMgorI2RlZmluZSBjXzMJJW8zCisKKyNkZWZpbmUgYXAoSSkJWyVpMSs0KkldCisjZGVmaW5lIGJwKEkpCVslaTIrNCpJXQorI2RlZmluZSBycChJKQlbJWkwKzQqSV0KKworI2RlZmluZQlhXzAJJWwwCisjZGVmaW5lCWFfMQklbDEKKyNkZWZpbmUJYV8yCSVsMgorI2RlZmluZQlhXzMJJWwzCisjZGVmaW5lCWFfNAklbDQKKyNkZWZpbmUJYV81CSVsNQorI2RlZmluZQlhXzYJJWw2CisjZGVmaW5lCWFfNwklbDcKKworI2RlZmluZQliXzAJJWkzCisjZGVmaW5lCWJfMQklaTQKKyNkZWZpbmUJYl8yCSVpNQorI2RlZmluZQliXzMJJW80CisjZGVmaW5lCWJfNAklbzUKKyNkZWZpbmUJYl81CSVvNworI2RlZmluZQliXzYJJWcxCisjZGVmaW5lCWJfNwklZzQKKworLmFsaWduCTMyCisuZ2xvYmFsIGJuX211bF9jb21iYTgKKy8qCisgKiB2b2lkIGJuX211bF9jb21iYTgocixhLGIpCisgKiBCTl9VTE9ORyAqciwqYSwqYjsKKyAqLworYm5fbXVsX2NvbWJhODoKKwlzYXZlCSVzcCxGUkFNRV9TSVpFLCVzcAorCW1vdgkxLHRfMgorCWxkdXcJYXAoMCksYV8wCisJc2xseAl0XzIsMzIsdF8yCisJbGR1dwlicCgwKSxiXzAJIT0KKwlsZHV3CWJwKDEpLGJfMQorCW11bHgJYV8wLGJfMCx0XzEJIW11bF9hZGRfYyhhWzBdLGJbMF0sYzEsYzIsYzMpOworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgwKQkhPSFyWzBdPWMxOworCisJbGR1dwlhcCgxKSxhXzEKKwltdWx4CWFfMCxiXzEsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzFdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMwkJIT0KKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWxkdXcJYXAoMiksYV8yCisJbXVseAlhXzEsYl8wLHRfMQkhPSFtdWxfYWRkX2MoYVsxXSxiWzBdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIJIT0KKwlzdHV3CXRfMSxycCgxKQkhclsxXT1jMjsKKwlvcgljXzEyLGNfMyxjXzEyCisKKwltdWx4CWFfMixiXzAsdF8xCSFtdWxfYWRkX2MoYVsyXSxiWzBdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCSE9CisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbGR1dwlicCgyKSxiXzIJIT0KKwltdWx4CWFfMSxiXzEsdF8xCSFtdWxfYWRkX2MoYVsxXSxiWzFdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMJIT0KKwlsZHV3CWJwKDMpLGJfMworCW11bHgJYV8wLGJfMix0XzEJIW11bF9hZGRfYyhhWzBdLGJbMl0sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDIpCSFyWzJdPWMzOworCW9yCWNfMTIsY18zLGNfMTIJIT0KKworCW11bHgJYV8wLGJfMyx0XzEJIW11bF9hZGRfYyhhWzBdLGJbM10sYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgJIT0KKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMSxiXzIsdF8xCSE9IW11bF9hZGRfYyhhWzFdLGJbMl0sYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCWxkdXcJYXAoMyksYV8zCisJbXVseAlhXzIsYl8xLHRfMQkhbXVsX2FkZF9jKGFbMl0sYlsxXSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgkhPQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbGR1dwlhcCg0KSxhXzQKKwltdWx4CWFfMyxiXzAsdF8xCSE9IW11bF9hZGRfYyhhWzNdLGJbMF0sYzEsYzIsYzMpOyE9CisJYWRkY2MJY18xMix0XzEsdF8xCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlzcmx4CXRfMSwzMixjXzEyCSE9CisJc3R1dwl0XzEscnAoMykJIXJbM109YzE7CisJb3IJY18xMixjXzMsY18xMgorCisJbXVseAlhXzQsYl8wLHRfMQkhbXVsX2FkZF9jKGFbNF0sYlswXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgkhPQorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV8zLGJfMSx0XzEJIT0hbXVsX2FkZF9jKGFbM10sYlsxXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzIsYl8yLHRfMQkhPSFtdWxfYWRkX2MoYVsyXSxiWzJdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlsZHV3CWJwKDQpLGJfNAkhPQorCW11bHgJYV8xLGJfMyx0XzEJIW11bF9hZGRfYyhhWzFdLGJbM10sYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMwkhPQorCWxkdXcJYnAoNSksYl81CisJbXVseAlhXzAsYl80LHRfMQkhbXVsX2FkZF9jKGFbMF0sYls0XSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsdF8xCisJYmNzLGEJJXhjYywuKzgJIT0KKwlhZGQJY18zLHRfMixjXzMKKwlzcmx4CXRfMSwzMixjXzEyCisJc3R1dwl0XzEscnAoNCkJIXJbNF09YzI7CisJb3IJY18xMixjXzMsY18xMgkhPQorCisJbXVseAlhXzAsYl81LHRfMQkhbXVsX2FkZF9jKGFbMF0sYls1XSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV8xLGJfNCx0XzEJIW11bF9hZGRfYyhhWzFdLGJbNF0sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV8yLGJfMyx0XzEJIW11bF9hZGRfYyhhWzJdLGJbM10sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV8zLGJfMix0XzEJIW11bF9hZGRfYyhhWzNdLGJbMl0sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCWxkdXcJYXAoNSksYV81CisJbXVseAlhXzQsYl8xLHRfMQkhbXVsX2FkZF9jKGFbNF0sYlsxXSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgkhPQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbGR1dwlhcCg2KSxhXzYKKwltdWx4CWFfNSxiXzAsdF8xCSE9IW11bF9hZGRfYyhhWzVdLGJbMF0sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgkhPQorCXN0dXcJdF8xLHJwKDUpCSFyWzVdPWMzOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV82LGJfMCx0XzEJIW11bF9hZGRfYyhhWzZdLGJbMF0sYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIJIT0KKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfNSxiXzEsdF8xCSE9IW11bF9hZGRfYyhhWzVdLGJbMV0sYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV80LGJfMix0XzEJIT0hbXVsX2FkZF9jKGFbNF0sYlsyXSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzMsYl8zLHRfMQkhPSFtdWxfYWRkX2MoYVszXSxiWzNdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMixiXzQsdF8xCSE9IW11bF9hZGRfYyhhWzJdLGJbNF0sYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWxkdXcJYnAoNiksYl82CSE9CisJbXVseAlhXzEsYl81LHRfMQkhbXVsX2FkZF9jKGFbMV0sYls1XSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbGR1dwlicCg3KSxiXzcKKwltdWx4CWFfMCxiXzYsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzZdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCg2KQkhcls2XT1jMTsKKwlvcgljXzEyLGNfMyxjXzEyCSE9CisKKwltdWx4CWFfMCxiXzcsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzddLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzEsYl82LHRfMQkhbXVsX2FkZF9jKGFbMV0sYls2XSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzIsYl81LHRfMQkhbXVsX2FkZF9jKGFbMl0sYls1XSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzMsYl80LHRfMQkhbXVsX2FkZF9jKGFbM10sYls0XSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzQsYl8zLHRfMQkhbXVsX2FkZF9jKGFbNF0sYlszXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzUsYl8yLHRfMQkhbXVsX2FkZF9jKGFbNV0sYlsyXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbGR1dwlhcCg3KSxhXzcKKwltdWx4CWFfNixiXzEsdF8xCSE9IW11bF9hZGRfYyhhWzZdLGJbMV0sYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV83LGJfMCx0XzEJIT0hbXVsX2FkZF9jKGFbN10sYlswXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsdF8xCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlzcmx4CXRfMSwzMixjXzEyCSE9CisJc3R1dwl0XzEscnAoNykJIXJbN109YzI7CisJb3IJY18xMixjXzMsY18xMgorCisJbXVseAlhXzcsYl8xLHRfMQkhPSFtdWxfYWRkX2MoYVs3XSxiWzFdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbXVseAlhXzYsYl8yLHRfMQkhbXVsX2FkZF9jKGFbNl0sYlsyXSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbXVseAlhXzUsYl8zLHRfMQkhbXVsX2FkZF9jKGFbNV0sYlszXSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbXVseAlhXzQsYl80LHRfMQkhbXVsX2FkZF9jKGFbNF0sYls0XSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbXVseAlhXzMsYl81LHRfMQkhbXVsX2FkZF9jKGFbM10sYls1XSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbXVseAlhXzIsYl82LHRfMQkhbXVsX2FkZF9jKGFbMl0sYls2XSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbXVseAlhXzEsYl83LHRfMQkhbXVsX2FkZF9jKGFbMV0sYls3XSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsdF8xCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMJIT0KKwlzcmx4CXRfMSwzMixjXzEyCisJc3R1dwl0XzEscnAoOCkJIXJbOF09YzM7CisJb3IJY18xMixjXzMsY18xMgorCisJbXVseAlhXzIsYl83LHRfMQkhPSFtdWxfYWRkX2MoYVsyXSxiWzddLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbXVseAlhXzMsYl82LHRfMQkhbXVsX2FkZF9jKGFbM10sYls2XSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzQsYl81LHRfMQkhbXVsX2FkZF9jKGFbNF0sYls1XSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzUsYl80LHRfMQkhbXVsX2FkZF9jKGFbNV0sYls0XSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzYsYl8zLHRfMQkhbXVsX2FkZF9jKGFbNl0sYlszXSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzcsYl8yLHRfMQkhbXVsX2FkZF9jKGFbN10sYlsyXSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsdF8xCisJYmNzLGEJJXhjYywuKzgJIT0KKwlhZGQJY18zLHRfMixjXzMKKwlzcmx4CXRfMSwzMixjXzEyCisJc3R1dwl0XzEscnAoOSkJIXJbOV09YzE7CisJb3IJY18xMixjXzMsY18xMgkhPQorCisJbXVseAlhXzcsYl8zLHRfMQkhbXVsX2FkZF9jKGFbN10sYlszXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV82LGJfNCx0XzEJIW11bF9hZGRfYyhhWzZdLGJbNF0sYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV81LGJfNSx0XzEJIW11bF9hZGRfYyhhWzVdLGJbNV0sYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV80LGJfNix0XzEJIW11bF9hZGRfYyhhWzRdLGJbNl0sYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV8zLGJfNyx0XzEJIW11bF9hZGRfYyhhWzNdLGJbN10sYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDEwKQkhclsxMF09YzI7CisJb3IJY18xMixjXzMsY18xMgkhPQorCisJbXVseAlhXzQsYl83LHRfMQkhbXVsX2FkZF9jKGFbNF0sYls3XSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV81LGJfNix0XzEJIW11bF9hZGRfYyhhWzVdLGJbNl0sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV82LGJfNSx0XzEJIW11bF9hZGRfYyhhWzZdLGJbNV0sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV83LGJfNCx0XzEJIW11bF9hZGRfYyhhWzddLGJbNF0sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDExKQkhclsxMV09YzM7CisJb3IJY18xMixjXzMsY18xMgkhPQorCisJbXVseAlhXzcsYl81LHRfMQkhbXVsX2FkZF9jKGFbN10sYls1XSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV82LGJfNix0XzEJIW11bF9hZGRfYyhhWzZdLGJbNl0sYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV81LGJfNyx0XzEJIW11bF9hZGRfYyhhWzVdLGJbN10sYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDEyKQkhclsxMl09YzE7CisJb3IJY18xMixjXzMsY18xMgkhPQorCisJbXVseAlhXzYsYl83LHRfMQkhbXVsX2FkZF9jKGFbNl0sYls3XSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV83LGJfNix0XzEJIW11bF9hZGRfYyhhWzddLGJbNl0sYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0CXRfMSxycCgxMykJIXJbMTNdPWMyOworCW9yCWNfMTIsY18zLGNfMTIJIT0KKworCW11bHgJYV83LGJfNyx0XzEJIW11bF9hZGRfYyhhWzddLGJbN10sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCXNybHgJdF8xLDMyLGNfMTIJIT0KKwlzdHV3CXRfMSxycCgxNCkJIXJbMTRdPWMzOworCXN0dXcJY18xMixycCgxNSkJIXJbMTVdPWMxOworCisJcmV0CisJcmVzdG9yZQklZzAsJWcwLCVvMAkhPQorCisudHlwZQlibl9tdWxfY29tYmE4LCNmdW5jdGlvbgorLnNpemUJYm5fbXVsX2NvbWJhOCwoLi1ibl9tdWxfY29tYmE4KQorCisuYWxpZ24JMzIKKworLmdsb2JhbCBibl9tdWxfY29tYmE0CisvKgorICogdm9pZCBibl9tdWxfY29tYmE0KHIsYSxiKQorICogQk5fVUxPTkcgKnIsKmEsKmI7CisgKi8KK2JuX211bF9jb21iYTQ6CisJc2F2ZQklc3AsRlJBTUVfU0laRSwlc3AKKwlsZHV3CWFwKDApLGFfMAorCW1vdgkxLHRfMgorCWxkdXcJYnAoMCksYl8wCisJc2xseAl0XzIsMzIsdF8yCSE9CisJbGR1dwlicCgxKSxiXzEKKwltdWx4CWFfMCxiXzAsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzBdLGMxLGMyLGMzKTsKKwlzcmx4CXRfMSwzMixjXzEyCisJc3R1dwl0XzEscnAoMCkJIT0hclswXT1jMTsKKworCWxkdXcJYXAoMSksYV8xCisJbXVseAlhXzAsYl8xLHRfMQkhbXVsX2FkZF9jKGFbMF0sYlsxXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMJCSE9CisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlsZHV3CWFwKDIpLGFfMgorCW11bHgJYV8xLGJfMCx0XzEJIT0hbXVsX2FkZF9jKGFbMV0sYlswXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsdF8xCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlzcmx4CXRfMSwzMixjXzEyCSE9CisJc3R1dwl0XzEscnAoMSkJIXJbMV09YzI7CisJb3IJY18xMixjXzMsY18xMgorCisJbXVseAlhXzIsYl8wLHRfMQkhbXVsX2FkZF9jKGFbMl0sYlswXSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgkhPQorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWxkdXcJYnAoMiksYl8yCSE9CisJbXVseAlhXzEsYl8xLHRfMQkhbXVsX2FkZF9jKGFbMV0sYlsxXSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCSE9CisJbGR1dwlicCgzKSxiXzMKKwltdWx4CWFfMCxiXzIsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzJdLGMzLGMxLGMyKTsKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAkhPQorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgyKQkhclsyXT1jMzsKKwlvcgljXzEyLGNfMyxjXzEyCSE9CisKKwltdWx4CWFfMCxiXzMsdF8xCSFtdWxfYWRkX2MoYVswXSxiWzNdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzEsYl8yLHRfMQkhbXVsX2FkZF9jKGFbMV0sYlsyXSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CSE9CisJYWRkCWNfMyx0XzIsY18zCisJbGR1dwlhcCgzKSxhXzMKKwltdWx4CWFfMixiXzEsdF8xCSFtdWxfYWRkX2MoYVsyXSxiWzFdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCSE9CisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMyxiXzAsdF8xCSFtdWxfYWRkX2MoYVszXSxiWzBdLGMxLGMyLGMzKTshPQorCWFkZGNjCWNfMTIsdF8xLHRfMQkhPQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDMpCSE9IXJbM109YzE7CisJb3IJY18xMixjXzMsY18xMgorCisJbXVseAlhXzMsYl8xLHRfMQkhbXVsX2FkZF9jKGFbM10sYlsxXSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMJCSE9CisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMixiXzIsdF8xCSFtdWxfYWRkX2MoYVsyXSxiWzJdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCSE9CisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMSxiXzMsdF8xCSFtdWxfYWRkX2MoYVsxXSxiWzNdLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSx0XzEJIT0KKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCg0KQkhPSFyWzRdPWMyOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV8yLGJfMyx0XzEJIW11bF9hZGRfYyhhWzJdLGJbM10sYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCQkhPQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzMsYl8yLHRfMQkhbXVsX2FkZF9jKGFbM10sYlsyXSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsdF8xCSE9CisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlzcmx4CXRfMSwzMixjXzEyCisJc3R1dwl0XzEscnAoNSkJIT0hcls1XT1jMzsKKwlvcgljXzEyLGNfMyxjXzEyCisKKwltdWx4CWFfMyxiXzMsdF8xCSFtdWxfYWRkX2MoYVszXSxiWzNdLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwlzcmx4CXRfMSwzMixjXzEyCSE9CisJc3R1dwl0XzEscnAoNikJIXJbNl09YzE7CisJc3R1dwljXzEyLHJwKDcpCSFyWzddPWMyOworCQorCXJldAorCXJlc3RvcmUJJWcwLCVnMCwlbzAKKworLnR5cGUJYm5fbXVsX2NvbWJhNCwjZnVuY3Rpb24KKy5zaXplCWJuX211bF9jb21iYTQsKC4tYm5fbXVsX2NvbWJhNCkKKworLmFsaWduCTMyCisKKy5nbG9iYWwgYm5fc3FyX2NvbWJhOAorYm5fc3FyX2NvbWJhODoKKwlzYXZlCSVzcCxGUkFNRV9TSVpFLCVzcAorCW1vdgkxLHRfMgorCWxkdXcJYXAoMCksYV8wCisJc2xseAl0XzIsMzIsdF8yCisJbGR1dwlhcCgxKSxhXzEKKwltdWx4CWFfMCxhXzAsdF8xCSFzcXJfYWRkX2MoYSwwLGMxLGMyLGMzKTsKKwlzcmx4CXRfMSwzMixjXzEyCisJc3R1dwl0XzEscnAoMCkJIXJbMF09YzE7CisKKwlsZHV3CWFwKDIpLGFfMgorCW11bHgJYV8wLGFfMSx0XzEJIT0hc3FyX2FkZF9jMihhLDEsMCxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDEpCSFyWzFdPWMyOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV8yLGFfMCx0XzEJIXNxcl9hZGRfYzIoYSwyLDAsYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlsZHV3CWFwKDMpLGFfMworCW11bHgJYV8xLGFfMSx0XzEJIXNxcl9hZGRfYyhhLDEsYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDIpCSFyWzJdPWMzOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV8wLGFfMyx0XzEJIXNxcl9hZGRfYzIoYSwzLDAsYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlsZHV3CWFwKDQpLGFfNAorCW11bHgJYV8xLGFfMix0XzEJIXNxcl9hZGRfYzIoYSwyLDEsYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0CXRfMSxycCgzKQkhclszXT1jMTsKKwlvcgljXzEyLGNfMyxjXzEyCisKKwltdWx4CWFfNCxhXzAsdF8xCSFzcXJfYWRkX2MyKGEsNCwwLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzMsYV8xLHRfMQkhc3FyX2FkZF9jMihhLDMsMSxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbGR1dwlhcCg1KSxhXzUKKwltdWx4CWFfMixhXzIsdF8xCSFzcXJfYWRkX2MoYSwyLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCg0KQkhcls0XT1jMjsKKwlvcgljXzEyLGNfMyxjXzEyCisKKwltdWx4CWFfMCxhXzUsdF8xCSFzcXJfYWRkX2MyKGEsNSwwLGMzLGMxLGMyKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzEsYV80LHRfMQkhc3FyX2FkZF9jMihhLDQsMSxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbGR1dwlhcCg2KSxhXzYKKwltdWx4CWFfMixhXzMsdF8xCSFzcXJfYWRkX2MyKGEsMywyLGMzLGMxLGMyKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCg1KQkhcls1XT1jMzsKKwlvcgljXzEyLGNfMyxjXzEyCisKKwltdWx4CWFfNixhXzAsdF8xCSFzcXJfYWRkX2MyKGEsNiwwLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzUsYV8xLHRfMQkhc3FyX2FkZF9jMihhLDUsMSxjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzQsYV8yLHRfMQkhc3FyX2FkZF9jMihhLDQsMixjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbGR1dwlhcCg3KSxhXzcKKwltdWx4CWFfMyxhXzMsdF8xCSE9IXNxcl9hZGRfYyhhLDMsYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDYpCSFyWzZdPWMxOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV8wLGFfNyx0XzEJIXNxcl9hZGRfYzIoYSw3LDAsYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMSxhXzYsdF8xCSFzcXJfYWRkX2MyKGEsNiwxLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMixhXzUsdF8xCSFzcXJfYWRkX2MyKGEsNSwyLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMyxhXzQsdF8xCSFzcXJfYWRkX2MyKGEsNCwzLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCg3KQkhcls3XT1jMjsKKwlvcgljXzEyLGNfMyxjXzEyCisKKwltdWx4CWFfNyxhXzEsdF8xCSFzcXJfYWRkX2MyKGEsNywxLGMzLGMxLGMyKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzYsYV8yLHRfMQkhc3FyX2FkZF9jMihhLDYsMixjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzUsYV8zLHRfMQkhc3FyX2FkZF9jMihhLDUsMyxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzQsYV80LHRfMQkhc3FyX2FkZF9jKGEsNCxjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsdF8xCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlzcmx4CXRfMSwzMixjXzEyCisJc3R1dwl0XzEscnAoOCkJIXJbOF09YzM7CisJb3IJY18xMixjXzMsY18xMgorCisJbXVseAlhXzIsYV83LHRfMQkhc3FyX2FkZF9jMihhLDcsMixjMSxjMixjMyk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV8zLGFfNix0XzEJIXNxcl9hZGRfYzIoYSw2LDMsYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCW11bHgJYV80LGFfNSx0XzEJIXNxcl9hZGRfYzIoYSw1LDQsYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDkpCSFyWzldPWMxOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV83LGFfMyx0XzEJIXNxcl9hZGRfYzIoYSw3LDMsYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfNixhXzQsdF8xCSFzcXJfYWRkX2MyKGEsNiw0LGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfNSxhXzUsdF8xCSFzcXJfYWRkX2MoYSw1LGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgxMCkJIXJbMTBdPWMyOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV80LGFfNyx0XzEJIXNxcl9hZGRfYzIoYSw3LDQsYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfNSxhXzYsdF8xCSFzcXJfYWRkX2MyKGEsNiw1LGMzLGMxLGMyKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgxMSkJIXJbMTFdPWMzOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV83LGFfNSx0XzEJIXNxcl9hZGRfYzIoYSw3LDUsYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfNixhXzYsdF8xCSFzcXJfYWRkX2MoYSw2LGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgxMikJIXJbMTJdPWMxOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV82LGFfNyx0XzEJIXNxcl9hZGRfYzIoYSw3LDYsYzIsYzMsYzEpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgxMykJIXJbMTNdPWMyOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV83LGFfNyx0XzEJIXNxcl9hZGRfYyhhLDcsYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgxNCkJIXJbMTRdPWMzOworCXN0dXcJY18xMixycCgxNSkJIXJbMTVdPWMxOworCisJcmV0CisJcmVzdG9yZQklZzAsJWcwLCVvMAorCisudHlwZQlibl9zcXJfY29tYmE4LCNmdW5jdGlvbgorLnNpemUJYm5fc3FyX2NvbWJhOCwoLi1ibl9zcXJfY29tYmE4KQorCisuYWxpZ24JMzIKKworLmdsb2JhbCBibl9zcXJfY29tYmE0CisvKgorICogdm9pZCBibl9zcXJfY29tYmE0KHIsYSkKKyAqIEJOX1VMT05HICpyLCphOworICovCitibl9zcXJfY29tYmE0OgorCXNhdmUJJXNwLEZSQU1FX1NJWkUsJXNwCisJbW92CTEsdF8yCisJbGR1dwlhcCgwKSxhXzAKKwlzbGx4CXRfMiwzMix0XzIKKwlsZHV3CWFwKDEpLGFfMQorCW11bHgJYV8wLGFfMCx0XzEJIXNxcl9hZGRfYyhhLDAsYzEsYzIsYzMpOworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgwKQkhclswXT1jMTsKKworCWxkdXcJYXAoMiksYV8yCisJbXVseAlhXzAsYV8xLHRfMQkhc3FyX2FkZF9jMihhLDEsMCxjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDEpCSFyWzFdPWMyOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV8yLGFfMCx0XzEJIXNxcl9hZGRfYzIoYSwyLDAsYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlsZHV3CWFwKDMpLGFfMworCW11bHgJYV8xLGFfMSx0XzEJIXNxcl9hZGRfYyhhLDEsYzMsYzEsYzIpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDIpCSFyWzJdPWMzOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV8wLGFfMyx0XzEJIXNxcl9hZGRfYzIoYSwzLDAsYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLGNfMTIKKwljbHIJY18zCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwltdWx4CWFfMSxhXzIsdF8xCSFzcXJfYWRkX2MyKGEsMiwxLGMxLGMyLGMzKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlhZGRjYwljXzEyLHRfMSx0XzEKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCgzKQkhclszXT1jMTsKKwlvcgljXzEyLGNfMyxjXzEyCisKKwltdWx4CWFfMyxhXzEsdF8xCSFzcXJfYWRkX2MyKGEsMywxLGMyLGMzLGMxKTsKKwlhZGRjYwljXzEyLHRfMSxjXzEyCisJY2xyCWNfMworCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJYWRkY2MJY18xMix0XzEsY18xMgorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJbXVseAlhXzIsYV8yLHRfMQkhc3FyX2FkZF9jKGEsMixjMixjMyxjMSk7CisJYWRkY2MJY18xMix0XzEsdF8xCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJY18zLHRfMixjXzMKKwlzcmx4CXRfMSwzMixjXzEyCisJc3R1dwl0XzEscnAoNCkJIXJbNF09YzI7CisJb3IJY18xMixjXzMsY18xMgorCisJbXVseAlhXzIsYV8zLHRfMQkhc3FyX2FkZF9jMihhLDMsMixjMyxjMSxjMik7CisJYWRkY2MJY18xMix0XzEsY18xMgorCWNscgljXzMKKwliY3MsYQkleGNjLC4rOAorCWFkZAljXzMsdF8yLGNfMworCWFkZGNjCWNfMTIsdF8xLHRfMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCWNfMyx0XzIsY18zCisJc3JseAl0XzEsMzIsY18xMgorCXN0dXcJdF8xLHJwKDUpCSFyWzVdPWMzOworCW9yCWNfMTIsY18zLGNfMTIKKworCW11bHgJYV8zLGFfMyx0XzEJIXNxcl9hZGRfYyhhLDMsYzEsYzIsYzMpOworCWFkZGNjCWNfMTIsdF8xLHRfMQorCXNybHgJdF8xLDMyLGNfMTIKKwlzdHV3CXRfMSxycCg2KQkhcls2XT1jMTsKKwlzdHV3CWNfMTIscnAoNykJIXJbN109YzI7CisJCisJcmV0CisJcmVzdG9yZQklZzAsJWcwLCVvMAorCisudHlwZQlibl9zcXJfY29tYmE0LCNmdW5jdGlvbgorLnNpemUJYm5fc3FyX2NvbWJhNCwoLi1ibl9zcXJfY29tYmE0KQorCisuYWxpZ24JMzIKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vc3BhcmN2OS1tb250LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9zcGFyY3Y5LW1vbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmYjFlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vc3BhcmN2OS1tb250LnBsCkBAIC0wLDAgKzEsNjA2IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgRGVjZW1iZXIgMjAwNQorIworIyBQdXJlIFNQQVJDdjkvOCsgYW5kIElBTFUtb25seSBibl9tdWxfbW9udCBpbXBsZW1lbnRhdGlvbi4gVGhlIHJlYXNvbnMKKyMgZm9yIHVuZGVydGFrZW4gZWZmb3J0IGFyZSBtdWx0aXBsZS4gRmlyc3Qgb2YgYWxsLCBVbHRyYVNQQVJDIGlzIG5vdAorIyB0aGUgd2hvbGUgU1BBUkN2OSB1bml2ZXJzZSBhbmQgb3RoZXIgVklTLWZyZWUgaW1wbGVtZW50YXRpb25zIGRlc2VydmUKKyMgb3B0aW1pemVkIGNvZGUgYXMgbXVjaC4gU2Vjb25kbHksIG5ld2x5IGludHJvZHVjZWQgVWx0cmFTUEFSQyBUMSwKKyMgYS5rLmEuIE5pYWdhcmEsIGhhcyBzaGFyZWQgRlBVIGFuZCBjb25jdXJyZW50IEZQVS1pbnRlbnNpdmUgcGF0aGVzLAorIyBzdWNoIGFzIHNwYXJjdjlhLW1vbnQsIHdpbGwgc2ltcGx5IHNpbmsgaXQuIFllcywgVDEgaXMgZXF1aXBwZWQgd2l0aAorIyBzZXZlcmFsIGludGVncmF0ZWQgUlNBL0RTQSBhY2NlbGVyYXRvciBjaXJjdWl0cyBhY2Nlc3NpYmxlIHRocm91Z2gKKyMga2VybmVsIGRyaXZlciBbb25seSgqKV0sIGJ1dCBoYXZpbmcgZGVjZW50IHVzZXItbGFuZCBzb2Z0d2FyZQorIyBpbXBsZW1lbnRhdGlvbiBpcyBpbXBvcnRhbnQgdG9vLiBGaW5hbGx5LCByZWFzb25zIGxpa2UgZGVzaXJlIHRvCisjIGV4cGVyaW1lbnQgd2l0aCBkZWRpY2F0ZWQgc3F1YXJpbmcgcHJvY2VkdXJlLiBZZXMsIHRoaXMgbW9kdWxlCisjIGltcGxlbWVudHMgb25lLCBiZWNhdXNlIGl0IHdhcyBlYXNpZXN0IHRvIGRyYWZ0IGl0IGluIFNQQVJDdjkKKyMgaW5zdHJ1Y3Rpb25zLi4uCisKKyMgKCopCUVuZ2luZSBhY2Nlc3NpbmcgdGhlIGRyaXZlciBpbiBxdWVzdGlvbiBpcyBvbiBteSBUT0RPIGxpc3QuCisjCUZvciByZWZlcmVuY2UsIGFjY2VsZWF0b3IgaXMgZXN0aW1hdGVkIHRvIGdpdmUgNiB0byAxMCB0aW1lcworIwlpbXByb3ZlbWVudCBvbiBzaW5nbGUtdGhyZWFkZWQgUlNBIHNpZ24uIEl0IHNob3VsZCBiZSBub3RlZAorIwl0aGF0IDYtMTB4IGltcHJvdmVtZW50IGNvZWZmaWNpZW50IGRvZXMgbm90IGFjdHVhbGx5IG1lYW4KKyMJc29tZXRoaW5nIGV4dHJhb3JkaW5hcnkgaW4gdGVybXMgb2YgYWJzb2x1dGUgW3NpbmdsZS10aHJlYWRlZF0KKyMJcGVyZm9ybWFuY2UsIGFzIFNQQVJDdjkgaW5zdHJ1Y3Rpb24gc2V0IGlzIGJ5IGFsbCBtZWFucyBsZWFzdAorIwlzdWl0YWJsZSBmb3IgaGlnaCBwZXJmb3JtYW5jZSBjcnlwdG8gYW1vbmcgb3RoZXIgNjQgYml0CisjCXBsYXRmb3Jtcy4gNi0xMHggZmFjdG9yIHNpbXBseSBwbGFjZXMgVDEgaW4gc2FtZSBwZXJmb3JtYW5jZQorIwlkb21haW4gYXMgc2F5IEFNRDY0IGFuZCBJQS02NC4gSW1wcm92ZW1lbnQgb2YgUlNBIHZlcmlmeSBkb24ndAorIwlhcHBlYXIgaW1wcmVzc2l2ZSBhdCBhbGwsIGJ1dCBpdCdzIHRoZSBzaWduIG9wZXJhdGlvbiB3aGljaCBpcworIwlmYXIgbW9yZSBjcml0aWNhbC9pbnRlcmVzdGluZy4KKworIyBZb3UgbWlnaHQgbm90aWNlIHRoYXQgaW5uZXIgbG9vcHMgYXJlIG1vZHVsby1zY2hlZHVsZWQ6LSkgVGhpcyBoYXMKKyMgZXNzZW50aWFsbHkgbmVnbGlnaWJsZSBpbXBhY3Qgb24gVWx0cmFTUEFSQyBwZXJmb3JtYW5jZSwgaXQncworIyBGdWppdHN1IFNQQVJDNjQgViB1c2VycyB3aG8gc2hvdWxkIG5vdGljZSBhbmQgaG9wZWZ1bGx5IGFwcHJlY2lhdGUKKyMgdGhlIGFkdmFudGFnZS4uLiBDdXJyZW50bHkgdGhpcyBtb2R1bGUgc3VycGFzc2VzIHNwYXJjdjlhLW1vbnQucGwKKyMgYnkgfjIwJSBvbiBVbHRyYVNQQVJDLUlJSSBhbmQgbGF0ZXIgY29yZXMsIGJ1dCByZWNhbGwgdGhhdCBzcGFyY3Y5YQorIyBtb2R1bGUgc3RpbGwgaGF2ZSBoaWRkZW4gcG90ZW50aWFsIFtzZWUgVE9ETyBsaXN0IHRoZXJlXSwgd2hpY2ggaXMKKyMgZXN0aW1hdGVkIHRvIGJlIGxhcmdlciB0aGFuIDIwJS4uLgorCisjIGludCBibl9tdWxfbW9udCgKKyRycD0iJWkwIjsJIyBCTl9VTE9ORyAqcnAsCiskYXA9IiVpMSI7CSMgY29uc3QgQk5fVUxPTkcgKmFwLAorJGJwPSIlaTIiOwkjIGNvbnN0IEJOX1VMT05HICpicCwKKyRucD0iJWkzIjsJIyBjb25zdCBCTl9VTE9ORyAqbnAsCiskbjA9IiVpNCI7CSMgY29uc3QgQk5fVUxPTkcgKm4wLAorJG51bT0iJWk1IjsJIyBpbnQgbnVtKTsKKworJGJpdHM9MzI7Citmb3IgKEBBUkdWKQl7ICRiaXRzPTY0IGlmICgvXC1tNjQvIHx8IC9cLXhhcmNoXD12OS8pOyB9CitpZiAoJGJpdHM9PTY0KQl7ICRiaWFzPTIwNDc7ICRmcmFtZT0xOTI7IH0KK2Vsc2UJCXsgJGJpYXM9MDsgICAgJGZyYW1lPTEyODsgfQorCiskY2FyMD0iJW8wIjsKKyRjYXIxPSIlbzEiOworJGNhcjI9IiVvMiI7CSMgMSBiaXQKKyRhY2MwPSIlbzMiOworJGFjYzE9IiVvNCI7CiskbWFzaz0iJWcxIjsJIyAzMiBiaXRzLCB3aGF0IGEgd2FzdGUuLi4KKyR0bXAwPSIlZzQiOworJHRtcDE9IiVnNSI7CisKKyRpPSIlbDAiOworJGo9IiVsMSI7CiskbXVsMD0iJWwyIjsKKyRtdWwxPSIlbDMiOworJHRwPSIlbDQiOworJGFwaj0iJWw1IjsKKyRucGo9IiVsNiI7CiskdHBqPSIlbDciOworCiskZm5hbWU9ImJuX211bF9tb250X2ludCI7CisKKyRjb2RlPTw8X19fOworLnNlY3Rpb24JIi50ZXh0IiwjYWxsb2MsI2V4ZWNpbnN0cgorCisuZ2xvYmFsCSRmbmFtZQorLmFsaWduCTMyCiskZm5hbWU6CisJY21wCSVvNSw0CQkJISAxMjggYml0cyBtaW5pbXVtCisJYmdlLHB0CSVpY2MsLkxlbnRlcgorCXNldGhpCSVoaSgweGZmZmZmZmZmKSwkbWFzaworCXJldGwKKwljbHIJJW8wCisuYWxpZ24JMzIKKy5MZW50ZXI6CisJc2F2ZQklc3AsLSRmcmFtZSwlc3AKKwlzbGwJJG51bSwyLCRudW0JCSEgbnVtKj00CisJb3IJJG1hc2ssJWxvKDB4ZmZmZmZmZmYpLCRtYXNrCisJbGQJWyRuMF0sJG4wCisJY21wCSRhcCwkYnAKKwlhbmQJJG51bSwkbWFzaywkbnVtCisJbGQJWyRicF0sJG11bDAJCSEgYnBbMF0KKwlub3AKKworCWFkZAklc3AsJGJpYXMsJW83CQkhIHJlYWwgdG9wIG9mIHN0YWNrCisJbGQJWyRhcF0sJGNhcjAJCSEgYXBbMF0gISByZWR1bmRhbnQgaW4gc3F1YXJpbmcgY29udGV4dAorCXN1YgklbzcsJG51bSwlbzcKKwlsZAlbJGFwKzRdLCRhcGoJCSEgYXBbMV0KKwlhbmQJJW83LC0xMDI0LCVvNworCWxkCVskbnBdLCRjYXIxCQkhIG5wWzBdCisJc3ViCSVvNywkYmlhcywlc3AJCSEgYWxsb2NhCisJbGQJWyRucCs0XSwkbnBqCQkhIG5wWzFdCisJYmUscHQJYCRiaXRzPT0zMj8iJWljYyI6IiV4Y2MiYCwuTGJuX3Nxcl9tb250CisJbW92CTEyLCRqCisKKwltdWx4CSRjYXIwLCRtdWwwLCRjYXIwCSEgYXBbMF0qYnBbMF0KKwltdWx4CSRhcGosJG11bDAsJHRtcDAJIXByb2xvZ3VlISBhcFsxXSpicFswXQorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCWFkZAklc3AsJGJpYXMrJGZyYW1lLCR0cAorCWxkCVskYXArOF0sJGFwagkJIXByb2xvZ3VlIQorCisJbXVseAkkbjAsJGFjYzAsJG11bDEJCSEgInRbMF0iKm4wCisJYW5kCSRtdWwxLCRtYXNrLCRtdWwxCisKKwltdWx4CSRjYXIxLCRtdWwxLCRjYXIxCSEgbnBbMF0qInRbMF0iKm4wCisJbXVseAkkbnBqLCRtdWwxLCRhY2MxCSFwcm9sb2d1ZSEgbnBbMV0qInRbMF0iKm4wCisJc3JseAkkY2FyMCwzMiwkY2FyMAorCWFkZAkkYWNjMCwkY2FyMSwkY2FyMQorCWxkCVskbnArOF0sJG5wagkJIXByb2xvZ3VlIQorCXNybHgJJGNhcjEsMzIsJGNhcjEKKwltb3YJJHRtcDAsJGFjYzAJCSFwcm9sb2d1ZSEKKworLkwxc3Q6CisJbXVseAkkYXBqLCRtdWwwLCR0bXAwCisJbXVseAkkbnBqLCRtdWwxLCR0bXAxCisJYWRkCSRhY2MwLCRjYXIwLCRjYXIwCisJbGQJWyRhcCskal0sJGFwagkJISBhcFtqXQorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCWFkZAkkYWNjMSwkY2FyMSwkY2FyMQorCWxkCVskbnArJGpdLCRucGoJCSEgbnBbal0KKwlzcmx4CSRjYXIwLDMyLCRjYXIwCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJYWRkCSRqLDQsJGoJCQkhIGorKworCW1vdgkkdG1wMCwkYWNjMAorCXN0CSRjYXIxLFskdHBdCisJY21wCSRqLCRudW0KKwltb3YJJHRtcDEsJGFjYzEKKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisJYmwJJWljYywuTDFzdAorCWFkZAkkdHAsNCwkdHAJCSEgdHArKworIS5MMXN0CisKKwltdWx4CSRhcGosJG11bDAsJHRtcDAJIWVwaWxvZ3VlIQorCW11bHgJJG5waiwkbXVsMSwkdG1wMQorCWFkZAkkYWNjMCwkY2FyMCwkY2FyMAorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCWFkZAkkYWNjMSwkY2FyMSwkY2FyMQorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJGFjYzAsJGNhcjEsJGNhcjEKKwlzdAkkY2FyMSxbJHRwXQorCXNybHgJJGNhcjEsMzIsJGNhcjEKKworCWFkZAkkdG1wMCwkY2FyMCwkY2FyMAorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCWFkZAkkdG1wMSwkY2FyMSwkY2FyMQorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJGFjYzAsJGNhcjEsJGNhcjEKKwlzdAkkY2FyMSxbJHRwKzRdCisJc3JseAkkY2FyMSwzMiwkY2FyMQorCisJYWRkCSRjYXIwLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cCs4XQorCXNybHgJJGNhcjEsMzIsJGNhcjIKKwwKKwltb3YJNCwkaQkJCSEgaSsrCisJbGQJWyRicCs0XSwkbXVsMAkJISBicFsxXQorLkxvdXRlcjoKKwlhZGQJJXNwLCRiaWFzKyRmcmFtZSwkdHAKKwlsZAlbJGFwXSwkY2FyMAkJISBhcFswXQorCWxkCVskYXArNF0sJGFwagkJISBhcFsxXQorCWxkCVskbnBdLCRjYXIxCQkhIG5wWzBdCisJbGQJWyRucCs0XSwkbnBqCQkhIG5wWzFdCisJbGQJWyR0cF0sJHRtcDEJCSEgdHBbMF0KKwlsZAlbJHRwKzRdLCR0cGoJCSEgdHBbMV0KKwltb3YJMTIsJGoKKworCW11bHgJJGNhcjAsJG11bDAsJGNhcjAKKwltdWx4CSRhcGosJG11bDAsJHRtcDAJIXByb2xvZ3VlIQorCWFkZAkkdG1wMSwkY2FyMCwkY2FyMAorCWxkCVskYXArOF0sJGFwagkJIXByb2xvZ3VlIQorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCisJbXVseAkkbjAsJGFjYzAsJG11bDEKKwlhbmQJJG11bDEsJG1hc2ssJG11bDEKKworCW11bHgJJGNhcjEsJG11bDEsJGNhcjEKKwltdWx4CSRucGosJG11bDEsJGFjYzEJIXByb2xvZ3VlIQorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJGFjYzAsJGNhcjEsJGNhcjEKKwlsZAlbJG5wKzhdLCRucGoJCSFwcm9sb2d1ZSEKKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisJbW92CSR0bXAwLCRhY2MwCQkhcHJvbG9ndWUhCisKKy5MaW5uZXI6CisJbXVseAkkYXBqLCRtdWwwLCR0bXAwCisJbXVseAkkbnBqLCRtdWwxLCR0bXAxCisJYWRkCSR0cGosJGNhcjAsJGNhcjAKKwlsZAlbJGFwKyRqXSwkYXBqCQkhIGFwW2pdCisJYWRkCSRhY2MwLCRjYXIwLCRjYXIwCisJYWRkCSRhY2MxLCRjYXIxLCRjYXIxCisJbGQJWyRucCskal0sJG5wagkJISBucFtqXQorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCWxkCVskdHArOF0sJHRwagkJISB0cFtqXQorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJGFjYzAsJGNhcjEsJGNhcjEKKwlhZGQJJGosNCwkagkJCSEgaisrCisJbW92CSR0bXAwLCRhY2MwCisJc3QJJGNhcjEsWyR0cF0JCSEgdHBbai0xXQorCXNybHgJJGNhcjEsMzIsJGNhcjEKKwltb3YJJHRtcDEsJGFjYzEKKwljbXAJJGosJG51bQorCWJsCSVpY2MsLkxpbm5lcgorCWFkZAkkdHAsNCwkdHAJCSEgdHArKworIS5MaW5uZXIKKworCW11bHgJJGFwaiwkbXVsMCwkdG1wMAkhZXBpbG9ndWUhCisJbXVseAkkbnBqLCRtdWwxLCR0bXAxCisJYWRkCSR0cGosJGNhcjAsJGNhcjAKKwlhZGQJJGFjYzAsJGNhcjAsJGNhcjAKKwlsZAlbJHRwKzhdLCR0cGoJCSEgdHBbal0KKwlhbmQJJGNhcjAsJG1hc2ssJGFjYzAKKwlhZGQJJGFjYzEsJGNhcjEsJGNhcjEKKwlzcmx4CSRjYXIwLDMyLCRjYXIwCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cF0JCSEgdHBbai0xXQorCXNybHgJJGNhcjEsMzIsJGNhcjEKKworCWFkZAkkdHBqLCRjYXIwLCRjYXIwCisJYWRkCSR0bXAwLCRjYXIwLCRjYXIwCisJYW5kCSRjYXIwLCRtYXNrLCRhY2MwCisJYWRkCSR0bXAxLCRjYXIxLCRjYXIxCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cCs0XQkJISB0cFtqLTFdCisJc3JseAkkY2FyMCwzMiwkY2FyMAorCWFkZAkkaSw0LCRpCQkJISBpKysKKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisKKwlhZGQJJGNhcjAsJGNhcjEsJGNhcjEKKwljbXAJJGksJG51bQorCWFkZAkkY2FyMiwkY2FyMSwkY2FyMQorCXN0CSRjYXIxLFskdHArOF0KKworCXNybHgJJGNhcjEsMzIsJGNhcjIKKwlibCxhCSVpY2MsLkxvdXRlcgorCWxkCVskYnArJGldLCRtdWwwCQkhIGJwW2ldCishLkxvdXRlcgorCisJYWRkCSR0cCwxMiwkdHAKKwwKKy5MdGFpbDoKKwlhZGQJJG5wLCRudW0sJG5wCisJYWRkCSRycCwkbnVtLCRycAorCW1vdgkkdHAsJGFwCisJc3ViCSVnMCwkbnVtLCVvNwkJISBrPS1udW0KKwliYQkuTHN1YgorCXN1YmNjCSVnMCwlZzAsJWcwCQkhIGNsZWFyICVpY2MuYworLmFsaWduCTE2CisuTHN1YjoKKwlsZAlbJHRwKyVvN10sJW8wCisJbGQJWyRucCslbzddLCVvMQorCXN1YmNjYwklbzAsJW8xLCVvMQkJISB0cFtqXS1ucFtqXQorCWFkZAkkcnAsJW83LCRpCisJYWRkCSVvNyw0LCVvNworCWJybnoJJW83LC5Mc3ViCisJc3QJJW8xLFskaV0KKwlzdWJjCSRjYXIyLDAsJGNhcjIJCSEgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwlhbmQJJHRwLCRjYXIyLCRhcAorCWFuZG4JJHJwLCRjYXIyLCRucAorCW9yCSRhcCwkbnAsJGFwCisJc3ViCSVnMCwkbnVtLCVvNworCisuTGNvcHk6CisJbGQJWyRhcCslbzddLCVvMAkJISBjb3B5IG9yIGluLXBsYWNlIHJlZnJlc2gKKwlzdAklZzAsWyR0cCslbzddCQkhIHphcCB0cAorCXN0CSVvMCxbJHJwKyVvN10KKwlhZGQJJW83LDQsJW83CisJYnJuegklbzcsLkxjb3B5CisJbm9wCisJbW92CTEsJWkwCisJcmV0CisJcmVzdG9yZQorX19fCisMCisjIyMjIyMjIworIyMjIyMjIyMgLkxibl9zcXJfbW9udCBnaXZlcyB1cCB0byAyMCUgKm92ZXJhbGwqIGltcHJvdmVtZW50IG92ZXIKKyMjIyMjIyMjIGNvZGUgd2l0aG91dCBmb2xsb3dpbmcgZGVkaWNhdGVkIHNxdWFyaW5nIHByb2NlZHVyZS4KKyMjIyMjIyMjCiskc2JpdD0iJWkyIjsJCSMgcmUtdXNlICRicCEKKworJGNvZGUuPTw8X19fOworLmFsaWduCTMyCisuTGJuX3Nxcl9tb250OgorCW11bHgJJG11bDAsJG11bDAsJGNhcjAJCSEgYXBbMF0qYXBbMF0KKwltdWx4CSRhcGosJG11bDAsJHRtcDAJCSFwcm9sb2d1ZSEKKwlhbmQJJGNhcjAsJG1hc2ssJGFjYzAKKwlhZGQJJXNwLCRiaWFzKyRmcmFtZSwkdHAKKwlsZAlbJGFwKzhdLCRhcGoJCQkhcHJvbG9ndWUhCisKKwltdWx4CSRuMCwkYWNjMCwkbXVsMQkJCSEgInRbMF0iKm4wCisJc3JseAkkY2FyMCwzMiwkY2FyMAorCWFuZAkkbXVsMSwkbWFzaywkbXVsMQorCisJbXVseAkkY2FyMSwkbXVsMSwkY2FyMQkJISBucFswXSoidFswXSIqbjAKKwltdWx4CSRucGosJG11bDEsJGFjYzEJCSFwcm9sb2d1ZSEKKwlhbmQJJGNhcjAsMSwkc2JpdAorCWxkCVskbnArOF0sJG5wagkJCSFwcm9sb2d1ZSEKKwlzcmx4CSRjYXIwLDEsJGNhcjAKKwlhZGQJJGFjYzAsJGNhcjEsJGNhcjEKKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisJbW92CSR0bXAwLCRhY2MwCQkJIXByb2xvZ3VlIQorCisuTHNxcl8xc3Q6CisJbXVseAkkYXBqLCRtdWwwLCR0bXAwCisJbXVseAkkbnBqLCRtdWwxLCR0bXAxCisJYWRkCSRhY2MwLCRjYXIwLCRjYXIwCQkhIGFwW2pdKmEwK2MwCisJYWRkCSRhY2MxLCRjYXIxLCRjYXIxCisJbGQJWyRhcCskal0sJGFwagkJCSEgYXBbal0KKwlhbmQJJGNhcjAsJG1hc2ssJGFjYzAKKwlsZAlbJG5wKyRqXSwkbnBqCQkJISBucFtqXQorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJGFjYzAsJGFjYzAsJGFjYzAKKwlvcgkkc2JpdCwkYWNjMCwkYWNjMAorCW1vdgkkdG1wMSwkYWNjMQorCXNybHgJJGFjYzAsMzIsJHNiaXQKKwlhZGQJJGosNCwkagkJCQkhIGorKworCWFuZAkkYWNjMCwkbWFzaywkYWNjMAorCWNtcAkkaiwkbnVtCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cF0KKwltb3YJJHRtcDAsJGFjYzAKKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisJYmwJJWljYywuTHNxcl8xc3QKKwlhZGQJJHRwLDQsJHRwCQkJISB0cCsrCishLkxzcXJfMXN0CisKKwltdWx4CSRhcGosJG11bDAsJHRtcDAJCSEgZXBpbG9ndWUKKwltdWx4CSRucGosJG11bDEsJHRtcDEKKwlhZGQJJGFjYzAsJGNhcjAsJGNhcjAJCSEgYXBbal0qYTArYzAKKwlhZGQJJGFjYzEsJGNhcjEsJGNhcjEKKwlhbmQJJGNhcjAsJG1hc2ssJGFjYzAKKwlzcmx4CSRjYXIwLDMyLCRjYXIwCisJYWRkCSRhY2MwLCRhY2MwLCRhY2MwCisJb3IJJHNiaXQsJGFjYzAsJGFjYzAKKwlzcmx4CSRhY2MwLDMyLCRzYml0CisJYW5kCSRhY2MwLCRtYXNrLCRhY2MwCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cF0KKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisKKwlhZGQJJHRtcDAsJGNhcjAsJGNhcjAJCSEgYXBbal0qYTArYzAKKwlhZGQJJHRtcDEsJGNhcjEsJGNhcjEKKwlhbmQJJGNhcjAsJG1hc2ssJGFjYzAKKwlzcmx4CSRjYXIwLDMyLCRjYXIwCisJYWRkCSRhY2MwLCRhY2MwLCRhY2MwCisJb3IJJHNiaXQsJGFjYzAsJGFjYzAKKwlzcmx4CSRhY2MwLDMyLCRzYml0CisJYW5kCSRhY2MwLCRtYXNrLCRhY2MwCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cCs0XQorCXNybHgJJGNhcjEsMzIsJGNhcjEKKworCWFkZAkkY2FyMCwkY2FyMCwkY2FyMAorCW9yCSRzYml0LCRjYXIwLCRjYXIwCisJYWRkCSRjYXIwLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cCs4XQorCXNybHgJJGNhcjEsMzIsJGNhcjIKKwwKKwlsZAlbJXNwKyRiaWFzKyRmcmFtZV0sJHRtcDAJISB0cFswXQorCWxkCVslc3ArJGJpYXMrJGZyYW1lKzRdLCR0bXAxCSEgdHBbMV0KKwlsZAlbJXNwKyRiaWFzKyRmcmFtZSs4XSwkdHBqCSEgdHBbMl0KKwlsZAlbJGFwKzRdLCRtdWwwCQkJISBhcFsxXQorCWxkCVskYXArOF0sJGFwagkJCSEgYXBbMl0KKwlsZAlbJG5wXSwkY2FyMQkJCSEgbnBbMF0KKwlsZAlbJG5wKzRdLCRucGoJCQkhIG5wWzFdCisJbXVseAkkbjAsJHRtcDAsJG11bDEKKworCW11bHgJJG11bDAsJG11bDAsJGNhcjAKKwlhbmQJJG11bDEsJG1hc2ssJG11bDEKKworCW11bHgJJGNhcjEsJG11bDEsJGNhcjEKKwltdWx4CSRucGosJG11bDEsJGFjYzEKKwlhZGQJJHRtcDAsJGNhcjEsJGNhcjEKKwlhbmQJJGNhcjAsJG1hc2ssJGFjYzAKKwlsZAlbJG5wKzhdLCRucGoJCQkhIG5wWzJdCisJc3JseAkkY2FyMSwzMiwkY2FyMQorCWFkZAkkdG1wMSwkY2FyMSwkY2FyMQorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJGFjYzAsJGNhcjEsJGNhcjEKKwlhbmQJJGNhcjAsMSwkc2JpdAorCWFkZAkkYWNjMSwkY2FyMSwkY2FyMQorCXNybHgJJGNhcjAsMSwkY2FyMAorCW1vdgkxMiwkagorCXN0CSRjYXIxLFslc3ArJGJpYXMrJGZyYW1lXQkhIHRwWzBdPQorCXNybHgJJGNhcjEsMzIsJGNhcjEKKwlhZGQJJXNwLCRiaWFzKyRmcmFtZSs0LCR0cAorCisuTHNxcl8ybmQ6CisJbXVseAkkYXBqLCRtdWwwLCRhY2MwCisJbXVseAkkbnBqLCRtdWwxLCRhY2MxCisJYWRkCSRhY2MwLCRjYXIwLCRjYXIwCisJYWRkCSR0cGosJGNhcjEsJGNhcjEKKwlsZAlbJGFwKyRqXSwkYXBqCQkJISBhcFtqXQorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCWxkCVskbnArJGpdLCRucGoJCQkhIG5wW2pdCisJc3JseAkkY2FyMCwzMiwkY2FyMAorCWFkZAkkYWNjMSwkY2FyMSwkY2FyMQorCWxkCVskdHArOF0sJHRwagkJCSEgdHBbal0KKwlhZGQJJGFjYzAsJGFjYzAsJGFjYzAKKwlhZGQJJGosNCwkagkJCQkhIGorKworCW9yCSRzYml0LCRhY2MwLCRhY2MwCisJc3JseAkkYWNjMCwzMiwkc2JpdAorCWFuZAkkYWNjMCwkbWFzaywkYWNjMAorCWNtcAkkaiwkbnVtCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cF0JCQkhIHRwW2otMV0KKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisJYmwJJWljYywuTHNxcl8ybmQKKwlhZGQJJHRwLDQsJHRwCQkJISB0cCsrCishLkxzcXJfMm5kCisKKwltdWx4CSRhcGosJG11bDAsJGFjYzAKKwltdWx4CSRucGosJG11bDEsJGFjYzEKKwlhZGQJJGFjYzAsJGNhcjAsJGNhcjAKKwlhZGQJJHRwaiwkY2FyMSwkY2FyMQorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJGFjYzEsJGNhcjEsJGNhcjEKKwlhZGQJJGFjYzAsJGFjYzAsJGFjYzAKKwlvcgkkc2JpdCwkYWNjMCwkYWNjMAorCXNybHgJJGFjYzAsMzIsJHNiaXQKKwlhbmQJJGFjYzAsJG1hc2ssJGFjYzAKKwlhZGQJJGFjYzAsJGNhcjEsJGNhcjEKKwlzdAkkY2FyMSxbJHRwXQkJCSEgdHBbai0xXQorCXNybHgJJGNhcjEsMzIsJGNhcjEKKworCWFkZAkkY2FyMCwkY2FyMCwkY2FyMAorCW9yCSRzYml0LCRjYXIwLCRjYXIwCisJYWRkCSRjYXIwLCRjYXIxLCRjYXIxCisJYWRkCSRjYXIyLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cCs0XQorCXNybHgJJGNhcjEsMzIsJGNhcjIKKwwKKwlsZAlbJXNwKyRiaWFzKyRmcmFtZV0sJHRtcDEJISB0cFswXQorCWxkCVslc3ArJGJpYXMrJGZyYW1lKzRdLCR0cGoJISB0cFsxXQorCWxkCVskYXArOF0sJG11bDAJCQkhIGFwWzJdCisJbGQJWyRucF0sJGNhcjEJCQkhIG5wWzBdCisJbGQJWyRucCs0XSwkbnBqCQkJISBucFsxXQorCW11bHgJJG4wLCR0bXAxLCRtdWwxCisJYW5kCSRtdWwxLCRtYXNrLCRtdWwxCisJbW92CTgsJGkKKworCW11bHgJJG11bDAsJG11bDAsJGNhcjAKKwltdWx4CSRjYXIxLCRtdWwxLCRjYXIxCisJYW5kCSRjYXIwLCRtYXNrLCRhY2MwCisJYWRkCSR0bXAxLCRjYXIxLCRjYXIxCisJc3JseAkkY2FyMCwzMiwkY2FyMAorCWFkZAklc3AsJGJpYXMrJGZyYW1lLCR0cAorCXNybHgJJGNhcjEsMzIsJGNhcjEKKwlhbmQJJGNhcjAsMSwkc2JpdAorCXNybHgJJGNhcjAsMSwkY2FyMAorCW1vdgk0LCRqCisKKy5Mc3FyX291dGVyOgorLkxzcXJfaW5uZXIxOgorCW11bHgJJG5waiwkbXVsMSwkYWNjMQorCWFkZAkkdHBqLCRjYXIxLCRjYXIxCisJYWRkCSRqLDQsJGoKKwlsZAlbJHRwKzhdLCR0cGoKKwljbXAJJGosJGkKKwlhZGQJJGFjYzEsJGNhcjEsJGNhcjEKKwlsZAlbJG5wKyRqXSwkbnBqCisJc3QJJGNhcjEsWyR0cF0KKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisJYmwJJWljYywuTHNxcl9pbm5lcjEKKwlhZGQJJHRwLDQsJHRwCishLkxzcXJfaW5uZXIxCisKKwlhZGQJJGosNCwkagorCWxkCVskYXArJGpdLCRhcGoJCQkhIGFwW2pdCisJbXVseAkkbnBqLCRtdWwxLCRhY2MxCisJYWRkCSR0cGosJGNhcjEsJGNhcjEKKwlsZAlbJG5wKyRqXSwkbnBqCQkJISBucFtqXQorCWFkZAkkYWNjMCwkY2FyMSwkY2FyMQorCWxkCVskdHArOF0sJHRwagkJCSEgdHBbal0KKwlhZGQJJGFjYzEsJGNhcjEsJGNhcjEKKwlzdAkkY2FyMSxbJHRwXQorCXNybHgJJGNhcjEsMzIsJGNhcjEKKworCWFkZAkkaiw0LCRqCisJY21wCSRqLCRudW0KKwliZSxwbgklaWNjLC5Mc3FyX25vX2lubmVyMgorCWFkZAkkdHAsNCwkdHAKKworLkxzcXJfaW5uZXIyOgorCW11bHgJJGFwaiwkbXVsMCwkYWNjMAorCW11bHgJJG5waiwkbXVsMSwkYWNjMQorCWFkZAkkdHBqLCRjYXIxLCRjYXIxCisJYWRkCSRhY2MwLCRjYXIwLCRjYXIwCisJbGQJWyRhcCskal0sJGFwagkJCSEgYXBbal0KKwlhbmQJJGNhcjAsJG1hc2ssJGFjYzAKKwlsZAlbJG5wKyRqXSwkbnBqCQkJISBucFtqXQorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJGFjYzAsJGFjYzAsJGFjYzAKKwlsZAlbJHRwKzhdLCR0cGoJCQkhIHRwW2pdCisJb3IJJHNiaXQsJGFjYzAsJGFjYzAKKwlhZGQJJGosNCwkagkJCQkhIGorKworCXNybHgJJGFjYzAsMzIsJHNiaXQKKwlhbmQJJGFjYzAsJG1hc2ssJGFjYzAKKwljbXAJJGosJG51bQorCWFkZAkkYWNjMCwkY2FyMSwkY2FyMQorCWFkZAkkYWNjMSwkY2FyMSwkY2FyMQorCXN0CSRjYXIxLFskdHBdCQkJISB0cFtqLTFdCisJc3JseAkkY2FyMSwzMiwkY2FyMQorCWJsCSVpY2MsLkxzcXJfaW5uZXIyCisJYWRkCSR0cCw0LCR0cAkJCSEgdHArKworCisuTHNxcl9ub19pbm5lcjI6CisJbXVseAkkYXBqLCRtdWwwLCRhY2MwCisJbXVseAkkbnBqLCRtdWwxLCRhY2MxCisJYWRkCSR0cGosJGNhcjEsJGNhcjEKKwlhZGQJJGFjYzAsJGNhcjAsJGNhcjAKKwlhbmQJJGNhcjAsJG1hc2ssJGFjYzAKKwlzcmx4CSRjYXIwLDMyLCRjYXIwCisJYWRkCSRhY2MwLCRhY2MwLCRhY2MwCisJb3IJJHNiaXQsJGFjYzAsJGFjYzAKKwlzcmx4CSRhY2MwLDMyLCRzYml0CisJYW5kCSRhY2MwLCRtYXNrLCRhY2MwCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJYWRkCSRhY2MxLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cF0JCQkhIHRwW2otMV0KKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisKKwlhZGQJJGNhcjAsJGNhcjAsJGNhcjAKKwlvcgkkc2JpdCwkY2FyMCwkY2FyMAorCWFkZAkkY2FyMCwkY2FyMSwkY2FyMQorCWFkZAkkY2FyMiwkY2FyMSwkY2FyMQorCXN0CSRjYXIxLFskdHArNF0KKwlzcmx4CSRjYXIxLDMyLCRjYXIyCisMCisJYWRkCSRpLDQsJGkJCQkJISBpKysKKwlsZAlbJXNwKyRiaWFzKyRmcmFtZV0sJHRtcDEJISB0cFswXQorCWxkCVslc3ArJGJpYXMrJGZyYW1lKzRdLCR0cGoJISB0cFsxXQorCWxkCVskYXArJGldLCRtdWwwCQkJISBhcFtqXQorCWxkCVskbnBdLCRjYXIxCQkJISBucFswXQorCWxkCVskbnArNF0sJG5wagkJCSEgbnBbMV0KKwltdWx4CSRuMCwkdG1wMSwkbXVsMQorCWFuZAkkbXVsMSwkbWFzaywkbXVsMQorCWFkZAkkaSw0LCR0bXAwCisKKwltdWx4CSRtdWwwLCRtdWwwLCRjYXIwCisJbXVseAkkY2FyMSwkbXVsMSwkY2FyMQorCWFuZAkkY2FyMCwkbWFzaywkYWNjMAorCWFkZAkkdG1wMSwkY2FyMSwkY2FyMQorCXNybHgJJGNhcjAsMzIsJGNhcjAKKwlhZGQJJXNwLCRiaWFzKyRmcmFtZSwkdHAKKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisJYW5kCSRjYXIwLDEsJHNiaXQKKwlzcmx4CSRjYXIwLDEsJGNhcjAKKworCWNtcAkkdG1wMCwkbnVtCQkJISBpPG51bS0xCisJYmwJJWljYywuTHNxcl9vdXRlcgorCW1vdgk0LCRqCisMCisuTHNxcl9sYXN0OgorCW11bHgJJG5waiwkbXVsMSwkYWNjMQorCWFkZAkkdHBqLCRjYXIxLCRjYXIxCisJYWRkCSRqLDQsJGoKKwlsZAlbJHRwKzhdLCR0cGoKKwljbXAJJGosJGkKKwlhZGQJJGFjYzEsJGNhcjEsJGNhcjEKKwlsZAlbJG5wKyRqXSwkbnBqCisJc3QJJGNhcjEsWyR0cF0KKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisJYmwJJWljYywuTHNxcl9sYXN0CisJYWRkCSR0cCw0LCR0cAorIS5Mc3FyX2xhc3QKKworCW11bHgJJG5waiwkbXVsMSwkYWNjMQorCWFkZAkkdHBqLCRjYXIxLCRjYXIxCisJYWRkCSRhY2MwLCRjYXIxLCRjYXIxCisJYWRkCSRhY2MxLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cF0KKwlzcmx4CSRjYXIxLDMyLCRjYXIxCisKKwlhZGQJJGNhcjAsJGNhcjAsJGNhcjAJCSEgcmVjb3ZlciAkY2FyMAorCW9yCSRzYml0LCRjYXIwLCRjYXIwCisJYWRkCSRjYXIwLCRjYXIxLCRjYXIxCisJYWRkCSRjYXIyLCRjYXIxLCRjYXIxCisJc3QJJGNhcjEsWyR0cCs0XQorCXNybHgJJGNhcjEsMzIsJGNhcjIKKworCWJhCS5MdGFpbAorCWFkZAkkdHAsOCwkdHAKKy50eXBlCSRmbmFtZSwjZnVuY3Rpb24KKy5zaXplCSRmbmFtZSwoLi0kZm5hbWUpCisuYXNjaXoJIk1vbnRnb21lcnkgTXVsdGlwbHRpY2F0aW9uIGZvciBTUEFSQ3Y5LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorLmFsaWduCTMyCitfX18KKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwoJDEpL2dlbTsKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9zcGFyY3Y5YS1tb250LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS9zcGFyY3Y5YS1tb250LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDIwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3NwYXJjdjlhLW1vbnQucGwKQEAgLTAsMCArMSw4ODIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBPY3RvYmVyIDIwMDUKKyMKKyMgIlRlYXNlciIgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBtb2R1bGUgZm9yIFVsdHJhU1BBUkMuIFdoeSBGUFU/CisjIEJlY2F1c2UgdW5saWtlIGludGVnZXIgbXVsdGlwbGllciwgd2hpY2ggc2ltcGx5IHN0YWxscyB3aG9sZSBDUFUsCisjIEZQVSBpcyBmdWxseSBwaXBlbGluZWQgYW5kIGNhbiBlZmZlY3RpdmVseSBlbWl0IDQ4IGJpdCBwYXJ0aWFsCisjIHByb2R1Y3QgZXZlcnkgY3ljbGUuIFdoeSBub3QgYmxlbmRlZCBTUEFSQyB2OT8gT25lIGNhbiBhcmd1ZSB0aGF0CisjIG1ha2luZyB0aGlzIG1vZHVsZSBkZXBlbmRlbnQgb24gVWx0cmFTUEFSQyBWSVMgZXh0ZW5zaW9uIGxpbWl0cyBpdHMKKyMgYmluYXJ5IGNvbXBhdGliaWxpdHkuIFdlbGwgeWVzLCBpdCBkb2VzIGV4Y2x1ZGUgU1BBUkM2NCBwcmlvci1WKCEpCisjIGltcGxlbWVudGF0aW9ucyBmcm9tIGNvbXBhdGliaWxpdHkgbWF0cml4LiBCdXQgdGhlIHJlc3QsIHdob2xlIFN1bgorIyBVbHRyYVNQQVJDIGZhbWlseSBhbmQgYnJhbmQgbmV3IEZ1aml0c3UncyBTUEFSQzY0IFYsIGFsbCBzdXBwb3J0CisjIFZJUyBleHRlbnNpb24gaW5zdHJ1Y3Rpb25zIHVzZWQgaW4gdGhpcyBtb2R1bGUuIFRoaXMgaXMgY29uc2lkZXJlZAorIyBnb29kIGVub3VnaCB0byBub3QgY2FyZSBhYm91dCBIQUwgU1BBUkM2NCB1c2VycyBbaWYgYW55XSB3aG8gaGF2ZQorIyBpbnRlZ2VyLW9ubHkgcHVyZSBTUEFSQ3Y5IG1vZHVsZSB0byAiZmFsbCBkb3duIiB0by4KKworIyBVU0kmSUkgY29yZXMgY3VycmVudGx5IGV4aGliaXQgdW5pZm9ybSAyeCBpbXByb3ZlbWVudCBbb3ZlciBwcmUtCisjIGJuX211bF9tb250IGNvZGViYXNlXSBmb3IgYWxsIGtleSBsZW5ndGhzIGFuZCBiZW5jaG1hcmtzLiBPbiBVU0lJSQorIyBwZXJmb3JtYW5jZSBpbXByb3ZlcyBmZXcgcGVyY2VudHMgZm9yIHNob3J0ZXIga2V5cyBhbmQgd29yc2VucyBmZXcKKyMgcGVyY2VudHMgZm9yIGxvbmdlciBrZXlzLiBUaGlzIGlzIGJlY2F1c2UgVVNJSUkgaW50ZWdlciBtdWx0aXBsaWVyCisjIGlzID4zeCBmYXN0ZXIgdGhhbiBVU0kmSUkgb25lLCB3aGljaCBpcyBoYXJkZXIgdG8gbWF0Y2ggW2J1dCBzZWUKKyMgVE9ETyBsaXN0IGJlbG93XS4gSXQgc2hvdWxkIGFsc28gYmUgbm90ZWQgdGhhdCBTUEFSQzY0IFYgZmVhdHVyZXMKKyMgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbiwgd2hpY2ggKm1pZ2h0KiBtZWFuIHRoYXQgaW50ZWdlciBtdWx0aXBsaWVyCisjIGlzIHBpcGVsaW5lZCwgd2hpY2ggaW4gdHVybiAqbWlnaHQqIGJlIGltcG9zc2libGUgdG8gbWF0Y2guLi4gT24KKyMgYWRkaXRpb25hbCBub3RlLCBTUEFSQzY0IFYgaW1wbGVtZW50cyBGUCBNdWx0aXBseS1BZGQgaW5zdHJ1Y3Rpb24sCisjIHdoaWNoIGlzIHBlcmZlY3RseSB1c2FibGUgaW4gdGhpcyBjb250ZXh0Li4uIEluIG90aGVyIHdvcmRzLCBhcyBmYXIKKyMgYXMgRnVqaXRzdSBTUEFSQzY0IFYgZ29lcywgdGFsayB0byB0aGUgYXV0aG9yOi0pCisKKyMgVGhlIGltcGxlbWVudGF0aW9uIGltcGxpZXMgZm9sbG93aW5nICJub24tbmF0dXJhbCIgbGltaXRhdGlvbnMgb24KKyMgaW5wdXQgYXJndW1lbnRzOgorIyAtIG51bSBtYXkgbm90IGJlIGxlc3MgdGhhbiA0OworIyAtIG51bSBoYXMgdG8gYmUgZXZlbjsKKyMgRmFpbHVyZSB0byBtZWV0IGVpdGhlciBjb25kaXRpb24gaGFzIG5vIGZhdGFsIGVmZmVjdHMsIHNpbXBseQorIyBkb2Vzbid0IGdpdmUgYW55IHBlcmZvcm1hbmNlIGdhaW4uCisKKyMgVE9ETzoKKyMgLSBtb2R1bG8tc2NoZWR1bGUgaW5uZXIgbG9vcCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIChvbiBpbi1vcmRlcgorIyAgIGV4ZWN1dGlvbiBjb3JlIHN1Y2ggYXMgVWx0cmFTUEFSQyB0aGlzIHNoYWxsIHJlc3VsdCBpbiBmdXJ0aGVyCisjICAgbm90aWNlYWJsZSghKSBpbXByb3ZlbWVudCk7CisjIC0gZGVkaWNhdGVkIHNxdWFyaW5nIHByb2NlZHVyZVs/XTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOb3ZlbWJlciAyMDA2CisjCisjIE1vZHVsby1zY2hlZHVsZWQgaW5uZXIgbG9vcHMgYWxsb3cgdG8gaW50ZXJsZWF2ZSBmbG9hdGluZyBwb2ludCBhbmQKKyMgaW50ZWdlciBpbnN0cnVjdGlvbnMgYW5kIG1pbmltaXplIFJlYWQtQWZ0ZXItV3JpdGUgcGVuYWx0aWVzLiBUaGlzCisjIHJlc3VsdHMgaW4gKmZ1cnRoZXIqIDIwLTUwJSBwZXJmcm9tYW5jZSBpbXByb3ZlbWVudCBbZGVwZW5kaW5nIG9uCisjIGtleSBsZW5ndGgsIG1vcmUgZm9yIGxvbmdlciBrZXlzXSBvbiBVU0kmSUkgY29yZXMgYW5kIDMwLTgwJSAtIG9uCisjIFVTSUlJJklWLgorCiskZm5hbWU9ImJuX211bF9tb250X2ZwdSI7CiskYml0cz0zMjsKK2ZvciAoQEFSR1YpIHsgJGJpdHM9NjQgaWYgKC9cLW02NC8gfHwgL1wteGFyY2hcPXY5Lyk7IH0KKworaWYgKCRiaXRzPT02NCkgeworCSRiaWFzPTIwNDc7CisJJGZyYW1lPTE5MjsKK30gZWxzZSB7CisJJGJpYXM9MDsKKwkkZnJhbWU9MTI4OwkjIDk2IHJvdW5kZWQgdXAgdG8gbGFyZ2VzdCBrbm93biBjYWNoZS1saW5lCit9CiskbG9jYWxzPTY0OworCisjIEluIG9yZGVyIHRvIHByb3ZpZGUgZm9yIDMyLS82NC1iaXQgQUJJIGR1YWxpdHksIEkga2VlcCBpbnRlZ2VycyB3aWRlcgorIyB0aGFuIDMyIGJpdCBpbiAlZzEtJWc0IGFuZCAlbzAtJW81LiAlbDAtJWw3IGFuZCAlaTAtJWk1IGFyZSB1c2VkCisjIGV4Y2x1c2l2ZWx5IGZvciBwb2ludGVycywgaW5kZXhlcyBhbmQgb3RoZXIgc21hbGwgdmFsdWVzLi4uCisjIGludCBibl9tdWxfbW9udCgKKyRycD0iJWkwIjsJIyBCTl9VTE9ORyAqcnAsCiskYXA9IiVpMSI7CSMgY29uc3QgQk5fVUxPTkcgKmFwLAorJGJwPSIlaTIiOwkjIGNvbnN0IEJOX1VMT05HICpicCwKKyRucD0iJWkzIjsJIyBjb25zdCBCTl9VTE9ORyAqbnAsCiskbjA9IiVpNCI7CSMgY29uc3QgQk5fVUxPTkcgKm4wLAorJG51bT0iJWk1IjsJIyBpbnQgbnVtKTsKKworJHRwPSIlbDAiOwkjIHRbbnVtXQorJGFwX2w9IiVsMSI7CSMgYVtudW1dLG5bbnVtXSBhcmUgc21hc2hlZCB0byAzMi1iaXQgd29yZHMgYW5kIHNhdmVkCiskYXBfaD0iJWwyIjsJIyB0byB0aGVzZSBmb3VyIHZlY3RvcnMgYXMgZG91YmxlLXByZWNpc2lvbiBGUCB2YWx1ZXMuCiskbnBfbD0iJWwzIjsJIyBUaGlzIHdheSBhIGJ1bmNoIG9mIGZ4dG9kcyBhcmUgZWxpbWluYXRlZCBpbiBzZWNvbmQKKyRucF9oPSIlbDQiOwkjIGxvb3AgYW5kIEwxLWNhY2hlIGFsaWFzaW5nIGlzIG1pbmltaXplZC4uLgorJGk9IiVsNSI7Ciskaj0iJWw2IjsKKyRtYXNrPSIlbDciOwkjIDE2LWJpdCBtYXNrLCAweGZmZmYKKworJG4wPSIlZzQiOwkjIHJlYXNzaWduZWQoISkgdG8gIjY0LWJpdCIgcmVnaXN0ZXIKKyRjYXJyeT0iJWk0IjsJIyAlaTQgcmV1c2VkKCEpIGZvciBhIGNhcnJ5IGJpdAorCisjIEZQIHJlZ2lzdGVyIG5hbWluZyBjaGFydAorIworIyAgICAgLi5ISUxPCisjICAgICAgIGRjYmEKKyMgICAtLS0tLS0tLQorIyAgICAgICAgTE9hCisjICAgICAgIExPYgorIyAgICAgIExPYworIyAgICAgTE9kCisjICAgICAgSElhCisjICAgICBISWIKKyMgICAgSEljCisjICAgSElkCisjICAgIC4uYQorIyAgIC4uYgorJGJhPSIlZjAiOyAgICAkYmI9IiVmMiI7ICAgICRiYz0iJWY0IjsgICAgJGJkPSIlZjYiOworJG5hPSIlZjgiOyAgICAkbmI9IiVmMTAiOyAgICRuYz0iJWYxMiI7ICAgJG5kPSIlZjE0IjsKKyRhbG89IiVmMTYiOyAgJGFsb189IiVmMTciOyAkYWhpPSIlZjE4IjsgICRhaGlfPSIlZjE5IjsKKyRubG89IiVmMjAiOyAgJG5sb189IiVmMjEiOyAkbmhpPSIlZjIyIjsgICRuaGlfPSIlZjIzIjsKKworJGRvdGE9IiVmMjQiOyAkZG90Yj0iJWYyNiI7CisKKyRhbG9hPSIlZjMyIjsgJGFsb2I9IiVmMzQiOyAkYWxvYz0iJWYzNiI7ICRhbG9kPSIlZjM4IjsKKyRhaGlhPSIlZjQwIjsgJGFoaWI9IiVmNDIiOyAkYWhpYz0iJWY0NCI7ICRhaGlkPSIlZjQ2IjsKKyRubG9hPSIlZjQ4IjsgJG5sb2I9IiVmNTAiOyAkbmxvYz0iJWY1MiI7ICRubG9kPSIlZjU0IjsKKyRuaGlhPSIlZjU2IjsgJG5oaWI9IiVmNTgiOyAkbmhpYz0iJWY2MCI7ICRuaGlkPSIlZjYyIjsKKworJEFTSV9GTDE2X1A9MHhEMjsJIyBtYWdpYyBBU0kgdmFsdWUgdG8gZW5nYWdlIDE2LWJpdCBGUCBsb2FkCisKKyRjb2RlPTw8X19fOworLnNlY3Rpb24JIi50ZXh0IiwjYWxsb2MsI2V4ZWNpbnN0cgorCisuZ2xvYmFsICRmbmFtZQorLmFsaWduICAzMgorJGZuYW1lOgorCXNhdmUJJXNwLC0kZnJhbWUtJGxvY2Fscywlc3AKKworCWNtcAkkbnVtLDQKKwlibCxhLHBuICVpY2MsLkxyZXQKKwljbHIJJWkwCisJYW5kY2MJJG51bSwxLCVnMAkJISAkbnVtIGhhcyB0byBiZSBldmVuLi4uCisJYm56LGEscG4gJWljYywuTHJldAorCWNscgklaTAJCQkhIHNpZ25hbCAidW5zdXBwb3J0ZWQgaW5wdXQgdmFsdWUiCisKKwlzcmwJJG51bSwxLCRudW0KKwlzZXRoaQklaGkoMHhmZmZmKSwkbWFzaworCWxkCVslaTQrMF0sJG4wCQkhICRuMCByZWFzc2lnbmVkLCByZW1lbWJlcj8KKwlvcgkkbWFzaywlbG8oMHhmZmZmKSwkbWFzaworCWxkCVslaTQrNF0sJW8wCisJc2xseAklbzAsMzIsJW8wCisJb3IJJW8wLCRuMCwkbjAJCSEgJG4wPW4wWzFdLm4wWzBdCisKKwlzbGwJJG51bSwzLCRudW0JCSEgbnVtKj04CisKKwlhZGQJJXNwLCRiaWFzLCVvMAkJISByZWFsIHRvcCBvZiBzdGFjaworCXNsbAkkbnVtLDIsJW8xCisJYWRkCSVvMSwkbnVtLCVvMQkJISAlbzE9bnVtKjUKKwlzdWIJJW8wLCVvMSwlbzAKKwlhbmQJJW8wLC0yMDQ4LCVvMAkJISBvcHRpbWl6ZSBUTEIgdXRpbGl6YXRpb24KKwlzdWIJJW8wLCRiaWFzLCVzcAkJISBhbGxvY2EoNSpudW0qOCkKKworCXJkCSVhc2ksJW83CQkhIHNhdmUgJWFzaQorCWFkZAklc3AsJGJpYXMrJGZyYW1lKyRsb2NhbHMsJHRwCisJYWRkCSR0cCwkbnVtLCRhcF9sCisJYWRkCSRhcF9sLCRudW0sJGFwX2wJISBbYW5dcF9bbGhdIHBvaW50IGF0IHRoZSB2ZWN0b3JzJyBlbmRzICEKKwlhZGQJJGFwX2wsJG51bSwkYXBfaAorCWFkZAkkYXBfaCwkbnVtLCRucF9sCisJYWRkCSRucF9sLCRudW0sJG5wX2gKKworCXdyCSVnMCwkQVNJX0ZMMTZfUCwlYXNpCSEgc2V0dXAgJWFzaSBmb3IgMTYtYml0IEZQIGxvYWRzCisKKwlhZGQJJHJwLCRudW0sJHJwCQkhIHJlYWRqdXN0IGlucHV0IHBvaW50ZXJzIHRvIHBvaW50CisJYWRkCSRhcCwkbnVtLCRhcAkJISBhdCB0aGUgZW5kcyB0b28uLi4KKwlhZGQJJGJwLCRudW0sJGJwCisJYWRkCSRucCwkbnVtLCRucAorCisJc3R4CSVvNyxbJXNwKyRiaWFzKyRmcmFtZSs0OF0JISBzYXZlICVhc2kKKwwKKwlzdWIJJWcwLCRudW0sJGkJCSEgaT0tbnVtCisJc3ViCSVnMCwkbnVtLCRqCQkhIGo9LW51bQorCisJYWRkCSRhcCwkaiwlbzMKKwlhZGQJJGJwLCRpLCVvNAorCisJbGQJWyVvMys0XSwlZzEJCSEgYnBbMF0KKwlsZAlbJW8zKzBdLCVvMAorCWxkCVslbzQrNF0sJWc1CQkhIGFwWzBdCisJc2xseAklZzEsMzIsJWcxCisJbGQJWyVvNCswXSwlbzEKKwlzbGx4CSVnNSwzMiwlZzUKKwlvcgklZzEsJW8wLCVvMAorCW9yCSVnNSwlbzEsJW8xCisKKwlhZGQJJG5wLCRqLCVvNQorCisJbXVseAklbzEsJW8wLCVvMAkJISBhcFswXSpicFswXQorCW11bHgJJG4wLCVvMCwlbzAJCSEgYXBbMF0qYnBbMF0qbjAKKwlzdHgJJW8wLFslc3ArJGJpYXMrJGZyYW1lKzBdCisKKwlsZAlbJW8zKzBdLCRhbG9fCSEgbG9hZCBhW2pdIGFzIHBhaXIgb2YgMzItYml0IHdvcmRzCisJZnplcm9zCSRhbG8KKwlsZAlbJW8zKzRdLCRhaGlfCisJZnplcm9zCSRhaGkKKwlsZAlbJW81KzBdLCRubG9fCSEgbG9hZCBuW2pdIGFzIHBhaXIgb2YgMzItYml0IHdvcmRzCisJZnplcm9zCSRubG8KKwlsZAlbJW81KzRdLCRuaGlfCisJZnplcm9zCSRuaGkKKworCSEgdHJhbnNmZXIgYltpXSB0byBGUFUgYXMgNHgxNi1iaXQgdmFsdWVzCisJbGRkYQlbJW80KzJdJWFzaSwkYmEKKwlmeHRvZAkkYWxvLCRhbG8KKwlsZGRhCVslbzQrMF0lYXNpLCRiYgorCWZ4dG9kCSRhaGksJGFoaQorCWxkZGEJWyVvNCs2XSVhc2ksJGJjCisJZnh0b2QJJG5sbywkbmxvCisJbGRkYQlbJW80KzRdJWFzaSwkYmQKKwlmeHRvZAkkbmhpLCRuaGkKKworCSEgdHJhbnNmZXIgYXBbMF0qYlswXSpuMCB0byBGUFUgYXMgNHgxNi1iaXQgdmFsdWVzCisJbGRkYQlbJXNwKyRiaWFzKyRmcmFtZSs2XSVhc2ksJG5hCisJZnh0b2QJJGJhLCRiYQorCWxkZGEJWyVzcCskYmlhcyskZnJhbWUrNF0lYXNpLCRuYgorCWZ4dG9kCSRiYiwkYmIKKwlsZGRhCVslc3ArJGJpYXMrJGZyYW1lKzJdJWFzaSwkbmMKKwlmeHRvZAkkYmMsJGJjCisJbGRkYQlbJXNwKyRiaWFzKyRmcmFtZSswXSVhc2ksJG5kCisJZnh0b2QJJGJkLCRiZAorCisJc3RkCSRhbG8sWyRhcF9sKyRqXQkJISBzYXZlIHNtYXNoZWQgYXBbal0gaW4gZG91YmxlIGZvcm1hdAorCWZ4dG9kCSRuYSwkbmEKKwlzdGQJJGFoaSxbJGFwX2grJGpdCisJZnh0b2QJJG5iLCRuYgorCXN0ZAkkbmxvLFskbnBfbCskal0JCSEgc2F2ZSBzbWFzaGVkIG5wW2pdIGluIGRvdWJsZSBmb3JtYXQKKwlmeHRvZAkkbmMsJG5jCisJc3RkCSRuaGksWyRucF9oKyRqXQorCWZ4dG9kCSRuZCwkbmQKKworCQlmbXVsZAkkYWxvLCRiYSwkYWxvYQorCQlmbXVsZAkkbmxvLCRuYSwkbmxvYQorCQlmbXVsZAkkYWxvLCRiYiwkYWxvYgorCQlmbXVsZAkkbmxvLCRuYiwkbmxvYgorCQlmbXVsZAkkYWxvLCRiYywkYWxvYworCWZhZGRkCSRhbG9hLCRubG9hLCRubG9hCisJCWZtdWxkCSRubG8sJG5jLCRubG9jCisJCWZtdWxkCSRhbG8sJGJkLCRhbG9kCisJZmFkZGQJJGFsb2IsJG5sb2IsJG5sb2IKKwkJZm11bGQJJG5sbywkbmQsJG5sb2QKKwkJZm11bGQJJGFoaSwkYmEsJGFoaWEKKwlmYWRkZAkkYWxvYywkbmxvYywkbmxvYworCQlmbXVsZAkkbmhpLCRuYSwkbmhpYQorCQlmbXVsZAkkYWhpLCRiYiwkYWhpYgorCWZhZGRkCSRhbG9kLCRubG9kLCRubG9kCisJCWZtdWxkCSRuaGksJG5iLCRuaGliCisJCWZtdWxkCSRhaGksJGJjLCRhaGljCisJZmFkZGQJJGFoaWEsJG5oaWEsJG5oaWEKKwkJZm11bGQJJG5oaSwkbmMsJG5oaWMKKwkJZm11bGQJJGFoaSwkYmQsJGFoaWQKKwlmYWRkZAkkYWhpYiwkbmhpYiwkbmhpYgorCQlmbXVsZAkkbmhpLCRuZCwkbmhpZAorCisJZmFkZGQJJGFoaWMsJG5oaWMsJGRvdGEJISAkbmhpYworCWZhZGRkCSRhaGlkLCRuaGlkLCRkb3RiCSEgJG5oaWQKKworCWZhZGRkCSRubG9jLCRuaGlhLCRubG9jCisJZmFkZGQJJG5sb2QsJG5oaWIsJG5sb2QKKworCWZkdG94CSRubG9hLCRubG9hCisJZmR0b3gJJG5sb2IsJG5sb2IKKwlmZHRveAkkbmxvYywkbmxvYworCWZkdG94CSRubG9kLCRubG9kCisKKwlzdGQJJG5sb2EsWyVzcCskYmlhcyskZnJhbWUrMF0KKwlhZGQJJGosOCwkagorCXN0ZAkkbmxvYixbJXNwKyRiaWFzKyRmcmFtZSs4XQorCWFkZAkkYXAsJGosJW80CisJc3RkCSRubG9jLFslc3ArJGJpYXMrJGZyYW1lKzE2XQorCWFkZAkkbnAsJGosJW81CisJc3RkCSRubG9kLFslc3ArJGJpYXMrJGZyYW1lKzI0XQorDAorCWxkCVslbzQrMF0sJGFsb18JISBsb2FkIGFbal0gYXMgcGFpciBvZiAzMi1iaXQgd29yZHMKKwlmemVyb3MJJGFsbworCWxkCVslbzQrNF0sJGFoaV8KKwlmemVyb3MJJGFoaQorCWxkCVslbzUrMF0sJG5sb18JISBsb2FkIG5bal0gYXMgcGFpciBvZiAzMi1iaXQgd29yZHMKKwlmemVyb3MJJG5sbworCWxkCVslbzUrNF0sJG5oaV8KKwlmemVyb3MJJG5oaQorCisJZnh0b2QJJGFsbywkYWxvCisJZnh0b2QJJGFoaSwkYWhpCisJZnh0b2QJJG5sbywkbmxvCisJZnh0b2QJJG5oaSwkbmhpCisKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrMF0sJW8wCisJCWZtdWxkCSRhbG8sJGJhLCRhbG9hCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzhdLCVvMQorCQlmbXVsZAkkbmxvLCRuYSwkbmxvYQorCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSsxNl0sJW8yCisJCWZtdWxkCSRhbG8sJGJiLCRhbG9iCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzI0XSwlbzMKKwkJZm11bGQJJG5sbywkbmIsJG5sb2IKKworCXNybHgJJW8wLDE2LCVvNworCXN0ZAkkYWxvLFskYXBfbCskal0JCSEgc2F2ZSBzbWFzaGVkIGFwW2pdIGluIGRvdWJsZSBmb3JtYXQKKwkJZm11bGQJJGFsbywkYmMsJGFsb2MKKwlhZGQJJW83LCVvMSwlbzEKKwlzdGQJJGFoaSxbJGFwX2grJGpdCisJCWZhZGRkCSRhbG9hLCRubG9hLCRubG9hCisJCWZtdWxkCSRubG8sJG5jLCRubG9jCisJc3JseAklbzEsMTYsJW83CisJc3RkCSRubG8sWyRucF9sKyRqXQkJISBzYXZlIHNtYXNoZWQgbnBbal0gaW4gZG91YmxlIGZvcm1hdAorCQlmbXVsZAkkYWxvLCRiZCwkYWxvZAorCWFkZAklbzcsJW8yLCVvMgorCXN0ZAkkbmhpLFskbnBfaCskal0KKwkJZmFkZGQJJGFsb2IsJG5sb2IsJG5sb2IKKwkJZm11bGQJJG5sbywkbmQsJG5sb2QKKwlzcmx4CSVvMiwxNiwlbzcKKwkJZm11bGQJJGFoaSwkYmEsJGFoaWEKKwlhZGQJJW83LCVvMywlbzMJCSEgJW8zLiVvMlswLi4xNV0uJW8xWzAuLjE1XS4lbzBbMC4uMTVdCisJCWZhZGRkCSRhbG9jLCRubG9jLCRubG9jCisJCWZtdWxkCSRuaGksJG5hLCRuaGlhCisJIWFuZAklbzAsJG1hc2ssJW8wCisJIWFuZAklbzEsJG1hc2ssJW8xCisJIWFuZAklbzIsJG1hc2ssJW8yCisJIXNsbHgJJW8xLDE2LCVvMQorCSFzbGx4CSVvMiwzMiwlbzIKKwkhc2xseAklbzMsNDgsJW83CisJIW9yCSVvMSwlbzAsJW8wCisJIW9yCSVvMiwlbzAsJW8wCisJIW9yCSVvNywlbzAsJW8wCQkhIDY0LWJpdCByZXN1bHQKKwlzcmx4CSVvMywxNiwlZzEJCSEgMzQtYml0IGNhcnJ5CisJCWZtdWxkCSRhaGksJGJiLCRhaGliCisKKwlmYWRkZAkkYWxvZCwkbmxvZCwkbmxvZAorCQlmbXVsZAkkbmhpLCRuYiwkbmhpYgorCQlmbXVsZAkkYWhpLCRiYywkYWhpYworCWZhZGRkCSRhaGlhLCRuaGlhLCRuaGlhCisJCWZtdWxkCSRuaGksJG5jLCRuaGljCisJCWZtdWxkCSRhaGksJGJkLCRhaGlkCisJZmFkZGQJJGFoaWIsJG5oaWIsJG5oaWIKKwkJZm11bGQJJG5oaSwkbmQsJG5oaWQKKworCWZhZGRkCSRkb3RhLCRubG9hLCRubG9hCisJZmFkZGQJJGRvdGIsJG5sb2IsJG5sb2IKKwlmYWRkZAkkYWhpYywkbmhpYywkZG90YQkhICRuaGljCisJZmFkZGQJJGFoaWQsJG5oaWQsJGRvdGIJISAkbmhpZAorCisJZmFkZGQJJG5sb2MsJG5oaWEsJG5sb2MKKwlmYWRkZAkkbmxvZCwkbmhpYiwkbmxvZAorCisJZmR0b3gJJG5sb2EsJG5sb2EKKwlmZHRveAkkbmxvYiwkbmxvYgorCWZkdG94CSRubG9jLCRubG9jCisJZmR0b3gJJG5sb2QsJG5sb2QKKworCXN0ZAkkbmxvYSxbJXNwKyRiaWFzKyRmcmFtZSswXQorCXN0ZAkkbmxvYixbJXNwKyRiaWFzKyRmcmFtZSs4XQorCWFkZGNjCSRqLDgsJGoKKwlzdGQJJG5sb2MsWyVzcCskYmlhcyskZnJhbWUrMTZdCisJYnoscG4JJWljYywuTDFzdHNraXAKKwlzdGQJJG5sb2QsWyVzcCskYmlhcyskZnJhbWUrMjRdCisMCisuYWxpZ24JMzIJCQkhIGluY2lkZW50YWxseSBhbHJlYWR5IGFsaWduZWQgIQorLkwxc3Q6CisJYWRkCSRhcCwkaiwlbzQKKwlhZGQJJG5wLCRqLCVvNQorCWxkCVslbzQrMF0sJGFsb18JISBsb2FkIGFbal0gYXMgcGFpciBvZiAzMi1iaXQgd29yZHMKKwlmemVyb3MJJGFsbworCWxkCVslbzQrNF0sJGFoaV8KKwlmemVyb3MJJGFoaQorCWxkCVslbzUrMF0sJG5sb18JISBsb2FkIG5bal0gYXMgcGFpciBvZiAzMi1iaXQgd29yZHMKKwlmemVyb3MJJG5sbworCWxkCVslbzUrNF0sJG5oaV8KKwlmemVyb3MJJG5oaQorCisJZnh0b2QJJGFsbywkYWxvCisJZnh0b2QJJGFoaSwkYWhpCisJZnh0b2QJJG5sbywkbmxvCisJZnh0b2QJJG5oaSwkbmhpCisKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrMF0sJW8wCisJCWZtdWxkCSRhbG8sJGJhLCRhbG9hCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzhdLCVvMQorCQlmbXVsZAkkbmxvLCRuYSwkbmxvYQorCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSsxNl0sJW8yCisJCWZtdWxkCSRhbG8sJGJiLCRhbG9iCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzI0XSwlbzMKKwkJZm11bGQJJG5sbywkbmIsJG5sb2IKKworCXNybHgJJW8wLDE2LCVvNworCXN0ZAkkYWxvLFskYXBfbCskal0JCSEgc2F2ZSBzbWFzaGVkIGFwW2pdIGluIGRvdWJsZSBmb3JtYXQKKwkJZm11bGQJJGFsbywkYmMsJGFsb2MKKwlhZGQJJW83LCVvMSwlbzEKKwlzdGQJJGFoaSxbJGFwX2grJGpdCisJCWZhZGRkCSRhbG9hLCRubG9hLCRubG9hCisJCWZtdWxkCSRubG8sJG5jLCRubG9jCisJc3JseAklbzEsMTYsJW83CisJc3RkCSRubG8sWyRucF9sKyRqXQkJISBzYXZlIHNtYXNoZWQgbnBbal0gaW4gZG91YmxlIGZvcm1hdAorCQlmbXVsZAkkYWxvLCRiZCwkYWxvZAorCWFkZAklbzcsJW8yLCVvMgorCXN0ZAkkbmhpLFskbnBfaCskal0KKwkJZmFkZGQJJGFsb2IsJG5sb2IsJG5sb2IKKwkJZm11bGQJJG5sbywkbmQsJG5sb2QKKwlzcmx4CSVvMiwxNiwlbzcKKwkJZm11bGQJJGFoaSwkYmEsJGFoaWEKKwlhZGQJJW83LCVvMywlbzMJCSEgJW8zLiVvMlswLi4xNV0uJW8xWzAuLjE1XS4lbzBbMC4uMTVdCisJYW5kCSVvMCwkbWFzaywlbzAKKwkJZmFkZGQJJGFsb2MsJG5sb2MsJG5sb2MKKwkJZm11bGQJJG5oaSwkbmEsJG5oaWEKKwlhbmQJJW8xLCRtYXNrLCVvMQorCWFuZAklbzIsJG1hc2ssJW8yCisJCWZtdWxkCSRhaGksJGJiLCRhaGliCisJc2xseAklbzEsMTYsJW8xCisJCWZhZGRkCSRhbG9kLCRubG9kLCRubG9kCisJCWZtdWxkCSRuaGksJG5iLCRuaGliCisJc2xseAklbzIsMzIsJW8yCisJCWZtdWxkCSRhaGksJGJjLCRhaGljCisJc2xseAklbzMsNDgsJW83CisJb3IJJW8xLCVvMCwlbzAKKwkJZmFkZGQJJGFoaWEsJG5oaWEsJG5oaWEKKwkJZm11bGQJJG5oaSwkbmMsJG5oaWMKKwlvcgklbzIsJW8wLCVvMAorCQlmbXVsZAkkYWhpLCRiZCwkYWhpZAorCW9yCSVvNywlbzAsJW8wCQkhIDY0LWJpdCByZXN1bHQKKwkJZmFkZGQJJGFoaWIsJG5oaWIsJG5oaWIKKwkJZm11bGQJJG5oaSwkbmQsJG5oaWQKKwlhZGRjYwklZzEsJW8wLCVvMAorCQlmYWRkZAkkZG90YSwkbmxvYSwkbmxvYQorCXNybHgJJW8zLDE2LCVnMQkJISAzNC1iaXQgY2FycnkKKwkJZmFkZGQJJGRvdGIsJG5sb2IsJG5sb2IKKwliY3MsYQkleGNjLC4rOAorCWFkZAklZzEsMSwlZzEKKworCXN0eAklbzAsWyR0cF0JCSEgdHBbai0xXT0KKworCWZhZGRkCSRhaGljLCRuaGljLCRkb3RhCSEgJG5oaWMKKwlmYWRkZAkkYWhpZCwkbmhpZCwkZG90YgkhICRuaGlkCisKKwlmYWRkZAkkbmxvYywkbmhpYSwkbmxvYworCWZhZGRkCSRubG9kLCRuaGliLCRubG9kCisKKwlmZHRveAkkbmxvYSwkbmxvYQorCWZkdG94CSRubG9iLCRubG9iCisJZmR0b3gJJG5sb2MsJG5sb2MKKwlmZHRveAkkbmxvZCwkbmxvZAorCisJc3RkCSRubG9hLFslc3ArJGJpYXMrJGZyYW1lKzBdCisJc3RkCSRubG9iLFslc3ArJGJpYXMrJGZyYW1lKzhdCisJc3RkCSRubG9jLFslc3ArJGJpYXMrJGZyYW1lKzE2XQorCXN0ZAkkbmxvZCxbJXNwKyRiaWFzKyRmcmFtZSsyNF0KKworCWFkZGNjCSRqLDgsJGoKKwlibnoscHQJJWljYywuTDFzdAorCWFkZAkkdHAsOCwkdHAKKwwKKy5MMXN0c2tpcDoKKwlmZHRveAkkZG90YSwkZG90YQorCWZkdG94CSRkb3RiLCRkb3RiCisKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrMF0sJW8wCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzhdLCVvMQorCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSsxNl0sJW8yCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzI0XSwlbzMKKworCXNybHgJJW8wLDE2LCVvNworCXN0ZAkkZG90YSxbJXNwKyRiaWFzKyRmcmFtZSszMl0KKwlhZGQJJW83LCVvMSwlbzEKKwlzdGQJJGRvdGIsWyVzcCskYmlhcyskZnJhbWUrNDBdCisJc3JseAklbzEsMTYsJW83CisJYWRkCSVvNywlbzIsJW8yCisJc3JseAklbzIsMTYsJW83CisJYWRkCSVvNywlbzMsJW8zCQkhICVvMy4lbzJbMC4uMTVdLiVvMVswLi4xNV0uJW8wWzAuLjE1XQorCWFuZAklbzAsJG1hc2ssJW8wCisJYW5kCSVvMSwkbWFzaywlbzEKKwlhbmQJJW8yLCRtYXNrLCVvMgorCXNsbHgJJW8xLDE2LCVvMQorCXNsbHgJJW8yLDMyLCVvMgorCXNsbHgJJW8zLDQ4LCVvNworCW9yCSVvMSwlbzAsJW8wCisJb3IJJW8yLCVvMCwlbzAKKwlvcgklbzcsJW8wLCVvMAkJISA2NC1iaXQgcmVzdWx0CisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzMyXSwlbzQKKwlhZGRjYwklZzEsJW8wLCVvMAorCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSs0MF0sJW81CisJc3JseAklbzMsMTYsJWcxCQkhIDM0LWJpdCBjYXJyeQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCSVnMSwxLCVnMQorCisJc3R4CSVvMCxbJHRwXQkJISB0cFtqLTFdPQorCWFkZAkkdHAsOCwkdHAKKworCXNybHgJJW80LDE2LCVvNworCWFkZAklbzcsJW81LCVvNQorCWFuZAklbzQsJG1hc2ssJW80CisJc2xseAklbzUsMTYsJW83CisJb3IJJW83LCVvNCwlbzQKKwlhZGRjYwklZzEsJW80LCVvNAorCXNybHgJJW81LDQ4LCVnMQorCWJjcyxhCSV4Y2MsLis4CisJYWRkCSVnMSwxLCVnMQorCisJbW92CSVnMSwkY2FycnkKKwlzdHgJJW80LFskdHBdCQkhIHRwW251bS0xXT0KKwwKKwliYQkuTG91dGVyCisJYWRkCSRpLDgsJGkKKy5hbGlnbgkzMgorLkxvdXRlcjoKKwlzdWIJJWcwLCRudW0sJGoJCSEgaj0tbnVtCisJYWRkCSVzcCwkYmlhcyskZnJhbWUrJGxvY2FscywkdHAKKworCWFkZAkkYXAsJGosJW8zCisJYWRkCSRicCwkaSwlbzQKKworCWxkCVslbzMrNF0sJWcxCQkhIGJwW2ldCisJbGQJWyVvMyswXSwlbzAKKwlsZAlbJW80KzRdLCVnNQkJISBhcFswXQorCXNsbHgJJWcxLDMyLCVnMQorCWxkCVslbzQrMF0sJW8xCisJc2xseAklZzUsMzIsJWc1CisJb3IJJWcxLCVvMCwlbzAKKwlvcgklZzUsJW8xLCVvMQorCisJbGR4CVskdHBdLCVvMgkJISB0cFswXQorCW11bHgJJW8xLCVvMCwlbzAKKwlhZGRjYwklbzIsJW8wLCVvMAorCW11bHgJJG4wLCVvMCwlbzAJCSEgKGFwWzBdKmJwW2ldK3RbMF0pKm4wCisJc3R4CSVvMCxbJXNwKyRiaWFzKyRmcmFtZSswXQorCisJISB0cmFuc2ZlciBiW2ldIHRvIEZQVSBhcyA0eDE2LWJpdCB2YWx1ZXMKKwlsZGRhCVslbzQrMl0lYXNpLCRiYQorCWxkZGEJWyVvNCswXSVhc2ksJGJiCisJbGRkYQlbJW80KzZdJWFzaSwkYmMKKwlsZGRhCVslbzQrNF0lYXNpLCRiZAorCisJISB0cmFuc2ZlciAoYXBbMF0qYltpXSt0WzBdKSpuMCB0byBGUFUgYXMgNHgxNi1iaXQgdmFsdWVzCisJbGRkYQlbJXNwKyRiaWFzKyRmcmFtZSs2XSVhc2ksJG5hCisJZnh0b2QJJGJhLCRiYQorCWxkZGEJWyVzcCskYmlhcyskZnJhbWUrNF0lYXNpLCRuYgorCWZ4dG9kCSRiYiwkYmIKKwlsZGRhCVslc3ArJGJpYXMrJGZyYW1lKzJdJWFzaSwkbmMKKwlmeHRvZAkkYmMsJGJjCisJbGRkYQlbJXNwKyRiaWFzKyRmcmFtZSswXSVhc2ksJG5kCisJZnh0b2QJJGJkLCRiZAorCWxkZAlbJGFwX2wrJGpdLCRhbG8JCSEgbG9hZCBhW2pdIGluIGRvdWJsZSBmb3JtYXQKKwlmeHRvZAkkbmEsJG5hCisJbGRkCVskYXBfaCskal0sJGFoaQorCWZ4dG9kCSRuYiwkbmIKKwlsZGQJWyRucF9sKyRqXSwkbmxvCQkhIGxvYWQgbltqXSBpbiBkb3VibGUgZm9ybWF0CisJZnh0b2QJJG5jLCRuYworCWxkZAlbJG5wX2grJGpdLCRuaGkKKwlmeHRvZAkkbmQsJG5kCisKKwkJZm11bGQJJGFsbywkYmEsJGFsb2EKKwkJZm11bGQJJG5sbywkbmEsJG5sb2EKKwkJZm11bGQJJGFsbywkYmIsJGFsb2IKKwkJZm11bGQJJG5sbywkbmIsJG5sb2IKKwkJZm11bGQJJGFsbywkYmMsJGFsb2MKKwlmYWRkZAkkYWxvYSwkbmxvYSwkbmxvYQorCQlmbXVsZAkkbmxvLCRuYywkbmxvYworCQlmbXVsZAkkYWxvLCRiZCwkYWxvZAorCWZhZGRkCSRhbG9iLCRubG9iLCRubG9iCisJCWZtdWxkCSRubG8sJG5kLCRubG9kCisJCWZtdWxkCSRhaGksJGJhLCRhaGlhCisJZmFkZGQJJGFsb2MsJG5sb2MsJG5sb2MKKwkJZm11bGQJJG5oaSwkbmEsJG5oaWEKKwkJZm11bGQJJGFoaSwkYmIsJGFoaWIKKwlmYWRkZAkkYWxvZCwkbmxvZCwkbmxvZAorCQlmbXVsZAkkbmhpLCRuYiwkbmhpYgorCQlmbXVsZAkkYWhpLCRiYywkYWhpYworCWZhZGRkCSRhaGlhLCRuaGlhLCRuaGlhCisJCWZtdWxkCSRuaGksJG5jLCRuaGljCisJCWZtdWxkCSRhaGksJGJkLCRhaGlkCisJZmFkZGQJJGFoaWIsJG5oaWIsJG5oaWIKKwkJZm11bGQJJG5oaSwkbmQsJG5oaWQKKworCWZhZGRkCSRhaGljLCRuaGljLCRkb3RhCSEgJG5oaWMKKwlmYWRkZAkkYWhpZCwkbmhpZCwkZG90YgkhICRuaGlkCisKKwlmYWRkZAkkbmxvYywkbmhpYSwkbmxvYworCWZhZGRkCSRubG9kLCRuaGliLCRubG9kCisKKwlmZHRveAkkbmxvYSwkbmxvYQorCWZkdG94CSRubG9iLCRubG9iCisJZmR0b3gJJG5sb2MsJG5sb2MKKwlmZHRveAkkbmxvZCwkbmxvZAorCisJc3RkCSRubG9hLFslc3ArJGJpYXMrJGZyYW1lKzBdCisJc3RkCSRubG9iLFslc3ArJGJpYXMrJGZyYW1lKzhdCisJc3RkCSRubG9jLFslc3ArJGJpYXMrJGZyYW1lKzE2XQorCWFkZAkkaiw4LCRqCisJc3RkCSRubG9kLFslc3ArJGJpYXMrJGZyYW1lKzI0XQorDAorCWxkZAlbJGFwX2wrJGpdLCRhbG8JCSEgbG9hZCBhW2pdIGluIGRvdWJsZSBmb3JtYXQKKwlsZGQJWyRhcF9oKyRqXSwkYWhpCisJbGRkCVskbnBfbCskal0sJG5sbwkJISBsb2FkIG5bal0gaW4gZG91YmxlIGZvcm1hdAorCWxkZAlbJG5wX2grJGpdLCRuaGkKKworCQlmbXVsZAkkYWxvLCRiYSwkYWxvYQorCQlmbXVsZAkkbmxvLCRuYSwkbmxvYQorCQlmbXVsZAkkYWxvLCRiYiwkYWxvYgorCQlmbXVsZAkkbmxvLCRuYiwkbmxvYgorCQlmbXVsZAkkYWxvLCRiYywkYWxvYworCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSswXSwlbzAKKwkJZmFkZGQJJGFsb2EsJG5sb2EsJG5sb2EKKwkJZm11bGQJJG5sbywkbmMsJG5sb2MKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrOF0sJW8xCisJCWZtdWxkCSRhbG8sJGJkLCRhbG9kCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzE2XSwlbzIKKwkJZmFkZGQJJGFsb2IsJG5sb2IsJG5sb2IKKwkJZm11bGQJJG5sbywkbmQsJG5sb2QKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrMjRdLCVvMworCQlmbXVsZAkkYWhpLCRiYSwkYWhpYQorCisJc3JseAklbzAsMTYsJW83CisJCWZhZGRkCSRhbG9jLCRubG9jLCRubG9jCisJCWZtdWxkCSRuaGksJG5hLCRuaGlhCisJYWRkCSVvNywlbzEsJW8xCisJCWZtdWxkCSRhaGksJGJiLCRhaGliCisJc3JseAklbzEsMTYsJW83CisJCWZhZGRkCSRhbG9kLCRubG9kLCRubG9kCisJCWZtdWxkCSRuaGksJG5iLCRuaGliCisJYWRkCSVvNywlbzIsJW8yCisJCWZtdWxkCSRhaGksJGJjLCRhaGljCisJc3JseAklbzIsMTYsJW83CisJCWZhZGRkCSRhaGlhLCRuaGlhLCRuaGlhCisJCWZtdWxkCSRuaGksJG5jLCRuaGljCisJYWRkCSVvNywlbzMsJW8zCQkhICVvMy4lbzJbMC4uMTVdLiVvMVswLi4xNV0uJW8wWzAuLjE1XQorCSEgd2h5PworCWFuZAklbzAsJG1hc2ssJW8wCisJCWZtdWxkCSRhaGksJGJkLCRhaGlkCisJYW5kCSVvMSwkbWFzaywlbzEKKwlhbmQJJW8yLCRtYXNrLCVvMgorCQlmYWRkZAkkYWhpYiwkbmhpYiwkbmhpYgorCQlmbXVsZAkkbmhpLCRuZCwkbmhpZAorCXNsbHgJJW8xLDE2LCVvMQorCQlmYWRkZAkkZG90YSwkbmxvYSwkbmxvYQorCXNsbHgJJW8yLDMyLCVvMgorCQlmYWRkZAkkZG90YiwkbmxvYiwkbmxvYgorCXNsbHgJJW8zLDQ4LCVvNworCW9yCSVvMSwlbzAsJW8wCisJCWZhZGRkCSRhaGljLCRuaGljLCRkb3RhCSEgJG5oaWMKKwlvcgklbzIsJW8wLCVvMAorCQlmYWRkZAkkYWhpZCwkbmhpZCwkZG90YgkhICRuaGlkCisJb3IJJW83LCVvMCwlbzAJCSEgNjQtYml0IHJlc3VsdAorCWxkeAlbJHRwXSwlbzcKKwkJZmFkZGQJJG5sb2MsJG5oaWEsJG5sb2MKKwlhZGRjYwklbzcsJW8wLCVvMAorCSEgZW5kLW9mLXdoeT8KKwkJZmFkZGQJJG5sb2QsJG5oaWIsJG5sb2QKKwlzcmx4CSVvMywxNiwlZzEJCSEgMzQtYml0IGNhcnJ5CisJCWZkdG94CSRubG9hLCRubG9hCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJJWcxLDEsJWcxCisKKwlmZHRveAkkbmxvYiwkbmxvYgorCWZkdG94CSRubG9jLCRubG9jCisJZmR0b3gJJG5sb2QsJG5sb2QKKworCXN0ZAkkbmxvYSxbJXNwKyRiaWFzKyRmcmFtZSswXQorCXN0ZAkkbmxvYixbJXNwKyRiaWFzKyRmcmFtZSs4XQorCWFkZGNjCSRqLDgsJGoKKwlzdGQJJG5sb2MsWyVzcCskYmlhcyskZnJhbWUrMTZdCisJYnoscG4JJWljYywuTGlubmVyc2tpcAorCXN0ZAkkbmxvZCxbJXNwKyRiaWFzKyRmcmFtZSsyNF0KKwwKKwliYQkuTGlubmVyCisJbm9wCisuYWxpZ24JMzIKKy5MaW5uZXI6CisJbGRkCVskYXBfbCskal0sJGFsbwkJISBsb2FkIGFbal0gaW4gZG91YmxlIGZvcm1hdAorCWxkZAlbJGFwX2grJGpdLCRhaGkKKwlsZGQJWyRucF9sKyRqXSwkbmxvCQkhIGxvYWQgbltqXSBpbiBkb3VibGUgZm9ybWF0CisJbGRkCVskbnBfaCskal0sJG5oaQorCisJCWZtdWxkCSRhbG8sJGJhLCRhbG9hCisJCWZtdWxkCSRubG8sJG5hLCRubG9hCisJCWZtdWxkCSRhbG8sJGJiLCRhbG9iCisJCWZtdWxkCSRubG8sJG5iLCRubG9iCisJCWZtdWxkCSRhbG8sJGJjLCRhbG9jCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzBdLCVvMAorCQlmYWRkZAkkYWxvYSwkbmxvYSwkbmxvYQorCQlmbXVsZAkkbmxvLCRuYywkbmxvYworCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSs4XSwlbzEKKwkJZm11bGQJJGFsbywkYmQsJGFsb2QKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrMTZdLCVvMgorCQlmYWRkZAkkYWxvYiwkbmxvYiwkbmxvYgorCQlmbXVsZAkkbmxvLCRuZCwkbmxvZAorCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSsyNF0sJW8zCisJCWZtdWxkCSRhaGksJGJhLCRhaGlhCisKKwlzcmx4CSVvMCwxNiwlbzcKKwkJZmFkZGQJJGFsb2MsJG5sb2MsJG5sb2MKKwkJZm11bGQJJG5oaSwkbmEsJG5oaWEKKwlhZGQJJW83LCVvMSwlbzEKKwkJZm11bGQJJGFoaSwkYmIsJGFoaWIKKwlzcmx4CSVvMSwxNiwlbzcKKwkJZmFkZGQJJGFsb2QsJG5sb2QsJG5sb2QKKwkJZm11bGQJJG5oaSwkbmIsJG5oaWIKKwlhZGQJJW83LCVvMiwlbzIKKwkJZm11bGQJJGFoaSwkYmMsJGFoaWMKKwlzcmx4CSVvMiwxNiwlbzcKKwkJZmFkZGQJJGFoaWEsJG5oaWEsJG5oaWEKKwkJZm11bGQJJG5oaSwkbmMsJG5oaWMKKwlhZGQJJW83LCVvMywlbzMJCSEgJW8zLiVvMlswLi4xNV0uJW8xWzAuLjE1XS4lbzBbMC4uMTVdCisJYW5kCSVvMCwkbWFzaywlbzAKKwkJZm11bGQJJGFoaSwkYmQsJGFoaWQKKwlhbmQJJW8xLCRtYXNrLCVvMQorCWFuZAklbzIsJG1hc2ssJW8yCisJCWZhZGRkCSRhaGliLCRuaGliLCRuaGliCisJCWZtdWxkCSRuaGksJG5kLCRuaGlkCisJc2xseAklbzEsMTYsJW8xCisJCWZhZGRkCSRkb3RhLCRubG9hLCRubG9hCisJc2xseAklbzIsMzIsJW8yCisJCWZhZGRkCSRkb3RiLCRubG9iLCRubG9iCisJc2xseAklbzMsNDgsJW83CisJb3IJJW8xLCVvMCwlbzAKKwkJZmFkZGQJJGFoaWMsJG5oaWMsJGRvdGEJISAkbmhpYworCW9yCSVvMiwlbzAsJW8wCisJCWZhZGRkCSRhaGlkLCRuaGlkLCRkb3RiCSEgJG5oaWQKKwlvcgklbzcsJW8wLCVvMAkJISA2NC1iaXQgcmVzdWx0CisJCWZhZGRkCSRubG9jLCRuaGlhLCRubG9jCisJYWRkY2MJJWcxLCVvMCwlbzAKKwlsZHgJWyR0cCs4XSwlbzcJCSEgdHBbal0KKwkJZmFkZGQJJG5sb2QsJG5oaWIsJG5sb2QKKwlzcmx4CSVvMywxNiwlZzEJCSEgMzQtYml0IGNhcnJ5CisJCWZkdG94CSRubG9hLCRubG9hCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJJWcxLDEsJWcxCisJCWZkdG94CSRubG9iLCRubG9iCisJYWRkY2MJJW83LCVvMCwlbzAKKwkJZmR0b3gJJG5sb2MsJG5sb2MKKwliY3MsYQkleGNjLC4rOAorCWFkZAklZzEsMSwlZzEKKworCXN0eAklbzAsWyR0cF0JCSEgdHBbai0xXQorCQlmZHRveAkkbmxvZCwkbmxvZAorCisJc3RkCSRubG9hLFslc3ArJGJpYXMrJGZyYW1lKzBdCisJc3RkCSRubG9iLFslc3ArJGJpYXMrJGZyYW1lKzhdCisJc3RkCSRubG9jLFslc3ArJGJpYXMrJGZyYW1lKzE2XQorCWFkZGNjCSRqLDgsJGoKKwlzdGQJJG5sb2QsWyVzcCskYmlhcyskZnJhbWUrMjRdCisJYm56LHB0CSVpY2MsLkxpbm5lcgorCWFkZAkkdHAsOCwkdHAKKwwKKy5MaW5uZXJza2lwOgorCWZkdG94CSRkb3RhLCRkb3RhCisJZmR0b3gJJGRvdGIsJGRvdGIKKworCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSswXSwlbzAKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrOF0sJW8xCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzE2XSwlbzIKKwlsZHgJWyVzcCskYmlhcyskZnJhbWUrMjRdLCVvMworCisJc3JseAklbzAsMTYsJW83CisJc3RkCSRkb3RhLFslc3ArJGJpYXMrJGZyYW1lKzMyXQorCWFkZAklbzcsJW8xLCVvMQorCXN0ZAkkZG90YixbJXNwKyRiaWFzKyRmcmFtZSs0MF0KKwlzcmx4CSVvMSwxNiwlbzcKKwlhZGQJJW83LCVvMiwlbzIKKwlzcmx4CSVvMiwxNiwlbzcKKwlhZGQJJW83LCVvMywlbzMJCSEgJW8zLiVvMlswLi4xNV0uJW8xWzAuLjE1XS4lbzBbMC4uMTVdCisJYW5kCSVvMCwkbWFzaywlbzAKKwlhbmQJJW8xLCRtYXNrLCVvMQorCWFuZAklbzIsJG1hc2ssJW8yCisJc2xseAklbzEsMTYsJW8xCisJc2xseAklbzIsMzIsJW8yCisJc2xseAklbzMsNDgsJW83CisJb3IJJW8xLCVvMCwlbzAKKwlvcgklbzIsJW8wLCVvMAorCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSszMl0sJW80CisJb3IJJW83LCVvMCwlbzAJCSEgNjQtYml0IHJlc3VsdAorCWxkeAlbJXNwKyRiaWFzKyRmcmFtZSs0MF0sJW81CisJYWRkY2MJJWcxLCVvMCwlbzAKKwlsZHgJWyR0cCs4XSwlbzcJCSEgdHBbal0KKwlzcmx4CSVvMywxNiwlZzEJCSEgMzQtYml0IGNhcnJ5CisJYmNzLGEJJXhjYywuKzgKKwlhZGQJJWcxLDEsJWcxCisKKwlhZGRjYwklbzcsJW8wLCVvMAorCWJjcyxhCSV4Y2MsLis4CisJYWRkCSVnMSwxLCVnMQorCisJc3R4CSVvMCxbJHRwXQkJISB0cFtqLTFdCisJYWRkCSR0cCw4LCR0cAorCisJc3JseAklbzQsMTYsJW83CisJYWRkCSVvNywlbzUsJW81CisJYW5kCSVvNCwkbWFzaywlbzQKKwlzbGx4CSVvNSwxNiwlbzcKKwlvcgklbzcsJW80LCVvNAorCWFkZGNjCSVnMSwlbzQsJW80CisJc3JseAklbzUsNDgsJWcxCisJYmNzLGEJJXhjYywuKzgKKwlhZGQJJWcxLDEsJWcxCisKKwlhZGRjYwkkY2FycnksJW80LCVvNAorCXN0eAklbzQsWyR0cF0JCSEgdHBbbnVtLTFdCisJbW92CSVnMSwkY2FycnkKKwliY3MsYQkleGNjLC4rOAorCWFkZAkkY2FycnksMSwkY2FycnkKKworCWFkZGNjCSRpLDgsJGkKKwlibnoJJWljYywuTG91dGVyCisJbm9wCisMCisJYWRkCSR0cCw4LCR0cAkJISBhZGp1c3QgdHAgdG8gcG9pbnQgYXQgdGhlIGVuZAorCW9ybgklZzAsJWcwLCVnNAorCXN1YgklZzAsJG51bSwlbzcJCSEgbj0tbnVtCisJYmEJLkxzdWIKKwlzdWJjYwklZzAsJWcwLCVnMAkJISBjbGVhciAlaWNjLmMKKworLmFsaWduCTMyCisuTHN1YjoKKwlsZHgJWyR0cCslbzddLCVvMAorCWFkZAkkbnAsJW83LCVnMQorCWxkCVslZzErMF0sJW8yCisJbGQJWyVnMSs0XSwlbzMKKwlzcmx4CSVvMCwzMiwlbzEKKwlzdWJjY2MJJW8wLCVvMiwlbzIKKwlhZGQJJHJwLCVvNywlZzEKKwlzdWJjY2MJJW8xLCVvMywlbzMKKwlzdAklbzIsWyVnMSswXQorCWFkZAklbzcsOCwlbzcKKwlicm56LHB0CSVvNywuTHN1YgorCXN0CSVvMyxbJWcxKzRdCisJc3ViYwkkY2FycnksMCwlZzQKKwlzdWIJJWcwLCRudW0sJW83CQkhIG49LW51bQorCWJhCS5MY29weQorCW5vcAorCisuYWxpZ24JMzIKKy5MY29weToKKwlsZHgJWyR0cCslbzddLCVvMAorCWFkZAkkcnAsJW83LCVnMQorCWxkCVslZzErMF0sJW8yCisJbGQJWyVnMSs0XSwlbzMKKwlzdHgJJWcwLFskdHArJW83XQorCWFuZAklbzAsJWc0LCVvMAorCXNybHgJJW8wLDMyLCVvMQorCWFuZG4JJW8yLCVnNCwlbzIKKwlhbmRuCSVvMywlZzQsJW8zCisJb3IJJW8yLCVvMCwlbzAKKwlvcgklbzMsJW8xLCVvMQorCXN0CSVvMCxbJWcxKzBdCisJYWRkCSVvNyw4LCVvNworCWJybnoscHQJJW83LC5MY29weQorCXN0CSVvMSxbJWcxKzRdCisJc3ViCSVnMCwkbnVtLCVvNwkJISBuPS1udW0KKworLkx6YXA6CisJc3R4CSVnMCxbJGFwX2wrJW83XQorCXN0eAklZzAsWyRhcF9oKyVvN10KKwlzdHgJJWcwLFskbnBfbCslbzddCisJc3R4CSVnMCxbJG5wX2grJW83XQorCWFkZAklbzcsOCwlbzcKKwlicm56LHB0CSVvNywuTHphcAorCW5vcAorCisJbGR4CVslc3ArJGJpYXMrJGZyYW1lKzQ4XSwlbzcKKwl3cgklZzAsJW83LCVhc2kJCSEgcmVzdG9yZSAlYXNpCisKKwltb3YJMSwlaTAKKy5McmV0OgorCXJldAorCXJlc3RvcmUKKy50eXBlICAgJGZuYW1lLCNmdW5jdGlvbgorLnNpemUJJGZuYW1lLCguLSRmbmFtZSkKKy5hc2NpegkiTW9udGdvbWVyeSBNdWx0aXBsdGljYXRpb24gZm9yIFVsdHJhU1BBUkMsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24JMzIKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsKCQxKS9nZW07CisKKyMgQmVsb3cgc3Vic3RpdHV0aW9uIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgd2l0aG91dCBkZW1hbmRpbmcKKyMgVklTIGV4dGVudGlvbnMgb24gY29tbWFuZCBsaW5lLCBlLmcuIC14YXJjaD12OSB2cy4gLXhhcmNoPXY5YS4gSQorIyBkYXJlIHRvIGRvIHRoaXMsIGJlY2F1c2UgVklTIGNhcGFiaWxpdHkgaXMgZGV0ZWN0ZWQgYXQgcnVuLXRpbWUgbm93CisjIGFuZCB0aGlzIHJvdXRpbmUgaXMgbm90IGNhbGxlZCBvbiBDUFUgbm90IGNhcGFibGUgdG8gZXhlY3V0ZSBpdC4gRG8KKyMgbm90ZSB0aGF0IGZ6ZXJvcyBpcyBub3QgdGhlIG9ubHkgVklTIGRlcGVuZGVuY3khIEFub3RoZXIgZGVwZW5kZW5jeQorIyBpcyBpbXBsaWNpdCBhbmQgaXMganVzdCBfYV8gbnVtZXJpY2FsIHZhbHVlIGxvYWRlZCB0byAlYXNpIHJlZ2lzdGVyLAorIyB3aGljaCBhc3NlbWJsZXIgY2FuJ3QgcmVjb2duaXplIGFzIFZJUyBzcGVjaWZpYy4uLgorJGNvZGUgPX4gcy9memVyb3NccyslZihbMC05XSspLworCSAgIHNwcmludGYoIi53b3JkXHQweCV4XHQhIGZ6ZXJvcyAlJWYlZCIsMHg4MWIwMGMyMHwoJDE8PDI1KSwkMSkKKwkgIC9nZW07CisKK3ByaW50ICRjb2RlOworIyBmbHVzaAorY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS92aWEtbW9udC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vdmlhLW1vbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0NmE1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vdmlhLW1vbnQucGwKQEAgLTAsMCArMSwyNDIgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFdyYXBwZXIgYXJvdW5kICdyZXAgbW9udG11bCcsIFZJQS1zcGVjaWZpYyBpbnN0cnVjdGlvbiBhY2Nlc3NpbmcKKyMgUGFkTG9jayBNb250Z29tZXJ5IE11bHRpcGxpZXIuIFRoZSB3cmFwcGVyIGlzIGRlc2lnbmVkIGFzIGRyb3AtaW4KKyMgcmVwbGFjZW1lbnQgZm9yIE9wZW5TU0wgYm5fbXVsX21vbnQgW2ZpcnN0IGltcGxlbWVudGVkIGluIDAuOS45XS4KKyMKKyMgQmVsb3cgYXJlIGludGVybGVhdmVkIG91dHB1dHMgZnJvbSAnb3BlbnNzbCBzcGVlZCByc2EgZHNhJyBmb3IgNAorIyBkaWZmZXJlbnQgc29mdHdhcmUgY29uZmlndXJhdGlvbnMgb24gMS41R0h6IFZJQSBFc3RoZXIgcHJvY2Vzc29yLgorIyBMaW5lcyBtYXJrZWQgd2l0aCAic29mdHdhcmUgaW50ZWdlciIgZGVub3RlIHBlcmZvcm1hbmNlIG9mIGhhbmQtCisjIGNvZGVkIGludGVnZXItb25seSBhc3NlbWJsZXIgZm91bmQgaW4gT3BlblNTTCAwLjkuNy4gIlNvZnR3YXJlIFNTRTIiCisjIHJlZmVycyB0byBoYW5kLWNvZGVkIFNTRTIgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBwcm9jZWR1cmUgZm91bmQKKyMgT3BlblNTTCAwLjkuOS4gIkhhcmR3YXJlIFZJQSBTREsiIHJlZmVycyB0byBwYWRsb2NrX3BtbSByb3V0aW5lIGZyb20KKyMgUGFkbG9jayBTREsgMi4wLjEgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIFZJQSwgd2hpY2ggbmF0dXJhbGx5CisjIHV0aWxpemVzIHRoZSBtYWdpYyAncmVweiBtb250bXVsJyBpbnN0cnVjdGlvbi4gQW5kIGZpbmFsbHkgImhhcmR3YXJlCisjIHRoaXMiIHJlZmVycyB0byAqdGhpcyogaW1wbGVtZW50YXRpb24gd2hpY2ggYWxzbyB1c2VzICdyZXB6IG1vbnRtdWwnCisjCisjICAgICAgICAgICAgICAgICAgIHNpZ24gICAgdmVyaWZ5ICAgIHNpZ24vcyB2ZXJpZnkvcworIyByc2EgIDUxMiBiaXRzIDAuMDAxNzIwcyAwLjAwMDE0MHMgICAgNTgxLjQgICA3MTQ5LjcJc29mdHdhcmUgaW50ZWdlcgorIyByc2EgIDUxMiBiaXRzIDAuMDAwNjkwcyAwLjAwMDA4NnMgICAxNDUwLjMgIDExNjA2LjAJc29mdHdhcmUgU1NFMgorIyByc2EgIDUxMiBiaXRzIDAuMDA2MTM2cyAwLjAwMDIwMXMgICAgMTYzLjAgICA0OTc0LjUJaGFyZHdhcmUgVklBIFNESworIyByc2EgIDUxMiBiaXRzIDAuMDAwNzEycyAwLjAwMDA1MHMgICAxNDA0LjkgIDE5ODU4LjUJaGFyZHdhcmUgdGhpcworIworIyByc2EgMTAyNCBiaXRzIDAuMDA4NTE4cyAwLjAwMDQxM3MgICAgMTE3LjQgICAyNDIwLjgJc29mdHdhcmUgaW50ZWdlcgorIyByc2EgMTAyNCBiaXRzIDAuMDA0Mjc1cyAwLjAwMDI3N3MgICAgMjMzLjkgICAzNjA5LjcJc29mdHdhcmUgU1NFMgorIyByc2EgMTAyNCBiaXRzIDAuMDEyMTM2cyAwLjAwMDI2MHMgICAgIDgyLjQgICAzODQ0LjUJaGFyZHdhcmUgVklBIFNESworIyByc2EgMTAyNCBiaXRzIDAuMDAyNTIycyAwLjAwMDExNnMgICAgMzk2LjUgICA4NjUwLjkJaGFyZHdhcmUgdGhpcworIworIyByc2EgMjA0OCBiaXRzIDAuMDUwMTAxcyAwLjAwMTM3MXMgICAgIDIwLjAgICAgNzI5LjYJc29mdHdhcmUgaW50ZWdlcgorIyByc2EgMjA0OCBiaXRzIDAuMDMwMjczcyAwLjAwMTAwOHMgICAgIDMzLjAgICAgOTkxLjkJc29mdHdhcmUgU1NFMgorIyByc2EgMjA0OCBiaXRzIDAuMDMwODMzcyAwLjAwMDk3NnMgICAgIDMyLjQgICAxMDI1LjEJaGFyZHdhcmUgVklBIFNESworIyByc2EgMjA0OCBiaXRzIDAuMDExODc5cyAwLjAwMDM0MnMgICAgIDg0LjIgICAyOTIxLjcJaGFyZHdhcmUgdGhpcworIworIyByc2EgNDA5NiBiaXRzIDAuMzI3MDk3cyAwLjAwNDg1OXMgICAgICAzLjEgICAgMjA1LjgJc29mdHdhcmUgaW50ZWdlcgorIyByc2EgNDA5NiBiaXRzIDAuMjI5MzE4cyAwLjAwMzg1OXMgICAgICA0LjQgICAgMjU5LjIJc29mdHdhcmUgU1NFMgorIyByc2EgNDA5NiBiaXRzIDAuMjMzOTUzcyAwLjAwMzI3NHMgICAgICA0LjMgICAgMzA1LjQJaGFyZHdhcmUgVklBIFNESworIyByc2EgNDA5NiBiaXRzIDAuMDcwNDkzcyAwLjAwMTE2NnMgICAgIDE0LjIgICAgODU3LjYJaGFyZHdhcmUgdGhpcworIworIyBkc2EgIDUxMiBiaXRzIDAuMDAxMzQycyAwLjAwMTY1MXMgICAgNzQ1LjIgICAgNjA1LjcJc29mdHdhcmUgaW50ZWdlcgorIyBkc2EgIDUxMiBiaXRzIDAuMDAwODQ0cyAwLjAwMDk4N3MgICAxMTg1LjMgICAxMDEzLjEJc29mdHdhcmUgU1NFMgorIyBkc2EgIDUxMiBiaXRzIDAuMDAxOTAycyAwLjAwMjI0N3MgICAgNTI1LjYgICAgNDQ0LjkJaGFyZHdhcmUgVklBIFNESworIyBkc2EgIDUxMiBiaXRzIDAuMDAwNDU4cyAwLjAwMDUyNHMgICAyMTgyLjIgICAxOTA5LjEJaGFyZHdhcmUgdGhpcworIworIyBkc2EgMTAyNCBiaXRzIDAuMDAzOTY0cyAwLjAwNDkyNnMgICAgMjUyLjMgICAgMjAzLjAJc29mdHdhcmUgaW50ZWdlcgorIyBkc2EgMTAyNCBiaXRzIDAuMDAyNjg2cyAwLjAwMzE2NnMgICAgMzcyLjMgICAgMzE1LjgJc29mdHdhcmUgU1NFMgorIyBkc2EgMTAyNCBiaXRzIDAuMDAyMzk3cyAwLjAwMjgyM3MgICAgNDE3LjEgICAgMzU0LjMJaGFyZHdhcmUgVklBIFNESworIyBkc2EgMTAyNCBiaXRzIDAuMDAwOTc4cyAwLjAwMTE3MHMgICAxMDIyLjIgICAgODU1LjAJaGFyZHdhcmUgdGhpcworIworIyBkc2EgMjA0OCBiaXRzIDAuMDEzMjgwcyAwLjAxNjUxOHMgICAgIDc1LjMgICAgIDYwLjUJc29mdHdhcmUgaW50ZWdlcgorIyBkc2EgMjA0OCBiaXRzIDAuMDA5OTExcyAwLjAxMTUyMnMgICAgMTAwLjkgICAgIDg2LjgJc29mdHdhcmUgU1NFMgorIyBkc2EgMjA0OCBiaXRzIDAuMDA5NTQycyAwLjAxMTc2M3MgICAgMTA0LjggICAgIDg1LjAJaGFyZHdhcmUgVklBIFNESworIyBkc2EgMjA0OCBiaXRzIDAuMDAyODg0cyAwLjAwMzM1MnMgICAgMzQ2LjggICAgMjk4LjMJaGFyZHdhcmUgdGhpcworIworIyBUbyBnaXZlIHlvdSBzb21lIG90aGVyIHJlZmVyZW5jZSBwb2ludCBoZXJlIGlzIG91dHB1dCBmb3IgMi40R0h6IFA0CisjIHJ1bm5pbmcgaGFuZC1jb2RlZCBTU0UyIGJuX211bF9tb250IGZvdW5kIGluIDAuOS45LCBpLmUuICJzb2Z0d2FyZQorIyBTU0UyIiBpbiBhYm92ZSB0ZXJtcy4KKyMKKyMgcnNhICA1MTIgYml0cyAwLjAwMDQwN3MgMC4wMDAwNDdzICAgMjQ1NC4yICAyMTEzNy4wCisjIHJzYSAxMDI0IGJpdHMgMC4wMDI0MjZzIDAuMDAwMTQxcyAgICA0MTIuMSAgIDcxMDAuMAorIyByc2EgMjA0OCBiaXRzIDAuMDE1MDQ2cyAwLjAwMDQ5MXMgICAgIDY2LjUgICAyMDM0LjkKKyMgcnNhIDQwOTYgYml0cyAwLjEwOTc3MHMgMC4wMDIzNzlzICAgICAgOS4xICAgIDQyMC4zCisjIGRzYSAgNTEyIGJpdHMgMC4wMDA0MzhzIDAuMDAwNTI1cyAgIDIyODEuMSAgIDE5MDQuMQorIyBkc2EgMTAyNCBiaXRzIDAuMDAxMzQ2cyAwLjAwMTU5NXMgICAgNzQyLjcgICAgNjI3LjAKKyMgZHNhIDIwNDggYml0cyAwLjAwNDc0NXMgMC4wMDU1ODJzICAgIDIxMC43ICAgIDE3OS4xCisjCisjIENvbmNsdXNpb25zOiAKKyMgLSBWSUEgU0RLIGxlYXZlcyBhICpsb3QqIG9mIHJvb20gZm9yIGltcHJvdmVtZW50ICh3aGljaCB0aGlzCisjICAgaW1wbGVtZW50YXRpb24gc3VjY2Vzc2Z1bGx5IGZpbGxzOi0pOworIyAtICdyZXAgbW9udG11bCcgZ2l2ZXMgdXAgdG8gPjN4IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGRlcGVuZGluZyBvbgorIyAgIGtleSBsZW5ndGg7CisjIC0gaW4gdGVybXMgb2YgYWJzb2x1dGUgcGVyZm9ybWFuY2UgaXQgZGVsaXZlcnMgYXBwcm94aW1hdGVseSBhcyBtdWNoCisjICAgYXMgbW9kZXJuIG91dC1vZi1vcmRlciAzMi1iaXQgY29yZXMgW2FnYWluLCBmb3IgbG9uZ2VyIGtleXNdLgorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sInZpYS1tb250LnBsIik7CisKKyMgaW50IGJuX211bF9tb250KEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsIGNvbnN0IEJOX1VMT05HICpucCxjb25zdCBCTl9VTE9ORyAqbjAsIGludCBudW0pOworJGZ1bmM9ImJuX211bF9tb250X3BhZGxvY2siOworCiskcGFkPTE2KjE7CSMgYW1vdW50IG9mIHJlc2VydmVkIGJ5dGVzIG9uIHRvcCBvZiBldmVyeSB2ZWN0b3IKKworIyBzdGFjayBsYXlvdXQKKyRtWmVyb1ByaW1lPSZEV1AoMCwiZXNwIik7CQkjIHRoZXNlIGFyZSBzcGVjaWZpZWQgYnkgVklBCiskQT0mRFdQKDQsImVzcCIpOworJEI9JkRXUCg4LCJlc3AiKTsKKyRUPSZEV1AoMTIsImVzcCIpOworJE09JkRXUCgxNiwiZXNwIik7Ciskc2NyYXRjaD0mRFdQKDIwLCJlc3AiKTsKKyRycD0mRFdQKDI0LCJlc3AiKTsJCQkjIHRoZXNlIGFyZSBtaW5lCiskc3A9JkRXUCgyOCwiZXNwIik7CisjICZEV1AoMzIsImVzcCIpCQkJIyAzMiBieXRlIHNjcmF0Y2ggYXJlYQorIyAmRFdQKDY0Kyg0KiRudW0rJHBhZCkqMCwiZXNwIikJIyBwYWRkZWQgdHBbbnVtXQorIyAmRFdQKDY0Kyg0KiRudW0rJHBhZCkqMSwiZXNwIikJIyBwYWRkZWQgY29weSBvZiBhcFtudW1dCisjICZEV1AoNjQrKDQqJG51bSskcGFkKSoyLCJlc3AiKQkjIHBhZGRlZCBjb3B5IG9mIGJwW251bV0KKyMgJkRXUCg2NCsoNCokbnVtKyRwYWQpKjMsImVzcCIpCSMgcGFkZGVkIGNvcHkgb2YgbnBbbnVtXQorIyBOb3RlIHRoYXQgU0RLIHN1Z2dlc3RzIHRvIHVuY29uZGl0aW9uYWxseSBhbGxvY2F0ZSAySyBwZXIgdmVjdG9yLiBUaGlzCisjIGhhcyBxdWl0ZSBhbiBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuIEl0IG5hdHVyYWxseSBkZXBlbmRzIG9uIGtleSBsZW5ndGgsCisjIGJ1dCB0byBnaXZlIGFuIGV4YW1wbGUgMTAyNCBiaXQgcHJpdmF0ZSBSU0Ega2V5IG9wZXJhdGlvbnMgc3VmZmVyID4zMCUKKyMgcGVuYWx0eS4gSSBhbGxvY2F0ZSBvbmx5IGFzIG11Y2ggYXMgYWN0dWFsbHkgcmVxdWlyZWQuLi4KKworJmZ1bmN0aW9uX2JlZ2luKCRmdW5jKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJm1vdgkoImVjeCIsJndwYXJhbSg1KSk7CSMgbnVtCisJIyBtZWV0IFZJQSdzIGxpbWl0YXRpb25zIGZvciBudW0gW25vdGUgdGhhdCB0aGUgc3BlY2lmaWNhdGlvbgorCSMgZXhwcmVzc2VzIHRoZW0gaW4gYml0cywgd2hpbGUgd2Ugd29yayB3aXRoIGFtb3VudCBvZiAzMi1iaXQgd29yZHNdCisJJnRlc3QJKCJlY3giLDMpOworCSZqbnoJKCZsYWJlbCgibGVhdmUiKSk7CSMgbnVtICUgNCAhPSAwCisJJmNtcAkoImVjeCIsOCk7CisJJmpiCSgmbGFiZWwoImxlYXZlIikpOwkjIG51bSA8IDgKKwkmY21wCSgiZWN4IiwxMDI0KTsKKwkmamEJKCZsYWJlbCgibGVhdmUiKSk7CSMgbnVtID4gMTAyNAorCisJJnB1c2hmCSgpOworCSZjbGQJKCk7CisKKwkmbW92CSgiZWRpIiwmd3BhcmFtKDApKTsJIyBycAorCSZtb3YJKCJlYXgiLCZ3cGFyYW0oMSkpOwkjIGFwCisJJm1vdgkoImVieCIsJndwYXJhbSgyKSk7CSMgYnAKKwkmbW92CSgiZWR4Iiwmd3BhcmFtKDMpKTsJIyBucAorCSZtb3YJKCJlc2kiLCZ3cGFyYW0oNCkpOwkjIG4wCisJJm1vdgkoImVzaSIsJkRXUCgwLCJlc2kiKSk7CSMgKm4wCisKKwkmbGVhCSgiZWN4IiwmRFdQKCRwYWQsIiIsImVjeCIsNCkpOwkjIGVjeCBiZWNvbWVzIHZlY3RvciBzaXplIGluIGJ5dGVzCisJJmxlYQkoImVicCIsJkRXUCg2NCwiIiwiZWN4Iiw0KSk7CSMgYWxsb2NhdGUgNCB2ZWN0b3JzICsgNjQgYnl0ZXMKKwkmbmVnCSgiZWJwIik7CisJJmFkZAkoImVicCIsImVzcCIpOworCSZhbmQJKCJlYnAiLC02NCk7CQkjIGFsaWduIHRvIGNhY2hlLWxpbmUKKwkmeGNoZwkoImVicCIsImVzcCIpOwkJIyBhbGxvY2EKKworCSZtb3YJKCRycCwiZWRpIik7CQkjIHNhdmUgcnAKKwkmbW92CSgkc3AsImVicCIpOwkJIyBzYXZlIGVzcAorCisJJm1vdgkoJG1aZXJvUHJpbWUsImVzaSIpOworCSZsZWEJKCJlc2kiLCZEV1AoNjQsImVzcCIpKTsJIyB0cAorCSZtb3YJKCRULCJlc2kiKTsKKwkmbGVhCSgiZWRpIiwmRFdQKDMyLCJlc3AiKSk7CSMgc2NyYXRjaCBhcmVhCisJJm1vdgkoJHNjcmF0Y2gsImVkaSIpOworCSZtb3YJKCJlc2kiLCJlYXgiKTsKKworCSZsZWEJKCJlYnAiLCZEV1AoLSRwYWQsImVjeCIpKTsKKwkmc2hyCSgiZWJwIiwyKTsJCSMgcmVzdG9yZSBvcmlnaW5hbCBudW0gdmFsdWUgaW4gZWJwCisKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisKKwkmbW92CSgiZWN4IiwiZWJwIik7CisJJmxlYQkoImVjeCIsJkRXUCgoMzIrJHBhZCkvNCwiZWN4IikpOyMgcGFkZGVkIHRwICsgc2NyYXRjaAorCSZkYXRhX2J5dGUoMHhmMywweGFiKTsJCSMgcmVwIHN0b3NsLCBiemVybworCisJJm1vdgkoImVjeCIsImVicCIpOworCSZsZWEJKCJlZGkiLCZEV1AoNjQrJHBhZCwiZXNwIiwiZWN4Iiw0KSk7IyBwb2ludGVyIHRvIGFwIGNvcHkKKwkmbW92CSgkQSwiZWRpIik7CisJJmRhdGFfYnl0ZSgweGYzLDB4YTUpOwkJIyByZXAgbW92c2wsIG1lbWNweQorCSZtb3YJKCJlY3giLCRwYWQvNCk7CisJJmRhdGFfYnl0ZSgweGYzLDB4YWIpOwkJIyByZXAgc3Rvc2wsIGJ6ZXJvIHBhZAorCSMgZWRpIHBvaW50cyBhdCB0aGUgZW5kIG9mIHBhZGRlZCBhcCBjb3B5Li4uCisKKwkmbW92CSgiZWN4IiwiZWJwIik7CisJJm1vdgkoImVzaSIsImVieCIpOworCSZtb3YJKCRCLCJlZGkiKTsKKwkmZGF0YV9ieXRlKDB4ZjMsMHhhNSk7CQkjIHJlcCBtb3ZzbCwgbWVtY3B5CisJJm1vdgkoImVjeCIsJHBhZC80KTsKKwkmZGF0YV9ieXRlKDB4ZjMsMHhhYik7CQkjIHJlcCBzdG9zbCwgYnplcm8gcGFkCisJIyBlZGkgcG9pbnRzIGF0IHRoZSBlbmQgb2YgcGFkZGVkIGJwIGNvcHkuLi4KKworCSZtb3YJKCJlY3giLCJlYnAiKTsKKwkmbW92CSgiZXNpIiwiZWR4Iik7CisJJm1vdgkoJE0sImVkaSIpOworCSZkYXRhX2J5dGUoMHhmMywweGE1KTsJCSMgcmVwIG1vdnNsLCBtZW1jcHkKKwkmbW92CSgiZWN4IiwkcGFkLzQpOworCSZkYXRhX2J5dGUoMHhmMywweGFiKTsJCSMgcmVwIHN0b3NsLCBiemVybyBwYWQKKwkjIGVkaSBwb2ludHMgYXQgdGhlIGVuZCBvZiBwYWRkZWQgbnAgY29weS4uLgorCisJIyBsZXQgbWFnaWMgaGFwcGVuLi4uCisJJm1vdgkoImVjeCIsImVicCIpOworCSZtb3YJKCJlc2kiLCJlc3AiKTsKKwkmc2hsCSgiZWN4Iiw1KTsJCSMgY29udmVydCB3b3JkIGNvdW50ZXIgdG8gYml0IGNvdW50ZXIKKwkmYWxpZ24JKDQpOworCSZkYXRhX2J5dGUoMHhmMywweDBmLDB4YTYsMHhjMCk7IyByZXAgbW9udG11bAorCisJJm1vdgkoImVjeCIsImVicCIpOworCSZsZWEJKCJlc2kiLCZEV1AoNjQsImVzcCIpKTsJCSMgdHAKKwkjIGVkaSBzdGlsbCBwb2ludHMgYXQgdGhlIGVuZCBvZiBwYWRkZWQgbnAgY29weS4uLgorCSZuZWcJKCJlYnAiKTsKKwkmbGVhCSgiZWJwIiwmRFdQKC0kcGFkLCJlZGkiLCJlYnAiLDQpKTsJIyBzbyBqdXN0ICJyZXdpbmQiCisJJm1vdgkoImVkaSIsJHJwKTsJCQkjIHJlc3RvcmUgcnAKKwkmeG9yCSgiZWR4IiwiZWR4Iik7CQkJIyBpPTAgYW5kIGNsZWFyIENGCisKKyZzZXRfbGFiZWwoInN1YiIsOCk7CisJJm1vdgkoImVheCIsJkRXUCgwLCJlc2kiLCJlZHgiLDQpKTsKKwkmc2JiCSgiZWF4IiwmRFdQKDAsImVicCIsImVkeCIsNCkpOworCSZtb3YJKCZEV1AoMCwiZWRpIiwiZWR4Iiw0KSwiZWF4Iik7CSMgcnBbaV09dHBbaV0tbnBbaV0KKwkmbGVhCSgiZWR4IiwmRFdQKDEsImVkeCIpKTsJCSMgaSsrCisJJmxvb3AJKCZsYWJlbCgic3ViIikpOwkJIyBkb2Vzbid0IGFmZmVjdCBDRiEKKworCSZtb3YJKCJlYXgiLCZEV1AoMCwiZXNpIiwiZWR4Iiw0KSk7CSMgdXBtb3N0IG92ZXJmbG93IGJpdAorCSZzYmIJKCJlYXgiLDApOworCSZhbmQJKCJlc2kiLCJlYXgiKTsKKwkmbm90CSgiZWF4Iik7CisJJm1vdgkoImVicCIsImVkaSIpOworCSZhbmQJKCJlYnAiLCJlYXgiKTsKKwkmb3IJKCJlc2kiLCJlYnAiKTsJCQkjIHRwPWNhcnJ5P3RwOnJwCisKKwkmbW92CSgiZWN4IiwiZWR4Iik7CQkJIyBudW0KKwkmeG9yCSgiZWR4IiwiZWR4Iik7CQkJIyBpPTAKKworJnNldF9sYWJlbCgiY29weSIsOCk7CisJJm1vdgkoImVheCIsJkRXUCgwLCJlc2kiLCJlZHgiLDQpKTsKKwkmbW92CSgmRFdQKDY0LCJlc3AiLCJlZHgiLDQpLCJlY3giKTsJIyB6YXAgdHAKKwkmbW92CSgmRFdQKDAsImVkaSIsImVkeCIsNCksImVheCIpOworCSZsZWEJKCJlZHgiLCZEV1AoMSwiZWR4IikpOwkJIyBpKysKKwkmbG9vcAkoJmxhYmVsKCJjb3B5IikpOworCisJJm1vdgkoImVicCIsJHNwKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisKKwkmbW92CSgiZWN4Iiw2NC80KTsKKwkmbW92CSgiZWRpIiwiZXNwIik7CQkjIHphcCBmcmFtZSBpbmNsdWRpbmcgc2NyYXRjaCBhcmVhCisJJmRhdGFfYnl0ZSgweGYzLDB4YWIpOwkJIyByZXAgc3Rvc2wsIGJ6ZXJvCisKKwkjIHphcCBjb3BpZXMgb2YgYXAsIGJwIGFuZCBucAorCSZsZWEJKCJlZGkiLCZEV1AoNjQrJHBhZCwiZXNwIiwiZWR4Iiw0KSk7IyBwb2ludGVyIHRvIGFwCisJJmxlYQkoImVjeCIsJkRXUCgzKiRwYWQvNCwiZWR4IiwiZWR4IiwyKSk7CisJJmRhdGFfYnl0ZSgweGYzLDB4YWIpOwkJIyByZXAgc3Rvc2wsIGJ6ZXJvCisKKwkmbW92CSgiZXNwIiwiZWJwIik7CisJJmluYwkoImVheCIpOwkJIyBzaWduYWwgImRvbmUiCisJJnBvcGYJKCk7Cismc2V0X2xhYmVsKCJsZWF2ZSIpOworJmZ1bmN0aW9uX2VuZCgkZnVuYyk7CisKKyZhc2NpeigiUGFkbG9jayBNb250Z29tZXJ5IE11bHRpcGxpY2F0aW9uLCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+Iik7CisKKyZhc21fZmluaXNoKCk7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3Ztcy5tYXIgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3Ztcy5tYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmYWIxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20vdm1zLm1hcgpAQCAtMCwwICsxLDY0NDAgQEAKKwkudGl0bGUJdmF4X2JuX211bF9hZGRfd29yZHMgIHVuc2lnbmVkIG11bHRpcGx5ICYgYWRkLCAzMiozMiszMiszMj0+NjQKKzsKKzsgdy5qLm0uIDE1LWphbi0xOTk5Cis7Cis7IGl0J3MgbWFnaWMgLi4uCis7Cis7IFVMT05HIGJuX211bF9hZGRfd29yZHMoVUxPTkcgcltdLFVMT05HIGFbXSxpbnQgbixVTE9ORyB3KSB7Cis7CVVMT05HIGMgPSAwOworOwlpbnQgaTsKKzsJZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSA8YyxyW2ldPiA6PSByW2ldICsgYyArIGFbaV0gKiB3IDsKKzsJcmV0dXJuIGM7Cis7IH0KKworcj00IDsoQVApCithPTggOyhBUCkKK249MTIgOyhBUCkJbglieSB2YWx1ZSAoaW5wdXQpCit3PTE2IDsoQVApCXcJYnkgdmFsdWUgKGlucHV0KQorCisKKwkucHNlY3QJY29kZSxub3dydAorCisuZW50cnkJYm5fbXVsX2FkZF93b3JkcyxebTxyMixyMyxyNCxyNSxyNj4KKworCW1vdmFsCUByKGFwKSxyMgorCW1vdmFsCUBhKGFwKSxyMworCW1vdmwJbihhcCkscjQJOyBhc3N1bWVkID4wIGJ5IEMgY29kZQorCW1vdmwJdyhhcCkscjUKKwljbHJsCXI2CQk7IGMKKworMCQ6CisJZW11bAlyNSwocjMpLChyMikscjAJCTsgdywgYVtdLCByW10gY29uc2lkZXJlZCBzaWduZWQKKworCTsgZml4dXAgZm9yICJuZWdhdGl2ZSIgcltdCisJdHN0bAkocjIpCisJYmdlcQkxMCQKKwlpbmNsCXIxCisxMCQ6CisKKwk7IGFkZCBpbiBjCisJYWRkbDIJcjYscjAKKwlhZHdjCSMwLHIxCisKKwk7IGNvbWJpbmVkIGZpeHVwIGZvciAibmVnYXRpdmUiIHcsIGFbXQorCXRzdGwJcjUKKwliZ2VxCTIwJAorCWFkZGwyCShyMykscjEKKzIwJDoKKwl0c3RsCShyMykKKwliZ2VxCTMwJAorCWFkZGwyCXI1LHIxCiszMCQ6CisKKwltb3ZsCXIwLChyMikrCQk7IHN0b3JlIGxvIHJlc3VsdCBpbiByW10gJiBhZHZhbmNlCisJYWRkbAkjNCxyMwkJCTsgYWR2YW5jZSBhW10KKwltb3ZsCXIxLHI2CQkJOyBzdG9yZSBoaSByZXN1bHQgPT4gYworCisJc29iZ3RyCXI0LDAkCisKKwltb3ZsCXI2LHIwCQkJOyByZXR1cm4gYworCXJldAorDAorCS50aXRsZQl2YXhfYm5fbXVsX3dvcmRzICB1bnNpZ25lZCBtdWx0aXBseSAmIGFkZCwgMzIqMzIrMzI9PjY0Cis7Cis7IHcuai5tLiAxNS1qYW4tMTk5OQorOworOyBpdCdzIG1hZ2ljIC4uLgorOworOyBVTE9ORyBibl9tdWxfd29yZHMoVUxPTkcgcltdLFVMT05HIGFbXSxpbnQgbixVTE9ORyB3KSB7Cis7CVVMT05HIGMgPSAwOworOwlpbnQgaTsKKzsJZm9yKGkgPSAwOyBpIDwgbnVtOyBpKyspIDxjLHJbaV0+IDo9IGFbaV0gKiB3ICsgYyA7Cis7CXJldHVybihjKTsKKzsgfQorCityPTQgOyhBUCkKK2E9OCA7KEFQKQorbj0xMiA7KEFQKQluCWJ5IHZhbHVlIChpbnB1dCkKK3c9MTYgOyhBUCkJdwlieSB2YWx1ZSAoaW5wdXQpCisKKworCS5wc2VjdAljb2RlLG5vd3J0CisKKy5lbnRyeQlibl9tdWxfd29yZHMsXm08cjIscjMscjQscjUscjY+CisKKwltb3ZhbAlAcihhcCkscjIJOyByMiAtPiByW10KKwltb3ZhbAlAYShhcCkscjMJOyByMyAtPiBhW10KKwltb3ZsCW4oYXApLHI0CTsgcjQgPSBsb29wIGNvdW50IChhc3N1bWVkID4wIGJ5IEMgY29kZSkKKwltb3ZsCXcoYXApLHI1CTsgcjUgPSB3CisJY2xybAlyNgkJOyByNiA9IGMKKworMCQ6CisJOyA8cjEscjA+IDo9IHcgKiBhW10gKyBjCisJZW11bAlyNSwocjMpLHI2LHIwCQk7IHcsIGFbXSwgYyBjb25zaWRlcmVkIHNpZ25lZAorCisJOyBmaXh1cCBmb3IgIm5lZ2F0aXZlIiBjCisJdHN0bAlyNgkJCTsgYworCWJnZXEJMTAkCisJaW5jbAlyMQorMTAkOgorCisJOyBjb21iaW5lZCBmaXh1cCBmb3IgIm5lZ2F0aXZlIiB3LCBhW10KKwl0c3RsCXI1CQkJOyB3CisJYmdlcQkyMCQKKwlhZGRsMgkocjMpLHIxCQkJOyBhW10KKzIwJDoKKwl0c3RsCShyMykJCQk7IGFbXQorCWJnZXEJMzAkCisJYWRkbDIJcjUscjEJCQk7IHcKKzMwJDoKKworCW1vdmwJcjAsKHIyKSsJCTsgc3RvcmUgbG8gcmVzdWx0IGluIHJbXSAmIGFkdmFuY2UKKwlhZGRsCSM0LHIzCQkJOyBhZHZhbmNlIGFbXQorCW1vdmwJcjEscjYJCQk7IHN0b3JlIGhpIHJlc3VsdCA9PiBjCisKKwlzb2JndHIJcjQsMCQKKworCW1vdmwJcjYscjAJCQk7IHJldHVybiBjCisJcmV0CisMCisJLnRpdGxlCXZheF9ibl9zcXJfd29yZHMgIHVuc2lnbmVkIHNxdWFyZSwgMzIqMzI9PjY0Cis7Cis7IHcuai5tLiAxNS1qYW4tMTk5OQorOworOyBpdCdzIG1hZ2ljIC4uLgorOworOyB2b2lkIGJuX3Nxcl93b3JkcyhVTE9ORyByW10sVUxPTkcgYVtdLGludCBuKSB7Cis7CWludCBpOworOwlmb3IoaSA9IDA7IGkgPCBuOyBpKyspIDxyWzIqaSsxXSxyWzIqaV0+IDo9IGFbaV0gKiBhW2ldIDsKKzsgfQorCityPTQgOyhBUCkKK2E9OCA7KEFQKQorbj0xMiA7KEFQKQluCWJ5IHZhbHVlIChpbnB1dCkKKworCisJLnBzZWN0CWNvZGUsbm93cnQKKworLmVudHJ5CWJuX3Nxcl93b3JkcyxebTxyMixyMyxyNCxyNT4KKworCW1vdmFsCUByKGFwKSxyMgk7IHIyIC0+IHJbXQorCW1vdmFsCUBhKGFwKSxyMwk7IHIzIC0+IGFbXQorCW1vdmwJbihhcCkscjQJOyByNCA9IG4gKGFzc3VtZWQgPjAgYnkgQyBjb2RlKQorCiswJDoKKwltb3ZsCShyMykrLHI1CQk7IHI1ID0gYVtdICYgYWR2YW5jZQorCisJOyA8cjEscjA+IDo9IGFbXSAqIGFbXQorCWVtdWwJcjUscjUsIzAscjAJCTsgYVtdIGNvbnNpZGVyZWQgc2lnbmVkCisKKwk7IGZpeHVwIGZvciAibmVnYXRpdmUiIGFbXQorCXRzdGwJcjUJCQk7IGFbXQorCWJnZXEJMzAkCisJYWRkbDIJcjUscjEJCQk7IGFbXQorCWFkZGwyCXI1LHIxCQkJOyBhW10KKzMwJDoKKworCW1vdmwJcjAsKHIyKSsJCTsgc3RvcmUgbG8gcmVzdWx0IGluIHJbXSAmIGFkdmFuY2UKKwltb3ZsCXIxLChyMikrCQk7IHN0b3JlIGhpIHJlc3VsdCBpbiByW10gJiBhZHZhbmNlCisKKwlzb2JndHIJcjQsMCQKKworCW1vdmwJIzEscjAJCQk7IHJldHVybiBTUyRfTk9STUFMCisJcmV0CisMCisJLnRpdGxlCXZheF9ibl9kaXZfd29yZHMgIHVuc2lnbmVkIGRpdmlkZQorOworOyBSaWNoYXJkIExldml0dGUgMjAtTm92LTIwMDAKKzsKKzsgVUxPTkcgYm5fZGl2X3dvcmRzKFVMT05HIGgsIFVMT05HIGwsIFVMT05HIGQpCis7IHsKKzsJcmV0dXJuICgoVUxPTkcpKCgoKFVMTE9ORyloKTw8MzIpfGwpIC8gKFVMTE9ORylkKTsKKzsgfQorOworOyBVc2luZyBFRElWIHdvdWxkIGJlIHZlcnkgZWFzeSwgaWYgaXQgZGlkbid0IGRvIHNpZ25lZCBjYWxjdWxhdGlvbnMuCis7IEFueSB0aW1lIGFueSBvZiB0aGUgaW5wdXQgbnVtYmVycyBhcmUgc2lnbmVkLCB0aGVyZSBhcmUgcHJvYmxlbXMsCis7IHVzdWFsbHkgd2l0aCBpbnRlZ2VyIG92ZXJmbG93LCBhdCB3aGljaCBwb2ludCBpdCByZXR1cm5zIHVzZWxlc3MKKzsgZGF0YSAodGhlIHF1b3RpZW50IGdldHMgdGhlIHZhbHVlIG9mIGwsIGFuZCB0aGUgcmVtYWluZGVyIGJlY29tZXMgMCkuCis7Cis7IElmIGl0IHdhcyBqdXN0IGZvciB0aGUgZGl2aWRlbmQsIGl0IHdvdWxkIGJlIHZlcnkgZWFzeSwganVzdCBkaXZpZGUKKzsgaXQgYnkgMiAodW5zaWduZWQpLCBkbyB0aGUgZGl2aXNpb24sIG11bHRpcGx5IHRoZSByZXN1bHRpbmcgcXVvdGllbnQKKzsgYW5kIHJlbWFpbmRlciBieSAyLCBhZGQgdGhlIGJpdCB0aGF0IHdhcyBkcm9wcGVkIHdoZW4gZGl2aWRpbmcgYnkgMgorOyB0byB0aGUgcmVtYWluZGVyLCBhbmQgZG8gc29tZSBhZGp1c3RtZW50IHNvIHRoZSByZW1haW5kZXIgZG9lc24ndAorOyBlbmQgdXAgbGFyZ2VyIHRoYW4gdGhlIGRpdmlzb3IuICBGb3Igc29tZSBjYXNlcyB3aGVuIHRoZSBkaXZpc29yIGlzCis7IG5lZ2F0aXZlIChmcm9tIEVESVYncyBwb2ludCBvZiB2aWV3LCBpLmUuIHdoZW4gdGhlIGhpZ2hlc3QgYml0IGlzIHNldCksCis7IGRpdmlkaW5nIHRoZSBkaXZpZGVuZCBieSAyIGlzbid0IGVub3VnaCwgYW5kIHNpbmNlIHNvbWUgb3BlcmF0aW9ucworOyBtaWdodCBnZW5lcmF0ZSBpbnRlZ2VyIG92ZXJmbG93cyBldmVuIHdoZW4gdGhlIGRpdmlkZW5kIGlzIGRpdmlkZWQgYnkKKzsgNCAod2hlbiB0aGUgaGlnaCBwYXJ0IG9mIHRoZSBzaGlmdGVkIGRvd24gZGl2aWRlbmQgZW5kcyB1cCBiZWluZyBleGFjdGx5Cis7IGhhbGYgb2YgdGhlIGRpdmlzb3IsIHRoZSByZXN1bHQgaXMgdGhlIHF1b3RpZW50IDB4ODAwMDAwMDAsIHdoaWNoIGlzCis7IG5lZ2F0aXZlLi4uKSBpdCBuZWVkcyB0byBiZSBkaXZpZGVkIGJ5IDguICBGdXJ0aGVybW9yZSwgdGhlIGRpdmlzb3IgbmVlZHMKKzsgdG8gYmUgZGl2aWRlZCBieSAyICh1bnNpZ25lZCkgYXMgd2VsbCwgdG8gYXZvaWQgbW9yZSBwcm9ibGVtcyB3aXRoIHRoZSBzaWduLgorOyBJbiB0aGlzIGNhc2UsIGEgbGl0dGxlIGV4dHJhIGZpZGRsaW5nIHdpdGggdGhlIHJlbWFpbmRlciBpcyByZXF1aXJlZC4KKzsKKzsgU28sIHRoZSBzaW1wbGVzdCB3YXkgdG8gaGFuZGxlIHRoaXMgaXMgYWx3YXlzIHRvIGRpdmlkZSB0aGUgZGl2aWRlbmQKKzsgYnkgOCwgYW5kIHRvIGRpdmlkZSB0aGUgZGl2aXNvciBieSAyIGlmIGl0J3MgaGlnaGVzdCBiaXQgaXMgc2V0LgorOyBBZnRlciBFRElWIGhhcyBiZWVuIHVzZWQsIHRoZSBxdW90aWVudCBnZXRzIG11bHRpcGxpZWQgYnkgOCBpZiB0aGUKKzsgb3JpZ2luYWwgZGl2aXNvciB3YXMgcG9zaXRpdmUsIG90aGVyd2lzZSA0LiAgVGhlIHJlbWFpbmRlciwgb2RkbHkKKzsgZW5vdWdoLCBpcyAqYWx3YXlzKiBtdWx0aXBsaWVkIGJ5IDguCis7IE5PVEU6IGluIHRoZSBjYXNlIG1lbnRpb25lZCBhYm92ZSwgd2hlcmUgdGhlIGhpZ2ggcGFydCBvZiB0aGUgc2hpZnRlZAorOyBkb3duIGRpdmlkZW5kIGVuZHMgdXAgYmVpbmcgZXhhY3RseSBoYWxmIHRoZSBzaGlmdGVkIGRvd24gZGl2aXNvciwgd2UKKzsgZW5kIHVwIHdpdGggYSAzMyBiaXQgcXVvdGllbnQuICBUaGF0J3Mgbm8gcHJvYmxlbSBob3dldmVyLCBpdCB1c3VhbGx5Cis7IG1lYW5zIHdlIGhhdmUgZW5kZWQgdXAgd2l0aCBhIHRvbyBsYXJnZSByZW1haW5kZXIgYXMgd2VsbCwgYW5kIHRoZQorOyBwcm9ibGVtIGlzIGZpeGVkIGJ5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIGFsZ29yaXRobSAobmV4dCBwYXJhZ3JhcGgpLgorOworOyBUaGUgcm91dGluZSBlbmRzIHdpdGggY29tcGFyaW5nIHRoZSByZXN1bHRpbmcgcmVtYWluZGVyIHdpdGggdGhlCis7IG9yaWdpbmFsIGRpdmlzb3IgYW5kIGlmIHRoZSByZW1haW5kZXIgaXMgbGFyZ2VyLCBzdWJ0cmFjdCB0aGUKKzsgb3JpZ2luYWwgZGl2aXNvciBmcm9tIGl0LCBhbmQgaW5jcmVhc2UgdGhlIHF1b3RpZW50IGJ5IDEuICBUaGlzIGlzCis7IGRvbmUgdW50aWwgdGhlIHJlbWFpbmRlciBpcyBzbWFsbGVyIHRoYW4gdGhlIGRpdmlzb3IuCis7Cis7IFRoZSBjb21wbGV0ZSBhbGdvcml0aG0gbG9va3MgbGlrZSB0aGlzOgorOworOyBkJyAgICA9IGQKKzsgbCcgICAgPSBsICYgNworOyBbaCxsXSA9IFtoLGxdID4+IDMKKzsgW3Escl0gPSBmbG9vcihbaCxsXSAvIGQpCSMgVGhpcyBpcyB0aGUgRURJViBvcGVyYXRpb24KKzsgaWYgKHEgPCAwKSBxID0gLXEJCSMgSSBkb3VidCB0aGlzIGlzIG5lY2Vzc2FyeSBhbnkgbW9yZQorOworOyByJyAgICA9IHIgPj4gMjkKKzsgaWYgKGQnID49IDApCis7ICAgcScgID0gcSA+PiAyOQorOyAgIHEgICA9IHEgPDwgMworOyBlbHNlCis7ICAgcScgID0gcSA+PiAzMAorOyAgIHEgICA9IHEgPDwgMgorOyByICAgICA9IChyIDw8IDMpICsgbCcKKzsKKzsgaWYgKGQnIDwgMCkKKzsgICB7Cis7ICAgICBbcicscl0gPSBbcicscl0gLSBxCis7ICAgICB3aGlsZSAoW3InLHJdIDwgMCkKKzsgICAgICAgeworOyAgICAgICAgIFtyJyxyXSA9IFtyJyxyXSArIGQKKzsgICAgICAgICBbcScscV0gPSBbcScscV0gLSAxCis7ICAgICAgIH0KKzsgICB9Cis7Cis7IHdoaWxlIChbcicscl0gPj0gZCcpCis7ICAgeworOyAgICAgW3InLHJdID0gW3InLHJdIC0gZCcKKzsgICAgIFtxJyxxXSA9IFtxJyxxXSArIDEKKzsgICB9Cis7Cis7IHJldHVybiBxCisKK2g9NCA7KEFQKQloCWJ5IHZhbHVlIChpbnB1dCkKK2w9OCA7KEFQKQlsCWJ5IHZhbHVlIChpbnB1dCkKK2Q9MTIgOyhBUCkJZAlieSB2YWx1ZSAoaW5wdXQpCisKKztyMiA9IGwsIHEKKztyMyA9IGgsIHIKKztyNCA9IGQKKztyNSA9IGwnCis7cjYgPSByJworO3I3ID0gZCcKKztyOCA9IHEnCisKKwkucHNlY3QJY29kZSxub3dydAorCisuZW50cnkJYm5fZGl2X3dvcmRzLF5tPHIyLHIzLHI0LHI1LHI2LHI3LHI4PgorCW1vdmwJbChhcCkscjIKKwltb3ZsCWgoYXApLHIzCisJbW92bAlkKGFwKSxyNAorCisJYmljbDMJI15YRkZGRkZGRjgscjIscjUgOyBsJyA9IGwgJiA3CisJYmljbDMJI15YMDAwMDAwMDcscjIscjIKKworCWJpY2wzCSNeWEZGRkZGRkY4LHIzLHI2CisJYmljbDMJI15YMDAwMDAwMDcscjMscjMKKyAgICAgICAgCisJYWRkbAlyNixyMgorCisJcm90bAkjLTMscjIscjIJOyBsID0gbCA+PiAzCisJcm90bAkjLTMscjMscjMJOyBoID0gaCA+PiAzCisgICAgICAgICAgICAgICAgCisJbW92bAlyNCxyNwkJOyBkJyA9IGQKKworCW1vdmwJIzAscjYJCTsgcicgPSAwCisJbW92bAkjMCxyOAkJOyBxJyA9IDAKKworCXRzdGwJcjQKKwliZXFsCTY2NiQJCTsgVWgtb2gsIHRoZSBkaXZpc29yIGlzIDAuLi4KKwliZ3RyCTEkCisJcm90bAkjLTEscjQscjQJOyBJZiBkIGlzIG5lZ2F0aXZlLCBzaGlmdCBpdCByaWdodC4KKwliaWNsMgkjXlg4MDAwMDAwMCxyNAk7IFNpbmNlIGQgaXMgdGhlbiBhIGxhcmdlIG51bWJlciwgdGhlCisJCQkJOyBsb3dlc3QgYml0IGlzIGluc2lnbmlmaWNhbnQKKwkJCQk7IChjb250cmFkaWN0IHRoYXQsIGFuZCBJJ2xsIGZpeCB0aGUgcHJvYmxlbSEpCisxJDogICAgIAorCWVkaXYJcjQscjIscjIscjMJOyBEbyB0aGUgYWN0dWFsIGRpdmlzaW9uCisKKwl0c3RsCXIyCisJYmdlcQkzJAorCW1uZWdsCXIyLHIyCQk7IGlmIHEgPCAwLCBuZWdhdGUgaXQKKzMkOiAgICAgCisJdHN0bAlyNworCWJsc3MJNCQKKwlyb3RsCSMzLHIyLHIyCTsgICBxID0gcSA8PCAzCisJYmljbDMJI15YRkZGRkZGRjgscjIscjggOyAgICBxJyBnZXRzIHRoZSBoaWdoIGJpdHMgZnJvbSBxCisJYmljbDMJI15YMDAwMDAwMDcscjIscjIKKwlic2IJNDEkCis0JDoJCQkJOyBlbHNlCisJcm90bAkjMixyMixyMgk7ICAgcSA9IHEgPDwgMgorCWJpY2wzCSNeWEZGRkZGRkZDLHIyLHI4IDsgICBxJyBnZXRzIHRoZSBoaWdoIGJpdHMgZnJvbSBxCisJYmljbDMJI15YMDAwMDAwMDMscjIscjIKKzQxJDoKKwlyb3RsCSMzLHIzLHIzCTsgciA9IHIgPDwgMworCWJpY2wzCSNeWEZGRkZGRkY4LHIzLHI2IDsgcicgZ2V0cyB0aGUgaGlnaCBiaXRzIGZyb20gcgorCWJpY2wzCSNeWDAwMDAwMDA3LHIzLHIzCisJYWRkbAlyNSxyMwkJOyByID0gciArIGwnCisKKwl0c3RsCXI3CisJYmdlcQk1JAorCWJpdGwJIzEscjcKKwliZXFsCTUkCQk7IGlmIGQnIDwgMCAmJiBkJyAmIDEKKwlzdWJsCXIyLHIzCQk7ICAgW3InLHJdID0gW3InLHJdIC0gW3EnLHFdCisJc2J3YwlyOCxyNgorNDUkOgorCWJnZXEJNSQJCTsgICB3aGlsZSByIDwgMAorCWRlY2wJcjIJCTsgICAgIFtxJyxxXSA9IFtxJyxxXSAtIDEKKwlzYndjCSMwLHI4CisJYWRkbAlyNyxyMwkJOyAgICAgW3InLHJdID0gW3InLHJdICsgZCcKKwlhZHdjCSMwLHI2CisJYnJiCTQ1JAorCis7IFRoZSByZXR1cm4gcG9pbnRzIGFyZSBwbGFjZWQgaW4gdGhlIG1pZGRsZSB0byBrZWVwIGEgc2hvcnQgZGlzdGFuY2UgZnJvbQorOyBhbGwgdGhlIGJyYW5jaCBwb2ludHMKKzQyJDoKKzsJbW92bAlyMyxyMQorCW1vdmwJcjIscjAKKwlyZXQKKzY2NiQ6CisJbW92bAkjXlhGRkZGRkZGRixyMAorCXJldAorCis1JDoKKwl0c3RsCXI2CisJYm5lcQk2JAorCWNtcGwJcjMscjcKKwlibHNzdQk0MiQJCTsgd2hpbGUgW3InLHJdID49IGQnCis2JDoKKwlzdWJsCXI3LHIzCQk7ICAgW3InLHJdID0gW3InLHJdIC0gZCcKKwlzYndjCSMwLHI2CisJaW5jbAlyMgkJOyAgIFtxJyxxXSA9IFtxJyxxXSArIDEKKwlhZHdjCSMwLHI4CisJYnJiCTUkCQorDAorCS50aXRsZQl2YXhfYm5fYWRkX3dvcmRzICB1bnNpZ25lZCBhZGQgb2YgdHdvIGFycmF5cworOworOyBSaWNoYXJkIExldml0dGUgMjAtTm92LTIwMDAKKzsKKzsgVUxPTkcgYm5fYWRkX3dvcmRzKFVMT05HIHJbXSwgVUxPTkcgYVtdLCBVTE9ORyBiW10sIGludCBuKSB7Cis7CVVMT05HIGMgPSAwOworOwlpbnQgaTsKKzsJZm9yIChpID0gMDsgaSA8IG47IGkrKykgPGMscltpXT4gPSBhW2ldICsgYltpXSArIGM7Cis7CXJldHVybihjKTsKKzsgfQorCityPTQgOyhBUCkJcglieSByZWZlcmVuY2UgKG91dHB1dCkKK2E9OCA7KEFQKQlhCWJ5IHJlZmVyZW5jZSAoaW5wdXQpCitiPTEyIDsoQVApCWIJYnkgcmVmZXJlbmNlIChpbnB1dCkKK249MTYgOyhBUCkJbglieSB2YWx1ZSAoaW5wdXQpCisKKworCS5wc2VjdAljb2RlLG5vd3J0CisKKy5lbnRyeQlibl9hZGRfd29yZHMsXm08cjIscjMscjQscjUscjY+CisKKwltb3ZhbAlAcihhcCkscjIKKwltb3ZhbAlAYShhcCkscjMKKwltb3ZhbAlAYihhcCkscjQKKwltb3ZsCW4oYXApLHI1CTsgYXNzdW1lZCA+MCBieSBDIGNvZGUKKwljbHJsCXIwCQk7IGMKKworCXRzdGwJcjUJCTsgY2FycnkgPSAwCisJYmxlcQk2NjYkCisKKzAkOgorCW1vdmwJKHIzKSsscjYJOyBjYXJyeSB1bnRvdWNoZWQKKwlhZHdjCShyNCkrLHI2CTsgY2FycnkgdXNlZCBhbmQgdG91Y2hlZAorCW1vdmwJcjYsKHIyKSsJOyBjYXJyeSB1bnRvdWNoZWQKKwlzb2JndHIJcjUsMCQJCTsgY2FycnkgdW50b3VjaGVkCisKKwlhZHdjCSMwLHIwCis2NjYkOgorCXJldAorDAorCS50aXRsZQl2YXhfYm5fc3ViX3dvcmRzICB1bnNpZ25lZCBhZGQgb2YgdHdvIGFycmF5cworOworOyBSaWNoYXJkIExldml0dGUgMjAtTm92LTIwMDAKKzsKKzsgVUxPTkcgYm5fc3ViX3dvcmRzKFVMT05HIHJbXSwgVUxPTkcgYVtdLCBVTE9ORyBiW10sIGludCBuKSB7Cis7CVVMT05HIGMgPSAwOworOwlpbnQgaTsKKzsJZm9yIChpID0gMDsgaSA8IG47IGkrKykgPGMscltpXT4gPSBhW2ldIC0gYltpXSAtIGM7Cis7CXJldHVybihjKTsKKzsgfQorCityPTQgOyhBUCkJcglieSByZWZlcmVuY2UgKG91dHB1dCkKK2E9OCA7KEFQKQlhCWJ5IHJlZmVyZW5jZSAoaW5wdXQpCitiPTEyIDsoQVApCWIJYnkgcmVmZXJlbmNlIChpbnB1dCkKK249MTYgOyhBUCkJbglieSB2YWx1ZSAoaW5wdXQpCisKKworCS5wc2VjdAljb2RlLG5vd3J0CisKKy5lbnRyeQlibl9zdWJfd29yZHMsXm08cjIscjMscjQscjUscjY+CisKKwltb3ZhbAlAcihhcCkscjIKKwltb3ZhbAlAYShhcCkscjMKKwltb3ZhbAlAYihhcCkscjQKKwltb3ZsCW4oYXApLHI1CTsgYXNzdW1lZCA+MCBieSBDIGNvZGUKKwljbHJsCXIwCQk7IGMKKworCXRzdGwJcjUJCTsgY2FycnkgPSAwCisJYmxlcQk2NjYkCisKKzAkOgorCW1vdmwJKHIzKSsscjYJOyBjYXJyeSB1bnRvdWNoZWQKKwlzYndjCShyNCkrLHI2CTsgY2FycnkgdXNlZCBhbmQgdG91Y2hlZAorCW1vdmwJcjYsKHIyKSsJOyBjYXJyeSB1bnRvdWNoZWQKKwlzb2JndHIJcjUsMCQJCTsgY2FycnkgdW50b3VjaGVkCisKKwlhZHdjCSMwLHIwCis2NjYkOgorCXJldAorDAorCis7cj00IDsoQVApCis7YT04IDsoQVApCis7Yj0xMiA7KEFQKQorO249MTYgOyhBUCkJbglieSB2YWx1ZSAoaW5wdXQpCisKKwkucHNlY3QJY29kZSxub3dydAorCisuZW50cnkJQk5fTVVMX0NPTUJBOCxebTxyMixyMyxyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExPgorCW1vdmFiCS05MjQoc3ApLHNwCisJY2xycQlyOAorCisJY2xybAlyMTAKKworCW1vdmwJOChhcCkscjYKKwltb3Z6d2wJMihyNikscjMKKwltb3ZsCTEyKGFwKSxyNworCWJpY2wzCSMtNjU1MzYsKHI3KSxyMgorCW1vdnp3bAkyKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LChyNiksLTEyKGZwKQorCWJpY2wzCSMtNjU1MzYscjMsLTE2KGZwKQorCW11bGwzCXIwLC0xMihmcCksLTQoZnApCisJbXVsbDIJcjIsLTEyKGZwKQorCW11bGwzCXIyLC0xNihmcCksLTgoZnApCisJbXVsbDIJcjAsLTE2KGZwKQorCWFkZGwzCS00KGZwKSwtOChmcCkscjAKKwliaWNsMwkjMCxyMCwtNChmcCkKKwljbXBsCS00KGZwKSwtOChmcCkKKwliZ2VxdQlub25hbWUuNDUKKwlhZGRsMgkjNjU1MzYsLTE2KGZwKQorbm9uYW1lLjQ1OgorCW1vdnp3bAktMihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTE2KGZwKQorCWJpY2wzCSMtNjU1MzYsLTQoZnApLHIwCisJYXNobAkjMTYscjAsLTgoZnApCisJYWRkbDMJLTgoZnApLC0xMihmcCkscjAKKwliaWNsMwkjMCxyMCwtMTIoZnApCisJY21wbAktMTIoZnApLC04KGZwKQorCWJnZXF1CW5vbmFtZS40NgorCWluY2wJLTE2KGZwKQorbm9uYW1lLjQ2OgorCW1vdmwJLTEyKGZwKSxyMQorCW1vdmwJLTE2KGZwKSxyMgorCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjQ3CisJaW5jbAlyMgorbm9uYW1lLjQ3OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjQ4CisJaW5jbAlyMTAKK25vbmFtZS40ODoKKworCW1vdmwJNChhcCkscjExCisJbW92bAlyOSwocjExKQorCisJY2xybAlyOQorCisJbW92endsCTIocjYpLHIyCisJYmljbDMJIy02NTUzNiw0KHI3KSxyMworCW1vdnp3bAk2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LChyNiksLTI4KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTMyKGZwKQorCW11bGwzCXIwLC0yOChmcCksLTIwKGZwKQorCW11bGwyCXIzLC0yOChmcCkKKwltdWxsMwlyMywtMzIoZnApLC0yNChmcCkKKwltdWxsMglyMCwtMzIoZnApCisJYWRkbDMJLTIwKGZwKSwtMjQoZnApLHIwCisJYmljbDMJIzAscjAsLTIwKGZwKQorCWNtcGwJLTIwKGZwKSwtMjQoZnApCisJYmdlcXUJbm9uYW1lLjQ5CisJYWRkbDIJIzY1NTM2LC0zMihmcCkKK25vbmFtZS40OToKKwltb3Z6d2wJLTE4KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMzIoZnApCisJYmljbDMJIy02NTUzNiwtMjAoZnApLHIwCisJYXNobAkjMTYscjAsLTI0KGZwKQorCWFkZGwzCS0yNChmcCksLTI4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yOChmcCkKKwljbXBsCS0yOChmcCksLTI0KGZwKQorCWJnZXF1CW5vbmFtZS41MAorCWluY2wJLTMyKGZwKQorbm9uYW1lLjUwOgorCW1vdmwJLTI4KGZwKSxyMQorCW1vdmwJLTMyKGZwKSxyMgorCWFkZGwyCXIxLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIxCisJYmdlcXUJbm9uYW1lLjUxCisJaW5jbAlyMgorbm9uYW1lLjUxOgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjUyCisJaW5jbAlyOQorbm9uYW1lLjUyOgorCisJbW92endsCTYocjYpLHIyCisJYmljbDMJIy02NTUzNiwocjcpLHIzCisJbW92endsCTIocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsNChyNiksLTQ0KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTQ4KGZwKQorCW11bGwzCXIwLC00NChmcCksLTM2KGZwKQorCW11bGwyCXIzLC00NChmcCkKKwltdWxsMwlyMywtNDgoZnApLC00MChmcCkKKwltdWxsMglyMCwtNDgoZnApCisJYWRkbDMJLTM2KGZwKSwtNDAoZnApLHIwCisJYmljbDMJIzAscjAsLTM2KGZwKQorCWNtcGwJLTM2KGZwKSwtNDAoZnApCisJYmdlcXUJbm9uYW1lLjUzCisJYWRkbDIJIzY1NTM2LC00OChmcCkKK25vbmFtZS41MzoKKwltb3Z6d2wJLTM0KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNDgoZnApCisJYmljbDMJIy02NTUzNiwtMzYoZnApLHIwCisJYXNobAkjMTYscjAsLTQwKGZwKQorCWFkZGwzCS00MChmcCksLTQ0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC00NChmcCkKKwljbXBsCS00NChmcCksLTQwKGZwKQorCWJnZXF1CW5vbmFtZS41NAorCWluY2wJLTQ4KGZwKQorbm9uYW1lLjU0OgorCW1vdmwJLTQ0KGZwKSxyMQorCW1vdmwJLTQ4KGZwKSxyMgorCWFkZGwyCXIxLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIxCisJYmdlcXUJbm9uYW1lLjU1CisJaW5jbAlyMgorbm9uYW1lLjU1OgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjU2CisJaW5jbAlyOQorbm9uYW1lLjU2OgorCisJbW92bAlyOCw0KHIxMSkKKworCWNscmwJcjgKKworCW1vdnp3bAkxMChyNikscjIKKwliaWNsMwkjLTY1NTM2LChyNykscjMKKwltb3Z6d2wJMihyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiw4KHI2KSwtNjAoZnApCisJYmljbDMJIy02NTUzNixyMiwtNjQoZnApCisJbXVsbDMJcjAsLTYwKGZwKSwtNTIoZnApCisJbXVsbDIJcjMsLTYwKGZwKQorCW11bGwzCXIzLC02NChmcCksLTU2KGZwKQorCW11bGwyCXIwLC02NChmcCkKKwlhZGRsMwktNTIoZnApLC01NihmcCkscjAKKwliaWNsMwkjMCxyMCwtNTIoZnApCisJY21wbAktNTIoZnApLC01NihmcCkKKwliZ2VxdQlub25hbWUuNTcKKwlhZGRsMgkjNjU1MzYsLTY0KGZwKQorbm9uYW1lLjU3OgorCW1vdnp3bAktNTAoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC02NChmcCkKKwliaWNsMwkjLTY1NTM2LC01MihmcCkscjAKKwlhc2hsCSMxNixyMCwtNTYoZnApCisJYWRkbDMJLTU2KGZwKSwtNjAoZnApLHIwCisJYmljbDMJIzAscjAsLTYwKGZwKQorCWNtcGwJLTYwKGZwKSwtNTYoZnApCisJYmdlcXUJbm9uYW1lLjU4CisJaW5jbAktNjQoZnApCitub25hbWUuNTg6CisJbW92bAktNjAoZnApLHIxCisJbW92bAktNjQoZnApLHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuNTkKKwlpbmNsCXIyCitub25hbWUuNTk6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuNjAKKwlpbmNsCXI4Citub25hbWUuNjA6CisKKwltb3Z6d2wJNihyNikscjIKKwliaWNsMwkjLTY1NTM2LDQocjcpLHIzCisJbW92endsCTYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsNChyNiksLTc2KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTgwKGZwKQorCW11bGwzCXIwLC03NihmcCksLTY4KGZwKQorCW11bGwyCXIzLC03NihmcCkKKwltdWxsMwlyMywtODAoZnApLC03MihmcCkKKwltdWxsMglyMCwtODAoZnApCisJYWRkbDMJLTY4KGZwKSwtNzIoZnApLHIwCisJYmljbDMJIzAscjAsLTY4KGZwKQorCWNtcGwJLTY4KGZwKSwtNzIoZnApCisJYmdlcXUJbm9uYW1lLjYxCisJYWRkbDIJIzY1NTM2LC04MChmcCkKK25vbmFtZS42MToKKwltb3Z6d2wJLTY2KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtODAoZnApCisJYmljbDMJIy02NTUzNiwtNjgoZnApLHIwCisJYXNobAkjMTYscjAsLTcyKGZwKQorCWFkZGwzCS03MihmcCksLTc2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC03NihmcCkKKwljbXBsCS03NihmcCksLTcyKGZwKQorCWJnZXF1CW5vbmFtZS42MgorCWluY2wJLTgwKGZwKQorbm9uYW1lLjYyOgorCW1vdmwJLTc2KGZwKSxyMQorCW1vdmwJLTgwKGZwKSxyMgorCWFkZGwyCXIxLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIxCisJYmdlcXUJbm9uYW1lLjYzCisJaW5jbAlyMgorbm9uYW1lLjYzOgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjY0CisJaW5jbAlyOAorbm9uYW1lLjY0OgorCisJbW92endsCTIocjYpLHIyCisJYmljbDMJIy02NTUzNiw4KHI3KSxyMworCW1vdnp3bAkxMChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiwocjYpLC05MihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC05NihmcCkKKwltdWxsMwlyMCwtOTIoZnApLC04NChmcCkKKwltdWxsMglyMywtOTIoZnApCisJbXVsbDMJcjMsLTk2KGZwKSwtODgoZnApCisJbXVsbDIJcjAsLTk2KGZwKQorCWFkZGwzCS04NChmcCksLTg4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC04NChmcCkKKwljbXBsCS04NChmcCksLTg4KGZwKQorCWJnZXF1CW5vbmFtZS42NQorCWFkZGwyCSM2NTUzNiwtOTYoZnApCitub25hbWUuNjU6CisJbW92endsCS04MihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTk2KGZwKQorCWJpY2wzCSMtNjU1MzYsLTg0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC04OChmcCkKKwlhZGRsMwktODgoZnApLC05MihmcCkscjAKKwliaWNsMwkjMCxyMCwtOTIoZnApCisJY21wbAktOTIoZnApLC04OChmcCkKKwliZ2VxdQlub25hbWUuNjYKKwlpbmNsCS05NihmcCkKK25vbmFtZS42NjoKKwltb3ZsCS05MihmcCkscjEKKwltb3ZsCS05NihmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS42NworCWluY2wJcjIKK25vbmFtZS42NzoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS42OAorCWluY2wJcjgKK25vbmFtZS42ODoKKworCW1vdmwJcjEwLDgocjExKQorCisJY2xybAlyMTAKKworCW1vdnp3bAkyKHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMTIocjcpLHIzCisJbW92endsCTE0KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LChyNiksLTEwOChmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0xMTIoZnApCisJbXVsbDMJcjAsLTEwOChmcCksLTEwMChmcCkKKwltdWxsMglyMywtMTA4KGZwKQorCW11bGwzCXIzLC0xMTIoZnApLC0xMDQoZnApCisJbXVsbDIJcjAsLTExMihmcCkKKwlhZGRsMwktMTAwKGZwKSwtMTA0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xMDAoZnApCisJY21wbAktMTAwKGZwKSwtMTA0KGZwKQorCWJnZXF1CW5vbmFtZS42OQorCWFkZGwyCSM2NTUzNiwtMTEyKGZwKQorbm9uYW1lLjY5OgorCW1vdnp3bAktOTgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0xMTIoZnApCisJYmljbDMJIy02NTUzNiwtMTAwKGZwKSxyMAorCWFzaGwJIzE2LHIwLC0xMDQoZnApCisJYWRkbDMJLTEwNChmcCksLTEwOChmcCkscjAKKwliaWNsMwkjMCxyMCwtMTA4KGZwKQorCWNtcGwJLTEwOChmcCksLTEwNChmcCkKKwliZ2VxdQlub25hbWUuNzAKKwlpbmNsCS0xMTIoZnApCitub25hbWUuNzA6CisJbW92bAktMTA4KGZwKSxyMQorCW1vdmwJLTExMihmcCkscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS43MQorCWluY2wJcjIKK25vbmFtZS43MToKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS43MgorCWluY2wJcjEwCitub25hbWUuNzI6CisKKwltb3Z6d2wJNihyNikscjIKKwliaWNsMwkjLTY1NTM2LDgocjcpLHIzCisJbW92endsCTEwKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDQocjYpLC0xMjQoZnApCisJYmljbDMJIy02NTUzNixyMiwtMTI4KGZwKQorCW11bGwzCXIwLC0xMjQoZnApLC0xMTYoZnApCisJbXVsbDIJcjMsLTEyNChmcCkKKwltdWxsMwlyMywtMTI4KGZwKSwtMTIwKGZwKQorCW11bGwyCXIwLC0xMjgoZnApCisJYWRkbDMJLTExNihmcCksLTEyMChmcCkscjAKKwliaWNsMwkjMCxyMCwtMTE2KGZwKQorCWNtcGwJLTExNihmcCksLTEyMChmcCkKKwliZ2VxdQlub25hbWUuNzMKKwlhZGRsMgkjNjU1MzYsLTEyOChmcCkKK25vbmFtZS43MzoKKwltb3Z6d2wJLTExNChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTEyOChmcCkKKwliaWNsMwkjLTY1NTM2LC0xMTYoZnApLHIwCisJYXNobAkjMTYscjAsLTEyMChmcCkKKwlhZGRsMwktMTIwKGZwKSwtMTI0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xMjQoZnApCisJY21wbAktMTI0KGZwKSwtMTIwKGZwKQorCWJnZXF1CW5vbmFtZS43NAorCWluY2wJLTEyOChmcCkKK25vbmFtZS43NDoKKwltb3ZsCS0xMjQoZnApLHIxCisJbW92bAktMTI4KGZwKSxyMgorCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjc1CisJaW5jbAlyMgorbm9uYW1lLjc1OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjc2CisJaW5jbAlyMTAKK25vbmFtZS43NjoKKworCW1vdnp3bAkxMChyNikscjIKKwliaWNsMwkjLTY1NTM2LDQocjcpLHIzCisJbW92endsCTYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsOChyNiksLTE0MChmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0xNDQoZnApCisJbXVsbDMJcjAsLTE0MChmcCksLTEzMihmcCkKKwltdWxsMglyMywtMTQwKGZwKQorCW11bGwzCXIzLC0xNDQoZnApLC0xMzYoZnApCisJbXVsbDIJcjAsLTE0NChmcCkKKwlhZGRsMwktMTMyKGZwKSwtMTM2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xMzIoZnApCisJY21wbAktMTMyKGZwKSwtMTM2KGZwKQorCWJnZXF1CW5vbmFtZS43NworCWFkZGwyCSM2NTUzNiwtMTQ0KGZwKQorbm9uYW1lLjc3OgorCW1vdnp3bAktMTMwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMTQ0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTEzMihmcCkscjAKKwlhc2hsCSMxNixyMCwtMTM2KGZwKQorCWFkZGwzCS0xMzYoZnApLC0xNDAoZnApLHIwCisJYmljbDMJIzAscjAsLTE0MChmcCkKKwljbXBsCS0xNDAoZnApLC0xMzYoZnApCisJYmdlcXUJbm9uYW1lLjc4CisJaW5jbAktMTQ0KGZwKQorbm9uYW1lLjc4OgorCW1vdmwJLTE0MChmcCkscjEKKwltb3ZsCS0xNDQoZnApLHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuNzkKKwlpbmNsCXIyCitub25hbWUuNzk6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuODAKKwlpbmNsCXIxMAorbm9uYW1lLjgwOgorCisJbW92endsCTE0KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsKHI3KSxyMworCW1vdnp3bAkyKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDEyKHI2KSwtMTU2KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTE2MChmcCkKKwltdWxsMwlyMCwtMTU2KGZwKSwtMTQ4KGZwKQorCW11bGwyCXIzLC0xNTYoZnApCisJbXVsbDMJcjMsLTE2MChmcCksLTE1MihmcCkKKwltdWxsMglyMCwtMTYwKGZwKQorCWFkZGwzCS0xNDgoZnApLC0xNTIoZnApLHIwCisJYmljbDMJIzAscjAsLTE0OChmcCkKKwljbXBsCS0xNDgoZnApLC0xNTIoZnApCisJYmdlcXUJbm9uYW1lLjgxCisJYWRkbDIJIzY1NTM2LC0xNjAoZnApCitub25hbWUuODE6CisJbW92endsCS0xNDYoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0xNjAoZnApCisJYmljbDMJIy02NTUzNiwtMTQ4KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0xNTIoZnApCisJYWRkbDMJLTE1MihmcCksLTE1NihmcCkscjAKKwliaWNsMwkjMCxyMCwtMTU2KGZwKQorCWNtcGwJLTE1NihmcCksLTE1MihmcCkKKwliZ2VxdQlub25hbWUuODIKKwlpbmNsCS0xNjAoZnApCitub25hbWUuODI6CisJbW92bAktMTU2KGZwKSxyMQorCW1vdmwJLTE2MChmcCkscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS44MworCWluY2wJcjIKK25vbmFtZS44MzoKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS44NAorCWluY2wJcjEwCitub25hbWUuODQ6CisKKwltb3ZsCXI5LDEyKHIxMSkKKworCWNscmwJcjkKKworCW1vdnp3bAkxOChyNikscjIKKwliaWNsMwkjLTY1NTM2LChyNykscjMKKwltb3Z6d2wJMihyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiwxNihyNiksLTE3MihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0xNzYoZnApCisJbXVsbDMJcjAsLTE3MihmcCksLTE2NChmcCkKKwltdWxsMglyMywtMTcyKGZwKQorCW11bGwzCXIzLC0xNzYoZnApLC0xNjgoZnApCisJbXVsbDIJcjAsLTE3NihmcCkKKwlhZGRsMwktMTY0KGZwKSwtMTY4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xNjQoZnApCisJY21wbAktMTY0KGZwKSwtMTY4KGZwKQorCWJnZXF1CW5vbmFtZS44NQorCWFkZGwyCSM2NTUzNiwtMTc2KGZwKQorbm9uYW1lLjg1OgorCW1vdnp3bAktMTYyKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMTc2KGZwKQorCWJpY2wzCSMtNjU1MzYsLTE2NChmcCkscjAKKwlhc2hsCSMxNixyMCwtMTY4KGZwKQorCWFkZGwzCS0xNjgoZnApLC0xNzIoZnApLHIwCisJYmljbDMJIzAscjAsLTE3MihmcCkKKwljbXBsCS0xNzIoZnApLC0xNjgoZnApCisJYmdlcXUJbm9uYW1lLjg2CisJaW5jbAktMTc2KGZwKQorbm9uYW1lLjg2OgorCW1vdmwJLTE3MihmcCkscjEKKwltb3ZsCS0xNzYoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuODcKKwlpbmNsCXIyCitub25hbWUuODc6CisJYWRkbDIJcjIscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjIKKwliZ2VxdQlub25hbWUuODgKKwlpbmNsCXI5Citub25hbWUuODg6CisKKwltb3Z6d2wJMTQocjYpLHIyCisJYmljbDMJIy02NTUzNiw0KHI3KSxyMworCW1vdnp3bAk2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDEyKHI2KSwtMTg4KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTE5MihmcCkKKwltdWxsMwlyMCwtMTg4KGZwKSwtMTgwKGZwKQorCW11bGwyCXIzLC0xODgoZnApCisJbXVsbDMJcjMsLTE5MihmcCksLTE4NChmcCkKKwltdWxsMglyMCwtMTkyKGZwKQorCWFkZGwzCS0xODAoZnApLC0xODQoZnApLHIwCisJYmljbDMJIzAscjAsLTE4MChmcCkKKwljbXBsCS0xODAoZnApLC0xODQoZnApCisJYmdlcXUJbm9uYW1lLjg5CisJYWRkbDIJIzY1NTM2LC0xOTIoZnApCitub25hbWUuODk6CisJbW92endsCS0xNzgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0xOTIoZnApCisJYmljbDMJIy02NTUzNiwtMTgwKGZwKSxyMAorCWFzaGwJIzE2LHIwLC0xODQoZnApCisJYWRkbDMJLTE4NChmcCksLTE4OChmcCkscjAKKwliaWNsMwkjMCxyMCwtMTg4KGZwKQorCWNtcGwJLTE4OChmcCksLTE4NChmcCkKKwliZ2VxdQlub25hbWUuOTAKKwlpbmNsCS0xOTIoZnApCitub25hbWUuOTA6CisJbW92bAktMTg4KGZwKSxyMQorCW1vdmwJLTE5MihmcCkscjIKKwlhZGRsMglyMSxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMQorCWJnZXF1CW5vbmFtZS45MQorCWluY2wJcjIKK25vbmFtZS45MToKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS45MgorCWluY2wJcjkKK25vbmFtZS45MjoKKworCW1vdnp3bAkxMChyNikscjIKKwliaWNsMwkjLTY1NTM2LDgocjcpLHIzCisJbW92endsCTEwKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDgocjYpLC0yMDQoZnApCisJYmljbDMJIy02NTUzNixyMiwtMjA4KGZwKQorCW11bGwzCXIwLC0yMDQoZnApLC0xOTYoZnApCisJbXVsbDIJcjMsLTIwNChmcCkKKwltdWxsMwlyMywtMjA4KGZwKSwtMjAwKGZwKQorCW11bGwyCXIwLC0yMDgoZnApCisJYWRkbDMJLTE5NihmcCksLTIwMChmcCkscjAKKwliaWNsMwkjMCxyMCwtMTk2KGZwKQorCWNtcGwJLTE5NihmcCksLTIwMChmcCkKKwliZ2VxdQlub25hbWUuOTMKKwlhZGRsMgkjNjU1MzYsLTIwOChmcCkKK25vbmFtZS45MzoKKwltb3Z6d2wJLTE5NChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTIwOChmcCkKKwliaWNsMwkjLTY1NTM2LC0xOTYoZnApLHIwCisJYXNobAkjMTYscjAsLTIwMChmcCkKKwlhZGRsMwktMjAwKGZwKSwtMjA0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yMDQoZnApCisJY21wbAktMjA0KGZwKSwtMjAwKGZwKQorCWJnZXF1CW5vbmFtZS45NAorCWluY2wJLTIwOChmcCkKK25vbmFtZS45NDoKKwltb3ZsCS0yMDQoZnApLHIxCisJbW92bAktMjA4KGZwKSxyMgorCWFkZGwyCXIxLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIxCisJYmdlcXUJbm9uYW1lLjk1CisJaW5jbAlyMgorbm9uYW1lLjk1OgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjk2CisJaW5jbAlyOQorbm9uYW1lLjk2OgorCisJbW92endsCTYocjYpLHIyCisJYmljbDMJIy02NTUzNiwxMihyNykscjMKKwltb3Z6d2wJMTQocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsNChyNiksLTIyMChmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0yMjQoZnApCisJbXVsbDMJcjAsLTIyMChmcCksLTIxMihmcCkKKwltdWxsMglyMywtMjIwKGZwKQorCW11bGwzCXIzLC0yMjQoZnApLC0yMTYoZnApCisJbXVsbDIJcjAsLTIyNChmcCkKKwlhZGRsMwktMjEyKGZwKSwtMjE2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yMTIoZnApCisJY21wbAktMjEyKGZwKSwtMjE2KGZwKQorCWJnZXF1CW5vbmFtZS45NworCWFkZGwyCSM2NTUzNiwtMjI0KGZwKQorbm9uYW1lLjk3OgorCW1vdnp3bAktMjEwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMjI0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTIxMihmcCkscjAKKwlhc2hsCSMxNixyMCwtMjE2KGZwKQorCWFkZGwzCS0yMTYoZnApLC0yMjAoZnApLHIwCisJYmljbDMJIzAscjAsLTIyMChmcCkKKwljbXBsCS0yMjAoZnApLC0yMTYoZnApCisJYmdlcXUJbm9uYW1lLjk4CisJaW5jbAktMjI0KGZwKQorbm9uYW1lLjk4OgorCW1vdmwJLTIyMChmcCkscjEKKwltb3ZsCS0yMjQoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuOTkKKwlpbmNsCXIyCitub25hbWUuOTk6CisJYWRkbDIJcjIscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjIKKwliZ2VxdQlub25hbWUuMTAwCisJaW5jbAlyOQorbm9uYW1lLjEwMDoKKworCW1vdnp3bAkyKHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMTYocjcpLHIzCisJbW92endsCTE4KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LChyNiksLTIzNihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0yNDAoZnApCisJbXVsbDMJcjAsLTIzNihmcCksLTIyOChmcCkKKwltdWxsMglyMywtMjM2KGZwKQorCW11bGwzCXIzLC0yNDAoZnApLC0yMzIoZnApCisJbXVsbDIJcjAsLTI0MChmcCkKKwlhZGRsMwktMjI4KGZwKSwtMjMyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yMjgoZnApCisJY21wbAktMjI4KGZwKSwtMjMyKGZwKQorCWJnZXF1CW5vbmFtZS4xMDEKKwlhZGRsMgkjNjU1MzYsLTI0MChmcCkKK25vbmFtZS4xMDE6CisJbW92endsCS0yMjYoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0yNDAoZnApCisJYmljbDMJIy02NTUzNiwtMjI4KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0yMzIoZnApCisJYWRkbDMJLTIzMihmcCksLTIzNihmcCkscjAKKwliaWNsMwkjMCxyMCwtMjM2KGZwKQorCWNtcGwJLTIzNihmcCksLTIzMihmcCkKKwliZ2VxdQlub25hbWUuMTAyCisJaW5jbAktMjQwKGZwKQorbm9uYW1lLjEwMjoKKwltb3ZsCS0yMzYoZnApLHIxCisJbW92bAktMjQwKGZwKSxyMgorCWFkZGwyCXIxLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIxCisJYmdlcXUJbm9uYW1lLjEwMworCWluY2wJcjIKK25vbmFtZS4xMDM6CisJYWRkbDIJcjIscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjIKKwliZ2VxdQlub25hbWUuMTA0CisJaW5jbAlyOQorbm9uYW1lLjEwNDoKKworCW1vdmwJcjgsMTYocjExKQorCisJY2xybAlyOAorCisJbW92endsCTIocjYpLHIyCisJYmljbDMJIy02NTUzNiwyMChyNykscjMKKwltb3Z6d2wJMjIocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsKHI2KSwtMjUyKGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTI1NihmcCkKKwltdWxsMwlyMCwtMjUyKGZwKSwtMjQ0KGZwKQorCW11bGwyCXIzLC0yNTIoZnApCisJbXVsbDMJcjMsLTI1NihmcCksLTI0OChmcCkKKwltdWxsMglyMCwtMjU2KGZwKQorCWFkZGwzCS0yNDQoZnApLC0yNDgoZnApLHIwCisJYmljbDMJIzAscjAsLTI0NChmcCkKKwljbXBsCS0yNDQoZnApLC0yNDgoZnApCisJYmdlcXUJbm9uYW1lLjEwNQorCWFkZGwyCSM2NTUzNiwtMjU2KGZwKQorbm9uYW1lLjEwNToKKwltb3Z6d2wJLTI0MihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTI1NihmcCkKKwliaWNsMwkjLTY1NTM2LC0yNDQoZnApLHIwCisJYXNobAkjMTYscjAsLTI0OChmcCkKKwlhZGRsMwktMjQ4KGZwKSwtMjUyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yNTIoZnApCisJY21wbAktMjUyKGZwKSwtMjQ4KGZwKQorCWJnZXF1CW5vbmFtZS4xMDYKKwlpbmNsCS0yNTYoZnApCitub25hbWUuMTA2OgorCW1vdmwJLTI1MihmcCkscjEKKwltb3ZsCS0yNTYoZnApLHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuMTA3CisJaW5jbAlyMgorbm9uYW1lLjEwNzoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS4xMDgKKwlpbmNsCXI4Citub25hbWUuMTA4OgorCisJbW92endsCTYocjYpLHIyCisJYmljbDMJIy02NTUzNiwxNihyNykscjMKKwltb3Z6d2wJMTgocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsNChyNiksLTI2OChmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0yNzIoZnApCisJbXVsbDMJcjAsLTI2OChmcCksLTI2MChmcCkKKwltdWxsMglyMywtMjY4KGZwKQorCW11bGwzCXIzLC0yNzIoZnApLC0yNjQoZnApCisJbXVsbDIJcjAsLTI3MihmcCkKKwlhZGRsMwktMjYwKGZwKSwtMjY0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yNjAoZnApCisJY21wbAktMjYwKGZwKSwtMjY0KGZwKQorCWJnZXF1CW5vbmFtZS4xMDkKKwlhZGRsMgkjNjU1MzYsLTI3MihmcCkKK25vbmFtZS4xMDk6CisJbW92endsCS0yNTgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0yNzIoZnApCisJYmljbDMJIy02NTUzNiwtMjYwKGZwKSxyMAorCWFzaGwJIzE2LHIwLC0yNjQoZnApCisJYWRkbDMJLTI2NChmcCksLTI2OChmcCkscjAKKwliaWNsMwkjMCxyMCwtMjY4KGZwKQorCWNtcGwJLTI2OChmcCksLTI2NChmcCkKKwliZ2VxdQlub25hbWUuMTEwCisJaW5jbAktMjcyKGZwKQorbm9uYW1lLjExMDoKKwltb3ZsCS0yNjgoZnApLHIxCisJbW92bAktMjcyKGZwKSxyMgorCWFkZGwyCXIxLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIxCisJYmdlcXUJbm9uYW1lLjExMQorCWluY2wJcjIKK25vbmFtZS4xMTE6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuMTEyCisJaW5jbAlyOAorbm9uYW1lLjExMjoKKworCW1vdnp3bAkxMChyNikscjIKKwliaWNsMwkjLTY1NTM2LDEyKHI3KSxyMworCW1vdnp3bAkxNChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiw4KHI2KSwtMjg0KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTI4OChmcCkKKwltdWxsMwlyMCwtMjg0KGZwKSwtMjc2KGZwKQorCW11bGwyCXIzLC0yODQoZnApCisJbXVsbDMJcjMsLTI4OChmcCksLTI4MChmcCkKKwltdWxsMglyMCwtMjg4KGZwKQorCWFkZGwzCS0yNzYoZnApLC0yODAoZnApLHIwCisJYmljbDMJIzAscjAsLTI3NihmcCkKKwljbXBsCS0yNzYoZnApLC0yODAoZnApCisJYmdlcXUJbm9uYW1lLjExMworCWFkZGwyCSM2NTUzNiwtMjg4KGZwKQorbm9uYW1lLjExMzoKKwltb3Z6d2wJLTI3NChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTI4OChmcCkKKwliaWNsMwkjLTY1NTM2LC0yNzYoZnApLHIwCisJYXNobAkjMTYscjAsLTI4MChmcCkKKwlhZGRsMwktMjgwKGZwKSwtMjg0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yODQoZnApCisJY21wbAktMjg0KGZwKSwtMjgwKGZwKQorCWJnZXF1CW5vbmFtZS4xMTQKKwlpbmNsCS0yODgoZnApCitub25hbWUuMTE0OgorCW1vdmwJLTI4NChmcCkscjEKKwltb3ZsCS0yODgoZnApLHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuMTE1CisJaW5jbAlyMgorbm9uYW1lLjExNToKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS4xMTYKKwlpbmNsCXI4Citub25hbWUuMTE2OgorCisJbW92endsCTE0KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsOChyNykscjMKKwltb3Z6d2wJMTAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMTIocjYpLC0zMDAoZnApCisJYmljbDMJIy02NTUzNixyMiwtMzA0KGZwKQorCW11bGwzCXIwLC0zMDAoZnApLC0yOTIoZnApCisJbXVsbDIJcjMsLTMwMChmcCkKKwltdWxsMwlyMywtMzA0KGZwKSwtMjk2KGZwKQorCW11bGwyCXIwLC0zMDQoZnApCisJYWRkbDMJLTI5MihmcCksLTI5NihmcCkscjAKKwliaWNsMwkjMCxyMCwtMjkyKGZwKQorCWNtcGwJLTI5MihmcCksLTI5NihmcCkKKwliZ2VxdQlub25hbWUuMTE3CisJYWRkbDIJIzY1NTM2LC0zMDQoZnApCitub25hbWUuMTE3OgorCW1vdnp3bAktMjkwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMzA0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTI5MihmcCkscjAKKwlhc2hsCSMxNixyMCwtMjk2KGZwKQorCWFkZGwzCS0yOTYoZnApLC0zMDAoZnApLHIwCisJYmljbDMJIzAscjAsLTMwMChmcCkKKwljbXBsCS0zMDAoZnApLC0yOTYoZnApCisJYmdlcXUJbm9uYW1lLjExOAorCWluY2wJLTMwNChmcCkKK25vbmFtZS4xMTg6CisJbW92bAktMzAwKGZwKSxyMQorCW1vdmwJLTMwNChmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4xMTkKKwlpbmNsCXIyCitub25hbWUuMTE5OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjEyMAorCWluY2wJcjgKK25vbmFtZS4xMjA6CisKKwltb3Z6d2wJMTgocjYpLHIyCisJYmljbDMJIy02NTUzNiw0KHI3KSxyMworCW1vdnp3bAk2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDE2KHI2KSwtMzE2KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTMyMChmcCkKKwltdWxsMwlyMCwtMzE2KGZwKSwtMzA4KGZwKQorCW11bGwyCXIzLC0zMTYoZnApCisJbXVsbDMJcjMsLTMyMChmcCksLTMxMihmcCkKKwltdWxsMglyMCwtMzIwKGZwKQorCWFkZGwzCS0zMDgoZnApLC0zMTIoZnApLHIwCisJYmljbDMJIzAscjAsLTMwOChmcCkKKwljbXBsCS0zMDgoZnApLC0zMTIoZnApCisJYmdlcXUJbm9uYW1lLjEyMQorCWFkZGwyCSM2NTUzNiwtMzIwKGZwKQorbm9uYW1lLjEyMToKKwltb3Z6d2wJLTMwNihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTMyMChmcCkKKwliaWNsMwkjLTY1NTM2LC0zMDgoZnApLHIwCisJYXNobAkjMTYscjAsLTMxMihmcCkKKwlhZGRsMwktMzEyKGZwKSwtMzE2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zMTYoZnApCisJY21wbAktMzE2KGZwKSwtMzEyKGZwKQorCWJnZXF1CW5vbmFtZS4xMjIKKwlpbmNsCS0zMjAoZnApCitub25hbWUuMTIyOgorCW1vdmwJLTMxNihmcCkscjEKKwltb3ZsCS0zMjAoZnApLHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuMTIzCisJaW5jbAlyMgorCitub25hbWUuMTIzOgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjEyNAorCWluY2wJcjgKK25vbmFtZS4xMjQ6CisKKwltb3Z6d2wJMjIocjYpLHIyCisJYmljbDMJIy02NTUzNiwocjcpLHIzCisJbW92endsCTIocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMjAocjYpLC0zMzIoZnApCisJYmljbDMJIy02NTUzNixyMiwtMzM2KGZwKQorCW11bGwzCXIwLC0zMzIoZnApLC0zMjQoZnApCisJbXVsbDIJcjMsLTMzMihmcCkKKwltdWxsMwlyMywtMzM2KGZwKSwtMzI4KGZwKQorCW11bGwyCXIwLC0zMzYoZnApCisJYWRkbDMJLTMyNChmcCksLTMyOChmcCkscjAKKwliaWNsMwkjMCxyMCwtMzI0KGZwKQorCWNtcGwJLTMyNChmcCksLTMyOChmcCkKKwliZ2VxdQlub25hbWUuMTI1CisJYWRkbDIJIzY1NTM2LC0zMzYoZnApCitub25hbWUuMTI1OgorCW1vdnp3bAktMzIyKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMzM2KGZwKQorCWJpY2wzCSMtNjU1MzYsLTMyNChmcCkscjAKKwlhc2hsCSMxNixyMCwtMzI4KGZwKQorCWFkZGwzCS0zMjgoZnApLC0zMzIoZnApLHIwCisJYmljbDMJIzAscjAsLTMzMihmcCkKKwljbXBsCS0zMzIoZnApLC0zMjgoZnApCisJYmdlcXUJbm9uYW1lLjEyNgorCWluY2wJLTMzNihmcCkKK25vbmFtZS4xMjY6CisJbW92bAktMzMyKGZwKSxyMQorCW1vdmwJLTMzNihmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4xMjcKKwlpbmNsCXIyCitub25hbWUuMTI3OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjEyOAorCWluY2wJcjgKK25vbmFtZS4xMjg6CisKKwltb3ZsCXIxMCwyMChyMTEpCisKKwljbHJsCXIxMAorCisJbW92endsCTI2KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsKHI3KSxyMworCW1vdnp3bAkyKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDI0KHI2KSwtMzQ4KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTM1MihmcCkKKwltdWxsMwlyMCwtMzQ4KGZwKSwtMzQwKGZwKQorCW11bGwyCXIzLC0zNDgoZnApCisJbXVsbDMJcjMsLTM1MihmcCksLTM0NChmcCkKKwltdWxsMglyMCwtMzUyKGZwKQorCWFkZGwzCS0zNDAoZnApLC0zNDQoZnApLHIwCisJYmljbDMJIzAscjAsLTM0MChmcCkKKwljbXBsCS0zNDAoZnApLC0zNDQoZnApCisJYmdlcXUJbm9uYW1lLjEyOQorCWFkZGwyCSM2NTUzNiwtMzUyKGZwKQorbm9uYW1lLjEyOToKKwltb3Z6d2wJLTMzOChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTM1MihmcCkKKwliaWNsMwkjLTY1NTM2LC0zNDAoZnApLHIwCisJYXNobAkjMTYscjAsLTM0NChmcCkKKwlhZGRsMwktMzQ0KGZwKSwtMzQ4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zNDgoZnApCisJY21wbAktMzQ4KGZwKSwtMzQ0KGZwKQorCWJnZXF1CW5vbmFtZS4xMzAKKwlpbmNsCS0zNTIoZnApCitub25hbWUuMTMwOgorCW1vdmwJLTM0OChmcCkscjEKKwltb3ZsCS0zNTIoZnApLHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMTMxCisJaW5jbAlyMgorbm9uYW1lLjEzMToKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4xMzIKKwlpbmNsCXIxMAorbm9uYW1lLjEzMjoKKworCW1vdnp3bAkyMihyNikscjIKKwliaWNsMwkjLTY1NTM2LDQocjcpLHIzCisJbW92endsCTYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMjAocjYpLC0zNjQoZnApCisJYmljbDMJIy02NTUzNixyMiwtMzY4KGZwKQorCW11bGwzCXIwLC0zNjQoZnApLC0zNTYoZnApCisJbXVsbDIJcjMsLTM2NChmcCkKKwltdWxsMwlyMywtMzY4KGZwKSwtMzYwKGZwKQorCW11bGwyCXIwLC0zNjgoZnApCisJYWRkbDMJLTM1NihmcCksLTM2MChmcCkscjAKKwliaWNsMwkjMCxyMCwtMzU2KGZwKQorCWNtcGwJLTM1NihmcCksLTM2MChmcCkKKwliZ2VxdQlub25hbWUuMTMzCisJYWRkbDIJIzY1NTM2LC0zNjgoZnApCitub25hbWUuMTMzOgorCW1vdnp3bAktMzU0KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMzY4KGZwKQorCWJpY2wzCSMtNjU1MzYsLTM1NihmcCkscjAKKwlhc2hsCSMxNixyMCwtMzYwKGZwKQorCWFkZGwzCS0zNjAoZnApLC0zNjQoZnApLHIwCisJYmljbDMJIzAscjAsLTM2NChmcCkKKwljbXBsCS0zNjQoZnApLC0zNjAoZnApCisJYmdlcXUJbm9uYW1lLjEzNAorCWluY2wJLTM2OChmcCkKK25vbmFtZS4xMzQ6CisJbW92bAktMzY0KGZwKSxyMQorCW1vdmwJLTM2OChmcCkscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS4xMzUKKwlpbmNsCXIyCitub25hbWUuMTM1OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjEzNgorCWluY2wJcjEwCitub25hbWUuMTM2OgorCisJbW92endsCTE4KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsOChyNykscjMKKwltb3Z6d2wJMTAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMTYocjYpLC0zODAoZnApCisJYmljbDMJIy02NTUzNixyMiwtMzg0KGZwKQorCW11bGwzCXIwLC0zODAoZnApLC0zNzIoZnApCisJbXVsbDIJcjMsLTM4MChmcCkKKwltdWxsMwlyMywtMzg0KGZwKSwtMzc2KGZwKQorCW11bGwyCXIwLC0zODQoZnApCisJYWRkbDMJLTM3MihmcCksLTM3NihmcCkscjAKKwliaWNsMwkjMCxyMCwtMzcyKGZwKQorCWNtcGwJLTM3MihmcCksLTM3NihmcCkKKwliZ2VxdQlub25hbWUuMTM3CisJYWRkbDIJIzY1NTM2LC0zODQoZnApCitub25hbWUuMTM3OgorCW1vdnp3bAktMzcwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMzg0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTM3MihmcCkscjAKKwlhc2hsCSMxNixyMCwtMzc2KGZwKQorCWFkZGwzCS0zNzYoZnApLC0zODAoZnApLHIwCisJYmljbDMJIzAscjAsLTM4MChmcCkKKwljbXBsCS0zODAoZnApLC0zNzYoZnApCisJYmdlcXUJbm9uYW1lLjEzOAorCWluY2wJLTM4NChmcCkKK25vbmFtZS4xMzg6CisJbW92bAktMzgwKGZwKSxyMQorCW1vdmwJLTM4NChmcCkscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS4xMzkKKwlpbmNsCXIyCitub25hbWUuMTM5OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjE0MAorCWluY2wJcjEwCitub25hbWUuMTQwOgorCisJbW92endsCTE0KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMTIocjcpLHIzCisJbW92endsCTE0KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDEyKHI2KSwtMzk2KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTQwMChmcCkKKwltdWxsMwlyMCwtMzk2KGZwKSwtMzg4KGZwKQorCW11bGwyCXIzLC0zOTYoZnApCisJbXVsbDMJcjMsLTQwMChmcCksLTM5MihmcCkKKwltdWxsMglyMCwtNDAwKGZwKQorCWFkZGwzCS0zODgoZnApLC0zOTIoZnApLHIwCisJYmljbDMJIzAscjAsLTM4OChmcCkKKwljbXBsCS0zODgoZnApLC0zOTIoZnApCisJYmdlcXUJbm9uYW1lLjE0MQorCWFkZGwyCSM2NTUzNiwtNDAwKGZwKQorbm9uYW1lLjE0MToKKwltb3Z6d2wJLTM4NihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTQwMChmcCkKKwliaWNsMwkjLTY1NTM2LC0zODgoZnApLHIwCisJYXNobAkjMTYscjAsLTM5MihmcCkKKwlhZGRsMwktMzkyKGZwKSwtMzk2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zOTYoZnApCisJY21wbAktMzk2KGZwKSwtMzkyKGZwKQorCWJnZXF1CW5vbmFtZS4xNDIKKwlpbmNsCS00MDAoZnApCitub25hbWUuMTQyOgorCW1vdmwJLTM5NihmcCkscjEKKwltb3ZsCS00MDAoZnApLHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMTQzCisJaW5jbAlyMgorbm9uYW1lLjE0MzoKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4xNDQKKwlpbmNsCXIxMAorbm9uYW1lLjE0NDoKKworCW1vdnp3bAkxMChyNikscjIKKwliaWNsMwkjLTY1NTM2LDE2KHI3KSxyMworCW1vdnp3bAkxOChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiw4KHI2KSwtNDEyKGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTQxNihmcCkKKwltdWxsMwlyMCwtNDEyKGZwKSwtNDA0KGZwKQorCW11bGwyCXIzLC00MTIoZnApCisJbXVsbDMJcjMsLTQxNihmcCksLTQwOChmcCkKKwltdWxsMglyMCwtNDE2KGZwKQorCWFkZGwzCS00MDQoZnApLC00MDgoZnApLHIwCisJYmljbDMJIzAscjAsLTQwNChmcCkKKwljbXBsCS00MDQoZnApLC00MDgoZnApCisJYmdlcXUJbm9uYW1lLjE0NQorCWFkZGwyCSM2NTUzNiwtNDE2KGZwKQorbm9uYW1lLjE0NToKKwltb3Z6d2wJLTQwMihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTQxNihmcCkKKwliaWNsMwkjLTY1NTM2LC00MDQoZnApLHIwCisJYXNobAkjMTYscjAsLTQwOChmcCkKKwlhZGRsMwktNDA4KGZwKSwtNDEyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC00MTIoZnApCisJY21wbAktNDEyKGZwKSwtNDA4KGZwKQorCWJnZXF1CW5vbmFtZS4xNDYKKwlpbmNsCS00MTYoZnApCitub25hbWUuMTQ2OgorCW1vdmwJLTQxMihmcCkscjEKKwltb3ZsCS00MTYoZnApLHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMTQ3CisJaW5jbAlyMgorbm9uYW1lLjE0NzoKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4xNDgKKwlpbmNsCXIxMAorbm9uYW1lLjE0ODoKKworCW1vdnp3bAk2KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMjAocjcpLHIzCisJbW92endsCTIyKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDQocjYpLC00MjgoZnApCisJYmljbDMJIy02NTUzNixyMiwtNDMyKGZwKQorCW11bGwzCXIwLC00MjgoZnApLC00MjAoZnApCisJbXVsbDIJcjMsLTQyOChmcCkKKwltdWxsMwlyMywtNDMyKGZwKSwtNDI0KGZwKQorCW11bGwyCXIwLC00MzIoZnApCisJYWRkbDMJLTQyMChmcCksLTQyNChmcCkscjAKKwliaWNsMwkjMCxyMCwtNDIwKGZwKQorCWNtcGwJLTQyMChmcCksLTQyNChmcCkKKwliZ2VxdQlub25hbWUuMTQ5CisJYWRkbDIJIzY1NTM2LC00MzIoZnApCitub25hbWUuMTQ5OgorCW1vdnp3bAktNDE4KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNDMyKGZwKQorCWJpY2wzCSMtNjU1MzYsLTQyMChmcCkscjAKKwlhc2hsCSMxNixyMCwtNDI0KGZwKQorCWFkZGwzCS00MjQoZnApLC00MjgoZnApLHIwCisJYmljbDMJIzAscjAsLTQyOChmcCkKKwljbXBsCS00MjgoZnApLC00MjQoZnApCisJYmdlcXUJbm9uYW1lLjE1MAorCWluY2wJLTQzMihmcCkKK25vbmFtZS4xNTA6CisJbW92bAktNDI4KGZwKSxyMQorCW1vdmwJLTQzMihmcCkscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS4xNTEKKwlpbmNsCXIyCitub25hbWUuMTUxOgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjE1MgorCWluY2wJcjEwCitub25hbWUuMTUyOgorCisJbW92endsCTIocjYpLHIyCisJYmljbDMJIy02NTUzNiwyNChyNykscjMKKwltb3Z6d2wJMjYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsKHI2KSwtNDQ0KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTQ0OChmcCkKKwltdWxsMwlyMCwtNDQ0KGZwKSwtNDM2KGZwKQorCW11bGwyCXIzLC00NDQoZnApCisJbXVsbDMJcjMsLTQ0OChmcCksLTQ0MChmcCkKKwltdWxsMglyMCwtNDQ4KGZwKQorCWFkZGwzCS00MzYoZnApLC00NDAoZnApLHIwCisJYmljbDMJIzAscjAsLTQzNihmcCkKKwljbXBsCS00MzYoZnApLC00NDAoZnApCisJYmdlcXUJbm9uYW1lLjE1MworCWFkZGwyCSM2NTUzNiwtNDQ4KGZwKQorbm9uYW1lLjE1MzoKKwltb3Z6d2wJLTQzNChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTQ0OChmcCkKKwliaWNsMwkjLTY1NTM2LC00MzYoZnApLHIwCisJYXNobAkjMTYscjAsLTQ0MChmcCkKKwlhZGRsMwktNDQwKGZwKSwtNDQ0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC00NDQoZnApCisJY21wbAktNDQ0KGZwKSwtNDQwKGZwKQorCWJnZXF1CW5vbmFtZS4xNTQKKwlpbmNsCS00NDgoZnApCitub25hbWUuMTU0OgorCW1vdmwJLTQ0NChmcCkscjEKKwltb3ZsCS00NDgoZnApLHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMTU1CisJaW5jbAlyMgorbm9uYW1lLjE1NToKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4xNTYKKwlpbmNsCXIxMAorbm9uYW1lLjE1NjoKKworCW1vdmwJcjksMjQocjExKQorCisJY2xybAlyOQorCisJbW92endsCTIocjYpLHIyCisJYmljbDMJIy02NTUzNiwyOChyNykscjMKKwltb3Z6d2wJMzAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsKHI2KSwtNDYwKGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTQ2NChmcCkKKwltdWxsMwlyMCwtNDYwKGZwKSwtNDUyKGZwKQorCW11bGwyCXIzLC00NjAoZnApCisJbXVsbDMJcjMsLTQ2NChmcCksLTQ1NihmcCkKKwltdWxsMglyMCwtNDY0KGZwKQorCWFkZGwzCS00NTIoZnApLC00NTYoZnApLHIwCisJYmljbDMJIzAscjAsLTQ1MihmcCkKKwljbXBsCS00NTIoZnApLC00NTYoZnApCisJYmdlcXUJbm9uYW1lLjE1NworCWFkZGwyCSM2NTUzNiwtNDY0KGZwKQorbm9uYW1lLjE1NzoKKwltb3Z6d2wJLTQ1MChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTQ2NChmcCkKKwliaWNsMwkjLTY1NTM2LC00NTIoZnApLHIwCisJYXNobAkjMTYscjAsLTQ1NihmcCkKKwlhZGRsMwktNDU2KGZwKSwtNDYwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC00NjAoZnApCisJY21wbAktNDYwKGZwKSwtNDU2KGZwKQorCWJnZXF1CW5vbmFtZS4xNTgKKwlpbmNsCS00NjQoZnApCitub25hbWUuMTU4OgorCW1vdmwJLTQ2MChmcCkscjEKKwltb3ZsCS00NjQoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMTU5CisJaW5jbAlyMgorbm9uYW1lLjE1OToKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4xNjAKKwlpbmNsCXI5Citub25hbWUuMTYwOgorCisJbW92endsCTYocjYpLHIyCisJYmljbDMJIy02NTUzNiwyNChyNykscjMKKwltb3Z6d2wJMjYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsNChyNiksLTQ3NihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC00ODAoZnApCisJbXVsbDMJcjAsLTQ3NihmcCksLTQ2OChmcCkKKwltdWxsMglyMywtNDc2KGZwKQorCW11bGwzCXIzLC00ODAoZnApLC00NzIoZnApCisJbXVsbDIJcjAsLTQ4MChmcCkKKwlhZGRsMwktNDY4KGZwKSwtNDcyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC00NjgoZnApCisJY21wbAktNDY4KGZwKSwtNDcyKGZwKQorCWJnZXF1CW5vbmFtZS4xNjEKKwlhZGRsMgkjNjU1MzYsLTQ4MChmcCkKK25vbmFtZS4xNjE6CisJbW92endsCS00NjYoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC00ODAoZnApCisJYmljbDMJIy02NTUzNiwtNDY4KGZwKSxyMAorCWFzaGwJIzE2LHIwLC00NzIoZnApCisJYWRkbDMJLTQ3MihmcCksLTQ3NihmcCkscjAKKwliaWNsMwkjMCxyMCwtNDc2KGZwKQorCWNtcGwJLTQ3NihmcCksLTQ3MihmcCkKKwliZ2VxdQlub25hbWUuMTYyCisJaW5jbAktNDgwKGZwKQorbm9uYW1lLjE2MjoKKwltb3ZsCS00NzYoZnApLHIxCisJbW92bAktNDgwKGZwKSxyMgorCWFkZGwyCXIxLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIxCisJYmdlcXUJbm9uYW1lLjE2MworCWluY2wJcjIKK25vbmFtZS4xNjM6CisJYWRkbDIJcjIscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjIKKwliZ2VxdQlub25hbWUuMTY0CisJaW5jbAlyOQorbm9uYW1lLjE2NDoKKworCW1vdnp3bAkxMChyNikscjIKKwliaWNsMwkjLTY1NTM2LDIwKHI3KSxyMworCW1vdnp3bAkyMihyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiw4KHI2KSwtNDkyKGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTQ5NihmcCkKKwltdWxsMwlyMCwtNDkyKGZwKSwtNDg0KGZwKQorCW11bGwyCXIzLC00OTIoZnApCisJbXVsbDMJcjMsLTQ5NihmcCksLTQ4OChmcCkKKwltdWxsMglyMCwtNDk2KGZwKQorCWFkZGwzCS00ODQoZnApLC00ODgoZnApLHIwCisJYmljbDMJIzAscjAsLTQ4NChmcCkKKwljbXBsCS00ODQoZnApLC00ODgoZnApCisJYmdlcXUJbm9uYW1lLjE2NQorCWFkZGwyCSM2NTUzNiwtNDk2KGZwKQorbm9uYW1lLjE2NToKKwltb3Z6d2wJLTQ4MihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTQ5NihmcCkKKwliaWNsMwkjLTY1NTM2LC00ODQoZnApLHIwCisJYXNobAkjMTYscjAsLTQ4OChmcCkKKwlhZGRsMwktNDg4KGZwKSwtNDkyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC00OTIoZnApCisJY21wbAktNDkyKGZwKSwtNDg4KGZwKQorCWJnZXF1CW5vbmFtZS4xNjYKKwlpbmNsCS00OTYoZnApCitub25hbWUuMTY2OgorCW1vdmwJLTQ5MihmcCkscjEKKwltb3ZsCS00OTYoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMTY3CisJaW5jbAlyMgorbm9uYW1lLjE2NzoKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4xNjgKKwlpbmNsCXI5Citub25hbWUuMTY4OgorCisJbW92endsCTE0KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMTYocjcpLHIzCisJbW92endsCTE4KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDEyKHI2KSwtNTA4KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTUxMihmcCkKKwltdWxsMwlyMCwtNTA4KGZwKSwtNTAwKGZwKQorCW11bGwyCXIzLC01MDgoZnApCisJbXVsbDMJcjMsLTUxMihmcCksLTUwNChmcCkKKwltdWxsMglyMCwtNTEyKGZwKQorCWFkZGwzCS01MDAoZnApLC01MDQoZnApLHIwCisJYmljbDMJIzAscjAsLTUwMChmcCkKKwljbXBsCS01MDAoZnApLC01MDQoZnApCisJYmdlcXUJbm9uYW1lLjE2OQorCWFkZGwyCSM2NTUzNiwtNTEyKGZwKQorbm9uYW1lLjE2OToKKwltb3Z6d2wJLTQ5OChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTUxMihmcCkKKwliaWNsMwkjLTY1NTM2LC01MDAoZnApLHIwCisJYXNobAkjMTYscjAsLTUwNChmcCkKKwlhZGRsMwktNTA0KGZwKSwtNTA4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC01MDgoZnApCisJY21wbAktNTA4KGZwKSwtNTA0KGZwKQorCWJnZXF1CW5vbmFtZS4xNzAKKwlpbmNsCS01MTIoZnApCitub25hbWUuMTcwOgorCW1vdmwJLTUwOChmcCkscjEKKwltb3ZsCS01MTIoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMTcxCisJaW5jbAlyMgorbm9uYW1lLjE3MToKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4xNzIKKwlpbmNsCXI5Citub25hbWUuMTcyOgorCisJbW92endsCTE4KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMTIocjcpLHIzCisJbW92endsCTE0KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDE2KHI2KSwtNTI0KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTUyOChmcCkKKwltdWxsMwlyMCwtNTI0KGZwKSwtNTE2KGZwKQorCW11bGwyCXIzLC01MjQoZnApCisJbXVsbDMJcjMsLTUyOChmcCksLTUyMChmcCkKKwltdWxsMglyMCwtNTI4KGZwKQorCWFkZGwzCS01MTYoZnApLC01MjAoZnApLHIwCisJYmljbDMJIzAscjAsLTUxNihmcCkKKwljbXBsCS01MTYoZnApLC01MjAoZnApCisJYmdlcXUJbm9uYW1lLjE3MworCWFkZGwyCSM2NTUzNiwtNTI4KGZwKQorbm9uYW1lLjE3MzoKKwltb3Z6d2wJLTUxNChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTUyOChmcCkKKwliaWNsMwkjLTY1NTM2LC01MTYoZnApLHIwCisJYXNobAkjMTYscjAsLTUyMChmcCkKKwlhZGRsMwktNTIwKGZwKSwtNTI0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC01MjQoZnApCisJY21wbAktNTI0KGZwKSwtNTIwKGZwKQorCWJnZXF1CW5vbmFtZS4xNzQKKwlpbmNsCS01MjgoZnApCitub25hbWUuMTc0OgorCW1vdmwJLTUyNChmcCkscjEKKwltb3ZsCS01MjgoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMTc1CisJaW5jbAlyMgorbm9uYW1lLjE3NToKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4xNzYKKwlpbmNsCXI5Citub25hbWUuMTc2OgorCisJbW92endsCTIyKHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsOChyNykscjMKKwltb3Z6d2wJMTAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMjAocjYpLC01NDAoZnApCisJYmljbDMJIy02NTUzNixyMiwtNTQ0KGZwKQorCW11bGwzCXIwLC01NDAoZnApLC01MzIoZnApCisJbXVsbDIJcjMsLTU0MChmcCkKKwltdWxsMwlyMywtNTQ0KGZwKSwtNTM2KGZwKQorCW11bGwyCXIwLC01NDQoZnApCisJYWRkbDMJLTUzMihmcCksLTUzNihmcCkscjAKKwliaWNsMwkjMCxyMCwtNTMyKGZwKQorCWNtcGwJLTUzMihmcCksLTUzNihmcCkKKwliZ2VxdQlub25hbWUuMTc3CisJYWRkbDIJIzY1NTM2LC01NDQoZnApCitub25hbWUuMTc3OgorCW1vdnp3bAktNTMwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNTQ0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTUzMihmcCkscjAKKwlhc2hsCSMxNixyMCwtNTM2KGZwKQorCWFkZGwzCS01MzYoZnApLC01NDAoZnApLHIwCisJYmljbDMJIzAscjAsLTU0MChmcCkKKwljbXBsCS01NDAoZnApLC01MzYoZnApCisJYmdlcXUJbm9uYW1lLjE3OAorCWluY2wJLTU0NChmcCkKK25vbmFtZS4xNzg6CisJbW92bAktNTQwKGZwKSxyMQorCW1vdmwJLTU0NChmcCkscjIKKwlhZGRsMglyMSxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMQorCWJnZXF1CW5vbmFtZS4xNzkKKwlpbmNsCXIyCitub25hbWUuMTc5OgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjE4MAorCWluY2wJcjkKK25vbmFtZS4xODA6CisKKwltb3Z6d2wJMjYocjYpLHIyCisJYmljbDMJIy02NTUzNiw0KHI3KSxyMworCW1vdnp3bAk2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDI0KHI2KSwtNTU2KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTU2MChmcCkKKwltdWxsMwlyMCwtNTU2KGZwKSwtNTQ4KGZwKQorCW11bGwyCXIzLC01NTYoZnApCisJbXVsbDMJcjMsLTU2MChmcCksLTU1MihmcCkKKwltdWxsMglyMCwtNTYwKGZwKQorCWFkZGwzCS01NDgoZnApLC01NTIoZnApLHIwCisJYmljbDMJIzAscjAsLTU0OChmcCkKKwljbXBsCS01NDgoZnApLC01NTIoZnApCisJYmdlcXUJbm9uYW1lLjE4MQorCWFkZGwyCSM2NTUzNiwtNTYwKGZwKQorbm9uYW1lLjE4MToKKwltb3Z6d2wJLTU0NihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTU2MChmcCkKKwliaWNsMwkjLTY1NTM2LC01NDgoZnApLHIwCisJYXNobAkjMTYscjAsLTU1MihmcCkKKwlhZGRsMwktNTUyKGZwKSwtNTU2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC01NTYoZnApCisJY21wbAktNTU2KGZwKSwtNTUyKGZwKQorCWJnZXF1CW5vbmFtZS4xODIKKwlpbmNsCS01NjAoZnApCitub25hbWUuMTgyOgorCW1vdmwJLTU1NihmcCkscjEKKwltb3ZsCS01NjAoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMTgzCisJaW5jbAlyMgorbm9uYW1lLjE4MzoKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4xODQKKwlpbmNsCXI5Citub25hbWUuMTg0OgorCisJbW92endsCTMwKHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsKHI3KSxyMworCW1vdnp3bAkyKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDI4KHI2KSwtNTcyKGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTU3NihmcCkKKwltdWxsMwlyMCwtNTcyKGZwKSwtNTY0KGZwKQorCW11bGwyCXIzLC01NzIoZnApCisJbXVsbDMJcjMsLTU3NihmcCksLTU2OChmcCkKKwltdWxsMglyMCwtNTc2KGZwKQorCWFkZGwzCS01NjQoZnApLC01NjgoZnApLHIwCisJYmljbDMJIzAscjAsLTU2NChmcCkKKwljbXBsCS01NjQoZnApLC01NjgoZnApCisJYmdlcXUJbm9uYW1lLjE4NQorCWFkZGwyCSM2NTUzNiwtNTc2KGZwKQorbm9uYW1lLjE4NToKKwltb3Z6d2wJLTU2MihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTU3NihmcCkKKwliaWNsMwkjLTY1NTM2LC01NjQoZnApLHIwCisJYXNobAkjMTYscjAsLTU2OChmcCkKKwlhZGRsMwktNTY4KGZwKSwtNTcyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC01NzIoZnApCisJY21wbAktNTcyKGZwKSwtNTY4KGZwKQorCWJnZXF1CW5vbmFtZS4xODYKKwlpbmNsCS01NzYoZnApCitub25hbWUuMTg2OgorCW1vdmwJLTU3MihmcCkscjEKKwltb3ZsCS01NzYoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMTg3CisJaW5jbAlyMgorbm9uYW1lLjE4NzoKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4xODgKKwlpbmNsCXI5Citub25hbWUuMTg4OgorCisJbW92bAlyOCwyOChyMTEpCisKKwljbHJsCXI4CisKKwltb3Z6d2wJMzAocjYpLHIyCisJYmljbDMJIy02NTUzNiw0KHI3KSxyMworCW1vdnp3bAk2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDI4KHI2KSwtNTg4KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTU5MihmcCkKKwltdWxsMwlyMCwtNTg4KGZwKSwtNTgwKGZwKQorCW11bGwyCXIzLC01ODgoZnApCisJbXVsbDMJcjMsLTU5MihmcCksLTU4NChmcCkKKwltdWxsMglyMCwtNTkyKGZwKQorCWFkZGwzCS01ODAoZnApLC01ODQoZnApLHIwCisJYmljbDMJIzAscjAsLTU4MChmcCkKKwljbXBsCS01ODAoZnApLC01ODQoZnApCisJYmdlcXUJbm9uYW1lLjE4OQorCWFkZGwyCSM2NTUzNiwtNTkyKGZwKQorbm9uYW1lLjE4OToKKwltb3Z6d2wJLTU3OChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTU5MihmcCkKKwliaWNsMwkjLTY1NTM2LC01ODAoZnApLHIwCisJYXNobAkjMTYscjAsLTU4NChmcCkKKwlhZGRsMwktNTg0KGZwKSwtNTg4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC01ODgoZnApCisJY21wbAktNTg4KGZwKSwtNTg0KGZwKQorCWJnZXF1CW5vbmFtZS4xOTAKKwlpbmNsCS01OTIoZnApCitub25hbWUuMTkwOgorCW1vdmwJLTU4OChmcCkscjEKKwltb3ZsCS01OTIoZnApLHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuMTkxCisJaW5jbAlyMgorbm9uYW1lLjE5MToKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS4xOTIKKwlpbmNsCXI4Citub25hbWUuMTkyOgorCisJbW92endsCTI2KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsOChyNykscjMKKwltb3Z6d2wJMTAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMjQocjYpLC02MDQoZnApCisJYmljbDMJIy02NTUzNixyMiwtNjA4KGZwKQorCW11bGwzCXIwLC02MDQoZnApLC01OTYoZnApCisJbXVsbDIJcjMsLTYwNChmcCkKKwltdWxsMwlyMywtNjA4KGZwKSwtNjAwKGZwKQorCW11bGwyCXIwLC02MDgoZnApCisJYWRkbDMJLTU5NihmcCksLTYwMChmcCkscjAKKwliaWNsMwkjMCxyMCwtNTk2KGZwKQorCWNtcGwJLTU5NihmcCksLTYwMChmcCkKKwliZ2VxdQlub25hbWUuMTkzCisJYWRkbDIJIzY1NTM2LC02MDgoZnApCitub25hbWUuMTkzOgorCW1vdnp3bAktNTk0KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNjA4KGZwKQorCWJpY2wzCSMtNjU1MzYsLTU5NihmcCkscjAKKwlhc2hsCSMxNixyMCwtNjAwKGZwKQorCWFkZGwzCS02MDAoZnApLC02MDQoZnApLHIwCisJYmljbDMJIzAscjAsLTYwNChmcCkKKwljbXBsCS02MDQoZnApLC02MDAoZnApCisJYmdlcXUJbm9uYW1lLjE5NAorCWluY2wJLTYwOChmcCkKK25vbmFtZS4xOTQ6CisJbW92bAktNjA0KGZwKSxyMQorCW1vdmwJLTYwOChmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4xOTUKKwlpbmNsCXIyCitub25hbWUuMTk1OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjE5NgorCWluY2wJcjgKK25vbmFtZS4xOTY6CisKKwltb3Z6d2wJMjIocjYpLHIyCisJYmljbDMJIy02NTUzNiwxMihyNykscjMKKwltb3Z6d2wJMTQocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMjAocjYpLC02MjAoZnApCisJYmljbDMJIy02NTUzNixyMiwtNjI0KGZwKQorCW11bGwzCXIwLC02MjAoZnApLC02MTIoZnApCisJbXVsbDIJcjMsLTYyMChmcCkKKwltdWxsMwlyMywtNjI0KGZwKSwtNjE2KGZwKQorCW11bGwyCXIwLC02MjQoZnApCisJYWRkbDMJLTYxMihmcCksLTYxNihmcCkscjAKKwliaWNsMwkjMCxyMCwtNjEyKGZwKQorCWNtcGwJLTYxMihmcCksLTYxNihmcCkKKwliZ2VxdQlub25hbWUuMTk3CisJYWRkbDIJIzY1NTM2LC02MjQoZnApCitub25hbWUuMTk3OgorCW1vdnp3bAktNjEwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNjI0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTYxMihmcCkscjAKKwlhc2hsCSMxNixyMCwtNjE2KGZwKQorCWFkZGwzCS02MTYoZnApLC02MjAoZnApLHIwCisJYmljbDMJIzAscjAsLTYyMChmcCkKKwljbXBsCS02MjAoZnApLC02MTYoZnApCisJYmdlcXUJbm9uYW1lLjE5OAorCWluY2wJLTYyNChmcCkKK25vbmFtZS4xOTg6CisJbW92bAktNjIwKGZwKSxyMQorCW1vdmwJLTYyNChmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4xOTkKKwlpbmNsCXIyCitub25hbWUuMTk5OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjIwMAorCWluY2wJcjgKK25vbmFtZS4yMDA6CisKKwltb3Z6d2wJMTgocjYpLHIyCisJYmljbDMJIy02NTUzNiwxNihyNykscjMKKwltb3Z6d2wJMTgocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMTYocjYpLC02MzYoZnApCisJYmljbDMJIy02NTUzNixyMiwtNjQwKGZwKQorCW11bGwzCXIwLC02MzYoZnApLC02MjgoZnApCisJbXVsbDIJcjMsLTYzNihmcCkKKwltdWxsMwlyMywtNjQwKGZwKSwtNjMyKGZwKQorCW11bGwyCXIwLC02NDAoZnApCisJYWRkbDMJLTYyOChmcCksLTYzMihmcCkscjAKKwliaWNsMwkjMCxyMCwtNjI4KGZwKQorCWNtcGwJLTYyOChmcCksLTYzMihmcCkKKwliZ2VxdQlub25hbWUuMjAxCisJYWRkbDIJIzY1NTM2LC02NDAoZnApCitub25hbWUuMjAxOgorCW1vdnp3bAktNjI2KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNjQwKGZwKQorCWJpY2wzCSMtNjU1MzYsLTYyOChmcCkscjAKKwlhc2hsCSMxNixyMCwtNjMyKGZwKQorCWFkZGwzCS02MzIoZnApLC02MzYoZnApLHIwCisJYmljbDMJIzAscjAsLTYzNihmcCkKKwljbXBsCS02MzYoZnApLC02MzIoZnApCisJYmdlcXUJbm9uYW1lLjIwMgorCWluY2wJLTY0MChmcCkKK25vbmFtZS4yMDI6CisJbW92bAktNjM2KGZwKSxyMQorCW1vdmwJLTY0MChmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4yMDMKKwlpbmNsCXIyCitub25hbWUuMjAzOgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjIwNAorCWluY2wJcjgKK25vbmFtZS4yMDQ6CisKKwltb3Z6d2wJMTQocjYpLHIyCisJYmljbDMJIy02NTUzNiwyMChyNykscjMKKwltb3Z6d2wJMjIocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMTIocjYpLC02NTIoZnApCisJYmljbDMJIy02NTUzNixyMiwtNjU2KGZwKQorCW11bGwzCXIwLC02NTIoZnApLC02NDQoZnApCisJbXVsbDIJcjMsLTY1MihmcCkKKwltdWxsMwlyMywtNjU2KGZwKSwtNjQ4KGZwKQorCW11bGwyCXIwLC02NTYoZnApCisJYWRkbDMJLTY0NChmcCksLTY0OChmcCkscjAKKwliaWNsMwkjMCxyMCwtNjQ0KGZwKQorCWNtcGwJLTY0NChmcCksLTY0OChmcCkKKwliZ2VxdQlub25hbWUuMjA1CisJYWRkbDIJIzY1NTM2LC02NTYoZnApCitub25hbWUuMjA1OgorCW1vdnp3bAktNjQyKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNjU2KGZwKQorCWJpY2wzCSMtNjU1MzYsLTY0NChmcCkscjAKKwlhc2hsCSMxNixyMCwtNjQ4KGZwKQorCWFkZGwzCS02NDgoZnApLC02NTIoZnApLHIwCisJYmljbDMJIzAscjAsLTY1MihmcCkKKwljbXBsCS02NTIoZnApLC02NDgoZnApCisJYmdlcXUJbm9uYW1lLjIwNgorCWluY2wJLTY1NihmcCkKK25vbmFtZS4yMDY6CisJbW92bAktNjUyKGZwKSxyMQorCW1vdmwJLTY1NihmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4yMDcKKwlpbmNsCXIyCitub25hbWUuMjA3OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjIwOAorCWluY2wJcjgKK25vbmFtZS4yMDg6CisKKwltb3Z6d2wJMTAocjYpLHIyCisJYmljbDMJIy02NTUzNiwyNChyNykscjMKKwltb3Z6d2wJMjYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsOChyNiksLTY2OChmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC02NzIoZnApCisJbXVsbDMJcjAsLTY2OChmcCksLTY2MChmcCkKKwltdWxsMglyMywtNjY4KGZwKQorCW11bGwzCXIzLC02NzIoZnApLC02NjQoZnApCisJbXVsbDIJcjAsLTY3MihmcCkKKwlhZGRsMwktNjYwKGZwKSwtNjY0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC02NjAoZnApCisJY21wbAktNjYwKGZwKSwtNjY0KGZwKQorCWJnZXF1CW5vbmFtZS4yMDkKKwlhZGRsMgkjNjU1MzYsLTY3MihmcCkKK25vbmFtZS4yMDk6CisJbW92endsCS02NTgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC02NzIoZnApCisJYmljbDMJIy02NTUzNiwtNjYwKGZwKSxyMAorCWFzaGwJIzE2LHIwLC02NjQoZnApCisJYWRkbDMJLTY2NChmcCksLTY2OChmcCkscjAKKwliaWNsMwkjMCxyMCwtNjY4KGZwKQorCWNtcGwJLTY2OChmcCksLTY2NChmcCkKKwliZ2VxdQlub25hbWUuMjEwCisJaW5jbAktNjcyKGZwKQorbm9uYW1lLjIxMDoKKwltb3ZsCS02NjgoZnApLHIxCisJbW92bAktNjcyKGZwKSxyMgorCWFkZGwyCXIxLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIxCisJYmdlcXUJbm9uYW1lLjIxMQorCWluY2wJcjIKK25vbmFtZS4yMTE6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuMjEyCisJaW5jbAlyOAorbm9uYW1lLjIxMjoKKworCW1vdnp3bAk2KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMjgocjcpLHIzCisJbW92endsCTMwKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDQocjYpLC02ODQoZnApCisJYmljbDMJIy02NTUzNixyMiwtNjg4KGZwKQorCW11bGwzCXIwLC02ODQoZnApLC02NzYoZnApCisJbXVsbDIJcjMsLTY4NChmcCkKKwltdWxsMwlyMywtNjg4KGZwKSwtNjgwKGZwKQorCW11bGwyCXIwLC02ODgoZnApCisJYWRkbDMJLTY3NihmcCksLTY4MChmcCkscjAKKwliaWNsMwkjMCxyMCwtNjc2KGZwKQorCWNtcGwJLTY3NihmcCksLTY4MChmcCkKKwliZ2VxdQlub25hbWUuMjEzCisJYWRkbDIJIzY1NTM2LC02ODgoZnApCitub25hbWUuMjEzOgorCW1vdnp3bAktNjc0KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNjg4KGZwKQorCWJpY2wzCSMtNjU1MzYsLTY3NihmcCkscjAKKwlhc2hsCSMxNixyMCwtNjgwKGZwKQorCWFkZGwzCS02ODAoZnApLC02ODQoZnApLHIwCisJYmljbDMJIzAscjAsLTY4NChmcCkKKwljbXBsCS02ODQoZnApLC02ODAoZnApCisJYmdlcXUJbm9uYW1lLjIxNAorCWluY2wJLTY4OChmcCkKK25vbmFtZS4yMTQ6CisJbW92bAktNjg0KGZwKSxyMQorCW1vdmwJLTY4OChmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4yMTUKKwlpbmNsCXIyCitub25hbWUuMjE1OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjIxNgorCWluY2wJcjgKK25vbmFtZS4yMTY6CisKKwltb3ZsCXIxMCwzMihyMTEpCisKKwljbHJsCXIxMAorCisJbW92endsCTEwKHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMjgocjcpLHIzCisJbW92endsCTMwKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDgocjYpLC03MDAoZnApCisJYmljbDMJIy02NTUzNixyMiwtNzA0KGZwKQorCW11bGwzCXIwLC03MDAoZnApLC02OTIoZnApCisJbXVsbDIJcjMsLTcwMChmcCkKKwltdWxsMwlyMywtNzA0KGZwKSwtNjk2KGZwKQorCW11bGwyCXIwLC03MDQoZnApCisJYWRkbDMJLTY5MihmcCksLTY5NihmcCkscjAKKwliaWNsMwkjMCxyMCwtNjkyKGZwKQorCWNtcGwJLTY5MihmcCksLTY5NihmcCkKKwliZ2VxdQlub25hbWUuMjE3CisJYWRkbDIJIzY1NTM2LC03MDQoZnApCitub25hbWUuMjE3OgorCW1vdnp3bAktNjkwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNzA0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTY5MihmcCkscjAKKwlhc2hsCSMxNixyMCwtNjk2KGZwKQorCWFkZGwzCS02OTYoZnApLC03MDAoZnApLHIwCisJYmljbDMJIzAscjAsLTcwMChmcCkKKwljbXBsCS03MDAoZnApLC02OTYoZnApCisJYmdlcXUJbm9uYW1lLjIxOAorCWluY2wJLTcwNChmcCkKK25vbmFtZS4yMTg6CisJbW92bAktNzAwKGZwKSxyMQorCW1vdmwJLTcwNChmcCkscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS4yMTkKKwlpbmNsCXIyCitub25hbWUuMjE5OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjIyMAorCWluY2wJcjEwCitub25hbWUuMjIwOgorCisJbW92endsCTE0KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMjQocjcpLHIzCisJbW92endsCTI2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDEyKHI2KSwtNzE2KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTcyMChmcCkKKwltdWxsMwlyMCwtNzE2KGZwKSwtNzA4KGZwKQorCW11bGwyCXIzLC03MTYoZnApCisJbXVsbDMJcjMsLTcyMChmcCksLTcxMihmcCkKKwltdWxsMglyMCwtNzIwKGZwKQorCWFkZGwzCS03MDgoZnApLC03MTIoZnApLHIwCisJYmljbDMJIzAscjAsLTcwOChmcCkKKwljbXBsCS03MDgoZnApLC03MTIoZnApCisJYmdlcXUJbm9uYW1lLjIyMQorCWFkZGwyCSM2NTUzNiwtNzIwKGZwKQorbm9uYW1lLjIyMToKKwltb3Z6d2wJLTcwNihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTcyMChmcCkKKwliaWNsMwkjLTY1NTM2LC03MDgoZnApLHIwCisJYXNobAkjMTYscjAsLTcxMihmcCkKKwlhZGRsMwktNzEyKGZwKSwtNzE2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC03MTYoZnApCisJY21wbAktNzE2KGZwKSwtNzEyKGZwKQorCWJnZXF1CW5vbmFtZS4yMjIKKwlpbmNsCS03MjAoZnApCitub25hbWUuMjIyOgorCW1vdmwJLTcxNihmcCkscjEKKwltb3ZsCS03MjAoZnApLHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMjIzCisJaW5jbAlyMgorbm9uYW1lLjIyMzoKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4yMjQKKwlpbmNsCXIxMAorbm9uYW1lLjIyNDoKKworCW1vdnp3bAkxOChyNikscjIKKwliaWNsMwkjLTY1NTM2LDIwKHI3KSxyMworCW1vdnp3bAkyMihyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiwxNihyNiksLTczMihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC03MzYoZnApCisJbXVsbDMJcjAsLTczMihmcCksLTcyNChmcCkKKwltdWxsMglyMywtNzMyKGZwKQorCW11bGwzCXIzLC03MzYoZnApLC03MjgoZnApCisJbXVsbDIJcjAsLTczNihmcCkKKwlhZGRsMwktNzI0KGZwKSwtNzI4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC03MjQoZnApCisJY21wbAktNzI0KGZwKSwtNzI4KGZwKQorCWJnZXF1CW5vbmFtZS4yMjUKKwlhZGRsMgkjNjU1MzYsLTczNihmcCkKK25vbmFtZS4yMjU6CisJbW92endsCS03MjIoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC03MzYoZnApCisJYmljbDMJIy02NTUzNiwtNzI0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC03MjgoZnApCisJYWRkbDMJLTcyOChmcCksLTczMihmcCkscjAKKwliaWNsMwkjMCxyMCwtNzMyKGZwKQorCWNtcGwJLTczMihmcCksLTcyOChmcCkKKwliZ2VxdQlub25hbWUuMjI2CisJaW5jbAktNzM2KGZwKQorbm9uYW1lLjIyNjoKKwltb3ZsCS03MzIoZnApLHIxCisJbW92bAktNzM2KGZwKSxyMgorCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjIyNworCWluY2wJcjIKK25vbmFtZS4yMjc6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuMjI4CisJaW5jbAlyMTAKK25vbmFtZS4yMjg6CisKKwltb3Z6d2wJMjIocjYpLHIyCisJYmljbDMJIy02NTUzNiwxNihyNykscjMKKwltb3Z6d2wJMTgocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMjAocjYpLC03NDgoZnApCisJYmljbDMJIy02NTUzNixyMiwtNzUyKGZwKQorCW11bGwzCXIwLC03NDgoZnApLC03NDAoZnApCisJbXVsbDIJcjMsLTc0OChmcCkKKwltdWxsMwlyMywtNzUyKGZwKSwtNzQ0KGZwKQorCW11bGwyCXIwLC03NTIoZnApCisJYWRkbDMJLTc0MChmcCksLTc0NChmcCkscjAKKwliaWNsMwkjMCxyMCwtNzQwKGZwKQorCWNtcGwJLTc0MChmcCksLTc0NChmcCkKKwliZ2VxdQlub25hbWUuMjI5CisJYWRkbDIJIzY1NTM2LC03NTIoZnApCitub25hbWUuMjI5OgorCW1vdnp3bAktNzM4KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtNzUyKGZwKQorCWJpY2wzCSMtNjU1MzYsLTc0MChmcCkscjAKKwlhc2hsCSMxNixyMCwtNzQ0KGZwKQorCWFkZGwzCS03NDQoZnApLC03NDgoZnApLHIwCisJYmljbDMJIzAscjAsLTc0OChmcCkKKwljbXBsCS03NDgoZnApLC03NDQoZnApCisJYmdlcXUJbm9uYW1lLjIzMAorCWluY2wJLTc1MihmcCkKK25vbmFtZS4yMzA6CisJbW92bAktNzQ4KGZwKSxyMQorCW1vdmwJLTc1MihmcCkscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS4yMzEKKwlpbmNsCXIyCitub25hbWUuMjMxOgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjIzMgorCWluY2wJcjEwCitub25hbWUuMjMyOgorCisJbW92endsCTI2KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMTIocjcpLHIzCisJbW92endsCTE0KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDI0KHI2KSwtNzY0KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTc2OChmcCkKKwltdWxsMwlyMCwtNzY0KGZwKSwtNzU2KGZwKQorCW11bGwyCXIzLC03NjQoZnApCisJbXVsbDMJcjMsLTc2OChmcCksLTc2MChmcCkKKwltdWxsMglyMCwtNzY4KGZwKQorCWFkZGwzCS03NTYoZnApLC03NjAoZnApLHIwCisJYmljbDMJIzAscjAsLTc1NihmcCkKKwljbXBsCS03NTYoZnApLC03NjAoZnApCisJYmdlcXUJbm9uYW1lLjIzMworCWFkZGwyCSM2NTUzNiwtNzY4KGZwKQorbm9uYW1lLjIzMzoKKwltb3Z6d2wJLTc1NChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTc2OChmcCkKKwliaWNsMwkjLTY1NTM2LC03NTYoZnApLHIwCisJYXNobAkjMTYscjAsLTc2MChmcCkKKwlhZGRsMwktNzYwKGZwKSwtNzY0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC03NjQoZnApCisJY21wbAktNzY0KGZwKSwtNzYwKGZwKQorCWJnZXF1CW5vbmFtZS4yMzQKKwlpbmNsCS03NjgoZnApCitub25hbWUuMjM0OgorCW1vdmwJLTc2NChmcCkscjEKKwltb3ZsCS03NjgoZnApLHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMjM1CisJaW5jbAlyMgorbm9uYW1lLjIzNToKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4yMzYKKwlpbmNsCXIxMAorbm9uYW1lLjIzNjoKKworCWJpY2wzCSMtNjU1MzYsMjgocjYpLHIzCisJbW92endsCTMwKHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDgocjcpLHIyCisJbW92endsCTEwKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC03NzIoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtNzc2KGZwKQorCW11bGwyCXIwLHI0CisJYWRkbDMJLTc3MihmcCksLTc3NihmcCkscjAKKwliaWNsMwkjMCxyMCwtNzcyKGZwKQorCWNtcGwJLTc3MihmcCksLTc3NihmcCkKKwliZ2VxdQlub25hbWUuMjM3CisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMjM3OgorCW1vdnp3bAktNzcwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCxyNAorCWJpY2wzCSMtNjU1MzYsLTc3MihmcCkscjAKKwlhc2hsCSMxNixyMCwtNzc2KGZwKQorCWFkZGwyCS03NzYoZnApLHI1CisJYmljbDIJIzAscjUKKwljbXBsCXI1LC03NzYoZnApCisJYmdlcXUJbm9uYW1lLjIzOAorCWluY2wJcjQKK25vbmFtZS4yMzg6CisJbW92bAlyNSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS4yMzkKKwlpbmNsCXIyCitub25hbWUuMjM5OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjI0MAorCWluY2wJcjEwCitub25hbWUuMjQwOgorCisJbW92bAlyOSwzNihyMTEpCisKKwljbHJsCXI5CisKKwliaWNsMwkjLTY1NTM2LDI4KHI2KSxyMworCW1vdnp3bAkzMChyNikscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwxMihyNykscjIKKwltb3Z6d2wJMTQocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTc4MChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC03ODQoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktNzgwKGZwKSwtNzg0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC03ODAoZnApCisJY21wbAktNzgwKGZwKSwtNzg0KGZwKQorCWJnZXF1CW5vbmFtZS4yNDEKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4yNDE6CisJbW92endsCS03NzgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtNzgwKGZwKSxyMAorCWFzaGwJIzE2LHIwLC03ODQoZnApCisJYWRkbDIJLTc4NChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTc4NChmcCkKKwliZ2VxdQlub25hbWUuMjQyCisJaW5jbAlyNAorbm9uYW1lLjI0MjoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIxCisJYmdlcXUJbm9uYW1lLjI0MworCWluY2wJcjIKK25vbmFtZS4yNDM6CisJYWRkbDIJcjIscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjIKKwliZ2VxdQlub25hbWUuMjQ0CisJaW5jbAlyOQorbm9uYW1lLjI0NDoKKworCWJpY2wzCSMtNjU1MzYsMjQocjYpLHIzCisJbW92endsCTI2KHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDE2KHI3KSxyMgorCW1vdnp3bAkxOChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtNzg4KGZwKQorCW11bGwyCXIyLHI1CisJbXVsbDMJcjIscjQsLTc5MihmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS03ODgoZnApLC03OTIoZnApLHIwCisJYmljbDMJIzAscjAsLTc4OChmcCkKKwljbXBsCS03ODgoZnApLC03OTIoZnApCisJYmdlcXUJbm9uYW1lLjI0NQorCWFkZGwyCSM2NTUzNixyNAorbm9uYW1lLjI0NToKKwltb3Z6d2wJLTc4NihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC03ODgoZnApLHIwCisJYXNobAkjMTYscjAsLTc5MihmcCkKKwlhZGRsMgktNzkyKGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtNzkyKGZwKQorCWJnZXF1CW5vbmFtZS4yNDYKKwlpbmNsCXI0Citub25hbWUuMjQ2OgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMjQ3CisJaW5jbAlyMgorbm9uYW1lLjI0NzoKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4yNDgKKwlpbmNsCXI5Citub25hbWUuMjQ4OgorCisJYmljbDMJIy02NTUzNiwyMChyNikscjMKKwltb3Z6d2wJMjIocjYpLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsMjAocjcpLHIyCisJbW92endsCTIyKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC03OTYoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtODAwKGZwKQorCW11bGwyCXIwLHI0CisJYWRkbDMJLTc5NihmcCksLTgwMChmcCkscjAKKwliaWNsMwkjMCxyMCwtNzk2KGZwKQorCWNtcGwJLTc5NihmcCksLTgwMChmcCkKKwliZ2VxdQlub25hbWUuMjQ5CisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMjQ5OgorCW1vdnp3bAktNzk0KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCxyNAorCWJpY2wzCSMtNjU1MzYsLTc5NihmcCkscjAKKwlhc2hsCSMxNixyMCwtODAwKGZwKQorCWFkZGwyCS04MDAoZnApLHI1CisJYmljbDIJIzAscjUKKwljbXBsCXI1LC04MDAoZnApCisJYmdlcXUJbm9uYW1lLjI1MAorCWluY2wJcjQKK25vbmFtZS4yNTA6CisJbW92bAlyNSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMQorCWJnZXF1CW5vbmFtZS4yNTEKKwlpbmNsCXIyCitub25hbWUuMjUxOgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjI1MgorCWluY2wJcjkKK25vbmFtZS4yNTI6CisKKwliaWNsMwkjLTY1NTM2LDE2KHI2KSxyMworCW1vdnp3bAkxOChyNikscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwyNChyNykscjIKKwltb3Z6d2wJMjYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTgwNChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC04MDgoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktODA0KGZwKSwtODA4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC04MDQoZnApCisJY21wbAktODA0KGZwKSwtODA4KGZwKQorCWJnZXF1CW5vbmFtZS4yNTMKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4yNTM6CisJbW92endsCS04MDIoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtODA0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC04MDgoZnApCisJYWRkbDIJLTgwOChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTgwOChmcCkKKwliZ2VxdQlub25hbWUuMjU0CisJaW5jbAlyNAorbm9uYW1lLjI1NDoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIxCisJYmdlcXUJbm9uYW1lLjI1NQorCWluY2wJcjIKK25vbmFtZS4yNTU6CisJYWRkbDIJcjIscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjIKKwliZ2VxdQlub25hbWUuMjU2CisJaW5jbAlyOQorbm9uYW1lLjI1NjoKKworCWJpY2wzCSMtNjU1MzYsMTIocjYpLHIzCisJbW92endsCTE0KHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDI4KHI3KSxyMgorCW1vdnp3bAkzMChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtODEyKGZwKQorCW11bGwyCXIyLHI1CisJbXVsbDMJcjIscjQsLTgxNihmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS04MTIoZnApLC04MTYoZnApLHIwCisJYmljbDMJIzAscjAsLTgxMihmcCkKKwljbXBsCS04MTIoZnApLC04MTYoZnApCisJYmdlcXUJbm9uYW1lLjI1NworCWFkZGwyCSM2NTUzNixyNAorbm9uYW1lLjI1NzoKKwltb3Z6d2wJLTgxMChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC04MTIoZnApLHIwCisJYXNobAkjMTYscjAsLTgxNihmcCkKKwlhZGRsMgktODE2KGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtODE2KGZwKQorCWJnZXF1CW5vbmFtZS4yNTgKKwlpbmNsCXI0Citub25hbWUuMjU4OgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMjU5CisJaW5jbAlyMgorbm9uYW1lLjI1OToKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4yNjAKKwlpbmNsCXI5Citub25hbWUuMjYwOgorCisJbW92bAlyOCw0MChyMTEpCisKKwljbHJsCXI4CisKKwliaWNsMwkjLTY1NTM2LDE2KHI2KSxyMworCW1vdnp3bAkxOChyNikscjIKKwliaWNsMwkjLTY1NTM2LDI4KHI3KSxyMQorCW1vdnp3bAkzMChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNAorCWJpY2wzCSMtNjU1MzYscjIsLTgyOChmcCkKKwltdWxsMwlyMCxyNCwtODIwKGZwKQorCW11bGwyCXIxLHI0CisJbXVsbDMJcjEsLTgyOChmcCksLTgyNChmcCkKKwltdWxsMglyMCwtODI4KGZwKQorCWFkZGwzCS04MjAoZnApLC04MjQoZnApLHIwCisJYmljbDMJIzAscjAsLTgyMChmcCkKKwljbXBsCS04MjAoZnApLC04MjQoZnApCisJYmdlcXUJbm9uYW1lLjI2MQorCWFkZGwyCSM2NTUzNiwtODI4KGZwKQorbm9uYW1lLjI2MToKKwltb3Z6d2wJLTgxOChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTgyOChmcCkKKwliaWNsMwkjLTY1NTM2LC04MjAoZnApLHIwCisJYXNobAkjMTYscjAsLTgyNChmcCkKKwlhZGRsMgktODI0KGZwKSxyNAorCWJpY2wyCSMwLHI0CisJY21wbAlyNCwtODI0KGZwKQorCWJnZXF1CW5vbmFtZS4yNjIKKwlpbmNsCS04MjgoZnApCitub25hbWUuMjYyOgorCW1vdmwJcjQscjEKKwltb3ZsCS04MjgoZnApLHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuMjYzCisJaW5jbAlyMgorbm9uYW1lLjI2MzoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS4yNjQKKwlpbmNsCXI4Citub25hbWUuMjY0OgorCisJbW92endsCTIyKHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMjQocjcpLHIzCisJbW92endsCTI2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDIwKHI2KSwtODQwKGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTg0NChmcCkKKwltdWxsMwlyMCwtODQwKGZwKSwtODMyKGZwKQorCW11bGwyCXIzLC04NDAoZnApCisJbXVsbDMJcjMsLTg0NChmcCksLTgzNihmcCkKKwltdWxsMglyMCwtODQ0KGZwKQorCWFkZGwzCS04MzIoZnApLC04MzYoZnApLHIwCisJYmljbDMJIzAscjAsLTgzMihmcCkKKwljbXBsCS04MzIoZnApLC04MzYoZnApCisJYmdlcXUJbm9uYW1lLjI2NQorCWFkZGwyCSM2NTUzNiwtODQ0KGZwKQorbm9uYW1lLjI2NToKKwltb3Z6d2wJLTgzMChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTg0NChmcCkKKwliaWNsMwkjLTY1NTM2LC04MzIoZnApLHIwCisJYXNobAkjMTYscjAsLTgzNihmcCkKKwlhZGRsMwktODM2KGZwKSwtODQwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC04NDAoZnApCisJY21wbAktODQwKGZwKSwtODM2KGZwKQorCWJnZXF1CW5vbmFtZS4yNjYKKwlpbmNsCS04NDQoZnApCitub25hbWUuMjY2OgorCW1vdmwJLTg0MChmcCkscjEKKwltb3ZsCS04NDQoZnApLHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuMjY3CisJaW5jbAlyMgorbm9uYW1lLjI2NzoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS4yNjgKKwlpbmNsCXI4Citub25hbWUuMjY4OgorCisJYmljbDMJIy02NTUzNiwyNChyNikscjMKKwltb3Z6d2wJMjYocjYpLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsMjAocjcpLHIyCisJbW92endsCTIyKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC04NDgoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtODUyKGZwKQorCW11bGwyCXIwLHI0CisJYWRkbDMJLTg0OChmcCksLTg1MihmcCkscjAKKwliaWNsMwkjMCxyMCwtODQ4KGZwKQorCWNtcGwJLTg0OChmcCksLTg1MihmcCkKKwliZ2VxdQlub25hbWUuMjY5CisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMjY5OgorCW1vdnp3bAktODQ2KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCxyNAorCWJpY2wzCSMtNjU1MzYsLTg0OChmcCkscjAKKwlhc2hsCSMxNixyMCwtODUyKGZwKQorCWFkZGwyCS04NTIoZnApLHI1CisJYmljbDIJIzAscjUKKwljbXBsCXI1LC04NTIoZnApCisJYmdlcXUJbm9uYW1lLjI3MAorCWluY2wJcjQKK25vbmFtZS4yNzA6CisJbW92bAlyNSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4yNzEKKwlpbmNsCXIyCitub25hbWUuMjcxOgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjI3MgorCWluY2wJcjgKK25vbmFtZS4yNzI6CisKKwliaWNsMwkjLTY1NTM2LDI4KHI2KSxyMworCW1vdnp3bAkzMChyNikscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwxNihyNykscjIKKwltb3Z6d2wJMTgocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTg1NihmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC04NjAoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktODU2KGZwKSwtODYwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC04NTYoZnApCisJY21wbAktODU2KGZwKSwtODYwKGZwKQorCWJnZXF1CW5vbmFtZS4yNzMKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4yNzM6CisJbW92endsCS04NTQoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtODU2KGZwKSxyMAorCWFzaGwJIzE2LHIwLC04NjAoZnApCisJYWRkbDIJLTg2MChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTg2MChmcCkKKwliZ2VxdQlub25hbWUuMjc0CisJaW5jbAlyNAorbm9uYW1lLjI3NDoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIxCisJYmdlcXUJbm9uYW1lLjI3NQorCWluY2wJcjIKK25vbmFtZS4yNzU6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuMjc2CisJaW5jbAlyOAorbm9uYW1lLjI3NjoKKworCW1vdmwJcjEwLDQ0KHIxMSkKKworCWNscmwJcjEwCisKKwliaWNsMwkjLTY1NTM2LDI4KHI2KSxyMworCW1vdnp3bAkzMChyNikscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwyMChyNykscjIKKwltb3Z6d2wJMjIocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTg2NChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC04NjgoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktODY0KGZwKSwtODY4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC04NjQoZnApCisJY21wbAktODY0KGZwKSwtODY4KGZwKQorCWJnZXF1CW5vbmFtZS4yNzcKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4yNzc6CisJbW92endsCS04NjIoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtODY0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC04NjgoZnApCisJYWRkbDIJLTg2OChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTg2OChmcCkKKwliZ2VxdQlub25hbWUuMjc4CisJaW5jbAlyNAorbm9uYW1lLjI3ODoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjI3OQorCWluY2wJcjIKK25vbmFtZS4yNzk6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuMjgwCisJaW5jbAlyMTAKK25vbmFtZS4yODA6CisKKwliaWNsMwkjLTY1NTM2LDI0KHI2KSxyMworCW1vdnp3bAkyNihyNikscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwyNChyNykscjIKKwltb3Z6d2wJMjYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTg3MihmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC04NzYoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktODcyKGZwKSwtODc2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC04NzIoZnApCisJY21wbAktODcyKGZwKSwtODc2KGZwKQorCWJnZXF1CW5vbmFtZS4yODEKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4yODE6CisJbW92endsCS04NzAoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtODcyKGZwKSxyMAorCWFzaGwJIzE2LHIwLC04NzYoZnApCisJYWRkbDIJLTg3NihmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTg3NihmcCkKKwliZ2VxdQlub25hbWUuMjgyCisJaW5jbAlyNAorbm9uYW1lLjI4MjoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjI4MworCWluY2wJcjIKK25vbmFtZS4yODM6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuMjg0CisJaW5jbAlyMTAKK25vbmFtZS4yODQ6CisKKwliaWNsMwkjLTY1NTM2LDIwKHI2KSxyMworCW1vdnp3bAkyMihyNikscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwyOChyNykscjIKKwltb3Z6d2wJMzAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTg4MChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC04ODQoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktODgwKGZwKSwtODg0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC04ODAoZnApCisJY21wbAktODgwKGZwKSwtODg0KGZwKQorCWJnZXF1CW5vbmFtZS4yODUKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4yODU6CisJbW92endsCS04NzgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtODgwKGZwKSxyMAorCWFzaGwJIzE2LHIwLC04ODQoZnApCisJYWRkbDIJLTg4NChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTg4NChmcCkKKwliZ2VxdQlub25hbWUuMjg2CisJaW5jbAlyNAorbm9uYW1lLjI4NjoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjI4NworCWluY2wJcjIKK25vbmFtZS4yODc6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuMjg4CisJaW5jbAlyMTAKK25vbmFtZS4yODg6CisKKwltb3ZsCXI5LDQ4KHIxMSkKKworCWNscmwJcjkKKworCWJpY2wzCSMtNjU1MzYsMjQocjYpLHIzCisJbW92endsCTI2KHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDI4KHI3KSxyMgorCW1vdnp3bAkzMChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtODg4KGZwKQorCW11bGwyCXIyLHI1CisJbXVsbDMJcjIscjQsLTg5MihmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS04ODgoZnApLC04OTIoZnApLHIwCisJYmljbDMJIzAscjAsLTg4OChmcCkKKwljbXBsCS04ODgoZnApLC04OTIoZnApCisJYmdlcXUJbm9uYW1lLjI4OQorCWFkZGwyCSM2NTUzNixyNAorbm9uYW1lLjI4OToKKwltb3Z6d2wJLTg4NihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC04ODgoZnApLHIwCisJYXNobAkjMTYscjAsLTg5MihmcCkKKwlhZGRsMgktODkyKGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtODkyKGZwKQorCWJnZXF1CW5vbmFtZS4yOTAKKwlpbmNsCXI0Citub25hbWUuMjkwOgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMjkxCisJaW5jbAlyMgorbm9uYW1lLjI5MToKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4yOTIKKwlpbmNsCXI5Citub25hbWUuMjkyOgorCisJbW92endsCTMwKHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsMjQocjcpLHIzCisJbW92endsCTI2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDI4KHI2KSwtOTA0KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTkwOChmcCkKKwltdWxsMwlyMCwtOTA0KGZwKSwtODk2KGZwKQorCW11bGwyCXIzLC05MDQoZnApCisJbXVsbDMJcjMsLTkwOChmcCksLTkwMChmcCkKKwltdWxsMglyMCwtOTA4KGZwKQorCWFkZGwzCS04OTYoZnApLC05MDAoZnApLHIwCisJYmljbDMJIzAscjAsLTg5NihmcCkKKwljbXBsCS04OTYoZnApLC05MDAoZnApCisJYmdlcXUJbm9uYW1lLjI5MworCWFkZGwyCSM2NTUzNiwtOTA4KGZwKQorbm9uYW1lLjI5MzoKKwltb3Z6d2wJLTg5NChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTkwOChmcCkKKwliaWNsMwkjLTY1NTM2LC04OTYoZnApLHIwCisJYXNobAkjMTYscjAsLTkwMChmcCkKKwlhZGRsMwktOTAwKGZwKSwtOTA0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC05MDQoZnApCisJY21wbAktOTA0KGZwKSwtOTAwKGZwKQorCWJnZXF1CW5vbmFtZS4yOTQKKwlpbmNsCS05MDgoZnApCitub25hbWUuMjk0OgorCW1vdmwJLTkwNChmcCkscjEKKwltb3ZsCS05MDgoZnApLHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMjk1CisJaW5jbAlyMgorbm9uYW1lLjI5NToKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4yOTYKKwlpbmNsCXI5Citub25hbWUuMjk2OgorCisJbW92bAlyOCw1MihyMTEpCisKKwljbHJsCXI4CisKKwltb3Z6d2wJMzAocjYpLHIyCisJYmljbDMJIy02NTUzNiwyOChyNykscjMKKwltb3Z6d2wJMzAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMjgocjYpLC05MjAoZnApCisJYmljbDMJIy02NTUzNixyMiwtOTI0KGZwKQorCW11bGwzCXIwLC05MjAoZnApLC05MTIoZnApCisJbXVsbDIJcjMsLTkyMChmcCkKKwltdWxsMwlyMywtOTI0KGZwKSwtOTE2KGZwKQorCW11bGwyCXIwLC05MjQoZnApCisJYWRkbDMJLTkxMihmcCksLTkxNihmcCkscjAKKwliaWNsMwkjMCxyMCwtOTEyKGZwKQorCWNtcGwJLTkxMihmcCksLTkxNihmcCkKKwliZ2VxdQlub25hbWUuMjk3CisJYWRkbDIJIzY1NTM2LC05MjQoZnApCitub25hbWUuMjk3OgorCW1vdnp3bAktOTEwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtOTI0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTkxMihmcCkscjAKKwlhc2hsCSMxNixyMCwtOTE2KGZwKQorCWFkZGwzCS05MTYoZnApLC05MjAoZnApLHIwCisJYmljbDMJIzAscjAsLTkyMChmcCkKKwljbXBsCS05MjAoZnApLC05MTYoZnApCisJYmdlcXUJbm9uYW1lLjI5OAorCWluY2wJLTkyNChmcCkKK25vbmFtZS4yOTg6CisJbW92bAktOTIwKGZwKSxyMQorCW1vdmwJLTkyNChmcCkscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4yOTkKKwlpbmNsCXIyCitub25hbWUuMjk5OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjMwMAorCWluY2wJcjgKK25vbmFtZS4zMDA6CisKKwltb3ZsCXIxMCw1NihyMTEpCisKKwltb3ZsCXI5LDYwKHIxMSkKKworCXJldAkKKworDAorCis7cj00IDsoQVApCis7YT04IDsoQVApCis7Yj0xMiA7KEFQKQorO249MTYgOyhBUCkJbglieSB2YWx1ZSAoaW5wdXQpCisKKwkucHNlY3QJY29kZSxub3dydAorCisuZW50cnkJQk5fTVVMX0NPTUJBNCxebTxyMixyMyxyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExPgorCW1vdmFiCS0xNTYoc3ApLHNwCisKKwljbHJxCXI5CisKKwljbHJsCXI4CisKKwltb3ZsCTgoYXApLHI2CisJYmljbDMJIy02NTUzNiwocjYpLHIzCisJbW92endsCTIocjYpLHIyCisJYmljbDIJIy02NTUzNixyMgorCW1vdmwJMTIoYXApLHI3CisJYmljbDMJIy02NTUzNiwocjcpLHIxCisJbW92endsCTIocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIyLHI0CisJbXVsbDMJcjAscjUsLTQoZnApCisJbXVsbDIJcjEscjUKKwltdWxsMwlyMSxyNCwtOChmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS00KGZwKSwtOChmcCkscjAKKwliaWNsMwkjMCxyMCwtNChmcCkKKwljbXBsCS00KGZwKSwtOChmcCkKKwliZ2VxdQlub25hbWUuMzAzCisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMzAzOgorCW1vdnp3bAktMihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC00KGZwKSxyMAorCWFzaGwJIzE2LHIwLC04KGZwKQorCWFkZGwyCS04KGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtOChmcCkKKwliZ2VxdQlub25hbWUuMzA0CisJaW5jbAlyNAorbm9uYW1lLjMwNDoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIxCisJYmdlcXUJbm9uYW1lLjMwNQorCWluY2wJcjIKK25vbmFtZS4zMDU6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuMzA2CisJaW5jbAlyOAorbm9uYW1lLjMwNjoKKworCW1vdmwJNChhcCkscjExCisJbW92bAlyMTAsKHIxMSkKKworCWNscmwJcjEwCisKKwliaWNsMwkjLTY1NTM2LChyNikscjMKKwltb3Z6d2wJMihyNikscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiw0KHI3KSxyMgorCW1vdnp3bAk2KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC0xMihmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC0xNihmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS0xMihmcCksLTE2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xMihmcCkKKwljbXBsCS0xMihmcCksLTE2KGZwKQorCWJnZXF1CW5vbmFtZS4zMDcKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4zMDc6CisJbW92endsCS0xMChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC0xMihmcCkscjAKKwlhc2hsCSMxNixyMCwtMTYoZnApCisJYWRkbDIJLTE2KGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtMTYoZnApCisJYmdlcXUJbm9uYW1lLjMwOAorCWluY2wJcjQKK25vbmFtZS4zMDg6CisJbW92bAlyNSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS4zMDkKKwlpbmNsCXIyCitub25hbWUuMzA5OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjMxMAorCWluY2wJcjEwCitub25hbWUuMzEwOgorCisJYmljbDMJIy02NTUzNiw0KHI2KSxyMworCW1vdnp3bAk2KHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LChyNykscjIKKwltb3Z6d2wJMihyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtMjAoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtMjQoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktMjAoZnApLC0yNChmcCkscjAKKwliaWNsMwkjMCxyMCwtMjAoZnApCisJY21wbAktMjAoZnApLC0yNChmcCkKKwliZ2VxdQlub25hbWUuMzExCisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMzExOgorCW1vdnp3bAktMTgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMjAoZnApLHIwCisJYXNobAkjMTYscjAsLTI0KGZwKQorCWFkZGwyCS0yNChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTI0KGZwKQorCWJnZXF1CW5vbmFtZS4zMTIKKwlpbmNsCXI0Citub25hbWUuMzEyOgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMzEzCisJaW5jbAlyMgorbm9uYW1lLjMxMzoKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4zMTQKKwlpbmNsCXIxMAorbm9uYW1lLjMxNDoKKworCW1vdmwJcjksNChyMTEpCisKKwljbHJsCXI5CisKKwliaWNsMwkjLTY1NTM2LDgocjYpLHIzCisJbW92endsCTEwKHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LChyNykscjIKKwltb3Z6d2wJMihyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtMjgoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtMzIoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktMjgoZnApLC0zMihmcCkscjAKKwliaWNsMwkjMCxyMCwtMjgoZnApCisJY21wbAktMjgoZnApLC0zMihmcCkKKwliZ2VxdQlub25hbWUuMzE1CisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMzE1OgorCW1vdnp3bAktMjYoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMjgoZnApLHIwCisJYXNobAkjMTYscjAsLTMyKGZwKQorCWFkZGwyCS0zMihmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTMyKGZwKQorCWJnZXF1CW5vbmFtZS4zMTYKKwlpbmNsCXI0Citub25hbWUuMzE2OgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMzE3CisJaW5jbAlyMgorbm9uYW1lLjMxNzoKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4zMTgKKwlpbmNsCXI5Citub25hbWUuMzE4OgorCisJYmljbDMJIy02NTUzNiw0KHI2KSxyMworCW1vdnp3bAk2KHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDQocjcpLHIyCisJbW92endsCTYocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTM2KGZwKQorCW11bGwyCXIyLHI1CisJbXVsbDMJcjIscjQsLTQwKGZwKQorCW11bGwyCXIwLHI0CisJYWRkbDMJLTM2KGZwKSwtNDAoZnApLHIwCisJYmljbDMJIzAscjAsLTM2KGZwKQorCWNtcGwJLTM2KGZwKSwtNDAoZnApCisJYmdlcXUJbm9uYW1lLjMxOQorCWFkZGwyCSM2NTUzNixyNAorbm9uYW1lLjMxOToKKwltb3Z6d2wJLTM0KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCxyNAorCWJpY2wzCSMtNjU1MzYsLTM2KGZwKSxyMAorCWFzaGwJIzE2LHIwLC00MChmcCkKKwlhZGRsMgktNDAoZnApLHI1CisJYmljbDIJIzAscjUKKwljbXBsCXI1LC00MChmcCkKKwliZ2VxdQlub25hbWUuMzIwCisJaW5jbAlyNAorbm9uYW1lLjMyMDoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIxCisJYmdlcXUJbm9uYW1lLjMyMQorCWluY2wJcjIKK25vbmFtZS4zMjE6CisJYWRkbDIJcjIscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjIKKwliZ2VxdQlub25hbWUuMzIyCisJaW5jbAlyOQorbm9uYW1lLjMyMjoKKworCWJpY2wzCSMtNjU1MzYsKHI2KSxyMworCW1vdnp3bAkyKHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDgocjcpLHIyCisJbW92endsCTEwKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC00NChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC00OChmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS00NChmcCksLTQ4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC00NChmcCkKKwljbXBsCS00NChmcCksLTQ4KGZwKQorCWJnZXF1CW5vbmFtZS4zMjMKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4zMjM6CisJbW92endsCS00MihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC00NChmcCkscjAKKwlhc2hsCSMxNixyMCwtNDgoZnApCisJYWRkbDIJLTQ4KGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtNDgoZnApCisJYmdlcXUJbm9uYW1lLjMyNAorCWluY2wJcjQKK25vbmFtZS4zMjQ6CisJbW92bAlyNSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMQorCWJnZXF1CW5vbmFtZS4zMjUKKwlpbmNsCXIyCitub25hbWUuMzI1OgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjMyNgorCWluY2wJcjkKK25vbmFtZS4zMjY6CisKKwltb3ZsCXI4LDgocjExKQorCisJY2xybAlyOAorCisJYmljbDMJIy02NTUzNiwocjYpLHIzCisJbW92endsCTIocjYpLHIyCisJYmljbDMJIy02NTUzNiwxMihyNykscjEKKwltb3Z6d2wJMTQocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjQKKwliaWNsMwkjLTY1NTM2LHIyLC02MChmcCkKKwltdWxsMwlyMCxyNCwtNTIoZnApCisJbXVsbDIJcjEscjQKKwltdWxsMwlyMSwtNjAoZnApLC01NihmcCkKKwltdWxsMglyMCwtNjAoZnApCisJYWRkbDMJLTUyKGZwKSwtNTYoZnApLHIwCisJYmljbDMJIzAscjAsLTUyKGZwKQorCWNtcGwJLTUyKGZwKSwtNTYoZnApCisJYmdlcXUJbm9uYW1lLjMyNworCWFkZGwyCSM2NTUzNiwtNjAoZnApCitub25hbWUuMzI3OgorCW1vdnp3bAktNTAoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC02MChmcCkKKwliaWNsMwkjLTY1NTM2LC01MihmcCkscjAKKwlhc2hsCSMxNixyMCwtNTYoZnApCisJYWRkbDIJLTU2KGZwKSxyNAorCWJpY2wyCSMwLHI0CisJY21wbAlyNCwtNTYoZnApCisJYmdlcXUJbm9uYW1lLjMyOAorCWluY2wJLTYwKGZwKQorbm9uYW1lLjMyODoKKwltb3ZsCXI0LHIxCisJbW92bAktNjAoZnApLHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuMzI5CisJaW5jbAlyMgorbm9uYW1lLjMyOToKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS4zMzAKKwlpbmNsCXI4Citub25hbWUuMzMwOgorCisJbW92endsCTYocjYpLHIyCisJYmljbDMJIy02NTUzNiw4KHI3KSxyMworCW1vdnp3bAkxMChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiw0KHI2KSwtNzIoZnApCisJYmljbDMJIy02NTUzNixyMiwtNzYoZnApCisJbXVsbDMJcjAsLTcyKGZwKSwtNjQoZnApCisJbXVsbDIJcjMsLTcyKGZwKQorCW11bGwzCXIzLC03NihmcCksLTY4KGZwKQorCW11bGwyCXIwLC03NihmcCkKKwlhZGRsMwktNjQoZnApLC02OChmcCkscjAKKwliaWNsMwkjMCxyMCwtNjQoZnApCisJY21wbAktNjQoZnApLC02OChmcCkKKwliZ2VxdQlub25hbWUuMzMxCisJYWRkbDIJIzY1NTM2LC03NihmcCkKK25vbmFtZS4zMzE6CisJbW92endsCS02MihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTc2KGZwKQorCWJpY2wzCSMtNjU1MzYsLTY0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC02OChmcCkKKwlhZGRsMwktNjgoZnApLC03MihmcCkscjAKKwliaWNsMwkjMCxyMCwtNzIoZnApCisJY21wbAktNzIoZnApLC02OChmcCkKKwliZ2VxdQlub25hbWUuMzMyCisJaW5jbAktNzYoZnApCitub25hbWUuMzMyOgorCW1vdmwJLTcyKGZwKSxyMQorCW1vdmwJLTc2KGZwKSxyMgorCWFkZGwyCXIxLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIxCisJYmdlcXUJbm9uYW1lLjMzMworCWluY2wJcjIKK25vbmFtZS4zMzM6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuMzM0CisJaW5jbAlyOAorbm9uYW1lLjMzNDoKKworCWJpY2wzCSMtNjU1MzYsOChyNikscjMKKwltb3Z6d2wJMTAocjYpLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsNChyNykscjIKKwltb3Z6d2wJNihyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtODAoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtODQoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktODAoZnApLC04NChmcCkscjAKKwliaWNsMwkjMCxyMCwtODAoZnApCisJY21wbAktODAoZnApLC04NChmcCkKKwliZ2VxdQlub25hbWUuMzM1CisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMzM1OgorCW1vdnp3bAktNzgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtODAoZnApLHIwCisJYXNobAkjMTYscjAsLTg0KGZwKQorCWFkZGwyCS04NChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTg0KGZwKQorCWJnZXF1CW5vbmFtZS4zMzYKKwlpbmNsCXI0Citub25hbWUuMzM2OgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjEKKwliZ2VxdQlub25hbWUuMzM3CisJaW5jbAlyMgorbm9uYW1lLjMzNzoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS4zMzgKKwlpbmNsCXI4Citub25hbWUuMzM4OgorCisJYmljbDMJIy02NTUzNiwxMihyNikscjMKKwltb3Z6d2wJMTQocjYpLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsKHI3KSxyMgorCW1vdnp3bAkyKHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC04OChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC05MihmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS04OChmcCksLTkyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC04OChmcCkKKwljbXBsCS04OChmcCksLTkyKGZwKQorCWJnZXF1CW5vbmFtZS4zMzkKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4zMzk6CisJbW92endsCS04NihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC04OChmcCkscjAKKwlhc2hsCSMxNixyMCwtOTIoZnApCisJYWRkbDIJLTkyKGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtOTIoZnApCisJYmdlcXUJbm9uYW1lLjM0MAorCWluY2wJcjQKK25vbmFtZS4zNDA6CisJbW92bAlyNSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS4zNDEKKwlpbmNsCXIyCitub25hbWUuMzQxOgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjM0MgorCWluY2wJcjgKK25vbmFtZS4zNDI6CisKKwltb3ZsCXIxMCwxMihyMTEpCisKKwljbHJsCXIxMAorCisJYmljbDMJIy02NTUzNiwxMihyNikscjMKKwltb3Z6d2wJMTQocjYpLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsNChyNykscjIKKwltb3Z6d2wJNihyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtOTYoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtMTAwKGZwKQorCW11bGwyCXIwLHI0CisJYWRkbDMJLTk2KGZwKSwtMTAwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC05NihmcCkKKwljbXBsCS05NihmcCksLTEwMChmcCkKKwliZ2VxdQlub25hbWUuMzQzCisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMzQzOgorCW1vdnp3bAktOTQoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtOTYoZnApLHIwCisJYXNobAkjMTYscjAsLTEwMChmcCkKKwlhZGRsMgktMTAwKGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtMTAwKGZwKQorCWJnZXF1CW5vbmFtZS4zNDQKKwlpbmNsCXI0Citub25hbWUuMzQ0OgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMzQ1CisJaW5jbAlyMgorbm9uYW1lLjM0NToKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4zNDYKKwlpbmNsCXIxMAorbm9uYW1lLjM0NjoKKworCWJpY2wzCSMtNjU1MzYsOChyNikscjMKKwltb3Z6d2wJMTAocjYpLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsOChyNykscjIKKwltb3Z6d2wJMTAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTEwNChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC0xMDgoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktMTA0KGZwKSwtMTA4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xMDQoZnApCisJY21wbAktMTA0KGZwKSwtMTA4KGZwKQorCWJnZXF1CW5vbmFtZS4zNDcKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS4zNDc6CisJbW92endsCS0xMDIoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMTA0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0xMDgoZnApCisJYWRkbDIJLTEwOChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTEwOChmcCkKKwliZ2VxdQlub25hbWUuMzQ4CisJaW5jbAlyNAorbm9uYW1lLjM0ODoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjM0OQorCWluY2wJcjIKK25vbmFtZS4zNDk6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuMzUwCisJaW5jbAlyMTAKK25vbmFtZS4zNTA6CisKKwliaWNsMwkjLTY1NTM2LDQocjYpLHIzCisJbW92endsCTYocjYpLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsMTIocjcpLHIyCisJbW92endsCTE0KHI3KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC0xMTIoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtMTE2KGZwKQorCW11bGwyCXIwLHI0CisJYWRkbDMJLTExMihmcCksLTExNihmcCkscjAKKwliaWNsMwkjMCxyMCwtMTEyKGZwKQorCWNtcGwJLTExMihmcCksLTExNihmcCkKKwliZ2VxdQlub25hbWUuMzUxCisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuMzUxOgorCW1vdnp3bAktMTEwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCxyNAorCWJpY2wzCSMtNjU1MzYsLTExMihmcCkscjAKKwlhc2hsCSMxNixyMCwtMTE2KGZwKQorCWFkZGwyCS0xMTYoZnApLHI1CisJYmljbDIJIzAscjUKKwljbXBsCXI1LC0xMTYoZnApCisJYmdlcXUJbm9uYW1lLjM1MgorCWluY2wJcjQKK25vbmFtZS4zNTI6CisJbW92bAlyNSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS4zNTMKKwlpbmNsCXIyCitub25hbWUuMzUzOgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjM1NAorCWluY2wJcjEwCitub25hbWUuMzU0OgorCisJbW92bAlyOSwxNihyMTEpCisKKwljbHJsCXI5CisKKwliaWNsMwkjLTY1NTM2LDgocjYpLHIzCisJbW92endsCTEwKHI2KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDEyKHI3KSxyMgorCW1vdnp3bAkxNChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtMTIwKGZwKQorCW11bGwyCXIyLHI1CisJbXVsbDMJcjIscjQsLTEyNChmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS0xMjAoZnApLC0xMjQoZnApLHIwCisJYmljbDMJIzAscjAsLTEyMChmcCkKKwljbXBsCS0xMjAoZnApLC0xMjQoZnApCisJYmdlcXUJbm9uYW1lLjM1NQorCWFkZGwyCSM2NTUzNixyNAorbm9uYW1lLjM1NToKKwltb3Z6d2wJLTExOChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC0xMjAoZnApLHIwCisJYXNobAkjMTYscjAsLTEyNChmcCkKKwlhZGRsMgktMTI0KGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtMTI0KGZwKQorCWJnZXF1CW5vbmFtZS4zNTYKKwlpbmNsCXI0Citub25hbWUuMzU2OgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjEKKwliZ2VxdQlub25hbWUuMzU3CisJaW5jbAlyMgorbm9uYW1lLjM1NzoKKwlhZGRsMglyMixyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMgorCWJnZXF1CW5vbmFtZS4zNTgKKwlpbmNsCXI5Citub25hbWUuMzU4OgorCisJbW92endsCTE0KHI2KSxyMgorCWJpY2wzCSMtNjU1MzYsOChyNykscjMKKwltb3Z6d2wJMTAocjcpLHIwCisJYmljbDIJIy02NTUzNixyMAorCWJpY2wzCSMtNjU1MzYsMTIocjYpLC0xMzYoZnApCisJYmljbDMJIy02NTUzNixyMiwtMTQwKGZwKQorCW11bGwzCXIwLC0xMzYoZnApLC0xMjgoZnApCisJbXVsbDIJcjMsLTEzNihmcCkKKwltdWxsMwlyMywtMTQwKGZwKSwtMTMyKGZwKQorCW11bGwyCXIwLC0xNDAoZnApCisJYWRkbDMJLTEyOChmcCksLTEzMihmcCkscjAKKwliaWNsMwkjMCxyMCwtMTI4KGZwKQorCWNtcGwJLTEyOChmcCksLTEzMihmcCkKKwliZ2VxdQlub25hbWUuMzU5CisJYWRkbDIJIzY1NTM2LC0xNDAoZnApCitub25hbWUuMzU5OgorCW1vdnp3bAktMTI2KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMTQwKGZwKQorCWJpY2wzCSMtNjU1MzYsLTEyOChmcCkscjAKKwlhc2hsCSMxNixyMCwtMTMyKGZwKQorCWFkZGwzCS0xMzIoZnApLC0xMzYoZnApLHIwCisJYmljbDMJIzAscjAsLTEzNihmcCkKKwljbXBsCS0xMzYoZnApLC0xMzIoZnApCisJYmdlcXUJbm9uYW1lLjM2MAorCWluY2wJLTE0MChmcCkKK25vbmFtZS4zNjA6CisJbW92bAktMTM2KGZwKSxyMQorCW1vdmwJLTE0MChmcCkscjIKKwlhZGRsMglyMSxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMQorCWJnZXF1CW5vbmFtZS4zNjEKKwlpbmNsCXIyCitub25hbWUuMzYxOgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjM2MgorCWluY2wJcjkKK25vbmFtZS4zNjI6CisKKwltb3ZsCXI4LDIwKHIxMSkKKworCWNscmwJcjgKKworCW1vdnp3bAkxNChyNikscjIKKwliaWNsMwkjLTY1NTM2LDEyKHI3KSxyMworCW1vdnp3bAkxNChyNykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiwxMihyNiksLTE1MihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0xNTYoZnApCisJbXVsbDMJcjAsLTE1MihmcCksLTE0NChmcCkKKwltdWxsMglyMywtMTUyKGZwKQorCW11bGwzCXIzLC0xNTYoZnApLC0xNDgoZnApCisJbXVsbDIJcjAsLTE1NihmcCkKKwlhZGRsMwktMTQ0KGZwKSwtMTQ4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xNDQoZnApCisJY21wbAktMTQ0KGZwKSwtMTQ4KGZwKQorCWJnZXF1CW5vbmFtZS4zNjMKKwlhZGRsMgkjNjU1MzYsLTE1NihmcCkKK25vbmFtZS4zNjM6CisJbW92endsCS0xNDIoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0xNTYoZnApCisJYmljbDMJIy02NTUzNiwtMTQ0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0xNDgoZnApCisJYWRkbDMJLTE0OChmcCksLTE1MihmcCkscjAKKwliaWNsMwkjMCxyMCwtMTUyKGZwKQorCWNtcGwJLTE1MihmcCksLTE0OChmcCkKKwliZ2VxdQlub25hbWUuMzY0CisJaW5jbAktMTU2KGZwKQorbm9uYW1lLjM2NDoKKwltb3ZsCS0xNTIoZnApLHIxCisJbW92bAktMTU2KGZwKSxyMgorCWFkZGwyCXIxLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIxCisJYmdlcXUJbm9uYW1lLjM2NQorCWluY2wJcjIKK25vbmFtZS4zNjU6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuMzY2CisJaW5jbAlyOAorbm9uYW1lLjM2NjoKKworCW1vdmwJcjEwLDI0KHIxMSkKKworCW1vdmwJcjksMjgocjExKQorCisJcmV0CQorCisMCisKKztyPTQgOyhBUCkKKzthPTggOyhBUCkKKztiPTEyIDsoQVApCis7bj0xNiA7KEFQKQluCWJ5IHZhbHVlIChpbnB1dCkKKworCS5wc2VjdAljb2RlLG5vd3J0CisKKy5lbnRyeQlCTl9TUVJfQ09NQkE4LF5tPHIyLHIzLHI0LHI1LHI2LHI3LHI4LHI5PgorCW1vdmFiCS00NDQoc3ApLHNwCisKKwljbHJxCXI4CisKKwljbHJsCXI3CisKKwltb3ZsCTgoYXApLHI0CisJbW92bAkocjQpLHIzCisJYmljbDMJIy02NTUzNixyMywtNChmcCkKKwlleHR6dgkjMTYsIzE2LHIzLHIwCisJYmljbDMJIy02NTUzNixyMCxyMworCW1vdmwJLTQoZnApLHIwCisJbXVsbDMJcjAscjMsLTgoZnApCisJbXVsbDMJcjAscjAsLTQoZnApCisJbXVsbDIJcjMscjMKKwliaWNsMwkjMzI3NjcsLTgoZnApLHIwCisJZXh0enYJIzE1LCMxNyxyMCxyMAorCWFkZGwyCXIwLHIzCisJYmljbDMJIy02NTUzNiwtOChmcCkscjAKKwlhc2hsCSMxNyxyMCwtOChmcCkKKwlhZGRsMwktNChmcCksLTgoZnApLHIwCisJYmljbDMJIzAscjAsLTQoZnApCisJY21wbAktNChmcCksLTgoZnApCisJYmdlcXUJbm9uYW1lLjM2OQorCWluY2wJcjMKK25vbmFtZS4zNjk6CisJbW92bAktNChmcCkscjEKKwltb3ZsCXIzLHIyCisJYWRkbDIJcjEscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjEKKwliZ2VxdQlub25hbWUuMzcwCisJaW5jbAlyMgorbm9uYW1lLjM3MDoKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4zNzEKKwlpbmNsCXI3Citub25hbWUuMzcxOgorCisJbW92bAlyOSxANChhcCkKKworCWNscmwJcjkKKworCW1vdnp3bAk2KHI0KSxyMgorCWJpY2wzCSMtNjU1MzYsKHI0KSxyMworCW1vdnp3bAkyKHI0KSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDQocjQpLC0yMChmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0yNChmcCkKKwltdWxsMwlyMCwtMjAoZnApLC0xMihmcCkKKwltdWxsMglyMywtMjAoZnApCisJbXVsbDMJcjMsLTI0KGZwKSwtMTYoZnApCisJbXVsbDIJcjAsLTI0KGZwKQorCWFkZGwzCS0xMihmcCksLTE2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xMihmcCkKKwljbXBsCS0xMihmcCksLTE2KGZwKQorCWJnZXF1CW5vbmFtZS4zNzIKKwlhZGRsMgkjNjU1MzYsLTI0KGZwKQorbm9uYW1lLjM3MjoKKwltb3Z6d2wJLTEwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMjQoZnApCisJYmljbDMJIy02NTUzNiwtMTIoZnApLHIwCisJYXNobAkjMTYscjAsLTE2KGZwKQorCWFkZGwzCS0xNihmcCksLTIwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yMChmcCkKKwljbXBsCS0yMChmcCksLTE2KGZwKQorCWJnZXF1CW5vbmFtZS4zNzMKKwlpbmNsCS0yNChmcCkKK25vbmFtZS4zNzM6CisJbW92bAktMjAoZnApLHIzCisJbW92bAktMjQoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuMzc0CisJaW5jbAlyOQorbm9uYW1lLjM3NDoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuMzc1CisJaW5jbAlyMgorbm9uYW1lLjM3NToKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjMKKwliZ2VxdQlub25hbWUuMzc2CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuMzc2CisJaW5jbAlyOQorbm9uYW1lLjM3NjoKKwlhZGRsMglyMixyNworCWJpY2wyCSMwLHI3CisJY21wbAlyNyxyMgorCWJnZXF1CW5vbmFtZS4zNzcKKwlpbmNsCXI5Citub25hbWUuMzc3OgorCisJbW92bAk0KGFwKSxyMAorCW1vdmwJcjgsNChyMCkKKworCWNscmwJcjgKKworCW1vdmwJOChhcCkscjQKKwltb3ZsCTQocjQpLHIzCisJYmljbDMJIy02NTUzNixyMywtMjgoZnApCisJZXh0enYJIzE2LCMxNixyMyxyMAorCWJpY2wzCSMtNjU1MzYscjAscjMKKwltb3ZsCS0yOChmcCkscjAKKwltdWxsMwlyMCxyMywtMzIoZnApCisJbXVsbDMJcjAscjAsLTI4KGZwKQorCW11bGwyCXIzLHIzCisJYmljbDMJIzMyNzY3LC0zMihmcCkscjAKKwlleHR6dgkjMTUsIzE3LHIwLHIwCisJYWRkbDIJcjAscjMKKwliaWNsMwkjLTY1NTM2LC0zMihmcCkscjAKKwlhc2hsCSMxNyxyMCwtMzIoZnApCisJYWRkbDMJLTI4KGZwKSwtMzIoZnApLHIwCisJYmljbDMJIzAscjAsLTI4KGZwKQorCWNtcGwJLTI4KGZwKSwtMzIoZnApCisJYmdlcXUJbm9uYW1lLjM3OAorCWluY2wJcjMKK25vbmFtZS4zNzg6CisJbW92bAktMjgoZnApLHIxCisJbW92bAlyMyxyMgorCWFkZGwyCXIxLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIxCisJYmdlcXUJbm9uYW1lLjM3OQorCWluY2wJcjIKK25vbmFtZS4zNzk6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuMzgwCisJaW5jbAlyOAorbm9uYW1lLjM4MDoKKworCW1vdnp3bAkxMChyNCkscjIKKwliaWNsMwkjLTY1NTM2LChyNCkscjMKKwltb3Z6d2wJMihyNCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiw4KHI0KSwtNDQoZnApCisJYmljbDMJIy02NTUzNixyMiwtNDgoZnApCisJbXVsbDMJcjAsLTQ0KGZwKSwtMzYoZnApCisJbXVsbDIJcjMsLTQ0KGZwKQorCW11bGwzCXIzLC00OChmcCksLTQwKGZwKQorCW11bGwyCXIwLC00OChmcCkKKwlhZGRsMwktMzYoZnApLC00MChmcCkscjAKKwliaWNsMwkjMCxyMCwtMzYoZnApCisJY21wbAktMzYoZnApLC00MChmcCkKKwliZ2VxdQlub25hbWUuMzgxCisJYWRkbDIJIzY1NTM2LC00OChmcCkKK25vbmFtZS4zODE6CisJbW92endsCS0zNChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTQ4KGZwKQorCWJpY2wzCSMtNjU1MzYsLTM2KGZwKSxyMAorCWFzaGwJIzE2LHIwLC00MChmcCkKKwlhZGRsMwktNDAoZnApLC00NChmcCkscjAKKwliaWNsMwkjMCxyMCwtNDQoZnApCisJY21wbAktNDQoZnApLC00MChmcCkKKwliZ2VxdQlub25hbWUuMzgyCisJaW5jbAktNDgoZnApCitub25hbWUuMzgyOgorCW1vdmwJLTQ0KGZwKSxyMworCW1vdmwJLTQ4KGZwKSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjM4MworCWluY2wJcjgKK25vbmFtZS4zODM6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjM4NAorCWluY2wJcjIKK25vbmFtZS4zODQ6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIzCisJYmdlcXUJbm9uYW1lLjM4NQorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjM4NQorCWluY2wJcjgKK25vbmFtZS4zODU6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuMzg2CisJaW5jbAlyOAorbm9uYW1lLjM4NjoKKworCW1vdmwJNChhcCkscjAKKwltb3ZsCXI3LDgocjApCisKKwljbHJsCXI3CisKKwltb3ZsCTgoYXApLHIwCisJbW92endsCTE0KHIwKSxyMgorCWJpY2wzCSMtNjU1MzYsKHIwKSxyMworCW1vdnp3bAkyKHIwKSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDEyKHIwKSwtNjAoZnApCisJYmljbDMJIy02NTUzNixyMiwtNjQoZnApCisJbXVsbDMJcjEsLTYwKGZwKSwtNTIoZnApCisJbXVsbDIJcjMsLTYwKGZwKQorCW11bGwzCXIzLC02NChmcCksLTU2KGZwKQorCW11bGwyCXIxLC02NChmcCkKKwlhZGRsMwktNTIoZnApLC01NihmcCkscjAKKwliaWNsMwkjMCxyMCwtNTIoZnApCisJY21wbAktNTIoZnApLC01NihmcCkKKwliZ2VxdQlub25hbWUuMzg3CisJYWRkbDIJIzY1NTM2LC02NChmcCkKK25vbmFtZS4zODc6CisJbW92endsCS01MChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTY0KGZwKQorCWJpY2wzCSMtNjU1MzYsLTUyKGZwKSxyMAorCWFzaGwJIzE2LHIwLC01NihmcCkKKwlhZGRsMwktNTYoZnApLC02MChmcCkscjAKKwliaWNsMwkjMCxyMCwtNjAoZnApCisJY21wbAktNjAoZnApLC01NihmcCkKKwliZ2VxdQlub25hbWUuMzg4CisJaW5jbAktNjQoZnApCitub25hbWUuMzg4OgorCW1vdmwJLTYwKGZwKSxyMworCW1vdmwJLTY0KGZwKSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjM4OQorCWluY2wJcjcKK25vbmFtZS4zODk6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjM5MAorCWluY2wJcjIKK25vbmFtZS4zOTA6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIzCisJYmdlcXUJbm9uYW1lLjM5MQorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjM5MQorCWluY2wJcjcKK25vbmFtZS4zOTE6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuMzkyCisJaW5jbAlyNworbm9uYW1lLjM5MjoKKworCW1vdmwJOChhcCkscjAKKwltb3Z6d2wJMTAocjApLHIyCisJYmljbDMJIy02NTUzNiw0KHIwKSxyMworCW1vdnp3bAk2KHIwKSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDgocjApLC03NihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC04MChmcCkKKwltdWxsMwlyMSwtNzYoZnApLC02OChmcCkKKwltdWxsMglyMywtNzYoZnApCisJbXVsbDMJcjMsLTgwKGZwKSwtNzIoZnApCisJbXVsbDIJcjEsLTgwKGZwKQorCWFkZGwzCS02OChmcCksLTcyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC02OChmcCkKKwljbXBsCS02OChmcCksLTcyKGZwKQorCWJnZXF1CW5vbmFtZS4zOTMKKwlhZGRsMgkjNjU1MzYsLTgwKGZwKQorbm9uYW1lLjM5MzoKKwltb3Z6d2wJLTY2KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtODAoZnApCisJYmljbDMJIy02NTUzNiwtNjgoZnApLHIwCisJYXNobAkjMTYscjAsLTcyKGZwKQorCWFkZGwzCS03MihmcCksLTc2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC03NihmcCkKKwljbXBsCS03NihmcCksLTcyKGZwKQorCWJnZXF1CW5vbmFtZS4zOTQKKwlpbmNsCS04MChmcCkKK25vbmFtZS4zOTQ6CisJbW92bAktNzYoZnApLHIzCisJbW92bAktODAoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuMzk1CisJaW5jbAlyNworbm9uYW1lLjM5NToKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuMzk2CisJaW5jbAlyMgorbm9uYW1lLjM5NjoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjMKKwliZ2VxdQlub25hbWUuMzk3CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuMzk3CisJaW5jbAlyNworbm9uYW1lLjM5NzoKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS4zOTgKKwlpbmNsCXI3Citub25hbWUuMzk4OgorCisJbW92bAk0KGFwKSxyMAorCW1vdmwJcjksMTIocjApCisKKwljbHJsCXI5CisKKwltb3ZsCTgoYXApLHIyCisJbW92bAk4KHIyKSxyNAorCWJpY2wzCSMtNjU1MzYscjQsLTg0KGZwKQorCWV4dHp2CSMxNiwjMTYscjQscjAKKwliaWNsMwkjLTY1NTM2LHIwLHI0CisJbW92bAktODQoZnApLHIwCisJbXVsbDMJcjAscjQsLTg4KGZwKQorCW11bGwzCXIwLHIwLC04NChmcCkKKwltdWxsMglyNCxyNAorCWJpY2wzCSMzMjc2NywtODgoZnApLHIwCisJZXh0enYJIzE1LCMxNyxyMCxyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtODgoZnApLHIwCisJYXNobAkjMTcscjAsLTg4KGZwKQorCWFkZGwzCS04NChmcCksLTg4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC04NChmcCkKKwljbXBsCS04NChmcCksLTg4KGZwKQorCWJnZXF1CW5vbmFtZS4zOTkKKwlpbmNsCXI0Citub25hbWUuMzk5OgorCW1vdmwJLTg0KGZwKSxyMQorCW1vdmwJcjQscjMKKwlhZGRsMglyMSxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMQorCWJnZXF1CW5vbmFtZS40MDAKKwlpbmNsCXIzCitub25hbWUuNDAwOgorCWFkZGwyCXIzLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIzCisJYmdlcXUJbm9uYW1lLjQwMQorCWluY2wJcjkKK25vbmFtZS40MDE6CisKKwltb3Z6d2wJMTQocjIpLHIzCisJYmljbDMJIy02NTUzNiw0KHIyKSxyMQorCW1vdnp3bAk2KHIyKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDEyKHIyKSwtMTAwKGZwKQorCWJpY2wzCSMtNjU1MzYscjMsLTEwNChmcCkKKwltdWxsMwlyMCwtMTAwKGZwKSwtOTIoZnApCisJbXVsbDIJcjEsLTEwMChmcCkKKwltdWxsMwlyMSwtMTA0KGZwKSwtOTYoZnApCisJbXVsbDIJcjAsLTEwNChmcCkKKwlhZGRsMwktOTIoZnApLC05NihmcCkscjAKKwliaWNsMwkjMCxyMCwtOTIoZnApCisJY21wbAktOTIoZnApLC05NihmcCkKKwliZ2VxdQlub25hbWUuNDAyCisJYWRkbDIJIzY1NTM2LC0xMDQoZnApCitub25hbWUuNDAyOgorCW1vdnp3bAktOTAoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0xMDQoZnApCisJYmljbDMJIy02NTUzNiwtOTIoZnApLHIwCisJYXNobAkjMTYscjAsLTk2KGZwKQorCWFkZGwzCS05NihmcCksLTEwMChmcCkscjAKKwliaWNsMwkjMCxyMCwtMTAwKGZwKQorCWNtcGwJLTEwMChmcCksLTk2KGZwKQorCWJnZXF1CW5vbmFtZS40MDMKKwlpbmNsCS0xMDQoZnApCitub25hbWUuNDAzOgorCW1vdmwJLTEwMChmcCkscjMKKwltb3ZsCS0xMDQoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuNDA0CisJaW5jbAlyOQorbm9uYW1lLjQwNDoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNDA1CisJaW5jbAlyMgorbm9uYW1lLjQwNToKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjMKKwliZ2VxdQlub25hbWUuNDA2CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNDA2CisJaW5jbAlyOQorbm9uYW1lLjQwNjoKKwlhZGRsMglyMixyNworCWJpY2wyCSMwLHI3CisJY21wbAlyNyxyMgorCWJnZXF1CW5vbmFtZS40MDcKKwlpbmNsCXI5Citub25hbWUuNDA3OgorCisJbW92bAk4KGFwKSxyMAorCW1vdnp3bAkxOChyMCkscjIKKwliaWNsMwkjLTY1NTM2LChyMCkscjMKKwltb3Z6d2wJMihyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwxNihyMCksLTExNihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0xMjAoZnApCisJbXVsbDMJcjEsLTExNihmcCksLTEwOChmcCkKKwltdWxsMglyMywtMTE2KGZwKQorCW11bGwzCXIzLC0xMjAoZnApLC0xMTIoZnApCisJbXVsbDIJcjEsLTEyMChmcCkKKwlhZGRsMwktMTA4KGZwKSwtMTEyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xMDgoZnApCisJY21wbAktMTA4KGZwKSwtMTEyKGZwKQorCWJnZXF1CW5vbmFtZS40MDgKKwlhZGRsMgkjNjU1MzYsLTEyMChmcCkKK25vbmFtZS40MDg6CisJbW92endsCS0xMDYoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0xMjAoZnApCisJYmljbDMJIy02NTUzNiwtMTA4KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0xMTIoZnApCisJYWRkbDMJLTExMihmcCksLTExNihmcCkscjAKKwliaWNsMwkjMCxyMCwtMTE2KGZwKQorCWNtcGwJLTExNihmcCksLTExMihmcCkKKwliZ2VxdQlub25hbWUuNDA5CisJaW5jbAktMTIwKGZwKQorbm9uYW1lLjQwOToKKwltb3ZsCS0xMTYoZnApLHIzCisJbW92bAktMTIwKGZwKSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjQxMAorCWluY2wJcjkKK25vbmFtZS40MTA6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjQxMQorCWluY2wJcjIKK25vbmFtZS40MTE6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIzCisJYmdlcXUJbm9uYW1lLjQxMgorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjQxMgorCWluY2wJcjkKK25vbmFtZS40MTI6CisJYWRkbDIJcjIscjcKKwliaWNsMgkjMCxyNworCWNtcGwJcjcscjIKKwliZ2VxdQlub25hbWUuNDEzCisJaW5jbAlyOQorbm9uYW1lLjQxMzoKKworCW1vdmwJNChhcCkscjAKKwltb3ZsCXI4LDE2KHIwKQorCisJY2xybAlyOAorCisJbW92bAk4KGFwKSxyMAorCW1vdnp3bAkyMihyMCkscjIKKwliaWNsMwkjLTY1NTM2LChyMCkscjMKKwltb3Z6d2wJMihyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwyMChyMCksLTEzMihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0xMzYoZnApCisJbXVsbDMJcjEsLTEzMihmcCksLTEyNChmcCkKKwltdWxsMglyMywtMTMyKGZwKQorCW11bGwzCXIzLC0xMzYoZnApLC0xMjgoZnApCisJbXVsbDIJcjEsLTEzNihmcCkKKwlhZGRsMwktMTI0KGZwKSwtMTI4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xMjQoZnApCisJY21wbAktMTI0KGZwKSwtMTI4KGZwKQorCWJnZXF1CW5vbmFtZS40MTQKKwlhZGRsMgkjNjU1MzYsLTEzNihmcCkKK25vbmFtZS40MTQ6CisJbW92endsCS0xMjIoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0xMzYoZnApCisJYmljbDMJIy02NTUzNiwtMTI0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0xMjgoZnApCisJYWRkbDMJLTEyOChmcCksLTEzMihmcCkscjAKKwliaWNsMwkjMCxyMCwtMTMyKGZwKQorCWNtcGwJLTEzMihmcCksLTEyOChmcCkKKwliZ2VxdQlub25hbWUuNDE1CisJaW5jbAktMTM2KGZwKQorbm9uYW1lLjQxNToKKwltb3ZsCS0xMzIoZnApLHIzCisJbW92bAktMTM2KGZwKSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjQxNgorCWluY2wJcjgKK25vbmFtZS40MTY6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjQxNworCWluY2wJcjIKK25vbmFtZS40MTc6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIzCisJYmdlcXUJbm9uYW1lLjQxOAorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjQxOAorCWluY2wJcjgKK25vbmFtZS40MTg6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuNDE5CisJaW5jbAlyOAorbm9uYW1lLjQxOToKKworCW1vdmwJOChhcCkscjAKKwltb3Z6d2wJMTgocjApLHIyCisJYmljbDMJIy02NTUzNiw0KHIwKSxyMworCW1vdnp3bAk2KHIwKSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDE2KHIwKSwtMTQ4KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTE1MihmcCkKKwltdWxsMwlyMSwtMTQ4KGZwKSwtMTQwKGZwKQorCW11bGwyCXIzLC0xNDgoZnApCisJbXVsbDMJcjMsLTE1MihmcCksLTE0NChmcCkKKwltdWxsMglyMSwtMTUyKGZwKQorCWFkZGwzCS0xNDAoZnApLC0xNDQoZnApLHIwCisJYmljbDMJIzAscjAsLTE0MChmcCkKKwljbXBsCS0xNDAoZnApLC0xNDQoZnApCisJYmdlcXUJbm9uYW1lLjQyMAorCWFkZGwyCSM2NTUzNiwtMTUyKGZwKQorbm9uYW1lLjQyMDoKKwltb3Z6d2wJLTEzOChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTE1MihmcCkKKwliaWNsMwkjLTY1NTM2LC0xNDAoZnApLHIwCisJYXNobAkjMTYscjAsLTE0NChmcCkKKwlhZGRsMwktMTQ0KGZwKSwtMTQ4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xNDgoZnApCisJY21wbAktMTQ4KGZwKSwtMTQ0KGZwKQorCWJnZXF1CW5vbmFtZS40MjEKKwlpbmNsCS0xNTIoZnApCitub25hbWUuNDIxOgorCW1vdmwJLTE0OChmcCkscjMKKwltb3ZsCS0xNTIoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuNDIyCisJaW5jbAlyOAorbm9uYW1lLjQyMjoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNDIzCisJaW5jbAlyMgorbm9uYW1lLjQyMzoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjcKKwliaWNsMgkjMCxyNworCWNtcGwJcjcscjMKKwliZ2VxdQlub25hbWUuNDI0CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNDI0CisJaW5jbAlyOAorbm9uYW1lLjQyNDoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS40MjUKKwlpbmNsCXI4Citub25hbWUuNDI1OgorCisJbW92bAk4KGFwKSxyMAorCW1vdnp3bAkxNChyMCkscjIKKwliaWNsMwkjLTY1NTM2LDgocjApLHIzCisJbW92endsCTEwKHIwKSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDEyKHIwKSwtMTY0KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTE2OChmcCkKKwltdWxsMwlyMSwtMTY0KGZwKSwtMTU2KGZwKQorCW11bGwyCXIzLC0xNjQoZnApCisJbXVsbDMJcjMsLTE2OChmcCksLTE2MChmcCkKKwltdWxsMglyMSwtMTY4KGZwKQorCWFkZGwzCS0xNTYoZnApLC0xNjAoZnApLHIwCisJYmljbDMJIzAscjAsLTE1NihmcCkKKwljbXBsCS0xNTYoZnApLC0xNjAoZnApCisJYmdlcXUJbm9uYW1lLjQyNgorCWFkZGwyCSM2NTUzNiwtMTY4KGZwKQorbm9uYW1lLjQyNjoKKwltb3Z6d2wJLTE1NChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTE2OChmcCkKKwliaWNsMwkjLTY1NTM2LC0xNTYoZnApLHIwCisJYXNobAkjMTYscjAsLTE2MChmcCkKKwlhZGRsMwktMTYwKGZwKSwtMTY0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xNjQoZnApCisJY21wbAktMTY0KGZwKSwtMTYwKGZwKQorCWJnZXF1CW5vbmFtZS40MjcKKwlpbmNsCS0xNjgoZnApCitub25hbWUuNDI3OgorCW1vdmwJLTE2NChmcCkscjMKKwltb3ZsCS0xNjgoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuNDI4CisJaW5jbAlyOAorbm9uYW1lLjQyODoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNDI5CisJaW5jbAlyMgorbm9uYW1lLjQyOToKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjcKKwliaWNsMgkjMCxyNworCWNtcGwJcjcscjMKKwliZ2VxdQlub25hbWUuNDMwCisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNDMwCisJaW5jbAlyOAorbm9uYW1lLjQzMDoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS40MzEKKwlpbmNsCXI4Citub25hbWUuNDMxOgorCisJbW92bAk0KGFwKSxyMAorCW1vdmwJcjcsMjAocjApCisKKwljbHJsCXI3CisKKwltb3ZsCTgoYXApLHIyCisJbW92bAkxMihyMikscjQKKwliaWNsMwkjLTY1NTM2LHI0LC0xNzIoZnApCisJZXh0enYJIzE2LCMxNixyNCxyMAorCWJpY2wzCSMtNjU1MzYscjAscjQKKwltb3ZsCS0xNzIoZnApLHIwCisJbXVsbDMJcjAscjQsLTE3NihmcCkKKwltdWxsMwlyMCxyMCwtMTcyKGZwKQorCW11bGwyCXI0LHI0CisJYmljbDMJIzMyNzY3LC0xNzYoZnApLHIwCisJZXh0enYJIzE1LCMxNyxyMCxyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMTc2KGZwKSxyMAorCWFzaGwJIzE3LHIwLC0xNzYoZnApCisJYWRkbDMJLTE3MihmcCksLTE3NihmcCkscjAKKwliaWNsMwkjMCxyMCwtMTcyKGZwKQorCWNtcGwJLTE3MihmcCksLTE3NihmcCkKKwliZ2VxdQlub25hbWUuNDMyCisJaW5jbAlyNAorbm9uYW1lLjQzMjoKKwltb3ZsCS0xNzIoZnApLHIxCisJbW92bAlyNCxyMworCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjQzMworCWluY2wJcjMKK25vbmFtZS40MzM6CisJYWRkbDIJcjMscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjMKKwliZ2VxdQlub25hbWUuNDM0CisJaW5jbAlyNworbm9uYW1lLjQzNDoKKworCW1vdnp3bAkxOChyMikscjMKKwliaWNsMwkjLTY1NTM2LDgocjIpLHIxCisJbW92endsCTEwKHIyKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwliaWNsMwkjLTY1NTM2LDE2KHIyKSwtMTg4KGZwKQorCWJpY2wzCSMtNjU1MzYscjMsLTE5MihmcCkKKwltdWxsMwlyMCwtMTg4KGZwKSwtMTgwKGZwKQorCW11bGwyCXIxLC0xODgoZnApCisJbXVsbDMJcjEsLTE5MihmcCksLTE4NChmcCkKKwltdWxsMglyMCwtMTkyKGZwKQorCWFkZGwzCS0xODAoZnApLC0xODQoZnApLHIwCisJYmljbDMJIzAscjAsLTE4MChmcCkKKwljbXBsCS0xODAoZnApLC0xODQoZnApCisJYmdlcXUJbm9uYW1lLjQzNQorCWFkZGwyCSM2NTUzNiwtMTkyKGZwKQorbm9uYW1lLjQzNToKKwltb3Z6d2wJLTE3OChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTE5MihmcCkKKwliaWNsMwkjLTY1NTM2LC0xODAoZnApLHIwCisJYXNobAkjMTYscjAsLTE4NChmcCkKKwlhZGRsMwktMTg0KGZwKSwtMTg4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xODgoZnApCisJY21wbAktMTg4KGZwKSwtMTg0KGZwKQorCWJnZXF1CW5vbmFtZS40MzYKKwlpbmNsCS0xOTIoZnApCitub25hbWUuNDM2OgorCW1vdmwJLTE4OChmcCkscjMKKwltb3ZsCS0xOTIoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuNDM3CisJaW5jbAlyNworbm9uYW1lLjQzNzoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNDM4CisJaW5jbAlyMgorbm9uYW1lLjQzODoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjMKKwliZ2VxdQlub25hbWUuNDM5CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNDM5CisJaW5jbAlyNworbm9uYW1lLjQzOToKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS40NDAKKwlpbmNsCXI3Citub25hbWUuNDQwOgorCisJbW92bAk4KGFwKSxyMAorCW1vdnp3bAkyMihyMCkscjIKKwliaWNsMwkjLTY1NTM2LDQocjApLHIzCisJbW92endsCTYocjApLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsMjAocjApLC0yMDQoZnApCisJYmljbDMJIy02NTUzNixyMiwtMjA4KGZwKQorCW11bGwzCXIxLC0yMDQoZnApLC0xOTYoZnApCisJbXVsbDIJcjMsLTIwNChmcCkKKwltdWxsMwlyMywtMjA4KGZwKSwtMjAwKGZwKQorCW11bGwyCXIxLC0yMDgoZnApCisJYWRkbDMJLTE5NihmcCksLTIwMChmcCkscjAKKwliaWNsMwkjMCxyMCwtMTk2KGZwKQorCWNtcGwJLTE5NihmcCksLTIwMChmcCkKKwliZ2VxdQlub25hbWUuNDQxCisJYWRkbDIJIzY1NTM2LC0yMDgoZnApCitub25hbWUuNDQxOgorCW1vdnp3bAktMTk0KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMjA4KGZwKQorCWJpY2wzCSMtNjU1MzYsLTE5NihmcCkscjAKKwlhc2hsCSMxNixyMCwtMjAwKGZwKQorCWFkZGwzCS0yMDAoZnApLC0yMDQoZnApLHIwCisJYmljbDMJIzAscjAsLTIwNChmcCkKKwljbXBsCS0yMDQoZnApLC0yMDAoZnApCisJYmdlcXUJbm9uYW1lLjQ0MgorCWluY2wJLTIwOChmcCkKK25vbmFtZS40NDI6CisJbW92bAktMjA0KGZwKSxyMworCW1vdmwJLTIwOChmcCkscjIKKwliYmMJIzMxLHIyLG5vbmFtZS40NDMKKwlpbmNsCXI3Citub25hbWUuNDQzOgorCWFkZGwyCXIyLHIyCisJYmljbDIJIzAscjIKKwliYmMJIzMxLHIzLG5vbmFtZS40NDQKKwlpbmNsCXIyCitub25hbWUuNDQ0OgorCWFkZGwyCXIzLHIzCisJYmljbDIJIzAscjMKKwlhZGRsMglyMyxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMworCWJnZXF1CW5vbmFtZS40NDUKKwlpbmNsCXIyCisJYmljbDMJIzAscjIscjAKKwlibmVxCW5vbmFtZS40NDUKKwlpbmNsCXI3Citub25hbWUuNDQ1OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjQ0NgorCWluY2wJcjcKK25vbmFtZS40NDY6CisKKwltb3ZsCTgoYXApLHIwCisJbW92endsCTI2KHIwKSxyMgorCWJpY2wzCSMtNjU1MzYsKHIwKSxyMworCW1vdnp3bAkyKHIwKSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDI0KHIwKSwtMjIwKGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTIyNChmcCkKKwltdWxsMwlyMSwtMjIwKGZwKSwtMjEyKGZwKQorCW11bGwyCXIzLC0yMjAoZnApCisJbXVsbDMJcjMsLTIyNChmcCksLTIxNihmcCkKKwltdWxsMglyMSwtMjI0KGZwKQorCWFkZGwzCS0yMTIoZnApLC0yMTYoZnApLHIwCisJYmljbDMJIzAscjAsLTIxMihmcCkKKwljbXBsCS0yMTIoZnApLC0yMTYoZnApCisJYmdlcXUJbm9uYW1lLjQ0NworCWFkZGwyCSM2NTUzNiwtMjI0KGZwKQorbm9uYW1lLjQ0NzoKKwltb3Z6d2wJLTIxMChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTIyNChmcCkKKwliaWNsMwkjLTY1NTM2LC0yMTIoZnApLHIwCisJYXNobAkjMTYscjAsLTIxNihmcCkKKwlhZGRsMwktMjE2KGZwKSwtMjIwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yMjAoZnApCisJY21wbAktMjIwKGZwKSwtMjE2KGZwKQorCWJnZXF1CW5vbmFtZS40NDgKKwlpbmNsCS0yMjQoZnApCitub25hbWUuNDQ4OgorCW1vdmwJLTIyMChmcCkscjMKKwltb3ZsCS0yMjQoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuNDQ5CisJaW5jbAlyNworbm9uYW1lLjQ0OToKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNDUwCisJaW5jbAlyMgorbm9uYW1lLjQ1MDoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjMKKwliZ2VxdQlub25hbWUuNDUxCisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNDUxCisJaW5jbAlyNworbm9uYW1lLjQ1MToKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS40NTIKKwlpbmNsCXI3Citub25hbWUuNDUyOgorCisJbW92bAk0KGFwKSxyMAorCW1vdmwJcjksMjQocjApCisKKwljbHJsCXI5CisKKwltb3ZsCTgoYXApLHIwCisJbW92endsCTMwKHIwKSxyMgorCWJpY2wzCSMtNjU1MzYsKHIwKSxyMworCW1vdnp3bAkyKHIwKSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDI4KHIwKSwtMjM2KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTI0MChmcCkKKwltdWxsMwlyMSwtMjM2KGZwKSwtMjI4KGZwKQorCW11bGwyCXIzLC0yMzYoZnApCisJbXVsbDMJcjMsLTI0MChmcCksLTIzMihmcCkKKwltdWxsMglyMSwtMjQwKGZwKQorCWFkZGwzCS0yMjgoZnApLC0yMzIoZnApLHIwCisJYmljbDMJIzAscjAsLTIyOChmcCkKKwljbXBsCS0yMjgoZnApLC0yMzIoZnApCisJYmdlcXUJbm9uYW1lLjQ1MworCWFkZGwyCSM2NTUzNiwtMjQwKGZwKQorbm9uYW1lLjQ1MzoKKwltb3Z6d2wJLTIyNihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTI0MChmcCkKKwliaWNsMwkjLTY1NTM2LC0yMjgoZnApLHIwCisJYXNobAkjMTYscjAsLTIzMihmcCkKKwlhZGRsMwktMjMyKGZwKSwtMjM2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yMzYoZnApCisJY21wbAktMjM2KGZwKSwtMjMyKGZwKQorCWJnZXF1CW5vbmFtZS40NTQKKwlpbmNsCS0yNDAoZnApCitub25hbWUuNDU0OgorCW1vdmwJLTIzNihmcCkscjMKKwltb3ZsCS0yNDAoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuNDU1CisJaW5jbAlyOQorbm9uYW1lLjQ1NToKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNDU2CisJaW5jbAlyMgorbm9uYW1lLjQ1NjoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjMKKwliZ2VxdQlub25hbWUuNDU3CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNDU3CisJaW5jbAlyOQorbm9uYW1lLjQ1NzoKKwlhZGRsMglyMixyNworCWJpY2wyCSMwLHI3CisJY21wbAlyNyxyMgorCWJnZXF1CW5vbmFtZS40NTgKKwlpbmNsCXI5Citub25hbWUuNDU4OgorCisJbW92bAk4KGFwKSxyMAorCW1vdnp3bAkyNihyMCkscjIKKwliaWNsMwkjLTY1NTM2LDQocjApLHIzCisJbW92endsCTYocjApLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsMjQocjApLC0yNTIoZnApCisJYmljbDMJIy02NTUzNixyMiwtMjU2KGZwKQorCW11bGwzCXIxLC0yNTIoZnApLC0yNDQoZnApCisJbXVsbDIJcjMsLTI1MihmcCkKKwltdWxsMwlyMywtMjU2KGZwKSwtMjQ4KGZwKQorCW11bGwyCXIxLC0yNTYoZnApCisJYWRkbDMJLTI0NChmcCksLTI0OChmcCkscjAKKwliaWNsMwkjMCxyMCwtMjQ0KGZwKQorCWNtcGwJLTI0NChmcCksLTI0OChmcCkKKwliZ2VxdQlub25hbWUuNDU5CisJYWRkbDIJIzY1NTM2LC0yNTYoZnApCitub25hbWUuNDU5OgorCW1vdnp3bAktMjQyKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMjU2KGZwKQorCWJpY2wzCSMtNjU1MzYsLTI0NChmcCkscjAKKwlhc2hsCSMxNixyMCwtMjQ4KGZwKQorCWFkZGwzCS0yNDgoZnApLC0yNTIoZnApLHIwCisJYmljbDMJIzAscjAsLTI1MihmcCkKKwljbXBsCS0yNTIoZnApLC0yNDgoZnApCisJYmdlcXUJbm9uYW1lLjQ2MAorCWluY2wJLTI1NihmcCkKK25vbmFtZS40NjA6CisJbW92bAktMjUyKGZwKSxyMworCW1vdmwJLTI1NihmcCkscjIKKwliYmMJIzMxLHIyLG5vbmFtZS40NjEKKwlpbmNsCXI5Citub25hbWUuNDYxOgorCWFkZGwyCXIyLHIyCisJYmljbDIJIzAscjIKKwliYmMJIzMxLHIzLG5vbmFtZS40NjIKKwlpbmNsCXIyCitub25hbWUuNDYyOgorCWFkZGwyCXIzLHIzCisJYmljbDIJIzAscjMKKwlhZGRsMglyMyxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMworCWJnZXF1CW5vbmFtZS40NjMKKwlpbmNsCXIyCisJYmljbDMJIzAscjIscjAKKwlibmVxCW5vbmFtZS40NjMKKwlpbmNsCXI5Citub25hbWUuNDYzOgorCWFkZGwyCXIyLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIyCisJYmdlcXUJbm9uYW1lLjQ2NAorCWluY2wJcjkKK25vbmFtZS40NjQ6CisKKwltb3ZsCTgoYXApLHIwCisJbW92endsCTIyKHIwKSxyMgorCWJpY2wzCSMtNjU1MzYsOChyMCkscjMKKwltb3Z6d2wJMTAocjApLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsMjAocjApLC0yNjgoZnApCisJYmljbDMJIy02NTUzNixyMiwtMjcyKGZwKQorCW11bGwzCXIxLC0yNjgoZnApLC0yNjAoZnApCisJbXVsbDIJcjMsLTI2OChmcCkKKwltdWxsMwlyMywtMjcyKGZwKSwtMjY0KGZwKQorCW11bGwyCXIxLC0yNzIoZnApCisJYWRkbDMJLTI2MChmcCksLTI2NChmcCkscjAKKwliaWNsMwkjMCxyMCwtMjYwKGZwKQorCWNtcGwJLTI2MChmcCksLTI2NChmcCkKKwliZ2VxdQlub25hbWUuNDY1CisJYWRkbDIJIzY1NTM2LC0yNzIoZnApCitub25hbWUuNDY1OgorCW1vdnp3bAktMjU4KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMjcyKGZwKQorCWJpY2wzCSMtNjU1MzYsLTI2MChmcCkscjAKKwlhc2hsCSMxNixyMCwtMjY0KGZwKQorCWFkZGwzCS0yNjQoZnApLC0yNjgoZnApLHIwCisJYmljbDMJIzAscjAsLTI2OChmcCkKKwljbXBsCS0yNjgoZnApLC0yNjQoZnApCisJYmdlcXUJbm9uYW1lLjQ2NgorCWluY2wJLTI3MihmcCkKK25vbmFtZS40NjY6CisJbW92bAktMjY4KGZwKSxyMworCW1vdmwJLTI3MihmcCkscjIKKwliYmMJIzMxLHIyLG5vbmFtZS40NjcKKwlpbmNsCXI5Citub25hbWUuNDY3OgorCWFkZGwyCXIyLHIyCisJYmljbDIJIzAscjIKKwliYmMJIzMxLHIzLG5vbmFtZS40NjgKKwlpbmNsCXIyCitub25hbWUuNDY4OgorCWFkZGwyCXIzLHIzCisJYmljbDIJIzAscjMKKwlhZGRsMglyMyxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMworCWJnZXF1CW5vbmFtZS40NjkKKwlpbmNsCXIyCisJYmljbDMJIzAscjIscjAKKwlibmVxCW5vbmFtZS40NjkKKwlpbmNsCXI5Citub25hbWUuNDY5OgorCWFkZGwyCXIyLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIyCisJYmdlcXUJbm9uYW1lLjQ3MAorCWluY2wJcjkKK25vbmFtZS40NzA6CisKKwltb3ZsCTgoYXApLHIwCisJbW92endsCTE4KHIwKSxyMgorCWJpY2wzCSMtNjU1MzYsMTIocjApLHIzCisJbW92endsCTE0KHIwKSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDE2KHIwKSwtMjg0KGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTI4OChmcCkKKwltdWxsMwlyMSwtMjg0KGZwKSwtMjc2KGZwKQorCW11bGwyCXIzLC0yODQoZnApCisJbXVsbDMJcjMsLTI4OChmcCksLTI4MChmcCkKKwltdWxsMglyMSwtMjg4KGZwKQorCWFkZGwzCS0yNzYoZnApLC0yODAoZnApLHIwCisJYmljbDMJIzAscjAsLTI3NihmcCkKKwljbXBsCS0yNzYoZnApLC0yODAoZnApCisJYmdlcXUJbm9uYW1lLjQ3MQorCWFkZGwyCSM2NTUzNiwtMjg4KGZwKQorbm9uYW1lLjQ3MToKKwltb3Z6d2wJLTI3NChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTI4OChmcCkKKwliaWNsMwkjLTY1NTM2LC0yNzYoZnApLHIwCisJYXNobAkjMTYscjAsLTI4MChmcCkKKwlhZGRsMwktMjgwKGZwKSwtMjg0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yODQoZnApCisJY21wbAktMjg0KGZwKSwtMjgwKGZwKQorCWJnZXF1CW5vbmFtZS40NzIKKwlpbmNsCS0yODgoZnApCitub25hbWUuNDcyOgorCW1vdmwJLTI4NChmcCkscjMKKwltb3ZsCS0yODgoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuNDczCisJaW5jbAlyOQorbm9uYW1lLjQ3MzoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNDc0CisJaW5jbAlyMgorbm9uYW1lLjQ3NDoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjMKKwliZ2VxdQlub25hbWUuNDc1CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNDc1CisJaW5jbAlyOQorbm9uYW1lLjQ3NToKKwlhZGRsMglyMixyNworCWJpY2wyCSMwLHI3CisJY21wbAlyNyxyMgorCWJnZXF1CW5vbmFtZS40NzYKKwlpbmNsCXI5Citub25hbWUuNDc2OgorCisJbW92bAk0KGFwKSxyMAorCW1vdmwJcjgsMjgocjApCisKKwljbHJsCXI4CisKKwltb3ZsCTgoYXApLHIzCisJbW92bAkxNihyMykscjQKKwliaWNsMwkjLTY1NTM2LHI0LHI1CisJZXh0enYJIzE2LCMxNixyNCxyMAorCWJpY2wzCSMtNjU1MzYscjAscjQKKwltdWxsMwlyNSxyNCwtMjkyKGZwKQorCW11bGwyCXI1LHI1CisJbXVsbDIJcjQscjQKKwliaWNsMwkjMzI3NjcsLTI5MihmcCkscjAKKwlleHR6dgkjMTUsIzE3LHIwLHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC0yOTIoZnApLHIwCisJYXNobAkjMTcscjAsLTI5MihmcCkKKwlhZGRsMgktMjkyKGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtMjkyKGZwKQorCWJnZXF1CW5vbmFtZS40NzcKKwlpbmNsCXI0Citub25hbWUuNDc3OgorCW1vdmwJcjUscjEKKwltb3ZsCXI0LHIyCisJYWRkbDIJcjEscjcKKwliaWNsMgkjMCxyNworCWNtcGwJcjcscjEKKwliZ2VxdQlub25hbWUuNDc4CisJaW5jbAlyMgorbm9uYW1lLjQ3ODoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS40NzkKKwlpbmNsCXI4Citub25hbWUuNDc5OgorCisJYmljbDMJIy02NTUzNiwyMChyMykscjQKKwltb3Z6d2wJMjIocjMpLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsMTIocjMpLHIyCisJbW92endsCTE0KHIzKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXI0LHI2CisJbW92bAlyMSxyNQorCW11bGwzCXIwLHI2LC0yOTYoZnApCisJbXVsbDIJcjIscjYKKwltdWxsMwlyMixyNSwtMzAwKGZwKQorCW11bGwyCXIwLHI1CisJYWRkbDMJLTI5NihmcCksLTMwMChmcCkscjAKKwliaWNsMwkjMCxyMCwtMjk2KGZwKQorCWNtcGwJLTI5NihmcCksLTMwMChmcCkKKwliZ2VxdQlub25hbWUuNDgwCisJYWRkbDIJIzY1NTM2LHI1Citub25hbWUuNDgwOgorCW1vdnp3bAktMjk0KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCxyNQorCWJpY2wzCSMtNjU1MzYsLTI5NihmcCkscjAKKwlhc2hsCSMxNixyMCwtMzAwKGZwKQorCWFkZGwyCS0zMDAoZnApLHI2CisJYmljbDIJIzAscjYKKwljbXBsCXI2LC0zMDAoZnApCisJYmdlcXUJbm9uYW1lLjQ4MQorCWluY2wJcjUKK25vbmFtZS40ODE6CisJbW92bAlyNixyMworCW1vdmwJcjUscjIKKwliYmMJIzMxLHIyLG5vbmFtZS40ODIKKwlpbmNsCXI4Citub25hbWUuNDgyOgorCWFkZGwyCXIyLHIyCisJYmljbDIJIzAscjIKKwliYmMJIzMxLHIzLG5vbmFtZS40ODMKKwlpbmNsCXIyCitub25hbWUuNDgzOgorCWFkZGwyCXIzLHIzCisJYmljbDIJIzAscjMKKwlhZGRsMglyMyxyNworCWJpY2wyCSMwLHI3CisJY21wbAlyNyxyMworCWJnZXF1CW5vbmFtZS40ODQKKwlpbmNsCXIyCisJYmljbDMJIzAscjIscjAKKwlibmVxCW5vbmFtZS40ODQKKwlpbmNsCXI4Citub25hbWUuNDg0OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjQ4NQorCWluY2wJcjgKK25vbmFtZS40ODU6CisKKwltb3ZsCTgoYXApLHIwCisJYmljbDMJIy02NTUzNiwyNChyMCkscjMKKwltb3Z6d2wJMjYocjApLHIxCisJYmljbDIJIy02NTUzNixyMQorCWJpY2wzCSMtNjU1MzYsOChyMCkscjIKKwltb3Z6d2wJMTAocjApLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTMwNChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC0zMDgoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktMzA0KGZwKSwtMzA4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zMDQoZnApCisJY21wbAktMzA0KGZwKSwtMzA4KGZwKQorCWJnZXF1CW5vbmFtZS40ODYKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS40ODY6CisJbW92endsCS0zMDIoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMzA0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0zMDgoZnApCisJYWRkbDIJLTMwOChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTMwOChmcCkKKwliZ2VxdQlub25hbWUuNDg3CisJaW5jbAlyNAorbm9uYW1lLjQ4NzoKKwltb3ZsCXI1LHIzCisJbW92bAlyNCxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjQ4OAorCWluY2wJcjgKK25vbmFtZS40ODg6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjQ4OQorCWluY2wJcjIKK25vbmFtZS40ODk6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIzCisJYmdlcXUJbm9uYW1lLjQ5MAorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjQ5MAorCWluY2wJcjgKK25vbmFtZS40OTA6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuNDkxCisJaW5jbAlyOAorbm9uYW1lLjQ5MToKKworCW1vdmwJOChhcCkscjAKKwliaWNsMwkjLTY1NTM2LDI4KHIwKSxyMworCW1vdnp3bAkzMChyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiw0KHIwKSxyMgorCW1vdnp3bAk2KHIwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC0zMTIoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtMzE2KGZwKQorCW11bGwyCXIwLHI0CisJYWRkbDMJLTMxMihmcCksLTMxNihmcCkscjAKKwliaWNsMwkjMCxyMCwtMzEyKGZwKQorCWNtcGwJLTMxMihmcCksLTMxNihmcCkKKwliZ2VxdQlub25hbWUuNDkyCisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuNDkyOgorCW1vdnp3bAktMzEwKGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCxyNAorCWJpY2wzCSMtNjU1MzYsLTMxMihmcCkscjAKKwlhc2hsCSMxNixyMCwtMzE2KGZwKQorCWFkZGwyCS0zMTYoZnApLHI1CisJYmljbDIJIzAscjUKKwljbXBsCXI1LC0zMTYoZnApCisJYmdlcXUJbm9uYW1lLjQ5MworCWluY2wJcjQKK25vbmFtZS40OTM6CisJbW92bAlyNSxyMworCW1vdmwJcjQscjIKKwliYmMJIzMxLHIyLG5vbmFtZS40OTQKKwlpbmNsCXI4Citub25hbWUuNDk0OgorCWFkZGwyCXIyLHIyCisJYmljbDIJIzAscjIKKwliYmMJIzMxLHIzLG5vbmFtZS40OTUKKwlpbmNsCXIyCitub25hbWUuNDk1OgorCWFkZGwyCXIzLHIzCisJYmljbDIJIzAscjMKKwlhZGRsMglyMyxyNworCWJpY2wyCSMwLHI3CisJY21wbAlyNyxyMworCWJnZXF1CW5vbmFtZS40OTYKKwlpbmNsCXIyCisJYmljbDMJIzAscjIscjAKKwlibmVxCW5vbmFtZS40OTYKKwlpbmNsCXI4Citub25hbWUuNDk2OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjQ5NworCWluY2wJcjgKK25vbmFtZS40OTc6CisKKwltb3ZsCTQoYXApLHIwCisJbW92bAlyNywzMihyMCkKKworCWNscmwJcjcKKworCW1vdmwJOChhcCkscjAKKwliaWNsMwkjLTY1NTM2LDI4KHIwKSxyMworCW1vdnp3bAkzMChyMCkscjIKKwliaWNsMwkjLTY1NTM2LDgocjApLHIxCisJbW92endsCTEwKHIwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI0CisJYmljbDMJIy02NTUzNixyMiwtMzI4KGZwKQorCW11bGwzCXIwLHI0LC0zMjAoZnApCisJbXVsbDIJcjEscjQKKwltdWxsMwlyMSwtMzI4KGZwKSwtMzI0KGZwKQorCW11bGwyCXIwLC0zMjgoZnApCisJYWRkbDMJLTMyMChmcCksLTMyNChmcCkscjAKKwliaWNsMwkjMCxyMCwtMzIwKGZwKQorCWNtcGwJLTMyMChmcCksLTMyNChmcCkKKwliZ2VxdQlub25hbWUuNDk4CisJYWRkbDIJIzY1NTM2LC0zMjgoZnApCitub25hbWUuNDk4OgorCW1vdnp3bAktMzE4KGZwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCwtMzI4KGZwKQorCWJpY2wzCSMtNjU1MzYsLTMyMChmcCkscjAKKwlhc2hsCSMxNixyMCwtMzI0KGZwKQorCWFkZGwyCS0zMjQoZnApLHI0CisJYmljbDIJIzAscjQKKwljbXBsCXI0LC0zMjQoZnApCisJYmdlcXUJbm9uYW1lLjQ5OQorCWluY2wJLTMyOChmcCkKK25vbmFtZS40OTk6CisJbW92bAlyNCxyMworCW1vdmwJLTMyOChmcCkscjIKKwliYmMJIzMxLHIyLG5vbmFtZS41MDAKKwlpbmNsCXI3Citub25hbWUuNTAwOgorCWFkZGwyCXIyLHIyCisJYmljbDIJIzAscjIKKwliYmMJIzMxLHIzLG5vbmFtZS41MDEKKwlpbmNsCXIyCitub25hbWUuNTAxOgorCWFkZGwyCXIzLHIzCisJYmljbDIJIzAscjMKKwlhZGRsMglyMyxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMworCWJnZXF1CW5vbmFtZS41MDIKKwlpbmNsCXIyCisJYmljbDMJIzAscjIscjAKKwlibmVxCW5vbmFtZS41MDIKKwlpbmNsCXI3Citub25hbWUuNTAyOgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjUwMworCWluY2wJcjcKK25vbmFtZS41MDM6CisKKwltb3ZsCTgoYXApLHIwCisJbW92endsCTI2KHIwKSxyMgorCWJpY2wzCSMtNjU1MzYsMTIocjApLHIzCisJbW92endsCTE0KHIwKSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LDI0KHIwKSwtMzQwKGZwKQorCWJpY2wzCSMtNjU1MzYscjIsLTM0NChmcCkKKwltdWxsMwlyMSwtMzQwKGZwKSwtMzMyKGZwKQorCW11bGwyCXIzLC0zNDAoZnApCisJbXVsbDMJcjMsLTM0NChmcCksLTMzNihmcCkKKwltdWxsMglyMSwtMzQ0KGZwKQorCWFkZGwzCS0zMzIoZnApLC0zMzYoZnApLHIwCisJYmljbDMJIzAscjAsLTMzMihmcCkKKwljbXBsCS0zMzIoZnApLC0zMzYoZnApCisJYmdlcXUJbm9uYW1lLjUwNAorCWFkZGwyCSM2NTUzNiwtMzQ0KGZwKQorbm9uYW1lLjUwNDoKKwltb3Z6d2wJLTMzMChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAsLTM0NChmcCkKKwliaWNsMwkjLTY1NTM2LC0zMzIoZnApLHIwCisJYXNobAkjMTYscjAsLTMzNihmcCkKKwlhZGRsMwktMzM2KGZwKSwtMzQwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zNDAoZnApCisJY21wbAktMzQwKGZwKSwtMzM2KGZwKQorCWJnZXF1CW5vbmFtZS41MDUKKwlpbmNsCS0zNDQoZnApCitub25hbWUuNTA1OgorCW1vdmwJLTM0MChmcCkscjMKKwltb3ZsCS0zNDQoZnApLHIyCisJYmJjCSMzMSxyMixub25hbWUuNTA2CisJaW5jbAlyNworbm9uYW1lLjUwNjoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNTA3CisJaW5jbAlyMgorbm9uYW1lLjUwNzoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjMKKwliZ2VxdQlub25hbWUuNTA4CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNTA4CisJaW5jbAlyNworbm9uYW1lLjUwODoKKwlhZGRsMglyMixyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMgorCWJnZXF1CW5vbmFtZS41MDkKKwlpbmNsCXI3Citub25hbWUuNTA5OgorCisJbW92bAk4KGFwKSxyMAorCW1vdnp3bAkyMihyMCkscjIKKwliaWNsMwkjLTY1NTM2LDE2KHIwKSxyMworCW1vdnp3bAkxOChyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwyMChyMCksLTM1NihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC0zNjAoZnApCisJbXVsbDMJcjEsLTM1NihmcCksLTM0OChmcCkKKwltdWxsMglyMywtMzU2KGZwKQorCW11bGwzCXIzLC0zNjAoZnApLC0zNTIoZnApCisJbXVsbDIJcjEsLTM2MChmcCkKKwlhZGRsMwktMzQ4KGZwKSwtMzUyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zNDgoZnApCisJY21wbAktMzQ4KGZwKSwtMzUyKGZwKQorCWJnZXF1CW5vbmFtZS41MTAKKwlhZGRsMgkjNjU1MzYsLTM2MChmcCkKK25vbmFtZS41MTA6CisJbW92endsCS0zNDYoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC0zNjAoZnApCisJYmljbDMJIy02NTUzNiwtMzQ4KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0zNTIoZnApCisJYWRkbDMJLTM1MihmcCksLTM1NihmcCkscjAKKwliaWNsMwkjMCxyMCwtMzU2KGZwKQorCWNtcGwJLTM1NihmcCksLTM1MihmcCkKKwliZ2VxdQlub25hbWUuNTExCisJaW5jbAktMzYwKGZwKQorbm9uYW1lLjUxMToKKwltb3ZsCS0zNTYoZnApLHIzCisJbW92bAktMzYwKGZwKSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjUxMgorCWluY2wJcjcKK25vbmFtZS41MTI6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjUxMworCWluY2wJcjIKK25vbmFtZS41MTM6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIzCisJYmdlcXUJbm9uYW1lLjUxNAorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjUxNAorCWluY2wJcjcKK25vbmFtZS41MTQ6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuNTE1CisJaW5jbAlyNworbm9uYW1lLjUxNToKKworCW1vdmwJNChhcCkscjAKKwltb3ZsCXI5LDM2KHIwKQorCisJY2xybAlyOQorCisJbW92bAk4KGFwKSxyMworCW1vdmwJMjAocjMpLHI0CisJYmljbDMJIy02NTUzNixyNCwtMzY0KGZwKQorCWV4dHp2CSMxNiwjMTYscjQscjAKKwliaWNsMwkjLTY1NTM2LHIwLHI0CisJbW92bAktMzY0KGZwKSxyMAorCW11bGwzCXIwLHI0LC0zNjgoZnApCisJbXVsbDMJcjAscjAsLTM2NChmcCkKKwltdWxsMglyNCxyNAorCWJpY2wzCSMzMjc2NywtMzY4KGZwKSxyMAorCWV4dHp2CSMxNSwjMTcscjAscjAKKwlhZGRsMglyMCxyNAorCWJpY2wzCSMtNjU1MzYsLTM2OChmcCkscjAKKwlhc2hsCSMxNyxyMCwtMzY4KGZwKQorCWFkZGwzCS0zNjQoZnApLC0zNjgoZnApLHIwCisJYmljbDMJIzAscjAsLTM2NChmcCkKKwljbXBsCS0zNjQoZnApLC0zNjgoZnApCisJYmdlcXUJbm9uYW1lLjUxNgorCWluY2wJcjQKK25vbmFtZS41MTY6CisJbW92bAktMzY0KGZwKSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMQorCWJnZXF1CW5vbmFtZS41MTcKKwlpbmNsCXIyCitub25hbWUuNTE3OgorCWFkZGwyCXIyLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIyCisJYmdlcXUJbm9uYW1lLjUxOAorCWluY2wJcjkKK25vbmFtZS41MTg6CisKKwliaWNsMwkjLTY1NTM2LDI0KHIzKSxyNAorCW1vdnp3bAkyNihyMykscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwxNihyMykscjIKKwltb3Z6d2wJMTgocjMpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjQscjYKKwltb3ZsCXIxLHI1CisJbXVsbDMJcjAscjYsLTM3MihmcCkKKwltdWxsMglyMixyNgorCW11bGwzCXIyLHI1LC0zNzYoZnApCisJbXVsbDIJcjAscjUKKwlhZGRsMwktMzcyKGZwKSwtMzc2KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zNzIoZnApCisJY21wbAktMzcyKGZwKSwtMzc2KGZwKQorCWJnZXF1CW5vbmFtZS41MTkKKwlhZGRsMgkjNjU1MzYscjUKK25vbmFtZS41MTk6CisJbW92endsCS0zNzAoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI1CisJYmljbDMJIy02NTUzNiwtMzcyKGZwKSxyMAorCWFzaGwJIzE2LHIwLC0zNzYoZnApCisJYWRkbDIJLTM3NihmcCkscjYKKwliaWNsMgkjMCxyNgorCWNtcGwJcjYsLTM3NihmcCkKKwliZ2VxdQlub25hbWUuNTIwCisJaW5jbAlyNQorbm9uYW1lLjUyMDoKKwltb3ZsCXI2LHIzCisJbW92bAlyNSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjUyMQorCWluY2wJcjkKK25vbmFtZS41MjE6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjUyMgorCWluY2wJcjIKK25vbmFtZS41MjI6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIzCisJYmdlcXUJbm9uYW1lLjUyMworCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjUyMworCWluY2wJcjkKK25vbmFtZS41MjM6CisJYWRkbDIJcjIscjcKKwliaWNsMgkjMCxyNworCWNtcGwJcjcscjIKKwliZ2VxdQlub25hbWUuNTI0CisJaW5jbAlyOQorbm9uYW1lLjUyNDoKKworCW1vdmwJOChhcCkscjAKKwliaWNsMwkjLTY1NTM2LDI4KHIwKSxyMworCW1vdnp3bAkzMChyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwxMihyMCkscjIKKwltb3Z6d2wJMTQocjApLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTM4MChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC0zODQoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktMzgwKGZwKSwtMzg0KGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zODAoZnApCisJY21wbAktMzgwKGZwKSwtMzg0KGZwKQorCWJnZXF1CW5vbmFtZS41MjUKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS41MjU6CisJbW92endsCS0zNzgoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMzgwKGZwKSxyMAorCWFzaGwJIzE2LHIwLC0zODQoZnApCisJYWRkbDIJLTM4NChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTM4NChmcCkKKwliZ2VxdQlub25hbWUuNTI2CisJaW5jbAlyNAorbm9uYW1lLjUyNjoKKwltb3ZsCXI1LHIzCisJbW92bAlyNCxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjUyNworCWluY2wJcjkKK25vbmFtZS41Mjc6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjUyOAorCWluY2wJcjIKK25vbmFtZS41Mjg6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIzCisJYmdlcXUJbm9uYW1lLjUyOQorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjUyOQorCWluY2wJcjkKK25vbmFtZS41Mjk6CisJYWRkbDIJcjIscjcKKwliaWNsMgkjMCxyNworCWNtcGwJcjcscjIKKwliZ2VxdQlub25hbWUuNTMwCisJaW5jbAlyOQorbm9uYW1lLjUzMDoKKwltb3ZsCTQoYXApLHIwCisJbW92bAlyOCw0MChyMCkKKworCWNscmwJcjgKKworCW1vdmwJOChhcCkscjAKKwliaWNsMwkjLTY1NTM2LDI4KHIwKSxyMworCW1vdnp3bAkzMChyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwxNihyMCkscjIKKwltb3Z6d2wJMTgocjApLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTM4OChmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC0zOTIoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktMzg4KGZwKSwtMzkyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zODgoZnApCisJY21wbAktMzg4KGZwKSwtMzkyKGZwKQorCWJnZXF1CW5vbmFtZS41MzEKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS41MzE6CisJbW92endsCS0zODYoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMzg4KGZwKSxyMAorCWFzaGwJIzE2LHIwLC0zOTIoZnApCisJYWRkbDIJLTM5MihmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTM5MihmcCkKKwliZ2VxdQlub25hbWUuNTMyCisJaW5jbAlyNAorbm9uYW1lLjUzMjoKKwltb3ZsCXI1LHIzCisJbW92bAlyNCxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjUzMworCWluY2wJcjgKK25vbmFtZS41MzM6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjUzNAorCWluY2wJcjIKK25vbmFtZS41MzQ6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIzCisJYmdlcXUJbm9uYW1lLjUzNQorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjUzNQorCWluY2wJcjgKK25vbmFtZS41MzU6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuNTM2CisJaW5jbAlyOAorbm9uYW1lLjUzNjoKKworCW1vdmwJOChhcCkscjAKKwliaWNsMwkjLTY1NTM2LDI0KHIwKSxyMworCW1vdnp3bAkyNihyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwyMChyMCkscjIKKwltb3Z6d2wJMjIocjApLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUsLTM5NihmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC00MDAoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktMzk2KGZwKSwtNDAwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0zOTYoZnApCisJY21wbAktMzk2KGZwKSwtNDAwKGZwKQorCWJnZXF1CW5vbmFtZS41MzcKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS41Mzc6CisJbW92endsCS0zOTQoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMzk2KGZwKSxyMAorCWFzaGwJIzE2LHIwLC00MDAoZnApCisJYWRkbDIJLTQwMChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTQwMChmcCkKKwliZ2VxdQlub25hbWUuNTM4CisJaW5jbAlyNAorbm9uYW1lLjUzODoKKwltb3ZsCXI1LHIzCisJbW92bAlyNCxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjUzOQorCWluY2wJcjgKK25vbmFtZS41Mzk6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjU0MAorCWluY2wJcjIKK25vbmFtZS41NDA6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIzCisJYmdlcXUJbm9uYW1lLjU0MQorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjU0MQorCWluY2wJcjgKK25vbmFtZS41NDE6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuNTQyCisJaW5jbAlyOAorbm9uYW1lLjU0MjoKKworCW1vdmwJNChhcCkscjAKKwltb3ZsCXI3LDQ0KHIwKQorCisJY2xybAlyNworCisJbW92bAk4KGFwKSxyMworCW1vdmwJMjQocjMpLHI0CisJYmljbDMJIy02NTUzNixyNCxyNQorCWV4dHp2CSMxNiwjMTYscjQscjAKKwliaWNsMwkjLTY1NTM2LHIwLHI0CisJbXVsbDMJcjUscjQsLTQwNChmcCkKKwltdWxsMglyNSxyNQorCW11bGwyCXI0LHI0CisJYmljbDMJIzMyNzY3LC00MDQoZnApLHIwCisJZXh0enYJIzE1LCMxNyxyMCxyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtNDA0KGZwKSxyMAorCWFzaGwJIzE3LHIwLC00MDQoZnApCisJYWRkbDIJLTQwNChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTQwNChmcCkKKwliZ2VxdQlub25hbWUuNTQzCisJaW5jbAlyNAorbm9uYW1lLjU0MzoKKwltb3ZsCXI1LHIxCisJbW92bAlyNCxyMgorCWFkZGwyCXIxLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIxCisJYmdlcXUJbm9uYW1lLjU0NAorCWluY2wJcjIKK25vbmFtZS41NDQ6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuNTQ1CisJaW5jbAlyNworbm9uYW1lLjU0NToKKworCW1vdnp3bAkzMChyMykscjIKKwliaWNsMwkjLTY1NTM2LDIwKHIzKSxyMQorCW1vdnp3bAkyMihyMykscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYmljbDMJIy02NTUzNiwyOChyMyksLTQxNihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC00MjAoZnApCisJbXVsbDMJcjAsLTQxNihmcCksLTQwOChmcCkKKwltdWxsMglyMSwtNDE2KGZwKQorCW11bGwzCXIxLC00MjAoZnApLC00MTIoZnApCisJbXVsbDIJcjAsLTQyMChmcCkKKwlhZGRsMwktNDA4KGZwKSwtNDEyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC00MDgoZnApCisJY21wbAktNDA4KGZwKSwtNDEyKGZwKQorCWJnZXF1CW5vbmFtZS41NDYKKwlhZGRsMgkjNjU1MzYsLTQyMChmcCkKK25vbmFtZS41NDY6CisJbW92endsCS00MDYoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC00MjAoZnApCisJYmljbDMJIy02NTUzNiwtNDA4KGZwKSxyMAorCWFzaGwJIzE2LHIwLC00MTIoZnApCisJYWRkbDMJLTQxMihmcCksLTQxNihmcCkscjAKKwliaWNsMwkjMCxyMCwtNDE2KGZwKQorCWNtcGwJLTQxNihmcCksLTQxMihmcCkKKwliZ2VxdQlub25hbWUuNTQ3CisJaW5jbAktNDIwKGZwKQorbm9uYW1lLjU0NzoKKwltb3ZsCS00MTYoZnApLHIzCisJbW92bAktNDIwKGZwKSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjU0OAorCWluY2wJcjcKK25vbmFtZS41NDg6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjU0OQorCWluY2wJcjIKK25vbmFtZS41NDk6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIzCisJYmdlcXUJbm9uYW1lLjU1MAorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjU1MAorCWluY2wJcjcKK25vbmFtZS41NTA6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuNTUxCisJaW5jbAlyNworbm9uYW1lLjU1MToKKworCW1vdmwJNChhcCkscjAKKwltb3ZsCXI5LDQ4KHIwKQorCisJY2xybAlyOQorCisJbW92bAk4KGFwKSxyMAorCW1vdnp3bAkzMChyMCkscjIKKwliaWNsMwkjLTY1NTM2LDI0KHIwKSxyMworCW1vdnp3bAkyNihyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwyOChyMCksLTQzMihmcCkKKwliaWNsMwkjLTY1NTM2LHIyLC00MzYoZnApCisJbXVsbDMJcjEsLTQzMihmcCksLTQyNChmcCkKKwltdWxsMglyMywtNDMyKGZwKQorCW11bGwzCXIzLC00MzYoZnApLC00MjgoZnApCisJbXVsbDIJcjEsLTQzNihmcCkKKwlhZGRsMwktNDI0KGZwKSwtNDI4KGZwKSxyMAorCWJpY2wzCSMwLHIwLC00MjQoZnApCisJY21wbAktNDI0KGZwKSwtNDI4KGZwKQorCWJnZXF1CW5vbmFtZS41NTIKKwlhZGRsMgkjNjU1MzYsLTQzNihmcCkKK25vbmFtZS41NTI6CisJbW92endsCS00MjIoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLC00MzYoZnApCisJYmljbDMJIy02NTUzNiwtNDI0KGZwKSxyMAorCWFzaGwJIzE2LHIwLC00MjgoZnApCisJYWRkbDMJLTQyOChmcCksLTQzMihmcCkscjAKKwliaWNsMwkjMCxyMCwtNDMyKGZwKQorCWNtcGwJLTQzMihmcCksLTQyOChmcCkKKwliZ2VxdQlub25hbWUuNTUzCisJaW5jbAktNDM2KGZwKQorbm9uYW1lLjU1MzoKKwltb3ZsCS00MzIoZnApLHIzCisJbW92bAktNDM2KGZwKSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjU1NAorCWluY2wJcjkKK25vbmFtZS41NTQ6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjU1NQorCWluY2wJcjIKK25vbmFtZS41NTU6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIzCisJYmdlcXUJbm9uYW1lLjU1NgorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjU1NgorCWluY2wJcjkKK25vbmFtZS41NTY6CisJYWRkbDIJcjIscjcKKwliaWNsMgkjMCxyNworCWNtcGwJcjcscjIKKwliZ2VxdQlub25hbWUuNTU3CisJaW5jbAlyOQorbm9uYW1lLjU1NzoKKworCW1vdmwJNChhcCkscjQKKwltb3ZsCXI4LDUyKHI0KQorCisJY2xybAlyOAorCisJbW92bAk4KGFwKSxyMAorCW1vdmwJMjgocjApLHIzCisJYmljbDMJIy02NTUzNixyMywtNDQwKGZwKQorCWV4dHp2CSMxNiwjMTYscjMscjAKKwliaWNsMwkjLTY1NTM2LHIwLHIzCisJbW92bAktNDQwKGZwKSxyMAorCW11bGwzCXIwLHIzLC00NDQoZnApCisJbXVsbDMJcjAscjAsLTQ0MChmcCkKKwltdWxsMglyMyxyMworCWJpY2wzCSMzMjc2NywtNDQ0KGZwKSxyMAorCWV4dHp2CSMxNSwjMTcscjAscjAKKwlhZGRsMglyMCxyMworCWJpY2wzCSMtNjU1MzYsLTQ0NChmcCkscjAKKwlhc2hsCSMxNyxyMCwtNDQ0KGZwKQorCWFkZGwzCS00NDAoZnApLC00NDQoZnApLHIwCisJYmljbDMJIzAscjAsLTQ0MChmcCkKKwljbXBsCS00NDAoZnApLC00NDQoZnApCisJYmdlcXUJbm9uYW1lLjU1OAorCWluY2wJcjMKK25vbmFtZS41NTg6CisJbW92bAktNDQwKGZwKSxyMQorCW1vdmwJcjMscjIKKwlhZGRsMglyMSxyNworCWJpY2wyCSMwLHI3CisJY21wbAlyNyxyMQorCWJnZXF1CW5vbmFtZS41NTkKKwlpbmNsCXIyCitub25hbWUuNTU5OgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjU2MAorCWluY2wJcjgKK25vbmFtZS41NjA6CisKKwltb3ZsCXI3LDU2KHI0KQorCisJbW92bAlyOSw2MChyNCkKKworCXJldAkKKworDAorCis7cj00IDsoQVApCis7YT04IDsoQVApCis7Yj0xMiA7KEFQKQorO249MTYgOyhBUCkJbglieSB2YWx1ZSAoaW5wdXQpCisKKwkucHNlY3QJY29kZSxub3dydAorCisuZW50cnkJQk5fU1FSX0NPTUJBNCxebTxyMixyMyxyNCxyNSxyNixyNyxyOCxyOSxyMTA+CisJc3VibDIJIzQ0LHNwCisKKwljbHJxCXI4CisKKwljbHJsCXIxMAorCisJbW92bAk4KGFwKSxyNQorCW1vdmwJKHI1KSxyMworCWJpY2wzCSMtNjU1MzYscjMscjQKKwlleHR6dgkjMTYsIzE2LHIzLHIwCisJYmljbDMJIy02NTUzNixyMCxyMworCW11bGwzCXI0LHIzLC00KGZwKQorCW11bGwyCXI0LHI0CisJbXVsbDIJcjMscjMKKwliaWNsMwkjMzI3NjcsLTQoZnApLHIwCisJZXh0enYJIzE1LCMxNyxyMCxyMAorCWFkZGwyCXIwLHIzCisJYmljbDMJIy02NTUzNiwtNChmcCkscjAKKwlhc2hsCSMxNyxyMCwtNChmcCkKKwlhZGRsMgktNChmcCkscjQKKwliaWNsMgkjMCxyNAorCWNtcGwJcjQsLTQoZnApCisJYmdlcXUJbm9uYW1lLjU2MworCWluY2wJcjMKK25vbmFtZS41NjM6CisJbW92bAlyNCxyMQorCW1vdmwJcjMscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS41NjQKKwlpbmNsCXIyCitub25hbWUuNTY0OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjU2NQorCWluY2wJcjEwCitub25hbWUuNTY1OgorCisJbW92bAlyOSxANChhcCkKKworCWNscmwJcjkKKworCWJpY2wzCSMtNjU1MzYsNChyNSkscjMKKwltb3Z6d2wJNihyNSkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwocjUpLHIyCisJbW92endsCTIocjUpLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjYKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjYsLTgoZnApCisJbXVsbDIJcjIscjYKKwltdWxsMglyNCxyMgorCW11bGwyCXIwLHI0CisJYWRkbDMJLTgoZnApLHIyLHIwCisJYmljbDMJIzAscjAsLTgoZnApCisJY21wbAktOChmcCkscjIKKwliZ2VxdQlub25hbWUuNTY2CisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuNTY2OgorCW1vdnp3bAktNihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC04KGZwKSxyMAorCWFzaGwJIzE2LHIwLHIxCisJYWRkbDIJcjEscjYKKwliaWNsMgkjMCxyNgorCWNtcGwJcjYscjEKKwliZ2VxdQlub25hbWUuNTY3CisJaW5jbAlyNAorbm9uYW1lLjU2NzoKKwltb3ZsCXI2LHIzCisJbW92bAlyNCxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjU2OAorCWluY2wJcjkKK25vbmFtZS41Njg6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjU2OQorCWluY2wJcjIKK25vbmFtZS41Njk6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIzCisJYmdlcXUJbm9uYW1lLjU3MAorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjU3MAorCWluY2wJcjkKK25vbmFtZS41NzA6CisJYWRkbDIJcjIscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjIKKwliZ2VxdQlub25hbWUuNTcxCisJaW5jbAlyOQorbm9uYW1lLjU3MToKKworCW1vdmwJNChhcCkscjAKKwltb3ZsCXI4LDQocjApCisKKwljbHJsCXI4CisKKwltb3ZsCTgoYXApLHI0CisJbW92bAk0KHI0KSxyMworCWJpY2wzCSMtNjU1MzYscjMscjUKKwlleHR6dgkjMTYsIzE2LHIzLHIwCisJYmljbDMJIy02NTUzNixyMCxyMworCW11bGwzCXI1LHIzLHIxCisJbXVsbDIJcjUscjUKKwltdWxsMglyMyxyMworCWJpY2wzCSMzMjc2NyxyMSxyMAorCWV4dHp2CSMxNSwjMTcscjAscjAKKwlhZGRsMglyMCxyMworCWJpY2wyCSMtNjU1MzYscjEKKwlhc2hsCSMxNyxyMSxyMQorCWFkZGwyCXIxLHI1CisJYmljbDIJIzAscjUKKwljbXBsCXI1LHIxCisJYmdlcXUJbm9uYW1lLjU3MgorCWluY2wJcjMKK25vbmFtZS41NzI6CisJbW92bAlyNSxyMQorCW1vdmwJcjMscjIKKwlhZGRsMglyMSxyMTAKKwliaWNsMgkjMCxyMTAKKwljbXBsCXIxMCxyMQorCWJnZXF1CW5vbmFtZS41NzMKKwlpbmNsCXIyCitub25hbWUuNTczOgorCWFkZGwyCXIyLHI5CisJYmljbDIJIzAscjkKKwljbXBsCXI5LHIyCisJYmdlcXUJbm9uYW1lLjU3NAorCWluY2wJcjgKK25vbmFtZS41NzQ6CisKKwliaWNsMwkjLTY1NTM2LDgocjQpLHIzCisJbW92endsCTEwKHI0KSxyMQorCWJpY2wyCSMtNjU1MzYscjEKKwliaWNsMwkjLTY1NTM2LChyNCkscjIKKwltb3Z6d2wJMihyNCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNgorCW1vdmwJcjEscjUKKwltdWxsMwlyMCxyNixyNworCW11bGwyCXIyLHI2CisJbXVsbDIJcjUscjIKKwltdWxsMglyMCxyNQorCWFkZGwyCXIyLHI3CisJYmljbDIJIzAscjcKKwljbXBsCXI3LHIyCisJYmdlcXUJbm9uYW1lLjU3NQorCWFkZGwyCSM2NTUzNixyNQorbm9uYW1lLjU3NToKKwlleHR6dgkjMTYsIzE2LHI3LHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI1CisJYmljbDMJIy02NTUzNixyNyxyMAorCWFzaGwJIzE2LHIwLHIxCisJYWRkbDIJcjEscjYKKwliaWNsMgkjMCxyNgorCWNtcGwJcjYscjEKKwliZ2VxdQlub25hbWUuNTc2CisJaW5jbAlyNQorbm9uYW1lLjU3NjoKKwltb3ZsCXI2LHIzCisJbW92bAlyNSxyMgorCWJiYwkjMzEscjIsbm9uYW1lLjU3NworCWluY2wJcjgKK25vbmFtZS41Nzc6CisJYWRkbDIJcjIscjIKKwliaWNsMgkjMCxyMgorCWJiYwkjMzEscjMsbm9uYW1lLjU3OAorCWluY2wJcjIKK25vbmFtZS41Nzg6CisJYWRkbDIJcjMscjMKKwliaWNsMgkjMCxyMworCWFkZGwyCXIzLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIzCisJYmdlcXUJbm9uYW1lLjU3OQorCWluY2wJcjIKKwliaWNsMwkjMCxyMixyMAorCWJuZXEJbm9uYW1lLjU3OQorCWluY2wJcjgKK25vbmFtZS41Nzk6CisJYWRkbDIJcjIscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjIKKwliZ2VxdQlub25hbWUuNTgwCisJaW5jbAlyOAorbm9uYW1lLjU4MDoKKworCW1vdmwJNChhcCkscjAKKwltb3ZsCXIxMCw4KHIwKQorCisJY2xybAlyMTAKKworCW1vdmwJOChhcCkscjAKKwliaWNsMwkjLTY1NTM2LDEyKHIwKSxyMworCW1vdnp3bAkxNChyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiwocjApLHIyCisJbW92endsCTIocjApLHIwCisJYmljbDIJIy02NTUzNixyMAorCW1vdmwJcjMscjUKKwltb3ZsCXIxLHI0CisJbXVsbDMJcjAscjUscjYKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC0xMihmcCkKKwltdWxsMglyMCxyNAorCWFkZGwyCS0xMihmcCkscjYKKwliaWNsMgkjMCxyNgorCWNtcGwJcjYsLTEyKGZwKQorCWJnZXF1CW5vbmFtZS41ODEKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS41ODE6CisJZXh0enYJIzE2LCMxNixyNixyMAorCWJpY2wyCSMtNjU1MzYscjAKKwlhZGRsMglyMCxyNAorCWJpY2wzCSMtNjU1MzYscjYscjAKKwlhc2hsCSMxNixyMCwtMTIoZnApCisJYWRkbDIJLTEyKGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtMTIoZnApCisJYmdlcXUJbm9uYW1lLjU4MgorCWluY2wJcjQKK25vbmFtZS41ODI6CisJbW92bAlyNSxyMworCW1vdmwJcjQscjIKKwliYmMJIzMxLHIyLG5vbmFtZS41ODMKKwlpbmNsCXIxMAorbm9uYW1lLjU4MzoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNTg0CisJaW5jbAlyMgorbm9uYW1lLjU4NDoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjMKKwliZ2VxdQlub25hbWUuNTg1CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNTg1CisJaW5jbAlyMTAKK25vbmFtZS41ODU6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuNTg2CisJaW5jbAlyMTAKK25vbmFtZS41ODY6CisKKwltb3ZsCTgoYXApLHIwCisJYmljbDMJIy02NTUzNiw4KHIwKSxyMworCW1vdnp3bAkxMChyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiw0KHIwKSxyMgorCW1vdnp3bAk2KHIwKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXIzLHI1CisJbW92bAlyMSxyNAorCW11bGwzCXIwLHI1LC0xNihmcCkKKwltdWxsMglyMixyNQorCW11bGwzCXIyLHI0LC0yMChmcCkKKwltdWxsMglyMCxyNAorCWFkZGwzCS0xNihmcCksLTIwKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0xNihmcCkKKwljbXBsCS0xNihmcCksLTIwKGZwKQorCWJnZXF1CW5vbmFtZS41ODcKKwlhZGRsMgkjNjU1MzYscjQKK25vbmFtZS41ODc6CisJbW92endsCS0xNChmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC0xNihmcCkscjAKKwlhc2hsCSMxNixyMCwtMjAoZnApCisJYWRkbDIJLTIwKGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtMjAoZnApCisJYmdlcXUJbm9uYW1lLjU4OAorCWluY2wJcjQKK25vbmFtZS41ODg6CisJbW92bAlyNSxyMworCW1vdmwJcjQscjIKKwliYmMJIzMxLHIyLG5vbmFtZS41ODkKKwlpbmNsCXIxMAorbm9uYW1lLjU4OToKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNTkwCisJaW5jbAlyMgorbm9uYW1lLjU5MDoKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjkKKwliaWNsMgkjMCxyOQorCWNtcGwJcjkscjMKKwliZ2VxdQlub25hbWUuNTkxCisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNTkxCisJaW5jbAlyMTAKK25vbmFtZS41OTE6CisJYWRkbDIJcjIscjgKKwliaWNsMgkjMCxyOAorCWNtcGwJcjgscjIKKwliZ2VxdQlub25hbWUuNTkyCisJaW5jbAlyMTAKK25vbmFtZS41OTI6CisJbW92bAk0KGFwKSxyMAorCW1vdmwJcjksMTIocjApCisKKwljbHJsCXI5CisKKwltb3ZsCTgoYXApLHIzCisJbW92bAk4KHIzKSxyNAorCWJpY2wzCSMtNjU1MzYscjQscjUKKwlleHR6dgkjMTYsIzE2LHI0LHIwCisJYmljbDMJIy02NTUzNixyMCxyNAorCW11bGwzCXI1LHI0LC0yNChmcCkKKwltdWxsMglyNSxyNQorCW11bGwyCXI0LHI0CisJYmljbDMJIzMyNzY3LC0yNChmcCkscjAKKwlleHR6dgkjMTUsIzE3LHIwLHIwCisJYWRkbDIJcjAscjQKKwliaWNsMwkjLTY1NTM2LC0yNChmcCkscjAKKwlhc2hsCSMxNyxyMCwtMjQoZnApCisJYWRkbDIJLTI0KGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtMjQoZnApCisJYmdlcXUJbm9uYW1lLjU5MworCWluY2wJcjQKK25vbmFtZS41OTM6CisJbW92bAlyNSxyMQorCW1vdmwJcjQscjIKKwlhZGRsMglyMSxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMQorCWJnZXF1CW5vbmFtZS41OTQKKwlpbmNsCXIyCitub25hbWUuNTk0OgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjU5NQorCWluY2wJcjkKK25vbmFtZS41OTU6CisKKwliaWNsMwkjLTY1NTM2LDEyKHIzKSxyNAorCW1vdnp3bAkxNChyMykscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiw0KHIzKSxyMgorCW1vdnp3bAk2KHIzKSxyMAorCWJpY2wyCSMtNjU1MzYscjAKKwltb3ZsCXI0LHI2CisJbW92bAlyMSxyNQorCW11bGwzCXIwLHI2LC0yOChmcCkKKwltdWxsMglyMixyNgorCW11bGwzCXIyLHI1LC0zMihmcCkKKwltdWxsMglyMCxyNQorCWFkZGwzCS0yOChmcCksLTMyKGZwKSxyMAorCWJpY2wzCSMwLHIwLC0yOChmcCkKKwljbXBsCS0yOChmcCksLTMyKGZwKQorCWJnZXF1CW5vbmFtZS41OTYKKwlhZGRsMgkjNjU1MzYscjUKK25vbmFtZS41OTY6CisJbW92endsCS0yNihmcCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJYWRkbDIJcjAscjUKKwliaWNsMwkjLTY1NTM2LC0yOChmcCkscjAKKwlhc2hsCSMxNixyMCwtMzIoZnApCisJYWRkbDIJLTMyKGZwKSxyNgorCWJpY2wyCSMwLHI2CisJY21wbAlyNiwtMzIoZnApCisJYmdlcXUJbm9uYW1lLjU5NworCWluY2wJcjUKK25vbmFtZS41OTc6CisJbW92bAlyNixyMworCW1vdmwJcjUscjIKKwliYmMJIzMxLHIyLG5vbmFtZS41OTgKKwlpbmNsCXI5Citub25hbWUuNTk4OgorCWFkZGwyCXIyLHIyCisJYmljbDIJIzAscjIKKwliYmMJIzMxLHIzLG5vbmFtZS41OTkKKwlpbmNsCXIyCitub25hbWUuNTk5OgorCWFkZGwyCXIzLHIzCisJYmljbDIJIzAscjMKKwlhZGRsMglyMyxyOAorCWJpY2wyCSMwLHI4CisJY21wbAlyOCxyMworCWJnZXF1CW5vbmFtZS42MDAKKwlpbmNsCXIyCisJYmljbDMJIzAscjIscjAKKwlibmVxCW5vbmFtZS42MDAKKwlpbmNsCXI5Citub25hbWUuNjAwOgorCWFkZGwyCXIyLHIxMAorCWJpY2wyCSMwLHIxMAorCWNtcGwJcjEwLHIyCisJYmdlcXUJbm9uYW1lLjYwMQorCWluY2wJcjkKK25vbmFtZS42MDE6CisKKwltb3ZsCTQoYXApLHIwCisJbW92bAlyOCwxNihyMCkKKworCWNscmwJcjgKKworCW1vdmwJOChhcCkscjAKKwliaWNsMwkjLTY1NTM2LDEyKHIwKSxyMworCW1vdnp3bAkxNChyMCkscjEKKwliaWNsMgkjLTY1NTM2LHIxCisJYmljbDMJIy02NTUzNiw4KHIwKSxyMgorCW1vdnp3bAkxMChyMCkscjAKKwliaWNsMgkjLTY1NTM2LHIwCisJbW92bAlyMyxyNQorCW1vdmwJcjEscjQKKwltdWxsMwlyMCxyNSwtMzYoZnApCisJbXVsbDIJcjIscjUKKwltdWxsMwlyMixyNCwtNDAoZnApCisJbXVsbDIJcjAscjQKKwlhZGRsMwktMzYoZnApLC00MChmcCkscjAKKwliaWNsMwkjMCxyMCwtMzYoZnApCisJY21wbAktMzYoZnApLC00MChmcCkKKwliZ2VxdQlub25hbWUuNjAyCisJYWRkbDIJIzY1NTM2LHI0Citub25hbWUuNjAyOgorCW1vdnp3bAktMzQoZnApLHIwCisJYmljbDIJIy02NTUzNixyMAorCWFkZGwyCXIwLHI0CisJYmljbDMJIy02NTUzNiwtMzYoZnApLHIwCisJYXNobAkjMTYscjAsLTQwKGZwKQorCWFkZGwyCS00MChmcCkscjUKKwliaWNsMgkjMCxyNQorCWNtcGwJcjUsLTQwKGZwKQorCWJnZXF1CW5vbmFtZS42MDMKKwlpbmNsCXI0Citub25hbWUuNjAzOgorCW1vdmwJcjUscjMKKwltb3ZsCXI0LHIyCisJYmJjCSMzMSxyMixub25hbWUuNjA0CisJaW5jbAlyOAorbm9uYW1lLjYwNDoKKwlhZGRsMglyMixyMgorCWJpY2wyCSMwLHIyCisJYmJjCSMzMSxyMyxub25hbWUuNjA1CisJaW5jbAlyMgorbm9uYW1lLjYwNToKKwlhZGRsMglyMyxyMworCWJpY2wyCSMwLHIzCisJYWRkbDIJcjMscjEwCisJYmljbDIJIzAscjEwCisJY21wbAlyMTAscjMKKwliZ2VxdQlub25hbWUuNjA2CisJaW5jbAlyMgorCWJpY2wzCSMwLHIyLHIwCisJYm5lcQlub25hbWUuNjA2CisJaW5jbAlyOAorbm9uYW1lLjYwNjoKKwlhZGRsMglyMixyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMgorCWJnZXF1CW5vbmFtZS42MDcKKwlpbmNsCXI4Citub25hbWUuNjA3OgorCisJbW92bAk0KGFwKSxyNAorCW1vdmwJcjEwLDIwKHI0KQorCisJY2xybAlyMTAKKworCW1vdmwJOChhcCkscjAKKwltb3ZsCTEyKHIwKSxyMworCWJpY2wzCSMtNjU1MzYscjMscjUKKwlleHR6dgkjMTYsIzE2LHIzLHIwCisJYmljbDMJIy02NTUzNixyMCxyMworCW11bGwzCXI1LHIzLC00NChmcCkKKwltdWxsMglyNSxyNQorCW11bGwyCXIzLHIzCisJYmljbDMJIzMyNzY3LC00NChmcCkscjAKKwlleHR6dgkjMTUsIzE3LHIwLHIwCisJYWRkbDIJcjAscjMKKwliaWNsMwkjLTY1NTM2LC00NChmcCkscjAKKwlhc2hsCSMxNyxyMCwtNDQoZnApCisJYWRkbDIJLTQ0KGZwKSxyNQorCWJpY2wyCSMwLHI1CisJY21wbAlyNSwtNDQoZnApCisJYmdlcXUJbm9uYW1lLjYwOAorCWluY2wJcjMKK25vbmFtZS42MDg6CisJbW92bAlyNSxyMQorCW1vdmwJcjMscjIKKwlhZGRsMglyMSxyOQorCWJpY2wyCSMwLHI5CisJY21wbAlyOSxyMQorCWJnZXF1CW5vbmFtZS42MDkKKwlpbmNsCXIyCitub25hbWUuNjA5OgorCWFkZGwyCXIyLHI4CisJYmljbDIJIzAscjgKKwljbXBsCXI4LHIyCisJYmdlcXUJbm9uYW1lLjYxMAorCWluY2wJcjEwCitub25hbWUuNjEwOgorCisJbW92bAlyOSwyNChyNCkKKworCW1vdmwJcjgsMjgocjQpCisKKwlyZXQJCisKKzsgRm9yIG5vdywgdGhlIGNvZGUgYmVsb3cgZG9lc24ndCB3b3JrLCBzbyBJIGVuZCB0aGlzIHByZW1hdHVyZWx5LgorLmVuZApkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYtbW9udC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2LW1vbnQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkM2NkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2LW1vbnQucGwKQEAgLTAsMCArMSw1OTEgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBPY3RvYmVyIDIwMDUKKyMKKyMgVGhpcyBpcyBhICJ0ZWFzZXIiIGNvZGUsIGFzIGl0IGNhbiBiZSBpbXByb3ZlZCBpbiBzZXZlcmFsIHdheXMuLi4KKyMgRmlyc3Qgb2YgYWxsIG5vbi1TU0UyIHBhdGggc2hvdWxkIGJlIGltcGxlbWVudGVkICh5ZXMsIGZvciBub3cgaXQKKyMgcGVyZm9ybXMgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbi9jb252b2x1dGlvbiBvbmx5IG9uIFNTRTItY2FwYWJsZQorIyBDUFVzIHN1Y2ggYXMgUDQsIG90aGVycyBmYWxsIGRvd24gdG8gb3JpZ2luYWwgY29kZSkuIFRoZW4gaW5uZXIgbG9vcAorIyBjYW4gYmUgdW5yb2xsZWQgYW5kIG1vZHVsby1zY2hlZHVsZWQgdG8gaW1wcm92ZSBJTFAgYW5kIHBvc3NpYmx5CisjIG1vdmVkIHRvIDEyOC1iaXQgWE1NIHJlZ2lzdGVyIGJhbmsgKHRob3VnaCBpdCB3b3VsZCByZXF1aXJlIGlucHV0CisjIHJlYXJyYW5nZW1lbnQgYW5kL29yIGluY3JlYXNlIGJ1cyBiYW5kd2lkdGggdXRpbGl6YXRpb24pLiBEZWRpY2F0ZWQKKyMgc3F1YXJpbmcgcHJvY2VkdXJlIHNob3VsZCBnaXZlIGZ1cnRoZXIgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQuLi4KKyMgWWV0LCBmb3IgYmVpbmcgZHJhZnQsIHRoZSBjb2RlIGltcHJvdmVzIHJzYTUxMiAqc2lnbiogYmVuY2htYXJrIGJ5CisjIDExMCUoISksIHJzYTEwMjQgb25lIC0gYnkgNzAlIGFuZCByc2E0MDk2IC0gYnkgMjAlOi0pCisKKyMgRGVjZW1iZXIgMjAwNgorIworIyBNb2R1bG8tc2NoZWR1bGluZyBTU0UyIGxvb3BzIHJlc3VsdHMgaW4gZnVydGhlciAxNS0yMCUgaW1wcm92ZW1lbnQuCisjIEludGVnZXItb25seSBjb2RlIFtiZWluZyBlcXVpcHBlZCB3aXRoIGRlZGljYXRlZCBzcXVhcmluZyBwcm9jZWR1cmVdCisjIGdpdmVzIH40MCUgb24gcnNhNTEyIHNpZ24gYmVuY2htYXJrLi4uCisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwkMCk7CisKKyRzc2UyPTA7Citmb3IgKEBBUkdWKSB7ICRzc2UyPTEgaWYgKC8tRE9QRU5TU0xfSUEzMl9TU0UyLyk7IH0KKworJmV4dGVybmFsX2xhYmVsKCJPUEVOU1NMX2lhMzJjYXBfUCIpIGlmICgkc3NlMik7CisKKyZmdW5jdGlvbl9iZWdpbigiYm5fbXVsX21vbnQiKTsKKworJGk9ImVkeCI7Ciskaj0iZWN4IjsKKyRhcD0iZXNpIjsJJHRwPSJlc2kiOwkJIyBvdmVybGFwcGluZyB2YXJpYWJsZXMhISEKKyRycD0iZWRpIjsJJGJwPSJlZGkiOwkJIyBvdmVybGFwcGluZyB2YXJpYWJsZXMhISEKKyRucD0iZWJwIjsKKyRudW09ImVieCI7CisKKyRfbnVtPSZEV1AoNCowLCJlc3AiKTsJCQkjIHN0YWNrIHRvcCBsYXlvdXQKKyRfcnA9JkRXUCg0KjEsImVzcCIpOworJF9hcD0mRFdQKDQqMiwiZXNwIik7CiskX2JwPSZEV1AoNCozLCJlc3AiKTsKKyRfbnA9JkRXUCg0KjQsImVzcCIpOworJF9uMD0mRFdQKDQqNSwiZXNwIik7CSRfbjBxPSZRV1AoNCo1LCJlc3AiKTsKKyRfc3A9JkRXUCg0KjYsImVzcCIpOworJF9icGVuZD0mRFdQKDQqNywiZXNwIik7CiskZnJhbWU9MzI7CQkJCSMgc2l6ZSBvZiBhYm92ZSBmcmFtZSByb3VuZGVkIHVwIHRvIDE2bgorCisJJnhvcgkoImVheCIsImVheCIpOworCSZtb3YJKCJlZGkiLCZ3cGFyYW0oNSkpOwkjIGludCBudW0KKwkmY21wCSgiZWRpIiw0KTsKKwkmamwJKCZsYWJlbCgianVzdF9sZWF2ZSIpKTsKKworCSZsZWEJKCJlc2kiLCZ3cGFyYW0oMCkpOwkjIHB1dCBhc2lkZSBwb2ludGVyIHRvIGFyZ3VtZW50IGJsb2NrCisJJmxlYQkoImVkeCIsJndwYXJhbSgxKSk7CSMgbG9hZCBhcAorCSZtb3YJKCJlYnAiLCJlc3AiKTsJCSMgc2F2ZWQgc3RhY2sgcG9pbnRlciEKKwkmYWRkCSgiZWRpIiwyKTsJCSMgZXh0cmEgdHdvIHdvcmRzIG9uIHRvcCBvZiB0cAorCSZuZWcJKCJlZGkiKTsKKwkmbGVhCSgiZXNwIiwmRFdQKC0kZnJhbWUsImVzcCIsImVkaSIsNCkpOwkjIGFsbG9jYSgkZnJhbWUrNCoobnVtKzIpKQorCSZuZWcJKCJlZGkiKTsKKworCSMgbWluaW1pemUgY2FjaGUgY29udGVudGlvbiBieSBhcnJhbmluZyAySyB3aW5kb3cgYmV0d2VlbiBzdGFjaworCSMgcG9pbnRlciBhbmQgYXAgYXJndW1lbnQgW25wIGlzIGFsc28gcG9zaXRpb24gc2Vuc2l0aXZlIHZlY3RvciwKKwkjIGJ1dCBpdCdzIGFzc3VtZWQgdG8gYmUgbmVhciBhcCwgYXMgaXQncyBhbGxvY2F0ZWQgYXQgfnNhbWUKKwkjIHRpbWVdLgorCSZtb3YJKCJlYXgiLCJlc3AiKTsKKwkmc3ViCSgiZWF4IiwiZWR4Iik7CisJJmFuZAkoImVheCIsMjA0Nyk7CisJJnN1YgkoImVzcCIsImVheCIpOwkJIyB0aGlzIGFsaWducyBzcCBhbmQgYXAgbW9kdWxvIDIwNDgKKworCSZ4b3IJKCJlZHgiLCJlc3AiKTsKKwkmYW5kCSgiZWR4IiwyMDQ4KTsKKwkmeG9yCSgiZWR4IiwyMDQ4KTsKKwkmc3ViCSgiZXNwIiwiZWR4Iik7CQkjIHRoaXMgc3BsaXRzIHRoZW0gYXBhcnQgbW9kdWxvIDQwOTYKKworCSZhbmQJKCJlc3AiLC02NCk7CQkjIGFsaWduIHRvIGNhY2hlIGxpbmUKKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBsb2FkIGFyZ3VtZW50IGJsb2NrLi4uCisJJm1vdgkoImVheCIsJkRXUCgwKjQsImVzaSIpKTsjIEJOX1VMT05HICpycAorCSZtb3YJKCJlYngiLCZEV1AoMSo0LCJlc2kiKSk7IyBjb25zdCBCTl9VTE9ORyAqYXAKKwkmbW92CSgiZWN4IiwmRFdQKDIqNCwiZXNpIikpOyMgY29uc3QgQk5fVUxPTkcgKmJwCisJJm1vdgkoImVkeCIsJkRXUCgzKjQsImVzaSIpKTsjIGNvbnN0IEJOX1VMT05HICpucAorCSZtb3YJKCJlc2kiLCZEV1AoNCo0LCJlc2kiKSk7IyBjb25zdCBCTl9VTE9ORyAqbjAKKwkjJm1vdgkoImVkaSIsJkRXUCg1KjQsImVzaSIpKTsjIGludCBudW0KKworCSZtb3YJKCJlc2kiLCZEV1AoMCwiZXNpIikpOwkjIHB1bGwgbjBbMF0KKwkmbW92CSgkX3JwLCJlYXgiKTsJCSMgLi4uIHNhdmUgYSBjb3B5IG9mIGFyZ3VtZW50IGJsb2NrCisJJm1vdgkoJF9hcCwiZWJ4Iik7CisJJm1vdgkoJF9icCwiZWN4Iik7CisJJm1vdgkoJF9ucCwiZWR4Iik7CisJJm1vdgkoJF9uMCwiZXNpIik7CisJJmxlYQkoJG51bSwmRFdQKC0zLCJlZGkiKSk7CSMgbnVtPW51bS0xIHRvIGFzc2lzdCBtb2R1bG8tc2NoZWR1bGluZworCSMmbW92CSgkX251bSwkbnVtKTsJCSMgcmVkdW5kYW50IGFzICRudW0gaXMgbm90IHJldXNlZAorCSZtb3YJKCRfc3AsImVicCIpOwkJIyBzYXZlZCBzdGFjayBwb2ludGVyIQorDAoraWYoJHNzZTIpIHsKKyRhY2MwPSJtbTAiOwkjIG1teCByZWdpc3RlciBiYW5rIGxheW91dAorJGFjYzE9Im1tMSI7CiskY2FyMD0ibW0yIjsKKyRjYXIxPSJtbTMiOworJG11bDA9Im1tNCI7CiskbXVsMT0ibW01IjsKKyR0ZW1wPSJtbTYiOworJG1hc2s9Im1tNyI7CisKKwkmcGljbWV1cCgiZWF4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkmYnQJKCZEV1AoMCwiZWF4IiksMjYpOworCSZqbmMJKCZsYWJlbCgibm9uX3NzZTIiKSk7CisKKwkmbW92CSgiZWF4IiwtMSk7CisJJm1vdmQJKCRtYXNrLCJlYXgiKTsJCSMgbWFzayAzMiBsb3dlciBiaXRzCisKKwkmbW92CSgkYXAsJF9hcCk7CQkjIGxvYWQgaW5wdXQgcG9pbnRlcnMKKwkmbW92CSgkYnAsJF9icCk7CisJJm1vdgkoJG5wLCRfbnApOworCisJJnhvcgkoJGksJGkpOwkJIyBpPTAKKwkmeG9yCSgkaiwkaik7CQkjIGo9MAorCisJJm1vdmQJKCRtdWwwLCZEV1AoMCwkYnApKTsJCSMgYnBbMF0KKwkmbW92ZAkoJG11bDEsJkRXUCgwLCRhcCkpOwkJIyBhcFswXQorCSZtb3ZkCSgkY2FyMSwmRFdQKDAsJG5wKSk7CQkjIG5wWzBdCisKKwkmcG11bHVkcSgkbXVsMSwkbXVsMCk7CQkJIyBhcFswXSpicFswXQorCSZtb3ZxCSgkY2FyMCwkbXVsMSk7CisJJm1vdnEJKCRhY2MwLCRtdWwxKTsJCQkjIEkgd2lzaCBtb3ZkIHdvcmtlZCBmb3IKKwkmcGFuZAkoJGFjYzAsJG1hc2spOwkJCSMgaW50ZXItcmVnaXN0ZXIgdHJhbnNmZXJzCisKKwkmcG11bHVkcSgkbXVsMSwkX24wcSk7CQkJIyAqPW4wCisKKwkmcG11bHVkcSgkY2FyMSwkbXVsMSk7CQkJIyAidFswXSIqbnBbMF0qbjAKKwkmcGFkZHEJKCRjYXIxLCRhY2MwKTsKKworCSZtb3ZkCSgkYWNjMSwmRFdQKDQsJG5wKSk7CQkjIG5wWzFdCisJJm1vdmQJKCRhY2MwLCZEV1AoNCwkYXApKTsJCSMgYXBbMV0KKworCSZwc3JscQkoJGNhcjAsMzIpOworCSZwc3JscQkoJGNhcjEsMzIpOworCisJJmluYwkoJGopOwkJCQkjIGorKworJnNldF9sYWJlbCgiMXN0IiwxNik7CisJJnBtdWx1ZHEoJGFjYzAsJG11bDApOwkJCSMgYXBbal0qYnBbMF0KKwkmcG11bHVkcSgkYWNjMSwkbXVsMSk7CQkJIyBucFtqXSptMQorCSZwYWRkcQkoJGNhcjAsJGFjYzApOwkJCSMgKz1jMAorCSZwYWRkcQkoJGNhcjEsJGFjYzEpOwkJCSMgKz1jMQorCisJJm1vdnEJKCRhY2MwLCRjYXIwKTsKKwkmcGFuZAkoJGFjYzAsJG1hc2spOworCSZtb3ZkCSgkYWNjMSwmRFdQKDQsJG5wLCRqLDQpKTsJIyBucFtqKzFdCisJJnBhZGRxCSgkY2FyMSwkYWNjMCk7CQkJIyArPWFwW2pdKmJwWzBdOworCSZtb3ZkCSgkYWNjMCwmRFdQKDQsJGFwLCRqLDQpKTsJIyBhcFtqKzFdCisJJnBzcmxxCSgkY2FyMCwzMik7CisJJm1vdmQJKCZEV1AoJGZyYW1lLTQsImVzcCIsJGosNCksJGNhcjEpOwkjIHRwW2otMV09CisJJnBzcmxxCSgkY2FyMSwzMik7CisKKwkmbGVhCSgkaiwmRFdQKDEsJGopKTsKKwkmY21wCSgkaiwkbnVtKTsKKwkmamwJKCZsYWJlbCgiMXN0IikpOworCisJJnBtdWx1ZHEoJGFjYzAsJG11bDApOwkJCSMgYXBbbnVtLTFdKmJwWzBdCisJJnBtdWx1ZHEoJGFjYzEsJG11bDEpOwkJCSMgbnBbbnVtLTFdKm0xCisJJnBhZGRxCSgkY2FyMCwkYWNjMCk7CQkJIyArPWMwCisJJnBhZGRxCSgkY2FyMSwkYWNjMSk7CQkJIyArPWMxCisKKwkmbW92cQkoJGFjYzAsJGNhcjApOworCSZwYW5kCSgkYWNjMCwkbWFzayk7CisJJnBhZGRxCSgkY2FyMSwkYWNjMCk7CQkJIyArPWFwW251bS0xXSpicFswXTsKKwkmbW92ZAkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkaiw0KSwkY2FyMSk7CSMgdHBbbnVtLTJdPQorCisJJnBzcmxxCSgkY2FyMCwzMik7CisJJnBzcmxxCSgkY2FyMSwzMik7CisKKwkmcGFkZHEJKCRjYXIxLCRjYXIwKTsKKwkmbW92cQkoJlFXUCgkZnJhbWUsImVzcCIsJG51bSw0KSwkY2FyMSk7CSMgdHBbbnVtXS50cFtudW0tMV0KKwwKKwkmaW5jCSgkaSk7CQkJCSMgaSsrCismc2V0X2xhYmVsKCJvdXRlciIpOworCSZ4b3IJKCRqLCRqKTsJCQkjIGo9MAorCisJJm1vdmQJKCRtdWwwLCZEV1AoMCwkYnAsJGksNCkpOwkjIGJwW2ldCisJJm1vdmQJKCRtdWwxLCZEV1AoMCwkYXApKTsJCSMgYXBbMF0KKwkmbW92ZAkoJHRlbXAsJkRXUCgkZnJhbWUsImVzcCIpKTsJIyB0cFswXQorCSZtb3ZkCSgkY2FyMSwmRFdQKDAsJG5wKSk7CQkjIG5wWzBdCisJJnBtdWx1ZHEoJG11bDEsJG11bDApOwkJCSMgYXBbMF0qYnBbaV0KKworCSZwYWRkcQkoJG11bDEsJHRlbXApOwkJCSMgKz10cFswXQorCSZtb3ZxCSgkYWNjMCwkbXVsMSk7CisJJm1vdnEJKCRjYXIwLCRtdWwxKTsKKwkmcGFuZAkoJGFjYzAsJG1hc2spOworCisJJnBtdWx1ZHEoJG11bDEsJF9uMHEpOwkJCSMgKj1uMAorCisJJnBtdWx1ZHEoJGNhcjEsJG11bDEpOworCSZwYWRkcQkoJGNhcjEsJGFjYzApOworCisJJm1vdmQJKCR0ZW1wLCZEV1AoJGZyYW1lKzQsImVzcCIpKTsJIyB0cFsxXQorCSZtb3ZkCSgkYWNjMSwmRFdQKDQsJG5wKSk7CQkjIG5wWzFdCisJJm1vdmQJKCRhY2MwLCZEV1AoNCwkYXApKTsJCSMgYXBbMV0KKworCSZwc3JscQkoJGNhcjAsMzIpOworCSZwc3JscQkoJGNhcjEsMzIpOworCSZwYWRkcQkoJGNhcjAsJHRlbXApOwkJCSMgKz10cFsxXQorCisJJmluYwkoJGopOwkJCQkjIGorKworCSZkZWMJKCRudW0pOworJnNldF9sYWJlbCgiaW5uZXIiKTsKKwkmcG11bHVkcSgkYWNjMCwkbXVsMCk7CQkJIyBhcFtqXSpicFtpXQorCSZwbXVsdWRxKCRhY2MxLCRtdWwxKTsJCQkjIG5wW2pdKm0xCisJJnBhZGRxCSgkY2FyMCwkYWNjMCk7CQkJIyArPWMwCisJJnBhZGRxCSgkY2FyMSwkYWNjMSk7CQkJIyArPWMxCisKKwkmbW92cQkoJGFjYzAsJGNhcjApOworCSZtb3ZkCSgkdGVtcCwmRFdQKCRmcmFtZSs0LCJlc3AiLCRqLDQpKTsjIHRwW2orMV0KKwkmcGFuZAkoJGFjYzAsJG1hc2spOworCSZtb3ZkCSgkYWNjMSwmRFdQKDQsJG5wLCRqLDQpKTsJIyBucFtqKzFdCisJJnBhZGRxCSgkY2FyMSwkYWNjMCk7CQkJIyArPWFwW2pdKmJwW2ldK3RwW2pdCisJJm1vdmQJKCRhY2MwLCZEV1AoNCwkYXAsJGosNCkpOwkjIGFwW2orMV0KKwkmcHNybHEJKCRjYXIwLDMyKTsKKwkmbW92ZAkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkaiw0KSwkY2FyMSk7IyB0cFtqLTFdPQorCSZwc3JscQkoJGNhcjEsMzIpOworCSZwYWRkcQkoJGNhcjAsJHRlbXApOwkJCSMgKz10cFtqKzFdCisKKwkmZGVjCSgkbnVtKTsKKwkmbGVhCSgkaiwmRFdQKDEsJGopKTsJCSMgaisrCisJJmpuegkoJmxhYmVsKCJpbm5lciIpKTsKKworCSZtb3YJKCRudW0sJGopOworCSZwbXVsdWRxKCRhY2MwLCRtdWwwKTsJCQkjIGFwW251bS0xXSpicFtpXQorCSZwbXVsdWRxKCRhY2MxLCRtdWwxKTsJCQkjIG5wW251bS0xXSptMQorCSZwYWRkcQkoJGNhcjAsJGFjYzApOwkJCSMgKz1jMAorCSZwYWRkcQkoJGNhcjEsJGFjYzEpOwkJCSMgKz1jMQorCisJJm1vdnEJKCRhY2MwLCRjYXIwKTsKKwkmcGFuZAkoJGFjYzAsJG1hc2spOworCSZwYWRkcQkoJGNhcjEsJGFjYzApOwkJCSMgKz1hcFtudW0tMV0qYnBbaV0rdHBbbnVtLTFdCisJJm1vdmQJKCZEV1AoJGZyYW1lLTQsImVzcCIsJGosNCksJGNhcjEpOwkjIHRwW251bS0yXT0KKwkmcHNybHEJKCRjYXIwLDMyKTsKKwkmcHNybHEJKCRjYXIxLDMyKTsKKworCSZtb3ZkCSgkdGVtcCwmRFdQKCRmcmFtZSs0LCJlc3AiLCRudW0sNCkpOwkjICs9IHRwW251bV0KKwkmcGFkZHEJKCRjYXIxLCRjYXIwKTsKKwkmcGFkZHEJKCRjYXIxLCR0ZW1wKTsKKwkmbW92cQkoJlFXUCgkZnJhbWUsImVzcCIsJG51bSw0KSwkY2FyMSk7CSMgdHBbbnVtXS50cFtudW0tMV0KKworCSZsZWEJKCRpLCZEV1AoMSwkaSkpOwkJIyBpKysKKwkmY21wCSgkaSwkbnVtKTsKKwkmamxlCSgmbGFiZWwoIm91dGVyIikpOworCisJJmVtbXMJKCk7CQkJCSMgZG9uZSB3aXRoIG1teCBiYW5rCisJJmptcAkoJmxhYmVsKCJjb21tb25fdGFpbCIpKTsKKworJnNldF9sYWJlbCgibm9uX3NzZTIiLDE2KTsKK30KKwwKK2lmICgwKSB7CisJJm1vdgkoImVzcCIsJF9zcCk7CisJJnhvcgkoImVheCIsImVheCIpOwkjIHNpZ25hbCAibm90IGZhc3QgZW5vdWdoIFt5ZXRdIgorCSZqbXAJKCZsYWJlbCgianVzdF9sZWF2ZSIpKTsKKwkjIFdoaWxlIHRoZSBiZWxvdyBjb2RlIHByb3ZpZGVzIGNvbXBldGl0aXZlIHBlcmZvcm1hbmNlIGZvcgorCSMgYWxsIGtleSBsZW5ndGhlcyBvbiBtb2Rlcm4gSW50ZWwgY29yZXMsIGl0J3Mgc3RpbGwgbW9yZQorCSMgdGhhbiAxMCUgc2xvd2VyIGZvciA0MDk2LWJpdCBrZXkgZWxzZXdoZXJlOi0oICJDb21wZXRpdGl2ZSIKKwkjIG1lYW5zIGNvbXBhcmVkIHRvIHRoZSBvcmlnaW5hbCBpbnRlZ2VyLW9ubHkgYXNzZW1ibGVyLgorCSMgNTEyLWJpdCBSU0Egc2lnbiBpcyBiZXR0ZXIgYnkgfjQwJSwgYnV0IHRoYXQncyBhYm91dCBhbGwKKwkjIG9uZSBjYW4gc2F5IGFib3V0IGFsbCBDUFVzLi4uCit9IGVsc2UgeworJGlucD0iZXNpIjsJIyBpbnRlZ2VyIHBhdGggdXNlcyB0aGVzZSByZWdpc3RlcnMgZGlmZmVyZW50bHkKKyR3b3JkPSJlZGkiOworJGNhcnJ5PSJlYnAiOworCisJJm1vdgkoJGlucCwkX2FwKTsKKwkmbGVhCSgkY2FycnksJkRXUCgxLCRudW0pKTsKKwkmbW92CSgkd29yZCwkX2JwKTsKKwkmeG9yCSgkaiwkaik7CQkJCSMgaj0wCisJJm1vdgkoImVkeCIsJGlucCk7CisJJmFuZAkoJGNhcnJ5LDEpOwkJCQkjIHNlZSBpZiBudW0gaXMgZXZlbgorCSZzdWIJKCJlZHgiLCR3b3JkKTsJCQkJIyBzZWUgaWYgYXA9PWJwCisJJmxlYQkoImVheCIsJkRXUCg0LCR3b3JkLCRudW0sNCkpOwkJIyAmYnBbbnVtXQorCSZvcgkoJGNhcnJ5LCJlZHgiKTsKKwkmbW92CSgkd29yZCwmRFdQKDAsJHdvcmQpKTsJCQkjIGJwWzBdCisJJmp6CSgmbGFiZWwoImJuX3Nxcl9tb250IikpOworCSZtb3YJKCRfYnBlbmQsImVheCIpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wKSk7CisJJnhvcgkoImVkeCIsImVkeCIpOworCismc2V0X2xhYmVsKCJtdWxsIiwxNik7CisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgYXBbal0qYnBbMF0KKwkmYWRkCSgkY2FycnksImVheCIpOworCSZsZWEJKCRqLCZEV1AoMSwkaikpOworCSZhZGMJKCJlZHgiLDApOworCSZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wLCRqLDQpKTsJCSMgYXBbaisxXQorCSZjbXAJKCRqLCRudW0pOworCSZtb3YJKCZEV1AoJGZyYW1lLTQsImVzcCIsJGosNCksJGNhcnJ5KTsJIyB0cFtqXT0KKwkmamwJKCZsYWJlbCgibXVsbCIpKTsKKworCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJm11bAkoJHdvcmQpOwkJCQkjIGFwW251bS0xXSpicFswXQorCSAmbW92CSgkd29yZCwkX24wKTsKKwkmYWRkCSgiZWF4IiwkY2FycnkpOworCSAmbW92CSgkaW5wLCRfbnApOworCSZhZGMJKCJlZHgiLDApOworCSAmaW11bAkoJHdvcmQsJkRXUCgkZnJhbWUsImVzcCIpKTsJCSMgbjAqdHBbMF0KKworCSZtb3YJKCZEV1AoJGZyYW1lLCJlc3AiLCRudW0sNCksImVheCIpOwkjIHRwW251bS0xXT0KKwkmeG9yCSgkaiwkaik7CisJJm1vdgkoJkRXUCgkZnJhbWUrNCwiZXNwIiwkbnVtLDQpLCJlZHgiKTsJIyB0cFtudW1dPQorCSZtb3YJKCZEV1AoJGZyYW1lKzgsImVzcCIsJG51bSw0KSwkaik7CSMgdHBbbnVtKzFdPQorCisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnApKTsJCQkjIG5wWzBdCisJJm11bAkoJHdvcmQpOwkJCQkjIG5wWzBdKm0KKwkmYWRkCSgiZWF4IiwmRFdQKCRmcmFtZSwiZXNwIikpOwkJIyArPXRwWzBdCisJJm1vdgkoImVheCIsJkRXUCg0LCRpbnApKTsJCQkjIG5wWzFdCisJJmFkYwkoImVkeCIsMCk7CisJJmluYwkoJGopOworCisJJmptcAkoJmxhYmVsKCIybmRtYWRkIikpOworDAwKKyZzZXRfbGFiZWwoIjFzdG1hZGQiLDE2KTsKKwkmbW92CSgkY2FycnksImVkeCIpOworCSZtdWwJKCR3b3JkKTsJCQkJIyBhcFtqXSpicFtpXQorCSZhZGQJKCRjYXJyeSwmRFdQKCRmcmFtZSwiZXNwIiwkaiw0KSk7CSMgKz10cFtqXQorCSZsZWEJKCRqLCZEV1AoMSwkaikpOworCSZhZGMJKCJlZHgiLDApOworCSZhZGQJKCRjYXJyeSwiZWF4Iik7CisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnAsJGosNCkpOwkJIyBhcFtqKzFdCisJJmFkYwkoImVkeCIsMCk7CisJJmNtcAkoJGosJG51bSk7CisJJm1vdgkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkaiw0KSwkY2FycnkpOwkjIHRwW2pdPQorCSZqbAkoJmxhYmVsKCIxc3RtYWRkIikpOworCisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgYXBbbnVtLTFdKmJwW2ldCisJJmFkZAkoImVheCIsJkRXUCgkZnJhbWUsImVzcCIsJG51bSw0KSk7CSMgKz10cFtudW0tMV0KKwkgJm1vdgkoJHdvcmQsJF9uMCk7CisJJmFkYwkoImVkeCIsMCk7CisJICZtb3YJKCRpbnAsJF9ucCk7CisJJmFkZAkoJGNhcnJ5LCJlYXgiKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkgJmltdWwJKCR3b3JkLCZEV1AoJGZyYW1lLCJlc3AiKSk7CQkjIG4wKnRwWzBdCisKKwkmeG9yCSgkaiwkaik7CisJJmFkZAkoImVkeCIsJkRXUCgkZnJhbWUrNCwiZXNwIiwkbnVtLDQpKTsJIyBjYXJyeSs9dHBbbnVtXQorCSZtb3YJKCZEV1AoJGZyYW1lLCJlc3AiLCRudW0sNCksJGNhcnJ5KTsJIyB0cFtudW0tMV09CisJJmFkYwkoJGosMCk7CisJICZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wKSk7CQkJIyBucFswXQorCSZtb3YJKCZEV1AoJGZyYW1lKzQsImVzcCIsJG51bSw0KSwiZWR4Iik7CSMgdHBbbnVtXT0KKwkmbW92CSgmRFdQKCRmcmFtZSs4LCJlc3AiLCRudW0sNCksJGopOwkjIHRwW251bSsxXT0KKworCSZtdWwJKCR3b3JkKTsJCQkJIyBucFswXSptCisJJmFkZAkoImVheCIsJkRXUCgkZnJhbWUsImVzcCIpKTsJCSMgKz10cFswXQorCSZtb3YJKCJlYXgiLCZEV1AoNCwkaW5wKSk7CQkJIyBucFsxXQorCSZhZGMJKCJlZHgiLDApOworCSZtb3YJKCRqLDEpOworDAorJnNldF9sYWJlbCgiMm5kbWFkZCIsMTYpOworCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJm11bAkoJHdvcmQpOwkJCQkjIG5wW2pdKm0KKwkmYWRkCSgkY2FycnksJkRXUCgkZnJhbWUsImVzcCIsJGosNCkpOwkjICs9dHBbal0KKwkmbGVhCSgkaiwmRFdQKDEsJGopKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkmYWRkCSgkY2FycnksImVheCIpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wLCRqLDQpKTsJCSMgbnBbaisxXQorCSZhZGMJKCJlZHgiLDApOworCSZjbXAJKCRqLCRudW0pOworCSZtb3YJKCZEV1AoJGZyYW1lLTgsImVzcCIsJGosNCksJGNhcnJ5KTsJIyB0cFtqLTFdPQorCSZqbAkoJmxhYmVsKCIybmRtYWRkIikpOworCisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgbnBbal0qbQorCSZhZGQJKCRjYXJyeSwmRFdQKCRmcmFtZSwiZXNwIiwkbnVtLDQpKTsJIyArPXRwW251bS0xXQorCSZhZGMJKCJlZHgiLDApOworCSZhZGQJKCRjYXJyeSwiZWF4Iik7CisJJmFkYwkoImVkeCIsMCk7CisJJm1vdgkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkbnVtLDQpLCRjYXJyeSk7CSMgdHBbbnVtLTJdPQorCisJJnhvcgkoImVheCIsImVheCIpOworCSAmbW92CSgkaiwkX2JwKTsJCQkJIyAmYnBbaV0KKwkmYWRkCSgiZWR4IiwmRFdQKCRmcmFtZSs0LCJlc3AiLCRudW0sNCkpOwkjIGNhcnJ5Kz10cFtudW1dCisJJmFkYwkoImVheCIsJkRXUCgkZnJhbWUrOCwiZXNwIiwkbnVtLDQpKTsJIyArPXRwW251bSsxXQorCSAmbGVhCSgkaiwmRFdQKDQsJGopKTsKKwkmbW92CSgmRFdQKCRmcmFtZSwiZXNwIiwkbnVtLDQpLCJlZHgiKTsJIyB0cFtudW0tMV09CisJICZjbXAJKCRqLCRfYnBlbmQpOworCSZtb3YJKCZEV1AoJGZyYW1lKzQsImVzcCIsJG51bSw0KSwiZWF4Iik7CSMgdHBbbnVtXT0KKwkmamUJKCZsYWJlbCgiY29tbW9uX3RhaWwiKSk7CisKKwkmbW92CSgkd29yZCwmRFdQKDAsJGopKTsJCQkjIGJwW2krMV0KKwkmbW92CSgkaW5wLCRfYXApOworCSZtb3YJKCRfYnAsJGopOwkJCQkjICZicFsrK2ldCisJJnhvcgkoJGosJGopOworCSZ4b3IJKCJlZHgiLCJlZHgiKTsKKwkmbW92CSgiZWF4IiwmRFdQKDAsJGlucCkpOworCSZqbXAJKCZsYWJlbCgiMXN0bWFkZCIpKTsKKwwKKyZzZXRfbGFiZWwoImJuX3Nxcl9tb250IiwxNik7Ciskc2JpdD0kbnVtOworCSZtb3YJKCRfbnVtLCRudW0pOworCSZtb3YJKCRfYnAsJGopOwkJCQkjIGk9MAorCisJJm1vdgkoImVheCIsJHdvcmQpOwkJCQkjIGFwWzBdCisJJm11bAkoJHdvcmQpOwkJCQkjIGFwWzBdKmFwWzBdCisJJm1vdgkoJkRXUCgkZnJhbWUsImVzcCIpLCJlYXgiKTsJCSMgdHBbMF09CisJJm1vdgkoJHNiaXQsImVkeCIpOworCSZzaHIJKCJlZHgiLDEpOworCSZhbmQJKCRzYml0LDEpOworCSZpbmMJKCRqKTsKKyZzZXRfbGFiZWwoInNxciIsMTYpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wLCRqLDQpKTsJCSMgYXBbal0KKwkmbW92CSgkY2FycnksImVkeCIpOworCSZtdWwJKCR3b3JkKTsJCQkJIyBhcFtqXSphcFswXQorCSZhZGQJKCJlYXgiLCRjYXJyeSk7CisJJmxlYQkoJGosJkRXUCgxLCRqKSk7CisJJmFkYwkoImVkeCIsMCk7CisJJmxlYQkoJGNhcnJ5LCZEV1AoMCwkc2JpdCwiZWF4IiwyKSk7CisJJnNocgkoImVheCIsMzEpOworCSZjbXAJKCRqLCRfbnVtKTsKKwkmbW92CSgkc2JpdCwiZWF4Iik7CisJJm1vdgkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkaiw0KSwkY2FycnkpOwkjIHRwW2pdPQorCSZqbAkoJmxhYmVsKCJzcXIiKSk7CisKKwkmbW92CSgiZWF4IiwmRFdQKDAsJGlucCwkaiw0KSk7CQkjIGFwW251bS0xXQorCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJm11bAkoJHdvcmQpOwkJCQkjIGFwW251bS0xXSphcFswXQorCSZhZGQJKCJlYXgiLCRjYXJyeSk7CisJICZtb3YJKCR3b3JkLCRfbjApOworCSZhZGMJKCJlZHgiLDApOworCSAmbW92CSgkaW5wLCRfbnApOworCSZsZWEJKCRjYXJyeSwmRFdQKDAsJHNiaXQsImVheCIsMikpOworCSAmaW11bAkoJHdvcmQsJkRXUCgkZnJhbWUsImVzcCIpKTsJCSMgbjAqdHBbMF0KKwkmc2hyCSgiZWF4IiwzMSk7CisJJm1vdgkoJkRXUCgkZnJhbWUsImVzcCIsJGosNCksJGNhcnJ5KTsJIyB0cFtudW0tMV09CisKKwkmbGVhCSgkY2FycnksJkRXUCgwLCJlYXgiLCJlZHgiLDIpKTsKKwkgJm1vdgkoImVheCIsJkRXUCgwLCRpbnApKTsJCQkjIG5wWzBdCisJJnNocgkoImVkeCIsMzEpOworCSZtb3YJKCZEV1AoJGZyYW1lKzQsImVzcCIsJGosNCksJGNhcnJ5KTsJIyB0cFtudW1dPQorCSZtb3YJKCZEV1AoJGZyYW1lKzgsImVzcCIsJGosNCksImVkeCIpOwkjIHRwW251bSsxXT0KKworCSZtdWwJKCR3b3JkKTsJCQkJIyBucFswXSptCisJJmFkZAkoImVheCIsJkRXUCgkZnJhbWUsImVzcCIpKTsJCSMgKz10cFswXQorCSZtb3YJKCRudW0sJGopOworCSZhZGMJKCJlZHgiLDApOworCSZtb3YJKCJlYXgiLCZEV1AoNCwkaW5wKSk7CQkJIyBucFsxXQorCSZtb3YJKCRqLDEpOworDAwKKyZzZXRfbGFiZWwoIjNyZG1hZGQiLDE2KTsKKwkmbW92CSgkY2FycnksImVkeCIpOworCSZtdWwJKCR3b3JkKTsJCQkJIyBucFtqXSptCisJJmFkZAkoJGNhcnJ5LCZEV1AoJGZyYW1lLCJlc3AiLCRqLDQpKTsJIyArPXRwW2pdCisJJmFkYwkoImVkeCIsMCk7CisJJmFkZAkoJGNhcnJ5LCJlYXgiKTsKKwkmbW92CSgiZWF4IiwmRFdQKDQsJGlucCwkaiw0KSk7CQkjIG5wW2orMV0KKwkmYWRjCSgiZWR4IiwwKTsKKwkmbW92CSgmRFdQKCRmcmFtZS00LCJlc3AiLCRqLDQpLCRjYXJyeSk7CSMgdHBbai0xXT0KKworCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJm11bAkoJHdvcmQpOwkJCQkjIG5wW2orMV0qbQorCSZhZGQJKCRjYXJyeSwmRFdQKCRmcmFtZSs0LCJlc3AiLCRqLDQpKTsJIyArPXRwW2orMV0KKwkmbGVhCSgkaiwmRFdQKDIsJGopKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkmYWRkCSgkY2FycnksImVheCIpOworCSZtb3YJKCJlYXgiLCZEV1AoMCwkaW5wLCRqLDQpKTsJCSMgbnBbaisyXQorCSZhZGMJKCJlZHgiLDApOworCSZjbXAJKCRqLCRudW0pOworCSZtb3YJKCZEV1AoJGZyYW1lLTgsImVzcCIsJGosNCksJGNhcnJ5KTsJIyB0cFtqXT0KKwkmamwJKCZsYWJlbCgiM3JkbWFkZCIpKTsKKworCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJm11bAkoJHdvcmQpOwkJCQkjIG5wW2pdKm0KKwkmYWRkCSgkY2FycnksJkRXUCgkZnJhbWUsImVzcCIsJG51bSw0KSk7CSMgKz10cFtudW0tMV0KKwkmYWRjCSgiZWR4IiwwKTsKKwkmYWRkCSgkY2FycnksImVheCIpOworCSZhZGMJKCJlZHgiLDApOworCSZtb3YJKCZEV1AoJGZyYW1lLTQsImVzcCIsJG51bSw0KSwkY2FycnkpOwkjIHRwW251bS0yXT0KKworCSZtb3YJKCRqLCRfYnApOwkJCQkjIGkKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJm1vdgkoJGlucCwkX2FwKTsKKwkmYWRkCSgiZWR4IiwmRFdQKCRmcmFtZSs0LCJlc3AiLCRudW0sNCkpOwkjIGNhcnJ5Kz10cFtudW1dCisJJmFkYwkoImVheCIsJkRXUCgkZnJhbWUrOCwiZXNwIiwkbnVtLDQpKTsJIyArPXRwW251bSsxXQorCSZtb3YJKCZEV1AoJGZyYW1lLCJlc3AiLCRudW0sNCksImVkeCIpOwkjIHRwW251bS0xXT0KKwkmY21wCSgkaiwkbnVtKTsKKwkmbW92CSgmRFdQKCRmcmFtZSs0LCJlc3AiLCRudW0sNCksImVheCIpOwkjIHRwW251bV09CisJJmplCSgmbGFiZWwoImNvbW1vbl90YWlsIikpOworDAorCSZtb3YJKCR3b3JkLCZEV1AoNCwkaW5wLCRqLDQpKTsJCSMgYXBbaV0KKwkmbGVhCSgkaiwmRFdQKDEsJGopKTsKKwkmbW92CSgiZWF4Iiwkd29yZCk7CisJJm1vdgkoJF9icCwkaik7CQkJCSMgKytpCisJJm11bAkoJHdvcmQpOwkJCQkjIGFwW2ldKmFwW2ldCisJJmFkZAkoImVheCIsJkRXUCgkZnJhbWUsImVzcCIsJGosNCkpOwkjICs9dHBbaV0KKwkmYWRjCSgiZWR4IiwwKTsKKwkmbW92CSgmRFdQKCRmcmFtZSwiZXNwIiwkaiw0KSwiZWF4Iik7CSMgdHBbaV09CisJJnhvcgkoJGNhcnJ5LCRjYXJyeSk7CisJJmNtcAkoJGosJG51bSk7CisJJmxlYQkoJGosJkRXUCgxLCRqKSk7CisJJmplCSgmbGFiZWwoInNxcmxhc3QiKSk7CisKKwkmbW92CSgkc2JpdCwiZWR4Iik7CQkJCSMgemFwcyAkbnVtCisJJnNocgkoImVkeCIsMSk7CisJJmFuZAkoJHNiaXQsMSk7Cismc2V0X2xhYmVsKCJzcXJhZGQiLDE2KTsKKwkmbW92CSgiZWF4IiwmRFdQKDAsJGlucCwkaiw0KSk7CQkjIGFwW2pdCisJJm1vdgkoJGNhcnJ5LCJlZHgiKTsKKwkmbXVsCSgkd29yZCk7CQkJCSMgYXBbal0qYXBbaV0KKwkmYWRkCSgiZWF4IiwkY2FycnkpOworCSZsZWEJKCRjYXJyeSwmRFdQKDAsImVheCIsImVheCIpKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkmc2hyCSgiZWF4IiwzMSk7CisJJmFkZAkoJGNhcnJ5LCZEV1AoJGZyYW1lLCJlc3AiLCRqLDQpKTsJIyArPXRwW2pdCisJJmxlYQkoJGosJkRXUCgxLCRqKSk7CisJJmFkYwkoImVheCIsMCk7CisJJmFkZAkoJGNhcnJ5LCRzYml0KTsKKwkmYWRjCSgiZWF4IiwwKTsKKwkmY21wCSgkaiwkX251bSk7CisJJm1vdgkoJkRXUCgkZnJhbWUtNCwiZXNwIiwkaiw0KSwkY2FycnkpOwkjIHRwW2pdPQorCSZtb3YJKCRzYml0LCJlYXgiKTsKKwkmamxlCSgmbGFiZWwoInNxcmFkZCIpKTsKKworCSZtb3YJKCRjYXJyeSwiZWR4Iik7CisJJmxlYQkoImVkeCIsJkRXUCgwLCRzYml0LCJlZHgiLDIpKTsKKwkmc2hyCSgkY2FycnksMzEpOworJnNldF9sYWJlbCgic3FybGFzdCIpOworCSZtb3YJKCR3b3JkLCRfbjApOworCSZtb3YJKCRpbnAsJF9ucCk7CisJJmltdWwJKCR3b3JkLCZEV1AoJGZyYW1lLCJlc3AiKSk7CQkjIG4wKnRwWzBdCisKKwkmYWRkCSgiZWR4IiwmRFdQKCRmcmFtZSwiZXNwIiwkaiw0KSk7CSMgKz10cFtudW1dCisJJm1vdgkoImVheCIsJkRXUCgwLCRpbnApKTsJCQkjIG5wWzBdCisJJmFkYwkoJGNhcnJ5LDApOworCSZtb3YJKCZEV1AoJGZyYW1lLCJlc3AiLCRqLDQpLCJlZHgiKTsJIyB0cFtudW1dPQorCSZtb3YJKCZEV1AoJGZyYW1lKzQsImVzcCIsJGosNCksJGNhcnJ5KTsJIyB0cFtudW0rMV09CisKKwkmbXVsCSgkd29yZCk7CQkJCSMgbnBbMF0qbQorCSZhZGQJKCJlYXgiLCZEV1AoJGZyYW1lLCJlc3AiKSk7CQkjICs9dHBbMF0KKwkmbGVhCSgkbnVtLCZEV1AoLTEsJGopKTsKKwkmYWRjCSgiZWR4IiwwKTsKKwkmbW92CSgkaiwxKTsKKwkmbW92CSgiZWF4IiwmRFdQKDQsJGlucCkpOwkJCSMgbnBbMV0KKworCSZqbXAJKCZsYWJlbCgiM3JkbWFkZCIpKTsKK30KKwwKKyZzZXRfbGFiZWwoImNvbW1vbl90YWlsIiwxNik7CisJJm1vdgkoJG5wLCRfbnApOwkJCSMgbG9hZCBtb2R1bHVzIHBvaW50ZXIKKwkmbW92CSgkcnAsJF9ycCk7CQkJIyBsb2FkIHJlc3VsdCBwb2ludGVyCisJJmxlYQkoJHRwLCZEV1AoJGZyYW1lLCJlc3AiKSk7CSMgWyRhcCBhbmQgJGJwIGFyZSB6YXBwZWRdCisKKwkmbW92CSgiZWF4IiwmRFdQKDAsJHRwKSk7CQkjIHRwWzBdCisJJm1vdgkoJGosJG51bSk7CQkJIyBqPW51bS0xCisJJnhvcgkoJGksJGkpOwkJCSMgaT0wIGFuZCBjbGVhciBDRiEKKworJnNldF9sYWJlbCgic3ViIiwxNik7CisJJnNiYgkoImVheCIsJkRXUCgwLCRucCwkaSw0KSk7CisJJm1vdgkoJkRXUCgwLCRycCwkaSw0KSwiZWF4Iik7CSMgcnBbaV09dHBbaV0tbnBbaV0KKwkmZGVjCSgkaik7CQkJCSMgZG9lc24ndCBhZmZlY3QgQ0YhCisJJm1vdgkoImVheCIsJkRXUCg0LCR0cCwkaSw0KSk7CSMgdHBbaSsxXQorCSZsZWEJKCRpLCZEV1AoMSwkaSkpOwkJIyBpKysKKwkmamdlCSgmbGFiZWwoInN1YiIpKTsKKworCSZzYmIJKCJlYXgiLDApOwkJCSMgaGFuZGxlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKwkmYW5kCSgkdHAsImVheCIpOworCSZub3QJKCJlYXgiKTsKKwkmbW92CSgkbnAsJHJwKTsKKwkmYW5kCSgkbnAsImVheCIpOworCSZvcgkoJHRwLCRucCk7CQkJIyB0cD1jYXJyeT90cDpycAorCismc2V0X2xhYmVsKCJjb3B5IiwxNik7CQkJCSMgY29weSBvciBpbi1wbGFjZSByZWZyZXNoCisJJm1vdgkoImVheCIsJkRXUCgwLCR0cCwkbnVtLDQpKTsKKwkmbW92CSgmRFdQKDAsJHJwLCRudW0sNCksImVheCIpOwkjIHJwW2ldPXRwW2ldCisJJm1vdgkoJkRXUCgkZnJhbWUsImVzcCIsJG51bSw0KSwkaik7CSMgemFwIHRlbXBvcmFyeSB2ZWN0b3IKKwkmZGVjCSgkbnVtKTsKKwkmamdlCSgmbGFiZWwoImNvcHkiKSk7CisKKwkmbW92CSgiZXNwIiwkX3NwKTsJCSMgcHVsbCBzYXZlZCBzdGFjayBwb2ludGVyCisJJm1vdgkoImVheCIsMSk7Cismc2V0X2xhYmVsKCJqdXN0X2xlYXZlIik7CismZnVuY3Rpb25fZW5kKCJibl9tdWxfbW9udCIpOworCismYXNjaXooIk1vbnRnb21lcnkgTXVsdGlwbGljYXRpb24gZm9yIHg4NiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIpOworCismYXNtX2ZpbmlzaCgpOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM0ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYucGwKQEAgLTAsMCArMSwyOCBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisKK3B1c2goQElOQywicGVybGFzbSIsIi4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKK3JlcXVpcmUoIng4Ni9tdWxfYWRkLnBsIik7CityZXF1aXJlKCJ4ODYvbXVsLnBsIik7CityZXF1aXJlKCJ4ODYvc3FyLnBsIik7CityZXF1aXJlKCJ4ODYvZGl2LnBsIik7CityZXF1aXJlKCJ4ODYvYWRkLnBsIik7CityZXF1aXJlKCJ4ODYvc3ViLnBsIik7CityZXF1aXJlKCJ4ODYvY29tYmEucGwiKTsKKworJmFzbV9pbml0KCRBUkdWWzBdLCQwKTsKKworJmJuX211bF9hZGRfd29yZHMoImJuX211bF9hZGRfd29yZHMiKTsKKyZibl9tdWxfd29yZHMoImJuX211bF93b3JkcyIpOworJmJuX3Nxcl93b3JkcygiYm5fc3FyX3dvcmRzIik7CismYm5fZGl2X3dvcmRzKCJibl9kaXZfd29yZHMiKTsKKyZibl9hZGRfd29yZHMoImJuX2FkZF93b3JkcyIpOworJmJuX3N1Yl93b3JkcygiYm5fc3ViX3dvcmRzIik7CismYm5fbXVsX2NvbWJhKCJibl9tdWxfY29tYmE4Iiw4KTsKKyZibl9tdWxfY29tYmEoImJuX211bF9jb21iYTQiLDQpOworJmJuX3Nxcl9jb21iYSgiYm5fc3FyX2NvbWJhOCIsOCk7CismYm5fc3FyX2NvbWJhKCJibl9zcXJfY29tYmE0Iiw0KTsKKworJmFzbV9maW5pc2goKTsKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYvYWRkLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYvYWRkLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNWNmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni9hZGQucGwKQEAgLTAsMCArMSw3NiBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisjIHg4NiBhc3NlbWJlcgorCitzdWIgYm5fYWRkX3dvcmRzCisJeworCWxvY2FsKCRuYW1lKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbigkbmFtZSwiIik7CisKKwkmY29tbWVudCgiIik7CisJJGE9ImVzaSI7CisJJGI9ImVkaSI7CisJJGM9ImVheCI7CisJJHI9ImVieCI7CisJJHRtcDE9ImVjeCI7CisJJHRtcDI9ImVkeCI7CisJJG51bT0iZWJwIjsKKworCSZtb3YoJHIsJndwYXJhbSgwKSk7CSMgZ2V0IHIKKwkgJm1vdigkYSwmd3BhcmFtKDEpKTsJIyBnZXQgYQorCSZtb3YoJGIsJndwYXJhbSgyKSk7CSMgZ2V0IGIKKwkgJm1vdigkbnVtLCZ3cGFyYW0oMykpOwkjIGdldCBudW0KKwkmeG9yKCRjLCRjKTsJCSMgY2xlYXIgY2FycnkKKwkgJmFuZCgkbnVtLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKworCSZqeigmbGFiZWwoImF3X2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoImF3X2xvb3AiLDApOworCWZvciAoJGk9MDsgJGk8ODsgJGkrKykKKwkJeworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKworCQkmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7IAkjICphCisJCSAmbW92KCR0bXAyLCZEV1AoJGkqNCwkYiwiIiwwKSk7IAkjICpiCisJCSZhZGQoJHRtcDEsJGMpOworCQkgJm1vdigkYywwKTsKKwkJJmFkYygkYywkYyk7CisJCSAmYWRkKCR0bXAxLCR0bXAyKTsKKwkJJmFkYygkYywwKTsKKwkJICZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsgCSMgKnIKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGEsMzIpOworCSAmYWRkKCRiLDMyKTsKKwkmYWRkKCRyLDMyKTsKKwkgJnN1YigkbnVtLDgpOworCSZqbnooJmxhYmVsKCJhd19sb29wIikpOworCisJJnNldF9sYWJlbCgiYXdfZmluaXNoIiwwKTsKKwkmbW92KCRudW0sJndwYXJhbSgzKSk7CSMgZ2V0IG51bQorCSZhbmQoJG51bSw3KTsKKwkgJmp6KCZsYWJlbCgiYXdfZW5kIikpOworCisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJUYWlsIFJvdW5kICRpIik7CisJCSZtb3YoJHRtcDEsJkRXUCgkaSo0LCRhLCIiLDApKTsJIyAqYQorCQkgJm1vdigkdG1wMiwmRFdQKCRpKjQsJGIsIiIsMCkpOyMgKmIKKwkJJmFkZCgkdG1wMSwkYyk7CisJCSAmbW92KCRjLDApOworCQkmYWRjKCRjLCRjKTsKKwkJICZhZGQoJHRtcDEsJHRtcDIpOworCQkmYWRjKCRjLDApOworCQkgJmRlYygkbnVtKSBpZiAoJGkgIT0gNik7CisJCSZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsJIyAqYQorCQkgJmp6KCZsYWJlbCgiYXdfZW5kIikpIGlmICgkaSAhPSA2KTsKKwkJfQorCSZzZXRfbGFiZWwoImF3X2VuZCIsMCk7CisKKyMJJm1vdigiZWF4IiwkYyk7CQkjICRjIGlzICJlYXgiCisKKwkmZnVuY3Rpb25fZW5kKCRuYW1lKTsKKwl9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni9jb21iYS5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L2NvbWJhLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTEyNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni9jb21iYS5wbApAQCAtMCwwICsxLDI3NyBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisjIHg4NiBhc3NlbWJlcgorCitzdWIgbXVsX2FkZF9jCisJeworCWxvY2FsKCRhLCRhaSwkYiwkYmksJGMwLCRjMSwkYzIsJHBvcywkaSwkbmEsJG5iKT1AXzsKKworCSMgcG9zID09IC0xIGlmIGVheCBhbmQgZWR4IGFyZSBwcmUtbG9hZGVkLCAwIHRvIGxvYWQgZnJvbSBuZXh0CisJIyB3b3JkcywgYW5kIDEgaWYgbG9hZCByZXR1cm4gdmFsdWUKKworCSZjb21tZW50KCJtdWwgYVskYWldKmJbJGJpXSIpOworCisJIyAiZWF4IiBhbmQgImVkeCIgd2lsbCBhbHdheXMgYmUgcHJlLWxvYWRlZC4KKwkjICZtb3YoImVheCIsJkRXUCgkYWkqNCwkYSwiIiwwKSkgOworCSMgJm1vdigiZWR4IiwmRFdQKCRiaSo0LCRiLCIiLDApKTsKKworCSZtdWwoImVkeCIpOworCSZhZGQoJGMwLCJlYXgiKTsKKwkgJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMDsJIyBsYW9kIG5leHQgYQorCSAmbW92KCJlYXgiLCZ3cGFyYW0oMCkpIGlmICRwb3MgPiAwOwkJCSMgbG9hZCByW10KKwkgIyMjCisJJmFkYygkYzEsImVkeCIpOworCSAmbW92KCJlZHgiLCZEV1AoKCRuYikqNCwkYiwiIiwwKSkgaWYgJHBvcyA9PSAwOwkjIGxhb2QgbmV4dCBiCisJICZtb3YoImVkeCIsJkRXUCgoJG5iKSo0LCRiLCIiLDApKSBpZiAkcG9zID09IDE7CSMgbGFvZCBuZXh0IGIKKwkgIyMjCisJJmFkYygkYzIsMCk7CisJICMgaXMgcG9zID4gMSwgaXQgbWVhbnMgaXQgaXMgdGhlIGxhc3QgbG9vcCAKKwkgJm1vdigmRFdQKCRpKjQsImVheCIsIiIsMCksJGMwKSBpZiAkcG9zID4gMDsJCSMgc2F2ZSByW107CisJJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMTsJCSMgbGFvZCBuZXh0IGEKKwl9CisKK3N1YiBzcXJfYWRkX2MKKwl7CisJbG9jYWwoJHIsJGEsJGFpLCRiaSwkYzAsJGMxLCRjMiwkcG9zLCRpLCRuYSwkbmIpPUBfOworCisJIyBwb3MgPT0gLTEgaWYgZWF4IGFuZCBlZHggYXJlIHByZS1sb2FkZWQsIDAgdG8gbG9hZCBmcm9tIG5leHQKKwkjIHdvcmRzLCBhbmQgMSBpZiBsb2FkIHJldHVybiB2YWx1ZQorCisJJmNvbW1lbnQoInNxciBhWyRhaV0qYVskYmldIik7CisKKwkjICJlYXgiIGFuZCAiZWR4IiB3aWxsIGFsd2F5cyBiZSBwcmUtbG9hZGVkLgorCSMgJm1vdigiZWF4IiwmRFdQKCRhaSo0LCRhLCIiLDApKSA7CisJIyAmbW92KCJlZHgiLCZEV1AoJGJpKjQsJGIsIiIsMCkpOworCisJaWYgKCRhaSA9PSAkYmkpCisJCXsgJm11bCgiZWF4Iik7fQorCWVsc2UKKwkJeyAmbXVsKCJlZHgiKTt9CisJJmFkZCgkYzAsImVheCIpOworCSAmbW92KCJlYXgiLCZEV1AoKCRuYSkqNCwkYSwiIiwwKSkgaWYgJHBvcyA9PSAwOwkjIGxvYWQgbmV4dCBhCisJICMjIworCSZhZGMoJGMxLCJlZHgiKTsKKwkgJm1vdigiZWR4IiwmRFdQKCgkbmIpKjQsJGEsIiIsMCkpIGlmICgkcG9zID09IDEpICYmICgkbmEgIT0gJG5iKTsKKwkgIyMjCisJJmFkYygkYzIsMCk7CisJICMgaXMgcG9zID4gMSwgaXQgbWVhbnMgaXQgaXMgdGhlIGxhc3QgbG9vcCAKKwkgJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJGMwKSBpZiAkcG9zID4gMDsJCSMgc2F2ZSByW107CisJJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMTsJCSMgbG9hZCBuZXh0IGIKKwl9CisKK3N1YiBzcXJfYWRkX2MyCisJeworCWxvY2FsKCRyLCRhLCRhaSwkYmksJGMwLCRjMSwkYzIsJHBvcywkaSwkbmEsJG5iKT1AXzsKKworCSMgcG9zID09IC0xIGlmIGVheCBhbmQgZWR4IGFyZSBwcmUtbG9hZGVkLCAwIHRvIGxvYWQgZnJvbSBuZXh0CisJIyB3b3JkcywgYW5kIDEgaWYgbG9hZCByZXR1cm4gdmFsdWUKKworCSZjb21tZW50KCJzcXIgYVskYWldKmFbJGJpXSIpOworCisJIyAiZWF4IiBhbmQgImVkeCIgd2lsbCBhbHdheXMgYmUgcHJlLWxvYWRlZC4KKwkjICZtb3YoImVheCIsJkRXUCgkYWkqNCwkYSwiIiwwKSkgOworCSMgJm1vdigiZWR4IiwmRFdQKCRiaSo0LCRhLCIiLDApKTsKKworCWlmICgkYWkgPT0gJGJpKQorCQl7ICZtdWwoImVheCIpO30KKwllbHNlCisJCXsgJm11bCgiZWR4Iik7fQorCSZhZGQoImVheCIsImVheCIpOworCSAjIyMKKwkmYWRjKCJlZHgiLCJlZHgiKTsKKwkgIyMjCisJJmFkYygkYzIsMCk7CisJICZhZGQoJGMwLCJlYXgiKTsKKwkmYWRjKCRjMSwiZWR4Iik7CisJICZtb3YoImVheCIsJkRXUCgoJG5hKSo0LCRhLCIiLDApKSBpZiAkcG9zID09IDA7CSMgbG9hZCBuZXh0IGEKKwkgJm1vdigiZWF4IiwmRFdQKCgkbmEpKjQsJGEsIiIsMCkpIGlmICRwb3MgPT0gMTsJIyBsb2FkIG5leHQgYgorCSZhZGMoJGMyLDApOworCSZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCRjMCkgaWYgJHBvcyA+IDA7CQkjIHNhdmUgcltdOworCSAmbW92KCJlZHgiLCZEV1AoKCRuYikqNCwkYSwiIiwwKSkgaWYgKCRwb3MgPD0gMSkgJiYgKCRuYSAhPSAkbmIpOworCSAjIyMKKwl9CisKK3N1YiBibl9tdWxfY29tYmEKKwl7CisJbG9jYWwoJG5hbWUsJG51bSk9QF87CisJbG9jYWwoJGEsJGIsJGMwLCRjMSwkYzIpOworCWxvY2FsKCRpLCRhcywkYWUsJGJzLCRiZSwkYWksJGJpKTsKKwlsb2NhbCgkdG90LCRlbmQpOworCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsIiIpOworCisJJGMwPSJlYngiOworCSRjMT0iZWN4IjsKKwkkYzI9ImVicCI7CisJJGE9ImVzaSI7CisJJGI9ImVkaSI7CisJCisJJGFzPTA7CisJJGFlPTA7CisJJGJzPTA7CisJJGJlPTA7CisJJHRvdD0kbnVtKyRudW0tMTsKKworCSZwdXNoKCJlc2kiKTsKKwkgJm1vdigkYSwmd3BhcmFtKDEpKTsKKwkmcHVzaCgiZWRpIik7CisJICZtb3YoJGIsJndwYXJhbSgyKSk7CisJJnB1c2goImVicCIpOworCSAmcHVzaCgiZWJ4Iik7CisKKwkmeG9yKCRjMCwkYzApOworCSAmbW92KCJlYXgiLCZEV1AoMCwkYSwiIiwwKSk7CSMgbG9hZCB0aGUgZmlyc3Qgd29yZCAKKwkmeG9yKCRjMSwkYzEpOworCSAmbW92KCJlZHgiLCZEV1AoMCwkYiwiIiwwKSk7CSMgbG9hZCB0aGUgZmlyc3Qgc2Vjb25kIAorCisJZm9yICgkaT0wOyAkaTwkdG90OyAkaSsrKQorCQl7CisJCSRhaT0kYXM7CisJCSRiaT0kYnM7CisJCSRlbmQ9JGJlKzE7CisKKwkJJmNvbW1lbnQoIiMjIyMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAkaSIpOyAKKworCQlmb3IgKCRqPSRiczsgJGo8JGVuZDsgJGorKykKKwkJCXsKKwkJCSZ4b3IoJGMyLCRjMikgaWYgKCRqID09ICRicyk7CisJCQlpZiAoKCRqKzEpID09ICRlbmQpCisJCQkJeworCQkJCSR2PTE7CisJCQkJJHY9MiBpZiAoKCRpKzEpID09ICR0b3QpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7ICR2PTA7IH0KKwkJCWlmICgoJGorMSkgIT0gJGVuZCkKKwkJCQl7CisJCQkJJG5hPSgkYWktMSk7CisJCQkJJG5iPSgkYmkrMSk7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkkbmE9JGFzKygkaSA8ICgkbnVtLTEpKTsKKwkJCQkkbmI9JGJzKygkaSA+PSAoJG51bS0xKSk7CisJCQkJfQorI3ByaW50ZiBTVERFUlIgIlskYWksJGJpXSAtPiBbJG5hLCRuYl1cbiI7CisJCQkmbXVsX2FkZF9jKCRhLCRhaSwkYiwkYmksJGMwLCRjMSwkYzIsJHYsJGksJG5hLCRuYik7CisJCQlpZiAoJHYpCisJCQkJeworCQkJCSZjb21tZW50KCJzYXZlZCByWyRpXSIpOworCQkJCSMgJm1vdigiZWF4Iiwmd3BhcmFtKDApKTsKKwkJCQkjICZtb3YoJkRXUCgkaSo0LCJlYXgiLCIiLDApLCRjMCk7CisJCQkJKCRjMCwkYzEsJGMyKT0oJGMxLCRjMiwkYzApOworCQkJCX0KKwkJCSRhaS0tOworCQkJJGJpKys7CisJCQl9CisJCSRhcysrIGlmICgkaSA8ICgkbnVtLTEpKTsKKwkJJGFlKysgaWYgKCRpID49ICgkbnVtLTEpKTsKKworCQkkYnMrKyBpZiAoJGkgPj0gKCRudW0tMSkpOworCQkkYmUrKyBpZiAoJGkgPCAoJG51bS0xKSk7CisJCX0KKwkmY29tbWVudCgic2F2ZSByWyRpXSIpOworCSMgJm1vdigiZWF4Iiwmd3BhcmFtKDApKTsKKwkmbW92KCZEV1AoJGkqNCwiZWF4IiwiIiwwKSwkYzApOworCisJJnBvcCgiZWJ4Iik7CisJJnBvcCgiZWJwIik7CisJJnBvcCgiZWRpIik7CisJJnBvcCgiZXNpIik7CisJJnJldCgpOworCSZmdW5jdGlvbl9lbmRfQigkbmFtZSk7CisJfQorCitzdWIgYm5fc3FyX2NvbWJhCisJeworCWxvY2FsKCRuYW1lLCRudW0pPUBfOworCWxvY2FsKCRyLCRhLCRjMCwkYzEsJGMyKT1AXzsKKwlsb2NhbCgkaSwkYXMsJGFlLCRicywkYmUsJGFpLCRiaSk7CisJbG9jYWwoJGIsJHRvdCwkZW5kLCRoYWxmKTsKKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCIiKTsKKworCSRjMD0iZWJ4IjsKKwkkYzE9ImVjeCI7CisJJGMyPSJlYnAiOworCSRhPSJlc2kiOworCSRyPSJlZGkiOworCisJJnB1c2goImVzaSIpOworCSAmcHVzaCgiZWRpIik7CisJJnB1c2goImVicCIpOworCSAmcHVzaCgiZWJ4Iik7CisJJm1vdigkciwmd3BhcmFtKDApKTsKKwkgJm1vdigkYSwmd3BhcmFtKDEpKTsKKwkmeG9yKCRjMCwkYzApOworCSAmeG9yKCRjMSwkYzEpOworCSZtb3YoImVheCIsJkRXUCgwLCRhLCIiLDApKTsgIyBsb2FkIHRoZSBmaXJzdCB3b3JkCisKKwkkYXM9MDsKKwkkYWU9MDsKKwkkYnM9MDsKKwkkYmU9MDsKKwkkdG90PSRudW0rJG51bS0xOworCisJZm9yICgkaT0wOyAkaTwkdG90OyAkaSsrKQorCQl7CisJCSRhaT0kYXM7CisJCSRiaT0kYnM7CisJCSRlbmQ9JGJlKzE7CisKKwkJJmNvbW1lbnQoIiMjIyMjIyMjIyMjIyMjIyBDYWxjdWxhdGUgd29yZCAkaSIpOworCQlmb3IgKCRqPSRiczsgJGo8JGVuZDsgJGorKykKKwkJCXsKKwkJCSZ4b3IoJGMyLCRjMikgaWYgKCRqID09ICRicyk7CisJCQlpZiAoKCRhaS0xKSA8ICgkYmkrMSkpCisJCQkJeworCQkJCSR2PTE7CisJCQkJJHY9MiBpZiAoJGkrMSkgPT0gJHRvdDsKKwkJCQl9CisJCQllbHNlCisJCQkJeyAkdj0wOyB9CisJCQlpZiAoISR2KQorCQkJCXsKKwkJCQkkbmE9JGFpLTE7CisJCQkJJG5iPSRiaSsxOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJJG5hPSRhcysoJGkgPCAoJG51bS0xKSk7CisJCQkJJG5iPSRicysoJGkgPj0gKCRudW0tMSkpOworCQkJCX0KKwkJCWlmICgkYWkgPT0gJGJpKQorCQkJCXsKKwkJCQkmc3FyX2FkZF9jKCRyLCRhLCRhaSwkYmksCisJCQkJCSRjMCwkYzEsJGMyLCR2LCRpLCRuYSwkbmIpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJJnNxcl9hZGRfYzIoJHIsJGEsJGFpLCRiaSwKKwkJCQkJJGMwLCRjMSwkYzIsJHYsJGksJG5hLCRuYik7CisJCQkJfQorCQkJaWYgKCR2KQorCQkJCXsKKwkJCQkmY29tbWVudCgic2F2ZWQgclskaV0iKTsKKwkJCQkjJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJGMwKTsKKwkJCQkoJGMwLCRjMSwkYzIpPSgkYzEsJGMyLCRjMCk7CisJCQkJbGFzdDsKKwkJCQl9CisJCQkkYWktLTsKKwkJCSRiaSsrOworCQkJfQorCQkkYXMrKyBpZiAoJGkgPCAoJG51bS0xKSk7CisJCSRhZSsrIGlmICgkaSA+PSAoJG51bS0xKSk7CisKKwkJJGJzKysgaWYgKCRpID49ICgkbnVtLTEpKTsKKwkJJGJlKysgaWYgKCRpIDwgKCRudW0tMSkpOworCQl9CisJJm1vdigmRFdQKCRpKjQsJHIsIiIsMCksJGMwKTsKKwkmcG9wKCJlYngiKTsKKwkmcG9wKCJlYnAiKTsKKwkmcG9wKCJlZGkiKTsKKwkmcG9wKCJlc2kiKTsKKwkmcmV0KCk7CisJJmZ1bmN0aW9uX2VuZF9CKCRuYW1lKTsKKwl9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni9kaXYucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni9kaXYucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MDE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L2Rpdi5wbApAQCAtMCwwICsxLDE1IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMgeDg2IGFzc2VtYmVyCisKK3N1YiBibl9kaXZfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luKCRuYW1lLCIiKTsKKwkmbW92KCJlZHgiLCZ3cGFyYW0oMCkpOwkjCisJJm1vdigiZWF4Iiwmd3BhcmFtKDEpKTsJIworCSZtb3YoImVieCIsJndwYXJhbSgyKSk7CSMKKwkmZGl2KCJlYngiKTsKKwkmZnVuY3Rpb25fZW5kKCRuYW1lKTsKKwl9CisxOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYvZiBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlNDExMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L2YKQEAgLTAsMCArMSwzIEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMgeDg2IGFzc2VtYmVyCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L211bC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L211bC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzRjYjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYvbXVsLnBsCkBAIC0wLDAgKzEsNzcgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorIyB4ODYgYXNzZW1iZXIKKworc3ViIGJuX211bF93b3JkcworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW4oJG5hbWUsIiIpOworCisJJmNvbW1lbnQoIiIpOworCSRMb3c9ImVheCI7CisJJEhpZ2g9ImVkeCI7CisJJGE9ImVieCI7CisJJHc9ImVjeCI7CisJJHI9ImVkaSI7CisJJGM9ImVzaSI7CisJJG51bT0iZWJwIjsKKworCSZ4b3IoJGMsJGMpOwkJIyBjbGVhciBjYXJyeQorCSZtb3YoJHIsJndwYXJhbSgwKSk7CSMKKwkmbW92KCRhLCZ3cGFyYW0oMSkpOwkjCisJJm1vdigkbnVtLCZ3cGFyYW0oMikpOwkjCisJJm1vdigkdywmd3BhcmFtKDMpKTsJIworCisJJmFuZCgkbnVtLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKwkmanooJmxhYmVsKCJtd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJtd19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDMyOyAkaSs9NCkKKwkJeworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKworCQkgJm1vdigiZWF4IiwmRFdQKCRpLCRhLCIiLDApKTsgCSMgKmEKKwkJJm11bCgkdyk7CQkJIyAqYSAqIHcKKwkJJmFkZCgiZWF4IiwkYyk7CQkJIyBMKHQpKz1jCisJCSAjIFhYWAorCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJm1vdigmRFdQKCRpLCRyLCIiLDApLCJlYXgiKTsJIyAqcj0gTCh0KTsKKworCQkmbW92KCRjLCJlZHgiKTsJCQkjIGM9ICBIKHQpOworCQl9CisKKwkmY29tbWVudCgiIik7CisJJmFkZCgkYSwzMik7CisJJmFkZCgkciwzMik7CisJJnN1YigkbnVtLDgpOworCSZqeigmbGFiZWwoIm13X2ZpbmlzaCIpKTsKKwkmam1wKCZsYWJlbCgibXdfbG9vcCIpKTsKKworCSZzZXRfbGFiZWwoIm13X2ZpbmlzaCIsMCk7CisJJm1vdigkbnVtLCZ3cGFyYW0oMikpOwkjIGdldCBudW0KKwkmYW5kKCRudW0sNyk7CisJJmpueigmbGFiZWwoIm13X2ZpbmlzaDIiKSk7CisJJmptcCgmbGFiZWwoIm13X2VuZCIpKTsKKworCSZzZXRfbGFiZWwoIm13X2ZpbmlzaDIiLDEpOworCWZvciAoJGk9MDsgJGk8NzsgJGkrKykKKwkJeworCQkmY29tbWVudCgiVGFpbCBSb3VuZCAkaSIpOworCQkgJm1vdigiZWF4IiwmRFdQKCRpKjQsJGEsIiIsMCkpOyMgKmEKKwkJJm11bCgkdyk7CQkJIyAqYSAqIHcKKwkJJmFkZCgiZWF4IiwkYyk7CQkJIyBMKHQpKz1jCisJCSAjIFhYWAorCQkmYWRjKCJlZHgiLDApOwkJCSMgSCh0KSs9Y2FycnkKKwkJICZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCJlYXgiKTsjICpyPSBMKHQpOworCQkmbW92KCRjLCJlZHgiKTsJCQkjIGM9ICBIKHQpOworCQkgJmRlYygkbnVtKSBpZiAoJGkgIT0gNy0xKTsKKwkJJmp6KCZsYWJlbCgibXdfZW5kIikpIGlmICgkaSAhPSA3LTEpOworCQl9CisJJnNldF9sYWJlbCgibXdfZW5kIiwwKTsKKwkmbW92KCJlYXgiLCRjKTsKKworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L211bF9hZGQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni9tdWxfYWRkLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODMwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni9tdWxfYWRkLnBsCkBAIC0wLDAgKzEsODcgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorIyB4ODYgYXNzZW1iZXIKKworc3ViIGJuX211bF9hZGRfd29yZHMKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luKCRuYW1lLCIiKTsKKworCSZjb21tZW50KCIiKTsKKwkkTG93PSJlYXgiOworCSRIaWdoPSJlZHgiOworCSRhPSJlYngiOworCSR3PSJlYnAiOworCSRyPSJlZGkiOworCSRjPSJlc2kiOworCisJJnhvcigkYywkYyk7CQkjIGNsZWFyIGNhcnJ5CisJJm1vdigkciwmd3BhcmFtKDApKTsJIworCisJJm1vdigiZWN4Iiwmd3BhcmFtKDIpKTsJIworCSZtb3YoJGEsJndwYXJhbSgxKSk7CSMKKworCSZhbmQoImVjeCIsMHhmZmZmZmZmOCk7CSMgbnVtIC8gOAorCSZtb3YoJHcsJndwYXJhbSgzKSk7CSMKKworCSZwdXNoKCJlY3giKTsJCSMgVXAgdGhlIHN0YWNrIGZvciBhIHRtcCB2YXJpYWJsZQorCisJJmp6KCZsYWJlbCgibWF3X2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoIm1hd19sb29wIiwwKTsKKworCSZtb3YoJnN3dG1wKDApLCJlY3giKTsJIworCisJZm9yICgkaT0wOyAkaTwzMjsgJGkrPTQpCisJCXsKKwkJJmNvbW1lbnQoIlJvdW5kICRpIik7CisKKwkJICZtb3YoImVheCIsJkRXUCgkaSwkYSwiIiwwKSk7IAkjICphCisJCSZtdWwoJHcpOwkJCSMgKmEgKiB3CisJCSZhZGQoImVheCIsJGMpOwkJIyBMKHQpKz0gKnIKKwkJICZtb3YoJGMsJkRXUCgkaSwkciwiIiwwKSk7CSMgTCh0KSs9ICpyCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJmFkZCgiZWF4IiwkYyk7CQkjIEwodCkrPWMKKwkJJmFkYygiZWR4IiwwKTsJCQkjIEgodCkrPWNhcnJ5CisJCSAmbW92KCZEV1AoJGksJHIsIiIsMCksImVheCIpOwkjICpyPSBMKHQpOworCQkmbW92KCRjLCJlZHgiKTsJCQkjIGM9ICBIKHQpOworCQl9CisKKwkmY29tbWVudCgiIik7CisJJm1vdigiZWN4Iiwmc3d0bXAoMCkpOwkjCisJJmFkZCgkYSwzMik7CisJJmFkZCgkciwzMik7CisJJnN1YigiZWN4Iiw4KTsKKwkmam56KCZsYWJlbCgibWF3X2xvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJtYXdfZmluaXNoIiwwKTsKKwkmbW92KCJlY3giLCZ3cGFyYW0oMikpOwkjIGdldCBudW0KKwkmYW5kKCJlY3giLDcpOworCSZqbnooJmxhYmVsKCJtYXdfZmluaXNoMiIpKTsJIyBoZWxwcyBicmFuY2ggcHJlZGljdGlvbgorCSZqbXAoJmxhYmVsKCJtYXdfZW5kIikpOworCisJJnNldF9sYWJlbCgibWF3X2ZpbmlzaDIiLDEpOworCWZvciAoJGk9MDsgJGk8NzsgJGkrKykKKwkJeworCQkmY29tbWVudCgiVGFpbCBSb3VuZCAkaSIpOworCQkgJm1vdigiZWF4IiwmRFdQKCRpKjQsJGEsIiIsMCkpOyMgKmEKKwkJJm11bCgkdyk7CQkJIyAqYSAqIHcKKwkJJmFkZCgiZWF4IiwkYyk7CQkJIyBMKHQpKz1jCisJCSAmbW92KCRjLCZEV1AoJGkqNCwkciwiIiwwKSk7CSMgTCh0KSs9ICpyCisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJmFkZCgiZWF4IiwkYyk7CisJCSZhZGMoImVkeCIsMCk7CQkJIyBIKHQpKz1jYXJyeQorCQkgJmRlYygiZWN4IikgaWYgKCRpICE9IDctMSk7CisJCSZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCJlYXgiKTsJIyAqcj0gTCh0KTsKKwkJICZtb3YoJGMsImVkeCIpOwkJCSMgYz0gIEgodCk7CisJCSZqeigmbGFiZWwoIm1hd19lbmQiKSkgaWYgKCRpICE9IDctMSk7CisJCX0KKwkmc2V0X2xhYmVsKCJtYXdfZW5kIiwwKTsKKwkmbW92KCJlYXgiLCRjKTsKKworCSZwb3AoImVjeCIpOwkjIGNsZWFyIHZhcmlhYmxlIGZyb20KKworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L3Nxci5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2L3Nxci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjkwOTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYvc3FyLnBsCkBAIC0wLDAgKzEsNjAgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorIyB4ODYgYXNzZW1iZXIKKworc3ViIGJuX3Nxcl93b3JkcworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW4oJG5hbWUsIiIpOworCisJJmNvbW1lbnQoIiIpOworCSRyPSJlc2kiOworCSRhPSJlZGkiOworCSRudW09ImVieCI7CisKKwkmbW92KCRyLCZ3cGFyYW0oMCkpOwkjCisJJm1vdigkYSwmd3BhcmFtKDEpKTsJIworCSZtb3YoJG51bSwmd3BhcmFtKDIpKTsJIworCisJJmFuZCgkbnVtLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKwkmanooJmxhYmVsKCJzd19maW5pc2giKSk7CisKKwkmc2V0X2xhYmVsKCJzd19sb29wIiwwKTsKKwlmb3IgKCRpPTA7ICRpPDMyOyAkaSs9NCkKKwkJeworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKwkJJm1vdigiZWF4IiwmRFdQKCRpLCRhLCIiLDApKTsgCSMgKmEKKwkJICMgWFhYCisJCSZtdWwoImVheCIpOwkJCSMgKmEgKiAqYQorCQkmbW92KCZEV1AoJGkqMiwkciwiIiwwKSwiZWF4Iik7CSMKKwkJICZtb3YoJkRXUCgkaSoyKzQsJHIsIiIsMCksImVkeCIpOyMKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGEsMzIpOworCSZhZGQoJHIsNjQpOworCSZzdWIoJG51bSw4KTsKKwkmam56KCZsYWJlbCgic3dfbG9vcCIpKTsKKworCSZzZXRfbGFiZWwoInN3X2ZpbmlzaCIsMCk7CisJJm1vdigkbnVtLCZ3cGFyYW0oMikpOwkjIGdldCBudW0KKwkmYW5kKCRudW0sNyk7CisJJmp6KCZsYWJlbCgic3dfZW5kIikpOworCisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJUYWlsIFJvdW5kICRpIik7CisJCSZtb3YoImVheCIsJkRXUCgkaSo0LCRhLCIiLDApKTsJIyAqYQorCQkgIyBYWFgKKwkJJm11bCgiZWF4Iik7CQkJIyAqYSAqICphCisJCSZtb3YoJkRXUCgkaSo4LCRyLCIiLDApLCJlYXgiKTsJIworCQkgJmRlYygkbnVtKSBpZiAoJGkgIT0gNy0xKTsKKwkJJm1vdigmRFdQKCRpKjgrNCwkciwiIiwwKSwiZWR4Iik7CisJCSAmanooJmxhYmVsKCJzd19lbmQiKSkgaWYgKCRpICE9IDctMSk7CisJCX0KKwkmc2V0X2xhYmVsKCJzd19lbmQiLDApOworCisJJmZ1bmN0aW9uX2VuZCgkbmFtZSk7CisJfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYvc3ViLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODYvc3ViLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzN2IwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Ni9zdWIucGwKQEAgLTAsMCArMSw3NiBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisjIHg4NiBhc3NlbWJlcgorCitzdWIgYm5fc3ViX3dvcmRzCisJeworCWxvY2FsKCRuYW1lKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbigkbmFtZSwiIik7CisKKwkmY29tbWVudCgiIik7CisJJGE9ImVzaSI7CisJJGI9ImVkaSI7CisJJGM9ImVheCI7CisJJHI9ImVieCI7CisJJHRtcDE9ImVjeCI7CisJJHRtcDI9ImVkeCI7CisJJG51bT0iZWJwIjsKKworCSZtb3YoJHIsJndwYXJhbSgwKSk7CSMgZ2V0IHIKKwkgJm1vdigkYSwmd3BhcmFtKDEpKTsJIyBnZXQgYQorCSZtb3YoJGIsJndwYXJhbSgyKSk7CSMgZ2V0IGIKKwkgJm1vdigkbnVtLCZ3cGFyYW0oMykpOwkjIGdldCBudW0KKwkmeG9yKCRjLCRjKTsJCSMgY2xlYXIgY2FycnkKKwkgJmFuZCgkbnVtLDB4ZmZmZmZmZjgpOwkjIG51bSAvIDgKKworCSZqeigmbGFiZWwoImF3X2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoImF3X2xvb3AiLDApOworCWZvciAoJGk9MDsgJGk8ODsgJGkrKykKKwkJeworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKworCQkmbW92KCR0bXAxLCZEV1AoJGkqNCwkYSwiIiwwKSk7IAkjICphCisJCSAmbW92KCR0bXAyLCZEV1AoJGkqNCwkYiwiIiwwKSk7IAkjICpiCisJCSZzdWIoJHRtcDEsJGMpOworCQkgJm1vdigkYywwKTsKKwkJJmFkYygkYywkYyk7CisJCSAmc3ViKCR0bXAxLCR0bXAyKTsKKwkJJmFkYygkYywwKTsKKwkJICZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsgCSMgKnIKKwkJfQorCisJJmNvbW1lbnQoIiIpOworCSZhZGQoJGEsMzIpOworCSAmYWRkKCRiLDMyKTsKKwkmYWRkKCRyLDMyKTsKKwkgJnN1YigkbnVtLDgpOworCSZqbnooJmxhYmVsKCJhd19sb29wIikpOworCisJJnNldF9sYWJlbCgiYXdfZmluaXNoIiwwKTsKKwkmbW92KCRudW0sJndwYXJhbSgzKSk7CSMgZ2V0IG51bQorCSZhbmQoJG51bSw3KTsKKwkgJmp6KCZsYWJlbCgiYXdfZW5kIikpOworCisJZm9yICgkaT0wOyAkaTw3OyAkaSsrKQorCQl7CisJCSZjb21tZW50KCJUYWlsIFJvdW5kICRpIik7CisJCSZtb3YoJHRtcDEsJkRXUCgkaSo0LCRhLCIiLDApKTsJIyAqYQorCQkgJm1vdigkdG1wMiwmRFdQKCRpKjQsJGIsIiIsMCkpOyMgKmIKKwkJJnN1YigkdG1wMSwkYyk7CisJCSAmbW92KCRjLDApOworCQkmYWRjKCRjLCRjKTsKKwkJICZzdWIoJHRtcDEsJHRtcDIpOworCQkmYWRjKCRjLDApOworCQkgJmRlYygkbnVtKSBpZiAoJGkgIT0gNik7CisJCSZtb3YoJkRXUCgkaSo0LCRyLCIiLDApLCR0bXAxKTsJIyAqYQorCQkgJmp6KCZsYWJlbCgiYXdfZW5kIikpIGlmICgkaSAhPSA2KTsKKwkJfQorCSZzZXRfbGFiZWwoImF3X2VuZCIsMCk7CisKKyMJJm1vdigiZWF4IiwkYyk7CQkjICRjIGlzICJlYXgiCisKKwkmZnVuY3Rpb25fZW5kKCRuYW1lKTsKKwl9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Nl82NC1nY2MuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9hc20veDg2XzY0LWdjYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjBiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Nl82NC1nY2MuYwpAQCAtMCwwICsxLDYwNiBAQAorI2luY2x1ZGUgIi4uL2JuX2xjbC5oIgorI2lmICEoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18+PTIpCisjIGluY2x1ZGUgIi4uL2JuX2FzbS5jIgkvKiBraW5kIG9mIGRpcnR5IGhhY2sgZm9yIFN1biBTdHVkaW8gKi8KKyNlbHNlCisvKgorICogeDg2XzY0IEJJR05VTSBhY2NlbGVyYXRvciB2ZXJzaW9uIDAuMSwgRGVjZW1iZXIgMjAwMi4KKyAqCisgKiBJbXBsZW1lbnRlZCBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICoKKyAqIFJpZ2h0cyBmb3IgcmVkaXN0cmlidXRpb24gYW5kIHVzYWdlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZQorICogZ3JhbnRlZCBhY2NvcmRpbmcgdG8gdGhlIE9wZW5TU0wgbGljZW5zZS4gV2FycmFudHkgb2YgYW55IGtpbmQgaXMKKyAqIGRpc2NsYWltZWQuCisgKgorICogUS4gVmVyc2lvbiAwLjE/IEl0IGRvZXNuJ3Qgc291bmQgbGlrZSBBbmR5LCBoZSB1c2VkIHRvIGFzc2lnbiByZWFsCisgKiAgICB2ZXJzaW9ucywgbGlrZSAxLjAuLi4KKyAqIEEuIFdlbGwsIHRoYXQncyBiZWNhdXNlIHRoaXMgY29kZSBpcyBiYXNpY2FsbHkgYSBxdWljay1uLWRpcnR5CisgKiAgICBwcm9vZi1vZi1jb25jZXB0IGhhY2suIEFzIHlvdSBjYW4gc2VlIGl0J3MgaW1wbGVtZW50ZWQgd2l0aAorICogICAgaW5saW5lIGFzc2VtYmxlciwgd2hpY2ggbWVhbnMgdGhhdCB5b3UncmUgYm91bmQgdG8gR0NDIGFuZCB0aGF0CisgKiAgICB0aGVyZSBtaWdodCBiZSBlbm91Z2ggcm9vbSBmb3IgZnVydGhlciBpbXByb3ZlbWVudC4KKyAqCisgKiBRLiBXaHkgaW5saW5lIGFzc2VtYmxlcj8KKyAqIEEuIHg4Nl82NCBmZWF0dXJlcyBvd24gQUJJIHdoaWNoIEknbSBub3QgZmFtaWxpYXIgd2l0aC4gVGhpcyBpcworICogICAgd2h5IEkgZGVjaWRlZCB0byBsZXQgdGhlIGNvbXBpbGVyIHRha2UgY2FyZSBvZiBzdWJyb3V0aW5lCisgKiAgICBwcm9sb2d1ZS9lcGlsb2d1ZSBhcyB3ZWxsIGFzIHJlZ2lzdGVyIGFsbG9jYXRpb24uIEZvciByZWZlcmVuY2UuCisgKiAgICBXaW42NCBpbXBsZW1lbnRzIGRpZmZlcmVudCBBQkkgZm9yIEFNRDY0LCBkaWZmZXJlbnQgZnJvbSBMaW51eC4KKyAqCisgKiBRLiBIb3cgbXVjaCBmYXN0ZXIgZG9lcyBpdCBnZXQ/CisgKiBBLiAnYXBwcy9vcGVuc3NsIHNwZWVkIHJzYSBkc2EnIG91dHB1dCB3aXRoIG5vLWFzbToKKyAqCisgKgkgICAgICAgICAgICAgICAgICBzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3MKKyAqCXJzYSAgNTEyIGJpdHMgICAwLjAwMDZzICAgMC4wMDAxcyAgIDE2ODMuOCAgMTg0NTYuMgorICoJcnNhIDEwMjQgYml0cyAgIDAuMDAyOHMgICAwLjAwMDJzICAgIDM1Ni4wICAgNjQwNy4wCisgKglyc2EgMjA0OCBiaXRzICAgMC4wMTcycyAgIDAuMDAwNXMgICAgIDU4LjAgICAxOTU3LjgKKyAqCXJzYSA0MDk2IGJpdHMgICAwLjExNTVzICAgMC4wMDE4cyAgICAgIDguNyAgICA1NTUuNgorICoJICAgICAgICAgICAgICAgICAgc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zCisgKglkc2EgIDUxMiBiaXRzICAgMC4wMDA1cyAgIDAuMDAwNnMgICAyMTAwLjggICAxNzY4LjMKKyAqCWRzYSAxMDI0IGJpdHMgICAwLjAwMTRzICAgMC4wMDE4cyAgICA2OTIuMyAgICA1NTkuMgorICoJZHNhIDIwNDggYml0cyAgIDAuMDA0OXMgICAwLjAwNjFzICAgIDIwNC43ICAgIDE2NS4wCisgKgorICogICAgJ2FwcHMvb3BlbnNzbCBzcGVlZCByc2EgZHNhJyBvdXRwdXQgd2l0aCB0aGlzIG1vZHVsZToKKyAqCisgKgkgICAgICAgICAgICAgICAgICBzaWduICAgIHZlcmlmeSAgICBzaWduL3MgdmVyaWZ5L3MKKyAqCXJzYSAgNTEyIGJpdHMgICAwLjAwMDRzICAgMC4wMDAwcyAgIDI3NjcuMSAgMzMyOTcuOQorICoJcnNhIDEwMjQgYml0cyAgIDAuMDAxMnMgICAwLjAwMDFzICAgIDg2Ny40ICAxNDY3NC43CisgKglyc2EgMjA0OCBiaXRzICAgMC4wMDYxcyAgIDAuMDAwMnMgICAgMTY0LjAgICA1MjcwLjAKKyAqCXJzYSA0MDk2IGJpdHMgICAwLjAzODRzICAgMC4wMDA2cyAgICAgMjYuMSAgIDE2NTAuOAorICoJICAgICAgICAgICAgICAgICAgc2lnbiAgICB2ZXJpZnkgICAgc2lnbi9zIHZlcmlmeS9zCisgKglkc2EgIDUxMiBiaXRzICAgMC4wMDAycyAgIDAuMDAwM3MgICA0NDQyLjIgICAzNzg2LjMKKyAqCWRzYSAxMDI0IGJpdHMgICAwLjAwMDVzICAgMC4wMDA3cyAgIDE4MzUuMSAgIDE0OTcuNAorICoJZHNhIDIwNDggYml0cyAgIDAuMDAxNnMgICAwLjAwMjBzICAgIDYyMC40ICAgIDUwNC42CisgKgorICogICAgRm9yIHRoZSByZWZlcmVuY2UuIElBLTMyIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcworICogICAgdmVyeSBtdWNoIGxpa2UgNjQtYml0IGNvZGUgY29tcGlsZWQgd2l0aCBuby1hc20gb24gdGhlIHNhbWUKKyAqICAgIG1hY2hpbmUuCisgKi8KKworI2lmZGVmIF9XSU42NAorI2RlZmluZSBCTl9VTE9ORyB1bnNpZ25lZCBsb25nIGxvbmcKKyNlbHNlCisjZGVmaW5lIEJOX1VMT05HIHVuc2lnbmVkIGxvbmcKKyNlbmRpZgorCisjdW5kZWYgbXVsCisjdW5kZWYgbXVsX2FkZAorI3VuZGVmIHNxcgorCisvKgorICogIm0iKGEpLCAiK20iKHIpCWlzIHRoZSB3YXkgdG8gZmF2b3IgRGlyZWN0UGF0aCC1LWNvZGU7CisgKiAiZyIoMCkJCWxldCB0aGUgY29tcGlsZXIgdG8gZGVjaWRlIHdoZXJlIGRvZXMgaXQKKyAqCQkJd2FudCB0byBrZWVwIHRoZSB2YWx1ZSBvZiB6ZXJvOworICovCisjZGVmaW5lIG11bF9hZGQocixhLHdvcmQsY2FycnkpIGRvIHsJXAorCXJlZ2lzdGVyIEJOX1VMT05HIGhpZ2gsbG93OwlcCisJYXNtICgibXVscSAlMyIJCQlcCisJCTogIj1hIihsb3cpLCI9ZCIoaGlnaCkJXAorCQk6ICJhIih3b3JkKSwibSIoYSkJXAorCQk6ICJjYyIpOwkJXAorCWFzbSAoImFkZHEgJTIsJTA7IGFkY3EgJTMsJTEiCVwKKwkJOiAiK3IiKGNhcnJ5KSwiK2QiKGhpZ2gpXAorCQk6ICJhIihsb3cpLCJnIigwKQlcCisJCTogImNjIik7CQlcCisJYXNtICgiYWRkcSAlMiwlMDsgYWRjcSAlMywlMSIJXAorCQk6ICIrbSIociksIitkIihoaWdoKQlcCisJCTogInIiKGNhcnJ5KSwiZyIoMCkJXAorCQk6ICJjYyIpOwkJXAorCWNhcnJ5PWhpZ2g7CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgbXVsKHIsYSx3b3JkLGNhcnJ5KSBkbyB7CVwKKwlyZWdpc3RlciBCTl9VTE9ORyBoaWdoLGxvdzsJXAorCWFzbSAoIm11bHEgJTMiCQkJXAorCQk6ICI9YSIobG93KSwiPWQiKGhpZ2gpCVwKKwkJOiAiYSIod29yZCksImciKGEpCVwKKwkJOiAiY2MiKTsJCVwKKwlhc20gKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIglcCisJCTogIityIihjYXJyeSksIitkIihoaWdoKVwKKwkJOiAiYSIobG93KSwiZyIoMCkJXAorCQk6ICJjYyIpOwkJXAorCShyKT1jYXJyeSwgY2Fycnk9aGlnaDsJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHNxcihyMCxyMSxhKQkJCVwKKwlhc20gKCJtdWxxICUyIgkJCVwKKwkJOiAiPWEiKHIwKSwiPWQiKHIxKQlcCisJCTogImEiKGEpCQlcCisJCTogImNjIik7CisKK0JOX1VMT05HIGJuX211bF9hZGRfd29yZHMoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGludCBudW0sIEJOX1VMT05HIHcpCisJeworCUJOX1VMT05HIGMxPTA7CisKKwlpZiAobnVtIDw9IDApIHJldHVybihjMSk7CisKKwl3aGlsZSAobnVtJn4zKQorCQl7CisJCW11bF9hZGQocnBbMF0sYXBbMF0sdyxjMSk7CisJCW11bF9hZGQocnBbMV0sYXBbMV0sdyxjMSk7CisJCW11bF9hZGQocnBbMl0sYXBbMl0sdyxjMSk7CisJCW11bF9hZGQocnBbM10sYXBbM10sdyxjMSk7CisJCWFwKz00OyBycCs9NDsgbnVtLT00OworCQl9CisJaWYgKG51bSkKKwkJeworCQltdWxfYWRkKHJwWzBdLGFwWzBdLHcsYzEpOyBpZiAoLS1udW09PTApIHJldHVybiBjMTsKKwkJbXVsX2FkZChycFsxXSxhcFsxXSx3LGMxKTsgaWYgKC0tbnVtPT0wKSByZXR1cm4gYzE7CisJCW11bF9hZGQocnBbMl0sYXBbMl0sdyxjMSk7IHJldHVybiBjMTsKKwkJfQorCQorCXJldHVybihjMSk7CisJfSAKKworQk5fVUxPTkcgYm5fbXVsX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBpbnQgbnVtLCBCTl9VTE9ORyB3KQorCXsKKwlCTl9VTE9ORyBjMT0wOworCisJaWYgKG51bSA8PSAwKSByZXR1cm4oYzEpOworCisJd2hpbGUgKG51bSZ+MykKKwkJeworCQltdWwocnBbMF0sYXBbMF0sdyxjMSk7CisJCW11bChycFsxXSxhcFsxXSx3LGMxKTsKKwkJbXVsKHJwWzJdLGFwWzJdLHcsYzEpOworCQltdWwocnBbM10sYXBbM10sdyxjMSk7CisJCWFwKz00OyBycCs9NDsgbnVtLT00OworCQl9CisJaWYgKG51bSkKKwkJeworCQltdWwocnBbMF0sYXBbMF0sdyxjMSk7IGlmICgtLW51bSA9PSAwKSByZXR1cm4gYzE7CisJCW11bChycFsxXSxhcFsxXSx3LGMxKTsgaWYgKC0tbnVtID09IDApIHJldHVybiBjMTsKKwkJbXVsKHJwWzJdLGFwWzJdLHcsYzEpOworCQl9CisJcmV0dXJuKGMxKTsKKwl9IAorCit2b2lkIGJuX3Nxcl93b3JkcyhCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEsIGludCBuKQorICAgICAgICB7CisJaWYgKG4gPD0gMCkgcmV0dXJuOworCisJd2hpbGUgKG4mfjMpCisJCXsKKwkJc3FyKHJbMF0sclsxXSxhWzBdKTsKKwkJc3FyKHJbMl0sclszXSxhWzFdKTsKKwkJc3FyKHJbNF0scls1XSxhWzJdKTsKKwkJc3FyKHJbNl0scls3XSxhWzNdKTsKKwkJYSs9NDsgcis9ODsgbi09NDsKKwkJfQorCWlmIChuKQorCQl7CisJCXNxcihyWzBdLHJbMV0sYVswXSk7IGlmICgtLW4gPT0gMCkgcmV0dXJuOworCQlzcXIoclsyXSxyWzNdLGFbMV0pOyBpZiAoLS1uID09IDApIHJldHVybjsKKwkJc3FyKHJbNF0scls1XSxhWzJdKTsKKwkJfQorCX0KKworQk5fVUxPTkcgYm5fZGl2X3dvcmRzKEJOX1VMT05HIGgsIEJOX1VMT05HIGwsIEJOX1VMT05HIGQpCit7CUJOX1VMT05HIHJldCx3YXN0ZTsKKworCWFzbSAoImRpdnEJJTQiCisJCTogIj1hIihyZXQpLCI9ZCIod2FzdGUpCisJCTogImEiKGwpLCJkIihoKSwiZyIoZCkKKwkJOiAiY2MiKTsKKworCXJldHVybiByZXQ7Cit9CisKK0JOX1VMT05HIGJuX2FkZF93b3JkcyAoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGNvbnN0IEJOX1VMT05HICpicCxpbnQgbikKK3sgQk5fVUxPTkcgcmV0PTAsaT0wOworCisJaWYgKG4gPD0gMCkgcmV0dXJuIDA7CisKKwlhc20gKAorCSIJc3VicQklMiwlMgkJXG4iCisJIi5wMmFsaWduIDQJCQlcbiIKKwkiMToJbW92cQkoJTQsJTIsOCksJTAJXG4iCisJIglhZGNxCSglNSwlMiw4KSwlMAlcbiIKKwkiCW1vdnEJJTAsKCUzLCUyLDgpCVxuIgorCSIJbGVhcQkxKCUyKSwlMglcbiIKKwkiCWxvb3AJMWIJCVxuIgorCSIJc2JicQklMCwlMAkJXG4iCisJCTogIj0mYSIocmV0KSwiK2MiKG4pLCI9JnIiKGkpCisJCTogInIiKHJwKSwiciIoYXApLCJyIihicCkKKwkJOiAiY2MiCisJKTsKKworICByZXR1cm4gcmV0JjE7Cit9CisKKyNpZm5kZWYgU0lNSUNTCitCTl9VTE9ORyBibl9zdWJfd29yZHMgKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsaW50IG4pCit7IEJOX1VMT05HIHJldD0wLGk9MDsKKworCWlmIChuIDw9IDApIHJldHVybiAwOworCisJYXNtICgKKwkiCXN1YnEJJTIsJTIJCVxuIgorCSIucDJhbGlnbiA0CQkJXG4iCisJIjE6CW1vdnEJKCU0LCUyLDgpLCUwCVxuIgorCSIJc2JicQkoJTUsJTIsOCksJTAJXG4iCisJIgltb3ZxCSUwLCglMywlMiw4KQlcbiIKKwkiCWxlYXEJMSglMiksJTIJXG4iCisJIglsb29wCTFiCQlcbiIKKwkiCXNiYnEJJTAsJTAJCVxuIgorCQk6ICI9JmEiKHJldCksIitjIihuKSwiPSZyIihpKQorCQk6ICJyIihycCksInIiKGFwKSwiciIoYnApCisJCTogImNjIgorCSk7CisKKyAgcmV0dXJuIHJldCYxOworfQorI2Vsc2UKKy8qIFNpbWljcyAxLjQ8NyBoYXMgYnVnZ3kgc2JicTotKCAqLworI2RlZmluZSBCTl9NQVNLMiAweGZmZmZmZmZmZmZmZmZmZmZMCitCTl9VTE9ORyBibl9zdWJfd29yZHMoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYiwgaW50IG4pCisgICAgICAgIHsKKwlCTl9VTE9ORyB0MSx0MjsKKwlpbnQgYz0wOworCisJaWYgKG4gPD0gMCkgcmV0dXJuKChCTl9VTE9ORykwKTsKKworCWZvciAoOzspCisJCXsKKwkJdDE9YVswXTsgdDI9YlswXTsKKwkJclswXT0odDEtdDItYykmQk5fTUFTSzI7CisJCWlmICh0MSAhPSB0MikgYz0odDEgPCB0Mik7CisJCWlmICgtLW4gPD0gMCkgYnJlYWs7CisKKwkJdDE9YVsxXTsgdDI9YlsxXTsKKwkJclsxXT0odDEtdDItYykmQk5fTUFTSzI7CisJCWlmICh0MSAhPSB0MikgYz0odDEgPCB0Mik7CisJCWlmICgtLW4gPD0gMCkgYnJlYWs7CisKKwkJdDE9YVsyXTsgdDI9YlsyXTsKKwkJclsyXT0odDEtdDItYykmQk5fTUFTSzI7CisJCWlmICh0MSAhPSB0MikgYz0odDEgPCB0Mik7CisJCWlmICgtLW4gPD0gMCkgYnJlYWs7CisKKwkJdDE9YVszXTsgdDI9YlszXTsKKwkJclszXT0odDEtdDItYykmQk5fTUFTSzI7CisJCWlmICh0MSAhPSB0MikgYz0odDEgPCB0Mik7CisJCWlmICgtLW4gPD0gMCkgYnJlYWs7CisKKwkJYSs9NDsKKwkJYis9NDsKKwkJcis9NDsKKwkJfQorCXJldHVybihjKTsKKwl9CisjZW5kaWYKKworLyogbXVsX2FkZF9jKGEsYixjMCxjMSxjMikgIC0tIGMrPWEqYiBmb3IgdGhyZWUgd29yZCBudW1iZXIgYz0oYzIsYzEsYzApICovCisvKiBtdWxfYWRkX2MyKGEsYixjMCxjMSxjMikgLS0gYys9MiphKmIgZm9yIHRocmVlIHdvcmQgbnVtYmVyIGM9KGMyLGMxLGMwKSAqLworLyogc3FyX2FkZF9jKGEsaSxjMCxjMSxjMikgIC0tIGMrPWFbaV1eMiBmb3IgdGhyZWUgd29yZCBudW1iZXIgYz0oYzIsYzEsYzApICovCisvKiBzcXJfYWRkX2MyKGEsaSxjMCxjMSxjMikgLS0gYys9MiphW2ldKmFbal0gZm9yIHRocmVlIHdvcmQgbnVtYmVyIGM9KGMyLGMxLGMwKSAqLworCisjaWYgMAorLyogb3JpZ2luYWwgbWFjcm9zIGFyZSBrZXB0IGZvciByZWZlcmVuY2UgcHVycG9zZXMgKi8KKyNkZWZpbmUgbXVsX2FkZF9jKGEsYixjMCxjMSxjMikgewlcCisJQk5fVUxPTkcgdGE9KGEpLHRiPShiKTsJCVwKKwl0MSA9IHRhICogdGI7CQkJXAorCXQyID0gQk5fVU1VTFRfSElHSCh0YSx0Yik7CVwKKwljMCArPSB0MTsgdDIgKz0gKGMwPHQxKT8xOjA7CVwKKwljMSArPSB0MjsgYzIgKz0gKGMxPHQyKT8xOjA7CVwKKwl9CisKKyNkZWZpbmUgbXVsX2FkZF9jMihhLGIsYzAsYzEsYzIpIHsJXAorCUJOX1VMT05HIHRhPShhKSx0Yj0oYiksdDA7CVwKKwl0MSA9IEJOX1VNVUxUX0hJR0godGEsdGIpOwlcCisJdDAgPSB0YSAqIHRiOwkJCVwKKwl0MiA9IHQxK3QxOyBjMiArPSAodDI8dDEpPzE6MDsJXAorCXQxID0gdDArdDA7IHQyICs9ICh0MTx0MCk/MTowOwlcCisJYzAgKz0gdDE7IHQyICs9IChjMDx0MSk/MTowOwlcCisJYzEgKz0gdDI7IGMyICs9IChjMTx0Mik/MTowOwlcCisJfQorI2Vsc2UKKyNkZWZpbmUgbXVsX2FkZF9jKGEsYixjMCxjMSxjMikJZG8gewlcCisJYXNtICgibXVscSAlMyIJCQlcCisJCTogIj1hIih0MSksIj1kIih0MikJXAorCQk6ICJhIihhKSwibSIoYikJCVwKKwkJOiAiY2MiKTsJCVwKKwlhc20gKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIglcCisJCTogIityIihjMCksIitkIih0MikJXAorCQk6ICJhIih0MSksImciKDApCVwKKwkJOiAiY2MiKTsJCVwKKwlhc20gKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIglcCisJCTogIityIihjMSksIityIihjMikJXAorCQk6ICJkIih0MiksImciKDApCVwKKwkJOiAiY2MiKTsJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHNxcl9hZGRfYyhhLGksYzAsYzEsYzIpCWRvIHsJXAorCWFzbSAoIm11bHEgJTIiCQkJXAorCQk6ICI9YSIodDEpLCI9ZCIodDIpCVwKKwkJOiAiYSIoYVtpXSkJCVwKKwkJOiAiY2MiKTsJCVwKKwlhc20gKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIglcCisJCTogIityIihjMCksIitkIih0MikJXAorCQk6ICJhIih0MSksImciKDApCVwKKwkJOiAiY2MiKTsJCVwKKwlhc20gKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIglcCisJCTogIityIihjMSksIityIihjMikJXAorCQk6ICJkIih0MiksImciKDApCVwKKwkJOiAiY2MiKTsJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIG11bF9hZGRfYzIoYSxiLGMwLGMxLGMyKSBkbyB7CVwKKwlhc20gKCJtdWxxICUzIgkJCVwKKwkJOiAiPWEiKHQxKSwiPWQiKHQyKQlcCisJCTogImEiKGEpLCJtIihiKQkJXAorCQk6ICJjYyIpOwkJXAorCWFzbSAoImFkZHEgJTAsJTA7IGFkY3EgJTIsJTEiCVwKKwkJOiAiK2QiKHQyKSwiK3IiKGMyKQlcCisJCTogImciKDApCQlcCisJCTogImNjIik7CQlcCisJYXNtICgiYWRkcSAlMCwlMDsgYWRjcSAlMiwlMSIJXAorCQk6ICIrYSIodDEpLCIrZCIodDIpCVwKKwkJOiAiZyIoMCkJCVwKKwkJOiAiY2MiKTsJCVwKKwlhc20gKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIglcCisJCTogIityIihjMCksIitkIih0MikJXAorCQk6ICJhIih0MSksImciKDApCVwKKwkJOiAiY2MiKTsJCVwKKwlhc20gKCJhZGRxICUyLCUwOyBhZGNxICUzLCUxIglcCisJCTogIityIihjMSksIityIihjMikJXAorCQk6ICJkIih0MiksImciKDApCVwKKwkJOiAiY2MiKTsJCVwKKwl9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgc3FyX2FkZF9jMihhLGksaixjMCxjMSxjMikJXAorCW11bF9hZGRfYzIoKGEpW2ldLChhKVtqXSxjMCxjMSxjMikKKwordm9pZCBibl9tdWxfY29tYmE4KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpCisJeworCUJOX1VMT05HIHQxLHQyOworCUJOX1VMT05HIGMxLGMyLGMzOworCisJYzE9MDsKKwljMj0wOworCWMzPTA7CisJbXVsX2FkZF9jKGFbMF0sYlswXSxjMSxjMixjMyk7CisJclswXT1jMTsKKwljMT0wOworCW11bF9hZGRfYyhhWzBdLGJbMV0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzFdLGJbMF0sYzIsYzMsYzEpOworCXJbMV09YzI7CisJYzI9MDsKKwltdWxfYWRkX2MoYVsyXSxiWzBdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVsxXSxiWzFdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVswXSxiWzJdLGMzLGMxLGMyKTsKKwlyWzJdPWMzOworCWMzPTA7CisJbXVsX2FkZF9jKGFbMF0sYlszXSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbMV0sYlsyXSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbMl0sYlsxXSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbM10sYlswXSxjMSxjMixjMyk7CisJclszXT1jMTsKKwljMT0wOworCW11bF9hZGRfYyhhWzRdLGJbMF0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzNdLGJbMV0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzJdLGJbMl0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzFdLGJbM10sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzBdLGJbNF0sYzIsYzMsYzEpOworCXJbNF09YzI7CisJYzI9MDsKKwltdWxfYWRkX2MoYVswXSxiWzVdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVsxXSxiWzRdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVsyXSxiWzNdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVszXSxiWzJdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVs0XSxiWzFdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVs1XSxiWzBdLGMzLGMxLGMyKTsKKwlyWzVdPWMzOworCWMzPTA7CisJbXVsX2FkZF9jKGFbNl0sYlswXSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbNV0sYlsxXSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbNF0sYlsyXSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbM10sYlszXSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbMl0sYls0XSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbMV0sYls1XSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbMF0sYls2XSxjMSxjMixjMyk7CisJcls2XT1jMTsKKwljMT0wOworCW11bF9hZGRfYyhhWzBdLGJbN10sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzFdLGJbNl0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzJdLGJbNV0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzNdLGJbNF0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzRdLGJbM10sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzVdLGJbMl0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzZdLGJbMV0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzddLGJbMF0sYzIsYzMsYzEpOworCXJbN109YzI7CisJYzI9MDsKKwltdWxfYWRkX2MoYVs3XSxiWzFdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVs2XSxiWzJdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVs1XSxiWzNdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVs0XSxiWzRdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVszXSxiWzVdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVsyXSxiWzZdLGMzLGMxLGMyKTsKKwltdWxfYWRkX2MoYVsxXSxiWzddLGMzLGMxLGMyKTsKKwlyWzhdPWMzOworCWMzPTA7CisJbXVsX2FkZF9jKGFbMl0sYls3XSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbM10sYls2XSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbNF0sYls1XSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbNV0sYls0XSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbNl0sYlszXSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbN10sYlsyXSxjMSxjMixjMyk7CisJcls5XT1jMTsKKwljMT0wOworCW11bF9hZGRfYyhhWzddLGJbM10sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzZdLGJbNF0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzVdLGJbNV0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzRdLGJbNl0sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzNdLGJbN10sYzIsYzMsYzEpOworCXJbMTBdPWMyOworCWMyPTA7CisJbXVsX2FkZF9jKGFbNF0sYls3XSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbNV0sYls2XSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbNl0sYls1XSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbN10sYls0XSxjMyxjMSxjMik7CisJclsxMV09YzM7CisJYzM9MDsKKwltdWxfYWRkX2MoYVs3XSxiWzVdLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoYVs2XSxiWzZdLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoYVs1XSxiWzddLGMxLGMyLGMzKTsKKwlyWzEyXT1jMTsKKwljMT0wOworCW11bF9hZGRfYyhhWzZdLGJbN10sYzIsYzMsYzEpOworCW11bF9hZGRfYyhhWzddLGJbNl0sYzIsYzMsYzEpOworCXJbMTNdPWMyOworCWMyPTA7CisJbXVsX2FkZF9jKGFbN10sYls3XSxjMyxjMSxjMik7CisJclsxNF09YzM7CisJclsxNV09YzE7CisJfQorCit2b2lkIGJuX211bF9jb21iYTQoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikKKwl7CisJQk5fVUxPTkcgdDEsdDI7CisJQk5fVUxPTkcgYzEsYzIsYzM7CisKKwljMT0wOworCWMyPTA7CisJYzM9MDsKKwltdWxfYWRkX2MoYVswXSxiWzBdLGMxLGMyLGMzKTsKKwlyWzBdPWMxOworCWMxPTA7CisJbXVsX2FkZF9jKGFbMF0sYlsxXSxjMixjMyxjMSk7CisJbXVsX2FkZF9jKGFbMV0sYlswXSxjMixjMyxjMSk7CisJclsxXT1jMjsKKwljMj0wOworCW11bF9hZGRfYyhhWzJdLGJbMF0sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzFdLGJbMV0sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzBdLGJbMl0sYzMsYzEsYzIpOworCXJbMl09YzM7CisJYzM9MDsKKwltdWxfYWRkX2MoYVswXSxiWzNdLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoYVsxXSxiWzJdLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoYVsyXSxiWzFdLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoYVszXSxiWzBdLGMxLGMyLGMzKTsKKwlyWzNdPWMxOworCWMxPTA7CisJbXVsX2FkZF9jKGFbM10sYlsxXSxjMixjMyxjMSk7CisJbXVsX2FkZF9jKGFbMl0sYlsyXSxjMixjMyxjMSk7CisJbXVsX2FkZF9jKGFbMV0sYlszXSxjMixjMyxjMSk7CisJcls0XT1jMjsKKwljMj0wOworCW11bF9hZGRfYyhhWzJdLGJbM10sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzNdLGJbMl0sYzMsYzEsYzIpOworCXJbNV09YzM7CisJYzM9MDsKKwltdWxfYWRkX2MoYVszXSxiWzNdLGMxLGMyLGMzKTsKKwlyWzZdPWMxOworCXJbN109YzI7CisJfQorCit2b2lkIGJuX3Nxcl9jb21iYTgoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphKQorCXsKKwlCTl9VTE9ORyB0MSx0MjsKKwlCTl9VTE9ORyBjMSxjMixjMzsKKworCWMxPTA7CisJYzI9MDsKKwljMz0wOworCXNxcl9hZGRfYyhhLDAsYzEsYzIsYzMpOworCXJbMF09YzE7CisJYzE9MDsKKwlzcXJfYWRkX2MyKGEsMSwwLGMyLGMzLGMxKTsKKwlyWzFdPWMyOworCWMyPTA7CisJc3FyX2FkZF9jKGEsMSxjMyxjMSxjMik7CisJc3FyX2FkZF9jMihhLDIsMCxjMyxjMSxjMik7CisJclsyXT1jMzsKKwljMz0wOworCXNxcl9hZGRfYzIoYSwzLDAsYzEsYzIsYzMpOworCXNxcl9hZGRfYzIoYSwyLDEsYzEsYzIsYzMpOworCXJbM109YzE7CisJYzE9MDsKKwlzcXJfYWRkX2MoYSwyLGMyLGMzLGMxKTsKKwlzcXJfYWRkX2MyKGEsMywxLGMyLGMzLGMxKTsKKwlzcXJfYWRkX2MyKGEsNCwwLGMyLGMzLGMxKTsKKwlyWzRdPWMyOworCWMyPTA7CisJc3FyX2FkZF9jMihhLDUsMCxjMyxjMSxjMik7CisJc3FyX2FkZF9jMihhLDQsMSxjMyxjMSxjMik7CisJc3FyX2FkZF9jMihhLDMsMixjMyxjMSxjMik7CisJcls1XT1jMzsKKwljMz0wOworCXNxcl9hZGRfYyhhLDMsYzEsYzIsYzMpOworCXNxcl9hZGRfYzIoYSw0LDIsYzEsYzIsYzMpOworCXNxcl9hZGRfYzIoYSw1LDEsYzEsYzIsYzMpOworCXNxcl9hZGRfYzIoYSw2LDAsYzEsYzIsYzMpOworCXJbNl09YzE7CisJYzE9MDsKKwlzcXJfYWRkX2MyKGEsNywwLGMyLGMzLGMxKTsKKwlzcXJfYWRkX2MyKGEsNiwxLGMyLGMzLGMxKTsKKwlzcXJfYWRkX2MyKGEsNSwyLGMyLGMzLGMxKTsKKwlzcXJfYWRkX2MyKGEsNCwzLGMyLGMzLGMxKTsKKwlyWzddPWMyOworCWMyPTA7CisJc3FyX2FkZF9jKGEsNCxjMyxjMSxjMik7CisJc3FyX2FkZF9jMihhLDUsMyxjMyxjMSxjMik7CisJc3FyX2FkZF9jMihhLDYsMixjMyxjMSxjMik7CisJc3FyX2FkZF9jMihhLDcsMSxjMyxjMSxjMik7CisJcls4XT1jMzsKKwljMz0wOworCXNxcl9hZGRfYzIoYSw3LDIsYzEsYzIsYzMpOworCXNxcl9hZGRfYzIoYSw2LDMsYzEsYzIsYzMpOworCXNxcl9hZGRfYzIoYSw1LDQsYzEsYzIsYzMpOworCXJbOV09YzE7CisJYzE9MDsKKwlzcXJfYWRkX2MoYSw1LGMyLGMzLGMxKTsKKwlzcXJfYWRkX2MyKGEsNiw0LGMyLGMzLGMxKTsKKwlzcXJfYWRkX2MyKGEsNywzLGMyLGMzLGMxKTsKKwlyWzEwXT1jMjsKKwljMj0wOworCXNxcl9hZGRfYzIoYSw3LDQsYzMsYzEsYzIpOworCXNxcl9hZGRfYzIoYSw2LDUsYzMsYzEsYzIpOworCXJbMTFdPWMzOworCWMzPTA7CisJc3FyX2FkZF9jKGEsNixjMSxjMixjMyk7CisJc3FyX2FkZF9jMihhLDcsNSxjMSxjMixjMyk7CisJclsxMl09YzE7CisJYzE9MDsKKwlzcXJfYWRkX2MyKGEsNyw2LGMyLGMzLGMxKTsKKwlyWzEzXT1jMjsKKwljMj0wOworCXNxcl9hZGRfYyhhLDcsYzMsYzEsYzIpOworCXJbMTRdPWMzOworCXJbMTVdPWMxOworCX0KKwordm9pZCBibl9zcXJfY29tYmE0KEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSkKKwl7CisJQk5fVUxPTkcgdDEsdDI7CisJQk5fVUxPTkcgYzEsYzIsYzM7CisKKwljMT0wOworCWMyPTA7CisJYzM9MDsKKwlzcXJfYWRkX2MoYSwwLGMxLGMyLGMzKTsKKwlyWzBdPWMxOworCWMxPTA7CisJc3FyX2FkZF9jMihhLDEsMCxjMixjMyxjMSk7CisJclsxXT1jMjsKKwljMj0wOworCXNxcl9hZGRfYyhhLDEsYzMsYzEsYzIpOworCXNxcl9hZGRfYzIoYSwyLDAsYzMsYzEsYzIpOworCXJbMl09YzM7CisJYzM9MDsKKwlzcXJfYWRkX2MyKGEsMywwLGMxLGMyLGMzKTsKKwlzcXJfYWRkX2MyKGEsMiwxLGMxLGMyLGMzKTsKKwlyWzNdPWMxOworCWMxPTA7CisJc3FyX2FkZF9jKGEsMixjMixjMyxjMSk7CisJc3FyX2FkZF9jMihhLDMsMSxjMixjMyxjMSk7CisJcls0XT1jMjsKKwljMj0wOworCXNxcl9hZGRfYzIoYSwzLDIsYzMsYzEsYzIpOworCXJbNV09YzM7CisJYzM9MDsKKwlzcXJfYWRkX2MoYSwzLGMxLGMyLGMzKTsKKwlyWzZdPWMxOworCXJbN109YzI7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYXNtL3g4Nl82NC1tb250LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODZfNjQtbW9udC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdhNmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2FzbS94ODZfNjQtbW9udC5wbApAQCAtMCwwICsxLDMzMCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIE9jdG9iZXIgMjAwNS4KKyMKKyMgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiByb3V0aW5lIGZvciB4ODZfNjQuIFdoaWxlIGl0IGdpdmVzIG1vZGVzdAorIyA5JSBpbXByb3ZlbWVudCBvZiByc2E0MDk2IHNpZ24gb24gT3B0ZXJvbiwgcnNhNTEyIHNpZ24gcnVucyBtb3JlCisjIHRoYW4gdHdpY2UsID4yeCwgYXMgZmFzdC4gTW9zdCBjb21tb24gcnNhMTAyNCBzaWduIGlzIGltcHJvdmVkIGJ5CisjIHJlc3BlY3RmdWwgNTAlLiBJdCByZW1haW5zIHRvIGJlIHNlZW4gaWYgbG9vcCB1bnJvbGxpbmcgYW5kCisjIGRlZGljYXRlZCBzcXVhcmluZyByb3V0aW5lIGNhbiBwcm92aWRlIGZ1cnRoZXIgaW1wcm92ZW1lbnQuLi4KKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gU1RET1VULCJ8ICReWCAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CisKKyMgaW50IGJuX211bF9tb250KAorJHJwPSIlcmRpIjsJIyBCTl9VTE9ORyAqcnAsCiskYXA9IiVyc2kiOwkjIGNvbnN0IEJOX1VMT05HICphcCwKKyRicD0iJXJkeCI7CSMgY29uc3QgQk5fVUxPTkcgKmJwLAorJG5wPSIlcmN4IjsJIyBjb25zdCBCTl9VTE9ORyAqbnAsCiskbjA9IiVyOCI7CSMgY29uc3QgQk5fVUxPTkcgKm4wLAorJG51bT0iJXI5IjsJIyBpbnQgbnVtKTsKKyRsbzA9IiVyMTAiOworJGhpMD0iJXIxMSI7CiskYnA9IiVyMTIiOwkjIHJlYXNzaWduICRicAorJGhpMT0iJXIxMyI7CiskaT0iJXIxNCI7Ciskaj0iJXIxNSI7CiskbTA9IiVyYngiOworJG0xPSIlcmJwIjsKKworJGNvZGU9PDxfX187CisudGV4dAorCisuZ2xvYmwJYm5fbXVsX21vbnQKKy50eXBlCWJuX211bF9tb250LFxAZnVuY3Rpb24sNgorLmFsaWduCTE2Citibl9tdWxfbW9udDoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKworCW1vdgkke251bX1kLCR7bnVtfWQKKwlsZWEJMigkbnVtKSwlcjEwCisJbW92CSVyc3AsJXIxMQorCW5lZwklcjEwCisJbGVhCSglcnNwLCVyMTAsOCksJXJzcAkjIHRwPWFsbG9jYSg4KihudW0rMikpCisJYW5kCVwkLTEwMjQsJXJzcAkJIyBtaW5pbWl6ZSBUTEIgdXNhZ2UKKworCW1vdgklcjExLDgoJXJzcCwkbnVtLDgpCSMgdHBbbnVtKzFdPSVyc3AKKy5McHJvbG9ndWU6CisJbW92CSVyZHgsJGJwCQkjICRicCByZWFzc2lnbmVkLCByZW1lbWJlcj8KKworCW1vdgkoJG4wKSwkbjAJCSMgcHVsbCBuMFswXSB2YWx1ZQorCisJeG9yCSRpLCRpCQkJIyBpPTAKKwl4b3IJJGosJGoJCQkjIGo9MAorCisJbW92CSgkYnApLCRtMAkJIyBtMD1icFswXQorCW1vdgkoJGFwKSwlcmF4CisJbXVscQkkbTAJCQkjIGFwWzBdKmJwWzBdCisJbW92CSVyYXgsJGxvMAorCW1vdgklcmR4LCRoaTAKKworCWltdWxxCSRuMCwlcmF4CQkjICJ0cFswXSIqbjAKKwltb3YJJXJheCwkbTEKKworCW11bHEJKCRucCkJCQkjIG5wWzBdKm0xCisJYWRkCSRsbzAsJXJheAkJIyBkaXNjYXJkZWQKKwlhZGMJXCQwLCVyZHgKKwltb3YJJXJkeCwkaGkxCisKKwlsZWEJMSgkaiksJGoJCSMgaisrCisuTDFzdDoKKwltb3YJKCRhcCwkaiw4KSwlcmF4CisJbXVscQkkbTAJCQkjIGFwW2pdKmJwWzBdCisJYWRkCSRoaTAsJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmF4LCRsbzAKKwltb3YJKCRucCwkaiw4KSwlcmF4CisJbW92CSVyZHgsJGhpMAorCisJbXVscQkkbTEJCQkjIG5wW2pdKm0xCisJYWRkCSRoaTEsJXJheAorCWxlYQkxKCRqKSwkagkJIyBqKysKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJGxvMCwlcmF4CQkjIG5wW2pdKm0xK2FwW2pdKmJwWzBdCisJYWRjCVwkMCwlcmR4CisJbW92CSVyYXgsLTE2KCVyc3AsJGosOCkJIyB0cFtqLTFdCisJY21wCSRudW0sJGoKKwltb3YJJXJkeCwkaGkxCisJamwJLkwxc3QKKworCXhvcgklcmR4LCVyZHgKKwlhZGQJJGhpMCwkaGkxCisJYWRjCVwkMCwlcmR4CisJbW92CSRoaTEsLTgoJXJzcCwkbnVtLDgpCisJbW92CSVyZHgsKCVyc3AsJG51bSw4KQkjIHN0b3JlIHVwbW9zdCBvdmVyZmxvdyBiaXQKKworCWxlYQkxKCRpKSwkaQkJIyBpKysKKy5hbGlnbgk0CisuTG91dGVyOgorCXhvcgkkaiwkagkJCSMgaj0wCisKKwltb3YJKCRicCwkaSw4KSwkbTAJCSMgbTA9YnBbaV0KKwltb3YJKCRhcCksJXJheAkJIyBhcFswXQorCW11bHEJJG0wCQkJIyBhcFswXSpicFtpXQorCWFkZAkoJXJzcCksJXJheAkJIyBhcFswXSpicFtpXSt0cFswXQorCWFkYwlcJDAsJXJkeAorCW1vdgklcmF4LCRsbzAKKwltb3YJJXJkeCwkaGkwCisKKwlpbXVscQkkbjAsJXJheAkJIyB0cFswXSpuMAorCW1vdgklcmF4LCRtMQorCisJbXVscQkoJG5wLCRqLDgpCQkjIG5wWzBdKm0xCisJYWRkCSRsbzAsJXJheAkJIyBkaXNjYXJkZWQKKwltb3YJOCglcnNwKSwkbG8wCQkjIHRwWzFdCisJYWRjCVwkMCwlcmR4CisJbW92CSVyZHgsJGhpMQorCisJbGVhCTEoJGopLCRqCQkjIGorKworLmFsaWduCTQKKy5MaW5uZXI6CisJbW92CSgkYXAsJGosOCksJXJheAorCW11bHEJJG0wCQkJIyBhcFtqXSpicFtpXQorCWFkZAkkaGkwLCVyYXgKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJXJheCwkbG8wCQkjIGFwW2pdKmJwW2ldK3RwW2pdCisJbW92CSgkbnAsJGosOCksJXJheAorCWFkYwlcJDAsJXJkeAorCW1vdgklcmR4LCRoaTAKKworCW11bHEJJG0xCQkJIyBucFtqXSptMQorCWFkZAkkaGkxLCVyYXgKKwlsZWEJMSgkaiksJGoJCSMgaisrCisJYWRjCVwkMCwlcmR4CisJYWRkCSRsbzAsJXJheAkJIyBucFtqXSptMSthcFtqXSpicFtpXSt0cFtqXQorCWFkYwlcJDAsJXJkeAorCW1vdgkoJXJzcCwkaiw4KSwkbG8wCisJY21wCSRudW0sJGoKKwltb3YJJXJheCwtMTYoJXJzcCwkaiw4KQkjIHRwW2otMV0KKwltb3YJJXJkeCwkaGkxCisJamwJLkxpbm5lcgorCisJeG9yCSVyZHgsJXJkeAorCWFkZAkkaGkwLCRoaTEKKwlhZGMJXCQwLCVyZHgKKwlhZGQJJGxvMCwkaGkxCQkjIHB1bGwgdXBtb3N0IG92ZXJmbG93IGJpdAorCWFkYwlcJDAsJXJkeAorCW1vdgkkaGkxLC04KCVyc3AsJG51bSw4KQorCW1vdgklcmR4LCglcnNwLCRudW0sOCkJIyBzdG9yZSB1cG1vc3Qgb3ZlcmZsb3cgYml0CisKKwlsZWEJMSgkaSksJGkJCSMgaSsrCisJY21wCSRudW0sJGkKKwlqbAkuTG91dGVyCisKKwlsZWEJKCVyc3ApLCRhcAkJIyBib3Jyb3cgYXAgZm9yIHRwCisJbGVhCS0xKCRudW0pLCRqCQkjIGo9bnVtLTEKKworCW1vdgkoJGFwKSwlcmF4CQkjIHRwWzBdCisJeG9yCSRpLCRpCQkJIyBpPTAgYW5kIGNsZWFyIENGIQorCWptcAkuTHN1YgorLmFsaWduCTE2CisuTHN1YjoJc2JiCSgkbnAsJGksOCksJXJheAorCW1vdgklcmF4LCgkcnAsJGksOCkJCSMgcnBbaV09dHBbaV0tbnBbaV0KKwlkZWMJJGoJCQkjIGRvZXNuJ3QgYWZmZWN0IENGIQorCW1vdgk4KCRhcCwkaSw4KSwlcmF4CSMgdHBbaSsxXQorCWxlYQkxKCRpKSwkaQkJIyBpKysKKwlqZ2UJLkxzdWIKKworCXNiYglcJDAsJXJheAkJIyBoYW5kbGUgdXBtb3N0IG92ZXJmbG93IGJpdAorCWFuZAklcmF4LCRhcAorCW5vdAklcmF4CisJbW92CSRycCwkbnAKKwlhbmQJJXJheCwkbnAKKwlsZWEJLTEoJG51bSksJGoKKwlvcgkkbnAsJGFwCQkJIyBhcD1ib3Jyb3c/dHA6cnAKKy5hbGlnbgkxNgorLkxjb3B5OgkJCQkJIyBjb3B5IG9yIGluLXBsYWNlIHJlZnJlc2gKKwltb3YJKCRhcCwkaiw4KSwlcmF4CisJbW92CSVyYXgsKCRycCwkaiw4KQkJIyBycFtpXT10cFtpXQorCW1vdgkkaSwoJXJzcCwkaiw4KQkJIyB6YXAgdGVtcG9yYXJ5IHZlY3RvcgorCWRlYwkkagorCWpnZQkuTGNvcHkKKworCW1vdgk4KCVyc3AsJG51bSw4KSwlcnNpCSMgcmVzdG9yZSAlcnNwCisJbW92CVwkMSwlcmF4CisJbW92CSglcnNpKSwlcjE1CisJbW92CTgoJXJzaSksJXIxNAorCW1vdgkxNiglcnNpKSwlcjEzCisJbW92CTI0KCVyc2kpLCVyMTIKKwltb3YJMzIoJXJzaSksJXJicAorCW1vdgk0MCglcnNpKSwlcmJ4CisJbGVhCTQ4KCVyc2kpLCVyc3AKKy5MZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQlibl9tdWxfbW9udCwuLWJuX211bF9tb250CisuYXNjaXoJIk1vbnRnb21lcnkgTXVsdGlwbGljYXRpb24gZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkxNgorX19fCisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCXNlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbGVhCS5McHJvbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPC5McHJvbG9ndWUKKwlqYgkuTGluX3Byb2xvZ3VlCisKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKworCWxlYQkuTGVwaWxvZ3VlKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49LkxlcGlsb2d1ZQorCWphZQkuTGluX3Byb2xvZ3VlCisKKwltb3YJMTkyKCRjb250ZXh0KSwlcjEwCSMgcHVsbCAkbnVtCisJbW92CTgoJXJheCwlcjEwLDgpLCVyYXgJIyBwdWxsIHNhdmVkIHN0YWNrIHBvaW50ZXIKKwlsZWEJNDgoJXJheCksJXJheAorCisJbW92CS04KCVyYXgpLCVyYngKKwltb3YJLTE2KCVyYXgpLCVyYnAKKwltb3YJLTI0KCVyYXgpLCVyMTIKKwltb3YJLTMyKCVyYXgpLCVyMTMKKwltb3YJLTQwKCVyYXgpLCVyMTQKKwltb3YJLTQ4KCVyYXgpLCVyMTUKKwltb3YJJXJieCwxNDQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYngKKwltb3YJJXJicCwxNjAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYnAKKwltb3YJJXIxMiwyMTYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTIKKwltb3YJJXIxMywyMjQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTMKKwltb3YJJXIxNCwyMzIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTQKKwltb3YJJXIxNSwyNDAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTUKKworLkxpbl9wcm9sb2d1ZToKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworCW1vdgk0MCgkZGlzcCksJXJkaQkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAorCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCXNlX2hhbmRsZXIsLi1zZV9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luX2JuX211bF9tb250CisJLnJ2YQkuTFNFSF9lbmRfYm5fbXVsX21vbnQKKwkucnZhCS5MU0VIX2luZm9fYm5fbXVsX21vbnQKKworLnNlY3Rpb24JLnhkYXRhCisuYWxpZ24JOAorLkxTRUhfaW5mb19ibl9tdWxfbW9udDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCitfX18KK30KKworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm4uaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODRiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm4uaApAQCAtMCwwICsxLDg1OCBAQAorLyogY3J5cHRvL2JuL2JuLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIEVyaWMgWW91bmcgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IAorICogU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9CTl9ICisjZGVmaW5lIEhFQURFUl9CTl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisjaW5jbHVkZSA8c3RkaW8uaD4gLyogRklMRSAqLworI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZXNlIHByZXByb2Nlc3NvciBzeW1ib2xzIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBiaWdudW0gaGVhZGVycyBhbmQKKyAqIGxpYnJhcnkgY29kZS4gVGhleSdyZSBub3QgZGVmaW5lZCBieSBhbnkgIm5vcm1hbCIgY29uZmlndXJhdGlvbiwgYXMgdGhleSBhcmUKKyAqIGludGVuZGVkIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyBwdXJwb3Nlcy4gTkI6IGRlZmluaW5nIGFsbCB0aHJlZSBjYW4gYmUKKyAqIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFwcGxpY2F0aW9uIGNvZGUgYXMgd2VsbCBhcyBvcGVuc3NsIGl0c2VsZi4KKyAqCisgKiBCTl9ERUJVRyAtIHR1cm4gb24gdmFyaW91cyBkZWJ1Z2dpbmcgYWx0ZXJhdGlvbnMgdG8gdGhlIGJpZ251bSBjb2RlCisgKiBCTl9ERUJVR19SQU5EIC0gdXNlcyByYW5kb20gcG9pc29uaW5nIG9mIHVudXNlZCB3b3JkcyB0byB0cmlwIHVwCisgKiBtaXNtYW5hZ2VtZW50IG9mIGJpZ251bSBpbnRlcm5hbHMuIFlvdSBtdXN0IGFsc28gZGVmaW5lIEJOX0RFQlVHLgorICovCisvKiAjZGVmaW5lIEJOX0RFQlVHICovCisvKiAjZGVmaW5lIEJOX0RFQlVHX1JBTkQgKi8KKworI2lmbmRlZiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVAorI2RlZmluZSBCTl9NVUxfQ09NQkEKKyNkZWZpbmUgQk5fU1FSX0NPTUJBCisjZGVmaW5lIEJOX1JFQ1VSU0lPTgorI2VuZGlmCisKKy8qIFRoaXMgbmV4dCBvcHRpb24gdXNlcyB0aGUgQyBsaWJyYXJpZXMgKDIgd29yZCkvKDEgd29yZCkgZnVuY3Rpb24uCisgKiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgSSB1c2UgbXkgQyB2ZXJzaW9uICh3aGljaCBpcyBzbG93ZXIpLgorICogVGhlIHJlYXNvbiBmb3IgdGhpcyBmbGFnIGlzIHRoYXQgd2hlbiB0aGUgcGFydGljdWxhciBDIGNvbXBpbGVyCisgKiBsaWJyYXJ5IHJvdXRpbmUgaXMgdXNlZCwgYW5kIHRoZSBsaWJyYXJ5IGlzIGxpbmtlZCB3aXRoIGEgZGlmZmVyZW50CisgKiBjb21waWxlciwgdGhlIGxpYnJhcnkgaXMgbWlzc2luZy4gIFRoaXMgbW9zdGx5IGhhcHBlbnMgd2hlbiB0aGUKKyAqIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBnY2MgYW5kIHRoZW4gbGlua2VkIHVzaW5nIG5vcm1hbCBjYy4gIFRoaXMgd291bGQKKyAqIGJlIGEgY29tbW9uIG9jY3VycmVuY2UgYmVjYXVzZSBnY2Mgbm9ybWFsbHkgcHJvZHVjZXMgY29kZSB0aGF0IGlzCisgKiAyIHRpbWVzIGZhc3RlciB0aGFuIHN5c3RlbSBjb21waWxlcnMgZm9yIHRoZSBiaWcgbnVtYmVyIHN0dWZmLgorICogRm9yIG1hY2hpbmVzIHdpdGggb25seSBvbmUgY29tcGlsZXIgKG9yIHNoYXJlZCBsaWJyYXJpZXMpLCB0aGlzIHNob3VsZAorICogYmUgb24uICBBZ2FpbiB0aGlzIGluIG9ubHkgcmVhbGx5IGEgcHJvYmxlbSBvbiBtYWNoaW5lcworICogdXNpbmcgImxvbmcgbG9uZydzIiwgYXJlIDMyYml0LCBhbmQgYXJlIG5vdCB1c2luZyBteSBhc3NlbWJsZXIgY29kZS4gKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpIHx8IFwKKyAgICBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSB8fCBkZWZpbmVkKGxpbnV4KQorIyBpZm5kZWYgQk5fRElWMlcKKyMgIGRlZmluZSBCTl9ESVYyVworIyBlbmRpZgorI2VuZGlmCisKKy8qIGFzc3VtaW5nIGxvbmcgaXMgNjRiaXQgLSB0aGlzIGlzIHRoZSBERUMgQWxwaGEKKyAqIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyBvbmx5IDY0IGJpdHMgOi0oLCBkb24ndCBkZWZpbmUKKyAqIEJOX0xMT05HIGZvciB0aGUgREVDIEFscGhhICovCisjaWZkZWYgU0lYVFlfRk9VUl9CSVRfTE9ORworI2RlZmluZSBCTl9VTExPTkcJdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIEJOX1VMT05HCXVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgQk5fTE9ORwkJbG9uZworI2RlZmluZSBCTl9CSVRTCQkxMjgKKyNkZWZpbmUgQk5fQllURVMJOAorI2RlZmluZSBCTl9CSVRTMgk2NAorI2RlZmluZSBCTl9CSVRTNAkzMgorI2RlZmluZSBCTl9NQVNLCQkoMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkxMKQorI2RlZmluZSBCTl9NQVNLMgkoMHhmZmZmZmZmZmZmZmZmZmZmTCkKKyNkZWZpbmUgQk5fTUFTSzJsCSgweGZmZmZmZmZmTCkKKyNkZWZpbmUgQk5fTUFTSzJoCSgweGZmZmZmZmZmMDAwMDAwMDBMKQorI2RlZmluZSBCTl9NQVNLMmgxCSgweGZmZmZmZmZmODAwMDAwMDBMKQorI2RlZmluZSBCTl9UQklUCQkoMHg4MDAwMDAwMDAwMDAwMDAwTCkKKyNkZWZpbmUgQk5fREVDX0NPTlYJKDEwMDAwMDAwMDAwMDAwMDAwMDAwVUwpCisjZGVmaW5lIEJOX0RFQ19GTVQxCSIlbHUiCisjZGVmaW5lIEJOX0RFQ19GTVQyCSIlMDE5bHUiCisjZGVmaW5lIEJOX0RFQ19OVU0JMTkKKyNkZWZpbmUgQk5fSEVYX0ZNVDEJIiVsWCIKKyNkZWZpbmUgQk5fSEVYX0ZNVDIJIiUwMTZsWCIKKyNlbmRpZgorCisvKiBUaGlzIGlzIHdoZXJlIHRoZSBsb25nIGxvbmcgZGF0YSB0eXBlIGlzIDY0IGJpdHMsIGJ1dCBsb25nIGlzIDMyLgorICogRm9yIG1hY2hpbmVzIHdoZXJlIHRoZXJlIGFyZSA2NGJpdCByZWdpc3RlcnMsIHRoaXMgaXMgdGhlIG1vZGUgdG8gdXNlLgorICogSVJJWCwgb24gUjQwMDAgYW5kIGFib3ZlIHNob3VsZCB1c2UgdGhpcyBtb2RlLCBhbG9uZyB3aXRoIHRoZSByZWxldmFudAorICogYXNzZW1ibGVyIGNvZGUgOi0pLiAgRG8gTk9UIGRlZmluZSBCTl9MTE9ORy4KKyAqLworI2lmZGVmIFNJWFRZX0ZPVVJfQklUCisjdW5kZWYgQk5fTExPTkcKKyN1bmRlZiBCTl9VTExPTkcKKyNkZWZpbmUgQk5fVUxPTkcJdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIEJOX0xPTkcJCWxvbmcgbG9uZworI2RlZmluZSBCTl9CSVRTCQkxMjgKKyNkZWZpbmUgQk5fQllURVMJOAorI2RlZmluZSBCTl9CSVRTMgk2NAorI2RlZmluZSBCTl9CSVRTNAkzMgorI2RlZmluZSBCTl9NQVNLMgkoMHhmZmZmZmZmZmZmZmZmZmZmTEwpCisjZGVmaW5lIEJOX01BU0sybAkoMHhmZmZmZmZmZkwpCisjZGVmaW5lIEJOX01BU0syaAkoMHhmZmZmZmZmZjAwMDAwMDAwTEwpCisjZGVmaW5lIEJOX01BU0syaDEJKDB4ZmZmZmZmZmY4MDAwMDAwMExMKQorI2RlZmluZSBCTl9UQklUCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisjZGVmaW5lIEJOX0RFQ19DT05WCSgxMDAwMDAwMDAwMDAwMDAwMDAwMFVMTCkKKyNkZWZpbmUgQk5fREVDX0ZNVDEJIiVsbHUiCisjZGVmaW5lIEJOX0RFQ19GTVQyCSIlMDE5bGx1IgorI2RlZmluZSBCTl9ERUNfTlVNCTE5CisjZGVmaW5lIEJOX0hFWF9GTVQxCSIlbGxYIgorI2RlZmluZSBCTl9IRVhfRk1UMgkiJTAxNmxsWCIKKyNlbmRpZgorCisjaWZkZWYgVEhJUlRZX1RXT19CSVQKKyNpZmRlZiBCTl9MTE9ORworIyBpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgQk5fVUxMT05HCXVuc2lnbmVkIF9faW50NjQKKyMgIGRlZmluZSBCTl9NQVNLCSgweGZmZmZmZmZmZmZmZmZmZmZJNjQpCisjIGVsc2UKKyMgIGRlZmluZSBCTl9VTExPTkcJdW5zaWduZWQgbG9uZyBsb25nCisjICBkZWZpbmUgQk5fTUFTSwkoMHhmZmZmZmZmZmZmZmZmZmZmTEwpCisjIGVuZGlmCisjZW5kaWYKKyNkZWZpbmUgQk5fVUxPTkcJdW5zaWduZWQgaW50CisjZGVmaW5lIEJOX0xPTkcJCWludAorI2RlZmluZSBCTl9CSVRTCQk2NAorI2RlZmluZSBCTl9CWVRFUwk0CisjZGVmaW5lIEJOX0JJVFMyCTMyCisjZGVmaW5lIEJOX0JJVFM0CTE2CisjZGVmaW5lIEJOX01BU0syCSgweGZmZmZmZmZmTCkKKyNkZWZpbmUgQk5fTUFTSzJsCSgweGZmZmYpCisjZGVmaW5lIEJOX01BU0syaDEJKDB4ZmZmZjgwMDBMKQorI2RlZmluZSBCTl9NQVNLMmgJKDB4ZmZmZjAwMDBMKQorI2RlZmluZSBCTl9UQklUCQkoMHg4MDAwMDAwMEwpCisjZGVmaW5lIEJOX0RFQ19DT05WCSgxMDAwMDAwMDAwTCkKKyNkZWZpbmUgQk5fREVDX0ZNVDEJIiV1IgorI2RlZmluZSBCTl9ERUNfRk1UMgkiJTA5dSIKKyNkZWZpbmUgQk5fREVDX05VTQk5CisjZGVmaW5lIEJOX0hFWF9GTVQxCSIlWCIKKyNkZWZpbmUgQk5fSEVYX0ZNVDIJIiUwOFgiCisjZW5kaWYKKworI2RlZmluZSBCTl9ERUZBVUxUX0JJVFMJMTI4MAorCisjZGVmaW5lIEJOX0ZMR19NQUxMT0NFRAkJMHgwMQorI2RlZmluZSBCTl9GTEdfU1RBVElDX0RBVEEJMHgwMgorI2RlZmluZSBCTl9GTEdfQ09OU1RUSU1FCTB4MDQgLyogYXZvaWQgbGVha2luZyBleHBvbmVudCBpbmZvcm1hdGlvbiB0aHJvdWdoIHRpbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCTl9tb2RfZXhwX21vbnQoKSB3aWxsIGNhbGwgQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCTl9kaXYoKSB3aWxsIGNhbGwgQk5fZGl2X25vX2JyYW5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCTl9tb2RfaW52ZXJzZSgpIHdpbGwgY2FsbCBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2guCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjZGVmaW5lIEJOX0ZMR19FWFBfQ09OU1RUSU1FIEJOX0ZMR19DT05TVFRJTUUgLyogZGVwcmVjYXRlZCBuYW1lIGZvciB0aGUgZmxhZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdm9pZCBsZWFraW5nIGV4cG9uZW50IGluZm9ybWF0aW9uIHRocm91Z2ggdGltaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChCTl9tb2RfZXhwX21vbnQoKSB3aWxsIGNhbGwgQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSkgKi8KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2RlZmluZSBCTl9GTEdfRlJFRQkJMHg4MDAwCS8qIHVzZWQgZm9yIGRlYnVnaW5nICovCisjZW5kaWYKKyNkZWZpbmUgQk5fc2V0X2ZsYWdzKGIsbikJKChiKS0+ZmxhZ3N8PShuKSkKKyNkZWZpbmUgQk5fZ2V0X2ZsYWdzKGIsbikJKChiKS0+ZmxhZ3MmKG4pKQorCisvKiBnZXQgYSBjbG9uZSBvZiBhIEJJR05VTSB3aXRoIGNoYW5nZWQgZmxhZ3MsIGZvciAqdGVtcG9yYXJ5KiB1c2Ugb25seQorICogKHRoZSB0d28gQklHTlVNcyBjYW5ub3Qgbm90IGJlIHVzZWQgaW4gcGFyYWxsZWwhKSAqLworI2RlZmluZSBCTl93aXRoX2ZsYWdzKGRlc3QsYixuKSAgKChkZXN0KS0+ZD0oYiktPmQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzdCktPnRvcD0oYiktPnRvcCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXN0KS0+ZG1heD0oYiktPmRtYXgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzdCktPm5lZz0oYiktPm5lZywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXN0KS0+ZmxhZ3M9KCgoZGVzdCktPmZsYWdzICYgQk5fRkxHX01BTExPQ0VEKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgKChiKS0+ZmxhZ3MgJiB+Qk5fRkxHX01BTExPQ0VEKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgQk5fRkxHX1NUQVRJQ19EQVRBIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAobikpKQorCisvKiBBbHJlYWR5IGRlY2xhcmVkIGluIG9zc2xfdHlwLmggKi8KKyNpZiAwCit0eXBlZGVmIHN0cnVjdCBiaWdudW1fc3QgQklHTlVNOworLyogVXNlZCBmb3IgdGVtcCB2YXJpYWJsZXMgKGRlY2xhcmF0aW9uIGhpZGRlbiBpbiBibl9sY2wuaCkgKi8KK3R5cGVkZWYgc3RydWN0IGJpZ251bV9jdHggQk5fQ1RYOwordHlwZWRlZiBzdHJ1Y3QgYm5fYmxpbmRpbmdfc3QgQk5fQkxJTkRJTkc7Cit0eXBlZGVmIHN0cnVjdCBibl9tb250X2N0eF9zdCBCTl9NT05UX0NUWDsKK3R5cGVkZWYgc3RydWN0IGJuX3JlY3BfY3R4X3N0IEJOX1JFQ1BfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgYm5fZ2VuY2Jfc3QgQk5fR0VOQ0I7CisjZW5kaWYKKworc3RydWN0IGJpZ251bV9zdAorCXsKKwlCTl9VTE9ORyAqZDsJLyogUG9pbnRlciB0byBhbiBhcnJheSBvZiAnQk5fQklUUzInIGJpdCBjaHVua3MuICovCisJaW50IHRvcDsJLyogSW5kZXggb2YgbGFzdCB1c2VkIGQgKzEuICovCisJLyogVGhlIG5leHQgYXJlIGludGVybmFsIGJvb2sga2VlcGluZyBmb3IgYm5fZXhwYW5kLiAqLworCWludCBkbWF4OwkvKiBTaXplIG9mIHRoZSBkIGFycmF5LiAqLworCWludCBuZWc7CS8qIG9uZSBpZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlICovCisJaW50IGZsYWdzOworCX07CisKKy8qIFVzZWQgZm9yIG1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gKi8KK3N0cnVjdCBibl9tb250X2N0eF9zdAorCXsKKwlpbnQgcmk7ICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBSICovCisJQklHTlVNIFJSOyAgICAgLyogdXNlZCB0byBjb252ZXJ0IHRvIG1vbnRnb21lcnkgZm9ybSAqLworCUJJR05VTSBOOyAgICAgIC8qIFRoZSBtb2R1bHVzICovCisJQklHTlVNIE5pOyAgICAgLyogUiooMS9SIG1vZCBOKSAtIE4qTmkgPSAxCisJICAgICAgICAgICAgICAgICogKE5pIGlzIG9ubHkgc3RvcmVkIGZvciBiaWdudW0gYWxnb3JpdGhtKSAqLworCUJOX1VMT05HIG4wWzJdOy8qIGxlYXN0IHNpZ25pZmljYW50IHdvcmQocykgb2YgTmk7CisJICAgICAgICAgICAgICAgICAgKHR5cGUgY2hhbmdlZCB3aXRoIDAuOS45LCB3YXMgIkJOX1VMT05HIG4wOyIgYmVmb3JlKSAqLworCWludCBmbGFnczsKKwl9OworCisvKiBVc2VkIGZvciByZWNpcHJvY2FsIGRpdmlzaW9uL21vZCBmdW5jdGlvbnMKKyAqIEl0IGNhbm5vdCBiZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzCisgKi8KK3N0cnVjdCBibl9yZWNwX2N0eF9zdAorCXsKKwlCSUdOVU0gTjsJLyogdGhlIGRpdmlzb3IgKi8KKwlCSUdOVU0gTnI7CS8qIHRoZSByZWNpcHJvY2FsICovCisJaW50IG51bV9iaXRzOworCWludCBzaGlmdDsKKwlpbnQgZmxhZ3M7CisJfTsKKworLyogVXNlZCBmb3Igc2xvdyAiZ2VuZXJhdGlvbiIgZnVuY3Rpb25zLiAqLworc3RydWN0IGJuX2dlbmNiX3N0CisJeworCXVuc2lnbmVkIGludCB2ZXI7CS8qIFRvIGhhbmRsZSBiaW5hcnkgKGluKWNvbXBhdGliaWxpdHkgKi8KKwl2b2lkICphcmc7CQkvKiBjYWxsYmFjay1zcGVjaWZpYyBkYXRhICovCisJdW5pb24KKwkJeworCQkvKiBpZih2ZXI9PTEpIC0gaGFuZGxlcyBvbGQgc3R5bGUgY2FsbGJhY2tzICovCisJCXZvaWQgKCpjYl8xKShpbnQsIGludCwgdm9pZCAqKTsKKwkJLyogaWYodmVyPT0yKSAtIG5ldyBjYWxsYmFjayBzdHlsZSAqLworCQlpbnQgKCpjYl8yKShpbnQsIGludCwgQk5fR0VOQ0IgKik7CisJCX0gY2I7CisJfTsKKy8qIFdyYXBwZXIgZnVuY3Rpb24gdG8gbWFrZSB1c2luZyBCTl9HRU5DQiBlYXNpZXIsICAqLworaW50IEJOX0dFTkNCX2NhbGwoQk5fR0VOQ0IgKmNiLCBpbnQgYSwgaW50IGIpOworLyogTWFjcm8gdG8gcG9wdWxhdGUgYSBCTl9HRU5DQiBzdHJ1Y3R1cmUgd2l0aCBhbiAib2xkIi1zdHlsZSBjYWxsYmFjayAqLworI2RlZmluZSBCTl9HRU5DQl9zZXRfb2xkKGdlbmNiLCBjYWxsYmFjaywgY2JfYXJnKSB7IFwKKwkJQk5fR0VOQ0IgKnRtcF9nZW5jYiA9IChnZW5jYik7IFwKKwkJdG1wX2dlbmNiLT52ZXIgPSAxOyBcCisJCXRtcF9nZW5jYi0+YXJnID0gKGNiX2FyZyk7IFwKKwkJdG1wX2dlbmNiLT5jYi5jYl8xID0gKGNhbGxiYWNrKTsgfQorLyogTWFjcm8gdG8gcG9wdWxhdGUgYSBCTl9HRU5DQiBzdHJ1Y3R1cmUgd2l0aCBhICJuZXciLXN0eWxlIGNhbGxiYWNrICovCisjZGVmaW5lIEJOX0dFTkNCX3NldChnZW5jYiwgY2FsbGJhY2ssIGNiX2FyZykgeyBcCisJCUJOX0dFTkNCICp0bXBfZ2VuY2IgPSAoZ2VuY2IpOyBcCisJCXRtcF9nZW5jYi0+dmVyID0gMjsgXAorCQl0bXBfZ2VuY2ItPmFyZyA9IChjYl9hcmcpOyBcCisJCXRtcF9nZW5jYi0+Y2IuY2JfMiA9IChjYWxsYmFjayk7IH0KKworI2RlZmluZSBCTl9wcmltZV9jaGVja3MgMCAvKiBkZWZhdWx0OiBzZWxlY3QgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKwkJCSAgICAgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIG51bWJlciAqLworCisvKiBudW1iZXIgb2YgTWlsbGVyLVJhYmluIGl0ZXJhdGlvbnMgZm9yIGFuIGVycm9yIHJhdGUgIG9mIGxlc3MgdGhhbiAyXi04MAorICogZm9yIHJhbmRvbSAnYictYml0IGlucHV0LCBiID49IDEwMCAodGFrZW4gZnJvbSB0YWJsZSA0LjQgaW4gdGhlIEhhbmRib29rCisgKiBvZiBBcHBsaWVkIENyeXB0b2dyYXBoeSBbTWVuZXplcywgdmFuIE9vcnNjaG90LCBWYW5zdG9uZTsgQ1JDIFByZXNzIDE5OTZdOworICogb3JpZ2luYWwgcGFwZXI6IERhbWdhYXJkLCBMYW5kcm9jaywgUG9tZXJhbmNlOiBBdmVyYWdlIGNhc2UgZXJyb3IgZXN0aW1hdGVzCisgKiBmb3IgdGhlIHN0cm9uZyBwcm9iYWJsZSBwcmltZSB0ZXN0LiAtLSBNYXRoLiBDb21wLiA2MSAoMTk5MykgMTc3LTE5NCkgKi8KKyNkZWZpbmUgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplKGIpICgoYikgPj0gMTMwMCA/ICAyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDg1MCA/ICAzIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDY1MCA/ICA0IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDU1MCA/ICA1IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDQ1MCA/ICA2IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDQwMCA/ICA3IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDM1MCA/ICA4IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDMwMCA/ICA5IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDI1MCA/IDEyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDIwMCA/IDE1IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDE1MCA/IDE4IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiID49IDEwMCAqLyAyNykKKworI2RlZmluZSBCTl9udW1fYnl0ZXMoYSkJKChCTl9udW1fYml0cyhhKSs3KS84KQorCisvKiBOb3RlIHRoYXQgQk5fYWJzX2lzX3dvcmQgZGlkbid0IHdvcmsgcmVsaWFibHkgZm9yIHcgPT0gMCB1bnRpbCAwLjkuOCAqLworI2RlZmluZSBCTl9hYnNfaXNfd29yZChhLHcpICgoKChhKS0+dG9wID09IDEpICYmICgoYSktPmRbMF0gPT0gKEJOX1VMT05HKSh3KSkpIHx8IFwKKwkJCQkoKCh3KSA9PSAwKSAmJiAoKGEpLT50b3AgPT0gMCkpKQorI2RlZmluZSBCTl9pc196ZXJvKGEpICAgICAgICgoYSktPnRvcCA9PSAwKQorI2RlZmluZSBCTl9pc19vbmUoYSkgICAgICAgIChCTl9hYnNfaXNfd29yZCgoYSksMSkgJiYgIShhKS0+bmVnKQorI2RlZmluZSBCTl9pc193b3JkKGEsdykgICAgIChCTl9hYnNfaXNfd29yZCgoYSksKHcpKSAmJiAoISh3KSB8fCAhKGEpLT5uZWcpKQorI2RlZmluZSBCTl9pc19vZGQoYSkJICAgICgoKGEpLT50b3AgPiAwKSAmJiAoKGEpLT5kWzBdICYgMSkpCisKKyNkZWZpbmUgQk5fb25lKGEpCShCTl9zZXRfd29yZCgoYSksMSkpCisjZGVmaW5lIEJOX3plcm9fZXgoYSkgXAorCWRvIHsgXAorCQlCSUdOVU0gKl90bXBfYm4gPSAoYSk7IFwKKwkJX3RtcF9ibi0+dG9wID0gMDsgXAorCQlfdG1wX2JuLT5uZWcgPSAwOyBcCisJfSB3aGlsZSgwKQorI2lmZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2RlZmluZSBCTl96ZXJvKGEpCUJOX3plcm9fZXgoYSkKKyNlbHNlCisjZGVmaW5lIEJOX3plcm8oYSkJKEJOX3NldF93b3JkKChhKSwwKSkKKyNlbmRpZgorCitjb25zdCBCSUdOVU0gKkJOX3ZhbHVlX29uZSh2b2lkKTsKK2NoYXIgKglCTl9vcHRpb25zKHZvaWQpOworQk5fQ1RYICpCTl9DVFhfbmV3KHZvaWQpOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK3ZvaWQJQk5fQ1RYX2luaXQoQk5fQ1RYICpjKTsKKyNlbmRpZgordm9pZAlCTl9DVFhfZnJlZShCTl9DVFggKmMpOwordm9pZAlCTl9DVFhfc3RhcnQoQk5fQ1RYICpjdHgpOworQklHTlVNICpCTl9DVFhfZ2V0KEJOX0NUWCAqY3R4KTsKK3ZvaWQJQk5fQ1RYX2VuZChCTl9DVFggKmN0eCk7CitpbnQgICAgIEJOX3JhbmQoQklHTlVNICpybmQsIGludCBiaXRzLCBpbnQgdG9wLGludCBib3R0b20pOworaW50ICAgICBCTl9wc2V1ZG9fcmFuZChCSUdOVU0gKnJuZCwgaW50IGJpdHMsIGludCB0b3AsaW50IGJvdHRvbSk7CitpbnQJQk5fcmFuZF9yYW5nZShCSUdOVU0gKnJuZCwgY29uc3QgQklHTlVNICpyYW5nZSk7CitpbnQJQk5fcHNldWRvX3JhbmRfcmFuZ2UoQklHTlVNICpybmQsIGNvbnN0IEJJR05VTSAqcmFuZ2UpOworaW50CUJOX251bV9iaXRzKGNvbnN0IEJJR05VTSAqYSk7CitpbnQJQk5fbnVtX2JpdHNfd29yZChCTl9VTE9ORyk7CitCSUdOVU0gKkJOX25ldyh2b2lkKTsKK3ZvaWQJQk5faW5pdChCSUdOVU0gKik7Cit2b2lkCUJOX2NsZWFyX2ZyZWUoQklHTlVNICphKTsKK0JJR05VTSAqQk5fY29weShCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYik7Cit2b2lkCUJOX3N3YXAoQklHTlVNICphLCBCSUdOVU0gKmIpOworQklHTlVNICpCTl9iaW4yYm4oY29uc3QgdW5zaWduZWQgY2hhciAqcyxpbnQgbGVuLEJJR05VTSAqcmV0KTsKK2ludAlCTl9ibjJiaW4oY29uc3QgQklHTlVNICphLCB1bnNpZ25lZCBjaGFyICp0byk7CitCSUdOVU0gKkJOX21waTJibihjb25zdCB1bnNpZ25lZCBjaGFyICpzLGludCBsZW4sQklHTlVNICpyZXQpOworaW50CUJOX2JuMm1waShjb25zdCBCSUdOVU0gKmEsIHVuc2lnbmVkIGNoYXIgKnRvKTsKK2ludAlCTl9zdWIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYik7CitpbnQJQk5fdXN1YihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKK2ludAlCTl91YWRkKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpOworaW50CUJOX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKK2ludAlCTl9tdWwoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpOworaW50CUJOX3NxcihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSxCTl9DVFggKmN0eCk7CisvKiogQk5fc2V0X25lZ2F0aXZlIHNldHMgc2lnbiBvZiBhIEJJR05VTQorICogXHBhcmFtICBiICBwb2ludGVyIHRvIHRoZSBCSUdOVU0gb2JqZWN0CisgKiBccGFyYW0gIG4gIDAgaWYgdGhlIEJJR05VTSBiIHNob3VsZCBiZSBwb3NpdGl2ZSBhbmQgYSB2YWx1ZSAhPSAwIG90aGVyd2lzZSAKKyAqLwordm9pZAlCTl9zZXRfbmVnYXRpdmUoQklHTlVNICpiLCBpbnQgbik7CisvKiogQk5faXNfbmVnYXRpdmUgcmV0dXJucyAxIGlmIHRoZSBCSUdOVU0gaXMgbmVnYXRpdmUKKyAqIFxwYXJhbSAgYSAgcG9pbnRlciB0byB0aGUgQklHTlVNIG9iamVjdAorICogXHJldHVybiAxIGlmIGEgPCAwIGFuZCAwIG90aGVyd2lzZQorICovCisjZGVmaW5lIEJOX2lzX25lZ2F0aXZlKGEpICgoYSktPm5lZyAhPSAwKQorCitpbnQJQk5fZGl2KEJJR05VTSAqZHYsIEJJR05VTSAqcmVtLCBjb25zdCBCSUdOVU0gKm0sIGNvbnN0IEJJR05VTSAqZCwKKwlCTl9DVFggKmN0eCk7CisjZGVmaW5lIEJOX21vZChyZW0sbSxkLGN0eCkgQk5fZGl2KE5VTEwsKHJlbSksKG0pLChkKSwoY3R4KSkKK2ludAlCTl9ubm1vZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqbSwgY29uc3QgQklHTlVNICpkLCBCTl9DVFggKmN0eCk7CitpbnQJQk5fbW9kX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9tb2RfYWRkX3F1aWNrKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqbSk7CitpbnQJQk5fbW9kX3N1YihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9tb2Rfc3ViX3F1aWNrKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqbSk7CitpbnQJQk5fbW9kX211bChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCWNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpOworaW50CUJOX21vZF9zcXIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpOworaW50CUJOX21vZF9sc2hpZnQxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9tb2RfbHNoaWZ0MV9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICptKTsKK2ludAlCTl9tb2RfbHNoaWZ0KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBpbnQgbiwgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCk7CitpbnQJQk5fbW9kX2xzaGlmdF9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgaW50IG4sIGNvbnN0IEJJR05VTSAqbSk7CisKK0JOX1VMT05HIEJOX21vZF93b3JkKGNvbnN0IEJJR05VTSAqYSwgQk5fVUxPTkcgdyk7CitCTl9VTE9ORyBCTl9kaXZfd29yZChCSUdOVU0gKmEsIEJOX1VMT05HIHcpOworaW50CUJOX211bF93b3JkKEJJR05VTSAqYSwgQk5fVUxPTkcgdyk7CitpbnQJQk5fYWRkX3dvcmQoQklHTlVNICphLCBCTl9VTE9ORyB3KTsKK2ludAlCTl9zdWJfd29yZChCSUdOVU0gKmEsIEJOX1VMT05HIHcpOworaW50CUJOX3NldF93b3JkKEJJR05VTSAqYSwgQk5fVUxPTkcgdyk7CitCTl9VTE9ORyBCTl9nZXRfd29yZChjb25zdCBCSUdOVU0gKmEpOworCitpbnQJQk5fY21wKGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKK3ZvaWQJQk5fZnJlZShCSUdOVU0gKmEpOworaW50CUJOX2lzX2JpdF9zZXQoY29uc3QgQklHTlVNICphLCBpbnQgbik7CitpbnQJQk5fbHNoaWZ0KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBpbnQgbik7CitpbnQJQk5fbHNoaWZ0MShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSk7CitpbnQJQk5fZXhwKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsQk5fQ1RYICpjdHgpOworCitpbnQJQk5fbW9kX2V4cChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCWNvbnN0IEJJR05VTSAqbSxCTl9DVFggKmN0eCk7CitpbnQJQk5fbW9kX2V4cF9tb250KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisJY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwgQk5fTU9OVF9DVFggKm1fY3R4KTsKK2ludCBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKEJJR05VTSAqcnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCWNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICppbl9tb250KTsKK2ludAlCTl9tb2RfZXhwX21vbnRfd29yZChCSUdOVU0gKnIsIEJOX1VMT05HIGEsIGNvbnN0IEJJR05VTSAqcCwKKwljb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpOworaW50CUJOX21vZF9leHAyX21vbnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmExLCBjb25zdCBCSUdOVU0gKnAxLAorCWNvbnN0IEJJR05VTSAqYTIsIGNvbnN0IEJJR05VTSAqcDIsY29uc3QgQklHTlVNICptLAorCUJOX0NUWCAqY3R4LEJOX01PTlRfQ1RYICptX2N0eCk7CitpbnQJQk5fbW9kX2V4cF9zaW1wbGUoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwljb25zdCBCSUdOVU0gKm0sQk5fQ1RYICpjdHgpOworCitpbnQJQk5fbWFza19iaXRzKEJJR05VTSAqYSxpbnQgbik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQJQk5fcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IEJJR05VTSAqYSk7CisjZW5kaWYKKyNpZmRlZiBIRUFERVJfQklPX0gKK2ludAlCTl9wcmludChCSU8gKmZwLCBjb25zdCBCSUdOVU0gKmEpOworI2Vsc2UKK2ludAlCTl9wcmludCh2b2lkICpmcCwgY29uc3QgQklHTlVNICphKTsKKyNlbmRpZgoraW50CUJOX3JlY2lwcm9jYWwoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKm0sIGludCBsZW4sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9yc2hpZnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGludCBuKTsKK2ludAlCTl9yc2hpZnQxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphKTsKK3ZvaWQJQk5fY2xlYXIoQklHTlVNICphKTsKK0JJR05VTSAqQk5fZHVwKGNvbnN0IEJJR05VTSAqYSk7CitpbnQJQk5fdWNtcChjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYik7CitpbnQJQk5fc2V0X2JpdChCSUdOVU0gKmEsIGludCBuKTsKK2ludAlCTl9jbGVhcl9iaXQoQklHTlVNICphLCBpbnQgbik7CitjaGFyICoJQk5fYm4yaGV4KGNvbnN0IEJJR05VTSAqYSk7CitjaGFyICoJQk5fYm4yZGVjKGNvbnN0IEJJR05VTSAqYSk7CitpbnQgCUJOX2hleDJibihCSUdOVU0gKiphLCBjb25zdCBjaGFyICpzdHIpOworaW50IAlCTl9kZWMyYm4oQklHTlVNICoqYSwgY29uc3QgY2hhciAqc3RyKTsKK2ludAlCTl9hc2MyYm4oQklHTlVNICoqYSwgY29uc3QgY2hhciAqc3RyKTsKK2ludAlCTl9nY2QoQklHTlVNICpyLGNvbnN0IEJJR05VTSAqYSxjb25zdCBCSUdOVU0gKmIsQk5fQ1RYICpjdHgpOworaW50CUJOX2tyb25lY2tlcihjb25zdCBCSUdOVU0gKmEsY29uc3QgQklHTlVNICpiLEJOX0NUWCAqY3R4KTsgLyogcmV0dXJucyAtMiBmb3IgZXJyb3IgKi8KK0JJR05VTSAqQk5fbW9kX2ludmVyc2UoQklHTlVNICpyZXQsCisJY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm4sQk5fQ1RYICpjdHgpOworQklHTlVNICpCTl9tb2Rfc3FydChCSUdOVU0gKnJldCwKKwljb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbixCTl9DVFggKmN0eCk7CisKKy8qIERlcHJlY2F0ZWQgdmVyc2lvbnMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitCSUdOVU0gKkJOX2dlbmVyYXRlX3ByaW1lKEJJR05VTSAqcmV0LGludCBiaXRzLGludCBzYWZlLAorCWNvbnN0IEJJR05VTSAqYWRkLCBjb25zdCBCSUdOVU0gKnJlbSwKKwl2b2lkICgqY2FsbGJhY2spKGludCxpbnQsdm9pZCAqKSx2b2lkICpjYl9hcmcpOworaW50CUJOX2lzX3ByaW1lKGNvbnN0IEJJR05VTSAqcCxpbnQgbmNoZWNrcywKKwl2b2lkICgqY2FsbGJhY2spKGludCxpbnQsdm9pZCAqKSwKKwlCTl9DVFggKmN0eCx2b2lkICpjYl9hcmcpOworaW50CUJOX2lzX3ByaW1lX2Zhc3R0ZXN0KGNvbnN0IEJJR05VTSAqcCxpbnQgbmNoZWNrcywKKwl2b2lkICgqY2FsbGJhY2spKGludCxpbnQsdm9pZCAqKSxCTl9DVFggKmN0eCx2b2lkICpjYl9hcmcsCisJaW50IGRvX3RyaWFsX2RpdmlzaW9uKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0RFUFJFQ0FURUQpICovCisKKy8qIE5ld2VyIHZlcnNpb25zICovCitpbnQJQk5fZ2VuZXJhdGVfcHJpbWVfZXgoQklHTlVNICpyZXQsaW50IGJpdHMsaW50IHNhZmUsIGNvbnN0IEJJR05VTSAqYWRkLAorCQljb25zdCBCSUdOVU0gKnJlbSwgQk5fR0VOQ0IgKmNiKTsKK2ludAlCTl9pc19wcmltZV9leChjb25zdCBCSUdOVU0gKnAsaW50IG5jaGVja3MsIEJOX0NUWCAqY3R4LCBCTl9HRU5DQiAqY2IpOworaW50CUJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KGNvbnN0IEJJR05VTSAqcCxpbnQgbmNoZWNrcywgQk5fQ1RYICpjdHgsCisJCWludCBkb190cmlhbF9kaXZpc2lvbiwgQk5fR0VOQ0IgKmNiKTsKKworQk5fTU9OVF9DVFggKkJOX01PTlRfQ1RYX25ldyh2b2lkICk7Cit2b2lkIEJOX01PTlRfQ1RYX2luaXQoQk5fTU9OVF9DVFggKmN0eCk7CitpbnQgQk5fbW9kX211bF9tb250Z29tZXJ5KEJJR05VTSAqcixjb25zdCBCSUdOVU0gKmEsY29uc3QgQklHTlVNICpiLAorCUJOX01PTlRfQ1RYICptb250LCBCTl9DVFggKmN0eCk7CisjZGVmaW5lIEJOX3RvX21vbnRnb21lcnkocixhLG1vbnQsY3R4KQlCTl9tb2RfbXVsX21vbnRnb21lcnkoXAorCShyKSwoYSksJigobW9udCktPlJSKSwobW9udCksKGN0eCkpCitpbnQgQk5fZnJvbV9tb250Z29tZXJ5KEJJR05VTSAqcixjb25zdCBCSUdOVU0gKmEsCisJQk5fTU9OVF9DVFggKm1vbnQsIEJOX0NUWCAqY3R4KTsKK3ZvaWQgQk5fTU9OVF9DVFhfZnJlZShCTl9NT05UX0NUWCAqbW9udCk7CitpbnQgQk5fTU9OVF9DVFhfc2V0KEJOX01PTlRfQ1RYICptb250LGNvbnN0IEJJR05VTSAqbW9kLEJOX0NUWCAqY3R4KTsKK0JOX01PTlRfQ1RYICpCTl9NT05UX0NUWF9jb3B5KEJOX01PTlRfQ1RYICp0byxCTl9NT05UX0NUWCAqZnJvbSk7CitCTl9NT05UX0NUWCAqQk5fTU9OVF9DVFhfc2V0X2xvY2tlZChCTl9NT05UX0NUWCAqKnBtb250LCBpbnQgbG9jaywKKwkJCQkJY29uc3QgQklHTlVNICptb2QsIEJOX0NUWCAqY3R4KTsKKworLyogQk5fQkxJTkRJTkcgZmxhZ3MgKi8KKyNkZWZpbmUJQk5fQkxJTkRJTkdfTk9fVVBEQVRFCTB4MDAwMDAwMDEKKyNkZWZpbmUJQk5fQkxJTkRJTkdfTk9fUkVDUkVBVEUJMHgwMDAwMDAwMgorCitCTl9CTElORElORyAqQk5fQkxJTkRJTkdfbmV3KGNvbnN0IEJJR05VTSAqQSwgY29uc3QgQklHTlVNICpBaSwgQklHTlVNICptb2QpOwordm9pZCBCTl9CTElORElOR19mcmVlKEJOX0JMSU5ESU5HICpiKTsKK2ludCBCTl9CTElORElOR191cGRhdGUoQk5fQkxJTkRJTkcgKmIsQk5fQ1RYICpjdHgpOworaW50IEJOX0JMSU5ESU5HX2NvbnZlcnQoQklHTlVNICpuLCBCTl9CTElORElORyAqYiwgQk5fQ1RYICpjdHgpOworaW50IEJOX0JMSU5ESU5HX2ludmVydChCSUdOVU0gKm4sIEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fQkxJTkRJTkdfY29udmVydF9leChCSUdOVU0gKm4sIEJJR05VTSAqciwgQk5fQkxJTkRJTkcgKmIsIEJOX0NUWCAqKTsKK2ludCBCTl9CTElORElOR19pbnZlcnRfZXgoQklHTlVNICpuLCBjb25zdCBCSUdOVU0gKnIsIEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKik7CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAordW5zaWduZWQgbG9uZyBCTl9CTElORElOR19nZXRfdGhyZWFkX2lkKGNvbnN0IEJOX0JMSU5ESU5HICopOwordm9pZCBCTl9CTElORElOR19zZXRfdGhyZWFkX2lkKEJOX0JMSU5ESU5HICosIHVuc2lnbmVkIGxvbmcpOworI2VuZGlmCitDUllQVE9fVEhSRUFESUQgKkJOX0JMSU5ESU5HX3RocmVhZF9pZChCTl9CTElORElORyAqKTsKK3Vuc2lnbmVkIGxvbmcgQk5fQkxJTkRJTkdfZ2V0X2ZsYWdzKGNvbnN0IEJOX0JMSU5ESU5HICopOwordm9pZCBCTl9CTElORElOR19zZXRfZmxhZ3MoQk5fQkxJTkRJTkcgKiwgdW5zaWduZWQgbG9uZyk7CitCTl9CTElORElORyAqQk5fQkxJTkRJTkdfY3JlYXRlX3BhcmFtKEJOX0JMSU5ESU5HICpiLAorCWNvbnN0IEJJR05VTSAqZSwgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKwlpbnQgKCpibl9tb2RfZXhwKShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCQkJICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpLAorCUJOX01PTlRfQ1RYICptX2N0eCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECit2b2lkIEJOX3NldF9wYXJhbXMoaW50IG11bCxpbnQgaGlnaCxpbnQgbG93LGludCBtb250KTsKK2ludCBCTl9nZXRfcGFyYW1zKGludCB3aGljaCk7IC8qIDAsIG11bCwgMSBoaWdoLCAyIGxvdywgMyBtb250ICovCisjZW5kaWYKKwordm9pZAlCTl9SRUNQX0NUWF9pbml0KEJOX1JFQ1BfQ1RYICpyZWNwKTsKK0JOX1JFQ1BfQ1RYICpCTl9SRUNQX0NUWF9uZXcodm9pZCk7Cit2b2lkCUJOX1JFQ1BfQ1RYX2ZyZWUoQk5fUkVDUF9DVFggKnJlY3ApOworaW50CUJOX1JFQ1BfQ1RYX3NldChCTl9SRUNQX0NUWCAqcmVjcCxjb25zdCBCSUdOVU0gKnJkaXYsQk5fQ1RYICpjdHgpOworaW50CUJOX21vZF9tdWxfcmVjaXByb2NhbChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LAorCUJOX1JFQ1BfQ1RYICpyZWNwLEJOX0NUWCAqY3R4KTsKK2ludAlCTl9tb2RfZXhwX3JlY3AoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwljb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9kaXZfcmVjcChCSUdOVU0gKmR2LCBCSUdOVU0gKnJlbSwgY29uc3QgQklHTlVNICptLAorCUJOX1JFQ1BfQ1RYICpyZWNwLCBCTl9DVFggKmN0eCk7CisKKy8qIEZ1bmN0aW9ucyBmb3IgYXJpdGhtZXRpYyBvdmVyIGJpbmFyeSBwb2x5bm9taWFscyByZXByZXNlbnRlZCBieSBCSUdOVU1zLiAKKyAqCisgKiBUaGUgQklHTlVNOjpuZWcgcHJvcGVydHkgb2YgQklHTlVNcyByZXByZXNlbnRpbmcgYmluYXJ5IHBvbHlub21pYWxzIGlzCisgKiBpZ25vcmVkLgorICoKKyAqIE5vdGUgdGhhdCBpbnB1dCBhcmd1bWVudHMgYXJlIG5vdCBjb25zdCBzbyB0aGF0IHRoZWlyIGJpdCBhcnJheXMgY2FuCisgKiBiZSBleHBhbmRlZCB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBpZiBuZWVkZWQuCisgKi8KKworaW50CUJOX0dGMm1fYWRkKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpOyAvKnIgPSBhICsgYiovCisjZGVmaW5lIEJOX0dGMm1fc3ViKHIsIGEsIGIpIEJOX0dGMm1fYWRkKHIsIGEsIGIpCitpbnQJQk5fR0YybV9tb2QoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCk7IC8qcj1hIG1vZCBwKi8KK2ludAlCTl9HRjJtX21vZF9tdWwoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwKKwljb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KTsgLyogciA9IChhICogYikgbW9kIHAgKi8KK2ludAlCTl9HRjJtX21vZF9zcXIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwlCTl9DVFggKmN0eCk7IC8qIHIgPSAoYSAqIGEpIG1vZCBwICovCitpbnQJQk5fR0YybV9tb2RfaW52KEJJR05VTSAqciwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKnAsCisJQk5fQ1RYICpjdHgpOyAvKiByID0gKDEgLyBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX2RpdihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCWNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpOyAvKiByID0gKGEgLyBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX2V4cChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCWNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpOyAvKiByID0gKGEgXiBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX3NxcnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwlCTl9DVFggKmN0eCk7IC8qIHIgPSBzcXJ0KGEpIG1vZCBwICovCitpbnQJQk5fR0YybV9tb2Rfc29sdmVfcXVhZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCUJOX0NUWCAqY3R4KTsgLyogcl4yICsgciA9IGEgbW9kIHAgKi8KKyNkZWZpbmUgQk5fR0YybV9jbXAoYSwgYikgQk5fdWNtcCgoYSksIChiKSkKKy8qIFNvbWUgZnVuY3Rpb25zIGFsbG93IGZvciByZXByZXNlbnRhdGlvbiBvZiB0aGUgaXJyZWR1Y2libGUgcG9seW5vbWlhbHMKKyAqIGFzIGFuIHVuc2lnbmVkIGludFtdLCBzYXkgcC4gIFRoZSBpcnJlZHVjaWJsZSBmKHQpIGlzIHRoZW4gb2YgdGhlIGZvcm06CisgKiAgICAgdF5wWzBdICsgdF5wWzFdICsgLi4uICsgdF5wW2tdCisgKiB3aGVyZSBtID0gcFswXSA+IHBbMV0gPiAuLi4gPiBwW2tdID0gMC4KKyAqLworaW50CUJOX0dGMm1fbW9kX2FycihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgaW50IHBbXSk7CisJLyogciA9IGEgbW9kIHAgKi8KK2ludAlCTl9HRjJtX21vZF9tdWxfYXJyKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsCisJY29uc3QgaW50IHBbXSwgQk5fQ1RYICpjdHgpOyAvKiByID0gKGEgKiBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX3Nxcl9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IGludCBwW10sCisJQk5fQ1RYICpjdHgpOyAvKiByID0gKGEgKiBhKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX2ludl9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IGludCBwW10sCisJQk5fQ1RYICpjdHgpOyAvKiByID0gKDEgLyBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX2Rpdl9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwKKwljb25zdCBpbnQgcFtdLCBCTl9DVFggKmN0eCk7IC8qIHIgPSAoYSAvIGIpIG1vZCBwICovCitpbnQJQk5fR0YybV9tb2RfZXhwX2FycihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCWNvbnN0IGludCBwW10sIEJOX0NUWCAqY3R4KTsgLyogciA9IChhIF4gYikgbW9kIHAgKi8KK2ludAlCTl9HRjJtX21vZF9zcXJ0X2FycihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKwljb25zdCBpbnQgcFtdLCBCTl9DVFggKmN0eCk7IC8qIHIgPSBzcXJ0KGEpIG1vZCBwICovCitpbnQJQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCisJY29uc3QgaW50IHBbXSwgQk5fQ1RYICpjdHgpOyAvKiByXjIgKyByID0gYSBtb2QgcCAqLworaW50CUJOX0dGMm1fcG9seTJhcnIoY29uc3QgQklHTlVNICphLCBpbnQgcFtdLCBpbnQgbWF4KTsKK2ludAlCTl9HRjJtX2FycjJwb2x5KGNvbnN0IGludCBwW10sIEJJR05VTSAqYSk7CisKKy8qIGZhc3RlciBtb2QgZnVuY3Rpb25zIGZvciB0aGUgJ05JU1QgcHJpbWVzJyAKKyAqIDAgPD0gYSA8IHBeMiAqLworaW50IEJOX25pc3RfbW9kXzE5MihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fbmlzdF9tb2RfMjI0KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KTsKK2ludCBCTl9uaXN0X21vZF8yNTYoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpOworaW50IEJOX25pc3RfbW9kXzM4NChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fbmlzdF9tb2RfNTIxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KTsKKworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMTkyKHZvaWQpOworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMjI0KHZvaWQpOworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMjU2KHZvaWQpOworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMzg0KHZvaWQpOworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfNTIxKHZvaWQpOworCisvKiBsaWJyYXJ5IGludGVybmFsIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIGJuX2V4cGFuZChhLGJpdHMpICgoKCgoKGJpdHMrQk5fQklUUzItMSkpL0JOX0JJVFMyKSkgPD0gKGEpLT5kbWF4KT9cCisJKGEpOmJuX2V4cGFuZDIoKGEpLChiaXRzK0JOX0JJVFMyLTEpL0JOX0JJVFMyKSkKKyNkZWZpbmUgYm5fd2V4cGFuZChhLHdvcmRzKSAoKCh3b3JkcykgPD0gKGEpLT5kbWF4KT8oYSk6Ym5fZXhwYW5kMigoYSksKHdvcmRzKSkpCitCSUdOVU0gKmJuX2V4cGFuZDIoQklHTlVNICphLCBpbnQgd29yZHMpOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK0JJR05VTSAqYm5fZHVwX2V4cGFuZChjb25zdCBCSUdOVU0gKmEsIGludCB3b3Jkcyk7IC8qIHVudXNlZCAqLworI2VuZGlmCisKKy8qIEJpZ251bSBjb25zaXN0ZW5jeSBtYWNyb3MKKyAqIFRoZXJlIGlzIG9uZSAiQVBJIiBtYWNybywgYm5fZml4X3RvcCgpLCBmb3Igc3RyaXBwaW5nIGxlYWRpbmcgemVyb2VzIGZyb20KKyAqIGJpZ251bSBkYXRhIGFmdGVyIGRpcmVjdCBtYW5pcHVsYXRpb25zIG9uIHRoZSBkYXRhLiBUaGVyZSBpcyBhbHNvIGFuCisgKiAiaW50ZXJuYWwiIG1hY3JvLCBibl9jaGVja190b3AoKSwgZm9yIHZlcmlmeWluZyB0aGF0IHRoZXJlIGFyZSBubyBsZWFkaW5nCisgKiB6ZXJvZXMuIFVuZm9ydHVuYXRlbHksIHNvbWUgYXVkaXRpbmcgaXMgcmVxdWlyZWQgZHVlIHRvIHRoZSBmYWN0IHRoYXQKKyAqIGJuX2ZpeF90b3AoKSBoYXMgYmVjb21lIGFuIG92ZXJhYnVzZWQgZHVjdC10YXBlIGJlY2F1c2UgYmlnbnVtIGRhdGEgaXMKKyAqIG9jY2FzaW9uYWxseSBwYXNzZWQgYXJvdW5kIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gU28gdGhlIGZvbGxvd2luZworICogY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byBzb3J0IHRoaXMgb3V0OworICogLSBibl9maXhfdG9wKClzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIG1vdmVkIHRvIGJuX2NvcnJlY3RfdG9wKCkKKyAqIC0gaWYgQk5fREVCVUcgaXNuJ3QgZGVmaW5lZCwgYm5fZml4X3RvcCgpIG1hcHMgdG8gYm5fY29ycmVjdF90b3AoKSwgYW5kCisgKiAgIGJuX2NoZWNrX3RvcCgpIGlzIGFzIGJlZm9yZS4KKyAqIC0gaWYgQk5fREVCVUcgKmlzKiBkZWZpbmVkOworICogICAtIGJuX2NoZWNrX3RvcCgpIHRyaWVzIHRvIHBvbGx1dGUgdW51c2VkIHdvcmRzIGV2ZW4gaWYgdGhlIGJpZ251bSAndG9wJyBpcworICogICAgIGNvbnNpc3RlbnQuIChlZDogb25seSBpZiBCTl9ERUJVR19SQU5EIGlzIGRlZmluZWQpCisgKiAgIC0gYm5fZml4X3RvcCgpIG1hcHMgdG8gYm5fY2hlY2tfdG9wKCkgcmF0aGVyIHRoYW4gImZpeGluZyIgYW55dGhpbmcuCisgKiBUaGUgaWRlYSBpcyB0byBoYXZlIGRlYnVnIGJ1aWxkcyBmbGFnIHVwIGluY29uc2lzdGVudCBiaWdudW1zIHdoZW4gdGhleQorICogb2NjdXIuIElmIHRoYXQgb2NjdXJzIGluIGEgYm5fZml4X3RvcCgpLCB3ZSBleGFtaW5lIHRoZSBjb2RlIGluIHF1ZXN0aW9uOyBpZgorICogdGhlIHVzZSBvZiBibl9maXhfdG9wKCkgd2FzIGFwcHJvcHJpYXRlIChpZS4gaXQgZm9sbG93cyBkaXJlY3RseSBhZnRlciBjb2RlCisgKiB0aGF0IG1hbmlwdWxhdGVzIHRoZSBiaWdudW0pIGl0IGlzIGNvbnZlcnRlZCB0byBibl9jb3JyZWN0X3RvcCgpLCBhbmQgaWYgaXQKKyAqIHdhcyBub3QgYXBwcm9wcmlhdGUsIHdlIGNvbnZlcnQgaXQgcGVybWFuZW50bHkgdG8gYm5fY2hlY2tfdG9wKCkgYW5kIHRyYWNrCisgKiBkb3duIHRoZSBjYXVzZSBvZiB0aGUgYnVnLiBFdmVudHVhbGx5LCBubyBpbnRlcm5hbCBjb2RlIHNob3VsZCBiZSB1c2luZyB0aGUKKyAqIGJuX2ZpeF90b3AoKSBtYWNyby4gRXh0ZXJuYWwgYXBwbGljYXRpb25zIGFuZCBsaWJyYXJpZXMgc2hvdWxkIHRyeSB0aGlzIHdpdGgKKyAqIHRoZWlyIG93biBjb2RlIHRvbywgYm90aCBpbiB0ZXJtcyBvZiBidWlsZGluZyBhZ2FpbnN0IHRoZSBvcGVuc3NsIGhlYWRlcnMKKyAqIHdpdGggQk5fREVCVUcgZGVmaW5lZCAqYW5kKiBsaW5raW5nIHdpdGggYSB2ZXJzaW9uIG9mIE9wZW5TU0wgYnVpbHQgd2l0aCBpdAorICogZGVmaW5lZC4gVGhpcyBub3Qgb25seSBpbXByb3ZlcyBleHRlcm5hbCBjb2RlLCBpdCBwcm92aWRlcyBtb3JlIHRlc3QKKyAqIGNvdmVyYWdlIGZvciBvcGVuc3NsJ3Mgb3duIGNvZGUuCisgKi8KKworI2lmZGVmIEJOX0RFQlVHCisKKy8qIFdlIG9ubHkgbmVlZCBhc3NlcnQoKSB3aGVuIGRlYnVnZ2luZyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZkZWYgQk5fREVCVUdfUkFORAorLyogVG8gYXZvaWQgIm1ha2UgdXBkYXRlIiBjdnMgd2FycyBkdWUgdG8gQk5fREVCVUcsIHVzZSBzb21lIHRyaWNrcyAqLworI2lmbmRlZiBSQU5EX3BzZXVkb19ieXRlcworaW50IFJBTkRfcHNldWRvX2J5dGVzKHVuc2lnbmVkIGNoYXIgKmJ1ZixpbnQgbnVtKTsKKyNkZWZpbmUgQk5fREVCVUdfVFJJWAorI2VuZGlmCisjZGVmaW5lIGJuX3BvbGx1dGUoYSkgXAorCWRvIHsgXAorCQljb25zdCBCSUdOVU0gKl9ibnVtMSA9IChhKTsgXAorCQlpZihfYm51bTEtPnRvcCA8IF9ibnVtMS0+ZG1heCkgeyBcCisJCQl1bnNpZ25lZCBjaGFyIF90bXBfY2hhcjsgXAorCQkJLyogV2UgY2FzdCBhd2F5IGNvbnN0IHdpdGhvdXQgdGhlIGNvbXBpbGVyIGtub3dpbmcsIGFueSBcCisJCQkgKiAqZ2VudWluZWx5KiBjb25zdGFudCB2YXJpYWJsZXMgdGhhdCBhcmVuJ3QgbXV0YWJsZSBcCisJCQkgKiB3b3VsZG4ndCBiZSBjb25zdHJ1Y3RlZCB3aXRoIHRvcCE9ZG1heC4gKi8gXAorCQkJQk5fVUxPTkcgKl9ub3RfY29uc3Q7IFwKKwkJCW1lbWNweSgmX25vdF9jb25zdCwgJl9ibnVtMS0+ZCwgc2l6ZW9mKEJOX1VMT05HKikpOyBcCisJCQlSQU5EX3BzZXVkb19ieXRlcygmX3RtcF9jaGFyLCAxKTsgXAorCQkJbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopKF9ub3RfY29uc3QgKyBfYm51bTEtPnRvcCksIF90bXBfY2hhciwgXAorCQkJCShfYm51bTEtPmRtYXggLSBfYm51bTEtPnRvcCkgKiBzaXplb2YoQk5fVUxPTkcpKTsgXAorCQl9IFwKKwl9IHdoaWxlKDApCisjaWZkZWYgQk5fREVCVUdfVFJJWAorI3VuZGVmIFJBTkRfcHNldWRvX2J5dGVzCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIGJuX3BvbGx1dGUoYSkKKyNlbmRpZgorI2RlZmluZSBibl9jaGVja190b3AoYSkgXAorCWRvIHsgXAorCQljb25zdCBCSUdOVU0gKl9ibnVtMiA9IChhKTsgXAorCQlpZiAoX2JudW0yICE9IE5VTEwpIHsgXAorCQkJYXNzZXJ0KChfYm51bTItPnRvcCA9PSAwKSB8fCBcCisJCQkJKF9ibnVtMi0+ZFtfYm51bTItPnRvcCAtIDFdICE9IDApKTsgXAorCQkJYm5fcG9sbHV0ZShfYm51bTIpOyBcCisJCX0gXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBibl9maXhfdG9wKGEpCQlibl9jaGVja190b3AoYSkKKworI2Vsc2UgLyogIUJOX0RFQlVHICovCisKKyNkZWZpbmUgYm5fcG9sbHV0ZShhKQorI2RlZmluZSBibl9jaGVja190b3AoYSkKKyNkZWZpbmUgYm5fZml4X3RvcChhKQkJYm5fY29ycmVjdF90b3AoYSkKKworI2VuZGlmCisKKyNkZWZpbmUgYm5fY29ycmVjdF90b3AoYSkgXAorICAgICAgICB7IFwKKyAgICAgICAgQk5fVUxPTkcgKmZ0bDsgXAorCWludCB0bXBfdG9wID0gKGEpLT50b3A7IFwKKwlpZiAodG1wX3RvcCA+IDApIFwKKwkJeyBcCisJCWZvciAoZnRsPSAmKChhKS0+ZFt0bXBfdG9wLTFdKTsgdG1wX3RvcCA+IDA7IHRtcF90b3AtLSkgXAorCQkJaWYgKCooZnRsLS0pKSBicmVhazsgXAorCQkoYSktPnRvcCA9IHRtcF90b3A7IFwKKwkJfSBcCisJYm5fcG9sbHV0ZShhKTsgXAorCX0KKworQk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdyk7CitCTl9VTE9ORyBibl9tdWxfd29yZHMoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGludCBudW0sIEJOX1VMT05HIHcpOwordm9pZCAgICAgYm5fc3FyX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBpbnQgbnVtKTsKK0JOX1VMT05HIGJuX2Rpdl93b3JkcyhCTl9VTE9ORyBoLCBCTl9VTE9ORyBsLCBCTl9VTE9ORyBkKTsKK0JOX1VMT05HIGJuX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgY29uc3QgQk5fVUxPTkcgKmJwLGludCBudW0pOworQk5fVUxPTkcgYm5fc3ViX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsaW50IG51bSk7CisKKy8qIFByaW1lcyBmcm9tIFJGQyAyNDA5ICovCitCSUdOVU0gKmdldF9yZmMyNDA5X3ByaW1lXzc2OChCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzI0MDlfcHJpbWVfMTAyNChCSUdOVU0gKmJuKTsKKworLyogUHJpbWVzIGZyb20gUkZDIDM1MjYgKi8KK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfMTUzNihCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfMjA0OChCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfMzA3MihCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfNDA5NihCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfNjE0NChCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfODE5MihCSUdOVU0gKmJuKTsKKworaW50IEJOX2JudGVzdF9yYW5kKEJJR05VTSAqcm5kLCBpbnQgYml0cywgaW50IHRvcCxpbnQgYm90dG9tKTsKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9CTl9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIEJOIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIEJOX0ZfQk5SQU5ECQkJCQkgMTI3CisjZGVmaW5lIEJOX0ZfQk5fQkxJTkRJTkdfQ09OVkVSVF9FWAkJCSAxMDAKKyNkZWZpbmUgQk5fRl9CTl9CTElORElOR19DUkVBVEVfUEFSQU0JCQkgMTI4CisjZGVmaW5lIEJOX0ZfQk5fQkxJTkRJTkdfSU5WRVJUX0VYCQkJIDEwMQorI2RlZmluZSBCTl9GX0JOX0JMSU5ESU5HX05FVwkJCQkgMTAyCisjZGVmaW5lIEJOX0ZfQk5fQkxJTkRJTkdfVVBEQVRFCQkJCSAxMDMKKyNkZWZpbmUgQk5fRl9CTl9CTjJERUMJCQkJCSAxMDQKKyNkZWZpbmUgQk5fRl9CTl9CTjJIRVgJCQkJCSAxMDUKKyNkZWZpbmUgQk5fRl9CTl9DVFhfR0VUCQkJCQkgMTE2CisjZGVmaW5lIEJOX0ZfQk5fQ1RYX05FVwkJCQkJIDEwNgorI2RlZmluZSBCTl9GX0JOX0NUWF9TVEFSVAkJCQkgMTI5CisjZGVmaW5lIEJOX0ZfQk5fRElWCQkJCQkgMTA3CisjZGVmaW5lIEJOX0ZfQk5fRElWX05PX0JSQU5DSAkJCQkgMTM4CisjZGVmaW5lIEJOX0ZfQk5fRElWX1JFQ1AJCQkJIDEzMAorI2RlZmluZSBCTl9GX0JOX0VYUAkJCQkJIDEyMworI2RlZmluZSBCTl9GX0JOX0VYUEFORDIJCQkJCSAxMDgKKyNkZWZpbmUgQk5fRl9CTl9FWFBBTkRfSU5URVJOQUwJCQkJIDEyMAorI2RlZmluZSBCTl9GX0JOX0dGMk1fTU9ECQkJCSAxMzEKKyNkZWZpbmUgQk5fRl9CTl9HRjJNX01PRF9FWFAJCQkJIDEzMgorI2RlZmluZSBCTl9GX0JOX0dGMk1fTU9EX01VTAkJCQkgMTMzCisjZGVmaW5lIEJOX0ZfQk5fR0YyTV9NT0RfU09MVkVfUVVBRAkJCSAxMzQKKyNkZWZpbmUgQk5fRl9CTl9HRjJNX01PRF9TT0xWRV9RVUFEX0FSUgkJCSAxMzUKKyNkZWZpbmUgQk5fRl9CTl9HRjJNX01PRF9TUVIJCQkJIDEzNgorI2RlZmluZSBCTl9GX0JOX0dGMk1fTU9EX1NRUlQJCQkJIDEzNworI2RlZmluZSBCTl9GX0JOX01PRF9FWFAyX01PTlQJCQkJIDExOAorI2RlZmluZSBCTl9GX0JOX01PRF9FWFBfTU9OVAkJCQkgMTA5CisjZGVmaW5lIEJOX0ZfQk5fTU9EX0VYUF9NT05UX0NPTlNUVElNRQkJCSAxMjQKKyNkZWZpbmUgQk5fRl9CTl9NT0RfRVhQX01PTlRfV09SRAkJCSAxMTcKKyNkZWZpbmUgQk5fRl9CTl9NT0RfRVhQX1JFQ1AJCQkJIDEyNQorI2RlZmluZSBCTl9GX0JOX01PRF9FWFBfU0lNUExFCQkJCSAxMjYKKyNkZWZpbmUgQk5fRl9CTl9NT0RfSU5WRVJTRQkJCQkgMTEwCisjZGVmaW5lIEJOX0ZfQk5fTU9EX0lOVkVSU0VfTk9fQlJBTkNICQkJIDEzOQorI2RlZmluZSBCTl9GX0JOX01PRF9MU0hJRlRfUVVJQ0sJCQkgMTE5CisjZGVmaW5lIEJOX0ZfQk5fTU9EX01VTF9SRUNJUFJPQ0FMCQkJIDExMQorI2RlZmluZSBCTl9GX0JOX01PRF9TUVJUCQkJCSAxMjEKKyNkZWZpbmUgQk5fRl9CTl9NUEkyQk4JCQkJCSAxMTIKKyNkZWZpbmUgQk5fRl9CTl9ORVcJCQkJCSAxMTMKKyNkZWZpbmUgQk5fRl9CTl9SQU5ECQkJCQkgMTE0CisjZGVmaW5lIEJOX0ZfQk5fUkFORF9SQU5HRQkJCQkgMTIyCisjZGVmaW5lIEJOX0ZfQk5fVVNVQgkJCQkJIDExNQorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIEJOX1JfQVJHMl9MVF9BUkczCQkJCSAxMDAKKyNkZWZpbmUgQk5fUl9CQURfUkVDSVBST0NBTAkJCQkgMTAxCisjZGVmaW5lIEJOX1JfQklHTlVNX1RPT19MT05HCQkJCSAxMTQKKyNkZWZpbmUgQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMJCQkgMTAyCisjZGVmaW5lIEJOX1JfRElWX0JZX1pFUk8JCQkJIDEwMworI2RlZmluZSBCTl9SX0VOQ09ESU5HX0VSUk9SCQkJCSAxMDQKKyNkZWZpbmUgQk5fUl9FWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBCQkgMTA1CisjZGVmaW5lIEJOX1JfSU5QVVRfTk9UX1JFRFVDRUQJCQkJIDExMAorI2RlZmluZSBCTl9SX0lOVkFMSURfTEVOR1RICQkJCSAxMDYKKyNkZWZpbmUgQk5fUl9JTlZBTElEX1JBTkdFCQkJCSAxMTUKKyNkZWZpbmUgQk5fUl9OT1RfQV9TUVVBUkUJCQkJIDExMQorI2RlZmluZSBCTl9SX05PVF9JTklUSUFMSVpFRAkJCQkgMTA3CisjZGVmaW5lIEJOX1JfTk9fSU5WRVJTRQkJCQkJIDEwOAorI2RlZmluZSBCTl9SX05PX1NPTFVUSU9OCQkJCSAxMTYKKyNkZWZpbmUgQk5fUl9QX0lTX05PVF9QUklNRQkJCQkgMTEyCisjZGVmaW5lIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUwkJCSAxMTMKKyNkZWZpbmUgQk5fUl9UT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTCQkgMTA5CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm4ubXVsIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuLm11bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzI4ODcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuLm11bApAQCAtMCwwICsxLDE5IEBACitXZSBuZWVkCisKKyogYm5fbXVsX2NvbWJhOAorKiBibl9tdWxfY29tYmE0CisqIGJuX211bF9ub3JtYWwKKyogYm5fbXVsX3JlY3Vyc2l2ZQorCisqIGJuX3Nxcl9jb21iYTgKKyogYm5fc3FyX2NvbWJhNAorYm5fc3FyX25vcm1hbCAtPiBCTl9zcXIKKyogYm5fc3FyX3JlY3Vyc2l2ZQorCisqIGJuX211bF9sb3dfcmVjdXJzaXZlCisqIGJuX211bF9sb3dfbm9ybWFsCisqIGJuX211bF9oaWdoCisKKyogYm5fbXVsX3BhcnRfcmVjdXJzaXZlCSMgc3ltZXRyaWMgYnV0IG5vdCBwb3dlciBvZiAyCisKK2JuX211bF9hc3ltZXRyaWNfcmVjdXJzaXZlICMgdW5ldmVuLCBidXQgZG8gdGhlIGNob3AgdXAuCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fYWRkLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fYWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwNTE2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9hZGQuYwpAQCAtMCwwICsxLDMxMyBAQAorLyogY3J5cHRvL2JuL2JuX2FkZC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAiYm5fbGNsLmgiCisKKy8qIHIgY2FuID09IGEgb3IgYiAqLworaW50IEJOX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKQorCXsKKwljb25zdCBCSUdOVU0gKnRtcDsKKwlpbnQgYV9uZWcgPSBhLT5uZWcsIHJldDsKKworCWJuX2NoZWNrX3RvcChhKTsKKwlibl9jaGVja190b3AoYik7CisKKwkvKiAgYSArICBiCWErYgorCSAqICBhICsgLWIJYS1iCisJICogLWEgKyAgYgliLWEKKwkgKiAtYSArIC1iCS0oYStiKQorCSAqLworCWlmIChhX25lZyBeIGItPm5lZykKKwkJeworCQkvKiBvbmx5IG9uZSBpcyBuZWdhdGl2ZSAqLworCQlpZiAoYV9uZWcpCisJCQl7IHRtcD1hOyBhPWI7IGI9dG1wOyB9CisKKwkJLyogd2UgYXJlIG5vdyBhIC0gYiAqLworCisJCWlmIChCTl91Y21wKGEsYikgPCAwKQorCQkJeworCQkJaWYgKCFCTl91c3ViKHIsYixhKSkgcmV0dXJuKDApOworCQkJci0+bmVnPTE7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmICghQk5fdXN1YihyLGEsYikpIHJldHVybigwKTsKKwkJCXItPm5lZz0wOworCQkJfQorCQlyZXR1cm4oMSk7CisJCX0KKworCXJldCA9IEJOX3VhZGQocixhLGIpOworCXItPm5lZyA9IGFfbmVnOworCWJuX2NoZWNrX3RvcChyKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogdW5zaWduZWQgYWRkIG9mIGIgdG8gYSAqLworaW50IEJOX3VhZGQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYikKKwl7CisJaW50IG1heCxtaW4sZGlmOworCUJOX1VMT05HICphcCwqYnAsKnJwLGNhcnJ5LHQxLHQyOworCWNvbnN0IEJJR05VTSAqdG1wOworCisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChiKTsKKworCWlmIChhLT50b3AgPCBiLT50b3ApCisJCXsgdG1wPWE7IGE9YjsgYj10bXA7IH0KKwltYXggPSBhLT50b3A7CisJbWluID0gYi0+dG9wOworCWRpZiA9IG1heCAtIG1pbjsKKworCWlmIChibl93ZXhwYW5kKHIsbWF4KzEpID09IE5VTEwpCisJCXJldHVybiAwOworCisJci0+dG9wPW1heDsKKworCisJYXA9YS0+ZDsKKwlicD1iLT5kOworCXJwPXItPmQ7CisKKwljYXJyeT1ibl9hZGRfd29yZHMocnAsYXAsYnAsbWluKTsKKwlycCs9bWluOworCWFwKz1taW47CisJYnArPW1pbjsKKworCWlmIChjYXJyeSkKKwkJeworCQl3aGlsZSAoZGlmKQorCQkJeworCQkJZGlmLS07CisJCQl0MSA9ICooYXArKyk7CisJCQl0MiA9ICh0MSsxKSAmIEJOX01BU0syOworCQkJKihycCsrKSA9IHQyOworCQkJaWYgKHQyKQorCQkJCXsKKwkJCQljYXJyeT0wOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJaWYgKGNhcnJ5KQorCQkJeworCQkJLyogY2FycnkgIT0gMCA9PiBkaWYgPT0gMCAqLworCQkJKnJwID0gMTsKKwkJCXItPnRvcCsrOworCQkJfQorCQl9CisJaWYgKGRpZiAmJiBycCAhPSBhcCkKKwkJd2hpbGUgKGRpZi0tKQorCQkJLyogY29weSByZW1haW5pbmcgd29yZHMgaWYgYXAgIT0gcnAgKi8KKwkJCSoocnArKykgPSAqKGFwKyspOworCXItPm5lZyA9IDA7CisJYm5fY2hlY2tfdG9wKHIpOworCXJldHVybiAxOworCX0KKworLyogdW5zaWduZWQgc3VidHJhY3Rpb24gb2YgYiBmcm9tIGEsIGEgbXVzdCBiZSBsYXJnZXIgdGhhbiBiLiAqLworaW50IEJOX3VzdWIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYikKKwl7CisJaW50IG1heCxtaW4sZGlmOworCXJlZ2lzdGVyIEJOX1VMT05HIHQxLHQyLCphcCwqYnAsKnJwOworCWludCBpLGNhcnJ5OworI2lmIGRlZmluZWQoSVJJWF9DQ19CVUcpICYmICFkZWZpbmVkKExJTlQpCisJaW50IGR1bW15OworI2VuZGlmCisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKGIpOworCisJbWF4ID0gYS0+dG9wOworCW1pbiA9IGItPnRvcDsKKwlkaWYgPSBtYXggLSBtaW47CisKKwlpZiAoZGlmIDwgMCkJLyogaG1tLi4uIHNob3VsZCBub3QgYmUgaGFwcGVuaW5nICovCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9VU1VCLEJOX1JfQVJHMl9MVF9BUkczKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlpZiAoYm5fd2V4cGFuZChyLG1heCkgPT0gTlVMTCkgcmV0dXJuKDApOworCisJYXA9YS0+ZDsKKwlicD1iLT5kOworCXJwPXItPmQ7CisKKyNpZiAxCisJY2Fycnk9MDsKKwlmb3IgKGkgPSBtaW47IGkgIT0gMDsgaS0tKQorCQl7CisJCXQxPSAqKGFwKyspOworCQl0Mj0gKihicCsrKTsKKwkJaWYgKGNhcnJ5KQorCQkJeworCQkJY2Fycnk9KHQxIDw9IHQyKTsKKwkJCXQxPSh0MS10Mi0xKSZCTl9NQVNLMjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJY2Fycnk9KHQxIDwgdDIpOworCQkJdDE9KHQxLXQyKSZCTl9NQVNLMjsKKwkJCX0KKyNpZiBkZWZpbmVkKElSSVhfQ0NfQlVHKSAmJiAhZGVmaW5lZChMSU5UKQorCQlkdW1teT10MTsKKyNlbmRpZgorCQkqKHJwKyspPXQxJkJOX01BU0syOworCQl9CisjZWxzZQorCWNhcnJ5PWJuX3N1Yl93b3JkcyhycCxhcCxicCxtaW4pOworCWFwKz1taW47CisJYnArPW1pbjsKKwlycCs9bWluOworI2VuZGlmCisJaWYgKGNhcnJ5KSAvKiBzdWJ0cmFjdGVkICovCisJCXsKKwkJaWYgKCFkaWYpCisJCQkvKiBlcnJvcjogYSA8IGIgKi8KKwkJCXJldHVybiAwOworCQl3aGlsZSAoZGlmKQorCQkJeworCQkJZGlmLS07CisJCQl0MSA9ICooYXArKyk7CisJCQl0MiA9ICh0MS0xKSZCTl9NQVNLMjsKKwkJCSoocnArKykgPSB0MjsKKwkJCWlmICh0MSkKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorI2lmIDAKKwltZW1jcHkocnAsYXAsc2l6ZW9mKCpycCkqKG1heC1pKSk7CisjZWxzZQorCWlmIChycCAhPSBhcCkKKwkJeworCQlmb3IgKDs7KQorCQkJeworCQkJaWYgKCFkaWYtLSkgYnJlYWs7CisJCQlycFswXT1hcFswXTsKKwkJCWlmICghZGlmLS0pIGJyZWFrOworCQkJcnBbMV09YXBbMV07CisJCQlpZiAoIWRpZi0tKSBicmVhazsKKwkJCXJwWzJdPWFwWzJdOworCQkJaWYgKCFkaWYtLSkgYnJlYWs7CisJCQlycFszXT1hcFszXTsKKwkJCXJwKz00OworCQkJYXArPTQ7CisJCQl9CisJCX0KKyNlbmRpZgorCisJci0+dG9wPW1heDsKKwlyLT5uZWc9MDsKKwlibl9jb3JyZWN0X3RvcChyKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgQk5fc3ViKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpCisJeworCWludCBtYXg7CisJaW50IGFkZD0wLG5lZz0wOworCWNvbnN0IEJJR05VTSAqdG1wOworCisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChiKTsKKworCS8qICBhIC0gIGIJYS1iCisJICogIGEgLSAtYglhK2IKKwkgKiAtYSAtICBiCS0oYStiKQorCSAqIC1hIC0gLWIJYi1hCisJICovCisJaWYgKGEtPm5lZykKKwkJeworCQlpZiAoYi0+bmVnKQorCQkJeyB0bXA9YTsgYT1iOyBiPXRtcDsgfQorCQllbHNlCisJCQl7IGFkZD0xOyBuZWc9MTsgfQorCQl9CisJZWxzZQorCQl7CisJCWlmIChiLT5uZWcpIHsgYWRkPTE7IG5lZz0wOyB9CisJCX0KKworCWlmIChhZGQpCisJCXsKKwkJaWYgKCFCTl91YWRkKHIsYSxiKSkgcmV0dXJuKDApOworCQlyLT5uZWc9bmVnOworCQlyZXR1cm4oMSk7CisJCX0KKworCS8qIFdlIGFyZSBhY3R1YWxseSBkb2luZyBhIC0gYiA6LSkgKi8KKworCW1heD0oYS0+dG9wID4gYi0+dG9wKT9hLT50b3A6Yi0+dG9wOworCWlmIChibl93ZXhwYW5kKHIsbWF4KSA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKEJOX3VjbXAoYSxiKSA8IDApCisJCXsKKwkJaWYgKCFCTl91c3ViKHIsYixhKSkgcmV0dXJuKDApOworCQlyLT5uZWc9MTsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIUJOX3VzdWIocixhLGIpKSByZXR1cm4oMCk7CisJCXItPm5lZz0wOworCQl9CisJYm5fY2hlY2tfdG9wKHIpOworCXJldHVybigxKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9hc20uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9hc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNjOTFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2FzbS5jCkBAIC0wLDAgKzEsMTAzMCBAQAorLyogY3J5cHRvL2JuL2JuX2FzbS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgQk5fREVCVUcKKyMgdW5kZWYgTkRFQlVHIC8qIGF2b2lkIGNvbmZsaWN0aW5nIGRlZmluaXRpb25zICovCisjIGRlZmluZSBOREVCVUcKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgImJuX2xjbC5oIgorCisjaWYgZGVmaW5lZChCTl9MTE9ORykgfHwgZGVmaW5lZChCTl9VTVVMVF9ISUdIKQorCitCTl9VTE9ORyBibl9tdWxfYWRkX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBpbnQgbnVtLCBCTl9VTE9ORyB3KQorCXsKKwlCTl9VTE9ORyBjMT0wOworCisJYXNzZXJ0KG51bSA+PSAwKTsKKwlpZiAobnVtIDw9IDApIHJldHVybihjMSk7CisKKyNpZm5kZWYgT1BFTlNTTF9TTUFMTF9GT09UUFJJTlQKKwl3aGlsZSAobnVtJn4zKQorCQl7CisJCW11bF9hZGQocnBbMF0sYXBbMF0sdyxjMSk7CisJCW11bF9hZGQocnBbMV0sYXBbMV0sdyxjMSk7CisJCW11bF9hZGQocnBbMl0sYXBbMl0sdyxjMSk7CisJCW11bF9hZGQocnBbM10sYXBbM10sdyxjMSk7CisJCWFwKz00OyBycCs9NDsgbnVtLT00OworCQl9CisjZW5kaWYKKwl3aGlsZSAobnVtKQorCQl7CisJCW11bF9hZGQocnBbMF0sYXBbMF0sdyxjMSk7CisJCWFwKys7IHJwKys7IG51bS0tOworCQl9CisJCisJcmV0dXJuKGMxKTsKKwl9IAorCitCTl9VTE9ORyBibl9tdWxfd29yZHMoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGludCBudW0sIEJOX1VMT05HIHcpCisJeworCUJOX1VMT05HIGMxPTA7CisKKwlhc3NlcnQobnVtID49IDApOworCWlmIChudW0gPD0gMCkgcmV0dXJuKGMxKTsKKworI2lmbmRlZiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVAorCXdoaWxlIChudW0mfjMpCisJCXsKKwkJbXVsKHJwWzBdLGFwWzBdLHcsYzEpOworCQltdWwocnBbMV0sYXBbMV0sdyxjMSk7CisJCW11bChycFsyXSxhcFsyXSx3LGMxKTsKKwkJbXVsKHJwWzNdLGFwWzNdLHcsYzEpOworCQlhcCs9NDsgcnArPTQ7IG51bS09NDsKKwkJfQorI2VuZGlmCisJd2hpbGUgKG51bSkKKwkJeworCQltdWwocnBbMF0sYXBbMF0sdyxjMSk7CisJCWFwKys7IHJwKys7IG51bS0tOworCQl9CisJcmV0dXJuKGMxKTsKKwl9IAorCit2b2lkIGJuX3Nxcl93b3JkcyhCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEsIGludCBuKQorICAgICAgICB7CisJYXNzZXJ0KG4gPj0gMCk7CisJaWYgKG4gPD0gMCkgcmV0dXJuOworCisjaWZuZGVmIE9QRU5TU0xfU01BTExfRk9PVFBSSU5UCisJd2hpbGUgKG4mfjMpCisJCXsKKwkJc3FyKHJbMF0sclsxXSxhWzBdKTsKKwkJc3FyKHJbMl0sclszXSxhWzFdKTsKKwkJc3FyKHJbNF0scls1XSxhWzJdKTsKKwkJc3FyKHJbNl0scls3XSxhWzNdKTsKKwkJYSs9NDsgcis9ODsgbi09NDsKKwkJfQorI2VuZGlmCisJd2hpbGUgKG4pCisJCXsKKwkJc3FyKHJbMF0sclsxXSxhWzBdKTsKKwkJYSsrOyByKz0yOyBuLS07CisJCX0KKwl9CisKKyNlbHNlIC8qICEoZGVmaW5lZChCTl9MTE9ORykgfHwgZGVmaW5lZChCTl9VTVVMVF9ISUdIKSkgKi8KKworQk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdykKKwl7CisJQk5fVUxPTkcgYz0wOworCUJOX1VMT05HIGJsLGJoOworCisJYXNzZXJ0KG51bSA+PSAwKTsKKwlpZiAobnVtIDw9IDApIHJldHVybigoQk5fVUxPTkcpMCk7CisKKwlibD1MQklUUyh3KTsKKwliaD1IQklUUyh3KTsKKworI2lmbmRlZiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVAorCXdoaWxlIChudW0mfjMpCisJCXsKKwkJbXVsX2FkZChycFswXSxhcFswXSxibCxiaCxjKTsKKwkJbXVsX2FkZChycFsxXSxhcFsxXSxibCxiaCxjKTsKKwkJbXVsX2FkZChycFsyXSxhcFsyXSxibCxiaCxjKTsKKwkJbXVsX2FkZChycFszXSxhcFszXSxibCxiaCxjKTsKKwkJYXArPTQ7IHJwKz00OyBudW0tPTQ7CisJCX0KKyNlbmRpZgorCXdoaWxlIChudW0pCisJCXsKKwkJbXVsX2FkZChycFswXSxhcFswXSxibCxiaCxjKTsKKwkJYXArKzsgcnArKzsgbnVtLS07CisJCX0KKwlyZXR1cm4oYyk7CisJfSAKKworQk5fVUxPTkcgYm5fbXVsX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBpbnQgbnVtLCBCTl9VTE9ORyB3KQorCXsKKwlCTl9VTE9ORyBjYXJyeT0wOworCUJOX1VMT05HIGJsLGJoOworCisJYXNzZXJ0KG51bSA+PSAwKTsKKwlpZiAobnVtIDw9IDApIHJldHVybigoQk5fVUxPTkcpMCk7CisKKwlibD1MQklUUyh3KTsKKwliaD1IQklUUyh3KTsKKworI2lmbmRlZiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVAorCXdoaWxlIChudW0mfjMpCisJCXsKKwkJbXVsKHJwWzBdLGFwWzBdLGJsLGJoLGNhcnJ5KTsKKwkJbXVsKHJwWzFdLGFwWzFdLGJsLGJoLGNhcnJ5KTsKKwkJbXVsKHJwWzJdLGFwWzJdLGJsLGJoLGNhcnJ5KTsKKwkJbXVsKHJwWzNdLGFwWzNdLGJsLGJoLGNhcnJ5KTsKKwkJYXArPTQ7IHJwKz00OyBudW0tPTQ7CisJCX0KKyNlbmRpZgorCXdoaWxlIChudW0pCisJCXsKKwkJbXVsKHJwWzBdLGFwWzBdLGJsLGJoLGNhcnJ5KTsKKwkJYXArKzsgcnArKzsgbnVtLS07CisJCX0KKwlyZXR1cm4oY2FycnkpOworCX0gCisKK3ZvaWQgYm5fc3FyX3dvcmRzKEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSwgaW50IG4pCisgICAgICAgIHsKKwlhc3NlcnQobiA+PSAwKTsKKwlpZiAobiA8PSAwKSByZXR1cm47CisKKyNpZm5kZWYgT1BFTlNTTF9TTUFMTF9GT09UUFJJTlQKKwl3aGlsZSAobiZ+MykKKwkJeworCQlzcXI2NChyWzBdLHJbMV0sYVswXSk7CisJCXNxcjY0KHJbMl0sclszXSxhWzFdKTsKKwkJc3FyNjQocls0XSxyWzVdLGFbMl0pOworCQlzcXI2NChyWzZdLHJbN10sYVszXSk7CisJCWErPTQ7IHIrPTg7IG4tPTQ7CisJCX0KKyNlbmRpZgorCXdoaWxlIChuKQorCQl7CisJCXNxcjY0KHJbMF0sclsxXSxhWzBdKTsKKwkJYSsrOyByKz0yOyBuLS07CisJCX0KKwl9CisKKyNlbmRpZiAvKiAhKGRlZmluZWQoQk5fTExPTkcpIHx8IGRlZmluZWQoQk5fVU1VTFRfSElHSCkpICovCisKKyNpZiBkZWZpbmVkKEJOX0xMT05HKSAmJiBkZWZpbmVkKEJOX0RJVjJXKQorCitCTl9VTE9ORyBibl9kaXZfd29yZHMoQk5fVUxPTkcgaCwgQk5fVUxPTkcgbCwgQk5fVUxPTkcgZCkKKwl7CisJcmV0dXJuKChCTl9VTE9ORykoKCgoKEJOX1VMTE9ORyloKTw8Qk5fQklUUzIpfGwpLyhCTl9VTExPTkcpZCkpOworCX0KKworI2Vsc2UKKworLyogRGl2aWRlIGgsbCBieSBkIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gKi8KKy8qIEkgbmVlZCB0byB0ZXN0IHRoaXMgc29tZSBtb3JlIDotKCAqLworQk5fVUxPTkcgYm5fZGl2X3dvcmRzKEJOX1VMT05HIGgsIEJOX1VMT05HIGwsIEJOX1VMT05HIGQpCisJeworCUJOX1VMT05HIGRoLGRsLHEscmV0PTAsdGgsdGwsdDsKKwlpbnQgaSxjb3VudD0yOworCisJaWYgKGQgPT0gMCkgcmV0dXJuKEJOX01BU0syKTsKKworCWk9Qk5fbnVtX2JpdHNfd29yZChkKTsKKwlhc3NlcnQoKGkgPT0gQk5fQklUUzIpIHx8IChoIDw9IChCTl9VTE9ORykxPDxpKSk7CisKKwlpPUJOX0JJVFMyLWk7CisJaWYgKGggPj0gZCkgaC09ZDsKKworCWlmIChpKQorCQl7CisJCWQ8PD1pOworCQloPShoPDxpKXwobD4+KEJOX0JJVFMyLWkpKTsKKwkJbDw8PWk7CisJCX0KKwlkaD0oZCZCTl9NQVNLMmgpPj5CTl9CSVRTNDsKKwlkbD0oZCZCTl9NQVNLMmwpOworCWZvciAoOzspCisJCXsKKwkJaWYgKChoPj5CTl9CSVRTNCkgPT0gZGgpCisJCQlxPUJOX01BU0sybDsKKwkJZWxzZQorCQkJcT1oL2RoOworCisJCXRoPXEqZGg7CisJCXRsPWRsKnE7CisJCWZvciAoOzspCisJCQl7CisJCQl0PWgtdGg7CisJCQlpZiAoKHQmQk5fTUFTSzJoKSB8fAorCQkJCSgodGwpIDw9ICgKKwkJCQkJKHQ8PEJOX0JJVFM0KXwKKwkJCQkJKChsJkJOX01BU0syaCk+PkJOX0JJVFM0KSkpKQorCQkJCWJyZWFrOworCQkJcS0tOworCQkJdGgtPWRoOworCQkJdGwtPWRsOworCQkJfQorCQl0PSh0bD4+Qk5fQklUUzQpOworCQl0bD0odGw8PEJOX0JJVFM0KSZCTl9NQVNLMmg7CisJCXRoKz10OworCisJCWlmIChsIDwgdGwpIHRoKys7CisJCWwtPXRsOworCQlpZiAoaCA8IHRoKQorCQkJeworCQkJaCs9ZDsKKwkJCXEtLTsKKwkJCX0KKwkJaC09dGg7CisKKwkJaWYgKC0tY291bnQgPT0gMCkgYnJlYWs7CisKKwkJcmV0PXE8PEJOX0JJVFM0OworCQloPSgoaDw8Qk5fQklUUzQpfChsPj5CTl9CSVRTNCkpJkJOX01BU0syOworCQlsPShsJkJOX01BU0sybCk8PEJOX0JJVFM0OworCQl9CisJcmV0fD1xOworCXJldHVybihyZXQpOworCX0KKyNlbmRpZiAvKiAhZGVmaW5lZChCTl9MTE9ORykgJiYgZGVmaW5lZChCTl9ESVYyVykgKi8KKworI2lmZGVmIEJOX0xMT05HCitCTl9VTE9ORyBibl9hZGRfd29yZHMoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwgaW50IG4pCisgICAgICAgIHsKKwlCTl9VTExPTkcgbGw9MDsKKworCWFzc2VydChuID49IDApOworCWlmIChuIDw9IDApIHJldHVybigoQk5fVUxPTkcpMCk7CisKKyNpZm5kZWYgT1BFTlNTTF9TTUFMTF9GT09UUFJJTlQKKwl3aGlsZSAobiZ+MykKKwkJeworCQlsbCs9KEJOX1VMTE9ORylhWzBdK2JbMF07CisJCXJbMF09KEJOX1VMT05HKWxsJkJOX01BU0syOworCQlsbD4+PUJOX0JJVFMyOworCQlsbCs9KEJOX1VMTE9ORylhWzFdK2JbMV07CisJCXJbMV09KEJOX1VMT05HKWxsJkJOX01BU0syOworCQlsbD4+PUJOX0JJVFMyOworCQlsbCs9KEJOX1VMTE9ORylhWzJdK2JbMl07CisJCXJbMl09KEJOX1VMT05HKWxsJkJOX01BU0syOworCQlsbD4+PUJOX0JJVFMyOworCQlsbCs9KEJOX1VMTE9ORylhWzNdK2JbM107CisJCXJbM109KEJOX1VMT05HKWxsJkJOX01BU0syOworCQlsbD4+PUJOX0JJVFMyOworCQlhKz00OyBiKz00OyByKz00OyBuLT00OworCQl9CisjZW5kaWYKKwl3aGlsZSAobikKKwkJeworCQlsbCs9KEJOX1VMTE9ORylhWzBdK2JbMF07CisJCXJbMF09KEJOX1VMT05HKWxsJkJOX01BU0syOworCQlsbD4+PUJOX0JJVFMyOworCQlhKys7IGIrKzsgcisrOyBuLS07CisJCX0KKwlyZXR1cm4oKEJOX1VMT05HKWxsKTsKKwl9CisjZWxzZSAvKiAhQk5fTExPTkcgKi8KK0JOX1VMT05HIGJuX2FkZF93b3JkcyhCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEsIGNvbnN0IEJOX1VMT05HICpiLCBpbnQgbikKKyAgICAgICAgeworCUJOX1VMT05HIGMsbCx0OworCisJYXNzZXJ0KG4gPj0gMCk7CisJaWYgKG4gPD0gMCkgcmV0dXJuKChCTl9VTE9ORykwKTsKKworCWM9MDsKKyNpZm5kZWYgT1BFTlNTTF9TTUFMTF9GT09UUFJJTlQKKwl3aGlsZSAobiZ+MykKKwkJeworCQl0PWFbMF07CisJCXQ9KHQrYykmQk5fTUFTSzI7CisJCWM9KHQgPCBjKTsKKwkJbD0odCtiWzBdKSZCTl9NQVNLMjsKKwkJYys9KGwgPCB0KTsKKwkJclswXT1sOworCQl0PWFbMV07CisJCXQ9KHQrYykmQk5fTUFTSzI7CisJCWM9KHQgPCBjKTsKKwkJbD0odCtiWzFdKSZCTl9NQVNLMjsKKwkJYys9KGwgPCB0KTsKKwkJclsxXT1sOworCQl0PWFbMl07CisJCXQ9KHQrYykmQk5fTUFTSzI7CisJCWM9KHQgPCBjKTsKKwkJbD0odCtiWzJdKSZCTl9NQVNLMjsKKwkJYys9KGwgPCB0KTsKKwkJclsyXT1sOworCQl0PWFbM107CisJCXQ9KHQrYykmQk5fTUFTSzI7CisJCWM9KHQgPCBjKTsKKwkJbD0odCtiWzNdKSZCTl9NQVNLMjsKKwkJYys9KGwgPCB0KTsKKwkJclszXT1sOworCQlhKz00OyBiKz00OyByKz00OyBuLT00OworCQl9CisjZW5kaWYKKwl3aGlsZShuKQorCQl7CisJCXQ9YVswXTsKKwkJdD0odCtjKSZCTl9NQVNLMjsKKwkJYz0odCA8IGMpOworCQlsPSh0K2JbMF0pJkJOX01BU0syOworCQljKz0obCA8IHQpOworCQlyWzBdPWw7CisJCWErKzsgYisrOyByKys7IG4tLTsKKwkJfQorCXJldHVybigoQk5fVUxPTkcpYyk7CisJfQorI2VuZGlmIC8qICFCTl9MTE9ORyAqLworCitCTl9VTE9ORyBibl9zdWJfd29yZHMoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwgaW50IG4pCisgICAgICAgIHsKKwlCTl9VTE9ORyB0MSx0MjsKKwlpbnQgYz0wOworCisJYXNzZXJ0KG4gPj0gMCk7CisJaWYgKG4gPD0gMCkgcmV0dXJuKChCTl9VTE9ORykwKTsKKworI2lmbmRlZiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVAorCXdoaWxlIChuJn4zKQorCQl7CisJCXQxPWFbMF07IHQyPWJbMF07CisJCXJbMF09KHQxLXQyLWMpJkJOX01BU0syOworCQlpZiAodDEgIT0gdDIpIGM9KHQxIDwgdDIpOworCQl0MT1hWzFdOyB0Mj1iWzFdOworCQlyWzFdPSh0MS10Mi1jKSZCTl9NQVNLMjsKKwkJaWYgKHQxICE9IHQyKSBjPSh0MSA8IHQyKTsKKwkJdDE9YVsyXTsgdDI9YlsyXTsKKwkJclsyXT0odDEtdDItYykmQk5fTUFTSzI7CisJCWlmICh0MSAhPSB0MikgYz0odDEgPCB0Mik7CisJCXQxPWFbM107IHQyPWJbM107CisJCXJbM109KHQxLXQyLWMpJkJOX01BU0syOworCQlpZiAodDEgIT0gdDIpIGM9KHQxIDwgdDIpOworCQlhKz00OyBiKz00OyByKz00OyBuLT00OworCQl9CisjZW5kaWYKKwl3aGlsZSAobikKKwkJeworCQl0MT1hWzBdOyB0Mj1iWzBdOworCQlyWzBdPSh0MS10Mi1jKSZCTl9NQVNLMjsKKwkJaWYgKHQxICE9IHQyKSBjPSh0MSA8IHQyKTsKKwkJYSsrOyBiKys7IHIrKzsgbi0tOworCQl9CisJcmV0dXJuKGMpOworCX0KKworI2lmIGRlZmluZWQoQk5fTVVMX0NPTUJBKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVCkKKworI3VuZGVmIGJuX211bF9jb21iYTgKKyN1bmRlZiBibl9tdWxfY29tYmE0CisjdW5kZWYgYm5fc3FyX2NvbWJhOAorI3VuZGVmIGJuX3Nxcl9jb21iYTQKKworLyogbXVsX2FkZF9jKGEsYixjMCxjMSxjMikgIC0tIGMrPWEqYiBmb3IgdGhyZWUgd29yZCBudW1iZXIgYz0oYzIsYzEsYzApICovCisvKiBtdWxfYWRkX2MyKGEsYixjMCxjMSxjMikgLS0gYys9MiphKmIgZm9yIHRocmVlIHdvcmQgbnVtYmVyIGM9KGMyLGMxLGMwKSAqLworLyogc3FyX2FkZF9jKGEsaSxjMCxjMSxjMikgIC0tIGMrPWFbaV1eMiBmb3IgdGhyZWUgd29yZCBudW1iZXIgYz0oYzIsYzEsYzApICovCisvKiBzcXJfYWRkX2MyKGEsaSxjMCxjMSxjMikgLS0gYys9MiphW2ldKmFbal0gZm9yIHRocmVlIHdvcmQgbnVtYmVyIGM9KGMyLGMxLGMwKSAqLworCisjaWZkZWYgQk5fTExPTkcKKyNkZWZpbmUgbXVsX2FkZF9jKGEsYixjMCxjMSxjMikgXAorCXQ9KEJOX1VMTE9ORylhKmI7IFwKKwl0MT0oQk5fVUxPTkcpTHcodCk7IFwKKwl0Mj0oQk5fVUxPTkcpSHcodCk7IFwKKwljMD0oYzArdDEpJkJOX01BU0syOyBpZiAoKGMwKSA8IHQxKSB0MisrOyBcCisJYzE9KGMxK3QyKSZCTl9NQVNLMjsgaWYgKChjMSkgPCB0MikgYzIrKzsKKworI2RlZmluZSBtdWxfYWRkX2MyKGEsYixjMCxjMSxjMikgXAorCXQ9KEJOX1VMTE9ORylhKmI7IFwKKwl0dD0odCt0KSZCTl9NQVNLOyBcCisJaWYgKHR0IDwgdCkgYzIrKzsgXAorCXQxPShCTl9VTE9ORylMdyh0dCk7IFwKKwl0Mj0oQk5fVUxPTkcpSHcodHQpOyBcCisJYzA9KGMwK3QxKSZCTl9NQVNLMjsgIFwKKwlpZiAoKGMwIDwgdDEpICYmICgoKCsrdDIpJkJOX01BU0syKSA9PSAwKSkgYzIrKzsgXAorCWMxPShjMSt0MikmQk5fTUFTSzI7IGlmICgoYzEpIDwgdDIpIGMyKys7CisKKyNkZWZpbmUgc3FyX2FkZF9jKGEsaSxjMCxjMSxjMikgXAorCXQ9KEJOX1VMTE9ORylhW2ldKmFbaV07IFwKKwl0MT0oQk5fVUxPTkcpTHcodCk7IFwKKwl0Mj0oQk5fVUxPTkcpSHcodCk7IFwKKwljMD0oYzArdDEpJkJOX01BU0syOyBpZiAoKGMwKSA8IHQxKSB0MisrOyBcCisJYzE9KGMxK3QyKSZCTl9NQVNLMjsgaWYgKChjMSkgPCB0MikgYzIrKzsKKworI2RlZmluZSBzcXJfYWRkX2MyKGEsaSxqLGMwLGMxLGMyKSBcCisJbXVsX2FkZF9jMigoYSlbaV0sKGEpW2pdLGMwLGMxLGMyKQorCisjZWxpZiBkZWZpbmVkKEJOX1VNVUxUX0xPSEkpCisKKyNkZWZpbmUgbXVsX2FkZF9jKGEsYixjMCxjMSxjMikJewlcCisJQk5fVUxPTkcgdGE9KGEpLHRiPShiKTsJCVwKKwlCTl9VTVVMVF9MT0hJKHQxLHQyLHRhLHRiKTsJXAorCWMwICs9IHQxOyB0MiArPSAoYzA8dDEpPzE6MDsJXAorCWMxICs9IHQyOyBjMiArPSAoYzE8dDIpPzE6MDsJXAorCX0KKworI2RlZmluZSBtdWxfYWRkX2MyKGEsYixjMCxjMSxjMikgewlcCisJQk5fVUxPTkcgdGE9KGEpLHRiPShiKSx0MDsJXAorCUJOX1VNVUxUX0xPSEkodDAsdDEsdGEsdGIpOwlcCisJdDIgPSB0MSt0MTsgYzIgKz0gKHQyPHQxKT8xOjA7CVwKKwl0MSA9IHQwK3QwOyB0MiArPSAodDE8dDApPzE6MDsJXAorCWMwICs9IHQxOyB0MiArPSAoYzA8dDEpPzE6MDsJXAorCWMxICs9IHQyOyBjMiArPSAoYzE8dDIpPzE6MDsJXAorCX0KKworI2RlZmluZSBzcXJfYWRkX2MoYSxpLGMwLGMxLGMyKQl7CVwKKwlCTl9VTE9ORyB0YT0oYSlbaV07CQlcCisJQk5fVU1VTFRfTE9ISSh0MSx0Mix0YSx0YSk7CVwKKwljMCArPSB0MTsgdDIgKz0gKGMwPHQxKT8xOjA7CVwKKwljMSArPSB0MjsgYzIgKz0gKGMxPHQyKT8xOjA7CVwKKwl9CisKKyNkZWZpbmUgc3FyX2FkZF9jMihhLGksaixjMCxjMSxjMikJXAorCW11bF9hZGRfYzIoKGEpW2ldLChhKVtqXSxjMCxjMSxjMikKKworI2VsaWYgZGVmaW5lZChCTl9VTVVMVF9ISUdIKQorCisjZGVmaW5lIG11bF9hZGRfYyhhLGIsYzAsYzEsYzIpCXsJXAorCUJOX1VMT05HIHRhPShhKSx0Yj0oYik7CQlcCisJdDEgPSB0YSAqIHRiOwkJCVwKKwl0MiA9IEJOX1VNVUxUX0hJR0godGEsdGIpOwlcCisJYzAgKz0gdDE7IHQyICs9IChjMDx0MSk/MTowOwlcCisJYzEgKz0gdDI7IGMyICs9IChjMTx0Mik/MTowOwlcCisJfQorCisjZGVmaW5lIG11bF9hZGRfYzIoYSxiLGMwLGMxLGMyKSB7CVwKKwlCTl9VTE9ORyB0YT0oYSksdGI9KGIpLHQwOwlcCisJdDEgPSBCTl9VTVVMVF9ISUdIKHRhLHRiKTsJXAorCXQwID0gdGEgKiB0YjsJCQlcCisJdDIgPSB0MSt0MTsgYzIgKz0gKHQyPHQxKT8xOjA7CVwKKwl0MSA9IHQwK3QwOyB0MiArPSAodDE8dDApPzE6MDsJXAorCWMwICs9IHQxOyB0MiArPSAoYzA8dDEpPzE6MDsJXAorCWMxICs9IHQyOyBjMiArPSAoYzE8dDIpPzE6MDsJXAorCX0KKworI2RlZmluZSBzcXJfYWRkX2MoYSxpLGMwLGMxLGMyKQl7CVwKKwlCTl9VTE9ORyB0YT0oYSlbaV07CQlcCisJdDEgPSB0YSAqIHRhOwkJCVwKKwl0MiA9IEJOX1VNVUxUX0hJR0godGEsdGEpOwlcCisJYzAgKz0gdDE7IHQyICs9IChjMDx0MSk/MTowOwlcCisJYzEgKz0gdDI7IGMyICs9IChjMTx0Mik/MTowOwlcCisJfQorCisjZGVmaW5lIHNxcl9hZGRfYzIoYSxpLGosYzAsYzEsYzIpCVwKKwltdWxfYWRkX2MyKChhKVtpXSwoYSlbal0sYzAsYzEsYzIpCisKKyNlbHNlIC8qICFCTl9MTE9ORyAqLworI2RlZmluZSBtdWxfYWRkX2MoYSxiLGMwLGMxLGMyKSBcCisJdDE9TEJJVFMoYSk7IHQyPUhCSVRTKGEpOyBcCisJYmw9TEJJVFMoYik7IGJoPUhCSVRTKGIpOyBcCisJbXVsNjQodDEsdDIsYmwsYmgpOyBcCisJYzA9KGMwK3QxKSZCTl9NQVNLMjsgaWYgKChjMCkgPCB0MSkgdDIrKzsgXAorCWMxPShjMSt0MikmQk5fTUFTSzI7IGlmICgoYzEpIDwgdDIpIGMyKys7CisKKyNkZWZpbmUgbXVsX2FkZF9jMihhLGIsYzAsYzEsYzIpIFwKKwl0MT1MQklUUyhhKTsgdDI9SEJJVFMoYSk7IFwKKwlibD1MQklUUyhiKTsgYmg9SEJJVFMoYik7IFwKKwltdWw2NCh0MSx0MixibCxiaCk7IFwKKwlpZiAodDIgJiBCTl9UQklUKSBjMisrOyBcCisJdDI9KHQyK3QyKSZCTl9NQVNLMjsgXAorCWlmICh0MSAmIEJOX1RCSVQpIHQyKys7IFwKKwl0MT0odDErdDEpJkJOX01BU0syOyBcCisJYzA9KGMwK3QxKSZCTl9NQVNLMjsgIFwKKwlpZiAoKGMwIDwgdDEpICYmICgoKCsrdDIpJkJOX01BU0syKSA9PSAwKSkgYzIrKzsgXAorCWMxPShjMSt0MikmQk5fTUFTSzI7IGlmICgoYzEpIDwgdDIpIGMyKys7CisKKyNkZWZpbmUgc3FyX2FkZF9jKGEsaSxjMCxjMSxjMikgXAorCXNxcjY0KHQxLHQyLChhKVtpXSk7IFwKKwljMD0oYzArdDEpJkJOX01BU0syOyBpZiAoKGMwKSA8IHQxKSB0MisrOyBcCisJYzE9KGMxK3QyKSZCTl9NQVNLMjsgaWYgKChjMSkgPCB0MikgYzIrKzsKKworI2RlZmluZSBzcXJfYWRkX2MyKGEsaSxqLGMwLGMxLGMyKSBcCisJbXVsX2FkZF9jMigoYSlbaV0sKGEpW2pdLGMwLGMxLGMyKQorI2VuZGlmIC8qICFCTl9MTE9ORyAqLworCit2b2lkIGJuX211bF9jb21iYTgoQk5fVUxPTkcgKnIsIEJOX1VMT05HICphLCBCTl9VTE9ORyAqYikKKwl7CisjaWZkZWYgQk5fTExPTkcKKwlCTl9VTExPTkcgdDsKKyNlbHNlCisJQk5fVUxPTkcgYmwsYmg7CisjZW5kaWYKKwlCTl9VTE9ORyB0MSx0MjsKKwlCTl9VTE9ORyBjMSxjMixjMzsKKworCWMxPTA7CisJYzI9MDsKKwljMz0wOworCW11bF9hZGRfYyhhWzBdLGJbMF0sYzEsYzIsYzMpOworCXJbMF09YzE7CisJYzE9MDsKKwltdWxfYWRkX2MoYVswXSxiWzFdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVsxXSxiWzBdLGMyLGMzLGMxKTsKKwlyWzFdPWMyOworCWMyPTA7CisJbXVsX2FkZF9jKGFbMl0sYlswXSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbMV0sYlsxXSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbMF0sYlsyXSxjMyxjMSxjMik7CisJclsyXT1jMzsKKwljMz0wOworCW11bF9hZGRfYyhhWzBdLGJbM10sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzFdLGJbMl0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzJdLGJbMV0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzNdLGJbMF0sYzEsYzIsYzMpOworCXJbM109YzE7CisJYzE9MDsKKwltdWxfYWRkX2MoYVs0XSxiWzBdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVszXSxiWzFdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVsyXSxiWzJdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVsxXSxiWzNdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVswXSxiWzRdLGMyLGMzLGMxKTsKKwlyWzRdPWMyOworCWMyPTA7CisJbXVsX2FkZF9jKGFbMF0sYls1XSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbMV0sYls0XSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbMl0sYlszXSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbM10sYlsyXSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbNF0sYlsxXSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbNV0sYlswXSxjMyxjMSxjMik7CisJcls1XT1jMzsKKwljMz0wOworCW11bF9hZGRfYyhhWzZdLGJbMF0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzVdLGJbMV0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzRdLGJbMl0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzNdLGJbM10sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzJdLGJbNF0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzFdLGJbNV0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzBdLGJbNl0sYzEsYzIsYzMpOworCXJbNl09YzE7CisJYzE9MDsKKwltdWxfYWRkX2MoYVswXSxiWzddLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVsxXSxiWzZdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVsyXSxiWzVdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVszXSxiWzRdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVs0XSxiWzNdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVs1XSxiWzJdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVs2XSxiWzFdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVs3XSxiWzBdLGMyLGMzLGMxKTsKKwlyWzddPWMyOworCWMyPTA7CisJbXVsX2FkZF9jKGFbN10sYlsxXSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbNl0sYlsyXSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbNV0sYlszXSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbNF0sYls0XSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbM10sYls1XSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbMl0sYls2XSxjMyxjMSxjMik7CisJbXVsX2FkZF9jKGFbMV0sYls3XSxjMyxjMSxjMik7CisJcls4XT1jMzsKKwljMz0wOworCW11bF9hZGRfYyhhWzJdLGJbN10sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzNdLGJbNl0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzRdLGJbNV0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzVdLGJbNF0sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzZdLGJbM10sYzEsYzIsYzMpOworCW11bF9hZGRfYyhhWzddLGJbMl0sYzEsYzIsYzMpOworCXJbOV09YzE7CisJYzE9MDsKKwltdWxfYWRkX2MoYVs3XSxiWzNdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVs2XSxiWzRdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVs1XSxiWzVdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVs0XSxiWzZdLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVszXSxiWzddLGMyLGMzLGMxKTsKKwlyWzEwXT1jMjsKKwljMj0wOworCW11bF9hZGRfYyhhWzRdLGJbN10sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzVdLGJbNl0sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzZdLGJbNV0sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzddLGJbNF0sYzMsYzEsYzIpOworCXJbMTFdPWMzOworCWMzPTA7CisJbXVsX2FkZF9jKGFbN10sYls1XSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbNl0sYls2XSxjMSxjMixjMyk7CisJbXVsX2FkZF9jKGFbNV0sYls3XSxjMSxjMixjMyk7CisJclsxMl09YzE7CisJYzE9MDsKKwltdWxfYWRkX2MoYVs2XSxiWzddLGMyLGMzLGMxKTsKKwltdWxfYWRkX2MoYVs3XSxiWzZdLGMyLGMzLGMxKTsKKwlyWzEzXT1jMjsKKwljMj0wOworCW11bF9hZGRfYyhhWzddLGJbN10sYzMsYzEsYzIpOworCXJbMTRdPWMzOworCXJbMTVdPWMxOworCX0KKwordm9pZCBibl9tdWxfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpCisJeworI2lmZGVmIEJOX0xMT05HCisJQk5fVUxMT05HIHQ7CisjZWxzZQorCUJOX1VMT05HIGJsLGJoOworI2VuZGlmCisJQk5fVUxPTkcgdDEsdDI7CisJQk5fVUxPTkcgYzEsYzIsYzM7CisKKwljMT0wOworCWMyPTA7CisJYzM9MDsKKwltdWxfYWRkX2MoYVswXSxiWzBdLGMxLGMyLGMzKTsKKwlyWzBdPWMxOworCWMxPTA7CisJbXVsX2FkZF9jKGFbMF0sYlsxXSxjMixjMyxjMSk7CisJbXVsX2FkZF9jKGFbMV0sYlswXSxjMixjMyxjMSk7CisJclsxXT1jMjsKKwljMj0wOworCW11bF9hZGRfYyhhWzJdLGJbMF0sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzFdLGJbMV0sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzBdLGJbMl0sYzMsYzEsYzIpOworCXJbMl09YzM7CisJYzM9MDsKKwltdWxfYWRkX2MoYVswXSxiWzNdLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoYVsxXSxiWzJdLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoYVsyXSxiWzFdLGMxLGMyLGMzKTsKKwltdWxfYWRkX2MoYVszXSxiWzBdLGMxLGMyLGMzKTsKKwlyWzNdPWMxOworCWMxPTA7CisJbXVsX2FkZF9jKGFbM10sYlsxXSxjMixjMyxjMSk7CisJbXVsX2FkZF9jKGFbMl0sYlsyXSxjMixjMyxjMSk7CisJbXVsX2FkZF9jKGFbMV0sYlszXSxjMixjMyxjMSk7CisJcls0XT1jMjsKKwljMj0wOworCW11bF9hZGRfYyhhWzJdLGJbM10sYzMsYzEsYzIpOworCW11bF9hZGRfYyhhWzNdLGJbMl0sYzMsYzEsYzIpOworCXJbNV09YzM7CisJYzM9MDsKKwltdWxfYWRkX2MoYVszXSxiWzNdLGMxLGMyLGMzKTsKKwlyWzZdPWMxOworCXJbN109YzI7CisJfQorCit2b2lkIGJuX3Nxcl9jb21iYTgoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphKQorCXsKKyNpZmRlZiBCTl9MTE9ORworCUJOX1VMTE9ORyB0LHR0OworI2Vsc2UKKwlCTl9VTE9ORyBibCxiaDsKKyNlbmRpZgorCUJOX1VMT05HIHQxLHQyOworCUJOX1VMT05HIGMxLGMyLGMzOworCisJYzE9MDsKKwljMj0wOworCWMzPTA7CisJc3FyX2FkZF9jKGEsMCxjMSxjMixjMyk7CisJclswXT1jMTsKKwljMT0wOworCXNxcl9hZGRfYzIoYSwxLDAsYzIsYzMsYzEpOworCXJbMV09YzI7CisJYzI9MDsKKwlzcXJfYWRkX2MoYSwxLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKGEsMiwwLGMzLGMxLGMyKTsKKwlyWzJdPWMzOworCWMzPTA7CisJc3FyX2FkZF9jMihhLDMsMCxjMSxjMixjMyk7CisJc3FyX2FkZF9jMihhLDIsMSxjMSxjMixjMyk7CisJclszXT1jMTsKKwljMT0wOworCXNxcl9hZGRfYyhhLDIsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoYSwzLDEsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoYSw0LDAsYzIsYzMsYzEpOworCXJbNF09YzI7CisJYzI9MDsKKwlzcXJfYWRkX2MyKGEsNSwwLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKGEsNCwxLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKGEsMywyLGMzLGMxLGMyKTsKKwlyWzVdPWMzOworCWMzPTA7CisJc3FyX2FkZF9jKGEsMyxjMSxjMixjMyk7CisJc3FyX2FkZF9jMihhLDQsMixjMSxjMixjMyk7CisJc3FyX2FkZF9jMihhLDUsMSxjMSxjMixjMyk7CisJc3FyX2FkZF9jMihhLDYsMCxjMSxjMixjMyk7CisJcls2XT1jMTsKKwljMT0wOworCXNxcl9hZGRfYzIoYSw3LDAsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoYSw2LDEsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoYSw1LDIsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoYSw0LDMsYzIsYzMsYzEpOworCXJbN109YzI7CisJYzI9MDsKKwlzcXJfYWRkX2MoYSw0LGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKGEsNSwzLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKGEsNiwyLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKGEsNywxLGMzLGMxLGMyKTsKKwlyWzhdPWMzOworCWMzPTA7CisJc3FyX2FkZF9jMihhLDcsMixjMSxjMixjMyk7CisJc3FyX2FkZF9jMihhLDYsMyxjMSxjMixjMyk7CisJc3FyX2FkZF9jMihhLDUsNCxjMSxjMixjMyk7CisJcls5XT1jMTsKKwljMT0wOworCXNxcl9hZGRfYyhhLDUsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoYSw2LDQsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoYSw3LDMsYzIsYzMsYzEpOworCXJbMTBdPWMyOworCWMyPTA7CisJc3FyX2FkZF9jMihhLDcsNCxjMyxjMSxjMik7CisJc3FyX2FkZF9jMihhLDYsNSxjMyxjMSxjMik7CisJclsxMV09YzM7CisJYzM9MDsKKwlzcXJfYWRkX2MoYSw2LGMxLGMyLGMzKTsKKwlzcXJfYWRkX2MyKGEsNyw1LGMxLGMyLGMzKTsKKwlyWzEyXT1jMTsKKwljMT0wOworCXNxcl9hZGRfYzIoYSw3LDYsYzIsYzMsYzEpOworCXJbMTNdPWMyOworCWMyPTA7CisJc3FyX2FkZF9jKGEsNyxjMyxjMSxjMik7CisJclsxNF09YzM7CisJclsxNV09YzE7CisJfQorCit2b2lkIGJuX3Nxcl9jb21iYTQoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphKQorCXsKKyNpZmRlZiBCTl9MTE9ORworCUJOX1VMTE9ORyB0LHR0OworI2Vsc2UKKwlCTl9VTE9ORyBibCxiaDsKKyNlbmRpZgorCUJOX1VMT05HIHQxLHQyOworCUJOX1VMT05HIGMxLGMyLGMzOworCisJYzE9MDsKKwljMj0wOworCWMzPTA7CisJc3FyX2FkZF9jKGEsMCxjMSxjMixjMyk7CisJclswXT1jMTsKKwljMT0wOworCXNxcl9hZGRfYzIoYSwxLDAsYzIsYzMsYzEpOworCXJbMV09YzI7CisJYzI9MDsKKwlzcXJfYWRkX2MoYSwxLGMzLGMxLGMyKTsKKwlzcXJfYWRkX2MyKGEsMiwwLGMzLGMxLGMyKTsKKwlyWzJdPWMzOworCWMzPTA7CisJc3FyX2FkZF9jMihhLDMsMCxjMSxjMixjMyk7CisJc3FyX2FkZF9jMihhLDIsMSxjMSxjMixjMyk7CisJclszXT1jMTsKKwljMT0wOworCXNxcl9hZGRfYyhhLDIsYzIsYzMsYzEpOworCXNxcl9hZGRfYzIoYSwzLDEsYzIsYzMsYzEpOworCXJbNF09YzI7CisJYzI9MDsKKwlzcXJfYWRkX2MyKGEsMywyLGMzLGMxLGMyKTsKKwlyWzVdPWMzOworCWMzPTA7CisJc3FyX2FkZF9jKGEsMyxjMSxjMixjMyk7CisJcls2XT1jMTsKKwlyWzddPWMyOworCX0KKworI2lmZGVmIE9QRU5TU0xfTk9fQVNNCisjaWZkZWYgT1BFTlNTTF9CTl9BU01fTU9OVAorI2luY2x1ZGUgPGFsbG9jYS5oPgorLyoKKyAqIFRoaXMgaXMgZXNzZW50aWFsbHkgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCB3aGljaCBtYXkgb3IgbWF5IG5vdAorICogcmVzdWx0IGluIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50LiBFLmcuIG9uIElBLTMyIHRoaXMgcm91dGluZSB3YXMKKyAqIG9ic2VydmVkIHRvIGdpdmUgNDAlIGZhc3RlciByc2ExMDI0IHByaXZhdGUga2V5IG9wZXJhdGlvbnMgYW5kIDEwJQorICogZmFzdGVyIHJzYTQwOTYgb25lcywgd2hpbGUgb24gQU1ENjQgaXQgaW1wcm92ZXMgcnNhMTAyNCBzaWduIG9ubHkKKyAqIGJ5IDEwJSBhbmQgKndvcnNlbnMqIHJzYTQwOTYgc2lnbiBieSAxNSUuIE9uY2UgYWdhaW4sIGl0J3MgYQorICogcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCBvbmUgdG8gYmUgdXNlZCBhcyBzdGFydGluZyBwb2ludCBmb3IKKyAqIHBsYXRmb3JtLXNwZWNpZmljIGFzc2VtYmxlci4gTWVudGlvbmVkIG51bWJlcnMgYXBwbHkgdG8gY29tcGlsZXIKKyAqIGdlbmVyYXRlZCBjb2RlIGNvbXBpbGVkIHdpdGggYW5kIHdpdGhvdXQgLURPUEVOU1NMX0JOX0FTTV9NT05UIGFuZAorICogY2FuIHZhcnkgbm90IG9ubHkgZnJvbSBwbGF0Zm9ybSB0byBwbGF0Zm9ybSwgYnV0IGV2ZW4gZm9yIGNvbXBpbGVyCisgKiB2ZXJzaW9ucy4gQXNzZW1ibGVyIHZzLiBhc3NlbWJsZXIgaW1wcm92ZW1lbnQgY29lZmZpY2llbnRzIGNhbgorICogW2FuZCBhcmUga25vd24gdG9dIGRpZmZlciBhbmQgYXJlIHRvIGJlIGRvY3VtZW50ZWQgZWxzZXdoZXJlLgorICovCitpbnQgYm5fbXVsX21vbnQoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGNvbnN0IEJOX1VMT05HICpicCwgY29uc3QgQk5fVUxPTkcgKm5wLGNvbnN0IEJOX1VMT05HICpuMHAsIGludCBudW0pCisJeworCUJOX1VMT05HIGMwLGMxLG1sLCp0cCxuMDsKKyNpZmRlZiBtdWw2NAorCUJOX1VMT05HIG1oOworI2VuZGlmCisJdm9sYXRpbGUgQk5fVUxPTkcgKnZwOworCWludCBpPTAsajsKKworI2lmIDAJLyogdGVtcGxhdGUgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9uICovCisJaWYgKGFwPT1icCkJcmV0dXJuIGJuX3Nxcl9tb250KHJwLGFwLG5wLG4wcCxudW0pOworI2VuZGlmCisJdnAgPSB0cCA9IGFsbG9jYSgobnVtKzIpKnNpemVvZihCTl9VTE9ORykpOworCisJbjAgPSAqbjBwOworCisJYzAgPSAwOworCW1sID0gYnBbMF07CisjaWZkZWYgbXVsNjQKKwltaCA9IEhCSVRTKG1sKTsKKwltbCA9IExCSVRTKG1sKTsKKwlmb3IgKGo9MDtqPG51bTsrK2opCisJCW11bCh0cFtqXSxhcFtqXSxtbCxtaCxjMCk7CisjZWxzZQorCWZvciAoaj0wO2o8bnVtOysraikKKwkJbXVsKHRwW2pdLGFwW2pdLG1sLGMwKTsKKyNlbmRpZgorCisJdHBbbnVtXSAgID0gYzA7CisJdHBbbnVtKzFdID0gMDsKKwlnb3RvIGVudGVyOworCisJZm9yKGk9MDtpPG51bTtpKyspCisJCXsKKwkJYzAgPSAwOworCQltbCA9IGJwW2ldOworI2lmZGVmIG11bDY0CisJCW1oID0gSEJJVFMobWwpOworCQltbCA9IExCSVRTKG1sKTsKKwkJZm9yIChqPTA7ajxudW07KytqKQorCQkJbXVsX2FkZCh0cFtqXSxhcFtqXSxtbCxtaCxjMCk7CisjZWxzZQorCQlmb3IgKGo9MDtqPG51bTsrK2opCisJCQltdWxfYWRkKHRwW2pdLGFwW2pdLG1sLGMwKTsKKyNlbmRpZgorCQljMSA9ICh0cFtudW1dICsgYzApJkJOX01BU0syOworCQl0cFtudW1dICAgPSBjMTsKKwkJdHBbbnVtKzFdID0gKGMxPGMwPzE6MCk7CisJZW50ZXI6CisJCWMxICA9IHRwWzBdOworCQltbCA9IChjMSpuMCkmQk5fTUFTSzI7CisJCWMwID0gMDsKKyNpZmRlZiBtdWw2NAorCQltaCA9IEhCSVRTKG1sKTsKKwkJbWwgPSBMQklUUyhtbCk7CisJCW11bF9hZGQoYzEsbnBbMF0sbWwsbWgsYzApOworI2Vsc2UKKwkJbXVsX2FkZChjMSxtbCxucFswXSxjMCk7CisjZW5kaWYKKwkJZm9yKGo9MTtqPG51bTtqKyspCisJCQl7CisJCQljMSA9IHRwW2pdOworI2lmZGVmIG11bDY0CisJCQltdWxfYWRkKGMxLG5wW2pdLG1sLG1oLGMwKTsKKyNlbHNlCisJCQltdWxfYWRkKGMxLG1sLG5wW2pdLGMwKTsKKyNlbmRpZgorCQkJdHBbai0xXSA9IGMxJkJOX01BU0syOworCQkJfQorCQljMSAgICAgICAgPSAodHBbbnVtXSArIGMwKSZCTl9NQVNLMjsKKwkJdHBbbnVtLTFdID0gYzE7CisJCXRwW251bV0gICA9IHRwW251bSsxXSArIChjMTxjMD8xOjApOworCQl9CisKKwlpZiAodHBbbnVtXSE9MCB8fCB0cFtudW0tMV0+PW5wW251bS0xXSkKKwkJeworCQljMCA9IGJuX3N1Yl93b3JkcyhycCx0cCxucCxudW0pOworCQlpZiAodHBbbnVtXSE9MCB8fCBjMD09MCkKKwkJCXsKKwkJCWZvcihpPTA7aTxudW0rMjtpKyspCXZwW2ldID0gMDsKKwkJCXJldHVybiAxOworCQkJfQorCQl9CisJZm9yKGk9MDtpPG51bTtpKyspCXJwW2ldID0gdHBbaV0sCXZwW2ldID0gMDsKKwl2cFtudW1dICAgPSAwOworCXZwW251bSsxXSA9IDA7CisJcmV0dXJuIDE7CisJfQorI2Vsc2UKKy8qCisgKiBSZXR1cm4gdmFsdWUgb2YgMCBpbmRpY2F0ZXMgdGhhdCBtdWx0aXBsaWNhdGlvbi9jb252b2x1dGlvbiB3YXMgbm90CisgKiBwZXJmb3JtZWQgdG8gc2lnbmFsIHRoZSBjYWxsZXIgdG8gZmFsbCBkb3duIHRvIGFsdGVybmF0aXZlL29yaWdpbmFsCisgKiBjb2RlLXBhdGguCisgKi8KK2ludCBibl9tdWxfbW9udChCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgY29uc3QgQk5fVUxPTkcgKmJwLCBjb25zdCBCTl9VTE9ORyAqbnAsY29uc3QgQk5fVUxPTkcgKm4wLCBpbnQgbnVtKQorewlyZXR1cm4gMDsJfQorI2VuZGlmIC8qIE9QRU5TU0xfQk5fQVNNX01PTlQgKi8KKyNlbmRpZgorCisjZWxzZSAvKiAhQk5fTVVMX0NPTUJBICovCisKKy8qIGhtbS4uLiBpcyBpdCBmYXN0ZXIganVzdCB0byBkbyBhIG11bHRpcGx5PyAqLworI3VuZGVmIGJuX3Nxcl9jb21iYTQKK3ZvaWQgYm5fc3FyX2NvbWJhNChCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEpCisJeworCUJOX1VMT05HIHRbOF07CisJYm5fc3FyX25vcm1hbChyLGEsNCx0KTsKKwl9CisKKyN1bmRlZiBibl9zcXJfY29tYmE4Cit2b2lkIGJuX3Nxcl9jb21iYTgoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphKQorCXsKKwlCTl9VTE9ORyB0WzE2XTsKKwlibl9zcXJfbm9ybWFsKHIsYSw4LHQpOworCX0KKwordm9pZCBibl9tdWxfY29tYmE0KEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIpCisJeworCXJbNF09Ym5fbXVsX3dvcmRzKCAgICAmKHJbMF0pLGEsNCxiWzBdKTsKKwlyWzVdPWJuX211bF9hZGRfd29yZHMoJihyWzFdKSxhLDQsYlsxXSk7CisJcls2XT1ibl9tdWxfYWRkX3dvcmRzKCYoclsyXSksYSw0LGJbMl0pOworCXJbN109Ym5fbXVsX2FkZF93b3JkcygmKHJbM10pLGEsNCxiWzNdKTsKKwl9CisKK3ZvaWQgYm5fbXVsX2NvbWJhOChCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIEJOX1VMT05HICpiKQorCXsKKwlyWyA4XT1ibl9tdWxfd29yZHMoICAgICYoclswXSksYSw4LGJbMF0pOworCXJbIDldPWJuX211bF9hZGRfd29yZHMoJihyWzFdKSxhLDgsYlsxXSk7CisJclsxMF09Ym5fbXVsX2FkZF93b3JkcygmKHJbMl0pLGEsOCxiWzJdKTsKKwlyWzExXT1ibl9tdWxfYWRkX3dvcmRzKCYoclszXSksYSw4LGJbM10pOworCXJbMTJdPWJuX211bF9hZGRfd29yZHMoJihyWzRdKSxhLDgsYls0XSk7CisJclsxM109Ym5fbXVsX2FkZF93b3JkcygmKHJbNV0pLGEsOCxiWzVdKTsKKwlyWzE0XT1ibl9tdWxfYWRkX3dvcmRzKCYocls2XSksYSw4LGJbNl0pOworCXJbMTVdPWJuX211bF9hZGRfd29yZHMoJihyWzddKSxhLDgsYls3XSk7CisJfQorCisjaWZkZWYgT1BFTlNTTF9OT19BU00KKyNpZmRlZiBPUEVOU1NMX0JOX0FTTV9NT05UCisjaW5jbHVkZSA8YWxsb2NhLmg+CitpbnQgYm5fbXVsX21vbnQoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGNvbnN0IEJOX1VMT05HICpicCwgY29uc3QgQk5fVUxPTkcgKm5wLGNvbnN0IEJOX1VMT05HICpuMHAsIGludCBudW0pCisJeworCUJOX1VMT05HIGMwLGMxLCp0cCxuMD0qbjBwOworCXZvbGF0aWxlIEJOX1VMT05HICp2cDsKKwlpbnQgaT0wLGo7CisKKwl2cCA9IHRwID0gYWxsb2NhKChudW0rMikqc2l6ZW9mKEJOX1VMT05HKSk7CisKKwlmb3IoaT0wO2k8PW51bTtpKyspCXRwW2ldPTA7CisKKwlmb3IoaT0wO2k8bnVtO2krKykKKwkJeworCQljMCAgICAgICAgID0gYm5fbXVsX2FkZF93b3Jkcyh0cCxhcCxudW0sYnBbaV0pOworCQljMSAgICAgICAgID0gKHRwW251bV0gKyBjMCkmQk5fTUFTSzI7CisJCXRwW251bV0gICAgPSBjMTsKKwkJdHBbbnVtKzFdICA9IChjMTxjMD8xOjApOworCisJCWMwICAgICAgICAgPSBibl9tdWxfYWRkX3dvcmRzKHRwLG5wLG51bSx0cFswXSpuMCk7CisJCWMxICAgICAgICAgPSAodHBbbnVtXSArIGMwKSZCTl9NQVNLMjsKKwkJdHBbbnVtXSAgICA9IGMxOworCQl0cFtudW0rMV0gKz0gKGMxPGMwPzE6MCk7CisJCWZvcihqPTA7ajw9bnVtO2orKykJdHBbal09dHBbaisxXTsKKwkJfQorCisJaWYgKHRwW251bV0hPTAgfHwgdHBbbnVtLTFdPj1ucFtudW0tMV0pCisJCXsKKwkJYzAgPSBibl9zdWJfd29yZHMocnAsdHAsbnAsbnVtKTsKKwkJaWYgKHRwW251bV0hPTAgfHwgYzA9PTApCisJCQl7CisJCQlmb3IoaT0wO2k8bnVtKzI7aSsrKQl2cFtpXSA9IDA7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCWZvcihpPTA7aTxudW07aSsrKQlycFtpXSA9IHRwW2ldLAl2cFtpXSA9IDA7CisJdnBbbnVtXSAgID0gMDsKKwl2cFtudW0rMV0gPSAwOworCXJldHVybiAxOworCX0KKyNlbHNlCitpbnQgYm5fbXVsX21vbnQoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGNvbnN0IEJOX1VMT05HICpicCwgY29uc3QgQk5fVUxPTkcgKm5wLGNvbnN0IEJOX1VMT05HICpuMCwgaW50IG51bSkKK3sJcmV0dXJuIDA7CX0KKyNlbmRpZiAvKiBPUEVOU1NMX0JOX0FTTV9NT05UICovCisjZW5kaWYKKworI2VuZGlmIC8qICFCTl9NVUxfQ09NQkEgKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9ibGluZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2JsaW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA2MDU5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9ibGluZC5jCkBAIC0wLDAgKzEsMzc2IEBACisvKiBjcnlwdG8vYm4vYm5fYmxpbmQuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAiYm5fbGNsLmgiCisKKyNkZWZpbmUgQk5fQkxJTkRJTkdfQ09VTlRFUgkzMgorCitzdHJ1Y3QgYm5fYmxpbmRpbmdfc3QKKwl7CisJQklHTlVNICpBOworCUJJR05VTSAqQWk7CisJQklHTlVNICplOworCUJJR05VTSAqbW9kOyAvKiBqdXN0IGEgcmVmZXJlbmNlICovCisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorCXVuc2lnbmVkIGxvbmcgdGhyZWFkX2lkOyAvKiBhZGRlZCBpbiBPcGVuU1NMIDAuOS42aiBhbmQgMC45LjdiOworCQkJCSAgKiB1c2VkIG9ubHkgYnkgY3J5cHRvL3JzYS9yc2FfZWF5LmMsIHJzYV9saWIuYyAqLworI2VuZGlmCisJQ1JZUFRPX1RIUkVBRElEIHRpZDsKKwl1bnNpZ25lZCBpbnQgIGNvdW50ZXI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlCTl9NT05UX0NUWCAqbV9jdHg7CisJaW50ICgqYm5fbW9kX2V4cCkoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwkJCSAgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKwkJCSAgQk5fTU9OVF9DVFggKm1fY3R4KTsKKwl9OworCitCTl9CTElORElORyAqQk5fQkxJTkRJTkdfbmV3KGNvbnN0IEJJR05VTSAqQSwgY29uc3QgQklHTlVNICpBaSwgQklHTlVNICptb2QpCisJeworCUJOX0JMSU5ESU5HICpyZXQ9TlVMTDsKKworCWJuX2NoZWNrX3RvcChtb2QpOworCisJaWYgKChyZXQ9KEJOX0JMSU5ESU5HICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJOX0JMSU5ESU5HKSkpID09IE5VTEwpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9CTElORElOR19ORVcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwltZW1zZXQocmV0LDAsc2l6ZW9mKEJOX0JMSU5ESU5HKSk7CisJaWYgKEEgIT0gTlVMTCkKKwkJeworCQlpZiAoKHJldC0+QSAgPSBCTl9kdXAoQSkpICA9PSBOVUxMKSBnb3RvIGVycjsKKwkJfQorCWlmIChBaSAhPSBOVUxMKQorCQl7CisJCWlmICgocmV0LT5BaSA9IEJOX2R1cChBaSkpID09IE5VTEwpIGdvdG8gZXJyOworCQl9CisKKwkvKiBzYXZlIGEgY29weSBvZiBtb2QgaW4gdGhlIEJOX0JMSU5ESU5HIHN0cnVjdHVyZSAqLworCWlmICgocmV0LT5tb2QgPSBCTl9kdXAobW9kKSkgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKEJOX2dldF9mbGFncyhtb2QsIEJOX0ZMR19DT05TVFRJTUUpICE9IDApCisJCUJOX3NldF9mbGFncyhyZXQtPm1vZCwgQk5fRkxHX0NPTlNUVElNRSk7CisKKwlyZXQtPmNvdW50ZXIgPSBCTl9CTElORElOR19DT1VOVEVSOworCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZyZXQtPnRpZCk7CisJcmV0dXJuKHJldCk7CitlcnI6CisJaWYgKHJldCAhPSBOVUxMKSBCTl9CTElORElOR19mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKwordm9pZCBCTl9CTElORElOR19mcmVlKEJOX0JMSU5ESU5HICpyKQorCXsKKwlpZihyID09IE5VTEwpCisJICAgIHJldHVybjsKKworCWlmIChyLT5BICAhPSBOVUxMKSBCTl9mcmVlKHItPkEgKTsKKwlpZiAoci0+QWkgIT0gTlVMTCkgQk5fZnJlZShyLT5BaSk7CisJaWYgKHItPmUgICE9IE5VTEwpIEJOX2ZyZWUoci0+ZSApOworCWlmIChyLT5tb2QgIT0gTlVMTCkgQk5fZnJlZShyLT5tb2QpOyAKKwlPUEVOU1NMX2ZyZWUocik7CisJfQorCitpbnQgQk5fQkxJTkRJTkdfdXBkYXRlKEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldD0wOworCisJaWYgKChiLT5BID09IE5VTEwpIHx8IChiLT5BaSA9PSBOVUxMKSkKKwkJeworCQlCTmVycihCTl9GX0JOX0JMSU5ESU5HX1VQREFURSxCTl9SX05PVF9JTklUSUFMSVpFRCk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoLS0oYi0+Y291bnRlcikgPT0gMCAmJiBiLT5lICE9IE5VTEwgJiYKKwkJIShiLT5mbGFncyAmIEJOX0JMSU5ESU5HX05PX1JFQ1JFQVRFKSkKKwkJeworCQkvKiByZS1jcmVhdGUgYmxpbmRpbmcgcGFyYW1ldGVycyAqLworCQlpZiAoIUJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbShiLCBOVUxMLCBOVUxMLCBjdHgsIE5VTEwsIE5VTEwpKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlIGlmICghKGItPmZsYWdzICYgQk5fQkxJTkRJTkdfTk9fVVBEQVRFKSkKKwkJeworCQlpZiAoIUJOX21vZF9tdWwoYi0+QSxiLT5BLGItPkEsYi0+bW9kLGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX21vZF9tdWwoYi0+QWksYi0+QWksYi0+QWksYi0+bW9kLGN0eCkpIGdvdG8gZXJyOworCQl9CisKKwlyZXQ9MTsKK2VycjoKKwlpZiAoYi0+Y291bnRlciA9PSAwKQorCQliLT5jb3VudGVyID0gQk5fQkxJTkRJTkdfQ09VTlRFUjsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBCTl9CTElORElOR19jb252ZXJ0KEJJR05VTSAqbiwgQk5fQkxJTkRJTkcgKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gQk5fQkxJTkRJTkdfY29udmVydF9leChuLCBOVUxMLCBiLCBjdHgpOworCX0KKworaW50IEJOX0JMSU5ESU5HX2NvbnZlcnRfZXgoQklHTlVNICpuLCBCSUdOVU0gKnIsIEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldCA9IDE7CisKKwlibl9jaGVja190b3Aobik7CisKKwlpZiAoKGItPkEgPT0gTlVMTCkgfHwgKGItPkFpID09IE5VTEwpKQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fQkxJTkRJTkdfQ09OVkVSVF9FWCxCTl9SX05PVF9JTklUSUFMSVpFRCk7CisJCXJldHVybigwKTsKKwkJfQorCisJaWYgKHIgIT0gTlVMTCkKKwkJeworCQlpZiAoIUJOX2NvcHkociwgYi0+QWkpKSByZXQ9MDsKKwkJfQorCisJaWYgKCFCTl9tb2RfbXVsKG4sbixiLT5BLGItPm1vZCxjdHgpKSByZXQ9MDsKKwkKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEJOX0JMSU5ESU5HX2ludmVydChCSUdOVU0gKm4sIEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCkKKwl7CisJcmV0dXJuIEJOX0JMSU5ESU5HX2ludmVydF9leChuLCBOVUxMLCBiLCBjdHgpOworCX0KKworaW50IEJOX0JMSU5ESU5HX2ludmVydF9leChCSUdOVU0gKm4sIGNvbnN0IEJJR05VTSAqciwgQk5fQkxJTkRJTkcgKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0OworCisJYm5fY2hlY2tfdG9wKG4pOworCWlmICgoYi0+QSA9PSBOVUxMKSB8fCAoYi0+QWkgPT0gTlVMTCkpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9CTElORElOR19JTlZFUlRfRVgsQk5fUl9OT1RfSU5JVElBTElaRUQpOworCQlyZXR1cm4oMCk7CisJCX0KKworCWlmIChyICE9IE5VTEwpCisJCXJldCA9IEJOX21vZF9tdWwobiwgbiwgciwgYi0+bW9kLCBjdHgpOworCWVsc2UKKwkJcmV0ID0gQk5fbW9kX211bChuLCBuLCBiLT5BaSwgYi0+bW9kLCBjdHgpOworCisJaWYgKHJldCA+PSAwKQorCQl7CisJCWlmICghQk5fQkxJTkRJTkdfdXBkYXRlKGIsY3R4KSkKKwkJCXJldHVybigwKTsKKwkJfQorCWJuX2NoZWNrX3RvcChuKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECit1bnNpZ25lZCBsb25nIEJOX0JMSU5ESU5HX2dldF90aHJlYWRfaWQoY29uc3QgQk5fQkxJTkRJTkcgKmIpCisJeworCXJldHVybiBiLT50aHJlYWRfaWQ7CisJfQorCit2b2lkIEJOX0JMSU5ESU5HX3NldF90aHJlYWRfaWQoQk5fQkxJTkRJTkcgKmIsIHVuc2lnbmVkIGxvbmcgbikKKwl7CisJYi0+dGhyZWFkX2lkID0gbjsKKwl9CisjZW5kaWYKKworQ1JZUFRPX1RIUkVBRElEICpCTl9CTElORElOR190aHJlYWRfaWQoQk5fQkxJTkRJTkcgKmIpCisJeworCXJldHVybiAmYi0+dGlkOworCX0KKwordW5zaWduZWQgbG9uZyBCTl9CTElORElOR19nZXRfZmxhZ3MoY29uc3QgQk5fQkxJTkRJTkcgKmIpCisJeworCXJldHVybiBiLT5mbGFnczsKKwl9CisKK3ZvaWQgQk5fQkxJTkRJTkdfc2V0X2ZsYWdzKEJOX0JMSU5ESU5HICpiLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwliLT5mbGFncyA9IGZsYWdzOworCX0KKworQk5fQkxJTkRJTkcgKkJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbShCTl9CTElORElORyAqYiwKKwljb25zdCBCSUdOVU0gKmUsIEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsCisJaW50ICgqYm5fbW9kX2V4cCkoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwkJCSAgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwgQk5fTU9OVF9DVFggKm1fY3R4KSwKKwlCTl9NT05UX0NUWCAqbV9jdHgpCit7CisJaW50ICAgIHJldHJ5X2NvdW50ZXIgPSAzMjsKKwlCTl9CTElORElORyAqcmV0ID0gTlVMTDsKKworCWlmIChiID09IE5VTEwpCisJCXJldCA9IEJOX0JMSU5ESU5HX25ldyhOVUxMLCBOVUxMLCBtKTsKKwllbHNlCisJCXJldCA9IGI7CisKKwlpZiAocmV0ID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJaWYgKHJldC0+QSAgPT0gTlVMTCAmJiAocmV0LT5BICA9IEJOX25ldygpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAocmV0LT5BaSA9PSBOVUxMICYmIChyZXQtPkFpCT0gQk5fbmV3KCkpID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJaWYgKGUgIT0gTlVMTCkKKwkJeworCQlpZiAocmV0LT5lICE9IE5VTEwpCisJCQlCTl9mcmVlKHJldC0+ZSk7CisJCXJldC0+ZSA9IEJOX2R1cChlKTsKKwkJfQorCWlmIChyZXQtPmUgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpZiAoYm5fbW9kX2V4cCAhPSBOVUxMKQorCQlyZXQtPmJuX21vZF9leHAgPSBibl9tb2RfZXhwOworCWlmIChtX2N0eCAhPSBOVUxMKQorCQlyZXQtPm1fY3R4ID0gbV9jdHg7CisKKwlkbyB7CisJCWlmICghQk5fcmFuZF9yYW5nZShyZXQtPkEsIHJldC0+bW9kKSkgZ290byBlcnI7CisJCWlmIChCTl9tb2RfaW52ZXJzZShyZXQtPkFpLCByZXQtPkEsIHJldC0+bW9kLCBjdHgpID09IE5VTEwpCisJCQl7CisJCQkvKiB0aGlzIHNob3VsZCBhbG1vc3QgbmV2ZXIgaGFwcGVuIGZvciBnb29kIFJTQSBrZXlzICovCisJCQl1bnNpZ25lZCBsb25nIGVycm9yID0gRVJSX3BlZWtfbGFzdF9lcnJvcigpOworCQkJaWYgKEVSUl9HRVRfUkVBU09OKGVycm9yKSA9PSBCTl9SX05PX0lOVkVSU0UpCisJCQkJeworCQkJCWlmIChyZXRyeV9jb3VudGVyLS0gPT0gMCkKKwkJCQl7CisJCQkJCUJOZXJyKEJOX0ZfQk5fQkxJTkRJTkdfQ1JFQVRFX1BBUkFNLAorCQkJCQkJQk5fUl9UT09fTUFOWV9JVEVSQVRJT05TKTsKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCX0KKwkJCWVsc2UKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJYnJlYWs7CisJfSB3aGlsZSAoMSk7CisKKwlpZiAocmV0LT5ibl9tb2RfZXhwICE9IE5VTEwgJiYgcmV0LT5tX2N0eCAhPSBOVUxMKQorCQl7CisJCWlmICghcmV0LT5ibl9tb2RfZXhwKHJldC0+QSwgcmV0LT5BLCByZXQtPmUsIHJldC0+bW9kLCBjdHgsIHJldC0+bV9jdHgpKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFCTl9tb2RfZXhwKHJldC0+QSwgcmV0LT5BLCByZXQtPmUsIHJldC0+bW9kLCBjdHgpKQorCQkJZ290byBlcnI7CisJCX0KKworCXJldHVybiByZXQ7CitlcnI6CisJaWYgKGIgPT0gTlVMTCAmJiByZXQgIT0gTlVMTCkKKwkJeworCQlCTl9CTElORElOR19mcmVlKHJldCk7CisJCXJldCA9IE5VTEw7CisJCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fY29uc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9jb25zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNjBhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fY29uc3QuYwpAQCAtMCwwICsxLDQwMiBAQAorLyogY3J5cHRvL2JuL2tub3ducHJpbWVzLmMgKi8KKy8qIEluc2VydCBib2lsZXJwbGF0ZSAqLworCisjaW5jbHVkZSAiYm4uaCIKKworLyogIkZpcnN0IE9ha2xleSBEZWZhdWx0IEdyb3VwIiBmcm9tIFJGQzI0MDksIHNlY3Rpb24gNi4xLgorICoKKyAqIFRoZSBwcmltZSBpczogMl43NjggLSAyIF43MDQgLSAxICsgMl42NCAqIHsgWzJeNjM4IHBpXSArIDE0OTY4NiB9CisgKgorICogUkZDMjQwOSBzcGVjaWZpZXMgYSBnZW5lcmF0b3Igb2YgMi4KKyAqIFJGQzI0MTIgc3BlY2lmaWVzIGEgZ2VuZXJhdG9yIG9mIG9mIDIyLgorICovCisKK0JJR05VTSAqZ2V0X3JmYzI0MDlfcHJpbWVfNzY4KEJJR05VTSAqYm4pCisJeworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFJGQzI0MDlfUFJJTUVfNzY4W109eworCQkweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhDOSwweDBGLDB4REEsMHhBMiwKKwkJMHgyMSwweDY4LDB4QzIsMHgzNCwweEM0LDB4QzYsMHg2MiwweDhCLDB4ODAsMHhEQywweDFDLDB4RDEsCisJCTB4MjksMHgwMiwweDRFLDB4MDgsMHg4QSwweDY3LDB4Q0MsMHg3NCwweDAyLDB4MEIsMHhCRSwweEE2LAorCQkweDNCLDB4MTMsMHg5QiwweDIyLDB4NTEsMHg0QSwweDA4LDB4NzksMHg4RSwweDM0LDB4MDQsMHhERCwKKwkJMHhFRiwweDk1LDB4MTksMHhCMywweENELDB4M0EsMHg0MywweDFCLDB4MzAsMHgyQiwweDBBLDB4NkQsCisJCTB4RjIsMHg1RiwweDE0LDB4MzcsMHg0RiwweEUxLDB4MzUsMHg2RCwweDZELDB4NTEsMHhDMiwweDQ1LAorCQkweEU0LDB4ODUsMHhCNSwweDc2LDB4NjIsMHg1RSwweDdFLDB4QzYsMHhGNCwweDRDLDB4NDIsMHhFOSwKKwkJMHhBNiwweDNBLDB4MzYsMHgyMCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJCX07CisJcmV0dXJuIEJOX2JpbjJibihSRkMyNDA5X1BSSU1FXzc2OCxzaXplb2YoUkZDMjQwOV9QUklNRV83NjgpLGJuKTsKKwl9CisKKy8qICJTZWNvbmQgT2FrbGV5IERlZmF1bHQgR3JvdXAiIGZyb20gUkZDMjQwOSwgc2VjdGlvbiA2LjIuCisgKgorICogVGhlIHByaW1lIGlzOiAyXjEwMjQgLSAyXjk2MCAtIDEgKyAyXjY0ICogeyBbMl44OTQgcGldICsgMTI5MDkzIH0uCisgKgorICogUkZDMjQwOSBzcGVjaWZpZXMgYSBnZW5lcmF0b3Igb2YgMi4KKyAqIFJGQzI0MTIgc3BlY2lmaWVzIGEgZ2VuZXJhdG9yIG9mIDIyLgorICovCisKK0JJR05VTSAqZ2V0X3JmYzI0MDlfcHJpbWVfMTAyNChCSUdOVU0gKmJuKQorCXsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBSRkMyNDA5X1BSSU1FXzEwMjRbXT17CisJCTB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEM5LDB4MEYsMHhEQSwweEEyLAorCQkweDIxLDB4NjgsMHhDMiwweDM0LDB4QzQsMHhDNiwweDYyLDB4OEIsMHg4MCwweERDLDB4MUMsMHhEMSwKKwkJMHgyOSwweDAyLDB4NEUsMHgwOCwweDhBLDB4NjcsMHhDQywweDc0LDB4MDIsMHgwQiwweEJFLDB4QTYsCisJCTB4M0IsMHgxMywweDlCLDB4MjIsMHg1MSwweDRBLDB4MDgsMHg3OSwweDhFLDB4MzQsMHgwNCwweERELAorCQkweEVGLDB4OTUsMHgxOSwweEIzLDB4Q0QsMHgzQSwweDQzLDB4MUIsMHgzMCwweDJCLDB4MEEsMHg2RCwKKwkJMHhGMiwweDVGLDB4MTQsMHgzNywweDRGLDB4RTEsMHgzNSwweDZELDB4NkQsMHg1MSwweEMyLDB4NDUsCisJCTB4RTQsMHg4NSwweEI1LDB4NzYsMHg2MiwweDVFLDB4N0UsMHhDNiwweEY0LDB4NEMsMHg0MiwweEU5LAorCQkweEE2LDB4MzcsMHhFRCwweDZCLDB4MEIsMHhGRiwweDVDLDB4QjYsMHhGNCwweDA2LDB4QjcsMHhFRCwKKwkJMHhFRSwweDM4LDB4NkIsMHhGQiwweDVBLDB4ODksMHg5RiwweEE1LDB4QUUsMHg5RiwweDI0LDB4MTEsCisJCTB4N0MsMHg0QiwweDFGLDB4RTYsMHg0OSwweDI4LDB4NjYsMHg1MSwweEVDLDB4RTYsMHg1MywweDgxLAorCQkweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJCX07CisJcmV0dXJuIEJOX2JpbjJibihSRkMyNDA5X1BSSU1FXzEwMjQsc2l6ZW9mKFJGQzI0MDlfUFJJTUVfMTAyNCksYm4pOworCX0KKworLyogIjE1MzYtYml0IE1PRFAgR3JvdXAiIGZyb20gUkZDMzUyNiwgU2VjdGlvbiAyLgorICoKKyAqIFRoZSBwcmltZSBpczogMl4xNTM2IC0gMl4xNDcyIC0gMSArIDJeNjQgKiB7IFsyXjE0MDYgcGldICsgNzQxODA0IH0KKyAqCisgKiBSRkMzNTI2IHNwZWNpZmllcyBhIGdlbmVyYXRvciBvZiAyLgorICogUkZDMjMxMiBzcGVjaWZpZXMgYSBnZW5lcmF0b3Igb2YgMjIuCisgKi8KKworQklHTlVNICpnZXRfcmZjMzUyNl9wcmltZV8xNTM2KEJJR05VTSAqYm4pCisJeworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFJGQzM1MjZfUFJJTUVfMTUzNltdPXsKKwkJMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4QzksMHgwRiwweERBLDB4QTIsCisJCTB4MjEsMHg2OCwweEMyLDB4MzQsMHhDNCwweEM2LDB4NjIsMHg4QiwweDgwLDB4REMsMHgxQywweEQxLAorCQkweDI5LDB4MDIsMHg0RSwweDA4LDB4OEEsMHg2NywweENDLDB4NzQsMHgwMiwweDBCLDB4QkUsMHhBNiwKKwkJMHgzQiwweDEzLDB4OUIsMHgyMiwweDUxLDB4NEEsMHgwOCwweDc5LDB4OEUsMHgzNCwweDA0LDB4REQsCisJCTB4RUYsMHg5NSwweDE5LDB4QjMsMHhDRCwweDNBLDB4NDMsMHgxQiwweDMwLDB4MkIsMHgwQSwweDZELAorCQkweEYyLDB4NUYsMHgxNCwweDM3LDB4NEYsMHhFMSwweDM1LDB4NkQsMHg2RCwweDUxLDB4QzIsMHg0NSwKKwkJMHhFNCwweDg1LDB4QjUsMHg3NiwweDYyLDB4NUUsMHg3RSwweEM2LDB4RjQsMHg0QywweDQyLDB4RTksCisJCTB4QTYsMHgzNywweEVELDB4NkIsMHgwQiwweEZGLDB4NUMsMHhCNiwweEY0LDB4MDYsMHhCNywweEVELAorCQkweEVFLDB4MzgsMHg2QiwweEZCLDB4NUEsMHg4OSwweDlGLDB4QTUsMHhBRSwweDlGLDB4MjQsMHgxMSwKKwkJMHg3QywweDRCLDB4MUYsMHhFNiwweDQ5LDB4MjgsMHg2NiwweDUxLDB4RUMsMHhFNCwweDVCLDB4M0QsCisJCTB4QzIsMHgwMCwweDdDLDB4QjgsMHhBMSwweDYzLDB4QkYsMHgwNSwweDk4LDB4REEsMHg0OCwweDM2LAorCQkweDFDLDB4NTUsMHhEMywweDlBLDB4NjksMHgxNiwweDNGLDB4QTgsMHhGRCwweDI0LDB4Q0YsMHg1RiwKKwkJMHg4MywweDY1LDB4NUQsMHgyMywweERDLDB4QTMsMHhBRCwweDk2LDB4MUMsMHg2MiwweEYzLDB4NTYsCisJCTB4MjAsMHg4NSwweDUyLDB4QkIsMHg5RSwweEQ1LDB4MjksMHgwNywweDcwLDB4OTYsMHg5NiwweDZELAorCQkweDY3LDB4MEMsMHgzNSwweDRFLDB4NEEsMHhCQywweDk4LDB4MDQsMHhGMSwweDc0LDB4NkMsMHgwOCwKKwkJMHhDQSwweDIzLDB4NzMsMHgyNywweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJCX07CisJcmV0dXJuIEJOX2JpbjJibihSRkMzNTI2X1BSSU1FXzE1MzYsc2l6ZW9mKFJGQzM1MjZfUFJJTUVfMTUzNiksYm4pOworCX0KKworLyogIjIwNDgtYml0IE1PRFAgR3JvdXAiIGZyb20gUkZDMzUyNiwgU2VjdGlvbiAzLgorICoKKyAqIFRoZSBwcmltZSBpczogMl4yMDQ4IC0gMl4xOTg0IC0gMSArIDJeNjQgKiB7IFsyXjE5MTggcGldICsgMTI0NDc2IH0KKyAqCisgKiBSRkMzNTI2IHNwZWNpZmllcyBhIGdlbmVyYXRvciBvZiAyLgorICovCisKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfMjA0OChCSUdOVU0gKmJuKQorCXsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBSRkMzNTI2X1BSSU1FXzIwNDhbXT17CisJCTB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEM5LDB4MEYsMHhEQSwweEEyLAorCQkweDIxLDB4NjgsMHhDMiwweDM0LDB4QzQsMHhDNiwweDYyLDB4OEIsMHg4MCwweERDLDB4MUMsMHhEMSwKKwkJMHgyOSwweDAyLDB4NEUsMHgwOCwweDhBLDB4NjcsMHhDQywweDc0LDB4MDIsMHgwQiwweEJFLDB4QTYsCisJCTB4M0IsMHgxMywweDlCLDB4MjIsMHg1MSwweDRBLDB4MDgsMHg3OSwweDhFLDB4MzQsMHgwNCwweERELAorCQkweEVGLDB4OTUsMHgxOSwweEIzLDB4Q0QsMHgzQSwweDQzLDB4MUIsMHgzMCwweDJCLDB4MEEsMHg2RCwKKwkJMHhGMiwweDVGLDB4MTQsMHgzNywweDRGLDB4RTEsMHgzNSwweDZELDB4NkQsMHg1MSwweEMyLDB4NDUsCisJCTB4RTQsMHg4NSwweEI1LDB4NzYsMHg2MiwweDVFLDB4N0UsMHhDNiwweEY0LDB4NEMsMHg0MiwweEU5LAorCQkweEE2LDB4MzcsMHhFRCwweDZCLDB4MEIsMHhGRiwweDVDLDB4QjYsMHhGNCwweDA2LDB4QjcsMHhFRCwKKwkJMHhFRSwweDM4LDB4NkIsMHhGQiwweDVBLDB4ODksMHg5RiwweEE1LDB4QUUsMHg5RiwweDI0LDB4MTEsCisJCTB4N0MsMHg0QiwweDFGLDB4RTYsMHg0OSwweDI4LDB4NjYsMHg1MSwweEVDLDB4RTQsMHg1QiwweDNELAorCQkweEMyLDB4MDAsMHg3QywweEI4LDB4QTEsMHg2MywweEJGLDB4MDUsMHg5OCwweERBLDB4NDgsMHgzNiwKKwkJMHgxQywweDU1LDB4RDMsMHg5QSwweDY5LDB4MTYsMHgzRiwweEE4LDB4RkQsMHgyNCwweENGLDB4NUYsCisJCTB4ODMsMHg2NSwweDVELDB4MjMsMHhEQywweEEzLDB4QUQsMHg5NiwweDFDLDB4NjIsMHhGMywweDU2LAorCQkweDIwLDB4ODUsMHg1MiwweEJCLDB4OUUsMHhENSwweDI5LDB4MDcsMHg3MCwweDk2LDB4OTYsMHg2RCwKKwkJMHg2NywweDBDLDB4MzUsMHg0RSwweDRBLDB4QkMsMHg5OCwweDA0LDB4RjEsMHg3NCwweDZDLDB4MDgsCisJCTB4Q0EsMHgxOCwweDIxLDB4N0MsMHgzMiwweDkwLDB4NUUsMHg0NiwweDJFLDB4MzYsMHhDRSwweDNCLAorCQkweEUzLDB4OUUsMHg3NywweDJDLDB4MTgsMHgwRSwweDg2LDB4MDMsMHg5QiwweDI3LDB4ODMsMHhBMiwKKwkJMHhFQywweDA3LDB4QTIsMHg4RiwweEI1LDB4QzUsMHg1RCwweEYwLDB4NkYsMHg0QywweDUyLDB4QzksCisJCTB4REUsMHgyQiwweENCLDB4RjYsMHg5NSwweDU4LDB4MTcsMHgxOCwweDM5LDB4OTUsMHg0OSwweDdDLAorCQkweEVBLDB4OTUsMHg2QSwweEU1LDB4MTUsMHhEMiwweDI2LDB4MTgsMHg5OCwweEZBLDB4MDUsMHgxMCwKKwkJMHgxNSwweDcyLDB4OEUsMHg1QSwweDhBLDB4QUMsMHhBQSwweDY4LDB4RkYsMHhGRiwweEZGLDB4RkYsCisJCTB4RkYsMHhGRiwweEZGLDB4RkYsCisJCX07CisJcmV0dXJuIEJOX2JpbjJibihSRkMzNTI2X1BSSU1FXzIwNDgsc2l6ZW9mKFJGQzM1MjZfUFJJTUVfMjA0OCksYm4pOworCX0KKworLyogIjMwNzItYml0IE1PRFAgR3JvdXAiIGZyb20gUkZDMzUyNiwgU2VjdGlvbiA0LgorICoKKyAqIFRoZSBwcmltZSBpczogMl4zMDcyIC0gMl4zMDA4IC0gMSArIDJeNjQgKiB7IFsyXjI5NDIgcGldICsgMTY5MDMxNCB9CisgKgorICogUkZDMzUyNiBzcGVjaWZpZXMgYSBnZW5lcmF0b3Igb2YgMi4KKyAqLworCitCSUdOVU0gKmdldF9yZmMzNTI2X3ByaW1lXzMwNzIoQklHTlVNICpibikKKwl7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgUkZDMzUyNl9QUklNRV8zMDcyW109eworCQkweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhDOSwweDBGLDB4REEsMHhBMiwKKwkJMHgyMSwweDY4LDB4QzIsMHgzNCwweEM0LDB4QzYsMHg2MiwweDhCLDB4ODAsMHhEQywweDFDLDB4RDEsCisJCTB4MjksMHgwMiwweDRFLDB4MDgsMHg4QSwweDY3LDB4Q0MsMHg3NCwweDAyLDB4MEIsMHhCRSwweEE2LAorCQkweDNCLDB4MTMsMHg5QiwweDIyLDB4NTEsMHg0QSwweDA4LDB4NzksMHg4RSwweDM0LDB4MDQsMHhERCwKKwkJMHhFRiwweDk1LDB4MTksMHhCMywweENELDB4M0EsMHg0MywweDFCLDB4MzAsMHgyQiwweDBBLDB4NkQsCisJCTB4RjIsMHg1RiwweDE0LDB4MzcsMHg0RiwweEUxLDB4MzUsMHg2RCwweDZELDB4NTEsMHhDMiwweDQ1LAorCQkweEU0LDB4ODUsMHhCNSwweDc2LDB4NjIsMHg1RSwweDdFLDB4QzYsMHhGNCwweDRDLDB4NDIsMHhFOSwKKwkJMHhBNiwweDM3LDB4RUQsMHg2QiwweDBCLDB4RkYsMHg1QywweEI2LDB4RjQsMHgwNiwweEI3LDB4RUQsCisJCTB4RUUsMHgzOCwweDZCLDB4RkIsMHg1QSwweDg5LDB4OUYsMHhBNSwweEFFLDB4OUYsMHgyNCwweDExLAorCQkweDdDLDB4NEIsMHgxRiwweEU2LDB4NDksMHgyOCwweDY2LDB4NTEsMHhFQywweEU0LDB4NUIsMHgzRCwKKwkJMHhDMiwweDAwLDB4N0MsMHhCOCwweEExLDB4NjMsMHhCRiwweDA1LDB4OTgsMHhEQSwweDQ4LDB4MzYsCisJCTB4MUMsMHg1NSwweEQzLDB4OUEsMHg2OSwweDE2LDB4M0YsMHhBOCwweEZELDB4MjQsMHhDRiwweDVGLAorCQkweDgzLDB4NjUsMHg1RCwweDIzLDB4REMsMHhBMywweEFELDB4OTYsMHgxQywweDYyLDB4RjMsMHg1NiwKKwkJMHgyMCwweDg1LDB4NTIsMHhCQiwweDlFLDB4RDUsMHgyOSwweDA3LDB4NzAsMHg5NiwweDk2LDB4NkQsCisJCTB4NjcsMHgwQywweDM1LDB4NEUsMHg0QSwweEJDLDB4OTgsMHgwNCwweEYxLDB4NzQsMHg2QywweDA4LAorCQkweENBLDB4MTgsMHgyMSwweDdDLDB4MzIsMHg5MCwweDVFLDB4NDYsMHgyRSwweDM2LDB4Q0UsMHgzQiwKKwkJMHhFMywweDlFLDB4NzcsMHgyQywweDE4LDB4MEUsMHg4NiwweDAzLDB4OUIsMHgyNywweDgzLDB4QTIsCisJCTB4RUMsMHgwNywweEEyLDB4OEYsMHhCNSwweEM1LDB4NUQsMHhGMCwweDZGLDB4NEMsMHg1MiwweEM5LAorCQkweERFLDB4MkIsMHhDQiwweEY2LDB4OTUsMHg1OCwweDE3LDB4MTgsMHgzOSwweDk1LDB4NDksMHg3QywKKwkJMHhFQSwweDk1LDB4NkEsMHhFNSwweDE1LDB4RDIsMHgyNiwweDE4LDB4OTgsMHhGQSwweDA1LDB4MTAsCisJCTB4MTUsMHg3MiwweDhFLDB4NUEsMHg4QSwweEFBLDB4QzQsMHgyRCwweEFELDB4MzMsMHgxNywweDBELAorCQkweDA0LDB4NTAsMHg3QSwweDMzLDB4QTgsMHg1NSwweDIxLDB4QUIsMHhERiwweDFDLDB4QkEsMHg2NCwKKwkJMHhFQywweEZCLDB4ODUsMHgwNCwweDU4LDB4REIsMHhFRiwweDBBLDB4OEEsMHhFQSwweDcxLDB4NTcsCisJCTB4NUQsMHgwNiwweDBDLDB4N0QsMHhCMywweDk3LDB4MEYsMHg4NSwweEE2LDB4RTEsMHhFNCwweEM3LAorCQkweEFCLDB4RjUsMHhBRSwweDhDLDB4REIsMHgwOSwweDMzLDB4RDcsMHgxRSwweDhDLDB4OTQsMHhFMCwKKwkJMHg0QSwweDI1LDB4NjEsMHg5RCwweENFLDB4RTMsMHhEMiwweDI2LDB4MUEsMHhEMiwweEVFLDB4NkIsCisJCTB4RjEsMHgyRiwweEZBLDB4MDYsMHhEOSwweDhBLDB4MDgsMHg2NCwweEQ4LDB4NzYsMHgwMiwweDczLAorCQkweDNFLDB4QzgsMHg2QSwweDY0LDB4NTIsMHgxRiwweDJCLDB4MTgsMHgxNywweDdCLDB4MjAsMHgwQywKKwkJMHhCQiwweEUxLDB4MTcsMHg1NywweDdBLDB4NjEsMHg1RCwweDZDLDB4NzcsMHgwOSwweDg4LDB4QzAsCisJCTB4QkEsMHhEOSwweDQ2LDB4RTIsMHgwOCwweEUyLDB4NEYsMHhBMCwweDc0LDB4RTUsMHhBQiwweDMxLAorCQkweDQzLDB4REIsMHg1QiwweEZDLDB4RTAsMHhGRCwweDEwLDB4OEUsMHg0QiwweDgyLDB4RDEsMHgyMCwKKwkJMHhBOSwweDNBLDB4RDIsMHhDQSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJCX07CisJcmV0dXJuIEJOX2JpbjJibihSRkMzNTI2X1BSSU1FXzMwNzIsc2l6ZW9mKFJGQzM1MjZfUFJJTUVfMzA3MiksYm4pOworCX0KKworLyogIjQwOTYtYml0IE1PRFAgR3JvdXAiIGZyb20gUkZDMzUyNiwgU2VjdGlvbiA1LgorICoKKyAqIFRoZSBwcmltZSBpczogMl40MDk2IC0gMl40MDMyIC0gMSArIDJeNjQgKiB7IFsyXjM5NjYgcGldICsgMjQwOTA0IH0KKyAqCisgKiBSRkMzNTI2IHNwZWNpZmllcyBhIGdlbmVyYXRvciBvZiAyLgorICovCisKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfNDA5NihCSUdOVU0gKmJuKQorCXsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBSRkMzNTI2X1BSSU1FXzQwOTZbXT17CisJCTB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEM5LDB4MEYsMHhEQSwweEEyLAorCQkweDIxLDB4NjgsMHhDMiwweDM0LDB4QzQsMHhDNiwweDYyLDB4OEIsMHg4MCwweERDLDB4MUMsMHhEMSwKKwkJMHgyOSwweDAyLDB4NEUsMHgwOCwweDhBLDB4NjcsMHhDQywweDc0LDB4MDIsMHgwQiwweEJFLDB4QTYsCisJCTB4M0IsMHgxMywweDlCLDB4MjIsMHg1MSwweDRBLDB4MDgsMHg3OSwweDhFLDB4MzQsMHgwNCwweERELAorCQkweEVGLDB4OTUsMHgxOSwweEIzLDB4Q0QsMHgzQSwweDQzLDB4MUIsMHgzMCwweDJCLDB4MEEsMHg2RCwKKwkJMHhGMiwweDVGLDB4MTQsMHgzNywweDRGLDB4RTEsMHgzNSwweDZELDB4NkQsMHg1MSwweEMyLDB4NDUsCisJCTB4RTQsMHg4NSwweEI1LDB4NzYsMHg2MiwweDVFLDB4N0UsMHhDNiwweEY0LDB4NEMsMHg0MiwweEU5LAorCQkweEE2LDB4MzcsMHhFRCwweDZCLDB4MEIsMHhGRiwweDVDLDB4QjYsMHhGNCwweDA2LDB4QjcsMHhFRCwKKwkJMHhFRSwweDM4LDB4NkIsMHhGQiwweDVBLDB4ODksMHg5RiwweEE1LDB4QUUsMHg5RiwweDI0LDB4MTEsCisJCTB4N0MsMHg0QiwweDFGLDB4RTYsMHg0OSwweDI4LDB4NjYsMHg1MSwweEVDLDB4RTQsMHg1QiwweDNELAorCQkweEMyLDB4MDAsMHg3QywweEI4LDB4QTEsMHg2MywweEJGLDB4MDUsMHg5OCwweERBLDB4NDgsMHgzNiwKKwkJMHgxQywweDU1LDB4RDMsMHg5QSwweDY5LDB4MTYsMHgzRiwweEE4LDB4RkQsMHgyNCwweENGLDB4NUYsCisJCTB4ODMsMHg2NSwweDVELDB4MjMsMHhEQywweEEzLDB4QUQsMHg5NiwweDFDLDB4NjIsMHhGMywweDU2LAorCQkweDIwLDB4ODUsMHg1MiwweEJCLDB4OUUsMHhENSwweDI5LDB4MDcsMHg3MCwweDk2LDB4OTYsMHg2RCwKKwkJMHg2NywweDBDLDB4MzUsMHg0RSwweDRBLDB4QkMsMHg5OCwweDA0LDB4RjEsMHg3NCwweDZDLDB4MDgsCisJCTB4Q0EsMHgxOCwweDIxLDB4N0MsMHgzMiwweDkwLDB4NUUsMHg0NiwweDJFLDB4MzYsMHhDRSwweDNCLAorCQkweEUzLDB4OUUsMHg3NywweDJDLDB4MTgsMHgwRSwweDg2LDB4MDMsMHg5QiwweDI3LDB4ODMsMHhBMiwKKwkJMHhFQywweDA3LDB4QTIsMHg4RiwweEI1LDB4QzUsMHg1RCwweEYwLDB4NkYsMHg0QywweDUyLDB4QzksCisJCTB4REUsMHgyQiwweENCLDB4RjYsMHg5NSwweDU4LDB4MTcsMHgxOCwweDM5LDB4OTUsMHg0OSwweDdDLAorCQkweEVBLDB4OTUsMHg2QSwweEU1LDB4MTUsMHhEMiwweDI2LDB4MTgsMHg5OCwweEZBLDB4MDUsMHgxMCwKKwkJMHgxNSwweDcyLDB4OEUsMHg1QSwweDhBLDB4QUEsMHhDNCwweDJELDB4QUQsMHgzMywweDE3LDB4MEQsCisJCTB4MDQsMHg1MCwweDdBLDB4MzMsMHhBOCwweDU1LDB4MjEsMHhBQiwweERGLDB4MUMsMHhCQSwweDY0LAorCQkweEVDLDB4RkIsMHg4NSwweDA0LDB4NTgsMHhEQiwweEVGLDB4MEEsMHg4QSwweEVBLDB4NzEsMHg1NywKKwkJMHg1RCwweDA2LDB4MEMsMHg3RCwweEIzLDB4OTcsMHgwRiwweDg1LDB4QTYsMHhFMSwweEU0LDB4QzcsCisJCTB4QUIsMHhGNSwweEFFLDB4OEMsMHhEQiwweDA5LDB4MzMsMHhENywweDFFLDB4OEMsMHg5NCwweEUwLAorCQkweDRBLDB4MjUsMHg2MSwweDlELDB4Q0UsMHhFMywweEQyLDB4MjYsMHgxQSwweEQyLDB4RUUsMHg2QiwKKwkJMHhGMSwweDJGLDB4RkEsMHgwNiwweEQ5LDB4OEEsMHgwOCwweDY0LDB4RDgsMHg3NiwweDAyLDB4NzMsCisJCTB4M0UsMHhDOCwweDZBLDB4NjQsMHg1MiwweDFGLDB4MkIsMHgxOCwweDE3LDB4N0IsMHgyMCwweDBDLAorCQkweEJCLDB4RTEsMHgxNywweDU3LDB4N0EsMHg2MSwweDVELDB4NkMsMHg3NywweDA5LDB4ODgsMHhDMCwKKwkJMHhCQSwweEQ5LDB4NDYsMHhFMiwweDA4LDB4RTIsMHg0RiwweEEwLDB4NzQsMHhFNSwweEFCLDB4MzEsCisJCTB4NDMsMHhEQiwweDVCLDB4RkMsMHhFMCwweEZELDB4MTAsMHg4RSwweDRCLDB4ODIsMHhEMSwweDIwLAorCQkweEE5LDB4MjEsMHgwOCwweDAxLDB4MUEsMHg3MiwweDNDLDB4MTIsMHhBNywweDg3LDB4RTYsMHhENywKKwkJMHg4OCwweDcxLDB4OUEsMHgxMCwweEJELDB4QkEsMHg1QiwweDI2LDB4OTksMHhDMywweDI3LDB4MTgsCisJCTB4NkEsMHhGNCwweEUyLDB4M0MsMHgxQSwweDk0LDB4NjgsMHgzNCwweEI2LDB4MTUsMHgwQiwweERBLAorCQkweDI1LDB4ODMsMHhFOSwweENBLDB4MkEsMHhENCwweDRDLDB4RTgsMHhEQiwweEJCLDB4QzIsMHhEQiwKKwkJMHgwNCwweERFLDB4OEUsMHhGOSwweDJFLDB4OEUsMHhGQywweDE0LDB4MUYsMHhCRSwweENBLDB4QTYsCisJCTB4MjgsMHg3QywweDU5LDB4NDcsMHg0RSwweDZCLDB4QzAsMHg1RCwweDk5LDB4QjIsMHg5NiwweDRGLAorCQkweEEwLDB4OTAsMHhDMywweEEyLDB4MjMsMHgzQiwweEExLDB4ODYsMHg1MSwweDVCLDB4RTcsMHhFRCwKKwkJMHgxRiwweDYxLDB4MjksMHg3MCwweENFLDB4RTIsMHhENywweEFGLDB4QjgsMHgxQiwweERELDB4NzYsCisJCTB4MjEsMHg3MCwweDQ4LDB4MUMsMHhEMCwweDA2LDB4OTEsMHgyNywweEQ1LDB4QjAsMHg1QSwweEE5LAorCQkweDkzLDB4QjQsMHhFQSwweDk4LDB4OEQsMHg4RiwweERELDB4QzEsMHg4NiwweEZGLDB4QjcsMHhEQywKKwkJMHg5MCwweEE2LDB4QzAsMHg4RiwweDRELDB4RjQsMHgzNSwweEM5LDB4MzQsMHgwNiwweDMxLDB4OTksCisJCTB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkJfTsKKwlyZXR1cm4gQk5fYmluMmJuKFJGQzM1MjZfUFJJTUVfNDA5NixzaXplb2YoUkZDMzUyNl9QUklNRV80MDk2KSxibik7CisJfQorCisvKiAiNjE0NC1iaXQgTU9EUCBHcm91cCIgZnJvbSBSRkMzNTI2LCBTZWN0aW9uIDYuCisgKgorICogVGhlIHByaW1lIGlzOiAyXjYxNDQgLSAyXjYwODAgLSAxICsgMl42NCAqIHsgWzJeNjAxNCBwaV0gKyA5Mjk0ODQgfQorICoKKyAqIFJGQzM1MjYgc3BlY2lmaWVzIGEgZ2VuZXJhdG9yIG9mIDIuCisgKi8KKworQklHTlVNICpnZXRfcmZjMzUyNl9wcmltZV82MTQ0KEJJR05VTSAqYm4pCisJeworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIFJGQzM1MjZfUFJJTUVfNjE0NFtdPXsKKwkJMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4QzksMHgwRiwweERBLDB4QTIsCisJCTB4MjEsMHg2OCwweEMyLDB4MzQsMHhDNCwweEM2LDB4NjIsMHg4QiwweDgwLDB4REMsMHgxQywweEQxLAorCQkweDI5LDB4MDIsMHg0RSwweDA4LDB4OEEsMHg2NywweENDLDB4NzQsMHgwMiwweDBCLDB4QkUsMHhBNiwKKwkJMHgzQiwweDEzLDB4OUIsMHgyMiwweDUxLDB4NEEsMHgwOCwweDc5LDB4OEUsMHgzNCwweDA0LDB4REQsCisJCTB4RUYsMHg5NSwweDE5LDB4QjMsMHhDRCwweDNBLDB4NDMsMHgxQiwweDMwLDB4MkIsMHgwQSwweDZELAorCQkweEYyLDB4NUYsMHgxNCwweDM3LDB4NEYsMHhFMSwweDM1LDB4NkQsMHg2RCwweDUxLDB4QzIsMHg0NSwKKwkJMHhFNCwweDg1LDB4QjUsMHg3NiwweDYyLDB4NUUsMHg3RSwweEM2LDB4RjQsMHg0QywweDQyLDB4RTksCisJCTB4QTYsMHgzNywweEVELDB4NkIsMHgwQiwweEZGLDB4NUMsMHhCNiwweEY0LDB4MDYsMHhCNywweEVELAorCQkweEVFLDB4MzgsMHg2QiwweEZCLDB4NUEsMHg4OSwweDlGLDB4QTUsMHhBRSwweDlGLDB4MjQsMHgxMSwKKwkJMHg3QywweDRCLDB4MUYsMHhFNiwweDQ5LDB4MjgsMHg2NiwweDUxLDB4RUMsMHhFNCwweDVCLDB4M0QsCisJCTB4QzIsMHgwMCwweDdDLDB4QjgsMHhBMSwweDYzLDB4QkYsMHgwNSwweDk4LDB4REEsMHg0OCwweDM2LAorCQkweDFDLDB4NTUsMHhEMywweDlBLDB4NjksMHgxNiwweDNGLDB4QTgsMHhGRCwweDI0LDB4Q0YsMHg1RiwKKwkJMHg4MywweDY1LDB4NUQsMHgyMywweERDLDB4QTMsMHhBRCwweDk2LDB4MUMsMHg2MiwweEYzLDB4NTYsCisJCTB4MjAsMHg4NSwweDUyLDB4QkIsMHg5RSwweEQ1LDB4MjksMHgwNywweDcwLDB4OTYsMHg5NiwweDZELAorCQkweDY3LDB4MEMsMHgzNSwweDRFLDB4NEEsMHhCQywweDk4LDB4MDQsMHhGMSwweDc0LDB4NkMsMHgwOCwKKwkJMHhDQSwweDE4LDB4MjEsMHg3QywweDMyLDB4OTAsMHg1RSwweDQ2LDB4MkUsMHgzNiwweENFLDB4M0IsCisJCTB4RTMsMHg5RSwweDc3LDB4MkMsMHgxOCwweDBFLDB4ODYsMHgwMywweDlCLDB4MjcsMHg4MywweEEyLAorCQkweEVDLDB4MDcsMHhBMiwweDhGLDB4QjUsMHhDNSwweDVELDB4RjAsMHg2RiwweDRDLDB4NTIsMHhDOSwKKwkJMHhERSwweDJCLDB4Q0IsMHhGNiwweDk1LDB4NTgsMHgxNywweDE4LDB4MzksMHg5NSwweDQ5LDB4N0MsCisJCTB4RUEsMHg5NSwweDZBLDB4RTUsMHgxNSwweEQyLDB4MjYsMHgxOCwweDk4LDB4RkEsMHgwNSwweDEwLAorCQkweDE1LDB4NzIsMHg4RSwweDVBLDB4OEEsMHhBQSwweEM0LDB4MkQsMHhBRCwweDMzLDB4MTcsMHgwRCwKKwkJMHgwNCwweDUwLDB4N0EsMHgzMywweEE4LDB4NTUsMHgyMSwweEFCLDB4REYsMHgxQywweEJBLDB4NjQsCisJCTB4RUMsMHhGQiwweDg1LDB4MDQsMHg1OCwweERCLDB4RUYsMHgwQSwweDhBLDB4RUEsMHg3MSwweDU3LAorCQkweDVELDB4MDYsMHgwQywweDdELDB4QjMsMHg5NywweDBGLDB4ODUsMHhBNiwweEUxLDB4RTQsMHhDNywKKwkJMHhBQiwweEY1LDB4QUUsMHg4QywweERCLDB4MDksMHgzMywweEQ3LDB4MUUsMHg4QywweDk0LDB4RTAsCisJCTB4NEEsMHgyNSwweDYxLDB4OUQsMHhDRSwweEUzLDB4RDIsMHgyNiwweDFBLDB4RDIsMHhFRSwweDZCLAorCQkweEYxLDB4MkYsMHhGQSwweDA2LDB4RDksMHg4QSwweDA4LDB4NjQsMHhEOCwweDc2LDB4MDIsMHg3MywKKwkJMHgzRSwweEM4LDB4NkEsMHg2NCwweDUyLDB4MUYsMHgyQiwweDE4LDB4MTcsMHg3QiwweDIwLDB4MEMsCisJCTB4QkIsMHhFMSwweDE3LDB4NTcsMHg3QSwweDYxLDB4NUQsMHg2QywweDc3LDB4MDksMHg4OCwweEMwLAorCQkweEJBLDB4RDksMHg0NiwweEUyLDB4MDgsMHhFMiwweDRGLDB4QTAsMHg3NCwweEU1LDB4QUIsMHgzMSwKKwkJMHg0MywweERCLDB4NUIsMHhGQywweEUwLDB4RkQsMHgxMCwweDhFLDB4NEIsMHg4MiwweEQxLDB4MjAsCisJCTB4QTksMHgyMSwweDA4LDB4MDEsMHgxQSwweDcyLDB4M0MsMHgxMiwweEE3LDB4ODcsMHhFNiwweEQ3LAorCQkweDg4LDB4NzEsMHg5QSwweDEwLDB4QkQsMHhCQSwweDVCLDB4MjYsMHg5OSwweEMzLDB4MjcsMHgxOCwKKwkJMHg2QSwweEY0LDB4RTIsMHgzQywweDFBLDB4OTQsMHg2OCwweDM0LDB4QjYsMHgxNSwweDBCLDB4REEsCisJCTB4MjUsMHg4MywweEU5LDB4Q0EsMHgyQSwweEQ0LDB4NEMsMHhFOCwweERCLDB4QkIsMHhDMiwweERCLAorCQkweDA0LDB4REUsMHg4RSwweEY5LDB4MkUsMHg4RSwweEZDLDB4MTQsMHgxRiwweEJFLDB4Q0EsMHhBNiwKKwkJMHgyOCwweDdDLDB4NTksMHg0NywweDRFLDB4NkIsMHhDMCwweDVELDB4OTksMHhCMiwweDk2LDB4NEYsCisJCTB4QTAsMHg5MCwweEMzLDB4QTIsMHgyMywweDNCLDB4QTEsMHg4NiwweDUxLDB4NUIsMHhFNywweEVELAorCQkweDFGLDB4NjEsMHgyOSwweDcwLDB4Q0UsMHhFMiwweEQ3LDB4QUYsMHhCOCwweDFCLDB4REQsMHg3NiwKKwkJMHgyMSwweDcwLDB4NDgsMHgxQywweEQwLDB4MDYsMHg5MSwweDI3LDB4RDUsMHhCMCwweDVBLDB4QTksCisJCTB4OTMsMHhCNCwweEVBLDB4OTgsMHg4RCwweDhGLDB4REQsMHhDMSwweDg2LDB4RkYsMHhCNywweERDLAorCQkweDkwLDB4QTYsMHhDMCwweDhGLDB4NEQsMHhGNCwweDM1LDB4QzksMHgzNCwweDAyLDB4ODQsMHg5MiwKKwkJMHgzNiwweEMzLDB4RkEsMHhCNCwweEQyLDB4N0MsMHg3MCwweDI2LDB4QzEsMHhENCwweERDLDB4QjIsCisJCTB4NjAsMHgyNiwweDQ2LDB4REUsMHhDOSwweDc1LDB4MUUsMHg3NiwweDNELDB4QkEsMHgzNywweEJELAorCQkweEY4LDB4RkYsMHg5NCwweDA2LDB4QUQsMHg5RSwweDUzLDB4MEUsMHhFNSwweERCLDB4MzgsMHgyRiwKKwkJMHg0MSwweDMwLDB4MDEsMHhBRSwweEIwLDB4NkEsMHg1MywweEVELDB4OTAsMHgyNywweEQ4LDB4MzEsCisJCTB4MTcsMHg5NywweDI3LDB4QjAsMHg4NiwweDVBLDB4ODksMHgxOCwweERBLDB4M0UsMHhEQiwweEVCLAorCQkweENGLDB4OUIsMHgxNCwweEVELDB4NDQsMHhDRSwweDZDLDB4QkEsMHhDRSwweEQ0LDB4QkIsMHgxQiwKKwkJMHhEQiwweDdGLDB4MTQsMHg0NywweEU2LDB4Q0MsMHgyNSwweDRCLDB4MzMsMHgyMCwweDUxLDB4NTEsCisJCTB4MkIsMHhENywweEFGLDB4NDIsMHg2RiwweEI4LDB4RjQsMHgwMSwweDM3LDB4OEMsMHhEMiwweEJGLAorCQkweDU5LDB4ODMsMHhDQSwweDAxLDB4QzYsMHg0QiwweDkyLDB4RUMsMHhGMCwweDMyLDB4RUEsMHgxNSwKKwkJMHhEMSwweDcyLDB4MUQsMHgwMywweEY0LDB4ODIsMHhENywweENFLDB4NkUsMHg3NCwweEZFLDB4RjYsCisJCTB4RDUsMHg1RSwweDcwLDB4MkYsMHg0NiwweDk4LDB4MEMsMHg4MiwweEI1LDB4QTgsMHg0MCwweDMxLAorCQkweDkwLDB4MEIsMHgxQywweDlFLDB4NTksMHhFNywweEM5LDB4N0YsMHhCRSwweEM3LDB4RTgsMHhGMywKKwkJMHgyMywweEE5LDB4N0EsMHg3RSwweDM2LDB4Q0MsMHg4OCwweEJFLDB4MEYsMHgxRCwweDQ1LDB4QjcsCisJCTB4RkYsMHg1OCwweDVBLDB4QzUsMHg0QiwweEQ0LDB4MDcsMHhCMiwweDJCLDB4NDEsMHg1NCwweEFBLAorCQkweENDLDB4OEYsMHg2RCwweDdFLDB4QkYsMHg0OCwweEUxLDB4RDgsMHgxNCwweENDLDB4NUUsMHhEMiwKKwkJMHgwRiwweDgwLDB4MzcsMHhFMCwweEE3LDB4OTcsMHgxNSwweEVFLDB4RjIsMHg5QiwweEUzLDB4MjgsCisJCTB4MDYsMHhBMSwweEQ1LDB4OEIsMHhCNywweEM1LDB4REEsMHg3NiwweEY1LDB4NTAsMHhBQSwweDNELAorCQkweDhBLDB4MUYsMHhCRiwweEYwLDB4RUIsMHgxOSwweENDLDB4QjEsMHhBMywweDEzLDB4RDUsMHg1QywKKwkJMHhEQSwweDU2LDB4QzksMHhFQywweDJFLDB4RjIsMHg5NiwweDMyLDB4MzgsMHg3RiwweEU4LDB4RDcsCisJCTB4NkUsMHgzQywweDA0LDB4NjgsMHgwNCwweDNFLDB4OEYsMHg2NiwweDNGLDB4NDgsMHg2MCwweEVFLAorCQkweDEyLDB4QkYsMHgyRCwweDVCLDB4MEIsMHg3NCwweDc0LDB4RDYsMHhFNiwweDk0LDB4RjksMHgxRSwKKwkJMHg2RCwweENDLDB4NDAsMHgyNCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJCX07CisJcmV0dXJuIEJOX2JpbjJibihSRkMzNTI2X1BSSU1FXzYxNDQsc2l6ZW9mKFJGQzM1MjZfUFJJTUVfNjE0NCksYm4pOworCX0KKworLyogIjgxOTItYml0IE1PRFAgR3JvdXAiIGZyb20gUkZDMzUyNiwgU2VjdGlvbiA3LgorICoKKyAqIFRoZSBwcmltZSBpczogMl44MTkyIC0gMl44MTI4IC0gMSArIDJeNjQgKiB7IFsyXjgwNjIgcGldICsgNDc0MzE1OCB9CisgKgorICogUkZDMzUyNiBzcGVjaWZpZXMgYSBnZW5lcmF0b3Igb2YgMi4KKyAqLworCitCSUdOVU0gKmdldF9yZmMzNTI2X3ByaW1lXzgxOTIoQklHTlVNICpibikKKwl7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgUkZDMzUyNl9QUklNRV84MTkyW109eworCQkweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhDOSwweDBGLDB4REEsMHhBMiwKKwkJMHgyMSwweDY4LDB4QzIsMHgzNCwweEM0LDB4QzYsMHg2MiwweDhCLDB4ODAsMHhEQywweDFDLDB4RDEsCisJCTB4MjksMHgwMiwweDRFLDB4MDgsMHg4QSwweDY3LDB4Q0MsMHg3NCwweDAyLDB4MEIsMHhCRSwweEE2LAorCQkweDNCLDB4MTMsMHg5QiwweDIyLDB4NTEsMHg0QSwweDA4LDB4NzksMHg4RSwweDM0LDB4MDQsMHhERCwKKwkJMHhFRiwweDk1LDB4MTksMHhCMywweENELDB4M0EsMHg0MywweDFCLDB4MzAsMHgyQiwweDBBLDB4NkQsCisJCTB4RjIsMHg1RiwweDE0LDB4MzcsMHg0RiwweEUxLDB4MzUsMHg2RCwweDZELDB4NTEsMHhDMiwweDQ1LAorCQkweEU0LDB4ODUsMHhCNSwweDc2LDB4NjIsMHg1RSwweDdFLDB4QzYsMHhGNCwweDRDLDB4NDIsMHhFOSwKKwkJMHhBNiwweDM3LDB4RUQsMHg2QiwweDBCLDB4RkYsMHg1QywweEI2LDB4RjQsMHgwNiwweEI3LDB4RUQsCisJCTB4RUUsMHgzOCwweDZCLDB4RkIsMHg1QSwweDg5LDB4OUYsMHhBNSwweEFFLDB4OUYsMHgyNCwweDExLAorCQkweDdDLDB4NEIsMHgxRiwweEU2LDB4NDksMHgyOCwweDY2LDB4NTEsMHhFQywweEU0LDB4NUIsMHgzRCwKKwkJMHhDMiwweDAwLDB4N0MsMHhCOCwweEExLDB4NjMsMHhCRiwweDA1LDB4OTgsMHhEQSwweDQ4LDB4MzYsCisJCTB4MUMsMHg1NSwweEQzLDB4OUEsMHg2OSwweDE2LDB4M0YsMHhBOCwweEZELDB4MjQsMHhDRiwweDVGLAorCQkweDgzLDB4NjUsMHg1RCwweDIzLDB4REMsMHhBMywweEFELDB4OTYsMHgxQywweDYyLDB4RjMsMHg1NiwKKwkJMHgyMCwweDg1LDB4NTIsMHhCQiwweDlFLDB4RDUsMHgyOSwweDA3LDB4NzAsMHg5NiwweDk2LDB4NkQsCisJCTB4NjcsMHgwQywweDM1LDB4NEUsMHg0QSwweEJDLDB4OTgsMHgwNCwweEYxLDB4NzQsMHg2QywweDA4LAorCQkweENBLDB4MTgsMHgyMSwweDdDLDB4MzIsMHg5MCwweDVFLDB4NDYsMHgyRSwweDM2LDB4Q0UsMHgzQiwKKwkJMHhFMywweDlFLDB4NzcsMHgyQywweDE4LDB4MEUsMHg4NiwweDAzLDB4OUIsMHgyNywweDgzLDB4QTIsCisJCTB4RUMsMHgwNywweEEyLDB4OEYsMHhCNSwweEM1LDB4NUQsMHhGMCwweDZGLDB4NEMsMHg1MiwweEM5LAorCQkweERFLDB4MkIsMHhDQiwweEY2LDB4OTUsMHg1OCwweDE3LDB4MTgsMHgzOSwweDk1LDB4NDksMHg3QywKKwkJMHhFQSwweDk1LDB4NkEsMHhFNSwweDE1LDB4RDIsMHgyNiwweDE4LDB4OTgsMHhGQSwweDA1LDB4MTAsCisJCTB4MTUsMHg3MiwweDhFLDB4NUEsMHg4QSwweEFBLDB4QzQsMHgyRCwweEFELDB4MzMsMHgxNywweDBELAorCQkweDA0LDB4NTAsMHg3QSwweDMzLDB4QTgsMHg1NSwweDIxLDB4QUIsMHhERiwweDFDLDB4QkEsMHg2NCwKKwkJMHhFQywweEZCLDB4ODUsMHgwNCwweDU4LDB4REIsMHhFRiwweDBBLDB4OEEsMHhFQSwweDcxLDB4NTcsCisJCTB4NUQsMHgwNiwweDBDLDB4N0QsMHhCMywweDk3LDB4MEYsMHg4NSwweEE2LDB4RTEsMHhFNCwweEM3LAorCQkweEFCLDB4RjUsMHhBRSwweDhDLDB4REIsMHgwOSwweDMzLDB4RDcsMHgxRSwweDhDLDB4OTQsMHhFMCwKKwkJMHg0QSwweDI1LDB4NjEsMHg5RCwweENFLDB4RTMsMHhEMiwweDI2LDB4MUEsMHhEMiwweEVFLDB4NkIsCisJCTB4RjEsMHgyRiwweEZBLDB4MDYsMHhEOSwweDhBLDB4MDgsMHg2NCwweEQ4LDB4NzYsMHgwMiwweDczLAorCQkweDNFLDB4QzgsMHg2QSwweDY0LDB4NTIsMHgxRiwweDJCLDB4MTgsMHgxNywweDdCLDB4MjAsMHgwQywKKwkJMHhCQiwweEUxLDB4MTcsMHg1NywweDdBLDB4NjEsMHg1RCwweDZDLDB4NzcsMHgwOSwweDg4LDB4QzAsCisJCTB4QkEsMHhEOSwweDQ2LDB4RTIsMHgwOCwweEUyLDB4NEYsMHhBMCwweDc0LDB4RTUsMHhBQiwweDMxLAorCQkweDQzLDB4REIsMHg1QiwweEZDLDB4RTAsMHhGRCwweDEwLDB4OEUsMHg0QiwweDgyLDB4RDEsMHgyMCwKKwkJMHhBOSwweDIxLDB4MDgsMHgwMSwweDFBLDB4NzIsMHgzQywweDEyLDB4QTcsMHg4NywweEU2LDB4RDcsCisJCTB4ODgsMHg3MSwweDlBLDB4MTAsMHhCRCwweEJBLDB4NUIsMHgyNiwweDk5LDB4QzMsMHgyNywweDE4LAorCQkweDZBLDB4RjQsMHhFMiwweDNDLDB4MUEsMHg5NCwweDY4LDB4MzQsMHhCNiwweDE1LDB4MEIsMHhEQSwKKwkJMHgyNSwweDgzLDB4RTksMHhDQSwweDJBLDB4RDQsMHg0QywweEU4LDB4REIsMHhCQiwweEMyLDB4REIsCisJCTB4MDQsMHhERSwweDhFLDB4RjksMHgyRSwweDhFLDB4RkMsMHgxNCwweDFGLDB4QkUsMHhDQSwweEE2LAorCQkweDI4LDB4N0MsMHg1OSwweDQ3LDB4NEUsMHg2QiwweEMwLDB4NUQsMHg5OSwweEIyLDB4OTYsMHg0RiwKKwkJMHhBMCwweDkwLDB4QzMsMHhBMiwweDIzLDB4M0IsMHhBMSwweDg2LDB4NTEsMHg1QiwweEU3LDB4RUQsCisJCTB4MUYsMHg2MSwweDI5LDB4NzAsMHhDRSwweEUyLDB4RDcsMHhBRiwweEI4LDB4MUIsMHhERCwweDc2LAorCQkweDIxLDB4NzAsMHg0OCwweDFDLDB4RDAsMHgwNiwweDkxLDB4MjcsMHhENSwweEIwLDB4NUEsMHhBOSwKKwkJMHg5MywweEI0LDB4RUEsMHg5OCwweDhELDB4OEYsMHhERCwweEMxLDB4ODYsMHhGRiwweEI3LDB4REMsCisJCTB4OTAsMHhBNiwweEMwLDB4OEYsMHg0RCwweEY0LDB4MzUsMHhDOSwweDM0LDB4MDIsMHg4NCwweDkyLAorCQkweDM2LDB4QzMsMHhGQSwweEI0LDB4RDIsMHg3QywweDcwLDB4MjYsMHhDMSwweEQ0LDB4REMsMHhCMiwKKwkJMHg2MCwweDI2LDB4NDYsMHhERSwweEM5LDB4NzUsMHgxRSwweDc2LDB4M0QsMHhCQSwweDM3LDB4QkQsCisJCTB4RjgsMHhGRiwweDk0LDB4MDYsMHhBRCwweDlFLDB4NTMsMHgwRSwweEU1LDB4REIsMHgzOCwweDJGLAorCQkweDQxLDB4MzAsMHgwMSwweEFFLDB4QjAsMHg2QSwweDUzLDB4RUQsMHg5MCwweDI3LDB4RDgsMHgzMSwKKwkJMHgxNywweDk3LDB4MjcsMHhCMCwweDg2LDB4NUEsMHg4OSwweDE4LDB4REEsMHgzRSwweERCLDB4RUIsCisJCTB4Q0YsMHg5QiwweDE0LDB4RUQsMHg0NCwweENFLDB4NkMsMHhCQSwweENFLDB4RDQsMHhCQiwweDFCLAorCQkweERCLDB4N0YsMHgxNCwweDQ3LDB4RTYsMHhDQywweDI1LDB4NEIsMHgzMywweDIwLDB4NTEsMHg1MSwKKwkJMHgyQiwweEQ3LDB4QUYsMHg0MiwweDZGLDB4QjgsMHhGNCwweDAxLDB4MzcsMHg4QywweEQyLDB4QkYsCisJCTB4NTksMHg4MywweENBLDB4MDEsMHhDNiwweDRCLDB4OTIsMHhFQywweEYwLDB4MzIsMHhFQSwweDE1LAorCQkweEQxLDB4NzIsMHgxRCwweDAzLDB4RjQsMHg4MiwweEQ3LDB4Q0UsMHg2RSwweDc0LDB4RkUsMHhGNiwKKwkJMHhENSwweDVFLDB4NzAsMHgyRiwweDQ2LDB4OTgsMHgwQywweDgyLDB4QjUsMHhBOCwweDQwLDB4MzEsCisJCTB4OTAsMHgwQiwweDFDLDB4OUUsMHg1OSwweEU3LDB4QzksMHg3RiwweEJFLDB4QzcsMHhFOCwweEYzLAorCQkweDIzLDB4QTksMHg3QSwweDdFLDB4MzYsMHhDQywweDg4LDB4QkUsMHgwRiwweDFELDB4NDUsMHhCNywKKwkJMHhGRiwweDU4LDB4NUEsMHhDNSwweDRCLDB4RDQsMHgwNywweEIyLDB4MkIsMHg0MSwweDU0LDB4QUEsCisJCTB4Q0MsMHg4RiwweDZELDB4N0UsMHhCRiwweDQ4LDB4RTEsMHhEOCwweDE0LDB4Q0MsMHg1RSwweEQyLAorCQkweDBGLDB4ODAsMHgzNywweEUwLDB4QTcsMHg5NywweDE1LDB4RUUsMHhGMiwweDlCLDB4RTMsMHgyOCwKKwkJMHgwNiwweEExLDB4RDUsMHg4QiwweEI3LDB4QzUsMHhEQSwweDc2LDB4RjUsMHg1MCwweEFBLDB4M0QsCisJCTB4OEEsMHgxRiwweEJGLDB4RjAsMHhFQiwweDE5LDB4Q0MsMHhCMSwweEEzLDB4MTMsMHhENSwweDVDLAorCQkweERBLDB4NTYsMHhDOSwweEVDLDB4MkUsMHhGMiwweDk2LDB4MzIsMHgzOCwweDdGLDB4RTgsMHhENywKKwkJMHg2RSwweDNDLDB4MDQsMHg2OCwweDA0LDB4M0UsMHg4RiwweDY2LDB4M0YsMHg0OCwweDYwLDB4RUUsCisJCTB4MTIsMHhCRiwweDJELDB4NUIsMHgwQiwweDc0LDB4NzQsMHhENiwweEU2LDB4OTQsMHhGOSwweDFFLAorCQkweDZELDB4QkUsMHgxMSwweDU5LDB4NzQsMHhBMywweDkyLDB4NkYsMHgxMiwweEZFLDB4RTUsMHhFNCwKKwkJMHgzOCwweDc3LDB4N0MsMHhCNiwweEE5LDB4MzIsMHhERiwweDhDLDB4RDgsMHhCRSwweEM0LDB4RDAsCisJCTB4NzMsMHhCOSwweDMxLDB4QkEsMHgzQiwweEM4LDB4MzIsMHhCNiwweDhELDB4OUQsMHhEMywweDAwLAorCQkweDc0LDB4MUYsMHhBNywweEJGLDB4OEEsMHhGQywweDQ3LDB4RUQsMHgyNSwweDc2LDB4RjYsMHg5MywKKwkJMHg2QiwweEE0LDB4MjQsMHg2NiwweDNBLDB4QUIsMHg2MywweDlDLDB4NUEsMHhFNCwweEY1LDB4NjgsCisJCTB4MzQsMHgyMywweEI0LDB4NzQsMHgyQiwweEYxLDB4QzksMHg3OCwweDIzLDB4OEYsMHgxNiwweENCLAorCQkweEUzLDB4OUQsMHg2NSwweDJELDB4RTMsMHhGRCwweEI4LDB4QkUsMHhGQywweDg0LDB4OEEsMHhEOSwKKwkJMHgyMiwweDIyLDB4MkUsMHgwNCwweEE0LDB4MDMsMHg3QywweDA3LDB4MTMsMHhFQiwweDU3LDB4QTgsCisJCTB4MUEsMHgyMywweEYwLDB4QzcsMHgzNCwweDczLDB4RkMsMHg2NCwweDZDLDB4RUEsMHgzMCwweDZCLAorCQkweDRCLDB4Q0IsMHhDOCwweDg2LDB4MkYsMHg4MywweDg1LDB4REQsMHhGQSwweDlELDB4NEIsMHg3RiwKKwkJMHhBMiwweEMwLDB4ODcsMHhFOCwweDc5LDB4NjgsMHgzMywweDAzLDB4RUQsMHg1QiwweERELDB4M0EsCisJCTB4MDYsMHgyQiwweDNDLDB4RjUsMHhCMywweEEyLDB4NzgsMHhBNiwweDZELDB4MkEsMHgxMywweEY4LAorCQkweDNGLDB4NDQsMHhGOCwweDJELDB4REYsMHgzMSwweDBFLDB4RTAsMHg3NCwweEFCLDB4NkEsMHgzNiwKKwkJMHg0NSwweDk3LDB4RTgsMHg5OSwweEEwLDB4MjUsMHg1RCwweEMxLDB4NjQsMHhGMywweDFDLDB4QzUsCisJCTB4MDgsMHg0NiwweDg1LDB4MUQsMHhGOSwweEFCLDB4NDgsMHgxOSwweDVELDB4RUQsMHg3RSwweEExLAorCQkweEIxLDB4RDUsMHgxMCwweEJELDB4N0UsMHhFNywweDRELDB4NzMsMHhGQSwweEYzLDB4NkIsMHhDMywKKwkJMHgxRSwweENGLDB4QTIsMHg2OCwweDM1LDB4OTAsMHg0NiwweEY0LDB4RUIsMHg4NywweDlGLDB4OTIsCisJCTB4NDAsMHgwOSwweDQzLDB4OEIsMHg0OCwweDFDLDB4NkMsMHhENywweDg4LDB4OUEsMHgwMCwweDJFLAorCQkweEQ1LDB4RUUsMHgzOCwweDJCLDB4QzksMHgxOSwweDBELDB4QTYsMHhGQywweDAyLDB4NkUsMHg0NywKKwkJMHg5NSwweDU4LDB4RTQsMHg0NywweDU2LDB4NzcsMHhFOSwweEFBLDB4OUUsMHgzMCwweDUwLDB4RTIsCisJCTB4NzYsMHg1NiwweDk0LDB4REYsMHhDOCwweDFGLDB4NTYsMHhFOCwweDgwLDB4QjksMHg2RSwweDcxLAorCQkweDYwLDB4QzksMHg4MCwweERELDB4OTgsMHhFRCwweEQzLDB4REYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkJMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkJfTsKKwlyZXR1cm4gQk5fYmluMmJuKFJGQzM1MjZfUFJJTUVfODE5MixzaXplb2YoUkZDMzUyNl9QUklNRV84MTkyKSxibik7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fY3R4LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fY3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyMjU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9jdHguYwpAQCAtMCwwICsxLDQ1NCBAQAorLyogY3J5cHRvL2JuL2JuX2N0eC5jICovCisvKiBXcml0dGVuIGJ5IFVsZiBNb2VsbGVyIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LiAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZiAhZGVmaW5lZChCTl9DVFhfREVCVUcpICYmICFkZWZpbmVkKEJOX0RFQlVHKQorI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgTkRFQlVHCisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAiYm5fbGNsLmgiCisKKy8qIFRPRE8gbGlzdAorICoKKyAqIDEuIENoZWNrIGEgYnVuY2ggb2YgIih3b3JkcysxKSIgdHlwZSBoYWNrcyBpbiB2YXJpb3VzIGJpZ251bSBmdW5jdGlvbnMgYW5kCisgKiBjaGVjayB0aGV5IGNhbiBiZSBzYWZlbHkgcmVtb3ZlZC4KKyAqICAtIENoZWNrICsxIGFuZCBvdGhlciB1Z2xpbmVzcyBpbiBCTl9mcm9tX21vbnRnb21lcnkoKQorICoKKyAqIDIuIENvbnNpZGVyIGFsbG93aW5nIGEgQk5fbmV3X2V4KCkgdGhhdCwgYXQgbGVhc3QsIGxldHMgeW91IHNwZWNpZnkgYW4KKyAqIGFwcHJvcHJpYXRlICdibG9jaycgc2l6ZSB0aGF0IHdpbGwgYmUgaG9ub3VyZWQgYnkgYm5fZXhwYW5kX2ludGVybmFsKCkgdG8KKyAqIHByZXZlbnQgcGlkZGx5IGxpdHRsZSByZWFsbG9jYXRpb25zLiBPVE9ILCBwcm9maWxpbmcgYmlnbnVtIGV4cGFuc2lvbnMgaW4KKyAqIEJOX0NUWCBkb2Vzbid0IHNob3cgdGhpcyB0byBiZSBhIGJpZyBpc3N1ZS4KKyAqLworCisvKiBIb3cgbWFueSBiaWdudW1zIGFyZSBpbiBlYWNoICJwb29sIGl0ZW0iOyAqLworI2RlZmluZSBCTl9DVFhfUE9PTF9TSVpFCTE2CisvKiBUaGUgc3RhY2sgZnJhbWUgaW5mbyBpcyByZXNpemluZywgc2V0IGEgZmlyc3QtdGltZSBleHBhbnNpb24gc2l6ZTsgKi8KKyNkZWZpbmUgQk5fQ1RYX1NUQVJUX0ZSQU1FUwkzMgorCisvKioqKioqKioqKiovCisvKiBCTl9QT09MICovCisvKioqKioqKioqKiovCisKKy8qIEEgYnVuZGxlIG9mIGJpZ251bXMgdGhhdCBjYW4gYmUgbGlua2VkIHdpdGggb3RoZXIgYnVuZGxlcyAqLwordHlwZWRlZiBzdHJ1Y3QgYmlnbnVtX3Bvb2xfaXRlbQorCXsKKwkvKiBUaGUgYmlnbnVtIHZhbHVlcyAqLworCUJJR05VTSB2YWxzW0JOX0NUWF9QT09MX1NJWkVdOworCS8qIExpbmtlZC1saXN0IGFkbWluICovCisJc3RydWN0IGJpZ251bV9wb29sX2l0ZW0gKnByZXYsICpuZXh0OworCX0gQk5fUE9PTF9JVEVNOworLyogQSBsaW5rZWQtbGlzdCBvZiBiaWdudW1zIGdyb3VwZWQgaW4gYnVuZGxlcyAqLwordHlwZWRlZiBzdHJ1Y3QgYmlnbnVtX3Bvb2wKKwl7CisJLyogTGlua2VkLWxpc3QgYWRtaW4gKi8KKwlCTl9QT09MX0lURU0gKmhlYWQsICpjdXJyZW50LCAqdGFpbDsKKwkvKiBTdGFjayBkZXB0aCBhbmQgYWxsb2NhdGlvbiBzaXplICovCisJdW5zaWduZWQgdXNlZCwgc2l6ZTsKKwl9IEJOX1BPT0w7CitzdGF0aWMgdm9pZAkJQk5fUE9PTF9pbml0KEJOX1BPT0wgKik7CitzdGF0aWMgdm9pZAkJQk5fUE9PTF9maW5pc2goQk5fUE9PTCAqKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitzdGF0aWMgdm9pZAkJQk5fUE9PTF9yZXNldChCTl9QT09MICopOworI2VuZGlmCitzdGF0aWMgQklHTlVNICoJCUJOX1BPT0xfZ2V0KEJOX1BPT0wgKik7CitzdGF0aWMgdm9pZAkJQk5fUE9PTF9yZWxlYXNlKEJOX1BPT0wgKiwgdW5zaWduZWQgaW50KTsKKworLyoqKioqKioqKioqKi8KKy8qIEJOX1NUQUNLICovCisvKioqKioqKioqKioqLworCisvKiBBIHdyYXBwZXIgdG8gbWFuYWdlIHRoZSAic3RhY2sgZnJhbWVzIiAqLwordHlwZWRlZiBzdHJ1Y3QgYmlnbnVtX2N0eF9zdGFjaworCXsKKwkvKiBBcnJheSBvZiBpbmRleGVzIGludG8gdGhlIGJpZ251bSBzdGFjayAqLworCXVuc2lnbmVkIGludCAqaW5kZXhlczsKKwkvKiBOdW1iZXIgb2Ygc3RhY2sgZnJhbWVzLCBhbmQgdGhlIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBhcnJheSAqLworCXVuc2lnbmVkIGludCBkZXB0aCwgc2l6ZTsKKwl9IEJOX1NUQUNLOworc3RhdGljIHZvaWQJCUJOX1NUQUNLX2luaXQoQk5fU1RBQ0sgKik7CitzdGF0aWMgdm9pZAkJQk5fU1RBQ0tfZmluaXNoKEJOX1NUQUNLICopOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK3N0YXRpYyB2b2lkCQlCTl9TVEFDS19yZXNldChCTl9TVEFDSyAqKTsKKyNlbmRpZgorc3RhdGljIGludAkJQk5fU1RBQ0tfcHVzaChCTl9TVEFDSyAqLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIHVuc2lnbmVkIGludAlCTl9TVEFDS19wb3AoQk5fU1RBQ0sgKik7CisKKy8qKioqKioqKioqLworLyogQk5fQ1RYICovCisvKioqKioqKioqKi8KKworLyogVGhlIG9wYXF1ZSBCTl9DVFggdHlwZSAqLworc3RydWN0IGJpZ251bV9jdHgKKwl7CisJLyogVGhlIGJpZ251bSBidW5kbGVzICovCisJQk5fUE9PTCBwb29sOworCS8qIFRoZSAic3RhY2sgZnJhbWVzIiwgaWYgeW91IHdpbGwgKi8KKwlCTl9TVEFDSyBzdGFjazsKKwkvKiBUaGUgbnVtYmVyIG9mIGJpZ251bXMgY3VycmVudGx5IGFzc2lnbmVkICovCisJdW5zaWduZWQgaW50IHVzZWQ7CisJLyogRGVwdGggb2Ygc3RhY2sgb3ZlcmZsb3cgKi8KKwlpbnQgZXJyX3N0YWNrOworCS8qIEJsb2NrICJnZXRzIiB1bnRpbCBhbiAiZW5kIiAoY29tcGF0aWJpbGl0eSBiZWhhdmlvdXIpICovCisJaW50IHRvb19tYW55OworCX07CisKKy8qIEVuYWJsZSB0aGlzIHRvIGZpbmQgQk5fQ1RYIGJ1Z3MgKi8KKyNpZmRlZiBCTl9DVFhfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpjdHhkYmdfY3VyID0gTlVMTDsKK3N0YXRpYyB2b2lkIGN0eGRiZyhCTl9DVFggKmN0eCkKKwl7CisJdW5zaWduZWQgaW50IGJuaWR4ID0gMCwgZnBpZHggPSAwOworCUJOX1BPT0xfSVRFTSAqaXRlbSA9IGN0eC0+cG9vbC5oZWFkOworCUJOX1NUQUNLICpzdGFjayA9ICZjdHgtPnN0YWNrOworCWZwcmludGYoc3RkZXJyLCIoJTA4eCk6ICIsICh1bnNpZ25lZCBpbnQpY3R4KTsKKwl3aGlsZShibmlkeCA8IGN0eC0+dXNlZCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiJTAzeCAiLCBpdGVtLT52YWxzW2JuaWR4KysgJSBCTl9DVFhfUE9PTF9TSVpFXS5kbWF4KTsKKwkJaWYoIShibmlkeCAlIEJOX0NUWF9QT09MX1NJWkUpKQorCQkJaXRlbSA9IGl0ZW0tPm5leHQ7CisJCX0KKwlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwlibmlkeCA9IDA7CisJZnByaW50ZihzdGRlcnIsIiAgICAgICAgICA6ICIpOworCXdoaWxlKGZwaWR4IDwgc3RhY2stPmRlcHRoKQorCQl7CisJCXdoaWxlKGJuaWR4KysgPCBzdGFjay0+aW5kZXhlc1tmcGlkeF0pCisJCQlmcHJpbnRmKHN0ZGVyciwiICAgICIpOworCQlmcHJpbnRmKHN0ZGVyciwiXl5eICIpOworCQlibmlkeCsrOworCQlmcGlkeCsrOworCQl9CisJZnByaW50ZihzdGRlcnIsIlxuIik7CisJfQorI2RlZmluZSBDVFhEQkdfRU5UUlkoc3RyLCBjdHgpCWRvIHsgXAorCQkJCWN0eGRiZ19jdXIgPSAoc3RyKTsgXAorCQkJCWZwcmludGYoc3RkZXJyLCJTdGFydGluZyAlc1xuIiwgY3R4ZGJnX2N1cik7IFwKKwkJCQljdHhkYmcoY3R4KTsgXAorCQkJCX0gd2hpbGUoMCkKKyNkZWZpbmUgQ1RYREJHX0VYSVQoY3R4KQlkbyB7IFwKKwkJCQlmcHJpbnRmKHN0ZGVyciwiRW5kaW5nICVzXG4iLCBjdHhkYmdfY3VyKTsgXAorCQkJCWN0eGRiZyhjdHgpOyBcCisJCQkJfSB3aGlsZSgwKQorI2RlZmluZSBDVFhEQkdfUkVUKGN0eCxyZXQpCisjZWxzZQorI2RlZmluZSBDVFhEQkdfRU5UUlkoc3RyLCBjdHgpCisjZGVmaW5lIENUWERCR19FWElUKGN0eCkKKyNkZWZpbmUgQ1RYREJHX1JFVChjdHgscmV0KQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgYW4gZXZpbCBsZWdhY3kgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gVGhpcyBpbXBsZW1lbnRhdGlvbgorICogaXMgV1lTSVdZRywgdGhvdWdoIEkndmUgZG9uZSBteSBiZXN0LiAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK3ZvaWQgQk5fQ1RYX2luaXQoQk5fQ1RYICpjdHgpCisJeworCS8qIEFzc3VtZSB0aGUgY2FsbGVyIG9idGFpbmVkIHRoZSBjb250ZXh0IHZpYSBCTl9DVFhfbmV3KCkgYW5kIHNvIGlzCisJICogdHJ5aW5nIHRvIHJlc2V0IGl0IGZvciB1c2UuIE5vdGhpbmcgZWxzZSBtYWtlcyBzZW5zZSwgbGVhc3Qgb2YgYWxsCisJICogYmluYXJ5IGNvbXBhdGliaWxpdHkgZnJvbSBhIHRpbWUgd2hlbiB0aGV5IGNvdWxkIGRlY2xhcmUgYSBzdGF0aWMKKwkgKiB2YXJpYWJsZS4gKi8KKwlCTl9QT09MX3Jlc2V0KCZjdHgtPnBvb2wpOworCUJOX1NUQUNLX3Jlc2V0KCZjdHgtPnN0YWNrKTsKKwljdHgtPnVzZWQgPSAwOworCWN0eC0+ZXJyX3N0YWNrID0gMDsKKwljdHgtPnRvb19tYW55ID0gMDsKKwl9CisjZW5kaWYKKworQk5fQ1RYICpCTl9DVFhfbmV3KHZvaWQpCisJeworCUJOX0NUWCAqcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJOX0NUWCkpOworCWlmKCFyZXQpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9DVFhfTkVXLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwkvKiBJbml0aWFsaXNlIHRoZSBzdHJ1Y3R1cmUgKi8KKwlCTl9QT09MX2luaXQoJnJldC0+cG9vbCk7CisJQk5fU1RBQ0tfaW5pdCgmcmV0LT5zdGFjayk7CisJcmV0LT51c2VkID0gMDsKKwlyZXQtPmVycl9zdGFjayA9IDA7CisJcmV0LT50b29fbWFueSA9IDA7CisJcmV0dXJuIHJldDsKKwl9CisKK3ZvaWQgQk5fQ1RYX2ZyZWUoQk5fQ1RYICpjdHgpCisJeworCWlmIChjdHggPT0gTlVMTCkKKwkJcmV0dXJuOworI2lmZGVmIEJOX0NUWF9ERUJVRworCXsKKwlCTl9QT09MX0lURU0gKnBvb2wgPSBjdHgtPnBvb2wuaGVhZDsKKwlmcHJpbnRmKHN0ZGVyciwiQk5fQ1RYX2ZyZWUsIHN0YWNrLXNpemU9JWQsIHBvb2wtYmlnbnVtcz0lZFxuIiwKKwkJY3R4LT5zdGFjay5zaXplLCBjdHgtPnBvb2wuc2l6ZSk7CisJZnByaW50ZihzdGRlcnIsImRtYXhzOiAiKTsKKwl3aGlsZShwb29sKSB7CisJCXVuc2lnbmVkIGxvb3AgPSAwOworCQl3aGlsZShsb29wIDwgQk5fQ1RYX1BPT0xfU0laRSkKKwkJCWZwcmludGYoc3RkZXJyLCIlMDJ4ICIsIHBvb2wtPnZhbHNbbG9vcCsrXS5kbWF4KTsKKwkJcG9vbCA9IHBvb2wtPm5leHQ7CisJfQorCWZwcmludGYoc3RkZXJyLCJcbiIpOworCX0KKyNlbmRpZgorCUJOX1NUQUNLX2ZpbmlzaCgmY3R4LT5zdGFjayk7CisJQk5fUE9PTF9maW5pc2goJmN0eC0+cG9vbCk7CisJT1BFTlNTTF9mcmVlKGN0eCk7CisJfQorCit2b2lkIEJOX0NUWF9zdGFydChCTl9DVFggKmN0eCkKKwl7CisJQ1RYREJHX0VOVFJZKCJCTl9DVFhfc3RhcnQiLCBjdHgpOworCS8qIElmIHdlJ3JlIGFscmVhZHkgb3ZlcmZsb3dpbmcgLi4uICovCisJaWYoY3R4LT5lcnJfc3RhY2sgfHwgY3R4LT50b29fbWFueSkKKwkJY3R4LT5lcnJfc3RhY2srKzsKKwkvKiAoVHJ5IHRvKSBnZXQgYSBuZXcgZnJhbWUgcG9pbnRlciAqLworCWVsc2UgaWYoIUJOX1NUQUNLX3B1c2goJmN0eC0+c3RhY2ssIGN0eC0+dXNlZCkpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9DVFhfU1RBUlQsQk5fUl9UT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTKTsKKwkJY3R4LT5lcnJfc3RhY2srKzsKKwkJfQorCUNUWERCR19FWElUKGN0eCk7CisJfQorCit2b2lkIEJOX0NUWF9lbmQoQk5fQ1RYICpjdHgpCisJeworCUNUWERCR19FTlRSWSgiQk5fQ1RYX2VuZCIsIGN0eCk7CisJaWYoY3R4LT5lcnJfc3RhY2spCisJCWN0eC0+ZXJyX3N0YWNrLS07CisJZWxzZQorCQl7CisJCXVuc2lnbmVkIGludCBmcCA9IEJOX1NUQUNLX3BvcCgmY3R4LT5zdGFjayk7CisJCS8qIERvZXMgdGhpcyBzdGFjayBmcmFtZSBoYXZlIGFueXRoaW5nIHRvIHJlbGVhc2U/ICovCisJCWlmKGZwIDwgY3R4LT51c2VkKQorCQkJQk5fUE9PTF9yZWxlYXNlKCZjdHgtPnBvb2wsIGN0eC0+dXNlZCAtIGZwKTsKKwkJY3R4LT51c2VkID0gZnA7CisJCS8qIFVuamFtICJ0b29fbWFueSIgaW4gY2FzZSAiZ2V0IiBoYWQgZmFpbGVkICovCisJCWN0eC0+dG9vX21hbnkgPSAwOworCQl9CisJQ1RYREJHX0VYSVQoY3R4KTsKKwl9CisKK0JJR05VTSAqQk5fQ1RYX2dldChCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNICpyZXQ7CisJQ1RYREJHX0VOVFJZKCJCTl9DVFhfZ2V0IiwgY3R4KTsKKwlpZihjdHgtPmVycl9zdGFjayB8fCBjdHgtPnRvb19tYW55KSByZXR1cm4gTlVMTDsKKwlpZigocmV0ID0gQk5fUE9PTF9nZXQoJmN0eC0+cG9vbCkpID09IE5VTEwpCisJCXsKKwkJLyogU2V0dGluZyB0b29fbWFueSBwcmV2ZW50cyByZXBlYXRlZCAiZ2V0IiBhdHRlbXB0cyBmcm9tCisJCSAqIGNsdXR0ZXJpbmcgdGhlIGVycm9yIHN0YWNrLiAqLworCQljdHgtPnRvb19tYW55ID0gMTsKKwkJQk5lcnIoQk5fRl9CTl9DVFhfR0VULEJOX1JfVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFUyk7CisJCXJldHVybiBOVUxMOworCQl9CisJLyogT0ssIG1ha2Ugc3VyZSB0aGUgcmV0dXJuZWQgYmlnbnVtIGlzICJ6ZXJvIiAqLworCUJOX3plcm8ocmV0KTsKKwljdHgtPnVzZWQrKzsKKwlDVFhEQkdfUkVUKGN0eCwgcmV0KTsKKwlyZXR1cm4gcmV0OworCX0KKworLyoqKioqKioqKioqKi8KKy8qIEJOX1NUQUNLICovCisvKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBCTl9TVEFDS19pbml0KEJOX1NUQUNLICpzdCkKKwl7CisJc3QtPmluZGV4ZXMgPSBOVUxMOworCXN0LT5kZXB0aCA9IHN0LT5zaXplID0gMDsKKwl9CisKK3N0YXRpYyB2b2lkIEJOX1NUQUNLX2ZpbmlzaChCTl9TVEFDSyAqc3QpCisJeworCWlmKHN0LT5zaXplKSBPUEVOU1NMX2ZyZWUoc3QtPmluZGV4ZXMpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK3N0YXRpYyB2b2lkIEJOX1NUQUNLX3Jlc2V0KEJOX1NUQUNLICpzdCkKKwl7CisJc3QtPmRlcHRoID0gMDsKKwl9CisjZW5kaWYKKworc3RhdGljIGludCBCTl9TVEFDS19wdXNoKEJOX1NUQUNLICpzdCwgdW5zaWduZWQgaW50IGlkeCkKKwl7CisJaWYoc3QtPmRlcHRoID09IHN0LT5zaXplKQorCQkvKiBOZWVkIHRvIGV4cGFuZCAqLworCQl7CisJCXVuc2lnbmVkIGludCBuZXdzaXplID0gKHN0LT5zaXplID8KKwkJCQkoc3QtPnNpemUgKiAzIC8gMikgOiBCTl9DVFhfU1RBUlRfRlJBTUVTKTsKKwkJdW5zaWduZWQgaW50ICpuZXdpdGVtcyA9IE9QRU5TU0xfbWFsbG9jKG5ld3NpemUgKgorCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCQlpZighbmV3aXRlbXMpIHJldHVybiAwOworCQlpZihzdC0+ZGVwdGgpCisJCQltZW1jcHkobmV3aXRlbXMsIHN0LT5pbmRleGVzLCBzdC0+ZGVwdGggKgorCQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCQlpZihzdC0+c2l6ZSkgT1BFTlNTTF9mcmVlKHN0LT5pbmRleGVzKTsKKwkJc3QtPmluZGV4ZXMgPSBuZXdpdGVtczsKKwkJc3QtPnNpemUgPSBuZXdzaXplOworCQl9CisJc3QtPmluZGV4ZXNbKHN0LT5kZXB0aCkrK10gPSBpZHg7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgdW5zaWduZWQgaW50IEJOX1NUQUNLX3BvcChCTl9TVEFDSyAqc3QpCisJeworCXJldHVybiBzdC0+aW5kZXhlc1stLShzdC0+ZGVwdGgpXTsKKwl9CisKKy8qKioqKioqKioqKi8KKy8qIEJOX1BPT0wgKi8KKy8qKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgQk5fUE9PTF9pbml0KEJOX1BPT0wgKnApCisJeworCXAtPmhlYWQgPSBwLT5jdXJyZW50ID0gcC0+dGFpbCA9IE5VTEw7CisJcC0+dXNlZCA9IHAtPnNpemUgPSAwOworCX0KKworc3RhdGljIHZvaWQgQk5fUE9PTF9maW5pc2goQk5fUE9PTCAqcCkKKwl7CisJd2hpbGUocC0+aGVhZCkKKwkJeworCQl1bnNpZ25lZCBpbnQgbG9vcCA9IDA7CisJCUJJR05VTSAqYm4gPSBwLT5oZWFkLT52YWxzOworCQl3aGlsZShsb29wKysgPCBCTl9DVFhfUE9PTF9TSVpFKQorCQkJeworCQkJaWYoYm4tPmQpIEJOX2NsZWFyX2ZyZWUoYm4pOworCQkJYm4rKzsKKwkJCX0KKwkJcC0+Y3VycmVudCA9IHAtPmhlYWQtPm5leHQ7CisJCU9QRU5TU0xfZnJlZShwLT5oZWFkKTsKKwkJcC0+aGVhZCA9IHAtPmN1cnJlbnQ7CisJCX0KKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitzdGF0aWMgdm9pZCBCTl9QT09MX3Jlc2V0KEJOX1BPT0wgKnApCisJeworCUJOX1BPT0xfSVRFTSAqaXRlbSA9IHAtPmhlYWQ7CisJd2hpbGUoaXRlbSkKKwkJeworCQl1bnNpZ25lZCBpbnQgbG9vcCA9IDA7CisJCUJJR05VTSAqYm4gPSBpdGVtLT52YWxzOworCQl3aGlsZShsb29wKysgPCBCTl9DVFhfUE9PTF9TSVpFKQorCQkJeworCQkJaWYoYm4tPmQpIEJOX2NsZWFyKGJuKTsKKwkJCWJuKys7CisJCQl9CisJCWl0ZW0gPSBpdGVtLT5uZXh0OworCQl9CisJcC0+Y3VycmVudCA9IHAtPmhlYWQ7CisJcC0+dXNlZCA9IDA7CisJfQorI2VuZGlmCisKK3N0YXRpYyBCSUdOVU0gKkJOX1BPT0xfZ2V0KEJOX1BPT0wgKnApCisJeworCWlmKHAtPnVzZWQgPT0gcC0+c2l6ZSkKKwkJeworCQlCSUdOVU0gKmJuOworCQl1bnNpZ25lZCBpbnQgbG9vcCA9IDA7CisJCUJOX1BPT0xfSVRFTSAqaXRlbSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihCTl9QT09MX0lURU0pKTsKKwkJaWYoIWl0ZW0pIHJldHVybiBOVUxMOworCQkvKiBJbml0aWFsaXNlIHRoZSBzdHJ1Y3R1cmUgKi8KKwkJYm4gPSBpdGVtLT52YWxzOworCQl3aGlsZShsb29wKysgPCBCTl9DVFhfUE9PTF9TSVpFKQorCQkJQk5faW5pdChibisrKTsKKwkJaXRlbS0+cHJldiA9IHAtPnRhaWw7CisJCWl0ZW0tPm5leHQgPSBOVUxMOworCQkvKiBMaW5rIGl0IGluICovCisJCWlmKCFwLT5oZWFkKQorCQkJcC0+aGVhZCA9IHAtPmN1cnJlbnQgPSBwLT50YWlsID0gaXRlbTsKKwkJZWxzZQorCQkJeworCQkJcC0+dGFpbC0+bmV4dCA9IGl0ZW07CisJCQlwLT50YWlsID0gaXRlbTsKKwkJCXAtPmN1cnJlbnQgPSBpdGVtOworCQkJfQorCQlwLT5zaXplICs9IEJOX0NUWF9QT09MX1NJWkU7CisJCXAtPnVzZWQrKzsKKwkJLyogUmV0dXJuIHRoZSBmaXJzdCBiaWdudW0gZnJvbSB0aGUgbmV3IHBvb2wgKi8KKwkJcmV0dXJuIGl0ZW0tPnZhbHM7CisJCX0KKwlpZighcC0+dXNlZCkKKwkJcC0+Y3VycmVudCA9IHAtPmhlYWQ7CisJZWxzZSBpZigocC0+dXNlZCAlIEJOX0NUWF9QT09MX1NJWkUpID09IDApCisJCXAtPmN1cnJlbnQgPSBwLT5jdXJyZW50LT5uZXh0OworCXJldHVybiBwLT5jdXJyZW50LT52YWxzICsgKChwLT51c2VkKyspICUgQk5fQ1RYX1BPT0xfU0laRSk7CisJfQorCitzdGF0aWMgdm9pZCBCTl9QT09MX3JlbGVhc2UoQk5fUE9PTCAqcCwgdW5zaWduZWQgaW50IG51bSkKKwl7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IChwLT51c2VkIC0gMSkgJSBCTl9DVFhfUE9PTF9TSVpFOworCXAtPnVzZWQgLT0gbnVtOworCXdoaWxlKG51bS0tKQorCQl7CisJCWJuX2NoZWNrX3RvcChwLT5jdXJyZW50LT52YWxzICsgb2Zmc2V0KTsKKwkJaWYoIW9mZnNldCkKKwkJCXsKKwkJCW9mZnNldCA9IEJOX0NUWF9QT09MX1NJWkUgLSAxOworCQkJcC0+Y3VycmVudCA9IHAtPmN1cnJlbnQtPnByZXY7CisJCQl9CisJCWVsc2UKKwkJCW9mZnNldC0tOworCQl9CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZGVwci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2RlcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzUzNWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2RlcHIuYwpAQCAtMCwwICsxLDExMiBAQAorLyogY3J5cHRvL2JuL2JuX2RlcHIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIFN1cHBvcnQgZm9yIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGdvZXMgaGVyZSAtIHN0YXRpYyBsaW5rYWdlIHdpbGwgb25seSBzbHVycAorICogdGhpcyBjb2RlIGlmIGFwcGxpY2F0aW9ucyBhcmUgdXNpbmcgdGhlbSBkaXJlY3RseS4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAiYm5fbGNsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK3N0YXRpYyB2b2lkICpkdW1teT0mZHVtbXk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitCSUdOVU0gKkJOX2dlbmVyYXRlX3ByaW1lKEJJR05VTSAqcmV0LCBpbnQgYml0cywgaW50IHNhZmUsCisJY29uc3QgQklHTlVNICphZGQsIGNvbnN0IEJJR05VTSAqcmVtLAorCXZvaWQgKCpjYWxsYmFjaykoaW50LGludCx2b2lkICopLCB2b2lkICpjYl9hcmcpCisJeworCUJOX0dFTkNCIGNiOworCUJJR05VTSAqcm5kPU5VTEw7CisJaW50IGZvdW5kID0gMDsKKworCUJOX0dFTkNCX3NldF9vbGQoJmNiLCBjYWxsYmFjaywgY2JfYXJnKTsKKworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlpZiAoKHJuZD1CTl9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXJuZD1yZXQ7CisJaWYoIUJOX2dlbmVyYXRlX3ByaW1lX2V4KHJuZCwgYml0cywgc2FmZSwgYWRkLCByZW0sICZjYikpCisJCWdvdG8gZXJyOworCisJLyogd2UgaGF2ZSBhIHByaW1lIDotKSAqLworCWZvdW5kID0gMTsKK2VycjoKKwlpZiAoIWZvdW5kICYmIChyZXQgPT0gTlVMTCkgJiYgKHJuZCAhPSBOVUxMKSkgQk5fZnJlZShybmQpOworCXJldHVybihmb3VuZCA/IHJuZCA6IE5VTEwpOworCX0KKworaW50IEJOX2lzX3ByaW1lKGNvbnN0IEJJR05VTSAqYSwgaW50IGNoZWNrcywgdm9pZCAoKmNhbGxiYWNrKShpbnQsaW50LHZvaWQgKiksCisJQk5fQ1RYICpjdHhfcGFzc2VkLCB2b2lkICpjYl9hcmcpCisJeworCUJOX0dFTkNCIGNiOworCUJOX0dFTkNCX3NldF9vbGQoJmNiLCBjYWxsYmFjaywgY2JfYXJnKTsKKwlyZXR1cm4gQk5faXNfcHJpbWVfZXgoYSwgY2hlY2tzLCBjdHhfcGFzc2VkLCAmY2IpOworCX0KKworaW50IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0KGNvbnN0IEJJR05VTSAqYSwgaW50IGNoZWNrcywKKwkJdm9pZCAoKmNhbGxiYWNrKShpbnQsaW50LHZvaWQgKiksCisJCUJOX0NUWCAqY3R4X3Bhc3NlZCwgdm9pZCAqY2JfYXJnLAorCQlpbnQgZG9fdHJpYWxfZGl2aXNpb24pCisJeworCUJOX0dFTkNCIGNiOworCUJOX0dFTkNCX3NldF9vbGQoJmNiLCBjYWxsYmFjaywgY2JfYXJnKTsKKwlyZXR1cm4gQk5faXNfcHJpbWVfZmFzdHRlc3RfZXgoYSwgY2hlY2tzLCBjdHhfcGFzc2VkLAorCQkJCWRvX3RyaWFsX2RpdmlzaW9uLCAmY2IpOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2Rpdi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2Rpdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmE0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZGl2LmMKQEAgLTAsMCArMSw2NTAgQEAKKy8qIGNyeXB0by9ibi9ibl9kaXYuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworCisvKiBUaGUgb2xkIHNsb3cgd2F5ICovCisjaWYgMAoraW50IEJOX2RpdihCSUdOVU0gKmR2LCBCSUdOVU0gKnJlbSwgY29uc3QgQklHTlVNICptLCBjb25zdCBCSUdOVU0gKmQsCisJICAgQk5fQ1RYICpjdHgpCisJeworCWludCBpLG5tLG5kOworCWludCByZXQgPSAwOworCUJJR05VTSAqRDsKKworCWJuX2NoZWNrX3RvcChtKTsKKwlibl9jaGVja190b3AoZCk7CisJaWYgKEJOX2lzX3plcm8oZCkpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9ESVYsQk5fUl9ESVZfQllfWkVSTyk7CisJCXJldHVybigwKTsKKwkJfQorCisJaWYgKEJOX3VjbXAobSxkKSA8IDApCisJCXsKKwkJaWYgKHJlbSAhPSBOVUxMKQorCQkJeyBpZiAoQk5fY29weShyZW0sbSkgPT0gTlVMTCkgcmV0dXJuKDApOyB9CisJCWlmIChkdiAhPSBOVUxMKSBCTl96ZXJvKGR2KTsKKwkJcmV0dXJuKDEpOworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlEID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChkdiA9PSBOVUxMKSBkdiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAocmVtID09IE5VTEwpIHJlbSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoRCA9PSBOVUxMIHx8IGR2ID09IE5VTEwgfHwgcmVtID09IE5VTEwpCisJCWdvdG8gZW5kOworCisJbmQ9Qk5fbnVtX2JpdHMoZCk7CisJbm09Qk5fbnVtX2JpdHMobSk7CisJaWYgKEJOX2NvcHkoRCxkKSA9PSBOVUxMKSBnb3RvIGVuZDsKKwlpZiAoQk5fY29weShyZW0sbSkgPT0gTlVMTCkgZ290byBlbmQ7CisKKwkvKiBUaGUgbmV4dCAyIGFyZSBuZWVkZWQgc28gd2UgY2FuIGRvIGEgZHYtPmRbMF18PTEgbGF0ZXIKKwkgKiBzaW5jZSBCTl9sc2hpZnQxIHdpbGwgb25seSB3b3JrIG9uY2UgdGhlcmUgaXMgYSB2YWx1ZSA6LSkgKi8KKwlCTl96ZXJvKGR2KTsKKwlpZihibl93ZXhwYW5kKGR2LDEpID09IE5VTEwpIGdvdG8gZW5kOworCWR2LT50b3A9MTsKKworCWlmICghQk5fbHNoaWZ0KEQsRCxubS1uZCkpIGdvdG8gZW5kOworCWZvciAoaT1ubS1uZDsgaT49MDsgaS0tKQorCQl7CisJCWlmICghQk5fbHNoaWZ0MShkdixkdikpIGdvdG8gZW5kOworCQlpZiAoQk5fdWNtcChyZW0sRCkgPj0gMCkKKwkJCXsKKwkJCWR2LT5kWzBdfD0xOworCQkJaWYgKCFCTl91c3ViKHJlbSxyZW0sRCkpIGdvdG8gZW5kOworCQkJfQorLyogQ0FOIElNUFJPVkUgKGFuZCBoYXZlIG5vdyA6PSkgKi8KKwkJaWYgKCFCTl9yc2hpZnQxKEQsRCkpIGdvdG8gZW5kOworCQl9CisJcmVtLT5uZWc9Qk5faXNfemVybyhyZW0pPzA6bS0+bmVnOworCWR2LT5uZWc9bS0+bmVnXmQtPm5lZzsKKwlyZXQgPSAxOworIGVuZDoKKwlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuKHJldCk7CisJfQorCisjZWxzZQorCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fSU5MSU5FX0FTTSkgXAorICAgICYmICFkZWZpbmVkKFBFREFOVElDKSAmJiAhZGVmaW5lZChCTl9ESVYzVykKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18+PTIKKyMgIGlmIGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkIChfX2kzODZfXykKKyAgIC8qCisgICAgKiBUaGVyZSB3ZXJlIHR3byByZWFzb25zIGZvciBpbXBsZW1lbnRpbmcgdGhpcyB0ZW1wbGF0ZToKKyAgICAqIC0gR05VIEMgZ2VuZXJhdGVzIGEgY2FsbCB0byBhIGZ1bmN0aW9uIChfX3VkaXZkaTMgdG8gYmUgZXhhY3QpCisgICAgKiAgIGluIHJlcGx5IHRvICgoKChCTl9VTExPTkcpbjApPDxCTl9CSVRTMil8bjEpL2QwIChJIGZhaWwgdG8KKyAgICAqICAgdW5kZXJzdGFuZCB3aHkuLi4pOworICAgICogLSBkaXZsIGRvZXNuJ3Qgb25seSBjYWxjdWxhdGUgcXVvdGllbnQsIGJ1dCBhbHNvIGxlYXZlcworICAgICogICByZW1haW5kZXIgaW4gJWVkeCB3aGljaCB3ZSBjYW4gZGVmaW5pdGVseSB1c2UgaGVyZTotKQorICAgICoKKyAgICAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgICAgKi8KKyMgIGRlZmluZSBibl9kaXZfd29yZHMobjAsbjEsZDApCQlcCisJKHsgIGFzbSB2b2xhdGlsZSAoCQkJXAorCQkiZGl2bAklNCIJCQlcCisJCTogIj1hIihxKSwgIj1kIihyZW0pCQlcCisJCTogImEiKG4xKSwgImQiKG4wKSwgImciKGQwKQlcCisJCTogImNjIik7CQkJXAorCSAgICBxOwkJCQkJXAorCX0pCisjICBkZWZpbmUgUkVNQUlOREVSX0lTX0FMUkVBRFlfQ0FMQ1VMQVRFRAorIyAgZWxpZiBkZWZpbmVkKF9feDg2XzY0KSAmJiBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUX0xPTkcpCisgICAvKgorICAgICogU2FtZSBzdG9yeSBoZXJlLCBidXQgaXQncyAxMjgtYml0IGJ5IDY0LWJpdCBkaXZpc2lvbi4gV293IQorICAgICoJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKyAgICAqLworIyAgZGVmaW5lIGJuX2Rpdl93b3JkcyhuMCxuMSxkMCkJCVwKKwkoeyAgYXNtIHZvbGF0aWxlICgJCQlcCisJCSJkaXZxCSU0IgkJCVwKKwkJOiAiPWEiKHEpLCAiPWQiKHJlbSkJCVwKKwkJOiAiYSIobjEpLCAiZCIobjApLCAiZyIoZDApCVwKKwkJOiAiY2MiKTsJCQlcCisJICAgIHE7CQkJCQlcCisJfSkKKyMgIGRlZmluZSBSRU1BSU5ERVJfSVNfQUxSRUFEWV9DQUxDVUxBVEVECisjICBlbmRpZiAvKiBfXzxjcHU+ICovCisjIGVuZGlmIC8qIF9fR05VQ19fICovCisjZW5kaWYgLyogT1BFTlNTTF9OT19BU00gKi8KKworCisvKiBCTl9kaXZbX25vX2JyYW5jaF0gY29tcHV0ZXMgIGR2IDo9IG51bSAvIGRpdmlzb3IsICByb3VuZGluZyB0b3dhcmRzCisgKiB6ZXJvLCBhbmQgc2V0cyB1cCBybSAgc3VjaCB0aGF0ICBkdipkaXZpc29yICsgcm0gPSBudW0gIGhvbGRzLgorICogVGh1czoKKyAqICAgICBkdi0+bmVnID09IG51bS0+bmVnIF4gZGl2aXNvci0+bmVnICAodW5sZXNzIHRoZSByZXN1bHQgaXMgemVybykKKyAqICAgICBybS0+bmVnID09IG51bS0+bmVnICAgICAgICAgICAgICAgICAodW5sZXNzIHRoZSByZW1haW5kZXIgaXMgemVybykKKyAqIElmICdkdicgb3IgJ3JtJyBpcyBOVUxMLCB0aGUgcmVzcGVjdGl2ZSB2YWx1ZSBpcyBub3QgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgQk5fZGl2X25vX2JyYW5jaChCSUdOVU0gKmR2LCBCSUdOVU0gKnJtLCBjb25zdCBCSUdOVU0gKm51bSwKKyAgICAgICAgY29uc3QgQklHTlVNICpkaXZpc29yLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fZGl2KEJJR05VTSAqZHYsIEJJR05VTSAqcm0sIGNvbnN0IEJJR05VTSAqbnVtLCBjb25zdCBCSUdOVU0gKmRpdmlzb3IsCisJICAgQk5fQ1RYICpjdHgpCisJeworCWludCBub3JtX3NoaWZ0LGksbG9vcDsKKwlCSUdOVU0gKnRtcCx3bnVtLCpzbnVtLCpzZGl2LCpyZXM7CisJQk5fVUxPTkcgKnJlc3AsKndudW1wOworCUJOX1VMT05HIGQwLGQxOworCWludCBudW1fbixkaXZfbjsKKworCS8qIEludmFsaWQgemVyby1wYWRkaW5nIHdvdWxkIGhhdmUgcGFydGljdWxhcmx5IGJhZCBjb25zZXF1ZW5jZXMKKwkgKiBpbiB0aGUgY2FzZSBvZiAnbnVtJywgc28gZG9uJ3QganVzdCByZWx5IG9uIGJuX2NoZWNrX3RvcCgpIGZvciB0aGlzIG9uZQorCSAqIChibl9jaGVja190b3AoKSB3b3JrcyBvbmx5IGZvciBCTl9ERUJVRyBidWlsZHMpICovCisJaWYgKG51bS0+dG9wID4gMCAmJiBudW0tPmRbbnVtLT50b3AgLSAxXSA9PSAwKQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fRElWLEJOX1JfTk9UX0lOSVRJQUxJWkVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWJuX2NoZWNrX3RvcChudW0pOworCisJaWYgKChCTl9nZXRfZmxhZ3MobnVtLCBCTl9GTEdfQ09OU1RUSU1FKSAhPSAwKSB8fCAoQk5fZ2V0X2ZsYWdzKGRpdmlzb3IsIEJOX0ZMR19DT05TVFRJTUUpICE9IDApKQorCQl7CisJCXJldHVybiBCTl9kaXZfbm9fYnJhbmNoKGR2LCBybSwgbnVtLCBkaXZpc29yLCBjdHgpOworCQl9CisKKwlibl9jaGVja190b3AoZHYpOworCWJuX2NoZWNrX3RvcChybSk7CisJLyogYm5fY2hlY2tfdG9wKG51bSk7ICovIC8qICdudW0nIGhhcyBiZWVuIGNoZWNrZWQgYWxyZWFkeSAqLworCWJuX2NoZWNrX3RvcChkaXZpc29yKTsKKworCWlmIChCTl9pc196ZXJvKGRpdmlzb3IpKQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fRElWLEJOX1JfRElWX0JZX1pFUk8pOworCQlyZXR1cm4oMCk7CisJCX0KKworCWlmIChCTl91Y21wKG51bSxkaXZpc29yKSA8IDApCisJCXsKKwkJaWYgKHJtICE9IE5VTEwpCisJCQl7IGlmIChCTl9jb3B5KHJtLG51bSkgPT0gTlVMTCkgcmV0dXJuKDApOyB9CisJCWlmIChkdiAhPSBOVUxMKSBCTl96ZXJvKGR2KTsKKwkJcmV0dXJuKDEpOworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwl0bXA9Qk5fQ1RYX2dldChjdHgpOworCXNudW09Qk5fQ1RYX2dldChjdHgpOworCXNkaXY9Qk5fQ1RYX2dldChjdHgpOworCWlmIChkdiA9PSBOVUxMKQorCQlyZXM9Qk5fQ1RYX2dldChjdHgpOworCWVsc2UJcmVzPWR2OworCWlmIChzZGl2ID09IE5VTEwgfHwgcmVzID09IE5VTEwgfHwgdG1wID09IE5VTEwgfHwgc251bSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCS8qIEZpcnN0IHdlIG5vcm1hbGlzZSB0aGUgbnVtYmVycyAqLworCW5vcm1fc2hpZnQ9Qk5fQklUUzItKChCTl9udW1fYml0cyhkaXZpc29yKSklQk5fQklUUzIpOworCWlmICghKEJOX2xzaGlmdChzZGl2LGRpdmlzb3Isbm9ybV9zaGlmdCkpKSBnb3RvIGVycjsKKwlzZGl2LT5uZWc9MDsKKwlub3JtX3NoaWZ0Kz1CTl9CSVRTMjsKKwlpZiAoIShCTl9sc2hpZnQoc251bSxudW0sbm9ybV9zaGlmdCkpKSBnb3RvIGVycjsKKwlzbnVtLT5uZWc9MDsKKwlkaXZfbj1zZGl2LT50b3A7CisJbnVtX249c251bS0+dG9wOworCWxvb3A9bnVtX24tZGl2X247CisJLyogTGV0cyBzZXR1cCBhICd3aW5kb3cnIGludG8gc251bQorCSAqIFRoaXMgaXMgdGhlIHBhcnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudAorCSAqICdhcmVhJyBiZWluZyBkaXZpZGVkICovCisJd251bS5uZWcgICA9IDA7CisJd251bS5kICAgICA9ICYoc251bS0+ZFtsb29wXSk7CisJd251bS50b3AgICA9IGRpdl9uOworCS8qIG9ubHkgbmVlZGVkIHdoZW4gQk5fdWNtcCBtZXNzZXMgdXAgdGhlIHZhbHVlcyBiZXR3ZWVuIHRvcCBhbmQgbWF4ICovCisJd251bS5kbWF4ICA9IHNudW0tPmRtYXggLSBsb29wOyAvKiBzbyB3ZSBkb24ndCBzdGVwIG91dCBvZiBib3VuZHMgKi8KKworCS8qIEdldCB0aGUgdG9wIDIgd29yZHMgb2Ygc2RpdiAqLworCS8qIGRpdl9uPXNkaXYtPnRvcDsgKi8KKwlkMD1zZGl2LT5kW2Rpdl9uLTFdOworCWQxPShkaXZfbiA9PSAxKT8wOnNkaXYtPmRbZGl2X24tMl07CisKKwkvKiBwb2ludGVyIHRvIHRoZSAndG9wJyBvZiBzbnVtICovCisJd251bXA9ICYoc251bS0+ZFtudW1fbi0xXSk7CisKKwkvKiBTZXR1cCB0byAncmVzJyAqLworCXJlcy0+bmVnPSAobnVtLT5uZWdeZGl2aXNvci0+bmVnKTsKKwlpZiAoIWJuX3dleHBhbmQocmVzLChsb29wKzEpKSkgZ290byBlcnI7CisJcmVzLT50b3A9bG9vcDsKKwlyZXNwPSAmKHJlcy0+ZFtsb29wLTFdKTsKKworCS8qIHNwYWNlIGZvciB0ZW1wICovCisJaWYgKCFibl93ZXhwYW5kKHRtcCwoZGl2X24rMSkpKSBnb3RvIGVycjsKKworCWlmIChCTl91Y21wKCZ3bnVtLHNkaXYpID49IDApCisJCXsKKwkJLyogSWYgQk5fREVCVUdfUkFORCBpcyBkZWZpbmVkIEJOX3VjbXAgY2hhbmdlcyAodmlhCisJCSAqIGJuX3BvbGx1dGUpIHRoZSBjb25zdCBiaWdudW0gYXJndW1lbnRzID0+CisJCSAqIGNsZWFuIHRoZSB2YWx1ZXMgYmV0d2VlbiB0b3AgYW5kIG1heCBhZ2FpbiAqLworCQlibl9jbGVhcl90b3AybWF4KCZ3bnVtKTsKKwkJYm5fc3ViX3dvcmRzKHdudW0uZCwgd251bS5kLCBzZGl2LT5kLCBkaXZfbik7CisJCSpyZXNwPTE7CisJCX0KKwllbHNlCisJCXJlcy0+dG9wLS07CisJLyogaWYgcmVzLT50b3AgPT0gMCB0aGVuIGNsZWFyIHRoZSBuZWcgdmFsdWUgb3RoZXJ3aXNlIGRlY3JlYXNlCisJICogdGhlIHJlc3AgcG9pbnRlciAqLworCWlmIChyZXMtPnRvcCA9PSAwKQorCQlyZXMtPm5lZyA9IDA7CisJZWxzZQorCQlyZXNwLS07CisKKwlmb3IgKGk9MDsgaTxsb29wLTE7IGkrKywgd251bXAtLSwgcmVzcC0tKQorCQl7CisJCUJOX1VMT05HIHEsbDA7CisJCS8qIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBsb29wIHVzZXMgdGhlIHRvcCB0d28gd29yZHMgb2YKKwkJICogc251bSBhbmQgc2RpdiB0byBjYWxjdWxhdGUgYSBCTl9VTE9ORyBxIHN1Y2ggdGhhdAorCQkgKiB8IHdudW0gLSBzZGl2ICogcSB8IDwgc2RpdiAqLworI2lmIGRlZmluZWQoQk5fRElWM1cpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKQorCQlCTl9VTE9ORyBibl9kaXZfM193b3JkcyhCTl9VTE9ORyosQk5fVUxPTkcsQk5fVUxPTkcpOworCQlxPWJuX2Rpdl8zX3dvcmRzKHdudW1wLGQxLGQwKTsKKyNlbHNlCisJCUJOX1VMT05HIG4wLG4xLHJlbT0wOworCisJCW4wPXdudW1wWzBdOworCQluMT13bnVtcFstMV07CisJCWlmIChuMCA9PSBkMCkKKwkJCXE9Qk5fTUFTSzI7CisJCWVsc2UgCQkJLyogbjAgPCBkMCAqLworCQkJeworI2lmZGVmIEJOX0xMT05HCisJCQlCTl9VTExPTkcgdDI7CisKKyNpZiBkZWZpbmVkKEJOX0xMT05HKSAmJiBkZWZpbmVkKEJOX0RJVjJXKSAmJiAhZGVmaW5lZChibl9kaXZfd29yZHMpCisJCQlxPShCTl9VTE9ORykoKCgoKEJOX1VMTE9ORyluMCk8PEJOX0JJVFMyKXxuMSkvZDApOworI2Vsc2UKKwkJCXE9Ym5fZGl2X3dvcmRzKG4wLG4xLGQwKTsKKyNpZmRlZiBCTl9ERUJVR19MRVZJVFRFCisJCQlmcHJpbnRmKHN0ZGVyciwiREVCVUc6IGJuX2Rpdl93b3JkcygweCUwOFgsMHglMDhYLDB4JTA4XAorWCkgLT4gMHglMDhYXG4iLAorCQkJCW4wLCBuMSwgZDAsIHEpOworI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBSRU1BSU5ERVJfSVNfQUxSRUFEWV9DQUxDVUxBVEVECisJCQkvKgorCQkJICogcmVtIGRvZXNuJ3QgaGF2ZSB0byBiZSBCTl9VTExPTkcuIFRoZSBsZWFzdCB3ZQorCQkJICoga25vdyBpdCdzIGxlc3MgdGhhdCBkMCwgaXNuJ3QgaXQ/CisJCQkgKi8KKwkJCXJlbT0objEtcSpkMCkmQk5fTUFTSzI7CisjZW5kaWYKKwkJCXQyPShCTl9VTExPTkcpZDEqcTsKKworCQkJZm9yICg7OykKKwkJCQl7CisJCQkJaWYgKHQyIDw9ICgoKChCTl9VTExPTkcpcmVtKTw8Qk5fQklUUzIpfHdudW1wWy0yXSkpCisJCQkJCWJyZWFrOworCQkJCXEtLTsKKwkJCQlyZW0gKz0gZDA7CisJCQkJaWYgKHJlbSA8IGQwKSBicmVhazsgLyogZG9uJ3QgbGV0IHJlbSBvdmVyZmxvdyAqLworCQkJCXQyIC09IGQxOworCQkJCX0KKyNlbHNlIC8qICFCTl9MTE9ORyAqLworCQkJQk5fVUxPTkcgdDJsLHQyaDsKKworCQkJcT1ibl9kaXZfd29yZHMobjAsbjEsZDApOworI2lmZGVmIEJOX0RFQlVHX0xFVklUVEUKKwkJCWZwcmludGYoc3RkZXJyLCJERUJVRzogYm5fZGl2X3dvcmRzKDB4JTA4WCwweCUwOFgsMHglMDhcCitYKSAtPiAweCUwOFhcbiIsCisJCQkJbjAsIG4xLCBkMCwgcSk7CisjZW5kaWYKKyNpZm5kZWYgUkVNQUlOREVSX0lTX0FMUkVBRFlfQ0FMQ1VMQVRFRAorCQkJcmVtPShuMS1xKmQwKSZCTl9NQVNLMjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCTl9VTVVMVF9MT0hJKQorCQkJQk5fVU1VTFRfTE9ISSh0MmwsdDJoLGQxLHEpOworI2VsaWYgZGVmaW5lZChCTl9VTVVMVF9ISUdIKQorCQkJdDJsID0gZDEgKiBxOworCQkJdDJoID0gQk5fVU1VTFRfSElHSChkMSxxKTsKKyNlbHNlCisJCQl7CisJCQlCTl9VTE9ORyBxbCwgcWg7CisJCQl0Mmw9TEJJVFMoZDEpOyB0Mmg9SEJJVFMoZDEpOworCQkJcWwgPUxCSVRTKHEpOyAgcWggPUhCSVRTKHEpOworCQkJbXVsNjQodDJsLHQyaCxxbCxxaCk7IC8qIHQyPShCTl9VTExPTkcpZDEqcTsgKi8KKwkJCX0KKyNlbmRpZgorCisJCQlmb3IgKDs7KQorCQkJCXsKKwkJCQlpZiAoKHQyaCA8IHJlbSkgfHwKKwkJCQkJKCh0MmggPT0gcmVtKSAmJiAodDJsIDw9IHdudW1wWy0yXSkpKQorCQkJCQlicmVhazsKKwkJCQlxLS07CisJCQkJcmVtICs9IGQwOworCQkJCWlmIChyZW0gPCBkMCkgYnJlYWs7IC8qIGRvbid0IGxldCByZW0gb3ZlcmZsb3cgKi8KKwkJCQlpZiAodDJsIDwgZDEpIHQyaC0tOyB0MmwgLT0gZDE7CisJCQkJfQorI2VuZGlmIC8qICFCTl9MTE9ORyAqLworCQkJfQorI2VuZGlmIC8qICFCTl9ESVYzVyAqLworCisJCWwwPWJuX211bF93b3Jkcyh0bXAtPmQsc2Rpdi0+ZCxkaXZfbixxKTsKKwkJdG1wLT5kW2Rpdl9uXT1sMDsKKwkJd251bS5kLS07CisJCS8qIGluZ29yZSB0b3AgdmFsdWVzIG9mIHRoZSBiaWdudW1zIGp1c3Qgc3ViIHRoZSB0d28gCisJCSAqIEJOX1VMT05HIGFycmF5cyB3aXRoIGJuX3N1Yl93b3JkcyAqLworCQlpZiAoYm5fc3ViX3dvcmRzKHdudW0uZCwgd251bS5kLCB0bXAtPmQsIGRpdl9uKzEpKQorCQkJeworCQkJLyogTm90ZTogQXMgd2UgaGF2ZSBjb25zaWRlcmVkIG9ubHkgdGhlIGxlYWRpbmcKKwkJCSAqIHR3byBCTl9VTE9OR3MgaW4gdGhlIGNhbGN1bGF0aW9uIG9mIHEsIHNkaXYgKiBxCisJCQkgKiBtaWdodCBiZSBncmVhdGVyIHRoYW4gd251bSAoYnV0IHRoZW4gKHEtMSkgKiBzZGl2CisJCQkgKiBpcyBsZXNzIG9yIGVxdWFsIHRoYW4gd251bSkKKwkJCSAqLworCQkJcS0tOworCQkJaWYgKGJuX2FkZF93b3Jkcyh3bnVtLmQsIHdudW0uZCwgc2Rpdi0+ZCwgZGl2X24pKQorCQkJCS8qIHdlIGNhbid0IGhhdmUgYW4gb3ZlcmZsb3cgaGVyZSAoYXNzdW1pbmcKKwkJCQkgKiB0aGF0IHEgIT0gMCwgYnV0IGlmIHEgPT0gMCB0aGVuIHRtcCBpcworCQkJCSAqIHplcm8gYW55d2F5KSAqLworCQkJCSgqd251bXApKys7CisJCQl9CisJCS8qIHN0b3JlIHBhcnQgb2YgdGhlIHJlc3VsdCAqLworCQkqcmVzcCA9IHE7CisJCX0KKwlibl9jb3JyZWN0X3RvcChzbnVtKTsKKwlpZiAocm0gIT0gTlVMTCkKKwkJeworCQkvKiBLZWVwIGEgY29weSBvZiB0aGUgbmVnIGZsYWcgaW4gbnVtIGJlY2F1c2UgaWYgcm09PW51bQorCQkgKiBCTl9yc2hpZnQoKSB3aWxsIG92ZXJ3cml0ZSBpdC4KKwkJICovCisJCWludCBuZWcgPSBudW0tPm5lZzsKKwkJQk5fcnNoaWZ0KHJtLHNudW0sbm9ybV9zaGlmdCk7CisJCWlmICghQk5faXNfemVybyhybSkpCisJCQlybS0+bmVnID0gbmVnOworCQlibl9jaGVja190b3Aocm0pOworCQl9CisJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybigxKTsKK2VycjoKKwlibl9jaGVja190b3Aocm0pOworCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4oMCk7CisJfQorCisKKy8qIEJOX2Rpdl9ub19icmFuY2ggaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgQk5fZGl2LiBJdCBkb2VzIG5vdCBjb250YWluCisgKiBicmFuY2hlcyB0aGF0IG1heSBsZWFrIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIGludCBCTl9kaXZfbm9fYnJhbmNoKEJJR05VTSAqZHYsIEJJR05VTSAqcm0sIGNvbnN0IEJJR05VTSAqbnVtLCAKKwljb25zdCBCSUdOVU0gKmRpdmlzb3IsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgbm9ybV9zaGlmdCxpLGxvb3A7CisJQklHTlVNICp0bXAsd251bSwqc251bSwqc2RpdiwqcmVzOworCUJOX1VMT05HICpyZXNwLCp3bnVtcDsKKwlCTl9VTE9ORyBkMCxkMTsKKwlpbnQgbnVtX24sZGl2X247CisKKwlibl9jaGVja190b3AoZHYpOworCWJuX2NoZWNrX3RvcChybSk7CisJLyogYm5fY2hlY2tfdG9wKG51bSk7ICovIC8qICdudW0nIGhhcyBiZWVuIGNoZWNrZWQgaW4gQk5fZGl2KCkgKi8KKwlibl9jaGVja190b3AoZGl2aXNvcik7CisKKwlpZiAoQk5faXNfemVybyhkaXZpc29yKSkKKwkJeworCQlCTmVycihCTl9GX0JOX0RJVl9OT19CUkFOQ0gsQk5fUl9ESVZfQllfWkVSTyk7CisJCXJldHVybigwKTsKKwkJfQorCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJdG1wPUJOX0NUWF9nZXQoY3R4KTsKKwlzbnVtPUJOX0NUWF9nZXQoY3R4KTsKKwlzZGl2PUJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoZHYgPT0gTlVMTCkKKwkJcmVzPUJOX0NUWF9nZXQoY3R4KTsKKwllbHNlCXJlcz1kdjsKKwlpZiAoc2RpdiA9PSBOVUxMIHx8IHJlcyA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIEZpcnN0IHdlIG5vcm1hbGlzZSB0aGUgbnVtYmVycyAqLworCW5vcm1fc2hpZnQ9Qk5fQklUUzItKChCTl9udW1fYml0cyhkaXZpc29yKSklQk5fQklUUzIpOworCWlmICghKEJOX2xzaGlmdChzZGl2LGRpdmlzb3Isbm9ybV9zaGlmdCkpKSBnb3RvIGVycjsKKwlzZGl2LT5uZWc9MDsKKwlub3JtX3NoaWZ0Kz1CTl9CSVRTMjsKKwlpZiAoIShCTl9sc2hpZnQoc251bSxudW0sbm9ybV9zaGlmdCkpKSBnb3RvIGVycjsKKwlzbnVtLT5uZWc9MDsKKworCS8qIFNpbmNlIHdlIGRvbid0IGtub3cgd2hldGhlciBzbnVtIGlzIGxhcmdlciB0aGFuIHNkaXYsCisJICogd2UgcGFkIHNudW0gd2l0aCBlbm91Z2ggemVyb2VzIHdpdGhvdXQgY2hhbmdpbmcgaXRzCisJICogdmFsdWUuIAorCSAqLworCWlmIChzbnVtLT50b3AgPD0gc2Rpdi0+dG9wKzEpIAorCQl7CisJCWlmIChibl93ZXhwYW5kKHNudW0sIHNkaXYtPnRvcCArIDIpID09IE5VTEwpIGdvdG8gZXJyOworCQlmb3IgKGkgPSBzbnVtLT50b3A7IGkgPCBzZGl2LT50b3AgKyAyOyBpKyspIHNudW0tPmRbaV0gPSAwOworCQlzbnVtLT50b3AgPSBzZGl2LT50b3AgKyAyOworCQl9CisJZWxzZQorCQl7CisJCWlmIChibl93ZXhwYW5kKHNudW0sIHNudW0tPnRvcCArIDEpID09IE5VTEwpIGdvdG8gZXJyOworCQlzbnVtLT5kW3NudW0tPnRvcF0gPSAwOworCQlzbnVtLT50b3AgKys7CisJCX0KKworCWRpdl9uPXNkaXYtPnRvcDsKKwludW1fbj1zbnVtLT50b3A7CisJbG9vcD1udW1fbi1kaXZfbjsKKwkvKiBMZXRzIHNldHVwIGEgJ3dpbmRvdycgaW50byBzbnVtCisJICogVGhpcyBpcyB0aGUgcGFydCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50CisJICogJ2FyZWEnIGJlaW5nIGRpdmlkZWQgKi8KKwl3bnVtLm5lZyAgID0gMDsKKwl3bnVtLmQgICAgID0gJihzbnVtLT5kW2xvb3BdKTsKKwl3bnVtLnRvcCAgID0gZGl2X247CisJLyogb25seSBuZWVkZWQgd2hlbiBCTl91Y21wIG1lc3NlcyB1cCB0aGUgdmFsdWVzIGJldHdlZW4gdG9wIGFuZCBtYXggKi8KKwl3bnVtLmRtYXggID0gc251bS0+ZG1heCAtIGxvb3A7IC8qIHNvIHdlIGRvbid0IHN0ZXAgb3V0IG9mIGJvdW5kcyAqLworCisJLyogR2V0IHRoZSB0b3AgMiB3b3JkcyBvZiBzZGl2ICovCisJLyogZGl2X249c2Rpdi0+dG9wOyAqLworCWQwPXNkaXYtPmRbZGl2X24tMV07CisJZDE9KGRpdl9uID09IDEpPzA6c2Rpdi0+ZFtkaXZfbi0yXTsKKworCS8qIHBvaW50ZXIgdG8gdGhlICd0b3AnIG9mIHNudW0gKi8KKwl3bnVtcD0gJihzbnVtLT5kW251bV9uLTFdKTsKKworCS8qIFNldHVwIHRvICdyZXMnICovCisJcmVzLT5uZWc9IChudW0tPm5lZ15kaXZpc29yLT5uZWcpOworCWlmICghYm5fd2V4cGFuZChyZXMsKGxvb3ArMSkpKSBnb3RvIGVycjsKKwlyZXMtPnRvcD1sb29wLTE7CisJcmVzcD0gJihyZXMtPmRbbG9vcC0xXSk7CisKKwkvKiBzcGFjZSBmb3IgdGVtcCAqLworCWlmICghYm5fd2V4cGFuZCh0bXAsKGRpdl9uKzEpKSkgZ290byBlcnI7CisKKwkvKiBpZiByZXMtPnRvcCA9PSAwIHRoZW4gY2xlYXIgdGhlIG5lZyB2YWx1ZSBvdGhlcndpc2UgZGVjcmVhc2UKKwkgKiB0aGUgcmVzcCBwb2ludGVyICovCisJaWYgKHJlcy0+dG9wID09IDApCisJCXJlcy0+bmVnID0gMDsKKwllbHNlCisJCXJlc3AtLTsKKworCWZvciAoaT0wOyBpPGxvb3AtMTsgaSsrLCB3bnVtcC0tLCByZXNwLS0pCisJCXsKKwkJQk5fVUxPTkcgcSxsMDsKKwkJLyogdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGxvb3AgdXNlcyB0aGUgdG9wIHR3byB3b3JkcyBvZgorCQkgKiBzbnVtIGFuZCBzZGl2IHRvIGNhbGN1bGF0ZSBhIEJOX1VMT05HIHEgc3VjaCB0aGF0CisJCSAqIHwgd251bSAtIHNkaXYgKiBxIHwgPCBzZGl2ICovCisjaWYgZGVmaW5lZChCTl9ESVYzVykgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pCisJCUJOX1VMT05HIGJuX2Rpdl8zX3dvcmRzKEJOX1VMT05HKixCTl9VTE9ORyxCTl9VTE9ORyk7CisJCXE9Ym5fZGl2XzNfd29yZHMod251bXAsZDEsZDApOworI2Vsc2UKKwkJQk5fVUxPTkcgbjAsbjEscmVtPTA7CisKKwkJbjA9d251bXBbMF07CisJCW4xPXdudW1wWy0xXTsKKwkJaWYgKG4wID09IGQwKQorCQkJcT1CTl9NQVNLMjsKKwkJZWxzZSAJCQkvKiBuMCA8IGQwICovCisJCQl7CisjaWZkZWYgQk5fTExPTkcKKwkJCUJOX1VMTE9ORyB0MjsKKworI2lmIGRlZmluZWQoQk5fTExPTkcpICYmIGRlZmluZWQoQk5fRElWMlcpICYmICFkZWZpbmVkKGJuX2Rpdl93b3JkcykKKwkJCXE9KEJOX1VMT05HKSgoKCgoQk5fVUxMT05HKW4wKTw8Qk5fQklUUzIpfG4xKS9kMCk7CisjZWxzZQorCQkJcT1ibl9kaXZfd29yZHMobjAsbjEsZDApOworI2lmZGVmIEJOX0RFQlVHX0xFVklUVEUKKwkJCWZwcmludGYoc3RkZXJyLCJERUJVRzogYm5fZGl2X3dvcmRzKDB4JTA4WCwweCUwOFgsMHglMDhcCitYKSAtPiAweCUwOFhcbiIsCisJCQkJbjAsIG4xLCBkMCwgcSk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFJFTUFJTkRFUl9JU19BTFJFQURZX0NBTENVTEFURUQKKwkJCS8qCisJCQkgKiByZW0gZG9lc24ndCBoYXZlIHRvIGJlIEJOX1VMTE9ORy4gVGhlIGxlYXN0IHdlCisJCQkgKiBrbm93IGl0J3MgbGVzcyB0aGF0IGQwLCBpc24ndCBpdD8KKwkJCSAqLworCQkJcmVtPShuMS1xKmQwKSZCTl9NQVNLMjsKKyNlbmRpZgorCQkJdDI9KEJOX1VMTE9ORylkMSpxOworCisJCQlmb3IgKDs7KQorCQkJCXsKKwkJCQlpZiAodDIgPD0gKCgoKEJOX1VMTE9ORylyZW0pPDxCTl9CSVRTMil8d251bXBbLTJdKSkKKwkJCQkJYnJlYWs7CisJCQkJcS0tOworCQkJCXJlbSArPSBkMDsKKwkJCQlpZiAocmVtIDwgZDApIGJyZWFrOyAvKiBkb24ndCBsZXQgcmVtIG92ZXJmbG93ICovCisJCQkJdDIgLT0gZDE7CisJCQkJfQorI2Vsc2UgLyogIUJOX0xMT05HICovCisJCQlCTl9VTE9ORyB0MmwsdDJoOworCisJCQlxPWJuX2Rpdl93b3JkcyhuMCxuMSxkMCk7CisjaWZkZWYgQk5fREVCVUdfTEVWSVRURQorCQkJZnByaW50ZihzdGRlcnIsIkRFQlVHOiBibl9kaXZfd29yZHMoMHglMDhYLDB4JTA4WCwweCUwOFwKK1gpIC0+IDB4JTA4WFxuIiwKKwkJCQluMCwgbjEsIGQwLCBxKTsKKyNlbmRpZgorI2lmbmRlZiBSRU1BSU5ERVJfSVNfQUxSRUFEWV9DQUxDVUxBVEVECisJCQlyZW09KG4xLXEqZDApJkJOX01BU0syOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKEJOX1VNVUxUX0xPSEkpCisJCQlCTl9VTVVMVF9MT0hJKHQybCx0MmgsZDEscSk7CisjZWxpZiBkZWZpbmVkKEJOX1VNVUxUX0hJR0gpCisJCQl0MmwgPSBkMSAqIHE7CisJCQl0MmggPSBCTl9VTVVMVF9ISUdIKGQxLHEpOworI2Vsc2UKKwkJCXsKKwkJCUJOX1VMT05HIHFsLCBxaDsKKwkJCXQybD1MQklUUyhkMSk7IHQyaD1IQklUUyhkMSk7CisJCQlxbCA9TEJJVFMocSk7ICBxaCA9SEJJVFMocSk7CisJCQltdWw2NCh0MmwsdDJoLHFsLHFoKTsgLyogdDI9KEJOX1VMTE9ORylkMSpxOyAqLworCQkJfQorI2VuZGlmCisKKwkJCWZvciAoOzspCisJCQkJeworCQkJCWlmICgodDJoIDwgcmVtKSB8fAorCQkJCQkoKHQyaCA9PSByZW0pICYmICh0MmwgPD0gd251bXBbLTJdKSkpCisJCQkJCWJyZWFrOworCQkJCXEtLTsKKwkJCQlyZW0gKz0gZDA7CisJCQkJaWYgKHJlbSA8IGQwKSBicmVhazsgLyogZG9uJ3QgbGV0IHJlbSBvdmVyZmxvdyAqLworCQkJCWlmICh0MmwgPCBkMSkgdDJoLS07IHQybCAtPSBkMTsKKwkJCQl9CisjZW5kaWYgLyogIUJOX0xMT05HICovCisJCQl9CisjZW5kaWYgLyogIUJOX0RJVjNXICovCisKKwkJbDA9Ym5fbXVsX3dvcmRzKHRtcC0+ZCxzZGl2LT5kLGRpdl9uLHEpOworCQl0bXAtPmRbZGl2X25dPWwwOworCQl3bnVtLmQtLTsKKwkJLyogaW5nb3JlIHRvcCB2YWx1ZXMgb2YgdGhlIGJpZ251bXMganVzdCBzdWIgdGhlIHR3byAKKwkJICogQk5fVUxPTkcgYXJyYXlzIHdpdGggYm5fc3ViX3dvcmRzICovCisJCWlmIChibl9zdWJfd29yZHMod251bS5kLCB3bnVtLmQsIHRtcC0+ZCwgZGl2X24rMSkpCisJCQl7CisJCQkvKiBOb3RlOiBBcyB3ZSBoYXZlIGNvbnNpZGVyZWQgb25seSB0aGUgbGVhZGluZworCQkJICogdHdvIEJOX1VMT05HcyBpbiB0aGUgY2FsY3VsYXRpb24gb2YgcSwgc2RpdiAqIHEKKwkJCSAqIG1pZ2h0IGJlIGdyZWF0ZXIgdGhhbiB3bnVtIChidXQgdGhlbiAocS0xKSAqIHNkaXYKKwkJCSAqIGlzIGxlc3Mgb3IgZXF1YWwgdGhhbiB3bnVtKQorCQkJICovCisJCQlxLS07CisJCQlpZiAoYm5fYWRkX3dvcmRzKHdudW0uZCwgd251bS5kLCBzZGl2LT5kLCBkaXZfbikpCisJCQkJLyogd2UgY2FuJ3QgaGF2ZSBhbiBvdmVyZmxvdyBoZXJlIChhc3N1bWluZworCQkJCSAqIHRoYXQgcSAhPSAwLCBidXQgaWYgcSA9PSAwIHRoZW4gdG1wIGlzCisJCQkJICogemVybyBhbnl3YXkpICovCisJCQkJKCp3bnVtcCkrKzsKKwkJCX0KKwkJLyogc3RvcmUgcGFydCBvZiB0aGUgcmVzdWx0ICovCisJCSpyZXNwID0gcTsKKwkJfQorCWJuX2NvcnJlY3RfdG9wKHNudW0pOworCWlmIChybSAhPSBOVUxMKQorCQl7CisJCS8qIEtlZXAgYSBjb3B5IG9mIHRoZSBuZWcgZmxhZyBpbiBudW0gYmVjYXVzZSBpZiBybT09bnVtCisJCSAqIEJOX3JzaGlmdCgpIHdpbGwgb3ZlcndyaXRlIGl0LgorCQkgKi8KKwkJaW50IG5lZyA9IG51bS0+bmVnOworCQlCTl9yc2hpZnQocm0sc251bSxub3JtX3NoaWZ0KTsKKwkJaWYgKCFCTl9pc196ZXJvKHJtKSkKKwkJCXJtLT5uZWcgPSBuZWc7CisJCWJuX2NoZWNrX3RvcChybSk7CisJCX0KKwlibl9jb3JyZWN0X3RvcChyZXMpOworCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4oMSk7CitlcnI6CisJYm5fY2hlY2tfdG9wKHJtKTsKKwlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuKDApOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZXJyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlMmViOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9lcnIuYwpAQCAtMCwwICsxLDE1MCBAQAorLyogY3J5cHRvL2JuL2JuX2Vyci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDcgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogTk9URTogdGhpcyBmaWxlIHdhcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgbWtlcnIucGwgc2NyaXB0OiBhbnkgY2hhbmdlcworICogbWFkZSB0byBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBuZXh0IHVwZGF0ZXMgdGhpcyBmaWxlLAorICogb25seSByZWFzb24gc3RyaW5ncyB3aWxsIGJlIHByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworI2RlZmluZSBFUlJfRlVOQyhmdW5jKSBFUlJfUEFDSyhFUlJfTElCX0JOLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfQk4sMCxyZWFzb24pCisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgQk5fc3RyX2Z1bmN0c1tdPQorCXsKK3tFUlJfRlVOQyhCTl9GX0JOUkFORCksCSJCTlJBTkQifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0JMSU5ESU5HX0NPTlZFUlRfRVgpLAkiQk5fQkxJTkRJTkdfY29udmVydF9leCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fQkxJTkRJTkdfQ1JFQVRFX1BBUkFNKSwJIkJOX0JMSU5ESU5HX2NyZWF0ZV9wYXJhbSJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fQkxJTkRJTkdfSU5WRVJUX0VYKSwJIkJOX0JMSU5ESU5HX2ludmVydF9leCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fQkxJTkRJTkdfTkVXKSwJIkJOX0JMSU5ESU5HX25ldyJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fQkxJTkRJTkdfVVBEQVRFKSwJIkJOX0JMSU5ESU5HX3VwZGF0ZSJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fQk4yREVDKSwJIkJOX2JuMmRlYyJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fQk4ySEVYKSwJIkJOX2JuMmhleCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fQ1RYX0dFVCksCSJCTl9DVFhfZ2V0In0sCit7RVJSX0ZVTkMoQk5fRl9CTl9DVFhfTkVXKSwJIkJOX0NUWF9uZXcifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0NUWF9TVEFSVCksCSJCTl9DVFhfc3RhcnQifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0RJViksCSJCTl9kaXYifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0RJVl9OT19CUkFOQ0gpLAkiQk5fZGl2X25vX2JyYW5jaCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fRElWX1JFQ1ApLAkiQk5fZGl2X3JlY3AifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0VYUCksCSJCTl9leHAifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0VYUEFORDIpLAkiYm5fZXhwYW5kMiJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fRVhQQU5EX0lOVEVSTkFMKSwJIkJOX0VYUEFORF9JTlRFUk5BTCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fR0YyTV9NT0QpLAkiQk5fR0YybV9tb2QifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0dGMk1fTU9EX0VYUCksCSJCTl9HRjJtX21vZF9leHAifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0dGMk1fTU9EX01VTCksCSJCTl9HRjJtX21vZF9tdWwifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0dGMk1fTU9EX1NPTFZFX1FVQUQpLAkiQk5fR0YybV9tb2Rfc29sdmVfcXVhZCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fR0YyTV9NT0RfU09MVkVfUVVBRF9BUlIpLAkiQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnIifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0dGMk1fTU9EX1NRUiksCSJCTl9HRjJtX21vZF9zcXIifSwKK3tFUlJfRlVOQyhCTl9GX0JOX0dGMk1fTU9EX1NRUlQpLAkiQk5fR0YybV9tb2Rfc3FydCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fTU9EX0VYUDJfTU9OVCksCSJCTl9tb2RfZXhwMl9tb250In0sCit7RVJSX0ZVTkMoQk5fRl9CTl9NT0RfRVhQX01PTlQpLAkiQk5fbW9kX2V4cF9tb250In0sCit7RVJSX0ZVTkMoQk5fRl9CTl9NT0RfRVhQX01PTlRfQ09OU1RUSU1FKSwJIkJOX21vZF9leHBfbW9udF9jb25zdHRpbWUifSwKK3tFUlJfRlVOQyhCTl9GX0JOX01PRF9FWFBfTU9OVF9XT1JEKSwJIkJOX21vZF9leHBfbW9udF93b3JkIn0sCit7RVJSX0ZVTkMoQk5fRl9CTl9NT0RfRVhQX1JFQ1ApLAkiQk5fbW9kX2V4cF9yZWNwIn0sCit7RVJSX0ZVTkMoQk5fRl9CTl9NT0RfRVhQX1NJTVBMRSksCSJCTl9tb2RfZXhwX3NpbXBsZSJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fTU9EX0lOVkVSU0UpLAkiQk5fbW9kX2ludmVyc2UifSwKK3tFUlJfRlVOQyhCTl9GX0JOX01PRF9JTlZFUlNFX05PX0JSQU5DSCksCSJCTl9tb2RfaW52ZXJzZV9ub19icmFuY2gifSwKK3tFUlJfRlVOQyhCTl9GX0JOX01PRF9MU0hJRlRfUVVJQ0spLAkiQk5fbW9kX2xzaGlmdF9xdWljayJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fTU9EX01VTF9SRUNJUFJPQ0FMKSwJIkJOX21vZF9tdWxfcmVjaXByb2NhbCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fTU9EX1NRUlQpLAkiQk5fbW9kX3NxcnQifSwKK3tFUlJfRlVOQyhCTl9GX0JOX01QSTJCTiksCSJCTl9tcGkyYm4ifSwKK3tFUlJfRlVOQyhCTl9GX0JOX05FVyksCSJCTl9uZXcifSwKK3tFUlJfRlVOQyhCTl9GX0JOX1JBTkQpLAkiQk5fcmFuZCJ9LAore0VSUl9GVU5DKEJOX0ZfQk5fUkFORF9SQU5HRSksCSJCTl9yYW5kX3JhbmdlIn0sCit7RVJSX0ZVTkMoQk5fRl9CTl9VU1VCKSwJIkJOX3VzdWIifSwKK3swLE5VTEx9CisJfTsKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBCTl9zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKEJOX1JfQVJHMl9MVF9BUkczKSAgICAgICAgICAgLCJhcmcyIGx0IGFyZzMifSwKK3tFUlJfUkVBU09OKEJOX1JfQkFEX1JFQ0lQUk9DQUwpICAgICAgICAgLCJiYWQgcmVjaXByb2NhbCJ9LAore0VSUl9SRUFTT04oQk5fUl9CSUdOVU1fVE9PX0xPTkcpICAgICAgICAsImJpZ251bSB0b28gbG9uZyJ9LAore0VSUl9SRUFTT04oQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMpLCJjYWxsZWQgd2l0aCBldmVuIG1vZHVsdXMifSwKK3tFUlJfUkVBU09OKEJOX1JfRElWX0JZX1pFUk8pICAgICAgICAgICAgLCJkaXYgYnkgemVybyJ9LAore0VSUl9SRUFTT04oQk5fUl9FTkNPRElOR19FUlJPUikgICAgICAgICAsImVuY29kaW5nIGVycm9yIn0sCit7RVJSX1JFQVNPTihCTl9SX0VYUEFORF9PTl9TVEFUSUNfQklHTlVNX0RBVEEpLCJleHBhbmQgb24gc3RhdGljIGJpZ251bSBkYXRhIn0sCit7RVJSX1JFQVNPTihCTl9SX0lOUFVUX05PVF9SRURVQ0VEKSAgICAgICwiaW5wdXQgbm90IHJlZHVjZWQifSwKK3tFUlJfUkVBU09OKEJOX1JfSU5WQUxJRF9MRU5HVEgpICAgICAgICAgLCJpbnZhbGlkIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oQk5fUl9JTlZBTElEX1JBTkdFKSAgICAgICAgICAsImludmFsaWQgcmFuZ2UifSwKK3tFUlJfUkVBU09OKEJOX1JfTk9UX0FfU1FVQVJFKSAgICAgICAgICAgLCJub3QgYSBzcXVhcmUifSwKK3tFUlJfUkVBU09OKEJOX1JfTk9UX0lOSVRJQUxJWkVEKSAgICAgICAgLCJub3QgaW5pdGlhbGl6ZWQifSwKK3tFUlJfUkVBU09OKEJOX1JfTk9fSU5WRVJTRSkgICAgICAgICAgICAgLCJubyBpbnZlcnNlIn0sCit7RVJSX1JFQVNPTihCTl9SX05PX1NPTFVUSU9OKSAgICAgICAgICAgICwibm8gc29sdXRpb24ifSwKK3tFUlJfUkVBU09OKEJOX1JfUF9JU19OT1RfUFJJTUUpICAgICAgICAgLCJwIGlzIG5vdCBwcmltZSJ9LAore0VSUl9SRUFTT04oQk5fUl9UT09fTUFOWV9JVEVSQVRJT05TKSAgICAsInRvbyBtYW55IGl0ZXJhdGlvbnMifSwKK3tFUlJfUkVBU09OKEJOX1JfVE9PX01BTllfVEVNUE9SQVJZX1ZBUklBQkxFUyksInRvbyBtYW55IHRlbXBvcmFyeSB2YXJpYWJsZXMifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfQk5fc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworCWlmIChFUlJfZnVuY19lcnJvcl9zdHJpbmcoQk5fc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsQk5fc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxCTl9zdHJfcmVhc29ucyk7CisJCX0KKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9leHAuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9leHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWI2YzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2V4cC5jCkBAIC0wLDAgKzEsOTkxIEBACisvKiBjcnlwdG8vYm4vYm5fZXhwLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgImJuX2xjbC5oIgorCisvKiBtYXhpbXVtIHByZWNvbXB1dGF0aW9uIHRhYmxlIHNpemUgZm9yICp2YXJpYWJsZSogc2xpZGluZyB3aW5kb3dzICovCisjZGVmaW5lIFRBQkxFX1NJWkUJMzIKKworLyogdGhpcyBvbmUgd29ya3MgLSBzaW1wbGUgYnV0IHdvcmtzICovCitpbnQgQk5fZXhwKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgaSxiaXRzLHJldD0wOworCUJJR05VTSAqdiwqcnI7CisKKwlpZiAoQk5fZ2V0X2ZsYWdzKHAsIEJOX0ZMR19DT05TVFRJTUUpICE9IDApCisJCXsKKwkJLyogQk5fRkxHX0NPTlNUVElNRSBvbmx5IHN1cHBvcnRlZCBieSBCTl9tb2RfZXhwX21vbnQoKSAqLworCQlCTmVycihCTl9GX0JOX0VYUCxFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gLTE7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCWlmICgociA9PSBhKSB8fCAociA9PSBwKSkKKwkJcnIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJZWxzZQorCQlyciA9IHI7CisJdiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAocnIgPT0gTlVMTCB8fCB2ID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKEJOX2NvcHkodixhKSA9PSBOVUxMKSBnb3RvIGVycjsKKwliaXRzPUJOX251bV9iaXRzKHApOworCisJaWYgKEJOX2lzX29kZChwKSkKKwkJeyBpZiAoQk5fY29weShycixhKSA9PSBOVUxMKSBnb3RvIGVycjsgfQorCWVsc2UJeyBpZiAoIUJOX29uZShycikpIGdvdG8gZXJyOyB9CisKKwlmb3IgKGk9MTsgaTxiaXRzOyBpKyspCisJCXsKKwkJaWYgKCFCTl9zcXIodix2LGN0eCkpIGdvdG8gZXJyOworCQlpZiAoQk5faXNfYml0X3NldChwLGkpKQorCQkJeworCQkJaWYgKCFCTl9tdWwocnIscnIsdixjdHgpKSBnb3RvIGVycjsKKwkJCX0KKwkJfQorCXJldD0xOworZXJyOgorCWlmIChyICE9IHJyKSBCTl9jb3B5KHIscnIpOworCUJOX0NUWF9lbmQoY3R4KTsKKwlibl9jaGVja190b3Aocik7CisJcmV0dXJuKHJldCk7CisJfQorCisKK2ludCBCTl9tb2RfZXhwKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqbSwKKwkgICAgICAgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQ7CisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKHApOworCWJuX2NoZWNrX3RvcChtKTsKKworCS8qIEZvciBldmVuIG1vZHVsdXMgIG0gPSAyXmsqbV9vZGQsICBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGNvbXB1dGUKKwkgKiBhXnAgbW9kIG1fb2RkICBhbmQgIGFecCBtb2QgMl5rICBzZXBhcmF0ZWx5ICh3aXRoIE1vbnRnb21lcnkKKwkgKiBleHBvbmVudGlhdGlvbiBmb3IgdGhlIG9kZCBwYXJ0KSwgdXNpbmcgYXBwcm9wcmlhdGUgZXhwb25lbnQKKwkgKiByZWR1Y3Rpb25zLCBhbmQgY29tYmluZSB0aGUgcmVzdWx0cyB1c2luZyB0aGUgQ1JULgorCSAqCisJICogRm9yIG5vdywgd2UgdXNlIE1vbnRnb21lcnkgb25seSBpZiB0aGUgbW9kdWx1cyBpcyBvZGQ7IG90aGVyd2lzZSwKKwkgKiBleHBvbmVudGlhdGlvbiB1c2luZyB0aGUgcmVjaXByb2NhbC1iYXNlZCBxdWljayByZW1haW5kZXJpbmcKKwkgKiBhbGdvcml0aG0gaXMgdXNlZC4KKwkgKgorCSAqIChUaW1pbmcgb2J0YWluZWQgd2l0aCBleHBzcGVlZC5jIFtjb21wdXRhdGlvbnMgIGFecCBtb2QgbQorCSAqIHdoZXJlICBhLCBwLCBtICBhcmUgb2YgdGhlIHNhbWUgbGVuZ3RoOiAyNTYsIDUxMiwgMTAyNCwgMjA0OCwKKwkgKiA0MDk2LCA4MTkyIGJpdHNdLCBjb21wYXJlZCB0byB0aGUgcnVubmluZyB0aW1lIG9mIHRoZQorCSAqIHN0YW5kYXJkIGFsZ29yaXRobToKKwkgKgorCSAqICAgQk5fbW9kX2V4cF9tb250ICAgMzMgLi4gNDAgJSAgW0FNRCBLNi0yLCBMaW51eCwgZGVidWcgY29uZmlndXJhdGlvbl0KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICA1NSAuLiA3NyAlICBbVWx0cmFTcGFyYyBwcm9jZXNzb3IsIGJ1dAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLXNvbGFyaXMtc3BhcmN2OC1nY2MgY29uZi5dCisJICogCisJICogICBCTl9tb2RfZXhwX3JlY3AgICA1MCAuLiA3MCAlICBbQU1EIEs2LTIsIExpbnV4LCBkZWJ1ZyBjb25maWd1cmF0aW9uXQorCSAqICAgICAgICAgICAgICAgICAgICAgNjIgLi4gMTE4ICUgW1VsdHJhU3BhcmMsIGRlYnVnLXNvbGFyaXMtc3BhcmN2OC1nY2NdCisJICoKKwkgKiBPbiB0aGUgU3BhcmMsIEJOX21vZF9leHBfcmVjcCB3YXMgZmFzdGVyIHRoYW4gQk5fbW9kX2V4cF9tb250CisJICogYXQgMjA0OCBhbmQgbW9yZSBiaXRzLCBidXQgYXQgNTEyIGFuZCAxMDI0IGJpdHMsIGl0IHdhcworCSAqIHNsb3dlciBldmVuIHRoYW4gdGhlIHN0YW5kYXJkIGFsZ29yaXRobSEKKwkgKgorCSAqICJSZWFsIiB0aW1pbmdzIFtsaW51eC1lbGYsIHNvbGFyaXMtc3BhcmN2OS1nY2MgY29uZmlndXJhdGlvbnNdCisJICogc2hvdWxkIGJlIG9idGFpbmVkIHdoZW4gdGhlIG5ldyBNb250Z29tZXJ5IHJlZHVjdGlvbiBjb2RlCisJICogaGFzIGJlZW4gaW50ZWdyYXRlZCBpbnRvIE9wZW5TU0wuKQorCSAqLworCisjZGVmaW5lIE1PTlRfTVVMX01PRAorI2RlZmluZSBNT05UX0VYUF9XT1JECisjZGVmaW5lIFJFQ1BfTVVMX01PRAorCisjaWZkZWYgTU9OVF9NVUxfTU9ECisJLyogSSBoYXZlIGZpbmFsbHkgYmVlbiBhYmxlIHRvIHRha2Ugb3V0IHRoaXMgcHJlLWNvbmRpdGlvbiBvZgorCSAqIHRoZSB0b3AgYml0IGJlaW5nIHNldC4gIEl0IHdhcyBjYXVzZWQgYnkgYW4gZXJyb3IgaW4gQk5fZGl2CisJICogd2l0aCBuZWdhdGl2ZXMuICBUaGVyZSB3YXMgYWxzbyBhbm90aGVyIHByb2JsZW0gd2hlbiBmb3IgYV5iJW0KKwkgKiBhID49IG0uICBlYXkgMDctTWF5LTk3ICovCisvKglpZiAoKG0tPmRbbS0+dG9wLTFdJkJOX1RCSVQpICYmIEJOX2lzX29kZChtKSkgKi8KKworCWlmIChCTl9pc19vZGQobSkpCisJCXsKKyMgIGlmZGVmIE1PTlRfRVhQX1dPUkQKKwkJaWYgKGEtPnRvcCA9PSAxICYmICFhLT5uZWcgJiYgKEJOX2dldF9mbGFncyhwLCBCTl9GTEdfQ09OU1RUSU1FKSA9PSAwKSkKKwkJCXsKKwkJCUJOX1VMT05HIEEgPSBhLT5kWzBdOworCQkJcmV0PUJOX21vZF9leHBfbW9udF93b3JkKHIsQSxwLG0sY3R4LE5VTEwpOworCQkJfQorCQllbHNlCisjICBlbmRpZgorCQkJcmV0PUJOX21vZF9leHBfbW9udChyLGEscCxtLGN0eCxOVUxMKTsKKwkJfQorCWVsc2UKKyNlbmRpZgorI2lmZGVmIFJFQ1BfTVVMX01PRAorCQl7IHJldD1CTl9tb2RfZXhwX3JlY3AocixhLHAsbSxjdHgpOyB9CisjZWxzZQorCQl7IHJldD1CTl9tb2RfZXhwX3NpbXBsZShyLGEscCxtLGN0eCk7IH0KKyNlbmRpZgorCisJYm5fY2hlY2tfdG9wKHIpOworCXJldHVybihyZXQpOworCX0KKworCitpbnQgQk5fbW9kX2V4cF9yZWNwKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisJCSAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgaSxqLGJpdHMscmV0PTAsd3N0YXJ0LHdlbmQsd2luZG93LHd2YWx1ZTsKKwlpbnQgc3RhcnQ9MTsKKwlCSUdOVU0gKmFhOworCS8qIFRhYmxlIG9mIHZhcmlhYmxlcyBvYnRhaW5lZCBmcm9tICdjdHgnICovCisJQklHTlVNICp2YWxbVEFCTEVfU0laRV07CisJQk5fUkVDUF9DVFggcmVjcDsKKworCWlmIChCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkKKwkJeworCQkvKiBCTl9GTEdfQ09OU1RUSU1FIG9ubHkgc3VwcG9ydGVkIGJ5IEJOX21vZF9leHBfbW9udCgpICovCisJCUJOZXJyKEJOX0ZfQk5fTU9EX0VYUF9SRUNQLEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAtMTsKKwkJfQorCisJYml0cz1CTl9udW1fYml0cyhwKTsKKworCWlmIChiaXRzID09IDApCisJCXsKKwkJcmV0ID0gQk5fb25lKHIpOworCQlyZXR1cm4gcmV0OworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlhYSA9IEJOX0NUWF9nZXQoY3R4KTsKKwl2YWxbMF0gPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYoIWFhIHx8ICF2YWxbMF0pIGdvdG8gZXJyOworCisJQk5fUkVDUF9DVFhfaW5pdCgmcmVjcCk7CisJaWYgKG0tPm5lZykKKwkJeworCQkvKiBpZ25vcmUgc2lnbiBvZiAnbScgKi8KKwkJaWYgKCFCTl9jb3B5KGFhLCBtKSkgZ290byBlcnI7CisJCWFhLT5uZWcgPSAwOworCQlpZiAoQk5fUkVDUF9DVFhfc2V0KCZyZWNwLGFhLGN0eCkgPD0gMCkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEJOX1JFQ1BfQ1RYX3NldCgmcmVjcCxtLGN0eCkgPD0gMCkgZ290byBlcnI7CisJCX0KKworCWlmICghQk5fbm5tb2QodmFsWzBdLGEsbSxjdHgpKSBnb3RvIGVycjsJCS8qIDEgKi8KKwlpZiAoQk5faXNfemVybyh2YWxbMF0pKQorCQl7CisJCUJOX3plcm8ocik7CisJCXJldCA9IDE7CisJCWdvdG8gZXJyOworCQl9CisKKwl3aW5kb3cgPSBCTl93aW5kb3dfYml0c19mb3JfZXhwb25lbnRfc2l6ZShiaXRzKTsKKwlpZiAod2luZG93ID4gMSkKKwkJeworCQlpZiAoIUJOX21vZF9tdWxfcmVjaXByb2NhbChhYSx2YWxbMF0sdmFsWzBdLCZyZWNwLGN0eCkpCisJCQlnb3RvIGVycjsJCQkJLyogMiAqLworCQlqPTE8PCh3aW5kb3ctMSk7CisJCWZvciAoaT0xOyBpPGo7IGkrKykKKwkJCXsKKwkJCWlmKCgodmFsW2ldID0gQk5fQ1RYX2dldChjdHgpKSA9PSBOVUxMKSB8fAorCQkJCQkhQk5fbW9kX211bF9yZWNpcHJvY2FsKHZhbFtpXSx2YWxbaS0xXSwKKwkJCQkJCWFhLCZyZWNwLGN0eCkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwkJCisJc3RhcnQ9MTsJLyogVGhpcyBpcyB1c2VkIHRvIGF2b2lkIG11bHRpcGxpY2F0aW9uIGV0YworCQkJICogd2hlbiB0aGVyZSBpcyBvbmx5IHRoZSB2YWx1ZSAnMScgaW4gdGhlCisJCQkgKiBidWZmZXIuICovCisJd3ZhbHVlPTA7CS8qIFRoZSAndmFsdWUnIG9mIHRoZSB3aW5kb3cgKi8KKwl3c3RhcnQ9Yml0cy0xOwkvKiBUaGUgdG9wIGJpdCBvZiB0aGUgd2luZG93ICovCisJd2VuZD0wOwkJLyogVGhlIGJvdHRvbSBiaXQgb2YgdGhlIHdpbmRvdyAqLworCisJaWYgKCFCTl9vbmUocikpIGdvdG8gZXJyOworCisJZm9yICg7OykKKwkJeworCQlpZiAoQk5faXNfYml0X3NldChwLHdzdGFydCkgPT0gMCkKKwkJCXsKKwkJCWlmICghc3RhcnQpCisJCQkJaWYgKCFCTl9tb2RfbXVsX3JlY2lwcm9jYWwocixyLHIsJnJlY3AsY3R4KSkKKwkJCQlnb3RvIGVycjsKKwkJCWlmICh3c3RhcnQgPT0gMCkgYnJlYWs7CisJCQl3c3RhcnQtLTsKKwkJCWNvbnRpbnVlOworCQkJfQorCQkvKiBXZSBub3cgaGF2ZSB3c3RhcnQgb24gYSAnc2V0JyBiaXQsIHdlIG5vdyBuZWVkIHRvIHdvcmsgb3V0CisJCSAqIGhvdyBiaXQgYSB3aW5kb3cgdG8gZG8uICBUbyBkbyB0aGlzIHdlIG5lZWQgdG8gc2NhbgorCQkgKiBmb3J3YXJkIHVudGlsIHRoZSBsYXN0IHNldCBiaXQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlCisJCSAqIHdpbmRvdyAqLworCQlqPXdzdGFydDsKKwkJd3ZhbHVlPTE7CisJCXdlbmQ9MDsKKwkJZm9yIChpPTE7IGk8d2luZG93OyBpKyspCisJCQl7CisJCQlpZiAod3N0YXJ0LWkgPCAwKSBicmVhazsKKwkJCWlmIChCTl9pc19iaXRfc2V0KHAsd3N0YXJ0LWkpKQorCQkJCXsKKwkJCQl3dmFsdWU8PD0oaS13ZW5kKTsKKwkJCQl3dmFsdWV8PTE7CisJCQkJd2VuZD1pOworCQkJCX0KKwkJCX0KKworCQkvKiB3ZW5kIGlzIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHdpbmRvdyAqLworCQlqPXdlbmQrMTsKKwkJLyogYWRkIHRoZSAnYnl0ZXMgYWJvdmUnICovCisJCWlmICghc3RhcnQpCisJCQlmb3IgKGk9MDsgaTxqOyBpKyspCisJCQkJeworCQkJCWlmICghQk5fbW9kX211bF9yZWNpcHJvY2FsKHIscixyLCZyZWNwLGN0eCkpCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCisJCS8qIHd2YWx1ZSB3aWxsIGJlIGFuIG9kZCBudW1iZXIgPCAyXndpbmRvdyAqLworCQlpZiAoIUJOX21vZF9tdWxfcmVjaXByb2NhbChyLHIsdmFsW3d2YWx1ZT4+MV0sJnJlY3AsY3R4KSkKKwkJCWdvdG8gZXJyOworCisJCS8qIG1vdmUgdGhlICd3aW5kb3cnIGRvd24gZnVydGhlciAqLworCQl3c3RhcnQtPXdlbmQrMTsKKwkJd3ZhbHVlPTA7CisJCXN0YXJ0PTA7CisJCWlmICh3c3RhcnQgPCAwKSBicmVhazsKKwkJfQorCXJldD0xOworZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlCTl9SRUNQX0NUWF9mcmVlKCZyZWNwKTsKKwlibl9jaGVja190b3Aocik7CisJcmV0dXJuKHJldCk7CisJfQorCisKK2ludCBCTl9tb2RfZXhwX21vbnQoQklHTlVNICpyciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisJCSAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqaW5fbW9udCkKKwl7CisJaW50IGksaixiaXRzLHJldD0wLHdzdGFydCx3ZW5kLHdpbmRvdyx3dmFsdWU7CisJaW50IHN0YXJ0PTE7CisJQklHTlVNICpkLCpyOworCWNvbnN0IEJJR05VTSAqYWE7CisJLyogVGFibGUgb2YgdmFyaWFibGVzIG9idGFpbmVkIGZyb20gJ2N0eCcgKi8KKwlCSUdOVU0gKnZhbFtUQUJMRV9TSVpFXTsKKwlCTl9NT05UX0NUWCAqbW9udD1OVUxMOworCisJaWYgKEJOX2dldF9mbGFncyhwLCBCTl9GTEdfQ09OU1RUSU1FKSAhPSAwKQorCQl7CisJCXJldHVybiBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKHJyLCBhLCBwLCBtLCBjdHgsIGluX21vbnQpOworCQl9CisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKHApOworCWJuX2NoZWNrX3RvcChtKTsKKworCWlmICghQk5faXNfb2RkKG0pKQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fTU9EX0VYUF9NT05ULEJOX1JfQ0FMTEVEX1dJVEhfRVZFTl9NT0RVTFVTKTsKKwkJcmV0dXJuKDApOworCQl9CisJYml0cz1CTl9udW1fYml0cyhwKTsKKwlpZiAoYml0cyA9PSAwKQorCQl7CisJCXJldCA9IEJOX29uZShycik7CisJCXJldHVybiByZXQ7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCWQgPSBCTl9DVFhfZ2V0KGN0eCk7CisJciA9IEJOX0NUWF9nZXQoY3R4KTsKKwl2YWxbMF0gPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKCFkIHx8ICFyIHx8ICF2YWxbMF0pIGdvdG8gZXJyOworCisJLyogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhpbmdzIHdpbGwgYnJlYWsgaW4gdGhlIG1vbnRnb21lcnkKKwkgKiBwYXJ0ICovCisKKwlpZiAoaW5fbW9udCAhPSBOVUxMKQorCQltb250PWluX21vbnQ7CisJZWxzZQorCQl7CisJCWlmICgobW9udD1CTl9NT05UX0NUWF9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCWlmICghQk5fTU9OVF9DVFhfc2V0KG1vbnQsbSxjdHgpKSBnb3RvIGVycjsKKwkJfQorCisJaWYgKGEtPm5lZyB8fCBCTl91Y21wKGEsbSkgPj0gMCkKKwkJeworCQlpZiAoIUJOX25ubW9kKHZhbFswXSxhLG0sY3R4KSkKKwkJCWdvdG8gZXJyOworCQlhYT0gdmFsWzBdOworCQl9CisJZWxzZQorCQlhYT1hOworCWlmIChCTl9pc196ZXJvKGFhKSkKKwkJeworCQlCTl96ZXJvKHJyKTsKKwkJcmV0ID0gMTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoIUJOX3RvX21vbnRnb21lcnkodmFsWzBdLGFhLG1vbnQsY3R4KSkgZ290byBlcnI7IC8qIDEgKi8KKworCXdpbmRvdyA9IEJOX3dpbmRvd19iaXRzX2Zvcl9leHBvbmVudF9zaXplKGJpdHMpOworCWlmICh3aW5kb3cgPiAxKQorCQl7CisJCWlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KGQsdmFsWzBdLHZhbFswXSxtb250LGN0eCkpIGdvdG8gZXJyOyAvKiAyICovCisJCWo9MTw8KHdpbmRvdy0xKTsKKwkJZm9yIChpPTE7IGk8ajsgaSsrKQorCQkJeworCQkJaWYoKCh2YWxbaV0gPSBCTl9DVFhfZ2V0KGN0eCkpID09IE5VTEwpIHx8CisJCQkJCSFCTl9tb2RfbXVsX21vbnRnb21lcnkodmFsW2ldLHZhbFtpLTFdLAorCQkJCQkJZCxtb250LGN0eCkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCXN0YXJ0PTE7CS8qIFRoaXMgaXMgdXNlZCB0byBhdm9pZCBtdWx0aXBsaWNhdGlvbiBldGMKKwkJCSAqIHdoZW4gdGhlcmUgaXMgb25seSB0aGUgdmFsdWUgJzEnIGluIHRoZQorCQkJICogYnVmZmVyLiAqLworCXd2YWx1ZT0wOwkvKiBUaGUgJ3ZhbHVlJyBvZiB0aGUgd2luZG93ICovCisJd3N0YXJ0PWJpdHMtMTsJLyogVGhlIHRvcCBiaXQgb2YgdGhlIHdpbmRvdyAqLworCXdlbmQ9MDsJCS8qIFRoZSBib3R0b20gYml0IG9mIHRoZSB3aW5kb3cgKi8KKworCWlmICghQk5fdG9fbW9udGdvbWVyeShyLEJOX3ZhbHVlX29uZSgpLG1vbnQsY3R4KSkgZ290byBlcnI7CisJZm9yICg7OykKKwkJeworCQlpZiAoQk5faXNfYml0X3NldChwLHdzdGFydCkgPT0gMCkKKwkJCXsKKwkJCWlmICghc3RhcnQpCisJCQkJeworCQkJCWlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KHIscixyLG1vbnQsY3R4KSkKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAod3N0YXJ0ID09IDApIGJyZWFrOworCQkJd3N0YXJ0LS07CisJCQljb250aW51ZTsKKwkJCX0KKwkJLyogV2Ugbm93IGhhdmUgd3N0YXJ0IG9uIGEgJ3NldCcgYml0LCB3ZSBub3cgbmVlZCB0byB3b3JrIG91dAorCQkgKiBob3cgYml0IGEgd2luZG93IHRvIGRvLiAgVG8gZG8gdGhpcyB3ZSBuZWVkIHRvIHNjYW4KKwkJICogZm9yd2FyZCB1bnRpbCB0aGUgbGFzdCBzZXQgYml0IGJlZm9yZSB0aGUgZW5kIG9mIHRoZQorCQkgKiB3aW5kb3cgKi8KKwkJaj13c3RhcnQ7CisJCXd2YWx1ZT0xOworCQl3ZW5kPTA7CisJCWZvciAoaT0xOyBpPHdpbmRvdzsgaSsrKQorCQkJeworCQkJaWYgKHdzdGFydC1pIDwgMCkgYnJlYWs7CisJCQlpZiAoQk5faXNfYml0X3NldChwLHdzdGFydC1pKSkKKwkJCQl7CisJCQkJd3ZhbHVlPDw9KGktd2VuZCk7CisJCQkJd3ZhbHVlfD0xOworCQkJCXdlbmQ9aTsKKwkJCQl9CisJCQl9CisKKwkJLyogd2VuZCBpcyB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCB3aW5kb3cgKi8KKwkJaj13ZW5kKzE7CisJCS8qIGFkZCB0aGUgJ2J5dGVzIGFib3ZlJyAqLworCQlpZiAoIXN0YXJ0KQorCQkJZm9yIChpPTA7IGk8ajsgaSsrKQorCQkJCXsKKwkJCQlpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShyLHIscixtb250LGN0eCkpCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCisJCS8qIHd2YWx1ZSB3aWxsIGJlIGFuIG9kZCBudW1iZXIgPCAyXndpbmRvdyAqLworCQlpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShyLHIsdmFsW3d2YWx1ZT4+MV0sbW9udCxjdHgpKQorCQkJZ290byBlcnI7CisKKwkJLyogbW92ZSB0aGUgJ3dpbmRvdycgZG93biBmdXJ0aGVyICovCisJCXdzdGFydC09d2VuZCsxOworCQl3dmFsdWU9MDsKKwkJc3RhcnQ9MDsKKwkJaWYgKHdzdGFydCA8IDApIGJyZWFrOworCQl9CisJaWYgKCFCTl9mcm9tX21vbnRnb21lcnkocnIscixtb250LGN0eCkpIGdvdG8gZXJyOworCXJldD0xOworZXJyOgorCWlmICgoaW5fbW9udCA9PSBOVUxMKSAmJiAobW9udCAhPSBOVUxMKSkgQk5fTU9OVF9DVFhfZnJlZShtb250KTsKKwlCTl9DVFhfZW5kKGN0eCk7CisJYm5fY2hlY2tfdG9wKHJyKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKworLyogQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSgpIHN0b3JlcyB0aGUgcHJlY29tcHV0ZWQgcG93ZXJzIGluIGEgc3BlY2lmaWMgbGF5b3V0CisgKiBzbyB0aGF0IGFjY2Vzc2luZyBhbnkgb2YgdGhlc2UgdGFibGUgdmFsdWVzIHNob3dzIHRoZSBzYW1lIGFjY2VzcyBwYXR0ZXJuIGFzIGZhcgorICogYXMgY2FjaGUgbGluZXMgYXJlIGNvbmNlcm5lZC4gIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIHRyYW5zZmVyIGEgQklHTlVNCisgKiBmcm9tL3RvIHRoYXQgdGFibGUuICovCisKK3N0YXRpYyBpbnQgTU9EX0VYUF9DVElNRV9DT1BZX1RPX1BSRUJVRihCSUdOVU0gKmIsIGludCB0b3AsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGlkeCwgaW50IHdpZHRoKQorCXsKKwlzaXplX3QgaSwgajsKKworCWlmIChibl93ZXhwYW5kKGIsIHRvcCkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKGItPnRvcCA8IHRvcCkKKwkJeworCQliLT5kW2ItPnRvcCsrXSA9IDA7CisJCX0KKwkKKwlmb3IgKGkgPSAwLCBqPWlkeDsgaSA8IHRvcCAqIHNpemVvZiBiLT5kWzBdOyBpKyssIGorPXdpZHRoKQorCQl7CisJCWJ1ZltqXSA9ICgodW5zaWduZWQgY2hhciopYi0+ZClbaV07CisJCX0KKworCWJuX2NvcnJlY3RfdG9wKGIpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBNT0RfRVhQX0NUSU1FX0NPUFlfRlJPTV9QUkVCVUYoQklHTlVNICpiLCBpbnQgdG9wLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBpZHgsIGludCB3aWR0aCkKKwl7CisJc2l6ZV90IGksIGo7CisKKwlpZiAoYm5fd2V4cGFuZChiLCB0b3ApID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChpPTAsIGo9aWR4OyBpIDwgdG9wICogc2l6ZW9mIGItPmRbMF07IGkrKywgais9d2lkdGgpCisJCXsKKwkJKCh1bnNpZ25lZCBjaGFyKiliLT5kKVtpXSA9IGJ1ZltqXTsKKwkJfQorCisJYi0+dG9wID0gdG9wOworCWJuX2NvcnJlY3RfdG9wKGIpOworCXJldHVybiAxOworCX0JCisKKy8qIEdpdmVuIGEgcG9pbnRlciB2YWx1ZSwgY29tcHV0ZSB0aGUgbmV4dCBhZGRyZXNzIHRoYXQgaXMgYSBjYWNoZSBsaW5lIG11bHRpcGxlLiAqLworI2RlZmluZSBNT0RfRVhQX0NUSU1FX0FMSUdOKHhfKSBcCisJKCh1bnNpZ25lZCBjaGFyKikoeF8pICsgKE1PRF9FWFBfQ1RJTUVfTUlOX0NBQ0hFX0xJTkVfV0lEVEggLSAoKChCTl9VTE9ORykoeF8pKSAmIChNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX01BU0spKSkpCisKKy8qIFRoaXMgdmFyaWFudCBvZiBCTl9tb2RfZXhwX21vbnQoKSB1c2VzIGZpeGVkIHdpbmRvd3MgYW5kIHRoZSBzcGVjaWFsCisgKiBwcmVjb21wdXRhdGlvbiBtZW1vcnkgbGF5b3V0IHRvIGxpbWl0IGRhdGEtZGVwZW5kZW5jeSB0byBhIG1pbmltdW0KKyAqIHRvIHByb3RlY3Qgc2VjcmV0IGV4cG9uZW50cyAoY2YuIHRoZSBoeXBlci10aHJlYWRpbmcgdGltaW5nIGF0dGFja3MKKyAqIHBvaW50ZWQgb3V0IGJ5IENvbGluIFBlcmNpdmFsLAorICogaHR0cDovL3d3dy5kYWVtb25vbG9neS5uZXQvaHlwZXJ0aHJlYWRpbmctY29uc2lkZXJlZC1oYXJtZnVsLykKKyAqLworaW50IEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoQklHTlVNICpyciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisJCSAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqaW5fbW9udCkKKwl7CisJaW50IGksYml0cyxyZXQ9MCxpZHgsd2luZG93LHd2YWx1ZTsKKwlpbnQgdG9wOworIAlCSUdOVU0gKnI7CisJY29uc3QgQklHTlVNICphYTsKKwlCTl9NT05UX0NUWCAqbW9udD1OVUxMOworCisJaW50IG51bVBvd2VyczsKKwl1bnNpZ25lZCBjaGFyICpwb3dlcmJ1ZkZyZWU9TlVMTDsKKwlpbnQgcG93ZXJidWZMZW4gPSAwOworCXVuc2lnbmVkIGNoYXIgKnBvd2VyYnVmPU5VTEw7CisJQklHTlVNICpjb21wdXRlVGVtcD1OVUxMLCAqYW09TlVMTDsKKworCWJuX2NoZWNrX3RvcChhKTsKKwlibl9jaGVja190b3AocCk7CisJYm5fY2hlY2tfdG9wKG0pOworCisJdG9wID0gbS0+dG9wOworCisJaWYgKCEobS0+ZFswXSAmIDEpKQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fTU9EX0VYUF9NT05UX0NPTlNUVElNRSxCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisJCXJldHVybigwKTsKKwkJfQorCWJpdHM9Qk5fbnVtX2JpdHMocCk7CisJaWYgKGJpdHMgPT0gMCkKKwkJeworCQlyZXQgPSBCTl9vbmUocnIpOworCQlyZXR1cm4gcmV0OworCQl9CisKKyAJLyogSW5pdGlhbGl6ZSBCSUdOVU0gY29udGV4dCBhbmQgYWxsb2NhdGUgaW50ZXJtZWRpYXRlIHJlc3VsdCAqLworCUJOX0NUWF9zdGFydChjdHgpOworCXIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHIgPT0gTlVMTCkgZ290byBlcnI7CisKKwkvKiBBbGxvY2F0ZSBhIG1vbnRnb21lcnkgY29udGV4dCBpZiBpdCB3YXMgbm90IHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIuCisJICogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhpbmdzIHdpbGwgYnJlYWsgaW4gdGhlIG1vbnRnb21lcnkgcGFydC4KKyAJICovCisJaWYgKGluX21vbnQgIT0gTlVMTCkKKwkJbW9udD1pbl9tb250OworCWVsc2UKKwkJeworCQlpZiAoKG1vbnQ9Qk5fTU9OVF9DVFhfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCQlpZiAoIUJOX01PTlRfQ1RYX3NldChtb250LG0sY3R4KSkgZ290byBlcnI7CisJCX0KKworCS8qIEdldCB0aGUgd2luZG93IHNpemUgdG8gdXNlIHdpdGggc2l6ZSBvZiBwLiAqLworCXdpbmRvdyA9IEJOX3dpbmRvd19iaXRzX2Zvcl9jdGltZV9leHBvbmVudF9zaXplKGJpdHMpOworCisJLyogQWxsb2NhdGUgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIG9mIHRoZSBwcmUtY29tcHV0ZWQKKwkgKiBwb3dlcnMgb2YgYS4KKwkgKi8KKwludW1Qb3dlcnMgPSAxIDw8IHdpbmRvdzsKKwlwb3dlcmJ1ZkxlbiA9IHNpemVvZihtLT5kWzBdKSp0b3AqbnVtUG93ZXJzOworCWlmICgocG93ZXJidWZGcmVlPSh1bnNpZ25lZCBjaGFyKilPUEVOU1NMX21hbGxvYyhwb3dlcmJ1ZkxlbitNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX1dJRFRIKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJCQorCXBvd2VyYnVmID0gTU9EX0VYUF9DVElNRV9BTElHTihwb3dlcmJ1ZkZyZWUpOworCW1lbXNldChwb3dlcmJ1ZiwgMCwgcG93ZXJidWZMZW4pOworCisgCS8qIEluaXRpYWxpemUgdGhlIGludGVybWVkaWF0ZSByZXN1bHQuIERvIHRoaXMgZWFybHkgdG8gc2F2ZSBkb3VibGUgY29udmVyc2lvbiwKKwkgKiBvbmNlIGVhY2ggZm9yIGFeMCBhbmQgaW50ZXJtZWRpYXRlIHJlc3VsdC4KKwkgKi8KKyAJaWYgKCFCTl90b19tb250Z29tZXJ5KHIsQk5fdmFsdWVfb25lKCksbW9udCxjdHgpKSBnb3RvIGVycjsKKwlpZiAoIU1PRF9FWFBfQ1RJTUVfQ09QWV9UT19QUkVCVUYociwgdG9wLCBwb3dlcmJ1ZiwgMCwgbnVtUG93ZXJzKSkgZ290byBlcnI7CisKKwkvKiBJbml0aWFsaXplIGNvbXB1dGVUZW1wIGFzIGFeMSB3aXRoIG1vbnRnb21lcnkgcHJlY2FsY3MgKi8KKwljb21wdXRlVGVtcCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlhbSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoY29tcHV0ZVRlbXA9PU5VTEwgfHwgYW09PU5VTEwpIGdvdG8gZXJyOworCisJaWYgKGEtPm5lZyB8fCBCTl91Y21wKGEsbSkgPj0gMCkKKwkJeworCQlpZiAoIUJOX21vZChhbSxhLG0sY3R4KSkKKwkJCWdvdG8gZXJyOworCQlhYT0gYW07CisJCX0KKwllbHNlCisJCWFhPWE7CisJaWYgKCFCTl90b19tb250Z29tZXJ5KGFtLGFhLG1vbnQsY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9jb3B5KGNvbXB1dGVUZW1wLCBhbSkpIGdvdG8gZXJyOworCWlmICghTU9EX0VYUF9DVElNRV9DT1BZX1RPX1BSRUJVRihhbSwgdG9wLCBwb3dlcmJ1ZiwgMSwgbnVtUG93ZXJzKSkgZ290byBlcnI7CisKKwkvKiBJZiB0aGUgd2luZG93IHNpemUgaXMgZ3JlYXRlciB0aGFuIDEsIHRoZW4gY2FsY3VsYXRlCisJICogdmFsW2k9Mi4uMl53aW5zaXplLTFdLiBQb3dlcnMgYXJlIGNvbXB1dGVkIGFzIGEqYV4oaS0xKQorCSAqIChldmVuIHBvd2VycyBjb3VsZCBpbnN0ZWFkIGJlIGNvbXB1dGVkIGFzIChhXihpLzIpKV4yCisJICogdG8gdXNlIHRoZSBzbGlnaHQgcGVyZm9ybWFuY2UgYWR2YW50YWdlIG9mIHNxciBvdmVyIG11bCkuCisJICovCisJaWYgKHdpbmRvdyA+IDEpCisJCXsKKwkJZm9yIChpPTI7IGk8bnVtUG93ZXJzOyBpKyspCisJCQl7CisJCQkvKiBDYWxjdWxhdGUgYV5pID0gYV4oaS0xKSAqIGEgKi8KKwkJCWlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KGNvbXB1dGVUZW1wLGFtLGNvbXB1dGVUZW1wLG1vbnQsY3R4KSkKKwkJCQlnb3RvIGVycjsKKwkJCWlmICghTU9EX0VYUF9DVElNRV9DT1BZX1RPX1BSRUJVRihjb21wdXRlVGVtcCwgdG9wLCBwb3dlcmJ1ZiwgaSwgbnVtUG93ZXJzKSkgZ290byBlcnI7CisJCQl9CisJCX0KKworIAkvKiBBZGp1c3QgdGhlIG51bWJlciBvZiBiaXRzIHVwIHRvIGEgbXVsdGlwbGUgb2YgdGhlIHdpbmRvdyBzaXplLgorIAkgKiBJZiB0aGUgZXhwb25lbnQgbGVuZ3RoIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSB3aW5kb3cgc2l6ZSwgdGhlbgorIAkgKiB0aGlzIHBhZHMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB3aXRoIHplcm9zIHRvIG5vcm1hbGl6ZSB0aGUKKyAJICogc2Nhbm5pbmcgbG9vcCB0byB0aGVyZSdzIG5vIHNwZWNpYWwgY2FzZXMuCisgCSAqCisgCSAqICogTk9URTogTWFraW5nIHRoZSB3aW5kb3cgc2l6ZSBhIHBvd2VyIG9mIHR3byBsZXNzIHRoYW4gdGhlIG5hdGl2ZQorCSAqICogd29yZCBzaXplIGVuc3VyZXMgdGhhdCB0aGUgcGFkZGVkIGJpdHMgd29uJ3QgZ28gcGFzdCB0aGUgbGFzdAorIAkgKiAqIHdvcmQgaW4gdGhlIGludGVybmFsIEJJR05VTSBzdHJ1Y3R1cmUuIEdvaW5nIHBhc3QgdGhlIGVuZCB3aWxsCisgCSAqICogc3RpbGwgcHJvZHVjZSB0aGUgY29ycmVjdCByZXN1bHQsIGJ1dCBjYXVzZXMgYSBkaWZmZXJlbnQgYnJhbmNoCisgCSAqICogdG8gYmUgdGFrZW4gaW4gdGhlIEJOX2lzX2JpdF9zZXQgZnVuY3Rpb24uCisgCSAqLworIAliaXRzID0gKChiaXRzK3dpbmRvdy0xKS93aW5kb3cpKndpbmRvdzsKKyAJaWR4PWJpdHMtMTsJLyogVGhlIHRvcCBiaXQgb2YgdGhlIHdpbmRvdyAqLworCisgCS8qIFNjYW4gdGhlIGV4cG9uZW50IG9uZSB3aW5kb3cgYXQgYSB0aW1lIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QKKyAJICogc2lnbmlmaWNhbnQgYml0cy4KKyAJICovCisgCXdoaWxlIChpZHggPj0gMCkKKyAgCQl7CisgCQl3dmFsdWU9MDsgLyogVGhlICd2YWx1ZScgb2YgdGhlIHdpbmRvdyAqLworIAkJCisgCQkvKiBTY2FuIHRoZSB3aW5kb3csIHNxdWFyaW5nIHRoZSByZXN1bHQgYXMgd2UgZ28gKi8KKyAJCWZvciAoaT0wOyBpPHdpbmRvdzsgaSsrLGlkeC0tKQorIAkJCXsKKwkJCWlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KHIscixyLG1vbnQsY3R4KSkJZ290byBlcnI7CisJCQl3dmFsdWUgPSAod3ZhbHVlPDwxKStCTl9pc19iaXRfc2V0KHAsaWR4KTsKKyAgCQkJfQorIAkJCisJCS8qIEZldGNoIHRoZSBhcHByb3ByaWF0ZSBwcmUtY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGUgcHJlLWJ1ZiAqLworCQlpZiAoIU1PRF9FWFBfQ1RJTUVfQ09QWV9GUk9NX1BSRUJVRihjb21wdXRlVGVtcCwgdG9wLCBwb3dlcmJ1Ziwgd3ZhbHVlLCBudW1Qb3dlcnMpKSBnb3RvIGVycjsKKworIAkJLyogTXVsdGlwbHkgdGhlIHJlc3VsdCBpbnRvIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCisgCQlpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShyLHIsY29tcHV0ZVRlbXAsbW9udCxjdHgpKSBnb3RvIGVycjsKKyAgCQl9CisKKyAJLyogQ29udmVydCB0aGUgZmluYWwgcmVzdWx0IGZyb20gbW9udGdvbWVyeSB0byBzdGFuZGFyZCBmb3JtYXQgKi8KKwlpZiAoIUJOX2Zyb21fbW9udGdvbWVyeShycixyLG1vbnQsY3R4KSkgZ290byBlcnI7CisJcmV0PTE7CitlcnI6CisJaWYgKChpbl9tb250ID09IE5VTEwpICYmIChtb250ICE9IE5VTEwpKSBCTl9NT05UX0NUWF9mcmVlKG1vbnQpOworCWlmIChwb3dlcmJ1ZiE9TlVMTCkKKwkJeworCQlPUEVOU1NMX2NsZWFuc2UocG93ZXJidWYscG93ZXJidWZMZW4pOworCQlPUEVOU1NMX2ZyZWUocG93ZXJidWZGcmVlKTsKKwkJfQorIAlpZiAoYW0hPU5VTEwpIEJOX2NsZWFyKGFtKTsKKyAJaWYgKGNvbXB1dGVUZW1wIT1OVUxMKSBCTl9jbGVhcihjb21wdXRlVGVtcCk7CisJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybihyZXQpOworCX0KKworaW50IEJOX21vZF9leHBfbW9udF93b3JkKEJJR05VTSAqcnIsIEJOX1VMT05HIGEsIGNvbnN0IEJJR05VTSAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqaW5fbW9udCkKKwl7CisJQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOworCWludCBiLCBiaXRzLCByZXQ9MDsKKwlpbnQgcl9pc19vbmU7CisJQk5fVUxPTkcgdywgbmV4dF93OworCUJJR05VTSAqZCwgKnIsICp0OworCUJJR05VTSAqc3dhcF90bXA7CisjZGVmaW5lIEJOX01PRF9NVUxfV09SRChyLCB3LCBtKSBcCisJCShCTl9tdWxfd29yZChyLCAodykpICYmIFwKKwkJKC8qIEJOX3VjbXAociwgKG0pKSA8IDAgPyAxIDoqLyAgXAorCQkJKEJOX21vZCh0LCByLCBtLCBjdHgpICYmIChzd2FwX3RtcCA9IHIsIHIgPSB0LCB0ID0gc3dhcF90bXAsIDEpKSkpCisJCS8qIEJOX01PRF9NVUxfV09SRCBpcyBvbmx5IHVzZWQgd2l0aCAndycgbGFyZ2UsCisJCSAqIHNvIHRoZSBCTl91Y21wIHRlc3QgaXMgcHJvYmFibHkgbW9yZSBvdmVyaGVhZAorCQkgKiB0aGFuIGFsd2F5cyB1c2luZyBCTl9tb2QgKHdoaWNoIHVzZXMgQk5fY29weSBpZgorCQkgKiBhIHNpbWlsYXIgdGVzdCByZXR1cm5zIHRydWUpLiAqLworCQkvKiBXZSBjYW4gdXNlIEJOX21vZCBhbmQgZG8gbm90IG5lZWQgQk5fbm5tb2QgYmVjYXVzZSBvdXIKKwkJICogYWNjdW11bGF0b3IgaXMgbmV2ZXIgbmVnYXRpdmUgKHRoZSByZXN1bHQgb2YgQk5fbW9kIGRvZXMKKwkJICogbm90IGRlcGVuZCBvbiB0aGUgc2lnbiBvZiB0aGUgbW9kdWx1cykuCisJCSAqLworI2RlZmluZSBCTl9UT19NT05UR09NRVJZX1dPUkQociwgdywgbW9udCkgXAorCQkoQk5fc2V0X3dvcmQociwgKHcpKSAmJiBCTl90b19tb250Z29tZXJ5KHIsIHIsIChtb250KSwgY3R4KSkKKworCWlmIChCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkKKwkJeworCQkvKiBCTl9GTEdfQ09OU1RUSU1FIG9ubHkgc3VwcG9ydGVkIGJ5IEJOX21vZF9leHBfbW9udCgpICovCisJCUJOZXJyKEJOX0ZfQk5fTU9EX0VYUF9NT05UX1dPUkQsRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwlibl9jaGVja190b3AocCk7CisJYm5fY2hlY2tfdG9wKG0pOworCisJaWYgKCFCTl9pc19vZGQobSkpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9NT0RfRVhQX01PTlRfV09SRCxCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisJCXJldHVybigwKTsKKwkJfQorCWlmIChtLT50b3AgPT0gMSkKKwkJYSAlPSBtLT5kWzBdOyAvKiBtYWtlIHN1cmUgdGhhdCAnYScgaXMgcmVkdWNlZCAqLworCisJYml0cyA9IEJOX251bV9iaXRzKHApOworCWlmIChiaXRzID09IDApCisJCXsKKwkJcmV0ID0gQk5fb25lKHJyKTsKKwkJcmV0dXJuIHJldDsKKwkJfQorCWlmIChhID09IDApCisJCXsKKwkJQk5femVybyhycik7CisJCXJldCA9IDE7CisJCXJldHVybiByZXQ7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCWQgPSBCTl9DVFhfZ2V0KGN0eCk7CisJciA9IEJOX0NUWF9nZXQoY3R4KTsKKwl0ID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChkID09IE5VTEwgfHwgciA9PSBOVUxMIHx8IHQgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoaW5fbW9udCAhPSBOVUxMKQorCQltb250PWluX21vbnQ7CisJZWxzZQorCQl7CisJCWlmICgobW9udCA9IEJOX01PTlRfQ1RYX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9NT05UX0NUWF9zZXQobW9udCwgbSwgY3R4KSkgZ290byBlcnI7CisJCX0KKworCXJfaXNfb25lID0gMTsgLyogZXhjZXB0IGZvciBNb250Z29tZXJ5IGZhY3RvciAqLworCisJLyogYml0cy0xID49IDAgKi8KKworCS8qIFRoZSByZXN1bHQgaXMgYWNjdW11bGF0ZWQgaW4gdGhlIHByb2R1Y3Qgcip3LiAqLworCXcgPSBhOyAvKiBiaXQgJ2JpdHMtMScgb2YgJ3AnIGlzIGFsd2F5cyBzZXQgKi8KKwlmb3IgKGIgPSBiaXRzLTI7IGIgPj0gMDsgYi0tKQorCQl7CisJCS8qIEZpcnN0LCBzcXVhcmUgcip3LiAqLworCQluZXh0X3cgPSB3Knc7CisJCWlmICgobmV4dF93L3cpICE9IHcpIC8qIG92ZXJmbG93ICovCisJCQl7CisJCQlpZiAocl9pc19vbmUpCisJCQkJeworCQkJCWlmICghQk5fVE9fTU9OVEdPTUVSWV9XT1JEKHIsIHcsIG1vbnQpKSBnb3RvIGVycjsKKwkJCQlyX2lzX29uZSA9IDA7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpZiAoIUJOX01PRF9NVUxfV09SRChyLCB3LCBtKSkgZ290byBlcnI7CisJCQkJfQorCQkJbmV4dF93ID0gMTsKKwkJCX0KKwkJdyA9IG5leHRfdzsKKwkJaWYgKCFyX2lzX29uZSkKKwkJCXsKKwkJCWlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KHIsIHIsIHIsIG1vbnQsIGN0eCkpIGdvdG8gZXJyOworCQkJfQorCisJCS8qIFNlY29uZCwgbXVsdGlwbHkgcip3IGJ5ICdhJyBpZiBleHBvbmVudCBiaXQgaXMgc2V0LiAqLworCQlpZiAoQk5faXNfYml0X3NldChwLCBiKSkKKwkJCXsKKwkJCW5leHRfdyA9IHcqYTsKKwkJCWlmICgobmV4dF93L2EpICE9IHcpIC8qIG92ZXJmbG93ICovCisJCQkJeworCQkJCWlmIChyX2lzX29uZSkKKwkJCQkJeworCQkJCQlpZiAoIUJOX1RPX01PTlRHT01FUllfV09SRChyLCB3LCBtb250KSkgZ290byBlcnI7CisJCQkJCXJfaXNfb25lID0gMDsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoIUJOX01PRF9NVUxfV09SRChyLCB3LCBtKSkgZ290byBlcnI7CisJCQkJCX0KKwkJCQluZXh0X3cgPSBhOworCQkJCX0KKwkJCXcgPSBuZXh0X3c7CisJCQl9CisJCX0KKworCS8qIEZpbmFsbHksIHNldCByOj1yKncuICovCisJaWYgKHcgIT0gMSkKKwkJeworCQlpZiAocl9pc19vbmUpCisJCQl7CisJCQlpZiAoIUJOX1RPX01PTlRHT01FUllfV09SRChyLCB3LCBtb250KSkgZ290byBlcnI7CisJCQlyX2lzX29uZSA9IDA7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmICghQk5fTU9EX01VTF9XT1JEKHIsIHcsIG0pKSBnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJaWYgKHJfaXNfb25lKSAvKiBjYW4gaGFwcGVuIG9ubHkgaWYgYSA9PSAxKi8KKwkJeworCQlpZiAoIUJOX29uZShycikpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghQk5fZnJvbV9tb250Z29tZXJ5KHJyLCByLCBtb250LCBjdHgpKSBnb3RvIGVycjsKKwkJfQorCXJldCA9IDE7CitlcnI6CisJaWYgKChpbl9tb250ID09IE5VTEwpICYmIChtb250ICE9IE5VTEwpKSBCTl9NT05UX0NUWF9mcmVlKG1vbnQpOworCUJOX0NUWF9lbmQoY3R4KTsKKwlibl9jaGVja190b3AocnIpOworCXJldHVybihyZXQpOworCX0KKworCisvKiBUaGUgb2xkIGZhbGxiYWNrLCBzaW1wbGUgdmVyc2lvbiA6LSkgKi8KK2ludCBCTl9tb2RfZXhwX3NpbXBsZShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCQljb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgaSxqLGJpdHMscmV0PTAsd3N0YXJ0LHdlbmQsd2luZG93LHd2YWx1ZTsKKwlpbnQgc3RhcnQ9MTsKKwlCSUdOVU0gKmQ7CisJLyogVGFibGUgb2YgdmFyaWFibGVzIG9idGFpbmVkIGZyb20gJ2N0eCcgKi8KKwlCSUdOVU0gKnZhbFtUQUJMRV9TSVpFXTsKKworCWlmIChCTl9nZXRfZmxhZ3MocCwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkKKwkJeworCQkvKiBCTl9GTEdfQ09OU1RUSU1FIG9ubHkgc3VwcG9ydGVkIGJ5IEJOX21vZF9leHBfbW9udCgpICovCisJCUJOZXJyKEJOX0ZfQk5fTU9EX0VYUF9TSU1QTEUsRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwliaXRzPUJOX251bV9iaXRzKHApOworCisJaWYgKGJpdHMgPT0gMCkKKwkJeworCQlyZXQgPSBCTl9vbmUocik7CisJCXJldHVybiByZXQ7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCWQgPSBCTl9DVFhfZ2V0KGN0eCk7CisJdmFsWzBdID0gQk5fQ1RYX2dldChjdHgpOworCWlmKCFkIHx8ICF2YWxbMF0pIGdvdG8gZXJyOworCisJaWYgKCFCTl9ubm1vZCh2YWxbMF0sYSxtLGN0eCkpIGdvdG8gZXJyOwkJLyogMSAqLworCWlmIChCTl9pc196ZXJvKHZhbFswXSkpCisJCXsKKwkJQk5femVybyhyKTsKKwkJcmV0ID0gMTsKKwkJZ290byBlcnI7CisJCX0KKworCXdpbmRvdyA9IEJOX3dpbmRvd19iaXRzX2Zvcl9leHBvbmVudF9zaXplKGJpdHMpOworCWlmICh3aW5kb3cgPiAxKQorCQl7CisJCWlmICghQk5fbW9kX211bChkLHZhbFswXSx2YWxbMF0sbSxjdHgpKQorCQkJZ290byBlcnI7CQkJCS8qIDIgKi8KKwkJaj0xPDwod2luZG93LTEpOworCQlmb3IgKGk9MTsgaTxqOyBpKyspCisJCQl7CisJCQlpZigoKHZhbFtpXSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgfHwKKwkJCQkJIUJOX21vZF9tdWwodmFsW2ldLHZhbFtpLTFdLGQsbSxjdHgpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlzdGFydD0xOwkvKiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgbXVsdGlwbGljYXRpb24gZXRjCisJCQkgKiB3aGVuIHRoZXJlIGlzIG9ubHkgdGhlIHZhbHVlICcxJyBpbiB0aGUKKwkJCSAqIGJ1ZmZlci4gKi8KKwl3dmFsdWU9MDsJLyogVGhlICd2YWx1ZScgb2YgdGhlIHdpbmRvdyAqLworCXdzdGFydD1iaXRzLTE7CS8qIFRoZSB0b3AgYml0IG9mIHRoZSB3aW5kb3cgKi8KKwl3ZW5kPTA7CQkvKiBUaGUgYm90dG9tIGJpdCBvZiB0aGUgd2luZG93ICovCisKKwlpZiAoIUJOX29uZShyKSkgZ290byBlcnI7CisKKwlmb3IgKDs7KQorCQl7CisJCWlmIChCTl9pc19iaXRfc2V0KHAsd3N0YXJ0KSA9PSAwKQorCQkJeworCQkJaWYgKCFzdGFydCkKKwkJCQlpZiAoIUJOX21vZF9tdWwocixyLHIsbSxjdHgpKQorCQkJCWdvdG8gZXJyOworCQkJaWYgKHdzdGFydCA9PSAwKSBicmVhazsKKwkJCXdzdGFydC0tOworCQkJY29udGludWU7CisJCQl9CisJCS8qIFdlIG5vdyBoYXZlIHdzdGFydCBvbiBhICdzZXQnIGJpdCwgd2Ugbm93IG5lZWQgdG8gd29yayBvdXQKKwkJICogaG93IGJpdCBhIHdpbmRvdyB0byBkby4gIFRvIGRvIHRoaXMgd2UgbmVlZCB0byBzY2FuCisJCSAqIGZvcndhcmQgdW50aWwgdGhlIGxhc3Qgc2V0IGJpdCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUKKwkJICogd2luZG93ICovCisJCWo9d3N0YXJ0OworCQl3dmFsdWU9MTsKKwkJd2VuZD0wOworCQlmb3IgKGk9MTsgaTx3aW5kb3c7IGkrKykKKwkJCXsKKwkJCWlmICh3c3RhcnQtaSA8IDApIGJyZWFrOworCQkJaWYgKEJOX2lzX2JpdF9zZXQocCx3c3RhcnQtaSkpCisJCQkJeworCQkJCXd2YWx1ZTw8PShpLXdlbmQpOworCQkJCXd2YWx1ZXw9MTsKKwkJCQl3ZW5kPWk7CisJCQkJfQorCQkJfQorCisJCS8qIHdlbmQgaXMgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgd2luZG93ICovCisJCWo9d2VuZCsxOworCQkvKiBhZGQgdGhlICdieXRlcyBhYm92ZScgKi8KKwkJaWYgKCFzdGFydCkKKwkJCWZvciAoaT0wOyBpPGo7IGkrKykKKwkJCQl7CisJCQkJaWYgKCFCTl9tb2RfbXVsKHIscixyLG0sY3R4KSkKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkKKwkJLyogd3ZhbHVlIHdpbGwgYmUgYW4gb2RkIG51bWJlciA8IDJed2luZG93ICovCisJCWlmICghQk5fbW9kX211bChyLHIsdmFsW3d2YWx1ZT4+MV0sbSxjdHgpKQorCQkJZ290byBlcnI7CisKKwkJLyogbW92ZSB0aGUgJ3dpbmRvdycgZG93biBmdXJ0aGVyICovCisJCXdzdGFydC09d2VuZCsxOworCQl3dmFsdWU9MDsKKwkJc3RhcnQ9MDsKKwkJaWYgKHdzdGFydCA8IDApIGJyZWFrOworCQl9CisJcmV0PTE7CitlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCWJuX2NoZWNrX3RvcChyKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9leHAyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZXhwMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjQzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZXhwMi5jCkBAIC0wLDAgKzEsMzExIEBACisvKiBjcnlwdG8vYm4vYm5fZXhwMi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworI2RlZmluZSBUQUJMRV9TSVpFCTMyCisKK2ludCBCTl9tb2RfZXhwMl9tb250KEJJR05VTSAqcnIsIGNvbnN0IEJJR05VTSAqYTEsIGNvbnN0IEJJR05VTSAqcDEsCisJY29uc3QgQklHTlVNICphMiwgY29uc3QgQklHTlVNICpwMiwgY29uc3QgQklHTlVNICptLAorCUJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqaW5fbW9udCkKKwl7CisJaW50IGksaixiaXRzLGIsYml0czEsYml0czIscmV0PTAsd3BvczEsd3BvczIsd2luZG93MSx3aW5kb3cyLHd2YWx1ZTEsd3ZhbHVlMjsKKwlpbnQgcl9pc19vbmU9MTsKKwlCSUdOVU0gKmQsKnI7CisJY29uc3QgQklHTlVNICphX21vZF9tOworCS8qIFRhYmxlcyBvZiB2YXJpYWJsZXMgb2J0YWluZWQgZnJvbSAnY3R4JyAqLworCUJJR05VTSAqdmFsMVtUQUJMRV9TSVpFXSwgKnZhbDJbVEFCTEVfU0laRV07CisJQk5fTU9OVF9DVFggKm1vbnQ9TlVMTDsKKworCWJuX2NoZWNrX3RvcChhMSk7CisJYm5fY2hlY2tfdG9wKHAxKTsKKwlibl9jaGVja190b3AoYTIpOworCWJuX2NoZWNrX3RvcChwMik7CisJYm5fY2hlY2tfdG9wKG0pOworCisJaWYgKCEobS0+ZFswXSAmIDEpKQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fTU9EX0VYUDJfTU9OVCxCTl9SX0NBTExFRF9XSVRIX0VWRU5fTU9EVUxVUyk7CisJCXJldHVybigwKTsKKwkJfQorCWJpdHMxPUJOX251bV9iaXRzKHAxKTsKKwliaXRzMj1CTl9udW1fYml0cyhwMik7CisJaWYgKChiaXRzMSA9PSAwKSAmJiAoYml0czIgPT0gMCkpCisJCXsKKwkJcmV0ID0gQk5fb25lKHJyKTsKKwkJcmV0dXJuIHJldDsKKwkJfQorCQorCWJpdHM9KGJpdHMxID4gYml0czIpP2JpdHMxOmJpdHMyOworCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJZCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlyID0gQk5fQ1RYX2dldChjdHgpOworCXZhbDFbMF0gPSBCTl9DVFhfZ2V0KGN0eCk7CisJdmFsMlswXSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZighZCB8fCAhciB8fCAhdmFsMVswXSB8fCAhdmFsMlswXSkgZ290byBlcnI7CisKKwlpZiAoaW5fbW9udCAhPSBOVUxMKQorCQltb250PWluX21vbnQ7CisJZWxzZQorCQl7CisJCWlmICgobW9udD1CTl9NT05UX0NUWF9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCWlmICghQk5fTU9OVF9DVFhfc2V0KG1vbnQsbSxjdHgpKSBnb3RvIGVycjsKKwkJfQorCisJd2luZG93MSA9IEJOX3dpbmRvd19iaXRzX2Zvcl9leHBvbmVudF9zaXplKGJpdHMxKTsKKwl3aW5kb3cyID0gQk5fd2luZG93X2JpdHNfZm9yX2V4cG9uZW50X3NpemUoYml0czIpOworCisJLyoKKwkgKiBCdWlsZCB0YWJsZSBmb3IgYTE6ICAgdmFsMVtpXSA6PSBhMV4oMippICsgMSkgbW9kIG0gIGZvciBpID0gMCAuLiAyXih3aW5kb3cxLTEpCisJICovCisJaWYgKGExLT5uZWcgfHwgQk5fdWNtcChhMSxtKSA+PSAwKQorCQl7CisJCWlmICghQk5fbW9kKHZhbDFbMF0sYTEsbSxjdHgpKQorCQkJZ290byBlcnI7CisJCWFfbW9kX20gPSB2YWwxWzBdOworCQl9CisJZWxzZQorCQlhX21vZF9tID0gYTE7CisJaWYgKEJOX2lzX3plcm8oYV9tb2RfbSkpCisJCXsKKwkJQk5femVybyhycik7CisJCXJldCA9IDE7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoIUJOX3RvX21vbnRnb21lcnkodmFsMVswXSxhX21vZF9tLG1vbnQsY3R4KSkgZ290byBlcnI7CisJaWYgKHdpbmRvdzEgPiAxKQorCQl7CisJCWlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KGQsdmFsMVswXSx2YWwxWzBdLG1vbnQsY3R4KSkgZ290byBlcnI7CisKKwkJaj0xPDwod2luZG93MS0xKTsKKwkJZm9yIChpPTE7IGk8ajsgaSsrKQorCQkJeworCQkJaWYoKCh2YWwxW2ldID0gQk5fQ1RYX2dldChjdHgpKSA9PSBOVUxMKSB8fAorCQkJCQkhQk5fbW9kX211bF9tb250Z29tZXJ5KHZhbDFbaV0sdmFsMVtpLTFdLAorCQkJCQkJZCxtb250LGN0eCkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCisJLyoKKwkgKiBCdWlsZCB0YWJsZSBmb3IgYTI6ICAgdmFsMltpXSA6PSBhMl4oMippICsgMSkgbW9kIG0gIGZvciBpID0gMCAuLiAyXih3aW5kb3cyLTEpCisJICovCisJaWYgKGEyLT5uZWcgfHwgQk5fdWNtcChhMixtKSA+PSAwKQorCQl7CisJCWlmICghQk5fbW9kKHZhbDJbMF0sYTIsbSxjdHgpKQorCQkJZ290byBlcnI7CisJCWFfbW9kX20gPSB2YWwyWzBdOworCQl9CisJZWxzZQorCQlhX21vZF9tID0gYTI7CisJaWYgKEJOX2lzX3plcm8oYV9tb2RfbSkpCisJCXsKKwkJQk5femVybyhycik7CisJCXJldCA9IDE7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCFCTl90b19tb250Z29tZXJ5KHZhbDJbMF0sYV9tb2RfbSxtb250LGN0eCkpIGdvdG8gZXJyOworCWlmICh3aW5kb3cyID4gMSkKKwkJeworCQlpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShkLHZhbDJbMF0sdmFsMlswXSxtb250LGN0eCkpIGdvdG8gZXJyOworCisJCWo9MTw8KHdpbmRvdzItMSk7CisJCWZvciAoaT0xOyBpPGo7IGkrKykKKwkJCXsKKwkJCWlmKCgodmFsMltpXSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgfHwKKwkJCQkJIUJOX21vZF9tdWxfbW9udGdvbWVyeSh2YWwyW2ldLHZhbDJbaS0xXSwKKwkJCQkJCWQsbW9udCxjdHgpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKworCS8qIE5vdyBjb21wdXRlIHRoZSBwb3dlciBwcm9kdWN0LCB1c2luZyBpbmRlcGVuZGVudCB3aW5kb3dzLiAqLworCXJfaXNfb25lPTE7CisJd3ZhbHVlMT0wOyAgLyogVGhlICd2YWx1ZScgb2YgdGhlIGZpcnN0IHdpbmRvdyAqLworCXd2YWx1ZTI9MDsgIC8qIFRoZSAndmFsdWUnIG9mIHRoZSBzZWNvbmQgd2luZG93ICovCisJd3BvczE9MDsgICAgLyogSWYgd3ZhbHVlMSA+IDAsIHRoZSBib3R0b20gYml0IG9mIHRoZSBmaXJzdCB3aW5kb3cgKi8KKwl3cG9zMj0wOyAgICAvKiBJZiB3dmFsdWUyID4gMCwgdGhlIGJvdHRvbSBiaXQgb2YgdGhlIHNlY29uZCB3aW5kb3cgKi8KKworCWlmICghQk5fdG9fbW9udGdvbWVyeShyLEJOX3ZhbHVlX29uZSgpLG1vbnQsY3R4KSkgZ290byBlcnI7CisJZm9yIChiPWJpdHMtMTsgYj49MDsgYi0tKQorCQl7CisJCWlmICghcl9pc19vbmUpCisJCQl7CisJCQlpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShyLHIscixtb250LGN0eCkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCQorCQlpZiAoIXd2YWx1ZTEpCisJCQlpZiAoQk5faXNfYml0X3NldChwMSwgYikpCisJCQkJeworCQkJCS8qIGNvbnNpZGVyIGJpdHMgYi13aW5kb3cxKzEgLi4gYiBmb3IgdGhpcyB3aW5kb3cgKi8KKwkJCQlpID0gYi13aW5kb3cxKzE7CisJCQkJd2hpbGUgKCFCTl9pc19iaXRfc2V0KHAxLCBpKSkgLyogd29ya3MgZm9yIGk8MCAqLworCQkJCQlpKys7CisJCQkJd3BvczEgPSBpOworCQkJCXd2YWx1ZTEgPSAxOworCQkJCWZvciAoaSA9IGItMTsgaSA+PSB3cG9zMTsgaS0tKQorCQkJCQl7CisJCQkJCXd2YWx1ZTEgPDw9IDE7CisJCQkJCWlmIChCTl9pc19iaXRfc2V0KHAxLCBpKSkKKwkJCQkJCXd2YWx1ZTErKzsKKwkJCQkJfQorCQkJCX0KKwkJCisJCWlmICghd3ZhbHVlMikKKwkJCWlmIChCTl9pc19iaXRfc2V0KHAyLCBiKSkKKwkJCQl7CisJCQkJLyogY29uc2lkZXIgYml0cyBiLXdpbmRvdzIrMSAuLiBiIGZvciB0aGlzIHdpbmRvdyAqLworCQkJCWkgPSBiLXdpbmRvdzIrMTsKKwkJCQl3aGlsZSAoIUJOX2lzX2JpdF9zZXQocDIsIGkpKQorCQkJCQlpKys7CisJCQkJd3BvczIgPSBpOworCQkJCXd2YWx1ZTIgPSAxOworCQkJCWZvciAoaSA9IGItMTsgaSA+PSB3cG9zMjsgaS0tKQorCQkJCQl7CisJCQkJCXd2YWx1ZTIgPDw9IDE7CisJCQkJCWlmIChCTl9pc19iaXRfc2V0KHAyLCBpKSkKKwkJCQkJCXd2YWx1ZTIrKzsKKwkJCQkJfQorCQkJCX0KKworCQlpZiAod3ZhbHVlMSAmJiBiID09IHdwb3MxKQorCQkJeworCQkJLyogd3ZhbHVlMSBpcyBvZGQgYW5kIDwgMl53aW5kb3cxICovCisJCQlpZiAoIUJOX21vZF9tdWxfbW9udGdvbWVyeShyLHIsdmFsMVt3dmFsdWUxPj4xXSxtb250LGN0eCkpCisJCQkJZ290byBlcnI7CisJCQl3dmFsdWUxID0gMDsKKwkJCXJfaXNfb25lID0gMDsKKwkJCX0KKwkJCisJCWlmICh3dmFsdWUyICYmIGIgPT0gd3BvczIpCisJCQl7CisJCQkvKiB3dmFsdWUyIGlzIG9kZCBhbmQgPCAyXndpbmRvdzIgKi8KKwkJCWlmICghQk5fbW9kX211bF9tb250Z29tZXJ5KHIscix2YWwyW3d2YWx1ZTI+PjFdLG1vbnQsY3R4KSkKKwkJCQlnb3RvIGVycjsKKwkJCXd2YWx1ZTIgPSAwOworCQkJcl9pc19vbmUgPSAwOworCQkJfQorCQl9CisJQk5fZnJvbV9tb250Z29tZXJ5KHJyLHIsbW9udCxjdHgpOworCXJldD0xOworZXJyOgorCWlmICgoaW5fbW9udCA9PSBOVUxMKSAmJiAobW9udCAhPSBOVUxMKSkgQk5fTU9OVF9DVFhfZnJlZShtb250KTsKKwlCTl9DVFhfZW5kKGN0eCk7CisJYm5fY2hlY2tfdG9wKHJyKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZ2NkLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fZ2NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzNTIxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9nY2QuYwpAQCAtMCwwICsxLDY1NCBAQAorLyogY3J5cHRvL2JuL2JuX2djZC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAiYm5fbGNsLmgiCisKK3N0YXRpYyBCSUdOVU0gKmV1Y2xpZChCSUdOVU0gKmEsIEJJR05VTSAqYik7CisKK2ludCBCTl9nY2QoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmluX2EsIGNvbnN0IEJJR05VTSAqaW5fYiwgQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqYSwqYiwqdDsKKwlpbnQgcmV0PTA7CisKKwlibl9jaGVja190b3AoaW5fYSk7CisJYm5fY2hlY2tfdG9wKGluX2IpOworCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJYSA9IEJOX0NUWF9nZXQoY3R4KTsKKwliID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmIChCTl9jb3B5KGEsaW5fYSkgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKEJOX2NvcHkoYixpbl9iKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlhLT5uZWcgPSAwOworCWItPm5lZyA9IDA7CisKKwlpZiAoQk5fY21wKGEsYikgPCAwKSB7IHQ9YTsgYT1iOyBiPXQ7IH0KKwl0PWV1Y2xpZChhLGIpOworCWlmICh0ID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKEJOX2NvcHkocix0KSA9PSBOVUxMKSBnb3RvIGVycjsKKwlyZXQ9MTsKK2VycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJYm5fY2hlY2tfdG9wKHIpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIEJJR05VTSAqZXVjbGlkKEJJR05VTSAqYSwgQklHTlVNICpiKQorCXsKKwlCSUdOVU0gKnQ7CisJaW50IHNoaWZ0cz0wOworCisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChiKTsKKworCS8qIDAgPD0gYiA8PSBhICovCisJd2hpbGUgKCFCTl9pc196ZXJvKGIpKQorCQl7CisJCS8qIDAgPCBiIDw9IGEgKi8KKworCQlpZiAoQk5faXNfb2RkKGEpKQorCQkJeworCQkJaWYgKEJOX2lzX29kZChiKSkKKwkJCQl7CisJCQkJaWYgKCFCTl9zdWIoYSxhLGIpKSBnb3RvIGVycjsKKwkJCQlpZiAoIUJOX3JzaGlmdDEoYSxhKSkgZ290byBlcnI7CisJCQkJaWYgKEJOX2NtcChhLGIpIDwgMCkKKwkJCQkJeyB0PWE7IGE9YjsgYj10OyB9CisJCQkJfQorCQkJZWxzZQkJLyogYSBvZGQgLSBiIGV2ZW4gKi8KKwkJCQl7CisJCQkJaWYgKCFCTl9yc2hpZnQxKGIsYikpIGdvdG8gZXJyOworCQkJCWlmIChCTl9jbXAoYSxiKSA8IDApCisJCQkJCXsgdD1hOyBhPWI7IGI9dDsgfQorCQkJCX0KKwkJCX0KKwkJZWxzZQkJCS8qIGEgaXMgZXZlbiAqLworCQkJeworCQkJaWYgKEJOX2lzX29kZChiKSkKKwkJCQl7CisJCQkJaWYgKCFCTl9yc2hpZnQxKGEsYSkpIGdvdG8gZXJyOworCQkJCWlmIChCTl9jbXAoYSxiKSA8IDApCisJCQkJCXsgdD1hOyBhPWI7IGI9dDsgfQorCQkJCX0KKwkJCWVsc2UJCS8qIGEgZXZlbiAtIGIgZXZlbiAqLworCQkJCXsKKwkJCQlpZiAoIUJOX3JzaGlmdDEoYSxhKSkgZ290byBlcnI7CisJCQkJaWYgKCFCTl9yc2hpZnQxKGIsYikpIGdvdG8gZXJyOworCQkJCXNoaWZ0cysrOworCQkJCX0KKwkJCX0KKwkJLyogMCA8PSBiIDw9IGEgKi8KKwkJfQorCisJaWYgKHNoaWZ0cykKKwkJeworCQlpZiAoIUJOX2xzaGlmdChhLGEsc2hpZnRzKSkgZ290byBlcnI7CisJCX0KKwlibl9jaGVja190b3AoYSk7CisJcmV0dXJuKGEpOworZXJyOgorCXJldHVybihOVUxMKTsKKwl9CisKKworLyogc29sdmVzIGF4ID09IDEgKG1vZCBuKSAqLworc3RhdGljIEJJR05VTSAqQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKEJJR05VTSAqaW4sCisgICAgICAgIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpuLCBCTl9DVFggKmN0eCk7CitCSUdOVU0gKkJOX21vZF9pbnZlcnNlKEJJR05VTSAqaW4sCisJY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm4sIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKkEsKkIsKlgsKlksKk0sKkQsKlQsKlI9TlVMTDsKKwlCSUdOVU0gKnJldD1OVUxMOworCWludCBzaWduOworCisJaWYgKChCTl9nZXRfZmxhZ3MoYSwgQk5fRkxHX0NPTlNUVElNRSkgIT0gMCkgfHwgKEJOX2dldF9mbGFncyhuLCBCTl9GTEdfQ09OU1RUSU1FKSAhPSAwKSkKKwkJeworCQlyZXR1cm4gQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKGluLCBhLCBuLCBjdHgpOworCQl9CisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKG4pOworCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJQSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlCID0gQk5fQ1RYX2dldChjdHgpOworCVggPSBCTl9DVFhfZ2V0KGN0eCk7CisJRCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlNID0gQk5fQ1RYX2dldChjdHgpOworCVkgPSBCTl9DVFhfZ2V0KGN0eCk7CisJVCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoVCA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmIChpbiA9PSBOVUxMKQorCQlSPUJOX25ldygpOworCWVsc2UKKwkJUj1pbjsKKwlpZiAoUiA9PSBOVUxMKSBnb3RvIGVycjsKKworCUJOX29uZShYKTsKKwlCTl96ZXJvKFkpOworCWlmIChCTl9jb3B5KEIsYSkgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKEJOX2NvcHkoQSxuKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlBLT5uZWcgPSAwOworCWlmIChCLT5uZWcgfHwgKEJOX3VjbXAoQiwgQSkgPj0gMCkpCisJCXsKKwkJaWYgKCFCTl9ubm1vZChCLCBCLCBBLCBjdHgpKSBnb3RvIGVycjsKKwkJfQorCXNpZ24gPSAtMTsKKwkvKiBGcm9tICBCID0gYSBtb2QgfG58LCAgQSA9IHxufCAgaXQgZm9sbG93cyB0aGF0CisJICoKKwkgKiAgICAgIDAgPD0gQiA8IEEsCisJICogICAgIC1zaWduKlgqYSAgPT0gIEIgICAobW9kIHxufCksCisJICogICAgICBzaWduKlkqYSAgPT0gIEEgICAobW9kIHxufCkuCisJICovCisKKwlpZiAoQk5faXNfb2RkKG4pICYmIChCTl9udW1fYml0cyhuKSA8PSAoQk5fQklUUyA8PSAzMiA/IDQ1MCA6IDIwNDgpKSkKKwkJeworCQkvKiBCaW5hcnkgaW52ZXJzaW9uIGFsZ29yaXRobTsgcmVxdWlyZXMgb2RkIG1vZHVsdXMuCisJCSAqIFRoaXMgaXMgZmFzdGVyIHRoYW4gdGhlIGdlbmVyYWwgYWxnb3JpdGhtIGlmIHRoZSBtb2R1bHVzCisJCSAqIGlzIHN1ZmZpY2llbnRseSBzbWFsbCAoYWJvdXQgNDAwIC4uIDUwMCBiaXRzIG9uIDMyLWJpdAorCQkgKiBzeXRlbXMsIGJ1dCBtdWNoIG1vcmUgb24gNjQtYml0IHN5c3RlbXMpICovCisJCWludCBzaGlmdDsKKwkJCisJCXdoaWxlICghQk5faXNfemVybyhCKSkKKwkJCXsKKwkJCS8qCisJCQkgKiAgICAgIDAgPCBCIDwgfG58LAorCQkJICogICAgICAwIDwgQSA8PSB8bnwsCisJCQkgKiAoMSkgLXNpZ24qWCphICA9PSAgQiAgIChtb2QgfG58KSwKKwkJCSAqICgyKSAgc2lnbipZKmEgID09ICBBICAgKG1vZCB8bnwpCisJCQkgKi8KKworCQkJLyogTm93IGRpdmlkZSAgQiAgYnkgdGhlIG1heGltdW0gcG9zc2libGUgcG93ZXIgb2YgdHdvIGluIHRoZSBpbnRlZ2VycywKKwkJCSAqIGFuZCBkaXZpZGUgIFggIGJ5IHRoZSBzYW1lIHZhbHVlIG1vZCB8bnwuCisJCQkgKiBXaGVuIHdlJ3JlIGRvbmUsICgxKSBzdGlsbCBob2xkcy4gKi8KKwkJCXNoaWZ0ID0gMDsKKwkJCXdoaWxlICghQk5faXNfYml0X3NldChCLCBzaGlmdCkpIC8qIG5vdGUgdGhhdCAwIDwgQiAqLworCQkJCXsKKwkJCQlzaGlmdCsrOworCQkJCQorCQkJCWlmIChCTl9pc19vZGQoWCkpCisJCQkJCXsKKwkJCQkJaWYgKCFCTl91YWRkKFgsIFgsIG4pKSBnb3RvIGVycjsKKwkJCQkJfQorCQkJCS8qIG5vdyBYIGlzIGV2ZW4sIHNvIHdlIGNhbiBlYXNpbHkgZGl2aWRlIGl0IGJ5IHR3byAqLworCQkJCWlmICghQk5fcnNoaWZ0MShYLCBYKSkgZ290byBlcnI7CisJCQkJfQorCQkJaWYgKHNoaWZ0ID4gMCkKKwkJCQl7CisJCQkJaWYgKCFCTl9yc2hpZnQoQiwgQiwgc2hpZnQpKSBnb3RvIGVycjsKKwkJCQl9CisKKworCQkJLyogU2FtZSBmb3IgIEEgIGFuZCAgWS4gIEFmdGVyd2FyZHMsICgyKSBzdGlsbCBob2xkcy4gKi8KKwkJCXNoaWZ0ID0gMDsKKwkJCXdoaWxlICghQk5faXNfYml0X3NldChBLCBzaGlmdCkpIC8qIG5vdGUgdGhhdCAwIDwgQSAqLworCQkJCXsKKwkJCQlzaGlmdCsrOworCQkJCQorCQkJCWlmIChCTl9pc19vZGQoWSkpCisJCQkJCXsKKwkJCQkJaWYgKCFCTl91YWRkKFksIFksIG4pKSBnb3RvIGVycjsKKwkJCQkJfQorCQkJCS8qIG5vdyBZIGlzIGV2ZW4gKi8KKwkJCQlpZiAoIUJOX3JzaGlmdDEoWSwgWSkpIGdvdG8gZXJyOworCQkJCX0KKwkJCWlmIChzaGlmdCA+IDApCisJCQkJeworCQkJCWlmICghQk5fcnNoaWZ0KEEsIEEsIHNoaWZ0KSkgZ290byBlcnI7CisJCQkJfQorCisJCQkKKwkJCS8qIFdlIHN0aWxsIGhhdmUgKDEpIGFuZCAoMikuCisJCQkgKiBCb3RoICBBICBhbmQgIEIgIGFyZSBvZGQuCisJCQkgKiBUaGUgZm9sbG93aW5nIGNvbXB1dGF0aW9ucyBlbnN1cmUgdGhhdAorCQkJICoKKwkJCSAqICAgICAwIDw9IEIgPCB8bnwsCisJCQkgKiAgICAgIDAgPCBBIDwgfG58LAorCQkJICogKDEpIC1zaWduKlgqYSAgPT0gIEIgICAobW9kIHxufCksCisJCQkgKiAoMikgIHNpZ24qWSphICA9PSAgQSAgIChtb2QgfG58KSwKKwkJCSAqCisJCQkgKiBhbmQgdGhhdCBlaXRoZXIgIEEgIG9yICBCICBpcyBldmVuIGluIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKwkJCSAqLworCQkJaWYgKEJOX3VjbXAoQiwgQSkgPj0gMCkKKwkJCQl7CisJCQkJLyogLXNpZ24qKFggKyBZKSphID09IEIgLSBBICAobW9kIHxufCkgKi8KKwkJCQlpZiAoIUJOX3VhZGQoWCwgWCwgWSkpIGdvdG8gZXJyOworCQkJCS8qIE5COiB3ZSBjb3VsZCB1c2UgQk5fbW9kX2FkZF9xdWljayhYLCBYLCBZLCBuKSwgYnV0IHRoYXQKKwkJCQkgKiBhY3R1YWxseSBtYWtlcyB0aGUgYWxnb3JpdGhtIHNsb3dlciAqLworCQkJCWlmICghQk5fdXN1YihCLCBCLCBBKSkgZ290byBlcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkvKiAgc2lnbiooWCArIFkpKmEgPT0gQSAtIEIgIChtb2QgfG58KSAqLworCQkJCWlmICghQk5fdWFkZChZLCBZLCBYKSkgZ290byBlcnI7CisJCQkJLyogYXMgYWJvdmUsIEJOX21vZF9hZGRfcXVpY2soWSwgWSwgWCwgbikgd291bGQgc2xvdyB0aGluZ3MgZG93biAqLworCQkJCWlmICghQk5fdXN1YihBLCBBLCBCKSkgZ290byBlcnI7CisJCQkJfQorCQkJfQorCQl9CisJZWxzZQorCQl7CisJCS8qIGdlbmVyYWwgaW52ZXJzaW9uIGFsZ29yaXRobSAqLworCisJCXdoaWxlICghQk5faXNfemVybyhCKSkKKwkJCXsKKwkJCUJJR05VTSAqdG1wOworCQkJCisJCQkvKgorCQkJICogICAgICAwIDwgQiA8IEEsCisJCQkgKiAoKikgLXNpZ24qWCphICA9PSAgQiAgIChtb2QgfG58KSwKKwkJCSAqICAgICAgc2lnbipZKmEgID09ICBBICAgKG1vZCB8bnwpCisJCQkgKi8KKwkJCQorCQkJLyogKEQsIE0pIDo9IChBL0IsIEElQikgLi4uICovCisJCQlpZiAoQk5fbnVtX2JpdHMoQSkgPT0gQk5fbnVtX2JpdHMoQikpCisJCQkJeworCQkJCWlmICghQk5fb25lKEQpKSBnb3RvIGVycjsKKwkJCQlpZiAoIUJOX3N1YihNLEEsQikpIGdvdG8gZXJyOworCQkJCX0KKwkJCWVsc2UgaWYgKEJOX251bV9iaXRzKEEpID09IEJOX251bV9iaXRzKEIpICsgMSkKKwkJCQl7CisJCQkJLyogQS9CIGlzIDEsIDIsIG9yIDMgKi8KKwkJCQlpZiAoIUJOX2xzaGlmdDEoVCxCKSkgZ290byBlcnI7CisJCQkJaWYgKEJOX3VjbXAoQSxUKSA8IDApCisJCQkJCXsKKwkJCQkJLyogQSA8IDIqQiwgc28gRD0xICovCisJCQkJCWlmICghQk5fb25lKEQpKSBnb3RvIGVycjsKKwkJCQkJaWYgKCFCTl9zdWIoTSxBLEIpKSBnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQkvKiBBID49IDIqQiwgc28gRD0yIG9yIEQ9MyAqLworCQkJCQlpZiAoIUJOX3N1YihNLEEsVCkpIGdvdG8gZXJyOworCQkJCQlpZiAoIUJOX2FkZChELFQsQikpIGdvdG8gZXJyOyAvKiB1c2UgRCAoOj0gMypCKSBhcyB0ZW1wICovCisJCQkJCWlmIChCTl91Y21wKEEsRCkgPCAwKQorCQkJCQkJeworCQkJCQkJLyogQSA8IDMqQiwgc28gRD0yICovCisJCQkJCQlpZiAoIUJOX3NldF93b3JkKEQsMikpIGdvdG8gZXJyOworCQkJCQkJLyogTSAoPSBBIC0gMipCKSBhbHJlYWR5IGhhcyB0aGUgY29ycmVjdCB2YWx1ZSAqLworCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkvKiBvbmx5IEQ9MyByZW1haW5zICovCisJCQkJCQlpZiAoIUJOX3NldF93b3JkKEQsMykpIGdvdG8gZXJyOworCQkJCQkJLyogY3VycmVudGx5ICBNID0gQSAtIDIqQiwgIGJ1dCB3ZSBuZWVkICBNID0gQSAtIDMqQiAqLworCQkJCQkJaWYgKCFCTl9zdWIoTSxNLEIpKSBnb3RvIGVycjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKCFCTl9kaXYoRCxNLEEsQixjdHgpKSBnb3RvIGVycjsKKwkJCQl9CisJCQkKKwkJCS8qIE5vdworCQkJICogICAgICBBID0gRCpCICsgTTsKKwkJCSAqIHRodXMgd2UgaGF2ZQorCQkJICogKCoqKSAgc2lnbipZKmEgID09ICBEKkIgKyBNICAgKG1vZCB8bnwpLgorCQkJICovCisJCQkKKwkJCXRtcD1BOyAvKiBrZWVwIHRoZSBCSUdOVU0gb2JqZWN0LCB0aGUgdmFsdWUgZG9lcyBub3QgbWF0dGVyICovCisJCQkKKwkJCS8qIChBLCBCKSA6PSAoQiwgQSBtb2QgQikgLi4uICovCisJCQlBPUI7CisJCQlCPU07CisJCQkvKiAuLi4gc28gd2UgaGF2ZSAgMCA8PSBCIDwgQSAgYWdhaW4gKi8KKwkJCQorCQkJLyogU2luY2UgdGhlIGZvcm1lciAgTSAgaXMgbm93ICBCICBhbmQgdGhlIGZvcm1lciAgQiAgaXMgbm93ICBBLAorCQkJICogKCoqKSB0cmFuc2xhdGVzIGludG8KKwkJCSAqICAgICAgIHNpZ24qWSphICA9PSAgRCpBICsgQiAgICAobW9kIHxufCksCisJCQkgKiBpLmUuCisJCQkgKiAgICAgICBzaWduKlkqYSAtIEQqQSAgPT0gIEIgICAgKG1vZCB8bnwpLgorCQkJICogU2ltaWxhcmx5LCAoKikgdHJhbnNsYXRlcyBpbnRvCisJCQkgKiAgICAgIC1zaWduKlgqYSAgPT0gIEEgICAgICAgICAgKG1vZCB8bnwpLgorCQkJICoKKwkJCSAqIFRodXMsCisJCQkgKiAgIHNpZ24qWSphICsgRCpzaWduKlgqYSAgPT0gIEIgIChtb2QgfG58KSwKKwkJCSAqIGkuZS4KKwkJCSAqICAgICAgICBzaWduKihZICsgRCpYKSphICA9PSAgQiAgKG1vZCB8bnwpLgorCQkJICoKKwkJCSAqIFNvIGlmIHdlIHNldCAgKFgsIFksIHNpZ24pIDo9IChZICsgRCpYLCBYLCAtc2lnbiksICB3ZSBhcnJpdmUgYmFjayBhdAorCQkJICogICAgICAtc2lnbipYKmEgID09ICBCICAgKG1vZCB8bnwpLAorCQkJICogICAgICAgc2lnbipZKmEgID09ICBBICAgKG1vZCB8bnwpLgorCQkJICogTm90ZSB0aGF0ICBYICBhbmQgIFkgIHN0YXkgbm9uLW5lZ2F0aXZlIGFsbCB0aGUgdGltZS4KKwkJCSAqLworCQkJCisJCQkvKiBtb3N0IG9mIHRoZSB0aW1lIEQgaXMgdmVyeSBzbWFsbCwgc28gd2UgY2FuIG9wdGltaXplIHRtcCA6PSBEKlgrWSAqLworCQkJaWYgKEJOX2lzX29uZShEKSkKKwkJCQl7CisJCQkJaWYgKCFCTl9hZGQodG1wLFgsWSkpIGdvdG8gZXJyOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKEJOX2lzX3dvcmQoRCwyKSkKKwkJCQkJeworCQkJCQlpZiAoIUJOX2xzaGlmdDEodG1wLFgpKSBnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UgaWYgKEJOX2lzX3dvcmQoRCw0KSkKKwkJCQkJeworCQkJCQlpZiAoIUJOX2xzaGlmdCh0bXAsWCwyKSkgZ290byBlcnI7CisJCQkJCX0KKwkJCQllbHNlIGlmIChELT50b3AgPT0gMSkKKwkJCQkJeworCQkJCQlpZiAoIUJOX2NvcHkodG1wLFgpKSBnb3RvIGVycjsKKwkJCQkJaWYgKCFCTl9tdWxfd29yZCh0bXAsRC0+ZFswXSkpIGdvdG8gZXJyOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICghQk5fbXVsKHRtcCxELFgsY3R4KSkgZ290byBlcnI7CisJCQkJCX0KKwkJCQlpZiAoIUJOX2FkZCh0bXAsdG1wLFkpKSBnb3RvIGVycjsKKwkJCQl9CisJCQkKKwkJCU09WTsgLyoga2VlcCB0aGUgQklHTlVNIG9iamVjdCwgdGhlIHZhbHVlIGRvZXMgbm90IG1hdHRlciAqLworCQkJWT1YOworCQkJWD10bXA7CisJCQlzaWduID0gLXNpZ247CisJCQl9CisJCX0KKwkJCisJLyoKKwkgKiBUaGUgd2hpbGUgbG9vcCAoRXVjbGlkJ3MgYWxnb3JpdGhtKSBlbmRzIHdoZW4KKwkgKiAgICAgIEEgPT0gZ2NkKGEsbik7CisJICogd2UgaGF2ZQorCSAqICAgICAgIHNpZ24qWSphICA9PSAgQSAgKG1vZCB8bnwpLAorCSAqIHdoZXJlICBZICBpcyBub24tbmVnYXRpdmUuCisJICovCisKKwlpZiAoc2lnbiA8IDApCisJCXsKKwkJaWYgKCFCTl9zdWIoWSxuLFkpKSBnb3RvIGVycjsKKwkJfQorCS8qIE5vdyAgWSphICA9PSAgQSAgKG1vZCB8bnwpLiAgKi8KKwkKKworCWlmIChCTl9pc19vbmUoQSkpCisJCXsKKwkJLyogWSphID09IDEgIChtb2QgfG58KSAqLworCQlpZiAoIVktPm5lZyAmJiBCTl91Y21wKFksbikgPCAwKQorCQkJeworCQkJaWYgKCFCTl9jb3B5KFIsWSkpIGdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoIUJOX25ubW9kKFIsWSxuLGN0eCkpIGdvdG8gZXJyOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fTU9EX0lOVkVSU0UsQk5fUl9OT19JTlZFUlNFKTsKKwkJZ290byBlcnI7CisJCX0KKwlyZXQ9UjsKK2VycjoKKwlpZiAoKHJldCA9PSBOVUxMKSAmJiAoaW4gPT0gTlVMTCkpIEJOX2ZyZWUoUik7CisJQk5fQ1RYX2VuZChjdHgpOworCWJuX2NoZWNrX3RvcChyZXQpOworCXJldHVybihyZXQpOworCX0KKworCisvKiBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2ggaXMgYSBzcGVjaWFsIHZlcnNpb24gb2YgQk5fbW9kX2ludmVyc2UuIAorICogSXQgZG9lcyBub3QgY29udGFpbiBicmFuY2hlcyB0aGF0IG1heSBsZWFrIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIEJJR05VTSAqQk5fbW9kX2ludmVyc2Vfbm9fYnJhbmNoKEJJR05VTSAqaW4sCisJY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm4sIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKkEsKkIsKlgsKlksKk0sKkQsKlQsKlI9TlVMTDsKKwlCSUdOVU0gbG9jYWxfQSwgbG9jYWxfQjsKKwlCSUdOVU0gKnBBLCAqcEI7CisJQklHTlVNICpyZXQ9TlVMTDsKKwlpbnQgc2lnbjsKKworCWJuX2NoZWNrX3RvcChhKTsKKwlibl9jaGVja190b3Aobik7CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlBID0gQk5fQ1RYX2dldChjdHgpOworCUIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJWCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlEID0gQk5fQ1RYX2dldChjdHgpOworCU0gPSBCTl9DVFhfZ2V0KGN0eCk7CisJWSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlUID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChUID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKGluID09IE5VTEwpCisJCVI9Qk5fbmV3KCk7CisJZWxzZQorCQlSPWluOworCWlmIChSID09IE5VTEwpIGdvdG8gZXJyOworCisJQk5fb25lKFgpOworCUJOX3plcm8oWSk7CisJaWYgKEJOX2NvcHkoQixhKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoQk5fY29weShBLG4pID09IE5VTEwpIGdvdG8gZXJyOworCUEtPm5lZyA9IDA7CisKKwlpZiAoQi0+bmVnIHx8IChCTl91Y21wKEIsIEEpID49IDApKQorCQl7CisJCS8qIFR1cm4gQk5fRkxHX0NPTlNUVElNRSBmbGFnIG9uLCBzbyB0aGF0IHdoZW4gQk5fZGl2IGlzIGludm9rZWQsCisJIAkgKiBCTl9kaXZfbm9fYnJhbmNoIHdpbGwgYmUgY2FsbGVkIGV2ZW50dWFsbHkuCisJIAkgKi8KKwkJcEIgPSAmbG9jYWxfQjsKKwkJQk5fd2l0aF9mbGFncyhwQiwgQiwgQk5fRkxHX0NPTlNUVElNRSk7CQorCQlpZiAoIUJOX25ubW9kKEIsIHBCLCBBLCBjdHgpKSBnb3RvIGVycjsKKwkJfQorCXNpZ24gPSAtMTsKKwkvKiBGcm9tICBCID0gYSBtb2QgfG58LCAgQSA9IHxufCAgaXQgZm9sbG93cyB0aGF0CisJICoKKwkgKiAgICAgIDAgPD0gQiA8IEEsCisJICogICAgIC1zaWduKlgqYSAgPT0gIEIgICAobW9kIHxufCksCisJICogICAgICBzaWduKlkqYSAgPT0gIEEgICAobW9kIHxufCkuCisJICovCisKKwl3aGlsZSAoIUJOX2lzX3plcm8oQikpCisJCXsKKwkJQklHTlVNICp0bXA7CisJCQorCQkvKgorCQkgKiAgICAgIDAgPCBCIDwgQSwKKwkJICogKCopIC1zaWduKlgqYSAgPT0gIEIgICAobW9kIHxufCksCisJCSAqICAgICAgc2lnbipZKmEgID09ICBBICAgKG1vZCB8bnwpCisJCSAqLworCisJCS8qIFR1cm4gQk5fRkxHX0NPTlNUVElNRSBmbGFnIG9uLCBzbyB0aGF0IHdoZW4gQk5fZGl2IGlzIGludm9rZWQsCisJIAkgKiBCTl9kaXZfbm9fYnJhbmNoIHdpbGwgYmUgY2FsbGVkIGV2ZW50dWFsbHkuCisJIAkgKi8KKwkJcEEgPSAmbG9jYWxfQTsKKwkJQk5fd2l0aF9mbGFncyhwQSwgQSwgQk5fRkxHX0NPTlNUVElNRSk7CQorCQkKKwkJLyogKEQsIE0pIDo9IChBL0IsIEElQikgLi4uICovCQkKKwkJaWYgKCFCTl9kaXYoRCxNLHBBLEIsY3R4KSkgZ290byBlcnI7CisJCQorCQkvKiBOb3cKKwkJICogICAgICBBID0gRCpCICsgTTsKKwkJICogdGh1cyB3ZSBoYXZlCisJCSAqICgqKikgIHNpZ24qWSphICA9PSAgRCpCICsgTSAgIChtb2QgfG58KS4KKwkJICovCisJCQorCQl0bXA9QTsgLyoga2VlcCB0aGUgQklHTlVNIG9iamVjdCwgdGhlIHZhbHVlIGRvZXMgbm90IG1hdHRlciAqLworCQkKKwkJLyogKEEsIEIpIDo9IChCLCBBIG1vZCBCKSAuLi4gKi8KKwkJQT1COworCQlCPU07CisJCS8qIC4uLiBzbyB3ZSBoYXZlICAwIDw9IEIgPCBBICBhZ2FpbiAqLworCQkKKwkJLyogU2luY2UgdGhlIGZvcm1lciAgTSAgaXMgbm93ICBCICBhbmQgdGhlIGZvcm1lciAgQiAgaXMgbm93ICBBLAorCQkgKiAoKiopIHRyYW5zbGF0ZXMgaW50bworCQkgKiAgICAgICBzaWduKlkqYSAgPT0gIEQqQSArIEIgICAgKG1vZCB8bnwpLAorCQkgKiBpLmUuCisJCSAqICAgICAgIHNpZ24qWSphIC0gRCpBICA9PSAgQiAgICAobW9kIHxufCkuCisJCSAqIFNpbWlsYXJseSwgKCopIHRyYW5zbGF0ZXMgaW50bworCQkgKiAgICAgIC1zaWduKlgqYSAgPT0gIEEgICAgICAgICAgKG1vZCB8bnwpLgorCQkgKgorCQkgKiBUaHVzLAorCQkgKiAgIHNpZ24qWSphICsgRCpzaWduKlgqYSAgPT0gIEIgIChtb2QgfG58KSwKKwkJICogaS5lLgorCQkgKiAgICAgICAgc2lnbiooWSArIEQqWCkqYSAgPT0gIEIgIChtb2QgfG58KS4KKwkJICoKKwkJICogU28gaWYgd2Ugc2V0ICAoWCwgWSwgc2lnbikgOj0gKFkgKyBEKlgsIFgsIC1zaWduKSwgIHdlIGFycml2ZSBiYWNrIGF0CisJCSAqICAgICAgLXNpZ24qWCphICA9PSAgQiAgIChtb2QgfG58KSwKKwkJICogICAgICAgc2lnbipZKmEgID09ICBBICAgKG1vZCB8bnwpLgorCQkgKiBOb3RlIHRoYXQgIFggIGFuZCAgWSAgc3RheSBub24tbmVnYXRpdmUgYWxsIHRoZSB0aW1lLgorCQkgKi8KKwkJCQorCQlpZiAoIUJOX211bCh0bXAsRCxYLGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX2FkZCh0bXAsdG1wLFkpKSBnb3RvIGVycjsKKworCQlNPVk7IC8qIGtlZXAgdGhlIEJJR05VTSBvYmplY3QsIHRoZSB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIgKi8KKwkJWT1YOworCQlYPXRtcDsKKwkJc2lnbiA9IC1zaWduOworCQl9CisJCQorCS8qCisJICogVGhlIHdoaWxlIGxvb3AgKEV1Y2xpZCdzIGFsZ29yaXRobSkgZW5kcyB3aGVuCisJICogICAgICBBID09IGdjZChhLG4pOworCSAqIHdlIGhhdmUKKwkgKiAgICAgICBzaWduKlkqYSAgPT0gIEEgIChtb2QgfG58KSwKKwkgKiB3aGVyZSAgWSAgaXMgbm9uLW5lZ2F0aXZlLgorCSAqLworCisJaWYgKHNpZ24gPCAwKQorCQl7CisJCWlmICghQk5fc3ViKFksbixZKSkgZ290byBlcnI7CisJCX0KKwkvKiBOb3cgIFkqYSAgPT0gIEEgIChtb2QgfG58KS4gICovCisKKwlpZiAoQk5faXNfb25lKEEpKQorCQl7CisJCS8qIFkqYSA9PSAxICAobW9kIHxufCkgKi8KKwkJaWYgKCFZLT5uZWcgJiYgQk5fdWNtcChZLG4pIDwgMCkKKwkJCXsKKwkJCWlmICghQk5fY29weShSLFkpKSBnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKCFCTl9ubm1vZChSLFksbixjdHgpKSBnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlCTmVycihCTl9GX0JOX01PRF9JTlZFUlNFX05PX0JSQU5DSCxCTl9SX05PX0lOVkVSU0UpOworCQlnb3RvIGVycjsKKwkJfQorCXJldD1SOworZXJyOgorCWlmICgocmV0ID09IE5VTEwpICYmIChpbiA9PSBOVUxMKSkgQk5fZnJlZShSKTsKKwlCTl9DVFhfZW5kKGN0eCk7CisJYm5fY2hlY2tfdG9wKHJldCk7CisJcmV0dXJuKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2dmMm0uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9nZjJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3YjBmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9nZjJtLmMKQEAgLTAsMCArMSwxMDM0IEBACisvKiBjcnlwdG8vYm4vYm5fZ2YybS5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFRoZSBFbGxpcHRpYyBDdXJ2ZSBQdWJsaWMtS2V5IENyeXB0byBMaWJyYXJ5IChFQ0MgQ29kZSkgaW5jbHVkZWQKKyAqIGhlcmVpbiBpcyBkZXZlbG9wZWQgYnkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGlzIGNvbnRyaWJ1dGVkCisgKiB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBFQ0MgQ29kZSBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBiZWxvdy4KKyAqCisgKiBJbiBhZGRpdGlvbiwgU3VuIGNvdmVuYW50cyB0byBhbGwgbGljZW5zZWVzIHdobyBwcm92aWRlIGEgcmVjaXByb2NhbAorICogY292ZW5hbnQgd2l0aCByZXNwZWN0IHRvIHRoZWlyIG93biBwYXRlbnRzIGlmIGFueSwgbm90IHRvIHN1ZSB1bmRlcgorICogY3VycmVudCBhbmQgZnV0dXJlIHBhdGVudCBjbGFpbXMgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsCisgKiB1c2luZywgcHJhY3RpY2luZywgc2VsbGluZywgb2ZmZXJpbmcgZm9yIHNhbGUgYW5kL29yIG90aGVyd2lzZQorICogZGlzcG9zaW5nIG9mIHRoZSBFQ0MgQ29kZSBhcyBkZWxpdmVyZWQgaGVyZXVuZGVyIChvciBwb3J0aW9ucyB0aGVyZW9mKSwKKyAqIHByb3ZpZGVkIHRoYXQgc3VjaCBjb3ZlbmFudCBzaGFsbCBub3QgYXBwbHk6CisgKiAgMSkgZm9yIGNvZGUgdGhhdCBhIGxpY2Vuc2VlIGRlbGV0ZXMgZnJvbSB0aGUgRUNDIENvZGU7CisgKiAgMikgc2VwYXJhdGVzIGZyb20gdGhlIEVDQyBDb2RlOyBvcgorICogIDMpIGZvciBpbmZyaW5nZW1lbnRzIGNhdXNlZCBieToKKyAqICAgICAgIGkpIHRoZSBtb2RpZmljYXRpb24gb2YgdGhlIEVDQyBDb2RlIG9yCisgKiAgICAgIGlpKSB0aGUgY29tYmluYXRpb24gb2YgdGhlIEVDQyBDb2RlIHdpdGggb3RoZXIgc29mdHdhcmUgb3IKKyAqICAgICAgICAgIGRldmljZXMgd2hlcmUgc3VjaCBjb21iaW5hdGlvbiBjYXVzZXMgdGhlIGluZnJpbmdlbWVudC4KKyAqCisgKiBUaGUgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IFNoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kCisgKiBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisKKy8qIE5PVEU6IFRoaXMgZmlsZSBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBsaWNlbnNlIGJlbG93CisgKiBhbmQgbWF5IGJlIG1vZGlmaWVkOyBidXQgYWZ0ZXIgbW9kaWZpY2F0aW9ucywgdGhlIGFib3ZlIGNvdmVuYW50CisgKiBtYXkgbm8gbG9uZ2VyIGFwcGx5ISAgSW4gc3VjaCBjYXNlcywgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYWdyYXBoCisgKiBbIkluIGFkZGl0aW9uLCBTdW4gY292ZW5hbnRzIC4uLiBjYXVzZXMgdGhlIGluZnJpbmdlbWVudC4iXSBhbmQKKyAqIHRoaXMgbm90ZSBjYW4gYmUgZWRpdGVkIG91dDsgYnV0IHBsZWFzZSBrZWVwIHRoZSBTdW4gY29weXJpZ2h0CisgKiBub3RpY2UgYW5kIGF0dHJpYnV0aW9uLiAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworLyogTWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyBiZWZvcmUgQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnIgc2hvdWxkIGZhaWwuICovCisjZGVmaW5lIE1BWF9JVEVSQVRJT05TIDUwCisKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBTUVJfdGJbMTZdID0KKyAgeyAgICAgMCwgICAgIDEsICAgICA0LCAgICAgNSwgICAgMTYsICAgIDE3LCAgICAyMCwgICAgMjEsCisgICAgICAgNjQsICAgIDY1LCAgICA2OCwgICAgNjksICAgIDgwLCAgICA4MSwgICAgODQsICAgIDg1IH07CisvKiBQbGF0Zm9ybS1zcGVjaWZpYyBtYWNyb3MgdG8gYWNjZWxlcmF0ZSBzcXVhcmluZy4gKi8KKyNpZiBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUKSB8fCBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUX0xPTkcpCisjZGVmaW5lIFNRUjEodykgXAorICAgIFNRUl90YlsodykgPj4gNjAgJiAweEZdIDw8IDU2IHwgU1FSX3RiWyh3KSA+PiA1NiAmIDB4Rl0gPDwgNDggfCBcCisgICAgU1FSX3RiWyh3KSA+PiA1MiAmIDB4Rl0gPDwgNDAgfCBTUVJfdGJbKHcpID4+IDQ4ICYgMHhGXSA8PCAzMiB8IFwKKyAgICBTUVJfdGJbKHcpID4+IDQ0ICYgMHhGXSA8PCAyNCB8IFNRUl90YlsodykgPj4gNDAgJiAweEZdIDw8IDE2IHwgXAorICAgIFNRUl90YlsodykgPj4gMzYgJiAweEZdIDw8ICA4IHwgU1FSX3RiWyh3KSA+PiAzMiAmIDB4Rl0KKyNkZWZpbmUgU1FSMCh3KSBcCisgICAgU1FSX3RiWyh3KSA+PiAyOCAmIDB4Rl0gPDwgNTYgfCBTUVJfdGJbKHcpID4+IDI0ICYgMHhGXSA8PCA0OCB8IFwKKyAgICBTUVJfdGJbKHcpID4+IDIwICYgMHhGXSA8PCA0MCB8IFNRUl90YlsodykgPj4gMTYgJiAweEZdIDw8IDMyIHwgXAorICAgIFNRUl90YlsodykgPj4gMTIgJiAweEZdIDw8IDI0IHwgU1FSX3RiWyh3KSA+PiAgOCAmIDB4Rl0gPDwgMTYgfCBcCisgICAgU1FSX3RiWyh3KSA+PiAgNCAmIDB4Rl0gPDwgIDggfCBTUVJfdGJbKHcpICAgICAgICYgMHhGXQorI2VuZGlmCisjaWZkZWYgVEhJUlRZX1RXT19CSVQKKyNkZWZpbmUgU1FSMSh3KSBcCisgICAgU1FSX3RiWyh3KSA+PiAyOCAmIDB4Rl0gPDwgMjQgfCBTUVJfdGJbKHcpID4+IDI0ICYgMHhGXSA8PCAxNiB8IFwKKyAgICBTUVJfdGJbKHcpID4+IDIwICYgMHhGXSA8PCAgOCB8IFNRUl90YlsodykgPj4gMTYgJiAweEZdCisjZGVmaW5lIFNRUjAodykgXAorICAgIFNRUl90YlsodykgPj4gMTIgJiAweEZdIDw8IDI0IHwgU1FSX3RiWyh3KSA+PiAgOCAmIDB4Rl0gPDwgMTYgfCBcCisgICAgU1FSX3RiWyh3KSA+PiAgNCAmIDB4Rl0gPDwgIDggfCBTUVJfdGJbKHcpICAgICAgICYgMHhGXQorI2VuZGlmCisKKy8qIFByb2R1Y3Qgb2YgdHdvIHBvbHlub21pYWxzIGEsIGIgZWFjaCB3aXRoIGRlZ3JlZSA8IEJOX0JJVFMyIC0gMSwKKyAqIHJlc3VsdCBpcyBhIHBvbHlub21pYWwgciB3aXRoIGRlZ3JlZSA8IDIgKiBCTl9CSVRTIC0gMQorICogVGhlIGNhbGxlciBNVVNUIGVuc3VyZSB0aGF0IHRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgcmlnaHQgYW1vdW50CisgKiBvZiBzcGFjZSBhbGxvY2F0ZWQuCisgKi8KKyNpZmRlZiBUSElSVFlfVFdPX0JJVAorc3RhdGljIHZvaWQgYm5fR0YybV9tdWxfMXgxKEJOX1VMT05HICpyMSwgQk5fVUxPTkcgKnIwLCBjb25zdCBCTl9VTE9ORyBhLCBjb25zdCBCTl9VTE9ORyBiKQorCXsKKwlyZWdpc3RlciBCTl9VTE9ORyBoLCBsLCBzOworCUJOX1VMT05HIHRhYls4XSwgdG9wMmIgPSBhID4+IDMwOyAKKwlyZWdpc3RlciBCTl9VTE9ORyBhMSwgYTIsIGE0OworCisJYTEgPSBhICYgKDB4M0ZGRkZGRkYpOyBhMiA9IGExIDw8IDE7IGE0ID0gYTIgPDwgMTsKKworCXRhYlswXSA9ICAwOyB0YWJbMV0gPSBhMTsgICAgdGFiWzJdID0gYTI7ICAgIHRhYlszXSA9IGExXmEyOworCXRhYls0XSA9IGE0OyB0YWJbNV0gPSBhMV5hNDsgdGFiWzZdID0gYTJeYTQ7IHRhYls3XSA9IGExXmEyXmE0OworCisJcyA9IHRhYltiICAgICAgICYgMHg3XTsgbCAgPSBzOworCXMgPSB0YWJbYiA+PiAgMyAmIDB4N107IGwgXj0gcyA8PCAgMzsgaCAgPSBzID4+IDI5OworCXMgPSB0YWJbYiA+PiAgNiAmIDB4N107IGwgXj0gcyA8PCAgNjsgaCBePSBzID4+IDI2OworCXMgPSB0YWJbYiA+PiAgOSAmIDB4N107IGwgXj0gcyA8PCAgOTsgaCBePSBzID4+IDIzOworCXMgPSB0YWJbYiA+PiAxMiAmIDB4N107IGwgXj0gcyA8PCAxMjsgaCBePSBzID4+IDIwOworCXMgPSB0YWJbYiA+PiAxNSAmIDB4N107IGwgXj0gcyA8PCAxNTsgaCBePSBzID4+IDE3OworCXMgPSB0YWJbYiA+PiAxOCAmIDB4N107IGwgXj0gcyA8PCAxODsgaCBePSBzID4+IDE0OworCXMgPSB0YWJbYiA+PiAyMSAmIDB4N107IGwgXj0gcyA8PCAyMTsgaCBePSBzID4+IDExOworCXMgPSB0YWJbYiA+PiAyNCAmIDB4N107IGwgXj0gcyA8PCAyNDsgaCBePSBzID4+ICA4OworCXMgPSB0YWJbYiA+PiAyNyAmIDB4N107IGwgXj0gcyA8PCAyNzsgaCBePSBzID4+ICA1OworCXMgPSB0YWJbYiA+PiAzMCAgICAgIF07IGwgXj0gcyA8PCAzMDsgaCBePSBzID4+ICAyOworCisJLyogY29tcGVuc2F0ZSBmb3IgdGhlIHRvcCB0d28gYml0cyBvZiBhICovCisKKwlpZiAodG9wMmIgJiAwMSkgeyBsIF49IGIgPDwgMzA7IGggXj0gYiA+PiAyOyB9IAorCWlmICh0b3AyYiAmIDAyKSB7IGwgXj0gYiA8PCAzMTsgaCBePSBiID4+IDE7IH0gCisKKwkqcjEgPSBoOyAqcjAgPSBsOworCX0gCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUKSB8fCBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUX0xPTkcpCitzdGF0aWMgdm9pZCBibl9HRjJtX211bF8xeDEoQk5fVUxPTkcgKnIxLCBCTl9VTE9ORyAqcjAsIGNvbnN0IEJOX1VMT05HIGEsIGNvbnN0IEJOX1VMT05HIGIpCisJeworCXJlZ2lzdGVyIEJOX1VMT05HIGgsIGwsIHM7CisJQk5fVUxPTkcgdGFiWzE2XSwgdG9wM2IgPSBhID4+IDYxOworCXJlZ2lzdGVyIEJOX1VMT05HIGExLCBhMiwgYTQsIGE4OworCisJYTEgPSBhICYgKDB4MUZGRkZGRkZGRkZGRkZGRlVMTCk7IGEyID0gYTEgPDwgMTsgYTQgPSBhMiA8PCAxOyBhOCA9IGE0IDw8IDE7CisKKwl0YWJbIDBdID0gMDsgICAgIHRhYlsgMV0gPSBhMTsgICAgICAgdGFiWyAyXSA9IGEyOyAgICAgICB0YWJbIDNdID0gYTFeYTI7CisJdGFiWyA0XSA9IGE0OyAgICB0YWJbIDVdID0gYTFeYTQ7ICAgIHRhYlsgNl0gPSBhMl5hNDsgICAgdGFiWyA3XSA9IGExXmEyXmE0OworCXRhYlsgOF0gPSBhODsgICAgdGFiWyA5XSA9IGExXmE4OyAgICB0YWJbMTBdID0gYTJeYTg7ICAgIHRhYlsxMV0gPSBhMV5hMl5hODsKKwl0YWJbMTJdID0gYTReYTg7IHRhYlsxM10gPSBhMV5hNF5hODsgdGFiWzE0XSA9IGEyXmE0XmE4OyB0YWJbMTVdID0gYTFeYTJeYTReYTg7CisKKwlzID0gdGFiW2IgICAgICAgJiAweEZdOyBsICA9IHM7CisJcyA9IHRhYltiID4+ICA0ICYgMHhGXTsgbCBePSBzIDw8ICA0OyBoICA9IHMgPj4gNjA7CisJcyA9IHRhYltiID4+ICA4ICYgMHhGXTsgbCBePSBzIDw8ICA4OyBoIF49IHMgPj4gNTY7CisJcyA9IHRhYltiID4+IDEyICYgMHhGXTsgbCBePSBzIDw8IDEyOyBoIF49IHMgPj4gNTI7CisJcyA9IHRhYltiID4+IDE2ICYgMHhGXTsgbCBePSBzIDw8IDE2OyBoIF49IHMgPj4gNDg7CisJcyA9IHRhYltiID4+IDIwICYgMHhGXTsgbCBePSBzIDw8IDIwOyBoIF49IHMgPj4gNDQ7CisJcyA9IHRhYltiID4+IDI0ICYgMHhGXTsgbCBePSBzIDw8IDI0OyBoIF49IHMgPj4gNDA7CisJcyA9IHRhYltiID4+IDI4ICYgMHhGXTsgbCBePSBzIDw8IDI4OyBoIF49IHMgPj4gMzY7CisJcyA9IHRhYltiID4+IDMyICYgMHhGXTsgbCBePSBzIDw8IDMyOyBoIF49IHMgPj4gMzI7CisJcyA9IHRhYltiID4+IDM2ICYgMHhGXTsgbCBePSBzIDw8IDM2OyBoIF49IHMgPj4gMjg7CisJcyA9IHRhYltiID4+IDQwICYgMHhGXTsgbCBePSBzIDw8IDQwOyBoIF49IHMgPj4gMjQ7CisJcyA9IHRhYltiID4+IDQ0ICYgMHhGXTsgbCBePSBzIDw8IDQ0OyBoIF49IHMgPj4gMjA7CisJcyA9IHRhYltiID4+IDQ4ICYgMHhGXTsgbCBePSBzIDw8IDQ4OyBoIF49IHMgPj4gMTY7CisJcyA9IHRhYltiID4+IDUyICYgMHhGXTsgbCBePSBzIDw8IDUyOyBoIF49IHMgPj4gMTI7CisJcyA9IHRhYltiID4+IDU2ICYgMHhGXTsgbCBePSBzIDw8IDU2OyBoIF49IHMgPj4gIDg7CisJcyA9IHRhYltiID4+IDYwICAgICAgXTsgbCBePSBzIDw8IDYwOyBoIF49IHMgPj4gIDQ7CisKKwkvKiBjb21wZW5zYXRlIGZvciB0aGUgdG9wIHRocmVlIGJpdHMgb2YgYSAqLworCisJaWYgKHRvcDNiICYgMDEpIHsgbCBePSBiIDw8IDYxOyBoIF49IGIgPj4gMzsgfSAKKwlpZiAodG9wM2IgJiAwMikgeyBsIF49IGIgPDwgNjI7IGggXj0gYiA+PiAyOyB9IAorCWlmICh0b3AzYiAmIDA0KSB7IGwgXj0gYiA8PCA2MzsgaCBePSBiID4+IDE7IH0gCisKKwkqcjEgPSBoOyAqcjAgPSBsOworCX0gCisjZW5kaWYKKworLyogUHJvZHVjdCBvZiB0d28gcG9seW5vbWlhbHMgYSwgYiBlYWNoIHdpdGggZGVncmVlIDwgMiAqIEJOX0JJVFMyIC0gMSwKKyAqIHJlc3VsdCBpcyBhIHBvbHlub21pYWwgciB3aXRoIGRlZ3JlZSA8IDQgKiBCTl9CSVRTMiAtIDEKKyAqIFRoZSBjYWxsZXIgTVVTVCBlbnN1cmUgdGhhdCB0aGUgdmFyaWFibGVzIGhhdmUgdGhlIHJpZ2h0IGFtb3VudAorICogb2Ygc3BhY2UgYWxsb2NhdGVkLgorICovCitzdGF0aWMgdm9pZCBibl9HRjJtX211bF8yeDIoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HIGExLCBjb25zdCBCTl9VTE9ORyBhMCwgY29uc3QgQk5fVUxPTkcgYjEsIGNvbnN0IEJOX1VMT05HIGIwKQorCXsKKwlCTl9VTE9ORyBtMSwgbTA7CisJLyogclszXSA9IGgxLCByWzJdID0gaDA7IHJbMV0gPSBsMTsgclswXSA9IGwwICovCisJYm5fR0YybV9tdWxfMXgxKHIrMywgcisyLCBhMSwgYjEpOworCWJuX0dGMm1fbXVsXzF4MShyKzEsIHIsIGEwLCBiMCk7CisJYm5fR0YybV9tdWxfMXgxKCZtMSwgJm0wLCBhMCBeIGExLCBiMCBeIGIxKTsKKwkvKiBDb3JyZWN0aW9uIG9uIG0xIF49IGwxIF4gaDE7IG0wIF49IGwwIF4gaDA7ICovCisJclsyXSBePSBtMSBeIHJbMV0gXiByWzNdOyAgLyogaDAgXj0gbTEgXiBsMSBeIGgxOyAqLworCXJbMV0gPSByWzNdIF4gclsyXSBeIHJbMF0gXiBtMSBeIG0wOyAgLyogbDEgXj0gbDAgXiBoMCBeIG0wOyAqLworCX0KKworCisvKiBBZGQgcG9seW5vbWlhbHMgYSBhbmQgYiBhbmQgc3RvcmUgcmVzdWx0IGluIHI7IHIgY291bGQgYmUgYSBvciBiLCBhIGFuZCBiIAorICogY291bGQgYmUgZXF1YWw7IHIgaXMgdGhlIGJpdHdpc2UgWE9SIG9mIGEgYW5kIGIuCisgKi8KK2ludAlCTl9HRjJtX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKQorCXsKKwlpbnQgaTsKKwljb25zdCBCSUdOVU0gKmF0LCAqYnQ7CisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKGIpOworCisJaWYgKGEtPnRvcCA8IGItPnRvcCkgeyBhdCA9IGI7IGJ0ID0gYTsgfQorCWVsc2UgeyBhdCA9IGE7IGJ0ID0gYjsgfQorCisJaWYoYm5fd2V4cGFuZChyLCBhdC0+dG9wKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBidC0+dG9wOyBpKyspCisJCXsKKwkJci0+ZFtpXSA9IGF0LT5kW2ldIF4gYnQtPmRbaV07CisJCX0KKwlmb3IgKDsgaSA8IGF0LT50b3A7IGkrKykKKwkJeworCQlyLT5kW2ldID0gYXQtPmRbaV07CisJCX0KKwkKKwlyLT50b3AgPSBhdC0+dG9wOworCWJuX2NvcnJlY3RfdG9wKHIpOworCQorCXJldHVybiAxOworCX0KKworCisvKiBTb21lIGZ1bmN0aW9ucyBhbGxvdyBmb3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlycmVkdWNpYmxlIHBvbHlub21pYWxzCisgKiBhcyBhbiBpbnRbXSwgc2F5IHAuICBUaGUgaXJyZWR1Y2libGUgZih0KSBpcyB0aGVuIG9mIHRoZSBmb3JtOgorICogICAgIHRecFswXSArIHRecFsxXSArIC4uLiArIHRecFtrXQorICogd2hlcmUgbSA9IHBbMF0gPiBwWzFdID4gLi4uID4gcFtrXSA9IDAuCisgKi8KKworCisvKiBQZXJmb3JtcyBtb2R1bGFyIHJlZHVjdGlvbiBvZiBhIGFuZCBzdG9yZSByZXN1bHQgaW4gci4gIHIgY291bGQgYmUgYS4gKi8KK2ludCBCTl9HRjJtX21vZF9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IGludCBwW10pCisJeworCWludCBqLCBrOworCWludCBuLCBkTiwgZDAsIGQxOworCUJOX1VMT05HIHp6LCAqejsKKworCWJuX2NoZWNrX3RvcChhKTsKKworCWlmICghcFswXSkKKwkJeworCQkvKiByZWR1Y3Rpb24gbW9kIDEgPT4gcmV0dXJuIDAgKi8KKwkJQk5femVybyhyKTsKKwkJcmV0dXJuIDE7CisJCX0KKworCS8qIFNpbmNlIHRoZSBhbGdvcml0aG0gZG9lcyByZWR1Y3Rpb24gaW4gdGhlIHIgdmFsdWUsIGlmIGEgIT0gciwgY29weQorCSAqIHRoZSBjb250ZW50cyBvZiBhIGludG8gciBzbyB3ZSBjYW4gZG8gcmVkdWN0aW9uIGluIHIuIAorCSAqLworCWlmIChhICE9IHIpCisJCXsKKwkJaWYgKCFibl93ZXhwYW5kKHIsIGEtPnRvcCkpIHJldHVybiAwOworCQlmb3IgKGogPSAwOyBqIDwgYS0+dG9wOyBqKyspCisJCQl7CisJCQlyLT5kW2pdID0gYS0+ZFtqXTsKKwkJCX0KKwkJci0+dG9wID0gYS0+dG9wOworCQl9CisJeiA9IHItPmQ7CisKKwkvKiBzdGFydCByZWR1Y3Rpb24gKi8KKwlkTiA9IHBbMF0gLyBCTl9CSVRTMjsgIAorCWZvciAoaiA9IHItPnRvcCAtIDE7IGogPiBkTjspCisJCXsKKwkJenogPSB6W2pdOworCQlpZiAoeltqXSA9PSAwKSB7IGotLTsgY29udGludWU7IH0KKwkJeltqXSA9IDA7CisKKwkJZm9yIChrID0gMTsgcFtrXSAhPSAwOyBrKyspCisJCQl7CisJCQkvKiByZWR1Y2luZyBjb21wb25lbnQgdF5wW2tdICovCisJCQluID0gcFswXSAtIHBba107CisJCQlkMCA9IG4gJSBCTl9CSVRTMjsgIGQxID0gQk5fQklUUzIgLSBkMDsKKwkJCW4gLz0gQk5fQklUUzI7IAorCQkJeltqLW5dIF49ICh6ej4+ZDApOworCQkJaWYgKGQwKSB6W2otbi0xXSBePSAoeno8PGQxKTsKKwkJCX0KKworCQkvKiByZWR1Y2luZyBjb21wb25lbnQgdF4wICovCisJCW4gPSBkTjsgIAorCQlkMCA9IHBbMF0gJSBCTl9CSVRTMjsKKwkJZDEgPSBCTl9CSVRTMiAtIGQwOworCQl6W2otbl0gXj0gKHp6ID4+IGQwKTsKKwkJaWYgKGQwKSB6W2otbi0xXSBePSAoenogPDwgZDEpOworCQl9CisKKwkvKiBmaW5hbCByb3VuZCBvZiByZWR1Y3Rpb24gKi8KKwl3aGlsZSAoaiA9PSBkTikKKwkJeworCisJCWQwID0gcFswXSAlIEJOX0JJVFMyOworCQl6eiA9IHpbZE5dID4+IGQwOworCQlpZiAoenogPT0gMCkgYnJlYWs7CisJCWQxID0gQk5fQklUUzIgLSBkMDsKKwkJCisJCS8qIGNsZWFyIHVwIHRoZSB0b3AgZDEgYml0cyAqLworCQlpZiAoZDApCisJCQl6W2ROXSA9ICh6W2ROXSA8PCBkMSkgPj4gZDE7CisJCWVsc2UKKwkJCXpbZE5dID0gMDsKKwkJelswXSBePSB6ejsgLyogcmVkdWN0aW9uIHReMCBjb21wb25lbnQgKi8KKworCQlmb3IgKGsgPSAxOyBwW2tdICE9IDA7IGsrKykKKwkJCXsKKwkJCUJOX1VMT05HIHRtcF91bG9uZzsKKworCQkJLyogcmVkdWNpbmcgY29tcG9uZW50IHRecFtrXSovCisJCQluID0gcFtrXSAvIEJOX0JJVFMyOyAgIAorCQkJZDAgPSBwW2tdICUgQk5fQklUUzI7CisJCQlkMSA9IEJOX0JJVFMyIC0gZDA7CisJCQl6W25dIF49ICh6eiA8PCBkMCk7CisJCQl0bXBfdWxvbmcgPSB6eiA+PiBkMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkMCAmJiB0bXBfdWxvbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpbbisxXSBePSB0bXBfdWxvbmc7CisJCQl9CisKKwkJCisJCX0KKworCWJuX2NvcnJlY3RfdG9wKHIpOworCXJldHVybiAxOworCX0KKworLyogUGVyZm9ybXMgbW9kdWxhciByZWR1Y3Rpb24gb2YgYSBieSBwIGFuZCBzdG9yZSByZXN1bHQgaW4gci4gIHIgY291bGQgYmUgYS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGRvd24gdG8gdGhlIEJOX0dGMm1fbW9kX2FyciBpbXBsZW1lbnRhdGlvbjsgdGhpcyB3cmFwcGVyCisgKiBmdW5jdGlvbiBpcyBvbmx5IHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZTsgZm9yIGJlc3QgcGVyZm9ybWFuY2UsIHVzZSB0aGUgCisgKiBCTl9HRjJtX21vZF9hcnIgZnVuY3Rpb24uCisgKi8KK2ludAlCTl9HRjJtX21vZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwKQorCXsKKwlpbnQgcmV0ID0gMDsKKwljb25zdCBpbnQgbWF4ID0gQk5fbnVtX2JpdHMocCkgKyAxOworCWludCAqYXJyPU5VTEw7CisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChwKTsKKwlpZiAoKGFyciA9IChpbnQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoaW50KSAqIG1heCkpID09IE5VTEwpIGdvdG8gZXJyOworCXJldCA9IEJOX0dGMm1fcG9seTJhcnIocCwgYXJyLCBtYXgpOworCWlmICghcmV0IHx8IHJldCA+IG1heCkKKwkJeworCQlCTmVycihCTl9GX0JOX0dGMk1fTU9ELEJOX1JfSU5WQUxJRF9MRU5HVEgpOworCQlnb3RvIGVycjsKKwkJfQorCXJldCA9IEJOX0dGMm1fbW9kX2FycihyLCBhLCBhcnIpOworCWJuX2NoZWNrX3RvcChyKTsKK2VycjoKKwlpZiAoYXJyKSBPUEVOU1NMX2ZyZWUoYXJyKTsKKwlyZXR1cm4gcmV0OworCX0KKworCisvKiBDb21wdXRlIHRoZSBwcm9kdWN0IG9mIHR3byBwb2x5bm9taWFscyBhIGFuZCBiLCByZWR1Y2UgbW9kdWxvIHAsIGFuZCBzdG9yZQorICogdGhlIHJlc3VsdCBpbiByLiAgciBjb3VsZCBiZSBhIG9yIGI7IGEgY291bGQgYmUgYi4KKyAqLworaW50CUJOX0dGMm1fbW9kX211bF9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgY29uc3QgaW50IHBbXSwgQk5fQ1RYICpjdHgpCisJeworCWludCB6bGVuLCBpLCBqLCBrLCByZXQgPSAwOworCUJJR05VTSAqczsKKwlCTl9VTE9ORyB4MSwgeDAsIHkxLCB5MCwgenpbNF07CisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKGIpOworCisJaWYgKGEgPT0gYikKKwkJeworCQlyZXR1cm4gQk5fR0YybV9tb2Rfc3FyX2FycihyLCBhLCBwLCBjdHgpOworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlpZiAoKHMgPSBCTl9DVFhfZ2V0KGN0eCkpID09IE5VTEwpIGdvdG8gZXJyOworCQorCXpsZW4gPSBhLT50b3AgKyBiLT50b3AgKyA0OworCWlmICghYm5fd2V4cGFuZChzLCB6bGVuKSkgZ290byBlcnI7CisJcy0+dG9wID0gemxlbjsKKworCWZvciAoaSA9IDA7IGkgPCB6bGVuOyBpKyspIHMtPmRbaV0gPSAwOworCisJZm9yIChqID0gMDsgaiA8IGItPnRvcDsgaiArPSAyKQorCQl7CisJCXkwID0gYi0+ZFtqXTsKKwkJeTEgPSAoKGorMSkgPT0gYi0+dG9wKSA/IDAgOiBiLT5kW2orMV07CisJCWZvciAoaSA9IDA7IGkgPCBhLT50b3A7IGkgKz0gMikKKwkJCXsKKwkJCXgwID0gYS0+ZFtpXTsKKwkJCXgxID0gKChpKzEpID09IGEtPnRvcCkgPyAwIDogYS0+ZFtpKzFdOworCQkJYm5fR0YybV9tdWxfMngyKHp6LCB4MSwgeDAsIHkxLCB5MCk7CisJCQlmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSBzLT5kW2kraitrXSBePSB6eltrXTsKKwkJCX0KKwkJfQorCisJYm5fY29ycmVjdF90b3Aocyk7CisJaWYgKEJOX0dGMm1fbW9kX2FycihyLCBzLCBwKSkKKwkJcmV0ID0gMTsKKwlibl9jaGVja190b3Aocik7CisKK2VycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIENvbXB1dGUgdGhlIHByb2R1Y3Qgb2YgdHdvIHBvbHlub21pYWxzIGEgYW5kIGIsIHJlZHVjZSBtb2R1bG8gcCwgYW5kIHN0b3JlCisgKiB0aGUgcmVzdWx0IGluIHIuICByIGNvdWxkIGJlIGEgb3IgYjsgYSBjb3VsZCBlcXVhbCBiLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgZG93biB0byB0aGUgQk5fR0YybV9tb2RfbXVsX2FyciBpbXBsZW1lbnRhdGlvbjsgdGhpcyB3cmFwcGVyCisgKiBmdW5jdGlvbiBpcyBvbmx5IHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZTsgZm9yIGJlc3QgcGVyZm9ybWFuY2UsIHVzZSB0aGUgCisgKiBCTl9HRjJtX21vZF9tdWxfYXJyIGZ1bmN0aW9uLgorICovCitpbnQJQk5fR0YybV9tb2RfbXVsKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQgPSAwOworCWNvbnN0IGludCBtYXggPSBCTl9udW1fYml0cyhwKSArIDE7CisJaW50ICphcnI9TlVMTDsKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKGIpOworCWJuX2NoZWNrX3RvcChwKTsKKwlpZiAoKGFyciA9IChpbnQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoaW50KSAqIG1heCkpID09IE5VTEwpIGdvdG8gZXJyOworCXJldCA9IEJOX0dGMm1fcG9seTJhcnIocCwgYXJyLCBtYXgpOworCWlmICghcmV0IHx8IHJldCA+IG1heCkKKwkJeworCQlCTmVycihCTl9GX0JOX0dGMk1fTU9EX01VTCxCTl9SX0lOVkFMSURfTEVOR1RIKTsKKwkJZ290byBlcnI7CisJCX0KKwlyZXQgPSBCTl9HRjJtX21vZF9tdWxfYXJyKHIsIGEsIGIsIGFyciwgY3R4KTsKKwlibl9jaGVja190b3Aocik7CitlcnI6CisJaWYgKGFycikgT1BFTlNTTF9mcmVlKGFycik7CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogU3F1YXJlIGEsIHJlZHVjZSB0aGUgcmVzdWx0IG1vZCBwLCBhbmQgc3RvcmUgaXQgaW4gYS4gIHIgY291bGQgYmUgYS4gKi8KK2ludAlCTl9HRjJtX21vZF9zcXJfYXJyKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBpbnQgcFtdLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IGksIHJldCA9IDA7CisJQklHTlVNICpzOworCisJYm5fY2hlY2tfdG9wKGEpOworCUJOX0NUWF9zdGFydChjdHgpOworCWlmICgocyA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgcmV0dXJuIDA7CisJaWYgKCFibl93ZXhwYW5kKHMsIDIgKiBhLT50b3ApKSBnb3RvIGVycjsKKworCWZvciAoaSA9IGEtPnRvcCAtIDE7IGkgPj0gMDsgaS0tKQorCQl7CisJCXMtPmRbMippKzFdID0gU1FSMShhLT5kW2ldKTsKKwkJcy0+ZFsyKmkgIF0gPSBTUVIwKGEtPmRbaV0pOworCQl9CisKKwlzLT50b3AgPSAyICogYS0+dG9wOworCWJuX2NvcnJlY3RfdG9wKHMpOworCWlmICghQk5fR0YybV9tb2RfYXJyKHIsIHMsIHApKSBnb3RvIGVycjsKKwlibl9jaGVja190b3Aocik7CisJcmV0ID0gMTsKK2VycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIFNxdWFyZSBhLCByZWR1Y2UgdGhlIHJlc3VsdCBtb2QgcCwgYW5kIHN0b3JlIGl0IGluIGEuICByIGNvdWxkIGJlIGEuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxscyBkb3duIHRvIHRoZSBCTl9HRjJtX21vZF9zcXJfYXJyIGltcGxlbWVudGF0aW9uOyB0aGlzIHdyYXBwZXIKKyAqIGZ1bmN0aW9uIGlzIG9ubHkgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlOyBmb3IgYmVzdCBwZXJmb3JtYW5jZSwgdXNlIHRoZSAKKyAqIEJOX0dGMm1fbW9kX3Nxcl9hcnIgZnVuY3Rpb24uCisgKi8KK2ludAlCTl9HRjJtX21vZF9zcXIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQgPSAwOworCWNvbnN0IGludCBtYXggPSBCTl9udW1fYml0cyhwKSArIDE7CisJaW50ICphcnI9TlVMTDsKKworCWJuX2NoZWNrX3RvcChhKTsKKwlibl9jaGVja190b3AocCk7CisJaWYgKChhcnIgPSAoaW50ICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKGludCkgKiBtYXgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlyZXQgPSBCTl9HRjJtX3BvbHkyYXJyKHAsIGFyciwgbWF4KTsKKwlpZiAoIXJldCB8fCByZXQgPiBtYXgpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9HRjJNX01PRF9TUVIsQk5fUl9JTlZBTElEX0xFTkdUSCk7CisJCWdvdG8gZXJyOworCQl9CisJcmV0ID0gQk5fR0YybV9tb2Rfc3FyX2FycihyLCBhLCBhcnIsIGN0eCk7CisJYm5fY2hlY2tfdG9wKHIpOworZXJyOgorCWlmIChhcnIpIE9QRU5TU0xfZnJlZShhcnIpOworCXJldHVybiByZXQ7CisJfQorCisKKy8qIEludmVydCBhLCByZWR1Y2UgbW9kdWxvIHAsIGFuZCBzdG9yZSB0aGUgcmVzdWx0IGluIHIuIHIgY291bGQgYmUgYS4gCisgKiBVc2VzIE1vZGlmaWVkIEFsbW9zdCBJbnZlcnNlIEFsZ29yaXRobSAoQWxnb3JpdGhtIDEwKSBmcm9tCisgKiAgICAgSGFua2Vyc29uLCBELiwgSGVybmFuZGV6LCBKLkwuLCBhbmQgTWVuZXplcywgQS4gICJTb2Z0d2FyZSBJbXBsZW1lbnRhdGlvbgorICogICAgIG9mIEVsbGlwdGljIEN1cnZlIENyeXB0b2dyYXBoeSBPdmVyIEJpbmFyeSBGaWVsZHMiLgorICovCitpbnQgQk5fR0YybV9tb2RfaW52KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmIsICpjLCAqdSwgKnYsICp0bXA7CisJaW50IHJldCA9IDA7CisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKHApOworCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJCisJYiA9IEJOX0NUWF9nZXQoY3R4KTsKKwljID0gQk5fQ1RYX2dldChjdHgpOworCXUgPSBCTl9DVFhfZ2V0KGN0eCk7CisJdiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAodiA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICghQk5fb25lKGIpKSBnb3RvIGVycjsKKwlpZiAoIUJOX0dGMm1fbW9kKHUsIGEsIHApKSBnb3RvIGVycjsKKwlpZiAoIUJOX2NvcHkodiwgcCkpIGdvdG8gZXJyOworCisJaWYgKEJOX2lzX3plcm8odSkpIGdvdG8gZXJyOworCisJd2hpbGUgKDEpCisJCXsKKwkJd2hpbGUgKCFCTl9pc19vZGQodSkpCisJCQl7CisJCQlpZiAoIUJOX3JzaGlmdDEodSwgdSkpIGdvdG8gZXJyOworCQkJaWYgKEJOX2lzX29kZChiKSkKKwkJCQl7CisJCQkJaWYgKCFCTl9HRjJtX2FkZChiLCBiLCBwKSkgZ290byBlcnI7CisJCQkJfQorCQkJaWYgKCFCTl9yc2hpZnQxKGIsIGIpKSBnb3RvIGVycjsKKwkJCX0KKworCQlpZiAoQk5fYWJzX2lzX3dvcmQodSwgMSkpIGJyZWFrOworCisJCWlmIChCTl9udW1fYml0cyh1KSA8IEJOX251bV9iaXRzKHYpKQorCQkJeworCQkJdG1wID0gdTsgdSA9IHY7IHYgPSB0bXA7CisJCQl0bXAgPSBiOyBiID0gYzsgYyA9IHRtcDsKKwkJCX0KKwkJCisJCWlmICghQk5fR0YybV9hZGQodSwgdSwgdikpIGdvdG8gZXJyOworCQlpZiAoIUJOX0dGMm1fYWRkKGIsIGIsIGMpKSBnb3RvIGVycjsKKwkJfQorCisKKwlpZiAoIUJOX2NvcHkociwgYikpIGdvdG8gZXJyOworCWJuX2NoZWNrX3RvcChyKTsKKwlyZXQgPSAxOworCitlcnI6CisgIAlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIEludmVydCB4eCwgcmVkdWNlIG1vZHVsbyBwLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiByLiByIGNvdWxkIGJlIHh4LiAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGRvd24gdG8gdGhlIEJOX0dGMm1fbW9kX2ludiBpbXBsZW1lbnRhdGlvbjsgdGhpcyB3cmFwcGVyCisgKiBmdW5jdGlvbiBpcyBvbmx5IHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZTsgZm9yIGJlc3QgcGVyZm9ybWFuY2UsIHVzZSB0aGUgCisgKiBCTl9HRjJtX21vZF9pbnYgZnVuY3Rpb24uCisgKi8KK2ludCBCTl9HRjJtX21vZF9pbnZfYXJyKEJJR05VTSAqciwgY29uc3QgQklHTlVNICp4eCwgY29uc3QgaW50IHBbXSwgQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqZmllbGQ7CisJaW50IHJldCA9IDA7CisKKwlibl9jaGVja190b3AoeHgpOworCUJOX0NUWF9zdGFydChjdHgpOworCWlmICgoZmllbGQgPSBCTl9DVFhfZ2V0KGN0eCkpID09IE5VTEwpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9hcnIycG9seShwLCBmaWVsZCkpIGdvdG8gZXJyOworCQorCXJldCA9IEJOX0dGMm1fbW9kX2ludihyLCB4eCwgZmllbGQsIGN0eCk7CisJYm5fY2hlY2tfdG9wKHIpOworCitlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybiByZXQ7CisJfQorCisKKyNpZm5kZWYgT1BFTlNTTF9TVU5fR0YyTV9ESVYKKy8qIERpdmlkZSB5IGJ5IHgsIHJlZHVjZSBtb2R1bG8gcCwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4gci4gciBjb3VsZCBiZSB4IAorICogb3IgeSwgeCBjb3VsZCBlcXVhbCB5LgorICovCitpbnQgQk5fR0YybV9tb2RfZGl2KEJJR05VTSAqciwgY29uc3QgQklHTlVNICp5LCBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqeGludiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlibl9jaGVja190b3AoeSk7CisJYm5fY2hlY2tfdG9wKHgpOworCWJuX2NoZWNrX3RvcChwKTsKKworCUJOX0NUWF9zdGFydChjdHgpOworCXhpbnYgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHhpbnYgPT0gTlVMTCkgZ290byBlcnI7CisJCisJaWYgKCFCTl9HRjJtX21vZF9pbnYoeGludiwgeCwgcCwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9HRjJtX21vZF9tdWwociwgeSwgeGludiwgcCwgY3R4KSkgZ290byBlcnI7CisJYm5fY2hlY2tfdG9wKHIpOworCXJldCA9IDE7CisKK2VycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuIHJldDsKKwl9CisjZWxzZQorLyogRGl2aWRlIHkgYnkgeCwgcmVkdWNlIG1vZHVsbyBwLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiByLiByIGNvdWxkIGJlIHggCisgKiBvciB5LCB4IGNvdWxkIGVxdWFsIHkuCisgKiBVc2VzIGFsZ29yaXRobSBNb2R1bGFyX0RpdmlzaW9uX0dGKDJebSkgZnJvbSAKKyAqICAgICBDaGFuZy1TaGFudHosIFMuICAiRnJvbSBFdWNsaWQncyBHQ0QgdG8gTW9udGdvbWVyeSBNdWx0aXBsaWNhdGlvbiB0byAKKyAqICAgICB0aGUgR3JlYXQgRGl2aWRlIi4KKyAqLworaW50IEJOX0dGMm1fbW9kX2RpdihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqeSwgY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmEsICpiLCAqdSwgKnY7CisJaW50IHJldCA9IDA7CisKKwlibl9jaGVja190b3AoeSk7CisJYm5fY2hlY2tfdG9wKHgpOworCWJuX2NoZWNrX3RvcChwKTsKKworCUJOX0NUWF9zdGFydChjdHgpOworCQorCWEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJYiA9IEJOX0NUWF9nZXQoY3R4KTsKKwl1ID0gQk5fQ1RYX2dldChjdHgpOworCXYgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHYgPT0gTlVMTCkgZ290byBlcnI7CisKKwkvKiByZWR1Y2UgeCBhbmQgeSBtb2QgcCAqLworCWlmICghQk5fR0YybV9tb2QodSwgeSwgcCkpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9tb2QoYSwgeCwgcCkpIGdvdG8gZXJyOworCWlmICghQk5fY29weShiLCBwKSkgZ290byBlcnI7CisJCisJd2hpbGUgKCFCTl9pc19vZGQoYSkpCisJCXsKKwkJaWYgKCFCTl9yc2hpZnQxKGEsIGEpKSBnb3RvIGVycjsKKwkJaWYgKEJOX2lzX29kZCh1KSkgaWYgKCFCTl9HRjJtX2FkZCh1LCB1LCBwKSkgZ290byBlcnI7CisJCWlmICghQk5fcnNoaWZ0MSh1LCB1KSkgZ290byBlcnI7CisJCX0KKworCWRvCisJCXsKKwkJaWYgKEJOX0dGMm1fY21wKGIsIGEpID4gMCkKKwkJCXsKKwkJCWlmICghQk5fR0YybV9hZGQoYiwgYiwgYSkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9HRjJtX2FkZCh2LCB2LCB1KSkgZ290byBlcnI7CisJCQlkbworCQkJCXsKKwkJCQlpZiAoIUJOX3JzaGlmdDEoYiwgYikpIGdvdG8gZXJyOworCQkJCWlmIChCTl9pc19vZGQodikpIGlmICghQk5fR0YybV9hZGQodiwgdiwgcCkpIGdvdG8gZXJyOworCQkJCWlmICghQk5fcnNoaWZ0MSh2LCB2KSkgZ290byBlcnI7CisJCQkJfSB3aGlsZSAoIUJOX2lzX29kZChiKSk7CisJCQl9CisJCWVsc2UgaWYgKEJOX2Fic19pc193b3JkKGEsIDEpKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCXsKKwkJCWlmICghQk5fR0YybV9hZGQoYSwgYSwgYikpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9HRjJtX2FkZCh1LCB1LCB2KSkgZ290byBlcnI7CisJCQlkbworCQkJCXsKKwkJCQlpZiAoIUJOX3JzaGlmdDEoYSwgYSkpIGdvdG8gZXJyOworCQkJCWlmIChCTl9pc19vZGQodSkpIGlmICghQk5fR0YybV9hZGQodSwgdSwgcCkpIGdvdG8gZXJyOworCQkJCWlmICghQk5fcnNoaWZ0MSh1LCB1KSkgZ290byBlcnI7CisJCQkJfSB3aGlsZSAoIUJOX2lzX29kZChhKSk7CisJCQl9CisJCX0gd2hpbGUgKDEpOworCisJaWYgKCFCTl9jb3B5KHIsIHUpKSBnb3RvIGVycjsKKwlibl9jaGVja190b3Aocik7CisJcmV0ID0gMTsKKworZXJyOgorICAJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKKy8qIERpdmlkZSB5eSBieSB4eCwgcmVkdWNlIG1vZHVsbyBwLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiByLiByIGNvdWxkIGJlIHh4IAorICogb3IgeXksIHh4IGNvdWxkIGVxdWFsIHl5LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgZG93biB0byB0aGUgQk5fR0YybV9tb2RfZGl2IGltcGxlbWVudGF0aW9uOyB0aGlzIHdyYXBwZXIKKyAqIGZ1bmN0aW9uIGlzIG9ubHkgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlOyBmb3IgYmVzdCBwZXJmb3JtYW5jZSwgdXNlIHRoZSAKKyAqIEJOX0dGMm1fbW9kX2RpdiBmdW5jdGlvbi4KKyAqLworaW50IEJOX0dGMm1fbW9kX2Rpdl9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKnl5LCBjb25zdCBCSUdOVU0gKnh4LCBjb25zdCBpbnQgcFtdLCBCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNICpmaWVsZDsKKwlpbnQgcmV0ID0gMDsKKworCWJuX2NoZWNrX3RvcCh5eSk7CisJYm5fY2hlY2tfdG9wKHh4KTsKKworCUJOX0NUWF9zdGFydChjdHgpOworCWlmICgoZmllbGQgPSBCTl9DVFhfZ2V0KGN0eCkpID09IE5VTEwpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9hcnIycG9seShwLCBmaWVsZCkpIGdvdG8gZXJyOworCQorCXJldCA9IEJOX0dGMm1fbW9kX2RpdihyLCB5eSwgeHgsIGZpZWxkLCBjdHgpOworCWJuX2NoZWNrX3RvcChyKTsKKworZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworCisvKiBDb21wdXRlIHRoZSBidGggcG93ZXIgb2YgYSwgcmVkdWNlIG1vZHVsbyBwLCBhbmQgc3RvcmUKKyAqIHRoZSByZXN1bHQgaW4gci4gIHIgY291bGQgYmUgYS4KKyAqIFVzZXMgc2ltcGxlIHNxdWFyZS1hbmQtbXVsdGlwbHkgYWxnb3JpdGhtIEEuNS4xIGZyb20gSUVFRSBQMTM2My4KKyAqLworaW50CUJOX0dGMm1fbW9kX2V4cF9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgY29uc3QgaW50IHBbXSwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQgPSAwLCBpLCBuOworCUJJR05VTSAqdTsKKworCWJuX2NoZWNrX3RvcChhKTsKKwlibl9jaGVja190b3AoYik7CisKKwlpZiAoQk5faXNfemVybyhiKSkKKwkJcmV0dXJuKEJOX29uZShyKSk7CisKKwlpZiAoQk5fYWJzX2lzX3dvcmQoYiwgMSkpCisJCXJldHVybiAoQk5fY29weShyLCBhKSAhPSBOVUxMKTsKKworCUJOX0NUWF9zdGFydChjdHgpOworCWlmICgodSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgZ290byBlcnI7CisJCisJaWYgKCFCTl9HRjJtX21vZF9hcnIodSwgYSwgcCkpIGdvdG8gZXJyOworCQorCW4gPSBCTl9udW1fYml0cyhiKSAtIDE7CisJZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgaS0tKQorCQl7CisJCWlmICghQk5fR0YybV9tb2Rfc3FyX2Fycih1LCB1LCBwLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKEJOX2lzX2JpdF9zZXQoYiwgaSkpCisJCQl7CisJCQlpZiAoIUJOX0dGMm1fbW9kX211bF9hcnIodSwgdSwgYSwgcCwgY3R4KSkgZ290byBlcnI7CisJCQl9CisJCX0KKwlpZiAoIUJOX2NvcHkociwgdSkpIGdvdG8gZXJyOworCWJuX2NoZWNrX3RvcChyKTsKKwlyZXQgPSAxOworZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogQ29tcHV0ZSB0aGUgYnRoIHBvd2VyIG9mIGEsIHJlZHVjZSBtb2R1bG8gcCwgYW5kIHN0b3JlCisgKiB0aGUgcmVzdWx0IGluIHIuICByIGNvdWxkIGJlIGEuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYWxscyBkb3duIHRvIHRoZSBCTl9HRjJtX21vZF9leHBfYXJyIGltcGxlbWVudGF0aW9uOyB0aGlzIHdyYXBwZXIKKyAqIGZ1bmN0aW9uIGlzIG9ubHkgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlOyBmb3IgYmVzdCBwZXJmb3JtYW5jZSwgdXNlIHRoZSAKKyAqIEJOX0dGMm1fbW9kX2V4cF9hcnIgZnVuY3Rpb24uCisgKi8KK2ludCBCTl9HRjJtX21vZF9leHAoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgY29uc3QgQklHTlVNICpwLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldCA9IDA7CisJY29uc3QgaW50IG1heCA9IEJOX251bV9iaXRzKHApICsgMTsKKwlpbnQgKmFycj1OVUxMOworCWJuX2NoZWNrX3RvcChhKTsKKwlibl9jaGVja190b3AoYik7CisJYm5fY2hlY2tfdG9wKHApOworCWlmICgoYXJyID0gKGludCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihpbnQpICogbWF4KSkgPT0gTlVMTCkgZ290byBlcnI7CisJcmV0ID0gQk5fR0YybV9wb2x5MmFycihwLCBhcnIsIG1heCk7CisJaWYgKCFyZXQgfHwgcmV0ID4gbWF4KQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fR0YyTV9NT0RfRVhQLEJOX1JfSU5WQUxJRF9MRU5HVEgpOworCQlnb3RvIGVycjsKKwkJfQorCXJldCA9IEJOX0dGMm1fbW9kX2V4cF9hcnIociwgYSwgYiwgYXJyLCBjdHgpOworCWJuX2NoZWNrX3RvcChyKTsKK2VycjoKKwlpZiAoYXJyKSBPUEVOU1NMX2ZyZWUoYXJyKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogQ29tcHV0ZSB0aGUgc3F1YXJlIHJvb3Qgb2YgYSwgcmVkdWNlIG1vZHVsbyBwLCBhbmQgc3RvcmUKKyAqIHRoZSByZXN1bHQgaW4gci4gIHIgY291bGQgYmUgYS4KKyAqIFVzZXMgZXhwb25lbnRpYXRpb24gYXMgaW4gYWxnb3JpdGhtIEEuNC4xIGZyb20gSUVFRSBQMTM2My4KKyAqLworaW50CUJOX0dGMm1fbW9kX3NxcnRfYXJyKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBpbnQgcFtdLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldCA9IDA7CisJQklHTlVNICp1OworCisJYm5fY2hlY2tfdG9wKGEpOworCisJaWYgKCFwWzBdKQorCQl7CisJCS8qIHJlZHVjdGlvbiBtb2QgMSA9PiByZXR1cm4gMCAqLworCQlCTl96ZXJvKHIpOworCQlyZXR1cm4gMTsKKwkJfQorCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJaWYgKCh1ID0gQk5fQ1RYX2dldChjdHgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkKKwlpZiAoIUJOX3NldF9iaXQodSwgcFswXSAtIDEpKSBnb3RvIGVycjsKKwlyZXQgPSBCTl9HRjJtX21vZF9leHBfYXJyKHIsIGEsIHUsIHAsIGN0eCk7CisJYm5fY2hlY2tfdG9wKHIpOworCitlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybiByZXQ7CisJfQorCisvKiBDb21wdXRlIHRoZSBzcXVhcmUgcm9vdCBvZiBhLCByZWR1Y2UgbW9kdWxvIHAsIGFuZCBzdG9yZQorICogdGhlIHJlc3VsdCBpbiByLiAgciBjb3VsZCBiZSBhLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgZG93biB0byB0aGUgQk5fR0YybV9tb2Rfc3FydF9hcnIgaW1wbGVtZW50YXRpb247IHRoaXMgd3JhcHBlcgorICogZnVuY3Rpb24gaXMgb25seSBwcm92aWRlZCBmb3IgY29udmVuaWVuY2U7IGZvciBiZXN0IHBlcmZvcm1hbmNlLCB1c2UgdGhlIAorICogQk5fR0YybV9tb2Rfc3FydF9hcnIgZnVuY3Rpb24uCisgKi8KK2ludCBCTl9HRjJtX21vZF9zcXJ0KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0ID0gMDsKKwljb25zdCBpbnQgbWF4ID0gQk5fbnVtX2JpdHMocCkgKyAxOworCWludCAqYXJyPU5VTEw7CisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChwKTsKKwlpZiAoKGFyciA9IChpbnQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoaW50KSAqIG1heCkpID09IE5VTEwpIGdvdG8gZXJyOworCXJldCA9IEJOX0dGMm1fcG9seTJhcnIocCwgYXJyLCBtYXgpOworCWlmICghcmV0IHx8IHJldCA+IG1heCkKKwkJeworCQlCTmVycihCTl9GX0JOX0dGMk1fTU9EX1NRUlQsQk5fUl9JTlZBTElEX0xFTkdUSCk7CisJCWdvdG8gZXJyOworCQl9CisJcmV0ID0gQk5fR0YybV9tb2Rfc3FydF9hcnIociwgYSwgYXJyLCBjdHgpOworCWJuX2NoZWNrX3RvcChyKTsKK2VycjoKKwlpZiAoYXJyKSBPUEVOU1NMX2ZyZWUoYXJyKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogRmluZCByIHN1Y2ggdGhhdCByXjIgKyByID0gYSBtb2QgcC4gIHIgY291bGQgYmUgYS4gSWYgbm8gciBleGlzdHMgcmV0dXJucyAwLgorICogVXNlcyBhbGdvcml0aG1zIEEuNC43IGFuZCBBLjQuNiBmcm9tIElFRUUgUDEzNjMuCisgKi8KK2ludCBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkX2FycihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYV8sIGNvbnN0IGludCBwW10sIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0ID0gMCwgY291bnQgPSAwLCBqOworCUJJR05VTSAqYSwgKnosICpyaG8sICp3LCAqdzIsICp0bXA7CisKKwlibl9jaGVja190b3AoYV8pOworCisJaWYgKCFwWzBdKQorCQl7CisJCS8qIHJlZHVjdGlvbiBtb2QgMSA9PiByZXR1cm4gMCAqLworCQlCTl96ZXJvKHIpOworCQlyZXR1cm4gMTsKKwkJfQorCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJYSA9IEJOX0NUWF9nZXQoY3R4KTsKKwl6ID0gQk5fQ1RYX2dldChjdHgpOworCXcgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHcgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoIUJOX0dGMm1fbW9kX2FycihhLCBhXywgcCkpIGdvdG8gZXJyOworCQorCWlmIChCTl9pc196ZXJvKGEpKQorCQl7CisJCUJOX3plcm8ocik7CisJCXJldCA9IDE7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAocFswXSAmIDB4MSkgLyogbSBpcyBvZGQgKi8KKwkJeworCQkvKiBjb21wdXRlIGhhbGYtdHJhY2Ugb2YgYSAqLworCQlpZiAoIUJOX2NvcHkoeiwgYSkpIGdvdG8gZXJyOworCQlmb3IgKGogPSAxOyBqIDw9IChwWzBdIC0gMSkgLyAyOyBqKyspCisJCQl7CisJCQlpZiAoIUJOX0dGMm1fbW9kX3Nxcl9hcnIoeiwgeiwgcCwgY3R4KSkgZ290byBlcnI7CisJCQlpZiAoIUJOX0dGMm1fbW9kX3Nxcl9hcnIoeiwgeiwgcCwgY3R4KSkgZ290byBlcnI7CisJCQlpZiAoIUJOX0dGMm1fYWRkKHosIHosIGEpKSBnb3RvIGVycjsKKwkJCX0KKwkJCisJCX0KKwllbHNlIC8qIG0gaXMgZXZlbiAqLworCQl7CisJCXJobyA9IEJOX0NUWF9nZXQoY3R4KTsKKwkJdzIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJCXRtcCA9IEJOX0NUWF9nZXQoY3R4KTsKKwkJaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGVycjsKKwkJZG8KKwkJCXsKKwkJCWlmICghQk5fcmFuZChyaG8sIHBbMF0sIDAsIDApKSBnb3RvIGVycjsKKwkJCWlmICghQk5fR0YybV9tb2RfYXJyKHJobywgcmhvLCBwKSkgZ290byBlcnI7CisJCQlCTl96ZXJvKHopOworCQkJaWYgKCFCTl9jb3B5KHcsIHJobykpIGdvdG8gZXJyOworCQkJZm9yIChqID0gMTsgaiA8PSBwWzBdIC0gMTsgaisrKQorCQkJCXsKKwkJCQlpZiAoIUJOX0dGMm1fbW9kX3Nxcl9hcnIoeiwgeiwgcCwgY3R4KSkgZ290byBlcnI7CisJCQkJaWYgKCFCTl9HRjJtX21vZF9zcXJfYXJyKHcyLCB3LCBwLCBjdHgpKSBnb3RvIGVycjsKKwkJCQlpZiAoIUJOX0dGMm1fbW9kX211bF9hcnIodG1wLCB3MiwgYSwgcCwgY3R4KSkgZ290byBlcnI7CisJCQkJaWYgKCFCTl9HRjJtX2FkZCh6LCB6LCB0bXApKSBnb3RvIGVycjsKKwkJCQlpZiAoIUJOX0dGMm1fYWRkKHcsIHcyLCByaG8pKSBnb3RvIGVycjsKKwkJCQl9CisJCQljb3VudCsrOworCQkJfSB3aGlsZSAoQk5faXNfemVybyh3KSAmJiAoY291bnQgPCBNQVhfSVRFUkFUSU9OUykpOworCQlpZiAoQk5faXNfemVybyh3KSkKKwkJCXsKKwkJCUJOZXJyKEJOX0ZfQk5fR0YyTV9NT0RfU09MVkVfUVVBRF9BUlIsQk5fUl9UT09fTUFOWV9JVEVSQVRJT05TKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCisJaWYgKCFCTl9HRjJtX21vZF9zcXJfYXJyKHcsIHosIHAsIGN0eCkpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9hZGQodywgeiwgdykpIGdvdG8gZXJyOworCWlmIChCTl9HRjJtX2NtcCh3LCBhKSkKKwkJeworCQlCTmVycihCTl9GX0JOX0dGMk1fTU9EX1NPTFZFX1FVQURfQVJSLCBCTl9SX05PX1NPTFVUSU9OKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICghQk5fY29weShyLCB6KSkgZ290byBlcnI7CisJYm5fY2hlY2tfdG9wKHIpOworCisJcmV0ID0gMTsKKworZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogRmluZCByIHN1Y2ggdGhhdCByXjIgKyByID0gYSBtb2QgcC4gIHIgY291bGQgYmUgYS4gSWYgbm8gciBleGlzdHMgcmV0dXJucyAwLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgZG93biB0byB0aGUgQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnIgaW1wbGVtZW50YXRpb247IHRoaXMgd3JhcHBlcgorICogZnVuY3Rpb24gaXMgb25seSBwcm92aWRlZCBmb3IgY29udmVuaWVuY2U7IGZvciBiZXN0IHBlcmZvcm1hbmNlLCB1c2UgdGhlIAorICogQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnIgZnVuY3Rpb24uCisgKi8KK2ludCBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0ID0gMDsKKwljb25zdCBpbnQgbWF4ID0gQk5fbnVtX2JpdHMocCkgKyAxOworCWludCAqYXJyPU5VTEw7CisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChwKTsKKwlpZiAoKGFyciA9IChpbnQgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoaW50KSAqCisJCQkJCQltYXgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlyZXQgPSBCTl9HRjJtX3BvbHkyYXJyKHAsIGFyciwgbWF4KTsKKwlpZiAoIXJldCB8fCByZXQgPiBtYXgpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9HRjJNX01PRF9TT0xWRV9RVUFELEJOX1JfSU5WQUxJRF9MRU5HVEgpOworCQlnb3RvIGVycjsKKwkJfQorCXJldCA9IEJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyKHIsIGEsIGFyciwgY3R4KTsKKwlibl9jaGVja190b3Aocik7CitlcnI6CisJaWYgKGFycikgT1BFTlNTTF9mcmVlKGFycik7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIENvbnZlcnQgdGhlIGJpdC1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBwb2x5bm9taWFsCisgKiAoIFxzdW1fe2k9MH1ebiBhX2kgKiB4XmkpIGludG8gYW4gYXJyYXkgb2YgaW50ZWdlcnMgY29ycmVzcG9uZGluZyAKKyAqIHRvIHRoZSBiaXRzIHdpdGggbm9uLXplcm8gY29lZmZpY2llbnQuICBBcnJheSBpcyB0ZXJtaW5hdGVkIHdpdGggLTEuCisgKiBVcCB0byBtYXggZWxlbWVudHMgb2YgdGhlIGFycmF5IHdpbGwgYmUgZmlsbGVkLiAgUmV0dXJuIHZhbHVlIGlzIHRvdGFsCisgKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdGhhdCB3b3VsZCBiZSBmaWxsZWQgaWYgYXJyYXkgd2FzIGxhcmdlIGVub3VnaC4KKyAqLworaW50IEJOX0dGMm1fcG9seTJhcnIoY29uc3QgQklHTlVNICphLCBpbnQgcFtdLCBpbnQgbWF4KQorCXsKKwlpbnQgaSwgaiwgayA9IDA7CisJQk5fVUxPTkcgbWFzazsKKworCWlmIChCTl9pc196ZXJvKGEpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IGEtPnRvcCAtIDE7IGkgPj0gMDsgaS0tKQorCQl7CisJCWlmICghYS0+ZFtpXSkKKwkJCS8qIHNraXAgd29yZCBpZiBhLT5kW2ldID09IDAgKi8KKwkJCWNvbnRpbnVlOworCQltYXNrID0gQk5fVEJJVDsKKwkJZm9yIChqID0gQk5fQklUUzIgLSAxOyBqID49IDA7IGotLSkKKwkJCXsKKwkJCWlmIChhLT5kW2ldICYgbWFzaykgCisJCQkJeworCQkJCWlmIChrIDwgbWF4KSBwW2tdID0gQk5fQklUUzIgKiBpICsgajsKKwkJCQlrKys7CisJCQkJfQorCQkJbWFzayA+Pj0gMTsKKwkJCX0KKwkJfQorCisJaWYgKGsgPCBtYXgpIHsKKwkJcFtrXSA9IC0xOworCQlrKys7CisJfQorCisJcmV0dXJuIGs7CisJfQorCisvKiBDb252ZXJ0IHRoZSBjb2VmZmljaWVudCBhcnJheSByZXByZXNlbnRhdGlvbiBvZiBhIHBvbHlub21pYWwgdG8gYSAKKyAqIGJpdC1zdHJpbmcuICBUaGUgYXJyYXkgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IC0xLgorICovCitpbnQgQk5fR0YybV9hcnIycG9seShjb25zdCBpbnQgcFtdLCBCSUdOVU0gKmEpCisJeworCWludCBpOworCisJYm5fY2hlY2tfdG9wKGEpOworCUJOX3plcm8oYSk7CisJZm9yIChpID0gMDsgcFtpXSAhPSAtMTsgaSsrKQorCQl7CisJCWlmIChCTl9zZXRfYml0KGEsIHBbaV0pID09IDApCisJCQlyZXR1cm4gMDsKKwkJfQorCWJuX2NoZWNrX3RvcChhKTsKKworCXJldHVybiAxOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2tyb24uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9rcm9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwMzU5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9rcm9uLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qIGNyeXB0by9ibi9ibl9rcm9uLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworLyogbGVhc3Qgc2lnbmlmaWNhbnQgd29yZCAqLworI2RlZmluZSBCTl9sc3cobikgKCgobiktPnRvcCA9PSAwKSA/IChCTl9VTE9ORykgMCA6IChuKS0+ZFswXSkKKworLyogUmV0dXJucyAtMiBmb3IgZXJyb3JzIGJlY2F1c2UgYm90aCAtMSBhbmQgMCBhcmUgdmFsaWQgcmVzdWx0cy4gKi8KK2ludCBCTl9rcm9uZWNrZXIoY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gLTI7IC8qIGF2b2lkICd1bmluaXRpYWxpemVkJyB3YXJuaW5nICovCisJaW50IGVyciA9IDA7CisJQklHTlVNICpBLCAqQiwgKnRtcDsKKwkvKiBJbiAndGFiJywgb25seSBvZGQtaW5kZXhlZCBlbnRyaWVzIGFyZSByZWxldmFudDoKKwkgKiBGb3IgYW55IG9kZCBCSUdOVU0gbiwKKwkgKiAgICAgdGFiW0JOX2xzdyhuKSAmIDddCisJICogaXMgJCgtMSleeyhuXjItMSkvOH0kICh1c2luZyBUZVggbm90YXRpb24pLgorCSAqIE5vdGUgdGhhdCB0aGUgc2lnbiBvZiBuIGRvZXMgbm90IG1hdHRlci4KKwkgKi8KKwlzdGF0aWMgY29uc3QgaW50IHRhYls4XSA9IHswLCAxLCAwLCAtMSwgMCwgLTEsIDAsIDF9OworCisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChiKTsKKworCUJOX0NUWF9zdGFydChjdHgpOworCUEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJQiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoQiA9PSBOVUxMKSBnb3RvIGVuZDsKKwkKKwllcnIgPSAhQk5fY29weShBLCBhKTsKKwlpZiAoZXJyKSBnb3RvIGVuZDsKKwllcnIgPSAhQk5fY29weShCLCBiKTsKKwlpZiAoZXJyKSBnb3RvIGVuZDsKKworCS8qCisJICogS3JvbmVja2VyIHN5bWJvbCwgaW1sZW1lbnRlZCBhY2NvcmRpbmcgdG8gSGVucmkgQ29oZW4sCisJICogIkEgQ291cnNlIGluIENvbXB1dGF0aW9uYWwgQWxnZWJyYWljIE51bWJlciBUaGVvcnkiCisJICogKGFsZ29yaXRobSAxLjQuMTApLgorCSAqLworCisJLyogQ29oZW4ncyBzdGVwIDE6ICovCisKKwlpZiAoQk5faXNfemVybyhCKSkKKwkJeworCQlyZXQgPSBCTl9hYnNfaXNfd29yZChBLCAxKTsKKwkJZ290byBlbmQ7CisgCQl9CisJCisJLyogQ29oZW4ncyBzdGVwIDI6ICovCisKKwlpZiAoIUJOX2lzX29kZChBKSAmJiAhQk5faXNfb2RkKEIpKQorCQl7CisJCXJldCA9IDA7CisJCWdvdG8gZW5kOworCQl9CisKKwkvKiBub3cgIEIgIGlzIG5vbi16ZXJvICovCisJaSA9IDA7CisJd2hpbGUgKCFCTl9pc19iaXRfc2V0KEIsIGkpKQorCQlpKys7CisJZXJyID0gIUJOX3JzaGlmdChCLCBCLCBpKTsKKwlpZiAoZXJyKSBnb3RvIGVuZDsKKwlpZiAoaSAmIDEpCisJCXsKKwkJLyogaSBpcyBvZGQgKi8KKwkJLyogKHRodXMgIEIgIHdhcyBldmVuLCB0aHVzICBBICBtdXN0IGJlIG9kZCEpICAqLworCisJCS8qIHNldCAncmV0JyB0byAkKC0xKV57KEFeMi0xKS84fSQgKi8KKwkJcmV0ID0gdGFiW0JOX2xzdyhBKSAmIDddOworCQl9CisJZWxzZQorCQl7CisJCS8qIGkgaXMgZXZlbiAqLworCQlyZXQgPSAxOworCQl9CisJCisJaWYgKEItPm5lZykKKwkJeworCQlCLT5uZWcgPSAwOworCQlpZiAoQS0+bmVnKQorCQkJcmV0ID0gLXJldDsKKwkJfQorCisJLyogbm93ICBCICBpcyBwb3NpdGl2ZSBhbmQgb2RkLCBzbyB3aGF0IHJlbWFpbnMgdG8gYmUgZG9uZSBpcworCSAqIHRvIGNvbXB1dGUgdGhlIEphY29iaSBzeW1ib2wgIChBL0IpICBhbmQgbXVsdGlwbHkgaXQgYnkgJ3JldCcgKi8KKworCXdoaWxlICgxKQorCQl7CisJCS8qIENvaGVuJ3Mgc3RlcCAzOiAqLworCisJCS8qICBCICBpcyBwb3NpdGl2ZSBhbmQgb2RkICovCisKKwkJaWYgKEJOX2lzX3plcm8oQSkpCisJCQl7CisJCQlyZXQgPSBCTl9pc19vbmUoQikgPyByZXQgOiAwOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJLyogbm93ICBBICBpcyBub24temVybyAqLworCQlpID0gMDsKKwkJd2hpbGUgKCFCTl9pc19iaXRfc2V0KEEsIGkpKQorCQkJaSsrOworCQllcnIgPSAhQk5fcnNoaWZ0KEEsIEEsIGkpOworCQlpZiAoZXJyKSBnb3RvIGVuZDsKKwkJaWYgKGkgJiAxKQorCQkJeworCQkJLyogaSBpcyBvZGQgKi8KKwkJCS8qIG11bHRpcGx5ICdyZXQnIGJ5ICAkKC0xKV57KEJeMi0xKS84fSQgKi8KKwkJCXJldCA9IHJldCAqIHRhYltCTl9sc3coQikgJiA3XTsKKwkJCX0KKwkKKwkJLyogQ29oZW4ncyBzdGVwIDQ6ICovCisJCS8qIG11bHRpcGx5ICdyZXQnIGJ5ICAkKC0xKV57KEEtMSkoQi0xKS80fSQgKi8KKwkJaWYgKChBLT5uZWcgPyB+Qk5fbHN3KEEpIDogQk5fbHN3KEEpKSAmIEJOX2xzdyhCKSAmIDIpCisJCQlyZXQgPSAtcmV0OworCQkKKwkJLyogKEEsIEIpIDo9IChCIG1vZCB8QXwsIHxBfCkgKi8KKwkJZXJyID0gIUJOX25ubW9kKEIsIEIsIEEsIGN0eCk7CisJCWlmIChlcnIpIGdvdG8gZW5kOworCQl0bXAgPSBBOyBBID0gQjsgQiA9IHRtcDsKKwkJdG1wLT5uZWcgPSAwOworCQl9CitlbmQ6CisJQk5fQ1RYX2VuZChjdHgpOworCWlmIChlcnIpCisJCXJldHVybiAtMjsKKwllbHNlCisJCXJldHVybiByZXQ7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2xjbC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX2xjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNWU5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbGNsLmgKQEAgLTAsMCArMSw0OTEgQEAKKy8qIGNyeXB0by9ibi9ibl9sY2wuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX0JOX0xDTF9ICisjZGVmaW5lIEhFQURFUl9CTl9MQ0xfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qCisgKiBCTl93aW5kb3dfYml0c19mb3JfZXhwb25lbnRfc2l6ZSAtLSBtYWNybyBmb3Igc2xpZGluZyB3aW5kb3cgbW9kX2V4cCBmdW5jdGlvbnMKKyAqCisgKgorICogRm9yIHdpbmRvdyBzaXplICd3JyAodyA+PSAyKSBhbmQgYSByYW5kb20gJ2InIGJpdHMgZXhwb25lbnQsCisgKiB0aGUgbnVtYmVyIG9mIG11bHRpcGxpY2F0aW9ucyBpcyBhIGNvbnN0YW50IHBsdXMgb24gYXZlcmFnZQorICoKKyAqICAgIDJeKHctMSkgKyAoYi13KS8odysxKTsKKyAqCisgKiBoZXJlICAyXih3LTEpICBpcyBmb3IgcHJlY29tcHV0aW5nIHRoZSB0YWJsZSAod2UgYWN0dWFsbHkgbmVlZAorICogZW50cmllcyBvbmx5IGZvciB3aW5kb3dzIHRoYXQgaGF2ZSB0aGUgbG93ZXN0IGJpdCBzZXQpLCBhbmQKKyAqIChiLXcpLyh3KzEpICBpcyBhbiBhcHByb3hpbWF0aW9uIGZvciB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mCisgKiB3LWJpdCB3aW5kb3dzLCBub3QgY291bnRpbmcgdGhlIGZpcnN0IG9uZS4KKyAqCisgKiBUaHVzIHdlIHNob3VsZCB1c2UKKyAqCisgKiAgICB3ID49IDYgIGlmICAgICAgICBiID4gNjcxCisgKiAgICAgdyA9IDUgIGlmICA2NzEgPiBiID4gMjM5CisgKiAgICAgdyA9IDQgIGlmICAyMzkgPiBiID4gIDc5CisgKiAgICAgdyA9IDMgIGlmICAgNzkgPiBiID4gIDIzCisgKiAgICB3IDw9IDIgIGlmICAgMjMgPiBiCisgKgorICogKHdpdGggZHJhd3MgaW4gYmV0d2VlbikuICBWZXJ5IHNtYWxsIGV4cG9uZW50cyBhcmUgb2Z0ZW4gc2VsZWN0ZWQKKyAqIHdpdGggbG93IEhhbW1pbmcgd2VpZ2h0LCBzbyB3ZSB1c2UgIHcgPSAxICBmb3IgYiA8PSAyMy4KKyAqLworI2lmIDEKKyNkZWZpbmUgQk5fd2luZG93X2JpdHNfZm9yX2V4cG9uZW50X3NpemUoYikgXAorCQkoKGIpID4gNjcxID8gNiA6IFwKKwkJIChiKSA+IDIzOSA/IDUgOiBcCisJCSAoYikgPiAgNzkgPyA0IDogXAorCQkgKGIpID4gIDIzID8gMyA6IDEpCisjZWxzZQorLyogT2xkIFNTTGVheS9PcGVuU1NMIHRhYmxlLgorICogTWF4aW11bSB3aW5kb3cgc2l6ZSB3YXMgNSwgc28gdGhpcyB0YWJsZSBkaWZmZXJzIGZvciBiPT0xMDI0OworICogYnV0IGl0IGNvaW5jaWRlcyBmb3Igb3RoZXIgaW50ZXJlc3RpbmcgdmFsdWVzIChiPT0xNjAsIGI9PTUxMikuCisgKi8KKyNkZWZpbmUgQk5fd2luZG93X2JpdHNfZm9yX2V4cG9uZW50X3NpemUoYikgXAorCQkoKGIpID4gMjU1ID8gNSA6IFwKKwkJIChiKSA+IDEyNyA/IDQgOiBcCisJCSAoYikgPiAgMTcgPyAzIDogMSkKKyNlbmRpZgkgCisKKworCisvKiBCTl9tb2RfZXhwX21vbnRfY29udHRpbWUgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUKKyAqIEwxIGRhdGEgY2FjaGUgbGluZSB3aWR0aCBvZiB0aGUgdGFyZ2V0IHByb2Nlc3NvciBpcyBhdCBsZWFzdAorICogdGhlIGZvbGxvd2luZyB2YWx1ZS4KKyAqLworI2RlZmluZSBNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX1dJRFRICSggNjQgKQorI2RlZmluZSBNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX01BU0sJKE1PRF9FWFBfQ1RJTUVfTUlOX0NBQ0hFX0xJTkVfV0lEVEggLSAxKQorCisvKiBXaW5kb3cgc2l6ZXMgb3B0aW1pemVkIGZvciBmaXhlZCB3aW5kb3cgc2l6ZSBtb2R1bGFyIGV4cG9uZW50aWF0aW9uCisgKiBhbGdvcml0aG0gKEJOX21vZF9leHBfbW9udF9jb25zdHRpbWUpLgorICoKKyAqIFRvIGFjaGlldmUgdGhlIHNlY3VyaXR5IGdvYWxzIG9mIEJOX21vZGVfZXhwX21vbnRfY29uc3R0aW1lLCB0aGUKKyAqIG1heGltdW0gc2l6ZSBvZiB0aGUgd2luZG93IG11c3Qgbm90IGV4Y2VlZAorICogbG9nXzIoTU9EX0VYUF9DVElNRV9NSU5fQ0FDSEVfTElORV9XSURUSCkuIAorICoKKyAqIFdpbmRvdyBzaXplIHRocmVzaG9sZHMgYXJlIGRlZmluZWQgZm9yIGNhY2hlIGxpbmUgc2l6ZXMgb2YgMzIgYW5kIDY0LAorICogY2FjaGUgbGluZSBzaXplcyB3aGVyZSBsb2dfMigzMik9NSBhbmQgbG9nXzIoNjQpPTYgcmVzcGVjdGl2ZWx5LiBBCisgKiB3aW5kb3cgc2l6ZSBvZiA3IHNob3VsZCBvbmx5IGJlIHVzZWQgb24gcHJvY2Vzc29ycyB0aGF0IGhhdmUgYSAxMjgKKyAqIGJ5dGUgb3IgZ3JlYXRlciBjYWNoZSBsaW5lIHNpemUuCisgKi8KKyNpZiBNT0RfRVhQX0NUSU1FX01JTl9DQUNIRV9MSU5FX1dJRFRIID09IDY0CisKKyMgIGRlZmluZSBCTl93aW5kb3dfYml0c19mb3JfY3RpbWVfZXhwb25lbnRfc2l6ZShiKSBcCisJCSgoYikgPiA5MzcgPyA2IDogXAorCQkgKGIpID4gMzA2ID8gNSA6IFwKKwkJIChiKSA+ICA4OSA/IDQgOiBcCisJCSAoYikgPiAgMjIgPyAzIDogMSkKKyMgIGRlZmluZSBCTl9NQVhfV0lORE9XX0JJVFNfRk9SX0NUSU1FX0VYUE9ORU5UX1NJWkUJKDYpCisKKyNlbGlmIE1PRF9FWFBfQ1RJTUVfTUlOX0NBQ0hFX0xJTkVfV0lEVEggPT0gMzIKKworIyAgZGVmaW5lIEJOX3dpbmRvd19iaXRzX2Zvcl9jdGltZV9leHBvbmVudF9zaXplKGIpIFwKKwkJKChiKSA+IDMwNiA/IDUgOiBcCisJCSAoYikgPiAgODkgPyA0IDogXAorCQkgKGIpID4gIDIyID8gMyA6IDEpCisjICBkZWZpbmUgQk5fTUFYX1dJTkRPV19CSVRTX0ZPUl9DVElNRV9FWFBPTkVOVF9TSVpFCSg1KQorCisjZW5kaWYKKworCisvKiBQZW50aXVtIHBybyAxNiwxNiwxNiwzMiw2NCAqLworLyogQWxwaGEgICAgICAgMTYsMTYsMTYsMTYuNjQgKi8KKyNkZWZpbmUgQk5fTVVMTF9TSVpFX05PUk1BTAkJCSgxNikgLyogMzIgKi8KKyNkZWZpbmUgQk5fTVVMX1JFQ1VSU0lWRV9TSVpFX05PUk1BTAkJKDE2KSAvKiAzMiBsZXNzIHRoYW4gKi8KKyNkZWZpbmUgQk5fU1FSX1JFQ1VSU0lWRV9TSVpFX05PUk1BTAkJKDE2KSAvKiAzMiAqLworI2RlZmluZSBCTl9NVUxfTE9XX1JFQ1VSU0lWRV9TSVpFX05PUk1BTAkoMzIpIC8qIDMyICovCisjZGVmaW5lIEJOX01PTlRfQ1RYX1NFVF9TSVpFX1dPUkQJCSg2NCkgLyogMzIgKi8KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0lOTElORV9BU00pICYmICFkZWZpbmVkKFBFREFOVElDKQorLyoKKyAqIEJOX1VNVUxUX0hJR0ggc2VjdGlvbi4KKyAqCisgKiBObywgSSdtIG5vdCB0cnlpbmcgdG8gb3ZlcndoZWxtIHlvdSB3aGVuIHN0YXRpbmcgdGhhdCB0aGUKKyAqIHByb2R1Y3Qgb2YgTi1iaXQgbnVtYmVycyBpcyAyKk4gYml0cyB3aWRlOi0pIE5vLCBJIGRvbid0IGV4cGVjdAorICogeW91IHRvIGJlIGltcHJlc3NlZCB3aGVuIEkgc2F5IHRoYXQgaWYgdGhlIGNvbXBpbGVyIGRvZXNuJ3QKKyAqIHN1cHBvcnQgMipOIGludGVnZXIgdHlwZSwgdGhlbiB5b3UgaGF2ZSB0byByZXBsYWNlIGV2ZXJ5IE4qTgorICogbXVsdGlwbGljYXRpb24gd2l0aCA0IChOLzIpKihOLzIpIGFjY29tcGFuaWVkIGJ5IHNvbWUgc2hpZnRzCisgKiBhbmQgYWRkaXRpb25zIHdoaWNoIHVuYXZvaWRhYmx5IHJlc3VsdHMgaW4gc2V2ZXJlIHBlcmZvcm1hbmNlCisgKiBwZW5hbHRpZXMuIE9mIGNvdXJzZSBwcm92aWRlZCB0aGF0IHRoZSBoYXJkd2FyZSBpcyBjYXBhYmxlIG9mCisgKiBwcm9kdWNpbmcgMipOIHJlc3VsdC4uLiBUaGF0J3Mgd2hlbiB5b3Ugbm9ybWFsbHkgc3RhcnQKKyAqIGNvbnNpZGVyaW5nIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbi4gSG93ZXZlciEgSXQgc2hvdWxkIGJlCisgKiBwb2ludGVkIG91dCB0aGF0IHNvbWUgQ1BVcyAobW9zdCBub3RhYmx5IEFscGhhLCBQb3dlclBDIGFuZAorICogdXBjb21pbmcgSUEtNjQgZmFtaWx5Oi0pIHByb3ZpZGUgKnNlcGFyYXRlKiBpbnN0cnVjdGlvbgorICogY2FsY3VsYXRpbmcgdGhlIHVwcGVyIGhhbGYgb2YgdGhlIHByb2R1Y3QgcGxhY2luZyB0aGUgcmVzdWx0CisgKiBpbnRvIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiBOb3cgKmlmKiB0aGUgY29tcGlsZXIgc3VwcG9ydHMKKyAqIGlubGluZSBhc3NlbWJsZXIsIHRoZW4gaXQncyBub3QgaW1wb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhlCisgKiAiYmlnbnVtIiByb3V0aW5lcyAoYW5kIGhhdmUgdGhlIGNvbXBpbGVyIG9wdGltaXplICdlbSkKKyAqIGV4aGliaXRpbmcgIm5hdGl2ZSIgcGVyZm9ybWFuY2UgaW4gQy4gVGhhdCdzIHdoYXQgQk5fVU1VTFRfSElHSAorICogbWFjcm8gaXMgYWJvdXQ6LSkKKyAqCisgKgkJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorICovCisjIGlmIGRlZmluZWQoX19hbHBoYSkgJiYgKGRlZmluZWQoU0lYVFlfRk9VUl9CSVRfTE9ORykgfHwgZGVmaW5lZChTSVhUWV9GT1VSX0JJVCkpCisjICBpZiBkZWZpbmVkKF9fREVDQykKKyMgICBpbmNsdWRlIDxjX2FzbS5oPgorIyAgIGRlZmluZSBCTl9VTVVMVF9ISUdIKGEsYikJKEJOX1VMT05HKWFzbSgidW11bGggJWEwLCVhMSwldjAiLChhKSwoYikpCisjICBlbGlmIGRlZmluZWQoX19HTlVDX18pCisjICAgZGVmaW5lIEJOX1VNVUxUX0hJR0goYSxiKQkoewlcCisJcmVnaXN0ZXIgQk5fVUxPTkcgcmV0OwkJXAorCWFzbSAoInVtdWxoCSUxLCUyLCUwIglcCisJICAgICA6ICI9ciIocmV0KQkJXAorCSAgICAgOiAiciIoYSksICJyIihiKSk7CQlcCisJcmV0OwkJCX0pCisjICBlbmRpZgkvKiBjb21waWxlciAqLworIyBlbGlmIGRlZmluZWQoX0FSQ0hfUFBDKSAmJiBkZWZpbmVkKF9fNjRCSVRfXykgJiYgZGVmaW5lZChTSVhUWV9GT1VSX0JJVF9MT05HKQorIyAgaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgICBkZWZpbmUgQk5fVU1VTFRfSElHSChhLGIpCSh7CVwKKwlyZWdpc3RlciBCTl9VTE9ORyByZXQ7CQlcCisJYXNtICgibXVsaGR1CSUwLCUxLCUyIglcCisJICAgICA6ICI9ciIocmV0KQkJXAorCSAgICAgOiAiciIoYSksICJyIihiKSk7CQlcCisJcmV0OwkJCX0pCisjICBlbmRpZgkvKiBjb21waWxlciAqLworIyBlbGlmIChkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKSAmJiBcCisgICAgICAgKGRlZmluZWQoU0lYVFlfRk9VUl9CSVRfTE9ORykgfHwgZGVmaW5lZChTSVhUWV9GT1VSX0JJVCkpCisjICBpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgIGRlZmluZSBCTl9VTVVMVF9ISUdIKGEsYikJKHsJXAorCXJlZ2lzdGVyIEJOX1VMT05HIHJldCxkaXNjYXJkOwlcCisJYXNtICgibXVscQklMyIJCVwKKwkgICAgIDogIj1hIihkaXNjYXJkKSwiPWQiKHJldCkJXAorCSAgICAgOiAiYSIoYSksICJnIihiKQkJXAorCSAgICAgOiAiY2MiKTsJCQlcCisJcmV0OwkJCX0pCisjICAgZGVmaW5lIEJOX1VNVUxUX0xPSEkobG93LGhpZ2gsYSxiKQlcCisJYXNtICgibXVscQklMyIJCVwKKwkJOiAiPWEiKGxvdyksIj1kIihoaWdoKQlcCisJCTogImEiKGEpLCJnIihiKQkJXAorCQk6ICJjYyIpOworIyAgZW5kaWYKKyMgZWxpZiAoZGVmaW5lZChfTV9BTUQ2NCkgfHwgZGVmaW5lZChfTV9YNjQpKSAmJiBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUKQorIyAgaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVI+PTE0MDAKKyAgICB1bnNpZ25lZCBfX2ludDY0IF9fdW11bGgJKHVuc2lnbmVkIF9faW50NjQgYSx1bnNpZ25lZCBfX2ludDY0IGIpOworICAgIHVuc2lnbmVkIF9faW50NjQgX3VtdWwxMjgJKHVuc2lnbmVkIF9faW50NjQgYSx1bnNpZ25lZCBfX2ludDY0IGIsCisJCQkJIHVuc2lnbmVkIF9faW50NjQgKmgpOworIyAgIHByYWdtYSBpbnRyaW5zaWMoX191bXVsaCxfdW11bDEyOCkKKyMgICBkZWZpbmUgQk5fVU1VTFRfSElHSChhLGIpCQlfX3VtdWxoKChhKSwoYikpCisjICAgZGVmaW5lIEJOX1VNVUxUX0xPSEkobG93LGhpZ2gsYSxiKQkoKGxvdyk9X3VtdWwxMjgoKGEpLChiKSwmKGhpZ2gpKSkKKyMgIGVuZGlmCisjIGVuZGlmCQkvKiBjcHUgKi8KKyNlbmRpZgkJLyogT1BFTlNTTF9OT19BU00gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFVzaW5nIHRoZSBsb25nIGxvbmcgdHlwZQorICovCisjZGVmaW5lIEx3KHQpICAgICgoKEJOX1VMT05HKSh0KSkmQk5fTUFTSzIpCisjZGVmaW5lIEh3KHQpICAgICgoKEJOX1VMT05HKSgodCk+PkJOX0JJVFMyKSkmQk5fTUFTSzIpCisKKyNpZmRlZiBCTl9ERUJVR19SQU5ECisjZGVmaW5lIGJuX2NsZWFyX3RvcDJtYXgoYSkgXAorCXsgXAorCWludCAgICAgIGluZCA9IChhKS0+ZG1heCAtIChhKS0+dG9wOyBcCisJQk5fVUxPTkcgKmZ0bCA9ICYoYSktPmRbKGEpLT50b3AtMV07IFwKKwlmb3IgKDsgaW5kICE9IDA7IGluZC0tKSBcCisJCSooKytmdGwpID0gMHgwOyBcCisJfQorI2Vsc2UKKyNkZWZpbmUgYm5fY2xlYXJfdG9wMm1heChhKQorI2VuZGlmCisKKyNpZmRlZiBCTl9MTE9ORworI2RlZmluZSBtdWxfYWRkKHIsYSx3LGMpIHsgXAorCUJOX1VMTE9ORyB0OyBcCisJdD0oQk5fVUxMT05HKXcgKiAoYSkgKyAocikgKyAoYyk7IFwKKwkocik9IEx3KHQpOyBcCisJKGMpPSBIdyh0KTsgXAorCX0KKworI2RlZmluZSBtdWwocixhLHcsYykgeyBcCisJQk5fVUxMT05HIHQ7IFwKKwl0PShCTl9VTExPTkcpdyAqIChhKSArIChjKTsgXAorCShyKT0gTHcodCk7IFwKKwkoYyk9IEh3KHQpOyBcCisJfQorCisjZGVmaW5lIHNxcihyMCxyMSxhKSB7IFwKKwlCTl9VTExPTkcgdDsgXAorCXQ9KEJOX1VMTE9ORykoYSkqKGEpOyBcCisJKHIwKT1Mdyh0KTsgXAorCShyMSk9SHcodCk7IFwKKwl9CisKKyNlbGlmIGRlZmluZWQoQk5fVU1VTFRfTE9ISSkKKyNkZWZpbmUgbXVsX2FkZChyLGEsdyxjKSB7CQlcCisJQk5fVUxPTkcgaGlnaCxsb3cscmV0LHRtcD0oYSk7CVwKKwlyZXQgPSAgKHIpOwkJCVwKKwlCTl9VTVVMVF9MT0hJKGxvdyxoaWdoLHcsdG1wKTsJXAorCXJldCArPSAoYyk7CQkJXAorCShjKSA9ICAocmV0PChjKSk/MTowOwkJXAorCShjKSArPSBoaWdoOwkJCVwKKwlyZXQgKz0gbG93OwkJCVwKKwkoYykgKz0gKHJldDxsb3cpPzE6MDsJCVwKKwkocikgPSAgcmV0OwkJCVwKKwl9CisKKyNkZWZpbmUgbXVsKHIsYSx3LGMpCXsJCVwKKwlCTl9VTE9ORyBoaWdoLGxvdyxyZXQsdGE9KGEpOwlcCisJQk5fVU1VTFRfTE9ISShsb3csaGlnaCx3LHRhKTsJXAorCXJldCA9ICBsb3cgKyAoYyk7CQlcCisJKGMpID0gIGhpZ2g7CQkJXAorCShjKSArPSAocmV0PGxvdyk/MTowOwkJXAorCShyKSA9ICByZXQ7CQkJXAorCX0KKworI2RlZmluZSBzcXIocjAscjEsYSkJewkJXAorCUJOX1VMT05HIHRtcD0oYSk7CQlcCisJQk5fVU1VTFRfTE9ISShyMCxyMSx0bXAsdG1wKTsJXAorCX0KKworI2VsaWYgZGVmaW5lZChCTl9VTVVMVF9ISUdIKQorI2RlZmluZSBtdWxfYWRkKHIsYSx3LGMpIHsJCVwKKwlCTl9VTE9ORyBoaWdoLGxvdyxyZXQsdG1wPShhKTsJXAorCXJldCA9ICAocik7CQkJXAorCWhpZ2g9ICBCTl9VTVVMVF9ISUdIKHcsdG1wKTsJXAorCXJldCArPSAoYyk7CQkJXAorCWxvdyA9ICAodykgKiB0bXA7CQlcCisJKGMpID0gIChyZXQ8KGMpKT8xOjA7CQlcCisJKGMpICs9IGhpZ2g7CQkJXAorCXJldCArPSBsb3c7CQkJXAorCShjKSArPSAocmV0PGxvdyk/MTowOwkJXAorCShyKSA9ICByZXQ7CQkJXAorCX0KKworI2RlZmluZSBtdWwocixhLHcsYykJewkJXAorCUJOX1VMT05HIGhpZ2gsbG93LHJldCx0YT0oYSk7CVwKKwlsb3cgPSAgKHcpICogdGE7CQlcCisJaGlnaD0gIEJOX1VNVUxUX0hJR0godyx0YSk7CVwKKwlyZXQgPSAgbG93ICsgKGMpOwkJXAorCShjKSA9ICBoaWdoOwkJCVwKKwkoYykgKz0gKHJldDxsb3cpPzE6MDsJCVwKKwkocikgPSAgcmV0OwkJCVwKKwl9CisKKyNkZWZpbmUgc3FyKHIwLHIxLGEpCXsJCVwKKwlCTl9VTE9ORyB0bXA9KGEpOwkJXAorCShyMCkgPSB0bXAgKiB0bXA7CQlcCisJKHIxKSA9IEJOX1VNVUxUX0hJR0godG1wLHRtcCk7CVwKKwl9CisKKyNlbHNlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTm8gbG9uZyBsb25nIHR5cGUKKyAqLworCisjZGVmaW5lIExCSVRTKGEpCSgoYSkmQk5fTUFTSzJsKQorI2RlZmluZSBIQklUUyhhKQkoKChhKT4+Qk5fQklUUzQpJkJOX01BU0sybCkKKyNkZWZpbmUJTDJIQklUUyhhKQkoKChhKTw8Qk5fQklUUzQpJkJOX01BU0syKQorCisjZGVmaW5lIExMQklUUyhhKQkoKGEpJkJOX01BU0tsKQorI2RlZmluZSBMSEJJVFMoYSkJKCgoYSk+PkJOX0JJVFMyKSZCTl9NQVNLbCkKKyNkZWZpbmUJTEwySEJJVFMoYSkJKChCTl9VTExPTkcpKChhKSZCTl9NQVNLbCk8PEJOX0JJVFMyKQorCisjZGVmaW5lIG11bDY0KGwsaCxibCxiaCkgXAorCXsgXAorCUJOX1VMT05HIG0sbTEsbHQsaHQ7IFwKKyBcCisJbHQ9bDsgXAorCWh0PWg7IFwKKwltID0oYmgpKihsdCk7IFwKKwlsdD0oYmwpKihsdCk7IFwKKwltMT0oYmwpKihodCk7IFwKKwlodCA9KGJoKSooaHQpOyBcCisJbT0obSttMSkmQk5fTUFTSzI7IGlmIChtIDwgbTEpIGh0Kz1MMkhCSVRTKChCTl9VTE9ORykxKTsgXAorCWh0Kz1IQklUUyhtKTsgXAorCW0xPUwySEJJVFMobSk7IFwKKwlsdD0obHQrbTEpJkJOX01BU0syOyBpZiAobHQgPCBtMSkgaHQrKzsgXAorCShsKT1sdDsgXAorCShoKT1odDsgXAorCX0KKworI2RlZmluZSBzcXI2NChsbyxobyxpbikgXAorCXsgXAorCUJOX1VMT05HIGwsaCxtOyBcCisgXAorCWg9KGluKTsgXAorCWw9TEJJVFMoaCk7IFwKKwloPUhCSVRTKGgpOyBcCisJbSA9KGwpKihoKTsgXAorCWwqPWw7IFwKKwloKj1oOyBcCisJaCs9KG0mQk5fTUFTSzJoMSk+PihCTl9CSVRTNC0xKTsgXAorCW0gPShtJkJOX01BU0sybCk8PChCTl9CSVRTNCsxKTsgXAorCWw9KGwrbSkmQk5fTUFTSzI7IGlmIChsIDwgbSkgaCsrOyBcCisJKGxvKT1sOyBcCisJKGhvKT1oOyBcCisJfQorCisjZGVmaW5lIG11bF9hZGQocixhLGJsLGJoLGMpIHsgXAorCUJOX1VMT05HIGwsaDsgXAorIFwKKwloPSAoYSk7IFwKKwlsPUxCSVRTKGgpOyBcCisJaD1IQklUUyhoKTsgXAorCW11bDY0KGwsaCwoYmwpLChiaCkpOyBcCisgXAorCS8qIG5vbi1tdWx0aXBseSBwYXJ0ICovIFwKKwlsPShsKyhjKSkmQk5fTUFTSzI7IGlmIChsIDwgKGMpKSBoKys7IFwKKwkoYyk9KHIpOyBcCisJbD0obCsoYykpJkJOX01BU0syOyBpZiAobCA8IChjKSkgaCsrOyBcCisJKGMpPWgmQk5fTUFTSzI7IFwKKwkocik9bDsgXAorCX0KKworI2RlZmluZSBtdWwocixhLGJsLGJoLGMpIHsgXAorCUJOX1VMT05HIGwsaDsgXAorIFwKKwloPSAoYSk7IFwKKwlsPUxCSVRTKGgpOyBcCisJaD1IQklUUyhoKTsgXAorCW11bDY0KGwsaCwoYmwpLChiaCkpOyBcCisgXAorCS8qIG5vbi1tdWx0aXBseSBwYXJ0ICovIFwKKwlsKz0oYyk7IGlmICgobCZCTl9NQVNLMikgPCAoYykpIGgrKzsgXAorCShjKT1oJkJOX01BU0syOyBcCisJKHIpPWwmQk5fTUFTSzI7IFwKKwl9CisjZW5kaWYgLyogIUJOX0xMT05HICovCisKK3ZvaWQgYm5fbXVsX25vcm1hbChCTl9VTE9ORyAqcixCTl9VTE9ORyAqYSxpbnQgbmEsQk5fVUxPTkcgKmIsaW50IG5iKTsKK3ZvaWQgYm5fbXVsX2NvbWJhOChCTl9VTE9ORyAqcixCTl9VTE9ORyAqYSxCTl9VTE9ORyAqYik7Cit2b2lkIGJuX211bF9jb21iYTQoQk5fVUxPTkcgKnIsQk5fVUxPTkcgKmEsQk5fVUxPTkcgKmIpOwordm9pZCBibl9zcXJfbm9ybWFsKEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSwgaW50IG4sIEJOX1VMT05HICp0bXApOwordm9pZCBibl9zcXJfY29tYmE4KEJOX1VMT05HICpyLGNvbnN0IEJOX1VMT05HICphKTsKK3ZvaWQgYm5fc3FyX2NvbWJhNChCTl9VTE9ORyAqcixjb25zdCBCTl9VTE9ORyAqYSk7CitpbnQgYm5fY21wX3dvcmRzKGNvbnN0IEJOX1VMT05HICphLGNvbnN0IEJOX1VMT05HICpiLGludCBuKTsKK2ludCBibl9jbXBfcGFydF93b3Jkcyhjb25zdCBCTl9VTE9ORyAqYSwgY29uc3QgQk5fVUxPTkcgKmIsCisJaW50IGNsLCBpbnQgZGwpOwordm9pZCBibl9tdWxfcmVjdXJzaXZlKEJOX1VMT05HICpyLEJOX1VMT05HICphLEJOX1VMT05HICpiLGludCBuMiwKKwlpbnQgZG5hLGludCBkbmIsQk5fVUxPTkcgKnQpOwordm9pZCBibl9tdWxfcGFydF9yZWN1cnNpdmUoQk5fVUxPTkcgKnIsQk5fVUxPTkcgKmEsQk5fVUxPTkcgKmIsCisJaW50IG4saW50IHRuYSxpbnQgdG5iLEJOX1VMT05HICp0KTsKK3ZvaWQgYm5fc3FyX3JlY3Vyc2l2ZShCTl9VTE9ORyAqcixjb25zdCBCTl9VTE9ORyAqYSwgaW50IG4yLCBCTl9VTE9ORyAqdCk7Cit2b2lkIGJuX211bF9sb3dfbm9ybWFsKEJOX1VMT05HICpyLEJOX1VMT05HICphLEJOX1VMT05HICpiLCBpbnQgbik7Cit2b2lkIGJuX211bF9sb3dfcmVjdXJzaXZlKEJOX1VMT05HICpyLEJOX1VMT05HICphLEJOX1VMT05HICpiLGludCBuMiwKKwlCTl9VTE9ORyAqdCk7Cit2b2lkIGJuX211bF9oaWdoKEJOX1VMT05HICpyLEJOX1VMT05HICphLEJOX1VMT05HICpiLEJOX1VMT05HICpsLGludCBuMiwKKwlCTl9VTE9ORyAqdCk7CitCTl9VTE9ORyBibl9hZGRfcGFydF93b3JkcyhCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEsIGNvbnN0IEJOX1VMT05HICpiLAorCWludCBjbCwgaW50IGRsKTsKK0JOX1VMT05HIGJuX3N1Yl9wYXJ0X3dvcmRzKEJOX1VMT05HICpyLCBjb25zdCBCTl9VTE9ORyAqYSwgY29uc3QgQk5fVUxPTkcgKmIsCisJaW50IGNsLCBpbnQgZGwpOworaW50IGJuX211bF9tb250KEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsIGNvbnN0IEJOX1VMT05HICpucCxjb25zdCBCTl9VTE9ORyAqbjAsIGludCBudW0pOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbGliLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ3MGZiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9saWIuYwpAQCAtMCwwICsxLDg0NSBAQAorLyogY3J5cHRvL2JuL2JuX2xpYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgQk5fREVCVUcKKyMgdW5kZWYgTkRFQlVHIC8qIGF2b2lkIGNvbmZsaWN0aW5nIGRlZmluaXRpb25zICovCisjIGRlZmluZSBOREVCVUcKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgImJuX2xjbC5oIgorCitjb25zdCBjaGFyIEJOX3ZlcnNpb25bXT0iQmlnIE51bWJlciIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCisvKiBUaGlzIHN0dWZmIGFwcGVhcnMgdG8gYmUgY29tcGxldGVseSB1bnVzZWQsIHNvIGlzIGRlcHJlY2F0ZWQgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisvKiBGb3IgYSAzMiBiaXQgbWFjaGluZQorICogMiAtICAgNCA9PSAgMTI4CisgKiAzIC0gICA4ID09ICAyNTYKKyAqIDQgLSAgMTYgPT0gIDUxMgorICogNSAtICAzMiA9PSAxMDI0CisgKiA2IC0gIDY0ID09IDIwNDgKKyAqIDcgLSAxMjggPT0gNDA5NgorICogOCAtIDI1NiA9PSA4MTkyCisgKi8KK3N0YXRpYyBpbnQgYm5fbGltaXRfYml0cz0wOworc3RhdGljIGludCBibl9saW1pdF9udW09ODsgICAgICAgIC8qICgxPDxibl9saW1pdF9iaXRzKSAqLworc3RhdGljIGludCBibl9saW1pdF9iaXRzX2xvdz0wOworc3RhdGljIGludCBibl9saW1pdF9udW1fbG93PTg7ICAgIC8qICgxPDxibl9saW1pdF9iaXRzX2xvdykgKi8KK3N0YXRpYyBpbnQgYm5fbGltaXRfYml0c19oaWdoPTA7CitzdGF0aWMgaW50IGJuX2xpbWl0X251bV9oaWdoPTg7ICAgLyogKDE8PGJuX2xpbWl0X2JpdHNfaGlnaCkgKi8KK3N0YXRpYyBpbnQgYm5fbGltaXRfYml0c19tb250PTA7CitzdGF0aWMgaW50IGJuX2xpbWl0X251bV9tb250PTg7ICAgLyogKDE8PGJuX2xpbWl0X2JpdHNfbW9udCkgKi8KKwordm9pZCBCTl9zZXRfcGFyYW1zKGludCBtdWx0LCBpbnQgaGlnaCwgaW50IGxvdywgaW50IG1vbnQpCisJeworCWlmIChtdWx0ID49IDApCisJCXsKKwkJaWYgKG11bHQgPiAoaW50KShzaXplb2YoaW50KSo4KS0xKQorCQkJbXVsdD1zaXplb2YoaW50KSo4LTE7CisJCWJuX2xpbWl0X2JpdHM9bXVsdDsKKwkJYm5fbGltaXRfbnVtPTE8PG11bHQ7CisJCX0KKwlpZiAoaGlnaCA+PSAwKQorCQl7CisJCWlmIChoaWdoID4gKGludCkoc2l6ZW9mKGludCkqOCktMSkKKwkJCWhpZ2g9c2l6ZW9mKGludCkqOC0xOworCQlibl9saW1pdF9iaXRzX2hpZ2g9aGlnaDsKKwkJYm5fbGltaXRfbnVtX2hpZ2g9MTw8aGlnaDsKKwkJfQorCWlmIChsb3cgPj0gMCkKKwkJeworCQlpZiAobG93ID4gKGludCkoc2l6ZW9mKGludCkqOCktMSkKKwkJCWxvdz1zaXplb2YoaW50KSo4LTE7CisJCWJuX2xpbWl0X2JpdHNfbG93PWxvdzsKKwkJYm5fbGltaXRfbnVtX2xvdz0xPDxsb3c7CisJCX0KKwlpZiAobW9udCA+PSAwKQorCQl7CisJCWlmIChtb250ID4gKGludCkoc2l6ZW9mKGludCkqOCktMSkKKwkJCW1vbnQ9c2l6ZW9mKGludCkqOC0xOworCQlibl9saW1pdF9iaXRzX21vbnQ9bW9udDsKKwkJYm5fbGltaXRfbnVtX21vbnQ9MTw8bW9udDsKKwkJfQorCX0KKworaW50IEJOX2dldF9wYXJhbXMoaW50IHdoaWNoKQorCXsKKwlpZiAgICAgICh3aGljaCA9PSAwKSByZXR1cm4oYm5fbGltaXRfYml0cyk7CisJZWxzZSBpZiAod2hpY2ggPT0gMSkgcmV0dXJuKGJuX2xpbWl0X2JpdHNfaGlnaCk7CisJZWxzZSBpZiAod2hpY2ggPT0gMikgcmV0dXJuKGJuX2xpbWl0X2JpdHNfbG93KTsKKwllbHNlIGlmICh3aGljaCA9PSAzKSByZXR1cm4oYm5fbGltaXRfYml0c19tb250KTsKKwllbHNlIHJldHVybigwKTsKKwl9CisjZW5kaWYKKworY29uc3QgQklHTlVNICpCTl92YWx1ZV9vbmUodm9pZCkKKwl7CisJc3RhdGljIGNvbnN0IEJOX1VMT05HIGRhdGFfb25lPTFMOworCXN0YXRpYyBjb25zdCBCSUdOVU0gY29uc3Rfb25lPXsoQk5fVUxPTkcgKikmZGF0YV9vbmUsMSwxLDAsQk5fRkxHX1NUQVRJQ19EQVRBfTsKKworCXJldHVybigmY29uc3Rfb25lKTsKKwl9CisKK2NoYXIgKkJOX29wdGlvbnModm9pZCkKKwl7CisJc3RhdGljIGludCBpbml0PTA7CisJc3RhdGljIGNoYXIgZGF0YVsxNl07CisKKwlpZiAoIWluaXQpCisJCXsKKwkJaW5pdCsrOworI2lmZGVmIEJOX0xMT05HCisJCUJJT19zbnByaW50ZihkYXRhLHNpemVvZiBkYXRhLCJibiglZCwlZCkiLAorCQkJICAgICAoaW50KXNpemVvZihCTl9VTExPTkcpKjgsKGludClzaXplb2YoQk5fVUxPTkcpKjgpOworI2Vsc2UKKwkJQklPX3NucHJpbnRmKGRhdGEsc2l6ZW9mIGRhdGEsImJuKCVkLCVkKSIsCisJCQkgICAgIChpbnQpc2l6ZW9mKEJOX1VMT05HKSo4LChpbnQpc2l6ZW9mKEJOX1VMT05HKSo4KTsKKyNlbmRpZgorCQl9CisJcmV0dXJuKGRhdGEpOworCX0KKworaW50IEJOX251bV9iaXRzX3dvcmQoQk5fVUxPTkcgbCkKKwl7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYml0c1syNTZdPXsKKwkJMCwxLDIsMiwzLDMsMywzLDQsNCw0LDQsNCw0LDQsNCwKKwkJNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSwKKwkJNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKwkJNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiwKKwkJNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKwkJNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKwkJNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKwkJNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKKwkJOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKwkJOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKwkJOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKwkJOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKwkJOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKwkJOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKwkJOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKwkJOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCw4LDgsOCwKKwkJfTsKKworI2lmIGRlZmluZWQoU0lYVFlfRk9VUl9CSVRfTE9ORykKKwlpZiAobCAmIDB4ZmZmZmZmZmYwMDAwMDAwMEwpCisJCXsKKwkJaWYgKGwgJiAweGZmZmYwMDAwMDAwMDAwMDBMKQorCQkJeworCQkJaWYgKGwgJiAweGZmMDAwMDAwMDAwMDAwMDBMKQorCQkJCXsKKwkJCQlyZXR1cm4oYml0c1soaW50KShsPj41NildKzU2KTsKKwkJCQl9CisJCQllbHNlCXJldHVybihiaXRzWyhpbnQpKGw+PjQ4KV0rNDgpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAobCAmIDB4MDAwMGZmMDAwMDAwMDAwMEwpCisJCQkJeworCQkJCXJldHVybihiaXRzWyhpbnQpKGw+PjQwKV0rNDApOworCQkJCX0KKwkJCWVsc2UJcmV0dXJuKGJpdHNbKGludCkobD4+MzIpXSszMik7CisJCQl9CisJCX0KKwllbHNlCisjZWxzZQorI2lmZGVmIFNJWFRZX0ZPVVJfQklUCisJaWYgKGwgJiAweGZmZmZmZmZmMDAwMDAwMDBMTCkKKwkJeworCQlpZiAobCAmIDB4ZmZmZjAwMDAwMDAwMDAwMExMKQorCQkJeworCQkJaWYgKGwgJiAweGZmMDAwMDAwMDAwMDAwMDBMTCkKKwkJCQl7CisJCQkJcmV0dXJuKGJpdHNbKGludCkobD4+NTYpXSs1Nik7CisJCQkJfQorCQkJZWxzZQlyZXR1cm4oYml0c1soaW50KShsPj40OCldKzQ4KTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKGwgJiAweDAwMDBmZjAwMDAwMDAwMDBMTCkKKwkJCQl7CisJCQkJcmV0dXJuKGJpdHNbKGludCkobD4+NDApXSs0MCk7CisJCQkJfQorCQkJZWxzZQlyZXR1cm4oYml0c1soaW50KShsPj4zMildKzMyKTsKKwkJCX0KKwkJfQorCWVsc2UKKyNlbmRpZgorI2VuZGlmCisJCXsKKyNpZiBkZWZpbmVkKFRISVJUWV9UV09fQklUKSB8fCBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUKSB8fCBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUX0xPTkcpCisJCWlmIChsICYgMHhmZmZmMDAwMEwpCisJCQl7CisJCQlpZiAobCAmIDB4ZmYwMDAwMDBMKQorCQkJCXJldHVybihiaXRzWyhpbnQpKGw+PjI0TCldKzI0KTsKKwkJCWVsc2UJcmV0dXJuKGJpdHNbKGludCkobD4+MTZMKV0rMTYpOworCQkJfQorCQllbHNlCisjZW5kaWYKKwkJCXsKKyNpZiBkZWZpbmVkKFRISVJUWV9UV09fQklUKSB8fCBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUKSB8fCBkZWZpbmVkKFNJWFRZX0ZPVVJfQklUX0xPTkcpCisJCQlpZiAobCAmIDB4ZmYwMEwpCisJCQkJcmV0dXJuKGJpdHNbKGludCkobD4+OCldKzgpOworCQkJZWxzZQkKKyNlbmRpZgorCQkJCXJldHVybihiaXRzWyhpbnQpKGwgICApXSAgKTsKKwkJCX0KKwkJfQorCX0KKworaW50IEJOX251bV9iaXRzKGNvbnN0IEJJR05VTSAqYSkKKwl7CisJaW50IGkgPSBhLT50b3AgLSAxOworCWJuX2NoZWNrX3RvcChhKTsKKworCWlmIChCTl9pc196ZXJvKGEpKSByZXR1cm4gMDsKKwlyZXR1cm4gKChpKkJOX0JJVFMyKSArIEJOX251bV9iaXRzX3dvcmQoYS0+ZFtpXSkpOworCX0KKwordm9pZCBCTl9jbGVhcl9mcmVlKEJJR05VTSAqYSkKKwl7CisJaW50IGk7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm47CisJYm5fY2hlY2tfdG9wKGEpOworCWlmIChhLT5kICE9IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9jbGVhbnNlKGEtPmQsYS0+ZG1heCpzaXplb2YoYS0+ZFswXSkpOworCQlpZiAoIShCTl9nZXRfZmxhZ3MoYSxCTl9GTEdfU1RBVElDX0RBVEEpKSkKKwkJCU9QRU5TU0xfZnJlZShhLT5kKTsKKwkJfQorCWk9Qk5fZ2V0X2ZsYWdzKGEsQk5fRkxHX01BTExPQ0VEKTsKKwlPUEVOU1NMX2NsZWFuc2UoYSxzaXplb2YoQklHTlVNKSk7CisJaWYgKGkpCisJCU9QRU5TU0xfZnJlZShhKTsKKwl9CisKK3ZvaWQgQk5fZnJlZShCSUdOVU0gKmEpCisJeworCWlmIChhID09IE5VTEwpIHJldHVybjsKKwlibl9jaGVja190b3AoYSk7CisJaWYgKChhLT5kICE9IE5VTEwpICYmICEoQk5fZ2V0X2ZsYWdzKGEsQk5fRkxHX1NUQVRJQ19EQVRBKSkpCisJCU9QRU5TU0xfZnJlZShhLT5kKTsKKwlpZiAoYS0+ZmxhZ3MgJiBCTl9GTEdfTUFMTE9DRUQpCisJCU9QRU5TU0xfZnJlZShhKTsKKwllbHNlCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisJCWEtPmZsYWdzfD1CTl9GTEdfRlJFRTsKKyNlbmRpZgorCQlhLT5kID0gTlVMTDsKKwkJfQorCX0KKwordm9pZCBCTl9pbml0KEJJR05VTSAqYSkKKwl7CisJbWVtc2V0KGEsMCxzaXplb2YoQklHTlVNKSk7CisJYm5fY2hlY2tfdG9wKGEpOworCX0KKworQklHTlVNICpCTl9uZXcodm9pZCkKKwl7CisJQklHTlVNICpyZXQ7CisKKwlpZiAoKHJldD0oQklHTlVNICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJJR05VTSkpKSA9PSBOVUxMKQorCQl7CisJCUJOZXJyKEJOX0ZfQk5fTkVXLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0LT5mbGFncz1CTl9GTEdfTUFMTE9DRUQ7CisJcmV0LT50b3A9MDsKKwlyZXQtPm5lZz0wOworCXJldC0+ZG1heD0wOworCXJldC0+ZD1OVUxMOworCWJuX2NoZWNrX3RvcChyZXQpOworCXJldHVybihyZXQpOworCX0KKworLyogVGhpcyBpcyB1c2VkIGJvdGggYnkgYm5fZXhwYW5kMigpIGFuZCBibl9kdXBfZXhwYW5kKCkgKi8KKy8qIFRoZSBjYWxsZXIgTVVTVCBjaGVjayB0aGF0IHdvcmRzID4gYi0+ZG1heCBiZWZvcmUgY2FsbGluZyB0aGlzICovCitzdGF0aWMgQk5fVUxPTkcgKmJuX2V4cGFuZF9pbnRlcm5hbChjb25zdCBCSUdOVU0gKmIsIGludCB3b3JkcykKKwl7CisJQk5fVUxPTkcgKkEsKmEgPSBOVUxMOworCWNvbnN0IEJOX1VMT05HICpCOworCWludCBpOworCisJYm5fY2hlY2tfdG9wKGIpOworCisJaWYgKHdvcmRzID4gKElOVF9NQVgvKDQqQk5fQklUUzIpKSkKKwkJeworCQlCTmVycihCTl9GX0JOX0VYUEFORF9JTlRFUk5BTCxCTl9SX0JJR05VTV9UT09fTE9ORyk7CisJCXJldHVybiBOVUxMOworCQl9CisJaWYgKEJOX2dldF9mbGFncyhiLEJOX0ZMR19TVEFUSUNfREFUQSkpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9FWFBBTkRfSU5URVJOQUwsQk5fUl9FWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJYT1BPShCTl9VTE9ORyAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCTl9VTE9ORykqd29yZHMpOworCWlmIChBID09IE5VTEwpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9FWFBBTkRfSU5URVJOQUwsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKyNpZiAxCisJQj1iLT5kOworCS8qIENoZWNrIGlmIHRoZSBwcmV2aW91cyBudW1iZXIgbmVlZHMgdG8gYmUgY29waWVkICovCisJaWYgKEIgIT0gTlVMTCkKKwkJeworCQlmb3IgKGk9Yi0+dG9wPj4yOyBpPjA7IGktLSxBKz00LEIrPTQpCisJCQl7CisJCQkvKgorCQkJICogVGhlIGZhY3QgdGhhdCB0aGUgbG9vcCBpcyB1bnJvbGxlZAorCQkJICogNC13aXNlIGlzIGEgdHJpYnV0ZSB0byBJbnRlbC4gSXQncworCQkJICogdGhlIG9uZSB0aGF0IGRvZXNuJ3QgaGF2ZSBlbm91Z2gKKwkJCSAqIHJlZ2lzdGVycyB0byBhY2NvbW9kYXRlIG1vcmUgZGF0YS4KKwkJCSAqIEknZCB1bnJvbGwgaXQgOC13aXNlIG90aGVyd2lzZTotKQorCQkJICoKKwkJCSAqCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisJCQkgKi8KKwkJCUJOX1VMT05HIGEwLGExLGEyLGEzOworCQkJYTA9QlswXTsgYTE9QlsxXTsgYTI9QlsyXTsgYTM9QlszXTsKKwkJCUFbMF09YTA7IEFbMV09YTE7IEFbMl09YTI7IEFbM109YTM7CisJCQl9CisJCXN3aXRjaCAoYi0+dG9wJjMpCisJCQl7CisJCWNhc2UgMzoJQVsyXT1CWzJdOworCQljYXNlIDI6CUFbMV09QlsxXTsKKwkJY2FzZSAxOglBWzBdPUJbMF07CisJCWNhc2UgMDogLyogd29ya2Fyb3VuZCBmb3IgdWx0cml4IGNjOiB3aXRob3V0ICdjYXNlIDAnLCB0aGUgb3B0aW1pemVyIGRvZXMKKwkJICAgICAgICAgKiB0aGUgc3dpdGNoIHRhYmxlIGJ5IGRvaW5nIGE9dG9wJjM7IGEtLTsgZ290byBqdW1wX3RhYmxlW2FdOworCQkgICAgICAgICAqIHdoaWNoIGZhaWxzIGZvciB0b3A9PSAwICovCisJCQk7CisJCQl9CisJCX0KKworI2Vsc2UKKwltZW1zZXQoQSwwLHNpemVvZihCTl9VTE9ORykqd29yZHMpOworCW1lbWNweShBLGItPmQsc2l6ZW9mKGItPmRbMF0pKmItPnRvcCk7CisjZW5kaWYKKwkJCisJcmV0dXJuKGEpOworCX0KKworLyogVGhpcyBpcyBhbiBpbnRlcm5hbCBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYm5fZXhwYW5kMigpCisgKiB3aGVuIHRoZXJlIGlzIGEgbmVlZCB0byBjb3B5IEJJR05VTXMgaW5zdGVhZCBvZiBvbmx5IGV4cGFuZGluZyB0aGUKKyAqIGRhdGEgcGFydCwgd2hpbGUgc3RpbGwgZXhwYW5kaW5nIHRoZW0uCisgKiBFc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIG5lZWRpbmcgdG8gZXhwYW5kIEJJR05VTXMgdGhhdCBhcmUgZGVjbGFyZWQKKyAqICdjb25zdCcgYW5kIHNob3VsZCB0aGVyZWZvcmUgbm90IGJlIGNoYW5nZWQuCisgKiBUaGUgcmVhc29uIHRvIHVzZSB0aGlzIGluc3RlYWQgb2YgYSBCTl9kdXAoKSBmb2xsb3dlZCBieSBhIGJuX2V4cGFuZDIoKQorICogaXMgbWVtb3J5IGFsbG9jYXRpb24gb3ZlcmhlYWQuICBBIEJOX2R1cCgpIGZvbGxvd2VkIGJ5IGEgYm5fZXhwYW5kMigpCisgKiB3aWxsIGFsbG9jYXRlIG5ldyBtZW1vcnkgZm9yIHRoZSBCSUdOVU0gZGF0YSB0d2ljZSwgYW5kIGZyZWUgaXQgb25jZSwKKyAqIHdoaWxlIGJuX2R1cF9leHBhbmQoKSBtYWtlcyBzdXJlIGFsbG9jYXRpb24gaXMgbWFkZSBvbmx5IG9uY2UuCisgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK0JJR05VTSAqYm5fZHVwX2V4cGFuZChjb25zdCBCSUdOVU0gKmIsIGludCB3b3JkcykKKwl7CisJQklHTlVNICpyID0gTlVMTDsKKworCWJuX2NoZWNrX3RvcChiKTsKKworCS8qIFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgd29yayBpZgorCSAqICAgICAgd29yZHMgPD0gYi0+ZG1heCAmJiB0b3AgPCB3b3JkcworCSAqIGJlY2F1c2UgQk5fZHVwKCkgZG9lcyBub3QgcHJlc2VydmUgJ2RtYXgnIQorCSAqIChCdXQgYm5fZHVwX2V4cGFuZCgpIGlzIG5vdCB1c2VkIGFueXdoZXJlIHlldC4pCisJICovCisKKwlpZiAod29yZHMgPiBiLT5kbWF4KQorCQl7CisJCUJOX1VMT05HICphID0gYm5fZXhwYW5kX2ludGVybmFsKGIsIHdvcmRzKTsKKworCQlpZiAoYSkKKwkJCXsKKwkJCXIgPSBCTl9uZXcoKTsKKwkJCWlmIChyKQorCQkJCXsKKwkJCQlyLT50b3AgPSBiLT50b3A7CisJCQkJci0+ZG1heCA9IHdvcmRzOworCQkJCXItPm5lZyA9IGItPm5lZzsKKwkJCQlyLT5kID0gYTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCS8qIHIgPT0gTlVMTCwgQk5fbmV3IGZhaWx1cmUgKi8KKwkJCQlPUEVOU1NMX2ZyZWUoYSk7CisJCQkJfQorCQkJfQorCQkvKiBJZiBhID09IE5VTEwsIHRoZXJlIHdhcyBhbiBlcnJvciBpbiBhbGxvY2F0aW9uIGluCisJCSAgIGJuX2V4cGFuZF9pbnRlcm5hbCgpLCBhbmQgTlVMTCBzaG91bGQgYmUgcmV0dXJuZWQgKi8KKwkJfQorCWVsc2UKKwkJeworCQlyID0gQk5fZHVwKGIpOworCQl9CisKKwlibl9jaGVja190b3Aocik7CisJcmV0dXJuIHI7CisJfQorI2VuZGlmCisKKy8qIFRoaXMgaXMgYW4gaW50ZXJuYWwgZnVuY3Rpb24gdGhhdCBzaG91bGQgbm90IGJlIHVzZWQgaW4gYXBwbGljYXRpb25zLgorICogSXQgZW5zdXJlcyB0aGF0ICdiJyBoYXMgZW5vdWdoIHJvb20gZm9yIGEgJ3dvcmRzJyB3b3JkIG51bWJlcgorICogYW5kIGluaXRpYWxpc2VzIGFueSB1bnVzZWQgcGFydCBvZiBiLT5kIHdpdGggbGVhZGluZyB6ZXJvcy4KKyAqIEl0IGlzIG1vc3RseSB1c2VkIGJ5IHRoZSB2YXJpb3VzIEJJR05VTSByb3V0aW5lcy4gSWYgdGhlcmUgaXMgYW4gZXJyb3IsCisgKiBOVUxMIGlzIHJldHVybmVkLiBJZiBub3QsICdiJyBpcyByZXR1cm5lZC4gKi8KKworQklHTlVNICpibl9leHBhbmQyKEJJR05VTSAqYiwgaW50IHdvcmRzKQorCXsKKwlibl9jaGVja190b3AoYik7CisKKwlpZiAod29yZHMgPiBiLT5kbWF4KQorCQl7CisJCUJOX1VMT05HICphID0gYm5fZXhwYW5kX2ludGVybmFsKGIsIHdvcmRzKTsKKwkJaWYoIWEpIHJldHVybiBOVUxMOworCQlpZihiLT5kKSBPUEVOU1NMX2ZyZWUoYi0+ZCk7CisJCWItPmQ9YTsKKwkJYi0+ZG1heD13b3JkczsKKwkJfQorCisvKiBOb25lIG9mIHRoaXMgc2hvdWxkIGJlIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHdoYXQgYi0+dG9wIG1lYW5zISAqLworI2lmIDAKKwkvKiBOQjogYm5fd2V4cGFuZCgpIGNhbGxzIHRoaXMgb25seSBpZiB0aGUgQklHTlVNIHJlYWxseSBoYXMgdG8gZ3JvdyAqLworCWlmIChiLT50b3AgPCBiLT5kbWF4KQorCQl7CisJCWludCBpOworCQlCTl9VTE9ORyAqQSA9ICYoYi0+ZFtiLT50b3BdKTsKKwkJZm9yIChpPShiLT5kbWF4IC0gYi0+dG9wKT4+MzsgaT4wOyBpLS0sQSs9OCkKKwkJCXsKKwkJCUFbMF09MDsgQVsxXT0wOyBBWzJdPTA7IEFbM109MDsKKwkJCUFbNF09MDsgQVs1XT0wOyBBWzZdPTA7IEFbN109MDsKKwkJCX0KKwkJZm9yIChpPShiLT5kbWF4IC0gYi0+dG9wKSY3OyBpPjA7IGktLSxBKyspCisJCQlBWzBdPTA7CisJCWFzc2VydChBID09ICYoYi0+ZFtiLT5kbWF4XSkpOworCQl9CisjZW5kaWYKKwlibl9jaGVja190b3AoYik7CisJcmV0dXJuIGI7CisJfQorCitCSUdOVU0gKkJOX2R1cChjb25zdCBCSUdOVU0gKmEpCisJeworCUJJR05VTSAqdDsKKworCWlmIChhID09IE5VTEwpIHJldHVybiBOVUxMOworCWJuX2NoZWNrX3RvcChhKTsKKworCXQgPSBCTl9uZXcoKTsKKwlpZiAodCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKwlpZighQk5fY29weSh0LCBhKSkKKwkJeworCQlCTl9mcmVlKHQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWJuX2NoZWNrX3RvcCh0KTsKKwlyZXR1cm4gdDsKKwl9CisKK0JJR05VTSAqQk5fY29weShCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYikKKwl7CisJaW50IGk7CisJQk5fVUxPTkcgKkE7CisJY29uc3QgQk5fVUxPTkcgKkI7CisKKwlibl9jaGVja190b3AoYik7CisKKwlpZiAoYSA9PSBiKSByZXR1cm4oYSk7CisJaWYgKGJuX3dleHBhbmQoYSxiLT50b3ApID09IE5VTEwpIHJldHVybihOVUxMKTsKKworI2lmIDEKKwlBPWEtPmQ7CisJQj1iLT5kOworCWZvciAoaT1iLT50b3A+PjI7IGk+MDsgaS0tLEErPTQsQis9NCkKKwkJeworCQlCTl9VTE9ORyBhMCxhMSxhMixhMzsKKwkJYTA9QlswXTsgYTE9QlsxXTsgYTI9QlsyXTsgYTM9QlszXTsKKwkJQVswXT1hMDsgQVsxXT1hMTsgQVsyXT1hMjsgQVszXT1hMzsKKwkJfQorCXN3aXRjaCAoYi0+dG9wJjMpCisJCXsKKwkJY2FzZSAzOiBBWzJdPUJbMl07CisJCWNhc2UgMjogQVsxXT1CWzFdOworCQljYXNlIDE6IEFbMF09QlswXTsKKwkJY2FzZSAwOiA7IC8qIHVsdHJpeCBjYyB3b3JrYXJvdW5kLCBzZWUgY29tbWVudHMgaW4gYm5fZXhwYW5kX2ludGVybmFsICovCisJCX0KKyNlbHNlCisJbWVtY3B5KGEtPmQsYi0+ZCxzaXplb2YoYi0+ZFswXSkqYi0+dG9wKTsKKyNlbmRpZgorCisJYS0+dG9wPWItPnRvcDsKKwlhLT5uZWc9Yi0+bmVnOworCWJuX2NoZWNrX3RvcChhKTsKKwlyZXR1cm4oYSk7CisJfQorCit2b2lkIEJOX3N3YXAoQklHTlVNICphLCBCSUdOVU0gKmIpCisJeworCWludCBmbGFnc19vbGRfYSwgZmxhZ3Nfb2xkX2I7CisJQk5fVUxPTkcgKnRtcF9kOworCWludCB0bXBfdG9wLCB0bXBfZG1heCwgdG1wX25lZzsKKwkKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKGIpOworCisJZmxhZ3Nfb2xkX2EgPSBhLT5mbGFnczsKKwlmbGFnc19vbGRfYiA9IGItPmZsYWdzOworCisJdG1wX2QgPSBhLT5kOworCXRtcF90b3AgPSBhLT50b3A7CisJdG1wX2RtYXggPSBhLT5kbWF4OworCXRtcF9uZWcgPSBhLT5uZWc7CisJCisJYS0+ZCA9IGItPmQ7CisJYS0+dG9wID0gYi0+dG9wOworCWEtPmRtYXggPSBiLT5kbWF4OworCWEtPm5lZyA9IGItPm5lZzsKKwkKKwliLT5kID0gdG1wX2Q7CisJYi0+dG9wID0gdG1wX3RvcDsKKwliLT5kbWF4ID0gdG1wX2RtYXg7CisJYi0+bmVnID0gdG1wX25lZzsKKwkKKwlhLT5mbGFncyA9IChmbGFnc19vbGRfYSAmIEJOX0ZMR19NQUxMT0NFRCkgfCAoZmxhZ3Nfb2xkX2IgJiBCTl9GTEdfU1RBVElDX0RBVEEpOworCWItPmZsYWdzID0gKGZsYWdzX29sZF9iICYgQk5fRkxHX01BTExPQ0VEKSB8IChmbGFnc19vbGRfYSAmIEJOX0ZMR19TVEFUSUNfREFUQSk7CisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChiKTsKKwl9CisKK3ZvaWQgQk5fY2xlYXIoQklHTlVNICphKQorCXsKKwlibl9jaGVja190b3AoYSk7CisJaWYgKGEtPmQgIT0gTlVMTCkKKwkJbWVtc2V0KGEtPmQsMCxhLT5kbWF4KnNpemVvZihhLT5kWzBdKSk7CisJYS0+dG9wPTA7CisJYS0+bmVnPTA7CisJfQorCitCTl9VTE9ORyBCTl9nZXRfd29yZChjb25zdCBCSUdOVU0gKmEpCisJeworCWlmIChhLT50b3AgPiAxKQorCQlyZXR1cm4gQk5fTUFTSzI7CisJZWxzZSBpZiAoYS0+dG9wID09IDEpCisJCXJldHVybiBhLT5kWzBdOworCS8qIGEtPnRvcCA9PSAwICovCisJcmV0dXJuIDA7CisJfQorCitpbnQgQk5fc2V0X3dvcmQoQklHTlVNICphLCBCTl9VTE9ORyB3KQorCXsKKwlibl9jaGVja190b3AoYSk7CisJaWYgKGJuX2V4cGFuZChhLChpbnQpc2l6ZW9mKEJOX1VMT05HKSo4KSA9PSBOVUxMKSByZXR1cm4oMCk7CisJYS0+bmVnID0gMDsKKwlhLT5kWzBdID0gdzsKKwlhLT50b3AgPSAodyA/IDEgOiAwKTsKKwlibl9jaGVja190b3AoYSk7CisJcmV0dXJuKDEpOworCX0KKworQklHTlVNICpCTl9iaW4yYm4oY29uc3QgdW5zaWduZWQgY2hhciAqcywgaW50IGxlbiwgQklHTlVNICpyZXQpCisJeworCXVuc2lnbmVkIGludCBpLG07CisJdW5zaWduZWQgaW50IG47CisJQk5fVUxPTkcgbDsKKwlCSUdOVU0gICpibiA9IE5VTEw7CisKKwlpZiAocmV0ID09IE5VTEwpCisJCXJldCA9IGJuID0gQk5fbmV3KCk7CisJaWYgKHJldCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJYm5fY2hlY2tfdG9wKHJldCk7CisJbD0wOworCW49bGVuOworCWlmIChuID09IDApCisJCXsKKwkJcmV0LT50b3A9MDsKKwkJcmV0dXJuKHJldCk7CisJCX0KKwlpPSgobi0xKS9CTl9CWVRFUykrMTsKKwltPSgobi0xKSUoQk5fQllURVMpKTsKKwlpZiAoYm5fd2V4cGFuZChyZXQsIChpbnQpaSkgPT0gTlVMTCkKKwkJeworCQlpZiAoYm4pIEJOX2ZyZWUoYm4pOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCXJldC0+dG9wPWk7CisJcmV0LT5uZWc9MDsKKwl3aGlsZSAobi0tKQorCQl7CisJCWw9KGw8PDhMKXwgKihzKyspOworCQlpZiAobS0tID09IDApCisJCQl7CisJCQlyZXQtPmRbLS1pXT1sOworCQkJbD0wOworCQkJbT1CTl9CWVRFUy0xOworCQkJfQorCQl9CisJLyogbmVlZCB0byBjYWxsIHRoaXMgZHVlIHRvIGNsZWFyIGJ5dGUgYXQgdG9wIGlmIGF2b2lkaW5nCisJICogaGF2aW5nIHRoZSB0b3AgYml0IHNldCAoLXZlIG51bWJlcikgKi8KKwlibl9jb3JyZWN0X3RvcChyZXQpOworCXJldHVybihyZXQpOworCX0KKworLyogaWdub3JlIG5lZ2F0aXZlICovCitpbnQgQk5fYm4yYmluKGNvbnN0IEJJR05VTSAqYSwgdW5zaWduZWQgY2hhciAqdG8pCisJeworCWludCBuLGk7CisJQk5fVUxPTkcgbDsKKworCWJuX2NoZWNrX3RvcChhKTsKKwluPWk9Qk5fbnVtX2J5dGVzKGEpOworCXdoaWxlIChpLS0pCisJCXsKKwkJbD1hLT5kW2kvQk5fQllURVNdOworCQkqKHRvKyspPSh1bnNpZ25lZCBjaGFyKShsPj4oOCooaSVCTl9CWVRFUykpKSYweGZmOworCQl9CisJcmV0dXJuKG4pOworCX0KKworaW50IEJOX3VjbXAoY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpCisJeworCWludCBpOworCUJOX1VMT05HIHQxLHQyLCphcCwqYnA7CisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKGIpOworCisJaT1hLT50b3AtYi0+dG9wOworCWlmIChpICE9IDApIHJldHVybihpKTsKKwlhcD1hLT5kOworCWJwPWItPmQ7CisJZm9yIChpPWEtPnRvcC0xOyBpPj0wOyBpLS0pCisJCXsKKwkJdDE9IGFwW2ldOworCQl0Mj0gYnBbaV07CisJCWlmICh0MSAhPSB0MikKKwkJCXJldHVybigodDEgPiB0MikgPyAxIDogLTEpOworCQl9CisJcmV0dXJuKDApOworCX0KKworaW50IEJOX2NtcChjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYikKKwl7CisJaW50IGk7CisJaW50IGd0LGx0OworCUJOX1VMT05HIHQxLHQyOworCisJaWYgKChhID09IE5VTEwpIHx8IChiID09IE5VTEwpKQorCQl7CisJCWlmIChhICE9IE5VTEwpCisJCQlyZXR1cm4oLTEpOworCQllbHNlIGlmIChiICE9IE5VTEwpCisJCQlyZXR1cm4oMSk7CisJCWVsc2UKKwkJCXJldHVybigwKTsKKwkJfQorCisJYm5fY2hlY2tfdG9wKGEpOworCWJuX2NoZWNrX3RvcChiKTsKKworCWlmIChhLT5uZWcgIT0gYi0+bmVnKQorCQl7CisJCWlmIChhLT5uZWcpCisJCQlyZXR1cm4oLTEpOworCQllbHNlCXJldHVybigxKTsKKwkJfQorCWlmIChhLT5uZWcgPT0gMCkKKwkJeyBndD0xOyBsdD0gLTE7IH0KKwllbHNlCXsgZ3Q9IC0xOyBsdD0xOyB9CisKKwlpZiAoYS0+dG9wID4gYi0+dG9wKSByZXR1cm4oZ3QpOworCWlmIChhLT50b3AgPCBiLT50b3ApIHJldHVybihsdCk7CisJZm9yIChpPWEtPnRvcC0xOyBpPj0wOyBpLS0pCisJCXsKKwkJdDE9YS0+ZFtpXTsKKwkJdDI9Yi0+ZFtpXTsKKwkJaWYgKHQxID4gdDIpIHJldHVybihndCk7CisJCWlmICh0MSA8IHQyKSByZXR1cm4obHQpOworCQl9CisJcmV0dXJuKDApOworCX0KKworaW50IEJOX3NldF9iaXQoQklHTlVNICphLCBpbnQgbikKKwl7CisJaW50IGksaixrOworCisJaWYgKG4gPCAwKQorCQlyZXR1cm4gMDsKKworCWk9bi9CTl9CSVRTMjsKKwlqPW4lQk5fQklUUzI7CisJaWYgKGEtPnRvcCA8PSBpKQorCQl7CisJCWlmIChibl93ZXhwYW5kKGEsaSsxKSA9PSBOVUxMKSByZXR1cm4oMCk7CisJCWZvcihrPWEtPnRvcDsgazxpKzE7IGsrKykKKwkJCWEtPmRba109MDsKKwkJYS0+dG9wPWkrMTsKKwkJfQorCisJYS0+ZFtpXXw9KCgoQk5fVUxPTkcpMSk8PGopOworCWJuX2NoZWNrX3RvcChhKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgQk5fY2xlYXJfYml0KEJJR05VTSAqYSwgaW50IG4pCisJeworCWludCBpLGo7CisKKwlibl9jaGVja190b3AoYSk7CisJaWYgKG4gPCAwKSByZXR1cm4gMDsKKworCWk9bi9CTl9CSVRTMjsKKwlqPW4lQk5fQklUUzI7CisJaWYgKGEtPnRvcCA8PSBpKSByZXR1cm4oMCk7CisKKwlhLT5kW2ldJj0ofigoKEJOX1VMT05HKTEpPDxqKSk7CisJYm5fY29ycmVjdF90b3AoYSk7CisJcmV0dXJuKDEpOworCX0KKworaW50IEJOX2lzX2JpdF9zZXQoY29uc3QgQklHTlVNICphLCBpbnQgbikKKwl7CisJaW50IGksajsKKworCWJuX2NoZWNrX3RvcChhKTsKKwlpZiAobiA8IDApIHJldHVybiAwOworCWk9bi9CTl9CSVRTMjsKKwlqPW4lQk5fQklUUzI7CisJaWYgKGEtPnRvcCA8PSBpKSByZXR1cm4gMDsKKwlyZXR1cm4gKGludCkoKChhLT5kW2ldKT4+aikmKChCTl9VTE9ORykxKSk7CisJfQorCitpbnQgQk5fbWFza19iaXRzKEJJR05VTSAqYSwgaW50IG4pCisJeworCWludCBiLHc7CisKKwlibl9jaGVja190b3AoYSk7CisJaWYgKG4gPCAwKSByZXR1cm4gMDsKKworCXc9bi9CTl9CSVRTMjsKKwliPW4lQk5fQklUUzI7CisJaWYgKHcgPj0gYS0+dG9wKSByZXR1cm4gMDsKKwlpZiAoYiA9PSAwKQorCQlhLT50b3A9dzsKKwllbHNlCisJCXsKKwkJYS0+dG9wPXcrMTsKKwkJYS0+ZFt3XSY9IH4oQk5fTUFTSzI8PGIpOworCQl9CisJYm5fY29ycmVjdF90b3AoYSk7CisJcmV0dXJuKDEpOworCX0KKwordm9pZCBCTl9zZXRfbmVnYXRpdmUoQklHTlVNICphLCBpbnQgYikKKwl7CisJaWYgKGIgJiYgIUJOX2lzX3plcm8oYSkpCisJCWEtPm5lZyA9IDE7CisJZWxzZQorCQlhLT5uZWcgPSAwOworCX0KKworaW50IGJuX2NtcF93b3Jkcyhjb25zdCBCTl9VTE9ORyAqYSwgY29uc3QgQk5fVUxPTkcgKmIsIGludCBuKQorCXsKKwlpbnQgaTsKKwlCTl9VTE9ORyBhYSxiYjsKKworCWFhPWFbbi0xXTsKKwliYj1iW24tMV07CisJaWYgKGFhICE9IGJiKSByZXR1cm4oKGFhID4gYmIpPzE6LTEpOworCWZvciAoaT1uLTI7IGk+PTA7IGktLSkKKwkJeworCQlhYT1hW2ldOworCQliYj1iW2ldOworCQlpZiAoYWEgIT0gYmIpIHJldHVybigoYWEgPiBiYik/MTotMSk7CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCisvKiBIZXJlIGZvbGxvd3MgYSBzcGVjaWFsaXNlZCB2YXJpYW50cyBvZiBibl9jbXBfd29yZHMoKS4gIEl0IGhhcyB0aGUKKyAgIHByb3BlcnR5IG9mIHBlcmZvcm1pbmcgdGhlIG9wZXJhdGlvbiBvbiBhcnJheXMgb2YgZGlmZmVyZW50IHNpemVzLgorICAgVGhlIHNpemVzIG9mIHRob3NlIGFycmF5cyBpcyBleHByZXNzZWQgdGhyb3VnaCBjbCwgd2hpY2ggaXMgdGhlCisgICBjb21tb24gbGVuZ3RoICggYmFzaWNhbGwsIG1pbihsZW4oYSksbGVuKGIpKSApLCBhbmQgZGwsIHdoaWNoIGlzIHRoZQorICAgZGVsdGEgYmV0d2VlbiB0aGUgdHdvIGxlbmd0aHMsIGNhbGN1bGF0ZWQgYXMgbGVuKGEpLWxlbihiKS4KKyAgIEFsbCBsZW5ndGhzIGFyZSB0aGUgbnVtYmVyIG9mIEJOX1VMT05Hcy4uLiAgKi8KKworaW50IGJuX2NtcF9wYXJ0X3dvcmRzKGNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwKKwlpbnQgY2wsIGludCBkbCkKKwl7CisJaW50IG4saTsKKwluID0gY2wtMTsKKworCWlmIChkbCA8IDApCisJCXsKKwkJZm9yIChpPWRsOyBpPDA7IGkrKykKKwkJCXsKKwkJCWlmIChiW24taV0gIT0gMCkKKwkJCQlyZXR1cm4gLTE7IC8qIGEgPCBiICovCisJCQl9CisJCX0KKwlpZiAoZGwgPiAwKQorCQl7CisJCWZvciAoaT1kbDsgaT4wOyBpLS0pCisJCQl7CisJCQlpZiAoYVtuK2ldICE9IDApCisJCQkJcmV0dXJuIDE7IC8qIGEgPiBiICovCisJCQl9CisJCX0KKwlyZXR1cm4gYm5fY21wX3dvcmRzKGEsYixjbCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX21vZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDZkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbW9kLmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qIGNyeXB0by9ibi9ibl9tb2QuYyAqLworLyogSW5jbHVkZXMgY29kZSB3cml0dGVuIGJ5IExlbmthIEZpYmlrb3ZhIDxmaWJpa292YUBleHAtbWF0aC51bmktZXNzZW4uZGU+CisgKiBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworCisjaWYgMCAvKiBub3cganVzdCBhICNkZWZpbmUgKi8KK2ludCBCTl9tb2QoQklHTlVNICpyZW0sIGNvbnN0IEJJR05VTSAqbSwgY29uc3QgQklHTlVNICpkLCBCTl9DVFggKmN0eCkKKwl7CisJcmV0dXJuKEJOX2RpdihOVUxMLHJlbSxtLGQsY3R4KSk7CisJLyogbm90ZSB0aGF0ICByZW0tPm5lZyA9PSBtLT5uZWcgICh1bmxlc3MgdGhlIHJlbWFpbmRlciBpcyB6ZXJvKSAqLworCX0KKyNlbmRpZgorCisKK2ludCBCTl9ubm1vZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqbSwgY29uc3QgQklHTlVNICpkLCBCTl9DVFggKmN0eCkKKwl7CisJLyogbGlrZSBCTl9tb2QsIGJ1dCByZXR1cm5zIG5vbi1uZWdhdGl2ZSByZW1haW5kZXIKKwkgKiAoaS5lLiwgIDAgPD0gciA8IHxkfCAgYWx3YXlzIGhvbGRzKSAqLworCisJaWYgKCEoQk5fbW9kKHIsbSxkLGN0eCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXItPm5lZykKKwkJcmV0dXJuIDE7CisJLyogbm93ICAgLXxkfCA8IHIgPCAwLCAgc28gd2UgaGF2ZSB0byBzZXQgIHIgOj0gciArIHxkfCAqLworCXJldHVybiAoZC0+bmVnID8gQk5fc3ViIDogQk5fYWRkKShyLCByLCBkKTsKK30KKworCitpbnQgQk5fbW9kX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoIUJOX2FkZChyLCBhLCBiKSkgcmV0dXJuIDA7CisJcmV0dXJuIEJOX25ubW9kKHIsIHIsIG0sIGN0eCk7CisJfQorCisKKy8qIEJOX21vZF9hZGQgdmFyaWFudCB0aGF0IG1heSBiZSB1c2VkIGlmIGJvdGggIGEgIGFuZCAgYiAgYXJlIG5vbi1uZWdhdGl2ZQorICogYW5kIGxlc3MgdGhhbiAgbSAqLworaW50IEJOX21vZF9hZGRfcXVpY2soQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgY29uc3QgQklHTlVNICptKQorCXsKKwlpZiAoIUJOX3VhZGQociwgYSwgYikpIHJldHVybiAwOworCWlmIChCTl91Y21wKHIsIG0pID49IDApCisJCXJldHVybiBCTl91c3ViKHIsIHIsIG0pOworCXJldHVybiAxOworCX0KKworCitpbnQgQk5fbW9kX3N1YihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoIUJOX3N1YihyLCBhLCBiKSkgcmV0dXJuIDA7CisJcmV0dXJuIEJOX25ubW9kKHIsIHIsIG0sIGN0eCk7CisJfQorCisKKy8qIEJOX21vZF9zdWIgdmFyaWFudCB0aGF0IG1heSBiZSB1c2VkIGlmIGJvdGggIGEgIGFuZCAgYiAgYXJlIG5vbi1uZWdhdGl2ZQorICogYW5kIGxlc3MgdGhhbiAgbSAqLworaW50IEJOX21vZF9zdWJfcXVpY2soQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgY29uc3QgQklHTlVNICptKQorCXsKKwlpZiAoIUJOX3N1YihyLCBhLCBiKSkgcmV0dXJuIDA7CisJaWYgKHItPm5lZykKKwkJcmV0dXJuIEJOX2FkZChyLCByLCBtKTsKKwlyZXR1cm4gMTsKKwl9CisKKworLyogc2xvdyBidXQgd29ya3MgKi8KK2ludCBCTl9tb2RfbXVsKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqbSwKKwlCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNICp0OworCWludCByZXQ9MDsKKworCWJuX2NoZWNrX3RvcChhKTsKKwlibl9jaGVja190b3AoYik7CisJYm5fY2hlY2tfdG9wKG0pOworCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJaWYgKCh0ID0gQk5fQ1RYX2dldChjdHgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoYSA9PSBiKQorCQl7IGlmICghQk5fc3FyKHQsYSxjdHgpKSBnb3RvIGVycjsgfQorCWVsc2UKKwkJeyBpZiAoIUJOX211bCh0LGEsYixjdHgpKSBnb3RvIGVycjsgfQorCWlmICghQk5fbm5tb2Qocix0LG0sY3R4KSkgZ290byBlcnI7CisJYm5fY2hlY2tfdG9wKHIpOworCXJldD0xOworZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKworaW50IEJOX21vZF9zcXIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpCisJeworCWlmICghQk5fc3FyKHIsIGEsIGN0eCkpIHJldHVybiAwOworCS8qIHItPm5lZyA9PSAwLCAgdGh1cyB3ZSBkb24ndCBuZWVkIEJOX25ubW9kICovCisJcmV0dXJuIEJOX21vZChyLCByLCBtLCBjdHgpOworCX0KKworCitpbnQgQk5fbW9kX2xzaGlmdDEoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpCisJeworCWlmICghQk5fbHNoaWZ0MShyLCBhKSkgcmV0dXJuIDA7CisJYm5fY2hlY2tfdG9wKHIpOworCXJldHVybiBCTl9ubm1vZChyLCByLCBtLCBjdHgpOworCX0KKworCisvKiBCTl9tb2RfbHNoaWZ0MSB2YXJpYW50IHRoYXQgbWF5IGJlIHVzZWQgaWYgIGEgIGlzIG5vbi1uZWdhdGl2ZQorICogYW5kIGxlc3MgdGhhbiAgbSAqLworaW50IEJOX21vZF9sc2hpZnQxX3F1aWNrKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm0pCisJeworCWlmICghQk5fbHNoaWZ0MShyLCBhKSkgcmV0dXJuIDA7CisJYm5fY2hlY2tfdG9wKHIpOworCWlmIChCTl9jbXAociwgbSkgPj0gMCkKKwkJcmV0dXJuIEJOX3N1YihyLCByLCBtKTsKKwlyZXR1cm4gMTsKKwl9CisKKworaW50IEJOX21vZF9sc2hpZnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGludCBuLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmFic19tID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKCFCTl9ubm1vZChyLCBhLCBtLCBjdHgpKSByZXR1cm4gMDsKKworCWlmIChtLT5uZWcpCisJCXsKKwkJYWJzX20gPSBCTl9kdXAobSk7CisJCWlmIChhYnNfbSA9PSBOVUxMKSByZXR1cm4gMDsKKwkJYWJzX20tPm5lZyA9IDA7CisJCX0KKwkKKwlyZXQgPSBCTl9tb2RfbHNoaWZ0X3F1aWNrKHIsIHIsIG4sIChhYnNfbSA/IGFic19tIDogbSkpOworCWJuX2NoZWNrX3RvcChyKTsKKworCWlmIChhYnNfbSkKKwkJQk5fZnJlZShhYnNfbSk7CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogQk5fbW9kX2xzaGlmdCB2YXJpYW50IHRoYXQgbWF5IGJlIHVzZWQgaWYgIGEgIGlzIG5vbi1uZWdhdGl2ZQorICogYW5kIGxlc3MgdGhhbiAgbSAqLworaW50IEJOX21vZF9sc2hpZnRfcXVpY2soQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGludCBuLCBjb25zdCBCSUdOVU0gKm0pCisJeworCWlmIChyICE9IGEpCisJCXsKKwkJaWYgKEJOX2NvcHkociwgYSkgPT0gTlVMTCkgcmV0dXJuIDA7CisJCX0KKworCXdoaWxlIChuID4gMCkKKwkJeworCQlpbnQgbWF4X3NoaWZ0OworCQkKKwkJLyogMCA8IHIgPCBtICovCisJCW1heF9zaGlmdCA9IEJOX251bV9iaXRzKG0pIC0gQk5fbnVtX2JpdHMocik7CisJCS8qIG1heF9zaGlmdCA+PSAwICovCisKKwkJaWYgKG1heF9zaGlmdCA8IDApCisJCQl7CisJCQlCTmVycihCTl9GX0JOX01PRF9MU0hJRlRfUVVJQ0ssIEJOX1JfSU5QVVRfTk9UX1JFRFVDRUQpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJaWYgKG1heF9zaGlmdCA+IG4pCisJCQltYXhfc2hpZnQgPSBuOworCisJCWlmIChtYXhfc2hpZnQpCisJCQl7CisJCQlpZiAoIUJOX2xzaGlmdChyLCByLCBtYXhfc2hpZnQpKSByZXR1cm4gMDsKKwkJCW4gLT0gbWF4X3NoaWZ0OworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoIUJOX2xzaGlmdDEociwgcikpIHJldHVybiAwOworCQkJLS1uOworCQkJfQorCisJCS8qIEJOX251bV9iaXRzKHIpIDw9IEJOX251bV9iaXRzKG0pICovCisKKwkJaWYgKEJOX2NtcChyLCBtKSA+PSAwKSAKKwkJCXsKKwkJCWlmICghQk5fc3ViKHIsIHIsIG0pKSByZXR1cm4gMDsKKwkJCX0KKwkJfQorCWJuX2NoZWNrX3RvcChyKTsKKwkKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbW9udC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX21vbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjI0NjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX21vbnQuYwpAQCAtMCwwICsxLDU2NyBAQAorLyogY3J5cHRvL2JuL2JuX21vbnQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qCisgKiBEZXRhaWxzIGFib3V0IE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gYWxnb3JpdGhtcyBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly9zZWN1cml0eS5lY2Uub3JzdC5lZHUvcHVibGljYXRpb25zLmh0bWwsIGUuZy4KKyAqIGh0dHA6Ly9zZWN1cml0eS5lY2Uub3JzdC5lZHUva29jL3BhcGVycy9qMzdhY21vbi5wZGYgYW5kCisgKiBzZWN0aW9ucyAzLjggYW5kIDQuMiBpbiBodHRwOi8vc2VjdXJpdHkuZWNlLm9yc3QuZWR1L2tvYy9wYXBlcnMvcjAxcnNhc3cucGRmCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworI2RlZmluZSBNT05UX1dPUkQgLyogdXNlIHRoZSBmYXN0ZXIgd29yZC1iYXNlZCBhbGdvcml0aG0gKi8KKworI2lmZGVmIE1PTlRfV09SRAorc3RhdGljIGludCBCTl9mcm9tX21vbnRnb21lcnlfd29yZChCSUdOVU0gKnJldCwgQklHTlVNICpyLCBCTl9NT05UX0NUWCAqbW9udCk7CisjZW5kaWYKKworaW50IEJOX21vZF9tdWxfbW9udGdvbWVyeShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCQkJICBCTl9NT05UX0NUWCAqbW9udCwgQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqdG1wOworCWludCByZXQ9MDsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfQk5fQVNNX01PTlQpICYmIGRlZmluZWQoTU9OVF9XT1JEKQorCWludCBudW0gPSBtb250LT5OLnRvcDsKKworCWlmIChudW0+MSAmJiBhLT50b3A9PW51bSAmJiBiLT50b3A9PW51bSkKKwkJeworCQlpZiAoYm5fd2V4cGFuZChyLG51bSkgPT0gTlVMTCkgcmV0dXJuKDApOworCQlpZiAoYm5fbXVsX21vbnQoci0+ZCxhLT5kLGItPmQsbW9udC0+Ti5kLG1vbnQtPm4wLG51bSkpCisJCQl7CisJCQlyLT5uZWcgPSBhLT5uZWdeYi0+bmVnOworCQkJci0+dG9wID0gbnVtOworCQkJYm5fY29ycmVjdF90b3Aocik7CisJCQlyZXR1cm4oMSk7CisJCQl9CisJCX0KKyNlbmRpZgorCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJdG1wID0gQk5fQ1RYX2dldChjdHgpOworCWlmICh0bXAgPT0gTlVMTCkgZ290byBlcnI7CisKKwlibl9jaGVja190b3AodG1wKTsKKwlpZiAoYSA9PSBiKQorCQl7CisJCWlmICghQk5fc3FyKHRtcCxhLGN0eCkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghQk5fbXVsKHRtcCxhLGIsY3R4KSkgZ290byBlcnI7CisJCX0KKwkvKiByZWR1Y2UgZnJvbSBhUlIgdG8gYVIgKi8KKyNpZmRlZiBNT05UX1dPUkQKKwlpZiAoIUJOX2Zyb21fbW9udGdvbWVyeV93b3JkKHIsdG1wLG1vbnQpKSBnb3RvIGVycjsKKyNlbHNlCisJaWYgKCFCTl9mcm9tX21vbnRnb21lcnkocix0bXAsbW9udCxjdHgpKSBnb3RvIGVycjsKKyNlbmRpZgorCWJuX2NoZWNrX3RvcChyKTsKKwlyZXQ9MTsKK2VycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuKHJldCk7CisJfQorCisjaWZkZWYgTU9OVF9XT1JECitzdGF0aWMgaW50IEJOX2Zyb21fbW9udGdvbWVyeV93b3JkKEJJR05VTSAqcmV0LCBCSUdOVU0gKnIsIEJOX01PTlRfQ1RYICptb250KQorCXsKKwlCSUdOVU0gKm47CisJQk5fVUxPTkcgKmFwLCpucCwqcnAsbjAsdiwqbnJwOworCWludCBhbCxubCxtYXgsaSx4LHJpOworCisJbj0gJihtb250LT5OKTsKKwkvKiBtb250LT5yaSBpcyB0aGUgc2l6ZSBvZiBtb250LT5OIGluIGJpdHMgKHJvdW5kZWQgdXAKKwkgICB0byB0aGUgd29yZCBzaXplKSAqLworCWFsPXJpPW1vbnQtPnJpL0JOX0JJVFMyOworCisJbmw9bi0+dG9wOworCWlmICgoYWwgPT0gMCkgfHwgKG5sID09IDApKSB7IHJldC0+dG9wPTA7IHJldHVybigxKTsgfQorCisJbWF4PShubCthbCsxKTsgLyogYWxsb3cgZm9yIG92ZXJmbG93IChubz8pIFhYWCAqLworCWlmIChibl93ZXhwYW5kKHIsbWF4KSA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwlyLT5uZWdePW4tPm5lZzsKKwlucD1uLT5kOworCXJwPXItPmQ7CisJbnJwPSAmKHItPmRbbmxdKTsKKworCS8qIGNsZWFyIHRoZSB0b3Agd29yZHMgb2YgVCAqLworI2lmIDEKKwlmb3IgKGk9ci0+dG9wOyBpPG1heDsgaSsrKSAvKiBtZW1zZXQ/IFhYWCAqLworCQlyLT5kW2ldPTA7CisjZWxzZQorCW1lbXNldCgmKHItPmRbci0+dG9wXSksMCwobWF4LXItPnRvcCkqc2l6ZW9mKEJOX1VMT05HKSk7IAorI2VuZGlmCisKKwlyLT50b3A9bWF4OworCW4wPW1vbnQtPm4wWzBdOworCisjaWZkZWYgQk5fQ09VTlQKKwlmcHJpbnRmKHN0ZGVyciwid29yZCBCTl9mcm9tX21vbnRnb21lcnlfd29yZCAlZCAqICVkXG4iLG5sLG5sKTsKKyNlbmRpZgorCWZvciAoaT0wOyBpPG5sOyBpKyspCisJCXsKKyNpZmRlZiBfX1RBTkRFTQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBsb25nIGxvbmcgdDE7CisgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIHQyOworICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyB0MzsKKyAgICAgICAgICAgICAgICAgICB0MSA9IHJwWzBdICogKG4wICYgMDE3Nzc3Nyk7CisgICAgICAgICAgICAgICAgICAgdDIgPSAwMzc3Nzc2MDAwMDBsOworICAgICAgICAgICAgICAgICAgIHQyID0gbjAgJiB0MjsKKyAgICAgICAgICAgICAgICAgICB0MyA9IHJwWzBdICYgMDE3Nzc3NzsKKyAgICAgICAgICAgICAgICAgICB0MiA9ICh0MyAqIHQyKSAmIEJOX01BU0syOworICAgICAgICAgICAgICAgICAgIHQxID0gdDEgKyB0MjsKKyAgICAgICAgICAgICAgICAgICB2PWJuX211bF9hZGRfd29yZHMocnAsbnAsbmwsKEJOX1VMT05HKSB0MSk7CisgICAgICAgICAgICAgICAgfQorI2Vsc2UKKwkJdj1ibl9tdWxfYWRkX3dvcmRzKHJwLG5wLG5sLChycFswXSpuMCkmQk5fTUFTSzIpOworI2VuZGlmCisJCW5ycCsrOworCQlycCsrOworCQlpZiAoKChucnBbLTFdKz12KSZCTl9NQVNLMikgPj0gdikKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQl7CisJCQlpZiAoKCgrK25ycFswXSkmQk5fTUFTSzIpICE9IDApIGNvbnRpbnVlOworCQkJaWYgKCgoKytucnBbMV0pJkJOX01BU0syKSAhPSAwKSBjb250aW51ZTsKKwkJCWZvciAoeD0yOyAoKCgrK25ycFt4XSkmQk5fTUFTSzIpID09IDApOyB4KyspIDsKKwkJCX0KKwkJfQorCWJuX2NvcnJlY3RfdG9wKHIpOworCisJLyogbW9udC0+cmkgd2lsbCBiZSBhIG11bHRpcGxlIG9mIHRoZSB3b3JkIHNpemUgYW5kIGJlbG93IGNvZGUKKwkgKiBpcyBraW5kIG9mIEJOX3JzaGlmdChyZXQscixtb250LT5yaSkgZXF1aXZhbGVudCAqLworCWlmIChyLT50b3AgPD0gcmkpCisJCXsKKwkJcmV0LT50b3A9MDsKKwkJcmV0dXJuKDEpOworCQl9CisJYWw9ci0+dG9wLXJpOworCisjZGVmaW5lIEJSQU5DSF9GUkVFIDEKKyNpZiBCUkFOQ0hfRlJFRQorCWlmIChibl93ZXhwYW5kKHJldCxyaSkgPT0gTlVMTCkgcmV0dXJuKDApOworCXg9MC0oKChhbC1yaSk+PihzaXplb2YoYWwpKjgtMSkpJjEpOworCXJldC0+dG9wPXg9KHJpJn54KXwoYWwmeCk7CS8qIG1pbihyaSxhbCkgKi8KKwlyZXQtPm5lZz1yLT5uZWc7CisKKwlycD1yZXQtPmQ7CisJYXA9JihyLT5kW3JpXSk7CisKKwl7CisJc2l6ZV90IG0xLG0yOworCisJdj1ibl9zdWJfd29yZHMocnAsYXAsbnAscmkpOworCS8qIHRoaXMgLS0tLS0tLS0tLS0tLS0tLV5eIHdvcmtzIGV2ZW4gaW4gYWw8cmkgY2FzZQorCSAqIHRoYW5rcyB0byB6ZWFsb3VzIHplcm9pbmcgb2YgdG9wIG9mIHRoZSB2ZWN0b3IgaW4gdGhlCisJICogYmVnaW5uaW5nLiAqLworCisJLyogaWYgKGFsPT1yaSAmJiAhdikgfHwgYWw+cmkpIG5ycD1ycDsgZWxzZSBucnA9YXA7ICovCisJLyogaW4gb3RoZXIgd29yZHMgaWYgc3VidHJhY3Rpb24gcmVzdWx0IGlzIHJlYWwsIHRoZW4KKwkgKiB0cmljayB1bmNvbmRpdGlvbmFsIG1lbWNweSBiZWxvdyB0byBwZXJmb3JtIGluLXBsYWNlCisJICogInJlZnJlc2giIGluc3RlYWQgb2YgYWN0dWFsIGNvcHkuICovCisJbTE9MC0oc2l6ZV90KSgoKGFsLXJpKT4+KHNpemVvZihhbCkqOC0xKSkmMSk7CS8qIGFsPHJpICovCisJbTI9MC0oc2l6ZV90KSgoKHJpLWFsKT4+KHNpemVvZihhbCkqOC0xKSkmMSk7CS8qIGFsPnJpICovCisJbTF8PW0yOwkJCS8qIChhbCE9cmkpICovCisJbTF8PSgwLShzaXplX3Qpdik7CS8qIChhbCE9cmkgfHwgdikgKi8KKwltMSY9fm0yOwkJLyogKGFsIT1yaSB8fCB2KSAmJiAhYWw+cmkgKi8KKwlucnA9KEJOX1VMT05HICopKCgoc2l6ZV90KXJwJn5tMSl8KChzaXplX3QpYXAmbTEpKTsKKwl9CisKKwkvKiAnaTxyaScgaXMgY2hvc2VuIHRvIGVsaW1pbmF0ZSBkZXBlbmRlbmN5IG9uIGlucHV0IGRhdGEsIGV2ZW4KKwkgKiB0aG91Z2ggaXQgcmVzdWx0cyBpbiByZWR1bmRhbnQgY29weSBpbiBhbDxyaSBjYXNlLiAqLworCWZvciAoaT0wLHJpLT00OyBpPHJpOyBpKz00KQorCQl7CisJCUJOX1VMT05HIHQxLHQyLHQzLHQ0OworCQkKKwkJdDE9bnJwW2krMF07CisJCXQyPW5ycFtpKzFdOworCQl0Mz1ucnBbaSsyXTsJYXBbaSswXT0wOworCQl0ND1ucnBbaSszXTsJYXBbaSsxXT0wOworCQlycFtpKzBdPXQxOwlhcFtpKzJdPTA7CisJCXJwW2krMV09dDI7CWFwW2krM109MDsKKwkJcnBbaSsyXT10MzsKKwkJcnBbaSszXT10NDsKKwkJfQorCWZvciAocmkrPTQ7IGk8cmk7IGkrKykKKwkJcnBbaV09bnJwW2ldLCBhcFtpXT0wOworCWJuX2NvcnJlY3RfdG9wKHIpOworCWJuX2NvcnJlY3RfdG9wKHJldCk7CisjZWxzZQorCWlmIChibl93ZXhwYW5kKHJldCxhbCkgPT0gTlVMTCkgcmV0dXJuKDApOworCXJldC0+dG9wPWFsOworCXJldC0+bmVnPXItPm5lZzsKKworCXJwPXJldC0+ZDsKKwlhcD0mKHItPmRbcmldKTsKKwlhbC09NDsKKwlmb3IgKGk9MDsgaTxhbDsgaSs9NCkKKwkJeworCQlCTl9VTE9ORyB0MSx0Mix0Myx0NDsKKwkJCisJCXQxPWFwW2krMF07CisJCXQyPWFwW2krMV07CisJCXQzPWFwW2krMl07CisJCXQ0PWFwW2krM107CisJCXJwW2krMF09dDE7CisJCXJwW2krMV09dDI7CisJCXJwW2krMl09dDM7CisJCXJwW2krM109dDQ7CisJCX0KKwlhbCs9NDsKKwlmb3IgKDsgaTxhbDsgaSsrKQorCQlycFtpXT1hcFtpXTsKKworCWlmIChCTl91Y21wKHJldCwgJihtb250LT5OKSkgPj0gMCkKKwkJeworCQlpZiAoIUJOX3VzdWIocmV0LHJldCwmKG1vbnQtPk4pKSkgcmV0dXJuKDApOworCQl9CisjZW5kaWYKKwlibl9jaGVja190b3AocmV0KTsKKworCXJldHVybigxKTsKKwl9CisjZW5kaWYJLyogTU9OVF9XT1JEICovCisKK2ludCBCTl9mcm9tX21vbnRnb21lcnkoQklHTlVNICpyZXQsIGNvbnN0IEJJR05VTSAqYSwgQk5fTU9OVF9DVFggKm1vbnQsCisJICAgICBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldG49MDsKKyNpZmRlZiBNT05UX1dPUkQKKwlCSUdOVU0gKnQ7CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlpZiAoKHQgPSBCTl9DVFhfZ2V0KGN0eCkpICYmIEJOX2NvcHkodCxhKSkKKwkJcmV0biA9IEJOX2Zyb21fbW9udGdvbWVyeV93b3JkKHJldCx0LG1vbnQpOworCUJOX0NUWF9lbmQoY3R4KTsKKyNlbHNlIC8qICFNT05UX1dPUkQgKi8KKwlCSUdOVU0gKnQxLCp0MjsKKworCUJOX0NUWF9zdGFydChjdHgpOworCXQxID0gQk5fQ1RYX2dldChjdHgpOworCXQyID0gQk5fQ1RYX2dldChjdHgpOworCWlmICh0MSA9PSBOVUxMIHx8IHQyID09IE5VTEwpIGdvdG8gZXJyOworCQorCWlmICghQk5fY29weSh0MSxhKSkgZ290byBlcnI7CisJQk5fbWFza19iaXRzKHQxLG1vbnQtPnJpKTsKKworCWlmICghQk5fbXVsKHQyLHQxLCZtb250LT5OaSxjdHgpKSBnb3RvIGVycjsKKwlCTl9tYXNrX2JpdHModDIsbW9udC0+cmkpOworCisJaWYgKCFCTl9tdWwodDEsdDIsJm1vbnQtPk4sY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9hZGQodDIsYSx0MSkpIGdvdG8gZXJyOworCWlmICghQk5fcnNoaWZ0KHJldCx0Mixtb250LT5yaSkpIGdvdG8gZXJyOworCisJaWYgKEJOX3VjbXAocmV0LCAmKG1vbnQtPk4pKSA+PSAwKQorCQl7CisJCWlmICghQk5fdXN1YihyZXQscmV0LCYobW9udC0+TikpKSBnb3RvIGVycjsKKwkJfQorCXJldG49MTsKKwlibl9jaGVja190b3AocmV0KTsKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworI2VuZGlmIC8qIE1PTlRfV09SRCAqLworCXJldHVybihyZXRuKTsKKwl9CisKK0JOX01PTlRfQ1RYICpCTl9NT05UX0NUWF9uZXcodm9pZCkKKwl7CisJQk5fTU9OVF9DVFggKnJldDsKKworCWlmICgocmV0PShCTl9NT05UX0NUWCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCTl9NT05UX0NUWCkpKSA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisKKwlCTl9NT05UX0NUWF9pbml0KHJldCk7CisJcmV0LT5mbGFncz1CTl9GTEdfTUFMTE9DRUQ7CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIEJOX01PTlRfQ1RYX2luaXQoQk5fTU9OVF9DVFggKmN0eCkKKwl7CisJY3R4LT5yaT0wOworCUJOX2luaXQoJihjdHgtPlJSKSk7CisJQk5faW5pdCgmKGN0eC0+TikpOworCUJOX2luaXQoJihjdHgtPk5pKSk7CisJY3R4LT5uMFswXSA9IGN0eC0+bjBbMV0gPSAwOworCWN0eC0+ZmxhZ3M9MDsKKwl9CisKK3ZvaWQgQk5fTU9OVF9DVFhfZnJlZShCTl9NT05UX0NUWCAqbW9udCkKKwl7CisJaWYobW9udCA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlCTl9mcmVlKCYobW9udC0+UlIpKTsKKwlCTl9mcmVlKCYobW9udC0+TikpOworCUJOX2ZyZWUoJihtb250LT5OaSkpOworCWlmIChtb250LT5mbGFncyAmIEJOX0ZMR19NQUxMT0NFRCkKKwkJT1BFTlNTTF9mcmVlKG1vbnQpOworCX0KKworaW50IEJOX01PTlRfQ1RYX3NldChCTl9NT05UX0NUWCAqbW9udCwgY29uc3QgQklHTlVNICptb2QsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0ID0gMDsKKwlCSUdOVU0gKlJpLCpSOworCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJaWYoKFJpID0gQk5fQ1RYX2dldChjdHgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlSPSAmKG1vbnQtPlJSKTsJCQkJCS8qIGdyYWIgUlIgYXMgYSB0ZW1wICovCisJaWYgKCFCTl9jb3B5KCYobW9udC0+TiksbW9kKSkgZ290byBlcnI7CQkvKiBTZXQgTiAqLworCW1vbnQtPk4ubmVnID0gMDsKKworI2lmZGVmIE1PTlRfV09SRAorCQl7CisJCUJJR05VTSB0bW9kOworCQlCTl9VTE9ORyBidWZbMl07CisKKwkJQk5faW5pdCgmdG1vZCk7CisJCXRtb2QuZD1idWY7CisJCXRtb2QuZG1heD0yOworCQl0bW9kLm5lZz0wOworCisJCW1vbnQtPnJpPShCTl9udW1fYml0cyhtb2QpKyhCTl9CSVRTMi0xKSkvQk5fQklUUzIqQk5fQklUUzI7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfQk5fQVNNX01PTlQpICYmIChCTl9CSVRTMjw9MzIpCisJCS8qIE9ubHkgY2VydGFpbiBCTl9CSVRTMjw9MzIgcGxhdGZvcm1zIGFjdHVhbGx5IG1ha2UgdXNlIG9mCisJCSAqIG4wWzFdLCBhbmQgd2UgY291bGQgdXNlIHRoZSAjZWxzZSBjYXNlICh3aXRoIGEgc2hvcnRlciBSCisJCSAqIHZhbHVlKSBmb3IgdGhlIG90aGVycy4gIEhvd2V2ZXIsIGN1cnJlbnRseSBvbmx5IHRoZSBhc3NlbWJsZXIKKwkJICogZmlsZXMgZG8ga25vdyB3aGljaCBpcyB3aGljaC4gKi8KKworCQlCTl96ZXJvKFIpOworCQlpZiAoIShCTl9zZXRfYml0KFIsMipCTl9CSVRTMikpKSBnb3RvIGVycjsKKworCQkJCQkJCQl0bW9kLnRvcD0wOworCQlpZiAoKGJ1ZlswXSA9IG1vZC0+ZFswXSkpCQkJdG1vZC50b3A9MTsKKwkJaWYgKChidWZbMV0gPSBtb2QtPnRvcD4xID8gbW9kLT5kWzFdIDogMCkpCXRtb2QudG9wPTI7CisKKwkJaWYgKChCTl9tb2RfaW52ZXJzZShSaSxSLCZ0bW9kLGN0eCkpID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJaWYgKCFCTl9sc2hpZnQoUmksUmksMipCTl9CSVRTMikpIGdvdG8gZXJyOyAvKiBSKlJpICovCisJCWlmICghQk5faXNfemVybyhSaSkpCisJCQl7CisJCQlpZiAoIUJOX3N1Yl93b3JkKFJpLDEpKSBnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSAvKiBpZiBOIG1vZCB3b3JkIHNpemUgPT0gMSAqLworCQkJeworCQkJaWYgKGJuX2V4cGFuZChSaSwoaW50KXNpemVvZihCTl9VTE9ORykqMikgPT0gTlVMTCkKKwkJCQlnb3RvIGVycjsKKwkJCS8qIFJpLS0gKG1vZCBkb3VibGUgd29yZCBzaXplKSAqLworCQkJUmktPm5lZz0wOworCQkJUmktPmRbMF09Qk5fTUFTSzI7CisJCQlSaS0+ZFsxXT1CTl9NQVNLMjsKKwkJCVJpLT50b3A9MjsKKwkJCX0KKwkJaWYgKCFCTl9kaXYoUmksTlVMTCxSaSwmdG1vZCxjdHgpKSBnb3RvIGVycjsKKwkJLyogTmkgPSAoUipSaS0xKS9OLAorCQkgKiBrZWVwIG9ubHkgY291cGxlIG9mIGxlYXN0IHNpZ25pZmljYW50IHdvcmRzOiAqLworCQltb250LT5uMFswXSA9IChSaS0+dG9wID4gMCkgPyBSaS0+ZFswXSA6IDA7CisJCW1vbnQtPm4wWzFdID0gKFJpLT50b3AgPiAxKSA/IFJpLT5kWzFdIDogMDsKKyNlbHNlCisJCUJOX3plcm8oUik7CisJCWlmICghKEJOX3NldF9iaXQoUixCTl9CSVRTMikpKSBnb3RvIGVycjsJLyogUiAqLworCisJCWJ1ZlswXT1tb2QtPmRbMF07IC8qIHRtb2QgPSBOIG1vZCB3b3JkIHNpemUgKi8KKwkJYnVmWzFdPTA7CisJCXRtb2QudG9wID0gYnVmWzBdICE9IDAgPyAxIDogMDsKKwkJCQkJCQkvKiBSaSA9IFJeLTEgbW9kIE4qLworCQlpZiAoKEJOX21vZF9pbnZlcnNlKFJpLFIsJnRtb2QsY3R4KSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQlpZiAoIUJOX2xzaGlmdChSaSxSaSxCTl9CSVRTMikpIGdvdG8gZXJyOyAvKiBSKlJpICovCisJCWlmICghQk5faXNfemVybyhSaSkpCisJCQl7CisJCQlpZiAoIUJOX3N1Yl93b3JkKFJpLDEpKSBnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSAvKiBpZiBOIG1vZCB3b3JkIHNpemUgPT0gMSAqLworCQkJeworCQkJaWYgKCFCTl9zZXRfd29yZChSaSxCTl9NQVNLMikpIGdvdG8gZXJyOyAgLyogUmktLSAobW9kIHdvcmQgc2l6ZSkgKi8KKwkJCX0KKwkJaWYgKCFCTl9kaXYoUmksTlVMTCxSaSwmdG1vZCxjdHgpKSBnb3RvIGVycjsKKwkJLyogTmkgPSAoUipSaS0xKS9OLAorCQkgKiBrZWVwIG9ubHkgbGVhc3Qgc2lnbmlmaWNhbnQgd29yZDogKi8KKwkJbW9udC0+bjBbMF0gPSAoUmktPnRvcCA+IDApID8gUmktPmRbMF0gOiAwOworCQltb250LT5uMFsxXSA9IDA7CisjZW5kaWYKKwkJfQorI2Vsc2UgLyogIU1PTlRfV09SRCAqLworCQl7IC8qIGJpZ251bSB2ZXJzaW9uICovCisJCW1vbnQtPnJpPUJOX251bV9iaXRzKCZtb250LT5OKTsKKwkJQk5femVybyhSKTsKKwkJaWYgKCFCTl9zZXRfYml0KFIsbW9udC0+cmkpKSBnb3RvIGVycjsgIC8qIFIgPSAyXnJpICovCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSaSA9IFJeLTEgbW9kIE4qLworCQlpZiAoKEJOX21vZF9pbnZlcnNlKFJpLFIsJm1vbnQtPk4sY3R4KSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQlpZiAoIUJOX2xzaGlmdChSaSxSaSxtb250LT5yaSkpIGdvdG8gZXJyOyAvKiBSKlJpICovCisJCWlmICghQk5fc3ViX3dvcmQoUmksMSkpIGdvdG8gZXJyOworCQkJCQkJCS8qIE5pID0gKFIqUmktMSkgLyBOICovCisJCWlmICghQk5fZGl2KCYobW9udC0+TmkpLE5VTEwsUmksJm1vbnQtPk4sY3R4KSkgZ290byBlcnI7CisJCX0KKyNlbmRpZgorCisJLyogc2V0dXAgUlIgZm9yIGNvbnZlcnNpb25zICovCisJQk5femVybygmKG1vbnQtPlJSKSk7CisJaWYgKCFCTl9zZXRfYml0KCYobW9udC0+UlIpLG1vbnQtPnJpKjIpKSBnb3RvIGVycjsKKwlpZiAoIUJOX21vZCgmKG1vbnQtPlJSKSwmKG1vbnQtPlJSKSwmKG1vbnQtPk4pLGN0eCkpIGdvdG8gZXJyOworCisJcmV0ID0gMTsKK2VycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKK0JOX01PTlRfQ1RYICpCTl9NT05UX0NUWF9jb3B5KEJOX01PTlRfQ1RYICp0bywgQk5fTU9OVF9DVFggKmZyb20pCisJeworCWlmICh0byA9PSBmcm9tKSByZXR1cm4odG8pOworCisJaWYgKCFCTl9jb3B5KCYodG8tPlJSKSwmKGZyb20tPlJSKSkpIHJldHVybiBOVUxMOworCWlmICghQk5fY29weSgmKHRvLT5OKSwmKGZyb20tPk4pKSkgcmV0dXJuIE5VTEw7CisJaWYgKCFCTl9jb3B5KCYodG8tPk5pKSwmKGZyb20tPk5pKSkpIHJldHVybiBOVUxMOworCXRvLT5yaT1mcm9tLT5yaTsKKwl0by0+bjBbMF09ZnJvbS0+bjBbMF07CisJdG8tPm4wWzFdPWZyb20tPm4wWzFdOworCXJldHVybih0byk7CisJfQorCitCTl9NT05UX0NUWCAqQk5fTU9OVF9DVFhfc2V0X2xvY2tlZChCTl9NT05UX0NUWCAqKnBtb250LCBpbnQgbG9jaywKKwkJCQkJY29uc3QgQklHTlVNICptb2QsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgZ290X3dyaXRlX2xvY2sgPSAwOworCUJOX01PTlRfQ1RYICpyZXQ7CisKKwlDUllQVE9fcl9sb2NrKGxvY2spOworCWlmICghKnBtb250KQorCQl7CisJCUNSWVBUT19yX3VubG9jayhsb2NrKTsKKwkJQ1JZUFRPX3dfbG9jayhsb2NrKTsKKwkJZ290X3dyaXRlX2xvY2sgPSAxOworCisJCWlmICghKnBtb250KQorCQkJeworCQkJcmV0ID0gQk5fTU9OVF9DVFhfbmV3KCk7CisJCQlpZiAocmV0ICYmICFCTl9NT05UX0NUWF9zZXQocmV0LCBtb2QsIGN0eCkpCisJCQkJQk5fTU9OVF9DVFhfZnJlZShyZXQpOworCQkJZWxzZQorCQkJCSpwbW9udCA9IHJldDsKKwkJCX0KKwkJfQorCQorCXJldCA9ICpwbW9udDsKKwkKKwlpZiAoZ290X3dyaXRlX2xvY2spCisJCUNSWVBUT193X3VubG9jayhsb2NrKTsKKwllbHNlCisJCUNSWVBUT19yX3VubG9jayhsb2NrKTsKKwkJCisJcmV0dXJuIHJldDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbXBpLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1NGQyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9tcGkuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogY3J5cHRvL2JuL2JuX21waS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAiYm5fbGNsLmgiCisKK2ludCBCTl9ibjJtcGkoY29uc3QgQklHTlVNICphLCB1bnNpZ25lZCBjaGFyICpkKQorCXsKKwlpbnQgYml0czsKKwlpbnQgbnVtPTA7CisJaW50IGV4dD0wOworCWxvbmcgbDsKKworCWJpdHM9Qk5fbnVtX2JpdHMoYSk7CisJbnVtPShiaXRzKzcpLzg7CisJaWYgKGJpdHMgPiAwKQorCQl7CisJCWV4dD0oKGJpdHMgJiAweDA3KSA9PSAwKTsKKwkJfQorCWlmIChkID09IE5VTEwpCisJCXJldHVybihudW0rNCtleHQpOworCisJbD1udW0rZXh0OworCWRbMF09KHVuc2lnbmVkIGNoYXIpKGw+PjI0KSYweGZmOworCWRbMV09KHVuc2lnbmVkIGNoYXIpKGw+PjE2KSYweGZmOworCWRbMl09KHVuc2lnbmVkIGNoYXIpKGw+PiA4KSYweGZmOworCWRbM109KHVuc2lnbmVkIGNoYXIpKGwgICAgKSYweGZmOworCWlmIChleHQpIGRbNF09MDsKKwludW09Qk5fYm4yYmluKGEsJihkWzQrZXh0XSkpOworCWlmIChhLT5uZWcpCisJCWRbNF18PTB4ODA7CisJcmV0dXJuKG51bSs0K2V4dCk7CisJfQorCitCSUdOVU0gKkJOX21waTJibihjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbiwgQklHTlVNICphKQorCXsKKwlsb25nIGxlbjsKKwlpbnQgbmVnPTA7CisKKwlpZiAobiA8IDQpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9NUEkyQk4sQk5fUl9JTlZBTElEX0xFTkdUSCk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWxlbj0oKGxvbmcpZFswXTw8MjQpfCgobG9uZylkWzFdPDwxNil8KChpbnQpZFsyXTw8OCl8KGludClkWzNdOworCWlmICgobGVuKzQpICE9IG4pCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9NUEkyQk4sQk5fUl9FTkNPRElOR19FUlJPUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCisJaWYgKGEgPT0gTlVMTCkgYT1CTl9uZXcoKTsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisKKwlpZiAobGVuID09IDApCisJCXsKKwkJYS0+bmVnPTA7CisJCWEtPnRvcD0wOworCQlyZXR1cm4oYSk7CisJCX0KKwlkKz00OworCWlmICgoKmQpICYgMHg4MCkKKwkJbmVnPTE7CisJaWYgKEJOX2JpbjJibihkLChpbnQpbGVuLGEpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKwlhLT5uZWc9bmVnOworCWlmIChuZWcpCisJCXsKKwkJQk5fY2xlYXJfYml0KGEsQk5fbnVtX2JpdHMoYSktMSk7CisJCX0KKwlibl9jaGVja190b3AoYSk7CisJcmV0dXJuKGEpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX211bC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX211bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZTllYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbXVsLmMKQEAgLTAsMCArMSwxMTcxIEBACisvKiBjcnlwdG8vYm4vYm5fbXVsLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBCTl9ERUJVRworIyB1bmRlZiBOREVCVUcgLyogYXZvaWQgY29uZmxpY3RpbmcgZGVmaW5pdGlvbnMgKi8KKyMgZGVmaW5lIE5ERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAiYm5fbGNsLmgiCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKSB8fCAhZGVmaW5lZChPUEVOU1NMX0JOX0FTTV9QQVJUX1dPUkRTKQorLyogSGVyZSBmb2xsb3dzIHNwZWNpYWxpc2VkIHZhcmlhbnRzIG9mIGJuX2FkZF93b3JkcygpIGFuZAorICAgYm5fc3ViX3dvcmRzKCkuICBUaGV5IGhhdmUgdGhlIHByb3BlcnR5IHBlcmZvcm1pbmcgb3BlcmF0aW9ucyBvbgorICAgYXJyYXlzIG9mIGRpZmZlcmVudCBzaXplcy4gIFRoZSBzaXplcyBvZiB0aG9zZSBhcnJheXMgaXMgZXhwcmVzc2VkIHRocm91Z2gKKyAgIGNsLCB3aGljaCBpcyB0aGUgY29tbW9uIGxlbmd0aCAoIGJhc2ljYWxsLCBtaW4obGVuKGEpLGxlbihiKSkgKSwgYW5kIGRsLAorICAgd2hpY2ggaXMgdGhlIGRlbHRhIGJldHdlZW4gdGhlIHR3byBsZW5ndGhzLCBjYWxjdWxhdGVkIGFzIGxlbihhKS1sZW4oYikuCisgICBBbGwgbGVuZ3RocyBhcmUgdGhlIG51bWJlciBvZiBCTl9VTE9OR3MuLi4gIEZvciB0aGUgb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUKKyAgIGEgcmVzdWx0IGFycmF5IGFzIHBhcmFtZXRlciwgaXQgbXVzdCBoYXZlIHRoZSBsZW5ndGggY2wrYWJzKGRsKS4KKyAgIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgcHJvYmFibHkgZW5kIHVwIGluIGJuX2FzbS5jIGFzIHNvb24gYXMgdGhlcmUgYXJlCisgICBhc3NlbWJsZXIgY291bnRlcnBhcnRzIGZvciB0aGUgc3lzdGVtcyB0aGF0IHVzZSBhc3NlbWJsZXIgZmlsZXMuICAqLworCitCTl9VTE9ORyBibl9zdWJfcGFydF93b3JkcyhCTl9VTE9ORyAqciwKKwljb25zdCBCTl9VTE9ORyAqYSwgY29uc3QgQk5fVUxPTkcgKmIsCisJaW50IGNsLCBpbnQgZGwpCisJeworCUJOX1VMT05HIGMsIHQ7CisKKwlhc3NlcnQoY2wgPj0gMCk7CisJYyA9IGJuX3N1Yl93b3JkcyhyLCBhLCBiLCBjbCk7CisKKwlpZiAoZGwgPT0gMCkKKwkJcmV0dXJuIGM7CisKKwlyICs9IGNsOworCWEgKz0gY2w7CisJYiArPSBjbDsKKworCWlmIChkbCA8IDApCisJCXsKKyNpZmRlZiBCTl9DT1VOVAorCQlmcHJpbnRmKHN0ZGVyciwgIiAgYm5fc3ViX3BhcnRfd29yZHMgJWQgKyAlZCAoZGwgPCAwLCBjID0gJWQpXG4iLCBjbCwgZGwsIGMpOworI2VuZGlmCisJCWZvciAoOzspCisJCQl7CisJCQl0ID0gYlswXTsKKwkJCXJbMF0gPSAoMC10LWMpJkJOX01BU0syOworCQkJaWYgKHQgIT0gMCkgYz0xOworCQkJaWYgKCsrZGwgPj0gMCkgYnJlYWs7CisKKwkJCXQgPSBiWzFdOworCQkJclsxXSA9ICgwLXQtYykmQk5fTUFTSzI7CisJCQlpZiAodCAhPSAwKSBjPTE7CisJCQlpZiAoKytkbCA+PSAwKSBicmVhazsKKworCQkJdCA9IGJbMl07CisJCQlyWzJdID0gKDAtdC1jKSZCTl9NQVNLMjsKKwkJCWlmICh0ICE9IDApIGM9MTsKKwkJCWlmICgrK2RsID49IDApIGJyZWFrOworCisJCQl0ID0gYlszXTsKKwkJCXJbM10gPSAoMC10LWMpJkJOX01BU0syOworCQkJaWYgKHQgIT0gMCkgYz0xOworCQkJaWYgKCsrZGwgPj0gMCkgYnJlYWs7CisKKwkJCWIgKz0gNDsKKwkJCXIgKz0gNDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpbnQgc2F2ZV9kbCA9IGRsOworI2lmZGVmIEJOX0NPVU5UCisJCWZwcmludGYoc3RkZXJyLCAiICBibl9zdWJfcGFydF93b3JkcyAlZCArICVkIChkbCA+IDAsIGMgPSAlZClcbiIsIGNsLCBkbCwgYyk7CisjZW5kaWYKKwkJd2hpbGUoYykKKwkJCXsKKwkJCXQgPSBhWzBdOworCQkJclswXSA9ICh0LWMpJkJOX01BU0syOworCQkJaWYgKHQgIT0gMCkgYz0wOworCQkJaWYgKC0tZGwgPD0gMCkgYnJlYWs7CisKKwkJCXQgPSBhWzFdOworCQkJclsxXSA9ICh0LWMpJkJOX01BU0syOworCQkJaWYgKHQgIT0gMCkgYz0wOworCQkJaWYgKC0tZGwgPD0gMCkgYnJlYWs7CisKKwkJCXQgPSBhWzJdOworCQkJclsyXSA9ICh0LWMpJkJOX01BU0syOworCQkJaWYgKHQgIT0gMCkgYz0wOworCQkJaWYgKC0tZGwgPD0gMCkgYnJlYWs7CisKKwkJCXQgPSBhWzNdOworCQkJclszXSA9ICh0LWMpJkJOX01BU0syOworCQkJaWYgKHQgIT0gMCkgYz0wOworCQkJaWYgKC0tZGwgPD0gMCkgYnJlYWs7CisKKwkJCXNhdmVfZGwgPSBkbDsKKwkJCWEgKz0gNDsKKwkJCXIgKz0gNDsKKwkJCX0KKwkJaWYgKGRsID4gMCkKKwkJCXsKKyNpZmRlZiBCTl9DT1VOVAorCQkJZnByaW50ZihzdGRlcnIsICIgIGJuX3N1Yl9wYXJ0X3dvcmRzICVkICsgJWQgKGRsID4gMCwgYyA9PSAwKVxuIiwgY2wsIGRsKTsKKyNlbmRpZgorCQkJaWYgKHNhdmVfZGwgPiBkbCkKKwkJCQl7CisJCQkJc3dpdGNoIChzYXZlX2RsIC0gZGwpCisJCQkJCXsKKwkJCQljYXNlIDE6CisJCQkJCXJbMV0gPSBhWzFdOworCQkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCXJbMl0gPSBhWzJdOworCQkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCXJbM10gPSBhWzNdOworCQkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQkJfQorCQkJCWEgKz0gNDsKKwkJCQlyICs9IDQ7CisJCQkJfQorCQkJfQorCQlpZiAoZGwgPiAwKQorCQkJeworI2lmZGVmIEJOX0NPVU5UCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgYm5fc3ViX3BhcnRfd29yZHMgJWQgKyAlZCAoZGwgPiAwLCBjb3B5KVxuIiwgY2wsIGRsKTsKKyNlbmRpZgorCQkJZm9yKDs7KQorCQkJCXsKKwkJCQlyWzBdID0gYVswXTsKKwkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQlyWzFdID0gYVsxXTsKKwkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQlyWzJdID0gYVsyXTsKKwkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQlyWzNdID0gYVszXTsKKwkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKworCQkJCWEgKz0gNDsKKwkJCQlyICs9IDQ7CisJCQkJfQorCQkJfQorCQl9CisJcmV0dXJuIGM7CisJfQorI2VuZGlmCisKK0JOX1VMT05HIGJuX2FkZF9wYXJ0X3dvcmRzKEJOX1VMT05HICpyLAorCWNvbnN0IEJOX1VMT05HICphLCBjb25zdCBCTl9VTE9ORyAqYiwKKwlpbnQgY2wsIGludCBkbCkKKwl7CisJQk5fVUxPTkcgYywgbCwgdDsKKworCWFzc2VydChjbCA+PSAwKTsKKwljID0gYm5fYWRkX3dvcmRzKHIsIGEsIGIsIGNsKTsKKworCWlmIChkbCA9PSAwKQorCQlyZXR1cm4gYzsKKworCXIgKz0gY2w7CisJYSArPSBjbDsKKwliICs9IGNsOworCisJaWYgKGRsIDwgMCkKKwkJeworCQlpbnQgc2F2ZV9kbCA9IGRsOworI2lmZGVmIEJOX0NPVU5UCisJCWZwcmludGYoc3RkZXJyLCAiICBibl9hZGRfcGFydF93b3JkcyAlZCArICVkIChkbCA8IDAsIGMgPSAlZClcbiIsIGNsLCBkbCwgYyk7CisjZW5kaWYKKwkJd2hpbGUgKGMpCisJCQl7CisJCQlsPShjK2JbMF0pJkJOX01BU0syOworCQkJYz0obCA8IGMpOworCQkJclswXT1sOworCQkJaWYgKCsrZGwgPj0gMCkgYnJlYWs7CisKKwkJCWw9KGMrYlsxXSkmQk5fTUFTSzI7CisJCQljPShsIDwgYyk7CisJCQlyWzFdPWw7CisJCQlpZiAoKytkbCA+PSAwKSBicmVhazsKKworCQkJbD0oYytiWzJdKSZCTl9NQVNLMjsKKwkJCWM9KGwgPCBjKTsKKwkJCXJbMl09bDsKKwkJCWlmICgrK2RsID49IDApIGJyZWFrOworCisJCQlsPShjK2JbM10pJkJOX01BU0syOworCQkJYz0obCA8IGMpOworCQkJclszXT1sOworCQkJaWYgKCsrZGwgPj0gMCkgYnJlYWs7CisKKwkJCXNhdmVfZGwgPSBkbDsKKwkJCWIrPTQ7CisJCQlyKz00OworCQkJfQorCQlpZiAoZGwgPCAwKQorCQkJeworI2lmZGVmIEJOX0NPVU5UCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgYm5fYWRkX3BhcnRfd29yZHMgJWQgKyAlZCAoZGwgPCAwLCBjID09IDApXG4iLCBjbCwgZGwpOworI2VuZGlmCisJCQlpZiAoc2F2ZV9kbCA8IGRsKQorCQkJCXsKKwkJCQlzd2l0Y2ggKGRsIC0gc2F2ZV9kbCkKKwkJCQkJeworCQkJCWNhc2UgMToKKwkJCQkJclsxXSA9IGJbMV07CisJCQkJCWlmICgrK2RsID49IDApIGJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJclsyXSA9IGJbMl07CisJCQkJCWlmICgrK2RsID49IDApIGJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJclszXSA9IGJbM107CisJCQkJCWlmICgrK2RsID49IDApIGJyZWFrOworCQkJCQl9CisJCQkJYiArPSA0OworCQkJCXIgKz0gNDsKKwkJCQl9CisJCQl9CisJCWlmIChkbCA8IDApCisJCQl7CisjaWZkZWYgQk5fQ09VTlQKKwkJCWZwcmludGYoc3RkZXJyLCAiICBibl9hZGRfcGFydF93b3JkcyAlZCArICVkIChkbCA8IDAsIGNvcHkpXG4iLCBjbCwgZGwpOworI2VuZGlmCisJCQlmb3IoOzspCisJCQkJeworCQkJCXJbMF0gPSBiWzBdOworCQkJCWlmICgrK2RsID49IDApIGJyZWFrOworCQkJCXJbMV0gPSBiWzFdOworCQkJCWlmICgrK2RsID49IDApIGJyZWFrOworCQkJCXJbMl0gPSBiWzJdOworCQkJCWlmICgrK2RsID49IDApIGJyZWFrOworCQkJCXJbM10gPSBiWzNdOworCQkJCWlmICgrK2RsID49IDApIGJyZWFrOworCisJCQkJYiArPSA0OworCQkJCXIgKz0gNDsKKwkJCQl9CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJaW50IHNhdmVfZGwgPSBkbDsKKyNpZmRlZiBCTl9DT1VOVAorCQlmcHJpbnRmKHN0ZGVyciwgIiAgYm5fYWRkX3BhcnRfd29yZHMgJWQgKyAlZCAoZGwgPiAwKVxuIiwgY2wsIGRsKTsKKyNlbmRpZgorCQl3aGlsZSAoYykKKwkJCXsKKwkJCXQ9KGFbMF0rYykmQk5fTUFTSzI7CisJCQljPSh0IDwgYyk7CisJCQlyWzBdPXQ7CisJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKworCQkJdD0oYVsxXStjKSZCTl9NQVNLMjsKKwkJCWM9KHQgPCBjKTsKKwkJCXJbMV09dDsKKwkJCWlmICgtLWRsIDw9IDApIGJyZWFrOworCisJCQl0PShhWzJdK2MpJkJOX01BU0syOworCQkJYz0odCA8IGMpOworCQkJclsyXT10OworCQkJaWYgKC0tZGwgPD0gMCkgYnJlYWs7CisKKwkJCXQ9KGFbM10rYykmQk5fTUFTSzI7CisJCQljPSh0IDwgYyk7CisJCQlyWzNdPXQ7CisJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKworCQkJc2F2ZV9kbCA9IGRsOworCQkJYSs9NDsKKwkJCXIrPTQ7CisJCQl9CisjaWZkZWYgQk5fQ09VTlQKKwkJZnByaW50ZihzdGRlcnIsICIgIGJuX2FkZF9wYXJ0X3dvcmRzICVkICsgJWQgKGRsID4gMCwgYyA9PSAwKVxuIiwgY2wsIGRsKTsKKyNlbmRpZgorCQlpZiAoZGwgPiAwKQorCQkJeworCQkJaWYgKHNhdmVfZGwgPiBkbCkKKwkJCQl7CisJCQkJc3dpdGNoIChzYXZlX2RsIC0gZGwpCisJCQkJCXsKKwkJCQljYXNlIDE6CisJCQkJCXJbMV0gPSBhWzFdOworCQkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCXJbMl0gPSBhWzJdOworCQkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQljYXNlIDM6CisJCQkJCXJbM10gPSBhWzNdOworCQkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQkJfQorCQkJCWEgKz0gNDsKKwkJCQlyICs9IDQ7CisJCQkJfQorCQkJfQorCQlpZiAoZGwgPiAwKQorCQkJeworI2lmZGVmIEJOX0NPVU5UCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgYm5fYWRkX3BhcnRfd29yZHMgJWQgKyAlZCAoZGwgPiAwLCBjb3B5KVxuIiwgY2wsIGRsKTsKKyNlbmRpZgorCQkJZm9yKDs7KQorCQkJCXsKKwkJCQlyWzBdID0gYVswXTsKKwkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQlyWzFdID0gYVsxXTsKKwkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQlyWzJdID0gYVsyXTsKKwkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKwkJCQlyWzNdID0gYVszXTsKKwkJCQlpZiAoLS1kbCA8PSAwKSBicmVhazsKKworCQkJCWEgKz0gNDsKKwkJCQlyICs9IDQ7CisJCQkJfQorCQkJfQorCQl9CisJcmV0dXJuIGM7CisJfQorCisjaWZkZWYgQk5fUkVDVVJTSU9OCisvKiBLYXJhdHN1YmEgcmVjdXJzaXZlIG11bHRpcGxpY2F0aW9uIGFsZ29yaXRobQorICogKGNmLiBLbnV0aCwgVGhlIEFydCBvZiBDb21wdXRlciBQcm9ncmFtbWluZywgVm9sLiAyKSAqLworCisvKiByIGlzIDIqbjIgd29yZHMgaW4gc2l6ZSwKKyAqIGEgYW5kIGIgYXJlIGJvdGggbjIgd29yZHMgaW4gc2l6ZS4KKyAqIG4yIG11c3QgYmUgYSBwb3dlciBvZiAyLgorICogV2UgbXVsdGlwbHkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgorICogdCBtdXN0IGJlIDIqbjIgd29yZHMgaW4gc2l6ZQorICogV2UgY2FsY3VsYXRlCisgKiBhWzBdKmJbMF0KKyAqIGFbMF0qYlswXSthWzFdKmJbMV0rKGFbMF0tYVsxXSkqKGJbMV0tYlswXSkKKyAqIGFbMV0qYlsxXQorICovCisvKiBkblggbWF5IG5vdCBiZSBwb3NpdGl2ZSwgYnV0IG4yLzIrZG5YIGhhcyB0byBiZSAqLwordm9pZCBibl9tdWxfcmVjdXJzaXZlKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIsIGludCBuMiwKKwlpbnQgZG5hLCBpbnQgZG5iLCBCTl9VTE9ORyAqdCkKKwl7CisJaW50IG49bjIvMixjMSxjMjsKKwlpbnQgdG5hPW4rZG5hLCB0bmI9bitkbmI7CisJdW5zaWduZWQgaW50IG5lZyx6ZXJvOworCUJOX1VMT05HIGxuLGxvLCpwOworCisjIGlmZGVmIEJOX0NPVU5UCisJZnByaW50ZihzdGRlcnIsIiBibl9tdWxfcmVjdXJzaXZlICVkJStkICogJWQlK2RcbiIsbjIsZG5hLG4yLGRuYik7CisjIGVuZGlmCisjIGlmZGVmIEJOX01VTF9DT01CQQorIyAgaWYgMAorCWlmIChuMiA9PSA0KQorCQl7CisJCWJuX211bF9jb21iYTQocixhLGIpOworCQlyZXR1cm47CisJCX0KKyMgIGVuZGlmCisJLyogT25seSBjYWxsIGJuX211bF9jb21iYSA4IGlmIG4yID09IDggYW5kIHRoZQorCSAqIHR3byBhcnJheXMgYXJlIGNvbXBsZXRlIFtzdGV2ZV0KKwkgKi8KKwlpZiAobjIgPT0gOCAmJiBkbmEgPT0gMCAmJiBkbmIgPT0gMCkKKwkJeworCQlibl9tdWxfY29tYmE4KHIsYSxiKTsKKwkJcmV0dXJuOyAKKwkJfQorIyBlbmRpZiAvKiBCTl9NVUxfQ09NQkEgKi8KKwkvKiBFbHNlIGRvIG5vcm1hbCBtdWx0aXBseSAqLworCWlmIChuMiA8IEJOX01VTF9SRUNVUlNJVkVfU0laRV9OT1JNQUwpCisJCXsKKwkJYm5fbXVsX25vcm1hbChyLGEsbjIrZG5hLGIsbjIrZG5iKTsKKwkJaWYgKChkbmEgKyBkbmIpIDwgMCkKKwkJCW1lbXNldCgmclsyKm4yICsgZG5hICsgZG5iXSwgMCwKKwkJCQlzaXplb2YoQk5fVUxPTkcpICogLShkbmEgKyBkbmIpKTsKKwkJcmV0dXJuOworCQl9CisJLyogcj0oYVswXS1hWzFdKSooYlsxXS1iWzBdKSAqLworCWMxPWJuX2NtcF9wYXJ0X3dvcmRzKGEsJihhW25dKSx0bmEsbi10bmEpOworCWMyPWJuX2NtcF9wYXJ0X3dvcmRzKCYoYltuXSksYix0bmIsdG5iLW4pOworCXplcm89bmVnPTA7CisJc3dpdGNoIChjMSozK2MyKQorCQl7CisJY2FzZSAtNDoKKwkJYm5fc3ViX3BhcnRfd29yZHModCwgICAgICAmKGFbbl0pLGEsICAgICAgdG5hLHRuYS1uKTsgLyogLSAqLworCQlibl9zdWJfcGFydF93b3JkcygmKHRbbl0pLGIsICAgICAgJihiW25dKSx0bmIsbi10bmIpOyAvKiAtICovCisJCWJyZWFrOworCWNhc2UgLTM6CisJCXplcm89MTsKKwkJYnJlYWs7CisJY2FzZSAtMjoKKwkJYm5fc3ViX3BhcnRfd29yZHModCwgICAgICAmKGFbbl0pLGEsICAgICAgdG5hLHRuYS1uKTsgLyogLSAqLworCQlibl9zdWJfcGFydF93b3JkcygmKHRbbl0pLCYoYltuXSksYiwgICAgICB0bmIsdG5iLW4pOyAvKiArICovCisJCW5lZz0xOworCQlicmVhazsKKwljYXNlIC0xOgorCWNhc2UgMDoKKwljYXNlIDE6CisJCXplcm89MTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlibl9zdWJfcGFydF93b3Jkcyh0LCAgICAgIGEsICAgICAgJihhW25dKSx0bmEsbi10bmEpOyAvKiArICovCisJCWJuX3N1Yl9wYXJ0X3dvcmRzKCYodFtuXSksYiwgICAgICAmKGJbbl0pLHRuYixuLXRuYik7IC8qIC0gKi8KKwkJbmVnPTE7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJemVybz0xOworCQlicmVhazsKKwljYXNlIDQ6CisJCWJuX3N1Yl9wYXJ0X3dvcmRzKHQsICAgICAgYSwgICAgICAmKGFbbl0pLHRuYSxuLXRuYSk7CisJCWJuX3N1Yl9wYXJ0X3dvcmRzKCYodFtuXSksJihiW25dKSxiLCAgICAgIHRuYix0bmItbik7CisJCWJyZWFrOworCQl9CisKKyMgaWZkZWYgQk5fTVVMX0NPTUJBCisJaWYgKG4gPT0gNCAmJiBkbmEgPT0gMCAmJiBkbmIgPT0gMCkgLyogWFhYOiBibl9tdWxfY29tYmE0IGNvdWxkIHRha2UKKwkJCQkJICAgICAgIGV4dHJhIGFyZ3MgdG8gZG8gdGhpcyB3ZWxsICovCisJCXsKKwkJaWYgKCF6ZXJvKQorCQkJYm5fbXVsX2NvbWJhNCgmKHRbbjJdKSx0LCYodFtuXSkpOworCQllbHNlCisJCQltZW1zZXQoJih0W24yXSksMCw4KnNpemVvZihCTl9VTE9ORykpOworCQkKKwkJYm5fbXVsX2NvbWJhNChyLGEsYik7CisJCWJuX211bF9jb21iYTQoJihyW24yXSksJihhW25dKSwmKGJbbl0pKTsKKwkJfQorCWVsc2UgaWYgKG4gPT0gOCAmJiBkbmEgPT0gMCAmJiBkbmIgPT0gMCkgLyogWFhYOiBibl9tdWxfY29tYmE4IGNvdWxkCisJCQkJCQkgICAgdGFrZSBleHRyYSBhcmdzIHRvIGRvIHRoaXMKKwkJCQkJCSAgICB3ZWxsICovCisJCXsKKwkJaWYgKCF6ZXJvKQorCQkJYm5fbXVsX2NvbWJhOCgmKHRbbjJdKSx0LCYodFtuXSkpOworCQllbHNlCisJCQltZW1zZXQoJih0W24yXSksMCwxNipzaXplb2YoQk5fVUxPTkcpKTsKKwkJCisJCWJuX211bF9jb21iYTgocixhLGIpOworCQlibl9tdWxfY29tYmE4KCYocltuMl0pLCYoYVtuXSksJihiW25dKSk7CisJCX0KKwllbHNlCisjIGVuZGlmIC8qIEJOX01VTF9DT01CQSAqLworCQl7CisJCXA9ICYodFtuMioyXSk7CisJCWlmICghemVybykKKwkJCWJuX211bF9yZWN1cnNpdmUoJih0W24yXSksdCwmKHRbbl0pLG4sMCwwLHApOworCQllbHNlCisJCQltZW1zZXQoJih0W24yXSksMCxuMipzaXplb2YoQk5fVUxPTkcpKTsKKwkJYm5fbXVsX3JlY3Vyc2l2ZShyLGEsYixuLDAsMCxwKTsKKwkJYm5fbXVsX3JlY3Vyc2l2ZSgmKHJbbjJdKSwmKGFbbl0pLCYoYltuXSksbixkbmEsZG5iLHApOworCQl9CisKKwkvKiB0WzMyXSBob2xkcyAoYVswXS1hWzFdKSooYlsxXS1iWzBdKSwgYzEgaXMgdGhlIHNpZ24KKwkgKiByWzEwXSBob2xkcyAoYVswXSpiWzBdKQorCSAqIHJbMzJdIGhvbGRzIChiWzFdKmJbMV0pCisJICovCisKKwljMT0oaW50KShibl9hZGRfd29yZHModCxyLCYocltuMl0pLG4yKSk7CisKKwlpZiAobmVnKSAvKiBpZiB0WzMyXSBpcyBuZWdhdGl2ZSAqLworCQl7CisJCWMxLT0oaW50KShibl9zdWJfd29yZHMoJih0W24yXSksdCwmKHRbbjJdKSxuMikpOworCQl9CisJZWxzZQorCQl7CisJCS8qIE1pZ2h0IGhhdmUgYSBjYXJyeSAqLworCQljMSs9KGludCkoYm5fYWRkX3dvcmRzKCYodFtuMl0pLCYodFtuMl0pLHQsbjIpKTsKKwkJfQorCisJLyogdFszMl0gaG9sZHMgKGFbMF0tYVsxXSkqKGJbMV0tYlswXSkrKGFbMF0qYlswXSkrKGFbMV0qYlsxXSkKKwkgKiByWzEwXSBob2xkcyAoYVswXSpiWzBdKQorCSAqIHJbMzJdIGhvbGRzIChiWzFdKmJbMV0pCisJICogYzEgaG9sZHMgdGhlIGNhcnJ5IGJpdHMKKwkgKi8KKwljMSs9KGludCkoYm5fYWRkX3dvcmRzKCYocltuXSksJihyW25dKSwmKHRbbjJdKSxuMikpOworCWlmIChjMSkKKwkJeworCQlwPSAmKHJbbituMl0pOworCQlsbz0gKnA7CisJCWxuPShsbytjMSkmQk5fTUFTSzI7CisJCSpwPWxuOworCisJCS8qIFRoZSBvdmVyZmxvdyB3aWxsIHN0b3AgYmVmb3JlIHdlIG92ZXIgd3JpdGUKKwkJICogd29yZHMgd2Ugc2hvdWxkIG5vdCBvdmVyd3JpdGUgKi8KKwkJaWYgKGxuIDwgKEJOX1VMT05HKWMxKQorCQkJeworCQkJZG8JeworCQkJCXArKzsKKwkJCQlsbz0gKnA7CisJCQkJbG49KGxvKzEpJkJOX01BU0syOworCQkJCSpwPWxuOworCQkJCX0gd2hpbGUgKGxuID09IDApOworCQkJfQorCQl9CisJfQorCisvKiBuK3RuIGlzIHRoZSB3b3JkIGxlbmd0aAorICogdCBuZWVkcyB0byBiZSBuKjQgaXMgc2l6ZSwgYXMgZG9lcyByICovCisvKiB0blggbWF5IG5vdCBiZSBuZWdhdGl2ZSBidXQgbGVzcyB0aGFuIG4gKi8KK3ZvaWQgYm5fbXVsX3BhcnRfcmVjdXJzaXZlKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIsIGludCBuLAorCSAgICAgaW50IHRuYSwgaW50IHRuYiwgQk5fVUxPTkcgKnQpCisJeworCWludCBpLGosbjI9bioyOworCWludCBjMSxjMixuZWcsemVybzsKKwlCTl9VTE9ORyBsbixsbywqcDsKKworIyBpZmRlZiBCTl9DT1VOVAorCWZwcmludGYoc3RkZXJyLCIgYm5fbXVsX3BhcnRfcmVjdXJzaXZlICglZCUrZCkgKiAoJWQlK2QpXG4iLAorCQluLCB0bmEsIG4sIHRuYik7CisjIGVuZGlmCisJaWYgKG4gPCA4KQorCQl7CisJCWJuX211bF9ub3JtYWwocixhLG4rdG5hLGIsbit0bmIpOworCQlyZXR1cm47CisJCX0KKworCS8qIHI9KGFbMF0tYVsxXSkqKGJbMV0tYlswXSkgKi8KKwljMT1ibl9jbXBfcGFydF93b3JkcyhhLCYoYVtuXSksdG5hLG4tdG5hKTsKKwljMj1ibl9jbXBfcGFydF93b3JkcygmKGJbbl0pLGIsdG5iLHRuYi1uKTsKKwl6ZXJvPW5lZz0wOworCXN3aXRjaCAoYzEqMytjMikKKwkJeworCWNhc2UgLTQ6CisJCWJuX3N1Yl9wYXJ0X3dvcmRzKHQsICAgICAgJihhW25dKSxhLCAgICAgIHRuYSx0bmEtbik7IC8qIC0gKi8KKwkJYm5fc3ViX3BhcnRfd29yZHMoJih0W25dKSxiLCAgICAgICYoYltuXSksdG5iLG4tdG5iKTsgLyogLSAqLworCQlicmVhazsKKwljYXNlIC0zOgorCQl6ZXJvPTE7CisJCS8qIGJyZWFrOyAqLworCWNhc2UgLTI6CisJCWJuX3N1Yl9wYXJ0X3dvcmRzKHQsICAgICAgJihhW25dKSxhLCAgICAgIHRuYSx0bmEtbik7IC8qIC0gKi8KKwkJYm5fc3ViX3BhcnRfd29yZHMoJih0W25dKSwmKGJbbl0pLGIsICAgICAgdG5iLHRuYi1uKTsgLyogKyAqLworCQluZWc9MTsKKwkJYnJlYWs7CisJY2FzZSAtMToKKwljYXNlIDA6CisJY2FzZSAxOgorCQl6ZXJvPTE7CisJCS8qIGJyZWFrOyAqLworCWNhc2UgMjoKKwkJYm5fc3ViX3BhcnRfd29yZHModCwgICAgICBhLCAgICAgICYoYVtuXSksdG5hLG4tdG5hKTsgLyogKyAqLworCQlibl9zdWJfcGFydF93b3JkcygmKHRbbl0pLGIsICAgICAgJihiW25dKSx0bmIsbi10bmIpOyAvKiAtICovCisJCW5lZz0xOworCQlicmVhazsKKwljYXNlIDM6CisJCXplcm89MTsKKwkJLyogYnJlYWs7ICovCisJY2FzZSA0OgorCQlibl9zdWJfcGFydF93b3Jkcyh0LCAgICAgIGEsICAgICAgJihhW25dKSx0bmEsbi10bmEpOworCQlibl9zdWJfcGFydF93b3JkcygmKHRbbl0pLCYoYltuXSksYiwgICAgICB0bmIsdG5iLW4pOworCQlicmVhazsKKwkJfQorCQkvKiBUaGUgemVybyBjYXNlIGlzbid0IHlldCBpbXBsZW1lbnRlZCBoZXJlLiBUaGUgc3BlZWR1cAorCQkgICB3b3VsZCBwcm9iYWJseSBiZSBuZWdsaWdpYmxlLiAqLworIyBpZiAwCisJaWYgKG4gPT0gNCkKKwkJeworCQlibl9tdWxfY29tYmE0KCYodFtuMl0pLHQsJih0W25dKSk7CisJCWJuX211bF9jb21iYTQocixhLGIpOworCQlibl9tdWxfbm9ybWFsKCYocltuMl0pLCYoYVtuXSksdG4sJihiW25dKSx0bik7CisJCW1lbXNldCgmKHJbbjIrdG4qMl0pLDAsc2l6ZW9mKEJOX1VMT05HKSoobjItdG4qMikpOworCQl9CisJZWxzZQorIyBlbmRpZgorCWlmIChuID09IDgpCisJCXsKKwkJYm5fbXVsX2NvbWJhOCgmKHRbbjJdKSx0LCYodFtuXSkpOworCQlibl9tdWxfY29tYmE4KHIsYSxiKTsKKwkJYm5fbXVsX25vcm1hbCgmKHJbbjJdKSwmKGFbbl0pLHRuYSwmKGJbbl0pLHRuYik7CisJCW1lbXNldCgmKHJbbjIrdG5hK3RuYl0pLDAsc2l6ZW9mKEJOX1VMT05HKSoobjItdG5hLXRuYikpOworCQl9CisJZWxzZQorCQl7CisJCXA9ICYodFtuMioyXSk7CisJCWJuX211bF9yZWN1cnNpdmUoJih0W24yXSksdCwmKHRbbl0pLG4sMCwwLHApOworCQlibl9tdWxfcmVjdXJzaXZlKHIsYSxiLG4sMCwwLHApOworCQlpPW4vMjsKKwkJLyogSWYgdGhlcmUgaXMgb25seSBhIGJvdHRvbSBoYWxmIHRvIHRoZSBudW1iZXIsCisJCSAqIGp1c3QgZG8gaXQgKi8KKwkJaWYgKHRuYSA+IHRuYikKKwkJCWogPSB0bmEgLSBpOworCQllbHNlCisJCQlqID0gdG5iIC0gaTsKKwkJaWYgKGogPT0gMCkKKwkJCXsKKwkJCWJuX211bF9yZWN1cnNpdmUoJihyW24yXSksJihhW25dKSwmKGJbbl0pLAorCQkJCWksdG5hLWksdG5iLWkscCk7CisJCQltZW1zZXQoJihyW24yK2kqMl0pLDAsc2l6ZW9mKEJOX1VMT05HKSoobjItaSoyKSk7CisJCQl9CisJCWVsc2UgaWYgKGogPiAwKSAvKiBlZywgbiA9PSAxNiwgaSA9PSA4IGFuZCB0biA9PSAxMSAqLworCQkJCXsKKwkJCQlibl9tdWxfcGFydF9yZWN1cnNpdmUoJihyW24yXSksJihhW25dKSwmKGJbbl0pLAorCQkJCQlpLHRuYS1pLHRuYi1pLHApOworCQkJCW1lbXNldCgmKHJbbjIrdG5hK3RuYl0pLDAsCisJCQkJCXNpemVvZihCTl9VTE9ORykqKG4yLXRuYS10bmIpKTsKKwkJCQl9CisJCWVsc2UgLyogKGogPCAwKSBlZywgbiA9PSAxNiwgaSA9PSA4IGFuZCB0biA9PSA1ICovCisJCQl7CisJCQltZW1zZXQoJihyW24yXSksMCxzaXplb2YoQk5fVUxPTkcpKm4yKTsKKwkJCWlmICh0bmEgPCBCTl9NVUxfUkVDVVJTSVZFX1NJWkVfTk9STUFMCisJCQkJJiYgdG5iIDwgQk5fTVVMX1JFQ1VSU0lWRV9TSVpFX05PUk1BTCkKKwkJCQl7CisJCQkJYm5fbXVsX25vcm1hbCgmKHJbbjJdKSwmKGFbbl0pLHRuYSwmKGJbbl0pLHRuYik7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlmb3IgKDs7KQorCQkJCQl7CisJCQkJCWkvPTI7CisJCQkJCS8qIHRoZXNlIHNpbXBsaWZpZWQgY29uZGl0aW9ucyB3b3JrCisJCQkJCSAqIGV4Y2x1c2l2ZWx5IGJlY2F1c2UgZGlmZmVyZW5jZQorCQkJCQkgKiBiZXR3ZWVuIHRuYSBhbmQgdG5iIGlzIDEgb3IgMCAqLworCQkJCQlpZiAoaSA8IHRuYSB8fCBpIDwgdG5iKQorCQkJCQkJeworCQkJCQkJYm5fbXVsX3BhcnRfcmVjdXJzaXZlKCYocltuMl0pLAorCQkJCQkJCSYoYVtuXSksJihiW25dKSwKKwkJCQkJCQlpLHRuYS1pLHRuYi1pLHApOworCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCWVsc2UgaWYgKGkgPT0gdG5hIHx8IGkgPT0gdG5iKQorCQkJCQkJeworCQkJCQkJYm5fbXVsX3JlY3Vyc2l2ZSgmKHJbbjJdKSwKKwkJCQkJCQkmKGFbbl0pLCYoYltuXSksCisJCQkJCQkJaSx0bmEtaSx0bmItaSxwKTsKKwkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkvKiB0WzMyXSBob2xkcyAoYVswXS1hWzFdKSooYlsxXS1iWzBdKSwgYzEgaXMgdGhlIHNpZ24KKwkgKiByWzEwXSBob2xkcyAoYVswXSpiWzBdKQorCSAqIHJbMzJdIGhvbGRzIChiWzFdKmJbMV0pCisJICovCisKKwljMT0oaW50KShibl9hZGRfd29yZHModCxyLCYocltuMl0pLG4yKSk7CisKKwlpZiAobmVnKSAvKiBpZiB0WzMyXSBpcyBuZWdhdGl2ZSAqLworCQl7CisJCWMxLT0oaW50KShibl9zdWJfd29yZHMoJih0W24yXSksdCwmKHRbbjJdKSxuMikpOworCQl9CisJZWxzZQorCQl7CisJCS8qIE1pZ2h0IGhhdmUgYSBjYXJyeSAqLworCQljMSs9KGludCkoYm5fYWRkX3dvcmRzKCYodFtuMl0pLCYodFtuMl0pLHQsbjIpKTsKKwkJfQorCisJLyogdFszMl0gaG9sZHMgKGFbMF0tYVsxXSkqKGJbMV0tYlswXSkrKGFbMF0qYlswXSkrKGFbMV0qYlsxXSkKKwkgKiByWzEwXSBob2xkcyAoYVswXSpiWzBdKQorCSAqIHJbMzJdIGhvbGRzIChiWzFdKmJbMV0pCisJICogYzEgaG9sZHMgdGhlIGNhcnJ5IGJpdHMKKwkgKi8KKwljMSs9KGludCkoYm5fYWRkX3dvcmRzKCYocltuXSksJihyW25dKSwmKHRbbjJdKSxuMikpOworCWlmIChjMSkKKwkJeworCQlwPSAmKHJbbituMl0pOworCQlsbz0gKnA7CisJCWxuPShsbytjMSkmQk5fTUFTSzI7CisJCSpwPWxuOworCisJCS8qIFRoZSBvdmVyZmxvdyB3aWxsIHN0b3AgYmVmb3JlIHdlIG92ZXIgd3JpdGUKKwkJICogd29yZHMgd2Ugc2hvdWxkIG5vdCBvdmVyd3JpdGUgKi8KKwkJaWYgKGxuIDwgKEJOX1VMT05HKWMxKQorCQkJeworCQkJZG8JeworCQkJCXArKzsKKwkJCQlsbz0gKnA7CisJCQkJbG49KGxvKzEpJkJOX01BU0syOworCQkJCSpwPWxuOworCQkJCX0gd2hpbGUgKGxuID09IDApOworCQkJfQorCQl9CisJfQorCisvKiBhIGFuZCBiIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSwgd2hpY2ggaXMgbjIuCisgKiByIG5lZWRzIHRvIGJlIG4yIHdvcmRzIGFuZCB0IG5lZWRzIHRvIGJlIG4yKjIKKyAqLwordm9pZCBibl9tdWxfbG93X3JlY3Vyc2l2ZShCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIEJOX1VMT05HICpiLCBpbnQgbjIsCisJICAgICBCTl9VTE9ORyAqdCkKKwl7CisJaW50IG49bjIvMjsKKworIyBpZmRlZiBCTl9DT1VOVAorCWZwcmludGYoc3RkZXJyLCIgYm5fbXVsX2xvd19yZWN1cnNpdmUgJWQgKiAlZFxuIixuMixuMik7CisjIGVuZGlmCisKKwlibl9tdWxfcmVjdXJzaXZlKHIsYSxiLG4sMCwwLCYodFswXSkpOworCWlmIChuID49IEJOX01VTF9MT1dfUkVDVVJTSVZFX1NJWkVfTk9STUFMKQorCQl7CisJCWJuX211bF9sb3dfcmVjdXJzaXZlKCYodFswXSksJihhWzBdKSwmKGJbbl0pLG4sJih0W24yXSkpOworCQlibl9hZGRfd29yZHMoJihyW25dKSwmKHJbbl0pLCYodFswXSksbik7CisJCWJuX211bF9sb3dfcmVjdXJzaXZlKCYodFswXSksJihhW25dKSwmKGJbMF0pLG4sJih0W24yXSkpOworCQlibl9hZGRfd29yZHMoJihyW25dKSwmKHJbbl0pLCYodFswXSksbik7CisJCX0KKwllbHNlCisJCXsKKwkJYm5fbXVsX2xvd19ub3JtYWwoJih0WzBdKSwmKGFbMF0pLCYoYltuXSksbik7CisJCWJuX211bF9sb3dfbm9ybWFsKCYodFtuXSksJihhW25dKSwmKGJbMF0pLG4pOworCQlibl9hZGRfd29yZHMoJihyW25dKSwmKHJbbl0pLCYodFswXSksbik7CisJCWJuX2FkZF93b3JkcygmKHJbbl0pLCYocltuXSksJih0W25dKSxuKTsKKwkJfQorCX0KKworLyogYSBhbmQgYiBtdXN0IGJlIHRoZSBzYW1lIHNpemUsIHdoaWNoIGlzIG4yLgorICogciBuZWVkcyB0byBiZSBuMiB3b3JkcyBhbmQgdCBuZWVkcyB0byBiZSBuMioyCisgKiBsIGlzIHRoZSBsb3cgd29yZHMgb2YgdGhlIG91dHB1dC4KKyAqIHQgbmVlZHMgdG8gYmUgbjIqMworICovCit2b2lkIGJuX211bF9oaWdoKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIsIEJOX1VMT05HICpsLCBpbnQgbjIsCisJICAgICBCTl9VTE9ORyAqdCkKKwl7CisJaW50IGksbjsKKwlpbnQgYzEsYzI7CisJaW50IG5lZyxvbmVnLHplcm87CisJQk5fVUxPTkcgbGwsbGMsKmxwLCptcDsKKworIyBpZmRlZiBCTl9DT1VOVAorCWZwcmludGYoc3RkZXJyLCIgYm5fbXVsX2hpZ2ggJWQgKiAlZFxuIixuMixuMik7CisjIGVuZGlmCisJbj1uMi8yOworCisJLyogQ2FsY3VsYXRlIChhbC1haCkqKGJoLWJsKSAqLworCW5lZz16ZXJvPTA7CisJYzE9Ym5fY21wX3dvcmRzKCYoYVswXSksJihhW25dKSxuKTsKKwljMj1ibl9jbXBfd29yZHMoJihiW25dKSwmKGJbMF0pLG4pOworCXN3aXRjaCAoYzEqMytjMikKKwkJeworCWNhc2UgLTQ6CisJCWJuX3N1Yl93b3JkcygmKHJbMF0pLCYoYVtuXSksJihhWzBdKSxuKTsKKwkJYm5fc3ViX3dvcmRzKCYocltuXSksJihiWzBdKSwmKGJbbl0pLG4pOworCQlicmVhazsKKwljYXNlIC0zOgorCQl6ZXJvPTE7CisJCWJyZWFrOworCWNhc2UgLTI6CisJCWJuX3N1Yl93b3JkcygmKHJbMF0pLCYoYVtuXSksJihhWzBdKSxuKTsKKwkJYm5fc3ViX3dvcmRzKCYocltuXSksJihiW25dKSwmKGJbMF0pLG4pOworCQluZWc9MTsKKwkJYnJlYWs7CisJY2FzZSAtMToKKwljYXNlIDA6CisJY2FzZSAxOgorCQl6ZXJvPTE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYm5fc3ViX3dvcmRzKCYoclswXSksJihhWzBdKSwmKGFbbl0pLG4pOworCQlibl9zdWJfd29yZHMoJihyW25dKSwmKGJbMF0pLCYoYltuXSksbik7CisJCW5lZz0xOworCQlicmVhazsKKwljYXNlIDM6CisJCXplcm89MTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlibl9zdWJfd29yZHMoJihyWzBdKSwmKGFbMF0pLCYoYVtuXSksbik7CisJCWJuX3N1Yl93b3JkcygmKHJbbl0pLCYoYltuXSksJihiWzBdKSxuKTsKKwkJYnJlYWs7CisJCX0KKwkJCisJb25lZz1uZWc7CisJLyogdFsxMF0gPSAoYVswXS1hWzFdKSooYlsxXS1iWzBdKSAqLworCS8qIHJbMTBdID0gKGFbMV0qYlsxXSkgKi8KKyMgaWZkZWYgQk5fTVVMX0NPTUJBCisJaWYgKG4gPT0gOCkKKwkJeworCQlibl9tdWxfY29tYmE4KCYodFswXSksJihyWzBdKSwmKHJbbl0pKTsKKwkJYm5fbXVsX2NvbWJhOChyLCYoYVtuXSksJihiW25dKSk7CisJCX0KKwllbHNlCisjIGVuZGlmCisJCXsKKwkJYm5fbXVsX3JlY3Vyc2l2ZSgmKHRbMF0pLCYoclswXSksJihyW25dKSxuLDAsMCwmKHRbbjJdKSk7CisJCWJuX211bF9yZWN1cnNpdmUociwmKGFbbl0pLCYoYltuXSksbiwwLDAsJih0W24yXSkpOworCQl9CisKKwkvKiBzMCA9PSBsb3coYWwqYmwpCisJICogczEgPT0gbG93KGFoKmJoKStsb3coKGFsLWFoKSooYmgtYmwpKStsb3coYWwqYmwpK2hpZ2goYWwqYmwpCisJICogV2Uga25vdyBzMCBhbmQgczEgc28gdGhlIG9ubHkgdW5rbm93biBpcyBoaWdoKGFsKmJsKQorCSAqIGhpZ2goYWwqYmwpID09IHMxIC0gbG93KGFoKmJoK3MwKyhhbC1haCkqKGJoLWJsKSkKKwkgKiBoaWdoKGFsKmJsKSA9PSBzMSAtIChyWzBdK2xbMF0rdFswXSkKKwkgKi8KKwlpZiAobCAhPSBOVUxMKQorCQl7CisJCWxwPSAmKHRbbjIrbl0pOworCQljMT0oaW50KShibl9hZGRfd29yZHMobHAsJihyWzBdKSwmKGxbMF0pLG4pKTsKKwkJfQorCWVsc2UKKwkJeworCQljMT0wOworCQlscD0gJihyWzBdKTsKKwkJfQorCisJaWYgKG5lZykKKwkJbmVnPShpbnQpKGJuX3N1Yl93b3JkcygmKHRbbjJdKSxscCwmKHRbMF0pLG4pKTsKKwllbHNlCisJCXsKKwkJYm5fYWRkX3dvcmRzKCYodFtuMl0pLGxwLCYodFswXSksbik7CisJCW5lZz0wOworCQl9CisKKwlpZiAobCAhPSBOVUxMKQorCQl7CisJCWJuX3N1Yl93b3JkcygmKHRbbjIrbl0pLCYobFtuXSksJih0W24yXSksbik7CisJCX0KKwllbHNlCisJCXsKKwkJbHA9ICYodFtuMituXSk7CisJCW1wPSAmKHRbbjJdKTsKKwkJZm9yIChpPTA7IGk8bjsgaSsrKQorCQkJbHBbaV09KCh+bXBbaV0pKzEpJkJOX01BU0syOworCQl9CisKKwkvKiBzWzBdID0gbG93KGFsKmJsKQorCSAqIHRbM10gPSBoaWdoKGFsKmJsKQorCSAqIHRbMTBdID0gKGFbMF0tYVsxXSkqKGJbMV0tYlswXSkgbmVnIGlzIHRoZSBzaWduCisJICogclsxMF0gPSAoYVsxXSpiWzFdKQorCSAqLworCS8qIFJbMTBdID0gYWwqYmwKKwkgKiBSWzIxXSA9IGFsKmJsICsgYWgqYmggKyAoYVswXS1hWzFdKSooYlsxXS1iWzBdKQorCSAqIFJbMzJdID0gYWgqYmgKKwkgKi8KKwkvKiBSWzFdPXRbM10rbFswXStyWzBdKCstKXRbMF0gKGhhdmUgY2FycnkvYm9ycm93KQorCSAqIFJbMl09clswXSt0WzNdK3JbMV0oKy0pdFsxXSAoaGF2ZSBjYXJyeS9ib3Jyb3cpCisJICogUlszXT1yWzFdKyhjYXJyeS9ib3Jyb3cpCisJICovCisJaWYgKGwgIT0gTlVMTCkKKwkJeworCQlscD0gJih0W24yXSk7CisJCWMxPSAoaW50KShibl9hZGRfd29yZHMobHAsJih0W24yK25dKSwmKGxbMF0pLG4pKTsKKwkJfQorCWVsc2UKKwkJeworCQlscD0gJih0W24yK25dKTsKKwkJYzE9MDsKKwkJfQorCWMxKz0oaW50KShibl9hZGRfd29yZHMoJih0W24yXSksbHAsICAmKHJbMF0pLG4pKTsKKwlpZiAob25lZykKKwkJYzEtPShpbnQpKGJuX3N1Yl93b3JkcygmKHRbbjJdKSwmKHRbbjJdKSwmKHRbMF0pLG4pKTsKKwllbHNlCisJCWMxKz0oaW50KShibl9hZGRfd29yZHMoJih0W24yXSksJih0W24yXSksJih0WzBdKSxuKSk7CisKKwljMiA9KGludCkoYm5fYWRkX3dvcmRzKCYoclswXSksJihyWzBdKSwmKHRbbjIrbl0pLG4pKTsKKwljMis9KGludCkoYm5fYWRkX3dvcmRzKCYoclswXSksJihyWzBdKSwmKHJbbl0pLG4pKTsKKwlpZiAob25lZykKKwkJYzItPShpbnQpKGJuX3N1Yl93b3JkcygmKHJbMF0pLCYoclswXSksJih0W25dKSxuKSk7CisJZWxzZQorCQljMis9KGludCkoYm5fYWRkX3dvcmRzKCYoclswXSksJihyWzBdKSwmKHRbbl0pLG4pKTsKKwkKKwlpZiAoYzEgIT0gMCkgLyogQWRkIHN0YXJ0aW5nIGF0IHJbMF0sIGNvdWxkIGJlICt2ZSBvciAtdmUgKi8KKwkJeworCQlpPTA7CisJCWlmIChjMSA+IDApCisJCQl7CisJCQlsYz1jMTsKKwkJCWRvCXsKKwkJCQlsbD0ocltpXStsYykmQk5fTUFTSzI7CisJCQkJcltpKytdPWxsOworCQkJCWxjPShsYyA+IGxsKTsKKwkJCQl9IHdoaWxlIChsYyk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWxjPSAtYzE7CisJCQlkbwl7CisJCQkJbGw9cltpXTsKKwkJCQlyW2krK109KGxsLWxjKSZCTl9NQVNLMjsKKwkJCQlsYz0obGMgPiBsbCk7CisJCQkJfSB3aGlsZSAobGMpOworCQkJfQorCQl9CisJaWYgKGMyICE9IDApIC8qIEFkZCBzdGFydGluZyBhdCByWzFdICovCisJCXsKKwkJaT1uOworCQlpZiAoYzIgPiAwKQorCQkJeworCQkJbGM9YzI7CisJCQlkbwl7CisJCQkJbGw9KHJbaV0rbGMpJkJOX01BU0syOworCQkJCXJbaSsrXT1sbDsKKwkJCQlsYz0obGMgPiBsbCk7CisJCQkJfSB3aGlsZSAobGMpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlsYz0gLWMyOworCQkJZG8JeworCQkJCWxsPXJbaV07CisJCQkJcltpKytdPShsbC1sYykmQk5fTUFTSzI7CisJCQkJbGM9KGxjID4gbGwpOworCQkJCX0gd2hpbGUgKGxjKTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBCTl9SRUNVUlNJT04gKi8KKworaW50IEJOX211bChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldD0wOworCWludCB0b3AsYWwsYmw7CisJQklHTlVNICpycjsKKyNpZiBkZWZpbmVkKEJOX01VTF9DT01CQSkgfHwgZGVmaW5lZChCTl9SRUNVUlNJT04pCisJaW50IGk7CisjZW5kaWYKKyNpZmRlZiBCTl9SRUNVUlNJT04KKwlCSUdOVU0gKnQ9TlVMTDsKKwlpbnQgaj0wLGs7CisjZW5kaWYKKworI2lmZGVmIEJOX0NPVU5UCisJZnByaW50ZihzdGRlcnIsIkJOX211bCAlZCAqICVkXG4iLGEtPnRvcCxiLT50b3ApOworI2VuZGlmCisKKwlibl9jaGVja190b3AoYSk7CisJYm5fY2hlY2tfdG9wKGIpOworCWJuX2NoZWNrX3RvcChyKTsKKworCWFsPWEtPnRvcDsKKwlibD1iLT50b3A7CisKKwlpZiAoKGFsID09IDApIHx8IChibCA9PSAwKSkKKwkJeworCQlCTl96ZXJvKHIpOworCQlyZXR1cm4oMSk7CisJCX0KKwl0b3A9YWwrYmw7CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlpZiAoKHIgPT0gYSkgfHwgKHIgPT0gYikpCisJCXsKKwkJaWYgKChyciA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXJyID0gcjsKKwlyci0+bmVnPWEtPm5lZ15iLT5uZWc7CisKKyNpZiBkZWZpbmVkKEJOX01VTF9DT01CQSkgfHwgZGVmaW5lZChCTl9SRUNVUlNJT04pCisJaSA9IGFsLWJsOworI2VuZGlmCisjaWZkZWYgQk5fTVVMX0NPTUJBCisJaWYgKGkgPT0gMCkKKwkJeworIyBpZiAwCisJCWlmIChhbCA9PSA0KQorCQkJeworCQkJaWYgKGJuX3dleHBhbmQocnIsOCkgPT0gTlVMTCkgZ290byBlcnI7CisJCQlyci0+dG9wPTg7CisJCQlibl9tdWxfY29tYmE0KHJyLT5kLGEtPmQsYi0+ZCk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKyMgZW5kaWYKKwkJaWYgKGFsID09IDgpCisJCQl7CisJCQlpZiAoYm5fd2V4cGFuZChyciwxNikgPT0gTlVMTCkgZ290byBlcnI7CisJCQlyci0+dG9wPTE2OworCQkJYm5fbXVsX2NvbWJhOChyci0+ZCxhLT5kLGItPmQpOworCQkJZ290byBlbmQ7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBCTl9NVUxfQ09NQkEgKi8KKyNpZmRlZiBCTl9SRUNVUlNJT04KKwlpZiAoKGFsID49IEJOX01VTExfU0laRV9OT1JNQUwpICYmIChibCA+PSBCTl9NVUxMX1NJWkVfTk9STUFMKSkKKwkJeworCQlpZiAoaSA+PSAtMSAmJiBpIDw9IDEpCisJCQl7CisJCQlpbnQgc2F2X2ogPTA7CisJCQkvKiBGaW5kIG91dCB0aGUgcG93ZXIgb2YgdHdvIGxvd2VyIG9yIGVxdWFsCisJCQkgICB0byB0aGUgbG9uZ2VzdCBvZiB0aGUgdHdvIG51bWJlcnMgKi8KKwkJCWlmIChpID49IDApCisJCQkJeworCQkJCWogPSBCTl9udW1fYml0c193b3JkKChCTl9VTE9ORylhbCk7CisJCQkJfQorCQkJaWYgKGkgPT0gLTEpCisJCQkJeworCQkJCWogPSBCTl9udW1fYml0c193b3JkKChCTl9VTE9ORylibCk7CisJCQkJfQorCQkJc2F2X2ogPSBqOworCQkJaiA9IDE8PChqLTEpOworCQkJYXNzZXJ0KGogPD0gYWwgfHwgaiA8PSBibCk7CisJCQlrID0gaitqOworCQkJdCA9IEJOX0NUWF9nZXQoY3R4KTsKKwkJCWlmICh0ID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCQlpZiAoYWwgPiBqIHx8IGJsID4gaikKKwkJCQl7CisJCQkJaWYgKGJuX3dleHBhbmQodCxrKjQpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWlmIChibl93ZXhwYW5kKHJyLGsqNCkgPT0gTlVMTCkgZ290byBlcnI7CisJCQkJYm5fbXVsX3BhcnRfcmVjdXJzaXZlKHJyLT5kLGEtPmQsYi0+ZCwKKwkJCQkJaixhbC1qLGJsLWosdC0+ZCk7CisJCQkJfQorCQkJZWxzZQkvKiBhbCA8PSBqIHx8IGJsIDw9IGogKi8KKwkJCQl7CisJCQkJaWYgKGJuX3dleHBhbmQodCxrKjIpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWlmIChibl93ZXhwYW5kKHJyLGsqMikgPT0gTlVMTCkgZ290byBlcnI7CisJCQkJYm5fbXVsX3JlY3Vyc2l2ZShyci0+ZCxhLT5kLGItPmQsCisJCQkJCWosYWwtaixibC1qLHQtPmQpOworCQkJCX0KKwkJCXJyLT50b3A9dG9wOworCQkJZ290byBlbmQ7CisJCQl9CisjaWYgMAorCQlpZiAoaSA9PSAxICYmICFCTl9nZXRfZmxhZ3MoYixCTl9GTEdfU1RBVElDX0RBVEEpKQorCQkJeworCQkJQklHTlVNICp0bXBfYm4gPSAoQklHTlVNICopYjsKKwkJCWlmIChibl93ZXhwYW5kKHRtcF9ibixhbCkgPT0gTlVMTCkgZ290byBlcnI7CisJCQl0bXBfYm4tPmRbYmxdPTA7CisJCQlibCsrOworCQkJaS0tOworCQkJfQorCQllbHNlIGlmIChpID09IC0xICYmICFCTl9nZXRfZmxhZ3MoYSxCTl9GTEdfU1RBVElDX0RBVEEpKQorCQkJeworCQkJQklHTlVNICp0bXBfYm4gPSAoQklHTlVNICopYTsKKwkJCWlmIChibl93ZXhwYW5kKHRtcF9ibixibCkgPT0gTlVMTCkgZ290byBlcnI7CisJCQl0bXBfYm4tPmRbYWxdPTA7CisJCQlhbCsrOworCQkJaSsrOworCQkJfQorCQlpZiAoaSA9PSAwKQorCQkJeworCQkJLyogc3ltbWV0cmljIGFuZCA+IDQgKi8KKwkJCS8qIDE2IG9yIGxhcmdlciAqLworCQkJaj1CTl9udW1fYml0c193b3JkKChCTl9VTE9ORylhbCk7CisJCQlqPTE8PChqLTEpOworCQkJaz1qK2o7CisJCQl0ID0gQk5fQ1RYX2dldChjdHgpOworCQkJaWYgKGFsID09IGopIC8qIGV4YWN0IG11bHRpcGxlICovCisJCQkJeworCQkJCWlmIChibl93ZXhwYW5kKHQsayoyKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJCQlpZiAoYm5fd2V4cGFuZChycixrKjIpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWJuX211bF9yZWN1cnNpdmUocnItPmQsYS0+ZCxiLT5kLGFsLHQtPmQpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKGJuX3dleHBhbmQodCxrKjQpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWlmIChibl93ZXhwYW5kKHJyLGsqNCkgPT0gTlVMTCkgZ290byBlcnI7CisJCQkJYm5fbXVsX3BhcnRfcmVjdXJzaXZlKHJyLT5kLGEtPmQsYi0+ZCxhbC1qLGosdC0+ZCk7CisJCQkJfQorCQkJcnItPnRvcD10b3A7CisJCQlnb3RvIGVuZDsKKwkJCX0KKyNlbmRpZgorCQl9CisjZW5kaWYgLyogQk5fUkVDVVJTSU9OICovCisJaWYgKGJuX3dleHBhbmQocnIsdG9wKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlyci0+dG9wPXRvcDsKKwlibl9tdWxfbm9ybWFsKHJyLT5kLGEtPmQsYWwsYi0+ZCxibCk7CisKKyNpZiBkZWZpbmVkKEJOX01VTF9DT01CQSkgfHwgZGVmaW5lZChCTl9SRUNVUlNJT04pCitlbmQ6CisjZW5kaWYKKwlibl9jb3JyZWN0X3RvcChycik7CisJaWYgKHIgIT0gcnIpIEJOX2NvcHkocixycik7CisJcmV0PTE7CitlcnI6CisJYm5fY2hlY2tfdG9wKHIpOworCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3ZvaWQgYm5fbXVsX25vcm1hbChCTl9VTE9ORyAqciwgQk5fVUxPTkcgKmEsIGludCBuYSwgQk5fVUxPTkcgKmIsIGludCBuYikKKwl7CisJQk5fVUxPTkcgKnJyOworCisjaWZkZWYgQk5fQ09VTlQKKwlmcHJpbnRmKHN0ZGVyciwiIGJuX211bF9ub3JtYWwgJWQgKiAlZFxuIixuYSxuYik7CisjZW5kaWYKKworCWlmIChuYSA8IG5iKQorCQl7CisJCWludCBpdG1wOworCQlCTl9VTE9ORyAqbHRtcDsKKworCQlpdG1wPW5hOyBuYT1uYjsgbmI9aXRtcDsKKwkJbHRtcD1hOyAgIGE9YjsgICBiPWx0bXA7CisKKwkJfQorCXJyPSAmKHJbbmFdKTsKKwlpZiAobmIgPD0gMCkKKwkJeworCQkodm9pZClibl9tdWxfd29yZHMocixhLG5hLDApOworCQlyZXR1cm47CisJCX0KKwllbHNlCisJCXJyWzBdPWJuX211bF93b3JkcyhyLGEsbmEsYlswXSk7CisKKwlmb3IgKDs7KQorCQl7CisJCWlmICgtLW5iIDw9IDApIHJldHVybjsKKwkJcnJbMV09Ym5fbXVsX2FkZF93b3JkcygmKHJbMV0pLGEsbmEsYlsxXSk7CisJCWlmICgtLW5iIDw9IDApIHJldHVybjsKKwkJcnJbMl09Ym5fbXVsX2FkZF93b3JkcygmKHJbMl0pLGEsbmEsYlsyXSk7CisJCWlmICgtLW5iIDw9IDApIHJldHVybjsKKwkJcnJbM109Ym5fbXVsX2FkZF93b3JkcygmKHJbM10pLGEsbmEsYlszXSk7CisJCWlmICgtLW5iIDw9IDApIHJldHVybjsKKwkJcnJbNF09Ym5fbXVsX2FkZF93b3JkcygmKHJbNF0pLGEsbmEsYls0XSk7CisJCXJyKz00OworCQlyKz00OworCQliKz00OworCQl9CisJfQorCit2b2lkIGJuX211bF9sb3dfbm9ybWFsKEJOX1VMT05HICpyLCBCTl9VTE9ORyAqYSwgQk5fVUxPTkcgKmIsIGludCBuKQorCXsKKyNpZmRlZiBCTl9DT1VOVAorCWZwcmludGYoc3RkZXJyLCIgYm5fbXVsX2xvd19ub3JtYWwgJWQgKiAlZFxuIixuLG4pOworI2VuZGlmCisJYm5fbXVsX3dvcmRzKHIsYSxuLGJbMF0pOworCisJZm9yICg7OykKKwkJeworCQlpZiAoLS1uIDw9IDApIHJldHVybjsKKwkJYm5fbXVsX2FkZF93b3JkcygmKHJbMV0pLGEsbixiWzFdKTsKKwkJaWYgKC0tbiA8PSAwKSByZXR1cm47CisJCWJuX211bF9hZGRfd29yZHMoJihyWzJdKSxhLG4sYlsyXSk7CisJCWlmICgtLW4gPD0gMCkgcmV0dXJuOworCQlibl9tdWxfYWRkX3dvcmRzKCYoclszXSksYSxuLGJbM10pOworCQlpZiAoLS1uIDw9IDApIHJldHVybjsKKwkJYm5fbXVsX2FkZF93b3JkcygmKHJbNF0pLGEsbixiWzRdKTsKKwkJcis9NDsKKwkJYis9NDsKKwkJfQorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9uaXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbmlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTViMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fbmlzdC5jCkBAIC0wLDAgKzEsODM2IEBACisvKiBjcnlwdG8vYm4vYm5fbmlzdC5jICovCisvKgorICogV3JpdHRlbiBieSBOaWxzIExhcnNjaCBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImJuX2xjbC5oIgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKworI2RlZmluZSBCTl9OSVNUXzE5Ml9UT1AJKDE5MitCTl9CSVRTMi0xKS9CTl9CSVRTMgorI2RlZmluZSBCTl9OSVNUXzIyNF9UT1AJKDIyNCtCTl9CSVRTMi0xKS9CTl9CSVRTMgorI2RlZmluZSBCTl9OSVNUXzI1Nl9UT1AJKDI1NitCTl9CSVRTMi0xKS9CTl9CSVRTMgorI2RlZmluZSBCTl9OSVNUXzM4NF9UT1AJKDM4NCtCTl9CSVRTMi0xKS9CTl9CSVRTMgorI2RlZmluZSBCTl9OSVNUXzUyMV9UT1AJKDUyMStCTl9CSVRTMi0xKS9CTl9CSVRTMgorCisvKiBwcmUtY29tcHV0ZWQgdGFibGVzIGFyZSAiY2FycnktbGVzcyIgdmFsdWVzIG9mIG1vZHVsdXMqKGkrMSkgKi8KKyNpZiBCTl9CSVRTMiA9PSA2NAorc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfMTkyW11bQk5fTklTVF8xOTJfVE9QXSA9IHsKKwl7MHhGRkZGRkZGRkZGRkZGRkZGVUxMLDB4RkZGRkZGRkZGRkZGRkZGRVVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEx9LAorCXsweEZGRkZGRkZGRkZGRkZGRkVVTEwsMHhGRkZGRkZGRkZGRkZGRkZEVUxMLDB4RkZGRkZGRkZGRkZGRkZGRlVMTH0sCisJezB4RkZGRkZGRkZGRkZGRkZGRFVMTCwweEZGRkZGRkZGRkZGRkZGRkNVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMfQorCX07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgX25pc3RfcF8xOTJfc3FyW10gPSB7CisJMHgwMDAwMDAwMDAwMDAwMDAxVUxMLDB4MDAwMDAwMDAwMDAwMDAwMlVMTCwweDAwMDAwMDAwMDAwMDAwMDFVTEwsCisJMHhGRkZGRkZGRkZGRkZGRkZFVUxMLDB4RkZGRkZGRkZGRkZGRkZGRFVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwKKwl9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfMjI0W11bQk5fTklTVF8yMjRfVE9QXSA9IHsKKwl7MHgwMDAwMDAwMDAwMDAwMDAxVUxMLDB4RkZGRkZGRkYwMDAwMDAwMFVMTCwKKwkgMHhGRkZGRkZGRkZGRkZGRkZGVUxMLDB4MDAwMDAwMDBGRkZGRkZGRlVMTH0sCisJezB4MDAwMDAwMDAwMDAwMDAwMlVMTCwweEZGRkZGRkZFMDAwMDAwMDBVTEwsCisJIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweDAwMDAwMDAxRkZGRkZGRkZVTEx9IC8qIHRoaXMgb25lIGlzICJjYXJyeS1mdWxsIiAqLworCX07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgX25pc3RfcF8yMjRfc3FyW10gPSB7CisJMHgwMDAwMDAwMDAwMDAwMDAxVUxMLDB4RkZGRkZGRkUwMDAwMDAwMFVMTCwKKwkweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHgwMDAwMDAwMjAwMDAwMDAwVUxMLAorCTB4MDAwMDAwMDAwMDAwMDAwMFVMTCwweEZGRkZGRkZGRkZGRkZGRkVVTEwsCisJMHhGRkZGRkZGRkZGRkZGRkZGVUxMCisJfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBfbmlzdF9wXzI1NltdW0JOX05JU1RfMjU2X1RPUF0gPSB7CisJezB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweDAwMDAwMDAwRkZGRkZGRkZVTEwsCisJIDB4MDAwMDAwMDAwMDAwMDAwMFVMTCwweEZGRkZGRkZGMDAwMDAwMDFVTEx9LAorCXsweEZGRkZGRkZGRkZGRkZGRkVVTEwsMHgwMDAwMDAwMUZGRkZGRkZGVUxMLAorCSAweDAwMDAwMDAwMDAwMDAwMDBVTEwsMHhGRkZGRkZGRTAwMDAwMDAyVUxMfSwKKwl7MHhGRkZGRkZGRkZGRkZGRkZEVUxMLDB4MDAwMDAwMDJGRkZGRkZGRlVMTCwKKwkgMHgwMDAwMDAwMDAwMDAwMDAwVUxMLDB4RkZGRkZGRkQwMDAwMDAwM1VMTH0sCisJezB4RkZGRkZGRkZGRkZGRkZGQ1VMTCwweDAwMDAwMDAzRkZGRkZGRkZVTEwsCisJIDB4MDAwMDAwMDAwMDAwMDAwMFVMTCwweEZGRkZGRkZDMDAwMDAwMDRVTEx9LAorCXsweEZGRkZGRkZGRkZGRkZGRkJVTEwsMHgwMDAwMDAwNEZGRkZGRkZGVUxMLAorCSAweDAwMDAwMDAwMDAwMDAwMDBVTEwsMHhGRkZGRkZGQjAwMDAwMDA1VUxMfSwKKwl9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfMjU2X3NxcltdID0geworCTB4MDAwMDAwMDAwMDAwMDAwMVVMTCwweEZGRkZGRkZFMDAwMDAwMDBVTEwsCisJMHhGRkZGRkZGRkZGRkZGRkZGVUxMLDB4MDAwMDAwMDFGRkZGRkZGRVVMTCwKKwkweDAwMDAwMDAxRkZGRkZGRkVVTEwsMHgwMDAwMDAwMUZGRkZGRkZFVUxMLAorCTB4RkZGRkZGRkUwMDAwMDAwMVVMTCwweEZGRkZGRkZFMDAwMDAwMDJVTEwKKwl9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfMzg0W11bQk5fTklTVF8zODRfVE9QXSA9IHsKKwl7MHgwMDAwMDAwMEZGRkZGRkZGVUxMLDB4RkZGRkZGRkYwMDAwMDAwMFVMTCwweEZGRkZGRkZGRkZGRkZGRkVVTEwsCisJIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMfSwKKwl7MHgwMDAwMDAwMUZGRkZGRkZFVUxMLDB4RkZGRkZGRkUwMDAwMDAwMFVMTCwweEZGRkZGRkZGRkZGRkZGRkRVTEwsCisJIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMfSwKKwl7MHgwMDAwMDAwMkZGRkZGRkZEVUxMLDB4RkZGRkZGRkQwMDAwMDAwMFVMTCwweEZGRkZGRkZGRkZGRkZGRkNVTEwsCisJIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMfSwKKwl7MHgwMDAwMDAwM0ZGRkZGRkZDVUxMLDB4RkZGRkZGRkMwMDAwMDAwMFVMTCwweEZGRkZGRkZGRkZGRkZGRkJVTEwsCisJIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMfSwKKwl7MHgwMDAwMDAwNEZGRkZGRkZCVUxMLDB4RkZGRkZGRkIwMDAwMDAwMFVMTCwweEZGRkZGRkZGRkZGRkZGRkFVTEwsCisJIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMfSwKKwl9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfMzg0X3NxcltdID0geworCTB4RkZGRkZGRkUwMDAwMDAwMVVMTCwweDAwMDAwMDAyMDAwMDAwMDBVTEwsMHhGRkZGRkZGRTAwMDAwMDAwVUxMLAorCTB4MDAwMDAwMDIwMDAwMDAwMFVMTCwweDAwMDAwMDAwMDAwMDAwMDFVTEwsMHgwMDAwMDAwMDAwMDAwMDAwVUxMLAorCTB4MDAwMDAwMDFGRkZGRkZGRVVMTCwweEZGRkZGRkZFMDAwMDAwMDBVTEwsMHhGRkZGRkZGRkZGRkZGRkZEVUxMLAorCTB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMCisJfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBfbmlzdF9wXzUyMVtdID0KKwl7MHhGRkZGRkZGRkZGRkZGRkZGVUxMLDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwKKwkweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMLAorCTB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsCisJMHhGRkZGRkZGRkZGRkZGRkZGVUxMLDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwKKwkweDAwMDAwMDAwMDAwMDAxRkZVTEx9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfNTIxX3NxcltdID0geworCTB4MDAwMDAwMDAwMDAwMDAwMVVMTCwweDAwMDAwMDAwMDAwMDAwMDBVTEwsMHgwMDAwMDAwMDAwMDAwMDAwVUxMLAorCTB4MDAwMDAwMDAwMDAwMDAwMFVMTCwweDAwMDAwMDAwMDAwMDAwMDBVTEwsMHgwMDAwMDAwMDAwMDAwMDAwVUxMLAorCTB4MDAwMDAwMDAwMDAwMDAwMFVMTCwweDAwMDAwMDAwMDAwMDAwMDBVTEwsMHhGRkZGRkZGRkZGRkZGQzAwVUxMLAorCTB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMLAorCTB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweEZGRkZGRkZGRkZGRkZGRkZVTEwsMHhGRkZGRkZGRkZGRkZGRkZGVUxMLAorCTB4RkZGRkZGRkZGRkZGRkZGRlVMTCwweDAwMDAwMDAwMDAwM0ZGRkZVTEwKKwl9OworI2VsaWYgQk5fQklUUzIgPT0gMzIKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBfbmlzdF9wXzE5MltdW0JOX05JU1RfMTkyX1RPUF0gPSB7CisJezB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZFLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGfSwKKwl7MHhGRkZGRkZGRSwweEZGRkZGRkZGLDB4RkZGRkZGRkQsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkZ9LAorCXsweEZGRkZGRkZELDB4RkZGRkZGRkYsMHhGRkZGRkZGQywweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRn0KKwl9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfMTkyX3NxcltdID0geworCTB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweDAwMDAwMDAyLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAwLAorCTB4RkZGRkZGRkUsMHhGRkZGRkZGRiwweEZGRkZGRkZELDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGCisJfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBfbmlzdF9wXzIyNFtdW0JOX05JU1RfMjI0X1RPUF0gPSB7CisJezB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4RkZGRkZGRkYsCisJIDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGfSwKKwl7MHgwMDAwMDAwMiwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHhGRkZGRkZGRSwKKwkgMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkZ9CisJfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBfbmlzdF9wXzIyNF9zcXJbXSA9IHsKKwkweDAwMDAwMDAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweEZGRkZGRkZFLAorCTB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweDAwMDAwMDAwLDB4MDAwMDAwMDIsCisJMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4RkZGRkZGRkUsMHhGRkZGRkZGRiwKKwkweEZGRkZGRkZGLDB4RkZGRkZGRkYKKwl9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfMjU2W11bQk5fTklTVF8yNTZfVE9QXSA9IHsKKwl7MHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHgwMDAwMDAwMCwKKwkgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHhGRkZGRkZGRn0sCisJezB4RkZGRkZGRkUsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4MDAwMDAwMDEsCisJIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAyLDB4RkZGRkZGRkV9LAorCXsweEZGRkZGRkZELDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweDAwMDAwMDAyLAorCSAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMywweEZGRkZGRkZEfSwKKwl7MHhGRkZGRkZGQywweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHgwMDAwMDAwMywKKwkgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDQsMHhGRkZGRkZGQ30sCisJezB4RkZGRkZGRkIsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4MDAwMDAwMDQsCisJIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA1LDB4RkZGRkZGRkJ9LAorCX07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgX25pc3RfcF8yNTZfc3FyW10gPSB7CisJMHgwMDAwMDAwMSwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHhGRkZGRkZGRSwKKwkweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRSwweDAwMDAwMDAxLAorCTB4RkZGRkZGRkUsMHgwMDAwMDAwMSwweEZGRkZGRkZFLDB4MDAwMDAwMDEsCisJMHgwMDAwMDAwMSwweEZGRkZGRkZFLDB4MDAwMDAwMDIsMHhGRkZGRkZGRQorCX07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgX25pc3RfcF8zODRbXVtCTl9OSVNUXzM4NF9UT1BdID0geworCXsweEZGRkZGRkZGLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweEZGRkZGRkZGLDB4RkZGRkZGRkUsMHhGRkZGRkZGRiwKKwkgMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkZ9LAorCXsweEZGRkZGRkZFLDB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweEZGRkZGRkZFLDB4RkZGRkZGRkQsMHhGRkZGRkZGRiwKKwkgMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkZ9LAorCXsweEZGRkZGRkZELDB4MDAwMDAwMDIsMHgwMDAwMDAwMCwweEZGRkZGRkZELDB4RkZGRkZGRkMsMHhGRkZGRkZGRiwKKwkgMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkZ9LAorCXsweEZGRkZGRkZDLDB4MDAwMDAwMDMsMHgwMDAwMDAwMCwweEZGRkZGRkZDLDB4RkZGRkZGRkIsMHhGRkZGRkZGRiwKKwkgMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkZ9LAorCXsweEZGRkZGRkZCLDB4MDAwMDAwMDQsMHgwMDAwMDAwMCwweEZGRkZGRkZCLDB4RkZGRkZGRkEsMHhGRkZGRkZGRiwKKwkgMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkZ9LAorCX07CitzdGF0aWMgY29uc3QgQk5fVUxPTkcgX25pc3RfcF8zODRfc3FyW10gPSB7CisJMHgwMDAwMDAwMSwweEZGRkZGRkZFLDB4MDAwMDAwMDAsMHgwMDAwMDAwMiwweDAwMDAwMDAwLDB4RkZGRkZGRkUsCisJMHgwMDAwMDAwMCwweDAwMDAwMDAyLDB4MDAwMDAwMDEsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisJMHhGRkZGRkZGRSwweDAwMDAwMDAxLDB4MDAwMDAwMDAsMHhGRkZGRkZGRSwweEZGRkZGRkZELDB4RkZGRkZGRkYsCisJMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYKKwl9Oworc3RhdGljIGNvbnN0IEJOX1VMT05HIF9uaXN0X3BfNTIxW10gPSB7MHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsCisJMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsCisJMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsCisJMHhGRkZGRkZGRiwweDAwMDAwMUZGfTsKK3N0YXRpYyBjb25zdCBCTl9VTE9ORyBfbmlzdF9wXzUyMV9zcXJbXSA9IHsKKwkweDAwMDAwMDAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4RkZGRkZDMDAsMHhGRkZGRkZGRiwKKwkweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwKKwkweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHhGRkZGRkZGRiwKKwkweEZGRkZGRkZGLDB4RkZGRkZGRkYsMHgwMDAzRkZGRgorCX07CisjZWxzZQorI2Vycm9yICJ1bnN1cHBvcnRlZCBCTl9CSVRTMiIKKyNlbmRpZgorCisKK3N0YXRpYyBjb25zdCBCSUdOVU0gX2JpZ251bV9uaXN0X3BfMTkyID0KKwl7CisJKEJOX1VMT05HICopX25pc3RfcF8xOTJbMF0sCisJQk5fTklTVF8xOTJfVE9QLAorCUJOX05JU1RfMTkyX1RPUCwKKwkwLAorCUJOX0ZMR19TVEFUSUNfREFUQQorCX07CisKK3N0YXRpYyBjb25zdCBCSUdOVU0gX2JpZ251bV9uaXN0X3BfMjI0ID0KKwl7CisJKEJOX1VMT05HICopX25pc3RfcF8yMjRbMF0sCisJQk5fTklTVF8yMjRfVE9QLAorCUJOX05JU1RfMjI0X1RPUCwKKwkwLAorCUJOX0ZMR19TVEFUSUNfREFUQQorCX07CisKK3N0YXRpYyBjb25zdCBCSUdOVU0gX2JpZ251bV9uaXN0X3BfMjU2ID0KKwl7CisJKEJOX1VMT05HICopX25pc3RfcF8yNTZbMF0sCisJQk5fTklTVF8yNTZfVE9QLAorCUJOX05JU1RfMjU2X1RPUCwKKwkwLAorCUJOX0ZMR19TVEFUSUNfREFUQQorCX07CisKK3N0YXRpYyBjb25zdCBCSUdOVU0gX2JpZ251bV9uaXN0X3BfMzg0ID0KKwl7CisJKEJOX1VMT05HICopX25pc3RfcF8zODRbMF0sCisJQk5fTklTVF8zODRfVE9QLAorCUJOX05JU1RfMzg0X1RPUCwKKwkwLAorCUJOX0ZMR19TVEFUSUNfREFUQQorCX07CisKK3N0YXRpYyBjb25zdCBCSUdOVU0gX2JpZ251bV9uaXN0X3BfNTIxID0KKwl7CisJKEJOX1VMT05HICopX25pc3RfcF81MjEsCisJQk5fTklTVF81MjFfVE9QLAorCUJOX05JU1RfNTIxX1RPUCwKKwkwLAorCUJOX0ZMR19TVEFUSUNfREFUQQorCX07CisKKworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMTkyKHZvaWQpCisJeworCXJldHVybiAmX2JpZ251bV9uaXN0X3BfMTkyOworCX0KKworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMjI0KHZvaWQpCisJeworCXJldHVybiAmX2JpZ251bV9uaXN0X3BfMjI0OworCX0KKworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMjU2KHZvaWQpCisJeworCXJldHVybiAmX2JpZ251bV9uaXN0X3BfMjU2OworCX0KKworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMzg0KHZvaWQpCisJeworCXJldHVybiAmX2JpZ251bV9uaXN0X3BfMzg0OworCX0KKworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfNTIxKHZvaWQpCisJeworCXJldHVybiAmX2JpZ251bV9uaXN0X3BfNTIxOworCX0KKworCitzdGF0aWMgdm9pZCBuaXN0X2NwX2JuXzAoQk5fVUxPTkcgKmJ1ZiwgQk5fVUxPTkcgKmEsIGludCB0b3AsIGludCBtYXgpCisJeworCWludCBpOworCUJOX1VMT05HICpfdG1wMSA9IChidWYpLCAqX3RtcDIgPSAoYSk7CisKKyNpZmRlZiBCTl9ERUJVRworCU9QRU5TU0xfYXNzZXJ0KHRvcCA8PSBtYXgpOworI2VuZGlmCisJZm9yIChpID0gKHRvcCk7IGkgIT0gMDsgaS0tKQorCQkqX3RtcDErKyA9ICpfdG1wMisrOworCWZvciAoaSA9IChtYXgpIC0gKHRvcCk7IGkgIT0gMDsgaS0tKQorCQkqX3RtcDErKyA9IChCTl9VTE9ORykgMDsKKwl9CisKK3N0YXRpYyB2b2lkIG5pc3RfY3BfYm4oQk5fVUxPTkcgKmJ1ZiwgQk5fVUxPTkcgKmEsIGludCB0b3ApCisJeyAKKwlpbnQgaTsKKwlCTl9VTE9ORyAqX3RtcDEgPSAoYnVmKSwgKl90bXAyID0gKGEpOworCWZvciAoaSA9ICh0b3ApOyBpICE9IDA7IGktLSkKKwkJKl90bXAxKysgPSAqX3RtcDIrKzsKKwl9CisKKyNpZiBCTl9CSVRTMiA9PSA2NAorI2RlZmluZSBibl9jcF82NCh0bywgbiwgZnJvbSwgbSkJKHRvKVtuXSA9IChtPj0wKT8oKGZyb20pW21dKTowOworI2RlZmluZSBibl82NF9zZXRfMCh0bywgbikJCSh0bylbbl0gPSAoQk5fVUxPTkcpMDsKKy8qCisgKiB0d28gZm9sbG93aW5nIG1hY3JvcyBhcmUgaW1wbGVtZW50ZWQgdW5kZXIgYXNzdW1wdGlvbiB0aGF0IHRoZXkKKyAqIGFyZSBjYWxsZWQgaW4gYSBzZXF1ZW5jZSB3aXRoICphc2NlbmRpbmcqIG4sIGkuZS4gYXMgdGhleSBhcmUuLi4KKyAqLworI2RlZmluZSBibl9jcF8zMl9uYWtlZCh0bywgbiwgZnJvbSwgbSkJKCgobikmMSk/KHRvWyhuKS8yXXw9KChtKSYxKT8oZnJvbVsobSkvMl0mQk5fTUFTSzJoKTooZnJvbVsobSkvMl08PDMyKSlcCisJCQkJCQk6KHRvWyhuKS8yXSA9KChtKSYxKT8oZnJvbVsobSkvMl0+PjMyKTooZnJvbVsobSkvMl0mQk5fTUFTSzJsKSkpCisjZGVmaW5lIGJuXzMyX3NldF8wKHRvLCBuKQkJKCgobikmMSk/KHRvWyhuKS8yXSY9Qk5fTUFTSzJsKToodG9bKG4pLzJdPTApKTsKKyNkZWZpbmUgYm5fY3BfMzIodG8sbixmcm9tLG0pCQkoKG0pPj0wKT9ibl9jcF8zMl9uYWtlZCh0byxuLGZyb20sbSk6Ym5fMzJfc2V0XzAodG8sbikKKyNlbHNlCisjZGVmaW5lIGJuX2NwXzY0KHRvLCBuLCBmcm9tLCBtKSBcCisJeyBcCisJYm5fY3BfMzIodG8sIChuKSoyLCBmcm9tLCAobSkqMik7IFwKKwlibl9jcF8zMih0bywgKG4pKjIrMSwgZnJvbSwgKG0pKjIrMSk7IFwKKwl9CisjZGVmaW5lIGJuXzY0X3NldF8wKHRvLCBuKSBcCisJeyBcCisJYm5fMzJfc2V0XzAodG8sIChuKSoyKTsgXAorCWJuXzMyX3NldF8wKHRvLCAobikqMisxKTsgXAorCX0KKyNpZiBCTl9CSVRTMiA9PSAzMgorI2RlZmluZSBibl9jcF8zMih0bywgbiwgZnJvbSwgbSkJKHRvKVtuXSA9IChtPj0wKT8oKGZyb20pW21dKTowOworI2RlZmluZSBibl8zMl9zZXRfMCh0bywgbikJCSh0bylbbl0gPSAoQk5fVUxPTkcpMDsKKyNlbmRpZgorI2VuZGlmIC8qIEJOX0JJVFMyICE9IDY0ICovCisKKworI2RlZmluZSBuaXN0X3NldF8xOTIodG8sIGZyb20sIGExLCBhMiwgYTMpIFwKKwl7IFwKKwlibl9jcF82NCh0bywgMCwgZnJvbSwgKGEzKSAtIDMpIFwKKwlibl9jcF82NCh0bywgMSwgZnJvbSwgKGEyKSAtIDMpIFwKKwlibl9jcF82NCh0bywgMiwgZnJvbSwgKGExKSAtIDMpIFwKKwl9CisKK2ludCBCTl9uaXN0X21vZF8xOTIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqZmllbGQsCisJQk5fQ1RYICpjdHgpCisJeworCWludCAgICAgIHRvcCA9IGEtPnRvcCwgaTsKKwlpbnQgICAgICBjYXJyeTsKKwlyZWdpc3RlciBCTl9VTE9ORyAqcl9kLCAqYV9kID0gYS0+ZDsKKwlCTl9VTE9ORyB0X2RbQk5fTklTVF8xOTJfVE9QXSwKKwkgICAgICAgICBidWZbQk5fTklTVF8xOTJfVE9QXSwKKwkJIGNfZFtCTl9OSVNUXzE5Ml9UT1BdLAorCQkqcmVzOworCXNpemVfdCAgIG1hc2s7CisJc3RhdGljIGNvbnN0IEJJR05VTSBfYmlnbnVtX25pc3RfcF8xOTJfc3FyID0geworCQkoQk5fVUxPTkcgKilfbmlzdF9wXzE5Ml9zcXIsCisJCXNpemVvZihfbmlzdF9wXzE5Ml9zcXIpL3NpemVvZihfbmlzdF9wXzE5Ml9zcXJbMF0pLAorCQlzaXplb2YoX25pc3RfcF8xOTJfc3FyKS9zaXplb2YoX25pc3RfcF8xOTJfc3FyWzBdKSwKKwkJMCxCTl9GTEdfU1RBVElDX0RBVEEgfTsKKworCWZpZWxkID0gJl9iaWdudW1fbmlzdF9wXzE5MjsgLyoganVzdCB0byBtYWtlIHN1cmUgKi8KKworIAlpZiAoQk5faXNfbmVnYXRpdmUoYSkgfHwgQk5fdWNtcChhLCZfYmlnbnVtX25pc3RfcF8xOTJfc3FyKT49MCkKKwkJcmV0dXJuIEJOX25ubW9kKHIsIGEsIGZpZWxkLCBjdHgpOworCisJaSA9IEJOX3VjbXAoZmllbGQsIGEpOworCWlmIChpID09IDApCisJCXsKKwkJQk5femVybyhyKTsKKwkJcmV0dXJuIDE7CisJCX0KKwllbHNlIGlmIChpID4gMCkKKwkJcmV0dXJuIChyID09IGEpID8gMSA6IChCTl9jb3B5KHIgLGEpICE9IE5VTEwpOworCisJaWYgKHIgIT0gYSkKKwkJeworCQlpZiAoIWJuX3dleHBhbmQociwgQk5fTklTVF8xOTJfVE9QKSkKKwkJCXJldHVybiAwOworCQlyX2QgPSByLT5kOworCQluaXN0X2NwX2JuKHJfZCwgYV9kLCBCTl9OSVNUXzE5Ml9UT1ApOworCQl9CisJZWxzZQorCQlyX2QgPSBhX2Q7CisKKwluaXN0X2NwX2JuXzAoYnVmLCBhX2QgKyBCTl9OSVNUXzE5Ml9UT1AsIHRvcCAtIEJOX05JU1RfMTkyX1RPUCwgQk5fTklTVF8xOTJfVE9QKTsKKworCW5pc3Rfc2V0XzE5Mih0X2QsIGJ1ZiwgMCwgMywgMyk7CisJY2FycnkgPSAoaW50KWJuX2FkZF93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzE5Ml9UT1ApOworCW5pc3Rfc2V0XzE5Mih0X2QsIGJ1ZiwgNCwgNCwgMCk7CisJY2FycnkgKz0gKGludClibl9hZGRfd29yZHMocl9kLCByX2QsIHRfZCwgQk5fTklTVF8xOTJfVE9QKTsKKwluaXN0X3NldF8xOTIodF9kLCBidWYsIDUsIDUsIDUpCisJY2FycnkgKz0gKGludClibl9hZGRfd29yZHMocl9kLCByX2QsIHRfZCwgQk5fTklTVF8xOTJfVE9QKTsKKworCWlmIChjYXJyeSA+IDApCisJCWNhcnJ5ID0gKGludClibl9zdWJfd29yZHMocl9kLHJfZCxfbmlzdF9wXzE5MltjYXJyeS0xXSxCTl9OSVNUXzE5Ml9UT1ApOworCWVsc2UKKwkJY2FycnkgPSAxOworCisJLyoKKwkgKiB3ZSBuZWVkICdpZiAoY2Fycnk9PTAgfHwgcmVzdWx0Pj1tb2R1bHVzKSByZXN1bHQtPW1vZHVsdXM7JworCSAqIGFzIGNvbXBhcmlzb24gaW1wbGllcyBzdWJ0cmFjdGlvbiwgd2UgY2FuIHdyaXRlCisJICogJ3RtcD1yZXN1bHQtbW9kdWx1czsgaWYgKCFjYXJyeSB8fCAhYm9ycm93KSByZXN1bHQ9dG1wOycKKwkgKiB0aGlzIGlzIHdoYXQgaGFwcGVucyBiZWxvdywgYnV0IHdpdGhvdXQgZXhwbGljaXQgaWY6LSkgYS4KKwkgKi8KKwltYXNrICA9IDAtKHNpemVfdClibl9zdWJfd29yZHMoY19kLHJfZCxfbmlzdF9wXzE5MlswXSxCTl9OSVNUXzE5Ml9UT1ApOworCW1hc2sgJj0gMC0oc2l6ZV90KWNhcnJ5OworCXJlcyAgID0gKEJOX1VMT05HICopKCgoc2l6ZV90KWNfZCZ+bWFzaykgfCAoKHNpemVfdClyX2QmbWFzaykpOworCW5pc3RfY3BfYm4ocl9kLCByZXMsIEJOX05JU1RfMTkyX1RPUCk7CisJci0+dG9wID0gQk5fTklTVF8xOTJfVE9QOworCWJuX2NvcnJlY3RfdG9wKHIpOworCisJcmV0dXJuIDE7CisJfQorCit0eXBlZGVmIEJOX1VMT05HICgqYm5fYWRkc3ViX2YpKEJOX1VMT05HICosY29uc3QgQk5fVUxPTkcgKixjb25zdCBCTl9VTE9ORyAqLGludCk7CisKKyNkZWZpbmUgbmlzdF9zZXRfMjI0KHRvLCBmcm9tLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykgXAorCXsgXAorCWJuX2NwXzMyKHRvLCAwLCBmcm9tLCAoYTcpIC0gNykgXAorCWJuX2NwXzMyKHRvLCAxLCBmcm9tLCAoYTYpIC0gNykgXAorCWJuX2NwXzMyKHRvLCAyLCBmcm9tLCAoYTUpIC0gNykgXAorCWJuX2NwXzMyKHRvLCAzLCBmcm9tLCAoYTQpIC0gNykgXAorCWJuX2NwXzMyKHRvLCA0LCBmcm9tLCAoYTMpIC0gNykgXAorCWJuX2NwXzMyKHRvLCA1LCBmcm9tLCAoYTIpIC0gNykgXAorCWJuX2NwXzMyKHRvLCA2LCBmcm9tLCAoYTEpIC0gNykgXAorCX0KKworaW50IEJOX25pc3RfbW9kXzIyNChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpmaWVsZCwKKwlCTl9DVFggKmN0eCkKKwl7CisJaW50CXRvcCA9IGEtPnRvcCwgaTsKKwlpbnQJY2Fycnk7CisJQk5fVUxPTkcgKnJfZCwgKmFfZCA9IGEtPmQ7CisJQk5fVUxPTkcgdF9kW0JOX05JU1RfMjI0X1RPUF0sCisJICAgICAgICAgYnVmW0JOX05JU1RfMjI0X1RPUF0sCisJCSBjX2RbQk5fTklTVF8yMjRfVE9QXSwKKwkJKnJlczsKKwlzaXplX3QgICBtYXNrOworCXVuaW9uIHsgYm5fYWRkc3ViX2YgZjsgc2l6ZV90IHA7IH0gdTsKKwlzdGF0aWMgY29uc3QgQklHTlVNIF9iaWdudW1fbmlzdF9wXzIyNF9zcXIgPSB7CisJCShCTl9VTE9ORyAqKV9uaXN0X3BfMjI0X3NxciwKKwkJc2l6ZW9mKF9uaXN0X3BfMjI0X3Nxcikvc2l6ZW9mKF9uaXN0X3BfMjI0X3NxclswXSksCisJCXNpemVvZihfbmlzdF9wXzIyNF9zcXIpL3NpemVvZihfbmlzdF9wXzIyNF9zcXJbMF0pLAorCQkwLEJOX0ZMR19TVEFUSUNfREFUQSB9OworCisKKwlmaWVsZCA9ICZfYmlnbnVtX25pc3RfcF8yMjQ7IC8qIGp1c3QgdG8gbWFrZSBzdXJlICovCisKKyAJaWYgKEJOX2lzX25lZ2F0aXZlKGEpIHx8IEJOX3VjbXAoYSwmX2JpZ251bV9uaXN0X3BfMjI0X3Nxcik+PTApCisJCXJldHVybiBCTl9ubm1vZChyLCBhLCBmaWVsZCwgY3R4KTsKKworCWkgPSBCTl91Y21wKGZpZWxkLCBhKTsKKwlpZiAoaSA9PSAwKQorCQl7CisJCUJOX3plcm8ocik7CisJCXJldHVybiAxOworCQl9CisJZWxzZSBpZiAoaSA+IDApCisJCXJldHVybiAociA9PSBhKT8gMSA6IChCTl9jb3B5KHIgLGEpICE9IE5VTEwpOworCisJaWYgKHIgIT0gYSkKKwkJeworCQlpZiAoIWJuX3dleHBhbmQociwgQk5fTklTVF8yMjRfVE9QKSkKKwkJCXJldHVybiAwOworCQlyX2QgPSByLT5kOworCQluaXN0X2NwX2JuKHJfZCwgYV9kLCBCTl9OSVNUXzIyNF9UT1ApOworCQl9CisJZWxzZQorCQlyX2QgPSBhX2Q7CisKKyNpZiBCTl9CSVRTMj09NjQKKwkvKiBjb3B5IHVwcGVyIDI1NiBiaXRzIG9mIDQ0OCBiaXQgbnVtYmVyIC4uLiAqLworCW5pc3RfY3BfYm5fMCh0X2QsIGFfZCArIChCTl9OSVNUXzIyNF9UT1AtMSksIHRvcCAtIChCTl9OSVNUXzIyNF9UT1AtMSksIEJOX05JU1RfMjI0X1RPUCk7CisJLyogLi4uIGFuZCByaWdodCBzaGlmdCBieSAzMiB0byBvYnRhaW4gdXBwZXIgMjI0IGJpdHMgKi8KKwluaXN0X3NldF8yMjQoYnVmLCB0X2QsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCk7CisJLyogdHJ1bmNhdGUgbG93ZXIgcGFydCB0byAyMjQgYml0cyB0b28gKi8KKwlyX2RbQk5fTklTVF8yMjRfVE9QLTFdICY9IEJOX01BU0sybDsKKyNlbHNlCisJbmlzdF9jcF9ibl8wKGJ1ZiwgYV9kICsgQk5fTklTVF8yMjRfVE9QLCB0b3AgLSBCTl9OSVNUXzIyNF9UT1AsIEJOX05JU1RfMjI0X1RPUCk7CisjZW5kaWYKKwluaXN0X3NldF8yMjQodF9kLCBidWYsIDEwLCA5LCA4LCA3LCAwLCAwLCAwKTsKKwljYXJyeSA9IChpbnQpYm5fYWRkX3dvcmRzKHJfZCwgcl9kLCB0X2QsIEJOX05JU1RfMjI0X1RPUCk7CisJbmlzdF9zZXRfMjI0KHRfZCwgYnVmLCAwLCAxMywgMTIsIDExLCAwLCAwLCAwKTsKKwljYXJyeSArPSAoaW50KWJuX2FkZF93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzIyNF9UT1ApOworCW5pc3Rfc2V0XzIyNCh0X2QsIGJ1ZiwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcpOworCWNhcnJ5IC09IChpbnQpYm5fc3ViX3dvcmRzKHJfZCwgcl9kLCB0X2QsIEJOX05JU1RfMjI0X1RPUCk7CisJbmlzdF9zZXRfMjI0KHRfZCwgYnVmLCAwLCAwLCAwLCAwLCAxMywgMTIsIDExKTsKKwljYXJyeSAtPSAoaW50KWJuX3N1Yl93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzIyNF9UT1ApOworCisjaWYgQk5fQklUUzI9PTY0CisJY2FycnkgPSAoaW50KShyX2RbQk5fTklTVF8yMjRfVE9QLTFdPj4zMik7CisjZW5kaWYKKwl1LmYgPSBibl9zdWJfd29yZHM7CisJaWYgKGNhcnJ5ID4gMCkKKwkJeworCQljYXJyeSA9IChpbnQpYm5fc3ViX3dvcmRzKHJfZCxyX2QsX25pc3RfcF8yMjRbY2FycnktMV0sQk5fTklTVF8yMjRfVE9QKTsKKyNpZiBCTl9CSVRTMj09NjQKKwkJY2Fycnk9KGludCkofihyX2RbQk5fTklTVF8yMjRfVE9QLTFdPj4zMikpJjE7CisjZW5kaWYKKwkJfQorCWVsc2UgaWYgKGNhcnJ5IDwgMCkKKwkJeworCQkvKiBpdCdzIGEgYml0IG1vcmUgY29tbGljYXRlZCBsb2dpYyBpbiB0aGlzIGNhc2UuCisJCSAqIGlmIGJuX2FkZF93b3JkcyB5aWVsZHMgbm8gY2FycnksIHRoZW4gcmVzdWx0CisJCSAqIGhhcyB0byBiZSBhZGp1c3RlZCBieSB1bmNvbmRpdGlvbmFsbHkgKmFkZGluZyoKKwkJICogdGhlIG1vZHVsdXMuIGJ1dCBpZiBpdCBkb2VzLCB0aGVuIHJlc3VsdCBoYXMKKwkJICogdG8gYmUgY29tcGFyZWQgdG8gdGhlIG1vZHVsdXMgYW5kIGNvbmRpdGlvbmFsbHkKKwkJICogYWRqdXN0ZWQgYnkgKnN1YnRyYWN0aW5nKiB0aGUgbGF0dGVyLiAqLworCQljYXJyeSA9IChpbnQpYm5fYWRkX3dvcmRzKHJfZCxyX2QsX25pc3RfcF8yMjRbLWNhcnJ5LTFdLEJOX05JU1RfMjI0X1RPUCk7CisJCW1hc2sgPSAwLShzaXplX3QpY2Fycnk7CisJCXUucCA9ICgoc2l6ZV90KWJuX3N1Yl93b3JkcyZtYXNrKSB8ICgoc2l6ZV90KWJuX2FkZF93b3JkcyZ+bWFzayk7CisJCX0KKwllbHNlCisJCWNhcnJ5ID0gMTsKKworCS8qIG90aGVyd2lzZSBpdCdzIGVmZmVjdGl2ZWx5IHNhbWUgYXMgaW4gQk5fbmlzdF9tb2RfMTkyLi4uICovCisJbWFzayAgPSAwLShzaXplX3QpKCp1LmYpKGNfZCxyX2QsX25pc3RfcF8yMjRbMF0sQk5fTklTVF8yMjRfVE9QKTsKKwltYXNrICY9IDAtKHNpemVfdCljYXJyeTsKKwlyZXMgICA9IChCTl9VTE9ORyAqKSgoKHNpemVfdCljX2Qmfm1hc2spIHwgKChzaXplX3Qpcl9kJm1hc2spKTsKKwluaXN0X2NwX2JuKHJfZCwgcmVzLCBCTl9OSVNUXzIyNF9UT1ApOworCXItPnRvcCA9IEJOX05JU1RfMjI0X1RPUDsKKwlibl9jb3JyZWN0X3RvcChyKTsKKworCXJldHVybiAxOworCX0KKworI2RlZmluZSBuaXN0X3NldF8yNTYodG8sIGZyb20sIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgXAorCXsgXAorCWJuX2NwXzMyKHRvLCAwLCBmcm9tLCAoYTgpIC0gOCkgXAorCWJuX2NwXzMyKHRvLCAxLCBmcm9tLCAoYTcpIC0gOCkgXAorCWJuX2NwXzMyKHRvLCAyLCBmcm9tLCAoYTYpIC0gOCkgXAorCWJuX2NwXzMyKHRvLCAzLCBmcm9tLCAoYTUpIC0gOCkgXAorCWJuX2NwXzMyKHRvLCA0LCBmcm9tLCAoYTQpIC0gOCkgXAorCWJuX2NwXzMyKHRvLCA1LCBmcm9tLCAoYTMpIC0gOCkgXAorCWJuX2NwXzMyKHRvLCA2LCBmcm9tLCAoYTIpIC0gOCkgXAorCWJuX2NwXzMyKHRvLCA3LCBmcm9tLCAoYTEpIC0gOCkgXAorCX0KKworaW50IEJOX25pc3RfbW9kXzI1NihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpmaWVsZCwKKwlCTl9DVFggKmN0eCkKKwl7CisJaW50CWksIHRvcCA9IGEtPnRvcDsKKwlpbnQJY2FycnkgPSAwOworCXJlZ2lzdGVyIEJOX1VMT05HICphX2QgPSBhLT5kLCAqcl9kOworCUJOX1VMT05HIHRfZFtCTl9OSVNUXzI1Nl9UT1BdLAorCSAgICAgICAgIGJ1ZltCTl9OSVNUXzI1Nl9UT1BdLAorCQkgY19kW0JOX05JU1RfMjU2X1RPUF0sCisJCSpyZXM7CisJc2l6ZV90ICAgbWFzazsKKwl1bmlvbiB7IGJuX2FkZHN1Yl9mIGY7IHNpemVfdCBwOyB9IHU7CisJc3RhdGljIGNvbnN0IEJJR05VTSBfYmlnbnVtX25pc3RfcF8yNTZfc3FyID0geworCQkoQk5fVUxPTkcgKilfbmlzdF9wXzI1Nl9zcXIsCisJCXNpemVvZihfbmlzdF9wXzI1Nl9zcXIpL3NpemVvZihfbmlzdF9wXzI1Nl9zcXJbMF0pLAorCQlzaXplb2YoX25pc3RfcF8yNTZfc3FyKS9zaXplb2YoX25pc3RfcF8yNTZfc3FyWzBdKSwKKwkJMCxCTl9GTEdfU1RBVElDX0RBVEEgfTsKKworCWZpZWxkID0gJl9iaWdudW1fbmlzdF9wXzI1NjsgLyoganVzdCB0byBtYWtlIHN1cmUgKi8KKworIAlpZiAoQk5faXNfbmVnYXRpdmUoYSkgfHwgQk5fdWNtcChhLCZfYmlnbnVtX25pc3RfcF8yNTZfc3FyKT49MCkKKwkJcmV0dXJuIEJOX25ubW9kKHIsIGEsIGZpZWxkLCBjdHgpOworCisJaSA9IEJOX3VjbXAoZmllbGQsIGEpOworCWlmIChpID09IDApCisJCXsKKwkJQk5femVybyhyKTsKKwkJcmV0dXJuIDE7CisJCX0KKwllbHNlIGlmIChpID4gMCkKKwkJcmV0dXJuIChyID09IGEpPyAxIDogKEJOX2NvcHkociAsYSkgIT0gTlVMTCk7CisKKwlpZiAociAhPSBhKQorCQl7CisJCWlmICghYm5fd2V4cGFuZChyLCBCTl9OSVNUXzI1Nl9UT1ApKQorCQkJcmV0dXJuIDA7CisJCXJfZCA9IHItPmQ7CisJCW5pc3RfY3BfYm4ocl9kLCBhX2QsIEJOX05JU1RfMjU2X1RPUCk7CisJCX0KKwllbHNlCisJCXJfZCA9IGFfZDsKKworCW5pc3RfY3BfYm5fMChidWYsIGFfZCArIEJOX05JU1RfMjU2X1RPUCwgdG9wIC0gQk5fTklTVF8yNTZfVE9QLCBCTl9OSVNUXzI1Nl9UT1ApOworCisJLypTMSovCisJbmlzdF9zZXRfMjU2KHRfZCwgYnVmLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDAsIDAsIDApOworCS8qUzIqLworCW5pc3Rfc2V0XzI1NihjX2QsIGJ1ZiwgMCwgMTUsIDE0LCAxMywgMTIsIDAsIDAsIDApOworCWNhcnJ5ID0gKGludClibl9hZGRfd29yZHModF9kLCB0X2QsIGNfZCwgQk5fTklTVF8yNTZfVE9QKTsKKwkvKiBsZWZ0IHNoaWZ0ICovCisJCXsKKwkJcmVnaXN0ZXIgQk5fVUxPTkcgKmFwLHQsYzsKKwkJYXAgPSB0X2Q7CisJCWM9MDsKKwkJZm9yIChpID0gQk5fTklTVF8yNTZfVE9QOyBpICE9IDA7IC0taSkKKwkJCXsKKwkJCXQ9ICphcDsKKwkJCSooYXArKyk9KCh0PDwxKXxjKSZCTl9NQVNLMjsKKwkJCWM9KHQgJiBCTl9UQklUKT8xOjA7CisJCQl9CisJCWNhcnJ5IDw8PSAxOworCQljYXJyeSAgfD0gYzsKKwkJfQorCWNhcnJ5ICs9IChpbnQpYm5fYWRkX3dvcmRzKHJfZCwgcl9kLCB0X2QsIEJOX05JU1RfMjU2X1RPUCk7CisJLypTMyovCisJbmlzdF9zZXRfMjU2KHRfZCwgYnVmLCAxNSwgMTQsIDAsIDAsIDAsIDEwLCA5LCA4KTsKKwljYXJyeSArPSAoaW50KWJuX2FkZF93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzI1Nl9UT1ApOworCS8qUzQqLworCW5pc3Rfc2V0XzI1Nih0X2QsIGJ1ZiwgOCwgMTMsIDE1LCAxNCwgMTMsIDExLCAxMCwgOSk7CisJY2FycnkgKz0gKGludClibl9hZGRfd29yZHMocl9kLCByX2QsIHRfZCwgQk5fTklTVF8yNTZfVE9QKTsKKwkvKkQxKi8KKwluaXN0X3NldF8yNTYodF9kLCBidWYsIDEwLCA4LCAwLCAwLCAwLCAxMywgMTIsIDExKTsKKwljYXJyeSAtPSAoaW50KWJuX3N1Yl93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzI1Nl9UT1ApOworCS8qRDIqLworCW5pc3Rfc2V0XzI1Nih0X2QsIGJ1ZiwgMTEsIDksIDAsIDAsIDE1LCAxNCwgMTMsIDEyKTsKKwljYXJyeSAtPSAoaW50KWJuX3N1Yl93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzI1Nl9UT1ApOworCS8qRDMqLworCW5pc3Rfc2V0XzI1Nih0X2QsIGJ1ZiwgMTIsIDAsIDEwLCA5LCA4LCAxNSwgMTQsIDEzKTsKKwljYXJyeSAtPSAoaW50KWJuX3N1Yl93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzI1Nl9UT1ApOworCS8qRDQqLworCW5pc3Rfc2V0XzI1Nih0X2QsIGJ1ZiwgMTMsIDAsIDExLCAxMCwgOSwgMCwgMTUsIDE0KTsKKwljYXJyeSAtPSAoaW50KWJuX3N1Yl93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzI1Nl9UT1ApOworCisJLyogc2VlIEJOX25pc3RfbW9kXzIyNCBmb3IgZXhwbGFuYXRpb24gKi8KKwl1LmYgPSBibl9zdWJfd29yZHM7CisJaWYgKGNhcnJ5ID4gMCkKKwkJY2FycnkgPSAoaW50KWJuX3N1Yl93b3JkcyhyX2Qscl9kLF9uaXN0X3BfMjU2W2NhcnJ5LTFdLEJOX05JU1RfMjU2X1RPUCk7CisJZWxzZSBpZiAoY2FycnkgPCAwKQorCQl7CisJCWNhcnJ5ID0gKGludClibl9hZGRfd29yZHMocl9kLHJfZCxfbmlzdF9wXzI1NlstY2FycnktMV0sQk5fTklTVF8yNTZfVE9QKTsKKwkJbWFzayA9IDAtKHNpemVfdCljYXJyeTsKKwkJdS5wID0gKChzaXplX3QpYm5fc3ViX3dvcmRzJm1hc2spIHwgKChzaXplX3QpYm5fYWRkX3dvcmRzJn5tYXNrKTsKKwkJfQorCWVsc2UKKwkJY2FycnkgPSAxOworCisJbWFzayAgPSAwLShzaXplX3QpKCp1LmYpKGNfZCxyX2QsX25pc3RfcF8yNTZbMF0sQk5fTklTVF8yNTZfVE9QKTsKKwltYXNrICY9IDAtKHNpemVfdCljYXJyeTsKKwlyZXMgICA9IChCTl9VTE9ORyAqKSgoKHNpemVfdCljX2Qmfm1hc2spIHwgKChzaXplX3Qpcl9kJm1hc2spKTsKKwluaXN0X2NwX2JuKHJfZCwgcmVzLCBCTl9OSVNUXzI1Nl9UT1ApOworCXItPnRvcCA9IEJOX05JU1RfMjU2X1RPUDsKKwlibl9jb3JyZWN0X3RvcChyKTsKKworCXJldHVybiAxOworCX0KKworI2RlZmluZSBuaXN0X3NldF8zODQodG8sZnJvbSxhMSxhMixhMyxhNCxhNSxhNixhNyxhOCxhOSxhMTAsYTExLGExMikgXAorCXsgXAorCWJuX2NwXzMyKHRvLCAwLCBmcm9tLCAgKGExMikgLSAxMikgXAorCWJuX2NwXzMyKHRvLCAxLCBmcm9tLCAgKGExMSkgLSAxMikgXAorCWJuX2NwXzMyKHRvLCAyLCBmcm9tLCAgKGExMCkgLSAxMikgXAorCWJuX2NwXzMyKHRvLCAzLCBmcm9tLCAgKGE5KSAtIDEyKSAgXAorCWJuX2NwXzMyKHRvLCA0LCBmcm9tLCAgKGE4KSAtIDEyKSAgXAorCWJuX2NwXzMyKHRvLCA1LCBmcm9tLCAgKGE3KSAtIDEyKSAgXAorCWJuX2NwXzMyKHRvLCA2LCBmcm9tLCAgKGE2KSAtIDEyKSAgXAorCWJuX2NwXzMyKHRvLCA3LCBmcm9tLCAgKGE1KSAtIDEyKSAgXAorCWJuX2NwXzMyKHRvLCA4LCBmcm9tLCAgKGE0KSAtIDEyKSAgXAorCWJuX2NwXzMyKHRvLCA5LCBmcm9tLCAgKGEzKSAtIDEyKSAgXAorCWJuX2NwXzMyKHRvLCAxMCwgZnJvbSwgKGEyKSAtIDEyKSAgXAorCWJuX2NwXzMyKHRvLCAxMSwgZnJvbSwgKGExKSAtIDEyKSAgXAorCX0KKworaW50IEJOX25pc3RfbW9kXzM4NChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpmaWVsZCwKKwlCTl9DVFggKmN0eCkKKwl7CisJaW50CWksIHRvcCA9IGEtPnRvcDsKKwlpbnQJY2FycnkgPSAwOworCXJlZ2lzdGVyIEJOX1VMT05HICpyX2QsICphX2QgPSBhLT5kOworCUJOX1VMT05HIHRfZFtCTl9OSVNUXzM4NF9UT1BdLAorCSAgICAgICAgIGJ1ZltCTl9OSVNUXzM4NF9UT1BdLAorCQkgY19kW0JOX05JU1RfMzg0X1RPUF0sCisJCSpyZXM7CisJc2l6ZV90CSBtYXNrOworCXVuaW9uIHsgYm5fYWRkc3ViX2YgZjsgc2l6ZV90IHA7IH0gdTsKKwlzdGF0aWMgY29uc3QgQklHTlVNIF9iaWdudW1fbmlzdF9wXzM4NF9zcXIgPSB7CisJCShCTl9VTE9ORyAqKV9uaXN0X3BfMzg0X3NxciwKKwkJc2l6ZW9mKF9uaXN0X3BfMzg0X3Nxcikvc2l6ZW9mKF9uaXN0X3BfMzg0X3NxclswXSksCisJCXNpemVvZihfbmlzdF9wXzM4NF9zcXIpL3NpemVvZihfbmlzdF9wXzM4NF9zcXJbMF0pLAorCQkwLEJOX0ZMR19TVEFUSUNfREFUQSB9OworCisKKwlmaWVsZCA9ICZfYmlnbnVtX25pc3RfcF8zODQ7IC8qIGp1c3QgdG8gbWFrZSBzdXJlICovCisKKyAJaWYgKEJOX2lzX25lZ2F0aXZlKGEpIHx8IEJOX3VjbXAoYSwmX2JpZ251bV9uaXN0X3BfMzg0X3Nxcik+PTApCisJCXJldHVybiBCTl9ubm1vZChyLCBhLCBmaWVsZCwgY3R4KTsKKworCWkgPSBCTl91Y21wKGZpZWxkLCBhKTsKKwlpZiAoaSA9PSAwKQorCQl7CisJCUJOX3plcm8ocik7CisJCXJldHVybiAxOworCQl9CisJZWxzZSBpZiAoaSA+IDApCisJCXJldHVybiAociA9PSBhKT8gMSA6IChCTl9jb3B5KHIgLGEpICE9IE5VTEwpOworCisJaWYgKHIgIT0gYSkKKwkJeworCQlpZiAoIWJuX3dleHBhbmQociwgQk5fTklTVF8zODRfVE9QKSkKKwkJCXJldHVybiAwOworCQlyX2QgPSByLT5kOworCQluaXN0X2NwX2JuKHJfZCwgYV9kLCBCTl9OSVNUXzM4NF9UT1ApOworCQl9CisJZWxzZQorCQlyX2QgPSBhX2Q7CisKKwluaXN0X2NwX2JuXzAoYnVmLCBhX2QgKyBCTl9OSVNUXzM4NF9UT1AsIHRvcCAtIEJOX05JU1RfMzg0X1RPUCwgQk5fTklTVF8zODRfVE9QKTsKKworCS8qUzEqLworCW5pc3Rfc2V0XzI1Nih0X2QsIGJ1ZiwgMCwgMCwgMCwgMCwgMCwgMjMtNCwgMjItNCwgMjEtNCk7CisJCS8qIGxlZnQgc2hpZnQgKi8KKwkJeworCQlyZWdpc3RlciBCTl9VTE9ORyAqYXAsdCxjOworCQlhcCA9IHRfZDsKKwkJYz0wOworCQlmb3IgKGkgPSAzOyBpICE9IDA7IC0taSkKKwkJCXsKKwkJCXQ9ICphcDsKKwkJCSooYXArKyk9KCh0PDwxKXxjKSZCTl9NQVNLMjsKKwkJCWM9KHQgJiBCTl9UQklUKT8xOjA7CisJCQl9CisJCSphcD1jOworCQl9CisJY2FycnkgPSAoaW50KWJuX2FkZF93b3JkcyhyX2QrKDEyOC9CTl9CSVRTMiksIHJfZCsoMTI4L0JOX0JJVFMyKSwgCisJCXRfZCwgQk5fTklTVF8yNTZfVE9QKTsKKwkvKlMyICovCisJY2FycnkgKz0gKGludClibl9hZGRfd29yZHMocl9kLCByX2QsIGJ1ZiwgQk5fTklTVF8zODRfVE9QKTsKKwkvKlMzKi8KKwluaXN0X3NldF8zODQodF9kLGJ1ZiwyMCwxOSwxOCwxNywxNiwxNSwxNCwxMywxMiwyMywyMiwyMSk7CisJY2FycnkgKz0gKGludClibl9hZGRfd29yZHMocl9kLCByX2QsIHRfZCwgQk5fTklTVF8zODRfVE9QKTsKKwkvKlM0Ki8KKwluaXN0X3NldF8zODQodF9kLGJ1ZiwxOSwxOCwxNywxNiwxNSwxNCwxMywxMiwyMCwwLDIzLDApOworCWNhcnJ5ICs9IChpbnQpYm5fYWRkX3dvcmRzKHJfZCwgcl9kLCB0X2QsIEJOX05JU1RfMzg0X1RPUCk7CisJLypTNSovCisJbmlzdF9zZXRfMzg0KHRfZCwgYnVmLDAsMCwwLDAsMjMsMjIsMjEsMjAsMCwwLDAsMCk7CisJY2FycnkgKz0gKGludClibl9hZGRfd29yZHMocl9kLCByX2QsIHRfZCwgQk5fTklTVF8zODRfVE9QKTsKKwkvKlM2Ki8KKwluaXN0X3NldF8zODQodF9kLGJ1ZiwwLDAsMCwwLDAsMCwyMywyMiwyMSwwLDAsMjApOworCWNhcnJ5ICs9IChpbnQpYm5fYWRkX3dvcmRzKHJfZCwgcl9kLCB0X2QsIEJOX05JU1RfMzg0X1RPUCk7CisJLypEMSovCisJbmlzdF9zZXRfMzg0KHRfZCxidWYsMjIsMjEsMjAsMTksMTgsMTcsMTYsMTUsMTQsMTMsMTIsMjMpOworCWNhcnJ5IC09IChpbnQpYm5fc3ViX3dvcmRzKHJfZCwgcl9kLCB0X2QsIEJOX05JU1RfMzg0X1RPUCk7CisJLypEMiovCisJbmlzdF9zZXRfMzg0KHRfZCxidWYsMCwwLDAsMCwwLDAsMCwyMywyMiwyMSwyMCwwKTsKKwljYXJyeSAtPSAoaW50KWJuX3N1Yl93b3JkcyhyX2QsIHJfZCwgdF9kLCBCTl9OSVNUXzM4NF9UT1ApOworCS8qRDMqLworCW5pc3Rfc2V0XzM4NCh0X2QsYnVmLDAsMCwwLDAsMCwwLDAsMjMsMjMsMCwwLDApOworCWNhcnJ5IC09IChpbnQpYm5fc3ViX3dvcmRzKHJfZCwgcl9kLCB0X2QsIEJOX05JU1RfMzg0X1RPUCk7CisKKwkvKiBzZWUgQk5fbmlzdF9tb2RfMjI0IGZvciBleHBsYW5hdGlvbiAqLworCXUuZiA9IGJuX3N1Yl93b3JkczsKKwlpZiAoY2FycnkgPiAwKQorCQljYXJyeSA9IChpbnQpYm5fc3ViX3dvcmRzKHJfZCxyX2QsX25pc3RfcF8zODRbY2FycnktMV0sQk5fTklTVF8zODRfVE9QKTsKKwllbHNlIGlmIChjYXJyeSA8IDApCisJCXsKKwkJY2FycnkgPSAoaW50KWJuX2FkZF93b3JkcyhyX2Qscl9kLF9uaXN0X3BfMzg0Wy1jYXJyeS0xXSxCTl9OSVNUXzM4NF9UT1ApOworCQltYXNrID0gMC0oc2l6ZV90KWNhcnJ5OworCQl1LnAgPSAoKHNpemVfdClibl9zdWJfd29yZHMmbWFzaykgfCAoKHNpemVfdClibl9hZGRfd29yZHMmfm1hc2spOworCQl9CisJZWxzZQorCQljYXJyeSA9IDE7CisKKwltYXNrICA9IDAtKHNpemVfdCkoKnUuZikoY19kLHJfZCxfbmlzdF9wXzM4NFswXSxCTl9OSVNUXzM4NF9UT1ApOworCW1hc2sgJj0gMC0oc2l6ZV90KWNhcnJ5OworCXJlcyAgID0gKEJOX1VMT05HICopKCgoc2l6ZV90KWNfZCZ+bWFzaykgfCAoKHNpemVfdClyX2QmbWFzaykpOworCW5pc3RfY3BfYm4ocl9kLCByZXMsIEJOX05JU1RfMzg0X1RPUCk7CisJci0+dG9wID0gQk5fTklTVF8zODRfVE9QOworCWJuX2NvcnJlY3RfdG9wKHIpOworCisJcmV0dXJuIDE7CisJfQorCisjZGVmaW5lIEJOX05JU1RfNTIxX1JTSElGVAkoNTIxJUJOX0JJVFMyKQorI2RlZmluZSBCTl9OSVNUXzUyMV9MU0hJRlQJKEJOX0JJVFMyLUJOX05JU1RfNTIxX1JTSElGVCkKKyNkZWZpbmUgQk5fTklTVF81MjFfVE9QX01BU0sJKChCTl9VTE9ORylCTl9NQVNLMj4+Qk5fTklTVF81MjFfTFNISUZUKQorCitpbnQgQk5fbmlzdF9tb2RfNTIxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmZpZWxkLAorCUJOX0NUWCAqY3R4KQorCXsKKwlpbnQJdG9wID0gYS0+dG9wLCBpOworCUJOX1VMT05HICpyX2QsICphX2QgPSBhLT5kLAorCQkgdF9kW0JOX05JU1RfNTIxX1RPUF0sCisJCSB2YWwsdG1wLCpyZXM7CisJc2l6ZV90CW1hc2s7CisJc3RhdGljIGNvbnN0IEJJR05VTSBfYmlnbnVtX25pc3RfcF81MjFfc3FyID0geworCQkoQk5fVUxPTkcgKilfbmlzdF9wXzUyMV9zcXIsCisJCXNpemVvZihfbmlzdF9wXzUyMV9zcXIpL3NpemVvZihfbmlzdF9wXzUyMV9zcXJbMF0pLAorCQlzaXplb2YoX25pc3RfcF81MjFfc3FyKS9zaXplb2YoX25pc3RfcF81MjFfc3FyWzBdKSwKKwkJMCxCTl9GTEdfU1RBVElDX0RBVEEgfTsKKworCWZpZWxkID0gJl9iaWdudW1fbmlzdF9wXzUyMTsgLyoganVzdCB0byBtYWtlIHN1cmUgKi8KKworIAlpZiAoQk5faXNfbmVnYXRpdmUoYSkgfHwgQk5fdWNtcChhLCZfYmlnbnVtX25pc3RfcF81MjFfc3FyKT49MCkKKwkJcmV0dXJuIEJOX25ubW9kKHIsIGEsIGZpZWxkLCBjdHgpOworCisJaSA9IEJOX3VjbXAoZmllbGQsIGEpOworCWlmIChpID09IDApCisJCXsKKwkJQk5femVybyhyKTsKKwkJcmV0dXJuIDE7CisJCX0KKwllbHNlIGlmIChpID4gMCkKKwkJcmV0dXJuIChyID09IGEpPyAxIDogKEJOX2NvcHkociAsYSkgIT0gTlVMTCk7CisKKwlpZiAociAhPSBhKQorCQl7CisJCWlmICghYm5fd2V4cGFuZChyLEJOX05JU1RfNTIxX1RPUCkpCisJCQlyZXR1cm4gMDsKKwkJcl9kID0gci0+ZDsKKwkJbmlzdF9jcF9ibihyX2QsYV9kLCBCTl9OSVNUXzUyMV9UT1ApOworCQl9CisJZWxzZQorCQlyX2QgPSBhX2Q7CisKKwkvKiB1cHBlciA1MjEgYml0cywgY29weSAuLi4gKi8KKwluaXN0X2NwX2JuXzAodF9kLGFfZCArIChCTl9OSVNUXzUyMV9UT1AtMSksIHRvcCAtIChCTl9OSVNUXzUyMV9UT1AtMSksQk5fTklTVF81MjFfVE9QKTsKKwkvKiAuLi4gYW5kIHJpZ2h0IHNoaWZ0ICovCisJZm9yICh2YWw9dF9kWzBdLGk9MDsgaTxCTl9OSVNUXzUyMV9UT1AtMTsgaSsrKQorCQl7CisJCXRtcCA9IHZhbD4+Qk5fTklTVF81MjFfUlNISUZUOworCQl2YWwgPSB0X2RbaSsxXTsKKwkJdF9kW2ldID0gKHRtcCB8IHZhbDw8Qk5fTklTVF81MjFfTFNISUZUKSAmIEJOX01BU0syOworCQl9CisJdF9kW2ldID0gdmFsPj5CTl9OSVNUXzUyMV9SU0hJRlQ7CisJLyogbG93ZXIgNTIxIGJpdHMgKi8KKwlyX2RbaV0gJj0gQk5fTklTVF81MjFfVE9QX01BU0s7CisKKwlibl9hZGRfd29yZHMocl9kLHJfZCx0X2QsQk5fTklTVF81MjFfVE9QKTsKKwltYXNrID0gMC0oc2l6ZV90KWJuX3N1Yl93b3Jkcyh0X2Qscl9kLF9uaXN0X3BfNTIxLEJOX05JU1RfNTIxX1RPUCk7CisJcmVzICA9IChCTl9VTE9ORyAqKSgoKHNpemVfdCl0X2Qmfm1hc2spIHwgKChzaXplX3Qpcl9kJm1hc2spKTsKKwluaXN0X2NwX2JuKHJfZCxyZXMsQk5fTklTVF81MjFfVE9QKTsKKwlyLT50b3AgPSBCTl9OSVNUXzUyMV9UT1A7CisJYm5fY29ycmVjdF90b3Aocik7CisKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fcHJpbWUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9wcmltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMjU5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fcHJpbWUuYwpAQCAtMCwwICsxLDQ5NCBAQAorLyogY3J5cHRvL2JuL2JuX3ByaW1lLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworLyogTkI6IHRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gInVwZ3JhZGVkIiwgdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbnMgKHdoaWNoIGFyZQorICogY29tcGF0aWJpbGl0eSB3cmFwcGVycyB1c2luZyB0aGVzZSBmdW5jdGlvbnMpIGFyZSBpbiBibl9kZXByLmMuCisgKiAtIEdlb2ZmCisgKi8KKworLyogVGhlIHF1aWNrIHNpZXZlIGFsZ29yaXRobSBhcHByb2FjaCB0byB3ZWVkaW5nIG91dCBwcmltZXMgaXMKKyAqIFBoaWxpcCBaaW1tZXJtYW5uJ3MsIGFzIGltcGxlbWVudGVkIGluIFBHUC4gIEkgaGF2ZSBoYWQgYSByZWFkIG9mCisgKiBoaXMgY29tbWVudHMgYW5kIGltcGxlbWVudGVkIG15IG93biB2ZXJzaW9uLgorICovCisjaW5jbHVkZSAiYm5fcHJpbWUuaCIKKworc3RhdGljIGludCB3aXRuZXNzKEJJR05VTSAqdywgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmExLAorCWNvbnN0IEJJR05VTSAqYTFfb2RkLCBpbnQgaywgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICptb250KTsKK3N0YXRpYyBpbnQgcHJvYmFibGVfcHJpbWUoQklHTlVNICpybmQsIGludCBiaXRzKTsKK3N0YXRpYyBpbnQgcHJvYmFibGVfcHJpbWVfZGgoQklHTlVNICpybmQsIGludCBiaXRzLAorCWNvbnN0IEJJR05VTSAqYWRkLCBjb25zdCBCSUdOVU0gKnJlbSwgQk5fQ1RYICpjdHgpOworc3RhdGljIGludCBwcm9iYWJsZV9wcmltZV9kaF9zYWZlKEJJR05VTSAqcm5kLCBpbnQgYml0cywKKwljb25zdCBCSUdOVU0gKmFkZCwgY29uc3QgQklHTlVNICpyZW0sIEJOX0NUWCAqY3R4KTsKKworaW50IEJOX0dFTkNCX2NhbGwoQk5fR0VOQ0IgKmNiLCBpbnQgYSwgaW50IGIpCisJeworCS8qIE5vIGNhbGxiYWNrIG1lYW5zIGNvbnRpbnVlICovCisJaWYoIWNiKSByZXR1cm4gMTsKKwlzd2l0Y2goY2ItPnZlcikKKwkJeworCWNhc2UgMToKKwkJLyogRGVwcmVjYXRlZC1zdHlsZSBjYWxsYmFja3MgKi8KKwkJaWYoIWNiLT5jYi5jYl8xKQorCQkJcmV0dXJuIDE7CisJCWNiLT5jYi5jYl8xKGEsIGIsIGNiLT5hcmcpOworCQlyZXR1cm4gMTsKKwljYXNlIDI6CisJCS8qIE5ldy1zdHlsZSBjYWxsYmFja3MgKi8KKwkJcmV0dXJuIGNiLT5jYi5jYl8yKGEsIGIsIGNiKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwkJfQorCS8qIFVucmVjb2duaXNlZCBjYWxsYmFjayB0eXBlICovCisJcmV0dXJuIDA7CisJfQorCitpbnQgQk5fZ2VuZXJhdGVfcHJpbWVfZXgoQklHTlVNICpyZXQsIGludCBiaXRzLCBpbnQgc2FmZSwKKwljb25zdCBCSUdOVU0gKmFkZCwgY29uc3QgQklHTlVNICpyZW0sIEJOX0dFTkNCICpjYikKKwl7CisJQklHTlVNICp0OworCWludCBmb3VuZD0wOworCWludCBpLGosYzE9MDsKKwlCTl9DVFggKmN0eDsKKwlpbnQgY2hlY2tzID0gQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplKGJpdHMpOworCisJY3R4PUJOX0NUWF9uZXcoKTsKKwlpZiAoY3R4ID09IE5VTEwpIGdvdG8gZXJyOworCUJOX0NUWF9zdGFydChjdHgpOworCXQgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYoIXQpIGdvdG8gZXJyOworbG9vcDogCisJLyogbWFrZSBhIHJhbmRvbSBudW1iZXIgYW5kIHNldCB0aGUgdG9wIGFuZCBib3R0b20gYml0cyAqLworCWlmIChhZGQgPT0gTlVMTCkKKwkJeworCQlpZiAoIXByb2JhYmxlX3ByaW1lKHJldCxiaXRzKSkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKHNhZmUpCisJCQl7CisJCQlpZiAoIXByb2JhYmxlX3ByaW1lX2RoX3NhZmUocmV0LGJpdHMsYWRkLHJlbSxjdHgpKQorCQkJCSBnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKCFwcm9iYWJsZV9wcmltZV9kaChyZXQsYml0cyxhZGQscmVtLGN0eCkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwkvKiBpZiAoQk5fbW9kX3dvcmQocmV0LChCTl9VTE9ORykzKSA9PSAxKSBnb3RvIGxvb3A7ICovCisJaWYoIUJOX0dFTkNCX2NhbGwoY2IsIDAsIGMxKyspKQorCQkvKiBhYm9ydGVkICovCisJCWdvdG8gZXJyOworCisJaWYgKCFzYWZlKQorCQl7CisJCWk9Qk5faXNfcHJpbWVfZmFzdHRlc3RfZXgocmV0LGNoZWNrcyxjdHgsMCxjYik7CisJCWlmIChpID09IC0xKSBnb3RvIGVycjsKKwkJaWYgKGkgPT0gMCkgZ290byBsb29wOworCQl9CisJZWxzZQorCQl7CisJCS8qIGZvciAic2FmZSBwcmltZSIgZ2VuZXJhdGlvbiwKKwkJICogY2hlY2sgdGhhdCAocC0xKS8yIGlzIHByaW1lLgorCQkgKiBTaW5jZSBhIHByaW1lIGlzIG9kZCwgV2UganVzdAorCQkgKiBuZWVkIHRvIGRpdmlkZSBieSAyICovCisJCWlmICghQk5fcnNoaWZ0MSh0LHJldCkpIGdvdG8gZXJyOworCisJCWZvciAoaT0wOyBpPGNoZWNrczsgaSsrKQorCQkJeworCQkJaj1CTl9pc19wcmltZV9mYXN0dGVzdF9leChyZXQsMSxjdHgsMCxjYik7CisJCQlpZiAoaiA9PSAtMSkgZ290byBlcnI7CisJCQlpZiAoaiA9PSAwKSBnb3RvIGxvb3A7CisKKwkJCWo9Qk5faXNfcHJpbWVfZmFzdHRlc3RfZXgodCwxLGN0eCwwLGNiKTsKKwkJCWlmIChqID09IC0xKSBnb3RvIGVycjsKKwkJCWlmIChqID09IDApIGdvdG8gbG9vcDsKKworCQkJaWYoIUJOX0dFTkNCX2NhbGwoY2IsIDIsIGMxLTEpKQorCQkJCWdvdG8gZXJyOworCQkJLyogV2UgaGF2ZSBhIHNhZmUgcHJpbWUgdGVzdCBwYXNzICovCisJCQl9CisJCX0KKwkvKiB3ZSBoYXZlIGEgcHJpbWUgOi0pICovCisJZm91bmQgPSAxOworZXJyOgorCWlmIChjdHggIT0gTlVMTCkKKwkJeworCQlCTl9DVFhfZW5kKGN0eCk7CisJCUJOX0NUWF9mcmVlKGN0eCk7CisJCX0KKwlibl9jaGVja190b3AocmV0KTsKKwlyZXR1cm4gZm91bmQ7CisJfQorCitpbnQgQk5faXNfcHJpbWVfZXgoY29uc3QgQklHTlVNICphLCBpbnQgY2hlY2tzLCBCTl9DVFggKmN0eF9wYXNzZWQsIEJOX0dFTkNCICpjYikKKwl7CisJcmV0dXJuIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KGEsIGNoZWNrcywgY3R4X3Bhc3NlZCwgMCwgY2IpOworCX0KKworaW50IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KGNvbnN0IEJJR05VTSAqYSwgaW50IGNoZWNrcywgQk5fQ1RYICpjdHhfcGFzc2VkLAorCQlpbnQgZG9fdHJpYWxfZGl2aXNpb24sIEJOX0dFTkNCICpjYikKKwl7CisJaW50IGksIGosIHJldCA9IC0xOworCWludCBrOworCUJOX0NUWCAqY3R4ID0gTlVMTDsKKwlCSUdOVU0gKkExLCAqQTFfb2RkLCAqY2hlY2s7IC8qIHRha2VuIGZyb20gY3R4ICovCisJQk5fTU9OVF9DVFggKm1vbnQgPSBOVUxMOworCWNvbnN0IEJJR05VTSAqQSA9IE5VTEw7CisKKwlpZiAoQk5fY21wKGEsIEJOX3ZhbHVlX29uZSgpKSA8PSAwKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoY2hlY2tzID09IEJOX3ByaW1lX2NoZWNrcykKKwkJY2hlY2tzID0gQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplKEJOX251bV9iaXRzKGEpKTsKKworCS8qIGZpcnN0IGxvb2sgZm9yIHNtYWxsIGZhY3RvcnMgKi8KKwlpZiAoIUJOX2lzX29kZChhKSkKKwkJLyogYSBpcyBldmVuID0+IGEgaXMgcHJpbWUgaWYgYW5kIG9ubHkgaWYgYSA9PSAyICovCisJCXJldHVybiBCTl9pc193b3JkKGEsIDIpOworCWlmIChkb190cmlhbF9kaXZpc2lvbikKKwkJeworCQlmb3IgKGkgPSAxOyBpIDwgTlVNUFJJTUVTOyBpKyspCisJCQlpZiAoQk5fbW9kX3dvcmQoYSwgcHJpbWVzW2ldKSA9PSAwKSAKKwkJCQlyZXR1cm4gMDsKKwkJaWYoIUJOX0dFTkNCX2NhbGwoY2IsIDEsIC0xKSkKKwkJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoY3R4X3Bhc3NlZCAhPSBOVUxMKQorCQljdHggPSBjdHhfcGFzc2VkOworCWVsc2UKKwkJaWYgKChjdHg9Qk5fQ1RYX25ldygpKSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisKKwkvKiBBIDo9IGFicyhhKSAqLworCWlmIChhLT5uZWcpCisJCXsKKwkJQklHTlVNICp0OworCQlpZiAoKHQgPSBCTl9DVFhfZ2V0KGN0eCkpID09IE5VTEwpIGdvdG8gZXJyOworCQlCTl9jb3B5KHQsIGEpOworCQl0LT5uZWcgPSAwOworCQlBID0gdDsKKwkJfQorCWVsc2UKKwkJQSA9IGE7CisJQTEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJQTFfb2RkID0gQk5fQ1RYX2dldChjdHgpOworCWNoZWNrID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChjaGVjayA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIGNvbXB1dGUgQTEgOj0gQSAtIDEgKi8KKwlpZiAoIUJOX2NvcHkoQTEsIEEpKQorCQlnb3RvIGVycjsKKwlpZiAoIUJOX3N1Yl93b3JkKEExLCAxKSkKKwkJZ290byBlcnI7CisJaWYgKEJOX2lzX3plcm8oQTEpKQorCQl7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiB3cml0ZSAgQTEgIGFzICBBMV9vZGQgKiAyXmsgKi8KKwlrID0gMTsKKwl3aGlsZSAoIUJOX2lzX2JpdF9zZXQoQTEsIGspKQorCQlrKys7CisJaWYgKCFCTl9yc2hpZnQoQTFfb2RkLCBBMSwgaykpCisJCWdvdG8gZXJyOworCisJLyogTW9udGdvbWVyeSBzZXR1cCBmb3IgY29tcHV0YXRpb25zIG1vZCBBICovCisJbW9udCA9IEJOX01PTlRfQ1RYX25ldygpOworCWlmIChtb250ID09IE5VTEwpCisJCWdvdG8gZXJyOworCWlmICghQk5fTU9OVF9DVFhfc2V0KG1vbnQsIEEsIGN0eCkpCisJCWdvdG8gZXJyOworCQorCWZvciAoaSA9IDA7IGkgPCBjaGVja3M7IGkrKykKKwkJeworCQlpZiAoIUJOX3BzZXVkb19yYW5kX3JhbmdlKGNoZWNrLCBBMSkpCisJCQlnb3RvIGVycjsKKwkJaWYgKCFCTl9hZGRfd29yZChjaGVjaywgMSkpCisJCQlnb3RvIGVycjsKKwkJLyogbm93IDEgPD0gY2hlY2sgPCBBICovCisKKwkJaiA9IHdpdG5lc3MoY2hlY2ssIEEsIEExLCBBMV9vZGQsIGssIGN0eCwgbW9udCk7CisJCWlmIChqID09IC0xKSBnb3RvIGVycjsKKwkJaWYgKGopCisJCQl7CisJCQlyZXQ9MDsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZighQk5fR0VOQ0JfY2FsbChjYiwgMSwgaSkpCisJCQlnb3RvIGVycjsKKwkJfQorCXJldD0xOworZXJyOgorCWlmIChjdHggIT0gTlVMTCkKKwkJeworCQlCTl9DVFhfZW5kKGN0eCk7CisJCWlmIChjdHhfcGFzc2VkID09IE5VTEwpCisJCQlCTl9DVFhfZnJlZShjdHgpOworCQl9CisJaWYgKG1vbnQgIT0gTlVMTCkKKwkJQk5fTU9OVF9DVFhfZnJlZShtb250KTsKKworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCB3aXRuZXNzKEJJR05VTSAqdywgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmExLAorCWNvbnN0IEJJR05VTSAqYTFfb2RkLCBpbnQgaywgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICptb250KQorCXsKKwlpZiAoIUJOX21vZF9leHBfbW9udCh3LCB3LCBhMV9vZGQsIGEsIGN0eCwgbW9udCkpIC8qIHcgOj0gd15hMV9vZGQgbW9kIGEgKi8KKwkJcmV0dXJuIC0xOworCWlmIChCTl9pc19vbmUodykpCisJCXJldHVybiAwOyAvKiBwcm9iYWJseSBwcmltZSAqLworCWlmIChCTl9jbXAodywgYTEpID09IDApCisJCXJldHVybiAwOyAvKiB3ID09IC0xIChtb2QgYSksICAnYScgaXMgcHJvYmFibHkgcHJpbWUgKi8KKwl3aGlsZSAoLS1rKQorCQl7CisJCWlmICghQk5fbW9kX211bCh3LCB3LCB3LCBhLCBjdHgpKSAvKiB3IDo9IHdeMiBtb2QgYSAqLworCQkJcmV0dXJuIC0xOworCQlpZiAoQk5faXNfb25lKHcpKQorCQkJcmV0dXJuIDE7IC8qICdhJyBpcyBjb21wb3NpdGUsIG90aGVyd2lzZSBhIHByZXZpb3VzICd3JyB3b3VsZAorCQkJICAgICAgICAgICAqIGhhdmUgYmVlbiA9PSAtMSAobW9kICdhJykgKi8KKwkJaWYgKEJOX2NtcCh3LCBhMSkgPT0gMCkKKwkJCXJldHVybiAwOyAvKiB3ID09IC0xIChtb2QgYSksICdhJyBpcyBwcm9iYWJseSBwcmltZSAqLworCQl9CisJLyogSWYgd2UgZ2V0IGhlcmUsICd3JyBpcyB0aGUgKGEtMSkvMi10aCBwb3dlciBvZiB0aGUgb3JpZ2luYWwgJ3cnLAorCSAqIGFuZCBpdCBpcyBuZWl0aGVyIC0xIG5vciArMSAtLSBzbyAnYScgY2Fubm90IGJlIHByaW1lICovCisJYm5fY2hlY2tfdG9wKHcpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBwcm9iYWJsZV9wcmltZShCSUdOVU0gKnJuZCwgaW50IGJpdHMpCisJeworCWludCBpOworCXByaW1lX3QgbW9kc1tOVU1QUklNRVNdOworCUJOX1VMT05HIGRlbHRhLG1heGRlbHRhOworCithZ2FpbjoKKwlpZiAoIUJOX3JhbmQocm5kLGJpdHMsMSwxKSkgcmV0dXJuKDApOworCS8qIHdlIG5vdyBoYXZlIGEgcmFuZG9tIG51bWJlciAncmFuZCcgdG8gdGVzdC4gKi8KKwlmb3IgKGk9MTsgaTxOVU1QUklNRVM7IGkrKykKKwkJbW9kc1tpXT0ocHJpbWVfdClCTl9tb2Rfd29yZChybmQsKEJOX1VMT05HKXByaW1lc1tpXSk7CisJbWF4ZGVsdGE9Qk5fTUFTSzIgLSBwcmltZXNbTlVNUFJJTUVTLTFdOworCWRlbHRhPTA7CisJbG9vcDogZm9yIChpPTE7IGk8TlVNUFJJTUVTOyBpKyspCisJCXsKKwkJLyogY2hlY2sgdGhhdCBybmQgaXMgbm90IGEgcHJpbWUgYW5kIGFsc28KKwkJICogdGhhdCBnY2Qocm5kLTEscHJpbWVzKSA9PSAxIChleGNlcHQgZm9yIDIpICovCisJCWlmICgoKG1vZHNbaV0rZGVsdGEpJXByaW1lc1tpXSkgPD0gMSkKKwkJCXsKKwkJCWRlbHRhKz0yOworCQkJaWYgKGRlbHRhID4gbWF4ZGVsdGEpIGdvdG8gYWdhaW47CisJCQlnb3RvIGxvb3A7CisJCQl9CisJCX0KKwlpZiAoIUJOX2FkZF93b3JkKHJuZCxkZWx0YSkpIHJldHVybigwKTsKKwlibl9jaGVja190b3Aocm5kKTsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IHByb2JhYmxlX3ByaW1lX2RoKEJJR05VTSAqcm5kLCBpbnQgYml0cywKKwljb25zdCBCSUdOVU0gKmFkZCwgY29uc3QgQklHTlVNICpyZW0sIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgaSxyZXQ9MDsKKwlCSUdOVU0gKnQxOworCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJaWYgKCh0MSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoIUJOX3JhbmQocm5kLGJpdHMsMCwxKSkgZ290byBlcnI7CisKKwkvKiB3ZSBuZWVkICgocm5kLXJlbSkgJSBhZGQpID09IDAgKi8KKworCWlmICghQk5fbW9kKHQxLHJuZCxhZGQsY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9zdWIocm5kLHJuZCx0MSkpIGdvdG8gZXJyOworCWlmIChyZW0gPT0gTlVMTCkKKwkJeyBpZiAoIUJOX2FkZF93b3JkKHJuZCwxKSkgZ290byBlcnI7IH0KKwllbHNlCisJCXsgaWYgKCFCTl9hZGQocm5kLHJuZCxyZW0pKSBnb3RvIGVycjsgfQorCisJLyogd2Ugbm93IGhhdmUgYSByYW5kb20gbnVtYmVyICdyYW5kJyB0byB0ZXN0LiAqLworCisJbG9vcDogZm9yIChpPTE7IGk8TlVNUFJJTUVTOyBpKyspCisJCXsKKwkJLyogY2hlY2sgdGhhdCBybmQgaXMgYSBwcmltZSAqLworCQlpZiAoQk5fbW9kX3dvcmQocm5kLChCTl9VTE9ORylwcmltZXNbaV0pIDw9IDEpCisJCQl7CisJCQlpZiAoIUJOX2FkZChybmQscm5kLGFkZCkpIGdvdG8gZXJyOworCQkJZ290byBsb29wOworCQkJfQorCQl9CisJcmV0PTE7CitlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCWJuX2NoZWNrX3RvcChybmQpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBwcm9iYWJsZV9wcmltZV9kaF9zYWZlKEJJR05VTSAqcCwgaW50IGJpdHMsIGNvbnN0IEJJR05VTSAqcGFkZCwKKwljb25zdCBCSUdOVU0gKnJlbSwgQk5fQ1RYICpjdHgpCisJeworCWludCBpLHJldD0wOworCUJJR05VTSAqdDEsKnFhZGQsKnE7CisKKwliaXRzLS07CisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJdDEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJcSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlxYWRkID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChxYWRkID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKCFCTl9yc2hpZnQxKHFhZGQscGFkZCkpIGdvdG8gZXJyOworCQkKKwlpZiAoIUJOX3JhbmQocSxiaXRzLDAsMSkpIGdvdG8gZXJyOworCisJLyogd2UgbmVlZCAoKHJuZC1yZW0pICUgYWRkKSA9PSAwICovCisJaWYgKCFCTl9tb2QodDEscSxxYWRkLGN0eCkpIGdvdG8gZXJyOworCWlmICghQk5fc3ViKHEscSx0MSkpIGdvdG8gZXJyOworCWlmIChyZW0gPT0gTlVMTCkKKwkJeyBpZiAoIUJOX2FkZF93b3JkKHEsMSkpIGdvdG8gZXJyOyB9CisJZWxzZQorCQl7CisJCWlmICghQk5fcnNoaWZ0MSh0MSxyZW0pKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9hZGQocSxxLHQxKSkgZ290byBlcnI7CisJCX0KKworCS8qIHdlIG5vdyBoYXZlIGEgcmFuZG9tIG51bWJlciAncmFuZCcgdG8gdGVzdC4gKi8KKwlpZiAoIUJOX2xzaGlmdDEocCxxKSkgZ290byBlcnI7CisJaWYgKCFCTl9hZGRfd29yZChwLDEpKSBnb3RvIGVycjsKKworCWxvb3A6IGZvciAoaT0xOyBpPE5VTVBSSU1FUzsgaSsrKQorCQl7CisJCS8qIGNoZWNrIHRoYXQgcCBhbmQgcSBhcmUgcHJpbWUgKi8KKwkJLyogY2hlY2sgdGhhdCBmb3IgcCBhbmQgcQorCQkgKiBnY2QocC0xLHByaW1lcykgPT0gMSAoZXhjZXB0IGZvciAyKSAqLworCQlpZiAoCShCTl9tb2Rfd29yZChwLChCTl9VTE9ORylwcmltZXNbaV0pID09IDApIHx8CisJCQkoQk5fbW9kX3dvcmQocSwoQk5fVUxPTkcpcHJpbWVzW2ldKSA9PSAwKSkKKwkJCXsKKwkJCWlmICghQk5fYWRkKHAscCxwYWRkKSkgZ290byBlcnI7CisJCQlpZiAoIUJOX2FkZChxLHEscWFkZCkpIGdvdG8gZXJyOworCQkJZ290byBsb29wOworCQkJfQorCQl9CisJcmV0PTE7CitlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCWJuX2NoZWNrX3RvcChwKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fcHJpbWUuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9wcmltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDIxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fcHJpbWUuaApAQCAtMCwwICsxLDMyNyBAQAorLyogQXV0byBnZW5lcmF0ZWQgYnkgYm5fcHJpbWUucGwgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBFSUdIVF9CSVQKKyNkZWZpbmUgTlVNUFJJTUVTIDIwNDgKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgcHJpbWVfdDsKKyNlbHNlCisjZGVmaW5lIE5VTVBSSU1FUyA1NAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHByaW1lX3Q7CisjZW5kaWYKK3N0YXRpYyBjb25zdCBwcmltZV90IHByaW1lc1tOVU1QUklNRVNdPQorCXsKKwkgICAyLCAgIDMsICAgNSwgICA3LCAgMTEsICAxMywgIDE3LCAgMTksCisJICAyMywgIDI5LCAgMzEsICAzNywgIDQxLCAgNDMsICA0NywgIDUzLAorCSAgNTksICA2MSwgIDY3LCAgNzEsICA3MywgIDc5LCAgODMsICA4OSwKKwkgIDk3LCAxMDEsIDEwMywgMTA3LCAxMDksIDExMywgMTI3LCAxMzEsCisJIDEzNywgMTM5LCAxNDksIDE1MSwgMTU3LCAxNjMsIDE2NywgMTczLAorCSAxNzksIDE4MSwgMTkxLCAxOTMsIDE5NywgMTk5LCAyMTEsIDIyMywKKwkgMjI3LCAyMjksIDIzMywgMjM5LCAyNDEsIDI1MSwKKyNpZm5kZWYgRUlHSFRfQklUCisJIDI1NywgMjYzLAorCSAyNjksIDI3MSwgMjc3LCAyODEsIDI4MywgMjkzLCAzMDcsIDMxMSwKKwkgMzEzLCAzMTcsIDMzMSwgMzM3LCAzNDcsIDM0OSwgMzUzLCAzNTksCisJIDM2NywgMzczLCAzNzksIDM4MywgMzg5LCAzOTcsIDQwMSwgNDA5LAorCSA0MTksIDQyMSwgNDMxLCA0MzMsIDQzOSwgNDQzLCA0NDksIDQ1NywKKwkgNDYxLCA0NjMsIDQ2NywgNDc5LCA0ODcsIDQ5MSwgNDk5LCA1MDMsCisJIDUwOSwgNTIxLCA1MjMsIDU0MSwgNTQ3LCA1NTcsIDU2MywgNTY5LAorCSA1NzEsIDU3NywgNTg3LCA1OTMsIDU5OSwgNjAxLCA2MDcsIDYxMywKKwkgNjE3LCA2MTksIDYzMSwgNjQxLCA2NDMsIDY0NywgNjUzLCA2NTksCisJIDY2MSwgNjczLCA2NzcsIDY4MywgNjkxLCA3MDEsIDcwOSwgNzE5LAorCSA3MjcsIDczMywgNzM5LCA3NDMsIDc1MSwgNzU3LCA3NjEsIDc2OSwKKwkgNzczLCA3ODcsIDc5NywgODA5LCA4MTEsIDgyMSwgODIzLCA4MjcsCisJIDgyOSwgODM5LCA4NTMsIDg1NywgODU5LCA4NjMsIDg3NywgODgxLAorCSA4ODMsIDg4NywgOTA3LCA5MTEsIDkxOSwgOTI5LCA5MzcsIDk0MSwKKwkgOTQ3LCA5NTMsIDk2NywgOTcxLCA5NzcsIDk4MywgOTkxLCA5OTcsCisJMTAwOSwxMDEzLDEwMTksMTAyMSwxMDMxLDEwMzMsMTAzOSwxMDQ5LAorCTEwNTEsMTA2MSwxMDYzLDEwNjksMTA4NywxMDkxLDEwOTMsMTA5NywKKwkxMTAzLDExMDksMTExNywxMTIzLDExMjksMTE1MSwxMTUzLDExNjMsCisJMTE3MSwxMTgxLDExODcsMTE5MywxMjAxLDEyMTMsMTIxNywxMjIzLAorCTEyMjksMTIzMSwxMjM3LDEyNDksMTI1OSwxMjc3LDEyNzksMTI4MywKKwkxMjg5LDEyOTEsMTI5NywxMzAxLDEzMDMsMTMwNywxMzE5LDEzMjEsCisJMTMyNywxMzYxLDEzNjcsMTM3MywxMzgxLDEzOTksMTQwOSwxNDIzLAorCTE0MjcsMTQyOSwxNDMzLDE0MzksMTQ0NywxNDUxLDE0NTMsMTQ1OSwKKwkxNDcxLDE0ODEsMTQ4MywxNDg3LDE0ODksMTQ5MywxNDk5LDE1MTEsCisJMTUyMywxNTMxLDE1NDMsMTU0OSwxNTUzLDE1NTksMTU2NywxNTcxLAorCTE1NzksMTU4MywxNTk3LDE2MDEsMTYwNywxNjA5LDE2MTMsMTYxOSwKKwkxNjIxLDE2MjcsMTYzNywxNjU3LDE2NjMsMTY2NywxNjY5LDE2OTMsCisJMTY5NywxNjk5LDE3MDksMTcyMSwxNzIzLDE3MzMsMTc0MSwxNzQ3LAorCTE3NTMsMTc1OSwxNzc3LDE3ODMsMTc4NywxNzg5LDE4MDEsMTgxMSwKKwkxODIzLDE4MzEsMTg0NywxODYxLDE4NjcsMTg3MSwxODczLDE4NzcsCisJMTg3OSwxODg5LDE5MDEsMTkwNywxOTEzLDE5MzEsMTkzMywxOTQ5LAorCTE5NTEsMTk3MywxOTc5LDE5ODcsMTk5MywxOTk3LDE5OTksMjAwMywKKwkyMDExLDIwMTcsMjAyNywyMDI5LDIwMzksMjA1MywyMDYzLDIwNjksCisJMjA4MSwyMDgzLDIwODcsMjA4OSwyMDk5LDIxMTEsMjExMywyMTI5LAorCTIxMzEsMjEzNywyMTQxLDIxNDMsMjE1MywyMTYxLDIxNzksMjIwMywKKwkyMjA3LDIyMTMsMjIyMSwyMjM3LDIyMzksMjI0MywyMjUxLDIyNjcsCisJMjI2OSwyMjczLDIyODEsMjI4NywyMjkzLDIyOTcsMjMwOSwyMzExLAorCTIzMzMsMjMzOSwyMzQxLDIzNDcsMjM1MSwyMzU3LDIzNzEsMjM3NywKKwkyMzgxLDIzODMsMjM4OSwyMzkzLDIzOTksMjQxMSwyNDE3LDI0MjMsCisJMjQzNywyNDQxLDI0NDcsMjQ1OSwyNDY3LDI0NzMsMjQ3NywyNTAzLAorCTI1MjEsMjUzMSwyNTM5LDI1NDMsMjU0OSwyNTUxLDI1NTcsMjU3OSwKKwkyNTkxLDI1OTMsMjYwOSwyNjE3LDI2MjEsMjYzMywyNjQ3LDI2NTcsCisJMjY1OSwyNjYzLDI2NzEsMjY3NywyNjgzLDI2ODcsMjY4OSwyNjkzLAorCTI2OTksMjcwNywyNzExLDI3MTMsMjcxOSwyNzI5LDI3MzEsMjc0MSwKKwkyNzQ5LDI3NTMsMjc2NywyNzc3LDI3ODksMjc5MSwyNzk3LDI4MDEsCisJMjgwMywyODE5LDI4MzMsMjgzNywyODQzLDI4NTEsMjg1NywyODYxLAorCTI4NzksMjg4NywyODk3LDI5MDMsMjkwOSwyOTE3LDI5MjcsMjkzOSwKKwkyOTUzLDI5NTcsMjk2MywyOTY5LDI5NzEsMjk5OSwzMDAxLDMwMTEsCisJMzAxOSwzMDIzLDMwMzcsMzA0MSwzMDQ5LDMwNjEsMzA2NywzMDc5LAorCTMwODMsMzA4OSwzMTA5LDMxMTksMzEyMSwzMTM3LDMxNjMsMzE2NywKKwkzMTY5LDMxODEsMzE4NywzMTkxLDMyMDMsMzIwOSwzMjE3LDMyMjEsCisJMzIyOSwzMjUxLDMyNTMsMzI1NywzMjU5LDMyNzEsMzI5OSwzMzAxLAorCTMzMDcsMzMxMywzMzE5LDMzMjMsMzMyOSwzMzMxLDMzNDMsMzM0NywKKwkzMzU5LDMzNjEsMzM3MSwzMzczLDMzODksMzM5MSwzNDA3LDM0MTMsCisJMzQzMywzNDQ5LDM0NTcsMzQ2MSwzNDYzLDM0NjcsMzQ2OSwzNDkxLAorCTM0OTksMzUxMSwzNTE3LDM1MjcsMzUyOSwzNTMzLDM1MzksMzU0MSwKKwkzNTQ3LDM1NTcsMzU1OSwzNTcxLDM1ODEsMzU4MywzNTkzLDM2MDcsCisJMzYxMywzNjE3LDM2MjMsMzYzMSwzNjM3LDM2NDMsMzY1OSwzNjcxLAorCTM2NzMsMzY3NywzNjkxLDM2OTcsMzcwMSwzNzA5LDM3MTksMzcyNywKKwkzNzMzLDM3MzksMzc2MSwzNzY3LDM3NjksMzc3OSwzNzkzLDM3OTcsCisJMzgwMywzODIxLDM4MjMsMzgzMywzODQ3LDM4NTEsMzg1MywzODYzLAorCTM4NzcsMzg4MSwzODg5LDM5MDcsMzkxMSwzOTE3LDM5MTksMzkyMywKKwkzOTI5LDM5MzEsMzk0MywzOTQ3LDM5NjcsMzk4OSw0MDAxLDQwMDMsCisJNDAwNyw0MDEzLDQwMTksNDAyMSw0MDI3LDQwNDksNDA1MSw0MDU3LAorCTQwNzMsNDA3OSw0MDkxLDQwOTMsNDA5OSw0MTExLDQxMjcsNDEyOSwKKwk0MTMzLDQxMzksNDE1Myw0MTU3LDQxNTksNDE3Nyw0MjAxLDQyMTEsCisJNDIxNyw0MjE5LDQyMjksNDIzMSw0MjQxLDQyNDMsNDI1Myw0MjU5LAorCTQyNjEsNDI3MSw0MjczLDQyODMsNDI4OSw0Mjk3LDQzMjcsNDMzNywKKwk0MzM5LDQzNDksNDM1Nyw0MzYzLDQzNzMsNDM5MSw0Mzk3LDQ0MDksCisJNDQyMSw0NDIzLDQ0NDEsNDQ0Nyw0NDUxLDQ0NTcsNDQ2Myw0NDgxLAorCTQ0ODMsNDQ5Myw0NTA3LDQ1MTMsNDUxNyw0NTE5LDQ1MjMsNDU0NywKKwk0NTQ5LDQ1NjEsNDU2Nyw0NTgzLDQ1OTEsNDU5Nyw0NjAzLDQ2MjEsCisJNDYzNyw0NjM5LDQ2NDMsNDY0OSw0NjUxLDQ2NTcsNDY2Myw0NjczLAorCTQ2NzksNDY5MSw0NzAzLDQ3MjEsNDcyMyw0NzI5LDQ3MzMsNDc1MSwKKwk0NzU5LDQ3ODMsNDc4Nyw0Nzg5LDQ3OTMsNDc5OSw0ODAxLDQ4MTMsCisJNDgxNyw0ODMxLDQ4NjEsNDg3MSw0ODc3LDQ4ODksNDkwMyw0OTA5LAorCTQ5MTksNDkzMSw0OTMzLDQ5MzcsNDk0Myw0OTUxLDQ5NTcsNDk2NywKKwk0OTY5LDQ5NzMsNDk4Nyw0OTkzLDQ5OTksNTAwMyw1MDA5LDUwMTEsCisJNTAyMSw1MDIzLDUwMzksNTA1MSw1MDU5LDUwNzcsNTA4MSw1MDg3LAorCTUwOTksNTEwMSw1MTA3LDUxMTMsNTExOSw1MTQ3LDUxNTMsNTE2NywKKwk1MTcxLDUxNzksNTE4OSw1MTk3LDUyMDksNTIyNyw1MjMxLDUyMzMsCisJNTIzNyw1MjYxLDUyNzMsNTI3OSw1MjgxLDUyOTcsNTMwMyw1MzA5LAorCTUzMjMsNTMzMyw1MzQ3LDUzNTEsNTM4MSw1Mzg3LDUzOTMsNTM5OSwKKwk1NDA3LDU0MTMsNTQxNyw1NDE5LDU0MzEsNTQzNyw1NDQxLDU0NDMsCisJNTQ0OSw1NDcxLDU0NzcsNTQ3OSw1NDgzLDU1MDEsNTUwMyw1NTA3LAorCTU1MTksNTUyMSw1NTI3LDU1MzEsNTU1Nyw1NTYzLDU1NjksNTU3MywKKwk1NTgxLDU1OTEsNTYyMyw1NjM5LDU2NDEsNTY0Nyw1NjUxLDU2NTMsCisJNTY1Nyw1NjU5LDU2NjksNTY4Myw1Njg5LDU2OTMsNTcwMSw1NzExLAorCTU3MTcsNTczNyw1NzQxLDU3NDMsNTc0OSw1Nzc5LDU3ODMsNTc5MSwKKwk1ODAxLDU4MDcsNTgxMyw1ODIxLDU4MjcsNTgzOSw1ODQzLDU4NDksCisJNTg1MSw1ODU3LDU4NjEsNTg2Nyw1ODY5LDU4NzksNTg4MSw1ODk3LAorCTU5MDMsNTkyMyw1OTI3LDU5MzksNTk1Myw1OTgxLDU5ODcsNjAwNywKKwk2MDExLDYwMjksNjAzNyw2MDQzLDYwNDcsNjA1Myw2MDY3LDYwNzMsCisJNjA3OSw2MDg5LDYwOTEsNjEwMSw2MTEzLDYxMjEsNjEzMSw2MTMzLAorCTYxNDMsNjE1MSw2MTYzLDYxNzMsNjE5Nyw2MTk5LDYyMDMsNjIxMSwKKwk2MjE3LDYyMjEsNjIyOSw2MjQ3LDYyNTcsNjI2Myw2MjY5LDYyNzEsCisJNjI3Nyw2Mjg3LDYyOTksNjMwMSw2MzExLDYzMTcsNjMyMyw2MzI5LAorCTYzMzcsNjM0Myw2MzUzLDYzNTksNjM2MSw2MzY3LDYzNzMsNjM3OSwKKwk2Mzg5LDYzOTcsNjQyMSw2NDI3LDY0NDksNjQ1MSw2NDY5LDY0NzMsCisJNjQ4MSw2NDkxLDY1MjEsNjUyOSw2NTQ3LDY1NTEsNjU1Myw2NTYzLAorCTY1NjksNjU3MSw2NTc3LDY1ODEsNjU5OSw2NjA3LDY2MTksNjYzNywKKwk2NjUzLDY2NTksNjY2MSw2NjczLDY2NzksNjY4OSw2NjkxLDY3MDEsCisJNjcwMyw2NzA5LDY3MTksNjczMyw2NzM3LDY3NjEsNjc2Myw2Nzc5LAorCTY3ODEsNjc5MSw2NzkzLDY4MDMsNjgyMyw2ODI3LDY4MjksNjgzMywKKwk2ODQxLDY4NTcsNjg2Myw2ODY5LDY4NzEsNjg4Myw2ODk5LDY5MDcsCisJNjkxMSw2OTE3LDY5NDcsNjk0OSw2OTU5LDY5NjEsNjk2Nyw2OTcxLAorCTY5NzcsNjk4Myw2OTkxLDY5OTcsNzAwMSw3MDEzLDcwMTksNzAyNywKKwk3MDM5LDcwNDMsNzA1Nyw3MDY5LDcwNzksNzEwMyw3MTA5LDcxMjEsCisJNzEyNyw3MTI5LDcxNTEsNzE1OSw3MTc3LDcxODcsNzE5Myw3MjA3LAorCTcyMTEsNzIxMyw3MjE5LDcyMjksNzIzNyw3MjQzLDcyNDcsNzI1MywKKwk3MjgzLDcyOTcsNzMwNyw3MzA5LDczMjEsNzMzMSw3MzMzLDczNDksCisJNzM1MSw3MzY5LDczOTMsNzQxMSw3NDE3LDc0MzMsNzQ1MSw3NDU3LAorCTc0NTksNzQ3Nyw3NDgxLDc0ODcsNzQ4OSw3NDk5LDc1MDcsNzUxNywKKwk3NTIzLDc1MjksNzUzNyw3NTQxLDc1NDcsNzU0OSw3NTU5LDc1NjEsCisJNzU3Myw3NTc3LDc1ODMsNzU4OSw3NTkxLDc2MDMsNzYwNyw3NjIxLAorCTc2MzksNzY0Myw3NjQ5LDc2NjksNzY3Myw3NjgxLDc2ODcsNzY5MSwKKwk3Njk5LDc3MDMsNzcxNyw3NzIzLDc3MjcsNzc0MSw3NzUzLDc3NTcsCisJNzc1OSw3Nzg5LDc3OTMsNzgxNyw3ODIzLDc4MjksNzg0MSw3ODUzLAorCTc4NjcsNzg3Myw3ODc3LDc4NzksNzg4Myw3OTAxLDc5MDcsNzkxOSwKKwk3OTI3LDc5MzMsNzkzNyw3OTQ5LDc5NTEsNzk2Myw3OTkzLDgwMDksCisJODAxMSw4MDE3LDgwMzksODA1Myw4MDU5LDgwNjksODA4MSw4MDg3LAorCTgwODksODA5Myw4MTAxLDgxMTEsODExNyw4MTIzLDgxNDcsODE2MSwKKwk4MTY3LDgxNzEsODE3OSw4MTkxLDgyMDksODIxOSw4MjIxLDgyMzEsCisJODIzMyw4MjM3LDgyNDMsODI2Myw4MjY5LDgyNzMsODI4Nyw4MjkxLAorCTgyOTMsODI5Nyw4MzExLDgzMTcsODMyOSw4MzUzLDgzNjMsODM2OSwKKwk4Mzc3LDgzODcsODM4OSw4NDE5LDg0MjMsODQyOSw4NDMxLDg0NDMsCisJODQ0Nyw4NDYxLDg0NjcsODUwMSw4NTEzLDg1MjEsODUyNyw4NTM3LAorCTg1MzksODU0Myw4NTYzLDg1NzMsODU4MSw4NTk3LDg1OTksODYwOSwKKwk4NjIzLDg2MjcsODYyOSw4NjQxLDg2NDcsODY2Myw4NjY5LDg2NzcsCisJODY4MSw4Njg5LDg2OTMsODY5OSw4NzA3LDg3MTMsODcxOSw4NzMxLAorCTg3MzcsODc0MSw4NzQ3LDg3NTMsODc2MSw4Nzc5LDg3ODMsODgwMywKKwk4ODA3LDg4MTksODgyMSw4ODMxLDg4MzcsODgzOSw4ODQ5LDg4NjEsCisJODg2Myw4ODY3LDg4ODcsODg5Myw4OTIzLDg5MjksODkzMyw4OTQxLAorCTg5NTEsODk2Myw4OTY5LDg5NzEsODk5OSw5MDAxLDkwMDcsOTAxMSwKKwk5MDEzLDkwMjksOTA0MSw5MDQzLDkwNDksOTA1OSw5MDY3LDkwOTEsCisJOTEwMyw5MTA5LDkxMjcsOTEzMyw5MTM3LDkxNTEsOTE1Nyw5MTYxLAorCTkxNzMsOTE4MSw5MTg3LDkxOTksOTIwMyw5MjA5LDkyMjEsOTIyNywKKwk5MjM5LDkyNDEsOTI1Nyw5Mjc3LDkyODEsOTI4Myw5MjkzLDkzMTEsCisJOTMxOSw5MzIzLDkzMzcsOTM0MSw5MzQzLDkzNDksOTM3MSw5Mzc3LAorCTkzOTEsOTM5Nyw5NDAzLDk0MTMsOTQxOSw5NDIxLDk0MzEsOTQzMywKKwk5NDM3LDk0MzksOTQ2MSw5NDYzLDk0NjcsOTQ3Myw5NDc5LDk0OTEsCisJOTQ5Nyw5NTExLDk1MjEsOTUzMyw5NTM5LDk1NDcsOTU1MSw5NTg3LAorCTk2MDEsOTYxMyw5NjE5LDk2MjMsOTYyOSw5NjMxLDk2NDMsOTY0OSwKKwk5NjYxLDk2NzcsOTY3OSw5Njg5LDk2OTcsOTcxOSw5NzIxLDk3MzMsCisJOTczOSw5NzQzLDk3NDksOTc2Nyw5NzY5LDk3ODEsOTc4Nyw5NzkxLAorCTk4MDMsOTgxMSw5ODE3LDk4MjksOTgzMyw5ODM5LDk4NTEsOTg1NywKKwk5ODU5LDk4NzEsOTg4Myw5ODg3LDk5MDEsOTkwNyw5OTIzLDk5MjksCisJOTkzMSw5OTQxLDk5NDksOTk2Nyw5OTczLDEwMDA3LDEwMDA5LDEwMDM3LAorCTEwMDM5LDEwMDYxLDEwMDY3LDEwMDY5LDEwMDc5LDEwMDkxLDEwMDkzLDEwMDk5LAorCTEwMTAzLDEwMTExLDEwMTMzLDEwMTM5LDEwMTQxLDEwMTUxLDEwMTU5LDEwMTYzLAorCTEwMTY5LDEwMTc3LDEwMTgxLDEwMTkzLDEwMjExLDEwMjIzLDEwMjQzLDEwMjQ3LAorCTEwMjUzLDEwMjU5LDEwMjY3LDEwMjcxLDEwMjczLDEwMjg5LDEwMzAxLDEwMzAzLAorCTEwMzEzLDEwMzIxLDEwMzMxLDEwMzMzLDEwMzM3LDEwMzQzLDEwMzU3LDEwMzY5LAorCTEwMzkxLDEwMzk5LDEwNDI3LDEwNDI5LDEwNDMzLDEwNDUzLDEwNDU3LDEwNDU5LAorCTEwNDYzLDEwNDc3LDEwNDg3LDEwNDk5LDEwNTAxLDEwNTEzLDEwNTI5LDEwNTMxLAorCTEwNTU5LDEwNTY3LDEwNTg5LDEwNTk3LDEwNjAxLDEwNjA3LDEwNjEzLDEwNjI3LAorCTEwNjMxLDEwNjM5LDEwNjUxLDEwNjU3LDEwNjYzLDEwNjY3LDEwNjg3LDEwNjkxLAorCTEwNzA5LDEwNzExLDEwNzIzLDEwNzI5LDEwNzMzLDEwNzM5LDEwNzUzLDEwNzcxLAorCTEwNzgxLDEwNzg5LDEwNzk5LDEwODMxLDEwODM3LDEwODQ3LDEwODUzLDEwODU5LAorCTEwODYxLDEwODY3LDEwODgzLDEwODg5LDEwODkxLDEwOTAzLDEwOTA5LDEwOTM3LAorCTEwOTM5LDEwOTQ5LDEwOTU3LDEwOTczLDEwOTc5LDEwOTg3LDEwOTkzLDExMDAzLAorCTExMDI3LDExMDQ3LDExMDU3LDExMDU5LDExMDY5LDExMDcxLDExMDgzLDExMDg3LAorCTExMDkzLDExMTEzLDExMTE3LDExMTE5LDExMTMxLDExMTQ5LDExMTU5LDExMTYxLAorCTExMTcxLDExMTczLDExMTc3LDExMTk3LDExMjEzLDExMjM5LDExMjQzLDExMjUxLAorCTExMjU3LDExMjYxLDExMjczLDExMjc5LDExMjg3LDExMjk5LDExMzExLDExMzE3LAorCTExMzIxLDExMzI5LDExMzUxLDExMzUzLDExMzY5LDExMzgzLDExMzkzLDExMzk5LAorCTExNDExLDExNDIzLDExNDM3LDExNDQzLDExNDQ3LDExNDY3LDExNDcxLDExNDgzLAorCTExNDg5LDExNDkxLDExNDk3LDExNTAzLDExNTE5LDExNTI3LDExNTQ5LDExNTUxLAorCTExNTc5LDExNTg3LDExNTkzLDExNTk3LDExNjE3LDExNjIxLDExNjMzLDExNjU3LAorCTExNjc3LDExNjgxLDExNjg5LDExNjk5LDExNzAxLDExNzE3LDExNzE5LDExNzMxLAorCTExNzQzLDExNzc3LDExNzc5LDExNzgzLDExNzg5LDExODAxLDExODA3LDExODEzLAorCTExODIxLDExODI3LDExODMxLDExODMzLDExODM5LDExODYzLDExODY3LDExODg3LAorCTExODk3LDExOTAzLDExOTA5LDExOTIzLDExOTI3LDExOTMzLDExOTM5LDExOTQxLAorCTExOTUzLDExOTU5LDExOTY5LDExOTcxLDExOTgxLDExOTg3LDEyMDA3LDEyMDExLAorCTEyMDM3LDEyMDQxLDEyMDQzLDEyMDQ5LDEyMDcxLDEyMDczLDEyMDk3LDEyMTAxLAorCTEyMTA3LDEyMTA5LDEyMTEzLDEyMTE5LDEyMTQzLDEyMTQ5LDEyMTU3LDEyMTYxLAorCTEyMTYzLDEyMTk3LDEyMjAzLDEyMjExLDEyMjI3LDEyMjM5LDEyMjQxLDEyMjUxLAorCTEyMjUzLDEyMjYzLDEyMjY5LDEyMjc3LDEyMjgxLDEyMjg5LDEyMzAxLDEyMzIzLAorCTEyMzI5LDEyMzQzLDEyMzQ3LDEyMzczLDEyMzc3LDEyMzc5LDEyMzkxLDEyNDAxLAorCTEyNDA5LDEyNDEzLDEyNDIxLDEyNDMzLDEyNDM3LDEyNDUxLDEyNDU3LDEyNDczLAorCTEyNDc5LDEyNDg3LDEyNDkxLDEyNDk3LDEyNTAzLDEyNTExLDEyNTE3LDEyNTI3LAorCTEyNTM5LDEyNTQxLDEyNTQ3LDEyNTUzLDEyNTY5LDEyNTc3LDEyNTgzLDEyNTg5LAorCTEyNjAxLDEyNjExLDEyNjEzLDEyNjE5LDEyNjM3LDEyNjQxLDEyNjQ3LDEyNjUzLAorCTEyNjU5LDEyNjcxLDEyNjg5LDEyNjk3LDEyNzAzLDEyNzEzLDEyNzIxLDEyNzM5LAorCTEyNzQzLDEyNzU3LDEyNzYzLDEyNzgxLDEyNzkxLDEyNzk5LDEyODA5LDEyODIxLAorCTEyODIzLDEyODI5LDEyODQxLDEyODUzLDEyODg5LDEyODkzLDEyODk5LDEyOTA3LAorCTEyOTExLDEyOTE3LDEyOTE5LDEyOTIzLDEyOTQxLDEyOTUzLDEyOTU5LDEyOTY3LAorCTEyOTczLDEyOTc5LDEyOTgzLDEzMDAxLDEzMDAzLDEzMDA3LDEzMDA5LDEzMDMzLAorCTEzMDM3LDEzMDQzLDEzMDQ5LDEzMDYzLDEzMDkzLDEzMDk5LDEzMTAzLDEzMTA5LAorCTEzMTIxLDEzMTI3LDEzMTQ3LDEzMTUxLDEzMTU5LDEzMTYzLDEzMTcxLDEzMTc3LAorCTEzMTgzLDEzMTg3LDEzMjE3LDEzMjE5LDEzMjI5LDEzMjQxLDEzMjQ5LDEzMjU5LAorCTEzMjY3LDEzMjkxLDEzMjk3LDEzMzA5LDEzMzEzLDEzMzI3LDEzMzMxLDEzMzM3LAorCTEzMzM5LDEzMzY3LDEzMzgxLDEzMzk3LDEzMzk5LDEzNDExLDEzNDE3LDEzNDIxLAorCTEzNDQxLDEzNDUxLDEzNDU3LDEzNDYzLDEzNDY5LDEzNDc3LDEzNDg3LDEzNDk5LAorCTEzNTEzLDEzNTIzLDEzNTM3LDEzNTUzLDEzNTY3LDEzNTc3LDEzNTkxLDEzNTk3LAorCTEzNjEzLDEzNjE5LDEzNjI3LDEzNjMzLDEzNjQ5LDEzNjY5LDEzNjc5LDEzNjgxLAorCTEzNjg3LDEzNjkxLDEzNjkzLDEzNjk3LDEzNzA5LDEzNzExLDEzNzIxLDEzNzIzLAorCTEzNzI5LDEzNzUxLDEzNzU3LDEzNzU5LDEzNzYzLDEzNzgxLDEzNzg5LDEzNzk5LAorCTEzODA3LDEzODI5LDEzODMxLDEzODQxLDEzODU5LDEzODczLDEzODc3LDEzODc5LAorCTEzODgzLDEzOTAxLDEzOTAzLDEzOTA3LDEzOTEzLDEzOTIxLDEzOTMxLDEzOTMzLAorCTEzOTYzLDEzOTY3LDEzOTk3LDEzOTk5LDE0MDA5LDE0MDExLDE0MDI5LDE0MDMzLAorCTE0MDUxLDE0MDU3LDE0MDcxLDE0MDgxLDE0MDgzLDE0MDg3LDE0MTA3LDE0MTQzLAorCTE0MTQ5LDE0MTUzLDE0MTU5LDE0MTczLDE0MTc3LDE0MTk3LDE0MjA3LDE0MjIxLAorCTE0MjQzLDE0MjQ5LDE0MjUxLDE0MjgxLDE0MjkzLDE0MzAzLDE0MzIxLDE0MzIzLAorCTE0MzI3LDE0MzQxLDE0MzQ3LDE0MzY5LDE0Mzg3LDE0Mzg5LDE0NDAxLDE0NDA3LAorCTE0NDExLDE0NDE5LDE0NDIzLDE0NDMxLDE0NDM3LDE0NDQ3LDE0NDQ5LDE0NDYxLAorCTE0NDc5LDE0NDg5LDE0NTAzLDE0NTE5LDE0NTMzLDE0NTM3LDE0NTQzLDE0NTQ5LAorCTE0NTUxLDE0NTU3LDE0NTYxLDE0NTYzLDE0NTkxLDE0NTkzLDE0NjIxLDE0NjI3LAorCTE0NjI5LDE0NjMzLDE0NjM5LDE0NjUzLDE0NjU3LDE0NjY5LDE0NjgzLDE0Njk5LAorCTE0NzEzLDE0NzE3LDE0NzIzLDE0NzMxLDE0NzM3LDE0NzQxLDE0NzQ3LDE0NzUzLAorCTE0NzU5LDE0NzY3LDE0NzcxLDE0Nzc5LDE0NzgzLDE0Nzk3LDE0ODEzLDE0ODIxLAorCTE0ODI3LDE0ODMxLDE0ODQzLDE0ODUxLDE0ODY3LDE0ODY5LDE0ODc5LDE0ODg3LAorCTE0ODkxLDE0ODk3LDE0OTIzLDE0OTI5LDE0OTM5LDE0OTQ3LDE0OTUxLDE0OTU3LAorCTE0OTY5LDE0OTgzLDE1MDEzLDE1MDE3LDE1MDMxLDE1MDUzLDE1MDYxLDE1MDczLAorCTE1MDc3LDE1MDgzLDE1MDkxLDE1MTAxLDE1MTA3LDE1MTIxLDE1MTMxLDE1MTM3LAorCTE1MTM5LDE1MTQ5LDE1MTYxLDE1MTczLDE1MTg3LDE1MTkzLDE1MTk5LDE1MjE3LAorCTE1MjI3LDE1MjMzLDE1MjQxLDE1MjU5LDE1MjYzLDE1MjY5LDE1MjcxLDE1Mjc3LAorCTE1Mjg3LDE1Mjg5LDE1Mjk5LDE1MzA3LDE1MzEzLDE1MzE5LDE1MzI5LDE1MzMxLAorCTE1MzQ5LDE1MzU5LDE1MzYxLDE1MzczLDE1Mzc3LDE1MzgzLDE1MzkxLDE1NDAxLAorCTE1NDEzLDE1NDI3LDE1NDM5LDE1NDQzLDE1NDUxLDE1NDYxLDE1NDY3LDE1NDczLAorCTE1NDkzLDE1NDk3LDE1NTExLDE1NTI3LDE1NTQxLDE1NTUxLDE1NTU5LDE1NTY5LAorCTE1NTgxLDE1NTgzLDE1NjAxLDE1NjA3LDE1NjE5LDE1NjI5LDE1NjQxLDE1NjQzLAorCTE1NjQ3LDE1NjQ5LDE1NjYxLDE1NjY3LDE1NjcxLDE1Njc5LDE1NjgzLDE1NzI3LAorCTE1NzMxLDE1NzMzLDE1NzM3LDE1NzM5LDE1NzQ5LDE1NzYxLDE1NzY3LDE1NzczLAorCTE1Nzg3LDE1NzkxLDE1Nzk3LDE1ODAzLDE1ODA5LDE1ODE3LDE1ODIzLDE1ODU5LAorCTE1ODc3LDE1ODgxLDE1ODg3LDE1ODg5LDE1OTAxLDE1OTA3LDE1OTEzLDE1OTE5LAorCTE1OTIzLDE1OTM3LDE1OTU5LDE1OTcxLDE1OTczLDE1OTkxLDE2MDAxLDE2MDA3LAorCTE2MDMzLDE2MDU3LDE2MDYxLDE2MDYzLDE2MDY3LDE2MDY5LDE2MDczLDE2MDg3LAorCTE2MDkxLDE2MDk3LDE2MTAzLDE2MTExLDE2MTI3LDE2MTM5LDE2MTQxLDE2MTgzLAorCTE2MTg3LDE2MTg5LDE2MTkzLDE2MjE3LDE2MjIzLDE2MjI5LDE2MjMxLDE2MjQ5LAorCTE2MjUzLDE2MjY3LDE2MjczLDE2MzAxLDE2MzE5LDE2MzMzLDE2MzM5LDE2MzQ5LAorCTE2MzYxLDE2MzYzLDE2MzY5LDE2MzgxLDE2NDExLDE2NDE3LDE2NDIxLDE2NDI3LAorCTE2NDMzLDE2NDQ3LDE2NDUxLDE2NDUzLDE2NDc3LDE2NDgxLDE2NDg3LDE2NDkzLAorCTE2NTE5LDE2NTI5LDE2NTQ3LDE2NTUzLDE2NTYxLDE2NTY3LDE2NTczLDE2NjAzLAorCTE2NjA3LDE2NjE5LDE2NjMxLDE2NjMzLDE2NjQ5LDE2NjUxLDE2NjU3LDE2NjYxLAorCTE2NjczLDE2NjkxLDE2NjkzLDE2Njk5LDE2NzAzLDE2NzI5LDE2NzQxLDE2NzQ3LAorCTE2NzU5LDE2NzYzLDE2Nzg3LDE2ODExLDE2ODIzLDE2ODI5LDE2ODMxLDE2ODQzLAorCTE2ODcxLDE2ODc5LDE2ODgzLDE2ODg5LDE2OTAxLDE2OTAzLDE2OTIxLDE2OTI3LAorCTE2OTMxLDE2OTM3LDE2OTQzLDE2OTYzLDE2OTc5LDE2OTgxLDE2OTg3LDE2OTkzLAorCTE3MDExLDE3MDIxLDE3MDI3LDE3MDI5LDE3MDMzLDE3MDQxLDE3MDQ3LDE3MDUzLAorCTE3MDc3LDE3MDkzLDE3MDk5LDE3MTA3LDE3MTE3LDE3MTIzLDE3MTM3LDE3MTU5LAorCTE3MTY3LDE3MTgzLDE3MTg5LDE3MTkxLDE3MjAzLDE3MjA3LDE3MjA5LDE3MjMxLAorCTE3MjM5LDE3MjU3LDE3MjkxLDE3MjkzLDE3Mjk5LDE3MzE3LDE3MzIxLDE3MzI3LAorCTE3MzMzLDE3MzQxLDE3MzUxLDE3MzU5LDE3Mzc3LDE3MzgzLDE3Mzg3LDE3Mzg5LAorCTE3MzkzLDE3NDAxLDE3NDE3LDE3NDE5LDE3NDMxLDE3NDQzLDE3NDQ5LDE3NDY3LAorCTE3NDcxLDE3NDc3LDE3NDgzLDE3NDg5LDE3NDkxLDE3NDk3LDE3NTA5LDE3NTE5LAorCTE3NTM5LDE3NTUxLDE3NTY5LDE3NTczLDE3NTc5LDE3NTgxLDE3NTk3LDE3NTk5LAorCTE3NjA5LDE3NjIzLDE3NjI3LDE3NjU3LDE3NjU5LDE3NjY5LDE3NjgxLDE3NjgzLAorCTE3NzA3LDE3NzEzLDE3NzI5LDE3NzM3LDE3NzQ3LDE3NzQ5LDE3NzYxLDE3NzgzLAorCTE3Nzg5LDE3NzkxLDE3ODA3LDE3ODI3LDE3ODM3LDE3ODM5LDE3ODUxLDE3ODYzLAorI2VuZGlmCisJfTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9wcmltZS5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9wcmltZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFmYjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX3ByaW1lLnBsCkBAIC0wLDAgKzEsMTE5IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMgYm5fcHJpbWUucGwKKworJG51bT0yMDQ4OworJG51bT0kQVJHVlswXSBpZiAoJCNBUkdWID49IDApOworCitwdXNoKEBwcmltZXMsMik7CiskcD0xOworbG9vcDogd2hpbGUgKCQjcHJpbWVzIDwgJG51bS0xKQorCXsKKwkkcCs9MjsKKwkkcz1pbnQoc3FydCgkcCkpOworCisJZm9yICgkaT0wOyBkZWZpbmVkKCRwcmltZXNbJGldKSAmJiAkcHJpbWVzWyRpXTw9JHM7ICRpKyspCisJCXsKKwkJbmV4dCBsb29wIGlmICgoJHAlJHByaW1lc1skaV0pID09IDApOworCQl9CisJcHVzaChAcHJpbWVzLCRwKTsKKwl9CisKKyMgcHJpbnQgPDwiRU9GIjsKKyMgLyogQXV0byBnZW5lcmF0ZWQgYnkgYm5fcHJpbWUucGwgKi8KKyMgLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgRXJpYyBZb3VuZyAoZWF5XEBtaW5jb20ub3ouYXUpLgorIyAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyAgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorIyAgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisjICAqIFNlZSB0aGUgQ09QWVJJR0hUIGZpbGUgaW4gdGhlIFNTTGVheSBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyMgICovCisjIAorIyBFT0YKKworcHJpbnQgPDxcRU9GOworLyogQXV0byBnZW5lcmF0ZWQgYnkgYm5fcHJpbWUucGwgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworRU9GCisKK2ZvciAoJGk9MDsgJGkgPD0gJCNwcmltZXM7ICRpKyspCisJeworCWlmICgkcHJpbWVzWyRpXSA+IDI1NikKKwkJeworCQkkZWlnaHQ9JGk7CisJCWxhc3Q7CisJCX0KKwl9CisKK3ByaW50ZiAiI2lmbmRlZiBFSUdIVF9CSVRcbiI7CitwcmludGYgIiNkZWZpbmUgTlVNUFJJTUVTICVkXG4iLCRudW07CitwcmludGYgInR5cGVkZWYgdW5zaWduZWQgc2hvcnQgcHJpbWVfdDtcbiI7CitwcmludGYgIiNlbHNlXG4iOworcHJpbnRmICIjZGVmaW5lIE5VTVBSSU1FUyAlZFxuIiwkZWlnaHQ7CitwcmludGYgInR5cGVkZWYgdW5zaWduZWQgY2hhciBwcmltZV90O1xuIjsKK3ByaW50ZiAiI2VuZGlmXG4iOworcHJpbnQgInN0YXRpYyBjb25zdCBwcmltZV90IHByaW1lc1tOVU1QUklNRVNdPVxuXHR7XG5cdCI7CiskaW5pdD0wOworZm9yICgkaT0wOyAkaSA8PSAkI3ByaW1lczsgJGkrKykKKwl7CisJcHJpbnRmICJcbiNpZm5kZWYgRUlHSFRfQklUXG5cdCIgaWYgKCRwcmltZXNbJGldID4gMjU2KSAmJiAhKCRpbml0KyspOworCXByaW50ZigiXG5cdCIpIGlmICgoJGklOCkgPT0gMCkgJiYgKCRpICE9IDApOworCXByaW50ZigiJTRkLCIsJHByaW1lc1skaV0pOworCX0KK3ByaW50ICJcbiNlbmRpZlxuXHR9O1xuIjsKKworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fcHJpbnQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9wcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmI0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fcHJpbnQuYwpAQCAtMCwwICsxLDM1OSBAQAorLyogY3J5cHRvL2JuL2JuX3ByaW50LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSAiYm5fbGNsLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyIEhleFtdPSIwMTIzNDU2Nzg5QUJDREVGIjsKKworLyogTXVzdCAnT1BFTlNTTF9mcmVlJyB0aGUgcmV0dXJuZWQgZGF0YSAqLworY2hhciAqQk5fYm4yaGV4KGNvbnN0IEJJR05VTSAqYSkKKwl7CisJaW50IGksaix2LHo9MDsKKwljaGFyICpidWY7CisJY2hhciAqcDsKKworCWJ1Zj0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKGEtPnRvcCpCTl9CWVRFUyoyKzIpOworCWlmIChidWYgPT0gTlVMTCkKKwkJeworCQlCTmVycihCTl9GX0JOX0JOMkhFWCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisJcD1idWY7CisJaWYgKGEtPm5lZykgKihwKyspPSctJzsKKwlpZiAoQk5faXNfemVybyhhKSkgKihwKyspPScwJzsKKwlmb3IgKGk9YS0+dG9wLTE7IGkgPj0wOyBpLS0pCisJCXsKKwkJZm9yIChqPUJOX0JJVFMyLTg7IGogPj0gMDsgai09OCkKKwkJCXsKKwkJCS8qIHN0cmlwIGxlYWRpbmcgemVyb3MgKi8KKwkJCXY9KChpbnQpKGEtPmRbaV0+Pihsb25nKWopKSYweGZmOworCQkJaWYgKHogfHwgKHYgIT0gMCkpCisJCQkJeworCQkJCSoocCsrKT1IZXhbdj4+NF07CisJCQkJKihwKyspPUhleFt2JjB4MGZdOworCQkJCXo9MTsKKwkJCQl9CisJCQl9CisJCX0KKwkqcD0nXDAnOworZXJyOgorCXJldHVybihidWYpOworCX0KKworLyogTXVzdCAnT1BFTlNTTF9mcmVlJyB0aGUgcmV0dXJuZWQgZGF0YSAqLworY2hhciAqQk5fYm4yZGVjKGNvbnN0IEJJR05VTSAqYSkKKwl7CisJaW50IGk9MCxudW0sIG9rID0gMDsKKwljaGFyICpidWY9TlVMTDsKKwljaGFyICpwOworCUJJR05VTSAqdD1OVUxMOworCUJOX1VMT05HICpibl9kYXRhPU5VTEwsKmxwOworCisJLyogZ2V0IGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBkZWNpbWFsIGludGVnZXIKKwkgKiBudW0gPD0gKEJOX251bV9iaXRzKGEpICsgMSkgKiBsb2coMikKKwkgKiAgICAgPD0gMyAqIEJOX251bV9iaXRzKGEpICogMC4xMDAxICsgbG9nKDIpICsgMSAgICAgKHJvdW5kaW5nIGVycm9yKQorCSAqICAgICA8PSBCTl9udW1fYml0cyhhKS8xMCArIEJOX251bV9iaXRzLzEwMDAgKyAxICsgMSAKKwkgKi8KKwlpPUJOX251bV9iaXRzKGEpKjM7CisJbnVtPShpLzEwK2kvMTAwMCsxKSsxOworCWJuX2RhdGE9KEJOX1VMT05HICopT1BFTlNTTF9tYWxsb2MoKG51bS9CTl9ERUNfTlVNKzEpKnNpemVvZihCTl9VTE9ORykpOworCWJ1Zj0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKG51bSszKTsKKwlpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAoYm5fZGF0YSA9PSBOVUxMKSkKKwkJeworCQlCTmVycihCTl9GX0JOX0JOMkRFQyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCh0PUJOX2R1cChhKSkgPT0gTlVMTCkgZ290byBlcnI7CisKKyNkZWZpbmUgQlVGX1JFTUFJTiAobnVtKzMgLSAoc2l6ZV90KShwIC0gYnVmKSkKKwlwPWJ1ZjsKKwlscD1ibl9kYXRhOworCWlmIChCTl9pc196ZXJvKHQpKQorCQl7CisJCSoocCsrKT0nMCc7CisJCSoocCsrKT0nXDAnOworCQl9CisJZWxzZQorCQl7CisJCWlmIChCTl9pc19uZWdhdGl2ZSh0KSkKKwkJCSpwKysgPSAnLSc7CisKKwkJaT0wOworCQl3aGlsZSAoIUJOX2lzX3plcm8odCkpCisJCQl7CisJCQkqbHA9Qk5fZGl2X3dvcmQodCxCTl9ERUNfQ09OVik7CisJCQlscCsrOworCQkJfQorCQlscC0tOworCQkvKiBXZSBub3cgaGF2ZSBhIHNlcmllcyBvZiBibG9ja3MsIEJOX0RFQ19OVU0gY2hhcnMKKwkJICogaW4gbGVuZ3RoLCB3aGVyZSB0aGUgbGFzdCBvbmUgbmVlZHMgdHJ1bmNhdGlvbi4KKwkJICogVGhlIGJsb2NrcyBuZWVkIHRvIGJlIHJldmVyc2VkIGluIG9yZGVyLiAqLworCQlCSU9fc25wcmludGYocCxCVUZfUkVNQUlOLEJOX0RFQ19GTVQxLCpscCk7CisJCXdoaWxlICgqcCkgcCsrOworCQl3aGlsZSAobHAgIT0gYm5fZGF0YSkKKwkJCXsKKwkJCWxwLS07CisJCQlCSU9fc25wcmludGYocCxCVUZfUkVNQUlOLEJOX0RFQ19GTVQyLCpscCk7CisJCQl3aGlsZSAoKnApIHArKzsKKwkJCX0KKwkJfQorCW9rID0gMTsKK2VycjoKKwlpZiAoYm5fZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYm5fZGF0YSk7CisJaWYgKHQgIT0gTlVMTCkgQk5fZnJlZSh0KTsKKwlpZiAoIW9rICYmIGJ1ZikKKwkJeworCQlPUEVOU1NMX2ZyZWUoYnVmKTsKKwkJYnVmID0gTlVMTDsKKwkJfQorCisJcmV0dXJuKGJ1Zik7CisJfQorCitpbnQgQk5faGV4MmJuKEJJR05VTSAqKmJuLCBjb25zdCBjaGFyICphKQorCXsKKwlCSUdOVU0gKnJldD1OVUxMOworCUJOX1VMT05HIGw9MDsKKwlpbnQgbmVnPTAsaCxtLGksaixrLGM7CisJaW50IG51bTsKKworCWlmICgoYSA9PSBOVUxMKSB8fCAoKmEgPT0gJ1wwJykpIHJldHVybigwKTsKKworCWlmICgqYSA9PSAnLScpIHsgbmVnPTE7IGErKzsgfQorCisJZm9yIChpPTA7IGlzeGRpZ2l0KCh1bnNpZ25lZCBjaGFyKSBhW2ldKTsgaSsrKQorCQk7CisKKwludW09aStuZWc7CisJaWYgKGJuID09IE5VTEwpIHJldHVybihudW0pOworCisJLyogYSBpcyB0aGUgc3RhcnQgb2YgdGhlIGhleCBkaWdpdHMsIGFuZCBpdCBpcyAnaScgbG9uZyAqLworCWlmICgqYm4gPT0gTlVMTCkKKwkJeworCQlpZiAoKHJldD1CTl9uZXcoKSkgPT0gTlVMTCkgcmV0dXJuKDApOworCQl9CisJZWxzZQorCQl7CisJCXJldD0gKmJuOworCQlCTl96ZXJvKHJldCk7CisJCX0KKworCS8qIGkgaXMgdGhlIG51bWJlciBvZiBoZXggZGlnZXN0czsgKi8KKwlpZiAoYm5fZXhwYW5kKHJldCxpKjQpID09IE5VTEwpIGdvdG8gZXJyOworCisJaj1pOyAvKiBsZWFzdCBzaWduaWZpY2FudCAnaGV4JyAqLworCW09MDsKKwloPTA7CisJd2hpbGUgKGogPiAwKQorCQl7CisJCW09KChCTl9CWVRFUyoyKSA8PSBqKT8oQk5fQllURVMqMik6ajsKKwkJbD0wOworCQlmb3IgKDs7KQorCQkJeworCQkJYz1hW2otbV07CisJCQlpZiAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSBrPWMtJzAnOworCQkJZWxzZSBpZiAoKGMgPj0gJ2EnKSAmJiAoYyA8PSAnZicpKSBrPWMtJ2EnKzEwOworCQkJZWxzZSBpZiAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnRicpKSBrPWMtJ0EnKzEwOworCQkJZWxzZSBrPTA7IC8qIHBhcmFub2lhICovCisJCQlsPShsPDw0KXxrOworCisJCQlpZiAoLS1tIDw9IDApCisJCQkJeworCQkJCXJldC0+ZFtoKytdPWw7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlqLT0oQk5fQllURVMqMik7CisJCX0KKwlyZXQtPnRvcD1oOworCWJuX2NvcnJlY3RfdG9wKHJldCk7CisJcmV0LT5uZWc9bmVnOworCisJKmJuPXJldDsKKwlibl9jaGVja190b3AocmV0KTsKKwlyZXR1cm4obnVtKTsKK2VycjoKKwlpZiAoKmJuID09IE5VTEwpIEJOX2ZyZWUocmV0KTsKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgQk5fZGVjMmJuKEJJR05VTSAqKmJuLCBjb25zdCBjaGFyICphKQorCXsKKwlCSUdOVU0gKnJldD1OVUxMOworCUJOX1VMT05HIGw9MDsKKwlpbnQgbmVnPTAsaSxqOworCWludCBudW07CisKKwlpZiAoKGEgPT0gTlVMTCkgfHwgKCphID09ICdcMCcpKSByZXR1cm4oMCk7CisJaWYgKCphID09ICctJykgeyBuZWc9MTsgYSsrOyB9CisKKwlmb3IgKGk9MDsgaXNkaWdpdCgodW5zaWduZWQgY2hhcikgYVtpXSk7IGkrKykKKwkJOworCisJbnVtPWkrbmVnOworCWlmIChibiA9PSBOVUxMKSByZXR1cm4obnVtKTsKKworCS8qIGEgaXMgdGhlIHN0YXJ0IG9mIHRoZSBkaWdpdHMsIGFuZCBpdCBpcyAnaScgbG9uZy4KKwkgKiBXZSBjaG9wIGl0IGludG8gQk5fREVDX05VTSBkaWdpdHMgYXQgYSB0aW1lICovCisJaWYgKCpibiA9PSBOVUxMKQorCQl7CisJCWlmICgocmV0PUJOX25ldygpKSA9PSBOVUxMKSByZXR1cm4oMCk7CisJCX0KKwllbHNlCisJCXsKKwkJcmV0PSAqYm47CisJCUJOX3plcm8ocmV0KTsKKwkJfQorCisJLyogaSBpcyB0aGUgbnVtYmVyIG9mIGRpZ2VzdHMsIGEgYml0IG9mIGFuIG92ZXIgZXhwYW5kOyAqLworCWlmIChibl9leHBhbmQocmV0LGkqNCkgPT0gTlVMTCkgZ290byBlcnI7CisKKwlqPUJOX0RFQ19OVU0tKGklQk5fREVDX05VTSk7CisJaWYgKGogPT0gQk5fREVDX05VTSkgaj0wOworCWw9MDsKKwl3aGlsZSAoKmEpCisJCXsKKwkJbCo9MTA7CisJCWwrPSAqYS0nMCc7CisJCWErKzsKKwkJaWYgKCsraiA9PSBCTl9ERUNfTlVNKQorCQkJeworCQkJQk5fbXVsX3dvcmQocmV0LEJOX0RFQ19DT05WKTsKKwkJCUJOX2FkZF93b3JkKHJldCxsKTsKKwkJCWw9MDsKKwkJCWo9MDsKKwkJCX0KKwkJfQorCXJldC0+bmVnPW5lZzsKKworCWJuX2NvcnJlY3RfdG9wKHJldCk7CisJKmJuPXJldDsKKwlibl9jaGVja190b3AocmV0KTsKKwlyZXR1cm4obnVtKTsKK2VycjoKKwlpZiAoKmJuID09IE5VTEwpIEJOX2ZyZWUocmV0KTsKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgQk5fYXNjMmJuKEJJR05VTSAqKmJuLCBjb25zdCBjaGFyICphKQorCXsKKwljb25zdCBjaGFyICpwID0gYTsKKwlpZiAoKnAgPT0gJy0nKQorCQlwKys7CisKKwlpZiAocFswXSA9PSAnMCcgJiYgKHBbMV0gPT0gJ1gnIHx8IHBbMV0gPT0gJ3gnKSkKKwkJewkJCisJCWlmICghQk5faGV4MmJuKGJuLCBwICsgMikpCisJCQlyZXR1cm4gMDsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIUJOX2RlYzJibihibiwgcCkpCisJCQlyZXR1cm4gMDsKKwkJfQorCWlmICgqYSA9PSAnLScpCisJCSgqYm4pLT5uZWcgPSAxOworCXJldHVybiAxOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IEJOX3ByaW50X2ZwKEZJTEUgKmZwLCBjb25zdCBCSUdOVU0gKmEpCisJeworCUJJTyAqYjsKKwlpbnQgcmV0OworCisJaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJcmV0dXJuKDApOworCUJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisJcmV0PUJOX3ByaW50KGIsYSk7CisJQklPX2ZyZWUoYik7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKK2ludCBCTl9wcmludChCSU8gKmJwLCBjb25zdCBCSUdOVU0gKmEpCisJeworCWludCBpLGosdix6PTA7CisJaW50IHJldD0wOworCisJaWYgKChhLT5uZWcpICYmIChCSU9fd3JpdGUoYnAsIi0iLDEpICE9IDEpKSBnb3RvIGVuZDsKKwlpZiAoQk5faXNfemVybyhhKSAmJiAoQklPX3dyaXRlKGJwLCIwIiwxKSAhPSAxKSkgZ290byBlbmQ7CisJZm9yIChpPWEtPnRvcC0xOyBpID49MDsgaS0tKQorCQl7CisJCWZvciAoaj1CTl9CSVRTMi00OyBqID49IDA7IGotPTQpCisJCQl7CisJCQkvKiBzdHJpcCBsZWFkaW5nIHplcm9zICovCisJCQl2PSgoaW50KShhLT5kW2ldPj4obG9uZylqKSkmMHgwZjsKKwkJCWlmICh6IHx8ICh2ICE9IDApKQorCQkJCXsKKwkJCQlpZiAoQklPX3dyaXRlKGJwLCYoSGV4W3ZdKSwxKSAhPSAxKQorCQkJCQlnb3RvIGVuZDsKKwkJCQl6PTE7CisJCQkJfQorCQkJfQorCQl9CisJcmV0PTE7CitlbmQ6CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fcmFuZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX3JhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzc2YzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX3JhbmQuYwpAQCAtMCwwICsxLDMwNSBAQAorLyogY3J5cHRvL2JuL2JuX3JhbmQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgImJuX2xjbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCitzdGF0aWMgaW50IGJucmFuZChpbnQgcHNldWRvcmFuZCwgQklHTlVNICpybmQsIGludCBiaXRzLCBpbnQgdG9wLCBpbnQgYm90dG9tKQorCXsKKwl1bnNpZ25lZCBjaGFyICpidWY9TlVMTDsKKwlpbnQgcmV0PTAsYml0LGJ5dGVzLG1hc2s7CisJdGltZV90IHRpbTsKKworCWlmIChiaXRzID09IDApCisJCXsKKwkJQk5femVybyhybmQpOworCQlyZXR1cm4gMTsKKwkJfQorCisJYnl0ZXM9KGJpdHMrNykvODsKKwliaXQ9KGJpdHMtMSklODsKKwltYXNrPTB4ZmY8PChiaXQrMSk7CisKKwlidWY9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhieXRlcyk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQl7CisJCUJOZXJyKEJOX0ZfQk5SQU5ELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIG1ha2UgYSByYW5kb20gbnVtYmVyIGFuZCBzZXQgdGhlIHRvcCBhbmQgYm90dG9tIGJpdHMgKi8KKwl0aW1lKCZ0aW0pOworCVJBTkRfYWRkKCZ0aW0sc2l6ZW9mKHRpbSksMC4wKTsKKworCWlmIChwc2V1ZG9yYW5kKQorCQl7CisJCWlmIChSQU5EX3BzZXVkb19ieXRlcyhidWYsIGJ5dGVzKSA9PSAtMSkKKwkJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmIChSQU5EX2J5dGVzKGJ1ZiwgYnl0ZXMpIDw9IDApCisJCQlnb3RvIGVycjsKKwkJfQorCisjaWYgMQorCWlmIChwc2V1ZG9yYW5kID09IDIpCisJCXsKKwkJLyogZ2VuZXJhdGUgcGF0dGVybnMgdGhhdCBhcmUgbW9yZSBsaWtlbHkgdG8gdHJpZ2dlciBCTgorCQkgICBsaWJyYXJ5IGJ1Z3MgKi8KKwkJaW50IGk7CisJCXVuc2lnbmVkIGNoYXIgYzsKKworCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykKKwkJCXsKKwkJCVJBTkRfcHNldWRvX2J5dGVzKCZjLCAxKTsKKwkJCWlmIChjID49IDEyOCAmJiBpID4gMCkKKwkJCQlidWZbaV0gPSBidWZbaS0xXTsKKwkJCWVsc2UgaWYgKGMgPCA0MikKKwkJCQlidWZbaV0gPSAwOworCQkJZWxzZSBpZiAoYyA8IDg0KQorCQkJCWJ1ZltpXSA9IDI1NTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwlpZiAodG9wICE9IC0xKQorCQl7CisJCWlmICh0b3ApCisJCQl7CisJCQlpZiAoYml0ID09IDApCisJCQkJeworCQkJCWJ1ZlswXT0xOworCQkJCWJ1ZlsxXXw9MHg4MDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWJ1ZlswXXw9KDM8PChiaXQtMSkpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJYnVmWzBdfD0oMTw8Yml0KTsKKwkJCX0KKwkJfQorCWJ1ZlswXSAmPSB+bWFzazsKKwlpZiAoYm90dG9tKSAvKiBzZXQgYm90dG9tIGJpdCBpZiByZXF1ZXN0ZWQgKi8KKwkJYnVmW2J5dGVzLTFdfD0xOworCWlmICghQk5fYmluMmJuKGJ1ZixieXRlcyxybmQpKSBnb3RvIGVycjsKKwlyZXQ9MTsKK2VycjoKKwlpZiAoYnVmICE9IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9jbGVhbnNlKGJ1ZixieXRlcyk7CisJCU9QRU5TU0xfZnJlZShidWYpOworCQl9CisJYm5fY2hlY2tfdG9wKHJuZCk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgICAgIEJOX3JhbmQoQklHTlVNICpybmQsIGludCBiaXRzLCBpbnQgdG9wLCBpbnQgYm90dG9tKQorCXsKKwlyZXR1cm4gYm5yYW5kKDAsIHJuZCwgYml0cywgdG9wLCBib3R0b20pOworCX0KKworaW50ICAgICBCTl9wc2V1ZG9fcmFuZChCSUdOVU0gKnJuZCwgaW50IGJpdHMsIGludCB0b3AsIGludCBib3R0b20pCisJeworCXJldHVybiBibnJhbmQoMSwgcm5kLCBiaXRzLCB0b3AsIGJvdHRvbSk7CisJfQorCisjaWYgMQoraW50ICAgICBCTl9ibnRlc3RfcmFuZChCSUdOVU0gKnJuZCwgaW50IGJpdHMsIGludCB0b3AsIGludCBib3R0b20pCisJeworCXJldHVybiBibnJhbmQoMiwgcm5kLCBiaXRzLCB0b3AsIGJvdHRvbSk7CisJfQorI2VuZGlmCisKKworLyogcmFuZG9tIG51bWJlciByOiAgMCA8PSByIDwgcmFuZ2UgKi8KK3N0YXRpYyBpbnQgYm5fcmFuZF9yYW5nZShpbnQgcHNldWRvLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqcmFuZ2UpCisJeworCWludCAoKmJuX3JhbmQpKEJJR05VTSAqLCBpbnQsIGludCwgaW50KSA9IHBzZXVkbyA/IEJOX3BzZXVkb19yYW5kIDogQk5fcmFuZDsKKwlpbnQgbjsKKwlpbnQgY291bnQgPSAxMDA7CisKKwlpZiAocmFuZ2UtPm5lZyB8fCBCTl9pc196ZXJvKHJhbmdlKSkKKwkJeworCQlCTmVycihCTl9GX0JOX1JBTkRfUkFOR0UsIEJOX1JfSU5WQUxJRF9SQU5HRSk7CisJCXJldHVybiAwOworCQl9CisKKwluID0gQk5fbnVtX2JpdHMocmFuZ2UpOyAvKiBuID4gMCAqLworCisJLyogQk5faXNfYml0X3NldChyYW5nZSwgbiAtIDEpIGFsd2F5cyBob2xkcyAqLworCisJaWYgKG4gPT0gMSkKKwkJQk5femVybyhyKTsKKwllbHNlIGlmICghQk5faXNfYml0X3NldChyYW5nZSwgbiAtIDIpICYmICFCTl9pc19iaXRfc2V0KHJhbmdlLCBuIC0gMykpCisJCXsKKwkJLyogcmFuZ2UgPSAxMDAuLi5fMiwKKwkJICogc28gIDMqcmFuZ2UgKD0gMTEuLi5fMikgIGlzIGV4YWN0bHkgb25lIGJpdCBsb25nZXIgdGhhbiAgcmFuZ2UgKi8KKwkJZG8KKwkJCXsKKwkJCWlmICghYm5fcmFuZChyLCBuICsgMSwgLTEsIDApKSByZXR1cm4gMDsKKwkJCS8qIElmICByIDwgMypyYW5nZSwgIHVzZSAgciA6PSByIE1PRCByYW5nZQorCQkJICogKHdoaWNoIGlzIGVpdGhlciAgciwgciAtIHJhbmdlLCAgb3IgIHIgLSAyKnJhbmdlKS4KKwkJCSAqIE90aGVyd2lzZSwgaXRlcmF0ZSBvbmNlIG1vcmUuCisJCQkgKiBTaW5jZSAgMypyYW5nZSA9IDExLi4uXzIsIGVhY2ggaXRlcmF0aW9uIHN1Y2NlZWRzIHdpdGgKKwkJCSAqIHByb2JhYmlsaXR5ID49IC43NS4gKi8KKwkJCWlmIChCTl9jbXAociAscmFuZ2UpID49IDApCisJCQkJeworCQkJCWlmICghQk5fc3ViKHIsIHIsIHJhbmdlKSkgcmV0dXJuIDA7CisJCQkJaWYgKEJOX2NtcChyLCByYW5nZSkgPj0gMCkKKwkJCQkJaWYgKCFCTl9zdWIociwgciwgcmFuZ2UpKSByZXR1cm4gMDsKKwkJCQl9CisKKwkJCWlmICghLS1jb3VudCkKKwkJCQl7CisJCQkJQk5lcnIoQk5fRl9CTl9SQU5EX1JBTkdFLCBCTl9SX1RPT19NQU5ZX0lURVJBVElPTlMpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQorCQkJfQorCQl3aGlsZSAoQk5fY21wKHIsIHJhbmdlKSA+PSAwKTsKKwkJfQorCWVsc2UKKwkJeworCQlkbworCQkJeworCQkJLyogcmFuZ2UgPSAxMS4uLl8yICBvciAgcmFuZ2UgPSAxMDEuLi5fMiAqLworCQkJaWYgKCFibl9yYW5kKHIsIG4sIC0xLCAwKSkgcmV0dXJuIDA7CisKKwkJCWlmICghLS1jb3VudCkKKwkJCQl7CisJCQkJQk5lcnIoQk5fRl9CTl9SQU5EX1JBTkdFLCBCTl9SX1RPT19NQU5ZX0lURVJBVElPTlMpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJd2hpbGUgKEJOX2NtcChyLCByYW5nZSkgPj0gMCk7CisJCX0KKworCWJuX2NoZWNrX3RvcChyKTsKKwlyZXR1cm4gMTsKKwl9CisKKworaW50CUJOX3JhbmRfcmFuZ2UoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKnJhbmdlKQorCXsKKwlyZXR1cm4gYm5fcmFuZF9yYW5nZSgwLCByLCByYW5nZSk7CisJfQorCitpbnQJQk5fcHNldWRvX3JhbmRfcmFuZ2UoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKnJhbmdlKQorCXsKKwlyZXR1cm4gYm5fcmFuZF9yYW5nZSgxLCByLCByYW5nZSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX3JlY3AuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9yZWNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4ZWZiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9yZWNwLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qIGNyeXB0by9ibi9ibl9yZWNwLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKwordm9pZCBCTl9SRUNQX0NUWF9pbml0KEJOX1JFQ1BfQ1RYICpyZWNwKQorCXsKKwlCTl9pbml0KCYocmVjcC0+TikpOworCUJOX2luaXQoJihyZWNwLT5OcikpOworCXJlY3AtPm51bV9iaXRzPTA7CisJcmVjcC0+ZmxhZ3M9MDsKKwl9CisKK0JOX1JFQ1BfQ1RYICpCTl9SRUNQX0NUWF9uZXcodm9pZCkKKwl7CisJQk5fUkVDUF9DVFggKnJldDsKKworCWlmICgocmV0PShCTl9SRUNQX0NUWCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCTl9SRUNQX0NUWCkpKSA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisKKwlCTl9SRUNQX0NUWF9pbml0KHJldCk7CisJcmV0LT5mbGFncz1CTl9GTEdfTUFMTE9DRUQ7CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIEJOX1JFQ1BfQ1RYX2ZyZWUoQk5fUkVDUF9DVFggKnJlY3ApCisJeworCWlmKHJlY3AgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCisJQk5fZnJlZSgmKHJlY3AtPk4pKTsKKwlCTl9mcmVlKCYocmVjcC0+TnIpKTsKKwlpZiAocmVjcC0+ZmxhZ3MgJiBCTl9GTEdfTUFMTE9DRUQpCisJCU9QRU5TU0xfZnJlZShyZWNwKTsKKwl9CisKK2ludCBCTl9SRUNQX0NUWF9zZXQoQk5fUkVDUF9DVFggKnJlY3AsIGNvbnN0IEJJR05VTSAqZCwgQk5fQ1RYICpjdHgpCisJeworCWlmICghQk5fY29weSgmKHJlY3AtPk4pLGQpKSByZXR1cm4gMDsKKwlCTl96ZXJvKCYocmVjcC0+TnIpKTsKKwlyZWNwLT5udW1fYml0cz1CTl9udW1fYml0cyhkKTsKKwlyZWNwLT5zaGlmdD0wOworCXJldHVybigxKTsKKwl9CisKK2ludCBCTl9tb2RfbXVsX3JlY2lwcm9jYWwoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwKKwlCTl9SRUNQX0NUWCAqcmVjcCwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQ9MDsKKwlCSUdOVU0gKmE7CisJY29uc3QgQklHTlVNICpjYTsKKworCUJOX0NUWF9zdGFydChjdHgpOworCWlmICgoYSA9IEJOX0NUWF9nZXQoY3R4KSkgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKHkgIT0gTlVMTCkKKwkJeworCQlpZiAoeCA9PSB5KQorCQkJeyBpZiAoIUJOX3NxcihhLHgsY3R4KSkgZ290byBlcnI7IH0KKwkJZWxzZQorCQkJeyBpZiAoIUJOX211bChhLHgseSxjdHgpKSBnb3RvIGVycjsgfQorCQljYSA9IGE7CisJCX0KKwllbHNlCisJCWNhPXg7IC8qIEp1c3QgZG8gdGhlIG1vZCAqLworCisJcmV0ID0gQk5fZGl2X3JlY3AoTlVMTCxyLGNhLHJlY3AsY3R4KTsKK2VycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJYm5fY2hlY2tfdG9wKHIpOworCXJldHVybihyZXQpOworCX0KKworaW50IEJOX2Rpdl9yZWNwKEJJR05VTSAqZHYsIEJJR05VTSAqcmVtLCBjb25zdCBCSUdOVU0gKm0sCisJQk5fUkVDUF9DVFggKnJlY3AsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgaSxqLHJldD0wOworCUJJR05VTSAqYSwqYiwqZCwqcjsKKworCUJOX0NUWF9zdGFydChjdHgpOworCWE9Qk5fQ1RYX2dldChjdHgpOworCWI9Qk5fQ1RYX2dldChjdHgpOworCWlmIChkdiAhPSBOVUxMKQorCQlkPWR2OworCWVsc2UKKwkJZD1CTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHJlbSAhPSBOVUxMKQorCQlyPXJlbTsKKwllbHNlCisJCXI9Qk5fQ1RYX2dldChjdHgpOworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMIHx8IGQgPT0gTlVMTCB8fCByID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKEJOX3VjbXAobSwmKHJlY3AtPk4pKSA8IDApCisJCXsKKwkJQk5femVybyhkKTsKKwkJaWYgKCFCTl9jb3B5KHIsbSkpIHJldHVybiAwOworCQlCTl9DVFhfZW5kKGN0eCk7CisJCXJldHVybigxKTsKKwkJfQorCisJLyogV2Ugd2FudCB0aGUgcmVtYWluZGVyCisJICogR2l2ZW4gaW5wdXQgb2YgQUJDREVGIC8gYWIKKwkgKiB3ZSBuZWVkIG11bHRpcGx5IEFCQ0RFRiBieSAzIGRpZ2VzdHMgb2YgdGhlIHJlY2lwcm9jYWwgb2YgYWIKKwkgKgorCSAqLworCisJLyogaSA6PSBtYXgoQk5fbnVtX2JpdHMobSksIDIqQk5fbnVtX2JpdHMoTikpICovCisJaT1CTl9udW1fYml0cyhtKTsKKwlqPXJlY3AtPm51bV9iaXRzPDwxOworCWlmIChqPmkpIGk9ajsKKworCS8qIE5yIDo9IHJvdW5kKDJeaSAvIE4pICovCisJaWYgKGkgIT0gcmVjcC0+c2hpZnQpCisJCXJlY3AtPnNoaWZ0PUJOX3JlY2lwcm9jYWwoJihyZWNwLT5OciksJihyZWNwLT5OKSwKKwkJCWksY3R4KTsgLyogQk5fcmVjaXByb2NhbCByZXR1cm5zIGksIG9yIC0xIGZvciBhbiBlcnJvciAqLworCWlmIChyZWNwLT5zaGlmdCA9PSAtMSkgZ290byBlcnI7CisKKwkvKiBkIDo9IHxyb3VuZChyb3VuZChtIC8gMl5CTl9udW1fYml0cyhOKSkgKiByZWNwLT5OciAvIDJeKGkgLSBCTl9udW1fYml0cyhOKSkpfAorCSAqICAgID0gfHJvdW5kKHJvdW5kKG0gLyAyXkJOX251bV9iaXRzKE4pKSAqIHJvdW5kKDJeaSAvIE4pIC8gMl4oaSAtIEJOX251bV9iaXRzKE4pKSl8CisJICogICA8PSB8KG0gLyAyXkJOX251bV9iaXRzKE4pKSAqICgyXmkgLyBOKSAqICgyXkJOX251bV9iaXRzKE4pIC8gMl5pKXwKKwkgKiAgICA9IHxtL058CisJICovCisJaWYgKCFCTl9yc2hpZnQoYSxtLHJlY3AtPm51bV9iaXRzKSkgZ290byBlcnI7CisJaWYgKCFCTl9tdWwoYixhLCYocmVjcC0+TnIpLGN0eCkpIGdvdG8gZXJyOworCWlmICghQk5fcnNoaWZ0KGQsYixpLXJlY3AtPm51bV9iaXRzKSkgZ290byBlcnI7CisJZC0+bmVnPTA7CisKKwlpZiAoIUJOX211bChiLCYocmVjcC0+TiksZCxjdHgpKSBnb3RvIGVycjsKKwlpZiAoIUJOX3VzdWIocixtLGIpKSBnb3RvIGVycjsKKwlyLT5uZWc9MDsKKworI2lmIDEKKwlqPTA7CisJd2hpbGUgKEJOX3VjbXAociwmKHJlY3AtPk4pKSA+PSAwKQorCQl7CisJCWlmIChqKysgPiAyKQorCQkJeworCQkJQk5lcnIoQk5fRl9CTl9ESVZfUkVDUCxCTl9SX0JBRF9SRUNJUFJPQ0FMKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoIUJOX3VzdWIocixyLCYocmVjcC0+TikpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9hZGRfd29yZChkLDEpKSBnb3RvIGVycjsKKwkJfQorI2VuZGlmCisKKwlyLT5uZWc9Qk5faXNfemVybyhyKT8wOm0tPm5lZzsKKwlkLT5uZWc9bS0+bmVnXnJlY3AtPk4ubmVnOworCXJldD0xOworZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlibl9jaGVja190b3AoZHYpOworCWJuX2NoZWNrX3RvcChyZW0pOworCXJldHVybihyZXQpOworCX0gCisKKy8qIGxlbiBpcyB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgcmVzdWx0CisgKiBXZSBhY3R1YWxseSBjYWxjdWxhdGUgd2l0aCBhbiBleHRyYSB3b3JkIG9mIHByZWNpc2lvbiwgc28KKyAqIHdlIGNhbiBkbyBmYXN0ZXIgZGl2aXNpb24gaWYgdGhlIHJlbWFpbmRlciBpcyBub3QgcmVxdWlyZWQuCisgKi8KKy8qIHIgOj0gMl5sZW4gLyBtICovCitpbnQgQk5fcmVjaXByb2NhbChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqbSwgaW50IGxlbiwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQ9IC0xOworCUJJR05VTSAqdDsKKworCUJOX0NUWF9zdGFydChjdHgpOworCWlmKCh0ID0gQk5fQ1RYX2dldChjdHgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICghQk5fc2V0X2JpdCh0LGxlbikpIGdvdG8gZXJyOworCisJaWYgKCFCTl9kaXYocixOVUxMLHQsbSxjdHgpKSBnb3RvIGVycjsKKworCXJldD1sZW47CitlcnI6CisJYm5fY2hlY2tfdG9wKHIpOworCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fc2hpZnQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9zaGlmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDMwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fc2hpZnQuYwpAQCAtMCwwICsxLDIyMCBAQAorLyogY3J5cHRvL2JuL2JuX3NoaWZ0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworaW50IEJOX2xzaGlmdDEoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEpCisJeworCXJlZ2lzdGVyIEJOX1VMT05HICphcCwqcnAsdCxjOworCWludCBpOworCisJYm5fY2hlY2tfdG9wKHIpOworCWJuX2NoZWNrX3RvcChhKTsKKworCWlmIChyICE9IGEpCisJCXsKKwkJci0+bmVnPWEtPm5lZzsKKwkJaWYgKGJuX3dleHBhbmQocixhLT50b3ArMSkgPT0gTlVMTCkgcmV0dXJuKDApOworCQlyLT50b3A9YS0+dG9wOworCQl9CisJZWxzZQorCQl7CisJCWlmIChibl93ZXhwYW5kKHIsYS0+dG9wKzEpID09IE5VTEwpIHJldHVybigwKTsKKwkJfQorCWFwPWEtPmQ7CisJcnA9ci0+ZDsKKwljPTA7CisJZm9yIChpPTA7IGk8YS0+dG9wOyBpKyspCisJCXsKKwkJdD0gKihhcCsrKTsKKwkJKihycCsrKT0oKHQ8PDEpfGMpJkJOX01BU0syOworCQljPSh0ICYgQk5fVEJJVCk/MTowOworCQl9CisJaWYgKGMpCisJCXsKKwkJKnJwPTE7CisJCXItPnRvcCsrOworCQl9CisJYm5fY2hlY2tfdG9wKHIpOworCXJldHVybigxKTsKKwl9CisKK2ludCBCTl9yc2hpZnQxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphKQorCXsKKwlCTl9VTE9ORyAqYXAsKnJwLHQsYzsKKwlpbnQgaTsKKworCWJuX2NoZWNrX3RvcChyKTsKKwlibl9jaGVja190b3AoYSk7CisKKwlpZiAoQk5faXNfemVybyhhKSkKKwkJeworCQlCTl96ZXJvKHIpOworCQlyZXR1cm4oMSk7CisJCX0KKwlpZiAoYSAhPSByKQorCQl7CisJCWlmIChibl93ZXhwYW5kKHIsYS0+dG9wKSA9PSBOVUxMKSByZXR1cm4oMCk7CisJCXItPnRvcD1hLT50b3A7CisJCXItPm5lZz1hLT5uZWc7CisJCX0KKwlhcD1hLT5kOworCXJwPXItPmQ7CisJYz0wOworCWZvciAoaT1hLT50b3AtMTsgaT49MDsgaS0tKQorCQl7CisJCXQ9YXBbaV07CisJCXJwW2ldPSgodD4+MSkmQk5fTUFTSzIpfGM7CisJCWM9KHQmMSk/Qk5fVEJJVDowOworCQl9CisJYm5fY29ycmVjdF90b3Aocik7CisJYm5fY2hlY2tfdG9wKHIpOworCXJldHVybigxKTsKKwl9CisKK2ludCBCTl9sc2hpZnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGludCBuKQorCXsKKwlpbnQgaSxudyxsYixyYjsKKwlCTl9VTE9ORyAqdCwqZjsKKwlCTl9VTE9ORyBsOworCisJYm5fY2hlY2tfdG9wKHIpOworCWJuX2NoZWNrX3RvcChhKTsKKworCXItPm5lZz1hLT5uZWc7CisJbnc9bi9CTl9CSVRTMjsKKwlpZiAoYm5fd2V4cGFuZChyLGEtPnRvcCtudysxKSA9PSBOVUxMKSByZXR1cm4oMCk7CisJbGI9biVCTl9CSVRTMjsKKwlyYj1CTl9CSVRTMi1sYjsKKwlmPWEtPmQ7CisJdD1yLT5kOworCXRbYS0+dG9wK253XT0wOworCWlmIChsYiA9PSAwKQorCQlmb3IgKGk9YS0+dG9wLTE7IGk+PTA7IGktLSkKKwkJCXRbbncraV09ZltpXTsKKwllbHNlCisJCWZvciAoaT1hLT50b3AtMTsgaT49MDsgaS0tKQorCQkJeworCQkJbD1mW2ldOworCQkJdFtudytpKzFdfD0obD4+cmIpJkJOX01BU0syOworCQkJdFtudytpXT0obDw8bGIpJkJOX01BU0syOworCQkJfQorCW1lbXNldCh0LDAsbncqc2l6ZW9mKHRbMF0pKTsKKy8qCWZvciAoaT0wOyBpPG53OyBpKyspCisJCXRbaV09MDsqLworCXItPnRvcD1hLT50b3ArbncrMTsKKwlibl9jb3JyZWN0X3RvcChyKTsKKwlibl9jaGVja190b3Aocik7CisJcmV0dXJuKDEpOworCX0KKworaW50IEJOX3JzaGlmdChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgaW50IG4pCisJeworCWludCBpLGosbncsbGIscmI7CisJQk5fVUxPTkcgKnQsKmY7CisJQk5fVUxPTkcgbCx0bXA7CisKKwlibl9jaGVja190b3Aocik7CisJYm5fY2hlY2tfdG9wKGEpOworCisJbnc9bi9CTl9CSVRTMjsKKwlyYj1uJUJOX0JJVFMyOworCWxiPUJOX0JJVFMyLXJiOworCWlmIChudyA+PSBhLT50b3AgfHwgYS0+dG9wID09IDApCisJCXsKKwkJQk5femVybyhyKTsKKwkJcmV0dXJuKDEpOworCQl9CisJaWYgKHIgIT0gYSkKKwkJeworCQlyLT5uZWc9YS0+bmVnOworCQlpZiAoYm5fd2V4cGFuZChyLGEtPnRvcC1udysxKSA9PSBOVUxMKSByZXR1cm4oMCk7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKG4gPT0gMCkKKwkJCXJldHVybiAxOyAvKiBvciB0aGUgY29weWluZyBsb29wIHdpbGwgZ28gYmVyc2VyayAqLworCQl9CisKKwlmPSAmKGEtPmRbbnddKTsKKwl0PXItPmQ7CisJaj1hLT50b3Atbnc7CisJci0+dG9wPWo7CisKKwlpZiAocmIgPT0gMCkKKwkJeworCQlmb3IgKGk9ajsgaSAhPSAwOyBpLS0pCisJCQkqKHQrKyk9ICooZisrKTsKKwkJfQorCWVsc2UKKwkJeworCQlsPSAqKGYrKyk7CisJCWZvciAoaT1qLTE7IGkgIT0gMDsgaS0tKQorCQkJeworCQkJdG1wID0obD4+cmIpJkJOX01BU0syOworCQkJbD0gKihmKyspOworCQkJKih0KyspID0odG1wfChsPDxsYikpJkJOX01BU0syOworCQkJfQorCQkqKHQrKykgPShsPj5yYikmQk5fTUFTSzI7CisJCX0KKwlibl9jb3JyZWN0X3RvcChyKTsKKwlibl9jaGVja190b3Aocik7CisJcmV0dXJuKDEpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9zcXIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl9zcXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBkMGNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX3Nxci5jCkBAIC0wLDAgKzEsMjk0IEBACisvKiBjcnlwdG8vYm4vYm5fc3FyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworLyogciBtdXN0IG5vdCBiZSBhICovCisvKiBJJ3ZlIGp1c3QgZ29uZSBvdmVyIHRoaXMgYW5kIGl0IGlzIG5vdyAlMjAgZmFzdGVyIG9uIHg4NiAtIGVheSAtIDI3IEp1biA5NiAqLworaW50IEJOX3NxcihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICpjdHgpCisJeworCWludCBtYXgsYWw7CisJaW50IHJldCA9IDA7CisJQklHTlVNICp0bXAsKnJyOworCisjaWZkZWYgQk5fQ09VTlQKKwlmcHJpbnRmKHN0ZGVyciwiQk5fc3FyICVkICogJWRcbiIsYS0+dG9wLGEtPnRvcCk7CisjZW5kaWYKKwlibl9jaGVja190b3AoYSk7CisKKwlhbD1hLT50b3A7CisJaWYgKGFsIDw9IDApCisJCXsKKwkJci0+dG9wPTA7CisJCXJldHVybiAxOworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlycj0oYSAhPSByKSA/IHIgOiBCTl9DVFhfZ2V0KGN0eCk7CisJdG1wPUJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoIXJyIHx8ICF0bXApIGdvdG8gZXJyOworCisJbWF4ID0gMiAqIGFsOyAvKiBOb24temVybyAoZnJvbSBhYm92ZSkgKi8KKwlpZiAoYm5fd2V4cGFuZChycixtYXgpID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKGFsID09IDQpCisJCXsKKyNpZm5kZWYgQk5fU1FSX0NPTUJBCisJCUJOX1VMT05HIHRbOF07CisJCWJuX3Nxcl9ub3JtYWwocnItPmQsYS0+ZCw0LHQpOworI2Vsc2UKKwkJYm5fc3FyX2NvbWJhNChyci0+ZCxhLT5kKTsKKyNlbmRpZgorCQl9CisJZWxzZSBpZiAoYWwgPT0gOCkKKwkJeworI2lmbmRlZiBCTl9TUVJfQ09NQkEKKwkJQk5fVUxPTkcgdFsxNl07CisJCWJuX3Nxcl9ub3JtYWwocnItPmQsYS0+ZCw4LHQpOworI2Vsc2UKKwkJYm5fc3FyX2NvbWJhOChyci0+ZCxhLT5kKTsKKyNlbmRpZgorCQl9CisJZWxzZSAKKwkJeworI2lmIGRlZmluZWQoQk5fUkVDVVJTSU9OKQorCQlpZiAoYWwgPCBCTl9TUVJfUkVDVVJTSVZFX1NJWkVfTk9STUFMKQorCQkJeworCQkJQk5fVUxPTkcgdFtCTl9TUVJfUkVDVVJTSVZFX1NJWkVfTk9STUFMKjJdOworCQkJYm5fc3FyX25vcm1hbChyci0+ZCxhLT5kLGFsLHQpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpbnQgaixrOworCisJCQlqPUJOX251bV9iaXRzX3dvcmQoKEJOX1VMT05HKWFsKTsKKwkJCWo9MTw8KGotMSk7CisJCQlrPWorajsKKwkJCWlmIChhbCA9PSBqKQorCQkJCXsKKwkJCQlpZiAoYm5fd2V4cGFuZCh0bXAsayoyKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJCQlibl9zcXJfcmVjdXJzaXZlKHJyLT5kLGEtPmQsYWwsdG1wLT5kKTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWlmIChibl93ZXhwYW5kKHRtcCxtYXgpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWJuX3Nxcl9ub3JtYWwocnItPmQsYS0+ZCxhbCx0bXAtPmQpOworCQkJCX0KKwkJCX0KKyNlbHNlCisJCWlmIChibl93ZXhwYW5kKHRtcCxtYXgpID09IE5VTEwpIGdvdG8gZXJyOworCQlibl9zcXJfbm9ybWFsKHJyLT5kLGEtPmQsYWwsdG1wLT5kKTsKKyNlbmRpZgorCQl9CisKKwlyci0+bmVnPTA7CisJLyogSWYgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgaGFsZiBvZiB0aGUgdG9wIHdvcmQgb2YgJ2EnIGlzIHplcm8sIHRoZW4KKwkgKiB0aGUgc3F1YXJlIG9mICdhJyB3aWxsIG1heC0xIHdvcmRzLiAqLworCWlmKGEtPmRbYWwgLSAxXSA9PSAoYS0+ZFthbCAtIDFdICYgQk5fTUFTSzJsKSkKKwkJcnItPnRvcCA9IG1heCAtIDE7CisJZWxzZQorCQlyci0+dG9wID0gbWF4OworCWlmIChyciAhPSByKSBCTl9jb3B5KHIscnIpOworCXJldCA9IDE7CisgZXJyOgorCWJuX2NoZWNrX3RvcChycik7CisJYm5fY2hlY2tfdG9wKHRtcCk7CisJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybihyZXQpOworCX0KKworLyogdG1wIG11c3QgaGF2ZSAyKm4gd29yZHMgKi8KK3ZvaWQgYm5fc3FyX25vcm1hbChCTl9VTE9ORyAqciwgY29uc3QgQk5fVUxPTkcgKmEsIGludCBuLCBCTl9VTE9ORyAqdG1wKQorCXsKKwlpbnQgaSxqLG1heDsKKwljb25zdCBCTl9VTE9ORyAqYXA7CisJQk5fVUxPTkcgKnJwOworCisJbWF4PW4qMjsKKwlhcD1hOworCXJwPXI7CisJcnBbMF09cnBbbWF4LTFdPTA7CisJcnArKzsKKwlqPW47CisKKwlpZiAoLS1qID4gMCkKKwkJeworCQlhcCsrOworCQlycFtqXT1ibl9tdWxfd29yZHMocnAsYXAsaixhcFstMV0pOworCQlycCs9MjsKKwkJfQorCisJZm9yIChpPW4tMjsgaT4wOyBpLS0pCisJCXsKKwkJai0tOworCQlhcCsrOworCQlycFtqXT1ibl9tdWxfYWRkX3dvcmRzKHJwLGFwLGosYXBbLTFdKTsKKwkJcnArPTI7CisJCX0KKworCWJuX2FkZF93b3JkcyhyLHIscixtYXgpOworCisJLyogVGhlcmUgd2lsbCBub3QgYmUgYSBjYXJyeSAqLworCisJYm5fc3FyX3dvcmRzKHRtcCxhLG4pOworCisJYm5fYWRkX3dvcmRzKHIscix0bXAsbWF4KTsKKwl9CisKKyNpZmRlZiBCTl9SRUNVUlNJT04KKy8qIHIgaXMgMipuIHdvcmRzIGluIHNpemUsCisgKiBhIGFuZCBiIGFyZSBib3RoIG4gd29yZHMgaW4gc2l6ZS4gICAgKFRoZXJlJ3Mgbm90IGFjdHVhbGx5IGEgJ2InIGhlcmUgLi4uKQorICogbiBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KKyAqIFdlIG11bHRpcGx5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAqIHQgbXVzdCBiZSAyKm4gd29yZHMgaW4gc2l6ZQorICogV2UgY2FsY3VsYXRlCisgKiBhWzBdKmJbMF0KKyAqIGFbMF0qYlswXSthWzFdKmJbMV0rKGFbMF0tYVsxXSkqKGJbMV0tYlswXSkKKyAqIGFbMV0qYlsxXQorICovCit2b2lkIGJuX3Nxcl9yZWN1cnNpdmUoQk5fVUxPTkcgKnIsIGNvbnN0IEJOX1VMT05HICphLCBpbnQgbjIsIEJOX1VMT05HICp0KQorCXsKKwlpbnQgbj1uMi8yOworCWludCB6ZXJvLGMxOworCUJOX1VMT05HIGxuLGxvLCpwOworCisjaWZkZWYgQk5fQ09VTlQKKwlmcHJpbnRmKHN0ZGVyciwiIGJuX3Nxcl9yZWN1cnNpdmUgJWQgKiAlZFxuIixuMixuMik7CisjZW5kaWYKKwlpZiAobjIgPT0gNCkKKwkJeworI2lmbmRlZiBCTl9TUVJfQ09NQkEKKwkJYm5fc3FyX25vcm1hbChyLGEsNCx0KTsKKyNlbHNlCisJCWJuX3Nxcl9jb21iYTQocixhKTsKKyNlbmRpZgorCQlyZXR1cm47CisJCX0KKwllbHNlIGlmIChuMiA9PSA4KQorCQl7CisjaWZuZGVmIEJOX1NRUl9DT01CQQorCQlibl9zcXJfbm9ybWFsKHIsYSw4LHQpOworI2Vsc2UKKwkJYm5fc3FyX2NvbWJhOChyLGEpOworI2VuZGlmCisJCXJldHVybjsKKwkJfQorCWlmIChuMiA8IEJOX1NRUl9SRUNVUlNJVkVfU0laRV9OT1JNQUwpCisJCXsKKwkJYm5fc3FyX25vcm1hbChyLGEsbjIsdCk7CisJCXJldHVybjsKKwkJfQorCS8qIHI9KGFbMF0tYVsxXSkqKGFbMV0tYVswXSkgKi8KKwljMT1ibl9jbXBfd29yZHMoYSwmKGFbbl0pLG4pOworCXplcm89MDsKKwlpZiAoYzEgPiAwKQorCQlibl9zdWJfd29yZHModCxhLCYoYVtuXSksbik7CisJZWxzZSBpZiAoYzEgPCAwKQorCQlibl9zdWJfd29yZHModCwmKGFbbl0pLGEsbik7CisJZWxzZQorCQl6ZXJvPTE7CisKKwkvKiBUaGUgcmVzdWx0IHdpbGwgYWx3YXlzIGJlIG5lZ2F0aXZlIHVubGVzcyBpdCBpcyB6ZXJvICovCisJcD0gJih0W24yKjJdKTsKKworCWlmICghemVybykKKwkJYm5fc3FyX3JlY3Vyc2l2ZSgmKHRbbjJdKSx0LG4scCk7CisJZWxzZQorCQltZW1zZXQoJih0W24yXSksMCxuMipzaXplb2YoQk5fVUxPTkcpKTsKKwlibl9zcXJfcmVjdXJzaXZlKHIsYSxuLHApOworCWJuX3Nxcl9yZWN1cnNpdmUoJihyW24yXSksJihhW25dKSxuLHApOworCisJLyogdFszMl0gaG9sZHMgKGFbMF0tYVsxXSkqKGFbMV0tYVswXSksIGl0IGlzIG5lZ2F0aXZlIG9yIHplcm8KKwkgKiByWzEwXSBob2xkcyAoYVswXSpiWzBdKQorCSAqIHJbMzJdIGhvbGRzIChiWzFdKmJbMV0pCisJICovCisKKwljMT0oaW50KShibl9hZGRfd29yZHModCxyLCYocltuMl0pLG4yKSk7CisKKwkvKiB0WzMyXSBpcyBuZWdhdGl2ZSAqLworCWMxLT0oaW50KShibl9zdWJfd29yZHMoJih0W24yXSksdCwmKHRbbjJdKSxuMikpOworCisJLyogdFszMl0gaG9sZHMgKGFbMF0tYVsxXSkqKGFbMV0tYVswXSkrKGFbMF0qYVswXSkrKGFbMV0qYVsxXSkKKwkgKiByWzEwXSBob2xkcyAoYVswXSphWzBdKQorCSAqIHJbMzJdIGhvbGRzIChhWzFdKmFbMV0pCisJICogYzEgaG9sZHMgdGhlIGNhcnJ5IGJpdHMKKwkgKi8KKwljMSs9KGludCkoYm5fYWRkX3dvcmRzKCYocltuXSksJihyW25dKSwmKHRbbjJdKSxuMikpOworCWlmIChjMSkKKwkJeworCQlwPSAmKHJbbituMl0pOworCQlsbz0gKnA7CisJCWxuPShsbytjMSkmQk5fTUFTSzI7CisJCSpwPWxuOworCisJCS8qIFRoZSBvdmVyZmxvdyB3aWxsIHN0b3AgYmVmb3JlIHdlIG92ZXIgd3JpdGUKKwkJICogd29yZHMgd2Ugc2hvdWxkIG5vdCBvdmVyd3JpdGUgKi8KKwkJaWYgKGxuIDwgKEJOX1VMT05HKWMxKQorCQkJeworCQkJZG8JeworCQkJCXArKzsKKwkJCQlsbz0gKnA7CisJCQkJbG49KGxvKzEpJkJOX01BU0syOworCQkJCSpwPWxuOworCQkJCX0gd2hpbGUgKGxuID09IDApOworCQkJfQorCQl9CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5fc3FydC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX3NxcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmVhZjllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX3NxcnQuYwpAQCAtMCwwICsxLDM5MyBAQAorLyogY3J5cHRvL2JuL2JuX3NxcnQuYyAqLworLyogV3JpdHRlbiBieSBMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPgorICogYW5kIEJvZG8gTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworCitCSUdOVU0gKkJOX21vZF9zcXJ0KEJJR05VTSAqaW4sIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLCBCTl9DVFggKmN0eCkgCisvKiBSZXR1cm5zICdyZXQnIHN1Y2ggdGhhdAorICogICAgICByZXReMiA9PSBhIChtb2QgcCksCisgKiB1c2luZyB0aGUgVG9uZWxsaS9TaGFua3MgYWxnb3JpdGhtIChjZi4gSGVucmkgQ29oZW4sICJBIENvdXJzZQorICogaW4gQWxnZWJyYWljIENvbXB1dGF0aW9uYWwgTnVtYmVyIFRoZW9yeSIsIGFsZ29yaXRobSAxLjUuMSkuCisgKiAncCcgbXVzdCBiZSBwcmltZSEKKyAqLworCXsKKwlCSUdOVU0gKnJldCA9IGluOworCWludCBlcnIgPSAxOworCWludCByOworCUJJR05VTSAqQSwgKmIsICpxLCAqdCwgKngsICp5OworCWludCBlLCBpLCBqOworCQorCWlmICghQk5faXNfb2RkKHApIHx8IEJOX2Fic19pc193b3JkKHAsIDEpKQorCQl7CisJCWlmIChCTl9hYnNfaXNfd29yZChwLCAyKSkKKwkJCXsKKwkJCWlmIChyZXQgPT0gTlVMTCkKKwkJCQlyZXQgPSBCTl9uZXcoKTsKKwkJCWlmIChyZXQgPT0gTlVMTCkKKwkJCQlnb3RvIGVuZDsKKwkJCWlmICghQk5fc2V0X3dvcmQocmV0LCBCTl9pc19iaXRfc2V0KGEsIDApKSkKKwkJCQl7CisJCQkJaWYgKHJldCAhPSBpbikKKwkJCQkJQk5fZnJlZShyZXQpOworCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCWJuX2NoZWNrX3RvcChyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQlCTmVycihCTl9GX0JOX01PRF9TUVJULCBCTl9SX1BfSVNfTk9UX1BSSU1FKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisKKwlpZiAoQk5faXNfemVybyhhKSB8fCBCTl9pc19vbmUoYSkpCisJCXsKKwkJaWYgKHJldCA9PSBOVUxMKQorCQkJcmV0ID0gQk5fbmV3KCk7CisJCWlmIChyZXQgPT0gTlVMTCkKKwkJCWdvdG8gZW5kOworCQlpZiAoIUJOX3NldF93b3JkKHJldCwgQk5faXNfb25lKGEpKSkKKwkJCXsKKwkJCWlmIChyZXQgIT0gaW4pCisJCQkJQk5fZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCWJuX2NoZWNrX3RvcChyZXQpOworCQlyZXR1cm4gcmV0OworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlBID0gQk5fQ1RYX2dldChjdHgpOworCWIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJcSA9IEJOX0NUWF9nZXQoY3R4KTsKKwl0ID0gQk5fQ1RYX2dldChjdHgpOworCXggPSBCTl9DVFhfZ2V0KGN0eCk7CisJeSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoeSA9PSBOVUxMKSBnb3RvIGVuZDsKKwkKKwlpZiAocmV0ID09IE5VTEwpCisJCXJldCA9IEJOX25ldygpOworCWlmIChyZXQgPT0gTlVMTCkgZ290byBlbmQ7CisKKwkvKiBBID0gYSBtb2QgcCAqLworCWlmICghQk5fbm5tb2QoQSwgYSwgcCwgY3R4KSkgZ290byBlbmQ7CisKKwkvKiBub3cgd3JpdGUgIHxwfCAtIDEgIGFzICAyXmUqcSAgd2hlcmUgIHEgIGlzIG9kZCAqLworCWUgPSAxOworCXdoaWxlICghQk5faXNfYml0X3NldChwLCBlKSkKKwkJZSsrOworCS8qIHdlJ2xsIHNldCAgcSAgbGF0ZXIgKGlmIG5lZWRlZCkgKi8KKworCWlmIChlID09IDEpCisJCXsKKwkJLyogVGhlIGVhc3kgY2FzZTogICh8cHwtMSkvMiAgaXMgb2RkLCBzbyAyIGhhcyBhbiBpbnZlcnNlCisJCSAqIG1vZHVsbyAgKHxwfC0xKS8yLCAgYW5kIHNxdWFyZSByb290cyBjYW4gYmUgY29tcHV0ZWQKKwkJICogZGlyZWN0bHkgYnkgbW9kdWxhciBleHBvbmVudGlhdGlvbi4KKwkJICogV2UgaGF2ZQorCQkgKiAgICAgMiAqICh8cHwrMSkvNCA9PSAxICAgKG1vZCAofHB8LTEpLzIpLAorCQkgKiBzbyB3ZSBjYW4gdXNlIGV4cG9uZW50ICAofHB8KzEpLzQsICBpLmUuICAofHB8LTMpLzQgKyAxLgorCQkgKi8KKwkJaWYgKCFCTl9yc2hpZnQocSwgcCwgMikpIGdvdG8gZW5kOworCQlxLT5uZWcgPSAwOworCQlpZiAoIUJOX2FkZF93b3JkKHEsIDEpKSBnb3RvIGVuZDsKKwkJaWYgKCFCTl9tb2RfZXhwKHJldCwgQSwgcSwgcCwgY3R4KSkgZ290byBlbmQ7CisJCWVyciA9IDA7CisJCWdvdG8gdnJmeTsKKwkJfQorCQorCWlmIChlID09IDIpCisJCXsKKwkJLyogfHB8ID09IDUgIChtb2QgOCkKKwkJICoKKwkJICogSW4gdGhpcyBjYXNlICAyICBpcyBhbHdheXMgYSBub24tc3F1YXJlIHNpbmNlCisJCSAqIExlZ2VuZHJlKDIscCkgPSAoLTEpXigocF4yLTEpLzgpICBmb3IgYW55IG9kZCBwcmltZS4KKwkJICogU28gaWYgIGEgIHJlYWxseSBpcyBhIHNxdWFyZSwgdGhlbiAgMiphICBpcyBhIG5vbi1zcXVhcmUuCisJCSAqIFRodXMgZm9yCisJCSAqICAgICAgYiA6PSAoMiphKV4oKHxwfC01KS84KSwKKwkJICogICAgICBpIDo9ICgyKmEpKmJeMgorCQkgKiB3ZSBoYXZlCisJCSAqICAgICBpXjIgPSAoMiphKV4oKDEgKyAofHB8LTUpLzQpKjIpCisJCSAqICAgICAgICAgPSAoMiphKV4oKHAtMSkvMikKKwkJICogICAgICAgICA9IC0xOworCQkgKiBzbyBpZiB3ZSBzZXQKKwkJICogICAgICB4IDo9IGEqYiooaS0xKSwKKwkJICogdGhlbgorCQkgKiAgICAgeF4yID0gYV4yICogYl4yICogKGleMiAtIDIqaSArIDEpCisJCSAqICAgICAgICAgPSBhXjIgKiBiXjIgKiAoLTIqaSkKKwkJICogICAgICAgICA9IGEqKC1pKSooMiphKmJeMikKKwkJICogICAgICAgICA9IGEqKC1pKSppCisJCSAqICAgICAgICAgPSBhLgorCQkgKgorCQkgKiAoVGhpcyBpcyBkdWUgdG8gQS5PLkwuIEF0a2luLCAKKwkJICogPFVSTDogaHR0cDovL2xpc3RzZXJ2Lm5vZGFrLmVkdS9zY3JpcHRzL3dhLmV4ZT9BMj1pbmQ5MjExJkw9bm1icnRocnkmTz1UJlA9NTYyPiwKKwkJICogTm92ZW1iZXIgMTk5Mi4pCisJCSAqLworCisJCS8qIHQgOj0gMiphICovCisJCWlmICghQk5fbW9kX2xzaGlmdDFfcXVpY2sodCwgQSwgcCkpIGdvdG8gZW5kOworCisJCS8qIGIgOj0gKDIqYSleKCh8cHwtNSkvOCkgKi8KKwkJaWYgKCFCTl9yc2hpZnQocSwgcCwgMykpIGdvdG8gZW5kOworCQlxLT5uZWcgPSAwOworCQlpZiAoIUJOX21vZF9leHAoYiwgdCwgcSwgcCwgY3R4KSkgZ290byBlbmQ7CisKKwkJLyogeSA6PSBiXjIgKi8KKwkJaWYgKCFCTl9tb2Rfc3FyKHksIGIsIHAsIGN0eCkpIGdvdG8gZW5kOworCisJCS8qIHQgOj0gKDIqYSkqYl4yIC0gMSovCisJCWlmICghQk5fbW9kX211bCh0LCB0LCB5LCBwLCBjdHgpKSBnb3RvIGVuZDsKKwkJaWYgKCFCTl9zdWJfd29yZCh0LCAxKSkgZ290byBlbmQ7CisKKwkJLyogeCA9IGEqYip0ICovCisJCWlmICghQk5fbW9kX211bCh4LCBBLCBiLCBwLCBjdHgpKSBnb3RvIGVuZDsKKwkJaWYgKCFCTl9tb2RfbXVsKHgsIHgsIHQsIHAsIGN0eCkpIGdvdG8gZW5kOworCisJCWlmICghQk5fY29weShyZXQsIHgpKSBnb3RvIGVuZDsKKwkJZXJyID0gMDsKKwkJZ290byB2cmZ5OworCQl9CisJCisJLyogZSA+IDIsIHNvIHdlIHJlYWxseSBoYXZlIHRvIHVzZSB0aGUgVG9uZWxsaS9TaGFua3MgYWxnb3JpdGhtLgorCSAqIEZpcnN0LCBmaW5kIHNvbWUgIHkgIHRoYXQgaXMgbm90IGEgc3F1YXJlLiAqLworCWlmICghQk5fY29weShxLCBwKSkgZ290byBlbmQ7IC8qIHVzZSAncScgYXMgdGVtcCAqLworCXEtPm5lZyA9IDA7CisJaSA9IDI7CisJZG8KKwkJeworCQkvKiBGb3IgZWZmaWNpZW5jeSwgdHJ5IHNtYWxsIG51bWJlcnMgZmlyc3Q7CisJCSAqIGlmIHRoaXMgZmFpbHMsIHRyeSByYW5kb20gbnVtYmVycy4KKwkJICovCisJCWlmIChpIDwgMjIpCisJCQl7CisJCQlpZiAoIUJOX3NldF93b3JkKHksIGkpKSBnb3RvIGVuZDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKCFCTl9wc2V1ZG9fcmFuZCh5LCBCTl9udW1fYml0cyhwKSwgMCwgMCkpIGdvdG8gZW5kOworCQkJaWYgKEJOX3VjbXAoeSwgcCkgPj0gMCkKKwkJCQl7CisJCQkJaWYgKCEocC0+bmVnID8gQk5fYWRkIDogQk5fc3ViKSh5LCB5LCBwKSkgZ290byBlbmQ7CisJCQkJfQorCQkJLyogbm93IDAgPD0geSA8IHxwfCAqLworCQkJaWYgKEJOX2lzX3plcm8oeSkpCisJCQkJaWYgKCFCTl9zZXRfd29yZCh5LCBpKSkgZ290byBlbmQ7CisJCQl9CisJCQorCQlyID0gQk5fa3JvbmVja2VyKHksIHEsIGN0eCk7IC8qIGhlcmUgJ3EnIGlzIHxwfCAqLworCQlpZiAociA8IC0xKSBnb3RvIGVuZDsKKwkJaWYgKHIgPT0gMCkKKwkJCXsKKwkJCS8qIG0gZGl2aWRlcyBwICovCisJCQlCTmVycihCTl9GX0JOX01PRF9TUVJULCBCTl9SX1BfSVNfTk9UX1BSSU1FKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJd2hpbGUgKHIgPT0gMSAmJiArK2kgPCA4Mik7CisJCisJaWYgKHIgIT0gLTEpCisJCXsKKwkJLyogTWFueSByb3VuZHMgYW5kIHN0aWxsIG5vIG5vbi1zcXVhcmUgLS0gdGhpcyBpcyBtb3JlIGxpa2VseQorCQkgKiBhIGJ1ZyB0aGFuIGp1c3QgYmFkIGx1Y2suCisJCSAqIEV2ZW4gaWYgIHAgIGlzIG5vdCBwcmltZSwgd2Ugc2hvdWxkIGhhdmUgZm91bmQgc29tZSAgeQorCQkgKiBzdWNoIHRoYXQgciA9PSAtMS4KKwkJICovCisJCUJOZXJyKEJOX0ZfQk5fTU9EX1NRUlQsIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUyk7CisJCWdvdG8gZW5kOworCQl9CisKKwkvKiBIZXJlJ3Mgb3VyIGFjdHVhbCAncSc6ICovCisJaWYgKCFCTl9yc2hpZnQocSwgcSwgZSkpIGdvdG8gZW5kOworCisJLyogTm93IHRoYXQgd2UgaGF2ZSBzb21lIG5vbi1zcXVhcmUsIHdlIGNhbiBmaW5kIGFuIGVsZW1lbnQKKwkgKiBvZiBvcmRlciAgMl5lICBieSBjb21wdXRpbmcgaXRzIHEndGggcG93ZXIuICovCisJaWYgKCFCTl9tb2RfZXhwKHksIHksIHEsIHAsIGN0eCkpIGdvdG8gZW5kOworCWlmIChCTl9pc19vbmUoeSkpCisJCXsKKwkJQk5lcnIoQk5fRl9CTl9NT0RfU1FSVCwgQk5fUl9QX0lTX05PVF9QUklNRSk7CisJCWdvdG8gZW5kOworCQl9CisKKwkvKiBOb3cgd2Uga25vdyB0aGF0IChpZiAgcCAgaXMgaW5kZWVkIHByaW1lKSB0aGVyZSBpcyBhbiBpbnRlZ2VyCisJICogaywgIDAgPD0gayA8IDJeZSwgIHN1Y2ggdGhhdAorCSAqCisJICogICAgICBhXnEgKiB5XmsgPT0gMSAgIChtb2QgcCkuCisJICoKKwkgKiBBcyAgYV5xICBpcyBhIHNxdWFyZSBhbmQgIHkgIGlzIG5vdCwgIGsgIG11c3QgYmUgZXZlbi4KKwkgKiBxKzEgIGlzIGV2ZW4sIHRvbywgc28gdGhlcmUgaXMgYW4gZWxlbWVudAorCSAqCisJICogICAgIFggOj0gYV4oKHErMSkvMikgKiB5XihrLzIpLAorCSAqCisJICogYW5kIGl0IHNhdGlzZmllcworCSAqCisJICogICAgIFheMiA9IGFecSAqIGEgICAgICogeV5rCisJICogICAgICAgICA9IGEsCisJICoKKwkgKiBzbyBpdCBpcyB0aGUgc3F1YXJlIHJvb3QgdGhhdCB3ZSBhcmUgbG9va2luZyBmb3IuCisJICovCisJCisJLyogdCA6PSAocS0xKS8yICAobm90ZSB0aGF0ICBxICBpcyBvZGQpICovCisJaWYgKCFCTl9yc2hpZnQxKHQsIHEpKSBnb3RvIGVuZDsKKwkKKwkvKiB4IDo9IGFeKChxLTEpLzIpICovCisJaWYgKEJOX2lzX3plcm8odCkpIC8qIHNwZWNpYWwgY2FzZTogcCA9IDJeZSArIDEgKi8KKwkJeworCQlpZiAoIUJOX25ubW9kKHQsIEEsIHAsIGN0eCkpIGdvdG8gZW5kOworCQlpZiAoQk5faXNfemVybyh0KSkKKwkJCXsKKwkJCS8qIHNwZWNpYWwgY2FzZTogYSA9PSAwICAobW9kIHApICovCisJCQlCTl96ZXJvKHJldCk7CisJCQllcnIgPSAwOworCQkJZ290byBlbmQ7CisJCQl9CisJCWVsc2UKKwkJCWlmICghQk5fb25lKHgpKSBnb3RvIGVuZDsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIUJOX21vZF9leHAoeCwgQSwgdCwgcCwgY3R4KSkgZ290byBlbmQ7CisJCWlmIChCTl9pc196ZXJvKHgpKQorCQkJeworCQkJLyogc3BlY2lhbCBjYXNlOiBhID09IDAgIChtb2QgcCkgKi8KKwkJCUJOX3plcm8ocmV0KTsKKwkJCWVyciA9IDA7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCisJLyogYiA6PSBhKnheMiAgKD0gYV5xKSAqLworCWlmICghQk5fbW9kX3NxcihiLCB4LCBwLCBjdHgpKSBnb3RvIGVuZDsKKwlpZiAoIUJOX21vZF9tdWwoYiwgYiwgQSwgcCwgY3R4KSkgZ290byBlbmQ7CisJCisJLyogeCA6PSBhKnggICAgKD0gYV4oKHErMSkvMikpICovCisJaWYgKCFCTl9tb2RfbXVsKHgsIHgsIEEsIHAsIGN0eCkpIGdvdG8gZW5kOworCisJd2hpbGUgKDEpCisJCXsKKwkJLyogTm93ICBiICBpcyAgYV5xICogeV5rICBmb3Igc29tZSBldmVuICBrICAoMCA8PSBrIDwgMl5FCisJCSAqIHdoZXJlICBFICByZWZlcnMgdG8gdGhlIG9yaWdpbmFsIHZhbHVlIG9mICBlLCAgd2hpY2ggd2UKKwkJICogZG9uJ3Qga2VlcCBpbiBhIHZhcmlhYmxlKSwgIGFuZCAgeCAgaXMgIGFeKChxKzEpLzIpICogeV4oay8yKS4KKwkJICoKKwkJICogV2UgaGF2ZSAgYSpiID0geF4yLAorCQkgKiAgICB5XjJeKGUtMSkgPSAtMSwKKwkJICogICAgYl4yXihlLTEpID0gMS4KKwkJICovCisKKwkJaWYgKEJOX2lzX29uZShiKSkKKwkJCXsKKwkJCWlmICghQk5fY29weShyZXQsIHgpKSBnb3RvIGVuZDsKKwkJCWVyciA9IDA7CisJCQlnb3RvIHZyZnk7CisJCQl9CisKKworCQkvKiBmaW5kIHNtYWxsZXN0ICBpICBzdWNoIHRoYXQgIGJeKDJeaSkgPSAxICovCisJCWkgPSAxOworCQlpZiAoIUJOX21vZF9zcXIodCwgYiwgcCwgY3R4KSkgZ290byBlbmQ7CisJCXdoaWxlICghQk5faXNfb25lKHQpKQorCQkJeworCQkJaSsrOworCQkJaWYgKGkgPT0gZSkKKwkJCQl7CisJCQkJQk5lcnIoQk5fRl9CTl9NT0RfU1FSVCwgQk5fUl9OT1RfQV9TUVVBUkUpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWlmICghQk5fbW9kX211bCh0LCB0LCB0LCBwLCBjdHgpKSBnb3RvIGVuZDsKKwkJCX0KKwkJCisKKwkJLyogdCA6PSB5XjJeKGUgLSBpIC0gMSkgKi8KKwkJaWYgKCFCTl9jb3B5KHQsIHkpKSBnb3RvIGVuZDsKKwkJZm9yIChqID0gZSAtIGkgLSAxOyBqID4gMDsgai0tKQorCQkJeworCQkJaWYgKCFCTl9tb2Rfc3FyKHQsIHQsIHAsIGN0eCkpIGdvdG8gZW5kOworCQkJfQorCQlpZiAoIUJOX21vZF9tdWwoeSwgdCwgdCwgcCwgY3R4KSkgZ290byBlbmQ7CisJCWlmICghQk5fbW9kX211bCh4LCB4LCB0LCBwLCBjdHgpKSBnb3RvIGVuZDsKKwkJaWYgKCFCTl9tb2RfbXVsKGIsIGIsIHksIHAsIGN0eCkpIGdvdG8gZW5kOworCQllID0gaTsKKwkJfQorCisgdnJmeToKKwlpZiAoIWVycikKKwkJeworCQkvKiB2ZXJpZnkgdGhlIHJlc3VsdCAtLSB0aGUgaW5wdXQgbWlnaHQgaGF2ZSBiZWVuIG5vdCBhIHNxdWFyZQorCQkgKiAodGVzdCBhZGRlZCBpbiAwLjkuOCkgKi8KKwkJCisJCWlmICghQk5fbW9kX3Nxcih4LCByZXQsIHAsIGN0eCkpCisJCQllcnIgPSAxOworCQkKKwkJaWYgKCFlcnIgJiYgMCAhPSBCTl9jbXAoeCwgQSkpCisJCQl7CisJCQlCTmVycihCTl9GX0JOX01PRF9TUVJULCBCTl9SX05PVF9BX1NRVUFSRSk7CisJCQllcnIgPSAxOworCQkJfQorCQl9CisKKyBlbmQ6CisJaWYgKGVycikKKwkJeworCQlpZiAocmV0ICE9IE5VTEwgJiYgcmV0ICE9IGluKQorCQkJeworCQkJQk5fY2xlYXJfZnJlZShyZXQpOworCQkJfQorCQlyZXQgPSBOVUxMOworCQl9CisJQk5fQ1RYX2VuZChjdHgpOworCWJuX2NoZWNrX3RvcChyZXQpOworCXJldHVybiByZXQ7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JuX3dvcmQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl93b3JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3Yjg3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9ibl93b3JkLmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qIGNyeXB0by9ibi9ibl93b3JkLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJibl9sY2wuaCIKKworQk5fVUxPTkcgQk5fbW9kX3dvcmQoY29uc3QgQklHTlVNICphLCBCTl9VTE9ORyB3KQorCXsKKyNpZm5kZWYgQk5fTExPTkcKKwlCTl9VTE9ORyByZXQ9MDsKKyNlbHNlCisJQk5fVUxMT05HIHJldD0wOworI2VuZGlmCisJaW50IGk7CisKKwlpZiAodyA9PSAwKQorCQlyZXR1cm4gKEJOX1VMT05HKS0xOworCisJYm5fY2hlY2tfdG9wKGEpOworCXcmPUJOX01BU0syOworCWZvciAoaT1hLT50b3AtMTsgaT49MDsgaS0tKQorCQl7CisjaWZuZGVmIEJOX0xMT05HCisJCXJldD0oKHJldDw8Qk5fQklUUzQpfCgoYS0+ZFtpXT4+Qk5fQklUUzQpJkJOX01BU0sybCkpJXc7CisJCXJldD0oKHJldDw8Qk5fQklUUzQpfChhLT5kW2ldJkJOX01BU0sybCkpJXc7CisjZWxzZQorCQlyZXQ9KEJOX1VMTE9ORykoKChyZXQ8PChCTl9VTExPTkcpQk5fQklUUzIpfGEtPmRbaV0pJQorCQkJKEJOX1VMTE9ORyl3KTsKKyNlbmRpZgorCQl9CisJcmV0dXJuKChCTl9VTE9ORylyZXQpOworCX0KKworQk5fVUxPTkcgQk5fZGl2X3dvcmQoQklHTlVNICphLCBCTl9VTE9ORyB3KQorCXsKKwlCTl9VTE9ORyByZXQgPSAwOworCWludCBpLCBqOworCisJYm5fY2hlY2tfdG9wKGEpOworCXcgJj0gQk5fTUFTSzI7CisKKwlpZiAoIXcpCisJCS8qIGFjdHVhbGx5IHRoaXMgYW4gZXJyb3IgKGRpdmlzaW9uIGJ5IHplcm8pICovCisJCXJldHVybiAoQk5fVUxPTkcpLTE7CisJaWYgKGEtPnRvcCA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIG5vcm1hbGl6ZSBpbnB1dCAoc28gYm5fZGl2X3dvcmRzIGRvZXNuJ3QgY29tcGxhaW4pICovCisJaiA9IEJOX0JJVFMyIC0gQk5fbnVtX2JpdHNfd29yZCh3KTsKKwl3IDw8PSBqOworCWlmICghQk5fbHNoaWZ0KGEsIGEsIGopKQorCQlyZXR1cm4gKEJOX1VMT05HKS0xOworCisJZm9yIChpPWEtPnRvcC0xOyBpPj0wOyBpLS0pCisJCXsKKwkJQk5fVUxPTkcgbCxkOworCQkKKwkJbD1hLT5kW2ldOworCQlkPWJuX2Rpdl93b3JkcyhyZXQsbCx3KTsKKwkJcmV0PShsLSgoZCp3KSZCTl9NQVNLMikpJkJOX01BU0syOworCQlhLT5kW2ldPWQ7CisJCX0KKwlpZiAoKGEtPnRvcCA+IDApICYmIChhLT5kW2EtPnRvcC0xXSA9PSAwKSkKKwkJYS0+dG9wLS07CisJcmV0ID4+PSBqOworCWJuX2NoZWNrX3RvcChhKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBCTl9hZGRfd29yZChCSUdOVU0gKmEsIEJOX1VMT05HIHcpCisJeworCUJOX1VMT05HIGw7CisJaW50IGk7CisKKwlibl9jaGVja190b3AoYSk7CisJdyAmPSBCTl9NQVNLMjsKKworCS8qIGRlZ2VuZXJhdGUgY2FzZTogdyBpcyB6ZXJvICovCisJaWYgKCF3KSByZXR1cm4gMTsKKwkvKiBkZWdlbmVyYXRlIGNhc2U6IGEgaXMgemVybyAqLworCWlmKEJOX2lzX3plcm8oYSkpIHJldHVybiBCTl9zZXRfd29yZChhLCB3KTsKKwkvKiBoYW5kbGUgJ2EnIHdoZW4gbmVnYXRpdmUgKi8KKwlpZiAoYS0+bmVnKQorCQl7CisJCWEtPm5lZz0wOworCQlpPUJOX3N1Yl93b3JkKGEsdyk7CisJCWlmICghQk5faXNfemVybyhhKSkKKwkJCWEtPm5lZz0hKGEtPm5lZyk7CisJCXJldHVybihpKTsKKwkJfQorCS8qIE9ubHkgZXhwYW5kIChhbmQgcmlzayBmYWlsaW5nKSBpZiBpdCdzIHBvc3NpYmx5IG5lY2Vzc2FyeSAqLworCWlmICgoKEJOX1VMT05HKShhLT5kW2EtPnRvcCAtIDFdICsgMSkgPT0gMCkgJiYKKwkJCShibl93ZXhwYW5kKGEsYS0+dG9wKzEpID09IE5VTEwpKQorCQlyZXR1cm4oMCk7CisJaT0wOworCWZvciAoOzspCisJCXsKKwkJaWYgKGkgPj0gYS0+dG9wKQorCQkJbD13OworCQllbHNlCisJCQlsPShhLT5kW2ldK3cpJkJOX01BU0syOworCQlhLT5kW2ldPWw7CisJCWlmICh3ID4gbCkKKwkJCXc9MTsKKwkJZWxzZQorCQkJYnJlYWs7CisJCWkrKzsKKwkJfQorCWlmIChpID49IGEtPnRvcCkKKwkJYS0+dG9wKys7CisJYm5fY2hlY2tfdG9wKGEpOworCXJldHVybigxKTsKKwl9CisKK2ludCBCTl9zdWJfd29yZChCSUdOVU0gKmEsIEJOX1VMT05HIHcpCisJeworCWludCBpOworCisJYm5fY2hlY2tfdG9wKGEpOworCXcgJj0gQk5fTUFTSzI7CisKKwkvKiBkZWdlbmVyYXRlIGNhc2U6IHcgaXMgemVybyAqLworCWlmICghdykgcmV0dXJuIDE7CisJLyogZGVnZW5lcmF0ZSBjYXNlOiBhIGlzIHplcm8gKi8KKwlpZihCTl9pc196ZXJvKGEpKQorCQl7CisJCWkgPSBCTl9zZXRfd29yZChhLHcpOworCQlpZiAoaSAhPSAwKQorCQkJQk5fc2V0X25lZ2F0aXZlKGEsIDEpOworCQlyZXR1cm4gaTsKKwkJfQorCS8qIGhhbmRsZSAnYScgd2hlbiBuZWdhdGl2ZSAqLworCWlmIChhLT5uZWcpCisJCXsKKwkJYS0+bmVnPTA7CisJCWk9Qk5fYWRkX3dvcmQoYSx3KTsKKwkJYS0+bmVnPTE7CisJCXJldHVybihpKTsKKwkJfQorCisJaWYgKChhLT50b3AgPT0gMSkgJiYgKGEtPmRbMF0gPCB3KSkKKwkJeworCQlhLT5kWzBdPXctYS0+ZFswXTsKKwkJYS0+bmVnPTE7CisJCXJldHVybigxKTsKKwkJfQorCWk9MDsKKwlmb3IgKDs7KQorCQl7CisJCWlmIChhLT5kW2ldID49IHcpCisJCQl7CisJCQlhLT5kW2ldLT13OworCQkJYnJlYWs7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWEtPmRbaV09KGEtPmRbaV0tdykmQk5fTUFTSzI7CisJCQlpKys7CisJCQl3PTE7CisJCQl9CisJCX0KKwlpZiAoKGEtPmRbaV0gPT0gMCkgJiYgKGkgPT0gKGEtPnRvcC0xKSkpCisJCWEtPnRvcC0tOworCWJuX2NoZWNrX3RvcChhKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgQk5fbXVsX3dvcmQoQklHTlVNICphLCBCTl9VTE9ORyB3KQorCXsKKwlCTl9VTE9ORyBsbDsKKworCWJuX2NoZWNrX3RvcChhKTsKKwl3Jj1CTl9NQVNLMjsKKwlpZiAoYS0+dG9wKQorCQl7CisJCWlmICh3ID09IDApCisJCQlCTl96ZXJvKGEpOworCQllbHNlCisJCQl7CisJCQlsbD1ibl9tdWxfd29yZHMoYS0+ZCxhLT5kLGEtPnRvcCx3KTsKKwkJCWlmIChsbCkKKwkJCQl7CisJCQkJaWYgKGJuX3dleHBhbmQoYSxhLT50b3ArMSkgPT0gTlVMTCkgcmV0dXJuKDApOworCQkJCWEtPmRbYS0+dG9wKytdPWxsOworCQkJCX0KKwkJCX0KKwkJfQorCWJuX2NoZWNrX3RvcChhKTsKKwlyZXR1cm4oMSk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm5zcGVlZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2Juc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTU0YWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2Juc3BlZWQuYwpAQCAtMCwwICsxLDIzMyBAQAorLyogdW51c2VkICovCisKKy8qIGNyeXB0by9ibi9ibnNwZWVkLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogbW9zdCBvZiB0aGlzIGNvZGUgaGFzIGJlZW4gcGlsZmVyZWQgZnJvbSBteSBsaWJkZXMgc3BlZWQuYyBwcm9ncmFtICovCisKKyNkZWZpbmUgQkFTRU5VTQkxMDAwMDAwCisjdW5kZWYgUFJPRworI2RlZmluZSBQUk9HIGJuc3BlZWRfbWFpbgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgKCFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChfX0RFQ0MpKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NQUNPU1gpCisjZGVmaW5lIFRJTUVTCisjZW5kaWYKKworI2lmbmRlZiBfSVJJWAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorI2lmZGVmIFRJTUVTCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjZW5kaWYKKworLyogRGVwZW5kaW5nIG9uIHRoZSBWTVMgdmVyc2lvbiwgdGhlIHRtcyBzdHJ1Y3R1cmUgaXMgcGVyaGFwcyBkZWZpbmVkLgorICAgVGhlIF9fVE1TIG1hY3JvIHdpbGwgc2hvdyBpZiBpdCB3YXMuICBJZiBpdCB3YXNuJ3QgZGVmaW5lZCwgd2Ugc2hvdWxkCisgICB1bmRlZmluZSBUSU1FUywgc2luY2UgdGhhdCB0ZWxscyB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbSBob3cgdGhpbmdzCisgICBzaG91bGQgYmUgaGFuZGxlZC4JCQkJLS0gUmljaGFyZCBMZXZpdHRlICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVNfREVDQykgJiYgIWRlZmluZWQoX19UTVMpCisjdW5kZWYgVElNRVMKKyNlbmRpZgorCisjaWZuZGVmIFRJTUVTCisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKF9fdWx0cml4KQorI2RlZmluZSBfUE9TSVhfU09VUkNFCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworLyogVGhlIGZvbGxvd2luZyBpZiBmcm9tIHRpbWVzKDMpIG1hbiBwYWdlLiAgSXQgbWF5IG5lZWQgdG8gYmUgY2hhbmdlZCAqLworI2lmbmRlZiBIWgorIyBpZm5kZWYgQ0xLX1RDSworIyAgaWZuZGVmIF9CU0RfQ0xLX1RDS18gLyogRnJlZUJTRCBoYWNrICovCisjICAgZGVmaW5lIEhaCTEwMC4wCisjICBlbHNlIC8qIF9CU0RfQ0xLX1RDS18gKi8KKyMgICBkZWZpbmUgSFogKChkb3VibGUpX0JTRF9DTEtfVENLXykKKyMgIGVuZGlmCisjIGVsc2UgLyogQ0xLX1RDSyAqLworIyAgZGVmaW5lIEhaICgoZG91YmxlKUNMS19UQ0spCisjIGVuZGlmCisjZW5kaWYKKworI3VuZGVmIEJVRlNJWkUKKyNkZWZpbmUgQlVGU0laRQkoKGxvbmcpMTAyNCo4KQoraW50IHJ1bj0wOworCitzdGF0aWMgZG91YmxlIFRpbWVfRihpbnQgcyk7CisjZGVmaW5lIFNUQVJUCTAKKyNkZWZpbmUgU1RPUAkxCisKK3N0YXRpYyBkb3VibGUgVGltZV9GKGludCBzKQorCXsKKwlkb3VibGUgcmV0OworI2lmZGVmIFRJTUVTCisJc3RhdGljIHN0cnVjdCB0bXMgdHN0YXJ0LHRlbmQ7CisKKwlpZiAocyA9PSBTVEFSVCkKKwkJeworCQl0aW1lcygmdHN0YXJ0KTsKKwkJcmV0dXJuKDApOworCQl9CisJZWxzZQorCQl7CisJCXRpbWVzKCZ0ZW5kKTsKKwkJcmV0PSgoZG91YmxlKSh0ZW5kLnRtc191dGltZS10c3RhcnQudG1zX3V0aW1lKSkvSFo7CisJCXJldHVybigocmV0IDwgMWUtMyk/MWUtMzpyZXQpOworCQl9CisjZWxzZSAvKiAhdGltZXMoKSAqLworCXN0YXRpYyBzdHJ1Y3QgdGltZWIgdHN0YXJ0LHRlbmQ7CisJbG9uZyBpOworCisJaWYgKHMgPT0gU1RBUlQpCisJCXsKKwkJZnRpbWUoJnRzdGFydCk7CisJCXJldHVybigwKTsKKwkJfQorCWVsc2UKKwkJeworCQlmdGltZSgmdGVuZCk7CisJCWk9KGxvbmcpdGVuZC5taWxsaXRtLShsb25nKXRzdGFydC5taWxsaXRtOworCQlyZXQ9KChkb3VibGUpKHRlbmQudGltZS10c3RhcnQudGltZSkpKygoZG91YmxlKWkpLzEwMDAuMDsKKwkJcmV0dXJuKChyZXQgPCAwLjAwMSk/MC4wMDE6cmV0KTsKKwkJfQorI2VuZGlmCisJfQorCisjZGVmaW5lIE5VTV9TSVpFUwk1CitzdGF0aWMgaW50IHNpemVzW05VTV9TSVpFU109ezEyOCwyNTYsNTEyLDEwMjQsMjA0OH07CisvKnN0YXRpYyBpbnQgc2l6ZXNbTlVNX1NJWkVTXT17NTksMTc5LDI5OSw0MTksNTM5fTsgKi8KKwordm9pZCBkb19tdWwoQklHTlVNICpyLEJJR05VTSAqYSxCSUdOVU0gKmIsQk5fQ1RYICpjdHgpOyAKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlCTl9DVFggKmN0eDsKKwlCSUdOVU0gYSxiLGM7CisKKwljdHg9Qk5fQ1RYX25ldygpOworCUJOX2luaXQoJmEpOworCUJOX2luaXQoJmIpOworCUJOX2luaXQoJmMpOworCisJZG9fbXVsKCZhLCZiLCZjLGN0eCk7CisJfQorCit2b2lkIGRvX211bChCSUdOVU0gKnIsIEJJR05VTSAqYSwgQklHTlVNICpiLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IGksaixrOworCWRvdWJsZSB0bTsKKwlsb25nIG51bTsKKworCWZvciAoaT0wOyBpPE5VTV9TSVpFUzsgaSsrKQorCQl7CisJCW51bT1CQVNFTlVNOworCQlpZiAoaSkgbnVtLz0oaSozKTsKKwkJQk5fcmFuZChhLHNpemVzW2ldLDEsMCk7CisJCWZvciAoaj1pOyBqPE5VTV9TSVpFUzsgaisrKQorCQkJeworCQkJQk5fcmFuZChiLHNpemVzW2pdLDEsMCk7CisJCQlUaW1lX0YoU1RBUlQpOworCQkJZm9yIChrPTA7IGs8bnVtOyBrKyspCisJCQkJQk5fbXVsKHIsYixhLGN0eCk7CisJCQl0bT1UaW1lX0YoU1RPUCk7CisJCQlwcmludGYoIm11bCAlNGQgeCAlNGQgLT4gJTguM2Ztc1xuIixzaXplc1tpXSxzaXplc1tqXSx0bSoxMDAwLjAvbnVtKTsKKwkJCX0KKwkJfQorCisJZm9yIChpPTA7IGk8TlVNX1NJWkVTOyBpKyspCisJCXsKKwkJbnVtPUJBU0VOVU07CisJCWlmIChpKSBudW0vPShpKjMpOworCQlCTl9yYW5kKGEsc2l6ZXNbaV0sMSwwKTsKKwkJVGltZV9GKFNUQVJUKTsKKwkJZm9yIChrPTA7IGs8bnVtOyBrKyspCisJCQlCTl9zcXIocixhLGN0eCk7CisJCXRtPVRpbWVfRihTVE9QKTsKKwkJcHJpbnRmKCJzcXIgJTRkIHggJTRkIC0+ICU4LjNmbXNcbiIsc2l6ZXNbaV0sc2l6ZXNbaV0sdG0qMTAwMC4wL251bSk7CisJCX0KKworCWZvciAoaT0wOyBpPE5VTV9TSVpFUzsgaSsrKQorCQl7CisJCW51bT1CQVNFTlVNLzEwOworCQlpZiAoaSkgbnVtLz0oaSozKTsKKwkJQk5fcmFuZChhLHNpemVzW2ldLTEsMSwwKTsKKwkJZm9yIChqPWk7IGo8TlVNX1NJWkVTOyBqKyspCisJCQl7CisJCQlCTl9yYW5kKGIsc2l6ZXNbal0sMSwwKTsKKwkJCVRpbWVfRihTVEFSVCk7CisJCQlmb3IgKGs9MDsgazwxMDAwMDA7IGsrKykKKwkJCQlCTl9kaXYociwgTlVMTCwgYiwgYSxjdHgpOworCQkJdG09VGltZV9GKFNUT1ApOworCQkJcHJpbnRmKCJkaXYgJTRkIC8gJTRkIC0+ICU4LjNmbXNcbiIsc2l6ZXNbal0sc2l6ZXNbaV0tMSx0bSoxMDAwLjAvbnVtKTsKKwkJCX0KKwkJfQorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JudGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2JudGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDk5YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vYm50ZXN0LmMKQEAgLTAsMCArMSwyMDEzIEBACisvKiBjcnlwdG8vYm4vYm50ZXN0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBhcmUgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBFcmljIFlvdW5nIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGFib3ZlLgorICoKKyAqIFRoZSBiaW5hcnkgcG9seW5vbWlhbCBhcml0aG1ldGljIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSAKKyAqIFNoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYSBvZiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKworLyogVW50aWwgdGhlIGtleS1nZW4gY2FsbGJhY2tzIGFyZSBtb2RpZmllZCB0byB1c2UgbmV3ZXIgcHJvdG90eXBlcywgd2UgYWxsb3cKKyAqIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGZvciBvcGVuc3NsLWludGVybmFsIGNvZGUgKi8KKyNpZmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyN1bmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImVfb3MuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKK2NvbnN0IGludCBudW0wID0gMTAwOyAvKiBudW1iZXIgb2YgdGVzdHMgKi8KK2NvbnN0IGludCBudW0xID0gNTA7ICAvKiBhZGRpdGlvbmFsIHRlc3RzIGZvciBzb21lIGZ1bmN0aW9ucyAqLworY29uc3QgaW50IG51bTIgPSA1OyAgIC8qIG51bWJlciBvZiB0ZXN0cyBmb3Igc2xvdyBmdW5jdGlvbnMgKi8KKworaW50IHRlc3RfYWRkKEJJTyAqYnApOworaW50IHRlc3Rfc3ViKEJJTyAqYnApOworaW50IHRlc3RfbHNoaWZ0MShCSU8gKmJwKTsKK2ludCB0ZXN0X2xzaGlmdChCSU8gKmJwLEJOX0NUWCAqY3R4LEJJR05VTSAqYV8pOworaW50IHRlc3RfcnNoaWZ0MShCSU8gKmJwKTsKK2ludCB0ZXN0X3JzaGlmdChCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2RpdihCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2Rpdl93b3JkKEJJTyAqYnApOworaW50IHRlc3RfZGl2X3JlY3AoQklPICpicCxCTl9DVFggKmN0eCk7CitpbnQgdGVzdF9tdWwoQklPICpicCk7CitpbnQgdGVzdF9zcXIoQklPICpicCxCTl9DVFggKmN0eCk7CitpbnQgdGVzdF9tb250KEJJTyAqYnAsQk5fQ1RYICpjdHgpOworaW50IHRlc3RfbW9kKEJJTyAqYnAsQk5fQ1RYICpjdHgpOworaW50IHRlc3RfbW9kX211bChCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X21vZF9leHAoQklPICpicCxCTl9DVFggKmN0eCk7CitpbnQgdGVzdF9tb2RfZXhwX21vbnRfY29uc3R0aW1lKEJJTyAqYnAsQk5fQ1RYICpjdHgpOworaW50IHRlc3RfZXhwKEJJTyAqYnAsQk5fQ1RYICpjdHgpOworaW50IHRlc3RfZ2YybV9hZGQoQklPICpicCk7CitpbnQgdGVzdF9nZjJtX21vZChCSU8gKmJwKTsKK2ludCB0ZXN0X2dmMm1fbW9kX211bChCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2dmMm1fbW9kX3NxcihCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2dmMm1fbW9kX2ludihCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2dmMm1fbW9kX2RpdihCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2dmMm1fbW9kX2V4cChCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X2dmMm1fbW9kX3NxcnQoQklPICpicCxCTl9DVFggKmN0eCk7CitpbnQgdGVzdF9nZjJtX21vZF9zb2x2ZV9xdWFkKEJJTyAqYnAsQk5fQ1RYICpjdHgpOworaW50IHRlc3Rfa3JvbihCSU8gKmJwLEJOX0NUWCAqY3R4KTsKK2ludCB0ZXN0X3NxcnQoQklPICpicCxCTl9DVFggKmN0eCk7CitpbnQgcmFuZF9uZWcodm9pZCk7CitzdGF0aWMgaW50IHJlc3VsdHM9MDsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbHN0W109Ilx4QzZceDRGXHg0M1x4MDRceDJBXHhFQVx4Q0FceDZFXHg1OFx4MzZceDgwXHg1Qlx4RThceEM5IgorIlx4OUJceDA0XHg1RFx4NDhceDM2XHhDMlx4RkRceDE2XHhDOVx4NjRceEYwIjsKKworc3RhdGljIGNvbnN0IGNoYXIgcm5kX3NlZWRbXSA9ICJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHkiOworCitzdGF0aWMgdm9pZCBtZXNzYWdlKEJJTyAqb3V0LCBjaGFyICptKQorCXsKKwlmcHJpbnRmKHN0ZGVyciwgInRlc3QgJXNcbiIsIG0pOworCUJJT19wdXRzKG91dCwgInByaW50IFwidGVzdCAiKTsKKwlCSU9fcHV0cyhvdXQsIG0pOworCUJJT19wdXRzKG91dCwgIlxcblwiXG4iKTsKKwl9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisJeworCUJOX0NUWCAqY3R4OworCUJJTyAqb3V0OworCWNoYXIgKm91dGZpbGU9TlVMTDsKKworCXJlc3VsdHMgPSAwOworCisJUkFORF9zZWVkKHJuZF9zZWVkLCBzaXplb2Ygcm5kX3NlZWQpOyAvKiBvciBCTl9nZW5lcmF0ZV9wcmltZSBtYXkgZmFpbCAqLworCisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmIChzdHJjbXAoKmFyZ3YsIi1yZXN1bHRzIikgPT0gMCkKKwkJCXJlc3VsdHM9MTsKKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItb3V0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBicmVhazsKKwkJCW91dGZpbGU9ICooKythcmd2KTsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKworCisJY3R4PUJOX0NUWF9uZXcoKTsKKwlpZiAoY3R4ID09IE5VTEwpIEVYSVQoMSk7CisKKwlvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChvdXQgPT0gTlVMTCkgRVhJVCgxKTsKKwlpZiAob3V0ZmlsZSA9PSBOVUxMKQorCQl7CisJCUJJT19zZXRfZnAob3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFCSU9fd3JpdGVfZmlsZW5hbWUob3V0LG91dGZpbGUpKQorCQkJeworCQkJcGVycm9yKG91dGZpbGUpOworCQkJRVhJVCgxKTsKKwkJCX0KKwkJfQorCisJaWYgKCFyZXN1bHRzKQorCQlCSU9fcHV0cyhvdXQsIm9iYXNlPTE2XG5pYmFzZT0xNlxuIik7CisKKwltZXNzYWdlKG91dCwiQk5fYWRkIik7CisJaWYgKCF0ZXN0X2FkZChvdXQpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9zdWIiKTsKKwlpZiAoIXRlc3Rfc3ViKG91dCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX2xzaGlmdDEiKTsKKwlpZiAoIXRlc3RfbHNoaWZ0MShvdXQpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9sc2hpZnQgKGZpeGVkKSIpOworCWlmICghdGVzdF9sc2hpZnQob3V0LGN0eCxCTl9iaW4yYm4obHN0LHNpemVvZihsc3QpLTEsTlVMTCkpKQorCSAgICBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9sc2hpZnQiKTsKKwlpZiAoIXRlc3RfbHNoaWZ0KG91dCxjdHgsTlVMTCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX3JzaGlmdDEiKTsKKwlpZiAoIXRlc3RfcnNoaWZ0MShvdXQpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9yc2hpZnQiKTsKKwlpZiAoIXRlc3RfcnNoaWZ0KG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9zcXIiKTsKKwlpZiAoIXRlc3Rfc3FyKG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9tdWwiKTsKKwlpZiAoIXRlc3RfbXVsKG91dCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX2RpdiIpOworCWlmICghdGVzdF9kaXYob3V0LGN0eCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX2Rpdl93b3JkIik7CisJaWYgKCF0ZXN0X2Rpdl93b3JkKG91dCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX2Rpdl9yZWNwIik7CisJaWYgKCF0ZXN0X2Rpdl9yZWNwKG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9tb2QiKTsKKwlpZiAoIXRlc3RfbW9kKG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9tb2RfbXVsIik7CisJaWYgKCF0ZXN0X21vZF9tdWwob3V0LGN0eCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX21vbnQiKTsKKwlpZiAoIXRlc3RfbW9udChvdXQsY3R4KSkgZ290byBlcnI7CisJKHZvaWQpQklPX2ZsdXNoKG91dCk7CisKKwltZXNzYWdlKG91dCwiQk5fbW9kX2V4cCIpOworCWlmICghdGVzdF9tb2RfZXhwKG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lIik7CisJaWYgKCF0ZXN0X21vZF9leHBfbW9udF9jb25zdHRpbWUob3V0LGN0eCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX2V4cCIpOworCWlmICghdGVzdF9leHAob3V0LGN0eCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX2tyb25lY2tlciIpOworCWlmICghdGVzdF9rcm9uKG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9tb2Rfc3FydCIpOworCWlmICghdGVzdF9zcXJ0KG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9HRjJtX2FkZCIpOworCWlmICghdGVzdF9nZjJtX2FkZChvdXQpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9HRjJtX21vZCIpOworCWlmICghdGVzdF9nZjJtX21vZChvdXQpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9HRjJtX21vZF9tdWwiKTsKKwlpZiAoIXRlc3RfZ2YybV9tb2RfbXVsKG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9HRjJtX21vZF9zcXIiKTsKKwlpZiAoIXRlc3RfZ2YybV9tb2Rfc3FyKG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9HRjJtX21vZF9pbnYiKTsKKwlpZiAoIXRlc3RfZ2YybV9tb2RfaW52KG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9HRjJtX21vZF9kaXYiKTsKKwlpZiAoIXRlc3RfZ2YybV9tb2RfZGl2KG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9HRjJtX21vZF9leHAiKTsKKwlpZiAoIXRlc3RfZ2YybV9tb2RfZXhwKG91dCxjdHgpKSBnb3RvIGVycjsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKworCW1lc3NhZ2Uob3V0LCJCTl9HRjJtX21vZF9zcXJ0Iik7CisJaWYgKCF0ZXN0X2dmMm1fbW9kX3NxcnQob3V0LGN0eCkpIGdvdG8gZXJyOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJbWVzc2FnZShvdXQsIkJOX0dGMm1fbW9kX3NvbHZlX3F1YWQiKTsKKwlpZiAoIXRlc3RfZ2YybV9tb2Rfc29sdmVfcXVhZChvdXQsY3R4KSkgZ290byBlcnI7CisJKHZvaWQpQklPX2ZsdXNoKG91dCk7CisKKwlCTl9DVFhfZnJlZShjdHgpOworCUJJT19mcmVlKG91dCk7CisKKy8qKi8KKwlFWElUKDApOworZXJyOgorCUJJT19wdXRzKG91dCwiMVxuIik7IC8qIG1ha2Ugc3VyZSB0aGUgUGVybCBzY3JpcHQgZmVkIGJ5IGJjIG5vdGljZXMKKwkgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgZmFpbHVyZSwgc2VlIHRlc3RfYm4gaW4gdGVzdC9NYWtlZmlsZS5zc2wqLworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCUVYSVQoMSk7CisJcmV0dXJuKDEpOworCX0KKworaW50IHRlc3RfYWRkKEJJTyAqYnApCisJeworCUJJR05VTSBhLGIsYzsKKwlpbnQgaTsKKworCUJOX2luaXQoJmEpOworCUJOX2luaXQoJmIpOworCUJOX2luaXQoJmMpOworCisJQk5fYm50ZXN0X3JhbmQoJmEsNTEyLDAsMCk7CisJZm9yIChpPTA7IGk8bnVtMDsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKCZiLDQ1MCtpLDAsMCk7CisJCWEubmVnPXJhbmRfbmVnKCk7CisJCWIubmVnPXJhbmRfbmVnKCk7CisJCUJOX2FkZCgmYywmYSwmYik7CisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKwkJCQlCTl9wcmludChicCwmYSk7CisJCQkJQklPX3B1dHMoYnAsIiArICIpOworCQkJCUJOX3ByaW50KGJwLCZiKTsKKwkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJfQorCQkJQk5fcHJpbnQoYnAsJmMpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisJCQl9CisJCWEubmVnPSFhLm5lZzsKKwkJYi5uZWc9IWIubmVnOworCQlCTl9hZGQoJmMsJmMsJmIpOworCQlCTl9hZGQoJmMsJmMsJmEpOworCQlpZighQk5faXNfemVybygmYykpCisJCSAgICB7CisJCSAgICBmcHJpbnRmKHN0ZGVyciwiQWRkIHRlc3QgZmFpbGVkIVxuIik7CisJCSAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJfQorCUJOX2ZyZWUoJmEpOworCUJOX2ZyZWUoJmIpOworCUJOX2ZyZWUoJmMpOworCXJldHVybigxKTsKKwl9CisKK2ludCB0ZXN0X3N1YihCSU8gKmJwKQorCXsKKwlCSUdOVU0gYSxiLGM7CisJaW50IGk7CisKKwlCTl9pbml0KCZhKTsKKwlCTl9pbml0KCZiKTsKKwlCTl9pbml0KCZjKTsKKworCWZvciAoaT0wOyBpPG51bTArbnVtMTsgaSsrKQorCQl7CisJCWlmIChpIDwgbnVtMSkKKwkJCXsKKwkJCUJOX2JudGVzdF9yYW5kKCZhLDUxMiwwLDApOworCQkJQk5fY29weSgmYiwmYSk7CisJCQlpZiAoQk5fc2V0X2JpdCgmYSxpKT09MCkgcmV0dXJuKDApOworCQkJQk5fYWRkX3dvcmQoJmIsaSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUJOX2JudGVzdF9yYW5kKCZiLDQwMCtpLW51bTEsMCwwKTsKKwkJCWEubmVnPXJhbmRfbmVnKCk7CisJCQliLm5lZz1yYW5kX25lZygpOworCQkJfQorCQlCTl9zdWIoJmMsJmEsJmIpOworCQlpZiAoYnAgIT0gTlVMTCkKKwkJCXsKKwkJCWlmICghcmVzdWx0cykKKwkJCQl7CisJCQkJQk5fcHJpbnQoYnAsJmEpOworCQkJCUJJT19wdXRzKGJwLCIgLSAiKTsKKwkJCQlCTl9wcmludChicCwmYik7CisJCQkJQklPX3B1dHMoYnAsIiAtICIpOworCQkJCX0KKwkJCUJOX3ByaW50KGJwLCZjKTsKKwkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJfQorCQlCTl9hZGQoJmMsJmMsJmIpOworCQlCTl9zdWIoJmMsJmMsJmEpOworCQlpZighQk5faXNfemVybygmYykpCisJCSAgICB7CisJCSAgICBmcHJpbnRmKHN0ZGVyciwiU3VidHJhY3QgdGVzdCBmYWlsZWQhXG4iKTsKKwkJICAgIHJldHVybiAwOworCQkgICAgfQorCQl9CisJQk5fZnJlZSgmYSk7CisJQk5fZnJlZSgmYik7CisJQk5fZnJlZSgmYyk7CisJcmV0dXJuKDEpOworCX0KKworaW50IHRlc3RfZGl2KEJJTyAqYnAsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gYSxiLGMsZCxlOworCWludCBpOworCisJQk5faW5pdCgmYSk7CisJQk5faW5pdCgmYik7CisJQk5faW5pdCgmYyk7CisJQk5faW5pdCgmZCk7CisJQk5faW5pdCgmZSk7CisKKwlmb3IgKGk9MDsgaTxudW0wK251bTE7IGkrKykKKwkJeworCQlpZiAoaSA8IG51bTEpCisJCQl7CisJCQlCTl9ibnRlc3RfcmFuZCgmYSw0MDAsMCwwKTsKKwkJCUJOX2NvcHkoJmIsJmEpOworCQkJQk5fbHNoaWZ0KCZhLCZhLGkpOworCQkJQk5fYWRkX3dvcmQoJmEsaSk7CisJCQl9CisJCWVsc2UKKwkJCUJOX2JudGVzdF9yYW5kKCZiLDUwKzMqKGktbnVtMSksMCwwKTsKKwkJYS5uZWc9cmFuZF9uZWcoKTsKKwkJYi5uZWc9cmFuZF9uZWcoKTsKKwkJQk5fZGl2KCZkLCZjLCZhLCZiLGN0eCk7CisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKwkJCQlCTl9wcmludChicCwmYSk7CisJCQkJQklPX3B1dHMoYnAsIiAvICIpOworCQkJCUJOX3ByaW50KGJwLCZiKTsKKwkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJfQorCQkJQk5fcHJpbnQoYnAsJmQpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisKKwkJCWlmICghcmVzdWx0cykKKwkJCQl7CisJCQkJQk5fcHJpbnQoYnAsJmEpOworCQkJCUJJT19wdXRzKGJwLCIgJSAiKTsKKwkJCQlCTl9wcmludChicCwmYik7CisJCQkJQklPX3B1dHMoYnAsIiAtICIpOworCQkJCX0KKwkJCUJOX3ByaW50KGJwLCZjKTsKKwkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJfQorCQlCTl9tdWwoJmUsJmQsJmIsY3R4KTsKKwkJQk5fYWRkKCZkLCZlLCZjKTsKKwkJQk5fc3ViKCZkLCZkLCZhKTsKKwkJaWYoIUJOX2lzX3plcm8oJmQpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIkRpdmlzaW9uIHRlc3QgZmFpbGVkIVxuIik7CisJCSAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJfQorCUJOX2ZyZWUoJmEpOworCUJOX2ZyZWUoJmIpOworCUJOX2ZyZWUoJmMpOworCUJOX2ZyZWUoJmQpOworCUJOX2ZyZWUoJmUpOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyB2b2lkIHByaW50X3dvcmQoQklPICpicCxCTl9VTE9ORyB3KQorCXsKKyNpZmRlZiBTSVhUWV9GT1VSX0JJVAorCWlmIChzaXplb2YodykgPiBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCXsKKwkJdW5zaWduZWQgbG9uZwloPSh1bnNpZ25lZCBsb25nKSh3Pj4zMiksCisJCQkJbD0odW5zaWduZWQgbG9uZykodyk7CisKKwkJaWYgKGgpCUJJT19wcmludGYoYnAsIiVsWCUwOGxYIixoLGwpOworCQllbHNlCUJJT19wcmludGYoYnAsIiVsWCIsbCk7CisJCXJldHVybjsKKwkJfQorI2VuZGlmCisJQklPX3ByaW50ZihicCxCTl9IRVhfRk1UMSx3KTsKKwl9CisKK2ludCB0ZXN0X2Rpdl93b3JkKEJJTyAqYnApCisJeworCUJJR05VTSAgIGEsYjsKKwlCTl9VTE9ORyByLHM7CisJaW50IGk7CisKKwlCTl9pbml0KCZhKTsKKwlCTl9pbml0KCZiKTsKKworCWZvciAoaT0wOyBpPG51bTA7IGkrKykKKwkJeworCQlkbyB7CisJCQlCTl9ibnRlc3RfcmFuZCgmYSw1MTIsLTEsMCk7CisJCQlCTl9ibnRlc3RfcmFuZCgmYixCTl9CSVRTMiwtMSwwKTsKKwkJCXMgPSBiLmRbMF07CisJCX0gd2hpbGUgKCFzKTsKKworCQlCTl9jb3B5KCZiLCAmYSk7CisJCXIgPSBCTl9kaXZfd29yZCgmYiwgcyk7CisKKwkJaWYgKGJwICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIXJlc3VsdHMpCisJCQkJeworCQkJCUJOX3ByaW50KGJwLCZhKTsKKwkJCQlCSU9fcHV0cyhicCwiIC8gIik7CisJCQkJcHJpbnRfd29yZChicCxzKTsKKwkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJfQorCQkJQk5fcHJpbnQoYnAsJmIpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisKKwkJCWlmICghcmVzdWx0cykKKwkJCQl7CisJCQkJQk5fcHJpbnQoYnAsJmEpOworCQkJCUJJT19wdXRzKGJwLCIgJSAiKTsKKwkJCQlwcmludF93b3JkKGJwLHMpOworCQkJCUJJT19wdXRzKGJwLCIgLSAiKTsKKwkJCQl9CisJCQlwcmludF93b3JkKGJwLHIpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisJCQl9CisJCUJOX211bF93b3JkKCZiLHMpOworCQlCTl9hZGRfd29yZCgmYixyKTsKKwkJQk5fc3ViKCZiLCZhLCZiKTsKKwkJaWYoIUJOX2lzX3plcm8oJmIpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIkRpdmlzaW9uICh3b3JkKSB0ZXN0IGZhaWxlZCFcbiIpOworCQkgICAgcmV0dXJuIDA7CisJCSAgICB9CisJCX0KKwlCTl9mcmVlKCZhKTsKKwlCTl9mcmVlKCZiKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgdGVzdF9kaXZfcmVjcChCSU8gKmJwLCBCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNIGEsYixjLGQsZTsKKwlCTl9SRUNQX0NUWCByZWNwOworCWludCBpOworCisJQk5fUkVDUF9DVFhfaW5pdCgmcmVjcCk7CisJQk5faW5pdCgmYSk7CisJQk5faW5pdCgmYik7CisJQk5faW5pdCgmYyk7CisJQk5faW5pdCgmZCk7CisJQk5faW5pdCgmZSk7CisKKwlmb3IgKGk9MDsgaTxudW0wK251bTE7IGkrKykKKwkJeworCQlpZiAoaSA8IG51bTEpCisJCQl7CisJCQlCTl9ibnRlc3RfcmFuZCgmYSw0MDAsMCwwKTsKKwkJCUJOX2NvcHkoJmIsJmEpOworCQkJQk5fbHNoaWZ0KCZhLCZhLGkpOworCQkJQk5fYWRkX3dvcmQoJmEsaSk7CisJCQl9CisJCWVsc2UKKwkJCUJOX2JudGVzdF9yYW5kKCZiLDUwKzMqKGktbnVtMSksMCwwKTsKKwkJYS5uZWc9cmFuZF9uZWcoKTsKKwkJYi5uZWc9cmFuZF9uZWcoKTsKKwkJQk5fUkVDUF9DVFhfc2V0KCZyZWNwLCZiLGN0eCk7CisJCUJOX2Rpdl9yZWNwKCZkLCZjLCZhLCZyZWNwLGN0eCk7CisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKwkJCQlCTl9wcmludChicCwmYSk7CisJCQkJQklPX3B1dHMoYnAsIiAvICIpOworCQkJCUJOX3ByaW50KGJwLCZiKTsKKwkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJfQorCQkJQk5fcHJpbnQoYnAsJmQpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisKKwkJCWlmICghcmVzdWx0cykKKwkJCQl7CisJCQkJQk5fcHJpbnQoYnAsJmEpOworCQkJCUJJT19wdXRzKGJwLCIgJSAiKTsKKwkJCQlCTl9wcmludChicCwmYik7CisJCQkJQklPX3B1dHMoYnAsIiAtICIpOworCQkJCX0KKwkJCUJOX3ByaW50KGJwLCZjKTsKKwkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJfQorCQlCTl9tdWwoJmUsJmQsJmIsY3R4KTsKKwkJQk5fYWRkKCZkLCZlLCZjKTsKKwkJQk5fc3ViKCZkLCZkLCZhKTsKKwkJaWYoIUJOX2lzX3plcm8oJmQpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIlJlY2lwcm9jYWwgZGl2aXNpb24gdGVzdCBmYWlsZWQhXG4iKTsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJhPSIpOworCQkgICAgQk5fcHJpbnRfZnAoc3RkZXJyLCZhKTsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJcbmI9Iik7CisJCSAgICBCTl9wcmludF9mcChzdGRlcnIsJmIpOworCQkgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CisJCSAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJfQorCUJOX2ZyZWUoJmEpOworCUJOX2ZyZWUoJmIpOworCUJOX2ZyZWUoJmMpOworCUJOX2ZyZWUoJmQpOworCUJOX2ZyZWUoJmUpOworCUJOX1JFQ1BfQ1RYX2ZyZWUoJnJlY3ApOworCXJldHVybigxKTsKKwl9CisKK2ludCB0ZXN0X211bChCSU8gKmJwKQorCXsKKwlCSUdOVU0gYSxiLGMsZCxlOworCWludCBpOworCUJOX0NUWCAqY3R4OworCisJY3R4ID0gQk5fQ1RYX25ldygpOworCWlmIChjdHggPT0gTlVMTCkgRVhJVCgxKTsKKwkKKwlCTl9pbml0KCZhKTsKKwlCTl9pbml0KCZiKTsKKwlCTl9pbml0KCZjKTsKKwlCTl9pbml0KCZkKTsKKwlCTl9pbml0KCZlKTsKKworCWZvciAoaT0wOyBpPG51bTArbnVtMTsgaSsrKQorCQl7CisJCWlmIChpIDw9IG51bTEpCisJCQl7CisJCQlCTl9ibnRlc3RfcmFuZCgmYSwxMDAsMCwwKTsKKwkJCUJOX2JudGVzdF9yYW5kKCZiLDEwMCwwLDApOworCQkJfQorCQllbHNlCisJCQlCTl9ibnRlc3RfcmFuZCgmYixpLW51bTEsMCwwKTsKKwkJYS5uZWc9cmFuZF9uZWcoKTsKKwkJYi5uZWc9cmFuZF9uZWcoKTsKKwkJQk5fbXVsKCZjLCZhLCZiLGN0eCk7CisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKwkJCQlCTl9wcmludChicCwmYSk7CisJCQkJQklPX3B1dHMoYnAsIiAqICIpOworCQkJCUJOX3ByaW50KGJwLCZiKTsKKwkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJfQorCQkJQk5fcHJpbnQoYnAsJmMpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisJCQl9CisJCUJOX2RpdigmZCwmZSwmYywmYSxjdHgpOworCQlCTl9zdWIoJmQsJmQsJmIpOworCQlpZighQk5faXNfemVybygmZCkgfHwgIUJOX2lzX3plcm8oJmUpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIk11bHRpcGxpY2F0aW9uIHRlc3QgZmFpbGVkIVxuIik7CisJCSAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJfQorCUJOX2ZyZWUoJmEpOworCUJOX2ZyZWUoJmIpOworCUJOX2ZyZWUoJmMpOworCUJOX2ZyZWUoJmQpOworCUJOX2ZyZWUoJmUpOworCUJOX0NUWF9mcmVlKGN0eCk7CisJcmV0dXJuKDEpOworCX0KKworaW50IHRlc3Rfc3FyKEJJTyAqYnAsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gYSxjLGQsZTsKKwlpbnQgaTsKKworCUJOX2luaXQoJmEpOworCUJOX2luaXQoJmMpOworCUJOX2luaXQoJmQpOworCUJOX2luaXQoJmUpOworCisJZm9yIChpPTA7IGk8bnVtMDsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKCZhLDQwK2kqMTAsMCwwKTsKKwkJYS5uZWc9cmFuZF9uZWcoKTsKKwkJQk5fc3FyKCZjLCZhLGN0eCk7CisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKwkJCQlCTl9wcmludChicCwmYSk7CisJCQkJQklPX3B1dHMoYnAsIiAqICIpOworCQkJCUJOX3ByaW50KGJwLCZhKTsKKwkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJfQorCQkJQk5fcHJpbnQoYnAsJmMpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisJCQl9CisJCUJOX2RpdigmZCwmZSwmYywmYSxjdHgpOworCQlCTl9zdWIoJmQsJmQsJmEpOworCQlpZighQk5faXNfemVybygmZCkgfHwgIUJOX2lzX3plcm8oJmUpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIlNxdWFyZSB0ZXN0IGZhaWxlZCFcbiIpOworCQkgICAgcmV0dXJuIDA7CisJCSAgICB9CisJCX0KKwlCTl9mcmVlKCZhKTsKKwlCTl9mcmVlKCZjKTsKKwlCTl9mcmVlKCZkKTsKKwlCTl9mcmVlKCZlKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgdGVzdF9tb250KEJJTyAqYnAsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gYSxiLGMsZCxBLEI7CisJQklHTlVNIG47CisJaW50IGk7CisJQk5fTU9OVF9DVFggKm1vbnQ7CisKKwlCTl9pbml0KCZhKTsKKwlCTl9pbml0KCZiKTsKKwlCTl9pbml0KCZjKTsKKwlCTl9pbml0KCZkKTsKKwlCTl9pbml0KCZBKTsKKwlCTl9pbml0KCZCKTsKKwlCTl9pbml0KCZuKTsKKworCW1vbnQ9Qk5fTU9OVF9DVFhfbmV3KCk7CisJaWYgKG1vbnQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlCTl9ibnRlc3RfcmFuZCgmYSwxMDAsMCwwKTsgLyoqLworCUJOX2JudGVzdF9yYW5kKCZiLDEwMCwwLDApOyAvKiovCisJZm9yIChpPTA7IGk8bnVtMjsgaSsrKQorCQl7CisJCWludCBiaXRzID0gKDIwMCooaSsxKSkvbnVtMjsKKworCQlpZiAoYml0cyA9PSAwKQorCQkJY29udGludWU7CisJCUJOX2JudGVzdF9yYW5kKCZuLGJpdHMsMCwxKTsKKwkJQk5fTU9OVF9DVFhfc2V0KG1vbnQsJm4sY3R4KTsKKworCQlCTl9ubm1vZCgmYSwmYSwmbixjdHgpOworCQlCTl9ubm1vZCgmYiwmYiwmbixjdHgpOworCisJCUJOX3RvX21vbnRnb21lcnkoJkEsJmEsbW9udCxjdHgpOworCQlCTl90b19tb250Z29tZXJ5KCZCLCZiLG1vbnQsY3R4KTsKKworCQlCTl9tb2RfbXVsX21vbnRnb21lcnkoJmMsJkEsJkIsbW9udCxjdHgpOy8qKi8KKwkJQk5fZnJvbV9tb250Z29tZXJ5KCZBLCZjLG1vbnQsY3R4KTsvKiovCisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKyNpZmRlZiB1bmRlZgorZnByaW50ZihzdGRlcnIsIiVkICogJWQgJSUgJWRcbiIsCitCTl9udW1fYml0cygmYSksCitCTl9udW1fYml0cygmYiksCitCTl9udW1fYml0cyhtb250LT5OKSk7CisjZW5kaWYKKwkJCQlCTl9wcmludChicCwmYSk7CisJCQkJQklPX3B1dHMoYnAsIiAqICIpOworCQkJCUJOX3ByaW50KGJwLCZiKTsKKwkJCQlCSU9fcHV0cyhicCwiICUgIik7CisJCQkJQk5fcHJpbnQoYnAsJihtb250LT5OKSk7CisJCQkJQklPX3B1dHMoYnAsIiAtICIpOworCQkJCX0KKwkJCUJOX3ByaW50KGJwLCZBKTsKKwkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJfQorCQlCTl9tb2RfbXVsKCZkLCZhLCZiLCZuLGN0eCk7CisJCUJOX3N1YigmZCwmZCwmQSk7CisJCWlmKCFCTl9pc196ZXJvKCZkKSkKKwkJICAgIHsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIHRlc3QgZmFpbGVkIVxuIik7CisJCSAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJfQorCUJOX01PTlRfQ1RYX2ZyZWUobW9udCk7CisJQk5fZnJlZSgmYSk7CisJQk5fZnJlZSgmYik7CisJQk5fZnJlZSgmYyk7CisJQk5fZnJlZSgmZCk7CisJQk5fZnJlZSgmQSk7CisJQk5fZnJlZSgmQik7CisJQk5fZnJlZSgmbik7CisJcmV0dXJuKDEpOworCX0KKworaW50IHRlc3RfbW9kKEJJTyAqYnAsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmEsKmIsKmMsKmQsKmU7CisJaW50IGk7CisKKwlhPUJOX25ldygpOworCWI9Qk5fbmV3KCk7CisJYz1CTl9uZXcoKTsKKwlkPUJOX25ldygpOworCWU9Qk5fbmV3KCk7CisKKwlCTl9ibnRlc3RfcmFuZChhLDEwMjQsMCwwKTsgLyoqLworCWZvciAoaT0wOyBpPG51bTA7IGkrKykKKwkJeworCQlCTl9ibnRlc3RfcmFuZChiLDQ1MCtpKjEwLDAsMCk7IC8qKi8KKwkJYS0+bmVnPXJhbmRfbmVnKCk7CisJCWItPm5lZz1yYW5kX25lZygpOworCQlCTl9tb2QoYyxhLGIsY3R4KTsvKiovCisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKwkJCQlCTl9wcmludChicCxhKTsKKwkJCQlCSU9fcHV0cyhicCwiICUgIik7CisJCQkJQk5fcHJpbnQoYnAsYik7CisJCQkJQklPX3B1dHMoYnAsIiAtICIpOworCQkJCX0KKwkJCUJOX3ByaW50KGJwLGMpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisJCQl9CisJCUJOX2RpdihkLGUsYSxiLGN0eCk7CisJCUJOX3N1YihlLGUsYyk7CisJCWlmKCFCTl9pc196ZXJvKGUpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIk1vZHVsbyB0ZXN0IGZhaWxlZCFcbiIpOworCQkgICAgcmV0dXJuIDA7CisJCSAgICB9CisJCX0KKwlCTl9mcmVlKGEpOworCUJOX2ZyZWUoYik7CisJQk5fZnJlZShjKTsKKwlCTl9mcmVlKGQpOworCUJOX2ZyZWUoZSk7CisJcmV0dXJuKDEpOworCX0KKworaW50IHRlc3RfbW9kX211bChCSU8gKmJwLCBCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNICphLCpiLCpjLCpkLCplOworCWludCBpLGo7CisKKwlhPUJOX25ldygpOworCWI9Qk5fbmV3KCk7CisJYz1CTl9uZXcoKTsKKwlkPUJOX25ldygpOworCWU9Qk5fbmV3KCk7CisKKwlmb3IgKGo9MDsgajwzOyBqKyspIHsKKwlCTl9ibnRlc3RfcmFuZChjLDEwMjQsMCwwKTsgLyoqLworCWZvciAoaT0wOyBpPG51bTA7IGkrKykKKwkJeworCQlCTl9ibnRlc3RfcmFuZChhLDQ3NStpKjEwLDAsMCk7IC8qKi8KKwkJQk5fYm50ZXN0X3JhbmQoYiw0MjUraSoxMSwwLDApOyAvKiovCisJCWEtPm5lZz1yYW5kX25lZygpOworCQliLT5uZWc9cmFuZF9uZWcoKTsKKwkJaWYgKCFCTl9tb2RfbXVsKGUsYSxiLGMsY3R4KSkKKwkJCXsKKwkJCXVuc2lnbmVkIGxvbmcgbDsKKworCQkJd2hpbGUgKChsPUVSUl9nZXRfZXJyb3IoKSkpCisJCQkJZnByaW50ZihzdGRlcnIsIkVSUk9SOiVzXG4iLAorCQkJCQlFUlJfZXJyb3Jfc3RyaW5nKGwsTlVMTCkpOworCQkJRVhJVCgxKTsKKwkJCX0KKwkJaWYgKGJwICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIXJlc3VsdHMpCisJCQkJeworCQkJCUJOX3ByaW50KGJwLGEpOworCQkJCUJJT19wdXRzKGJwLCIgKiAiKTsKKwkJCQlCTl9wcmludChicCxiKTsKKwkJCQlCSU9fcHV0cyhicCwiICUgIik7CisJCQkJQk5fcHJpbnQoYnAsYyk7CisJCQkJaWYgKChhLT5uZWcgXiBiLT5uZWcpICYmICFCTl9pc196ZXJvKGUpKQorCQkJCQl7CisJCQkJCS8qIElmICAoYSpiKSAlIGMgIGlzIG5lZ2F0aXZlLCAgYyAgbXVzdCBiZSBhZGRlZAorCQkJCQkgKiBpbiBvcmRlciB0byBvYnRhaW4gdGhlIG5vcm1hbGl6ZWQgcmVtYWluZGVyCisJCQkJCSAqIChuZXcgd2l0aCBPcGVuU1NMIDAuOS43LCBwcmV2aW91cyB2ZXJzaW9ucyBvZgorCQkJCQkgKiBCTl9tb2RfbXVsIGNvdWxkIGdlbmVyYXRlIG5lZ2F0aXZlIHJlc3VsdHMpCisJCQkJCSAqLworCQkJCQlCSU9fcHV0cyhicCwiICsgIik7CisJCQkJCUJOX3ByaW50KGJwLGMpOworCQkJCQl9CisJCQkJQklPX3B1dHMoYnAsIiAtICIpOworCQkJCX0KKwkJCUJOX3ByaW50KGJwLGUpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisJCQl9CisJCUJOX211bChkLGEsYixjdHgpOworCQlCTl9zdWIoZCxkLGUpOworCQlCTl9kaXYoYSxiLGQsYyxjdHgpOworCQlpZighQk5faXNfemVybyhiKSkKKwkJICAgIHsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJNb2R1bG8gbXVsdGlwbHkgdGVzdCBmYWlsZWQhXG4iKTsKKwkJICAgIEVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKwkJICAgIHJldHVybiAwOworCQkgICAgfQorCQl9CisJfQorCUJOX2ZyZWUoYSk7CisJQk5fZnJlZShiKTsKKwlCTl9mcmVlKGMpOworCUJOX2ZyZWUoZCk7CisJQk5fZnJlZShlKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgdGVzdF9tb2RfZXhwKEJJTyAqYnAsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmEsKmIsKmMsKmQsKmU7CisJaW50IGk7CisKKwlhPUJOX25ldygpOworCWI9Qk5fbmV3KCk7CisJYz1CTl9uZXcoKTsKKwlkPUJOX25ldygpOworCWU9Qk5fbmV3KCk7CisKKwlCTl9ibnRlc3RfcmFuZChjLDMwLDAsMSk7IC8qIG11c3QgYmUgb2RkIGZvciBtb250Z29tZXJ5ICovCisJZm9yIChpPTA7IGk8bnVtMjsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKGEsMjAraSo1LDAsMCk7IC8qKi8KKwkJQk5fYm50ZXN0X3JhbmQoYiwyK2ksMCwwKTsgLyoqLworCisJCWlmICghQk5fbW9kX2V4cChkLGEsYixjLGN0eCkpCisJCQlyZXR1cm4oMCk7CisKKwkJaWYgKGJwICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIXJlc3VsdHMpCisJCQkJeworCQkJCUJOX3ByaW50KGJwLGEpOworCQkJCUJJT19wdXRzKGJwLCIgXiAiKTsKKwkJCQlCTl9wcmludChicCxiKTsKKwkJCQlCSU9fcHV0cyhicCwiICUgIik7CisJCQkJQk5fcHJpbnQoYnAsYyk7CisJCQkJQklPX3B1dHMoYnAsIiAtICIpOworCQkJCX0KKwkJCUJOX3ByaW50KGJwLGQpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisJCQl9CisJCUJOX2V4cChlLGEsYixjdHgpOworCQlCTl9zdWIoZSxlLGQpOworCQlCTl9kaXYoYSxiLGUsYyxjdHgpOworCQlpZighQk5faXNfemVybyhiKSkKKwkJICAgIHsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJNb2R1bG8gZXhwb25lbnRpYXRpb24gdGVzdCBmYWlsZWQhXG4iKTsKKwkJICAgIHJldHVybiAwOworCQkgICAgfQorCQl9CisJQk5fZnJlZShhKTsKKwlCTl9mcmVlKGIpOworCUJOX2ZyZWUoYyk7CisJQk5fZnJlZShkKTsKKwlCTl9mcmVlKGUpOworCXJldHVybigxKTsKKwl9CisKK2ludCB0ZXN0X21vZF9leHBfbW9udF9jb25zdHRpbWUoQklPICpicCwgQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqYSwqYiwqYywqZCwqZTsKKwlpbnQgaTsKKworCWE9Qk5fbmV3KCk7CisJYj1CTl9uZXcoKTsKKwljPUJOX25ldygpOworCWQ9Qk5fbmV3KCk7CisJZT1CTl9uZXcoKTsKKworCUJOX2JudGVzdF9yYW5kKGMsMzAsMCwxKTsgLyogbXVzdCBiZSBvZGQgZm9yIG1vbnRnb21lcnkgKi8KKwlmb3IgKGk9MDsgaTxudW0yOyBpKyspCisJCXsKKwkJQk5fYm50ZXN0X3JhbmQoYSwyMCtpKjUsMCwwKTsgLyoqLworCQlCTl9ibnRlc3RfcmFuZChiLDIraSwwLDApOyAvKiovCisKKwkJaWYgKCFCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKGQsYSxiLGMsY3R4LE5VTEwpKQorCQkJcmV0dXJuKDAwKTsKKworCQlpZiAoYnAgIT0gTlVMTCkKKwkJCXsKKwkJCWlmICghcmVzdWx0cykKKwkJCQl7CisJCQkJQk5fcHJpbnQoYnAsYSk7CisJCQkJQklPX3B1dHMoYnAsIiBeICIpOworCQkJCUJOX3ByaW50KGJwLGIpOworCQkJCUJJT19wdXRzKGJwLCIgJSAiKTsKKwkJCQlCTl9wcmludChicCxjKTsKKwkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJfQorCQkJQk5fcHJpbnQoYnAsZCk7CisJCQlCSU9fcHV0cyhicCwiXG4iKTsKKwkJCX0KKwkJQk5fZXhwKGUsYSxiLGN0eCk7CisJCUJOX3N1YihlLGUsZCk7CisJCUJOX2RpdihhLGIsZSxjLGN0eCk7CisJCWlmKCFCTl9pc196ZXJvKGIpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIk1vZHVsbyBleHBvbmVudGlhdGlvbiB0ZXN0IGZhaWxlZCFcbiIpOworCQkgICAgcmV0dXJuIDA7CisJCSAgICB9CisJCX0KKwlCTl9mcmVlKGEpOworCUJOX2ZyZWUoYik7CisJQk5fZnJlZShjKTsKKwlCTl9mcmVlKGQpOworCUJOX2ZyZWUoZSk7CisJcmV0dXJuKDEpOworCX0KKworaW50IHRlc3RfZXhwKEJJTyAqYnAsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmEsKmIsKmQsKmUsKm9uZTsKKwlpbnQgaTsKKworCWE9Qk5fbmV3KCk7CisJYj1CTl9uZXcoKTsKKwlkPUJOX25ldygpOworCWU9Qk5fbmV3KCk7CisJb25lPUJOX25ldygpOworCUJOX29uZShvbmUpOworCisJZm9yIChpPTA7IGk8bnVtMjsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKGEsMjAraSo1LDAsMCk7IC8qKi8KKwkJQk5fYm50ZXN0X3JhbmQoYiwyK2ksMCwwKTsgLyoqLworCisJCWlmIChCTl9leHAoZCxhLGIsY3R4KSA8PSAwKQorCQkJcmV0dXJuKDApOworCisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKwkJCQlCTl9wcmludChicCxhKTsKKwkJCQlCSU9fcHV0cyhicCwiIF4gIik7CisJCQkJQk5fcHJpbnQoYnAsYik7CisJCQkJQklPX3B1dHMoYnAsIiAtICIpOworCQkJCX0KKwkJCUJOX3ByaW50KGJwLGQpOworCQkJQklPX3B1dHMoYnAsIlxuIik7CisJCQl9CisJCUJOX29uZShlKTsKKwkJZm9yKCA7ICFCTl9pc196ZXJvKGIpIDsgQk5fc3ViKGIsYixvbmUpKQorCQkgICAgQk5fbXVsKGUsZSxhLGN0eCk7CisJCUJOX3N1YihlLGUsZCk7CisJCWlmKCFCTl9pc196ZXJvKGUpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIkV4cG9uZW50aWF0aW9uIHRlc3QgZmFpbGVkIVxuIik7CisJCSAgICByZXR1cm4gMDsKKwkJICAgIH0KKwkJfQorCUJOX2ZyZWUoYSk7CisJQk5fZnJlZShiKTsKKwlCTl9mcmVlKGQpOworCUJOX2ZyZWUoZSk7CisJQk5fZnJlZShvbmUpOworCXJldHVybigxKTsKKwl9CisKK2ludCB0ZXN0X2dmMm1fYWRkKEJJTyAqYnApCisJeworCUJJR05VTSBhLGIsYzsKKwlpbnQgaSwgcmV0ID0gMDsKKworCUJOX2luaXQoJmEpOworCUJOX2luaXQoJmIpOworCUJOX2luaXQoJmMpOworCisJZm9yIChpPTA7IGk8bnVtMDsgaSsrKQorCQl7CisJCUJOX3JhbmQoJmEsNTEyLDAsMCk7CisJCUJOX2NvcHkoJmIsIEJOX3ZhbHVlX29uZSgpKTsKKwkJYS5uZWc9cmFuZF9uZWcoKTsKKwkJYi5uZWc9cmFuZF9uZWcoKTsKKwkJQk5fR0YybV9hZGQoJmMsJmEsJmIpOworI2lmIDAgLyogbWFrZSB0ZXN0IHVzZXMgb3VwdXQgaW4gYmMgYnV0IGJjIGNhbid0IGhhbmRsZSBHRigyXm0pIGFyaXRobWV0aWMgKi8KKwkJaWYgKGJwICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIXJlc3VsdHMpCisJCQkJeworCQkJCUJOX3ByaW50KGJwLCZhKTsKKwkJCQlCSU9fcHV0cyhicCwiIF4gIik7CisJCQkJQk5fcHJpbnQoYnAsJmIpOworCQkJCUJJT19wdXRzKGJwLCIgPSAiKTsKKwkJCQl9CisJCQlCTl9wcmludChicCwmYyk7CisJCQlCSU9fcHV0cyhicCwiXG4iKTsKKwkJCX0KKyNlbmRpZgorCQkvKiBUZXN0IHRoYXQgdHdvIGFkZGVkIHZhbHVlcyBoYXZlIHRoZSBjb3JyZWN0IHBhcml0eS4gKi8KKwkJaWYoKEJOX2lzX29kZCgmYSkgJiYgQk5faXNfb2RkKCZjKSkgfHwgKCFCTl9pc19vZGQoJmEpICYmICFCTl9pc19vZGQoJmMpKSkKKwkJCXsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJHRigyXm0pIGFkZGl0aW9uIHRlc3QgKGEpIGZhaWxlZCFcbiIpOworCQkJZ290byBlcnI7CisJCQl9CisJCUJOX0dGMm1fYWRkKCZjLCZjLCZjKTsKKwkJLyogVGVzdCB0aGF0IGMgKyBjID0gMC4gKi8KKwkJaWYoIUJOX2lzX3plcm8oJmMpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIkdGKDJebSkgYWRkaXRpb24gdGVzdCAoYikgZmFpbGVkIVxuIik7CisJCQlnb3RvIGVycjsKKwkJICAgIH0KKwkJfQorCXJldCA9IDE7CisgIGVycjoKKwlCTl9mcmVlKCZhKTsKKwlCTl9mcmVlKCZiKTsKKwlCTl9mcmVlKCZjKTsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IHRlc3RfZ2YybV9tb2QoQklPICpicCkKKwl7CisJQklHTlVNICphLCpiWzJdLCpjLCpkLCplOworCWludCBpLCBqLCByZXQgPSAwOworCWludCBwMFtdID0gezE2Myw3LDYsMywwLC0xfTsKKwlpbnQgcDFbXSA9IHsxOTMsMTUsMCwtMX07CisKKwlhPUJOX25ldygpOworCWJbMF09Qk5fbmV3KCk7CisJYlsxXT1CTl9uZXcoKTsKKwljPUJOX25ldygpOworCWQ9Qk5fbmV3KCk7CisJZT1CTl9uZXcoKTsKKworCUJOX0dGMm1fYXJyMnBvbHkocDAsIGJbMF0pOworCUJOX0dGMm1fYXJyMnBvbHkocDEsIGJbMV0pOworCisJZm9yIChpPTA7IGk8bnVtMDsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKGEsIDEwMjQsIDAsIDApOworCQlmb3IgKGo9MDsgaiA8IDI7IGorKykKKwkJCXsKKwkJCUJOX0dGMm1fbW9kKGMsIGEsIGJbal0pOworI2lmIDAgLyogbWFrZSB0ZXN0IHVzZXMgb3VwdXQgaW4gYmMgYnV0IGJjIGNhbid0IGhhbmRsZSBHRigyXm0pIGFyaXRobWV0aWMgKi8KKwkJCWlmIChicCAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIXJlc3VsdHMpCisJCQkJCXsKKwkJCQkJQk5fcHJpbnQoYnAsYSk7CisJCQkJCUJJT19wdXRzKGJwLCIgJSAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsYltqXSk7CisJCQkJCUJJT19wdXRzKGJwLCIgLSAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsYyk7CisJCQkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQlCTl9HRjJtX2FkZChkLCBhLCBjKTsKKwkJCUJOX0dGMm1fbW9kKGUsIGQsIGJbal0pOworCQkJLyogVGVzdCB0aGF0IGEgKyAoYSBtb2QgcCkgbW9kIHAgPT0gMC4gKi8KKwkJCWlmKCFCTl9pc196ZXJvKGUpKQorCQkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiR0YoMl5tKSBtb2R1bG8gdGVzdCBmYWlsZWQhXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCX0KKwlyZXQgPSAxOworICBlcnI6CisJQk5fZnJlZShhKTsKKwlCTl9mcmVlKGJbMF0pOworCUJOX2ZyZWUoYlsxXSk7CisJQk5fZnJlZShjKTsKKwlCTl9mcmVlKGQpOworCUJOX2ZyZWUoZSk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCB0ZXN0X2dmMm1fbW9kX211bChCSU8gKmJwLEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmEsKmJbMl0sKmMsKmQsKmUsKmYsKmcsKmg7CisJaW50IGksIGosIHJldCA9IDA7CisJaW50IHAwW10gPSB7MTYzLDcsNiwzLDAsLTF9OworCWludCBwMVtdID0gezE5MywxNSwwLC0xfTsKKworCWE9Qk5fbmV3KCk7CisJYlswXT1CTl9uZXcoKTsKKwliWzFdPUJOX25ldygpOworCWM9Qk5fbmV3KCk7CisJZD1CTl9uZXcoKTsKKwllPUJOX25ldygpOworCWY9Qk5fbmV3KCk7CisJZz1CTl9uZXcoKTsKKwloPUJOX25ldygpOworCisJQk5fR0YybV9hcnIycG9seShwMCwgYlswXSk7CisJQk5fR0YybV9hcnIycG9seShwMSwgYlsxXSk7CisKKwlmb3IgKGk9MDsgaTxudW0wOyBpKyspCisJCXsKKwkJQk5fYm50ZXN0X3JhbmQoYSwgMTAyNCwgMCwgMCk7CisJCUJOX2JudGVzdF9yYW5kKGMsIDEwMjQsIDAsIDApOworCQlCTl9ibnRlc3RfcmFuZChkLCAxMDI0LCAwLCAwKTsKKwkJZm9yIChqPTA7IGogPCAyOyBqKyspCisJCQl7CisJCQlCTl9HRjJtX21vZF9tdWwoZSwgYSwgYywgYltqXSwgY3R4KTsKKyNpZiAwIC8qIG1ha2UgdGVzdCB1c2VzIG91cHV0IGluIGJjIGJ1dCBiYyBjYW4ndCBoYW5kbGUgR0YoMl5tKSBhcml0aG1ldGljICovCisJCQlpZiAoYnAgIT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKCFyZXN1bHRzKQorCQkJCQl7CisJCQkJCUJOX3ByaW50KGJwLGEpOworCQkJCQlCSU9fcHV0cyhicCwiICogIik7CisJCQkJCUJOX3ByaW50KGJwLGMpOworCQkJCQlCSU9fcHV0cyhicCwiICUgIik7CisJCQkJCUJOX3ByaW50KGJwLGJbal0pOworCQkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJCUJOX3ByaW50KGJwLGUpOworCQkJCQlCSU9fcHV0cyhicCwiXG4iKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJQk5fR0YybV9hZGQoZiwgYSwgZCk7CisJCQlCTl9HRjJtX21vZF9tdWwoZywgZiwgYywgYltqXSwgY3R4KTsKKwkJCUJOX0dGMm1fbW9kX211bChoLCBkLCBjLCBiW2pdLCBjdHgpOworCQkJQk5fR0YybV9hZGQoZiwgZSwgZyk7CisJCQlCTl9HRjJtX2FkZChmLCBmLCBoKTsKKwkJCS8qIFRlc3QgdGhhdCAoYStkKSpjID0gYSpjICsgZCpjLiAqLworCQkJaWYoIUJOX2lzX3plcm8oZikpCisJCQkJeworCQkJCWZwcmludGYoc3RkZXJyLCJHRigyXm0pIG1vZHVsYXIgbXVsdGlwbGljYXRpb24gdGVzdCBmYWlsZWQhXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCX0KKwlyZXQgPSAxOworICBlcnI6CisJQk5fZnJlZShhKTsKKwlCTl9mcmVlKGJbMF0pOworCUJOX2ZyZWUoYlsxXSk7CisJQk5fZnJlZShjKTsKKwlCTl9mcmVlKGQpOworCUJOX2ZyZWUoZSk7CisJQk5fZnJlZShmKTsKKwlCTl9mcmVlKGcpOworCUJOX2ZyZWUoaCk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCB0ZXN0X2dmMm1fbW9kX3NxcihCSU8gKmJwLEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmEsKmJbMl0sKmMsKmQ7CisJaW50IGksIGosIHJldCA9IDA7CisJaW50IHAwW10gPSB7MTYzLDcsNiwzLDAsLTF9OworCWludCBwMVtdID0gezE5MywxNSwwLC0xfTsKKworCWE9Qk5fbmV3KCk7CisJYlswXT1CTl9uZXcoKTsKKwliWzFdPUJOX25ldygpOworCWM9Qk5fbmV3KCk7CisJZD1CTl9uZXcoKTsKKworCUJOX0dGMm1fYXJyMnBvbHkocDAsIGJbMF0pOworCUJOX0dGMm1fYXJyMnBvbHkocDEsIGJbMV0pOworCisJZm9yIChpPTA7IGk8bnVtMDsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKGEsIDEwMjQsIDAsIDApOworCQlmb3IgKGo9MDsgaiA8IDI7IGorKykKKwkJCXsKKwkJCUJOX0dGMm1fbW9kX3NxcihjLCBhLCBiW2pdLCBjdHgpOworCQkJQk5fY29weShkLCBhKTsKKwkJCUJOX0dGMm1fbW9kX211bChkLCBhLCBkLCBiW2pdLCBjdHgpOworI2lmIDAgLyogbWFrZSB0ZXN0IHVzZXMgb3VwdXQgaW4gYmMgYnV0IGJjIGNhbid0IGhhbmRsZSBHRigyXm0pIGFyaXRobWV0aWMgKi8KKwkJCWlmIChicCAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIXJlc3VsdHMpCisJCQkJCXsKKwkJCQkJQk5fcHJpbnQoYnAsYSk7CisJCQkJCUJJT19wdXRzKGJwLCIgXiAyICUgIik7CisJCQkJCUJOX3ByaW50KGJwLGJbal0pOworCQkJCQlCSU9fcHV0cyhicCwgIiA9ICIpOworCQkJCQlCTl9wcmludChicCxjKTsKKwkJCQkJQklPX3B1dHMoYnAsIjsgYSAqIGEgPSAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsZCk7CisJCQkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQlCTl9HRjJtX2FkZChkLCBjLCBkKTsKKwkJCS8qIFRlc3QgdGhhdCBhKmEgPSBhXjIuICovCisJCQlpZighQk5faXNfemVybyhkKSkKKwkJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsIkdGKDJebSkgbW9kdWxhciBzcXVhcmluZyB0ZXN0IGZhaWxlZCFcbiIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCXJldCA9IDE7CisgIGVycjoKKwlCTl9mcmVlKGEpOworCUJOX2ZyZWUoYlswXSk7CisJQk5fZnJlZShiWzFdKTsKKwlCTl9mcmVlKGMpOworCUJOX2ZyZWUoZCk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCB0ZXN0X2dmMm1fbW9kX2ludihCSU8gKmJwLEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmEsKmJbMl0sKmMsKmQ7CisJaW50IGksIGosIHJldCA9IDA7CisJaW50IHAwW10gPSB7MTYzLDcsNiwzLDAsLTF9OworCWludCBwMVtdID0gezE5MywxNSwwLC0xfTsKKworCWE9Qk5fbmV3KCk7CisJYlswXT1CTl9uZXcoKTsKKwliWzFdPUJOX25ldygpOworCWM9Qk5fbmV3KCk7CisJZD1CTl9uZXcoKTsKKworCUJOX0dGMm1fYXJyMnBvbHkocDAsIGJbMF0pOworCUJOX0dGMm1fYXJyMnBvbHkocDEsIGJbMV0pOworCisJZm9yIChpPTA7IGk8bnVtMDsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKGEsIDUxMiwgMCwgMCk7IAorCQlmb3IgKGo9MDsgaiA8IDI7IGorKykKKwkJCXsKKwkJCUJOX0dGMm1fbW9kX2ludihjLCBhLCBiW2pdLCBjdHgpOworCQkJQk5fR0YybV9tb2RfbXVsKGQsIGEsIGMsIGJbal0sIGN0eCk7CisjaWYgMCAvKiBtYWtlIHRlc3QgdXNlcyBvdXB1dCBpbiBiYyBidXQgYmMgY2FuJ3QgaGFuZGxlIEdGKDJebSkgYXJpdGhtZXRpYyAqLworCQkJaWYgKGJwICE9IE5VTEwpCisJCQkJeworCQkJCWlmICghcmVzdWx0cykKKwkJCQkJeworCQkJCQlCTl9wcmludChicCxhKTsKKwkJCQkJQklPX3B1dHMoYnAsICIgKiAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsYyk7CisJCQkJCUJJT19wdXRzKGJwLCIgLSAxICUgIik7CisJCQkJCUJOX3ByaW50KGJwLGJbal0pOworCQkJCQlCSU9fcHV0cyhicCwiXG4iKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJLyogVGVzdCB0aGF0ICgoMS9hKSphKSA9IDEuICovCisJCQlpZighQk5faXNfb25lKGQpKQorCQkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiR0YoMl5tKSBtb2R1bGFyIGludmVyc2lvbiB0ZXN0IGZhaWxlZCFcbiIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCXJldCA9IDE7CisgIGVycjoKKwlCTl9mcmVlKGEpOworCUJOX2ZyZWUoYlswXSk7CisJQk5fZnJlZShiWzFdKTsKKwlCTl9mcmVlKGMpOworCUJOX2ZyZWUoZCk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCB0ZXN0X2dmMm1fbW9kX2RpdihCSU8gKmJwLEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKmEsKmJbMl0sKmMsKmQsKmUsKmY7CisJaW50IGksIGosIHJldCA9IDA7CisJaW50IHAwW10gPSB7MTYzLDcsNiwzLDAsLTF9OworCWludCBwMVtdID0gezE5MywxNSwwLC0xfTsKKworCWE9Qk5fbmV3KCk7CisJYlswXT1CTl9uZXcoKTsKKwliWzFdPUJOX25ldygpOworCWM9Qk5fbmV3KCk7CisJZD1CTl9uZXcoKTsKKwllPUJOX25ldygpOworCWY9Qk5fbmV3KCk7CisKKwlCTl9HRjJtX2FycjJwb2x5KHAwLCBiWzBdKTsKKwlCTl9HRjJtX2FycjJwb2x5KHAxLCBiWzFdKTsKKworCWZvciAoaT0wOyBpPG51bTA7IGkrKykKKwkJeworCQlCTl9ibnRlc3RfcmFuZChhLCA1MTIsIDAsIDApOyAKKwkJQk5fYm50ZXN0X3JhbmQoYywgNTEyLCAwLCAwKTsKKwkJZm9yIChqPTA7IGogPCAyOyBqKyspCisJCQl7CisJCQlCTl9HRjJtX21vZF9kaXYoZCwgYSwgYywgYltqXSwgY3R4KTsKKwkJCUJOX0dGMm1fbW9kX211bChlLCBkLCBjLCBiW2pdLCBjdHgpOworCQkJQk5fR0YybV9tb2RfZGl2KGYsIGEsIGUsIGJbal0sIGN0eCk7CisjaWYgMCAvKiBtYWtlIHRlc3QgdXNlcyBvdXB1dCBpbiBiYyBidXQgYmMgY2FuJ3QgaGFuZGxlIEdGKDJebSkgYXJpdGhtZXRpYyAqLworCQkJaWYgKGJwICE9IE5VTEwpCisJCQkJeworCQkJCWlmICghcmVzdWx0cykKKwkJCQkJeworCQkJCQlCTl9wcmludChicCxhKTsKKwkJCQkJQklPX3B1dHMoYnAsICIgPSAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsYyk7CisJCQkJCUJJT19wdXRzKGJwLCIgKiAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsZCk7CisJCQkJCUJJT19wdXRzKGJwLCAiICUgIik7CisJCQkJCUJOX3ByaW50KGJwLGJbal0pOworCQkJCQlCSU9fcHV0cyhicCwiXG4iKTsKKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJLyogVGVzdCB0aGF0ICgoYS9jKSpjKS9hID0gMS4gKi8KKwkJCWlmKCFCTl9pc19vbmUoZikpCisJCQkJeworCQkJCWZwcmludGYoc3RkZXJyLCJHRigyXm0pIG1vZHVsYXIgZGl2aXNpb24gdGVzdCBmYWlsZWQhXG4iKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCX0KKwlyZXQgPSAxOworICBlcnI6CisJQk5fZnJlZShhKTsKKwlCTl9mcmVlKGJbMF0pOworCUJOX2ZyZWUoYlsxXSk7CisJQk5fZnJlZShjKTsKKwlCTl9mcmVlKGQpOworCUJOX2ZyZWUoZSk7CisJQk5fZnJlZShmKTsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IHRlc3RfZ2YybV9tb2RfZXhwKEJJTyAqYnAsQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqYSwqYlsyXSwqYywqZCwqZSwqZjsKKwlpbnQgaSwgaiwgcmV0ID0gMDsKKwlpbnQgcDBbXSA9IHsxNjMsNyw2LDMsMCwtMX07CisJaW50IHAxW10gPSB7MTkzLDE1LDAsLTF9OworCisJYT1CTl9uZXcoKTsKKwliWzBdPUJOX25ldygpOworCWJbMV09Qk5fbmV3KCk7CisJYz1CTl9uZXcoKTsKKwlkPUJOX25ldygpOworCWU9Qk5fbmV3KCk7CisJZj1CTl9uZXcoKTsKKworCUJOX0dGMm1fYXJyMnBvbHkocDAsIGJbMF0pOworCUJOX0dGMm1fYXJyMnBvbHkocDEsIGJbMV0pOworCisJZm9yIChpPTA7IGk8bnVtMDsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKGEsIDUxMiwgMCwgMCk7CisJCUJOX2JudGVzdF9yYW5kKGMsIDUxMiwgMCwgMCk7CisJCUJOX2JudGVzdF9yYW5kKGQsIDUxMiwgMCwgMCk7CisJCWZvciAoaj0wOyBqIDwgMjsgaisrKQorCQkJeworCQkJQk5fR0YybV9tb2RfZXhwKGUsIGEsIGMsIGJbal0sIGN0eCk7CisJCQlCTl9HRjJtX21vZF9leHAoZiwgYSwgZCwgYltqXSwgY3R4KTsKKwkJCUJOX0dGMm1fbW9kX211bChlLCBlLCBmLCBiW2pdLCBjdHgpOworCQkJQk5fYWRkKGYsIGMsIGQpOworCQkJQk5fR0YybV9tb2RfZXhwKGYsIGEsIGYsIGJbal0sIGN0eCk7CisjaWYgMCAvKiBtYWtlIHRlc3QgdXNlcyBvdXB1dCBpbiBiYyBidXQgYmMgY2FuJ3QgaGFuZGxlIEdGKDJebSkgYXJpdGhtZXRpYyAqLworCQkJaWYgKGJwICE9IE5VTEwpCisJCQkJeworCQkJCWlmICghcmVzdWx0cykKKwkJCQkJeworCQkJCQlCTl9wcmludChicCxhKTsKKwkJCQkJQklPX3B1dHMoYnAsICIgXiAoIik7CisJCQkJCUJOX3ByaW50KGJwLGMpOworCQkJCQlCSU9fcHV0cyhicCwiICsgIik7CisJCQkJCUJOX3ByaW50KGJwLGQpOworCQkJCQlCSU9fcHV0cyhicCwgIikgPSAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsZSk7CisJCQkJCUJJT19wdXRzKGJwLCAiOyAtICIpOworCQkJCQlCTl9wcmludChicCxmKTsKKwkJCQkJQklPX3B1dHMoYnAsICIgJSAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsYltqXSk7CisJCQkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQlCTl9HRjJtX2FkZChmLCBlLCBmKTsKKwkJCS8qIFRlc3QgdGhhdCBhXihjK2QpPWFeYyphXmQuICovCisJCQlpZighQk5faXNfemVybyhmKSkKKwkJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsIkdGKDJebSkgbW9kdWxhciBleHBvbmVudGlhdGlvbiB0ZXN0IGZhaWxlZCFcbiIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCXJldCA9IDE7CisgIGVycjoKKwlCTl9mcmVlKGEpOworCUJOX2ZyZWUoYlswXSk7CisJQk5fZnJlZShiWzFdKTsKKwlCTl9mcmVlKGMpOworCUJOX2ZyZWUoZCk7CisJQk5fZnJlZShlKTsKKwlCTl9mcmVlKGYpOworCXJldHVybiByZXQ7CisJfQorCitpbnQgdGVzdF9nZjJtX21vZF9zcXJ0KEJJTyAqYnAsQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqYSwqYlsyXSwqYywqZCwqZSwqZjsKKwlpbnQgaSwgaiwgcmV0ID0gMDsKKwlpbnQgcDBbXSA9IHsxNjMsNyw2LDMsMCwtMX07CisJaW50IHAxW10gPSB7MTkzLDE1LDAsLTF9OworCisJYT1CTl9uZXcoKTsKKwliWzBdPUJOX25ldygpOworCWJbMV09Qk5fbmV3KCk7CisJYz1CTl9uZXcoKTsKKwlkPUJOX25ldygpOworCWU9Qk5fbmV3KCk7CisJZj1CTl9uZXcoKTsKKworCUJOX0dGMm1fYXJyMnBvbHkocDAsIGJbMF0pOworCUJOX0dGMm1fYXJyMnBvbHkocDEsIGJbMV0pOworCisJZm9yIChpPTA7IGk8bnVtMDsgaSsrKQorCQl7CisJCUJOX2JudGVzdF9yYW5kKGEsIDUxMiwgMCwgMCk7CisJCWZvciAoaj0wOyBqIDwgMjsgaisrKQorCQkJeworCQkJQk5fR0YybV9tb2QoYywgYSwgYltqXSk7CisJCQlCTl9HRjJtX21vZF9zcXJ0KGQsIGEsIGJbal0sIGN0eCk7CisJCQlCTl9HRjJtX21vZF9zcXIoZSwgZCwgYltqXSwgY3R4KTsKKyNpZiAwIC8qIG1ha2UgdGVzdCB1c2VzIG91cHV0IGluIGJjIGJ1dCBiYyBjYW4ndCBoYW5kbGUgR0YoMl5tKSBhcml0aG1ldGljICovCisJCQlpZiAoYnAgIT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKCFyZXN1bHRzKQorCQkJCQl7CisJCQkJCUJOX3ByaW50KGJwLGQpOworCQkJCQlCSU9fcHV0cyhicCwgIiBeIDIgLSAiKTsKKwkJCQkJQk5fcHJpbnQoYnAsYSk7CisJCQkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisJCQlCTl9HRjJtX2FkZChmLCBjLCBlKTsKKwkJCS8qIFRlc3QgdGhhdCBkXjIgPSBhLCB3aGVyZSBkID0gc3FydChhKS4gKi8KKwkJCWlmKCFCTl9pc196ZXJvKGYpKQorCQkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiR0YoMl5tKSBtb2R1bGFyIHNxdWFyZSByb290IHRlc3QgZmFpbGVkIVxuIik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQl9CisJcmV0ID0gMTsKKyAgZXJyOgorCUJOX2ZyZWUoYSk7CisJQk5fZnJlZShiWzBdKTsKKwlCTl9mcmVlKGJbMV0pOworCUJOX2ZyZWUoYyk7CisJQk5fZnJlZShkKTsKKwlCTl9mcmVlKGUpOworCUJOX2ZyZWUoZik7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCB0ZXN0X2dmMm1fbW9kX3NvbHZlX3F1YWQoQklPICpicCxCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNICphLCpiWzJdLCpjLCpkLCplOworCWludCBpLCBqLCBzID0gMCwgdCwgcmV0ID0gMDsKKwlpbnQgcDBbXSA9IHsxNjMsNyw2LDMsMCwtMX07CisJaW50IHAxW10gPSB7MTkzLDE1LDAsLTF9OworCisJYT1CTl9uZXcoKTsKKwliWzBdPUJOX25ldygpOworCWJbMV09Qk5fbmV3KCk7CisJYz1CTl9uZXcoKTsKKwlkPUJOX25ldygpOworCWU9Qk5fbmV3KCk7CisKKwlCTl9HRjJtX2FycjJwb2x5KHAwLCBiWzBdKTsKKwlCTl9HRjJtX2FycjJwb2x5KHAxLCBiWzFdKTsKKworCWZvciAoaT0wOyBpPG51bTA7IGkrKykKKwkJeworCQlCTl9ibnRlc3RfcmFuZChhLCA1MTIsIDAsIDApOworCQlmb3IgKGo9MDsgaiA8IDI7IGorKykKKwkJCXsKKwkJCXQgPSBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkKGMsIGEsIGJbal0sIGN0eCk7CisJCQlpZiAodCkKKwkJCQl7CisJCQkJcysrOworCQkJCUJOX0dGMm1fbW9kX3NxcihkLCBjLCBiW2pdLCBjdHgpOworCQkJCUJOX0dGMm1fYWRkKGQsIGMsIGQpOworCQkJCUJOX0dGMm1fbW9kKGUsIGEsIGJbal0pOworI2lmIDAgLyogbWFrZSB0ZXN0IHVzZXMgb3VwdXQgaW4gYmMgYnV0IGJjIGNhbid0IGhhbmRsZSBHRigyXm0pIGFyaXRobWV0aWMgKi8KKwkJCQlpZiAoYnAgIT0gTlVMTCkKKwkJCQkJeworCQkJCQlpZiAoIXJlc3VsdHMpCisJCQkJCQl7CisJCQkJCQlCTl9wcmludChicCxjKTsKKwkJCQkJCUJJT19wdXRzKGJwLCAiIGlzIHJvb3Qgb2Ygel4yICsgeiA9ICIpOworCQkJCQkJQk5fcHJpbnQoYnAsYSk7CisJCQkJCQlCSU9fcHV0cyhicCwgIiAlICIpOworCQkJCQkJQk5fcHJpbnQoYnAsYltqXSk7CisJCQkJCQlCSU9fcHV0cyhicCwgIlxuIik7CisJCQkJCQl9CisJCQkJCX0KKyNlbmRpZgorCQkJCUJOX0dGMm1fYWRkKGUsIGUsIGQpOworCQkJCS8qIFRlc3QgdGhhdCBzb2x1dGlvbiBvZiBxdWFkcmF0aWMgYyBzYXRpc2ZpZXMgY14yICsgYyA9IGEuICovCisJCQkJaWYoIUJOX2lzX3plcm8oZSkpCisJCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsIkdGKDJebSkgbW9kdWxhciBzb2x2ZSBxdWFkcmF0aWMgdGVzdCBmYWlsZWQhXG4iKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKworCQkJCX0KKwkJCWVsc2UgCisJCQkJeworI2lmIDAgLyogbWFrZSB0ZXN0IHVzZXMgb3VwdXQgaW4gYmMgYnV0IGJjIGNhbid0IGhhbmRsZSBHRigyXm0pIGFyaXRobWV0aWMgKi8KKwkJCQlpZiAoYnAgIT0gTlVMTCkKKwkJCQkJeworCQkJCQlpZiAoIXJlc3VsdHMpCisJCQkJCQl7CisJCQkJCQlCSU9fcHV0cyhicCwgIlRoZXJlIGFyZSBubyByb290cyBvZiB6XjIgKyB6ID0gIik7CisJCQkJCQlCTl9wcmludChicCxhKTsKKwkJCQkJCUJJT19wdXRzKGJwLCAiICUgIik7CisJCQkJCQlCTl9wcmludChicCxiW2pdKTsKKwkJCQkJCUJJT19wdXRzKGJwLCAiXG4iKTsKKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmCisJCQkJfQorCQkJfQorCQl9CisJaWYgKHMgPT0gMCkKKwkJewkKKwkJZnByaW50ZihzdGRlcnIsIkFsbCAlaSB0ZXN0cyBvZiBHRigyXm0pIG1vZHVsYXIgc29sdmUgcXVhZHJhdGljIHJlc3VsdGVkIGluIG5vIHJvb3RzO1xuIiwgbnVtMCk7CisJCWZwcmludGYoc3RkZXJyLCJ0aGlzIGlzIHZlcnkgdW5saWtlbHkgYW5kIHByb2JhYmx5IGluZGljYXRlcyBhbiBlcnJvci5cbiIpOworCQlnb3RvIGVycjsKKwkJfQorCXJldCA9IDE7CisgIGVycjoKKwlCTl9mcmVlKGEpOworCUJOX2ZyZWUoYlswXSk7CisJQk5fZnJlZShiWzFdKTsKKwlCTl9mcmVlKGMpOworCUJOX2ZyZWUoZCk7CisJQk5fZnJlZShlKTsKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIGludCBnZW5wcmltZV9jYihpbnQgcCwgaW50IG4sIEJOX0dFTkNCICphcmcpCisJeworCWNoYXIgYz0nKic7CisKKwlpZiAocCA9PSAwKSBjPScuJzsKKwlpZiAocCA9PSAxKSBjPScrJzsKKwlpZiAocCA9PSAyKSBjPScqJzsKKwlpZiAocCA9PSAzKSBjPSdcbic7CisJcHV0YyhjLCBzdGRlcnIpOworCWZmbHVzaChzdGRlcnIpOworCXJldHVybiAxOworCX0KKworaW50IHRlc3Rfa3JvbihCSU8gKmJwLCBCTl9DVFggKmN0eCkKKwl7CisJQk5fR0VOQ0IgY2I7CisJQklHTlVNICphLCpiLCpyLCp0OworCWludCBpOworCWludCBsZWdlbmRyZSwga3JvbmVja2VyOworCWludCByZXQgPSAwOworCisJYSA9IEJOX25ldygpOworCWIgPSBCTl9uZXcoKTsKKwlyID0gQk5fbmV3KCk7CisJdCA9IEJOX25ldygpOworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMIHx8IHIgPT0gTlVMTCB8fCB0ID09IE5VTEwpIGdvdG8gZXJyOworCisJQk5fR0VOQ0Jfc2V0KCZjYiwgZ2VucHJpbWVfY2IsIE5VTEwpOworCQorCS8qIFdlIHRlc3QgQk5fa3JvbmVja2VyKGEsIGIsIGN0eCkganVzdCBmb3IgIGIgIG9kZCAoSmFjb2JpIHN5bWJvbCkuCisJICogSW4gdGhpcyBjYXNlIHdlIGtub3cgdGhhdCBpZiAgYiAgaXMgcHJpbWUsIHRoZW4gQk5fa3JvbmVja2VyKGEsIGIsIGN0eCkKKwkgKiBpcyBjb25ncnVlbnQgdG8gJGFeeyhiLTEpLzJ9JCwgbW9kdWxvICRiJCAoTGVnZW5kcmUgc3ltYm9sKS4KKwkgKiBTbyB3ZSBnZW5lcmF0ZSBhIHJhbmRvbSBwcmltZSAgYiAgYW5kIGNvbXBhcmUgdGhlc2UgdmFsdWVzCisJICogZm9yIGEgbnVtYmVyIG9mIHJhbmRvbSAgYSdzLiAgKFRoYXQgaXMsIHdlIHJ1biB0aGUgU29sb3ZheS1TdHJhc3NlbgorCSAqIHByaW1hbGl0eSB0ZXN0IHRvIGNvbmZpcm0gdGhhdCAgYiAgaXMgcHJpbWUsIGV4Y2VwdCB0aGF0IHdlCisJICogZG9uJ3Qgd2FudCB0byB0ZXN0IHdoZXRoZXIgIGIgIGlzIHByaW1lIGJ1dCB3aGV0aGVyIEJOX2tyb25lY2tlcgorCSAqIHdvcmtzLikgKi8KKworCWlmICghQk5fZ2VuZXJhdGVfcHJpbWVfZXgoYiwgNTEyLCAwLCBOVUxMLCBOVUxMLCAmY2IpKSBnb3RvIGVycjsKKwliLT5uZWcgPSByYW5kX25lZygpOworCXB1dGMoJ1xuJywgc3RkZXJyKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW0wOyBpKyspCisJCXsKKwkJaWYgKCFCTl9ibnRlc3RfcmFuZChhLCA1MTIsIDAsIDApKSBnb3RvIGVycjsKKwkJYS0+bmVnID0gcmFuZF9uZWcoKTsKKworCQkvKiB0IDo9ICh8YnwtMSkvMiAgKG5vdGUgdGhhdCBiIGlzIG9kZCkgKi8KKwkJaWYgKCFCTl9jb3B5KHQsIGIpKSBnb3RvIGVycjsKKwkJdC0+bmVnID0gMDsKKwkJaWYgKCFCTl9zdWJfd29yZCh0LCAxKSkgZ290byBlcnI7CisJCWlmICghQk5fcnNoaWZ0MSh0LCB0KSkgZ290byBlcnI7CisJCS8qIHIgOj0gYV50IG1vZCBiICovCisJCWItPm5lZz0wOworCQkKKwkJaWYgKCFCTl9tb2RfZXhwX3JlY3AociwgYSwgdCwgYiwgY3R4KSkgZ290byBlcnI7CisJCWItPm5lZz0xOworCisJCWlmIChCTl9pc193b3JkKHIsIDEpKQorCQkJbGVnZW5kcmUgPSAxOworCQllbHNlIGlmIChCTl9pc196ZXJvKHIpKQorCQkJbGVnZW5kcmUgPSAwOworCQllbHNlCisJCQl7CisJCQlpZiAoIUJOX2FkZF93b3JkKHIsIDEpKSBnb3RvIGVycjsKKwkJCWlmICgwICE9IEJOX3VjbXAociwgYikpCisJCQkJeworCQkJCWZwcmludGYoc3RkZXJyLCAiTGVnZW5kcmUgc3ltYm9sIGNvbXB1dGF0aW9uIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJbGVnZW5kcmUgPSAtMTsKKwkJCX0KKwkJCisJCWtyb25lY2tlciA9IEJOX2tyb25lY2tlcihhLCBiLCBjdHgpOworCQlpZiAoa3JvbmVja2VyIDwgLTEpIGdvdG8gZXJyOworCQkvKiB3ZSBhY3R1YWxseSBuZWVkIEJOX2tyb25lY2tlcihhLCB8YnwpICovCisJCWlmIChhLT5uZWcgJiYgYi0+bmVnKQorCQkJa3JvbmVja2VyID0gLWtyb25lY2tlcjsKKwkJCisJCWlmIChsZWdlbmRyZSAhPSBrcm9uZWNrZXIpCisJCQl7CisJCQlmcHJpbnRmKHN0ZGVyciwgImxlZ2VuZHJlICE9IGtyb25lY2tlcjsgYSA9ICIpOworCQkJQk5fcHJpbnRfZnAoc3RkZXJyLCBhKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiLCBiID0gIik7CisJCQlCTl9wcmludF9mcChzdGRlcnIsIGIpOworCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJcHV0YygnLicsIHN0ZGVycik7CisJCWZmbHVzaChzdGRlcnIpOworCQl9CisKKwlwdXRjKCdcbicsIHN0ZGVycik7CisJZmZsdXNoKHN0ZGVycik7CisJcmV0ID0gMTsKKyBlcnI6CisJaWYgKGEgIT0gTlVMTCkgQk5fZnJlZShhKTsKKwlpZiAoYiAhPSBOVUxMKSBCTl9mcmVlKGIpOworCWlmIChyICE9IE5VTEwpIEJOX2ZyZWUocik7CisJaWYgKHQgIT0gTlVMTCkgQk5fZnJlZSh0KTsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IHRlc3Rfc3FydChCSU8gKmJwLCBCTl9DVFggKmN0eCkKKwl7CisJQk5fR0VOQ0IgY2I7CisJQklHTlVNICphLCpwLCpyOworCWludCBpLCBqOworCWludCByZXQgPSAwOworCisJYSA9IEJOX25ldygpOworCXAgPSBCTl9uZXcoKTsKKwlyID0gQk5fbmV3KCk7CisJaWYgKGEgPT0gTlVMTCB8fCBwID09IE5VTEwgfHwgciA9PSBOVUxMKSBnb3RvIGVycjsKKworCUJOX0dFTkNCX3NldCgmY2IsIGdlbnByaW1lX2NiLCBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl7CisJCWlmIChpIDwgOCkKKwkJCXsKKwkJCXVuc2lnbmVkIHByaW1lc1s4XSA9IHsgMiwgMywgNSwgNywgMTEsIDEzLCAxNywgMTkgfTsKKwkJCQorCQkJaWYgKCFCTl9zZXRfd29yZChwLCBwcmltZXNbaV0pKSBnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKCFCTl9zZXRfd29yZChhLCAzMikpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9zZXRfd29yZChyLCAyKmkgKyAxKSkgZ290byBlcnI7CisJCQorCQkJaWYgKCFCTl9nZW5lcmF0ZV9wcmltZV9leChwLCAyNTYsIDAsIGEsIHIsICZjYikpIGdvdG8gZXJyOworCQkJcHV0YygnXG4nLCBzdGRlcnIpOworCQkJfQorCQlwLT5uZWcgPSByYW5kX25lZygpOworCisJCWZvciAoaiA9IDA7IGogPCBudW0yOyBqKyspCisJCQl7CisJCQkvKiBjb25zdHJ1Y3QgJ2EnIHN1Y2ggdGhhdCBpdCBpcyBhIHNxdWFyZSBtb2R1bG8gcCwKKwkJCSAqIGJ1dCBpbiBnZW5lcmFsIG5vdCBhIHByb3BlciBzcXVhcmUgYW5kIG5vdCByZWR1Y2VkIG1vZHVsbyBwICovCisJCQlpZiAoIUJOX2JudGVzdF9yYW5kKHIsIDI1NiwgMCwgMykpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9ubm1vZChyLCByLCBwLCBjdHgpKSBnb3RvIGVycjsKKwkJCWlmICghQk5fbW9kX3NxcihyLCByLCBwLCBjdHgpKSBnb3RvIGVycjsKKwkJCWlmICghQk5fYm50ZXN0X3JhbmQoYSwgMjU2LCAwLCAzKSkgZ290byBlcnI7CisJCQlpZiAoIUJOX25ubW9kKGEsIGEsIHAsIGN0eCkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9tb2Rfc3FyKGEsIGEsIHAsIGN0eCkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9tdWwoYSwgYSwgciwgY3R4KSkgZ290byBlcnI7CisJCQlpZiAocmFuZF9uZWcoKSkKKwkJCQlpZiAoIUJOX3N1YihhLCBhLCBwKSkgZ290byBlcnI7CisKKwkJCWlmICghQk5fbW9kX3NxcnQociwgYSwgcCwgY3R4KSkgZ290byBlcnI7CisJCQlpZiAoIUJOX21vZF9zcXIociwgciwgcCwgY3R4KSkgZ290byBlcnI7CisKKwkJCWlmICghQk5fbm5tb2QoYSwgYSwgcCwgY3R4KSkgZ290byBlcnI7CisKKwkJCWlmIChCTl9jbXAoYSwgcikgIT0gMCkKKwkJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsICJCTl9tb2Rfc3FydCBmYWlsZWQ6IGEgPSAiKTsKKwkJCQlCTl9wcmludF9mcChzdGRlcnIsIGEpOworCQkJCWZwcmludGYoc3RkZXJyLCAiLCByID0gIik7CisJCQkJQk5fcHJpbnRfZnAoc3RkZXJyLCByKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiwgcCA9ICIpOworCQkJCUJOX3ByaW50X2ZwKHN0ZGVyciwgcCk7CisJCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJcHV0YygnLicsIHN0ZGVycik7CisJCQlmZmx1c2goc3RkZXJyKTsKKwkJCX0KKwkJCisJCXB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJZmZsdXNoKHN0ZGVycik7CisJCX0KKwlyZXQgPSAxOworIGVycjoKKwlpZiAoYSAhPSBOVUxMKSBCTl9mcmVlKGEpOworCWlmIChwICE9IE5VTEwpIEJOX2ZyZWUocCk7CisJaWYgKHIgIT0gTlVMTCkgQk5fZnJlZShyKTsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IHRlc3RfbHNoaWZ0KEJJTyAqYnAsQk5fQ1RYICpjdHgsQklHTlVNICphXykKKwl7CisJQklHTlVNICphLCpiLCpjLCpkOworCWludCBpOworCisJYj1CTl9uZXcoKTsKKwljPUJOX25ldygpOworCWQ9Qk5fbmV3KCk7CisJQk5fb25lKGMpOworCisJaWYoYV8pCisJICAgIGE9YV87CisJZWxzZQorCSAgICB7CisJICAgIGE9Qk5fbmV3KCk7CisJICAgIEJOX2JudGVzdF9yYW5kKGEsMjAwLDAsMCk7IC8qKi8KKwkgICAgYS0+bmVnPXJhbmRfbmVnKCk7CisJICAgIH0KKwlmb3IgKGk9MDsgaTxudW0wOyBpKyspCisJCXsKKwkJQk5fbHNoaWZ0KGIsYSxpKzEpOworCQlCTl9hZGQoYyxjLGMpOworCQlpZiAoYnAgIT0gTlVMTCkKKwkJCXsKKwkJCWlmICghcmVzdWx0cykKKwkJCQl7CisJCQkJQk5fcHJpbnQoYnAsYSk7CisJCQkJQklPX3B1dHMoYnAsIiAqICIpOworCQkJCUJOX3ByaW50KGJwLGMpOworCQkJCUJJT19wdXRzKGJwLCIgLSAiKTsKKwkJCQl9CisJCQlCTl9wcmludChicCxiKTsKKwkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJfQorCQlCTl9tdWwoZCxhLGMsY3R4KTsKKwkJQk5fc3ViKGQsZCxiKTsKKwkJaWYoIUJOX2lzX3plcm8oZCkpCisJCSAgICB7CisJCSAgICBmcHJpbnRmKHN0ZGVyciwiTGVmdCBzaGlmdCB0ZXN0IGZhaWxlZCFcbiIpOworCQkgICAgZnByaW50ZihzdGRlcnIsImE9Iik7CisJCSAgICBCTl9wcmludF9mcChzdGRlcnIsYSk7CisJCSAgICBmcHJpbnRmKHN0ZGVyciwiXG5iPSIpOworCQkgICAgQk5fcHJpbnRfZnAoc3RkZXJyLGIpOworCQkgICAgZnByaW50ZihzdGRlcnIsIlxuYz0iKTsKKwkJICAgIEJOX3ByaW50X2ZwKHN0ZGVycixjKTsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJcbmQ9Iik7CisJCSAgICBCTl9wcmludF9mcChzdGRlcnIsZCk7CisJCSAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwkJICAgIHJldHVybiAwOworCQkgICAgfQorCQl9CisJQk5fZnJlZShhKTsKKwlCTl9mcmVlKGIpOworCUJOX2ZyZWUoYyk7CisJQk5fZnJlZShkKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgdGVzdF9sc2hpZnQxKEJJTyAqYnApCisJeworCUJJR05VTSAqYSwqYiwqYzsKKwlpbnQgaTsKKworCWE9Qk5fbmV3KCk7CisJYj1CTl9uZXcoKTsKKwljPUJOX25ldygpOworCisJQk5fYm50ZXN0X3JhbmQoYSwyMDAsMCwwKTsgLyoqLworCWEtPm5lZz1yYW5kX25lZygpOworCWZvciAoaT0wOyBpPG51bTA7IGkrKykKKwkJeworCQlCTl9sc2hpZnQxKGIsYSk7CisJCWlmIChicCAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFyZXN1bHRzKQorCQkJCXsKKwkJCQlCTl9wcmludChicCxhKTsKKwkJCQlCSU9fcHV0cyhicCwiICogMiIpOworCQkJCUJJT19wdXRzKGJwLCIgLSAiKTsKKwkJCQl9CisJCQlCTl9wcmludChicCxiKTsKKwkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJfQorCQlCTl9hZGQoYyxhLGEpOworCQlCTl9zdWIoYSxiLGMpOworCQlpZighQk5faXNfemVybyhhKSkKKwkJICAgIHsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJMZWZ0IHNoaWZ0IG9uZSB0ZXN0IGZhaWxlZCFcbiIpOworCQkgICAgcmV0dXJuIDA7CisJCSAgICB9CisJCQorCQlCTl9jb3B5KGEsYik7CisJCX0KKwlCTl9mcmVlKGEpOworCUJOX2ZyZWUoYik7CisJQk5fZnJlZShjKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgdGVzdF9yc2hpZnQoQklPICpicCxCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNICphLCpiLCpjLCpkLCplOworCWludCBpOworCisJYT1CTl9uZXcoKTsKKwliPUJOX25ldygpOworCWM9Qk5fbmV3KCk7CisJZD1CTl9uZXcoKTsKKwllPUJOX25ldygpOworCUJOX29uZShjKTsKKworCUJOX2JudGVzdF9yYW5kKGEsMjAwLDAsMCk7IC8qKi8KKwlhLT5uZWc9cmFuZF9uZWcoKTsKKwlmb3IgKGk9MDsgaTxudW0wOyBpKyspCisJCXsKKwkJQk5fcnNoaWZ0KGIsYSxpKzEpOworCQlCTl9hZGQoYyxjLGMpOworCQlpZiAoYnAgIT0gTlVMTCkKKwkJCXsKKwkJCWlmICghcmVzdWx0cykKKwkJCQl7CisJCQkJQk5fcHJpbnQoYnAsYSk7CisJCQkJQklPX3B1dHMoYnAsIiAvICIpOworCQkJCUJOX3ByaW50KGJwLGMpOworCQkJCUJJT19wdXRzKGJwLCIgLSAiKTsKKwkJCQl9CisJCQlCTl9wcmludChicCxiKTsKKwkJCUJJT19wdXRzKGJwLCJcbiIpOworCQkJfQorCQlCTl9kaXYoZCxlLGEsYyxjdHgpOworCQlCTl9zdWIoZCxkLGIpOworCQlpZighQk5faXNfemVybyhkKSkKKwkJICAgIHsKKwkJICAgIGZwcmludGYoc3RkZXJyLCJSaWdodCBzaGlmdCB0ZXN0IGZhaWxlZCFcbiIpOworCQkgICAgcmV0dXJuIDA7CisJCSAgICB9CisJCX0KKwlCTl9mcmVlKGEpOworCUJOX2ZyZWUoYik7CisJQk5fZnJlZShjKTsKKwlCTl9mcmVlKGQpOworCUJOX2ZyZWUoZSk7CisJcmV0dXJuKDEpOworCX0KKworaW50IHRlc3RfcnNoaWZ0MShCSU8gKmJwKQorCXsKKwlCSUdOVU0gKmEsKmIsKmM7CisJaW50IGk7CisKKwlhPUJOX25ldygpOworCWI9Qk5fbmV3KCk7CisJYz1CTl9uZXcoKTsKKworCUJOX2JudGVzdF9yYW5kKGEsMjAwLDAsMCk7IC8qKi8KKwlhLT5uZWc9cmFuZF9uZWcoKTsKKwlmb3IgKGk9MDsgaTxudW0wOyBpKyspCisJCXsKKwkJQk5fcnNoaWZ0MShiLGEpOworCQlpZiAoYnAgIT0gTlVMTCkKKwkJCXsKKwkJCWlmICghcmVzdWx0cykKKwkJCQl7CisJCQkJQk5fcHJpbnQoYnAsYSk7CisJCQkJQklPX3B1dHMoYnAsIiAvIDIiKTsKKwkJCQlCSU9fcHV0cyhicCwiIC0gIik7CisJCQkJfQorCQkJQk5fcHJpbnQoYnAsYik7CisJCQlCSU9fcHV0cyhicCwiXG4iKTsKKwkJCX0KKwkJQk5fc3ViKGMsYSxiKTsKKwkJQk5fc3ViKGMsYyxiKTsKKwkJaWYoIUJOX2lzX3plcm8oYykgJiYgIUJOX2Fic19pc193b3JkKGMsIDEpKQorCQkgICAgeworCQkgICAgZnByaW50ZihzdGRlcnIsIlJpZ2h0IHNoaWZ0IG9uZSB0ZXN0IGZhaWxlZCFcbiIpOworCQkgICAgcmV0dXJuIDA7CisJCSAgICB9CisJCUJOX2NvcHkoYSxiKTsKKwkJfQorCUJOX2ZyZWUoYSk7CisJQk5fZnJlZShiKTsKKwlCTl9mcmVlKGMpOworCXJldHVybigxKTsKKwl9CisKK2ludCByYW5kX25lZyh2b2lkKQorCXsKKwlzdGF0aWMgdW5zaWduZWQgaW50IG5lZz0wOworCXN0YXRpYyBpbnQgc2lnbls4XT17MCwwLDAsMSwxLDAsMSwxfTsKKworCXJldHVybihzaWduWyhuZWcrKyklOF0pOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ibi9kaXZ0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vZGl2dGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZmM2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vZGl2dGVzdC5jCkBAIC0wLDAgKzEsNDEgQEAKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK3N0YXRpYyBpbnQgUmFuZChuKQoreworICAgIHVuc2lnbmVkIGNoYXIgeFsyXTsKKyAgICBSQU5EX3BzZXVkb19ieXRlcyh4LDIpOworICAgIHJldHVybiAoeFswXSArIDIqeFsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZyhjaGFyICptLCBCSUdOVU0gKmEsIEJJR05VTSAqYikKK3sKKyAgICBwcmludGYoIiVzIVxuYT0iLG0pOworICAgIEJOX3ByaW50X2ZwKHN0ZG91dCwgYSk7CisgICAgcHJpbnRmKCJcbmI9Iik7CisgICAgQk5fcHJpbnRfZnAoc3Rkb3V0LCBiKTsKKyAgICBwcmludGYoIlxuIik7CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK21haW4oKQoreworICAgIEJJR05VTSAqYT1CTl9uZXcoKSwgKmI9Qk5fbmV3KCksICpjPUJOX25ldygpLCAqZD1CTl9uZXcoKSwKKwkqQz1CTl9uZXcoKSwgKkQ9Qk5fbmV3KCk7CisgICAgQk5fUkVDUF9DVFggKnJlY3A9Qk5fUkVDUF9DVFhfbmV3KCk7CisgICAgQk5fQ1RYICpjdHg9Qk5fQ1RYX25ldygpOworCisgICAgZm9yKDs7KSB7CisJQk5fcHNldWRvX3JhbmQoYSxSYW5kKCksMCwwKTsKKwlCTl9wc2V1ZG9fcmFuZChiLFJhbmQoKSwwLDApOworCWlmIChCTl9pc196ZXJvKGIpKSBjb250aW51ZTsKKworCUJOX1JFQ1BfQ1RYX3NldChyZWNwLGIsY3R4KTsKKwlpZiAoQk5fZGl2KEMsRCxhLGIsY3R4KSAhPSAxKQorCSAgICBidWcoIkJOX2RpdiBmYWlsZWQiLGEsYik7CisJaWYgKEJOX2Rpdl9yZWNwKGMsZCxhLHJlY3AsY3R4KSAhPSAxKQorCSAgICBidWcoIkJOX2Rpdl9yZWNwIGZhaWxlZCIsYSxiKTsKKwllbHNlIGlmIChCTl9jbXAoYyxDKSAhPSAwIHx8IEJOX2NtcChjLEMpICE9IDApCisJICAgIGJ1ZygibWlzbWF0Y2giLGEsYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2V4cC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2V4cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NjViMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vZXhwLmMKQEAgLTAsMCArMSw2MiBAQAorLyogdW51c2VkICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdG1kaWZmLmg+CisjaW5jbHVkZSAiYm5fbGNsLmgiCisKKyNkZWZpbmUgU0laRQkyNTYKKyNkZWZpbmUgTlVNCSg4KjgqOCkKKyNkZWZpbmUgTU9ECSg4KjgqOCo4KjgpCisKK21haW4oYXJnYyxhcmd2KQoraW50IGFyZ2M7CitjaGFyICphcmd2W107CisJeworCUJOX0NUWCBjdHg7CisJQklHTlVNIGEsYixjLHIscnIsdCxsOworCWludCBqLGksc2l6ZT1TSVpFLG51bT1OVU0sbW9kPU1PRDsKKwljaGFyICpzdGFydCwqZW5kOworCUJOX01PTlRfQ1RYIG1vbnQ7CisJZG91YmxlIGQsbWQ7CisKKwlCTl9NT05UX0NUWF9pbml0KCZtb250KTsKKwlCTl9DVFhfaW5pdCgmY3R4KTsKKwlCTl9pbml0KCZhKTsKKwlCTl9pbml0KCZiKTsKKwlCTl9pbml0KCZjKTsKKwlCTl9pbml0KCZyKTsKKworCXN0YXJ0PW1zX3RpbWVfbmV3KCk7CisJZW5kPW1zX3RpbWVfbmV3KCk7CisJd2hpbGUgKHNpemUgPD0gMTAyNCo4KQorCQl7CisJCUJOX3JhbmQoJmEsc2l6ZSwwLDApOworCQlCTl9yYW5kKCZiLHNpemUsMSwwKTsKKwkJQk5fcmFuZCgmYyxzaXplLDAsMSk7CisKKwkJQk5fbW9kKCZhLCZhLCZjLCZjdHgpOworCisJCW1zX3RpbWVfZ2V0KHN0YXJ0KTsKKwkJZm9yIChpPTA7IGk8MTA7IGkrKykKKwkJCUJOX01PTlRfQ1RYX3NldCgmbW9udCwmYywmY3R4KTsKKwkJbXNfdGltZV9nZXQoZW5kKTsKKwkJbWQ9bXNfdGltZV9kaWZmKHN0YXJ0LGVuZCk7CisKKwkJbXNfdGltZV9nZXQoc3RhcnQpOworCQlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJCXsKKwkJCS8qIGJuX211bGwoJnIsJmEsJmIsJmN0eCk7ICovCisJCQkvKiBCTl9zcXIoJnIsJmEsJmN0eCk7ICovCisJCQlCTl9tb2RfZXhwX21vbnQoJnIsJmEsJmIsJmMsJmN0eCwmbW9udCk7CisJCQl9CisJCW1zX3RpbWVfZ2V0KGVuZCk7CisJCWQ9bXNfdGltZV9kaWZmKHN0YXJ0LGVuZCkvKiAqNTAvMzMgKi87CisJCXByaW50ZigiJTVkIGJpdDolNi4yZiAlNmQgJTYuNGYgJTRkIG1fc2V0KCU1LjRmKVxuIixzaXplLAorCQkJZCxudW0sZC9udW0sKGludCkoKGQvbnVtKSptb2QpLG1kLzEwLjApOworCQludW0vPTg7CisJCW1vZC89ODsKKwkJaWYgKG51bSA8PSAwKSBudW09MTsKKwkJc2l6ZSo9MjsKKwkJfQorCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL2V4cHNwZWVkLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vZXhwc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDVmMjIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2V4cHNwZWVkLmMKQEAgLTAsMCArMSwzNTMgQEAKKy8qIHVudXNlZCAqLworCisvKiBjcnlwdG8vYm4vZXhwc3BlZWQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBtb3N0IG9mIHRoaXMgY29kZSBoYXMgYmVlbiBwaWxmZXJlZCBmcm9tIG15IGxpYmRlcyBzcGVlZC5jIHByb2dyYW0gKi8KKworI2RlZmluZSBCQVNFTlVNCTUwMDAKKyNkZWZpbmUgTlVNX1NUQVJUIDAKKworCisvKiBkZXRlcm1pbmUgdGltaW5ncyBmb3IgbW9kZXhwLCBtb2RtdWwsIG1vZHNxciwgZ2NkLCBLcm9uZWNrZXIgc3ltYm9sLAorICogbW9kdWxhciBpbnZlcnNlLCBvciBtb2R1bGFyIHNxdWFyZSByb290cyAqLworI2RlZmluZSBURVNUX0VYUAorI3VuZGVmIFRFU1RfTVVMCisjdW5kZWYgVEVTVF9TUVIKKyN1bmRlZiBURVNUX0dDRAorI3VuZGVmIFRFU1RfS1JPTgorI3VuZGVmIFRFU1RfSU5WCisjdW5kZWYgVEVTVF9TUVJUCisjZGVmaW5lIFBfTU9EXzY0IDkgLyogbGVhc3Qgc2lnbmlmaWNhbnQgNiBiaXRzIGZvciBwcmltZSB0byBiZSB1c2VkIGZvciBCTl9zcXJ0IHRpbWluZ3MgKi8KKworI2lmIGRlZmluZWQoVEVTVF9FWFApICsgZGVmaW5lZChURVNUX01VTCkgKyBkZWZpbmVkKFRFU1RfU1FSKSArIGRlZmluZWQoVEVTVF9HQ0QpICsgZGVmaW5lZChURVNUX0tST04pICsgZGVmaW5lZChURVNUX0lOVikgK2RlZmluZWQoVEVTVF9TUVJUKSAhPSAxCisjICBlcnJvciAiY2hvb3NlIG9uZSB0ZXN0IgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFRFU1RfSU5WKSB8fCBkZWZpbmVkKFRFU1RfU1FSVCkKKyMgIGRlZmluZSBDX1BSSU1FCitzdGF0aWMgdm9pZCBnZW5wcmltZV9jYihpbnQgcCwgaW50IG4sIHZvaWQgKmFyZyk7CisjZW5kaWYKKworCisKKyN1bmRlZiBQUk9HCisjZGVmaW5lIFBST0cgYm5zcGVlZF9tYWluCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAoIWRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKSB8fCBkZWZpbmVkKF9fREVDQykpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01BQ09TWCkKKyNkZWZpbmUgVElNRVMKKyNlbmRpZgorCisjaWZuZGVmIF9JUklYCisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjaWZkZWYgVElNRVMKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNlbmRpZgorCisvKiBEZXBlbmRpbmcgb24gdGhlIFZNUyB2ZXJzaW9uLCB0aGUgdG1zIHN0cnVjdHVyZSBpcyBwZXJoYXBzIGRlZmluZWQuCisgICBUaGUgX19UTVMgbWFjcm8gd2lsbCBzaG93IGlmIGl0IHdhcy4gIElmIGl0IHdhc24ndCBkZWZpbmVkLCB3ZSBzaG91bGQKKyAgIHVuZGVmaW5lIFRJTUVTLCBzaW5jZSB0aGF0IHRlbGxzIHRoZSByZXN0IG9mIHRoZSBwcm9ncmFtIGhvdyB0aGluZ3MKKyAgIHNob3VsZCBiZSBoYW5kbGVkLgkJCQktLSBSaWNoYXJkIExldml0dGUgKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNU19ERUNDKSAmJiAhZGVmaW5lZChfX1RNUykKKyN1bmRlZiBUSU1FUworI2VuZGlmCisKKyNpZm5kZWYgVElNRVMKKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChzdW4pIHx8IGRlZmluZWQoX191bHRyaXgpCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisvKiBUaGUgZm9sbG93aW5nIGlmIGZyb20gdGltZXMoMykgbWFuIHBhZ2UuICBJdCBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkICovCisjaWZuZGVmIEhaCisjIGlmbmRlZiBDTEtfVENLCisjICBpZm5kZWYgX0JTRF9DTEtfVENLXyAvKiBGcmVlQlNEIGhhY2sgKi8KKyMgICBkZWZpbmUgSFoJMTAwLjAKKyMgIGVsc2UgLyogX0JTRF9DTEtfVENLXyAqLworIyAgIGRlZmluZSBIWiAoKGRvdWJsZSlfQlNEX0NMS19UQ0tfKQorIyAgZW5kaWYKKyMgZWxzZSAvKiBDTEtfVENLICovCisjICBkZWZpbmUgSFogKChkb3VibGUpQ0xLX1RDSykKKyMgZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgQlVGU0laRQorI2RlZmluZSBCVUZTSVpFCSgobG9uZykxMDI0KjgpCitpbnQgcnVuPTA7CisKK3N0YXRpYyBkb3VibGUgVGltZV9GKGludCBzKTsKKyNkZWZpbmUgU1RBUlQJMAorI2RlZmluZSBTVE9QCTEKKworc3RhdGljIGRvdWJsZSBUaW1lX0YoaW50IHMpCisJeworCWRvdWJsZSByZXQ7CisjaWZkZWYgVElNRVMKKwlzdGF0aWMgc3RydWN0IHRtcyB0c3RhcnQsdGVuZDsKKworCWlmIChzID09IFNUQVJUKQorCQl7CisJCXRpbWVzKCZ0c3RhcnQpOworCQlyZXR1cm4oMCk7CisJCX0KKwllbHNlCisJCXsKKwkJdGltZXMoJnRlbmQpOworCQlyZXQ9KChkb3VibGUpKHRlbmQudG1zX3V0aW1lLXRzdGFydC50bXNfdXRpbWUpKS9IWjsKKwkJcmV0dXJuKChyZXQgPCAxZS0zKT8xZS0zOnJldCk7CisJCX0KKyNlbHNlIC8qICF0aW1lcygpICovCisJc3RhdGljIHN0cnVjdCB0aW1lYiB0c3RhcnQsdGVuZDsKKwlsb25nIGk7CisKKwlpZiAocyA9PSBTVEFSVCkKKwkJeworCQlmdGltZSgmdHN0YXJ0KTsKKwkJcmV0dXJuKDApOworCQl9CisJZWxzZQorCQl7CisJCWZ0aW1lKCZ0ZW5kKTsKKwkJaT0obG9uZyl0ZW5kLm1pbGxpdG0tKGxvbmcpdHN0YXJ0Lm1pbGxpdG07CisJCXJldD0oKGRvdWJsZSkodGVuZC50aW1lLXRzdGFydC50aW1lKSkrKChkb3VibGUpaSkvMTAwMC4wOworCQlyZXR1cm4oKHJldCA8IDAuMDAxKT8wLjAwMTpyZXQpOworCQl9CisjZW5kaWYKKwl9CisKKyNkZWZpbmUgTlVNX1NJWkVTCTcKKyNpZiBOVU1fU1RBUlQgPiBOVU1fU0laRVMKKyMgICBlcnJvciAiTlVNX1NUQVJUID4gTlVNX1NJWkVTIgorI2VuZGlmCitzdGF0aWMgaW50IHNpemVzW05VTV9TSVpFU109ezEyOCwyNTYsNTEyLDEwMjQsMjA0OCw0MDk2LDgxOTJ9Oworc3RhdGljIGludCBtdWxfY1tOVU1fU0laRVNdPXs4KjgqOCo4KjgqOCw4KjgqOCo4KjgsOCo4KjgqOCw4KjgqOCw4KjgsOCwxfTsKKy8qc3RhdGljIGludCBzaXplc1tOVU1fU0laRVNdPXs1OSwxNzksMjk5LDQxOSw1Mzl9OyAqLworCisjZGVmaW5lIFJBTkRfU0VFRChzdHJpbmcpIHsgY29uc3QgY2hhciBzdHJbXSA9IHN0cmluZzsgUkFORF9zZWVkKHN0cmluZywgc2l6ZW9mIHN0cik7IH0KKwordm9pZCBkb19tdWxfZXhwKEJJR05VTSAqcixCSUdOVU0gKmEsQklHTlVNICpiLEJJR05VTSAqYyxCTl9DVFggKmN0eCk7IAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCUJOX0NUWCAqY3R4OworCUJJR05VTSAqYSwqYiwqYywqcjsKKworI2lmIDEKKwlpZiAoIUNSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygwLDAsMCwwLDApKQorCQlhYm9ydCgpOworI2VuZGlmCisKKwljdHg9Qk5fQ1RYX25ldygpOworCWE9Qk5fbmV3KCk7CisJYj1CTl9uZXcoKTsKKwljPUJOX25ldygpOworCXI9Qk5fbmV3KCk7CisKKwl3aGlsZSAoIVJBTkRfc3RhdHVzKCkpCisJCS8qIG5vdCBlbm91Z2ggYml0cyAqLworCQlSQU5EX1NFRUQoIkkgZGVtYW5kIGEgbWFudWFsIHJlY291bnQhIik7CisKKwlkb19tdWxfZXhwKHIsYSxiLGMsY3R4KTsKKwlyZXR1cm4gMDsKKwl9CisKK3ZvaWQgZG9fbXVsX2V4cChCSUdOVU0gKnIsIEJJR05VTSAqYSwgQklHTlVNICpiLCBCSUdOVU0gKmMsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgaSxrOworCWRvdWJsZSB0bTsKKwlsb25nIG51bTsKKworCW51bT1CQVNFTlVNOworCWZvciAoaT1OVU1fU1RBUlQ7IGk8TlVNX1NJWkVTOyBpKyspCisJCXsKKyNpZmRlZiBDX1BSSU1FCisjICBpZmRlZiBURVNUX1NRUlQKKwkJaWYgKCFCTl9zZXRfd29yZChhLCA2NCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX3NldF93b3JkKGIsIFBfTU9EXzY0KSkgZ290byBlcnI7CisjICAgIGRlZmluZSBBREQgYQorIyAgICBkZWZpbmUgUkVNIGIKKyMgIGVsc2UKKyMgICAgZGVmaW5lIEFERCBOVUxMCisjICAgIGRlZmluZSBSRU0gTlVMTAorIyAgZW5kaWYKKwkJaWYgKCFCTl9nZW5lcmF0ZV9wcmltZShjLHNpemVzW2ldLDAsQURELFJFTSxnZW5wcmltZV9jYixOVUxMKSkgZ290byBlcnI7CisJCXB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJZmZsdXNoKHN0ZGVycik7CisjZW5kaWYKKworCQlmb3IgKGs9MDsgazxudW07IGsrKykKKwkJCXsKKwkJCWlmIChrJTUwID09IDApIC8qIEF2ZXJhZ2Ugb3ZlciBudW0vNTAgZGlmZmVyZW50IGNob2ljZXMgb2YgcmFuZG9tIG51bWJlcnMuICovCisJCQkJeworCQkJCWlmICghQk5fcHNldWRvX3JhbmQoYSxzaXplc1tpXSwxLDApKSBnb3RvIGVycjsKKworCQkJCWlmICghQk5fcHNldWRvX3JhbmQoYixzaXplc1tpXSwxLDApKSBnb3RvIGVycjsKKworI2lmbmRlZiBDX1BSSU1FCisJCQkJaWYgKCFCTl9wc2V1ZG9fcmFuZChjLHNpemVzW2ldLDEsMSkpIGdvdG8gZXJyOworI2VuZGlmCisKKyNpZmRlZiBURVNUX1NRUlQJCQkJCisJCQkJaWYgKCFCTl9tb2Rfc3FyKGEsYSxjLGN0eCkpIGdvdG8gZXJyOworCQkJCWlmICghQk5fbW9kX3NxcihiLGIsYyxjdHgpKSBnb3RvIGVycjsKKyNlbHNlCisJCQkJaWYgKCFCTl9ubm1vZChhLGEsYyxjdHgpKSBnb3RvIGVycjsKKwkJCQlpZiAoIUJOX25ubW9kKGIsYixjLGN0eCkpIGdvdG8gZXJyOworI2VuZGlmCisKKwkJCQlpZiAoayA9PSAwKQorCQkJCQlUaW1lX0YoU1RBUlQpOworCQkJCX0KKworI2lmIGRlZmluZWQoVEVTVF9FWFApCisJCQlpZiAoIUJOX21vZF9leHAocixhLGIsYyxjdHgpKSBnb3RvIGVycjsKKyNlbGlmIGRlZmluZWQoVEVTVF9NVUwpCisJCQl7CisJCQlpbnQgaSA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykKKwkJCQlpZiAoIUJOX21vZF9tdWwocixhLGIsYyxjdHgpKSBnb3RvIGVycjsKKwkJCX0KKyNlbGlmIGRlZmluZWQoVEVTVF9TUVIpCisJCQl7CisJCQlpbnQgaSA9IDA7CisJCQlmb3IgKGkgPSAwOyBpIDwgNTA7IGkrKykKKwkJCQl7CisJCQkJaWYgKCFCTl9tb2Rfc3FyKHIsYSxjLGN0eCkpIGdvdG8gZXJyOworCQkJCWlmICghQk5fbW9kX3NxcihyLGIsYyxjdHgpKSBnb3RvIGVycjsKKwkJCQl9CisJCQl9CisjZWxpZiBkZWZpbmVkKFRFU1RfR0NEKQorCQkJaWYgKCFCTl9nY2QocixhLGIsY3R4KSkgZ290byBlcnI7CisJCQlpZiAoIUJOX2djZChyLGIsYyxjdHgpKSBnb3RvIGVycjsKKwkJCWlmICghQk5fZ2NkKHIsYyxhLGN0eCkpIGdvdG8gZXJyOworI2VsaWYgZGVmaW5lZChURVNUX0tST04pCisJCQlpZiAoLTIgPT0gQk5fa3JvbmVja2VyKGEsYixjdHgpKSBnb3RvIGVycjsKKwkJCWlmICgtMiA9PSBCTl9rcm9uZWNrZXIoYixjLGN0eCkpIGdvdG8gZXJyOworCQkJaWYgKC0yID09IEJOX2tyb25lY2tlcihjLGEsY3R4KSkgZ290byBlcnI7CisjZWxpZiBkZWZpbmVkKFRFU1RfSU5WKQorCQkJaWYgKCFCTl9tb2RfaW52ZXJzZShyLGEsYyxjdHgpKSBnb3RvIGVycjsKKwkJCWlmICghQk5fbW9kX2ludmVyc2UocixiLGMsY3R4KSkgZ290byBlcnI7CisjZWxzZSAvKiBURVNUX1NRUlQgKi8KKwkJCWlmICghQk5fbW9kX3NxcnQocixhLGMsY3R4KSkgZ290byBlcnI7CisJCQlpZiAoIUJOX21vZF9zcXJ0KHIsYixjLGN0eCkpIGdvdG8gZXJyOworI2VuZGlmCisJCQl9CisJCXRtPVRpbWVfRihTVE9QKTsKKwkJcHJpbnRmKAorI2lmIGRlZmluZWQoVEVTVF9FWFApCisJCQkibW9kZXhwICU0ZCBeICU0ZCAlJSAlNGQiCisjZWxpZiBkZWZpbmVkKFRFU1RfTVVMKQorCQkJIjUwKm1vZG11bCAlNGQgJTRkICU0ZCIKKyNlbGlmIGRlZmluZWQoVEVTVF9TUVIpCisJCQkiMTAwKm1vZHNxciAlNGQgJTRkICU0ZCIKKyNlbGlmIGRlZmluZWQoVEVTVF9HQ0QpCisJCQkiMypnY2QgJTRkICU0ZCAlNGQiCisjZWxpZiBkZWZpbmVkKFRFU1RfS1JPTikKKwkJCSIzKmtyb25lY2tlciAlNGQgJTRkICU0ZCIKKyNlbGlmIGRlZmluZWQoVEVTVF9JTlYpCisJCQkiMippbnYgJTRkICU0ZCBtb2QgJTRkIgorI2Vsc2UgLyogVEVTVF9TUVJUICovCisJCQkiMipzcXJ0IFtwcmltZSA9PSAlZCAobW9kIDY0KV0gJTRkICU0ZCBtb2QgJTRkIgorI2VuZGlmCisJCQkiIC0+ICU4LjZmbXMgJTUuMWYgKCVsZClcbiIsCisjaWZkZWYgVEVTVF9TUVJUCisJCQlQX01PRF82NCwKKyNlbmRpZgorCQkJc2l6ZXNbaV0sc2l6ZXNbaV0sc2l6ZXNbaV0sdG0qMTAwMC4wL251bSx0bSptdWxfY1tpXS9udW0sIG51bSk7CisJCW51bS89NzsKKwkJaWYgKG51bSA8PSAwKSBudW09MTsKKwkJfQorCXJldHVybjsKKworIGVycjoKKwlFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisJfQorCisKKyNpZmRlZiBDX1BSSU1FCitzdGF0aWMgdm9pZCBnZW5wcmltZV9jYihpbnQgcCwgaW50IG4sIHZvaWQgKmFyZykKKwl7CisJY2hhciBjPScqJzsKKworCWlmIChwID09IDApIGM9Jy4nOworCWlmIChwID09IDEpIGM9JysnOworCWlmIChwID09IDIpIGM9JyonOworCWlmIChwID09IDMpIGM9J1xuJzsKKwlwdXRjKGMsIHN0ZGVycik7CisJZmZsdXNoKHN0ZGVycik7CisJKHZvaWQpbjsKKwkodm9pZClhcmc7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYm4vZXhwdGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2V4cHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzRhOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL2V4cHRlc3QuYwpAQCAtMCwwICsxLDIwNCBAQAorLyogY3J5cHRvL2JuL2V4cHRlc3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIi4uL2Vfb3MuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNkZWZpbmUgTlVNX0JJVFMJKEJOX0JJVFMqMikKKworc3RhdGljIGNvbnN0IGNoYXIgcm5kX3NlZWRbXSA9ICJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHkiOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorCXsKKwlCTl9DVFggKmN0eDsKKwlCSU8gKm91dD1OVUxMOworCWludCBpLHJldDsKKwl1bnNpZ25lZCBjaGFyIGM7CisJQklHTlVNICpyX21vbnQsKnJfbW9udF9jb25zdCwqcl9yZWNwLCpyX3NpbXBsZSwqYSwqYiwqbTsKKworCVJBTkRfc2VlZChybmRfc2VlZCwgc2l6ZW9mIHJuZF9zZWVkKTsgLyogb3IgQk5fcmFuZCBtYXkgZmFpbCwgYW5kIHdlIGRvbid0CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBldmVuIGNoZWNrIGl0cyByZXR1cm4gdmFsdWUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICh3aGljaCB3ZSBzaG91bGQpICovCisKKwlFUlJfbG9hZF9CTl9zdHJpbmdzKCk7CisKKwljdHg9Qk5fQ1RYX25ldygpOworCWlmIChjdHggPT0gTlVMTCkgRVhJVCgxKTsKKwlyX21vbnQ9Qk5fbmV3KCk7CisJcl9tb250X2NvbnN0PUJOX25ldygpOworCXJfcmVjcD1CTl9uZXcoKTsKKwlyX3NpbXBsZT1CTl9uZXcoKTsKKwlhPUJOX25ldygpOworCWI9Qk5fbmV3KCk7CisJbT1CTl9uZXcoKTsKKwlpZiAoCShyX21vbnQgPT0gTlVMTCkgfHwgKHJfcmVjcCA9PSBOVUxMKSB8fAorCQkoYSA9PSBOVUxMKSB8fCAoYiA9PSBOVUxMKSkKKwkJZ290byBlcnI7CisKKwlvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpOworCisJaWYgKG91dCA9PSBOVUxMKSBFWElUKDEpOworCUJJT19zZXRfZnAob3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisKKwlmb3IgKGk9MDsgaTwyMDA7IGkrKykKKwkJeworCQlSQU5EX2J5dGVzKCZjLDEpOworCQljPShjJUJOX0JJVFMpLUJOX0JJVFMyOworCQlCTl9yYW5kKGEsTlVNX0JJVFMrYywwLDApOworCisJCVJBTkRfYnl0ZXMoJmMsMSk7CisJCWM9KGMlQk5fQklUUyktQk5fQklUUzI7CisJCUJOX3JhbmQoYixOVU1fQklUUytjLDAsMCk7CisKKwkJUkFORF9ieXRlcygmYywxKTsKKwkJYz0oYyVCTl9CSVRTKS1CTl9CSVRTMjsKKwkJQk5fcmFuZChtLE5VTV9CSVRTK2MsMCwxKTsKKworCQlCTl9tb2QoYSxhLG0sY3R4KTsKKwkJQk5fbW9kKGIsYixtLGN0eCk7CisKKwkJcmV0PUJOX21vZF9leHBfbW9udChyX21vbnQsYSxiLG0sY3R4LE5VTEwpOworCQlpZiAocmV0IDw9IDApCisJCQl7CisJCQlwcmludGYoIkJOX21vZF9leHBfbW9udCgpIHByb2JsZW1zXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMob3V0KTsKKwkJCUVYSVQoMSk7CisJCQl9CisKKwkJcmV0PUJOX21vZF9leHBfcmVjcChyX3JlY3AsYSxiLG0sY3R4KTsKKwkJaWYgKHJldCA8PSAwKQorCQkJeworCQkJcHJpbnRmKCJCTl9tb2RfZXhwX3JlY3AoKSBwcm9ibGVtc1xuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKG91dCk7CisJCQlFWElUKDEpOworCQkJfQorCisJCXJldD1CTl9tb2RfZXhwX3NpbXBsZShyX3NpbXBsZSxhLGIsbSxjdHgpOworCQlpZiAocmV0IDw9IDApCisJCQl7CisJCQlwcmludGYoIkJOX21vZF9leHBfc2ltcGxlKCkgcHJvYmxlbXNcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhvdXQpOworCQkJRVhJVCgxKTsKKwkJCX0KKworCQlyZXQ9Qk5fbW9kX2V4cF9tb250X2NvbnN0dGltZShyX21vbnRfY29uc3QsYSxiLG0sY3R4LE5VTEwpOworCQlpZiAocmV0IDw9IDApCisJCQl7CisJCQlwcmludGYoIkJOX21vZF9leHBfbW9udF9jb25zdHRpbWUoKSBwcm9ibGVtc1xuIik7CisJCQlFUlJfcHJpbnRfZXJyb3JzKG91dCk7CisJCQlFWElUKDEpOworCQkJfQorCisJCWlmIChCTl9jbXAocl9zaW1wbGUsIHJfbW9udCkgPT0gMAorCQkgICAgJiYgQk5fY21wKHJfc2ltcGxlLHJfcmVjcCkgPT0gMAorCQkJJiYgQk5fY21wKHJfc2ltcGxlLHJfbW9udF9jb25zdCkgPT0gMCkKKwkJCXsKKwkJCXByaW50ZigiLiIpOworCQkJZmZsdXNoKHN0ZG91dCk7CisJCQl9CisJCWVsc2UKKwkJICAJeworCQkJaWYgKEJOX2NtcChyX3NpbXBsZSxyX21vbnQpICE9IDApCisJCQkJcHJpbnRmKCJcbnNpbXBsZSBhbmQgbW9udCByZXN1bHRzIGRpZmZlclxuIik7CisJCQlpZiAoQk5fY21wKHJfc2ltcGxlLHJfbW9udF9jb25zdCkgIT0gMCkKKwkJCQlwcmludGYoIlxuc2ltcGxlIGFuZCBtb250IGNvbnN0IHRpbWUgcmVzdWx0cyBkaWZmZXJcbiIpOworCQkJaWYgKEJOX2NtcChyX3NpbXBsZSxyX3JlY3ApICE9IDApCisJCQkJcHJpbnRmKCJcbnNpbXBsZSBhbmQgcmVjcCByZXN1bHRzIGRpZmZlclxuIik7CisKKwkJCXByaW50ZigiYSAoJTNkKSA9ICIsQk5fbnVtX2JpdHMoYSkpOyAgIEJOX3ByaW50KG91dCxhKTsKKwkJCXByaW50ZigiXG5iICglM2QpID0gIixCTl9udW1fYml0cyhiKSk7IEJOX3ByaW50KG91dCxiKTsKKwkJCXByaW50ZigiXG5tICglM2QpID0gIixCTl9udW1fYml0cyhtKSk7IEJOX3ByaW50KG91dCxtKTsKKwkJCXByaW50ZigiXG5zaW1wbGUgICA9Iik7CUJOX3ByaW50KG91dCxyX3NpbXBsZSk7CisJCQlwcmludGYoIlxucmVjcCAgICAgPSIpOwlCTl9wcmludChvdXQscl9yZWNwKTsKKwkJCXByaW50ZigiXG5tb250ICAgICA9Iik7IEJOX3ByaW50KG91dCxyX21vbnQpOworCQkJcHJpbnRmKCJcbm1vbnRfY3QgID0iKTsgQk5fcHJpbnQob3V0LHJfbW9udF9jb25zdCk7CisJCQlwcmludGYoIlxuIik7CisJCQlFWElUKDEpOworCQkJfQorCQl9CisJQk5fZnJlZShyX21vbnQpOworCUJOX2ZyZWUocl9tb250X2NvbnN0KTsKKwlCTl9mcmVlKHJfcmVjcCk7CisJQk5fZnJlZShyX3NpbXBsZSk7CisJQk5fZnJlZShhKTsKKwlCTl9mcmVlKGIpOworCUJOX2ZyZWUobSk7CisJQk5fQ1RYX2ZyZWUoY3R4KTsKKwlFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShOVUxMKTsKKwlDUllQVE9fbWVtX2xlYWtzKG91dCk7CisJQklPX2ZyZWUob3V0KTsKKwlwcmludGYoIiBkb25lXG4iKTsKKwlFWElUKDApOworZXJyOgorCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisJRVJSX3ByaW50X2Vycm9ycyhvdXQpOworI2lmZGVmIE9QRU5TU0xfU1lTX05FVFdBUkUKKyAgICBwcmludGYoIkVSUk9SXG4iKTsKKyNlbmRpZgorCUVYSVQoMSk7CisJcmV0dXJuKDEpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL3RvZG8gYi9saWIvb3BlbnNzbC9jcnlwdG8vYm4vdG9kbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDdlMzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2JuL3RvZG8KQEAgLTAsMCArMSwzIEBACitDYWNoZSBSRUNQX0NUWCB2YWx1ZXMKK21ha2UgdGhlIHJlc3VsdCBhcmd1bWVudCBpbmRlcGVuZGFudCBvZiB0aGUgaW5wdXRzLgorc3BsaXQgdXAgdGhlIF9leHBfIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2JuL3Ztcy1oZWxwZXIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi92bXMtaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2MzE0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ibi92bXMtaGVscGVyLmMKQEAgLTAsMCArMSw2OCBAQAorLyogdm1zLWhlbHBlci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSAiYm5fbGNsLmgiCisKK2JuX2Rpdl93b3Jkc19hYm9ydChpbnQgaSkKK3sKKyNpZmRlZiBCTl9ERUJVRworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1RESU8pICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjE2KQorCWZwcmludGYoc3RkZXJyLCJEaXZpc2lvbiB3b3VsZCBvdmVyZmxvdyAoJWQpXG4iLGkpOworI2VuZGlmCisJYWJvcnQoKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2J1ZmZlci9idWZfZXJyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vYnVmZmVyL2J1Zl9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjFkZTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2J1ZmZlci9idWZfZXJyLmMKQEAgLTAsMCArMSw5OSBAQAorLyogY3J5cHRvL2J1ZmZlci9idWZfZXJyLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBOT1RFOiB0aGlzIGZpbGUgd2FzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBta2Vyci5wbCBzY3JpcHQ6IGFueSBjaGFuZ2VzCisgKiBtYWRlIHRvIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IG5leHQgdXBkYXRlcyB0aGlzIGZpbGUsCisgKiBvbmx5IHJlYXNvbiBzdHJpbmdzIHdpbGwgYmUgcHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworI2RlZmluZSBFUlJfRlVOQyhmdW5jKSBFUlJfUEFDSyhFUlJfTElCX0JVRixmdW5jLDApCisjZGVmaW5lIEVSUl9SRUFTT04ocmVhc29uKSBFUlJfUEFDSyhFUlJfTElCX0JVRiwwLHJlYXNvbikKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBCVUZfc3RyX2Z1bmN0c1tdPQorCXsKK3tFUlJfRlVOQyhCVUZfRl9CVUZfTUVNRFVQKSwJIkJVRl9tZW1kdXAifSwKK3tFUlJfRlVOQyhCVUZfRl9CVUZfTUVNX0dST1cpLAkiQlVGX01FTV9ncm93In0sCit7RVJSX0ZVTkMoQlVGX0ZfQlVGX01FTV9HUk9XX0NMRUFOKSwJIkJVRl9NRU1fZ3Jvd19jbGVhbiJ9LAore0VSUl9GVU5DKEJVRl9GX0JVRl9NRU1fTkVXKSwJIkJVRl9NRU1fbmV3In0sCit7RVJSX0ZVTkMoQlVGX0ZfQlVGX1NUUkRVUCksCSJCVUZfc3RyZHVwIn0sCit7RVJSX0ZVTkMoQlVGX0ZfQlVGX1NUUk5EVVApLAkiQlVGX3N0cm5kdXAifSwKK3swLE5VTEx9CisJfTsKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBCVUZfc3RyX3JlYXNvbnNbXT0KKwl7Cit7MCxOVUxMfQorCX07CisKKyNlbmRpZgorCit2b2lkIEVSUl9sb2FkX0JVRl9zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhCVUZfc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsQlVGX3N0cl9mdW5jdHMpOworCQlFUlJfbG9hZF9zdHJpbmdzKDAsQlVGX3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2J1ZmZlci9idWZmZXIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9idWZmZXIvYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIwZWE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9idWZmZXIvYnVmZmVyLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qIGNyeXB0by9idWZmZXIvYnVmZmVyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorCitCVUZfTUVNICpCVUZfTUVNX25ldyh2b2lkKQorCXsKKwlCVUZfTUVNICpyZXQ7CisKKwlyZXQ9T1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJVRl9NRU0pKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJQlVGZXJyKEJVRl9GX0JVRl9NRU1fTkVXLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0LT5sZW5ndGg9MDsKKwlyZXQtPm1heD0wOworCXJldC0+ZGF0YT1OVUxMOworCXJldHVybihyZXQpOworCX0KKwordm9pZCBCVUZfTUVNX2ZyZWUoQlVGX01FTSAqYSkKKwl7CisJaWYoYSA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlpZiAoYS0+ZGF0YSAhPSBOVUxMKQorCQl7CisJCW1lbXNldChhLT5kYXRhLDAsKHVuc2lnbmVkIGludClhLT5tYXgpOworCQlPUEVOU1NMX2ZyZWUoYS0+ZGF0YSk7CisJCX0KKwlPUEVOU1NMX2ZyZWUoYSk7CisJfQorCitpbnQgQlVGX01FTV9ncm93KEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbikKKwl7CisJY2hhciAqcmV0OworCXNpemVfdCBuOworCisJaWYgKHN0ci0+bGVuZ3RoID49IGxlbikKKwkJeworCQlzdHItPmxlbmd0aD1sZW47CisJCXJldHVybihsZW4pOworCQl9CisJaWYgKHN0ci0+bWF4ID49IGxlbikKKwkJeworCQltZW1zZXQoJnN0ci0+ZGF0YVtzdHItPmxlbmd0aF0sMCxsZW4tc3RyLT5sZW5ndGgpOworCQlzdHItPmxlbmd0aD1sZW47CisJCXJldHVybihsZW4pOworCQl9CisJbj0obGVuKzMpLzMqNDsKKwlpZiAoc3RyLT5kYXRhID09IE5VTEwpCisJCXJldD1PUEVOU1NMX21hbGxvYyhuKTsKKwllbHNlCisJCXJldD1PUEVOU1NMX3JlYWxsb2Moc3RyLT5kYXRhLG4pOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlCVUZlcnIoQlVGX0ZfQlVGX01FTV9HUk9XLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJbGVuPTA7CisJCX0KKwllbHNlCisJCXsKKwkJc3RyLT5kYXRhPXJldDsKKwkJc3RyLT5tYXg9bjsKKwkJbWVtc2V0KCZzdHItPmRhdGFbc3RyLT5sZW5ndGhdLDAsbGVuLXN0ci0+bGVuZ3RoKTsKKwkJc3RyLT5sZW5ndGg9bGVuOworCQl9CisJcmV0dXJuKGxlbik7CisJfQorCitpbnQgQlVGX01FTV9ncm93X2NsZWFuKEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbikKKwl7CisJY2hhciAqcmV0OworCXNpemVfdCBuOworCisJaWYgKHN0ci0+bGVuZ3RoID49IGxlbikKKwkJeworCQltZW1zZXQoJnN0ci0+ZGF0YVtsZW5dLDAsc3RyLT5sZW5ndGgtbGVuKTsKKwkJc3RyLT5sZW5ndGg9bGVuOworCQlyZXR1cm4obGVuKTsKKwkJfQorCWlmIChzdHItPm1heCA+PSBsZW4pCisJCXsKKwkJbWVtc2V0KCZzdHItPmRhdGFbc3RyLT5sZW5ndGhdLDAsbGVuLXN0ci0+bGVuZ3RoKTsKKwkJc3RyLT5sZW5ndGg9bGVuOworCQlyZXR1cm4obGVuKTsKKwkJfQorCW49KGxlbiszKS8zKjQ7CisJaWYgKHN0ci0+ZGF0YSA9PSBOVUxMKQorCQlyZXQ9T1BFTlNTTF9tYWxsb2Mobik7CisJZWxzZQorCQlyZXQ9T1BFTlNTTF9yZWFsbG9jX2NsZWFuKHN0ci0+ZGF0YSxzdHItPm1heCxuKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJQlVGZXJyKEJVRl9GX0JVRl9NRU1fR1JPV19DTEVBTixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWxlbj0wOworCQl9CisJZWxzZQorCQl7CisJCXN0ci0+ZGF0YT1yZXQ7CisJCXN0ci0+bWF4PW47CisJCW1lbXNldCgmc3RyLT5kYXRhW3N0ci0+bGVuZ3RoXSwwLGxlbi1zdHItPmxlbmd0aCk7CisJCXN0ci0+bGVuZ3RoPWxlbjsKKwkJfQorCXJldHVybihsZW4pOworCX0KKworY2hhciAqQlVGX3N0cmR1cChjb25zdCBjaGFyICpzdHIpCisJeworCWlmIChzdHIgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCXJldHVybiBCVUZfc3RybmR1cChzdHIsIHN0cmxlbihzdHIpKTsKKwl9CisKK2NoYXIgKkJVRl9zdHJuZHVwKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IHNpeikKKwl7CisJY2hhciAqcmV0OworCisJaWYgKHN0ciA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisKKwlyZXQ9T1BFTlNTTF9tYWxsb2Moc2l6KzEpOworCWlmIChyZXQgPT0gTlVMTCkgCisJCXsKKwkJQlVGZXJyKEJVRl9GX0JVRl9TVFJORFVQLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJQlVGX3N0cmxjcHkocmV0LHN0cixzaXorMSk7CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkICpCVUZfbWVtZHVwKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXopCisJeworCXZvaWQgKnJldDsKKworCWlmIChkYXRhID09IE5VTEwpIHJldHVybihOVUxMKTsKKworCXJldD1PUEVOU1NMX21hbGxvYyhzaXopOworCWlmIChyZXQgPT0gTlVMTCkgCisJCXsKKwkJQlVGZXJyKEJVRl9GX0JVRl9NRU1EVVAsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlyZXR1cm4gbWVtY3B5KHJldCwgZGF0YSwgc2l6KTsKKwl9CQorCitzaXplX3QgQlVGX3N0cmxjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKQorCXsKKwlzaXplX3QgbCA9IDA7CisJZm9yKDsgc2l6ZSA+IDEgJiYgKnNyYzsgc2l6ZS0tKQorCQl7CisJCSpkc3QrKyA9ICpzcmMrKzsKKwkJbCsrOworCQl9CisJaWYgKHNpemUpCisJCSpkc3QgPSAnXDAnOworCXJldHVybiBsICsgc3RybGVuKHNyYyk7CisJfQorCitzaXplX3QgQlVGX3N0cmxjYXQoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKQorCXsKKwlzaXplX3QgbCA9IDA7CisJZm9yKDsgc2l6ZSA+IDAgJiYgKmRzdDsgc2l6ZS0tLCBkc3QrKykKKwkJbCsrOworCXJldHVybiBsICsgQlVGX3N0cmxjcHkoZHN0LCBzcmMsIHNpemUpOworCX0KKwordm9pZCBCVUZfcmV2ZXJzZSh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3Qgc2l6ZSkKKwl7CisJc2l6ZV90IGk7CisJaWYgKGluKQorCQl7CisJCW91dCArPSBzaXplIC0gMTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJCSppbisrID0gKm91dC0tOworCQl9CisJZWxzZQorCQl7CisJCXVuc2lnbmVkIGNoYXIgKnE7CisJCWNoYXIgYzsKKwkJcSA9IG91dCArIHNpemUgLSAxOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZS8yOyBpKyspCisJCQl7CisJCQljID0gKnE7CisJCQkqcS0tID0gKm91dDsKKwkJCSpvdXQrKyA9IGM7CisJCQl9CisJCX0KKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vYnVmZmVyL2J1ZmZlci5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2J1ZmZlci9idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzhlNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2J1ZmZlci9idWZmZXIuaApAQCAtMCwwICsxLDExOSBAQAorLyogY3J5cHRvL2J1ZmZlci9idWZmZXIuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9CVUZGRVJfSAorI2RlZmluZSBIRUFERVJfQlVGRkVSX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWYgIWRlZmluZWQoTk9fU1lTX1RZUEVTX0gpCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworLyogQWxyZWFkeSBkZWNsYXJlZCBpbiBvc3NsX3R5cC5oICovCisvKiB0eXBlZGVmIHN0cnVjdCBidWZfbWVtX3N0IEJVRl9NRU07ICovCisKK3N0cnVjdCBidWZfbWVtX3N0CisJeworCXNpemVfdCBsZW5ndGg7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzICovCisJY2hhciAqZGF0YTsKKwlzaXplX3QgbWF4OwkvKiBzaXplIG9mIGJ1ZmZlciAqLworCX07CisKK0JVRl9NRU0gKkJVRl9NRU1fbmV3KHZvaWQpOwordm9pZAlCVUZfTUVNX2ZyZWUoQlVGX01FTSAqYSk7CitpbnQJQlVGX01FTV9ncm93KEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbik7CitpbnQJQlVGX01FTV9ncm93X2NsZWFuKEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbik7CitjaGFyICoJQlVGX3N0cmR1cChjb25zdCBjaGFyICpzdHIpOworY2hhciAqCUJVRl9zdHJuZHVwKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IHNpeik7Cit2b2lkICoJQlVGX21lbWR1cChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6KTsKK3ZvaWQJQlVGX3JldmVyc2UodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IHNpeik7CisKKy8qIHNhZmUgc3RyaW5nIGZ1bmN0aW9ucyAqLworc2l6ZV90IEJVRl9zdHJsY3B5KGNoYXIgKmRzdCxjb25zdCBjaGFyICpzcmMsc2l6ZV90IHNpeik7CitzaXplX3QgQlVGX3N0cmxjYXQoY2hhciAqZHN0LGNvbnN0IGNoYXIgKnNyYyxzaXplX3Qgc2l6KTsKKworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0JVRl9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIEJVRiBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBCVUZfRl9CVUZfTUVNRFVQCQkJCSAxMDMKKyNkZWZpbmUgQlVGX0ZfQlVGX01FTV9HUk9XCQkJCSAxMDAKKyNkZWZpbmUgQlVGX0ZfQlVGX01FTV9HUk9XX0NMRUFOCQkJIDEwNQorI2RlZmluZSBCVUZfRl9CVUZfTUVNX05FVwkJCQkgMTAxCisjZGVmaW5lIEJVRl9GX0JVRl9TVFJEVVAJCQkJIDEwMgorI2RlZmluZSBCVUZfRl9CVUZfU1RSTkRVUAkJCQkgMTA0CisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9jb21wL2NfcmxlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29tcC9jX3JsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZDM2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29tcC9jX3JsZS5jCkBAIC0wLDAgKzEsNjIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29tcC5oPgorCitzdGF0aWMgaW50IHJsZV9jb21wcmVzc19ibG9jayhDT01QX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJdW5zaWduZWQgaW50IG9sZW4sIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBpbnQgaWxlbik7CitzdGF0aWMgaW50IHJsZV9leHBhbmRfYmxvY2soQ09NUF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCXVuc2lnbmVkIGludCBvbGVuLCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlsZW4pOworCitzdGF0aWMgQ09NUF9NRVRIT0QgcmxlX21ldGhvZD17CisJTklEX3JsZV9jb21wcmVzc2lvbiwKKwlMTl9ybGVfY29tcHJlc3Npb24sCisJTlVMTCwKKwlOVUxMLAorCXJsZV9jb21wcmVzc19ibG9jaywKKwlybGVfZXhwYW5kX2Jsb2NrLAorCU5VTEwsCisJTlVMTCwKKwl9OworCitDT01QX01FVEhPRCAqQ09NUF9ybGUodm9pZCkKKwl7CisJcmV0dXJuKCZybGVfbWV0aG9kKTsKKwl9CisKK3N0YXRpYyBpbnQgcmxlX2NvbXByZXNzX2Jsb2NrKENPTVBfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkgICAgIHVuc2lnbmVkIGludCBvbGVuLCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlsZW4pCisJeworCS8qIGludCBpOyAqLworCisJaWYgKG9sZW4gPCAoaWxlbisxKSkKKwkJeworCQkvKiBaWlpaWlpaWlpaWlpaWlpaWlpaWlpaICovCisJCXJldHVybigtMSk7CisJCX0KKworCSoob3V0KyspPTA7CisJbWVtY3B5KG91dCxpbixpbGVuKTsKKwlyZXR1cm4oaWxlbisxKTsKKwl9CisKK3N0YXRpYyBpbnQgcmxlX2V4cGFuZF9ibG9jayhDT01QX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJICAgICB1bnNpZ25lZCBpbnQgb2xlbiwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGludCBpbGVuKQorCXsKKwlpbnQgaTsKKworCWlmIChvbGVuIDwgKGlsZW4tMSkpCisJCXsKKwkJLyogWlpaWlpaWlpaWlpaWlpaWlpaWlpaWiAqLworCQlyZXR1cm4oLTEpOworCQl9CisKKwlpPSAqKGluKyspOworCWlmIChpID09IDApCisJCXsKKwkJbWVtY3B5KG91dCxpbixpbGVuLTEpOworCQl9CisJcmV0dXJuKGlsZW4tMSk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vY29tcC9jX3psaWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb21wL2NfemxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZGYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29tcC9jX3psaWIuYwpAQCAtMCwwICsxLDc5OSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb21wLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworQ09NUF9NRVRIT0QgKkNPTVBfemxpYih2b2lkICk7CisKK3N0YXRpYyBDT01QX01FVEhPRCB6bGliX21ldGhvZF9ub3psaWI9eworCU5JRF91bmRlZiwKKwkiKHVuZGVmKSIsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJfTsKKworI2lmbmRlZiBaTElCCisjdW5kZWYgWkxJQl9TSEFSRUQKKyNlbHNlCisKKyNpbmNsdWRlIDx6bGliLmg+CisKK3N0YXRpYyBpbnQgemxpYl9zdGF0ZWZ1bF9pbml0KENPTVBfQ1RYICpjdHgpOworc3RhdGljIHZvaWQgemxpYl9zdGF0ZWZ1bF9maW5pc2goQ09NUF9DVFggKmN0eCk7CitzdGF0aWMgaW50IHpsaWJfc3RhdGVmdWxfY29tcHJlc3NfYmxvY2soQ09NUF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCXVuc2lnbmVkIGludCBvbGVuLCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlsZW4pOworc3RhdGljIGludCB6bGliX3N0YXRlZnVsX2V4cGFuZF9ibG9jayhDT01QX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJdW5zaWduZWQgaW50IG9sZW4sIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBpbnQgaWxlbik7CisKKworLyogbWVtb3J5IGFsbG9jYXRpb25zIGZ1bmN0aW9ucyBmb3IgemxpYiBpbnRpYWxpemF0aW9uICovCitzdGF0aWMgdm9pZCogemxpYl96YWxsb2Modm9pZCogb3BhcXVlLCB1bnNpZ25lZCBpbnQgbm8sIHVuc2lnbmVkIGludCBzaXplKQoreworCXZvaWQgKnA7CisJCisJcD1PUEVOU1NMX21hbGxvYyhubypzaXplKTsKKwlpZiAocCkKKwkJbWVtc2V0KHAsIDAsIG5vKnNpemUpOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyB2b2lkIHpsaWJfemZyZWUodm9pZCogb3BhcXVlLCB2b2lkKiBhZGRyZXNzKQoreworCU9QRU5TU0xfZnJlZShhZGRyZXNzKTsKK30KKworI2lmIDAKK3N0YXRpYyBpbnQgemxpYl9jb21wcmVzc19ibG9jayhDT01QX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJdW5zaWduZWQgaW50IG9sZW4sIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBpbnQgaWxlbik7CitzdGF0aWMgaW50IHpsaWJfZXhwYW5kX2Jsb2NrKENPTVBfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwl1bnNpZ25lZCBpbnQgb2xlbiwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGludCBpbGVuKTsKKworc3RhdGljIGludCB6el91bmNvbXByZXNzKEJ5dGVmICpkZXN0LCB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsCisJdUxvbmcgc291cmNlTGVuKTsKKworc3RhdGljIENPTVBfTUVUSE9EIHpsaWJfc3RhdGVsZXNzX21ldGhvZD17CisJTklEX3psaWJfY29tcHJlc3Npb24sCisJTE5femxpYl9jb21wcmVzc2lvbiwKKwlOVUxMLAorCU5VTEwsCisJemxpYl9jb21wcmVzc19ibG9jaywKKwl6bGliX2V4cGFuZF9ibG9jaywKKwlOVUxMLAorCU5VTEwsCisJfTsKKyNlbmRpZgorCitzdGF0aWMgQ09NUF9NRVRIT0QgemxpYl9zdGF0ZWZ1bF9tZXRob2Q9eworCU5JRF96bGliX2NvbXByZXNzaW9uLAorCUxOX3psaWJfY29tcHJlc3Npb24sCisJemxpYl9zdGF0ZWZ1bF9pbml0LAorCXpsaWJfc3RhdGVmdWxfZmluaXNoLAorCXpsaWJfc3RhdGVmdWxfY29tcHJlc3NfYmxvY2ssCisJemxpYl9zdGF0ZWZ1bF9leHBhbmRfYmxvY2ssCisJTlVMTCwKKwlOVUxMLAorCX07CisKKy8qIAorICogV2hlbiBPcGVuU1NMIGlzIGJ1aWx0IG9uIFdpbmRvd3MsIHdlIGRvIG5vdCB3YW50IHRvIHJlcXVpcmUgdGhhdAorICogdGhlIFpMSUIuRExMIGJlIGF2YWlsYWJsZSBpbiBvcmRlciBmb3IgdGhlIE9wZW5TU0wgRExMcyB0bworICogd29yay4gIFRoZXJlZm9yZSwgYWxsIFpMSUIgcm91dGluZXMgYXJlIGxvYWRlZCBhdCBydW4gdGltZQorICogYW5kIHdlIGRvIG5vdCBsaW5rIHRvIGEgLkxJQiBmaWxlIHdoZW4gWkxJQl9TSEFSRUQgaXMgc2V0LgorICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYgLyogIShPUEVOU1NMX1NZU19XSU5ET1dTIHx8IE9QRU5TU0xfU1lTX1dJTjMyKSAqLworCisjaWZkZWYgWkxJQl9TSEFSRUQKKyNpbmNsdWRlIDxvcGVuc3NsL2Rzby5oPgorCisvKiBGdW5jdGlvbiBwb2ludGVycyAqLwordHlwZWRlZiBpbnQgKCpjb21wcmVzc19mdCkoQnl0ZWYgKmRlc3QsdUxvbmdmICpkZXN0TGVuLAorCWNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbik7Cit0eXBlZGVmIGludCAoKmluZmxhdGVFbmRfZnQpKHpfc3RyZWFtcCBzdHJtKTsKK3R5cGVkZWYgaW50ICgqaW5mbGF0ZV9mdCkoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCk7Cit0eXBlZGVmIGludCAoKmluZmxhdGVJbml0X19mdCkoel9zdHJlYW1wIHN0cm0sCisJY29uc3QgY2hhciAqIHZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSk7Cit0eXBlZGVmIGludCAoKmRlZmxhdGVFbmRfZnQpKHpfc3RyZWFtcCBzdHJtKTsKK3R5cGVkZWYgaW50ICgqZGVmbGF0ZV9mdCkoel9zdHJlYW1wIHN0cm0sIGludCBmbHVzaCk7Cit0eXBlZGVmIGludCAoKmRlZmxhdGVJbml0X19mdCkoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCwKKwljb25zdCBjaGFyICogdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKTsKK3R5cGVkZWYgY29uc3QgY2hhciAqICgqekVycm9yX19mdCkoaW50IGVycik7CitzdGF0aWMgY29tcHJlc3NfZnQJcF9jb21wcmVzcz1OVUxMOworc3RhdGljIGluZmxhdGVFbmRfZnQJcF9pbmZsYXRlRW5kPU5VTEw7CitzdGF0aWMgaW5mbGF0ZV9mdAlwX2luZmxhdGU9TlVMTDsKK3N0YXRpYyBpbmZsYXRlSW5pdF9fZnQJcF9pbmZsYXRlSW5pdF89TlVMTDsKK3N0YXRpYyBkZWZsYXRlRW5kX2Z0CXBfZGVmbGF0ZUVuZD1OVUxMOworc3RhdGljIGRlZmxhdGVfZnQJcF9kZWZsYXRlPU5VTEw7CitzdGF0aWMgZGVmbGF0ZUluaXRfX2Z0CXBfZGVmbGF0ZUluaXRfPU5VTEw7CitzdGF0aWMgekVycm9yX19mdAlwX3pFcnJvcj1OVUxMOworCitzdGF0aWMgaW50IHpsaWJfbG9hZGVkID0gMDsgICAgIC8qIG9ubHkgYXR0ZW1wdCB0byBpbml0IGZ1bmMgcHRzIG9uY2UgKi8KK3N0YXRpYyBEU08gKnpsaWJfZHNvID0gTlVMTDsKKworI2RlZmluZSBjb21wcmVzcyAgICAgICAgICAgICAgICBwX2NvbXByZXNzCisjZGVmaW5lIGluZmxhdGVFbmQgICAgICAgICAgICAgIHBfaW5mbGF0ZUVuZAorI2RlZmluZSBpbmZsYXRlICAgICAgICAgICAgICAgICBwX2luZmxhdGUKKyNkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgICAgcF9pbmZsYXRlSW5pdF8KKyNkZWZpbmUgZGVmbGF0ZUVuZCAgICAgICAgICAgICAgcF9kZWZsYXRlRW5kCisjZGVmaW5lIGRlZmxhdGUgICAgICAgICAgICAgICAgIHBfZGVmbGF0ZQorI2RlZmluZSBkZWZsYXRlSW5pdF8gICAgICAgICAgICBwX2RlZmxhdGVJbml0XworI2RlZmluZSB6RXJyb3IJCQlwX3pFcnJvcgorI2VuZGlmIC8qIFpMSUJfU0hBUkVEICovCisKK3N0cnVjdCB6bGliX3N0YXRlCisJeworCXpfc3RyZWFtIGlzdHJlYW07CisJel9zdHJlYW0gb3N0cmVhbTsKKwl9OworCitzdGF0aWMgaW50IHpsaWJfc3RhdGVmdWxfZXhfaWR4ID0gLTE7CisKK3N0YXRpYyBpbnQgemxpYl9zdGF0ZWZ1bF9pbml0KENPTVBfQ1RYICpjdHgpCisJeworCWludCBlcnI7CisJc3RydWN0IHpsaWJfc3RhdGUgKnN0YXRlID0KKwkJKHN0cnVjdCB6bGliX3N0YXRlICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCB6bGliX3N0YXRlKSk7CisKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlzdGF0ZS0+aXN0cmVhbS56YWxsb2MgPSB6bGliX3phbGxvYzsKKwlzdGF0ZS0+aXN0cmVhbS56ZnJlZSA9IHpsaWJfemZyZWU7CisJc3RhdGUtPmlzdHJlYW0ub3BhcXVlID0gWl9OVUxMOworCXN0YXRlLT5pc3RyZWFtLm5leHRfaW4gPSBaX05VTEw7CisJc3RhdGUtPmlzdHJlYW0ubmV4dF9vdXQgPSBaX05VTEw7CisJc3RhdGUtPmlzdHJlYW0uYXZhaWxfaW4gPSAwOworCXN0YXRlLT5pc3RyZWFtLmF2YWlsX291dCA9IDA7CisJZXJyID0gaW5mbGF0ZUluaXRfKCZzdGF0ZS0+aXN0cmVhbSwKKwkJWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKKwlpZiAoZXJyICE9IFpfT0spCisJCWdvdG8gZXJyOworCisJc3RhdGUtPm9zdHJlYW0uemFsbG9jID0gemxpYl96YWxsb2M7CisJc3RhdGUtPm9zdHJlYW0uemZyZWUgPSB6bGliX3pmcmVlOworCXN0YXRlLT5vc3RyZWFtLm9wYXF1ZSA9IFpfTlVMTDsKKwlzdGF0ZS0+b3N0cmVhbS5uZXh0X2luID0gWl9OVUxMOworCXN0YXRlLT5vc3RyZWFtLm5leHRfb3V0ID0gWl9OVUxMOworCXN0YXRlLT5vc3RyZWFtLmF2YWlsX2luID0gMDsKKwlzdGF0ZS0+b3N0cmVhbS5hdmFpbF9vdXQgPSAwOworCWVyciA9IGRlZmxhdGVJbml0Xygmc3RhdGUtPm9zdHJlYW0sWl9ERUZBVUxUX0NPTVBSRVNTSU9OLAorCQlaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpOworCWlmIChlcnIgIT0gWl9PSykKKwkJZ290byBlcnI7CisKKwlDUllQVE9fbmV3X2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX0NPTVAsY3R4LCZjdHgtPmV4X2RhdGEpOworCUNSWVBUT19zZXRfZXhfZGF0YSgmY3R4LT5leF9kYXRhLHpsaWJfc3RhdGVmdWxfZXhfaWR4LHN0YXRlKTsKKwlyZXR1cm4gMTsKKyBlcnI6CisJaWYgKHN0YXRlKSBPUEVOU1NMX2ZyZWUoc3RhdGUpOworCXJldHVybiAwOworCX0KKworc3RhdGljIHZvaWQgemxpYl9zdGF0ZWZ1bF9maW5pc2goQ09NUF9DVFggKmN0eCkKKwl7CisJc3RydWN0IHpsaWJfc3RhdGUgKnN0YXRlID0KKwkJKHN0cnVjdCB6bGliX3N0YXRlICopQ1JZUFRPX2dldF9leF9kYXRhKCZjdHgtPmV4X2RhdGEsCisJCQl6bGliX3N0YXRlZnVsX2V4X2lkeCk7CisJaW5mbGF0ZUVuZCgmc3RhdGUtPmlzdHJlYW0pOworCWRlZmxhdGVFbmQoJnN0YXRlLT5vc3RyZWFtKTsKKwlPUEVOU1NMX2ZyZWUoc3RhdGUpOworCUNSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX0NPTVAsY3R4LCZjdHgtPmV4X2RhdGEpOworCX0KKworc3RhdGljIGludCB6bGliX3N0YXRlZnVsX2NvbXByZXNzX2Jsb2NrKENPTVBfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwl1bnNpZ25lZCBpbnQgb2xlbiwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGludCBpbGVuKQorCXsKKwlpbnQgZXJyID0gWl9PSzsKKwlzdHJ1Y3QgemxpYl9zdGF0ZSAqc3RhdGUgPQorCQkoc3RydWN0IHpsaWJfc3RhdGUgKilDUllQVE9fZ2V0X2V4X2RhdGEoJmN0eC0+ZXhfZGF0YSwKKwkJCXpsaWJfc3RhdGVmdWxfZXhfaWR4KTsKKworCWlmIChzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlzdGF0ZS0+b3N0cmVhbS5uZXh0X2luID0gaW47CisJc3RhdGUtPm9zdHJlYW0uYXZhaWxfaW4gPSBpbGVuOworCXN0YXRlLT5vc3RyZWFtLm5leHRfb3V0ID0gb3V0OworCXN0YXRlLT5vc3RyZWFtLmF2YWlsX291dCA9IG9sZW47CisJaWYgKGlsZW4gPiAwKQorCQllcnIgPSBkZWZsYXRlKCZzdGF0ZS0+b3N0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKKwlpZiAoZXJyICE9IFpfT0spCisJCXJldHVybiAtMTsKKyNpZmRlZiBERUJVR19aTElCCisJZnByaW50ZihzdGRlcnIsImNvbXByZXNzKCU0ZCktPiU0ZCAlc1xuIiwKKwkJaWxlbixvbGVuIC0gc3RhdGUtPm9zdHJlYW0uYXZhaWxfb3V0LAorCQkoaWxlbiAhPSBvbGVuIC0gc3RhdGUtPm9zdHJlYW0uYXZhaWxfb3V0KT8iemxpYiI6ImNsZWFyIik7CisjZW5kaWYKKwlyZXR1cm4gb2xlbiAtIHN0YXRlLT5vc3RyZWFtLmF2YWlsX291dDsKKwl9CisKK3N0YXRpYyBpbnQgemxpYl9zdGF0ZWZ1bF9leHBhbmRfYmxvY2soQ09NUF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCXVuc2lnbmVkIGludCBvbGVuLCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlsZW4pCisJeworCWludCBlcnIgPSBaX09LOworCisJc3RydWN0IHpsaWJfc3RhdGUgKnN0YXRlID0KKwkJKHN0cnVjdCB6bGliX3N0YXRlICopQ1JZUFRPX2dldF9leF9kYXRhKCZjdHgtPmV4X2RhdGEsCisJCQl6bGliX3N0YXRlZnVsX2V4X2lkeCk7CisKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlzdGF0ZS0+aXN0cmVhbS5uZXh0X2luID0gaW47CisJc3RhdGUtPmlzdHJlYW0uYXZhaWxfaW4gPSBpbGVuOworCXN0YXRlLT5pc3RyZWFtLm5leHRfb3V0ID0gb3V0OworCXN0YXRlLT5pc3RyZWFtLmF2YWlsX291dCA9IG9sZW47CisJaWYgKGlsZW4gPiAwKQorCQllcnIgPSBpbmZsYXRlKCZzdGF0ZS0+aXN0cmVhbSwgWl9TWU5DX0ZMVVNIKTsKKwlpZiAoZXJyICE9IFpfT0spCisJCXJldHVybiAtMTsKKyNpZmRlZiBERUJVR19aTElCCisJZnByaW50ZihzdGRlcnIsImV4cGFuZCglNGQpLT4lNGQgJXNcbiIsCisJCWlsZW4sb2xlbiAtIHN0YXRlLT5pc3RyZWFtLmF2YWlsX291dCwKKwkJKGlsZW4gIT0gb2xlbiAtIHN0YXRlLT5pc3RyZWFtLmF2YWlsX291dCk/InpsaWIiOiJjbGVhciIpOworI2VuZGlmCisJcmV0dXJuIG9sZW4gLSBzdGF0ZS0+aXN0cmVhbS5hdmFpbF9vdXQ7CisJfQorCisjaWYgMAorc3RhdGljIGludCB6bGliX2NvbXByZXNzX2Jsb2NrKENPTVBfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwl1bnNpZ25lZCBpbnQgb2xlbiwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGludCBpbGVuKQorCXsKKwl1bnNpZ25lZCBsb25nIGw7CisJaW50IGk7CisJaW50IGNsZWFyPTE7CisKKwlpZiAoaWxlbiA+IDEyOCkKKwkJeworCQlvdXRbMF09MTsKKwkJbD1vbGVuLTE7CisJCWk9Y29tcHJlc3MoJihvdXRbMV0pLCZsLGluLCh1bnNpZ25lZCBsb25nKWlsZW4pOworCQlpZiAoaSAhPSBaX09LKQorCQkJcmV0dXJuKC0xKTsKKwkJaWYgKGlsZW4gPiBsKQorCQkJeworCQkJY2xlYXI9MDsKKwkJCWwrKzsKKwkJCX0KKwkJfQorCWlmIChjbGVhcikKKwkJeworCQlvdXRbMF09MDsKKwkJbWVtY3B5KCYob3V0WzFdKSxpbixpbGVuKTsKKwkJbD1pbGVuKzE7CisJCX0KKyNpZmRlZiBERUJVR19aTElCCisJZnByaW50ZihzdGRlcnIsImNvbXByZXNzKCU0ZCktPiU0ZCAlc1xuIiwKKwkJaWxlbiwoaW50KWwsKGNsZWFyKT8iY2xlYXIiOiJ6bGliIik7CisjZW5kaWYKKwlyZXR1cm4oKGludClsKTsKKwl9CisKK3N0YXRpYyBpbnQgemxpYl9leHBhbmRfYmxvY2soQ09NUF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCXVuc2lnbmVkIGludCBvbGVuLCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlsZW4pCisJeworCXVuc2lnbmVkIGxvbmcgbDsKKwlpbnQgaTsKKworCWlmIChpblswXSkKKwkJeworCQlsPW9sZW47CisJCWk9enpfdW5jb21wcmVzcyhvdXQsJmwsJihpblsxXSksKHVuc2lnbmVkIGxvbmcpaWxlbi0xKTsKKwkJaWYgKGkgIT0gWl9PSykKKwkJCXJldHVybigtMSk7CisJCX0KKwllbHNlCisJCXsKKwkJbWVtY3B5KG91dCwmKGluWzFdKSxpbGVuLTEpOworCQlsPWlsZW4tMTsKKwkJfQorI2lmZGVmIERFQlVHX1pMSUIKKyAgICAgICAgZnByaW50ZihzdGRlcnIsImV4cGFuZCAgKCU0ZCktPiU0ZCAlc1xuIiwKKwkJaWxlbiwoaW50KWwsaW5bMF0/InpsaWIiOiJjbGVhciIpOworI2VuZGlmCisJcmV0dXJuKChpbnQpbCk7CisJfQorCitzdGF0aWMgaW50IHp6X3VuY29tcHJlc3MgKEJ5dGVmICpkZXN0LCB1TG9uZ2YgKmRlc3RMZW4sIGNvbnN0IEJ5dGVmICpzb3VyY2UsCisJICAgICB1TG9uZyBzb3VyY2VMZW4pCit7CisgICAgel9zdHJlYW0gc3RyZWFtOworICAgIGludCBlcnI7CisKKyAgICBzdHJlYW0ubmV4dF9pbiA9IChCeXRlZiopc291cmNlOworICAgIHN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KXNvdXJjZUxlbjsKKyAgICAvKiBDaGVjayBmb3Igc291cmNlID4gNjRLIG9uIDE2LWJpdCBtYWNoaW5lOiAqLworICAgIGlmICgodUxvbmcpc3RyZWFtLmF2YWlsX2luICE9IHNvdXJjZUxlbikgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgc3RyZWFtLm5leHRfb3V0ID0gZGVzdDsKKyAgICBzdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpKmRlc3RMZW47CisgICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfb3V0ICE9ICpkZXN0TGVuKSByZXR1cm4gWl9CVUZfRVJST1I7CisKKyAgICBzdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpMDsKKyAgICBzdHJlYW0uemZyZWUgPSAoZnJlZV9mdW5jKTA7CisKKyAgICBlcnIgPSBpbmZsYXRlSW5pdF8oJnN0cmVhbSwKKwkgICAgWkxJQl9WRVJTSU9OLCBzaXplb2Yoel9zdHJlYW0pKTsKKyAgICBpZiAoZXJyICE9IFpfT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBpbmZsYXRlKCZzdHJlYW0sIFpfRklOSVNIKTsKKyAgICBpZiAoZXJyICE9IFpfU1RSRUFNX0VORCkgeworICAgICAgICBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7CisKKyAgICBlcnIgPSBpbmZsYXRlRW5kKCZzdHJlYW0pOworICAgIHJldHVybiBlcnI7Cit9CisjZW5kaWYKKworI2VuZGlmCisKK0NPTVBfTUVUSE9EICpDT01QX3psaWIodm9pZCkKKwl7CisJQ09NUF9NRVRIT0QgKm1ldGggPSAmemxpYl9tZXRob2Rfbm96bGliOworCisjaWZkZWYgWkxJQl9TSEFSRUQKKwlpZiAoIXpsaWJfbG9hZGVkKQorCQl7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKQorCQl6bGliX2RzbyA9IERTT19sb2FkKE5VTEwsICJaTElCMSIsIE5VTEwsIDApOworI2Vsc2UKKwkJemxpYl9kc28gPSBEU09fbG9hZChOVUxMLCAieiIsIE5VTEwsIDApOworI2VuZGlmCisJCWlmICh6bGliX2RzbyAhPSBOVUxMKQorCQkJeworCQkJcF9jb21wcmVzcworCQkJCT0gKGNvbXByZXNzX2Z0KSBEU09fYmluZF9mdW5jKHpsaWJfZHNvLAorCQkJCQkiY29tcHJlc3MiKTsKKwkJCXBfaW5mbGF0ZUVuZAorCQkJCT0gKGluZmxhdGVFbmRfZnQpIERTT19iaW5kX2Z1bmMoemxpYl9kc28sCisJCQkJCSJpbmZsYXRlRW5kIik7CisJCQlwX2luZmxhdGUKKwkJCQk9IChpbmZsYXRlX2Z0KSBEU09fYmluZF9mdW5jKHpsaWJfZHNvLAorCQkJCQkiaW5mbGF0ZSIpOworCQkJcF9pbmZsYXRlSW5pdF8KKwkJCQk9IChpbmZsYXRlSW5pdF9fZnQpIERTT19iaW5kX2Z1bmMoemxpYl9kc28sCisJCQkJCSJpbmZsYXRlSW5pdF8iKTsKKwkJCXBfZGVmbGF0ZUVuZAorCQkJCT0gKGRlZmxhdGVFbmRfZnQpIERTT19iaW5kX2Z1bmMoemxpYl9kc28sCisJCQkJCSJkZWZsYXRlRW5kIik7CisJCQlwX2RlZmxhdGUKKwkJCQk9IChkZWZsYXRlX2Z0KSBEU09fYmluZF9mdW5jKHpsaWJfZHNvLAorCQkJCQkiZGVmbGF0ZSIpOworCQkJcF9kZWZsYXRlSW5pdF8KKwkJCQk9IChkZWZsYXRlSW5pdF9fZnQpIERTT19iaW5kX2Z1bmMoemxpYl9kc28sCisJCQkJCSJkZWZsYXRlSW5pdF8iKTsKKwkJCXBfekVycm9yCisJCQkJPSAoekVycm9yX19mdCkgRFNPX2JpbmRfZnVuYyh6bGliX2RzbywKKwkJCQkJInpFcnJvciIpOworCisJCQlpZiAocF9jb21wcmVzcyAmJiBwX2luZmxhdGVFbmQgJiYgcF9pbmZsYXRlCisJCQkJJiYgcF9pbmZsYXRlSW5pdF8gJiYgcF9kZWZsYXRlRW5kCisJCQkJJiYgcF9kZWZsYXRlICYmIHBfZGVmbGF0ZUluaXRfICYmIHBfekVycm9yKQorCQkJCXpsaWJfbG9hZGVkKys7CisJCQl9CisJCX0KKworI2VuZGlmCisjaWZkZWYgWkxJQl9TSEFSRUQKKwlpZiAoemxpYl9sb2FkZWQpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFpMSUIpIHx8IGRlZmluZWQoWkxJQl9TSEFSRUQpCisJCXsKKwkJLyogaW5pdCB6bGliX3N0YXRlZnVsX2V4X2lkeCBoZXJlIHNvIHRoYXQgaW4gYSBtdWx0aS1wcm9jZXNzCisJCSAqIGFwcGxpY2F0aW9uIGl0J3MgZW5vdWdoIHRvIGludGlhbGl6ZSBvcGVuc3NsIGJlZm9yZSBmb3JraW5nCisJCSAqIChpZHggd2lsbCBiZSBpbmhlcml0ZWQgaW4gYWxsIHRoZSBjaGlsZHJlbikgKi8KKwkJaWYgKHpsaWJfc3RhdGVmdWxfZXhfaWR4ID09IC0xKQorCQkJeworCQkJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19DT01QKTsKKwkJCWlmICh6bGliX3N0YXRlZnVsX2V4X2lkeCA9PSAtMSkKKwkJCQl6bGliX3N0YXRlZnVsX2V4X2lkeCA9CisJCQkJCUNSWVBUT19nZXRfZXhfbmV3X2luZGV4KENSWVBUT19FWF9JTkRFWF9DT01QLAorCQkJCQkJMCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKwkJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19DT01QKTsKKwkJCWlmICh6bGliX3N0YXRlZnVsX2V4X2lkeCA9PSAtMSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCisJCW1ldGggPSAmemxpYl9zdGF0ZWZ1bF9tZXRob2Q7CisJCX0KK2VycjoJCisjZW5kaWYKKworCXJldHVybihtZXRoKTsKKwl9CisKK3ZvaWQgQ09NUF96bGliX2NsZWFudXAodm9pZCkKKwl7CisjaWZkZWYgWkxJQl9TSEFSRUQKKwlpZiAoemxpYl9kc28pCisJCURTT19mcmVlKHpsaWJfZHNvKTsKKyNlbmRpZgorCX0KKworI2lmZGVmIFpMSUIKKworLyogWmxpYiBiYXNlZCBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZpbHRlciBCSU8gKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJdW5zaWduZWQgY2hhciAqaWJ1ZjsJLyogSW5wdXQgYnVmZmVyICovCisJaW50IGlidWZzaXplOwkJLyogQnVmZmVyIHNpemUgKi8KKwl6X3N0cmVhbSB6aW47CQkvKiBJbnB1dCBkZWNvbXByZXNzIGNvbnRleHQgKi8KKwl1bnNpZ25lZCBjaGFyICpvYnVmOwkvKiBPdXRwdXQgYnVmZmVyICovCisJaW50IG9idWZzaXplOwkJLyogT3V0cHV0IGJ1ZmZlciBzaXplICovCisJdW5zaWduZWQgY2hhciAqb3B0cjsJLyogUG9zaXRpb24gaW4gb3V0cHV0IGJ1ZmZlciAqLworCWludCBvY291bnQ7CQkvKiBBbW91bnQgb2YgZGF0YSBpbiBvdXRwdXQgYnVmZmVyICovCisJaW50IG9kb25lOwkJLyogZGVmbGF0ZSBFT0YgKi8KKwlpbnQgY29tcF9sZXZlbDsJCS8qIENvbXByZXNzaW9uIGxldmVsIHRvIHVzZSAqLworCXpfc3RyZWFtIHpvdXQ7CQkvKiBPdXRwdXQgY29tcHJlc3Npb24gY29udGV4dCAqLworCX0gQklPX1pMSUJfQ1RYOworCisjZGVmaW5lIFpMSUJfREVGQVVMVF9CVUZTSVpFIDEwMjQKKworc3RhdGljIGludCBiaW9femxpYl9uZXcoQklPICpiaSk7CitzdGF0aWMgaW50IGJpb196bGliX2ZyZWUoQklPICpiaSk7CitzdGF0aWMgaW50IGJpb196bGliX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKTsKK3N0YXRpYyBpbnQgYmlvX3psaWJfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCk7CitzdGF0aWMgbG9uZyBiaW9femxpYl9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cik7CitzdGF0aWMgbG9uZyBiaW9femxpYl9jYWxsYmFja19jdHJsKEJJTyAqYiwgaW50IGNtZCwgYmlvX2luZm9fY2IgKmZwKTsKKworc3RhdGljIEJJT19NRVRIT0QgYmlvX21ldGhfemxpYiA9IAorCXsKKwlCSU9fVFlQRV9DT01QLAorCSJ6bGliIiwKKwliaW9femxpYl93cml0ZSwKKwliaW9femxpYl9yZWFkLAorCU5VTEwsCisJTlVMTCwKKwliaW9femxpYl9jdHJsLAorCWJpb196bGliX25ldywKKwliaW9femxpYl9mcmVlLAorCWJpb196bGliX2NhbGxiYWNrX2N0cmwKKwl9OworCitCSU9fTUVUSE9EICpCSU9fZl96bGliKHZvaWQpCisJeworCXJldHVybiAmYmlvX21ldGhfemxpYjsKKwl9CisKKworc3RhdGljIGludCBiaW9femxpYl9uZXcoQklPICpiaSkKKwl7CisJQklPX1pMSUJfQ1RYICpjdHg7CisjaWZkZWYgWkxJQl9TSEFSRUQKKwkodm9pZClDT01QX3psaWIoKTsKKwlpZiAoIXpsaWJfbG9hZGVkKQorCQl7CisJCUNPTVBlcnIoQ09NUF9GX0JJT19aTElCX05FVywgQ09NUF9SX1pMSUJfTk9UX1NVUFBPUlRFRCk7CisJCXJldHVybiAwOworCQl9CisjZW5kaWYKKwljdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQklPX1pMSUJfQ1RYKSk7CisJaWYoIWN0eCkKKwkJeworCQlDT01QZXJyKENPTVBfRl9CSU9fWkxJQl9ORVcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwljdHgtPmlidWYgPSBOVUxMOworCWN0eC0+b2J1ZiA9IE5VTEw7CisJY3R4LT5pYnVmc2l6ZSA9IFpMSUJfREVGQVVMVF9CVUZTSVpFOworCWN0eC0+b2J1ZnNpemUgPSBaTElCX0RFRkFVTFRfQlVGU0laRTsKKwljdHgtPnppbi56YWxsb2MgPSBaX05VTEw7CisJY3R4LT56aW4uemZyZWUgPSBaX05VTEw7CisJY3R4LT56aW4ubmV4dF9pbiA9IE5VTEw7CisJY3R4LT56aW4uYXZhaWxfaW4gPSAwOworCWN0eC0+emluLm5leHRfb3V0ID0gTlVMTDsKKwljdHgtPnppbi5hdmFpbF9vdXQgPSAwOworCWN0eC0+em91dC56YWxsb2MgPSBaX05VTEw7CisJY3R4LT56b3V0LnpmcmVlID0gWl9OVUxMOworCWN0eC0+em91dC5uZXh0X2luID0gTlVMTDsKKwljdHgtPnpvdXQuYXZhaWxfaW4gPSAwOworCWN0eC0+em91dC5uZXh0X291dCA9IE5VTEw7CisJY3R4LT56b3V0LmF2YWlsX291dCA9IDA7CisJY3R4LT5vZG9uZSA9IDA7CisJY3R4LT5jb21wX2xldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOworCWJpLT5pbml0ID0gMTsKKwliaS0+cHRyID0gKGNoYXIgKiljdHg7CisJYmktPmZsYWdzID0gMDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgYmlvX3psaWJfZnJlZShCSU8gKmJpKQorCXsKKwlCSU9fWkxJQl9DVFggKmN0eDsKKwlpZighYmkpIHJldHVybiAwOworCWN0eCA9IChCSU9fWkxJQl9DVFggKiliaS0+cHRyOworCWlmKGN0eC0+aWJ1ZikKKwkJeworCQkvKiBEZXN0cm95IGRlY29tcHJlc3MgY29udGV4dCAqLworCQlpbmZsYXRlRW5kKCZjdHgtPnppbik7CisJCU9QRU5TU0xfZnJlZShjdHgtPmlidWYpOworCQl9CisJaWYoY3R4LT5vYnVmKQorCQl7CisJCS8qIERlc3Ryb3kgY29tcHJlc3MgY29udGV4dCAqLworCQlkZWZsYXRlRW5kKCZjdHgtPnpvdXQpOworCQlPUEVOU1NMX2ZyZWUoY3R4LT5vYnVmKTsKKwkJfQorCU9QRU5TU0xfZnJlZShjdHgpOworCWJpLT5wdHIgPSBOVUxMOworCWJpLT5pbml0ID0gMDsKKwliaS0+ZmxhZ3MgPSAwOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBiaW9femxpYl9yZWFkKEJJTyAqYiwgY2hhciAqb3V0LCBpbnQgb3V0bCkKKwl7CisJQklPX1pMSUJfQ1RYICpjdHg7CisJaW50IHJldDsKKwl6X3N0cmVhbSAqemluOworCWlmKCFvdXQgfHwgIW91dGwpIHJldHVybiAwOworCWN0eCA9IChCSU9fWkxJQl9DVFggKiliLT5wdHI7CisJemluID0gJmN0eC0+emluOworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwlpZighY3R4LT5pYnVmKQorCQl7CisJCWN0eC0+aWJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGN0eC0+aWJ1ZnNpemUpOworCQlpZighY3R4LT5pYnVmKQorCQkJeworCQkJQ09NUGVycihDT01QX0ZfQklPX1pMSUJfUkVBRCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWluZmxhdGVJbml0KHppbik7CisJCXppbi0+bmV4dF9pbiA9IGN0eC0+aWJ1ZjsKKwkJemluLT5hdmFpbF9pbiA9IDA7CisJCX0KKworCS8qIENvcHkgb3V0cHV0IGRhdGEgZGlyZWN0bHkgdG8gc3VwcGxpZWQgYnVmZmVyICovCisJemluLT5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyICopb3V0OworCXppbi0+YXZhaWxfb3V0ID0gKHVuc2lnbmVkIGludClvdXRsOworCWZvcig7OykKKwkJeworCQkvKiBEZWNvbXByZXNzIHdoaWxlIGRhdGEgYXZhaWxhYmxlICovCisJCXdoaWxlKHppbi0+YXZhaWxfaW4pCisJCQl7CisJCQlyZXQgPSBpbmZsYXRlKHppbiwgMCk7CisJCQlpZigocmV0ICE9IFpfT0spICYmIChyZXQgIT0gWl9TVFJFQU1fRU5EKSkKKwkJCQl7CisJCQkJQ09NUGVycihDT01QX0ZfQklPX1pMSUJfUkVBRCwKKwkJCQkJCUNPTVBfUl9aTElCX0lORkxBVEVfRVJST1IpOworCQkJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiemxpYiBlcnJvcjoiLAorCQkJCQkJCXpFcnJvcihyZXQpKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkvKiBJZiBFT0Ygb3Igd2UndmUgcmVhZCBldmVyeXRoaW5nIHRoZW4gcmV0dXJuICovCisJCQlpZigocmV0ID09IFpfU1RSRUFNX0VORCkgfHwgIXppbi0+YXZhaWxfb3V0KQorCQkJCXJldHVybiBvdXRsIC0gemluLT5hdmFpbF9vdXQ7CisJCQl9CisKKwkJLyogTm8gZGF0YSBpbiBpbnB1dCBidWZmZXIgdHJ5IHRvIHJlYWQgc29tZSBpbiwKKwkJICogaWYgYW4gZXJyb3IgdGhlbiByZXR1cm4gdGhlIHRvdGFsIGRhdGEgcmVhZC4KKwkJICovCisJCXJldCA9IEJJT19yZWFkKGItPm5leHRfYmlvLCBjdHgtPmlidWYsIGN0eC0+aWJ1ZnNpemUpOworCQlpZihyZXQgPD0gMCkKKwkJCXsKKwkJCS8qIFRvdGFsIGRhdGEgcmVhZCAqLworCQkJaW50IHRvdCA9IG91dGwgLSB6aW4tPmF2YWlsX291dDsKKwkJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCQlpZihyZXQgPCAwKSByZXR1cm4gKHRvdCA+IDApID8gdG90IDogcmV0OworCQkJcmV0dXJuIHRvdDsKKwkJCX0KKwkJemluLT5hdmFpbF9pbiA9IHJldDsKKwkJemluLT5uZXh0X2luID0gY3R4LT5pYnVmOworCQl9CisJfQorCitzdGF0aWMgaW50IGJpb196bGliX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpCisJeworCUJJT19aTElCX0NUWCAqY3R4OworCWludCByZXQ7CisJel9zdHJlYW0gKnpvdXQ7CisJaWYoIWluIHx8ICFpbmwpIHJldHVybiAwOworCWN0eCA9IChCSU9fWkxJQl9DVFggKiliLT5wdHI7CisJaWYoY3R4LT5vZG9uZSkgcmV0dXJuIDA7CisJem91dCA9ICZjdHgtPnpvdXQ7CisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCWlmKCFjdHgtPm9idWYpCisJCXsKKwkJY3R4LT5vYnVmID0gT1BFTlNTTF9tYWxsb2MoY3R4LT5vYnVmc2l6ZSk7CisJCS8qIE5lZWQgZXJyb3IgaGVyZSAqLworCQlpZighY3R4LT5vYnVmKQorCQkJeworCQkJQ09NUGVycihDT01QX0ZfQklPX1pMSUJfV1JJVEUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQljdHgtPm9wdHIgPSBjdHgtPm9idWY7CisJCWN0eC0+b2NvdW50ID0gMDsKKwkJZGVmbGF0ZUluaXQoem91dCwgY3R4LT5jb21wX2xldmVsKTsKKwkJem91dC0+bmV4dF9vdXQgPSBjdHgtPm9idWY7CisJCXpvdXQtPmF2YWlsX291dCA9IGN0eC0+b2J1ZnNpemU7CisJCX0KKwkvKiBPYnRhaW4gaW5wdXQgZGF0YSBkaXJlY3RseSBmcm9tIHN1cHBsaWVkIGJ1ZmZlciAqLworCXpvdXQtPm5leHRfaW4gPSAodm9pZCAqKWluOworCXpvdXQtPmF2YWlsX2luID0gaW5sOworCWZvcig7OykKKwkJeworCQkvKiBJZiBkYXRhIGluIG91dHB1dCBidWZmZXIgd3JpdGUgaXQgZmlyc3QgKi8KKwkJd2hpbGUoY3R4LT5vY291bnQpIHsKKwkJCXJldCA9IEJJT193cml0ZShiLT5uZXh0X2JpbywgY3R4LT5vcHRyLCBjdHgtPm9jb3VudCk7CisJCQlpZihyZXQgPD0gMCkKKwkJCQl7CisJCQkJLyogVG90YWwgZGF0YSB3cml0dGVuICovCisJCQkJaW50IHRvdCA9IGlubCAtIHpvdXQtPmF2YWlsX2luOworCQkJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCQkJaWYocmV0IDwgMCkgcmV0dXJuICh0b3QgPiAwKSA/IHRvdCA6IHJldDsKKwkJCQlyZXR1cm4gdG90OworCQkJCX0KKwkJCWN0eC0+b3B0ciArPSByZXQ7CisJCQljdHgtPm9jb3VudCAtPSByZXQ7CisJCX0KKworCQkvKiBIYXZlIHdlIGNvbnN1bWVkIGFsbCBzdXBwbGllZCBkYXRhPyAqLworCQlpZighem91dC0+YXZhaWxfaW4pCisJCQlyZXR1cm4gaW5sOworCisJCS8qIENvbXByZXNzIHNvbWUgbW9yZSAqLworCisJCS8qIFJlc2V0IGJ1ZmZlciAqLworCQljdHgtPm9wdHIgPSBjdHgtPm9idWY7CisJCXpvdXQtPm5leHRfb3V0ID0gY3R4LT5vYnVmOworCQl6b3V0LT5hdmFpbF9vdXQgPSBjdHgtPm9idWZzaXplOworCQkvKiBDb21wcmVzcyBzb21lIG1vcmUgKi8KKwkJcmV0ID0gZGVmbGF0ZSh6b3V0LCAwKTsKKwkJaWYocmV0ICE9IFpfT0spCisJCQl7CisJCQlDT01QZXJyKENPTVBfRl9CSU9fWkxJQl9XUklURSwKKwkJCQkJCUNPTVBfUl9aTElCX0RFRkxBVEVfRVJST1IpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ6bGliIGVycm9yOiIsIHpFcnJvcihyZXQpKTsKKwkJCXJldHVybiAwOworCQkJfQorCQljdHgtPm9jb3VudCA9IGN0eC0+b2J1ZnNpemUgLSB6b3V0LT5hdmFpbF9vdXQ7CisJCX0KKwl9CisKK3N0YXRpYyBpbnQgYmlvX3psaWJfZmx1c2goQklPICpiKQorCXsKKwlCSU9fWkxJQl9DVFggKmN0eDsKKwlpbnQgcmV0OworCXpfc3RyZWFtICp6b3V0OworCWN0eCA9IChCSU9fWkxJQl9DVFggKiliLT5wdHI7CisJLyogSWYgbm8gZGF0YSB3cml0dGVuIG9yIGFscmVhZHkgZmx1c2ggc2hvdyBzdWNjZXNzICovCisJaWYoIWN0eC0+b2J1ZiB8fCAoY3R4LT5vZG9uZSAmJiAhY3R4LT5vY291bnQpKSByZXR1cm4gMTsKKwl6b3V0ID0gJmN0eC0+em91dDsKKwlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJLyogTm8gbW9yZSBpbnB1dCBkYXRhICovCisJem91dC0+bmV4dF9pbiA9IE5VTEw7CisJem91dC0+YXZhaWxfaW4gPSAwOworCWZvcig7OykKKwkJeworCQkvKiBJZiBkYXRhIGluIG91dHB1dCBidWZmZXIgd3JpdGUgaXQgZmlyc3QgKi8KKwkJd2hpbGUoY3R4LT5vY291bnQpCisJCQl7CisJCQlyZXQgPSBCSU9fd3JpdGUoYi0+bmV4dF9iaW8sIGN0eC0+b3B0ciwgY3R4LT5vY291bnQpOworCQkJaWYocmV0IDw9IDApCisJCQkJeworCQkJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQljdHgtPm9wdHIgKz0gcmV0OworCQkJY3R4LT5vY291bnQgLT0gcmV0OworCQkJfQorCQlpZihjdHgtPm9kb25lKSByZXR1cm4gMTsKKworCQkvKiBDb21wcmVzcyBzb21lIG1vcmUgKi8KKworCQkvKiBSZXNldCBidWZmZXIgKi8KKwkJY3R4LT5vcHRyID0gY3R4LT5vYnVmOworCQl6b3V0LT5uZXh0X291dCA9IGN0eC0+b2J1ZjsKKwkJem91dC0+YXZhaWxfb3V0ID0gY3R4LT5vYnVmc2l6ZTsKKwkJLyogQ29tcHJlc3Mgc29tZSBtb3JlICovCisJCXJldCA9IGRlZmxhdGUoem91dCwgWl9GSU5JU0gpOworCQlpZihyZXQgPT0gWl9TVFJFQU1fRU5EKSBjdHgtPm9kb25lID0gMTsKKwkJZWxzZSBpZihyZXQgIT0gWl9PSykKKwkJCXsKKwkJCUNPTVBlcnIoQ09NUF9GX0JJT19aTElCX0ZMVVNILAorCQkJCQkJQ09NUF9SX1pMSUJfREVGTEFURV9FUlJPUik7CisJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInpsaWIgZXJyb3I6IiwgekVycm9yKHJldCkpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWN0eC0+b2NvdW50ID0gY3R4LT5vYnVmc2l6ZSAtIHpvdXQtPmF2YWlsX291dDsKKwkJfQorCX0KKworc3RhdGljIGxvbmcgYmlvX3psaWJfY3RybChCSU8gKmIsIGludCBjbWQsIGxvbmcgbnVtLCB2b2lkICpwdHIpCisJeworCUJJT19aTElCX0NUWCAqY3R4OworCWludCByZXQsICppcDsKKwlpbnQgaWJzLCBvYnM7CisJaWYoIWItPm5leHRfYmlvKSByZXR1cm4gMDsKKwljdHggPSAoQklPX1pMSUJfQ1RYICopYi0+cHRyOworCXN3aXRjaCAoY21kKQorCQl7CisKKwljYXNlIEJJT19DVFJMX1JFU0VUOgorCQljdHgtPm9jb3VudCA9IDA7CisJCWN0eC0+b2RvbmUgPSAwOworCQlyZXQgPSAxOworCQlicmVhazsKKworCWNhc2UgQklPX0NUUkxfRkxVU0g6CisJCXJldCA9IGJpb196bGliX2ZsdXNoKGIpOworCQlpZiAocmV0ID4gMCkKKwkJCXJldCA9IEJJT19mbHVzaChiLT5uZXh0X2Jpbyk7CisJCWJyZWFrOworCisJY2FzZSBCSU9fQ19TRVRfQlVGRl9TSVpFOgorCQlpYnMgPSAtMTsKKwkJb2JzID0gLTE7CisJCWlmIChwdHIgIT0gTlVMTCkKKwkJCXsKKwkJCWlwID0gcHRyOworCQkJaWYgKCppcCA9PSAwKQorCQkJCWlicyA9IChpbnQpIG51bTsKKwkJCWVsc2UgCisJCQkJb2JzID0gKGludCkgbnVtOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpYnMgPSAoaW50KW51bTsKKwkJCW9icyA9IGliczsKKwkJCX0KKworCQlpZiAoaWJzICE9IC0xKQorCQkJeworCQkJaWYgKGN0eC0+aWJ1ZikKKwkJCQl7CisJCQkJT1BFTlNTTF9mcmVlKGN0eC0+aWJ1Zik7CisJCQkJY3R4LT5pYnVmID0gTlVMTDsKKwkJCQl9CisJCQljdHgtPmlidWZzaXplID0gaWJzOworCQkJfQorCisJCWlmIChvYnMgIT0gLTEpCisJCQl7CisJCQlpZiAoY3R4LT5vYnVmKQorCQkJCXsKKwkJCQlPUEVOU1NMX2ZyZWUoY3R4LT5vYnVmKTsKKwkJCQljdHgtPm9idWYgPSBOVUxMOworCQkJCX0KKwkJCWN0eC0+b2J1ZnNpemUgPSBvYnM7CisJCQl9CisJCXJldCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBCSU9fQ19ET19TVEFURV9NQUNISU5FOgorCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCXJldCA9IEJJT19jdHJsKGItPm5leHRfYmlvLCBjbWQsIG51bSwgcHRyKTsKKwkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBCSU9fY3RybChiLT5uZXh0X2JpbywgY21kLCBudW0sIHB0cik7CisJCWJyZWFrOworCisJCX0KKworCXJldHVybiByZXQ7CisJfQorCisKK3N0YXRpYyBsb25nIGJpb196bGliX2NhbGxiYWNrX2N0cmwoQklPICpiLCBpbnQgY21kLCBiaW9faW5mb19jYiAqZnApCisJeworCWlmKCFiLT5uZXh0X2JpbykKKwkJcmV0dXJuIDA7CisJcmV0dXJuCisJCUJJT19jYWxsYmFja19jdHJsKGItPm5leHRfYmlvLCBjbWQsIGZwKTsKKwl9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbXAvY29tcC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2NvbXAvY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDA1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29tcC9jb21wLmgKQEAgLTAsMCArMSw4MCBAQAorCisjaWZuZGVmIEhFQURFUl9DT01QX0gKKyNkZWZpbmUgSEVBREVSX0NPTVBfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgY29tcF9jdHhfc3QgQ09NUF9DVFg7CisKK3R5cGVkZWYgc3RydWN0IGNvbXBfbWV0aG9kX3N0CisJeworCWludCB0eXBlOwkJLyogTklEIGZvciBjb21wcmVzc2lvbiBsaWJyYXJ5ICovCisJY29uc3QgY2hhciAqbmFtZTsJLyogQSB0ZXh0IHN0cmluZyB0byBpZGVudGlmeSB0aGUgbGlicmFyeSAqLworCWludCAoKmluaXQpKENPTVBfQ1RYICpjdHgpOworCXZvaWQgKCpmaW5pc2gpKENPTVBfQ1RYICpjdHgpOworCWludCAoKmNvbXByZXNzKShDT01QX0NUWCAqY3R4LAorCQkJdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBpbnQgb2xlbiwKKwkJCXVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBpbnQgaWxlbik7CisJaW50ICgqZXhwYW5kKShDT01QX0NUWCAqY3R4LAorCQkgICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGludCBvbGVuLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlsZW4pOworCS8qIFRoZSBmb2xsb3dpbmcgdHdvIGRvIE5PVEhJTkcsIGJ1dCBhcmUga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCWxvbmcgKCpjdHJsKSh2b2lkKTsKKwlsb25nICgqY2FsbGJhY2tfY3RybCkodm9pZCk7CisJfSBDT01QX01FVEhPRDsKKworc3RydWN0IGNvbXBfY3R4X3N0CisJeworCUNPTVBfTUVUSE9EICptZXRoOworCXVuc2lnbmVkIGxvbmcgY29tcHJlc3NfaW47CisJdW5zaWduZWQgbG9uZyBjb21wcmVzc19vdXQ7CisJdW5zaWduZWQgbG9uZyBleHBhbmRfaW47CisJdW5zaWduZWQgbG9uZyBleHBhbmRfb3V0OworCisJQ1JZUFRPX0VYX0RBVEEJZXhfZGF0YTsKKwl9OworCisKK0NPTVBfQ1RYICpDT01QX0NUWF9uZXcoQ09NUF9NRVRIT0QgKm1ldGgpOwordm9pZCBDT01QX0NUWF9mcmVlKENPTVBfQ1RYICpjdHgpOworaW50IENPTVBfY29tcHJlc3NfYmxvY2soQ09NUF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgb2xlbiwKKwl1bnNpZ25lZCBjaGFyICppbiwgaW50IGlsZW4pOworaW50IENPTVBfZXhwYW5kX2Jsb2NrKENPTVBfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IG9sZW4sCisJdW5zaWduZWQgY2hhciAqaW4sIGludCBpbGVuKTsKK0NPTVBfTUVUSE9EICpDT01QX3JsZSh2b2lkICk7CitDT01QX01FVEhPRCAqQ09NUF96bGliKHZvaWQgKTsKK3ZvaWQgQ09NUF96bGliX2NsZWFudXAodm9pZCk7CisKKyNpZmRlZiBIRUFERVJfQklPX0gKKyNpZmRlZiBaTElCCitCSU9fTUVUSE9EICpCSU9fZl96bGliKHZvaWQpOworI2VuZGlmCisjZW5kaWYKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9DT01QX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgQ09NUCBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBDT01QX0ZfQklPX1pMSUJfRkxVU0gJCQkJIDk5CisjZGVmaW5lIENPTVBfRl9CSU9fWkxJQl9ORVcJCQkJIDEwMAorI2RlZmluZSBDT01QX0ZfQklPX1pMSUJfUkVBRAkJCQkgMTAxCisjZGVmaW5lIENPTVBfRl9CSU9fWkxJQl9XUklURQkJCQkgMTAyCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQ09NUF9SX1pMSUJfREVGTEFURV9FUlJPUgkJCSA5OQorI2RlZmluZSBDT01QX1JfWkxJQl9JTkZMQVRFX0VSUk9SCQkJIDEwMAorI2RlZmluZSBDT01QX1JfWkxJQl9OT1RfU1VQUE9SVEVECQkJIDEwMQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbXAvY29tcF9lcnIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb21wL2NvbXBfZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxYzk0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb21wL2NvbXBfZXJyLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qIGNyeXB0by9jb21wL2NvbXBfZXJyLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBOT1RFOiB0aGlzIGZpbGUgd2FzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBta2Vyci5wbCBzY3JpcHQ6IGFueSBjaGFuZ2VzCisgKiBtYWRlIHRvIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IG5leHQgdXBkYXRlcyB0aGlzIGZpbGUsCisgKiBvbmx5IHJlYXNvbiBzdHJpbmdzIHdpbGwgYmUgcHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb21wLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9DT01QLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfQ09NUCwwLHJlYXNvbikKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBDT01QX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoQ09NUF9GX0JJT19aTElCX0ZMVVNIKSwJIkJJT19aTElCX0ZMVVNIIn0sCit7RVJSX0ZVTkMoQ09NUF9GX0JJT19aTElCX05FVyksCSJCSU9fWkxJQl9ORVcifSwKK3tFUlJfRlVOQyhDT01QX0ZfQklPX1pMSUJfUkVBRCksCSJCSU9fWkxJQl9SRUFEIn0sCit7RVJSX0ZVTkMoQ09NUF9GX0JJT19aTElCX1dSSVRFKSwJIkJJT19aTElCX1dSSVRFIn0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgQ09NUF9zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKENPTVBfUl9aTElCX0RFRkxBVEVfRVJST1IpICAgLCJ6bGliIGRlZmxhdGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKENPTVBfUl9aTElCX0lORkxBVEVfRVJST1IpICAgLCJ6bGliIGluZmxhdGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKENPTVBfUl9aTElCX05PVF9TVVBQT1JURUQpICAgLCJ6bGliIG5vdCBzdXBwb3J0ZWQifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfQ09NUF9zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhDT01QX3N0cl9mdW5jdHNbMF0uZXJyb3IpID09IE5VTEwpCisJCXsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLENPTVBfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxDT01QX3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbXAvY29tcF9saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb21wL2NvbXBfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwYWUzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb21wL2NvbXBfbGliLmMKQEAgLTAsMCArMSw3MiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb21wLmg+CisKK0NPTVBfQ1RYICpDT01QX0NUWF9uZXcoQ09NUF9NRVRIT0QgKm1ldGgpCisJeworCUNPTVBfQ1RYICpyZXQ7CisKKwlpZiAoKHJldD0oQ09NUF9DVFggKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQ09NUF9DVFgpKSkgPT0gTlVMTCkKKwkJeworCQkvKiBaWlpaWlpaWlpaWlpaWlpaICovCisJCXJldHVybihOVUxMKTsKKwkJfQorCW1lbXNldChyZXQsMCxzaXplb2YoQ09NUF9DVFgpKTsKKwlyZXQtPm1ldGg9bWV0aDsKKwlpZiAoKHJldC0+bWV0aC0+aW5pdCAhPSBOVUxMKSAmJiAhcmV0LT5tZXRoLT5pbml0KHJldCkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldD1OVUxMOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIENPTVBfQ1RYX2ZyZWUoQ09NUF9DVFggKmN0eCkKKwl7CisJaWYoY3R4ID09IE5VTEwpCisJICAgIHJldHVybjsKKworCWlmIChjdHgtPm1ldGgtPmZpbmlzaCAhPSBOVUxMKQorCQljdHgtPm1ldGgtPmZpbmlzaChjdHgpOworCisJT1BFTlNTTF9mcmVlKGN0eCk7CisJfQorCitpbnQgQ09NUF9jb21wcmVzc19ibG9jayhDT01QX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBvbGVuLAorCSAgICAgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbGVuKQorCXsKKwlpbnQgcmV0OworCWlmIChjdHgtPm1ldGgtPmNvbXByZXNzID09IE5VTEwpCisJCXsKKwkJLyogWlpaWlpaWlpaWlpaWlpaWlogKi8KKwkJcmV0dXJuKC0xKTsKKwkJfQorCXJldD1jdHgtPm1ldGgtPmNvbXByZXNzKGN0eCxvdXQsb2xlbixpbixpbGVuKTsKKwlpZiAocmV0ID4gMCkKKwkJeworCQljdHgtPmNvbXByZXNzX2luKz1pbGVuOworCQljdHgtPmNvbXByZXNzX291dCs9cmV0OworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgQ09NUF9leHBhbmRfYmxvY2soQ09NUF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgb2xlbiwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaWxlbikKKwl7CisJaW50IHJldDsKKworCWlmIChjdHgtPm1ldGgtPmV4cGFuZCA9PSBOVUxMKQorCQl7CisJCS8qIFpaWlpaWlpaWlpaWlpaWlpaICovCisJCXJldHVybigtMSk7CisJCX0KKwlyZXQ9Y3R4LT5tZXRoLT5leHBhbmQoY3R4LG91dCxvbGVuLGluLGlsZW4pOworCWlmIChyZXQgPiAwKQorCQl7CisJCWN0eC0+ZXhwYW5kX2luKz1pbGVuOworCQljdHgtPmV4cGFuZF9vdXQrPXJldDsKKwkJfQorCXJldHVybihyZXQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL1JFQURNRSBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU1M2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvUkVBRE1FCkBAIC0wLDAgKzEsNzMgQEAKK0NvbmZpZ3VyYXRpb24gbW9kdWxlcy4gVGhlc2UgYXJlIGEgc2V0IG9mIG1vZHVsZXMgd2hpY2ggY2FuIHBlcmZvcm0KK3ZhcmlvdXMgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCisKK0N1cnJlbnRseSB0aGUgcm91dGluZXMgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2Ugd2hlbiBhbiBhcHBsaWNhdGlvbgorc3RhcnRzIHVwOiB0aGF0IGlzIGJlZm9yZSBpdCBzdGFydHMgYW55IHRocmVhZHMuCisKK1RoZSByb3V0aW5lcyByZWFkIGEgY29uZmlndXJhdGlvbiBmaWxlIHNldCB1cCBsaWtlIHRoaXM6CisKKy0tLS0tCisjZGVmYXVsdCBzZWN0aW9uCitvcGVuc3NsX2NvbmY9aW5pdF9zZWN0aW9uCisKK1tpbml0X3NlY3Rpb25dCisKK21vZHVsZTE9dmFsdWUxCisjU2Vjb25kIGluc3RhbmNlIG9mIG1vZHVsZTEKK21vZHVsZTEuMT12YWx1ZVgKK21vZHVsZTI9dmFsdWUyCittb2R1bGUzPWRzb19saXRlcmFsCittb2R1bGU0PWRzb19zZWN0aW9uCisKK1tkc29fc2VjdGlvbl0KKworcGF0aD0vc29tZS9wYXRoL3RvL3NvbWUvZHNvLnNvCitvdGhlcl9zdHVmZj1vdGhlcl92YWx1ZQorLS0tLQorCitXaGVuIHRoaXMgZmlsZSBpcyBsb2FkZWQgYSBjb25maWd1cmF0aW9uIG1vZHVsZSB3aXRoIHRoZSBzcGVjaWZpZWQgc3RyaW5nCisobW9kdWxlKiBpbiB0aGUgYWJvdmUgZXhhbXBsZSkgaXMgbG9va2VkIHVwIGFuZCBpdHMgaW5pdCBmdW5jdGlvbiBjYWxsZWQgYXM6CisKK2ludCBjb25mX2luaXRfZnVuYyhDT05GX0lNT0RVTEUgKm1kLCBDT05GICpjbmYpOworCitUaGUgZnVuY3Rpb24gY2FuIHRoZW4gdGFrZSB3aGF0ZXZlciBhY3Rpb24gaXMgYXBwcm9wcmlhdGUsIGZvciBleGFtcGxlIGZ1cnRoZXIKK2xvb2t1cHMgYmFzZWQgb24gdGhlIHZhbHVlLiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY29uZmlnIG1vZHVsZSBjYW4gYmUKK2xvYWRlZC4KKworV2hlbiB0aGUgYXBwbGljYXRpb24gY2xvc2VzIGRvd24gdGhlIG1vZHVsZXMgYXJlIGNsZWFuZWQgdXAgYnkgY2FsbGluZyBhbgorb3B0aW9uYWwgZmluaXNoIGZ1bmN0aW9uOgorCit2b2lkIGNvbmZfZmluaXNoX2Z1bmMoQ09ORl9JTU9EVUxFICptZCk7CisKK1RoZSBmaW5pc2ggZnVuY3Rpb25zIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBvcmRlcjogdGhhdCBpcyB0aGUgbGFzdCBtb2R1bGUKK2xvYWRlZCBpcyB0aGUgZmlyc3Qgb25lIGNsZWFuZWQgdXAuCisKK0lmIG5vIG1vZHVsZSBleGlzdHMgd2l0aCBhIGdpdmVuIG5hbWUgdGhlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gbG9hZCBhIERTTword2l0aCB0aGUgc3VwcGxpZWQgbmFtZS4gVGhpcyBtaWdodCBtZWFuIHRoYXQgIm1vZHVsZTMiIGF0dGVtcHRzIHRvIGxvYWQgYSBEU08KK2NhbGxlZCBsaWJtb2R1bGUzLnNvIG9yIG1vZHVsZTMuZGxsIGZvciBleGFtcGxlLiBBbiBleHBsaWNpdCBEU08gbmFtZSBjYW4gYmUKK2dpdmVuIGJ5IGluY2x1ZGluZyBhIHNlcGFyYXRlIHNlY3Rpb24gYXMgaW4gdGhlIG1vZHVsZTQgZXhhbXBsZSBhYm92ZS4KKworVGhlIERTTyBpcyBleHBlY3RlZCB0byBhdCBsZWFzdCBjb250YWluIGFuIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOgorCitpbnQgT1BFTlNTTF9pbml0KENPTkZfSU1PRFVMRSAqbWQsIENPTkYgKmNuZik7CisKK2FuZCBtYXkgYWxzbyBpbmNsdWRlIGEgZmluaXNoIGZ1bmN0aW9uOgorCit2b2lkIE9QRU5TU0xfZmluaXNoKENPTkZfSU1PRFVMRSAqbWQpOworCitTdGF0aWMgbW9kdWxlcyBjYW4gYWxzbyBiZSBhZGRlZCB1c2luZywKKworaW50IENPTkZfbW9kdWxlX2FkZChjaGFyICpuYW1lLCBkc29fbW9kX2luaXRfZnVuYyAqaWZ1bmMsIGRzb19tb2RfZmluaXNoX2Z1bmMKKypmZnVuYyk7CisKK3doZXJlICJuYW1lIiBpcyB0aGUgbmFtZSBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHRoaXMgZnVuY3Rpb24gY29ycmVzcG9uZHMKK3RvLgorCitBIHNldCBvZiBidWlsdGluIG1vZHVsZXMgKGN1cnJlbnRseSBvbmx5IGFuIEFTTjEgbm9uIGZ1bmN0aW9uYWwgdGVzdCBtb2R1bGUpCitjYW4gYmUgYWRkZWQgYnkgY2FsbGluZyBPUEVOU1NMX2xvYWRfYnVpbHRpbl9tb2R1bGVzKCkuIAorCitUaGUgZnVuY3Rpb24gT1BFTlNTTF9jb25maWcoKSBpcyBpbnRlbmRlZCBhcyBhIHNpbXBsZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9uCit0aGF0IGFueSBhcHBsaWNhdGlvbiBjYW4gY2FsbCB0byBwZXJmb3JtIHZhcmlvdXMgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRhc2tzLgorSXQgdXNlcyB0aGUgZmlsZSBvcGVuc3NsLmNuZiBpbiB0aGUgdXN1YWwgbG9jYXRpb25zLgorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NuZl9zYXZlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jbmZfc2F2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Mzk0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jbmZfc2F2ZS5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiBjcnlwdG8vY29uZi9jbmZfc2F2ZS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorCitzdGF0aWMgdm9pZCBwcmludF9jb25mKENPTkZfVkFMVUUgKmN2KTsKK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfRE9BTExfRk4ocHJpbnRfY29uZiwgQ09ORl9WQUxVRSAqKTsKKworbWFpbigpCisJeworCUxIQVNIICpjb25mOworCWxvbmcgbDsKKworCWNvbmY9Q09ORl9sb2FkKE5VTEwsIi4uLy4uL2FwcHMvb3BlbnNzbC5jbmYiLCZsKTsKKwlpZiAoY29uZiA9PSBOVUxMKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCJlcnJvciBsb2FkaW5nIGNvbmZpZywgbGluZSAlbGRcbiIsbCk7CisJCWV4aXQoMSk7CisJCX0KKworCWxoX2RvYWxsKGNvbmYsTEhBU0hfRE9BTExfRk4ocHJpbnRfY29uZikpOworCX0KKworCitzdGF0aWMgdm9pZCBwcmludF9jb25mKENPTkZfVkFMVUUgKmN2KQorCXsKKwlpbnQgaTsKKwlDT05GX1ZBTFVFICp2OworCWNoYXIgKnNlY3Rpb247CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZTsKKwlTVEFDSyAqczsKKworCS8qIElmIGl0IGlzIGEgc2luZ2xlIGVudHJ5LCByZXR1cm4gKi8KKworCWlmIChjdi0+bmFtZSAhPSBOVUxMKSByZXR1cm47CisKKwlwcmludGYoIlsgJXMgXVxuIixjdi0+c2VjdGlvbik7CisJcz0oU1RBQ0sgKiljdi0+dmFsdWU7CisKKwlmb3IgKGk9MDsgaTxza19udW0ocyk7IGkrKykKKwkJeworCQl2PShDT05GX1ZBTFVFICopc2tfdmFsdWUocyxpKTsKKwkJc2VjdGlvbj0odi0+c2VjdGlvbiA9PSBOVUxMKT8iTm9uZSI6di0+c2VjdGlvbjsKKwkJbmFtZT0odi0+bmFtZSA9PSBOVUxMKT8iTm9uZSI6di0+bmFtZTsKKwkJdmFsdWU9KHYtPnZhbHVlID09IE5VTEwpPyJOb25lIjp2LT52YWx1ZTsKKwkJcHJpbnRmKCIlcz0lc1xuIixuYW1lLHZhbHVlKTsKKwkJfQorCXByaW50ZigiXG4iKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxOTk5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmYuaApAQCAtMCwwICsxLDI2MyBAQAorLyogY3J5cHRvL2NvbmYvY29uZi5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgIEhFQURFUl9DT05GX0gKKyNkZWZpbmUgSEVBREVSX0NPTkZfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2FmZXN0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAorCXsKKwljaGFyICpzZWN0aW9uOworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsdWU7CisJfSBDT05GX1ZBTFVFOworCitERUNMQVJFX1NUQUNLX09GKENPTkZfVkFMVUUpCitERUNMQVJFX0xIQVNIX09GKENPTkZfVkFMVUUpOworCitzdHJ1Y3QgY29uZl9zdDsKK3N0cnVjdCBjb25mX21ldGhvZF9zdDsKK3R5cGVkZWYgc3RydWN0IGNvbmZfbWV0aG9kX3N0IENPTkZfTUVUSE9EOworCitzdHJ1Y3QgY29uZl9tZXRob2Rfc3QKKwl7CisJY29uc3QgY2hhciAqbmFtZTsKKwlDT05GICooKmNyZWF0ZSkoQ09ORl9NRVRIT0QgKm1ldGgpOworCWludCAoKmluaXQpKENPTkYgKmNvbmYpOworCWludCAoKmRlc3Ryb3kpKENPTkYgKmNvbmYpOworCWludCAoKmRlc3Ryb3lfZGF0YSkoQ09ORiAqY29uZik7CisJaW50ICgqbG9hZF9iaW8pKENPTkYgKmNvbmYsIEJJTyAqYnAsIGxvbmcgKmVsaW5lKTsKKwlpbnQgKCpkdW1wKShjb25zdCBDT05GICpjb25mLCBCSU8gKmJwKTsKKwlpbnQgKCppc19udW1iZXIpKGNvbnN0IENPTkYgKmNvbmYsIGNoYXIgYyk7CisJaW50ICgqdG9faW50KShjb25zdCBDT05GICpjb25mLCBjaGFyIGMpOworCWludCAoKmxvYWQpKENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKm5hbWUsIGxvbmcgKmVsaW5lKTsKKwl9OworCisvKiBNb2R1bGUgZGVmaW5pdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY29uZl9pbW9kdWxlX3N0IENPTkZfSU1PRFVMRTsKK3R5cGVkZWYgc3RydWN0IGNvbmZfbW9kdWxlX3N0IENPTkZfTU9EVUxFOworCitERUNMQVJFX1NUQUNLX09GKENPTkZfTU9EVUxFKQorREVDTEFSRV9TVEFDS19PRihDT05GX0lNT0RVTEUpCisKKy8qIERTTyBtb2R1bGUgZnVuY3Rpb24gdHlwZWRlZnMgKi8KK3R5cGVkZWYgaW50IGNvbmZfaW5pdF9mdW5jKENPTkZfSU1PRFVMRSAqbWQsIGNvbnN0IENPTkYgKmNuZik7Cit0eXBlZGVmIHZvaWQgY29uZl9maW5pc2hfZnVuYyhDT05GX0lNT0RVTEUgKm1kKTsKKworI2RlZmluZQlDT05GX01GTEFHU19JR05PUkVfRVJST1JTCTB4MQorI2RlZmluZSBDT05GX01GTEFHU19JR05PUkVfUkVUVVJOX0NPREVTCTB4MgorI2RlZmluZSBDT05GX01GTEFHU19TSUxFTlQJCTB4NAorI2RlZmluZSBDT05GX01GTEFHU19OT19EU08JCTB4OAorI2RlZmluZSBDT05GX01GTEFHU19JR05PUkVfTUlTU0lOR19GSUxFCTB4MTAKKyNkZWZpbmUgQ09ORl9NRkxBR1NfREVGQVVMVF9TRUNUSU9OCTB4MjAKKworaW50IENPTkZfc2V0X2RlZmF1bHRfbWV0aG9kKENPTkZfTUVUSE9EICptZXRoKTsKK3ZvaWQgQ09ORl9zZXRfbmNvbmYoQ09ORiAqY29uZixMSEFTSF9PRihDT05GX1ZBTFVFKSAqaGFzaCk7CitMSEFTSF9PRihDT05GX1ZBTFVFKSAqQ09ORl9sb2FkKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLGNvbnN0IGNoYXIgKmZpbGUsCisJCQkJbG9uZyAqZWxpbmUpOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorTEhBU0hfT0YoQ09ORl9WQUxVRSkgKkNPTkZfbG9hZF9mcChMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgRklMRSAqZnAsCisJCQkJICAgbG9uZyAqZWxpbmUpOworI2VuZGlmCitMSEFTSF9PRihDT05GX1ZBTFVFKSAqQ09ORl9sb2FkX2JpbyhMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgQklPICpicCxsb25nICplbGluZSk7CitTVEFDS19PRihDT05GX1ZBTFVFKSAqQ09ORl9nZXRfc2VjdGlvbihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbik7CitjaGFyICpDT05GX2dldF9zdHJpbmcoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsY29uc3QgY2hhciAqZ3JvdXAsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworbG9uZyBDT05GX2dldF9udW1iZXIoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsY29uc3QgY2hhciAqZ3JvdXAsCisJCSAgICAgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIENPTkZfZnJlZShMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZik7CitpbnQgQ09ORl9kdW1wX2ZwKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBGSUxFICpvdXQpOworaW50IENPTkZfZHVtcF9iaW8oTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIEJJTyAqb3V0KTsKKwordm9pZCBPUEVOU1NMX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfbmFtZSk7Cit2b2lkIE9QRU5TU0xfbm9fY29uZmlnKHZvaWQpOworCisvKiBOZXcgY29uZiBjb2RlLiAgVGhlIHNlbWFudGljcyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGZ1bmN0aW9ucyBhYm92ZS4KKyAgIElmIHRoYXQgd2Fzbid0IHRoZSBjYXNlLCB0aGUgYWJvdmUgZnVuY3Rpb25zIHdvdWxkIGhhdmUgYmVlbiByZXBsYWNlZCAqLworCitzdHJ1Y3QgY29uZl9zdAorCXsKKwlDT05GX01FVEhPRCAqbWV0aDsKKwl2b2lkICptZXRoX2RhdGE7CisJTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmRhdGE7CisJfTsKKworQ09ORiAqTkNPTkZfbmV3KENPTkZfTUVUSE9EICptZXRoKTsKK0NPTkZfTUVUSE9EICpOQ09ORl9kZWZhdWx0KHZvaWQpOworQ09ORl9NRVRIT0QgKk5DT05GX1dJTjMyKHZvaWQpOworI2lmIDAgLyogSnVzdCB0byBnaXZlIHlvdSBhbiBpZGVhIG9mIHdoYXQgSSBoYXZlIGluIG1pbmQgKi8KK0NPTkZfTUVUSE9EICpOQ09ORl9YTUwodm9pZCk7CisjZW5kaWYKK3ZvaWQgTkNPTkZfZnJlZShDT05GICpjb25mKTsKK3ZvaWQgTkNPTkZfZnJlZV9kYXRhKENPTkYgKmNvbmYpOworCitpbnQgTkNPTkZfbG9hZChDT05GICpjb25mLGNvbnN0IGNoYXIgKmZpbGUsbG9uZyAqZWxpbmUpOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IE5DT05GX2xvYWRfZnAoQ09ORiAqY29uZiwgRklMRSAqZnAsbG9uZyAqZWxpbmUpOworI2VuZGlmCitpbnQgTkNPTkZfbG9hZF9iaW8oQ09ORiAqY29uZiwgQklPICpicCxsb25nICplbGluZSk7CitTVEFDS19PRihDT05GX1ZBTFVFKSAqTkNPTkZfZ2V0X3NlY3Rpb24oY29uc3QgQ09ORiAqY29uZixjb25zdCBjaGFyICpzZWN0aW9uKTsKK2NoYXIgKk5DT05GX2dldF9zdHJpbmcoY29uc3QgQ09ORiAqY29uZixjb25zdCBjaGFyICpncm91cCxjb25zdCBjaGFyICpuYW1lKTsKK2ludCBOQ09ORl9nZXRfbnVtYmVyX2UoY29uc3QgQ09ORiAqY29uZixjb25zdCBjaGFyICpncm91cCxjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgbG9uZyAqcmVzdWx0KTsKK2ludCBOQ09ORl9kdW1wX2ZwKGNvbnN0IENPTkYgKmNvbmYsIEZJTEUgKm91dCk7CitpbnQgTkNPTkZfZHVtcF9iaW8oY29uc3QgQ09ORiAqY29uZiwgQklPICpvdXQpOworCisjaWYgMCAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGhhcyBubyBlcnJvciBjaGVja2luZywKKwkgYW5kIHNob3VsZCB0aGVyZWZvcmUgYmUgYXZvaWRlZCAqLworbG9uZyBOQ09ORl9nZXRfbnVtYmVyKENPTkYgKmNvbmYsY2hhciAqZ3JvdXAsY2hhciAqbmFtZSk7CisjZWxzZQorI2RlZmluZSBOQ09ORl9nZXRfbnVtYmVyKGMsZyxuLHIpIE5DT05GX2dldF9udW1iZXJfZShjLGcsbixyKQorI2VuZGlmCisgIAorLyogTW9kdWxlIGZ1bmN0aW9ucyAqLworCitpbnQgQ09ORl9tb2R1bGVzX2xvYWQoY29uc3QgQ09ORiAqY25mLCBjb25zdCBjaGFyICphcHBuYW1lLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBDT05GX21vZHVsZXNfbG9hZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICphcHBuYW1lLAorCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIENPTkZfbW9kdWxlc191bmxvYWQoaW50IGFsbCk7Cit2b2lkIENPTkZfbW9kdWxlc19maW5pc2godm9pZCk7Cit2b2lkIENPTkZfbW9kdWxlc19mcmVlKHZvaWQpOworaW50IENPTkZfbW9kdWxlX2FkZChjb25zdCBjaGFyICpuYW1lLCBjb25mX2luaXRfZnVuYyAqaWZ1bmMsCisJCSAgICBjb25mX2ZpbmlzaF9mdW5jICpmZnVuYyk7CisKK2NvbnN0IGNoYXIgKkNPTkZfaW1vZHVsZV9nZXRfbmFtZShjb25zdCBDT05GX0lNT0RVTEUgKm1kKTsKK2NvbnN0IGNoYXIgKkNPTkZfaW1vZHVsZV9nZXRfdmFsdWUoY29uc3QgQ09ORl9JTU9EVUxFICptZCk7Cit2b2lkICpDT05GX2ltb2R1bGVfZ2V0X3Vzcl9kYXRhKGNvbnN0IENPTkZfSU1PRFVMRSAqbWQpOwordm9pZCBDT05GX2ltb2R1bGVfc2V0X3Vzcl9kYXRhKENPTkZfSU1PRFVMRSAqbWQsIHZvaWQgKnVzcl9kYXRhKTsKK0NPTkZfTU9EVUxFICpDT05GX2ltb2R1bGVfZ2V0X21vZHVsZShjb25zdCBDT05GX0lNT0RVTEUgKm1kKTsKK3Vuc2lnbmVkIGxvbmcgQ09ORl9pbW9kdWxlX2dldF9mbGFncyhjb25zdCBDT05GX0lNT0RVTEUgKm1kKTsKK3ZvaWQgQ09ORl9pbW9kdWxlX3NldF9mbGFncyhDT05GX0lNT0RVTEUgKm1kLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3ZvaWQgKkNPTkZfbW9kdWxlX2dldF91c3JfZGF0YShDT05GX01PRFVMRSAqcG1vZCk7Cit2b2lkIENPTkZfbW9kdWxlX3NldF91c3JfZGF0YShDT05GX01PRFVMRSAqcG1vZCwgdm9pZCAqdXNyX2RhdGEpOworCitjaGFyICpDT05GX2dldDFfZGVmYXVsdF9jb25maWdfZmlsZSh2b2lkKTsKKworaW50IENPTkZfcGFyc2VfbGlzdChjb25zdCBjaGFyICpsaXN0LCBpbnQgc2VwLCBpbnQgbm9zcGMsCisJaW50ICgqbGlzdF9jYikoY29uc3QgY2hhciAqZWxlbSwgaW50IGxlbiwgdm9pZCAqdXNyKSwgdm9pZCAqYXJnKTsKKwordm9pZCBPUEVOU1NMX2xvYWRfYnVpbHRpbl9tb2R1bGVzKHZvaWQpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0NPTkZfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBDT05GIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIENPTkZfRl9DT05GX0RVTVBfRlAJCQkJIDEwNAorI2RlZmluZSBDT05GX0ZfQ09ORl9MT0FECQkJCSAxMDAKKyNkZWZpbmUgQ09ORl9GX0NPTkZfTE9BRF9CSU8JCQkJIDEwMgorI2RlZmluZSBDT05GX0ZfQ09ORl9MT0FEX0ZQCQkJCSAxMDMKKyNkZWZpbmUgQ09ORl9GX0NPTkZfTU9EVUxFU19MT0FECQkJIDExNgorI2RlZmluZSBDT05GX0ZfQ09ORl9QQVJTRV9MSVNUCQkJCSAxMTkKKyNkZWZpbmUgQ09ORl9GX0RFRl9MT0FECQkJCQkgMTIwCisjZGVmaW5lIENPTkZfRl9ERUZfTE9BRF9CSU8JCQkJIDEyMQorI2RlZmluZSBDT05GX0ZfTU9EVUxFX0lOSVQJCQkJIDExNQorI2RlZmluZSBDT05GX0ZfTU9EVUxFX0xPQURfRFNPCQkJCSAxMTcKKyNkZWZpbmUgQ09ORl9GX01PRFVMRV9SVU4JCQkJIDExOAorI2RlZmluZSBDT05GX0ZfTkNPTkZfRFVNUF9CSU8JCQkJIDEwNQorI2RlZmluZSBDT05GX0ZfTkNPTkZfRFVNUF9GUAkJCQkgMTA2CisjZGVmaW5lIENPTkZfRl9OQ09ORl9HRVRfTlVNQkVSCQkJCSAxMDcKKyNkZWZpbmUgQ09ORl9GX05DT05GX0dFVF9OVU1CRVJfRQkJCSAxMTIKKyNkZWZpbmUgQ09ORl9GX05DT05GX0dFVF9TRUNUSU9OCQkJIDEwOAorI2RlZmluZSBDT05GX0ZfTkNPTkZfR0VUX1NUUklORwkJCQkgMTA5CisjZGVmaW5lIENPTkZfRl9OQ09ORl9MT0FECQkJCSAxMTMKKyNkZWZpbmUgQ09ORl9GX05DT05GX0xPQURfQklPCQkJCSAxMTAKKyNkZWZpbmUgQ09ORl9GX05DT05GX0xPQURfRlAJCQkJIDExNAorI2RlZmluZSBDT05GX0ZfTkNPTkZfTkVXCQkJCSAxMTEKKyNkZWZpbmUgQ09ORl9GX1NUUl9DT1BZCQkJCQkgMTAxCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQ09ORl9SX0VSUk9SX0xPQURJTkdfRFNPCQkJIDExMAorI2RlZmluZSBDT05GX1JfTElTVF9DQU5OT1RfQkVfTlVMTAkJCSAxMTUKKyNkZWZpbmUgQ09ORl9SX01JU1NJTkdfQ0xPU0VfU1FVQVJFX0JSQUNLRVQJCSAxMDAKKyNkZWZpbmUgQ09ORl9SX01JU1NJTkdfRVFVQUxfU0lHTgkJCSAxMDEKKyNkZWZpbmUgQ09ORl9SX01JU1NJTkdfRklOSVNIX0ZVTkNUSU9OCQkJIDExMQorI2RlZmluZSBDT05GX1JfTUlTU0lOR19JTklUX0ZVTkNUSU9OCQkJIDExMgorI2RlZmluZSBDT05GX1JfTU9EVUxFX0lOSVRJQUxJWkFUSU9OX0VSUk9SCQkgMTA5CisjZGVmaW5lIENPTkZfUl9OT19DTE9TRV9CUkFDRQkJCQkgMTAyCisjZGVmaW5lIENPTkZfUl9OT19DT05GCQkJCQkgMTA1CisjZGVmaW5lIENPTkZfUl9OT19DT05GX09SX0VOVklST05NRU5UX1ZBUklBQkxFCQkgMTA2CisjZGVmaW5lIENPTkZfUl9OT19TRUNUSU9OCQkJCSAxMDcKKyNkZWZpbmUgQ09ORl9SX05PX1NVQ0hfRklMRQkJCQkgMTE0CisjZGVmaW5lIENPTkZfUl9OT19WQUxVRQkJCQkJIDEwOAorI2RlZmluZSBDT05GX1JfVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTgkJIDEwMworI2RlZmluZSBDT05GX1JfVU5LTk9XTl9NT0RVTEVfTkFNRQkJCSAxMTMKKyNkZWZpbmUgQ09ORl9SX1ZBUklBQkxFX0hBU19OT19WQUxVRQkJCSAxMDQKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfYXBpLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX2FwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjE3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX2FwaS5jCkBAIC0wLDAgKzEsMzAwIEBACisvKiBjb25mX2FwaS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIFBhcnQgb2YgdGhlIGNvZGUgaW4gaGVyZSB3YXMgb3JpZ2luYWxseSBpbiBjb25mLmMsIHdoaWNoIGlzIG5vdyByZW1vdmVkICovCisKKyNpZm5kZWYgQ09ORl9ERUJVRworIyB1bmRlZiBOREVCVUcgLyogYXZvaWQgY29uZmxpY3RpbmcgZGVmaW5pdGlvbnMgKi8KKyMgZGVmaW5lIE5ERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmZfYXBpLmg+CisjaW5jbHVkZSAiZV9vcy5oIgorCitzdGF0aWMgdm9pZCB2YWx1ZV9mcmVlX2hhc2hfZG9hbGxfYXJnKENPTkZfVkFMVUUgKmEsCisJCQkJICAgICAgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYpOworc3RhdGljIHZvaWQgdmFsdWVfZnJlZV9zdGFja19kb2FsbChDT05GX1ZBTFVFICphKTsKK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfRE9BTExfQVJHX0ZOKHZhbHVlX2ZyZWVfaGFzaCwgQ09ORl9WQUxVRSwKKwkJCQkgICAgTEhBU0hfT0YoQ09ORl9WQUxVRSkpCitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0RPQUxMX0ZOKHZhbHVlX2ZyZWVfc3RhY2ssIENPTkZfVkFMVUUpCisKKy8qIFVwIHVudGlsIE9wZW5TU0wgMC45LjVhLCB0aGlzIHdhcyBnZXRfc2VjdGlvbiAqLworQ09ORl9WQUxVRSAqX0NPTkZfZ2V0X3NlY3Rpb24oY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbikKKwl7CisJQ09ORl9WQUxVRSAqdix2djsKKworCWlmICgoY29uZiA9PSBOVUxMKSB8fCAoc2VjdGlvbiA9PSBOVUxMKSkgcmV0dXJuKE5VTEwpOworCXZ2Lm5hbWU9TlVMTDsKKwl2di5zZWN0aW9uPShjaGFyICopc2VjdGlvbjsKKwl2PWxoX0NPTkZfVkFMVUVfcmV0cmlldmUoY29uZi0+ZGF0YSwmdnYpOworCXJldHVybih2KTsKKwl9CisKKy8qIFVwIHVudGlsIE9wZW5TU0wgMC45LjVhLCB0aGlzIHdhcyBDT05GX2dldF9zZWN0aW9uICovCitTVEFDS19PRihDT05GX1ZBTFVFKSAqX0NPTkZfZ2V0X3NlY3Rpb25fdmFsdWVzKGNvbnN0IENPTkYgKmNvbmYsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uKQorCXsKKwlDT05GX1ZBTFVFICp2OworCisJdj1fQ09ORl9nZXRfc2VjdGlvbihjb25mLHNlY3Rpb24pOworCWlmICh2ICE9IE5VTEwpCisJCXJldHVybigoU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKil2LT52YWx1ZSk7CisJZWxzZQorCQlyZXR1cm4oTlVMTCk7CisJfQorCitpbnQgX0NPTkZfYWRkX3N0cmluZyhDT05GICpjb25mLCBDT05GX1ZBTFVFICpzZWN0aW9uLCBDT05GX1ZBTFVFICp2YWx1ZSkKKwl7CisJQ09ORl9WQUxVRSAqdiA9IE5VTEw7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnRzOworCisJdHMgPSAoU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKilzZWN0aW9uLT52YWx1ZTsKKworCXZhbHVlLT5zZWN0aW9uPXNlY3Rpb24tPnNlY3Rpb247CQorCWlmICghc2tfQ09ORl9WQUxVRV9wdXNoKHRzLHZhbHVlKSkKKwkJeworCQlyZXR1cm4gMDsKKwkJfQorCisJdiA9IGxoX0NPTkZfVkFMVUVfaW5zZXJ0KGNvbmYtPmRhdGEsIHZhbHVlKTsKKwlpZiAodiAhPSBOVUxMKQorCQl7CisJCSh2b2lkKXNrX0NPTkZfVkFMVUVfZGVsZXRlX3B0cih0cyx2KTsKKwkJT1BFTlNTTF9mcmVlKHYtPm5hbWUpOworCQlPUEVOU1NMX2ZyZWUodi0+dmFsdWUpOworCQlPUEVOU1NMX2ZyZWUodik7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2NoYXIgKl9DT05GX2dldF9zdHJpbmcoY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqbmFtZSkKKwl7CisJQ09ORl9WQUxVRSAqdix2djsKKwljaGFyICpwOworCisJaWYgKG5hbWUgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCWlmIChjb25mICE9IE5VTEwpCisJCXsKKwkJaWYgKHNlY3Rpb24gIT0gTlVMTCkKKwkJCXsKKwkJCXZ2Lm5hbWU9KGNoYXIgKiluYW1lOworCQkJdnYuc2VjdGlvbj0oY2hhciAqKXNlY3Rpb247CisJCQl2PWxoX0NPTkZfVkFMVUVfcmV0cmlldmUoY29uZi0+ZGF0YSwmdnYpOworCQkJaWYgKHYgIT0gTlVMTCkgcmV0dXJuKHYtPnZhbHVlKTsKKwkJCWlmIChzdHJjbXAoc2VjdGlvbiwiRU5WIikgPT0gMCkKKwkJCQl7CisJCQkJcD1nZXRlbnYobmFtZSk7CisJCQkJaWYgKHAgIT0gTlVMTCkgcmV0dXJuKHApOworCQkJCX0KKwkJCX0KKwkJdnYuc2VjdGlvbj0iZGVmYXVsdCI7CisJCXZ2Lm5hbWU9KGNoYXIgKiluYW1lOworCQl2PWxoX0NPTkZfVkFMVUVfcmV0cmlldmUoY29uZi0+ZGF0YSwmdnYpOworCQlpZiAodiAhPSBOVUxMKQorCQkJcmV0dXJuKHYtPnZhbHVlKTsKKwkJZWxzZQorCQkJcmV0dXJuKE5VTEwpOworCQl9CisJZWxzZQorCQlyZXR1cm4oZ2V0ZW52KG5hbWUpKTsKKwl9CisKKyNpZiAwIC8qIFRoZXJlJ3Mgbm8gd2F5IHRvIHByb3ZpZGUgZXJyb3IgY2hlY2tpbmcgd2l0aCB0aGlzIGZ1bmN0aW9uLCBzbworCSBmb3JjZSBpbXBsZW1lbnRvcnMgb2YgdGhlIGhpZ2hlciBsZXZlbHMgdG8gZ2V0IGEgc3RyaW5nIGFuZCByZWFkCisJIHRoZSBudW1iZXIgdGhlbXNlbHZlcy4gKi8KK2xvbmcgX0NPTkZfZ2V0X251bWJlcihDT05GICpjb25mLCBjaGFyICpzZWN0aW9uLCBjaGFyICpuYW1lKQorCXsKKwljaGFyICpzdHI7CisJbG9uZyByZXQ9MDsKKworCXN0cj1fQ09ORl9nZXRfc3RyaW5nKGNvbmYsc2VjdGlvbixuYW1lKTsKKwlpZiAoc3RyID09IE5VTEwpIHJldHVybigwKTsKKwlmb3IgKDs7KQorCQl7CisJCWlmIChjb25mLT5tZXRoLT5pc19udW1iZXIoY29uZiwgKnN0cikpCisJCQlyZXQ9cmV0KjEwK2NvbmYtPm1ldGgtPnRvX2ludChjb25mLCAqc3RyKTsKKwkJZWxzZQorCQkJcmV0dXJuKHJldCk7CisJCXN0cisrOworCQl9CisJfQorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNvbmZfdmFsdWVfaGFzaChjb25zdCBDT05GX1ZBTFVFICp2KQorCXsKKwlyZXR1cm4gKGxoX3N0cmhhc2godi0+c2VjdGlvbik8PDIpXmxoX3N0cmhhc2godi0+bmFtZSk7CisJfQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9IQVNIX0ZOKGNvbmZfdmFsdWUsIENPTkZfVkFMVUUpCisKK3N0YXRpYyBpbnQgY29uZl92YWx1ZV9jbXAoY29uc3QgQ09ORl9WQUxVRSAqYSwgY29uc3QgQ09ORl9WQUxVRSAqYikKKwl7CisJaW50IGk7CisKKwlpZiAoYS0+c2VjdGlvbiAhPSBiLT5zZWN0aW9uKQorCQl7CisJCWk9c3RyY21wKGEtPnNlY3Rpb24sYi0+c2VjdGlvbik7CisJCWlmIChpKSByZXR1cm4oaSk7CisJCX0KKworCWlmICgoYS0+bmFtZSAhPSBOVUxMKSAmJiAoYi0+bmFtZSAhPSBOVUxMKSkKKwkJeworCQlpPXN0cmNtcChhLT5uYW1lLGItPm5hbWUpOworCQlyZXR1cm4oaSk7CisJCX0KKwllbHNlIGlmIChhLT5uYW1lID09IGItPm5hbWUpCisJCXJldHVybigwKTsKKwllbHNlCisJCXJldHVybigoYS0+bmFtZSA9PSBOVUxMKT8tMToxKTsKKwl9CitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0NPTVBfRk4oY29uZl92YWx1ZSwgQ09ORl9WQUxVRSkKKworaW50IF9DT05GX25ld19kYXRhKENPTkYgKmNvbmYpCisJeworCWlmIChjb25mID09IE5VTEwpCisJCXsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoY29uZi0+ZGF0YSA9PSBOVUxMKQorCQlpZiAoKGNvbmYtPmRhdGEgPSBsaF9DT05GX1ZBTFVFX25ldygpKSA9PSBOVUxMKQorCQkJeworCQkJcmV0dXJuIDA7CisJCQl9CisJcmV0dXJuIDE7CisJfQorCit2b2lkIF9DT05GX2ZyZWVfZGF0YShDT05GICpjb25mKQorCXsKKwlpZiAoY29uZiA9PSBOVUxMIHx8IGNvbmYtPmRhdGEgPT0gTlVMTCkgcmV0dXJuOworCisJbGhfQ09ORl9WQUxVRV9kb3duX2xvYWQoY29uZi0+ZGF0YSk9MDsgLyogZXZpbCB0aGluZyB0byBtYWtlCisJCQkJICAqIHN1cmUgdGhlICdPUEVOU1NMX2ZyZWUoKScgd29ya3MgYXMKKwkJCQkgICogZXhwZWN0ZWQgKi8KKwlsaF9DT05GX1ZBTFVFX2RvYWxsX2FyZyhjb25mLT5kYXRhLAorCQkJCUxIQVNIX0RPQUxMX0FSR19GTih2YWx1ZV9mcmVlX2hhc2gpLAorCQkJCUxIQVNIX09GKENPTkZfVkFMVUUpLCBjb25mLT5kYXRhKTsKKworCS8qIFdlIG5vdyBoYXZlIG9ubHkgJ3NlY3Rpb24nIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUuCisJICogRHVlIHRvIHByb2JsZW1zIHdpdGggKi8KKworCWxoX0NPTkZfVkFMVUVfZG9hbGwoY29uZi0+ZGF0YSwgTEhBU0hfRE9BTExfRk4odmFsdWVfZnJlZV9zdGFjaykpOworCWxoX0NPTkZfVkFMVUVfZnJlZShjb25mLT5kYXRhKTsKKwl9CisKK3N0YXRpYyB2b2lkIHZhbHVlX2ZyZWVfaGFzaF9kb2FsbF9hcmcoQ09ORl9WQUxVRSAqYSwgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYpCisJeworCWlmIChhLT5uYW1lICE9IE5VTEwpCisJCSh2b2lkKWxoX0NPTkZfVkFMVUVfZGVsZXRlKGNvbmYsYSk7CisJfQorCitzdGF0aWMgdm9pZCB2YWx1ZV9mcmVlX3N0YWNrX2RvYWxsKENPTkZfVkFMVUUgKmEpCisJeworCUNPTkZfVkFMVUUgKnZ2OworCVNUQUNLX09GKENPTkZfVkFMVUUpICpzazsKKwlpbnQgaTsKKworCWlmIChhLT5uYW1lICE9IE5VTEwpIHJldHVybjsKKworCXNrPShTVEFDS19PRihDT05GX1ZBTFVFKSAqKWEtPnZhbHVlOworCWZvciAoaT1za19DT05GX1ZBTFVFX251bShzayktMTsgaT49MDsgaS0tKQorCQl7CisJCXZ2PXNrX0NPTkZfVkFMVUVfdmFsdWUoc2ssaSk7CisJCU9QRU5TU0xfZnJlZSh2di0+dmFsdWUpOworCQlPUEVOU1NMX2ZyZWUodnYtPm5hbWUpOworCQlPUEVOU1NMX2ZyZWUodnYpOworCQl9CisJaWYgKHNrICE9IE5VTEwpIHNrX0NPTkZfVkFMVUVfZnJlZShzayk7CisJT1BFTlNTTF9mcmVlKGEtPnNlY3Rpb24pOworCU9QRU5TU0xfZnJlZShhKTsKKwl9CisKKy8qIFVwIHVudGlsIE9wZW5TU0wgMC45LjVhLCB0aGlzIHdhcyBuZXdfc2VjdGlvbiAqLworQ09ORl9WQUxVRSAqX0NPTkZfbmV3X3NlY3Rpb24oQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbikKKwl7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNrPU5VTEw7CisJaW50IG9rPTAsaTsKKwlDT05GX1ZBTFVFICp2PU5VTEwsKnZ2OworCisJaWYgKChzaz1za19DT05GX1ZBTFVFX25ld19udWxsKCkpID09IE5VTEwpCisJCWdvdG8gZXJyOworCWlmICgodj1PUEVOU1NMX21hbGxvYyhzaXplb2YoQ09ORl9WQUxVRSkpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpPXN0cmxlbihzZWN0aW9uKSsxOworCWlmICgodi0+c2VjdGlvbj1PUEVOU1NMX21hbGxvYyhpKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwltZW1jcHkodi0+c2VjdGlvbixzZWN0aW9uLGkpOworCXYtPm5hbWU9TlVMTDsKKwl2LT52YWx1ZT0oY2hhciAqKXNrOworCQorCXZ2PWxoX0NPTkZfVkFMVUVfaW5zZXJ0KGNvbmYtPmRhdGEsdik7CisJYXNzZXJ0KHZ2ID09IE5VTEwpOworCW9rPTE7CitlcnI6CisJaWYgKCFvaykKKwkJeworCQlpZiAoc2sgIT0gTlVMTCkgc2tfQ09ORl9WQUxVRV9mcmVlKHNrKTsKKwkJaWYgKHYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHYpOworCQl2PU5VTEw7CisJCX0KKwlyZXR1cm4odik7CisJfQorCitJTVBMRU1FTlRfU1RBQ0tfT0YoQ09ORl9WQUxVRSkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfYXBpLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTk1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX2FwaS5oCkBAIC0wLDAgKzEsODkgQEAKKy8qIGNvbmZfYXBpLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiAgSEVBREVSX0NPTkZfQVBJX0gKKyNkZWZpbmUgSEVBREVSX0NPTkZfQVBJX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVXAgdW50aWwgT3BlblNTTCAwLjkuNWEsIHRoaXMgd2FzIG5ld19zZWN0aW9uICovCitDT05GX1ZBTFVFICpfQ09ORl9uZXdfc2VjdGlvbihDT05GICpjb25mLCBjb25zdCBjaGFyICpzZWN0aW9uKTsKKy8qIFVwIHVudGlsIE9wZW5TU0wgMC45LjVhLCB0aGlzIHdhcyBnZXRfc2VjdGlvbiAqLworQ09ORl9WQUxVRSAqX0NPTkZfZ2V0X3NlY3Rpb24oY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbik7CisvKiBVcCB1bnRpbCBPcGVuU1NMIDAuOS41YSwgdGhpcyB3YXMgQ09ORl9nZXRfc2VjdGlvbiAqLworU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKl9DT05GX2dldF9zZWN0aW9uX3ZhbHVlcyhjb25zdCBDT05GICpjb25mLAorCQkJCQkgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbik7CisKK2ludCBfQ09ORl9hZGRfc3RyaW5nKENPTkYgKmNvbmYsIENPTkZfVkFMVUUgKnNlY3Rpb24sIENPTkZfVkFMVUUgKnZhbHVlKTsKK2NoYXIgKl9DT05GX2dldF9zdHJpbmcoY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworbG9uZyBfQ09ORl9nZXRfbnVtYmVyKGNvbnN0IENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKnNlY3Rpb24sIGNvbnN0IGNoYXIgKm5hbWUpOworCitpbnQgX0NPTkZfbmV3X2RhdGEoQ09ORiAqY29uZik7Cit2b2lkIF9DT05GX2ZyZWVfZGF0YShDT05GICpjb25mKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9kZWYuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfZGVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1NzFiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfZGVmLmMKQEAgLTAsMCArMSw3NTEgQEAKKy8qIGNyeXB0by9jb25mL2NvbmYuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBQYXJ0IG9mIHRoZSBjb2RlIGluIGhlcmUgd2FzIG9yaWdpbmFsbHkgaW4gY29uZi5jLCB3aGljaCBpcyBub3cgcmVtb3ZlZCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mX2FwaS5oPgorI2luY2x1ZGUgImNvbmZfZGVmLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCitzdGF0aWMgY2hhciAqZWF0X3dzKENPTkYgKmNvbmYsIGNoYXIgKnApOworc3RhdGljIGNoYXIgKmVhdF9hbHBoYV9udW1lcmljKENPTkYgKmNvbmYsIGNoYXIgKnApOworc3RhdGljIHZvaWQgY2xlYXJfY29tbWVudHMoQ09ORiAqY29uZiwgY2hhciAqcCk7CitzdGF0aWMgaW50IHN0cl9jb3B5KENPTkYgKmNvbmYsY2hhciAqc2VjdGlvbixjaGFyICoqdG8sIGNoYXIgKmZyb20pOworc3RhdGljIGNoYXIgKnNjYW5fcXVvdGUoQ09ORiAqY29uZiwgY2hhciAqcCk7CitzdGF0aWMgY2hhciAqc2Nhbl9kcXVvdGUoQ09ORiAqY29uZiwgY2hhciAqcCk7CisjZGVmaW5lIHNjYW5fZXNjKGNvbmYscCkJKCgoSVNfRU9GKChjb25mKSwocClbMV0pKT8oKHApKzEpOigocCkrMikpKQorCitzdGF0aWMgQ09ORiAqZGVmX2NyZWF0ZShDT05GX01FVEhPRCAqbWV0aCk7CitzdGF0aWMgaW50IGRlZl9pbml0X2RlZmF1bHQoQ09ORiAqY29uZik7CitzdGF0aWMgaW50IGRlZl9pbml0X1dJTjMyKENPTkYgKmNvbmYpOworc3RhdGljIGludCBkZWZfZGVzdHJveShDT05GICpjb25mKTsKK3N0YXRpYyBpbnQgZGVmX2Rlc3Ryb3lfZGF0YShDT05GICpjb25mKTsKK3N0YXRpYyBpbnQgZGVmX2xvYWQoQ09ORiAqY29uZiwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyAqZWxpbmUpOworc3RhdGljIGludCBkZWZfbG9hZF9iaW8oQ09ORiAqY29uZiwgQklPICpicCwgbG9uZyAqZWxpbmUpOworc3RhdGljIGludCBkZWZfZHVtcChjb25zdCBDT05GICpjb25mLCBCSU8gKmJwKTsKK3N0YXRpYyBpbnQgZGVmX2lzX251bWJlcihjb25zdCBDT05GICpjb25mLCBjaGFyIGMpOworc3RhdGljIGludCBkZWZfdG9faW50KGNvbnN0IENPTkYgKmNvbmYsIGNoYXIgYyk7CisKK2NvbnN0IGNoYXIgQ09ORl9kZWZfdmVyc2lvbltdPSJDT05GX2RlZiIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCitzdGF0aWMgQ09ORl9NRVRIT0QgZGVmYXVsdF9tZXRob2QgPSB7CisJIk9wZW5TU0wgZGVmYXVsdCIsCisJZGVmX2NyZWF0ZSwKKwlkZWZfaW5pdF9kZWZhdWx0LAorCWRlZl9kZXN0cm95LAorCWRlZl9kZXN0cm95X2RhdGEsCisJZGVmX2xvYWRfYmlvLAorCWRlZl9kdW1wLAorCWRlZl9pc19udW1iZXIsCisJZGVmX3RvX2ludCwKKwlkZWZfbG9hZAorCX07CisKK3N0YXRpYyBDT05GX01FVEhPRCBXSU4zMl9tZXRob2QgPSB7CisJIldJTjMyIiwKKwlkZWZfY3JlYXRlLAorCWRlZl9pbml0X1dJTjMyLAorCWRlZl9kZXN0cm95LAorCWRlZl9kZXN0cm95X2RhdGEsCisJZGVmX2xvYWRfYmlvLAorCWRlZl9kdW1wLAorCWRlZl9pc19udW1iZXIsCisJZGVmX3RvX2ludCwKKwlkZWZfbG9hZAorCX07CisKK0NPTkZfTUVUSE9EICpOQ09ORl9kZWZhdWx0KCkKKwl7CisJcmV0dXJuICZkZWZhdWx0X21ldGhvZDsKKwl9CitDT05GX01FVEhPRCAqTkNPTkZfV0lOMzIoKQorCXsKKwlyZXR1cm4gJldJTjMyX21ldGhvZDsKKwl9CisKK3N0YXRpYyBDT05GICpkZWZfY3JlYXRlKENPTkZfTUVUSE9EICptZXRoKQorCXsKKwlDT05GICpyZXQ7CisKKwlyZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoQ09ORikgKyBzaXplb2YodW5zaWduZWQgc2hvcnQgKikpOworCWlmIChyZXQpCisJCWlmIChtZXRoLT5pbml0KHJldCkgPT0gMCkKKwkJCXsKKwkJCU9QRU5TU0xfZnJlZShyZXQpOworCQkJcmV0ID0gTlVMTDsKKwkJCX0KKwlyZXR1cm4gcmV0OworCX0KKwkKK3N0YXRpYyBpbnQgZGVmX2luaXRfZGVmYXVsdChDT05GICpjb25mKQorCXsKKwlpZiAoY29uZiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWNvbmYtPm1ldGggPSAmZGVmYXVsdF9tZXRob2Q7CisJY29uZi0+bWV0aF9kYXRhID0gQ09ORl90eXBlX2RlZmF1bHQ7CisJY29uZi0+ZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZGVmX2luaXRfV0lOMzIoQ09ORiAqY29uZikKKwl7CisJaWYgKGNvbmYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwljb25mLT5tZXRoID0gJldJTjMyX21ldGhvZDsKKwljb25mLT5tZXRoX2RhdGEgPSAodm9pZCAqKUNPTkZfdHlwZV93aW4zMjsKKwljb25mLT5kYXRhID0gTlVMTDsKKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBkZWZfZGVzdHJveShDT05GICpjb25mKQorCXsKKwlpZiAoZGVmX2Rlc3Ryb3lfZGF0YShjb25mKSkKKwkJeworCQlPUEVOU1NMX2ZyZWUoY29uZik7CisJCXJldHVybiAxOworCQl9CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGRlZl9kZXN0cm95X2RhdGEoQ09ORiAqY29uZikKKwl7CisJaWYgKGNvbmYgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJX0NPTkZfZnJlZV9kYXRhKGNvbmYpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBkZWZfbG9hZChDT05GICpjb25mLCBjb25zdCBjaGFyICpuYW1lLCBsb25nICpsaW5lKQorCXsKKwlpbnQgcmV0OworCUJJTyAqaW49TlVMTDsKKworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCWluPUJJT19uZXdfZmlsZShuYW1lLCAiciIpOworI2Vsc2UKKwlpbj1CSU9fbmV3X2ZpbGUobmFtZSwgInJiIik7CisjZW5kaWYKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlpZiAoRVJSX0dFVF9SRUFTT04oRVJSX3BlZWtfbGFzdF9lcnJvcigpKSA9PSBCSU9fUl9OT19TVUNIX0ZJTEUpCisJCQlDT05GZXJyKENPTkZfRl9ERUZfTE9BRCxDT05GX1JfTk9fU1VDSF9GSUxFKTsKKwkJZWxzZQorCQkJQ09ORmVycihDT05GX0ZfREVGX0xPQUQsRVJSX1JfU1lTX0xJQik7CisJCXJldHVybiAwOworCQl9CisKKwlyZXQgPSBkZWZfbG9hZF9iaW8oY29uZiwgaW4sIGxpbmUpOworCUJJT19mcmVlKGluKTsKKworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IGRlZl9sb2FkX2JpbyhDT05GICpjb25mLCBCSU8gKmluLCBsb25nICpsaW5lKQorCXsKKy8qIFRoZSBtYWNybyBCVUZTSVpFIGNvbmZsaWN0cyB3aXRoIGEgc3lzdGVtIG1hY3JvIGluIFZ4V29ya3MgKi8KKyNkZWZpbmUgQ09ORkJVRlNJWkUJNTEyCisJaW50IGJ1Zm51bT0wLGksaWk7CisJQlVGX01FTSAqYnVmZj1OVUxMOworCWNoYXIgKnMsKnAsKmVuZDsKKwlpbnQgYWdhaW4sbjsKKwlsb25nIGVsaW5lPTA7CisJY2hhciBidG1wW0RFQ0lNQUxfU0laRShlbGluZSkrMV07CisJQ09ORl9WQUxVRSAqdj1OVUxMLCp0djsKKwlDT05GX1ZBTFVFICpzdj1OVUxMOworCWNoYXIgKnNlY3Rpb249TlVMTCwqYnVmOworCVNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0aW9uX3NrPU5VTEwsKnRzOworCWNoYXIgKnN0YXJ0LCpwc2VjdGlvbiwqcG5hbWU7CisJdm9pZCAqaCA9ICh2b2lkICopKGNvbmYtPmRhdGEpOworCisJaWYgKChidWZmPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCisJCXsKKwkJQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLEVSUl9SX0JVRl9MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCisJc2VjdGlvbj0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKDEwKTsKKwlpZiAoc2VjdGlvbiA9PSBOVUxMKQorCQl7CisJCUNPTkZlcnIoQ09ORl9GX0RFRl9MT0FEX0JJTyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisJQlVGX3N0cmxjcHkoc2VjdGlvbiwiZGVmYXVsdCIsMTApOworCisJaWYgKF9DT05GX25ld19kYXRhKGNvbmYpID09IDApCisJCXsKKwkJQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCXN2PV9DT05GX25ld19zZWN0aW9uKGNvbmYsc2VjdGlvbik7CisJaWYgKHN2ID09IE5VTEwpCisJCXsKKwkJQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLAorCQkJCQlDT05GX1JfVU5BQkxFX1RPX0NSRUFURV9ORVdfU0VDVElPTik7CisJCWdvdG8gZXJyOworCQl9CisJc2VjdGlvbl9zaz0oU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKilzdi0+dmFsdWU7CisKKwlidWZudW09MDsKKwlhZ2Fpbj0wOworCWZvciAoOzspCisJCXsKKwkJaWYgKCFCVUZfTUVNX2dyb3coYnVmZixidWZudW0rQ09ORkJVRlNJWkUpKQorCQkJeworCQkJQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLEVSUl9SX0JVRl9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCXA9ICYoYnVmZi0+ZGF0YVtidWZudW1dKTsKKwkJKnA9J1wwJzsKKwkJQklPX2dldHMoaW4sIHAsIENPTkZCVUZTSVpFLTEpOworCQlwW0NPTkZCVUZTSVpFLTFdPSdcMCc7CisJCWlpPWk9c3RybGVuKHApOworCQlpZiAoaSA9PSAwICYmICFhZ2FpbikgYnJlYWs7CisJCWFnYWluPTA7CisJCXdoaWxlIChpID4gMCkKKwkJCXsKKwkJCWlmICgocFtpLTFdICE9ICdccicpICYmIChwW2ktMV0gIT0gJ1xuJykpCisJCQkJYnJlYWs7CisJCQllbHNlCisJCQkJaS0tOworCQkJfQorCQkvKiB3ZSByZW1vdmVkIHNvbWUgdHJhaWxpbmcgc3R1ZmYgc28gdGhlcmUgaXMgYSBuZXcKKwkJICogbGluZSBvbiB0aGUgZW5kLiAqLworCQlpZiAoaWkgJiYgaSA9PSBpaSkKKwkJCWFnYWluPTE7IC8qIGxvbmcgbGluZSAqLworCQllbHNlCisJCQl7CisJCQlwW2ldPSdcMCc7CisJCQllbGluZSsrOyAvKiBhbm90aGVyIGlucHV0IGxpbmUgKi8KKwkJCX0KKworCQkvKiB3ZSBub3cgaGF2ZSBhIGxpbmUgd2l0aCB0cmFpbGluZyBcclxuIHJlbW92ZWQgKi8KKworCQkvKiBpIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgKi8KKwkJYnVmbnVtKz1pOworCisJCXY9TlVMTDsKKwkJLyogY2hlY2sgZm9yIGxpbmUgY29udGludWF0aW9uICovCisJCWlmIChidWZudW0gPj0gMSkKKwkJCXsKKwkJCS8qIElmIHdlIGhhdmUgYnl0ZXMgYW5kIHRoZSBsYXN0IGNoYXIgJ1xcJyBhbmQKKwkJCSAqIHNlY29uZCBsYXN0IGNoYXIgaXMgbm90ICdcXCcgKi8KKwkJCXA9ICYoYnVmZi0+ZGF0YVtidWZudW0tMV0pOworCQkJaWYgKElTX0VTQyhjb25mLHBbMF0pICYmCisJCQkJKChidWZudW0gPD0gMSkgfHwgIUlTX0VTQyhjb25mLHBbLTFdKSkpCisJCQkJeworCQkJCWJ1Zm51bS0tOworCQkJCWFnYWluPTE7CisJCQkJfQorCQkJfQorCQlpZiAoYWdhaW4pIGNvbnRpbnVlOworCQlidWZudW09MDsKKwkJYnVmPWJ1ZmYtPmRhdGE7CisKKwkJY2xlYXJfY29tbWVudHMoY29uZiwgYnVmKTsKKwkJbj1zdHJsZW4oYnVmKTsKKwkJcz1lYXRfd3MoY29uZiwgYnVmKTsKKwkJaWYgKElTX0VPRihjb25mLCpzKSkgY29udGludWU7IC8qIGJsYW5rIGxpbmUgKi8KKwkJaWYgKCpzID09ICdbJykKKwkJCXsKKwkJCWNoYXIgKnNzOworCisJCQlzKys7CisJCQlzdGFydD1lYXRfd3MoY29uZiwgcyk7CisJCQlzcz1zdGFydDsKK2FnYWluOgorCQkJZW5kPWVhdF9hbHBoYV9udW1lcmljKGNvbmYsIHNzKTsKKwkJCXA9ZWF0X3dzKGNvbmYsIGVuZCk7CisJCQlpZiAoKnAgIT0gJ10nKQorCQkJCXsKKwkJCQlpZiAoKnAgIT0gJ1wwJykKKwkJCQkJeworCQkJCQlzcz1wOworCQkJCQlnb3RvIGFnYWluOworCQkJCQl9CisJCQkJQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLAorCQkJCQlDT05GX1JfTUlTU0lOR19DTE9TRV9TUVVBUkVfQlJBQ0tFVCk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJKmVuZD0nXDAnOworCQkJaWYgKCFzdHJfY29weShjb25mLE5VTEwsJnNlY3Rpb24sc3RhcnQpKSBnb3RvIGVycjsKKwkJCWlmICgoc3Y9X0NPTkZfZ2V0X3NlY3Rpb24oY29uZixzZWN0aW9uKSkgPT0gTlVMTCkKKwkJCQlzdj1fQ09ORl9uZXdfc2VjdGlvbihjb25mLHNlY3Rpb24pOworCQkJaWYgKHN2ID09IE5VTEwpCisJCQkJeworCQkJCUNPTkZlcnIoQ09ORl9GX0RFRl9MT0FEX0JJTywKKwkJCQkJQ09ORl9SX1VOQUJMRV9UT19DUkVBVEVfTkVXX1NFQ1RJT04pOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXNlY3Rpb25fc2s9KFNUQUNLX09GKENPTkZfVkFMVUUpICopc3YtPnZhbHVlOworCQkJY29udGludWU7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXBuYW1lPXM7CisJCQlwc2VjdGlvbj1OVUxMOworCQkJZW5kPWVhdF9hbHBoYV9udW1lcmljKGNvbmYsIHMpOworCQkJaWYgKChlbmRbMF0gPT0gJzonKSAmJiAoZW5kWzFdID09ICc6JykpCisJCQkJeworCQkJCSplbmQ9J1wwJzsKKwkJCQllbmQrPTI7CisJCQkJcHNlY3Rpb249cG5hbWU7CisJCQkJcG5hbWU9ZW5kOworCQkJCWVuZD1lYXRfYWxwaGFfbnVtZXJpYyhjb25mLCBlbmQpOworCQkJCX0KKwkJCXA9ZWF0X3dzKGNvbmYsIGVuZCk7CisJCQlpZiAoKnAgIT0gJz0nKQorCQkJCXsKKwkJCQlDT05GZXJyKENPTkZfRl9ERUZfTE9BRF9CSU8sCisJCQkJCQlDT05GX1JfTUlTU0lOR19FUVVBTF9TSUdOKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkqZW5kPSdcMCc7CisJCQlwKys7CisJCQlzdGFydD1lYXRfd3MoY29uZiwgcCk7CisJCQl3aGlsZSAoIUlTX0VPRihjb25mLCpwKSkKKwkJCQlwKys7CisJCQlwLS07CisJCQl3aGlsZSAoKHAgIT0gc3RhcnQpICYmIChJU19XUyhjb25mLCpwKSkpCisJCQkJcC0tOworCQkJcCsrOworCQkJKnA9J1wwJzsKKworCQkJaWYgKCEodj0oQ09ORl9WQUxVRSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihDT05GX1ZBTFVFKSkpKQorCQkJCXsKKwkJCQlDT05GZXJyKENPTkZfRl9ERUZfTE9BRF9CSU8sCisJCQkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmIChwc2VjdGlvbiA9PSBOVUxMKSBwc2VjdGlvbj1zZWN0aW9uOworCQkJdi0+bmFtZT0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKHN0cmxlbihwbmFtZSkrMSk7CisJCQl2LT52YWx1ZT1OVUxMOworCQkJaWYgKHYtPm5hbWUgPT0gTlVMTCkKKwkJCQl7CisJCQkJQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLAorCQkJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlCVUZfc3RybGNweSh2LT5uYW1lLHBuYW1lLHN0cmxlbihwbmFtZSkrMSk7CisJCQlpZiAoIXN0cl9jb3B5KGNvbmYscHNlY3Rpb24sJih2LT52YWx1ZSksc3RhcnQpKSBnb3RvIGVycjsKKworCQkJaWYgKHN0cmNtcChwc2VjdGlvbixzZWN0aW9uKSAhPSAwKQorCQkJCXsKKwkJCQlpZiAoKHR2PV9DT05GX2dldF9zZWN0aW9uKGNvbmYscHNlY3Rpb24pKQorCQkJCQk9PSBOVUxMKQorCQkJCQl0dj1fQ09ORl9uZXdfc2VjdGlvbihjb25mLHBzZWN0aW9uKTsKKwkJCQlpZiAodHYgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlDT05GZXJyKENPTkZfRl9ERUZfTE9BRF9CSU8sCisJCQkJCSAgIENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl0cz0oU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKil0di0+dmFsdWU7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQl0dj1zdjsKKwkJCQl0cz1zZWN0aW9uX3NrOworCQkJCX0KKyNpZiAxCisJCQlpZiAoX0NPTkZfYWRkX3N0cmluZyhjb25mLCB0diwgdikgPT0gMCkKKwkJCQl7CisJCQkJQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLAorCQkJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisjZWxzZQorCQkJdi0+c2VjdGlvbj10di0+c2VjdGlvbjsJCisJCQlpZiAoIXNrX0NPTkZfVkFMVUVfcHVzaCh0cyx2KSkKKwkJCQl7CisJCQkJQ09ORmVycihDT05GX0ZfREVGX0xPQURfQklPLAorCQkJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl2dj0oQ09ORl9WQUxVRSAqKWxoX2luc2VydChjb25mLT5kYXRhLHYpOworCQkJaWYgKHZ2ICE9IE5VTEwpCisJCQkJeworCQkJCXNrX0NPTkZfVkFMVUVfZGVsZXRlX3B0cih0cyx2dik7CisJCQkJT1BFTlNTTF9mcmVlKHZ2LT5uYW1lKTsKKwkJCQlPUEVOU1NMX2ZyZWUodnYtPnZhbHVlKTsKKwkJCQlPUEVOU1NMX2ZyZWUodnYpOworCQkJCX0KKyNlbmRpZgorCQkJdj1OVUxMOworCQkJfQorCQl9CisJaWYgKGJ1ZmYgIT0gTlVMTCkgQlVGX01FTV9mcmVlKGJ1ZmYpOworCWlmIChzZWN0aW9uICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzZWN0aW9uKTsKKwlyZXR1cm4oMSk7CitlcnI6CisJaWYgKGJ1ZmYgIT0gTlVMTCkgQlVGX01FTV9mcmVlKGJ1ZmYpOworCWlmIChzZWN0aW9uICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzZWN0aW9uKTsKKwlpZiAobGluZSAhPSBOVUxMKSAqbGluZT1lbGluZTsKKwlCSU9fc25wcmludGYoYnRtcCxzaXplb2YgYnRtcCwiJWxkIixlbGluZSk7CisJRVJSX2FkZF9lcnJvcl9kYXRhKDIsImxpbmUgIixidG1wKTsKKwlpZiAoKGggIT0gY29uZi0+ZGF0YSkgJiYgKGNvbmYtPmRhdGEgIT0gTlVMTCkpCisJCXsKKwkJQ09ORl9mcmVlKGNvbmYtPmRhdGEpOworCQljb25mLT5kYXRhPU5VTEw7CisJCX0KKwlpZiAodiAhPSBOVUxMKQorCQl7CisJCWlmICh2LT5uYW1lICE9IE5VTEwpIE9QRU5TU0xfZnJlZSh2LT5uYW1lKTsKKwkJaWYgKHYtPnZhbHVlICE9IE5VTEwpIE9QRU5TU0xfZnJlZSh2LT52YWx1ZSk7CisJCWlmICh2ICE9IE5VTEwpIE9QRU5TU0xfZnJlZSh2KTsKKwkJfQorCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2NvbW1lbnRzKENPTkYgKmNvbmYsIGNoYXIgKnApCisJeworCWNoYXIgKnRvOworCisJdG89cDsKKwlmb3IgKDs7KQorCQl7CisJCWlmIChJU19GQ09NTUVOVChjb25mLCpwKSkKKwkJCXsKKwkJCSpwPSdcMCc7CisJCQlyZXR1cm47CisJCQl9CisJCWlmICghSVNfV1MoY29uZiwqcCkpCisJCQl7CisJCQlicmVhazsKKwkJCX0KKwkJcCsrOworCQl9CisKKwlmb3IgKDs7KQorCQl7CisJCWlmIChJU19DT01NRU5UKGNvbmYsKnApKQorCQkJeworCQkJKnA9J1wwJzsKKwkJCXJldHVybjsKKwkJCX0KKwkJaWYgKElTX0RRVU9URShjb25mLCpwKSkKKwkJCXsKKwkJCXA9c2Nhbl9kcXVvdGUoY29uZiwgcCk7CisJCQljb250aW51ZTsKKwkJCX0KKwkJaWYgKElTX1FVT1RFKGNvbmYsKnApKQorCQkJeworCQkJcD1zY2FuX3F1b3RlKGNvbmYsIHApOworCQkJY29udGludWU7CisJCQl9CisJCWlmIChJU19FU0MoY29uZiwqcCkpCisJCQl7CisJCQlwPXNjYW5fZXNjKGNvbmYscCk7CisJCQljb250aW51ZTsKKwkJCX0KKwkJaWYgKElTX0VPRihjb25mLCpwKSkKKwkJCXJldHVybjsKKwkJZWxzZQorCQkJcCsrOworCQl9CisJfQorCitzdGF0aWMgaW50IHN0cl9jb3B5KENPTkYgKmNvbmYsIGNoYXIgKnNlY3Rpb24sIGNoYXIgKipwdG8sIGNoYXIgKmZyb20pCisJeworCWludCBxLHIscnI9MCx0bz0wLGxlbj0wOworCWNoYXIgKnMsKmUsKnJwLCpwLCpycnAsKm5wLCpjcCx2OworCUJVRl9NRU0gKmJ1ZjsKKworCWlmICgoYnVmPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpIHJldHVybigwKTsKKworCWxlbj1zdHJsZW4oZnJvbSkrMTsKKwlpZiAoIUJVRl9NRU1fZ3JvdyhidWYsbGVuKSkgZ290byBlcnI7CisKKwlmb3IgKDs7KQorCQl7CisJCWlmIChJU19RVU9URShjb25mLCpmcm9tKSkKKwkJCXsKKwkJCXE9ICpmcm9tOworCQkJZnJvbSsrOworCQkJd2hpbGUgKCFJU19FT0YoY29uZiwqZnJvbSkgJiYgKCpmcm9tICE9IHEpKQorCQkJCXsKKwkJCQlpZiAoSVNfRVNDKGNvbmYsKmZyb20pKQorCQkJCQl7CisJCQkJCWZyb20rKzsKKwkJCQkJaWYgKElTX0VPRihjb25mLCpmcm9tKSkgYnJlYWs7CisJCQkJCX0KKwkJCQlidWYtPmRhdGFbdG8rK109ICooZnJvbSsrKTsKKwkJCQl9CisJCQlpZiAoKmZyb20gPT0gcSkgZnJvbSsrOworCQkJfQorCQllbHNlIGlmIChJU19EUVVPVEUoY29uZiwqZnJvbSkpCisJCQl7CisJCQlxPSAqZnJvbTsKKwkJCWZyb20rKzsKKwkJCXdoaWxlICghSVNfRU9GKGNvbmYsKmZyb20pKQorCQkJCXsKKwkJCQlpZiAoKmZyb20gPT0gcSkKKwkJCQkJeworCQkJCQlpZiAoKihmcm9tKzEpID09IHEpCisJCQkJCQl7CisJCQkJCQlmcm9tKys7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJYnVmLT5kYXRhW3RvKytdPSAqKGZyb20rKyk7CisJCQkJfQorCQkJaWYgKCpmcm9tID09IHEpIGZyb20rKzsKKwkJCX0KKwkJZWxzZSBpZiAoSVNfRVNDKGNvbmYsKmZyb20pKQorCQkJeworCQkJZnJvbSsrOworCQkJdj0gKihmcm9tKyspOworCQkJaWYgKElTX0VPRihjb25mLHYpKSBicmVhazsKKwkJCWVsc2UgaWYgKHYgPT0gJ3InKSB2PSdccic7CisJCQllbHNlIGlmICh2ID09ICduJykgdj0nXG4nOworCQkJZWxzZSBpZiAodiA9PSAnYicpIHY9J1xiJzsKKwkJCWVsc2UgaWYgKHYgPT0gJ3QnKSB2PSdcdCc7CisJCQlidWYtPmRhdGFbdG8rK109IHY7CisJCQl9CisJCWVsc2UgaWYgKElTX0VPRihjb25mLCpmcm9tKSkKKwkJCWJyZWFrOworCQllbHNlIGlmICgqZnJvbSA9PSAnJCcpCisJCQl7CisJCQkvKiB0cnkgdG8gZXhwYW5kIGl0ICovCisJCQlycnA9TlVMTDsKKwkJCXM9ICYoZnJvbVsxXSk7CisJCQlpZiAoKnMgPT0gJ3snKQorCQkJCXE9J30nOworCQkJZWxzZSBpZiAoKnMgPT0gJygnKQorCQkJCXE9JyknOworCQkJZWxzZSBxPTA7CisKKwkJCWlmIChxKSBzKys7CisJCQljcD1zZWN0aW9uOworCQkJZT1ucD1zOworCQkJd2hpbGUgKElTX0FMUEhBX05VTUVSSUMoY29uZiwqZSkpCisJCQkJZSsrOworCQkJaWYgKChlWzBdID09ICc6JykgJiYgKGVbMV0gPT0gJzonKSkKKwkJCQl7CisJCQkJY3A9bnA7CisJCQkJcnJwPWU7CisJCQkJcnI9ICplOworCQkJCSpycnA9J1wwJzsKKwkJCQllKz0yOworCQkJCW5wPWU7CisJCQkJd2hpbGUgKElTX0FMUEhBX05VTUVSSUMoY29uZiwqZSkpCisJCQkJCWUrKzsKKwkJCQl9CisJCQlyPSAqZTsKKwkJCSplPSdcMCc7CisJCQlycD1lOworCQkJaWYgKHEpCisJCQkJeworCQkJCWlmIChyICE9IHEpCisJCQkJCXsKKwkJCQkJQ09ORmVycihDT05GX0ZfU1RSX0NPUFksQ09ORl9SX05PX0NMT1NFX0JSQUNFKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQllKys7CisJCQkJfQorCQkJLyogU28gYXQgdGhpcyBwb2ludCB3ZSBoYXZlCisJCQkgKiBucCB3aGljaCBpcyB0aGUgc3RhcnQgb2YgdGhlIG5hbWUgc3RyaW5nIHdoaWNoIGlzCisJCQkgKiAgICdcMCcgdGVybWluYXRlZC4gCisJCQkgKiBjcCB3aGljaCBpcyB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gc3RyaW5nIHdoaWNoIGlzCisJCQkgKiAgICdcMCcgdGVybWluYXRlZC4KKwkJCSAqIGUgaXMgdGhlICduZXh0IHBvaW50IGFmdGVyJy4KKwkJCSAqIHIgYW5kIHJyIGFyZSB0aGUgY2hhcnMgcmVwbGFjZWQgYnkgdGhlICdcMCcKKwkJCSAqIHJwIGFuZCBycnAgaXMgd2hlcmUgJ3InIGFuZCAncnInIGNhbWUgZnJvbS4KKwkJCSAqLworCQkJcD1fQ09ORl9nZXRfc3RyaW5nKGNvbmYsY3AsbnApOworCQkJaWYgKHJycCAhPSBOVUxMKSAqcnJwPXJyOworCQkJKnJwPXI7CisJCQlpZiAocCA9PSBOVUxMKQorCQkJCXsKKwkJCQlDT05GZXJyKENPTkZfRl9TVFJfQ09QWSxDT05GX1JfVkFSSUFCTEVfSEFTX05PX1ZBTFVFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLChzdHJsZW4ocCkrYnVmLT5sZW5ndGgtKGUtZnJvbSkpKTsKKwkJCXdoaWxlICgqcCkKKwkJCQlidWYtPmRhdGFbdG8rK109ICoocCsrKTsKKworCQkJLyogU2luY2Ugd2UgY2hhbmdlIHRoZSBwb2ludGVyICdmcm9tJywgd2UgYWxzbyBoYXZlCisJCQkgICB0byBjaGFuZ2UgdGhlIHBlcmNlaXZlZCBsZW5ndGggb2YgdGhlIHN0cmluZyBpdAorCQkJICAgcG9pbnRzIGF0LiAgL1JMICovCisJCQlsZW4gLT0gZS1mcm9tOworCQkJZnJvbT1lOworCisJCQkvKiBJbiBjYXNlIHRoZXJlIHdlcmUgbm8gYnJhY2VzIG9yIHBhcmVudGhlc2lzIGFyb3VuZAorCQkJICAgdGhlIHZhcmlhYmxlIHJlZmVyZW5jZSwgd2UgaGF2ZSB0byBwdXQgYmFjayB0aGUKKwkJCSAgIGNoYXJhY3RlciB0aGF0IHdhcyByZXBsYWNlZCB3aXRoIGEgJ1wwJy4gIC9STCAqLworCQkJKnJwID0gcjsKKwkJCX0KKwkJZWxzZQorCQkJYnVmLT5kYXRhW3RvKytdPSAqKGZyb20rKyk7CisJCX0KKwlidWYtPmRhdGFbdG9dPSdcMCc7CisJaWYgKCpwdG8gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKCpwdG8pOworCSpwdG89YnVmLT5kYXRhOworCU9QRU5TU0xfZnJlZShidWYpOworCXJldHVybigxKTsKK2VycjoKKwlpZiAoYnVmICE9IE5VTEwpIEJVRl9NRU1fZnJlZShidWYpOworCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyBjaGFyICplYXRfd3MoQ09ORiAqY29uZiwgY2hhciAqcCkKKwl7CisJd2hpbGUgKElTX1dTKGNvbmYsKnApICYmICghSVNfRU9GKGNvbmYsKnApKSkKKwkJcCsrOworCXJldHVybihwKTsKKwl9CisKK3N0YXRpYyBjaGFyICplYXRfYWxwaGFfbnVtZXJpYyhDT05GICpjb25mLCBjaGFyICpwKQorCXsKKwlmb3IgKDs7KQorCQl7CisJCWlmIChJU19FU0MoY29uZiwqcCkpCisJCQl7CisJCQlwPXNjYW5fZXNjKGNvbmYscCk7CisJCQljb250aW51ZTsKKwkJCX0KKwkJaWYgKCFJU19BTFBIQV9OVU1FUklDX1BVTkNUKGNvbmYsKnApKQorCQkJcmV0dXJuKHApOworCQlwKys7CisJCX0KKwl9CisKK3N0YXRpYyBjaGFyICpzY2FuX3F1b3RlKENPTkYgKmNvbmYsIGNoYXIgKnApCisJeworCWludCBxPSAqcDsKKworCXArKzsKKwl3aGlsZSAoIShJU19FT0YoY29uZiwqcCkpICYmICgqcCAhPSBxKSkKKwkJeworCQlpZiAoSVNfRVNDKGNvbmYsKnApKQorCQkJeworCQkJcCsrOworCQkJaWYgKElTX0VPRihjb25mLCpwKSkgcmV0dXJuKHApOworCQkJfQorCQlwKys7CisJCX0KKwlpZiAoKnAgPT0gcSkgcCsrOworCXJldHVybihwKTsKKwl9CisKKworc3RhdGljIGNoYXIgKnNjYW5fZHF1b3RlKENPTkYgKmNvbmYsIGNoYXIgKnApCisJeworCWludCBxPSAqcDsKKworCXArKzsKKwl3aGlsZSAoIShJU19FT0YoY29uZiwqcCkpKQorCQl7CisJCWlmICgqcCA9PSBxKQorCQkJeworCQkJaWYgKCoocCsxKSA9PSBxKQorCQkJCXsKKwkJCQlwKys7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCXArKzsKKwkJfQorCWlmICgqcCA9PSBxKSBwKys7CisJcmV0dXJuKHApOworCX0KKworc3RhdGljIHZvaWQgZHVtcF92YWx1ZV9kb2FsbF9hcmcoQ09ORl9WQUxVRSAqYSwgQklPICpvdXQpCisJeworCWlmIChhLT5uYW1lKQorCQlCSU9fcHJpbnRmKG91dCwgIlslc10gJXM9JXNcbiIsIGEtPnNlY3Rpb24sIGEtPm5hbWUsIGEtPnZhbHVlKTsKKwllbHNlCisJCUJJT19wcmludGYob3V0LCAiW1slc11dXG4iLCBhLT5zZWN0aW9uKTsKKwl9CisKK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfRE9BTExfQVJHX0ZOKGR1bXBfdmFsdWUsIENPTkZfVkFMVUUsIEJJTykKKworc3RhdGljIGludCBkZWZfZHVtcChjb25zdCBDT05GICpjb25mLCBCSU8gKm91dCkKKwl7CisJbGhfQ09ORl9WQUxVRV9kb2FsbF9hcmcoY29uZi0+ZGF0YSwgTEhBU0hfRE9BTExfQVJHX0ZOKGR1bXBfdmFsdWUpLAorCQkJCUJJTywgb3V0KTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZGVmX2lzX251bWJlcihjb25zdCBDT05GICpjb25mLCBjaGFyIGMpCisJeworCXJldHVybiBJU19OVU1CRVIoY29uZixjKTsKKwl9CisKK3N0YXRpYyBpbnQgZGVmX3RvX2ludChjb25zdCBDT05GICpjb25mLCBjaGFyIGMpCisJeworCXJldHVybiBjIC0gJzAnOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9kZWYuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfZGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhN2Q4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfZGVmLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qIGNyeXB0by9jb25mL2NvbmZfZGVmLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogVEhJUyBGSUxFIFdBUyBBVVRPTUFHSUNBTExZIEdFTkVSQVRFRCEKKyAgIFBsZWFzZSBtb2RpZnkgYW5kIHVzZSBrZXlzZXRzLnBsIHRvIHJlZ2VuZXJhdGUgaXQuICovCisKKyNkZWZpbmUgQ09ORl9OVU1CRVIJCTEKKyNkZWZpbmUgQ09ORl9VUFBFUgkJMgorI2RlZmluZSBDT05GX0xPV0VSCQk0CisjZGVmaW5lIENPTkZfVU5ERVIJCTI1NgorI2RlZmluZSBDT05GX1BVTkNUVUFUSU9OCTUxMgorI2RlZmluZSBDT05GX1dTCQkJMTYKKyNkZWZpbmUgQ09ORl9FU0MJCTMyCisjZGVmaW5lIENPTkZfUVVPVEUJCTY0CisjZGVmaW5lIENPTkZfRFFVT1RFCQkxMDI0CisjZGVmaW5lIENPTkZfQ09NTUVOVAkJMTI4CisjZGVmaW5lIENPTkZfRkNPTU1FTlQJCTIwNDgKKyNkZWZpbmUgQ09ORl9FT0YJCTgKKyNkZWZpbmUgQ09ORl9ISUdIQklUCQk0MDk2CisjZGVmaW5lIENPTkZfQUxQSEEJCShDT05GX1VQUEVSfENPTkZfTE9XRVIpCisjZGVmaW5lIENPTkZfQUxQSEFfTlVNRVJJQwkoQ09ORl9BTFBIQXxDT05GX05VTUJFUnxDT05GX1VOREVSKQorI2RlZmluZSBDT05GX0FMUEhBX05VTUVSSUNfUFVOQ1QgKENPTkZfQUxQSEF8Q09ORl9OVU1CRVJ8Q09ORl9VTkRFUnwgXAorCQkJCQlDT05GX1BVTkNUVUFUSU9OKQorCisjZGVmaW5lIEtFWVRZUEVTKGMpCQkoKHVuc2lnbmVkIHNob3J0ICopKChjKS0+bWV0aF9kYXRhKSkKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKyNkZWZpbmUgSVNfQ09NTUVOVChjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfQ09NTUVOVCkKKyNkZWZpbmUgSVNfRkNPTU1FTlQoYyxhKQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfRkNPTU1FTlQpCisjZGVmaW5lIElTX0VPRihjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfRU9GKQorI2RlZmluZSBJU19FU0MoYyxhKQkJKEtFWVRZUEVTKGMpWyhhKSYweGZmXSZDT05GX0VTQykKKyNkZWZpbmUgSVNfTlVNQkVSKGMsYSkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9OVU1CRVIpCisjZGVmaW5lIElTX1dTKGMsYSkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9XUykKKyNkZWZpbmUgSVNfQUxQSEFfTlVNRVJJQyhjLGEpCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9BTFBIQV9OVU1FUklDKQorI2RlZmluZSBJU19BTFBIQV9OVU1FUklDX1BVTkNUKGMsYSkgXAorCQkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9BTFBIQV9OVU1FUklDX1BVTkNUKQorI2RlZmluZSBJU19RVU9URShjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfUVVPVEUpCisjZGVmaW5lIElTX0RRVU9URShjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfRFFVT1RFKQorI2RlZmluZSBJU19ISUdIQklUKGMsYSkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9ISUdIQklUKQorCisjZWxzZSAvKkNIQVJTRVRfRUJDRElDKi8KKworI2RlZmluZSBJU19DT01NRU5UKGMsYSkJCShLRVlUWVBFUyhjKVtvc190b2FzY2lpW2FdJjB4ZmZdJkNPTkZfQ09NTUVOVCkKKyNkZWZpbmUgSVNfRkNPTU1FTlQoYyxhKQkoS0VZVFlQRVMoYylbb3NfdG9hc2NpaVthXSYweGZmXSZDT05GX0ZDT01NRU5UKQorI2RlZmluZSBJU19FT0YoYyxhKQkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9FT0YpCisjZGVmaW5lIElTX0VTQyhjLGEpCQkoS0VZVFlQRVMoYylbb3NfdG9hc2NpaVthXSYweGZmXSZDT05GX0VTQykKKyNkZWZpbmUgSVNfTlVNQkVSKGMsYSkJCShLRVlUWVBFUyhjKVtvc190b2FzY2lpW2FdJjB4ZmZdJkNPTkZfTlVNQkVSKQorI2RlZmluZSBJU19XUyhjLGEpCQkoS0VZVFlQRVMoYylbb3NfdG9hc2NpaVthXSYweGZmXSZDT05GX1dTKQorI2RlZmluZSBJU19BTFBIQV9OVU1FUklDKGMsYSkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9BTFBIQV9OVU1FUklDKQorI2RlZmluZSBJU19BTFBIQV9OVU1FUklDX1BVTkNUKGMsYSkgXAorCQkJCShLRVlUWVBFUyhjKVtvc190b2FzY2lpW2FdJjB4ZmZdJkNPTkZfQUxQSEFfTlVNRVJJQ19QVU5DVCkKKyNkZWZpbmUgSVNfUVVPVEUoYyxhKQkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9RVU9URSkKKyNkZWZpbmUgSVNfRFFVT1RFKGMsYSkJCShLRVlUWVBFUyhjKVtvc190b2FzY2lpW2FdJjB4ZmZdJkNPTkZfRFFVT1RFKQorI2RlZmluZSBJU19ISUdIQklUKGMsYSkJCShLRVlUWVBFUyhjKVtvc190b2FzY2lpW2FdJjB4ZmZdJkNPTkZfSElHSEJJVCkKKyNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IENPTkZfdHlwZV9kZWZhdWx0WzI1Nl09eworCTB4MDAwOCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsCisJMHgwMDAwLDB4MDAxMCwweDAwMTAsMHgwMDAwLDB4MDAwMCwweDAwMTAsMHgwMDAwLDB4MDAwMCwKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLAorCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsCisJMHgwMDEwLDB4MDIwMCwweDAwNDAsMHgwMDgwLDB4MDAwMCwweDAyMDAsMHgwMjAwLDB4MDA0MCwKKwkweDAwMDAsMHgwMDAwLDB4MDIwMCwweDAyMDAsMHgwMjAwLDB4MDIwMCwweDAyMDAsMHgwMjAwLAorCTB4MDAwMSwweDAwMDEsMHgwMDAxLDB4MDAwMSwweDAwMDEsMHgwMDAxLDB4MDAwMSwweDAwMDEsCisJMHgwMDAxLDB4MDAwMSwweDAwMDAsMHgwMjAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDIwMCwKKwkweDAyMDAsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLAorCTB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsCisJMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwKKwkweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDAsMHgwMDIwLDB4MDAwMCwweDAyMDAsMHgwMTAwLAorCTB4MDA0MCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsCisJMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwKKwkweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LAorCTB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwMCwweDAyMDAsMHgwMDAwLDB4MDIwMCwweDAwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwl9OworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgQ09ORl90eXBlX3dpbjMyWzI1Nl09eworCTB4MDAwOCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsCisJMHgwMDAwLDB4MDAxMCwweDAwMTAsMHgwMDAwLDB4MDAwMCwweDAwMTAsMHgwMDAwLDB4MDAwMCwKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLAorCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsCisJMHgwMDEwLDB4MDIwMCwweDA0MDAsMHgwMDAwLDB4MDAwMCwweDAyMDAsMHgwMjAwLDB4MDAwMCwKKwkweDAwMDAsMHgwMDAwLDB4MDIwMCwweDAyMDAsMHgwMjAwLDB4MDIwMCwweDAyMDAsMHgwMjAwLAorCTB4MDAwMSwweDAwMDEsMHgwMDAxLDB4MDAwMSwweDAwMDEsMHgwMDAxLDB4MDAwMSwweDAwMDEsCisJMHgwMDAxLDB4MDAwMSwweDAwMDAsMHgwQTAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDIwMCwKKwkweDAyMDAsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLAorCTB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsCisJMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDIsMHgwMDAyLDB4MDAwMiwKKwkweDAwMDIsMHgwMDAyLDB4MDAwMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAyMDAsMHgwMTAwLAorCTB4MDAwMCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsCisJMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwKKwkweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwNCwweDAwMDQsMHgwMDA0LAorCTB4MDAwNCwweDAwMDQsMHgwMDA0LDB4MDAwMCwweDAyMDAsMHgwMDAwLDB4MDIwMCwweDAwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwkweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLAorCTB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsCisJMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwweDEwMDAsMHgxMDAwLDB4MTAwMCwKKwl9OworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9jb25mX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWJiNWRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9lcnIuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogY3J5cHRvL2NvbmYvY29uZl9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworI2RlZmluZSBFUlJfRlVOQyhmdW5jKSBFUlJfUEFDSyhFUlJfTElCX0NPTkYsZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9DT05GLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIENPTkZfc3RyX2Z1bmN0c1tdPQorCXsKK3tFUlJfRlVOQyhDT05GX0ZfQ09ORl9EVU1QX0ZQKSwJIkNPTkZfZHVtcF9mcCJ9LAore0VSUl9GVU5DKENPTkZfRl9DT05GX0xPQUQpLAkiQ09ORl9sb2FkIn0sCit7RVJSX0ZVTkMoQ09ORl9GX0NPTkZfTE9BRF9CSU8pLAkiQ09ORl9sb2FkX2JpbyJ9LAore0VSUl9GVU5DKENPTkZfRl9DT05GX0xPQURfRlApLAkiQ09ORl9sb2FkX2ZwIn0sCit7RVJSX0ZVTkMoQ09ORl9GX0NPTkZfTU9EVUxFU19MT0FEKSwJIkNPTkZfbW9kdWxlc19sb2FkIn0sCit7RVJSX0ZVTkMoQ09ORl9GX0NPTkZfUEFSU0VfTElTVCksCSJDT05GX3BhcnNlX2xpc3QifSwKK3tFUlJfRlVOQyhDT05GX0ZfREVGX0xPQUQpLAkiREVGX0xPQUQifSwKK3tFUlJfRlVOQyhDT05GX0ZfREVGX0xPQURfQklPKSwJIkRFRl9MT0FEX0JJTyJ9LAore0VSUl9GVU5DKENPTkZfRl9NT0RVTEVfSU5JVCksCSJNT0RVTEVfSU5JVCJ9LAore0VSUl9GVU5DKENPTkZfRl9NT0RVTEVfTE9BRF9EU08pLAkiTU9EVUxFX0xPQURfRFNPIn0sCit7RVJSX0ZVTkMoQ09ORl9GX01PRFVMRV9SVU4pLAkiTU9EVUxFX1JVTiJ9LAore0VSUl9GVU5DKENPTkZfRl9OQ09ORl9EVU1QX0JJTyksCSJOQ09ORl9kdW1wX2JpbyJ9LAore0VSUl9GVU5DKENPTkZfRl9OQ09ORl9EVU1QX0ZQKSwJIk5DT05GX2R1bXBfZnAifSwKK3tFUlJfRlVOQyhDT05GX0ZfTkNPTkZfR0VUX05VTUJFUiksCSJOQ09ORl9nZXRfbnVtYmVyIn0sCit7RVJSX0ZVTkMoQ09ORl9GX05DT05GX0dFVF9OVU1CRVJfRSksCSJOQ09ORl9nZXRfbnVtYmVyX2UifSwKK3tFUlJfRlVOQyhDT05GX0ZfTkNPTkZfR0VUX1NFQ1RJT04pLAkiTkNPTkZfZ2V0X3NlY3Rpb24ifSwKK3tFUlJfRlVOQyhDT05GX0ZfTkNPTkZfR0VUX1NUUklORyksCSJOQ09ORl9nZXRfc3RyaW5nIn0sCit7RVJSX0ZVTkMoQ09ORl9GX05DT05GX0xPQUQpLAkiTkNPTkZfbG9hZCJ9LAore0VSUl9GVU5DKENPTkZfRl9OQ09ORl9MT0FEX0JJTyksCSJOQ09ORl9sb2FkX2JpbyJ9LAore0VSUl9GVU5DKENPTkZfRl9OQ09ORl9MT0FEX0ZQKSwJIk5DT05GX2xvYWRfZnAifSwKK3tFUlJfRlVOQyhDT05GX0ZfTkNPTkZfTkVXKSwJIk5DT05GX25ldyJ9LAore0VSUl9GVU5DKENPTkZfRl9TVFJfQ09QWSksCSJTVFJfQ09QWSJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIENPTkZfc3RyX3JlYXNvbnNbXT0KKwl7Cit7RVJSX1JFQVNPTihDT05GX1JfRVJST1JfTE9BRElOR19EU08pICAgICwiZXJyb3IgbG9hZGluZyBkc28ifSwKK3tFUlJfUkVBU09OKENPTkZfUl9MSVNUX0NBTk5PVF9CRV9OVUxMKSAgLCJsaXN0IGNhbm5vdCBiZSBudWxsIn0sCit7RVJSX1JFQVNPTihDT05GX1JfTUlTU0lOR19DTE9TRV9TUVVBUkVfQlJBQ0tFVCksIm1pc3NpbmcgY2xvc2Ugc3F1YXJlIGJyYWNrZXQifSwKK3tFUlJfUkVBU09OKENPTkZfUl9NSVNTSU5HX0VRVUFMX1NJR04pICAgLCJtaXNzaW5nIGVxdWFsIHNpZ24ifSwKK3tFUlJfUkVBU09OKENPTkZfUl9NSVNTSU5HX0ZJTklTSF9GVU5DVElPTiksIm1pc3NpbmcgZmluaXNoIGZ1bmN0aW9uIn0sCit7RVJSX1JFQVNPTihDT05GX1JfTUlTU0lOR19JTklUX0ZVTkNUSU9OKSwibWlzc2luZyBpbml0IGZ1bmN0aW9uIn0sCit7RVJSX1JFQVNPTihDT05GX1JfTU9EVUxFX0lOSVRJQUxJWkFUSU9OX0VSUk9SKSwibW9kdWxlIGluaXRpYWxpemF0aW9uIGVycm9yIn0sCit7RVJSX1JFQVNPTihDT05GX1JfTk9fQ0xPU0VfQlJBQ0UpICAgICAgICwibm8gY2xvc2UgYnJhY2UifSwKK3tFUlJfUkVBU09OKENPTkZfUl9OT19DT05GKSAgICAgICAgICAgICAgLCJubyBjb25mIn0sCit7RVJSX1JFQVNPTihDT05GX1JfTk9fQ09ORl9PUl9FTlZJUk9OTUVOVF9WQVJJQUJMRSksIm5vIGNvbmYgb3IgZW52aXJvbm1lbnQgdmFyaWFibGUifSwKK3tFUlJfUkVBU09OKENPTkZfUl9OT19TRUNUSU9OKSAgICAgICAgICAgLCJubyBzZWN0aW9uIn0sCit7RVJSX1JFQVNPTihDT05GX1JfTk9fU1VDSF9GSUxFKSAgICAgICAgICwibm8gc3VjaCBmaWxlIn0sCit7RVJSX1JFQVNPTihDT05GX1JfTk9fVkFMVUUpICAgICAgICAgICAgICwibm8gdmFsdWUifSwKK3tFUlJfUkVBU09OKENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OKSwidW5hYmxlIHRvIGNyZWF0ZSBuZXcgc2VjdGlvbiJ9LAore0VSUl9SRUFTT04oQ09ORl9SX1VOS05PV05fTU9EVUxFX05BTUUpICAsInVua25vd24gbW9kdWxlIG5hbWUifSwKK3tFUlJfUkVBU09OKENPTkZfUl9WQVJJQUJMRV9IQVNfTk9fVkFMVUUpLCJ2YXJpYWJsZSBoYXMgbm8gdmFsdWUifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfQ09ORl9zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhDT05GX3N0cl9mdW5jdHNbMF0uZXJyb3IpID09IE5VTEwpCisJCXsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLENPTkZfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxDT05GX3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwNDZkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfbGliLmMKQEAgLTAsMCArMSw0MDcgQEAKKy8qIGNvbmZfbGliLmMgKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mX2FwaS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKworY29uc3QgY2hhciBDT05GX3ZlcnNpb25bXT0iQ09ORiIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCitzdGF0aWMgQ09ORl9NRVRIT0QgKmRlZmF1bHRfQ09ORl9tZXRob2Q9TlVMTDsKKworLyogSW5pdCBhICdDT05GJyBzdHJ1Y3R1cmUgZnJvbSBhbiBvbGQgTEhBU0ggKi8KKwordm9pZCBDT05GX3NldF9uY29uZihDT05GICpjb25mLCBMSEFTSF9PRihDT05GX1ZBTFVFKSAqaGFzaCkKKwl7CisJaWYgKGRlZmF1bHRfQ09ORl9tZXRob2QgPT0gTlVMTCkKKwkJZGVmYXVsdF9DT05GX21ldGhvZCA9IE5DT05GX2RlZmF1bHQoKTsKKworCWRlZmF1bHRfQ09ORl9tZXRob2QtPmluaXQoY29uZik7CisJY29uZi0+ZGF0YSA9IGhhc2g7CisJfQorCisvKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gY29udGFpbnMgdGhlICJDT05GIGNsYXNzaWMiIGZ1bmN0aW9ucywKKyAgIHJld3JpdHRlbiBpbiB0ZXJtcyBvZiB0aGUgbmV3IENPTkYgaW50ZXJmYWNlLiAqLworCitpbnQgQ09ORl9zZXRfZGVmYXVsdF9tZXRob2QoQ09ORl9NRVRIT0QgKm1ldGgpCisJeworCWRlZmF1bHRfQ09ORl9tZXRob2QgPSBtZXRoOworCXJldHVybiAxOworCX0KKworTEhBU0hfT0YoQ09ORl9WQUxVRSkgKkNPTkZfbG9hZChMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgY29uc3QgY2hhciAqZmlsZSwKKwkJCQlsb25nICplbGluZSkKKwl7CisJTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmx0bXA7CisJQklPICppbj1OVUxMOworCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJaW49QklPX25ld19maWxlKGZpbGUsICJyIik7CisjZWxzZQorCWluPUJJT19uZXdfZmlsZShmaWxlLCAicmIiKTsKKyNlbmRpZgorCWlmIChpbiA9PSBOVUxMKQorCQl7CisJCUNPTkZlcnIoQ09ORl9GX0NPTkZfTE9BRCxFUlJfUl9TWVNfTElCKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCWx0bXAgPSBDT05GX2xvYWRfYmlvKGNvbmYsIGluLCBlbGluZSk7CisJQklPX2ZyZWUoaW4pOworCisJcmV0dXJuIGx0bXA7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitMSEFTSF9PRihDT05GX1ZBTFVFKSAqQ09ORl9sb2FkX2ZwKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBGSUxFICpmcCwKKwkJCQkgICBsb25nICplbGluZSkKKwl7CisJQklPICpidG1wOworCUxIQVNIX09GKENPTkZfVkFMVUUpICpsdG1wOworCWlmKCEoYnRtcCA9IEJJT19uZXdfZnAoZnAsIEJJT19OT0NMT1NFKSkpIHsKKwkJQ09ORmVycihDT05GX0ZfQ09ORl9MT0FEX0ZQLEVSUl9SX0JVRl9MSUIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbHRtcCA9IENPTkZfbG9hZF9iaW8oY29uZiwgYnRtcCwgZWxpbmUpOworCUJJT19mcmVlKGJ0bXApOworCXJldHVybiBsdG1wOworCX0KKyNlbmRpZgorCitMSEFTSF9PRihDT05GX1ZBTFVFKSAqQ09ORl9sb2FkX2JpbyhMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgQklPICpicCwKKwkJCQkgICAgbG9uZyAqZWxpbmUpCisJeworCUNPTkYgY3RtcDsKKwlpbnQgcmV0OworCisJQ09ORl9zZXRfbmNvbmYoJmN0bXAsIGNvbmYpOworCisJcmV0ID0gTkNPTkZfbG9hZF9iaW8oJmN0bXAsIGJwLCBlbGluZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIGN0bXAuZGF0YTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKK1NUQUNLX09GKENPTkZfVkFMVUUpICpDT05GX2dldF9zZWN0aW9uKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uKQorCXsKKwlpZiAoY29uZiA9PSBOVUxMKQorCQl7CisJCXJldHVybiBOVUxMOworCQl9CisJZWxzZQorCQl7CisJCUNPTkYgY3RtcDsKKwkJQ09ORl9zZXRfbmNvbmYoJmN0bXAsIGNvbmYpOworCQlyZXR1cm4gTkNPTkZfZ2V0X3NlY3Rpb24oJmN0bXAsIHNlY3Rpb24pOworCQl9CisJfQorCitjaGFyICpDT05GX2dldF9zdHJpbmcoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsY29uc3QgY2hhciAqZ3JvdXAsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCisJeworCWlmIChjb25mID09IE5VTEwpCisJCXsKKwkJcmV0dXJuIE5DT05GX2dldF9zdHJpbmcoTlVMTCwgZ3JvdXAsIG5hbWUpOworCQl9CisJZWxzZQorCQl7CisJCUNPTkYgY3RtcDsKKwkJQ09ORl9zZXRfbmNvbmYoJmN0bXAsIGNvbmYpOworCQlyZXR1cm4gTkNPTkZfZ2V0X3N0cmluZygmY3RtcCwgZ3JvdXAsIG5hbWUpOworCQl9CisJfQorCitsb25nIENPTkZfZ2V0X251bWJlcihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZixjb25zdCBjaGFyICpncm91cCwKKwkJICAgICBjb25zdCBjaGFyICpuYW1lKQorCXsKKwlpbnQgc3RhdHVzOworCWxvbmcgcmVzdWx0ID0gMDsKKworCWlmIChjb25mID09IE5VTEwpCisJCXsKKwkJc3RhdHVzID0gTkNPTkZfZ2V0X251bWJlcl9lKE5VTEwsIGdyb3VwLCBuYW1lLCAmcmVzdWx0KTsKKwkJfQorCWVsc2UKKwkJeworCQlDT05GIGN0bXA7CisJCUNPTkZfc2V0X25jb25mKCZjdG1wLCBjb25mKTsKKwkJc3RhdHVzID0gTkNPTkZfZ2V0X251bWJlcl9lKCZjdG1wLCBncm91cCwgbmFtZSwgJnJlc3VsdCk7CisJCX0KKworCWlmIChzdGF0dXMgPT0gMCkKKwkJeworCQkvKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGJlbGlldmUgaW4gZXJyb3JzLi4uICovCisJCUVSUl9jbGVhcl9lcnJvcigpOworCQl9CisJcmV0dXJuIHJlc3VsdDsKKwl9CisKK3ZvaWQgQ09ORl9mcmVlKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mKQorCXsKKwlDT05GIGN0bXA7CisJQ09ORl9zZXRfbmNvbmYoJmN0bXAsIGNvbmYpOworCU5DT05GX2ZyZWVfZGF0YSgmY3RtcCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgQ09ORl9kdW1wX2ZwKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBGSUxFICpvdXQpCisJeworCUJJTyAqYnRtcDsKKwlpbnQgcmV0OworCisJaWYoIShidG1wID0gQklPX25ld19mcChvdXQsIEJJT19OT0NMT1NFKSkpIHsKKwkJQ09ORmVycihDT05GX0ZfQ09ORl9EVU1QX0ZQLEVSUl9SX0JVRl9MSUIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0ID0gQ09ORl9kdW1wX2Jpbyhjb25mLCBidG1wKTsKKwlCSU9fZnJlZShidG1wKTsKKwlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCitpbnQgQ09ORl9kdW1wX2JpbyhMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgQklPICpvdXQpCisJeworCUNPTkYgY3RtcDsKKwlDT05GX3NldF9uY29uZigmY3RtcCwgY29uZik7CisJcmV0dXJuIE5DT05GX2R1bXBfYmlvKCZjdG1wLCBvdXQpOworCX0KKworLyogVGhlIGZvbGxvd2luZyBzZWN0aW9uIGNvbnRhaW5zIHRoZSAiTmV3IENPTkYiIGZ1bmN0aW9ucy4gIFRoZXkgYXJlCisgICBjb21wbGV0ZWx5IGNlbnRyYWxpc2VkIGFyb3VuZCBhIG5ldyBDT05GIHN0cnVjdHVyZSB0aGF0IG1heSBjb250YWluCisgICBiYXNpY2FsbHkgYW55dGhpbmcsIGJ1dCBhdCBsZWFzdCBhIG1ldGhvZCBwb2ludGVyIGFuZCBhIHRhYmxlIG9mIGRhdGEuCisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGFsc28gd3JpdHRlbiBpbiB0ZXJtcyBvZiB0aGUgYnJpZGdlIGZ1bmN0aW9ucyB1c2VkCisgICBieSB0aGUgIkNPTkYgY2xhc3NpYyIgZnVuY3Rpb25zLCBmb3IgY29uc2lzdGVuY3kuICAqLworCitDT05GICpOQ09ORl9uZXcoQ09ORl9NRVRIT0QgKm1ldGgpCisJeworCUNPTkYgKnJldDsKKworCWlmIChtZXRoID09IE5VTEwpCisJCW1ldGggPSBOQ09ORl9kZWZhdWx0KCk7CisKKwlyZXQgPSBtZXRoLT5jcmVhdGUobWV0aCk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCUNPTkZlcnIoQ09ORl9GX05DT05GX05FVyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCisJcmV0dXJuIHJldDsKKwl9CisKK3ZvaWQgTkNPTkZfZnJlZShDT05GICpjb25mKQorCXsKKwlpZiAoY29uZiA9PSBOVUxMKQorCQlyZXR1cm47CisJY29uZi0+bWV0aC0+ZGVzdHJveShjb25mKTsKKwl9CisKK3ZvaWQgTkNPTkZfZnJlZV9kYXRhKENPTkYgKmNvbmYpCisJeworCWlmIChjb25mID09IE5VTEwpCisJCXJldHVybjsKKwljb25mLT5tZXRoLT5kZXN0cm95X2RhdGEoY29uZik7CisJfQorCitpbnQgTkNPTkZfbG9hZChDT05GICpjb25mLCBjb25zdCBjaGFyICpmaWxlLCBsb25nICplbGluZSkKKwl7CisJaWYgKGNvbmYgPT0gTlVMTCkKKwkJeworCQlDT05GZXJyKENPTkZfRl9OQ09ORl9MT0FELENPTkZfUl9OT19DT05GKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiBjb25mLT5tZXRoLT5sb2FkKGNvbmYsIGZpbGUsIGVsaW5lKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBOQ09ORl9sb2FkX2ZwKENPTkYgKmNvbmYsIEZJTEUgKmZwLGxvbmcgKmVsaW5lKQorCXsKKwlCSU8gKmJ0bXA7CisJaW50IHJldDsKKwlpZighKGJ0bXAgPSBCSU9fbmV3X2ZwKGZwLCBCSU9fTk9DTE9TRSkpKQorCQl7CisJCUNPTkZlcnIoQ09ORl9GX05DT05GX0xPQURfRlAsRVJSX1JfQlVGX0xJQik7CisJCXJldHVybiAwOworCQl9CisJcmV0ID0gTkNPTkZfbG9hZF9iaW8oY29uZiwgYnRtcCwgZWxpbmUpOworCUJJT19mcmVlKGJ0bXApOworCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKK2ludCBOQ09ORl9sb2FkX2JpbyhDT05GICpjb25mLCBCSU8gKmJwLGxvbmcgKmVsaW5lKQorCXsKKwlpZiAoY29uZiA9PSBOVUxMKQorCQl7CisJCUNPTkZlcnIoQ09ORl9GX05DT05GX0xPQURfQklPLENPTkZfUl9OT19DT05GKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiBjb25mLT5tZXRoLT5sb2FkX2Jpbyhjb25mLCBicCwgZWxpbmUpOworCX0KKworU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKk5DT05GX2dldF9zZWN0aW9uKGNvbnN0IENPTkYgKmNvbmYsY29uc3QgY2hhciAqc2VjdGlvbikKKwl7CisJaWYgKGNvbmYgPT0gTlVMTCkKKwkJeworCQlDT05GZXJyKENPTkZfRl9OQ09ORl9HRVRfU0VDVElPTixDT05GX1JfTk9fQ09ORik7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAoc2VjdGlvbiA9PSBOVUxMKQorCQl7CisJCUNPTkZlcnIoQ09ORl9GX05DT05GX0dFVF9TRUNUSU9OLENPTkZfUl9OT19TRUNUSU9OKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldHVybiBfQ09ORl9nZXRfc2VjdGlvbl92YWx1ZXMoY29uZiwgc2VjdGlvbik7CisJfQorCitjaGFyICpOQ09ORl9nZXRfc3RyaW5nKGNvbnN0IENPTkYgKmNvbmYsY29uc3QgY2hhciAqZ3JvdXAsY29uc3QgY2hhciAqbmFtZSkKKwl7CisJY2hhciAqcyA9IF9DT05GX2dldF9zdHJpbmcoY29uZiwgZ3JvdXAsIG5hbWUpOworCisgICAgICAgIC8qIFNpbmNlIHdlIG1heSBnZXQgYSB2YWx1ZSBmcm9tIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGV2ZW4KKyAgICAgICAgICAgaWYgY29uZiBpcyBOVUxMLCBsZXQncyBjaGVjayB0aGUgdmFsdWUgZmlyc3QgKi8KKyAgICAgICAgaWYgKHMpIHJldHVybiBzOworCisJaWYgKGNvbmYgPT0gTlVMTCkKKwkJeworCQlDT05GZXJyKENPTkZfRl9OQ09ORl9HRVRfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgQ09ORl9SX05PX0NPTkZfT1JfRU5WSVJPTk1FTlRfVkFSSUFCTEUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCUNPTkZlcnIoQ09ORl9GX05DT05GX0dFVF9TVFJJTkcsCisJCUNPTkZfUl9OT19WQUxVRSk7CisJRVJSX2FkZF9lcnJvcl9kYXRhKDQsImdyb3VwPSIsZ3JvdXAsIiBuYW1lPSIsbmFtZSk7CisJcmV0dXJuIE5VTEw7CisJfQorCitpbnQgTkNPTkZfZ2V0X251bWJlcl9lKGNvbnN0IENPTkYgKmNvbmYsY29uc3QgY2hhciAqZ3JvdXAsY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIGxvbmcgKnJlc3VsdCkKKwl7CisJY2hhciAqc3RyOworCisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQl7CisJCUNPTkZlcnIoQ09ORl9GX05DT05GX0dFVF9OVU1CRVJfRSxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCisJc3RyID0gTkNPTkZfZ2V0X3N0cmluZyhjb25mLGdyb3VwLG5hbWUpOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZvciAoKnJlc3VsdCA9IDA7Y29uZi0+bWV0aC0+aXNfbnVtYmVyKGNvbmYsICpzdHIpOykKKwkJeworCQkqcmVzdWx0ID0gKCpyZXN1bHQpKjEwICsgY29uZi0+bWV0aC0+dG9faW50KGNvbmYsICpzdHIpOworCQlzdHIrKzsKKwkJfQorCisJcmV0dXJuIDE7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgTkNPTkZfZHVtcF9mcChjb25zdCBDT05GICpjb25mLCBGSUxFICpvdXQpCisJeworCUJJTyAqYnRtcDsKKwlpbnQgcmV0OworCWlmKCEoYnRtcCA9IEJJT19uZXdfZnAob3V0LCBCSU9fTk9DTE9TRSkpKSB7CisJCUNPTkZlcnIoQ09ORl9GX05DT05GX0RVTVBfRlAsRVJSX1JfQlVGX0xJQik7CisJCXJldHVybiAwOworCX0KKwlyZXQgPSBOQ09ORl9kdW1wX2Jpbyhjb25mLCBidG1wKTsKKwlCSU9fZnJlZShidG1wKTsKKwlyZXR1cm4gcmV0OworCX0KKyNlbmRpZgorCitpbnQgTkNPTkZfZHVtcF9iaW8oY29uc3QgQ09ORiAqY29uZiwgQklPICpvdXQpCisJeworCWlmIChjb25mID09IE5VTEwpCisJCXsKKwkJQ09ORmVycihDT05GX0ZfTkNPTkZfRFVNUF9CSU8sQ09ORl9SX05PX0NPTkYpOworCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIGNvbmYtPm1ldGgtPmR1bXAoY29uZiwgb3V0KTsKKwl9CisKKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYXZvaWRlZCAqLworI2lmIDAKK2xvbmcgTkNPTkZfZ2V0X251bWJlcihDT05GICpjb25mLGNoYXIgKmdyb3VwLGNoYXIgKm5hbWUpCisJeworCWludCBzdGF0dXM7CisJbG9uZyByZXQ9MDsKKworCXN0YXR1cyA9IE5DT05GX2dldF9udW1iZXJfZShjb25mLCBncm91cCwgbmFtZSwgJnJldCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQl7CisJCS8qIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYmVsaWV2ZSBpbiBlcnJvcnMuLi4gKi8KKwkJRVJSX2dldF9lcnJvcigpOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfbWFsbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9tYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmNGNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfbWFsbC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIGNvbmZfbWFsbC5jICovCisvKiBXcml0dGVuIGJ5IFN0ZXBoZW4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorCisvKiBMb2FkIGFsbCBPcGVuU1NMIGJ1aWx0aW4gbW9kdWxlcyAqLworCit2b2lkIE9QRU5TU0xfbG9hZF9idWlsdGluX21vZHVsZXModm9pZCkKKwl7CisJLyogQWRkIGJ1aWx0aW4gbW9kdWxlcyBoZXJlICovCisJQVNOMV9hZGRfb2lkX21vZHVsZSgpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCUVOR0lORV9hZGRfY29uZl9tb2R1bGUoKTsKKyNlbmRpZgorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9tb2QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxNjQyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfbW9kLmMKQEAgLTAsMCArMSw2MjMgQEAKKy8qIGNvbmZfbW9kLmMgKi8KKy8qIFdyaXR0ZW4gYnkgU3RlcGhlbiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Rzby5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisKKyNkZWZpbmUgRFNPX21vZF9pbml0X25hbWUgIk9QRU5TU0xfaW5pdCIKKyNkZWZpbmUgRFNPX21vZF9maW5pc2hfbmFtZSAiT1BFTlNTTF9maW5pc2giCisKKworLyogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgYSBkYXRhIGFib3V0IHN1cHBvcnRlZCBtb2R1bGVzLgorICogZW50cmllcyBpbiB0aGlzIHRhYmxlIGNvcnJlc3BvbmQgdG8gZWl0aGVyIGR5bmFtaWMgb3IKKyAqIHN0YXRpYyBtb2R1bGVzLgorICovCisKK3N0cnVjdCBjb25mX21vZHVsZV9zdAorCXsKKwkvKiBEU08gb2YgdGhpcyBtb2R1bGUgb3IgTlVMTCBpZiBzdGF0aWMgKi8KKwlEU08gKmRzbzsKKwkvKiBOYW1lIG9mIHRoZSBtb2R1bGUgKi8KKwljaGFyICpuYW1lOworCS8qIEluaXQgZnVuY3Rpb24gKi8KKwljb25mX2luaXRfZnVuYyAqaW5pdDsgCisJLyogRmluaXNoIGZ1bmN0aW9uICovCisJY29uZl9maW5pc2hfZnVuYyAqZmluaXNoOworCS8qIE51bWJlciBvZiBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgbW9kdWxlcyAqLworCWludCBsaW5rczsKKwl2b2lkICp1c3JfZGF0YTsKKwl9OworCisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IG1vZHVsZXMgdGhhdCBoYXZlIGJlZW4KKyAqIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZC4gVGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgZW50cnkgZm9yIGEKKyAqIGdpdmVuIG1vZHVsZS4KKyAqLworCitzdHJ1Y3QgY29uZl9pbW9kdWxlX3N0CisJeworCUNPTkZfTU9EVUxFICpwbW9kOworCWNoYXIgKm5hbWU7CisJY2hhciAqdmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICp1c3JfZGF0YTsKKwl9OworCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9NT0RVTEUpICpzdXBwb3J0ZWRfbW9kdWxlcyA9IE5VTEw7CitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9JTU9EVUxFKSAqaW5pdGlhbGl6ZWRfbW9kdWxlcyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9mcmVlKENPTkZfTU9EVUxFICptZCk7CitzdGF0aWMgdm9pZCBtb2R1bGVfZmluaXNoKENPTkZfSU1PRFVMRSAqaW1vZCk7CitzdGF0aWMgaW50IG1vZHVsZV9ydW4oY29uc3QgQ09ORiAqY25mLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwKKwkJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3N0YXRpYyBDT05GX01PRFVMRSAqbW9kdWxlX2FkZChEU08gKmRzbywgY29uc3QgY2hhciAqbmFtZSwKKwkJCWNvbmZfaW5pdF9mdW5jICppZnVuYywgY29uZl9maW5pc2hfZnVuYyAqZmZ1bmMpOworc3RhdGljIENPTkZfTU9EVUxFICptb2R1bGVfZmluZChjaGFyICpuYW1lKTsKK3N0YXRpYyBpbnQgbW9kdWxlX2luaXQoQ09ORl9NT0RVTEUgKnBtb2QsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLAorCQkJCQkgICBjb25zdCBDT05GICpjbmYpOworc3RhdGljIENPTkZfTU9EVUxFICptb2R1bGVfbG9hZF9kc28oY29uc3QgQ09ORiAqY25mLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwKKwkJCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisvKiBNYWluIGZ1bmN0aW9uOiBsb2FkIG1vZHVsZXMgZnJvbSBhIENPTkYgc3RydWN0dXJlICovCisKK2ludCBDT05GX21vZHVsZXNfbG9hZChjb25zdCBDT05GICpjbmYsIGNvbnN0IGNoYXIgKmFwcG5hbWUsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCVNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXM7CisJQ09ORl9WQUxVRSAqdmw7CisJY2hhciAqdnNlY3Rpb24gPSBOVUxMOworCisJaW50IHJldCwgaTsKKworCWlmICghY25mKQorCQlyZXR1cm4gMTsKKworCWlmIChhcHBuYW1lKQorCQl2c2VjdGlvbiA9IE5DT05GX2dldF9zdHJpbmcoY25mLCBOVUxMLCBhcHBuYW1lKTsKKworCWlmICghYXBwbmFtZSB8fCAoIXZzZWN0aW9uICYmIChmbGFncyAmIENPTkZfTUZMQUdTX0RFRkFVTFRfU0VDVElPTikpKQorCQl2c2VjdGlvbiA9IE5DT05GX2dldF9zdHJpbmcoY25mLCBOVUxMLCAib3BlbnNzbF9jb25mIik7CisKKwlpZiAoIXZzZWN0aW9uKQorCQl7CisJCUVSUl9jbGVhcl9lcnJvcigpOworCQlyZXR1cm4gMTsKKwkJfQorCisJdmFsdWVzID0gTkNPTkZfZ2V0X3NlY3Rpb24oY25mLCB2c2VjdGlvbik7CisKKwlpZiAoIXZhbHVlcykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0odmFsdWVzKTsgaSsrKQorCQl7CisJCXZsID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWx1ZXMsIGkpOworCQlyZXQgPSBtb2R1bGVfcnVuKGNuZiwgdmwtPm5hbWUsIHZsLT52YWx1ZSwgZmxhZ3MpOworCQlpZiAocmV0IDw9IDApCisJCQlpZighKGZsYWdzICYgQ09ORl9NRkxBR1NfSUdOT1JFX0VSUk9SUykpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJcmV0dXJuIDE7CisKKwl9CisKK2ludCBDT05GX21vZHVsZXNfbG9hZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICphcHBuYW1lLAorCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJY2hhciAqZmlsZSA9IE5VTEw7CisJQ09ORiAqY29uZiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJY29uZiA9IE5DT05GX25ldyhOVUxMKTsKKwlpZiAoIWNvbmYpCisJCWdvdG8gZXJyOworCisJaWYgKGZpbGVuYW1lID09IE5VTEwpCisJCXsKKwkJZmlsZSA9IENPTkZfZ2V0MV9kZWZhdWx0X2NvbmZpZ19maWxlKCk7CisJCWlmICghZmlsZSkKKwkJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQlmaWxlID0gKGNoYXIgKilmaWxlbmFtZTsKKworCWlmIChOQ09ORl9sb2FkKGNvbmYsIGZpbGUsIE5VTEwpIDw9IDApCisJCXsKKwkJaWYgKChmbGFncyAmIENPTkZfTUZMQUdTX0lHTk9SRV9NSVNTSU5HX0ZJTEUpICYmCisJCSAgKEVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2xhc3RfZXJyb3IoKSkgPT0gQ09ORl9SX05PX1NVQ0hfRklMRSkpCisJCQl7CisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCXJldCA9IDE7CisJCQl9CisJCWdvdG8gZXJyOworCQl9CisKKwlyZXQgPSBDT05GX21vZHVsZXNfbG9hZChjb25mLCBhcHBuYW1lLCBmbGFncyk7CisKKwllcnI6CisJaWYgKGZpbGVuYW1lID09IE5VTEwpCisJCU9QRU5TU0xfZnJlZShmaWxlKTsKKwlOQ09ORl9mcmVlKGNvbmYpOworCisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgbW9kdWxlX3J1bihjb25zdCBDT05GICpjbmYsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlDT05GX01PRFVMRSAqbWQ7CisJaW50IHJldDsKKworCW1kID0gbW9kdWxlX2ZpbmQobmFtZSk7CisKKwkvKiBNb2R1bGUgbm90IGZvdW5kOiB0cnkgdG8gbG9hZCBEU08gKi8KKwlpZiAoIW1kICYmICEoZmxhZ3MgJiBDT05GX01GTEFHU19OT19EU08pKQorCQltZCA9IG1vZHVsZV9sb2FkX2RzbyhjbmYsIG5hbWUsIHZhbHVlLCBmbGFncyk7CisKKwlpZiAoIW1kKQorCQl7CisJCWlmICghKGZsYWdzICYgQ09ORl9NRkxBR1NfU0lMRU5UKSkKKwkJCXsKKwkJCUNPTkZlcnIoQ09ORl9GX01PRFVMRV9SVU4sIENPTkZfUl9VTktOT1dOX01PRFVMRV9OQU1FKTsKKwkJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAibW9kdWxlPSIsIG5hbWUpOworCQkJfQorCQlyZXR1cm4gLTE7CisJCX0KKworCXJldCA9IG1vZHVsZV9pbml0KG1kLCBuYW1lLCB2YWx1ZSwgY25mKTsKKworCWlmIChyZXQgPD0gMCkKKwkJeworCQlpZiAoIShmbGFncyAmIENPTkZfTUZMQUdTX1NJTEVOVCkpCisJCQl7CisJCQljaGFyIHJjb2RlW0RFQ0lNQUxfU0laRShyZXQpKzFdOworCQkJQ09ORmVycihDT05GX0ZfTU9EVUxFX1JVTiwgQ09ORl9SX01PRFVMRV9JTklUSUFMSVpBVElPTl9FUlJPUik7CisJCQlCSU9fc25wcmludGYocmNvZGUsIHNpemVvZiByY29kZSwgIiUtOGQiLCByZXQpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDYsICJtb2R1bGU9IiwgbmFtZSwgIiwgdmFsdWU9IiwgdmFsdWUsICIsIHJldGNvZGU9IiwgcmNvZGUpOworCQkJfQorCQl9CisKKwlyZXR1cm4gcmV0OworCX0KKworLyogTG9hZCBhIG1vZHVsZSBmcm9tIGEgRFNPICovCitzdGF0aWMgQ09ORl9NT0RVTEUgKm1vZHVsZV9sb2FkX2Rzbyhjb25zdCBDT05GICpjbmYsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlEU08gKmRzbyA9IE5VTEw7CisJY29uZl9pbml0X2Z1bmMgKmlmdW5jOworCWNvbmZfZmluaXNoX2Z1bmMgKmZmdW5jOworCWNoYXIgKnBhdGggPSBOVUxMOworCWludCBlcnJjb2RlID0gMDsKKwlDT05GX01PRFVMRSAqbWQ7CisJLyogTG9vayBmb3IgYWx0ZXJuYXRpdmUgcGF0aCBpbiBtb2R1bGUgc2VjdGlvbiAqLworCXBhdGggPSBOQ09ORl9nZXRfc3RyaW5nKGNuZiwgdmFsdWUsICJwYXRoIik7CisJaWYgKCFwYXRoKQorCQl7CisJCUVSUl9jbGVhcl9lcnJvcigpOworCQlwYXRoID0gbmFtZTsKKwkJfQorCWRzbyA9IERTT19sb2FkKE5VTEwsIHBhdGgsIE5VTEwsIDApOworCWlmICghZHNvKQorCQl7CisJCWVycmNvZGUgPSBDT05GX1JfRVJST1JfTE9BRElOR19EU087CisJCWdvdG8gZXJyOworCQl9CisgICAgICAgIGlmdW5jID0gKGNvbmZfaW5pdF9mdW5jICopRFNPX2JpbmRfZnVuYyhkc28sIERTT19tb2RfaW5pdF9uYW1lKTsKKwlpZiAoIWlmdW5jKQorCQl7CisJCWVycmNvZGUgPSBDT05GX1JfTUlTU0lOR19JTklUX0ZVTkNUSU9OOworCQlnb3RvIGVycjsKKwkJfQorICAgICAgICBmZnVuYyA9IChjb25mX2ZpbmlzaF9mdW5jICopRFNPX2JpbmRfZnVuYyhkc28sIERTT19tb2RfZmluaXNoX25hbWUpOworCS8qIEFsbCBPSywgYWRkIG1vZHVsZSAqLworCW1kID0gbW9kdWxlX2FkZChkc28sIG5hbWUsIGlmdW5jLCBmZnVuYyk7CisKKwlpZiAoIW1kKQorCQlnb3RvIGVycjsKKworCXJldHVybiBtZDsKKworCWVycjoKKwlpZiAoZHNvKQorCQlEU09fZnJlZShkc28pOworCUNPTkZlcnIoQ09ORl9GX01PRFVMRV9MT0FEX0RTTywgZXJyY29kZSk7CisJRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJtb2R1bGU9IiwgbmFtZSwgIiwgcGF0aD0iLCBwYXRoKTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKKy8qIGFkZCBtb2R1bGUgdG8gbGlzdCAqLworc3RhdGljIENPTkZfTU9EVUxFICptb2R1bGVfYWRkKERTTyAqZHNvLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgIGNvbmZfaW5pdF9mdW5jICppZnVuYywgY29uZl9maW5pc2hfZnVuYyAqZmZ1bmMpCisJeworCUNPTkZfTU9EVUxFICp0bW9kID0gTlVMTDsKKwlpZiAoc3VwcG9ydGVkX21vZHVsZXMgPT0gTlVMTCkKKwkJc3VwcG9ydGVkX21vZHVsZXMgPSBza19DT05GX01PRFVMRV9uZXdfbnVsbCgpOworCWlmIChzdXBwb3J0ZWRfbW9kdWxlcyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwl0bW9kID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENPTkZfTU9EVUxFKSk7CisJaWYgKHRtb2QgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0bW9kLT5kc28gPSBkc287CisJdG1vZC0+bmFtZSA9IEJVRl9zdHJkdXAobmFtZSk7CisJdG1vZC0+aW5pdCA9IGlmdW5jOworCXRtb2QtPmZpbmlzaCA9IGZmdW5jOworCXRtb2QtPmxpbmtzID0gMDsKKworCWlmICghc2tfQ09ORl9NT0RVTEVfcHVzaChzdXBwb3J0ZWRfbW9kdWxlcywgdG1vZCkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHRtb2QpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJcmV0dXJuIHRtb2Q7CisJfQorCisvKiBGaW5kIGEgbW9kdWxlIGZyb20gdGhlIGxpc3QuIFdlIGFsbG93IG1vZHVsZSBuYW1lcyBvZiB0aGUKKyAqIGZvcm0gbW9kbmFtZS5YWFhYIHRvIGp1c3Qgc2VhcmNoIGZvciBtb2RuYW1lIHRvIGFsbG93IHRoZQorICogc2FtZSBtb2R1bGUgdG8gYmUgaW5pdGlhbGl6ZWQgbW9yZSB0aGFuIG9uY2UuCisgKi8KKworc3RhdGljIENPTkZfTU9EVUxFICptb2R1bGVfZmluZChjaGFyICpuYW1lKQorCXsKKwlDT05GX01PRFVMRSAqdG1vZDsKKwlpbnQgaSwgbmNoYXI7CisJY2hhciAqcDsKKwlwID0gc3RycmNocihuYW1lLCAnLicpOworCisJaWYgKHApCisJCW5jaGFyID0gcCAtIG5hbWU7CisJZWxzZSAKKwkJbmNoYXIgPSBzdHJsZW4obmFtZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQ09ORl9NT0RVTEVfbnVtKHN1cHBvcnRlZF9tb2R1bGVzKTsgaSsrKQorCQl7CisJCXRtb2QgPSBza19DT05GX01PRFVMRV92YWx1ZShzdXBwb3J0ZWRfbW9kdWxlcywgaSk7CisJCWlmICghc3RybmNtcCh0bW9kLT5uYW1lLCBuYW1lLCBuY2hhcikpCisJCQlyZXR1cm4gdG1vZDsKKwkJfQorCisJcmV0dXJuIE5VTEw7CisKKwl9CisKKy8qIGluaXRpYWxpemUgYSBtb2R1bGUgKi8KK3N0YXRpYyBpbnQgbW9kdWxlX2luaXQoQ09ORl9NT0RVTEUgKnBtb2QsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLAorCQkgICAgICAgY29uc3QgQ09ORiAqY25mKQorCXsKKwlpbnQgcmV0ID0gMTsKKwlpbnQgaW5pdF9jYWxsZWQgPSAwOworCUNPTkZfSU1PRFVMRSAqaW1vZCA9IE5VTEw7CisKKwkvKiBPdGhlcndpc2UgYWRkIGluaXRpYWxpemVkIG1vZHVsZSB0byBsaXN0ICovCisJaW1vZCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihDT05GX0lNT0RVTEUpKTsKKwlpZiAoIWltb2QpCisJCWdvdG8gZXJyOworCisJaW1vZC0+cG1vZCA9IHBtb2Q7CisJaW1vZC0+bmFtZSA9IEJVRl9zdHJkdXAobmFtZSk7CisJaW1vZC0+dmFsdWUgPSBCVUZfc3RyZHVwKHZhbHVlKTsKKwlpbW9kLT51c3JfZGF0YSA9IE5VTEw7CisKKwlpZiAoIWltb2QtPm5hbWUgfHwgIWltb2QtPnZhbHVlKQorCQlnb3RvIG1lbWVycjsKKworCS8qIFRyeSB0byBpbml0aWFsaXplIG1vZHVsZSAqLworCWlmKHBtb2QtPmluaXQpCisJCXsKKwkJcmV0ID0gcG1vZC0+aW5pdChpbW9kLCBjbmYpOworCQlpbml0X2NhbGxlZCA9IDE7CisJCS8qIEVycm9yIG9jY3VycmVkLCBleGl0ICovCisJCWlmIChyZXQgPD0gMCkKKwkJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoaW5pdGlhbGl6ZWRfbW9kdWxlcyA9PSBOVUxMKQorCQl7CisJCWluaXRpYWxpemVkX21vZHVsZXMgPSBza19DT05GX0lNT0RVTEVfbmV3X251bGwoKTsKKwkJaWYgKCFpbml0aWFsaXplZF9tb2R1bGVzKQorCQkJeworCQkJQ09ORmVycihDT05GX0ZfTU9EVUxFX0lOSVQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAoIXNrX0NPTkZfSU1PRFVMRV9wdXNoKGluaXRpYWxpemVkX21vZHVsZXMsIGltb2QpKQorCQl7CisJCUNPTkZlcnIoQ09ORl9GX01PRFVMRV9JTklULCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlwbW9kLT5saW5rcysrOworCisJcmV0dXJuIHJldDsKKworCWVycjoKKworCS8qIFdlJ3ZlIHN0YXJ0ZWQgdGhlIG1vZHVsZSBzbyB3ZSdkIGJldHRlciBmaW5pc2ggaXQgKi8KKwlpZiAocG1vZC0+ZmluaXNoICYmIGluaXRfY2FsbGVkKQorCQlwbW9kLT5maW5pc2goaW1vZCk7CisKKwltZW1lcnI6CisJaWYgKGltb2QpCisJCXsKKwkJaWYgKGltb2QtPm5hbWUpCisJCQlPUEVOU1NMX2ZyZWUoaW1vZC0+bmFtZSk7CisJCWlmIChpbW9kLT52YWx1ZSkKKwkJCU9QRU5TU0xfZnJlZShpbW9kLT52YWx1ZSk7CisJCU9QRU5TU0xfZnJlZShpbW9kKTsKKwkJfQorCisJcmV0dXJuIC0xOworCisJfQorCisvKiBVbmxvYWQgYW55IGR5bmFtaWMgbW9kdWxlcyB0aGF0IGhhdmUgYSBsaW5rIGNvdW50IG9mIHplcm86CisgKiBpLmUuIGhhdmUgbm8gYWN0aXZlIGluaXRpYWxpemVkIG1vZHVsZXMuIElmICdhbGwnIGlzIHNldAorICogdGhlbiBhbGwgbW9kdWxlcyBhcmUgdW5sb2FkZWQgaW5jbHVkaW5nIHN0YXRpYyBvbmVzLgorICovCisKK3ZvaWQgQ09ORl9tb2R1bGVzX3VubG9hZChpbnQgYWxsKQorCXsKKwlpbnQgaTsKKwlDT05GX01PRFVMRSAqbWQ7CisJQ09ORl9tb2R1bGVzX2ZpbmlzaCgpOworCS8qIHVubG9hZCBtb2R1bGVzIGluIHJldmVyc2Ugb3JkZXIgKi8KKwlmb3IgKGkgPSBza19DT05GX01PRFVMRV9udW0oc3VwcG9ydGVkX21vZHVsZXMpIC0gMTsgaSA+PSAwOyBpLS0pCisJCXsKKwkJbWQgPSBza19DT05GX01PRFVMRV92YWx1ZShzdXBwb3J0ZWRfbW9kdWxlcywgaSk7CisJCS8qIElmIHN0YXRpYyBvciBpbiB1c2UgYW5kICdhbGwnIG5vdCBzZXQgaWdub3JlIGl0ICovCisJCWlmICgoKG1kLT5saW5rcyA+IDApIHx8ICFtZC0+ZHNvKSAmJiAhYWxsKQorCQkJY29udGludWU7CisJCS8qIFNpbmNlIHdlJ3JlIHdvcmtpbmcgaW4gcmV2ZXJzZSB0aGlzIGlzIE9LICovCisJCSh2b2lkKXNrX0NPTkZfTU9EVUxFX2RlbGV0ZShzdXBwb3J0ZWRfbW9kdWxlcywgaSk7CisJCW1vZHVsZV9mcmVlKG1kKTsKKwkJfQorCWlmIChza19DT05GX01PRFVMRV9udW0oc3VwcG9ydGVkX21vZHVsZXMpID09IDApCisJCXsKKwkJc2tfQ09ORl9NT0RVTEVfZnJlZShzdXBwb3J0ZWRfbW9kdWxlcyk7CisJCXN1cHBvcnRlZF9tb2R1bGVzID0gTlVMTDsKKwkJfQorCX0KKworLyogdW5sb2FkIGEgc2luZ2xlIG1vZHVsZSAqLworc3RhdGljIHZvaWQgbW9kdWxlX2ZyZWUoQ09ORl9NT0RVTEUgKm1kKQorCXsKKwlpZiAobWQtPmRzbykKKwkJRFNPX2ZyZWUobWQtPmRzbyk7CisJT1BFTlNTTF9mcmVlKG1kLT5uYW1lKTsKKwlPUEVOU1NMX2ZyZWUobWQpOworCX0KKworLyogZmluaXNoIGFuZCBmcmVlIHVwIGFsbCBtb2R1bGVzIGluc3RhbmNlcyAqLworCit2b2lkIENPTkZfbW9kdWxlc19maW5pc2godm9pZCkKKwl7CisJQ09ORl9JTU9EVUxFICppbW9kOworCXdoaWxlIChza19DT05GX0lNT0RVTEVfbnVtKGluaXRpYWxpemVkX21vZHVsZXMpID4gMCkKKwkJeworCQlpbW9kID0gc2tfQ09ORl9JTU9EVUxFX3BvcChpbml0aWFsaXplZF9tb2R1bGVzKTsKKwkJbW9kdWxlX2ZpbmlzaChpbW9kKTsKKwkJfQorCXNrX0NPTkZfSU1PRFVMRV9mcmVlKGluaXRpYWxpemVkX21vZHVsZXMpOworCWluaXRpYWxpemVkX21vZHVsZXMgPSBOVUxMOworCX0KKworLyogZmluaXNoIGEgbW9kdWxlIGluc3RhbmNlICovCisKK3N0YXRpYyB2b2lkIG1vZHVsZV9maW5pc2goQ09ORl9JTU9EVUxFICppbW9kKQorCXsKKwlpZiAoaW1vZC0+cG1vZC0+ZmluaXNoKQorCQlpbW9kLT5wbW9kLT5maW5pc2goaW1vZCk7CisJaW1vZC0+cG1vZC0+bGlua3MtLTsKKwlPUEVOU1NMX2ZyZWUoaW1vZC0+bmFtZSk7CisJT1BFTlNTTF9mcmVlKGltb2QtPnZhbHVlKTsKKwlPUEVOU1NMX2ZyZWUoaW1vZCk7CisJfQorCisvKiBBZGQgYSBzdGF0aWMgbW9kdWxlIHRvIE9wZW5TU0wgKi8KKworaW50IENPTkZfbW9kdWxlX2FkZChjb25zdCBjaGFyICpuYW1lLCBjb25mX2luaXRfZnVuYyAqaWZ1bmMsIAorCQkgICAgY29uZl9maW5pc2hfZnVuYyAqZmZ1bmMpCisJeworCWlmIChtb2R1bGVfYWRkKE5VTEwsIG5hbWUsIGlmdW5jLCBmZnVuYykpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7CisJfQorCit2b2lkIENPTkZfbW9kdWxlc19mcmVlKHZvaWQpCisJeworCUNPTkZfbW9kdWxlc19maW5pc2goKTsKKwlDT05GX21vZHVsZXNfdW5sb2FkKDEpOworCX0KKworLyogVXRpbGl0eSBmdW5jdGlvbnMgKi8KKworY29uc3QgY2hhciAqQ09ORl9pbW9kdWxlX2dldF9uYW1lKGNvbnN0IENPTkZfSU1PRFVMRSAqbWQpCisJeworCXJldHVybiBtZC0+bmFtZTsKKwl9CisKK2NvbnN0IGNoYXIgKkNPTkZfaW1vZHVsZV9nZXRfdmFsdWUoY29uc3QgQ09ORl9JTU9EVUxFICptZCkKKwl7CisJcmV0dXJuIG1kLT52YWx1ZTsKKwl9CisKK3ZvaWQgKkNPTkZfaW1vZHVsZV9nZXRfdXNyX2RhdGEoY29uc3QgQ09ORl9JTU9EVUxFICptZCkKKwl7CisJcmV0dXJuIG1kLT51c3JfZGF0YTsKKwl9CisKK3ZvaWQgQ09ORl9pbW9kdWxlX3NldF91c3JfZGF0YShDT05GX0lNT0RVTEUgKm1kLCB2b2lkICp1c3JfZGF0YSkKKwl7CisJbWQtPnVzcl9kYXRhID0gdXNyX2RhdGE7CisJfQorCitDT05GX01PRFVMRSAqQ09ORl9pbW9kdWxlX2dldF9tb2R1bGUoY29uc3QgQ09ORl9JTU9EVUxFICptZCkKKwl7CisJcmV0dXJuIG1kLT5wbW9kOworCX0KKwordW5zaWduZWQgbG9uZyBDT05GX2ltb2R1bGVfZ2V0X2ZsYWdzKGNvbnN0IENPTkZfSU1PRFVMRSAqbWQpCisJeworCXJldHVybiBtZC0+ZmxhZ3M7CisJfQorCit2b2lkIENPTkZfaW1vZHVsZV9zZXRfZmxhZ3MoQ09ORl9JTU9EVUxFICptZCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJbWQtPmZsYWdzID0gZmxhZ3M7CisJfQorCit2b2lkICpDT05GX21vZHVsZV9nZXRfdXNyX2RhdGEoQ09ORl9NT0RVTEUgKnBtb2QpCisJeworCXJldHVybiBwbW9kLT51c3JfZGF0YTsKKwl9CisKK3ZvaWQgQ09ORl9tb2R1bGVfc2V0X3Vzcl9kYXRhKENPTkZfTU9EVUxFICpwbW9kLCB2b2lkICp1c3JfZGF0YSkKKwl7CisJcG1vZC0+dXNyX2RhdGEgPSB1c3JfZGF0YTsKKwl9CisKKy8qIFJldHVybiBkZWZhdWx0IGNvbmZpZyBmaWxlIG5hbWUgKi8KKworY2hhciAqQ09ORl9nZXQxX2RlZmF1bHRfY29uZmlnX2ZpbGUodm9pZCkKKwl7CisJY2hhciAqZmlsZTsKKwlpbnQgbGVuOworCisJZmlsZSA9IGdldGVudigiT1BFTlNTTF9DT05GIik7CisJaWYgKGZpbGUpIAorCQlyZXR1cm4gQlVGX3N0cmR1cChmaWxlKTsKKworCWxlbiA9IHN0cmxlbihYNTA5X2dldF9kZWZhdWx0X2NlcnRfYXJlYSgpKTsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisJbGVuKys7CisjZW5kaWYKKwlsZW4gKz0gc3RybGVuKE9QRU5TU0xfQ09ORik7CisKKwlmaWxlID0gT1BFTlNTTF9tYWxsb2MobGVuICsgMSk7CisKKwlpZiAoIWZpbGUpCisJCXJldHVybiBOVUxMOworCUJVRl9zdHJsY3B5KGZpbGUsWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2FyZWEoKSxsZW4gKyAxKTsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisJQlVGX3N0cmxjYXQoZmlsZSwiLyIsbGVuICsgMSk7CisjZW5kaWYKKwlCVUZfc3RybGNhdChmaWxlLE9QRU5TU0xfQ09ORixsZW4gKyAxKTsKKworCXJldHVybiBmaWxlOworCX0KKworLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxpc3Qgc2VwYXJhdGVkIGJ5ICdzZXAnIGFuZCBjYWxscyB0aGUKKyAqIGNhbGxiYWNrIGZ1bmN0aW9uIGdpdmluZyB0aGUgc3RhcnQgYW5kIGxlbmd0aCBvZiBlYWNoIG1lbWJlcgorICogb3B0aW9uYWxseSBzdHJpcHBpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gVGhpcyBjYW4KKyAqIGJlIHVzZWQgdG8gcGFyc2UgY29tbWEgc2VwYXJhdGVkIGxpc3RzIGZvciBleGFtcGxlLgorICovCisKK2ludCBDT05GX3BhcnNlX2xpc3QoY29uc3QgY2hhciAqbGlzdF8sIGludCBzZXAsIGludCBub3NwYywKKwlpbnQgKCpsaXN0X2NiKShjb25zdCBjaGFyICplbGVtLCBpbnQgbGVuLCB2b2lkICp1c3IpLCB2b2lkICphcmcpCisJeworCWludCByZXQ7CisJY29uc3QgY2hhciAqbHN0YXJ0LCAqdG1wZW5kLCAqcDsKKworCWlmKGxpc3RfID09IE5VTEwpCisJCXsKKwkJQ09ORmVycihDT05GX0ZfQ09ORl9QQVJTRV9MSVNULCBDT05GX1JfTElTVF9DQU5OT1RfQkVfTlVMTCk7CisJCXJldHVybiAwOworCQl9CisKKwlsc3RhcnQgPSBsaXN0XzsKKwlmb3IoOzspCisJCXsKKwkJaWYgKG5vc3BjKQorCQkJeworCQkJd2hpbGUoKmxzdGFydCAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpsc3RhcnQpKQorCQkJCWxzdGFydCsrOworCQkJfQorCQlwID0gc3RyY2hyKGxzdGFydCwgc2VwKTsKKwkJaWYgKHAgPT0gbHN0YXJ0IHx8ICEqbHN0YXJ0KQorCQkJcmV0ID0gbGlzdF9jYihOVUxMLCAwLCBhcmcpOworCQllbHNlCisJCQl7CisJCQlpZiAocCkKKwkJCQl0bXBlbmQgPSBwIC0gMTsKKwkJCWVsc2UgCisJCQkJdG1wZW5kID0gbHN0YXJ0ICsgc3RybGVuKGxzdGFydCkgLSAxOworCQkJaWYgKG5vc3BjKQorCQkJCXsKKwkJCQl3aGlsZShpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSp0bXBlbmQpKQorCQkJCQl0bXBlbmQtLTsKKwkJCQl9CisJCQlyZXQgPSBsaXN0X2NiKGxzdGFydCwgdG1wZW5kIC0gbHN0YXJ0ICsgMSwgYXJnKTsKKwkJCX0KKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCXJldHVybiAxOworCQlsc3RhcnQgPSBwICsgMTsKKwkJfQorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvY29uZl9zYXAuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfc2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYwZGMyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL2NvbmZfc2FwLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qIGNvbmZfc2FwLmMgKi8KKy8qIFdyaXR0ZW4gYnkgU3RlcGhlbiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kc28uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIGF1dG9tYXRpYyBjb25maWd1cmF0aW9uIGxvYWRlcjogaXQgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkKKyAqIE9wZW5TU0wgd2hlbiBhbnkgb2YgYSBudW1iZXIgb2Ygc3RhbmRhcmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zIGFyZSBjYWxsZWQsCisgKiB1bmxlc3MgdGhpcyBpcyBvdmVycmlkZGVuIGJ5IGNhbGxpbmcgT1BFTlNTTF9ub19jb25maWcoKQorICovCisKK3N0YXRpYyBpbnQgb3BlbnNzbF9jb25maWd1cmVkID0gMDsKKwordm9pZCBPUEVOU1NMX2NvbmZpZyhjb25zdCBjaGFyICpjb25maWdfbmFtZSkKKwl7CisJaWYgKG9wZW5zc2xfY29uZmlndXJlZCkKKwkJcmV0dXJuOworCisJT1BFTlNTTF9sb2FkX2J1aWx0aW5fbW9kdWxlcygpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCS8qIE5lZWQgdG8gbG9hZCBFTkdJTkVzICovCisJRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKCk7CisjZW5kaWYKKwkvKiBBZGQgb3RoZXJzIGhlcmU/ICovCisKKworCUVSUl9jbGVhcl9lcnJvcigpOworCWlmIChDT05GX21vZHVsZXNfbG9hZF9maWxlKE5VTEwsIGNvbmZpZ19uYW1lLAorCUNPTkZfTUZMQUdTX0RFRkFVTFRfU0VDVElPTnxDT05GX01GTEFHU19JR05PUkVfTUlTU0lOR19GSUxFKSA8PSAwKQorCQl7CisJCUJJTyAqYmlvX2VycjsKKwkJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKwkJaWYgKChiaW9fZXJyPUJJT19uZXdfZnAoc3RkZXJyLCBCSU9fTk9DTE9TRSkpICE9IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsIkF1dG8gY29uZmlndXJhdGlvbiBmYWlsZWRcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCUJJT19mcmVlKGJpb19lcnIpOworCQkJfQorCQlleGl0KDEpOworCQl9CisKKwlyZXR1cm47CisJfQorCit2b2lkIE9QRU5TU0xfbm9fY29uZmlnKCkKKwl7CisJb3BlbnNzbF9jb25maWd1cmVkID0gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi9rZXlzZXRzLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYva2V5c2V0cy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGVkNjdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYva2V5c2V0cy5wbApAQCAtMCwwICsxLDE4NSBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisKKyROVU1CRVI9MHgwMTsKKyRVUFBFUj0weDAyOworJExPV0VSPTB4MDQ7CiskVU5ERVI9MHgxMDA7CiskUFVOQ1RVQVRJT049MHgyMDA7CiskV1M9MHgxMDsKKyRFU0M9MHgyMDsKKyRRVU9URT0weDQwOworJERRVU9URT0weDQwMDsKKyRDT01NRU5UPTB4ODA7CiskRkNPTU1FTlQ9MHg4MDA7CiskRU9GPTB4MDg7CiskSElHSEJJVD0weDEwMDA7CisKK2ZvcmVhY2ggKDAgLi4gMjU1KQorCXsKKwkkdj0wOworCSRjPXNwcmludGYoIiVjIiwkXyk7CisJJHZ8PSROVU1CRVIJaWYgKCRjID1+IC9bMC05XS8pOworCSR2fD0kVVBQRVIJaWYgKCRjID1+IC9bQS1aXS8pOworCSR2fD0kTE9XRVIJaWYgKCRjID1+IC9bYS16XS8pOworCSR2fD0kVU5ERVIJaWYgKCRjID1+IC9fLyk7CisJJHZ8PSRQVU5DVFVBVElPTiBpZiAoJGMgPX4gL1shXC4lJlwqXCssXC87XD9cQFxeXH5cfC1dLyk7CisJJHZ8PSRXUwkJaWYgKCRjID1+IC9bIFx0XHJcbl0vKTsKKwkkdnw9JEVTQwlpZiAoJGMgPX4gL1xcLyk7CisJJHZ8PSRRVU9URQlpZiAoJGMgPX4gL1snYCJdLyk7ICMgZm9yIGVtYWNzOiAiYCd9LykKKwkkdnw9JENPTU1FTlQJaWYgKCRjID1+IC9cIy8pOworCSR2fD0kRU9GCWlmICgkYyA9fiAvXDAvKTsKKwkkdnw9JEhJR0hCSVQJaWYgKCRjID1+L1tceDgwLVx4ZmZdLyk7CisKKwlwdXNoKEBWX2RlZiwkdik7CisJfQorCitmb3JlYWNoICgwIC4uIDI1NSkKKwl7CisJJHY9MDsKKwkkYz1zcHJpbnRmKCIlYyIsJF8pOworCSR2fD0kTlVNQkVSCWlmICgkYyA9fiAvWzAtOV0vKTsKKwkkdnw9JFVQUEVSCWlmICgkYyA9fiAvW0EtWl0vKTsKKwkkdnw9JExPV0VSCWlmICgkYyA9fiAvW2Etel0vKTsKKwkkdnw9JFVOREVSCWlmICgkYyA9fiAvXy8pOworCSR2fD0kUFVOQ1RVQVRJT04gaWYgKCRjID1+IC9bIVwuJSZcKlwrLFwvO1w/XEBcXlx+XHwtXS8pOworCSR2fD0kV1MJCWlmICgkYyA9fiAvWyBcdFxyXG5dLyk7CisJJHZ8PSREUVVPVEUJaWYgKCRjID1+IC9bIl0vKTsgIyBmb3IgZW1hY3M6ICJ9LykKKwkkdnw9JEZDT01NRU5UCWlmICgkYyA9fiAvOy8pOworCSR2fD0kRU9GCWlmICgkYyA9fiAvXDAvKTsKKwkkdnw9JEhJR0hCSVQJaWYgKCRjID1+L1tceDgwLVx4ZmZdLyk7CisKKwlwdXNoKEBWX3czMiwkdik7CisJfQorCitwcmludCA8PCJFT0YiOworLyogY3J5cHRvL2NvbmYvY29uZl9kZWYuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5XEBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheVxAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaFxAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5XEBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoXEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIFRISVMgRklMRSBXQVMgQVVUT01BR0lDQUxMWSBHRU5FUkFURUQhCisgICBQbGVhc2UgbW9kaWZ5IGFuZCB1c2Uga2V5c2V0cy5wbCB0byByZWdlbmVyYXRlIGl0LiAqLworCisjZGVmaW5lIENPTkZfTlVNQkVSCQkkTlVNQkVSCisjZGVmaW5lIENPTkZfVVBQRVIJCSRVUFBFUgorI2RlZmluZSBDT05GX0xPV0VSCQkkTE9XRVIKKyNkZWZpbmUgQ09ORl9VTkRFUgkJJFVOREVSCisjZGVmaW5lIENPTkZfUFVOQ1RVQVRJT04JJFBVTkNUVUFUSU9OCisjZGVmaW5lIENPTkZfV1MJCQkkV1MKKyNkZWZpbmUgQ09ORl9FU0MJCSRFU0MKKyNkZWZpbmUgQ09ORl9RVU9URQkJJFFVT1RFCisjZGVmaW5lIENPTkZfRFFVT1RFCQkkRFFVT1RFCisjZGVmaW5lIENPTkZfQ09NTUVOVAkJJENPTU1FTlQKKyNkZWZpbmUgQ09ORl9GQ09NTUVOVAkJJEZDT01NRU5UCisjZGVmaW5lIENPTkZfRU9GCQkkRU9GCisjZGVmaW5lIENPTkZfSElHSEJJVAkJJEhJR0hCSVQKKyNkZWZpbmUgQ09ORl9BTFBIQQkJKENPTkZfVVBQRVJ8Q09ORl9MT1dFUikKKyNkZWZpbmUgQ09ORl9BTFBIQV9OVU1FUklDCShDT05GX0FMUEhBfENPTkZfTlVNQkVSfENPTkZfVU5ERVIpCisjZGVmaW5lIENPTkZfQUxQSEFfTlVNRVJJQ19QVU5DVCAoQ09ORl9BTFBIQXxDT05GX05VTUJFUnxDT05GX1VOREVSfCBcXAorCQkJCQlDT05GX1BVTkNUVUFUSU9OKQorCisjZGVmaW5lIEtFWVRZUEVTKGMpCQkoKHVuc2lnbmVkIHNob3J0ICopKChjKS0+bWV0aF9kYXRhKSkKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKyNkZWZpbmUgSVNfQ09NTUVOVChjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfQ09NTUVOVCkKKyNkZWZpbmUgSVNfRkNPTU1FTlQoYyxhKQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfRkNPTU1FTlQpCisjZGVmaW5lIElTX0VPRihjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfRU9GKQorI2RlZmluZSBJU19FU0MoYyxhKQkJKEtFWVRZUEVTKGMpWyhhKSYweGZmXSZDT05GX0VTQykKKyNkZWZpbmUgSVNfTlVNQkVSKGMsYSkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9OVU1CRVIpCisjZGVmaW5lIElTX1dTKGMsYSkJCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9XUykKKyNkZWZpbmUgSVNfQUxQSEFfTlVNRVJJQyhjLGEpCShLRVlUWVBFUyhjKVsoYSkmMHhmZl0mQ09ORl9BTFBIQV9OVU1FUklDKQorI2RlZmluZSBJU19BTFBIQV9OVU1FUklDX1BVTkNUKGMsYSkgXFwKKwkJCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfQUxQSEFfTlVNRVJJQ19QVU5DVCkKKyNkZWZpbmUgSVNfUVVPVEUoYyxhKQkJKEtFWVRZUEVTKGMpWyhhKSYweGZmXSZDT05GX1FVT1RFKQorI2RlZmluZSBJU19EUVVPVEUoYyxhKQkJKEtFWVRZUEVTKGMpWyhhKSYweGZmXSZDT05GX0RRVU9URSkKKyNkZWZpbmUgSVNfSElHSEJJVChjLGEpCQkoS0VZVFlQRVMoYylbKGEpJjB4ZmZdJkNPTkZfSElHSEJJVCkKKworI2Vsc2UgLypDSEFSU0VUX0VCQ0RJQyovCisKKyNkZWZpbmUgSVNfQ09NTUVOVChjLGEpCQkoS0VZVFlQRVMoYylbb3NfdG9hc2NpaVthXSYweGZmXSZDT05GX0NPTU1FTlQpCisjZGVmaW5lIElTX0ZDT01NRU5UKGMsYSkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9GQ09NTUVOVCkKKyNkZWZpbmUgSVNfRU9GKGMsYSkJCShLRVlUWVBFUyhjKVtvc190b2FzY2lpW2FdJjB4ZmZdJkNPTkZfRU9GKQorI2RlZmluZSBJU19FU0MoYyxhKQkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9FU0MpCisjZGVmaW5lIElTX05VTUJFUihjLGEpCQkoS0VZVFlQRVMoYylbb3NfdG9hc2NpaVthXSYweGZmXSZDT05GX05VTUJFUikKKyNkZWZpbmUgSVNfV1MoYyxhKQkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9XUykKKyNkZWZpbmUgSVNfQUxQSEFfTlVNRVJJQyhjLGEpCShLRVlUWVBFUyhjKVtvc190b2FzY2lpW2FdJjB4ZmZdJkNPTkZfQUxQSEFfTlVNRVJJQykKKyNkZWZpbmUgSVNfQUxQSEFfTlVNRVJJQ19QVU5DVChjLGEpIFxcCisJCQkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9BTFBIQV9OVU1FUklDX1BVTkNUKQorI2RlZmluZSBJU19RVU9URShjLGEpCQkoS0VZVFlQRVMoYylbb3NfdG9hc2NpaVthXSYweGZmXSZDT05GX1FVT1RFKQorI2RlZmluZSBJU19EUVVPVEUoYyxhKQkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9EUVVPVEUpCisjZGVmaW5lIElTX0hJR0hCSVQoYyxhKQkJKEtFWVRZUEVTKGMpW29zX3RvYXNjaWlbYV0mMHhmZl0mQ09ORl9ISUdIQklUKQorI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLworCitFT0YKKworcHJpbnQgInN0YXRpYyB1bnNpZ25lZCBzaG9ydCBDT05GX3R5cGVfZGVmYXVsdFsyNTZdPXsiOworCitmb3IgKCRpPTA7ICRpPDI1NjsgJGkrKykKKwl7CisJcHJpbnQgIlxuXHQiIGlmICgkaSAlIDgpID09IDA7CisJcHJpbnRmICIweCUwNFgsIiwkVl9kZWZbJGldOworCX0KKworcHJpbnQgIlxuXHR9O1xuXG4iOworCitwcmludCAic3RhdGljIHVuc2lnbmVkIHNob3J0IENPTkZfdHlwZV93aW4zMlsyNTZdPXsiOworCitmb3IgKCRpPTA7ICRpPDI1NjsgJGkrKykKKwl7CisJcHJpbnQgIlxuXHQiIGlmICgkaSAlIDgpID09IDA7CisJcHJpbnRmICIweCUwNFgsIiwkVl93MzJbJGldOworCX0KKworcHJpbnQgIlxuXHR9O1xuXG4iOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NvbmYvc3NsZWF5LmNuZiBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL3NzbGVheS5jbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzM2FmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL3NzbGVheS5jbmYKQEAgLTAsMCArMSw3OCBAQAorIworIyBUaGlzIGlzIGEgdGVzdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHVzZSBpbiBTU0xlYXkgZXRjLi4uCisjCisKK2luaXQgPSA1CitpblwjaXQxID0xMAoraW5pdDI9JzEwJworaW5pdDM9JzEwXCcnCitpbml0ND0iMTAnIgoraW5pdDU9Jz0nMTBcJycgYWdhaW4nCisKK1NTTGVheTo6dmVyc2lvbiA9IDAuNS4wCisKK1tnZW5yc2FdCitkZWZhdWx0X2JpdHMJPSA1MTIKK1NTTEVBWTo6dmVyc2lvbiA9IDAuNS4wCisKK1tnZW5kaF0KK2RlZmF1bHRfYml0cwk9IDUxMgorZGVmX2dlbmVyYXRvcgk9IDIKKworW3NfY2xpZW50XQorY2lwaGVyMQkJPSBERVNfQ0JDX01ENTpERVNfQ0JDX1NIQTpERVNfRURFX1NIQTpSQzRfTUQ1XAorY2lwaGVyMgkJPSAnREVTX0NCQ19NRDUgREVTX0NCQ19TSEEgREVTX0VERV9TSEEgUkM0X01ENScKK2NpcGhlcjMJCT0gIkRFU19DQkNfTUQ1IERFU19DQkNfU0hBIERFU19FREVfU0hBIFJDNF9NRDUiCitjaXBoZXI0CQk9IERFU19DQkNfTUQ1IERFU19DQkNfU0hBIERFU19FREVfU0hBIFJDNF9NRDUKKworWyBkZWZhdWx0IF0KK2NlcnRfZGlyCT0gJEVOVjo6SE9NRS8uY2FfY2VydHMKKworSE9NRQkJPSAvdG1wL2VheQorCit0bXBfY2VydF9kaXIJPSAkSE9NRS8uY2FfY2VydHMKK3RtcDJfY2VydF9kaXIJPSB0aGlzaXMkKEhPTUUpc3R1ZmYKKworTE9HTkFNRQk9IEVyaWMgWW91bmcgKGhvbWU9JEhPTUUpCisKK1sgc3BlY2lhbCBdCisKK0g9JEhPTUUKK0g9JGRlZmF1bHQ6OkhPTUUKK0g9JEVOVjo6SE9NRQorIworIyBTU0xlYXkgZXhhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUuCisjIFRoaXMgaXMgbW9zdGx5IGJlaW5nIHVzZWQgZm9yIGdlbmVyYXRpb24gb2YgY2VydGlmaWNhdGUgcmVxdWVzdHMuCisjCisKK1JBTkRGSUxFCQk9ICRIT01FLy5yYW5kCisKK1sgcmVxIF0KK2RlZmF1bHRfYml0cwkJPSA1MTIKK2RlZmF1bHRfa2V5ZmlsZSAJPSBwcml2a2V5LnBlbQorCitBdHRyaWJ1dGVfdHlwZV8xCT0gY291bnRyeU5hbWUKK0F0dHJpYnV0ZV90ZXh0XzEJPSBDb3VudHJ5IE5hbWUgKDIgbGV0dGVyIGNvZGUpCitBdHRyaWJ1dGVfZGVmYXVsdF8xCT0gQVUKKworQXR0cmlidXRlX3R5cGVfMgk9IHN0YXRlT3JQcm92aW5jZU5hbWUKK0F0dHJpYnV0ZV90ZXh0XzIJPSBTdGF0ZSBvciBQcm92aW5jZSBOYW1lIChmdWxsIG5hbWUpCitBdHRyaWJ1dGVfZGVmYXVsdF8yCT0gUXVlZW5zbGFuZAorCitBdHRyaWJ1dGVfdHlwZV8zCT0gbG9jYWxpdHlOYW1lCitBdHRyaWJ1dGVfdGV4dF8zCT0gTG9jYWxpdHkgTmFtZSAoZWcsIGNpdHkpCisKK0F0dHJpYnV0ZV90eXBlXzQJPSBvcmdhbml6YXRpb25OYW1lCitBdHRyaWJ1dGVfdGV4dF80CT0gT3JnYW5pemF0aW9uIE5hbWUgKGVnLCBjb21wYW55KQorQXR0cmlidXRlX2RlZmF1bHRfNAk9IE1pbmNvbSBQdHkgTHRkCisKK0F0dHJpYnV0ZV90eXBlXzUJPSBvcmdhbml6YXRpb25hbFVuaXROYW1lCitBdHRyaWJ1dGVfdGV4dF81CT0gT3JnYW5pemF0aW9uYWwgVW5pdCBOYW1lIChlZywgc2VjdGlvbikKK0F0dHJpYnV0ZV9kZWZhdWx0XzUJPSBUUgorCitBdHRyaWJ1dGVfdHlwZV82CT0gY29tbW9uTmFtZQorQXR0cmlidXRlX3RleHRfNgk9IENvbW1vbiBOYW1lIChlZywgWU9VUiBuYW1lKQorCitBdHRyaWJ1dGVfdHlwZV83CT0gZW1haWxBZGRyZXNzCitBdHRyaWJ1dGVfdGV4dF83CT0gRW1haWwgQWRkcmVzcworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi90ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vY29uZi90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhYjg1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jb25mL3Rlc3QuYwpAQCAtMCwwICsxLDk4IEBACisvKiBjcnlwdG8vY29uZi90ZXN0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworbWFpbigpCisJeworCUxIQVNIICpjb25mOworCWxvbmcgZWxpbmU7CisJY2hhciAqcywqczI7CisKKyNpZmRlZiBVU0VfV0lOMzIKKwlDT05GX3NldF9kZWZhdWx0X21ldGhvZChDT05GX1dJTjMyKTsKKyNlbmRpZgorCWNvbmY9Q09ORl9sb2FkKE5VTEwsInNzbGVheS5jbmYiLCZlbGluZSk7CisJaWYgKGNvbmYgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCQlwcmludGYoInVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24sIGxpbmUgJWxkXG4iLGVsaW5lKTsKKwkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCQlleGl0KDEpOworCQl9CisJbGhfc3RhdHMoY29uZixzdGRvdXQpOworCWxoX25vZGVfc3RhdHMoY29uZixzdGRvdXQpOworCWxoX25vZGVfdXNhZ2Vfc3RhdHMoY29uZixzdGRvdXQpOworCisJcz1DT05GX2dldF9zdHJpbmcoY29uZixOVUxMLCJpbml0MiIpOworCXByaW50ZigiaW5pdDI9JXNcbiIsKHMgPT0gTlVMTCk/Ik5VTEwiOnMpOworCisJcz1DT05GX2dldF9zdHJpbmcoY29uZixOVUxMLCJjaXBoZXIxIik7CisJcHJpbnRmKCJjaXBoZXIxPSVzXG4iLChzID09IE5VTEwpPyJOVUxMIjpzKTsKKworCXM9Q09ORl9nZXRfc3RyaW5nKGNvbmYsInNfY2xpZW50IiwiY2lwaGVyMSIpOworCXByaW50Zigic19jbGllbnQ6Y2lwaGVyMT0lc1xuIiwocyA9PSBOVUxMKT8iTlVMTCI6cyk7CisKKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRFVNUCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCUNPTkZfZHVtcF9mcChjb25mLCBzdGRvdXQpOworCisJZXhpdCgwKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vY3B0X2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2NwdF9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzliOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2NwdF9lcnIuYwpAQCAtMCwwICsxLDEwMyBAQAorLyogY3J5cHRvL2NwdF9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfQ1JZUFRPLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfQ1JZUFRPLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIENSWVBUT19zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKENSWVBUT19GX0NSWVBUT19HRVRfRVhfTkVXX0lOREVYKSwJIkNSWVBUT19nZXRfZXhfbmV3X2luZGV4In0sCit7RVJSX0ZVTkMoQ1JZUFRPX0ZfQ1JZUFRPX0dFVF9ORVdfRFlOTE9DS0lEKSwJIkNSWVBUT19nZXRfbmV3X2R5bmxvY2tpZCJ9LAore0VSUl9GVU5DKENSWVBUT19GX0NSWVBUT19HRVRfTkVXX0xPQ0tJRCksCSJDUllQVE9fZ2V0X25ld19sb2NraWQifSwKK3tFUlJfRlVOQyhDUllQVE9fRl9DUllQVE9fU0VUX0VYX0RBVEEpLAkiQ1JZUFRPX3NldF9leF9kYXRhIn0sCit7RVJSX0ZVTkMoQ1JZUFRPX0ZfREVGX0FERF9JTkRFWCksCSJERUZfQUREX0lOREVYIn0sCit7RVJSX0ZVTkMoQ1JZUFRPX0ZfREVGX0dFVF9DTEFTUyksCSJERUZfR0VUX0NMQVNTIn0sCit7RVJSX0ZVTkMoQ1JZUFRPX0ZfSU5UX0RVUF9FWF9EQVRBKSwJIklOVF9EVVBfRVhfREFUQSJ9LAore0VSUl9GVU5DKENSWVBUT19GX0lOVF9GUkVFX0VYX0RBVEEpLAkiSU5UX0ZSRUVfRVhfREFUQSJ9LAore0VSUl9GVU5DKENSWVBUT19GX0lOVF9ORVdfRVhfREFUQSksCSJJTlRfTkVXX0VYX0RBVEEifSwKK3swLE5VTEx9CisJfTsKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBDUllQVE9fc3RyX3JlYXNvbnNbXT0KKwl7Cit7RVJSX1JFQVNPTihDUllQVE9fUl9OT19EWU5MT0NLX0NSRUFURV9DQUxMQkFDSyksIm5vIGR5bmxvY2sgY3JlYXRlIGNhbGxiYWNrIn0sCit7MCxOVUxMfQorCX07CisKKyNlbmRpZgorCit2b2lkIEVSUl9sb2FkX0NSWVBUT19zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhDUllQVE9fc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsQ1JZUFRPX3N0cl9mdW5jdHMpOworCQlFUlJfbG9hZF9zdHJpbmdzKDAsQ1JZUFRPX3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NyeXB0bGliLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vY3J5cHRsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDQ0OWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2NyeXB0bGliLmMKQEAgLTAsMCArMSw4OTcgQEAKKy8qIGNyeXB0by9jcnlwdGxpYi5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBFQ0RIIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvc2FmZXN0YWNrLmg+CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjE2KQorc3RhdGljIGRvdWJsZSBTU0xlYXlfTVNWQzVfaGFjaz0wLjA7IC8qIGFuZCBmb3IgVkMxLjUgKi8KKyNlbmRpZgorCitERUNMQVJFX1NUQUNLX09GKENSWVBUT19keW5sb2NrKQorCisvKiByZWFsICNkZWZpbmVzIGluIGNyeXB0by5oLCBrZWVwIHRoZXNlIHVwdG8gZGF0ZSAqLworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGxvY2tfbmFtZXNbQ1JZUFRPX05VTV9MT0NLU10gPQorCXsKKwkiPDxFUlJPUj4+IiwKKwkiZXJyIiwKKwkiZXhfZGF0YSIsCisJIng1MDkiLAorCSJ4NTA5X2luZm8iLAorCSJ4NTA5X3BrZXkiLAorCSJ4NTA5X2NybCIsCisJIng1MDlfcmVxIiwKKwkiZHNhIiwKKwkicnNhIiwKKwkiZXZwX3BrZXkiLAorCSJ4NTA5X3N0b3JlIiwKKwkic3NsX2N0eCIsCisJInNzbF9jZXJ0IiwKKwkic3NsX3Nlc3Npb24iLAorCSJzc2xfc2Vzc19jZXJ0IiwKKwkic3NsIiwKKwkic3NsX21ldGhvZCIsCisJInJhbmQiLAorCSJyYW5kMiIsCisJImRlYnVnX21hbGxvYyIsCisJIkJJTyIsCisJImdldGhvc3RieW5hbWUiLAorCSJnZXRzZXJ2YnluYW1lIiwKKwkicmVhZGRpciIsCisJIlJTQV9ibGluZGluZyIsCisJImRoIiwKKwkiZGVidWdfbWFsbG9jMiIsCisJImRzbyIsCisJImR5bmxvY2siLAorCSJlbmdpbmUiLAorCSJ1aSIsCisJImVjZHNhIiwKKwkiZWMiLAorCSJlY2RoIiwKKwkiYm4iLAorCSJlY19wcmVfY29tcCIsCisJInN0b3JlIiwKKwkiY29tcCIsCisJImZpcHMiLAorCSJmaXBzMiIsCisjaWYgQ1JZUFRPX05VTV9MT0NLUyAhPSA0MQorIyBlcnJvciAiSW5jb25zaXN0ZW5jeSBiZXR3ZWVuIGNyeXB0by5oIGFuZCBjcnlwdGxpYi5jIgorI2VuZGlmCisJfTsKKworLyogVGhpcyBpcyBmb3IgYXBwbGljYXRpb25zIHRvIGFsbG9jYXRlIG5ldyB0eXBlIG5hbWVzIGluIHRoZSBub24tZHluYW1pYworICAgYXJyYXkgb2YgbG9jayBuYW1lcy4gIFRoZXNlIGFyZSBudW1iZXJlZCB3aXRoIHBvc2l0aXZlIG51bWJlcnMuICAqLworc3RhdGljIFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqYXBwX2xvY2tzPU5VTEw7CisKKy8qIEZvciBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IGEgbW9yZSBkeW5hbWljIHdheSBvZiBoYW5kbGluZyB0aHJlYWRzLCB0aGUKKyAgIGZvbGxvd2luZyBzdGFjayBpcyB1c2VkLiAgVGhlc2UgYXJlIGV4dGVybmFsbHkgbnVtYmVyZWQgd2l0aCBuZWdhdGl2ZQorICAgbnVtYmVycy4gICovCitzdGF0aWMgU1RBQ0tfT0YoQ1JZUFRPX2R5bmxvY2spICpkeW5fbG9ja3M9TlVMTDsKKworCitzdGF0aWMgdm9pZCAoTVNfRkFSICpsb2NraW5nX2NhbGxiYWNrKShpbnQgbW9kZSxpbnQgdHlwZSwKKwljb25zdCBjaGFyICpmaWxlLGludCBsaW5lKT0wOworc3RhdGljIGludCAoTVNfRkFSICphZGRfbG9ja19jYWxsYmFjaykoaW50ICpwb2ludGVyLGludCBhbW91bnQsCisJaW50IHR5cGUsY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk9MDsKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitzdGF0aWMgdW5zaWduZWQgbG9uZyAoTVNfRkFSICppZF9jYWxsYmFjaykodm9pZCk9MDsKKyNlbmRpZgorc3RhdGljIHZvaWQgKE1TX0ZBUiAqdGhyZWFkaWRfY2FsbGJhY2spKENSWVBUT19USFJFQURJRCAqKT0wOworc3RhdGljIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqKE1TX0ZBUiAqZHlubG9ja19jcmVhdGVfY2FsbGJhY2spCisJKGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpPTA7CitzdGF0aWMgdm9pZCAoTVNfRkFSICpkeW5sb2NrX2xvY2tfY2FsbGJhY2spKGludCBtb2RlLAorCXN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk9MDsKK3N0YXRpYyB2b2lkIChNU19GQVIgKmR5bmxvY2tfZGVzdHJveV9jYWxsYmFjaykoc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpsLAorCWNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpPTA7CisKK2ludCBDUllQVE9fZ2V0X25ld19sb2NraWQoY2hhciAqbmFtZSkKKwl7CisJY2hhciAqc3RyOworCWludCBpOworCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4xNikKKwkvKiBBIGhhY2sgdG8gbWFrZSBWaXN1YWwgQysrIDUuMCB3b3JrIGNvcnJlY3RseSB3aGVuIGxpbmtpbmcgYXMKKwkgKiBhIERMTCB1c2luZyAvTVQuIFdpdGhvdXQgdGhpcywgdGhlIGFwcGxpY2F0aW9uIGNhbm5vdCB1c2UKKwkgKiBhbnkgZmxvYXRpbmcgcG9pbnQgcHJpbnRmJ3MuCisJICogSXQgYWxzbyBzZWVtcyB0byBiZSBuZWVkZWQgZm9yIFZpc3VhbCBDIDEuNSAod2luMTYpICovCisJU1NMZWF5X01TVkM1X2hhY2s9KGRvdWJsZSluYW1lWzBdKihkb3VibGUpbmFtZVsxXTsKKyNlbmRpZgorCisJaWYgKChhcHBfbG9ja3MgPT0gTlVMTCkgJiYgKChhcHBfbG9ja3M9c2tfT1BFTlNTTF9TVFJJTkdfbmV3X251bGwoKSkgPT0gTlVMTCkpCisJCXsKKwkJQ1JZUFRPZXJyKENSWVBUT19GX0NSWVBUT19HRVRfTkVXX0xPQ0tJRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybigwKTsKKwkJfQorCWlmICgoc3RyPUJVRl9zdHJkdXAobmFtZSkpID09IE5VTEwpCisJCXsKKwkJQ1JZUFRPZXJyKENSWVBUT19GX0NSWVBUT19HRVRfTkVXX0xPQ0tJRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybigwKTsKKwkJfQorCWk9c2tfT1BFTlNTTF9TVFJJTkdfcHVzaChhcHBfbG9ja3Msc3RyKTsKKwlpZiAoIWkpCisJCU9QRU5TU0xfZnJlZShzdHIpOworCWVsc2UKKwkJaSs9Q1JZUFRPX05VTV9MT0NLUzsgLyogZ2FwIG9mIG9uZSA6LSkgKi8KKwlyZXR1cm4oaSk7CisJfQorCitpbnQgQ1JZUFRPX251bV9sb2Nrcyh2b2lkKQorCXsKKwlyZXR1cm4gQ1JZUFRPX05VTV9MT0NLUzsKKwl9CisKK2ludCBDUllQVE9fZ2V0X25ld19keW5sb2NraWQodm9pZCkKKwl7CisJaW50IGkgPSAwOworCUNSWVBUT19keW5sb2NrICpwb2ludGVyID0gTlVMTDsKKworCWlmIChkeW5sb2NrX2NyZWF0ZV9jYWxsYmFjayA9PSBOVUxMKQorCQl7CisJCUNSWVBUT2VycihDUllQVE9fRl9DUllQVE9fR0VUX05FV19EWU5MT0NLSUQsQ1JZUFRPX1JfTk9fRFlOTE9DS19DUkVBVEVfQ0FMTEJBQ0spOworCQlyZXR1cm4oMCk7CisJCX0KKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0RZTkxPQ0spOworCWlmICgoZHluX2xvY2tzID09IE5VTEwpCisJCSYmICgoZHluX2xvY2tzPXNrX0NSWVBUT19keW5sb2NrX25ld19udWxsKCkpID09IE5VTEwpKQorCQl7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19EWU5MT0NLKTsKKwkJQ1JZUFRPZXJyKENSWVBUT19GX0NSWVBUT19HRVRfTkVXX0RZTkxPQ0tJRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybigwKTsKKwkJfQorCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19EWU5MT0NLKTsKKworCXBvaW50ZXIgPSAoQ1JZUFRPX2R5bmxvY2sgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQ1JZUFRPX2R5bmxvY2spKTsKKwlpZiAocG9pbnRlciA9PSBOVUxMKQorCQl7CisJCUNSWVBUT2VycihDUllQVE9fRl9DUllQVE9fR0VUX05FV19EWU5MT0NLSUQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwlwb2ludGVyLT5yZWZlcmVuY2VzID0gMTsKKwlwb2ludGVyLT5kYXRhID0gZHlubG9ja19jcmVhdGVfY2FsbGJhY2soX19GSUxFX18sX19MSU5FX18pOworCWlmIChwb2ludGVyLT5kYXRhID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHBvaW50ZXIpOworCQlDUllQVE9lcnIoQ1JZUFRPX0ZfQ1JZUFRPX0dFVF9ORVdfRFlOTE9DS0lELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0RZTkxPQ0spOworCS8qIEZpcnN0LCB0cnkgdG8gZmluZCBhbiBleGlzdGluZyBlbXB0eSBzbG90ICovCisJaT1za19DUllQVE9fZHlubG9ja19maW5kKGR5bl9sb2NrcyxOVUxMKTsKKwkvKiBJZiB0aGVyZSB3YXMgbm9uZSwgcHVzaCwgdGhlcmVieSBjcmVhdGluZyBhIG5ldyBvbmUgKi8KKwlpZiAoaSA9PSAtMSkKKwkJLyogU2luY2Ugc2tfcHVzaCgpIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBvbiB0aGUKKwkJICAgc3RhY2ssIG5vdCB0aGUgbG9jYXRpb24gb2YgdGhlIHB1c2hlZCBpdGVtLCB3ZSBuZWVkCisJCSAgIHRvIHRyYW5zZm9ybSB0aGUgcmV0dXJuZWQgbnVtYmVyIGludG8gYSBwb3NpdGlvbiwKKwkJICAgYnkgZGVjcmVhc2luZyBpdC4gICovCisJCWk9c2tfQ1JZUFRPX2R5bmxvY2tfcHVzaChkeW5fbG9ja3MscG9pbnRlcikgLSAxOworCWVsc2UKKwkJLyogSWYgd2UgZm91bmQgYSBwbGFjZSB3aXRoIGEgTlVMTCBwb2ludGVyLCBwdXQgb3VyIHBvaW50ZXIKKwkJICAgaW4gaXQuICAqLworCQkodm9pZClza19DUllQVE9fZHlubG9ja19zZXQoZHluX2xvY2tzLGkscG9pbnRlcik7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0RZTkxPQ0spOworCisJaWYgKGkgPT0gLTEpCisJCXsKKwkJZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKHBvaW50ZXItPmRhdGEsX19GSUxFX18sX19MSU5FX18pOworCQlPUEVOU1NMX2ZyZWUocG9pbnRlcik7CisJCX0KKwllbHNlCisJCWkgKz0gMTsgLyogdG8gYXZvaWQgMCAqLworCXJldHVybiAtaTsKKwl9CisKK3ZvaWQgQ1JZUFRPX2Rlc3Ryb3lfZHlubG9ja2lkKGludCBpKQorCXsKKwlDUllQVE9fZHlubG9jayAqcG9pbnRlciA9IE5VTEw7CisJaWYgKGkpCisJCWkgPSAtaS0xOworCWlmIChkeW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19EWU5MT0NLKTsKKworCWlmIChkeW5fbG9ja3MgPT0gTlVMTCB8fCBpID49IHNrX0NSWVBUT19keW5sb2NrX251bShkeW5fbG9ja3MpKQorCQl7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19EWU5MT0NLKTsKKwkJcmV0dXJuOworCQl9CisJcG9pbnRlciA9IHNrX0NSWVBUT19keW5sb2NrX3ZhbHVlKGR5bl9sb2NrcywgaSk7CisJaWYgKHBvaW50ZXIgIT0gTlVMTCkKKwkJeworCQktLXBvaW50ZXItPnJlZmVyZW5jZXM7CisjaWZkZWYgUkVGX0NIRUNLCisJCWlmIChwb2ludGVyLT5yZWZlcmVuY2VzIDwgMCkKKwkJCXsKKwkJCWZwcmludGYoc3RkZXJyLCJDUllQVE9fZGVzdHJveV9keW5sb2NraWQsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQkJYWJvcnQoKTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisJCQlpZiAocG9pbnRlci0+cmVmZXJlbmNlcyA8PSAwKQorCQkJCXsKKwkJCQkodm9pZClza19DUllQVE9fZHlubG9ja19zZXQoZHluX2xvY2tzLCBpLCBOVUxMKTsKKwkJCQl9CisJCQllbHNlCisJCQkJcG9pbnRlciA9IE5VTEw7CisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRFlOTE9DSyk7CisKKwlpZiAocG9pbnRlcikKKwkJeworCQlkeW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2socG9pbnRlci0+ZGF0YSxfX0ZJTEVfXyxfX0xJTkVfXyk7CisJCU9QRU5TU0xfZnJlZShwb2ludGVyKTsKKwkJfQorCX0KKworc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpDUllQVE9fZ2V0X2R5bmxvY2tfdmFsdWUoaW50IGkpCisJeworCUNSWVBUT19keW5sb2NrICpwb2ludGVyID0gTlVMTDsKKwlpZiAoaSkKKwkJaSA9IC1pLTE7CisKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0RZTkxPQ0spOworCisJaWYgKGR5bl9sb2NrcyAhPSBOVUxMICYmIGkgPCBza19DUllQVE9fZHlubG9ja19udW0oZHluX2xvY2tzKSkKKwkJcG9pbnRlciA9IHNrX0NSWVBUT19keW5sb2NrX3ZhbHVlKGR5bl9sb2NrcywgaSk7CisJaWYgKHBvaW50ZXIpCisJCXBvaW50ZXItPnJlZmVyZW5jZXMrKzsKKworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19EWU5MT0NLKTsKKworCWlmIChwb2ludGVyKQorCQlyZXR1cm4gcG9pbnRlci0+ZGF0YTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKK3N0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqKCpDUllQVE9fZ2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKHZvaWQpKQorCShjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKQorCXsKKwlyZXR1cm4oZHlubG9ja19jcmVhdGVfY2FsbGJhY2spOworCX0KKwordm9pZCAoKkNSWVBUT19nZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKHZvaWQpKShpbnQgbW9kZSwKKwlzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpCisJeworCXJldHVybihkeW5sb2NrX2xvY2tfY2FsbGJhY2spOworCX0KKwordm9pZCAoKkNSWVBUT19nZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKHZvaWQpKQorCShzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpCisJeworCXJldHVybihkeW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2spOworCX0KKwordm9pZCBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqKCpmdW5jKQorCShjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkpCisJeworCWR5bmxvY2tfY3JlYXRlX2NhbGxiYWNrPWZ1bmM7CisJfQorCit2b2lkIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKHZvaWQgKCpmdW5jKShpbnQgbW9kZSwKKwlzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSkKKwl7CisJZHlubG9ja19sb2NrX2NhbGxiYWNrPWZ1bmM7CisJfQorCit2b2lkIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKHZvaWQgKCpmdW5jKQorCShzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSkKKwl7CisJZHlubG9ja19kZXN0cm95X2NhbGxiYWNrPWZ1bmM7CisJfQorCisKK3ZvaWQgKCpDUllQVE9fZ2V0X2xvY2tpbmdfY2FsbGJhY2sodm9pZCkpKGludCBtb2RlLGludCB0eXBlLGNvbnN0IGNoYXIgKmZpbGUsCisJCWludCBsaW5lKQorCXsKKwlyZXR1cm4obG9ja2luZ19jYWxsYmFjayk7CisJfQorCitpbnQgKCpDUllQVE9fZ2V0X2FkZF9sb2NrX2NhbGxiYWNrKHZvaWQpKShpbnQgKm51bSxpbnQgbW91bnQsaW50IHR5cGUsCisJCQkJCSAgY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSkKKwl7CisJcmV0dXJuKGFkZF9sb2NrX2NhbGxiYWNrKTsKKwl9CisKK3ZvaWQgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKHZvaWQgKCpmdW5jKShpbnQgbW9kZSxpbnQgdHlwZSwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSkpCisJeworCWxvY2tpbmdfY2FsbGJhY2s9ZnVuYzsKKwl9CisKK3ZvaWQgQ1JZUFRPX3NldF9hZGRfbG9ja19jYWxsYmFjayhpbnQgKCpmdW5jKShpbnQgKm51bSxpbnQgbW91bnQsaW50IHR5cGUsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpKQorCXsKKwlhZGRfbG9ja19jYWxsYmFjaz1mdW5jOworCX0KKworLyogdGhlIG1lbXNldCgpIGhlcmUgYW5kIGluIHNldF9wb2ludGVyKCkgc2VlbSBvdmVya2lsbCwgYnV0IGZvciB0aGUgc2FrZSBvZgorICogQ1JZUFRPX1RIUkVBRElEX2NtcCgpIHRoaXMgYXZvaWRzIGFueSBwbGF0Zm9ybSBzaWxsaW5lc3MgdGhhdCBtaWdodCBjYXVzZSB0d28KKyAqICJlcXVhbCIgVEhSRUFESUQgc3RydWN0cyB0byBub3QgYmUgbWVtY21wKCktaWRlbnRpY2FsLiAqLwordm9pZCBDUllQVE9fVEhSRUFESURfc2V0X251bWVyaWMoQ1JZUFRPX1RIUkVBRElEICppZCwgdW5zaWduZWQgbG9uZyB2YWwpCisJeworCW1lbXNldChpZCwgMCwgc2l6ZW9mKCppZCkpOworCWlkLT52YWwgPSB2YWw7CisJfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBoYXNoX2NvZWZmc1tdID0geyAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMgfTsKK3ZvaWQgQ1JZUFRPX1RIUkVBRElEX3NldF9wb2ludGVyKENSWVBUT19USFJFQURJRCAqaWQsIHZvaWQgKnB0cikKKwl7CisJdW5zaWduZWQgY2hhciAqZGVzdCA9ICh2b2lkICopJmlkLT52YWw7CisJdW5zaWduZWQgaW50IGFjY3VtID0gMDsKKwl1bnNpZ25lZCBjaGFyIGRudW0gPSBzaXplb2YoaWQtPnZhbCk7CisKKwltZW1zZXQoaWQsIDAsIHNpemVvZigqaWQpKTsKKwlpZC0+cHRyID0gcHRyOworCWlmIChzaXplb2YoaWQtPnZhbCkgPj0gc2l6ZW9mKGlkLT5wdHIpKQorCQl7CisJCS8qICdwdHInIGNhbiBiZSBlbWJlZGRlZCBpbiAndmFsJyB3aXRob3V0IGxvc3Mgb2YgdW5pcXVlbmVzcyAqLworCQlpZC0+dmFsID0gKHVuc2lnbmVkIGxvbmcpaWQtPnB0cjsKKwkJcmV0dXJuOworCQl9CisJLyogaGFzaCBwdHIgPT0+IHZhbC4gRWFjaCBieXRlIG9mICd2YWwnIGdldHMgdGhlIG1vZC0yNTYgdG90YWwgb2YgYQorCSAqIGxpbmVhciBmdW5jdGlvbiBvdmVyIHRoZSBieXRlcyBpbiAncHRyJywgdGhlIGNvLWVmZmljaWVudHMgb2Ygd2hpY2gKKwkgKiBhcmUgYSBzZXF1ZW5jZSBvZiBsb3ctcHJpbWVzIChoYXNoX2NvZWZmcyBpcyBhbiA4LWVsZW1lbnQgY3ljbGUpIC0KKwkgKiB0aGUgc3RhcnRpbmcgcHJpbWUgZm9yIHRoZSBzZXF1ZW5jZSB2YXJpZXMgZm9yIGVhY2ggYnl0ZSBvZiAndmFsJworCSAqICh1bmlxdWUgcG9seW5vbWlhbHMgdW5sZXNzIHBvaW50ZXJzIGFyZSA+NjQtYml0KS4gRm9yIGFkZGVkIHNwaWNlLAorCSAqIHRoZSB0b3RhbHMgYWNjdW11bGF0ZSByYXRoZXIgdGhhbiByZXN0YXJ0aW5nIGZyb20gemVybywgYW5kIHRoZSBpbmRleAorCSAqIG9mIHRoZSAndmFsJyBieXRlIGlzIGFkZGVkIGVhY2ggdGltZSAocG9zaXRpb24gZGVwZW5kZW5jZSkuIElmIEkgd2FzCisJICogYSBibGFjay1iZWx0LCBJJ2Qgc2NhbiBiaWctZW5kaWFuIHBvaW50ZXJzIGluIHJldmVyc2UgdG8gZ2l2ZQorCSAqIGxvdy1vcmRlciBiaXRzIG1vcmUgcGxheSwgYnV0IHRoaXMgaXNuJ3QgY3J5cHRvIGFuZCBJJ2QgcHJlZmVyIG5vYm9keQorCSAqIG1pc3Rha2UgaXQgYXMgc3VjaC4gUGx1cyBJJ20gbGF6eS4gKi8KKwl3aGlsZSAoZG51bS0tKQorCQl7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYyA9ICh2b2lkICopJmlkLT5wdHI7CisJCXVuc2lnbmVkIGNoYXIgc251bSA9IHNpemVvZihpZC0+cHRyKTsKKwkJd2hpbGUgKHNudW0tLSkKKwkJCWFjY3VtICs9ICooc3JjKyspICogaGFzaF9jb2VmZnNbKHNudW0gKyBkbnVtKSAmIDddOworCQlhY2N1bSArPSBkbnVtOworCQkqKGRlc3QrKykgPSBhY2N1bSAmIDI1NTsKKwkJfQorCX0KKworaW50IENSWVBUT19USFJFQURJRF9zZXRfY2FsbGJhY2sodm9pZCAoKmZ1bmMpKENSWVBUT19USFJFQURJRCAqKSkKKwl7CisJaWYgKHRocmVhZGlkX2NhbGxiYWNrKQorCQlyZXR1cm4gMDsKKwl0aHJlYWRpZF9jYWxsYmFjayA9IGZ1bmM7CisJcmV0dXJuIDE7CisJfQorCit2b2lkICgqQ1JZUFRPX1RIUkVBRElEX2dldF9jYWxsYmFjayh2b2lkKSkoQ1JZUFRPX1RIUkVBRElEICopCisJeworCXJldHVybiB0aHJlYWRpZF9jYWxsYmFjazsKKwl9CisKK3ZvaWQgQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoQ1JZUFRPX1RIUkVBRElEICppZCkKKwl7CisJaWYgKHRocmVhZGlkX2NhbGxiYWNrKQorCQl7CisJCXRocmVhZGlkX2NhbGxiYWNrKGlkKTsKKwkJcmV0dXJuOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorCS8qIElmIHRoZSBkZXByZWNhdGVkIGNhbGxiYWNrIHdhcyBzZXQsIGZhbGwgYmFjayB0byB0aGF0ICovCisJaWYgKGlkX2NhbGxiYWNrKQorCQl7CisJCUNSWVBUT19USFJFQURJRF9zZXRfbnVtZXJpYyhpZCwgaWRfY2FsbGJhY2soKSk7CisJCXJldHVybjsKKwkJfQorI2VuZGlmCisJLyogRWxzZSBwaWNrIGEgYmFja3VwICovCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMTYKKwlDUllQVE9fVEhSRUFESURfc2V0X251bWVyaWMoaWQsICh1bnNpZ25lZCBsb25nKUdldEN1cnJlbnRUYXNrKCkpOworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikKKwlDUllQVE9fVEhSRUFESURfc2V0X251bWVyaWMoaWQsICh1bnNpZ25lZCBsb25nKUdldEN1cnJlbnRUaHJlYWRJZCgpKTsKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfQkVPUykKKwlDUllQVE9fVEhSRUFESURfc2V0X251bWVyaWMoaWQsICh1bnNpZ25lZCBsb25nKWZpbmRfdGhyZWFkKE5VTEwpKTsKKyNlbHNlCisJLyogRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgZGVmYXVsdCB0byB1c2luZyB0aGUgYWRkcmVzcyBvZiAnZXJybm8nICovCisJQ1JZUFRPX1RIUkVBRElEX3NldF9wb2ludGVyKGlkLCAmZXJybm8pOworI2VuZGlmCisJfQorCitpbnQgQ1JZUFRPX1RIUkVBRElEX2NtcChjb25zdCBDUllQVE9fVEhSRUFESUQgKmEsIGNvbnN0IENSWVBUT19USFJFQURJRCAqYikKKwl7CisJcmV0dXJuIG1lbWNtcChhLCBiLCBzaXplb2YoKmEpKTsKKwl9CisKK3ZvaWQgQ1JZUFRPX1RIUkVBRElEX2NweShDUllQVE9fVEhSRUFESUQgKmRlc3QsIGNvbnN0IENSWVBUT19USFJFQURJRCAqc3JjKQorCXsKKwltZW1jcHkoZGVzdCwgc3JjLCBzaXplb2YoKnNyYykpOworCX0KKwordW5zaWduZWQgbG9uZyBDUllQVE9fVEhSRUFESURfaGFzaChjb25zdCBDUllQVE9fVEhSRUFESUQgKmlkKQorCXsKKwlyZXR1cm4gaWQtPnZhbDsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECit1bnNpZ25lZCBsb25nICgqQ1JZUFRPX2dldF9pZF9jYWxsYmFjayh2b2lkKSkodm9pZCkKKwl7CisJcmV0dXJuKGlkX2NhbGxiYWNrKTsKKwl9CisKK3ZvaWQgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayh1bnNpZ25lZCBsb25nICgqZnVuYykodm9pZCkpCisJeworCWlkX2NhbGxiYWNrPWZ1bmM7CisJfQorCit1bnNpZ25lZCBsb25nIENSWVBUT190aHJlYWRfaWQodm9pZCkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQ9MDsKKworCWlmIChpZF9jYWxsYmFjayA9PSBOVUxMKQorCQl7CisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMTYKKwkJcmV0PSh1bnNpZ25lZCBsb25nKUdldEN1cnJlbnRUYXNrKCk7CisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKQorCQlyZXQ9KHVuc2lnbmVkIGxvbmcpR2V0Q3VycmVudFRocmVhZElkKCk7CisjZWxpZiBkZWZpbmVkKEdFVFBJRF9JU19NRUFOSU5HTEVTUykKKwkJcmV0PTFMOworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TKQorCQlyZXQ9KHVuc2lnbmVkIGxvbmcpZmluZF90aHJlYWQoTlVMTCk7CisjZWxzZQorCQlyZXQ9KHVuc2lnbmVkIGxvbmcpZ2V0cGlkKCk7CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJcmV0PWlkX2NhbGxiYWNrKCk7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKK3ZvaWQgQ1JZUFRPX2xvY2soaW50IG1vZGUsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKwl7CisjaWZkZWYgTE9DS19ERUJVRworCQl7CisJCUNSWVBUT19USFJFQURJRCBpZDsKKwkJY2hhciAqcndfdGV4dCwqb3BlcmF0aW9uX3RleHQ7CisKKwkJaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKwkJCW9wZXJhdGlvbl90ZXh0PSJsb2NrICAiOworCQllbHNlIGlmIChtb2RlICYgQ1JZUFRPX1VOTE9DSykKKwkJCW9wZXJhdGlvbl90ZXh0PSJ1bmxvY2siOworCQllbHNlCisJCQlvcGVyYXRpb25fdGV4dD0iRVJST1IgIjsKKworCQlpZiAobW9kZSAmIENSWVBUT19SRUFEKQorCQkJcndfdGV4dD0iciI7CisJCWVsc2UgaWYgKG1vZGUgJiBDUllQVE9fV1JJVEUpCisJCQlyd190ZXh0PSJ3IjsKKwkJZWxzZQorCQkJcndfdGV4dD0iRVJST1IiOworCisJCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZpZCk7CisJCWZwcmludGYoc3RkZXJyLCJsb2NrOiUwOGx4OiglcyklcyAlLTE4cyAlczolZFxuIiwKKwkJCUNSWVBUT19USFJFQURJRF9oYXNoKCZpZCksIHJ3X3RleHQsIG9wZXJhdGlvbl90ZXh0LAorCQkJQ1JZUFRPX2dldF9sb2NrX25hbWUodHlwZSksIGZpbGUsIGxpbmUpOworCQl9CisjZW5kaWYKKwlpZiAodHlwZSA8IDApCisJCXsKKwkJaWYgKGR5bmxvY2tfbG9ja19jYWxsYmFjayAhPSBOVUxMKQorCQkJeworCQkJc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpwb2ludGVyCisJCQkJPSBDUllQVE9fZ2V0X2R5bmxvY2tfdmFsdWUodHlwZSk7CisKKwkJCU9QRU5TU0xfYXNzZXJ0KHBvaW50ZXIgIT0gTlVMTCk7CisKKwkJCWR5bmxvY2tfbG9ja19jYWxsYmFjayhtb2RlLCBwb2ludGVyLCBmaWxlLCBsaW5lKTsKKworCQkJQ1JZUFRPX2Rlc3Ryb3lfZHlubG9ja2lkKHR5cGUpOworCQkJfQorCQl9CisJZWxzZQorCQlpZiAobG9ja2luZ19jYWxsYmFjayAhPSBOVUxMKQorCQkJbG9ja2luZ19jYWxsYmFjayhtb2RlLHR5cGUsZmlsZSxsaW5lKTsKKwl9CisKK2ludCBDUllQVE9fYWRkX2xvY2soaW50ICpwb2ludGVyLCBpbnQgYW1vdW50LCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZSwKKwkgICAgIGludCBsaW5lKQorCXsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChhZGRfbG9ja19jYWxsYmFjayAhPSBOVUxMKQorCQl7CisjaWZkZWYgTE9DS19ERUJVRworCQlpbnQgYmVmb3JlPSAqcG9pbnRlcjsKKyNlbmRpZgorCisJCXJldD1hZGRfbG9ja19jYWxsYmFjayhwb2ludGVyLGFtb3VudCx0eXBlLGZpbGUsbGluZSk7CisjaWZkZWYgTE9DS19ERUJVRworCQl7CisJCUNSWVBUT19USFJFQURJRCBpZDsKKwkJQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoJmlkKTsKKwkJZnByaW50ZihzdGRlcnIsImxhZGQ6JTA4bHg6JTJkKyUyZC0+JTJkICUtMThzICVzOiVkXG4iLAorCQkJQ1JZUFRPX1RIUkVBRElEX2hhc2goJmlkKSwgYmVmb3JlLGFtb3VudCxyZXQsCisJCQlDUllQVE9fZ2V0X2xvY2tfbmFtZSh0eXBlKSwKKwkJCWZpbGUsbGluZSk7CisJCX0KKyNlbmRpZgorCQl9CisJZWxzZQorCQl7CisJCUNSWVBUT19sb2NrKENSWVBUT19MT0NLfENSWVBUT19XUklURSx0eXBlLGZpbGUsbGluZSk7CisKKwkJcmV0PSAqcG9pbnRlcithbW91bnQ7CisjaWZkZWYgTE9DS19ERUJVRworCQl7CisJCUNSWVBUT19USFJFQURJRCBpZDsKKwkJQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoJmlkKTsKKwkJZnByaW50ZihzdGRlcnIsImxhZGQ6JTA4bHg6JTJkKyUyZC0+JTJkICUtMThzICVzOiVkXG4iLAorCQkJQ1JZUFRPX1RIUkVBRElEX2hhc2goJmlkKSwKKwkJCSpwb2ludGVyLGFtb3VudCxyZXQsCisJCQlDUllQVE9fZ2V0X2xvY2tfbmFtZSh0eXBlKSwKKwkJCWZpbGUsbGluZSk7CisJCX0KKyNlbmRpZgorCQkqcG9pbnRlcj1yZXQ7CisJCUNSWVBUT19sb2NrKENSWVBUT19VTkxPQ0t8Q1JZUFRPX1dSSVRFLHR5cGUsZmlsZSxsaW5lKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworY29uc3QgY2hhciAqQ1JZUFRPX2dldF9sb2NrX25hbWUoaW50IHR5cGUpCisJeworCWlmICh0eXBlIDwgMCkKKwkJcmV0dXJuKCJkeW5hbWljIik7CisJZWxzZSBpZiAodHlwZSA8IENSWVBUT19OVU1fTE9DS1MpCisJCXJldHVybihsb2NrX25hbWVzW3R5cGVdKTsKKwllbHNlIGlmICh0eXBlLUNSWVBUT19OVU1fTE9DS1MgPiBza19PUEVOU1NMX1NUUklOR19udW0oYXBwX2xvY2tzKSkKKwkJcmV0dXJuKCJFUlJPUiIpOworCWVsc2UKKwkJcmV0dXJuKHNrX09QRU5TU0xfU1RSSU5HX3ZhbHVlKGFwcF9sb2Nrcyx0eXBlLUNSWVBUT19OVU1fTE9DS1MpKTsKKwl9CisKKyNpZglkZWZpbmVkKF9faTM4NikgICB8fCBkZWZpbmVkKF9faTM4Nl9fKSAgIHx8IGRlZmluZWQoX01fSVg4NikgfHwgXAorCWRlZmluZWQoX19JTlRFTF9fKSB8fCBcCisJZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9NX0FNRDY0KSB8fCBkZWZpbmVkKF9NX1g2NCkKKwordW5zaWduZWQgbG9uZyAgT1BFTlNTTF9pYTMyY2FwX1A9MDsKK3Vuc2lnbmVkIGxvbmcgKk9QRU5TU0xfaWEzMmNhcF9sb2Modm9pZCkgeyByZXR1cm4gJk9QRU5TU0xfaWEzMmNhcF9QOyB9CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfQ1BVSURfT0JKKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgIWRlZmluZWQoSTM4Nl9PTkxZKQorI2RlZmluZSBPUEVOU1NMX0NQVUlEX1NFVFVQCit2b2lkIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCkKK3sgc3RhdGljIGludCB0cmlnZ2VyPTA7CisgIHVuc2lnbmVkIGxvbmcgT1BFTlNTTF9pYTMyX2NwdWlkKHZvaWQpOworICBjaGFyICplbnY7CisKKyAgICBpZiAodHJpZ2dlcikJcmV0dXJuOworCisgICAgdHJpZ2dlcj0xOworICAgIGlmICgoZW52PWdldGVudigiT1BFTlNTTF9pYTMyY2FwIikpKQorCU9QRU5TU0xfaWEzMmNhcF9QID0gc3RydG91bChlbnYsTlVMTCwwKXwoMTw8MTApOworICAgIGVsc2UKKwlPUEVOU1NMX2lhMzJjYXBfUCA9IE9QRU5TU0xfaWEzMl9jcHVpZCgpfCgxPDwxMCk7CisgICAgLyoKKyAgICAgKiB8KDE8PDEwKSBzZXRzIGEgcmVzZXJ2ZWQgYml0IHRvIHNpZ25hbCB0aGF0IHZhcmlhYmxlCisgICAgICogd2FzIGluaXRpYWxpemVkIGFscmVhZHkuLi4gVGhpcyBpcyB0byBhdm9pZCBpbnRlcmZlcmVuY2UKKyAgICAgKiB3aXRoIGNwdWlkIHNuaXBwZXRzIGluIEVMRiAuaW5pdCBzZWdtZW50LgorICAgICAqLworfQorI2VuZGlmCisKKyNlbHNlCit1bnNpZ25lZCBsb25nICpPUEVOU1NMX2lhMzJjYXBfbG9jKHZvaWQpIHsgcmV0dXJuIE5VTEw7IH0KKyNlbmRpZgoraW50IE9QRU5TU0xfTk9OUElDX3JlbG9jYXRlZCA9IDA7CisjaWYgIWRlZmluZWQoT1BFTlNTTF9DUFVJRF9TRVRVUCkgJiYgIWRlZmluZWQoT1BFTlNTTF9DUFVJRF9PQkopCit2b2lkIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCkge30KKyNlbmRpZgorCisjaWYgKGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pKSAmJiBkZWZpbmVkKF9XSU5ETEwpCisjaWZkZWYgX19DWUdXSU5fXworLyogcGljayBETExfW1BST0NFU1N8VEhSRUFEXV9bQVRUQUNIfERFVEFDSF0gZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisvKiB0aGlzIGhhcyBzaWRlLWVmZmVjdCBvZiBfV0lOMzIgZ2V0dGluZyBkZWZpbmVkLCB3aGljaCBvdGhlcndpc2UKKyAqIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIF9fQ1lHV0lOX18uLi4gKi8KKyNlbmRpZgorCisvKiBBbGwgd2UgcmVhbGx5IG5lZWQgdG8gZG8gaXMgcmVtb3ZlIHRoZSAnZXJyb3InIHN0YXRlIHdoZW4gYSB0aHJlYWQKKyAqIGRldGFjaGVzICovCisKK0JPT0wgV0lOQVBJIERsbE1haW4oSElOU1RBTkNFIGhpbnN0RExMLCBEV09SRCBmZHdSZWFzb24sCisJICAgICBMUFZPSUQgbHB2UmVzZXJ2ZWQpCisJeworCXN3aXRjaChmZHdSZWFzb24pCisJCXsKKwljYXNlIERMTF9QUk9DRVNTX0FUVEFDSDoKKwkJT1BFTlNTTF9jcHVpZF9zZXR1cCgpOworI2lmIGRlZmluZWQoX1dJTjMyX1dJTk5UKQorCQl7CisJCUlNQUdFX0RPU19IRUFERVIgKmRvc19oZWFkZXIgPSAoSU1BR0VfRE9TX0hFQURFUiAqKWhpbnN0RExMOworCQlJTUFHRV9OVF9IRUFERVJTICpudF9oZWFkZXJzOworCisJCWlmIChkb3NfaGVhZGVyLT5lX21hZ2ljPT1JTUFHRV9ET1NfU0lHTkFUVVJFKQorCQkJeworCQkJbnRfaGVhZGVycyA9IChJTUFHRV9OVF9IRUFERVJTICopKChjaGFyICopZG9zX2hlYWRlcgorCQkJCQkJKyBkb3NfaGVhZGVyLT5lX2xmYW5ldyk7CisJCQlpZiAobnRfaGVhZGVycy0+U2lnbmF0dXJlPT1JTUFHRV9OVF9TSUdOQVRVUkUgJiYKKwkJCSAgICBoaW5zdERMTCE9KEhJTlNUQU5DRSkobnRfaGVhZGVycy0+T3B0aW9uYWxIZWFkZXIuSW1hZ2VCYXNlKSkKKwkJCQlPUEVOU1NMX05PTlBJQ19yZWxvY2F0ZWQ9MTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWJyZWFrOworCWNhc2UgRExMX1RIUkVBRF9BVFRBQ0g6CisJCWJyZWFrOworCWNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisJCUVSUl9yZW1vdmVfc3RhdGUoMCk7CisJCWJyZWFrOworCWNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorCQlicmVhazsKKwkJfQorCXJldHVybihUUlVFKTsKKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQorI2luY2x1ZGUgPHRjaGFyLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XSU5OVCkgJiYgX1dJTjMyX1dJTk5UPj0weDAzMzMKK2ludCBPUEVOU1NMX2lzc2VydmljZSh2b2lkKQoreyBIV0lOU1RBIGg7CisgIERXT1JEIGxlbjsKKyAgV0NIQVIgKm5hbWU7CisgIHN0YXRpYyB1bmlvbiB7IHZvaWQgKnA7IGludCAoKmYpKHZvaWQpOyB9IF9PUEVOU1NMX2lzc2VydmljZSA9IHsgTlVMTCB9OworCisgICAgaWYgKF9PUEVOU1NMX2lzc2VydmljZS5wID09IE5VTEwpIHsKKwlIQU5ETEUgaCA9IEdldE1vZHVsZUhhbmRsZShOVUxMKTsKKwlpZiAoaCAhPSBOVUxMKQorCSAgICBfT1BFTlNTTF9pc3NlcnZpY2UucCA9IEdldFByb2NBZGRyZXNzKGgsIl9PUEVOU1NMX2lzc2VydmljZSIpOworCWlmIChfT1BFTlNTTF9pc3NlcnZpY2UucCA9PSBOVUxMKQorCSAgICBfT1BFTlNTTF9pc3NlcnZpY2UucCA9ICh2b2lkICopLTE7CisgICAgfQorCisgICAgaWYgKF9PUEVOU1NMX2lzc2VydmljZS5wICE9ICh2b2lkICopLTEpCisJcmV0dXJuICgqX09QRU5TU0xfaXNzZXJ2aWNlLmYpKCk7CisKKyAgICAodm9pZClHZXREZXNrdG9wV2luZG93KCk7IC8qIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkICovCisKKyAgICBoID0gR2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24oKTsKKyAgICBpZiAoaD09TlVMTCkgcmV0dXJuIC0xOworCisgICAgaWYgKEdldFVzZXJPYmplY3RJbmZvcm1hdGlvblcgKGgsVU9JX05BTUUsTlVMTCwwLCZsZW4pIHx8CisJR2V0TGFzdEVycm9yKCkgIT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikKKwlyZXR1cm4gLTE7CisKKyAgICBpZiAobGVuPjUxMikgcmV0dXJuIC0xOwkJLyogcGFyYW5vaWEgKi8KKyAgICBsZW4rKyxsZW4mPX4xOwkJCS8qIHBhcmFub2lhICovCisjaWZkZWYgX01TQ19WRVIKKyAgICBuYW1lPShXQ0hBUiAqKV9hbGxvY2EobGVuK3NpemVvZihXQ0hBUikpOworI2Vsc2UKKyAgICBuYW1lPShXQ0hBUiAqKWFsbG9jYShsZW4rc2l6ZW9mKFdDSEFSKSk7CisjZW5kaWYKKyAgICBpZiAoIUdldFVzZXJPYmplY3RJbmZvcm1hdGlvblcgKGgsVU9JX05BTUUsbmFtZSxsZW4sJmxlbikpCisJcmV0dXJuIC0xOworCisgICAgbGVuKyssbGVuJj1+MTsJCQkvKiBwYXJhbm9pYSAqLworICAgIG5hbWVbbGVuL3NpemVvZihXQ0hBUildPUwnXDAnOwkvKiBwYXJhbm9pYSAqLworI2lmIDEKKyAgICAvKiBUaGlzIGRvZXNuJ3QgY292ZXIgImludGVyYWN0aXZlIiBzZXJ2aWNlcyBbd29ya2luZyB3aXRoIHJlYWwKKyAgICAgKiBXaW5TdGEwJ3NdIG5vciBwcm9ncmFtcyBzdGFydGVkIG5vbi1pbnRlcmFjdGl2ZWx5IGJ5IFRhc2sKKyAgICAgKiBTY2hlZHVsZXIgW3Rob3NlIGFyZSB3b3JraW5nIHdpdGggU0FXaW5TdGFdLiAqLworICAgIGlmICh3Y3NzdHIobmFtZSxMIlNlcnZpY2UtMHgiKSkJcmV0dXJuIDE7CisjZWxzZQorICAgIC8qIFRoaXMgY292ZXJzIGFsbCBub24taW50ZXJhY3RpdmUgcHJvZ3JhbXMgc3VjaCBhcyBzZXJ2aWNlcy4gKi8KKyAgICBpZiAoIXdjc3N0cihuYW1lLEwiV2luU3RhMCIpKQlyZXR1cm4gMTsKKyNlbmRpZgorICAgIGVsc2UJCQkJcmV0dXJuIDA7Cit9CisjZWxzZQoraW50IE9QRU5TU0xfaXNzZXJ2aWNlKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCit2b2lkIE9QRU5TU0xfc2hvd2ZhdGFsIChjb25zdCBjaGFyICpmbXRhLC4uLikKK3sgdmFfbGlzdCBhcDsKKyAgVENIQVIgYnVmWzI1Nl07CisgIGNvbnN0IFRDSEFSICpmbXQ7CisjaWZkZWYgU1REX0VSUk9SX0hBTkRMRQkvKiB3aGF0IGEgZGlydHkgdHJpY2shICovCisgIEhBTkRMRSBoOworCisgICAgaWYgKChoPUdldFN0ZEhhbmRsZShTVERfRVJST1JfSEFORExFKSkgIT0gTlVMTCAmJgorCUdldEZpbGVUeXBlKGgpIT1GSUxFX1RZUEVfVU5LTk9XTikKKyAgICB7CS8qIG11c3QgYmUgY29uc29sZSBhcHBsaWNhdGlvbiAqLworCXZhX3N0YXJ0IChhcCxmbXRhKTsKKwl2ZnByaW50ZiAoc3RkZXJyLGZtdGEsYXApOworCXZhX2VuZCAoYXApOworCXJldHVybjsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChzaXplb2YoVENIQVIpPT1zaXplb2YoY2hhcikpCisJZm10PShjb25zdCBUQ0hBUiAqKWZtdGE7CisgICAgZWxzZSBkbworICAgIHsgaW50ICAgIGtlZXBnb2luZzsKKyAgICAgIHNpemVfdCBsZW5fMD1zdHJsZW4oZm10YSkrMSxpOworICAgICAgV0NIQVIgKmZtdHc7CisKKyNpZmRlZiBfTVNDX1ZFUgorCWZtdHcgPSAoV0NIQVIgKilfYWxsb2NhIChsZW5fMCpzaXplb2YoV0NIQVIpKTsKKyNlbHNlCisJZm10dyA9IChXQ0hBUiAqKWFsbG9jYSAobGVuXzAqc2l6ZW9mKFdDSEFSKSk7CisjZW5kaWYKKwlpZiAoZm10dyA9PSBOVUxMKSB7IGZtdD0oY29uc3QgVENIQVIgKilMIm5vIHN0YWNrPyI7IGJyZWFrOyB9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19NVUxUSUJZVEUKKwlpZiAoIU11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLDAsZm10YSxsZW5fMCxmbXR3LGxlbl8wKSkKKyNlbmRpZgorCSAgICBmb3IgKGk9MDtpPGxlbl8wO2krKykgZm10d1tpXT0oV0NIQVIpZm10YVtpXTsKKworCWZvciAoaT0wO2k8bGVuXzA7aSsrKQorCXsgICBpZiAoZm10d1tpXT09TCclJykgZG8KKwkgICAgewlrZWVwZ29pbmc9MDsKKwkJc3dpdGNoIChmbXR3W2krMV0pCisJCXsgICBjYXNlIEwnMCc6IGNhc2UgTCcxJzogY2FzZSBMJzInOiBjYXNlIEwnMyc6IGNhc2UgTCc0JzoKKwkJICAgIGNhc2UgTCc1JzogY2FzZSBMJzYnOiBjYXNlIEwnNyc6IGNhc2UgTCc4JzogY2FzZSBMJzknOgorCQkgICAgY2FzZSBMJy4nOiBjYXNlIEwnKic6CisJCSAgICBjYXNlIEwnLSc6CWkrKzsga2VlcGdvaW5nPTE7IGJyZWFrOworCQkgICAgY2FzZSBMJ3MnOglmbXR3W2krMV09TCdTJzsgICBicmVhazsKKwkJICAgIGNhc2UgTCdTJzoJZm10d1tpKzFdPUwncyc7ICAgYnJlYWs7CisJCSAgICBjYXNlIEwnYyc6CWZtdHdbaSsxXT1MJ0MnOyAgIGJyZWFrOworCQkgICAgY2FzZSBMJ0MnOglmbXR3W2krMV09TCdjJzsgICBicmVhazsKKwkJfQorCSAgICB9IHdoaWxlIChrZWVwZ29pbmcpOworCX0KKwlmbXQgPSAoY29uc3QgVENIQVIgKilmbXR3OworICAgIH0gd2hpbGUgKDApOworCisgICAgdmFfc3RhcnQgKGFwLGZtdGEpOworICAgIF92c250cHJpbnRmIChidWYsc2l6ZW9mKGJ1Zikvc2l6ZW9mKFRDSEFSKS0xLGZtdCxhcCk7CisgICAgYnVmIFtzaXplb2YoYnVmKS9zaXplb2YoVENIQVIpLTFdID0gX1QoJ1wwJyk7CisgICAgdmFfZW5kIChhcCk7CisKKyNpZiBkZWZpbmVkKF9XSU4zMl9XSU5OVCkgJiYgX1dJTjMyX1dJTk5UPj0weDAzMzMKKyAgICAvKiB0aGlzIC0tLS0tLS0tLS0tLS12LS0tIGd1YXJkcyBOVC1zcGVjaWZpYyBjYWxscyAqLworICAgIGlmIChHZXRWZXJzaW9uKCkgPCAweDgwMDAwMDAwICYmIE9QRU5TU0xfaXNzZXJ2aWNlKCkgPiAwKQorICAgIHsJSEFORExFIGggPSBSZWdpc3RlckV2ZW50U291cmNlKDAsX1QoIk9QRU5TU0wiKSk7CisJY29uc3QgVENIQVIgKnBtc2c9YnVmOworCVJlcG9ydEV2ZW50KGgsRVZFTlRMT0dfRVJST1JfVFlQRSwwLDAsMCwxLDAsJnBtc2csMCk7CisJRGVyZWdpc3RlckV2ZW50U291cmNlKGgpOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYKKwlNZXNzYWdlQm94IChOVUxMLGJ1ZixfVCgiT3BlblNTTDogRkFUQUwiKSxNQl9PS3xNQl9JQ09OU1RPUCk7Cit9CisjZWxzZQordm9pZCBPUEVOU1NMX3Nob3dmYXRhbCAoY29uc3QgY2hhciAqZm10YSwuLi4pCit7IHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydCAoYXAsZm10YSk7CisgICAgdmZwcmludGYgKHN0ZGVycixmbXRhLGFwKTsKKyAgICB2YV9lbmQgKGFwKTsKK30KK2ludCBPUEVOU1NMX2lzc2VydmljZSAodm9pZCkgeyByZXR1cm4gMDsgfQorI2VuZGlmCisKK3ZvaWQgT3BlblNTTERpZShjb25zdCBjaGFyICpmaWxlLGludCBsaW5lLGNvbnN0IGNoYXIgKmFzc2VydGlvbikKKwl7CisJT1BFTlNTTF9zaG93ZmF0YWwoCisJCSIlcyglZCk6IE9wZW5TU0wgaW50ZXJuYWwgZXJyb3IsIGFzc2VydGlvbiBmYWlsZWQ6ICVzXG4iLAorCQlmaWxlLGxpbmUsYXNzZXJ0aW9uKTsKKyNpZiAhZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKwlhYm9ydCgpOworI2Vsc2UKKwkvKiBXaW4zMiBhYm9ydCgpIGN1c3RvbWFyaWx5IHNob3dzIGEgZGlhbG9nLCBidXQgd2UganVzdCBkaWQgdGhhdC4uLiAqLworCXJhaXNlKFNJR0FCUlQpOworCV9leGl0KDMpOworI2VuZGlmCisJfQorCit2b2lkICpPUEVOU1NMX3N0ZGVycih2b2lkKQl7IHJldHVybiBzdGRlcnI7IH0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9jcnlwdGxpYi5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2NyeXB0bGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyNDljNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jcnlwdGxpYi5oCkBAIC0wLDAgKzEsMTExIEBACisvKiBjcnlwdG8vY3J5cHRsaWIuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9DUllQVExJQl9ICisjZGVmaW5lIEhFQURFUl9DUllQVExJQl9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImVfb3MuaCIKKworI2lmZGVmIE9QRU5TU0xfVVNFX0FQUExJTksKKyNkZWZpbmUgQklPX0ZMQUdTX1VQTElOSyAweDgwMDAKKyNpbmNsdWRlICJtcy91cGxpbmsuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPiAKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPiAKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKyNkZWZpbmUgWDUwOV9DRVJUX0FSRUEJCU9QRU5TU0xESVIKKyNkZWZpbmUgWDUwOV9DRVJUX0RJUgkJT1BFTlNTTERJUiAiL2NlcnRzIgorI2RlZmluZSBYNTA5X0NFUlRfRklMRQkJT1BFTlNTTERJUiAiL2NlcnQucGVtIgorI2RlZmluZSBYNTA5X1BSSVZBVEVfRElSCU9QRU5TU0xESVIgIi9wcml2YXRlIgorI2Vsc2UKKyNkZWZpbmUgWDUwOV9DRVJUX0FSRUEJCSJTU0xST09UOlswMDAwMDBdIgorI2RlZmluZSBYNTA5X0NFUlRfRElSCQkiU1NMQ0VSVFM6IgorI2RlZmluZSBYNTA5X0NFUlRfRklMRQkJIlNTTENFUlRTOmNlcnQucGVtIgorI2RlZmluZSBYNTA5X1BSSVZBVEVfRElSICAgICAgICAiU1NMUFJJVkFURToiCisjZW5kaWYKKworI2RlZmluZSBYNTA5X0NFUlRfRElSX0VWUCAgICAgICAgIlNTTF9DRVJUX0RJUiIKKyNkZWZpbmUgWDUwOV9DRVJUX0ZJTEVfRVZQICAgICAgICJTU0xfQ0VSVF9GSUxFIgorCisvKiBzaXplIG9mIHN0cmluZyByZXByZXNlbnRhdGlvbnMgKi8KKyNkZWZpbmUgREVDSU1BTF9TSVpFKHR5cGUpCSgoc2l6ZW9mKHR5cGUpKjgrMikvMysxKQorI2RlZmluZSBIRVhfU0laRSh0eXBlKQkJKHNpemVvZih0eXBlKSoyKQorCit2b2lkIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBPUEVOU1NMX2lhMzJjYXBfUDsKK3ZvaWQgT1BFTlNTTF9zaG93ZmF0YWwoY29uc3QgY2hhciAqLC4uLik7Cit2b2lkICpPUEVOU1NMX3N0ZGVycih2b2lkKTsKK2V4dGVybiBpbnQgT1BFTlNTTF9OT05QSUNfcmVsb2NhdGVkOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vY3J5cHRvLWxpYi5jb20gYi9saWIvb3BlbnNzbC9jcnlwdG8vY3J5cHRvLWxpYi5jb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiNjYzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jcnlwdG8tbGliLmNvbQpAQCAtMCwwICsxLDEzMzYgQEAKKyQhCiskISAgQ1JZUFRPLUxJQi5DT00KKyQhICBXcml0dGVuIEJ5OiAgUm9iZXJ0IEJ5ZXIKKyQhICAgICAgICAgICAgICAgVmljZS1QcmVzaWRlbnQKKyQhICAgICAgICAgICAgICAgQS1Db20gQ29tcHV0aW5nLCBJbmMuCiskISAgICAgICAgICAgICAgIGJ5ZXJAbWFpbC5hbGwtbmV0Lm5ldAorJCEKKyQhICBDaGFuZ2VzIGJ5IFJpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz4KKyQhICAgICAgICAgICAgIFpvbHRhbiBBcnBhZGZmeSA8YXJwYWRmZnlAcG9sYXJob21lLmNvbT4KKyQhCiskISAgVGhpcyBjb21tYW5kIGZpbGVzIGNvbXBpbGVzIGFuZCBjcmVhdGVzIHRoZSAiWy54eHguRVhFLkNSWVBUT11MSUJDUllQVE8uT0xCIiAKKyQhICBsaWJyYXJ5IGZvciBPcGVuU1NMLiAgVGhlICJ4eHgiIGRlbm90ZXMgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlLCBBTFBIQSwKKyQhICBJQTY0IG9yIFZBWC4KKyQhCiskISAgSXQgd2FzIHJlLXdyaXR0ZW4gc28gaXQgd291bGQgdHJ5IHRvIGRldGVybWluZSB3aGF0ICJDIiBjb21waWxlciB0byB1c2UgCiskISAgb3IgeW91IGNhbiBzcGVjaWZ5IHdoaWNoICJDIiBjb21waWxlciB0byB1c2UuCiskIQorJCEgIFNwZWNpZnkgdGhlIGZvbGxvd2luZyBhcyBQMSB0byBidWlsZCBqdXN0IHRoYXQgcGFydCBvciBBTEwgdG8ganVzdAorJCEgIGJ1aWxkIGV2ZXJ5dGhpbmcuCiskIQorJCEgICAgCUxJQlJBUlkgICAgVG8ganVzdCBjb21waWxlIHRoZSBbLnh4eC5FWEUuQ1JZUFRPXUxJQkNSWVBUTy5PTEIgTGlicmFyeS4KKyQhICAgIAlBUFBTICAgICAgIFRvIGp1c3QgY29tcGlsZSB0aGUgWy54eHguRVhFLkNSWVBUT10qLkVYRQorJCEJQUxMCSAgIFRvIGRvIGJvdGggTElCUkFSWSBhbmQgQVBQUworJCEKKyQhICBTcGVjaWZ5IERFQlVHIG9yIE5PREVCVUcgYXMgUDIgdG8gY29tcGlsZSB3aXRoIG9yIHdpdGhvdXQgZGVidWdnZXIKKyQhICBpbmZvcm1hdGlvbi4KKyQhCiskISAgU3BlY2lmeSB3aGljaCBjb21waWxlciBhdCBQMyB0byB0cnkgdG8gY29tcGlsZSB1bmRlci4KKyQhCiskIQlWQVhDCSAgIEZvciBWQVggQy4KKyQhCURFQ0MJICAgRm9yIERFQyBDLgorJCEJR05VQwkgICBGb3IgR05VIEMuCiskIQorJCEgIElmIHlvdSBkb24ndCBzcGVjaWZ5IGEgY29tcGlsZXIsIGl0IHdpbGwgdHJ5IHRvIGRldGVybWluZSB3aGljaAorJCEgICJDIiBjb21waWxlciB0byB1c2UuCiskIQorJCEgIFA0LCBpZiBkZWZpbmVkLCBzZXRzIGEgVENQL0lQIGxpYnJhcnkgdG8gdXNlLCB0aHJvdWdoIG9uZSBvZiB0aGUgZm9sbG93aW5nCiskISAga2V5d29yZHM6CiskIQorJCEJVUNYCSAgIEZvciBVQ1gKKyQhCVRDUElQCSAgIEZvciBUQ1BJUCAocG9zdCBVQ1gpCiskIQlTT0NLRVRTSFIgIEZvciBTT0NLRVRTSFIrTkVUTElCCiskIQorJCEgIFA1LCBpZiBkZWZpbmVkLCBzZXRzIGEgY29tcGlsZXIgdGhyZWFkIE5PVCBuZWVkZWQgb24gT3BlblZNUyA3LjEgKGFuZCB1cCkKKyQhCiskISAgUDYsIGlmIGRlZmluZWQsIHNldHMgYSBjaG9pY2Ugb2YgY3J5cHRvIG1ldGhvZHMgdG8gY29tcGlsZS4KKyQhICBXQVJOSU5HOiB0aGlzIHNob3VsZCBvbmx5IGJlIGRvbmUgdG8gcmVjb21waWxlIHNvbWUgcGFydCBvZiBhbiBhbHJlYWR5CiskISAgZnVsbHkgY29tcGlsZWQgbGlicmFyeS4KKyQhCiskIQorJCEgRGVmaW5lIEEgVENQL0lQIExpYnJhcnkgVGhhdCBXZSBXaWxsIE5lZWQgVG8gTGluayBUby4KKyQhIChUaGF0IElzLCBJZiBXZSBOZWVkIFRvIExpbmsgVG8gT25lLikKKyQhCiskIFRDUElQX0xJQiA9ICIiCiskIQorJCEgQ2hlY2sgV2hpY2ggQXJjaGl0ZWN0dXJlIFdlIEFyZSBVc2luZy4KKyQhCiskIElGIChGJEdFVFNZSSgiQ1BVIikuTFQuMTI4KQorJCBUSEVOCiskIQorJCEgIFRoZSBBcmNoaXRlY3R1cmUgSXMgVkFYCiskIQorJCAgIEFSQ0ggPSAiVkFYIgorJCEKKyQhIEVsc2UuLi4KKyQhCiskIEVMU0UKKyQhCiskISAgVGhlIEFyY2hpdGVjdHVyZSBJcyBBbHBoYSwgSUE2NCBvciB3aGF0ZXZlciBjb21lcyBpbiB0aGUgZnV0dXJlLgorJCEKKyQgICBBUkNIID0gRiRFRElUKCBGJEdFVFNZSSggIkFSQ0hfTkFNRSIpLCAiVVBDQVNFIikKKyQgICBJRiAoQVJDSCAuRVFTLiAiIikgVEhFTiBBUkNIID0gIlVOSyIKKyQhCiskISBFbmQgVGhlIEFyY2hpdGVjdHVyZSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgRGVmaW5lIFRoZSBEaWZmZXJlbnQgRW5jcnlwdGlvbiBUeXBlcy4KKyQhIE5PVEU6IFNvbWUgbWlnaHQgdGhpbmsgdGhpcyBsaXN0IHVnbHkuICBIb3dldmVyLCBpdCdzIG1hZGUgdGhpcyB3YXkgdG8KKyQhIHJlZmxlY3QgdGhlIFNESVJTIHZhcmlhYmxlIGluIFstXU1ha2VmaWxlLm9yZyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLAorJCEgdGhlcmVieSBtYWtpbmcgaXQgZmFpcmx5IGVhc3kgdG8gdmVyaWZ5IHRoYXQgdGhlIGxpc3RzIGFyZSB0aGUgc2FtZS4KKyQhCiskIEVUX1dISVJMUE9PTCA9ICJXSFJMUE9PTCIKKyQgSUYgQVJDSCAuRVFTLiAiVkFYIiBUSEVOIEVUX1dISVJMUE9PTCA9ICIiCiskIEVOQ1JZUFRfVFlQRVMgPSAiQmFzaWMsIisgLQorCQkgICJPQkpFQ1RTLCIrIC0KKwkJICAiTUQyLE1ENCxNRDUsU0hBLE1EQzIsSE1BQyxSSVBFTUQsIitFVF9XSElSTFBPT0wrIiwiKyAtCisJCSAgIkRFUyxBRVMsUkMyLFJDNCxSQzUsSURFQSxCRixDQVNULENBTUVMTElBLFNFRUQsTU9ERVMsIisgLQorCQkgICJCTixFQyxSU0EsRFNBLEVDRFNBLERILEVDREgsRFNPLEVOR0lORSwiKyAtCisJCSAgIkJVRkZFUixCSU8sU1RBQ0ssTEhBU0gsUkFORCxFUlIsIisgLQorCQkgICJFVlAsRVZQXzIsRVZQXzMsQVNOMSxBU04xXzIsUEVNLFg1MDksWDUwOVYzLCIrIC0KKwkJICAiQ09ORixUWFRfREIsUEtDUzcsUEtDUzEyLENPTVAsT0NTUCxVSSxLUkI1LCIrIC0KKwkJICAiU1RPUkUsQ01TLFBRVUVVRSxUUyxKUEFLRSIKKyQhIERlZmluZSBUaGUgT0JKIERpcmVjdG9yeS4KKyQhCiskIE9CSl9ESVIgOj0gU1lTJERJU0s6Wy0uJ0FSQ0gnLk9CSi5DUllQVE9dCiskIQorJCEgRGVmaW5lIFRoZSBFWEUgRGlyZWN0b3J5LgorJCEKKyQgRVhFX0RJUiA6PSBTWVMkRElTSzpbLS4nQVJDSCcuRVhFLkNSWVBUT10KKyQhCiskISBDaGVjayBUbyBNYWtlIFN1cmUgV2UgSGF2ZSBWYWxpZCBDb21tYW5kIExpbmUgUGFyYW1ldGVycy4KKyQhCiskIEdPU1VCIENIRUNLX09QVElPTlMKKyQhCiskISBJbml0aWFsaXNlIGxvZ2ljYWwgbmFtZXMgYW5kIHN1Y2gKKyQhCiskIEdPU1VCIElOSVRJQUxJU0UKKyQhCiskISBUZWxsIFRoZSBVc2VyIFdoYXQgS2luZCBvZiBNYWNoaW5lIFdlIFJ1biBPbi4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIkNvbXBpbGluZyBPbiBBICIsQVJDSCwiIE1hY2hpbmUuIgorJCEKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgVGhlIEFyY2hpdGVjdHVyZSBTcGVjaWZpYyBPQkogRGlyZWN0b3J5IEV4aXN0cy4KKyQhCiskIElGIChGJFBBUlNFKE9CSl9ESVIpLkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBJdCBEb3Nlbid0IEV4aXN0LCBTbyBDcmVhdGUgSXQuCiskIQorJCAgIENSRUFURS9ESVIgJ09CSl9ESVInCiskIQorJCEgRW5kIFRoZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWMgT0JKIERpcmVjdG9yeSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFRoZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWMgRGlyZWN0b3J5IEV4aXN0cy4KKyQhCiskIElGIChGJFBBUlNFKEVYRV9ESVIpLkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBJdCBEb3Nlbid0IEV4aXN0LCBTbyBDcmVhdGUgSXQuCiskIQorJCAgIENSRUFURS9ESVJFQ1RPUlkgJ0VYRV9ESVInCiskIQorJCEgRW5kIFRoZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWMgRGlyZWN0b3J5IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBEZWZpbmUgVGhlIExpYnJhcnkgTmFtZS4KKyQhCiskIExJQl9OQU1FIDo9ICdFWEVfRElSJ0xJQkNSWVBUTy5PTEIKKyQhCiskISBEZWZpbmUgVGhlIENSWVBUTy1MSUIgV2UgQXJlIFRvIFVzZS4KKyQhCiskIENSWVBUT19MSUIgOj0gJ0VYRV9ESVInTElCQ1JZUFRPLk9MQgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBBbHJlYWR5IEhhdmUgQSAiWy54eHguRVhFLkNSWVBUT11MSUJDUllQVE8uT0xCIiBMaWJyYXJ5Li4uCiskIQorJCBJRiAoRiRTRUFSQ0goTElCX05BTUUpLkVRUy4iIikKKyQgVEhFTgorJCEKKyQhIEd1ZXNzIE5vdCwgQ3JlYXRlIFRoZSBMaWJyYXJ5LgorJCEKKyQgICBMSUJSQVJZL0NSRUFURS9PQkpFQ1QgJ0xJQl9OQU1FJworJCEKKyQhIEVuZCBUaGUgTGlicmFyeSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgQnVpbGQgb3VyIG9wdGlvbnMgZmlsZSBmb3IgdGhlIGFwcGxpY2F0aW9uCiskIQorJCBHT1NVQiBDSEVDS19PUFRfRklMRQorJCEKKyQhIERlZmluZSBUaGUgRGlmZmVyZW50IEVuY3J5cHRpb24gImxpYnJhcnkiIFN0cmluZ3MuCiskIQorJCBBUFBTX0RFUyA9ICJERVMvREVTLENCQzNfRU5DIgorJCBBUFBTX1BLQ1M3ID0gIkVOQy9FTkM7REVDL0RFQztTSUdOL1NJR047VkVSSUZZL1ZFUklGWSxFWEFNUExFIgorJAorJCBMSUJfID0gImNyeXB0bGliLG1lbSxtZW1fY2xyLG1lbV9kYmcsY3ZlcnNpb24sZXhfZGF0YSxjcHRfZXJyLGViY2RpYyx1aWQsb190aW1lLG9fc3RyLG9fZGlyIgorJCBMSUJfTUQyID0gIm1kMl9kZ3N0LG1kMl9vbmUiCiskIExJQl9NRDQgPSAibWQ0X2Rnc3QsbWQ0X29uZSIKKyQgTElCX01ENSA9ICJtZDVfZGdzdCxtZDVfb25lIgorJCBMSUJfU0hBID0gInNoYV9kZ3N0LHNoYTFkZ3N0LHNoYV9vbmUsc2hhMV9vbmUsc2hhMjU2LHNoYTUxMiIKKyQgTElCX01EQzIgPSAibWRjMmRnc3QsbWRjMl9vbmUiCiskIExJQl9ITUFDID0gImhtYWMsaG1fYW1ldGgsaG1fcG1ldGgiCiskIExJQl9SSVBFTUQgPSAicm1kX2Rnc3Qscm1kX29uZSIKKyQgTElCX1dIUkxQT09MID0gIndwX2Rnc3Qsd3BfYmxvY2siCiskIExJQl9ERVMgPSAic2V0X2tleSxlY2JfZW5jLGNiY19lbmMsIisgLQorCSJlY2IzX2VuYyxjZmI2NGVuYyxjZmI2NGVkZSxjZmJfZW5jLG9mYjY0ZWRlLCIrIC0KKwkiZW5jX3JlYWQsZW5jX3dyaXQsb2ZiNjRlbmMsIisgLQorCSJvZmJfZW5jLHN0cjJrZXkscGNiY19lbmMscXVkX2Nrc20scmFuZF9rZXksIisgLQorCSJkZXNfZW5jLGZjcnlwdF9iLCIrIC0KKwkiZmNyeXB0LHhjYmNfZW5jLHJwY19lbmMsY2JjX2Nrc20sIisgLQorCSJlZGVfY2JjbV9lbmMsZGVzX29sZCxkZXNfb2xkMixyZWFkMnB3ZCIKKyQgTElCX1JDMiA9ICJyYzJfZWNiLHJjMl9za2V5LHJjMl9jYmMscmMyY2ZiNjQscmMyb2ZiNjQiCiskIExJQl9SQzQgPSAicmM0X3NrZXkscmM0X2VuYyIKKyQgTElCX1JDNSA9ICJyYzVfc2tleSxyYzVfZWNiLHJjNV9lbmMscmM1Y2ZiNjQscmM1b2ZiNjQiCiskIExJQl9JREVBID0gImlfY2JjLGlfY2ZiNjQsaV9vZmI2NCxpX2VjYixpX3NrZXkiCiskIExJQl9CRiA9ICJiZl9za2V5LGJmX2VjYixiZl9lbmMsYmZfY2ZiNjQsYmZfb2ZiNjQiCiskIExJQl9DQVNUID0gImNfc2tleSxjX2VjYixjX2VuYyxjX2NmYjY0LGNfb2ZiNjQiCiskIExJQl9DQU1FTExJQSA9ICJjYW1lbGxpYSxjbWxsX21pc2MsY21sbF9lY2IsY21sbF9jYmMsY21sbF9vZmIsIisgLQorCSJjbWxsX2NmYixjbWxsX2N0ciIKKyQgTElCX1NFRUQgPSAic2VlZCxzZWVkX2VjYixzZWVkX2NiYyxzZWVkX2NmYixzZWVkX29mYiIKKyQgTElCX01PREVTID0gImNiYzEyOCxjdHIxMjgsY2ZiMTI4LG9mYjEyOCIKKyQgTElCX0JOX0FTTSA9ICJbLmFzbV12bXMubWFyLHZtcy1oZWxwZXIiCiskIElGIEYkVFJOTE5NKCJPUEVOU1NMX05PX0FTTSIpIC5PUi4gQVJDSCAuTkVTLiAiVkFYIiBUSEVOIC0KKyAgICAgTElCX0JOX0FTTSA9ICJibl9hc20iCiskIExJQl9CTiA9ICJibl9hZGQsYm5fZGl2LGJuX2V4cCxibl9saWIsYm5fY3R4LGJuX211bCxibl9tb2QsIisgLQorCSJibl9wcmludCxibl9yYW5kLGJuX3NoaWZ0LGJuX3dvcmQsYm5fYmxpbmQsIisgLQorCSJibl9rcm9uLGJuX3NxcnQsYm5fZ2NkLGJuX3ByaW1lLGJuX2Vycixibl9zcXIsIitMSUJfQk5fQVNNKyIsIisgLQorCSJibl9yZWNwLGJuX21vbnQsYm5fbXBpLGJuX2V4cDIsYm5fZ2YybSxibl9uaXN0LCIrIC0KKwkiYm5fZGVwcixibl9jb25zdCIKKyQgTElCX0VDID0gImVjX2xpYixlY3Bfc21wbCxlY3BfbW9udCxlY3BfbmlzdCxlY19jdnQsZWNfbXVsdCwiKyAtCisJImVjX2VycixlY19jdXJ2ZSxlY19jaGVjayxlY19wcmludCxlY19hc24xLGVjX2tleSwiKyAtCisJImVjMl9zbXBsLGVjMl9tdWx0LGVjX2FtZXRoLGVjX3BtZXRoLGVja19wcm4iCiskIExJQl9SU0EgPSAicnNhX2VheSxyc2FfZ2VuLHJzYV9saWIscnNhX3NpZ24scnNhX3Nhb3MscnNhX2VyciwiKyAtCisJInJzYV9wazEscnNhX3NzbCxyc2Ffbm9uZSxyc2Ffb2FlcCxyc2FfY2hrLHJzYV9udWxsLCIrIC0KKwkicnNhX3Bzcyxyc2FfeDkzMSxyc2FfYXNuMSxyc2FfZGVwcixyc2FfYW1ldGgscnNhX3BybiwiKyAtCisJInJzYV9wbWV0aCIKKyQgTElCX0RTQSA9ICJkc2FfZ2VuLGRzYV9rZXksZHNhX2xpYixkc2FfYXNuMSxkc2FfdnJmLGRzYV9zaWduLCIrIC0KKwkiZHNhX2Vycixkc2Ffb3NzbCxkc2FfZGVwcixkc2FfYW1ldGgsZHNhX3BtZXRoLGRzYV9wcm4iCiskIExJQl9FQ0RTQSA9ICJlY3NfbGliLGVjc19hc24xLGVjc19vc3NsLGVjc19zaWduLGVjc192cmYsZWNzX2VyciIKKyQgTElCX0RIID0gImRoX2FzbjEsZGhfZ2VuLGRoX2tleSxkaF9saWIsZGhfY2hlY2ssZGhfZXJyLGRoX2RlcHIsIisgLQorCSJkaF9hbWV0aCxkaF9wbWV0aCxkaF9wcm4iCiskIExJQl9FQ0RIID0gImVjaF9saWIsZWNoX29zc2wsZWNoX2tleSxlY2hfZXJyIgorJCBMSUJfRFNPID0gImRzb19kbCxkc29fZGxmY24sZHNvX2Vycixkc29fbGliLGRzb19udWxsLCIrIC0KKwkiZHNvX29wZW5zc2wsZHNvX3dpbjMyLGRzb192bXMsZHNvX2Jlb3MiCiskIExJQl9FTkdJTkUgPSAiZW5nX2VycixlbmdfbGliLGVuZ19saXN0LGVuZ19pbml0LGVuZ19jdHJsLCIrIC0KKwkiZW5nX3RhYmxlLGVuZ19wa2V5LGVuZ19mYXQsZW5nX2FsbCwiKyAtCisJInRiX3JzYSx0Yl9kc2EsdGJfZWNkc2EsdGJfZGgsdGJfZWNkaCx0Yl9yYW5kLHRiX3N0b3JlLCIrIC0KKwkidGJfY2lwaGVyLHRiX2RpZ2VzdCx0Yl9wa21ldGgsdGJfYXNubXRoLCIrIC0KKwkiZW5nX29wZW5zc2wsZW5nX2R5bixlbmdfY25mLGVuZ19jcnlwdG9kZXYiCiskIExJQl9BRVMgPSAiYWVzX2NvcmUsYWVzX21pc2MsYWVzX2VjYixhZXNfY2JjLGFlc19jZmIsYWVzX29mYixhZXNfY3RyLCIrIC0KKwkiYWVzX2lnZSxhZXNfd3JhcCIKKyQgTElCX0JVRkZFUiA9ICJidWZmZXIsYnVmX2VyciIKKyQgTElCX0JJTyA9ICJiaW9fbGliLGJpb19jYixiaW9fZXJyLCIrIC0KKwkiYnNzX21lbSxic3NfbnVsbCxic3NfZmQsIisgLQorCSJic3NfZmlsZSxic3Nfc29jayxic3NfY29ubiwiKyAtCisJImJmX251bGwsYmZfYnVmZixiX3ByaW50LGJfZHVtcCwiKyAtCisJImJfc29jayxic3NfYWNwdCxiZl9uYmlvLGJzc19ydGNwLGJzc19iaW8sYnNzX2xvZywiKyAtCisJImJzc19kZ3JhbSwiKyAtCisJImJmX2xidWYiCiskIExJQl9TVEFDSyA9ICJzdGFjayIKKyQgTElCX0xIQVNIID0gImxoYXNoLGxoX3N0YXRzIgorJCBMSUJfUkFORCA9ICJtZF9yYW5kLHJhbmRmaWxlLHJhbmRfbGliLHJhbmRfZXJyLHJhbmRfZWdkLCIrIC0KKwkicmFuZF92bXMiCiskIExJQl9FUlIgPSAiZXJyLGVycl9hbGwsZXJyX3BybiIKKyQgTElCX09CSkVDVFMgPSAib19uYW1lcyxvYmpfZGF0LG9ial9saWIsb2JqX2VycixvYmpfeHJlZiIKKyQgTElCX0VWUCA9ICJlbmNvZGUsZGlnZXN0LGV2cF9lbmMsZXZwX2tleSxldnBfYWNuZiwiKyAtCisJImVfZGVzLGVfYmYsZV9pZGVhLGVfZGVzMyxlX2NhbWVsbGlhLCIrIC0KKwkiZV9yYzQsZV9hZXMsbmFtZXMsZV9zZWVkLCIrIC0KKwkiZV94Y2JjX2QsZV9yYzIsZV9jYXN0LGVfcmM1IgorJCBMSUJfRVZQXzIgPSAibV9udWxsLG1fbWQyLG1fbWQ0LG1fbWQ1LG1fc2hhLG1fc2hhMSxtX3dwLCIgKyAtCisJIm1fZHNzLG1fZHNzMSxtX21kYzIsbV9yaXBlbWQsbV9lY2RzYSwiKyAtCisJInBfb3BlbixwX3NlYWwscF9zaWduLHBfdmVyaWZ5LHBfbGliLHBfZW5jLHBfZGVjLCIrIC0KKwkiYmlvX21kLGJpb19iNjQsYmlvX2VuYyxldnBfZXJyLGVfbnVsbCwiKyAtCisJImNfYWxsLGNfYWxsYyxjX2FsbGQsZXZwX2xpYixiaW9fb2ssIistCisJImV2cF9wa2V5LGV2cF9wYmUscDVfY3JwdCxwNV9jcnB0MiIKKyQgTElCX0VWUF8zID0gImVfb2xkLHBtZXRoX2xpYixwbWV0aF9mbixwbWV0aF9nbixtX3NpZ3ZlciIKKyQgTElCX0FTTjEgPSAiYV9vYmplY3QsYV9iaXRzdHIsYV91dGN0bSxhX2dlbnRtLGFfdGltZSxhX2ludCxhX29jdGV0LCIrIC0KKwkiYV9wcmludCxhX3R5cGUsYV9zZXQsYV9kdXAsYV9kMmlfZnAsYV9pMmRfZnAsIisgLQorCSJhX2VudW0sYV91dGY4LGFfc2lnbixhX2RpZ2VzdCxhX3ZlcmlmeSxhX21ic3RyLGFfc3RyZXgsIisgLQorCSJ4X2FsZ29yLHhfdmFsLHhfcHVia2V5LHhfc2lnLHhfcmVxLHhfYXR0cmliLHhfYmlnbnVtLCIrIC0KKwkieF9sb25nLHhfbmFtZSx4X3g1MDkseF94NTA5YSx4X2NybCx4X2luZm8seF9zcGtpLG5zc2VxLCIrIC0KKwkieF9ueDUwOSxkMmlfcHUsZDJpX3ByLGkyZF9wdSxpMmRfcHIiCiskIExJQl9BU04xXzIgPSAidF9yZXEsdF94NTA5LHRfeDUwOWEsdF9jcmwsdF9wa2V5LHRfc3BraSx0X2JpdHN0LCIrIC0KKwkidGFzbl9uZXcsdGFzbl9mcmUsdGFzbl9lbmMsdGFzbl9kZWMsdGFzbl91dGwsdGFzbl90eXAsIisgLQorCSJ0YXNuX3BybixhbWV0aF9saWIsIisgLQorCSJmX2ludCxmX3N0cmluZyxuX3BrZXksIisgLQorCSJmX2VudW0seF9wa2V5LGFfYm9vbCx4X2V4dGVuLGJpb19hc24xLGJpb19uZGVmLGFzbl9taW1lLCIrIC0KKwkiYXNuMV9nZW4sYXNuMV9wYXIsYXNuMV9saWIsYXNuMV9lcnIsYV9ieXRlcyxhX3N0cm5pZCwiKyAtCisJImV2cF9hc24xLGFzbl9wYWNrLHA1X3BiZSxwNV9wYmV2MixwOF9wa2V5LGFzbl9tb2lkIgorJCBMSUJfUEVNID0gInBlbV9zaWduLHBlbV9zZWFsLHBlbV9pbmZvLHBlbV9saWIscGVtX2FsbCxwZW1fZXJyLCIrIC0KKwkicGVtX3g1MDkscGVtX3hhdXgscGVtX290aCxwZW1fcGs4LHBlbV9wa2V5LHB2a2ZtdCIKKyQgTElCX1g1MDkgPSAieDUwOV9kZWYseDUwOV9kMix4NTA5X3IyeCx4NTA5X2NtcCwiKyAtCisJIng1MDlfb2JqLHg1MDlfcmVxLHg1MDlzcGtpLHg1MDlfdmZ5LCIrIC0KKwkieDUwOV9zZXQseDUwOWNzZXQseDUwOXJzZXQseDUwOV9lcnIsIisgLQorCSJ4NTA5bmFtZSx4NTA5X3YzLHg1MDlfZXh0LHg1MDlfYXR0LCIrIC0KKwkieDUwOXR5cGUseDUwOV9sdSx4X2FsbCx4NTA5X3R4dCwiKyAtCisJIng1MDlfdHJzLGJ5X2ZpbGUsYnlfZGlyLHg1MDlfdnBtIgorJCBMSUJfWDUwOVYzID0gInYzX2Jjb25zLHYzX2JpdHN0LHYzX2NvbmYsdjNfZXh0a3UsdjNfaWE1LHYzX2xpYiwiKyAtCisJInYzX3Bybix2M191dGwsdjNlcnIsdjNfZ2Vubix2M19hbHQsdjNfc2tleSx2M19ha2V5LHYzX3BrdSwiKyAtCisJInYzX2ludCx2M19lbnVtLHYzX3N4bmV0LHYzX2Nwb2xzLHYzX2NybGQsdjNfcHVycCx2M19pbmZvLCIrIC0KKwkidjNfb2NzcCx2M19ha2V5YSx2M19wbWFwcyx2M19wY29ucyx2M19uY29ucyx2M19wY2lhLHYzX3BjaSwiKyAtCisJInBjeV9jYWNoZSxwY3lfbm9kZSxwY3lfZGF0YSxwY3lfbWFwLHBjeV90cmVlLHBjeV9saWIsIisgLQorCSJ2M19hc2lkLHYzX2FkZHIiCiskIExJQl9DT05GID0gImNvbmZfZXJyLGNvbmZfbGliLGNvbmZfYXBpLGNvbmZfZGVmLGNvbmZfbW9kLGNvbmZfbWFsbCxjb25mX3NhcCIKKyQgTElCX1RYVF9EQiA9ICJ0eHRfZGIiCiskIExJQl9QS0NTNyA9ICJwazdfYXNuMSxwazdfbGliLHBrY3M3ZXJyLHBrN19kb2l0LHBrN19zbWltZSxwazdfYXR0ciwiKyAtCisJInBrN19taW1lLGJpb19wazciCiskIExJQl9QS0NTMTIgPSAicDEyX2FkZCxwMTJfYXNuLHAxMl9hdHRyLHAxMl9jcnB0LHAxMl9jcnQscDEyX2RlY3IsIisgLQorCSJwMTJfaW5pdCxwMTJfa2V5LHAxMl9raXNzLHAxMl9tdXRsLCIrIC0KKwkicDEyX3V0bCxwMTJfbnBhcyxwazEyZXJyLHAxMl9wOGQscDEyX3A4ZSIKKyQgTElCX0NPTVAgPSAiY29tcF9saWIsY29tcF9lcnIsIisgLQorCSJjX3JsZSxjX3psaWIiCiskIExJQl9PQ1NQID0gIm9jc3BfYXNuLG9jc3BfZXh0LG9jc3BfaHQsb2NzcF9saWIsb2NzcF9jbCwiKyAtCisJIm9jc3Bfc3J2LG9jc3BfcHJuLG9jc3BfdmZ5LG9jc3BfZXJyIgorJCBMSUJfVUlfQ09NUEFUID0gIix1aV9jb21wYXQiCiskIExJQl9VSSA9ICJ1aV9lcnIsdWlfbGliLHVpX29wZW5zc2wsdWlfdXRpbCIrTElCX1VJX0NPTVBBVAorJCBMSUJfS1JCNSA9ICJrcmI1X2FzbiIKKyQgTElCX1NUT1JFID0gInN0cl9lcnIsc3RyX2xpYixzdHJfbWV0aCxzdHJfbWVtIgorJCBMSUJfQ01TID0gImNtc19saWIsY21zX2FzbjEsY21zX2F0dCxjbXNfaW8sY21zX3NtaW1lLGNtc19lcnIsIisgLQorCSJjbXNfc2QsY21zX2RkLGNtc19jZCxjbXNfZW52LGNtc19lbmMsY21zX2VzcyIKKyQgTElCX1BRVUVVRSA9ICJwcXVldWUiCiskIExJQl9UUyA9ICJ0c19lcnIsdHNfcmVxX3V0aWxzLHRzX3JlcV9wcmludCx0c19yc3BfdXRpbHMsdHNfcnNwX3ByaW50LCIrIC0KKwkidHNfcnNwX3NpZ24sdHNfcnNwX3ZlcmlmeSx0c192ZXJpZnlfY3R4LHRzX2xpYix0c19jb25mLCIrIC0KKwkidHNfYXNuMSIKKyQgTElCX0pQQUtFID0gImpwYWtlLGpwYWtlX2VyciIKKyQhCiskISBTZXR1cCBleGNlcHRpb25hbCBjb21waWxhdGlvbnMKKyQhCiskICEgQWRkIGRlZmluaXRpb25zIGZvciBubyB0aHJlYWRzIG9uIE9wZW5WTVMgNy4xIGFuZCBoaWdoZXIKKyQgQ09NUElMRVdJVEhfQ0MzID0gIixic3NfcnRjcCwiCiskICEgRGlzYWJsZSB0aGUgRE9MTEFSSUQgd2FybmluZworJCBDT01QSUxFV0lUSF9DQzQgPSAiLGFfdXRjdG0sYnNzX2xvZyxvX3RpbWUsb19kaXIiCiskICEgRGlzYWJsZSBkaXNqb2ludCBvcHRpbWl6YXRpb24KKyQgQ09NUElMRVdJVEhfQ0M1ID0gIixtZDJfZGdzdCxtZDRfZGdzdCxtZDVfZGdzdCxtZGMyZGdzdCwiICsgLQorICAgICAgICAgICAgICAgICAgICAic2VlZCxzaGFfZGdzdCxzaGExZGdzdCxybWRfZGdzdCxiZl9lbmMsIgorJCAhIERpc2FibGUgdGhlIE1JWExJTktBR0Ugd2FybmluZworJCBDT01QSUxFV0lUSF9DQzYgPSAiLGVuY19yZWFkLHNldF9rZXksIgorJCEKKyQhIEZpZ3VyZSBPdXQgV2hhdCBPdGhlciBNb2R1bGVzIFdlIEFyZSBUbyBCdWlsZC4KKyQhCiskIEJVSUxEX1NFVDoKKyQhCiskISBEZWZpbmUgQSBNb2R1bGUgQ291bnRlci4KKyQhCiskIE1PRFVMRV9DT1VOVEVSID0gMAorJCEKKyQhIFRvcCBPZiBUaGUgTG9vcC4KKyQhCiskIE1PRFVMRV9ORVhUOgorJCEKKyQhIEV4dHJhY3QgVGhlIE1vZHVsZSBOYW1lIEZyb20gVGhlIEVuY3J5cHRpb24gTGlzdC4KKyQhCiskIE1PRFVMRV9OQU1FID0gRiRFTEVNRU5UKE1PRFVMRV9DT1VOVEVSLCIsIixFTkNSWVBUX1RZUEVTKQorJCBJRiBNT0RVTEVfTkFNRS5FUVMuIkJhc2ljIiBUSEVOIE1PRFVMRV9OQU1FID0gIiIKKyQgTU9EVUxFX05BTUUxID0gTU9EVUxFX05BTUUKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgQXJlIEF0IFRoZSBFbmQgT2YgVGhlIE1vZHVsZSBMaXN0LgorJCEKKyQgSUYgKE1PRFVMRV9OQU1FLkVRUy4iLCIpIAorJCBUSEVOIAorJCEKKyQhICBXZSBBcmUgQXQgVGhlIEVuZCBPZiBUaGUgTW9kdWxlIExpc3QsIEdvIFRvIE1PRFVMRV9ET05FLgorJCEKKyQgICBHT1RPIE1PRFVMRV9ET05FCiskIQorJCEgRW5kIFRoZSBNb2R1bGUgTGlzdCBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgSW5jcmVtZW50IFRoZSBNb3VkbGUgQ291bnRlci4KKyQhCiskIE1PRFVMRV9DT1VOVEVSID0gTU9EVUxFX0NPVU5URVIgKyAxCiskIQorJCEgQ3JlYXRlIFRoZSBMaWJyYXJ5IGFuZCBBcHBzIE1vZHVsZSBOYW1lcy4KKyQhCiskIExJQl9NT0RVTEUgPSAiTElCXyIgKyBNT0RVTEVfTkFNRQorJCBBUFBTX01PRFVMRSA9ICJBUFBTXyIgKyBNT0RVTEVfTkFNRQorJCBJRiAoRiRFWFRSQUNUKDAsNSxNT0RVTEVfTkFNRSkuRVFTLiJBU04xXyIpCiskIFRIRU4KKyQgICBNT0RVTEVfTkFNRSA9ICJBU04xIgorJCBFTkRJRgorJCBJRiAoRiRFWFRSQUNUKDAsNCxNT0RVTEVfTkFNRSkuRVFTLiJFVlBfIikKKyQgVEhFTgorJCAgIE1PRFVMRV9OQU1FID0gIkVWUCIKKyQgRU5ESUYKKyQhCiskISBTZXQgc3RhdGUgKGNhbiBiZSBMSUIgYW5kIEFQUFMpCiskIQorJCBTVEFURSA9ICJMSUIiCiskIElGIEJVSUxEQUxMIC5FUVMuICJBUFBTIiBUSEVOIFNUQVRFID0gIkFQUFMiCiskIQorJCEgQ2hlY2sgaWYgdGhlIGxpYnJhcnkgbW9kdWxlIG5hbWUgYWN0dWFsbHkgaXMgZGVmaW5lZAorJCEKKyQgSUYgRiRUWVBFKCdMSUJfTU9EVUxFJykgLkVRUy4gIiIKKyQgVEhFTgorJCAgIFdSSVRFIFNZUyRFUlJPUiAiIgorJCAgIFdSSVRFIFNZUyRFUlJPUiAiVGhlIG1vZHVsZSAiLE1PRFVMRV9OQU1FMSwiIGRvZXMgbm90IGV4aXN0LiAgQ29udGludWluZy4uLiIKKyQgICBXUklURSBTWVMkRVJST1IgIiIKKyQgICBHT1RPIE1PRFVMRV9ORVhUCiskIEVORElGCiskIQorJCEgVG9wIE9mIFRoZSBNb2R1bGUgTG9vcC4KKyQhCiskIE1PRFVMRV9BR0FJTjoKKyQhCiskISBUZWxsIFRoZSBVc2VyIFdoYXQgTW9kdWxlIFdlIEFyZSBCdWlsZGluZy4KKyQhCiskIElGIChNT0RVTEVfTkFNRTEuTkVTLiIiKSAKKyQgVEhFTgorJCAgIElGIFNUQVRFIC5FUVMuICJMSUIiCiskICAgVEhFTgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiQ29tcGlsaW5nIFRoZSAiLE1PRFVMRV9OQU1FMSwiIExpYnJhcnkgRmlsZXMuICgiLEJVSUxEQUxMLCIsIixTVEFURSwiKSIKKyQgICBFTFNFIElGIEYkVFlQRSgnQVBQU19NT0RVTEUnKSAuTkVTLiAiIgorJCAgICAgVEhFTgorJCAgICAgICBXUklURSBTWVMkT1VUUFVUICJDb21waWxpbmcgVGhlICIsTU9EVUxFX05BTUUxLCIgQXBwbGljYXRpb25zLiAoIixCVUlMREFMTCwiLCIsU1RBVEUsIikiCiskICAgICBFTkRJRgorJCAgIEVORElGCiskIEVORElGCiskIQorJCEgIERlZmluZSBBIEZpbGUgQ291bnRlciBBbmQgU2V0IEl0IFRvICIwIi4KKyQhCiskIEZJTEVfQ09VTlRFUiA9IDAKKyQgQVBQTElDQVRJT04gPSAiIgorJCBBUFBMSUNBVElPTl9DT1VOVEVSID0gMAorJCEKKyQhIFRvcCBPZiBUaGUgRmlsZSBMb29wLgorJCEKKyQgTkVYVF9GSUxFOgorJCEKKyQhIExvb2sgaW4gdGhlIExJQl9NT0RVTEUgaXMgd2UncmUgaW4gc3RhdGUgTElCCiskIQorJCBJRiBTVEFURSAuRVFTLiAiTElCIgorJCBUSEVOCiskIQorJCEgICBPLkssIEV4dHJhY3QgVGhlIEZpbGUgTmFtZSBGcm9tIFRoZSBGaWxlIExpc3QuCiskIQorJCAgIEZJTEVfTkFNRSA9IEYkRUxFTUVOVChGSUxFX0NPVU5URVIsIiwiLCdMSUJfTU9EVUxFJykKKyQhCiskISAgIGVsc2UKKyQhCiskIEVMU0UKKyQgICBGSUxFX05BTUUgPSAiLCIKKyQhCiskICAgSUYgRiRUWVBFKCdBUFBTX01PRFVMRScpIC5ORVMuICIiCiskICAgVEhFTgorJCEKKyQhICAgICBFeHRyYWN0IFRoZSBGaWxlIE5hbWUgRnJvbSBUaGUgRmlsZSBMaXN0LgorJCEgICAgIFRoaXMgcGFydCBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLgorJCEKKyQgICAgIElGIEFQUExJQ0FUSU9OIC5FUVMuICIiCiskICAgICBUSEVOCiskICAgICAgIEFQUExJQ0FUSU9OID0gRiRFTEVNRU5UKEFQUExJQ0FUSU9OX0NPVU5URVIsIjsiLCdBUFBTX01PRFVMRScpCiskICAgICAgIEFQUExJQ0FUSU9OX0NPVU5URVIgPSBBUFBMSUNBVElPTl9DT1VOVEVSICsgMQorJCAgICAgICBBUFBMSUNBVElPTl9PQkpFQ1RTID0gRiRFTEVNRU5UKDEsIi8iLEFQUExJQ0FUSU9OKQorJCAgICAgICBBUFBMSUNBVElPTiA9IEYkRUxFTUVOVCgwLCIvIixBUFBMSUNBVElPTikKKyQgICAgICAgRklMRV9DT1VOVEVSID0gMAorJCAgICAgRU5ESUYKKyQKKyQhICAgICBXUklURSBTWVMkT1VUUFVUICJERUJVRzogU0hPVyBTWU1CT0wgQVBQTElDQVRJT04qIgorJCEgICAgIFNIT1cgU1lNQk9MIEFQUExJQ0FUSU9OKgorJCEKKyQgICAgIElGIEFQUExJQ0FUSU9OIC5ORVMuICI7IgorJCAgICAgVEhFTgorJCAgICAgICBGSUxFX05BTUUgPSBGJEVMRU1FTlQoRklMRV9DT1VOVEVSLCIsIixBUFBMSUNBVElPTl9PQkpFQ1RTKQorJCAgICAgICBJRiBGSUxFX05BTUUgLkVRUy4gIiwiCiskICAgICAgIFRIRU4KKyQgICAgICAgICBBUFBMSUNBVElPTiA9ICIiCiskICAgICAgICAgR09UTyBORVhUX0ZJTEUKKyQgICAgICAgRU5ESUYKKyQgICAgIEVORElGCiskICAgRU5ESUYKKyQgRU5ESUYKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgQXJlIEF0IFRoZSBFbmQgT2YgVGhlIEZpbGUgTGlzdC4KKyQhCiskIElGIChGSUxFX05BTUUuRVFTLiIsIikgCiskIFRIRU4gCiskIQorJCEgIFdlIEFyZSBBdCBUaGUgRW5kIE9mIFRoZSBGaWxlIExpc3QsIENoYW5nZSBTdGF0ZSBPciBHb3RvIEZJTEVfRE9ORS4KKyQhCiskICAgSUYgU1RBVEUgLkVRUy4gIkxJQiIgLkFORC4gQlVJTERBTEwgLk5FUy4gIkxJQlJBUlkiCiskICAgVEhFTgorJCAgICAgU1RBVEUgPSAiQVBQUyIKKyQgICAgIEdPVE8gTU9EVUxFX0FHQUlOCiskICAgRUxTRQorJCAgICAgR09UTyBGSUxFX0RPTkUKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgRmlsZSBMaXN0IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBJbmNyZW1lbnQgVGhlIENvdW50ZXIuCiskIQorJCBGSUxFX0NPVU5URVIgPSBGSUxFX0NPVU5URVIgKyAxCiskIQorJCEgQ3JlYXRlIFRoZSBTb3VyY2UgRmlsZSBOYW1lLgorJCEKKyQgVE1QX0ZJTEVfTkFNRSA9IEYkRUxFTUVOVCgxLCJdIixGSUxFX05BTUUpCiskIElGIFRNUF9GSUxFX05BTUUgLkVRUy4gIl0iIFRIRU4gVE1QX0ZJTEVfTkFNRSA9IEZJTEVfTkFNRQorJCBJRiBGJEVMRU1FTlQoMCwiLiIsVE1QX0ZJTEVfTkFNRSkgLkVRUy4gVE1QX0ZJTEVfTkFNRSBUSEVOIC0KKwlGSUxFX05BTUUgPSBGSUxFX05BTUUgKyAiLmMiCiskIElGIChNT0RVTEVfTkFNRS5ORVMuIiIpCiskIFRIRU4KKyQgICBTT1VSQ0VfRklMRSA9ICJTWVMkRElTSzpbLiIgKyBNT0RVTEVfTkFNRSsgIl0iICsgRklMRV9OQU1FCiskIEVMU0UKKyQgICBTT1VSQ0VfRklMRSA9ICJTWVMkRElTSzpbXSIgKyBGSUxFX05BTUUKKyQgRU5ESUYKKyQgU09VUkNFX0ZJTEUgPSBTT1VSQ0VfRklMRSAtICJdWyIKKyQhCiskISBDcmVhdGUgVGhlIE9iamVjdCBGaWxlIE5hbWUuCiskIQorJCBPQkpFQ1RfRklMRSA9IE9CSl9ESVIgKyBGJFBBUlNFKEZJTEVfTkFNRSwsLCJOQU1FIiwiU1lOVEFYX09OTFkiKSArICIuT0JKIgorJCBPTiBXQVJOSU5HIFRIRU4gR09UTyBORVhUX0ZJTEUKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgVGhlIEZpbGUgV2UgV2FudCBUbyBDb21waWxlIElzIEFjdHVhbGx5IFRoZXJlLgorJCEKKyQgSUYgKEYkU0VBUkNIKFNPVVJDRV9GSUxFKS5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgVGVsbCBUaGUgVXNlciBUaGF0IFRoZSBGaWxlIERvZXNuJ3QgRXhpc3QuCiskIQorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICJUaGUgRmlsZSAiLFNPVVJDRV9GSUxFLCIgRG9lc24ndCBFeGlzdC4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBFeGl0IFRoZSBCdWlsZC4KKyQhCiskICAgR09UTyBFWElUCiskIQorJCEgRW5kIFRoZSBGaWxlIEV4aXN0IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBUZWxsIFRoZSBVc2VyIFdlIEFyZSBDb21waWxpbmcgVGhlIEZpbGUuCiskIQorJCBJRiAoTU9EVUxFX05BTUUuRVFTLiIiKQorJCBUSEVOCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiQ29tcGlsaW5nIFRoZSAiLEZJTEVfTkFNRSwiIEZpbGUuICAoIixCVUlMREFMTCwiLCIsU1RBVEUsIikiCiskIEVORElGCiskIElGIChNT0RVTEVfTkFNRS5ORVMuIiIpCiskIFRIRU4gCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiCSIsRklMRV9OQU1FLCIiCiskIEVORElGCiskIQorJCEgQ29tcGlsZSBUaGUgRmlsZS4KKyQhCiskIE9OIEVSUk9SIFRIRU4gR09UTyBORVhUX0ZJTEUKKyQgRklMRV9OQU1FMCA9IEYkRUxFTUVOVCgwLCIuIixGSUxFX05BTUUpCiskIElGIEZJTEVfTkFNRSAtICIubWFyIiAuTkVTLiBGSUxFX05BTUUKKyQgVEhFTgorJCAgIE1BQ1JPL09CSkVDVD0nT0JKRUNUX0ZJTEUnICdTT1VSQ0VfRklMRScKKyQgRUxTRQorJCAgIElGIENPTVBJTEVXSVRIX0NDMyAtIEZJTEVfTkFNRTAgLk5FUy4gQ09NUElMRVdJVEhfQ0MzCiskICAgVEhFTgorJCAgICAgQ0MzL09CSkVDVD0nT0JKRUNUX0ZJTEUnICdTT1VSQ0VfRklMRScKKyQgICBFTFNFCiskICAgICBJRiBDT01QSUxFV0lUSF9DQzQgLSBGSUxFX05BTUUwIC5ORVMuIENPTVBJTEVXSVRIX0NDNAorJCAgICAgVEhFTgorJCAgICAgICBDQzQvT0JKRUNUPSdPQkpFQ1RfRklMRScgJ1NPVVJDRV9GSUxFJworJCAgICAgRUxTRQorJCAgICAgICBJRiBDT01QSUxFV0lUSF9DQzUgLSBGSUxFX05BTUUwIC5ORVMuIENPTVBJTEVXSVRIX0NDNQorJCAgICAgICBUSEVOCiskICAgICAgICAgQ0M1L09CSkVDVD0nT0JKRUNUX0ZJTEUnICdTT1VSQ0VfRklMRScKKyQgICAgICAgRUxTRQorJCAgICAgICAgIElGIENPTVBJTEVXSVRIX0NDNiAtIEZJTEVfTkFNRTAgLk5FUy4gQ09NUElMRVdJVEhfQ0M2CiskICAgICAgICAgVEhFTgorJCAgICAgICAgICAgQ0M2L09CSkVDVD0nT0JKRUNUX0ZJTEUnICdTT1VSQ0VfRklMRScKKyQgICAgICAgICBFTFNFCiskICAgICAgICAgICBDQy9PQkpFQ1Q9J09CSkVDVF9GSUxFJyAnU09VUkNFX0ZJTEUnCiskICAgICAgICAgRU5ESUYKKyQgICAgICAgRU5ESUYKKyQgICAgIEVORElGCiskICAgRU5ESUYKKyQgRU5ESUYKKyQgSUYgU1RBVEUgLkVRUy4gIkxJQiIKKyQgVEhFTiAKKyQhCiskISAgIEFkZCBJdCBUbyBUaGUgTGlicmFyeS4KKyQhCiskICAgTElCUkFSWS9SRVBMQUNFICdMSUJfTkFNRScgJ09CSkVDVF9GSUxFJworJCEKKyQhICAgVGltZSBUbyBDbGVhbiBVcCBUaGUgT2JqZWN0IEZpbGUuCiskIQorJCAgIERFTEVURSAnT0JKRUNUX0ZJTEUnOyoKKyQgRU5ESUYKKyQhCiskISBHbyBCYWNrIEFuZCBEbyBJdCBBZ2Fpbi4KKyQhCiskIEdPVE8gTkVYVF9GSUxFCiskIQorJCEgQWxsIERvbmUgV2l0aCBUaGlzIExpYnJhcnkgUGFydC4KKyQhCiskIEZJTEVfRE9ORToKKyQhCiskISBUaW1lIFRvIEJ1aWxkIFNvbWUgQXBwbGljYXRpb25zCiskIQorJCBJRiBGJFRZUEUoJ0FQUFNfTU9EVUxFJykgLk5FUy4gIiIgLkFORC4gQlVJTERBTEwgLk5FUy4gIkxJQlJBUlkiCiskIFRIRU4KKyQgICBBUFBMSUNBVElPTl9DT1VOVEVSID0gMAorJCBORVhUX0FQUExJQ0FUSU9OOgorJCAgIEFQUExJQ0FUSU9OID0gRiRFTEVNRU5UKEFQUExJQ0FUSU9OX0NPVU5URVIsIjsiLCdBUFBTX01PRFVMRScpCiskICAgSUYgQVBQTElDQVRJT04gLkVRUy4gIjsiIFRIRU4gR09UTyBBUFBMSUNBVElPTl9ET05FCiskCiskICAgQVBQTElDQVRJT05fQ09VTlRFUiA9IEFQUExJQ0FUSU9OX0NPVU5URVIgKyAxCiskICAgQVBQTElDQVRJT05fT0JKRUNUUyA9IEYkRUxFTUVOVCgxLCIvIixBUFBMSUNBVElPTikKKyQgICBBUFBMSUNBVElPTiA9IEYkRUxFTUVOVCgwLCIvIixBUFBMSUNBVElPTikKKyQKKyQhICAgV1JJVEUgU1lTJE9VVFBVVCAiREVCVUc6IFNIT1cgU1lNQk9MIEFQUExJQ0FUSU9OKiIKKyQhICAgU0hPVyBTWU1CT0wgQVBQTElDQVRJT04qCiskIQorJCEgVGVsbCB0aGUgdXNlciB3aGF0IGhhcHBlbnMKKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiCSIsQVBQTElDQVRJT04sIi5leGUiCiskIQorJCEgTGluayBUaGUgUHJvZ3JhbS4KKyQhCiskICAgT04gRVJST1IgVEhFTiBHT1RPIE5FWFRfQVBQTElDQVRJT04KKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgQXJlIFRvIExpbmsgV2l0aCBBIFNwZWNpZmljIFRDUC9JUCBMaWJyYXJ5LgorJCEKKyQgICBJRiAoVENQSVBfTElCLk5FUy4iIikKKyQgICBUSEVOCiskIQorJCEgICAgTGluayBXaXRoIEEgVENQL0lQIExpYnJhcnkuCiskIQorJCAgICAgTElOSy8nREVCVUdHRVInLydUUkFDRUJBQ0snL0VYRT0nRVhFX0RJUicnQVBQTElDQVRJT04nLkVYRSAtCisgICAgICAgICAgJ09CSl9ESVInJ0FQUExJQ0FUSU9OX09CSkVDVFMnLCAtCisJICAnQ1JZUFRPX0xJQicvTElCUkFSWSwgLQorICAgICAgICAgICdUQ1BJUF9MSUInLCdPUFRfRklMRScvT1BUSU9OCiskIQorJCEgRWxzZS4uLgorJCEKKyQgICBFTFNFCiskIQorJCEgICAgRG9uJ3QgTGluayBXaXRoIEEgVENQL0lQIExpYnJhcnkuCiskIQorJCAgICAgTElOSy8nREVCVUdHRVInLydUUkFDRUJBQ0snL0VYRT0nRVhFX0RJUicnQVBQTElDQVRJT04nLkVYRSAtCisgICAgICAgICAgJ09CSl9ESVInJ0FQUExJQ0FUSU9OX09CSkVDVFMnLC0KKwkgICdDUllQVE9fTElCJy9MSUJSQVJZLCAtCisgICAgICAgICAgJ09QVF9GSUxFJy9PUFRJT04KKyQhCiskISBFbmQgVGhlIFRDUC9JUCBMaWJyYXJ5IENoZWNrLgorJCEKKyQgICBFTkRJRgorJCAgIEdPVE8gTkVYVF9BUFBMSUNBVElPTgorJCAgQVBQTElDQVRJT05fRE9ORToKKyQgRU5ESUYKKyQhCiskISBHbyBCYWNrIEFuZCBHZXQgVGhlIE5leHQgTW9kdWxlLgorJCEKKyQgR09UTyBNT0RVTEVfTkVYVAorJCEKKyQhIEFsbCBEb25lIFdpdGggVGhpcyBNb2R1bGUuCiskIQorJCBNT0RVTEVfRE9ORToKKyQhCiskISBUZWxsIFRoZSBVc2VyIFRoYXQgV2UgQXJlIEFsbCBEb25lLgorJCEKKyQgV1JJVEUgU1lTJE9VVFBVVCAiQWxsIERvbmUuLi4iCiskIEVYSVQ6CiskIEdPU1VCIENMRUFOVVAKKyQgRVhJVAorJCEKKyQhIENoZWNrIEZvciBUaGUgTGluayBPcHRpb24gRklsZS4KKyQhCiskIENIRUNLX09QVF9GSUxFOgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBOZWVkIFRvIE1ha2UgQSBWQVggQyBPcHRpb24gRmlsZS4KKyQhCiskIElGIChDT01QSUxFUi5FUVMuIlZBWEMiKQorJCBUSEVOCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBbHJlYWR5IEhhdmUgQSBWQVggQyBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgIElGIChGJFNFQVJDSChPUFRfRklMRSkuRVFTLiIiKQorJCAgIFRIRU4KKyQhCiskISAgICBXZSBOZWVkIEEgVkFYIEMgTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICAgIENSRUFURSAnT1BUX0ZJTEUnCiskREVDSworIQorISBEZWZhdWx0IFN5c3RlbSBPcHRpb25zIEZpbGUgVG8gTGluayBBZ2lhbnN0IAorISBUaGUgU2hhcmFibGUgVkFYIEMgUnVudGltZSBMaWJyYXJ5LgorIQorU1lTJFNIQVJFOlZBWENSVEwuRVhFL1NIQVJFCiskRU9ECiskIQorJCEgIEVuZCBUaGUgT3B0aW9uIEZpbGUgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBWQVhDIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgTmVlZCBBIEdOVSBDIE9wdGlvbiBGaWxlLgorJCEKKyQgSUYgKENPTVBJTEVSLkVRUy4iR05VQyIpCiskIFRIRU4KKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFscmVhZHkgSGF2ZSBBIEdOVSBDIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskICAgSUYgKEYkU0VBUkNIKE9QVF9GSUxFKS5FUVMuIiIpCiskICAgVEhFTgorJCEKKyQhICAgIFdlIE5lZWQgQSBHTlUgQyBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgICAgQ1JFQVRFICdPUFRfRklMRScKKyRERUNLCishCishIERlZmF1bHQgU3lzdGVtIE9wdGlvbnMgRmlsZSBUbyBMaW5rIEFnaWFuc3QgCishIFRoZSBTaGFyYWJsZSBDIFJ1bnRpbWUgTGlicmFyeS4KKyEKK0dOVV9DQzpbMDAwMDAwXUdDQ0xJQi9MSUJSQVJZCitTWVMkU0hBUkU6VkFYQ1JUTC9TSEFSRQorJEVPRAorJCEKKyQhICBFbmQgVGhlIE9wdGlvbiBGaWxlIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgR05VIEMgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBOZWVkIEEgREVDIEMgT3B0aW9uIEZpbGUuCiskIQorJCBJRiAoQ09NUElMRVIuRVFTLiJERUNDIikKKyQgVEhFTgorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgV2UgQWxyZWFkeSBIYXZlIEEgREVDIEMgTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICBJRiAoRiRTRUFSQ0goT1BUX0ZJTEUpLkVRUy4iIikKKyQgICBUSEVOCiskIQorJCEgICAgRmlndXJlIE91dCBJZiBXZSBOZWVkIEEgbm9uLVZBWCBPciBBIFZBWCBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgICAgSUYgQVJDSCAuRVFTLiAiVkFYIgorJCAgICAgVEhFTgorJCEKKyQhICAgICAgV2UgTmVlZCBBIERFQyBDIExpbmtlciBPcHRpb24gRmlsZSBGb3IgVkFYLgorJCEKKyQgICAgICAgQ1JFQVRFICdPUFRfRklMRScKKyRERUNLCishCishIERlZmF1bHQgU3lzdGVtIE9wdGlvbnMgRmlsZSBUbyBMaW5rIEFnaWFuc3QgCishIFRoZSBTaGFyYWJsZSBERUMgQyBSdW50aW1lIExpYnJhcnkuCishCitTWVMkU0hBUkU6REVDQyRTSFIuRVhFL1NIQVJFCiskRU9ECiskIQorJCEgICAgRWxzZS4uLgorJCEKKyQgICAgIEVMU0UKKyQhCiskISAgICAgIENyZWF0ZSBUaGUgbm9uLVZBWCBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgICAgICBDUkVBVEUgJ09QVF9GSUxFJworJERFQ0sKKyEKKyEgRGVmYXVsdCBTeXN0ZW0gT3B0aW9ucyBGaWxlIEZvciBub24tVkFYIFRvIExpbmsgQWdpYW5zdCAKKyEgVGhlIFNoYXJhYmxlIEMgUnVudGltZSBMaWJyYXJ5LgorIQorU1lTJFNIQVJFOkNNQSRPUEVOX0xJQl9TSFIvU0hBUkUKK1NZUyRTSEFSRTpDTUEkT1BFTl9SVEwvU0hBUkUKKyRFT0QKKyQhCiskISAgICBFbmQgVGhlIERFQyBDIE9wdGlvbiBGaWxlIENoZWNrLgorJCEKKyQgICAgIEVORElGCiskIQorJCEgIEVuZCBUaGUgT3B0aW9uIEZpbGUgU2VhcmNoLgorJCEKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgREVDIEMgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhICBUZWxsIFRoZSBVc2VyIFdoYXQgTGlua2VyIE9wdGlvbiBGaWxlIFdlIEFyZSBVc2luZy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIExpbmtlciBPcHRpb24gRmlsZSAiLE9QVF9GSUxFLCIuIgkKKyQhCiskISBUaW1lIFRvIFJFVFVSTi4KKyQhCiskIFJFVFVSTgorJCEKKyQhIENoZWNrIFRoZSBVc2VyJ3MgT3B0aW9ucy4KKyQhCiskIENIRUNLX09QVElPTlM6CiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFAxIElzIEJsYW5rLgorJCEKKyQgSUYgKFAxLkVRUy4iQUxMIikKKyQgVEhFTgorJCEKKyQhICAgUDEgSXMgQmxhbmssIFNvIEJ1aWxkIEV2ZXJ5dGhpbmcuCiskIQorJCAgICBCVUlMREFMTCA9ICJUUlVFIgorJCEKKyQhIEVsc2UuLi4KKyQhCiskIEVMU0UKKyQhCiskISAgRWxzZSwgQ2hlY2sgVG8gU2VlIElmIFAxIEhhcyBBIFZhbGlkIEFyZ3VtZW50LgorJCEKKyQgICBJRiAoUDEuRVFTLiJMSUJSQVJZIikuT1IuKFAxLkVRUy4iQVBQUyIpCiskICAgVEhFTgorJCEKKyQhICAgIEEgVmFsaWQgQXJndW1lbnQuCiskIQorJCAgICAgQlVJTERBTEwgPSBQMQorJCEKKyQhICBFbHNlLi4uCiskIQorJCAgIEVMU0UKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIFdlIERvbid0IEtub3cgV2hhdCBUaGV5IFdhbnQuCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIE9wdGlvbiAiLFAxLCIgSXMgSW52YWxpZC4gIFRoZSBWYWxpZCBPcHRpb25zIEFyZToiCiskICAgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgICAgQUxMICAgICAgOiAgSnVzdCBCdWlsZCBFdmVyeXRoaW5nLiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBMSUJSQVJZICA6ICBUbyBDb21waWxlIEp1c3QgVGhlIFsueHh4LkVYRS5DUllQVE9dTElCQ1JZUFRPLk9MQiBMaWJyYXJ5LiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBBUFBTICAgICA6ICBUbyBDb21waWxlIEp1c3QgVGhlIFsueHh4LkVYRS5DUllQVE9dKi5FWEUgUHJvZ3JhbXMuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIFdoZXJlICd4eHgnIFN0YW5kcyBGb3I6IgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIEFMUEhBICAgIDogIEFscGhhIEFyY2hpdGVjdHVyZS4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgICAgSUE2NCAgICAgOiAgSUE2NCBBcmNoaXRlY3R1cmUuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFZBWCAgICAgIDogIFZBWCBBcmNoaXRlY3R1cmUuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICAgIFRpbWUgVG8gRVhJVC4KKyQhCiskICAgICBFWElUCiskIQorJCEgIEVuZCBUaGUgVmFsaWQgQXJndW1lbnQgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBQMSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFAyIElzIEJsYW5rLgorJCEKKyQgSUYgKFAyLkVRUy4iTk9ERUJVRyIpCiskIFRIRU4KKyQhCiskISAgIFAyIElzIE5PREVCVUcsIFNvIENvbXBpbGUgV2l0aG91dCBUaGUgRGVidWdnZXIgSW5mb3JtYXRpb24uCiskIQorJCAgICBERUJVR0dFUiA9ICJOT0RFQlVHIgorJCAgICBUUkFDRUJBQ0sgPSAiTk9UUkFDRUJBQ0siIAorJCAgICBHQ0NfT1BUSU1JWkUgPSAiT1BUSU1JWkUiCiskICAgIENDX09QVElNSVpFID0gIk9QVElNSVpFIgorJCAgICBNQUNST19PUFRJTUlaRSA9ICJPUFRJTUlaRSIKKyQgICAgV1JJVEUgU1lTJE9VVFBVVCAiTm8gRGVidWdnZXIgSW5mb3JtYXRpb24gV2lsbCBCZSBQcm9kdWNlZCBEdXJpbmcgQ29tcGlsZS4iCiskICAgIFdSSVRFIFNZUyRPVVRQVVQgIkNvbXBpbGluZyBXaXRoIENvbXBpbGVyIE9wdGltaXphdGlvbi4iCiskIEVMU0UKKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFyZSBUbyBDb21waWxlIFdpdGggRGVidWdnZXIgSW5mb3JtYXRpb24uCiskIQorJCAgIElGIChQMi5FUVMuIkRFQlVHIikKKyQgICBUSEVOCiskIQorJCEgICAgQ29tcGlsZSBXaXRoIERlYnVnZ2VyIEluZm9ybWF0aW9uLgorJCEKKyQgICAgIERFQlVHR0VSID0gIkRFQlVHIgorJCAgICAgVFJBQ0VCQUNLID0gIlRSQUNFQkFDSyIKKyQgICAgIEdDQ19PUFRJTUlaRSA9ICJOT09QVElNSVpFIgorJCAgICAgQ0NfT1BUSU1JWkUgPSAiTk9PUFRJTUlaRSIKKyQgICAgIE1BQ1JPX09QVElNSVpFID0gIk5PT1BUSU1JWkUiCiskICAgICBXUklURSBTWVMkT1VUUFVUICJEZWJ1Z2dlciBJbmZvcm1hdGlvbiBXaWxsIEJlIFByb2R1Y2VkIER1cmluZyBDb21waWxlLiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIkNvbXBpbGluZyBXaXRob3V0IENvbXBpbGVyIE9wdGltaXphdGlvbi4iCiskICAgRUxTRSAKKyQhCiskISAgICBUaGV5IEVudGVyZWQgQW4gSW52YWxpZCBPcHRpb24uLgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlRoZSBPcHRpb24gIixQMiwiIElzIEludmFsaWQuICBUaGUgVmFsaWQgT3B0aW9ucyBBcmU6IgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgICBERUJVRyAgIDogIENvbXBpbGUgV2l0aCBUaGUgRGVidWdnZXIgSW5mb3JtYXRpb24uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgICBOT0RFQlVHIDogIENvbXBpbGUgV2l0aG91dCBUaGUgRGVidWdnZXIgSW5mb3JtYXRpb24uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICAgIFRpbWUgVG8gRVhJVC4KKyQhCiskICAgICBFWElUCiskIQorJCEgIEVuZCBUaGUgVmFsaWQgQXJndW1lbnQgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBQMiBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgU3BlY2lhbCBUaHJlYWRzIEZvciBPcGVuVk1TIHY3LjEgT3IgTGF0ZXIKKyQhCiskISBXcml0dGVuIEJ5OiAgUmljaGFyZCBMZXZpdHRlCiskISAgICAgICAgICAgICAgcmljaGFyZEBsZXZpdHRlLm9yZworJCEKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgSGF2ZSBBIE9wdGlvbiBGb3IgUDUuCiskIQorJCBJRiAoUDUuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIEdldCBUaGUgVmVyc2lvbiBPZiBWTVMgV2UgQXJlIFVzaW5nLgorJCEKKyQgICBJU1NFVkVOIDo9CiskICAgVE1QID0gRiRFTEVNRU5UKDAsIi0iLEYkRVhUUkFDVCgxLDQsRiRHRVRTWUkoIlZFUlNJT04iKSkpCiskICAgVE1QID0gRiRJTlRFR0VSKEYkRUxFTUVOVCgwLCIuIixUTVApK0YkRUxFTUVOVCgxLCIuIixUTVApKQorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgVGhlIFZNUyBWZXJzaW9uIElzIHY3LjEgT3IgTGF0ZXIuCiskIQorJCAgIElGIChUTVAuR0UuNzEpCiskICAgVEhFTgorJCEKKyQhICAgIFdlIEhhdmUgT3BlblZNUyB2Ny4xIE9yIExhdGVyLCBTbyBVc2UgVGhlIFNwZWNpYWwgVGhyZWFkcy4KKyQhCiskICAgICBJU1NFVkVOIDo9ICxQVEhSRUFEX1VTRV9ENAorJCEKKyQhICBFbmQgVGhlIFZNUyBWZXJzaW9uIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgUDUgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBQMyBJcyBCbGFuay4KKyQhCiskIElGIChQMy5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgTy5LLiwgVGhlIFVzZXIgRGlkbid0IFNwZWNpZnkgQSBDb21waWxlciwgTGV0J3MgVHJ5IFRvCiskISAgRmluZCBPdXQgV2hpY2ggT25lIFRvIFVzZS4KKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgR05VIEMuCiskIQorJCAgIElGIChGJFRSTkxOTSgiR05VX0NDIikuTkVTLiIiKQorJCAgIFRIRU4KKyQhCiskISAgICBMb29rcyBMaWtlIEdOVUMsIFNldCBUbyBVc2UgR05VQy4KKyQhCiskICAgICBQMyA9ICJHTlVDIgorJCEKKyQhICBFbHNlLi4uCiskIQorJCAgIEVMU0UKKyQhCiskISAgICBDaGVjayBUbyBTZWUgSWYgV2UgSGF2ZSBWQVhDIE9yIERFQ0MuCiskIQorJCAgICAgSUYgKEFSQ0guTkVTLiJWQVgiKS5PUi4oRiRUUk5MTk0oIkRFQ0MkQ0NfREVGQVVMVCIpLk5FUy4iIikKKyQgICAgIFRIRU4gCiskIQorJCEgICAgICBMb29rcyBMaWtlIERFQ0MsIFNldCBUbyBVc2UgREVDQy4KKyQhCiskICAgICAgIFAzID0gIkRFQ0MiCiskIQorJCEgICAgRWxzZS4uLgorJCEKKyQgICAgIEVMU0UKKyQhCiskISAgICAgIExvb2tzIExpa2UgVkFYQywgU2V0IFRvIFVzZSBWQVhDLgorJCEKKyQgICAgICAgUDMgPSAiVkFYQyIKKyQhCiskISAgICBFbmQgVGhlIFZBWEMgQ29tcGlsZXIgQ2hlY2suCiskIQorJCAgICAgRU5ESUYKKyQhCiskISAgRW5kIFRoZSBERUNDICYgVkFYQyBDb21waWxlciBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISAgRW5kIFRoZSBDb21waWxlciBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgQSBPcHRpb24gRm9yIFA0LgorJCEKKyQgSUYgKFA0LkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBGaW5kIG91dCB3aGF0IHNvY2tldCBsaWJyYXJ5IHdlIGhhdmUgYXZhaWxhYmxlCiskIQorJCAgIElGIEYkUEFSU0UoIlNPQ0tFVFNIUjoiKSAuTkVTLiAiIgorJCAgIFRIRU4KKyQhCiskISAgICBXZSBoYXZlIFNPQ0tFVFNIUiwgYW5kIGl0IGlzIG15IG9waW5pb24gdGhhdCBpdCdzIHRoZSBiZXN0IHRvIHVzZS4KKyQhCiskICAgICBQNCA9ICJTT0NLRVRTSFIiCiskIQorJCEgICAgVGVsbCB0aGUgdXNlcgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIFNPQ0tFVFNIUiBmb3IgVENQL0lQIgorJCEKKyQhICAgIEVsc2UsIGxldCdzIGxvb2sgZm9yIHNvbWV0aGluZyBlbHNlCiskIQorJCAgIEVMU0UKKyQhCiskISAgICBMaWtlIFVDWCAodGhlIHJlYXNvbiB0byBkbyB0aGlzIGJlZm9yZSBNdWx0aW5ldCBpcyB0aGF0IHRoZSBVQ1gKKyQhICAgIGVtdWxhdGlvbiBpcyBlYXNpZXIgdG8gdXNlLi4uKQorJCEKKyQgICAgIElGIEYkVFJOTE5NKCJVQ1gkSVBDX1NIUiIpIC5ORVMuICIiIC0KKwkgLk9SLiBGJFBBUlNFKCJTWVMkU0hBUkU6VUNYJElQQ19TSFIuRVhFIikgLk5FUy4gIiIgLQorCSAuT1IuIEYkUEFSU0UoIlNZUyRMSUJSQVJZOlVDWCRJUEMuT0xCIikgLk5FUy4gIiIKKyQgICAgIFRIRU4KKyQhCiskIQlMYXN0IHJlc29ydDogYSBVQ1ggb3IgVUNYLWNvbXBhdGlibGUgbGlicmFyeQorJCEKKyQJUDQgPSAiVUNYIgorJCEKKyQhICAgICAgVGVsbCB0aGUgdXNlcgorJCEKKyQgICAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVXNpbmcgVUNYIG9yIGFuIGVtdWxhdGlvbiB0aGVyZW9mIGZvciBUQ1AvSVAiCiskIQorJCEJVGhhdCB3YXMgYWxsLi4uCiskIQorJCAgICAgRU5ESUYKKyQgICBFTkRJRgorJCBFTkRJRgorJCEKKyQhIFNldCBVcCBJbml0aWFsIENDIERlZmluaXRpb25zLCBQb3NzaWJseSBXaXRoIFVzZXIgT25lcworJCEKKyQgQ0NERUZTID0gIlRDUElQX1RZUEVfJydQNCcsRFNPX1ZNUyIKKyQgSUYgRiRUWVBFKFVTRVJfQ0NERUZTKSAuTkVTLiAiIiBUSEVOIENDREVGUyA9IENDREVGUyArICIsIiArIFVTRVJfQ0NERUZTCiskIENDRVhUUkFGTEFHUyA9ICIiCiskIElGIEYkVFlQRShVU0VSX0NDRkxBR1MpIC5ORVMuICIiIFRIRU4gQ0NFWFRSQUZMQUdTID0gVVNFUl9DQ0ZMQUdTCiskIENDRElTQUJMRVdBUk5JTkdTID0gIkxPTkdMT05HVFlQRSxMT05HTE9OR1NVRlgsRk9VTkRDUiIKKyQgSUYgRiRUWVBFKFVTRVJfQ0NESVNBQkxFV0FSTklOR1MpIC5ORVMuICIiIFRIRU4gLQorCUNDRElTQUJMRVdBUk5JTkdTID0gQ0NESVNBQkxFV0FSTklOR1MgKyAiLCIgKyBVU0VSX0NDRElTQUJMRVdBUk5JTkdTCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBUaGUgVXNlciBFbnRlcmVkIEEgVmFsaWQgUGFyYW10ZXIuCiskIQorJCBJRiAoUDMuRVFTLiJWQVhDIikuT1IuKFAzLkVRUy4iREVDQyIpLk9SLihQMy5FUVMuIkdOVUMiKQorJCBUSEVOCiskIQorJCEgICAgQ2hlY2sgVG8gU2VlIElmIFRoZSBVc2VyIFdhbnRlZCBERUNDLgorJCEKKyQgICBJRiAoUDMuRVFTLiJERUNDIikKKyQgICBUSEVOCiskIQorJCEgICAgTG9va3MgTGlrZSBERUNDLCBTZXQgVG8gVXNlIERFQ0MuCiskIQorJCAgICAgQ09NUElMRVIgPSAiREVDQyIKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIFdlIEFyZSBVc2luZyBERUNDLgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIERFQ0MgJ0MnIENvbXBpbGVyLiIKKyQhCiskISAgICBVc2UgREVDQy4uLgorJCEKKyQgICAgIENDID0gIkNDIgorJCAgICAgSUYgQVJDSC5FUVMuIlZBWCIgLkFORC4gRiRUUk5MTk0oIkRFQ0MkQ0NfREVGQVVMVCIpLk5FUy4iL0RFQ0MiIC0KKwkgVEhFTiBDQyA9ICJDQy9ERUNDIgorJCAgICAgQ0MgPSBDQyArICIvJydDQ19PUFRJTUlaRScvJydERUJVR0dFUicvU1RBTkRBUkQ9QU5TSTg5IiArIC0KKyAgICAgICAgICAgIi9OT0xJU1QvUFJFRklYPUFMTCIgKyAtCisJICAgIi9JTkNMVURFPShTWVMkRElTSzpbXSxTWVMkRElTSzpbLl8nJ0FSQ0gnXSxTWVMkRElTSzpbLV0sU1lTJERJU0s6Wy5FTkdJTkUuVkVORE9SX0RFRk5TXSxTWVMkRElTSzpbLkVWUF0sU1lTJERJU0s6Wy5BU04xXSkiICsgLQorCSAgIENDRVhUUkFGTEFHUworJCEKKyQhICAgIERlZmluZSBUaGUgTGlua2VyIE9wdGlvbnMgRmlsZSBOYW1lLgorJCEKKyQgICAgIE9QVF9GSUxFID0gIicnRVhFX0RJUidWQVhfREVDQ19PUFRJT05TLk9QVCIKKyQhCiskISAgRW5kIERFQ0MgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgVG8gVXNlIFZBWEMuCiskIQorJCAgIElGIChQMy5FUVMuIlZBWEMiKQorJCAgIFRIRU4KKyQhCiskISAgICBMb29rcyBMaWtlIFZBWEMsIFNldCBUbyBVc2UgVkFYQy4KKyQhCiskICAgICBDT01QSUxFUiA9ICJWQVhDIgorJCEKKyQhICAgIFRlbGwgVGhlIFVzZXIgV2UgQXJlIFVzaW5nIFZBWCBDLgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIFZBWEMgJ0MnIENvbXBpbGVyLiIKKyQhCiskISAgICBDb21waWxlIFVzaW5nIFZBWEMuCiskIQorJCAgICAgQ0MgPSAiQ0MiCiskICAgICBJRiBBUkNILk5FUy4iVkFYIgorJCAgICAgVEhFTgorJAlXUklURSBTWVMkT1VUUFVUICJUaGVyZSBpcyBubyBWQVggQyBvbiAnJ0FSQ0gnISIKKyQJRVhJVAorJCAgICAgRU5ESUYKKyQgICAgIElGIEYkVFJOTE5NKCJERUNDJENDX0RFRkFVTFQiKS5FUVMuIi9ERUNDIiBUSEVOIENDID0gIkNDL1ZBWEMiCiskICAgICBDQyA9IENDICsgIi8nJ0NDX09QVElNSVpFJy8nJ0RFQlVHR0VSJy9OT0xJU1QiICsgLQorCSAgICIvSU5DTFVERT0oU1lTJERJU0s6W10sU1lTJERJU0s6Wy5fJydBUkNIJ10sU1lTJERJU0s6Wy1dLFNZUyRESVNLOlsuRU5HSU5FLlZFTkRPUl9ERUZOU10sU1lTJERJU0s6Wy5FVlBdLFNZUyRESVNLOlsuQVNOMV0pIiArIC0KKwkgICBDQ0VYVFJBRkxBR1MKKyQgICAgIENDREVGUyA9ICIiIlZBWEMiIiwiICsgQ0NERUZTCiskIQorJCEgICAgRGVmaW5lIDxzeXM+IEFzIFNZUyRDT01NT046W1NZU0xJQl0KKyQhCiskICAgICBERUZJTkUvTk9MT0cgU1lTIFNZUyRDT01NT046W1NZU0xJQl0KKyQhCiskISAgICBEZWZpbmUgVGhlIExpbmtlciBPcHRpb25zIEZpbGUgTmFtZS4KKyQhCiskICAgICBPUFRfRklMRSA9ICInJ0VYRV9ESVInVkFYX1ZBWENfT1BUSU9OUy5PUFQiCiskIQorJCEgIEVuZCBWQVhDIENoZWNrCiskIQorJCAgIEVORElGCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgVG8gVXNlIEdOVSBDLgorJCEKKyQgICBJRiAoUDMuRVFTLiJHTlVDIikKKyQgICBUSEVOCiskIQorJCEgICAgTG9va3MgTGlrZSBHTlVDLCBTZXQgVG8gVXNlIEdOVUMuCiskIQorJCAgICAgQ09NUElMRVIgPSAiR05VQyIKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIFdlIEFyZSBVc2luZyBHTlVDLgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIEdOVSAnQycgQ29tcGlsZXIuIgorJCEKKyQhICAgIFVzZSBHTlUgQy4uLgorJCEKKyQgICAgIENDID0gIkdDQy9OT0NBU0VfSEFDSy8nJ0dDQ19PUFRJTUlaRScvJydERUJVR0dFUicvTk9MSVNUIiArIC0KKwkgICAiL0lOQ0xVREU9KFNZUyRESVNLOltdLFNZUyRESVNLOlsuXycnQVJDSCddLFNZUyRESVNLOlstXSxTWVMkRElTSzpbLkVOR0lORS5WRU5ET1JfREVGTlNdLFNZUyRESVNLOlsuRVZQXSxTWVMkRElTSzpbLkFTTjFdKSIgKyAtCisJICAgQ0NFWFRSQUZMQUdTCiskIQorJCEgICAgRGVmaW5lIFRoZSBMaW5rZXIgT3B0aW9ucyBGaWxlIE5hbWUuCiskIQorJCAgICAgT1BUX0ZJTEUgPSAiJydFWEVfRElSJ1ZBWF9HTlVDX09QVElPTlMuT1BUIgorJCEKKyQhICBFbmQgVGhlIEdOVSBDIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhICBTZXQgdXAgZGVmYXVsdCBkZWZpbmVzCiskIQorJCAgIENDREVGUyA9ICIiIkZMQVRfSU5DPTEiIiwiICsgQ0NERUZTCiskIQorJCEgIEZpbmlzaCB1cCB0aGUgZGVmaW5pdGlvbiBvZiBDQy4KKyQhCiskICAgSUYgQ09NUElMRVIgLkVRUy4gIkRFQ0MiCiskICAgVEhFTgorJCAgICAgSUYgQ0NESVNBQkxFV0FSTklOR1MgLkVRUy4gIiIKKyQgICAgIFRIRU4KKyQgICAgICAgQ0M0RElTQUJMRVdBUk5JTkdTID0gIkRPTExBUklEIgorJCAgICAgICBDQzZESVNBQkxFV0FSTklOR1MgPSAiTUlYTElOS0FHRSIKKyQgICAgIEVMU0UKKyQgICAgICAgQ0M0RElTQUJMRVdBUk5JTkdTID0gQ0NESVNBQkxFV0FSTklOR1MgKyAiLERPTExBUklEIgorJCAgICAgICBDQzZESVNBQkxFV0FSTklOR1MgPSBDQ0RJU0FCTEVXQVJOSU5HUyArICIsTUlYTElOS0FHRSIKKyQgICAgICAgQ0NESVNBQkxFV0FSTklOR1MgPSAiL1dBUk5JTkc9KERJU0FCTEU9KCIgKyBDQ0RJU0FCTEVXQVJOSU5HUyArICIpKSIKKyQgICAgIEVORElGCiskICAgICBDQzRESVNBQkxFV0FSTklOR1MgPSAiL1dBUk5JTkc9KERJU0FCTEU9KCIgKyBDQzRESVNBQkxFV0FSTklOR1MgKyAiKSkiCiskICAgICBDQzZESVNBQkxFV0FSTklOR1MgPSAiL1dBUk5JTkc9KERJU0FCTEU9KCIgKyBDQzZESVNBQkxFV0FSTklOR1MgKyAiKSkiCiskICAgRUxTRQorJCAgICAgQ0NESVNBQkxFV0FSTklOR1MgPSAiIgorJCAgICAgQ0M0RElTQUJMRVdBUk5JTkdTID0gIiIKKyQgICAgIENDNkRJU0FCTEVXQVJOSU5HUyA9ICIiCiskICAgRU5ESUYKKyQgICBDQzMgPSBDQyArICIvREVGSU5FPSgiICsgQ0NERUZTICsgSVNTRVZFTiArICIpIiArIENDRElTQUJMRVdBUk5JTkdTCiskICAgQ0MgPSBDQyArICIvREVGSU5FPSgiICsgQ0NERUZTICsgIikiICsgQ0NESVNBQkxFV0FSTklOR1MKKyQgICBJRiBBUkNIIC5FUVMuICJWQVgiIC5BTkQuIENPTVBJTEVSIC5FUVMuICJERUNDIiAuQU5ELiBQMiAuTkVTLiAiREVCVUciCiskICAgVEhFTgorJCAgICAgQ0M1ID0gQ0MgKyAiL09QVElNSVpFPU5PRElTSk9JTlQiCiskICAgRUxTRQorJCAgICAgQ0M1ID0gQ0MgKyAiL05PT1BUSU1JWkUiCiskICAgRU5ESUYKKyQgICBDQzQgPSBDQyAtIENDRElTQUJMRVdBUk5JTkdTICsgQ0M0RElTQUJMRVdBUk5JTkdTCiskICAgQ0M2ID0gQ0MgLSBDQ0RJU0FCTEVXQVJOSU5HUyArIENDNkRJU0FCTEVXQVJOSU5HUworJCEKKyQhICBTaG93IHVzZXIgdGhlIHJlc3VsdAorJCEKKyQgICBXUklURS9TWU1CT0wgU1lTJE9VVFBVVCAiTWFpbiBDIENvbXBpbGluZyBDb21tYW5kOiAiLENDCiskIQorJCEgIEVsc2UgVGhlIFVzZXIgRW50ZXJlZCBBbiBJbnZhbGlkIEFyZ3VtZW50LgorJCEKKyQgRUxTRQorJCEKKyQhICBUZWxsIFRoZSBVc2VyIFdlIERvbid0IEtub3cgV2hhdCBUaGV5IFdhbnQuCiskIQorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICJUaGUgT3B0aW9uICIsUDMsIiBJcyBJbnZhbGlkLiAgVGhlIFZhbGlkIE9wdGlvbnMgQXJlOiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFZBWEMgIDogIFRvIENvbXBpbGUgV2l0aCBWQVggQy4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIERFQ0MgIDogIFRvIENvbXBpbGUgV2l0aCBERUMgQy4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIEdOVUMgIDogIFRvIENvbXBpbGUgV2l0aCBHTlUgQy4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBUaW1lIFRvIEVYSVQuCiskIQorJCAgIEVYSVQKKyQhCiskISBFbmQgVGhlIFZhbGlkIEFyZ3VtZW50IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBCdWlsZCBhIE1BQ1JPIGNvbW1hbmQgZm9yIHRoZSBhcmNoaXRlY3R1cmUgYXQgaGFuZAorJCEKKyQgSUYgQVJDSCAuRVFTLiAiVkFYIiBUSEVOIE1BQ1JPID0gIk1BQ1JPLycnREVCVUdHRVInIgorJCBJRiBBUkNIIC5ORVMuICJWQVgiIFRIRU4gTUFDUk8gPSAiTUFDUk8vTUlHUkFUSU9OLycnREVCVUdHRVInLycnTUFDUk9fT1BUSU1JWkUnIgorJCEKKyQhICBTaG93IHVzZXIgdGhlIHJlc3VsdAorJCEKKyQgICBXUklURS9TWU1CT0wgU1lTJE9VVFBVVCAiTWFpbiBNQUNSTyBDb21waWxpbmcgQ29tbWFuZDogIixNQUNSTworJCEKKyQhIFRpbWUgdG8gY2hlY2sgdGhlIGNvbnRlbnRzLCBhbmQgdG8gbWFrZSBzdXJlIHdlIGdldCB0aGUgY29ycmVjdCBsaWJyYXJ5LgorJCEKKyQgSUYgUDQuRVFTLiJTT0NLRVRTSFIiIC5PUi4gUDQuRVFTLiJNVUxUSU5FVCIgLk9SLiBQNC5FUVMuIlVDWCIgLQorICAgICAuT1IuIFA0LkVRUy4iVENQSVAiIC5PUi4gUDQuRVFTLiJOT05FIgorJCBUSEVOCiskIQorJCEgIENoZWNrIHRvIHNlZSBpZiBTT0NLRVRTSFIgd2FzIGNob3NlbgorJCEKKyQgICBJRiBQNC5FUVMuIlNPQ0tFVFNIUiIKKyQgICBUSEVOCiskIQorJCEgICAgU2V0IHRoZSBsaWJyYXJ5IHRvIHVzZSBTT0NLRVRTSFIKKyQhCiskICAgICBUQ1BJUF9MSUIgPSAiU1lTJERJU0s6Wy0uVk1TXVNPQ0tFVFNIUl9TSFIuT1BUL09QVCIKKyQhCiskISAgICBEb25lIHdpdGggU09DS0VUU0hSCiskIQorJCAgIEVORElGCiskIQorJCEgIENoZWNrIHRvIHNlZSBpZiBNVUxUSU5FVCB3YXMgY2hvc2VuCiskIQorJCAgIElGIFA0LkVRUy4iTVVMVElORVQiCiskICAgVEhFTgorJCEKKyQhICAgIFNldCB0aGUgbGlicmFyeSB0byB1c2UgVUNYIGVtdWxhdGlvbi4KKyQhCiskICAgICBQNCA9ICJVQ1giCiskIQorJCEgICAgRG9uZSB3aXRoIE1VTFRJTkVUCiskIQorJCAgIEVORElGCiskIQorJCEgIENoZWNrIHRvIHNlZSBpZiBVQ1ggd2FzIGNob3NlbgorJCEKKyQgICBJRiBQNC5FUVMuIlVDWCIKKyQgICBUSEVOCiskIQorJCEgICAgU2V0IHRoZSBsaWJyYXJ5IHRvIHVzZSBVQ1guCiskIQorJCAgICAgVENQSVBfTElCID0gIlNZUyRESVNLOlstLlZNU11VQ1hfU0hSX0RFQ0MuT1BUL09QVCIKKyQgICAgIElGIEYkVFJOTE5NKCJVQ1gkSVBDX1NIUiIpIC5ORVMuICIiCiskICAgICBUSEVOCiskICAgICAgIFRDUElQX0xJQiA9ICJTWVMkRElTSzpbLS5WTVNdVUNYX1NIUl9ERUNDX0xPRy5PUFQvT1BUIgorJCAgICAgRUxTRQorJCAgICAgICBJRiBDT01QSUxFUiAuTkVTLiAiREVDQyIgLkFORC4gQVJDSCAuRVFTLiAiVkFYIiBUSEVOIC0KKwkgIFRDUElQX0xJQiA9ICJTWVMkRElTSzpbLS5WTVNdVUNYX1NIUl9WQVhDLk9QVC9PUFQiCiskICAgICBFTkRJRgorJCEKKyQhICAgIERvbmUgd2l0aCBVQ1gKKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgdG8gc2VlIGlmIFRDUElQIHdhcyBjaG9zZW4KKyQhCiskICAgSUYgUDQuRVFTLiJUQ1BJUCIKKyQgICBUSEVOCiskIQorJCEgICAgU2V0IHRoZSBsaWJyYXJ5IHRvIHVzZSBUQ1BJUCAocG9zdCBVQ1gpLgorJCEKKyQgICAgIFRDUElQX0xJQiA9ICJTWVMkRElTSzpbLS5WTVNdVENQSVBfU0hSX0RFQ0MuT1BUL09QVCIKKyQhCiskISAgICBEb25lIHdpdGggVENQSVAKKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgdG8gc2VlIGlmIE5PTkUgd2FzIGNob3NlbgorJCEKKyQgICBJRiBQNC5FUVMuIk5PTkUiCiskICAgVEhFTgorJCEKKyQhICAgIERvIG5vdCB1c2UgYSBUQ1BJUCBsaWJyYXJ5LgorJCEKKyQgICAgIFRDUElQX0xJQiA9ICIiCiskIQorJCEgICAgRG9uZSB3aXRoIFRDUElQCiskIQorJCAgIEVORElGCiskIQorJCEgIFByaW50IGluZm8KKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVENQL0lQIGxpYnJhcnkgc3BlYzogIiwgVENQSVBfTElCCiskIQorJCEgIEVsc2UgVGhlIFVzZXIgRW50ZXJlZCBBbiBJbnZhbGlkIEFyZ3VtZW50LgorJCEKKyQgRUxTRQorJCEKKyQhICBUZWxsIFRoZSBVc2VyIFdlIERvbid0IEtub3cgV2hhdCBUaGV5IFdhbnQuCiskIQorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICJUaGUgT3B0aW9uICIsUDQsIiBJcyBJbnZhbGlkLiAgVGhlIFZhbGlkIE9wdGlvbnMgQXJlOiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFNPQ0tFVFNIUiAgOiAgVG8gbGluayB3aXRoIFNPQ0tFVFNIUiBUQ1AvSVAgbGlicmFyeS4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFVDWCAgICAgICAgOiAgVG8gbGluayB3aXRoIFVDWCBUQ1AvSVAgbGlicmFyeS4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFRDUElQICAgICAgOiAgVG8gbGluayB3aXRoIFRDUElQIChwb3N0IFVDWCkgVENQL0lQIGxpYnJhcnkuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQhCiskISAgVGltZSBUbyBFWElULgorJCEKKyQgICBFWElUCiskIQorJCEgIERvbmUgd2l0aCBUQ1AvSVAgbGlicmFyaWVzCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIGlmIHRoZSB1c2VyIHdhbnRlZCB0byBjb21waWxlIGp1c3QgYSBzdWJzZXQgb2YgYWxsIHRoZSBlbmNyeXB0aW9uCiskISBtZXRob2RzLgorJCEKKyQgSUYgUDYgLk5FUy4gIiIKKyQgVEhFTgorJCAgIEVOQ1JZUFRfVFlQRVMgPSBQNgorJCBFTkRJRgorJCEKKyQhICBUaW1lIFRvIFJFVFVSTi4uLgorJCEKKyQgUkVUVVJOCiskIQorJCBJTklUSUFMSVNFOgorJCEKKyQhIFNhdmUgb2xkIHZhbHVlIG9mIHRoZSBsb2dpY2FsIG5hbWUgT1BFTlNTTAorJCEKKyQgX19TQVZFX09QRU5TU0wgPSBGJFRSTkxOTSgiT1BFTlNTTCIsIkxOTSRQUk9DRVNTX1RBQkxFIikKKyQhCiskISBTYXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorJCEKKyQgX19IRVJFID0gRiRQQVJTRShGJFBBUlNFKCJBLjsiLEYkRU5WSVJPTk1FTlQoIlBST0NFRFVSRSIpKS0iQS47IiwiW11BLjsiKSAtICJBLjsiCiskIF9fSEVSRSA9IEYkRURJVChfX0hFUkUsIlVQQ0FTRSIpCiskIF9fVE9QID0gX19IRVJFIC0gIkNSWVBUT10iCiskIF9fSU5DTFVERSA9IF9fVE9QICsgIklOQ0xVREUuT1BFTlNTTF0iCiskIQorJCEgU2V0IHVwIHRoZSBsb2dpY2FsIG5hbWUgT1BFTlNTTCB0byBwb2ludCBhdCB0aGUgaW5jbHVkZSBkaXJlY3RvcnkKKyQhCiskIERFRklORSBPUEVOU1NML05PTE9HICdfX0lOQ0xVREUnCiskIQorJCEgRG9uZQorJCEKKyQgUkVUVVJOCiskIQorJCBDTEVBTlVQOgorJCEKKyQhIFJlc3RvcmUgdGhlIGxvZ2ljYWwgbmFtZSBPUEVOU1NMIGlmIGl0IGhhZCBhIHZhbHVlCiskIQorJCBJRiBfX1NBVkVfT1BFTlNTTCAuRVFTLiAiIgorJCBUSEVOCiskICAgREVBU1NJR04gT1BFTlNTTAorJCBFTFNFCiskICAgREVGSU5FL05PTE9HIE9QRU5TU0wgJ19fU0FWRV9PUEVOU1NMJworJCBFTkRJRgorJCEKKyQhIERvbmUKKyQhCiskIFJFVFVSTgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2NyeXB0by5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2NyeXB0by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzYwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vY3J5cHRvLmgKQEAgLTAsMCArMSw1NzUgQEAKKy8qIGNyeXB0by9jcnlwdG8uaCAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogRUNESCBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworCisjaWZuZGVmIEhFQURFUl9DUllQVE9fSAorI2RlZmluZSBIRUFERVJfQ1JZUFRPX0gKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2FmZXN0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKworI2lmZGVmIENIQVJTRVRfRUJDRElDCisjaW5jbHVkZSA8b3BlbnNzbC9lYmNkaWMuaD4KKyNlbmRpZgorCisvKiBSZXNvbHZlIHByb2JsZW1zIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgd2l0aCBzeW1ib2wgbmFtZXMgdGhhdCBjbGFzaAorICAgb25lIHdheSBvciBhbm90aGVyICovCisjaW5jbHVkZSA8b3BlbnNzbC9zeW1oYWNrcy5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRvIFNTTGVheSAqLworLyogVGhpcyBpcyBtb3JlIHRvIGJlIHVzZWQgdG8gY2hlY2sgdGhlIGNvcnJlY3QgRExMIGlzIGJlaW5nIHVzZWQKKyAqIGluIHRoZSBNUyB3b3JsZC4gKi8KKyNkZWZpbmUgU1NMRUFZX1ZFUlNJT05fTlVNQkVSCU9QRU5TU0xfVkVSU0lPTl9OVU1CRVIKKyNkZWZpbmUgU1NMRUFZX1ZFUlNJT04JCTAKKy8qICNkZWZpbmUgU1NMRUFZX09QVElPTlMJMSBubyBsb25nZXIgc3VwcG9ydGVkICovCisjZGVmaW5lIFNTTEVBWV9DRkxBR1MJCTIKKyNkZWZpbmUgU1NMRUFZX0JVSUxUX09OCQkzCisjZGVmaW5lIFNTTEVBWV9QTEFURk9STQkJNAorI2RlZmluZSBTU0xFQVlfRElSCQk1CisKKy8qIEFscmVhZHkgZGVjbGFyZWQgaW4gb3NzbF90eXAuaCAqLworI2lmIDAKK3R5cGVkZWYgc3RydWN0IGNyeXB0b19leF9kYXRhX3N0IENSWVBUT19FWF9EQVRBOworLyogQ2FsbGVkIHdoZW4gYSBuZXcgb2JqZWN0IGlzIGNyZWF0ZWQgKi8KK3R5cGVkZWYgaW50IENSWVBUT19FWF9uZXcodm9pZCAqcGFyZW50LCB2b2lkICpwdHIsIENSWVBUT19FWF9EQVRBICphZCwKKwkJCQkJaW50IGlkeCwgbG9uZyBhcmdsLCB2b2lkICphcmdwKTsKKy8qIENhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBmcmVlKCllZCAqLwordHlwZWRlZiB2b2lkIENSWVBUT19FWF9mcmVlKHZvaWQgKnBhcmVudCwgdm9pZCAqcHRyLCBDUllQVE9fRVhfREFUQSAqYWQsCisJCQkJCWludCBpZHgsIGxvbmcgYXJnbCwgdm9pZCAqYXJncCk7CisvKiBDYWxsZWQgd2hlbiB3ZSBuZWVkIHRvIGR1cCBhbiBvYmplY3QgKi8KK3R5cGVkZWYgaW50IENSWVBUT19FWF9kdXAoQ1JZUFRPX0VYX0RBVEEgKnRvLCBDUllQVE9fRVhfREFUQSAqZnJvbSwgdm9pZCAqZnJvbV9kLCAKKwkJCQkJaW50IGlkeCwgbG9uZyBhcmdsLCB2b2lkICphcmdwKTsKKyNlbmRpZgorCisvKiBBIGdlbmVyaWMgc3RydWN0dXJlIHRvIHBhc3MgYXNzb3J0ZWQgZGF0YSBpbiBhIGV4cGFuZGFibGUgd2F5ICovCit0eXBlZGVmIHN0cnVjdCBvcGVuc3NsX2l0ZW1fc3QKKwl7CisJaW50IGNvZGU7CisJdm9pZCAqdmFsdWU7CQkvKiBOb3QgdXNlZCBmb3IgZmxhZyBhdHRyaWJ1dGVzICovCisJc2l6ZV90IHZhbHVlX3NpemU7CS8qIE1heCBzaXplIG9mIHZhbHVlIGZvciBvdXRwdXQsIGxlbmd0aCBmb3IgaW5wdXQgKi8KKwlzaXplX3QgKnZhbHVlX2xlbmd0aDsJLyogUmV0dXJuZWQgbGVuZ3RoIG9mIHZhbHVlIGZvciBvdXRwdXQgKi8KKwl9IE9QRU5TU0xfSVRFTTsKKworCisvKiBXaGVuIGNoYW5naW5nIHRoZSBDUllQVE9fTE9DS18qIGxpc3QsIGJlIHN1cmUgdG8gbWFpbnRpbiB0aGUgdGV4dCBsb2NrCisgKiBuYW1lcyBpbiBjcnlwdGxpYi5jCisgKi8KKworI2RlZmluZQlDUllQVE9fTE9DS19FUlIJCQkxCisjZGVmaW5lCUNSWVBUT19MT0NLX0VYX0RBVEEJCTIKKyNkZWZpbmUJQ1JZUFRPX0xPQ0tfWDUwOQkJMworI2RlZmluZQlDUllQVE9fTE9DS19YNTA5X0lORk8JCTQKKyNkZWZpbmUJQ1JZUFRPX0xPQ0tfWDUwOV9QS0VZCQk1CisjZGVmaW5lIENSWVBUT19MT0NLX1g1MDlfQ1JMCQk2CisjZGVmaW5lIENSWVBUT19MT0NLX1g1MDlfUkVRCQk3CisjZGVmaW5lIENSWVBUT19MT0NLX0RTQQkJCTgKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfUlNBCQkJOQorI2RlZmluZSBDUllQVE9fTE9DS19FVlBfUEtFWQkJMTAKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRQkJMTEKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfU1NMX0NUWAkJMTIKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfU1NMX0NFUlQJCTEzCisjZGVmaW5lIENSWVBUT19MT0NLX1NTTF9TRVNTSU9OCQkxNAorI2RlZmluZSBDUllQVE9fTE9DS19TU0xfU0VTU19DRVJUCTE1CisjZGVmaW5lIENSWVBUT19MT0NLX1NTTAkJCTE2CisjZGVmaW5lIENSWVBUT19MT0NLX1NTTF9NRVRIT0QJCTE3CisjZGVmaW5lIENSWVBUT19MT0NLX1JBTkQJCTE4CisjZGVmaW5lIENSWVBUT19MT0NLX1JBTkQyCQkxOQorI2RlZmluZSBDUllQVE9fTE9DS19NQUxMT0MJCTIwCisjZGVmaW5lIENSWVBUT19MT0NLX0JJTwkJCTIxCisjZGVmaW5lIENSWVBUT19MT0NLX0dFVEhPU1RCWU5BTUUJMjIKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfR0VUU0VSVkJZTkFNRQkyMworI2RlZmluZSBDUllQVE9fTE9DS19SRUFERElSCQkyNAorI2RlZmluZSBDUllQVE9fTE9DS19SU0FfQkxJTkRJTkcJMjUKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfREgJCQkyNgorI2RlZmluZSBDUllQVE9fTE9DS19NQUxMT0MyCQkyNworI2RlZmluZSBDUllQVE9fTE9DS19EU08JCQkyOAorI2RlZmluZSBDUllQVE9fTE9DS19EWU5MT0NLCQkyOQorI2RlZmluZSBDUllQVE9fTE9DS19FTkdJTkUJCTMwCisjZGVmaW5lIENSWVBUT19MT0NLX1VJCQkJMzEKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRUNEU0EgICAgICAgICAgICAgICAzMgorI2RlZmluZSBDUllQVE9fTE9DS19FQwkJCTMzCisjZGVmaW5lIENSWVBUT19MT0NLX0VDREgJCTM0CisjZGVmaW5lIENSWVBUT19MT0NLX0JOICAJCTM1CisjZGVmaW5lIENSWVBUT19MT0NLX0VDX1BSRV9DT01QCQkzNgorI2RlZmluZSBDUllQVE9fTE9DS19TVE9SRQkJMzcKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfQ09NUAkJMzgKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRklQUwkJMzkKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRklQUzIJCTQwCisjZGVmaW5lIENSWVBUT19OVU1fTE9DS1MJCTQxCisKKyNkZWZpbmUgQ1JZUFRPX0xPQ0sJCTEKKyNkZWZpbmUgQ1JZUFRPX1VOTE9DSwkJMgorI2RlZmluZSBDUllQVE9fUkVBRAkJNAorI2RlZmluZSBDUllQVE9fV1JJVEUJCTgKKworI2lmbmRlZiBPUEVOU1NMX05PX0xPQ0tJTkcKKyNpZm5kZWYgQ1JZUFRPX3dfbG9jaworI2RlZmluZSBDUllQVE9fd19sb2NrKHR5cGUpCVwKKwlDUllQVE9fbG9jayhDUllQVE9fTE9DS3xDUllQVE9fV1JJVEUsdHlwZSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgQ1JZUFRPX3dfdW5sb2NrKHR5cGUpCVwKKwlDUllQVE9fbG9jayhDUllQVE9fVU5MT0NLfENSWVBUT19XUklURSx0eXBlLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBDUllQVE9fcl9sb2NrKHR5cGUpCVwKKwlDUllQVE9fbG9jayhDUllQVE9fTE9DS3xDUllQVE9fUkVBRCx0eXBlLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBDUllQVE9fcl91bmxvY2sodHlwZSkJXAorCUNSWVBUT19sb2NrKENSWVBUT19VTkxPQ0t8Q1JZUFRPX1JFQUQsdHlwZSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgQ1JZUFRPX2FkZChhZGRyLGFtb3VudCx0eXBlKQlcCisJQ1JZUFRPX2FkZF9sb2NrKGFkZHIsYW1vdW50LHR5cGUsX19GSUxFX18sX19MSU5FX18pCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIENSWVBUT193X2xvY2soYSkKKyNkZWZpbmUgQ1JZUFRPX3dfdW5sb2NrKGEpCisjZGVmaW5lIENSWVBUT19yX2xvY2soYSkKKyNkZWZpbmUgQ1JZUFRPX3JfdW5sb2NrKGEpCisjZGVmaW5lIENSWVBUT19hZGQoYSxiLGMpCSgoKihhKSkrPShiKSkKKyNlbmRpZgorCisvKiBTb21lIGFwcGxpY2F0aW9ucyBhcyB3ZWxsIGFzIHNvbWUgcGFydHMgb2YgT3BlblNTTCBuZWVkIHRvIGFsbG9jYXRlCisgICBhbmQgZGVhbGxvY2F0ZSBsb2NrcyBpbiBhIGR5bmFtaWMgZmFzaGlvbi4gIFRoZSBmb2xsb3dpbmcgdHlwZWRlZgorICAgbWFrZXMgdGhpcyBwb3NzaWJsZSBpbiBhIHR5cGUtc2FmZSBtYW5uZXIuICAqLworLyogc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlIGhhcyB0byBiZSBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gKi8KK3R5cGVkZWYgc3RydWN0CisJeworCWludCByZWZlcmVuY2VzOworCXN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqZGF0YTsKKwl9IENSWVBUT19keW5sb2NrOworCisKKy8qIFRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IG1lbW9yeSBsZWFrcyBpbiB0aGUgU1NMZWF5IGxpYnJhcnkuCisgKiBJdCB1c2VkLCBpdCB0dXJucyBvbiBtYWxsb2MgY2hlY2tpbmcgKi8KKworI2RlZmluZSBDUllQVE9fTUVNX0NIRUNLX09GRgkweDAJLyogYW4gZW51bWUgKi8KKyNkZWZpbmUgQ1JZUFRPX01FTV9DSEVDS19PTgkweDEJLyogYSBiaXQgKi8KKyNkZWZpbmUgQ1JZUFRPX01FTV9DSEVDS19FTkFCTEUJMHgyCS8qIGEgYml0ICovCisjZGVmaW5lIENSWVBUT19NRU1fQ0hFQ0tfRElTQUJMRSAweDMJLyogYW4gZW51bWUgKi8KKworLyogVGhlIGZvbGxvd2luZyBhcmUgYml0IHZhbHVlcyB0byB0dXJuIG9uIG9yIG9mZiBvcHRpb25zIGNvbm5lY3RlZCB0byB0aGUKKyAqIG1hbGxvYyBjaGVja2luZyBmdW5jdGlvbmFsaXR5ICovCisKKy8qIEFkZHMgdGltZSB0byB0aGUgbWVtb3J5IGNoZWNraW5nIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFZfQ1JZUFRPX01ERUJVR19USU1FCTB4MSAvKiBhIGJpdCAqLworLyogQWRkcyB0aHJlYWQgbnVtYmVyIHRvIHRoZSBtZW1vcnkgY2hlY2tpbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVl9DUllQVE9fTURFQlVHX1RIUkVBRAkweDIgLyogYSBiaXQgKi8KKworI2RlZmluZSBWX0NSWVBUT19NREVCVUdfQUxMIChWX0NSWVBUT19NREVCVUdfVElNRSB8IFZfQ1JZUFRPX01ERUJVR19USFJFQUQpCisKKworLyogcHJlZGVjIG9mIHRoZSBCSU8gdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgYmlvX3N0IEJJT19kdW1teTsKKworc3RydWN0IGNyeXB0b19leF9kYXRhX3N0CisJeworCVNUQUNLX09GKHZvaWQpICpzazsKKwlpbnQgZHVtbXk7IC8qIGdjYyBpcyBzY3Jld2luZyB1cCB0aGlzIGRhdGEgc3RydWN0dXJlIDotKCAqLworCX07CitERUNMQVJFX1NUQUNLX09GKHZvaWQpCisKKy8qIFRoaXMgc3R1ZmYgaXMgYmFzaWNhbGx5IGNsYXNzIGNhbGxiYWNrIGZ1bmN0aW9ucworICogVGhlIGN1cnJlbnQgY2xhc3NlcyBhcmUgU1NMX0NUWCwgU1NMLCBTU0xfU0VTU0lPTiwgYW5kIGEgZmV3IG1vcmUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRvX2V4X2RhdGFfZnVuY19zdAorCXsKKwlsb25nIGFyZ2w7CS8qIEFyYml0YXJ5IGxvbmcgKi8KKwl2b2lkICphcmdwOwkvKiBBcmJpdGFyeSB2b2lkICogKi8KKwlDUllQVE9fRVhfbmV3ICpuZXdfZnVuYzsKKwlDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jOworCUNSWVBUT19FWF9kdXAgKmR1cF9mdW5jOworCX0gQ1JZUFRPX0VYX0RBVEFfRlVOQ1M7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpCisKKy8qIFBlciBjbGFzcywgd2UgaGF2ZSBhIFNUQUNLIG9mIENSWVBUT19FWF9EQVRBX0ZVTkNTIGZvciBlYWNoIENSWVBUT19FWF9EQVRBCisgKiBlbnRyeS4KKyAqLworCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9CSU8JCTAKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1NTTAkJMQorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfU1NMX0NUWAkJMgorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfU1NMX1NFU1NJT04JMworI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfWDUwOV9TVE9SRQk0CisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9YNTA5X1NUT1JFX0NUWAk1CisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9SU0EJCTYKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX0RTQQkJNworI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfREgJCTgKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX0VOR0lORQkJOQorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfWDUwOQkJMTAKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1VJCQkxMQorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfRUNEU0EJCTEyCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9FQ0RICQkxMworI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfQ09NUAkJMTQKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1NUT1JFCQkxNQorCisvKiBEeW5hbWljYWxseSBhc3NpZ25lZCBpbmRleGVzIHN0YXJ0IGZyb20gdGhpcyB2YWx1ZSAoZG9uJ3QgdXNlIGRpcmVjdGx5LCB1c2UKKyAqIHZpYSBDUllQVE9fZXhfZGF0YV9uZXdfY2xhc3MpLiAqLworI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfVVNFUgkJMTAwCisKKworLyogVGhpcyBpcyB0aGUgZGVmYXVsdCBjYWxsYmFja3MsIGJ1dCB3ZSBjYW4gaGF2ZSBvdGhlcnMgYXMgd2VsbDoKKyAqIHRoaXMgaXMgbmVlZGVkIGluIFdpbjMyIHdoZXJlIHRoZSBhcHBsaWNhdGlvbiBtYWxsb2MgYW5kIHRoZQorICogbGlicmFyeSBtYWxsb2MgbWF5IG5vdCBiZSB0aGUgc2FtZS4KKyAqLworI2RlZmluZSBDUllQVE9fbWFsbG9jX2luaXQoKQlDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMoXAorCW1hbGxvYywgcmVhbGxvYywgZnJlZSkKKworI2lmIGRlZmluZWQgQ1JZUFRPX01ERUJVR19BTEwgfHwgZGVmaW5lZCBDUllQVE9fTURFQlVHX1RJTUUgfHwgZGVmaW5lZCBDUllQVE9fTURFQlVHX1RIUkVBRAorIyBpZm5kZWYgQ1JZUFRPX01ERUJVRyAvKiBhdm9pZCBkdXBsaWNhdGUgI2RlZmluZSAqLworIyAgZGVmaW5lIENSWVBUT19NREVCVUcKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTZXQgc3RhbmRhcmQgZGVidWdnaW5nIGZ1bmN0aW9ucyAobm90IGRvbmUgYnkgZGVmYXVsdAorICogdW5sZXNzIENSWVBUT19NREVCVUcgaXMgZGVmaW5lZCkgKi8KKyNkZWZpbmUgQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCkJZG8ge1wKKwlDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoXAorCQlDUllQVE9fZGJnX21hbGxvYyxcCisJCUNSWVBUT19kYmdfcmVhbGxvYyxcCisJCUNSWVBUT19kYmdfZnJlZSxcCisJCUNSWVBUT19kYmdfc2V0X29wdGlvbnMsXAorCQlDUllQVE9fZGJnX2dldF9vcHRpb25zKTtcCisJfSB3aGlsZSgwKQorCitpbnQgQ1JZUFRPX21lbV9jdHJsKGludCBtb2RlKTsKK2ludCBDUllQVE9faXNfbWVtX2NoZWNrX29uKHZvaWQpOworCisvKiBmb3IgYXBwbGljYXRpb25zICovCisjZGVmaW5lIE1lbUNoZWNrX3N0YXJ0KCkgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pCisjZGVmaW5lIE1lbUNoZWNrX3N0b3AoKQlDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PRkYpCisKKy8qIGZvciBsaWJyYXJ5LWludGVybmFsIHVzZSAqLworI2RlZmluZSBNZW1DaGVja19vbigpCUNSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX0VOQUJMRSkKKyNkZWZpbmUgTWVtQ2hlY2tfb2ZmKCkJQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfRElTQUJMRSkKKyNkZWZpbmUgaXNfTWVtQ2hlY2tfb24oKSBDUllQVE9faXNfbWVtX2NoZWNrX29uKCkKKworI2RlZmluZSBPUEVOU1NMX21hbGxvYyhudW0pCUNSWVBUT19tYWxsb2MoKGludCludW0sX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIE9QRU5TU0xfc3RyZHVwKHN0cikJQ1JZUFRPX3N0cmR1cCgoc3RyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgT1BFTlNTTF9yZWFsbG9jKGFkZHIsbnVtKSBcCisJQ1JZUFRPX3JlYWxsb2MoKGNoYXIgKilhZGRyLChpbnQpbnVtLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBPUEVOU1NMX3JlYWxsb2NfY2xlYW4oYWRkcixvbGRfbnVtLG51bSkgXAorCUNSWVBUT19yZWFsbG9jX2NsZWFuKGFkZHIsb2xkX251bSxudW0sX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIE9QRU5TU0xfcmVtYWxsb2MoYWRkcixudW0pIFwKKwlDUllQVE9fcmVtYWxsb2MoKGNoYXIgKiopYWRkciwoaW50KW51bSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgT1BFTlNTTF9mcmVlRnVuYwlDUllQVE9fZnJlZQorI2RlZmluZSBPUEVOU1NMX2ZyZWUoYWRkcikJQ1JZUFRPX2ZyZWUoYWRkcikKKworI2RlZmluZSBPUEVOU1NMX21hbGxvY19sb2NrZWQobnVtKSBcCisJQ1JZUFRPX21hbGxvY19sb2NrZWQoKGludCludW0sX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIE9QRU5TU0xfZnJlZV9sb2NrZWQoYWRkcikgQ1JZUFRPX2ZyZWVfbG9ja2VkKGFkZHIpCisKKworY29uc3QgY2hhciAqU1NMZWF5X3ZlcnNpb24oaW50IHR5cGUpOwordW5zaWduZWQgbG9uZyBTU0xlYXkodm9pZCk7CisKK2ludCBPUEVOU1NMX2lzc2V0dWdpZCh2b2lkKTsKKworLyogQW4gb3BhcXVlIHR5cGUgcmVwcmVzZW50aW5nIGFuIGltcGxlbWVudGF0aW9uIG9mICJleF9kYXRhIiBzdXBwb3J0ICovCit0eXBlZGVmIHN0cnVjdCBzdF9DUllQVE9fRVhfREFUQV9JTVBMCUNSWVBUT19FWF9EQVRBX0lNUEw7CisvKiBSZXR1cm4gYW4gb3BhcXVlIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgImV4X2RhdGEiIGltcGxlbWVudGF0aW9uICovCitjb25zdCBDUllQVE9fRVhfREFUQV9JTVBMICpDUllQVE9fZ2V0X2V4X2RhdGFfaW1wbGVtZW50YXRpb24odm9pZCk7CisvKiBTZXRzIHRoZSAiZXhfZGF0YSIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCAoaWYgaXQncyBub3QgdG9vIGxhdGUpICovCitpbnQgQ1JZUFRPX3NldF9leF9kYXRhX2ltcGxlbWVudGF0aW9uKGNvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKmkpOworLyogR2V0IGEgbmV3ICJleF9kYXRhIiBjbGFzcywgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyAiY2xhc3NfaW5kZXgiICovCitpbnQgQ1JZUFRPX2V4X2RhdGFfbmV3X2NsYXNzKHZvaWQpOworLyogV2l0aGluIGEgZ2l2ZW4gY2xhc3MsIGdldC9yZWdpc3RlciBhIG5ldyBpbmRleCAqLworaW50IENSWVBUT19nZXRfZXhfbmV3X2luZGV4KGludCBjbGFzc19pbmRleCwgbG9uZyBhcmdsLCB2b2lkICphcmdwLAorCQlDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsCisJCUNSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworLyogSW5pdGlhbGlzZS9kdXBsaWNhdGUvZnJlZSBDUllQVE9fRVhfREFUQSB2YXJpYWJsZXMgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCisgKiBjbGFzcyAoaW52b2tlcyB3aGF0ZXZlciBwZXItY2xhc3MgY2FsbGJhY2tzIGFyZSBhcHBsaWNhYmxlKSAqLworaW50IENSWVBUT19uZXdfZXhfZGF0YShpbnQgY2xhc3NfaW5kZXgsIHZvaWQgKm9iaiwgQ1JZUFRPX0VYX0RBVEEgKmFkKTsKK2ludCBDUllQVE9fZHVwX2V4X2RhdGEoaW50IGNsYXNzX2luZGV4LCBDUllQVE9fRVhfREFUQSAqdG8sCisJCUNSWVBUT19FWF9EQVRBICpmcm9tKTsKK3ZvaWQgQ1JZUFRPX2ZyZWVfZXhfZGF0YShpbnQgY2xhc3NfaW5kZXgsIHZvaWQgKm9iaiwgQ1JZUFRPX0VYX0RBVEEgKmFkKTsKKy8qIEdldC9zZXQgZGF0YSBpbiBhIENSWVBUT19FWF9EQVRBIHZhcmlhYmxlIGNvcnJlc3BvbmRpbmcgdG8gYSBwYXJ0aWN1bGFyIGluZGV4CisgKiAocmVsYXRpdmUgdG8gdGhlIGNsYXNzIHR5cGUgaW52b2x2ZWQpICovCitpbnQgQ1JZUFRPX3NldF9leF9kYXRhKENSWVBUT19FWF9EQVRBICphZCwgaW50IGlkeCwgdm9pZCAqdmFsKTsKK3ZvaWQgKkNSWVBUT19nZXRfZXhfZGF0YShjb25zdCBDUllQVE9fRVhfREFUQSAqYWQsaW50IGlkeCk7CisvKiBUaGlzIGZ1bmN0aW9uIGNsZWFucyB1cCBhbGwgImV4X2RhdGEiIHN0YXRlLiBJdCBtdXN0bid0IGJlIGNhbGxlZCB1bmRlcgorICogcG90ZW50aWFsIHJhY2UtY29uZGl0aW9ucy4gKi8KK3ZvaWQgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEodm9pZCk7CisKK2ludCBDUllQVE9fZ2V0X25ld19sb2NraWQoY2hhciAqbmFtZSk7CisKK2ludCBDUllQVE9fbnVtX2xvY2tzKHZvaWQpOyAvKiByZXR1cm4gQ1JZUFRPX05VTV9MT0NLUyAoc2hhcmVkIGxpYnMhKSAqLwordm9pZCBDUllQVE9fbG9jayhpbnQgbW9kZSwgaW50IHR5cGUsY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7Cit2b2lkIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayh2b2lkICgqZnVuYykoaW50IG1vZGUsaW50IHR5cGUsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpKTsKK3ZvaWQgKCpDUllQVE9fZ2V0X2xvY2tpbmdfY2FsbGJhY2sodm9pZCkpKGludCBtb2RlLGludCB0eXBlLGNvbnN0IGNoYXIgKmZpbGUsCisJCWludCBsaW5lKTsKK3ZvaWQgQ1JZUFRPX3NldF9hZGRfbG9ja19jYWxsYmFjayhpbnQgKCpmdW5jKShpbnQgKm51bSxpbnQgbW91bnQsaW50IHR5cGUsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSk7CitpbnQgKCpDUllQVE9fZ2V0X2FkZF9sb2NrX2NhbGxiYWNrKHZvaWQpKShpbnQgKm51bSxpbnQgbW91bnQsaW50IHR5cGUsCisJCQkJCSAgY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7CisKKy8qIERvbid0IHVzZSB0aGlzIHN0cnVjdHVyZSBkaXJlY3RseS4gKi8KK3R5cGVkZWYgc3RydWN0IGNyeXB0b190aHJlYWRpZF9zdAorCXsKKwl2b2lkICpwdHI7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJfSBDUllQVE9fVEhSRUFESUQ7CisvKiBPbmx5IHVzZSBDUllQVE9fVEhSRUFESURfc2V0X1tudW1lcmljfHBvaW50ZXJdKCkgd2l0aGluIGNhbGxiYWNrcyAqLwordm9pZCBDUllQVE9fVEhSRUFESURfc2V0X251bWVyaWMoQ1JZUFRPX1RIUkVBRElEICppZCwgdW5zaWduZWQgbG9uZyB2YWwpOwordm9pZCBDUllQVE9fVEhSRUFESURfc2V0X3BvaW50ZXIoQ1JZUFRPX1RIUkVBRElEICppZCwgdm9pZCAqcHRyKTsKK2ludCBDUllQVE9fVEhSRUFESURfc2V0X2NhbGxiYWNrKHZvaWQgKCp0aHJlYWRpZF9mdW5jKShDUllQVE9fVEhSRUFESUQgKikpOwordm9pZCAoKkNSWVBUT19USFJFQURJRF9nZXRfY2FsbGJhY2sodm9pZCkpKENSWVBUT19USFJFQURJRCAqKTsKK3ZvaWQgQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoQ1JZUFRPX1RIUkVBRElEICppZCk7CitpbnQgQ1JZUFRPX1RIUkVBRElEX2NtcChjb25zdCBDUllQVE9fVEhSRUFESUQgKmEsIGNvbnN0IENSWVBUT19USFJFQURJRCAqYik7Cit2b2lkIENSWVBUT19USFJFQURJRF9jcHkoQ1JZUFRPX1RIUkVBRElEICpkZXN0LCBjb25zdCBDUllQVE9fVEhSRUFESUQgKnNyYyk7Cit1bnNpZ25lZCBsb25nIENSWVBUT19USFJFQURJRF9oYXNoKGNvbnN0IENSWVBUT19USFJFQURJRCAqaWQpOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK3ZvaWQgQ1JZUFRPX3NldF9pZF9jYWxsYmFjayh1bnNpZ25lZCBsb25nICgqZnVuYykodm9pZCkpOwordW5zaWduZWQgbG9uZyAoKkNSWVBUT19nZXRfaWRfY2FsbGJhY2sodm9pZCkpKHZvaWQpOwordW5zaWduZWQgbG9uZyBDUllQVE9fdGhyZWFkX2lkKHZvaWQpOworI2VuZGlmCisKK2NvbnN0IGNoYXIgKkNSWVBUT19nZXRfbG9ja19uYW1lKGludCB0eXBlKTsKK2ludCBDUllQVE9fYWRkX2xvY2soaW50ICpwb2ludGVyLGludCBhbW91bnQsaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGUsCisJCSAgICBpbnQgbGluZSk7CisKK2ludCBDUllQVE9fZ2V0X25ld19keW5sb2NraWQodm9pZCk7Cit2b2lkIENSWVBUT19kZXN0cm95X2R5bmxvY2tpZChpbnQgaSk7CitzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKkNSWVBUT19nZXRfZHlubG9ja192YWx1ZShpbnQgaSk7Cit2b2lkIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICooKmR5bl9jcmVhdGVfZnVuY3Rpb24pKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSk7Cit2b2lkIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKHZvaWQgKCpkeW5fbG9ja19mdW5jdGlvbikoaW50IG1vZGUsIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpKTsKK3ZvaWQgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodm9pZCAoKmR5bl9kZXN0cm95X2Z1bmN0aW9uKShzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKSk7CitzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKigqQ1JZUFRPX2dldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayh2b2lkKSkoY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7Cit2b2lkICgqQ1JZUFRPX2dldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sodm9pZCkpKGludCBtb2RlLCBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpOwordm9pZCAoKkNSWVBUT19nZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKHZvaWQpKShzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKmwsIGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpOworCisvKiBDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMgaW5jbHVkZXMgQ1JZUFRPX3NldF9sb2NrZWRfbWVtX2Z1bmN0aW9ucyAtLQorICogY2FsbCB0aGUgbGF0dGVyIGxhc3QgaWYgeW91IG5lZWQgZGlmZmVyZW50IGZ1bmN0aW9ucyAqLworaW50IENSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyh2b2lkICooKm0pKHNpemVfdCksdm9pZCAqKCpyKSh2b2lkICosc2l6ZV90KSwgdm9pZCAoKmYpKHZvaWQgKikpOworaW50IENSWVBUT19zZXRfbG9ja2VkX21lbV9mdW5jdGlvbnModm9pZCAqKCptKShzaXplX3QpLCB2b2lkICgqZnJlZV9mdW5jKSh2b2lkICopKTsKK2ludCBDUllQVE9fc2V0X21lbV9leF9mdW5jdGlvbnModm9pZCAqKCptKShzaXplX3QsY29uc3QgY2hhciAqLGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKigqcikodm9pZCAqLHNpemVfdCxjb25zdCBjaGFyICosaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmYpKHZvaWQgKikpOworaW50IENSWVBUT19zZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnModm9pZCAqKCptKShzaXplX3QsY29uc3QgY2hhciAqLGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnJlZV9mdW5jKSh2b2lkICopKTsKK2ludCBDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnModm9pZCAoKm0pKHZvaWQgKixpbnQsY29uc3QgY2hhciAqLGludCxpbnQpLAorCQkJCSAgIHZvaWQgKCpyKSh2b2lkICosdm9pZCAqLGludCxjb25zdCBjaGFyICosaW50LGludCksCisJCQkJICAgdm9pZCAoKmYpKHZvaWQgKixpbnQpLAorCQkJCSAgIHZvaWQgKCpzbykobG9uZyksCisJCQkJICAgbG9uZyAoKmdvKSh2b2lkKSk7Cit2b2lkIENSWVBUT19nZXRfbWVtX2Z1bmN0aW9ucyh2b2lkICooKiptKShzaXplX3QpLHZvaWQgKigqKnIpKHZvaWQgKiwgc2l6ZV90KSwgdm9pZCAoKipmKSh2b2lkICopKTsKK3ZvaWQgQ1JZUFRPX2dldF9sb2NrZWRfbWVtX2Z1bmN0aW9ucyh2b2lkICooKiptKShzaXplX3QpLCB2b2lkICgqKmYpKHZvaWQgKikpOwordm9pZCBDUllQVE9fZ2V0X21lbV9leF9mdW5jdGlvbnModm9pZCAqKCoqbSkoc2l6ZV90LGNvbnN0IGNoYXIgKixpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCoqcikodm9pZCAqLCBzaXplX3QsY29uc3QgY2hhciAqLGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqKmYpKHZvaWQgKikpOwordm9pZCBDUllQVE9fZ2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zKHZvaWQgKigqKm0pKHNpemVfdCxjb25zdCBjaGFyICosaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqKmYpKHZvaWQgKikpOwordm9pZCBDUllQVE9fZ2V0X21lbV9kZWJ1Z19mdW5jdGlvbnModm9pZCAoKiptKSh2b2lkICosaW50LGNvbnN0IGNoYXIgKixpbnQsaW50KSwKKwkJCQkgICAgdm9pZCAoKipyKSh2b2lkICosdm9pZCAqLGludCxjb25zdCBjaGFyICosaW50LGludCksCisJCQkJICAgIHZvaWQgKCoqZikodm9pZCAqLGludCksCisJCQkJICAgIHZvaWQgKCoqc28pKGxvbmcpLAorCQkJCSAgICBsb25nICgqKmdvKSh2b2lkKSk7CisKK3ZvaWQgKkNSWVBUT19tYWxsb2NfbG9ja2VkKGludCBudW0sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK3ZvaWQgQ1JZUFRPX2ZyZWVfbG9ja2VkKHZvaWQgKik7Cit2b2lkICpDUllQVE9fbWFsbG9jKGludCBudW0sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK2NoYXIgKkNSWVBUT19zdHJkdXAoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7Cit2b2lkIENSWVBUT19mcmVlKHZvaWQgKik7Cit2b2lkICpDUllQVE9fcmVhbGxvYyh2b2lkICphZGRyLGludCBudW0sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK3ZvaWQgKkNSWVBUT19yZWFsbG9jX2NsZWFuKHZvaWQgKmFkZHIsaW50IG9sZF9udW0saW50IG51bSxjb25zdCBjaGFyICpmaWxlLAorCQkJICAgaW50IGxpbmUpOwordm9pZCAqQ1JZUFRPX3JlbWFsbG9jKHZvaWQgKmFkZHIsaW50IG51bSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworCit2b2lkIE9QRU5TU0xfY2xlYW5zZSh2b2lkICpwdHIsIHNpemVfdCBsZW4pOworCit2b2lkIENSWVBUT19zZXRfbWVtX2RlYnVnX29wdGlvbnMobG9uZyBiaXRzKTsKK2xvbmcgQ1JZUFRPX2dldF9tZW1fZGVidWdfb3B0aW9ucyh2b2lkKTsKKworI2RlZmluZSBDUllQVE9fcHVzaF9pbmZvKGluZm8pIFwKKyAgICAgICAgQ1JZUFRPX3B1c2hfaW5mb18oaW5mbywgX19GSUxFX18sIF9fTElORV9fKTsKK2ludCBDUllQVE9fcHVzaF9pbmZvXyhjb25zdCBjaGFyICppbmZvLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CitpbnQgQ1JZUFRPX3BvcF9pbmZvKHZvaWQpOworaW50IENSWVBUT19yZW1vdmVfYWxsX2luZm8odm9pZCk7CisKKworLyogRGVmYXVsdCBkZWJ1Z2dpbmcgZnVuY3Rpb25zIChlbmFibGVkIGJ5IENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpIG1hY3JvOworICogdXNlZCBhcyBkZWZhdWx0IGluIENSWVBUT19NREVCVUcgY29tcGlsYXRpb25zKTogKi8KKy8qIFRoZSBsYXN0IGFyZ3VtZW50IGhhcyB0aGUgZm9sbG93aW5nIHNpZ25pZmljYW5jZToKKyAqCisgKiAwOgljYWxsZWQgYmVmb3JlIHRoZSBhY3R1YWwgbWVtb3J5IGFsbG9jYXRpb24gaGFzIHRha2VuIHBsYWNlCisgKiAxOgljYWxsZWQgYWZ0ZXIgdGhlIGFjdHVhbCBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgdGFrZW4gcGxhY2UKKyAqLwordm9pZCBDUllQVE9fZGJnX21hbGxvYyh2b2lkICphZGRyLGludCBudW0sY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSxpbnQgYmVmb3JlX3ApOwordm9pZCBDUllQVE9fZGJnX3JlYWxsb2Modm9pZCAqYWRkcjEsdm9pZCAqYWRkcjIsaW50IG51bSxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lLGludCBiZWZvcmVfcCk7Cit2b2lkIENSWVBUT19kYmdfZnJlZSh2b2lkICphZGRyLGludCBiZWZvcmVfcCk7CisvKiBUZWxsIHRoZSBkZWJ1Z2dpbmcgY29kZSBhYm91dCBvcHRpb25zLiAgQnkgZGVmYXVsdCwgdGhlIGZvbGxvd2luZyB2YWx1ZXMKKyAqIGFwcGx5OgorICoKKyAqIDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYXIgYWxsIG9wdGlvbnMuCisgKiBWX0NSWVBUT19NREVCVUdfVElNRSAoMSk6ICAgIFNldCB0aGUgIlNob3cgVGltZSIgb3B0aW9uLgorICogVl9DUllQVE9fTURFQlVHX1RIUkVBRCAoMik6ICBTZXQgdGhlICJTaG93IFRocmVhZCBOdW1iZXIiIG9wdGlvbi4KKyAqIFZfQ1JZUFRPX01ERUJVR19BTEwgKDMpOiAgICAgMSArIDIKKyAqLwordm9pZCBDUllQVE9fZGJnX3NldF9vcHRpb25zKGxvbmcgYml0cyk7Citsb25nIENSWVBUT19kYmdfZ2V0X29wdGlvbnModm9pZCk7CisKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQordm9pZCBDUllQVE9fbWVtX2xlYWtzX2ZwKEZJTEUgKik7CisjZW5kaWYKK3ZvaWQgQ1JZUFRPX21lbV9sZWFrcyhzdHJ1Y3QgYmlvX3N0ICpiaW8pOworLyogdW5zaWduZWQgbG9uZyBvcmRlciwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBudW1fYnl0ZXMsIGNoYXIgKmFkZHIgKi8KK3R5cGVkZWYgdm9pZCAqQ1JZUFRPX01FTV9MRUFLX0NCKHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIHZvaWQgKik7Cit2b2lkIENSWVBUT19tZW1fbGVha3NfY2IoQ1JZUFRPX01FTV9MRUFLX0NCICpjYik7CisKKy8qIGRpZSBpZiB3ZSBoYXZlIHRvICovCit2b2lkIE9wZW5TU0xEaWUoY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSxjb25zdCBjaGFyICphc3NlcnRpb24pOworI2RlZmluZSBPUEVOU1NMX2Fzc2VydChlKSAgICAgICAodm9pZCkoKGUpID8gMCA6IChPcGVuU1NMRGllKF9fRklMRV9fLCBfX0xJTkVfXywgI2UpLDEpKQorCit1bnNpZ25lZCBsb25nICpPUEVOU1NMX2lhMzJjYXBfbG9jKHZvaWQpOworI2RlZmluZSBPUEVOU1NMX2lhMzJjYXAgKCooT1BFTlNTTF9pYTMyY2FwX2xvYygpKSkKK2ludCBPUEVOU1NMX2lzc2VydmljZSh2b2lkKTsKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9DUllQVE9fc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBDUllQVE8gZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQ1JZUFRPX0ZfQ1JZUFRPX0dFVF9FWF9ORVdfSU5ERVgJCSAxMDAKKyNkZWZpbmUgQ1JZUFRPX0ZfQ1JZUFRPX0dFVF9ORVdfRFlOTE9DS0lECQkgMTAzCisjZGVmaW5lIENSWVBUT19GX0NSWVBUT19HRVRfTkVXX0xPQ0tJRAkJCSAxMDEKKyNkZWZpbmUgQ1JZUFRPX0ZfQ1JZUFRPX1NFVF9FWF9EQVRBCQkJIDEwMgorI2RlZmluZSBDUllQVE9fRl9ERUZfQUREX0lOREVYCQkJCSAxMDQKKyNkZWZpbmUgQ1JZUFRPX0ZfREVGX0dFVF9DTEFTUwkJCQkgMTA1CisjZGVmaW5lIENSWVBUT19GX0lOVF9EVVBfRVhfREFUQQkJCSAxMDYKKyNkZWZpbmUgQ1JZUFRPX0ZfSU5UX0ZSRUVfRVhfREFUQQkJCSAxMDcKKyNkZWZpbmUgQ1JZUFRPX0ZfSU5UX05FV19FWF9EQVRBCQkJIDEwOAorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIENSWVBUT19SX05PX0RZTkxPQ0tfQ1JFQVRFX0NBTExCQUNLCQkgMTAwCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vY3ZlcnNpb24uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9jdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOWYyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vY3ZlcnNpb24uYwpAQCAtMCwwICsxLDExNyBAQAorLyogY3J5cHRvL2N2ZXJzaW9uLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgTk9fV0lORE9XU19CUkFJTkRFQVRICisjaW5jbHVkZSAiYnVpbGRpbmYuaCIKKyNlbmRpZgorCitjb25zdCBjaGFyICpTU0xlYXlfdmVyc2lvbihpbnQgdCkKKwl7CisJaWYgKHQgPT0gU1NMRUFZX1ZFUlNJT04pCisJCXJldHVybiBPUEVOU1NMX1ZFUlNJT05fVEVYVDsKKwlpZiAodCA9PSBTU0xFQVlfQlVJTFRfT04pCisJCXsKKyNpZmRlZiBEQVRFCisJCXN0YXRpYyBjaGFyIGJ1ZltzaXplb2YoREFURSkrMTFdOworCisJCUJJT19zbnByaW50ZihidWYsc2l6ZW9mIGJ1ZiwiYnVpbHQgb246ICVzIixEQVRFKTsKKwkJcmV0dXJuKGJ1Zik7CisjZWxzZQorCQlyZXR1cm4oImJ1aWx0IG9uOiBkYXRlIG5vdCBhdmFpbGFibGUiKTsKKyNlbmRpZgorCQl9CisJaWYgKHQgPT0gU1NMRUFZX0NGTEFHUykKKwkJeworI2lmZGVmIENGTEFHUworCQlzdGF0aWMgY2hhciBidWZbc2l6ZW9mKENGTEFHUykrMTFdOworCisJCUJJT19zbnByaW50ZihidWYsc2l6ZW9mIGJ1ZiwiY29tcGlsZXI6ICVzIixDRkxBR1MpOworCQlyZXR1cm4oYnVmKTsKKyNlbHNlCisJCXJldHVybigiY29tcGlsZXI6IGluZm9ybWF0aW9uIG5vdCBhdmFpbGFibGUiKTsKKyNlbmRpZgorCQl9CisJaWYgKHQgPT0gU1NMRUFZX1BMQVRGT1JNKQorCQl7CisjaWZkZWYgUExBVEZPUk0KKwkJc3RhdGljIGNoYXIgYnVmW3NpemVvZihQTEFURk9STSkrMTFdOworCisJCUJJT19zbnByaW50ZihidWYsc2l6ZW9mIGJ1ZiwicGxhdGZvcm06ICVzIiwgUExBVEZPUk0pOworCQlyZXR1cm4oYnVmKTsKKyNlbHNlCisJCXJldHVybigicGxhdGZvcm06IGluZm9ybWF0aW9uIG5vdCBhdmFpbGFibGUiKTsKKyNlbmRpZgorCQl9CisJaWYgKHQgPT0gU1NMRUFZX0RJUikKKwkJeworI2lmZGVmIE9QRU5TU0xESVIKKwkJcmV0dXJuICJPUEVOU1NMRElSOiBcIiIgT1BFTlNTTERJUiAiXCIiOworI2Vsc2UKKwkJcmV0dXJuICJPUEVOU1NMRElSOiBOL0EiOworI2VuZGlmCisJCX0KKwlyZXR1cm4oIm5vdCBhdmFpbGFibGUiKTsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgU1NMZWF5KHZvaWQpCisJeworCXJldHVybihTU0xFQVlfVkVSU0lPTl9OVU1CRVIpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9DT1BZUklHSFQgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL0NPUFlSSUdIVApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDY5ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9DT1BZUklHSFQKQEAgLTAsMCArMSw1MCBAQAorQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitUaGlzIHBhY2thZ2UgaXMgYW4gREVTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBNSVQncyBsaWJkZXMuCisKK1RoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcwordGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KKworQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KK3RoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KK0lmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KK2FzIHRoZSBhdXRob3Igb2YgdGhhdCB0aGUgU1NMIGxpYnJhcnkuICBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwKK21lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZAord2l0aCB0aGUgcGFja2FnZS4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKK2FyZSBtZXQ6CisxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiszLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECitBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKK0lNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCitBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKK0RBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCitPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCitMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCitPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCitTVUNIIERBTUFHRS4KKworVGhlIGxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKK2Rlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cnVidXRpb24gbGljZW5zZQorW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLl0KKworVGhlIHJlYXNvbiBiZWhpbmQgdGhpcyBiZWluZyBzdGF0ZWQgaW4gdGhpcyBkaXJlY3QgbWFubmVyIGlzIHBhc3QKK2V4cGVyaWVuY2UgaW4gY29kZSBzaW1wbHkgYmVpbmcgY29waWVkIGFuZCB0aGUgYXR0cmlidXRpb24gcmVtb3ZlZAorZnJvbSBpdCBhbmQgdGhlbiBiZWluZyBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIG90aGVyIHBhY2thZ2VzLiBUaGlzCitpbXBsZW1lbnRhdGlvbiB3YXMgYSBub24tdHJpdmlhbCBhbmQgdW5wYWlkIGVmZm9ydC4KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvREVTLnBtIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9ERVMucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExNzViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvREVTLnBtCkBAIC0wLDAgKzEsMTkgQEAKK3BhY2thZ2UgREVTOworCityZXF1aXJlIEV4cG9ydGVyOworcmVxdWlyZSBEeW5hTG9hZGVyOworQElTQSA9IHF3KEV4cG9ydGVyIER5bmFMb2FkZXIpOworIyBJdGVtcyB0byBleHBvcnQgaW50byBjYWxsZXJzIG5hbWVzcGFjZSBieSBkZWZhdWx0CisjIChtb3ZlIGluZnJlcXVlbnRseSB1c2VkIG5hbWVzIHRvIEBFWFBPUlRfT0sgYmVsb3cpCitARVhQT1JUID0gcXcoCispOworIyBPdGhlciBpdGVtcyB3ZSBhcmUgcHJlcGFyZWQgdG8gZXhwb3J0IGlmIHJlcXVlc3RlZAorQEVYUE9SVF9PSyA9IHF3KAorY3J5cHQKKyk7CisKKyMgUHJlbG9hZGVkIG1ldGhvZHMgZ28gaGVyZS4gIEF1dG9sb2FkIG1ldGhvZHMgZ28gYWZ0ZXIgX19FTkRfXywgYW5kIGFyZQorIyBwcm9jZXNzZWQgYnkgdGhlIGF1dG9zcGxpdCBwcm9ncmFtLgorYm9vdHN0cmFwIERFUzsKKzE7CitfX0VORF9fCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL0RFUy54cyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvREVTLnhzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDUwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL0RFUy54cwpAQCAtMCwwICsxLDI2OCBAQAorI2luY2x1ZGUgIkVYVEVSTi5oIgorI2luY2x1ZGUgInBlcmwuaCIKKyNpbmNsdWRlICJYU1VCLmgiCisjaW5jbHVkZSAiZGVzLmgiCisKKyNkZWZpbmUgZGVzY2hhcgljaGFyCitzdGF0aWMgU1RSTEVOIGxlbjsKKworc3RhdGljIGludAorbm90X2hlcmUocykKK2NoYXIgKnM7Cit7CisgICAgY3JvYWsoIiVzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIGFyY2hpdGVjdHVyZSIsIHMpOworICAgIHJldHVybiAtMTsKK30KKworTU9EVUxFID0gREVTCVBBQ0tBR0UgPSBERVMJUFJFRklYID0gZGVzXworCitjaGFyICoKK2Rlc19jcnlwdChidWYsc2FsdCkKKwljaGFyICoJYnVmCisJY2hhciAqCXNhbHQKKwordm9pZAorZGVzX3NldF9vZGRfcGFyaXR5KGtleSkKKwlkZXNfY2Jsb2NrICoJa2V5CitQUENPREU6CisJeworCVNWICpzOworCisJcz1zdl9uZXdtb3J0YWwoKTsKKwlzdl9zZXRwdm4ocywoY2hhciAqKWtleSw4KTsKKwlkZXNfc2V0X29kZF9wYXJpdHkoKGRlc19jYmxvY2sgKilTdlBWKHMsbmEpKTsKKwlQVVNIcyhzKTsKKwl9CisKK2ludAorZGVzX2lzX3dlYWtfa2V5KGtleSkKKwlkZXNfY2Jsb2NrICoJa2V5CisKK2Rlc19rZXlfc2NoZWR1bGUKK2Rlc19zZXRfa2V5KGtleSkKKwlkZXNfY2Jsb2NrICoJa2V5CitDT0RFOgorCWRlc19zZXRfa2V5KGtleSxSRVRWQUwpOworT1VUUFVUOgorUkVUVkFMCisKK2Rlc19jYmxvY2sKK2Rlc19lY2JfZW5jcnlwdChpbnB1dCxrcyxlbmNyeXB0KQorCWRlc19jYmxvY2sgKglpbnB1dAorCWRlc19rZXlfc2NoZWR1bGUgKglrcworCWludAllbmNyeXB0CitDT0RFOgorCWRlc19lY2JfZW5jcnlwdChpbnB1dCwmUkVUVkFMLCprcyxlbmNyeXB0KTsKK09VVFBVVDoKK1JFVFZBTAorCit2b2lkCitkZXNfY2JjX2VuY3J5cHQoaW5wdXQsa3MsaXZlYyxlbmNyeXB0KQorCWNoYXIgKglpbnB1dAorCWRlc19rZXlfc2NoZWR1bGUgKglrcworCWRlc19jYmxvY2sgKglpdmVjCisJaW50CWVuY3J5cHQKK1BQQ09ERToKKwl7CisJU1YgKnM7CisJU1RSTEVOIGxlbixsOworCWNoYXIgKmM7CisKKwlsPVN2Q1VSKFNUKDApKTsKKwlsZW49KCgoKHVuc2lnbmVkIGxvbmcpbCkrNykvOCkqODsKKwlzPXN2X25ld21vcnRhbCgpOworCXN2X3NldHB2bihzLCIiLDApOworCVN2R1JPVyhzLGxlbik7CisJU3ZDVVJfc2V0KHMsbGVuKTsKKwljPShjaGFyICopU3ZQVihzLG5hKTsKKwlkZXNfY2JjX2VuY3J5cHQoKGRlc19jYmxvY2sgKilpbnB1dCwoZGVzX2NibG9jayAqKWMsCisJCWwsKmtzLGl2ZWMsZW5jcnlwdCk7CisJc3Zfc2V0cHZuKFNUKDIpLChjaGFyICopY1tsZW4tOF0sOCk7CisJUFVTSHMocyk7CisJfQorCit2b2lkCitkZXNfY2JjM19lbmNyeXB0KGlucHV0LGtzMSxrczIsaXZlYzEsaXZlYzIsZW5jcnlwdCkKKwljaGFyICoJaW5wdXQKKwlkZXNfa2V5X3NjaGVkdWxlICoJa3MxCisJZGVzX2tleV9zY2hlZHVsZSAqCWtzMgorCWRlc19jYmxvY2sgKglpdmVjMQorCWRlc19jYmxvY2sgKglpdmVjMgorCWludAllbmNyeXB0CitQUENPREU6CisJeworCVNWICpzOworCVNUUkxFTiBsZW4sbDsKKworCWw9U3ZDVVIoU1QoMCkpOworCWxlbj0oKCgodW5zaWduZWQgbG9uZylsKSs3KS84KSo4OworCXM9c3ZfbmV3bW9ydGFsKCk7CisJc3Zfc2V0cHZuKHMsIiIsMCk7CisJU3ZHUk9XKHMsbGVuKTsKKwlTdkNVUl9zZXQocyxsZW4pOworCWRlc18zY2JjX2VuY3J5cHQoKGRlc19jYmxvY2sgKilpbnB1dCwoZGVzX2NibG9jayAqKVN2UFYocyxuYSksCisJCWwsKmtzMSwqa3MyLGl2ZWMxLGl2ZWMyLGVuY3J5cHQpOworCXN2X3NldHB2bihTVCgzKSwoY2hhciAqKWl2ZWMxLDgpOworCXN2X3NldHB2bihTVCg0KSwoY2hhciAqKWl2ZWMyLDgpOworCVBVU0hzKHMpOworCX0KKwordm9pZAorZGVzX2NiY19ja3N1bShpbnB1dCxrcyxpdmVjKQorCWNoYXIgKglpbnB1dAorCWRlc19rZXlfc2NoZWR1bGUgKglrcworCWRlc19jYmxvY2sgKglpdmVjCitQUENPREU6CisJeworCVNWICpzMSwqczI7CisJU1RSTEVOIGxlbixsOworCWRlc19jYmxvY2sgYzsKKwl1bnNpZ25lZCBsb25nIGkxLGkyOworCisJczE9c3ZfbmV3bW9ydGFsKCk7CisJczI9c3ZfbmV3bW9ydGFsKCk7CisJbD1TdkNVUihTVCgwKSk7CisJZGVzX2NiY19ja3N1bSgoZGVzX2NibG9jayAqKWlucHV0LChkZXNfY2Jsb2NrICopYywKKwkJbCwqa3MsaXZlYyk7CisJaTE9Y1s0XXwoY1s1XTw8OCl8KGNbNl08PDE2KXwoY1s3XTw8MjQpOworCWkyPWNbMF18KGNbMV08PDgpfChjWzJdPDwxNil8KGNbM108PDI0KTsKKwlzdl9zZXRpdihzMSxpMSk7CisJc3Zfc2V0aXYoczIsaTIpOworCXN2X3NldHB2bihTVCgyKSwoY2hhciAqKWMsOCk7CisJUFVTSHMoczEpOworCVBVU0hzKHMyKTsKKwl9CisKK3ZvaWQKK2Rlc19jZmJfZW5jcnlwdChpbnB1dCxudW1iaXRzLGtzLGl2ZWMsZW5jcnlwdCkKKwljaGFyICoJaW5wdXQKKwlpbnQJbnVtYml0cworCWRlc19rZXlfc2NoZWR1bGUgKglrcworCWRlc19jYmxvY2sgKglpdmVjCisJaW50CWVuY3J5cHQKK1BQQ09ERToKKwl7CisJU1YgKnM7CisJU1RSTEVOIGxlbjsKKwljaGFyICpjOworCisJbGVuPVN2Q1VSKFNUKDApKTsKKwlzPXN2X25ld21vcnRhbCgpOworCXN2X3NldHB2bihzLCIiLDApOworCVN2R1JPVyhzLGxlbik7CisJU3ZDVVJfc2V0KHMsbGVuKTsKKwljPShjaGFyICopU3ZQVihzLG5hKTsKKwlkZXNfY2ZiX2VuY3J5cHQoKHVuc2lnbmVkIGNoYXIgKilpbnB1dCwodW5zaWduZWQgY2hhciAqKWMsCisJCShpbnQpbnVtYml0cywobG9uZylsZW4sKmtzLGl2ZWMsZW5jcnlwdCk7CisJc3Zfc2V0cHZuKFNUKDMpLChjaGFyICopaXZlYyw4KTsKKwlQVVNIcyhzKTsKKwl9CisKK2Rlc19jYmxvY2sgKgorZGVzX2VjYjNfZW5jcnlwdChpbnB1dCxrczEsa3MyLGVuY3J5cHQpCisJZGVzX2NibG9jayAqCWlucHV0CisJZGVzX2tleV9zY2hlZHVsZSAqCWtzMQorCWRlc19rZXlfc2NoZWR1bGUgKglrczIKKwlpbnQJZW5jcnlwdAorQ09ERToKKwl7CisJZGVzX2NibG9jayBjOworCisJZGVzX2VjYjNfZW5jcnlwdCgoZGVzX2NibG9jayAqKWlucHV0LChkZXNfY2Jsb2NrICopJmMsCisJCSprczEsKmtzMixlbmNyeXB0KTsKKwlSRVRWQUw9ICZjOworCX0KK09VVFBVVDoKK1JFVFZBTAorCit2b2lkCitkZXNfb2ZiX2VuY3J5cHQoaW5wdXQsbnVtYml0cyxrcyxpdmVjKQorCXVuc2lnbmVkIGNoYXIgKglpbnB1dAorCWludAludW1iaXRzCisJZGVzX2tleV9zY2hlZHVsZSAqCWtzCisJZGVzX2NibG9jayAqCWl2ZWMKK1BQQ09ERToKKwl7CisJU1YgKnM7CisJU1RSTEVOIGxlbixsOworCXVuc2lnbmVkIGNoYXIgKmM7CisKKwlsZW49U3ZDVVIoU1QoMCkpOworCXM9c3ZfbmV3bW9ydGFsKCk7CisJc3Zfc2V0cHZuKHMsIiIsMCk7CisJU3ZHUk9XKHMsbGVuKTsKKwlTdkNVUl9zZXQocyxsZW4pOworCWM9KHVuc2lnbmVkIGNoYXIgKilTdlBWKHMsbmEpOworCWRlc19vZmJfZW5jcnlwdCgodW5zaWduZWQgY2hhciAqKWlucHV0LCh1bnNpZ25lZCBjaGFyICopYywKKwkJbnVtYml0cyxsZW4sKmtzLGl2ZWMpOworCXN2X3NldHB2bihTVCgzKSwoY2hhciAqKWl2ZWMsOCk7CisJUFVTSHMocyk7CisJfQorCit2b2lkCitkZXNfcGNiY19lbmNyeXB0KGlucHV0LGtzLGl2ZWMsZW5jcnlwdCkKKwljaGFyICoJaW5wdXQKKwlkZXNfa2V5X3NjaGVkdWxlICoJa3MKKwlkZXNfY2Jsb2NrICoJaXZlYworCWludAllbmNyeXB0CitQUENPREU6CisJeworCVNWICpzOworCVNUUkxFTiBsZW4sbDsKKwljaGFyICpjOworCisJbD1TdkNVUihTVCgwKSk7CisJbGVuPSgoKCh1bnNpZ25lZCBsb25nKWwpKzcpLzgpKjg7CisJcz1zdl9uZXdtb3J0YWwoKTsKKwlzdl9zZXRwdm4ocywiIiwwKTsKKwlTdkdST1cocyxsZW4pOworCVN2Q1VSX3NldChzLGxlbik7CisJYz0oY2hhciAqKVN2UFYocyxuYSk7CisJZGVzX3BjYmNfZW5jcnlwdCgoZGVzX2NibG9jayAqKWlucHV0LChkZXNfY2Jsb2NrICopYywKKwkJbCwqa3MsaXZlYyxlbmNyeXB0KTsKKwlzdl9zZXRwdm4oU1QoMiksKGNoYXIgKiljW2xlbi04XSw4KTsKKwlQVVNIcyhzKTsKKwl9CisKK2Rlc19jYmxvY2sgKgorZGVzX3JhbmRvbV9rZXkoKQorQ09ERToKKwl7CisJZGVzX2NibG9jayBjOworCisJZGVzX3JhbmRvbV9rZXkoYyk7CisJUkVUVkFMPSZjOworCX0KK09VVFBVVDoKK1JFVFZBTAorCitkZXNfY2Jsb2NrICoKK2Rlc19zdHJpbmdfdG9fa2V5KHN0cikKK2NoYXIgKglzdHIKK0NPREU6CisJeworCWRlc19jYmxvY2sgYzsKKworCWRlc19zdHJpbmdfdG9fa2V5KHN0ciwmYyk7CisJUkVUVkFMPSZjOworCX0KK09VVFBVVDoKK1JFVFZBTAorCit2b2lkCitkZXNfc3RyaW5nX3RvXzJrZXlzKHN0cikKK2NoYXIgKglzdHIKK1BQQ09ERToKKwl7CisJZGVzX2NibG9jayBjMSxjMjsKKwlTViAqczEsKnMyOworCisJZGVzX3N0cmluZ190b18ya2V5cyhzdHIsJmMxLCZjMik7CisJRVhURU5EKHNwLDIpOworCXMxPXN2X25ld21vcnRhbCgpOworCXN2X3NldHB2bihzMSwoY2hhciAqKWMxLDgpOworCXMyPXN2X25ld21vcnRhbCgpOworCXN2X3NldHB2bihzMiwoY2hhciAqKWMyLDgpOworCVBVU0hzKHMxKTsKKwlQVVNIcyhzMik7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9GSUxFUzAgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL0ZJTEVTMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzdlYTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9GSUxFUzAKQEAgLTAsMCArMSw5NiBAQAorLyogR2VuZXJhbCBzdHVmZiAqLworQ09QWVJJR0hUCS0gQ29weXJpZ2h0IGluZm8uCitNT0RFUy5ERVMJLSBBIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlcyBvZiB0aGUgZGlmZmVyZW50IG1vZGVzIG9mIERFUy4KK0ZJTEVTCQktIFRoaXMgZmlsZS4KK0lOU1RBTEwJCS0gSG93IHRvIG1ha2UgdGhpbmdzIGNvbXBpbGUuCitJbWFrZWZpbGUJLSBGb3IgdXNlIHdpdGgga2VyYmVyb3MuCitSRUFETUUJCS0gV2hhdCB0aGlzIHBhY2thZ2UgaXMuCitWRVJTSU9OCQktIFdoaWNoIHZlcnNpb24gdGhpcyBpcyBhbmQgd2hhdCB3YXMgY2hhbmdlZC4KK0tFUkJFUk9TCS0gS2VyYmVyb3MgdmVyc2lvbiA0IG5vdGVzLgorTWFrZWZpbGUuUEwJLSBBbiBvbGQgbWFrZWZpbGUgdG8gYnVpbGQgd2l0aCBwZXJsNSwgbm90IGN1cnJlbnQuCitNYWtlZmlsZS5zc2wJLSBUaGUgU1NMZWF5IG1ha2VmaWxlCitNYWtlZmlsZS51bmkJLSBUaGUgbm9ybWFsIHVuaXggbWFrZWZpbGUuCitHTlVtYWtlZmlsZQktIFRoZSBtYWtlZmlsZSBmb3IgdXNlIHdpdGggZ2xpYmMuCittYWtlZmlsZS5iYwktIEEgQm9ybGFuZCBDIG1ha2VmaWxlCit0aW1lcwkJLSBTb21lIG91dHB1dHMgZnJvbSAnc3BlZWQnIG9uIHNvbWUgbWFjaGluZXMuCit2bXMuY29tCQktIEZvciB1c2Ugd2hlbiBjb21waWxpbmcgdW5kZXIgVk1TCisKKy8qIE15IFN1bk9TIGRlcygxKSByZXBsYWNlbWVudCAqLworZGVzLmMJCS0gZGVzKDEpIHNvdXJjZSBjb2RlLgorZGVzLm1hbgkJLSBkZXMoMSkgbWFudWFsLgorCisvKiBUZXN0aW5nIGFuZCB0aW1pbmcgcHJvZ3JhbXMuICovCitkZXN0ZXN0LmMJLSBTb3VyY2UgZm9yIGxpYmRlcy5hIHRlc3QgcHJvZ3JhbS4KK3NwZWVkLmMJCS0gU291cmNlIGZvciBsaWJkZXMuYSB0aW1pbmcgcHJvZ3JhbS4KK3Jwdy5jCQktIFNvdXJjZSBmb3IgbGliZGVzLmEgdGVzdGluZyBwYXNzd29yZCByZWFkaW5nIHJvdXRpbmVzLgorCisvKiBsaWJkZXMuYSBzb3VyY2UgY29kZSAqLworZGVzX2NyeXB0Lm1hbgktIGxpYmRlcy5hIG1hbnVhbCBwYWdlLgorZGVzLmgJCS0gUHVibGljIGxpYmRlcy5hIGhlYWRlciBmaWxlLgorZWNiX2VuYy5jCS0gZGVzX2VjYl9lbmNyeXB0KCkgc291cmNlLCB0aGlzIGNvbnRhaW5zIHRoZSBiYXNpYyBERVMgY29kZS4KK2VjYjNfZW5jLmMJLSBkZXNfZWNiM19lbmNyeXB0KCkgc291cmNlLgorY2JjX2NrbS5jCS0gZGVzX2NiY19ja3N1bSgpIHNvdXJjZS4KK2NiY19lbmMuYwktIGRlc19jYmNfZW5jcnlwdCgpIHNvdXJjZS4KK25jYmNfZW5jLmMJLSBkZXNfY2JjX2VuY3J5cHQoKSB0aGF0IGlzICdub3JtYWwnIGluIHRoYXQgaXQgY29waWVzCisJCSAgdGhlIG5ldyBpdiB2YWx1ZXMgYmFjayBpbiB0aGUgcGFzc2VkIGl2IHZlY3Rvci4KK2VkZV9lbmMuYwktIGRlc19lZGUzX2NiY19lbmNyeXB0KCkgY2JjIG1vZGUgZGVzIHVzaW5nIHRyaXBsZSBERVMuCitjYmMzX2VuYy5jCS0gZGVzXzNjYmNfZW5jcnlwdCgpIHNvdXJjZSwgZG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24uCitjZmJfZW5jLmMJLSBkZXNfY2ZiX2VuY3J5cHQoKSBzb3VyY2UuCitjZmI2NGVuYy5jCS0gZGVzX2NmYjY0X2VuY3J5cHQoKSBjZmIgaW4gNjQgYml0IG1vZGUgYnV0IHNldHVwIHRvIGJlCisJCSAgdXNlZCBhcyBhIHN0cmVhbSBjaXBoZXIuCitjZmI2NGVkZS5jCS0gZGVzX2VkZTNfY2ZiNjRfZW5jcnlwdCgpIGNmYiBpbiA2NCBiaXQgbW9kZSBidXQgc2V0dXAgdG8gYmUKKwkJICB1c2VkIGFzIGEgc3RyZWFtIGNpcGhlciBhbmQgdXNpbmcgdHJpcGxlIERFUy4KK29mYl9lbmMuYwktIGRlc19jZmJfZW5jcnlwdCgpIHNvdXJjZS4KK29mYjY0X2VuYy5jCS0gZGVzX29mYl9lbmNyeXB0KCkgb2ZiIGluIDY0IGJpdCBtb2RlIGJ1dCBzZXR1cCB0byBiZQorCQkgIHVzZWQgYXMgYSBzdHJlYW0gY2lwaGVyLgorb2ZiNjRlZGUuYwktIGRlc19lZGUzX29mYjY0X2VuY3J5cHQoKSBvZmIgaW4gNjQgYml0IG1vZGUgYnV0IHNldHVwIHRvIGJlCisJCSAgdXNlZCBhcyBhIHN0cmVhbSBjaXBoZXIgYW5kIHVzaW5nIHRyaXBsZSBERVMuCitlbmNfcmVhZC5jCS0gZGVzX2VuY19yZWFkKCkgc291cmNlLgorZW5jX3dyaXQuYwktIGRlc19lbmNfd3JpdGUoKSBzb3VyY2UuCitwY2JjX2VuYy5jCS0gZGVzX3BjYmNfZW5jcnlwdCgpIHNvdXJjZS4KK3F1ZF9ja3NtLmMJLSBxdWFkX2Nrc3VtKCkgc291cmNlLgorcmFuZF9rZXkuYwktIGRlc19yYW5kb21fa2V5KCkgc291cmNlLgorcmVhZF9wd2QuYwktIFNvdXJjZSBmb3IgZGVzX3JlYWRfcGFzc3dvcmQoKSBwbHVzIHJlbGF0ZWQgZnVuY3Rpb25zLgorc2V0X2tleS5jCS0gU291cmNlIGZvciBkZXNfc2V0X2tleSgpLgorc3RyMmtleS5jCS0gQ292ZXJ0IGEgc3RyaW5nIG9mIGFueSBsZW5ndGggaW50byBhIGtleS4KK2ZjcnlwdC5jCS0gQSBzbWFsbCwgZmFzdCB2ZXJzaW9uIG9mIGNyeXB0KDMpLgorZGVzX2xvY2wuaAktIEludGVybmFsIGxpYmRlcy5hIGhlYWRlciBmaWxlLgorcG9kZC5oCQktIE9kZCBwYXJpdHkgdGFibGVzIC0gdXNlZCBpbiBkZXNfc2V0X2tleSgpLgorc2suaAkJLSBMb29rdXAgdGFibGVzIHVzZWQgaW4gZGVzX3NldF9rZXkoKS4KK3Nwci5oCQktIFdoYXQgaXMgbGVmdCBvZiB0aGUgUyB0YWJsZXMgLSB1c2VkIGluIGVjYl9lbmNyeXB0KCkuCitkZXNfdmVyLmgJLSBoZWFkZXIgZmlsZSBmb3IgdGhlIGV4dGVybmFsIGRlZmluaXRpb24gb2YgdGhlCisJCSAgdmVyc2lvbiBzdHJpbmcuCitkZXMuZG9jCQktIFNTTGVheSBkb2N1bWVudGF0aW9uIGZvciB0aGUgbGlicmFyeS4KKworLyogVGhlIHBlcmwgc2NyaXB0cyAtIHlvdSBjYW4gaWdub3JlIHRoZXNlIGZpbGVzIHRoZXkgYXJlIG9ubHkKKyAqIGluY2x1ZGVkIGZvciB0aGUgY3VyaW91cyAqLworZGVzLnBsCQktIGRlcyBpbiBwZXJsIGFueW9uZT8gZGVzX3NldF9rZXkgYW5kIGRlc19lY2JfZW5jcnlwdAorCQkgIGJvdGggZG9uZSBpbiBhIHBlcmwgbGlicmFyeS4KK3Rlc3RkZXMucGwJLSBUZXN0aW5nIHByb2dyYW0gZm9yIGRlcy5wbAorZG9JUAkJLSBQZXJsIHNjcmlwdCB1c2VkIHRvIGRldmVsb3AgSVAgeG9yL3NoaWZ0IGNvZGUuCitkb1BDMQkJLSBQZXJsIHNjcmlwdCB1c2VkIHRvIGRldmVsb3AgUEMxIHhvci9zaGlmdCBjb2RlLgorZG9QQzIJCS0gR2VuZXJhdGVzIHNrLmguCitQQzEJCS0gT3V0cHV0IG9mIGRvUEMxIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBvdXRwdXQgZnJvbSBQQzEuCitQQzIJCS0gdXNlZCBpbiBkZXZlbG9wbWVudCBvZiBkb1BDMi4KK3NoaWZ0cy5wbAktIFBlcmwgbGlicmFyeSB1c2VkIGJ5IG15IHBlcmwgc2NyaXB0cy4KKworLyogSSBzdGFydGVkIG1ha2luZyBhIHBlcmw1IGR5bmFtaWMgbGlicmFyeSBmb3IgbGliZGVzCisgKiBidXQgZGlkIG5vdCBmdWxseSBmaW5pc2gsIHRoZXNlIGZpbGVzIGFyZSBwYXJ0IG9mIHRoYXQgZWZmb3J0LiAqLworREVTLnBtCitERVMucG9kCitERVMueHMKK3QKK3R5cGVtYXAKKworLyogVGhlIGZvbGxvd2luZyBhcmUgZm9yIHVzZSB3aXRoIHN1biBSUEMgaW1wbGVtZW50YWlvbnMuICovCitycGNfZGVzLmgKK3JwY19lbmMuYworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBjb250aWJ1dGVkIGJ5IE1hcmsgTXVycmF5IDxtYXJrQGdyb25kYXIuemE+LiAgVGhleQorICogYXJlIG5vdCBub3JtYWxseSBidWlsdCBpbnRvIGxpYmRlcyBkdWUgdG8gbWFjaGluZSBzcGVjaWZpYyByb3V0aW5lcworICogY29udGFpbmVkIGluIHRoZW0uICBUaGV5IGFyZSBmb3IgdXNlIGluIHRoZSBtb3N0IHJlY2VudCBpbmNhcm5hdGlvbiBvZgorICogZXhwb3J0IGtlcmJlcm9zIHYgNCAoZUJvbmVzKS4gKi8KK3N1cHAuYworbmV3X3JrZXkuYworCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvSU5TVEFMTCBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWViZGZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9JTlNUQUxMCkBAIC0wLDAgKzEsNjkgQEAKK0NoZWNrIHRoZSBDQyBhbmQgQ0ZMQUdTIGxpbmVzIGluIHRoZSBtYWtlZmlsZQorCitJZiB5b3VyIEMgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0IHRoZSB0aW1lcygzKSBmdW5jdGlvbiwgY2hhbmdlIHRoZQorI2RlZmluZSBUSU1FUyB0bworI3VuZGVmIFRJTUVTIGluIHNwZWVkLmMKK0lmIGl0IGRvZXMsIGNoZWNrIHRoZSBIWiB2YWx1ZSBmb3IgdGhlIHRpbWVzKDMpIGZ1bmN0aW9uLgorSWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIENMS19UQ0sgaXQgd2lsbCBiZSBhc3N1bWVkIHRvCitiZSAxMDAuMC4KKworSWYgcG9zc2libGUgdXNlIGdjYyB2IDIuNy4/CitUdXJuIG9uIHRoZSBtYXhpbXVtIG9wdGltaXNpbmcgKG5vcm1hbGx5ICctTzMgLWZvbWl0LWZyYW1lLXBvaW50ZXInIGZvciBnY2MpCitJbiByZWNlbnQgdGltZXMsIHNvbWUgc3lzdGVtIGNvbXBpbGVycyBnaXZlIGJldHRlciBwZXJmb3JtYWNlLgorCit0eXBlICdtYWtlJworCitydW4gJy4vZGVzdGVzdCcgdG8gY2hlY2sgdGhpbmdzIGFyZSBvay4KK3J1biAnLi9ycHcnIHRvIGNoZWNrIHRoZSB0dHkgY29kZSBmb3IgcmVhZGluZyBwYXNzd29yZHMgd29ya3MuCitydW4gJy4vc3BlZWQnIHRvIHNlZSBob3cgZmFzdCB0aG9zZSBvcHRpbWlzYXRpb25zIG1ha2UgdGhlIGxpYnJhcnkgcnVuIDotKQorcnVuICcuL2Rlc19vcHRzJyB0byBkZXRlcm1pbiB0aGUgYmVzdCBjb21waWxlIHRpbWUgb3B0aW9ucy4KKworVGhlIG91dHB1dCBmcm9tIGRlc19vcHRzIHNob3VsZCBiZSBwdXQgaW4gdGhlIG1ha2VmaWxlIG9wdGlvbnMgYW5kIGRlc19lbmMuYworc2hvdWxkIGJlIHJlYnVpbHQuICBGb3IgNjQgYml0IGNvbXB1dGVycywgZG8gbm90IHVzZSB0aGUgREVTX1BUUiBvcHRpb24uCitGb3IgdGhlIERFQyBBbHBoYSwgZWRpdCBkZXMuaCBhbmQgY2hhbmdlIERFU19MT05HIHRvICd1bnNpZ25lZCBpbnQnCithbmQgdGhlbiB5b3UgY2FuIHVzZSB0aGUgJ0RFU19QVFInIG9wdGlvbi4KKworVGhlIGZpbGUgb3B0aW9ucy50eHQgaGFzIHRoZSBvcHRpb25zIGxpc3RlZCBmb3IgYmVzdCBzcGVlZCBvbiBxdWl0ZSBhCitmZXcgc3lzdGVtcy4gIExvb2sgYW5kIHRoZSBvcHRpb25zIChVTlJPTEwsIFBUUiwgUklTQzIgZXRjKSBhbmQgdGhlbgordHVybiBvbiB0aGUgcmVsZXZhbnQgb3B0aW9uIGluIHRoZSBNYWtlZmlsZS4KKworVGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBNYWtlZmlsZSB0YXJnZXRzIHRoYXQgbWFrZSBsaWZlIGVhc2llci4KK21ha2UgY2MJCS0gc3RhbmRhcmQgY2MgYnVpbGQKK21ha2UgZ2NjCS0gc3RhbmRhcmQgZ2NjIGJ1aWxkCittYWtlIHg4Ni1lbGYJLSB4ODYgYXNzZW1ibGVyIChlbGYpLCBsaW51eC1lbGYuCittYWtlIHg4Ni1vdXQJLSB4ODYgYXNzZW1ibGVyIChhLm91dCksIEZyZWVCU0QKK21ha2UgeDg2LXNvbGFyaXMtIHg4NiBhc3NlbWJsZXIKK21ha2UgeDg2LWJzZGkJLSB4ODYgYXNzZW1ibGVyIChhLm91dCB3aXRoIHByaW1hdGl2ZSBhc3NlbWJsZXIpLgorCitJZiBhdCBhbGwgcG9zc2libGUgdXNlIHRoZSBhc3NlbWJsZXIgKGZvciBXaW5kb3dzIE5ULzk1LCB1c2UKK2FzbS93aW4zMi5vYmogdG8gbGluayB3aXRoKS4gIFRoZSB4ODYgYXNzZW1ibGVyIGlzIHZlcnkgdmVyeSBmYXN0LgorCitBIG1ha2UgaW5zdGFsbCB3aWxsIGJ5IGRlZmF1bHQgaW5zdGFsbAorbGliZGVzLmEgICAgICBpbiAvdXNyL2xvY2FsL2xpYi9saWJkZXMuYQorZGVzICAgICAgICAgICBpbiAvdXNyL2xvY2FsL2Jpbi9kZXMKK2Rlc19jcnlwdC5tYW4gaW4gL3Vzci9sb2NhbC9tYW4vbWFuMy9kZXNfY3J5cHQuMworZGVzLm1hbiAgICAgICBpbiAvdXNyL2xvY2FsL21hbi9tYW4xL2Rlcy4xCitkZXMuaCAgICAgICAgIGluIC91c3IvaW5jbHVkZS9kZXMuaAorCitkZXMoMSkgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBzdW5PUydzIGJ1dCBJIGhhdmUgYmVlbiB1bmFibGUgdG8KK3Rlc3QgaXQuCisKK1RoZXNlIHJvdXRpbmVzIHNob3VsZCBjb21waWxlIG9uIE1TRE9TLCBtb3N0IDMyYml0IGFuZCA2NGJpdCB2ZXJzaW9uCitvZiBVbml4IChCU0QgYW5kIFNZU1YpIGFuZCBWTVMsIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorVGhlIG9ubHkgcHJvYmxlbXMgc2hvdWxkIGJlICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIGluIHRoZSB3cm9uZyBwbGFjZXMuCisKK1RoZXNlIHJvdXRpbmVzIGNhbiBiZSBjb21waWxlZCB1bmRlciBNU0RPUy4KK0kgaGF2ZSBzdWNjZXNzZnVsbHkgZW5jcnlwdGVkIGZpbGVzIHVzaW5nIGRlcygxKSB1bmRlciBNU0RPUyBhbmQgdGhlbgorZGVjcnlwdGVkIHRoZSBmaWxlcyBvbiBhIFNwYXJjU3RhdGlvbi4KK0kgaGF2ZSBiZWVuIGFibGUgdG8gY29tcGlsZSBhbmQgdGVzdCB0aGUgcm91dGluZXMgd2l0aAorTWljcm9zb2Z0IEMgdiA1LjEgYW5kIFR1cmJvIEMgdiAyLjAuCitUaGUgY29kZSBpbiB0aGlzIGxpYnJhcnkgaXMgaW4gbm8gd2F5IG9wdGltaXNlZCBmb3IgdGhlIDE2Yml0CitvcGVyYXRpb24gb2YgTVNET1MuCisKK1doZW4gYnVpbGRpbmcgZm9yIGdsaWJjLCBpZ25vcmUgYWxsIG9mIHRoZSBhYm92ZSBhbmQganVzdCB1bnBhY2sgaW50bworZ2xpYmMtMS4/Py9kZXMgYW5kIHRoZW4gZ21ha2UgYXMgcGVyIG5vcm1hbC4KKworQXMgYSBmaW5hbCBub3RlIG9uIHBlcmZvcm1hY2UuICBDZXJ0YWluIENQVXMgbGlrZSBzcGFyY3MgYW5kIEFscGhhIG9mdGVuIGdpdmUKK2EgJTEwIHNwZWVkIGRpZmZlcmVuY2UgZGVwZW5kaW5nIG9uIHRoZSBsaW5rIG9yZGVyLiAgSXQgaXMgcmF0aGVyIGFub3lpbmcKK3doZW4gb25lIHByb2dyYW0gcmVwb3J0cyAneCcgREVTIGVuY3J5cHRzIGEgc2Vjb25kIGFuZCBhbm90aGVyIHJlcG9ydHMKKyd4KjAuOScgdGhlIHNwZWVkLgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9JbWFrZWZpbGUgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL0ltYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjliNTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9JbWFrZWZpbGUKQEAgLTAsMCArMSwzNSBAQAorIyBUaGlzIEltYWtlZmlsZSBoYXMgbm90IGJlZW4gdGVzdGVkIGZvciBhIHdoaWxlIGJ1dCBpdCBzaG91bGQgc3RpbGwKKyMgd29yayB3aGVuIHBsYWNlZCBpbiB0aGUgY29ycmVjdCBkaXJlY3RvcnkgaW4gdGhlIGtlcmJlcm9zIHYgNCBkaXN0cmlidXRpb24KKworU1JDUz0gICBjYmNfY2tzbS5jIGNiY19lbmMuYyBlY2JfZW5jLmMgcGNiY19lbmMuYyBcCisgICAgICAgIHF1ZF9ja3NtLmMgcmFuZF9rZXkuYyByZWFkX3B3ZC5jIHNldF9rZXkuYyBzdHIya2V5LmMgXAorICAgICAgICBlbmNfcmVhZC5jIGVuY193cml0LmMgZmNyeXB0LmMgY2ZiX2VuYy5jIFwKKwllY2IzX2VuYy5jIG9mYl9lbmMuYyBvZmI2NGVuYy5jCisKK09CSlM9ICAgY2JjX2Nrc20ubyBjYmNfZW5jLm8gZWNiX2VuYy5vIHBjYmNfZW5jLm8gXAorCXF1ZF9ja3NtLm8gcmFuZF9rZXkubyByZWFkX3B3ZC5vIHNldF9rZXkubyBzdHIya2V5Lm8gXAorCWVuY19yZWFkLm8gZW5jX3dyaXQubyBmY3J5cHQubyBjZmJfZW5jLm8gXAorCWVjYjNfZW5jLm8gb2ZiX2VuYy5vIG9mYjY0ZW5jLm8KKworR0VORVJBTD1DT1BZUklHSFQgRklMRVMgSU5TVEFMTCBJbWFrZWZpbGUgUkVBRE1FIFZFUlNJT04gbWFrZWZpbGUgdGltZXMgXAorCXZtcy5jb20gS0VSQkVST1MKK0RFUz0gICAgZGVzLmMgZGVzLm1hbgorVEVTVElORz1kZXN0ZXN0LmMgc3BlZWQuYyBycHcuYworTElCREVTPSBkZXNfY3J5cHQubWFuIGRlcy5oIGRlc19sb2NsLmggcG9kZC5oIHNrLmggc3ByLmgKKworUEVSTD0gICBkZXMucGwgdGVzdGRlcy5wbCBkb0lQIGRvUEMxIGRvUEMyIFBDMSBQQzIgc2hpZnRzLnBsCisKK0NPREU9ICAgICQoR0VORVJBTCkgJChERVMpICQoVEVTVElORykgJChTUkNTKSAkKExJQkRFUykgJChQRVJMKQorCitTUkNESVI9JChTUkNUT1ApL2xpYi9kZXMKKworREJHPSAtTworSU5DTFVERT0gLUkkKFNSQ0RJUikKK0NDPSBjYworCitsaWJyYXJ5X29ial9ydWxlKCkKKworaW5zdGFsbF9saWJyYXJ5X3RhcmdldChkZXMsJChPQkpTKSwkKFNSQ1MpLCkKKwordGVzdChkZXN0ZXN0LGxpYmRlcy5hLCkKK3Rlc3QocnB3LGxpYmRlcy5hLCkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvS0VSQkVST1MgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL0tFUkJFUk9TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDFiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL0tFUkJFUk9TCkBAIC0wLDAgKzEsNDEgQEAKKyBbIFRoaXMgaXMgYW4gb2xkIGZpbGUsIEkgZG9uJ3Qga25vdyBpZiBpdCBpcyB0cnVlIGFueW1vcmUKKyAgIGJ1dCBJIHdpbGwgbGVhdmUgdGhlIGZpbGUgaGVyZSAtIGVheSAyMS8xMS85NSBdCisKK1RvIHVzZSB0aGlzIGxpYnJhcnkgd2l0aCBCb25lcyAoa2VyYmVyb3Mgd2l0aG91dCBERVMpOgorMSkgR2V0IG15IG1vZGlmaWVkIEJvbmVzIC0gZUJvbmVzLiAgSXQgY2FuIGJlIGZvdW5kIG9uCisgICBnb25kd2FuYS5lY3IubXUub3ouYXUgKDEyOC4yNTAuMS42MykgL3B1Yi9hdGhlbmEvZUJvbmVzLXA5LnRhci5aCisgICBhbmQKKyAgIG5pYy5mdW5ldC5maSAoMTI4LjIxNC42LjEwMCkgL3B1Yi91bml4L3NlY3VyaXR5L0tlcmJlcm9zL2VCb25lcy1wOS50YXIuWgorCisyKSBVbnBhY2sgdGhpcyBsaWJyYXJ5IGluIHNyYy9saWIvZGVzLCBtYWtlaW5nIHN1cmUgaXQgaXMgdmVyc2lvbgorICAgMy4wMCBvciBncmVhdGVyIChsaWJkZXMudGFyLjkzLTEwLTA3LlopLiAgVGhpcyB2ZXJzaW9ucyBkaWZmZXJlbmNlcworICAgZnJvbSB0aGUgdmVyc2lvbiBpbiBjb21wLnNvdXJjZXMubWlzYyB2b2x1bWUgMjkgcGF0Y2hsZXZlbDIuCisgICBUaGUgcHJpbWFyaWx5IGRpZmZlcmVuY2UgaXMgdGhhdCBpdCBzaG91bGQgY29tcGlsZSB1bmRlciBrZXJiZXJvcyA6LSkuCisgICBJdCBjYW4gYmUgZm91bmQgYXQuCisgICBmdHAucHN5LnVxLm96LmF1ICgxMzAuMTAyLjMyLjEpIC9wdWIvREVTL2xpYmRlcy50YXIuOTMtMTAtMDcuWgorCitOb3cgZG8gYSBub3JtYWwga2VyYmVyb3MgYnVpbGQgYW5kIHRoaW5ncyBzaG91bGQgd29yay4KKworT25lIHByb2JsZW0gSSBmb3VuZCB3aGVuIEkgd2FzIGJ1aWxkIG9uIG15IGxvY2FsIHN1bi4KKy0tLQorRm9yIHN1bk9TIDQuMS4xIGFwcGx5IHRoZSBmb2xsb3dpbmcgcGF0Y2ggdG8gc3JjL3V0aWwvc3MvbWFrZV9jb21tYW5kcy5jCisKKyoqKiBtYWtlX2NvbW1hbmRzLmMub3JpZwlGcmkgSnVsICAzIDA0OjE4OjM1IDE5ODcKKy0tLSBtYWtlX2NvbW1hbmRzLmMJV2VkIE1heSAyMCAwODo0Nzo0MiAxOTkyCisqKioqKioqKioqKioqKioKKyoqKiA5OCwxMDQgKioqKgorICAgICAgIGlmICghcmVuYW1lKG9fZmlsZSwgel9maWxlKSkgeworICAJICBpZiAoIXZmb3JrKCkpIHsKKyAgCSAgICAgICBjaGRpcigiL3RtcCIpOworISAJICAgICAgIGV4ZWNsKCIvYmluL2xkIiwgImxkIiwgIi1vIiwgb19maWxlKzUsICItcyIsICItciIsICItbiIsCisgIAkJICAgICB6X2ZpbGUrNSwgMCk7CisgIAkgICAgICAgcGVycm9yKCIvYmluL2xkIik7CisgIAkgICAgICAgX2V4aXQoMSk7CistLS0gOTgsMTA0IC0tLS0KKyAgICAgICBpZiAoIXJlbmFtZShvX2ZpbGUsIHpfZmlsZSkpIHsKKyAgCSAgaWYgKCF2Zm9yaygpKSB7CisgIAkgICAgICAgY2hkaXIoIi90bXAiKTsKKyEgCSAgICAgICBleGVjbCgiL2Jpbi9sZCIsICJsZCIsICItbyIsIG9fZmlsZSs1LCAiLXMiLCAiLXIiLAorICAJCSAgICAgel9maWxlKzUsIDApOworICAJICAgICAgIHBlcnJvcigiL2Jpbi9sZCIpOworICAJICAgICAgIF9leGl0KDEpOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9SRUFETUUgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjFhNWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9SRUFETUUKQEAgLTAsMCArMSw1NCBAQAorCisJCWxpYmRlcywgVmVyc2lvbiA0LjAxIDEwLUphbi05NworCisJCUNvcHlyaWdodCAoYykgMTk5NywgRXJpYyBZb3VuZworCQkJICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgc3BlY2lmaWVkIGluIENPUFlSSUdIVC4KKyAgICAKKy0tCitUaGUgcHJpbWFyeSBmdHAgc2l0ZSBmb3IgdGhpcyBsaWJyYXJ5IGlzCitmdHA6Ly9mdHAucHN5LnVxLm96LmF1L3B1Yi9DcnlwdG8vREVTL2xpYmRlcy14Lnh4LnRhci5negorbGliZGVzIGlzIG5vdyBhbHNvIHNoaXBwZWQgd2l0aCBTU0xlYXkuICBQcmltYXJ5IGZ0cCBzaXRlIG9mCitmdHA6Ly9mdHAucHN5LnVxLm96LmF1L3B1Yi9DcnlwdG8vU1NML1NTTGVheS14LngueC50YXIuZ3oKKworVGhlIGJlc3Qgd2F5IHRvIGJ1aWxkIHRoaXMgbGlicmFyeSBpcyB0byBidWlsZCBpdCBhcyBwYXJ0IG9mIFNTTGVheS4KKworVGhpcyBraXQgYnVpbGRzIGEgREVTIGVuY3J5cHRpb24gbGlicmFyeSBhbmQgYSBERVMgZW5jcnlwdGlvbiBwcm9ncmFtLgorSXQgc3VwcG9ydHMgZWNiLCBjYmMsIG9mYiwgY2ZiLCB0cmlwbGUgZWNiLCB0cmlwbGUgY2JjLCB0cmlwbGUgb2ZiLAordHJpcGxlIGNmYiwgZGVzeCwgYW5kIE1JVCdzIHBjYmMgZW5jcnlwdGlvbiBtb2RlcyBhbmQgYWxzbyBoYXMgYSBmYXN0CitpbXBsZW1lbnRhdGlvbiBvZiBjcnlwdCgzKS4KK0l0IGNvbnRhaW5zIHN1cHBvcnQgcm91dGluZXMgdG8gcmVhZCBrZXlzIGZyb20gYSB0ZXJtaW5hbCwKK2dlbmVyYXRlIGEgcmFuZG9tIGtleSwgZ2VuZXJhdGUgYSBrZXkgZnJvbSBhbiBhcmJpdHJhcnkgbGVuZ3RoIHN0cmluZywKK3JlYWQvd3JpdGUgZW5jcnlwdGVkIGRhdGEgZnJvbS90byBhIGZpbGUgZGVzY3JpcHRvci4KKworVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCB0aGUgbWFudWFsIGVudHJ5Citmb3IgdGhlIGRlc19jcnlwdCgzKSBsaWJyYXJ5IHJvdXRpbmVzIGZyb20gTUlUJ3MgcHJvamVjdCBBdGhlbmEuCisKK2Rlc3Rlc3Qgc2hvdWxkIGJlIHJ1biBhZnRlciBjb21waWxhdGlvbiB0byB0ZXN0IHRoZSBkZXMgcm91dGluZXMuCitycHcgc2hvdWxkIGJlIHJ1biBhZnRlciBjb21waWxhdGlvbiB0byB0ZXN0IHRoZSByZWFkIHBhc3N3b3JkIHJvdXRpbmVzLgorVGhlIGRlcyBwcm9ncmFtIGlzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBzdW4gZGVzIGNvbW1hbmQuICBJIGJlbGlldmUgaXQKK2NvbmZvcm1zIHRvIHRoZSBzdW4gdmVyc2lvbi4KKworVGhlIEltYWtlZmlsZSBpcyBzZXR1cCBmb3IgdXNlIGluIHRoZSBrZXJiZXJvcyBkaXN0cmlidXRpb24uCisKK1RoZXNlIHJvdXRpbmVzIGFyZSBiZXN0IGNvbXBpbGVkIHdpdGggZ2NjIG9yIGFueSBvdGhlciBnb29kCitvcHRpbWlzaW5nIGNvbXBpbGVyLgorSnVzdCB0dXJuIHlvdSBvcHRpbWlzZXIgdXAgdG8gdGhlIGhpZ2hlc3Qgc2V0dGluZ3MgYW5kIHJ1biBkZXN0ZXN0CithZnRlciB0aGUgYnVpbGQgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgd29ya3MuCisKK0kgYmVsaWV2ZSB0aGVzZSByb3V0aW5lcyBhcmUgY2xvc2UgdG8gdGhlIGZhc3Rlc3QgYW5kIG1vc3QgcG9ydGFibGUgREVTCityb3V0aW5lcyB0aGF0IHVzZSBzbWFsbCBsb29rdXAgdGFibGVzICg0LjVrKSB0aGF0IGFyZSBwdWJsaWNseSBhdmFpbGFibGUuCitUaGUgZmNyeXB0IHJvdXRpbmUgaXMgZmFzdGVyIHRoYW4gdWZjJ3MgZmNyeXB0ICh3aGVuIGNvbXBpbGluZyB3aXRoCitnY2MyIC1PMikgb24gdGhlIHNwYXJjIDIgKDE0MTAgdnMgMTI3MCkgYnV0IGlzIG5vdCBzbyBnb29kIG9uIG90aGVyIG1hY2hpbmVzCisob24gYSBzdW4zLzI2MCAxNjggdnMgMzM2KS4gIEl0IGlzIGEgZnVuY3Rpb24gb2YgQ1BVIG9uIGNoaXAgY2FjaGUgc2l6ZS4KK1sgMTAtSmFuLTk3IGFuZCBhIGZ1bmN0aW9uIG9mIGFuIGluY29ycmVjdCBzcGVlZCB0ZXN0aW5nIHByb2dyYW0gaW4KKyAgdWZjIHdoaWNoIGdhdmUgbXVjaCBiZXR0ZXIgdGVzdCBmaWd1cmVzIHRoYXQgcmVhbGl0eSBdLgorCitJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCBvbiBzcGFyYyBhbmQgQWxwaGEgQ1BVcywgcGVyZm9ybWFuY2Ugb2YgdGhlIERFUworbGlicmFyeSBjYW4gdmFyeSBieSB1cHRvICUxMCBkdWUgdG8gdGhlIHBvc2l0aW9uaW5nIG9mIGZpbGVzIGFmdGVyIGFwcGxpY2F0aW9uCitsaW5rYWdlLgorCitFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9WRVJTSU9OIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9WRVJTSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDAxNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL1ZFUlNJT04KQEAgLTAsMCArMSw0MTIgQEAKKwlGaXhlZCB0aGUgd2VhayBrZXkgdmFsdWVzIHdoaWNoIHdlcmUgd3JvbmcgOi0oCisJRGVmaW5pbmcgU0lHQUNUSU9OIGNhdXNlcyBzaWdhY3Rpb24oKSB0byBiZSB1c2VkIGluc3RlYWQgb2Ygc2lnbmFsKCkuCisJU0lHVVNSMS9TSUdVU1IyIGFyZSBubyBsb25nZXIgbWFwcGVkIGluIHRoZSByZWFkIHR0eSBzdHVmZiBiZWNhdXNlIGl0CisJY2FuIGNhdXNlIHByb2JsZW1zLiAgVGhpcyBzaG91bGQgaG9wZWZ1bGx5IG5vdCBhZmZlY3Qgbm9ybWFsCisJYXBwbGljYXRpb25zLgorCitWZXJzaW9uIDQuMDQKKwlGaXhlZCBhIGZldyB0ZXN0cyBpbiBkZXN0ZXN0LiAgQWxzbyBhZGRlZCB4ODYgYXNzZW1iZXIgZm9yCisJZGVzX25jYmNfZW5jcnlwdCgpIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBjYmMgbW9kZSBmdW5jdGlvbi4KKwlUaGlzIG1ha2VzIGEgdmVyeSB2ZXJ5IGxhcmdlIHBlcmZvcm1hY2UgZGlmZmVyZW5jZS4KKwlBcmllbCBHbGVubiBhcmllbEBjb2x1bWJpYS5lZHUgcmVwb3J0cyB0aGF0IHRoZSB0ZXJtaW5hbAorCSd0dXJuIGVjaG8gb2ZmJyBjYW4gcmV0dXJuIChlcnJubyA9PSBFSU5WQUwpIHVuZGVyIHNvbGFyaXMKKwl3aGVuIHJlZGlyZWN0aW9uIGlzIHVzZWQuICBTbyBJIG5vdyBjYXRjaCB0aGF0IGFzIHdlbGwgYXMgRU5PVFRZLgorCisKK1ZlcnNpb24gNC4wMworCUxlZnQgYSBzdGF0aWMgb3V0IG9mIGVuY193cml0ZS5jLCB3aGljaCBjYXVzZWQgdG8gYnVmZmVyIHRvIGJlCisJY29udGluaW91c2x5IG1hbGxvYygpZWQuICBEb2VzIGFueW9uZSB1c2UgdGhlc2UgZnVuY3Rpb25zPyAgSSBrZWVwCisJb24gZmVlbGluZyBsaWtlIHJlbW92aW5nIHRoZW0gc2luY2UgSSBvbmx5IGhhZCB0aGVzZSBpbiB0aGVyZQorCWZvciBhIHZlcnNpb24gb2Yga2VyYmVyaXNlZCBsb2dpbi4gIEFueXdheSwgdGhpcyB3YXMgcG9pbnRlZCBvdXQKKwlieSBUaGVvIGRlIFJhYWR0IDxkZXJhYWR0QGN2cy5vcGVuYnNkLm9yZz4KKwlUaGUgJ24nIGJpdCBvZmIgY29kZSB3YXMgd3JvbmcsIGl0IHdhcyBub3Qgc2hpZnRpbmcgdGhlIHNoaWZ0CisJcmVnaXN0ZXIuIEl0IHdvcmtlZCBjb3JyZWN0bHkgZm9yIG4gPT0gNjQuICBUaGFua3MgdG8KKwlHaWdpIEFua2VueSA8R2lnaS5BbmtlbnlARW5nLlN1bi5DT00+IGZvciBwb2ludGluZyB0aGlzIG9uZSBvdXQuCisKK1ZlcnNpb24gNC4wMgorCUkgd2FzIGRvaW5nICdpZiAobWVtY21wKHdlYWtfa2V5c1tpXSxrZXksc2l6ZW9mKGtleSkpID09IDApJworCXdoZW4gY2hlY2tpbmcgZm9yIHdlYWsga2V5cyB3aGljaCBpcyB3cm9uZyA6LSgsIHBvaW50ZWQgb3V0IGJ5CisJTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1cy5vYmVyaHVtZXJAamsudW5pLWxpbnouYWMuYXQ+LgorCitWZXJzaW9uIDQuMDEKKwlFdmVuIGZhc3RlciBpbm5lciBsb29wIGluIHRoZSBERVMgYXNzZW1ibGVyIGZvciB4ODYgYW5kIGEgbW9kaWZpY2F0aW9uCisJZm9yIElQL0ZQIHdoaWNoIGlzIGZhc3RlciBvbiB4ODYuICBCb3RoIG9mIHRoZXNlIGNoYW5nZXMgYXJlCisJZnJvbSBTdmVuZCBPbGFmIE1pa2tlbHNlbiA8c3ZvbGFmQGluZXQudW5pLWMuZGs+LiAgSGlzCisJY2hhbmdlcyBtYWtlIHRoZSBhc3NlbWJsZXIgcnVuICU0MCBmYXN0ZXIgb24gYSBwZW50aXVtLiAgVGhpcyBpcyBqdXN0CisJYSBjYXNlIG9mIGdldHRpbmcgdGhlIGluc3RydWN0aW9uIHNlcXVlbmNlICdqdXN0IHJpZ2h0Jy4KKwlBbGwgY3JlZGl0IHRvICdTdmVuZCcgOi0pCisJUXVpdGUgYSBmZXcgc3BlY2lhbCB4ODYgJ21ha2UnIHRhcmdldHMuCisJQSBsaWJkZXMtbCAobGl0ZSkgZGlzdHJpYnV0aW9uLgorCitWZXJzaW9uIDQuMDAKKwlBZnRlciBhIGJpdCBvZiBhIHBhdXNlLCBJJ2xsIHVwIHRoZSBtYWpvciB2ZXJzaW9uIG51bWJlciBzaW5jZSB0aGlzCisJaXMgbW9zdGx5IGEgcGVyZm9ybWFjZSByZWxlYXNlLiAgSSd2ZSBhZGRlZCB4ODYgYXNzZW1ibGVyIGFuZAorCWFkZGVkIG1vcmUgb3B0aW9ucyBmb3IgcGVyZm9ybWFuY2UuICBBICUyOCBzcGVlZHVwIGZvciBnY2MgCisJb24gYSBwZW50aXVtIGFuZCB0aGUgYXNzZW1ibGVyIGlzIGEgJTUwIHNwZWVkdXAuCisJTUlQUyBDUFUncywgc3BhcmMgYW5kIEFscGhhIGFyZSB0aGUgbWFpbiBDUFUncyB3aXRoIHNwZWVkdXBzLgorCVJ1biBkZXNfb3B0cyB0byB3b3JrIG91dCB3aGljaCBvcHRpb25zIHNob3VsZCBiZSB1c2VkLgorCURFU19SSVNDMS9ERVNfUklTQzIgdXNlIGFsdGVybmF0aXZlIGlubmVyIGxvb3BzIHdoaWNoIHVzZQorCW1vcmUgcmVnaXN0ZXJzIGJ1dCBzaG91bGQgZ2l2ZSBzcGVlZHVwcyBvbiBhbnkgQ1BVIHRoYXQgZG9lcworCWR1YWwgaXNzdWUgKHBlbnRpdW0pLiAgREVTX1VOUk9MTCB1bnJvbGxzIHRoZSBpbm5lciBsb29wLAorCXdoaWNoIGNvc3RzIGluIGNvZGUgc2l6ZS4KKworVmVyc2lvbiAzLjI2CisJSSd2ZSBmaW5hbGx5IHJlbW92ZWQgb25lIG9mIHRoZSBzaGlmdHMgaW4gRF9FTkNSWVBULiAgVGhpcworCW1lYW50IEkndmUgY2hhbmdlZCB0aGUgZGVzX1NQdHJhbnMgdGFibGUgKHNwci5oKSwgdGhlIHNldF9rZXkoKQorCWZ1bmN0aW9uIGFuZCBzb21lIHRoaW5ncyBpbiBkZXNfZW5jLmMuICBUaGlzIGhhcyBkZWZpbml0bHkKKwltYWRlIHRoaW5ncyBmYXN0ZXIgOi0pLiAgSSd2ZSBrbm93biBhYm91dCB0aGlzIG9uZSBmb3Igc29tZQorCXRpbWUgYnV0IEkndmUgYmVlbiB0b28gbGF6eSB0byBmb2xsb3cgaXQgdXAgOi0pLgorCU5vdGljZWQgdGhhdCBpbiB0aGUgRF9FTkNSWVBUKCkgbWFjcm8sIHdlIGNhbiBqdXN0IGRvIExePSguLileKC4uKV4uLgorCWluc3RlYWQgb2YgTF49KCguLil8KC4uKXwoLi4pLi4gIFRoaXMgc2hvdWxkIHNhdmUgYSByZWdpc3RlciBhdAorCWxlYXN0LgorCUFzc2VtYmVyIGZvciB4ODYuICBUaGUgZmlsZSB0byByZXBsYWNlIGlzIGRlc19lbmMuYywgd2hpY2ggaXMgcmVwbGFjZWQKKwlieSBvbmUgb2YgdGhlIGFzc2VtYmxlciBmaWxlcyBmb3VuZCBpbiBhc20uICBMb29rIGF0IGRlcy9hc20vcmVhZG1lCisJZm9yIG1vcmUgaW5mby4KKworCS8qIE1vZGlmaWNhdGlvbiB0byBmY3J5cHQgc28gaXQgY2FuIGJlIGNvbXBpbGVkIHRvIHN1cHBvcnQKKwlIUFVYIDEwLngncyBsb25nIHBhc3N3b3JkIGZvcm1hdCwgZGVmaW5lIC1ETE9OR0NSWVBUIHRvIHVzZSB0aGlzLgorCVRoYW5rcyB0byBKZW5zIEt1cGZlcnNjaG1pZHQgPGJ0MWN1QGhwYm9vdC5yei51bmktbGVpcHppZy5kZT4uICovCisKKwlTSUdXSU5DSCBjYXNlIHB1dCBpbiBkZXNfcmVhZF9wYXNzd2QoKSBzbyB0aGUgZnVuY3Rpb24gZG9lcyBub3QKKwknZXhpdCcgaWYgdGhpcyBmdW5jdGlvbiBpcyByZWNpZXZlZC4KKworVmVyc2lvbiAzLjI1IDE3LzA3Lzk2CisJTW9kaWZpZWQgcmVhZF9wd2QuYyBzbyB0aGF0IHN0ZGluIGNhbiBiZSByZWFkIGlmIG5vdCBhIHR0eS4KKwlUaGFua3MgdG8gSmVmZiBCYXJiZXIgPGplZmZiQGlzc2wuYXRsLmhwLmNvbT4gZm9yIHRoZSBwYXRjaGVzLgorCWRlc19pbml0X3JhbmRvbV9udW1iZXJfZ2VuZXJhdG9yKCkgc2hvcnRlbmVkIGR1ZSB0byBWTVMgbGlua2VyCisJbGltaXRzLgorCUFkZGVkIFJTQSdzIERFU1ggY2JjIG1vZGUuICBJdCBpcyBhIGZvcm0gb2YgY2JjIGVuY3J5cHRpb24sIHdpdGggMgorCTggYnl0ZSBxdWFudGl0ZXMgeG9yZWQgYmVmb3JlIGFuZCBhZnRlciBlbmNyeXB0aW9uLgorCWRlc194Y2JjX2VuY3J5cHRpb24oKSAtIHRoZSBuYW1lIGlzIGZ1bm55IHRvIHByZXNlcnZlIHRoZSBkZXNfCisJcHJlZml4IG9uIGFsbCBmdW5jdGlvbnMuCisKK1ZlcnNpb24gMy4yNCAyMC8wNC85NgorCVRoZSBERVNfUFRSIG1hY3JvIG9wdGlvbiBjaGVja2VkIGFuZCB1c2VkIGJ5IFNTTGVheSBjb25maWd1cmF0aW9uCisKK1ZlcnNpb24gMy4yMyAxMS8wNC85NgorCUFkZGVkIERFU19MT05HLiAgSWYgZGVmaW5lZCB0byAndW5zaWduZWQgaW50JyBvbiB0aGUgREVDIEFscGhhLAorCWl0IGdpdmVzIGEgJTIwIHNwZWVkdXAgOi0pCisJRml4ZWQgdGhlIHByb2JsZW0gd2l0aCBkZXMucGwgdW5kZXIgcGVybDUuICBUaGUgcGF0Y2hlcyB3ZXJlCisJc2VudCBieSBFZCBLdWJhaXRpcyAoZWprQHVpdWMuZWR1KS4KKwlpZiBmY3J5cHQuYywgY2hhbmdlZCB2YWx1ZXMgdG8gaGFuZGxlIGlsbGVnYWwgc2FsdCB2YWx1ZXMgdGhlIHdheQorCW5vcm1hbCBjcnlwdCgpIGltcGxlbWVudGF0aW9ucyBkby4gIFNvbWUgcHJvZ3JhbXMgYXBwYXJlbnRseSB1c2UKKwl0aGVtIDotKC4gVGhlIHBhdGNoIHdhcyBzZW50IGJ5IEJqb3JuIEdyb252YWxsIDxiZ0BzaWNzLnNlPgorCitWZXJzaW9uIDMuMjIgMjkvMTEvOTUKKwlCdWcgaW4gZGVzKDEpLCBhbiBlcnJvciB3aXRoIHRoZSB1dWVuY29kaW5nIHN0dWZmIHdoZW4gdGhlCisJJ2RhdGEnIGlzIHNtYWxsLCB0aGFua3MgdG8gR2VvZmYgS2VhdGluZyA8a2VhZ2Nob25AbWVodGEuYW51LmVkdS5hdT4KKwlmb3IgdGhlIHBhdGNoLgorCitWZXJzaW9uIDMuMjEgMjIvMTEvOTUKKwlBZnRlciBzb21lIGVtYWlsaW5nIGJhY2sgYW5kIGZvcnRoIHdpdGggCisJQ29saW4gUGx1bWIgPGNvbGluQG55eDEwLmNzLmR1LmVkdT4sIEkndmUgdHdlYWtlZCBhIGZldyB0aGluZ3MKKwlhbmQgaW4gYSBmdXR1cmUgdmVyc2lvbiBJIHdpbGwgcHJvYmFibHkgcHV0IGluIHNvbWUgb2YgdGhlCisJb3B0aW1pc2F0aW9uIGhlIHN1Z2dlc3RlZCBmb3IgdXNlIHdpdGggdGhlIERFU19VU0VfUFRSIG9wdGlvbi4KKwlFeHRyYSByb3V0aW5lcyBmcm9tIE1hcmsgTXVycmF5IDxtYXJrQGdyb25kYXIuemE+IGZvciB1c2UgaW4KKwlmcmVlQlNELiAgVGhleSBtb3N0bHkgaW52b2x2ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gZm9yIHVzZQorCXdpdGgga2VyYmVyb3MuICBUaGV5IGludm9sdmUgZXZpbCBtYWNoaW5lIHNwZWNpZmljIHN5c3RlbSBjYWxscworCWV0YyBzbyBJIHdvdWxkIG5vcm1hbGx5IHN1Z2dlc3QgcHVzaGluZyB0aGlzIHN0dWZmIGludG8gdGhlCisJYXBwbGljYXRpb24gYW5kL29yIHVzaW5nIFJBTkRfc2VlZCgpL1JBTkRfYnl0ZXMoKSBpZiB5b3UgYXJlCisJdXNpbmcgdGhpcyBERVMgbGlicmFyeSBhcyBwYXJ0IG9mIFNTTGVheS4KKwlSZWRvbmUgdGhlIHJlYWRfcHcoKSBmdW5jdGlvbiBzbyB0aGF0IGl0IGlzIGNsZWFuZXIgYW5kCisJc3VwcG9ydHMgdGVybWlvcywgdGhhbmtzIHRvIFNhbWVlciBQYXJla2ggPHNhbWVlckBjMi5vcmc+CisJZm9yIHRoZSBpbml0aWFsIHBhdGNoZXMgZm9yIHRoaXMuCisJUmVuYW1lZCAzZWNiX2VuY3J5cHQoKSB0byBlY2IzX2VuY3J5cHQoKS4gIFRoaXMgaGFzIGJlZW4KKwkgZG9uZSBqdXN0IHRvIG1ha2UgdGhpbmdzIG1vcmUgY29uc2lzdGVudC4KKwlJIGhhdmUgYWxzbyBub3cgYWRkZWQgdHJpcGxlIERFUyB2ZXJzaW9ucyBvZiBjZmIgYW5kIG9mYi4KKworVmVyc2lvbiAzLjIwCisJRGFtbiwgRGFtbiwgRGFtbiwgYXMgcG9pbnRlZCBvdXQgYnkgTWlrZV9TcHJlaXR6ZXIuUEFSQ0B4ZXJveC5jb20sCisJbXkgZGVzX3JhbmRvbV9zZWVkKCkgZnVuY3Rpb24gd2FzIG9ubHkgY29weWluZyA0IGJ5dGVzIG9mIHRoZQorCXBhc3NlZCBzZWVkIGludG8gdGhlIGluaXQgc3RydWN0dXJlLiAgSXQgaXMgbm93IGZpeGVkIHRvIGNvcHkgOC4KKwlNeSBvd24gc3VnZ2VzdGlvbiBpcyB0byB1c2VkIHNvbWV0aGluZyBsaWtlIE1ENSA6LSkKKworVmVyc2lvbiAzLjE5IAorCVdoaWxlIGxvb2tpbmcgYXQgbXkgY29kZSBvbmUgZGF5LCBJIHRob3VnaCwgd2h5IGRvIEkga2VlcCBvbgorCWNhbGxpbmcgZGVzX2VuY3J5cHQoaW4sb3V0LGtzLGVuYykgd2hlbiBldmVyeSBmdW5jdGlvbiB0aGF0CisJY2FsbHMgaXQgaGFzIGluIGFuZCBvdXQgdGhlIHNhbWUuICBTbyBJIGRyb3BwZWQgdGhlICdvdXQnCisJcGFyYW1ldGVyLCBwZW9wbGUgc2hvdWxkIG5vdCBiZSB1c2luZyB0aGlzIGZ1bmN0aW9uLgorCitWZXJzaW9uIDMuMTggMzAvMDgvOTUKKwlGaXhlZCBhIGZldyBiaXQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFuZCB0aGUgZmlsZW5hbWVzLgorCTMuMTcgaGFkIGJlZW4gbXVuZ2VkIHZpYSBhIG1vdmUgdG8gRE9TIGFuZCBiYWNrIGFnYWluLgorCU5PIENPREUgQ0hBTkdFUworCitWZXJzaW9uIDMuMTcgMTQvMDcvOTUKKwlGaXhlZCBlZGUzIGNiYyB3aGljaCBJIGhhZCBicm9rZW4gaW4gMy4xNi4gIEkgaGF2ZSBhbHNvCisJcmVtb3ZlZCBzb21lIHVubmVlZGVkIHZhcmlhYmxlcyBpbiA3LTggb2YgdGhlIHJvdXRpbmVzLgorCitWZXJzaW9uIDMuMTYgMjYvMDYvOTUKKwlBZGRlZCBkZXNfZW5jcnlwdDIoKSB3aGljaCBkb2VzIG5vdCB1c2UgSVAvRlAsIHVzZWQgYnkgdHJpcGxlCisJZGVzIHJvdXRpbmVzLiAgVHdlYWtlZCB0aGluZ3MgYSBiaXQgZWxzZXdoZXJlLiAlMTMgc3BlZWR1cCBvbgorCXNwYXJjIGFuZCAlNiBvbiBhIFI0NDAwIGZvciBlZGUzIGNiYyBtb2RlLgorCitWZXJzaW9uIDMuMTUgMDYvMDYvOTUKKwlBZGRlZCBkZXNfbmNiY19lbmNyeXB0KCksIGl0IGlzIGRlc19jYmMgbW9kZSBleGNlcHQgdGhhdCBpdCBpcworCSdub3JtYWwnIGFuZCBjb3BpZXMgdGhlIG5ldyBpdiB2YWx1ZSBiYWNrIG92ZXIgdGhlIHRvcCBvZiB0aGUKKwlwYXNzZWQgcGFyYW1ldGVyLgorCUNIQU5HRUQgZGVzX2VkZTNfY2JjX2VuY3J5cHQoKSBzbyB0aGF0IGl0IHRvbyBub3cgb3ZlcndyaXRlcworCXRoZSBpdi4gIFRISVMgV0lMTCBCUkVBSyBFWElTVElORyBDT0RFLCBidXQgc2luY2UgdGhpcyBmdW5jdGlvbgorCW9ubHkgbmV3LCBJIGZlZWwgSSBjYW4gY2hhbmdlIGl0LCBub3Qgc28gd2l0aCBkZXNfY2JjX2VuY3J5cHQgOi0oLgorCUkgbmVlZCB0byB1cGRhdGUgdGhlIGRvY3VtZW50YXRpb24uCisKK1ZlcnNpb24gMy4xNCAzMS8wNS85NQorCU5ldyByZWxlYXNlIHVwb24gdGhlIHdvcmxkLCBhcyBwYXJ0IG9mIG15IFNTTCBpbXBsZW1lbnRhdGlvbi4KKwlOZXcgY29weXJpZ2h0IGFuZCB1c2FnZSBzdHVmZi4gIEJhc2ljYWxseSBmcmVlIGZvciBhbGwgdG8gdXNlCisJYXMgbG9uZyBhcyB5b3Ugc2F5IGl0IGNhbWUgZnJvbSBtZSA6LSkKKworVmVyc2lvbiAzLjEzIDMxLzA1Lzk1CisJQSBmaXggaW4gc3BlZWQuYywgaWYgSFogaXMgbm90IGRlZmluZWQsIEkgc2V0IGl0IHRvIDEwMC4wCisJd2hpY2ggaXMgcmVhc29uYWJsZSBmb3IgbW9zdCB1bml4ZXMgZXhjZXB0IFN1bk9TIDQueC4KKwlJIG5vdyBoYXZlIGEgI2lmZGVmIHN1biBidXQgdGltaW5nIGZvciBTdW5PUyA0LnggbG9va2VkIHZlcnkKKwlnb29kIDotKC4gIEF0IG15IGxhc3Qgam9iIHdoZXJlIEkgdXNlZCBTdW5PUyA0LngsIGl0IHdhcworCWRlZmluZWQgdG8gYmUgNjAuMCAobG9vayBhdCB0aGUgb2xkIElOU1RBTEwgZG9jdW1lbnRhdGlvbiksIGF0CisJdGhlIGxhc3QgcmVsZWFzZSBoYWQgaXQgY2hhbmdlZCB0byAxMDAuMCBzaW5jZSBJIG5vdyB3b3JrIHdpdGgKKwlTb2xhcmlzMiBhbmQgU1ZSNCBib3hlcy4KKwlUaGFua3MgdG8gIFJvcnkgQ2hpc2hvbG0gPHJjaGlzaG9sQG1hdGguZXRoei5jaD4gZm9yIHBvaW50aW5nIHRoaXMKKwlvbmUgb3V0LgorCitWZXJzaW9uIDMuMTIgMDgvMDUvOTUKKwlBcyBwb2ludGVkIG91dCBieSBUaGUgQ3J5cHQgS2VlcGVyIDx0Y2tAYmVuZC5VQ1NELkVEVT4sCisJbXkgRF9FTkNSWVBUIG1hY3JvIGluIGNyeXB0KCkgaGFkIGFuIHVuLW5lY2Vzc2FyeSB2YXJpYWJsZS4KKwlJdCBoYXMgYmVlbiByZW1vdmVkLgorCitWZXJzaW9uIDMuMTEgMDMvMDUvOTUKKwlBZGRlZCBkZXNfZWRlM19jYmNfZW5jcnlwdCgpIHdoaWNoIGlzIGNiYyBtb2RlIGRlcyB3aXRoIDMga2V5cworCWFuZCBvbmUgaXYuICBJdCBpcyBhIHN0YW5kYXJkIGFuZCBJIG5lZWRlZCBpdCBmb3IgbXkgU1NMIGNvZGUuCisJSXQgbWFrZXMgbW9yZSBzZW5zZSB0byB1c2UgdGhpcyBmb3IgdHJpcGxlIERFUyB0aGFuCisJM2NiY19lbmNyeXB0KCkuICBJIGhhdmUgYWxzbyBhZGRlZCAob3Igc2hvdWxkIEkgc2F5IHRlc3RlZCA6LSkKKwljZmI2NF9lbmNyeXB0KCkgd2hpY2ggaXMgY2ZiNjQgYnV0IGl0IHdpbGwgZW5jcnlwdCBhIHBhcnRpYWwKKwludW1iZXIgb2YgYnl0ZXMgLSAzIGJ5dGVzIGluIDMgYnl0ZXMgb3V0LiAgQWdhaW4gdGhpcyBpcyBmb3IKKwlteSBTU0wgbGlicmFyeSwgYXMgYSBmb3JtIG9mIGVuY3J5cHRpb24gdG8gdXNlIHdpdGggU1NMCisJdGVsbmV0LgorCitWZXJzaW9uIDMuMTAgMjIvMDMvOTUKKwlGaXhlZCBhIGJ1ZyBpbiAzY2JjX2VuY3J5cHQoKSA6LSguICBXaGVuIG1ha2luZyByZXBlYXRlZCBjYWxscworCXRvIGNiYzNfZW5jcnlwdCwgdGhlIDIgaXYgdmFsdWVzIHRoYXQgd2VyZSBiZWluZyByZXR1cm5lZCB0bworCWJlIHVzZWQgaW4gdGhlIG5leHQgY2FsbCB3ZXJlIHJldmVyc2VkIDotKC4KKwlNYW55IHRoYW5rcyB0byBCaWxsIFdhZGUgPHdhZGVAU3RvbmVyLkNPTT4gZm9yIHBvaW50aW5nIG91dAorCXRoaXMgZXJyb3IuCisKK1ZlcnNpb24gMy4wOSAwMS8wMi85NQorCUZpeGVkIGRlc19yYW5kb21fa2V5IHRvIGZhciBtb3JlIHJhbmRvbSwgaXQgd2FzIHJhdGhlciBmZWVibGUKKwl3aXRoIHJlZ2FyZHMgdG8gcGlja2luZyB0aGUgaW5pdGlhbCBzZWVkLiAgVGhlIHByb2JsZW0gd2FzCisJcG9pbnRlZCBvdXQgYnkgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+LgorCitWZXJzaW9uIDMuMDggMTQvMTIvOTQKKwlBZGRlZCBNYWtlZmlsZS5QTCBzbyBsaWJkZXMgY2FuIGJlIGJ1aWx0IGludG8gcGVybDUuCisJQ2hhbmdlZCBkZXNfbG9jbC5oIHNvIFJBTkQgaXMgYWx3YXlzIGRlZmluZWQuCisKK1ZlcnNpb24gMy4wNyAwNS8xMi85NAorCUFkZGVkIEdOVW1ha2UgYW5kIHN0dWZmIHNvIHRoZSBsaWJyYXJ5IGNhbiBiZSBidWlsZCB3aXRoCisJZ2xpYmMuCisKK1ZlcnNpb24gMy4wNiAzMC8wOC85NAorCUFkZGVkIHJwY19lbmMuYyB3aGljaCBjb250YWlucyBfZGVzX2NyeXB0LiAgVGhpcyBpcyBmb3IgdXNlIGluCisJc2VjdXJlX3JwYyB2IDQuMAorCUZpbmFsbHkgZml4ZWQgdGhlIGNmYl9lbmMgcHJvYmxlbXMuCisJRml4ZWQgYSBmZXcgcGFyYW1ldGVyIHBhcnNpbmcgYnVncyBpbiBkZXMgKC0zIGFuZCAtYiksIHRoYW5rcworCXRvIFJvYiBNY01pbGxhbiA8Ui5NY01pbGxhbkBpdHMuZ3UuZWR1LmF1PgorCitWZXJzaW9uIDMuMDUgMjEvMDQvOTQKKwlmb3IgdW5zaWduZWQgbG9uZyBsOyBnY2MgZG9lcyBub3QgcHJvZHVjZSAoKGw+PjM0KSA9PSAwKQorCVRoaXMgY2F1c2VzIGJ1Z3MgaW4gY2ZiX2VuYy4KKwlUaGFua3MgdG8gSGFkbXV0IERhbmlzY2ggPGRhbmlzY2hAaXJhLnVrYS5kZT4KKworVmVyc2lvbiAzLjA0IDIwLzA0Lzk0CisJQWRkZWQgYSB2ZXJzaW9uIG51bWJlciB0byBkZXMuYyBhbmQgbGliZGVzLmEKKworVmVyc2lvbiAzLjAzIDEyLzAxLzk0CisJRml4ZWQgYSBidWcgaW4gbm9uIHplcm8gaXYgaW4gM2NiY19lbmMuCisKK1ZlcnNpb24gMy4wMiAyOS8xMC85MworCUkgbm93IHdvcmsgaW4gYSBwbGFjZSB3aGVyZSB0aGVyZSBhcmUgNisgYXJjaGl0ZWN0dXJlcyBhbmQgMTQrCisJT1MgdmVyc2lvbnMgOi0pLgorCUZpeGVkIFRFUk1JTyBkZWZpbml0aW9uIHNvIHRoZSBtb3N0IHN5cyBWIGJveGVzIHdpbGwgd29yayA6LSkKKworUmVsZWFzZSB1cG9uIGNvbXAuc291cmNlcy5taXNjCitWZXJzaW9uIDMuMDEgMDgvMTAvOTMKKwlBZGRlZCBkZXNfM2NiY19lbmNyeXB0KCkKKworVmVyc2lvbiAzLjAwIDA3LzEwLzkzCisJRml4ZWQgdXAgZG9jdW1lbnRhdGlvbi4KKwlxdWFkX2Nrc3VtIGRlZmluaXRlbHkgY29tcGF0aWJsZSB3aXRoIE1JVCdzIG5vdy4KKworVmVyc2lvbiAyLjMwIDI0LzA4LzkzCisJVHJpcGxlIERFUyBub3cgZGVmYXVsdHMgdG8gdHJpcGxlIGNiYyBidXQgY2FuIGRvIHRyaXBsZSBlY2IKKwkgd2l0aCB0aGUgLWIgZmxhZy4KKwlGaXhlZCBzb21lIE1TRE9TIHV1ZW4vdXVkZWNvZGluZyBwcm9ibGVtcywgdGhhbmtzIHRvCisJQWRkZWQgcHJvdG90eXBlcy4KKwkKK1ZlcnNpb24gMi4yMiAyOS8wNi85MworCUZpeGVkIGEgYnVnIGluIGRlc19pc193ZWFrX2tleSgpIHdoaWNoIHN0b3BwZWQgaXQgd29ya2luZyA6LSgKKwl0aGFua3MgdG8gZW5naW5lZXJpbmdATW9ybmluZ1N0YXIuQ29tLgorCitWZXJzaW9uIDIuMjEgMDMvMDYvOTMKKwlkZXMoMSkgd2l0aCBubyBhcmd1bWVudHMgZ2l2ZXMgcXVpdGUgYSBiaXQgb2YgaGVscC4KKwlBZGRlZCAtYyAoZ2VuZXJhdGUgY2tlY2tzdW0pIGZsYWcgdG8gZGVzKDEpLgorCUFkZGVkIC0zICh0cmlwbGUgREVTKSBmbGFnIHRvIGRlcygxKS4KKwlBZGRlZCBjZmIgYW5kIG9mYiByb3V0aW5lcyB0byB0aGUgbGlicmFyeS4KKworVmVyc2lvbiAyLjIwIDExLzAzLzkzCisJQWRkZWQgLXUgKHV1ZW5jb2RlKSBmbGFnIHRvIGRlcygxKS4KKwlJIGhhdmUgYmVlbiBwbGF5aW5nIHdpdGggYnl0ZSBvcmRlciBpbiBxdWFkX2Nrc3VtIHRvIG1ha2UgaXQKKwkgY29tcGF0aWJsZSB3aXRoIE1JVCdzIHZlcnNpb24uICBBbGwgSSBjYW4gc2F5IGlzIGF2aWQgdGhpcworCSBmdW5jdGlvbiBpZiBwb3NzaWJsZSBzaW5jZSBNSVQncyBvdXRwdXQgaXMgZW5kaWFuIGRlcGVuZGVudC4KKworVmVyc2lvbiAyLjEyIDE0LzEwLzkyCisJQWRkZWQgTVNET1Mgc3BlY2lmaWMgbWFjcm8gaW4gZWNiX2VuY3J5cHQgd2hpY2ggZ2l2ZXMgYSAlNzAKKwkgc3BlZWQgdXAgd2hlbiB0aGUgY29kZSBpcyBjb21waWxlZCB3aXRoIHR1cmJvIEMuCisKK1ZlcnNpb24gMi4xMSAxMi8xMC85MgorCVNwZWVkdXAgaW4gc2V0X2tleSAocmVjb2Rpbmcgb2YgUEMtMSkKKwkgSSBub3cgZG8gaXQgaW4gNDcgc2ltcGxlIG9wZXJhdGlvbnMsIGRvd24gZnJvbSA2MC4KKwkgVGhhbmtzIHRvIEpvaG4gRmxldGNoZXIgKGpvaG5fZmxldGNoZXJAbGNjbWFpbC5vY2YubGxubC5nb3YpCisJIGZvciBtb3RpdmF0aW5nIG1lIHRvIGxvb2sgZm9yIGEgZmFzdGVyIHN5c3RlbSA6LSkKKwkgVGhlIHNwZWVkdXAgaXMgcHJvYmFibHkgbGVzcyB0aGF0IDElIGJ1dCBpdCBpcyBzdGlsbCAxMworCSBpbnN0cnVjdGlvbnMgbGVzcyA6LSkuCisKK1ZlcnNpb24gMi4xMCAwNi8xMC85MgorCVRoZSBjb2RlIG5vdyB3b3JrcyBvbiB0aGUgNjRiaXQgRVRBMTAgYW5kIENSQVkgd2l0aG91dCBtb2RpZmljYXRpb25zIG9yCisJICNkZWZpbmVzLiAgSSBiZWxpZXZlIHRoZSBjb2RlIHNob3VsZCB3b3JrIG9uIGFueSBtYWNoaW5lIHRoYXQKKwkgZGVmaW5lcyBsb25nLCBpbnQgb3Igc2hvcnQgdG8gYmUgOCBieXRlcyBsb25nLgorCVRoYW5rcyB0byBTaGFiYmlyIEouIFNhZmRhciAoc2hhYmJ5QG1lbnRvci5jYy5wdXJkdWUuZWR1KQorCSBmb3IgaGVscGluZyBtZSBmaXggdGhlIGNvZGUgdG8gcnVuIG9uIDY0Yml0IG1hY2hpbmVzIChoZSBoYWQKKwkgYWNjZXNzIHRvIGFuIEVUQTEwKS4KKwlUaGFua3MgYWxzbyB0byBKb2huIEZsZXRjaGVyIDxqb2huX2ZsZXRjaGVyQGxjY21haWwub2NmLmxsbmwuZ292PgorCSBmb3IgdGVzdGluZyB0aGUgcm91dGluZXMgb24gYSBDUkFZLgorCXJlYWRfcGFzc3dvcmQuYyBoYXMgYmVlbiByZW5hbWVkIHRvIHJlYWRfcGFzc3dkLmMKKwlzdHJpbmdfdG9fa2V5LmMgaGFzIGJlZW4gcmVuYW1lZCB0byBzdHJpbmcya2V5LmMKKworVmVyc2lvbiAyLjAwIDE0LzA5LzkyCisJTWFkZSBtb2RzIHNvIHRoYXQgdGhlIGxpYnJhcnkgc2hvdWxkIHdvcmsgb24gNjRiaXQgQ1BVJ3MuCisJUmVtb3ZlZCBhbGwgbXkgdWNoYXIgYW5kIHVsb25nIGRlZnMuICBUbyBtYW55IGRpZmZlcmVudAorCSB2ZXJzaW9ucyBvZiB1bml4IGRlZmluZSB0aGVtIGluIHRoZWlyIGhlYWRlciBmaWxlcyBpbiB0b28gbWFueQorCSBkaWZmZXJlbnQgY29tYmluYXRpb25zIDotKQorCUlSSVggLSBTaWxsaWNvbiBHcmFwaGljcyBtb2RzIChtb3N0bHkgaW4gcmVhZF9wYXNzd29yZC5jKS4KKwkgVGhhbmtzIHRvIEFuZHJldyBEYXZpZWwgKGFkdmF4QGVyaWNoLnRyaXVtZi5jYSkKKworVmVyc2lvbiAxLjk5IDI2LzA4LzkyCisJRml4ZWQgYSBidWcgb3IgMiBpbiBlbmNfcmVhZC5jCisJRml4ZWQgYSBidWcgaW4gZW5jX3dyaXRlLmMKKwlGaXhlZCBhIHBzZXVkbyBidWcgaW4gZmNyeXB0LmMgKHZlcnkgb2JzY3VyZSkuCisKK1ZlcnNpb24gMS45OCAzMS8wNy85MgorCVN1cHBvcnQgZm9yIHRoZSBFVEExMC4gIFRoaXMgaXMgYSBzdHJhbmdlIG1hY2hpbmUgdGhhdCBkZWZpbmVzCisJbG9uZ3MgYW5kIGludHMgYXMgOCBieXRlcyBhbmQgc2hvcnRzIGFzIDQgYnl0ZXMuCisJU2luY2UgSSBkbyBldmlsIHRoaW5ncyB3aXRoIGxvbmcgKiB0aGF0IGFzc3VtZSB0aGF0IHRoZXkgYXJlIDQKKwlieXRlcy4gIExvb2sgaW4gdGhlIE1ha2VmaWxlIGZvciB0aGUgb3B0aW9uIHRvIGNvbXBpbGUgZm9yCisJdGhpcyBtYWNoaW5lLiAgcXVhZF9ja3N1bSBhcHBlYXJzIHRvIGhhdmUgcHJvYmxlbXMgYnV0IEkKKwl3aWxsIGRvbid0IGhhdmUgdGhlIHRpbWUgdG8gZml4IGl0IHJpZ2h0IG5vdywgYW5kIHRoaXMgaXMgbm90CisJYSBmdW5jdGlvbiB0aGF0IHVzZXMgREVTIGFuZCBzbyB3aWxsIG5vdCBlZmZlY3QgdGhlIG1haW4gdXNlcworCW9mIHRoZSBsaWJyYXJ5LgorCitWZXJzaW9uIDEuOTcgMjAvMDUvOTIgZWF5CisJRml4ZWQgdGhlIEltYWtlZmlsZSBhbmQgbWFkZSBzb21lIGNoYW5nZXMgdG8gZGVzLmggdG8gZml4IHNvbWUKKwlwcm9ibGVtcyB3aGVuIGJ1aWxkaW5nIHRoaXMgcGFja2FnZSB3aXRoIEtlcmJlcm9zIHYgNC4KKworVmVyc2lvbiAxLjk2IDE4LzA1LzkyIGVheQorCUZpeGVkIGEgc21hbGwgYnVnIGluIHN0cmluZ190b19rZXkoKSB3aGVyZSBwcm9ibGVtcyBjb3VsZAorCW9jY3VyIGlmIGRlc19jaGVja19rZXkgd2FzIHNldCB0byB0cnVlIGFuZCB0aGUgc3RyaW5nCisJZ2VuZXJhdGVkIGEgd2VhayBrZXkuCisKK1BhdGNoMiBwb3N0ZWQgdG8gY29tcC5zb3VyY2VzLm1pc2MKK1ZlcnNpb24gMS45NSAxMy8wNS85MiBlYXkKKwlBZGRlZCBhbiBhbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIHRoZSBEX0VOQ1JZUFQgbWFjcm8gaW4KKwllY2JfZW5jcnlwdCBhbmQgZmNyeXB0LiAgRGVwZW5kaW5nIG9uIHRoZSBjb21waWxlciwgb25lIHZlcnNpb24gb3IgdGhlCisJb3RoZXIgd2lsbCBiZSBmYXN0ZXIuICBUaGlzIHdhcyBpbnNwaXJlZCBieSAKKwlEYW5hIEhvdyA8aG93QGlzbC5zdGFuZm9yZC5lZHU+LCBhbmQgaGVyIHBvaW50ZXJzIGFib3V0IGRvaW5nIHRoZQorCSoodWxvbmcgKikoKHVjaGFyICopcHRyKyh2YWx1ZSYweGZjKSkKKwl2cworCXB0clt2YWx1ZSYweDNmXQorCXRvIHN0b3AgdGhlIEMgY29tcGlsZXIgZG9pbmcgYSA8PDIgdG8gY29udmVydCB0aGUgbG9uZyBhcnJheSBpbmRleC4KKworVmVyc2lvbiAxLjk0IDA1LzA1LzkyIGVheQorCUZpeGVkIGFuIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIG15IHN0cmluZ190b19rZXkgYW5kIHRoZSBNSVQKKwkgdmVyc2lvbi4gIFdoZW4gdGhlIGtleSBpcyBsb25nZXIgdGhhbiA4IGNoYXJzLCBJIHdhcyB3cmFwcGluZworCSB3aXRoIGEgZGlmZmVyZW50IG1ldGhvZC4gIFRvIHVzZSB0aGUgb2xkIHZlcnNpb24sIGRlZmluZQorCSBPTERfU1RSX1RPX0tFWSBpbiB0aGUgbWFrZWZpbGUuICBUaGFua3MgdG8KKwkgdmlrdG9yQG5ld3N1LnNoZWFyc29uLmNvbSAoVmlrdG9yIER1a2hvdm5pKS4KKworVmVyc2lvbiAxLjkzIDI4LzA0LzkyIGVheQorCUZpeGVkIHRoZSBWTVMgbW9kcyBzbyB0aGF0IGVjaG8gaXMgbm93IHR1cm5lZCBvZmYgaW4KKwkgcmVhZF9wYXNzd29yZC4gIFRoYW5rcyBhZ2FpbiB0byBicmVubmFuQGNvY28uY2Nocy5zdS5vei5BVS4KKwlNU0RPUyBzdXBwb3J0IGFkZGVkLiAgVGhlIHJvdXRpbmVzIGNhbiBiZSBjb21waWxlZCB3aXRoCisJIFR1cmJvIEMgKHYyLjApIGFuZCBNU0MgKHY1LjEpLiAgTWFrZSBzdXJlIE1TRE9TIGlzIGRlZmluZWQuCisKK1BhdGNoMSBwb3N0ZWQgdG8gY29tcC5zb3VyY2VzLm1pc2MKK1ZlcnNpb24gMS45MiAxMy8wNC85MiBlYXkKKwlDaGFuZ2VkIERfRU5DUllQVCBzbyB0aGF0IHRoZSByb3RhdGlvbiBvZiBSIG9jY3VycyBvdXRzaWRlIG9mCisJIHRoZSBsb29wLiAgVGhpcyByZXF1aXJlZCByb3RhdGluZyBhbGwgdGhlIGxvbmdzIGluIHNwLmggKG5vdworCSBjYWxsZWQgc3ByLmgpLiBUaGFua3MgdG8gUmljaGFyZCBPdXRlcmJyaWRnZSA8NzE3NTUuMjA0QENvbXB1U2VydmUuQ09NPgorCXNwZWVkLmMgaGFzIGJlZW4gY2hhbmdlZCBzbyBpdCB3aWxsIHdvcmsgd2l0aG91dCBTSUdBTFJNLiAgSWYKKwkgdGltZXMoMykgaXMgbm90IHByZXNlbnQgaXQgd2lsbCB0cnkgdG8gdXNlIGZ0aW1lKCkgaW5zdGVhZC4KKworVmVyc2lvbiAxLjkxIDA4LzA0LzkyIGVheQorCUFkZGVkIC1FLy1EIG9wdGlvbnMgdG8gZGVzKDEpIHNvIGl0IGNhbiB1c2Ugc3RyaW5nX3RvX2tleS4KKwlBZGRlZCBTVlI0IG1vZHMgc3VnZ2VzdGVkIGJ5IHdpdHJAcnd3YS5DT00KKwlBZGRlZCBWTVMgbW9kcyBzdWdnZXN0ZWQgYnkgYnJlbm5hbkBjb2NvLmNjaHMuc3Uub3ouQVUuICBJZgorCWFueW9uZSBrbm93cyBob3cgdG8gdHVybiBvZiB0dHkgZWNobyBpbiBWTVMgcGxlYXNlIHRlbGwgbWUgb3IKKwlpbXBsZW1lbnQgaXQgeW91cnNlbGYgOi0pLgorCUNoYW5nZWQgRklMRSAqSU4vKk9VVCB0byAqREVTX0lOLypERVNfT1VUIHNpbmNlIGl0IGFwcGVhcnMgVk1TCisJZG9lcyBub3QgbGlrZSBJTi9PVVQgYmVpbmcgdXNlZC4KKworTGliZGVzIHBvc3RlZCB0byBjb21wLnNvdXJjZXMubWlzYworVmVyc2lvbiAxLjkgMjQvMDMvOTIgZWF5CisJTm93IGNvbnRhaW5zIGEgZmFzdCBzbWFsbCBjcnlwdCByZXBsYWNlbWVudC4KKwlBZGRlZCBkZXMoMSkgY29tbWFuZC4KKwlBZGRlZCBkZXNfcndfbW9kZSBzbyBwZW9wbGUgY2FuIHVzZSBjYmMgZW5jcnlwdGlvbiB3aXRoCisJZW5jX3JlYWQgYW5kIGVuY193cml0ZS4KKworVmVyc2lvbiAxLjggMTUvMTAvOTEgZWF5CisJQnVnIGluIGNiY19ja3N1bS4KKwlNYW55IHRoYW5rcyB0byBLZWl0aCBSZXlub2xkcyAoa2VpdGhyQHNjby5DT00pIGZvciBwb2ludGluZyB0aGlzCisJb25lIG91dC4KKworVmVyc2lvbiAxLjcgMjQvMDkvOTEgZWF5CisJRml4ZWQgc2V0X2tleSA6LSkKKwlzZXRfa2V5IGlzIDQgdGltZXMgZmFzdGVyIGFuZCB0YWtlcyBsZXNzIHNwYWNlLgorCVRoZXJlIGFyZSBhIGZldyBtaW5vciBjaGFuZ2VzIHRoYXQgY291bGQgYmUgbWFkZS4KKworVmVyc2lvbiAxLjYgMTkvMDkvMTk5MSBlYXkKKwlGaW5hbGx5IGdvIElQIGFuZCBGUCBmaW5pc2hlZC4KKwlOb3cgSSBuZWVkIHRvIGZpeCBzZXRfa2V5LgorCVRoaXMgdmVyc2lvbiBpcyBxdWl0ZSBhIGJpdCBmYXN0ZXIgdGhhdCAxLjUxCisKK1ZlcnNpb24gMS41MiAxNS8wNi8xOTkxIGVheQorCTIwJSBzcGVlZHVwIGluIGVjYl9lbmNyeXB0IGJ5IGNoYW5naW5nIHRoZSBFIGJpdCBzZWxlY3Rpb24KKwl0byB1c2UgMiAzMmJpdCB3b3Jkcy4gIFRoaXMgYWxzbyByZXF1aXJlZCBtb2RpZmljYXRpb24gb2YgdGhlCisJc3AgdGFibGUuICBUaGVyZSBpcyBzdGlsbCBhIHdheSB0byBzcGVlZHVwIHRoZSBJUCBhbmQgSVAtMQorCShoaW50cyBmcm9tIG91dGVyQHNxLmNvbSkgc3RpbGwgd29ya2luZyBvbiB0aGlzIG9uZSA6LSguCisKK1ZlcnNpb24gMS41MSAwNy8wNi8xOTkxIGVheQorCUZhc3RlciBkZXNfZW5jcnlwdCBieSBsb29wIHVucm9sbGluZworCUZpeGVkIGJ1ZyBpbiBxdWFkX2Nrc3VtLmMgKHRoYW5rcyB0byBodWdoZXNAbG9nb3MudWNzLmluZGlhbmEuZWR1KQorCitWZXJzaW9uIDEuNTAgMjgvMDUvMTk5MSBlYXkKKwlPcHRpbWlzZWQgdGhlIGNvZGUgYSBiaXQgbW9yZSBmb3IgdGhlIHNwYXJjLiAgSSBoYXZlIGltcHJvdmVkIHRoZQorCXNwZWVkIG9mIHRoZSBpbm5lciBkZXNfZW5jcnlwdCBieSBzcGVlZGluZyB1cCB0aGUgaW5pdGlhbCBhbmQKKwlmaW5hbCBwZXJtdXRhdGlvbnMuCisKK1ZlcnNpb24gMS40MCAyMy8xMC8xOTkwIGVheQorCUZpeGVkIGRlc19yYW5kb21fa2V5LCBpdCBkaWQgbm90IHByb2R1Y2UgYSByYW5kb20ga2V5IDotKAorCitWZXJzaW9uIDEuMzAgIDIvMTAvMTk5MCBlYXkKKwlIYXZlIG1hZGUgZGVzX3F1YWRfY2tzdW0gdGhlIHNhbWUgYXMgTUlUJ3MsIHRoZSBmdWxsIHBhY2thZ2UKKwlzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIE1JVCdzCisJSGF2ZSB0ZXN0ZWQgb24gYSBERUNzdGF0aW9uIDMxMDAKKwlTdGlsbCBuZWVkIHRvIGZpeCBkZXNfc2V0X2tleSAobWFrZSBpdCBmYXN0ZXIpLgorCURvZXMgZGVzX2NiY19lbmNyeXB0cyBhdCA3MC41ay9zZWMgb24gYSAzMTAwLgorCitWZXJzaW9uIDEuMjAgMTgvMDkvMTk5MCBlYXkKKwlGaXhlZCBieXRlIG9yZGVyIGRlcGVuZGVuY2llcy4KKwlGaXhlZCAoSSBob3BlKSBhbGwgdGhlIHdvcmQgYWxpZ25tZW50IHByb2JsZW1zLgorCVNwZWVkdXAgaW4gZGVzX2VjYl9lbmNyeXB0LgorCitWZXJzaW9uIDEuMTAgMTEvMDkvMTk5MCBlYXkKKwlBZGRlZCBkZXNfZW5jX3JlYWQgYW5kIGRlc19lbmNfd3JpdGUuCisJU3RpbGwgbmVlZCB0byBmaXggZGVzX3F1YWRfY2tzdW0uCisJU3RpbGwgbmVlZCB0byBkb2N1bWVudCBkZXNfZW5jX3JlYWQgYW5kIGRlc19lbmNfd3JpdGUuCisKK1ZlcnNpb24gMS4wMCAyNy8wOC8xOTkwIGVheQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2FzbS9jcnlwdDU4Ni5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvYXNtL2NyeXB0NTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmY3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2FzbS9jcnlwdDU4Ni5wbApAQCAtMCwwICsxLDIwOSBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisjCisjIFRoZSBpbm5lciBsb29wIGluc3RydWN0aW9uIHNlcXVlbmNlIGFuZCB0aGUgSVAvRlAgbW9kaWZpY2F0aW9ucyBhcmUgZnJvbQorIyBTdmVuZCBPbGFmIE1pa2tlbHNlbiA8c3ZvbGFmQGluZXQudW5pLWMuZGs+CisjIEkndmUgYWRkZWQgdGhlIHN0dWZmIG5lZWRlZCBmb3IgY3J5cHQoKSBidXQgSSd2ZSBub3Qgd29ycmllZCBhYm91dCBtYWtpbmcKKyMgdGhpbmdzIHBlcmZlY3QuCisjCisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwiY3J5cHQ1ODYucGwiKTsKKworJEw9ImVkaSI7CiskUj0iZXNpIjsKKworJmV4dGVybmFsX2xhYmVsKCJERVNfU1B0cmFucyIpOworJmZjcnlwdF9ib2R5KCJmY3J5cHRfYm9keSIpOworJmFzbV9maW5pc2goKTsKKworc3ViIGZjcnlwdF9ib2R5CisJeworCWxvY2FsKCRuYW1lLCRkb19pcCk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW4oJG5hbWUpOworCisJJmNvbW1lbnQoIiIpOworCSZjb21tZW50KCJMb2FkIHRoZSAyIHdvcmRzIik7CisJJHRyYW5zPSJlYnAiOworCisJJnhvcigJJEwsCSRMKTsKKwkmeG9yKAkkUiwJJFIpOworCisJIyBQSUMtaWZpY2F0aW9uOi0pCisJJnBpY21ldXAoImVkeCIsIkRFU19TUHRyYW5zIik7CisJI2lmICgkY3BwKQl7ICZwaWNtZXVwKCJlZHgiLCJERVNfU1B0cmFucyIpOyAgIH0KKwkjZWxzZQkJeyAmbGVhKCJlZHgiLCZEV1AoIkRFU19TUHRyYW5zIikpOyB9CisJJnB1c2goImVkeCIpOwkjIGJlY29tZXMgJnN3dG1wKDEpCisJIworCSZtb3YoJHRyYW5zLCZ3cGFyYW0oMSkpOyAjIHJlbG9hZGVkIHdpdGggREVTX1NQdHJhbnMgaW4gRF9FTkNSWVBUCisKKwkmcHVzaCgmRFdDKDI1KSk7ICMgYWRkIGEgdmFyaWFibGUKKworCSZzZXRfbGFiZWwoInN0YXJ0Iik7CisJZm9yICgkaT0wOyAkaTwxNjsgJGkrPTIpCisJCXsKKwkJJmNvbW1lbnQoIiIpOworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKwkJJkRfRU5DUllQVCgkaSwkTCwkUiwkaSoyLCR0cmFucywiZWF4IiwiZWJ4IiwiZWN4IiwiZWR4Iik7CisKKwkJJmNvbW1lbnQoIiIpOworCQkmY29tbWVudCgiUm91bmQgIi5zcHJpbnRmKCIlZCIsJGkrMSkpOworCQkmRF9FTkNSWVBUKCRpKzEsJFIsJEwsKCRpKzEpKjIsJHRyYW5zLCJlYXgiLCJlYngiLCJlY3giLCJlZHgiKTsKKwkJfQorCSAmbW92KCJlYngiLAkmc3d0bXAoMCkpOworCSZtb3YoImVheCIsCSRMKTsKKwkgJmRlYygiZWJ4Iik7CisJJm1vdigkTCwJJFIpOworCSAmbW92KCRSLAkiZWF4Iik7CisJJm1vdigmc3d0bXAoMCksCSJlYngiKTsKKwkgJmpueigmbGFiZWwoInN0YXJ0IikpOworCisJJmNvbW1lbnQoIiIpOworCSZjb21tZW50KCJGUCIpOworCSZtb3YoImVkeCIsJndwYXJhbSgwKSk7CisKKwkmRlBfbmV3KCRSLCRMLCJlYXgiLDMpOworCSZtb3YoJkRXUCgwLCJlZHgiLCIiLDApLCJlYXgiKTsKKwkmbW92KCZEV1AoNCwiZWR4IiwiIiwwKSwkTCk7CisKKwkmYWRkKCJlc3AiLDgpOwkjIHJlbW92ZSB2YXJpYWJsZXMKKworCSZmdW5jdGlvbl9lbmQoJG5hbWUpOworCX0KKworc3ViIERfRU5DUllQVAorCXsKKwlsb2NhbCgkciwkTCwkUiwkUywkdHJhbnMsJHUsJHRtcDEsJHRtcDIsJHQpPUBfOworCisJJm1vdigJJHUsCQkmd3BhcmFtKDIpKTsJCQkjIDIKKwkmbW92KAkkdCwJCSRSKTsKKwkmc2hyKAkkdCwJCTE2KTsJCQkJIyAxCisJJm1vdigJJHRtcDIsCQkmd3BhcmFtKDMpKTsJCQkjIDIKKwkmeG9yKAkkdCwJCSRSKTsJCQkJIyAxCisKKwkmYW5kKAkkdSwJCSR0KTsJCQkJIyAyCisJJmFuZCgJJHQsCQkkdG1wMik7CQkJCSMgMgorCisJJm1vdigJJHRtcDEsCQkkdSk7CisJJnNobCgJJHRtcDEsCQkxNik7IAkJCQkjIDEKKwkmbW92KAkkdG1wMiwJCSR0KTsKKwkmc2hsKAkkdG1wMiwJCTE2KTsgCQkJCSMgMQorCSZ4b3IoCSR1LAkJJHRtcDEpOwkJCQkjIDIKKwkmeG9yKAkkdCwJCSR0bXAyKTsJCQkJIyAyCisJJm1vdigJJHRtcDEsCQkmRFdQKCZuMmEoJFMqNCksJHRyYW5zLCIiLDApKTsJIyAyCisJJnhvcigJJHUsCQkkdG1wMSk7CisJJm1vdigJJHRtcDIsCQkmRFdQKCZuMmEoKCRTKzEpKjQpLCR0cmFucywiIiwwKSk7CSMgMgorCSZ4b3IoCSR1LAkJJFIpOworCSZ4b3IoCSR0LAkJJFIpOworCSZ4b3IoCSR0LAkJJHRtcDIpOworCisJJmFuZCgJJHUsCQkiMHhmY2ZjZmNmYyIJKTsJCSMgMgorCSZ4b3IoCSR0bXAxLAkJJHRtcDEpOwkJCQkjIDEKKwkmYW5kKAkkdCwJCSIweGNmY2ZjZmNmIgkpOwkJIyAyCisJJnhvcigJJHRtcDIsCQkkdG1wMik7CQorCSZtb3ZiKAkmTEIoJHRtcDEpLAkmTEIoJHUpCSk7CisJJm1vdmIoCSZMQigkdG1wMiksCSZIQigkdSkJKTsKKwkmcm90cigJJHQsCQk0CQkpOworCSZtb3YoCSR0cmFucywJCSZzd3RtcCgxKSk7CisJJnhvcigJJEwsCQkmRFdQKCIgICAgICIsJHRyYW5zLCR0bXAxLDApKTsKKwkmbW92YigJJkxCKCR0bXAxKSwJJkxCKCR0KQkpOworCSZ4b3IoCSRMLAkJJkRXUCgiMHgyMDAiLCR0cmFucywkdG1wMiwwKSk7CisJJm1vdmIoCSZMQigkdG1wMiksCSZIQigkdCkJKTsKKwkmc2hyKAkkdSwJCTE2KTsKKwkmeG9yKAkkTCwJCSZEV1AoIjB4MTAwIiwkdHJhbnMsJHRtcDEsMCkpOworCSZtb3ZiKAkmTEIoJHRtcDEpLAkmSEIoJHUpCSk7CisJJnNocigJJHQsCQkxNik7CisJJnhvcigJJEwsCQkmRFdQKCIweDMwMCIsJHRyYW5zLCR0bXAyLDApKTsKKwkmbW92YigJJkxCKCR0bXAyKSwJJkhCKCR0KQkpOworCSZhbmQoCSR1LAkJIjB4ZmYiCSk7CisJJmFuZCgJJHQsCQkiMHhmZiIJKTsKKwkmbW92KAkkdG1wMSwJCSZEV1AoIjB4NjAwIiwkdHJhbnMsJHRtcDEsMCkpOworCSZ4b3IoCSRMLAkJJHRtcDEpOworCSZtb3YoCSR0bXAxLAkJJkRXUCgiMHg3MDAiLCR0cmFucywkdG1wMiwwKSk7CisJJnhvcigJJEwsCQkkdG1wMSk7CisJJm1vdigJJHRtcDEsCQkmRFdQKCIweDQwMCIsJHRyYW5zLCR1LDApKTsKKwkmeG9yKAkkTCwJCSR0bXAxKTsKKwkmbW92KAkkdG1wMSwJCSZEV1AoIjB4NTAwIiwkdHJhbnMsJHQsMCkpOworCSZ4b3IoCSRMLAkJJHRtcDEpOworCSZtb3YoCSR0cmFucywJCSZ3cGFyYW0oMSkpOworCX0KKworc3ViIG4yYQorCXsKKwlzcHJpbnRmKCIlZCIsJF9bMF0pOworCX0KKworIyBub3cgaGFzIGEgc2lkZSBhZmZlY3Qgb2Ygcm90YXRpbmcgJGEgYnkgJHNoaWZ0CitzdWIgUl9QRVJNX09QCisJeworCWxvY2FsKCRhLCRiLCR0dCwkc2hpZnQsJG1hc2ssJGxhc3QpPUBfOworCisJJnJvdGwoCSRhLAkJJHNoaWZ0CQkpIGlmICgkc2hpZnQgIT0gMCk7CisJJm1vdigJJHR0LAkJJGEJCSk7CisJJnhvcigJJGEsCQkkYgkJKTsKKwkmYW5kKAkkYSwJCSRtYXNrCQkpOworCWlmICgkbm90bGFzdCBlcSAkYikKKwkJeworCQkmeG9yKAkkYiwJCSRhCQkpOworCQkmeG9yKAkkdHQsCQkkYQkJKTsKKwkJfQorCWVsc2UKKwkJeworCQkmeG9yKAkkdHQsCQkkYQkJKTsKKwkJJnhvcigJJGIsCQkkYQkJKTsKKwkJfQorCSZjb21tZW50KCIiKTsKKwl9CisKK3N1YiBJUF9uZXcKKwl7CisJbG9jYWwoJGwsJHIsJHR0LCRscik9QF87CisKKwkmUl9QRVJNX09QKCRsLCRyLCR0dCwgNCwiMHhmMGYwZjBmMCIsJGwpOworCSZSX1BFUk1fT1AoJHIsJHR0LCRsLDIwLCIweGZmZjAwMDBmIiwkbCk7CisJJlJfUEVSTV9PUCgkbCwkdHQsJHIsMTQsIjB4MzMzMzMzMzMiLCRyKTsKKwkmUl9QRVJNX09QKCR0dCwkciwkbCwyMiwiMHgwM2ZjMDNmYyIsJHIpOworCSZSX1BFUk1fT1AoJGwsJHIsJHR0LCA5LCIweGFhYWFhYWFhIiwkcik7CisJCisJaWYgKCRsciAhPSAzKQorCQl7CisJCWlmICgoJGxyLTMpIDwgMCkKKwkJCXsgJnJvdHIoJHR0LAkzLSRscik7IH0KKwkJZWxzZQl7ICZyb3RsKCR0dCwJJGxyLTMpOyB9CisJCX0KKwlpZiAoJGxyICE9IDIpCisJCXsKKwkJaWYgKCgkbHItMikgPCAwKQorCQkJeyAmcm90cigkciwJMi0kbHIpOyB9CisJCWVsc2UJeyAmcm90bCgkciwJJGxyLTIpOyB9CisJCX0KKwl9CisKK3N1YiBGUF9uZXcKKwl7CisJbG9jYWwoJGwsJHIsJHR0LCRscik9QF87CisKKwlpZiAoJGxyICE9IDIpCisJCXsKKwkJaWYgKCgkbHItMikgPCAwKQorCQkJeyAmcm90bCgkciwJMi0kbHIpOyB9CisJCWVsc2UJeyAmcm90cigkciwJJGxyLTIpOyB9CisJCX0KKwlpZiAoJGxyICE9IDMpCisJCXsKKwkJaWYgKCgkbHItMykgPCAwKQorCQkJeyAmcm90bCgkbCwJMy0kbHIpOyB9CisJCWVsc2UJeyAmcm90cigkbCwJJGxyLTMpOyB9CisJCX0KKworCSZSX1BFUk1fT1AoJGwsJHIsJHR0LCAwLCIweGFhYWFhYWFhIiwkcik7CisJJlJfUEVSTV9PUCgkdHQsJHIsJGwsMjMsIjB4MDNmYzAzZmMiLCRyKTsKKwkmUl9QRVJNX09QKCRsLCRyLCR0dCwxMCwiMHgzMzMzMzMzMyIsJGwpOworCSZSX1BFUk1fT1AoJHIsJHR0LCRsLDE4LCIweGZmZjAwMDBmIiwkbCk7CisJJlJfUEVSTV9PUCgkbCwkdHQsJHIsMTIsIjB4ZjBmMGYwZjAiLCRyKTsKKwkmcm90cigkdHQJLCA0KTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvYXNtL2Rlcy01ODYucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2FzbS9kZXMtNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWYzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2FzbS9kZXMtNTg2LnBsCkBAIC0wLDAgKzEsNDUzIEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKyMKKyMgVGhlIGlubmVyIGxvb3AgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgYW5kIHRoZSBJUC9GUCBtb2RpZmljYXRpb25zIGFyZSBmcm9tCisjIFN2ZW5kIE9sYWYgTWlra2Vsc2VuIDxzdm9sYWZAaW5ldC51bmktYy5kaz4KKyMKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKK3B1c2goQElOQywiJHtkaXJ9IiwiJHtkaXJ9Li4vLi4vcGVybGFzbSIpOworcmVxdWlyZSAieDg2YXNtLnBsIjsKK3JlcXVpcmUgImNiYy5wbCI7CityZXF1aXJlICJkZXNib3RoLnBsIjsKKworIyBiYXNlIGNvZGUgaXMgaW4gbWljcm9zZnQKKyMgb3AgZGVzdCwgc291cmNlCisjIGZvcm1hdC4KKyMKKworJmFzbV9pbml0KCRBUkdWWzBdLCJkZXMtNTg2LnBsIik7CisKKyRMPSJlZGkiOworJFI9ImVzaSI7CiskdHJhbnM9ImVicCI7Ciskc21hbGxfZm9vdHByaW50PTEgaWYgKGdyZXAoL1wtRE9QRU5TU0xfU01BTExfRk9PVFBSSU5ULyxAQVJHVikpOworIyBvbmUgY2FuIGRpc2N1c3Mgc2V0dGluZyB0aGlzIHZhcmlhYmxlIHRvIDEgdW5jb25kaXRpb25hbGx5LCBhcworIyB0aGUgZm9sZGVkIGxvb3AgaXMgb25seSAzJSBzbG93ZXIgdGhhbiB1bnJvbGxlZCwgYnV0ID43IHRpbWVzIHNtYWxsZXIKKworJnB1YmxpY19sYWJlbCgiREVTX1NQdHJhbnMiKTsKKworJkRFU19lbmNyeXB0X2ludGVybmFsKCk7CismREVTX2RlY3J5cHRfaW50ZXJuYWwoKTsKKyZERVNfZW5jcnlwdCgiREVTX2VuY3J5cHQxIiwxKTsKKyZERVNfZW5jcnlwdCgiREVTX2VuY3J5cHQyIiwwKTsKKyZERVNfZW5jcnlwdDMoIkRFU19lbmNyeXB0MyIsMSk7CismREVTX2VuY3J5cHQzKCJERVNfZGVjcnlwdDMiLDApOworJmNiYygiREVTX25jYmNfZW5jcnlwdCIsIkRFU19lbmNyeXB0MSIsIkRFU19lbmNyeXB0MSIsMCw0LDUsMyw1LC0xKTsKKyZjYmMoIkRFU19lZGUzX2NiY19lbmNyeXB0IiwiREVTX2VuY3J5cHQzIiwiREVTX2RlY3J5cHQzIiwwLDYsNywzLDQsNSk7CismREVTX1NQdHJhbnMoKTsKKworJmFzbV9maW5pc2goKTsKKworc3ViIERFU19lbmNyeXB0X2ludGVybmFsKCkKKwl7CisJJmZ1bmN0aW9uX2JlZ2luX0IoIl94ODZfREVTX2VuY3J5cHQiKTsKKworCWlmICgkc21hbGxfZm9vdHByaW50KQorCSAgICB7CisJICAgICZsZWEoImVkeCIsJkRXUCgxMjgsImVjeCIpKTsKKwkgICAgJnB1c2goImVkeCIpOworCSAgICAmcHVzaCgiZWN4Iik7CisJICAgICZzZXRfbGFiZWwoImVsb29wIik7CisJCSZEX0VOQ1JZUFQoMCwkTCwkUiwwLCR0cmFucywiZWF4IiwiZWJ4IiwiZWN4IiwiZWR4Iiwmc3d0bXAoMCkpOworCQkmY29tbWVudCgiIik7CisJCSZEX0VOQ1JZUFQoMSwkUiwkTCwyLCR0cmFucywiZWF4IiwiZWJ4IiwiZWN4IiwiZWR4Iiwmc3d0bXAoMCkpOworCQkmY29tbWVudCgiIik7CisJCSZhZGQoImVjeCIsMTYpOworCQkmY21wKCJlY3giLCZzd3RtcCgxKSk7CisJCSZtb3YoJnN3dG1wKDApLCJlY3giKTsKKwkJJmpiKCZsYWJlbCgiZWxvb3AiKSk7CisJICAgICZhZGQoImVzcCIsOCk7CisJICAgIH0KKwllbHNlCisJICAgIHsKKwkgICAgJnB1c2goImVjeCIpOworCSAgICBmb3IgKCRpPTA7ICRpPDE2OyAkaSs9MikKKwkJeworCQkmY29tbWVudCgiUm91bmQgJGkiKTsKKwkJJkRfRU5DUllQVCgkaSwkTCwkUiwkaSoyLCR0cmFucywiZWF4IiwiZWJ4IiwiZWN4IiwiZWR4Iiwmc3d0bXAoMCkpOworCQkmY29tbWVudCgiUm91bmQgIi5zcHJpbnRmKCIlZCIsJGkrMSkpOworCQkmRF9FTkNSWVBUKCRpKzEsJFIsJEwsKCRpKzEpKjIsJHRyYW5zLCJlYXgiLCJlYngiLCJlY3giLCJlZHgiLCZzd3RtcCgwKSk7CisJCX0KKwkgICAgJmFkZCgiZXNwIiw0KTsKKwl9CisJJnJldCgpOworCisJJmZ1bmN0aW9uX2VuZF9CKCJfeDg2X0RFU19lbmNyeXB0Iik7CisJfQorCQorc3ViIERFU19kZWNyeXB0X2ludGVybmFsKCkKKwl7CisJJmZ1bmN0aW9uX2JlZ2luX0IoIl94ODZfREVTX2RlY3J5cHQiKTsKKworCWlmICgkc21hbGxfZm9vdHByaW50KQorCSAgICB7CisJICAgICZwdXNoKCJlY3giKTsKKwkgICAgJmxlYSgiZWN4IiwmRFdQKDEyOCwiZWN4IikpOworCSAgICAmcHVzaCgiZWN4Iik7CisJICAgICZzZXRfbGFiZWwoImRsb29wIik7CisJCSZEX0VOQ1JZUFQoMCwkTCwkUiwtMiwkdHJhbnMsImVheCIsImVieCIsImVjeCIsImVkeCIsJnN3dG1wKDApKTsKKwkJJmNvbW1lbnQoIiIpOworCQkmRF9FTkNSWVBUKDEsJFIsJEwsLTQsJHRyYW5zLCJlYXgiLCJlYngiLCJlY3giLCJlZHgiLCZzd3RtcCgwKSk7CisJCSZjb21tZW50KCIiKTsKKwkJJnN1YigiZWN4IiwxNik7CisJCSZjbXAoImVjeCIsJnN3dG1wKDEpKTsKKwkJJm1vdigmc3d0bXAoMCksImVjeCIpOworCQkmamEoJmxhYmVsKCJkbG9vcCIpKTsKKwkgICAgJmFkZCgiZXNwIiw4KTsKKwkgICAgfQorCWVsc2UKKwkgICAgeworCSAgICAmcHVzaCgiZWN4Iik7CisJICAgIGZvciAoJGk9MTU7ICRpPjA7ICRpLT0yKQorCQl7CisJCSZjb21tZW50KCJSb3VuZCAkaSIpOworCQkmRF9FTkNSWVBUKDE1LSRpLCRMLCRSLCRpKjIsJHRyYW5zLCJlYXgiLCJlYngiLCJlY3giLCJlZHgiLCZzd3RtcCgwKSk7CisJCSZjb21tZW50KCJSb3VuZCAiLnNwcmludGYoIiVkIiwkaS0xKSk7CisJCSZEX0VOQ1JZUFQoMTUtJGkrMSwkUiwkTCwoJGktMSkqMiwkdHJhbnMsImVheCIsImVieCIsImVjeCIsImVkeCIsJnN3dG1wKDApKTsKKwkJfQorCSAgICAmYWRkKCJlc3AiLDQpOworCSAgICB9CisJJnJldCgpOworCisJJmZ1bmN0aW9uX2VuZF9CKCJfeDg2X0RFU19kZWNyeXB0Iik7CisJfQorCQorc3ViIERFU19lbmNyeXB0CisJeworCWxvY2FsKCRuYW1lLCRkb19pcCk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW5fQigkbmFtZSk7CisKKwkmcHVzaCgiZXNpIik7CisJJnB1c2goImVkaSIpOworCisJJmNvbW1lbnQoIiIpOworCSZjb21tZW50KCJMb2FkIHRoZSAyIHdvcmRzIik7CisKKwlpZiAoJGRvX2lwKQorCQl7CisJCSZtb3YoJFIsJndwYXJhbSgwKSk7CisJCSAmeG9yKAkiZWN4IiwJCSJlY3giCQkpOworCisJCSZwdXNoKCJlYngiKTsKKwkJJnB1c2goImVicCIpOworCisJCSZtb3YoImVheCIsJkRXUCgwLCRSLCIiLDApKTsKKwkJICZtb3YoImVieCIsJndwYXJhbSgyKSk7CSMgZ2V0IGVuY3J5cHQgZmxhZworCQkmbW92KCRMLCZEV1AoNCwkUiwiIiwwKSk7CisJCSZjb21tZW50KCIiKTsKKwkJJmNvbW1lbnQoIklQIik7CisJCSZJUF9uZXcoImVheCIsJEwsJFIsMyk7CisJCX0KKwllbHNlCisJCXsKKwkJJm1vdigiZWF4Iiwmd3BhcmFtKDApKTsKKwkJICZ4b3IoCSJlY3giLAkJImVjeCIJCSk7CisKKwkJJnB1c2goImVieCIpOworCQkmcHVzaCgiZWJwIik7CisKKwkJJm1vdigkUiwmRFdQKDAsImVheCIsIiIsMCkpOworCQkgJm1vdigiZWJ4Iiwmd3BhcmFtKDIpKTsJIyBnZXQgZW5jcnlwdCBmbGFnCisJCSZyb3RsKCRSLDMpOworCQkmbW92KCRMLCZEV1AoNCwiZWF4IiwiIiwwKSk7CisJCSZyb3RsKCRMLDMpOworCQl9CisKKwkjIFBJQy1pZmljYXRpb246LSkKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CisJJnNldF9sYWJlbCgicGljX3BvaW50Iik7CisJJmJsaW5kcG9wKCR0cmFucyk7CisJJmxlYQkoJHRyYW5zLCZEV1AoJmxhYmVsKCJERVNfU1B0cmFucyIpLiItIi4mbGFiZWwoInBpY19wb2ludCIpLCR0cmFucykpOworCisJJm1vdigJImVjeCIsCSZ3cGFyYW0oMSkJKTsKKworCSZjbXAoImVieCIsIjAiKTsKKwkmamUoJmxhYmVsKCJkZWNyeXB0IikpOworCSZjYWxsKCJfeDg2X0RFU19lbmNyeXB0Iik7CisJJmptcCgmbGFiZWwoImRvbmUiKSk7CisJJnNldF9sYWJlbCgiZGVjcnlwdCIpOworCSZjYWxsKCJfeDg2X0RFU19kZWNyeXB0Iik7CisJJnNldF9sYWJlbCgiZG9uZSIpOworCisJaWYgKCRkb19pcCkKKwkJeworCQkmY29tbWVudCgiIik7CisJCSZjb21tZW50KCJGUCIpOworCQkmbW92KCJlZHgiLCZ3cGFyYW0oMCkpOworCQkmRlBfbmV3KCRMLCRSLCJlYXgiLDMpOworCisJCSZtb3YoJkRXUCgwLCJlZHgiLCIiLDApLCJlYXgiKTsKKwkJJm1vdigmRFdQKDQsImVkeCIsIiIsMCksJFIpOworCQl9CisJZWxzZQorCQl7CisJCSZjb21tZW50KCIiKTsKKwkJJmNvbW1lbnQoIkZpeHVwIik7CisJCSZyb3RyKCRMLDMpOwkJIyByCisJCSAmbW92KCJlYXgiLCZ3cGFyYW0oMCkpOworCQkmcm90cigkUiwzKTsJCSMgbAorCQkgJm1vdigmRFdQKDAsImVheCIsIiIsMCksJEwpOworCQkgJm1vdigmRFdQKDQsImVheCIsIiIsMCksJFIpOworCQl9CisKKwkmcG9wKCJlYnAiKTsKKwkmcG9wKCJlYngiKTsKKwkmcG9wKCJlZGkiKTsKKwkmcG9wKCJlc2kiKTsKKwkmcmV0KCk7CisKKwkmZnVuY3Rpb25fZW5kX0IoJG5hbWUpOworCX0KKworc3ViIERfRU5DUllQVAorCXsKKwlsb2NhbCgkciwkTCwkUiwkUywkdHJhbnMsJHUsJHRtcDEsJHRtcDIsJHQsJHdwMSk9QF87CisKKwkgJm1vdigJJHUsCQkmRFdQKCZuMmEoJFMqNCksJHRtcDIsIiIsMCkpOworCSZ4b3IoCSR0bXAxLAkJJHRtcDEpOworCSAmbW92KAkkdCwJCSZEV1AoJm4yYSgoJFMrMSkqNCksJHRtcDIsIiIsMCkpOworCSZ4b3IoCSR1LAkJJFIpOworCSZ4b3IoCSR0bXAyLAkJJHRtcDIpOworCSAmeG9yKAkkdCwJCSRSKTsKKwkmYW5kKAkkdSwJCSIweGZjZmNmY2ZjIgkpOworCSAmYW5kKAkkdCwJCSIweGNmY2ZjZmNmIgkpOworCSZtb3ZiKAkmTEIoJHRtcDEpLAkmTEIoJHUpCSk7CisJICZtb3ZiKAkmTEIoJHRtcDIpLAkmSEIoJHUpCSk7CisJJnJvdHIoCSR0LAkJNAkJKTsKKwkmeG9yKAkkTCwJCSZEV1AoIiAgICAgIiwkdHJhbnMsJHRtcDEsMCkpOworCSAmbW92YigJJkxCKCR0bXAxKSwJJkxCKCR0KQkpOworCSAmeG9yKAkkTCwJCSZEV1AoIjB4MjAwIiwkdHJhbnMsJHRtcDIsMCkpOworCSAmbW92YigJJkxCKCR0bXAyKSwJJkhCKCR0KQkpOworCSZzaHIoCSR1LAkJMTYpOworCSAmeG9yKAkkTCwJCSZEV1AoIjB4MTAwIiwkdHJhbnMsJHRtcDEsMCkpOworCSAmbW92YigJJkxCKCR0bXAxKSwJJkhCKCR1KQkpOworCSZzaHIoCSR0LAkJMTYpOworCSAmeG9yKAkkTCwJCSZEV1AoIjB4MzAwIiwkdHJhbnMsJHRtcDIsMCkpOworCSZtb3ZiKAkmTEIoJHRtcDIpLAkmSEIoJHQpCSk7CisJICZhbmQoCSR1LAkJIjB4ZmYiCSk7CisJJmFuZCgJJHQsCQkiMHhmZiIJKTsKKwkgJnhvcigJJEwsCQkmRFdQKCIweDYwMCIsJHRyYW5zLCR0bXAxLDApKTsKKwkgJnhvcigJJEwsCQkmRFdQKCIweDcwMCIsJHRyYW5zLCR0bXAyLDApKTsKKwkmbW92KAkkdG1wMiwJCSR3cDEJKTsKKwkgJnhvcigJJEwsCQkmRFdQKCIweDQwMCIsJHRyYW5zLCR1LDApKTsKKwkgJnhvcigJJEwsCQkmRFdQKCIweDUwMCIsJHRyYW5zLCR0LDApKTsKKwl9CisKK3N1YiBuMmEKKwl7CisJc3ByaW50ZigiJWQiLCRfWzBdKTsKKwl9CisKKyMgbm93IGhhcyBhIHNpZGUgYWZmZWN0IG9mIHJvdGF0aW5nICRhIGJ5ICRzaGlmdAorc3ViIFJfUEVSTV9PUAorCXsKKwlsb2NhbCgkYSwkYiwkdHQsJHNoaWZ0LCRtYXNrLCRsYXN0KT1AXzsKKworCSZyb3RsKAkkYSwJCSRzaGlmdAkJKSBpZiAoJHNoaWZ0ICE9IDApOworCSZtb3YoCSR0dCwJCSRhCQkpOworCSZ4b3IoCSRhLAkJJGIJCSk7CisJJmFuZCgJJGEsCQkkbWFzawkJKTsKKwkjIFRoaXMgY2FuIG5ldmVyIHN1Y2NlZWQsIGFuZCBiZXNpZGVzIGl0IGlzIGRpZmZpY3VsdCB0byBzZWUgd2hhdCB0aGUKKwkjIGlkZWEgd2FzIC0gQmVuIDEzIEZlYiA5OQorCWlmICghJGxhc3QgZXEgJGIpCisJCXsKKwkJJnhvcigJJGIsCQkkYQkJKTsKKwkJJnhvcigJJHR0LAkJJGEJCSk7CisJCX0KKwllbHNlCisJCXsKKwkJJnhvcigJJHR0LAkJJGEJCSk7CisJCSZ4b3IoCSRiLAkJJGEJCSk7CisJCX0KKwkmY29tbWVudCgiIik7CisJfQorCitzdWIgSVBfbmV3CisJeworCWxvY2FsKCRsLCRyLCR0dCwkbHIpPUBfOworCisJJlJfUEVSTV9PUCgkbCwkciwkdHQsIDQsIjB4ZjBmMGYwZjAiLCRsKTsKKwkmUl9QRVJNX09QKCRyLCR0dCwkbCwyMCwiMHhmZmYwMDAwZiIsJGwpOworCSZSX1BFUk1fT1AoJGwsJHR0LCRyLDE0LCIweDMzMzMzMzMzIiwkcik7CisJJlJfUEVSTV9PUCgkdHQsJHIsJGwsMjIsIjB4MDNmYzAzZmMiLCRyKTsKKwkmUl9QRVJNX09QKCRsLCRyLCR0dCwgOSwiMHhhYWFhYWFhYSIsJHIpOworCQorCWlmICgkbHIgIT0gMykKKwkJeworCQlpZiAoKCRsci0zKSA8IDApCisJCQl7ICZyb3RyKCR0dCwJMy0kbHIpOyB9CisJCWVsc2UJeyAmcm90bCgkdHQsCSRsci0zKTsgfQorCQl9CisJaWYgKCRsciAhPSAyKQorCQl7CisJCWlmICgoJGxyLTIpIDwgMCkKKwkJCXsgJnJvdHIoJHIsCTItJGxyKTsgfQorCQllbHNlCXsgJnJvdGwoJHIsCSRsci0yKTsgfQorCQl9CisJfQorCitzdWIgRlBfbmV3CisJeworCWxvY2FsKCRsLCRyLCR0dCwkbHIpPUBfOworCisJaWYgKCRsciAhPSAyKQorCQl7CisJCWlmICgoJGxyLTIpIDwgMCkKKwkJCXsgJnJvdGwoJHIsCTItJGxyKTsgfQorCQllbHNlCXsgJnJvdHIoJHIsCSRsci0yKTsgfQorCQl9CisJaWYgKCRsciAhPSAzKQorCQl7CisJCWlmICgoJGxyLTMpIDwgMCkKKwkJCXsgJnJvdGwoJGwsCTMtJGxyKTsgfQorCQllbHNlCXsgJnJvdHIoJGwsCSRsci0zKTsgfQorCQl9CisKKwkmUl9QRVJNX09QKCRsLCRyLCR0dCwgMCwiMHhhYWFhYWFhYSIsJHIpOworCSZSX1BFUk1fT1AoJHR0LCRyLCRsLDIzLCIweDAzZmMwM2ZjIiwkcik7CisJJlJfUEVSTV9PUCgkbCwkciwkdHQsMTAsIjB4MzMzMzMzMzMiLCRsKTsKKwkmUl9QRVJNX09QKCRyLCR0dCwkbCwxOCwiMHhmZmYwMDAwZiIsJGwpOworCSZSX1BFUk1fT1AoJGwsJHR0LCRyLDEyLCIweGYwZjBmMGYwIiwkcik7CisJJnJvdHIoJHR0CSwgNCk7CisJfQorCitzdWIgREVTX1NQdHJhbnMKKwl7CisJJnNldF9sYWJlbCgiREVTX1NQdHJhbnMiLDY0KTsKKwkmZGF0YV93b3JkKDB4MDIwODA4MDAsIDB4MDAwODAwMDAsIDB4MDIwMDAwMDIsIDB4MDIwODA4MDIpOworCSZkYXRhX3dvcmQoMHgwMjAwMDAwMCwgMHgwMDA4MDgwMiwgMHgwMDA4MDAwMiwgMHgwMjAwMDAwMik7CisJJmRhdGFfd29yZCgweDAwMDgwODAyLCAweDAyMDgwODAwLCAweDAyMDgwMDAwLCAweDAwMDAwODAyKTsKKwkmZGF0YV93b3JkKDB4MDIwMDA4MDIsIDB4MDIwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwODAwMDIpOworCSZkYXRhX3dvcmQoMHgwMDA4MDAwMCwgMHgwMDAwMDAwMiwgMHgwMjAwMDgwMCwgMHgwMDA4MDgwMCk7CisJJmRhdGFfd29yZCgweDAyMDgwODAyLCAweDAyMDgwMDAwLCAweDAwMDAwODAyLCAweDAyMDAwODAwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDAwMDIsIDB4MDAwMDA4MDAsIDB4MDAwODA4MDAsIDB4MDIwODAwMDIpOworCSZkYXRhX3dvcmQoMHgwMDAwMDgwMCwgMHgwMjAwMDgwMiwgMHgwMjA4MDAwMiwgMHgwMDAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDAwMDAwLCAweDAyMDgwODAyLCAweDAyMDAwODAwLCAweDAwMDgwMDAyKTsKKwkmZGF0YV93b3JkKDB4MDIwODA4MDAsIDB4MDAwODAwMDAsIDB4MDAwMDA4MDIsIDB4MDIwMDA4MDApOworCSZkYXRhX3dvcmQoMHgwMjA4MDAwMiwgMHgwMDAwMDgwMCwgMHgwMDA4MDgwMCwgMHgwMjAwMDAwMik7CisJJmRhdGFfd29yZCgweDAwMDgwODAyLCAweDAwMDAwMDAyLCAweDAyMDAwMDAyLCAweDAyMDgwMDAwKTsKKwkmZGF0YV93b3JkKDB4MDIwODA4MDIsIDB4MDAwODA4MDAsIDB4MDIwODAwMDAsIDB4MDIwMDA4MDIpOworCSZkYXRhX3dvcmQoMHgwMjAwMDAwMCwgMHgwMDAwMDgwMiwgMHgwMDA4MDAwMiwgMHgwMDAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDgwMDAwLCAweDAyMDAwMDAwLCAweDAyMDAwODAyLCAweDAyMDgwODAwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDAwMDIsIDB4MDIwODAwMDIsIDB4MDAwMDA4MDAsIDB4MDAwODA4MDIpOworCSMgbmliYmxlIDEKKwkmZGF0YV93b3JkKDB4NDAxMDgwMTAsIDB4MDAwMDAwMDAsIDB4MDAxMDgwMDAsIDB4NDAxMDAwMDApOworCSZkYXRhX3dvcmQoMHg0MDAwMDAxMCwgMHgwMDAwODAxMCwgMHg0MDAwODAwMCwgMHgwMDEwODAwMCk7CisJJmRhdGFfd29yZCgweDAwMDA4MDAwLCAweDQwMTAwMDEwLCAweDAwMDAwMDEwLCAweDQwMDA4MDAwKTsKKwkmZGF0YV93b3JkKDB4MDAxMDAwMTAsIDB4NDAxMDgwMDAsIDB4NDAxMDAwMDAsIDB4MDAwMDAwMTApOworCSZkYXRhX3dvcmQoMHgwMDEwMDAwMCwgMHg0MDAwODAxMCwgMHg0MDEwMDAxMCwgMHgwMDAwODAwMCk7CisJJmRhdGFfd29yZCgweDAwMTA4MDEwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMTAwMDEwKTsKKwkmZGF0YV93b3JkKDB4NDAwMDgwMTAsIDB4MDAxMDgwMTAsIDB4NDAxMDgwMDAsIDB4NDAwMDAwMTApOworCSZkYXRhX3dvcmQoMHg0MDAwMDAwMCwgMHgwMDEwMDAwMCwgMHgwMDAwODAxMCwgMHg0MDEwODAxMCk7CisJJmRhdGFfd29yZCgweDAwMTAwMDEwLCAweDQwMTA4MDAwLCAweDQwMDA4MDAwLCAweDAwMTA4MDEwKTsKKwkmZGF0YV93b3JkKDB4NDAxMDgwMTAsIDB4MDAxMDAwMTAsIDB4NDAwMDAwMTAsIDB4MDAwMDAwMDApOworCSZkYXRhX3dvcmQoMHg0MDAwMDAwMCwgMHgwMDAwODAxMCwgMHgwMDEwMDAwMCwgMHg0MDEwMDAxMCk7CisJJmRhdGFfd29yZCgweDAwMDA4MDAwLCAweDQwMDAwMDAwLCAweDAwMTA4MDEwLCAweDQwMDA4MDEwKTsKKwkmZGF0YV93b3JkKDB4NDAxMDgwMDAsIDB4MDAwMDgwMDAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMTApOworCSZkYXRhX3dvcmQoMHgwMDAwMDAxMCwgMHg0MDEwODAxMCwgMHgwMDEwODAwMCwgMHg0MDEwMDAwMCk7CisJJmRhdGFfd29yZCgweDQwMTAwMDEwLCAweDAwMTAwMDAwLCAweDAwMDA4MDEwLCAweDQwMDA4MDAwKTsKKwkmZGF0YV93b3JkKDB4NDAwMDgwMTAsIDB4MDAwMDAwMTAsIDB4NDAxMDAwMDAsIDB4MDAxMDgwMDApOworCSMgbmliYmxlIDIKKwkmZGF0YV93b3JkKDB4MDQwMDAwMDEsIDB4MDQwNDAxMDAsIDB4MDAwMDAxMDAsIDB4MDQwMDAxMDEpOworCSZkYXRhX3dvcmQoMHgwMDA0MDAwMSwgMHgwNDAwMDAwMCwgMHgwNDAwMDEwMSwgMHgwMDA0MDEwMCk7CisJJmRhdGFfd29yZCgweDA0MDAwMTAwLCAweDAwMDQwMDAwLCAweDA0MDQwMDAwLCAweDAwMDAwMDAxKTsKKwkmZGF0YV93b3JkKDB4MDQwNDAxMDEsIDB4MDAwMDAxMDEsIDB4MDAwMDAwMDEsIDB4MDQwNDAwMDEpOworCSZkYXRhX3dvcmQoMHgwMDAwMDAwMCwgMHgwMDA0MDAwMSwgMHgwNDA0MDEwMCwgMHgwMDAwMDEwMCk7CisJJmRhdGFfd29yZCgweDAwMDAwMTAxLCAweDA0MDQwMTAxLCAweDAwMDQwMDAwLCAweDA0MDAwMDAxKTsKKwkmZGF0YV93b3JkKDB4MDQwNDAwMDEsIDB4MDQwMDAxMDAsIDB4MDAwNDAxMDEsIDB4MDQwNDAwMDApOworCSZkYXRhX3dvcmQoMHgwMDA0MDEwMCwgMHgwMDAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwMDA0MDEwMSk7CisJJmRhdGFfd29yZCgweDA0MDQwMTAwLCAweDAwMDAwMTAwLCAweDAwMDAwMDAxLCAweDAwMDQwMDAwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDAxMDEsIDB4MDAwNDAwMDEsIDB4MDQwNDAwMDAsIDB4MDQwMDAxMDEpOworCSZkYXRhX3dvcmQoMHgwMDAwMDAwMCwgMHgwNDA0MDEwMCwgMHgwMDA0MDEwMCwgMHgwNDA0MDAwMSk7CisJJmRhdGFfd29yZCgweDAwMDQwMDAxLCAweDA0MDAwMDAwLCAweDA0MDQwMTAxLCAweDAwMDAwMDAxKTsKKwkmZGF0YV93b3JkKDB4MDAwNDAxMDEsIDB4MDQwMDAwMDEsIDB4MDQwMDAwMDAsIDB4MDQwNDAxMDEpOworCSZkYXRhX3dvcmQoMHgwMDA0MDAwMCwgMHgwNDAwMDEwMCwgMHgwNDAwMDEwMSwgMHgwMDA0MDEwMCk7CisJJmRhdGFfd29yZCgweDA0MDAwMTAwLCAweDAwMDAwMDAwLCAweDA0MDQwMDAxLCAweDAwMDAwMTAxKTsKKwkmZGF0YV93b3JkKDB4MDQwMDAwMDEsIDB4MDAwNDAxMDEsIDB4MDAwMDAxMDAsIDB4MDQwNDAwMDApOworCSMgbmliYmxlIDMKKwkmZGF0YV93b3JkKDB4MDA0MDEwMDgsIDB4MTAwMDEwMDAsIDB4MDAwMDAwMDgsIDB4MTA0MDEwMDgpOworCSZkYXRhX3dvcmQoMHgwMDAwMDAwMCwgMHgxMDQwMDAwMCwgMHgxMDAwMTAwOCwgMHgwMDQwMDAwOCk7CisJJmRhdGFfd29yZCgweDEwNDAxMDAwLCAweDEwMDAwMDA4LCAweDEwMDAwMDAwLCAweDAwMDAxMDA4KTsKKwkmZGF0YV93b3JkKDB4MTAwMDAwMDgsIDB4MDA0MDEwMDgsIDB4MDA0MDAwMDAsIDB4MTAwMDAwMDApOworCSZkYXRhX3dvcmQoMHgxMDQwMDAwOCwgMHgwMDQwMTAwMCwgMHgwMDAwMTAwMCwgMHgwMDAwMDAwOCk7CisJJmRhdGFfd29yZCgweDAwNDAxMDAwLCAweDEwMDAxMDA4LCAweDEwNDAwMDAwLCAweDAwMDAxMDAwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDEwMDgsIDB4MDAwMDAwMDAsIDB4MDA0MDAwMDgsIDB4MTA0MDEwMDApOworCSZkYXRhX3dvcmQoMHgxMDAwMTAwMCwgMHgxMDQwMDAwOCwgMHgxMDQwMTAwOCwgMHgwMDQwMDAwMCk7CisJJmRhdGFfd29yZCgweDEwNDAwMDA4LCAweDAwMDAxMDA4LCAweDAwNDAwMDAwLCAweDEwMDAwMDA4KTsKKwkmZGF0YV93b3JkKDB4MDA0MDEwMDAsIDB4MTAwMDEwMDAsIDB4MDAwMDAwMDgsIDB4MTA0MDAwMDApOworCSZkYXRhX3dvcmQoMHgxMDAwMTAwOCwgMHgwMDAwMDAwMCwgMHgwMDAwMTAwMCwgMHgwMDQwMDAwOCk7CisJJmRhdGFfd29yZCgweDAwMDAwMDAwLCAweDEwNDAwMDA4LCAweDEwNDAxMDAwLCAweDAwMDAxMDAwKTsKKwkmZGF0YV93b3JkKDB4MTAwMDAwMDAsIDB4MTA0MDEwMDgsIDB4MDA0MDEwMDgsIDB4MDA0MDAwMDApOworCSZkYXRhX3dvcmQoMHgxMDQwMTAwOCwgMHgwMDAwMDAwOCwgMHgxMDAwMTAwMCwgMHgwMDQwMTAwOCk7CisJJmRhdGFfd29yZCgweDAwNDAwMDA4LCAweDAwNDAxMDAwLCAweDEwNDAwMDAwLCAweDEwMDAxMDA4KTsKKwkmZGF0YV93b3JkKDB4MDAwMDEwMDgsIDB4MTAwMDAwMDAsIDB4MTAwMDAwMDgsIDB4MTA0MDEwMDApOworCSMgbmliYmxlIDQKKwkmZGF0YV93b3JkKDB4MDgwMDAwMDAsIDB4MDAwMTAwMDAsIDB4MDAwMDA0MDAsIDB4MDgwMTA0MjApOworCSZkYXRhX3dvcmQoMHgwODAxMDAyMCwgMHgwODAwMDQwMCwgMHgwMDAxMDQyMCwgMHgwODAxMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDEwMDAwLCAweDAwMDAwMDIwLCAweDA4MDAwMDIwLCAweDAwMDEwNDAwKTsKKwkmZGF0YV93b3JkKDB4MDgwMDA0MjAsIDB4MDgwMTAwMjAsIDB4MDgwMTA0MDAsIDB4MDAwMDAwMDApOworCSZkYXRhX3dvcmQoMHgwMDAxMDQwMCwgMHgwODAwMDAwMCwgMHgwMDAxMDAyMCwgMHgwMDAwMDQyMCk7CisJJmRhdGFfd29yZCgweDA4MDAwNDAwLCAweDAwMDEwNDIwLCAweDAwMDAwMDAwLCAweDA4MDAwMDIwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDAwMjAsIDB4MDgwMDA0MjAsIDB4MDgwMTA0MjAsIDB4MDAwMTAwMjApOworCSZkYXRhX3dvcmQoMHgwODAxMDAwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDQyMCwgMHgwODAxMDQwMCk7CisJJmRhdGFfd29yZCgweDA4MDEwNDAwLCAweDA4MDAwNDIwLCAweDAwMDEwMDIwLCAweDA4MDEwMDAwKTsKKwkmZGF0YV93b3JkKDB4MDAwMTAwMDAsIDB4MDAwMDAwMjAsIDB4MDgwMDAwMjAsIDB4MDgwMDA0MDApOworCSZkYXRhX3dvcmQoMHgwODAwMDAwMCwgMHgwMDAxMDQwMCwgMHgwODAxMDQyMCwgMHgwMDAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDEwNDIwLCAweDA4MDAwMDAwLCAweDAwMDAwNDAwLCAweDAwMDEwMDIwKTsKKwkmZGF0YV93b3JkKDB4MDgwMDA0MjAsIDB4MDAwMDA0MDAsIDB4MDAwMDAwMDAsIDB4MDgwMTA0MjApOworCSZkYXRhX3dvcmQoMHgwODAxMDAyMCwgMHgwODAxMDQwMCwgMHgwMDAwMDQyMCwgMHgwMDAxMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDEwNDAwLCAweDA4MDEwMDIwLCAweDA4MDAwNDAwLCAweDAwMDAwNDIwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDAwMjAsIDB4MDAwMTA0MjAsIDB4MDgwMTAwMDAsIDB4MDgwMDAwMjApOworCSMgbmliYmxlIDUKKwkmZGF0YV93b3JkKDB4ODAwMDAwNDAsIDB4MDAyMDAwNDAsIDB4MDAwMDAwMDAsIDB4ODAyMDIwMDApOworCSZkYXRhX3dvcmQoMHgwMDIwMDA0MCwgMHgwMDAwMjAwMCwgMHg4MDAwMjA0MCwgMHgwMDIwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDAyMDQwLCAweDgwMjAyMDQwLCAweDAwMjAyMDAwLCAweDgwMDAwMDAwKTsKKwkmZGF0YV93b3JkKDB4ODAwMDIwMDAsIDB4ODAwMDAwNDAsIDB4ODAyMDAwMDAsIDB4MDAyMDIwNDApOworCSZkYXRhX3dvcmQoMHgwMDIwMDAwMCwgMHg4MDAwMjA0MCwgMHg4MDIwMDA0MCwgMHgwMDAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDAyMDAwLCAweDAwMDAwMDQwLCAweDgwMjAyMDAwLCAweDgwMjAwMDQwKTsKKwkmZGF0YV93b3JkKDB4ODAyMDIwNDAsIDB4ODAyMDAwMDAsIDB4ODAwMDAwMDAsIDB4MDAwMDIwNDApOworCSZkYXRhX3dvcmQoMHgwMDAwMDA0MCwgMHgwMDIwMjAwMCwgMHgwMDIwMjA0MCwgMHg4MDAwMjAwMCk7CisJJmRhdGFfd29yZCgweDAwMDAyMDQwLCAweDgwMDAwMDAwLCAweDgwMDAyMDAwLCAweDAwMjAyMDQwKTsKKwkmZGF0YV93b3JkKDB4ODAyMDIwMDAsIDB4MDAyMDAwNDAsIDB4MDAwMDAwMDAsIDB4ODAwMDIwMDApOworCSZkYXRhX3dvcmQoMHg4MDAwMDAwMCwgMHgwMDAwMjAwMCwgMHg4MDIwMDA0MCwgMHgwMDIwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMjAwMDQwLCAweDgwMjAyMDQwLCAweDAwMjAyMDAwLCAweDAwMDAwMDQwKTsKKwkmZGF0YV93b3JkKDB4ODAyMDIwNDAsIDB4MDAyMDIwMDAsIDB4MDAyMDAwMDAsIDB4ODAwMDIwNDApOworCSZkYXRhX3dvcmQoMHg4MDAwMDA0MCwgMHg4MDIwMDAwMCwgMHgwMDIwMjA0MCwgMHgwMDAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDAyMDAwLCAweDgwMDAwMDQwLCAweDgwMDAyMDQwLCAweDgwMjAyMDAwKTsKKwkmZGF0YV93b3JkKDB4ODAyMDAwMDAsIDB4MDAwMDIwNDAsIDB4MDAwMDAwNDAsIDB4ODAyMDAwNDApOworCSMgbmliYmxlIDYKKwkmZGF0YV93b3JkKDB4MDAwMDQwMDAsIDB4MDAwMDAyMDAsIDB4MDEwMDAyMDAsIDB4MDEwMDAwMDQpOworCSZkYXRhX3dvcmQoMHgwMTAwNDIwNCwgMHgwMDAwNDAwNCwgMHgwMDAwNDIwMCwgMHgwMDAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAxMDAwMDAwLCAweDAxMDAwMjA0LCAweDAwMDAwMjA0LCAweDAxMDA0MDAwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDAwMDQsIDB4MDEwMDQyMDAsIDB4MDEwMDQwMDAsIDB4MDAwMDAyMDQpOworCSZkYXRhX3dvcmQoMHgwMTAwMDIwNCwgMHgwMDAwNDAwMCwgMHgwMDAwNDAwNCwgMHgwMTAwNDIwNCk7CisJJmRhdGFfd29yZCgweDAwMDAwMDAwLCAweDAxMDAwMjAwLCAweDAxMDAwMDA0LCAweDAwMDA0MjAwKTsKKwkmZGF0YV93b3JkKDB4MDEwMDQwMDQsIDB4MDAwMDQyMDQsIDB4MDEwMDQyMDAsIDB4MDAwMDAwMDQpOworCSZkYXRhX3dvcmQoMHgwMDAwNDIwNCwgMHgwMTAwNDAwNCwgMHgwMDAwMDIwMCwgMHgwMTAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDA0MjA0LCAweDAxMDA0MDAwLCAweDAxMDA0MDA0LCAweDAwMDAwMjA0KTsKKwkmZGF0YV93b3JkKDB4MDAwMDQwMDAsIDB4MDAwMDAyMDAsIDB4MDEwMDAwMDAsIDB4MDEwMDQwMDQpOworCSZkYXRhX3dvcmQoMHgwMTAwMDIwNCwgMHgwMDAwNDIwNCwgMHgwMDAwNDIwMCwgMHgwMDAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDAwMjAwLCAweDAxMDAwMDA0LCAweDAwMDAwMDA0LCAweDAxMDAwMjAwKTsKKwkmZGF0YV93b3JkKDB4MDAwMDAwMDAsIDB4MDEwMDAyMDQsIDB4MDEwMDAyMDAsIDB4MDAwMDQyMDApOworCSZkYXRhX3dvcmQoMHgwMDAwMDIwNCwgMHgwMDAwNDAwMCwgMHgwMTAwNDIwNCwgMHgwMTAwMDAwMCk7CisJJmRhdGFfd29yZCgweDAxMDA0MjAwLCAweDAwMDAwMDA0LCAweDAwMDA0MDA0LCAweDAxMDA0MjA0KTsKKwkmZGF0YV93b3JkKDB4MDEwMDAwMDQsIDB4MDEwMDQyMDAsIDB4MDEwMDQwMDAsIDB4MDAwMDQwMDQpOworCSMgbmliYmxlIDcKKwkmZGF0YV93b3JkKDB4MjA4MDAwODAsIDB4MjA4MjAwMDAsIDB4MDAwMjAwODAsIDB4MDAwMDAwMDApOworCSZkYXRhX3dvcmQoMHgyMDAyMDAwMCwgMHgwMDgwMDA4MCwgMHgyMDgwMDAwMCwgMHgyMDgyMDA4MCk7CisJJmRhdGFfd29yZCgweDAwMDAwMDgwLCAweDIwMDAwMDAwLCAweDAwODIwMDAwLCAweDAwMDIwMDgwKTsKKwkmZGF0YV93b3JkKDB4MDA4MjAwODAsIDB4MjAwMjAwODAsIDB4MjAwMDAwODAsIDB4MjA4MDAwMDApOworCSZkYXRhX3dvcmQoMHgwMDAyMDAwMCwgMHgwMDgyMDA4MCwgMHgwMDgwMDA4MCwgMHgyMDAyMDAwMCk7CisJJmRhdGFfd29yZCgweDIwODIwMDgwLCAweDIwMDAwMDgwLCAweDAwMDAwMDAwLCAweDAwODIwMDAwKTsKKwkmZGF0YV93b3JkKDB4MjAwMDAwMDAsIDB4MDA4MDAwMDAsIDB4MjAwMjAwODAsIDB4MjA4MDAwODApOworCSZkYXRhX3dvcmQoMHgwMDgwMDAwMCwgMHgwMDAyMDAwMCwgMHgyMDgyMDAwMCwgMHgwMDAwMDA4MCk7CisJJmRhdGFfd29yZCgweDAwODAwMDAwLCAweDAwMDIwMDAwLCAweDIwMDAwMDgwLCAweDIwODIwMDgwKTsKKwkmZGF0YV93b3JkKDB4MDAwMjAwODAsIDB4MjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDA4MjAwMDApOworCSZkYXRhX3dvcmQoMHgyMDgwMDA4MCwgMHgyMDAyMDA4MCwgMHgyMDAyMDAwMCwgMHgwMDgwMDA4MCk7CisJJmRhdGFfd29yZCgweDIwODIwMDAwLCAweDAwMDAwMDgwLCAweDAwODAwMDgwLCAweDIwMDIwMDAwKTsKKwkmZGF0YV93b3JkKDB4MjA4MjAwODAsIDB4MDA4MDAwMDAsIDB4MjA4MDAwMDAsIDB4MjAwMDAwODApOworCSZkYXRhX3dvcmQoMHgwMDgyMDAwMCwgMHgwMDAyMDA4MCwgMHgyMDAyMDA4MCwgMHgyMDgwMDAwMCk7CisJJmRhdGFfd29yZCgweDAwMDAwMDgwLCAweDIwODIwMDAwLCAweDAwODIwMDgwLCAweDAwMDAwMDAwKTsKKwkmZGF0YV93b3JkKDB4MjAwMDAwMDAsIDB4MjA4MDAwODAsIDB4MDAwMjAwMDAsIDB4MDA4MjAwODApOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvYXNtL2Rlc19lbmMubTQgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2FzbS9kZXNfZW5jLm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODA1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2FzbS9kZXNfZW5jLm00CkBAIC0wLDAgKzEsMjA5OSBAQAorISAgZGVzX2VuYy5tNAorISAgZGVzX2VuYy5TICAoZ2VuZXJhdGVkIGZyb20gZGVzX2VuYy5tNCkKKyEKKyEgIFVsdHJhU1BBUkMgYXNzZW1ibGVyIHZlcnNpb24gb2YgdGhlIExpYkRFUy9TU0xlYXkvT3BlblNTTCBkZXNfZW5jLmMgZmlsZS4KKyEKKyEgIFZlcnNpb24gMS4wLiAzMi1iaXQgdmVyc2lvbi4KKyEKKyEgIEp1bmUgOCwgMjAwMC4KKyEKKyEgIFZlcnNpb24gMi4wLiAzMi82NC1iaXQsIFBJQy1pZmljYXRpb24sIGJsZW5kZWQgQ1BVIGFkYXB0YXRpb24KKyEJCWJ5IEFuZHkgUG9seWFrb3YuCishCishICBKYW51YXJ5IDEsIDIwMDMuCishCishICBBc3NlbWJsZXIgdmVyc2lvbjogQ29weXJpZ2h0IFN2ZW5kIE9sYWYgTWlra2Vsc2VuLgorIQorISAgT3JpZ2luYWwgQyBjb2RlOiBDb3B5cmlnaHQgRXJpYyBBLiBZb3VuZy4KKyEKKyEgIFRoaXMgY29kZSBjYW4gYmUgZnJlZWx5IHVzZWQgYnkgTGliREVTL1NTTGVheS9PcGVuU1NMIHVzZXJzLgorIQorISAgVGhlIExpYkRFUy9TU0xlYXkvT3BlblNTTCBjb3B5cmlnaHQgbm90aWNlcyBtdXN0IGJlIHJlc3BlY3RlZC4KKyEKKyEgIFRoaXMgdmVyc2lvbiBjYW4gYmUgcmVkaXN0cmlidXRlZC4KKyEKKyEgIFRvIGV4cGFuZCB0aGUgbTQgbWFjcm9zOiBtNCAtQiA4MTkyIGRlc19lbmMubTQgPiBkZXNfZW5jLlMKKyEKKyEgIEdsb2JhbCByZWdpc3RlcnMgMSB0byA1IGFyZSB1c2VkLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGRvbmUgYnkgdGhlCishICBjYyBjb21waWxlci4gVGhlIFVsdHJhU1BBUkMgbG9hZC9zdG9yZSBsaXR0bGUgZW5kaWFuIGZlYXR1cmUgaXMgdXNlZC4KKyEKKyEgIEluc3RydWN0aW9uIGdyb3VwaW5nIG9mdGVuIHJlZmVycyB0byBvbmUgQ1BVIGN5Y2xlLgorIQorISAgQXNzZW1ibGUgdGhyb3VnaCBnY2M6IGdjYyAtYyAtbWNwdT11bHRyYXNwYXJjIC1vIGRlc19lbmMubyBkZXNfZW5jLlMKKyEKKyEgIEFzc2VtYmxlIHRocm91Z2ggY2M6ICBjYyAtYyAteGFyY2g9djhwbHVzYSAtbyBkZXNfZW5jLm8gZGVzX2VuYy5TCishCishICBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBhY2NvcmRpbmcgdG8gJy4vYXBwcy9vcGVuc3NsIHNwZWVkIGRlcycKKyEKKyEJMzItYml0IGJ1aWxkOgorIQkJMjMlICBmYXN0ZXIgdGhhbiBjYy01LjIgLXhhcmNoPXY4cGx1cyAteE81CishCQkxMTUlIGZhc3RlciB0aGFuIGdjYy0zLjIuMSAtbTMyIC1tY3B1PXVsdHJhc3BhcmMgLU81CishCTY0LWJpdCBidWlsZDoKKyEJCTUwJSAgZmFzdGVyIHRoYW4gY2MtNS4yIC14YXJjaD12OSAteE81CishCQkxMDAlIGZhc3RlciB0aGFuIGdjYy0zLjIuMSAtbTY0IC1tY3B1PXVsdHJhc3BhcmMgLU81CishCisKKy5pZGVudCAiZGVzX2VuYy5tNCAyLjEiCisuZmlsZSAgImRlc19lbmMtc3BhcmMuUyIKKworI2lmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgZGVmaW5lZChfX3NwYXJjdjkpCisjIGRlZmluZSBBQkk2NCAgLyogVGhleSd2ZSBzYWlkIC14YXJjaD12OSBhdCBjb21tYW5kIGxpbmUgKi8KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKKyMgZGVmaW5lIEFCSTY0ICAvKiBUaGV5J3ZlIHNhaWQgLW02NCBhdCBjb21tYW5kIGxpbmUgKi8KKyNlbmRpZgorCisjaWZkZWYgQUJJNjQKKyAgLnJlZ2lzdGVyCSVnMiwjc2NyYXRjaAorICAucmVnaXN0ZXIJJWczLCNzY3JhdGNoCisjIGRlZmluZQlGUkFNRQktMTkyCisjIGRlZmluZQlCSUFTCTIwNDcKKyMgZGVmaW5lCUxEUFRSCWxkeAorIyBkZWZpbmUJU1RQVFIJc3R4CisjIGRlZmluZQlBUkcwCTEyOAorIyBkZWZpbmUJQVJHU1oJOAorIyBpZm5kZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKyMgZGVmaW5lIE9QRU5TU0xfU1lTTkFNRV9VTFRSQVNQQVJDCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUJRlJBTUUJLTk2CisjIGRlZmluZQlCSUFTCTAKKyMgZGVmaW5lCUxEUFRSCWxkCisjIGRlZmluZQlTVFBUUglzdAorIyBkZWZpbmUJQVJHMAk2OAorIyBkZWZpbmUJQVJHU1oJNAorI2VuZGlmCisKKyNkZWZpbmUgTE9PUFMgNworCisjZGVmaW5lIGdsb2JhbDAgJWcwCisjZGVmaW5lIGdsb2JhbDEgJWcxCisjZGVmaW5lIGdsb2JhbDIgJWcyCisjZGVmaW5lIGdsb2JhbDMgJWczCisjZGVmaW5lIGdsb2JhbDQgJWc0CisjZGVmaW5lIGdsb2JhbDUgJWc1CisKKyNkZWZpbmUgbG9jYWwwICVsMAorI2RlZmluZSBsb2NhbDEgJWwxCisjZGVmaW5lIGxvY2FsMiAlbDIKKyNkZWZpbmUgbG9jYWwzICVsMworI2RlZmluZSBsb2NhbDQgJWw0CisjZGVmaW5lIGxvY2FsNSAlbDUKKyNkZWZpbmUgbG9jYWw3ICVsNgorI2RlZmluZSBsb2NhbDYgJWw3CisKKyNkZWZpbmUgaW4wICVpMAorI2RlZmluZSBpbjEgJWkxCisjZGVmaW5lIGluMiAlaTIKKyNkZWZpbmUgaW4zICVpMworI2RlZmluZSBpbjQgJWk0CisjZGVmaW5lIGluNSAlaTUKKyNkZWZpbmUgaW42ICVpNgorI2RlZmluZSBpbjcgJWk3CisKKyNkZWZpbmUgb3V0MCAlbzAKKyNkZWZpbmUgb3V0MSAlbzEKKyNkZWZpbmUgb3V0MiAlbzIKKyNkZWZpbmUgb3V0MyAlbzMKKyNkZWZpbmUgb3V0NCAlbzQKKyNkZWZpbmUgb3V0NSAlbzUKKyNkZWZpbmUgb3V0NiAlbzYKKyNkZWZpbmUgb3V0NyAlbzcKKworI2RlZmluZSBzdHViIHN0YgorCitjaGFuZ2VxdW90ZSh7LH0pCisKKworISBNYWNybyBkZWZpbml0aW9uczoKKworCishIHtpcF9tYWNyb30KKyEKKyEgVGhlIGxvZ2ljIHVzZWQgaW4gaW5pdGlhbCBhbmQgZmluYWwgcGVybXV0YXRpb25zIGlzIHRoZSBzYW1lIGFzIGluCishIHRoZSBDIGNvZGUuIFRoZSBwZXJtdXRhdGlvbnMgYXJlIGRvbmUgd2l0aCBhIGNsZXZlciBzaGlmdCwgeG9yLCBhbmQKKyEgdGVjaG5pcXVlLgorIQorISBUaGUgbWFjcm8gYWxzbyBsb2FkcyBhZGRyZXNzIHNib3ggMSB0byA1IHRvIGdsb2JhbCAxIHRvIDUsIGFkZHJlc3MKKyEgc2JveCA2IHRvIGxvY2FsNiwgYW5kIGFkZHJlcyBzYm94IDggdG8gb3V0My4KKyEKKyEgUm90YXRlcyB0aGUgaGFsZnMgMyBsZWZ0IHRvIGJyaW5nIHRoZSBzYm94IGJpdHMgaW4gY29udmVuaWVudCBwb3NpdGlvbnMuCishCishIExvYWRzIGtleSBmaXJzdCByb3VuZCBmcm9tIGFkZHJlc3MgaW4gcGFyYW1ldGVyIDUgdG8gb3V0MCwgb3V0MS4KKyEKKyEgQWZ0ZXIgdGhlIHRoZSBvcmlnaW5hbCBMaWJERVMgaW5pdGlhbCBwZXJtdXRhdGlvbiwgdGhlIHJlc3VsdGluZyBsZWZ0CishIGlzIGluIHRoZSB2YXJpYWJsZSBpbml0aWFsbHkgdXNlZCBmb3IgcmlnaHQgYW5kIHZpY2UgdmVyc2EuIFRoZSBtYWNybworISBpbXBsZW1lbnRzIHRoZSBwb3NzaWJpbGl0eSB0byBrZWVwIHRoZSBoYWxmcyBpbiB0aGUgb3JpZ2luYWwgcmVnaXN0ZXJzLgorIQorISBwYXJhbWV0ZXIgMSAgbGVmdAorISBwYXJhbWV0ZXIgMiAgcmlnaHQKKyEgcGFyYW1ldGVyIDMgIHJlc3VsdCBsZWZ0IChtb2RpZnkgaW4gZmlyc3Qgcm91bmQpCishIHBhcmFtZXRlciA0ICByZXN1bHQgcmlnaHQgKHVzZSBpbiBmaXJzdCByb3VuZCkKKyEgcGFyYW1ldGVyIDUgIGtleSBhZGRyZXNzCishIHBhcmFtZXRlciA2ICAxLzIgZm9yIGluY2x1ZGUgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCishIHBhcmFtZXRlciA3ICAxIGZvciBtb3ZlIGluMSB0byBpbjMKKyEgcGFyYW1ldGVyIDggIDEgZm9yIG1vdmUgaW4zIHRvIGluNCwgMiBmb3IgbW92ZSBpbjQgdG8gaW4zCishIHBhcmFtZXRlciA5ICAxIGZvciBsb2FkIGtzMyBhbmQga3MyIHRvIGluNCBhbmQgaW4zCisKK2RlZmluZShpcF9tYWNybywgeworCishIHtpcF9tYWNyb30KKyEgJDEgJDIgJDQgJDMgJDUgJDYgJDcgJDggJDkKKworCWxkCVtvdXQyKzI1Nl0sIGxvY2FsMQorCXNybAkkMiwgNCwgbG9jYWw0CisKKwl4b3IJbG9jYWw0LCAkMSwgbG9jYWw0CisJaWZlbHNlKCQ3LDEse21vdiBpbjEsIGluM30se25vcH0pCisKKwlsZAlbb3V0MisyNjBdLCBsb2NhbDIKKwlhbmQJbG9jYWw0LCBsb2NhbDEsIGxvY2FsNAorCWlmZWxzZSgkOCwxLHttb3YgaW4zLCBpbjR9LHt9KQorCWlmZWxzZSgkOCwyLHttb3YgaW40LCBpbjN9LHt9KQorCisJbGQJW291dDIrMjgwXSwgb3V0NCAgICAgICAgICAhIGxvb3AgY291bnRlcgorCXNsbAlsb2NhbDQsIDQsIGxvY2FsMQorCXhvcgkkMSwgbG9jYWw0LCAkMQorCisJbGQJW291dDIrMjY0XSwgbG9jYWwzCisJc3JsCSQxLCAxNiwgbG9jYWw0CisJeG9yCSQyLCBsb2NhbDEsICQyCisKKwlpZmVsc2UoJDksMSx7TERQVFIJS1MzLCBpbjR9LHt9KQorCXhvcglsb2NhbDQsICQyLCBsb2NhbDQKKwlub3AJIXNldGhpCSVoaShERVNfU1B0cmFucyksIGdsb2JhbDEgISBzYm94IGFkZHIKKworCWlmZWxzZSgkOSwxLHtMRFBUUglLUzIsIGluM30se30pCisJYW5kCWxvY2FsNCwgbG9jYWwyLCBsb2NhbDQKKwlub3AJIW9yCWdsb2JhbDEsICVsbyhERVNfU1B0cmFucyksIGdsb2JhbDEgICAhIHNib3ggYWRkcgorCisJc2xsCWxvY2FsNCwgMTYsIGxvY2FsMQorCXhvcgkkMiwgbG9jYWw0LCAkMgorCisJc3JsCSQyLCAyLCBsb2NhbDQKKwl4b3IJJDEsIGxvY2FsMSwgJDEKKworCXNldGhpCSVoaSgxNjcxMTY4MCksIGxvY2FsNQorCXhvcglsb2NhbDQsICQxLCBsb2NhbDQKKworCWFuZAlsb2NhbDQsIGxvY2FsMywgbG9jYWw0CisJb3IJbG9jYWw1LCAyNTUsIGxvY2FsNQorCisJc2xsCWxvY2FsNCwgMiwgbG9jYWwyCisJeG9yCSQxLCBsb2NhbDQsICQxCisKKwlzcmwJJDEsIDgsIGxvY2FsNAorCXhvcgkkMiwgbG9jYWwyLCAkMgorCisJeG9yCWxvY2FsNCwgJDIsIGxvY2FsNAorCWFkZAlnbG9iYWwxLCA3NjgsIGdsb2JhbDQKKworCWFuZAlsb2NhbDQsIGxvY2FsNSwgbG9jYWw0CisJYWRkCWdsb2JhbDEsIDEwMjQsIGdsb2JhbDUKKworCWxkCVtvdXQyKzI3Ml0sIGxvY2FsNworCXNsbAlsb2NhbDQsIDgsIGxvY2FsMQorCXhvcgkkMiwgbG9jYWw0LCAkMgorCisJc3JsCSQyLCAxLCBsb2NhbDQKKwl4b3IJJDEsIGxvY2FsMSwgJDEKKworCWxkCVskNV0sIG91dDAgICAgICAgICAgICAgICAgISBrZXkgNzUzMQorCXhvcglsb2NhbDQsICQxLCBsb2NhbDQKKwlhZGQJZ2xvYmFsMSwgMjU2LCBnbG9iYWwyCisKKwlsZAlbJDUrNF0sIG91dDEgICAgICAgICAgICAgICEga2V5IDg2NDIKKwlhbmQJbG9jYWw0LCBsb2NhbDcsIGxvY2FsNAorCWFkZAlnbG9iYWwxLCA1MTIsIGdsb2JhbDMKKworCXNsbAlsb2NhbDQsIDEsIGxvY2FsMQorCXhvcgkkMSwgbG9jYWw0LCAkMQorCisJc2xsCSQxLCAzLCBsb2NhbDMKKwl4b3IJJDIsIGxvY2FsMSwgJDIKKworCXNsbAkkMiwgMywgbG9jYWwyCisJYWRkCWdsb2JhbDEsIDEyODAsIGxvY2FsNiAgICAgISBhZGRyZXNzIHNib3ggOAorCisJc3JsCSQxLCAyOSwgbG9jYWw0CisJYWRkCWdsb2JhbDEsIDE3OTIsIG91dDMgICAgICAgISBhZGRyZXNzIHNib3ggOAorCisJc3JsCSQyLCAyOSwgbG9jYWwxCisJb3IJbG9jYWw0LCBsb2NhbDMsICQ0CisKKwlvcglsb2NhbDIsIGxvY2FsMSwgJDMKKworCWlmZWxzZSgkNiwgMSwgeworCisJCWxkCVtvdXQyKzI4NF0sIGxvY2FsNSAgICAgISAweDAwMDBGQzAwIHVzZWQgaW4gdGhlIHJvdW5kcworCQlvcglsb2NhbDIsIGxvY2FsMSwgJDMKKwkJeG9yCSQ0LCBvdXQwLCBsb2NhbDEKKworCQljYWxsIC5kZXNfZW5jLjEKKwkJYW5kCWxvY2FsMSwgMjUyLCBsb2NhbDEKKworCX0se30pCisKKwlpZmVsc2UoJDYsIDIsIHsKKworCQlsZAlbb3V0MisyODRdLCBsb2NhbDUgICAgICEgMHgwMDAwRkMwMCB1c2VkIGluIHRoZSByb3VuZHMKKwkJb3IJbG9jYWwyLCBsb2NhbDEsICQzCisJCXhvcgkkNCwgb3V0MCwgbG9jYWwxCisKKwkJY2FsbCAuZGVzX2RlYy4xCisJCWFuZAlsb2NhbDEsIDI1MiwgbG9jYWwxCisKKwl9LHt9KQorfSkKKworCishIHtyb3VuZHNfbWFjcm99CishCishIFRoZSBsb2dpYyB1c2VkIGluIHRoZSBERVMgcm91bmRzIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBDIGNvZGUsCishIGV4Y2VwdCB0aGF0IGNhbGN1bGF0aW9ucyBmb3Igc2JveCAxIGFuZCBzYm94IDUgYmVnaW4gYmVmb3JlCishIHRoZSBwcmV2aW91cyByb3VuZCBpcyBmaW5pc2hlZC4KKyEKKyEgSW4gZWFjaCByb3VuZCBvbmUgaGFsZiAod29yaykgaXMgbW9kaWZpZWQgYmFzZWQgb24ga2V5IGFuZCB0aGUKKyEgb3RoZXIgaGFsZiAodXNlKS4KKyEKKyEgSW4gdGhpcyB2ZXJzaW9uIHdlIGRvIHR3byByb3VuZHMgaW4gYSBsb29wIHJlcGVhdGVkIDcgdGltZXMKKyEgYW5kIHR3byByb3VuZHMgc2VwZXJhdGVseS4KKyEKKyEgT25lIGhhbGYgaGFzIHRoZSBiaXRzIGZvciB0aGUgc2JveGVzIGluIHRoZSBmb2xsb3dpbmcgcG9zaXRpb25zOgorIQorIQk3Nzc3Nzd4eDU1NTU1NXh4MzMzMzMzeHgxMTExMTF4eAorIQorIQk4OHh4NjY2NjY2eHg0NDQ0NDR4eDIyMjIyMnh4ODg4OAorIQorISBUaGUgYml0cyBmb3IgZWFjaCBzYm94IGFyZSB4b3ItZWQgd2l0aCB0aGUga2V5IGJpdHMgZm9yIHRoYXQgYm94LgorISBUaGUgYWJvdmUgeHggYml0cyBhcmUgY2xlYXJlZCwgYW5kIHRoZSByZXN1bHQgdXNlZCBmb3IgbG9va3VwIGluCishIHRoZSBzYm94IHRhYmxlLiBFYWNoIHNib3ggZW50cnkgY29udGFpbnMgdGhlIDQgb3V0cHV0IGJpdHMgcGVybXV0ZWQKKyEgaW50byAzMiBiaXRzIGFjY29yZGluZyB0byB0aGUgUCBwZXJtdXRhdGlvbi4KKyEKKyEgSW4gdGhlIGRlc2NyaXB0aW9uIG9mIERFUywgbGVmdCBhbmQgcmlnaHQgYXJlIHN3aXRjaGVkIGFmdGVyCishIGVhY2ggcm91bmQsIGV4Y2VwdCBhZnRlciBsYXN0IHJvdW5kLiBJbiB0aGlzIGNvZGUgdGhlIG9yaWdpbmFsCishIGxlZnQgYW5kIHJpZ2h0IGFyZSBrZXB0IGluIHRoZSBzYW1lIHJlZ2lzdGVyIGluIGFsbCByb3VuZHMsIG1lYW5pbmcKKyEgdGhhdCBhZnRlciB0aGUgMTYgcm91bmRzIHRoZSByZXN1bHQgZm9yIHJpZ2h0IGlzIGluIHRoZSByZWdpc3RlcgorISBvcmlnaW5hbGx5IHVzZWQgZm9yIGxlZnQuCishCishIHBhcmFtZXRlciAxICBmaXJzdCB3b3JrIChsZWZ0IGluIGZpcnN0IHJvdW5kKQorISBwYXJhbWV0ZXIgMiAgZmlyc3QgdXNlIChyaWdodCBpbiBmaXJzdCByb3VuZCkKKyEgcGFyYW1ldGVyIDMgIGVuYy9kZWMgIDEvLTEKKyEgcGFyYW1ldGVyIDQgIGxvb3AgbGFiZWwKKyEgcGFyYW1ldGVyIDUgIGtleSBhZGRyZXNzIHJlZ2lzdGVyCishIHBhcmFtZXRlciA2ICBvcHRpb25hbCBhZGRyZXNzIGZvciBrZXkgbmV4dCBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKyEgcGFyYW1ldGVyIDcgIG5vdCBlbXB0eSBmb3IgaW5jbHVkZSByZXRsCishCishIGFsc28gY29tcGFyZXMgaW4yIHRvIDgKKworZGVmaW5lKHJvdW5kc19tYWNybywgeworCishIHtyb3VuZHNfbWFjcm99CishICQxICQyICQzICQ0ICQ1ICQ2ICQ3ICQ4ICQ5CisKKwl4b3IJJDIsIG91dDAsIGxvY2FsMQorCisJbGQJW291dDIrMjg0XSwgbG9jYWw1ICAgICAgICAhIDB4MDAwMEZDMDAKKwliYQkkNAorCWFuZAlsb2NhbDEsIDI1MiwgbG9jYWwxCisKKwkuYWxpZ24gMzIKKworJDQ6CisJISBsb2NhbDYgaXMgYWRkcmVzcyBzYm94IDYKKwkhIG91dDMgICBpcyBhZGRyZXNzIHNib3ggOAorCSEgb3V0NCAgIGlzIGxvb3AgY291bnRlcgorCisJbGQJW2dsb2JhbDErbG9jYWwxXSwgbG9jYWwxCisJeG9yCSQyLCBvdXQxLCBvdXQxICAgICAgICAgICAgISA4NjQyCisJeG9yCSQyLCBvdXQwLCBvdXQwICAgICAgICAgICAgISA3NTMxCisJISBmbW92cwklZjAsICVmMCAgICAgICAgICAgICAgICAgICEgZnhvciB1c2VkIGZvciBhbGlnbm1lbnQKKworCXNybAlvdXQxLCA0LCBsb2NhbDAgICAgICAgICAgICEgcm90YXRlIDQgcmlnaHQKKwlhbmQJb3V0MCwgbG9jYWw1LCBsb2NhbDMgICAgICAhIDMKKwkhIGZtb3ZzCSVmMCwgJWYwCisKKwlsZAlbJDUrJDMqOF0sIGxvY2FsNyAgICAgICAgICEga2V5IDc1MzEgbmV4dCByb3VuZAorCXNybAlsb2NhbDMsIDgsIGxvY2FsMyAgICAgICAgICEgMworCWFuZAlsb2NhbDAsIDI1MiwgbG9jYWwyICAgICAgICEgMgorCSEgZm1vdnMJJWYwLCAlZjAKKworCWxkCVtnbG9iYWwzK2xvY2FsM10sbG9jYWwzICAgISAzCisJc2xsCW91dDEsIDI4LCBvdXQxICAgICAgICAgICAgISByb3RhdGUKKwl4b3IJJDEsIGxvY2FsMSwgJDEgICAgICAgICAgICAhIDEgZmluaXNoZWQsIGxvY2FsMSBub3cgc2JveCA3CisKKwlsZAlbZ2xvYmFsMitsb2NhbDJdLCBsb2NhbDIgICEgMiAKKwlzcmwJb3V0MCwgMjQsIGxvY2FsMSAgICAgICAgICAhIDcKKwlvcglvdXQxLCBsb2NhbDAsIG91dDEgICAgICAgICEgcm90YXRlCisKKwlsZHViCVtvdXQyK2xvY2FsMV0sIGxvY2FsMSAgICAgISA3IChhbmQgMHhGQykKKwlzcmwJb3V0MSwgMjQsIGxvY2FsMCAgICAgICAgICAhIDgKKwlhbmQJb3V0MSwgbG9jYWw1LCBsb2NhbDQgICAgICAhIDQKKworCWxkdWIJW291dDIrbG9jYWwwXSwgbG9jYWwwICAgICAhIDggKGFuZCAweEZDKQorCXNybAlsb2NhbDQsIDgsIGxvY2FsNCAgICAgICAgICEgNAorCXhvcgkkMSwgbG9jYWwyLCAkMSAgICAgICAgICAgICEgMiBmaW5pc2hlZCBsb2NhbDIgbm93IHNib3ggNgorCisJbGQJW2dsb2JhbDQrbG9jYWw0XSxsb2NhbDQgICAhIDQKKwlzcmwJb3V0MSwgMTYsIGxvY2FsMiAgICAgICAgICAhIDYKKwl4b3IJJDEsIGxvY2FsMywgJDEgICAgICAgICAgICAhIDMgZmluaXNoZWQgbG9jYWwzIG5vdyBzYm94IDUKKworCWxkCVtvdXQzK2xvY2FsMF0sbG9jYWwwICAgICAgISA4CisJYW5kCWxvY2FsMiwgMjUyLCBsb2NhbDIgICAgICAgISA2CisJYWRkCWdsb2JhbDEsIDE1MzYsIGxvY2FsNSAgICAgISBhZGRyZXNzIHNib3ggNworCisJbGQJW2xvY2FsNitsb2NhbDJdLCBsb2NhbDIgICAhIDYKKwlzcmwJb3V0MCwgMTYsIGxvY2FsMyAgICAgICAgICAhIDUKKwl4b3IJJDEsIGxvY2FsNCwgJDEgICAgICAgICAgICAhIDQgZmluaXNoZWQKKworCWxkCVtsb2NhbDUrbG9jYWwxXSxsb2NhbDEgICAgISA3CisJYW5kCWxvY2FsMywgMjUyLCBsb2NhbDMgICAgICAgISA1CisJeG9yCSQxLCBsb2NhbDAsICQxICAgICAgICAgICAgISA4IGZpbmlzaGVkCisKKwlsZAlbZ2xvYmFsNStsb2NhbDNdLGxvY2FsMyAgICEgNQorCXhvcgkkMSwgbG9jYWwyLCAkMSAgICAgICAgICAgICEgNiBmaW5pc2hlZAorCXN1YmNjCW91dDQsIDEsIG91dDQKKworCWxkCVskNSskMyo4KzRdLCBvdXQwICAgICAgICAgISBrZXkgODY0MiBuZXh0IHJvdW5kCisJeG9yCSQxLCBsb2NhbDcsIGxvY2FsMiAgICAgICAgISBzYm94IDUgbmV4dCByb3VuZAorCXhvcgkkMSwgbG9jYWwxLCAkMSAgICAgICAgICAgICEgNyBmaW5pc2hlZAorCisJc3JsCWxvY2FsMiwgMTYsIGxvY2FsMiAgICAgICAgISBzYm94IDUgbmV4dCByb3VuZAorCXhvcgkkMSwgbG9jYWwzLCAkMSAgICAgICAgICAgICEgNSBmaW5pc2hlZAorCisJbGQJWyQ1KyQzKjE2KzRdLCBvdXQxICAgICAgICAhIGtleSA4NjQyIG5leHQgcm91bmQgYWdhaW4KKwlhbmQJbG9jYWwyLCAyNTIsIGxvY2FsMiAgICAgICAhIHNib3g1IG5leHQgcm91bmQKKyEgbmV4dCByb3VuZAorCXhvcgkkMSwgbG9jYWw3LCBsb2NhbDcgICAgICAgICEgNzUzMQorCisJbGQJW2dsb2JhbDUrbG9jYWwyXSwgbG9jYWwyICAhIDUKKwlzcmwJbG9jYWw3LCAyNCwgbG9jYWwzICAgICAgICAhIDcKKwl4b3IJJDEsIG91dDAsIG91dDAgICAgICAgICAgICAhIDg2NDIKKworCWxkdWIJW291dDIrbG9jYWwzXSwgbG9jYWwzICAgICAhIDcgKGFuZCAweEZDKQorCXNybAlvdXQwLCA0LCBsb2NhbDAgICAgICAgICAgICEgcm90YXRlIDQgcmlnaHQKKwlhbmQJbG9jYWw3LCAyNTIsIGxvY2FsMSAgICAgICAhIDEKKworCXNsbAlvdXQwLCAyOCwgb3V0MCAgICAgICAgICAgICEgcm90YXRlCisJeG9yCSQyLCBsb2NhbDIsICQyICAgICAgICAgICAgISA1IGZpbmlzaGVkIGxvY2FsMiB1c2VkCisKKwlzcmwJbG9jYWwwLCA4LCBsb2NhbDQgICAgICAgICAhIDQKKwlhbmQJbG9jYWwwLCAyNTIsIGxvY2FsMiAgICAgICAhIDIKKwlsZAlbbG9jYWw1K2xvY2FsM10sIGxvY2FsMyAgICEgNworCisJc3JsCWxvY2FsMCwgMTYsIGxvY2FsNSAgICAgICAgISA2CisJb3IJb3V0MCwgbG9jYWwwLCBvdXQwICAgICAgICAhIHJvdGF0ZQorCWxkCVtnbG9iYWwyK2xvY2FsMl0sIGxvY2FsMiAgISAyCisKKwlzcmwJb3V0MCwgMjQsIGxvY2FsMAorCWxkCVskNSskMyoxNl0sIG91dDAgICAgICAgICAgISBrZXkgNzUzMSBuZXh0IHJvdW5kCisJYW5kCWxvY2FsNCwgMjUyLCBsb2NhbDQJICAhIDQKKworCWFuZAlsb2NhbDUsIDI1MiwgbG9jYWw1ICAgICAgICEgNgorCWxkCVtnbG9iYWw0K2xvY2FsNF0sIGxvY2FsNCAgISA0CisJeG9yCSQyLCBsb2NhbDMsICQyICAgICAgICAgICAgISA3IGZpbmlzaGVkIGxvY2FsMyB1c2VkCisKKwlhbmQJbG9jYWwwLCAyNTIsIGxvY2FsMCAgICAgICAhIDgKKwlsZAlbbG9jYWw2K2xvY2FsNV0sIGxvY2FsNSAgICEgNgorCXhvcgkkMiwgbG9jYWwyLCAkMiAgICAgICAgICAgICEgMiBmaW5pc2hlZCBsb2NhbDIgbm93IHNib3ggMworCisJc3JsCWxvY2FsNywgOCwgbG9jYWwyICAgICAgICAgISAzIHN0YXJ0CisJbGQJW291dDMrbG9jYWwwXSwgbG9jYWwwICAgICAhIDgKKwl4b3IJJDIsIGxvY2FsNCwgJDIgICAgICAgICAgICAhIDQgZmluaXNoZWQKKworCWFuZAlsb2NhbDIsIDI1MiwgbG9jYWwyICAgICAgICEgMworCWxkCVtnbG9iYWwxK2xvY2FsMV0sIGxvY2FsMSAgISAxCisJeG9yCSQyLCBsb2NhbDUsICQyICAgICAgICAgICAgISA2IGZpbmlzaGVkIGxvY2FsNSB1c2VkCisKKwlsZAlbZ2xvYmFsMytsb2NhbDJdLCBsb2NhbDIgICEgMworCXhvcgkkMiwgbG9jYWwwLCAkMiAgICAgICAgICAgICEgOCBmaW5pc2hlZAorCWFkZAkkNSwgJDMqMTYsICQ1ICAgICAgICAgICAgICEgZW5jIGFkZCA4LCBkZWMgYWRkIC04IHRvIGtleSBwb2ludGVyCisKKwlsZAlbb3V0MisyODRdLCBsb2NhbDUgICAgICAgICEgMHgwMDAwRkMwMAorCXhvcgkkMiwgb3V0MCwgbG9jYWw0ICAgICAgICAgICEgc2JveCAxIG5leHQgcm91bmQKKwl4b3IJJDIsIGxvY2FsMSwgJDIgICAgICAgICAgICAhIDEgZmluaXNoZWQKKworCXhvcgkkMiwgbG9jYWwyLCAkMiAgICAgICAgICAgICEgMyBmaW5pc2hlZAorI2lmZGVmIE9QRU5TU0xfU1lTTkFNRV9VTFRSQVNQQVJDCisJYm5lLHB0CSVpY2MsICQ0CisjZWxzZQorCWJuZQkkNAorI2VuZGlmCisJYW5kCWxvY2FsNCwgMjUyLCBsb2NhbDEgICAgICAgISBzYm94IDEgbmV4dCByb3VuZAorCishIHR3byByb3VuZHMgbW9yZToKKworCWxkCVtnbG9iYWwxK2xvY2FsMV0sIGxvY2FsMQorCXhvcgkkMiwgb3V0MSwgb3V0MQorCXhvcgkkMiwgb3V0MCwgb3V0MAorCisJc3JsCW91dDEsIDQsIGxvY2FsMCAgICAgICAgICAgISByb3RhdGUKKwlhbmQJb3V0MCwgbG9jYWw1LCBsb2NhbDMKKworCWxkCVskNSskMyo4XSwgbG9jYWw3ICAgICAgICAgISBrZXkgNzUzMQorCXNybAlsb2NhbDMsIDgsIGxvY2FsMworCWFuZAlsb2NhbDAsIDI1MiwgbG9jYWwyCisKKwlsZAlbZ2xvYmFsMytsb2NhbDNdLGxvY2FsMworCXNsbAlvdXQxLCAyOCwgb3V0MSAgICAgICAgICAgICEgcm90YXRlCisJeG9yCSQxLCBsb2NhbDEsICQxICAgICAgICAgICAgISAxIGZpbmlzaGVkLCBsb2NhbDEgbm93IHNib3ggNworCisJbGQJW2dsb2JhbDIrbG9jYWwyXSwgbG9jYWwyCisJc3JsCW91dDAsIDI0LCBsb2NhbDEKKwlvcglvdXQxLCBsb2NhbDAsIG91dDEgICAgICAgICEgcm90YXRlCisKKwlsZHViCVtvdXQyK2xvY2FsMV0sIGxvY2FsMQorCXNybAlvdXQxLCAyNCwgbG9jYWwwCisJYW5kCW91dDEsIGxvY2FsNSwgbG9jYWw0CisKKwlsZHViCVtvdXQyK2xvY2FsMF0sIGxvY2FsMAorCXNybAlsb2NhbDQsIDgsIGxvY2FsNAorCXhvcgkkMSwgbG9jYWwyLCAkMSAgICAgICAgICAgICEgMiBmaW5pc2hlZCBsb2NhbDIgbm93IHNib3ggNgorCisJbGQJW2dsb2JhbDQrbG9jYWw0XSxsb2NhbDQKKwlzcmwJb3V0MSwgMTYsIGxvY2FsMgorCXhvcgkkMSwgbG9jYWwzLCAkMSAgICAgICAgICAgICEgMyBmaW5pc2hlZCBsb2NhbDMgbm93IHNib3ggNQorCisJbGQJW291dDMrbG9jYWwwXSxsb2NhbDAKKwlhbmQJbG9jYWwyLCAyNTIsIGxvY2FsMgorCWFkZAlnbG9iYWwxLCAxNTM2LCBsb2NhbDUgICAgICEgYWRkcmVzcyBzYm94IDcKKworCWxkCVtsb2NhbDYrbG9jYWwyXSwgbG9jYWwyCisJc3JsCW91dDAsIDE2LCBsb2NhbDMKKwl4b3IJJDEsIGxvY2FsNCwgJDEgICAgICAgICAgICAhIDQgZmluaXNoZWQKKworCWxkCVtsb2NhbDUrbG9jYWwxXSxsb2NhbDEKKwlhbmQJbG9jYWwzLCAyNTIsIGxvY2FsMworCXhvcgkkMSwgbG9jYWwwLCAkMQorCisJbGQJW2dsb2JhbDUrbG9jYWwzXSxsb2NhbDMKKwl4b3IJJDEsIGxvY2FsMiwgJDEgICAgICAgICAgICAhIDYgZmluaXNoZWQKKwljbXAJaW4yLCA4CisKKwlpZmVsc2UoJDYse30sIHt9LCB7bGQJW291dDIrMjgwXSwgb3V0NH0pICAhIGxvb3AgY291bnRlcgorCXhvcgkkMSwgbG9jYWw3LCBsb2NhbDIgICAgICAgICEgc2JveCA1IG5leHQgcm91bmQKKwl4b3IJJDEsIGxvY2FsMSwgJDEgICAgICAgICAgICAhIDcgZmluaXNoZWQKKworCWxkCVskNSskMyo4KzRdLCBvdXQwCisJc3JsCWxvY2FsMiwgMTYsIGxvY2FsMiAgICAgICAgISBzYm94IDUgbmV4dCByb3VuZAorCXhvcgkkMSwgbG9jYWwzLCAkMSAgICAgICAgICAgICEgNSBmaW5pc2hlZAorCisJYW5kCWxvY2FsMiwgMjUyLCBsb2NhbDIKKyEgbmV4dCByb3VuZCAodHdvIHJvdW5kcyBtb3JlKQorCXhvcgkkMSwgbG9jYWw3LCBsb2NhbDcgICAgICAgICEgNzUzMQorCisJbGQJW2dsb2JhbDUrbG9jYWwyXSwgbG9jYWwyCisJc3JsCWxvY2FsNywgMjQsIGxvY2FsMworCXhvcgkkMSwgb3V0MCwgb3V0MCAgICAgICAgICAgICEgODY0MgorCisJbGR1Yglbb3V0Mitsb2NhbDNdLCBsb2NhbDMKKwlzcmwJb3V0MCwgNCwgbG9jYWwwICAgICAgICAgICAhIHJvdGF0ZQorCWFuZAlsb2NhbDcsIDI1MiwgbG9jYWwxCisKKwlzbGwJb3V0MCwgMjgsIG91dDAgICAgICAgICAgICAhIHJvdGF0ZQorCXhvcgkkMiwgbG9jYWwyLCAkMiAgICAgICAgICAgICEgNSBmaW5pc2hlZCBsb2NhbDIgdXNlZAorCisJc3JsCWxvY2FsMCwgOCwgbG9jYWw0CisJYW5kCWxvY2FsMCwgMjUyLCBsb2NhbDIKKwlsZAlbbG9jYWw1K2xvY2FsM10sIGxvY2FsMworCisJc3JsCWxvY2FsMCwgMTYsIGxvY2FsNQorCW9yCW91dDAsIGxvY2FsMCwgb3V0MCAgICAgICAgISByb3RhdGUKKwlsZAlbZ2xvYmFsMitsb2NhbDJdLCBsb2NhbDIKKworCXNybAlvdXQwLCAyNCwgbG9jYWwwCisJaWZlbHNlKCQ2LHt9LCB7fSwge2xkCVskNl0sIG91dDB9KSAgICEga2V5IG5leHQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisJYW5kCWxvY2FsNCwgMjUyLCBsb2NhbDQKKworCWFuZAlsb2NhbDUsIDI1MiwgbG9jYWw1CisJbGQJW2dsb2JhbDQrbG9jYWw0XSwgbG9jYWw0CisJeG9yCSQyLCBsb2NhbDMsICQyICAgICAgICAgICAgISA3IGZpbmlzaGVkIGxvY2FsMyB1c2VkCisKKwlhbmQJbG9jYWwwLCAyNTIsIGxvY2FsMAorCWxkCVtsb2NhbDYrbG9jYWw1XSwgbG9jYWw1CisJeG9yCSQyLCBsb2NhbDIsICQyICAgICAgICAgICAgISAyIGZpbmlzaGVkIGxvY2FsMiBub3cgc2JveCAzCisKKwlzcmwJbG9jYWw3LCA4LCBsb2NhbDIgICAgICAgICAhIDMgc3RhcnQKKwlsZAlbb3V0Mytsb2NhbDBdLCBsb2NhbDAKKwl4b3IJJDIsIGxvY2FsNCwgJDIKKworCWFuZAlsb2NhbDIsIDI1MiwgbG9jYWwyCisJbGQJW2dsb2JhbDErbG9jYWwxXSwgbG9jYWwxCisJeG9yCSQyLCBsb2NhbDUsICQyICAgICAgICAgICAgISA2IGZpbmlzaGVkIGxvY2FsNSB1c2VkCisKKwlsZAlbZ2xvYmFsMytsb2NhbDJdLCBsb2NhbDIKKwlzcmwJJDEsIDMsIGxvY2FsMworCXhvcgkkMiwgbG9jYWwwLCAkMgorCisJaWZlbHNlKCQ2LHt9LCB7fSwge2xkCVskNis0XSwgb3V0MX0pICEga2V5IG5leHQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisJc2xsCSQxLCAyOSwgbG9jYWw0CisJeG9yCSQyLCBsb2NhbDEsICQyCisKKwlpZmVsc2UoJDcse30sIHt9LCB7cmV0bH0pCisJeG9yCSQyLCBsb2NhbDIsICQyCit9KQorCisKKyEge2ZwX21hY3JvfQorIQorISAgcGFyYW1ldGVyIDEgICByaWdodCAob3JpZ2luYWwgbGVmdCkKKyEgIHBhcmFtZXRlciAyICAgbGVmdCAob3JpZ2luYWwgcmlnaHQpCishICBwYXJhbWV0ZXIgMyAgIDEgZm9yIG9wdGlvbmFsIHN0b3JlIHRvIFtpbjBdCishICBwYXJhbWV0ZXIgNCAgIDEgZm9yIGxvYWQgaW5wdXQvb3V0cHV0IGFkZHJlc3MgdG8gbG9jYWw1LzcKKyEKKyEgIFRoZSBmaW5hbCBwZXJtdXRhdGlvbiBsb2dpYyBzd2l0Y2hlcyB0aGUgaGFsZmVzLCBtZWFuaW5nIHRoYXQKKyEgIGxlZnQgYW5kIHJpZ2h0IGVuZHMgdXAgdGhlIHRoZSByZWdpc3RlcnMgb3JpZ2luYWxseSB1c2VkLgorCitkZWZpbmUoZnBfbWFjcm8sIHsKKworISB7ZnBfbWFjcm99CishICQxICQyICQzICQ0ICQ1ICQ2ICQ3ICQ4ICQ5CisKKwkhIGluaXRpYWxseSB1bmRvIHRoZSByb3RhdGUgMyBsZWZ0IGRvbmUgYWZ0ZXIgaW5pdGlhbCBwZXJtdXRhdGlvbgorCSEgb3JpZ2luYWwgbGVmdCBpcyByZWNlaXZlZCBzaGlmdGVkIDMgcmlnaHQgYW5kIDI5IGxlZnQgaW4gbG9jYWwzLzQKKworCXNsbAkkMiwgMjksIGxvY2FsMQorCW9yCWxvY2FsMywgbG9jYWw0LCAkMQorCisJc3JsCSQyLCAzLCAkMgorCXNldGhpCSVoaSgweDU1NTU1NTU1KSwgbG9jYWwyCisKKwlvcgkkMiwgbG9jYWwxLCAkMgorCW9yCWxvY2FsMiwgJWxvKDB4NTU1NTU1NTUpLCBsb2NhbDIKKworCXNybAkkMiwgMSwgbG9jYWwzCisJc2V0aGkJJWhpKDB4MDBmZjAwZmYpLCBsb2NhbDEKKwl4b3IJbG9jYWwzLCAkMSwgbG9jYWwzCisJb3IJbG9jYWwxLCAlbG8oMHgwMGZmMDBmZiksIGxvY2FsMQorCWFuZAlsb2NhbDMsIGxvY2FsMiwgbG9jYWwzCisJc2V0aGkJJWhpKDB4MzMzMzMzMzMpLCBsb2NhbDQKKwlzbGwJbG9jYWwzLCAxLCBsb2NhbDIKKworCXhvcgkkMSwgbG9jYWwzLCAkMQorCisJc3JsCSQxLCA4LCBsb2NhbDMKKwl4b3IJJDIsIGxvY2FsMiwgJDIKKwl4b3IJbG9jYWwzLCAkMiwgbG9jYWwzCisJb3IJbG9jYWw0LCAlbG8oMHgzMzMzMzMzMyksIGxvY2FsNAorCWFuZAlsb2NhbDMsIGxvY2FsMSwgbG9jYWwzCisJc2V0aGkJJWhpKDB4MDAwMGZmZmYpLCBsb2NhbDEKKwlzbGwJbG9jYWwzLCA4LCBsb2NhbDIKKworCXhvcgkkMiwgbG9jYWwzLCAkMgorCisJc3JsCSQyLCAyLCBsb2NhbDMKKwl4b3IJJDEsIGxvY2FsMiwgJDEKKwl4b3IJbG9jYWwzLCAkMSwgbG9jYWwzCisJb3IJbG9jYWwxLCAlbG8oMHgwMDAwZmZmZiksIGxvY2FsMQorCWFuZAlsb2NhbDMsIGxvY2FsNCwgbG9jYWwzCisJc2V0aGkJJWhpKDB4MGYwZjBmMGYpLCBsb2NhbDQKKwlzbGwJbG9jYWwzLCAyLCBsb2NhbDIKKworCWlmZWxzZSgkNCwxLCB7TERQVFIgSU5QVVQsIGxvY2FsNX0pCisJeG9yCSQxLCBsb2NhbDMsICQxCisKKwlpZmVsc2UoJDQsMSwge0xEUFRSIE9VVFBVVCwgbG9jYWw3fSkKKwlzcmwJJDEsIDE2LCBsb2NhbDMKKwl4b3IJJDIsIGxvY2FsMiwgJDIKKwl4b3IJbG9jYWwzLCAkMiwgbG9jYWwzCisJb3IJbG9jYWw0LCAlbG8oMHgwZjBmMGYwZiksIGxvY2FsNAorCWFuZAlsb2NhbDMsIGxvY2FsMSwgbG9jYWwzCisJc2xsCWxvY2FsMywgMTYsIGxvY2FsMgorCisJeG9yCSQyLCBsb2NhbDMsIGxvY2FsMQorCisJc3JsCWxvY2FsMSwgNCwgbG9jYWwzCisJeG9yCSQxLCBsb2NhbDIsICQxCisJeG9yCWxvY2FsMywgJDEsIGxvY2FsMworCWFuZAlsb2NhbDMsIGxvY2FsNCwgbG9jYWwzCisJc2xsCWxvY2FsMywgNCwgbG9jYWwyCisKKwl4b3IJJDEsIGxvY2FsMywgJDEKKworCSEgb3B0aW9uYWwgc3RvcmU6CisKKwlpZmVsc2UoJDMsMSwge3N0ICQxLCBbaW4wXX0pCisKKwl4b3IJbG9jYWwxLCBsb2NhbDIsICQyCisKKwlpZmVsc2UoJDMsMSwge3N0ICQyLCBbaW4wKzRdfSkKKworfSkKKworCishIHtmcF9pcF9tYWNyb30KKyEKKyEgRG9lcyBpbml0aWFsIHBlcm11dGF0aW9uIGZvciBuZXh0IGJsb2NrIG1peGVkIHdpdGgKKyEgZmluYWwgcGVybXV0YXRpb24gZm9yIGN1cnJlbnQgYmxvY2suCishCishIHBhcmFtZXRlciAxICAgb3JpZ2luYWwgbGVmdAorISBwYXJhbWV0ZXIgMiAgIG9yaWdpbmFsIHJpZ2h0CishIHBhcmFtZXRlciAzICAgbGVmdCBpcAorISBwYXJhbWV0ZXIgNCAgIHJpZ2h0IGlwCishIHBhcmFtZXRlciA1ICAgMTogbG9hZCBrczEva3MyIHRvIGluMy9pbjQsIGFkZCAxMjAgdG8gaW40CishICAgICAgICAgICAgICAgIDI6IG1vdiBpbjQgdG8gaW4zCishCishIGFsc28gYWRkcyAtOCB0byBsZW5ndGggaW4yIGFuZCBsb2FkcyBsb29wIGNvdW50ZXIgdG8gb3V0NAorCitkZWZpbmUoZnBfaXBfbWFjcm8sIHsKKworISB7ZnBfaXBfbWFjcm99CishICQxICQyICQzICQ0ICQ1ICQ2ICQ3ICQ4ICQ5CisKKwlkZWZpbmUoe3RlbXAxfSx7b3V0NH0pCisJZGVmaW5lKHt0ZW1wMn0se2xvY2FsM30pCisKKwlkZWZpbmUoe2lwMX0se2xvY2FsMX0pCisJZGVmaW5lKHtpcDJ9LHtsb2NhbDJ9KQorCWRlZmluZSh7aXA0fSx7bG9jYWw0fSkKKwlkZWZpbmUoe2lwNX0se2xvY2FsNX0pCisKKwkhICQxIGluIGxvY2FsMywgbG9jYWw0CisKKwlsZAlbb3V0MisyNTZdLCBpcDEKKwlzbGwJb3V0NSwgMjksIHRlbXAxCisJb3IJbG9jYWwzLCBsb2NhbDQsICQxCisKKwlzcmwJb3V0NSwgMywgJDIKKwlpZmVsc2UoJDUsMix7bW92IGluNCwgaW4zfSkKKworCWxkCVtvdXQyKzI3Ml0sIGlwNQorCXNybAkkNCwgNCwgbG9jYWwwCisJb3IJJDIsIHRlbXAxLCAkMgorCisJc3JsCSQyLCAxLCB0ZW1wMQorCXhvcgl0ZW1wMSwgJDEsIHRlbXAxCisKKwlhbmQJdGVtcDEsIGlwNSwgdGVtcDEKKwl4b3IJbG9jYWwwLCAkMywgbG9jYWwwCisKKwlzbGwJdGVtcDEsIDEsIHRlbXAyCisJeG9yCSQxLCB0ZW1wMSwgJDEKKworCWFuZAlsb2NhbDAsIGlwMSwgbG9jYWwwCisJYWRkCWluMiwgLTgsIGluMgorCisJc2xsCWxvY2FsMCwgNCwgbG9jYWw3CisJeG9yCSQzLCBsb2NhbDAsICQzCisKKwlsZAlbb3V0MisyNjhdLCBpcDQKKwlzcmwJJDEsIDgsIHRlbXAxCisJeG9yCSQyLCB0ZW1wMiwgJDIKKwlsZAlbb3V0MisyNjBdLCBpcDIKKwlzcmwJJDMsIDE2LCBsb2NhbDAKKwl4b3IJJDQsIGxvY2FsNywgJDQKKwl4b3IJdGVtcDEsICQyLCB0ZW1wMQorCXhvcglsb2NhbDAsICQ0LCBsb2NhbDAKKwlhbmQJdGVtcDEsIGlwNCwgdGVtcDEKKwlhbmQJbG9jYWwwLCBpcDIsIGxvY2FsMAorCXNsbAl0ZW1wMSwgOCwgdGVtcDIKKwl4b3IJJDIsIHRlbXAxLCAkMgorCXNsbAlsb2NhbDAsIDE2LCBsb2NhbDcKKwl4b3IJJDQsIGxvY2FsMCwgJDQKKworCXNybAkkMiwgMiwgdGVtcDEKKwl4b3IJJDEsIHRlbXAyLCAkMQorCisJbGQJW291dDIrMjY0XSwgdGVtcDIgICAgICAgICAhIGlwMworCXNybAkkNCwgMiwgbG9jYWwwCisJeG9yCSQzLCBsb2NhbDcsICQzCisJeG9yCXRlbXAxLCAkMSwgdGVtcDEKKwl4b3IJbG9jYWwwLCAkMywgbG9jYWwwCisJYW5kCXRlbXAxLCB0ZW1wMiwgdGVtcDEKKwlhbmQJbG9jYWwwLCB0ZW1wMiwgbG9jYWwwCisJc2xsCXRlbXAxLCAyLCB0ZW1wMgorCXhvcgkkMSwgdGVtcDEsICQxCisJc2xsCWxvY2FsMCwgMiwgbG9jYWw3CisJeG9yCSQzLCBsb2NhbDAsICQzCisKKwlzcmwJJDEsIDE2LCB0ZW1wMQorCXhvcgkkMiwgdGVtcDIsICQyCisJc3JsCSQzLCA4LCBsb2NhbDAKKwl4b3IJJDQsIGxvY2FsNywgJDQKKwl4b3IJdGVtcDEsICQyLCB0ZW1wMQorCXhvcglsb2NhbDAsICQ0LCBsb2NhbDAKKwlhbmQJdGVtcDEsIGlwMiwgdGVtcDEKKwlhbmQJbG9jYWwwLCBpcDQsIGxvY2FsMAorCXNsbAl0ZW1wMSwgMTYsIHRlbXAyCisJeG9yCSQyLCB0ZW1wMSwgbG9jYWw0CisJc2xsCWxvY2FsMCwgOCwgbG9jYWw3CisJeG9yCSQ0LCBsb2NhbDAsICQ0CisKKwlzcmwJJDQsIDEsIGxvY2FsMAorCXhvcgkkMywgbG9jYWw3LCAkMworCisJc3JsCWxvY2FsNCwgNCwgdGVtcDEKKwl4b3IJbG9jYWwwLCAkMywgbG9jYWwwCisKKwl4b3IJJDEsIHRlbXAyLCAkMQorCWFuZAlsb2NhbDAsIGlwNSwgbG9jYWwwCisKKwlzbGwJbG9jYWwwLCAxLCBsb2NhbDcKKwl4b3IJdGVtcDEsICQxLCB0ZW1wMQorCisJeG9yCSQzLCBsb2NhbDAsICQzCisJeG9yCSQ0LCBsb2NhbDcsICQ0CisKKwlzbGwJJDMsIDMsIGxvY2FsNQorCWFuZAl0ZW1wMSwgaXAxLCB0ZW1wMQorCisJc2xsCXRlbXAxLCA0LCB0ZW1wMgorCXhvcgkkMSwgdGVtcDEsICQxCisKKwlpZmVsc2UoJDUsMSx7TERQVFIJS1MyLCBpbjR9KQorCXNsbAkkNCwgMywgbG9jYWwyCisJeG9yCWxvY2FsNCwgdGVtcDIsICQyCisKKwkhIHJlbG9hZCBzaW5jZSB1c2VkIGFzIHRlbXBvcmFyOgorCisJbGQJW291dDIrMjgwXSwgb3V0NCAgICAgICAgICAhIGxvb3AgY291bnRlcgorCisJc3JsCSQzLCAyOSwgbG9jYWwwCisJaWZlbHNlKCQ1LDEse2FkZCBpbjQsIDEyMCwgaW40fSkKKworCWlmZWxzZSgkNSwxLHtMRFBUUglLUzEsIGluM30pCisJc3JsCSQ0LCAyOSwgbG9jYWw3CisKKwlvcglsb2NhbDAsIGxvY2FsNSwgJDQKKwlvcglsb2NhbDIsIGxvY2FsNywgJDMKKworfSkKKworCisKKyEge2xvYWRfbGl0dGxlX2VuZGlhbn0KKyEKKyEgcGFyYW1ldGVyIDEgIGFkZHJlc3MKKyEgcGFyYW1ldGVyIDIgIGRlc3RpbmF0aW9uIGxlZnQKKyEgcGFyYW1ldGVyIDMgIGRlc3RpbmF0aW9uIHJpZ2h0CishIHBhcmFtZXRlciA0ICB0ZW1wb3JhcgorISBwYXJhbWV0ZXIgNSAgbGFiZWwKKworZGVmaW5lKGxvYWRfbGl0dGxlX2VuZGlhbiwgeworCishIHtsb2FkX2xpdHRsZV9lbmRpYW59CishICQxICQyICQzICQ0ICQ1ICQ2ICQ3ICQ4ICQ5CisKKwkhIGZpcnN0IGluIG1lbW9yeSB0byByaWdodG1vc3QgaW4gcmVnaXN0ZXIKKworI2lmZGVmIE9QRU5TU0xfU1lTTkFNRV9VTFRSQVNQQVJDCisJYW5kY2MJJDEsIDMsIGdsb2JhbDAKKwlibmUscG4JJWljYywgJDUKKwlub3AKKworCWxkYQlbJDFdIDB4ODgsICQyCisJYWRkCSQxLCA0LCAkNAorCisJYmEscHQJJWljYywgJDVhCisJbGRhCVskNF0gMHg4OCwgJDMKKyNlbmRpZgorCiskNToKKwlsZHViCVskMSszXSwgJDIKKworCWxkdWIJWyQxKzJdLCAkNAorCXNsbAkkMiwgOCwgJDIKKwlvcgkkMiwgJDQsICQyCisKKwlsZHViCVskMSsxXSwgJDQKKwlzbGwJJDIsIDgsICQyCisJb3IJJDIsICQ0LCAkMgorCisJbGR1YglbJDErMF0sICQ0CisJc2xsCSQyLCA4LCAkMgorCW9yCSQyLCAkNCwgJDIKKworCisJbGR1YglbJDErMys0XSwgJDMKKworCWxkdWIJWyQxKzIrNF0sICQ0CisJc2xsCSQzLCA4LCAkMworCW9yCSQzLCAkNCwgJDMKKworCWxkdWIJWyQxKzErNF0sICQ0CisJc2xsCSQzLCA4LCAkMworCW9yCSQzLCAkNCwgJDMKKworCWxkdWIJWyQxKzArNF0sICQ0CisJc2xsCSQzLCA4LCAkMworCW9yCSQzLCAkNCwgJDMKKyQ1YToKKworfSkKKworCishIHtsb2FkX2xpdHRsZV9lbmRpYW5faW5jfQorIQorISBwYXJhbWV0ZXIgMSAgYWRkcmVzcworISBwYXJhbWV0ZXIgMiAgZGVzdGluYXRpb24gbGVmdAorISBwYXJhbWV0ZXIgMyAgZGVzdGluYXRpb24gcmlnaHQKKyEgcGFyYW1ldGVyIDQgIHRlbXBvcmFyCishIHBhcmFtZXRlciA0ICBsYWJlbAorIQorISBhZGRzIDggdG8gYWRkcmVzcworCitkZWZpbmUobG9hZF9saXR0bGVfZW5kaWFuX2luYywgeworCishIHtsb2FkX2xpdHRsZV9lbmRpYW5faW5jfQorISAkMSAkMiAkMyAkNCAkNSAkNiAkNyAkOCAkOQorCisJISBmaXJzdCBpbiBtZW1vcnkgdG8gcmlnaHRtb3N0IGluIHJlZ2lzdGVyCisKKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfVUxUUkFTUEFSQworCWFuZGNjCSQxLCAzLCBnbG9iYWwwCisJYm5lLHBuCSVpY2MsICQ1CisJbm9wCisKKwlsZGEJWyQxXSAweDg4LCAkMgorCWFkZAkkMSwgNCwgJDEKKworCWxkYQlbJDFdIDB4ODgsICQzCisJYmEscHQJJWljYywgJDVhCisJYWRkCSQxLCA0LCAkMQorI2VuZGlmCisKKyQ1OgorCWxkdWIJWyQxKzNdLCAkMgorCisJbGR1YglbJDErMl0sICQ0CisJc2xsCSQyLCA4LCAkMgorCW9yCSQyLCAkNCwgJDIKKworCWxkdWIJWyQxKzFdLCAkNAorCXNsbAkkMiwgOCwgJDIKKwlvcgkkMiwgJDQsICQyCisKKwlsZHViCVskMSswXSwgJDQKKwlzbGwJJDIsIDgsICQyCisJb3IJJDIsICQ0LCAkMgorCisJbGR1YglbJDErMys0XSwgJDMKKwlhZGQJJDEsIDgsICQxCisKKwlsZHViCVskMSsyKzQtOF0sICQ0CisJc2xsCSQzLCA4LCAkMworCW9yCSQzLCAkNCwgJDMKKworCWxkdWIJWyQxKzErNC04XSwgJDQKKwlzbGwJJDMsIDgsICQzCisJb3IJJDMsICQ0LCAkMworCisJbGR1YglbJDErMCs0LThdLCAkNAorCXNsbAkkMywgOCwgJDMKKwlvcgkkMywgJDQsICQzCiskNWE6CisKK30pCisKKworISB7bG9hZF9uX2J5dGVzfQorIQorISBMb2FkcyAxIHRvIDcgYnl0ZXMgbGl0dGxlIGVuZGlhbgorISBSZW1haW5pbmcgYnl0ZXMgYXJlIHplcm9lZC4KKyEKKyEgcGFyYW1ldGVyIDEgIGFkZHJlc3MKKyEgcGFyYW1ldGVyIDIgIGxlbmd0aAorISBwYXJhbWV0ZXIgMyAgZGVzdGluYXRpb24gcmVnaXN0ZXIgbGVmdAorISBwYXJhbWV0ZXIgNCAgZGVzdGluYXRpb24gcmVnaXN0ZXIgcmlnaHQKKyEgcGFyYW1ldGVyIDUgIHRlbXAKKyEgcGFyYW1ldGVyIDYgIHRlbXAyCishIHBhcmFtZXRlciA3ICBsYWJlbAorISBwYXJhbWV0ZXIgOCAgcmV0dXJuIGxhYmVsCisKK2RlZmluZShsb2FkX25fYnl0ZXMsIHsKKworISB7bG9hZF9uX2J5dGVzfQorISAkMSAkMiAkNSAkNiAkNyAkOCAkNyAkOCAkOQorCiskNy4wOgljYWxsCS4rOAorCXNsbAkkMiwgMiwgJDYKKworCWFkZAklbzcsJDcuam1wLnRhYmxlLSQ3LjAsJDUKKworCWFkZAkkNSwgJDYsICQ1CisJbW92CTAsICQ0CisKKwlsZAlbJDVdLCAkNQorCisJam1wCSVvNyskNQorCW1vdgkwLCAkMworCiskNy43OgorCWxkdWIJWyQxKzZdLCAkNQorCXNsbAkkNSwgMTYsICQ1CisJb3IJJDMsICQ1LCAkMworJDcuNjoKKwlsZHViCVskMSs1XSwgJDUKKwlzbGwJJDUsIDgsICQ1CisJb3IJJDMsICQ1LCAkMworJDcuNToKKwlsZHViCVskMSs0XSwgJDUKKwlvcgkkMywgJDUsICQzCiskNy40OgorCWxkdWIJWyQxKzNdLCAkNQorCXNsbAkkNSwgMjQsICQ1CisJb3IJJDQsICQ1LCAkNAorJDcuMzoKKwlsZHViCVskMSsyXSwgJDUKKwlzbGwJJDUsIDE2LCAkNQorCW9yCSQ0LCAkNSwgJDQKKyQ3LjI6CisJbGR1YglbJDErMV0sICQ1CisJc2xsCSQ1LCA4LCAkNQorCW9yCSQ0LCAkNSwgJDQKKyQ3LjE6CisJbGR1YglbJDErMF0sICQ1CisJYmEJJDgKKwlvcgkkNCwgJDUsICQ0CisKKwkuYWxpZ24gNAorCiskNy5qbXAudGFibGU6CisJLndvcmQJMAorCS53b3JkCSQ3LjEtJDcuMAorCS53b3JkCSQ3LjItJDcuMAorCS53b3JkCSQ3LjMtJDcuMAorCS53b3JkCSQ3LjQtJDcuMAorCS53b3JkCSQ3LjUtJDcuMAorCS53b3JkCSQ3LjYtJDcuMAorCS53b3JkCSQ3LjctJDcuMAorfSkKKworCishIHtzdG9yZV9saXR0bGVfZW5kaWFufQorIQorISBwYXJhbWV0ZXIgMSAgYWRkcmVzcworISBwYXJhbWV0ZXIgMiAgc291cmNlIGxlZnQKKyEgcGFyYW1ldGVyIDMgIHNvdXJjZSByaWdodAorISBwYXJhbWV0ZXIgNCAgdGVtcG9yYXIKKworZGVmaW5lKHN0b3JlX2xpdHRsZV9lbmRpYW4sIHsKKworISB7c3RvcmVfbGl0dGxlX2VuZGlhbn0KKyEgJDEgJDIgJDMgJDQgJDUgJDYgJDcgJDggJDkKKworCSEgcmlnaHRtb3N0IGluIHJlZ2lzdGVyIHRvIGZpcnN0IGluIG1lbW9yeQorCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwlhbmRjYwkkMSwgMywgZ2xvYmFsMAorCWJuZSxwbgklaWNjLCAkNQorCW5vcAorCisJc3RhCSQyLCBbJDFdIDB4ODgKKwlhZGQJJDEsIDQsICQ0CisKKwliYSxwdAklaWNjLCAkNWEKKwlzdGEJJDMsIFskNF0gMHg4OAorI2VuZGlmCisKKyQ1OgorCWFuZAkkMiwgMjU1LCAkNAorCXN0dWIJJDQsIFskMSswXQorCisJc3JsCSQyLCA4LCAkNAorCWFuZAkkNCwgMjU1LCAkNAorCXN0dWIJJDQsIFskMSsxXQorCisJc3JsCSQyLCAxNiwgJDQKKwlhbmQJJDQsIDI1NSwgJDQKKwlzdHViCSQ0LCBbJDErMl0KKworCXNybAkkMiwgMjQsICQ0CisJc3R1YgkkNCwgWyQxKzNdCisKKworCWFuZAkkMywgMjU1LCAkNAorCXN0dWIJJDQsIFskMSswKzRdCisKKwlzcmwJJDMsIDgsICQ0CisJYW5kCSQ0LCAyNTUsICQ0CisJc3R1YgkkNCwgWyQxKzErNF0KKworCXNybAkkMywgMTYsICQ0CisJYW5kCSQ0LCAyNTUsICQ0CisJc3R1YgkkNCwgWyQxKzIrNF0KKworCXNybAkkMywgMjQsICQ0CisJc3R1YgkkNCwgWyQxKzMrNF0KKworJDVhOgorCit9KQorCisKKyEge3N0b3JlX25fYnl0ZXN9CishCishIFN0b3JlcyAxIHRvIDcgYnl0ZXMgbGl0dGxlIGVuZGlhbgorIQorISBwYXJhbWV0ZXIgMSAgYWRkcmVzcworISBwYXJhbWV0ZXIgMiAgbGVuZ3RoCishIHBhcmFtZXRlciAzICBzb3VyY2UgcmVnaXN0ZXIgbGVmdAorISBwYXJhbWV0ZXIgNCAgc291cmNlIHJlZ2lzdGVyIHJpZ2h0CishIHBhcmFtZXRlciA1ICB0ZW1wCishIHBhcmFtZXRlciA2ICB0ZW1wMgorISBwYXJhbWV0ZXIgNyAgbGFiZWwKKyEgcGFyYW1ldGVyIDggIHJldHVybiBsYWJlbAorCitkZWZpbmUoc3RvcmVfbl9ieXRlcywgeworCishIHtzdG9yZV9uX2J5dGVzfQorISAkMSAkMiAkNSAkNiAkNyAkOCAkNyAkOCAkOQorCiskNy4wOgljYWxsCS4rOAorCXNsbAkkMiwgMiwgJDYKKworCWFkZAklbzcsJDcuam1wLnRhYmxlLSQ3LjAsJDUKKworCWFkZAkkNSwgJDYsICQ1CisKKwlsZAlbJDVdLCAkNQorCisJam1wCSVvNyskNQorCW5vcAorCiskNy43OgorCXNybAkkMywgMTYsICQ1CisJYW5kCSQ1LCAweGZmLCAkNQorCXN0dWIJJDUsIFskMSs2XQorJDcuNjoKKwlzcmwJJDMsIDgsICQ1CisJYW5kCSQ1LCAweGZmLCAkNQorCXN0dWIJJDUsIFskMSs1XQorJDcuNToKKwlhbmQJJDMsIDB4ZmYsICQ1CisJc3R1YgkkNSwgWyQxKzRdCiskNy40OgorCXNybAkkNCwgMjQsICQ1CisJc3R1YgkkNSwgWyQxKzNdCiskNy4zOgorCXNybAkkNCwgMTYsICQ1CisJYW5kCSQ1LCAweGZmLCAkNQorCXN0dWIJJDUsIFskMSsyXQorJDcuMjoKKwlzcmwJJDQsIDgsICQ1CisJYW5kCSQ1LCAweGZmLCAkNQorCXN0dWIJJDUsIFskMSsxXQorJDcuMToKKwlhbmQJJDQsIDB4ZmYsICQ1CisKKworCWJhCSQ4CisJc3R1YgkkNSwgWyQxXQorCisJLmFsaWduIDQKKworJDcuam1wLnRhYmxlOgorCisJLndvcmQJMAorCS53b3JkCSQ3LjEtJDcuMAorCS53b3JkCSQ3LjItJDcuMAorCS53b3JkCSQ3LjMtJDcuMAorCS53b3JkCSQ3LjQtJDcuMAorCS53b3JkCSQ3LjUtJDcuMAorCS53b3JkCSQ3LjYtJDcuMAorCS53b3JkCSQ3LjctJDcuMAorfSkKKworCitkZWZpbmUodGVzdHZhbHVlLHsxfSkKKworZGVmaW5lKHJlZ2lzdGVyX2luaXQsIHsKKworISBGb3IgdGVzdCBwdXJwb3NlczoKKworCXNldGhpCSVoaSh0ZXN0dmFsdWUpLCBsb2NhbDAKKwlvcglsb2NhbDAsICVsbyh0ZXN0dmFsdWUpLCBsb2NhbDAKKworCWlmZWxzZSgkMSx7fSx7fSwge21vdglsb2NhbDAsICQxfSkKKwlpZmVsc2UoJDIse30se30sIHttb3YJbG9jYWwwLCAkMn0pCisJaWZlbHNlKCQzLHt9LHt9LCB7bW92CWxvY2FsMCwgJDN9KQorCWlmZWxzZSgkNCx7fSx7fSwge21vdglsb2NhbDAsICQ0fSkKKwlpZmVsc2UoJDUse30se30sIHttb3YJbG9jYWwwLCAkNX0pCisJaWZlbHNlKCQ2LHt9LHt9LCB7bW92CWxvY2FsMCwgJDZ9KQorCWlmZWxzZSgkNyx7fSx7fSwge21vdglsb2NhbDAsICQ3fSkKKwlpZmVsc2UoJDgse30se30sIHttb3YJbG9jYWwwLCAkOH0pCisKKwltb3YJbG9jYWwwLCBsb2NhbDEKKwltb3YJbG9jYWwwLCBsb2NhbDIKKwltb3YJbG9jYWwwLCBsb2NhbDMKKwltb3YJbG9jYWwwLCBsb2NhbDQKKwltb3YJbG9jYWwwLCBsb2NhbDUKKwltb3YJbG9jYWwwLCBsb2NhbDcKKwltb3YJbG9jYWwwLCBsb2NhbDYKKwltb3YJbG9jYWwwLCBvdXQwCisJbW92CWxvY2FsMCwgb3V0MQorCW1vdglsb2NhbDAsIG91dDIKKwltb3YJbG9jYWwwLCBvdXQzCisJbW92CWxvY2FsMCwgb3V0NAorCW1vdglsb2NhbDAsIG91dDUKKwltb3YJbG9jYWwwLCBnbG9iYWwxCisJbW92CWxvY2FsMCwgZ2xvYmFsMgorCW1vdglsb2NhbDAsIGdsb2JhbDMKKwltb3YJbG9jYWwwLCBnbG9iYWw0CisJbW92CWxvY2FsMCwgZ2xvYmFsNQorCit9KQorCisuc2VjdGlvbgkiLnRleHQiCisKKwkuYWxpZ24gMzIKKworLmRlc19lbmM6CisKKwkhIGtleSBhZGRyZXNzIGluMworCSEgbG9hZHMga2V5IG5leHQgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGZpcnN0IHJvdW5kIGZyb20gW2luNF0KKworCXJvdW5kc19tYWNybyhpbjUsIG91dDUsIDEsIC5kZXNfZW5jLjEsIGluMywgaW40LCByZXRsKQorCisKKwkuYWxpZ24gMzIKKworLmRlc19kZWM6CisKKwkhIGltcGxlbWVudGVkIHdpdGggb3V0NSBhcyBmaXJzdCBwYXJhbWV0ZXIgdG8gYXZvaWQKKwkhIHJlZ2lzdGVyIGV4Y2hhbmdlIGluIGVkZSBtb2RlcworCisJISBrZXkgYWRkcmVzcyBpbjQKKwkhIGxvYWRzIGtleSBuZXh0IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBmaXJzdCByb3VuZCBmcm9tIFtpbjNdCisKKwlyb3VuZHNfbWFjcm8ob3V0NSwgaW41LCAtMSwgLmRlc19kZWMuMSwgaW40LCBpbjMsIHJldGwpCisKKworCishIHZvaWQgREVTX2VuY3J5cHQxKGRhdGEsIGtzLCBlbmMpCishICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCS5hbGlnbiAzMgorCS5nbG9iYWwgREVTX2VuY3J5cHQxCisJLnR5cGUJIERFU19lbmNyeXB0MSwjZnVuY3Rpb24KKworREVTX2VuY3J5cHQxOgorCisJc2F2ZQklc3AsIEZSQU1FLCAlc3AKKworCXNldGhpCSVoaSguUElDLkRFU19TUHRyYW5zLTFmKSxnbG9iYWwxCisJb3IJZ2xvYmFsMSwlbG8oLlBJQy5ERVNfU1B0cmFucy0xZiksZ2xvYmFsMQorMToJY2FsbAkuKzgKKwlhZGQJJW83LGdsb2JhbDEsZ2xvYmFsMQorCXN1YglnbG9iYWwxLC5QSUMuREVTX1NQdHJhbnMtLmRlc19hbmQsb3V0MgorCisJbGQJW2luMF0sIGluNSAgICAgICAgICAgICAgICAhIGxlZnQKKwljbXAJaW4yLCAwICAgICAgICAgICAgICAgICAgICAhIGVuYworCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwliZSxwbgklaWNjLCAuZW5jcnlwdC5kZWMgICAgICAgICEgZW5jL2RlYworI2Vsc2UKKwliZQkuZW5jcnlwdC5kZWMKKyNlbmRpZgorCWxkCVtpbjArNF0sIG91dDUgICAgICAgICAgICAgISByaWdodAorCisJISBwYXJhbWV0ZXIgNiAgMS8yIGZvciBpbmNsdWRlIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorCSEgcGFyYW1ldGVyIDcgIDEgZm9yIG1vdmUgaW4xIHRvIGluMworCSEgcGFyYW1ldGVyIDggIDEgZm9yIG1vdmUgaW4zIHRvIGluNCwgMiBmb3IgbW92ZSBpbjQgdG8gaW4zCisKKwlpcF9tYWNybyhpbjUsIG91dDUsIGluNSwgb3V0NSwgaW4zLCAwLCAxLCAxKQorCisJcm91bmRzX21hY3JvKGluNSwgb3V0NSwgMSwgLmRlc19lbmNyeXB0MS4xLCBpbjMsIGluNCkgISBpbjQgbm90IHVzZWQKKworCWZwX21hY3JvKGluNSwgb3V0NSwgMSkgICAgICAgICAgICAhIDEgZm9yIHN0b3JlIHRvIFtpbjBdCisKKwlyZXQKKwlyZXN0b3JlCisKKy5lbmNyeXB0LmRlYzoKKworCWFkZAlpbjEsIDEyMCwgaW4zICAgICAgICAgICAgICEgdXNlIGxhc3Qgc3Via2V5IGZvciBmaXJzdCByb3VuZAorCisJISBwYXJhbWV0ZXIgNiAgMS8yIGZvciBpbmNsdWRlIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorCSEgcGFyYW1ldGVyIDcgIDEgZm9yIG1vdmUgaW4xIHRvIGluMworCSEgcGFyYW1ldGVyIDggIDEgZm9yIG1vdmUgaW4zIHRvIGluNCwgMiBmb3IgbW92ZSBpbjQgdG8gaW4zCisKKwlpcF9tYWNybyhpbjUsIG91dDUsIG91dDUsIGluNSwgaW40LCAyLCAwLCAxKSAhIGluY2x1ZGUgZGVjLCAga3MgaW40CisKKwlmcF9tYWNybyhvdXQ1LCBpbjUsIDEpICAgICAgICAgICAgISAxIGZvciBzdG9yZSB0byBbaW4wXQorCisJcmV0CisJcmVzdG9yZQorCisuREVTX2VuY3J5cHQxLmVuZDoKKwkuc2l6ZQkgREVTX2VuY3J5cHQxLC5ERVNfZW5jcnlwdDEuZW5kLURFU19lbmNyeXB0MQorCisKKyEgdm9pZCBERVNfZW5jcnlwdDIoZGF0YSwga3MsIGVuYykKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCSEgZW5jcnlwdHMvZGVjcnlwdHMgd2l0aG91dCBpbml0aWFsL2ZpbmFsIHBlcm11dGF0aW9uCisKKwkuYWxpZ24gMzIKKwkuZ2xvYmFsIERFU19lbmNyeXB0MgorCS50eXBlCSBERVNfZW5jcnlwdDIsI2Z1bmN0aW9uCisKK0RFU19lbmNyeXB0MjoKKworCXNhdmUJJXNwLCBGUkFNRSwgJXNwCisKKwlzZXRoaQklaGkoLlBJQy5ERVNfU1B0cmFucy0xZiksZ2xvYmFsMQorCW9yCWdsb2JhbDEsJWxvKC5QSUMuREVTX1NQdHJhbnMtMWYpLGdsb2JhbDEKKzE6CWNhbGwJLis4CisJYWRkCSVvNyxnbG9iYWwxLGdsb2JhbDEKKwlzdWIJZ2xvYmFsMSwuUElDLkRFU19TUHRyYW5zLS5kZXNfYW5kLG91dDIKKworCSEgU2V0IHNib3ggYWRkcmVzcyAxIHRvIDYgYW5kIHJvdGF0ZSBoYWxmcyAzIGxlZnQKKwkhIEVycm9ycyBjYXVnaHQgYnkgZGVzdGVzdD8gWWVzLiBTdGlsbD8gKk5PKgorCisJIXNldGhpCSVoaShERVNfU1B0cmFucyksIGdsb2JhbDEgISBhZGRyZXNzIHNib3ggMQorCisJIW9yCWdsb2JhbDEsICVsbyhERVNfU1B0cmFucyksIGdsb2JhbDEgICEgc2JveCAxCisKKwlhZGQJZ2xvYmFsMSwgMjU2LCBnbG9iYWwyICAgICAhIHNib3ggMgorCWFkZAlnbG9iYWwxLCA1MTIsIGdsb2JhbDMgICAgICEgc2JveCAzCisKKwlsZAlbaW4wXSwgb3V0NSAgICAgICAgICAgICAgICEgcmlnaHQKKwlhZGQJZ2xvYmFsMSwgNzY4LCBnbG9iYWw0ICAgICAhIHNib3ggNAorCWFkZAlnbG9iYWwxLCAxMDI0LCBnbG9iYWw1ICAgICEgc2JveCA1CisKKwlsZAlbaW4wKzRdLCBpbjUgICAgICAgICAgICAgICEgbGVmdAorCWFkZAlnbG9iYWwxLCAxMjgwLCBsb2NhbDYgICAgICEgc2JveCA2CisJYWRkCWdsb2JhbDEsIDE3OTIsIG91dDMgICAgICAgISBzYm94IDgKKworCSEgcm90YXRlCisKKwlzbGwJaW41LCAzLCBsb2NhbDUKKwltb3YJaW4xLCBpbjMgICAgICAgICAgICAgICAgICAhIGtleSBhZGRyZXNzIHRvIGluMworCisJc2xsCW91dDUsIDMsIGxvY2FsNworCXNybAlpbjUsIDI5LCBpbjUKKworCXNybAlvdXQ1LCAyOSwgb3V0NQorCWFkZAlpbjUsIGxvY2FsNSwgaW41CisKKwlhZGQJb3V0NSwgbG9jYWw3LCBvdXQ1CisJY21wCWluMiwgMAorCisJISB3ZSB1c2Ugb3VyIG93biBzdGFja2ZyYW1lCisKKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfVUxUUkFTUEFSQworCWJlLHBuCSVpY2MsIC5lbmNyeXB0Mi5kZWMgICAgICAgISBkZWNyeXB0aW9uCisjZWxzZQorCWJlCS5lbmNyeXB0Mi5kZWMKKyNlbmRpZgorCVNUUFRSCWluMCwgWyVzcCtCSUFTK0FSRzArMCpBUkdTWl0KKworCWxkCVtpbjNdLCBvdXQwICAgICAgICAgICAgICAgISBrZXkgNzUzMSBmaXJzdCByb3VuZAorCW1vdglMT09QUywgb3V0NCAgICAgICAgICAgICAgICEgbG9vcCBjb3VudGVyCisKKwlsZAlbaW4zKzRdLCBvdXQxICAgICAgICAgICAgICEga2V5IDg2NDIgZmlyc3Qgcm91bmQKKwlzZXRoaQklaGkoMHgwMDAwRkMwMCksIGxvY2FsNQorCisJY2FsbCAuZGVzX2VuYworCW1vdglpbjMsIGluNAorCisJISByb3RhdGUKKwlzbGwJaW41LCAyOSwgaW4wCisJc3JsCWluNSwgMywgaW41CisJc2xsCW91dDUsIDI5LCBpbjEKKwlhZGQJaW41LCBpbjAsIGluNQorCXNybAlvdXQ1LCAzLCBvdXQ1CisJTERQVFIJWyVzcCtCSUFTK0FSRzArMCpBUkdTWl0sIGluMAorCWFkZAlvdXQ1LCBpbjEsIG91dDUKKwlzdAlpbjUsIFtpbjBdCisJc3QJb3V0NSwgW2luMCs0XQorCisJcmV0CisJcmVzdG9yZQorCisKKy5lbmNyeXB0Mi5kZWM6CisKKwlhZGQgaW4zLCAxMjAsIGluNAorCisJbGQJW2luNF0sIG91dDAgICAgICAgICAgICAgICAhIGtleSA3NTMxIGZpcnN0IHJvdW5kCisJbW92CUxPT1BTLCBvdXQ0ICAgICAgICAgICAgICAgISBsb29wIGNvdW50ZXIKKworCWxkCVtpbjQrNF0sIG91dDEgICAgICAgICAgICAgISBrZXkgODY0MiBmaXJzdCByb3VuZAorCXNldGhpCSVoaSgweDAwMDBGQzAwKSwgbG9jYWw1CisKKwltb3YJaW41LCBsb2NhbDEgICAgICAgICAgICAgICAhIGxlZnQgZXhwZWN0ZWQgaW4gb3V0NQorCW1vdglvdXQ1LCBpbjUKKworCWNhbGwgLmRlc19kZWMKKwltb3YJbG9jYWwxLCBvdXQ1CisKKy5lbmNyeXB0Mi5maW5pc2g6CisKKwkhIHJvdGF0ZQorCXNsbAlpbjUsIDI5LCBpbjAKKwlzcmwJaW41LCAzLCBpbjUKKwlzbGwJb3V0NSwgMjksIGluMQorCWFkZAlpbjUsIGluMCwgaW41CisJc3JsCW91dDUsIDMsIG91dDUKKwlMRFBUUglbJXNwK0JJQVMrQVJHMCswKkFSR1NaXSwgaW4wCisJYWRkCW91dDUsIGluMSwgb3V0NQorCXN0CW91dDUsIFtpbjBdCisJc3QJaW41LCBbaW4wKzRdCisKKwlyZXQKKwlyZXN0b3JlCisKKy5ERVNfZW5jcnlwdDIuZW5kOgorCS5zaXplCSBERVNfZW5jcnlwdDIsIC5ERVNfZW5jcnlwdDIuZW5kLURFU19lbmNyeXB0MgorCisKKyEgdm9pZCBERVNfZW5jcnlwdDMoZGF0YSwga3MxLCBrczIsIGtzMykKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCS5hbGlnbiAzMgorCS5nbG9iYWwgREVTX2VuY3J5cHQzCisJLnR5cGUJIERFU19lbmNyeXB0MywjZnVuY3Rpb24KKworREVTX2VuY3J5cHQzOgorCisJc2F2ZQklc3AsIEZSQU1FLCAlc3AKKwkKKwlzZXRoaQklaGkoLlBJQy5ERVNfU1B0cmFucy0xZiksZ2xvYmFsMQorCW9yCWdsb2JhbDEsJWxvKC5QSUMuREVTX1NQdHJhbnMtMWYpLGdsb2JhbDEKKzE6CWNhbGwJLis4CisJYWRkCSVvNyxnbG9iYWwxLGdsb2JhbDEKKwlzdWIJZ2xvYmFsMSwuUElDLkRFU19TUHRyYW5zLS5kZXNfYW5kLG91dDIKKworCWxkCVtpbjBdLCBpbjUgICAgICAgICAgICAgICAgISBsZWZ0CisJYWRkCWluMiwgMTIwLCBpbjQgICAgICAgICAgICAgISBrczIKKworCWxkCVtpbjArNF0sIG91dDUgICAgICAgICAgICAgISByaWdodAorCW1vdglpbjMsIGluMiAgICAgICAgICAgICAgICAgICEgc2F2ZSBrczMKKworCSEgcGFyYW1ldGVyIDYgIDEvMiBmb3IgaW5jbHVkZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKwkhIHBhcmFtZXRlciA3ICAxIGZvciBtb3YgaW4xIHRvIGluMworCSEgcGFyYW1ldGVyIDggIDEgZm9yIG1vdiBpbjMgdG8gaW40CisJISBwYXJhbWV0ZXIgOSAgMSBmb3IgbG9hZCBrczMgYW5kIGtzMiB0byBpbjQgYW5kIGluMworCisJaXBfbWFjcm8oaW41LCBvdXQ1LCBpbjUsIG91dDUsIGluMywgMSwgMSwgMCwgMCkKKworCWNhbGwJLmRlc19kZWMKKwltb3YJaW4yLCBpbjMgICAgICAgICAgICAgICAgICAhIHByZWxvYWQga3MzCisKKwljYWxsCS5kZXNfZW5jCisJbm9wCisKKwlmcF9tYWNybyhpbjUsIG91dDUsIDEpCisKKwlyZXQKKwlyZXN0b3JlCisKKy5ERVNfZW5jcnlwdDMuZW5kOgorCS5zaXplCSBERVNfZW5jcnlwdDMsLkRFU19lbmNyeXB0My5lbmQtREVTX2VuY3J5cHQzCisKKworISB2b2lkIERFU19kZWNyeXB0MyhkYXRhLCBrczEsIGtzMiwga3MzKQorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJLmFsaWduIDMyCisJLmdsb2JhbCBERVNfZGVjcnlwdDMKKwkudHlwZQkgREVTX2RlY3J5cHQzLCNmdW5jdGlvbgorCitERVNfZGVjcnlwdDM6CisKKwlzYXZlCSVzcCwgRlJBTUUsICVzcAorCQorCXNldGhpCSVoaSguUElDLkRFU19TUHRyYW5zLTFmKSxnbG9iYWwxCisJb3IJZ2xvYmFsMSwlbG8oLlBJQy5ERVNfU1B0cmFucy0xZiksZ2xvYmFsMQorMToJY2FsbAkuKzgKKwlhZGQJJW83LGdsb2JhbDEsZ2xvYmFsMQorCXN1YglnbG9iYWwxLC5QSUMuREVTX1NQdHJhbnMtLmRlc19hbmQsb3V0MgorCisJbGQJW2luMF0sIGluNSAgICAgICAgICAgICAgICAhIGxlZnQKKwlhZGQJaW4zLCAxMjAsIGluNCAgICAgICAgICAgICAhIGtzMworCisJbGQJW2luMCs0XSwgb3V0NSAgICAgICAgICAgICAhIHJpZ2h0CisJbW92CWluMiwgaW4zICAgICAgICAgICAgICAgICAgISBrczIKKworCSEgcGFyYW1ldGVyIDYgIDEvMiBmb3IgaW5jbHVkZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKwkhIHBhcmFtZXRlciA3ICAxIGZvciBtb3YgaW4xIHRvIGluMworCSEgcGFyYW1ldGVyIDggIDEgZm9yIG1vdiBpbjMgdG8gaW40CisJISBwYXJhbWV0ZXIgOSAgMSBmb3IgbG9hZCBrczMgYW5kIGtzMiB0byBpbjQgYW5kIGluMworCisJaXBfbWFjcm8oaW41LCBvdXQ1LCBvdXQ1LCBpbjUsIGluNCwgMiwgMCwgMCwgMCkKKworCWNhbGwJLmRlc19lbmMKKwlhZGQJaW4xLCAxMjAsIGluNCAgICAgICAgICAgICAhIHByZWxvYWQga3MxCisKKwljYWxsCS5kZXNfZGVjCisJbm9wCisKKwlmcF9tYWNybyhvdXQ1LCBpbjUsIDEpCisKKwlyZXQKKwlyZXN0b3JlCisKKy5ERVNfZGVjcnlwdDMuZW5kOgorCS5zaXplCSBERVNfZGVjcnlwdDMsLkRFU19kZWNyeXB0My5lbmQtREVTX2RlY3J5cHQzCisKKyEgdm9pZCBERVNfbmNiY19lbmNyeXB0KGlucHV0LCBvdXRwdXQsIGxlbmd0aCwgc2NoZWR1bGUsIGl2ZWMsIGVuYykKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisJLmFsaWduIDMyCisJLmdsb2JhbCBERVNfbmNiY19lbmNyeXB0CisJLnR5cGUJIERFU19uY2JjX2VuY3J5cHQsI2Z1bmN0aW9uCisKK0RFU19uY2JjX2VuY3J5cHQ6CisKKwlzYXZlCSVzcCwgRlJBTUUsICVzcAorCQorCWRlZmluZSh7SU5QVVR9LCAgeyBbJXNwK0JJQVMrQVJHMCswKkFSR1NaXSB9KQorCWRlZmluZSh7T1VUUFVUfSwgeyBbJXNwK0JJQVMrQVJHMCsxKkFSR1NaXSB9KQorCWRlZmluZSh7SVZFQ30sICAgeyBbJXNwK0JJQVMrQVJHMCs0KkFSR1NaXSB9KQorCisJc2V0aGkJJWhpKC5QSUMuREVTX1NQdHJhbnMtMWYpLGdsb2JhbDEKKwlvcglnbG9iYWwxLCVsbyguUElDLkRFU19TUHRyYW5zLTFmKSxnbG9iYWwxCisxOgljYWxsCS4rOAorCWFkZAklbzcsZ2xvYmFsMSxnbG9iYWwxCisJc3ViCWdsb2JhbDEsLlBJQy5ERVNfU1B0cmFucy0uZGVzX2FuZCxvdXQyCisKKwljbXAJaW41LCAwICAgICAgICAgICAgICAgICAgICAhIGVuYyAgIAorCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwliZSxwbgklaWNjLCAubmNiYy5kZWMKKyNlbHNlCisJYmUJLm5jYmMuZGVjCisjZW5kaWYKKwlTVFBUUglpbjQsIElWRUMKKworCSEgYWRkciAgbGVmdCAgcmlnaHQgIHRlbXAgIGxhYmVsCisJbG9hZF9saXR0bGVfZW5kaWFuKGluNCwgaW41LCBvdXQ1LCBsb2NhbDMsIC5MTEUxKSAgISBpdgorCisJYWRkY2MJaW4yLCAtOCwgaW4yICAgICAgICAgICAgICAhIGJ5dGVzIG1pc3Npbmcgd2hlbiBmaXJzdCBibG9jayBkb25lCisKKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfVUxUUkFTUEFSQworCWJsLHBuCSVpY2MsIC5uY2JjLmVuYy5zZXZlbi5vci5sZXNzCisjZWxzZQorCWJsCS5uY2JjLmVuYy5zZXZlbi5vci5sZXNzCisjZW5kaWYKKwltb3YJaW4zLCBpbjQgICAgICAgICAgICAgICAgICAhIHNjaGVkdWxlCisKKy5uY2JjLmVuYy5uZXh0LmJsb2NrOgorCisJbG9hZF9saXR0bGVfZW5kaWFuKGluMCwgb3V0NCwgZ2xvYmFsNCwgbG9jYWwzLCAuTExFMikgICEgYmxvY2sKKworLm5jYmMuZW5jLm5leHQuYmxvY2tfMToKKworCXhvcglpbjUsIG91dDQsIGluNSAgICAgICAgICAgICEgaXYgeG9yCisJeG9yCW91dDUsIGdsb2JhbDQsIG91dDUgICAgICAgISBpdiB4b3IKKworCSEgcGFyYW1ldGVyIDggIDEgZm9yIG1vdmUgaW4zIHRvIGluNCwgMiBmb3IgbW92ZSBpbjQgdG8gaW4zCisJaXBfbWFjcm8oaW41LCBvdXQ1LCBpbjUsIG91dDUsIGluMywgMCwgMCwgMikKKworLm5jYmMuZW5jLm5leHQuYmxvY2tfMjoKKworIS8vCWNhbGwgLmRlc19lbmMgICAgICAgICAgICAgICAgICAgICAhIGNvbXBhcmVzIGluMiB0byA4CishCXJvdW5kcyBpbmxpbmVkIGZvciBhbGlnbm1lbnQgcHVycG9zZXMKKworCWFkZAlnbG9iYWwxLCA3NjgsIGdsb2JhbDQgICAgICEgYWRkcmVzcyBzYm94IDQgc2luY2UgcmVnaXN0ZXIgdXNlZCBiZWxvdworCisJcm91bmRzX21hY3JvKGluNSwgb3V0NSwgMSwgLm5jYmMuZW5jLjEsIGluMywgaW40KSAhIGluY2x1ZGUgZW5jcnlwdGlvbiAga3MgaW4zCisKKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfVUxUUkFTUEFSQworCWJsLHBuCSVpY2MsIC5uY2JjLmVuYy5uZXh0LmJsb2NrX2ZwCisjZWxzZQorCWJsCS5uY2JjLmVuYy5uZXh0LmJsb2NrX2ZwCisjZW5kaWYKKwlhZGQJaW4wLCA4LCBpbjAgICAgICAgICAgICAgICAhIGlucHV0IGFkZHJlc3MKKworCSEgSWYgOCBvciBtb3JlIGJ5dGVzIGFyZSB0byBiZSBlbmNyeXB0ZWQgYWZ0ZXIgdGhpcyBibG9jaywKKwkhIHdlIGNvbWJpbmUgZmluYWwgcGVybXV0YXRpb24gZm9yIHRoaXMgYmxvY2sgd2l0aCBpbml0aWFsCisJISBwZXJtdXRhdGlvbiBmb3IgbmV4dCBibG9jay4gTG9hZCBuZXh0IGJsb2NrOgorCisJbG9hZF9saXR0bGVfZW5kaWFuKGluMCwgZ2xvYmFsMywgZ2xvYmFsNCwgbG9jYWw1LCAuTExFMTIpCisKKwkhICBwYXJhbWV0ZXIgMSAgIG9yaWdpbmFsIGxlZnQKKwkhICBwYXJhbWV0ZXIgMiAgIG9yaWdpbmFsIHJpZ2h0CisJISAgcGFyYW1ldGVyIDMgICBsZWZ0IGlwCisJISAgcGFyYW1ldGVyIDQgICByaWdodCBpcAorCSEgIHBhcmFtZXRlciA1ICAgMTogbG9hZCBrczEva3MyIHRvIGluMy9pbjQsIGFkZCAxMjAgdG8gaW40CisJISAgICAgICAgICAgICAgICAyOiBtb3YgaW40IHRvIGluMworCSEKKwkhIGFsc28gYWRkcyAtOCB0byBsZW5ndGggaW4yIGFuZCBsb2FkcyBsb29wIGNvdW50ZXIgdG8gb3V0NAorCisJZnBfaXBfbWFjcm8ob3V0MCwgb3V0MSwgZ2xvYmFsMywgZ2xvYmFsNCwgMikKKworCXN0b3JlX2xpdHRsZV9lbmRpYW4oaW4xLCBvdXQwLCBvdXQxLCBsb2NhbDMsIC5TTEUxMCkgICEgYmxvY2sKKworCWxkCVtpbjNdLCBvdXQwICAgICAgICAgICAgICAgISBrZXkgNzUzMSBmaXJzdCByb3VuZCBuZXh0IGJsb2NrCisJbW92IAlpbjUsIGxvY2FsMQorCXhvcglnbG9iYWwzLCBvdXQ1LCBpbjUgICAgICAgICEgaXYgeG9yIG5leHQgYmxvY2sKKworCWxkCVtpbjMrNF0sIG91dDEgICAgICAgICAgICAgISBrZXkgODY0MgorCWFkZAlnbG9iYWwxLCA1MTIsIGdsb2JhbDMgICAgICEgYWRkcmVzcyBzYm94IDMgc2luY2UgcmVnaXN0ZXIgdXNlZAorCXhvcglnbG9iYWw0LCBsb2NhbDEsIG91dDUgICAgICEgaXYgeG9yIG5leHQgYmxvY2sKKworCWJhCS5uY2JjLmVuYy5uZXh0LmJsb2NrXzIKKwlhZGQJaW4xLCA4LCBpbjEgICAgICAgICAgICAgICAhIG91dHB1dCBhZHJlc3MKKworLm5jYmMuZW5jLm5leHQuYmxvY2tfZnA6CisKKwlmcF9tYWNybyhpbjUsIG91dDUpCisKKwlzdG9yZV9saXR0bGVfZW5kaWFuKGluMSwgaW41LCBvdXQ1LCBsb2NhbDMsIC5TTEUxKSAgISBibG9jaworCisJYWRkY2MgICBpbjIsIC04LCBpbjIgICAgICAgICAgICAgICEgYnl0ZXMgbWlzc2luZyB3aGVuIG5leHQgYmxvY2sgZG9uZQorCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwlicG9zLHB0CSVpY2MsIC5uY2JjLmVuYy5uZXh0LmJsb2NrICAhIGFsc28ganVtcHMgaWYgMAorI2Vsc2UKKwlicG9zCS5uY2JjLmVuYy5uZXh0LmJsb2NrCisjZW5kaWYKKwlhZGQJaW4xLCA4LCBpbjEKKworLm5jYmMuZW5jLnNldmVuLm9yLmxlc3M6CisKKwljbXAJaW4yLCAtOAorCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwlibGUscHQJJWljYywgLm5jYmMuZW5jLmZpbmlzaAorI2Vsc2UKKwlibGUJLm5jYmMuZW5jLmZpbmlzaAorI2VuZGlmCisJbm9wCisKKwlhZGQJaW4yLCA4LCBsb2NhbDEgICAgICAgICAgICAhIGJ5dGVzIHRvIGxvYWQKKworCSEgYWRkciwgbGVuZ3RoLCBkZXN0IGxlZnQsIGRlc3QgcmlnaHQsIHRlbXAsIHRlbXAyLCBsYWJlbCwgcmV0IGxhYmVsCisJbG9hZF9uX2J5dGVzKGluMCwgbG9jYWwxLCBnbG9iYWw0LCBvdXQ0LCBsb2NhbDIsIGxvY2FsMywgLkxOQjEsIC5uY2JjLmVuYy5uZXh0LmJsb2NrXzEpCisKKwkhIExvYWRzIDEgdG8gNyBieXRlcyBsaXR0bGUgZW5kaWFuIHRvIGdsb2JhbDQsIG91dDQKKworCisubmNiYy5lbmMuZmluaXNoOgorCisJTERQVFIJSVZFQywgbG9jYWw0CisJc3RvcmVfbGl0dGxlX2VuZGlhbihsb2NhbDQsIGluNSwgb3V0NSwgbG9jYWw1LCAuU0xFMikgICEgaXZlYworCisJcmV0CisJcmVzdG9yZQorCisKKy5uY2JjLmRlYzoKKworCVNUUFRSCWluMCwgSU5QVVQKKwljbXAJaW4yLCAwICAgICAgICAgICAgICAgICAgICAhIGxlbmd0aAorCWFkZAlpbjMsIDEyMCwgaW4zCisKKwlMRFBUUglJVkVDLCBsb2NhbDcgICAgICAgICAgICAgICEgaXZlYworI2lmZGVmIE9QRU5TU0xfU1lTTkFNRV9VTFRSQVNQQVJDCisJYmxlLHBuCSVpY2MsIC5uY2JjLmRlYy5maW5pc2gKKyNlbHNlCisJYmxlCS5uY2JjLmRlYy5maW5pc2gKKyNlbmRpZgorCW1vdglpbjMsIGluNCAgICAgICAgICAgICAgICAgICEgc2NoZWR1bGUKKworCVNUUFRSCWluMSwgT1VUUFVUCisJbW92CWluMCwgbG9jYWw1ICAgICAgICAgICAgICAgISBpbnB1dAorCisJbG9hZF9saXR0bGVfZW5kaWFuKGxvY2FsNywgaW4wLCBpbjEsIGxvY2FsMywgLkxMRTMpICAgISBpdmVjCisKKy5uY2JjLmRlYy5uZXh0LmJsb2NrOgorCisJbG9hZF9saXR0bGVfZW5kaWFuKGxvY2FsNSwgaW41LCBvdXQ1LCBsb2NhbDMsIC5MTEU0KSAgISBibG9jaworCisJISBwYXJhbWV0ZXIgNiAgMS8yIGZvciBpbmNsdWRlIGVuY3J5cHRpb24vZGVjcnlwdGlvbgorCSEgcGFyYW1ldGVyIDcgIDEgZm9yIG1vdiBpbjEgdG8gaW4zCisJISBwYXJhbWV0ZXIgOCAgMSBmb3IgbW92IGluMyB0byBpbjQKKworCWlwX21hY3JvKGluNSwgb3V0NSwgb3V0NSwgaW41LCBpbjQsIDIsIDAsIDEpICEgaW5jbHVkZSBkZWNyeXByaW9uICBrcyBpbjQKKworCWZwX21hY3JvKG91dDUsIGluNSwgMCwgMSkgISAxIGZvciBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3MgdG8gbG9jYWw1LzcKKworCSEgaW4yIGlzIGJ5dGVzIGxlZnQgdG8gYmUgc3RvcmVkCisJISBpbjIgaXMgY29tcGFyZWQgdG8gOCBpbiB0aGUgcm91bmRzCisKKwl4b3IJb3V0NSwgaW4wLCBvdXQ0ICAgICAgICAgICAhIGl2IHhvcgorI2lmZGVmIE9QRU5TU0xfU1lTTkFNRV9VTFRSQVNQQVJDCisJYmwscG4JJWljYywgLm5jYmMuZGVjLnNldmVuLm9yLmxlc3MKKyNlbHNlCisJYmwJLm5jYmMuZGVjLnNldmVuLm9yLmxlc3MKKyNlbmRpZgorCXhvcglpbjUsIGluMSwgZ2xvYmFsNCAgICAgICAgICEgaXYgeG9yCisKKwkhIExvYWQgaXZlYyBuZXh0IGJsb2NrIG5vdywgc2luY2UgaW5wdXQgYW5kIG91dHB1dCBhZGRyZXNzIG1pZ2h0IGJlIHRoZSBzYW1lLgorCisJbG9hZF9saXR0bGVfZW5kaWFuX2luYyhsb2NhbDUsIGluMCwgaW4xLCBsb2NhbDMsIC5MTEU1KSAgISBpdgorCisJc3RvcmVfbGl0dGxlX2VuZGlhbihsb2NhbDcsIG91dDQsIGdsb2JhbDQsIGxvY2FsMywgLlNMRTMpCisKKwlTVFBUUglsb2NhbDUsIElOUFVUCisJYWRkCWxvY2FsNywgOCwgbG9jYWw3CisJYWRkY2MgICBpbjIsIC04LCBpbjIKKworI2lmZGVmIE9QRU5TU0xfU1lTTkFNRV9VTFRSQVNQQVJDCisJYmcscHQJJWljYywgLm5jYmMuZGVjLm5leHQuYmxvY2sKKyNlbHNlCisJYmcJLm5jYmMuZGVjLm5leHQuYmxvY2sKKyNlbmRpZgorCVNUUFRSCWxvY2FsNywgT1VUUFVUCisKKworLm5jYmMuZGVjLnN0b3JlLml2OgorCisJTERQVFIJSVZFQywgbG9jYWw0ICAgICAgICAgICAgICAhIGl2ZWMKKwlzdG9yZV9saXR0bGVfZW5kaWFuKGxvY2FsNCwgaW4wLCBpbjEsIGxvY2FsNSwgLlNMRTQpCisKKy5uY2JjLmRlYy5maW5pc2g6CisKKwlyZXQKKwlyZXN0b3JlCisKKy5uY2JjLmRlYy5zZXZlbi5vci5sZXNzOgorCisJbG9hZF9saXR0bGVfZW5kaWFuX2luYyhsb2NhbDUsIGluMCwgaW4xLCBsb2NhbDMsIC5MTEUxMykgICAgICEgaXZlYworCisJc3RvcmVfbl9ieXRlcyhsb2NhbDcsIGluMiwgZ2xvYmFsNCwgb3V0NCwgbG9jYWwzLCBsb2NhbDQsIC5TTkIxLCAubmNiYy5kZWMuc3RvcmUuaXYpCisKKworLkRFU19uY2JjX2VuY3J5cHQuZW5kOgorCS5zaXplCSBERVNfbmNiY19lbmNyeXB0LCAuREVTX25jYmNfZW5jcnlwdC5lbmQtREVTX25jYmNfZW5jcnlwdAorCisKKyEgdm9pZCBERVNfZWRlM19jYmNfZW5jcnlwdChpbnB1dCwgb3V0cHV0LCBsZW5naHQsIGtzMSwga3MyLCBrczMsIGl2ZWMsIGVuYykKKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisJLmFsaWduIDMyCisJLmdsb2JhbCBERVNfZWRlM19jYmNfZW5jcnlwdAorCS50eXBlCSBERVNfZWRlM19jYmNfZW5jcnlwdCwjZnVuY3Rpb24KKworREVTX2VkZTNfY2JjX2VuY3J5cHQ6CisKKwlzYXZlCSVzcCwgRlJBTUUsICVzcAorCisJZGVmaW5lKHtLUzF9LCB7IFslc3ArQklBUytBUkcwKzMqQVJHU1pdIH0pCisJZGVmaW5lKHtLUzJ9LCB7IFslc3ArQklBUytBUkcwKzQqQVJHU1pdIH0pCisJZGVmaW5lKHtLUzN9LCB7IFslc3ArQklBUytBUkcwKzUqQVJHU1pdIH0pCisKKwlzZXRoaQklaGkoLlBJQy5ERVNfU1B0cmFucy0xZiksZ2xvYmFsMQorCW9yCWdsb2JhbDEsJWxvKC5QSUMuREVTX1NQdHJhbnMtMWYpLGdsb2JhbDEKKzE6CWNhbGwJLis4CisJYWRkCSVvNyxnbG9iYWwxLGdsb2JhbDEKKwlzdWIJZ2xvYmFsMSwuUElDLkRFU19TUHRyYW5zLS5kZXNfYW5kLG91dDIKKworCUxEUFRSCVslZnArQklBUytBUkcwKzcqQVJHU1pdLCBsb2NhbDMgICAgICAgICAgISBlbmMKKwlMRFBUUglbJWZwK0JJQVMrQVJHMCs2KkFSR1NaXSwgbG9jYWw0ICAgICAgICAgICEgaXZlYworCWNtcAlsb2NhbDMsIDAgICAgICAgICAgICAgICAgICEgZW5jCisKKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfVUxUUkFTUEFSQworCWJlLHBuCSVpY2MsIC5lZGUzLmRlYworI2Vsc2UKKwliZQkuZWRlMy5kZWMKKyNlbmRpZgorCVNUUFRSCWluNCwgS1MyCisKKwlTVFBUUglpbjUsIEtTMworCisJbG9hZF9saXR0bGVfZW5kaWFuKGxvY2FsNCwgaW41LCBvdXQ1LCBsb2NhbDMsIC5MTEU2KSAgISBpdmVjCisKKwlhZGRjYwlpbjIsIC04LCBpbjIgICAgICAgICAgICAgICEgYnl0ZXMgbWlzc2luZyBhZnRlciBuZXh0IGJsb2NrCisKKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfVUxUUkFTUEFSQworCWJsLHBuCSVpY2MsICAuZWRlMy5lbmMuc2V2ZW4ub3IubGVzcworI2Vsc2UKKwlibAkuZWRlMy5lbmMuc2V2ZW4ub3IubGVzcworI2VuZGlmCisJU1RQVFIJaW4zLCBLUzEKKworLmVkZTMuZW5jLm5leHQuYmxvY2s6CisKKwlsb2FkX2xpdHRsZV9lbmRpYW4oaW4wLCBvdXQ0LCBnbG9iYWw0LCBsb2NhbDMsIC5MTEU3KQorCisuZWRlMy5lbmMubmV4dC5ibG9ja18xOgorCisJTERQVFIJS1MyLCBpbjQKKwl4b3IJaW41LCBvdXQ0LCBpbjUgICAgICAgICAgICAhIGl2IHhvcgorCXhvcglvdXQ1LCBnbG9iYWw0LCBvdXQ1ICAgICAgICEgaXYgeG9yCisKKwlMRFBUUglLUzEsIGluMworCWFkZAlpbjQsIDEyMCwgaW40ICAgICAgICAgICAgICEgZm9yIGRlY3J5cHRpb24gd2UgdXNlIGxhc3Qgc3Via2V5IGZpcnN0CisJbm9wCisKKwlpcF9tYWNybyhpbjUsIG91dDUsIGluNSwgb3V0NSwgaW4zKQorCisuZWRlMy5lbmMubmV4dC5ibG9ja18yOgorCisJY2FsbCAuZGVzX2VuYyAgICAgICAgICAgICAgICAgICAgICEga3MxIGluMworCW5vcAorCisJY2FsbCAuZGVzX2RlYyAgICAgICAgICAgICAgICAgICAgICEga3MyIGluNAorCUxEUFRSCUtTMywgaW4zCisKKwljYWxsIC5kZXNfZW5jICAgICAgICAgICAgICAgICAgICAgISBrczMgaW4zICBjb21wYXJlcyBpbjIgdG8gOAorCW5vcAorCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwlibCxwbgklaWNjLCAuZWRlMy5lbmMubmV4dC5ibG9ja19mcAorI2Vsc2UKKwlibAkuZWRlMy5lbmMubmV4dC5ibG9ja19mcAorI2VuZGlmCisJYWRkCWluMCwgOCwgaW4wCisKKwkhIElmIDggb3IgbW9yZSBieXRlcyBhcmUgdG8gYmUgZW5jcnlwdGVkIGFmdGVyIHRoaXMgYmxvY2ssCisJISB3ZSBjb21iaW5lIGZpbmFsIHBlcm11dGF0aW9uIGZvciB0aGlzIGJsb2NrIHdpdGggaW5pdGlhbAorCSEgcGVybXV0YXRpb24gZm9yIG5leHQgYmxvY2suIExvYWQgbmV4dCBibG9jazoKKworCWxvYWRfbGl0dGxlX2VuZGlhbihpbjAsIGdsb2JhbDMsIGdsb2JhbDQsIGxvY2FsNSwgLkxMRTExKQorCisJISAgcGFyYW1ldGVyIDEgICBvcmlnaW5hbCBsZWZ0CisJISAgcGFyYW1ldGVyIDIgICBvcmlnaW5hbCByaWdodAorCSEgIHBhcmFtZXRlciAzICAgbGVmdCBpcAorCSEgIHBhcmFtZXRlciA0ICAgcmlnaHQgaXAKKwkhICBwYXJhbWV0ZXIgNSAgIDE6IGxvYWQga3MxL2tzMiB0byBpbjMvaW40LCBhZGQgMTIwIHRvIGluNAorCSEgICAgICAgICAgICAgICAgMjogbW92IGluNCB0byBpbjMKKwkhCisJISBhbHNvIGFkZHMgLTggdG8gbGVuZ3RoIGluMiBhbmQgbG9hZHMgbG9vcCBjb3VudGVyIHRvIG91dDQKKworCWZwX2lwX21hY3JvKG91dDAsIG91dDEsIGdsb2JhbDMsIGdsb2JhbDQsIDEpCisKKwlzdG9yZV9saXR0bGVfZW5kaWFuKGluMSwgb3V0MCwgb3V0MSwgbG9jYWwzLCAuU0xFOSkgICEgYmxvY2sKKworCW1vdiAJaW41LCBsb2NhbDEKKwl4b3IJZ2xvYmFsMywgb3V0NSwgaW41ICAgICAgICAhIGl2IHhvciBuZXh0IGJsb2NrCisKKwlsZAlbaW4zXSwgb3V0MCAgICAgICAgICAgICAgICEga2V5IDc1MzEKKwlhZGQJZ2xvYmFsMSwgNTEyLCBnbG9iYWwzICAgICAhIGFkZHJlc3Mgc2JveCAzCisJeG9yCWdsb2JhbDQsIGxvY2FsMSwgb3V0NSAgICAgISBpdiB4b3IgbmV4dCBibG9jaworCisJbGQJW2luMys0XSwgb3V0MSAgICAgICAgICAgICAhIGtleSA4NjQyCisJYWRkCWdsb2JhbDEsIDc2OCwgZ2xvYmFsNCAgICAgISBhZGRyZXNzIHNib3ggNAorCWJhCS5lZGUzLmVuYy5uZXh0LmJsb2NrXzIKKwlhZGQJaW4xLCA4LCBpbjEKKworLmVkZTMuZW5jLm5leHQuYmxvY2tfZnA6CisKKwlmcF9tYWNybyhpbjUsIG91dDUpCisKKwlzdG9yZV9saXR0bGVfZW5kaWFuKGluMSwgaW41LCBvdXQ1LCBsb2NhbDMsIC5TTEU1KSAgISBibG9jaworCisJYWRkY2MgICBpbjIsIC04LCBpbjIgICAgICAgICAgICAgICEgYnl0ZXMgbWlzc2luZyB3aGVuIG5leHQgYmxvY2sgZG9uZQorCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwlicG9zLHB0CSVpY2MsIC5lZGUzLmVuYy5uZXh0LmJsb2NrCisjZWxzZQorCWJwb3MJLmVkZTMuZW5jLm5leHQuYmxvY2sKKyNlbmRpZgorCWFkZAlpbjEsIDgsIGluMQorCisuZWRlMy5lbmMuc2V2ZW4ub3IubGVzczoKKworCWNtcAlpbjIsIC04CisKKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfVUxUUkFTUEFSQworCWJsZSxwdAklaWNjLCAuZWRlMy5lbmMuZmluaXNoCisjZWxzZQorCWJsZQkuZWRlMy5lbmMuZmluaXNoCisjZW5kaWYKKwlub3AKKworCWFkZAlpbjIsIDgsIGxvY2FsMSAgICAgICAgICAgICEgYnl0ZXMgdG8gbG9hZAorCisJISBhZGRyLCBsZW5ndGgsIGRlc3QgbGVmdCwgZGVzdCByaWdodCwgdGVtcCwgdGVtcDIsIGxhYmVsLCByZXQgbGFiZWwKKwlsb2FkX25fYnl0ZXMoaW4wLCBsb2NhbDEsIGdsb2JhbDQsIG91dDQsIGxvY2FsMiwgbG9jYWwzLCAuTE5CMiwgLmVkZTMuZW5jLm5leHQuYmxvY2tfMSkKKworLmVkZTMuZW5jLmZpbmlzaDoKKworCUxEUFRSCVslZnArQklBUytBUkcwKzYqQVJHU1pdLCBsb2NhbDQgICAgICAgICAgISBpdmVjCisJc3RvcmVfbGl0dGxlX2VuZGlhbihsb2NhbDQsIGluNSwgb3V0NSwgbG9jYWw1LCAuU0xFNikgICEgaXZlYworCisJcmV0CisJcmVzdG9yZQorCisuZWRlMy5kZWM6CisKKwlTVFBUUglpbjAsIElOUFVUCisJYWRkCWluNSwgMTIwLCBpbjUKKworCVNUUFRSCWluMSwgT1VUUFVUCisJbW92CWluMCwgbG9jYWw1CisJYWRkCWluMywgMTIwLCBpbjMKKworCVNUUFRSCWluMywgS1MxCisJY21wCWluMiwgMAorCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwlibGUJJWljYywgLmVkZTMuZGVjLmZpbmlzaAorI2Vsc2UKKwlibGUJLmVkZTMuZGVjLmZpbmlzaAorI2VuZGlmCisJU1RQVFIJaW41LCBLUzMKKworCUxEUFRSCVslZnArQklBUytBUkcwKzYqQVJHU1pdLCBsb2NhbDcgICAgICAgICAgISBpdgorCWxvYWRfbGl0dGxlX2VuZGlhbihsb2NhbDcsIGluMCwgaW4xLCBsb2NhbDMsIC5MTEU4KQorCisuZWRlMy5kZWMubmV4dC5ibG9jazoKKworCWxvYWRfbGl0dGxlX2VuZGlhbihsb2NhbDUsIGluNSwgb3V0NSwgbG9jYWwzLCAuTExFOSkKKworCSEgcGFyYW1ldGVyIDYgIDEvMiBmb3IgaW5jbHVkZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24KKwkhIHBhcmFtZXRlciA3ICAxIGZvciBtb3YgaW4xIHRvIGluMworCSEgcGFyYW1ldGVyIDggIDEgZm9yIG1vdiBpbjMgdG8gaW40CisJISBwYXJhbWV0ZXIgOSAgMSBmb3IgbG9hZCBrczMgYW5kIGtzMiB0byBpbjQgYW5kIGluMworCisJaXBfbWFjcm8oaW41LCBvdXQ1LCBvdXQ1LCBpbjUsIGluNCwgMiwgMCwgMCwgMSkgISBpbmMgLmRlc19kZWMga3MzIGluNAorCisJY2FsbCAuZGVzX2VuYyAgICAgICAgICAgICAgICAgICAgICEga3MyIGluMworCUxEUFRSCUtTMSwgaW40CisKKwljYWxsIC5kZXNfZGVjICAgICAgICAgICAgICAgICAgICAgISBrczEgaW40CisJbm9wCisKKwlmcF9tYWNybyhvdXQ1LCBpbjUsIDAsIDEpICAgISAxIGZvciBpbnB1dCBhbmQgb3V0cHV0IGFkZHJlc3MgbG9jYWw1LzcKKworCSEgaW4yIGlzIGJ5dGVzIGxlZnQgdG8gYmUgc3RvcmVkCisJISBpbjIgaXMgY29tcGFyZWQgdG8gOCBpbiB0aGUgcm91bmRzCisKKwl4b3IJb3V0NSwgaW4wLCBvdXQ0CisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKwlibCxwbgklaWNjLCAuZWRlMy5kZWMuc2V2ZW4ub3IubGVzcworI2Vsc2UKKwlibAkuZWRlMy5kZWMuc2V2ZW4ub3IubGVzcworI2VuZGlmCisJeG9yCWluNSwgaW4xLCBnbG9iYWw0CisKKwlsb2FkX2xpdHRsZV9lbmRpYW5faW5jKGxvY2FsNSwgaW4wLCBpbjEsIGxvY2FsMywgLkxMRTEwKSAgICEgaXYgbmV4dCBibG9jaworCisJc3RvcmVfbGl0dGxlX2VuZGlhbihsb2NhbDcsIG91dDQsIGdsb2JhbDQsIGxvY2FsMywgLlNMRTcpICAhIGJsb2NrCisKKwlTVFBUUglsb2NhbDUsIElOUFVUCisJYWRkY2MgICBpbjIsIC04LCBpbjIKKwlhZGQJbG9jYWw3LCA4LCBsb2NhbDcKKworI2lmZGVmIE9QRU5TU0xfU1lTTkFNRV9VTFRSQVNQQVJDCisJYmcscHQJJWljYywgLmVkZTMuZGVjLm5leHQuYmxvY2sKKyNlbHNlCisJYmcJLmVkZTMuZGVjLm5leHQuYmxvY2sKKyNlbmRpZgorCVNUUFRSCWxvY2FsNywgT1VUUFVUCisKKy5lZGUzLmRlYy5zdG9yZS5pdjoKKworCUxEUFRSCVslZnArQklBUytBUkcwKzYqQVJHU1pdLCBsb2NhbDQgICAgICAgICAgISBpdmVjCisJc3RvcmVfbGl0dGxlX2VuZGlhbihsb2NhbDQsIGluMCwgaW4xLCBsb2NhbDUsIC5TTEU4KSAgISBpdmVjCisKKy5lZGUzLmRlYy5maW5pc2g6CisKKwlyZXQKKwlyZXN0b3JlCisKKy5lZGUzLmRlYy5zZXZlbi5vci5sZXNzOgorCisJbG9hZF9saXR0bGVfZW5kaWFuX2luYyhsb2NhbDUsIGluMCwgaW4xLCBsb2NhbDMsIC5MTEUxNCkgICAgICEgaXYKKworCXN0b3JlX25fYnl0ZXMobG9jYWw3LCBpbjIsIGdsb2JhbDQsIG91dDQsIGxvY2FsMywgbG9jYWw0LCAuU05CMiwgLmVkZTMuZGVjLnN0b3JlLml2KQorCisKKy5ERVNfZWRlM19jYmNfZW5jcnlwdC5lbmQ6CisJLnNpemUJIERFU19lZGUzX2NiY19lbmNyeXB0LC5ERVNfZWRlM19jYmNfZW5jcnlwdC5lbmQtREVTX2VkZTNfY2JjX2VuY3J5cHQKKworCS5hbGlnbgkyNTYKKwkudHlwZQkgLmRlc19hbmQsI29iamVjdAorCS5zaXplCSAuZGVzX2FuZCwyODQKKworLmRlc19hbmQ6CisKKyEgVGhpcyB0YWJsZSBpcyB1c2VkIGZvciBBTkQgMHhGQyB3aGVuIGl0IGlzIGtub3duIHRoYXQgcmVnaXN0ZXIKKyEgYml0cyA4LTMxIGFyZSB6ZXJvLiBNYWtlcyBpdCBwb3NzaWJsZSB0byBkbyB0aHJlZSBhcml0aG1ldGljCishIG9wZXJhdGlvbnMgaW4gb25lIGN5Y2xlLgorCisJLmJ5dGUgIDAsIDAsIDAsIDAsIDQsIDQsIDQsIDQKKwkuYnl0ZSAgOCwgOCwgOCwgOCwgMTIsIDEyLCAxMiwgMTIKKwkuYnl0ZSAgMTYsIDE2LCAxNiwgMTYsIDIwLCAyMCwgMjAsIDIwCisJLmJ5dGUgIDI0LCAyNCwgMjQsIDI0LCAyOCwgMjgsIDI4LCAyOAorCS5ieXRlICAzMiwgMzIsIDMyLCAzMiwgMzYsIDM2LCAzNiwgMzYKKwkuYnl0ZSAgNDAsIDQwLCA0MCwgNDAsIDQ0LCA0NCwgNDQsIDQ0CisJLmJ5dGUgIDQ4LCA0OCwgNDgsIDQ4LCA1MiwgNTIsIDUyLCA1MgorCS5ieXRlICA1NiwgNTYsIDU2LCA1NiwgNjAsIDYwLCA2MCwgNjAKKwkuYnl0ZSAgNjQsIDY0LCA2NCwgNjQsIDY4LCA2OCwgNjgsIDY4CisJLmJ5dGUgIDcyLCA3MiwgNzIsIDcyLCA3NiwgNzYsIDc2LCA3NgorCS5ieXRlICA4MCwgODAsIDgwLCA4MCwgODQsIDg0LCA4NCwgODQKKwkuYnl0ZSAgODgsIDg4LCA4OCwgODgsIDkyLCA5MiwgOTIsIDkyCisJLmJ5dGUgIDk2LCA5NiwgOTYsIDk2LCAxMDAsIDEwMCwgMTAwLCAxMDAKKwkuYnl0ZSAgMTA0LCAxMDQsIDEwNCwgMTA0LCAxMDgsIDEwOCwgMTA4LCAxMDgKKwkuYnl0ZSAgMTEyLCAxMTIsIDExMiwgMTEyLCAxMTYsIDExNiwgMTE2LCAxMTYKKwkuYnl0ZSAgMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjQsIDEyNCwgMTI0LCAxMjQKKwkuYnl0ZSAgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMzIsIDEzMiwgMTMyLCAxMzIKKwkuYnl0ZSAgMTM2LCAxMzYsIDEzNiwgMTM2LCAxNDAsIDE0MCwgMTQwLCAxNDAKKwkuYnl0ZSAgMTQ0LCAxNDQsIDE0NCwgMTQ0LCAxNDgsIDE0OCwgMTQ4LCAxNDgKKwkuYnl0ZSAgMTUyLCAxNTIsIDE1MiwgMTUyLCAxNTYsIDE1NiwgMTU2LCAxNTYKKwkuYnl0ZSAgMTYwLCAxNjAsIDE2MCwgMTYwLCAxNjQsIDE2NCwgMTY0LCAxNjQKKwkuYnl0ZSAgMTY4LCAxNjgsIDE2OCwgMTY4LCAxNzIsIDE3MiwgMTcyLCAxNzIKKwkuYnl0ZSAgMTc2LCAxNzYsIDE3NiwgMTc2LCAxODAsIDE4MCwgMTgwLCAxODAKKwkuYnl0ZSAgMTg0LCAxODQsIDE4NCwgMTg0LCAxODgsIDE4OCwgMTg4LCAxODgKKwkuYnl0ZSAgMTkyLCAxOTIsIDE5MiwgMTkyLCAxOTYsIDE5NiwgMTk2LCAxOTYKKwkuYnl0ZSAgMjAwLCAyMDAsIDIwMCwgMjAwLCAyMDQsIDIwNCwgMjA0LCAyMDQKKwkuYnl0ZSAgMjA4LCAyMDgsIDIwOCwgMjA4LCAyMTIsIDIxMiwgMjEyLCAyMTIKKwkuYnl0ZSAgMjE2LCAyMTYsIDIxNiwgMjE2LCAyMjAsIDIyMCwgMjIwLCAyMjAKKwkuYnl0ZSAgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjgsIDIyOCwgMjI4LCAyMjgKKwkuYnl0ZSAgMjMyLCAyMzIsIDIzMiwgMjMyLCAyMzYsIDIzNiwgMjM2LCAyMzYKKwkuYnl0ZSAgMjQwLCAyNDAsIDI0MCwgMjQwLCAyNDQsIDI0NCwgMjQ0LCAyNDQKKwkuYnl0ZSAgMjQ4LCAyNDgsIDI0OCwgMjQ4LCAyNTIsIDI1MiwgMjUyLCAyNTIKKworCSEgNSBudW1iZXJzIGZvciBpbml0aWwvZmluYWwgcGVybXV0YXRpb24KKworCS53b3JkICAgMHgwZjBmMGYwZiAgICAgICAgICAgICAgICAhIG9mZnNldCAyNTYKKwkud29yZAkweDAwMDBmZmZmICAgICAgICAgICAgICAgICEgMjYwCisJLndvcmQJMHgzMzMzMzMzMyAgICAgICAgICAgICAgICAhIDI2NAorCS53b3JkCTB4MDBmZjAwZmYgICAgICAgICAgICAgICAgISAyNjgKKwkud29yZAkweDU1NTU1NTU1ICAgICAgICAgICAgICAgICEgMjcyCisKKwkud29yZAkwICAgICAgICAgICAgICAgICAgICAgICAgICEgMjc2CisJLndvcmQJTE9PUFMgICAgICAgICAgICAgICAgICAgICAhIDI4MAorCS53b3JkCTB4MDAwMEZDMDAgICAgICAgICAgICAgICAgISAyODQKKworCS5nbG9iYWwJREVTX1NQdHJhbnMKKwkudHlwZQlERVNfU1B0cmFucywjb2JqZWN0CisJLnNpemUJREVTX1NQdHJhbnMsMjA0OAorLmFsaWduCTY0CitERVNfU1B0cmFuczoKKy5QSUMuREVTX1NQdHJhbnM6CisJISBuaWJibGUgMAorCS53b3JkCTB4MDIwODA4MDAsIDB4MDAwODAwMDAsIDB4MDIwMDAwMDIsIDB4MDIwODA4MDIKKwkud29yZAkweDAyMDAwMDAwLCAweDAwMDgwODAyLCAweDAwMDgwMDAyLCAweDAyMDAwMDAyCisJLndvcmQJMHgwMDA4MDgwMiwgMHgwMjA4MDgwMCwgMHgwMjA4MDAwMCwgMHgwMDAwMDgwMgorCS53b3JkCTB4MDIwMDA4MDIsIDB4MDIwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwODAwMDIKKwkud29yZAkweDAwMDgwMDAwLCAweDAwMDAwMDAyLCAweDAyMDAwODAwLCAweDAwMDgwODAwCisJLndvcmQJMHgwMjA4MDgwMiwgMHgwMjA4MDAwMCwgMHgwMDAwMDgwMiwgMHgwMjAwMDgwMAorCS53b3JkCTB4MDAwMDAwMDIsIDB4MDAwMDA4MDAsIDB4MDAwODA4MDAsIDB4MDIwODAwMDIKKwkud29yZAkweDAwMDAwODAwLCAweDAyMDAwODAyLCAweDAyMDgwMDAyLCAweDAwMDAwMDAwCisJLndvcmQJMHgwMDAwMDAwMCwgMHgwMjA4MDgwMiwgMHgwMjAwMDgwMCwgMHgwMDA4MDAwMgorCS53b3JkCTB4MDIwODA4MDAsIDB4MDAwODAwMDAsIDB4MDAwMDA4MDIsIDB4MDIwMDA4MDAKKwkud29yZAkweDAyMDgwMDAyLCAweDAwMDAwODAwLCAweDAwMDgwODAwLCAweDAyMDAwMDAyCisJLndvcmQJMHgwMDA4MDgwMiwgMHgwMDAwMDAwMiwgMHgwMjAwMDAwMiwgMHgwMjA4MDAwMAorCS53b3JkCTB4MDIwODA4MDIsIDB4MDAwODA4MDAsIDB4MDIwODAwMDAsIDB4MDIwMDA4MDIKKwkud29yZAkweDAyMDAwMDAwLCAweDAwMDAwODAyLCAweDAwMDgwMDAyLCAweDAwMDAwMDAwCisJLndvcmQJMHgwMDA4MDAwMCwgMHgwMjAwMDAwMCwgMHgwMjAwMDgwMiwgMHgwMjA4MDgwMAorCS53b3JkCTB4MDAwMDAwMDIsIDB4MDIwODAwMDIsIDB4MDAwMDA4MDAsIDB4MDAwODA4MDIKKwkhIG5pYmJsZSAxCisJLndvcmQJMHg0MDEwODAxMCwgMHgwMDAwMDAwMCwgMHgwMDEwODAwMCwgMHg0MDEwMDAwMAorCS53b3JkCTB4NDAwMDAwMTAsIDB4MDAwMDgwMTAsIDB4NDAwMDgwMDAsIDB4MDAxMDgwMDAKKwkud29yZAkweDAwMDA4MDAwLCAweDQwMTAwMDEwLCAweDAwMDAwMDEwLCAweDQwMDA4MDAwCisJLndvcmQJMHgwMDEwMDAxMCwgMHg0MDEwODAwMCwgMHg0MDEwMDAwMCwgMHgwMDAwMDAxMAorCS53b3JkCTB4MDAxMDAwMDAsIDB4NDAwMDgwMTAsIDB4NDAxMDAwMTAsIDB4MDAwMDgwMDAKKwkud29yZAkweDAwMTA4MDEwLCAweDQwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMTAwMDEwCisJLndvcmQJMHg0MDAwODAxMCwgMHgwMDEwODAxMCwgMHg0MDEwODAwMCwgMHg0MDAwMDAxMAorCS53b3JkCTB4NDAwMDAwMDAsIDB4MDAxMDAwMDAsIDB4MDAwMDgwMTAsIDB4NDAxMDgwMTAKKwkud29yZAkweDAwMTAwMDEwLCAweDQwMTA4MDAwLCAweDQwMDA4MDAwLCAweDAwMTA4MDEwCisJLndvcmQJMHg0MDEwODAxMCwgMHgwMDEwMDAxMCwgMHg0MDAwMDAxMCwgMHgwMDAwMDAwMAorCS53b3JkCTB4NDAwMDAwMDAsIDB4MDAwMDgwMTAsIDB4MDAxMDAwMDAsIDB4NDAxMDAwMTAKKwkud29yZAkweDAwMDA4MDAwLCAweDQwMDAwMDAwLCAweDAwMTA4MDEwLCAweDQwMDA4MDEwCisJLndvcmQJMHg0MDEwODAwMCwgMHgwMDAwODAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwMDAxMAorCS53b3JkCTB4MDAwMDAwMTAsIDB4NDAxMDgwMTAsIDB4MDAxMDgwMDAsIDB4NDAxMDAwMDAKKwkud29yZAkweDQwMTAwMDEwLCAweDAwMTAwMDAwLCAweDAwMDA4MDEwLCAweDQwMDA4MDAwCisJLndvcmQJMHg0MDAwODAxMCwgMHgwMDAwMDAxMCwgMHg0MDEwMDAwMCwgMHgwMDEwODAwMAorCSEgbmliYmxlIDIKKwkud29yZAkweDA0MDAwMDAxLCAweDA0MDQwMTAwLCAweDAwMDAwMTAwLCAweDA0MDAwMTAxCisJLndvcmQJMHgwMDA0MDAwMSwgMHgwNDAwMDAwMCwgMHgwNDAwMDEwMSwgMHgwMDA0MDEwMAorCS53b3JkCTB4MDQwMDAxMDAsIDB4MDAwNDAwMDAsIDB4MDQwNDAwMDAsIDB4MDAwMDAwMDEKKwkud29yZAkweDA0MDQwMTAxLCAweDAwMDAwMTAxLCAweDAwMDAwMDAxLCAweDA0MDQwMDAxCisJLndvcmQJMHgwMDAwMDAwMCwgMHgwMDA0MDAwMSwgMHgwNDA0MDEwMCwgMHgwMDAwMDEwMAorCS53b3JkCTB4MDAwMDAxMDEsIDB4MDQwNDAxMDEsIDB4MDAwNDAwMDAsIDB4MDQwMDAwMDEKKwkud29yZAkweDA0MDQwMDAxLCAweDA0MDAwMTAwLCAweDAwMDQwMTAxLCAweDA0MDQwMDAwCisJLndvcmQJMHgwMDA0MDEwMCwgMHgwMDAwMDAwMCwgMHgwNDAwMDAwMCwgMHgwMDA0MDEwMQorCS53b3JkCTB4MDQwNDAxMDAsIDB4MDAwMDAxMDAsIDB4MDAwMDAwMDEsIDB4MDAwNDAwMDAKKwkud29yZAkweDAwMDAwMTAxLCAweDAwMDQwMDAxLCAweDA0MDQwMDAwLCAweDA0MDAwMTAxCisJLndvcmQJMHgwMDAwMDAwMCwgMHgwNDA0MDEwMCwgMHgwMDA0MDEwMCwgMHgwNDA0MDAwMQorCS53b3JkCTB4MDAwNDAwMDEsIDB4MDQwMDAwMDAsIDB4MDQwNDAxMDEsIDB4MDAwMDAwMDEKKwkud29yZAkweDAwMDQwMTAxLCAweDA0MDAwMDAxLCAweDA0MDAwMDAwLCAweDA0MDQwMTAxCisJLndvcmQJMHgwMDA0MDAwMCwgMHgwNDAwMDEwMCwgMHgwNDAwMDEwMSwgMHgwMDA0MDEwMAorCS53b3JkCTB4MDQwMDAxMDAsIDB4MDAwMDAwMDAsIDB4MDQwNDAwMDEsIDB4MDAwMDAxMDEKKwkud29yZAkweDA0MDAwMDAxLCAweDAwMDQwMTAxLCAweDAwMDAwMTAwLCAweDA0MDQwMDAwCisJISBuaWJibGUgMworCS53b3JkCTB4MDA0MDEwMDgsIDB4MTAwMDEwMDAsIDB4MDAwMDAwMDgsIDB4MTA0MDEwMDgKKwkud29yZAkweDAwMDAwMDAwLCAweDEwNDAwMDAwLCAweDEwMDAxMDA4LCAweDAwNDAwMDA4CisJLndvcmQJMHgxMDQwMTAwMCwgMHgxMDAwMDAwOCwgMHgxMDAwMDAwMCwgMHgwMDAwMTAwOAorCS53b3JkCTB4MTAwMDAwMDgsIDB4MDA0MDEwMDgsIDB4MDA0MDAwMDAsIDB4MTAwMDAwMDAKKwkud29yZAkweDEwNDAwMDA4LCAweDAwNDAxMDAwLCAweDAwMDAxMDAwLCAweDAwMDAwMDA4CisJLndvcmQJMHgwMDQwMTAwMCwgMHgxMDAwMTAwOCwgMHgxMDQwMDAwMCwgMHgwMDAwMTAwMAorCS53b3JkCTB4MDAwMDEwMDgsIDB4MDAwMDAwMDAsIDB4MDA0MDAwMDgsIDB4MTA0MDEwMDAKKwkud29yZAkweDEwMDAxMDAwLCAweDEwNDAwMDA4LCAweDEwNDAxMDA4LCAweDAwNDAwMDAwCisJLndvcmQJMHgxMDQwMDAwOCwgMHgwMDAwMTAwOCwgMHgwMDQwMDAwMCwgMHgxMDAwMDAwOAorCS53b3JkCTB4MDA0MDEwMDAsIDB4MTAwMDEwMDAsIDB4MDAwMDAwMDgsIDB4MTA0MDAwMDAKKwkud29yZAkweDEwMDAxMDA4LCAweDAwMDAwMDAwLCAweDAwMDAxMDAwLCAweDAwNDAwMDA4CisJLndvcmQJMHgwMDAwMDAwMCwgMHgxMDQwMDAwOCwgMHgxMDQwMTAwMCwgMHgwMDAwMTAwMAorCS53b3JkCTB4MTAwMDAwMDAsIDB4MTA0MDEwMDgsIDB4MDA0MDEwMDgsIDB4MDA0MDAwMDAKKwkud29yZAkweDEwNDAxMDA4LCAweDAwMDAwMDA4LCAweDEwMDAxMDAwLCAweDAwNDAxMDA4CisJLndvcmQJMHgwMDQwMDAwOCwgMHgwMDQwMTAwMCwgMHgxMDQwMDAwMCwgMHgxMDAwMTAwOAorCS53b3JkCTB4MDAwMDEwMDgsIDB4MTAwMDAwMDAsIDB4MTAwMDAwMDgsIDB4MTA0MDEwMDAKKwkhIG5pYmJsZSA0CisJLndvcmQJMHgwODAwMDAwMCwgMHgwMDAxMDAwMCwgMHgwMDAwMDQwMCwgMHgwODAxMDQyMAorCS53b3JkCTB4MDgwMTAwMjAsIDB4MDgwMDA0MDAsIDB4MDAwMTA0MjAsIDB4MDgwMTAwMDAKKwkud29yZAkweDAwMDEwMDAwLCAweDAwMDAwMDIwLCAweDA4MDAwMDIwLCAweDAwMDEwNDAwCisJLndvcmQJMHgwODAwMDQyMCwgMHgwODAxMDAyMCwgMHgwODAxMDQwMCwgMHgwMDAwMDAwMAorCS53b3JkCTB4MDAwMTA0MDAsIDB4MDgwMDAwMDAsIDB4MDAwMTAwMjAsIDB4MDAwMDA0MjAKKwkud29yZAkweDA4MDAwNDAwLCAweDAwMDEwNDIwLCAweDAwMDAwMDAwLCAweDA4MDAwMDIwCisJLndvcmQJMHgwMDAwMDAyMCwgMHgwODAwMDQyMCwgMHgwODAxMDQyMCwgMHgwMDAxMDAyMAorCS53b3JkCTB4MDgwMTAwMDAsIDB4MDAwMDA0MDAsIDB4MDAwMDA0MjAsIDB4MDgwMTA0MDAKKwkud29yZAkweDA4MDEwNDAwLCAweDA4MDAwNDIwLCAweDAwMDEwMDIwLCAweDA4MDEwMDAwCisJLndvcmQJMHgwMDAxMDAwMCwgMHgwMDAwMDAyMCwgMHgwODAwMDAyMCwgMHgwODAwMDQwMAorCS53b3JkCTB4MDgwMDAwMDAsIDB4MDAwMTA0MDAsIDB4MDgwMTA0MjAsIDB4MDAwMDAwMDAKKwkud29yZAkweDAwMDEwNDIwLCAweDA4MDAwMDAwLCAweDAwMDAwNDAwLCAweDAwMDEwMDIwCisJLndvcmQJMHgwODAwMDQyMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDAwMCwgMHgwODAxMDQyMAorCS53b3JkCTB4MDgwMTAwMjAsIDB4MDgwMTA0MDAsIDB4MDAwMDA0MjAsIDB4MDAwMTAwMDAKKwkud29yZAkweDAwMDEwNDAwLCAweDA4MDEwMDIwLCAweDA4MDAwNDAwLCAweDAwMDAwNDIwCisJLndvcmQJMHgwMDAwMDAyMCwgMHgwMDAxMDQyMCwgMHgwODAxMDAwMCwgMHgwODAwMDAyMAorCSEgbmliYmxlIDUKKwkud29yZAkweDgwMDAwMDQwLCAweDAwMjAwMDQwLCAweDAwMDAwMDAwLCAweDgwMjAyMDAwCisJLndvcmQJMHgwMDIwMDA0MCwgMHgwMDAwMjAwMCwgMHg4MDAwMjA0MCwgMHgwMDIwMDAwMAorCS53b3JkCTB4MDAwMDIwNDAsIDB4ODAyMDIwNDAsIDB4MDAyMDIwMDAsIDB4ODAwMDAwMDAKKwkud29yZAkweDgwMDAyMDAwLCAweDgwMDAwMDQwLCAweDgwMjAwMDAwLCAweDAwMjAyMDQwCisJLndvcmQJMHgwMDIwMDAwMCwgMHg4MDAwMjA0MCwgMHg4MDIwMDA0MCwgMHgwMDAwMDAwMAorCS53b3JkCTB4MDAwMDIwMDAsIDB4MDAwMDAwNDAsIDB4ODAyMDIwMDAsIDB4ODAyMDAwNDAKKwkud29yZAkweDgwMjAyMDQwLCAweDgwMjAwMDAwLCAweDgwMDAwMDAwLCAweDAwMDAyMDQwCisJLndvcmQJMHgwMDAwMDA0MCwgMHgwMDIwMjAwMCwgMHgwMDIwMjA0MCwgMHg4MDAwMjAwMAorCS53b3JkCTB4MDAwMDIwNDAsIDB4ODAwMDAwMDAsIDB4ODAwMDIwMDAsIDB4MDAyMDIwNDAKKwkud29yZAkweDgwMjAyMDAwLCAweDAwMjAwMDQwLCAweDAwMDAwMDAwLCAweDgwMDAyMDAwCisJLndvcmQJMHg4MDAwMDAwMCwgMHgwMDAwMjAwMCwgMHg4MDIwMDA0MCwgMHgwMDIwMDAwMAorCS53b3JkCTB4MDAyMDAwNDAsIDB4ODAyMDIwNDAsIDB4MDAyMDIwMDAsIDB4MDAwMDAwNDAKKwkud29yZAkweDgwMjAyMDQwLCAweDAwMjAyMDAwLCAweDAwMjAwMDAwLCAweDgwMDAyMDQwCisJLndvcmQJMHg4MDAwMDA0MCwgMHg4MDIwMDAwMCwgMHgwMDIwMjA0MCwgMHgwMDAwMDAwMAorCS53b3JkCTB4MDAwMDIwMDAsIDB4ODAwMDAwNDAsIDB4ODAwMDIwNDAsIDB4ODAyMDIwMDAKKwkud29yZAkweDgwMjAwMDAwLCAweDAwMDAyMDQwLCAweDAwMDAwMDQwLCAweDgwMjAwMDQwCisJISBuaWJibGUgNgorCS53b3JkCTB4MDAwMDQwMDAsIDB4MDAwMDAyMDAsIDB4MDEwMDAyMDAsIDB4MDEwMDAwMDQKKwkud29yZAkweDAxMDA0MjA0LCAweDAwMDA0MDA0LCAweDAwMDA0MjAwLCAweDAwMDAwMDAwCisJLndvcmQJMHgwMTAwMDAwMCwgMHgwMTAwMDIwNCwgMHgwMDAwMDIwNCwgMHgwMTAwNDAwMAorCS53b3JkCTB4MDAwMDAwMDQsIDB4MDEwMDQyMDAsIDB4MDEwMDQwMDAsIDB4MDAwMDAyMDQKKwkud29yZAkweDAxMDAwMjA0LCAweDAwMDA0MDAwLCAweDAwMDA0MDA0LCAweDAxMDA0MjA0CisJLndvcmQJMHgwMDAwMDAwMCwgMHgwMTAwMDIwMCwgMHgwMTAwMDAwNCwgMHgwMDAwNDIwMAorCS53b3JkCTB4MDEwMDQwMDQsIDB4MDAwMDQyMDQsIDB4MDEwMDQyMDAsIDB4MDAwMDAwMDQKKwkud29yZAkweDAwMDA0MjA0LCAweDAxMDA0MDA0LCAweDAwMDAwMjAwLCAweDAxMDAwMDAwCisJLndvcmQJMHgwMDAwNDIwNCwgMHgwMTAwNDAwMCwgMHgwMTAwNDAwNCwgMHgwMDAwMDIwNAorCS53b3JkCTB4MDAwMDQwMDAsIDB4MDAwMDAyMDAsIDB4MDEwMDAwMDAsIDB4MDEwMDQwMDQKKwkud29yZAkweDAxMDAwMjA0LCAweDAwMDA0MjA0LCAweDAwMDA0MjAwLCAweDAwMDAwMDAwCisJLndvcmQJMHgwMDAwMDIwMCwgMHgwMTAwMDAwNCwgMHgwMDAwMDAwNCwgMHgwMTAwMDIwMAorCS53b3JkCTB4MDAwMDAwMDAsIDB4MDEwMDAyMDQsIDB4MDEwMDAyMDAsIDB4MDAwMDQyMDAKKwkud29yZAkweDAwMDAwMjA0LCAweDAwMDA0MDAwLCAweDAxMDA0MjA0LCAweDAxMDAwMDAwCisJLndvcmQJMHgwMTAwNDIwMCwgMHgwMDAwMDAwNCwgMHgwMDAwNDAwNCwgMHgwMTAwNDIwNAorCS53b3JkCTB4MDEwMDAwMDQsIDB4MDEwMDQyMDAsIDB4MDEwMDQwMDAsIDB4MDAwMDQwMDQKKwkhIG5pYmJsZSA3CisJLndvcmQJMHgyMDgwMDA4MCwgMHgyMDgyMDAwMCwgMHgwMDAyMDA4MCwgMHgwMDAwMDAwMAorCS53b3JkCTB4MjAwMjAwMDAsIDB4MDA4MDAwODAsIDB4MjA4MDAwMDAsIDB4MjA4MjAwODAKKwkud29yZAkweDAwMDAwMDgwLCAweDIwMDAwMDAwLCAweDAwODIwMDAwLCAweDAwMDIwMDgwCisJLndvcmQJMHgwMDgyMDA4MCwgMHgyMDAyMDA4MCwgMHgyMDAwMDA4MCwgMHgyMDgwMDAwMAorCS53b3JkCTB4MDAwMjAwMDAsIDB4MDA4MjAwODAsIDB4MDA4MDAwODAsIDB4MjAwMjAwMDAKKwkud29yZAkweDIwODIwMDgwLCAweDIwMDAwMDgwLCAweDAwMDAwMDAwLCAweDAwODIwMDAwCisJLndvcmQJMHgyMDAwMDAwMCwgMHgwMDgwMDAwMCwgMHgyMDAyMDA4MCwgMHgyMDgwMDA4MAorCS53b3JkCTB4MDA4MDAwMDAsIDB4MDAwMjAwMDAsIDB4MjA4MjAwMDAsIDB4MDAwMDAwODAKKwkud29yZAkweDAwODAwMDAwLCAweDAwMDIwMDAwLCAweDIwMDAwMDgwLCAweDIwODIwMDgwCisJLndvcmQJMHgwMDAyMDA4MCwgMHgyMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDgyMDAwMAorCS53b3JkCTB4MjA4MDAwODAsIDB4MjAwMjAwODAsIDB4MjAwMjAwMDAsIDB4MDA4MDAwODAKKwkud29yZAkweDIwODIwMDAwLCAweDAwMDAwMDgwLCAweDAwODAwMDgwLCAweDIwMDIwMDAwCisJLndvcmQJMHgyMDgyMDA4MCwgMHgwMDgwMDAwMCwgMHgyMDgwMDAwMCwgMHgyMDAwMDA4MAorCS53b3JkCTB4MDA4MjAwMDAsIDB4MDAwMjAwODAsIDB4MjAwMjAwODAsIDB4MjA4MDAwMDAKKwkud29yZAkweDAwMDAwMDgwLCAweDIwODIwMDAwLCAweDAwODIwMDgwLCAweDAwMDAwMDAwCisJLndvcmQJMHgyMDAwMDAwMCwgMHgyMDgwMDA4MCwgMHgwMDAyMDAwMCwgMHgwMDgyMDA4MAorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2FzbS9kZXNib3RoLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9hc20vZGVzYm90aC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWMwMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9hc20vZGVzYm90aC5wbApAQCAtMCwwICsxLDc5IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworJEw9ImVkaSI7CiskUj0iZXNpIjsKKworc3ViIERFU19lbmNyeXB0MworCXsKKwlsb2NhbCgkbmFtZSwkZW5jKT1AXzsKKworCSZmdW5jdGlvbl9iZWdpbl9CKCRuYW1lLCIiKTsKKwkmcHVzaCgiZWJ4Iik7CisJJm1vdigiZWJ4Iiwmd3BhcmFtKDApKTsKKworCSZwdXNoKCJlYnAiKTsKKwkmcHVzaCgiZXNpIik7CisKKwkmcHVzaCgiZWRpIik7CisKKwkmY29tbWVudCgiIik7CisJJmNvbW1lbnQoIkxvYWQgdGhlIGRhdGEgd29yZHMiKTsKKwkmbW92KCRMLCZEV1AoMCwiZWJ4IiwiIiwwKSk7CisJJm1vdigkUiwmRFdQKDQsImVieCIsIiIsMCkpOworCSZzdGFja19wdXNoKDMpOworCisJJmNvbW1lbnQoIiIpOworCSZjb21tZW50KCJJUCIpOworCSZJUF9uZXcoJEwsJFIsImVkeCIsMCk7CisKKwkjIHB1dCB0aGVtIGJhY2sKKwkKKwlpZiAoJGVuYykKKwkJeworCQkmbW92KCZEV1AoNCwiZWJ4IiwiIiwwKSwkUik7CisJCSAmbW92KCJlYXgiLCZ3cGFyYW0oMSkpOworCQkmbW92KCZEV1AoMCwiZWJ4IiwiIiwwKSwiZWR4Iik7CisJCSAmbW92KCJlZGkiLCZ3cGFyYW0oMikpOworCQkgJm1vdigiZXNpIiwmd3BhcmFtKDMpKTsKKwkJfQorCWVsc2UKKwkJeworCQkmbW92KCZEV1AoNCwiZWJ4IiwiIiwwKSwkUik7CisJCSAmbW92KCJlc2kiLCZ3cGFyYW0oMSkpOworCQkmbW92KCZEV1AoMCwiZWJ4IiwiIiwwKSwiZWR4Iik7CisJCSAmbW92KCJlZGkiLCZ3cGFyYW0oMikpOworCQkgJm1vdigiZWF4Iiwmd3BhcmFtKDMpKTsKKwkJfQorCSZtb3YoJnN3dG1wKDIpLAkoRFdDKCgkZW5jKT8iMSI6IjAiKSkpOworCSZtb3YoJnN3dG1wKDEpLAkiZWF4Iik7CisJJm1vdigmc3d0bXAoMCksCSJlYngiKTsKKwkmY2FsbCgiREVTX2VuY3J5cHQyIik7CisJJm1vdigmc3d0bXAoMiksCShEV0MoKCRlbmMpPyIwIjoiMSIpKSk7CisJJm1vdigmc3d0bXAoMSksCSJlZGkiKTsKKwkmbW92KCZzd3RtcCgwKSwJImVieCIpOworCSZjYWxsKCJERVNfZW5jcnlwdDIiKTsKKwkmbW92KCZzd3RtcCgyKSwJKERXQygoJGVuYyk/IjEiOiIwIikpKTsKKwkmbW92KCZzd3RtcCgxKSwJImVzaSIpOworCSZtb3YoJnN3dG1wKDApLAkiZWJ4Iik7CisJJmNhbGwoIkRFU19lbmNyeXB0MiIpOworCisJJnN0YWNrX3BvcCgzKTsKKwkmbW92KCRMLCZEV1AoMCwiZWJ4IiwiIiwwKSk7CisJJm1vdigkUiwmRFdQKDQsImVieCIsIiIsMCkpOworCisJJmNvbW1lbnQoIiIpOworCSZjb21tZW50KCJGUCIpOworCSZGUF9uZXcoJEwsJFIsImVheCIsMCk7CisKKwkmbW92KCZEV1AoMCwiZWJ4IiwiIiwwKSwiZWF4Iik7CisJJm1vdigmRFdQKDQsImVieCIsIiIsMCksJFIpOworCisJJnBvcCgiZWRpIik7CisJJnBvcCgiZXNpIik7CisJJnBvcCgiZWJwIik7CisJJnBvcCgiZWJ4Iik7CisJJnJldCgpOworCSZmdW5jdGlvbl9lbmRfQigkbmFtZSk7CisJfQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvYXNtL3JlYWRtZSBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvYXNtL3JlYWRtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVhZmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9hc20vcmVhZG1lCkBAIC0wLDAgKzEsMTMxIEBACitGaXJzdCB1cCwgbGV0IG1lIHNheSBJIGRvbid0IGxpa2Ugd3JpdGluZyBpbiBhc3NlbWJsZXIuICBJdCBpcyBub3QgcG9ydGFibGUsCitkZXBlbmRhbnQgb24gdGhlIHBhcnRpY3VsYXIgQ1BVIGFyY2hpdGVjdHVyZSByZWxlYXNlIGFuZCBpcyBnZW5lcmFsbHkgYSBwaWcKK3RvIGRlYnVnIGFuZCBnZXQgcmlnaHQuICBIYXZpbmcgc2FpZCB0aGF0LCB0aGUgeDg2IGFyY2hpdGVjdHVyZSBpcyBwcm9iYWJseQordGhlIG1vc3QgaW1wb3J0YW50IGZvciBzcGVlZCBkdWUgdG8gbnVtYmVyIG9mIGJveGVzIGFuZCBzaW5jZQoraXQgYXBwZWFycyB0byBiZSB0aGUgd29yc3QgYXJjaGl0ZWN0dXJlIHRvIHRvIGdldAorZ29vZCBDIGNvbXBpbGVycyBmb3IuICBTbyBkdWUgdG8gdGhpcywgSSBoYXZlIGxvd2VyZWQgbXlzZWxmIHRvIGRvCithc3NlbWJsZXIgZm9yIHRoZSBpbm5lciBERVMgcm91dGluZXMgaW4gbGliZGVzIDotKS4KKworVGhlIGZpbGUgdG8gaW1wbGVtZW50IGluIGFzc2VtYmxlciBpcyBkZXNfZW5jLmMuICBSZXBsYWNlIHRoZSBmb2xsb3dpbmcKKzQgZnVuY3Rpb25zCitkZXNfZW5jcnlwdDEoREVTX0xPTkcgZGF0YVsyXSxkZXNfa2V5X3NjaGVkdWxlIGtzLCBpbnQgZW5jcnlwdCk7CitkZXNfZW5jcnlwdDIoREVTX0xPTkcgZGF0YVsyXSxkZXNfa2V5X3NjaGVkdWxlIGtzLCBpbnQgZW5jcnlwdCk7CitkZXNfZW5jcnlwdDMoREVTX0xPTkcgZGF0YVsyXSxkZXNfa2V5X3NjaGVkdWxlIGtzMSxrczIsa3MzKTsKK2Rlc19kZWNyeXB0MyhERVNfTE9ORyBkYXRhWzJdLGRlc19rZXlfc2NoZWR1bGUga3MxLGtzMixrczMpOworCitUaGV5IGVuY3J5cHQvZGVjcnlwdCB0aGUgNjQgYml0cyBoZWxkIGluICdkYXRhJyB1c2luZwordGhlICdrcycga2V5IHNjaGVkdWxlcy4gICBUaGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIDQgZnVuY3Rpb25zIGlzIHRoYXQKK2Rlc19lbmNyeXB0MigpIGRvZXMgbm90IHBlcmZvcm0gSVAoKSBvciBGUCgpIG9uIHRoZSBkYXRhICh0aGlzIGlzIGFuCitvcHRpbWl6YXRpb24gZm9yIHdoZW4gZG9pbmcgdHJpcGxlIERFUyBhbmQgZGVzX2VuY3J5cHQzKCkgYW5kIGRlc19kZWNyeXB0MygpCitwZXJmb3JtIHRyaXBsZSBkZXMuICBUaGUgdHJpcGxlIERFUyByb3V0aW5lcyBhcmUgaW4gaGVyZSBiZWNhdXNlIGl0IGRvZXMKK21ha2UgYSBiaWcgZGlmZmVyZW5jZSB0byBoYXZlIHRoZW0gbG9jYXRlZCBuZWFyIHRoZSBkZXNfZW5jcnlwdDIgZnVuY3Rpb24KK2F0IGxpbmsgdGltZS4uCisKK05vdyBhcyB3ZSBhbGwga25vdywgdGhlcmUgYXJlIGxvdHMgb2YgZGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zIHJ1bm5pbmcgb24KK3g4NiBib3hlcywgYW5kIHVuZm9ydHVuYXRlbHkgdGhleSBub3JtYWxseSB0cnkgdG8gbWFrZSBzdXJlIHRoZWlyIGFzc2VtYmxlcgorZm9ybWF0aW5nIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgb3RoZXIgcGVvcGxlcy4KK1RoZSA0IG1haW4gZm9ybWF0cyBJIGtub3cgb2YgYXJlCitNaWNyb3NvZnQJV2luZG93cyA5NS9XaW5kb3dzIE5UCitFbGYJCUluY2x1ZGVzIExpbnV4IGFuZCBGcmVlQlNEKD8pLgorYS5vdXQJCVRoZSBvbGRlciBMaW51eC4KK1NvbGFyaXMJCVNhbWUgYXMgRWxmIGJ1dCBkaWZmZXJlbnQgY29tbWVudHMgOi0oLgorCitOb3cgSSB3YXMgbm90IG92ZXJseSBrZWVuIHRvIHdyaXRlIDQgZGlmZmVyZW50IGNvcGllcyBvZiB0aGUgc2FtZSBjb2RlLAorc28gSSB3cm90ZSBhIGZldyBwZXJsIHJvdXRpbmVzIHRvIG91dHB1dCB0aGUgY29ycmVjdCBhc3NlbWJsZXIsIGdpdmVuCithIHRhcmdldCBhc3NlbWJsZXIgdHlwZS4gIFRoaXMgY29kZSBpcyB1Z2x5IGFuZCBpcyBqdXN0IGEgaGFjay4KK1RoZSBsaWJyYXJpZXMgYXJlIHg4NnVuaXgucGwgYW5kIHg4Nm1zLnBsLgorZGVzNTg2LnBsLCBkZXM2ODYucGwgYW5kIGRlcy1zb21bMjNdLnBsIGFyZSB0aGUgcHJvZ3JhbXMgdG8gYWN0dWFsbHkKK2dlbmVyYXRlIHRoZSBhc3NlbWJsZXIuCisKK1NvIHRvIGdlbmVyYXRlIGVsZiBhc3NlbWJsZXIKK3BlcmwgZGVzLXNvbTMucGwgZWxmID5keDg2LWVsZi5zCitGb3IgV2luZG93cyA5NS9OVAorcGVybCBkZXMtc29tMi5wbCB3aW4zMiA+d2luMzIuYXNtCisKK1sgdXBkYXRlIDQgSmFuIDE5OTYgXQorSSBoYXZlIGFkZGVkIGFub3RoZXIgd2F5IHRvIGRvIHRoaW5ncy4KK3BlcmwgZGVzLXNvbTMucGwgY3BwID5keDg2LWNwcC5zCitnZW5lcmF0ZXMgYSBmaWxlIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBieSBkeDg2dW5peC5jcHAgd2hlbiBpdCBpcyBjb21waWxlZC4KK1RvIGJ1aWxkIGZvciBlbGYsIGEub3V0LCBzb2xhcmlzLCBic2RpIGV0YywKK2NjIC1FIC1ERUxGIGFzbS9keDg2dW5peC5jcHAgfCBhcyAtbyBhc20vZHg4Ni1lbGYubworY2MgLUUgLURTT0wgYXNtL2R4ODZ1bml4LmNwcCB8IGFzIC1vIGFzbS9keDg2LXNvbC5vCitjYyAtRSAtRE9VVCBhc20vZHg4NnVuaXguY3BwIHwgYXMgLW8gYXNtL2R4ODYtb3V0Lm8KK2NjIC1FIC1EQlNESSBhc20vZHg4NnVuaXguY3BwIHwgYXMgLW8gYXNtL2R4ODZic2RpLm8KK1RoaXMgd2FzIGRvbmUgdG8gY3V0IGRvd24gdGhlIG51bWJlciBvZiBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uLgorCitOb3cgdGhlIHVnbHkgcGFydC4gIEkgYWNxdWlyZWQgbXkgY29weSBvZiBJbnRlbHMKKyJPcHRpbWl6YXRpb24ncyBGb3IgSW50ZWwncyAzMi1CaXQgUHJvY2Vzc29ycyIgYW5kIGZvdW5kIGEgZmV3IGludGVyZXN0aW5nCit0aGluZ3MuICBGaXJzdCwgdGhlIGFpbSBvZiB0aGUgZXhlcnNpemUgaXMgdG8gJ2V4dHJhY3QnIG9uZSBieXRlIGF0IGEgdGltZQorZnJvbSBhIHdvcmQgYW5kIGRvIGFuIGFycmF5IGxvb2t1cC4gIFRoaXMgaW52b2x2ZXMgZ2V0dGluZyB0aGUgYnl0ZSBmcm9tCit0aGUgNCBsb2NhdGlvbnMgaW4gdGhlIHdvcmQgYW5kIG1vdmluZyBpdCB0byBhIG5ldyB3b3JkIGFuZCBkb2luZyB0aGUgbG9va3VwLgorVGhlIG1vc3Qgb2J2aW91cyB3YXkgdG8gZG8gdGhpcyBpcworeG9yCWVheCwJZWF4CQkJCSMgY2xlYXIgd29yZAorbW92YglhbCwJY2wJCQkJIyBnZXQgbG93IGJ5dGUKK3hvcgllZGkJRFdPUkQgUFRSIDB4MTAwK2Rlc19TUFtlYXhdIAkjIHhvciBpbiB3b3JkCittb3ZiCWFsLAljaAkJCQkjIGdldCBuZXh0IGJ5dGUKK3hvcgllZGkJRFdPUkQgUFRSIDB4MzAwK2Rlc19TUFtlYXhdIAkjIHhvciBpbiB3b3JkCitzaHIJZWN4CTE2Cit3aGljaCBzZWVtcyBvay4gIEZvciB0aGUgcGVudGl1bSwgdGhpcyBzeXN0ZW0gYXBwZWFycyB0byBiZSB0aGUgYmVzdC4KK09uZSBoYXMgdG8gZG8gaW5zdHJ1Y3Rpb24gaW50ZXJsZWF2aW5nIHRvIGtlZXAgYm90aCBmdW5jdGlvbmFsIHVuaXRzCitvcGVyYXRpbmcsIGJ1dCBpdCBpcyBiYXNpY2FsbHkgdmVyeSBlZmZpY2llbnQuCisKK05vdyB0aGUgY3J1bmNoLiAgV2hlbiBhIGZ1bGwgcmVnaXN0ZXIgaXMgdXNlZCBhZnRlciBhIHBhcnRpYWwgd3JpdGUsIGVnLgorbW92CWFsLAljbAoreG9yCWVkaSwJRFdPUkQgUFRSIDB4MTAwK2Rlc19TUFtlYXhdCiszODYJLSAxIGN5Y2xlIHN0YWxsCis0ODYJLSAxIGN5Y2xlIHN0YWxsCis1ODYJLSAwIGN5Y2xlIHN0YWxsCis2ODYJLSBhdCBsZWFzdCA3IGN5Y2xlIHN0YWxsIChwYWdlIDIyIG9mIHRoZSBhYm92ZSBtZW50aW9uZWQgZG9jdW1lbnQpLgorCitTbyB0aGUgdGVjaG5pcXVlIHRoYXQgcHJvZHVjZXMgdGhlIGJlc3QgcmVzdWx0cyBvbiBhIHBlbnRpdW0sIGFjY29yZGluZyB0bwordGhlIGRvY3VtZW50YXRpb24sIHdpbGwgcHJvZHVjZSBoaWRlb3VzIHJlc3VsdHMgb24gYSBwZW50aXVtIHByby4KKworVG8gZ2V0IGFyb3VuZCB0aGlzLCBkZXM2ODYucGwgd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQgaXMgbm90IGFzIGZhc3Qgb24KK2EgcGVudGl1bSwgc2hvdWxkIGJlIHZlcnkgZ29vZCBvbiBhIHBlbnRpdW0gcHJvLgorbW92CWVheCwJZWN4CQkJCSMgY29weSB3b3JkIAorc2hyCWVjeCwJOAkJCQkjIGxpbmUgdXAgbmV4dCBieXRlCithbmQJZWF4LAkwZmNoCQkJCSMgbWFzayBieXRlCit4b3IJZWRpCURXT1JEIFBUUiAweDEwMCtkZXNfU1BbZWF4XSAJIyB4b3IgaW4gYXJyYXkgbG9va3VwCittb3YJZWF4LAllY3gJCQkJIyBnZXQgd29yZAorc2hyCWVjeAk4CQkJCSMgbGluZSB1cCBuZXh0IGJ5dGUKK2FuZAllYXgsCTBmY2gJCQkJIyBtYXNrIGJ5dGUKK3hvcgllZGkJRFdPUkQgUFRSIDB4MzAwK2Rlc19TUFtlYXhdIAkjIHhvciBpbiBhcnJheSBsb29rdXAKKworRHVlIHRvIHRoZSBleGVjdXRpb24gdW5pdHMgaW4gdGhlIHBlbnRpdW0sIHRoaXMgYWN0dWFsbHkgd29ya3MgcXVpdGUgd2VsbC4KK0ZvciBhIHBlbnRpdW0gcHJvIGl0IHNob3VsZCBiZSB2ZXJ5IGdvb2QuICBUaGlzIGlzIHRoZSB0eXBlIG9mIG91dHB1dAorVmlzdWFsIEMrKyBnZW5lcmF0ZXMuCisKK1RoZXJlIGlzIGEgdGhpcmQgb3B0aW9uLiAgaW5zdGVhZCBvZiB1c2luZworbW92CWFsLAljaAord2hpY2ggaXMgYmFkIG9uIHRoZSBwZW50aXVtIHBybywgb25lIG1heSBiZSBhYmxlIHRvIHVzZQorbW92engJZWF4LAljaAord2hpY2ggbWF5IG5vdCBpbmN1ciB0aGUgcGFydGlhbCB3cml0ZSBwZW5hbHR5LiAgT24gdGhlIHBlbnRpdW0sCit0aGlzIGluc3RydWN0aW9uIHRha2VzIDQgY3ljbGVzIHNvIGlzIG5vdCB3b3J0aCB1c2luZyBidXQgb24gdGhlCitwZW50aXVtIHBybyBpdCBhcHBlYXJzIGl0IG1heSBiZSB3b3J0aCB3aGlsZS4gIEkgbmVlZCBhY2Nlc3MgdG8gb25lIHRvCitleHBlcmltZW50IDotKS4KKworZXJpYyAoMjAgT2N0IDE5OTYpCisKKzIyIE5vdiAxOTk2IC0gSSBoYXZlIGFza2VkIHBlb3BsZSB0byBydW4gdGhlIDIgZGlmZmVyZW50IHZlcnNpb24gb24gcGVudGl1bQorcHJvcyBhbmQgaXQgYXBwZWFycyB0aGF0IHRoZSBpbnRlbCBkb2N1bWVudGF0aW9uIGlzIHdyb25nLiAgVGhlCittb3YgYWwsYmggaXMgc3RpbGwgZmFzdGVyIG9uIGEgcGVudGl1bSBwcm8sIHNvIGp1c3QgdXNlIHRoZSBkZXM1ODYucGwKK2luc3RhbGwgZGVzNjg2LnBsCisKKzMgRGVjIDE5OTYgLSBJIGFkZGVkIGRlc19lbmNyeXB0My9kZXNfZGVjcnlwdDMgYmVjYXVzZSBJIGhhdmUgbW92ZWQgdGhlc2UKK2Z1bmN0aW9ucyBpbnRvIGRlc19lbmMuYyBiZWNhdXNlIGl0IGRvZXMgbWFrZSBhIG1hc3NpdmUgcGVyZm9ybWFuY2UKK2RpZmZlcmVuY2Ugb24gc29tZSBib3hlcyB0byBoYXZlIHRoZSBmdW5jdGlvbnMgY29kZSBsb2NhdGVkIGNsb3NlIHRvCit0aGUgZGVzX2VuY3J5cHQyKCkgZnVuY3Rpb24uCisKKzkgSmFuIDE5OTcgLSBkZXMtc29tMi5wbCBpcyBub3cgdGhlIGNvcnJlY3QgcGVybCBzY3JpcHQgdG8gdXNlIGZvcgorcGVudGl1bXMuICBJdCBjb250YWlucyBhbiBpbm5lciBsb29wIGZyb20KK1N2ZW5kIE9sYWYgTWlra2Vsc2VuIDxzdm9sYWZAaW5ldC51bmktYy5kaz4gd2hpY2ggZG9lcyByYXcgZWNiIERFUyBjYWxscyBhdAorMjczLDAwMCBwZXIgc2Vjb25kLiAgSGUgaGFkIGEgcHJldmlvdXMgdmVyc2lvbiBhdCAyNTAsMDAwIGFuZCB0aGUgYmVzdAorSSB3YXMgYWJsZSB0byBnZXQgd2FzIDIwMywwMDAuICBUaGUgY29udGVudCBoYXMgbm90IGNoYW5nZWQsIHRoaXMgaXMgYWxsCitkdWUgdG8gaW5zdHJ1Y3Rpb24gc2VxdWVuY2luZyAoYW5kIGFjdHVhbCBpbnN0cnVjdGlvbnMgY2hvaWNlKSB3aGljaCBpcyBhYmxlCit0byBrZWVwIGJvdGggZnVuY3Rpb25hbCB1bml0cyBvZiB0aGUgcGVudGl1bSBnb2luZy4KK1dlIG1heSBoYXZlIGxvc3QgdGhlIHVnbHkgcmVnaXN0ZXIgdXNhZ2UgcmVzdHJpY3Rpb25zIHdoZW4geDg2IHdlbnQgMzIgYml0CitidXQgZm9yIHRoZSBwZW50aXVtIGl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IGV2aWwgaW5zdHJ1Y3Rpb24gb3JkZXJpbmcgdHJpY2tzLgorCisxMyBKYW4gMTk5NyAtIGRlcy1zb20zLnBsLCBtb3JlIG9wdGltaXphdGlvbnMgZnJvbSBTdmVuZCBPbGFmLgorcmF3IERFUyBhdCAyODEsMDAwIHBlciBzZWNvbmQgb24gYSBwZW50aXVtIDEwMC4KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jYmMzX2VuYy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jYmMzX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGI0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2NiYzNfZW5jLmMKQEAgLTAsMCArMSw5OSBAQAorLyogY3J5cHRvL2Rlcy9jYmMzX2VuYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorCisvKiBIQVMgQlVHUyEgRE9OJ1QgVVNFIC0gdGhpcyBpcyBvbmx5IHByZXNlbnQgZm9yIHVzZSBpbiBkZXMuYyAqLwordm9pZCBERVNfM2NiY19lbmNyeXB0KERFU19jYmxvY2sgKmlucHV0LCBERVNfY2Jsb2NrICpvdXRwdXQsIGxvbmcgbGVuZ3RoLAorCSAgICAgREVTX2tleV9zY2hlZHVsZSBrczEsIERFU19rZXlfc2NoZWR1bGUga3MyLCBERVNfY2Jsb2NrICppdjEsCisJICAgICBERVNfY2Jsb2NrICppdjIsIGludCBlbmMpCisJeworCWludCBvZmY9KChpbnQpbGVuZ3RoLTEpLzg7CisJbG9uZyBsOD0oKGxlbmd0aCs3KS84KSo4OworCURFU19jYmxvY2sgbml2MSxuaXYyOworCisJaWYgKGVuYyA9PSBERVNfRU5DUllQVCkKKwkJeworCQlERVNfY2JjX2VuY3J5cHQoKHVuc2lnbmVkIGNoYXIqKWlucHV0LAorCQkJCSh1bnNpZ25lZCBjaGFyKilvdXRwdXQsbGVuZ3RoLCZrczEsaXYxLGVuYyk7CisJCWlmIChsZW5ndGggPj0gc2l6ZW9mKERFU19jYmxvY2spKQorCQkJbWVtY3B5KG5pdjEsb3V0cHV0W29mZl0sc2l6ZW9mKERFU19jYmxvY2spKTsKKwkJREVTX2NiY19lbmNyeXB0KCh1bnNpZ25lZCBjaGFyKilvdXRwdXQsCisJCQkJKHVuc2lnbmVkIGNoYXIqKW91dHB1dCxsOCwma3MyLGl2MSwhZW5jKTsKKwkJREVTX2NiY19lbmNyeXB0KCh1bnNpZ25lZCBjaGFyKilvdXRwdXQsCisJCQkJKHVuc2lnbmVkIGNoYXIqKW91dHB1dCxsOCwma3MxLGl2MixlbmMpOworCQlpZiAobGVuZ3RoID49IHNpemVvZihERVNfY2Jsb2NrKSkKKwkJCW1lbWNweShuaXYyLG91dHB1dFtvZmZdLHNpemVvZihERVNfY2Jsb2NrKSk7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGxlbmd0aCA+PSBzaXplb2YoREVTX2NibG9jaykpCisJCQltZW1jcHkobml2MixpbnB1dFtvZmZdLHNpemVvZihERVNfY2Jsb2NrKSk7CisJCURFU19jYmNfZW5jcnlwdCgodW5zaWduZWQgY2hhciopaW5wdXQsCisJCQkJKHVuc2lnbmVkIGNoYXIqKW91dHB1dCxsOCwma3MxLGl2MixlbmMpOworCQlERVNfY2JjX2VuY3J5cHQoKHVuc2lnbmVkIGNoYXIqKW91dHB1dCwKKwkJCQkodW5zaWduZWQgY2hhciopb3V0cHV0LGw4LCZrczIsaXYxLCFlbmMpOworCQlpZiAobGVuZ3RoID49IHNpemVvZihERVNfY2Jsb2NrKSkKKwkJCW1lbWNweShuaXYxLG91dHB1dFtvZmZdLHNpemVvZihERVNfY2Jsb2NrKSk7CisJCURFU19jYmNfZW5jcnlwdCgodW5zaWduZWQgY2hhciopb3V0cHV0LAorCQkJCSh1bnNpZ25lZCBjaGFyKilvdXRwdXQsbGVuZ3RoLCZrczEsaXYxLGVuYyk7CisJCX0KKwltZW1jcHkoKml2MSxuaXYxLHNpemVvZihERVNfY2Jsb2NrKSk7CisJbWVtY3B5KCppdjIsbml2MixzaXplb2YoREVTX2NibG9jaykpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jYmNfY2tzbS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jYmNfY2tzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTdiYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2NiY19ja3NtLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIGNyeXB0by9kZXMvY2JjX2Nrc20uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSAiZGVzX2xvY2wuaCIKKworREVTX0xPTkcgREVTX2NiY19ja3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgREVTX2NibG9jayAqb3V0cHV0LAorCQkgICAgICAgbG9uZyBsZW5ndGgsIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLAorCQkgICAgICAgY29uc3RfREVTX2NibG9jayAqaXZlYykKKwl7CisJcmVnaXN0ZXIgREVTX0xPTkcgdG91dDAsdG91dDEsdGluMCx0aW4xOworCXJlZ2lzdGVyIGxvbmcgbD1sZW5ndGg7CisJREVTX0xPTkcgdGluWzJdOworCXVuc2lnbmVkIGNoYXIgKm91dCA9ICYoKm91dHB1dClbMF07CisJY29uc3QgdW5zaWduZWQgY2hhciAqaXYgPSAmKCppdmVjKVswXTsKKworCWMybChpdix0b3V0MCk7CisJYzJsKGl2LHRvdXQxKTsKKwlmb3IgKDsgbD4wOyBsLT04KQorCQl7CisJCWlmIChsID49IDgpCisJCQl7CisJCQljMmwoaW4sdGluMCk7CisJCQljMmwoaW4sdGluMSk7CisJCQl9CisJCWVsc2UKKwkJCWMybG4oaW4sdGluMCx0aW4xLGwpOworCQkJCisJCXRpbjBePXRvdXQwOyB0aW5bMF09dGluMDsKKwkJdGluMV49dG91dDE7IHRpblsxXT10aW4xOworCQlERVNfZW5jcnlwdDEoKERFU19MT05HICopdGluLHNjaGVkdWxlLERFU19FTkNSWVBUKTsKKwkJLyogZml4IDE1LzEwLzkxIGVheSAtIHRoYW5rcyB0byBrZWl0aHJAc2NvLkNPTSAqLworCQl0b3V0MD10aW5bMF07CisJCXRvdXQxPXRpblsxXTsKKwkJfQorCWlmIChvdXQgIT0gTlVMTCkKKwkJeworCQlsMmModG91dDAsb3V0KTsKKwkJbDJjKHRvdXQxLG91dCk7CisJCX0KKwl0b3V0MD10aW4wPXRpbjE9dGluWzBdPXRpblsxXT0wOworCS8qCisJICBUcmFuc2Zvcm0gdGhlIGRhdGEgaW4gdG91dDEgc28gdGhhdCBpdCB3aWxsCisJICBtYXRjaCB0aGUgcmV0dXJuIHZhbHVlIHRoYXQgdGhlIE1JVCBLZXJiZXJvcworCSAgbWl0X2Rlc19jYmNfY2tzdW0gQVBJIHJldHVybnMuCisJKi8KKwl0b3V0MSA9ICgodG91dDEgPj4gMjRMKSAmIDB4MDAwMDAwRkYpCisJICAgICAgfCAoKHRvdXQxID4+IDhMKSAgJiAweDAwMDBGRjAwKQorCSAgICAgIHwgKCh0b3V0MSA8PCA4TCkgICYgMHgwMEZGMDAwMCkKKwkgICAgICB8ICgodG91dDEgPDwgMjRMKSAmIDB4RkYwMDAwMDApOworCXJldHVybih0b3V0MSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jYmNfZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2NiY19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc5MDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jYmNfZW5jLmMKQEAgLTAsMCArMSw2MSBAQAorLyogY3J5cHRvL2Rlcy9jYmNfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2RlZmluZSBDQkNfRU5DX0NfX0RPTlRfVVBEQVRFX0lWCisKKyNpbmNsdWRlICJuY2JjX2VuYy5jIiAvKiBkZXNfY2JjX2VuY3J5cHQgKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvY2ZiNjRlZGUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvY2ZiNjRlZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTM0ZWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jZmI2NGVkZS5jCkBAIC0wLDAgKzEsMjU0IEBACisvKiBjcnlwdG8vZGVzL2NmYjY0ZWRlLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgImRlc19sb2NsLmgiCisjaW5jbHVkZSAiZV9vcy5oIgorCisvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBlbmNyeXB0ZWQgYXMgdGhvdWdoIDY0Yml0IGNmYiBtb2RlIGlzIGJlaW5nCisgKiB1c2VkLiAgVGhlIGV4dHJhIHN0YXRlIGluZm9ybWF0aW9uIHRvIHJlY29yZCBob3cgbXVjaCBvZiB0aGUKKyAqIDY0Yml0IGJsb2NrIHdlIGhhdmUgdXNlZCBpcyBjb250YWluZWQgaW4gKm51bTsKKyAqLworCit2b2lkIERFU19lZGUzX2NmYjY0X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCSAgICBsb25nIGxlbmd0aCwgREVTX2tleV9zY2hlZHVsZSAqa3MxLAorCQkJICAgIERFU19rZXlfc2NoZWR1bGUgKmtzMiwgREVTX2tleV9zY2hlZHVsZSAqa3MzLAorCQkJICAgIERFU19jYmxvY2sgKml2ZWMsIGludCAqbnVtLCBpbnQgZW5jKQorCXsKKwlyZWdpc3RlciBERVNfTE9ORyB2MCx2MTsKKwlyZWdpc3RlciBsb25nIGw9bGVuZ3RoOworCXJlZ2lzdGVyIGludCBuPSAqbnVtOworCURFU19MT05HIHRpWzJdOworCXVuc2lnbmVkIGNoYXIgKml2LGMsY2M7CisKKwlpdj0mKCppdmVjKVswXTsKKwlpZiAoZW5jKQorCQl7CisJCXdoaWxlIChsLS0pCisJCQl7CisJCQlpZiAobiA9PSAwKQorCQkJCXsKKwkJCQljMmwoaXYsdjApOworCQkJCWMybChpdix2MSk7CisKKwkJCQl0aVswXT12MDsKKwkJCQl0aVsxXT12MTsKKwkJCQlERVNfZW5jcnlwdDModGksa3MxLGtzMixrczMpOworCQkJCXYwPXRpWzBdOworCQkJCXYxPXRpWzFdOworCisJCQkJaXYgPSAmKCppdmVjKVswXTsKKwkJCQlsMmModjAsaXYpOworCQkJCWwyYyh2MSxpdik7CisJCQkJaXYgPSAmKCppdmVjKVswXTsKKwkJCQl9CisJCQljPSAqKGluKyspXml2W25dOworCQkJKihvdXQrKyk9YzsKKwkJCWl2W25dPWM7CisJCQluPShuKzEpJjB4MDc7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJd2hpbGUgKGwtLSkKKwkJCXsKKwkJCWlmIChuID09IDApCisJCQkJeworCQkJCWMybChpdix2MCk7CisJCQkJYzJsKGl2LHYxKTsKKworCQkJCXRpWzBdPXYwOworCQkJCXRpWzFdPXYxOworCQkJCURFU19lbmNyeXB0Myh0aSxrczEsa3MyLGtzMyk7CisJCQkJdjA9dGlbMF07CisJCQkJdjE9dGlbMV07CisKKwkJCQlpdiA9ICYoKml2ZWMpWzBdOworCQkJCWwyYyh2MCxpdik7CisJCQkJbDJjKHYxLGl2KTsKKwkJCQlpdiA9ICYoKml2ZWMpWzBdOworCQkJCX0KKwkJCWNjPSAqKGluKyspOworCQkJYz1pdltuXTsKKwkJCWl2W25dPWNjOworCQkJKihvdXQrKyk9Y15jYzsKKwkJCW49KG4rMSkmMHgwNzsKKwkJCX0KKwkJfQorCXYwPXYxPXRpWzBdPXRpWzFdPWM9Y2M9MDsKKwkqbnVtPW47CisJfQorCisjaWZkZWYgdW5kZWYgLyogTUFDUk8gKi8KK3ZvaWQgREVTX2VkZTJfY2ZiNjRfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwkgICAgIERFU19rZXlfc2NoZWR1bGUga3MxLCBERVNfa2V5X3NjaGVkdWxlIGtzMiwgREVTX2NibG9jayAoKml2ZWMpLAorCSAgICAgaW50ICpudW0sIGludCBlbmMpCisJeworCURFU19lZGUzX2NmYjY0X2VuY3J5cHQoaW4sb3V0LGxlbmd0aCxrczEsa3MyLGtzMSxpdmVjLG51bSxlbmMpOworCX0KKyNlbmRpZgorCisvKiBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgc2luZ2xlIGtleSBDRkItciBmb3IgREVTLCBldmVuIHRob3VnaHQgdGhhdCdzCisgKiBub3Qgd2hhdCBFVlAgbmVlZHMuCisgKi8KKwordm9pZCBERVNfZWRlM19jZmJfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgIGludCBudW1iaXRzLGxvbmcgbGVuZ3RoLERFU19rZXlfc2NoZWR1bGUgKmtzMSwKKwkJCSAgREVTX2tleV9zY2hlZHVsZSAqa3MyLERFU19rZXlfc2NoZWR1bGUgKmtzMywKKwkJCSAgREVTX2NibG9jayAqaXZlYyxpbnQgZW5jKQorCXsKKwlyZWdpc3RlciBERVNfTE9ORyBkMCxkMSx2MCx2MTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGw9bGVuZ3RoLG49KCh1bnNpZ25lZCBpbnQpbnVtYml0cys3KS84OworCXJlZ2lzdGVyIGludCBudW09bnVtYml0cyxpOworCURFU19MT05HIHRpWzJdOworCXVuc2lnbmVkIGNoYXIgKml2OworCXVuc2lnbmVkIGNoYXIgb3ZlY1sxNl07CisKKwlpZiAobnVtID4gNjQpIHJldHVybjsKKwlpdiA9ICYoKml2ZWMpWzBdOworCWMybChpdix2MCk7CisJYzJsKGl2LHYxKTsKKwlpZiAoZW5jKQorCQl7CisJCXdoaWxlIChsID49IG4pCisJCQl7CisJCQlsLT1uOworCQkJdGlbMF09djA7CisJCQl0aVsxXT12MTsKKwkJCURFU19lbmNyeXB0Myh0aSxrczEsa3MyLGtzMyk7CisJCQljMmxuKGluLGQwLGQxLG4pOworCQkJaW4rPW47CisJCQlkMF49dGlbMF07CisJCQlkMV49dGlbMV07CisJCQlsMmNuKGQwLGQxLG91dCxuKTsKKwkJCW91dCs9bjsKKwkJCS8qIDMwLTA4LTk0IC0gZWF5IC0gY2hhbmdlZCBiZWNhdXNlIGw+PjMyIGFuZAorCQkJICogbDw8MzIgYXJlIGJhZCB1bmRlciBnY2MgOi0oICovCisJCQlpZiAobnVtID09IDMyKQorCQkJCXsgdjA9djE7IHYxPWQwOyB9CisJCQllbHNlIGlmIChudW0gPT0gNjQpCisJCQkJeyB2MD1kMDsgdjE9ZDE7IH0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaXY9Jm92ZWNbMF07CisJCQkJbDJjKHYwLGl2KTsKKwkJCQlsMmModjEsaXYpOworCQkJCWwyYyhkMCxpdik7CisJCQkJbDJjKGQxLGl2KTsKKwkJCQkvKiBzaGlmdCBvdmVjIGxlZnQgbW9zdCBvZiB0aGUgYml0cy4uLiAqLworCQkJCW1lbW1vdmUob3ZlYyxvdmVjK251bS84LDgrKG51bSU4ID8gMSA6IDApKTsKKwkJCQkvKiBub3cgdGhlIHJlbWFpbmluZyBiaXRzICovCisJCQkJaWYobnVtJTggIT0gMCkKKwkJCQkJZm9yKGk9MCA7IGkgPCA4IDsgKytpKQorCQkJCQkJeworCQkJCQkJb3ZlY1tpXTw8PW51bSU4OworCQkJCQkJb3ZlY1tpXXw9b3ZlY1tpKzFdPj4oOC1udW0lOCk7CisJCQkJCQl9CisJCQkJaXY9Jm92ZWNbMF07CisJCQkJYzJsKGl2LHYwKTsKKwkJCQljMmwoaXYsdjEpOworCQkJCX0KKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQl3aGlsZSAobCA+PSBuKQorCQkJeworCQkJbC09bjsKKwkJCXRpWzBdPXYwOworCQkJdGlbMV09djE7CisJCQlERVNfZW5jcnlwdDModGksa3MxLGtzMixrczMpOworCQkJYzJsbihpbixkMCxkMSxuKTsKKwkJCWluKz1uOworCQkJLyogMzAtMDgtOTQgLSBlYXkgLSBjaGFuZ2VkIGJlY2F1c2UgbD4+MzIgYW5kCisJCQkgKiBsPDwzMiBhcmUgYmFkIHVuZGVyIGdjYyA6LSggKi8KKwkJCWlmIChudW0gPT0gMzIpCisJCQkJeyB2MD12MTsgdjE9ZDA7IH0KKwkJCWVsc2UgaWYgKG51bSA9PSA2NCkKKwkJCQl7IHYwPWQwOyB2MT1kMTsgfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpdj0mb3ZlY1swXTsKKwkJCQlsMmModjAsaXYpOworCQkJCWwyYyh2MSxpdik7CisJCQkJbDJjKGQwLGl2KTsKKwkJCQlsMmMoZDEsaXYpOworCQkJCS8qIHNoaWZ0IG92ZWMgbGVmdCBtb3N0IG9mIHRoZSBiaXRzLi4uICovCisJCQkJbWVtbW92ZShvdmVjLG92ZWMrbnVtLzgsOCsobnVtJTggPyAxIDogMCkpOworCQkJCS8qIG5vdyB0aGUgcmVtYWluaW5nIGJpdHMgKi8KKwkJCQlpZihudW0lOCAhPSAwKQorCQkJCQlmb3IoaT0wIDsgaSA8IDggOyArK2kpCisJCQkJCQl7CisJCQkJCQlvdmVjW2ldPDw9bnVtJTg7CisJCQkJCQlvdmVjW2ldfD1vdmVjW2krMV0+Pig4LW51bSU4KTsKKwkJCQkJCX0KKwkJCQlpdj0mb3ZlY1swXTsKKwkJCQljMmwoaXYsdjApOworCQkJCWMybChpdix2MSk7CisJCQkJfQorCQkJZDBePXRpWzBdOworCQkJZDFePXRpWzFdOworCQkJbDJjbihkMCxkMSxvdXQsbik7CisJCQlvdXQrPW47CisJCQl9CisJCX0KKwlpdiA9ICYoKml2ZWMpWzBdOworCWwyYyh2MCxpdik7CisJbDJjKHYxLGl2KTsKKwl2MD12MT1kMD1kMT10aVswXT10aVsxXT0wOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jZmI2NGVuYy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jZmI2NGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzg2ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2NmYjY0ZW5jLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIGNyeXB0by9kZXMvY2ZiNjRlbmMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSAiZGVzX2xvY2wuaCIKKworLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZW5jcnlwdGVkIGFzIHRob3VnaCA2NGJpdCBjZmIgbW9kZSBpcyBiZWluZworICogdXNlZC4gIFRoZSBleHRyYSBzdGF0ZSBpbmZvcm1hdGlvbiB0byByZWNvcmQgaG93IG11Y2ggb2YgdGhlCisgKiA2NGJpdCBibG9jayB3ZSBoYXZlIHVzZWQgaXMgY29udGFpbmVkIGluICpudW07CisgKi8KKwordm9pZCBERVNfY2ZiNjRfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkgICAgICAgbG9uZyBsZW5ndGgsIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLAorCQkgICAgICAgREVTX2NibG9jayAqaXZlYywgaW50ICpudW0sIGludCBlbmMpCisJeworCXJlZ2lzdGVyIERFU19MT05HIHYwLHYxOworCXJlZ2lzdGVyIGxvbmcgbD1sZW5ndGg7CisJcmVnaXN0ZXIgaW50IG49ICpudW07CisJREVTX0xPTkcgdGlbMl07CisJdW5zaWduZWQgY2hhciAqaXYsYyxjYzsKKworCWl2ID0gJigqaXZlYylbMF07CisJaWYgKGVuYykKKwkJeworCQl3aGlsZSAobC0tKQorCQkJeworCQkJaWYgKG4gPT0gMCkKKwkJCQl7CisJCQkJYzJsKGl2LHYwKTsgdGlbMF09djA7CisJCQkJYzJsKGl2LHYxKTsgdGlbMV09djE7CisJCQkJREVTX2VuY3J5cHQxKHRpLHNjaGVkdWxlLERFU19FTkNSWVBUKTsKKwkJCQlpdiA9ICYoKml2ZWMpWzBdOworCQkJCXYwPXRpWzBdOyBsMmModjAsaXYpOworCQkJCXYwPXRpWzFdOyBsMmModjAsaXYpOworCQkJCWl2ID0gJigqaXZlYylbMF07CisJCQkJfQorCQkJYz0gKihpbisrKV5pdltuXTsKKwkJCSoob3V0KyspPWM7CisJCQlpdltuXT1jOworCQkJbj0obisxKSYweDA3OworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCXdoaWxlIChsLS0pCisJCQl7CisJCQlpZiAobiA9PSAwKQorCQkJCXsKKwkJCQljMmwoaXYsdjApOyB0aVswXT12MDsKKwkJCQljMmwoaXYsdjEpOyB0aVsxXT12MTsKKwkJCQlERVNfZW5jcnlwdDEodGksc2NoZWR1bGUsREVTX0VOQ1JZUFQpOworCQkJCWl2ID0gJigqaXZlYylbMF07CisJCQkJdjA9dGlbMF07IGwyYyh2MCxpdik7CisJCQkJdjA9dGlbMV07IGwyYyh2MCxpdik7CisJCQkJaXYgPSAmKCppdmVjKVswXTsKKwkJCQl9CisJCQljYz0gKihpbisrKTsKKwkJCWM9aXZbbl07CisJCQlpdltuXT1jYzsKKwkJCSoob3V0KyspPWNeY2M7CisJCQluPShuKzEpJjB4MDc7CisJCQl9CisJCX0KKwl2MD12MT10aVswXT10aVsxXT1jPWNjPTA7CisJKm51bT1uOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jZmJfZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2NmYl9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBmMjlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9jZmJfZW5jLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qIGNyeXB0by9kZXMvY2ZiX2VuYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlICJlX29zLmgiCisjaW5jbHVkZSAiZGVzX2xvY2wuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgYXJlIGxvYWRlZCBpbiBtdWx0aXBsZXMgb2YgOCBiaXRzLgorICogV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQgaWYgeW91IGhhbWUgbnVtYml0cz0xMiBhbmQgbGVuZ3RoPTIKKyAqIHRoZSBmaXJzdCAxMiBiaXRzIHdpbGwgYmUgcmV0cmlldmVkIGZyb20gdGhlIGZpcnN0IGJ5dGUgYW5kIGhhbGYKKyAqIHRoZSBzZWNvbmQuICBUaGUgc2Vjb25kIDEyIGJpdHMgd2lsbCBjb21lIGZyb20gdGhlIDNyZCBhbmQgaGFsZiB0aGUgNHRoCisgKiBieXRlLgorICovCisvKiBVbnRpbCBBdWcgMSAyMDAzIHRoaXMgZnVuY3Rpb24gZGlkIG5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IENGQi1yLCBzbyBpdAorICogd2lsbCBub3QgYmUgY29tcGF0aWJsZSB3aXRoIGFueSBlbmNyeXB0aW9uIHByaW9yIHRvIHRoYXQgZGF0ZS4gQmVuLiAqLwordm9pZCBERVNfY2ZiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IG51bWJpdHMsCisJCSAgICAgbG9uZyBsZW5ndGgsIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLCBERVNfY2Jsb2NrICppdmVjLAorCQkgICAgIGludCBlbmMpCisJeworCXJlZ2lzdGVyIERFU19MT05HIGQwLGQxLHYwLHYxOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbD1sZW5ndGg7CisJcmVnaXN0ZXIgaW50IG51bT1udW1iaXRzLzgsbj0obnVtYml0cys3KS84LGkscmVtPW51bWJpdHMlODsKKwlERVNfTE9ORyB0aVsyXTsKKwl1bnNpZ25lZCBjaGFyICppdjsKKyNpZm5kZWYgTF9FTkRJQU4KKwl1bnNpZ25lZCBjaGFyIG92ZWNbMTZdOworI2Vsc2UKKwl1bnNpZ25lZCBpbnQgIHNoWzRdOworCXVuc2lnbmVkIGNoYXIgKm92ZWM9KHVuc2lnbmVkIGNoYXIgKilzaDsKKworCS8qIEkga2luZCBvZiBjb3VudCB0aGF0IGNvbXBpbGVyIG9wdGltaXplcyBhd2F5IHRoaXMgYXNzZXJ0aW9uaSwqLworCWFzc2VydCAoc2l6ZW9mKHNoWzBdKT09NCk7CS8qIGFzIHRoaXMgaG9sZHMgdHJ1ZSBmb3IgYWxsLAkqLworCQkJCQkvKiBidXQgMTYtYml0IHBsYXRmb3Jtcy4uLgkqLworCQkJCQkKKyNlbmRpZgorCisJaWYgKG51bWJpdHM8PTAgfHwgbnVtYml0cyA+IDY0KSByZXR1cm47CisJaXYgPSAmKCppdmVjKVswXTsKKwljMmwoaXYsdjApOworCWMybChpdix2MSk7CisJaWYgKGVuYykKKwkJeworCQl3aGlsZSAobCA+PSAodW5zaWduZWQgbG9uZyluKQorCQkJeworCQkJbC09bjsKKwkJCXRpWzBdPXYwOworCQkJdGlbMV09djE7CisJCQlERVNfZW5jcnlwdDEoKERFU19MT05HICopdGksc2NoZWR1bGUsREVTX0VOQ1JZUFQpOworCQkJYzJsbihpbixkMCxkMSxuKTsKKwkJCWluKz1uOworCQkJZDBePXRpWzBdOworCQkJZDFePXRpWzFdOworCQkJbDJjbihkMCxkMSxvdXQsbik7CisJCQlvdXQrPW47CisJCQkvKiAzMC0wOC05NCAtIGVheSAtIGNoYW5nZWQgYmVjYXVzZSBsPj4zMiBhbmQKKwkJCSAqIGw8PDMyIGFyZSBiYWQgdW5kZXIgZ2NjIDotKCAqLworCQkJaWYgKG51bWJpdHMgPT0gMzIpCisJCQkJeyB2MD12MTsgdjE9ZDA7IH0KKwkJCWVsc2UgaWYgKG51bWJpdHMgPT0gNjQpCisJCQkJeyB2MD1kMDsgdjE9ZDE7IH0KKwkJCWVsc2UKKwkJCQl7CisjaWZuZGVmIExfRU5ESUFOCisJCQkJaXY9Jm92ZWNbMF07CisJCQkJbDJjKHYwLGl2KTsKKwkJCQlsMmModjEsaXYpOworCQkJCWwyYyhkMCxpdik7CisJCQkJbDJjKGQxLGl2KTsKKyNlbHNlCisJCQkJc2hbMF09djAsIHNoWzFdPXYxLCBzaFsyXT1kMCwgc2hbM109ZDE7CisjZW5kaWYKKwkJCQlpZiAocmVtPT0wKQorCQkJCQltZW1tb3ZlKG92ZWMsb3ZlYytudW0sOCk7CisJCQkJZWxzZQorCQkJCQlmb3IoaT0wIDsgaSA8IDggOyArK2kpCisJCQkJCQlvdmVjW2ldPW92ZWNbaStudW1dPDxyZW0gfAorCQkJCQkJCW92ZWNbaStudW0rMV0+Pig4LXJlbSk7CisjaWZkZWYgTF9FTkRJQU4KKwkJCQl2MD1zaFswXSwgdjE9c2hbMV07CisjZWxzZQorCQkJCWl2PSZvdmVjWzBdOworCQkJCWMybChpdix2MCk7CisJCQkJYzJsKGl2LHYxKTsKKyNlbmRpZgorCQkJCX0KKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQl3aGlsZSAobCA+PSAodW5zaWduZWQgbG9uZyluKQorCQkJeworCQkJbC09bjsKKwkJCXRpWzBdPXYwOworCQkJdGlbMV09djE7CisJCQlERVNfZW5jcnlwdDEoKERFU19MT05HICopdGksc2NoZWR1bGUsREVTX0VOQ1JZUFQpOworCQkJYzJsbihpbixkMCxkMSxuKTsKKwkJCWluKz1uOworCQkJLyogMzAtMDgtOTQgLSBlYXkgLSBjaGFuZ2VkIGJlY2F1c2UgbD4+MzIgYW5kCisJCQkgKiBsPDwzMiBhcmUgYmFkIHVuZGVyIGdjYyA6LSggKi8KKwkJCWlmIChudW1iaXRzID09IDMyKQorCQkJCXsgdjA9djE7IHYxPWQwOyB9CisJCQllbHNlIGlmIChudW1iaXRzID09IDY0KQorCQkJCXsgdjA9ZDA7IHYxPWQxOyB9CisJCQllbHNlCisJCQkJeworI2lmbmRlZiBMX0VORElBTgorCQkJCWl2PSZvdmVjWzBdOworCQkJCWwyYyh2MCxpdik7CisJCQkJbDJjKHYxLGl2KTsKKwkJCQlsMmMoZDAsaXYpOworCQkJCWwyYyhkMSxpdik7CisjZWxzZQorCQkJCXNoWzBdPXYwLCBzaFsxXT12MSwgc2hbMl09ZDAsIHNoWzNdPWQxOworI2VuZGlmCisJCQkJaWYgKHJlbT09MCkKKwkJCQkJbWVtbW92ZShvdmVjLG92ZWMrbnVtLDgpOworCQkJCWVsc2UKKwkJCQkJZm9yKGk9MCA7IGkgPCA4IDsgKytpKQorCQkJCQkJb3ZlY1tpXT1vdmVjW2krbnVtXTw8cmVtIHwKKwkJCQkJCQlvdmVjW2krbnVtKzFdPj4oOC1yZW0pOworI2lmZGVmIExfRU5ESUFOCisJCQkJdjA9c2hbMF0sIHYxPXNoWzFdOworI2Vsc2UKKwkJCQlpdj0mb3ZlY1swXTsKKwkJCQljMmwoaXYsdjApOworCQkJCWMybChpdix2MSk7CisjZW5kaWYKKwkJCQl9CisJCQlkMF49dGlbMF07CisJCQlkMV49dGlbMV07CisJCQlsMmNuKGQwLGQxLG91dCxuKTsKKwkJCW91dCs9bjsKKwkJCX0KKwkJfQorCWl2ID0gJigqaXZlYylbMF07CisJbDJjKHYwLGl2KTsKKwlsMmModjEsaXYpOworCXYwPXYxPWQwPWQxPXRpWzBdPXRpWzFdPTA7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlcy1saWIuY29tIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXMtbGliLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDhmMWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXMtbGliLmNvbQpAQCAtMCwwICsxLDEwMDUgQEAKKyQhCiskISAgREVTLUxJQi5DT00KKyQhICBXcml0dGVuIEJ5OiAgUm9iZXJ0IEJ5ZXIKKyQhICAgICAgICAgICAgICAgVmljZS1QcmVzaWRlbnQKKyQhICAgICAgICAgICAgICAgQS1Db20gQ29tcHV0aW5nLCBJbmMuCiskISAgICAgICAgICAgICAgIGJ5ZXJAbWFpbC5hbGwtbmV0Lm5ldAorJCEKKyQhICBDaGFuZ2VzIGJ5IFJpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz4KKyQhCiskISAgVGhpcyBjb21tYW5kIGZpbGVzIGNvbXBpbGVzIGFuZCBjcmVhdGVzIHRoZSAKKyQhICAiWy54eHguRVhFLkNSWVBUTy5ERVNdTElCREVTLk9MQiIgbGlicmFyeS4gIFRoZSAieHh4IiBkZW5vdGVzIHRoZSBtYWNoaW5lIAorJCEgIGFyY2hpdGVjdHVyZSBvZiBBTFBIQSwgSUE2NCBvciBWQVguCiskIQorJCEgIEl0IHdhcyByZS13cml0dGVuIHRvIHRyeSB0byBkZXRlcm1pbmUgd2hpY2ggIkMiIGNvbXBpbGVyIHRvIHRyeSB0byB1c2UKKyQhICBvciB0aGUgdXNlciBjYW4gc3BlY2lmeSBhIGNvbXBpbGVyIGluIFAzLgorJCEKKyQhICBTcGVjaWZ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHRvIGJ1aWxkIGp1c3QgdGhhdCBwYXJ0LCBzcGVjaWZ5ICJBTEwiIHRvCiskISAganVzdCBidWlsZCBldmVyeXRoaW5nLgorJCEKKyQhICAgICAgICAgQUxMICAgICAgIFRvIEp1c3QgQnVpbGQgIkV2ZXJ5dGhpbmciLgorJCEgICAgICAgICBMSUJSQVJZICAgVG8gSnVzdCBCdWlsZCBUaGUgWy54eHguRVhFLkNSWVBUTy5ERVNdTElCREVTLk9MQiBMaWJyYXJ5LgorJCEgICAgICAgICBERVNURVNUICAgVG8gSnVzdCBCdWlsZCBUaGUgWy54eHguRVhFLkNSWVBUTy5ERVNdREVTVEVTVC5FWEUgUHJvZ3JhbS4KKyQhICAgICAgICAgU1BFRUQgICAgIFRvIEp1c3QgQnVpbGQgVGhlIFsueHh4LkVYRS5DUllQVE8uREVTXVNQRUVELkVYRSBQcm9ncmFtLgorJCEgICAgICAgICBSUFcgICAgICAgVG8gSnVzdCBCdWlsZCBUaGUgWy54eHguRVhFLkNSWVBUTy5ERVNdUlBXLkVYRSBQcm9ncmFtLgorJCEgICAgICAgICBERVMgICAgICAgVG8gSnVzdCBCdWlsZCBUaGUgWy54eHguRVhFLkNSWVBUTy5ERVNdREVTLkVYRSBQcm9ncmFtLgorJCEgICAgICAgICBERVNfT1BUUyAgVG8gSnVzdCBCdWlsZCBUaGUgWy54eHguRVhFLkNSWVBUTy5ERVNdREVTX09QVFMuRVhFIFByb2dyYW0uCiskIQorJCEgIFNwZWNpZnkgZWl0aGVyIERFQlVHIG9yIE5PREVCVUcgYXMgUDIgdG8gY29tcGlsZSB3aXRoIG9yIHdpdGhvdXQKKyQhICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCiskIQorJCEgIFNwZWNpZnkgd2hpY2ggY29tcGlsZXIgYXQgUDMgdG8gdHJ5IHRvIGNvbXBpbGUgdW5kZXIuCiskIQorJCEJICAgVkFYQwkgRm9yIFZBWCBDLgorJCEJICAgREVDQwkgRm9yIERFQyBDLgorJCEJICAgR05VQwkgRm9yIEdOVSBDLgorJCEKKyQhICBJZiB5b3UgZG9uJ3Qgc3BlZmljeSBhIGNvbXBpbGVyLCBpdCB3aWxsIHRyeSB0byBkZXRlcm1pbmUgd2hpY2gKKyQhICAiQyIgY29tcGlsZXIgdG8gdHJ5IHRvIHVzZS4KKyQhCiskISAgUDQsIGlmIGRlZmluZWQsIHNldHMgYSBjb21waWxlciB0aHJlYWQgTk9UIG5lZWRlZCBvbiBPcGVuVk1TIDcuMSAoYW5kIHVwKQorJCEKKyQhCiskISBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGFyY2hpdGVjdHVyZSB3ZSBydW4gb24uCiskIQorJCEKKyQhIENoZWNrIFdoaWNoIEFyY2hpdGVjdHVyZSBXZSBBcmUgVXNpbmcuCiskIQorJCBJRiAoRiRHRVRTWUkoIkNQVSIpLkxULjEyOCkKKyQgVEhFTgorJCEKKyQhICBUaGUgQXJjaGl0ZWN0dXJlIElzIFZBWAorJCEKKyQgICBBUkNIIDo9IFZBWAorJCEKKyQhIEVsc2UuLi4KKyQhCiskIEVMU0UKKyQhCiskISAgVGhlIEFyY2hpdGVjdHVyZSBJcyBBbHBoYSwgSUE2NCBvciB3aGF0ZXZlciBjb21lcyBpbiB0aGUgZnV0dXJlLgorJCEKKyQgICBBUkNIID0gRiRFRElUKCBGJEdFVFNZSSggIkFSQ0hfTkFNRSIpLCAiVVBDQVNFIikKKyQgICBJRiAoQVJDSCAuRVFTLiAiIikgVEhFTiBBUkNIID0gIlVOSyIKKyQhCiskISBFbmQgVGhlIEFyY2hpdGVjdHVyZSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgRGVmaW5lIFRoZSBPQkogRGlyZWN0b3J5IE5hbWUuCiskIQorJCBPQkpfRElSIDo9IFNZUyRESVNLOlstLS4nQVJDSCcuT0JKLkNSWVBUTy5ERVNdCiskIQorJCEgRGVmaW5lIFRoZSBFWEUgRGlyZWN0b3J5IE5hbWUuCiskIQorJCBFWEVfRElSIDo9PSBTWVMkRElTSzpbLS0uJ0FSQ0gnLkVYRS5DUllQVE8uREVTXQorJCEKKyQhIENoZWNrIFRvIE1ha2UgU3VyZSBXZSBIYXZlIFZhbGlkIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzLgorJCEKKyQgR09TVUIgQ0hFQ0tfT1BUSU9OUworJCEKKyQhIFRlbGwgVGhlIFVzZXIgV2hhdCBLaW5kIG9mIE1hY2hpbmUgV2UgUnVuIE9uLgorJCEKKyQgV1JJVEUgU1lTJE9VVFBVVCAiQ29tcGlsaW5nIE9uIEEgIixBUkNILCIgTWFjaGluZS4iCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFRoZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWMgT0JKIERpcmVjdG9yeSBFeGlzdHMuCiskIQorJCBJRiAoRiRQQVJTRShPQkpfRElSKS5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgSXQgRG9zZW4ndCBFeGlzdCwgU28gQ3JlYXRlIEl0LgorJCEKKyQgICBDUkVBVEUvRElSICdPQkpfRElSJworJCEKKyQhIEVuZCBUaGUgQXJjaGl0ZWN0dXJlIFNwZWNpZmljIE9CSiBEaXJlY3RvcnkgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBUaGUgQXJjaGl0ZWN0dXJlIFNwZWNpZmljIERpcmVjdG9yeSBFeGlzdHMuCiskIQorJCBJRiAoRiRQQVJTRShFWEVfRElSKS5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgSXQgRG9zZW4ndCBFeGlzdCwgU28gQ3JlYXRlIEl0LgorJCEKKyQgICBDUkVBVEUvRElSICdFWEVfRElSJworJCEKKyQhIEVuZCBUaGUgQXJjaGl0ZWN0dXJlIFNwZWNpZmljIERpcmVjdG9yeSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgRGVmaW5lIFRoZSBMaWJyYXJ5IE5hbWUuCiskIQorJCBMSUJfTkFNRSA6PSAnRVhFX0RJUidMSUJERVMuT0xCCiskIQorJCEgQ2hlY2sgVG8gU2VlIFdoYXQgV2UgQXJlIFRvIERvLgorJCEKKyQgSUYgKEJVSUxEQUxMLkVRUy4iVFJVRSIpCiskIFRIRU4KKyQhCiskISAgU2luY2UgTm90aGluZyBTcGVjaWFsIFdhcyBTcGVjaWZpZWQsIERvIEV2ZXJ5dGhpbmcuCiskIQorJCAgIEdPU1VCIExJQlJBUlkKKyQgICBHT1NVQiBERVNURVNUCiskICAgR09TVUIgU1BFRUQKKyQgICBHT1NVQiBSUFcKKyQgICBHT1NVQiBERVMKKyQgICBHT1NVQiBERVNfT1BUUworJCEKKyQhIEVsc2UuLi4KKyQhCiskIEVMU0UKKyQhCiskISAgICBCdWlsZCBKdXN0IFdoYXQgVGhlIFVzZXIgV2FudHMgVXMgVG8gQnVpbGQuCiskIQorJCAgICAgR09TVUIgJ0JVSUxEQUxMJworJCEKKyQhIEVuZCBUaGUgQlVJTERBTEwgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIFRpbWUgVG8gRVhJVC4KKyQhCiskIEVYSVQKKyQgTElCUkFSWToKKyQhCiskISBUZWxsIFRoZSBVc2VyIFRoYXQgV2UgQXJlIENvbXBpbGluZy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIkNvbXBpbGluZyBUaGUgIixMSUJfTkFNRSwiIEZpbGVzLiIKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgQWxyZWFkeSBIYXZlIEEgIlsueHh4LkVYRS5DUllQVE8uREVTXUxJQkRFUy5PTEIiIExpYnJhcnkuLi4KKyQhCiskIElGIChGJFNFQVJDSChMSUJfTkFNRSkuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgR3Vlc3MgTm90LCBDcmVhdGUgVGhlIExpYnJhcnkuCiskIQorJCAgIExJQlJBUlkvQ1JFQVRFL09CSkVDVCAnTElCX05BTUUnCiskIQorJCEgRW5kIFRoZSBMaWJyYXJ5IEV4aXN0IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBEZWZpbmUgVGhlIERFUyBMaWJyYXJ5IEZpbGVzLgorJCEKKyQgTElCX0RFUyA9ICJzZXRfa2V5LGVjYl9lbmMsY2JjX2VuYywiKyAtCisJCSJlY2IzX2VuYyxjZmI2NGVuYyxjZmI2NGVkZSxjZmJfZW5jLG9mYjY0ZWRlLCIrIC0KKwkJImVuY19yZWFkLGVuY193cml0LG9mYjY0ZW5jLCIrIC0KKwkJIm9mYl9lbmMsc3RyMmtleSxwY2JjX2VuYyxxdWRfY2tzbSxyYW5kX2tleSwiKyAtCisJCSJkZXNfZW5jLGZjcnlwdF9iLHJlYWQycHdkLCIrIC0KKwkJImZjcnlwdCx4Y2JjX2VuYyxyZWFkX3B3ZCxycGNfZW5jLGNiY19ja3NtLHN1cHAiCiskIQorJCEgIERlZmluZSBBIEZpbGUgQ291bnRlciBBbmQgU2V0IEl0IFRvICIwIi4KKyQhCiskIEZJTEVfQ09VTlRFUiA9IDAKKyQhCiskISBUb3AgT2YgVGhlIEZpbGUgTG9vcC4KKyQhCiskIE5FWFRfRklMRToKKyQhCiskISBPLkssIEV4dHJhY3QgVGhlIEZpbGUgTmFtZSBGcm9tIFRoZSBGaWxlIExpc3QuCiskIQorJCBGSUxFX05BTUUgPSBGJEVMRU1FTlQoRklMRV9DT1VOVEVSLCIsIixMSUJfREVTKQorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgQXQgVGhlIEVuZCBPZiBUaGUgRmlsZSBMaXN0LgorJCEKKyQgSUYgKEZJTEVfTkFNRS5FUVMuIiwiKSBUSEVOIEdPVE8gRklMRV9ET05FCiskIQorJCEgSW5jcmVtZW50IFRoZSBDb3VudGVyLgorJCEKKyQgRklMRV9DT1VOVEVSID0gRklMRV9DT1VOVEVSICsgMQorJCEKKyQhIENyZWF0ZSBUaGUgU291cmNlIEZpbGUgTmFtZS4KKyQhCiskIFNPVVJDRV9GSUxFID0gIlNZUyRESVNLOltdIiArIEZJTEVfTkFNRSArICIuQyIKKyQhCiskISAgVGVsbCBUaGUgVXNlciBXZSBBcmUgQ29tcGlsaW5nIFRoZSBTb3VyY2UgRmlsZS4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIgkiLEZJTEVfTkFNRSwiLkMiCiskIQorJCEgQ3JlYXRlIFRoZSBPYmplY3QgRmlsZSBOYW1lLgorJCEKKyQgT0JKRUNUX0ZJTEUgPSBPQkpfRElSICsgRklMRV9OQU1FICsgIi4iICsgQVJDSCArICJPQkoiCiskIE9OIFdBUk5JTkcgVEhFTiBHT1RPIE5FWFRfRklMRQorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBUaGUgRmlsZSBXZSBXYW50IFRvIENvbXBpbGUgQWN0dWFsbHkgRXhpc3RzLgorJCEKKyQgSUYgKEYkU0VBUkNIKFNPVVJDRV9GSUxFKS5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgVGVsbCBUaGUgVXNlciBUaGF0IFRoZSBGaWxlIERvc2VuJ3QgRXhpc3QuCiskIQorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICJUaGUgRmlsZSAiLFNPVVJDRV9GSUxFLCIgRG9zZW4ndCBFeGlzdC4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBFeGl0IFRoZSBCdWlsZC4KKyQhCiskICAgRVhJVAorJCEKKyQhIEVuZCBUaGUgRmlsZSBFeGlzdHMgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENvbXBpbGUgVGhlIEZpbGUuCiskIQorJCBPTiBFUlJPUiBUSEVOIEdPVE8gTkVYVF9GSUxFCiskIENDL09CSkVDVD0nT0JKRUNUX0ZJTEUnICdTT1VSQ0VfRklMRScKKyQhCiskISBBZGQgSXQgVG8gVGhlIExpYnJhcnkuCiskIQorJCBMSUJSQVJZL1JFUExBQ0UvT0JKRUNUICdMSUJfTkFNRScgJ09CSkVDVF9GSUxFJworJCEKKyQhIFRpbWUgVG8gQ2xlYW4gVXAgVGhlIE9iamVjdCBGaWxlLgorJCEKKyQgREVMRVRFICdPQkpFQ1RfRklMRSc7KgorJCEKKyQhIEdvIEJhY2sgQW5kIERvIEl0IEFnYWluLgorJCEKKyQgR09UTyBORVhUX0ZJTEUKKyQhCiskISBBbGwgRG9uZSBXaXRoIFRoaXMgTGlicmFyeSBQYXJ0LgorJCEKKyQgRklMRV9ET05FOgorJCEKKyQhIFRlbGwgVGhlIFVzZXIgVGhhdCBXZSBBcmUgQWxsIERvbmUuCiskIQorJCBXUklURSBTWVMkT1VUUFVUICJMaWJyYXJ5ICIsTElCX05BTUUsIiBCdWlsdC4iCiskIQorJCEgQWxsIERvbmUsIFRpbWUgVG8gUmV0dXJuLgorJCEKKyQgUkVUVVJOCiskIQorJCEgIENvbXBpbGUgVGhlIERFU1RFU1QgUHJvZ3JhbS4KKyQhCiskIERFU1RFU1Q6CiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgVGhlIFByb3BlciBMaWJyYXJpZXMuCiskIQorJCBHT1NVQiBMSUJfQ0hFQ0sKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgSGF2ZSBBIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskIEdPU1VCIENIRUNLX09QVF9GSUxFCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFRoZSBGaWxlIFdlIFdhbnQgVG8gQ29tcGlsZSBBY3R1YWxseSBFeGlzdHMuCiskIQorJCBJRiAoRiRTRUFSQ0goIlNZUyRESVNLOltdREVTVEVTVC5DIikuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgVGhhdCBUaGUgRmlsZSBEb3Nlbid0IEV4aXN0LgorJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIEZpbGUgREVTVEVTVC5DIERvc2VuJ3QgRXhpc3QuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQhCiskISAgRXhpdCBUaGUgQnVpbGQuCiskIQorJCAgIEVYSVQKKyQhCiskISBFbmQgVGhlIERFU1RFU1QuQyBGaWxlIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBUZWxsIFRoZSBVc2VyIFdoYXQgV2UgQXJlIEJ1aWxkaW5nLgorJCEKKyQgV1JJVEUgU1lTJE9VVFBVVCAiQnVpbGRpbmcgIixFWEVfRElSLCJERVNURVNULkVYRSIKKyQhCiskISBDb21waWxlIFRoZSBERVNURVNUIFByb2dyYW0uCiskIQorJCBDQy9PQkpFQ1Q9J09CSl9ESVInREVTVEVTVC5PQkogU1lTJERJU0s6W11ERVNURVNULkMKKyQhCiskISBMaW5rIFRoZSBERVNURVNUIFByb2dyYW0uCiskIQorJCBMSU5LLydERUJVR0dFUicvJ1RSQUNFQkFDSycvQ09OVElHVU9VUy9FWEU9J0VYRV9ESVInREVTVEVTVC5FWEUgLQorICAgICAgJ09CSl9ESVInREVTVEVTVC5PQkosJ0xJQl9OQU1FJy9MSUJSQVJZLCdPUFRfRklMRScvT1BUSU9OCiskIQorJCEgQWxsIERvbmUsIFRpbWUgVG8gUmV0dXJuLgorJCEKKyQgUkVUVVJOCiskIQorJCEgIENvbXBpbGUgVGhlIFNQRUVEIFByb2dyYW0uCiskIQorJCBTUEVFRDoKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgSGF2ZSBUaGUgUHJvcGVyIExpYnJhcmllcy4KKyQhCiskIEdPU1VCIExJQl9DSEVDSworJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIEEgTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgR09TVUIgQ0hFQ0tfT1BUX0ZJTEUKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgVGhlIEZpbGUgV2UgV2FudCBUbyBDb21waWxlIEFjdHVhbGx5IEV4aXN0cy4KKyQhCiskIElGIChGJFNFQVJDSCgiU1lTJERJU0s6W11TUEVFRC5DIikuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgVGhhdCBUaGUgRmlsZSBEb3Nlbid0IEV4aXN0LgorJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIEZpbGUgU1BFRUQuQyBEb3Nlbid0IEV4aXN0LiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskIQorJCEgIEV4aXQgVGhlIEJ1aWxkLgorJCEKKyQgICBFWElUCiskIQorJCEgRW5kIFRoZSBTUEVFRC5DIEZpbGUgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIFRlbGwgVGhlIFVzZXIgV2hhdCBXZSBBcmUgQnVpbGRpbmcuCiskIQorJCBXUklURSBTWVMkT1VUUFVUICJCdWlsZGluZyAiLEVYRV9ESVIsIlNQRUVELkVYRSIKKyQhCiskISBDb21waWxlIFRoZSBTUEVFRCBQcm9ncmFtLgorJCEKKyQgQ0MvT0JKRUNUPSdPQkpfRElSJ1NQRUVELk9CSiBTWVMkRElTSzpbXVNQRUVELkMKKyQhCiskISBMaW5rIFRoZSBTUEVFRCBQcm9ncmFtLgorJCEKKyQgTElOSy8nREVCVUdHRVInLydUUkFDRUJBQ0snL0NPTlRJR1VPVVMvRVhFPSdFWEVfRElSJ1NQRUVELkVYRSAtCisgICAgICAnT0JKX0RJUidTUEVFRC5PQkosJ0xJQl9OQU1FJy9MSUJSQVJZLCdPUFRfRklMRScvT1BUSU9OCiskIQorJCEgQWxsIERvbmUsIFRpbWUgVG8gUmV0dXJuLgorJCEKKyQgUkVUVVJOCiskIQorJCEgIENvbXBpbGUgVGhlIFJQVyBQcm9ncmFtLgorJCEKKyQgUlBXOgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIFRoZSBQcm9wZXIgTGlicmFyaWVzLgorJCEKKyQgR09TVUIgTElCX0NIRUNLCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgQSBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCBHT1NVQiBDSEVDS19PUFRfRklMRQorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBUaGUgRmlsZSBXZSBXYW50IFRvIENvbXBpbGUgQWN0dWFsbHkgRXhpc3RzLgorJCEKKyQgSUYgKEYkU0VBUkNIKCJTWVMkRElTSzpbXVJQVy5DIikuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgVGhhdCBUaGUgRmlsZSBEb3Nlbid0IEV4aXN0LgorJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIEZpbGUgUlBXLkMgRG9zZW4ndCBFeGlzdC4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBFeGl0IFRoZSBCdWlsZC4KKyQhCiskICAgRVhJVAorJCEKKyQhIEVuZCBUaGUgUlBXLkMgRmlsZSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgVGVsbCBUaGUgVXNlciBXaGF0IFdlIEFyZSBCdWlsZGluZy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIkJ1aWxkaW5nICIsRVhFX0RJUiwiUlBXLkVYRSIKKyQhCiskISBDb21waWxlIFRoZSBSUFcgUHJvZ3JhbS4KKyQhCiskIENDL09CSkVDVD0nT0JKX0RJUidSUFcuT0JKIFNZUyRESVNLOltdUlBXLkMKKyQhCiskISBMaW5rIFRoZSBSUFcgUHJvZ3JhbS4KKyQhCiskIExJTksvJ0RFQlVHR0VSJy8nVFJBQ0VCQUNLJy9DT05USUdVT1VTL0VYRT0nRVhFX0RJUidSUFcuRVhFIC0KKyAgICAgICdPQkpfRElSJ1JQVy5PQkosJ0xJQl9OQU1FJy9MSUJSQVJZLCdPUFRfRklMRScvT1BUSU9OCiskIQorJCEgQWxsIERvbmUsIFRpbWUgVG8gUmV0dXJuLgorJCEKKyQgUkVUVVJOCiskIQorJCEgIENvbXBpbGUgVGhlIERFUyBQcm9ncmFtLgorJCEKKyQgREVTOgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIFRoZSBQcm9wZXIgTGlicmFyaWVzLgorJCEKKyQgR09TVUIgTElCX0NIRUNLCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgQSBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCBHT1NVQiBDSEVDS19PUFRfRklMRQorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBUaGUgRmlsZSBXZSBXYW50IFRvIENvbXBpbGUgQWN0dWFsbHkgRXhpc3RzLgorJCEKKyQgSUYgKEYkU0VBUkNIKCJTWVMkRElTSzpbXURFUy5DIikuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgVGhhdCBUaGUgRmlsZSBEb3Nlbid0IEV4aXN0LgorJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIEZpbGUgREVTLkMgRG9zZW4ndCBFeGlzdC4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBFeGl0IFRoZSBCdWlsZC4KKyQhCiskICAgRVhJVAorJCEKKyQhIEVuZCBUaGUgREVTLkMgRmlsZSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgVGVsbCBUaGUgVXNlciBXaGF0IFdlIEFyZSBCdWlsZGluZy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIkJ1aWxkaW5nICIsRVhFX0RJUiwiREVTLkVYRSIKKyQhCiskISBDb21waWxlIFRoZSBERVMgUHJvZ3JhbS4KKyQhCiskIENDL09CSkVDVD0nT0JKX0RJUidERVMuT0JKIFNZUyRESVNLOltdREVTLkMKKyQgQ0MvT0JKRUNUPSdPQkpfRElSJ0RFUy5PQkogU1lTJERJU0s6W11DQkMzX0VOQy5DCiskIQorJCEgTGluayBUaGUgREVTIFByb2dyYW0uCiskIQorJCBMSU5LLydERUJVR0dFUicvJ1RSQUNFQkFDSycvQ09OVElHVU9VUy9FWEU9J0VYRV9ESVInREVTLkVYRSAtCisgICAgICAnT0JKX0RJUidERVMuT0JKLCdPQkpfRElSJ0NCQzNfRU5DLk9CSiwtCisgICAgICAnTElCX05BTUUnL0xJQlJBUlksJ09QVF9GSUxFJy9PUFRJT04KKyQhCiskISBBbGwgRG9uZSwgVGltZSBUbyBSZXR1cm4uCiskIQorJCBSRVRVUk4KKyQhCiskISAgQ29tcGlsZSBUaGUgREVTX09QVFMgUHJvZ3JhbS4KKyQhCiskIERFU19PUFRTOgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIFRoZSBQcm9wZXIgTGlicmFyaWVzLgorJCEKKyQgR09TVUIgTElCX0NIRUNLCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgQSBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCBHT1NVQiBDSEVDS19PUFRfRklMRQorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBUaGUgRmlsZSBXZSBXYW50IFRvIENvbXBpbGUgQWN0dWFsbHkgRXhpc3RzLgorJCEKKyQgSUYgKEYkU0VBUkNIKCJTWVMkRElTSzpbXURFU19PUFRTLkMiKS5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgVGVsbCBUaGUgVXNlciBUaGF0IFRoZSBGaWxlIERvc2VuJ3QgRXhpc3QuCiskIQorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICJUaGUgRmlsZSBERVNfT1BUUy5DIERvc2VuJ3QgRXhpc3QuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQhCiskISAgRXhpdCBUaGUgQnVpbGQuCiskIQorJCAgIEVYSVQKKyQhCiskISBFbmQgVGhlIERFU19PUFRTLkMgRmlsZSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgVGVsbCBUaGUgVXNlciBXaGF0IFdlIEFyZSBCdWlsZGluZy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIkJ1aWxkaW5nICIsRVhFX0RJUiwiREVTX09QVFMuRVhFIgorJCEKKyQhIENvbXBpbGUgVGhlIERFU19PUFRTIFByb2dyYW0uCiskIQorJCBDQy9PQkpFQ1Q9J09CSl9ESVInREVTX09QVFMuT0JKIFNZUyRESVNLOltdREVTX09QVFMuQworJCEKKyQhIExpbmsgVGhlIERFU19PUFRTIFByb2dyYW0uCiskIQorJCBMSU5LLydERUJVR0dFUicvJ1RSQUNFQkFDSycvQ09OVElHVU9VUy9FWEU9J0VYRV9ESVInREVTX09QVFMuRVhFIC0KKyAgICAgICdPQkpfRElSJ0RFU19PUFRTLk9CSiwnTElCX05BTUUnL0xJQlJBUlksJ09QVF9GSUxFJy9PUFRJT04KKyQhCiskISBBbGwgRG9uZSwgVGltZSBUbyBSZXR1cm4uCiskIQorJCBSRVRVUk4KKyQgRVhJVAorJCEKKyQhIENoZWNrIEZvciBUaGUgTGluayBPcHRpb24gRklsZS4KKyQhCiskIENIRUNLX09QVF9GSUxFOgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBOZWVkIFRvIE1ha2UgQSBWQVggQyBPcHRpb24gRmlsZS4KKyQhCiskIElGIChDT01QSUxFUi5FUVMuIlZBWEMiKQorJCBUSEVOCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBbHJlYWR5IEhhdmUgQSBWQVggQyBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgIElGIChGJFNFQVJDSChPUFRfRklMRSkuRVFTLiIiKQorJCAgIFRIRU4KKyQhCiskISAgICBXZSBOZWVkIEEgVkFYIEMgTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICAgIENSRUFURSAnT1BUX0ZJTEUnCiskREVDSworIQorISBEZWZhdWx0IFN5c3RlbSBPcHRpb25zIEZpbGUgVG8gTGluayBBZ2lhbnN0IAorISBUaGUgU2hhcmFibGUgVkFYIEMgUnVudGltZSBMaWJyYXJ5LgorIQorU1lTJFNIQVJFOlZBWENSVEwuRVhFL1NIQVJFCiskRU9ECiskIQorJCEgIEVuZCBUaGUgT3B0aW9uIEZpbGUgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBWQVhDIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgTmVlZCBBIEdOVSBDIE9wdGlvbiBGaWxlLgorJCEKKyQgSUYgKENPTVBJTEVSLkVRUy4iR05VQyIpCiskIFRIRU4KKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFscmVhZHkgSGF2ZSBBIEdOVSBDIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskICAgSUYgKEYkU0VBUkNIKE9QVF9GSUxFKS5FUVMuIiIpCiskICAgVEhFTgorJCEKKyQhICAgIFdlIE5lZWQgQSBHTlUgQyBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgICAgQ1JFQVRFICdPUFRfRklMRScKKyRERUNLCishCishIERlZmF1bHQgU3lzdGVtIE9wdGlvbnMgRmlsZSBUbyBMaW5rIEFnaWFuc3QgCishIFRoZSBTaGFyYWJsZSBDIFJ1bnRpbWUgTGlicmFyeS4KKyEKK0dOVV9DQzpbMDAwMDAwXUdDQ0xJQi9MSUJSQVJZCitTWVMkU0hBUkU6VkFYQ1JUTC9TSEFSRQorJEVPRAorJCEKKyQhICBFbmQgVGhlIE9wdGlvbiBGaWxlIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgR05VIEMgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBOZWVkIEEgREVDIEMgT3B0aW9uIEZpbGUuCiskIQorJCBJRiAoQ09NUElMRVIuRVFTLiJERUNDIikKKyQgVEhFTgorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgV2UgQWxyZWFkeSBIYXZlIEEgREVDIEMgTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICBJRiAoRiRTRUFSQ0goT1BUX0ZJTEUpLkVRUy4iIikKKyQgICBUSEVOCiskIQorJCEgICAgRmlndXJlIE91dCBJZiBXZSBOZWVkIEFuIG5vbi1WQVggT3IgQSBWQVggTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICAgIElGIChGJEdFVFNZSSgiQ1BVIikuTFQuMTI4KQorJCAgICAgVEhFTgorJCEKKyQhICAgICAgV2UgTmVlZCBBIERFQyBDIExpbmtlciBPcHRpb24gRmlsZSBGb3IgVkFYLgorJCEKKyQgICAgICAgQ1JFQVRFICdPUFRfRklMRScKKyRERUNLCishCishIERlZmF1bHQgU3lzdGVtIE9wdGlvbnMgRmlsZSBUbyBMaW5rIEFnaWFuc3QgCishIFRoZSBTaGFyYWJsZSBERUMgQyBSdW50aW1lIExpYnJhcnkuCishCitTWVMkU0hBUkU6REVDQyRTSFIuRVhFL1NIQVJFCiskRU9ECiskIQorJCEgICAgRWxzZS4uLgorJCEKKyQgICAgIEVMU0UKKyQhCiskISAgICAgIENyZWF0ZSBUaGUgbm9uLVZBWCBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgICAgICBDUkVBVEUgJ09QVF9GSUxFJworJERFQ0sKKyEKKyEgRGVmYXVsdCBTeXN0ZW0gT3B0aW9ucyBGaWxlIEZvciBub24tVkFYIFRvIExpbmsgQWdpYW5zdCAKKyEgVGhlIFNoYXJhYmxlIEMgUnVudGltZSBMaWJyYXJ5LgorIQorU1lTJFNIQVJFOkNNQSRPUEVOX0xJQl9TSFIvU0hBUkUKK1NZUyRTSEFSRTpDTUEkT1BFTl9SVEwvU0hBUkUKKyRFT0QKKyQhCiskISAgICBFbmQgVGhlIERFQyBDIE9wdGlvbiBGaWxlIENoZWNrLgorJCEKKyQgICAgIEVORElGCiskIQorJCEgIEVuZCBUaGUgT3B0aW9uIEZpbGUgU2VhcmNoLgorJCEKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgREVDIEMgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhICBUZWxsIFRoZSBVc2VyIFdoYXQgTGlua2VyIE9wdGlvbiBGaWxlIFdlIEFyZSBVc2luZy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIExpbmtlciBPcHRpb24gRmlsZSAiLE9QVF9GSUxFLCIuIgkKKyQhCiskISBUaW1lIFRvIFJFVFVSTi4KKyQhCiskIFJFVFVSTgorJCEKKyQhIExpYnJhcnkgQ2hlY2suCiskIQorJCBMSUJfQ0hFQ0s6CiskIQorJCEgIExvb2sgRm9yIFRoZSBMaWJyYXJ5IExJQkRFUy5PTEIuCiskIQorJCBJRiAoRiRTRUFSQ0goTElCX05BTUUpLkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICAgIFRlbGwgVGhlIFVzZXIgV2UgQ2FuJ3QgRmluZCBUaGUgWy54eHguQ1JZUFRPLkRFU11MSUJERVMuT0xCIExpYnJhcnkuCiskIQorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICJDYW4ndCBGaW5kIFRoZSBMaWJyYXJ5ICIsTElCX05BTUUsIi4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiV2UgQ2FuJ3QgTGluayBXaXRob3V0IEl0LiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskIQorJCEgICAgU2luY2UgV2UgQ2FuJ3QgTGluayBXaXRob3V0IEl0LCBFeGl0LgorJCEKKyQgICBFWElUCiskIEVORElGCiskIQorJCEgVGltZSBUbyBSZXR1cm4uCiskIQorJCBSRVRVUk4KKyQhCiskISBDaGVjayBUaGUgVXNlcidzIE9wdGlvbnMuCiskIQorJCBDSEVDS19PUFRJT05TOgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgVG8gIkp1c3QgQnVpbGQgRXZlcnl0aGluZyIuCiskIQorJCBJRiAoUDEuRVFTLiJBTEwiKQorJCBUSEVOCiskIQorJCEgICBQMSBJcyAiQUxMIiwgU28gQnVpbGQgRXZlcnl0aGluZy4KKyQhCiskICAgIEJVSUxEQUxMID0gIlRSVUUiCiskIQorJCEgRWxzZS4uLgorJCEKKyQgRUxTRQorJCEKKyQhICBFbHNlLCBDaGVjayBUbyBTZWUgSWYgUDEgSGFzIEEgVmFsaWQgQXJndW1lbnQuCiskIQorJCAgIElGIChQMS5FUVMuIkxJQlJBUlkiKS5PUi4oUDEuRVFTLiJERVNURVNUIikuT1IuKFAxLkVRUy4iU1BFRUQiKSAtCisgICAgICAgLk9SLihQMS5FUVMuIlJQVyIpLk9SLihQMS5FUVMuIkRFUyIpLk9SLihQMS5FUVMuIkRFU19PUFRTIikKKyQgICBUSEVOCiskIQorJCEgICAgQSBWYWxpZCBBcmd1bWVudC4KKyQhCiskICAgICBCVUlMREFMTCA9IFAxCiskIQorJCEgIEVsc2UuLi4KKyQhCiskICAgRUxTRQorJCEKKyQhICAgIFRlbGwgVGhlIFVzZXIgV2UgRG9uJ3QgS25vdyBXaGF0IFRoZXkgV2FudC4KKyQhCiskICAgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgICBXUklURSBTWVMkT1VUUFVUICJUaGUgT3B0aW9uICIsUDEsIiBJcyBJbnZhbGlkLiAgVGhlIFZhbGlkIE9wdGlvbnMgQXJlOiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBBTEwgICAgICA6ICBKdXN0IEJ1aWxkIEV2ZXJ5dGhpbmcuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIExJQlJBUlkgIDogIFRvIENvbXBpbGUgSnVzdCBUaGUgWy54eHguRVhFLkNSWVBUTy5ERVNdTElCREVTLk9MQiBMaWJyYXJ5LiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBERVNURVNUICA6ICBUbyBDb21waWxlIEp1c3QgVGhlIFsueHh4LkVYRS5DUllQVE8uREVTXURFU1RFU1QuRVhFIFByb2dyYW0uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFNQRUVEICAgIDogIFRvIENvbXBpbGUgSnVzdCBUaGUgWy54eHguRVhFLkNSWVBUTy5ERVNdU1BFRUQuRVhFIFByb2dyYW0uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFJQVyAgICAgIDogIFRvIENvbXBpbGUgSnVzdCBUaGUgWy54eHguRVhFLkNSWVBUTy5ERVNdUlBXLkVYRSBQcm9ncmFtLiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBERVMgICAgICA6ICBUbyBDb21waWxlIEp1c3QgVGhlIFsueHh4LkVYRS5DUllQVE8uREVTXURFUy5FWEUgUHJvZ3JhbS4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgICAgREVTX09QVFMgOiAgVG8gQ29tcGlsZSBKdXN0IFRoZSBbLnh4eC5FWEUuQ1JZVFBPLkRFU11ERVNfT1BUUy5FWEUgUHJvZ3JhbS4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgV2hlcmUgJ3h4eCcgU3RhbmRzIEZvcjogIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIEFMUEhBICAgIDogIEFscGhhIEFyY2hpdGVjdHVyZS4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgICAgSUE2NCAgICAgOiAgSUE2NCBBcmNoaXRlY3R1cmUuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFZBWCAgICAgIDogIFZBWCBBcmNoaXRlY3R1cmUuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICAgIFRpbWUgVG8gRVhJVC4KKyQhCiskICAgICBFWElUCiskIQorJCEgIEVuZCBUaGUgVmFsaWQgQXJndW1lbnQgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBQMSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEFyZSBUbyBDb21waWxlIFdpdGhvdXQgRGVidWdnZXIgSW5mb3JtYXRpb24uCiskIQorJCBJRiAoUDIuRVFTLiJOT0RFQlVHIikKKyQgVEhFTgorJCEKKyQhICAgUDIgSXMgQmxhbmssIFNvIENvbXBpbGUgV2l0aG91dCBEZWJ1Z2dlciBJbmZvcm1hdGlvbi4KKyQhCiskICAgIERFQlVHR0VSICA9ICJOT0RFQlVHIgorJCAgICBUUkFDRUJBQ0sgPSAiTk9UUkFDRUJBQ0siIAorJCAgICBHQ0NfT1BUSU1JWkUgPSAiT1BUSU1JWkUiCiskICAgIENDX09QVElNSVpFID0gIk9QVElNSVpFIgorJCAgICBXUklURSBTWVMkT1VUUFVUICJObyBEZWJ1Z2dlciBJbmZvcm1hdGlvbiBXaWxsIEJlIFByb2R1Y2VkIER1cmluZyBDb21waWxlLiIKKyQgICAgV1JJVEUgU1lTJE9VVFBVVCAiQ29tcGlsaW5nIFdpdGggQ29tcGlsZXIgT3B0aW1pemF0aW9uLiIKKyQhCiskISBFbHNlLi4uCiskIQorJCBFTFNFCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgVG8gQ29tcGlsZSBXaXRoIERlYnVnZ2VyIEluZm9ybWF0aW9uLgorJCEKKyQgICBJRiAoUDIuRVFTLiJERUJVRyIpCiskICAgVEhFTgorJCEKKyQhICAgIENvbXBpbGUgV2l0aCBEZWJ1Z2dlciBJbmZvcm1hdGlvbi4KKyQhCiskICAgICBERUJVR0dFUiAgPSAiREVCVUciCiskICAgICBUUkFDRUJBQ0sgPSAiVFJBQ0VCQUNLIgorJCAgICAgR0NDX09QVElNSVpFID0gIk5PT1BUSU1JWkUiCiskICAgICBDQ19PUFRJTUlaRSA9ICJOT09QVElNSVpFIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiRGVidWdnZXIgSW5mb3JtYXRpb24gV2lsbCBCZSBQcm9kdWNlZCBEdXJpbmcgQ29tcGlsZS4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICJDb21waWxpbmcgV2l0aG91dCBDb21waWxlciBPcHRpbWl6YXRpb24uIgorJCEKKyQhICBFbHNlLi4uCiskIQorJCAgIEVMU0UKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIEVudGVyZWQgQW4gSW52YWxpZCBPcHRpb24uLgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlRoZSBPcHRpb24gIixQMiwiIElzIEludmFsaWQuICBUaGUgVmFsaWQgT3B0aW9ucyBBcmU6IgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIERFQlVHICAgIDogIENvbXBpbGUgV2l0aCBUaGUgRGVidWdnZXIgSW5mb3JtYXRpb24uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIE5PREVCVUcgIDogIENvbXBpbGUgV2l0aG91dCBUaGUgRGVidWdnZXIgSW5mb3JtYXRpb24uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICAgIFRpbWUgVG8gRVhJVC4KKyQhCiskICAgICBFWElUCiskIQorJCEgIEVuZCBUaGUgVmFsaWQgQXJndW1lbnQgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBQMiBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgU3BlY2lhbCBUaHJlYWRzIEZvciBPcGVuVk1TIHY3LjEgT3IgTGF0ZXIuCiskIQorJCEgV3JpdHRlbiBCeTogIFJpY2hhcmQgTGV2aXR0ZQorJCEgICAgICAgICAgICAgIHJpY2hhcmRAbGV2aXR0ZS5vcmcKKyQhCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgQSBPcHRpb24gRm9yIFA0LgorJCEKKyQgSUYgKFA0LkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBHZXQgVGhlIFZlcnNpb24gT2YgVk1TIFdlIEFyZSBVc2luZy4KKyQhCiskICAgSVNTRVZFTiA6PSAiIgorJCAgIFRNUCA9IEYkRUxFTUVOVCgwLCItIixGJEVYVFJBQ1QoMSw0LEYkR0VUU1lJKCJWRVJTSU9OIikpKQorJCAgIFRNUCA9IEYkSU5URUdFUihGJEVMRU1FTlQoMCwiLiIsVE1QKStGJEVMRU1FTlQoMSwiLiIsVE1QKSkKKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFRoZSBWTVMgVmVyc2lvbiBJcyB2Ny4xIE9yIExhdGVyLgorJCEKKyQgICBJRiAoVE1QLkdFLjcxKQorJCAgIFRIRU4KKyQhCiskISAgICBXZSBIYXZlIE9wZW5WTVMgdjcuMSBPciBMYXRlciwgU28gVXNlIFRoZSBTcGVjaWFsIFRocmVhZHMuCiskIQorJCAgICAgSVNTRVZFTiA6PSAsUFRIUkVBRF9VU0VfRDQKKyQhCiskISAgRW5kIFRoZSBWTVMgVmVyc2lvbiBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISBFbmQgVGhlIFA0IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgUDMgSXMgQmxhbmsuCiskIQorJCBJRiAoUDMuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIE8uSy4sIFRoZSBVc2VyIERpZG4ndCBTcGVjaWZ5IEEgQ29tcGlsZXIsIExldCdzIFRyeSBUbworJCEgIEZpbmQgT3V0IFdoaWNoIE9uZSBUbyBVc2UuCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIEdOVSBDLgorJCEKKyQgICBJRiAoRiRUUk5MTk0oIkdOVV9DQyIpLk5FUy4iIikKKyQgICBUSEVOCiskIQorJCEgICAgTG9va3MgTGlrZSBHTlVDLCBTZXQgVG8gVXNlIEdOVUMuCiskIQorJCAgICAgUDMgPSAiR05VQyIKKyQhCiskISAgRWxzZS4uLgorJCEKKyQgICBFTFNFCiskIQorJCEgICAgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgVkFYQyBPciBERUNDLgorJCEKKyQgICAgIElGIChBUkNILk5FUy4iVkFYIikuT1IuKEYkVFJOTE5NKCJERUNDJENDX0RFRkFVTFQiKS5ORVMuIiIpCiskICAgICBUSEVOIAorJCEKKyQhICAgICAgTG9va3MgTGlrZSBERUNDLCBTZXQgVG8gVXNlIERFQ0MuCiskIQorJCAgICAgICBQMyA9ICJERUNDIgorJCEKKyQhICAgIEVsc2UuLi4KKyQhCiskICAgICBFTFNFCiskIQorJCEgICAgICBMb29rcyBMaWtlIFZBWEMsIFNldCBUbyBVc2UgVkFYQy4KKyQhCiskICAgICAgIFAzID0gIlZBWEMiCiskIQorJCEgICAgRW5kIFRoZSBWQVhDIENvbXBpbGVyIENoZWNrLgorJCEKKyQgICAgIEVORElGCiskIQorJCEgIEVuZCBUaGUgREVDQyAmIFZBWEMgQ29tcGlsZXIgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgIEVuZCBUaGUgQ29tcGlsZXIgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIFNldCBVcCBJbml0aWFsIENDIERlZmluaXRpb25zLCBQb3NzaWJseSBXaXRoIFVzZXIgT25lcworJCEKKyQgQ0NERUZTID0gIiIKKyQgSUYgRiRUWVBFKFVTRVJfQ0NERUZTKSAuTkVTLiAiIiBUSEVOIENDREVGUyA9IFVTRVJfQ0NERUZTCiskIENDRVhUUkFGTEFHUyA9ICIiCiskIElGIEYkVFlQRShVU0VSX0NDRkxBR1MpIC5ORVMuICIiIFRIRU4gQ0NFWFRSQUZMQUdTID0gVVNFUl9DQ0ZMQUdTCiskIENDRElTQUJMRVdBUk5JTkdTID0gIiIKKyQgSUYgRiRUWVBFKFVTRVJfQ0NESVNBQkxFV0FSTklOR1MpIC5ORVMuICIiIFRIRU4gLQorCUNDRElTQUJMRVdBUk5JTkdTID0gVVNFUl9DQ0RJU0FCTEVXQVJOSU5HUworJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgVGhlIFVzZXIgRW50ZXJlZCBBIFZhbGlkIFBhcmFtdGVyLgorJCEKKyQgSUYgKFAzLkVRUy4iVkFYQyIpLk9SLihQMy5FUVMuIkRFQ0MiKS5PUi4oUDMuRVFTLiJHTlVDIikKKyQgVEhFTgorJCEKKyQhICAgIENoZWNrIFRvIFNlZSBJZiBUaGUgVXNlciBXYW50ZWQgREVDQy4KKyQhCiskICAgSUYgKFAzLkVRUy4iREVDQyIpCiskICAgVEhFTgorJCEKKyQhICAgIExvb2tzIExpa2UgREVDQywgU2V0IFRvIFVzZSBERUNDLgorJCEKKyQgICAgIENPTVBJTEVSID0gIkRFQ0MiCiskIQorJCEgICAgVGVsbCBUaGUgVXNlciBXZSBBcmUgVXNpbmcgREVDQy4KKyQhCiskICAgICBXUklURSBTWVMkT1VUUFVUICJVc2luZyBERUNDICdDJyBDb21waWxlci4iCiskIQorJCEgICAgVXNlIERFQ0MuLi4KKyQhCiskICAgICBDQyA9ICJDQyIKKyQgICAgIElGIEFSQ0guRVFTLiJWQVgiIC5BTkQuIEYkVFJOTE5NKCJERUNDJENDX0RFRkFVTFQiKS5ORVMuIi9ERUNDIiAtCisJIFRIRU4gQ0MgPSAiQ0MvREVDQyIKKyQgICAgIENDID0gQ0MgKyAiLycnQ0NfT1BUSU1JWkUnLycnREVCVUdHRVInL1NUQU5EQVJEPUFOU0k4OSIgKyAtCisgICAgICAgICAgICIvTk9MSVNUL1BSRUZJWD1BTEwiICsgQ0NFWFRSQUZMQUdTCiskIQorJCEgICAgRGVmaW5lIFRoZSBMaW5rZXIgT3B0aW9ucyBGaWxlIE5hbWUuCiskIQorJCAgICAgT1BUX0ZJTEUgPSAiJydFWEVfRElSJ1ZBWF9ERUNDX09QVElPTlMuT1BUIgorJCEKKyQhICBFbmQgREVDQyBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFyZSBUbyBVc2UgVkFYQy4KKyQhCiskICAgSUYgKFAzLkVRUy4iVkFYQyIpCiskICAgVEhFTgorJCEKKyQhICAgIExvb2tzIExpa2UgVkFYQywgU2V0IFRvIFVzZSBWQVhDLgorJCEKKyQgICAgIENPTVBJTEVSID0gIlZBWEMiCiskIQorJCEgICAgVGVsbCBUaGUgVXNlciBXZSBBcmUgVXNpbmcgVkFYIEMuCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVXNpbmcgVkFYQyAnQycgQ29tcGlsZXIuIgorJCEKKyQhICAgIENvbXBpbGUgVXNpbmcgVkFYQy4KKyQhCiskICAgICBDQyA9ICJDQyIKKyQgICAgIElGIEFSQ0guTkVTLiJWQVgiCiskICAgICBUSEVOCiskCVdSSVRFIFNZUyRPVVRQVVQgIlRoZXJlIGlzIG5vIFZBWCBDIG9uICcnQVJDSCchIgorJAlFWElUCiskICAgICBFTkRJRgorJCAgICAgSUYgRiRUUk5MTk0oIkRFQ0MkQ0NfREVGQVVMVCIpLkVRUy4iL0RFQ0MiIFRIRU4gQ0MgPSAiQ0MvVkFYQyIKKyQgICAgIENDID0gQ0MgKyAiLycnQ0NfT1BUSU1JWkUnLycnREVCVUdHRVInL05PTElTVCIgKyBDQ0VYVFJBRkxBR1MKKyQgICAgIENDREVGUyA9ICIiIlZBWEMiIiwiICsgQ0NERUZTCiskIQorJCEgICAgRGVmaW5lIDxzeXM+IEFzIFNZUyRDT01NT046W1NZU0xJQl0KKyQhCiskICAgICBERUZJTkUvTk9MT0cgU1lTIFNZUyRDT01NT046W1NZU0xJQl0KKyQhCiskISAgICBEZWZpbmUgVGhlIExpbmtlciBPcHRpb25zIEZpbGUgTmFtZS4KKyQhCiskICAgICBPUFRfRklMRSA9ICInJ0VYRV9ESVInVkFYX1ZBWENfT1BUSU9OUy5PUFQiCiskIQorJCEgIEVuZCBWQVhDIENoZWNrCiskIQorJCAgIEVORElGCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgVG8gVXNlIEdOVSBDLgorJCEKKyQgICBJRiAoUDMuRVFTLiJHTlVDIikKKyQgICBUSEVOCiskIQorJCEgICAgTG9va3MgTGlrZSBHTlVDLCBTZXQgVG8gVXNlIEdOVUMuCiskIQorJCAgICAgQ09NUElMRVIgPSAiR05VQyIKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIFdlIEFyZSBVc2luZyBHTlVDLgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIEdOVSAnQycgQ29tcGlsZXIuIgorJCEKKyQhICAgIFVzZSBHTlUgQy4uLgorJCEKKyQgICAgIENDID0gIkdDQy9OT0NBU0VfSEFDSy8nJ0dDQ19PUFRJTUlaRScvJydERUJVR0dFUicvTk9MSVNUIiArIENDRVhUUkFGTEFHUworJCEKKyQhICAgIERlZmluZSBUaGUgTGlua2VyIE9wdGlvbnMgRmlsZSBOYW1lLgorJCEKKyQgICAgIE9QVF9GSUxFID0gIicnRVhFX0RJUidWQVhfR05VQ19PUFRJT05TLk9QVCIKKyQhCiskISAgRW5kIFRoZSBHTlUgQyBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISAgU2V0IHVwIGRlZmF1bHQgZGVmaW5lcworJCEKKyQgICBDQ0RFRlMgPSAiIiJGTEFUX0lOQz0xIiIsIiArIENDREVGUworJCEKKyQhICBGaW5pc2ggdXAgdGhlIGRlZmluaXRpb24gb2YgQ0MuCiskIQorJCAgIElGIENPTVBJTEVSIC5FUVMuICJERUNDIgorJCAgIFRIRU4KKyQgICAgIElGIENDRElTQUJMRVdBUk5JTkdTIC5FUVMuICIiCiskICAgICBUSEVOCiskICAgICAgIENDNERJU0FCTEVXQVJOSU5HUyA9ICJET0xMQVJJRCIKKyQgICAgIEVMU0UKKyQgICAgICAgQ0M0RElTQUJMRVdBUk5JTkdTID0gQ0NESVNBQkxFV0FSTklOR1MgKyAiLERPTExBUklEIgorJCAgICAgICBDQ0RJU0FCTEVXQVJOSU5HUyA9ICIvV0FSTklORz0oRElTQUJMRT0oIiArIENDRElTQUJMRVdBUk5JTkdTICsgIikpIgorJCAgICAgRU5ESUYKKyQgICAgIENDNERJU0FCTEVXQVJOSU5HUyA9ICIvV0FSTklORz0oRElTQUJMRT0oIiArIENDNERJU0FCTEVXQVJOSU5HUyArICIpKSIKKyQgICBFTFNFCiskICAgICBDQ0RJU0FCTEVXQVJOSU5HUyA9ICIiCiskICAgICBDQzRESVNBQkxFV0FSTklOR1MgPSAiIgorJCAgIEVORElGCiskICAgQ0MgPSBDQyArICIvREVGSU5FPSgiICsgQ0NERUZTICsgIikiICsgQ0NESVNBQkxFV0FSTklOR1MKKyQhCiskISAgU2hvdyB1c2VyIHRoZSByZXN1bHQKKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiTWFpbiBDb21waWxpbmcgQ29tbWFuZDogIixDQworJCEKKyQhICBFbHNlIFRoZSBVc2VyIEVudGVyZWQgQW4gSW52YWxpZCBBcmd1bWVudC4KKyQhCiskIEVMU0UKKyQhCiskISAgVGVsbCBUaGUgVXNlciBXZSBEb24ndCBLbm93IFdoYXQgVGhleSBXYW50LgorJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIE9wdGlvbiAiLFAzLCIgSXMgSW52YWxpZC4gIFRoZSBWYWxpZCBPcHRpb25zIEFyZToiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBWQVhDICA6ICBUbyBDb21waWxlIFdpdGggVkFYIEMuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBERUNDICA6ICBUbyBDb21waWxlIFdpdGggREVDIEMuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBHTlVDICA6ICBUbyBDb21waWxlIFdpdGggR05VIEMuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQhCiskISAgVGltZSBUbyBFWElULgorJCEKKyQgICBFWElUCiskIQorJCEgRW5kIFRoZSBQMyBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgIFRpbWUgVG8gUkVUVVJOLi4uCiskIQorJCBSRVRVUk4KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzEzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlcy5jCkBAIC0wLDAgKzEsOTMyIEBACisvKiBjcnlwdG8vZGVzL2Rlcy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZm5kZWYgT1BFTlNTTF9TWVNfTVNET1MKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisjaW5jbHVkZSBPUEVOU1NMX1VOSVNURAorI2Vsc2UgLyogT1BFTlNTTF9TWVNfVk1TICovCisjaWZkZWYgX19ERUNDCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZWxzZSAvKiBub3QgX19ERUNDICovCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmIC8qIF9fREVDQyAqLworI2VuZGlmIC8qIE9QRU5TU0xfU1lTX1ZNUyAqLworI2Vsc2UgLyogT1BFTlNTTF9TWVNfTVNET1MgKi8KKyNpbmNsdWRlIDxpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiZGVzX3Zlci5oIgorCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisjaW5jbHVkZSA8dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGF0Lmg+CisjZWxzZQorI2lmbmRlZiBfSVJJWAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC91aV9jb21wYXQuaD4KKwordm9pZCB1c2FnZSh2b2lkKTsKK3ZvaWQgZG9lbmNyeXB0aW9uKHZvaWQpOworaW50IHV1ZndyaXRlKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBzaXplLCB1bnNpZ25lZCBpbnQgbnVtLCBGSUxFICpmcCk7Cit2b2lkIHV1ZndyaXRlRW5kKEZJTEUgKmZwKTsKK2ludCB1dWZyZWFkKHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgc2l6ZSx1bnNpZ25lZCBpbnQgbnVtLEZJTEUgKmZwKTsKK2ludCB1dWVuY29kZSh1bnNpZ25lZCBjaGFyICppbixpbnQgbnVtLHVuc2lnbmVkIGNoYXIgKm91dCk7CitpbnQgdXVkZWNvZGUodW5zaWduZWQgY2hhciAqaW4saW50IG51bSx1bnNpZ25lZCBjaGFyICpvdXQpOwordm9pZCBERVNfM2NiY19lbmNyeXB0KERFU19jYmxvY2sgKmlucHV0LERFU19jYmxvY2sgKm91dHB1dCxsb25nIGxlbmd0aCwKKwlERVNfa2V5X3NjaGVkdWxlIHNrMSxERVNfa2V5X3NjaGVkdWxlIHNrMiwKKwlERVNfY2Jsb2NrICppdmVjMSxERVNfY2Jsb2NrICppdmVjMixpbnQgZW5jKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKyNkZWZpbmUgRVhJVChhKSBleGl0KGEmMHgxMDAwMDAwMEwpCisjZWxzZQorI2RlZmluZSBFWElUKGEpIGV4aXQoYSkKKyNlbmRpZgorCisjZGVmaW5lIEJVRlNJWkUgKDgqMTAyNCkKKyNkZWZpbmUgVkVSSUZZICAxCisjZGVmaW5lIEtFWVNJWgk4CisjZGVmaW5lIEtFWVNJWkIgMTAyNCAvKiBzaG91bGQgaGl0IHR0eSBsaW5lIGxpbWl0IGZpcnN0IDotKSAqLworY2hhciBrZXlbS0VZU0laQisxXTsKK2ludCBkb19lbmNyeXB0LGxvbmdrPTA7CitGSUxFICpERVNfSU4sKkRFU19PVVQsKkNLU1VNX09VVDsKK2NoYXIgdXVuYW1lWzIwMF07Cit1bnNpZ25lZCBjaGFyIHV1YnVmWzUwXTsKK2ludCB1dWJ1Zm51bT0wOworI2RlZmluZSBJTlVVQlVGTgkoNDUqMTAwKQorI2RlZmluZSBPVVRVVUJVRgkoNjUqMTAwKQordW5zaWduZWQgY2hhciBiW09VVFVVQlVGXTsKK3Vuc2lnbmVkIGNoYXIgYmJbMzAwXTsKK0RFU19jYmxvY2sgY2tzdW09ezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH07CitjaGFyIGNrc3VtbmFtZVsyMDBdPSIiOworCitpbnQgdmZsYWcsY2ZsYWcsZWZsYWcsZGZsYWcsa2ZsYWcsYmZsYWcsZmZsYWcsc2ZsYWcsdWZsYWcsZmxhZzMsaGZsYWcsZXJyb3I7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJaW50IGk7CisJc3RydWN0IHN0YXQgaW5zLG91dHM7CisJY2hhciAqcDsKKwljaGFyICppbj1OVUxMLCpvdXQ9TlVMTDsKKworCXZmbGFnPWNmbGFnPWVmbGFnPWRmbGFnPWtmbGFnPWhmbGFnPWJmbGFnPWZmbGFnPXNmbGFnPXVmbGFnPWZsYWczPTA7CisJZXJyb3I9MDsKKwltZW1zZXQoa2V5LDAsc2l6ZW9mKGtleSkpOworCisJZm9yIChpPTE7IGk8YXJnYzsgaSsrKQorCQl7CisJCXA9YXJndltpXTsKKwkJaWYgKChwWzBdID09ICctJykgJiYgKHBbMV0gIT0gJ1wwJykpCisJCQl7CisJCQlwKys7CisJCQl3aGlsZSAoKnApCisJCQkJeworCQkJCXN3aXRjaCAoKihwKyspKQorCQkJCQl7CisJCQkJY2FzZSAnMyc6CisJCQkJCWZsYWczPTE7CisJCQkJCWxvbmdrPTE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2MnOgorCQkJCQljZmxhZz0xOworCQkJCQlzdHJuY3B5KGNrc3VtbmFtZSxwLDIwMCk7CisJCQkJCWNrc3VtbmFtZVtzaXplb2YoY2tzdW1uYW1lKS0xXT0nXDAnOworCQkJCQlwKz1zdHJsZW4oY2tzdW1uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnQyc6CisJCQkJCWNmbGFnPTE7CisJCQkJCWxvbmdrPTE7CisJCQkJCXN0cm5jcHkoY2tzdW1uYW1lLHAsMjAwKTsKKwkJCQkJY2tzdW1uYW1lW3NpemVvZihja3N1bW5hbWUpLTFdPSdcMCc7CisJCQkJCXArPXN0cmxlbihja3N1bW5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdlJzoKKwkJCQkJZWZsYWc9MTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAndic6CisJCQkJCXZmbGFnPTE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0UnOgorCQkJCQllZmxhZz0xOworCQkJCQlsb25naz0xOworCQkJCQlicmVhazsKKwkJCQljYXNlICdkJzoKKwkJCQkJZGZsYWc9MTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRCc6CisJCQkJCWRmbGFnPTE7CisJCQkJCWxvbmdrPTE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2InOgorCQkJCQliZmxhZz0xOworCQkJCQlicmVhazsKKwkJCQljYXNlICdmJzoKKwkJCQkJZmZsYWc9MTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAncyc6CisJCQkJCXNmbGFnPTE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ3UnOgorCQkJCQl1ZmxhZz0xOworCQkJCQlzdHJuY3B5KHV1bmFtZSxwLDIwMCk7CisJCQkJCXV1bmFtZVtzaXplb2YodXVuYW1lKS0xXT0nXDAnOworCQkJCQlwKz1zdHJsZW4odXVuYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnaCc6CisJCQkJCWhmbGFnPTE7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2snOgorCQkJCQlrZmxhZz0xOworCQkJCQlpZiAoKGkrMSkgPT0gYXJnYykKKwkJCQkJCXsKKwkJCQkJCWZwdXRzKCJtdXN0IGhhdmUgYSBrZXkgd2l0aCB0aGUgLWsgb3B0aW9uXG4iLHN0ZGVycik7CisJCQkJCQllcnJvcj0xOworCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQlpbnQgajsKKworCQkJCQkJaSsrOworCQkJCQkJc3RybmNweShrZXksYXJndltpXSxLRVlTSVpCKTsKKwkJCQkJCWZvciAoaj1zdHJsZW4oYXJndltpXSktMTsgaj49MDsgai0tKQorCQkJCQkJCWFyZ3ZbaV1bal09J1wwJzsKKwkJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZnByaW50ZihzdGRlcnIsIiclYycgdW5rbm93biBmbGFnXG4iLHBbLTFdKTsKKwkJCQkJZXJyb3I9MTsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmIChpbiA9PSBOVUxMKQorCQkJCWluPWFyZ3ZbaV07CisJCQllbHNlIGlmIChvdXQgPT0gTlVMTCkKKwkJCQlvdXQ9YXJndltpXTsKKwkJCWVsc2UKKwkJCQllcnJvcj0xOworCQkJfQorCQl9CisJaWYgKGVycm9yKSB1c2FnZSgpOworCS8qIFdlIGVpdGhlcgorCSAqIGRvIGNoZWNrc3VtIG9yCisJICogZG8gZW5jcnlwdCBvcgorCSAqIGRvIGRlY3J5cHQgb3IKKwkgKiBkbyBkZWNyeXB0IHRoZW4gY2tlY2tzdW0gb3IKKwkgKiBkbyBjaGVja3N1bSB0aGVuIGVuY3J5cHQKKwkgKi8KKwlpZiAoKChlZmxhZytkZmxhZykgPT0gMSkgfHwgY2ZsYWcpCisJCXsKKwkJaWYgKGVmbGFnKSBkb19lbmNyeXB0PURFU19FTkNSWVBUOworCQlpZiAoZGZsYWcpIGRvX2VuY3J5cHQ9REVTX0RFQ1JZUFQ7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKHZmbGFnKSAKKwkJCXsKKyNpZm5kZWYgX1dpbmRvd3MJCQkKKwkJCWZwcmludGYoc3RkZXJyLCJkZXMoMSkgYnVpbHQgd2l0aCAlc1xuIixsaWJkZXNfdmVyc2lvbik7CisjZW5kaWYJCQkKKwkJCUVYSVQoMSk7CisJCQl9CisJCWVsc2UgdXNhZ2UoKTsKKwkJfQorCisjaWZuZGVmIF9XaW5kb3dzCQkJCisJaWYgKHZmbGFnKSBmcHJpbnRmKHN0ZGVyciwiZGVzKDEpIGJ1aWx0IHdpdGggJXNcbiIsbGliZGVzX3ZlcnNpb24pOworI2VuZGlmCQkJCisJaWYgKAkoaW4gIT0gTlVMTCkgJiYKKwkJKG91dCAhPSBOVUxMKSAmJgorI2lmbmRlZiBPUEVOU1NMX1NZU19NU0RPUworCQkoc3RhdChpbiwmaW5zKSAhPSAtMSkgJiYKKwkJKHN0YXQob3V0LCZvdXRzKSAhPSAtMSkgJiYKKwkJKGlucy5zdF9kZXYgPT0gb3V0cy5zdF9kZXYpICYmCisJCShpbnMuc3RfaW5vID09IG91dHMuc3RfaW5vKSkKKyNlbHNlIC8qIE9QRU5TU0xfU1lTX01TRE9TICovCisJCShzdHJjbXAoaW4sb3V0KSA9PSAwKSkKKyNlbmRpZgorCQkJeworCQkJZnB1dHMoImlucHV0IGFuZCBvdXRwdXQgZmlsZSBhcmUgdGhlIHNhbWVcbiIsc3RkZXJyKTsKKwkJCUVYSVQoMyk7CisJCQl9CisKKwlpZiAoIWtmbGFnKQorCQlpZiAoZGVzX3JlYWRfcHdfc3RyaW5nKGtleSxLRVlTSVpCKzEsIkVudGVyIGtleToiLGVmbGFnP1ZFUklGWTowKSkKKwkJCXsKKwkJCWZwdXRzKCJwYXNzd29yZCBlcnJvclxuIixzdGRlcnIpOworCQkJRVhJVCgyKTsKKwkJCX0KKworCWlmIChpbiA9PSBOVUxMKQorCQlERVNfSU49c3RkaW47CisJZWxzZSBpZiAoKERFU19JTj1mb3BlbihpbiwiciIpKSA9PSBOVUxMKQorCQl7CisJCXBlcnJvcigib3BlbmluZyBpbnB1dCBmaWxlIik7CisJCUVYSVQoNCk7CisJCX0KKworCUNLU1VNX09VVD1zdGRvdXQ7CisJaWYgKG91dCA9PSBOVUxMKQorCQl7CisJCURFU19PVVQ9c3Rkb3V0OworCQlDS1NVTV9PVVQ9c3RkZXJyOworCQl9CisJZWxzZSBpZiAoKERFU19PVVQ9Zm9wZW4ob3V0LCJ3IikpID09IE5VTEwpCisJCXsKKwkJcGVycm9yKCJvcGVuaW5nIG91dHB1dCBmaWxlIik7CisJCUVYSVQoNSk7CisJCX0KKworI2lmZGVmIE9QRU5TU0xfU1lTX01TRE9TCisJLyogVGhpcyBzaG91bGQgc2V0IHRoZSBmaWxlIHRvIGJpbmFyeSBtb2RlLiAqLworCXsKKyNpbmNsdWRlIDxmY250bC5oPgorCWlmICghKHVmbGFnICYmIGRmbGFnKSkKKwkJc2V0bW9kZShmaWxlbm8oREVTX0lOKSxPX0JJTkFSWSk7CisJaWYgKCEodWZsYWcgJiYgZWZsYWcpKQorCQlzZXRtb2RlKGZpbGVubyhERVNfT1VUKSxPX0JJTkFSWSk7CisJfQorI2VuZGlmCisKKwlkb2VuY3J5cHRpb24oKTsKKwlmY2xvc2UoREVTX0lOKTsKKwlmY2xvc2UoREVTX09VVCk7CisJRVhJVCgwKTsKKwl9CisKK3ZvaWQgdXNhZ2Uodm9pZCkKKwl7CisJY2hhciAqKnU7CisJc3RhdGljIGNvbnN0IGNoYXIgKlVzYWdlW109eworImRlcyA8b3B0aW9ucz4gW2lucHV0LWZpbGUgW291dHB1dC1maWxlXV0iLAorIm9wdGlvbnM6IiwKKyItdiAgICAgICAgIDogZGVzKDEpIHZlcnNpb24gbnVtYmVyIiwKKyItZSAgICAgICAgIDogZW5jcnlwdCB1c2luZyBTdW5PUyBjb21wYXRpYmxlIHVzZXIga2V5IHRvIERFUyBrZXkgY29udmVyc2lvbi4iLAorIi1FICAgICAgICAgOiBlbmNyeXB0ICIsCisiLWQgICAgICAgICA6IGRlY3J5cHQgdXNpbmcgU3VuT1MgY29tcGF0aWJsZSB1c2VyIGtleSB0byBERVMga2V5IGNvbnZlcnNpb24uIiwKKyItRCAgICAgICAgIDogZGVjcnlwdCAiLAorIi1jW2NrbmFtZV0gOiBnZW5lcmF0ZSBhIGNiY19ja3N1bSB1c2luZyBTdW5PUyBjb21wYXRpYmxlIHVzZXIga2V5IHRvIiwKKyIgICAgICAgICAgICAgREVTIGtleSBjb252ZXJzaW9uIGFuZCBvdXRwdXQgdG8gY2tuYW1lIChzdGRvdXQgZGVmYXVsdCwiLAorIiAgICAgICAgICAgICBzdGRlcnIgaWYgZGF0YSBiZWluZyBvdXRwdXQgb24gc3Rkb3V0KS4gIFRoZSBjaGVja3N1bSBpcyIsCisiICAgICAgICAgICAgIGdlbmVyYXRlZCBiZWZvcmUgZW5jcnlwdGlvbiBhbmQgYWZ0ZXIgZGVjcnlwdGlvbiBpZiB1c2VkIiwKKyIgICAgICAgICAgICAgaW4gY29uanVuY3Rpb24gd2l0aCAtW2VFZERdLiIsCisiLUNbY2tuYW1lXSA6IGdlbmVyYXRlIGEgY2JjX2Nrc3VtIGFzIGZvciAtYyBidXQgY29tcGF0aWJsZSB3aXRoIC1bRURdLiIsCisiLWsga2V5ICAgICA6IHVzZSBrZXkgJ2tleSciLAorIi1oICAgICAgICAgOiB0aGUga2V5IHRoYXQgaXMgZW50ZXJlZCB3aWxsIGJlIGEgaGV4YWRlY2ltYWwgbnVtYmVyIiwKKyIgICAgICAgICAgICAgdGhhdCBpcyB1c2VkIGRpcmVjdGx5IGFzIHRoZSBkZXMga2V5IiwKKyItdVt1dW5hbWVdIDogaW5wdXQgZmlsZSBpcyB1dWRlY29kZWQgaWYgLVtkRF0gb3Igb3V0cHV0IHV1ZW5jb2RlZCBkYXRhIGlmIC1bZUVdIiwKKyIgICAgICAgICAgICAgKHV1bmFtZSBpcyB0aGUgZmlsZW5hbWUgdG8gcHV0IGluIHRoZSB1dWVuY29kZSBoZWFkZXIpLiIsCisiLWIgICAgICAgICA6IGVuY3J5cHQgdXNpbmcgREVTIGluIGVjYiBlbmNyeXB0aW9uIG1vZGUsIHRoZSBkZWZhdWx0IGlzIGNiYyBtb2RlLiIsCisiLTMgICAgICAgICA6IGVuY3J5cHQgdXNpbmcgdHJpcGxlIERFUyBlbmNyeXB0aW9uLiAgVGhpcyB1c2VzIDIga2V5cyIsCisiICAgICAgICAgICAgIGdlbmVyYXRlZCBmcm9tIHRoZSBpbnB1dCBrZXkuICBJZiB0aGUgaW5wdXQga2V5IGlzIGxlc3MiLAorIiAgICAgICAgICAgICB0aGFuIDggY2hhcmFjdGVycyBsb25nLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gbm9ybWFsIiwKKyIgICAgICAgICAgICAgZW5jcnlwdGlvbi4gIERlZmF1bHQgaXMgdHJpcGxlIGNiYywgLWIgbWFrZXMgaXQgdHJpcGxlIGVjYi4iLAorTlVMTAorfTsKKwlmb3IgKHU9KGNoYXIgKiopVXNhZ2U7ICp1OyB1KyspCisJCXsKKwkJZnB1dHMoKnUsc3RkZXJyKTsKKwkJZnB1dGMoJ1xuJyxzdGRlcnIpOworCQl9CisKKwlFWElUKDEpOworCX0KKwordm9pZCBkb2VuY3J5cHRpb24odm9pZCkKKwl7CisjaWZkZWYgX0xJQkMKKwlleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1lKCk7CisjZW5kaWYKKworCXJlZ2lzdGVyIGludCBpOworCURFU19rZXlfc2NoZWR1bGUga3Msa3MyOworCURFU19jYmxvY2sgaXYsaXYyOworCWNoYXIgKnA7CisJaW50IG51bT0wLGosayxsLHJlbSxsbCxsZW4sbGFzdCxleD0wOworCURFU19jYmxvY2sga2ssazI7CisJRklMRSAqTzsKKwlpbnQgRXhpdD0wOworI2lmbmRlZiBPUEVOU1NMX1NZU19NU0RPUworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFKzhdLG9idWZbQlVGU0laRSs4XTsKKyNlbHNlCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgKmJ1Zj1OVUxMLCpvYnVmPU5VTEw7CisKKwlpZiAoYnVmID09IE5VTEwpCisJCXsKKwkJaWYgKCAgICAoKCBidWY9T1BFTlNTTF9tYWxsb2MoQlVGU0laRSs4KSkgPT0gTlVMTCkgfHwKKwkJCSgob2J1Zj1PUEVOU1NMX21hbGxvYyhCVUZTSVpFKzgpKSA9PSBOVUxMKSkKKwkJCXsKKwkJCWZwdXRzKCJOb3QgZW5vdWdoIG1lbW9yeVxuIixzdGRlcnIpOworCQkJRXhpdD0xMDsKKwkJCWdvdG8gcHJvYmxlbXM7CisJCQl9CisJCX0KKyNlbmRpZgorCisJaWYgKGhmbGFnKQorCQl7CisJCWo9KGZsYWczPzE2OjgpOworCQlwPWtleTsKKwkJZm9yIChpPTA7IGk8ajsgaSsrKQorCQkJeworCQkJaz0wOworCQkJaWYgKCgqcCA8PSAnOScpICYmICgqcCA+PSAnMCcpKQorCQkJCWs9KCpwLScwJyk8PDQ7CisJCQllbHNlIGlmICgoKnAgPD0gJ2YnKSAmJiAoKnAgPj0gJ2EnKSkKKwkJCQlrPSgqcC0nYScrMTApPDw0OworCQkJZWxzZSBpZiAoKCpwIDw9ICdGJykgJiYgKCpwID49ICdBJykpCisJCQkJaz0oKnAtJ0EnKzEwKTw8NDsKKwkJCWVsc2UKKwkJCQl7CisJCQkJZnB1dHMoIkJhZCBoZXgga2V5XG4iLHN0ZGVycik7CisJCQkJRXhpdD05OworCQkJCWdvdG8gcHJvYmxlbXM7CisJCQkJfQorCQkJcCsrOworCQkJaWYgKCgqcCA8PSAnOScpICYmICgqcCA+PSAnMCcpKQorCQkJCWt8PSgqcC0nMCcpOworCQkJZWxzZSBpZiAoKCpwIDw9ICdmJykgJiYgKCpwID49ICdhJykpCisJCQkJa3w9KCpwLSdhJysxMCk7CisJCQllbHNlIGlmICgoKnAgPD0gJ0YnKSAmJiAoKnAgPj0gJ0EnKSkKKwkJCQlrfD0oKnAtJ0EnKzEwKTsKKwkJCWVsc2UKKwkJCQl7CisJCQkJZnB1dHMoIkJhZCBoZXgga2V5XG4iLHN0ZGVycik7CisJCQkJRXhpdD05OworCQkJCWdvdG8gcHJvYmxlbXM7CisJCQkJfQorCQkJcCsrOworCQkJaWYgKGkgPCA4KQorCQkJCWtrW2ldPWs7CisJCQllbHNlCisJCQkJazJbaS04XT1rOworCQkJfQorCQlERVNfc2V0X2tleV91bmNoZWNrZWQoJmsyLCZrczIpOworCQlPUEVOU1NMX2NsZWFuc2UoazIsc2l6ZW9mKGsyKSk7CisJCX0KKwllbHNlIGlmIChsb25nayB8fCBmbGFnMykKKwkJeworCQlpZiAoZmxhZzMpCisJCQl7CisJCQlERVNfc3RyaW5nX3RvXzJrZXlzKGtleSwma2ssJmsyKTsKKwkJCURFU19zZXRfa2V5X3VuY2hlY2tlZCgmazIsJmtzMik7CisJCQlPUEVOU1NMX2NsZWFuc2UoazIsc2l6ZW9mKGsyKSk7CisJCQl9CisJCWVsc2UKKwkJCURFU19zdHJpbmdfdG9fa2V5KGtleSwma2spOworCQl9CisJZWxzZQorCQlmb3IgKGk9MDsgaTxLRVlTSVo7IGkrKykKKwkJCXsKKwkJCWw9MDsKKwkJCWs9a2V5W2ldOworCQkJZm9yIChqPTA7IGo8ODsgaisrKQorCQkJCXsKKwkJCQlpZiAoayYxKSBsKys7CisJCQkJaz4+PTE7CisJCQkJfQorCQkJaWYgKGwgJiAxKQorCQkJCWtrW2ldPWtleVtpXSYweDdmOworCQkJZWxzZQorCQkJCWtrW2ldPWtleVtpXXwweDgwOworCQkJfQorCisJREVTX3NldF9rZXlfdW5jaGVja2VkKCZraywma3MpOworCU9QRU5TU0xfY2xlYW5zZShrZXksc2l6ZW9mKGtleSkpOworCU9QRU5TU0xfY2xlYW5zZShrayxzaXplb2Yoa2spKTsKKwkvKiB3b29wcyAtIEEgYnVnIHRoYXQgZG9lcyBub3Qgc2hvd3VwIHVuZGVyIHVuaXggOi0oICovCisJbWVtc2V0KGl2LDAsc2l6ZW9mKGl2KSk7CisJbWVtc2V0KGl2MiwwLHNpemVvZihpdjIpKTsKKworCWw9MTsKKwlyZW09MDsKKwkvKiBmaXJzdCByZWFkICovCisJaWYgKGVmbGFnIHx8ICghZGZsYWcgJiYgY2ZsYWcpKQorCQl7CisJCWZvciAoOzspCisJCQl7CisJCQludW09bD1mcmVhZCgmKGJ1ZltyZW1dKSwxLEJVRlNJWkUsREVTX0lOKTsKKwkJCWwrPXJlbTsKKwkJCW51bSs9cmVtOworCQkJaWYgKGwgPCAwKQorCQkJCXsKKwkJCQlwZXJyb3IoInJlYWQgZXJyb3IiKTsKKwkJCQlFeGl0PTY7CisJCQkJZ290byBwcm9ibGVtczsKKwkJCQl9CisKKwkJCXJlbT1sJTg7CisJCQlsZW49bC1yZW07CisJCQlpZiAoZmVvZihERVNfSU4pKQorCQkJCXsKKwkJCQlmb3IgKGk9Ny1yZW07IGk+MDsgaS0tKQorCQkJCQlSQU5EX3BzZXVkb19ieXRlcyhidWYgKyBsKyssIDEpOworCQkJCWJ1ZltsKytdPXJlbTsKKwkJCQlleD0xOworCQkJCWxlbis9cmVtOworCQkJCX0KKwkJCWVsc2UKKwkJCQlsLT1yZW07CisKKwkJCWlmIChjZmxhZykKKwkJCQl7CisJCQkJREVTX2NiY19ja3N1bShidWYsJmNrc3VtLAorCQkJCQkobG9uZylsZW4sJmtzLCZja3N1bSk7CisJCQkJaWYgKCFlZmxhZykKKwkJCQkJeworCQkJCQlpZiAoZmVvZihERVNfSU4pKSBicmVhazsKKwkJCQkJZWxzZSBjb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKworCQkJaWYgKGJmbGFnICYmICFmbGFnMykKKwkJCQlmb3IgKGk9MDsgaTxsOyBpKz04KQorCQkJCQlERVNfZWNiX2VuY3J5cHQoCisJCQkJCQkoREVTX2NibG9jayAqKSYoYnVmW2ldKSwKKwkJCQkJCShERVNfY2Jsb2NrICopJihvYnVmW2ldKSwKKwkJCQkJCSZrcyxkb19lbmNyeXB0KTsKKwkJCWVsc2UgaWYgKGZsYWczICYmIGJmbGFnKQorCQkJCWZvciAoaT0wOyBpPGw7IGkrPTgpCisJCQkJCURFU19lY2IyX2VuY3J5cHQoCisJCQkJCQkoREVTX2NibG9jayAqKSYoYnVmW2ldKSwKKwkJCQkJCShERVNfY2Jsb2NrICopJihvYnVmW2ldKSwKKwkJCQkJCSZrcywma3MyLGRvX2VuY3J5cHQpOworCQkJZWxzZSBpZiAoZmxhZzMgJiYgIWJmbGFnKQorCQkJCXsKKwkJCQljaGFyIHRtcGJ1Zls4XTsKKworCQkJCWlmIChyZW0pIG1lbWNweSh0bXBidWYsJihidWZbbF0pLAorCQkJCQkodW5zaWduZWQgaW50KXJlbSk7CisJCQkJREVTXzNjYmNfZW5jcnlwdCgKKwkJCQkJKERFU19jYmxvY2sgKilidWYsKERFU19jYmxvY2sgKilvYnVmLAorCQkJCQkobG9uZylsLGtzLGtzMiwmaXYsCisJCQkJCSZpdjIsZG9fZW5jcnlwdCk7CisJCQkJaWYgKHJlbSkgbWVtY3B5KCYoYnVmW2xdKSx0bXBidWYsCisJCQkJCSh1bnNpZ25lZCBpbnQpcmVtKTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCURFU19jYmNfZW5jcnlwdCgKKwkJCQkJYnVmLG9idWYsCisJCQkJCShsb25nKWwsJmtzLCZpdixkb19lbmNyeXB0KTsKKwkJCQlpZiAobCA+PSA4KSBtZW1jcHkoaXYsJihvYnVmW2wtOF0pLDgpOworCQkJCX0KKwkJCWlmIChyZW0pIG1lbWNweShidWYsJihidWZbbF0pLCh1bnNpZ25lZCBpbnQpcmVtKTsKKworCQkJaT0wOworCQkJd2hpbGUgKGkgPCBsKQorCQkJCXsKKwkJCQlpZiAodWZsYWcpCisJCQkJCWo9dXVmd3JpdGUob2J1ZiwxLCh1bnNpZ25lZCBpbnQpbC1pLAorCQkJCQkJREVTX09VVCk7CisJCQkJZWxzZQorCQkJCQlqPWZ3cml0ZShvYnVmLDEsKHVuc2lnbmVkIGludClsLWksCisJCQkJCQlERVNfT1VUKTsKKwkJCQlpZiAoaiA9PSAtMSkKKwkJCQkJeworCQkJCQlwZXJyb3IoIldyaXRlIGVycm9yIik7CisJCQkJCUV4aXQ9NzsKKwkJCQkJZ290byBwcm9ibGVtczsKKwkJCQkJfQorCQkJCWkrPWo7CisJCQkJfQorCQkJaWYgKGZlb2YoREVTX0lOKSkKKwkJCQl7CisJCQkJaWYgKHVmbGFnKSB1dWZ3cml0ZUVuZChERVNfT1VUKTsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwllbHNlIC8qIGRlY3J5cHQgKi8KKwkJeworCQlleD0xOworCQlmb3IgKDs7KQorCQkJeworCQkJaWYgKGV4KSB7CisJCQkJaWYgKHVmbGFnKQorCQkJCQlsPXV1ZnJlYWQoYnVmLDEsQlVGU0laRSxERVNfSU4pOworCQkJCWVsc2UKKwkJCQkJbD1mcmVhZChidWYsMSxCVUZTSVpFLERFU19JTik7CisJCQkJZXg9MDsKKwkJCQlyZW09bCU4OworCQkJCWwtPXJlbTsKKwkJCQl9CisJCQlpZiAobCA8IDApCisJCQkJeworCQkJCXBlcnJvcigicmVhZCBlcnJvciIpOworCQkJCUV4aXQ9NjsKKwkJCQlnb3RvIHByb2JsZW1zOworCQkJCX0KKworCQkJaWYgKGJmbGFnICYmICFmbGFnMykKKwkJCQlmb3IgKGk9MDsgaTxsOyBpKz04KQorCQkJCQlERVNfZWNiX2VuY3J5cHQoCisJCQkJCQkoREVTX2NibG9jayAqKSYoYnVmW2ldKSwKKwkJCQkJCShERVNfY2Jsb2NrICopJihvYnVmW2ldKSwKKwkJCQkJCSZrcyxkb19lbmNyeXB0KTsKKwkJCWVsc2UgaWYgKGZsYWczICYmIGJmbGFnKQorCQkJCWZvciAoaT0wOyBpPGw7IGkrPTgpCisJCQkJCURFU19lY2IyX2VuY3J5cHQoCisJCQkJCQkoREVTX2NibG9jayAqKSYoYnVmW2ldKSwKKwkJCQkJCShERVNfY2Jsb2NrICopJihvYnVmW2ldKSwKKwkJCQkJCSZrcywma3MyLGRvX2VuY3J5cHQpOworCQkJZWxzZSBpZiAoZmxhZzMgJiYgIWJmbGFnKQorCQkJCXsKKwkJCQlERVNfM2NiY19lbmNyeXB0KAorCQkJCQkoREVTX2NibG9jayAqKWJ1ZiwoREVTX2NibG9jayAqKW9idWYsCisJCQkJCShsb25nKWwsa3Msa3MyLCZpdiwKKwkJCQkJJml2Mixkb19lbmNyeXB0KTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCURFU19jYmNfZW5jcnlwdCgKKwkJCQkJYnVmLG9idWYsCisJCQkJIAkobG9uZylsLCZrcywmaXYsZG9fZW5jcnlwdCk7CisJCQkJaWYgKGwgPj0gOCkgbWVtY3B5KGl2LCYoYnVmW2wtOF0pLDgpOworCQkJCX0KKworCQkJaWYgKHVmbGFnKQorCQkJCWxsPXV1ZnJlYWQoJihidWZbcmVtXSksMSxCVUZTSVpFLERFU19JTik7CisJCQllbHNlCisJCQkJbGw9ZnJlYWQoJihidWZbcmVtXSksMSxCVUZTSVpFLERFU19JTik7CisJCQlsbCs9cmVtOworCQkJcmVtPWxsJTg7CisJCQlsbC09cmVtOworCQkJaWYgKGZlb2YoREVTX0lOKSAmJiAobGwgPT0gMCkpCisJCQkJeworCQkJCWxhc3Q9b2J1ZltsLTFdOworCisJCQkJaWYgKChsYXN0ID4gNykgfHwgKGxhc3QgPCAwKSkKKwkJCQkJeworCQkJCQlmcHV0cygiVGhlIGZpbGUgd2FzIG5vdCBkZWNyeXB0ZWQgY29ycmVjdGx5LlxuIiwKKwkJCQkJCXN0ZGVycik7CisJCQkJCUV4aXQ9ODsKKwkJCQkJbGFzdD0wOworCQkJCQl9CisJCQkJbD1sLTgrbGFzdDsKKwkJCQl9CisJCQlpPTA7CisJCQlpZiAoY2ZsYWcpIERFU19jYmNfY2tzdW0ob2J1ZiwKKwkJCQkoREVTX2NibG9jayAqKWNrc3VtLChsb25nKWwvOCo4LCZrcywKKwkJCQkoREVTX2NibG9jayAqKWNrc3VtKTsKKwkJCXdoaWxlIChpICE9IGwpCisJCQkJeworCQkJCWo9ZndyaXRlKG9idWYsMSwodW5zaWduZWQgaW50KWwtaSxERVNfT1VUKTsKKwkJCQlpZiAoaiA9PSAtMSkKKwkJCQkJeworCQkJCQlwZXJyb3IoIldyaXRlIGVycm9yIik7CisJCQkJCUV4aXQ9NzsKKwkJCQkJZ290byBwcm9ibGVtczsKKwkJCQkJfQorCQkJCWkrPWo7CisJCQkJfQorCQkJbD1sbDsKKwkJCWlmICgobCA9PSAwKSAmJiBmZW9mKERFU19JTikpIGJyZWFrOworCQkJfQorCQl9CisJaWYgKGNmbGFnKQorCQl7CisJCWw9MDsKKwkJaWYgKGNrc3VtbmFtZVswXSAhPSAnXDAnKQorCQkJeworCQkJaWYgKChPPWZvcGVuKGNrc3VtbmFtZSwidyIpKSAhPSBOVUxMKQorCQkJCXsKKwkJCQlDS1NVTV9PVVQ9TzsKKwkJCQlsPTE7CisJCQkJfQorCQkJfQorCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCQlmcHJpbnRmKENLU1VNX09VVCwiJTAyWCIsY2tzdW1baV0pOworCQlmcHJpbnRmKENLU1VNX09VVCwiXG4iKTsKKwkJaWYgKGwpIGZjbG9zZShDS1NVTV9PVVQpOworCQl9Citwcm9ibGVtczoKKwlPUEVOU1NMX2NsZWFuc2UoYnVmLHNpemVvZihidWYpKTsKKwlPUEVOU1NMX2NsZWFuc2Uob2J1ZixzaXplb2Yob2J1ZikpOworCU9QRU5TU0xfY2xlYW5zZSgma3Msc2l6ZW9mKGtzKSk7CisJT1BFTlNTTF9jbGVhbnNlKCZrczIsc2l6ZW9mKGtzMikpOworCU9QRU5TU0xfY2xlYW5zZShpdixzaXplb2YoaXYpKTsKKwlPUEVOU1NMX2NsZWFuc2UoaXYyLHNpemVvZihpdjIpKTsKKwlPUEVOU1NMX2NsZWFuc2Uoa2ssc2l6ZW9mKGtrKSk7CisJT1BFTlNTTF9jbGVhbnNlKGsyLHNpemVvZihrMikpOworCU9QRU5TU0xfY2xlYW5zZSh1dWJ1ZixzaXplb2YodXVidWYpKTsKKwlPUEVOU1NMX2NsZWFuc2UoYixzaXplb2YoYikpOworCU9QRU5TU0xfY2xlYW5zZShiYixzaXplb2YoYmIpKTsKKwlPUEVOU1NMX2NsZWFuc2UoY2tzdW0sc2l6ZW9mKGNrc3VtKSk7CisJaWYgKEV4aXQpIEVYSVQoRXhpdCk7CisJfQorCisvKiAgICBXZSBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIgYnV0IGl0IHNob3VsZCBiZSA+IH41MCBJIGJlbGlldmUgICAgKi8KK2ludCB1dWZ3cml0ZSh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IG51bSwgRklMRSAqZnApCisJeworCWludCBpLGosbGVmdCxyZW0scmV0PW51bTsKKwlzdGF0aWMgaW50IHN0YXJ0PTE7CisKKwlpZiAoc3RhcnQpCisJCXsKKwkJZnByaW50ZihmcCwiYmVnaW4gNjAwICVzXG4iLAorCQkJKHV1bmFtZVswXSA9PSAnXDAnKT8idGV4dC5kIjp1dW5hbWUpOworCQlzdGFydD0wOworCQl9CisKKwlpZiAodXVidWZudW0pCisJCXsKKwkJaWYgKHV1YnVmbnVtK251bSA8IDQ1KQorCQkJeworCQkJbWVtY3B5KCYodXVidWZbdXVidWZudW1dKSxkYXRhLCh1bnNpZ25lZCBpbnQpbnVtKTsKKwkJCXV1YnVmbnVtKz1udW07CisJCQlyZXR1cm4obnVtKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaT00NS11dWJ1Zm51bTsKKwkJCW1lbWNweSgmKHV1YnVmW3V1YnVmbnVtXSksZGF0YSwodW5zaWduZWQgaW50KWkpOworCQkJaj11dWVuY29kZSgodW5zaWduZWQgY2hhciAqKXV1YnVmLDQ1LGIpOworCQkJZndyaXRlKGIsMSwodW5zaWduZWQgaW50KWosZnApOworCQkJdXVidWZudW09MDsKKwkJCWRhdGErPWk7CisJCQludW0tPWk7CisJCQl9CisJCX0KKworCWZvciAoaT0wOyBpPCgoKGludCludW0pLUlOVVVCVUZOKTsgaSs9SU5VVUJVRk4pCisJCXsKKwkJaj11dWVuY29kZSgmKGRhdGFbaV0pLElOVVVCVUZOLGIpOworCQlmd3JpdGUoYiwxLCh1bnNpZ25lZCBpbnQpaixmcCk7CisJCX0KKwlyZW09KG51bS1pKSU0NTsKKwlsZWZ0PShudW0taS1yZW0pOworCWlmIChsZWZ0KQorCQl7CisJCWo9dXVlbmNvZGUoJihkYXRhW2ldKSxsZWZ0LGIpOworCQlmd3JpdGUoYiwxLCh1bnNpZ25lZCBpbnQpaixmcCk7CisJCWkrPWxlZnQ7CisJCX0KKwlpZiAoaSAhPSBudW0pCisJCXsKKwkJbWVtY3B5KHV1YnVmLCYoZGF0YVtpXSksKHVuc2lnbmVkIGludClyZW0pOworCQl1dWJ1Zm51bT1yZW07CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3ZvaWQgdXVmd3JpdGVFbmQoRklMRSAqZnApCisJeworCWludCBqOworCXN0YXRpYyBjb25zdCBjaGFyICplbmQ9IiBcbmVuZFxuIjsKKworCWlmICh1dWJ1Zm51bSAhPSAwKQorCQl7CisJCXV1YnVmW3V1YnVmbnVtXT0nXDAnOworCQl1dWJ1Zlt1dWJ1Zm51bSsxXT0nXDAnOworCQl1dWJ1Zlt1dWJ1Zm51bSsyXT0nXDAnOworCQlqPXV1ZW5jb2RlKHV1YnVmLHV1YnVmbnVtLGIpOworCQlmd3JpdGUoYiwxLCh1bnNpZ25lZCBpbnQpaixmcCk7CisJCX0KKwlmd3JpdGUoZW5kLDEsc3RybGVuKGVuZCksZnApOworCX0KKworLyogaW50IHNpemU6ICBzaG91bGQgYWx3YXlzIGJlID4gfiA2MDsgSSBhY3R1YWxseSBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIgOi0pICAgICovCitpbnQgdXVmcmVhZCh1bnNpZ25lZCBjaGFyICpvdXQsIGludCBzaXplLCB1bnNpZ25lZCBpbnQgbnVtLCBGSUxFICpmcCkKKwl7CisJaW50IGksaix0b3Q7CisJc3RhdGljIGludCBkb25lPTA7CisJc3RhdGljIGludCB2YWxpZD0wOworCXN0YXRpYyBpbnQgc3RhcnQ9MTsKKworCWlmIChzdGFydCkKKwkJeworCQlmb3IgKDs7KQorCQkJeworCQkJYlswXT0nXDAnOworCQkJZmdldHMoKGNoYXIgKiliLDMwMCxmcCk7CisJCQlpZiAoYlswXSA9PSAnXDAnKQorCQkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwibm8gJ2JlZ2luJyBmb3VuZCBpbiB1dWVuY29kZWQgaW5wdXRcbiIpOworCQkJCXJldHVybigtMSk7CisJCQkJfQorCQkJaWYgKHN0cm5jbXAoKGNoYXIgKiliLCJiZWdpbiAiLDYpID09IDApIGJyZWFrOworCQkJfQorCQlzdGFydD0wOworCQl9CisJaWYgKGRvbmUpIHJldHVybigwKTsKKwl0b3Q9MDsKKwlpZiAodmFsaWQpCisJCXsKKwkJbWVtY3B5KG91dCxiYiwodW5zaWduZWQgaW50KXZhbGlkKTsKKwkJdG90PXZhbGlkOworCQl2YWxpZD0wOworCQl9CisJZm9yICg7OykKKwkJeworCQliWzBdPSdcMCc7CisJCWZnZXRzKChjaGFyICopYiwzMDAsZnApOworCQlpZiAoYlswXSA9PSAnXDAnKSBicmVhazsKKwkJaT1zdHJsZW4oKGNoYXIgKiliKTsKKwkJaWYgKChiWzBdID09ICdlJykgJiYgKGJbMV0gPT0gJ24nKSAmJiAoYlsyXSA9PSAnZCcpKQorCQkJeworCQkJZG9uZT0xOworCQkJd2hpbGUgKCFmZW9mKGZwKSkKKwkJCQl7CisJCQkJZmdldHMoKGNoYXIgKiliLDMwMCxmcCk7CisJCQkJfQorCQkJYnJlYWs7CisJCQl9CisJCWk9dXVkZWNvZGUoYixpLGJiKTsKKwkJaWYgKGkgPCAwKSBicmVhazsKKwkJaWYgKChpK3RvdCs4KSA+IG51bSkKKwkJCXsKKwkJCS8qIG51bSB0byBjb3B5IHRvIG1ha2UgaXQgYSBtdWx0aXBsZSBvZiA4ICovCisJCQlqPShudW0vOCo4KS10b3QtODsKKwkJCW1lbWNweSgmKG91dFt0b3RdKSxiYiwodW5zaWduZWQgaW50KWopOworCQkJdG90Kz1qOworCQkJbWVtY3B5KGJiLCYoYmJbal0pLCh1bnNpZ25lZCBpbnQpaS1qKTsKKwkJCXZhbGlkPWktajsKKwkJCWJyZWFrOworCQkJfQorCQltZW1jcHkoJihvdXRbdG90XSksYmIsKHVuc2lnbmVkIGludClpKTsKKwkJdG90Kz1pOworCQl9CisJcmV0dXJuKHRvdCk7CisJfQorCisjZGVmaW5lIGNjYzJsKGMsbCkgICAgICAobCA9KChERVNfTE9ORykoKigoYykrKykpKTw8MTYsIFwKKwkJCSBsfD0oKERFU19MT05HKSgqKChjKSsrKSkpPDwgOCwgXAorCQkgCSBsfD0oKERFU19MT05HKSgqKChjKSsrKSkpKQorCisjZGVmaW5lIGwyY2NjKGwsYykgICAgICAoKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjE2KSYweGZmKSwgXAorICAgICAgICAgICAgICAgICAgICAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+IDgpJjB4ZmYpLCBcCisgICAgICAgICAgICAgICAgICAgICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpICAgICkmMHhmZikpCisKKworaW50IHV1ZW5jb2RlKHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbnVtLCB1bnNpZ25lZCBjaGFyICpvdXQpCisJeworCWludCBqLGksbix0b3Q9MDsKKwlERVNfTE9ORyBsOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnA7CisJcD1vdXQ7CisKKwlmb3IgKGo9MDsgajxudW07IGorPTQ1KQorCQl7CisJCWlmIChqKzQ1ID4gbnVtKQorCQkJaT0obnVtLWopOworCQllbHNlCWk9NDU7CisJCSoocCsrKT1pKycgJzsKKwkJZm9yIChuPTA7IG48aTsgbis9MykKKwkJCXsKKwkJCWNjYzJsKGluLGwpOworCQkJKihwKyspPSgobD4+MTgpJjB4M2YpKycgJzsKKwkJCSoocCsrKT0oKGw+PjEyKSYweDNmKSsnICc7CisJCQkqKHArKyk9KChsPj4gNikmMHgzZikrJyAnOworCQkJKihwKyspPSgobCAgICApJjB4M2YpKycgJzsKKwkJCXRvdCs9NDsKKwkJCX0KKwkJKihwKyspPSdcbic7CisJCXRvdCs9MjsKKwkJfQorCSpwPSdcMCc7CisJbD0wOworCXJldHVybih0b3QpOworCX0KKworaW50IHV1ZGVjb2RlKHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbnVtLCB1bnNpZ25lZCBjaGFyICpvdXQpCisJeworCWludCBqLGksazsKKwl1bnNpZ25lZCBpbnQgbj0wLHNwYWNlPTA7CisJREVTX0xPTkcgbDsKKwlERVNfTE9ORyB3LHgseSx6OworCXVuc2lnbmVkIGludCBibGFuaz0odW5zaWduZWQgaW50KSdcbictJyAnOworCisJZm9yIChqPTA7IGo8bnVtOyApCisJCXsKKwkJbj0gKihpbisrKS0nICc7CisJCWlmIChuID09IGJsYW5rKQorCQkJeworCQkJbj0wOworCQkJaW4tLTsKKwkJCX0KKwkJaWYgKG4gPiA2MCkKKwkJCXsKKwkJCWZwcmludGYoc3RkZXJyLCJ1dWVuY29kZWQgbGluZSBsZW5ndGggdG9vIGxvbmdcbiIpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJaisrOworCisJCWZvciAoaT0wOyBpPG47IGorPTQsaSs9MykKKwkJCXsKKwkJCS8qIHRoZSBmb2xsb3dpbmcgaXMgZm9yIGNhc2VzIHdoZXJlIHNwYWNlcyBhcmUKKwkJCSAqIHJlbW92ZWQgZnJvbSBsaW5lcy4KKwkJCSAqLworCQkJaWYgKHNwYWNlKQorCQkJCXsKKwkJCQl3PXg9eT16PTA7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQl3PSAqKGluKyspLScgJzsKKwkJCQl4PSAqKGluKyspLScgJzsKKwkJCQl5PSAqKGluKyspLScgJzsKKwkJCQl6PSAqKGluKyspLScgJzsKKwkJCQl9CisJCQlpZiAoKHcgPiA2MykgfHwgKHggPiA2MykgfHwgKHkgPiA2MykgfHwgKHogPiA2MykpCisJCQkJeworCQkJCWs9MDsKKwkJCQlpZiAodyA9PSBibGFuaykgaz0xOworCQkJCWlmICh4ID09IGJsYW5rKSBrPTI7CisJCQkJaWYgKHkgPT0gYmxhbmspIGs9MzsKKwkJCQlpZiAoeiA9PSBibGFuaykgaz00OworCQkJCXNwYWNlPTE7CisJCQkJc3dpdGNoIChrKSB7CisJCQkJY2FzZSAxOgl3PTA7IGluLS07CisJCQkJY2FzZSAyOiB4PTA7IGluLS07CisJCQkJY2FzZSAzOiB5PTA7IGluLS07CisJCQkJY2FzZSA0OiB6PTA7IGluLS07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMDoKKwkJCQkJc3BhY2U9MDsKKwkJCQkJZnByaW50ZihzdGRlcnIsImJhZCB1dWVuY29kZWQgZGF0YSB2YWx1ZXNcbiIpOworCQkJCQl3PXg9eT16PTA7CisJCQkJCXJldHVybigtMSk7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJbD0odzw8MTgpfCh4PDwxMil8KHk8PCA2KXwoeiAgICApOworCQkJbDJjY2MobCxvdXQpOworCQkJfQorCQlpZiAoKihpbisrKSAhPSAnXG4nKQorCQkJeworCQkJZnByaW50ZihzdGRlcnIsIm1pc3NpbmcgbmwgaW4gdXVlbmNvZGVkIGxpbmVcbiIpOworCQkJdz14PXk9ej0wOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJaisrOworCQl9CisJKm91dD0nXDAnOworCXc9eD15PXo9MDsKKwlyZXR1cm4obik7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXMuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNjY2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzLmgKQEAgLTAsMCArMSwyNDUgQEAKKy8qIGNyeXB0by9kZXMvZGVzLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfTkVXX0RFU19ICisjZGVmaW5lIEhFQURFUl9ORVdfREVTX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4JLyogT1BFTlNTTF9FWFRFUk4sIE9QRU5TU0xfTk9fREVTLAorCQkJCSAgIERFU19MT05HICh2aWEgb3BlbnNzbC9vcGVuc3NsY29uZi5oICovCisKKyNpZmRlZiBPUEVOU1NMX05PX0RFUworI2Vycm9yIERFUyBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTworIyB1bmRlZiBPUEVOU1NMX0VYVEVSTgorIyBkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9FWFBPUlQKKyNlbmRpZgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgREVTX2NibG9ja1s4XTsKK3R5cGVkZWYgLyogY29uc3QgKi8gdW5zaWduZWQgY2hhciBjb25zdF9ERVNfY2Jsb2NrWzhdOworLyogV2l0aCAiY29uc3QiLCBnY2MgMi44LjEgb24gU29sYXJpcyB0aGlua3MgdGhhdCBERVNfY2Jsb2NrICoKKyAqIGFuZCBjb25zdF9ERVNfY2Jsb2NrICogYXJlIGluY29tcGF0aWJsZSBwb2ludGVyIHR5cGVzLiAqLworCit0eXBlZGVmIHN0cnVjdCBERVNfa3MKKyAgICB7CisgICAgdW5pb24KKwl7CisJREVTX2NibG9jayBjYmxvY2s7CisJLyogbWFrZSBzdXJlIHRoaW5ncyBhcmUgY29ycmVjdCBzaXplIG9uIG1hY2hpbmVzIHdpdGgKKwkgKiA4IGJ5dGUgbG9uZ3MgKi8KKwlERVNfTE9ORyBkZXNsb25nWzJdOworCX0ga3NbMTZdOworICAgIH0gREVTX2tleV9zY2hlZHVsZTsKKworI2lmbmRlZiBPUEVOU1NMX0RJU0FCTEVfT0xEX0RFU19TVVBQT1JUCisjIGlmbmRlZiBPUEVOU1NMX0VOQUJMRV9PTERfREVTX1NVUFBPUlQKKyMgIGRlZmluZSBPUEVOU1NMX0VOQUJMRV9PTERfREVTX1NVUFBPUlQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9FTkFCTEVfT0xEX0RFU19TVVBQT1JUCisjIGluY2x1ZGUgPG9wZW5zc2wvZGVzX29sZC5oPgorI2VuZGlmCisKKyNkZWZpbmUgREVTX0tFWV9TWiAJKHNpemVvZihERVNfY2Jsb2NrKSkKKyNkZWZpbmUgREVTX1NDSEVEVUxFX1NaIChzaXplb2YoREVTX2tleV9zY2hlZHVsZSkpCisKKyNkZWZpbmUgREVTX0VOQ1JZUFQJMQorI2RlZmluZSBERVNfREVDUllQVAkwCisKKyNkZWZpbmUgREVTX0NCQ19NT0RFCTAKKyNkZWZpbmUgREVTX1BDQkNfTU9ERQkxCisKKyNkZWZpbmUgREVTX2VjYjJfZW5jcnlwdChpLG8sazEsazIsZSkgXAorCURFU19lY2IzX2VuY3J5cHQoKGkpLChvKSwoazEpLChrMiksKGsxKSwoZSkpCisKKyNkZWZpbmUgREVTX2VkZTJfY2JjX2VuY3J5cHQoaSxvLGwsazEsazIsaXYsZSkgXAorCURFU19lZGUzX2NiY19lbmNyeXB0KChpKSwobyksKGwpLChrMSksKGsyKSwoazEpLChpdiksKGUpKQorCisjZGVmaW5lIERFU19lZGUyX2NmYjY0X2VuY3J5cHQoaSxvLGwsazEsazIsaXYsbixlKSBcCisJREVTX2VkZTNfY2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwoazEpLChrMiksKGsxKSwoaXYpLChuKSwoZSkpCisKKyNkZWZpbmUgREVTX2VkZTJfb2ZiNjRfZW5jcnlwdChpLG8sbCxrMSxrMixpdixuKSBcCisJREVTX2VkZTNfb2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwoazEpLChrMiksKGsxKSwoaXYpLChuKSkKKworT1BFTlNTTF9ERUNMQVJFX0dMT0JBTChpbnQsREVTX2NoZWNrX2tleSk7CS8qIGRlZmF1bHRzIHRvIGZhbHNlICovCisjZGVmaW5lIERFU19jaGVja19rZXkgT1BFTlNTTF9HTE9CQUxfUkVGKERFU19jaGVja19rZXkpCitPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKGludCxERVNfcndfbW9kZSk7CS8qIGRlZmF1bHRzIHRvIERFU19QQ0JDX01PREUgKi8KKyNkZWZpbmUgREVTX3J3X21vZGUgT1BFTlNTTF9HTE9CQUxfUkVGKERFU19yd19tb2RlKQorCitjb25zdCBjaGFyICpERVNfb3B0aW9ucyh2b2lkKTsKK3ZvaWQgREVTX2VjYjNfZW5jcnlwdChjb25zdF9ERVNfY2Jsb2NrICppbnB1dCwgREVTX2NibG9jayAqb3V0cHV0LAorCQkgICAgICBERVNfa2V5X3NjaGVkdWxlICprczEsREVTX2tleV9zY2hlZHVsZSAqa3MyLAorCQkgICAgICBERVNfa2V5X3NjaGVkdWxlICprczMsIGludCBlbmMpOworREVTX0xPTkcgREVTX2NiY19ja3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCxERVNfY2Jsb2NrICpvdXRwdXQsCisJCSAgICAgICBsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSwKKwkJICAgICAgIGNvbnN0X0RFU19jYmxvY2sgKml2ZWMpOworLyogREVTX2NiY19lbmNyeXB0IGRvZXMgbm90IHVwZGF0ZSB0aGUgSVYhICBVc2UgREVTX25jYmNfZW5jcnlwdCBpbnN0ZWFkLiAqLwordm9pZCBERVNfY2JjX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsdW5zaWduZWQgY2hhciAqb3V0cHV0LAorCQkgICAgIGxvbmcgbGVuZ3RoLERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLERFU19jYmxvY2sgKml2ZWMsCisJCSAgICAgaW50IGVuYyk7Cit2b2lkIERFU19uY2JjX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsdW5zaWduZWQgY2hhciAqb3V0cHV0LAorCQkgICAgICBsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSxERVNfY2Jsb2NrICppdmVjLAorCQkgICAgICBpbnQgZW5jKTsKK3ZvaWQgREVTX3hjYmNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCx1bnNpZ25lZCBjaGFyICpvdXRwdXQsCisJCSAgICAgIGxvbmcgbGVuZ3RoLERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLERFU19jYmxvY2sgKml2ZWMsCisJCSAgICAgIGNvbnN0X0RFU19jYmxvY2sgKmludyxjb25zdF9ERVNfY2Jsb2NrICpvdXR3LGludCBlbmMpOwordm9pZCBERVNfY2ZiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sdW5zaWduZWQgY2hhciAqb3V0LGludCBudW1iaXRzLAorCQkgICAgIGxvbmcgbGVuZ3RoLERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLERFU19jYmxvY2sgKml2ZWMsCisJCSAgICAgaW50IGVuYyk7Cit2b2lkIERFU19lY2JfZW5jcnlwdChjb25zdF9ERVNfY2Jsb2NrICppbnB1dCxERVNfY2Jsb2NrICpvdXRwdXQsCisJCSAgICAgREVTX2tleV9zY2hlZHVsZSAqa3MsaW50IGVuYyk7CisKKy8qIAlUaGlzIGlzIHRoZSBERVMgZW5jcnlwdGlvbiBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGJ5IGp1c3QgYWJvdXQKKwlldmVyeSBvdGhlciBERVMgcm91dGluZSBpbiB0aGUgbGlicmFyeS4gIFlvdSBzaG91bGQgbm90IHVzZSB0aGlzCisJZnVuY3Rpb24gZXhjZXB0IHRvIGltcGxlbWVudCAnbW9kZXMnIG9mIERFUy4gIEkgc2F5IHRoaXMgYmVjYXVzZSB0aGUKKwlmdW5jdGlvbnMgdGhhdCBjYWxsIHRoaXMgcm91dGluZSBkbyB0aGUgY29udmVyc2lvbiBmcm9tICdjaGFyIConIHRvCisJbG9uZywgYW5kIHRoaXMgbmVlZHMgdG8gYmUgZG9uZSB0byBtYWtlIHN1cmUgJ25vbi1hbGlnbmVkJyBtZW1vcnkKKwlhY2Nlc3MgZG8gbm90IG9jY3VyLiAgVGhlIGNoYXJhY3RlcnMgYXJlIGxvYWRlZCAnbGl0dGxlIGVuZGlhbicuCisJRGF0YSBpcyBhIHBvaW50ZXIgdG8gMiB1bnNpZ25lZCBsb25nJ3MgYW5kIGtzIGlzIHRoZQorCURFU19rZXlfc2NoZWR1bGUgdG8gdXNlLiAgZW5jLCBpcyBub24gemVybyBzcGVjaWZpZXMgZW5jcnlwdGlvbiwKKwl6ZXJvIGlmIGRlY3J5cHRpb24uICovCit2b2lkIERFU19lbmNyeXB0MShERVNfTE9ORyAqZGF0YSxERVNfa2V5X3NjaGVkdWxlICprcywgaW50IGVuYyk7CisKKy8qIAlUaGlzIGZ1bmN0aW9ucyBpcyB0aGUgc2FtZSBhcyBERVNfZW5jcnlwdDEoKSBleGNlcHQgdGhhdCB0aGUgREVTCisJaW5pdGlhbCBwZXJtdXRhdGlvbiAoSVApIGFuZCBmaW5hbCBwZXJtdXRhdGlvbiAoRlApIGhhdmUgYmVlbiBsZWZ0CisJb3V0LiAgQXMgZm9yIERFU19lbmNyeXB0MSgpLCB5b3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmdW5jdGlvbi4KKwlJdCBpcyB1c2VkIGJ5IHRoZSByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0aGF0IGltcGxlbWVudCB0cmlwbGUgREVTLgorCUlQKCkgREVTX2VuY3J5cHQyKCkgREVTX2VuY3J5cHQyKCkgREVTX2VuY3J5cHQyKCkgRlAoKSBpcyB0aGUgc2FtZQorCWFzIERFU19lbmNyeXB0MSgpIERFU19lbmNyeXB0MSgpIERFU19lbmNyeXB0MSgpIGV4Y2VwdCBmYXN0ZXIgOi0pLiAqLwordm9pZCBERVNfZW5jcnlwdDIoREVTX0xPTkcgKmRhdGEsREVTX2tleV9zY2hlZHVsZSAqa3MsIGludCBlbmMpOworCit2b2lkIERFU19lbmNyeXB0MyhERVNfTE9ORyAqZGF0YSwgREVTX2tleV9zY2hlZHVsZSAqa3MxLAorCQkgIERFU19rZXlfc2NoZWR1bGUgKmtzMiwgREVTX2tleV9zY2hlZHVsZSAqa3MzKTsKK3ZvaWQgREVTX2RlY3J5cHQzKERFU19MT05HICpkYXRhLCBERVNfa2V5X3NjaGVkdWxlICprczEsCisJCSAgREVTX2tleV9zY2hlZHVsZSAqa3MyLCBERVNfa2V5X3NjaGVkdWxlICprczMpOwordm9pZCBERVNfZWRlM19jYmNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCx1bnNpZ25lZCBjaGFyICpvdXRwdXQsIAorCQkJICBsb25nIGxlbmd0aCwKKwkJCSAgREVTX2tleV9zY2hlZHVsZSAqa3MxLERFU19rZXlfc2NoZWR1bGUgKmtzMiwKKwkJCSAgREVTX2tleV9zY2hlZHVsZSAqa3MzLERFU19jYmxvY2sgKml2ZWMsaW50IGVuYyk7Cit2b2lkIERFU19lZGUzX2NiY21fZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgICBsb25nIGxlbmd0aCwKKwkJCSAgIERFU19rZXlfc2NoZWR1bGUgKmtzMSxERVNfa2V5X3NjaGVkdWxlICprczIsCisJCQkgICBERVNfa2V5X3NjaGVkdWxlICprczMsCisJCQkgICBERVNfY2Jsb2NrICppdmVjMSxERVNfY2Jsb2NrICppdmVjMiwKKwkJCSAgIGludCBlbmMpOwordm9pZCBERVNfZWRlM19jZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCSAgICBsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICprczEsCisJCQkgICAgREVTX2tleV9zY2hlZHVsZSAqa3MyLERFU19rZXlfc2NoZWR1bGUgKmtzMywKKwkJCSAgICBERVNfY2Jsb2NrICppdmVjLGludCAqbnVtLGludCBlbmMpOwordm9pZCBERVNfZWRlM19jZmJfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgIGludCBudW1iaXRzLGxvbmcgbGVuZ3RoLERFU19rZXlfc2NoZWR1bGUgKmtzMSwKKwkJCSAgREVTX2tleV9zY2hlZHVsZSAqa3MyLERFU19rZXlfc2NoZWR1bGUgKmtzMywKKwkJCSAgREVTX2NibG9jayAqaXZlYyxpbnQgZW5jKTsKK3ZvaWQgREVTX2VkZTNfb2ZiNjRfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgICAgbG9uZyBsZW5ndGgsREVTX2tleV9zY2hlZHVsZSAqa3MxLAorCQkJICAgIERFU19rZXlfc2NoZWR1bGUgKmtzMixERVNfa2V5X3NjaGVkdWxlICprczMsCisJCQkgICAgREVTX2NibG9jayAqaXZlYyxpbnQgKm51bSk7CisjaWYgMAordm9pZCBERVNfeHdoaXRlX2luMm91dChjb25zdF9ERVNfY2Jsb2NrICpERVNfa2V5LGNvbnN0X0RFU19jYmxvY2sgKmluX3doaXRlLAorCQkgICAgICAgREVTX2NibG9jayAqb3V0X3doaXRlKTsKKyNlbmRpZgorCitpbnQgREVTX2VuY19yZWFkKGludCBmZCx2b2lkICpidWYsaW50IGxlbixERVNfa2V5X3NjaGVkdWxlICpzY2hlZCwKKwkJIERFU19jYmxvY2sgKml2KTsKK2ludCBERVNfZW5jX3dyaXRlKGludCBmZCxjb25zdCB2b2lkICpidWYsaW50IGxlbixERVNfa2V5X3NjaGVkdWxlICpzY2hlZCwKKwkJICBERVNfY2Jsb2NrICppdik7CitjaGFyICpERVNfZmNyeXB0KGNvbnN0IGNoYXIgKmJ1Zixjb25zdCBjaGFyICpzYWx0LCBjaGFyICpyZXQpOworY2hhciAqREVTX2NyeXB0KGNvbnN0IGNoYXIgKmJ1Zixjb25zdCBjaGFyICpzYWx0KTsKK3ZvaWQgREVTX29mYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgbnVtYml0cywKKwkJICAgICBsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSxERVNfY2Jsb2NrICppdmVjKTsKK3ZvaWQgREVTX3BjYmNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCx1bnNpZ25lZCBjaGFyICpvdXRwdXQsCisJCSAgICAgIGxvbmcgbGVuZ3RoLERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLERFU19jYmxvY2sgKml2ZWMsCisJCSAgICAgIGludCBlbmMpOworREVTX0xPTkcgREVTX3F1YWRfY2tzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsREVTX2NibG9jayBvdXRwdXRbXSwKKwkJCWxvbmcgbGVuZ3RoLGludCBvdXRfY291bnQsREVTX2NibG9jayAqc2VlZCk7CitpbnQgREVTX3JhbmRvbV9rZXkoREVTX2NibG9jayAqcmV0KTsKK3ZvaWQgREVTX3NldF9vZGRfcGFyaXR5KERFU19jYmxvY2sgKmtleSk7CitpbnQgREVTX2NoZWNrX2tleV9wYXJpdHkoY29uc3RfREVTX2NibG9jayAqa2V5KTsKK2ludCBERVNfaXNfd2Vha19rZXkoY29uc3RfREVTX2NibG9jayAqa2V5KTsKKy8qIERFU19zZXRfa2V5ICg9IHNldF9rZXkgPSBERVNfa2V5X3NjaGVkID0ga2V5X3NjaGVkKSBjYWxscworICogREVTX3NldF9rZXlfY2hlY2tlZCBpZiBnbG9iYWwgdmFyaWFibGUgREVTX2NoZWNrX2tleSBpcyBzZXQsCisgKiBERVNfc2V0X2tleV91bmNoZWNrZWQgb3RoZXJ3aXNlLiAqLworaW50IERFU19zZXRfa2V5KGNvbnN0X0RFU19jYmxvY2sgKmtleSxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSk7CitpbnQgREVTX2tleV9zY2hlZChjb25zdF9ERVNfY2Jsb2NrICprZXksREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUpOworaW50IERFU19zZXRfa2V5X2NoZWNrZWQoY29uc3RfREVTX2NibG9jayAqa2V5LERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlKTsKK3ZvaWQgREVTX3NldF9rZXlfdW5jaGVja2VkKGNvbnN0X0RFU19jYmxvY2sgKmtleSxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSk7Cit2b2lkIERFU19zdHJpbmdfdG9fa2V5KGNvbnN0IGNoYXIgKnN0cixERVNfY2Jsb2NrICprZXkpOwordm9pZCBERVNfc3RyaW5nX3RvXzJrZXlzKGNvbnN0IGNoYXIgKnN0cixERVNfY2Jsb2NrICprZXkxLERFU19jYmxvY2sgKmtleTIpOwordm9pZCBERVNfY2ZiNjRfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsbG9uZyBsZW5ndGgsCisJCSAgICAgICBERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSxERVNfY2Jsb2NrICppdmVjLGludCAqbnVtLAorCQkgICAgICAgaW50IGVuYyk7Cit2b2lkIERFU19vZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLHVuc2lnbmVkIGNoYXIgKm91dCxsb25nIGxlbmd0aCwKKwkJICAgICAgIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLERFU19jYmxvY2sgKml2ZWMsaW50ICpudW0pOworCitpbnQgREVTX3JlYWRfcGFzc3dvcmQoREVTX2NibG9jayAqa2V5LCBjb25zdCBjaGFyICpwcm9tcHQsIGludCB2ZXJpZnkpOworaW50IERFU19yZWFkXzJwYXNzd29yZHMoREVTX2NibG9jayAqa2V5MSwgREVTX2NibG9jayAqa2V5MiwgY29uc3QgY2hhciAqcHJvbXB0LAorCWludCB2ZXJpZnkpOworCisjZGVmaW5lIERFU19maXh1cF9rZXlfcGFyaXR5IERFU19zZXRfb2RkX3Bhcml0eQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlcy5wb2QgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlcy5wb2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0NzllOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzLnBvZApAQCAtMCwwICsxLDIxNyBAQAorPXBvZAorCis9aGVhZDEgTkFNRQorCitkZXMgLSBlbmNyeXB0IG9yIGRlY3J5cHQgZGF0YSB1c2luZyBEYXRhIEVuY3J5cHRpb24gU3RhbmRhcmQKKworPWhlYWQxIFNZTk9QU0lTCisKK0I8ZGVzPgorKAorQjwtZT4KK3wKK0I8LUU+CispIHwgKAorQjwtZD4KK3wKK0I8LUQ+CispIHwgKAorQjwtPltCPGNDPl1bQjxja25hbWU+XQorKSB8CitbCitCPC1iM2hmcz4KK10gWworQjwtaz4KK0k8a2V5PgorXQorXSBbCitCPC11PltJPHV1bmFtZT5dCitbCitJPGlucHV0LWZpbGU+CitbCitJPG91dHB1dC1maWxlPgorXSBdCisKKz1oZWFkMSBOT1RFCisKK1RoaXMgcGFnZSBkZXNjcmliZXMgdGhlIEI8ZGVzPiBzdGFuZC1hbG9uZSBwcm9ncmFtLCBub3QgdGhlIEI8b3BlbnNzbCBkZXM+Citjb21tYW5kLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQjxkZXM+CitlbmNyeXB0cyBhbmQgZGVjcnlwdHMgZGF0YSB1c2luZyB0aGUKK0RhdGEgRW5jcnlwdGlvbiBTdGFuZGFyZCBhbGdvcml0aG0uCitPbmUgb2YKK0I8LWU+LCBCPC1FPgorKGZvciBlbmNyeXB0KSBvcgorQjwtZD4sIEI8LUQ+CisoZm9yIGRlY3J5cHQpIG11c3QgYmUgc3BlY2lmaWVkLgorSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKK0I8LWM+CitvcgorQjwtQz4KK2luIGNvbmp1bmN0aW9uIG9yIGluc3RlYWQgb2YgdGhlIGEgZW5jcnlwdC9kZWNyeXB0IG9wdGlvbiB0byBnZW5lcmF0ZQorYSAxNiBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgY2hlY2tzdW0sIGdlbmVyYXRlZCB2aWEgdGhlCitJPGRlc19jYmNfY2tzdW0+LgorCitUd28gc3RhbmRhcmQgZW5jcnlwdGlvbiBtb2RlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoZQorQjxkZXM+Citwcm9ncmFtLCBDaXBoZXIgQmxvY2sgQ2hhaW5pbmcgKHRoZSBkZWZhdWx0KSBhbmQgRWxlY3Ryb25pYyBDb2RlIEJvb2sKKyhzcGVjaWZpZWQgd2l0aAorQjwtYj4pLgorCitUaGUga2V5IHVzZWQgZm9yIHRoZSBERVMKK2FsZ29yaXRobSBpcyBvYnRhaW5lZCBieSBwcm9tcHRpbmcgdGhlIHVzZXIgdW5sZXNzIHRoZQorQjwtaz4KK0k8a2V5Pgorb3B0aW9uIGlzIGdpdmVuLgorSWYgdGhlIGtleSBpcyBhbiBhcmd1bWVudCB0byB0aGUKK0I8ZGVzPgorY29tbWFuZCwgaXQgaXMgcG90ZW50aWFsbHkgdmlzaWJsZSB0byB1c2VycyBleGVjdXRpbmcKK3BzKDEpCitvciBhIGRlcml2YXRpdmUuICBUbyBtaW5pbWlzZSB0aGlzIHBvc3NpYmlsaXR5LAorQjxkZXM+Cit0YWtlcyBjYXJlIHRvIGRlc3Ryb3kgdGhlIGtleSBhcmd1bWVudCBpbW1lZGlhdGVseSB1cG9uIGVudHJ5LgorSWYgeW91ciBzaGVsbCBrZWVwcyBhIGhpc3RvcnkgZmlsZSBiZSBjYXJlZnVsIHRvIG1ha2Ugc3VyZSBpdCBpcyBub3QKK3dvcmxkIHJlYWRhYmxlLgorCitTaW5jZSB0aGlzIHByb2dyYW0gYXR0ZW1wdHMgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIHN1bk9TJ3MKK2RlcygxKSBjb21tYW5kLCB0aGVyZSBhcmUgMiBkaWZmZXJlbnQgbWV0aG9kcyB1c2VkIHRvIGNvbnZlcnQgdGhlIHVzZXIKK3N1cHBsaWVkIGtleSB0byBhIGRlcyBrZXkuCitXaGVuZXZlciBhbmQgb25lIG9yIG1vcmUgb2YKK0I8LUU+LCBCPC1EPiwgQjwtQz4KK29yCitCPC0zPgorb3B0aW9ucyBhcmUgdXNlZCwgdGhlIGtleSBjb252ZXJzaW9uIHByb2NlZHVyZSB3aWxsIG5vdCBiZSBjb21wYXRpYmxlCit3aXRoIHRoZSBzdW5PUyBkZXMoMSkgdmVyc2lvbiBidXQgd2lsbCB1c2UgYWxsIHRoZSB1c2VyIHN1cHBsaWVkCitjaGFyYWN0ZXIgdG8gZ2VuZXJhdGUgdGhlIGRlcyBrZXkuCitCPGRlcz4KK2NvbW1hbmQgcmVhZHMgZnJvbSBzdGFuZGFyZCBpbnB1dCB1bmxlc3MKK0k8aW5wdXQtZmlsZT4KK2lzIHNwZWNpZmllZCBhbmQgd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dCB1bmxlc3MKK0k8b3V0cHV0LWZpbGU+CitpcyBnaXZlbi4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIgNAorCis9aXRlbSBCPC1iPgorCitTZWxlY3QgRUNCCisoZWlnaHQgYnl0ZXMgYXQgYSB0aW1lKSBlbmNyeXB0aW9uIG1vZGUuCisKKz1pdGVtIEI8LTM+CisKK0VuY3J5cHQgdXNpbmcgdHJpcGxlIGVuY3J5cHRpb24uCitCeSBkZWZhdWx0IHRyaXBsZSBjYmMgZW5jcnlwdGlvbiBpcyB1c2VkIGJ1dCBpZiB0aGUKK0I8LWI+CitvcHRpb24gaXMgdXNlZCB0aGVuIHRyaXBsZSBFQ0IgZW5jcnlwdGlvbiBpcyBwZXJmb3JtZWQuCitJZiB0aGUga2V5IGlzIGxlc3MgdGhhbiA4IGNoYXJhY3RlcnMgbG9uZywgdGhlIGZsYWcgaGFzIG5vIGVmZmVjdC4KKworPWl0ZW0gQjwtZT4KKworRW5jcnlwdCBkYXRhIHVzaW5nIGFuIDggYnl0ZSBrZXkgaW4gYSBtYW5uZXIgY29tcGF0aWJsZSB3aXRoIHN1bk9TCitkZXMoMSkuCisKKz1pdGVtIEI8LUU+CisKK0VuY3J5cHQgZGF0YSB1c2luZyBhIGtleSBvZiBuZWFybHkgdW5saW1pdGVkIGxlbmd0aCAoMTAyNCBieXRlcykuCitUaGlzIHdpbGwgcHJvZHVjdCBhIG1vcmUgc2VjdXJlIGVuY3J5cHRpb24uCisKKz1pdGVtIEI8LWQ+CisKK0RlY3J5cHQgZGF0YSB0aGF0IHdhcyBlbmNyeXB0ZWQgd2l0aCB0aGUgQjwtZT4gb3B0aW9uLgorCis9aXRlbSBCPC1EPgorCitEZWNyeXB0IGRhdGEgdGhhdCB3YXMgZW5jcnlwdGVkIHdpdGggdGhlIEI8LUU+IG9wdGlvbi4KKworPWl0ZW0gQjwtYz4KKworR2VuZXJhdGUgYSAxNiBjaGFyYWN0ZXIgaGV4YWRlY2ltYWwgY2JjIGNoZWNrc3VtIGFuZCBvdXRwdXQgdGhpcyB0bworc3RkZXJyLgorSWYgYSBmaWxlbmFtZSB3YXMgc3BlY2lmaWVkIGFmdGVyIHRoZQorQjwtYz4KK29wdGlvbiwgdGhlIGNoZWNrc3VtIGlzIG91dHB1dCB0byB0aGF0IGZpbGUuCitUaGUgY2hlY2tzdW0gaXMgZ2VuZXJhdGVkIHVzaW5nIGEga2V5IGdlbmVyYXRlZCBpbiBhIHN1bk9TIGNvbXBhdGlibGUKK21hbm5lci4KKworPWl0ZW0gQjwtQz4KKworQSBjYmMgY2hlY2tzdW0gaXMgZ2VuZXJhdGVkIGluIHRoZSBzYW1lIG1hbm5lciBhcyBkZXNjcmliZWQgZm9yIHRoZQorQjwtYz4KK29wdGlvbiBidXQgdGhlIERFUyBrZXkgaXMgZ2VuZXJhdGVkIGluIHRoZSBzYW1lIG1hbm5lciBhcyB1c2VkIGZvciB0aGUKK0I8LUU+CithbmQKK0I8LUQ+CitvcHRpb25zCisKKz1pdGVtIEI8LWY+CisKK0RvZXMgbm90aGluZyAtIGFsbG93ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBzdW5PUyBkZXMoMSkgY29tbWFuZC4KKworPWl0ZW0gQjwtcz4KKworRG9lcyBub3RoaW5nIC0gYWxsb3dlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHN1bk9TIGRlcygxKSBjb21tYW5kLgorCis9aXRlbSBCPC1rPiBJPGtleT4KKworVXNlIHRoZSBlbmNyeXB0aW9uIAorSTxrZXk+CitzcGVjaWZpZWQuCisKKz1pdGVtIEI8LWg+CisKK1RoZQorSTxrZXk+CitpcyBhc3N1bWVkIHRvIGJlIGEgMTYgY2hhcmFjdGVyIGhleGFkZWNpbWFsIG51bWJlci4KK0lmIHRoZQorQjwtMz4KK29wdGlvbiBpcyB1c2VkIHRoZSBrZXkgaXMgYXNzdW1lZCB0byBiZSBhIDMyIGNoYXJhY3RlciBoZXhhZGVjaW1hbAorbnVtYmVyLgorCis9aXRlbSBCPC11PgorCitUaGlzIGZsYWcgaXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSB1dWVuY29kZWQgZmlsZXMuICBJZiBkZWNyeXB0aW5nLAordGhlIGlucHV0IGZpbGUgaXMgYXNzdW1lZCB0byBjb250YWluIHV1ZW5jb2RlZCwgREVTIGVuY3J5cHRlZCBkYXRhLgorSWYgZW5jcnlwdGluZywgdGhlIGNoYXJhY3RlcnMgZm9sbG93aW5nIHRoZSBCPC11PiBhcmUgdXNlZCBhcyB0aGUgbmFtZSBvZgordGhlIHV1ZW5jb2RlZCBmaWxlIHRvIGVtYmVkIGluIHRoZSBiZWdpbiBsaW5lIG9mIHRoZSB1dWVuY29kZWQKK291dHB1dC4gIElmIHRoZXJlIGlzIG5vIG5hbWUgc3BlY2lmaWVkIGFmdGVyIHRoZSBCPC11PiwgdGhlIG5hbWUgdGV4dC5kZXMKK3dpbGwgYmUgZW1iZWRkZWQgaW4gdGhlIGhlYWRlci4KKworPWhlYWQxIFNFRSBBTFNPCisKK3BzKDEpLAorTDxkZXNfY3J5cHQoMyl8ZGVzX2NyeXB0KDMpPgorCis9aGVhZDEgQlVHUworCitUaGUgcHJvYmxlbSB3aXRoIHVzaW5nIHRoZQorQjwtZT4KK29wdGlvbiBpcyB0aGUgc2hvcnQga2V5IGxlbmd0aC4KK0l0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgYSByZWFsIDU2LWJpdCBrZXkgcmF0aGVyIHRoYW4gYW4KK0FTQ0lJLWJhc2VkIDU2LWJpdCBwYXR0ZXJuLiAgS25vd2luZyB0aGF0IHRoZSBrZXkgd2FzIGRlcml2ZWQgZnJvbSBBU0NJSQorcmFkaWNhbGx5IHJlZHVjZXMgdGhlIHRpbWUgbmVjZXNzYXJ5IGZvciBhIGJydXRlLWZvcmNlIGNyeXB0b2dyYXBoaWMgYXR0YWNrLgorTXkgYXR0ZW1wdCB0byByZW1vdmUgdGhpcyBwcm9ibGVtIGlzIHRvIGFkZCBhbiBhbHRlcm5hdGl2ZSB0ZXh0LWtleSB0bworREVTLWtleSBmdW5jdGlvbi4gIFRoaXMgYWx0ZXJuYXRpdmUgZnVuY3Rpb24gKGFjY2Vzc2VkIHZpYQorQjwtRT4sIEI8LUQ+LCBCPC1TPgorYW5kCitCPC0zPikKK3VzZXMgREVTIHRvIGhlbHAgZ2VuZXJhdGUgdGhlIGtleS4KKworQmUgY2FyZWZ1bGx5IHdoZW4gdXNpbmcgdGhlIEI8LXU+IG9wdGlvbi4gIERvaW5nIEI8ZGVzIC11ZD4gSTxmaWxlbmFtZT4gd2lsbAorbm90IGRlY3J5cHQgZmlsZW5hbWUgKHRoZSBCPC11PiBvcHRpb24gd2lsbCBnb2JibGUgdGhlIEI8LWQ+IG9wdGlvbikuCisKK1RoZSBWTVMgb3BlcmF0aW5nIHN5c3RlbSBvcGVyYXRlcyBpbiBhIHdvcmxkIHdoZXJlIGZpbGVzIGFyZSBhbHdheXMgYQorbXVsdGlwbGUgb2YgNTEyIGJ5dGVzLiAgVGhpcyBjYXVzZXMgcHJvYmxlbXMgd2hlbiBlbmNyeXB0ZWQgZGF0YSBpcworc2VuZCBmcm9tIFVuaXggdG8gVk1TIHNpbmNlIGEgODggYnl0ZSBmaWxlIHdpbGwgc3VkZGVubHkgYmUgcGFkZGVkCit3aXRoIDQyNCBudWxsIGJ5dGVzLiAgVG8gZ2V0IGFyb3VuZCB0aGlzIHByb2JsZW0sIHVzZSB0aGUgQjwtdT4gb3B0aW9uCit0byB1dWVuY29kZSB0aGUgZGF0YSBiZWZvcmUgaXQgaXMgc2VuZCB0byB0aGUgVk1TIHN5c3RlbS4KKworPWhlYWQxIEFVVEhPUgorCitFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKworPWN1dApkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXMzcy5jcHAgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2RlczNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQ1MjdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXMzcy5jcHAKQEAgLTAsMCArMSw2NyBAQAorLy8KKy8vIGdldHRzYy5pbmwKKy8vCisvLyBnaXZlcyBhY2Nlc3MgdG8gdGhlIFBlbnRpdW0ncyAoc2VjcmV0KSBjeWNsZSBjb3VudGVyCisvLworLy8gVGhpcyBzb2Z0d2FyZSB3YXMgd3JpdHRlbiBieSBMZW9uYXJkIEphbmtlIChqYW5rZUB1bml4Zy51YmMuY2EpCisvLyBpbiAxOTk2LTcgYW5kIGlzIGVudGVyZWQsIGJ5IGhpbSwgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKworI2lmIGRlZmluZWQoX19XQVRDT01DX18pCit2b2lkIEdldFRTQyh1bnNpZ25lZCBsb25nJik7CisjcHJhZ21hIGF1eCBHZXRUU0MgPSAweDBmIDB4MzEgIm1vdiBbZWRpXSwgZWF4IiBwYXJtIFtlZGldIG1vZGlmeSBbZWR4IGVheF07CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQoraW5saW5lCit2b2lkIEdldFRTQyh1bnNpZ25lZCBsb25nJiB0c2MpCit7CisgIGFzbSB2b2xhdGlsZSgiLmJ5dGUgMTUsIDQ5XG5cdCIKKwkgICAgICAgOiAiPWVheCIgKHRzYykKKwkgICAgICAgOgorCSAgICAgICA6ICIlZWR4IiwgIiVlYXgiKTsKK30KKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCitpbmxpbmUKK3ZvaWQgR2V0VFNDKHVuc2lnbmVkIGxvbmcmIHRzYykKK3sKKyAgdW5zaWduZWQgbG9uZyBhOworICBfX2FzbSBfZW1pdCAwZmgKKyAgX19hc20gX2VtaXQgMzFoCisgIF9fYXNtIG1vdiBhLCBlYXg7CisgIHRzYz1hOworfQorI2VuZGlmICAgICAgCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisKK3ZvaWQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCisJeworCWRlc19rZXlfc2NoZWR1bGUga2V5MSxrZXkyLGtleTM7CisJdW5zaWduZWQgbG9uZyBzMSxzMixlMSxlMjsKKwl1bnNpZ25lZCBsb25nIGRhdGFbMl07CisJaW50IGksajsKKworCWZvciAoaj0wOyBqPDY7IGorKykKKwkJeworCQlmb3IgKGk9MDsgaTwxMDAwOyBpKyspIC8qKi8KKwkJCXsKKwkJCWRlc19lbmNyeXB0MygmZGF0YVswXSxrZXkxLGtleTIsa2V5Myk7CisJCQlHZXRUU0MoczEpOworCQkJZGVzX2VuY3J5cHQzKCZkYXRhWzBdLGtleTEsa2V5MixrZXkzKTsKKwkJCWRlc19lbmNyeXB0MygmZGF0YVswXSxrZXkxLGtleTIsa2V5Myk7CisJCQlkZXNfZW5jcnlwdDMoJmRhdGFbMF0sa2V5MSxrZXkyLGtleTMpOworCQkJR2V0VFNDKGUxKTsKKwkJCUdldFRTQyhzMik7CisJCQlkZXNfZW5jcnlwdDMoJmRhdGFbMF0sa2V5MSxrZXkyLGtleTMpOworCQkJZGVzX2VuY3J5cHQzKCZkYXRhWzBdLGtleTEsa2V5MixrZXkzKTsKKwkJCWRlc19lbmNyeXB0MygmZGF0YVswXSxrZXkxLGtleTIsa2V5Myk7CisJCQlkZXNfZW5jcnlwdDMoJmRhdGFbMF0sa2V5MSxrZXkyLGtleTMpOworCQkJR2V0VFNDKGUyKTsKKwkJCWRlc19lbmNyeXB0MygmZGF0YVswXSxrZXkxLGtleTIsa2V5Myk7CisJCQl9CisKKwkJcHJpbnRmKCJkZXMgJWQgJWQgKCVkKVxuIiwKKwkJCWUxLXMxLGUyLXMyLCgoZTItczIpLShlMS1zMSkpKTsKKwkJfQorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhmZWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfZW5jLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qIGNyeXB0by9kZXMvZGVzX2VuYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorI2luY2x1ZGUgInNwci5oIgorCit2b2lkIERFU19lbmNyeXB0MShERVNfTE9ORyAqZGF0YSwgREVTX2tleV9zY2hlZHVsZSAqa3MsIGludCBlbmMpCisJeworCXJlZ2lzdGVyIERFU19MT05HIGwscix0LHU7CisjaWZkZWYgREVTX1BUUgorCXJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc19TUD0oY29uc3QgdW5zaWduZWQgY2hhciAqKURFU19TUHRyYW5zOworI2VuZGlmCisjaWZuZGVmIERFU19VTlJPTEwKKwlyZWdpc3RlciBpbnQgaTsKKyNlbmRpZgorCXJlZ2lzdGVyIERFU19MT05HICpzOworCisJcj1kYXRhWzBdOworCWw9ZGF0YVsxXTsKKworCUlQKHIsbCk7CisJLyogVGhpbmdzIGhhdmUgYmVlbiBtb2RpZmllZCBzbyB0aGF0IHRoZSBpbml0aWFsIHJvdGF0ZSBpcworCSAqIGRvbmUgb3V0c2lkZSB0aGUgbG9vcC4gIFRoaXMgcmVxdWlyZWQgdGhlCisJICogREVTX1NQdHJhbnMgdmFsdWVzIGluIHNwLmggdG8gYmUgcm90YXRlZCAxIGJpdCB0byB0aGUgcmlnaHQuCisJICogT25lIHBlcmwgc2NyaXB0IGxhdGVyIGFuZCB0aGluZ3MgaGF2ZSBhIDUlIHNwZWVkIHVwIG9uIGEgc3BhcmMyLgorCSAqIFRoYW5rcyB0byBSaWNoYXJkIE91dGVyYnJpZGdlIDw3MTc1NS4yMDRAQ29tcHVTZXJ2ZS5DT00+CisJICogZm9yIHBvaW50aW5nIHRoaXMgb3V0LiAqLworCS8qIGNsZWFyIHRoZSB0b3AgYml0cyBvbiBtYWNoaW5lcyB3aXRoIDhieXRlIGxvbmdzICovCisJLyogc2hpZnQgbGVmdCBieSAyICovCisJcj1ST1RBVEUociwyOSkmMHhmZmZmZmZmZkw7CisJbD1ST1RBVEUobCwyOSkmMHhmZmZmZmZmZkw7CisKKwlzPWtzLT5rcy0+ZGVzbG9uZzsKKwkvKiBJIGRvbid0IGtub3cgaWYgaXQgaXMgd29ydGggdGhlIGVmZm9ydCBvZiBsb29wIHVucm9sbGluZyB0aGUKKwkgKiBpbm5lciBsb29wICovCisJaWYgKGVuYykKKwkJeworI2lmZGVmIERFU19VTlJPTEwKKwkJRF9FTkNSWVBUKGwsciwgMCk7IC8qICAxICovCisJCURfRU5DUllQVChyLGwsIDIpOyAvKiAgMiAqLworCQlEX0VOQ1JZUFQobCxyLCA0KTsgLyogIDMgKi8KKwkJRF9FTkNSWVBUKHIsbCwgNik7IC8qICA0ICovCisJCURfRU5DUllQVChsLHIsIDgpOyAvKiAgNSAqLworCQlEX0VOQ1JZUFQocixsLDEwKTsgLyogIDYgKi8KKwkJRF9FTkNSWVBUKGwsciwxMik7IC8qICA3ICovCisJCURfRU5DUllQVChyLGwsMTQpOyAvKiAgOCAqLworCQlEX0VOQ1JZUFQobCxyLDE2KTsgLyogIDkgKi8KKwkJRF9FTkNSWVBUKHIsbCwxOCk7IC8qICAxMCAqLworCQlEX0VOQ1JZUFQobCxyLDIwKTsgLyogIDExICovCisJCURfRU5DUllQVChyLGwsMjIpOyAvKiAgMTIgKi8KKwkJRF9FTkNSWVBUKGwsciwyNCk7IC8qICAxMyAqLworCQlEX0VOQ1JZUFQocixsLDI2KTsgLyogIDE0ICovCisJCURfRU5DUllQVChsLHIsMjgpOyAvKiAgMTUgKi8KKwkJRF9FTkNSWVBUKHIsbCwzMCk7IC8qICAxNiAqLworI2Vsc2UKKwkJZm9yIChpPTA7IGk8MzI7IGkrPTQpCisJCQl7CisJCQlEX0VOQ1JZUFQobCxyLGkrMCk7IC8qICAxICovCisJCQlEX0VOQ1JZUFQocixsLGkrMik7IC8qICAyICovCisJCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworI2lmZGVmIERFU19VTlJPTEwKKwkJRF9FTkNSWVBUKGwsciwzMCk7IC8qIDE2ICovCisJCURfRU5DUllQVChyLGwsMjgpOyAvKiAxNSAqLworCQlEX0VOQ1JZUFQobCxyLDI2KTsgLyogMTQgKi8KKwkJRF9FTkNSWVBUKHIsbCwyNCk7IC8qIDEzICovCisJCURfRU5DUllQVChsLHIsMjIpOyAvKiAxMiAqLworCQlEX0VOQ1JZUFQocixsLDIwKTsgLyogMTEgKi8KKwkJRF9FTkNSWVBUKGwsciwxOCk7IC8qIDEwICovCisJCURfRU5DUllQVChyLGwsMTYpOyAvKiAgOSAqLworCQlEX0VOQ1JZUFQobCxyLDE0KTsgLyogIDggKi8KKwkJRF9FTkNSWVBUKHIsbCwxMik7IC8qICA3ICovCisJCURfRU5DUllQVChsLHIsMTApOyAvKiAgNiAqLworCQlEX0VOQ1JZUFQocixsLCA4KTsgLyogIDUgKi8KKwkJRF9FTkNSWVBUKGwsciwgNik7IC8qICA0ICovCisJCURfRU5DUllQVChyLGwsIDQpOyAvKiAgMyAqLworCQlEX0VOQ1JZUFQobCxyLCAyKTsgLyogIDIgKi8KKwkJRF9FTkNSWVBUKHIsbCwgMCk7IC8qICAxICovCisjZWxzZQorCQlmb3IgKGk9MzA7IGk+MDsgaS09NCkKKwkJCXsKKwkJCURfRU5DUllQVChsLHIsaS0wKTsgLyogMTYgKi8KKwkJCURfRU5DUllQVChyLGwsaS0yKTsgLyogMTUgKi8KKwkJCX0KKyNlbmRpZgorCQl9CisKKwkvKiByb3RhdGUgYW5kIGNsZWFyIHRoZSB0b3AgYml0cyBvbiBtYWNoaW5lcyB3aXRoIDhieXRlIGxvbmdzICovCisJbD1ST1RBVEUobCwzKSYweGZmZmZmZmZmTDsKKwlyPVJPVEFURShyLDMpJjB4ZmZmZmZmZmZMOworCisJRlAocixsKTsKKwlkYXRhWzBdPWw7CisJZGF0YVsxXT1yOworCWw9cj10PXU9MDsKKwl9CisKK3ZvaWQgREVTX2VuY3J5cHQyKERFU19MT05HICpkYXRhLCBERVNfa2V5X3NjaGVkdWxlICprcywgaW50IGVuYykKKwl7CisJcmVnaXN0ZXIgREVTX0xPTkcgbCxyLHQsdTsKKyNpZmRlZiBERVNfUFRSCisJcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZGVzX1NQPShjb25zdCB1bnNpZ25lZCBjaGFyICopREVTX1NQdHJhbnM7CisjZW5kaWYKKyNpZm5kZWYgREVTX1VOUk9MTAorCXJlZ2lzdGVyIGludCBpOworI2VuZGlmCisJcmVnaXN0ZXIgREVTX0xPTkcgKnM7CisKKwlyPWRhdGFbMF07CisJbD1kYXRhWzFdOworCisJLyogVGhpbmdzIGhhdmUgYmVlbiBtb2RpZmllZCBzbyB0aGF0IHRoZSBpbml0aWFsIHJvdGF0ZSBpcworCSAqIGRvbmUgb3V0c2lkZSB0aGUgbG9vcC4gIFRoaXMgcmVxdWlyZWQgdGhlCisJICogREVTX1NQdHJhbnMgdmFsdWVzIGluIHNwLmggdG8gYmUgcm90YXRlZCAxIGJpdCB0byB0aGUgcmlnaHQuCisJICogT25lIHBlcmwgc2NyaXB0IGxhdGVyIGFuZCB0aGluZ3MgaGF2ZSBhIDUlIHNwZWVkIHVwIG9uIGEgc3BhcmMyLgorCSAqIFRoYW5rcyB0byBSaWNoYXJkIE91dGVyYnJpZGdlIDw3MTc1NS4yMDRAQ29tcHVTZXJ2ZS5DT00+CisJICogZm9yIHBvaW50aW5nIHRoaXMgb3V0LiAqLworCS8qIGNsZWFyIHRoZSB0b3AgYml0cyBvbiBtYWNoaW5lcyB3aXRoIDhieXRlIGxvbmdzICovCisJcj1ST1RBVEUociwyOSkmMHhmZmZmZmZmZkw7CisJbD1ST1RBVEUobCwyOSkmMHhmZmZmZmZmZkw7CisKKwlzPWtzLT5rcy0+ZGVzbG9uZzsKKwkvKiBJIGRvbid0IGtub3cgaWYgaXQgaXMgd29ydGggdGhlIGVmZm9ydCBvZiBsb29wIHVucm9sbGluZyB0aGUKKwkgKiBpbm5lciBsb29wICovCisJaWYgKGVuYykKKwkJeworI2lmZGVmIERFU19VTlJPTEwKKwkJRF9FTkNSWVBUKGwsciwgMCk7IC8qICAxICovCisJCURfRU5DUllQVChyLGwsIDIpOyAvKiAgMiAqLworCQlEX0VOQ1JZUFQobCxyLCA0KTsgLyogIDMgKi8KKwkJRF9FTkNSWVBUKHIsbCwgNik7IC8qICA0ICovCisJCURfRU5DUllQVChsLHIsIDgpOyAvKiAgNSAqLworCQlEX0VOQ1JZUFQocixsLDEwKTsgLyogIDYgKi8KKwkJRF9FTkNSWVBUKGwsciwxMik7IC8qICA3ICovCisJCURfRU5DUllQVChyLGwsMTQpOyAvKiAgOCAqLworCQlEX0VOQ1JZUFQobCxyLDE2KTsgLyogIDkgKi8KKwkJRF9FTkNSWVBUKHIsbCwxOCk7IC8qICAxMCAqLworCQlEX0VOQ1JZUFQobCxyLDIwKTsgLyogIDExICovCisJCURfRU5DUllQVChyLGwsMjIpOyAvKiAgMTIgKi8KKwkJRF9FTkNSWVBUKGwsciwyNCk7IC8qICAxMyAqLworCQlEX0VOQ1JZUFQocixsLDI2KTsgLyogIDE0ICovCisJCURfRU5DUllQVChsLHIsMjgpOyAvKiAgMTUgKi8KKwkJRF9FTkNSWVBUKHIsbCwzMCk7IC8qICAxNiAqLworI2Vsc2UKKwkJZm9yIChpPTA7IGk8MzI7IGkrPTQpCisJCQl7CisJCQlEX0VOQ1JZUFQobCxyLGkrMCk7IC8qICAxICovCisJCQlEX0VOQ1JZUFQocixsLGkrMik7IC8qICAyICovCisJCQl9CisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworI2lmZGVmIERFU19VTlJPTEwKKwkJRF9FTkNSWVBUKGwsciwzMCk7IC8qIDE2ICovCisJCURfRU5DUllQVChyLGwsMjgpOyAvKiAxNSAqLworCQlEX0VOQ1JZUFQobCxyLDI2KTsgLyogMTQgKi8KKwkJRF9FTkNSWVBUKHIsbCwyNCk7IC8qIDEzICovCisJCURfRU5DUllQVChsLHIsMjIpOyAvKiAxMiAqLworCQlEX0VOQ1JZUFQocixsLDIwKTsgLyogMTEgKi8KKwkJRF9FTkNSWVBUKGwsciwxOCk7IC8qIDEwICovCisJCURfRU5DUllQVChyLGwsMTYpOyAvKiAgOSAqLworCQlEX0VOQ1JZUFQobCxyLDE0KTsgLyogIDggKi8KKwkJRF9FTkNSWVBUKHIsbCwxMik7IC8qICA3ICovCisJCURfRU5DUllQVChsLHIsMTApOyAvKiAgNiAqLworCQlEX0VOQ1JZUFQocixsLCA4KTsgLyogIDUgKi8KKwkJRF9FTkNSWVBUKGwsciwgNik7IC8qICA0ICovCisJCURfRU5DUllQVChyLGwsIDQpOyAvKiAgMyAqLworCQlEX0VOQ1JZUFQobCxyLCAyKTsgLyogIDIgKi8KKwkJRF9FTkNSWVBUKHIsbCwgMCk7IC8qICAxICovCisjZWxzZQorCQlmb3IgKGk9MzA7IGk+MDsgaS09NCkKKwkJCXsKKwkJCURfRU5DUllQVChsLHIsaS0wKTsgLyogMTYgKi8KKwkJCURfRU5DUllQVChyLGwsaS0yKTsgLyogMTUgKi8KKwkJCX0KKyNlbmRpZgorCQl9CisJLyogcm90YXRlIGFuZCBjbGVhciB0aGUgdG9wIGJpdHMgb24gbWFjaGluZXMgd2l0aCA4Ynl0ZSBsb25ncyAqLworCWRhdGFbMF09Uk9UQVRFKGwsMykmMHhmZmZmZmZmZkw7CisJZGF0YVsxXT1ST1RBVEUociwzKSYweGZmZmZmZmZmTDsKKwlsPXI9dD11PTA7CisJfQorCit2b2lkIERFU19lbmNyeXB0MyhERVNfTE9ORyAqZGF0YSwgREVTX2tleV9zY2hlZHVsZSAqa3MxLAorCQkgIERFU19rZXlfc2NoZWR1bGUgKmtzMiwgREVTX2tleV9zY2hlZHVsZSAqa3MzKQorCXsKKwlyZWdpc3RlciBERVNfTE9ORyBsLHI7CisKKwlsPWRhdGFbMF07CisJcj1kYXRhWzFdOworCUlQKGwscik7CisJZGF0YVswXT1sOworCWRhdGFbMV09cjsKKwlERVNfZW5jcnlwdDIoKERFU19MT05HICopZGF0YSxrczEsREVTX0VOQ1JZUFQpOworCURFU19lbmNyeXB0MigoREVTX0xPTkcgKilkYXRhLGtzMixERVNfREVDUllQVCk7CisJREVTX2VuY3J5cHQyKChERVNfTE9ORyAqKWRhdGEsa3MzLERFU19FTkNSWVBUKTsKKwlsPWRhdGFbMF07CisJcj1kYXRhWzFdOworCUZQKHIsbCk7CisJZGF0YVswXT1sOworCWRhdGFbMV09cjsKKwl9CisKK3ZvaWQgREVTX2RlY3J5cHQzKERFU19MT05HICpkYXRhLCBERVNfa2V5X3NjaGVkdWxlICprczEsCisJCSAgREVTX2tleV9zY2hlZHVsZSAqa3MyLCBERVNfa2V5X3NjaGVkdWxlICprczMpCisJeworCXJlZ2lzdGVyIERFU19MT05HIGwscjsKKworCWw9ZGF0YVswXTsKKwlyPWRhdGFbMV07CisJSVAobCxyKTsKKwlkYXRhWzBdPWw7CisJZGF0YVsxXT1yOworCURFU19lbmNyeXB0MigoREVTX0xPTkcgKilkYXRhLGtzMyxERVNfREVDUllQVCk7CisJREVTX2VuY3J5cHQyKChERVNfTE9ORyAqKWRhdGEsa3MyLERFU19FTkNSWVBUKTsKKwlERVNfZW5jcnlwdDIoKERFU19MT05HICopZGF0YSxrczEsREVTX0RFQ1JZUFQpOworCWw9ZGF0YVswXTsKKwlyPWRhdGFbMV07CisJRlAocixsKTsKKwlkYXRhWzBdPWw7CisJZGF0YVsxXT1yOworCX0KKworI2lmbmRlZiBERVNfREVGQVVMVF9PUFRJT05TCisKKyN1bmRlZiBDQkNfRU5DX0NfX0RPTlRfVVBEQVRFX0lWCisjaW5jbHVkZSAibmNiY19lbmMuYyIgLyogREVTX25jYmNfZW5jcnlwdCAqLworCit2b2lkIERFU19lZGUzX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCB1bnNpZ25lZCBjaGFyICpvdXRwdXQsCisJCQkgIGxvbmcgbGVuZ3RoLCBERVNfa2V5X3NjaGVkdWxlICprczEsCisJCQkgIERFU19rZXlfc2NoZWR1bGUgKmtzMiwgREVTX2tleV9zY2hlZHVsZSAqa3MzLAorCQkJICBERVNfY2Jsb2NrICppdmVjLCBpbnQgZW5jKQorCXsKKwlyZWdpc3RlciBERVNfTE9ORyB0aW4wLHRpbjE7CisJcmVnaXN0ZXIgREVTX0xPTkcgdG91dDAsdG91dDEseG9yMCx4b3IxOworCXJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluOworCXVuc2lnbmVkIGNoYXIgKm91dDsKKwlyZWdpc3RlciBsb25nIGw9bGVuZ3RoOworCURFU19MT05HIHRpblsyXTsKKwl1bnNpZ25lZCBjaGFyICppdjsKKworCWluPWlucHV0OworCW91dD1vdXRwdXQ7CisJaXYgPSAmKCppdmVjKVswXTsKKworCWlmIChlbmMpCisJCXsKKwkJYzJsKGl2LHRvdXQwKTsKKwkJYzJsKGl2LHRvdXQxKTsKKwkJZm9yIChsLT04OyBsPj0wOyBsLT04KQorCQkJeworCQkJYzJsKGluLHRpbjApOworCQkJYzJsKGluLHRpbjEpOworCQkJdGluMF49dG91dDA7CisJCQl0aW4xXj10b3V0MTsKKworCQkJdGluWzBdPXRpbjA7CisJCQl0aW5bMV09dGluMTsKKwkJCURFU19lbmNyeXB0MygoREVTX0xPTkcgKil0aW4sa3MxLGtzMixrczMpOworCQkJdG91dDA9dGluWzBdOworCQkJdG91dDE9dGluWzFdOworCisJCQlsMmModG91dDAsb3V0KTsKKwkJCWwyYyh0b3V0MSxvdXQpOworCQkJfQorCQlpZiAobCAhPSAtOCkKKwkJCXsKKwkJCWMybG4oaW4sdGluMCx0aW4xLGwrOCk7CisJCQl0aW4wXj10b3V0MDsKKwkJCXRpbjFePXRvdXQxOworCisJCQl0aW5bMF09dGluMDsKKwkJCXRpblsxXT10aW4xOworCQkJREVTX2VuY3J5cHQzKChERVNfTE9ORyAqKXRpbixrczEsa3MyLGtzMyk7CisJCQl0b3V0MD10aW5bMF07CisJCQl0b3V0MT10aW5bMV07CisKKwkJCWwyYyh0b3V0MCxvdXQpOworCQkJbDJjKHRvdXQxLG91dCk7CisJCQl9CisJCWl2ID0gJigqaXZlYylbMF07CisJCWwyYyh0b3V0MCxpdik7CisJCWwyYyh0b3V0MSxpdik7CisJCX0KKwllbHNlCisJCXsKKwkJcmVnaXN0ZXIgREVTX0xPTkcgdDAsdDE7CisKKwkJYzJsKGl2LHhvcjApOworCQljMmwoaXYseG9yMSk7CisJCWZvciAobC09ODsgbD49MDsgbC09OCkKKwkJCXsKKwkJCWMybChpbix0aW4wKTsKKwkJCWMybChpbix0aW4xKTsKKworCQkJdDA9dGluMDsKKwkJCXQxPXRpbjE7CisKKwkJCXRpblswXT10aW4wOworCQkJdGluWzFdPXRpbjE7CisJCQlERVNfZGVjcnlwdDMoKERFU19MT05HICopdGluLGtzMSxrczIsa3MzKTsKKwkJCXRvdXQwPXRpblswXTsKKwkJCXRvdXQxPXRpblsxXTsKKworCQkJdG91dDBePXhvcjA7CisJCQl0b3V0MV49eG9yMTsKKwkJCWwyYyh0b3V0MCxvdXQpOworCQkJbDJjKHRvdXQxLG91dCk7CisJCQl4b3IwPXQwOworCQkJeG9yMT10MTsKKwkJCX0KKwkJaWYgKGwgIT0gLTgpCisJCQl7CisJCQljMmwoaW4sdGluMCk7CisJCQljMmwoaW4sdGluMSk7CisJCQkKKwkJCXQwPXRpbjA7CisJCQl0MT10aW4xOworCisJCQl0aW5bMF09dGluMDsKKwkJCXRpblsxXT10aW4xOworCQkJREVTX2RlY3J5cHQzKChERVNfTE9ORyAqKXRpbixrczEsa3MyLGtzMyk7CisJCQl0b3V0MD10aW5bMF07CisJCQl0b3V0MT10aW5bMV07CisJCQorCQkJdG91dDBePXhvcjA7CisJCQl0b3V0MV49eG9yMTsKKwkJCWwyY24odG91dDAsdG91dDEsb3V0LGwrOCk7CisJCQl4b3IwPXQwOworCQkJeG9yMT10MTsKKwkJCX0KKworCQlpdiA9ICYoKml2ZWMpWzBdOworCQlsMmMoeG9yMCxpdik7CisJCWwyYyh4b3IxLGl2KTsKKwkJfQorCXRpbjA9dGluMT10b3V0MD10b3V0MT14b3IwPXhvcjE9MDsKKwl0aW5bMF09dGluWzFdPTA7CisJfQorCisjZW5kaWYgLyogREVTX0RFRkFVTFRfT1BUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfbG9jbC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfbG9jbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjUxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19sb2NsLmgKQEAgLTAsMCArMSw0MzIgQEAKKy8qIGNyeXB0by9kZXMvZGVzX2xvY2wuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9ERVNfTE9DTF9ICisjZGVmaW5lIEhFQURFUl9ERVNfTE9DTF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKQorI2lmbmRlZiBPUEVOU1NMX1NZU19NU0RPUworI2RlZmluZSBPUEVOU1NMX1NZU19NU0RPUworI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9TWVNfTVNET1MKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpIHx8IGRlZmluZWQoX19ERUNDKQorI2lmZGVmIE9QRU5TU0xfVU5JU1RECisjIGluY2x1ZGUgT1BFTlNTTF9VTklTVEQKKyNlbHNlCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8bWF0aC5oPgorI2VuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgorCisjaWZkZWYgT1BFTlNTTF9TWVNfTVNET1MJCS8qIFZpc3VhbCBDKysgMi4xIChXaW5kb3dzIE5ULzk1KSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKSB8fCBkZWZpbmVkKE1fWEVOSVgpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfQlVJTERfU0hMSUJDUllQVE8KKyMgdW5kZWYgT1BFTlNTTF9FWFRFUk4KKyMgZGVmaW5lIE9QRU5TU0xfRVhURVJOIE9QRU5TU0xfRVhQT1JUCisjZW5kaWYKKworI2RlZmluZSBJVEVSQVRJT05TIDE2CisjZGVmaW5lIEhBTEZfSVRFUkFUSU9OUyA4CisKKy8qIHVzZWQgaW4gZGVzX3JlYWQgYW5kIGRlc193cml0ZSAqLworI2RlZmluZSBNQVhXUklURQkoMTAyNCoxNikKKyNkZWZpbmUgQlNJWkUJCShNQVhXUklURSs0KQorCisjZGVmaW5lIGMybChjLGwpCShsID0oKERFU19MT05HKSgqKChjKSsrKSkpICAgICwgXAorCQkJIGx8PSgoREVTX0xPTkcpKCooKGMpKyspKSk8PCA4TCwgXAorCQkJIGx8PSgoREVTX0xPTkcpKCooKGMpKyspKSk8PDE2TCwgXAorCQkJIGx8PSgoREVTX0xPTkcpKCooKGMpKyspKSk8PDI0TCkKKworLyogTk9URSAtIGMgaXMgbm90IGluY3JlbWVudGVkIGFzIHBlciBjMmwgKi8KKyNkZWZpbmUgYzJsbihjLGwxLGwyLG4pCXsgXAorCQkJYys9bjsgXAorCQkJbDE9bDI9MDsgXAorCQkJc3dpdGNoIChuKSB7IFwKKwkJCWNhc2UgODogbDIgPSgoREVTX0xPTkcpKCooLS0oYykpKSk8PDI0TDsgXAorCQkJY2FzZSA3OiBsMnw9KChERVNfTE9ORykoKigtLShjKSkpKTw8MTZMOyBcCisJCQljYXNlIDY6IGwyfD0oKERFU19MT05HKSgqKC0tKGMpKSkpPDwgOEw7IFwKKwkJCWNhc2UgNTogbDJ8PSgoREVTX0xPTkcpKCooLS0oYykpKSk7ICAgICBcCisJCQljYXNlIDQ6IGwxID0oKERFU19MT05HKSgqKC0tKGMpKSkpPDwyNEw7IFwKKwkJCWNhc2UgMzogbDF8PSgoREVTX0xPTkcpKCooLS0oYykpKSk8PDE2TDsgXAorCQkJY2FzZSAyOiBsMXw9KChERVNfTE9ORykoKigtLShjKSkpKTw8IDhMOyBcCisJCQljYXNlIDE6IGwxfD0oKERFU19MT05HKSgqKC0tKGMpKSkpOyAgICAgXAorCQkJCX0gXAorCQkJfQorCisjZGVmaW5lIGwyYyhsLGMpCSgqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKSAgICAgKSYweGZmKSwgXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4gOEwpJjB4ZmYpLCBcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjE2TCkmMHhmZiksIFwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MjRMKSYweGZmKSkKKworLyogcmVwbGFjZW1lbnRzIGZvciBodG9ubCBhbmQgbnRvaGwgc2luY2UgSSBoYXZlIG5vIGlkZWEgd2hhdCB0byBkbworICogd2hlbiBmYWNlZCB3aXRoIG1hY2hpbmVzIHdpdGggOCBieXRlIGxvbmdzLiAqLworI2RlZmluZSBIRFJTSVpFIDQKKworI2RlZmluZSBuMmwoYyxsKQkobCA9KChERVNfTE9ORykoKigoYykrKykpKTw8MjRMLCBcCisJCQkgbHw9KChERVNfTE9ORykoKigoYykrKykpKTw8MTZMLCBcCisJCQkgbHw9KChERVNfTE9ORykoKigoYykrKykpKTw8IDhMLCBcCisJCQkgbHw9KChERVNfTE9ORykoKigoYykrKykpKSkKKworI2RlZmluZSBsMm4obCxjKQkoKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjI0TCkmMHhmZiksIFwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MTZMKSYweGZmKSwgXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4gOEwpJjB4ZmYpLCBcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCkgICAgICkmMHhmZikpCisKKy8qIE5PVEUgLSBjIGlzIG5vdCBpbmNyZW1lbnRlZCBhcyBwZXIgbDJjICovCisjZGVmaW5lIGwyY24obDEsbDIsYyxuKQl7IFwKKwkJCWMrPW47IFwKKwkJCXN3aXRjaCAobikgeyBcCisJCQljYXNlIDg6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+MjRMKSYweGZmKTsgXAorCQkJY2FzZSA3OiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMik+PjE2TCkmMHhmZik7IFwKKwkJCWNhc2UgNjogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDIpPj4gOEwpJjB4ZmYpOyBcCisJCQljYXNlIDU6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKSAgICAgKSYweGZmKTsgXAorCQkJY2FzZSA0OiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMSk+PjI0TCkmMHhmZik7IFwKKwkJCWNhc2UgMzogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDEpPj4xNkwpJjB4ZmYpOyBcCisJCQljYXNlIDI6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+IDhMKSYweGZmKTsgXAorCQkJY2FzZSAxOiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMSkgICAgICkmMHhmZik7IFwKKwkJCQl9IFwKKwkJCX0KKworI2lmIChkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSkgfHwgZGVmaW5lZChfX0lDQykKKyNkZWZpbmUJUk9UQVRFKGEsbikJKF9scm90cihhLG4pKQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18+PTIgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19JTkxJTkVfQVNNKSAmJiAhZGVmaW5lZChQRURBTlRJQykKKyMgaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyMgIGRlZmluZSBST1RBVEUoYSxuKQkoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmV0OwlcCisJCQkJYXNtICgicm9ybCAlMSwlMCIJXAorCQkJCQk6ICI9ciIocmV0KQlcCisJCQkJCTogIkkiKG4pLCIwIihhKQlcCisJCQkJCTogImNjIik7CVwKKwkJCSAgIHJldDsJCQkJXAorCQkJfSkKKyMgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBST1RBVEUKKyNkZWZpbmUJUk9UQVRFKGEsbikJKCgoYSk+PihuKSkrKChhKTw8KDMyLShuKSkpKQorI2VuZGlmCisKKy8qIERvbid0IHdvcnJ5IGFib3V0IHRoZSBMT0FEX0RBVEEoKSBzdHVmZiwgdGhhdCBpcyB1c2VkIGJ5CisgKiBmY3J5cHQoKSB0byBhZGQgaXQncyBsaXR0bGUgYml0IHRvIHRoZSBmcm9udCAqLworCisjaWZkZWYgREVTX0ZDUllQVAorCisjZGVmaW5lIExPQURfREFUQV90bXAoUixTLHUsdCxFMCxFMSkgXAorCXsgREVTX0xPTkcgdG1wOyBMT0FEX0RBVEEoUixTLHUsdCxFMCxFMSx0bXApOyB9CisKKyNkZWZpbmUgTE9BRF9EQVRBKFIsUyx1LHQsRTAsRTEsdG1wKSBcCisJdD1SXihSPj4xNkwpOyBcCisJdT10JkUwOyB0Jj1FMTsgXAorCXRtcD0odTw8MTYpOyB1Xj1SXnNbUyAgXTsgdV49dG1wOyBcCisJdG1wPSh0PDwxNik7IHRePVJec1tTKzFdOyB0Xj10bXAKKyNlbHNlCisjZGVmaW5lIExPQURfREFUQV90bXAoYSxiLGMsZCxlLGYpIExPQURfREFUQShhLGIsYyxkLGUsZixnKQorI2RlZmluZSBMT0FEX0RBVEEoUixTLHUsdCxFMCxFMSx0bXApIFwKKwl1PVJec1tTICBdOyBcCisJdD1SXnNbUysxXQorI2VuZGlmCisKKy8qIFRoZSBjaGFuZ2VzIHRvIHRoaXMgbWFjcm8gbWF5IGhlbHAgb3IgaGluZGVyLCBkZXBlbmRpbmcgb24gdGhlCisgKiBjb21waWxlciBhbmQgdGhlIGFyY2hpdGVjdHVyZS4gIGdjYzIgYWx3YXlzIHNlZW1zIHRvIGRvIHdlbGwgOi0pLgorICogSW5zcGlyZWQgYnkgRGFuYSBIb3cgPGhvd0Bpc2wuc3RhbmZvcmQuZWR1PgorICogRE8gTk9UIHVzZSB0aGUgYWx0ZXJuYXRpdmUgdmVyc2lvbiBvbiBtYWNoaW5lcyB3aXRoIDggYnl0ZSBsb25ncy4KKyAqIEl0IGRvZXMgbm90IHNlZW0gdG8gd29yayBvbiB0aGUgQWxwaGEsIGV2ZW4gd2hlbiBERVNfTE9ORyBpcyA0CisgKiBieXRlcywgcHJvYmFibHkgYW4gaXNzdWUgb2YgYWNjZXNzaW5nIG5vbi13b3JkIGFsaWduZWQgb2JqZWN0cyA6LSggKi8KKyNpZmRlZiBERVNfUFRSCisKKy8qIEl0IHJlY2VudGx5IG9jY3VycmVkIHRvIG1lIHRoYXQgMF4wXjBeMF4wXjBeMCA9PSAwLCBzbyB0aGVyZQorICogaXMgbm8gcmVhc29uIHRvIG5vdCB4b3IgYWxsIHRoZSBzdWIgaXRlbXMgdG9nZXRoZXIuICBUaGlzIHBvdGVudGlhbGx5CisgKiBzYXZlcyBhIHJlZ2lzdGVyIHNpbmNlIHRoaW5ncyBjYW4gYmUgeG9yZWQgZGlyZWN0bHkgaW50byBMICovCisKKyNpZiBkZWZpbmVkKERFU19SSVNDMSkgfHwgZGVmaW5lZChERVNfUklTQzIpCisjaWZkZWYgREVTX1JJU0MxCisjZGVmaW5lIERfRU5DUllQVChMTCxSLFMpIHsgXAorCXVuc2lnbmVkIGludCB1MSx1Mix1MzsgXAorCUxPQURfREFUQShSLFMsdSx0LEUwLEUxLHUxKTsgXAorCXUyPShpbnQpdT4+OEw7IFwKKwl1MT0oaW50KXUmMHhmYzsgXAorCXUyJj0weGZjOyBcCisJdD1ST1RBVEUodCw0KTsgXAorCXU+Pj0xNkw7IFwKKwlMTF49ICooY29uc3QgREVTX0xPTkcgKikoZGVzX1NQICAgICAgK3UxKTsgXAorCUxMXj0gKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHgyMDArdTIpOyBcCisJdTM9KGludCkodT4+OEwpOyBcCisJdTE9KGludCl1JjB4ZmM7IFwKKwl1MyY9MHhmYzsgXAorCUxMXj0gKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHg0MDArdTEpOyBcCisJTExePSAqKGNvbnN0IERFU19MT05HICopKGRlc19TUCsweDYwMCt1Myk7IFwKKwl1Mj0oaW50KXQ+PjhMOyBcCisJdTE9KGludCl0JjB4ZmM7IFwKKwl1MiY9MHhmYzsgXAorCXQ+Pj0xNkw7IFwKKwlMTF49ICooY29uc3QgREVTX0xPTkcgKikoZGVzX1NQKzB4MTAwK3UxKTsgXAorCUxMXj0gKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHgzMDArdTIpOyBcCisJdTM9KGludCl0Pj44TDsgXAorCXUxPShpbnQpdCYweGZjOyBcCisJdTMmPTB4ZmM7IFwKKwlMTF49ICooY29uc3QgREVTX0xPTkcgKikoZGVzX1NQKzB4NTAwK3UxKTsgXAorCUxMXj0gKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHg3MDArdTMpOyB9CisjZW5kaWYKKyNpZmRlZiBERVNfUklTQzIKKyNkZWZpbmUgRF9FTkNSWVBUKExMLFIsUykgeyBcCisJdW5zaWduZWQgaW50IHUxLHUyLHMxLHMyOyBcCisJTE9BRF9EQVRBKFIsUyx1LHQsRTAsRTEsdTEpOyBcCisJdTI9KGludCl1Pj44TDsgXAorCXUxPShpbnQpdSYweGZjOyBcCisJdTImPTB4ZmM7IFwKKwl0PVJPVEFURSh0LDQpOyBcCisJTExePSAqKGNvbnN0IERFU19MT05HICopKGRlc19TUCAgICAgICt1MSk7IFwKKwlMTF49ICooY29uc3QgREVTX0xPTkcgKikoZGVzX1NQKzB4MjAwK3UyKTsgXAorCXMxPShpbnQpKHU+PjE2TCk7IFwKKwlzMj0oaW50KSh1Pj4yNEwpOyBcCisJczEmPTB4ZmM7IFwKKwlzMiY9MHhmYzsgXAorCUxMXj0gKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHg0MDArczEpOyBcCisJTExePSAqKGNvbnN0IERFU19MT05HICopKGRlc19TUCsweDYwMCtzMik7IFwKKwl1Mj0oaW50KXQ+PjhMOyBcCisJdTE9KGludCl0JjB4ZmM7IFwKKwl1MiY9MHhmYzsgXAorCUxMXj0gKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHgxMDArdTEpOyBcCisJTExePSAqKGNvbnN0IERFU19MT05HICopKGRlc19TUCsweDMwMCt1Mik7IFwKKwlzMT0oaW50KSh0Pj4xNkwpOyBcCisJczI9KGludCkodD4+MjRMKTsgXAorCXMxJj0weGZjOyBcCisJczImPTB4ZmM7IFwKKwlMTF49ICooY29uc3QgREVTX0xPTkcgKikoZGVzX1NQKzB4NTAwK3MxKTsgXAorCUxMXj0gKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHg3MDArczIpOyB9CisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIERfRU5DUllQVChMTCxSLFMpIHsgXAorCUxPQURfREFUQV90bXAoUixTLHUsdCxFMCxFMSk7IFwKKwl0PVJPVEFURSh0LDQpOyBcCisJTExePSBcCisJKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1AgICAgICArKCh1ICAgICApJjB4ZmMpKV4gXAorCSooY29uc3QgREVTX0xPTkcgKikoZGVzX1NQKzB4MjAwKygodT4+IDhMKSYweGZjKSleIFwKKwkqKGNvbnN0IERFU19MT05HICopKGRlc19TUCsweDQwMCsoKHU+PjE2TCkmMHhmYykpXiBcCisJKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHg2MDArKCh1Pj4yNEwpJjB4ZmMpKV4gXAorCSooY29uc3QgREVTX0xPTkcgKikoZGVzX1NQKzB4MTAwKygodCAgICAgKSYweGZjKSleIFwKKwkqKGNvbnN0IERFU19MT05HICopKGRlc19TUCsweDMwMCsoKHQ+PiA4TCkmMHhmYykpXiBcCisJKihjb25zdCBERVNfTE9ORyAqKShkZXNfU1ArMHg1MDArKCh0Pj4xNkwpJjB4ZmMpKV4gXAorCSooY29uc3QgREVTX0xPTkcgKikoZGVzX1NQKzB4NzAwKygodD4+MjRMKSYweGZjKSk7IH0KKyNlbmRpZgorCisjZWxzZSAvKiBvcmlnaW5hbCB2ZXJzaW9uICovCisKKyNpZiBkZWZpbmVkKERFU19SSVNDMSkgfHwgZGVmaW5lZChERVNfUklTQzIpCisjaWZkZWYgREVTX1JJU0MxCisjZGVmaW5lIERfRU5DUllQVChMTCxSLFMpIHtcCisJdW5zaWduZWQgaW50IHUxLHUyLHUzOyBcCisJTE9BRF9EQVRBKFIsUyx1LHQsRTAsRTEsdTEpOyBcCisJdT4+PTJMOyBcCisJdD1ST1RBVEUodCw2KTsgXAorCXUyPShpbnQpdT4+OEw7IFwKKwl1MT0oaW50KXUmMHgzZjsgXAorCXUyJj0weDNmOyBcCisJdT4+PTE2TDsgXAorCUxMXj1ERVNfU1B0cmFuc1swXVt1MV07IFwKKwlMTF49REVTX1NQdHJhbnNbMl1bdTJdOyBcCisJdTM9KGludCl1Pj44TDsgXAorCXUxPShpbnQpdSYweDNmOyBcCisJdTMmPTB4M2Y7IFwKKwlMTF49REVTX1NQdHJhbnNbNF1bdTFdOyBcCisJTExePURFU19TUHRyYW5zWzZdW3UzXTsgXAorCXUyPShpbnQpdD4+OEw7IFwKKwl1MT0oaW50KXQmMHgzZjsgXAorCXUyJj0weDNmOyBcCisJdD4+PTE2TDsgXAorCUxMXj1ERVNfU1B0cmFuc1sxXVt1MV07IFwKKwlMTF49REVTX1NQdHJhbnNbM11bdTJdOyBcCisJdTM9KGludCl0Pj44TDsgXAorCXUxPShpbnQpdCYweDNmOyBcCisJdTMmPTB4M2Y7IFwKKwlMTF49REVTX1NQdHJhbnNbNV1bdTFdOyBcCisJTExePURFU19TUHRyYW5zWzddW3UzXTsgfQorI2VuZGlmCisjaWZkZWYgREVTX1JJU0MyCisjZGVmaW5lIERfRU5DUllQVChMTCxSLFMpIHtcCisJdW5zaWduZWQgaW50IHUxLHUyLHMxLHMyOyBcCisJTE9BRF9EQVRBKFIsUyx1LHQsRTAsRTEsdTEpOyBcCisJdT4+PTJMOyBcCisJdD1ST1RBVEUodCw2KTsgXAorCXUyPShpbnQpdT4+OEw7IFwKKwl1MT0oaW50KXUmMHgzZjsgXAorCXUyJj0weDNmOyBcCisJTExePURFU19TUHRyYW5zWzBdW3UxXTsgXAorCUxMXj1ERVNfU1B0cmFuc1syXVt1Ml07IFwKKwlzMT0oaW50KXU+PjE2TDsgXAorCXMyPShpbnQpdT4+MjRMOyBcCisJczEmPTB4M2Y7IFwKKwlzMiY9MHgzZjsgXAorCUxMXj1ERVNfU1B0cmFuc1s0XVtzMV07IFwKKwlMTF49REVTX1NQdHJhbnNbNl1bczJdOyBcCisJdTI9KGludCl0Pj44TDsgXAorCXUxPShpbnQpdCYweDNmOyBcCisJdTImPTB4M2Y7IFwKKwlMTF49REVTX1NQdHJhbnNbMV1bdTFdOyBcCisJTExePURFU19TUHRyYW5zWzNdW3UyXTsgXAorCXMxPShpbnQpdD4+MTY7IFwKKwlzMj0oaW50KXQ+PjI0TDsgXAorCXMxJj0weDNmOyBcCisJczImPTB4M2Y7IFwKKwlMTF49REVTX1NQdHJhbnNbNV1bczFdOyBcCisJTExePURFU19TUHRyYW5zWzddW3MyXTsgfQorI2VuZGlmCisKKyNlbHNlCisKKyNkZWZpbmUgRF9FTkNSWVBUKExMLFIsUykge1wKKwlMT0FEX0RBVEFfdG1wKFIsUyx1LHQsRTAsRTEpOyBcCisJdD1ST1RBVEUodCw0KTsgXAorCUxMXj1cCisJCURFU19TUHRyYW5zWzBdWyh1Pj4gMkwpJjB4M2ZdXiBcCisJCURFU19TUHRyYW5zWzJdWyh1Pj4xMEwpJjB4M2ZdXiBcCisJCURFU19TUHRyYW5zWzRdWyh1Pj4xOEwpJjB4M2ZdXiBcCisJCURFU19TUHRyYW5zWzZdWyh1Pj4yNkwpJjB4M2ZdXiBcCisJCURFU19TUHRyYW5zWzFdWyh0Pj4gMkwpJjB4M2ZdXiBcCisJCURFU19TUHRyYW5zWzNdWyh0Pj4xMEwpJjB4M2ZdXiBcCisJCURFU19TUHRyYW5zWzVdWyh0Pj4xOEwpJjB4M2ZdXiBcCisJCURFU19TUHRyYW5zWzddWyh0Pj4yNkwpJjB4M2ZdOyB9CisjZW5kaWYKKyNlbmRpZgorCisJLyogSVAgYW5kIEZQCisJICogVGhlIHByb2JsZW0gaXMgbW9yZSBvZiBhIGdlb21ldHJpYyBwcm9ibGVtIHRoYXQgcmFuZG9tIGJpdCBmaWRkbGluZy4KKwkgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgIDYyIDU0IDQ2IDM4IDMwIDIyIDE0ICA2CisJIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgICAgICA2MCA1MiA0NCAzNiAyOCAyMCAxMiAgNAorCTE2IDE3IDE4IDE5IDIwIDIxIDIyIDIzICAgICAgNTggNTAgNDIgMzQgMjYgMTggMTAgIDIKKwkyNCAyNSAyNiAyNyAyOCAyOSAzMCAzMSAgdG8gIDU2IDQ4IDQwIDMyIDI0IDE2ICA4ICAwCisKKwkzMiAzMyAzNCAzNSAzNiAzNyAzOCAzOSAgICAgIDYzIDU1IDQ3IDM5IDMxIDIzIDE1ICA3CisJNDAgNDEgNDIgNDMgNDQgNDUgNDYgNDcgICAgICA2MSA1MyA0NSAzNyAyOSAyMSAxMyAgNQorCTQ4IDQ5IDUwIDUxIDUyIDUzIDU0IDU1ICAgICAgNTkgNTEgNDMgMzUgMjcgMTkgMTEgIDMKKwk1NiA1NyA1OCA1OSA2MCA2MSA2MiA2MyAgICAgIDU3IDQ5IDQxIDMzIDI1IDE3ICA5ICAxCisKKwlUaGUgb3V0cHV0IGhhcyBiZWVuIHN1YmplY3QgdG8gc3dhcHMgb2YgdGhlIGZvcm0KKwkwIDEgLT4gMyAxIGJ1dCB0aGUgb2RkIGFuZCBldmVuIGJpdHMgaGF2ZSBiZWVuIHB1dCBpbnRvCisJMiAzICAgIDIgMAorCWRpZmZlcmVudCB3b3Jkcy4gIFRoZSBtYWluIHRyaWNrIGlzIHRvIHJlbWVtYmVyIHRoYXQKKwl0PSgobD4+c2l6ZSlecikmKG1hc2spOworCXJePXQ7CisJbF49KHQ8PHNpemUpOworCWNhbiBiZSB1c2VkIHRvIHN3YXAgYW5kIG1vdmUgYml0cyBiZXR3ZWVuIHdvcmRzLgorCisJU28gbCA9ICAwICAxICAyICAzICByID0gMTYgMTcgMTggMTkKKwkgICAgICAgIDQgIDUgIDYgIDcgICAgICAyMCAyMSAyMiAyMworCSAgICAgICAgOCAgOSAxMCAxMSAgICAgIDI0IDI1IDI2IDI3CisJICAgICAgIDEyIDEzIDE0IDE1ICAgICAgMjggMjkgMzAgMzEKKwliZWNvbWVzIChmb3Igc2l6ZSA9PSAyIGFuZCBtYXNrID09IDB4MzMzMykKKwkgICB0ID0gICAyXjE2ICAzXjE3IC0tIC0tICAgbCA9ICAwICAxIDE2IDE3ICByID0gIDIgIDMgMTggMTkKKwkJIDZeMjAgIDdeMjEgLS0gLS0gICAgICAgIDQgIDUgMjAgMjEgICAgICAgNiAgNyAyMiAyMworCQkxMF4yNCAxMV4yNSAtLSAtLSAgICAgICAgOCAgOSAyNCAyNSAgICAgIDEwIDExIDI0IDI1CisJCTE0XjI4IDE1XjI5IC0tIC0tICAgICAgIDEyIDEzIDI4IDI5ICAgICAgMTQgMTUgMjggMjkKKworCVRoYW5rcyBmb3IgaGludHMgZnJvbSBSaWNoYXJkIE91dGVyYnJpZGdlIC0gaGUgdG9sZCBtZSBJUCZGUAorCWNvdWxkIGJlIGRvbmUgaW4gMTUgeG9yLCAxMCBzaGlmdHMgYW5kIDUgYW5kcy4KKwlXaGVuIEkgZmluYWxseSBzdGFydGVkIHRvIHRoaW5rIG9mIHRoZSBwcm9ibGVtIGluIDJECisJSSBmaXJzdCBnb3QgfjQyIG9wZXJhdGlvbnMgd2l0aG91dCB4b3JzLiAgV2hlbiBJIHJlbWVtYmVyZWQKKwlob3cgdG8gdXNlIHhvcnMgOi0pIEkgZ290IGl0IHRvIGl0cyBmaW5hbCBzdGF0ZS4KKwkqLworI2RlZmluZSBQRVJNX09QKGEsYix0LG4sbSkgKCh0KT0oKCgoYSk+PihuKSleKGIpKSYobSkpLFwKKwkoYilePSh0KSxcCisJKGEpXj0oKHQpPDwobikpKQorCisjZGVmaW5lIElQKGwscikgXAorCXsgXAorCXJlZ2lzdGVyIERFU19MT05HIHR0OyBcCisJUEVSTV9PUChyLGwsdHQsIDQsMHgwZjBmMGYwZkwpOyBcCisJUEVSTV9PUChsLHIsdHQsMTYsMHgwMDAwZmZmZkwpOyBcCisJUEVSTV9PUChyLGwsdHQsIDIsMHgzMzMzMzMzM0wpOyBcCisJUEVSTV9PUChsLHIsdHQsIDgsMHgwMGZmMDBmZkwpOyBcCisJUEVSTV9PUChyLGwsdHQsIDEsMHg1NTU1NTU1NUwpOyBcCisJfQorCisjZGVmaW5lIEZQKGwscikgXAorCXsgXAorCXJlZ2lzdGVyIERFU19MT05HIHR0OyBcCisJUEVSTV9PUChsLHIsdHQsIDEsMHg1NTU1NTU1NUwpOyBcCisJUEVSTV9PUChyLGwsdHQsIDgsMHgwMGZmMDBmZkwpOyBcCisJUEVSTV9PUChsLHIsdHQsIDIsMHgzMzMzMzMzM0wpOyBcCisJUEVSTV9PUChyLGwsdHQsMTYsMHgwMDAwZmZmZkwpOyBcCisJUEVSTV9PUChsLHIsdHQsIDQsMHgwZjBmMGYwZkwpOyBcCisJfQorCitleHRlcm4gY29uc3QgREVTX0xPTkcgREVTX1NQdHJhbnNbOF1bNjRdOworCit2b2lkIGZjcnlwdF9ib2R5KERFU19MT05HICpvdXQsREVTX2tleV9zY2hlZHVsZSAqa3MsCisJCSBERVNfTE9ORyBFc3dhcDAsIERFU19MT05HIEVzd2FwMSk7CisKKyNpZmRlZiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVAorI3VuZGVmIERFU19VTlJPTEwKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19vbGQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzNlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19vbGQuYwpAQCAtMCwwICsxLDI3MyBAQAorLyogY3J5cHRvL2Rlcy9kZXNfb2xkLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKworLyogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCisgKgorICogVGhlIGZ1bmN0aW9uIG5hbWVzIGluIGhlcmUgYXJlIGRlcHJlY2F0ZWQgYW5kIGFyZSBvbmx5IHByZXNlbnQgdG8KKyAqIHByb3ZpZGUgYW4gaW50ZXJmYWNlIGNvbXBhdGlibGUgd2l0aCBsaWJkZXMuICBPcGVuU1NMIG5vdyBwcm92aWRlcworICogZnVuY3Rpb25zIHdoZXJlICJkZXNfIiBoYXMgYmVlbiByZXBsYWNlZCB3aXRoICJERVNfIiBpbiB0aGUgbmFtZXMsCisgKiB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIG1ha2UgaW5jb21wYXRpYmxlIGNoYW5nZXMgdGhhdCBhcmUgbmVlZGVkCisgKiBmb3IgQyB0eXBlIHNlY3VyaXR5IGFuZCBvdGhlciBzdHVmZi4KKyAqCisgKiBQbGVhc2UgY29uc2lkZXIgc3RhcnRpbmcgdG8gdXNlIHRoZSBERVNfIGZ1bmN0aW9ucyByYXRoZXIgdGhhbiB0aGUKKyAqIGRlc18gb25lcy4gIFRoZSBkZXNfIGZ1bmN0aW9ucyB3aWxsIGRpc3NhcGVhciBjb21wbGV0ZWx5IGJlZm9yZQorICogT3BlblNTTCAxLjAhCisgKgorICogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCisgKi8KKworLyogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAxLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2RlZmluZSBPUEVOU1NMX0RFU19MSUJERVNfQ09NUEFUSUJJTElUWQorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK2NvbnN0IGNoYXIgKl9vc3NsX29sZF9kZXNfb3B0aW9ucyh2b2lkKQorCXsKKwlyZXR1cm4gREVTX29wdGlvbnMoKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfZWNiM19lbmNyeXB0KF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LAorCWRlc19rZXlfc2NoZWR1bGUga3MxLGRlc19rZXlfc2NoZWR1bGUga3MyLAorCWRlc19rZXlfc2NoZWR1bGUga3MzLCBpbnQgZW5jKQorCXsKKwlERVNfZWNiM19lbmNyeXB0KChjb25zdF9ERVNfY2Jsb2NrICopaW5wdXQsIG91dHB1dCwKKwkJKERFU19rZXlfc2NoZWR1bGUgKilrczEsIChERVNfa2V5X3NjaGVkdWxlICopa3MyLAorCQkoREVTX2tleV9zY2hlZHVsZSAqKWtzMywgZW5jKTsKKwl9CitERVNfTE9ORyBfb3NzbF9vbGRfZGVzX2NiY19ja3N1bShfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCwKKwlsb25nIGxlbmd0aCxkZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlLF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjKQorCXsKKwlyZXR1cm4gREVTX2NiY19ja3N1bSgodW5zaWduZWQgY2hhciAqKWlucHV0LCBvdXRwdXQsIGxlbmd0aCwKKwkJKERFU19rZXlfc2NoZWR1bGUgKilzY2hlZHVsZSwgaXZlYyk7CisJfQordm9pZCBfb3NzbF9vbGRfZGVzX2NiY19lbmNyeXB0KF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LGxvbmcgbGVuZ3RoLAorCWRlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsaW50IGVuYykKKwl7CisJREVTX2NiY19lbmNyeXB0KCh1bnNpZ25lZCBjaGFyICopaW5wdXQsICh1bnNpZ25lZCBjaGFyICopb3V0cHV0LAorCQlsZW5ndGgsIChERVNfa2V5X3NjaGVkdWxlICopc2NoZWR1bGUsIGl2ZWMsIGVuYyk7CisJfQordm9pZCBfb3NzbF9vbGRfZGVzX25jYmNfZW5jcnlwdChfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCxsb25nIGxlbmd0aCwKKwlkZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlLF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLGludCBlbmMpCisJeworCURFU19uY2JjX2VuY3J5cHQoKHVuc2lnbmVkIGNoYXIgKilpbnB1dCwgKHVuc2lnbmVkIGNoYXIgKilvdXRwdXQsCisJCWxlbmd0aCwgKERFU19rZXlfc2NoZWR1bGUgKilzY2hlZHVsZSwgaXZlYywgZW5jKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfeGNiY19lbmNyeXB0KF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LGxvbmcgbGVuZ3RoLAorCWRlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsCisJX29zc2xfb2xkX2Rlc19jYmxvY2sgKmludyxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0dyxpbnQgZW5jKQorCXsKKwlERVNfeGNiY19lbmNyeXB0KCh1bnNpZ25lZCBjaGFyICopaW5wdXQsICh1bnNpZ25lZCBjaGFyICopb3V0cHV0LAorCQlsZW5ndGgsIChERVNfa2V5X3NjaGVkdWxlICopc2NoZWR1bGUsIGl2ZWMsIGludywgb3V0dywgZW5jKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfY2ZiX2VuY3J5cHQodW5zaWduZWQgY2hhciAqaW4sdW5zaWduZWQgY2hhciAqb3V0LGludCBudW1iaXRzLAorCWxvbmcgbGVuZ3RoLGRlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsaW50IGVuYykKKwl7CisJREVTX2NmYl9lbmNyeXB0KGluLCBvdXQsIG51bWJpdHMsIGxlbmd0aCwKKwkJKERFU19rZXlfc2NoZWR1bGUgKilzY2hlZHVsZSwgaXZlYywgZW5jKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfZWNiX2VuY3J5cHQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmlucHV0LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXRwdXQsCisJZGVzX2tleV9zY2hlZHVsZSBrcyxpbnQgZW5jKQorCXsKKwlERVNfZWNiX2VuY3J5cHQoaW5wdXQsIG91dHB1dCwgKERFU19rZXlfc2NoZWR1bGUgKilrcywgZW5jKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfZW5jcnlwdChERVNfTE9ORyAqZGF0YSxkZXNfa2V5X3NjaGVkdWxlIGtzLCBpbnQgZW5jKQorCXsKKwlERVNfZW5jcnlwdDEoZGF0YSwgKERFU19rZXlfc2NoZWR1bGUgKilrcywgZW5jKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfZW5jcnlwdDIoREVTX0xPTkcgKmRhdGEsZGVzX2tleV9zY2hlZHVsZSBrcywgaW50IGVuYykKKwl7CisJREVTX2VuY3J5cHQyKGRhdGEsIChERVNfa2V5X3NjaGVkdWxlICopa3MsIGVuYyk7CisJfQordm9pZCBfb3NzbF9vbGRfZGVzX2VuY3J5cHQzKERFU19MT05HICpkYXRhLCBkZXNfa2V5X3NjaGVkdWxlIGtzMSwKKwlkZXNfa2V5X3NjaGVkdWxlIGtzMiwgZGVzX2tleV9zY2hlZHVsZSBrczMpCisJeworCURFU19lbmNyeXB0MyhkYXRhLCAoREVTX2tleV9zY2hlZHVsZSAqKWtzMSwgKERFU19rZXlfc2NoZWR1bGUgKilrczIsCisJCShERVNfa2V5X3NjaGVkdWxlICopa3MzKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfZGVjcnlwdDMoREVTX0xPTkcgKmRhdGEsIGRlc19rZXlfc2NoZWR1bGUga3MxLAorCWRlc19rZXlfc2NoZWR1bGUga3MyLCBkZXNfa2V5X3NjaGVkdWxlIGtzMykKKwl7CisJREVTX2RlY3J5cHQzKGRhdGEsIChERVNfa2V5X3NjaGVkdWxlICopa3MxLCAoREVTX2tleV9zY2hlZHVsZSAqKWtzMiwKKwkJKERFU19rZXlfc2NoZWR1bGUgKilrczMpOworCX0KK3ZvaWQgX29zc2xfb2xkX2Rlc19lZGUzX2NiY19lbmNyeXB0KF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCwgX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCwgCisJbG9uZyBsZW5ndGgsIGRlc19rZXlfc2NoZWR1bGUga3MxLCBkZXNfa2V5X3NjaGVkdWxlIGtzMiwgCisJZGVzX2tleV9zY2hlZHVsZSBrczMsIF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLCBpbnQgZW5jKQorCXsKKwlERVNfZWRlM19jYmNfZW5jcnlwdCgodW5zaWduZWQgY2hhciAqKWlucHV0LCAodW5zaWduZWQgY2hhciAqKW91dHB1dCwKKwkJbGVuZ3RoLCAoREVTX2tleV9zY2hlZHVsZSAqKWtzMSwgKERFU19rZXlfc2NoZWR1bGUgKilrczIsCisJCShERVNfa2V5X3NjaGVkdWxlICopa3MzLCBpdmVjLCBlbmMpOworCX0KK3ZvaWQgX29zc2xfb2xkX2Rlc19lZGUzX2NmYjY0X2VuY3J5cHQodW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwlsb25nIGxlbmd0aCwgZGVzX2tleV9zY2hlZHVsZSBrczEsIGRlc19rZXlfc2NoZWR1bGUga3MyLAorCWRlc19rZXlfc2NoZWR1bGUga3MzLCBfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYywgaW50ICpudW0sIGludCBlbmMpCisJeworCURFU19lZGUzX2NmYjY0X2VuY3J5cHQoaW4sIG91dCwgbGVuZ3RoLAorCQkoREVTX2tleV9zY2hlZHVsZSAqKWtzMSwgKERFU19rZXlfc2NoZWR1bGUgKilrczIsCisJCShERVNfa2V5X3NjaGVkdWxlICopa3MzLCBpdmVjLCBudW0sIGVuYyk7CisJfQordm9pZCBfb3NzbF9vbGRfZGVzX2VkZTNfb2ZiNjRfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCWxvbmcgbGVuZ3RoLCBkZXNfa2V5X3NjaGVkdWxlIGtzMSwgZGVzX2tleV9zY2hlZHVsZSBrczIsCisJZGVzX2tleV9zY2hlZHVsZSBrczMsIF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLCBpbnQgKm51bSkKKwl7CisJREVTX2VkZTNfb2ZiNjRfZW5jcnlwdChpbiwgb3V0LCBsZW5ndGgsCisJCShERVNfa2V5X3NjaGVkdWxlICopa3MxLCAoREVTX2tleV9zY2hlZHVsZSAqKWtzMiwKKwkJKERFU19rZXlfc2NoZWR1bGUgKilrczMsIGl2ZWMsIG51bSk7CisJfQorCisjaWYgMCAvKiBicm9rZW4gY29kZSwgcHJlc2VydmVkIGp1c3QgaW4gY2FzZSBhbnlvbmUgc3BlY2lmaWNhbGx5IGxvb2tzIGZvciB0aGlzICovCit2b2lkIF9vc3NsX29sZF9kZXNfeHdoaXRlX2luMm91dChfb3NzbF9vbGRfZGVzX2NibG9jayAoKmRlc19rZXkpLCBfb3NzbF9vbGRfZGVzX2NibG9jayAoKmluX3doaXRlKSwKKwlfb3NzbF9vbGRfZGVzX2NibG9jayAoKm91dF93aGl0ZSkpCisJeworCURFU194d2hpdGVfaW4yb3V0KGRlc19rZXksIGluX3doaXRlLCBvdXRfd2hpdGUpOworCX0KKyNlbmRpZgorCitpbnQgX29zc2xfb2xkX2Rlc19lbmNfcmVhZChpbnQgZmQsY2hhciAqYnVmLGludCBsZW4sZGVzX2tleV9zY2hlZHVsZSBzY2hlZCwKKwlfb3NzbF9vbGRfZGVzX2NibG9jayAqaXYpCisJeworCXJldHVybiBERVNfZW5jX3JlYWQoZmQsIGJ1ZiwgbGVuLCAoREVTX2tleV9zY2hlZHVsZSAqKXNjaGVkLCBpdik7CisJfQoraW50IF9vc3NsX29sZF9kZXNfZW5jX3dyaXRlKGludCBmZCxjaGFyICpidWYsaW50IGxlbixkZXNfa2V5X3NjaGVkdWxlIHNjaGVkLAorCV9vc3NsX29sZF9kZXNfY2Jsb2NrICppdikKKwl7CisJcmV0dXJuIERFU19lbmNfd3JpdGUoZmQsIGJ1ZiwgbGVuLCAoREVTX2tleV9zY2hlZHVsZSAqKXNjaGVkLCBpdik7CisJfQorY2hhciAqX29zc2xfb2xkX2Rlc19mY3J5cHQoY29uc3QgY2hhciAqYnVmLGNvbnN0IGNoYXIgKnNhbHQsIGNoYXIgKnJldCkKKwl7CisJcmV0dXJuIERFU19mY3J5cHQoYnVmLCBzYWx0LCByZXQpOworCX0KK2NoYXIgKl9vc3NsX29sZF9kZXNfY3J5cHQoY29uc3QgY2hhciAqYnVmLGNvbnN0IGNoYXIgKnNhbHQpCisJeworCXJldHVybiBERVNfY3J5cHQoYnVmLCBzYWx0KTsKKwl9CitjaGFyICpfb3NzbF9vbGRfY3J5cHQoY29uc3QgY2hhciAqYnVmLGNvbnN0IGNoYXIgKnNhbHQpCisJeworCXJldHVybiBERVNfY3J5cHQoYnVmLCBzYWx0KTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfb2ZiX2VuY3J5cHQodW5zaWduZWQgY2hhciAqaW4sdW5zaWduZWQgY2hhciAqb3V0LAorCWludCBudW1iaXRzLGxvbmcgbGVuZ3RoLGRlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMpCisJeworCURFU19vZmJfZW5jcnlwdChpbiwgb3V0LCBudW1iaXRzLCBsZW5ndGgsIChERVNfa2V5X3NjaGVkdWxlICopc2NoZWR1bGUsCisJCWl2ZWMpOworCX0KK3ZvaWQgX29zc2xfb2xkX2Rlc19wY2JjX2VuY3J5cHQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmlucHV0LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXRwdXQsbG9uZyBsZW5ndGgsCisJZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSxfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYyxpbnQgZW5jKQorCXsKKwlERVNfcGNiY19lbmNyeXB0KCh1bnNpZ25lZCBjaGFyICopaW5wdXQsICh1bnNpZ25lZCBjaGFyICopb3V0cHV0LAorCQlsZW5ndGgsIChERVNfa2V5X3NjaGVkdWxlICopc2NoZWR1bGUsIGl2ZWMsIGVuYyk7CisJfQorREVTX0xPTkcgX29zc2xfb2xkX2Rlc19xdWFkX2Nrc3VtKF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LAorCWxvbmcgbGVuZ3RoLGludCBvdXRfY291bnQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKnNlZWQpCisJeworCXJldHVybiBERVNfcXVhZF9ja3N1bSgodW5zaWduZWQgY2hhciAqKWlucHV0LCBvdXRwdXQsIGxlbmd0aCwKKwkJb3V0X2NvdW50LCBzZWVkKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfcmFuZG9tX3NlZWQoX29zc2xfb2xkX2Rlc19jYmxvY2sga2V5KQorCXsKKwlSQU5EX3NlZWQoa2V5LCBzaXplb2YoX29zc2xfb2xkX2Rlc19jYmxvY2spKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfcmFuZG9tX2tleShfb3NzbF9vbGRfZGVzX2NibG9jayByZXQpCisJeworCURFU19yYW5kb21fa2V5KChERVNfY2Jsb2NrICopcmV0KTsKKwl9CitpbnQgX29zc2xfb2xkX2Rlc19yZWFkX3Bhc3N3b3JkKF9vc3NsX29sZF9kZXNfY2Jsb2NrICprZXksIGNvbnN0IGNoYXIgKnByb21wdCwKKwkJCQlpbnQgdmVyaWZ5KQorCXsKKwlyZXR1cm4gREVTX3JlYWRfcGFzc3dvcmQoa2V5LCBwcm9tcHQsIHZlcmlmeSk7CisJfQoraW50IF9vc3NsX29sZF9kZXNfcmVhZF8ycGFzc3dvcmRzKF9vc3NsX29sZF9kZXNfY2Jsb2NrICprZXkxLCBfb3NzbF9vbGRfZGVzX2NibG9jayAqa2V5MiwKKwljb25zdCBjaGFyICpwcm9tcHQsIGludCB2ZXJpZnkpCisJeworCXJldHVybiBERVNfcmVhZF8ycGFzc3dvcmRzKGtleTEsIGtleTIsIHByb21wdCwgdmVyaWZ5KTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfc2V0X29kZF9wYXJpdHkoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSkKKwl7CisJREVTX3NldF9vZGRfcGFyaXR5KGtleSk7CisJfQoraW50IF9vc3NsX29sZF9kZXNfaXNfd2Vha19rZXkoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSkKKwl7CisJcmV0dXJuIERFU19pc193ZWFrX2tleShrZXkpOworCX0KK2ludCBfb3NzbF9vbGRfZGVzX3NldF9rZXkoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSxkZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlKQorCXsKKwlyZXR1cm4gREVTX3NldF9rZXkoa2V5LCAoREVTX2tleV9zY2hlZHVsZSAqKXNjaGVkdWxlKTsKKwl9CitpbnQgX29zc2xfb2xkX2Rlc19rZXlfc2NoZWQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSxkZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlKQorCXsKKwlyZXR1cm4gREVTX2tleV9zY2hlZChrZXksIChERVNfa2V5X3NjaGVkdWxlICopc2NoZWR1bGUpOworCX0KK3ZvaWQgX29zc2xfb2xkX2Rlc19zdHJpbmdfdG9fa2V5KGNoYXIgKnN0cixfb3NzbF9vbGRfZGVzX2NibG9jayAqa2V5KQorCXsKKwlERVNfc3RyaW5nX3RvX2tleShzdHIsIGtleSk7CisJfQordm9pZCBfb3NzbF9vbGRfZGVzX3N0cmluZ190b18ya2V5cyhjaGFyICpzdHIsX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleTEsX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleTIpCisJeworCURFU19zdHJpbmdfdG9fMmtleXMoc3RyLCBrZXkxLCBrZXkyKTsKKwl9Cit2b2lkIF9vc3NsX29sZF9kZXNfY2ZiNjRfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwlkZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlLCBfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYywgaW50ICpudW0sIGludCBlbmMpCisJeworCURFU19jZmI2NF9lbmNyeXB0KGluLCBvdXQsIGxlbmd0aCwgKERFU19rZXlfc2NoZWR1bGUgKilzY2hlZHVsZSwKKwkJaXZlYywgbnVtLCBlbmMpOworCX0KK3ZvaWQgX29zc2xfb2xkX2Rlc19vZmI2NF9lbmNyeXB0KHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCWRlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsIF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLCBpbnQgKm51bSkKKwl7CisJREVTX29mYjY0X2VuY3J5cHQoaW4sIG91dCwgbGVuZ3RoLCAoREVTX2tleV9zY2hlZHVsZSAqKXNjaGVkdWxlLAorCQlpdmVjLCBudW0pOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfb2xkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyYzM3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZC5oCkBAIC0wLDAgKzEsNDQ2IEBACisvKiBjcnlwdG8vZGVzL2Rlc19vbGQuaCAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworCisvKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKKyAqCisgKiBUaGUgZnVuY3Rpb24gbmFtZXMgaW4gaGVyZSBhcmUgZGVwcmVjYXRlZCBhbmQgYXJlIG9ubHkgcHJlc2VudCB0bworICogcHJvdmlkZSBhbiBpbnRlcmZhY2UgY29tcGF0aWJsZSB3aXRoIG9wZW5zc2wgMC45LjYgYW5kIG9sZGVyIGFzCisgKiB3ZWxsIGFzIGxpYmRlcy4gIE9wZW5TU0wgbm93IHByb3ZpZGVzIGZ1bmN0aW9ucyB3aGVyZSAiZGVzXyIgaGFzCisgKiBiZWVuIHJlcGxhY2VkIHdpdGggIkRFU18iIGluIHRoZSBuYW1lcywgdG8gbWFrZSBpdCBwb3NzaWJsZSB0bworICogbWFrZSBpbmNvbXBhdGlibGUgY2hhbmdlcyB0aGF0IGFyZSBuZWVkZWQgZm9yIEMgdHlwZSBzZWN1cml0eSBhbmQKKyAqIG90aGVyIHN0dWZmLgorICoKKyAqIFRoaXMgaW5jbHVkZSBmaWxlcyBoYXMgdHdvIGNvbXBhdGliaWxpdHkgbW9kZXM6CisgKgorICogICAtIElmIE9QRU5TU0xfREVTX0xJQkRFU19DT01QQVRJQklMSVRZIGlzIGRlZmluZWQsIHlvdSBnZXQgYW4gQVBJCisgKiAgICAgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggbGliZGVzIGFuZCBTU0xlYXkuCisgKiAgIC0gSWYgT1BFTlNTTF9ERVNfTElCREVTX0NPTVBBVElCSUxJVFkgaXNuJ3QgZGVmaW5lZCwgeW91IGdldCBhbgorICogICAgIEFQSSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBPcGVuU1NMIDAuOS41eCB0byAwLjkuNnguCisgKgorICogTm90ZSB0aGF0IHRoZXNlIG1vZGVzIGJyZWFrIGVhcmxpZXIgc25hcHNob3RzIG9mIE9wZW5TU0wsIHdoZXJlCisgKiBsaWJkZXMgY29tcGF0aWJpbGl0eSB3YXMgdGhlIG9ubHkgYXZhaWxhYmxlIG1vZGUgb3IgKGxhdGVyIG9uKSB0aGUKKyAqIHByZWZlcmVkIGNvbXBhdGliaWxpdHkgbW9kZS4gIEhvd2V2ZXIsIGFmdGVyIG11Y2ggY29uc2lkZXJhdGlvbgorICogKGFuZCBtb3JlIG9yIGxlc3MgdmlvbGVudCBkaXNjdXNzaW9ucyB3aXRoIGV4dGVybmFsIHBhcnRpZXMpLCBpdAorICogd2FzIGNvbmNsdWRlZCB0aGF0IE9wZW5TU0wgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBlYXJsaWVyIHZlcnNpb25zCisgKiBvZiBpdHNlbGYgYmVmb3JlIGFueXRoaW5nIGVsc2UuICBBbHNvLCBpbiBhbGwgaG9uZXN0eSwgbGliZGVzIGlzCisgKiBhbiBvbGQgYmVhc3QgdGhhdCBzaG91bGRuJ3QgcmVhbGx5IGJlIHVzZWQgYW55IG1vcmUuCisgKgorICogUGxlYXNlIGNvbnNpZGVyIHN0YXJ0aW5nIHRvIHVzZSB0aGUgREVTXyBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gdGhlCisgKiBkZXNfIG9uZXMuICBUaGUgZGVzXyBmdW5jdGlvbnMgd2lsbCBkaXNhcHBlYXIgY29tcGxldGVseSBiZWZvcmUKKyAqIE9wZW5TU0wgMS4wIQorICoKKyAqIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORworICovCisKKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX0RFU19ICisjZGVmaW5lIEhFQURFUl9ERVNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgkvKiBPUEVOU1NMX0VYVEVSTiwgT1BFTlNTTF9OT19ERVMsIERFU19MT05HICovCisKKyNpZmRlZiBPUEVOU1NMX05PX0RFUworI2Vycm9yIERFUyBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjaWZuZGVmIEhFQURFUl9ORVdfREVTX0gKKyNlcnJvciBZb3UgbXVzdCBpbmNsdWRlIGRlcy5oLCBub3QgZGVzX29sZC5oIGRpcmVjdGx5LgorI2VuZGlmCisKKyNpZmRlZiBfS0VSQkVST1NfREVTX0gKKyNlcnJvciA8b3BlbnNzbC9kZXNfb2xkLmg+IHJlcGxhY2VzIDxrZXJiZXJvcy9kZXMuaD4uCisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvc3ltaGFja3MuaD4KKworI2lmZGVmIE9QRU5TU0xfQlVJTERfU0hMSUJDUllQVE8KKyMgdW5kZWYgT1BFTlNTTF9FWFRFUk4KKyMgZGVmaW5lIE9QRU5TU0xfRVhURVJOIE9QRU5TU0xfRVhQT1JUCisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIF8KKyN1bmRlZiBfCisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIF9vc3NsX29sZF9kZXNfY2Jsb2NrWzhdOwordHlwZWRlZiBzdHJ1Y3QgX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3QKKwl7CisJdW5pb24JeworCQlfb3NzbF9vbGRfZGVzX2NibG9jayBfOworCQkvKiBtYWtlIHN1cmUgdGhpbmdzIGFyZSBjb3JyZWN0IHNpemUgb24gbWFjaGluZXMgd2l0aAorCQkgKiA4IGJ5dGUgbG9uZ3MgKi8KKwkJREVTX0xPTkcgcGFkWzJdOworCQl9IGtzOworCX0gX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGVbMTZdOworCisjaWZuZGVmIE9QRU5TU0xfREVTX0xJQkRFU19DT01QQVRJQklMSVRZCisjZGVmaW5lIGRlc19jYmxvY2sgREVTX2NibG9jaworI2RlZmluZSBjb25zdF9kZXNfY2Jsb2NrIGNvbnN0X0RFU19jYmxvY2sKKyNkZWZpbmUgZGVzX2tleV9zY2hlZHVsZSBERVNfa2V5X3NjaGVkdWxlCisjZGVmaW5lIGRlc19lY2IzX2VuY3J5cHQoaSxvLGsxLGsyLGszLGUpXAorCURFU19lY2IzX2VuY3J5cHQoKGkpLChvKSwmKGsxKSwmKGsyKSwmKGszKSwoZSkpCisjZGVmaW5lIGRlc19lZGUzX2NiY19lbmNyeXB0KGksbyxsLGsxLGsyLGszLGl2LGUpXAorCURFU19lZGUzX2NiY19lbmNyeXB0KChpKSwobyksKGwpLCYoazEpLCYoazIpLCYoazMpLChpdiksKGUpKQorI2RlZmluZSBkZXNfZWRlM19jYmNtX2VuY3J5cHQoaSxvLGwsazEsazIsazMsaXYxLGl2MixlKVwKKwlERVNfZWRlM19jYmNtX2VuY3J5cHQoKGkpLChvKSwobCksJihrMSksJihrMiksJihrMyksKGl2MSksKGl2MiksKGUpKQorI2RlZmluZSBkZXNfZWRlM19jZmI2NF9lbmNyeXB0KGksbyxsLGsxLGsyLGszLGl2LG4sZSlcCisJREVTX2VkZTNfY2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwmKGsxKSwmKGsyKSwmKGszKSwoaXYpLChuKSwoZSkpCisjZGVmaW5lIGRlc19lZGUzX29mYjY0X2VuY3J5cHQoaSxvLGwsazEsazIsazMsaXYsbilcCisJREVTX2VkZTNfb2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwmKGsxKSwmKGsyKSwmKGszKSwoaXYpLChuKSkKKyNkZWZpbmUgZGVzX29wdGlvbnMoKVwKKwlERVNfb3B0aW9ucygpCisjZGVmaW5lIGRlc19jYmNfY2tzdW0oaSxvLGwsayxpdilcCisJREVTX2NiY19ja3N1bSgoaSksKG8pLChsKSwmKGspLChpdikpCisjZGVmaW5lIGRlc19jYmNfZW5jcnlwdChpLG8sbCxrLGl2LGUpXAorCURFU19jYmNfZW5jcnlwdCgoaSksKG8pLChsKSwmKGspLChpdiksKGUpKQorI2RlZmluZSBkZXNfbmNiY19lbmNyeXB0KGksbyxsLGssaXYsZSlcCisJREVTX25jYmNfZW5jcnlwdCgoaSksKG8pLChsKSwmKGspLChpdiksKGUpKQorI2RlZmluZSBkZXNfeGNiY19lbmNyeXB0KGksbyxsLGssaXYsaW53LG91dHcsZSlcCisJREVTX3hjYmNfZW5jcnlwdCgoaSksKG8pLChsKSwmKGspLChpdiksKGludyksKG91dHcpLChlKSkKKyNkZWZpbmUgZGVzX2NmYl9lbmNyeXB0KGksbyxuLGwsayxpdixlKVwKKwlERVNfY2ZiX2VuY3J5cHQoKGkpLChvKSwobiksKGwpLCYoayksKGl2KSwoZSkpCisjZGVmaW5lIGRlc19lY2JfZW5jcnlwdChpLG8sayxlKVwKKwlERVNfZWNiX2VuY3J5cHQoKGkpLChvKSwmKGspLChlKSkKKyNkZWZpbmUgZGVzX2VuY3J5cHQxKGQsayxlKVwKKwlERVNfZW5jcnlwdDEoKGQpLCYoayksKGUpKQorI2RlZmluZSBkZXNfZW5jcnlwdDIoZCxrLGUpXAorCURFU19lbmNyeXB0MigoZCksJihrKSwoZSkpCisjZGVmaW5lIGRlc19lbmNyeXB0MyhkLGsxLGsyLGszKVwKKwlERVNfZW5jcnlwdDMoKGQpLCYoazEpLCYoazIpLCYoazMpKQorI2RlZmluZSBkZXNfZGVjcnlwdDMoZCxrMSxrMixrMylcCisJREVTX2RlY3J5cHQzKChkKSwmKGsxKSwmKGsyKSwmKGszKSkKKyNkZWZpbmUgZGVzX3h3aGl0ZV9pbjJvdXQoayxpLG8pXAorCURFU194d2hpdGVfaW4yb3V0KChrKSwoaSksKG8pKQorI2RlZmluZSBkZXNfZW5jX3JlYWQoZixiLGwsayxpdilcCisJREVTX2VuY19yZWFkKChmKSwoYiksKGwpLCYoayksKGl2KSkKKyNkZWZpbmUgZGVzX2VuY193cml0ZShmLGIsbCxrLGl2KVwKKwlERVNfZW5jX3dyaXRlKChmKSwoYiksKGwpLCYoayksKGl2KSkKKyNkZWZpbmUgZGVzX2ZjcnlwdChiLHMscilcCisJREVTX2ZjcnlwdCgoYiksKHMpLChyKSkKKyNpZiAwCisjZGVmaW5lIGRlc19jcnlwdChiLHMpXAorCURFU19jcnlwdCgoYiksKHMpKQorI2lmICFkZWZpbmVkKFBFUkw1KSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgJiYgIWRlZmluZWQoTmVYVCkgJiYgIWRlZmluZWQoX19PcGVuQlNEX18pCisjZGVmaW5lIGNyeXB0KGIscylcCisJREVTX2NyeXB0KChiKSwocykpCisjZW5kaWYKKyNlbmRpZgorI2RlZmluZSBkZXNfb2ZiX2VuY3J5cHQoaSxvLG4sbCxrLGl2KVwKKwlERVNfb2ZiX2VuY3J5cHQoKGkpLChvKSwobiksKGwpLCYoayksKGl2KSkKKyNkZWZpbmUgZGVzX3BjYmNfZW5jcnlwdChpLG8sbCxrLGl2LGUpXAorCURFU19wY2JjX2VuY3J5cHQoKGkpLChvKSwobCksJihrKSwoaXYpLChlKSkKKyNkZWZpbmUgZGVzX3F1YWRfY2tzdW0oaSxvLGwsYyxzKVwKKwlERVNfcXVhZF9ja3N1bSgoaSksKG8pLChsKSwoYyksKHMpKQorI2RlZmluZSBkZXNfcmFuZG9tX3NlZWQoaylcCisJX29zc2xfMDk2X2Rlc19yYW5kb21fc2VlZCgoaykpCisjZGVmaW5lIGRlc19yYW5kb21fa2V5KHIpXAorCURFU19yYW5kb21fa2V5KChyKSkKKyNkZWZpbmUgZGVzX3JlYWRfcGFzc3dvcmQoayxwLHYpIFwKKwlERVNfcmVhZF9wYXNzd29yZCgoayksKHApLCh2KSkKKyNkZWZpbmUgZGVzX3JlYWRfMnBhc3N3b3JkcyhrMSxrMixwLHYpIFwKKwlERVNfcmVhZF8ycGFzc3dvcmRzKChrMSksKGsyKSwocCksKHYpKQorI2RlZmluZSBkZXNfc2V0X29kZF9wYXJpdHkoaylcCisJREVTX3NldF9vZGRfcGFyaXR5KChrKSkKKyNkZWZpbmUgZGVzX2NoZWNrX2tleV9wYXJpdHkoaylcCisJREVTX2NoZWNrX2tleV9wYXJpdHkoKGspKQorI2RlZmluZSBkZXNfaXNfd2Vha19rZXkoaylcCisJREVTX2lzX3dlYWtfa2V5KChrKSkKKyNkZWZpbmUgZGVzX3NldF9rZXkoayxrcylcCisJREVTX3NldF9rZXkoKGspLCYoa3MpKQorI2RlZmluZSBkZXNfa2V5X3NjaGVkKGssa3MpXAorCURFU19rZXlfc2NoZWQoKGspLCYoa3MpKQorI2RlZmluZSBkZXNfc2V0X2tleV9jaGVja2VkKGssa3MpXAorCURFU19zZXRfa2V5X2NoZWNrZWQoKGspLCYoa3MpKQorI2RlZmluZSBkZXNfc2V0X2tleV91bmNoZWNrZWQoayxrcylcCisJREVTX3NldF9rZXlfdW5jaGVja2VkKChrKSwmKGtzKSkKKyNkZWZpbmUgZGVzX3N0cmluZ190b19rZXkocyxrKVwKKwlERVNfc3RyaW5nX3RvX2tleSgocyksKGspKQorI2RlZmluZSBkZXNfc3RyaW5nX3RvXzJrZXlzKHMsazEsazIpXAorCURFU19zdHJpbmdfdG9fMmtleXMoKHMpLChrMSksKGsyKSkKKyNkZWZpbmUgZGVzX2NmYjY0X2VuY3J5cHQoaSxvLGwsa3MsaXYsbixlKVwKKwlERVNfY2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwmKGtzKSwoaXYpLChuKSwoZSkpCisjZGVmaW5lIGRlc19vZmI2NF9lbmNyeXB0KGksbyxsLGtzLGl2LG4pXAorCURFU19vZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLCYoa3MpLChpdiksKG4pKQorCQkKKworI2RlZmluZSBkZXNfZWNiMl9lbmNyeXB0KGksbyxrMSxrMixlKSBcCisJZGVzX2VjYjNfZW5jcnlwdCgoaSksKG8pLChrMSksKGsyKSwoazEpLChlKSkKKworI2RlZmluZSBkZXNfZWRlMl9jYmNfZW5jcnlwdChpLG8sbCxrMSxrMixpdixlKSBcCisJZGVzX2VkZTNfY2JjX2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMSksKGl2KSwoZSkpCisKKyNkZWZpbmUgZGVzX2VkZTJfY2ZiNjRfZW5jcnlwdChpLG8sbCxrMSxrMixpdixuLGUpIFwKKwlkZXNfZWRlM19jZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLChrMSksKGsyKSwoazEpLChpdiksKG4pLChlKSkKKworI2RlZmluZSBkZXNfZWRlMl9vZmI2NF9lbmNyeXB0KGksbyxsLGsxLGsyLGl2LG4pIFwKKwlkZXNfZWRlM19vZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLChrMSksKGsyKSwoazEpLChpdiksKG4pKQorCisjZGVmaW5lIGRlc19jaGVja19rZXkgREVTX2NoZWNrX2tleQorI2RlZmluZSBkZXNfcndfbW9kZSBERVNfcndfbW9kZQorI2Vsc2UgLyogbGliZGVzIGNvbXBhdGliaWxpdHkgKi8KKy8qIE1hcCBhbGwgc3ltYm9sIG5hbWVzIHRvIF9vc3NsX29sZF9kZXNfKiBmb3JtLCBzbyB3ZSBhdm9pZCBhbGwKKyAgIGNsYXNoZXMgd2l0aCBsaWJkZXMgKi8KKyNkZWZpbmUgZGVzX2NibG9jayBfb3NzbF9vbGRfZGVzX2NibG9jaworI2RlZmluZSBkZXNfa2V5X3NjaGVkdWxlIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlCisjZGVmaW5lIGRlc19lY2IzX2VuY3J5cHQoaSxvLGsxLGsyLGszLGUpXAorCV9vc3NsX29sZF9kZXNfZWNiM19lbmNyeXB0KChpKSwobyksKGsxKSwoazIpLChrMyksKGUpKQorI2RlZmluZSBkZXNfZWRlM19jYmNfZW5jcnlwdChpLG8sbCxrMSxrMixrMyxpdixlKVwKKwlfb3NzbF9vbGRfZGVzX2VkZTNfY2JjX2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMyksKGl2KSwoZSkpCisjZGVmaW5lIGRlc19lZGUzX2NmYjY0X2VuY3J5cHQoaSxvLGwsazEsazIsazMsaXYsbixlKVwKKwlfb3NzbF9vbGRfZGVzX2VkZTNfY2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwoazEpLChrMiksKGszKSwoaXYpLChuKSwoZSkpCisjZGVmaW5lIGRlc19lZGUzX29mYjY0X2VuY3J5cHQoaSxvLGwsazEsazIsazMsaXYsbilcCisJX29zc2xfb2xkX2Rlc19lZGUzX29mYjY0X2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMyksKGl2KSwobikpCisjZGVmaW5lIGRlc19vcHRpb25zKClcCisJX29zc2xfb2xkX2Rlc19vcHRpb25zKCkKKyNkZWZpbmUgZGVzX2NiY19ja3N1bShpLG8sbCxrLGl2KVwKKwlfb3NzbF9vbGRfZGVzX2NiY19ja3N1bSgoaSksKG8pLChsKSwoayksKGl2KSkKKyNkZWZpbmUgZGVzX2NiY19lbmNyeXB0KGksbyxsLGssaXYsZSlcCisJX29zc2xfb2xkX2Rlc19jYmNfZW5jcnlwdCgoaSksKG8pLChsKSwoayksKGl2KSwoZSkpCisjZGVmaW5lIGRlc19uY2JjX2VuY3J5cHQoaSxvLGwsayxpdixlKVwKKwlfb3NzbF9vbGRfZGVzX25jYmNfZW5jcnlwdCgoaSksKG8pLChsKSwoayksKGl2KSwoZSkpCisjZGVmaW5lIGRlc194Y2JjX2VuY3J5cHQoaSxvLGwsayxpdixpbncsb3V0dyxlKVwKKwlfb3NzbF9vbGRfZGVzX3hjYmNfZW5jcnlwdCgoaSksKG8pLChsKSwoayksKGl2KSwoaW53KSwob3V0dyksKGUpKQorI2RlZmluZSBkZXNfY2ZiX2VuY3J5cHQoaSxvLG4sbCxrLGl2LGUpXAorCV9vc3NsX29sZF9kZXNfY2ZiX2VuY3J5cHQoKGkpLChvKSwobiksKGwpLChrKSwoaXYpLChlKSkKKyNkZWZpbmUgZGVzX2VjYl9lbmNyeXB0KGksbyxrLGUpXAorCV9vc3NsX29sZF9kZXNfZWNiX2VuY3J5cHQoKGkpLChvKSwoayksKGUpKQorI2RlZmluZSBkZXNfZW5jcnlwdChkLGssZSlcCisJX29zc2xfb2xkX2Rlc19lbmNyeXB0KChkKSwoayksKGUpKQorI2RlZmluZSBkZXNfZW5jcnlwdDIoZCxrLGUpXAorCV9vc3NsX29sZF9kZXNfZW5jcnlwdDIoKGQpLChrKSwoZSkpCisjZGVmaW5lIGRlc19lbmNyeXB0MyhkLGsxLGsyLGszKVwKKwlfb3NzbF9vbGRfZGVzX2VuY3J5cHQzKChkKSwoazEpLChrMiksKGszKSkKKyNkZWZpbmUgZGVzX2RlY3J5cHQzKGQsazEsazIsazMpXAorCV9vc3NsX29sZF9kZXNfZGVjcnlwdDMoKGQpLChrMSksKGsyKSwoazMpKQorI2RlZmluZSBkZXNfeHdoaXRlX2luMm91dChrLGksbylcCisJX29zc2xfb2xkX2Rlc194d2hpdGVfaW4yb3V0KChrKSwoaSksKG8pKQorI2RlZmluZSBkZXNfZW5jX3JlYWQoZixiLGwsayxpdilcCisJX29zc2xfb2xkX2Rlc19lbmNfcmVhZCgoZiksKGIpLChsKSwoayksKGl2KSkKKyNkZWZpbmUgZGVzX2VuY193cml0ZShmLGIsbCxrLGl2KVwKKwlfb3NzbF9vbGRfZGVzX2VuY193cml0ZSgoZiksKGIpLChsKSwoayksKGl2KSkKKyNkZWZpbmUgZGVzX2ZjcnlwdChiLHMscilcCisJX29zc2xfb2xkX2Rlc19mY3J5cHQoKGIpLChzKSwocikpCisjZGVmaW5lIGRlc19jcnlwdChiLHMpXAorCV9vc3NsX29sZF9kZXNfY3J5cHQoKGIpLChzKSkKKyNpZiAwCisjZGVmaW5lIGNyeXB0KGIscylcCisJX29zc2xfb2xkX2NyeXB0KChiKSwocykpCisjZW5kaWYKKyNkZWZpbmUgZGVzX29mYl9lbmNyeXB0KGksbyxuLGwsayxpdilcCisJX29zc2xfb2xkX2Rlc19vZmJfZW5jcnlwdCgoaSksKG8pLChuKSwobCksKGspLChpdikpCisjZGVmaW5lIGRlc19wY2JjX2VuY3J5cHQoaSxvLGwsayxpdixlKVwKKwlfb3NzbF9vbGRfZGVzX3BjYmNfZW5jcnlwdCgoaSksKG8pLChsKSwoayksKGl2KSwoZSkpCisjZGVmaW5lIGRlc19xdWFkX2Nrc3VtKGksbyxsLGMscylcCisJX29zc2xfb2xkX2Rlc19xdWFkX2Nrc3VtKChpKSwobyksKGwpLChjKSwocykpCisjZGVmaW5lIGRlc19yYW5kb21fc2VlZChrKVwKKwlfb3NzbF9vbGRfZGVzX3JhbmRvbV9zZWVkKChrKSkKKyNkZWZpbmUgZGVzX3JhbmRvbV9rZXkocilcCisJX29zc2xfb2xkX2Rlc19yYW5kb21fa2V5KChyKSkKKyNkZWZpbmUgZGVzX3JlYWRfcGFzc3dvcmQoayxwLHYpIFwKKwlfb3NzbF9vbGRfZGVzX3JlYWRfcGFzc3dvcmQoKGspLChwKSwodikpCisjZGVmaW5lIGRlc19yZWFkXzJwYXNzd29yZHMoazEsazIscCx2KSBcCisJX29zc2xfb2xkX2Rlc19yZWFkXzJwYXNzd29yZHMoKGsxKSwoazIpLChwKSwodikpCisjZGVmaW5lIGRlc19zZXRfb2RkX3Bhcml0eShrKVwKKwlfb3NzbF9vbGRfZGVzX3NldF9vZGRfcGFyaXR5KChrKSkKKyNkZWZpbmUgZGVzX2lzX3dlYWtfa2V5KGspXAorCV9vc3NsX29sZF9kZXNfaXNfd2Vha19rZXkoKGspKQorI2RlZmluZSBkZXNfc2V0X2tleShrLGtzKVwKKwlfb3NzbF9vbGRfZGVzX3NldF9rZXkoKGspLChrcykpCisjZGVmaW5lIGRlc19rZXlfc2NoZWQoayxrcylcCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWQoKGspLChrcykpCisjZGVmaW5lIGRlc19zdHJpbmdfdG9fa2V5KHMsaylcCisJX29zc2xfb2xkX2Rlc19zdHJpbmdfdG9fa2V5KChzKSwoaykpCisjZGVmaW5lIGRlc19zdHJpbmdfdG9fMmtleXMocyxrMSxrMilcCisJX29zc2xfb2xkX2Rlc19zdHJpbmdfdG9fMmtleXMoKHMpLChrMSksKGsyKSkKKyNkZWZpbmUgZGVzX2NmYjY0X2VuY3J5cHQoaSxvLGwsa3MsaXYsbixlKVwKKwlfb3NzbF9vbGRfZGVzX2NmYjY0X2VuY3J5cHQoKGkpLChvKSwobCksKGtzKSwoaXYpLChuKSwoZSkpCisjZGVmaW5lIGRlc19vZmI2NF9lbmNyeXB0KGksbyxsLGtzLGl2LG4pXAorCV9vc3NsX29sZF9kZXNfb2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwoa3MpLChpdiksKG4pKQorCQkKKworI2RlZmluZSBkZXNfZWNiMl9lbmNyeXB0KGksbyxrMSxrMixlKSBcCisJZGVzX2VjYjNfZW5jcnlwdCgoaSksKG8pLChrMSksKGsyKSwoazEpLChlKSkKKworI2RlZmluZSBkZXNfZWRlMl9jYmNfZW5jcnlwdChpLG8sbCxrMSxrMixpdixlKSBcCisJZGVzX2VkZTNfY2JjX2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMSksKGl2KSwoZSkpCisKKyNkZWZpbmUgZGVzX2VkZTJfY2ZiNjRfZW5jcnlwdChpLG8sbCxrMSxrMixpdixuLGUpIFwKKwlkZXNfZWRlM19jZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLChrMSksKGsyKSwoazEpLChpdiksKG4pLChlKSkKKworI2RlZmluZSBkZXNfZWRlMl9vZmI2NF9lbmNyeXB0KGksbyxsLGsxLGsyLGl2LG4pIFwKKwlkZXNfZWRlM19vZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLChrMSksKGsyKSwoazEpLChpdiksKG4pKQorCisjZGVmaW5lIGRlc19jaGVja19rZXkgREVTX2NoZWNrX2tleQorI2RlZmluZSBkZXNfcndfbW9kZSBERVNfcndfbW9kZQorI2VuZGlmCisKK2NvbnN0IGNoYXIgKl9vc3NsX29sZF9kZXNfb3B0aW9ucyh2b2lkKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc19lY2IzX2VuY3J5cHQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmlucHV0LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXRwdXQsCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MxLF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMiwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczMsIGludCBlbmMpOworREVTX0xPTkcgX29zc2xfb2xkX2Rlc19jYmNfY2tzdW0oX29zc2xfb2xkX2Rlc19jYmxvY2sgKmlucHV0LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXRwdXQsCisJbG9uZyBsZW5ndGgsX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMpOwordm9pZCBfb3NzbF9vbGRfZGVzX2NiY19lbmNyeXB0KF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LGxvbmcgbGVuZ3RoLAorCV9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlLF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLGludCBlbmMpOwordm9pZCBfb3NzbF9vbGRfZGVzX25jYmNfZW5jcnlwdChfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCxsb25nIGxlbmd0aCwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSxfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYyxpbnQgZW5jKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc194Y2JjX2VuY3J5cHQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmlucHV0LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXRwdXQsbG9uZyBsZW5ndGgsCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsCisJX29zc2xfb2xkX2Rlc19jYmxvY2sgKmludyxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0dyxpbnQgZW5jKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc19jZmJfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsaW50IG51bWJpdHMsCisJbG9uZyBsZW5ndGgsX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsaW50IGVuYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfZWNiX2VuY3J5cHQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmlucHV0LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXRwdXQsCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MsaW50IGVuYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfZW5jcnlwdChERVNfTE9ORyAqZGF0YSxfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrcywgaW50IGVuYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfZW5jcnlwdDIoREVTX0xPTkcgKmRhdGEsX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MsIGludCBlbmMpOwordm9pZCBfb3NzbF9vbGRfZGVzX2VuY3J5cHQzKERFU19MT05HICpkYXRhLCBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczEsCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MyLCBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczMpOwordm9pZCBfb3NzbF9vbGRfZGVzX2RlY3J5cHQzKERFU19MT05HICpkYXRhLCBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczEsCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MyLCBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczMpOwordm9pZCBfb3NzbF9vbGRfZGVzX2VkZTNfY2JjX2VuY3J5cHQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmlucHV0LCBfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LCAKKwlsb25nIGxlbmd0aCwgX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MxLCBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczIsIAorCV9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMywgX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsIGludCBlbmMpOwordm9pZCBfb3NzbF9vbGRfZGVzX2VkZTNfY2ZiNjRfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCWxvbmcgbGVuZ3RoLCBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczEsIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMiwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczMsIF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLCBpbnQgKm51bSwgaW50IGVuYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfZWRlM19vZmI2NF9lbmNyeXB0KHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJbG9uZyBsZW5ndGgsIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMSwgX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MyLAorCV9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMywgX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsIGludCAqbnVtKTsKKyNpZiAwCit2b2lkIF9vc3NsX29sZF9kZXNfeHdoaXRlX2luMm91dChfb3NzbF9vbGRfZGVzX2NibG9jayAoKmRlc19rZXkpLCBfb3NzbF9vbGRfZGVzX2NibG9jayAoKmluX3doaXRlKSwKKwlfb3NzbF9vbGRfZGVzX2NibG9jayAoKm91dF93aGl0ZSkpOworI2VuZGlmCisKK2ludCBfb3NzbF9vbGRfZGVzX2VuY19yZWFkKGludCBmZCxjaGFyICpidWYsaW50IGxlbixfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZCwKKwlfb3NzbF9vbGRfZGVzX2NibG9jayAqaXYpOworaW50IF9vc3NsX29sZF9kZXNfZW5jX3dyaXRlKGludCBmZCxjaGFyICpidWYsaW50IGxlbixfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZCwKKwlfb3NzbF9vbGRfZGVzX2NibG9jayAqaXYpOworY2hhciAqX29zc2xfb2xkX2Rlc19mY3J5cHQoY29uc3QgY2hhciAqYnVmLGNvbnN0IGNoYXIgKnNhbHQsIGNoYXIgKnJldCk7CitjaGFyICpfb3NzbF9vbGRfZGVzX2NyeXB0KGNvbnN0IGNoYXIgKmJ1Zixjb25zdCBjaGFyICpzYWx0KTsKKyNpZiAhZGVmaW5lZChQRVJMNSkgJiYgIWRlZmluZWQoTmVYVCkKK2NoYXIgKl9vc3NsX29sZF9jcnlwdChjb25zdCBjaGFyICpidWYsY29uc3QgY2hhciAqc2FsdCk7CisjZW5kaWYKK3ZvaWQgX29zc2xfb2xkX2Rlc19vZmJfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsCisJaW50IG51bWJpdHMsbG9uZyBsZW5ndGgsX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMpOwordm9pZCBfb3NzbF9vbGRfZGVzX3BjYmNfZW5jcnlwdChfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCxsb25nIGxlbmd0aCwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSxfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYyxpbnQgZW5jKTsKK0RFU19MT05HIF9vc3NsX29sZF9kZXNfcXVhZF9ja3N1bShfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCwKKwlsb25nIGxlbmd0aCxpbnQgb3V0X2NvdW50LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpzZWVkKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc19yYW5kb21fc2VlZChfb3NzbF9vbGRfZGVzX2NibG9jayBrZXkpOwordm9pZCBfb3NzbF9vbGRfZGVzX3JhbmRvbV9rZXkoX29zc2xfb2xkX2Rlc19jYmxvY2sgcmV0KTsKK2ludCBfb3NzbF9vbGRfZGVzX3JlYWRfcGFzc3dvcmQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSxjb25zdCBjaGFyICpwcm9tcHQsaW50IHZlcmlmeSk7CitpbnQgX29zc2xfb2xkX2Rlc19yZWFkXzJwYXNzd29yZHMoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleTEsX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleTIsCisJY29uc3QgY2hhciAqcHJvbXB0LGludCB2ZXJpZnkpOwordm9pZCBfb3NzbF9vbGRfZGVzX3NldF9vZGRfcGFyaXR5KF9vc3NsX29sZF9kZXNfY2Jsb2NrICprZXkpOworaW50IF9vc3NsX29sZF9kZXNfaXNfd2Vha19rZXkoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSk7CitpbnQgX29zc2xfb2xkX2Rlc19zZXRfa2V5KF9vc3NsX29sZF9kZXNfY2Jsb2NrICprZXksX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUpOworaW50IF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkKF9vc3NsX29sZF9kZXNfY2Jsb2NrICprZXksX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUpOwordm9pZCBfb3NzbF9vbGRfZGVzX3N0cmluZ190b19rZXkoY2hhciAqc3RyLF9vc3NsX29sZF9kZXNfY2Jsb2NrICprZXkpOwordm9pZCBfb3NzbF9vbGRfZGVzX3N0cmluZ190b18ya2V5cyhjaGFyICpzdHIsX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleTEsX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleTIpOwordm9pZCBfb3NzbF9vbGRfZGVzX2NmYjY0X2VuY3J5cHQodW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwgbG9uZyBsZW5ndGgsCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsIF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLCBpbnQgKm51bSwgaW50IGVuYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfb2ZiNjRfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSwgX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsIGludCAqbnVtKTsKKwordm9pZCBfb3NzbF8wOTZfZGVzX3JhbmRvbV9zZWVkKGRlc19jYmxvY2sgKmtleSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgcHJvdmlkZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JVCBLZXJiZXJvcworICogbGlicmFyeS4gVGhlIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIHN0cnVjdHVyZSBpcyBub3QgYmluYXJ5IGNvbXBhdGlibGUuICovCisKKyNkZWZpbmUgX0tFUkJFUk9TX0RFU19ICisKKyNkZWZpbmUgS1JCREVTX0VOQ1JZUFQgREVTX0VOQ1JZUFQKKyNkZWZpbmUgS1JCREVTX0RFQ1JZUFQgREVTX0RFQ1JZUFQKKworI2lmZGVmIEtFUkJFUk9TCisjICBkZWZpbmUgRU5DUllQVCBERVNfRU5DUllQVAorIyAgZGVmaW5lIERFQ1JZUFQgREVTX0RFQ1JZUFQKKyNlbmRpZgorCisjaWZuZGVmIE5DT01QQVQKKyMgIGRlZmluZSBDX0Jsb2NrIGRlc19jYmxvY2sKKyMgIGRlZmluZSBLZXlfc2NoZWR1bGUgZGVzX2tleV9zY2hlZHVsZQorIyAgZGVmaW5lIEtFWV9TWiBERVNfS0VZX1NaCisjICBkZWZpbmUgc3RyaW5nX3RvX2tleSBkZXNfc3RyaW5nX3RvX2tleQorIyAgZGVmaW5lIHJlYWRfcHdfc3RyaW5nIGRlc19yZWFkX3B3X3N0cmluZworIyAgZGVmaW5lIHJhbmRvbV9rZXkgZGVzX3JhbmRvbV9rZXkKKyMgIGRlZmluZSBwY2JjX2VuY3J5cHQgZGVzX3BjYmNfZW5jcnlwdAorIyAgZGVmaW5lIHNldF9rZXkgZGVzX3NldF9rZXkKKyMgIGRlZmluZSBrZXlfc2NoZWQgZGVzX2tleV9zY2hlZAorIyAgZGVmaW5lIGVjYl9lbmNyeXB0IGRlc19lY2JfZW5jcnlwdAorIyAgZGVmaW5lIGNiY19lbmNyeXB0IGRlc19jYmNfZW5jcnlwdAorIyAgZGVmaW5lIG5jYmNfZW5jcnlwdCBkZXNfbmNiY19lbmNyeXB0CisjICBkZWZpbmUgeGNiY19lbmNyeXB0IGRlc194Y2JjX2VuY3J5cHQKKyMgIGRlZmluZSBjYmNfY2tzdW0gZGVzX2NiY19ja3N1bQorIyAgZGVmaW5lIHF1YWRfY2tzdW0gZGVzX3F1YWRfY2tzdW0KKyMgIGRlZmluZSBjaGVja19wYXJpdHkgZGVzX2NoZWNrX2tleV9wYXJpdHkKKyNlbmRpZgorCisjZGVmaW5lIGRlc19maXh1cF9rZXlfcGFyaXR5IERFU19maXh1cF9rZXlfcGFyaXR5CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKiBmb3IgREVTX3JlYWRfcHdfc3RyaW5nIGV0IGFsICovCisjaW5jbHVkZSA8b3BlbnNzbC91aV9jb21wYXQuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19vbGQyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19vbGQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhmYTNlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX29sZDIuYwpAQCAtMCwwICsxLDgyIEBACisvKiBjcnlwdG8vZGVzL2Rlc19vbGQuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworCisvKiBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKKyAqCisgKiBUaGUgZnVuY3Rpb24gbmFtZXMgaW4gaGVyZSBhcmUgZGVwcmVjYXRlZCBhbmQgYXJlIG9ubHkgcHJlc2VudCB0bworICogcHJvdmlkZSBhbiBpbnRlcmZhY2UgY29tcGF0aWJsZSB3aXRoIE9wZW5TU0wgMC45LjZjLiAgT3BlblNTTCBub3cKKyAqIHByb3ZpZGVzIGZ1bmN0aW9ucyB3aGVyZSAiZGVzXyIgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCAiREVTXyIgaW4KKyAqIHRoZSBuYW1lcywgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBtYWtlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRoYXQKKyAqIGFyZSBuZWVkZWQgZm9yIEMgdHlwZSBzZWN1cml0eSBhbmQgb3RoZXIgc3R1ZmYuCisgKgorICogUGxlYXNlIGNvbnNpZGVyIHN0YXJ0aW5nIHRvIHVzZSB0aGUgREVTXyBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gdGhlCisgKiBkZXNfIG9uZXMuICBUaGUgZGVzXyBmdW5jdGlvbnMgd2lsbCBkaXNzYXBlYXIgY29tcGxldGVseSBiZWZvcmUKKyAqIE9wZW5TU0wgMS4wIQorICoKKyAqIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORworICovCisKKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyN1bmRlZiBPUEVOU1NMX0RFU19MSUJERVNfQ09NUEFUSUJJTElUWQorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK3ZvaWQgX29zc2xfMDk2X2Rlc19yYW5kb21fc2VlZChERVNfY2Jsb2NrICprZXkpCisJeworCVJBTkRfc2VlZChrZXksIHNpemVvZihERVNfY2Jsb2NrKSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfb3B0cy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNfb3B0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZjgyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc19vcHRzLmMKQEAgLTAsMCArMSw2MDggQEAKKy8qIGNyeXB0by9kZXMvZGVzX29wdHMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBkZWZpbmUgUEFSVDEsIFBBUlQyLCBQQVJUMyBvciBQQVJUNCB0byBidWlsZCBvbmx5IHdpdGggYSBmZXcgb2YgdGhlIG9wdGlvbnMuCisgKiBUaGlzIGlzIGZvciBtYWNoaW5lcyB3aXRoIDY0ayBjb2RlIHNlZ21lbnQgc2l6ZSByZXN0cmljdGlvbnMuICovCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgKCFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChfX0RFQ0MpKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NQUNPU1gpCisjZGVmaW5lIFRJTUVTCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZuZGVmIE9QRU5TU0xfU1lTX01TRE9TCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorI2luY2x1ZGUgT1BFTlNTTF9VTklTVEQKKyNlbHNlCisjaW5jbHVkZSA8aW8uaD4KK2V4dGVybiB2b2lkIGV4aXQoKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfU1lTX05FVFdBUkUKKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9JUklYCisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjaWZkZWYgVElNRVMKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNlbmRpZgorCisvKiBEZXBlbmRpbmcgb24gdGhlIFZNUyB2ZXJzaW9uLCB0aGUgdG1zIHN0cnVjdHVyZSBpcyBwZXJoYXBzIGRlZmluZWQuCisgICBUaGUgX19UTVMgbWFjcm8gd2lsbCBzaG93IGlmIGl0IHdhcy4gIElmIGl0IHdhc24ndCBkZWZpbmVkLCB3ZSBzaG91bGQKKyAgIHVuZGVmaW5lIFRJTUVTLCBzaW5jZSB0aGF0IHRlbGxzIHRoZSByZXN0IG9mIHRoZSBwcm9ncmFtIGhvdyB0aGluZ3MKKyAgIHNob3VsZCBiZSBoYW5kbGVkLgkJCQktLSBSaWNoYXJkIExldml0dGUgKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNU19ERUNDKSAmJiAhZGVmaW5lZChfX1RNUykKKyN1bmRlZiBUSU1FUworI2VuZGlmCisKKyNpZm5kZWYgVElNRVMKKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKHN1bikgfHwgZGVmaW5lZChfX3VsdHJpeCkKKyNkZWZpbmUgX1BPU0lYX1NPVVJDRQorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgorI2luY2x1ZGUgInNwci5oIgorCisjZGVmaW5lIERFU19ERUZBVUxUX09QVElPTlMKKworI2lmICFkZWZpbmVkKFBBUlQxKSAmJiAhZGVmaW5lZChQQVJUMikgJiYgIWRlZmluZWQoUEFSVDMpICYmICFkZWZpbmVkKFBBUlQ0KQorI2RlZmluZSBQQVJUMQorI2RlZmluZSBQQVJUMgorI2RlZmluZSBQQVJUMworI2RlZmluZSBQQVJUNAorI2VuZGlmCisKKyNpZmRlZiBQQVJUMQorCisjdW5kZWYgREVTX1VOUk9MTAorI3VuZGVmIERFU19SSVNDMQorI3VuZGVmIERFU19SSVNDMgorI3VuZGVmIERFU19QVFIKKyN1bmRlZiBEX0VOQ1JZUFQKKyNkZWZpbmUgREVTX2VuY3J5cHQxIGRlc19lbmNyeXB0X3U0X2Npc2NfaWR4CisjZGVmaW5lIERFU19lbmNyeXB0MiBkZXNfZW5jcnlwdDJfdTRfY2lzY19pZHgKKyNkZWZpbmUgREVTX2VuY3J5cHQzIGRlc19lbmNyeXB0M191NF9jaXNjX2lkeAorI2RlZmluZSBERVNfZGVjcnlwdDMgZGVzX2RlY3J5cHQzX3U0X2Npc2NfaWR4CisjdW5kZWYgSEVBREVSX0RFU19MT0NMX0gKKyNpbmNsdWRlICJkZXNfZW5jLmMiCisKKyNkZWZpbmUgREVTX1VOUk9MTAorI3VuZGVmIERFU19SSVNDMQorI3VuZGVmIERFU19SSVNDMgorI3VuZGVmIERFU19QVFIKKyN1bmRlZiBEX0VOQ1JZUFQKKyN1bmRlZiBERVNfZW5jcnlwdDEKKyN1bmRlZiBERVNfZW5jcnlwdDIKKyN1bmRlZiBERVNfZW5jcnlwdDMKKyN1bmRlZiBERVNfZGVjcnlwdDMKKyNkZWZpbmUgREVTX2VuY3J5cHQxIGRlc19lbmNyeXB0X3UxNl9jaXNjX2lkeAorI2RlZmluZSBERVNfZW5jcnlwdDIgZGVzX2VuY3J5cHQyX3UxNl9jaXNjX2lkeAorI2RlZmluZSBERVNfZW5jcnlwdDMgZGVzX2VuY3J5cHQzX3UxNl9jaXNjX2lkeAorI2RlZmluZSBERVNfZGVjcnlwdDMgZGVzX2RlY3J5cHQzX3UxNl9jaXNjX2lkeAorI3VuZGVmIEhFQURFUl9ERVNfTE9DTF9ICisjaW5jbHVkZSAiZGVzX2VuYy5jIgorCisjdW5kZWYgREVTX1VOUk9MTAorI2RlZmluZSBERVNfUklTQzEKKyN1bmRlZiBERVNfUklTQzIKKyN1bmRlZiBERVNfUFRSCisjdW5kZWYgRF9FTkNSWVBUCisjdW5kZWYgREVTX2VuY3J5cHQxCisjdW5kZWYgREVTX2VuY3J5cHQyCisjdW5kZWYgREVTX2VuY3J5cHQzCisjdW5kZWYgREVTX2RlY3J5cHQzCisjZGVmaW5lIERFU19lbmNyeXB0MSBkZXNfZW5jcnlwdF91NF9yaXNjMV9pZHgKKyNkZWZpbmUgREVTX2VuY3J5cHQyIGRlc19lbmNyeXB0Ml91NF9yaXNjMV9pZHgKKyNkZWZpbmUgREVTX2VuY3J5cHQzIGRlc19lbmNyeXB0M191NF9yaXNjMV9pZHgKKyNkZWZpbmUgREVTX2RlY3J5cHQzIGRlc19kZWNyeXB0M191NF9yaXNjMV9pZHgKKyN1bmRlZiBIRUFERVJfREVTX0xPQ0xfSAorI2luY2x1ZGUgImRlc19lbmMuYyIKKworI2VuZGlmCisKKyNpZmRlZiBQQVJUMgorCisjdW5kZWYgREVTX1VOUk9MTAorI3VuZGVmIERFU19SSVNDMQorI2RlZmluZSBERVNfUklTQzIKKyN1bmRlZiBERVNfUFRSCisjdW5kZWYgRF9FTkNSWVBUCisjdW5kZWYgREVTX2VuY3J5cHQxCisjdW5kZWYgREVTX2VuY3J5cHQyCisjdW5kZWYgREVTX2VuY3J5cHQzCisjdW5kZWYgREVTX2RlY3J5cHQzCisjZGVmaW5lIERFU19lbmNyeXB0MSBkZXNfZW5jcnlwdF91NF9yaXNjMl9pZHgKKyNkZWZpbmUgREVTX2VuY3J5cHQyIGRlc19lbmNyeXB0Ml91NF9yaXNjMl9pZHgKKyNkZWZpbmUgREVTX2VuY3J5cHQzIGRlc19lbmNyeXB0M191NF9yaXNjMl9pZHgKKyNkZWZpbmUgREVTX2RlY3J5cHQzIGRlc19kZWNyeXB0M191NF9yaXNjMl9pZHgKKyN1bmRlZiBIRUFERVJfREVTX0xPQ0xfSAorI2luY2x1ZGUgImRlc19lbmMuYyIKKworI2RlZmluZSBERVNfVU5ST0xMCisjZGVmaW5lIERFU19SSVNDMQorI3VuZGVmIERFU19SSVNDMgorI3VuZGVmIERFU19QVFIKKyN1bmRlZiBEX0VOQ1JZUFQKKyN1bmRlZiBERVNfZW5jcnlwdDEKKyN1bmRlZiBERVNfZW5jcnlwdDIKKyN1bmRlZiBERVNfZW5jcnlwdDMKKyN1bmRlZiBERVNfZGVjcnlwdDMKKyNkZWZpbmUgREVTX2VuY3J5cHQxIGRlc19lbmNyeXB0X3UxNl9yaXNjMV9pZHgKKyNkZWZpbmUgREVTX2VuY3J5cHQyIGRlc19lbmNyeXB0Ml91MTZfcmlzYzFfaWR4CisjZGVmaW5lIERFU19lbmNyeXB0MyBkZXNfZW5jcnlwdDNfdTE2X3Jpc2MxX2lkeAorI2RlZmluZSBERVNfZGVjcnlwdDMgZGVzX2RlY3J5cHQzX3UxNl9yaXNjMV9pZHgKKyN1bmRlZiBIRUFERVJfREVTX0xPQ0xfSAorI2luY2x1ZGUgImRlc19lbmMuYyIKKworI2RlZmluZSBERVNfVU5ST0xMCisjdW5kZWYgREVTX1JJU0MxCisjZGVmaW5lIERFU19SSVNDMgorI3VuZGVmIERFU19QVFIKKyN1bmRlZiBEX0VOQ1JZUFQKKyN1bmRlZiBERVNfZW5jcnlwdDEKKyN1bmRlZiBERVNfZW5jcnlwdDIKKyN1bmRlZiBERVNfZW5jcnlwdDMKKyN1bmRlZiBERVNfZGVjcnlwdDMKKyNkZWZpbmUgREVTX2VuY3J5cHQxIGRlc19lbmNyeXB0X3UxNl9yaXNjMl9pZHgKKyNkZWZpbmUgREVTX2VuY3J5cHQyIGRlc19lbmNyeXB0Ml91MTZfcmlzYzJfaWR4CisjZGVmaW5lIERFU19lbmNyeXB0MyBkZXNfZW5jcnlwdDNfdTE2X3Jpc2MyX2lkeAorI2RlZmluZSBERVNfZGVjcnlwdDMgZGVzX2RlY3J5cHQzX3UxNl9yaXNjMl9pZHgKKyN1bmRlZiBIRUFERVJfREVTX0xPQ0xfSAorI2luY2x1ZGUgImRlc19lbmMuYyIKKworI2VuZGlmCisKKyNpZmRlZiBQQVJUMworCisjdW5kZWYgREVTX1VOUk9MTAorI3VuZGVmIERFU19SSVNDMQorI3VuZGVmIERFU19SSVNDMgorI2RlZmluZSBERVNfUFRSCisjdW5kZWYgRF9FTkNSWVBUCisjdW5kZWYgREVTX2VuY3J5cHQxCisjdW5kZWYgREVTX2VuY3J5cHQyCisjdW5kZWYgREVTX2VuY3J5cHQzCisjdW5kZWYgREVTX2RlY3J5cHQzCisjZGVmaW5lIERFU19lbmNyeXB0MSBkZXNfZW5jcnlwdF91NF9jaXNjX3B0cgorI2RlZmluZSBERVNfZW5jcnlwdDIgZGVzX2VuY3J5cHQyX3U0X2Npc2NfcHRyCisjZGVmaW5lIERFU19lbmNyeXB0MyBkZXNfZW5jcnlwdDNfdTRfY2lzY19wdHIKKyNkZWZpbmUgREVTX2RlY3J5cHQzIGRlc19kZWNyeXB0M191NF9jaXNjX3B0cgorI3VuZGVmIEhFQURFUl9ERVNfTE9DTF9ICisjaW5jbHVkZSAiZGVzX2VuYy5jIgorCisjZGVmaW5lIERFU19VTlJPTEwKKyN1bmRlZiBERVNfUklTQzEKKyN1bmRlZiBERVNfUklTQzIKKyNkZWZpbmUgREVTX1BUUgorI3VuZGVmIERfRU5DUllQVAorI3VuZGVmIERFU19lbmNyeXB0MQorI3VuZGVmIERFU19lbmNyeXB0MgorI3VuZGVmIERFU19lbmNyeXB0MworI3VuZGVmIERFU19kZWNyeXB0MworI2RlZmluZSBERVNfZW5jcnlwdDEgZGVzX2VuY3J5cHRfdTE2X2Npc2NfcHRyCisjZGVmaW5lIERFU19lbmNyeXB0MiBkZXNfZW5jcnlwdDJfdTE2X2Npc2NfcHRyCisjZGVmaW5lIERFU19lbmNyeXB0MyBkZXNfZW5jcnlwdDNfdTE2X2Npc2NfcHRyCisjZGVmaW5lIERFU19kZWNyeXB0MyBkZXNfZGVjcnlwdDNfdTE2X2Npc2NfcHRyCisjdW5kZWYgSEVBREVSX0RFU19MT0NMX0gKKyNpbmNsdWRlICJkZXNfZW5jLmMiCisKKyN1bmRlZiBERVNfVU5ST0xMCisjZGVmaW5lIERFU19SSVNDMQorI3VuZGVmIERFU19SSVNDMgorI2RlZmluZSBERVNfUFRSCisjdW5kZWYgRF9FTkNSWVBUCisjdW5kZWYgREVTX2VuY3J5cHQxCisjdW5kZWYgREVTX2VuY3J5cHQyCisjdW5kZWYgREVTX2VuY3J5cHQzCisjdW5kZWYgREVTX2RlY3J5cHQzCisjZGVmaW5lIERFU19lbmNyeXB0MSBkZXNfZW5jcnlwdF91NF9yaXNjMV9wdHIKKyNkZWZpbmUgREVTX2VuY3J5cHQyIGRlc19lbmNyeXB0Ml91NF9yaXNjMV9wdHIKKyNkZWZpbmUgREVTX2VuY3J5cHQzIGRlc19lbmNyeXB0M191NF9yaXNjMV9wdHIKKyNkZWZpbmUgREVTX2RlY3J5cHQzIGRlc19kZWNyeXB0M191NF9yaXNjMV9wdHIKKyN1bmRlZiBIRUFERVJfREVTX0xPQ0xfSAorI2luY2x1ZGUgImRlc19lbmMuYyIKKworI2VuZGlmCisKKyNpZmRlZiBQQVJUNAorCisjdW5kZWYgREVTX1VOUk9MTAorI3VuZGVmIERFU19SSVNDMQorI2RlZmluZSBERVNfUklTQzIKKyNkZWZpbmUgREVTX1BUUgorI3VuZGVmIERfRU5DUllQVAorI3VuZGVmIERFU19lbmNyeXB0MQorI3VuZGVmIERFU19lbmNyeXB0MgorI3VuZGVmIERFU19lbmNyeXB0MworI3VuZGVmIERFU19kZWNyeXB0MworI2RlZmluZSBERVNfZW5jcnlwdDEgZGVzX2VuY3J5cHRfdTRfcmlzYzJfcHRyCisjZGVmaW5lIERFU19lbmNyeXB0MiBkZXNfZW5jcnlwdDJfdTRfcmlzYzJfcHRyCisjZGVmaW5lIERFU19lbmNyeXB0MyBkZXNfZW5jcnlwdDNfdTRfcmlzYzJfcHRyCisjZGVmaW5lIERFU19kZWNyeXB0MyBkZXNfZGVjcnlwdDNfdTRfcmlzYzJfcHRyCisjdW5kZWYgSEVBREVSX0RFU19MT0NMX0gKKyNpbmNsdWRlICJkZXNfZW5jLmMiCisKKyNkZWZpbmUgREVTX1VOUk9MTAorI2RlZmluZSBERVNfUklTQzEKKyN1bmRlZiBERVNfUklTQzIKKyNkZWZpbmUgREVTX1BUUgorI3VuZGVmIERfRU5DUllQVAorI3VuZGVmIERFU19lbmNyeXB0MQorI3VuZGVmIERFU19lbmNyeXB0MgorI3VuZGVmIERFU19lbmNyeXB0MworI3VuZGVmIERFU19kZWNyeXB0MworI2RlZmluZSBERVNfZW5jcnlwdDEgZGVzX2VuY3J5cHRfdTE2X3Jpc2MxX3B0cgorI2RlZmluZSBERVNfZW5jcnlwdDIgZGVzX2VuY3J5cHQyX3UxNl9yaXNjMV9wdHIKKyNkZWZpbmUgREVTX2VuY3J5cHQzIGRlc19lbmNyeXB0M191MTZfcmlzYzFfcHRyCisjZGVmaW5lIERFU19kZWNyeXB0MyBkZXNfZGVjcnlwdDNfdTE2X3Jpc2MxX3B0cgorI3VuZGVmIEhFQURFUl9ERVNfTE9DTF9ICisjaW5jbHVkZSAiZGVzX2VuYy5jIgorCisjZGVmaW5lIERFU19VTlJPTEwKKyN1bmRlZiBERVNfUklTQzEKKyNkZWZpbmUgREVTX1JJU0MyCisjZGVmaW5lIERFU19QVFIKKyN1bmRlZiBEX0VOQ1JZUFQKKyN1bmRlZiBERVNfZW5jcnlwdDEKKyN1bmRlZiBERVNfZW5jcnlwdDIKKyN1bmRlZiBERVNfZW5jcnlwdDMKKyN1bmRlZiBERVNfZGVjcnlwdDMKKyNkZWZpbmUgREVTX2VuY3J5cHQxIGRlc19lbmNyeXB0X3UxNl9yaXNjMl9wdHIKKyNkZWZpbmUgREVTX2VuY3J5cHQyIGRlc19lbmNyeXB0Ml91MTZfcmlzYzJfcHRyCisjZGVmaW5lIERFU19lbmNyeXB0MyBkZXNfZW5jcnlwdDNfdTE2X3Jpc2MyX3B0cgorI2RlZmluZSBERVNfZGVjcnlwdDMgZGVzX2RlY3J5cHQzX3UxNl9yaXNjMl9wdHIKKyN1bmRlZiBIRUFERVJfREVTX0xPQ0xfSAorI2luY2x1ZGUgImRlc19lbmMuYyIKKworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgaWYgZnJvbSB0aW1lcygzKSBtYW4gcGFnZS4gIEl0IG1heSBuZWVkIHRvIGJlIGNoYW5nZWQgKi8KKyNpZm5kZWYgSFoKKyMgaWZuZGVmIENMS19UQ0sKKyMgIGlmbmRlZiBfQlNEX0NMS19UQ0tfIC8qIEZyZWVCU0QgZml4ICovCisjICAgZGVmaW5lIEhaCTEwMC4wCisjICBlbHNlIC8qIF9CU0RfQ0xLX1RDS18gKi8KKyMgICBkZWZpbmUgSFogKChkb3VibGUpX0JTRF9DTEtfVENLXykKKyMgIGVuZGlmCisjIGVsc2UgLyogQ0xLX1RDSyAqLworIyAgZGVmaW5lIEhaICgoZG91YmxlKUNMS19UQ0spCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBCVUZTSVpFCSgobG9uZykxMDI0KQorbG9uZyBydW49MDsKKworZG91YmxlIFRpbWVfRihpbnQgcyk7CisjaWZkZWYgU0lHQUxSTQorI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoc2dpKQorI2RlZmluZSBTSUdSRVRUWVBFIHZvaWQKKyNlbHNlCisjZGVmaW5lIFNJR1JFVFRZUEUgaW50CisjZW5kaWYKKworU0lHUkVUVFlQRSBzaWdfZG9uZShpbnQgc2lnKTsKK1NJR1JFVFRZUEUgc2lnX2RvbmUoaW50IHNpZykKKwl7CisJc2lnbmFsKFNJR0FMUk0sc2lnX2RvbmUpOworCXJ1bj0wOworI2lmZGVmIExJTlQKKwlzaWc9c2lnOworI2VuZGlmCisJfQorI2VuZGlmCisKKyNkZWZpbmUgU1RBUlQJMAorI2RlZmluZSBTVE9QCTEKKworZG91YmxlIFRpbWVfRihpbnQgcykKKwl7CisJZG91YmxlIHJldDsKKyNpZmRlZiBUSU1FUworCXN0YXRpYyBzdHJ1Y3QgdG1zIHRzdGFydCx0ZW5kOworCisJaWYgKHMgPT0gU1RBUlQpCisJCXsKKwkJdGltZXMoJnRzdGFydCk7CisJCXJldHVybigwKTsKKwkJfQorCWVsc2UKKwkJeworCQl0aW1lcygmdGVuZCk7CisJCXJldD0oKGRvdWJsZSkodGVuZC50bXNfdXRpbWUtdHN0YXJ0LnRtc191dGltZSkpL0haOworCQlyZXR1cm4oKHJldCA9PSAwLjApPzFlLTY6cmV0KTsKKwkJfQorI2Vsc2UgLyogIXRpbWVzKCkgKi8KKwlzdGF0aWMgc3RydWN0IHRpbWViIHRzdGFydCx0ZW5kOworCWxvbmcgaTsKKworCWlmIChzID09IFNUQVJUKQorCQl7CisJCWZ0aW1lKCZ0c3RhcnQpOworCQlyZXR1cm4oMCk7CisJCX0KKwllbHNlCisJCXsKKwkJZnRpbWUoJnRlbmQpOworCQlpPShsb25nKXRlbmQubWlsbGl0bS0obG9uZyl0c3RhcnQubWlsbGl0bTsKKwkJcmV0PSgoZG91YmxlKSh0ZW5kLnRpbWUtdHN0YXJ0LnRpbWUpKSsoKGRvdWJsZSlpKS8xMDAwLjA7CisJCXJldHVybigocmV0ID09IDAuMCk/MWUtNjpyZXQpOworCQl9CisjZW5kaWYKKwl9CisKKyNpZmRlZiBTSUdBTFJNCisjZGVmaW5lIHByaW50X25hbWUobmFtZSkgZnByaW50ZihzdGRlcnIsIkRvaW5nICVzJ3MgZm9yIDEwIHNlY29uZHNcbiIsbmFtZSk7IGFsYXJtKDEwKTsKKyNlbHNlCisjZGVmaW5lIHByaW50X25hbWUobmFtZSkgZnByaW50ZihzdGRlcnIsIkRvaW5nICVzICVsZCB0aW1lc1xuIixuYW1lLGNiKTsKKyNlbmRpZgorCQorI2RlZmluZSB0aW1lX2l0KGZ1bmMsbmFtZSxpbmRleCkgXAorCXByaW50X25hbWUobmFtZSk7IFwKKwlUaW1lX0YoU1RBUlQpOyBcCisJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNiKTsgY291bnQrKykgXAorCQl7IFwKKwkJdW5zaWduZWQgbG9uZyBkWzJdOyBcCisJCWZ1bmMoZCwmc2NoLERFU19FTkNSWVBUKTsgXAorCQl9IFwKKwl0bVtpbmRleF09VGltZV9GKFNUT1ApOyBcCisJZnByaW50ZihzdGRlcnIsIiVsZCAlcydzIGluICUuMmYgc2Vjb25kXG4iLGNvdW50LG5hbWUsdG1baW5kZXhdKTsgXAorCXRtW2luZGV4XT0oKGRvdWJsZSlDT1VOVChjYikpL3RtW2luZGV4XTsKKworI2RlZmluZSBwcmludF9pdChuYW1lLGluZGV4KSBcCisJZnByaW50ZihzdGRlcnIsIiVzIGJ5dGVzIHBlciBzZWMgPSAlMTIuMmYgKCU1LjFmdVMpXG4iLG5hbWUsIFwKKwkJdG1baW5kZXhdKjgsMS4wZTYvdG1baW5kZXhdKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlsb25nIGNvdW50OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFXTsKKwlzdGF0aWMgREVTX2NibG9jayBrZXkgPXsweDEyLDB4MzQsMHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjB9OworCXN0YXRpYyBERVNfY2Jsb2NrIGtleTI9ezB4MzQsMHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsMHgxMn07CisJc3RhdGljIERFU19jYmxvY2sga2V5Mz17MHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsMHgxMiwweDM0fTsKKwlERVNfa2V5X3NjaGVkdWxlIHNjaCxzY2gyLHNjaDM7CisJZG91YmxlIGQsdG1bMTZdLG1heD0wOworCWludCByYW5rWzE2XTsKKwljaGFyICpzdHJbMTZdOworCWludCBtYXhfaWR4PTAsaSxudW09MCxqOworI2lmbmRlZiBTSUdBTEFSTQorCWxvbmcgY2EsY2IsY2MsY2QsY2U7CisjZW5kaWYKKworCWZvciAoaT0wOyBpPDEyOyBpKyspCisJCXsKKwkJdG1baV09MC4wOworCQlyYW5rW2ldPTA7CisJCX0KKworI2lmbmRlZiBUSU1FUworCWZwcmludGYoc3RkZXJyLCJUbyBnZXQgdGhlIG1vc3QgYWNjdXJhdGUgcmVzdWx0cywgdHJ5IHRvIHJ1biB0aGlzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwicHJvZ3JhbSB3aGVuIHRoaXMgY29tcHV0ZXIgaXMgaWRsZS5cbiIpOworI2VuZGlmCisKKwlERVNfc2V0X2tleV91bmNoZWNrZWQoJmtleSwmc2NoKTsKKwlERVNfc2V0X2tleV91bmNoZWNrZWQoJmtleTIsJnNjaDIpOworCURFU19zZXRfa2V5X3VuY2hlY2tlZCgma2V5Mywmc2NoMyk7CisKKyNpZm5kZWYgU0lHQUxSTQorCWZwcmludGYoc3RkZXJyLCJGaXJzdCB3ZSBjYWxjdWxhdGUgdGhlIGFwcHJveGltYXRlIHNwZWVkIC4uLlxuIik7CisJREVTX3NldF9rZXlfdW5jaGVja2VkKCZrZXksc2NoKTsKKwljb3VudD0xMDsKKwlkbwl7CisJCWxvbmcgaTsKKwkJdW5zaWduZWQgbG9uZyBkYXRhWzJdOworCisJCWNvdW50Kj0yOworCQlUaW1lX0YoU1RBUlQpOworCQlmb3IgKGk9Y291bnQ7IGk7IGktLSkKKwkJCURFU19lbmNyeXB0MShkYXRhLCYoc2NoWzBdKSxERVNfRU5DUllQVCk7CisJCWQ9VGltZV9GKFNUT1ApOworCQl9IHdoaWxlIChkIDwgMy4wKTsKKwljYT1jb3VudDsKKwljYj1jb3VudCozOworCWNjPWNvdW50KjMqOC9CVUZTSVpFKzE7CisJY2Q9Y291bnQqOC9CVUZTSVpFKzE7CisKKwljZT1jb3VudC8yMCsxOworI2RlZmluZSBDT05EKGQpIChjb3VudCAhPSAoZCkpCisjZGVmaW5lIENPVU5UKGQpIChkKQorI2Vsc2UKKyNkZWZpbmUgQ09ORChjKSAocnVuKQorI2RlZmluZSBDT1VOVChkKSAoY291bnQpCisgICAgICAgIHNpZ25hbChTSUdBTFJNLHNpZ19kb25lKTsKKyAgICAgICAgYWxhcm0oMTApOworI2VuZGlmCisKKyNpZmRlZiBQQVJUMQorCXRpbWVfaXQoZGVzX2VuY3J5cHRfdTRfY2lzY19pZHgsICAiZGVzX2VuY3J5cHRfdTRfY2lzY19pZHggICIsIDApOworCXRpbWVfaXQoZGVzX2VuY3J5cHRfdTE2X2Npc2NfaWR4LCAiZGVzX2VuY3J5cHRfdTE2X2Npc2NfaWR4ICIsIDEpOworCXRpbWVfaXQoZGVzX2VuY3J5cHRfdTRfcmlzYzFfaWR4LCAiZGVzX2VuY3J5cHRfdTRfcmlzYzFfaWR4ICIsIDIpOworCW51bSs9MzsKKyNlbmRpZgorI2lmZGVmIFBBUlQyCisJdGltZV9pdChkZXNfZW5jcnlwdF91MTZfcmlzYzFfaWR4LCJkZXNfZW5jcnlwdF91MTZfcmlzYzFfaWR4IiwgMyk7CisJdGltZV9pdChkZXNfZW5jcnlwdF91NF9yaXNjMl9pZHgsICJkZXNfZW5jcnlwdF91NF9yaXNjMl9pZHggIiwgNCk7CisJdGltZV9pdChkZXNfZW5jcnlwdF91MTZfcmlzYzJfaWR4LCJkZXNfZW5jcnlwdF91MTZfcmlzYzJfaWR4IiwgNSk7CisJbnVtKz0zOworI2VuZGlmCisjaWZkZWYgUEFSVDMKKwl0aW1lX2l0KGRlc19lbmNyeXB0X3U0X2Npc2NfcHRyLCAgImRlc19lbmNyeXB0X3U0X2Npc2NfcHRyICAiLCA2KTsKKwl0aW1lX2l0KGRlc19lbmNyeXB0X3UxNl9jaXNjX3B0ciwgImRlc19lbmNyeXB0X3UxNl9jaXNjX3B0ciAiLCA3KTsKKwl0aW1lX2l0KGRlc19lbmNyeXB0X3U0X3Jpc2MxX3B0ciwgImRlc19lbmNyeXB0X3U0X3Jpc2MxX3B0ciAiLCA4KTsKKwludW0rPTM7CisjZW5kaWYKKyNpZmRlZiBQQVJUNAorCXRpbWVfaXQoZGVzX2VuY3J5cHRfdTE2X3Jpc2MxX3B0ciwiZGVzX2VuY3J5cHRfdTE2X3Jpc2MxX3B0ciIsIDkpOworCXRpbWVfaXQoZGVzX2VuY3J5cHRfdTRfcmlzYzJfcHRyLCAiZGVzX2VuY3J5cHRfdTRfcmlzYzJfcHRyICIsMTApOworCXRpbWVfaXQoZGVzX2VuY3J5cHRfdTE2X3Jpc2MyX3B0ciwiZGVzX2VuY3J5cHRfdTE2X3Jpc2MyX3B0ciIsMTEpOworCW51bSs9MzsKKyNlbmRpZgorCisjaWZkZWYgUEFSVDEKKwlzdHJbMF09IiA0ICBjIGkiOworCXByaW50X2l0KCJkZXNfZW5jcnlwdF91NF9jaXNjX2lkeCAgIiwwKTsKKwltYXg9dG1bMF07CisJbWF4X2lkeD0wOworCXN0clsxXT0iMTYgIGMgaSI7CisJcHJpbnRfaXQoImRlc19lbmNyeXB0X3UxNl9jaXNjX2lkeCAiLDEpOworCWlmIChtYXggPCB0bVsxXSkgeyBtYXg9dG1bMV07IG1heF9pZHg9MTsgfQorCXN0clsyXT0iIDQgcjEgaSI7CisJcHJpbnRfaXQoImRlc19lbmNyeXB0X3U0X3Jpc2MxX2lkeCAiLDIpOworCWlmIChtYXggPCB0bVsyXSkgeyBtYXg9dG1bMl07IG1heF9pZHg9MjsgfQorI2VuZGlmCisjaWZkZWYgUEFSVDIKKwlzdHJbM109IjE2IHIxIGkiOworCXByaW50X2l0KCJkZXNfZW5jcnlwdF91MTZfcmlzYzFfaWR4IiwzKTsKKwlpZiAobWF4IDwgdG1bM10pIHsgbWF4PXRtWzNdOyBtYXhfaWR4PTM7IH0KKwlzdHJbNF09IiA0IHIyIGkiOworCXByaW50X2l0KCJkZXNfZW5jcnlwdF91NF9yaXNjMl9pZHggIiw0KTsKKwlpZiAobWF4IDwgdG1bNF0pIHsgbWF4PXRtWzRdOyBtYXhfaWR4PTQ7IH0KKwlzdHJbNV09IjE2IHIyIGkiOworCXByaW50X2l0KCJkZXNfZW5jcnlwdF91MTZfcmlzYzJfaWR4Iiw1KTsKKwlpZiAobWF4IDwgdG1bNV0pIHsgbWF4PXRtWzVdOyBtYXhfaWR4PTU7IH0KKyNlbmRpZgorI2lmZGVmIFBBUlQzCisJc3RyWzZdPSIgNCAgYyBwIjsKKwlwcmludF9pdCgiZGVzX2VuY3J5cHRfdTRfY2lzY19wdHIgICIsNik7CisJaWYgKG1heCA8IHRtWzZdKSB7IG1heD10bVs2XTsgbWF4X2lkeD02OyB9CisJc3RyWzddPSIxNiAgYyBwIjsKKwlwcmludF9pdCgiZGVzX2VuY3J5cHRfdTE2X2Npc2NfcHRyICIsNyk7CisJaWYgKG1heCA8IHRtWzddKSB7IG1heD10bVs3XTsgbWF4X2lkeD03OyB9CisJc3RyWzhdPSIgNCByMSBwIjsKKwlwcmludF9pdCgiZGVzX2VuY3J5cHRfdTRfcmlzYzFfcHRyICIsOCk7CisJaWYgKG1heCA8IHRtWzhdKSB7IG1heD10bVs4XTsgbWF4X2lkeD04OyB9CisjZW5kaWYKKyNpZmRlZiBQQVJUNAorCXN0cls5XT0iMTYgcjEgcCI7CisJcHJpbnRfaXQoImRlc19lbmNyeXB0X3UxNl9yaXNjMV9wdHIiLDkpOworCWlmIChtYXggPCB0bVs5XSkgeyBtYXg9dG1bOV07IG1heF9pZHg9OTsgfQorCXN0clsxMF09IiA0IHIyIHAiOworCXByaW50X2l0KCJkZXNfZW5jcnlwdF91NF9yaXNjMl9wdHIgIiwxMCk7CisJaWYgKG1heCA8IHRtWzEwXSkgeyBtYXg9dG1bMTBdOyBtYXhfaWR4PTEwOyB9CisJc3RyWzExXT0iMTYgcjIgcCI7CisJcHJpbnRfaXQoImRlc19lbmNyeXB0X3UxNl9yaXNjMl9wdHIiLDExKTsKKwlpZiAobWF4IDwgdG1bMTFdKSB7IG1heD10bVsxMV07IG1heF9pZHg9MTE7IH0KKyNlbmRpZgorCXByaW50Zigib3B0aW9ucyAgICBkZXMgZWNiL3NcbiIpOworCXByaW50ZigiJXMgJTEyLjJmIDEwMC4wJSVcbiIsc3RyW21heF9pZHhdLHRtW21heF9pZHhdKTsKKwlkPXRtW21heF9pZHhdOworCXRtW21heF9pZHhdPSAtMi4wOworCW1heD0gLTEuMDsKKwlmb3IgKDs7KQorCQl7CisJCWZvciAoaT0wOyBpPDEyOyBpKyspCisJCQl7CisJCQlpZiAobWF4IDwgdG1baV0pIHsgbWF4PXRtW2ldOyBqPWk7IH0KKwkJCX0KKwkJaWYgKG1heCA8IDAuMCkgYnJlYWs7CisJCXByaW50ZigiJXMgJTEyLjJmICAlNC4xZiUlXG4iLHN0cltqXSx0bVtqXSx0bVtqXS9kKjEwMC4wKTsKKwkJdG1bal09IC0yLjA7CisJCW1heD0gLTEuMDsKKwkJfQorCisJc3dpdGNoIChtYXhfaWR4KQorCQl7CisJY2FzZSAwOgorCQlwcmludGYoIi1EREVTX0RFRkFVTFRfT1BUSU9OU1xuIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJcHJpbnRmKCItRERFU19VTlJPTExcbiIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXByaW50ZigiLURERVNfUklTQzFcbiIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXByaW50ZigiLURERVNfVU5ST0xMIC1EREVTX1JJU0MxXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlwcmludGYoIi1EREVTX1JJU0MyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlwcmludGYoIi1EREVTX1VOUk9MTCAtRERFU19SSVNDMlxuIik7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJcHJpbnRmKCItRERFU19QVFJcbiIpOworCQlicmVhazsKKwljYXNlIDc6CisJCXByaW50ZigiLURERVNfVU5ST0xMIC1EREVTX1BUUlxuIik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJcHJpbnRmKCItRERFU19SSVNDMSAtRERFU19QVFJcbiIpOworCQlicmVhazsKKwljYXNlIDk6CisJCXByaW50ZigiLURERVNfVU5ST0xMIC1EREVTX1JJU0MxIC1EREVTX1BUUlxuIik7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCXByaW50ZigiLURERVNfUklTQzIgLURERVNfUFRSXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJcHJpbnRmKCItRERFU19VTlJPTEwgLURERVNfUklTQzIgLURERVNfUFRSXG4iKTsKKwkJYnJlYWs7CisJCX0KKwlleGl0KDApOworI2lmIGRlZmluZWQoTElOVCkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykKKwlyZXR1cm4oMCk7CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc192ZXIuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZGVzX3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYWRhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc192ZXIuaApAQCAtMCwwICsxLDcxIEBACisvKiBjcnlwdG8vZGVzL2Rlc192ZXIuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaWZkZWYgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTworIyB1bmRlZiBPUEVOU1NMX0VYVEVSTgorIyBkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9FWFBPUlQKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBtYWtlIHN1cmUgdGhlIG5hbWVzIGFyZSBkaWZmZXJlbnQgZnJvbSBsaWJkZXMgbmFtZXMgKi8KKyNkZWZpbmUgREVTX3ZlcnNpb24gT1NTTF9ERVNfdmVyc2lvbgorI2RlZmluZSBsaWJkZXNfdmVyc2lvbiBPU1NMX2xpYmRlc192ZXJzaW9uCisKK09QRU5TU0xfRVhURVJOIGNvbnN0IGNoYXIgT1NTTF9ERVNfdmVyc2lvbltdOwkvKiBTU0xlYXkgdmVyc2lvbiBzdHJpbmcgKi8KK09QRU5TU0xfRVhURVJOIGNvbnN0IGNoYXIgT1NTTF9saWJkZXNfdmVyc2lvbltdOwkvKiBvbGQgbGliZGVzIHZlcnNpb24gc3RyaW5nICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc3MuY3BwIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTQ5YmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXNzLmNwcApAQCAtMCwwICsxLDY3IEBACisvLworLy8gZ2V0dHNjLmlubAorLy8KKy8vIGdpdmVzIGFjY2VzcyB0byB0aGUgUGVudGl1bSdzIChzZWNyZXQpIGN5Y2xlIGNvdW50ZXIKKy8vCisvLyBUaGlzIHNvZnR3YXJlIHdhcyB3cml0dGVuIGJ5IExlb25hcmQgSmFua2UgKGphbmtlQHVuaXhnLnViYy5jYSkKKy8vIGluIDE5OTYtNyBhbmQgaXMgZW50ZXJlZCwgYnkgaGltLCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorCisjaWYgZGVmaW5lZChfX1dBVENPTUNfXykKK3ZvaWQgR2V0VFNDKHVuc2lnbmVkIGxvbmcmKTsKKyNwcmFnbWEgYXV4IEdldFRTQyA9IDB4MGYgMHgzMSAibW92IFtlZGldLCBlYXgiIHBhcm0gW2VkaV0gbW9kaWZ5IFtlZHggZWF4XTsKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCitpbmxpbmUKK3ZvaWQgR2V0VFNDKHVuc2lnbmVkIGxvbmcmIHRzYykKK3sKKyAgYXNtIHZvbGF0aWxlKCIuYnl0ZSAxNSwgNDlcblx0IgorCSAgICAgICA6ICI9ZWF4IiAodHNjKQorCSAgICAgICA6CisJICAgICAgIDogIiVlZHgiLCAiJWVheCIpOworfQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKK2lubGluZQordm9pZCBHZXRUU0ModW5zaWduZWQgbG9uZyYgdHNjKQoreworICB1bnNpZ25lZCBsb25nIGE7CisgIF9fYXNtIF9lbWl0IDBmaAorICBfX2FzbSBfZW1pdCAzMWgKKyAgX19hc20gbW92IGEsIGVheDsKKyAgdHNjPWE7Cit9CisjZW5kaWYgICAgICAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKwordm9pZCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKKwl7CisJZGVzX2tleV9zY2hlZHVsZSBrZXk7CisJdW5zaWduZWQgbG9uZyBzMSxzMixlMSxlMjsKKwl1bnNpZ25lZCBsb25nIGRhdGFbMl07CisJaW50IGksajsKKworCWZvciAoaj0wOyBqPDY7IGorKykKKwkJeworCQlmb3IgKGk9MDsgaTwxMDAwOyBpKyspIC8qKi8KKwkJCXsKKwkJCWRlc19lbmNyeXB0MSgmZGF0YVswXSxrZXksMSk7CisJCQlHZXRUU0MoczEpOworCQkJZGVzX2VuY3J5cHQxKCZkYXRhWzBdLGtleSwxKTsKKwkJCWRlc19lbmNyeXB0MSgmZGF0YVswXSxrZXksMSk7CisJCQlkZXNfZW5jcnlwdDEoJmRhdGFbMF0sa2V5LDEpOworCQkJR2V0VFNDKGUxKTsKKwkJCUdldFRTQyhzMik7CisJCQlkZXNfZW5jcnlwdDEoJmRhdGFbMF0sa2V5LDEpOworCQkJZGVzX2VuY3J5cHQxKCZkYXRhWzBdLGtleSwxKTsKKwkJCWRlc19lbmNyeXB0MSgmZGF0YVswXSxrZXksMSk7CisJCQlkZXNfZW5jcnlwdDEoJmRhdGFbMF0sa2V5LDEpOworCQkJR2V0VFNDKGUyKTsKKwkJCWRlc19lbmNyeXB0MSgmZGF0YVswXSxrZXksMSk7CisJCQl9CisKKwkJcHJpbnRmKCJkZXMgJWQgJWQgKCVkKVxuIiwKKwkJCWUxLXMxLGUyLXMyLCgoZTItczIpLShlMS1zMSkpKTsKKwkJfQorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXN0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2Rlc3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI5MmEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9kZXN0ZXN0LmMKQEAgLTAsMCArMSw5NTIgQEAKKy8qIGNyeXB0by9kZXMvZGVzdGVzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMTYpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykKKyNpZm5kZWYgT1BFTlNTTF9TWVNfTVNET1MKKyNkZWZpbmUgT1BFTlNTTF9TWVNfTVNET1MKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9TWVNfTVNET1MKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TX0RFQ0MpCisjaW5jbHVkZSBPUEVOU1NMX1VOSVNURAorI2VuZGlmCisjZWxzZQorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIE9QRU5TU0xfTk9fREVTCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHByaW50ZigiTm8gREVTIHN1cHBvcnRcbiIpOworICAgIHJldHVybigwKTsKK30KKyNlbHNlCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKworI2RlZmluZSBjcnlwdChjLHMpIChERVNfY3J5cHQoKGMpLChzKSkpCisKKy8qIHRpc2sgdGlzayAtIHRoZSB0ZXN0IGtleXMgZG9uJ3QgYWxsIGhhdmUgb2RkIHBhcml0eSA6LSggKi8KKy8qIHRlc3QgZGF0YSAqLworI2RlZmluZSBOVU1fVEVTVFMgMzQKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtleV9kYXRhW05VTV9URVNUU11bOF09eworCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCXsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZ9LAorCXsweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCXsweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTF9LAorCXsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZ9LAorCXsweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTF9LAorCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCXsweEZFLDB4REMsMHhCQSwweDk4LDB4NzYsMHg1NCwweDMyLDB4MTB9LAorCXsweDdDLDB4QTEsMHgxMCwweDQ1LDB4NEEsMHgxQSwweDZFLDB4NTd9LAorCXsweDAxLDB4MzEsMHhEOSwweDYxLDB4OUQsMHhDMSwweDM3LDB4NkV9LAorCXsweDA3LDB4QTEsMHgxMywweDNFLDB4NEEsMHgwQiwweDI2LDB4ODZ9LAorCXsweDM4LDB4NDksMHg2NywweDRDLDB4MjYsMHgwMiwweDMxLDB4OUV9LAorCXsweDA0LDB4QjksMHgxNSwweEJBLDB4NDMsMHhGRSwweEI1LDB4QjZ9LAorCXsweDAxLDB4MTMsMHhCOSwweDcwLDB4RkQsMHgzNCwweEYyLDB4Q0V9LAorCXsweDAxLDB4NzAsMHhGMSwweDc1LDB4NDYsMHg4RiwweEI1LDB4RTZ9LAorCXsweDQzLDB4MjksMHg3RiwweEFELDB4MzgsMHhFMywweDczLDB4RkV9LAorCXsweDA3LDB4QTcsMHgxMywweDcwLDB4NDUsMHhEQSwweDJBLDB4MTZ9LAorCXsweDA0LDB4NjgsMHg5MSwweDA0LDB4QzIsMHhGRCwweDNCLDB4MkZ9LAorCXsweDM3LDB4RDAsMHg2QiwweEI1LDB4MTYsMHhDQiwweDc1LDB4NDZ9LAorCXsweDFGLDB4MDgsMHgyNiwweDBELDB4MUEsMHhDMiwweDQ2LDB4NUV9LAorCXsweDU4LDB4NDAsMHgyMywweDY0LDB4MUEsMHhCQSwweDYxLDB4NzZ9LAorCXsweDAyLDB4NTgsMHgxNiwweDE2LDB4NDYsMHgyOSwweEIwLDB4MDd9LAorCXsweDQ5LDB4NzksMHgzRSwweEJDLDB4NzksMHhCMywweDI1LDB4OEZ9LAorCXsweDRGLDB4QjAsMHg1RSwweDE1LDB4MTUsMHhBQiwweDczLDB4QTd9LAorCXsweDQ5LDB4RTksMHg1RCwweDZELDB4NEMsMHhBMiwweDI5LDB4QkZ9LAorCXsweDAxLDB4ODMsMHgxMCwweERDLDB4NDAsMHg5QiwweDI2LDB4RDZ9LAorCXsweDFDLDB4NTgsMHg3RiwweDFDLDB4MTMsMHg5MiwweDRGLDB4RUZ9LAorCXsweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDF9LAorCXsweDFGLDB4MUYsMHgxRiwweDFGLDB4MEUsMHgwRSwweDBFLDB4MEV9LAorCXsweEUwLDB4RkUsMHhFMCwweEZFLDB4RjEsMHhGRSwweEYxLDB4RkV9LAorCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCXsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZ9LAorCXsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhBQiwweENELDB4RUZ9LAorCXsweEZFLDB4REMsMHhCQSwweDk4LDB4NzYsMHg1NCwweDMyLDB4MTB9fTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhaW5fZGF0YVtOVU1fVEVTVFNdWzhdPXsKKwl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKKwl7MHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGfSwKKwl7MHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxfSwKKwl7MHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExfSwKKwl7MHgxMSwweDExLDB4MTEsMHgxMSwweDExLDB4MTEsMHgxMSwweDExfSwKKwl7MHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGfSwKKwl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKKwl7MHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGfSwKKwl7MHgwMSwweEExLDB4RDYsMHhEMCwweDM5LDB4NzcsMHg2NywweDQyfSwKKwl7MHg1QywweEQ1LDB4NEMsMHhBOCwweDNELDB4RUYsMHg1NywweERBfSwKKwl7MHgwMiwweDQ4LDB4RDQsMHgzOCwweDA2LDB4RjYsMHg3MSwweDcyfSwKKwl7MHg1MSwweDQ1LDB4NEIsMHg1OCwweDJELDB4REYsMHg0NCwweDBBfSwKKwl7MHg0MiwweEZELDB4NDQsMHgzMCwweDU5LDB4NTcsMHg3RiwweEEyfSwKKwl7MHgwNSwweDlCLDB4NUUsMHgwOCwweDUxLDB4Q0YsMHgxNCwweDNBfSwKKwl7MHgwNywweDU2LDB4RDgsMHhFMCwweDc3LDB4NDcsMHg2MSwweEQyfSwKKwl7MHg3NiwweDI1LDB4MTQsMHhCOCwweDI5LDB4QkYsMHg0OCwweDZBfSwKKwl7MHgzQiwweERELDB4MTEsMHg5MCwweDQ5LDB4MzcsMHgyOCwweDAyfSwKKwl7MHgyNiwweDk1LDB4NUYsMHg2OCwweDM1LDB4QUYsMHg2MCwweDlBfSwKKwl7MHgxNiwweDRELDB4NUUsMHg0MCwweDRGLDB4MjcsMHg1MiwweDMyfSwKKwl7MHg2QiwweDA1LDB4NkUsMHgxOCwweDc1LDB4OUYsMHg1QywweENBfSwKKwl7MHgwMCwweDRCLDB4RDYsMHhFRiwweDA5LDB4MTcsMHg2MCwweDYyfSwKKwl7MHg0OCwweDBELDB4MzksMHgwMCwweDZFLDB4RTcsMHg2MiwweEYyfSwKKwl7MHg0MywweDc1LDB4NDAsMHhDOCwweDY5LDB4OEYsMHgzQywweEZBfSwKKwl7MHgwNywweDJELDB4NDMsMHhBMCwweDc3LDB4MDcsMHg1MiwweDkyfSwKKwl7MHgwMiwweEZFLDB4NTUsMHg3NywweDgxLDB4MTcsMHhGMSwweDJBfSwKKwl7MHgxRCwweDlELDB4NUMsMHg1MCwweDE4LDB4RjcsMHgyOCwweEMyfSwKKwl7MHgzMCwweDU1LDB4MzIsMHgyOCwweDZELDB4NkYsMHgyOSwweDVBfSwKKwl7MHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGfSwKKwl7MHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGfSwKKwl7MHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4QUIsMHhDRCwweEVGfSwKKwl7MHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGfSwKKwl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKKwl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKKwl7MHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGfX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNpcGhlcl9kYXRhW05VTV9URVNUU11bOF09eworCXsweDhDLDB4QTYsMHg0RCwweEU5LDB4QzEsMHhCMSwweDIzLDB4QTd9LAorCXsweDczLDB4NTksMHhCMiwweDE2LDB4M0UsMHg0RSwweERDLDB4NTh9LAorCXsweDk1LDB4OEUsMHg2RSwweDYyLDB4N0EsMHgwNSwweDU1LDB4N0J9LAorCXsweEY0LDB4MDMsMHg3OSwweEFCLDB4OUUsMHgwRSwweEM1LDB4MzN9LAorCXsweDE3LDB4NjYsMHg4RCwweEZDLDB4NzIsMHg5MiwweDUzLDB4MkR9LAorCXsweDhBLDB4NUEsMHhFMSwweEY4LDB4MUEsMHhCOCwweEYyLDB4RER9LAorCXsweDhDLDB4QTYsMHg0RCwweEU5LDB4QzEsMHhCMSwweDIzLDB4QTd9LAorCXsweEVELDB4MzksMHhEOSwweDUwLDB4RkEsMHg3NCwweEJDLDB4QzR9LAorCXsweDY5LDB4MEYsMHg1QiwweDBELDB4OUEsMHgyNiwweDkzLDB4OUJ9LAorCXsweDdBLDB4MzgsMHg5RCwweDEwLDB4MzUsMHg0QiwweEQyLDB4NzF9LAorCXsweDg2LDB4OEUsMHhCQiwweDUxLDB4Q0EsMHhCNCwweDU5LDB4OUF9LAorCXsweDcxLDB4NzgsMHg4NywweDZFLDB4MDEsMHhGMSwweDlCLDB4MkF9LAorCXsweEFGLDB4MzcsMHhGQiwweDQyLDB4MUYsMHg4QywweDQwLDB4OTV9LAorCXsweDg2LDB4QTUsMHg2MCwweEYxLDB4MEUsMHhDNiwweEQ4LDB4NUJ9LAorCXsweDBDLDB4RDMsMHhEQSwweDAyLDB4MDAsMHgyMSwweERDLDB4MDl9LAorCXsweEVBLDB4NjcsMHg2QiwweDJDLDB4QjcsMHhEQiwweDJCLDB4N0F9LAorCXsweERGLDB4RDYsMHg0QSwweDgxLDB4NUMsMHhBRiwweDFBLDB4MEZ9LAorCXsweDVDLDB4NTEsMHgzQywweDlDLDB4NDgsMHg4NiwweEMwLDB4ODh9LAorCXsweDBBLDB4MkEsMHhFRSwweEFFLDB4M0YsMHhGNCwweEFCLDB4Nzd9LAorCXsweEVGLDB4MUIsMHhGMCwweDNFLDB4NUQsMHhGQSwweDU3LDB4NUF9LAorCXsweDg4LDB4QkYsMHgwRCwweEI2LDB4RDcsMHgwRCwweEVFLDB4NTZ9LAorCXsweEExLDB4RjksMHg5MSwweDU1LDB4NDEsMHgwMiwweDBCLDB4NTZ9LAorCXsweDZGLDB4QkYsMHgxQywweEFGLDB4Q0YsMHhGRCwweDA1LDB4NTZ9LAorCXsweDJGLDB4MjIsMHhFNCwweDlCLDB4QUIsMHg3QywweEExLDB4QUN9LAorCXsweDVBLDB4NkIsMHg2MSwweDJDLDB4QzIsMHg2QywweENFLDB4NEF9LAorCXsweDVGLDB4NEMsMHgwMywweDhFLDB4RDEsMHgyQiwweDJFLDB4NDF9LAorCXsweDYzLDB4RkEsMHhDMCwweEQwLDB4MzQsMHhEOSwweEY3LDB4OTN9LAorCXsweDYxLDB4N0IsMHgzQSwweDBDLDB4RTgsMHhGMCwweDcxLDB4MDB9LAorCXsweERCLDB4OTUsMHg4NiwweDA1LDB4RjgsMHhDOCwweEM2LDB4MDZ9LAorCXsweEVELDB4QkYsMHhEMSwweEM2LDB4NkMsMHgyOSwweENDLDB4Qzd9LAorCXsweDM1LDB4NTUsMHg1MCwweEIyLDB4MTUsMHgwRSwweDI0LDB4NTF9LAorCXsweENBLDB4QUEsMHhBRiwweDRELDB4RUEsMHhGMSwweERCLDB4QUV9LAorCXsweEQ1LDB4RDQsMHg0RiwweEY3LDB4MjAsMHg2OCwweDNELDB4MER9LAorCXsweDJBLDB4MkIsMHhCMCwweDA4LDB4REYsMHg5NywweEMyLDB4RjJ9fTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2lwaGVyX2VjYjJbTlVNX1RFU1RTLTFdWzhdPXsKKwl7MHg5MiwweDk1LDB4QjUsMHg5QiwweEIzLDB4ODQsMHg3MywweDZFfSwKKwl7MHgxOSwweDlFLDB4OUQsMHg2RCwweEYzLDB4OUEsMHhBOCwweDE2fSwKKwl7MHgyQSwweDRCLDB4NEQsMHgyNCwweDUyLDB4NDMsMHg4NCwweDI3fSwKKwl7MHgzNSwweDg0LDB4M0MsMHgwMSwweDlELDB4MTgsMHhDNSwweEI2fSwKKwl7MHg0QSwweDVCLDB4MkYsMHg0MiwweEFBLDB4NzcsMHgxOSwweDI1fSwKKwl7MHhBMCwweDZCLDB4QTksMHhCOCwweENBLDB4NUIsMHgxNywweDhBfSwKKwl7MHhBQiwweDlELDB4QjcsMHhGQiwweEVELDB4OTUsMHhGMiwweDc0fSwKKwl7MHgzRCwweDI1LDB4NkMsMHgyMywweEE3LDB4MjUsMHgyRiwweEQ2fSwKKwl7MHhCNywweDZGLDB4QUIsMHg0RiwweEJELDB4QkQsMHhCNywweDY3fSwKKwl7MHg4RiwweDY4LDB4MjcsMHhENiwweDlDLDB4RjQsMHgxQSwweDEwfSwKKwl7MHg4MiwweDU3LDB4QTEsMHhENiwweDUwLDB4NUUsMHg4MSwweDg1fSwKKwl7MHhBMiwweDBGLDB4MEEsMHhDRCwweDgwLDB4ODksMHg3RCwweEZBfSwKKwl7MHhDRCwweDJBLDB4NTMsMHgzQSwweERCLDB4MEQsMHg3RSwweEYzfSwKKwl7MHhEMiwweEMyLDB4QkUsMHgyNywweEU4LDB4MUIsMHg2OCwweEUzfSwKKwl7MHhFOSwweDI0LDB4Q0YsMHg0RiwweDg5LDB4M0MsMHg1QiwweDBBfSwKKwl7MHhBNywweDE4LDB4QzMsMHg5RiwweEZBLDB4OUYsMHhENywweDY5fSwKKwl7MHg3NywweDJDLDB4NzksMHhCMSwweEQyLDB4MzEsMHg3RSwweEIxfSwKKwl7MHg0OSwweEFCLDB4OTIsMHg3RiwweEQwLDB4MjIsMHgwMCwweEI3fSwKKwl7MHhDRSwweDFDLDB4NkMsMHg3RCwweDg1LDB4RTMsMHg0QSwweDZGfSwKKwl7MHhCRSwweDkxLDB4RDYsMHhFMSwweDI3LDB4QjIsMHhFOSwweDg3fSwKKwl7MHg3MCwweDI4LDB4QUUsMHg4RiwweEQxLDB4RjUsMHg3NCwweDFBfSwKKwl7MHhBQSwweDM3LDB4ODAsMHhCQiwweEYzLDB4MjIsMHgxRCwweERFfSwKKwl7MHhBNiwweEM0LDB4RDIsMHg1RSwweDI4LDB4OTMsMHhBQywweEIzfSwKKwl7MHgyMiwweDA3LDB4ODEsMHg1QSwweEU0LDB4QjcsMHgxQSwweEFEfSwKKwl7MHhEQywweENFLDB4MDUsMHhFNywweDA3LDB4QkQsMHhGNSwweDg0fSwKKwl7MHgyNiwweDFELDB4MzksMHgyQywweEIzLDB4QkEsMHhBNSwweDg1fSwKKwl7MHhCNCwweEY3LDB4MEYsMHg3MiwweEZCLDB4MDQsMHhGMCwweERDfSwKKwl7MHg5NSwweEJBLDB4QTksMHg0RSwweDg3LDB4MzYsMHhGMiwweDg5fSwKKwl7MHhENCwweDA3LDB4M0EsMHhGMSwweDVBLDB4MTcsMHg4MiwweDBFfSwKKwl7MHhFRiwweDZGLDB4QUYsMHhBNywweDY2LDB4MUEsMHg3RSwweDg5fSwKKwl7MHhDMSwweDk3LDB4RjUsMHg1OCwweDc0LDB4OEEsMHgyMCwweEU3fSwKKwl7MHg0MywweDM0LDB4Q0YsMHhEQSwweDIyLDB4QzQsMHg4NiwweEM4fSwKKwl7MHgwOCwweEQ3LDB4QjQsMHhGQiwweDYyLDB4OUQsMHgwOCwweDg1fX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNiY19rZXkgWzhdPXsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhhYiwweGNkLDB4ZWZ9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2JjMl9rZXlbOF09ezB4ZjEsMHhlMCwweGQzLDB4YzIsMHhiNSwweGE0LDB4OTcsMHg4Nn07CitzdGF0aWMgdW5zaWduZWQgY2hhciBjYmMzX2tleVs4XT17MHhmZSwweGRjLDB4YmEsMHg5OCwweDc2LDB4NTQsMHgzMiwweDEwfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNiY19pdiAgWzhdPXsweGZlLDB4ZGMsMHhiYSwweDk4LDB4NzYsMHg1NCwweDMyLDB4MTB9OworLyogQ2hhbmdlZCB0aGUgZm9sbG93aW5nIHRleHQgY29uc3RhbnQgdG8gYmluYXJ5IHNvIGl0IHdpbGwgd29yayBvbiBlYmNkaWMKKyAqIG1hY2hpbmVzIDotKSAqLworLyogc3RhdGljIGNoYXIgY2JjX2RhdGFbNDBdPSI3NjU0MzIxIE5vdyBpcyB0aGUgdGltZSBmb3IgXDAwMDEiOyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2JjX2RhdGFbNDBdPXsKKwkweDM3LDB4MzYsMHgzNSwweDM0LDB4MzMsMHgzMiwweDMxLDB4MjAsCisJMHg0RSwweDZGLDB4NzcsMHgyMCwweDY5LDB4NzMsMHgyMCwweDc0LAorCTB4NjgsMHg2NSwweDIwLDB4NzQsMHg2OSwweDZELDB4NjUsMHgyMCwKKwkweDY2LDB4NkYsMHg3MiwweDIwLDB4MDAsMHgzMSwweDAwLDB4MDAsCisJMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNiY19va1szMl09eworCTB4Y2MsMHhkMSwweDczLDB4ZmYsMHhhYiwweDIwLDB4MzksMHhmNCwKKwkweGFjLDB4ZDgsMHhhZSwweGZkLDB4ZGYsMHhkOCwweGExLDB4ZWIsCisJMHg0NiwweDhlLDB4OTEsMHgxNSwweDc4LDB4ODgsMHhiYSwweDY4LAorCTB4MWQsMHgyNiwweDkzLDB4OTcsMHhmNywweGZlLDB4NjIsMHhiNH07CisKKyNpZmRlZiBTQ1JFV19USEVfUEFSSVRZCisjZXJyb3IgIlNDUkVXX1RIRV9QQVJJVFkgaXMgbm90IG1lbnQgdG8gYmUgZGVmaW5lZC4iCisjZXJyb3IgIk9yaWdpbmFsIHZlY3RvcnMgYXJlIHByZXNlcnZlZCBmb3IgcmVmZXJlbmNlIG9ubHkuIgorc3RhdGljIHVuc2lnbmVkIGNoYXIgY2JjMl9rZXlbOF09ezB4ZjAsMHhlMSwweGQyLDB4YzMsMHhiNCwweGE1LDB4OTYsMHg4N307CitzdGF0aWMgdW5zaWduZWQgY2hhciB4Y2JjX29rWzMyXT17CisJMHg4NiwweDc0LDB4ODEsMHgwRCwweDYxLDB4QTQsMHhBNSwweDQ4LAorCTB4QjksMHg5MywweDAzLDB4RTEsMHhCOCwweEJCLDB4QkQsMHhCRCwKKwkweDY0LDB4MzAsMHgwQiwweEI5LDB4MDYsMHg2NSwweDgxLDB4NzYsCisJMHgwNCwweDFELDB4NzcsMHg2MiwweDE3LDB4Q0EsMHgyQiwweEQyLAorCX07CisjZWxzZQorc3RhdGljIHVuc2lnbmVkIGNoYXIgeGNiY19va1szMl09eworCTB4ODQsMHg2QiwweDI5LDB4MTQsMHg4NSwweDFFLDB4OUEsMHgyOSwKKwkweDU0LDB4NzMsMHgyRiwweDhBLDB4QTAsMHhBNiwweDExLDB4QzEsCisJMHgxNSwweENELDB4QzIsMHhENywweDk1LDB4MUIsMHgxMCwweDUzLAorCTB4QTYsMHgzQywweDVFLDB4MDMsMHhCMiwweDFBLDB4QTMsMHhDNCwKKwl9OworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNiYzNfb2tbMzJdPXsKKwkweDNGLDB4RTMsMHgwMSwweEM5LDB4NjIsMHhBQywweDAxLDB4RDAsCisJMHgyMiwweDEzLDB4NzYsMHgzQywweDFDLDB4QkQsMHg0QywweERDLAorCTB4NzksMHg5NiwweDU3LDB4QzAsMHg2NCwweEVDLDB4RjUsMHhENCwKKwkweDFDLDB4NjcsMHgzOCwweDEyLDB4Q0YsMHhERSwweDk2LDB4NzV9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwY2JjX29rWzMyXT17CisJMHhjYywweGQxLDB4NzMsMHhmZiwweGFiLDB4MjAsMHgzOSwweGY0LAorCTB4NmQsMHhlYywweGI0LDB4NzAsMHhhMCwweGU1LDB4NmIsMHgxNSwKKwkweGFlLDB4YTYsMHhiZiwweDYxLDB4ZWQsMHg3ZCwweDljLDB4OWYsCisJMHhmNywweDE3LDB4NDYsMHgzYiwweDhhLDB4YjMsMHhjYywweDg4fTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2ZiX2tleVs4XT17MHgwMSwweDIzLDB4NDUsMHg2NywweDg5LDB4YWIsMHhjZCwweGVmfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNmYl9pdls4XT17MHgxMiwweDM0LDB4NTYsMHg3OCwweDkwLDB4YWIsMHhjZCwweGVmfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNmYl9idWYxWzQwXSxjZmJfYnVmMls0MF0sY2ZiX3RtcFs4XTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBsYWluWzI0XT0KKwl7CisJMHg0ZSwweDZmLDB4NzcsMHgyMCwweDY5LDB4NzMsCisJMHgyMCwweDc0LDB4NjgsMHg2NSwweDIwLDB4NzQsCisJMHg2OSwweDZkLDB4NjUsMHgyMCwweDY2LDB4NmYsCisJMHg3MiwweDIwLDB4NjEsMHg2YywweDZjLDB4MjAKKwl9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2ZiX2NpcGhlcjhbMjRdPSB7CisJMHhmMywweDFmLDB4ZGEsMHgwNywweDAxLDB4MTQsIDB4NjIsMHhlZSwweDE4LDB4N2YsMHg0MywweGQ4LAorCTB4MGEsMHg3YywweGQ5LDB4YjUsMHhiMCwweGQyLCAweDkwLDB4ZGEsMHg2ZSwweDViLDB4OWEsMHg4NyB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2ZiX2NpcGhlcjE2WzI0XT17CisJMHhGMywweDA5LDB4ODcsMHg4NywweDdGLDB4NTcsIDB4RjcsMHgzQywweDM2LDB4QjYsMHhEQiwweDcwLAorCTB4RDgsMHhENSwweDM0LDB4MTksMHhEMywweDg2LCAweEIyLDB4MjMsMHhCNywweEIyLDB4QUQsMHgxQiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2ZiX2NpcGhlcjMyWzI0XT17CisJMHhGMywweDA5LDB4NjIsMHg0OSwweEE0LDB4REYsIDB4QTQsMHg5RiwweDMzLDB4REMsMHg3QiwweEFELAorCTB4NEMsMHhDOCwweDlGLDB4NjQsMHhFNCwweDUzLCAweEU1LDB4RUMsMHg2NywweDIwLDB4REEsMHhCNiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2ZiX2NpcGhlcjQ4WzI0XT17CisJMHhGMywweDA5LDB4NjIsMHg0OSwweEM3LDB4RjQsIDB4MzAsMHhCNSwweDE1LDB4RUMsMHhCQiwweDg1LAorCTB4OTcsMHg1QSwweDEzLDB4OEMsMHg2OCwweDYwLCAweEUyLDB4MzgsMHgzNCwweDNDLDB4REMsMHgxRiB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2ZiX2NpcGhlcjY0WzI0XT17CisJMHhGMywweDA5LDB4NjIsMHg0OSwweEM3LDB4RjQsIDB4NkUsMHg1MSwweEE2LDB4OUUsMHg4MywweDlCLAorCTB4MUEsMHg5MiwweEY3LDB4ODQsMHgwMywweDQ2LCAweDcxLDB4MzMsMHg4OSwweDhFLDB4QTYsMHgyMiB9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBvZmJfa2V5WzhdPXsweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhhYiwweGNkLDB4ZWZ9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgb2ZiX2l2WzhdPXsweDEyLDB4MzQsMHg1NiwweDc4LDB4OTAsMHhhYiwweGNkLDB4ZWZ9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgb2ZiX2J1ZjFbMjRdLG9mYl9idWYyWzI0XSxvZmJfdG1wWzhdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgb2ZiX2NpcGhlclsyNF09CisJeworCTB4ZjMsMHgwOSwweDYyLDB4NDksMHhjNywweGY0LDB4NmUsMHg1MSwKKwkweDM1LDB4ZjIsMHg0YSwweDI0LDB4MmUsMHhlYiwweDNkLDB4M2YsCisJMHgzZCwweDZkLDB4NWIsMHhlMywweDI1LDB4NWEsMHhmOCwweGMzCisJfTsKKworI2lmIDAKK3N0YXRpYyBERVNfTE9ORyBjYmNfY2tzdW1fcmV0PTB4QjQ2MkZFRjdMOworI2Vsc2UKK3N0YXRpYyBERVNfTE9ORyBjYmNfY2tzdW1fcmV0PTB4RjdGRTYyQjRMOworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgY2hhciBjYmNfY2tzdW1fZGF0YVs4XT17MHgxRCwweDI2LDB4OTMsMHg5NywweGY3LDB4ZmUsMHg2MiwweGI0fTsKKworc3RhdGljIGNoYXIgKnB0KHVuc2lnbmVkIGNoYXIgKnApOworc3RhdGljIGludCBjZmJfdGVzdChpbnQgYml0cywgdW5zaWduZWQgY2hhciAqY2ZiX2NpcGhlcik7CitzdGF0aWMgaW50IGNmYjY0X3Rlc3QodW5zaWduZWQgY2hhciAqY2ZiX2NpcGhlcik7CitzdGF0aWMgaW50IGVkZV9jZmI2NF90ZXN0KHVuc2lnbmVkIGNoYXIgKmNmYl9jaXBoZXIpOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKwl7CisJaW50IGosZXJyPTA7CisJdW5zaWduZWQgaW50IGk7CisJZGVzX2NibG9jayBpbixvdXQsb3V0aW4saXYzLGl2MjsKKwlkZXNfa2V5X3NjaGVkdWxlIGtzLGtzMixrczM7CisJdW5zaWduZWQgY2hhciBjYmNfaW5bNDBdOworCXVuc2lnbmVkIGNoYXIgY2JjX291dFs0MF07CisJREVTX0xPTkcgY3M7CisJdW5zaWduZWQgY2hhciBjcmV0WzhdOworI2lmZGVmIF9DUkFZCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBpbnQgYTozMjsKKyAgICAgICAgICAgIGludCBiOjMyOworICAgICAgICB9IGxxcmV0WzJdOworI2Vsc2UKKyAgICAgICAgREVTX0xPTkcgbHFyZXRbNF07CisjZW5kaWYKKwlpbnQgbnVtOworCWNoYXIgKnN0cjsKKworI2lmbmRlZiBPUEVOU1NMX05PX0RFU0NCQ00KKwlwcmludGYoIkRvaW5nIGNiY21cbiIpOworCWlmICgoaj1ERVNfc2V0X2tleV9jaGVja2VkKCZjYmNfa2V5LCZrcykpICE9IDApCisJCXsKKwkJcHJpbnRmKCJLZXkgZXJyb3IgJWRcbiIsaik7CisJCWVycj0xOworCQl9CisJaWYgKChqPURFU19zZXRfa2V5X2NoZWNrZWQoJmNiYzJfa2V5LCZrczIpKSAhPSAwKQorCQl7CisJCXByaW50ZigiS2V5IGVycm9yICVkXG4iLGopOworCQllcnI9MTsKKwkJfQorCWlmICgoaj1ERVNfc2V0X2tleV9jaGVja2VkKCZjYmMzX2tleSwma3MzKSkgIT0gMCkKKwkJeworCQlwcmludGYoIktleSBlcnJvciAlZFxuIixqKTsKKwkJZXJyPTE7CisJCX0KKwltZW1zZXQoY2JjX291dCwwLDQwKTsKKwltZW1zZXQoY2JjX2luLDAsNDApOworCWk9c3RybGVuKChjaGFyICopY2JjX2RhdGEpKzE7CisJLyogaT0oKGkrNykvOCkqODsgKi8KKwltZW1jcHkoaXYzLGNiY19pdixzaXplb2YoY2JjX2l2KSk7CisJbWVtc2V0KGl2MiwnXDAnLHNpemVvZiBpdjIpOworCisJREVTX2VkZTNfY2JjbV9lbmNyeXB0KGNiY19kYXRhLGNiY19vdXQsMTZMLCZrcywma3MyLCZrczMsJml2MywmaXYyLAorCQkJICAgICAgREVTX0VOQ1JZUFQpOworCURFU19lZGUzX2NiY21fZW5jcnlwdCgmY2JjX2RhdGFbMTZdLCZjYmNfb3V0WzE2XSxpLTE2LCZrcywma3MyLCZrczMsCisJCQkgICAgICAmaXYzLCZpdjIsREVTX0VOQ1JZUFQpOworCS8qCWlmIChtZW1jbXAoY2JjX291dCxjYmMzX29rLAorCQkodW5zaWduZWQgaW50KShzdHJsZW4oKGNoYXIgKiljYmNfZGF0YSkrMSs3KS84KjgpICE9IDApCisJCXsKKwkJcHJpbnRmKCJkZXNfZWRlM19jYmNfZW5jcnlwdCBlbmNyeXB0IGVycm9yXG4iKTsKKwkJZXJyPTE7CisJCX0KKwkqLworCW1lbWNweShpdjMsY2JjX2l2LHNpemVvZihjYmNfaXYpKTsKKwltZW1zZXQoaXYyLCdcMCcsc2l6ZW9mIGl2Mik7CisJREVTX2VkZTNfY2JjbV9lbmNyeXB0KGNiY19vdXQsY2JjX2luLGksJmtzLCZrczIsJmtzMywmaXYzLCZpdjIsREVTX0RFQ1JZUFQpOworCWlmIChtZW1jbXAoY2JjX2luLGNiY19kYXRhLHN0cmxlbigoY2hhciAqKWNiY19kYXRhKSsxKSAhPSAwKQorCQl7CisJCXVuc2lnbmVkIGludCBuOworCisJCXByaW50ZigiZGVzX2VkZTNfY2JjbV9lbmNyeXB0IGRlY3J5cHQgZXJyb3JcbiIpOworCQlmb3Iobj0wIDsgbiA8IGkgOyArK24pCisJCSAgICBwcmludGYoIiAlMDJ4IixjYmNfZGF0YVtuXSk7CisJCXByaW50ZigiXG4iKTsKKwkJZm9yKG49MCA7IG4gPCBpIDsgKytuKQorCQkgICAgcHJpbnRmKCIgJTAyeCIsY2JjX2luW25dKTsKKwkJcHJpbnRmKCJcbiIpOworCQllcnI9MTsKKwkJfQorI2VuZGlmCisKKwlwcmludGYoIkRvaW5nIGVjYlxuIik7CisJZm9yIChpPTA7IGk8TlVNX1RFU1RTOyBpKyspCisJCXsKKwkJREVTX3NldF9rZXlfdW5jaGVja2VkKCZrZXlfZGF0YVtpXSwma3MpOworCQltZW1jcHkoaW4scGxhaW5fZGF0YVtpXSw4KTsKKwkJbWVtc2V0KG91dCwwLDgpOworCQltZW1zZXQob3V0aW4sMCw4KTsKKwkJZGVzX2VjYl9lbmNyeXB0KCZpbiwmb3V0LGtzLERFU19FTkNSWVBUKTsKKwkJZGVzX2VjYl9lbmNyeXB0KCZvdXQsJm91dGluLGtzLERFU19ERUNSWVBUKTsKKworCQlpZiAobWVtY21wKG91dCxjaXBoZXJfZGF0YVtpXSw4KSAhPSAwKQorCQkJeworCQkJcHJpbnRmKCJFbmNyeXB0aW9uIGVycm9yICUyZFxuaz0lcyBwPSVzIG89JXMgYWN0PSVzXG4iLAorCQkJCWkrMSxwdChrZXlfZGF0YVtpXSkscHQoaW4pLHB0KGNpcGhlcl9kYXRhW2ldKSwKKwkJCQlwdChvdXQpKTsKKwkJCWVycj0xOworCQkJfQorCQlpZiAobWVtY21wKGluLG91dGluLDgpICE9IDApCisJCQl7CisJCQlwcmludGYoIkRlY3J5cHRpb24gZXJyb3IgJTJkXG5rPSVzIHA9JXMgbz0lcyBhY3Q9JXNcbiIsCisJCQkJaSsxLHB0KGtleV9kYXRhW2ldKSxwdChvdXQpLHB0KGluKSxwdChvdXRpbikpOworCQkJZXJyPTE7CisJCQl9CisJCX0KKworI2lmbmRlZiBMSUJERVNfTElUCisJcHJpbnRmKCJEb2luZyBlZGUgZWNiXG4iKTsKKwlmb3IgKGk9MDsgaTwoTlVNX1RFU1RTLTIpOyBpKyspCisJCXsKKwkJREVTX3NldF9rZXlfdW5jaGVja2VkKCZrZXlfZGF0YVtpXSwma3MpOworCQlERVNfc2V0X2tleV91bmNoZWNrZWQoJmtleV9kYXRhW2krMV0sJmtzMik7CisJCURFU19zZXRfa2V5X3VuY2hlY2tlZCgma2V5X2RhdGFbaSsyXSwma3MzKTsKKwkJbWVtY3B5KGluLHBsYWluX2RhdGFbaV0sOCk7CisJCW1lbXNldChvdXQsMCw4KTsKKwkJbWVtc2V0KG91dGluLDAsOCk7CisJCWRlc19lY2IyX2VuY3J5cHQoJmluLCZvdXQsa3Msa3MyLERFU19FTkNSWVBUKTsKKwkJZGVzX2VjYjJfZW5jcnlwdCgmb3V0LCZvdXRpbixrcyxrczIsREVTX0RFQ1JZUFQpOworCisJCWlmIChtZW1jbXAob3V0LGNpcGhlcl9lY2IyW2ldLDgpICE9IDApCisJCQl7CisJCQlwcmludGYoIkVuY3J5cHRpb24gZXJyb3IgJTJkXG5rPSVzIHA9JXMgbz0lcyBhY3Q9JXNcbiIsCisJCQkJaSsxLHB0KGtleV9kYXRhW2ldKSxwdChpbikscHQoY2lwaGVyX2VjYjJbaV0pLAorCQkJCXB0KG91dCkpOworCQkJZXJyPTE7CisJCQl9CisJCWlmIChtZW1jbXAoaW4sb3V0aW4sOCkgIT0gMCkKKwkJCXsKKwkJCXByaW50ZigiRGVjcnlwdGlvbiBlcnJvciAlMmRcbms9JXMgcD0lcyBvPSVzIGFjdD0lc1xuIiwKKwkJCQlpKzEscHQoa2V5X2RhdGFbaV0pLHB0KG91dCkscHQoaW4pLHB0KG91dGluKSk7CisJCQllcnI9MTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwlwcmludGYoIkRvaW5nIGNiY1xuIik7CisJaWYgKChqPURFU19zZXRfa2V5X2NoZWNrZWQoJmNiY19rZXksJmtzKSkgIT0gMCkKKwkJeworCQlwcmludGYoIktleSBlcnJvciAlZFxuIixqKTsKKwkJZXJyPTE7CisJCX0KKwltZW1zZXQoY2JjX291dCwwLDQwKTsKKwltZW1zZXQoY2JjX2luLDAsNDApOworCW1lbWNweShpdjMsY2JjX2l2LHNpemVvZihjYmNfaXYpKTsKKwlkZXNfbmNiY19lbmNyeXB0KGNiY19kYXRhLGNiY19vdXQsc3RybGVuKChjaGFyICopY2JjX2RhdGEpKzEsa3MsCisJCQkgJml2MyxERVNfRU5DUllQVCk7CisJaWYgKG1lbWNtcChjYmNfb3V0LGNiY19vaywzMikgIT0gMCkKKwkJeworCQlwcmludGYoImNiY19lbmNyeXB0IGVuY3J5cHQgZXJyb3JcbiIpOworCQllcnI9MTsKKwkJfQorCisJbWVtY3B5KGl2MyxjYmNfaXYsc2l6ZW9mKGNiY19pdikpOworCWRlc19uY2JjX2VuY3J5cHQoY2JjX291dCxjYmNfaW4sc3RybGVuKChjaGFyICopY2JjX2RhdGEpKzEsa3MsCisJCQkgJml2MyxERVNfREVDUllQVCk7CisJaWYgKG1lbWNtcChjYmNfaW4sY2JjX2RhdGEsc3RybGVuKChjaGFyICopY2JjX2RhdGEpKSAhPSAwKQorCQl7CisJCXByaW50ZigiY2JjX2VuY3J5cHQgZGVjcnlwdCBlcnJvclxuIik7CisJCWVycj0xOworCQl9CisKKyNpZm5kZWYgTElCREVTX0xJVAorCXByaW50ZigiRG9pbmcgZGVzeCBjYmNcbiIpOworCWlmICgoaj1ERVNfc2V0X2tleV9jaGVja2VkKCZjYmNfa2V5LCZrcykpICE9IDApCisJCXsKKwkJcHJpbnRmKCJLZXkgZXJyb3IgJWRcbiIsaik7CisJCWVycj0xOworCQl9CisJbWVtc2V0KGNiY19vdXQsMCw0MCk7CisJbWVtc2V0KGNiY19pbiwwLDQwKTsKKwltZW1jcHkoaXYzLGNiY19pdixzaXplb2YoY2JjX2l2KSk7CisJZGVzX3hjYmNfZW5jcnlwdChjYmNfZGF0YSxjYmNfb3V0LHN0cmxlbigoY2hhciAqKWNiY19kYXRhKSsxLGtzLAorCQkJICZpdjMsJmNiYzJfa2V5LCZjYmMzX2tleSwgREVTX0VOQ1JZUFQpOworCWlmIChtZW1jbXAoY2JjX291dCx4Y2JjX29rLDMyKSAhPSAwKQorCQl7CisJCXByaW50ZigiZGVzX3hjYmNfZW5jcnlwdCBlbmNyeXB0IGVycm9yXG4iKTsKKwkJZXJyPTE7CisJCX0KKwltZW1jcHkoaXYzLGNiY19pdixzaXplb2YoY2JjX2l2KSk7CisJZGVzX3hjYmNfZW5jcnlwdChjYmNfb3V0LGNiY19pbixzdHJsZW4oKGNoYXIgKiljYmNfZGF0YSkrMSxrcywKKwkJCSAmaXYzLCZjYmMyX2tleSwmY2JjM19rZXksIERFU19ERUNSWVBUKTsKKwlpZiAobWVtY21wKGNiY19pbixjYmNfZGF0YSxzdHJsZW4oKGNoYXIgKiljYmNfZGF0YSkrMSkgIT0gMCkKKwkJeworCQlwcmludGYoImRlc194Y2JjX2VuY3J5cHQgZGVjcnlwdCBlcnJvclxuIik7CisJCWVycj0xOworCQl9CisjZW5kaWYKKworCXByaW50ZigiRG9pbmcgZWRlIGNiY1xuIik7CisJaWYgKChqPURFU19zZXRfa2V5X2NoZWNrZWQoJmNiY19rZXksJmtzKSkgIT0gMCkKKwkJeworCQlwcmludGYoIktleSBlcnJvciAlZFxuIixqKTsKKwkJZXJyPTE7CisJCX0KKwlpZiAoKGo9REVTX3NldF9rZXlfY2hlY2tlZCgmY2JjMl9rZXksJmtzMikpICE9IDApCisJCXsKKwkJcHJpbnRmKCJLZXkgZXJyb3IgJWRcbiIsaik7CisJCWVycj0xOworCQl9CisJaWYgKChqPURFU19zZXRfa2V5X2NoZWNrZWQoJmNiYzNfa2V5LCZrczMpKSAhPSAwKQorCQl7CisJCXByaW50ZigiS2V5IGVycm9yICVkXG4iLGopOworCQllcnI9MTsKKwkJfQorCW1lbXNldChjYmNfb3V0LDAsNDApOworCW1lbXNldChjYmNfaW4sMCw0MCk7CisJaT1zdHJsZW4oKGNoYXIgKiljYmNfZGF0YSkrMTsKKwkvKiBpPSgoaSs3KS84KSo4OyAqLworCW1lbWNweShpdjMsY2JjX2l2LHNpemVvZihjYmNfaXYpKTsKKworCWRlc19lZGUzX2NiY19lbmNyeXB0KGNiY19kYXRhLGNiY19vdXQsMTZMLGtzLGtzMixrczMsJml2MywKKwkJCSAgICAgREVTX0VOQ1JZUFQpOworCWRlc19lZGUzX2NiY19lbmNyeXB0KCYoY2JjX2RhdGFbMTZdKSwmKGNiY19vdXRbMTZdKSxpLTE2LGtzLGtzMixrczMsCisJCQkgICAgICZpdjMsREVTX0VOQ1JZUFQpOworCWlmIChtZW1jbXAoY2JjX291dCxjYmMzX29rLAorCQkodW5zaWduZWQgaW50KShzdHJsZW4oKGNoYXIgKiljYmNfZGF0YSkrMSs3KS84KjgpICE9IDApCisJCXsKKwkJdW5zaWduZWQgaW50IG47CisKKwkJcHJpbnRmKCJkZXNfZWRlM19jYmNfZW5jcnlwdCBlbmNyeXB0IGVycm9yXG4iKTsKKwkJZm9yKG49MCA7IG4gPCBpIDsgKytuKQorCQkgICAgcHJpbnRmKCIgJTAyeCIsY2JjX291dFtuXSk7CisJCXByaW50ZigiXG4iKTsKKwkJZm9yKG49MCA7IG4gPCBpIDsgKytuKQorCQkgICAgcHJpbnRmKCIgJTAyeCIsY2JjM19va1tuXSk7CisJCXByaW50ZigiXG4iKTsKKwkJZXJyPTE7CisJCX0KKworCW1lbWNweShpdjMsY2JjX2l2LHNpemVvZihjYmNfaXYpKTsKKwlkZXNfZWRlM19jYmNfZW5jcnlwdChjYmNfb3V0LGNiY19pbixpLGtzLGtzMixrczMsJml2MyxERVNfREVDUllQVCk7CisJaWYgKG1lbWNtcChjYmNfaW4sY2JjX2RhdGEsc3RybGVuKChjaGFyICopY2JjX2RhdGEpKzEpICE9IDApCisJCXsKKwkJdW5zaWduZWQgaW50IG47CisKKwkJcHJpbnRmKCJkZXNfZWRlM19jYmNfZW5jcnlwdCBkZWNyeXB0IGVycm9yXG4iKTsKKwkJZm9yKG49MCA7IG4gPCBpIDsgKytuKQorCQkgICAgcHJpbnRmKCIgJTAyeCIsY2JjX2RhdGFbbl0pOworCQlwcmludGYoIlxuIik7CisJCWZvcihuPTAgOyBuIDwgaSA7ICsrbikKKwkJICAgIHByaW50ZigiICUwMngiLGNiY19pbltuXSk7CisJCXByaW50ZigiXG4iKTsKKwkJZXJyPTE7CisJCX0KKworI2lmbmRlZiBMSUJERVNfTElUCisJcHJpbnRmKCJEb2luZyBwY2JjXG4iKTsKKwlpZiAoKGo9REVTX3NldF9rZXlfY2hlY2tlZCgmY2JjX2tleSwma3MpKSAhPSAwKQorCQl7CisJCXByaW50ZigiS2V5IGVycm9yICVkXG4iLGopOworCQllcnI9MTsKKwkJfQorCW1lbXNldChjYmNfb3V0LDAsNDApOworCW1lbXNldChjYmNfaW4sMCw0MCk7CisJZGVzX3BjYmNfZW5jcnlwdChjYmNfZGF0YSxjYmNfb3V0LHN0cmxlbigoY2hhciAqKWNiY19kYXRhKSsxLGtzLAorCQkJICZjYmNfaXYsREVTX0VOQ1JZUFQpOworCWlmIChtZW1jbXAoY2JjX291dCxwY2JjX29rLDMyKSAhPSAwKQorCQl7CisJCXByaW50ZigicGNiY19lbmNyeXB0IGVuY3J5cHQgZXJyb3JcbiIpOworCQllcnI9MTsKKwkJfQorCWRlc19wY2JjX2VuY3J5cHQoY2JjX291dCxjYmNfaW4sc3RybGVuKChjaGFyICopY2JjX2RhdGEpKzEsa3MsJmNiY19pdiwKKwkJCSBERVNfREVDUllQVCk7CisJaWYgKG1lbWNtcChjYmNfaW4sY2JjX2RhdGEsc3RybGVuKChjaGFyICopY2JjX2RhdGEpKzEpICE9IDApCisJCXsKKwkJcHJpbnRmKCJwY2JjX2VuY3J5cHQgZGVjcnlwdCBlcnJvclxuIik7CisJCWVycj0xOworCQl9CisKKwlwcmludGYoIkRvaW5nICIpOworCXByaW50ZigiY2ZiOCAiKTsKKwllcnIrPWNmYl90ZXN0KDgsY2ZiX2NpcGhlcjgpOworCXByaW50ZigiY2ZiMTYgIik7CisJZXJyKz1jZmJfdGVzdCgxNixjZmJfY2lwaGVyMTYpOworCXByaW50ZigiY2ZiMzIgIik7CisJZXJyKz1jZmJfdGVzdCgzMixjZmJfY2lwaGVyMzIpOworCXByaW50ZigiY2ZiNDggIik7CisJZXJyKz1jZmJfdGVzdCg0OCxjZmJfY2lwaGVyNDgpOworCXByaW50ZigiY2ZiNjQgIik7CisJZXJyKz1jZmJfdGVzdCg2NCxjZmJfY2lwaGVyNjQpOworCisJcHJpbnRmKCJjZmI2NCgpICIpOworCWVycis9Y2ZiNjRfdGVzdChjZmJfY2lwaGVyNjQpOworCisJbWVtY3B5KGNmYl90bXAsY2ZiX2l2LHNpemVvZihjZmJfaXYpKTsKKwlmb3IgKGk9MDsgaTxzaXplb2YocGxhaW4pOyBpKyspCisJCWRlc19jZmJfZW5jcnlwdCgmKHBsYWluW2ldKSwmKGNmYl9idWYxW2ldKSwKKwkJCTgsMSxrcywmY2ZiX3RtcCxERVNfRU5DUllQVCk7CisJaWYgKG1lbWNtcChjZmJfY2lwaGVyOCxjZmJfYnVmMSxzaXplb2YocGxhaW4pKSAhPSAwKQorCQl7CisJCXByaW50ZigiY2ZiX2VuY3J5cHQgc21hbGwgZW5jcnlwdCBlcnJvclxuIik7CisJCWVycj0xOworCQl9CisKKwltZW1jcHkoY2ZiX3RtcCxjZmJfaXYsc2l6ZW9mKGNmYl9pdikpOworCWZvciAoaT0wOyBpPHNpemVvZihwbGFpbik7IGkrKykKKwkJZGVzX2NmYl9lbmNyeXB0KCYoY2ZiX2J1ZjFbaV0pLCYoY2ZiX2J1ZjJbaV0pLAorCQkJOCwxLGtzLCZjZmJfdG1wLERFU19ERUNSWVBUKTsKKwlpZiAobWVtY21wKHBsYWluLGNmYl9idWYyLHNpemVvZihwbGFpbikpICE9IDApCisJCXsKKwkJcHJpbnRmKCJjZmJfZW5jcnlwdCBzbWFsbCBkZWNyeXB0IGVycm9yXG4iKTsKKwkJZXJyPTE7CisJCX0KKworCXByaW50ZigiZWRlX2NmYjY0KCkgIik7CisJZXJyKz1lZGVfY2ZiNjRfdGVzdChjZmJfY2lwaGVyNjQpOworCisJcHJpbnRmKCJkb25lXG4iKTsKKworCXByaW50ZigiRG9pbmcgb2ZiXG4iKTsKKwlERVNfc2V0X2tleV9jaGVja2VkKCZvZmJfa2V5LCZrcyk7CisJbWVtY3B5KG9mYl90bXAsb2ZiX2l2LHNpemVvZihvZmJfaXYpKTsKKwlkZXNfb2ZiX2VuY3J5cHQocGxhaW4sb2ZiX2J1ZjEsNjQsc2l6ZW9mKHBsYWluKS84LGtzLCZvZmJfdG1wKTsKKwlpZiAobWVtY21wKG9mYl9jaXBoZXIsb2ZiX2J1ZjEsc2l6ZW9mKG9mYl9idWYxKSkgIT0gMCkKKwkJeworCQlwcmludGYoIm9mYl9lbmNyeXB0IGVuY3J5cHQgZXJyb3JcbiIpOworcHJpbnRmKCIlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCitvZmJfYnVmMVs4KzBdLCBvZmJfYnVmMVs4KzFdLCBvZmJfYnVmMVs4KzJdLCBvZmJfYnVmMVs4KzNdLAorb2ZiX2J1ZjFbOCs0XSwgb2ZiX2J1ZjFbOCs1XSwgb2ZiX2J1ZjFbOCs2XSwgb2ZiX2J1ZjFbOCs3XSk7CitwcmludGYoIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKK29mYl9idWYxWzgrMF0sIG9mYl9jaXBoZXJbOCsxXSwgb2ZiX2NpcGhlcls4KzJdLCBvZmJfY2lwaGVyWzgrM10sCitvZmJfYnVmMVs4KzRdLCBvZmJfY2lwaGVyWzgrNV0sIG9mYl9jaXBoZXJbOCs2XSwgb2ZiX2NpcGhlcls4KzddKTsKKwkJZXJyPTE7CisJCX0KKwltZW1jcHkob2ZiX3RtcCxvZmJfaXYsc2l6ZW9mKG9mYl9pdikpOworCWRlc19vZmJfZW5jcnlwdChvZmJfYnVmMSxvZmJfYnVmMiw2NCxzaXplb2Yob2ZiX2J1ZjEpLzgsa3MsJm9mYl90bXApOworCWlmIChtZW1jbXAocGxhaW4sb2ZiX2J1ZjIsc2l6ZW9mKG9mYl9idWYyKSkgIT0gMCkKKwkJeworCQlwcmludGYoIm9mYl9lbmNyeXB0IGRlY3J5cHQgZXJyb3JcbiIpOworcHJpbnRmKCIlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCitvZmJfYnVmMls4KzBdLCBvZmJfYnVmMls4KzFdLCBvZmJfYnVmMls4KzJdLCBvZmJfYnVmMls4KzNdLAorb2ZiX2J1ZjJbOCs0XSwgb2ZiX2J1ZjJbOCs1XSwgb2ZiX2J1ZjJbOCs2XSwgb2ZiX2J1ZjJbOCs3XSk7CitwcmludGYoIiUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKK3BsYWluWzgrMF0sIHBsYWluWzgrMV0sIHBsYWluWzgrMl0sIHBsYWluWzgrM10sCitwbGFpbls4KzRdLCBwbGFpbls4KzVdLCBwbGFpbls4KzZdLCBwbGFpbls4KzddKTsKKwkJZXJyPTE7CisJCX0KKworCXByaW50ZigiRG9pbmcgb2ZiNjRcbiIpOworCURFU19zZXRfa2V5X2NoZWNrZWQoJm9mYl9rZXksJmtzKTsKKwltZW1jcHkob2ZiX3RtcCxvZmJfaXYsc2l6ZW9mKG9mYl9pdikpOworCW1lbXNldChvZmJfYnVmMSwwLHNpemVvZihvZmJfYnVmMSkpOworCW1lbXNldChvZmJfYnVmMiwwLHNpemVvZihvZmJfYnVmMSkpOworCW51bT0wOworCWZvciAoaT0wOyBpPHNpemVvZihwbGFpbik7IGkrKykKKwkJeworCQlkZXNfb2ZiNjRfZW5jcnlwdCgmKHBsYWluW2ldKSwmKG9mYl9idWYxW2ldKSwxLGtzLCZvZmJfdG1wLAorCQkJCSAgJm51bSk7CisJCX0KKwlpZiAobWVtY21wKG9mYl9jaXBoZXIsb2ZiX2J1ZjEsc2l6ZW9mKG9mYl9idWYxKSkgIT0gMCkKKwkJeworCQlwcmludGYoIm9mYjY0X2VuY3J5cHQgZW5jcnlwdCBlcnJvclxuIik7CisJCWVycj0xOworCQl9CisJbWVtY3B5KG9mYl90bXAsb2ZiX2l2LHNpemVvZihvZmJfaXYpKTsKKwludW09MDsKKwlkZXNfb2ZiNjRfZW5jcnlwdChvZmJfYnVmMSxvZmJfYnVmMixzaXplb2Yob2ZiX2J1ZjEpLGtzLCZvZmJfdG1wLAorCQkJICAmbnVtKTsKKwlpZiAobWVtY21wKHBsYWluLG9mYl9idWYyLHNpemVvZihvZmJfYnVmMikpICE9IDApCisJCXsKKwkJcHJpbnRmKCJvZmI2NF9lbmNyeXB0IGRlY3J5cHQgZXJyb3JcbiIpOworCQllcnI9MTsKKwkJfQorCisJcHJpbnRmKCJEb2luZyBlZGVfb2ZiNjRcbiIpOworCURFU19zZXRfa2V5X2NoZWNrZWQoJm9mYl9rZXksJmtzKTsKKwltZW1jcHkob2ZiX3RtcCxvZmJfaXYsc2l6ZW9mKG9mYl9pdikpOworCW1lbXNldChvZmJfYnVmMSwwLHNpemVvZihvZmJfYnVmMSkpOworCW1lbXNldChvZmJfYnVmMiwwLHNpemVvZihvZmJfYnVmMSkpOworCW51bT0wOworCWZvciAoaT0wOyBpPHNpemVvZihwbGFpbik7IGkrKykKKwkJeworCQlkZXNfZWRlM19vZmI2NF9lbmNyeXB0KCYocGxhaW5baV0pLCYob2ZiX2J1ZjFbaV0pLDEsa3Msa3MsCisJCQkJICAgICAgIGtzLCZvZmJfdG1wLCZudW0pOworCQl9CisJaWYgKG1lbWNtcChvZmJfY2lwaGVyLG9mYl9idWYxLHNpemVvZihvZmJfYnVmMSkpICE9IDApCisJCXsKKwkJcHJpbnRmKCJlZGVfb2ZiNjRfZW5jcnlwdCBlbmNyeXB0IGVycm9yXG4iKTsKKwkJZXJyPTE7CisJCX0KKwltZW1jcHkob2ZiX3RtcCxvZmJfaXYsc2l6ZW9mKG9mYl9pdikpOworCW51bT0wOworCWRlc19lZGUzX29mYjY0X2VuY3J5cHQob2ZiX2J1ZjEsb2ZiX2J1ZjIsc2l6ZW9mKG9mYl9idWYxKSxrcyxrcyxrcywKKwkJCSAgICAgICAmb2ZiX3RtcCwmbnVtKTsKKwlpZiAobWVtY21wKHBsYWluLG9mYl9idWYyLHNpemVvZihvZmJfYnVmMikpICE9IDApCisJCXsKKwkJcHJpbnRmKCJlZGVfb2ZiNjRfZW5jcnlwdCBkZWNyeXB0IGVycm9yXG4iKTsKKwkJZXJyPTE7CisJCX0KKworCXByaW50ZigiRG9pbmcgY2JjX2Nrc3VtXG4iKTsKKwlERVNfc2V0X2tleV9jaGVja2VkKCZjYmNfa2V5LCZrcyk7CisJY3M9ZGVzX2NiY19ja3N1bShjYmNfZGF0YSwmY3JldCxzdHJsZW4oKGNoYXIgKiljYmNfZGF0YSksa3MsJmNiY19pdik7CisJaWYgKGNzICE9IGNiY19ja3N1bV9yZXQpCisJCXsKKwkJcHJpbnRmKCJiYWQgcmV0dXJuIHZhbHVlICglMDhsWCksIHNob3VsZCBiZSAlMDhsWFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWNzLCh1bnNpZ25lZCBsb25nKWNiY19ja3N1bV9yZXQpOworCQllcnI9MTsKKwkJfQorCWlmIChtZW1jbXAoY3JldCxjYmNfY2tzdW1fZGF0YSw4KSAhPSAwKQorCQl7CisJCXByaW50ZigiYmFkIGNiY19ja3N1bSBibG9jayByZXR1cm5lZFxuIik7CisJCWVycj0xOworCQl9CisKKwlwcmludGYoIkRvaW5nIHF1YWRfY2tzdW1cbiIpOworCWNzPWRlc19xdWFkX2Nrc3VtKGNiY19kYXRhLChkZXNfY2Jsb2NrICopbHFyZXQsCisJCShsb25nKXN0cmxlbigoY2hhciAqKWNiY19kYXRhKSwyLChkZXNfY2Jsb2NrICopY2JjX2l2KTsKKwlpZiAoY3MgIT0gMHg3MGQ3YTYzYUwpCisJCXsKKwkJcHJpbnRmKCJxdWFkX2Nrc3VtIGVycm9yLCByZXQgJTA4bHggc2hvdWxkIGJlIDcwZDdhNjNhXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpY3MpOworCQllcnI9MTsKKwkJfQorI2lmZGVmIF9DUkFZCisJaWYgKGxxcmV0WzBdLmEgIT0gMHgzMjdlYmE4ZEwpCisJCXsKKwkJcHJpbnRmKCJxdWFkX2Nrc3VtIGVycm9yLCBvdXRbMF0gJTA4bHggaXMgbm90ICUwOGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpbHFyZXRbMF0uYSwweDMyN2ViYThkVUwpOworCQllcnI9MTsKKwkJfQorCWlmIChscXJldFswXS5iICE9IDB4MjAxYTQ5Y2NMKQorCQl7CisJCXByaW50ZigicXVhZF9ja3N1bSBlcnJvciwgb3V0WzFdICUwOGx4IGlzIG5vdCAlMDhseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWxxcmV0WzBdLmIsMHgyMDFhNDljY1VMKTsKKwkJZXJyPTE7CisJCX0KKwlpZiAobHFyZXRbMV0uYSAhPSAweDcwZDdhNjNhTCkKKwkJeworCQlwcmludGYoInF1YWRfY2tzdW0gZXJyb3IsIG91dFsyXSAlMDhseCBpcyBub3QgJTA4bHhcbiIsCisJCQkodW5zaWduZWQgbG9uZylscXJldFsxXS5hLDB4NzBkN2E2M2FVTCk7CisJCWVycj0xOworCQl9CisJaWYgKGxxcmV0WzFdLmIgIT0gMHg1MDFjMmMyNkwpCisJCXsKKwkJcHJpbnRmKCJxdWFkX2Nrc3VtIGVycm9yLCBvdXRbM10gJTA4bHggaXMgbm90ICUwOGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpbHFyZXRbMV0uYiwweDUwMWMyYzI2VUwpOworCQllcnI9MTsKKwkJfQorI2Vsc2UKKwlpZiAobHFyZXRbMF0gIT0gMHgzMjdlYmE4ZEwpCisJCXsKKwkJcHJpbnRmKCJxdWFkX2Nrc3VtIGVycm9yLCBvdXRbMF0gJTA4bHggaXMgbm90ICUwOGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpbHFyZXRbMF0sMHgzMjdlYmE4ZFVMKTsKKwkJZXJyPTE7CisJCX0KKwlpZiAobHFyZXRbMV0gIT0gMHgyMDFhNDljY0wpCisJCXsKKwkJcHJpbnRmKCJxdWFkX2Nrc3VtIGVycm9yLCBvdXRbMV0gJTA4bHggaXMgbm90ICUwOGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpbHFyZXRbMV0sMHgyMDFhNDljY1VMKTsKKwkJZXJyPTE7CisJCX0KKwlpZiAobHFyZXRbMl0gIT0gMHg3MGQ3YTYzYUwpCisJCXsKKwkJcHJpbnRmKCJxdWFkX2Nrc3VtIGVycm9yLCBvdXRbMl0gJTA4bHggaXMgbm90ICUwOGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpbHFyZXRbMl0sMHg3MGQ3YTYzYVVMKTsKKwkJZXJyPTE7CisJCX0KKwlpZiAobHFyZXRbM10gIT0gMHg1MDFjMmMyNkwpCisJCXsKKwkJcHJpbnRmKCJxdWFkX2Nrc3VtIGVycm9yLCBvdXRbM10gJTA4bHggaXMgbm90ICUwOGx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpbHFyZXRbM10sMHg1MDFjMmMyNlVMKTsKKwkJZXJyPTE7CisJCX0KKyNlbmRpZgorI2VuZGlmCisKKwlwcmludGYoImlucHV0IHdvcmQgYWxpZ25tZW50IHRlc3QiKTsKKwlmb3IgKGk9MDsgaTw0OyBpKyspCisJCXsKKwkJcHJpbnRmKCIgJWQiLGkpOworCQlkZXNfbmNiY19lbmNyeXB0KCYoY2JjX291dFtpXSksY2JjX2luLAorCQkJCSBzdHJsZW4oKGNoYXIgKiljYmNfZGF0YSkrMSxrcywKKwkJCQkgJmNiY19pdixERVNfRU5DUllQVCk7CisJCX0KKwlwcmludGYoIlxub3V0cHV0IHdvcmQgYWxpZ25tZW50IHRlc3QiKTsKKwlmb3IgKGk9MDsgaTw0OyBpKyspCisJCXsKKwkJcHJpbnRmKCIgJWQiLGkpOworCQlkZXNfbmNiY19lbmNyeXB0KGNiY19vdXQsJihjYmNfaW5baV0pLAorCQkJCSBzdHJsZW4oKGNoYXIgKiljYmNfZGF0YSkrMSxrcywKKwkJCQkgJmNiY19pdixERVNfRU5DUllQVCk7CisJCX0KKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCJmYXN0IGNyeXB0IHRlc3QgIik7CisJc3RyPWNyeXB0KCJ0ZXN0aW5nIiwiZWYiKTsKKwlpZiAoc3RyY21wKCJlZkduUXgyNzI1YkkyIixzdHIpICE9IDApCisJCXsKKwkJcHJpbnRmKCJmYXN0IGNyeXB0IGVycm9yLCAlcyBzaG91bGQgYmUgZWZHblF4MjcyNWJJMlxuIixzdHIpOworCQllcnI9MTsKKwkJfQorCXN0cj1jcnlwdCgiYmNhNzY7MjMiLCJ5QSIpOworCWlmIChzdHJjbXAoInlBMVJwLzFoWlhJSmsiLHN0cikgIT0gMCkKKwkJeworCQlwcmludGYoImZhc3QgY3J5cHQgZXJyb3IsICVzIHNob3VsZCBiZSB5QTFScC8xaFpYSUprXG4iLHN0cik7CisJCWVycj0xOworCQl9CisjaWZkZWYgT1BFTlNTTF9TWVNfTkVUV0FSRQorICAgIGlmIChlcnIpIHByaW50ZigiRVJST1I6ICVkXG4iLCBlcnIpOworI2VuZGlmCisJcHJpbnRmKCJcbiIpOworCXJldHVybihlcnIpOworCX0KKworc3RhdGljIGNoYXIgKnB0KHVuc2lnbmVkIGNoYXIgKnApCisJeworCXN0YXRpYyBjaGFyIGJ1ZnNbMTBdWzIwXTsKKwlzdGF0aWMgaW50IGJudW09MDsKKwljaGFyICpyZXQ7CisJaW50IGk7CisJc3RhdGljIGNoYXIgKmY9IjAxMjM0NTY3ODlBQkNERUYiOworCisJcmV0PSAmKGJ1ZnNbYm51bSsrXVswXSk7CisJYm51bSU9MTA7CisJZm9yIChpPTA7IGk8ODsgaSsrKQorCQl7CisJCXJldFtpKjJdPWZbKHBbaV0+PjQpJjB4Zl07CisJCXJldFtpKjIrMV09ZltwW2ldJjB4Zl07CisJCX0KKwlyZXRbMTZdPSdcMCc7CisJcmV0dXJuKHJldCk7CisJfQorCisjaWZuZGVmIExJQkRFU19MSVQKKworc3RhdGljIGludCBjZmJfdGVzdChpbnQgYml0cywgdW5zaWduZWQgY2hhciAqY2ZiX2NpcGhlcikKKwl7CisJZGVzX2tleV9zY2hlZHVsZSBrczsKKwlpbnQgaSxlcnI9MDsKKworCURFU19zZXRfa2V5X2NoZWNrZWQoJmNmYl9rZXksJmtzKTsKKwltZW1jcHkoY2ZiX3RtcCxjZmJfaXYsc2l6ZW9mKGNmYl9pdikpOworCWRlc19jZmJfZW5jcnlwdChwbGFpbixjZmJfYnVmMSxiaXRzLHNpemVvZihwbGFpbiksa3MsJmNmYl90bXAsCisJCQlERVNfRU5DUllQVCk7CisJaWYgKG1lbWNtcChjZmJfY2lwaGVyLGNmYl9idWYxLHNpemVvZihwbGFpbikpICE9IDApCisJCXsKKwkJZXJyPTE7CisJCXByaW50ZigiY2ZiX2VuY3J5cHQgZW5jcnlwdCBlcnJvclxuIik7CisJCWZvciAoaT0wOyBpPDI0OyBpKz04KQorCQkJcHJpbnRmKCIlc1xuIixwdCgmKGNmYl9idWYxW2ldKSkpOworCQl9CisJbWVtY3B5KGNmYl90bXAsY2ZiX2l2LHNpemVvZihjZmJfaXYpKTsKKwlkZXNfY2ZiX2VuY3J5cHQoY2ZiX2J1ZjEsY2ZiX2J1ZjIsYml0cyxzaXplb2YocGxhaW4pLGtzLCZjZmJfdG1wLAorCQkJREVTX0RFQ1JZUFQpOworCWlmIChtZW1jbXAocGxhaW4sY2ZiX2J1ZjIsc2l6ZW9mKHBsYWluKSkgIT0gMCkKKwkJeworCQllcnI9MTsKKwkJcHJpbnRmKCJjZmJfZW5jcnlwdCBkZWNyeXB0IGVycm9yXG4iKTsKKwkJZm9yIChpPTA7IGk8MjQ7IGkrPTgpCisJCQlwcmludGYoIiVzXG4iLHB0KCYoY2ZiX2J1ZjFbaV0pKSk7CisJCX0KKwlyZXR1cm4oZXJyKTsKKwl9CisKK3N0YXRpYyBpbnQgY2ZiNjRfdGVzdCh1bnNpZ25lZCBjaGFyICpjZmJfY2lwaGVyKQorCXsKKwlkZXNfa2V5X3NjaGVkdWxlIGtzOworCWludCBlcnI9MCxpLG47CisKKwlERVNfc2V0X2tleV9jaGVja2VkKCZjZmJfa2V5LCZrcyk7CisJbWVtY3B5KGNmYl90bXAsY2ZiX2l2LHNpemVvZihjZmJfaXYpKTsKKwluPTA7CisJZGVzX2NmYjY0X2VuY3J5cHQocGxhaW4sY2ZiX2J1ZjEsMTIsa3MsJmNmYl90bXAsJm4sREVTX0VOQ1JZUFQpOworCWRlc19jZmI2NF9lbmNyeXB0KCYocGxhaW5bMTJdKSwmKGNmYl9idWYxWzEyXSksc2l6ZW9mKHBsYWluKS0xMixrcywKKwkJCSAgJmNmYl90bXAsJm4sREVTX0VOQ1JZUFQpOworCWlmIChtZW1jbXAoY2ZiX2NpcGhlcixjZmJfYnVmMSxzaXplb2YocGxhaW4pKSAhPSAwKQorCQl7CisJCWVycj0xOworCQlwcmludGYoImNmYl9lbmNyeXB0IGVuY3J5cHQgZXJyb3JcbiIpOworCQlmb3IgKGk9MDsgaTwyNDsgaSs9OCkKKwkJCXByaW50ZigiJXNcbiIscHQoJihjZmJfYnVmMVtpXSkpKTsKKwkJfQorCW1lbWNweShjZmJfdG1wLGNmYl9pdixzaXplb2YoY2ZiX2l2KSk7CisJbj0wOworCWRlc19jZmI2NF9lbmNyeXB0KGNmYl9idWYxLGNmYl9idWYyLDE3LGtzLCZjZmJfdG1wLCZuLERFU19ERUNSWVBUKTsKKwlkZXNfY2ZiNjRfZW5jcnlwdCgmKGNmYl9idWYxWzE3XSksJihjZmJfYnVmMlsxN10pLAorCQkJICBzaXplb2YocGxhaW4pLTE3LGtzLCZjZmJfdG1wLCZuLERFU19ERUNSWVBUKTsKKwlpZiAobWVtY21wKHBsYWluLGNmYl9idWYyLHNpemVvZihwbGFpbikpICE9IDApCisJCXsKKwkJZXJyPTE7CisJCXByaW50ZigiY2ZiX2VuY3J5cHQgZGVjcnlwdCBlcnJvclxuIik7CisJCWZvciAoaT0wOyBpPDI0OyBpKz04KQorCQkJcHJpbnRmKCIlc1xuIixwdCgmKGNmYl9idWYyW2ldKSkpOworCQl9CisJcmV0dXJuKGVycik7CisJfQorCitzdGF0aWMgaW50IGVkZV9jZmI2NF90ZXN0KHVuc2lnbmVkIGNoYXIgKmNmYl9jaXBoZXIpCisJeworCWRlc19rZXlfc2NoZWR1bGUga3M7CisJaW50IGVycj0wLGksbjsKKworCURFU19zZXRfa2V5X2NoZWNrZWQoJmNmYl9rZXksJmtzKTsKKwltZW1jcHkoY2ZiX3RtcCxjZmJfaXYsc2l6ZW9mKGNmYl9pdikpOworCW49MDsKKwlkZXNfZWRlM19jZmI2NF9lbmNyeXB0KHBsYWluLGNmYl9idWYxLDEyLGtzLGtzLGtzLCZjZmJfdG1wLCZuLAorCQkJICAgICAgIERFU19FTkNSWVBUKTsKKwlkZXNfZWRlM19jZmI2NF9lbmNyeXB0KCYocGxhaW5bMTJdKSwmKGNmYl9idWYxWzEyXSksCisJCQkgICAgICAgc2l6ZW9mKHBsYWluKS0xMixrcyxrcyxrcywKKwkJCSAgICAgICAmY2ZiX3RtcCwmbixERVNfRU5DUllQVCk7CisJaWYgKG1lbWNtcChjZmJfY2lwaGVyLGNmYl9idWYxLHNpemVvZihwbGFpbikpICE9IDApCisJCXsKKwkJZXJyPTE7CisJCXByaW50ZigiZWRlX2NmYl9lbmNyeXB0IGVuY3J5cHQgZXJyb3JcbiIpOworCQlmb3IgKGk9MDsgaTwyNDsgaSs9OCkKKwkJCXByaW50ZigiJXNcbiIscHQoJihjZmJfYnVmMVtpXSkpKTsKKwkJfQorCW1lbWNweShjZmJfdG1wLGNmYl9pdixzaXplb2YoY2ZiX2l2KSk7CisJbj0wOworCWRlc19lZGUzX2NmYjY0X2VuY3J5cHQoY2ZiX2J1ZjEsY2ZiX2J1ZjIsKGxvbmcpMTcsa3Msa3Msa3MsCisJCQkgICAgICAgJmNmYl90bXAsJm4sREVTX0RFQ1JZUFQpOworCWRlc19lZGUzX2NmYjY0X2VuY3J5cHQoJihjZmJfYnVmMVsxN10pLCYoY2ZiX2J1ZjJbMTddKSwKKwkJCSAgICAgICBzaXplb2YocGxhaW4pLTE3LGtzLGtzLGtzLAorCQkJICAgICAgICZjZmJfdG1wLCZuLERFU19ERUNSWVBUKTsKKwlpZiAobWVtY21wKHBsYWluLGNmYl9idWYyLHNpemVvZihwbGFpbikpICE9IDApCisJCXsKKwkJZXJyPTE7CisJCXByaW50ZigiZWRlX2NmYl9lbmNyeXB0IGRlY3J5cHQgZXJyb3JcbiIpOworCQlmb3IgKGk9MDsgaTwyNDsgaSs9OCkKKwkJCXByaW50ZigiJXNcbiIscHQoJihjZmJfYnVmMltpXSkpKTsKKwkJfQorCXJldHVybihlcnIpOworCX0KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZWNiM19lbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZWNiM19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQzN2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9lY2IzX2VuYy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qIGNyeXB0by9kZXMvZWNiM19lbmMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSAiZGVzX2xvY2wuaCIKKwordm9pZCBERVNfZWNiM19lbmNyeXB0KGNvbnN0X0RFU19jYmxvY2sgKmlucHV0LCBERVNfY2Jsb2NrICpvdXRwdXQsCisJCSAgICAgIERFU19rZXlfc2NoZWR1bGUgKmtzMSwgREVTX2tleV9zY2hlZHVsZSAqa3MyLAorCQkgICAgICBERVNfa2V5X3NjaGVkdWxlICprczMsCisJICAgICBpbnQgZW5jKQorCXsKKwlyZWdpc3RlciBERVNfTE9ORyBsMCxsMTsKKwlERVNfTE9ORyBsbFsyXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbiA9ICYoKmlucHV0KVswXTsKKwl1bnNpZ25lZCBjaGFyICpvdXQgPSAmKCpvdXRwdXQpWzBdOworCisJYzJsKGluLGwwKTsKKwljMmwoaW4sbDEpOworCWxsWzBdPWwwOworCWxsWzFdPWwxOworCWlmIChlbmMpCisJCURFU19lbmNyeXB0MyhsbCxrczEsa3MyLGtzMyk7CisJZWxzZQorCQlERVNfZGVjcnlwdDMobGwsa3MxLGtzMixrczMpOworCWwwPWxsWzBdOworCWwxPWxsWzFdOworCWwyYyhsMCxvdXQpOworCWwyYyhsMSxvdXQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZWNiX2VuYy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9lY2JfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NGU3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZWNiX2VuYy5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiBjcnlwdG8vZGVzL2VjYl9lbmMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSAiZGVzX2xvY2wuaCIKKyNpbmNsdWRlICJkZXNfdmVyLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisKK09QRU5TU0xfR0xPQkFMIGNvbnN0IGNoYXIgbGliZGVzX3ZlcnNpb25bXT0ibGliZGVzIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CitPUEVOU1NMX0dMT0JBTCBjb25zdCBjaGFyIERFU192ZXJzaW9uW109IkRFUyIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCitjb25zdCBjaGFyICpERVNfb3B0aW9ucyh2b2lkKQorCXsKKwlzdGF0aWMgaW50IGluaXQ9MTsKKwlzdGF0aWMgY2hhciBidWZbMzJdOworCisJaWYgKGluaXQpCisJCXsKKwkJY29uc3QgY2hhciAqcHRyLCp1bnJvbGwsKnJpc2MsKnNpemU7CisKKyNpZmRlZiBERVNfUFRSCisJCXB0cj0icHRyIjsKKyNlbHNlCisJCXB0cj0iaWR4IjsKKyNlbmRpZgorI2lmIGRlZmluZWQoREVTX1JJU0MxKSB8fCBkZWZpbmVkKERFU19SSVNDMikKKyNpZmRlZiBERVNfUklTQzEKKwkJcmlzYz0icmlzYzEiOworI2VuZGlmCisjaWZkZWYgREVTX1JJU0MyCisJCXJpc2M9InJpc2MyIjsKKyNlbmRpZgorI2Vsc2UKKwkJcmlzYz0iY2lzYyI7CisjZW5kaWYKKyNpZmRlZiBERVNfVU5ST0xMCisJCXVucm9sbD0iMTYiOworI2Vsc2UKKwkJdW5yb2xsPSIyIjsKKyNlbmRpZgorCQlpZiAoc2l6ZW9mKERFU19MT05HKSAhPSBzaXplb2YobG9uZykpCisJCQlzaXplPSJpbnQiOworCQllbHNlCisJCQlzaXplPSJsb25nIjsKKwkJQklPX3NucHJpbnRmKGJ1ZixzaXplb2YgYnVmLCJkZXMoJXMsJXMsJXMsJXMpIixwdHIscmlzYyx1bnJvbGwsCisJCQkgICAgIHNpemUpOworCQlpbml0PTA7CisJCX0KKwlyZXR1cm4oYnVmKTsKKwl9CisJCQorCit2b2lkIERFU19lY2JfZW5jcnlwdChjb25zdF9ERVNfY2Jsb2NrICppbnB1dCwgREVTX2NibG9jayAqb3V0cHV0LAorCQkgICAgIERFU19rZXlfc2NoZWR1bGUgKmtzLCBpbnQgZW5jKQorCXsKKwlyZWdpc3RlciBERVNfTE9ORyBsOworCURFU19MT05HIGxsWzJdOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluID0gJigqaW5wdXQpWzBdOworCXVuc2lnbmVkIGNoYXIgKm91dCA9ICYoKm91dHB1dClbMF07CisKKwljMmwoaW4sbCk7IGxsWzBdPWw7CisJYzJsKGluLGwpOyBsbFsxXT1sOworCURFU19lbmNyeXB0MShsbCxrcyxlbmMpOworCWw9bGxbMF07IGwyYyhsLG91dCk7CisJbD1sbFsxXTsgbDJjKGwsb3V0KTsKKwlsPWxsWzBdPWxsWzFdPTA7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9lZGVfY2JjbV9lbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZWRlX2NiY21fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmY2I3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZWRlX2NiY21fZW5jLmMKQEAgLTAsMCArMSwxOTkgQEAKKy8qIGVkZV9jYmNtX2VuYy5jICovCisvKiBXcml0dGVuIGJ5IEJlbiBMYXVyaWUgPGJlbkBhbGdyb3VwLmNvLnVrPiBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTMgRmViIDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyoKKworVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBUcmlwbGUgREVTIENpcGhlciBCbG9jayBDaGFpbmluZyB3aXRoIE91dHB1dAorRmVlZGJhY2sgTWFza2luZywgYnkgQ29wcGVyc21pdGgsIEpvaG5zb24gYW5kIE1hdHlhcywgKElCTSBhbmQgQ2VydGljb20pLgorCitOb3RlIHRoYXQgdGhlcmUgaXMgYSBrbm93biBhdHRhY2sgb24gdGhpcyBieSBCaWhhbSBhbmQgS251ZHNlbiBidXQgaXQgdGFrZXMKK2EgbG90IG9mIHdvcms6CisKK2h0dHA6Ly93d3cuY3MudGVjaG5pb24uYWMuaWwvdXNlcnMvd3d3Yi9jZ2ktYmluL3RyLWdldC5jZ2kvMTk5OC9DUy9DUzA5MjgucHMuZ3oKKworKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4gLyogVG8gc2VlIGlmIE9QRU5TU0xfTk9fREVTQ0JDTSBpcyBkZWZpbmVkICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVNDQkNNCisjaW5jbHVkZSAiZGVzX2xvY2wuaCIKKwordm9pZCBERVNfZWRlM19jYmNtX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkgICAgIGxvbmcgbGVuZ3RoLCBERVNfa2V5X3NjaGVkdWxlICprczEsIERFU19rZXlfc2NoZWR1bGUgKmtzMiwKKwkgICAgIERFU19rZXlfc2NoZWR1bGUgKmtzMywgREVTX2NibG9jayAqaXZlYzEsIERFU19jYmxvY2sgKml2ZWMyLAorCSAgICAgaW50IGVuYykKKyAgICB7CisgICAgcmVnaXN0ZXIgREVTX0xPTkcgdGluMCx0aW4xOworICAgIHJlZ2lzdGVyIERFU19MT05HIHRvdXQwLHRvdXQxLHhvcjAseG9yMSxtMCxtMTsKKyAgICByZWdpc3RlciBsb25nIGw9bGVuZ3RoOworICAgIERFU19MT05HIHRpblsyXTsKKyAgICB1bnNpZ25lZCBjaGFyICppdjEsKml2MjsKKworICAgIGl2MSA9ICYoKml2ZWMxKVswXTsKKyAgICBpdjIgPSAmKCppdmVjMilbMF07CisKKyAgICBpZiAoZW5jKQorCXsKKwljMmwoaXYxLG0wKTsKKwljMmwoaXYxLG0xKTsKKwljMmwoaXYyLHRvdXQwKTsKKwljMmwoaXYyLHRvdXQxKTsKKwlmb3IgKGwtPTg7IGw+PS03OyBsLT04KQorCSAgICB7CisJICAgIHRpblswXT1tMDsKKwkgICAgdGluWzFdPW0xOworCSAgICBERVNfZW5jcnlwdDEodGluLGtzMywxKTsKKwkgICAgbTA9dGluWzBdOworCSAgICBtMT10aW5bMV07CisKKwkgICAgaWYobCA8IDApCisJCXsKKwkJYzJsbihpbix0aW4wLHRpbjEsbCs4KTsKKwkJfQorCSAgICBlbHNlCisJCXsKKwkJYzJsKGluLHRpbjApOworCQljMmwoaW4sdGluMSk7CisJCX0KKwkgICAgdGluMF49dG91dDA7CisJICAgIHRpbjFePXRvdXQxOworCisJICAgIHRpblswXT10aW4wOworCSAgICB0aW5bMV09dGluMTsKKwkgICAgREVTX2VuY3J5cHQxKHRpbixrczEsMSk7CisJICAgIHRpblswXV49bTA7CisJICAgIHRpblsxXV49bTE7CisJICAgIERFU19lbmNyeXB0MSh0aW4sa3MyLDApOworCSAgICB0aW5bMF1ePW0wOworCSAgICB0aW5bMV1ePW0xOworCSAgICBERVNfZW5jcnlwdDEodGluLGtzMSwxKTsKKwkgICAgdG91dDA9dGluWzBdOworCSAgICB0b3V0MT10aW5bMV07CisKKwkgICAgbDJjKHRvdXQwLG91dCk7CisJICAgIGwyYyh0b3V0MSxvdXQpOworCSAgICB9CisJaXYxPSYoKml2ZWMxKVswXTsKKwlsMmMobTAsaXYxKTsKKwlsMmMobTEsaXYxKTsKKworCWl2Mj0mKCppdmVjMilbMF07CisJbDJjKHRvdXQwLGl2Mik7CisJbDJjKHRvdXQxLGl2Mik7CisJfQorICAgIGVsc2UKKwl7CisJcmVnaXN0ZXIgREVTX0xPTkcgdDAsdDE7CisKKwljMmwoaXYxLG0wKTsKKwljMmwoaXYxLG0xKTsKKwljMmwoaXYyLHhvcjApOworCWMybChpdjIseG9yMSk7CisJZm9yIChsLT04OyBsPj0tNzsgbC09OCkKKwkgICAgeworCSAgICB0aW5bMF09bTA7CisJICAgIHRpblsxXT1tMTsKKwkgICAgREVTX2VuY3J5cHQxKHRpbixrczMsMSk7CisJICAgIG0wPXRpblswXTsKKwkgICAgbTE9dGluWzFdOworCisJICAgIGMybChpbix0aW4wKTsKKwkgICAgYzJsKGluLHRpbjEpOworCisJICAgIHQwPXRpbjA7CisJICAgIHQxPXRpbjE7CisKKwkgICAgdGluWzBdPXRpbjA7CisJICAgIHRpblsxXT10aW4xOworCSAgICBERVNfZW5jcnlwdDEodGluLGtzMSwwKTsKKwkgICAgdGluWzBdXj1tMDsKKwkgICAgdGluWzFdXj1tMTsKKwkgICAgREVTX2VuY3J5cHQxKHRpbixrczIsMSk7CisJICAgIHRpblswXV49bTA7CisJICAgIHRpblsxXV49bTE7CisJICAgIERFU19lbmNyeXB0MSh0aW4sa3MxLDApOworCSAgICB0b3V0MD10aW5bMF07CisJICAgIHRvdXQxPXRpblsxXTsKKworCSAgICB0b3V0MF49eG9yMDsKKwkgICAgdG91dDFePXhvcjE7CisJICAgIGlmKGwgPCAwKQorCQl7CisJCWwyY24odG91dDAsdG91dDEsb3V0LGwrOCk7CisJCX0KKwkgICAgZWxzZQorCQl7CisJCWwyYyh0b3V0MCxvdXQpOworCQlsMmModG91dDEsb3V0KTsKKwkJfQorCSAgICB4b3IwPXQwOworCSAgICB4b3IxPXQxOworCSAgICB9CisKKwlpdjE9JigqaXZlYzEpWzBdOworCWwyYyhtMCxpdjEpOworCWwyYyhtMSxpdjEpOworCisJaXYyPSYoKml2ZWMyKVswXTsKKwlsMmMoeG9yMCxpdjIpOworCWwyYyh4b3IxLGl2Mik7CisJfQorICAgIHRpbjA9dGluMT10b3V0MD10b3V0MT14b3IwPXhvcjE9MDsKKyAgICB0aW5bMF09dGluWzFdPTA7CisgICAgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2VuY19yZWFkLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2VuY19yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiNjYyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZW5jX3JlYWQuYwpAQCAtMCwwICsxLDI0MCBAQAorLyogY3J5cHRvL2Rlcy9lbmNfcmVhZC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorCisvKiBUaGlzIGhhcyBzb21lIHVnbGllcyBpbiBpdCBidXQgaXQgd29ya3MgLSBldmVuIG92ZXIgc29ja2V0cy4gKi8KKy8qZXh0ZXJuIGludCBlcnJubzsqLworT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKGludCxERVNfcndfbW9kZSxERVNfUENCQ19NT0RFKQorCisKKy8qCisgKiBXQVJOSU5HUzoKKyAqCisgKiAgLSAgVGhlIGRhdGEgZm9ybWF0IHVzZWQgYnkgREVTX2VuY193cml0ZSgpIGFuZCBERVNfZW5jX3JlYWQoKQorICogICAgIGhhcyBhIGNyeXB0b2dyYXBoaWMgd2Vha25lc3M6IFdoZW4gYXNrZWQgdG8gd3JpdGUgbW9yZQorICogICAgIHRoYW4gTUFYV1JJVEUgYnl0ZXMsIERFU19lbmNfd3JpdGUgd2lsbCBzcGxpdCB0aGUgZGF0YQorICogICAgIGludG8gc2V2ZXJhbCBjaHVua3MgdGhhdCBhcmUgYWxsIGVuY3J5cHRlZAorICogICAgIHVzaW5nIHRoZSBzYW1lIElWLiAgU28gZG9uJ3QgdXNlIHRoZXNlIGZ1bmN0aW9ucyB1bmxlc3MgeW91CisgKiAgICAgYXJlIHN1cmUgeW91IGtub3cgd2hhdCB5b3UgZG8gKGluIHdoaWNoIGNhc2UgeW91IG1pZ2h0CisgKiAgICAgbm90IHdhbnQgdG8gdXNlIHRoZW0gYW55d2F5KS4KKyAqCisgKiAgLSAgVGhpcyBjb2RlIGNhbm5vdCBoYW5kbGUgbm9uLWJsb2NraW5nIHNvY2tldHMuCisgKgorICogIC0gIFRoaXMgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBzdGF0ZSBhbmQgdGh1cyBjYW5ub3QgYmUKKyAqICAgICB1c2VkIG9uIG11bHRpcGxlIGZpbGVzLgorICovCisKKworaW50IERFU19lbmNfcmVhZChpbnQgZmQsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgREVTX2tleV9zY2hlZHVsZSAqc2NoZWQsCisJCSBERVNfY2Jsb2NrICppdikKKwl7CisjaWYgZGVmaW5lZChPUEVOU1NMX05PX1BPU0lYX0lPKQorCXJldHVybigwKTsKKyNlbHNlCisJLyogZGF0YSB0byBiZSB1bmVuY3J5cHRlZCAqLworCWludCBuZXRfbnVtPTA7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgKm5ldD1OVUxMOworCS8qIGV4dHJhIHVuZW5jcnlwdGVkIGRhdGEgCisJICogZm9yIHdoZW4gYSBibG9jayBvZiAxMDAgY29tZXMgaW4gYnV0IGlzIGRlc19yZWFkIG9uZSBieXRlIGF0CisJICogYSB0aW1lLiAqLworCXN0YXRpYyB1bnNpZ25lZCBjaGFyICp1bm5ldD1OVUxMOworCXN0YXRpYyBpbnQgdW5uZXRfc3RhcnQ9MDsKKwlzdGF0aWMgaW50IHVubmV0X2xlZnQ9MDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciAqdG1wYnVmPU5VTEw7CisJaW50IGk7CisJbG9uZyBudW09MCxybnVtOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlpZiAodG1wYnVmID09IE5VTEwpCisJCXsKKwkJdG1wYnVmPU9QRU5TU0xfbWFsbG9jKEJTSVpFKTsKKwkJaWYgKHRtcGJ1ZiA9PSBOVUxMKSByZXR1cm4oLTEpOworCQl9CisJaWYgKG5ldCA9PSBOVUxMKQorCQl7CisJCW5ldD1PUEVOU1NMX21hbGxvYyhCU0laRSk7CisJCWlmIChuZXQgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwkJfQorCWlmICh1bm5ldCA9PSBOVUxMKQorCQl7CisJCXVubmV0PU9QRU5TU0xfbWFsbG9jKEJTSVpFKTsKKwkJaWYgKHVubmV0ID09IE5VTEwpIHJldHVybigtMSk7CisJCX0KKwkvKiBsZWZ0IG92ZXIgZGF0YSBmcm9tIGxhc3QgZGVjcnlwdCAqLworCWlmICh1bm5ldF9sZWZ0ICE9IDApCisJCXsKKwkJaWYgKHVubmV0X2xlZnQgPCBsZW4pCisJCQl7CisJCQkvKiB3ZSBzdGlsbCBzdGlsbCBuZWVkIG1vcmUgZGF0YSBidXQgd2lsbCByZXR1cm4KKwkJCSAqIHdpdGggdGhlIG51bWJlciBvZiBieXRlcyB3ZSBoYXZlIC0gc2hvdWxkIGFsd2F5cworCQkJICogY2hlY2sgdGhlIHJldHVybiB2YWx1ZSAqLworCQkJbWVtY3B5KGJ1ZiwmKHVubmV0W3VubmV0X3N0YXJ0XSksCisJCQkgICAgICAgdW5uZXRfbGVmdCk7CisJCQkvKiBlYXkgMjYvMDgvOTIgSSBoYWQgdGhlIG5leHQgMiBsaW5lcworCQkJICogcmV2ZXJzZWQgOi0oICovCisJCQlpPXVubmV0X2xlZnQ7CisJCQl1bm5ldF9zdGFydD11bm5ldF9sZWZ0PTA7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW1lbWNweShidWYsJih1bm5ldFt1bm5ldF9zdGFydF0pLGxlbik7CisJCQl1bm5ldF9zdGFydCs9bGVuOworCQkJdW5uZXRfbGVmdC09bGVuOworCQkJaT1sZW47CisJCQl9CisJCXJldHVybihpKTsKKwkJfQorCisJLyogV2UgbmVlZCB0byBnZXQgbW9yZSBkYXRhLiAqLworCWlmIChsZW4gPiBNQVhXUklURSkgbGVuPU1BWFdSSVRFOworCisJLyogZmlyc3QgLSBnZXQgdGhlIGxlbmd0aCAqLworCXdoaWxlIChuZXRfbnVtIDwgSERSU0laRSkgCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfV0lOMzIKKwkJaT1yZWFkKGZkLCh2b2lkICopJihuZXRbbmV0X251bV0pLEhEUlNJWkUtbmV0X251bSk7CisjZWxzZQorCQlpPV9yZWFkKGZkLCh2b2lkICopJihuZXRbbmV0X251bV0pLEhEUlNJWkUtbmV0X251bSk7CisjZW5kaWYKKyNpZmRlZiBFSU5UUgorCQlpZiAoKGkgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpIGNvbnRpbnVlOworI2VuZGlmCisJCWlmIChpIDw9IDApIHJldHVybigwKTsKKwkJbmV0X251bSs9aTsKKwkJfQorCisJLyogd2Ugbm93IGhhdmUgYXQgbmV0X251bSBieXRlcyBpbiBuZXQgKi8KKwlwPW5ldDsKKwkvKiBudW09MDsgICovCisJbjJsKHAsbnVtKTsKKwkvKiBudW0gc2hvdWxkIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgZ3JvdXAgb2YgZWlnaHQKKwkgKiB3ZSBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHJlYWQgYSBtdWx0aXBsZSBvZiA4IGJ5dGVzIGZyb20gdGhlIG5ldC4KKwkgKi8KKwlpZiAoKG51bSA+IE1BWFdSSVRFKSB8fCAobnVtIDwgMCkpIC8qIGVycm9yICovCisJCXJldHVybigtMSk7CisJcm51bT0obnVtIDwgOCk/ODooKG51bSs3KS84KjgpOworCisJbmV0X251bT0wOworCXdoaWxlIChuZXRfbnVtIDwgcm51bSkKKwkJeworI2lmbmRlZiBPUEVOU1NMX1NZU19XSU4zMgorCQlpPXJlYWQoZmQsKHZvaWQgKikmKG5ldFtuZXRfbnVtXSkscm51bS1uZXRfbnVtKTsKKyNlbHNlCisJCWk9X3JlYWQoZmQsKHZvaWQgKikmKG5ldFtuZXRfbnVtXSkscm51bS1uZXRfbnVtKTsKKyNlbmRpZgorI2lmZGVmIEVJTlRSCisJCWlmICgoaSA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSkgY29udGludWU7CisjZW5kaWYKKwkJaWYgKGkgPD0gMCkgcmV0dXJuKDApOworCQluZXRfbnVtKz1pOworCQl9CisKKwkvKiBDaGVjayBpZiB0aGVyZSB3aWxsIGJlIGRhdGEgbGVmdCBvdmVyLiAqLworCWlmIChsZW4gPCBudW0pCisJCXsKKwkJaWYgKERFU19yd19tb2RlICYgREVTX1BDQkNfTU9ERSkKKwkJCURFU19wY2JjX2VuY3J5cHQobmV0LHVubmV0LG51bSxzY2hlZCxpdixERVNfREVDUllQVCk7CisJCWVsc2UKKwkJCURFU19jYmNfZW5jcnlwdChuZXQsdW5uZXQsbnVtLHNjaGVkLGl2LERFU19ERUNSWVBUKTsKKwkJbWVtY3B5KGJ1Zix1bm5ldCxsZW4pOworCQl1bm5ldF9zdGFydD1sZW47CisJCXVubmV0X2xlZnQ9bnVtLWxlbjsKKworCQkvKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgZG9uZSBiZWNhdXNlIHdlIHJldHVybiBudW0KKwkJICogYXMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLiAqLworCQludW09bGVuOworCQl9CisJZWxzZQorCQl7CisJCS8qID5vdXRwdXQgaXMgYSBtdWx0aXBsZSBvZiA4IGJ5ZXMsIGlmIGxlbiA8IHJudW0KKwkJICogPndlIG11c3QgYmUgY2FyZWZ1bC4gIFRoZSB1c2VyIG11c3QgYmUgYXdhcmUgdGhhdCB0aGlzCisJCSAqID5yb3V0aW5lIHdpbGwgd3JpdGUgbW9yZSBieXRlcyB0aGFuIGhlIGFza2VkIGZvci4KKwkJICogPlRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBtdXN0IGJlIGNvcnJlY3QuCisJCSAqIEZJWEVEIC0gU2hvdWxkIGJlIG9rIG5vdyAxOC05LTkwIC0gZWF5ICovCisJCWlmIChsZW4gPCBybnVtKQorCQkJeworCisJCQlpZiAoREVTX3J3X21vZGUgJiBERVNfUENCQ19NT0RFKQorCQkJCURFU19wY2JjX2VuY3J5cHQobmV0LHRtcGJ1ZixudW0sc2NoZWQsaXYsCisJCQkJCQkgREVTX0RFQ1JZUFQpOworCQkJZWxzZQorCQkJCURFU19jYmNfZW5jcnlwdChuZXQsdG1wYnVmLG51bSxzY2hlZCxpdiwKKwkJCQkJCURFU19ERUNSWVBUKTsKKworCQkJLyogZWF5IDI2LzA4LzkyIGZpeCBhIGJ1ZyB0aGF0IHJldHVybmVkIG1vcmUKKwkJCSAqIGJ5dGVzIHRoYW4geW91IGFza2VkIGZvciAocmV0dXJuZWQgbGVuIGJ5dGVzIDotKCAqLworCQkJbWVtY3B5KGJ1Zix0bXBidWYsbnVtKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKERFU19yd19tb2RlICYgREVTX1BDQkNfTU9ERSkKKwkJCQlERVNfcGNiY19lbmNyeXB0KG5ldCxidWYsbnVtLHNjaGVkLGl2LAorCQkJCQkJIERFU19ERUNSWVBUKTsKKwkJCWVsc2UKKwkJCQlERVNfY2JjX2VuY3J5cHQobmV0LGJ1ZixudW0sc2NoZWQsaXYsCisJCQkJCQlERVNfREVDUllQVCk7CisJCQl9CisJCX0KKwlyZXR1cm4gbnVtOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fUE9TSVhfSU8gKi8KKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZW5jX3dyaXQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZW5jX3dyaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzUzYWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9lbmNfd3JpdC5jCkBAIC0wLDAgKzEsMTc5IEBACisvKiBjcnlwdG8vZGVzL2VuY193cml0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCisvKgorICogV0FSTklOR1M6CisgKgorICogIC0gIFRoZSBkYXRhIGZvcm1hdCB1c2VkIGJ5IERFU19lbmNfd3JpdGUoKSBhbmQgREVTX2VuY19yZWFkKCkKKyAqICAgICBoYXMgYSBjcnlwdG9ncmFwaGljIHdlYWtuZXNzOiBXaGVuIGFza2VkIHRvIHdyaXRlIG1vcmUKKyAqICAgICB0aGFuIE1BWFdSSVRFIGJ5dGVzLCBERVNfZW5jX3dyaXRlIHdpbGwgc3BsaXQgdGhlIGRhdGEKKyAqICAgICBpbnRvIHNldmVyYWwgY2h1bmtzIHRoYXQgYXJlIGFsbCBlbmNyeXB0ZWQKKyAqICAgICB1c2luZyB0aGUgc2FtZSBJVi4gIFNvIGRvbid0IHVzZSB0aGVzZSBmdW5jdGlvbnMgdW5sZXNzIHlvdQorICogICAgIGFyZSBzdXJlIHlvdSBrbm93IHdoYXQgeW91IGRvIChpbiB3aGljaCBjYXNlIHlvdSBtaWdodAorICogICAgIG5vdCB3YW50IHRvIHVzZSB0aGVtIGFueXdheSkuCisgKgorICogIC0gIFRoaXMgY29kZSBjYW5ub3QgaGFuZGxlIG5vbi1ibG9ja2luZyBzb2NrZXRzLgorICovCisKK2ludCBERVNfZW5jX3dyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqX2J1ZiwgaW50IGxlbiwKKwkJICBERVNfa2V5X3NjaGVkdWxlICpzY2hlZCwgREVTX2NibG9jayAqaXYpCisJeworI2lmIGRlZmluZWQoT1BFTlNTTF9OT19QT1NJWF9JTykKKwlyZXR1cm4gKC0xKTsKKyNlbHNlCisjaWZkZWYgX0xJQkMKKwlleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1lKCk7CisJZXh0ZXJuIGludCB3cml0ZSgpOworI2VuZGlmCisJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmPV9idWY7CisJbG9uZyBybnVtOworCWludCBpLGosayxvdXRudW07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgKm91dGJ1Zj1OVUxMOworCXVuc2lnbmVkIGNoYXIgc2hvcnRidWZbOF07CisJdW5zaWduZWQgY2hhciAqcDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjcDsKKwlzdGF0aWMgaW50IHN0YXJ0PTE7CisKKwlpZiAob3V0YnVmID09IE5VTEwpCisJCXsKKwkJb3V0YnVmPU9QRU5TU0xfbWFsbG9jKEJTSVpFK0hEUlNJWkUpOworCQlpZiAob3V0YnVmID09IE5VTEwpIHJldHVybigtMSk7CisJCX0KKwkvKiBJZiB3ZSBhcmUgc2VuZGluZyBsZXNzIHRoYW4gOCBieXRlcywgdGhlIHNhbWUgY2hhciB3aWxsIGxvb2sKKwkgKiB0aGUgc2FtZSBpZiB3ZSBkb24ndCBwYWQgaXQgb3V0IHdpdGggcmFuZG9tIGJ5dGVzICovCisJaWYgKHN0YXJ0KQorCQl7CisJCXN0YXJ0PTA7CisJCX0KKworCS8qIGxldHMgcmVjdXJzZSBpZiB3ZSB3YW50IHRvIHNlbmQgdGhlIGRhdGEgaW4gc21hbGwgY2h1bmtzICovCisJaWYgKGxlbiA+IE1BWFdSSVRFKQorCQl7CisJCWo9MDsKKwkJZm9yIChpPTA7IGk8bGVuOyBpKz1rKQorCQkJeworCQkJaz1ERVNfZW5jX3dyaXRlKGZkLCYoYnVmW2ldKSwKKwkJCQkoKGxlbi1pKSA+IE1BWFdSSVRFKT9NQVhXUklURToobGVuLWkpLHNjaGVkLGl2KTsKKwkJCWlmIChrIDwgMCkKKwkJCQlyZXR1cm4oayk7CisJCQllbHNlCisJCQkJais9azsKKwkJCX0KKwkJcmV0dXJuKGopOworCQl9CisKKwkvKiB3cml0ZSBsZW5ndGggZmlyc3QgKi8KKwlwPW91dGJ1ZjsKKwlsMm4obGVuLHApOworCisJLyogcGFkIHNob3J0IHN0cmluZ3MgKi8KKwlpZiAobGVuIDwgOCkKKwkJeworCQljcD1zaG9ydGJ1ZjsKKwkJbWVtY3B5KHNob3J0YnVmLGJ1ZixsZW4pOworCQlSQU5EX3BzZXVkb19ieXRlcyhzaG9ydGJ1ZitsZW4sIDgtbGVuKTsKKwkJcm51bT04OworCQl9CisJZWxzZQorCQl7CisJCWNwPWJ1ZjsKKwkJcm51bT0oKGxlbis3KS84KjgpOyAvKiByb3VuZCB1cCB0byBuZWFyZXN0IGVpZ2h0ICovCisJCX0KKworCWlmIChERVNfcndfbW9kZSAmIERFU19QQ0JDX01PREUpCisJCURFU19wY2JjX2VuY3J5cHQoY3AsJihvdXRidWZbSERSU0laRV0pLChsZW48OCk/ODpsZW4sc2NoZWQsaXYsCisJCQkJIERFU19FTkNSWVBUKTsgCisJZWxzZQorCQlERVNfY2JjX2VuY3J5cHQoY3AsJihvdXRidWZbSERSU0laRV0pLChsZW48OCk/ODpsZW4sc2NoZWQsaXYsCisJCQkJREVTX0VOQ1JZUFQpOyAKKworCS8qIG91dHB1dCAqLworCW91dG51bT1ybnVtK0hEUlNJWkU7CisKKwlmb3IgKGo9MDsgajxvdXRudW07IGorPWkpCisJCXsKKwkJLyogZWF5IDI2LzA4LzkyIEkgd2FzIG5vdCBkb2luZyB3cml0aW5nIGZyb20gd2hlcmUgd2UKKwkJICogZ290IHVwIHRvLiAqLworI2lmbmRlZiBfV0lOMzIKKwkJaT13cml0ZShmZCwodm9pZCAqKSYob3V0YnVmW2pdKSxvdXRudW0taik7CisjZWxzZQorCQlpPV93cml0ZShmZCwodm9pZCAqKSYob3V0YnVmW2pdKSxvdXRudW0taik7CisjZW5kaWYKKwkJaWYgKGkgPT0gLTEpCisJCQl7CisjaWZkZWYgRUlOVFIKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQlpPTA7CisJCQllbHNlCisjZW5kaWYKKwkJCSAgICAgICAgLyogVGhpcyBpcyByZWFsbHkgYSBiYWQgZXJyb3IgLSB2ZXJ5IGJhZAorCQkJCSAqIEl0IHdpbGwgc3R1ZmYtdXAgYm90aCBlbmRzLiAqLworCQkJCXJldHVybigtMSk7CisJCQl9CisJCX0KKworCXJldHVybihsZW4pOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fUE9TSVhfSU8gKi8KKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2ZjcnlwdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9mY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JkZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9mY3J5cHQuYwpAQCAtMCwwICsxLDE3MCBAQAorLyogTk9DVyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZkZWYgX09TRF9QT1NJWAorI2lmbmRlZiBDSEFSU0VUX0VCQ0RJQworI2RlZmluZSBDSEFSU0VUX0VCQ0RJQyAxCisjZW5kaWYKKyNlbmRpZgorI2lmZGVmIENIQVJTRVRfRUJDRElDCisjaW5jbHVkZSA8b3BlbnNzbC9lYmNkaWMuaD4KKyNlbmRpZgorCisvKiBUaGlzIHZlcnNpb24gb2YgY3J5cHQgaGFzIGJlZW4gZGV2ZWxvcGVkIGZyb20gbXkgTUlUIGNvbXBhdGlibGUKKyAqIERFUyBsaWJyYXJ5LgorICogRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKi8KKworLyogTW9kaWZpY2F0aW9uIGJ5IEplbnMgS3VwZmVyc2NobWlkdCAoQ3UpCisgKiBJIGhhdmUgaW5jbHVkZWQgZGlyZWN0aXZlIFBBUkEgZm9yIHNoYXJlZCBtZW1vcnkgY29tcHV0ZXJzLgorICogSSBoYXZlIGluY2x1ZGVkIGEgZGlyZWN0aXZlIExPTkdDUllQVCB0byB1c2luZyB0aGlzIHJvdXRpbmUgdG8gY2lwaGVyCisgKiBwYXNzd29yZHMgd2l0aCBtb3JlIHRoZW4gOCBieXRlcyBsaWtlIEhQLVVYIDEwLnggaXQgdXNlZC4gVGhlIE1BWFBMRU4KKyAqIGRlZmluaXRpb24gaXMgdGhlIG1heGltdW0gb2YgbGVuZ3RoIG9mIHBhc3N3b3JkIGFuZCBjYW4gY2hhbmdlZC4gSSBoYXZlCisgKiBkZWZpbmVkIDI0LgorICovCisKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorCisvKiBBZGRlZCBtb3JlIHZhbHVlcyB0byBoYW5kbGUgaWxsZWdhbCBzYWx0IHZhbHVlcyB0aGUgd2F5IG5vcm1hbAorICogY3J5cHQoKSBpbXBsZW1lbnRhdGlvbnMgZG8uICBUaGUgcGF0Y2ggd2FzIHNlbnQgYnkgCisgKiBCam9ybiBHcm9udmFsbCA8YmdAc2ljcy5zZT4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNvbnN0IGNoYXIgY29uX3NhbHRbMTI4XT17CisweEQyLDB4RDMsMHhENCwweEQ1LDB4RDYsMHhENywweEQ4LDB4RDksCisweERBLDB4REIsMHhEQywweERELDB4REUsMHhERiwweEUwLDB4RTEsCisweEUyLDB4RTMsMHhFNCwweEU1LDB4RTYsMHhFNywweEU4LDB4RTksCisweEVBLDB4RUIsMHhFQywweEVELDB4RUUsMHhFRiwweEYwLDB4RjEsCisweEYyLDB4RjMsMHhGNCwweEY1LDB4RjYsMHhGNywweEY4LDB4RjksCisweEZBLDB4RkIsMHhGQywweEZELDB4RkUsMHhGRiwweDAwLDB4MDEsCisweDAyLDB4MDMsMHgwNCwweDA1LDB4MDYsMHgwNywweDA4LDB4MDksCisweDBBLDB4MEIsMHgwNSwweDA2LDB4MDcsMHgwOCwweDA5LDB4MEEsCisweDBCLDB4MEMsMHgwRCwweDBFLDB4MEYsMHgxMCwweDExLDB4MTIsCisweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsCisweDFCLDB4MUMsMHgxRCwweDFFLDB4MUYsMHgyMCwweDIxLDB4MjIsCisweDIzLDB4MjQsMHgyNSwweDIwLDB4MjEsMHgyMiwweDIzLDB4MjQsCisweDI1LDB4MjYsMHgyNywweDI4LDB4MjksMHgyQSwweDJCLDB4MkMsCisweDJELDB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsCisweDM1LDB4MzYsMHgzNywweDM4LDB4MzksMHgzQSwweDNCLDB4M0MsCisweDNELDB4M0UsMHgzRiwweDQwLDB4NDEsMHg0MiwweDQzLDB4NDQsCit9OworCitzdGF0aWMgdW5zaWduZWQgY29uc3QgY2hhciBjb3ZfMmNoYXJbNjRdPXsKKzB4MkUsMHgyRiwweDMwLDB4MzEsMHgzMiwweDMzLDB4MzQsMHgzNSwKKzB4MzYsMHgzNywweDM4LDB4MzksMHg0MSwweDQyLDB4NDMsMHg0NCwKKzB4NDUsMHg0NiwweDQ3LDB4NDgsMHg0OSwweDRBLDB4NEIsMHg0QywKKzB4NEQsMHg0RSwweDRGLDB4NTAsMHg1MSwweDUyLDB4NTMsMHg1NCwKKzB4NTUsMHg1NiwweDU3LDB4NTgsMHg1OSwweDVBLDB4NjEsMHg2MiwKKzB4NjMsMHg2NCwweDY1LDB4NjYsMHg2NywweDY4LDB4NjksMHg2QSwKKzB4NkIsMHg2QywweDZELDB4NkUsMHg2RiwweDcwLDB4NzEsMHg3MiwKKzB4NzMsMHg3NCwweDc1LDB4NzYsMHg3NywweDc4LDB4NzksMHg3QQorfTsKKworY2hhciAqREVTX2NyeXB0KGNvbnN0IGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqc2FsdCkKKwl7CisJc3RhdGljIGNoYXIgYnVmZlsxNF07CisKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwlyZXR1cm4oREVTX2ZjcnlwdChidWYsc2FsdCxidWZmKSk7CisjZWxzZQorCWNoYXIgZV9zYWx0WzIrMV07CisJY2hhciBlX2J1ZlszMisxXTsJLyogcmVwbGFjZSAzMiBieSA4ID8gKi8KKwljaGFyICpyZXQ7CisKKwkvKiBDb3B5IGF0IG1vc3QgMiBjaGFycyBvZiBzYWx0ICovCisJaWYgKChlX3NhbHRbMF0gPSBzYWx0WzBdKSAhPSAnXDAnKQorCSAgICBlX3NhbHRbMV0gPSBzYWx0WzFdOworCisJLyogQ29weSBhdCBtb3N0IDMyIGNoYXJzIG9mIHBhc3N3b3JkICovCisJc3RybmNweSAoZV9idWYsIGJ1Ziwgc2l6ZW9mKGVfYnVmKSk7CisKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGRlbGltaXRlciAqLworCWVfc2FsdFtzaXplb2YoZV9zYWx0KS0xXSA9IGVfYnVmW3NpemVvZihlX2J1ZiktMV0gPSAnXDAnOworCisJLyogQ29udmVydCB0aGUgZV9zYWx0IHRvIEFTQ0lJLCBhcyB0aGF0J3Mgd2hhdCBERVNfZmNyeXB0IHdvcmtzIG9uICovCisJZWJjZGljMmFzY2lpKGVfc2FsdCwgZV9zYWx0LCBzaXplb2YgZV9zYWx0KTsKKworCS8qIENvbnZlcnQgdGhlIGNsZWFydGV4dCBwYXNzd29yZCB0byBBU0NJSSAqLworCWViY2RpYzJhc2NpaShlX2J1ZiwgZV9idWYsIHNpemVvZiBlX2J1Zik7CisKKwkvKiBFbmNyeXB0IGl0IChmcm9tL3RvIEFTQ0lJKSAqLworCXJldCA9IERFU19mY3J5cHQoZV9idWYsZV9zYWx0LGJ1ZmYpOworCisJLyogQ29udmVydCB0aGUgcmVzdWx0IGJhY2sgdG8gRUJDRElDICovCisJYXNjaWkyZWJjZGljKHJldCwgcmV0LCBzdHJsZW4ocmV0KSk7CisJCisJcmV0dXJuIHJldDsKKyNlbmRpZgorCX0KKworCitjaGFyICpERVNfZmNyeXB0KGNvbnN0IGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqc2FsdCwgY2hhciAqcmV0KQorCXsKKwl1bnNpZ25lZCBpbnQgaSxqLHgseTsKKwlERVNfTE9ORyBFc3dhcDAsRXN3YXAxOworCURFU19MT05HIG91dFsyXSxsbDsKKwlERVNfY2Jsb2NrIGtleTsKKwlERVNfa2V5X3NjaGVkdWxlIGtzOworCXVuc2lnbmVkIGNoYXIgYmJbOV07CisJdW5zaWduZWQgY2hhciAqYj1iYjsKKwl1bnNpZ25lZCBjaGFyIGMsdTsKKworCS8qIGVheSAyNS8wOC85MgorCSAqIElmIHlvdSBjYWxsIGNyeXB0KCJwd2QiLCIqIikgYXMgb2Z0ZW4gaGFwcGVucyB3aGVuIHlvdQorCSAqIGhhdmUgKiBhcyB0aGUgcHdkIGZpZWxkIGluIC9ldGMvcGFzc3dkLCB0aGUgZnVuY3Rpb24KKwkgKiByZXR1cm5zICpcMFhYWFhYWFhYWAorCSAqIFRoZSBcMCBtYWtlcyB0aGUgc3RyaW5nIGxvb2sgbGlrZSAqIHNvIHRoZSBwd2QgIioiIHdvdWxkCisJICogY3J5cHQgdG8gIioiLiAgVGhpcyB3YXMgZm91bmQgd2hlbiByZXBsYWNpbmcgdGhlIGNyeXB0IGluCisJICogb3VyIHNoYXJlZCBsaWJyYXJpZXMuICBQZW9wbGUgZm91bmQgdGhhdCB0aGUgZGlzYWJsZWQKKwkgKiBhY2NvdW50cyBlZmZlY3RpdmVseSBoYWQgbm8gcGFzc3dkIDotKC4gKi8KKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwl4PXJldFswXT0oKHNhbHRbMF0gPT0gJ1wwJyk/J0EnOnNhbHRbMF0pOworCUVzd2FwMD1jb25fc2FsdFt4XTw8MjsKKwl4PXJldFsxXT0oKHNhbHRbMV0gPT0gJ1wwJyk/J0EnOnNhbHRbMV0pOworCUVzd2FwMT1jb25fc2FsdFt4XTw8NjsKKyNlbHNlCisJeD1yZXRbMF09KChzYWx0WzBdID09ICdcMCcpP29zX3RvYXNjaWlbJ0EnXTpzYWx0WzBdKTsKKwlFc3dhcDA9Y29uX3NhbHRbeF08PDI7CisJeD1yZXRbMV09KChzYWx0WzFdID09ICdcMCcpP29zX3RvYXNjaWlbJ0EnXTpzYWx0WzFdKTsKKwlFc3dhcDE9Y29uX3NhbHRbeF08PDY7CisjZW5kaWYKKworLyogRUFZCityPXN0cmxlbihidWYpOworcj0ocis3KS84OworKi8KKwlmb3IgKGk9MDsgaTw4OyBpKyspCisJCXsKKwkJYz0gKihidWYrKyk7CisJCWlmICghYykgYnJlYWs7CisJCWtleVtpXT0oYzw8MSk7CisJCX0KKwlmb3IgKDsgaTw4OyBpKyspCisJCWtleVtpXT0wOworCisJREVTX3NldF9rZXlfdW5jaGVja2VkKCZrZXksJmtzKTsKKwlmY3J5cHRfYm9keSgmKG91dFswXSksJmtzLEVzd2FwMCxFc3dhcDEpOworCisJbGw9b3V0WzBdOyBsMmMobGwsYik7CisJbGw9b3V0WzFdOyBsMmMobGwsYik7CisJeT0wOworCXU9MHg4MDsKKwliYls4XT0wOworCWZvciAoaT0yOyBpPDEzOyBpKyspCisJCXsKKwkJYz0wOworCQlmb3IgKGo9MDsgajw2OyBqKyspCisJCQl7CisJCQljPDw9MTsKKwkJCWlmIChiYlt5XSAmIHUpIGN8PTE7CisJCQl1Pj49MTsKKwkJCWlmICghdSkKKwkJCQl7CisJCQkJeSsrOworCQkJCXU9MHg4MDsKKwkJCQl9CisJCQl9CisJCXJldFtpXT1jb3ZfMmNoYXJbY107CisJCX0KKwlyZXRbMTNdPSdcMCc7CisJcmV0dXJuKHJldCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2ZjcnlwdF9iLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL2ZjcnlwdF9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyMjgxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvZmNyeXB0X2IuYwpAQCAtMCwwICsxLDE0MyBAQAorLyogY3J5cHRvL2Rlcy9mY3J5cHRfYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBUaGlzIHZlcnNpb24gb2YgY3J5cHQgaGFzIGJlZW4gZGV2ZWxvcGVkIGZyb20gbXkgTUlUIGNvbXBhdGlibGUKKyAqIERFUyBsaWJyYXJ5LgorICogVGhlIGxpYnJhcnkgaXMgYXZhaWxhYmxlIGF0IHB1Yi9DcnlwdG8vREVTIGF0IGZ0cC5wc3kudXEub3ouYXUKKyAqIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICovCisKKyNkZWZpbmUgREVTX0ZDUllQVAorI2luY2x1ZGUgImRlc19sb2NsLmgiCisjdW5kZWYgREVTX0ZDUllQVAorCisjdW5kZWYgUEVSTV9PUAorI2RlZmluZSBQRVJNX09QKGEsYix0LG4sbSkgKCh0KT0oKCgoYSk+PihuKSleKGIpKSYobSkpLFwKKwkoYilePSh0KSxcCisJKGEpXj0oKHQpPDwobikpKQorCisjdW5kZWYgSFBFUk1fT1AKKyNkZWZpbmUgSFBFUk1fT1AoYSx0LG4sbSkgKCh0KT0oKCgoYSk8PCgxNi0obikpKV4oYSkpJihtKSksXAorCShhKT0oYSleKHQpXih0Pj4oMTYtKG4pKSkpXAorCit2b2lkIGZjcnlwdF9ib2R5KERFU19MT05HICpvdXQsIERFU19rZXlfc2NoZWR1bGUgKmtzLCBERVNfTE9ORyBFc3dhcDAsCisJCSBERVNfTE9ORyBFc3dhcDEpCisJeworCXJlZ2lzdGVyIERFU19MT05HIGwscix0LHU7CisjaWZkZWYgREVTX1BUUgorCXJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlc19TUD0oY29uc3QgdW5zaWduZWQgY2hhciAqKURFU19TUHRyYW5zOworI2VuZGlmCisJcmVnaXN0ZXIgREVTX0xPTkcgKnM7CisJcmVnaXN0ZXIgaW50IGo7CisJcmVnaXN0ZXIgREVTX0xPTkcgRTAsRTE7CisKKwlsPTA7CisJcj0wOworCisJcz0oREVTX0xPTkcgKilrczsKKwlFMD1Fc3dhcDA7CisJRTE9RXN3YXAxOworCisJZm9yIChqPTA7IGo8MjU7IGorKykKKwkJeworI2lmbmRlZiBERVNfVU5ST0xMCisJCXJlZ2lzdGVyIGludCBpOworCisJCWZvciAoaT0wOyBpPDMyOyBpKz00KQorCQkJeworCQkJRF9FTkNSWVBUKGwscixpKzApOyAvKiAgMSAqLworCQkJRF9FTkNSWVBUKHIsbCxpKzIpOyAvKiAgMiAqLworCQkJfQorI2Vsc2UKKwkJRF9FTkNSWVBUKGwsciwgMCk7IC8qICAxICovCisJCURfRU5DUllQVChyLGwsIDIpOyAvKiAgMiAqLworCQlEX0VOQ1JZUFQobCxyLCA0KTsgLyogIDMgKi8KKwkJRF9FTkNSWVBUKHIsbCwgNik7IC8qICA0ICovCisJCURfRU5DUllQVChsLHIsIDgpOyAvKiAgNSAqLworCQlEX0VOQ1JZUFQocixsLDEwKTsgLyogIDYgKi8KKwkJRF9FTkNSWVBUKGwsciwxMik7IC8qICA3ICovCisJCURfRU5DUllQVChyLGwsMTQpOyAvKiAgOCAqLworCQlEX0VOQ1JZUFQobCxyLDE2KTsgLyogIDkgKi8KKwkJRF9FTkNSWVBUKHIsbCwxOCk7IC8qICAxMCAqLworCQlEX0VOQ1JZUFQobCxyLDIwKTsgLyogIDExICovCisJCURfRU5DUllQVChyLGwsMjIpOyAvKiAgMTIgKi8KKwkJRF9FTkNSWVBUKGwsciwyNCk7IC8qICAxMyAqLworCQlEX0VOQ1JZUFQocixsLDI2KTsgLyogIDE0ICovCisJCURfRU5DUllQVChsLHIsMjgpOyAvKiAgMTUgKi8KKwkJRF9FTkNSWVBUKHIsbCwzMCk7IC8qICAxNiAqLworI2VuZGlmCisKKwkJdD1sOworCQlsPXI7CisJCXI9dDsKKwkJfQorCWw9Uk9UQVRFKGwsMykmMHhmZmZmZmZmZkw7CisJcj1ST1RBVEUociwzKSYweGZmZmZmZmZmTDsKKworCVBFUk1fT1AobCxyLHQsIDEsMHg1NTU1NTU1NUwpOworCVBFUk1fT1AocixsLHQsIDgsMHgwMGZmMDBmZkwpOworCVBFUk1fT1AobCxyLHQsIDIsMHgzMzMzMzMzM0wpOworCVBFUk1fT1AocixsLHQsMTYsMHgwMDAwZmZmZkwpOworCVBFUk1fT1AobCxyLHQsIDQsMHgwZjBmMGYwZkwpOworCisJb3V0WzBdPXI7CisJb3V0WzFdPWw7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL21ha2VmaWxlLmJjIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9tYWtlZmlsZS5iYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmU2ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9tYWtlZmlsZS5iYwpAQCAtMCwwICsxLDUwIEBACisjCisjIE9yaWdpb25hbCBCQyBNYWtlZmlsZSBmcm9tIFRldW4gPFRldW4uTmlqc3NlbkBrdWIubmw+CisjCisjCitDQyAgICAgID0gYmNjCitUTElCICAgID0gdGxpYiAvMCAvQworIyBub3RlOiB0aGUgLTMgZmxhZyBwcm9kdWNlcyBjb2RlIGZvciAzODYsIDQ4NiwgUGVudGl1bSBldGM7IG9taXQgaXQgZm9yIDI4NnMKK09QVElNSVpFPSAtMyAtTzIKKyNXSU5ET1dTPSAtVworQ0ZMQUdTICA9IC1jIC1tbCAtZCAkKE9QVElNSVpFKSAkKFdJTkRPV1MpIC1ETVNET1MKK0xGTEFHUyAgPSAtbWwgJChXSU5ET1dTKQorCisuYy5vYmo6CisJJChDQykgJChDRkxBR1MpICQqLmMKKworLm9iai5leGU6CisJJChDQykgJChMRkxBR1MpIC1lJCouZXhlICQqLm9iaiBsaWJkZXMubGliICAKKworYWxsOiAkKExJQikgZGVzdGVzdC5leGUgcnB3LmV4ZSBkZXMuZXhlIHNwZWVkLmV4ZQorCisjICJtYWtlIGNsZWFuIjogdXNlIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgb25seSBsaWJkZXMgLmV4ZSBhbmQgLm9iaiBmaWxlcy4uLgorY2xlYW46CisJZGVsICouZXhlCisJZGVsICoub2JqCisJZGVsIGxpYmRlcy5saWIKKwlkZWwgbGliZGVzLnJzcAorCitPQkpTPSAgIGNiY19ja3NtLm9iaiBjYmNfZW5jLm9iaiAgZWNiX2VuYy5vYmogIHBjYmNfZW5jLm9iaiBcCisJcXVkX2Nrc20ub2JqIHJhbmRfa2V5Lm9iaiBzZXRfa2V5Lm9iaiAgc3RyMmtleS5vYmogXAorCWVuY19yZWFkLm9iaiBlbmNfd3JpdC5vYmogZmNyeXB0Lm9iaiAgIGNmYl9lbmMub2JqIFwKKwllY2IzX2VuYy5vYmogb2ZiX2VuYy5vYmogIGNiYzNfZW5jLm9iaiByZWFkX3B3ZC5vYmpcCisJY2ZiNjRlbmMub2JqIG9mYjY0ZW5jLm9iaiBlZGVfZW5jLm9iaiAgY2ZiNjRlZGUub2JqXAorCW9mYjY0ZWRlLm9iaiBzdXBwLm9iagorCitMSUI9ICAgIGxpYmRlcy5saWIKKworJChMSUIpOiAkKE9CSlMpCisJZGVsICQoTElCKQorCW1ha2Vyc3AgIislcyAmXG4iICYmfAorCSQoT0JKUykKK3wgICAgICAgPmxpYmRlcy5yc3AKKwkkKFRMSUIpIGxpYmRlcy5saWIgQGxpYmRlcy5yc3AsbnVsCisJZGVsIGxpYmRlcy5yc3AKKworZGVzdGVzdC5leGU6IGRlc3Rlc3Qub2JqIGxpYmRlcy5saWIKK3Jwdy5leGU6ICAgICBycHcub2JqIGxpYmRlcy5saWIKK3NwZWVkLmV4ZTogICBzcGVlZC5vYmogbGliZGVzLmxpYgorZGVzLmV4ZTogICAgIGRlcy5vYmogbGliZGVzLmxpYgorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvbmNiY19lbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvbmNiY19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGEyM2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9uY2JjX2VuYy5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiBjcnlwdG8vZGVzL25jYmNfZW5jLmMgKi8KKy8qCisgKiAjaW5jbHVkZWQgYnk6CisgKiAgICBjYmNfZW5jLmMgIChERVNfY2JjX2VuY3J5cHQpCisgKiAgICBkZXNfZW5jLmMgIChERVNfbmNiY19lbmNyeXB0KQorICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorCisjaWZkZWYgQ0JDX0VOQ19DX19ET05UX1VQREFURV9JVgordm9pZCBERVNfY2JjX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwgbG9uZyBsZW5ndGgsCisJCSAgICAgREVTX2tleV9zY2hlZHVsZSAqX3NjaGVkdWxlLCBERVNfY2Jsb2NrICppdmVjLCBpbnQgZW5jKQorI2Vsc2UKK3ZvaWQgREVTX25jYmNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwkJICAgICBERVNfa2V5X3NjaGVkdWxlICpfc2NoZWR1bGUsIERFU19jYmxvY2sgKml2ZWMsIGludCBlbmMpCisjZW5kaWYKKwl7CisJcmVnaXN0ZXIgREVTX0xPTkcgdGluMCx0aW4xOworCXJlZ2lzdGVyIERFU19MT05HIHRvdXQwLHRvdXQxLHhvcjAseG9yMTsKKwlyZWdpc3RlciBsb25nIGw9bGVuZ3RoOworCURFU19MT05HIHRpblsyXTsKKwl1bnNpZ25lZCBjaGFyICppdjsKKworCWl2ID0gJigqaXZlYylbMF07CisKKwlpZiAoZW5jKQorCQl7CisJCWMybChpdix0b3V0MCk7CisJCWMybChpdix0b3V0MSk7CisJCWZvciAobC09ODsgbD49MDsgbC09OCkKKwkJCXsKKwkJCWMybChpbix0aW4wKTsKKwkJCWMybChpbix0aW4xKTsKKwkJCXRpbjBePXRvdXQwOyB0aW5bMF09dGluMDsKKwkJCXRpbjFePXRvdXQxOyB0aW5bMV09dGluMTsKKwkJCURFU19lbmNyeXB0MSgoREVTX0xPTkcgKil0aW4sX3NjaGVkdWxlLERFU19FTkNSWVBUKTsKKwkJCXRvdXQwPXRpblswXTsgbDJjKHRvdXQwLG91dCk7CisJCQl0b3V0MT10aW5bMV07IGwyYyh0b3V0MSxvdXQpOworCQkJfQorCQlpZiAobCAhPSAtOCkKKwkJCXsKKwkJCWMybG4oaW4sdGluMCx0aW4xLGwrOCk7CisJCQl0aW4wXj10b3V0MDsgdGluWzBdPXRpbjA7CisJCQl0aW4xXj10b3V0MTsgdGluWzFdPXRpbjE7CisJCQlERVNfZW5jcnlwdDEoKERFU19MT05HICopdGluLF9zY2hlZHVsZSxERVNfRU5DUllQVCk7CisJCQl0b3V0MD10aW5bMF07IGwyYyh0b3V0MCxvdXQpOworCQkJdG91dDE9dGluWzFdOyBsMmModG91dDEsb3V0KTsKKwkJCX0KKyNpZm5kZWYgQ0JDX0VOQ19DX19ET05UX1VQREFURV9JVgorCQlpdiA9ICYoKml2ZWMpWzBdOworCQlsMmModG91dDAsaXYpOworCQlsMmModG91dDEsaXYpOworI2VuZGlmCisJCX0KKwllbHNlCisJCXsKKwkJYzJsKGl2LHhvcjApOworCQljMmwoaXYseG9yMSk7CisJCWZvciAobC09ODsgbD49MDsgbC09OCkKKwkJCXsKKwkJCWMybChpbix0aW4wKTsgdGluWzBdPXRpbjA7CisJCQljMmwoaW4sdGluMSk7IHRpblsxXT10aW4xOworCQkJREVTX2VuY3J5cHQxKChERVNfTE9ORyAqKXRpbixfc2NoZWR1bGUsREVTX0RFQ1JZUFQpOworCQkJdG91dDA9dGluWzBdXnhvcjA7CisJCQl0b3V0MT10aW5bMV1eeG9yMTsKKwkJCWwyYyh0b3V0MCxvdXQpOworCQkJbDJjKHRvdXQxLG91dCk7CisJCQl4b3IwPXRpbjA7CisJCQl4b3IxPXRpbjE7CisJCQl9CisJCWlmIChsICE9IC04KQorCQkJeworCQkJYzJsKGluLHRpbjApOyB0aW5bMF09dGluMDsKKwkJCWMybChpbix0aW4xKTsgdGluWzFdPXRpbjE7CisJCQlERVNfZW5jcnlwdDEoKERFU19MT05HICopdGluLF9zY2hlZHVsZSxERVNfREVDUllQVCk7CisJCQl0b3V0MD10aW5bMF1eeG9yMDsKKwkJCXRvdXQxPXRpblsxXV54b3IxOworCQkJbDJjbih0b3V0MCx0b3V0MSxvdXQsbCs4KTsKKyNpZm5kZWYgQ0JDX0VOQ19DX19ET05UX1VQREFURV9JVgorCQkJeG9yMD10aW4wOworCQkJeG9yMT10aW4xOworI2VuZGlmCisJCQl9CisjaWZuZGVmIENCQ19FTkNfQ19fRE9OVF9VUERBVEVfSVYgCisJCWl2ID0gJigqaXZlYylbMF07CisJCWwyYyh4b3IwLGl2KTsKKwkJbDJjKHhvcjEsaXYpOworI2VuZGlmCisJCX0KKwl0aW4wPXRpbjE9dG91dDA9dG91dDE9eG9yMD14b3IxPTA7CisJdGluWzBdPXRpblsxXT0wOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvb2ZiNjRlZGUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvb2ZiNjRlZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJiZjlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9vZmI2NGVkZS5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBjcnlwdG8vZGVzL29mYjY0ZWRlLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgImRlc19sb2NsLmgiCisKKy8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGVuY3J5cHRlZCBhcyB0aG91Z2ggNjRiaXQgb2ZiIG1vZGUgaXMgYmVpbmcKKyAqIHVzZWQuICBUaGUgZXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gdG8gcmVjb3JkIGhvdyBtdWNoIG9mIHRoZQorICogNjRiaXQgYmxvY2sgd2UgaGF2ZSB1c2VkIGlzIGNvbnRhaW5lZCBpbiAqbnVtOworICovCit2b2lkIERFU19lZGUzX29mYjY0X2VuY3J5cHQocmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisJCQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwkJCSAgICBERVNfa2V5X3NjaGVkdWxlICprMSwgREVTX2tleV9zY2hlZHVsZSAqazIsCisJCQkgICAgREVTX2tleV9zY2hlZHVsZSAqazMsIERFU19jYmxvY2sgKml2ZWMsCisJCQkgICAgaW50ICpudW0pCisJeworCXJlZ2lzdGVyIERFU19MT05HIHYwLHYxOworCXJlZ2lzdGVyIGludCBuPSAqbnVtOworCXJlZ2lzdGVyIGxvbmcgbD1sZW5ndGg7CisJREVTX2NibG9jayBkOworCXJlZ2lzdGVyIGNoYXIgKmRwOworCURFU19MT05HIHRpWzJdOworCXVuc2lnbmVkIGNoYXIgKml2OworCWludCBzYXZlPTA7CisKKwlpdiA9ICYoKml2ZWMpWzBdOworCWMybChpdix2MCk7CisJYzJsKGl2LHYxKTsKKwl0aVswXT12MDsKKwl0aVsxXT12MTsKKwlkcD0oY2hhciAqKWQ7CisJbDJjKHYwLGRwKTsKKwlsMmModjEsZHApOworCXdoaWxlIChsLS0pCisJCXsKKwkJaWYgKG4gPT0gMCkKKwkJCXsKKwkJCS8qIHRpWzBdPXYwOyAqLworCQkJLyogdGlbMV09djE7ICovCisJCQlERVNfZW5jcnlwdDModGksazEsazIsazMpOworCQkJdjA9dGlbMF07CisJCQl2MT10aVsxXTsKKworCQkJZHA9KGNoYXIgKilkOworCQkJbDJjKHYwLGRwKTsKKwkJCWwyYyh2MSxkcCk7CisJCQlzYXZlKys7CisJCQl9CisJCSoob3V0KyspPSAqKGluKyspXmRbbl07CisJCW49KG4rMSkmMHgwNzsKKwkJfQorCWlmIChzYXZlKQorCQl7CisvKgkJdjA9dGlbMF07CisJCXYxPXRpWzFdOyovCisJCWl2ID0gJigqaXZlYylbMF07CisJCWwyYyh2MCxpdik7CisJCWwyYyh2MSxpdik7CisJCX0KKwl2MD12MT10aVswXT10aVsxXT0wOworCSpudW09bjsKKwl9CisKKyNpZmRlZiB1bmRlZiAvKiBNQUNSTyAqLwordm9pZCBERVNfZWRlMl9vZmI2NF9lbmNyeXB0KHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKmluLAorCSAgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwgREVTX2tleV9zY2hlZHVsZSBrMSwKKwkgICAgIERFU19rZXlfc2NoZWR1bGUgazIsIERFU19jYmxvY2sgKCppdmVjKSwgaW50ICpudW0pCisJeworCURFU19lZGUzX29mYjY0X2VuY3J5cHQoaW4sIG91dCwgbGVuZ3RoLCBrMSxrMixrMSwgaXZlYywgbnVtKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvb2ZiNjRlbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvb2ZiNjRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2EzZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9vZmI2NGVuYy5jCkBAIC0wLDAgKzEsMTEwIEBACisvKiBjcnlwdG8vZGVzL29mYjY0ZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgImRlc19sb2NsLmgiCisKKy8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGVuY3J5cHRlZCBhcyB0aG91Z2ggNjRiaXQgb2ZiIG1vZGUgaXMgYmVpbmcKKyAqIHVzZWQuICBUaGUgZXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gdG8gcmVjb3JkIGhvdyBtdWNoIG9mIHRoZQorICogNjRiaXQgYmxvY2sgd2UgaGF2ZSB1c2VkIGlzIGNvbnRhaW5lZCBpbiAqbnVtOworICovCit2b2lkIERFU19vZmI2NF9lbmNyeXB0KHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLAorCQkgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwkJICAgICAgIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLCBERVNfY2Jsb2NrICppdmVjLCBpbnQgKm51bSkKKwl7CisJcmVnaXN0ZXIgREVTX0xPTkcgdjAsdjEsdDsKKwlyZWdpc3RlciBpbnQgbj0gKm51bTsKKwlyZWdpc3RlciBsb25nIGw9bGVuZ3RoOworCURFU19jYmxvY2sgZDsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyICpkcDsKKwlERVNfTE9ORyB0aVsyXTsKKwl1bnNpZ25lZCBjaGFyICppdjsKKwlpbnQgc2F2ZT0wOworCisJaXYgPSAmKCppdmVjKVswXTsKKwljMmwoaXYsdjApOworCWMybChpdix2MSk7CisJdGlbMF09djA7CisJdGlbMV09djE7CisJZHA9ZDsKKwlsMmModjAsZHApOworCWwyYyh2MSxkcCk7CisJd2hpbGUgKGwtLSkKKwkJeworCQlpZiAobiA9PSAwKQorCQkJeworCQkJREVTX2VuY3J5cHQxKHRpLHNjaGVkdWxlLERFU19FTkNSWVBUKTsKKwkJCWRwPWQ7CisJCQl0PXRpWzBdOyBsMmModCxkcCk7CisJCQl0PXRpWzFdOyBsMmModCxkcCk7CisJCQlzYXZlKys7CisJCQl9CisJCSoob3V0KyspPSAqKGluKyspXmRbbl07CisJCW49KG4rMSkmMHgwNzsKKwkJfQorCWlmIChzYXZlKQorCQl7CisJCXYwPXRpWzBdOworCQl2MT10aVsxXTsKKwkJaXYgPSAmKCppdmVjKVswXTsKKwkJbDJjKHYwLGl2KTsKKwkJbDJjKHYxLGl2KTsKKwkJfQorCXQ9djA9djE9dGlbMF09dGlbMV09MDsKKwkqbnVtPW47CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL29mYl9lbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvb2ZiX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODdhM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL29mYl9lbmMuYwpAQCAtMCwwICsxLDEzNSBAQAorLyogY3J5cHRvL2Rlcy9vZmJfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgImRlc19sb2NsLmgiCisKKy8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZSBsb2FkZWQgaW4gbXVsdGlwbGVzIG9mIDggYml0cy4KKyAqIFdoYXQgdGhpcyBtZWFucyBpcyB0aGF0IGlmIHlvdSBoYW1lIG51bWJpdHM9MTIgYW5kIGxlbmd0aD0yCisgKiB0aGUgZmlyc3QgMTIgYml0cyB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBmaXJzdCBieXRlIGFuZCBoYWxmCisgKiB0aGUgc2Vjb25kLiAgVGhlIHNlY29uZCAxMiBiaXRzIHdpbGwgY29tZSBmcm9tIHRoZSAzcmQgYW5kIGhhbGYgdGhlIDR0aAorICogYnl0ZS4KKyAqLwordm9pZCBERVNfb2ZiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IG51bWJpdHMsCisJCSAgICAgbG9uZyBsZW5ndGgsIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLAorCQkgICAgIERFU19jYmxvY2sgKml2ZWMpCisJeworCXJlZ2lzdGVyIERFU19MT05HIGQwLGQxLHZ2MCx2djEsdjAsdjEsbj0obnVtYml0cys3KS84OworCXJlZ2lzdGVyIERFU19MT05HIG1hc2swLG1hc2sxOworCXJlZ2lzdGVyIGxvbmcgbD1sZW5ndGg7CisJcmVnaXN0ZXIgaW50IG51bT1udW1iaXRzOworCURFU19MT05HIHRpWzJdOworCXVuc2lnbmVkIGNoYXIgKml2OworCisJaWYgKG51bSA+IDY0KSByZXR1cm47CisJaWYgKG51bSA+IDMyKQorCQl7CisJCW1hc2swPTB4ZmZmZmZmZmZMOworCQlpZiAobnVtID49IDY0KQorCQkJbWFzazE9bWFzazA7CisJCWVsc2UKKwkJCW1hc2sxPSgxTDw8KG51bS0zMikpLTE7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKG51bSA9PSAzMikKKwkJCW1hc2swPTB4ZmZmZmZmZmZMOworCQllbHNlCisJCQltYXNrMD0oMUw8PG51bSktMTsKKwkJbWFzazE9MHgwMDAwMDAwMEw7CisJCX0KKworCWl2ID0gJigqaXZlYylbMF07CisJYzJsKGl2LHYwKTsKKwljMmwoaXYsdjEpOworCXRpWzBdPXYwOworCXRpWzFdPXYxOworCXdoaWxlIChsLS0gPiAwKQorCQl7CisJCXRpWzBdPXYwOworCQl0aVsxXT12MTsKKwkJREVTX2VuY3J5cHQxKChERVNfTE9ORyAqKXRpLHNjaGVkdWxlLERFU19FTkNSWVBUKTsKKwkJdnYwPXRpWzBdOworCQl2djE9dGlbMV07CisJCWMybG4oaW4sZDAsZDEsbik7CisJCWluKz1uOworCQlkMD0oZDBednYwKSZtYXNrMDsKKwkJZDE9KGQxXnZ2MSkmbWFzazE7CisJCWwyY24oZDAsZDEsb3V0LG4pOworCQlvdXQrPW47CisKKwkJaWYgKG51bSA9PSAzMikKKwkJCXsgdjA9djE7IHYxPXZ2MDsgfQorCQllbHNlIGlmIChudW0gPT0gNjQpCisJCQkJeyB2MD12djA7IHYxPXZ2MTsgfQorCQllbHNlIGlmIChudW0gPiAzMikgLyogJiYgbnVtICE9IDY0ICovCisJCQl7CisJCQl2MD0oKHYxPj4obnVtLTMyKSl8KHZ2MDw8KDY0LW51bSkpKSYweGZmZmZmZmZmTDsKKwkJCXYxPSgodnYwPj4obnVtLTMyKSl8KHZ2MTw8KDY0LW51bSkpKSYweGZmZmZmZmZmTDsKKwkJCX0KKwkJZWxzZSAvKiBudW0gPCAzMiAqLworCQkJeworCQkJdjA9KCh2MD4+bnVtKXwodjE8PCgzMi1udW0pKSkmMHhmZmZmZmZmZkw7CisJCQl2MT0oKHYxPj5udW0pfCh2djA8PCgzMi1udW0pKSkmMHhmZmZmZmZmZkw7CisJCQl9CisJCX0KKwlpdiA9ICYoKml2ZWMpWzBdOworCWwyYyh2MCxpdik7CisJbDJjKHYxLGl2KTsKKwl2MD12MT1kMD1kMT10aVswXT10aVsxXT12djA9dnYxPTA7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL29wdGlvbnMudHh0IGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9vcHRpb25zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJiNTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9vcHRpb25zLnR4dApAQCAtMCwwICsxLDM5IEBACitOb3RlIHRoYXQgdGhlIFVOUk9MTCBvcHRpb24gbWFrZXMgdGhlICdpbm5lcicgZGVzIGxvb3AgdW5yb2xsIGFsbCAxNiByb3VuZHMKK2luc3RlYWQgb2YgdGhlIGRlZmF1bHQgNC4KK1JJU0MxIGFuZCBSSVNDMiBhcmUgMiBhbHRlcm5hdGl2ZXMgZm9yIHRoZSBpbm5lciBsb29wIGFuZAorUFRSIG1lYW5zIHRvIHVzZSBwb2ludGVycyBhcml0aG1hdGljIGluc3RlYWQgb2YgYXJyYXlzLgorCitGcmVlQlNEIC0gUGVudGl1bSBQcm8gMjAwbWh6IC0gZ2NjIDIuNy4yLjIgLSBhc3NlbWJsZXIJCTU3NywwMDAgNDYyMGsvcworSVJJWCA2LjIgLSBSMTAwMDAgMTk1bWh6IC0gY2MgKC1PMyAtbjMyKSAtIFVOUk9MTCBSSVNDMiBQVFIJNDk2LDAwMCAzOTY4ay9zCitzb2xhcmlzIDIuNS4xIHVzcGFyYyAxNjdtaHo/PyAtIFNDNC4wIC0gVU5ST0xMIFJJU0MxIFBUUiBbMV0JNDU5LDQwMCAzNjcyay9zCitGcmVlQlNEIC0gUGVudGl1bSBQcm8gMjAwbWh6IC0gZ2NjIDIuNy4yLjIgLSBVTlJPTEwgUklTQzEJNDMzLDAwMCAzNDY4ay9zCitzb2xhcmlzIDIuNS4xIHVzcGFyYyAxNjdtaHo/PyAtIGdjYyAyLjcuMiAtIFVOUk9MTCAJCTM4MCwwMDAgMzA0MWsvcworbGludXggLSBwZW50aXVtIDEwMG1oeiAtIGdjYyAyLjcuMCAtIGFzc2VtYmxlcgkJCTI4MSwwMDAgMjI1MGsvcworTlQgNC4wIC0gcGVudGl1bSAxMDBtaHogLSBWQyA0LjIgLSBhc3NlbWJsZXIJCQkyODEsMDAwIDIyNTBrL3MKK0FJWCA0LjE/IC0gUFBDNjA0IDEwMG1oeiAtIGNjIC0gVU5ST0xMIAkJCQkyNzUsMDAwIDIyMDBrL3MKK0lSSVggNS4zIC0gUjQ0MDAgMjAwbWh6IC0gZ2NjIDIuNi4zIC0gVU5ST0xMIFJJU0MyIFBUUgkJMjM1LDMwMCAxODgyay9zCitJUklYIDUuMyAtIFI0NDAwIDIwMG1oeiAtIGNjIC0gVU5ST0xMIFJJU0MyIFBUUgkJCTIzMyw3MDAgMTg2OWsvcworTlQgNC4wIC0gcGVudGl1bSAxMDBtaHogLSBWQyA0LjIgLSBVTlJPTEwgUklTQzEgUFRSCQkxOTEsMDAwIDE1MjhrL3MKK0RFQyBBbHBoYSAxNjVtaHo/PyAgLSBjYyAtIFJJU0MyIFBUUiBbMl0JCQkxODEsMDAwIDE0NDhrL3MKK2xpbnV4IC0gcGVudGl1bSAxMDBtaHogLSBnY2MgMi43LjAgLSBVTlJPTEwgUklTQzEgUFRSCQkxNTgsNTAwIDEyNjhrL3MKK0hQVVggMTAgLSA5MDAwLzg4NyAtIGNjIC0gVU5ST0xMIFszXQkgCQkJMTQ4LDAwMAkxMTkway9zCitzb2xhcmlzIDIuNS4xIC0gc3BhcmMgMTAgNTBtaHogLSBnY2MgMi43LjIgLSBVTlJPTEwJCTEyMyw2MDAgIDk4OWsvcworSVJJWCA1LjMgLSBSNDAwMCAxMDBtaHogLSBjYyAtIFVOUk9MTCBSSVNDMiBQVFIJCQkxMDEsMDAwICA4MDhrL3MKK0RHVVggLSA4ODEwMCA1MG1oeig/KSAtIGdjYyAyLjYuMyAtIFVOUk9MTAkJCSA4MSwwMDAgIDY0OGsvcworc29sYXJpcyAyLjQgNDg2IDUwbWh6IC0gZ2NjIDIuNi4zIC0gYXNzZW1ibGVyCQkJIDY1LDAwMCAgNTIyay9zCitIUFVYIDEwIC0gOTAwMC84ODcgLSBrJnIgY2MgKGRlZmF1bHQgY29tcGlsZXIpIC0gVU5ST0xMIFBUUgkgNzYsMDAwCSA2MDhrL3MKK3NvbGFyaXMgMi40IDQ4NiA1MG1oeiAtIGdjYyAyLjYuMyAtIFVOUk9MTCBSSVNDMgkJIDQzLDUwMCAgMzQ0ay9zCitBSVggLSBvbGQgc2xvdyBvbmUgOi0pIC0gY2MgLQkJCQkJIDM5LDAwMCAgMzEyay9zCisKK05vdGVzLgorWzFdIEZvciB0aGUgdWx0cmEgc3BhcmMsIFN1bkMgNC4wIAorICAgIGNjIC14dGFyZ2V0PXVsdHJhIC14YXJjaD12OHBsdXMgLVhhIC14TzUsIHJ1bm5pbmcgJ2Rlc19vcHRzJworICAgIGdpdmVzIGEgc3BlZWQgb2YgMzQ0LDAwMCBkZXMvcyB3aGlsZSAnc3BlZWQnIGdpdmVzIDQ1OSwwMDAgZGVzL3MuCisgICAgSSdsbCByZWNvcmQgdGhlIGhpZ2hlciBzaW5jZSBpdCBpcyBjb21pbmcgZnJvbSB0aGUgbGlicmFyeSBidXQgaXQKKyAgICBpcyBhbGwgcmF0aGVyIHdlaXJkLgorWzJdIFNpbWlsYXIgdG8gdGhlIHVsdHJhIHNwYXJjIChbMV0pLCAxODEsMDAwIGZvciAnZGVzX29wdHMnIHZzIDE3NSwwMDAuCitbM10gSSB3YXMgdW5hYmxlIHRvIGdldCBhY2Nlc3MgdG8gdGhpcyBtYWNoaW5lIHdoZW4gaXQgd2FzIG5vdCBoZWF2aWx5IGxvYWRlZC4KKyAgICBBcyBzdWNoLCBteSB0aW1pbmcgcHJvZ3JhbSB3YXMgbmV2ZXIgYWJsZSB0byBnZXQgbW9yZSB0aGF0ICUzMCBvZiB0aGUgQ1BVLgorICAgIFRoaXMgd291bGQgY2F1c2UgdGhlIHByb2dyYW0gdG8gZ2l2ZSBtdWNoIGxvd2VyIHNwZWVkIG51bWJlcnMgYmVjYXVzZQorICAgIGl0IHdvdWxkIGJlICdmaWdodGluZycgdG8gc3RheSBpbiB0aGUgY2FjaGUgd2l0aCB0aGUgb3RoZXIgQ1BVIGJ1cm5pbmcKKyAgICBwcm9jZXNzZXMuCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3BjYmNfZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3BjYmNfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhNDBmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvcGNiY19lbmMuYwpAQCAtMCwwICsxLDEyMyBAQAorLyogY3J5cHRvL2Rlcy9wY2JjX2VuYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorCit2b2lkIERFU19wY2JjX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwKKwkJICAgICAgbG9uZyBsZW5ndGgsIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlLAorCQkgICAgICBERVNfY2Jsb2NrICppdmVjLCBpbnQgZW5jKQorCXsKKwlyZWdpc3RlciBERVNfTE9ORyBzaW4wLHNpbjEseG9yMCx4b3IxLHRvdXQwLHRvdXQxOworCURFU19MT05HIHRpblsyXTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbjsKKwl1bnNpZ25lZCBjaGFyICpvdXQsKml2OworCisJaW49aW5wdXQ7CisJb3V0PW91dHB1dDsKKwlpdiA9ICYoKml2ZWMpWzBdOworCisJaWYgKGVuYykKKwkJeworCQljMmwoaXYseG9yMCk7CisJCWMybChpdix4b3IxKTsKKwkJZm9yICg7IGxlbmd0aD4wOyBsZW5ndGgtPTgpCisJCQl7CisJCQlpZiAobGVuZ3RoID49IDgpCisJCQkJeworCQkJCWMybChpbixzaW4wKTsKKwkJCQljMmwoaW4sc2luMSk7CisJCQkJfQorCQkJZWxzZQorCQkJCWMybG4oaW4sc2luMCxzaW4xLGxlbmd0aCk7CisJCQl0aW5bMF09c2luMF54b3IwOworCQkJdGluWzFdPXNpbjFeeG9yMTsKKwkJCURFU19lbmNyeXB0MSgoREVTX0xPTkcgKil0aW4sc2NoZWR1bGUsREVTX0VOQ1JZUFQpOworCQkJdG91dDA9dGluWzBdOworCQkJdG91dDE9dGluWzFdOworCQkJeG9yMD1zaW4wXnRvdXQwOworCQkJeG9yMT1zaW4xXnRvdXQxOworCQkJbDJjKHRvdXQwLG91dCk7CisJCQlsMmModG91dDEsb3V0KTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQljMmwoaXYseG9yMCk7IGMybChpdix4b3IxKTsKKwkJZm9yICg7IGxlbmd0aD4wOyBsZW5ndGgtPTgpCisJCQl7CisJCQljMmwoaW4sc2luMCk7CisJCQljMmwoaW4sc2luMSk7CisJCQl0aW5bMF09c2luMDsKKwkJCXRpblsxXT1zaW4xOworCQkJREVTX2VuY3J5cHQxKChERVNfTE9ORyAqKXRpbixzY2hlZHVsZSxERVNfREVDUllQVCk7CisJCQl0b3V0MD10aW5bMF1eeG9yMDsKKwkJCXRvdXQxPXRpblsxXV54b3IxOworCQkJaWYgKGxlbmd0aCA+PSA4KQorCQkJCXsKKwkJCQlsMmModG91dDAsb3V0KTsKKwkJCQlsMmModG91dDEsb3V0KTsKKwkJCQl9CisJCQllbHNlCisJCQkJbDJjbih0b3V0MCx0b3V0MSxvdXQsbGVuZ3RoKTsKKwkJCXhvcjA9dG91dDBec2luMDsKKwkJCXhvcjE9dG91dDFec2luMTsKKwkJCX0KKwkJfQorCXRpblswXT10aW5bMV09MDsKKwlzaW4wPXNpbjE9eG9yMD14b3IxPXRvdXQwPXRvdXQxPTA7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9xdWRfY2tzbS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9xdWRfY2tzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzIwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3F1ZF9ja3NtLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIGNyeXB0by9kZXMvcXVkX2Nrc20uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBGcm9tICJNZXNzYWdlIEF1dGhlbnRpY2F0aW9uIiAgUi5SLiBKdWVuZW1hbiwgUy5NLiBNYXR5YXMsIEMuSC4gTWV5ZXIKKyAqIElFRUUgQ29tbXVuaWNhdGlvbnMgTWFnYXppbmUgU2VwdCAxOTg1IFZvbC4gMjMgTm8uIDkgcCAyOS00MAorICogVGhpcyBtb2R1bGUgaW4gb25seSBiYXNlZCBvbiB0aGUgY29kZSBpbiB0aGlzIHBhcGVyIGFuZCBpcworICogYWxtb3N0IGRlZmluaXRlbHkgbm90IHRoZSBzYW1lIGFzIHRoZSBNSVQgaW1wbGVtZW50YXRpb24uCisgKi8KKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorCisvKiBidWcgZml4IGZvciBkb3MgLSA3LzYvOTEgLSBMYXJyeSBodWdoZXNAbG9nb3MudWNzLmluZGlhbmEuZWR1ICovCisjZGVmaW5lIFFfQjAoYSkJKCgoREVTX0xPTkcpKGEpKSkKKyNkZWZpbmUgUV9CMShhKQkoKChERVNfTE9ORykoYSkpPDw4KQorI2RlZmluZSBRX0IyKGEpCSgoKERFU19MT05HKShhKSk8PDE2KQorI2RlZmluZSBRX0IzKGEpCSgoKERFU19MT05HKShhKSk8PDI0KQorCisvKiB1c2VkIHRvIHNjcmFtYmxlIHRoaW5ncyBhIGJpdCAqLworLyogR290IHRoZSB2YWx1ZSBNSVQgdXNlcyB2aWEgYnJ1dGUgZm9yY2UgOi0pIDIvMTAvOTAgZWF5ICovCisjZGVmaW5lIE5PSVNFCSgoREVTX0xPTkcpODM2NTM0MjFMKQorCitERVNfTE9ORyBERVNfcXVhZF9ja3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwgREVTX2NibG9jayBvdXRwdXRbXSwKKwkgICAgIGxvbmcgbGVuZ3RoLCBpbnQgb3V0X2NvdW50LCBERVNfY2Jsb2NrICpzZWVkKQorCXsKKwlERVNfTE9ORyB6MCx6MSx0MCx0MTsKKwlpbnQgaTsKKwlsb25nIGw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY3A7CisjaWZkZWYgX0NSQVkKKwlzdHJ1Y3QgbHBfc3QgeyBpbnQgYTozMjsgaW50IGI6MzI7IH0gKmxwOworI2Vsc2UKKwlERVNfTE9ORyAqbHA7CisjZW5kaWYKKworCWlmIChvdXRfY291bnQgPCAxKSBvdXRfY291bnQ9MTsKKyNpZmRlZiBfQ1JBWQorCWxwID0gKHN0cnVjdCBscF9zdCAqKSAmKG91dHB1dFswXSlbMF07CisjZWxzZQorCWxwID0gKERFU19MT05HICopICYob3V0cHV0WzBdKVswXTsKKyNlbmRpZgorCisJejA9UV9CMCgoKnNlZWQpWzBdKXxRX0IxKCgqc2VlZClbMV0pfFFfQjIoKCpzZWVkKVsyXSl8UV9CMygoKnNlZWQpWzNdKTsKKwl6MT1RX0IwKCgqc2VlZClbNF0pfFFfQjEoKCpzZWVkKVs1XSl8UV9CMigoKnNlZWQpWzZdKXxRX0IzKCgqc2VlZClbN10pOworCisJZm9yIChpPTA7ICgoaTw0KSYmKGk8b3V0X2NvdW50KSk7IGkrKykKKwkJeworCQljcD1pbnB1dDsKKwkJbD1sZW5ndGg7CisJCXdoaWxlIChsID4gMCkKKwkJCXsKKwkJCWlmIChsID4gMSkKKwkJCQl7CisJCQkJdDA9IChERVNfTE9ORykoKihjcCsrKSk7CisJCQkJdDB8PShERVNfTE9ORylRX0IxKCooY3ArKykpOworCQkJCWwtLTsKKwkJCQl9CisJCQllbHNlCisJCQkJdDA9IChERVNfTE9ORykoKihjcCsrKSk7CisJCQlsLS07CisJCQkvKiBhZGQgKi8KKwkJCXQwKz16MDsKKwkJCXQwJj0weGZmZmZmZmZmTDsKKwkJCXQxPXoxOworCQkJLyogc3F1YXJlLCB3ZWxsIHNvcnQgb2Ygc3F1YXJlICovCisJCQl6MD0oKCgodDAqdDApJjB4ZmZmZmZmZmZMKSsoKHQxKnQxKSYweGZmZmZmZmZmTCkpCisJCQkJJjB4ZmZmZmZmZmZMKSUweDdmZmZmZmZmTDsgCisJCQl6MT0oKHQwKigodDErTk9JU0UpJjB4ZmZmZmZmZmZMKSkmMHhmZmZmZmZmZkwpJTB4N2ZmZmZmZmZMOworCQkJfQorCQlpZiAobHAgIT0gTlVMTCkKKwkJCXsKKwkJCS8qIFRoZSBNSVQgbGlicmFyeSBhc3N1bWVzIHRoYXQgdGhlIGNoZWNrc3VtIGlzCisJCQkgKiBjb21wb3NlZCBvZiAyKm91dF9jb3VudCAzMiBiaXQgaW50cyAqLworI2lmZGVmIF9DUkFZCisJCQkoKmxwKS5hID0gejA7CisJCQkoKmxwKS5iID0gejE7CisJCQlscCsrOworI2Vsc2UKKwkJCSpscCsrID0gejA7CisJCQkqbHArKyA9IHoxOworI2VuZGlmCisJCQl9CisJCX0KKwlyZXR1cm4oejApOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9yYW5kX2tleS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9yYW5kX2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTgxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3JhbmRfa2V5LmMKQEAgLTAsMCArMSw2OCBAQAorLyogY3J5cHRvL2Rlcy9yYW5kX2tleS5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK2ludCBERVNfcmFuZG9tX2tleShERVNfY2Jsb2NrICpyZXQpCisJeworCWRvCisJCXsKKwkJaWYgKFJBTkRfYnl0ZXMoKHVuc2lnbmVkIGNoYXIgKilyZXQsIHNpemVvZihERVNfY2Jsb2NrKSkgIT0gMSkKKwkJCXJldHVybiAoMCk7CisJCX0gd2hpbGUgKERFU19pc193ZWFrX2tleShyZXQpKTsKKwlERVNfc2V0X29kZF9wYXJpdHkocmV0KTsKKwlyZXR1cm4gKDEpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvcmVhZDJwd2QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvcmVhZDJwd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY5NjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9yZWFkMnB3ZC5jCkBAIC0wLDAgKzEsMTQwIEBACisvKiBjcnlwdG8vZGVzL3JlYWQycHdkLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3VpLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKworaW50IERFU19yZWFkX3Bhc3N3b3JkKERFU19jYmxvY2sgKmtleSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgdmVyaWZ5KQorCXsKKwlpbnQgb2s7CisJY2hhciBidWZbQlVGU0laXSxidWZmW0JVRlNJWl07CisKKwlpZiAoKG9rPVVJX1VUSUxfcmVhZF9wdyhidWYsYnVmZixCVUZTSVoscHJvbXB0LHZlcmlmeSkpID09IDApCisJCURFU19zdHJpbmdfdG9fa2V5KGJ1ZixrZXkpOworCU9QRU5TU0xfY2xlYW5zZShidWYsQlVGU0laKTsKKwlPUEVOU1NMX2NsZWFuc2UoYnVmZixCVUZTSVopOworCXJldHVybihvayk7CisJfQorCitpbnQgREVTX3JlYWRfMnBhc3N3b3JkcyhERVNfY2Jsb2NrICprZXkxLCBERVNfY2Jsb2NrICprZXkyLCBjb25zdCBjaGFyICpwcm9tcHQsCisJICAgICBpbnQgdmVyaWZ5KQorCXsKKwlpbnQgb2s7CisJY2hhciBidWZbQlVGU0laXSxidWZmW0JVRlNJWl07CisKKwlpZiAoKG9rPVVJX1VUSUxfcmVhZF9wdyhidWYsYnVmZixCVUZTSVoscHJvbXB0LHZlcmlmeSkpID09IDApCisJCURFU19zdHJpbmdfdG9fMmtleXMoYnVmLGtleTEsa2V5Mik7CisJT1BFTlNTTF9jbGVhbnNlKGJ1ZixCVUZTSVopOworCU9QRU5TU0xfY2xlYW5zZShidWZmLEJVRlNJWik7CisJcmV0dXJuKG9rKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3JlYWRfcHdkLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3JlYWRfcHdkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1ZmEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvcmVhZF9wd2QuYwpAQCAtMCwwICsxLDUyMSBAQAorLyogY3J5cHRvL2Rlcy9yZWFkX3B3ZC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpCisjaWZkZWYgT1BFTlNTTF9VTklTVEQKKyMgaW5jbHVkZSBPUEVOU1NMX1VOSVNURAorI2Vsc2UKKyMgaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKy8qIElmIHVuaXN0ZC5oIGRlZmluZXMgX1BPU0lYX1ZFUlNJT04sIHdlIGNvbmNsdWRlIHRoYXQgd2UKKyAqIGFyZSBvbiBhIFBPU0lYIHN5c3RlbSBhbmQgaGF2ZSBzaWdhY3Rpb24gYW5kIHRlcm1pb3MuICovCisjaWYgZGVmaW5lZChfUE9TSVhfVkVSU0lPTikKKworIyBkZWZpbmUgU0lHQUNUSU9OCisjIGlmICFkZWZpbmVkKFRFUk1JT1MpICYmICFkZWZpbmVkKFRFUk1JTykgJiYgIWRlZmluZWQoU0dUVFkpCisjIGRlZmluZSBURVJNSU9TCisjIGVuZGlmCisKKyNlbmRpZgorI2VuZGlmCisKKy8qICNkZWZpbmUgU0lHQUNUSU9OICovIC8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHNpZ2FjdGlvbigpICovCisKKyNpZmRlZiBXSU4xNlRUWQorI3VuZGVmIE9QRU5TU0xfU1lTX1dJTjE2CisjdW5kZWYgX1dJTkRPV1MKKyNpbmNsdWRlIDxncmFwaC5oPgorI2VuZGlmCisKKy8qIDA2LUFwci05MiBMdWtlIEJyZW5uYW4gICAgU3VwcG9ydCBmb3IgVk1TICovCisjaW5jbHVkZSAiZGVzX2xvY2wuaCIKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUwkJCS8qIHByb3RvdHlwZXMgZm9yIHN5cyR3aGF0ZXZlciAqLworI2luY2x1ZGUgPHN0YXJsZXQuaD4KKyNpZmRlZiBfX0RFQ0MKKyNwcmFnbWEgbWVzc2FnZSBkaXNhYmxlIERPTExBUklECisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0lOX0NPTlNPTEVfQlVHCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2lmbmRlZiBPUEVOU1NMX1NZU19XSU5DRQorI2luY2x1ZGUgPHdpbmNvbi5oPgorI2VuZGlmCisjZW5kaWYKKworCisvKiBUaGVyZSBhcmUgNSB0eXBlcyBvZiB0ZXJtaW5hbCBpbnRlcmZhY2Ugc3VwcG9ydGVkLAorICogVEVSTUlPLCBURVJNSU9TLCBWTVMsIE1TRE9TIGFuZCBTR1RUWQorICovCisKKyNpZiBkZWZpbmVkKF9fc2dpKSAmJiAhZGVmaW5lZChURVJNSU9TKQorI2RlZmluZSBURVJNSU9TCisjdW5kZWYgIFRFUk1JTworI3VuZGVmICBTR1RUWQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKGxpbnV4KSAmJiAhZGVmaW5lZChURVJNSU8pCisjdW5kZWYgIFRFUk1JT1MKKyNkZWZpbmUgVEVSTUlPCisjdW5kZWYgIFNHVFRZCisjZW5kaWYKKworI2lmZGVmIF9MSUJDCisjdW5kZWYgIFRFUk1JT1MKKyNkZWZpbmUgVEVSTUlPCisjdW5kZWYgIFNHVFRZCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFRFUk1JTykgJiYgIWRlZmluZWQoVEVSTUlPUykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgIWRlZmluZWQoTUFDX09TX3ByZV9YKSAmJiAhZGVmaW5lZChNQUNfT1NfR1VTSV9TT1VSQ0UpCisjdW5kZWYgIFRFUk1JT1MKKyN1bmRlZiAgVEVSTUlPCisjZGVmaW5lIFNHVFRZCisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfVlhXT1JLUykKKyN1bmRlZiBURVJNSU9TCisjdW5kZWYgVEVSTUlPCisjdW5kZWYgU0dUVFkKKyNlbmRpZgorCisjaWZkZWYgVEVSTUlPUworI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNkZWZpbmUgVFRZX1NUUlVDVAkJc3RydWN0IHRlcm1pb3MKKyNkZWZpbmUgVFRZX0ZMQUdTCQljX2xmbGFnCisjZGVmaW5lCVRUWV9nZXQodHR5LGRhdGEpCXRjZ2V0YXR0cih0dHksZGF0YSkKKyNkZWZpbmUgVFRZX3NldCh0dHksZGF0YSkJdGNzZXRhdHRyKHR0eSxUQ1NBTk9XLGRhdGEpCisjZW5kaWYKKworI2lmZGVmIFRFUk1JTworI2luY2x1ZGUgPHRlcm1pby5oPgorI2RlZmluZSBUVFlfU1RSVUNUCQlzdHJ1Y3QgdGVybWlvCisjZGVmaW5lIFRUWV9GTEFHUwkJY19sZmxhZworI2RlZmluZSBUVFlfZ2V0KHR0eSxkYXRhKQlpb2N0bCh0dHksVENHRVRBLGRhdGEpCisjZGVmaW5lIFRUWV9zZXQodHR5LGRhdGEpCWlvY3RsKHR0eSxUQ1NFVEEsZGF0YSkKKyNlbmRpZgorCisjaWZkZWYgU0dUVFkKKyNpbmNsdWRlIDxzZ3R0eS5oPgorI2RlZmluZSBUVFlfU1RSVUNUCQlzdHJ1Y3Qgc2d0dHliCisjZGVmaW5lIFRUWV9GTEFHUwkJc2dfZmxhZ3MKKyNkZWZpbmUgVFRZX2dldCh0dHksZGF0YSkJaW9jdGwodHR5LFRJT0NHRVRQLGRhdGEpCisjZGVmaW5lIFRUWV9zZXQodHR5LGRhdGEpCWlvY3RsKHR0eSxUSU9DU0VUUCxkYXRhKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTElCQykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgJiYgIWRlZmluZWQoTUFDX09TX3ByZV9YKQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChfX0NZR1dJTjMyX18pICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkNFKQorI2luY2x1ZGUgPGNvbmlvLmg+CisjZGVmaW5lIGZnZXRzKGEsYixjKSBub2VjaG9fZmdldHMoYSxiLGMpCisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworI2luY2x1ZGUgPHNzZGVmLmg+CisjaW5jbHVkZSA8aW9kZWYuaD4KKyNpbmNsdWRlIDx0dGRlZi5oPgorI2luY2x1ZGUgPGRlc2NyaXAuaD4KK3N0cnVjdCBJT1NCIHsKKwlzaG9ydCBpb3NiJHdfdmFsdWU7CisJc2hvcnQgaW9zYiR3X2NvdW50OworCWxvbmcgIGlvc2IkbF9pbmZvOworCX07CisjZW5kaWYKKworI2lmIGRlZmluZWQoTUFDX09TX3ByZV9YKSB8fCBkZWZpbmVkKE1BQ19PU19HVVNJX1NPVVJDRSkKKy8qCisgKiBUaGlzIG9uZSBuZWVkcyB3b3JrLiBBcyBhIG1hdHRlciBvZiBmYWN0IHRoZSBjb2RlIGlzIHVub3BlcmF0aW9uYWwKKyAqIGFuZCB0aGlzIGlzIG9ubHkgYSB0cmljayB0byBnZXQgaXQgY29tcGlsZWQuCisgKgkJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorICovCisjZGVmaW5lIFRUWV9TVFJVQ1QgaW50CisjZW5kaWYKKworI2lmbmRlZiBOWDUwOV9TSUcKKyNkZWZpbmUgTlg1MDlfU0lHIDMyCisjZW5kaWYKKworc3RhdGljIHZvaWQgcmVhZF90aWxsX25sKEZJTEUgKik7CitzdGF0aWMgdm9pZCByZWNzaWcoaW50KTsKK3N0YXRpYyB2b2lkIHB1c2hzaWcodm9pZCk7CitzdGF0aWMgdm9pZCBwb3BzaWcodm9pZCk7CisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMTYpCitzdGF0aWMgaW50IG5vZWNob19mZ2V0cyhjaGFyICpidWYsIGludCBzaXplLCBGSUxFICp0dHkpOworI2VuZGlmCisjaWZkZWYgU0lHQUNUSU9OCisgc3RhdGljIHN0cnVjdCBzaWdhY3Rpb24gc2F2c2lnW05YNTA5X1NJR107CisjZWxzZQorICBzdGF0aWMgdm9pZCAoKnNhdnNpZ1tOWDUwOV9TSUddKShpbnQgKTsKKyNlbmRpZgorc3RhdGljIGptcF9idWYgc2F2ZTsKKworaW50IGRlc19yZWFkX3B3X3N0cmluZyhjaGFyICpidWYsIGludCBsZW5ndGgsIGNvbnN0IGNoYXIgKnByb21wdCwKKwkgICAgIGludCB2ZXJpZnkpCisJeworCWNoYXIgYnVmZltCVUZTSVpdOworCWludCByZXQ7CisKKwlyZXQ9ZGVzX3JlYWRfcHcoYnVmLGJ1ZmYsKGxlbmd0aD5CVUZTSVopP0JVRlNJWjpsZW5ndGgscHJvbXB0LHZlcmlmeSk7CisJT1BFTlNTTF9jbGVhbnNlKGJ1ZmYsQlVGU0laKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU5DRQorCitpbnQgZGVzX3JlYWRfcHcoY2hhciAqYnVmLCBjaGFyICpidWZmLCBpbnQgc2l6ZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgdmVyaWZ5KQorCXsgCisJbWVtc2V0KGJ1ZiwwLHNpemUpOworCW1lbXNldChidWZmLDAsc2l6ZSk7CisJcmV0dXJuKDApOworCX0KKworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4xNikKKworaW50IGRlc19yZWFkX3B3KGNoYXIgKmJ1ZiwgY2hhciAqYnVmZiwgaW50IHNpemUsIGNoYXIgKnByb21wdCwgaW50IHZlcmlmeSkKKwl7IAorCW1lbXNldChidWYsMCxzaXplKTsKKwltZW1zZXQoYnVmZiwwLHNpemUpOworCXJldHVybigwKTsKKwl9CisKKyNlbHNlIC8qICFPUEVOU1NMX1NZU19XSU5DRSAmJiAhT1BFTlNTTF9TWVNfV0lOMTYgKi8KKworc3RhdGljIHZvaWQgcmVhZF90aWxsX25sKEZJTEUgKmluKQorCXsKKyNkZWZpbmUgU0laRSA0CisJY2hhciBidWZbU0laRSsxXTsKKworCWRvCXsKKwkJZmdldHMoYnVmLFNJWkUsaW4pOworCQl9IHdoaWxlIChzdHJjaHIoYnVmLCdcbicpID09IE5VTEwpOworCX0KKworCisvKiByZXR1cm4gMCBpZiBvaywgMSAob3IgLTEpIG90aGVyd2lzZSAqLworaW50IGRlc19yZWFkX3B3KGNoYXIgKmJ1ZiwgY2hhciAqYnVmZiwgaW50IHNpemUsIGNvbnN0IGNoYXIgKnByb21wdCwKKwkgICAgIGludCB2ZXJpZnkpCisJeworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCXN0cnVjdCBJT1NCIGlvc2I7CisJJERFU0NSSVBUT1IodGVybWluYWwsIlRUIik7CisJbG9uZyB0dHlfb3JpZ1szXSwgdHR5X25ld1szXTsKKwlsb25nIHN0YXR1czsKKwl1bnNpZ25lZCBzaG9ydCBjaGFubmVsID0gMDsKKyNlbHNlCisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpIHx8IGRlZmluZWQoX19ESkdQUF9fKQorCVRUWV9TVFJVQ1QgdHR5X29yaWcsdHR5X25ldzsKKyNlbmRpZgorI2VuZGlmCisJaW50IG51bWJlcjsKKwlpbnQgb2s7CisJLyogc3RhdGljcyBhcmUgc2ltcGx5IHRvIGF2b2lkIHdhcm5pbmdzIGFib3V0IGxvbmdqbXAgY2xvYmJlcmluZworCSAgIHRoaW5ncyAqLworCXN0YXRpYyBpbnQgcHM7CisJaW50IGlzX2FfdHR5OworCXN0YXRpYyBGSUxFICp0dHk7CisJY2hhciAqcDsKKworCWlmIChzZXRqbXAoc2F2ZSkpCisJCXsKKwkJb2s9MDsKKwkJZ290byBlcnJvcjsKKwkJfQorCisJbnVtYmVyPTU7CisJb2s9MDsKKwlwcz0wOworCWlzX2FfdHR5PTE7CisJdHR5PU5VTEw7CisKKyNpZmRlZiBPUEVOU1NMX1NZU19NU0RPUworCWlmICgodHR5PWZvcGVuKCJjb24iLCJyIikpID09IE5VTEwpCisJCXR0eT1zdGRpbjsKKyNlbGlmIGRlZmluZWQoTUFDX09TX3ByZV9YKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZYV09SS1MpCisJdHR5PXN0ZGluOworI2Vsc2UKKyNpZm5kZWYgT1BFTlNTTF9TWVNfTVBFCisJaWYgKCh0dHk9Zm9wZW4oIi9kZXYvdHR5IiwiciIpKSA9PSBOVUxMKQorI2VuZGlmCisJCXR0eT1zdGRpbjsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChUVFlfZ2V0KSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpCisJaWYgKFRUWV9nZXQoZmlsZW5vKHR0eSksJnR0eV9vcmlnKSA9PSAtMSkKKwkJeworI2lmZGVmIEVOT1RUWQorCQlpZiAoZXJybm8gPT0gRU5PVFRZKQorCQkJaXNfYV90dHk9MDsKKwkJZWxzZQorI2VuZGlmCisjaWZkZWYgRUlOVkFMCisJCS8qIEFyaWVsIEdsZW5uIGFyaWVsQGNvbHVtYmlhLmVkdSByZXBvcnRzIHRoYXQgc29sYXJpcworCQkgKiBjYW4gcmV0dXJuIEVJTlZBTCBpbnN0ZWFkLiAgVGhpcyBzaG91bGQgYmUgb2sgKi8KKwkJaWYgKGVycm5vID09IEVJTlZBTCkKKwkJCWlzX2FfdHR5PTA7CisJCWVsc2UKKyNlbmRpZgorCQkJcmV0dXJuKC0xKTsKKwkJfQorCW1lbWNweSgmKHR0eV9uZXcpLCYodHR5X29yaWcpLHNpemVvZih0dHlfb3JpZykpOworI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJc3RhdHVzID0gc3lzJGFzc2lnbigmdGVybWluYWwsJmNoYW5uZWwsMCwwKTsKKwlpZiAoc3RhdHVzICE9IFNTJF9OT1JNQUwpCisJCXJldHVybigtMSk7CisJc3RhdHVzPXN5cyRxaW93KDAsY2hhbm5lbCxJTyRfU0VOU0VNT0RFLCZpb3NiLDAsMCx0dHlfb3JpZywxMiwwLDAsMCwwKTsKKwlpZiAoKHN0YXR1cyAhPSBTUyRfTk9STUFMKSB8fCAoaW9zYi5pb3NiJHdfdmFsdWUgIT0gU1MkX05PUk1BTCkpCisJCXJldHVybigtMSk7CisjZW5kaWYKKworCXB1c2hzaWcoKTsKKwlwcz0xOworCisjaWZkZWYgVFRZX0ZMQUdTCisJdHR5X25ldy5UVFlfRkxBR1MgJj0gfkVDSE87CisjZW5kaWYKKworI2lmIGRlZmluZWQoVFRZX3NldCkgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorCWlmIChpc19hX3R0eSAmJiAoVFRZX3NldChmaWxlbm8odHR5KSwmdHR5X25ldykgPT0gLTEpKQorI2lmZGVmIE9QRU5TU0xfU1lTX01QRSAKKwkJOyAvKiBNUEUgbGllcyAtLSBlY2hvIHJlYWxseSBoYXMgYmVlbiBkaXNhYmxlZCAqLworI2Vsc2UKKwkJcmV0dXJuKC0xKTsKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJdHR5X25ld1swXSA9IHR0eV9vcmlnWzBdOworCXR0eV9uZXdbMV0gPSB0dHlfb3JpZ1sxXSB8IFRUJE1fTk9FQ0hPOworCXR0eV9uZXdbMl0gPSB0dHlfb3JpZ1syXTsKKwlzdGF0dXMgPSBzeXMkcWlvdygwLGNoYW5uZWwsSU8kX1NFVE1PREUsJmlvc2IsMCwwLHR0eV9uZXcsMTIsMCwwLDAsMCk7CisJaWYgKChzdGF0dXMgIT0gU1MkX05PUk1BTCkgfHwgKGlvc2IuaW9zYiR3X3ZhbHVlICE9IFNTJF9OT1JNQUwpKQorCQlyZXR1cm4oLTEpOworI2VuZGlmCisJcHM9MjsKKworCXdoaWxlICgoIW9rKSAmJiAobnVtYmVyLS0pKQorCQl7CisJCWZwdXRzKHByb21wdCxzdGRlcnIpOworCQlmZmx1c2goc3RkZXJyKTsKKworCQlidWZbMF09J1wwJzsKKwkJZmdldHMoYnVmLHNpemUsdHR5KTsKKwkJaWYgKGZlb2YodHR5KSkgZ290byBlcnJvcjsKKwkJaWYgKGZlcnJvcih0dHkpKSBnb3RvIGVycm9yOworCQlpZiAoKHA9KGNoYXIgKilzdHJjaHIoYnVmLCdcbicpKSAhPSBOVUxMKQorCQkJKnA9J1wwJzsKKwkJZWxzZQlyZWFkX3RpbGxfbmwodHR5KTsKKwkJaWYgKHZlcmlmeSkKKwkJCXsKKwkJCWZwcmludGYoc3RkZXJyLCJcblZlcmlmeWluZyBwYXNzd29yZCAtICVzIixwcm9tcHQpOworCQkJZmZsdXNoKHN0ZGVycik7CisJCQlidWZmWzBdPSdcMCc7CisJCQlmZ2V0cyhidWZmLHNpemUsdHR5KTsKKwkJCWlmIChmZW9mKHR0eSkpIGdvdG8gZXJyb3I7CisJCQlpZiAoKHA9KGNoYXIgKilzdHJjaHIoYnVmZiwnXG4nKSkgIT0gTlVMTCkKKwkJCQkqcD0nXDAnOworCQkJZWxzZQlyZWFkX3RpbGxfbmwodHR5KTsKKwkJCQkKKwkJCWlmIChzdHJjbXAoYnVmLGJ1ZmYpICE9IDApCisJCQkJeworCQkJCWZwcmludGYoc3RkZXJyLCJcblZlcmlmeSBmYWlsdXJlIik7CisJCQkJZmZsdXNoKHN0ZGVycik7CisJCQkJYnJlYWs7CisJCQkJLyogY29udGludWU7ICovCisJCQkJfQorCQkJfQorCQlvaz0xOworCQl9CisKK2Vycm9yOgorCWZwcmludGYoc3RkZXJyLCJcbiIpOworI2lmIDAKKwlwZXJyb3IoImZnZXRzKHR0eSkiKTsKKyNlbmRpZgorCS8qIFdoYXQgY2FuIHdlIGRvIGlmIHRoZXJlIGlzIGFuIGVycm9yPyAqLworI2lmIGRlZmluZWQoVFRZX3NldCkgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorCWlmIChwcyA+PSAyKSBUVFlfc2V0KGZpbGVubyh0dHkpLCZ0dHlfb3JpZyk7CisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwlpZiAocHMgPj0gMikKKwkJc3RhdHVzID0gc3lzJHFpb3coMCxjaGFubmVsLElPJF9TRVRNT0RFLCZpb3NiLDAsMAorCQkJLHR0eV9vcmlnLDEyLDAsMCwwLDApOworI2VuZGlmCisJCisJaWYgKHBzID49IDEpIHBvcHNpZygpOworCWlmIChzdGRpbiAhPSB0dHkpIGZjbG9zZSh0dHkpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCXN0YXR1cyA9IHN5cyRkYXNzZ24oY2hhbm5lbCk7CisjZW5kaWYKKwlyZXR1cm4oIW9rKTsKKwl9CisKK3N0YXRpYyB2b2lkIHB1c2hzaWcodm9pZCkKKwl7CisJaW50IGk7CisjaWZkZWYgU0lHQUNUSU9OCisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworCW1lbXNldCgmc2EsMCxzaXplb2Ygc2EpOworCXNhLnNhX2hhbmRsZXI9cmVjc2lnOworI2VuZGlmCisKKwlmb3IgKGk9MTsgaTxOWDUwOV9TSUc7IGkrKykKKwkJeworI2lmZGVmIFNJR1VTUjEKKwkJaWYgKGkgPT0gU0lHVVNSMSkKKwkJCWNvbnRpbnVlOworI2VuZGlmCisjaWZkZWYgU0lHVVNSMgorCQlpZiAoaSA9PSBTSUdVU1IyKQorCQkJY29udGludWU7CisjZW5kaWYKKyNpZmRlZiBTSUdBQ1RJT04KKwkJc2lnYWN0aW9uKGksJnNhLCZzYXZzaWdbaV0pOworI2Vsc2UKKwkJc2F2c2lnW2ldPXNpZ25hbChpLHJlY3NpZyk7CisjZW5kaWYKKwkJfQorCisjaWZkZWYgU0lHV0lOQ0gKKwlzaWduYWwoU0lHV0lOQ0gsU0lHX0RGTCk7CisjZW5kaWYKKwl9CisKK3N0YXRpYyB2b2lkIHBvcHNpZyh2b2lkKQorCXsKKwlpbnQgaTsKKworCWZvciAoaT0xOyBpPE5YNTA5X1NJRzsgaSsrKQorCQl7CisjaWZkZWYgU0lHVVNSMQorCQlpZiAoaSA9PSBTSUdVU1IxKQorCQkJY29udGludWU7CisjZW5kaWYKKyNpZmRlZiBTSUdVU1IyCisJCWlmIChpID09IFNJR1VTUjIpCisJCQljb250aW51ZTsKKyNlbmRpZgorI2lmZGVmIFNJR0FDVElPTgorCQlzaWdhY3Rpb24oaSwmc2F2c2lnW2ldLE5VTEwpOworI2Vsc2UKKwkJc2lnbmFsKGksc2F2c2lnW2ldKTsKKyNlbmRpZgorCQl9CisJfQorCitzdGF0aWMgdm9pZCByZWNzaWcoaW50IGkpCisJeworCWxvbmdqbXAoc2F2ZSwxKTsKKyNpZmRlZiBMSU5UCisJaT1pOworI2VuZGlmCisJfQorCisjaWZkZWYgT1BFTlNTTF9TWVNfTVNET1MKK3N0YXRpYyBpbnQgbm9lY2hvX2ZnZXRzKGNoYXIgKmJ1ZiwgaW50IHNpemUsIEZJTEUgKnR0eSkKKwl7CisJaW50IGk7CisJY2hhciAqcDsKKworCXA9YnVmOworCWZvciAoOzspCisJCXsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCXsKKwkJCSpwPSdcMCc7CisJCQlicmVhazsKKwkJCX0KKwkJc2l6ZS0tOworI2lmZGVmIFdJTjE2VFRZCisJCWk9X2luY2hhcigpOworI2Vsc2UKKwkJaT1nZXRjaCgpOworI2VuZGlmCisJCWlmIChpID09ICdccicpIGk9J1xuJzsKKwkJKihwKyspPWk7CisJCWlmIChpID09ICdcbicpCisJCQl7CisJCQkqcD0nXDAnOworCQkJYnJlYWs7CisJCQl9CisJCX0KKyNpZmRlZiBXSU5fQ09OU09MRV9CVUcKKy8qIFdpbjk1IGhhcyBzZXZlcmFsIGV2aWwgY29uc29sZSBidWdzOiBvbmUgb2YgdGhlc2UgaXMgdGhhdCB0aGUKKyAqIGxhc3QgY2hhcmFjdGVyIHJlYWQgdXNpbmcgZ2V0Y2goKSBpcyBwYXNzZWQgdG8gdGhlIG5leHQgcmVhZDogdGhpcyBpcworICogdXN1YWxseSBhIENSIHNvIHRoaXMgY2FuIGJlIHRyb3VibGUuIE5vIFNURElPIGZpeCBzZWVtcyB0byB3b3JrIGJ1dAorICogZmx1c2hpbmcgdGhlIGNvbnNvbGUgYXBwZWFycyB0byBkbyB0aGUgdHJpY2suCisgKi8KKwkJeworCQkJSEFORExFIGluaDsKKwkJCWluaCA9IEdldFN0ZEhhbmRsZShTVERfSU5QVVRfSEFORExFKTsKKwkJCUZsdXNoQ29uc29sZUlucHV0QnVmZmVyKGluaCk7CisJCX0KKyNlbmRpZgorCXJldHVybihzdHJsZW4oYnVmKSk7CisJfQorI2VuZGlmCisjZW5kaWYgLyogIU9QRU5TU0xfU1lTX1dJTkNFICYmICFXSU4xNiAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9ycGNfZGVzLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3JwY19kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTMyOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9ycGNfZGVzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qIGNyeXB0by9kZXMvcnBjX2Rlcy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qICBAKCMpZGVzLmgJMi4yIDg4LzA4LzEwIDQuMCBSUENTUkM7IGZyb20gMi43IDg4LzAyLzA4IFNNSSAgKi8KKy8qCisgKiBTdW4gUlBDIGlzIGEgcHJvZHVjdCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGFuZCBpcyBwcm92aWRlZCBmb3IKKyAqIHVucmVzdHJpY3RlZCB1c2UgcHJvdmlkZWQgdGhhdCB0aGlzIGxlZ2VuZCBpcyBpbmNsdWRlZCBvbiBhbGwgdGFwZQorICogbWVkaWEgYW5kIGFzIGEgcGFydCBvZiB0aGUgc29mdHdhcmUgcHJvZ3JhbSBpbiB3aG9sZSBvciBwYXJ0LiAgVXNlcnMKKyAqIG1heSBjb3B5IG9yIG1vZGlmeSBTdW4gUlBDIHdpdGhvdXQgY2hhcmdlLCBidXQgYXJlIG5vdCBhdXRob3JpemVkCisgKiB0byBsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgaXQgdG8gYW55b25lIGVsc2UgZXhjZXB0IGFzIHBhcnQgb2YgYSBwcm9kdWN0IG9yCisgKiBwcm9ncmFtIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKyAqIAorICogU1VOIFJQQyBJUyBQUk9WSURFRCBBUyBJUyBXSVRIIE5PIFdBUlJBTlRJRVMgT0YgQU5ZIEtJTkQgSU5DTFVESU5HIFRIRQorICogV0FSUkFOVElFUyBPRiBERVNJR04sIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFLCBPUiBBUklTSU5HIEZST00gQSBDT1VSU0UgT0YgREVBTElORywgVVNBR0UgT1IgVFJBREUgUFJBQ1RJQ0UuCisgKiAKKyAqIFN1biBSUEMgaXMgcHJvdmlkZWQgd2l0aCBubyBzdXBwb3J0IGFuZCB3aXRob3V0IGFueSBvYmxpZ2F0aW9uIG9uIHRoZQorICogcGFydCBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIHRvIGFzc2lzdCBpbiBpdHMgdXNlLCBjb3JyZWN0aW9uLAorICogbW9kaWZpY2F0aW9uIG9yIGVuaGFuY2VtZW50LgorICogCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuIFNIQUxMIEhBVkUgTk8gTElBQklMSVRZIFdJVEggUkVTUEVDVCBUTyBUSEUKKyAqIElORlJJTkdFTUVOVCBPRiBDT1BZUklHSFRTLCBUUkFERSBTRUNSRVRTIE9SIEFOWSBQQVRFTlRTIEJZIFNVTiBSUEMKKyAqIE9SIEFOWSBQQVJUIFRIRVJFT0YuCisgKiAKKyAqIEluIG5vIGV2ZW50IHdpbGwgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBiZSBsaWFibGUgZm9yIGFueSBsb3N0IHJldmVudWUKKyAqIG9yIHByb2ZpdHMgb3Igb3RoZXIgc3BlY2lhbCwgaW5kaXJlY3QgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgZXZlbiBpZgorICogU3VuIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqIAorICogU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICogMjU1MCBHYXJjaWEgQXZlbnVlCisgKiBNb3VudGFpbiBWaWV3LCBDYWxpZm9ybmlhICA5NDA0MworICovCisvKgorICogR2VuZXJpYyBERVMgZHJpdmVyIGludGVyZmFjZQorICogS2VlcCB0aGlzIGZpbGUgaGFyZHdhcmUgaW5kZXBlbmRlbnQhCisgKiBDb3B5cmlnaHQgKGMpIDE5ODYgYnkgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLgorICovCisKKyNkZWZpbmUgREVTX01BWExFTiAJNjU1MzYJLyogbWF4aW11bSAjIG9mIGJ5dGVzIHRvIGVuY3J5cHQgICovCisjZGVmaW5lIERFU19RVUlDS0xFTgkxNgkvKiBtYXhpbXVtICMgb2YgYnl0ZXMgdG8gZW5jcnlwdCBxdWlja2x5ICovCisKKyNpZmRlZiBIRUFERVJfREVTX0gKKyN1bmRlZiBFTkNSWVBUCisjdW5kZWYgREVDUllQVAorI2VuZGlmCisKK2VudW0gZGVzZGlyIHsgRU5DUllQVCwgREVDUllQVCB9OworZW51bSBkZXNtb2RlIHsgQ0JDLCBFQ0IgfTsKKworLyoKKyAqIHBhcmFtZXRlcnMgdG8gaW9jdGwgY2FsbAorICovCitzdHJ1Y3QgZGVzcGFyYW1zIHsKKwl1bnNpZ25lZCBjaGFyIGRlc19rZXlbOF07CS8qIGtleSAod2l0aCBsb3cgYml0IHBhcml0eSkgKi8KKwllbnVtIGRlc2RpciBkZXNfZGlyOwkvKiBkaXJlY3Rpb24gKi8KKwllbnVtIGRlc21vZGUgZGVzX21vZGU7CS8qIG1vZGUgKi8KKwl1bnNpZ25lZCBjaGFyIGRlc19pdmVjWzhdOwkvKiBpbnB1dCB2ZWN0b3IgKi8KKwl1bnNpZ25lZCBkZXNfbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gY3J5cHQgKi8KKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIgVURFU19kYXRhW0RFU19RVUlDS0xFTl07CisJCXVuc2lnbmVkIGNoYXIgKlVERVNfYnVmOworCX0gVURFUzsKKyMJZGVmaW5lIGRlc19kYXRhIFVERVMuVURFU19kYXRhCS8qIGRpcmVjdCBkYXRhIGhlcmUgaWYgcXVpY2sgKi8KKyMJZGVmaW5lIGRlc19idWYJVURFUy5VREVTX2J1ZgkvKiBvdGhlcndpc2UsIHBvaW50ZXIgdG8gZGF0YSAqLworfTsKKworLyoKKyAqIEVuY3J5cHQgYW4gYXJiaXRyYXJ5IHNpemVkIGJ1ZmZlcgorICovCisjZGVmaW5lCURFU0lPQ0JMT0NLCV9JT1dSKCdkJywgNiwgc3RydWN0IGRlc3BhcmFtcykKKworLyogCisgKiBFbmNyeXB0IG9mIHNtYWxsIGFtb3VudCBvZiBkYXRhLCBxdWlja2x5CisgKi8KKyNkZWZpbmUgREVTSU9DUVVJQ0sJX0lPV1IoJ2QnLCA3LCBzdHJ1Y3QgZGVzcGFyYW1zKSAKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9ycGNfZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3JwY19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTM3ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9ycGNfZW5jLmMKQEAgLTAsMCArMSw5OCBAQAorLyogY3J5cHRvL2Rlcy9ycGNfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgInJwY19kZXMuaCIKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorI2luY2x1ZGUgImRlc192ZXIuaCIKKworaW50IF9kZXNfY3J5cHQoY2hhciAqYnVmLGludCBsZW4sc3RydWN0IGRlc3BhcmFtcyAqZGVzcCk7CitpbnQgX2Rlc19jcnlwdChjaGFyICpidWYsIGludCBsZW4sIHN0cnVjdCBkZXNwYXJhbXMgKmRlc3ApCisJeworCURFU19rZXlfc2NoZWR1bGUga3M7CisJaW50IGVuYzsKKworCURFU19zZXRfa2V5X3VuY2hlY2tlZCgmZGVzcC0+ZGVzX2tleSwma3MpOworCWVuYz0oZGVzcC0+ZGVzX2RpciA9PSBFTkNSWVBUKT9ERVNfRU5DUllQVDpERVNfREVDUllQVDsKKworCWlmIChkZXNwLT5kZXNfbW9kZSA9PSBDQkMpCisJCURFU19lY2JfZW5jcnlwdCgoY29uc3RfREVTX2NibG9jayAqKWRlc3AtPlVERVMuVURFU19idWYsCisJCQkJKERFU19jYmxvY2sgKilkZXNwLT5VREVTLlVERVNfYnVmLCZrcywKKwkJCQllbmMpOworCWVsc2UKKwkJeworCQlERVNfbmNiY19lbmNyeXB0KGRlc3AtPlVERVMuVURFU19idWYsZGVzcC0+VURFUy5VREVTX2J1ZiwKKwkJCQlsZW4sJmtzLCZkZXNwLT5kZXNfaXZlYyxlbmMpOworI2lmZGVmIHVuZGVmCisJCS8qIGxlbiB3aWxsIGFsd2F5cyBiZSAlOCBpZiBjYWxsZWQgZnJvbSBjb21tb25fY3J5cHQKKwkJICogaW4gc2VjdXJlX3JwYy4KKwkJICogTGliZGVzJ3MgY2JjIGVuY3J5cHQgZG9lcyBub3QgY29weSBiYWNrIHRoZSBpdiwKKwkJICogc28gd2UgaGF2ZSB0byBkbyBpdCBoZXJlLiAqLworCQkvKiBJdCBkb2VzIG5vdyA6LSkgZWF5IDIwLzA5Lzk1ICovCisKKwkJYT0oY2hhciAqKSYoZGVzcC0+VURFUy5VREVTX2J1ZltsZW4tOF0pOworCQliPShjaGFyICopJihkZXNwLT5kZXNfaXZlY1swXSk7CisKKwkJKihhKyspPSAqKGIrKyk7ICooYSsrKT0gKihiKyspOworCQkqKGErKyk9ICooYisrKTsgKihhKyspPSAqKGIrKyk7CisJCSooYSsrKT0gKihiKyspOyAqKGErKyk9ICooYisrKTsKKwkJKihhKyspPSAqKGIrKyk7ICooYSsrKT0gKihiKyspOworI2VuZGlmCisJCX0KKwlyZXR1cm4oMSk7CQorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9ycHcuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvcnB3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5NDczYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvcnB3LmMKQEAgLTAsMCArMSw5OSBAQAorLyogY3J5cHRvL2Rlcy9ycHcuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorCXsKKwlERVNfY2Jsb2NrIGssazE7CisJaW50IGk7CisKKwlwcmludGYoInJlYWQgcGFzc3dkXG4iKTsKKwlpZiAoKGk9ZGVzX3JlYWRfcGFzc3dvcmQoJmssIkVudGVyIHBhc3N3b3JkOiIsMCkpID09IDApCisJCXsKKwkJcHJpbnRmKCJwYXNzd29yZCA9ICIpOworCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCQlwcmludGYoIiUwMnggIixrW2ldKTsKKwkJfQorCWVsc2UKKwkJcHJpbnRmKCJlcnJvciAlZFxuIixpKTsKKwlwcmludGYoIlxuIik7CisJcHJpbnRmKCJyZWFkIDJwYXNzd2RzIGFuZCB2ZXJpZnlcbiIpOworCWlmICgoaT1kZXNfcmVhZF8ycGFzc3dvcmRzKCZrLCZrMSwKKwkJIkVudGVyIHZlcmlmaWVkIHBhc3N3b3JkOiIsMSkpID09IDApCisJCXsKKwkJcHJpbnRmKCJwYXNzd29yZDEgPSAiKTsKKwkJZm9yIChpPTA7IGk8ODsgaSsrKQorCQkJcHJpbnRmKCIlMDJ4ICIsa1tpXSk7CisJCXByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCJwYXNzd29yZDIgPSAiKTsKKwkJZm9yIChpPTA7IGk8ODsgaSsrKQorCQkJcHJpbnRmKCIlMDJ4ICIsazFbaV0pOworCQlwcmludGYoIlxuIik7CisJCWV4aXQoMSk7CisJCX0KKwllbHNlCisJCXsKKwkJcHJpbnRmKCJlcnJvciAlZFxuIixpKTsKKwkJZXhpdCgwKTsKKwkJfQorI2lmZGVmIExJTlQKKwlyZXR1cm4oMCk7CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3NldF9rZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvc2V0X2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMDRjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3NldF9rZXkuYwpAQCAtMCwwICsxLDQwNyBAQAorLyogY3J5cHRvL2Rlcy9zZXRfa2V5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogc2V0X2tleS5jIHYgMS40IGVheSAyNC85LzkxCisgKiAxLjQgU3BlZWQgdXAgYnkgNDAwJSA6LSkKKyAqIDEuMyBhZGRlZCByZWdpc3RlciBkZWNsYXJhdGlvbnMuCisgKiAxLjIgdW5yb2xsZWQgbWFrZV9rZXlfc2NoZWQgYSBiaXQgbW9yZQorICogMS4xIGFkZGVkIG5vcm1fZXhwYW5kX2JpdHMKKyAqIDEuMCBGaXJzdCB3b3JraW5nIHZlcnNpb24KKyAqLworI2luY2x1ZGUgImRlc19sb2NsLmgiCisKK09QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTChpbnQsREVTX2NoZWNrX2tleSwwKQkvKiBkZWZhdWx0cyB0byBmYWxzZSAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvZGRfcGFyaXR5WzI1Nl09eworICAxLCAgMSwgIDIsICAyLCAgNCwgIDQsICA3LCAgNywgIDgsICA4LCAxMSwgMTEsIDEzLCAxMywgMTQsIDE0LAorIDE2LCAxNiwgMTksIDE5LCAyMSwgMjEsIDIyLCAyMiwgMjUsIDI1LCAyNiwgMjYsIDI4LCAyOCwgMzEsIDMxLAorIDMyLCAzMiwgMzUsIDM1LCAzNywgMzcsIDM4LCAzOCwgNDEsIDQxLCA0MiwgNDIsIDQ0LCA0NCwgNDcsIDQ3LAorIDQ5LCA0OSwgNTAsIDUwLCA1MiwgNTIsIDU1LCA1NSwgNTYsIDU2LCA1OSwgNTksIDYxLCA2MSwgNjIsIDYyLAorIDY0LCA2NCwgNjcsIDY3LCA2OSwgNjksIDcwLCA3MCwgNzMsIDczLCA3NCwgNzQsIDc2LCA3NiwgNzksIDc5LAorIDgxLCA4MSwgODIsIDgyLCA4NCwgODQsIDg3LCA4NywgODgsIDg4LCA5MSwgOTEsIDkzLCA5MywgOTQsIDk0LAorIDk3LCA5NywgOTgsIDk4LDEwMCwxMDAsMTAzLDEwMywxMDQsMTA0LDEwNywxMDcsMTA5LDEwOSwxMTAsMTEwLAorMTEyLDExMiwxMTUsMTE1LDExNywxMTcsMTE4LDExOCwxMjEsMTIxLDEyMiwxMjIsMTI0LDEyNCwxMjcsMTI3LAorMTI4LDEyOCwxMzEsMTMxLDEzMywxMzMsMTM0LDEzNCwxMzcsMTM3LDEzOCwxMzgsMTQwLDE0MCwxNDMsMTQzLAorMTQ1LDE0NSwxNDYsMTQ2LDE0OCwxNDgsMTUxLDE1MSwxNTIsMTUyLDE1NSwxNTUsMTU3LDE1NywxNTgsMTU4LAorMTYxLDE2MSwxNjIsMTYyLDE2NCwxNjQsMTY3LDE2NywxNjgsMTY4LDE3MSwxNzEsMTczLDE3MywxNzQsMTc0LAorMTc2LDE3NiwxNzksMTc5LDE4MSwxODEsMTgyLDE4MiwxODUsMTg1LDE4NiwxODYsMTg4LDE4OCwxOTEsMTkxLAorMTkzLDE5MywxOTQsMTk0LDE5NiwxOTYsMTk5LDE5OSwyMDAsMjAwLDIwMywyMDMsMjA1LDIwNSwyMDYsMjA2LAorMjA4LDIwOCwyMTEsMjExLDIxMywyMTMsMjE0LDIxNCwyMTcsMjE3LDIxOCwyMTgsMjIwLDIyMCwyMjMsMjIzLAorMjI0LDIyNCwyMjcsMjI3LDIyOSwyMjksMjMwLDIzMCwyMzMsMjMzLDIzNCwyMzQsMjM2LDIzNiwyMzksMjM5LAorMjQxLDI0MSwyNDIsMjQyLDI0NCwyNDQsMjQ3LDI0NywyNDgsMjQ4LDI1MSwyNTEsMjUzLDI1MywyNTQsMjU0fTsKKwordm9pZCBERVNfc2V0X29kZF9wYXJpdHkoREVTX2NibG9jayAqa2V5KQorCXsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaT0wOyBpPERFU19LRVlfU1o7IGkrKykKKwkJKCprZXkpW2ldPW9kZF9wYXJpdHlbKCprZXkpW2ldXTsKKwl9CisKK2ludCBERVNfY2hlY2tfa2V5X3Bhcml0eShjb25zdF9ERVNfY2Jsb2NrICprZXkpCisJeworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpPTA7IGk8REVTX0tFWV9TWjsgaSsrKQorCQl7CisJCWlmICgoKmtleSlbaV0gIT0gb2RkX3Bhcml0eVsoKmtleSlbaV1dKQorCQkJcmV0dXJuKDApOworCQl9CisJcmV0dXJuKDEpOworCX0KKworLyogV2VhayBhbmQgc2VtaSB3ZWVrIGtleXMgYXMgdGFrZSBmcm9tCisgKiAlQSBELlcuIERhdmllcworICogJUEgVy5MLiBQcmljZQorICogJVQgU2VjdXJpdHkgZm9yIENvbXB1dGVyIE5ldHdvcmtzCisgKiAlSSBKb2huIFdpbGV5ICYgU29ucworICogJUQgMTk4NAorICogTWFueSB0aGFua3MgdG8gc21iQHVseXNzZXMuYXR0LmNvbSAoU3RldmVuIEJlbGxvdmluKSBmb3IgdGhlIHJlZmVyZW5jZQorICogKGFuZCBhY3R1YWwgY2Jsb2NrIHZhbHVlcykuCisgKi8KKyNkZWZpbmUgTlVNX1dFQUtfS0VZCTE2CitzdGF0aWMgY29uc3QgREVTX2NibG9jayB3ZWFrX2tleXNbTlVNX1dFQUtfS0VZXT17CisJLyogd2VhayBrZXlzICovCisJezB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMX0sCisJezB4RkUsMHhGRSwweEZFLDB4RkUsMHhGRSwweEZFLDB4RkUsMHhGRX0sCisJezB4MUYsMHgxRiwweDFGLDB4MUYsMHgwRSwweDBFLDB4MEUsMHgwRX0sCisJezB4RTAsMHhFMCwweEUwLDB4RTAsMHhGMSwweEYxLDB4RjEsMHhGMX0sCisJLyogc2VtaS13ZWFrIGtleXMgKi8KKwl7MHgwMSwweEZFLDB4MDEsMHhGRSwweDAxLDB4RkUsMHgwMSwweEZFfSwKKwl7MHhGRSwweDAxLDB4RkUsMHgwMSwweEZFLDB4MDEsMHhGRSwweDAxfSwKKwl7MHgxRiwweEUwLDB4MUYsMHhFMCwweDBFLDB4RjEsMHgwRSwweEYxfSwKKwl7MHhFMCwweDFGLDB4RTAsMHgxRiwweEYxLDB4MEUsMHhGMSwweDBFfSwKKwl7MHgwMSwweEUwLDB4MDEsMHhFMCwweDAxLDB4RjEsMHgwMSwweEYxfSwKKwl7MHhFMCwweDAxLDB4RTAsMHgwMSwweEYxLDB4MDEsMHhGMSwweDAxfSwKKwl7MHgxRiwweEZFLDB4MUYsMHhGRSwweDBFLDB4RkUsMHgwRSwweEZFfSwKKwl7MHhGRSwweDFGLDB4RkUsMHgxRiwweEZFLDB4MEUsMHhGRSwweDBFfSwKKwl7MHgwMSwweDFGLDB4MDEsMHgxRiwweDAxLDB4MEUsMHgwMSwweDBFfSwKKwl7MHgxRiwweDAxLDB4MUYsMHgwMSwweDBFLDB4MDEsMHgwRSwweDAxfSwKKwl7MHhFMCwweEZFLDB4RTAsMHhGRSwweEYxLDB4RkUsMHhGMSwweEZFfSwKKwl7MHhGRSwweEUwLDB4RkUsMHhFMCwweEZFLDB4RjEsMHhGRSwweEYxfX07CisKK2ludCBERVNfaXNfd2Vha19rZXkoY29uc3RfREVTX2NibG9jayAqa2V5KQorCXsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPE5VTV9XRUFLX0tFWTsgaSsrKQorCQkvKiBBZGRlZCA9PSAwIHRvIGNvbXBhcmlzb24sIEkgb2J2aW91c2x5IGRvbid0IHJ1bgorCQkgKiB0aGlzIHNlY3Rpb24gdmVyeSBvZnRlbiA6LSgsIHRoYW5rcyB0bworCQkgKiBlbmdpbmVlcmluZ0BNb3JuaW5nU3Rhci5Db20gZm9yIHRoZSBmaXgKKwkJICogZWF5IDkzLzA2LzI5CisJCSAqIEFub3RoZXIgcHJvYmxlbSwgSSB3YXMgY29tcGFyaW5nIG9ubHkgdGhlIGZpcnN0IDQKKwkJICogYnl0ZXMsIDk3LzAzLzE4ICovCisJCWlmIChtZW1jbXAod2Vha19rZXlzW2ldLGtleSxzaXplb2YoREVTX2NibG9jaykpID09IDApIHJldHVybigxKTsKKwlyZXR1cm4oMCk7CisJfQorCisvKiBOT1cgREVGSU5FRCBJTiBkZXNfbG9jYWwuaAorICogU2VlIGVjYl9lbmNyeXB0LmMgZm9yIGEgcHNldWRvIGRlc2NyaXB0aW9uIG9mIHRoZXNlIG1hY3Jvcy4gCisgKiAjZGVmaW5lIFBFUk1fT1AoYSxiLHQsbixtKSAoKHQpPSgoKChhKT4+KG4pKV4oYikpJihtKSksXAorICogCShiKV49KHQpLFwKKyAqIAkoYSk9KChhKV4oKHQpPDwobikpKSkKKyAqLworCisjZGVmaW5lIEhQRVJNX09QKGEsdCxuLG0pICgodCk9KCgoKGEpPDwoMTYtKG4pKSleKGEpKSYobSkpLFwKKwkoYSk9KGEpXih0KV4odD4+KDE2LShuKSkpKQorCitzdGF0aWMgY29uc3QgREVTX0xPTkcgZGVzX3NrYls4XVs2NF09eworCXsKKwkvKiBmb3IgQyBiaXRzIChudW1iZXJlZCBhcyBwZXIgRklQUyA0NikgMSAyIDMgNCA1IDYgKi8KKwkweDAwMDAwMDAwTCwweDAwMDAwMDEwTCwweDIwMDAwMDAwTCwweDIwMDAwMDEwTCwKKwkweDAwMDEwMDAwTCwweDAwMDEwMDEwTCwweDIwMDEwMDAwTCwweDIwMDEwMDEwTCwKKwkweDAwMDAwODAwTCwweDAwMDAwODEwTCwweDIwMDAwODAwTCwweDIwMDAwODEwTCwKKwkweDAwMDEwODAwTCwweDAwMDEwODEwTCwweDIwMDEwODAwTCwweDIwMDEwODEwTCwKKwkweDAwMDAwMDIwTCwweDAwMDAwMDMwTCwweDIwMDAwMDIwTCwweDIwMDAwMDMwTCwKKwkweDAwMDEwMDIwTCwweDAwMDEwMDMwTCwweDIwMDEwMDIwTCwweDIwMDEwMDMwTCwKKwkweDAwMDAwODIwTCwweDAwMDAwODMwTCwweDIwMDAwODIwTCwweDIwMDAwODMwTCwKKwkweDAwMDEwODIwTCwweDAwMDEwODMwTCwweDIwMDEwODIwTCwweDIwMDEwODMwTCwKKwkweDAwMDgwMDAwTCwweDAwMDgwMDEwTCwweDIwMDgwMDAwTCwweDIwMDgwMDEwTCwKKwkweDAwMDkwMDAwTCwweDAwMDkwMDEwTCwweDIwMDkwMDAwTCwweDIwMDkwMDEwTCwKKwkweDAwMDgwODAwTCwweDAwMDgwODEwTCwweDIwMDgwODAwTCwweDIwMDgwODEwTCwKKwkweDAwMDkwODAwTCwweDAwMDkwODEwTCwweDIwMDkwODAwTCwweDIwMDkwODEwTCwKKwkweDAwMDgwMDIwTCwweDAwMDgwMDMwTCwweDIwMDgwMDIwTCwweDIwMDgwMDMwTCwKKwkweDAwMDkwMDIwTCwweDAwMDkwMDMwTCwweDIwMDkwMDIwTCwweDIwMDkwMDMwTCwKKwkweDAwMDgwODIwTCwweDAwMDgwODMwTCwweDIwMDgwODIwTCwweDIwMDgwODMwTCwKKwkweDAwMDkwODIwTCwweDAwMDkwODMwTCwweDIwMDkwODIwTCwweDIwMDkwODMwTCwKKwl9LHsKKwkvKiBmb3IgQyBiaXRzIChudW1iZXJlZCBhcyBwZXIgRklQUyA0NikgNyA4IDEwIDExIDEyIDEzICovCisJMHgwMDAwMDAwMEwsMHgwMjAwMDAwMEwsMHgwMDAwMjAwMEwsMHgwMjAwMjAwMEwsCisJMHgwMDIwMDAwMEwsMHgwMjIwMDAwMEwsMHgwMDIwMjAwMEwsMHgwMjIwMjAwMEwsCisJMHgwMDAwMDAwNEwsMHgwMjAwMDAwNEwsMHgwMDAwMjAwNEwsMHgwMjAwMjAwNEwsCisJMHgwMDIwMDAwNEwsMHgwMjIwMDAwNEwsMHgwMDIwMjAwNEwsMHgwMjIwMjAwNEwsCisJMHgwMDAwMDQwMEwsMHgwMjAwMDQwMEwsMHgwMDAwMjQwMEwsMHgwMjAwMjQwMEwsCisJMHgwMDIwMDQwMEwsMHgwMjIwMDQwMEwsMHgwMDIwMjQwMEwsMHgwMjIwMjQwMEwsCisJMHgwMDAwMDQwNEwsMHgwMjAwMDQwNEwsMHgwMDAwMjQwNEwsMHgwMjAwMjQwNEwsCisJMHgwMDIwMDQwNEwsMHgwMjIwMDQwNEwsMHgwMDIwMjQwNEwsMHgwMjIwMjQwNEwsCisJMHgxMDAwMDAwMEwsMHgxMjAwMDAwMEwsMHgxMDAwMjAwMEwsMHgxMjAwMjAwMEwsCisJMHgxMDIwMDAwMEwsMHgxMjIwMDAwMEwsMHgxMDIwMjAwMEwsMHgxMjIwMjAwMEwsCisJMHgxMDAwMDAwNEwsMHgxMjAwMDAwNEwsMHgxMDAwMjAwNEwsMHgxMjAwMjAwNEwsCisJMHgxMDIwMDAwNEwsMHgxMjIwMDAwNEwsMHgxMDIwMjAwNEwsMHgxMjIwMjAwNEwsCisJMHgxMDAwMDQwMEwsMHgxMjAwMDQwMEwsMHgxMDAwMjQwMEwsMHgxMjAwMjQwMEwsCisJMHgxMDIwMDQwMEwsMHgxMjIwMDQwMEwsMHgxMDIwMjQwMEwsMHgxMjIwMjQwMEwsCisJMHgxMDAwMDQwNEwsMHgxMjAwMDQwNEwsMHgxMDAwMjQwNEwsMHgxMjAwMjQwNEwsCisJMHgxMDIwMDQwNEwsMHgxMjIwMDQwNEwsMHgxMDIwMjQwNEwsMHgxMjIwMjQwNEwsCisJfSx7CisJLyogZm9yIEMgYml0cyAobnVtYmVyZWQgYXMgcGVyIEZJUFMgNDYpIDE0IDE1IDE2IDE3IDE5IDIwICovCisJMHgwMDAwMDAwMEwsMHgwMDAwMDAwMUwsMHgwMDA0MDAwMEwsMHgwMDA0MDAwMUwsCisJMHgwMTAwMDAwMEwsMHgwMTAwMDAwMUwsMHgwMTA0MDAwMEwsMHgwMTA0MDAwMUwsCisJMHgwMDAwMDAwMkwsMHgwMDAwMDAwM0wsMHgwMDA0MDAwMkwsMHgwMDA0MDAwM0wsCisJMHgwMTAwMDAwMkwsMHgwMTAwMDAwM0wsMHgwMTA0MDAwMkwsMHgwMTA0MDAwM0wsCisJMHgwMDAwMDIwMEwsMHgwMDAwMDIwMUwsMHgwMDA0MDIwMEwsMHgwMDA0MDIwMUwsCisJMHgwMTAwMDIwMEwsMHgwMTAwMDIwMUwsMHgwMTA0MDIwMEwsMHgwMTA0MDIwMUwsCisJMHgwMDAwMDIwMkwsMHgwMDAwMDIwM0wsMHgwMDA0MDIwMkwsMHgwMDA0MDIwM0wsCisJMHgwMTAwMDIwMkwsMHgwMTAwMDIwM0wsMHgwMTA0MDIwMkwsMHgwMTA0MDIwM0wsCisJMHgwODAwMDAwMEwsMHgwODAwMDAwMUwsMHgwODA0MDAwMEwsMHgwODA0MDAwMUwsCisJMHgwOTAwMDAwMEwsMHgwOTAwMDAwMUwsMHgwOTA0MDAwMEwsMHgwOTA0MDAwMUwsCisJMHgwODAwMDAwMkwsMHgwODAwMDAwM0wsMHgwODA0MDAwMkwsMHgwODA0MDAwM0wsCisJMHgwOTAwMDAwMkwsMHgwOTAwMDAwM0wsMHgwOTA0MDAwMkwsMHgwOTA0MDAwM0wsCisJMHgwODAwMDIwMEwsMHgwODAwMDIwMUwsMHgwODA0MDIwMEwsMHgwODA0MDIwMUwsCisJMHgwOTAwMDIwMEwsMHgwOTAwMDIwMUwsMHgwOTA0MDIwMEwsMHgwOTA0MDIwMUwsCisJMHgwODAwMDIwMkwsMHgwODAwMDIwM0wsMHgwODA0MDIwMkwsMHgwODA0MDIwM0wsCisJMHgwOTAwMDIwMkwsMHgwOTAwMDIwM0wsMHgwOTA0MDIwMkwsMHgwOTA0MDIwM0wsCisJfSx7CisJLyogZm9yIEMgYml0cyAobnVtYmVyZWQgYXMgcGVyIEZJUFMgNDYpIDIxIDIzIDI0IDI2IDI3IDI4ICovCisJMHgwMDAwMDAwMEwsMHgwMDEwMDAwMEwsMHgwMDAwMDEwMEwsMHgwMDEwMDEwMEwsCisJMHgwMDAwMDAwOEwsMHgwMDEwMDAwOEwsMHgwMDAwMDEwOEwsMHgwMDEwMDEwOEwsCisJMHgwMDAwMTAwMEwsMHgwMDEwMTAwMEwsMHgwMDAwMTEwMEwsMHgwMDEwMTEwMEwsCisJMHgwMDAwMTAwOEwsMHgwMDEwMTAwOEwsMHgwMDAwMTEwOEwsMHgwMDEwMTEwOEwsCisJMHgwNDAwMDAwMEwsMHgwNDEwMDAwMEwsMHgwNDAwMDEwMEwsMHgwNDEwMDEwMEwsCisJMHgwNDAwMDAwOEwsMHgwNDEwMDAwOEwsMHgwNDAwMDEwOEwsMHgwNDEwMDEwOEwsCisJMHgwNDAwMTAwMEwsMHgwNDEwMTAwMEwsMHgwNDAwMTEwMEwsMHgwNDEwMTEwMEwsCisJMHgwNDAwMTAwOEwsMHgwNDEwMTAwOEwsMHgwNDAwMTEwOEwsMHgwNDEwMTEwOEwsCisJMHgwMDAyMDAwMEwsMHgwMDEyMDAwMEwsMHgwMDAyMDEwMEwsMHgwMDEyMDEwMEwsCisJMHgwMDAyMDAwOEwsMHgwMDEyMDAwOEwsMHgwMDAyMDEwOEwsMHgwMDEyMDEwOEwsCisJMHgwMDAyMTAwMEwsMHgwMDEyMTAwMEwsMHgwMDAyMTEwMEwsMHgwMDEyMTEwMEwsCisJMHgwMDAyMTAwOEwsMHgwMDEyMTAwOEwsMHgwMDAyMTEwOEwsMHgwMDEyMTEwOEwsCisJMHgwNDAyMDAwMEwsMHgwNDEyMDAwMEwsMHgwNDAyMDEwMEwsMHgwNDEyMDEwMEwsCisJMHgwNDAyMDAwOEwsMHgwNDEyMDAwOEwsMHgwNDAyMDEwOEwsMHgwNDEyMDEwOEwsCisJMHgwNDAyMTAwMEwsMHgwNDEyMTAwMEwsMHgwNDAyMTEwMEwsMHgwNDEyMTEwMEwsCisJMHgwNDAyMTAwOEwsMHgwNDEyMTAwOEwsMHgwNDAyMTEwOEwsMHgwNDEyMTEwOEwsCisJfSx7CisJLyogZm9yIEQgYml0cyAobnVtYmVyZWQgYXMgcGVyIEZJUFMgNDYpIDEgMiAzIDQgNSA2ICovCisJMHgwMDAwMDAwMEwsMHgxMDAwMDAwMEwsMHgwMDAxMDAwMEwsMHgxMDAxMDAwMEwsCisJMHgwMDAwMDAwNEwsMHgxMDAwMDAwNEwsMHgwMDAxMDAwNEwsMHgxMDAxMDAwNEwsCisJMHgyMDAwMDAwMEwsMHgzMDAwMDAwMEwsMHgyMDAxMDAwMEwsMHgzMDAxMDAwMEwsCisJMHgyMDAwMDAwNEwsMHgzMDAwMDAwNEwsMHgyMDAxMDAwNEwsMHgzMDAxMDAwNEwsCisJMHgwMDEwMDAwMEwsMHgxMDEwMDAwMEwsMHgwMDExMDAwMEwsMHgxMDExMDAwMEwsCisJMHgwMDEwMDAwNEwsMHgxMDEwMDAwNEwsMHgwMDExMDAwNEwsMHgxMDExMDAwNEwsCisJMHgyMDEwMDAwMEwsMHgzMDEwMDAwMEwsMHgyMDExMDAwMEwsMHgzMDExMDAwMEwsCisJMHgyMDEwMDAwNEwsMHgzMDEwMDAwNEwsMHgyMDExMDAwNEwsMHgzMDExMDAwNEwsCisJMHgwMDAwMTAwMEwsMHgxMDAwMTAwMEwsMHgwMDAxMTAwMEwsMHgxMDAxMTAwMEwsCisJMHgwMDAwMTAwNEwsMHgxMDAwMTAwNEwsMHgwMDAxMTAwNEwsMHgxMDAxMTAwNEwsCisJMHgyMDAwMTAwMEwsMHgzMDAwMTAwMEwsMHgyMDAxMTAwMEwsMHgzMDAxMTAwMEwsCisJMHgyMDAwMTAwNEwsMHgzMDAwMTAwNEwsMHgyMDAxMTAwNEwsMHgzMDAxMTAwNEwsCisJMHgwMDEwMTAwMEwsMHgxMDEwMTAwMEwsMHgwMDExMTAwMEwsMHgxMDExMTAwMEwsCisJMHgwMDEwMTAwNEwsMHgxMDEwMTAwNEwsMHgwMDExMTAwNEwsMHgxMDExMTAwNEwsCisJMHgyMDEwMTAwMEwsMHgzMDEwMTAwMEwsMHgyMDExMTAwMEwsMHgzMDExMTAwMEwsCisJMHgyMDEwMTAwNEwsMHgzMDEwMTAwNEwsMHgyMDExMTAwNEwsMHgzMDExMTAwNEwsCisJfSx7CisJLyogZm9yIEQgYml0cyAobnVtYmVyZWQgYXMgcGVyIEZJUFMgNDYpIDggOSAxMSAxMiAxMyAxNCAqLworCTB4MDAwMDAwMDBMLDB4MDgwMDAwMDBMLDB4MDAwMDAwMDhMLDB4MDgwMDAwMDhMLAorCTB4MDAwMDA0MDBMLDB4MDgwMDA0MDBMLDB4MDAwMDA0MDhMLDB4MDgwMDA0MDhMLAorCTB4MDAwMjAwMDBMLDB4MDgwMjAwMDBMLDB4MDAwMjAwMDhMLDB4MDgwMjAwMDhMLAorCTB4MDAwMjA0MDBMLDB4MDgwMjA0MDBMLDB4MDAwMjA0MDhMLDB4MDgwMjA0MDhMLAorCTB4MDAwMDAwMDFMLDB4MDgwMDAwMDFMLDB4MDAwMDAwMDlMLDB4MDgwMDAwMDlMLAorCTB4MDAwMDA0MDFMLDB4MDgwMDA0MDFMLDB4MDAwMDA0MDlMLDB4MDgwMDA0MDlMLAorCTB4MDAwMjAwMDFMLDB4MDgwMjAwMDFMLDB4MDAwMjAwMDlMLDB4MDgwMjAwMDlMLAorCTB4MDAwMjA0MDFMLDB4MDgwMjA0MDFMLDB4MDAwMjA0MDlMLDB4MDgwMjA0MDlMLAorCTB4MDIwMDAwMDBMLDB4MEEwMDAwMDBMLDB4MDIwMDAwMDhMLDB4MEEwMDAwMDhMLAorCTB4MDIwMDA0MDBMLDB4MEEwMDA0MDBMLDB4MDIwMDA0MDhMLDB4MEEwMDA0MDhMLAorCTB4MDIwMjAwMDBMLDB4MEEwMjAwMDBMLDB4MDIwMjAwMDhMLDB4MEEwMjAwMDhMLAorCTB4MDIwMjA0MDBMLDB4MEEwMjA0MDBMLDB4MDIwMjA0MDhMLDB4MEEwMjA0MDhMLAorCTB4MDIwMDAwMDFMLDB4MEEwMDAwMDFMLDB4MDIwMDAwMDlMLDB4MEEwMDAwMDlMLAorCTB4MDIwMDA0MDFMLDB4MEEwMDA0MDFMLDB4MDIwMDA0MDlMLDB4MEEwMDA0MDlMLAorCTB4MDIwMjAwMDFMLDB4MEEwMjAwMDFMLDB4MDIwMjAwMDlMLDB4MEEwMjAwMDlMLAorCTB4MDIwMjA0MDFMLDB4MEEwMjA0MDFMLDB4MDIwMjA0MDlMLDB4MEEwMjA0MDlMLAorCX0seworCS8qIGZvciBEIGJpdHMgKG51bWJlcmVkIGFzIHBlciBGSVBTIDQ2KSAxNiAxNyAxOCAxOSAyMCAyMSAqLworCTB4MDAwMDAwMDBMLDB4MDAwMDAxMDBMLDB4MDAwODAwMDBMLDB4MDAwODAxMDBMLAorCTB4MDEwMDAwMDBMLDB4MDEwMDAxMDBMLDB4MDEwODAwMDBMLDB4MDEwODAxMDBMLAorCTB4MDAwMDAwMTBMLDB4MDAwMDAxMTBMLDB4MDAwODAwMTBMLDB4MDAwODAxMTBMLAorCTB4MDEwMDAwMTBMLDB4MDEwMDAxMTBMLDB4MDEwODAwMTBMLDB4MDEwODAxMTBMLAorCTB4MDAyMDAwMDBMLDB4MDAyMDAxMDBMLDB4MDAyODAwMDBMLDB4MDAyODAxMDBMLAorCTB4MDEyMDAwMDBMLDB4MDEyMDAxMDBMLDB4MDEyODAwMDBMLDB4MDEyODAxMDBMLAorCTB4MDAyMDAwMTBMLDB4MDAyMDAxMTBMLDB4MDAyODAwMTBMLDB4MDAyODAxMTBMLAorCTB4MDEyMDAwMTBMLDB4MDEyMDAxMTBMLDB4MDEyODAwMTBMLDB4MDEyODAxMTBMLAorCTB4MDAwMDAyMDBMLDB4MDAwMDAzMDBMLDB4MDAwODAyMDBMLDB4MDAwODAzMDBMLAorCTB4MDEwMDAyMDBMLDB4MDEwMDAzMDBMLDB4MDEwODAyMDBMLDB4MDEwODAzMDBMLAorCTB4MDAwMDAyMTBMLDB4MDAwMDAzMTBMLDB4MDAwODAyMTBMLDB4MDAwODAzMTBMLAorCTB4MDEwMDAyMTBMLDB4MDEwMDAzMTBMLDB4MDEwODAyMTBMLDB4MDEwODAzMTBMLAorCTB4MDAyMDAyMDBMLDB4MDAyMDAzMDBMLDB4MDAyODAyMDBMLDB4MDAyODAzMDBMLAorCTB4MDEyMDAyMDBMLDB4MDEyMDAzMDBMLDB4MDEyODAyMDBMLDB4MDEyODAzMDBMLAorCTB4MDAyMDAyMTBMLDB4MDAyMDAzMTBMLDB4MDAyODAyMTBMLDB4MDAyODAzMTBMLAorCTB4MDEyMDAyMTBMLDB4MDEyMDAzMTBMLDB4MDEyODAyMTBMLDB4MDEyODAzMTBMLAorCX0seworCS8qIGZvciBEIGJpdHMgKG51bWJlcmVkIGFzIHBlciBGSVBTIDQ2KSAyMiAyMyAyNCAyNSAyNyAyOCAqLworCTB4MDAwMDAwMDBMLDB4MDQwMDAwMDBMLDB4MDAwNDAwMDBMLDB4MDQwNDAwMDBMLAorCTB4MDAwMDAwMDJMLDB4MDQwMDAwMDJMLDB4MDAwNDAwMDJMLDB4MDQwNDAwMDJMLAorCTB4MDAwMDIwMDBMLDB4MDQwMDIwMDBMLDB4MDAwNDIwMDBMLDB4MDQwNDIwMDBMLAorCTB4MDAwMDIwMDJMLDB4MDQwMDIwMDJMLDB4MDAwNDIwMDJMLDB4MDQwNDIwMDJMLAorCTB4MDAwMDAwMjBMLDB4MDQwMDAwMjBMLDB4MDAwNDAwMjBMLDB4MDQwNDAwMjBMLAorCTB4MDAwMDAwMjJMLDB4MDQwMDAwMjJMLDB4MDAwNDAwMjJMLDB4MDQwNDAwMjJMLAorCTB4MDAwMDIwMjBMLDB4MDQwMDIwMjBMLDB4MDAwNDIwMjBMLDB4MDQwNDIwMjBMLAorCTB4MDAwMDIwMjJMLDB4MDQwMDIwMjJMLDB4MDAwNDIwMjJMLDB4MDQwNDIwMjJMLAorCTB4MDAwMDA4MDBMLDB4MDQwMDA4MDBMLDB4MDAwNDA4MDBMLDB4MDQwNDA4MDBMLAorCTB4MDAwMDA4MDJMLDB4MDQwMDA4MDJMLDB4MDAwNDA4MDJMLDB4MDQwNDA4MDJMLAorCTB4MDAwMDI4MDBMLDB4MDQwMDI4MDBMLDB4MDAwNDI4MDBMLDB4MDQwNDI4MDBMLAorCTB4MDAwMDI4MDJMLDB4MDQwMDI4MDJMLDB4MDAwNDI4MDJMLDB4MDQwNDI4MDJMLAorCTB4MDAwMDA4MjBMLDB4MDQwMDA4MjBMLDB4MDAwNDA4MjBMLDB4MDQwNDA4MjBMLAorCTB4MDAwMDA4MjJMLDB4MDQwMDA4MjJMLDB4MDAwNDA4MjJMLDB4MDQwNDA4MjJMLAorCTB4MDAwMDI4MjBMLDB4MDQwMDI4MjBMLDB4MDAwNDI4MjBMLDB4MDQwNDI4MjBMLAorCTB4MDAwMDI4MjJMLDB4MDQwMDI4MjJMLDB4MDAwNDI4MjJMLDB4MDQwNDI4MjJMLAorCX19OworCitpbnQgREVTX3NldF9rZXkoY29uc3RfREVTX2NibG9jayAqa2V5LCBERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSkKKwl7CisJaWYgKERFU19jaGVja19rZXkpCisJCXsKKwkJcmV0dXJuIERFU19zZXRfa2V5X2NoZWNrZWQoa2V5LCBzY2hlZHVsZSk7CisJCX0KKwllbHNlCisJCXsKKwkJREVTX3NldF9rZXlfdW5jaGVja2VkKGtleSwgc2NoZWR1bGUpOworCQlyZXR1cm4gMDsKKwkJfQorCX0KKworLyogcmV0dXJuIDAgaWYga2V5IHBhcml0eSBpcyBvZGQgKGNvcnJlY3QpLAorICogcmV0dXJuIC0xIGlmIGtleSBwYXJpdHkgZXJyb3IsCisgKiByZXR1cm4gLTIgaWYgaWxsZWdhbCB3ZWFrIGtleS4KKyAqLworaW50IERFU19zZXRfa2V5X2NoZWNrZWQoY29uc3RfREVTX2NibG9jayAqa2V5LCBERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSkKKwl7CisJaWYgKCFERVNfY2hlY2tfa2V5X3Bhcml0eShrZXkpKQorCQlyZXR1cm4oLTEpOworCWlmIChERVNfaXNfd2Vha19rZXkoa2V5KSkKKwkJcmV0dXJuKC0yKTsKKwlERVNfc2V0X2tleV91bmNoZWNrZWQoa2V5LCBzY2hlZHVsZSk7CisJcmV0dXJuIDA7CisJfQorCit2b2lkIERFU19zZXRfa2V5X3VuY2hlY2tlZChjb25zdF9ERVNfY2Jsb2NrICprZXksIERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlKQorCXsKKwlzdGF0aWMgY29uc3QgaW50IHNoaWZ0czJbMTZdPXswLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwwfTsKKwlyZWdpc3RlciBERVNfTE9ORyBjLGQsdCxzLHQyOworCXJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluOworCXJlZ2lzdGVyIERFU19MT05HICprOworCXJlZ2lzdGVyIGludCBpOworCisjaWZkZWYgT1BFTkJTRF9ERVZfQ1JZUFRPCisJbWVtY3B5KHNjaGVkdWxlLT5rZXksa2V5LHNpemVvZiBzY2hlZHVsZS0+a2V5KTsKKwlzY2hlZHVsZS0+c2Vzc2lvbj1OVUxMOworI2VuZGlmCisJayA9ICZzY2hlZHVsZS0+a3MtPmRlc2xvbmdbMF07CisJaW4gPSAmKCprZXkpWzBdOworCisJYzJsKGluLGMpOworCWMybChpbixkKTsKKworCS8qIGRvIFBDMSBpbiA0NyBzaW1wbGUgb3BlcmF0aW9ucyA6LSkKKwkgKiBUaGFua3MgdG8gSm9obiBGbGV0Y2hlciAoam9obl9mbGV0Y2hlckBsY2NtYWlsLm9jZi5sbG5sLmdvdikKKwkgKiBmb3IgdGhlIGluc3BpcmF0aW9uLiA6LSkgKi8KKwlQRVJNX09QIChkLGMsdCw0LDB4MGYwZjBmMGZMKTsKKwlIUEVSTV9PUChjLHQsLTIsMHhjY2NjMDAwMEwpOworCUhQRVJNX09QKGQsdCwtMiwweGNjY2MwMDAwTCk7CisJUEVSTV9PUCAoZCxjLHQsMSwweDU1NTU1NTU1TCk7CisJUEVSTV9PUCAoYyxkLHQsOCwweDAwZmYwMGZmTCk7CisJUEVSTV9PUCAoZCxjLHQsMSwweDU1NTU1NTU1TCk7CisJZD0JKCgoZCYweDAwMDAwMGZmTCk8PDE2TCl8IChkJjB4MDAwMGZmMDBMKSAgICAgfAorCQkgKChkJjB4MDBmZjAwMDBMKT4+MTZMKXwoKGMmMHhmMDAwMDAwMEwpPj40TCkpOworCWMmPTB4MGZmZmZmZmZMOworCisJZm9yIChpPTA7IGk8SVRFUkFUSU9OUzsgaSsrKQorCQl7CisJCWlmIChzaGlmdHMyW2ldKQorCQkJeyBjPSgoYz4+MkwpfChjPDwyNkwpKTsgZD0oKGQ+PjJMKXwoZDw8MjZMKSk7IH0KKwkJZWxzZQorCQkJeyBjPSgoYz4+MUwpfChjPDwyN0wpKTsgZD0oKGQ+PjFMKXwoZDw8MjdMKSk7IH0KKwkJYyY9MHgwZmZmZmZmZkw7CisJCWQmPTB4MGZmZmZmZmZMOworCQkvKiBjb3VsZCBiZSBhIGZldyBsZXNzIHNoaWZ0cyBidXQgSSBhbSB0byBsYXp5IGF0IHRoaXMKKwkJICogcG9pbnQgaW4gdGltZSB0byBpbnZlc3RpZ2F0ZSAqLworCQlzPQlkZXNfc2tiWzBdWyAoYyAgICApJjB4M2YgICAgICAgICAgICAgICAgXXwKKwkJCWRlc19za2JbMV1bKChjPj4gNkwpJjB4MDMpfCgoYz4+IDdMKSYweDNjKV18CisJCQlkZXNfc2tiWzJdWygoYz4+MTNMKSYweDBmKXwoKGM+PjE0TCkmMHgzMCldfAorCQkJZGVzX3NrYlszXVsoKGM+PjIwTCkmMHgwMSl8KChjPj4yMUwpJjB4MDYpIHwKKwkJCQkJCSAgKChjPj4yMkwpJjB4MzgpXTsKKwkJdD0JZGVzX3NrYls0XVsgKGQgICAgKSYweDNmICAgICAgICAgICAgICAgIF18CisJCQlkZXNfc2tiWzVdWygoZD4+IDdMKSYweDAzKXwoKGQ+PiA4TCkmMHgzYyldfAorCQkJZGVzX3NrYls2XVsgKGQ+PjE1TCkmMHgzZiAgICAgICAgICAgICAgICBdfAorCQkJZGVzX3NrYls3XVsoKGQ+PjIxTCkmMHgwZil8KChkPj4yMkwpJjB4MzApXTsKKworCQkvKiB0YWJsZSBjb250YWluZWQgMDIxMyA0NjU3ICovCisJCXQyPSgodDw8MTZMKXwocyYweDAwMDBmZmZmTCkpJjB4ZmZmZmZmZmZMOworCQkqKGsrKyk9Uk9UQVRFKHQyLDMwKSYweGZmZmZmZmZmTDsKKworCQl0Mj0oKHM+PjE2TCl8KHQmMHhmZmZmMDAwMEwpKTsKKwkJKihrKyspPVJPVEFURSh0MiwyNikmMHhmZmZmZmZmZkw7CisJCX0KKwl9CisKK2ludCBERVNfa2V5X3NjaGVkKGNvbnN0X0RFU19jYmxvY2sgKmtleSwgREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUpCisJeworCXJldHVybihERVNfc2V0X2tleShrZXksc2NoZWR1bGUpKTsKKwl9CisvKgorI3VuZGVmIGRlc19maXh1cF9rZXlfcGFyaXR5Cit2b2lkIGRlc19maXh1cF9rZXlfcGFyaXR5KGRlc19jYmxvY2sgKmtleSkKKwl7CisJZGVzX3NldF9vZGRfcGFyaXR5KGtleSk7CisJfQorKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvc3BlZWQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE2ZjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9zcGVlZC5jCkBAIC0wLDAgKzEsMzE0IEBACisvKiBjcnlwdG8vZGVzL3NwZWVkLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogMTEtU2VwLTkyIEFuZHJldyBEYXZpZWwgICBTdXBwb3J0IGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggYWRkZWQgKi8KKy8qIDA2LUFwci05MiBMdWtlIEJyZW5uYW4gICAgU3VwcG9ydCBmb3IgVk1TIGFuZCBhZGQgZXh0cmEgc2lnbmFsIGNhbGxzICovCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgKCFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChfX0RFQ0MpKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NQUNPU1gpCisjZGVmaW5lIFRJTUVTCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSBPUEVOU1NMX1VOSVNURF9JTworT1BFTlNTTF9ERUNMQVJFX0VYSVQKKworI2lmbmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZGVmaW5lIGNyeXB0KGMscykgKGRlc19jcnlwdCgoYyksKHMpKSkKKyNlbmRpZgorCisjaWZuZGVmIF9JUklYCisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmCisjaWZkZWYgVElNRVMKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNlbmRpZgorCisvKiBEZXBlbmRpbmcgb24gdGhlIFZNUyB2ZXJzaW9uLCB0aGUgdG1zIHN0cnVjdHVyZSBpcyBwZXJoYXBzIGRlZmluZWQuCisgICBUaGUgX19UTVMgbWFjcm8gd2lsbCBzaG93IGlmIGl0IHdhcy4gIElmIGl0IHdhc24ndCBkZWZpbmVkLCB3ZSBzaG91bGQKKyAgIHVuZGVmaW5lIFRJTUVTLCBzaW5jZSB0aGF0IHRlbGxzIHRoZSByZXN0IG9mIHRoZSBwcm9ncmFtIGhvdyB0aGluZ3MKKyAgIHNob3VsZCBiZSBoYW5kbGVkLgkJCQktLSBSaWNoYXJkIExldml0dGUgKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNU19ERUNDKSAmJiAhZGVmaW5lZChfX1RNUykKKyN1bmRlZiBUSU1FUworI2VuZGlmCisKKyNpZm5kZWYgVElNRVMKKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChzdW4pIHx8IGRlZmluZWQoX191bHRyaXgpCisjZGVmaW5lIF9QT1NJWF9TT1VSQ0UKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKworLyogVGhlIGZvbGxvd2luZyBpZiBmcm9tIHRpbWVzKDMpIG1hbiBwYWdlLiAgSXQgbWF5IG5lZWQgdG8gYmUgY2hhbmdlZCAqLworI2lmbmRlZiBIWgorIyBpZm5kZWYgQ0xLX1RDSworIyAgaWZuZGVmIF9CU0RfQ0xLX1RDS18gLyogRnJlZUJTRCBmaXggKi8KKyMgICBkZWZpbmUgSFoJMTAwLjAKKyMgIGVsc2UgLyogX0JTRF9DTEtfVENLXyAqLworIyAgIGRlZmluZSBIWiAoKGRvdWJsZSlfQlNEX0NMS19UQ0tfKQorIyAgZW5kaWYKKyMgZWxzZSAvKiBDTEtfVENLICovCisjICBkZWZpbmUgSFogKChkb3VibGUpQ0xLX1RDSykKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEJVRlNJWkUJKChsb25nKTEwMjQpCitsb25nIHJ1bj0wOworCitkb3VibGUgVGltZV9GKGludCBzKTsKKyNpZmRlZiBTSUdBTFJNCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChzZ2kpIHx8IGRlZmluZWQoX0FJWCkKKyNkZWZpbmUgU0lHUkVUVFlQRSB2b2lkCisjZWxzZQorI2RlZmluZSBTSUdSRVRUWVBFIGludAorI2VuZGlmCisKK1NJR1JFVFRZUEUgc2lnX2RvbmUoaW50IHNpZyk7CitTSUdSRVRUWVBFIHNpZ19kb25lKGludCBzaWcpCisJeworCXNpZ25hbChTSUdBTFJNLHNpZ19kb25lKTsKKwlydW49MDsKKyNpZmRlZiBMSU5UCisJc2lnPXNpZzsKKyNlbmRpZgorCX0KKyNlbmRpZgorCisjZGVmaW5lIFNUQVJUCTAKKyNkZWZpbmUgU1RPUAkxCisKK2RvdWJsZSBUaW1lX0YoaW50IHMpCisJeworCWRvdWJsZSByZXQ7CisjaWZkZWYgVElNRVMKKwlzdGF0aWMgc3RydWN0IHRtcyB0c3RhcnQsdGVuZDsKKworCWlmIChzID09IFNUQVJUKQorCQl7CisJCXRpbWVzKCZ0c3RhcnQpOworCQlyZXR1cm4oMCk7CisJCX0KKwllbHNlCisJCXsKKwkJdGltZXMoJnRlbmQpOworCQlyZXQ9KChkb3VibGUpKHRlbmQudG1zX3V0aW1lLXRzdGFydC50bXNfdXRpbWUpKS9IWjsKKwkJcmV0dXJuKChyZXQgPT0gMC4wKT8xZS02OnJldCk7CisJCX0KKyNlbHNlIC8qICF0aW1lcygpICovCisJc3RhdGljIHN0cnVjdCB0aW1lYiB0c3RhcnQsdGVuZDsKKwlsb25nIGk7CisKKwlpZiAocyA9PSBTVEFSVCkKKwkJeworCQlmdGltZSgmdHN0YXJ0KTsKKwkJcmV0dXJuKDApOworCQl9CisJZWxzZQorCQl7CisJCWZ0aW1lKCZ0ZW5kKTsKKwkJaT0obG9uZyl0ZW5kLm1pbGxpdG0tKGxvbmcpdHN0YXJ0Lm1pbGxpdG07CisJCXJldD0oKGRvdWJsZSkodGVuZC50aW1lLXRzdGFydC50aW1lKSkrKChkb3VibGUpaSkvMWUzOworCQlyZXR1cm4oKHJldCA9PSAwLjApPzFlLTY6cmV0KTsKKwkJfQorI2VuZGlmCisJfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCWxvbmcgY291bnQ7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmW0JVRlNJWkVdOworCXN0YXRpYyBERVNfY2Jsb2NrIGtleSA9ezB4MTIsMHgzNCwweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMH07CisJc3RhdGljIERFU19jYmxvY2sga2V5Mj17MHgzNCwweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwweDEyfTsKKwlzdGF0aWMgREVTX2NibG9jayBrZXkzPXsweDU2LDB4NzgsMHg5YSwweGJjLDB4ZGUsMHhmMCwweDEyLDB4MzR9OworCURFU19rZXlfc2NoZWR1bGUgc2NoLHNjaDIsc2NoMzsKKwlkb3VibGUgYSxiLGMsZCxlOworI2lmbmRlZiBTSUdBTFJNCisJbG9uZyBjYSxjYixjYyxjZCxjZTsKKyNlbmRpZgorCisjaWZuZGVmIFRJTUVTCisJcHJpbnRmKCJUbyBnZXQgdGhlIG1vc3QgYWNjdXJhdGUgcmVzdWx0cywgdHJ5IHRvIHJ1biB0aGlzXG4iKTsKKwlwcmludGYoInByb2dyYW0gd2hlbiB0aGlzIGNvbXB1dGVyIGlzIGlkbGUuXG4iKTsKKyNlbmRpZgorCisJREVTX3NldF9rZXlfdW5jaGVja2VkKCZrZXkyLCZzY2gyKTsKKwlERVNfc2V0X2tleV91bmNoZWNrZWQoJmtleTMsJnNjaDMpOworCisjaWZuZGVmIFNJR0FMUk0KKwlwcmludGYoIkZpcnN0IHdlIGNhbGN1bGF0ZSB0aGUgYXBwcm94aW1hdGUgc3BlZWQgLi4uXG4iKTsKKwlERVNfc2V0X2tleV91bmNoZWNrZWQoJmtleSwmc2NoKTsKKwljb3VudD0xMDsKKwlkbwl7CisJCWxvbmcgaTsKKwkJREVTX0xPTkcgZGF0YVsyXTsKKworCQljb3VudCo9MjsKKwkJVGltZV9GKFNUQVJUKTsKKwkJZm9yIChpPWNvdW50OyBpOyBpLS0pCisJCQlERVNfZW5jcnlwdDEoZGF0YSwmc2NoLERFU19FTkNSWVBUKTsKKwkJZD1UaW1lX0YoU1RPUCk7CisJCX0gd2hpbGUgKGQgPCAzLjApOworCWNhPWNvdW50OworCWNiPWNvdW50KjM7CisJY2M9Y291bnQqMyo4L0JVRlNJWkUrMTsKKwljZD1jb3VudCo4L0JVRlNJWkUrMTsKKwljZT1jb3VudC8yMCsxOworCXByaW50ZigiRG9pbmcgc2V0X2tleSAlbGQgdGltZXNcbiIsY2EpOworI2RlZmluZSBDT05EKGQpCShjb3VudCAhPSAoZCkpCisjZGVmaW5lIENPVU5UKGQpIChkKQorI2Vsc2UKKyNkZWZpbmUgQ09ORChjKQkocnVuKQorI2RlZmluZSBDT1VOVChkKSAoY291bnQpCisJc2lnbmFsKFNJR0FMUk0sc2lnX2RvbmUpOworCXByaW50ZigiRG9pbmcgc2V0X2tleSBmb3IgMTAgc2Vjb25kc1xuIik7CisJYWxhcm0oMTApOworI2VuZGlmCisKKwlUaW1lX0YoU1RBUlQpOworCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjYSk7IGNvdW50KyspCisJCURFU19zZXRfa2V5X3VuY2hlY2tlZCgma2V5LCZzY2gpOworCWQ9VGltZV9GKFNUT1ApOworCXByaW50ZigiJWxkIHNldF9rZXkncyBpbiAlLjJmIHNlY29uZHNcbiIsY291bnQsZCk7CisJYT0oKGRvdWJsZSlDT1VOVChjYSkpL2Q7CisKKyNpZmRlZiBTSUdBTFJNCisJcHJpbnRmKCJEb2luZyBERVNfZW5jcnlwdCdzIGZvciAxMCBzZWNvbmRzXG4iKTsKKwlhbGFybSgxMCk7CisjZWxzZQorCXByaW50ZigiRG9pbmcgREVTX2VuY3J5cHQgJWxkIHRpbWVzXG4iLGNiKTsKKyNlbmRpZgorCVRpbWVfRihTVEFSVCk7CisJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNiKTsgY291bnQrKykKKwkJeworCQlERVNfTE9ORyBkYXRhWzJdOworCisJCURFU19lbmNyeXB0MShkYXRhLCZzY2gsREVTX0VOQ1JZUFQpOworCQl9CisJZD1UaW1lX0YoU1RPUCk7CisJcHJpbnRmKCIlbGQgREVTX2VuY3J5cHQncyBpbiAlLjJmIHNlY29uZFxuIixjb3VudCxkKTsKKwliPSgoZG91YmxlKUNPVU5UKGNiKSo4KS9kOworCisjaWZkZWYgU0lHQUxSTQorCXByaW50ZigiRG9pbmcgREVTX2NiY19lbmNyeXB0IG9uICVsZCBieXRlIGJsb2NrcyBmb3IgMTAgc2Vjb25kc1xuIiwKKwkJQlVGU0laRSk7CisJYWxhcm0oMTApOworI2Vsc2UKKwlwcmludGYoIkRvaW5nIERFU19jYmNfZW5jcnlwdCAlbGQgdGltZXMgb24gJWxkIGJ5dGUgYmxvY2tzXG4iLGNjLAorCQlCVUZTSVpFKTsKKyNlbmRpZgorCVRpbWVfRihTVEFSVCk7CisJZm9yIChjb3VudD0wLHJ1bj0xOyBDT05EKGNjKTsgY291bnQrKykKKwkJREVTX25jYmNfZW5jcnlwdChidWYsYnVmLEJVRlNJWkUsJnNjaCwKKwkJCSZrZXksREVTX0VOQ1JZUFQpOworCWQ9VGltZV9GKFNUT1ApOworCXByaW50ZigiJWxkIERFU19jYmNfZW5jcnlwdCdzIG9mICVsZCBieXRlIGJsb2NrcyBpbiAlLjJmIHNlY29uZFxuIiwKKwkJY291bnQsQlVGU0laRSxkKTsKKwljPSgoZG91YmxlKUNPVU5UKGNjKSpCVUZTSVpFKS9kOworCisjaWZkZWYgU0lHQUxSTQorCXByaW50ZigiRG9pbmcgREVTX2VkZV9jYmNfZW5jcnlwdCBvbiAlbGQgYnl0ZSBibG9ja3MgZm9yIDEwIHNlY29uZHNcbiIsCisJCUJVRlNJWkUpOworCWFsYXJtKDEwKTsKKyNlbHNlCisJcHJpbnRmKCJEb2luZyBERVNfZWRlX2NiY19lbmNyeXB0ICVsZCB0aW1lcyBvbiAlbGQgYnl0ZSBibG9ja3NcbiIsY2QsCisJCUJVRlNJWkUpOworI2VuZGlmCisJVGltZV9GKFNUQVJUKTsKKwlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY2QpOyBjb3VudCsrKQorCQlERVNfZWRlM19jYmNfZW5jcnlwdChidWYsYnVmLEJVRlNJWkUsCisJCQkmc2NoLAorCQkJJnNjaDIsCisJCQkmc2NoMywKKwkJCSZrZXksCisJCQlERVNfRU5DUllQVCk7CisJZD1UaW1lX0YoU1RPUCk7CisJcHJpbnRmKCIlbGQgREVTX2VkZV9jYmNfZW5jcnlwdCdzIG9mICVsZCBieXRlIGJsb2NrcyBpbiAlLjJmIHNlY29uZFxuIiwKKwkJY291bnQsQlVGU0laRSxkKTsKKwlkPSgoZG91YmxlKUNPVU5UKGNkKSpCVUZTSVpFKS9kOworCisjaWZkZWYgU0lHQUxSTQorCXByaW50ZigiRG9pbmcgY3J5cHQgZm9yIDEwIHNlY29uZHNcbiIpOworCWFsYXJtKDEwKTsKKyNlbHNlCisJcHJpbnRmKCJEb2luZyBjcnlwdCAlbGQgdGltZXNcbiIsY2UpOworI2VuZGlmCisJVGltZV9GKFNUQVJUKTsKKwlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY2UpOyBjb3VudCsrKQorCQljcnlwdCgidGVzdGluZzEiLCJlZiIpOworCWU9VGltZV9GKFNUT1ApOworCXByaW50ZigiJWxkIGNyeXB0cyBpbiAlLjJmIHNlY29uZFxuIixjb3VudCxlKTsKKwllPSgoZG91YmxlKUNPVU5UKGNlKSkvZTsKKworCXByaW50Zigic2V0X2tleSAgICAgICAgICAgIHBlciBzZWMgPSAlMTIuMmYgKCU5LjNmdVMpXG4iLGEsMS4wZTYvYSk7CisJcHJpbnRmKCJERVMgcmF3IGVjYiBieXRlcyAgcGVyIHNlYyA9ICUxMi4yZiAoJTkuM2Z1UylcbiIsYiw4LjBlNi9iKTsKKwlwcmludGYoIkRFUyBjYmMgYnl0ZXMgICAgICBwZXIgc2VjID0gJTEyLjJmICglOS4zZnVTKVxuIixjLDguMGU2L2MpOworCXByaW50ZigiREVTIGVkZSBjYmMgYnl0ZXMgIHBlciBzZWMgPSAlMTIuMmYgKCU5LjNmdVMpXG4iLGQsOC4wZTYvZCk7CisJcHJpbnRmKCJjcnlwdCAgICAgICAgICAgICAgcGVyIHNlYyA9ICUxMi4yZiAoJTkuM2Z1UylcbiIsZSwxLjBlNi9lKTsKKwlleGl0KDApOworI2lmIGRlZmluZWQoTElOVCkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykKKwlyZXR1cm4oMCk7CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3Nwci5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9zcHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTE5MzZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9zcHIuaApAQCAtMCwwICsxLDIwNCBAQAorLyogY3J5cHRvL2Rlcy9zcHIuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCitPUEVOU1NMX0dMT0JBTCBjb25zdCBERVNfTE9ORyBERVNfU1B0cmFuc1s4XVs2NF09eworeworLyogbmliYmxlIDAgKi8KKzB4MDIwODA4MDBMLCAweDAwMDgwMDAwTCwgMHgwMjAwMDAwMkwsIDB4MDIwODA4MDJMLAorMHgwMjAwMDAwMEwsIDB4MDAwODA4MDJMLCAweDAwMDgwMDAyTCwgMHgwMjAwMDAwMkwsCisweDAwMDgwODAyTCwgMHgwMjA4MDgwMEwsIDB4MDIwODAwMDBMLCAweDAwMDAwODAyTCwKKzB4MDIwMDA4MDJMLCAweDAyMDAwMDAwTCwgMHgwMDAwMDAwMEwsIDB4MDAwODAwMDJMLAorMHgwMDA4MDAwMEwsIDB4MDAwMDAwMDJMLCAweDAyMDAwODAwTCwgMHgwMDA4MDgwMEwsCisweDAyMDgwODAyTCwgMHgwMjA4MDAwMEwsIDB4MDAwMDA4MDJMLCAweDAyMDAwODAwTCwKKzB4MDAwMDAwMDJMLCAweDAwMDAwODAwTCwgMHgwMDA4MDgwMEwsIDB4MDIwODAwMDJMLAorMHgwMDAwMDgwMEwsIDB4MDIwMDA4MDJMLCAweDAyMDgwMDAyTCwgMHgwMDAwMDAwMEwsCisweDAwMDAwMDAwTCwgMHgwMjA4MDgwMkwsIDB4MDIwMDA4MDBMLCAweDAwMDgwMDAyTCwKKzB4MDIwODA4MDBMLCAweDAwMDgwMDAwTCwgMHgwMDAwMDgwMkwsIDB4MDIwMDA4MDBMLAorMHgwMjA4MDAwMkwsIDB4MDAwMDA4MDBMLCAweDAwMDgwODAwTCwgMHgwMjAwMDAwMkwsCisweDAwMDgwODAyTCwgMHgwMDAwMDAwMkwsIDB4MDIwMDAwMDJMLCAweDAyMDgwMDAwTCwKKzB4MDIwODA4MDJMLCAweDAwMDgwODAwTCwgMHgwMjA4MDAwMEwsIDB4MDIwMDA4MDJMLAorMHgwMjAwMDAwMEwsIDB4MDAwMDA4MDJMLCAweDAwMDgwMDAyTCwgMHgwMDAwMDAwMEwsCisweDAwMDgwMDAwTCwgMHgwMjAwMDAwMEwsIDB4MDIwMDA4MDJMLCAweDAyMDgwODAwTCwKKzB4MDAwMDAwMDJMLCAweDAyMDgwMDAyTCwgMHgwMDAwMDgwMEwsIDB4MDAwODA4MDJMLAorfSx7CisvKiBuaWJibGUgMSAqLworMHg0MDEwODAxMEwsIDB4MDAwMDAwMDBMLCAweDAwMTA4MDAwTCwgMHg0MDEwMDAwMEwsCisweDQwMDAwMDEwTCwgMHgwMDAwODAxMEwsIDB4NDAwMDgwMDBMLCAweDAwMTA4MDAwTCwKKzB4MDAwMDgwMDBMLCAweDQwMTAwMDEwTCwgMHgwMDAwMDAxMEwsIDB4NDAwMDgwMDBMLAorMHgwMDEwMDAxMEwsIDB4NDAxMDgwMDBMLCAweDQwMTAwMDAwTCwgMHgwMDAwMDAxMEwsCisweDAwMTAwMDAwTCwgMHg0MDAwODAxMEwsIDB4NDAxMDAwMTBMLCAweDAwMDA4MDAwTCwKKzB4MDAxMDgwMTBMLCAweDQwMDAwMDAwTCwgMHgwMDAwMDAwMEwsIDB4MDAxMDAwMTBMLAorMHg0MDAwODAxMEwsIDB4MDAxMDgwMTBMLCAweDQwMTA4MDAwTCwgMHg0MDAwMDAxMEwsCisweDQwMDAwMDAwTCwgMHgwMDEwMDAwMEwsIDB4MDAwMDgwMTBMLCAweDQwMTA4MDEwTCwKKzB4MDAxMDAwMTBMLCAweDQwMTA4MDAwTCwgMHg0MDAwODAwMEwsIDB4MDAxMDgwMTBMLAorMHg0MDEwODAxMEwsIDB4MDAxMDAwMTBMLCAweDQwMDAwMDEwTCwgMHgwMDAwMDAwMEwsCisweDQwMDAwMDAwTCwgMHgwMDAwODAxMEwsIDB4MDAxMDAwMDBMLCAweDQwMTAwMDEwTCwKKzB4MDAwMDgwMDBMLCAweDQwMDAwMDAwTCwgMHgwMDEwODAxMEwsIDB4NDAwMDgwMTBMLAorMHg0MDEwODAwMEwsIDB4MDAwMDgwMDBMLCAweDAwMDAwMDAwTCwgMHg0MDAwMDAxMEwsCisweDAwMDAwMDEwTCwgMHg0MDEwODAxMEwsIDB4MDAxMDgwMDBMLCAweDQwMTAwMDAwTCwKKzB4NDAxMDAwMTBMLCAweDAwMTAwMDAwTCwgMHgwMDAwODAxMEwsIDB4NDAwMDgwMDBMLAorMHg0MDAwODAxMEwsIDB4MDAwMDAwMTBMLCAweDQwMTAwMDAwTCwgMHgwMDEwODAwMEwsCit9LHsKKy8qIG5pYmJsZSAyICovCisweDA0MDAwMDAxTCwgMHgwNDA0MDEwMEwsIDB4MDAwMDAxMDBMLCAweDA0MDAwMTAxTCwKKzB4MDAwNDAwMDFMLCAweDA0MDAwMDAwTCwgMHgwNDAwMDEwMUwsIDB4MDAwNDAxMDBMLAorMHgwNDAwMDEwMEwsIDB4MDAwNDAwMDBMLCAweDA0MDQwMDAwTCwgMHgwMDAwMDAwMUwsCisweDA0MDQwMTAxTCwgMHgwMDAwMDEwMUwsIDB4MDAwMDAwMDFMLCAweDA0MDQwMDAxTCwKKzB4MDAwMDAwMDBMLCAweDAwMDQwMDAxTCwgMHgwNDA0MDEwMEwsIDB4MDAwMDAxMDBMLAorMHgwMDAwMDEwMUwsIDB4MDQwNDAxMDFMLCAweDAwMDQwMDAwTCwgMHgwNDAwMDAwMUwsCisweDA0MDQwMDAxTCwgMHgwNDAwMDEwMEwsIDB4MDAwNDAxMDFMLCAweDA0MDQwMDAwTCwKKzB4MDAwNDAxMDBMLCAweDAwMDAwMDAwTCwgMHgwNDAwMDAwMEwsIDB4MDAwNDAxMDFMLAorMHgwNDA0MDEwMEwsIDB4MDAwMDAxMDBMLCAweDAwMDAwMDAxTCwgMHgwMDA0MDAwMEwsCisweDAwMDAwMTAxTCwgMHgwMDA0MDAwMUwsIDB4MDQwNDAwMDBMLCAweDA0MDAwMTAxTCwKKzB4MDAwMDAwMDBMLCAweDA0MDQwMTAwTCwgMHgwMDA0MDEwMEwsIDB4MDQwNDAwMDFMLAorMHgwMDA0MDAwMUwsIDB4MDQwMDAwMDBMLCAweDA0MDQwMTAxTCwgMHgwMDAwMDAwMUwsCisweDAwMDQwMTAxTCwgMHgwNDAwMDAwMUwsIDB4MDQwMDAwMDBMLCAweDA0MDQwMTAxTCwKKzB4MDAwNDAwMDBMLCAweDA0MDAwMTAwTCwgMHgwNDAwMDEwMUwsIDB4MDAwNDAxMDBMLAorMHgwNDAwMDEwMEwsIDB4MDAwMDAwMDBMLCAweDA0MDQwMDAxTCwgMHgwMDAwMDEwMUwsCisweDA0MDAwMDAxTCwgMHgwMDA0MDEwMUwsIDB4MDAwMDAxMDBMLCAweDA0MDQwMDAwTCwKK30seworLyogbmliYmxlIDMgKi8KKzB4MDA0MDEwMDhMLCAweDEwMDAxMDAwTCwgMHgwMDAwMDAwOEwsIDB4MTA0MDEwMDhMLAorMHgwMDAwMDAwMEwsIDB4MTA0MDAwMDBMLCAweDEwMDAxMDA4TCwgMHgwMDQwMDAwOEwsCisweDEwNDAxMDAwTCwgMHgxMDAwMDAwOEwsIDB4MTAwMDAwMDBMLCAweDAwMDAxMDA4TCwKKzB4MTAwMDAwMDhMLCAweDAwNDAxMDA4TCwgMHgwMDQwMDAwMEwsIDB4MTAwMDAwMDBMLAorMHgxMDQwMDAwOEwsIDB4MDA0MDEwMDBMLCAweDAwMDAxMDAwTCwgMHgwMDAwMDAwOEwsCisweDAwNDAxMDAwTCwgMHgxMDAwMTAwOEwsIDB4MTA0MDAwMDBMLCAweDAwMDAxMDAwTCwKKzB4MDAwMDEwMDhMLCAweDAwMDAwMDAwTCwgMHgwMDQwMDAwOEwsIDB4MTA0MDEwMDBMLAorMHgxMDAwMTAwMEwsIDB4MTA0MDAwMDhMLCAweDEwNDAxMDA4TCwgMHgwMDQwMDAwMEwsCisweDEwNDAwMDA4TCwgMHgwMDAwMTAwOEwsIDB4MDA0MDAwMDBMLCAweDEwMDAwMDA4TCwKKzB4MDA0MDEwMDBMLCAweDEwMDAxMDAwTCwgMHgwMDAwMDAwOEwsIDB4MTA0MDAwMDBMLAorMHgxMDAwMTAwOEwsIDB4MDAwMDAwMDBMLCAweDAwMDAxMDAwTCwgMHgwMDQwMDAwOEwsCisweDAwMDAwMDAwTCwgMHgxMDQwMDAwOEwsIDB4MTA0MDEwMDBMLCAweDAwMDAxMDAwTCwKKzB4MTAwMDAwMDBMLCAweDEwNDAxMDA4TCwgMHgwMDQwMTAwOEwsIDB4MDA0MDAwMDBMLAorMHgxMDQwMTAwOEwsIDB4MDAwMDAwMDhMLCAweDEwMDAxMDAwTCwgMHgwMDQwMTAwOEwsCisweDAwNDAwMDA4TCwgMHgwMDQwMTAwMEwsIDB4MTA0MDAwMDBMLCAweDEwMDAxMDA4TCwKKzB4MDAwMDEwMDhMLCAweDEwMDAwMDAwTCwgMHgxMDAwMDAwOEwsIDB4MTA0MDEwMDBMLAorfSx7CisvKiBuaWJibGUgNCAqLworMHgwODAwMDAwMEwsIDB4MDAwMTAwMDBMLCAweDAwMDAwNDAwTCwgMHgwODAxMDQyMEwsCisweDA4MDEwMDIwTCwgMHgwODAwMDQwMEwsIDB4MDAwMTA0MjBMLCAweDA4MDEwMDAwTCwKKzB4MDAwMTAwMDBMLCAweDAwMDAwMDIwTCwgMHgwODAwMDAyMEwsIDB4MDAwMTA0MDBMLAorMHgwODAwMDQyMEwsIDB4MDgwMTAwMjBMLCAweDA4MDEwNDAwTCwgMHgwMDAwMDAwMEwsCisweDAwMDEwNDAwTCwgMHgwODAwMDAwMEwsIDB4MDAwMTAwMjBMLCAweDAwMDAwNDIwTCwKKzB4MDgwMDA0MDBMLCAweDAwMDEwNDIwTCwgMHgwMDAwMDAwMEwsIDB4MDgwMDAwMjBMLAorMHgwMDAwMDAyMEwsIDB4MDgwMDA0MjBMLCAweDA4MDEwNDIwTCwgMHgwMDAxMDAyMEwsCisweDA4MDEwMDAwTCwgMHgwMDAwMDQwMEwsIDB4MDAwMDA0MjBMLCAweDA4MDEwNDAwTCwKKzB4MDgwMTA0MDBMLCAweDA4MDAwNDIwTCwgMHgwMDAxMDAyMEwsIDB4MDgwMTAwMDBMLAorMHgwMDAxMDAwMEwsIDB4MDAwMDAwMjBMLCAweDA4MDAwMDIwTCwgMHgwODAwMDQwMEwsCisweDA4MDAwMDAwTCwgMHgwMDAxMDQwMEwsIDB4MDgwMTA0MjBMLCAweDAwMDAwMDAwTCwKKzB4MDAwMTA0MjBMLCAweDA4MDAwMDAwTCwgMHgwMDAwMDQwMEwsIDB4MDAwMTAwMjBMLAorMHgwODAwMDQyMEwsIDB4MDAwMDA0MDBMLCAweDAwMDAwMDAwTCwgMHgwODAxMDQyMEwsCisweDA4MDEwMDIwTCwgMHgwODAxMDQwMEwsIDB4MDAwMDA0MjBMLCAweDAwMDEwMDAwTCwKKzB4MDAwMTA0MDBMLCAweDA4MDEwMDIwTCwgMHgwODAwMDQwMEwsIDB4MDAwMDA0MjBMLAorMHgwMDAwMDAyMEwsIDB4MDAwMTA0MjBMLCAweDA4MDEwMDAwTCwgMHgwODAwMDAyMEwsCit9LHsKKy8qIG5pYmJsZSA1ICovCisweDgwMDAwMDQwTCwgMHgwMDIwMDA0MEwsIDB4MDAwMDAwMDBMLCAweDgwMjAyMDAwTCwKKzB4MDAyMDAwNDBMLCAweDAwMDAyMDAwTCwgMHg4MDAwMjA0MEwsIDB4MDAyMDAwMDBMLAorMHgwMDAwMjA0MEwsIDB4ODAyMDIwNDBMLCAweDAwMjAyMDAwTCwgMHg4MDAwMDAwMEwsCisweDgwMDAyMDAwTCwgMHg4MDAwMDA0MEwsIDB4ODAyMDAwMDBMLCAweDAwMjAyMDQwTCwKKzB4MDAyMDAwMDBMLCAweDgwMDAyMDQwTCwgMHg4MDIwMDA0MEwsIDB4MDAwMDAwMDBMLAorMHgwMDAwMjAwMEwsIDB4MDAwMDAwNDBMLCAweDgwMjAyMDAwTCwgMHg4MDIwMDA0MEwsCisweDgwMjAyMDQwTCwgMHg4MDIwMDAwMEwsIDB4ODAwMDAwMDBMLCAweDAwMDAyMDQwTCwKKzB4MDAwMDAwNDBMLCAweDAwMjAyMDAwTCwgMHgwMDIwMjA0MEwsIDB4ODAwMDIwMDBMLAorMHgwMDAwMjA0MEwsIDB4ODAwMDAwMDBMLCAweDgwMDAyMDAwTCwgMHgwMDIwMjA0MEwsCisweDgwMjAyMDAwTCwgMHgwMDIwMDA0MEwsIDB4MDAwMDAwMDBMLCAweDgwMDAyMDAwTCwKKzB4ODAwMDAwMDBMLCAweDAwMDAyMDAwTCwgMHg4MDIwMDA0MEwsIDB4MDAyMDAwMDBMLAorMHgwMDIwMDA0MEwsIDB4ODAyMDIwNDBMLCAweDAwMjAyMDAwTCwgMHgwMDAwMDA0MEwsCisweDgwMjAyMDQwTCwgMHgwMDIwMjAwMEwsIDB4MDAyMDAwMDBMLCAweDgwMDAyMDQwTCwKKzB4ODAwMDAwNDBMLCAweDgwMjAwMDAwTCwgMHgwMDIwMjA0MEwsIDB4MDAwMDAwMDBMLAorMHgwMDAwMjAwMEwsIDB4ODAwMDAwNDBMLCAweDgwMDAyMDQwTCwgMHg4MDIwMjAwMEwsCisweDgwMjAwMDAwTCwgMHgwMDAwMjA0MEwsIDB4MDAwMDAwNDBMLCAweDgwMjAwMDQwTCwKK30seworLyogbmliYmxlIDYgKi8KKzB4MDAwMDQwMDBMLCAweDAwMDAwMjAwTCwgMHgwMTAwMDIwMEwsIDB4MDEwMDAwMDRMLAorMHgwMTAwNDIwNEwsIDB4MDAwMDQwMDRMLCAweDAwMDA0MjAwTCwgMHgwMDAwMDAwMEwsCisweDAxMDAwMDAwTCwgMHgwMTAwMDIwNEwsIDB4MDAwMDAyMDRMLCAweDAxMDA0MDAwTCwKKzB4MDAwMDAwMDRMLCAweDAxMDA0MjAwTCwgMHgwMTAwNDAwMEwsIDB4MDAwMDAyMDRMLAorMHgwMTAwMDIwNEwsIDB4MDAwMDQwMDBMLCAweDAwMDA0MDA0TCwgMHgwMTAwNDIwNEwsCisweDAwMDAwMDAwTCwgMHgwMTAwMDIwMEwsIDB4MDEwMDAwMDRMLCAweDAwMDA0MjAwTCwKKzB4MDEwMDQwMDRMLCAweDAwMDA0MjA0TCwgMHgwMTAwNDIwMEwsIDB4MDAwMDAwMDRMLAorMHgwMDAwNDIwNEwsIDB4MDEwMDQwMDRMLCAweDAwMDAwMjAwTCwgMHgwMTAwMDAwMEwsCisweDAwMDA0MjA0TCwgMHgwMTAwNDAwMEwsIDB4MDEwMDQwMDRMLCAweDAwMDAwMjA0TCwKKzB4MDAwMDQwMDBMLCAweDAwMDAwMjAwTCwgMHgwMTAwMDAwMEwsIDB4MDEwMDQwMDRMLAorMHgwMTAwMDIwNEwsIDB4MDAwMDQyMDRMLCAweDAwMDA0MjAwTCwgMHgwMDAwMDAwMEwsCisweDAwMDAwMjAwTCwgMHgwMTAwMDAwNEwsIDB4MDAwMDAwMDRMLCAweDAxMDAwMjAwTCwKKzB4MDAwMDAwMDBMLCAweDAxMDAwMjA0TCwgMHgwMTAwMDIwMEwsIDB4MDAwMDQyMDBMLAorMHgwMDAwMDIwNEwsIDB4MDAwMDQwMDBMLCAweDAxMDA0MjA0TCwgMHgwMTAwMDAwMEwsCisweDAxMDA0MjAwTCwgMHgwMDAwMDAwNEwsIDB4MDAwMDQwMDRMLCAweDAxMDA0MjA0TCwKKzB4MDEwMDAwMDRMLCAweDAxMDA0MjAwTCwgMHgwMTAwNDAwMEwsIDB4MDAwMDQwMDRMLAorfSx7CisvKiBuaWJibGUgNyAqLworMHgyMDgwMDA4MEwsIDB4MjA4MjAwMDBMLCAweDAwMDIwMDgwTCwgMHgwMDAwMDAwMEwsCisweDIwMDIwMDAwTCwgMHgwMDgwMDA4MEwsIDB4MjA4MDAwMDBMLCAweDIwODIwMDgwTCwKKzB4MDAwMDAwODBMLCAweDIwMDAwMDAwTCwgMHgwMDgyMDAwMEwsIDB4MDAwMjAwODBMLAorMHgwMDgyMDA4MEwsIDB4MjAwMjAwODBMLCAweDIwMDAwMDgwTCwgMHgyMDgwMDAwMEwsCisweDAwMDIwMDAwTCwgMHgwMDgyMDA4MEwsIDB4MDA4MDAwODBMLCAweDIwMDIwMDAwTCwKKzB4MjA4MjAwODBMLCAweDIwMDAwMDgwTCwgMHgwMDAwMDAwMEwsIDB4MDA4MjAwMDBMLAorMHgyMDAwMDAwMEwsIDB4MDA4MDAwMDBMLCAweDIwMDIwMDgwTCwgMHgyMDgwMDA4MEwsCisweDAwODAwMDAwTCwgMHgwMDAyMDAwMEwsIDB4MjA4MjAwMDBMLCAweDAwMDAwMDgwTCwKKzB4MDA4MDAwMDBMLCAweDAwMDIwMDAwTCwgMHgyMDAwMDA4MEwsIDB4MjA4MjAwODBMLAorMHgwMDAyMDA4MEwsIDB4MjAwMDAwMDBMLCAweDAwMDAwMDAwTCwgMHgwMDgyMDAwMEwsCisweDIwODAwMDgwTCwgMHgyMDAyMDA4MEwsIDB4MjAwMjAwMDBMLCAweDAwODAwMDgwTCwKKzB4MjA4MjAwMDBMLCAweDAwMDAwMDgwTCwgMHgwMDgwMDA4MEwsIDB4MjAwMjAwMDBMLAorMHgyMDgyMDA4MEwsIDB4MDA4MDAwMDBMLCAweDIwODAwMDAwTCwgMHgyMDAwMDA4MEwsCisweDAwODIwMDAwTCwgMHgwMDAyMDA4MEwsIDB4MjAwMjAwODBMLCAweDIwODAwMDAwTCwKKzB4MDAwMDAwODBMLCAweDIwODIwMDAwTCwgMHgwMDgyMDA4MEwsIDB4MDAwMDAwMDBMLAorMHgyMDAwMDAwMEwsIDB4MjA4MDAwODBMLCAweDAwMDIwMDAwTCwgMHgwMDgyMDA4MEwsCit9fTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvc3RyMmtleS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy9zdHIya2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyMDU0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvc3RyMmtleS5jCkBAIC0wLDAgKzEsMTc0IEBACisvKiBjcnlwdG8vZGVzL3N0cjJrZXkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSAiZGVzX2xvY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCit2b2lkIERFU19zdHJpbmdfdG9fa2V5KGNvbnN0IGNoYXIgKnN0ciwgREVTX2NibG9jayAqa2V5KQorCXsKKwlERVNfa2V5X3NjaGVkdWxlIGtzOworCWludCBpLGxlbmd0aDsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIGo7CisKKwltZW1zZXQoa2V5LDAsOCk7CisJbGVuZ3RoPXN0cmxlbihzdHIpOworI2lmZGVmIE9MRF9TVFJfVE9fS0VZCisJZm9yIChpPTA7IGk8bGVuZ3RoOyBpKyspCisJCSgqa2V5KVtpJThdXj0oc3RyW2ldPDwxKTsKKyNlbHNlIC8qIE1JVCBDT01QQVRJQkxFICovCisJZm9yIChpPTA7IGk8bGVuZ3RoOyBpKyspCisJCXsKKwkJaj1zdHJbaV07CisJCWlmICgoaSUxNikgPCA4KQorCQkJKCprZXkpW2klOF1ePShqPDwxKTsKKwkJZWxzZQorCQkJeworCQkJLyogUmV2ZXJzZSB0aGUgYml0IG9yZGVyIDA1LzA1LzkyIGVheSAqLworCQkJaj0oKGo8PDQpJjB4ZjApfCgoaj4+NCkmMHgwZik7CisJCQlqPSgoajw8MikmMHhjYyl8KChqPj4yKSYweDMzKTsKKwkJCWo9KChqPDwxKSYweGFhKXwoKGo+PjEpJjB4NTUpOworCQkJKCprZXkpWzctKGklOCldXj1qOworCQkJfQorCQl9CisjZW5kaWYKKwlERVNfc2V0X29kZF9wYXJpdHkoa2V5KTsKKyNpZmRlZiBFWFBFUklNRU5UQUxfU1RSX1RPX1NUUk9OR19LRVkKKwlpZihERVNfaXNfd2Vha19rZXkoa2V5KSkKKwkgICAgKCprZXkpWzddIF49IDB4RjA7CisJREVTX3NldF9rZXkoa2V5LCZrcyk7CisjZWxzZQorCURFU19zZXRfa2V5X3VuY2hlY2tlZChrZXksJmtzKTsKKyNlbmRpZgorCURFU19jYmNfY2tzdW0oKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXN0cixrZXksbGVuZ3RoLCZrcyxrZXkpOworCU9QRU5TU0xfY2xlYW5zZSgma3Msc2l6ZW9mKGtzKSk7CisJREVTX3NldF9vZGRfcGFyaXR5KGtleSk7CisJfQorCit2b2lkIERFU19zdHJpbmdfdG9fMmtleXMoY29uc3QgY2hhciAqc3RyLCBERVNfY2Jsb2NrICprZXkxLCBERVNfY2Jsb2NrICprZXkyKQorCXsKKwlERVNfa2V5X3NjaGVkdWxlIGtzOworCWludCBpLGxlbmd0aDsKKwlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIGo7CisKKwltZW1zZXQoa2V5MSwwLDgpOworCW1lbXNldChrZXkyLDAsOCk7CisJbGVuZ3RoPXN0cmxlbihzdHIpOworI2lmZGVmIE9MRF9TVFJfVE9fS0VZCisJaWYgKGxlbmd0aCA8PSA4KQorCQl7CisJCWZvciAoaT0wOyBpPGxlbmd0aDsgaSsrKQorCQkJeworCQkJKCprZXkyKVtpXT0oKmtleTEpW2ldPShzdHJbaV08PDEpOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWZvciAoaT0wOyBpPGxlbmd0aDsgaSsrKQorCQkJeworCQkJaWYgKChpLzgpJjEpCisJCQkJKCprZXkyKVtpJThdXj0oc3RyW2ldPDwxKTsKKwkJCWVsc2UKKwkJCQkoKmtleTEpW2klOF1ePShzdHJbaV08PDEpOworCQkJfQorCQl9CisjZWxzZSAvKiBNSVQgQ09NUEFUSUJMRSAqLworCWZvciAoaT0wOyBpPGxlbmd0aDsgaSsrKQorCQl7CisJCWo9c3RyW2ldOworCQlpZiAoKGklMzIpIDwgMTYpCisJCQl7CisJCQlpZiAoKGklMTYpIDwgOCkKKwkJCQkoKmtleTEpW2klOF1ePShqPDwxKTsKKwkJCWVsc2UKKwkJCQkoKmtleTIpW2klOF1ePShqPDwxKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaj0oKGo8PDQpJjB4ZjApfCgoaj4+NCkmMHgwZik7CisJCQlqPSgoajw8MikmMHhjYyl8KChqPj4yKSYweDMzKTsKKwkJCWo9KChqPDwxKSYweGFhKXwoKGo+PjEpJjB4NTUpOworCQkJaWYgKChpJTE2KSA8IDgpCisJCQkJKCprZXkxKVs3LShpJTgpXV49ajsKKwkJCWVsc2UKKwkJCQkoKmtleTIpWzctKGklOCldXj1qOworCQkJfQorCQl9CisJaWYgKGxlbmd0aCA8PSA4KSBtZW1jcHkoa2V5MixrZXkxLDgpOworI2VuZGlmCisJREVTX3NldF9vZGRfcGFyaXR5KGtleTEpOworCURFU19zZXRfb2RkX3Bhcml0eShrZXkyKTsKKyNpZmRlZiBFWFBFUklNRU5UQUxfU1RSX1RPX1NUUk9OR19LRVkKKwlpZihERVNfaXNfd2Vha19rZXkoa2V5MSkpCisJICAgICgqa2V5MSlbN10gXj0gMHhGMDsKKwlERVNfc2V0X2tleShrZXkxLCZrcyk7CisjZWxzZQorCURFU19zZXRfa2V5X3VuY2hlY2tlZChrZXkxLCZrcyk7CisjZW5kaWYKKwlERVNfY2JjX2Nrc3VtKChjb25zdCB1bnNpZ25lZCBjaGFyKilzdHIsa2V5MSxsZW5ndGgsJmtzLGtleTEpOworI2lmZGVmIEVYUEVSSU1FTlRBTF9TVFJfVE9fU1RST05HX0tFWQorCWlmKERFU19pc193ZWFrX2tleShrZXkyKSkKKwkgICAgKCprZXkyKVs3XSBePSAweEYwOworCURFU19zZXRfa2V5KGtleTIsJmtzKTsKKyNlbHNlCisJREVTX3NldF9rZXlfdW5jaGVja2VkKGtleTIsJmtzKTsKKyNlbmRpZgorCURFU19jYmNfY2tzdW0oKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXN0cixrZXkyLGxlbmd0aCwma3Msa2V5Mik7CisJT1BFTlNTTF9jbGVhbnNlKCZrcyxzaXplb2Yoa3MpKTsKKwlERVNfc2V0X29kZF9wYXJpdHkoa2V5MSk7CisJREVTX3NldF9vZGRfcGFyaXR5KGtleTIpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdC90ZXN0IGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy90L3Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhY2QwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdC90ZXN0CkBAIC0wLDAgKzEsMjcgQEAKKyMhLi9wZXJsCisKK0JFR0lOIHsgcHVzaChASU5DLCBxdyguLi8uLi8uLi9saWIgLi4vLi4vbGliIC4uL2xpYiBsaWIpKTsgfQorCit1c2UgREVTOworCiska2V5PScwMDAwMDAwMCc7Ciska3M9REVTOjpzZXRfa2V5KCRrZXkpOworQGE9c3BsaXQoLy8sJGtzKTsKK2ZvcmVhY2ggKEBhKSB7IHByaW50ZiAiJTAyeC0iLG9yZCgkXyk7IH0KK3ByaW50ICJcbiI7CisKKworJGtleT1ERVM6OnJhbmRvbV9rZXkoKTsKK3ByaW50ICIoJF8pXG4iOworQGE9c3BsaXQoLy8sJGtleSk7Citmb3JlYWNoIChAYSkgeyBwcmludGYgIiUwMngtIixvcmQoJF8pOyB9CitwcmludCAiXG4iOworJHN0cj0idGhpcyBpcyBhbmQgYWdhaW4gaW50byB0aGUgYnJlYWNoIjsKKygkazEsJGsyKT1ERVM6OnN0cmluZ190b18ya2V5cygkc3RyKTsKK0BhPXNwbGl0KC8vLCRrMSk7Citmb3JlYWNoIChAYSkgeyBwcmludGYgIiUwMngtIixvcmQoJF8pOyB9CitwcmludCAiXG4iOworQGE9c3BsaXQoLy8sJGsyKTsKK2ZvcmVhY2ggKEBhKSB7IHByaW50ZiAiJTAyeC0iLG9yZCgkXyk7IH0KK3ByaW50ICJcbiI7CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvNDg2LTUwLnNvbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvNDg2LTUwLnNvbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU2MmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy90aW1lcy80ODYtNTAuc29sCkBAIC0wLDAgKzEsMTYgQEAKK1NvbGFyaXMgMi40LCA0ODYgNTBtaHosIGdjYyAyLjYuMworb3B0aW9ucyAgICBkZXMgZWNiL3MKKzE2IHIyIGkgICAgIDQzNTUyLjUxIDEwMC4wJQorMTYgcjEgaSAgICAgNDM0ODcuNDUgIDk5LjklCisxNiAgYyBwICAgICA0MzAwMy4yMyAgOTguNyUKKzE2IHIyIHAgICAgIDQyMzM5LjAwICA5Ny4yJQorMTYgIGMgaSAgICAgNDE5MDAuOTEgIDk2LjIlCisxNiByMSBwICAgICA0MTM2MC42NCAgOTUuMCUKKyA0ICBjIGkgICAgIDM4NzI4LjQ4ICA4OC45JQorIDQgIGMgcCAgICAgMzgyMjUuNjMgIDg3LjglCisgNCByMSBpICAgICAzODA4NS43OSAgODcuNCUKKyA0IHIyIGkgICAgIDM3ODI1LjY0ICA4Ni45JQorIDQgcjIgcCAgICAgMzQ2MTEuMDAgIDc5LjUlCisgNCByMSBwICAgICAzMTgwMi4wMCAgNzMuMCUKKy1EREVTX1VOUk9MTCAtRERFU19SSVNDMgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzLzU4Ni0xMDAubG54IGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy90aW1lcy81ODYtMTAwLmxueApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzIzOTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy90aW1lcy81ODYtMTAwLmxueApAQCAtMCwwICsxLDIwIEBACitQZW50aXVtIDEwMAorTGludXggMiBrZXJuZWwKK2djYyAyLjcuMCAtTzMgLWZvbWl0LWZyYW1lLXBvaW50ZXIKK05vIFggc2VydmVyIHJ1bm5pbmcsIGp1c3QgYSBjb25zb2xlLCBpdCBtYWtlcyB0aGUgdG9wIHNwZWVkIGp1bXAgZnJvbSAxNTEsMDAwCit0byAxNTgsMDAwIDotKS4KK29wdGlvbnMgICAgZGVzIGVjYi9zCithc3NlbWJlciAgIDI4MTAwMC4wMCAxNzcuMSUKKzE2IHIxIHAgICAgMTU4NjY3LjQwIDEwMC4wJQorMTYgcjEgaSAgICAxNDg0NzEuNzAgIDkzLjYlCisxNiByMiBwICAgIDE0Mzk2MS44MCAgOTAuNyUKKzE2IHIyIGkgICAgMTQxNjg5LjIwICA4OS4zJQorIDQgcjEgaSAgICAxNDAxMDAuMDAgIDg4LjMlCisgNCByMiBpICAgIDEzNDA0OS40MCAgODQuNSUKKzE2ICBjIGkgICAgMTI0MTQ1LjIwICA3OC4yJQorMTYgIGMgcCAgICAxMjE1ODQuMjAgIDc2LjYlCisgNCAgYyBpICAgIDExODExNi4wMCAgNzQuNCUKKyA0IHIyIHAgICAgMTE3OTc3LjkwICA3NC40JQorIDQgIGMgcCAgICAxMTQ5NzEuNDAgIDcyLjUlCisgNCByMSBwICAgIDExNDU3OC40MCAgNzIuMiUKKy1EREVTX1VOUk9MTCAtRERFU19SSVNDMSAtRERFU19QVFIKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvNjg2LTIwMC5mcmUgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzLzY4Ni0yMDAuZnJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkODNmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzLzY4Ni0yMDAuZnJlCkBAIC0wLDAgKzEsMTggQEAKK1BlbnRpdW0gMTAwCitGcmVlIEJTRCAyLjEuNSBrZXJuZWwKK2djYyAyLjcuMi4yIC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlcgorb3B0aW9ucyAgICBkZXMgZWNiL3MKK2Fzc2VtYmVyICAgNTc4MDAwLjAwIDEzMy4xJQorMTYgcjIgaSAgICA0MzQ0NTQuODAgMTAwLjAlCisxNiByMSBpICAgIDQzMzYyMS40MyAgOTkuOCUKKzE2IHIyIHAgICAgNDMxMzc1LjY5ICA5OS4zJQorIDQgcjEgaSAgICA0MjM3MjIuMzAgIDk3LjUlCisgNCByMiBpICAgIDQyMjM5OS40MCAgOTcuMiUKKzE2IHIxIHAgICAgNDIxNzM5LjQwICA5Ny4xJQorMTYgIGMgaSAgICAzOTkwMjcuOTQgIDkxLjglCisxNiAgYyBwICAgIDM3MjI1MS43MCAgODUuNyUKKyA0ICBjIGkgICAgMzY1MTE4LjM1ICA4NC4wJQorIDQgIGMgcCAgICAzNTI4ODAuNTEgIDgxLjIlCisgNCByMiBwICAgIDI1NTEwNC45MCAgNTguNyUKKyA0IHIxIHAgICAgMjUxMjg5LjE4ICA1Ny44JQorLURERVNfVU5ST0xMIC1EREVTX1JJU0MyCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzL2FpeC5jYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvYWl4LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NmI3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzL2FpeC5jYwpAQCAtMCwwICsxLDI2IEBACitGcm9tOiBQYWNvIEdhcmNpYSA8cGdhcmNpYUBjYW0uZXM+CisKK1RoaXMgbWFjaGluZSBpcyBhIEJ1bGwgRXN0cmVsbGEgIE1pbml0b3dlciBNb2RlbCBNVDYwNC0xMDAKK1Byb2Nlc3NvciAgICAgICAgOiBQUEM2MDQgCitQLlNwZWVkICAgICAgICAgIDogMTAwTWh6IAorRGF0YS9JbnN0ciBDYWNoZSA6ICAgIDE2IEsKK0wyIENhY2hlICAgICAgICAgOiAgIDI1NiBLCitQQ0kgQlVTIFNwZWVkICAgIDogICAgMzMgTWh6CitUcmFuc2ZSYXRlIFBDSSAgIDogICAxMzIgTUIvcworTWVtb3J5ICAgICAgICAgICA6ICAgIDk2IE1CCisKK29wdGlvbnMgICAgZGVzIGVjYi9zICAgICAgIAorIDQgIGMgcCAgICAyNzUxMTguNjEgMTAwLjAlCisgNCAgYyBpICAgIDI3MzU0NS4wNyAgOTkuNCUKKyA0IHIyIHAgICAgMjcwNDQxLjAyICA5OC4zJQorIDQgcjEgcCAgICAyNTMwNTIuMTUgIDkyLjAlCisgNCByMiBpICAgIDI0MDg0Mi45NyAgODcuNSUKKyA0IHIxIGkgICAgMjQwNTU2LjY2ICA4Ny40JQorMTYgIGMgaSAgICAyMjQ2MDMuOTkgIDgxLjYlCisxNiAgYyBwICAgIDIyNDQ4My45OCAgODEuNiUKKzE2IHIyIHAgICAgMjE1NjkxLjE5ICA3OC40JQorMTYgcjEgcCAgICAyMDgzMzIuODMgIDc1LjclCisxNiByMSBpICAgIDE5OTIwNi41MCAgNzIuNCUKKzE2IHIyIGkgICAgMTk4OTYzLjcwICA3Mi4zJQorLURERVNfUFRSCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvYWxwaGEuY2MgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzL2FscGhhLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YzE3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzL2FscGhhLmNjCkBAIC0wLDAgKzEsMTggQEAKK2NjIC1PMgorREVTX0xPTkcgaXMgJ3Vuc2lnbmVkIGludCcKKworb3B0aW9ucyAgICBkZXMgZWNiL3MKKyA0IHIyIHAgICAgMTgxMTQ2LjE0IDEwMC4wJQorMTYgcjIgcCAgICAxNzIxMDIuOTQgIDk1LjAlCisgNCByMiBpICAgIDE2NTQyNC4xMSAgOTEuMyUKKzE2ICBjIHAgICAgMTYwNDY4LjY0ICA4OC42JQorIDQgIGMgcCAgICAxNTY2NTMuNTkgIDg2LjUlCisgNCAgYyBpICAgIDE1NTI0NS4xOCAgODUuNyUKKyA0IHIxIHAgICAgMTU0NzI5LjY4ICA4NS40JQorMTYgcjIgaSAgICAxNTQxMzcuNjkgIDg1LjElCisxNiByMSBwICAgIDE1MjM1Ny45NiAgODQuMSUKKzE2ICBjIGkgICAgMTQ4NzQzLjkxICA4Mi4xJQorIDQgcjEgaSAgICAxNDY2OTUuNTkgIDgxLjAlCisxNiByMSBpICAgIDE0NDk2MS4wMCAgODAuMCUKKy1EREVTX1JJU0MyIC1EREVTX1BUUgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzL2hwdXguY2MgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3RpbWVzL2hwdXguY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlODU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvaHB1eC5jYwpAQCAtMCwwICsxLDE3IEBACitIUFVYIDEwIC0gOTAwMC84ODcgLSBjYyAtRF9IUFVYX1NPVVJDRSAtQWEgK0VTbGl0ICtPMiAtV2wsLWEsYXJjaGl2ZQorCitvcHRpb25zICAgIGRlcyBlY2IvcworMTYgIGMgaSAgICAxNDk0NDguOTAgMTAwLjAlCisgNCAgYyBpICAgIDE0NTg2MS43OSAgOTcuNiUKKzE2IHIyIGkgICAgMTQxNzEwLjk2ICA5NC44JQorMTYgcjEgaSAgICAxMzk0NTUuMzMgIDkzLjMlCisgNCByMiBpICAgIDEzODgwMC4wMCAgOTIuOSUKKyA0IHIxIGkgICAgMTM2NjkyLjY1ICA5MS41JQorMTYgcjIgcCAgICAxMTAyMjguMTcgIDczLjglCisxNiByMSBwICAgIDEwOTM5Ny4wNyAgNzMuMiUKKzE2ICBjIHAgICAgMTA5MjA5Ljg5ICA3My4xJQorIDQgIGMgcCAgICAxMDgwMTQuNzEgIDcyLjMlCisgNCByMiBwICAgIDEwNzg3My44OCAgNzIuMiUKKyA0IHIxIHAgICAgMTA3Njg1LjgzICA3Mi4xJQorLURERVNfVU5ST0xMCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvc3BhcmMuZ2NjIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy90aW1lcy9zcGFyYy5nY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVhYTA0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvc3BhcmMuZ2NjCkBAIC0wLDAgKzEsMTcgQEAKK3NvbGFyaXMgMi41LjEgLSBzcGFyYyAxMCA1MG1oeiAtIGdjYyAyLjcuMgorCitvcHRpb25zICAgIGRlcyBlY2IvcworMTYgIGMgaSAgICAxMjQzODIuNzAgMTAwLjAlCisgNCAgYyBpICAgIDExODg4NC42OCAgOTUuNiUKKzE2ICBjIHAgICAgMTEyMjYxLjIwICA5MC4zJQorMTYgcjIgaSAgICAxMTE3NzcuMTAgIDg5LjklCisxNiByMiBwICAgIDEwODg5Ni4zMCAgODcuNSUKKzE2IHIxIHAgICAgMTA4NzkxLjU5ICA4Ny41JQorIDQgIGMgcCAgICAxMDcyOTAuMTAgIDg2LjMlCisgNCByMSBwICAgIDEwNDU4My44MCAgODQuMSUKKzE2IHIxIGkgICAgMTA0MjA2LjIwICA4My44JQorIDQgcjIgcCAgICAxMDM3MDkuODAgIDgzLjQlCisgNCByMiBpICAgICA5ODMwNi40MyAgNzkuMCUKKyA0IHIxIGkgICAgIDkxNTI1LjgwICA3My42JQorLURERVNfVU5ST0xMCisgICAgICAKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvdXNwYXJjLmNjIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy90aW1lcy91c3BhcmMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2NDI4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMvdGltZXMvdXNwYXJjLmNjCkBAIC0wLDAgKzEsMzEgQEAKK3NvbGFyaXMgMi41LjEgdXNwYXJjIDE2N21oej8/IC0gU0M0LjAgY2MgLWZhc3QgLVhhIC14TzUKKworRm9yIHRoZSB1bHRyYSBzcGFyYywgU3VuQyA0LjAgY2MgLWZhc3QgLVhhIC14TzUsIHJ1bm5pbmcgJ2Rlc19vcHRzJworZ2l2ZXMgYSBzcGVlZCBvZiA0NzUsMDAwIGRlcy9zIHdoaWxlICdzcGVlZCcgZ2l2ZXMgNDE3LDAwMCBkZXMvcy4KK0kgYmVsaWV2ZSB0aGUgZGlmZmVyZW5jZSBpcyB0aWVkIHVwIGluIG9wdGltaXNhdGlvbiB0aGF0IHRoZSBjb21waWxlcgoraXMgYWJsZSB0byBwZXJmb3JtIHdoZW4gdGhlIGNvZGUgaXMgJ2lubGluZWQnLiAgRm9yICdzcGVlZCcsIHRoZSBERVMKK3JvdXRpbmVzIGFyZSBiZWluZyBsaW5rZWQgZnJvbSBhIGxpYnJhcnkuICBJJ2xsIHJlY29yZCB0aGUgaGlnaGVyCitzcGVlZCBzaW5jZSBpZiBwZXJmb3JtYW5jZSBpcyBldmVyeXRoaW5nLCB5b3UgY2FuIGFsd2F5cyBpbmxpbmUKKydkZXNfZW5jLmMnLgorCitbIDE2LUphbi0wNiAtIEkndmUgYmVlbiBwbGF5aW5nIHdpdGggdGhlCisgICcteHRhcmdldD11bHRyYSAteGFyY2g9djhwbHVzIC1YYSAteE81IC1YYScKKyAgYW5kIHdoaWxlIGl0IG1ha2VzIHRoZSBkZXNfb3B0cyBudW1iZXJzIG11Y2ggc2xvd2VyLCBpdCBtYWtlcyB0aGUKKyAgYWN0dWFsICdzcGVlZCcgbnVtYmVycyBsb29rIGJldHRlciB3aGljaCBpcyBhIHJlYWxpc3RpYyB2ZXJzaW9uIG9mCisgIHVzaW5nIHRoZSBsaWJyYXJpZXMuIF0KKworb3B0aW9ucyAgICBkZXMgZWNiL3MKKzE2IHIxIHAgICAgNDc1NTE2LjkwIDEwMC4wJQorMTYgcjIgcCAgICA0MzkzODguMTAgIDkyLjQlCisxNiAgYyBpICAgIDQyNzAwMS40MCAgODkuOCUKKzE2ICBjIHAgICAgNDE5NTE2LjUwICA4OC4yJQorIDQgcjIgcCAgICA0MDk0OTEuNzAgIDg2LjElCisgNCByMSBwICAgIDQwNDI2Ni45MCAgODUuMCUKKyA0ICBjIHAgICAgMzk4MTIxLjAwICA4My43JQorIDQgIGMgaSAgICAzNzA1ODguNDAgIDc3LjklCisgNCByMSBpICAgIDM2Mjc0Mi4yMCAgNzYuMyUKKzE2IHIyIGkgICAgMzMxMjc1LjUwICA2OS43JQorMTYgcjEgaSAgICAzMjQ3MzAuNjAgIDY4LjMlCisgNCByMiBpICAgICA2MzUzNS4xMCAgMTMuNCUJPC0tIHZlcnkgdmVyeSB3ZWlyZCwgbXVzdCBiZSBjYWNoZSBwcm9ibGVtcy4KKy1EREVTX1VOUk9MTCAtRERFU19SSVNDMSAtRERFU19QVFIKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy90eXBlbWFwIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rlcy90eXBlbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MjRmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3R5cGVtYXAKQEAgLTAsMCArMSwzNCBAQAorIworIyBERVMgU0VDVElPTgorIworZGVzY2hhciAqCVRfREVTQ0hBUlAKK2Rlc19jYmxvY2sgKglUX0NCTE9DSworZGVzX2NibG9jawlUX0NCTE9DSworZGVzX2tleV9zY2hlZHVsZQlUX1NDSEVEVUxFCitkZXNfa2V5X3NjaGVkdWxlICoJVF9TQ0hFRFVMRQorCitJTlBVVAorVF9DQkxPQ0sKKwkkdmFyPShkZXNfY2Jsb2NrICopU3ZQVigkYXJnLGxlbik7CisJaWYgKGxlbiA8IERFU19LRVlfU1opCisJCXsKKwkJY3JvYWsoXCIkdmFyIG5lZWRzIHRvIGJlIGF0IGxlYXN0ICV1IGJ5dGVzIGxvbmdcIixERVNfS0VZX1NaKTsKKwkJfQorCitUX1NDSEVEVUxFCisJJHZhcj0oZGVzX2tleV9zY2hlZHVsZSAqKVN2UFYoJGFyZyxsZW4pOworCWlmIChsZW4gPCBERVNfU0NIRURVTEVfU1opCisJCXsKKwkJY3JvYWsoXCIkdmFyIG5lZWRzIHRvIGJlIGF0IGxlYXN0ICV1IGJ5dGVzIGxvbmdcIiwKKwkJCURFU19TQ0hFRFVMRV9TWik7CisJCX0KKworT1VUUFVUCitUX0NCTE9DSworCXN2X3NldHB2bigkYXJnLChjaGFyICopJHZhcixERVNfS0VZX1NaKTsKKworVF9TQ0hFRFVMRQorCXN2X3NldHB2bigkYXJnLChjaGFyICopJHZhcixERVNfU0NIRURVTEVfU1opOworCitUX0RFU0NIQVJQCisJc3Zfc2V0cHZuKCRhcmcsKGNoYXIgKikkdmFyLGxlbik7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3hjYmNfZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGVzL3hjYmNfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4Y2FiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kZXMveGNiY19lbmMuYwpAQCAtMCwwICsxLDE5NyBAQAorLyogY3J5cHRvL2Rlcy94Y2JjX2VuYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlICJkZXNfbG9jbC5oIgorCisvKiBSU0EncyBERVNYICovCisKKyNpZiAwIC8qIGJyb2tlbiBjb2RlLCBwcmVzZXJ2ZWQganVzdCBpbiBjYXNlIGFueW9uZSBzcGVjaWZpY2FsbHkgbG9va3MgZm9yIHRoaXMgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRlc3hfd2hpdGVfaW4yb3V0WzI1Nl09eworMHhCRCwweDU2LDB4RUEsMHhGMiwweEEyLDB4RjEsMHhBQywweDJBLDB4QjAsMHg5MywweEQxLDB4OUMsMHgxQiwweDMzLDB4RkQsMHhEMCwKKzB4MzAsMHgwNCwweEI2LDB4REMsMHg3RCwweERGLDB4MzIsMHg0QiwweEY3LDB4Q0IsMHg0NSwweDlCLDB4MzEsMHhCQiwweDIxLDB4NUEsCisweDQxLDB4OUYsMHhFMSwweEQ5LDB4NEEsMHg0RCwweDlFLDB4REEsMHhBMCwweDY4LDB4MkMsMHhDMywweDI3LDB4NUYsMHg4MCwweDM2LAorMHgzRSwweEVFLDB4RkIsMHg5NSwweDFBLDB4RkUsMHhDRSwweEE4LDB4MzQsMHhBOSwweDEzLDB4RjAsMHhBNiwweDNGLDB4RDgsMHgwQywKKzB4NzgsMHgyNCwweEFGLDB4MjMsMHg1MiwweEMxLDB4NjcsMHgxNywweEY1LDB4NjYsMHg5MCwweEU3LDB4RTgsMHgwNywweEI4LDB4NjAsCisweDQ4LDB4RTYsMHgxRSwweDUzLDB4RjMsMHg5MiwweEE0LDB4NzIsMHg4QywweDA4LDB4MTUsMHg2RSwweDg2LDB4MDAsMHg4NCwweEZBLAorMHhGNCwweDdGLDB4OEEsMHg0MiwweDE5LDB4RjYsMHhEQiwweENELDB4MTQsMHg4RCwweDUwLDB4MTIsMHhCQSwweDNDLDB4MDYsMHg0RSwKKzB4RUMsMHhCMywweDM1LDB4MTEsMHhBMSwweDg4LDB4OEUsMHgyQiwweDk0LDB4OTksMHhCNywweDcxLDB4NzQsMHhEMywweEU0LDB4QkYsCisweDNBLDB4REUsMHg5NiwweDBFLDB4QkMsMHgwQSwweEVELDB4NzcsMHhGQywweDM3LDB4NkIsMHgwMywweDc5LDB4ODksMHg2MiwweEM2LAorMHhENywweEMwLDB4RDIsMHg3QywweDZBLDB4OEIsMHgyMiwweEEzLDB4NUIsMHgwNSwweDVELDB4MDIsMHg3NSwweEQ1LDB4NjEsMHhFMywKKzB4MTgsMHg4RiwweDU1LDB4NTEsMHhBRCwweDFGLDB4MEIsMHg1RSwweDg1LDB4RTUsMHhDMiwweDU3LDB4NjMsMHhDQSwweDNELDB4NkMsCisweEI0LDB4QzUsMHhDQywweDcwLDB4QjIsMHg5MSwweDU5LDB4MEQsMHg0NywweDIwLDB4QzgsMHg0RiwweDU4LDB4RTAsMHgwMSwweEUyLAorMHgxNiwweDM4LDB4QzQsMHg2RiwweDNCLDB4MEYsMHg2NSwweDQ2LDB4QkUsMHg3RSwweDJELDB4N0IsMHg4MiwweEY5LDB4NDAsMHhCNSwKKzB4MUQsMHg3MywweEY4LDB4RUIsMHgyNiwweEM3LDB4ODcsMHg5NywweDI1LDB4NTQsMHhCMSwweDI4LDB4QUEsMHg5OCwweDlELDB4QTUsCisweDY0LDB4NkQsMHg3QSwweEQ0LDB4MTAsMHg4MSwweDQ0LDB4RUYsMHg0OSwweEQ2LDB4QUUsMHgyRSwweERELDB4NzYsMHg1QywweDJGLAorMHhBNywweDFDLDB4QzksMHgwOSwweDY5LDB4OUEsMHg4MywweENGLDB4MjksMHgzOSwweEI5LDB4RTksMHg0QywweEZGLDB4NDMsMHhBQiwKKwl9OworCit2b2lkIERFU194d2hpdGVfaW4yb3V0KGNvbnN0X0RFU19jYmxvY2sgKmRlc19rZXksIGNvbnN0X0RFU19jYmxvY2sgKmluX3doaXRlLAorCSAgICAgREVTX2NibG9jayAqb3V0X3doaXRlKQorCXsKKwlpbnQgb3V0MCxvdXQxOworCWludCBpOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSA9ICYoKmRlc19rZXkpWzBdOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluID0gJigqaW5fd2hpdGUpWzBdOworCXVuc2lnbmVkIGNoYXIgKm91dCA9ICYoKm91dF93aGl0ZSlbMF07CisKKwlvdXRbMF09b3V0WzFdPW91dFsyXT1vdXRbM109b3V0WzRdPW91dFs1XT1vdXRbNl09b3V0WzddPTA7CisJb3V0MD1vdXQxPTA7CisJZm9yIChpPTA7IGk8ODsgaSsrKQorCQl7CisJCW91dFtpXT1rZXlbaV1eZGVzeF93aGl0ZV9pbjJvdXRbb3V0MF5vdXQxXTsKKwkJb3V0MD1vdXQxOworCQlvdXQxPShpbnQpb3V0W2kmMHgwN107CisJCX0KKworCW91dDA9b3V0WzBdOworCW91dDE9b3V0W2ldOyAvKiBCVUc6IG91dC1vZi1ib3VuZHMgcmVhZCAqLworCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQlvdXRbaV09aW5baV1eZGVzeF93aGl0ZV9pbjJvdXRbb3V0MF5vdXQxXTsKKwkJb3V0MD1vdXQxOworCQlvdXQxPShpbnQpb3V0W2kmMHgwN107CisJCX0KKwl9CisjZW5kaWYKKwordm9pZCBERVNfeGNiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgIGxvbmcgbGVuZ3RoLCBERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSwKKwkJICAgICAgREVTX2NibG9jayAqaXZlYywgY29uc3RfREVTX2NibG9jayAqaW53LAorCQkgICAgICBjb25zdF9ERVNfY2Jsb2NrICpvdXR3LCBpbnQgZW5jKQorCXsKKwlyZWdpc3RlciBERVNfTE9ORyB0aW4wLHRpbjE7CisJcmVnaXN0ZXIgREVTX0xPTkcgdG91dDAsdG91dDEseG9yMCx4b3IxOworCXJlZ2lzdGVyIERFU19MT05HIGluVzAsaW5XMSxvdXRXMCxvdXRXMTsKKwlyZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICppbjI7CisJcmVnaXN0ZXIgbG9uZyBsPWxlbmd0aDsKKwlERVNfTE9ORyB0aW5bMl07CisJdW5zaWduZWQgY2hhciAqaXY7CisKKwlpbjIgPSAmKCppbncpWzBdOworCWMybChpbjIsaW5XMCk7CisJYzJsKGluMixpblcxKTsKKwlpbjIgPSAmKCpvdXR3KVswXTsKKwljMmwoaW4yLG91dFcwKTsKKwljMmwoaW4yLG91dFcxKTsKKworCWl2ID0gJigqaXZlYylbMF07CisKKwlpZiAoZW5jKQorCQl7CisJCWMybChpdix0b3V0MCk7CisJCWMybChpdix0b3V0MSk7CisJCWZvciAobC09ODsgbD49MDsgbC09OCkKKwkJCXsKKwkJCWMybChpbix0aW4wKTsKKwkJCWMybChpbix0aW4xKTsKKwkJCXRpbjBePXRvdXQwXmluVzA7IHRpblswXT10aW4wOworCQkJdGluMV49dG91dDFeaW5XMTsgdGluWzFdPXRpbjE7CisJCQlERVNfZW5jcnlwdDEodGluLHNjaGVkdWxlLERFU19FTkNSWVBUKTsKKwkJCXRvdXQwPXRpblswXV5vdXRXMDsgbDJjKHRvdXQwLG91dCk7CisJCQl0b3V0MT10aW5bMV1eb3V0VzE7IGwyYyh0b3V0MSxvdXQpOworCQkJfQorCQlpZiAobCAhPSAtOCkKKwkJCXsKKwkJCWMybG4oaW4sdGluMCx0aW4xLGwrOCk7CisJCQl0aW4wXj10b3V0MF5pblcwOyB0aW5bMF09dGluMDsKKwkJCXRpbjFePXRvdXQxXmluVzE7IHRpblsxXT10aW4xOworCQkJREVTX2VuY3J5cHQxKHRpbixzY2hlZHVsZSxERVNfRU5DUllQVCk7CisJCQl0b3V0MD10aW5bMF1eb3V0VzA7IGwyYyh0b3V0MCxvdXQpOworCQkJdG91dDE9dGluWzFdXm91dFcxOyBsMmModG91dDEsb3V0KTsKKwkJCX0KKwkJaXYgPSAmKCppdmVjKVswXTsKKwkJbDJjKHRvdXQwLGl2KTsKKwkJbDJjKHRvdXQxLGl2KTsKKwkJfQorCWVsc2UKKwkJeworCQljMmwoaXYseG9yMCk7CisJCWMybChpdix4b3IxKTsKKwkJZm9yIChsLT04OyBsPjA7IGwtPTgpCisJCQl7CisJCQljMmwoaW4sdGluMCk7IHRpblswXT10aW4wXm91dFcwOworCQkJYzJsKGluLHRpbjEpOyB0aW5bMV09dGluMV5vdXRXMTsKKwkJCURFU19lbmNyeXB0MSh0aW4sc2NoZWR1bGUsREVTX0RFQ1JZUFQpOworCQkJdG91dDA9dGluWzBdXnhvcjBeaW5XMDsKKwkJCXRvdXQxPXRpblsxXV54b3IxXmluVzE7CisJCQlsMmModG91dDAsb3V0KTsKKwkJCWwyYyh0b3V0MSxvdXQpOworCQkJeG9yMD10aW4wOworCQkJeG9yMT10aW4xOworCQkJfQorCQlpZiAobCAhPSAtOCkKKwkJCXsKKwkJCWMybChpbix0aW4wKTsgdGluWzBdPXRpbjBeb3V0VzA7CisJCQljMmwoaW4sdGluMSk7IHRpblsxXT10aW4xXm91dFcxOworCQkJREVTX2VuY3J5cHQxKHRpbixzY2hlZHVsZSxERVNfREVDUllQVCk7CisJCQl0b3V0MD10aW5bMF1eeG9yMF5pblcwOworCQkJdG91dDE9dGluWzFdXnhvcjFeaW5XMTsKKwkJCWwyY24odG91dDAsdG91dDEsb3V0LGwrOCk7CisJCQl4b3IwPXRpbjA7CisJCQl4b3IxPXRpbjE7CisJCQl9CisKKwkJaXYgPSAmKCppdmVjKVswXTsKKwkJbDJjKHhvcjAsaXYpOworCQlsMmMoeG9yMSxpdik7CisJCX0KKwl0aW4wPXRpbjE9dG91dDA9dG91dDE9eG9yMD14b3IxPTA7CisJaW5XMD1pblcxPW91dFcwPW91dFcxPTA7CisJdGluWzBdPXRpblsxXT0wOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDkzMDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoLmgKQEAgLTAsMCArMSwyNjAgQEAKKy8qIGNyeXB0by9kaC9kaC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX0RIX0gKKyNkZWZpbmUgSEVBREVSX0RIX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworI2lmZGVmIE9QRU5TU0xfTk9fREgKKyNlcnJvciBESCBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2VuZGlmCisJCisjaWZuZGVmIE9QRU5TU0xfREhfTUFYX01PRFVMVVNfQklUUworIyBkZWZpbmUgT1BFTlNTTF9ESF9NQVhfTU9EVUxVU19CSVRTCTEwMDAwCisjZW5kaWYKKworI2RlZmluZSBESF9GTEFHX0NBQ0hFX01PTlRfUCAgICAgMHgwMQorI2RlZmluZSBESF9GTEFHX05PX0VYUF9DT05TVFRJTUUgMHgwMiAvKiBuZXcgd2l0aCAwLjkuN2g7IHRoZSBidWlsdC1pbiBESAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBub3cgdXNlcyBjb25zdGFudCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZHVsYXIgZXhwb25lbnRpYXRpb24gZm9yIHNlY3JldCBleHBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnkgZGVmYXVsdC4gVGhpcyBmbGFnIGNhdXNlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmFzdGVyIHZhcmlhYmxlIHNsaWRpbmcgd2luZG93IG1ldGhvZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSB1c2VkIGZvciBhbGwgZXhwb25lbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQWxyZWFkeSBkZWZpbmVkIGluIG9zc2xfdHlwLmggKi8KKy8qIHR5cGVkZWYgc3RydWN0IGRoX3N0IERIOyAqLworLyogdHlwZWRlZiBzdHJ1Y3QgZGhfbWV0aG9kIERIX01FVEhPRDsgKi8KKworc3RydWN0IGRoX21ldGhvZAorCXsKKwljb25zdCBjaGFyICpuYW1lOworCS8qIE1ldGhvZHMgaGVyZSAqLworCWludCAoKmdlbmVyYXRlX2tleSkoREggKmRoKTsKKwlpbnQgKCpjb21wdXRlX2tleSkodW5zaWduZWQgY2hhciAqa2V5LGNvbnN0IEJJR05VTSAqcHViX2tleSxESCAqZGgpOworCWludCAoKmJuX21vZF9leHApKGNvbnN0IERIICpkaCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCisJCQkJY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LAorCQkJCUJOX01PTlRfQ1RYICptX2N0eCk7IC8qIENhbiBiZSBudWxsICovCisKKwlpbnQgKCppbml0KShESCAqZGgpOworCWludCAoKmZpbmlzaCkoREggKmRoKTsKKwlpbnQgZmxhZ3M7CisJY2hhciAqYXBwX2RhdGE7CisJLyogSWYgdGhpcyBpcyBub24tTlVMTCwgaXQgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIHBhcmFtZXRlcnMgKi8KKwlpbnQgKCpnZW5lcmF0ZV9wYXJhbXMpKERIICpkaCwgaW50IHByaW1lX2xlbiwgaW50IGdlbmVyYXRvciwgQk5fR0VOQ0IgKmNiKTsKKwl9OworCitzdHJ1Y3QgZGhfc3QKKwl7CisJLyogVGhpcyBmaXJzdCBhcmd1bWVudCBpcyB1c2VkIHRvIHBpY2sgdXAgZXJyb3JzIHdoZW4KKwkgKiBhIERIIGlzIHBhc3NlZCBpbnN0ZWFkIG9mIGEgRVZQX1BLRVkgKi8KKwlpbnQgcGFkOworCWludCB2ZXJzaW9uOworCUJJR05VTSAqcDsKKwlCSUdOVU0gKmc7CisJbG9uZyBsZW5ndGg7IC8qIG9wdGlvbmFsICovCisJQklHTlVNICpwdWJfa2V5OwkvKiBnXnggKi8KKwlCSUdOVU0gKnByaXZfa2V5OwkvKiB4ICovCisKKwlpbnQgZmxhZ3M7CisJQk5fTU9OVF9DVFggKm1ldGhvZF9tb250X3A7CisJLyogUGxhY2UgaG9sZGVycyBpZiB3ZSB3YW50IHRvIGRvIFg5LjQyIERIICovCisJQklHTlVNICpxOworCUJJR05VTSAqajsKKwl1bnNpZ25lZCBjaGFyICpzZWVkOworCWludCBzZWVkbGVuOworCUJJR05VTSAqY291bnRlcjsKKworCWludCByZWZlcmVuY2VzOworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisJY29uc3QgREhfTUVUSE9EICptZXRoOworCUVOR0lORSAqZW5naW5lOworCX07CisKKyNkZWZpbmUgREhfR0VORVJBVE9SXzIJCTIKKy8qICNkZWZpbmUgREhfR0VORVJBVE9SXzMJMyAqLworI2RlZmluZSBESF9HRU5FUkFUT1JfNQkJNQorCisvKiBESF9jaGVjayBlcnJvciBjb2RlcyAqLworI2RlZmluZSBESF9DSEVDS19QX05PVF9QUklNRQkJMHgwMQorI2RlZmluZSBESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FCTB4MDIKKyNkZWZpbmUgREhfVU5BQkxFX1RPX0NIRUNLX0dFTkVSQVRPUgkweDA0CisjZGVmaW5lIERIX05PVF9TVUlUQUJMRV9HRU5FUkFUT1IJMHgwOAorCisvKiBESF9jaGVja19wdWJfa2V5IGVycm9yIGNvZGVzICovCisjZGVmaW5lIERIX0NIRUNLX1BVQktFWV9UT09fU01BTEwJMHgwMQorI2RlZmluZSBESF9DSEVDS19QVUJLRVlfVE9PX0xBUkdFCTB4MDIKKworLyogcHJpbWVzIHAgd2hlcmUgKHAtMSkvMiBpcyBwcmltZSB0b28gYXJlIGNhbGxlZCAic2FmZSI7IHdlIGRlZmluZQorICAgdGhpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eTogKi8KKyNkZWZpbmUgREhfQ0hFQ0tfUF9OT1RfU1RST05HX1BSSU1FCURIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUUKKworI2RlZmluZSBkMmlfREhwYXJhbXNfZnAoZnAseCkgKERIICopQVNOMV9kMmlfZnAoKGNoYXIgKigqKSgpKURIX25ldywgXAorCQkoY2hhciAqKCopKCkpZDJpX0RIcGFyYW1zLChmcCksKHVuc2lnbmVkIGNoYXIgKiopKHgpKQorI2RlZmluZSBpMmRfREhwYXJhbXNfZnAoZnAseCkgQVNOMV9pMmRfZnAoaTJkX0RIcGFyYW1zLChmcCksIFwKKwkJKHVuc2lnbmVkIGNoYXIgKikoeCkpCisjZGVmaW5lIGQyaV9ESHBhcmFtc19iaW8oYnAseCkgQVNOMV9kMmlfYmlvX29mKERILERIX25ldyxkMmlfREhwYXJhbXMsYnAseCkKKyNkZWZpbmUgaTJkX0RIcGFyYW1zX2JpbyhicCx4KSBBU04xX2kyZF9iaW9fb2ZfY29uc3QoREgsaTJkX0RIcGFyYW1zLGJwLHgpCisKK0RIICpESHBhcmFtc19kdXAoREggKik7CisKK2NvbnN0IERIX01FVEhPRCAqREhfT3BlblNTTCh2b2lkKTsKKwordm9pZCBESF9zZXRfZGVmYXVsdF9tZXRob2QoY29uc3QgREhfTUVUSE9EICptZXRoKTsKK2NvbnN0IERIX01FVEhPRCAqREhfZ2V0X2RlZmF1bHRfbWV0aG9kKHZvaWQpOworaW50IERIX3NldF9tZXRob2QoREggKmRoLCBjb25zdCBESF9NRVRIT0QgKm1ldGgpOworREggKkRIX25ld19tZXRob2QoRU5HSU5FICplbmdpbmUpOworCitESCAqCURIX25ldyh2b2lkKTsKK3ZvaWQJREhfZnJlZShESCAqZGgpOworaW50CURIX3VwX3JlZihESCAqZGgpOworaW50CURIX3NpemUoY29uc3QgREggKmRoKTsKK2ludCBESF9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgREhfc2V0X2V4X2RhdGEoREggKmQsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkICpESF9nZXRfZXhfZGF0YShESCAqZCwgaW50IGlkeCk7CisKKy8qIERlcHJlY2F0ZWQgdmVyc2lvbiAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK0RIICoJREhfZ2VuZXJhdGVfcGFyYW1ldGVycyhpbnQgcHJpbWVfbGVuLGludCBnZW5lcmF0b3IsCisJCXZvaWQgKCpjYWxsYmFjaykoaW50LGludCx2b2lkICopLHZvaWQgKmNiX2FyZyk7CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19ERVBSRUNBVEVEKSAqLworCisvKiBOZXcgdmVyc2lvbiAqLworaW50CURIX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoREggKmRoLCBpbnQgcHJpbWVfbGVuLGludCBnZW5lcmF0b3IsIEJOX0dFTkNCICpjYik7CisKK2ludAlESF9jaGVjayhjb25zdCBESCAqZGgsaW50ICpjb2Rlcyk7CitpbnQJREhfY2hlY2tfcHViX2tleShjb25zdCBESCAqZGgsY29uc3QgQklHTlVNICpwdWJfa2V5LCBpbnQgKmNvZGVzKTsKK2ludAlESF9nZW5lcmF0ZV9rZXkoREggKmRoKTsKK2ludAlESF9jb21wdXRlX2tleSh1bnNpZ25lZCBjaGFyICprZXksY29uc3QgQklHTlVNICpwdWJfa2V5LERIICpkaCk7CitESCAqCWQyaV9ESHBhcmFtcyhESCAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCk7CitpbnQJaTJkX0RIcGFyYW1zKGNvbnN0IERIICphLHVuc2lnbmVkIGNoYXIgKipwcCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQJREhwYXJhbXNfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IERIICp4KTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTworaW50CURIcGFyYW1zX3ByaW50KEJJTyAqYnAsIGNvbnN0IERIICp4KTsKKyNlbHNlCitpbnQJREhwYXJhbXNfcHJpbnQoY2hhciAqYnAsIGNvbnN0IERIICp4KTsKKyNlbmRpZgorCisjZGVmaW5lIEVWUF9QS0VZX0NUWF9zZXRfZGhfcGFyYW1nZW5fcHJpbWVfbGVuKGN0eCwgbGVuKSBcCisJRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCBFVlBfUEtFWV9ESCwgRVZQX1BLRVlfT1BfUEFSQU1HRU4sIFwKKwkJCUVWUF9QS0VZX0NUUkxfREhfUEFSQU1HRU5fUFJJTUVfTEVOLCBsZW4sIE5VTEwpCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RYX3NldF9kaF9wYXJhbWdlbl9nZW5lcmF0b3IoY3R4LCBnZW4pIFwKKwlFVlBfUEtFWV9DVFhfY3RybChjdHgsIEVWUF9QS0VZX0RILCBFVlBfUEtFWV9PUF9QQVJBTUdFTiwgXAorCQkJRVZQX1BLRVlfQ1RSTF9ESF9QQVJBTUdFTl9HRU5FUkFUT1IsIGdlbiwgTlVMTCkKKworI2RlZmluZQlFVlBfUEtFWV9DVFJMX0RIX1BBUkFNR0VOX1BSSU1FX0xFTgkoRVZQX1BLRVlfQUxHX0NUUkwgKyAxKQorI2RlZmluZQlFVlBfUEtFWV9DVFJMX0RIX1BBUkFNR0VOX0dFTkVSQVRPUgkoRVZQX1BLRVlfQUxHX0NUUkwgKyAyKQorCQkKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9ESF9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIERIIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIERIX0ZfQ09NUFVURV9LRVkJCQkJIDEwMgorI2RlZmluZSBESF9GX0RIUEFSQU1TX1BSSU5UX0ZQCQkJCSAxMDEKKyNkZWZpbmUgREhfRl9ESF9CVUlMVElOX0dFTlBBUkFNUwkJCSAxMDYKKyNkZWZpbmUgREhfRl9ESF9ORVdfTUVUSE9ECQkJCSAxMDUKKyNkZWZpbmUgREhfRl9ESF9QQVJBTV9ERUNPREUJCQkJIDEwNworI2RlZmluZSBESF9GX0RIX1BSSVZfREVDT0RFCQkJCSAxMTAKKyNkZWZpbmUgREhfRl9ESF9QUklWX0VOQ09ERQkJCQkgMTExCisjZGVmaW5lIERIX0ZfREhfUFVCX0RFQ09ERQkJCQkgMTA4CisjZGVmaW5lIERIX0ZfREhfUFVCX0VOQ09ERQkJCQkgMTA5CisjZGVmaW5lIERIX0ZfRE9fREhfUFJJTlQJCQkJIDEwMAorI2RlZmluZSBESF9GX0dFTkVSQVRFX0tFWQkJCQkgMTAzCisjZGVmaW5lIERIX0ZfR0VORVJBVEVfUEFSQU1FVEVSUwkJCSAxMDQKKyNkZWZpbmUgREhfRl9QS0VZX0RIX0RFUklWRQkJCQkgMTEyCisjZGVmaW5lIERIX0ZfUEtFWV9ESF9LRVlHRU4JCQkJIDExMworCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIERIX1JfQkFEX0dFTkVSQVRPUgkJCQkgMTAxCisjZGVmaW5lIERIX1JfQk5fREVDT0RFX0VSUk9SCQkJCSAxMDkKKyNkZWZpbmUgREhfUl9CTl9FUlJPUgkJCQkJIDEwNgorI2RlZmluZSBESF9SX0RFQ09ERV9FUlJPUgkJCQkgMTA0CisjZGVmaW5lIERIX1JfSU5WQUxJRF9QVUJLRVkJCQkJIDEwMgorI2RlZmluZSBESF9SX0tFWVNfTk9UX1NFVAkJCQkgMTA4CisjZGVmaW5lIERIX1JfTU9EVUxVU19UT09fTEFSR0UJCQkJIDEwMworI2RlZmluZSBESF9SX05PX1BBUkFNRVRFUlNfU0VUCQkJCSAxMDcKKyNkZWZpbmUgREhfUl9OT19QUklWQVRFX1ZBTFVFCQkJCSAxMDAKKyNkZWZpbmUgREhfUl9QQVJBTUVURVJfRU5DT0RJTkdfRVJST1IJCQkgMTA1CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGgxMDI0LnBlbSBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaDEwMjQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDQzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGgxMDI0LnBlbQpAQCAtMCwwICsxLDUgQEAKKy0tLS0tQkVHSU4gREggUEFSQU1FVEVSUy0tLS0tCitNSUdIQW9HQkFKZjJRbUhLdFFYZEtDamhQeDFvdHRQYjBQTVRCSDlBNkZiYVdNc1R1S0cvSzNnNlRHMVoxZmtxCisvR3ovUFdrL2VMSTlUekZncVZBdVB2cjNxMTRhMWFaZVZVTVRnbzJvTzUveTJVSGU2VmFKK3RycUNUYXQzeGx4CisvbU5iSUs5SEEyUmdQQzNnV2ZWTFpRclkrZ3ozQVNISFI1blhXSEV5dnB1Wm03bTNoK2lyQWdFQworLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGgxOTIucGVtIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoMTkyLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFjMDcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoMTkyLnBlbQpAQCAtMCwwICsxLDMgQEAKKy0tLS0tQkVHSU4gREggUEFSQU1FVEVSUy0tLS0tCitNQjRDR1FEVW9Mb0NVTGI5THNZbTUrL1dOOTkyeHhiaUxRbEV1SXNDQVFNPQorLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGgyMDQ4LnBlbSBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaDIwNDgucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTQ2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGgyMDQ4LnBlbQpAQCAtMCwwICsxLDE2IEBACistLS0tLUJFR0lOIERIIFBBUkFNRVRFUlMtLS0tLQorTUlJQkNBS0NBUUVBN1pLSk5ZSkZWY3M3KzZKMldta0VZYjhoODZ0VDBzMGgydjk0R1JGUzhRN0I0bFc5YUc5bworQUZPNUltb3Y1Sm8wSDJYTVdUS0t2YkhiU2UzZnB4Sm13LzBoQkhBWThIL1c5MWhSR1hLQ2V5S3BOQmdkTDhzaAorejIyU3JrTzJxQ25ISjZQTEFNWHk1ZnNLcEZtRm9yMnRSZkN6cmZuZ2dUWHUyWU96eks3cTYyYm1xVmRtdWZFbworcFQ4aWdOY0xwdlp4azV1QkR2aGFrT2JNeW05bVgzckFFQm9lOFB3dHRnZ01ZaWl3N051SktPNE1xRDFsbEdrVworYVZNOFUyQVRzQ3VuMUlLSHJSeHlua0UxL01KODZWSGVZWVg4R1p0MllBOHorR3V6eWxJT0tjTUg2SkFXek13QQorR2JhdHc2UXdpek9ocjlpTWpaMEIyNlRFM1g4THZXODR3d0lCQWc9PQorLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCistLS0tLUJFR0lOIERIIFBBUkFNRVRFUlMtLS0tLQorTUlJQkNBS0NBUUVBcnRBM3c3M3pQNkx1M0VPUXR3b2dpWHQzQVhYcHVTNnlENEJoek5TMXBaRnlQSGswL2FuNQorOHlkRWtQaFFaSEtEVytCWkp4eFBMQU5hVHVkV28yWVQ4VGd0dlVkTjZLU2dNaUVpNk1jd3FEdytTQUR1dlcrRgorU0tVWUZ4RzZWRkl4eUVQNnhCZGYrdmhKeEVEYlJHMkVZc0hEUlJ0Sjc2Z3A5Y1NLVEh1c2YyUis0QUFWR3FudAorZ1JBYk5xdGNPYXIvN0ZTaitQbDhHM3YwQnR5MExjQ1NwYnFnWWxudjZ6K3JFclFtbUM2UFB2U3o5N1RETUNvaworeUtwQ0U5aEZBMXprcUszVEg0Rm1GdkdlSWFYSlVJQlpmNG1Bcld1QlRqV0ZXM25taEVTUlVuMVZLM0szeDQyTgorYTVrNmMyK0Vock1GaUxqeHVINkpab3FMMC9FOTNGRjlTd0lCQWc9PQorLS0tLS1FTkQgREggUEFSQU1FVEVSUy0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGg0MDk2LnBlbSBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaDQwOTYucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDk0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGg0MDk2LnBlbQpAQCAtMCwwICsxLDE0IEBACistLS0tLUJFR0lOIERIIFBBUkFNRVRFUlMtLS0tLQorTUlJQ0NBS0NBZ0VBL3VyUm5iNnZrUFljL0tFR1hXbmJDSU9hS2l0cTd5U0lxOWRUSDdzK1JpNTl6czc3enR5NwordmZWbFNlNlZGVEJXZ1lqRDJYS1VGbXRxcTZDcVhNaFZYNUVsVURvWURwQXlUSDg1eHFORkx6RkM3bktyZmYvSAorVEZLTnR0cDIyY1pFOVYwSVBwemVkUGZuUWtFN2FVZG1GOUpuRHl2MjFaLzgxOE85M3UxQjRyMHN6ZG5tRXZFRgorYkt1SXhFSFgrYnAwWlI3UnFFMUFlaWZYR0pYM2Q2dHNkMlBNQU9ieHd3c3Y1NVJHa241MHZITzRReHRUQVJyMQorclJVVjVqM0Izb1BNZ0M3T2ZmeHgrOThYbjQ1QjEvRzBQcnAxMWFuRHNSMVBHd3RhQ1lpcHFzdk13UVVTSnR5RQorRU9RV2sreUZrZU1lNHZXdjM2N2VFaTBTZC93bkMrVFNYQkUzcFl2cFllcko4bjFNY2VJNUdRVGRhcko3N09XOQorYkdUSG14UnNMU0NNMWpwTGRQamE1ampiNHNpQWE2RUhjNHFOOWMvaUZLUzNQUVBKRW5YN3BYS0JSczVmN0FGMworVzNSSUd0K0c5SVZOWmZYYVM3Wi9pQ3Bnemd2S0NzMFZlcU4zOFFzSkd0QzFhSWt3T2V5alBOeTJHNmpKNHlxSAorb3ZYWXQvMG1jMDB2Q1dlU05TMXdyZW4wcFIyRWlMeFgweXBqamdzVTFtay9aM2IvK3pWZjdmWlNJQituRExqYgorTlB0VWxKQ1ZHbkFlQksxSjFuRzNUUWljcW93T1hvTTZJU2tkYVhqNUdQSmRYSGFiMitTN2NxaEtHdjVxQzdyUgoralQ2c3g3UlVyMENOVHh6TEk3bXVWMi9hNHRHbWowUFNkWFFkc1o3dHc3Z2JYbGFXVDErTU0yTUNBUUk9CistLS0tLUVORCBESCBQQVJBTUVURVJTLS0tLS0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoNTEyLnBlbSBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaDUxMi5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0ZDg2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaDUxMi5wZW0KQEAgLTAsMCArMSw0IEBACistLS0tLUJFR0lOIERIIFBBUkFNRVRFUlMtLS0tLQorTUVZQ1FRRGFXRHdXMllVaWlkRGtyM1Z2VE1xUzNVdmxNN2dFK3cvdGxPK2Npa1FEN1ZkR1VOTnBtZHNwMTNZbgorYTZMVDFCTGlHUFRkSGdoTTl0Z0FQbnhIZE9nekFnRUMKKy0tLS0tRU5EIERIIFBBUkFNRVRFUlMtLS0tLQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2FtZXRoLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGhfYW1ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzdjYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2FtZXRoLmMKQEAgLTAsMCArMSw1MDAgQEAKKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA2LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlICJhc24xX2xvY2wuaCIKKworc3RhdGljIHZvaWQgaW50X2RoX2ZyZWUoRVZQX1BLRVkgKnBrZXkpCisJeworCURIX2ZyZWUocGtleS0+cGtleS5kaCk7CisJfQorCitzdGF0aWMgaW50IGRoX3B1Yl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIFg1MDlfUFVCS0VZICpwdWJrZXkpCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsICpwbTsKKwlpbnQgcGtsZW4sIHBtbGVuOworCWludCBwdHlwZTsKKwl2b2lkICpwdmFsOworCUFTTjFfU1RSSU5HICpwc3RyOworCVg1MDlfQUxHT1IgKnBhbGc7CisJQVNOMV9JTlRFR0VSICpwdWJsaWNfa2V5ID0gTlVMTDsKKworCURIICpkaCA9IE5VTEw7CisKKwlpZiAoIVg1MDlfUFVCS0VZX2dldDBfcGFyYW0oTlVMTCwgJnAsICZwa2xlbiwgJnBhbGcsIHB1YmtleSkpCisJCXJldHVybiAwOworCVg1MDlfQUxHT1JfZ2V0MChOVUxMLCAmcHR5cGUsICZwdmFsLCBwYWxnKTsKKworCWlmIChwdHlwZSAhPSBWX0FTTjFfU0VRVUVOQ0UpCisJCXsKKwkJREhlcnIoREhfRl9ESF9QVUJfREVDT0RFLCBESF9SX1BBUkFNRVRFUl9FTkNPRElOR19FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisKKwlwc3RyID0gcHZhbDsJCisJcG0gPSBwc3RyLT5kYXRhOworCXBtbGVuID0gcHN0ci0+bGVuZ3RoOworCisJaWYgKCEoZGggPSBkMmlfREhwYXJhbXMoTlVMTCwgJnBtLCBwbWxlbikpKQorCQl7CisJCURIZXJyKERIX0ZfREhfUFVCX0RFQ09ERSwgREhfUl9ERUNPREVfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKCEocHVibGljX2tleT1kMmlfQVNOMV9JTlRFR0VSKE5VTEwsICZwLCBwa2xlbikpKQorCQl7CisJCURIZXJyKERIX0ZfREhfUFVCX0RFQ09ERSwgREhfUl9ERUNPREVfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogV2UgaGF2ZSBwYXJhbWV0ZXJzIG5vdyBzZXQgcHVibGljIGtleSAqLworCWlmICghKGRoLT5wdWJfa2V5ID0gQVNOMV9JTlRFR0VSX3RvX0JOKHB1YmxpY19rZXksIE5VTEwpKSkKKwkJeworCQlESGVycihESF9GX0RIX1BVQl9ERUNPREUsIERIX1JfQk5fREVDT0RFX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKworCUFTTjFfSU5URUdFUl9mcmVlKHB1YmxpY19rZXkpOworCUVWUF9QS0VZX2Fzc2lnbl9ESChwa2V5LCBkaCk7CisJcmV0dXJuIDE7CisKKwllcnI6CisJaWYgKHB1YmxpY19rZXkpCisJCUFTTjFfSU5URUdFUl9mcmVlKHB1YmxpY19rZXkpOworCWlmIChkaCkKKwkJREhfZnJlZShkaCk7CisJcmV0dXJuIDA7CisKKwl9CisKK3N0YXRpYyBpbnQgZGhfcHViX2VuY29kZShYNTA5X1BVQktFWSAqcGssIGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlESCAqZGg7CisJdm9pZCAqcHZhbCA9IE5VTEw7CisJaW50IHB0eXBlOworCXVuc2lnbmVkIGNoYXIgKnBlbmMgPSBOVUxMOworCWludCBwZW5jbGVuOworCUFTTjFfU1RSSU5HICpzdHI7CisJQVNOMV9JTlRFR0VSICpwdWJfa2V5ID0gTlVMTDsKKworCWRoPXBrZXktPnBrZXkuZGg7CisKKwlzdHIgPSBBU04xX1NUUklOR19uZXcoKTsKKwlzdHItPmxlbmd0aCA9IGkyZF9ESHBhcmFtcyhkaCwgJnN0ci0+ZGF0YSk7CisJaWYgKHN0ci0+bGVuZ3RoIDw9IDApCisJCXsKKwkJREhlcnIoREhfRl9ESF9QVUJfRU5DT0RFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisJcHZhbCA9IHN0cjsKKwlwdHlwZSA9IFZfQVNOMV9TRVFVRU5DRTsKKworCXB1Yl9rZXkgPSBCTl90b19BU04xX0lOVEVHRVIoZGgtPnB1Yl9rZXksIE5VTEwpOworCWlmICghcHViX2tleSkKKwkJZ290byBlcnI7CisKKwlwZW5jbGVuID0gaTJkX0FTTjFfSU5URUdFUihwdWJfa2V5LCAmcGVuYyk7CisKKwlBU04xX0lOVEVHRVJfZnJlZShwdWJfa2V5KTsKKworCWlmIChwZW5jbGVuIDw9IDApCisJCXsKKwkJREhlcnIoREhfRl9ESF9QVUJfRU5DT0RFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoWDUwOV9QVUJLRVlfc2V0MF9wYXJhbShwaywgT0JKX25pZDJvYmooRVZQX1BLRVlfREgpLAorCQkJCXB0eXBlLCBwdmFsLCBwZW5jLCBwZW5jbGVuKSkKKwkJcmV0dXJuIDE7CisKKwllcnI6CisJaWYgKHBlbmMpCisJCU9QRU5TU0xfZnJlZShwZW5jKTsKKwlpZiAocHZhbCkKKwkJQVNOMV9TVFJJTkdfZnJlZShwdmFsKTsKKworCXJldHVybiAwOworCX0KKworCisvKiBQS0NTIzggREggaXMgZGVmaW5lZCBpbiBQS0NTIzExIG9mIGFsbCBwbGFjZXMuIEl0IGlzIHNpbWlsYXIgdG8gREggaW4KKyAqIHRoYXQgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgY29udGFpbnMgdGhlIHBhcmFtYXRlcnMsIHRoZSBwcml2YXRlIGtleQorICogaXMgZXhwbGNpdGx5IGluY2x1ZGVkIGFuZCB0aGUgcHVia2V5IG11c3QgYmUgcmVjYWxjdWxhdGVkLgorICovCisJCitzdGF0aWMgaW50IGRoX3ByaXZfZGVjb2RlKEVWUF9QS0VZICpwa2V5LCBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCwgKnBtOworCWludCBwa2xlbiwgcG1sZW47CisJaW50IHB0eXBlOworCXZvaWQgKnB2YWw7CisJQVNOMV9TVFJJTkcgKnBzdHI7CisJWDUwOV9BTEdPUiAqcGFsZzsKKwlBU04xX0lOVEVHRVIgKnByaXZrZXkgPSBOVUxMOworCisJREggKmRoID0gTlVMTDsKKworCWlmICghUEtDUzhfcGtleV9nZXQwKE5VTEwsICZwLCAmcGtsZW4sICZwYWxnLCBwOCkpCisJCXJldHVybiAwOworCisJWDUwOV9BTEdPUl9nZXQwKE5VTEwsICZwdHlwZSwgJnB2YWwsIHBhbGcpOworCisJaWYgKHB0eXBlICE9IFZfQVNOMV9TRVFVRU5DRSkKKwkJCWdvdG8gZGVjZXJyOworCisJaWYgKCEocHJpdmtleT1kMmlfQVNOMV9JTlRFR0VSKE5VTEwsICZwLCBwa2xlbikpKQorCQlnb3RvIGRlY2VycjsKKworCisJcHN0ciA9IHB2YWw7CQorCXBtID0gcHN0ci0+ZGF0YTsKKwlwbWxlbiA9IHBzdHItPmxlbmd0aDsKKwlpZiAoIShkaCA9IGQyaV9ESHBhcmFtcyhOVUxMLCAmcG0sIHBtbGVuKSkpCisJCWdvdG8gZGVjZXJyOworCS8qIFdlIGhhdmUgcGFyYW1ldGVycyBub3cgc2V0IHByaXZhdGUga2V5ICovCisJaWYgKCEoZGgtPnByaXZfa2V5ID0gQVNOMV9JTlRFR0VSX3RvX0JOKHByaXZrZXksIE5VTEwpKSkKKwkJeworCQlESGVycihESF9GX0RIX1BSSVZfREVDT0RFLERIX1JfQk5fRVJST1IpOworCQlnb3RvIGRoZXJyOworCQl9CisJLyogQ2FsY3VsYXRlIHB1YmxpYyBrZXkgKi8KKwlpZiAoIURIX2dlbmVyYXRlX2tleShkaCkpCisJCWdvdG8gZGhlcnI7CisKKwlFVlBfUEtFWV9hc3NpZ25fREgocGtleSwgZGgpOworCisJQVNOMV9JTlRFR0VSX2ZyZWUocHJpdmtleSk7CisKKwlyZXR1cm4gMTsKKworCWRlY2VycjoKKwlESGVycihESF9GX0RIX1BSSVZfREVDT0RFLCBFVlBfUl9ERUNPREVfRVJST1IpOworCWRoZXJyOgorCURIX2ZyZWUoZGgpOworCXJldHVybiAwOworCX0KKworc3RhdGljIGludCBkaF9wcml2X2VuY29kZShQS0NTOF9QUklWX0tFWV9JTkZPICpwOCwgY29uc3QgRVZQX1BLRVkgKnBrZXkpCit7CisJQVNOMV9TVFJJTkcgKnBhcmFtcyA9IE5VTEw7CisJQVNOMV9JTlRFR0VSICpwcmtleSA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqZHAgPSBOVUxMOworCWludCBkcGxlbjsKKworCXBhcmFtcyA9IEFTTjFfU1RSSU5HX25ldygpOworCisJaWYgKCFwYXJhbXMpCisJCXsKKwkJREhlcnIoREhfRl9ESF9QUklWX0VOQ09ERSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlwYXJhbXMtPmxlbmd0aCA9IGkyZF9ESHBhcmFtcyhwa2V5LT5wa2V5LmRoLCAmcGFyYW1zLT5kYXRhKTsKKwlpZiAocGFyYW1zLT5sZW5ndGggPD0gMCkKKwkJeworCQlESGVycihESF9GX0RIX1BSSVZfRU5DT0RFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlwYXJhbXMtPnR5cGUgPSBWX0FTTjFfU0VRVUVOQ0U7CisKKwkvKiBHZXQgcHJpdmF0ZSBrZXkgaW50byBpbnRlZ2VyICovCisJcHJrZXkgPSBCTl90b19BU04xX0lOVEVHRVIocGtleS0+cGtleS5kaC0+cHJpdl9rZXksIE5VTEwpOworCisJaWYgKCFwcmtleSkKKwkJeworCQlESGVycihESF9GX0RIX1BSSVZfRU5DT0RFLERIX1JfQk5fRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJZHBsZW4gPSBpMmRfQVNOMV9JTlRFR0VSKHBya2V5LCAmZHApOworCisJQVNOMV9JTlRFR0VSX2ZyZWUocHJrZXkpOworCisJaWYgKCFQS0NTOF9wa2V5X3NldDAocDgsIE9CSl9uaWQyb2JqKE5JRF9kaEtleUFncmVlbWVudCksIDAsCisJCQkJVl9BU04xX1NFUVVFTkNFLCBwYXJhbXMsIGRwLCBkcGxlbikpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDE7CisKK2VycjoKKwlpZiAoZHAgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKGRwKTsKKwlpZiAocGFyYW1zICE9IE5VTEwpCisJCUFTTjFfU1RSSU5HX2ZyZWUocGFyYW1zKTsKKwlpZiAocHJrZXkgIT0gTlVMTCkKKwkJQVNOMV9JTlRFR0VSX2ZyZWUocHJrZXkpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9idWZsZW4oY29uc3QgQklHTlVNICpiLCBzaXplX3QgKnBidWZsZW4pCisJeworCXNpemVfdCBpOworCWlmICghYikKKwkJcmV0dXJuOworCWlmICgqcGJ1ZmxlbiA8IChpID0gKHNpemVfdClCTl9udW1fYnl0ZXMoYikpKQorCQkJKnBidWZsZW4gPSBpOworCX0KKworc3RhdGljIGludCBkaF9wYXJhbV9kZWNvZGUoRVZQX1BLRVkgKnBrZXksCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZGVyLCBpbnQgZGVybGVuKQorCXsKKwlESCAqZGg7CisJaWYgKCEoZGggPSBkMmlfREhwYXJhbXMoTlVMTCwgcGRlciwgZGVybGVuKSkpCisJCXsKKwkJREhlcnIoREhfRl9ESF9QQVJBTV9ERUNPREUsIEVSUl9SX0RIX0xJQik7CisJCXJldHVybiAwOworCQl9CisJRVZQX1BLRVlfYXNzaWduX0RIKHBrZXksIGRoKTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZGhfcGFyYW1fZW5jb2RlKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1bnNpZ25lZCBjaGFyICoqcGRlcikKKwl7CisJcmV0dXJuIGkyZF9ESHBhcmFtcyhwa2V5LT5wa2V5LmRoLCBwZGVyKTsKKwl9CisKK3N0YXRpYyBpbnQgZG9fZGhfcHJpbnQoQklPICpicCwgY29uc3QgREggKngsIGludCBpbmRlbnQsCisJCQkJCQlBU04xX1BDVFggKmN0eCwgaW50IHB0eXBlKQorCXsKKwl1bnNpZ25lZCBjaGFyICptPU5VTEw7CisJaW50IHJlYXNvbj1FUlJfUl9CVUZfTElCLHJldD0wOworCXNpemVfdCBidWZfbGVuPTA7CisKKwljb25zdCBjaGFyICprdHlwZSA9IE5VTEw7CisKKwlCSUdOVU0gKnByaXZfa2V5LCAqcHViX2tleTsKKworCWlmIChwdHlwZSA9PSAyKQorCQlwcml2X2tleSA9IHgtPnByaXZfa2V5OworCWVsc2UKKwkJcHJpdl9rZXkgPSBOVUxMOworCisJaWYgKHB0eXBlID4gMCkKKwkJcHViX2tleSA9IHgtPnB1Yl9rZXk7CisJZWxzZQorCQlwdWJfa2V5ID0gTlVMTDsKKworCXVwZGF0ZV9idWZsZW4oeC0+cCwgJmJ1Zl9sZW4pOworCisJaWYgKGJ1Zl9sZW4gPT0gMCkKKwkJeworCQlyZWFzb24gPSBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVI7CisJCWdvdG8gZXJyOworCQl9CisKKwl1cGRhdGVfYnVmbGVuKHgtPmcsICZidWZfbGVuKTsKKwl1cGRhdGVfYnVmbGVuKHB1Yl9rZXksICZidWZfbGVuKTsKKwl1cGRhdGVfYnVmbGVuKHByaXZfa2V5LCAmYnVmX2xlbik7CisKKwlpZiAocHR5cGUgPT0gMikKKwkJa3R5cGUgPSAiUEtDUyMzIERIIFByaXZhdGUtS2V5IjsKKwllbHNlIGlmIChwdHlwZSA9PSAxKQorCQlrdHlwZSA9ICJQS0NTIzMgREggUHVibGljLUtleSI7CisJZWxzZQorCQlrdHlwZSA9ICJQS0NTIzMgREggUGFyYW1ldGVycyI7CisKKwltPSBPUEVOU1NMX21hbGxvYyhidWZfbGVuKzEwKTsKKwlpZiAobSA9PSBOVUxMKQorCQl7CisJCXJlYXNvbj1FUlJfUl9NQUxMT0NfRkFJTFVSRTsKKwkJZ290byBlcnI7CisJCX0KKworCUJJT19pbmRlbnQoYnAsIGluZGVudCwgMTI4KTsKKwlpZiAoQklPX3ByaW50ZihicCwiJXM6ICglZCBiaXQpXG4iLCBrdHlwZSwgQk5fbnVtX2JpdHMoeC0+cCkpIDw9IDApCisJCWdvdG8gZXJyOworCWluZGVudCArPSA0OworCisJaWYgKCFBU04xX2JuX3ByaW50KGJwLCJwcml2YXRlLWtleToiLHByaXZfa2V5LG0saW5kZW50KSkgZ290byBlcnI7CisJaWYgKCFBU04xX2JuX3ByaW50KGJwLCJwdWJsaWMta2V5OiIscHViX2tleSxtLGluZGVudCkpIGdvdG8gZXJyOworCisJaWYgKCFBU04xX2JuX3ByaW50KGJwLCJwcmltZToiLHgtPnAsbSxpbmRlbnQpKSBnb3RvIGVycjsKKwlpZiAoIUFTTjFfYm5fcHJpbnQoYnAsImdlbmVyYXRvcjoiLHgtPmcsbSxpbmRlbnQpKSBnb3RvIGVycjsKKwlpZiAoeC0+bGVuZ3RoICE9IDApCisJCXsKKwkJQklPX2luZGVudChicCwgaW5kZW50LCAxMjgpOworCQlpZiAoQklPX3ByaW50ZihicCwicmVjb21tZW5kZWQtcHJpdmF0ZS1sZW5ndGg6ICVkIGJpdHNcbiIsCisJCQkoaW50KXgtPmxlbmd0aCkgPD0gMCkgZ290byBlcnI7CisJCX0KKworCisJcmV0PTE7CisJaWYgKDApCisJCXsKK2VycjoKKwkJREhlcnIoREhfRl9ET19ESF9QUklOVCxyZWFzb24pOworCQl9CisJaWYgKG0gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKG0pOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBpbnRfZGhfc2l6ZShjb25zdCBFVlBfUEtFWSAqcGtleSkKKwl7CisJcmV0dXJuKERIX3NpemUocGtleS0+cGtleS5kaCkpOworCX0KKworc3RhdGljIGludCBkaF9iaXRzKGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4gQk5fbnVtX2JpdHMocGtleS0+cGtleS5kaC0+cCk7CisJfQorCitzdGF0aWMgaW50IGRoX2NtcF9wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYikKKwl7CisJaWYgKAlCTl9jbXAoYS0+cGtleS5kaC0+cCxiLT5wa2V5LmRoLT5wKSB8fAorCQlCTl9jbXAoYS0+cGtleS5kaC0+ZyxiLT5wa2V5LmRoLT5nKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZGhfY29weV9wYXJhbWV0ZXJzKEVWUF9QS0VZICp0bywgY29uc3QgRVZQX1BLRVkgKmZyb20pCisJeworCUJJR05VTSAqYTsKKworCWlmICgoYT1CTl9kdXAoZnJvbS0+cGtleS5kaC0+cCkpID09IE5VTEwpCisJCXJldHVybiAwOworCWlmICh0by0+cGtleS5kaC0+cCAhPSBOVUxMKQorCQlCTl9mcmVlKHRvLT5wa2V5LmRoLT5wKTsKKwl0by0+cGtleS5kaC0+cD1hOworCisJaWYgKChhPUJOX2R1cChmcm9tLT5wa2V5LmRoLT5nKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHRvLT5wa2V5LmRoLT5nICE9IE5VTEwpCisJCUJOX2ZyZWUodG8tPnBrZXkuZGgtPmcpOworCXRvLT5wa2V5LmRoLT5nPWE7CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZGhfbWlzc2luZ19wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICphKQorCXsKKwlpZiAoIWEtPnBrZXkuZGgtPnAgfHwgIWEtPnBrZXkuZGgtPmcpCisJCXJldHVybiAxOworCXJldHVybiAwOworCX0KKworc3RhdGljIGludCBkaF9wdWJfY21wKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYikKKwl7CisJaWYgKGRoX2NtcF9wYXJhbWV0ZXJzKGEsIGIpID09IDApCisJCXJldHVybiAwOworCWlmIChCTl9jbXAoYi0+cGtleS5kaC0+cHViX2tleSxhLT5wa2V5LmRoLT5wdWJfa2V5KSAhPSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBkaF9wYXJhbV9wcmludChCSU8gKmJwLCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKmN0eCkKKwl7CisJcmV0dXJuIGRvX2RoX3ByaW50KGJwLCBwa2V5LT5wa2V5LmRoLCBpbmRlbnQsIGN0eCwgMCk7CisJfQorCitzdGF0aWMgaW50IGRoX3B1YmxpY19wcmludChCSU8gKmJwLCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKmN0eCkKKwl7CisJcmV0dXJuIGRvX2RoX3ByaW50KGJwLCBwa2V5LT5wa2V5LmRoLCBpbmRlbnQsIGN0eCwgMSk7CisJfQorCitzdGF0aWMgaW50IGRoX3ByaXZhdGVfcHJpbnQoQklPICpicCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisJCQkJCQkJQVNOMV9QQ1RYICpjdHgpCisJeworCXJldHVybiBkb19kaF9wcmludChicCwgcGtleS0+cGtleS5kaCwgaW5kZW50LCBjdHgsIDIpOworCX0KKworaW50IERIcGFyYW1zX3ByaW50KEJJTyAqYnAsIGNvbnN0IERIICp4KQorCXsKKwlyZXR1cm4gZG9fZGhfcHJpbnQoYnAsIHgsIDQsIE5VTEwsIDApOworCX0KKworY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgZGhfYXNuMV9tZXRoID0gCisJeworCUVWUF9QS0VZX0RILAorCUVWUF9QS0VZX0RILAorCTAsCisKKwkiREgiLAorCSJPcGVuU1NMIFBLQ1MjMyBESCBtZXRob2QiLAorCisJZGhfcHViX2RlY29kZSwKKwlkaF9wdWJfZW5jb2RlLAorCWRoX3B1Yl9jbXAsCisJZGhfcHVibGljX3ByaW50LAorCisJZGhfcHJpdl9kZWNvZGUsCisJZGhfcHJpdl9lbmNvZGUsCisJZGhfcHJpdmF0ZV9wcmludCwKKworCWludF9kaF9zaXplLAorCWRoX2JpdHMsCisKKwlkaF9wYXJhbV9kZWNvZGUsCisJZGhfcGFyYW1fZW5jb2RlLAorCWRoX21pc3NpbmdfcGFyYW1ldGVycywKKwlkaF9jb3B5X3BhcmFtZXRlcnMsCisJZGhfY21wX3BhcmFtZXRlcnMsCisJZGhfcGFyYW1fcHJpbnQsCisKKwlpbnRfZGhfZnJlZSwKKwkwCisJfTsKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2FzbjEuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9hc24xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0MzU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9hc24xLmMKQEAgLTAsMCArMSw5MyBAQAorLyogZGhfYXNuMS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisKKy8qIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGZyZWUgYW5kIG5ldyBtZXRob2RzICovCitzdGF0aWMgaW50IGRoX2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQkJdm9pZCAqZXhhcmcpCit7CisJaWYob3BlcmF0aW9uID09IEFTTjFfT1BfTkVXX1BSRSkgeworCQkqcHZhbCA9IChBU04xX1ZBTFVFICopREhfbmV3KCk7CisJCWlmKCpwdmFsKSByZXR1cm4gMjsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmKG9wZXJhdGlvbiA9PSBBU04xX09QX0ZSRUVfUFJFKSB7CisJCURIX2ZyZWUoKERIICopKnB2YWwpOworCQkqcHZhbCA9IE5VTEw7CisJCXJldHVybiAyOworCX0KKwlyZXR1cm4gMTsKK30KKworQVNOMV9TRVFVRU5DRV9jYihESHBhcmFtcywgZGhfY2IpID0geworCUFTTjFfU0lNUExFKERILCBwLCBCSUdOVU0pLAorCUFTTjFfU0lNUExFKERILCBnLCBCSUdOVU0pLAorCUFTTjFfT1BUKERILCBsZW5ndGgsIFpMT05HKSwKK30gQVNOMV9TRVFVRU5DRV9FTkRfY2IoREgsIERIcGFyYW1zKQorCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKERILCBESHBhcmFtcywgREhwYXJhbXMpCisKK0RIICpESHBhcmFtc19kdXAoREggKmRoKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2R1cChBU04xX0lURU1fcnB0cihESHBhcmFtcyksIGRoKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGhfY2hlY2suYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Njg5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGhfY2hlY2suYwpAQCAtMCwwICsxLDE0MiBAQAorLyogY3J5cHRvL2RoL2RoX2NoZWNrLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorCisvKiBDaGVjayB0aGF0IHAgaXMgYSBzYWZlIHByaW1lIGFuZAorICogaWYgZyBpcyAyLCAzIG9yIDUsIGNoZWNrIHRoYXQgaXQgaXMgYSBzdWl0YWJsZSBnZW5lcmF0b3IKKyAqIHdoZXJlCisgKiBmb3IgMiwgcCBtb2QgMjQgPT0gMTEKKyAqIGZvciAzLCBwIG1vZCAxMiA9PSA1CisgKiBmb3IgNSwgcCBtb2QgMTAgPT0gMyBvciA3CisgKiBzaG91bGQgaG9sZC4KKyAqLworCitpbnQgREhfY2hlY2soY29uc3QgREggKmRoLCBpbnQgKnJldCkKKwl7CisJaW50IG9rPTA7CisJQk5fQ1RYICpjdHg9TlVMTDsKKwlCTl9VTE9ORyBsOworCUJJR05VTSAqcT1OVUxMOworCisJKnJldD0wOworCWN0eD1CTl9DVFhfbmV3KCk7CisJaWYgKGN0eCA9PSBOVUxMKSBnb3RvIGVycjsKKwlxPUJOX25ldygpOworCWlmIChxID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKEJOX2lzX3dvcmQoZGgtPmcsREhfR0VORVJBVE9SXzIpKQorCQl7CisJCWw9Qk5fbW9kX3dvcmQoZGgtPnAsMjQpOworCQlpZiAobCAhPSAxMSkgKnJldHw9REhfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUjsKKwkJfQorI2lmIDAKKwllbHNlIGlmIChCTl9pc193b3JkKGRoLT5nLERIX0dFTkVSQVRPUl8zKSkKKwkJeworCQlsPUJOX21vZF93b3JkKGRoLT5wLDEyKTsKKwkJaWYgKGwgIT0gNSkgKnJldHw9REhfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUjsKKwkJfQorI2VuZGlmCisJZWxzZSBpZiAoQk5faXNfd29yZChkaC0+ZyxESF9HRU5FUkFUT1JfNSkpCisJCXsKKwkJbD1CTl9tb2Rfd29yZChkaC0+cCwxMCk7CisJCWlmICgobCAhPSAzKSAmJiAobCAhPSA3KSkKKwkJCSpyZXR8PURIX05PVF9TVUlUQUJMRV9HRU5FUkFUT1I7CisJCX0KKwllbHNlCisJCSpyZXR8PURIX1VOQUJMRV9UT19DSEVDS19HRU5FUkFUT1I7CisKKwlpZiAoIUJOX2lzX3ByaW1lX2V4KGRoLT5wLEJOX3ByaW1lX2NoZWNrcyxjdHgsTlVMTCkpCisJCSpyZXR8PURIX0NIRUNLX1BfTk9UX1BSSU1FOworCWVsc2UKKwkJeworCQlpZiAoIUJOX3JzaGlmdDEocSxkaC0+cCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX2lzX3ByaW1lX2V4KHEsQk5fcHJpbWVfY2hlY2tzLGN0eCxOVUxMKSkKKwkJCSpyZXR8PURIX0NIRUNLX1BfTk9UX1NBRkVfUFJJTUU7CisJCX0KKwlvaz0xOworZXJyOgorCWlmIChjdHggIT0gTlVMTCkgQk5fQ1RYX2ZyZWUoY3R4KTsKKwlpZiAocSAhPSBOVUxMKSBCTl9mcmVlKHEpOworCXJldHVybihvayk7CisJfQorCitpbnQgREhfY2hlY2tfcHViX2tleShjb25zdCBESCAqZGgsIGNvbnN0IEJJR05VTSAqcHViX2tleSwgaW50ICpyZXQpCisJeworCWludCBvaz0wOworCUJJR05VTSAqcT1OVUxMOworCisJKnJldD0wOworCXE9Qk5fbmV3KCk7CisJaWYgKHEgPT0gTlVMTCkgZ290byBlcnI7CisJQk5fc2V0X3dvcmQocSwxKTsKKwlpZiAoQk5fY21wKHB1Yl9rZXkscSk8PTApCisJCSpyZXR8PURIX0NIRUNLX1BVQktFWV9UT09fU01BTEw7CisJQk5fY29weShxLGRoLT5wKTsKKwlCTl9zdWJfd29yZChxLDEpOworCWlmIChCTl9jbXAocHViX2tleSxxKT49MCkKKwkJKnJldHw9REhfQ0hFQ0tfUFVCS0VZX1RPT19MQVJHRTsKKworCW9rID0gMTsKK2VycjoKKwlpZiAocSAhPSBOVUxMKSBCTl9mcmVlKHEpOworCXJldHVybihvayk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2RlcHIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9kZXByLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjMDVmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9kZXByLmMKQEAgLTAsMCArMSw4MyBAQAorLyogY3J5cHRvL2RoL2RoX2RlcHIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGFzIHdyYXBwZXJzIHRvIHRoZSBuZXcgb25lcyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKK3N0YXRpYyB2b2lkICpkdW1teT0mZHVtbXk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitESCAqREhfZ2VuZXJhdGVfcGFyYW1ldGVycyhpbnQgcHJpbWVfbGVuLCBpbnQgZ2VuZXJhdG9yLAorCSAgICAgdm9pZCAoKmNhbGxiYWNrKShpbnQsaW50LHZvaWQgKiksIHZvaWQgKmNiX2FyZykKKwl7CisJQk5fR0VOQ0IgY2I7CisJREggKnJldD1OVUxMOworCisJaWYoKHJldD1ESF9uZXcoKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlCTl9HRU5DQl9zZXRfb2xkKCZjYiwgY2FsbGJhY2ssIGNiX2FyZyk7CisKKwlpZihESF9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4KHJldCwgcHJpbWVfbGVuLCBnZW5lcmF0b3IsICZjYikpCisJCXJldHVybiByZXQ7CisJREhfZnJlZShyZXQpOworCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2Vyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2YwYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGhfZXJyLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIGNyeXB0by9kaC9kaF9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9ESCxmdW5jLDApCisjZGVmaW5lIEVSUl9SRUFTT04ocmVhc29uKSBFUlJfUEFDSyhFUlJfTElCX0RILDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIERIX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoREhfRl9DT01QVVRFX0tFWSksCSJDT01QVVRFX0tFWSJ9LAore0VSUl9GVU5DKERIX0ZfREhQQVJBTVNfUFJJTlRfRlApLAkiREhwYXJhbXNfcHJpbnRfZnAifSwKK3tFUlJfRlVOQyhESF9GX0RIX0JVSUxUSU5fR0VOUEFSQU1TKSwJIkRIX0JVSUxUSU5fR0VOUEFSQU1TIn0sCit7RVJSX0ZVTkMoREhfRl9ESF9ORVdfTUVUSE9EKSwJIkRIX25ld19tZXRob2QifSwKK3tFUlJfRlVOQyhESF9GX0RIX1BBUkFNX0RFQ09ERSksCSJESF9QQVJBTV9ERUNPREUifSwKK3tFUlJfRlVOQyhESF9GX0RIX1BSSVZfREVDT0RFKSwJIkRIX1BSSVZfREVDT0RFIn0sCit7RVJSX0ZVTkMoREhfRl9ESF9QUklWX0VOQ09ERSksCSJESF9QUklWX0VOQ09ERSJ9LAore0VSUl9GVU5DKERIX0ZfREhfUFVCX0RFQ09ERSksCSJESF9QVUJfREVDT0RFIn0sCit7RVJSX0ZVTkMoREhfRl9ESF9QVUJfRU5DT0RFKSwJIkRIX1BVQl9FTkNPREUifSwKK3tFUlJfRlVOQyhESF9GX0RPX0RIX1BSSU5UKSwJIkRPX0RIX1BSSU5UIn0sCit7RVJSX0ZVTkMoREhfRl9HRU5FUkFURV9LRVkpLAkiR0VORVJBVEVfS0VZIn0sCit7RVJSX0ZVTkMoREhfRl9HRU5FUkFURV9QQVJBTUVURVJTKSwJIkdFTkVSQVRFX1BBUkFNRVRFUlMifSwKK3tFUlJfRlVOQyhESF9GX1BLRVlfREhfREVSSVZFKSwJIlBLRVlfREhfREVSSVZFIn0sCit7RVJSX0ZVTkMoREhfRl9QS0VZX0RIX0tFWUdFTiksCSJQS0VZX0RIX0tFWUdFTiJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIERIX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oREhfUl9CQURfR0VORVJBVE9SKSAgICAgICAgICAsImJhZCBnZW5lcmF0b3IifSwKK3tFUlJfUkVBU09OKERIX1JfQk5fREVDT0RFX0VSUk9SKSAgICAgICAgLCJibiBkZWNvZGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKERIX1JfQk5fRVJST1IpICAgICAgICAgICAgICAgLCJibiBlcnJvciJ9LAore0VSUl9SRUFTT04oREhfUl9ERUNPREVfRVJST1IpICAgICAgICAgICAsImRlY29kZSBlcnJvciJ9LAore0VSUl9SRUFTT04oREhfUl9JTlZBTElEX1BVQktFWSkgICAgICAgICAsImludmFsaWQgcHVibGljIGtleSJ9LAore0VSUl9SRUFTT04oREhfUl9LRVlTX05PVF9TRVQpICAgICAgICAgICAsImtleXMgbm90IHNldCJ9LAore0VSUl9SRUFTT04oREhfUl9NT0RVTFVTX1RPT19MQVJHRSkgICAgICAsIm1vZHVsdXMgdG9vIGxhcmdlIn0sCit7RVJSX1JFQVNPTihESF9SX05PX1BBUkFNRVRFUlNfU0VUKSAgICAgICwibm8gcGFyYW1ldGVycyBzZXQifSwKK3tFUlJfUkVBU09OKERIX1JfTk9fUFJJVkFURV9WQUxVRSkgICAgICAgLCJubyBwcml2YXRlIHZhbHVlIn0sCit7RVJSX1JFQVNPTihESF9SX1BBUkFNRVRFUl9FTkNPRElOR19FUlJPUiksInBhcmFtZXRlciBlbmNvZGluZyBlcnJvciJ9LAorezAsTlVMTH0KKwl9OworCisjZW5kaWYKKwordm9pZCBFUlJfbG9hZF9ESF9zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhESF9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxESF9zdHJfZnVuY3RzKTsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLERIX3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2dlbi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2dlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDViMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGhfZ2VuLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qIGNyeXB0by9kaC9kaF9nZW4uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBOQjogVGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiB1cGdyYWRlZCAtIHRoZSBwcmV2aW91cyBwcm90b3R5cGVzIGFyZSBpbgorICogZGhfZGVwci5jIGFzIHdyYXBwZXJzIHRvIHRoZXNlIG9uZXMuCisgKiAgLSBHZW9mZgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKworc3RhdGljIGludCBkaF9idWlsdGluX2dlbnBhcmFtcyhESCAqcmV0LCBpbnQgcHJpbWVfbGVuLCBpbnQgZ2VuZXJhdG9yLCBCTl9HRU5DQiAqY2IpOworCitpbnQgREhfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChESCAqcmV0LCBpbnQgcHJpbWVfbGVuLCBpbnQgZ2VuZXJhdG9yLCBCTl9HRU5DQiAqY2IpCisJeworCWlmKHJldC0+bWV0aC0+Z2VuZXJhdGVfcGFyYW1zKQorCQlyZXR1cm4gcmV0LT5tZXRoLT5nZW5lcmF0ZV9wYXJhbXMocmV0LCBwcmltZV9sZW4sIGdlbmVyYXRvciwgY2IpOworCXJldHVybiBkaF9idWlsdGluX2dlbnBhcmFtcyhyZXQsIHByaW1lX2xlbiwgZ2VuZXJhdG9yLCBjYik7CisJfQorCisvKiBXZSBnZW5lcmF0ZSBESCBwYXJhbWV0ZXJzIGFzIGZvbGxvd3MKKyAqIGZpbmQgYSBwcmltZSBxIHdoaWNoIGlzIHByaW1lX2xlbi8yIGJpdHMgbG9uZy4KKyAqIHA9KDIqcSkrMSBvciAocC0xKS8yID0gcQorICogRm9yIHRoaXMgY2FzZSwgZyBpcyBhIGdlbmVyYXRvciBpZgorICogZ14oKHAtMSkvcSkgbW9kIHAgIT0gMSBmb3IgdmFsdWVzIG9mIHEgd2hpY2ggYXJlIHRoZSBmYWN0b3JzIG9mIHAtMS4KKyAqIFNpbmNlIHRoZSBmYWN0b3JzIG9mIHAtMSBhcmUgcSBhbmQgMiwgd2UganVzdCBuZWVkIHRvIGNoZWNrCisgKiBnXjIgbW9kIHAgIT0gMSBhbmQgZ15xIG1vZCBwICE9IDEuCisgKgorICogSGF2aW5nIHNhaWQgYWxsIHRoYXQsCisgKiB0aGVyZSBpcyBhbm90aGVyIHNwZWNpYWwgY2FzZSBtZXRob2QgZm9yIHRoZSBnZW5lcmF0b3JzIDIsIDMgYW5kIDUuCisgKiBmb3IgMiwgcCBtb2QgMjQgPT0gMTEKKyAqIGZvciAzLCBwIG1vZCAxMiA9PSA1ICA8PDw8PCBkb2VzIG5vdCB3b3JrIGZvciBzYWZlIHByaW1lcy4KKyAqIGZvciA1LCBwIG1vZCAxMCA9PSAzIG9yIDcKKyAqCisgKiBUaGFua3MgdG8gUGhpbCBLYXJuIDxrYXJuQHF1YWxjb21tLmNvbT4gZm9yIHRoZSBwb2ludGVycyBhYm91dCB0aGUKKyAqIHNwZWNpYWwgZ2VuZXJhdG9ycyBhbmQgZm9yIGFuc3dlcmluZyBzb21lIG9mIG15IHF1ZXN0aW9ucy4KKyAqCisgKiBJJ3ZlIGltcGxlbWVudGVkIHRoZSBzZWNvbmQgc2ltcGxlIG1ldGhvZCA6LSkuCisgKiBTaW5jZSBESCBzaG91bGQgYmUgdXNpbmcgYSBzYWZlIHByaW1lIChib3RoIHAgYW5kIHEgYXJlIHByaW1lKSwKKyAqIHRoaXMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGNhbiB0YWtlIGEgdmVyeSB2ZXJ5IGxvbmcgdGltZSB0byBydW4uCisgKi8KKy8qIEFjdHVhbGx5IHRoZXJlIGlzIG5vIHJlYXNvbiB0byBpbnNpc3QgdGhhdCAnZ2VuZXJhdG9yJyBiZSBhIGdlbmVyYXRvci4KKyAqIEl0J3MganVzdCBhcyBPSyAoYW5kIGluIHNvbWUgc2Vuc2UgYmV0dGVyKSB0byB1c2UgYSBnZW5lcmF0b3Igb2YgdGhlCisgKiBvcmRlci1xIHN1Ymdyb3VwLgorICovCitzdGF0aWMgaW50IGRoX2J1aWx0aW5fZ2VucGFyYW1zKERIICpyZXQsIGludCBwcmltZV9sZW4sIGludCBnZW5lcmF0b3IsIEJOX0dFTkNCICpjYikKKwl7CisJQklHTlVNICp0MSwqdDI7CisJaW50IGcsb2s9IC0xOworCUJOX0NUWCAqY3R4PU5VTEw7CisKKwljdHg9Qk5fQ1RYX25ldygpOworCWlmIChjdHggPT0gTlVMTCkgZ290byBlcnI7CisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJdDEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJdDIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHQxID09IE5VTEwgfHwgdDIgPT0gTlVMTCkgZ290byBlcnI7CisKKwkvKiBNYWtlIHN1cmUgJ3JldCcgaGFzIHRoZSBuZWNlc3NhcnkgZWxlbWVudHMgKi8KKwlpZighcmV0LT5wICYmICgocmV0LT5wID0gQk5fbmV3KCkpID09IE5VTEwpKSBnb3RvIGVycjsKKwlpZighcmV0LT5nICYmICgocmV0LT5nID0gQk5fbmV3KCkpID09IE5VTEwpKSBnb3RvIGVycjsKKwkKKwlpZiAoZ2VuZXJhdG9yIDw9IDEpCisJCXsKKwkJREhlcnIoREhfRl9ESF9CVUlMVElOX0dFTlBBUkFNUywgREhfUl9CQURfR0VORVJBVE9SKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoZ2VuZXJhdG9yID09IERIX0dFTkVSQVRPUl8yKQorCQl7CisJCWlmICghQk5fc2V0X3dvcmQodDEsMjQpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9zZXRfd29yZCh0MiwxMSkpIGdvdG8gZXJyOworCQlnPTI7CisJCX0KKyNpZiAwIC8qIGRvZXMgbm90IHdvcmsgZm9yIHNhZmUgcHJpbWVzICovCisJZWxzZSBpZiAoZ2VuZXJhdG9yID09IERIX0dFTkVSQVRPUl8zKQorCQl7CisJCWlmICghQk5fc2V0X3dvcmQodDEsMTIpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9zZXRfd29yZCh0Miw1KSkgZ290byBlcnI7CisJCWc9MzsKKwkJfQorI2VuZGlmCisJZWxzZSBpZiAoZ2VuZXJhdG9yID09IERIX0dFTkVSQVRPUl81KQorCQl7CisJCWlmICghQk5fc2V0X3dvcmQodDEsMTApKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9zZXRfd29yZCh0MiwzKSkgZ290byBlcnI7CisJCS8qIEJOX3NldF93b3JkKHQzLDcpOyBqdXN0IGhhdmUgdG8gbWlzcworCQkgKiBvdXQgb24gdGhlc2Ugb25lcyA6LSggKi8KKwkJZz01OworCQl9CisJZWxzZQorCQl7CisJCS8qIGluIHRoZSBnZW5lcmFsIGNhc2UsIGRvbid0IHdvcnJ5IGlmICdnZW5lcmF0b3InIGlzIGEKKwkJICogZ2VuZXJhdG9yIG9yIG5vdDogc2luY2Ugd2UgYXJlIHVzaW5nIHNhZmUgcHJpbWVzLAorCQkgKiBpdCB3aWxsIGdlbmVyYXRlIGVpdGhlciBhbiBvcmRlci1xIG9yIGFuIG9yZGVyLTJxIGdyb3VwLAorCQkgKiB3aGljaCBib3RoIGlzIE9LICovCisJCWlmICghQk5fc2V0X3dvcmQodDEsMikpIGdvdG8gZXJyOworCQlpZiAoIUJOX3NldF93b3JkKHQyLDEpKSBnb3RvIGVycjsKKwkJZz1nZW5lcmF0b3I7CisJCX0KKwkKKwlpZighQk5fZ2VuZXJhdGVfcHJpbWVfZXgocmV0LT5wLHByaW1lX2xlbiwxLHQxLHQyLGNiKSkgZ290byBlcnI7CisJaWYoIUJOX0dFTkNCX2NhbGwoY2IsIDMsIDApKSBnb3RvIGVycjsKKwlpZiAoIUJOX3NldF93b3JkKHJldC0+ZyxnKSkgZ290byBlcnI7CisJb2s9MTsKK2VycjoKKwlpZiAob2sgPT0gLTEpCisJCXsKKwkJREhlcnIoREhfRl9ESF9CVUlMVElOX0dFTlBBUkFNUyxFUlJfUl9CTl9MSUIpOworCQlvaz0wOworCQl9CisKKwlpZiAoY3R4ICE9IE5VTEwpCisJCXsKKwkJQk5fQ1RYX2VuZChjdHgpOworCQlCTl9DVFhfZnJlZShjdHgpOworCQl9CisJcmV0dXJuIG9rOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9rZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9rZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2RiNDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX2tleS5jCkBAIC0wLDAgKzEsMjYzIEBACisvKiBjcnlwdG8vZGgvZGhfa2V5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorCitzdGF0aWMgaW50IGdlbmVyYXRlX2tleShESCAqZGgpOworc3RhdGljIGludCBjb21wdXRlX2tleSh1bnNpZ25lZCBjaGFyICprZXksIGNvbnN0IEJJR05VTSAqcHViX2tleSwgREggKmRoKTsKK3N0YXRpYyBpbnQgZGhfYm5fbW9kX2V4cChjb25zdCBESCAqZGgsIEJJR05VTSAqciwKKwkJCWNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCQkJY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKwkJCUJOX01PTlRfQ1RYICptX2N0eCk7CitzdGF0aWMgaW50IGRoX2luaXQoREggKmRoKTsKK3N0YXRpYyBpbnQgZGhfZmluaXNoKERIICpkaCk7CisKK2ludCBESF9nZW5lcmF0ZV9rZXkoREggKmRoKQorCXsKKwlyZXR1cm4gZGgtPm1ldGgtPmdlbmVyYXRlX2tleShkaCk7CisJfQorCitpbnQgREhfY29tcHV0ZV9rZXkodW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCBCSUdOVU0gKnB1Yl9rZXksIERIICpkaCkKKwl7CisJcmV0dXJuIGRoLT5tZXRoLT5jb21wdXRlX2tleShrZXksIHB1Yl9rZXksIGRoKTsKKwl9CisKK3N0YXRpYyBESF9NRVRIT0QgZGhfb3NzbCA9IHsKKyJPcGVuU1NMIERIIE1ldGhvZCIsCitnZW5lcmF0ZV9rZXksCitjb21wdXRlX2tleSwKK2RoX2JuX21vZF9leHAsCitkaF9pbml0LAorZGhfZmluaXNoLAorMCwKK05VTEwsCitOVUxMCit9OworCitjb25zdCBESF9NRVRIT0QgKkRIX09wZW5TU0wodm9pZCkKK3sKKwlyZXR1cm4gJmRoX29zc2w7Cit9CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfa2V5KERIICpkaCkKKwl7CisJaW50IG9rPTA7CisJaW50IGdlbmVyYXRlX25ld19rZXk9MDsKKwl1bnNpZ25lZCBsOworCUJOX0NUWCAqY3R4OworCUJOX01PTlRfQ1RYICptb250PU5VTEw7CisJQklHTlVNICpwdWJfa2V5PU5VTEwsKnByaXZfa2V5PU5VTEw7CisKKwljdHggPSBCTl9DVFhfbmV3KCk7CisJaWYgKGN0eCA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmIChkaC0+cHJpdl9rZXkgPT0gTlVMTCkKKwkJeworCQlwcml2X2tleT1CTl9uZXcoKTsKKwkJaWYgKHByaXZfa2V5ID09IE5VTEwpIGdvdG8gZXJyOworCQlnZW5lcmF0ZV9uZXdfa2V5PTE7CisJCX0KKwllbHNlCisJCXByaXZfa2V5PWRoLT5wcml2X2tleTsKKworCWlmIChkaC0+cHViX2tleSA9PSBOVUxMKQorCQl7CisJCXB1Yl9rZXk9Qk5fbmV3KCk7CisJCWlmIChwdWJfa2V5ID09IE5VTEwpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQlwdWJfa2V5PWRoLT5wdWJfa2V5OworCisKKwlpZiAoZGgtPmZsYWdzICYgREhfRkxBR19DQUNIRV9NT05UX1ApCisJCXsKKwkJbW9udCA9IEJOX01PTlRfQ1RYX3NldF9sb2NrZWQoJmRoLT5tZXRob2RfbW9udF9wLAorCQkJCUNSWVBUT19MT0NLX0RILCBkaC0+cCwgY3R4KTsKKwkJaWYgKCFtb250KQorCQkJZ290byBlcnI7CisJCX0KKworCWlmIChnZW5lcmF0ZV9uZXdfa2V5KQorCQl7CisJCWwgPSBkaC0+bGVuZ3RoID8gZGgtPmxlbmd0aCA6IEJOX251bV9iaXRzKGRoLT5wKS0xOyAvKiBzZWNyZXQgZXhwb25lbnQgbGVuZ3RoICovCisJCWlmICghQk5fcmFuZChwcml2X2tleSwgbCwgMCwgMCkpIGdvdG8gZXJyOworCQl9CisKKwl7CisJCUJJR05VTSBsb2NhbF9wcms7CisJCUJJR05VTSAqcHJrOworCisJCWlmICgoZGgtPmZsYWdzICYgREhfRkxBR19OT19FWFBfQ09OU1RUSU1FKSA9PSAwKQorCQkJeworCQkJQk5faW5pdCgmbG9jYWxfcHJrKTsKKwkJCXByayA9ICZsb2NhbF9wcms7CisJCQlCTl93aXRoX2ZsYWdzKHByaywgcHJpdl9rZXksIEJOX0ZMR19DT05TVFRJTUUpOworCQkJfQorCQllbHNlCisJCQlwcmsgPSBwcml2X2tleTsKKworCQlpZiAoIWRoLT5tZXRoLT5ibl9tb2RfZXhwKGRoLCBwdWJfa2V5LCBkaC0+ZywgcHJrLCBkaC0+cCwgY3R4LCBtb250KSkgZ290byBlcnI7CisJfQorCQkKKwlkaC0+cHViX2tleT1wdWJfa2V5OworCWRoLT5wcml2X2tleT1wcml2X2tleTsKKwlvaz0xOworZXJyOgorCWlmIChvayAhPSAxKQorCQlESGVycihESF9GX0dFTkVSQVRFX0tFWSxFUlJfUl9CTl9MSUIpOworCisJaWYgKChwdWJfa2V5ICE9IE5VTEwpICAmJiAoZGgtPnB1Yl9rZXkgPT0gTlVMTCkpICBCTl9mcmVlKHB1Yl9rZXkpOworCWlmICgocHJpdl9rZXkgIT0gTlVMTCkgJiYgKGRoLT5wcml2X2tleSA9PSBOVUxMKSkgQk5fZnJlZShwcml2X2tleSk7CisJQk5fQ1RYX2ZyZWUoY3R4KTsKKwlyZXR1cm4ob2spOworCX0KKworc3RhdGljIGludCBjb21wdXRlX2tleSh1bnNpZ25lZCBjaGFyICprZXksIGNvbnN0IEJJR05VTSAqcHViX2tleSwgREggKmRoKQorCXsKKwlCTl9DVFggKmN0eD1OVUxMOworCUJOX01PTlRfQ1RYICptb250PU5VTEw7CisJQklHTlVNICp0bXA7CisJaW50IHJldD0gLTE7CisgICAgICAgIGludCBjaGVja19yZXN1bHQ7CisKKwlpZiAoQk5fbnVtX2JpdHMoZGgtPnApID4gT1BFTlNTTF9ESF9NQVhfTU9EVUxVU19CSVRTKQorCQl7CisJCURIZXJyKERIX0ZfQ09NUFVURV9LRVksREhfUl9NT0RVTFVTX1RPT19MQVJHRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwljdHggPSBCTl9DVFhfbmV3KCk7CisJaWYgKGN0eCA9PSBOVUxMKSBnb3RvIGVycjsKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwl0bXAgPSBCTl9DVFhfZ2V0KGN0eCk7CisJCisJaWYgKGRoLT5wcml2X2tleSA9PSBOVUxMKQorCQl7CisJCURIZXJyKERIX0ZfQ09NUFVURV9LRVksREhfUl9OT19QUklWQVRFX1ZBTFVFKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChkaC0+ZmxhZ3MgJiBESF9GTEFHX0NBQ0hFX01PTlRfUCkKKwkJeworCQltb250ID0gQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgmZGgtPm1ldGhvZF9tb250X3AsCisJCQkJQ1JZUFRPX0xPQ0tfREgsIGRoLT5wLCBjdHgpOworCQlpZiAoKGRoLT5mbGFncyAmIERIX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSkgPT0gMCkKKwkJCXsKKwkJCS8qIFhYWCAqLworCQkJQk5fc2V0X2ZsYWdzKGRoLT5wcml2X2tleSwgQk5fRkxHX0NPTlNUVElNRSk7CisJCQl9CisJCWlmICghbW9udCkKKwkJCWdvdG8gZXJyOworCQl9CisKKyAgICAgICAgaWYgKCFESF9jaGVja19wdWJfa2V5KGRoLCBwdWJfa2V5LCAmY2hlY2tfcmVzdWx0KSB8fCBjaGVja19yZXN1bHQpCisJCXsKKwkJREhlcnIoREhfRl9DT01QVVRFX0tFWSxESF9SX0lOVkFMSURfUFVCS0VZKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICghZGgtPm1ldGgtPmJuX21vZF9leHAoZGgsIHRtcCwgcHViX2tleSwgZGgtPnByaXZfa2V5LGRoLT5wLGN0eCxtb250KSkKKwkJeworCQlESGVycihESF9GX0NPTVBVVEVfS0VZLEVSUl9SX0JOX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisKKwlyZXQ9Qk5fYm4yYmluKHRtcCxrZXkpOworZXJyOgorCWlmIChjdHggIT0gTlVMTCkKKwkJeworCQlCTl9DVFhfZW5kKGN0eCk7CisJCUJOX0NUWF9mcmVlKGN0eCk7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgZGhfYm5fbW9kX2V4cChjb25zdCBESCAqZGgsIEJJR05VTSAqciwKKwkJCWNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCQkJY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKwkJCUJOX01PTlRfQ1RYICptX2N0eCkKKwl7CisJLyogSWYgYSBpcyBvbmx5IG9uZSB3b3JkIGxvbmcgYW5kIGNvbnN0YW50IHRpbWUgaXMgZmFsc2UsIHVzZSB0aGUgZmFzdGVyCisJICogZXhwb25lbmVudGlhdGlvbiBmdW5jdGlvbi4KKwkgKi8KKwlpZiAoYS0+dG9wID09IDEgJiYgKChkaC0+ZmxhZ3MgJiBESF9GTEFHX05PX0VYUF9DT05TVFRJTUUpICE9IDApKQorCQl7CisJCUJOX1VMT05HIEEgPSBhLT5kWzBdOworCQlyZXR1cm4gQk5fbW9kX2V4cF9tb250X3dvcmQocixBLHAsbSxjdHgsbV9jdHgpOworCQl9CisJZWxzZQorCQlyZXR1cm4gQk5fbW9kX2V4cF9tb250KHIsYSxwLG0sY3R4LG1fY3R4KTsKKwl9CisKKworc3RhdGljIGludCBkaF9pbml0KERIICpkaCkKKwl7CisJZGgtPmZsYWdzIHw9IERIX0ZMQUdfQ0FDSEVfTU9OVF9QOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgZGhfZmluaXNoKERIICpkaCkKKwl7CisJaWYoZGgtPm1ldGhvZF9tb250X3ApCisJCUJOX01PTlRfQ1RYX2ZyZWUoZGgtPm1ldGhvZF9tb250X3ApOworCXJldHVybigxKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGhfbGliLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGhfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlZjA4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9saWIuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogY3J5cHRvL2RoL2RoX2xpYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisKK2NvbnN0IGNoYXIgREhfdmVyc2lvbltdPSJEaWZmaWUtSGVsbG1hbiIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCitzdGF0aWMgY29uc3QgREhfTUVUSE9EICpkZWZhdWx0X0RIX21ldGhvZCA9IE5VTEw7CisKK3ZvaWQgREhfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IERIX01FVEhPRCAqbWV0aCkKKwl7CisJZGVmYXVsdF9ESF9tZXRob2QgPSBtZXRoOworCX0KKworY29uc3QgREhfTUVUSE9EICpESF9nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCkKKwl7CisJaWYoIWRlZmF1bHRfREhfbWV0aG9kKQorCQlkZWZhdWx0X0RIX21ldGhvZCA9IERIX09wZW5TU0woKTsKKwlyZXR1cm4gZGVmYXVsdF9ESF9tZXRob2Q7CisJfQorCitpbnQgREhfc2V0X21ldGhvZChESCAqZGgsIGNvbnN0IERIX01FVEhPRCAqbWV0aCkKKwl7CisJLyogTkI6IFRoZSBjYWxsZXIgaXMgc3BlY2lmaWNhbGx5IHNldHRpbmcgYSBtZXRob2QsIHNvIGl0J3Mgbm90IHVwIHRvIHVzCisJICogdG8gZGVhbCB3aXRoIHdoaWNoIEVOR0lORSBpdCBjb21lcyBmcm9tLiAqLworICAgICAgICBjb25zdCBESF9NRVRIT0QgKm10bXA7CisgICAgICAgIG10bXAgPSBkaC0+bWV0aDsKKyAgICAgICAgaWYgKG10bXAtPmZpbmlzaCkgbXRtcC0+ZmluaXNoKGRoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoZGgtPmVuZ2luZSkKKwkJeworCQlFTkdJTkVfZmluaXNoKGRoLT5lbmdpbmUpOworCQlkaC0+ZW5naW5lID0gTlVMTDsKKwkJfQorI2VuZGlmCisgICAgICAgIGRoLT5tZXRoID0gbWV0aDsKKyAgICAgICAgaWYgKG1ldGgtPmluaXQpIG1ldGgtPmluaXQoZGgpOworICAgICAgICByZXR1cm4gMTsKKwl9CisKK0RIICpESF9uZXcodm9pZCkKKwl7CisJcmV0dXJuIERIX25ld19tZXRob2QoTlVMTCk7CisJfQorCitESCAqREhfbmV3X21ldGhvZChFTkdJTkUgKmVuZ2luZSkKKwl7CisJREggKnJldDsKKworCXJldD0oREggKilPUEVOU1NMX21hbGxvYyhzaXplb2YoREgpKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJREhlcnIoREhfRl9ESF9ORVdfTUVUSE9ELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisKKwlyZXQtPm1ldGggPSBESF9nZXRfZGVmYXVsdF9tZXRob2QoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoZW5naW5lKQorCQl7CisJCWlmICghRU5HSU5FX2luaXQoZW5naW5lKSkKKwkJCXsKKwkJCURIZXJyKERIX0ZfREhfTkVXX01FVEhPRCwgRVJSX1JfRU5HSU5FX0xJQik7CisJCQlPUEVOU1NMX2ZyZWUocmV0KTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQlyZXQtPmVuZ2luZSA9IGVuZ2luZTsKKwkJfQorCWVsc2UKKwkJcmV0LT5lbmdpbmUgPSBFTkdJTkVfZ2V0X2RlZmF1bHRfREgoKTsKKwlpZihyZXQtPmVuZ2luZSkKKwkJeworCQlyZXQtPm1ldGggPSBFTkdJTkVfZ2V0X0RIKHJldC0+ZW5naW5lKTsKKwkJaWYoIXJldC0+bWV0aCkKKwkJCXsKKwkJCURIZXJyKERIX0ZfREhfTkVXX01FVEhPRCxFUlJfUl9FTkdJTkVfTElCKTsKKwkJCUVOR0lORV9maW5pc2gocmV0LT5lbmdpbmUpOworCQkJT1BFTlNTTF9mcmVlKHJldCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwlyZXQtPnBhZD0wOworCXJldC0+dmVyc2lvbj0wOworCXJldC0+cD1OVUxMOworCXJldC0+Zz1OVUxMOworCXJldC0+bGVuZ3RoPTA7CisJcmV0LT5wdWJfa2V5PU5VTEw7CisJcmV0LT5wcml2X2tleT1OVUxMOworCXJldC0+cT1OVUxMOworCXJldC0+aj1OVUxMOworCXJldC0+c2VlZCA9IE5VTEw7CisJcmV0LT5zZWVkbGVuID0gMDsKKwlyZXQtPmNvdW50ZXIgPSBOVUxMOworCXJldC0+bWV0aG9kX21vbnRfcD1OVUxMOworCXJldC0+cmVmZXJlbmNlcyA9IDE7CisJcmV0LT5mbGFncz1yZXQtPm1ldGgtPmZsYWdzOworCUNSWVBUT19uZXdfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfREgsIHJldCwgJnJldC0+ZXhfZGF0YSk7CisJaWYgKChyZXQtPm1ldGgtPmluaXQgIT0gTlVMTCkgJiYgIXJldC0+bWV0aC0+aW5pdChyZXQpKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWlmIChyZXQtPmVuZ2luZSkKKwkJCUVOR0lORV9maW5pc2gocmV0LT5lbmdpbmUpOworI2VuZGlmCisJCUNSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX0RILCByZXQsICZyZXQtPmV4X2RhdGEpOworCQlPUEVOU1NMX2ZyZWUocmV0KTsKKwkJcmV0PU5VTEw7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3ZvaWQgREhfZnJlZShESCAqcikKKwl7CisJaW50IGk7CisJaWYociA9PSBOVUxMKSByZXR1cm47CisJaSA9IENSWVBUT19hZGQoJnItPnJlZmVyZW5jZXMsIC0xLCBDUllQVE9fTE9DS19ESCk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJESCIscik7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIkRIX2ZyZWUsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQlhYm9ydCgpOworCX0KKyNlbmRpZgorCisJaWYgKHItPm1ldGgtPmZpbmlzaCkKKwkJci0+bWV0aC0+ZmluaXNoKHIpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmIChyLT5lbmdpbmUpCisJCUVOR0lORV9maW5pc2goci0+ZW5naW5lKTsKKyNlbmRpZgorCisJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfREgsIHIsICZyLT5leF9kYXRhKTsKKworCWlmIChyLT5wICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+cCk7CisJaWYgKHItPmcgIT0gTlVMTCkgQk5fY2xlYXJfZnJlZShyLT5nKTsKKwlpZiAoci0+cSAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHItPnEpOworCWlmIChyLT5qICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+aik7CisJaWYgKHItPnNlZWQpIE9QRU5TU0xfZnJlZShyLT5zZWVkKTsKKwlpZiAoci0+Y291bnRlciAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHItPmNvdW50ZXIpOworCWlmIChyLT5wdWJfa2V5ICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+cHViX2tleSk7CisJaWYgKHItPnByaXZfa2V5ICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+cHJpdl9rZXkpOworCU9QRU5TU0xfZnJlZShyKTsKKwl9CisKK2ludCBESF91cF9yZWYoREggKnIpCisJeworCWludCBpID0gQ1JZUFRPX2FkZCgmci0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfREgpOworI2lmZGVmIFJFRl9QUklOVAorCVJFRl9QUklOVCgiREgiLHIpOworI2VuZGlmCisjaWZkZWYgUkVGX0NIRUNLCisJaWYgKGkgPCAyKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCAiREhfdXAsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQlhYm9ydCgpOworCQl9CisjZW5kaWYKKwlyZXR1cm4gKChpID4gMSkgPyAxIDogMCk7CisJfQorCitpbnQgREhfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCSAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpCisgICAgICAgIHsKKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX0RILCBhcmdsLCBhcmdwLAorCQkJCW5ld19mdW5jLCBkdXBfZnVuYywgZnJlZV9mdW5jKTsKKyAgICAgICAgfQorCitpbnQgREhfc2V0X2V4X2RhdGEoREggKmQsIGludCBpZHgsIHZvaWQgKmFyZykKKwl7CisJcmV0dXJuKENSWVBUT19zZXRfZXhfZGF0YSgmZC0+ZXhfZGF0YSxpZHgsYXJnKSk7CisJfQorCit2b2lkICpESF9nZXRfZXhfZGF0YShESCAqZCwgaW50IGlkeCkKKwl7CisJcmV0dXJuKENSWVBUT19nZXRfZXhfZGF0YSgmZC0+ZXhfZGF0YSxpZHgpKTsKKwl9CisKK2ludCBESF9zaXplKGNvbnN0IERIICpkaCkKKwl7CisJcmV0dXJuKEJOX251bV9ieXRlcyhkaC0+cCkpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9wbWV0aC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2RoX3BtZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlNzJiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaF9wbWV0aC5jCkBAIC0wLDAgKzEsMjU0IEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKworLyogREggcGtleSBjb250ZXh0IHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwkvKiBQYXJhbWV0ZXIgZ2VuIHBhcmFtZXRlcnMgKi8KKwlpbnQgcHJpbWVfbGVuOworCWludCBnZW5lcmF0b3I7CisJaW50IHVzZV9kc2E7CisJLyogS2V5Z2VuIGNhbGxiYWNrIGluZm8gKi8KKwlpbnQgZ2VudG1wWzJdOworCS8qIG1lc3NhZ2UgZGlnZXN0ICovCisJfSBESF9QS0VZX0NUWDsKKworc3RhdGljIGludCBwa2V5X2RoX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCURIX1BLRVlfQ1RYICpkY3R4OworCWRjdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoREhfUEtFWV9DVFgpKTsKKwlpZiAoIWRjdHgpCisJCXJldHVybiAwOworCWRjdHgtPnByaW1lX2xlbiA9IDEwMjQ7CisJZGN0eC0+Z2VuZXJhdG9yID0gMjsKKwlkY3R4LT51c2VfZHNhID0gMDsKKworCWN0eC0+ZGF0YSA9IGRjdHg7CisJY3R4LT5rZXlnZW5faW5mbyA9IGRjdHgtPmdlbnRtcDsKKwljdHgtPmtleWdlbl9pbmZvX2NvdW50ID0gMjsKKwkKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9kaF9jb3B5KEVWUF9QS0VZX0NUWCAqZHN0LCBFVlBfUEtFWV9DVFggKnNyYykKKwl7CisJREhfUEtFWV9DVFggKmRjdHgsICpzY3R4OworCWlmICghcGtleV9kaF9pbml0KGRzdCkpCisJCXJldHVybiAwOworICAgICAgIAlzY3R4ID0gc3JjLT5kYXRhOworCWRjdHggPSBkc3QtPmRhdGE7CisJZGN0eC0+cHJpbWVfbGVuID0gc2N0eC0+cHJpbWVfbGVuOworCWRjdHgtPmdlbmVyYXRvciA9IHNjdHgtPmdlbmVyYXRvcjsKKwlkY3R4LT51c2VfZHNhID0gc2N0eC0+dXNlX2RzYTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyB2b2lkIHBrZXlfZGhfY2xlYW51cChFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJREhfUEtFWV9DVFggKmRjdHggPSBjdHgtPmRhdGE7CisJaWYgKGRjdHgpCisJCU9QRU5TU0xfZnJlZShkY3R4KTsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9kaF9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgdHlwZSwgaW50IHAxLCB2b2lkICpwMikKKwl7CisJREhfUEtFWV9DVFggKmRjdHggPSBjdHgtPmRhdGE7CisJc3dpdGNoICh0eXBlKQorCQl7CisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9ESF9QQVJBTUdFTl9QUklNRV9MRU46CisJCWlmIChwMSA8IDI1NikKKwkJCXJldHVybiAtMjsKKwkJZGN0eC0+cHJpbWVfbGVuID0gcDE7CisJCXJldHVybiAxOworCisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9ESF9QQVJBTUdFTl9HRU5FUkFUT1I6CisJCWRjdHgtPmdlbmVyYXRvciA9IHAxOworCQlyZXR1cm4gMTsKKworCQljYXNlIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVk6CisJCS8qIERlZmF1bHQgYmVoYXZpb3VyIGlzIE9LICovCisJCXJldHVybiAxOworCisJCWRlZmF1bHQ6CisJCXJldHVybiAtMjsKKworCQl9CisJfQorCisJCQkKK3N0YXRpYyBpbnQgcGtleV9kaF9jdHJsX3N0cihFVlBfUEtFWV9DVFggKmN0eCwKKwkJCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQorCXsKKwlpZiAoIXN0cmNtcCh0eXBlLCAiZGhfcGFyYW1nZW5fcHJpbWVfbGVuIikpCisJCXsKKwkJaW50IGxlbjsKKwkJbGVuID0gYXRvaSh2YWx1ZSk7CisJCXJldHVybiBFVlBfUEtFWV9DVFhfc2V0X2RoX3BhcmFtZ2VuX3ByaW1lX2xlbihjdHgsIGxlbik7CisJCX0KKwlpZiAoIXN0cmNtcCh0eXBlLCAiZGhfcGFyYW1nZW5fZ2VuZXJhdG9yIikpCisJCXsKKwkJaW50IGxlbjsKKwkJbGVuID0gYXRvaSh2YWx1ZSk7CisJCXJldHVybiBFVlBfUEtFWV9DVFhfc2V0X2RoX3BhcmFtZ2VuX2dlbmVyYXRvcihjdHgsIGxlbik7CisJCX0KKwlyZXR1cm4gLTI7CisJfQorCitzdGF0aWMgaW50IHBrZXlfZGhfcGFyYW1nZW4oRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlESCAqZGggPSBOVUxMOworCURIX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOworCUJOX0dFTkNCICpwY2IsIGNiOworCWludCByZXQ7CisJaWYgKGN0eC0+cGtleV9nZW5jYikKKwkJeworCQlwY2IgPSAmY2I7CisJCWV2cF9wa2V5X3NldF9jYl90cmFuc2xhdGUocGNiLCBjdHgpOworCQl9CisJZWxzZQorCQlwY2IgPSBOVUxMOworCWRoID0gREhfbmV3KCk7CisJaWYgKCFkaCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gREhfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChkaCwKKwkJCQkJZGN0eC0+cHJpbWVfbGVuLCBkY3R4LT5nZW5lcmF0b3IsIHBjYik7CisJaWYgKHJldCkKKwkJRVZQX1BLRVlfYXNzaWduX0RIKHBrZXksIGRoKTsKKwllbHNlCisJCURIX2ZyZWUoZGgpOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IHBrZXlfZGhfa2V5Z2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSkKKwl7CisJREggKmRoID0gTlVMTDsKKwlpZiAoY3R4LT5wa2V5ID09IE5VTEwpCisJCXsKKwkJREhlcnIoREhfRl9QS0VZX0RIX0tFWUdFTiwgREhfUl9OT19QQVJBTUVURVJTX1NFVCk7CisJCXJldHVybiAwOworCQl9CisJZGggPSBESF9uZXcoKTsKKwlpZiAoIWRoKQorCQlyZXR1cm4gMDsKKwlFVlBfUEtFWV9hc3NpZ25fREgocGtleSwgZGgpOworCS8qIE5vdGU6IGlmIGVycm9yIHJldHVybiwgcGtleSBpcyBmcmVlZCBieSBwYXJlbnQgcm91dGluZSAqLworCWlmICghRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzKHBrZXksIGN0eC0+cGtleSkpCisJCXJldHVybiAwOworCXJldHVybiBESF9nZW5lcmF0ZV9rZXkocGtleS0+cGtleS5kaCk7CisJfQorCitzdGF0aWMgaW50IHBrZXlfZGhfZGVyaXZlKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICprZXksIHNpemVfdCAqa2V5bGVuKQorCXsKKwlpbnQgcmV0OworCWlmICghY3R4LT5wa2V5IHx8ICFjdHgtPnBlZXJrZXkpCisJCXsKKwkJREhlcnIoREhfRl9QS0VZX0RIX0RFUklWRSwgREhfUl9LRVlTX05PVF9TRVQpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldCA9IERIX2NvbXB1dGVfa2V5KGtleSwgY3R4LT5wZWVya2V5LT5wa2V5LmRoLT5wdWJfa2V5LAorCQkJCQkJCWN0eC0+cGtleS0+cGtleS5kaCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKmtleWxlbiA9IHJldDsKKwlyZXR1cm4gMTsKKwl9CisKK2NvbnN0IEVWUF9QS0VZX01FVEhPRCBkaF9wa2V5X21ldGggPSAKKwl7CisJRVZQX1BLRVlfREgsCisJRVZQX1BLRVlfRkxBR19BVVRPQVJHTEVOLAorCXBrZXlfZGhfaW5pdCwKKwlwa2V5X2RoX2NvcHksCisJcGtleV9kaF9jbGVhbnVwLAorCisJMCwKKwlwa2V5X2RoX3BhcmFtZ2VuLAorCisJMCwKKwlwa2V5X2RoX2tleWdlbiwKKworCTAsCisJMCwKKworCTAsCisJMCwKKworCTAsMCwKKworCTAsMCwwLDAsCisKKwkwLDAsCisKKwkwLDAsCisKKwkwLAorCXBrZXlfZGhfZGVyaXZlLAorCisJcGtleV9kaF9jdHJsLAorCXBrZXlfZGhfY3RybF9zdHIKKworCX07CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGh0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZGh0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgyZjVjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9kaHRlc3QuYwpAQCAtMCwwICsxLDIyNiBAQAorLyogY3J5cHRvL2RoL2RodGVzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIFVudGlsIHRoZSBrZXktZ2VuIGNhbGxiYWNrcyBhcmUgbW9kaWZpZWQgdG8gdXNlIG5ld2VyIHByb3RvdHlwZXMsIHdlIGFsbG93CisgKiBkZXByZWNhdGVkIGZ1bmN0aW9ucyBmb3Igb3BlbnNzbC1pbnRlcm5hbCBjb2RlICovCisjaWZkZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjdW5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICIuLi9lX29zLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX0RICitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHByaW50ZigiTm8gREggc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4xNgorI2RlZmluZSBNU19DQUxMQkFDSwlfZmFyIF9sb2FkZHMKKyNlbHNlCisjZGVmaW5lIE1TX0NBTExCQUNLCisjZW5kaWYKKworc3RhdGljIGludCBNU19DQUxMQkFDSyBjYihpbnQgcCwgaW50IG4sIEJOX0dFTkNCICphcmcpOworCitzdGF0aWMgY29uc3QgY2hhciBybmRfc2VlZFtdID0gInN0cmluZyB0byBtYWtlIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0aGluayBpdCBoYXMgZW50cm9weSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisJeworCUJOX0dFTkNCIF9jYjsKKwlESCAqYTsKKwlESCAqYj1OVUxMOworCWNoYXIgYnVmWzEyXTsKKwl1bnNpZ25lZCBjaGFyICphYnVmPU5VTEwsKmJidWY9TlVMTDsKKwlpbnQgaSxhbGVuLGJsZW4sYW91dCxib3V0LHJldD0xOworCUJJTyAqb3V0OworCisJQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCk7CisJQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyhWX0NSWVBUT19NREVCVUdfQUxMKTsKKwlDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PTik7CisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4zMgorCUNSWVBUT19tYWxsb2NfaW5pdCgpOworI2VuZGlmCisKKwlSQU5EX3NlZWQocm5kX3NlZWQsIHNpemVvZiBybmRfc2VlZCk7CisKKwlvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChvdXQgPT0gTlVMTCkgRVhJVCgxKTsKKwlCSU9fc2V0X2ZwKG91dCxzdGRvdXQsQklPX05PQ0xPU0UpOworCisJQk5fR0VOQ0Jfc2V0KCZfY2IsICZjYiwgb3V0KTsKKwlpZigoKGEgPSBESF9uZXcoKSkgPT0gTlVMTCkgfHwgIURIX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoYSwgNjQsCisJCQkJREhfR0VORVJBVE9SXzUsICZfY2IpKQorCQlnb3RvIGVycjsKKworCWlmICghREhfY2hlY2soYSwgJmkpKSBnb3RvIGVycjsKKwlpZiAoaSAmIERIX0NIRUNLX1BfTk9UX1BSSU1FKQorCQlCSU9fcHV0cyhvdXQsICJwIHZhbHVlIGlzIG5vdCBwcmltZVxuIik7CisJaWYgKGkgJiBESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FKQorCQlCSU9fcHV0cyhvdXQsICJwIHZhbHVlIGlzIG5vdCBhIHNhZmUgcHJpbWVcbiIpOworCWlmIChpICYgREhfVU5BQkxFX1RPX0NIRUNLX0dFTkVSQVRPUikKKwkJQklPX3B1dHMob3V0LCAidW5hYmxlIHRvIGNoZWNrIHRoZSBnZW5lcmF0b3IgdmFsdWVcbiIpOworCWlmIChpICYgREhfTk9UX1NVSVRBQkxFX0dFTkVSQVRPUikKKwkJQklPX3B1dHMob3V0LCAidGhlIGcgdmFsdWUgaXMgbm90IGEgZ2VuZXJhdG9yXG4iKTsKKworCUJJT19wdXRzKG91dCwiXG5wICAgID0iKTsKKwlCTl9wcmludChvdXQsYS0+cCk7CisJQklPX3B1dHMob3V0LCJcbmcgICAgPSIpOworCUJOX3ByaW50KG91dCxhLT5nKTsKKwlCSU9fcHV0cyhvdXQsIlxuIik7CisKKwliPURIX25ldygpOworCWlmIChiID09IE5VTEwpIGdvdG8gZXJyOworCisJYi0+cD1CTl9kdXAoYS0+cCk7CisJYi0+Zz1CTl9kdXAoYS0+Zyk7CisJaWYgKChiLT5wID09IE5VTEwpIHx8IChiLT5nID09IE5VTEwpKSBnb3RvIGVycjsKKworCS8qIFNldCBhIHRvIHJ1biB3aXRoIG5vcm1hbCBtb2RleHAgYW5kIGIgdG8gdXNlIGNvbnN0YW50IHRpbWUgKi8KKwlhLT5mbGFncyAmPSB+REhfRkxBR19OT19FWFBfQ09OU1RUSU1FOworCWItPmZsYWdzIHw9IERIX0ZMQUdfTk9fRVhQX0NPTlNUVElNRTsKKworCWlmICghREhfZ2VuZXJhdGVfa2V5KGEpKSBnb3RvIGVycjsKKwlCSU9fcHV0cyhvdXQsInByaSAxPSIpOworCUJOX3ByaW50KG91dCxhLT5wcml2X2tleSk7CisJQklPX3B1dHMob3V0LCJcbnB1YiAxPSIpOworCUJOX3ByaW50KG91dCxhLT5wdWJfa2V5KTsKKwlCSU9fcHV0cyhvdXQsIlxuIik7CisKKwlpZiAoIURIX2dlbmVyYXRlX2tleShiKSkgZ290byBlcnI7CisJQklPX3B1dHMob3V0LCJwcmkgMj0iKTsKKwlCTl9wcmludChvdXQsYi0+cHJpdl9rZXkpOworCUJJT19wdXRzKG91dCwiXG5wdWIgMj0iKTsKKwlCTl9wcmludChvdXQsYi0+cHViX2tleSk7CisJQklPX3B1dHMob3V0LCJcbiIpOworCisJYWxlbj1ESF9zaXplKGEpOworCWFidWY9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhhbGVuKTsKKwlhb3V0PURIX2NvbXB1dGVfa2V5KGFidWYsYi0+cHViX2tleSxhKTsKKworCUJJT19wdXRzKG91dCwia2V5MSA9Iik7CisJZm9yIChpPTA7IGk8YW91dDsgaSsrKQorCQl7CisJCXNwcmludGYoYnVmLCIlMDJYIixhYnVmW2ldKTsKKwkJQklPX3B1dHMob3V0LGJ1Zik7CisJCX0KKwlCSU9fcHV0cyhvdXQsIlxuIik7CisKKwlibGVuPURIX3NpemUoYik7CisJYmJ1Zj0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGJsZW4pOworCWJvdXQ9REhfY29tcHV0ZV9rZXkoYmJ1ZixhLT5wdWJfa2V5LGIpOworCisJQklPX3B1dHMob3V0LCJrZXkyID0iKTsKKwlmb3IgKGk9MDsgaTxib3V0OyBpKyspCisJCXsKKwkJc3ByaW50ZihidWYsIiUwMlgiLGJidWZbaV0pOworCQlCSU9fcHV0cyhvdXQsYnVmKTsKKwkJfQorCUJJT19wdXRzKG91dCwiXG4iKTsKKwlpZiAoKGFvdXQgPCA0KSB8fCAoYm91dCAhPSBhb3V0KSB8fCAobWVtY21wKGFidWYsYmJ1Zixhb3V0KSAhPSAwKSkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gREggcm91dGluZXNcbiIpOworCQlyZXQ9MTsKKwkJfQorCWVsc2UKKwkJcmV0PTA7CitlcnI6CisJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCisJaWYgKGFidWYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGFidWYpOworCWlmIChiYnVmICE9IE5VTEwpIE9QRU5TU0xfZnJlZShiYnVmKTsKKwlpZihiICE9IE5VTEwpIERIX2ZyZWUoYik7CisJaWYoYSAhPSBOVUxMKSBESF9mcmVlKGEpOworCUJJT19mcmVlKG91dCk7CisjaWZkZWYgT1BFTlNTTF9TWVNfTkVUV0FSRQorICAgIGlmIChyZXQpIHByaW50ZigiRVJST1I6ICVkXG4iLCByZXQpOworI2VuZGlmCisJRVhJVChyZXQpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBNU19DQUxMQkFDSyBjYihpbnQgcCwgaW50IG4sIEJOX0dFTkNCICphcmcpCisJeworCWNoYXIgYz0nKic7CisKKwlpZiAocCA9PSAwKSBjPScuJzsKKwlpZiAocCA9PSAxKSBjPScrJzsKKwlpZiAocCA9PSAyKSBjPScqJzsKKwlpZiAocCA9PSAzKSBjPSdcbic7CisJQklPX3dyaXRlKGFyZy0+YXJnLCZjLDEpOworCSh2b2lkKUJJT19mbHVzaChhcmctPmFyZyk7CisjaWZkZWYgTElOVAorCXA9bjsKKyNlbmRpZgorCXJldHVybiAxOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2V4YW1wbGUgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZXhhbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEzM2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2V4YW1wbGUKQEAgLTAsMCArMSw1MCBAQAorRnJvbSBvd25lci1jeXBoZXJwdW5rc0B0b2FkLmNvbSBNb24gU2VwIDI1IDEwOjUwOjUxIDE5OTUKK1JlY2VpdmVkOiBmcm9tIG1pbmJuZS5taW5jb20ub3ouYXUgYnkgb3JiLm1pbmNvbS5vei5hdSB3aXRoIFNNVFAgaWQgQUExMDU2MgorICAoNS42NWMvSURBLTEuNC40IGZvciBlYXkpOyBXZWQsIDI3IFNlcCAxOTk1IDE5OjQxOjU1ICsxMDAwCitSZWNlaXZlZDogYnkgbWluYm5lLm1pbmNvbS5vei5hdSBpZCBBQTE5OTU4CisgICg1LjY1Yy9JREEtMS40LjQgZm9yIGVheUBvcmIubWluY29tLm96LmF1KTsgV2VkLCAyNyBTZXAgMTk5NSAxOTozNDo1OSArMTAwMAorUmVjZWl2ZWQ6IGZyb20gcmVsYXkzLlVVLk5FVCBieSBidW55aXAuY2MudXEub3ouYXUgd2l0aCBTTVRQIChQUCk7CisgICAgICAgICAgV2VkLCAyNyBTZXAgMTk5NSAxOToxMzowNSArMTAwMAorUmVjZWl2ZWQ6IGZyb20gdG9hZC5jb20gYnkgcmVsYXkzLlVVLk5FVCB3aXRoIFNNVFAgaWQgUVF6aXpiMTYxNTY7CisgICAgICAgICAgV2VkLCAyNyBTZXAgMTk5NSAwNDo0ODo0NiAtMDQwMAorUmVjZWl2ZWQ6IGJ5IHRvYWQuY29tIGlkIEFBMDc5MDU7IFR1ZSwgMjYgU2VwIDk1IDA2OjMxOjQ1IFBEVAorUmVjZWl2ZWQ6IGZyb20gYnkgdG9hZC5jb20gaWQgQUIwNzg1MTsgVHVlLCAyNiBTZXAgOTUgMDY6MzE6NDAgUERUCitSZWNlaXZlZDogZnJvbSBzZXJ2by5xdWFsY29tbS5jb20gKHNlcnZvLnF1YWxjb21tLmNvbSBbMTI5LjQ2LjEyOC4xNF0pIAorICAgICAgICAgIGJ5IGN5Z251cy5jb20gKDguNi4xMi84LjYuOSkgd2l0aCBFU01UUCBpZCBSQUExODQ0MiAKKyAgICAgICAgICBmb3IgPGN5cGhlcnB1bmtzQHRvYWQuY29tPjsgTW9uLCAyNSBTZXAgMTk5NSAxNzo1Mjo0NyAtMDcwMAorUmVjZWl2ZWQ6IChrYXJuQGxvY2FsaG9zdCkgYnkgc2Vydm8ucXVhbGNvbW0uY29tICg4LjYuMTIvUUMtQlNELTIuNS4xKSAKKyAgICAgICAgICBpZCBSQUExNDczMjsgTW9uLCAyNSBTZXAgMTk5NSAxNzo1MDo1MSAtMDcwMAorRGF0ZTogTW9uLCAyNSBTZXAgMTk5NSAxNzo1MDo1MSAtMDcwMAorRnJvbTogUGhpbCBLYXJuIDxrYXJuQHF1YWxjb21tLmNvbT4KK01lc3NhZ2UtSWQ6IDwxOTk1MDkyNjAwNTAuUkFBMTQ3MzJAc2Vydm8ucXVhbGNvbW0uY29tPgorVG86IGN5cGhlcnB1bmtzQHRvYWQuY29tLCBpcHNlYy1kZXZAZWl0LmNvbQorU3ViamVjdDogUHJpbWFsaXR5IHZlcmlmaWNhdGlvbiBuZWVkZWQKK1NlbmRlcjogb3duZXItY3lwaGVycHVua3NAdG9hZC5jb20KK1ByZWNlZGVuY2U6IGJ1bGsKK1N0YXR1czogUk8KK1gtU3RhdHVzOiAKKworSGkuIEkndmUgZ2VuZXJhdGVkIGEgMjA0Ny1iaXQgInN0cm9uZyIgcHJpbWUgbnVtYmVyIHRoYXQgSSB3b3VsZCBsaWtlIHRvCit1c2Ugd2l0aCBEaWZmaWUtSGVsbG1hbiBrZXkgZXhjaGFuZ2UuIEkgYXNzZXJ0IHRoYXQgbm90IG9ubHkgaXMgdGhpcyBudW1iZXIKKydwJyBwcmltZSwgYnV0IHNvIGlzIChwLTEpLzIuCisKK0kndmUgdXNlZCB0aGUgbXB6X3Byb2JhYl9wcmltZSgpIGZ1bmN0aW9uIGluIHRoZSBHbnUgTWF0aCBQYWNrYWdlIChHTVApIHZlcnNpb24KKzEuMy4yIHRvIHRlc3QgdGhpcyBudW1iZXIuIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgTWlsbGVyLVJhYmluIHByaW1hbGl0eSB0ZXN0LgorSG93ZXZlciwgdG8gaW5jcmVhc2UgbXkgY29uZmlkZW5jZSB0aGF0IHRoaXMgbnVtYmVyIHJlYWxseSBpcyBhIHN0cm9uZyBwcmltZSwKK0knZCBsaWtlIHRvIGFzayBvdGhlcnMgdG8gY29uZmlybSBpdCB3aXRoIG90aGVyIHRlc3RzLiBIZXJlJ3MgdGhlIG51bWJlciBpbiBoZXg6CisKKzcyYTkyNWY3NjBiMmY5NTRlZDI4N2YxYjA5NTNmM2U2YWVmOTJlNDU2MTcyZjlmZTg2ZmRkODgyMjI0MWI5Yzk3ODhmYmMyODk5ODI3NDNlCitmYmNkMmNjZjA2MmIyNDJkN2E1NjdiYThiYmI0MGQ3OWJjYTdiOGUwYjZjMDVmODM1YTViOTM4ZDk4NTgxNmJjNjQ4OTg1YWRjZmY1NDAyYQorYTc2NzU2YjM2Yzg0NWE4NDBhMWQwNTljZTAyNzA3ZTE5Y2Y0N2FmMGI1YTg4MmYzMjMxNWMxOWQxYjg2YTU2YzUzODljNWU5YmVlMTZiNjUKK2ZkZTdiMWE4ZDc0YTc2NzVkZTliNzA3ZDRjNWE0NjMzYzAyOTBjOTVmZjMwYTYwNWFlYjdhZTg2NGZmNDgzNzBmMTNjZjAxZDQ5YWRiOWYyCiszZDE5YTQzOWY3NTNlZTc3MDNjZjM0MmQ4N2Y0MzExMDVjODQzYzc4Y2E0ZGY2Mzk5MzFmMzQ1OGZhZThhOTRkMTY4N2U5OWE3NmVkOTlkMAorYmE4NzE4OWY0MmZkMzFhZDgyNjJjNTRhOGNmNTkxNGFlNmMyOGM1NDBkNzE0YTVmNjA4N2ExNzFmYjc0ZjQ4MTRjNmY5NjhkNzIzODZlZjMKKzU2YTA1MTgwYzNiZWM3ZGRkNWVmNmZlNzZiMWY3MTdiCisKK1RoZSBnZW5lcmF0b3IsIGcsIGZvciB0aGlzIHByaW1lIGlzIDIuCisKK1RoYW5rcyEKKworUGhpbCBLYXJuCisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RoL2dlbmVyYXRlIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL2dlbmVyYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDA3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvZ2VuZXJhdGUKQEAgLTAsMCArMSw2NSBAQAorRnJvbTogc3Rld2FydHNAaXgubmV0Y29tLmNvbSAoQmlsbCBTdGV3YXJ0KQorTmV3c2dyb3Vwczogc2NpLmNyeXB0CitTdWJqZWN0OiBSZTogRGlmZmllLUhlbGxtYW4ga2V5IGV4Y2hhbmdlCitEYXRlOiBXZWQsIDExIE9jdCAxOTk1IDIzOjA4OjI4IEdNVAorT3JnYW5pemF0aW9uOiBGcmVlbGFuY2UgSW5mb3JtYXRpb24gQXJjaGl0ZWN0CitMaW5lczogMzIKK01lc3NhZ2UtSUQ6IDw0NWhpcjIkN2w4QGl4bmV3czcuaXgubmV0Y29tLmNvbT4KK1JlZmVyZW5jZXM6IDw0NThyaG4kNzZtJDFAbWhhZGYucHJvZHVjdGlvbi5jb21wdXNlcnZlLmNvbT4KK05OVFAtUG9zdGluZy1Ib3N0OiBpeC1wbDQtMTYuaXgubmV0Y29tLmNvbQorWC1ORVRDT00tRGF0ZTogV2VkIE9jdCAxMSAgNDowOToyMiBQTSBQRFQgMTk5NQorWC1OZXdzcmVhZGVyOiBGb3J0ZSBGcmVlIEFnZW50IDEuMC44MgorCitLZW50IEJyaWdncyA8NzIxMjQuMzIzNEBDb21wdVNlcnZlLkNPTT4gd3JvdGU6CisKKz5JIGhhdmUgYSBjb3B5IG9mIHRoZSAxOTc2IElFRUUgYXJ0aWNsZSBkZXNjcmliaW5nIHRoZQorPkRpZmZpZS1IZWxsbWFuIHB1YmxpYyBrZXkgZXhjaGFuZ2UgYWxnb3JpdGhtOiB5PWFeeCBtb2QgcS4gIEknbQorPmxvb2tpbmcgZm9yIHNvdXJjZXMgdGhhdCBnaXZlIGV4YW1wbGVzIG9mIHNlY3VyZSBhLHEgcGFpcnMgYW5kCis+cG9zc2libGUgc29tZSBzb3VyY2UgY29kZSB0aGF0IEkgY291bGQgZXhhbWluZS4KKworcSBzaG91bGQgYmUgcHJpbWUsIGFuZCBpZGVhbGx5IHNob3VsZCBiZSBhICJzdHJvbmcgcHJpbWUiLAord2hpY2ggbWVhbnMgaXQncyBvZiB0aGUgZm9ybSAybisxIHdoZXJlIG4gaXMgYWxzbyBwcmltZS4KK3EgYWxzbyBuZWVkcyB0byBiZSBsb25nIGVub3VnaCB0byBwcmV2ZW50IHRoZSBhdHRhY2tzIExhTWFjY2hpYSBhbmQKK09kbHl6a28gZGVzY3JpYmVkIChzb21lIHZhcmlhbnQgb24gYSBmYWN0b3JpbmcgYXR0YWNrIHdoaWNoIGdlbmVyYXRlcworYSBsYXJnZSBwaWxlIG9mIHNpbXVsdGFuZW91cyBlcXVhdGlvbnMgYW5kIHRoZW4gc29sdmVzIHRoZW0pOworbG9uZyBlbm91Z2ggaXMgYWJvdXQgdGhlIHNhbWUgc2l6ZSBhcyBmYWN0b3JpbmcsIHNvIDUxMiBiaXRzIG1heSBub3QKK2JlIHNlY3VyZSBlbm91Z2ggZm9yIG1vc3QgYXBwbGljYXRpb25zLiAgKFRoZSAxOTIgYml0cyB1c2VkIGJ5Cisic2VjdXJlIE5GUyIgd2FzIGNlcnRhaW5seSBub3QgbG9uZyBlbm91Z2guKQorCithIHNob3VsZCBiZSBhIGdlbmVyYXRvciBmb3IgcSwgd2hpY2ggbWVhbnMgaXQgbmVlZHMgdG8gYmUKK3JlbGF0aXZlbHkgcHJpbWUgdG8gcS0xLiAgIFVzdWFsbHkgYSBzbWFsbCBwcmltZSBsaWtlIDIsIDMgb3IgNSB3aWxsCit3b3JrLiAgCisKKy4uLi4KKworRGF0ZTogVHVlLCAyNiBTZXAgMTk5NSAxMzo1MjozNiBNU1QKK0Zyb206ICJSaWNoYXJkIFNjaHJvZXBwZWwiIDxyY3NAY3MuYXJpem9uYS5lZHU+CitUbzoga2FybgorQ2M6IGhvQGNzLmFyaXpvbmEuZWR1CitTdWJqZWN0OiByYW5kb20gbGFyZ2UgcHJpbWVzCisKK1NpbmNlIHlvdXIgcHJpbWUgaXMgcmVhbGx5IHJhbmRvbSwgcHJvdmluZyBpdCBpcyBoYXJkLgorTXkgcGVyc29uYWwgbGltaXQgb24gcmlnb3JvdXNseSBwcm92ZWQgcHJpbWVzIGlzIH4zNTAgZGlnaXRzLgorSWYgeW91IHJlYWxseSB3YW50IGEgcHJvb2YsIHdlIHNob3VsZCB0YWxrIHRvIEZyYW5jb2lzIE1vcmFpbiwKK29yIHRoZSBBdXN0cmFsaWFuIGdyb3VwLgorCitJZiB5b3Ugd2FudCAyIHRvIGJlIGEgZ2VuZXJhdG9yIChtb2QgUCksIHRoZW4geW91IG5lZWQgaXQKK3RvIGJlIGEgbm9uLXNxdWFyZS4gIElmIChQLTEpLzIgaXMgYWxzbyBwcmltZSwgdGhlbgorbm9uLXNxdWFyZSA9PSBwcmltaXRpdmUtcm9vdCBmb3IgYmFzZXMgPDwgUC4KKworSW4gdGhlIGNhc2UgYXQgaGFuZCwgdGhpcyBtZWFucyAyIGlzIGEgZ2VuZXJhdG9yIGlmZiBQID0gMTEgKG1vZCAyNCkuCitJZiB5b3Ugd2FudCB0aGlzLCB5b3Ugc2hvdWxkIHJlc3RyaWN0IHlvdXIgc2lldmUgYWNjb3JkaW5nbHkuCisKKzMgaXMgYSBnZW5lcmF0b3IgaWZmIFAgPSA1IChtb2QgMTIpLgorCis1IGlzIGEgZ2VuZXJhdG9yIGlmZiBQID0gMyBvciA3IChtb2QgMTApLgorCisyIGlzIHBlcmZlY3RseSB1c2FibGUgYXMgYSBiYXNlIGV2ZW4gaWYgaXQncyBhIG5vbi1nZW5lcmF0b3IsIHNpbmNlCitpdCBzdGlsbCBjb3ZlcnMgaGFsZiB0aGUgc3BhY2Ugb2YgcG9zc2libGUgcmVzaWR1ZXMuICBBbmQgYW4KK2VhdmVzZHJvcHBlciBjYW4gYWx3YXlzIGRldGVybWluZSB0aGUgbG93LWJpdCBvZiB5b3VyIGV4cG9uZW50IGZvcgorYSBnZW5lcmF0b3IgYW55d2F5LgorCitSaWNoICByY3NAY3MuYXJpem9uYS5lZHUKKworCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9wMTAyNC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL3AxMDI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4Y2VjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9wMTAyNC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIGNyeXB0by9kaC9wMTAyNC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKwordW5zaWduZWQgY2hhciBkYXRhW109ezB4OTcsMHhGNiwweDQyLDB4NjEsMHhDQSwweEI1LDB4MDUsMHhERCwKKwkweDI4LDB4MjgsMHhFMSwweDNGLDB4MUQsMHg2OCwweEI2LDB4RDMsCisJMHhEQiwweEQwLDB4RjMsMHgxMywweDA0LDB4N0YsMHg0MCwweEU4LAorCTB4NTYsMHhEQSwweDU4LDB4Q0IsMHgxMywweEI4LDB4QTEsMHhCRiwKKwkweDJCLDB4NzgsMHgzQSwweDRDLDB4NkQsMHg1OSwweEQ1LDB4RjksCisJMHgyQSwweEZDLDB4NkMsMHhGRiwweDNELDB4NjksMHgzRiwweDc4LAorCTB4QjIsMHgzRCwweDRGLDB4MzEsMHg2MCwweEE5LDB4NTAsMHgyRSwKKwkweDNFLDB4RkEsMHhGNywweEFCLDB4NUUsMHgxQSwweEQ1LDB4QTYsCisJMHg1RSwweDU1LDB4NDMsMHgxMywweDgyLDB4OEQsMHhBOCwweDNCLAorCTB4OUYsMHhGMiwweEQ5LDB4NDEsMHhERSwweEU5LDB4NTYsMHg4OSwKKwkweEZBLDB4REEsMHhFQSwweDA5LDB4MzYsMHhBRCwweERGLDB4MTksCisJMHg3MSwweEZFLDB4NjMsMHg1QiwweDIwLDB4QUYsMHg0NywweDAzLAorCTB4NjQsMHg2MCwweDNDLDB4MkQsMHhFMCwweDU5LDB4RjUsMHg0QiwKKwkweDY1LDB4MEEsMHhEOCwweEZBLDB4MEMsMHhGNywweDAxLDB4MjEsCisJMHhDNywweDQ3LDB4OTksMHhENywweDU4LDB4NzEsMHgzMiwweEJFLAorCTB4OUIsMHg5OSwweDlCLDB4QjksMHhCNywweDg3LDB4RTgsMHhBQiwKKwl9OworCittYWluKCkKKwl7CisJREggKmRoOworCisJZGg9REhfbmV3KCk7CisJZGgtPnA9Qk5fYmluMmJuKGRhdGEsc2l6ZW9mKGRhdGEpLE5VTEwpOworCWRoLT5nPUJOX25ldygpOworCUJOX3NldF93b3JkKGRoLT5nLDIpOworCVBFTV93cml0ZV9ESHBhcmFtcyhzdGRvdXQsZGgpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kaC9wMTkyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvcDE5Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZGY0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZGgvcDE5Mi5jCkBAIC0wLDAgKzEsODAgQEAKKy8qIGNyeXB0by9kaC9wMTkyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCit1bnNpZ25lZCBjaGFyIGRhdGFbXT17CisweEQ0LDB4QTAsMHhCQSwweDAyLDB4NTAsMHhCNiwweEZELDB4MkUsCisweEM2LDB4MjYsMHhFNywweEVGLDB4RDYsMHgzNywweERGLDB4NzYsCisweEM3LDB4MTYsMHhFMiwweDJELDB4MDksMHg0NCwweEI4LDB4OEIsCisJfTsKKworbWFpbigpCisJeworCURIICpkaDsKKworCWRoPURIX25ldygpOworCWRoLT5wPUJOX2JpbjJibihkYXRhLHNpemVvZihkYXRhKSxOVUxMKTsKKwlkaC0+Zz1CTl9uZXcoKTsKKwlCTl9zZXRfd29yZChkaC0+ZywzKTsKKwlQRU1fd3JpdGVfREhwYXJhbXMoc3Rkb3V0LGRoKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZGgvcDUxMi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL3A1MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWI2YWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RoL3A1MTIuYwpAQCAtMCwwICsxLDg1IEBACisvKiBjcnlwdG8vZGgvcDUxMi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKwordW5zaWduZWQgY2hhciBkYXRhW109eworMHhEQSwweDU4LDB4M0MsMHgxNiwweEQ5LDB4ODUsMHgyMiwweDg5LAorMHhEMCwweEU0LDB4QUYsMHg3NSwweDZGLDB4NEMsMHhDQSwweDkyLAorMHhERCwweDRCLDB4RTUsMHgzMywweEI4LDB4MDQsMHhGQiwweDBGLAorMHhFRCwweDk0LDB4RUYsMHg5QywweDhBLDB4NDQsMHgwMywweEVELAorMHg1NywweDQ2LDB4NTAsMHhEMywweDY5LDB4OTksMHhEQiwweDI5LAorMHhENywweDc2LDB4MjcsMHg2QiwweEEyLDB4RDMsMHhENCwweDEyLAorMHhFMiwweDE4LDB4RjQsMHhERCwweDFFLDB4MDgsMHg0QywweEY2LAorMHhEOCwweDAwLDB4M0UsMHg3QywweDQ3LDB4NzQsMHhFOCwweDMzLAorCX07CisKK21haW4oKQorCXsKKwlESCAqZGg7CisKKwlkaD1ESF9uZXcoKTsKKwlkaC0+cD1CTl9iaW4yYm4oZGF0YSxzaXplb2YoZGF0YSksTlVMTCk7CisJZGgtPmc9Qk5fbmV3KCk7CisJQk5fc2V0X3dvcmQoZGgtPmcsMik7CisJUEVNX3dyaXRlX0RIcGFyYW1zKHN0ZG91dCxkaCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9SRUFETUUgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTdlOWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9SRUFETUUKQEAgLTAsMCArMSw0IEBACitUaGUgc3R1ZmYgaW4gaGVyZSBpcyBiYXNlZCBvbiBwYXRjaGVzIHN1cHBsaWVkIHRvIG1lIGJ5CitTdGV2ZW4gU2Nob2NoIDxzY2hvY2hAc2hlYmEuYXJjLm5hc2EuZ292PiB0byBkbyBEU1MuCitJIGhhdmUgc2luY2UgbW9kaWZpZWQgYSB0aGVtIGEgbGl0dGxlIGJ1dCBhIGRlYnQgb2YgZ3JhdGl0dWRlCitpcyBkdWUgZm9yIGRvaW5nIHRoZSBpbml0aWFsIHdvcmsuCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYS5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzUwYTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2EuaApAQCAtMCwwICsxLDMwNyBAQAorLyogY3J5cHRvL2RzYS9kc2EuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKgorICogVGhlIERTUyByb3V0aW5lcyBhcmUgYmFzZWQgb24gcGF0Y2hlcyBzdXBwbGllZCBieQorICogU3RldmVuIFNjaG9jaCA8c2Nob2NoQHNoZWJhLmFyYy5uYXNhLmdvdj4uICBIZSBiYXNpY2FsbHkgZGlkIHRoZQorICogd29yayBhbmQgSSBoYXZlIGp1c3QgdHdlYWtlZCB0aGVtIGEgbGl0dGxlIHRvIGZpdCBpbnRvIG15CisgKiBzdHlsaXN0aWMgdmlzaW9uIGZvciBTU0xlYXkgOi0pICovCisKKyNpZm5kZWYgSEVBREVSX0RTQV9ICisjZGVmaW5lIEhFQURFUl9EU0FfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19EU0EKKyNlcnJvciBEU0EgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyMgaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX0RTQV9NQVhfTU9EVUxVU19CSVRTCisjIGRlZmluZSBPUEVOU1NMX0RTQV9NQVhfTU9EVUxVU19CSVRTCTEwMDAwCisjZW5kaWYKKworI2RlZmluZSBEU0FfRkxBR19DQUNIRV9NT05UX1AJMHgwMQorI2RlZmluZSBEU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FICAgICAgIDB4MDIgLyogbmV3IHdpdGggMC45LjdoOyB0aGUgYnVpbHQtaW4gRFNBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBub3cgdXNlcyBjb25zdGFudCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtb2R1bGFyIGV4cG9uZW50aWF0aW9uIGZvciBzZWNyZXQgZXhwb25lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBieSBkZWZhdWx0LiBUaGlzIGZsYWcgY2F1c2VzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmFzdGVyIHZhcmlhYmxlIHNsaWRpbmcgd2luZG93IG1ldGhvZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgdXNlZCBmb3IgYWxsIGV4cG9uZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBBbHJlYWR5IGRlZmluZWQgaW4gb3NzbF90eXAuaCAqLworLyogdHlwZWRlZiBzdHJ1Y3QgZHNhX3N0IERTQTsgKi8KKy8qIHR5cGVkZWYgc3RydWN0IGRzYV9tZXRob2QgRFNBX01FVEhPRDsgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRFNBX1NJR19zdAorCXsKKwlCSUdOVU0gKnI7CisJQklHTlVNICpzOworCX0gRFNBX1NJRzsKKworc3RydWN0IGRzYV9tZXRob2QKKwl7CisJY29uc3QgY2hhciAqbmFtZTsKKwlEU0FfU0lHICogKCpkc2FfZG9fc2lnbikoY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwgaW50IGRsZW4sIERTQSAqZHNhKTsKKwlpbnQgKCpkc2Ffc2lnbl9zZXR1cCkoRFNBICpkc2EsIEJOX0NUWCAqY3R4X2luLCBCSUdOVU0gKipraW52cCwKKwkJCQkJCQkJQklHTlVNICoqcnApOworCWludCAoKmRzYV9kb192ZXJpZnkpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkZ3N0X2xlbiwKKwkJCSAgICAgRFNBX1NJRyAqc2lnLCBEU0EgKmRzYSk7CisJaW50ICgqZHNhX21vZF9leHApKERTQSAqZHNhLCBCSUdOVU0gKnJyLCBCSUdOVU0gKmExLCBCSUdOVU0gKnAxLAorCQkJQklHTlVNICphMiwgQklHTlVNICpwMiwgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKwkJCUJOX01PTlRfQ1RYICppbl9tb250KTsKKwlpbnQgKCpibl9tb2RfZXhwKShEU0EgKmRzYSwgQklHTlVNICpyLCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwkJCQljb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LAorCQkJCUJOX01PTlRfQ1RYICptX2N0eCk7IC8qIENhbiBiZSBudWxsICovCisJaW50ICgqaW5pdCkoRFNBICpkc2EpOworCWludCAoKmZpbmlzaCkoRFNBICpkc2EpOworCWludCBmbGFnczsKKwljaGFyICphcHBfZGF0YTsKKwkvKiBJZiB0aGlzIGlzIG5vbi1OVUxMLCBpdCBpcyB1c2VkIHRvIGdlbmVyYXRlIERTQSBwYXJhbWV0ZXJzICovCisJaW50ICgqZHNhX3BhcmFtZ2VuKShEU0EgKmRzYSwgaW50IGJpdHMsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWVkLCBpbnQgc2VlZF9sZW4sCisJCQlpbnQgKmNvdW50ZXJfcmV0LCB1bnNpZ25lZCBsb25nICpoX3JldCwKKwkJCUJOX0dFTkNCICpjYik7CisJLyogSWYgdGhpcyBpcyBub24tTlVMTCwgaXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBEU0Ega2V5cyAqLworCWludCAoKmRzYV9rZXlnZW4pKERTQSAqZHNhKTsKKwl9OworCitzdHJ1Y3QgZHNhX3N0CisJeworCS8qIFRoaXMgZmlyc3QgdmFyaWFibGUgaXMgdXNlZCB0byBwaWNrIHVwIGVycm9ycyB3aGVyZQorCSAqIGEgRFNBIGlzIHBhc3NlZCBpbnN0ZWFkIG9mIG9mIGEgRVZQX1BLRVkgKi8KKwlpbnQgcGFkOworCWxvbmcgdmVyc2lvbjsKKwlpbnQgd3JpdGVfcGFyYW1zOworCUJJR05VTSAqcDsKKwlCSUdOVU0gKnE7CS8qID09IDIwICovCisJQklHTlVNICpnOworCisJQklHTlVNICpwdWJfa2V5OyAgLyogeSBwdWJsaWMga2V5ICovCisJQklHTlVNICpwcml2X2tleTsgLyogeCBwcml2YXRlIGtleSAqLworCisJQklHTlVNICpraW52OwkvKiBTaWduaW5nIHByZS1jYWxjICovCisJQklHTlVNICpyOwkvKiBTaWduaW5nIHByZS1jYWxjICovCisKKwlpbnQgZmxhZ3M7CisJLyogTm9ybWFsbHkgdXNlZCB0byBjYWNoZSBtb250Z29tZXJ5IHZhbHVlcyAqLworCUJOX01PTlRfQ1RYICptZXRob2RfbW9udF9wOworCWludCByZWZlcmVuY2VzOworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisJY29uc3QgRFNBX01FVEhPRCAqbWV0aDsKKwkvKiBmdW5jdGlvbmFsIHJlZmVyZW5jZSBpZiAnbWV0aCcgaXMgRU5HSU5FLXByb3ZpZGVkICovCisJRU5HSU5FICplbmdpbmU7CisJfTsKKworI2RlZmluZSBkMmlfRFNBcGFyYW1zX2ZwKGZwLHgpIChEU0EgKilBU04xX2QyaV9mcCgoY2hhciAqKCopKCkpRFNBX25ldywgXAorCQkoY2hhciAqKCopKCkpZDJpX0RTQXBhcmFtcywoZnApLCh1bnNpZ25lZCBjaGFyICoqKSh4KSkKKyNkZWZpbmUgaTJkX0RTQXBhcmFtc19mcChmcCx4KSBBU04xX2kyZF9mcChpMmRfRFNBcGFyYW1zLChmcCksIFwKKwkJKHVuc2lnbmVkIGNoYXIgKikoeCkpCisjZGVmaW5lIGQyaV9EU0FwYXJhbXNfYmlvKGJwLHgpIEFTTjFfZDJpX2Jpb19vZihEU0EsRFNBX25ldyxkMmlfRFNBcGFyYW1zLGJwLHgpCisjZGVmaW5lIGkyZF9EU0FwYXJhbXNfYmlvKGJwLHgpIEFTTjFfaTJkX2Jpb19vZl9jb25zdChEU0EsaTJkX0RTQXBhcmFtcyxicCx4KQorCisKK0RTQSAqRFNBcGFyYW1zX2R1cChEU0EgKngpOworRFNBX1NJRyAqIERTQV9TSUdfbmV3KHZvaWQpOwordm9pZAlEU0FfU0lHX2ZyZWUoRFNBX1NJRyAqYSk7CitpbnQJaTJkX0RTQV9TSUcoY29uc3QgRFNBX1NJRyAqYSwgdW5zaWduZWQgY2hhciAqKnBwKTsKK0RTQV9TSUcgKiBkMmlfRFNBX1NJRyhEU0FfU0lHICoqdiwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCk7CisKK0RTQV9TSUcgKiBEU0FfZG9fc2lnbihjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LGludCBkbGVuLERTQSAqZHNhKTsKK2ludAlEU0FfZG9fdmVyaWZ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsaW50IGRnc3RfbGVuLAorCQkgICAgICBEU0FfU0lHICpzaWcsRFNBICpkc2EpOworCitjb25zdCBEU0FfTUVUSE9EICpEU0FfT3BlblNTTCh2b2lkKTsKKwordm9pZAlEU0Ffc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IERTQV9NRVRIT0QgKik7Citjb25zdCBEU0FfTUVUSE9EICpEU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKHZvaWQpOworaW50CURTQV9zZXRfbWV0aG9kKERTQSAqZHNhLCBjb25zdCBEU0FfTUVUSE9EICopOworCitEU0EgKglEU0FfbmV3KHZvaWQpOworRFNBICoJRFNBX25ld19tZXRob2QoRU5HSU5FICplbmdpbmUpOwordm9pZAlEU0FfZnJlZSAoRFNBICpyKTsKKy8qICJ1cCIgdGhlIERTQSBvYmplY3QncyByZWZlcmVuY2UgY291bnQgKi8KK2ludAlEU0FfdXBfcmVmKERTQSAqcik7CitpbnQJRFNBX3NpemUoY29uc3QgRFNBICopOworCS8qIG5leHQgNCByZXR1cm4gLTEgb24gZXJyb3IgKi8KK2ludAlEU0Ffc2lnbl9zZXR1cCggRFNBICpkc2EsQk5fQ1RYICpjdHhfaW4sQklHTlVNICoqa2ludnAsQklHTlVNICoqcnApOworaW50CURTQV9zaWduKGludCB0eXBlLGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsaW50IGRsZW4sCisJCXVuc2lnbmVkIGNoYXIgKnNpZywgdW5zaWduZWQgaW50ICpzaWdsZW4sIERTQSAqZHNhKTsKK2ludAlEU0FfdmVyaWZ5KGludCB0eXBlLGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsaW50IGRnc3RfbGVuLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWdidWYsIGludCBzaWdsZW4sIERTQSAqZHNhKTsKK2ludCBEU0FfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCSAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworaW50IERTQV9zZXRfZXhfZGF0YShEU0EgKmQsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkICpEU0FfZ2V0X2V4X2RhdGEoRFNBICpkLCBpbnQgaWR4KTsKKworRFNBICoJZDJpX0RTQVB1YmxpY0tleShEU0EgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoKTsKK0RTQSAqCWQyaV9EU0FQcml2YXRlS2V5KERTQSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpOworRFNBICogCWQyaV9EU0FwYXJhbXMoRFNBICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCk7CisKKy8qIERlcHJlY2F0ZWQgdmVyc2lvbiAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK0RTQSAqCURTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzKGludCBiaXRzLAorCQl1bnNpZ25lZCBjaGFyICpzZWVkLGludCBzZWVkX2xlbiwKKwkJaW50ICpjb3VudGVyX3JldCwgdW5zaWduZWQgbG9uZyAqaF9yZXQsdm9pZAorCQkoKmNhbGxiYWNrKShpbnQsIGludCwgdm9pZCAqKSx2b2lkICpjYl9hcmcpOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fREVQUkVDQVRFRCkgKi8KKworLyogTmV3IHZlcnNpb24gKi8KK2ludAlEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChEU0EgKmRzYSwgaW50IGJpdHMsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlZWQsaW50IHNlZWRfbGVuLAorCQlpbnQgKmNvdW50ZXJfcmV0LCB1bnNpZ25lZCBsb25nICpoX3JldCwgQk5fR0VOQ0IgKmNiKTsKKworaW50CURTQV9nZW5lcmF0ZV9rZXkoRFNBICphKTsKK2ludAlpMmRfRFNBUHVibGljS2V5KGNvbnN0IERTQSAqYSwgdW5zaWduZWQgY2hhciAqKnBwKTsKK2ludCAJaTJkX0RTQVByaXZhdGVLZXkoY29uc3QgRFNBICphLCB1bnNpZ25lZCBjaGFyICoqcHApOworaW50CWkyZF9EU0FwYXJhbXMoY29uc3QgRFNBICphLHVuc2lnbmVkIGNoYXIgKipwcCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludAlEU0FwYXJhbXNfcHJpbnQoQklPICpicCwgY29uc3QgRFNBICp4KTsKK2ludAlEU0FfcHJpbnQoQklPICpicCwgY29uc3QgRFNBICp4LCBpbnQgb2ZmKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50CURTQXBhcmFtc19wcmludF9mcChGSUxFICpmcCwgY29uc3QgRFNBICp4KTsKK2ludAlEU0FfcHJpbnRfZnAoRklMRSAqYnAsIGNvbnN0IERTQSAqeCwgaW50IG9mZik7CisjZW5kaWYKKworI2RlZmluZSBEU1NfcHJpbWVfY2hlY2tzIDUwCisvKiBQcmltYWxpdHkgdGVzdCBhY2NvcmRpbmcgdG8gRklQUyBQVUIgMTg2Wy0xXSwgQXBwZW5kaXggMi4xOgorICogNTAgcm91bmRzIG9mIFJhYmluLU1pbGxlciAqLworI2RlZmluZSBEU0FfaXNfcHJpbWUobiwgY2FsbGJhY2ssIGNiX2FyZykgXAorCUJOX2lzX3ByaW1lKG4sIERTU19wcmltZV9jaGVja3MsIGNhbGxiYWNrLCBOVUxMLCBjYl9hcmcpCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorLyogQ29udmVydCBEU0Egc3RydWN0dXJlIChrZXkgb3IganVzdCBwYXJhbWV0ZXJzKSBpbnRvIERIIHN0cnVjdHVyZQorICogKGJlIGNhcmVmdWwgdG8gYXZvaWQgc21hbGwgc3ViZ3JvdXAgYXR0YWNrcyB3aGVuIHVzaW5nIHRoaXMhKSAqLworREggKkRTQV9kdXBfREgoY29uc3QgRFNBICpyKTsKKyNlbmRpZgorCisjZGVmaW5lIEVWUF9QS0VZX0NUWF9zZXRfZHNhX3BhcmFtZ2VuX2JpdHMoY3R4LCBuYml0cykgXAorCUVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfRFNBLCBFVlBfUEtFWV9PUF9QQVJBTUdFTiwgXAorCQkJCUVWUF9QS0VZX0NUUkxfRFNBX1BBUkFNR0VOX0JJVFMsIG5iaXRzLCBOVUxMKQorCisjZGVmaW5lCUVWUF9QS0VZX0NUUkxfRFNBX1BBUkFNR0VOX0JJVFMJCShFVlBfUEtFWV9BTEdfQ1RSTCArIDEpCisjZGVmaW5lCUVWUF9QS0VZX0NUUkxfRFNBX1BBUkFNR0VOX1FfQklUUwkoRVZQX1BLRVlfQUxHX0NUUkwgKyAyKQorI2RlZmluZQlFVlBfUEtFWV9DVFJMX0RTQV9QQVJBTUdFTl9NRAkJKEVWUF9QS0VZX0FMR19DVFJMICsgMykKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9EU0Ffc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBEU0EgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgRFNBX0ZfRDJJX0RTQV9TSUcJCQkJIDExMAorI2RlZmluZSBEU0FfRl9ET19EU0FfUFJJTlQJCQkJIDEwNAorI2RlZmluZSBEU0FfRl9EU0FQQVJBTVNfUFJJTlQJCQkJIDEwMAorI2RlZmluZSBEU0FfRl9EU0FQQVJBTVNfUFJJTlRfRlAJCQkgMTAxCisjZGVmaW5lIERTQV9GX0RTQV9ET19TSUdOCQkJCSAxMTIKKyNkZWZpbmUgRFNBX0ZfRFNBX0RPX1ZFUklGWQkJCQkgMTEzCisjZGVmaW5lIERTQV9GX0RTQV9ORVdfTUVUSE9ECQkJCSAxMDMKKyNkZWZpbmUgRFNBX0ZfRFNBX1BBUkFNX0RFQ09ERQkJCQkgMTE5CisjZGVmaW5lIERTQV9GX0RTQV9QUklOVF9GUAkJCQkgMTA1CisjZGVmaW5lIERTQV9GX0RTQV9QUklWX0RFQ09ERQkJCQkgMTE1CisjZGVmaW5lIERTQV9GX0RTQV9QUklWX0VOQ09ERQkJCQkgMTE2CisjZGVmaW5lIERTQV9GX0RTQV9QVUJfREVDT0RFCQkJCSAxMTcKKyNkZWZpbmUgRFNBX0ZfRFNBX1BVQl9FTkNPREUJCQkJIDExOAorI2RlZmluZSBEU0FfRl9EU0FfU0lHTgkJCQkJIDEwNgorI2RlZmluZSBEU0FfRl9EU0FfU0lHTl9TRVRVUAkJCQkgMTA3CisjZGVmaW5lIERTQV9GX0RTQV9TSUdfTkVXCQkJCSAxMDkKKyNkZWZpbmUgRFNBX0ZfRFNBX1ZFUklGWQkJCQkgMTA4CisjZGVmaW5lIERTQV9GX0kyRF9EU0FfU0lHCQkJCSAxMTEKKyNkZWZpbmUgRFNBX0ZfT0xEX0RTQV9QUklWX0RFQ09ERQkJCSAxMjIKKyNkZWZpbmUgRFNBX0ZfUEtFWV9EU0FfQ1RSTAkJCQkgMTIwCisjZGVmaW5lIERTQV9GX1BLRVlfRFNBX0tFWUdFTgkJCQkgMTIxCisjZGVmaW5lIERTQV9GX1NJR19DQgkJCQkJIDExNAorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIERTQV9SX0JBRF9RX1ZBTFVFCQkJCSAxMDIKKyNkZWZpbmUgRFNBX1JfQk5fREVDT0RFX0VSUk9SCQkJCSAxMDgKKyNkZWZpbmUgRFNBX1JfQk5fRVJST1IJCQkJCSAxMDkKKyNkZWZpbmUgRFNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFCQkgMTAwCisjZGVmaW5lIERTQV9SX0RFQ09ERV9FUlJPUgkJCQkgMTA0CisjZGVmaW5lIERTQV9SX0lOVkFMSURfRElHRVNUX1RZUEUJCQkgMTA2CisjZGVmaW5lIERTQV9SX01JU1NJTkdfUEFSQU1FVEVSUwkJCSAxMDEKKyNkZWZpbmUgRFNBX1JfTU9EVUxVU19UT09fTEFSR0UJCQkJIDEwMworI2RlZmluZSBEU0FfUl9OT19QQVJBTUVURVJTX1NFVAkJCQkgMTA3CisjZGVmaW5lIERTQV9SX1BBUkFNRVRFUl9FTkNPRElOR19FUlJPUgkJCSAxMDUKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2FtZXRoLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9hbWV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTNhYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9hbWV0aC5jCkBAIC0wLDAgKzEsNjU3IEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0NNUworI2luY2x1ZGUgPG9wZW5zc2wvY21zLmg+CisjZW5kaWYKKyNpbmNsdWRlICJhc24xX2xvY2wuaCIKKworc3RhdGljIGludCBkc2FfcHViX2RlY29kZShFVlBfUEtFWSAqcGtleSwgWDUwOV9QVUJLRVkgKnB1YmtleSkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCwgKnBtOworCWludCBwa2xlbiwgcG1sZW47CisJaW50IHB0eXBlOworCXZvaWQgKnB2YWw7CisJQVNOMV9TVFJJTkcgKnBzdHI7CisJWDUwOV9BTEdPUiAqcGFsZzsKKwlBU04xX0lOVEVHRVIgKnB1YmxpY19rZXkgPSBOVUxMOworCisJRFNBICpkc2EgPSBOVUxMOworCisJaWYgKCFYNTA5X1BVQktFWV9nZXQwX3BhcmFtKE5VTEwsICZwLCAmcGtsZW4sICZwYWxnLCBwdWJrZXkpKQorCQlyZXR1cm4gMDsKKwlYNTA5X0FMR09SX2dldDAoTlVMTCwgJnB0eXBlLCAmcHZhbCwgcGFsZyk7CisKKworCWlmIChwdHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpCisJCXsKKwkJcHN0ciA9IHB2YWw7CQorCQlwbSA9IHBzdHItPmRhdGE7CisJCXBtbGVuID0gcHN0ci0+bGVuZ3RoOworCisJCWlmICghKGRzYSA9IGQyaV9EU0FwYXJhbXMoTlVMTCwgJnBtLCBwbWxlbikpKQorCQkJeworCQkJRFNBZXJyKERTQV9GX0RTQV9QVUJfREVDT0RFLCBEU0FfUl9ERUNPREVfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJfQorCWVsc2UgaWYgKChwdHlwZSA9PSBWX0FTTjFfTlVMTCkgfHwgKHB0eXBlID09IFZfQVNOMV9VTkRFRikpCisJCXsKKwkJaWYgKCEoZHNhID0gRFNBX25ldygpKSkKKwkJCXsKKwkJCURTQWVycihEU0FfRl9EU0FfUFVCX0RFQ09ERSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJRFNBZXJyKERTQV9GX0RTQV9QVUJfREVDT0RFLCBEU0FfUl9QQVJBTUVURVJfRU5DT0RJTkdfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKCEocHVibGljX2tleT1kMmlfQVNOMV9JTlRFR0VSKE5VTEwsICZwLCBwa2xlbikpKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfUFVCX0RFQ09ERSwgRFNBX1JfREVDT0RFX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICghKGRzYS0+cHViX2tleSA9IEFTTjFfSU5URUdFUl90b19CTihwdWJsaWNfa2V5LCBOVUxMKSkpCisJCXsKKwkJRFNBZXJyKERTQV9GX0RTQV9QVUJfREVDT0RFLCBEU0FfUl9CTl9ERUNPREVfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJQVNOMV9JTlRFR0VSX2ZyZWUocHVibGljX2tleSk7CisJRVZQX1BLRVlfYXNzaWduX0RTQShwa2V5LCBkc2EpOworCXJldHVybiAxOworCisJZXJyOgorCWlmIChwdWJsaWNfa2V5KQorCQlBU04xX0lOVEVHRVJfZnJlZShwdWJsaWNfa2V5KTsKKwlpZiAoZHNhKQorCQlEU0FfZnJlZShkc2EpOworCXJldHVybiAwOworCisJfQorCitzdGF0aWMgaW50IGRzYV9wdWJfZW5jb2RlKFg1MDlfUFVCS0VZICpwaywgY29uc3QgRVZQX1BLRVkgKnBrZXkpCisJeworCURTQSAqZHNhOworCXZvaWQgKnB2YWwgPSBOVUxMOworCWludCBwdHlwZTsKKwl1bnNpZ25lZCBjaGFyICpwZW5jID0gTlVMTDsKKwlpbnQgcGVuY2xlbjsKKworCWRzYT1wa2V5LT5wa2V5LmRzYTsKKwlpZiAocGtleS0+c2F2ZV9wYXJhbWV0ZXJzICYmIGRzYS0+cCAmJiBkc2EtPnEgJiYgZHNhLT5nKQorCQl7CisJCUFTTjFfU1RSSU5HICpzdHI7CisJCXN0ciA9IEFTTjFfU1RSSU5HX25ldygpOworCQlzdHItPmxlbmd0aCA9IGkyZF9EU0FwYXJhbXMoZHNhLCAmc3RyLT5kYXRhKTsKKwkJaWYgKHN0ci0+bGVuZ3RoIDw9IDApCisJCQl7CisJCQlEU0FlcnIoRFNBX0ZfRFNBX1BVQl9FTkNPREUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlwdmFsID0gc3RyOworCQlwdHlwZSA9IFZfQVNOMV9TRVFVRU5DRTsKKwkJfQorCWVsc2UKKwkJcHR5cGUgPSBWX0FTTjFfVU5ERUY7CisKKwlkc2EtPndyaXRlX3BhcmFtcz0wOworCisJcGVuY2xlbiA9IGkyZF9EU0FQdWJsaWNLZXkoZHNhLCAmcGVuYyk7CisKKwlpZiAocGVuY2xlbiA8PSAwKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfUFVCX0VOQ09ERSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKFg1MDlfUFVCS0VZX3NldDBfcGFyYW0ocGssIE9CSl9uaWQyb2JqKEVWUF9QS0VZX0RTQSksCisJCQkJcHR5cGUsIHB2YWwsIHBlbmMsIHBlbmNsZW4pKQorCQlyZXR1cm4gMTsKKworCWVycjoKKwlpZiAocGVuYykKKwkJT1BFTlNTTF9mcmVlKHBlbmMpOworCWlmIChwdmFsKQorCQlBU04xX1NUUklOR19mcmVlKHB2YWwpOworCisJcmV0dXJuIDA7CisJfQorCisvKiBJbiBQS0NTIzggRFNBOiB5b3UganVzdCBnZXQgYSBwcml2YXRlIGtleSBpbnRlZ2VyIGFuZCBwYXJhbWV0ZXJzIGluIHRoZQorICogQWxnb3JpdGhtSWRlbnRpZmllciB0aGUgcHVia2V5IG11c3QgYmUgcmVjYWxjdWxhdGVkLgorICovCisJCitzdGF0aWMgaW50IGRzYV9wcml2X2RlY29kZShFVlBfUEtFWSAqcGtleSwgUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgpCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsICpwbTsKKwlpbnQgcGtsZW4sIHBtbGVuOworCWludCBwdHlwZTsKKwl2b2lkICpwdmFsOworCUFTTjFfU1RSSU5HICpwc3RyOworCVg1MDlfQUxHT1IgKnBhbGc7CisJQVNOMV9JTlRFR0VSICpwcml2a2V5ID0gTlVMTDsKKwlCTl9DVFggKmN0eCA9IE5VTEw7CisKKwlTVEFDS19PRihBU04xX1RZUEUpICpuZHNhID0gTlVMTDsKKwlEU0EgKmRzYSA9IE5VTEw7CisKKwlpZiAoIVBLQ1M4X3BrZXlfZ2V0MChOVUxMLCAmcCwgJnBrbGVuLCAmcGFsZywgcDgpKQorCQlyZXR1cm4gMDsKKwlYNTA5X0FMR09SX2dldDAoTlVMTCwgJnB0eXBlLCAmcHZhbCwgcGFsZyk7CisKKwkvKiBDaGVjayBmb3IgYnJva2VuIERTQSBQS0NTIzgsIFVHSCEgKi8KKwlpZiAoKnAgPT0gKFZfQVNOMV9TRVFVRU5DRXxWX0FTTjFfQ09OU1RSVUNURUQpKQorCQl7CisJCUFTTjFfVFlQRSAqdDEsICp0MjsKKwkgICAgCWlmKCEobmRzYSA9IGQyaV9BU04xX1NFUVVFTkNFX0FOWShOVUxMLCAmcCwgcGtsZW4pKSkKKwkJCWdvdG8gZGVjZXJyOworCQlpZiAoc2tfQVNOMV9UWVBFX251bShuZHNhKSAhPSAyKQorCQkJZ290byBkZWNlcnI7CisJCS8qIEhhbmRsZSBUd28gYnJva2VuIHR5cGVzOgorCSAgICAJICogU0VRVUVOQ0Uge3BhcmFtZXRlcnMsIHByaXZfa2V5fQorCQkgKiBTRVFVRU5DRSB7cHViX2tleSwgcHJpdl9rZXl9CisJCSAqLworCisJCXQxID0gc2tfQVNOMV9UWVBFX3ZhbHVlKG5kc2EsIDApOworCQl0MiA9IHNrX0FTTjFfVFlQRV92YWx1ZShuZHNhLCAxKTsKKwkJaWYgKHQxLT50eXBlID09IFZfQVNOMV9TRVFVRU5DRSkKKwkJCXsKKwkJCXA4LT5icm9rZW4gPSBQS0NTOF9FTUJFRERFRF9QQVJBTTsKKwkJCXB2YWwgPSB0MS0+dmFsdWUucHRyOworCQkJfQorCQllbHNlIGlmIChwdHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpCisJCQlwOC0+YnJva2VuID0gUEtDUzhfTlNfREI7CisJCWVsc2UKKwkJCWdvdG8gZGVjZXJyOworCisJCWlmICh0Mi0+dHlwZSAhPSBWX0FTTjFfSU5URUdFUikKKwkJCWdvdG8gZGVjZXJyOworCisJCXByaXZrZXkgPSB0Mi0+dmFsdWUuaW50ZWdlcjsKKwkJfQorCWVsc2UKKwkJeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpxID0gcDsKKwkJaWYgKCEocHJpdmtleT1kMmlfQVNOMV9JTlRFR0VSKE5VTEwsICZwLCBwa2xlbikpKQorCQkJZ290byBkZWNlcnI7CisJCWlmIChwcml2a2V5LT50eXBlID09IFZfQVNOMV9ORUdfSU5URUdFUikKKwkJCXsKKwkJCXA4LT5icm9rZW4gPSBQS0NTOF9ORUdfUFJJVktFWTsKKwkJCUFTTjFfSU5URUdFUl9mcmVlKHByaXZrZXkpOworCQkJaWYgKCEocHJpdmtleT1kMmlfQVNOMV9VSU5URUdFUihOVUxMLCAmcSwgcGtsZW4pKSkKKwkJCQlnb3RvIGRlY2VycjsKKwkJCX0KKwkJaWYgKHB0eXBlICE9IFZfQVNOMV9TRVFVRU5DRSkKKwkJCWdvdG8gZGVjZXJyOworCQl9CisKKwlwc3RyID0gcHZhbDsJCisJcG0gPSBwc3RyLT5kYXRhOworCXBtbGVuID0gcHN0ci0+bGVuZ3RoOworCWlmICghKGRzYSA9IGQyaV9EU0FwYXJhbXMoTlVMTCwgJnBtLCBwbWxlbikpKQorCQlnb3RvIGRlY2VycjsKKwkvKiBXZSBoYXZlIHBhcmFtZXRlcnMgbm93IHNldCBwcml2YXRlIGtleSAqLworCWlmICghKGRzYS0+cHJpdl9rZXkgPSBBU04xX0lOVEVHRVJfdG9fQk4ocHJpdmtleSwgTlVMTCkpKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfUFJJVl9ERUNPREUsRFNBX1JfQk5fRVJST1IpOworCQlnb3RvIGRzYWVycjsKKwkJfQorCS8qIENhbGN1bGF0ZSBwdWJsaWMga2V5ICovCisJaWYgKCEoZHNhLT5wdWJfa2V5ID0gQk5fbmV3KCkpKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfUFJJVl9ERUNPREUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBkc2FlcnI7CisJCX0KKwlpZiAoIShjdHggPSBCTl9DVFhfbmV3KCkpKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfUFJJVl9ERUNPREUsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBkc2FlcnI7CisJCX0KKwkJCQorCWlmICghQk5fbW9kX2V4cChkc2EtPnB1Yl9rZXksIGRzYS0+ZywgZHNhLT5wcml2X2tleSwgZHNhLT5wLCBjdHgpKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfUFJJVl9ERUNPREUsRFNBX1JfQk5fRVJST1IpOworCQlnb3RvIGRzYWVycjsKKwkJfQorCisJRVZQX1BLRVlfYXNzaWduX0RTQShwa2V5LCBkc2EpOworCUJOX0NUWF9mcmVlIChjdHgpOworCWlmKG5kc2EpCisJCXNrX0FTTjFfVFlQRV9wb3BfZnJlZShuZHNhLCBBU04xX1RZUEVfZnJlZSk7CisJZWxzZQorCQlBU04xX0lOVEVHRVJfZnJlZShwcml2a2V5KTsKKworCXJldHVybiAxOworCisJZGVjZXJyOgorCURTQWVycihEU0FfRl9EU0FfUFJJVl9ERUNPREUsIEVWUF9SX0RFQ09ERV9FUlJPUik7CisJZHNhZXJyOgorCUJOX0NUWF9mcmVlIChjdHgpOworCWlmIChwcml2a2V5KQorCQlBU04xX0lOVEVHRVJfZnJlZShwcml2a2V5KTsKKwlza19BU04xX1RZUEVfcG9wX2ZyZWUobmRzYSwgQVNOMV9UWVBFX2ZyZWUpOworCURTQV9mcmVlKGRzYSk7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGRzYV9wcml2X2VuY29kZShQS0NTOF9QUklWX0tFWV9JTkZPICpwOCwgY29uc3QgRVZQX1BLRVkgKnBrZXkpCit7CisJQVNOMV9TVFJJTkcgKnBhcmFtcyA9IE5VTEw7CisJQVNOMV9JTlRFR0VSICpwcmtleSA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqZHAgPSBOVUxMOworCWludCBkcGxlbjsKKworCXBhcmFtcyA9IEFTTjFfU1RSSU5HX25ldygpOworCisJaWYgKCFwYXJhbXMpCisJCXsKKwkJRFNBZXJyKERTQV9GX0RTQV9QUklWX0VOQ09ERSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlwYXJhbXMtPmxlbmd0aCA9IGkyZF9EU0FwYXJhbXMocGtleS0+cGtleS5kc2EsICZwYXJhbXMtPmRhdGEpOworCWlmIChwYXJhbXMtPmxlbmd0aCA8PSAwKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfUFJJVl9FTkNPREUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCXBhcmFtcy0+dHlwZSA9IFZfQVNOMV9TRVFVRU5DRTsKKworCS8qIEdldCBwcml2YXRlIGtleSBpbnRvIGludGVnZXIgKi8KKwlwcmtleSA9IEJOX3RvX0FTTjFfSU5URUdFUihwa2V5LT5wa2V5LmRzYS0+cHJpdl9rZXksIE5VTEwpOworCisJaWYgKCFwcmtleSkKKwkJeworCQlEU0FlcnIoRFNBX0ZfRFNBX1BSSVZfRU5DT0RFLERTQV9SX0JOX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKworCWRwbGVuID0gaTJkX0FTTjFfSU5URUdFUihwcmtleSwgJmRwKTsKKworCUFTTjFfSU5URUdFUl9mcmVlKHBya2V5KTsKKworCWlmICghUEtDUzhfcGtleV9zZXQwKHA4LCBPQkpfbmlkMm9iaihOSURfZHNhKSwgMCwKKwkJCQlWX0FTTjFfU0VRVUVOQ0UsIHBhcmFtcywgZHAsIGRwbGVuKSkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMTsKKworZXJyOgorCWlmIChkcCAhPSBOVUxMKQorCQlPUEVOU1NMX2ZyZWUoZHApOworCWlmIChwYXJhbXMgIT0gTlVMTCkKKwkJQVNOMV9TVFJJTkdfZnJlZShwYXJhbXMpOworCWlmIChwcmtleSAhPSBOVUxMKQorCQlBU04xX0lOVEVHRVJfZnJlZShwcmtleSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50X2RzYV9zaXplKGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4oRFNBX3NpemUocGtleS0+cGtleS5kc2EpKTsKKwl9CisKK3N0YXRpYyBpbnQgZHNhX2JpdHMoY29uc3QgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBCTl9udW1fYml0cyhwa2V5LT5wa2V5LmRzYS0+cCk7CisJfQorCitzdGF0aWMgaW50IGRzYV9taXNzaW5nX3BhcmFtZXRlcnMoY29uc3QgRVZQX1BLRVkgKnBrZXkpCisJeworCURTQSAqZHNhOworCWRzYT1wa2V5LT5wa2V5LmRzYTsKKwlpZiAoKGRzYS0+cCA9PSBOVUxMKSB8fCAoZHNhLT5xID09IE5VTEwpIHx8IChkc2EtPmcgPT0gTlVMTCkpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgZHNhX2NvcHlfcGFyYW1ldGVycyhFVlBfUEtFWSAqdG8sIGNvbnN0IEVWUF9QS0VZICpmcm9tKQorCXsKKwlCSUdOVU0gKmE7CisKKwlpZiAoKGE9Qk5fZHVwKGZyb20tPnBrZXkuZHNhLT5wKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHRvLT5wa2V5LmRzYS0+cCAhPSBOVUxMKQorCQlCTl9mcmVlKHRvLT5wa2V5LmRzYS0+cCk7CisJdG8tPnBrZXkuZHNhLT5wPWE7CisKKwlpZiAoKGE9Qk5fZHVwKGZyb20tPnBrZXkuZHNhLT5xKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHRvLT5wa2V5LmRzYS0+cSAhPSBOVUxMKQorCQlCTl9mcmVlKHRvLT5wa2V5LmRzYS0+cSk7CisJdG8tPnBrZXkuZHNhLT5xPWE7CisKKwlpZiAoKGE9Qk5fZHVwKGZyb20tPnBrZXkuZHNhLT5nKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHRvLT5wa2V5LmRzYS0+ZyAhPSBOVUxMKQorCQlCTl9mcmVlKHRvLT5wa2V5LmRzYS0+Zyk7CisJdG8tPnBrZXkuZHNhLT5nPWE7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGRzYV9jbXBfcGFyYW1ldGVycyhjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpCisJeworCWlmICgJQk5fY21wKGEtPnBrZXkuZHNhLT5wLGItPnBrZXkuZHNhLT5wKSB8fAorCQlCTl9jbXAoYS0+cGtleS5kc2EtPnEsYi0+cGtleS5kc2EtPnEpIHx8CisJCUJOX2NtcChhLT5wa2V5LmRzYS0+ZyxiLT5wa2V5LmRzYS0+ZykpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGRzYV9wdWJfY21wKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYikKKwl7CisJaWYgKEJOX2NtcChiLT5wa2V5LmRzYS0+cHViX2tleSxhLT5wa2V5LmRzYS0+cHViX2tleSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyB2b2lkIGludF9kc2FfZnJlZShFVlBfUEtFWSAqcGtleSkKKwl7CisJRFNBX2ZyZWUocGtleS0+cGtleS5kc2EpOworCX0KKworc3RhdGljIHZvaWQgdXBkYXRlX2J1Zmxlbihjb25zdCBCSUdOVU0gKmIsIHNpemVfdCAqcGJ1ZmxlbikKKwl7CisJc2l6ZV90IGk7CisJaWYgKCFiKQorCQlyZXR1cm47CisJaWYgKCpwYnVmbGVuIDwgKGkgPSAoc2l6ZV90KUJOX251bV9ieXRlcyhiKSkpCisJCQkqcGJ1ZmxlbiA9IGk7CisJfQorCitzdGF0aWMgaW50IGRvX2RzYV9wcmludChCSU8gKmJwLCBjb25zdCBEU0EgKngsIGludCBvZmYsIGludCBwdHlwZSkKKwl7CisJdW5zaWduZWQgY2hhciAqbT1OVUxMOworCWludCByZXQ9MDsKKwlzaXplX3QgYnVmX2xlbj0wOworCWNvbnN0IGNoYXIgKmt0eXBlID0gTlVMTDsKKworCWNvbnN0IEJJR05VTSAqcHJpdl9rZXksICpwdWJfa2V5OworCisJaWYgKHB0eXBlID09IDIpCisJCXByaXZfa2V5ID0geC0+cHJpdl9rZXk7CisJZWxzZQorCQlwcml2X2tleSA9IE5VTEw7CisKKwlpZiAocHR5cGUgPiAwKQorCQlwdWJfa2V5ID0geC0+cHViX2tleTsKKwllbHNlCisJCXB1Yl9rZXkgPSBOVUxMOworCisJaWYgKHB0eXBlID09IDIpCisJCWt0eXBlID0gIlByaXZhdGUtS2V5IjsKKwllbHNlIGlmIChwdHlwZSA9PSAxKQorCQlrdHlwZSA9ICJQdWJsaWMtS2V5IjsKKwllbHNlCisJCWt0eXBlID0gIkRTQS1QYXJhbWV0ZXJzIjsKKworCXVwZGF0ZV9idWZsZW4oeC0+cCwgJmJ1Zl9sZW4pOworCXVwZGF0ZV9idWZsZW4oeC0+cSwgJmJ1Zl9sZW4pOworCXVwZGF0ZV9idWZsZW4oeC0+ZywgJmJ1Zl9sZW4pOworCXVwZGF0ZV9idWZsZW4ocHJpdl9rZXksICZidWZfbGVuKTsKKwl1cGRhdGVfYnVmbGVuKHB1Yl9rZXksICZidWZfbGVuKTsKKworCW09KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhidWZfbGVuKzEwKTsKKwlpZiAobSA9PSBOVUxMKQorCQl7CisJCURTQWVycihEU0FfRl9ET19EU0FfUFJJTlQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHByaXZfa2V5KQorCQl7CisJCWlmKCFCSU9faW5kZW50KGJwLG9mZiwxMjgpKQorCQkgICBnb3RvIGVycjsKKwkJaWYgKEJJT19wcmludGYoYnAsIiVzOiAoJWQgYml0KVxuIixrdHlwZSwgQk5fbnVtX2JpdHMoeC0+cCkpCisJCQk8PSAwKSBnb3RvIGVycjsKKwkJfQorCisJaWYgKCFBU04xX2JuX3ByaW50KGJwLCJwcml2OiIscHJpdl9rZXksbSxvZmYpKQorCQlnb3RvIGVycjsKKwlpZiAoIUFTTjFfYm5fcHJpbnQoYnAsInB1YjogIixwdWJfa2V5LG0sb2ZmKSkKKwkJZ290byBlcnI7CisJaWYgKCFBU04xX2JuX3ByaW50KGJwLCJQOiAgICIseC0+cCxtLG9mZikpIGdvdG8gZXJyOworCWlmICghQVNOMV9ibl9wcmludChicCwiUTogICAiLHgtPnEsbSxvZmYpKSBnb3RvIGVycjsKKwlpZiAoIUFTTjFfYm5fcHJpbnQoYnAsIkc6ICAgIix4LT5nLG0sb2ZmKSkgZ290byBlcnI7CisJcmV0PTE7CitlcnI6CisJaWYgKG0gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKG0pOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBkc2FfcGFyYW1fZGVjb2RlKEVWUF9QS0VZICpwa2V5LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwgaW50IGRlcmxlbikKKwl7CisJRFNBICpkc2E7CisJaWYgKCEoZHNhID0gZDJpX0RTQXBhcmFtcyhOVUxMLCBwZGVyLCBkZXJsZW4pKSkKKwkJeworCQlEU0FlcnIoRFNBX0ZfRFNBX1BBUkFNX0RFQ09ERSwgRVJSX1JfRFNBX0xJQik7CisJCXJldHVybiAwOworCQl9CisJRVZQX1BLRVlfYXNzaWduX0RTQShwa2V5LCBkc2EpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBkc2FfcGFyYW1fZW5jb2RlKGNvbnN0IEVWUF9QS0VZICpwa2V5LCB1bnNpZ25lZCBjaGFyICoqcGRlcikKKwl7CisJcmV0dXJuIGkyZF9EU0FwYXJhbXMocGtleS0+cGtleS5kc2EsIHBkZXIpOworCX0KKworc3RhdGljIGludCBkc2FfcGFyYW1fcHJpbnQoQklPICpicCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisJCQkJCQkJQVNOMV9QQ1RYICpjdHgpCisJeworCXJldHVybiBkb19kc2FfcHJpbnQoYnAsIHBrZXktPnBrZXkuZHNhLCBpbmRlbnQsIDApOworCX0KKworc3RhdGljIGludCBkc2FfcHViX3ByaW50KEJJTyAqYnAsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorCQkJCQkJCUFTTjFfUENUWCAqY3R4KQorCXsKKwlyZXR1cm4gZG9fZHNhX3ByaW50KGJwLCBwa2V5LT5wa2V5LmRzYSwgaW5kZW50LCAxKTsKKwl9CisKKworc3RhdGljIGludCBkc2FfcHJpdl9wcmludChCSU8gKmJwLCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKmN0eCkKKwl7CisJcmV0dXJuIGRvX2RzYV9wcmludChicCwgcGtleS0+cGtleS5kc2EsIGluZGVudCwgMik7CisJfQorCitzdGF0aWMgaW50IG9sZF9kc2FfcHJpdl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKipwZGVyLCBpbnQgZGVybGVuKQorCXsKKwlEU0EgKmRzYTsKKwlpZiAoIShkc2EgPSBkMmlfRFNBUHJpdmF0ZUtleSAoTlVMTCwgcGRlciwgZGVybGVuKSkpCisJCXsKKwkJRFNBZXJyKERTQV9GX09MRF9EU0FfUFJJVl9ERUNPREUsIEVSUl9SX0RTQV9MSUIpOworCQlyZXR1cm4gMDsKKwkJfQorCUVWUF9QS0VZX2Fzc2lnbl9EU0EocGtleSwgZHNhKTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgb2xkX2RzYV9wcml2X2VuY29kZShjb25zdCBFVlBfUEtFWSAqcGtleSwgdW5zaWduZWQgY2hhciAqKnBkZXIpCisJeworCXJldHVybiBpMmRfRFNBUHJpdmF0ZUtleShwa2V5LT5wa2V5LmRzYSwgcGRlcik7CisJfQorCitzdGF0aWMgaW50IGRzYV9wa2V5X2N0cmwoRVZQX1BLRVkgKnBrZXksIGludCBvcCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKQorCXsKKwlzd2l0Y2ggKG9wKQorCQl7CisJCWNhc2UgQVNOMV9QS0VZX0NUUkxfUEtDUzdfU0lHTjoKKwkJaWYgKGFyZzEgPT0gMCkKKwkJCXsKKwkJCWludCBzbmlkLCBobmlkOworCQkJWDUwOV9BTEdPUiAqYWxnMSwgKmFsZzI7CisJCQlQS0NTN19TSUdORVJfSU5GT19nZXQwX2FsZ3MoYXJnMiwgTlVMTCwgJmFsZzEsICZhbGcyKTsKKwkJCWlmIChhbGcxID09IE5VTEwgfHwgYWxnMS0+YWxnb3JpdGhtID09IE5VTEwpCisJCQkJcmV0dXJuIC0xOworCQkJaG5pZCA9IE9CSl9vYmoybmlkKGFsZzEtPmFsZ29yaXRobSk7CisJCQlpZiAoaG5pZCA9PSBOSURfdW5kZWYpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKCFPQkpfZmluZF9zaWdpZF9ieV9hbGdzKCZzbmlkLCBobmlkLCBFVlBfUEtFWV9pZChwa2V5KSkpCisJCQkJcmV0dXJuIC0xOyAKKwkJCVg1MDlfQUxHT1Jfc2V0MChhbGcyLCBPQkpfbmlkMm9iaihzbmlkKSwgVl9BU04xX1VOREVGLCAwKTsKKwkJCX0KKwkJcmV0dXJuIDE7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ01TCisJCWNhc2UgQVNOMV9QS0VZX0NUUkxfQ01TX1NJR046CisJCWlmIChhcmcxID09IDApCisJCQl7CisJCQlpbnQgc25pZCwgaG5pZDsKKwkJCVg1MDlfQUxHT1IgKmFsZzEsICphbGcyOworCQkJQ01TX1NpZ25lckluZm9fZ2V0MF9hbGdzKGFyZzIsIE5VTEwsIE5VTEwsICZhbGcxLCAmYWxnMik7CisJCQlpZiAoYWxnMSA9PSBOVUxMIHx8IGFsZzEtPmFsZ29yaXRobSA9PSBOVUxMKQorCQkJCXJldHVybiAtMTsKKwkJCWhuaWQgPSBPQkpfb2JqMm5pZChhbGcxLT5hbGdvcml0aG0pOworCQkJaWYgKGhuaWQgPT0gTklEX3VuZGVmKQorCQkJCXJldHVybiAtMTsKKwkJCWlmICghT0JKX2ZpbmRfc2lnaWRfYnlfYWxncygmc25pZCwgaG5pZCwgRVZQX1BLRVlfaWQocGtleSkpKQorCQkJCXJldHVybiAtMTsgCisJCQlYNTA5X0FMR09SX3NldDAoYWxnMiwgT0JKX25pZDJvYmooc25pZCksIFZfQVNOMV9VTkRFRiwgMCk7CisJCQl9CisJCXJldHVybiAxOworI2VuZGlmCisKKwkJY2FzZSBBU04xX1BLRVlfQ1RSTF9ERUZBVUxUX01EX05JRDoKKwkJKihpbnQgKilhcmcyID0gTklEX3NoYTE7CisJCXJldHVybiAyOworCisJCWRlZmF1bHQ6CisJCXJldHVybiAtMjsKKworCQl9CisKKwl9CisKKy8qIE5CIHRoZXNlIGFyZSBzb3J0ZWQgaW4gcGtleV9pZCBvcmRlciwgbG93ZXN0IGZpcnN0ICovCisKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGRzYV9hc24xX21ldGhzW10gPSAKKwl7CisKKwkJeworCQlFVlBfUEtFWV9EU0EyLAorCQlFVlBfUEtFWV9EU0EsCisJCUFTTjFfUEtFWV9BTElBUworCQl9LAorCisJCXsKKwkJRVZQX1BLRVlfRFNBMSwKKwkJRVZQX1BLRVlfRFNBLAorCQlBU04xX1BLRVlfQUxJQVMKKwkJfSwKKworCQl7CisJCUVWUF9QS0VZX0RTQTQsCisJCUVWUF9QS0VZX0RTQSwKKwkJQVNOMV9QS0VZX0FMSUFTCisJCX0sCisKKwkJeworCQlFVlBfUEtFWV9EU0EzLAorCQlFVlBfUEtFWV9EU0EsCisJCUFTTjFfUEtFWV9BTElBUworCQl9LAorCisJCXsKKwkJRVZQX1BLRVlfRFNBLAorCQlFVlBfUEtFWV9EU0EsCisJCTAsCisKKwkJIkRTQSIsCisJCSJPcGVuU1NMIERTQSBtZXRob2QiLAorCisJCWRzYV9wdWJfZGVjb2RlLAorCQlkc2FfcHViX2VuY29kZSwKKwkJZHNhX3B1Yl9jbXAsCisJCWRzYV9wdWJfcHJpbnQsCisKKwkJZHNhX3ByaXZfZGVjb2RlLAorCQlkc2FfcHJpdl9lbmNvZGUsCisJCWRzYV9wcml2X3ByaW50LAorCisJCWludF9kc2Ffc2l6ZSwKKwkJZHNhX2JpdHMsCisKKwkJZHNhX3BhcmFtX2RlY29kZSwKKwkJZHNhX3BhcmFtX2VuY29kZSwKKwkJZHNhX21pc3NpbmdfcGFyYW1ldGVycywKKwkJZHNhX2NvcHlfcGFyYW1ldGVycywKKwkJZHNhX2NtcF9wYXJhbWV0ZXJzLAorCQlkc2FfcGFyYW1fcHJpbnQsCisKKwkJaW50X2RzYV9mcmVlLAorCQlkc2FfcGtleV9jdHJsLAorCQlvbGRfZHNhX3ByaXZfZGVjb2RlLAorCQlvbGRfZHNhX3ByaXZfZW5jb2RlCisJCX0KKwl9OworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9hc24xLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9hc24xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3NDYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2FzbjEuYwpAQCAtMCwwICsxLDE1MCBAQAorLyogZHNhX2FzbjEuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorCisvKiBPdmVycmlkZSB0aGUgZGVmYXVsdCBuZXcgbWV0aG9kcyAqLworc3RhdGljIGludCBzaWdfY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCWlmKG9wZXJhdGlvbiA9PSBBU04xX09QX05FV19QUkUpIHsKKwkJRFNBX1NJRyAqc2lnOworCQlzaWcgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRFNBX1NJRykpOworCQlpZiAoIXNpZykKKwkJCXsKKwkJCURTQWVycihEU0FfRl9TSUdfQ0IsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlzaWctPnIgPSBOVUxMOworCQlzaWctPnMgPSBOVUxMOworCQkqcHZhbCA9IChBU04xX1ZBTFVFICopc2lnOworCQlyZXR1cm4gMjsKKwl9CisJcmV0dXJuIDE7Cit9CisKK0FTTjFfU0VRVUVOQ0VfY2IoRFNBX1NJRywgc2lnX2NiKSA9IHsKKwlBU04xX1NJTVBMRShEU0FfU0lHLCByLCBDQklHTlVNKSwKKwlBU04xX1NJTVBMRShEU0FfU0lHLCBzLCBDQklHTlVNKQorfSBBU04xX1NFUVVFTkNFX0VORF9jYihEU0FfU0lHLCBEU0FfU0lHKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfY29uc3QoRFNBX1NJRykKKworLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgZnJlZSBhbmQgbmV3IG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQgZHNhX2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCWlmKG9wZXJhdGlvbiA9PSBBU04xX09QX05FV19QUkUpIHsKKwkJKnB2YWwgPSAoQVNOMV9WQUxVRSAqKURTQV9uZXcoKTsKKwkJaWYoKnB2YWwpIHJldHVybiAyOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYob3BlcmF0aW9uID09IEFTTjFfT1BfRlJFRV9QUkUpIHsKKwkJRFNBX2ZyZWUoKERTQSAqKSpwdmFsKTsKKwkJKnB2YWwgPSBOVUxMOworCQlyZXR1cm4gMjsKKwl9CisJcmV0dXJuIDE7Cit9CisKK0FTTjFfU0VRVUVOQ0VfY2IoRFNBUHJpdmF0ZUtleSwgZHNhX2NiKSA9IHsKKwlBU04xX1NJTVBMRShEU0EsIHZlcnNpb24sIExPTkcpLAorCUFTTjFfU0lNUExFKERTQSwgcCwgQklHTlVNKSwKKwlBU04xX1NJTVBMRShEU0EsIHEsIEJJR05VTSksCisJQVNOMV9TSU1QTEUoRFNBLCBnLCBCSUdOVU0pLAorCUFTTjFfU0lNUExFKERTQSwgcHViX2tleSwgQklHTlVNKSwKKwlBU04xX1NJTVBMRShEU0EsIHByaXZfa2V5LCBCSUdOVU0pCit9IEFTTjFfU0VRVUVOQ0VfRU5EX2NiKERTQSwgRFNBUHJpdmF0ZUtleSkKKworSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdF9mbmFtZShEU0EsIERTQVByaXZhdGVLZXksIERTQVByaXZhdGVLZXkpCisKK0FTTjFfU0VRVUVOQ0VfY2IoRFNBcGFyYW1zLCBkc2FfY2IpID0geworCUFTTjFfU0lNUExFKERTQSwgcCwgQklHTlVNKSwKKwlBU04xX1NJTVBMRShEU0EsIHEsIEJJR05VTSksCisJQVNOMV9TSU1QTEUoRFNBLCBnLCBCSUdOVU0pLAorfSBBU04xX1NFUVVFTkNFX0VORF9jYihEU0EsIERTQXBhcmFtcykKKworSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdF9mbmFtZShEU0EsIERTQXBhcmFtcywgRFNBcGFyYW1zKQorCisvKiBEU0EgcHVibGljIGtleSBpcyBhIGJpdCB0cmlja2llci4uLiBpdHMgZWZmZWN0aXZlbHkgYSBDSE9JQ0UgdHlwZQorICogZGVjaWRlZCBieSBhIGZpZWxkIGNhbGxlZCB3cml0ZV9wYXJhbXMgd2hpY2ggY2FuIGVpdGhlciB3cml0ZSBvdXQKKyAqIGp1c3QgdGhlIHB1YmxpYyBrZXkgYXMgYW4gSU5URUdFUiBvciB0aGUgcGFyYW1ldGVycyBhbmQgcHVibGljIGtleQorICogaW4gYSBTRVFVRU5DRQorICovCisKK0FTTjFfU0VRVUVOQ0UoZHNhX3B1Yl9pbnRlcm5hbCkgPSB7CisJQVNOMV9TSU1QTEUoRFNBLCBwdWJfa2V5LCBCSUdOVU0pLAorCUFTTjFfU0lNUExFKERTQSwgcCwgQklHTlVNKSwKKwlBU04xX1NJTVBMRShEU0EsIHEsIEJJR05VTSksCisJQVNOMV9TSU1QTEUoRFNBLCBnLCBCSUdOVU0pCit9IEFTTjFfU0VRVUVOQ0VfRU5EX25hbWUoRFNBLCBkc2FfcHViX2ludGVybmFsKQorCitBU04xX0NIT0lDRV9jYihEU0FQdWJsaWNLZXksIGRzYV9jYikgPSB7CisJQVNOMV9TSU1QTEUoRFNBLCBwdWJfa2V5LCBCSUdOVU0pLAorCUFTTjFfRVhfQ09NQklORSgwLCAwLCBkc2FfcHViX2ludGVybmFsKQorfSBBU04xX0NIT0lDRV9FTkRfY2IoRFNBLCBEU0FQdWJsaWNLZXksIHdyaXRlX3BhcmFtcykKKworSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdF9mbmFtZShEU0EsIERTQVB1YmxpY0tleSwgRFNBUHVibGljS2V5KQorCitEU0EgKkRTQXBhcmFtc19kdXAoRFNBICpkc2EpCisJeworCXJldHVybiBBU04xX2l0ZW1fZHVwKEFTTjFfSVRFTV9ycHRyKERTQXBhcmFtcyksIGRzYSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfZGVwci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfZGVwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZGE2ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9kZXByLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIGNyeXB0by9kc2EvZHNhX2RlcHIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyBkZXByZWNhdGVkIGZ1bmN0aW9uKHMpIHRoYXQgYXJlIG5vdyB3cmFwcGVycyB0byB0aGUgbmV3CisgKiB2ZXJzaW9uKHMpLiAqLworCisjdW5kZWYgR0VOVUlORV9EU0EKKworI2lmZGVmIEdFTlVJTkVfRFNBCisvKiBQYXJhbWV0ZXIgZ2VuZXJhdGlvbiBmb2xsb3dzIHRoZSBvcmlnaW5hbCByZWxlYXNlIG9mIEZJUFMgUFVCIDE4NiwKKyAqIEFwcGVuZGl4IDIuMiAoaS5lLiB1c2UgU0hBIGFzIGRlZmluZWQgaW4gRklQUyBQVUIgMTgwKSAqLworI2RlZmluZSBIQVNIICAgIEVWUF9zaGEoKQorI2Vsc2UKKy8qIFBhcmFtZXRlciBnZW5lcmF0aW9uIGZvbGxvd3MgdGhlIHVwZGF0ZWQgQXBwZW5kaXggMi4yIGZvciBGSVBTIFBVQiAxODYsCisgKiBhbHNvIEFwcGVuZGl4IDIuMiBvZiBGSVBTIFBVQiAxODYtMSAoaS5lLiB1c2UgU0hBIGFzIGRlZmluZWQgaW4KKyAqIEZJUFMgUFVCIDE4MC0xKSAqLworI2RlZmluZSBIQVNIICAgIEVWUF9zaGExKCkKKyNlbmRpZiAKKworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitEU0EgKkRTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzKGludCBiaXRzLAorCQl1bnNpZ25lZCBjaGFyICpzZWVkX2luLCBpbnQgc2VlZF9sZW4sCisJCWludCAqY291bnRlcl9yZXQsIHVuc2lnbmVkIGxvbmcgKmhfcmV0LAorCQl2b2lkICgqY2FsbGJhY2spKGludCwgaW50LCB2b2lkICopLAorCQl2b2lkICpjYl9hcmcpCisJeworCUJOX0dFTkNCIGNiOworCURTQSAqcmV0OworCisJaWYgKChyZXQ9RFNBX25ldygpKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworCUJOX0dFTkNCX3NldF9vbGQoJmNiLCBjYWxsYmFjaywgY2JfYXJnKTsKKworCWlmKERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4KHJldCwgYml0cywgc2VlZF9pbiwgc2VlZF9sZW4sCisJCQkJY291bnRlcl9yZXQsIGhfcmV0LCAmY2IpKQorCQlyZXR1cm4gcmV0OworCURTQV9mcmVlKHJldCk7CisJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhOTg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2Vyci5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBjcnlwdG8vZHNhL2RzYV9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfRFNBLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfRFNBLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIERTQV9zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKERTQV9GX0QySV9EU0FfU0lHKSwJImQyaV9EU0FfU0lHIn0sCit7RVJSX0ZVTkMoRFNBX0ZfRE9fRFNBX1BSSU5UKSwJIkRPX0RTQV9QUklOVCJ9LAore0VSUl9GVU5DKERTQV9GX0RTQVBBUkFNU19QUklOVCksCSJEU0FwYXJhbXNfcHJpbnQifSwKK3tFUlJfRlVOQyhEU0FfRl9EU0FQQVJBTVNfUFJJTlRfRlApLAkiRFNBcGFyYW1zX3ByaW50X2ZwIn0sCit7RVJSX0ZVTkMoRFNBX0ZfRFNBX0RPX1NJR04pLAkiRFNBX2RvX3NpZ24ifSwKK3tFUlJfRlVOQyhEU0FfRl9EU0FfRE9fVkVSSUZZKSwJIkRTQV9kb192ZXJpZnkifSwKK3tFUlJfRlVOQyhEU0FfRl9EU0FfTkVXX01FVEhPRCksCSJEU0FfbmV3X21ldGhvZCJ9LAore0VSUl9GVU5DKERTQV9GX0RTQV9QQVJBTV9ERUNPREUpLAkiRFNBX1BBUkFNX0RFQ09ERSJ9LAore0VSUl9GVU5DKERTQV9GX0RTQV9QUklOVF9GUCksCSJEU0FfcHJpbnRfZnAifSwKK3tFUlJfRlVOQyhEU0FfRl9EU0FfUFJJVl9ERUNPREUpLAkiRFNBX1BSSVZfREVDT0RFIn0sCit7RVJSX0ZVTkMoRFNBX0ZfRFNBX1BSSVZfRU5DT0RFKSwJIkRTQV9QUklWX0VOQ09ERSJ9LAore0VSUl9GVU5DKERTQV9GX0RTQV9QVUJfREVDT0RFKSwJIkRTQV9QVUJfREVDT0RFIn0sCit7RVJSX0ZVTkMoRFNBX0ZfRFNBX1BVQl9FTkNPREUpLAkiRFNBX1BVQl9FTkNPREUifSwKK3tFUlJfRlVOQyhEU0FfRl9EU0FfU0lHTiksCSJEU0Ffc2lnbiJ9LAore0VSUl9GVU5DKERTQV9GX0RTQV9TSUdOX1NFVFVQKSwJIkRTQV9zaWduX3NldHVwIn0sCit7RVJSX0ZVTkMoRFNBX0ZfRFNBX1NJR19ORVcpLAkiRFNBX1NJR19uZXcifSwKK3tFUlJfRlVOQyhEU0FfRl9EU0FfVkVSSUZZKSwJIkRTQV92ZXJpZnkifSwKK3tFUlJfRlVOQyhEU0FfRl9JMkRfRFNBX1NJRyksCSJpMmRfRFNBX1NJRyJ9LAore0VSUl9GVU5DKERTQV9GX09MRF9EU0FfUFJJVl9ERUNPREUpLAkiT0xEX0RTQV9QUklWX0RFQ09ERSJ9LAore0VSUl9GVU5DKERTQV9GX1BLRVlfRFNBX0NUUkwpLAkiUEtFWV9EU0FfQ1RSTCJ9LAore0VSUl9GVU5DKERTQV9GX1BLRVlfRFNBX0tFWUdFTiksCSJQS0VZX0RTQV9LRVlHRU4ifSwKK3tFUlJfRlVOQyhEU0FfRl9TSUdfQ0IpLAkiU0lHX0NCIn0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgRFNBX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oRFNBX1JfQkFEX1FfVkFMVUUpICAgICAgICAgICAsImJhZCBxIHZhbHVlIn0sCit7RVJSX1JFQVNPTihEU0FfUl9CTl9ERUNPREVfRVJST1IpICAgICAgICwiYm4gZGVjb2RlIGVycm9yIn0sCit7RVJSX1JFQVNPTihEU0FfUl9CTl9FUlJPUikgICAgICAgICAgICAgICwiYm4gZXJyb3IifSwKK3tFUlJfUkVBU09OKERTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSksImRhdGEgdG9vIGxhcmdlIGZvciBrZXkgc2l6ZSJ9LAore0VSUl9SRUFTT04oRFNBX1JfREVDT0RFX0VSUk9SKSAgICAgICAgICAsImRlY29kZSBlcnJvciJ9LAore0VSUl9SRUFTT04oRFNBX1JfSU5WQUxJRF9ESUdFU1RfVFlQRSkgICAsImludmFsaWQgZGlnZXN0IHR5cGUifSwKK3tFUlJfUkVBU09OKERTQV9SX01JU1NJTkdfUEFSQU1FVEVSUykgICAgLCJtaXNzaW5nIHBhcmFtZXRlcnMifSwKK3tFUlJfUkVBU09OKERTQV9SX01PRFVMVVNfVE9PX0xBUkdFKSAgICAgLCJtb2R1bHVzIHRvbyBsYXJnZSJ9LAore0VSUl9SRUFTT04oRFNBX1JfTk9fUEFSQU1FVEVSU19TRVQpICAgICAsIm5vIHBhcmFtZXRlcnMgc2V0In0sCit7RVJSX1JFQVNPTihEU0FfUl9QQVJBTUVURVJfRU5DT0RJTkdfRVJST1IpLCJwYXJhbWV0ZXIgZW5jb2RpbmcgZXJyb3IifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfRFNBX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKERTQV9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxEU0Ffc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxEU0Ffc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9nZW4uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2dlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmY2QyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9nZW4uYwpAQCAtMCwwICsxLDM0NSBAQAorLyogY3J5cHRvL2RzYS9kc2FfZ2VuLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI3VuZGVmIEdFTlVJTkVfRFNBCisKKyNpZmRlZiBHRU5VSU5FX0RTQQorLyogUGFyYW1ldGVyIGdlbmVyYXRpb24gZm9sbG93cyB0aGUgb3JpZ2luYWwgcmVsZWFzZSBvZiBGSVBTIFBVQiAxODYsCisgKiBBcHBlbmRpeCAyLjIgKGkuZS4gdXNlIFNIQSBhcyBkZWZpbmVkIGluIEZJUFMgUFVCIDE4MCkgKi8KKyNkZWZpbmUgSEFTSCAgICBFVlBfc2hhKCkKKyNlbHNlCisvKiBQYXJhbWV0ZXIgZ2VuZXJhdGlvbiBmb2xsb3dzIHRoZSB1cGRhdGVkIEFwcGVuZGl4IDIuMiBmb3IgRklQUyBQVUIgMTg2LAorICogYWxzbyBBcHBlbmRpeCAyLjIgb2YgRklQUyBQVUIgMTg2LTEgKGkuZS4gdXNlIFNIQSBhcyBkZWZpbmVkIGluCisgKiBGSVBTIFBVQiAxODAtMSkgKi8KKyNkZWZpbmUgSEFTSCAgICBFVlBfc2hhMSgpCisjZW5kaWYgCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+IC8qIFRvIHNlZSBpZiBPUEVOU1NMX05PX1NIQSBpcyBkZWZpbmVkICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorI2luY2x1ZGUgImRzYV9sb2NsLmgiCisKK2ludCBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChEU0EgKnJldCwgaW50IGJpdHMsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlZWRfaW4sIGludCBzZWVkX2xlbiwKKwkJaW50ICpjb3VudGVyX3JldCwgdW5zaWduZWQgbG9uZyAqaF9yZXQsIEJOX0dFTkNCICpjYikKKwl7CisJaWYocmV0LT5tZXRoLT5kc2FfcGFyYW1nZW4pCisJCXJldHVybiByZXQtPm1ldGgtPmRzYV9wYXJhbWdlbihyZXQsIGJpdHMsIHNlZWRfaW4sIHNlZWRfbGVuLAorCQkJCWNvdW50ZXJfcmV0LCBoX3JldCwgY2IpOworCWVsc2UKKwkJeworCQljb25zdCBFVlBfTUQgKmV2cG1kOworCQlzaXplX3QgcWJpdHMgPSBiaXRzID49IDIwNDggPyAyNTYgOiAxNjA7CisKKwkJaWYgKGJpdHMgPj0gMjA0OCkKKwkJCXsKKwkJCXFiaXRzID0gMjU2OworCQkJZXZwbWQgPSBFVlBfc2hhMjU2KCk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXFiaXRzID0gMTYwOworCQkJZXZwbWQgPSBFVlBfc2hhMSgpOworCQkJfQorCisJCXJldHVybiBkc2FfYnVpbHRpbl9wYXJhbWdlbihyZXQsIGJpdHMsIHFiaXRzLCBldnBtZCwKKwkJCQlzZWVkX2luLCBzZWVkX2xlbiwgY291bnRlcl9yZXQsIGhfcmV0LCBjYik7CisJCX0KKwl9CisKK2ludCBkc2FfYnVpbHRpbl9wYXJhbWdlbihEU0EgKnJldCwgc2l6ZV90IGJpdHMsIHNpemVfdCBxYml0cywKKwljb25zdCBFVlBfTUQgKmV2cG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZWVkX2luLCBzaXplX3Qgc2VlZF9sZW4sCisJaW50ICpjb3VudGVyX3JldCwgdW5zaWduZWQgbG9uZyAqaF9yZXQsIEJOX0dFTkNCICpjYikKKwl7CisJaW50IG9rPTA7CisJdW5zaWduZWQgY2hhciBzZWVkW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyIG1kW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltTSEEyNTZfRElHRVNUX0xFTkdUSF0sYnVmMltTSEEyNTZfRElHRVNUX0xFTkdUSF07CisJQklHTlVNICpyMCwqVywqWCwqYywqdGVzdDsKKwlCSUdOVU0gKmc9TlVMTCwqcT1OVUxMLCpwPU5VTEw7CisJQk5fTU9OVF9DVFggKm1vbnQ9TlVMTDsKKwlpbnQgaSwgayxuPTAsYixtPTAsIHFzaXplID0gcWJpdHMgPj4gMzsKKwlpbnQgY291bnRlcj0wOworCWludCByPTA7CisJQk5fQ1RYICpjdHg9TlVMTDsKKwl1bnNpZ25lZCBpbnQgaD0yOworCisJaWYgKHFzaXplICE9IFNIQV9ESUdFU1RfTEVOR1RIICYmIHFzaXplICE9IFNIQTIyNF9ESUdFU1RfTEVOR1RIICYmCisJICAgIHFzaXplICE9IFNIQTI1Nl9ESUdFU1RfTEVOR1RIKQorCQkvKiBpbnZhbGlkIHEgc2l6ZSAqLworCQlyZXR1cm4gMDsKKworCWlmIChldnBtZCA9PSBOVUxMKQorCQkvKiB1c2UgU0hBMSBhcyBkZWZhdWx0ICovCisJCWV2cG1kID0gRVZQX3NoYTEoKTsKKworCWlmIChiaXRzIDwgNTEyKQorCQliaXRzID0gNTEyOworCisJYml0cyA9IChiaXRzKzYzKS82NCo2NDsKKworCS8qIE5COiBzZWVkX2xlbiA9PSAwIGlzIHNwZWNpYWwgY2FzZTogY29weSBnZW5lcmF0ZWQgc2VlZCB0bworIAkgKiBzZWVkX2luIGlmIGl0IGlzIG5vdCBOVUxMLgorIAkgKi8KKwlpZiAoc2VlZF9sZW4gJiYgKHNlZWRfbGVuIDwgKHNpemVfdClxc2l6ZSkpCisJCXNlZWRfaW4gPSBOVUxMOwkJLyogc2VlZCBidWZmZXIgdG9vIHNtYWxsIC0tIGlnbm9yZSAqLworCWlmIChzZWVkX2xlbiA+IChzaXplX3QpcXNpemUpIAorCQlzZWVkX2xlbiA9IHFzaXplOwkvKiBBcHAuIDIuMiBvZiBGSVBTIFBVQiAxODYgYWxsb3dzIGxhcmdlciBTRUVELAorCQkJCQkgKiBidXQgb3VyIGludGVybmFsIGJ1ZmZlcnMgYXJlIHJlc3RyaWN0ZWQgdG8gMTYwIGJpdHMqLworCWlmIChzZWVkX2luICE9IE5VTEwpCisJCW1lbWNweShzZWVkLCBzZWVkX2luLCBzZWVkX2xlbik7CisKKwlpZiAoKGN0eD1CTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJaWYgKChtb250PUJOX01PTlRfQ1RYX25ldygpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCUJOX0NUWF9zdGFydChjdHgpOworCXIwID0gQk5fQ1RYX2dldChjdHgpOworCWcgPSBCTl9DVFhfZ2V0KGN0eCk7CisJVyA9IEJOX0NUWF9nZXQoY3R4KTsKKwlxID0gQk5fQ1RYX2dldChjdHgpOworCVggPSBCTl9DVFhfZ2V0KGN0eCk7CisJYyA9IEJOX0NUWF9nZXQoY3R4KTsKKwlwID0gQk5fQ1RYX2dldChjdHgpOworCXRlc3QgPSBCTl9DVFhfZ2V0KGN0eCk7CisKKwlpZiAoIUJOX2xzaGlmdCh0ZXN0LEJOX3ZhbHVlX29uZSgpLGJpdHMtMSkpCisJCWdvdG8gZXJyOworCisJZm9yICg7OykKKwkJeworCQlmb3IgKDs7KSAvKiBmaW5kIHEgKi8KKwkJCXsKKwkJCWludCBzZWVkX2lzX3JhbmRvbTsKKworCQkJLyogc3RlcCAxICovCisJCQlpZighQk5fR0VOQ0JfY2FsbChjYiwgMCwgbSsrKSkKKwkJCQlnb3RvIGVycjsKKworCQkJaWYgKCFzZWVkX2xlbikKKwkJCQl7CisJCQkJUkFORF9wc2V1ZG9fYnl0ZXMoc2VlZCwgcXNpemUpOworCQkJCXNlZWRfaXNfcmFuZG9tID0gMTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCXNlZWRfaXNfcmFuZG9tID0gMDsKKwkJCQlzZWVkX2xlbj0wOyAvKiB1c2UgcmFuZG9tIHNlZWQgaWYgJ3NlZWRfaW4nIHR1cm5zIG91dCB0byBiZSBiYWQqLworCQkJCX0KKwkJCW1lbWNweShidWYgLCBzZWVkLCBxc2l6ZSk7CisJCQltZW1jcHkoYnVmMiwgc2VlZCwgcXNpemUpOworCQkJLyogcHJlY29tcHV0ZSAiU0VFRCArIDEiIGZvciBzdGVwIDc6ICovCisJCQlmb3IgKGkgPSBxc2l6ZS0xOyBpID49IDA7IGktLSkKKwkJCQl7CisJCQkJYnVmW2ldKys7CisJCQkJaWYgKGJ1ZltpXSAhPSAwKQorCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCS8qIHN0ZXAgMiAqLworCQkJRVZQX0RpZ2VzdChzZWVkLCBxc2l6ZSwgbWQsICAgTlVMTCwgZXZwbWQsIE5VTEwpOworCQkJRVZQX0RpZ2VzdChidWYsICBxc2l6ZSwgYnVmMiwgTlVMTCwgZXZwbWQsIE5VTEwpOworCQkJZm9yIChpID0gMDsgaSA8IHFzaXplOyBpKyspCisJCQkJbWRbaV1ePWJ1ZjJbaV07CisKKwkJCS8qIHN0ZXAgMyAqLworCQkJbWRbMF0gfD0gMHg4MDsKKwkJCW1kW3FzaXplLTFdIHw9IDB4MDE7CisJCQlpZiAoIUJOX2JpbjJibihtZCwgcXNpemUsIHEpKQorCQkJCWdvdG8gZXJyOworCisJCQkvKiBzdGVwIDQgKi8KKwkJCXIgPSBCTl9pc19wcmltZV9mYXN0dGVzdF9leChxLCBEU1NfcHJpbWVfY2hlY2tzLCBjdHgsCisJCQkJCXNlZWRfaXNfcmFuZG9tLCBjYik7CisJCQlpZiAociA+IDApCisJCQkJYnJlYWs7CisJCQlpZiAociAhPSAwKQorCQkJCWdvdG8gZXJyOworCisJCQkvKiBkbyBhIGNhbGxiYWNrIGNhbGwgKi8KKwkJCS8qIHN0ZXAgNSAqLworCQkJfQorCisJCWlmKCFCTl9HRU5DQl9jYWxsKGNiLCAyLCAwKSkgZ290byBlcnI7CisJCWlmKCFCTl9HRU5DQl9jYWxsKGNiLCAzLCAwKSkgZ290byBlcnI7CisKKwkJLyogc3RlcCA2ICovCisJCWNvdW50ZXI9MDsKKwkJLyogIm9mZnNldCA9IDIiICovCisKKwkJbj0oYml0cy0xKS8xNjA7CisJCWI9KGJpdHMtMSktbioxNjA7CisKKwkJZm9yICg7OykKKwkJCXsKKwkJCWlmICgoY291bnRlciAhPSAwKSAmJiAhQk5fR0VOQ0JfY2FsbChjYiwgMCwgY291bnRlcikpCisJCQkJZ290byBlcnI7CisKKwkJCS8qIHN0ZXAgNyAqLworCQkJQk5femVybyhXKTsKKwkJCS8qIG5vdyAnYnVmJyBjb250YWlucyAiU0VFRCArIG9mZnNldCAtIDEiICovCisJCQlmb3IgKGs9MDsgazw9bjsgaysrKQorCQkJCXsKKwkJCQkvKiBvYnRhaW4gIlNFRUQgKyBvZmZzZXQgKyBrIiBieSBpbmNyZW1lbnRpbmc6ICovCisJCQkJZm9yIChpID0gcXNpemUtMTsgaSA+PSAwOyBpLS0pCisJCQkJCXsKKwkJCQkJYnVmW2ldKys7CisJCQkJCWlmIChidWZbaV0gIT0gMCkKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQlFVlBfRGlnZXN0KGJ1ZiwgcXNpemUsIG1kICxOVUxMLCBldnBtZCwgTlVMTCk7CisKKwkJCQkvKiBzdGVwIDggKi8KKwkJCQlpZiAoIUJOX2JpbjJibihtZCwgcXNpemUsIHIwKSkKKwkJCQkJZ290byBlcnI7CisJCQkJaWYgKCFCTl9sc2hpZnQocjAscjAsKHFzaXplIDw8IDMpKmspKSBnb3RvIGVycjsKKwkJCQlpZiAoIUJOX2FkZChXLFcscjApKSBnb3RvIGVycjsKKwkJCQl9CisKKwkJCS8qIG1vcmUgb2Ygc3RlcCA4ICovCisJCQlpZiAoIUJOX21hc2tfYml0cyhXLGJpdHMtMSkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9jb3B5KFgsVykpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9hZGQoWCxYLHRlc3QpKSBnb3RvIGVycjsKKworCQkJLyogc3RlcCA5ICovCisJCQlpZiAoIUJOX2xzaGlmdDEocjAscSkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9tb2QoYyxYLHIwLGN0eCkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9zdWIocjAsYyxCTl92YWx1ZV9vbmUoKSkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9zdWIocCxYLHIwKSkgZ290byBlcnI7CisKKwkJCS8qIHN0ZXAgMTAgKi8KKwkJCWlmIChCTl9jbXAocCx0ZXN0KSA+PSAwKQorCQkJCXsKKwkJCQkvKiBzdGVwIDExICovCisJCQkJciA9IEJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KHAsIERTU19wcmltZV9jaGVja3MsCisJCQkJCQljdHgsIDEsIGNiKTsKKwkJCQlpZiAociA+IDApCisJCQkJCQlnb3RvIGVuZDsgLyogZm91bmQgaXQgKi8KKwkJCQlpZiAociAhPSAwKQorCQkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCS8qIHN0ZXAgMTMgKi8KKwkJCWNvdW50ZXIrKzsKKwkJCS8qICJvZmZzZXQgPSBvZmZzZXQgKyBuICsgMSIgKi8KKworCQkJLyogc3RlcCAxNCAqLworCQkJaWYgKGNvdW50ZXIgPj0gNDA5NikgYnJlYWs7CisJCQl9CisJCX0KK2VuZDoKKwlpZighQk5fR0VOQ0JfY2FsbChjYiwgMiwgMSkpCisJCWdvdG8gZXJyOworCisJLyogV2Ugbm93IG5lZWQgdG8gZ2VuZXJhdGUgZyAqLworCS8qIFNldCByMD0ocC0xKS9xICovCisJaWYgKCFCTl9zdWIodGVzdCxwLEJOX3ZhbHVlX29uZSgpKSkgZ290byBlcnI7CisJaWYgKCFCTl9kaXYocjAsTlVMTCx0ZXN0LHEsY3R4KSkgZ290byBlcnI7CisKKwlpZiAoIUJOX3NldF93b3JkKHRlc3QsaCkpIGdvdG8gZXJyOworCWlmICghQk5fTU9OVF9DVFhfc2V0KG1vbnQscCxjdHgpKSBnb3RvIGVycjsKKworCWZvciAoOzspCisJCXsKKwkJLyogZz10ZXN0XnIwJXAgKi8KKwkJaWYgKCFCTl9tb2RfZXhwX21vbnQoZyx0ZXN0LHIwLHAsY3R4LG1vbnQpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9pc19vbmUoZykpIGJyZWFrOworCQlpZiAoIUJOX2FkZCh0ZXN0LHRlc3QsQk5fdmFsdWVfb25lKCkpKSBnb3RvIGVycjsKKwkJaCsrOworCQl9CisKKwlpZighQk5fR0VOQ0JfY2FsbChjYiwgMywgMSkpCisJCWdvdG8gZXJyOworCisJb2s9MTsKK2VycjoKKwlpZiAob2spCisJCXsKKwkJaWYocmV0LT5wKSBCTl9mcmVlKHJldC0+cCk7CisJCWlmKHJldC0+cSkgQk5fZnJlZShyZXQtPnEpOworCQlpZihyZXQtPmcpIEJOX2ZyZWUocmV0LT5nKTsKKwkJcmV0LT5wPUJOX2R1cChwKTsKKwkJcmV0LT5xPUJOX2R1cChxKTsKKwkJcmV0LT5nPUJOX2R1cChnKTsKKwkJaWYgKHJldC0+cCA9PSBOVUxMIHx8IHJldC0+cSA9PSBOVUxMIHx8IHJldC0+ZyA9PSBOVUxMKQorCQkJeworCQkJb2s9MDsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoY291bnRlcl9yZXQgIT0gTlVMTCkgKmNvdW50ZXJfcmV0PWNvdW50ZXI7CisJCWlmIChoX3JldCAhPSBOVUxMKSAqaF9yZXQ9aDsKKwkJfQorCWlmKGN0eCkKKwkJeworCQlCTl9DVFhfZW5kKGN0eCk7CisJCUJOX0NUWF9mcmVlKGN0eCk7CisJCX0KKwlpZiAobW9udCAhPSBOVUxMKSBCTl9NT05UX0NUWF9mcmVlKG1vbnQpOworCXJldHVybiBvazsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2tleS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2Ffa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhYTg2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2tleS5jCkBAIC0wLDAgKzEsMTI4IEBACisvKiBjcnlwdG8vZHNhL2RzYV9rZXkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworc3RhdGljIGludCBkc2FfYnVpbHRpbl9rZXlnZW4oRFNBICpkc2EpOworCitpbnQgRFNBX2dlbmVyYXRlX2tleShEU0EgKmRzYSkKKwl7CisJaWYoZHNhLT5tZXRoLT5kc2Ffa2V5Z2VuKQorCQlyZXR1cm4gZHNhLT5tZXRoLT5kc2Ffa2V5Z2VuKGRzYSk7CisJcmV0dXJuIGRzYV9idWlsdGluX2tleWdlbihkc2EpOworCX0KKworc3RhdGljIGludCBkc2FfYnVpbHRpbl9rZXlnZW4oRFNBICpkc2EpCisJeworCWludCBvaz0wOworCUJOX0NUWCAqY3R4PU5VTEw7CisJQklHTlVNICpwdWJfa2V5PU5VTEwsKnByaXZfa2V5PU5VTEw7CisKKwlpZiAoKGN0eD1CTl9DVFhfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKGRzYS0+cHJpdl9rZXkgPT0gTlVMTCkKKwkJeworCQlpZiAoKHByaXZfa2V5PUJOX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJcHJpdl9rZXk9ZHNhLT5wcml2X2tleTsKKworCWRvCisJCWlmICghQk5fcmFuZF9yYW5nZShwcml2X2tleSxkc2EtPnEpKSBnb3RvIGVycjsKKwl3aGlsZSAoQk5faXNfemVybyhwcml2X2tleSkpOworCisJaWYgKGRzYS0+cHViX2tleSA9PSBOVUxMKQorCQl7CisJCWlmICgocHViX2tleT1CTl9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXB1Yl9rZXk9ZHNhLT5wdWJfa2V5OworCQorCXsKKwkJQklHTlVNIGxvY2FsX3ByazsKKwkJQklHTlVNICpwcms7CisKKwkJaWYgKChkc2EtPmZsYWdzICYgRFNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSkgPT0gMCkKKwkJCXsKKwkJCUJOX2luaXQoJmxvY2FsX3Byayk7CisJCQlwcmsgPSAmbG9jYWxfcHJrOworCQkJQk5fd2l0aF9mbGFncyhwcmssIHByaXZfa2V5LCBCTl9GTEdfQ09OU1RUSU1FKTsKKwkJCX0KKwkJZWxzZQorCQkJcHJrID0gcHJpdl9rZXk7CisKKwkJaWYgKCFCTl9tb2RfZXhwKHB1Yl9rZXksZHNhLT5nLHByayxkc2EtPnAsY3R4KSkgZ290byBlcnI7CisJfQorCisJZHNhLT5wcml2X2tleT1wcml2X2tleTsKKwlkc2EtPnB1Yl9rZXk9cHViX2tleTsKKwlvaz0xOworCitlcnI6CisJaWYgKChwdWJfa2V5ICE9IE5VTEwpICYmIChkc2EtPnB1Yl9rZXkgPT0gTlVMTCkpIEJOX2ZyZWUocHViX2tleSk7CisJaWYgKChwcml2X2tleSAhPSBOVUxMKSAmJiAoZHNhLT5wcml2X2tleSA9PSBOVUxMKSkgQk5fZnJlZShwcml2X2tleSk7CisJaWYgKGN0eCAhPSBOVUxMKSBCTl9DVFhfZnJlZShjdHgpOworCXJldHVybihvayk7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Yjc1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9saWIuYwpAQCAtMCwwICsxLDMxMSBAQAorLyogY3J5cHRvL2RzYS9kc2FfbGliLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogT3JpZ2luYWwgdmVyc2lvbiBmcm9tIFN0ZXZlbiBTY2hvY2ggPHNjaG9jaEBzaGViYS5hcmMubmFzYS5nb3Y+ICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisKK2NvbnN0IGNoYXIgRFNBX3ZlcnNpb25bXT0iRFNBIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKK3N0YXRpYyBjb25zdCBEU0FfTUVUSE9EICpkZWZhdWx0X0RTQV9tZXRob2QgPSBOVUxMOworCit2b2lkIERTQV9zZXRfZGVmYXVsdF9tZXRob2QoY29uc3QgRFNBX01FVEhPRCAqbWV0aCkKKwl7CisJZGVmYXVsdF9EU0FfbWV0aG9kID0gbWV0aDsKKwl9CisKK2NvbnN0IERTQV9NRVRIT0QgKkRTQV9nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCkKKwl7CisJaWYoIWRlZmF1bHRfRFNBX21ldGhvZCkKKwkJZGVmYXVsdF9EU0FfbWV0aG9kID0gRFNBX09wZW5TU0woKTsKKwlyZXR1cm4gZGVmYXVsdF9EU0FfbWV0aG9kOworCX0KKworRFNBICpEU0FfbmV3KHZvaWQpCisJeworCXJldHVybiBEU0FfbmV3X21ldGhvZChOVUxMKTsKKwl9CisKK2ludCBEU0Ffc2V0X21ldGhvZChEU0EgKmRzYSwgY29uc3QgRFNBX01FVEhPRCAqbWV0aCkKKwl7CisJLyogTkI6IFRoZSBjYWxsZXIgaXMgc3BlY2lmaWNhbGx5IHNldHRpbmcgYSBtZXRob2QsIHNvIGl0J3Mgbm90IHVwIHRvIHVzCisJICogdG8gZGVhbCB3aXRoIHdoaWNoIEVOR0lORSBpdCBjb21lcyBmcm9tLiAqLworICAgICAgICBjb25zdCBEU0FfTUVUSE9EICptdG1wOworICAgICAgICBtdG1wID0gZHNhLT5tZXRoOworICAgICAgICBpZiAobXRtcC0+ZmluaXNoKSBtdG1wLT5maW5pc2goZHNhKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoZHNhLT5lbmdpbmUpCisJCXsKKwkJRU5HSU5FX2ZpbmlzaChkc2EtPmVuZ2luZSk7CisJCWRzYS0+ZW5naW5lID0gTlVMTDsKKwkJfQorI2VuZGlmCisgICAgICAgIGRzYS0+bWV0aCA9IG1ldGg7CisgICAgICAgIGlmIChtZXRoLT5pbml0KSBtZXRoLT5pbml0KGRzYSk7CisgICAgICAgIHJldHVybiAxOworCX0KKworRFNBICpEU0FfbmV3X21ldGhvZChFTkdJTkUgKmVuZ2luZSkKKwl7CisJRFNBICpyZXQ7CisKKwlyZXQ9KERTQSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihEU0EpKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJRFNBZXJyKERTQV9GX0RTQV9ORVdfTUVUSE9ELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0LT5tZXRoID0gRFNBX2dldF9kZWZhdWx0X21ldGhvZCgpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmIChlbmdpbmUpCisJCXsKKwkJaWYgKCFFTkdJTkVfaW5pdChlbmdpbmUpKQorCQkJeworCQkJRFNBZXJyKERTQV9GX0RTQV9ORVdfTUVUSE9ELCBFUlJfUl9FTkdJTkVfTElCKTsKKwkJCU9QRU5TU0xfZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCXJldC0+ZW5naW5lID0gZW5naW5lOworCQl9CisJZWxzZQorCQlyZXQtPmVuZ2luZSA9IEVOR0lORV9nZXRfZGVmYXVsdF9EU0EoKTsKKwlpZihyZXQtPmVuZ2luZSkKKwkJeworCQlyZXQtPm1ldGggPSBFTkdJTkVfZ2V0X0RTQShyZXQtPmVuZ2luZSk7CisJCWlmKCFyZXQtPm1ldGgpCisJCQl7CisJCQlEU0FlcnIoRFNBX0ZfRFNBX05FV19NRVRIT0QsCisJCQkJRVJSX1JfRU5HSU5FX0xJQik7CisJCQlFTkdJTkVfZmluaXNoKHJldC0+ZW5naW5lKTsKKwkJCU9QRU5TU0xfZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKyNlbmRpZgorCisJcmV0LT5wYWQ9MDsKKwlyZXQtPnZlcnNpb249MDsKKwlyZXQtPndyaXRlX3BhcmFtcz0xOworCXJldC0+cD1OVUxMOworCXJldC0+cT1OVUxMOworCXJldC0+Zz1OVUxMOworCisJcmV0LT5wdWJfa2V5PU5VTEw7CisJcmV0LT5wcml2X2tleT1OVUxMOworCisJcmV0LT5raW52PU5VTEw7CisJcmV0LT5yPU5VTEw7CisJcmV0LT5tZXRob2RfbW9udF9wPU5VTEw7CisKKwlyZXQtPnJlZmVyZW5jZXM9MTsKKwlyZXQtPmZsYWdzPXJldC0+bWV0aC0+ZmxhZ3M7CisJQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9EU0EsIHJldCwgJnJldC0+ZXhfZGF0YSk7CisJaWYgKChyZXQtPm1ldGgtPmluaXQgIT0gTlVMTCkgJiYgIXJldC0+bWV0aC0+aW5pdChyZXQpKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWlmIChyZXQtPmVuZ2luZSkKKwkJCUVOR0lORV9maW5pc2gocmV0LT5lbmdpbmUpOworI2VuZGlmCisJCUNSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX0RTQSwgcmV0LCAmcmV0LT5leF9kYXRhKTsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldD1OVUxMOworCQl9CisJCisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIERTQV9mcmVlKERTQSAqcikKKwl7CisJaW50IGk7CisKKwlpZiAociA9PSBOVUxMKSByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJnItPnJlZmVyZW5jZXMsLTEsQ1JZUFRPX0xPQ0tfRFNBKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIkRTQSIscik7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIkRTQV9mcmVlLCBiYWQgcmVmZXJlbmNlIGNvdW50XG4iKTsKKwkJYWJvcnQoKTsKKwkJfQorI2VuZGlmCisKKwlpZihyLT5tZXRoLT5maW5pc2gpCisJCXItPm1ldGgtPmZpbmlzaChyKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZihyLT5lbmdpbmUpCisJCUVOR0lORV9maW5pc2goci0+ZW5naW5lKTsKKyNlbmRpZgorCisJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfRFNBLCByLCAmci0+ZXhfZGF0YSk7CisKKwlpZiAoci0+cCAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHItPnApOworCWlmIChyLT5xICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+cSk7CisJaWYgKHItPmcgIT0gTlVMTCkgQk5fY2xlYXJfZnJlZShyLT5nKTsKKwlpZiAoci0+cHViX2tleSAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHItPnB1Yl9rZXkpOworCWlmIChyLT5wcml2X2tleSAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHItPnByaXZfa2V5KTsKKwlpZiAoci0+a2ludiAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHItPmtpbnYpOworCWlmIChyLT5yICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+cik7CisJT1BFTlNTTF9mcmVlKHIpOworCX0KKworaW50IERTQV91cF9yZWYoRFNBICpyKQorCXsKKwlpbnQgaSA9IENSWVBUT19hZGQoJnItPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX0RTQSk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJEU0EiLHIpOworI2VuZGlmCisjaWZkZWYgUkVGX0NIRUNLCisJaWYgKGkgPCAyKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCAiRFNBX3VwX3JlZiwgYmFkIHJlZmVyZW5jZSBjb3VudFxuIik7CisJCWFib3J0KCk7CisJCX0KKyNlbmRpZgorCXJldHVybiAoKGkgPiAxKSA/IDEgOiAwKTsKKwl9CisKK2ludCBEU0Ffc2l6ZShjb25zdCBEU0EgKnIpCisJeworCWludCByZXQsaTsKKwlBU04xX0lOVEVHRVIgYnM7CisJdW5zaWduZWQgY2hhciBidWZbNF07CS8qIDQgYnl0ZXMgbG9va3MgcmVhbGx5IHNtYWxsLgorCQkJCSAgIEhvd2V2ZXIsIGkyZF9BU04xX0lOVEVHRVIoKSB3aWxsIG5vdCBsb29rCisJCQkJICAgYmV5b25kIHRoZSBmaXJzdCBieXRlLCBhcyBsb25nIGFzIHRoZSBzZWNvbmQKKwkJCQkgICBwYXJhbWV0ZXIgaXMgTlVMTC4gKi8KKworCWk9Qk5fbnVtX2JpdHMoci0+cSk7CisJYnMubGVuZ3RoPShpKzcpLzg7CisJYnMuZGF0YT1idWY7CisJYnMudHlwZT1WX0FTTjFfSU5URUdFUjsKKwkvKiBJZiB0aGUgdG9wIGJpdCBpcyBzZXQgdGhlIGFzbjEgZW5jb2RpbmcgaXMgMSBsYXJnZXIuICovCisJYnVmWzBdPTB4ZmY7CQorCisJaT1pMmRfQVNOMV9JTlRFR0VSKCZicyxOVUxMKTsKKwlpKz1pOyAvKiByIGFuZCBzICovCisJcmV0PUFTTjFfb2JqZWN0X3NpemUoMSxpLFZfQVNOMV9TRVFVRU5DRSk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgRFNBX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKQorICAgICAgICB7CisJcmV0dXJuIENSWVBUT19nZXRfZXhfbmV3X2luZGV4KENSWVBUT19FWF9JTkRFWF9EU0EsIGFyZ2wsIGFyZ3AsCisJCQkJbmV3X2Z1bmMsIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworICAgICAgICB9CisKK2ludCBEU0Ffc2V0X2V4X2RhdGEoRFNBICpkLCBpbnQgaWR4LCB2b2lkICphcmcpCisJeworCXJldHVybihDUllQVE9fc2V0X2V4X2RhdGEoJmQtPmV4X2RhdGEsaWR4LGFyZykpOworCX0KKwordm9pZCAqRFNBX2dldF9leF9kYXRhKERTQSAqZCwgaW50IGlkeCkKKwl7CisJcmV0dXJuKENSWVBUT19nZXRfZXhfZGF0YSgmZC0+ZXhfZGF0YSxpZHgpKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorREggKkRTQV9kdXBfREgoY29uc3QgRFNBICpyKQorCXsKKwkvKiBEU0EgaGFzIHAsIHEsIGcsIG9wdGlvbmFsIHB1Yl9rZXksIG9wdGlvbmFsIHByaXZfa2V5LgorCSAqIERIIGhhcyBwLCBvcHRpb25hbCBsZW5ndGgsIGcsIG9wdGlvbmFsIHB1Yl9rZXksIG9wdGlvbmFsIHByaXZfa2V5LgorCSAqLyAKKworCURIICpyZXQgPSBOVUxMOworCisJaWYgKHIgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJcmV0ID0gREhfbmV3KCk7CisJaWYgKHJldCA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAoci0+cCAhPSBOVUxMKSAKKwkJaWYgKChyZXQtPnAgPSBCTl9kdXAoci0+cCkpID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwlpZiAoci0+cSAhPSBOVUxMKQorCQlyZXQtPmxlbmd0aCA9IEJOX251bV9iaXRzKHItPnEpOworCWlmIChyLT5nICE9IE5VTEwpCisJCWlmICgocmV0LT5nID0gQk5fZHVwKHItPmcpKSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJaWYgKHItPnB1Yl9rZXkgIT0gTlVMTCkKKwkJaWYgKChyZXQtPnB1Yl9rZXkgPSBCTl9kdXAoci0+cHViX2tleSkpID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwlpZiAoci0+cHJpdl9rZXkgIT0gTlVMTCkKKwkJaWYgKChyZXQtPnByaXZfa2V5ID0gQk5fZHVwKHItPnByaXZfa2V5KSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCisJcmV0dXJuIHJldDsKKworIGVycjoKKwlpZiAocmV0ICE9IE5VTEwpCisJCURIX2ZyZWUocmV0KTsKKwlyZXR1cm4gTlVMTDsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX2xvY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhjZmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfbG9jbC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisKK2ludCBkc2FfYnVpbHRpbl9wYXJhbWdlbihEU0EgKnJldCwgc2l6ZV90IGJpdHMsIHNpemVfdCBxYml0cywKKwljb25zdCBFVlBfTUQgKmV2cG1kLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzZWVkX2luLCBzaXplX3Qgc2VlZF9sZW4sCisJaW50ICpjb3VudGVyX3JldCwgdW5zaWduZWQgbG9uZyAqaF9yZXQsIEJOX0dFTkNCICpjYik7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9vc3NsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9vc3NsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlYWQwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX29zc2wuYwpAQCAtMCwwICsxLDQxNiBAQAorLyogY3J5cHRvL2RzYS9kc2Ffb3NzbC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIE9yaWdpbmFsIHZlcnNpb24gZnJvbSBTdGV2ZW4gU2Nob2NoIDxzY2hvY2hAc2hlYmEuYXJjLm5hc2EuZ292PiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKK3N0YXRpYyBEU0FfU0lHICpkc2FfZG9fc2lnbihjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGxlbiwgRFNBICpkc2EpOworc3RhdGljIGludCBkc2Ffc2lnbl9zZXR1cChEU0EgKmRzYSwgQk5fQ1RYICpjdHhfaW4sIEJJR05VTSAqKmtpbnZwLCBCSUdOVU0gKipycCk7CitzdGF0aWMgaW50IGRzYV9kb192ZXJpZnkoY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwgaW50IGRnc3RfbGVuLCBEU0FfU0lHICpzaWcsCisJCQkgRFNBICpkc2EpOworc3RhdGljIGludCBkc2FfaW5pdChEU0EgKmRzYSk7CitzdGF0aWMgaW50IGRzYV9maW5pc2goRFNBICpkc2EpOworCitzdGF0aWMgRFNBX01FVEhPRCBvcGVuc3NsX2RzYV9tZXRoID0geworIk9wZW5TU0wgRFNBIG1ldGhvZCIsCitkc2FfZG9fc2lnbiwKK2RzYV9zaWduX3NldHVwLAorZHNhX2RvX3ZlcmlmeSwKK05VTEwsIC8qIGRzYV9tb2RfZXhwLCAqLworTlVMTCwgLyogZHNhX2JuX21vZF9leHAsICovCitkc2FfaW5pdCwKK2RzYV9maW5pc2gsCiswLAorTlVMTCwKK05VTEwsCitOVUxMCit9OworCisvKiBUaGVzZSBtYWNybyB3cmFwcGVycyByZXBsYWNlIGF0dGVtcHRzIHRvIHVzZSB0aGUgZHNhX21vZF9leHAoKSBhbmQKKyAqIGJuX21vZF9leHAoKSBoYW5kbGVycyBpbiB0aGUgRFNBX01FVEhPRCBzdHJ1Y3R1cmUuIFdlIGF2b2lkIHRoZSBwcm9ibGVtIG9mCisgKiBoYXZpbmcgYSB0aGUgbWFjcm8gd29yayBhcyBhbiBleHByZXNzaW9uIGJ5IGJ1bmRsaW5nIGFuICJlcnJfaW5zdHIiLiBTbzsKKyAqIAorICogICAgIGlmICghZHNhLT5tZXRoLT5ibl9tb2RfZXhwKGRzYSwgcixkc2EtPmcsJmssZHNhLT5wLGN0eCwKKyAqICAgICAgICAgICAgICAgICBkc2EtPm1ldGhvZF9tb250X3ApKSBnb3RvIGVycjsKKyAqCisgKiBjYW4gYmUgcmVwbGFjZWQgYnk7CisgKgorICogICAgIERTQV9CTl9NT0RfRVhQKGdvdG8gZXJyLCBkc2EsIHIsIGRzYS0+ZywgJmssIGRzYS0+cCwgY3R4LAorICogICAgICAgICAgICAgICAgIGRzYS0+bWV0aG9kX21vbnRfcCk7CisgKi8KKworI2RlZmluZSBEU0FfTU9EX0VYUChlcnJfaW5zdHIsZHNhLHJyLGExLHAxLGEyLHAyLG0sY3R4LGluX21vbnQpIFwKKwlkbyB7IFwKKwlpbnQgX3RtcF9yZXM1MzsgXAorCWlmKChkc2EpLT5tZXRoLT5kc2FfbW9kX2V4cCkgXAorCQlfdG1wX3JlczUzID0gKGRzYSktPm1ldGgtPmRzYV9tb2RfZXhwKChkc2EpLCAocnIpLCAoYTEpLCAocDEpLCBcCisJCQkJKGEyKSwgKHAyKSwgKG0pLCAoY3R4KSwgKGluX21vbnQpKTsgXAorCWVsc2UgXAorCQlfdG1wX3JlczUzID0gQk5fbW9kX2V4cDJfbW9udCgocnIpLCAoYTEpLCAocDEpLCAoYTIpLCAocDIpLCBcCisJCQkJKG0pLCAoY3R4KSwgKGluX21vbnQpKTsgXAorCWlmKCFfdG1wX3JlczUzKSBlcnJfaW5zdHI7IFwKKwl9IHdoaWxlKDApCisjZGVmaW5lIERTQV9CTl9NT0RfRVhQKGVycl9pbnN0cixkc2EscixhLHAsbSxjdHgsbV9jdHgpIFwKKwlkbyB7IFwKKwlpbnQgX3RtcF9yZXM1MzsgXAorCWlmKChkc2EpLT5tZXRoLT5ibl9tb2RfZXhwKSBcCisJCV90bXBfcmVzNTMgPSAoZHNhKS0+bWV0aC0+Ym5fbW9kX2V4cCgoZHNhKSwgKHIpLCAoYSksIChwKSwgXAorCQkJCShtKSwgKGN0eCksIChtX2N0eCkpOyBcCisJZWxzZSBcCisJCV90bXBfcmVzNTMgPSBCTl9tb2RfZXhwX21vbnQoKHIpLCAoYSksIChwKSwgKG0pLCAoY3R4KSwgKG1fY3R4KSk7IFwKKwlpZighX3RtcF9yZXM1MykgZXJyX2luc3RyOyBcCisJfSB3aGlsZSgwKQorCitjb25zdCBEU0FfTUVUSE9EICpEU0FfT3BlblNTTCh2b2lkKQoreworCXJldHVybiAmb3BlbnNzbF9kc2FfbWV0aDsKK30KKworc3RhdGljIERTQV9TSUcgKmRzYV9kb19zaWduKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkbGVuLCBEU0EgKmRzYSkKKwl7CisJQklHTlVNICpraW52PU5VTEwsKnI9TlVMTCwqcz1OVUxMOworCUJJR05VTSBtOworCUJJR05VTSB4cjsKKwlCTl9DVFggKmN0eD1OVUxMOworCWludCByZWFzb249RVJSX1JfQk5fTElCOworCURTQV9TSUcgKnJldD1OVUxMOworCisJQk5faW5pdCgmbSk7CisJQk5faW5pdCgmeHIpOworCisJaWYgKCFkc2EtPnAgfHwgIWRzYS0+cSB8fCAhZHNhLT5nKQorCQl7CisJCXJlYXNvbj1EU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlM7CisJCWdvdG8gZXJyOworCQl9CisKKwlzPUJOX25ldygpOworCWlmIChzID09IE5VTEwpIGdvdG8gZXJyOworCisJLyogcmVqZWN0IGEgZXhjZXNzaXZlIGRpZ2VzdCBsZW5ndGggKGN1cnJlbnRseSBhdCBtb3N0CisJICogZHNhLXdpdGgtU0hBMjU2IGlzIHN1cHBvcnRlZCkgKi8KKwlpZiAoZGxlbiA+IFNIQTI1Nl9ESUdFU1RfTEVOR1RIKQorCQl7CisJCXJlYXNvbj1EU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkU7CisJCWdvdG8gZXJyOworCQl9CisKKwljdHg9Qk5fQ1RYX25ldygpOworCWlmIChjdHggPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoKGRzYS0+a2ludiA9PSBOVUxMKSB8fCAoZHNhLT5yID09IE5VTEwpKQorCQl7CisJCWlmICghRFNBX3NpZ25fc2V0dXAoZHNhLGN0eCwma2ludiwmcikpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWtpbnY9ZHNhLT5raW52OworCQlkc2EtPmtpbnY9TlVMTDsKKwkJcj1kc2EtPnI7CisJCWRzYS0+cj1OVUxMOworCQl9CisKKwkKKwlpZiAoZGxlbiA+IEJOX251bV9ieXRlcyhkc2EtPnEpKQorCQkvKiBpZiB0aGUgZGlnZXN0IGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgcSB1c2UgdGhlCisJCSAqIEJOX251bV9iaXRzKGRzYS0+cSkgbGVmdG1vc3QgYml0cyBvZiB0aGUgZGlnZXN0LCBzZWUKKwkJICogZmlwcyAxODYtMywgNC4yICovCisJCWRsZW4gPSBCTl9udW1fYnl0ZXMoZHNhLT5xKTsKKwlpZiAoQk5fYmluMmJuKGRnc3QsZGxlbiwmbSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwkvKiBDb21wdXRlICBzID0gaW52KGspIChtICsgeHIpIG1vZCBxICovCisJaWYgKCFCTl9tb2RfbXVsKCZ4cixkc2EtPnByaXZfa2V5LHIsZHNhLT5xLGN0eCkpIGdvdG8gZXJyOy8qIHMgPSB4ciAqLworCWlmICghQk5fYWRkKHMsICZ4ciwgJm0pKSBnb3RvIGVycjsJCS8qIHMgPSBtICsgeHIgKi8KKwlpZiAoQk5fY21wKHMsZHNhLT5xKSA+IDApCisJCUJOX3N1YihzLHMsZHNhLT5xKTsKKwlpZiAoIUJOX21vZF9tdWwocyxzLGtpbnYsZHNhLT5xLGN0eCkpIGdvdG8gZXJyOworCisJcmV0PURTQV9TSUdfbmV3KCk7CisJaWYgKHJldCA9PSBOVUxMKSBnb3RvIGVycjsKKwlyZXQtPnIgPSByOworCXJldC0+cyA9IHM7CisJCitlcnI6CisJaWYgKCFyZXQpCisJCXsKKwkJRFNBZXJyKERTQV9GX0RTQV9ET19TSUdOLHJlYXNvbik7CisJCUJOX2ZyZWUocik7CisJCUJOX2ZyZWUocyk7CisJCX0KKwlpZiAoY3R4ICE9IE5VTEwpIEJOX0NUWF9mcmVlKGN0eCk7CisJQk5fY2xlYXJfZnJlZSgmbSk7CisJQk5fY2xlYXJfZnJlZSgmeHIpOworCWlmIChraW52ICE9IE5VTEwpIC8qIGRzYS0+a2ludiBpcyBOVUxMIG5vdyBpZiB3ZSB1c2VkIGl0ICovCisJICAgIEJOX2NsZWFyX2ZyZWUoa2ludik7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGRzYV9zaWduX3NldHVwKERTQSAqZHNhLCBCTl9DVFggKmN0eF9pbiwgQklHTlVNICoqa2ludnAsIEJJR05VTSAqKnJwKQorCXsKKwlCTl9DVFggKmN0eDsKKwlCSUdOVU0gayxrcSwqSywqa2ludj1OVUxMLCpyPU5VTEw7CisJaW50IHJldD0wOworCisJaWYgKCFkc2EtPnAgfHwgIWRzYS0+cSB8fCAhZHNhLT5nKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfU0lHTl9TRVRVUCxEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworCQlyZXR1cm4gMDsKKwkJfQorCisJQk5faW5pdCgmayk7CisJQk5faW5pdCgma3EpOworCisJaWYgKGN0eF9pbiA9PSBOVUxMKQorCQl7CisJCWlmICgoY3R4PUJOX0NUWF9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCWN0eD1jdHhfaW47CisKKwlpZiAoKHI9Qk5fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJLyogR2V0IHJhbmRvbSBrICovCisJZG8KKwkJaWYgKCFCTl9yYW5kX3JhbmdlKCZrLCBkc2EtPnEpKSBnb3RvIGVycjsKKwl3aGlsZSAoQk5faXNfemVybygmaykpOworCWlmICgoZHNhLT5mbGFncyAmIERTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUpID09IDApCisJCXsKKwkJQk5fc2V0X2ZsYWdzKCZrLCBCTl9GTEdfQ09OU1RUSU1FKTsKKwkJfQorCisJaWYgKGRzYS0+ZmxhZ3MgJiBEU0FfRkxBR19DQUNIRV9NT05UX1ApCisJCXsKKwkJaWYgKCFCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCZkc2EtPm1ldGhvZF9tb250X3AsCisJCQkJCQlDUllQVE9fTE9DS19EU0EsCisJCQkJCQlkc2EtPnAsIGN0eCkpCisJCQlnb3RvIGVycjsKKwkJfQorCisJLyogQ29tcHV0ZSByID0gKGdeayBtb2QgcCkgbW9kIHEgKi8KKworCWlmICgoZHNhLT5mbGFncyAmIERTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUpID09IDApCisJCXsKKwkJaWYgKCFCTl9jb3B5KCZrcSwgJmspKSBnb3RvIGVycjsKKworCQkvKiBXZSBkbyBub3Qgd2FudCB0aW1pbmcgaW5mb3JtYXRpb24gdG8gbGVhayB0aGUgbGVuZ3RoIG9mIGssCisJCSAqIHNvIHdlIGNvbXB1dGUgZ15rIHVzaW5nIGFuIGVxdWl2YWxlbnQgZXhwb25lbnQgb2YgZml4ZWQgbGVuZ3RoLgorCQkgKgorCQkgKiAoVGhpcyBpcyBhIGtsdWRnZSB0aGF0IHdlIG5lZWQgYmVjYXVzZSB0aGUgQk5fbW9kX2V4cF9tb250KCkKKwkJICogZG9lcyBub3QgbGV0IHVzIHNwZWNpZnkgdGhlIGRlc2lyZWQgdGltaW5nIGJlaGF2aW91ci4pICovCisKKwkJaWYgKCFCTl9hZGQoJmtxLCAma3EsIGRzYS0+cSkpIGdvdG8gZXJyOworCQlpZiAoQk5fbnVtX2JpdHMoJmtxKSA8PSBCTl9udW1fYml0cyhkc2EtPnEpKQorCQkJeworCQkJaWYgKCFCTl9hZGQoJmtxLCAma3EsIGRzYS0+cSkpIGdvdG8gZXJyOworCQkJfQorCisJCUsgPSAma3E7CisJCX0KKwllbHNlCisJCXsKKwkJSyA9ICZrOworCQl9CisJRFNBX0JOX01PRF9FWFAoZ290byBlcnIsIGRzYSwgciwgZHNhLT5nLCBLLCBkc2EtPnAsIGN0eCwKKwkJCWRzYS0+bWV0aG9kX21vbnRfcCk7CisJaWYgKCFCTl9tb2QocixyLGRzYS0+cSxjdHgpKSBnb3RvIGVycjsKKworCS8qIENvbXB1dGUgIHBhcnQgb2YgJ3MgPSBpbnYoaykgKG0gKyB4cikgbW9kIHEnICovCisJaWYgKChraW52PUJOX21vZF9pbnZlcnNlKE5VTEwsJmssZHNhLT5xLGN0eCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKCpraW52cCAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKCpraW52cCk7CisJKmtpbnZwPWtpbnY7CisJa2ludj1OVUxMOworCWlmICgqcnAgIT0gTlVMTCkgQk5fY2xlYXJfZnJlZSgqcnApOworCSpycD1yOworCXJldD0xOworZXJyOgorCWlmICghcmV0KQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfU0lHTl9TRVRVUCxFUlJfUl9CTl9MSUIpOworCQlpZiAociAhPSBOVUxMKQorCQkJQk5fY2xlYXJfZnJlZShyKTsKKwkJfQorCWlmIChjdHhfaW4gPT0gTlVMTCkgQk5fQ1RYX2ZyZWUoY3R4KTsKKwlCTl9jbGVhcl9mcmVlKCZrKTsKKwlCTl9jbGVhcl9mcmVlKCZrcSk7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGRzYV9kb192ZXJpZnkoY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwgaW50IGRnc3RfbGVuLCBEU0FfU0lHICpzaWcsCisJCQkgRFNBICpkc2EpCisJeworCUJOX0NUWCAqY3R4OworCUJJR05VTSB1MSx1Mix0MTsKKwlCTl9NT05UX0NUWCAqbW9udD1OVUxMOworCWludCByZXQgPSAtMSwgaTsKKwlpZiAoIWRzYS0+cCB8fCAhZHNhLT5xIHx8ICFkc2EtPmcpCisJCXsKKwkJRFNBZXJyKERTQV9GX0RTQV9ET19WRVJJRlksRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwlpID0gQk5fbnVtX2JpdHMoZHNhLT5xKTsKKwkvKiBmaXBzIDE4Ni0zIGFsbG93cyBvbmx5IGRpZmZlcmVudCBzaXplcyBmb3IgcSAqLworCWlmIChpICE9IDE2MCAmJiBpICE9IDIyNCAmJiBpICE9IDI1NikKKwkJeworCQlEU0FlcnIoRFNBX0ZfRFNBX0RPX1ZFUklGWSxEU0FfUl9CQURfUV9WQUxVRSk7CisJCXJldHVybiAtMTsKKwkJfQorCisJaWYgKEJOX251bV9iaXRzKGRzYS0+cCkgPiBPUEVOU1NMX0RTQV9NQVhfTU9EVUxVU19CSVRTKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfRE9fVkVSSUZZLERTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwkvKiByZWplY3QgYSBleGNlc3NpdmUgZGlnZXN0IGxlbmd0aCAoY3VycmVudGx5IGF0IG1vc3QKKwkgKiBkc2Etd2l0aC1TSEEyNTYgaXMgc3VwcG9ydGVkKSAqLworCWlmIChkZ3N0X2xlbiA+IFNIQTI1Nl9ESUdFU1RfTEVOR1RIKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfRE9fVkVSSUZZLERTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisJCXJldHVybiAtMTsKKwkJfQorCisJQk5faW5pdCgmdTEpOworCUJOX2luaXQoJnUyKTsKKwlCTl9pbml0KCZ0MSk7CisKKwlpZiAoKGN0eD1CTl9DVFhfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKEJOX2lzX3plcm8oc2lnLT5yKSB8fCBCTl9pc19uZWdhdGl2ZShzaWctPnIpIHx8CisJICAgIEJOX3VjbXAoc2lnLT5yLCBkc2EtPnEpID49IDApCisJCXsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoQk5faXNfemVybyhzaWctPnMpIHx8IEJOX2lzX25lZ2F0aXZlKHNpZy0+cykgfHwKKwkgICAgQk5fdWNtcChzaWctPnMsIGRzYS0+cSkgPj0gMCkKKwkJeworCQlyZXQgPSAwOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogQ2FsY3VsYXRlIFcgPSBpbnYoUykgbW9kIFEKKwkgKiBzYXZlIFcgaW4gdTIgKi8KKwlpZiAoKEJOX21vZF9pbnZlcnNlKCZ1MixzaWctPnMsZHNhLT5xLGN0eCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJLyogc2F2ZSBNIGluIHUxICovCisJaWYgKGRnc3RfbGVuID4gKGkgPj4gMykpCisJCS8qIGlmIHRoZSBkaWdlc3QgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiBxIHVzZSB0aGUKKwkJICogQk5fbnVtX2JpdHMoZHNhLT5xKSBsZWZ0bW9zdCBiaXRzIG9mIHRoZSBkaWdlc3QsIHNlZQorCQkgKiBmaXBzIDE4Ni0zLCA0LjIgKi8KKwkJZGdzdF9sZW4gPSAoaSA+PiAzKTsKKwlpZiAoQk5fYmluMmJuKGRnc3QsZGdzdF9sZW4sJnUxKSA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIHUxID0gTSAqIHcgbW9kIHEgKi8KKwlpZiAoIUJOX21vZF9tdWwoJnUxLCZ1MSwmdTIsZHNhLT5xLGN0eCkpIGdvdG8gZXJyOworCisJLyogdTIgPSByICogdyBtb2QgcSAqLworCWlmICghQk5fbW9kX211bCgmdTIsc2lnLT5yLCZ1Mixkc2EtPnEsY3R4KSkgZ290byBlcnI7CisKKworCWlmIChkc2EtPmZsYWdzICYgRFNBX0ZMQUdfQ0FDSEVfTU9OVF9QKQorCQl7CisJCW1vbnQgPSBCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCZkc2EtPm1ldGhvZF9tb250X3AsCisJCQkJCUNSWVBUT19MT0NLX0RTQSwgZHNhLT5wLCBjdHgpOworCQlpZiAoIW1vbnQpCisJCQlnb3RvIGVycjsKKwkJfQorCisKKwlEU0FfTU9EX0VYUChnb3RvIGVyciwgZHNhLCAmdDEsIGRzYS0+ZywgJnUxLCBkc2EtPnB1Yl9rZXksICZ1MiwgZHNhLT5wLCBjdHgsIG1vbnQpOworCS8qIEJOX2NvcHkoJnUxLCZ0MSk7ICovCisJLyogbGV0IHUxID0gdTEgbW9kIHEgKi8KKwlpZiAoIUJOX21vZCgmdTEsJnQxLGRzYS0+cSxjdHgpKSBnb3RvIGVycjsKKworCS8qIFYgaXMgbm93IGluIHUxLiAgSWYgdGhlIHNpZ25hdHVyZSBpcyBjb3JyZWN0LCBpdCB3aWxsIGJlCisJICogZXF1YWwgdG8gUi4gKi8KKwlyZXQ9KEJOX3VjbXAoJnUxLCBzaWctPnIpID09IDApOworCisJZXJyOgorCS8qIFhYWDogc3VyZWx5IHRoaXMgaXMgd3JvbmcgLSBpZiByZXQgaXMgMCwgaXQganVzdCBkaWRuJ3QgdmVyaWZ5OworCSAgIHRoZXJlIGlzIG5vIGVycm9yIGluIEJOLiBUZXN0IHNob3VsZCBiZSByZXQgPT0gLTEgKEJlbikgKi8KKwlpZiAocmV0ICE9IDEpIERTQWVycihEU0FfRl9EU0FfRE9fVkVSSUZZLEVSUl9SX0JOX0xJQik7CisJaWYgKGN0eCAhPSBOVUxMKSBCTl9DVFhfZnJlZShjdHgpOworCUJOX2ZyZWUoJnUxKTsKKwlCTl9mcmVlKCZ1Mik7CisJQk5fZnJlZSgmdDEpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBkc2FfaW5pdChEU0EgKmRzYSkKK3sKKwlkc2EtPmZsYWdzfD1EU0FfRkxBR19DQUNIRV9NT05UX1A7CisJcmV0dXJuKDEpOworfQorCitzdGF0aWMgaW50IGRzYV9maW5pc2goRFNBICpkc2EpCit7CisJaWYoZHNhLT5tZXRob2RfbW9udF9wKQorCQlCTl9NT05UX0NUWF9mcmVlKGRzYS0+bWV0aG9kX21vbnRfcCk7CisJcmV0dXJuKDEpOworfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9wbWV0aC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfcG1ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2U5MWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfcG1ldGguYwpAQCAtMCwwICsxLDMxNSBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKyNpbmNsdWRlICJkc2FfbG9jbC5oIgorCisvKiBEU0EgcGtleSBjb250ZXh0IHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwkvKiBQYXJhbWV0ZXIgZ2VuIHBhcmFtZXRlcnMgKi8KKwlpbnQgbmJpdHM7CQkvKiBzaXplIG9mIHAgaW4gYml0cyAoZGVmYXVsdDogMTAyNCkgKi8KKwlpbnQgcWJpdHM7CQkvKiBzaXplIG9mIHEgaW4gYml0cyAoZGVmYXVsdDogMTYwKSAgKi8KKwljb25zdCBFVlBfTUQgKnBtZDsJLyogTUQgZm9yIHBhcmFtZXRlciBnZW5lcmF0aW9uICovCisJLyogS2V5Z2VuIGNhbGxiYWNrIGluZm8gKi8KKwlpbnQgZ2VudG1wWzJdOworCS8qIG1lc3NhZ2UgZGlnZXN0ICovCisJY29uc3QgRVZQX01EICptZDsJLyogTUQgZm9yIHRoZSBzaWduYXR1cmUgKi8KKwl9IERTQV9QS0VZX0NUWDsKKworc3RhdGljIGludCBwa2V5X2RzYV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlEU0FfUEtFWV9DVFggKmRjdHg7CisJZGN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihEU0FfUEtFWV9DVFgpKTsKKwlpZiAoIWRjdHgpCisJCXJldHVybiAwOworCWRjdHgtPm5iaXRzID0gMTAyNDsKKwlkY3R4LT5xYml0cyA9IDE2MDsKKwlkY3R4LT5wbWQgPSBOVUxMOworCWRjdHgtPm1kID0gTlVMTDsKKworCWN0eC0+ZGF0YSA9IGRjdHg7CisJY3R4LT5rZXlnZW5faW5mbyA9IGRjdHgtPmdlbnRtcDsKKwljdHgtPmtleWdlbl9pbmZvX2NvdW50ID0gMjsKKwkKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9kc2FfY29weShFVlBfUEtFWV9DVFggKmRzdCwgRVZQX1BLRVlfQ1RYICpzcmMpCisJeworCURTQV9QS0VZX0NUWCAqZGN0eCwgKnNjdHg7CisJaWYgKCFwa2V5X2RzYV9pbml0KGRzdCkpCisJCXJldHVybiAwOworICAgICAgIAlzY3R4ID0gc3JjLT5kYXRhOworCWRjdHggPSBkc3QtPmRhdGE7CisJZGN0eC0+bmJpdHMgPSBzY3R4LT5uYml0czsKKwlkY3R4LT5xYml0cyA9IHNjdHgtPnFiaXRzOworCWRjdHgtPnBtZCA9IHNjdHgtPnBtZDsKKwlkY3R4LT5tZCAgPSBzY3R4LT5tZDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyB2b2lkIHBrZXlfZHNhX2NsZWFudXAoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCURTQV9QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKwlpZiAoZGN0eCkKKwkJT1BFTlNTTF9mcmVlKGRjdHgpOworCX0KKworc3RhdGljIGludCBwa2V5X2RzYV9zaWduKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCAqc2lnbGVuLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pCisJeworCWludCByZXQsIHR5cGU7CisJdW5zaWduZWQgaW50IHNsdG1wOworCURTQV9QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKwlEU0EgKmRzYSA9IGN0eC0+cGtleS0+cGtleS5kc2E7CisKKwlpZiAoZGN0eC0+bWQpCisJCXR5cGUgPSBFVlBfTURfdHlwZShkY3R4LT5tZCk7CisJZWxzZQorCQl0eXBlID0gTklEX3NoYTE7CisKKwlyZXQgPSBEU0Ffc2lnbih0eXBlLCB0YnMsIHRic2xlbiwgc2lnLCAmc2x0bXAsIGRzYSk7CisKKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQ7CisJKnNpZ2xlbiA9IHNsdG1wOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBwa2V5X2RzYV92ZXJpZnkoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJzLCBzaXplX3QgdGJzbGVuKQorCXsKKwlpbnQgcmV0LCB0eXBlOworCURTQV9QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKwlEU0EgKmRzYSA9IGN0eC0+cGtleS0+cGtleS5kc2E7CisKKwlpZiAoZGN0eC0+bWQpCisJCXR5cGUgPSBFVlBfTURfdHlwZShkY3R4LT5tZCk7CisJZWxzZQorCQl0eXBlID0gTklEX3NoYTE7CisKKwlyZXQgPSBEU0FfdmVyaWZ5KHR5cGUsIHRicywgdGJzbGVuLCBzaWcsIHNpZ2xlbiwgZHNhKTsKKworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgaW50IHBrZXlfZHNhX2N0cmwoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKQorCXsKKwlEU0FfUEtFWV9DVFggKmRjdHggPSBjdHgtPmRhdGE7CisJc3dpdGNoICh0eXBlKQorCQl7CisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9EU0FfUEFSQU1HRU5fQklUUzoKKwkJaWYgKHAxIDwgMjU2KQorCQkJcmV0dXJuIC0yOworCQlkY3R4LT5uYml0cyA9IHAxOworCQlyZXR1cm4gMTsKKworCQljYXNlIEVWUF9QS0VZX0NUUkxfRFNBX1BBUkFNR0VOX1FfQklUUzoKKwkJaWYgKHAxICE9IDE2MCAmJiBwMSAhPSAyMjQgJiYgcDEgJiYgcDEgIT0gMjU2KQorCQkJcmV0dXJuIC0yOworCQlkY3R4LT5xYml0cyA9IHAxOworCQlyZXR1cm4gMTsKKworCQljYXNlIEVWUF9QS0VZX0NUUkxfRFNBX1BBUkFNR0VOX01EOgorCQlpZiAoRVZQX01EX3R5cGUoKGNvbnN0IEVWUF9NRCAqKXAyKSAhPSBOSURfc2hhMSAgICYmCisJCSAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGEyMjQgJiYKKwkJICAgIEVWUF9NRF90eXBlKChjb25zdCBFVlBfTUQgKilwMikgIT0gTklEX3NoYTI1NikKKwkJCXsKKwkJCURTQWVycihEU0FfRl9QS0VZX0RTQV9DVFJMLCBEU0FfUl9JTlZBTElEX0RJR0VTVF9UWVBFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlkY3R4LT5tZCA9IHAyOworCQlyZXR1cm4gMTsKKworCQljYXNlIEVWUF9QS0VZX0NUUkxfTUQ6CisJCWlmIChFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGExICAgJiYKKwkJICAgIEVWUF9NRF90eXBlKChjb25zdCBFVlBfTUQgKilwMikgIT0gTklEX2RzYSAgICAmJgorCQkgICAgRVZQX01EX3R5cGUoKGNvbnN0IEVWUF9NRCAqKXAyKSAhPSBOSURfc2hhMjI0ICYmCisJCSAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGEyNTYpCisJCQl7CisJCQlEU0FlcnIoRFNBX0ZfUEtFWV9EU0FfQ1RSTCwgRFNBX1JfSU5WQUxJRF9ESUdFU1RfVFlQRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZGN0eC0+bWQgPSBwMjsKKwkJcmV0dXJuIDE7CisKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX0RJR0VTVElOSVQ6CisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9QS0NTN19TSUdOOgorCQljYXNlIEVWUF9QS0VZX0NUUkxfQ01TX1NJR046CisJCXJldHVybiAxOworCQkKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX1BFRVJfS0VZOgorCQkJRFNBZXJyKERTQV9GX1BLRVlfRFNBX0NUUkwsCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJCXJldHVybiAtMjsJCisJCWRlZmF1bHQ6CisJCXJldHVybiAtMjsKKworCQl9CisJfQorCQkJCitzdGF0aWMgaW50IHBrZXlfZHNhX2N0cmxfc3RyKEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpCisJeworCWlmICghc3RyY21wKHR5cGUsICJkc2FfcGFyYW1nZW5fYml0cyIpKQorCQl7CisJCWludCBuYml0czsKKwkJbmJpdHMgPSBhdG9pKHZhbHVlKTsKKwkJcmV0dXJuIEVWUF9QS0VZX0NUWF9zZXRfZHNhX3BhcmFtZ2VuX2JpdHMoY3R4LCBuYml0cyk7CisJCX0KKwlpZiAoIXN0cmNtcCh0eXBlLCAiZHNhX3BhcmFtZ2VuX3FfYml0cyIpKQorCQl7CisJCWludCBxYml0cyA9IGF0b2kodmFsdWUpOworCQlyZXR1cm4gRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCBFVlBfUEtFWV9EU0EsIEVWUF9QS0VZX09QX1BBUkFNR0VOLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgRVZQX1BLRVlfQ1RSTF9EU0FfUEFSQU1HRU5fUV9CSVRTLCBxYml0cywgTlVMTCk7CisJCX0KKwlpZiAoIXN0cmNtcCh0eXBlLCAiZHNhX3BhcmFtZ2VuX21kIikpCisJCXsKKwkJcmV0dXJuIEVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfRFNBLCBFVlBfUEtFWV9PUF9QQVJBTUdFTiwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgIEVWUF9QS0VZX0NUUkxfRFNBX1BBUkFNR0VOX01ELCAwLCAKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopRVZQX2dldF9kaWdlc3RieW5hbWUodmFsdWUpKTsKKwkJfQorCXJldHVybiAtMjsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9kc2FfcGFyYW1nZW4oRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlEU0EgKmRzYSA9IE5VTEw7CisJRFNBX1BLRVlfQ1RYICpkY3R4ID0gY3R4LT5kYXRhOworCUJOX0dFTkNCICpwY2IsIGNiOworCWludCByZXQ7CisJaWYgKGN0eC0+cGtleV9nZW5jYikKKwkJeworCQlwY2IgPSAmY2I7CisJCWV2cF9wa2V5X3NldF9jYl90cmFuc2xhdGUocGNiLCBjdHgpOworCQl9CisJZWxzZQorCQlwY2IgPSBOVUxMOworCWRzYSA9IERTQV9uZXcoKTsKKwlpZiAoIWRzYSkKKwkJcmV0dXJuIDA7CisJcmV0ID0gZHNhX2J1aWx0aW5fcGFyYW1nZW4oZHNhLCBkY3R4LT5uYml0cywgZGN0eC0+cWJpdHMsIGRjdHgtPnBtZCwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMLCBwY2IpOworCWlmIChyZXQpCisJCUVWUF9QS0VZX2Fzc2lnbl9EU0EocGtleSwgZHNhKTsKKwllbHNlCisJCURTQV9mcmVlKGRzYSk7CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9kc2Ffa2V5Z2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSkKKwl7CisJRFNBICpkc2EgPSBOVUxMOworCWlmIChjdHgtPnBrZXkgPT0gTlVMTCkKKwkJeworCQlEU0FlcnIoRFNBX0ZfUEtFWV9EU0FfS0VZR0VOLCBEU0FfUl9OT19QQVJBTUVURVJTX1NFVCk7CisJCXJldHVybiAwOworCQl9CisJZHNhID0gRFNBX25ldygpOworCWlmICghZHNhKQorCQlyZXR1cm4gMDsKKwlFVlBfUEtFWV9hc3NpZ25fRFNBKHBrZXksIGRzYSk7CisJLyogTm90ZTogaWYgZXJyb3IgcmV0dXJuLCBwa2V5IGlzIGZyZWVkIGJ5IHBhcmVudCByb3V0aW5lICovCisJaWYgKCFFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMocGtleSwgY3R4LT5wa2V5KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIERTQV9nZW5lcmF0ZV9rZXkocGtleS0+cGtleS5kc2EpOworCX0KKworY29uc3QgRVZQX1BLRVlfTUVUSE9EIGRzYV9wa2V5X21ldGggPSAKKwl7CisJRVZQX1BLRVlfRFNBLAorCUVWUF9QS0VZX0ZMQUdfQVVUT0FSR0xFTiwKKwlwa2V5X2RzYV9pbml0LAorCXBrZXlfZHNhX2NvcHksCisJcGtleV9kc2FfY2xlYW51cCwKKworCTAsCisJcGtleV9kc2FfcGFyYW1nZW4sCisKKwkwLAorCXBrZXlfZHNhX2tleWdlbiwKKworCTAsCisJcGtleV9kc2Ffc2lnbiwKKworCTAsCisJcGtleV9kc2FfdmVyaWZ5LAorCisJMCwwLAorCisJMCwwLDAsMCwKKworCTAsMCwKKworCTAsMCwKKworCTAsMCwKKworCXBrZXlfZHNhX2N0cmwsCisJcGtleV9kc2FfY3RybF9zdHIKKworCisJfTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX3Bybi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfcHJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyOWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX3Bybi5jCkBAIC0wLDAgKzEsMTIxIEBACisvKiBjcnlwdG8vZHNhL2RzYV9wcm4uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBEU0FfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IERTQSAqeCwgaW50IG9mZikKKwl7CisJQklPICpiOworCWludCByZXQ7CisKKwlpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FfUFJJTlRfRlAsRVJSX1JfQlVGX0xJQik7CisJCXJldHVybigwKTsKKwkJfQorCUJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisJcmV0PURTQV9wcmludChiLHgsb2ZmKTsKKwlCSU9fZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBEU0FwYXJhbXNfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IERTQSAqeCkKKwl7CisJQklPICpiOworCWludCByZXQ7CisKKwlpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCURTQWVycihEU0FfRl9EU0FQQVJBTVNfUFJJTlRfRlAsRVJSX1JfQlVGX0xJQik7CisJCXJldHVybigwKTsKKwkJfQorCUJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisJcmV0PURTQXBhcmFtc19wcmludChiLCB4KTsKKwlCSU9fZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYKKworaW50IERTQV9wcmludChCSU8gKmJwLCBjb25zdCBEU0EgKngsIGludCBvZmYpCisJeworCUVWUF9QS0VZICpwazsKKwlpbnQgcmV0OworCXBrID0gRVZQX1BLRVlfbmV3KCk7CisJaWYgKCFwayB8fCAhRVZQX1BLRVlfc2V0MV9EU0EocGssIChEU0EgKil4KSkKKwkJcmV0dXJuIDA7CisJcmV0ID0gRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZShicCwgcGssIG9mZiwgTlVMTCk7CisJRVZQX1BLRVlfZnJlZShwayk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBEU0FwYXJhbXNfcHJpbnQoQklPICpicCwgY29uc3QgRFNBICp4KQorCXsKKwlFVlBfUEtFWSAqcGs7CisJaW50IHJldDsKKwlwayA9IEVWUF9QS0VZX25ldygpOworCWlmICghcGsgfHwgIUVWUF9QS0VZX3NldDFfRFNBKHBrLCAoRFNBICopeCkpCisJCXJldHVybiAwOworCXJldCA9IEVWUF9QS0VZX3ByaW50X3BhcmFtcyhicCwgcGssIDQsIE5VTEwpOworCUVWUF9QS0VZX2ZyZWUocGspOworCXJldHVybiByZXQ7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9zaWduLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYV9zaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1NTVlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX3NpZ24uYwpAQCAtMCwwICsxLDkwIEBACisvKiBjcnlwdG8vZHNhL2RzYV9zaWduLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogT3JpZ2luYWwgdmVyc2lvbiBmcm9tIFN0ZXZlbiBTY2hvY2ggPHNjaG9jaEBzaGViYS5hcmMubmFzYS5nb3Y+ICovCisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK0RTQV9TSUcgKiBEU0FfZG9fc2lnbihjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGxlbiwgRFNBICpkc2EpCisJeworCXJldHVybiBkc2EtPm1ldGgtPmRzYV9kb19zaWduKGRnc3QsIGRsZW4sIGRzYSk7CisJfQorCitpbnQgRFNBX3NpZ24oaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkbGVuLCB1bnNpZ25lZCBjaGFyICpzaWcsCisJICAgICB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgRFNBICpkc2EpCisJeworCURTQV9TSUcgKnM7CisJUkFORF9zZWVkKGRnc3QsIGRsZW4pOworCXM9RFNBX2RvX3NpZ24oZGdzdCxkbGVuLGRzYSk7CisJaWYgKHMgPT0gTlVMTCkKKwkJeworCQkqc2lnbGVuPTA7CisJCXJldHVybigwKTsKKwkJfQorCSpzaWdsZW49aTJkX0RTQV9TSUcocywmc2lnKTsKKwlEU0FfU0lHX2ZyZWUocyk7CisJcmV0dXJuKDEpOworCX0KKworaW50IERTQV9zaWduX3NldHVwKERTQSAqZHNhLCBCTl9DVFggKmN0eF9pbiwgQklHTlVNICoqa2ludnAsIEJJR05VTSAqKnJwKQorCXsKKwlyZXR1cm4gZHNhLT5tZXRoLT5kc2Ffc2lnbl9zZXR1cChkc2EsIGN0eF9pbiwga2ludnAsIHJwKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX3ZyZi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FfdnJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2YTc1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhX3ZyZi5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIGNyeXB0by9kc2EvZHNhX3ZyZi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIE9yaWdpbmFsIHZlcnNpb24gZnJvbSBTdGV2ZW4gU2Nob2NoIDxzY2hvY2hAc2hlYmEuYXJjLm5hc2EuZ292PiAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorCitpbnQgRFNBX2RvX3ZlcmlmeShjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sIERTQV9TSUcgKnNpZywKKwkJICBEU0EgKmRzYSkKKwl7CisJcmV0dXJuIGRzYS0+bWV0aC0+ZHNhX2RvX3ZlcmlmeShkZ3N0LCBkZ3N0X2xlbiwgc2lnLCBkc2EpOworCX0KKworLyogZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGhhc2hlZCAocHJvYmFibHkgd2l0aCBTSEEgb3IgU0hBLTEpLiAqLworLyogcmV0dXJucworICogICAgICAxOiBjb3JyZWN0IHNpZ25hdHVyZQorICogICAgICAwOiBpbmNvcnJlY3Qgc2lnbmF0dXJlCisgKiAgICAgLTE6IGVycm9yCisgKi8KK2ludCBEU0FfdmVyaWZ5KGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWdidWYsIGludCBzaWdsZW4sIERTQSAqZHNhKQorCXsKKwlEU0FfU0lHICpzOworCWludCByZXQ9LTE7CisKKwlzID0gRFNBX1NJR19uZXcoKTsKKwlpZiAocyA9PSBOVUxMKSByZXR1cm4ocmV0KTsKKwlpZiAoZDJpX0RTQV9TSUcoJnMsJnNpZ2J1ZixzaWdsZW4pID09IE5VTEwpIGdvdG8gZXJyOworCXJldD1EU0FfZG9fdmVyaWZ5KGRnc3QsZGdzdF9sZW4scyxkc2EpOworZXJyOgorCURTQV9TSUdfZnJlZShzKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNhL2RzYWdlbi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjZhMWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2FnZW4uYwpAQCAtMCwwICsxLDExMSBAQAorLyogY3J5cHRvL2RzYS9kc2FnZW4uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorCisjZGVmaW5lIFRFU1QKKyNkZWZpbmUgR0VOVUlORV9EU0EKKworI2lmZGVmIEdFTlVJTkVfRFNBCisjZGVmaW5lIExBU1RfVkFMVUUgMHhiZAorI2Vsc2UKKyNkZWZpbmUgTEFTVF9WQUxVRSAweGQzCisjZW5kaWYKKworI2lmZGVmIFRFU1QKK3Vuc2lnbmVkIGNoYXIgc2VlZFsyMF09eworCTB4ZDUsMHgwMSwweDRlLDB4NGIsCisJMHg2MCwweGVmLDB4MmIsMHhhOCwKKwkweGI2LDB4MjEsMHgxYiwweDQwLAorCTB4NjIsMHhiYSwweDMyLDB4MjQsCisJMHhlMCwweDQyLDB4N2QsTEFTVF9WQUxVRX07CisjZW5kaWYKKworaW50IGNiKGludCBwLCBpbnQgbikKKwl7CisJY2hhciBjPScqJzsKKworCWlmIChwID09IDApIGM9Jy4nOworCWlmIChwID09IDEpIGM9JysnOworCWlmIChwID09IDIpIGM9JyonOworCWlmIChwID09IDMpIGM9J1xuJzsKKwlwcmludGYoIiVjIixjKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwl9CisKK21haW4oKQorCXsKKwlpbnQgaTsKKwlCSUdOVU0gKm47CisJQk5fQ1RYICpjdHg7CisJdW5zaWduZWQgY2hhciBzZWVkX2J1ZlsyMF07CisJRFNBICpkc2E7CisJaW50IGNvdW50ZXIsaDsKKwlCSU8gKmJpb19lcnI9TlVMTDsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWJpb19lcnI9QklPX25ld19mcChzdGRlcnIsQklPX05PQ0xPU0UpOworCisJbWVtY3B5KHNlZWRfYnVmLHNlZWQsMjApOworCWRzYT1EU0FfZ2VuZXJhdGVfcGFyYW1ldGVycygxMDI0LHNlZWQsMjAsJmNvdW50ZXIsJmgsY2IsYmlvX2Vycik7CisKKwlpZiAoZHNhID09IE5VTEwpCisJCURTQV9wcmludChiaW9fZXJyLGRzYSwwKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhdGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9kc2F0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRmZmQyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZHNhdGVzdC5jCkBAIC0wLDAgKzEsMjU5IEBACisvKiBjcnlwdG8vZHNhL2RzYXRlc3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBVbnRpbCB0aGUga2V5LWdlbiBjYWxsYmFja3MgYXJlIG1vZGlmaWVkIHRvIHVzZSBuZXdlciBwcm90b3R5cGVzLCB3ZSBhbGxvdworICogZGVwcmVjYXRlZCBmdW5jdGlvbnMgZm9yIG9wZW5zc2wtaW50ZXJuYWwgY29kZSAqLworI2lmZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI3VuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICIuLi9lX29zLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX0RTQQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwcmludGYoIk5vIERTQSBzdXBwb3J0XG4iKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZWxzZQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4xNgorI2RlZmluZSBNU19DQUxMQkFDSyAgICAgX2ZhciBfbG9hZGRzCisjZWxzZQorI2RlZmluZSBNU19DQUxMQkFDSworI2VuZGlmCisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZHNhX2NiKGludCBwLCBpbnQgbiwgQk5fR0VOQ0IgKmFyZyk7CisKKy8qIHNlZWQsIG91dF9wLCBvdXRfcSwgb3V0X2cgYXJlIHRha2VuIGZyb20gdGhlIHVwZGF0ZWQgQXBwZW5kaXggNSB0bworICogRklQUyBQVUIgMTg2IGFuZCBhbHNvIGFwcGVhciBpbiBBcHBlbmRpeCA1IHRvIEZJUFMgUElCIDE4Ni0xICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzZWVkWzIwXT17CisJMHhkNSwweDAxLDB4NGUsMHg0YiwweDYwLDB4ZWYsMHgyYiwweGE4LDB4YjYsMHgyMSwweDFiLDB4NDAsCisJMHg2MiwweGJhLDB4MzIsMHgyNCwweGUwLDB4NDIsMHg3ZCwweGQzLAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG91dF9wW109eworCTB4OGQsMHhmMiwweGE0LDB4OTQsMHg0OSwweDIyLDB4NzYsMHhhYSwKKwkweDNkLDB4MjUsMHg3NSwweDliLDB4YjAsMHg2OCwweDY5LDB4Y2IsCisJMHhlYSwweGMwLDB4ZDgsMHgzYSwweGZiLDB4OGQsMHgwYywweGY3LAorCTB4Y2IsMHhiOCwweDMyLDB4NGYsMHgwZCwweDc4LDB4ODIsMHhlNSwKKwkweGQwLDB4NzYsMHgyZiwweGM1LDB4YjcsMHgyMSwweDBlLDB4YWYsCisJMHhjMiwweGU5LDB4YWQsMHhhYywweDMyLDB4YWIsMHg3YSwweGFjLAorCTB4NDksMHg2OSwweDNkLDB4ZmIsMHhmOCwweDM3LDB4MjQsMHhjMiwKKwkweGVjLDB4MDcsMHgzNiwweGVlLDB4MzEsMHhjOCwweDAyLDB4OTEsCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgb3V0X3FbXT17CisJMHhjNywweDczLDB4MjEsMHg4YywweDczLDB4N2UsMHhjOCwweGVlLAorCTB4OTksMHgzYiwweDRmLDB4MmQsMHhlZCwweDMwLDB4ZjQsMHg4ZSwKKwkweGRhLDB4Y2UsMHg5MSwweDVmLAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG91dF9nW109eworCTB4NjIsMHg2ZCwweDAyLDB4NzgsMHgzOSwweGVhLDB4MGEsMHgxMywKKwkweDQxLDB4MzEsMHg2MywweGE1LDB4NWIsMHg0YywweGI1LDB4MDAsCisJMHgyOSwweDlkLDB4NTUsMHgyMiwweDk1LDB4NmMsMHhlZiwweGNiLAorCTB4M2IsMHhmZiwweDEwLDB4ZjMsMHg5OSwweGNlLDB4MmMsMHgyZSwKKwkweDcxLDB4Y2IsMHg5ZCwweGU1LDB4ZmEsMHgyNCwweGJhLDB4YmYsCisJMHg1OCwweGU1LDB4YjcsMHg5NSwweDIxLDB4OTIsMHg1YywweDljLAorCTB4YzQsMHgyZSwweDlmLDB4NmYsMHg0NiwweDRiLDB4MDgsMHg4YywKKwkweGM1LDB4NzIsMHhhZiwweDUzLDB4ZTYsMHhkNywweDg4LDB4MDIsCisJfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3RyMVtdPSIxMjM0NTY3ODkwMTIzNDU2Nzg5MCI7CisKK3N0YXRpYyBjb25zdCBjaGFyIHJuZF9zZWVkW10gPSAic3RyaW5nIHRvIG1ha2UgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRoaW5rIGl0IGhhcyBlbnRyb3B5IjsKKworc3RhdGljIEJJTyAqYmlvX2Vycj1OVUxMOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCUJOX0dFTkNCIGNiOworCURTQSAqZHNhPU5VTEw7CisJaW50IGNvdW50ZXIscmV0PTAsaSxqOworCXVuc2lnbmVkIGNoYXIgYnVmWzI1Nl07CisJdW5zaWduZWQgbG9uZyBoOworCXVuc2lnbmVkIGNoYXIgc2lnWzI1Nl07CisJdW5zaWduZWQgaW50IHNpZ2xlbjsKKworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWJpb19lcnI9QklPX25ld19mcChzdGRlcnIsQklPX05PQ0xPU0UpOworCisJQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCk7CisJQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyhWX0NSWVBUT19NREVCVUdfQUxMKTsKKwlDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PTik7CisKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCVJBTkRfc2VlZChybmRfc2VlZCwgc2l6ZW9mIHJuZF9zZWVkKTsKKworCUJJT19wcmludGYoYmlvX2VyciwidGVzdCBnZW5lcmF0aW9uIG9mIERTQSBwYXJhbWV0ZXJzXG4iKTsKKworCUJOX0dFTkNCX3NldCgmY2IsIGRzYV9jYiwgYmlvX2Vycik7CisJaWYoKChkc2EgPSBEU0FfbmV3KCkpID09IE5VTEwpIHx8ICFEU0FfZ2VuZXJhdGVfcGFyYW1ldGVyc19leChkc2EsIDUxMiwKKwkJCQlzZWVkLCAyMCwgJmNvdW50ZXIsICZoLCAmY2IpKQorCQlnb3RvIGVuZDsKKworCUJJT19wcmludGYoYmlvX2Vyciwic2VlZFxuIik7CisJZm9yIChpPTA7IGk8MjA7IGkrPTQpCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCIlMDJYJTAyWCUwMlglMDJYICIsCisJCQlzZWVkW2ldLHNlZWRbaSsxXSxzZWVkW2krMl0sc2VlZFtpKzNdKTsKKwkJfQorCUJJT19wcmludGYoYmlvX2VyciwiXG5jb3VudGVyPSVkIGg9JWxkXG4iLGNvdW50ZXIsaCk7CisJCQorCURTQV9wcmludChiaW9fZXJyLGRzYSwwKTsKKwlpZiAoY291bnRlciAhPSAxMDUpIAorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiY291bnRlciBzaG91bGQgYmUgMTA1XG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAoaCAhPSAyKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiaCBzaG91bGQgYmUgMlxuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpPUJOX2JuMmJpbihkc2EtPnEsYnVmKTsKKwlqPXNpemVvZihvdXRfcSk7CisJaWYgKChpICE9IGopIHx8IChtZW1jbXAoYnVmLG91dF9xLGkpICE9IDApKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwicSB2YWx1ZSBpcyB3cm9uZ1xuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpPUJOX2JuMmJpbihkc2EtPnAsYnVmKTsKKwlqPXNpemVvZihvdXRfcCk7CisJaWYgKChpICE9IGopIHx8IChtZW1jbXAoYnVmLG91dF9wLGkpICE9IDApKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwicCB2YWx1ZSBpcyB3cm9uZ1xuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpPUJOX2JuMmJpbihkc2EtPmcsYnVmKTsKKwlqPXNpemVvZihvdXRfZyk7CisJaWYgKChpICE9IGopIHx8IChtZW1jbXAoYnVmLG91dF9nLGkpICE9IDApKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiZyB2YWx1ZSBpcyB3cm9uZ1xuIik7CisJCWdvdG8gZW5kOworCQl9CisKKwlkc2EtPmZsYWdzIHw9IERTQV9GTEFHX05PX0VYUF9DT05TVFRJTUU7CisJRFNBX2dlbmVyYXRlX2tleShkc2EpOworCURTQV9zaWduKDAsIHN0cjEsIDIwLCBzaWcsICZzaWdsZW4sIGRzYSk7CisJaWYgKERTQV92ZXJpZnkoMCwgc3RyMSwgMjAsIHNpZywgc2lnbGVuLCBkc2EpID09IDEpCisJCXJldD0xOworCisJZHNhLT5mbGFncyAmPSB+RFNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRTsKKwlEU0FfZ2VuZXJhdGVfa2V5KGRzYSk7CisJRFNBX3NpZ24oMCwgc3RyMSwgMjAsIHNpZywgJnNpZ2xlbiwgZHNhKTsKKwlpZiAoRFNBX3ZlcmlmeSgwLCBzdHIxLCAyMCwgc2lnLCBzaWdsZW4sIGRzYSkgPT0gMSkKKwkJcmV0PTE7CisKK2VuZDoKKwlpZiAoIXJldCkKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwlpZiAoZHNhICE9IE5VTEwpIERTQV9mcmVlKGRzYSk7CisJQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKTsKKwlFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShOVUxMKTsKKwlFUlJfZnJlZV9zdHJpbmdzKCk7CisJQ1JZUFRPX21lbV9sZWFrcyhiaW9fZXJyKTsKKwlpZiAoYmlvX2VyciAhPSBOVUxMKQorCQl7CisJCUJJT19mcmVlKGJpb19lcnIpOworCQliaW9fZXJyID0gTlVMTDsKKwkJfQorI2lmZGVmIE9QRU5TU0xfU1lTX05FVFdBUkUKKyAgICBpZiAoIXJldCkgcHJpbnRmKCJFUlJPUlxuIik7CisjZW5kaWYKKwlFWElUKCFyZXQpOworCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgZHNhX2NiKGludCBwLCBpbnQgbiwgQk5fR0VOQ0IgKmFyZykKKwl7CisJY2hhciBjPScqJzsKKwlzdGF0aWMgaW50IG9rPTAsbnVtPTA7CisKKwlpZiAocCA9PSAwKSB7IGM9Jy4nOyBudW0rKzsgfTsKKwlpZiAocCA9PSAxKSBjPScrJzsKKwlpZiAocCA9PSAyKSB7IGM9JyonOyBvaysrOyB9CisJaWYgKHAgPT0gMykgYz0nXG4nOworCUJJT193cml0ZShhcmctPmFyZywmYywxKTsKKwkodm9pZClCSU9fZmx1c2goYXJnLT5hcmcpOworCisJaWYgKCFvayAmJiAocCA9PSAwKSAmJiAobnVtID4gMSkpCisJCXsKKwkJQklPX3ByaW50ZigoQklPICopYXJnLCJlcnJvciBpbiBkc2F0ZXN0XG4iKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZmlwczE4NmEudHh0IGIvbGliL29wZW5zc2wvY3J5cHRvL2RzYS9maXBzMTg2YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyZTBhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc2EvZmlwczE4NmEudHh0CkBAIC0wLDAgKzEsMTIyIEBACitUaGUgb3JpZ2lvbmFsIEZJUEUgMTgwIHVzZWQgU0hBLTAgKEZJUFMgMTgwKSBmb3IgaXRzIGFwcGVuZGl4IDUKK2V4YW1wbGVzLiAgVGhpcyBpcyBhbiB1cGRhdGVkIHZlcnNpb24gdGhhdCB1c2VzIFNIQS0xIChGSVBTIDE4MC0xKQorc3VwcGxpZWQgdG8gbWUgYnkgV2VpIERhaQorLS0KKwkJICAgICBBUFBFTkRJWCA1LiBFWEFNUExFIE9GIFRIRSBEU0EKKworCitUaGlzIGFwcGVuZGl4IGlzIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kIGlzIG5vdCByZXF1aXJlZCB0byBtZWV0Cit0aGUgc3RhbmRhcmQuCisKK0xldCBMID0gNTEyIChzaXplIG9mIHApLiAgVGhlIHZhbHVlcyBpbiB0aGlzIGV4YW1wbGUgYXJlIGV4cHJlc3NlZCBpbgoraGV4YWRlY2ltYWwgbm90YXRpb24uICBUaGUgcCBhbmQgcSBnaXZlbiBoZXJlIHdlcmUgZ2VuZXJhdGVkIGJ5IHRoZSBwcmltZQorZ2VuZXJhdGlvbiBzdGFuZGFyZCBkZXNjcmliZWQgaW4gYXBwZW5kaXggMiB1c2luZyB0aGUgMTYwLWJpdCBTRUVEOgorCisgICAgICAgICAgZDUwMTRlNGIgNjBlZjJiYTggYjYyMTFiNDAgNjJiYTMyMjQgZTA0MjdkZDMKKworV2l0aCB0aGlzIFNFRUQsIHRoZSBhbGdvcml0aG0gZm91bmQgcCBhbmQgcSB3aGVuIHRoZSBjb3VudGVyIHdhcyBhdCAxMDUuCisKK3ggd2FzIGdlbmVyYXRlZCBieSB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiBhcHBlbmRpeCAzLCBzZWN0aW9uIDMuMSwgdXNpbmcKK3RoZSBTSEEgdG8gY29uc3RydWN0IEcgKGFzIGluIGFwcGVuZGl4IDMsIHNlY3Rpb24gMy4zKSBhbmQgYSAxNjAtYml0IFhTRUVEOgorCitYU0VFRCA9ICAgCisKKwliZDAyOWJiZSA3ZjUxOTYwYiBjZjllZGIyYiA2MWYwNmYwZiBlYjVhMzhiNgorCit0ID0KKwk2NzQ1MjMwMSBFRkNEQUI4OSA5OEJBRENGRSAxMDMyNTQ3NiBDM0QyRTFGMAorCit4ID0gRyh0LFhTRUVEKSBtb2QgcQorCitrIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gYXBwZW5kaXggMywgc2VjdGlvbiAzLjIsIHVzaW5nCit0aGUgU0hBIHRvIGNvbnN0cnVjdCBHIChhcyBpbiBhcHBlbmRpeCAzLCBzZWN0aW9uIDMuMykgYW5kIGEgMTYwLWJpdCBLU0VFRDoKKworS1NFRUQgPQorCisJNjg3YTY2ZDkgMDY0OGY5OTMgODY3ZTEyMWYgNGRkZjlkZGIgMDEyMDU1ODQKKwordCA9CisJRUZDREFCODkgOThCQURDRkUgMTAzMjU0NzYgQzNEMkUxRjAgNjc0NTIzMDEKKworayA9IEcodCxLU0VFRCkgbW9kIHEKKworRmluYWxseToKKworaCA9IDIKKworcCA9CisJOGRmMmE0OTQgNDkyMjc2YWEgM2QyNTc1OWIgYjA2ODY5Y2IgZWFjMGQ4M2EgZmI4ZDBjZjcKKwljYmI4MzI0ZiAwZDc4ODJlNSBkMDc2MmZjNSBiNzIxMGVhZiBjMmU5YWRhYyAzMmFiN2FhYworCTQ5NjkzZGZiIGY4MzcyNGMyIGVjMDczNmVlIDMxYzgwMjkxCisKKworcSA9CisJYzc3MzIxOGMgNzM3ZWM4ZWUgOTkzYjRmMmQgZWQzMGY0OGUgZGFjZTkxNWYKKworCitnID0KKwk2MjZkMDI3OCAzOWVhMGExMyA0MTMxNjNhNSA1YjRjYjUwMCAyOTlkNTUyMiA5NTZjZWZjYgorCTNiZmYxMGYzIDk5Y2UyYzJlIDcxY2I5ZGU1IGZhMjRiYWJmIDU4ZTViNzk1IDIxOTI1YzljCisJYzQyZTlmNmYgNDY0YjA4OGMgYzU3MmFmNTMgZTZkNzg4MDIKKworCit4ID0KKwkyMDcwYjMyMiAzZGJhMzcyZiBkZTFjMGZmYyA3YjJlM2I0OSA4YjI2MDYxNAorCisKK2sgPQorCTM1OGRhZDU3IDE0NjI3MTBmIDUwZTI1NGNmIDFhMzc2YjJiIGRlYWFkZmJmCisKKwora2ludiA9IAorCisJMGQ1MTY3MjkgODIwMmU0OWIgNDExNmFjMTAgNGZjM2Y0MTUgYWU1MmY5MTcKKworTSA9IEFTQ0lJIGZvcm0gb2YgImFiYyIgKFNlZSBGSVBTIFBVQiAxODAtMSwgQXBwZW5kaXggQSkKKworU0hBKE0pID0gIAorCisJYTk5OTNlMzYgNDcwNjgxNmEgYmEzZTI1NzEgNzg1MGMyNmMgOWNkMGQ4OWQKKworCit5ID0KKworCTE5MTMxODcxIGQ3NWIxNjEyIGE4MTlmMjlkIDc4ZDFiMGQ3IDM0NmY3YWE3IDdiYjYyYTg1IAorCTliZmQ2YzU2IDc1ZGE5ZDIxIDJkM2EzNmVmIDE2NzJlZjY2IDBiOGM3YzI1IDVjYzBlYzc0CisJODU4ZmJhMzMgZjQ0YzA2NjkgOTYzMGE3NmIgMDMwZWUzMzMKKworCityID0KKwk4YmFjMWFiNiA2NDEwNDM1YyBiNzE4MWY5NSBiMTZhYjk3YyA5MmIzNDFjMAorCitzID0KKwk0MWUyMzQ1ZiAxZjU2ZGYyNCA1OGY0MjZkMSA1NWI0YmEyZCBiNmRjZDhjOAorCisKK3cgPQorCTlkZjRlY2U1IDgyNmJlOTVmIGVkNDA2ZDQxIGI0M2VkYzBiIDFjMTg4NDFiCisKKwordTEgPQorCWJmNjU1YmQwIDQ2ZjBiMzVlIGM3OTFiMDA0IDgwNGFmY2JiIDhlZjdkNjlkCisKKwordTIgPQorCTgyMWE5MjYzIDEyZTk3YWRlIGFiY2M4ZDA4IDJiNTI3ODk3IDhhMmRmNGIwCisKKworZ3UxIG1vZCBwID0KKworCTUxYjFiZjg2IDc4ODhlNWYzIGFmNmZiNDc2IDlkZDAxNmJjIGZlNjY3YTY1IGFhZmMyNzUzCisJOTA2M2JkM2QgMmIxMzhiNGMgZTAyY2MwYzAgMmVjNjJiYjYgNzMwNmM2M2UgNGRiOTViYmYKKwk2Zjk2NjYyYSAxOTg3YTIxYiBlNGVjMTA3MSAwMTBiNjA2OQorCisKK3l1MiBtb2QgcCA9CisKKwk4YjUxMDA3MSAyOTU3ZTk1MCA1MGQ2YjhmZCAzNzZhNjY4ZSA0YjBkNjMzYyAxZTQ2ZTY2NQorCTVjNjExYTcyIGUyYjI4NDgzIGJlNTJjNzRkIDRiMzBkZTYxIGE2Njg5NjZlIGRjMzA3YTY3IAorCWMxOTQ0MWY0IDIyYmYzYzM0IDA4YWViYTFmIDBhNGRiZWM3CisKK3YgPQorCThiYWMxYWI2IDY0MTA0MzVjIGI3MTgxZjk1IGIxNmFiOTdjIDkyYjM0MWMwCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL1JFQURNRSBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYmM5YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL1JFQURNRQpAQCAtMCwwICsxLDIyIEBACitOT1RFUworLS0tLS0KKworSSd2ZSBjaGVja2VkIG91dCBIUFVYICh3ZWxsLCB2ZXJzaW9uIDExIGF0IGxlYXN0KSBhbmQgc2hsX3QgaXMKK2EgcG9pbnRlciB0eXBlIHNvIGl0J3Mgc2FmZSB0byB1c2UgaW4gdGhlIHdheSBpdCBoYXMgYmVlbiBpbgorZHNvX2RsLmMuIE9uIHRoZSBvdGhlciBoYW5kLCBIUFVYMTEgc3VwcG9ydCBkbGZjbiB0b28gYW5kCithY2NvcmRpbmcgdG8gdGhlaXIgbWFuIHBhZ2UsIHByZWZlciBkZXZlbG9wZXJzIHRvIG1vdmUgdG8gdGhhdC4KK0knbGwgbGVhdmUgUmljaGFyZCdzIGNoYW5nZXMgdGhlcmUgYXMgSSBndWVzcyBkc29fZGwgaXMgbmVlZGVkCitmb3IgSFBVWDEwLjIwLgorCitUaGVyZSBpcyBub3cgYSBjYWxsYmFjayBzY2hlbWUgaW4gcGxhY2Ugd2hlcmUgZmlsZW5hbWUgY29udmVyc2lvbiBjYW4KKyhhKSBiZSB0dXJuZWQgb2ZmIGFsdG9nZXRoZXIgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZQorICAgIERTT19GTEFHX05PX05BTUVfVFJBTlNMQVRJT04gZmxhZywKKyhiKSBiZSBoYW5kbGVkIGJ5IGRlZmF1bHQgdXNpbmcgdGhlIGRlZmF1bHQgRFNPX01FVEhPRCdzIGNvbnZlcnRlcgorKGMpIG92ZXJyaWRlbiBwZXItRFNPIGJ5IHNldHRpbmcgdGhlIG92ZXJyaWRlIGNhbGxiYWNrCisoZCkgYSBtaXggb2YgKGIpIGFuZCAoYykgLSBlZy4gaW1wbGVtZW50IGFuIG92ZXJyaWRlIGNhbGxiYWNrIHRoYXQ7CisgICAgKGkpIGNoZWNrcyBpZiB3ZSdyZSB3aW4zMiAoaWYoc3Ryc3RyKGRzby0+bWV0aC0+bmFtZSwgIndpbjMyIikuLi4uKQorICAgICAgICBhbmQgaWYgc28sIGNvbnZlcnQgImJsYWgiIGludG8gImJsYWgzMi5kbGwiICh0aGUgZGVmYXVsdCBpcworCW90aGVyd2lzZSB0byBtYWtlIGl0ICJibGFoLmRsbCIpLgorICAgIChpaSkgZGVmYXVsdCB0byB0aGUgbm9ybWFsIGJlaGF2aW91ciAtIHdlJ3JlIG5vdCBvbiB3aW4zMiwgZWcuCisgICAgICAgICBmaW5pc2ggd2l0aCAocmV0dXJuIGRzby0+bWV0aC0+ZHNvX25hbWVfY29udmVydGVyKGRzbyxOVUxMKSkuCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vZHNvLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWYyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzby5oCkBAIC0wLDAgKzEsNDA5IEBACisvKiBkc28uaCAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogV3JpdHRlbiBieSBHZW9mZiBUaG9ycGUgKGdlb2ZmQGdlb2ZmdGhvcnBlLm5ldCkgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfRFNPX0gKKyNkZWZpbmUgSEVBREVSX0RTT19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBhcyBjb21tYW5kcyB0byBEU09fY3RybCgpICovCisjZGVmaW5lIERTT19DVFJMX0dFVF9GTEFHUwkxCisjZGVmaW5lIERTT19DVFJMX1NFVF9GTEFHUwkyCisjZGVmaW5lIERTT19DVFJMX09SX0ZMQUdTCTMKKworLyogQnkgZGVmYXVsdCwgRFNPX2xvYWQoKSB3aWxsIHRyYW5zbGF0ZSB0aGUgcHJvdmlkZWQgZmlsZW5hbWUgaW50byBhIGZvcm0KKyAqIHR5cGljYWwgZm9yIHRoZSBwbGF0Zm9ybSAobW9yZSBzcGVjaWZpY2FsbHkgdGhlIERTT19NRVRIT0QpIHVzaW5nIHRoZQorICogZHNvX25hbWVfY29udmVydGVyIGZ1bmN0aW9uIG9mIHRoZSBtZXRob2QuIEVnLiB3aW4zMiB3aWxsIHRyYW5zZm9ybSAiYmxhaCIKKyAqIGludG8gImJsYWguZGxsIiwgYW5kIGRsZmNuIHdpbGwgdHJhbnNmb3JtIGl0IGludG8gImxpYmJsYWguc28iLiBUaGUKKyAqIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHNldHRpbmcgdGhlIG5hbWVfY29udmVydGVyIGNhbGxiYWNrIGluIHRoZSBEU08KKyAqIG9iamVjdCAodXNpbmcgRFNPX3NldF9uYW1lX2NvbnZlcnRlcigpKS4gVGhpcyBjYWxsYmFjayBjb3VsZCBldmVuIHV0aWxpc2UKKyAqIHRoZSBEU09fTUVUSE9EJ3MgY29udmVydGVyIHRvbyBpZiBpdCBvbmx5IHdhbnRzIHRvIG92ZXJyaWRlIGJlaGF2aW91ciBmb3IKKyAqIG9uZSBvciB0d28gcG9zc2libGUgRFNPIG1ldGhvZHMuIEhvd2V2ZXIsIHRoZSBmb2xsb3dpbmcgZmxhZyBjYW4gYmUgc2V0IGluIGEKKyAqIERTTyB0byBwcmV2ZW50ICphbnkqIG5hdGl2ZSBuYW1lLXRyYW5zbGF0aW9uIGF0IGFsbCAtIGVnLiBpZiB0aGUgY2FsbGVyIGhhcworICogcHJvbXB0ZWQgdGhlIHVzZXIgZm9yIGEgcGF0aCB0byBhIGRyaXZlciBsaWJyYXJ5IHNvIHRoZSBmaWxlbmFtZSBzaG91bGQgYmUKKyAqIGludGVycHJldGVkIGFzLWlzLiAqLworI2RlZmluZSBEU09fRkxBR19OT19OQU1FX1RSQU5TTEFUSU9OCQkweDAxCisvKiBBbiBleHRyYSBmbGFnIHRvIGdpdmUgaWYgb25seSB0aGUgZXh0ZW5zaW9uIHNob3VsZCBiZSBhZGRlZCBhcworICogdHJhbnNsYXRpb24uICBUaGlzIGlzIG9idmlvdXNseSBvbmx5IG9mIGltcG9ydGFuY2Ugb24gVW5peCBhbmQKKyAqIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIHdoZXJlIHRoZSB0cmFuc2xhdGlvbiBhbHNvIG1heSBwcmVmaXgKKyAqIHRoZSBuYW1lIHdpdGggc29tZXRoaW5nLCBsaWtlICdsaWInLCBhbmQgaWdub3JlZCBldmVyeXdoZXJlIGVsc2UuCisgKiBUaGlzIGZsYWcgaXMgYWxzbyBpZ25vcmVkIGlmIERTT19GTEFHX05PX05BTUVfVFJBTlNMQVRJT04gaXMgdXNlZAorICogYXQgdGhlIHNhbWUgdGltZS4gKi8KKyNkZWZpbmUgRFNPX0ZMQUdfTkFNRV9UUkFOU0xBVElPTl9FWFRfT05MWQkweDAyCisKKy8qIFRoZSBmb2xsb3dpbmcgZmxhZyBjb250cm9scyB0aGUgdHJhbnNsYXRpb24gb2Ygc3ltYm9sIG5hbWVzIHRvIHVwcGVyCisgKiBjYXNlLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seSBiZWluZyBpbXBsZW1lbnRlZCBmb3IgT3BlblZNUy4KKyAqLworI2RlZmluZSBEU09fRkxBR19VUENBU0VfU1lNQk9MCQkJMHgxMAorCisvKiBUaGlzIGZsYWcgbG9hZHMgdGhlIGxpYnJhcnkgd2l0aCBwdWJsaWMgc3ltYm9scy4KKyAqIE1lYW5pbmc6IFRoZSBleHBvcnRlZCBzeW1ib2xzIG9mIHRoaXMgbGlicmFyeSBhcmUgcHVibGljCisgKiB0byBhbGwgbGlicmFyaWVzIGxvYWRlZCBhZnRlciB0aGlzIGxpYnJhcnkuCisgKiBBdCB0aGUgbW9tZW50IG9ubHkgaW1wbGVtZW50ZWQgaW4gdW5peC4KKyAqLworI2RlZmluZSBEU09fRkxBR19HTE9CQUxfU1lNQk9MUwkJCTB4MjAKKworCit0eXBlZGVmIHZvaWQgKCpEU09fRlVOQ19UWVBFKSh2b2lkKTsKKwordHlwZWRlZiBzdHJ1Y3QgZHNvX3N0IERTTzsKKworLyogVGhlIGZ1bmN0aW9uIHByb3RvdHlwZSB1c2VkIGZvciBtZXRob2QgZnVuY3Rpb25zIChvciBjYWxsZXItcHJvdmlkZWQKKyAqIGNhbGxiYWNrcykgdGhhdCB0cmFuc2Zvcm0gZmlsZW5hbWVzLiBUaGV5IGFyZSBwYXNzZWQgYSBEU08gc3RydWN0dXJlIHBvaW50ZXIKKyAqIChvciBOVUxMIGlmIHRoZXkgYXJlIHRvIGJlIHVzZWQgaW5kZXBlbmRhbnRseSBvZiBhIERTTyBvYmplY3QpIGFuZCBhCisgKiBmaWxlbmFtZSB0byB0cmFuc2Zvcm0uIFRoZXkgc2hvdWxkIGVpdGhlciByZXR1cm4gTlVMTCAoaWYgdGhlcmUgaXMgYW4gZXJyb3IKKyAqIGNvbmRpdGlvbikgb3IgYSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRyYW5zZm9ybWVkIGZvcm0gdGhhdAorICogdGhlIGNhbGxlciB3aWxsIG5lZWQgdG8gZnJlZSB3aXRoIE9QRU5TU0xfZnJlZSgpIHdoZW4gZG9uZS4gKi8KK3R5cGVkZWYgY2hhciogKCpEU09fTkFNRV9DT05WRVJURVJfRlVOQykoRFNPICosIGNvbnN0IGNoYXIgKik7CisvKiBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIHVzZWQgZm9yIG1ldGhvZCBmdW5jdGlvbnMgKG9yIGNhbGxlci1wcm92aWRlZAorICogY2FsbGJhY2tzKSB0aGF0IG1lcmdlIHR3byBmaWxlIHNwZWNpZmljYXRpb25zLiBUaGV5IGFyZSBwYXNzZWQgYQorICogRFNPIHN0cnVjdHVyZSBwb2ludGVyIChvciBOVUxMIGlmIHRoZXkgYXJlIHRvIGJlIHVzZWQgaW5kZXBlbmRhbnRseSBvZgorICogYSBEU08gb2JqZWN0KSBhbmQgdHdvIGZpbGUgc3BlY2lmaWNhdGlvbnMgdG8gbWVyZ2UuIFRoZXkgc2hvdWxkCisgKiBlaXRoZXIgcmV0dXJuIE5VTEwgKGlmIHRoZXJlIGlzIGFuIGVycm9yIGNvbmRpdGlvbikgb3IgYSBuZXdseSBhbGxvY2F0ZWQKKyAqIHN0cmluZyBjb250YWluaW5nIHRoZSByZXN1bHQgb2YgbWVyZ2luZyB0aGF0IHRoZSBjYWxsZXIgd2lsbCBuZWVkCisgKiB0byBmcmVlIHdpdGggT1BFTlNTTF9mcmVlKCkgd2hlbiBkb25lLgorICogSGVyZSwgbWVyZ2luZyBtZWFucyB0aGF0IGJpdHMgYW5kIHBpZWNlcyBhcmUgdGFrZW4gZnJvbSBlYWNoIG9mIHRoZQorICogZmlsZSBzcGVjaWZpY2F0aW9ucyBhbmQgYWRkZWQgdG9nZXRoZXIgaW4gd2hhdGV2ZXIgZmFzaGlvbiB0aGF0IGlzCisgKiBzZW5zaWJsZSBmb3IgdGhlIERTTyBtZXRob2QgaW4gcXVlc3Rpb24uICBUaGUgb25seSBydWxlIHRoYXQgcmVhbGx5CisgKiBhcHBsaWVzIGlzIHRoYXQgaWYgdGhlIHR3byBzcGVjaWZpY2F0aW9uIGNvbnRhaW4gcGllY2VzIG9mIHRoZSBzYW1lCisgKiB0eXBlLCB0aGUgY29weSBmcm9tIHRoZSBmaXJzdCBzdHJpbmcgdGFrZXMgcHJpb3JpdHkuICBPbmUgY291bGQgc2VlCisgKiBpdCBhcyB0aGUgZmlyc3Qgc3BlY2lmaWNhdGlvbiBpcyB0aGUgb25lIGdpdmVuIGJ5IHRoZSB1c2VyIGFuZCB0aGUKKyAqIHNlY29uZCBiZWluZyBhIGJ1bmNoIG9mIGRlZmF1bHRzIHRvIGFkZCBvbiBpZiB0aGV5J3JlIG1pc3NpbmcgaW4gdGhlCisgKiBmaXJzdC4gKi8KK3R5cGVkZWYgY2hhciogKCpEU09fTUVSR0VSX0ZVTkMpKERTTyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKK3R5cGVkZWYgc3RydWN0IGRzb19tZXRoX3N0CisJeworCWNvbnN0IGNoYXIgKm5hbWU7CisJLyogTG9hZHMgYSBzaGFyZWQgbGlicmFyeSwgTkI6IG5ldyBEU09fTUVUSE9EcyBtdXN0IGVuc3VyZSB0aGF0IGEKKwkgKiBzdWNjZXNzZnVsIGxvYWQgcG9wdWxhdGVzIHRoZSBsb2FkZWRfZmlsZW5hbWUgZmllbGQsIGFuZCBsaWtld2lzZSBhCisJICogc3VjY2Vzc2Z1bCB1bmxvYWQgT1BFTlNTTF9mcmVlcyBhbmQgTlVMTHMgaXQgb3V0LiAqLworCWludCAoKmRzb19sb2FkKShEU08gKmRzbyk7CisJLyogVW5sb2FkcyBhIHNoYXJlZCBsaWJyYXJ5ICovCisJaW50ICgqZHNvX3VubG9hZCkoRFNPICpkc28pOworCS8qIEJpbmRzIGEgdmFyaWFibGUgKi8KKwl2b2lkICooKmRzb19iaW5kX3ZhcikoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworCS8qIEJpbmRzIGEgZnVuY3Rpb24gLSBhc3N1bWVzIGEgcmV0dXJuIHR5cGUgb2YgRFNPX0ZVTkNfVFlQRS4KKwkgKiBUaGlzIHNob3VsZCBiZSBjYXN0IHRvIHRoZSByZWFsIGZ1bmN0aW9uIHByb3RvdHlwZSBieSB0aGUKKwkgKiBjYWxsZXIuIFBsYXRmb3JtcyB0aGF0IGRvbid0IGhhdmUgY29tcGF0aWJsZSByZXByZXNlbnRhdGlvbnMKKwkgKiBmb3IgZGlmZmVyZW50IHByb3RvdHlwZXMgKHRoaXMgaXMgcG9zc2libGUgd2l0aGluIEFOU0kgQykKKwkgKiBhcmUgaGlnaGx5IHVubGlrZWx5IHRvIGhhdmUgc2hhcmVkIGxpYnJhcmllcyBhdCBhbGwsIGxldAorCSAqIGFsb25lIGEgRFNPX01FVEhPRCBpbXBsZW1lbnRlZCBmb3IgdGhlbS4gKi8KKwlEU09fRlVOQ19UWVBFICgqZHNvX2JpbmRfZnVuYykoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworCisvKiBJIGRvbid0IHRoaW5rIHRoaXMgd291bGQgYWN0dWFsbHkgYmUgdXNlZCBpbiBhbnkgY2lyY3Vtc3RhbmNlcy4gKi8KKyNpZiAwCisJLyogVW5iaW5kcyBhIHZhcmlhYmxlICovCisJaW50ICgqZHNvX3VuYmluZF92YXIpKERTTyAqZHNvLCBjaGFyICpzeW1uYW1lLCB2b2lkICpzeW1wdHIpOworCS8qIFVuYmluZHMgYSBmdW5jdGlvbiAqLworCWludCAoKmRzb191bmJpbmRfZnVuYykoRFNPICpkc28sIGNoYXIgKnN5bW5hbWUsIERTT19GVU5DX1RZUEUgc3ltcHRyKTsKKyNlbmRpZgorCS8qIFRoZSBnZW5lcmljICh5dWNrKSAiY3RybCgpIiBmdW5jdGlvbi4gTkI6IE5lZ2F0aXZlIHJldHVybgorCSAqIHZhbHVlcyAocmF0aGVyIHRoYW4gemVybykgaW5kaWNhdGUgZXJyb3JzLiAqLworCWxvbmcgKCpkc29fY3RybCkoRFNPICpkc28sIGludCBjbWQsIGxvbmcgbGFyZywgdm9pZCAqcGFyZyk7CisJLyogVGhlIGRlZmF1bHQgRFNPX01FVEhPRC1zcGVjaWZpYyBmdW5jdGlvbiBmb3IgY29udmVydGluZyBmaWxlbmFtZXMgdG8KKwkgKiBhIGNhbm9uaWNhbCBuYXRpdmUgZm9ybS4gKi8KKwlEU09fTkFNRV9DT05WRVJURVJfRlVOQyBkc29fbmFtZV9jb252ZXJ0ZXI7CisJLyogVGhlIGRlZmF1bHQgRFNPX01FVEhPRC1zcGVjaWZpYyBmdW5jdGlvbiBmb3IgY29udmVydGluZyBmaWxlbmFtZXMgdG8KKwkgKiBhIGNhbm9uaWNhbCBuYXRpdmUgZm9ybS4gKi8KKwlEU09fTUVSR0VSX0ZVTkMgZHNvX21lcmdlcjsKKworCS8qIFtEZV1Jbml0aWFsaXNhdGlvbiBoYW5kbGVycy4gKi8KKwlpbnQgKCppbml0KShEU08gKmRzbyk7CisJaW50ICgqZmluaXNoKShEU08gKmRzbyk7CisKKwkvKiBSZXR1cm4gcGF0aG5hbWUgb2YgdGhlIG1vZHVsZSBjb250YWluaW5nIGxvY2F0aW9uICovCisJaW50ICgqcGF0aGJ5YWRkcikodm9pZCAqYWRkcixjaGFyICpwYXRoLGludCBzeik7CisJLyogUGVyZm9ybSBnbG9iYWwgc3ltYm9sIGxvb2t1cCwgaS5lLiBhbW9uZyAqYWxsKiBtb2R1bGVzICovCisJdm9pZCAqKCpnbG9iYWxsb29rdXApKGNvbnN0IGNoYXIgKnN5bW5hbWUpOworCX0gRFNPX01FVEhPRDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGUgbG93LWxldmVsIGhhbmRsZSB0eXBlIHVzZWQgdG8gcmVmZXIgdG8gYSBsb2FkZWQgc2hhcmVkIGxpYnJhcnkgKi8KKworc3RydWN0IGRzb19zdAorCXsKKwlEU09fTUVUSE9EICptZXRoOworCS8qIFN0YW5kYXJkIGRsb3BlbiB1c2VzIGEgKHZvaWQgKikuIFdpbjMyIHVzZXMgYSBIQU5ETEUuIFZNUworCSAqIGRvZXNuJ3QgdXNlIGFueXRoaW5nIGJ1dCB3aWxsIG5lZWQgdG8gY2FjaGUgdGhlIGZpbGVuYW1lCisJICogZm9yIHVzZSBpbiB0aGUgZHNvX2JpbmQgaGFuZGxlci4gQWxsIGluIGFsbCwgbGV0IGVhY2gKKwkgKiBtZXRob2QgY29udHJvbCBpdHMgb3duIGRlc3RpbnkuICJIYW5kbGVzIiBhbmQgc3VjaCBnbyBpbgorCSAqIGEgU1RBQ0suICovCisJU1RBQ0tfT0Yodm9pZCkgKm1ldGhfZGF0YTsKKwlpbnQgcmVmZXJlbmNlczsKKwlpbnQgZmxhZ3M7CisJLyogRm9yIHVzZSBieSBhcHBsaWNhdGlvbnMgZXRjIC4uLiB1c2UgdGhpcyBmb3IgeW91ciBiaXRzJ24ncGllY2VzLAorCSAqIGRvbid0IHRvdWNoIG1ldGhfZGF0YSEgKi8KKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCS8qIElmIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBpcyBzZXQgdG8gbm9uLU5VTEwsIHRoZW4gaXQgd2lsbAorCSAqIGJlIHVzZWQgaW4gRFNPX2xvYWQoKSBpbiBwbGFjZSBvZiBtZXRoLT5kc29fbmFtZV9jb252ZXJ0ZXIuIE5COiBUaGlzCisJICogc2hvdWxkIG5vcm1hbGx5IHNldCB1c2luZyBEU09fc2V0X25hbWVfY29udmVydGVyKCkuICovCisJRFNPX05BTUVfQ09OVkVSVEVSX0ZVTkMgbmFtZV9jb252ZXJ0ZXI7CisJLyogSWYgdGhpcyBjYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyIGlzIHNldCB0byBub24tTlVMTCwgdGhlbiBpdCB3aWxsCisJICogYmUgdXNlZCBpbiBEU09fbG9hZCgpIGluIHBsYWNlIG9mIG1ldGgtPmRzb19tZXJnZXIuIE5COiBUaGlzCisJICogc2hvdWxkIG5vcm1hbGx5IHNldCB1c2luZyBEU09fc2V0X21lcmdlcigpLiAqLworCURTT19NRVJHRVJfRlVOQyBtZXJnZXI7CisJLyogVGhpcyBpcyBwb3B1bGF0ZWQgd2l0aCAoYSBjb3B5IG9mKSB0aGUgcGxhdGZvcm0taW5kZXBlbmRhbnQKKwkgKiBmaWxlbmFtZSB1c2VkIGZvciB0aGlzIERTTy4gKi8KKwljaGFyICpmaWxlbmFtZTsKKwkvKiBUaGlzIGlzIHBvcHVsYXRlZCB3aXRoIChhIGNvcHkgb2YpIHRoZSB0cmFuc2xhdGVkIGZpbGVuYW1lIGJ5IHdoaWNoCisJICogdGhlIERTTyB3YXMgYWN0dWFsbHkgbG9hZGVkLiBJdCBpcyBOVUxMIGlmZiB0aGUgRFNPIGlzIG5vdCBjdXJyZW50bHkKKwkgKiBsb2FkZWQuIE5COiBUaGlzIGlzIGhlcmUgYmVjYXVzZSB0aGUgZmlsZW5hbWUgdHJhbnNsYXRpb24gcHJvY2VzcworCSAqIG1heSBpbnZvbHZlIGEgY2FsbGJhY2sgYmVpbmcgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBub3Qgb25seSB0bworCSAqIGNvbnZlcnQgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBmb3JtLCBidXQgYWxzbyB0byB0cnkgZGlmZmVyZW50CisJICogZmlsZW5hbWVzIGluIHRoZSBwcm9jZXNzIG9mIHRyeWluZyB0byBwZXJmb3JtIGEgbG9hZC4gQXMgc3VjaCwgdGhpcworCSAqIHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIChhKSB3aGV0aGVyIHRoaXMgRFNPIHN0cnVjdHVyZQorCSAqIGNvcnJlc3BvbmRzIHRvIGEgbG9hZGVkIGxpYnJhcnkgb3Igbm90LCBhbmQgKGIpIHRoZSBmaWxlbmFtZSB3aXRoCisJICogd2hpY2ggaXQgd2FzIGFjdHVhbGx5IGxvYWRlZC4gKi8KKwljaGFyICpsb2FkZWRfZmlsZW5hbWU7CisJfTsKKworCitEU08gKglEU09fbmV3KHZvaWQpOworRFNPICoJRFNPX25ld19tZXRob2QoRFNPX01FVEhPRCAqbWV0aG9kKTsKK2ludAlEU09fZnJlZShEU08gKmRzbyk7CitpbnQJRFNPX2ZsYWdzKERTTyAqZHNvKTsKK2ludAlEU09fdXBfcmVmKERTTyAqZHNvKTsKK2xvbmcJRFNPX2N0cmwoRFNPICpkc28sIGludCBjbWQsIGxvbmcgbGFyZywgdm9pZCAqcGFyZyk7CisKKy8qIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgRFNPJ3MgbmFtZV9jb252ZXJ0ZXIgY2FsbGJhY2suIElmIGl0IGlzIG5vbi1OVUxMLAorICogdGhlbiBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYXNzb2NpYXRlZCBEU09fTUVUSE9EJ3MgZnVuY3Rpb24uIElmCisgKiBvbGRjYiBpcyBub24tTlVMTCB0aGVuIGl0IGlzIHNldCB0byB0aGUgZnVuY3Rpb24gcG9pbnRlciB2YWx1ZSBiZWluZworICogcmVwbGFjZWQuIFJldHVybiB2YWx1ZSBpcyBub24temVybyBmb3Igc3VjY2Vzcy4gKi8KK2ludAlEU09fc2V0X25hbWVfY29udmVydGVyKERTTyAqZHNvLCBEU09fTkFNRV9DT05WRVJURVJfRlVOQyBjYiwKKwkJCQlEU09fTkFNRV9DT05WRVJURVJfRlVOQyAqb2xkY2IpOworLyogVGhlc2UgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGdldC9zZXQgdGhlIHBsYXRmb3JtLWluZGVwZW5kYW50IGZpbGVuYW1lCisgKiB1c2VkIGZvciBhIERTTy4gTkI6IHNldCB3aWxsIGZhaWwgaWYgdGhlIERTTyBpcyBhbHJlYWR5IGxvYWRlZC4gKi8KK2NvbnN0IGNoYXIgKkRTT19nZXRfZmlsZW5hbWUoRFNPICpkc28pOworaW50CURTT19zZXRfZmlsZW5hbWUoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnZva2UgdGhlIERTTydzIG5hbWVfY29udmVydGVyIGNhbGxiYWNrIHRvIHRyYW5zbGF0ZSBhCisgKiBmaWxlbmFtZSwgb3IgaWYgdGhlIGNhbGxiYWNrIGlzbid0IHNldCBpdCB3aWxsIGluc3RlYWQgdXNlIHRoZSBEU09fTUVUSE9EJ3MKKyAqIGNvbnZlcnRlci4gSWYgImZpbGVuYW1lIiBpcyBOVUxMLCB0aGUgImZpbGVuYW1lIiBpbiB0aGUgRFNPIGl0c2VsZiB3aWxsIGJlCisgKiB1c2VkLiBJZiB0aGUgRFNPX0ZMQUdfTk9fTkFNRV9UUkFOU0xBVElPTiBmbGFnIGlzIHNldCwgdGhlbiB0aGUgZmlsZW5hbWUgaXMKKyAqIHNpbXBseSBkdXBsaWNhdGVkLiBOQjogVGhpcyBmdW5jdGlvbiBpcyB1c3VhbGx5IGNhbGxlZCBmcm9tIHdpdGhpbiBhCisgKiBEU09fTUVUSE9EIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiBhIERTT19sb2FkKCkgY2FsbCwgYW5kIGlzIGV4cG9zZWQgc28gdGhhdAorICogY2FsbGVyLWNyZWF0ZWQgRFNPX01FVEhPRHMgY2FuIGRvIHRoZSBzYW1lIHRoaW5nLiBBIG5vbi1OVUxMIHJldHVybiB2YWx1ZQorICogd2lsbCBuZWVkIHRvIGJlIE9QRU5TU0xfZnJlZSgpJ2QuICovCitjaGFyCSpEU09fY29udmVydF9maWxlbmFtZShEU08gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUpOworLyogVGhpcyBmdW5jdGlvbiB3aWxsIGludm9rZSB0aGUgRFNPJ3MgbWVyZ2VyIGNhbGxiYWNrIHRvIG1lcmdlIHR3byBmaWxlCisgKiBzcGVjaWZpY2F0aW9ucywgb3IgaWYgdGhlIGNhbGxiYWNrIGlzbid0IHNldCBpdCB3aWxsIGluc3RlYWQgdXNlIHRoZQorICogRFNPX01FVEhPRCdzIG1lcmdlci4gIEEgbm9uLU5VTEwgcmV0dXJuIHZhbHVlIHdpbGwgbmVlZCB0byBiZQorICogT1BFTlNTTF9mcmVlKCknZC4gKi8KK2NoYXIJKkRTT19tZXJnZShEU08gKmRzbywgY29uc3QgY2hhciAqZmlsZXNwZWMxLCBjb25zdCBjaGFyICpmaWxlc3BlYzIpOworLyogSWYgdGhlIERTTyBpcyBjdXJyZW50bHkgbG9hZGVkLCB0aGlzIHJldHVybnMgdGhlIGZpbGVuYW1lIHRoYXQgaXQgd2FzIGxvYWRlZAorICogdW5kZXIsIG90aGVyd2lzZSBpdCByZXR1cm5zIE5VTEwuIFNvIGl0IGlzIGFsc28gdXNlZnVsIGFzIGEgdGVzdCBhcyB0bworICogd2hldGhlciB0aGUgRFNPIGlzIGN1cnJlbnRseSBsb2FkZWQuIE5COiBUaGlzIHdpbGwgbm90IG5lY2Vzc2FyaWx5IHJldHVybgorICogdGhlIHNhbWUgdmFsdWUgYXMgRFNPX2NvbnZlcnRfZmlsZW5hbWUoZHNvLCBkc28tPmZpbGVuYW1lKSwgYmVjYXVzZSB0aGUKKyAqIERTT19NRVRIT0QncyBsb2FkIGZ1bmN0aW9uIG1heSBoYXZlIHRyaWVkIGEgdmFyaWV0eSBvZiBmaWxlbmFtZXMgKHdpdGgKKyAqIGFuZC9vciB3aXRob3V0IHRoZSBhaWQgb2YgdGhlIGNvbnZlcnRlcnMpIGJlZm9yZSBzZXR0bGluZyBvbiB0aGUgb25lIGl0CisgKiBhY3R1YWxseSBsb2FkZWQuICovCitjb25zdCBjaGFyICpEU09fZ2V0X2xvYWRlZF9maWxlbmFtZShEU08gKmRzbyk7CisKK3ZvaWQJRFNPX3NldF9kZWZhdWx0X21ldGhvZChEU09fTUVUSE9EICptZXRoKTsKK0RTT19NRVRIT0QgKkRTT19nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCk7CitEU09fTUVUSE9EICpEU09fZ2V0X21ldGhvZChEU08gKmRzbyk7CitEU09fTUVUSE9EICpEU09fc2V0X21ldGhvZChEU08gKmRzbywgRFNPX01FVEhPRCAqbWV0aCk7CisKKy8qIFRoZSBhbGwtc2luZ2luZyBhbGwtZGFuY2luZyBsb2FkIGZ1bmN0aW9uLCB5b3Ugbm9ybWFsbHkgcGFzcyBOVUxMCisgKiBmb3IgdGhlIGZpcnN0IGFuZCB0aGlyZCBwYXJhbWV0ZXJzLiBVc2UgRFNPX3VwIGFuZCBEU09fZnJlZSBmb3IKKyAqIHN1YnNlcXVlbnQgcmVmZXJlbmNlIGNvdW50IGhhbmRsaW5nLiBBbnkgZmxhZ3MgcGFzc2VkIGluIHdpbGwgYmUgc2V0CisgKiBpbiB0aGUgY29uc3RydWN0ZWQgRFNPIGFmdGVyIGl0cyBpbml0KCkgZnVuY3Rpb24gYnV0IGJlZm9yZSB0aGUKKyAqIGxvYWQgb3BlcmF0aW9uLiBJZiAnZHNvJyBpcyBub24tTlVMTCwgJ2ZsYWdzJyBpcyBpZ25vcmVkLiAqLworRFNPICpEU09fbG9hZChEU08gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUsIERTT19NRVRIT0QgKm1ldGgsIGludCBmbGFncyk7CisKKy8qIFRoaXMgZnVuY3Rpb24gYmluZHMgdG8gYSB2YXJpYWJsZSBpbnNpZGUgYSBzaGFyZWQgbGlicmFyeS4gKi8KK3ZvaWQgKkRTT19iaW5kX3ZhcihEU08gKmRzbywgY29uc3QgY2hhciAqc3ltbmFtZSk7CisKKy8qIFRoaXMgZnVuY3Rpb24gYmluZHMgdG8gYSBmdW5jdGlvbiBpbnNpZGUgYSBzaGFyZWQgbGlicmFyeS4gKi8KK0RTT19GVU5DX1RZUEUgRFNPX2JpbmRfZnVuYyhEU08gKmRzbywgY29uc3QgY2hhciAqc3ltbmFtZSk7CisKKy8qIFRoaXMgbWV0aG9kIGlzIHRoZSBkZWZhdWx0LCBidXQgd2lsbCBiZWcsIGJvcnJvdywgb3Igc3RlYWwgd2hhdGV2ZXIKKyAqIG1ldGhvZCBzaG91bGQgYmUgdGhlIGRlZmF1bHQgb24gYW55IHBhcnRpY3VsYXIgcGxhdGZvcm0gKGluY2x1ZGluZworICogRFNPX01FVEhfbnVsbCgpIGlmIG5lY2Vzc2FyeSkuICovCitEU09fTUVUSE9EICpEU09fTUVUSE9EX29wZW5zc2wodm9pZCk7CisKKy8qIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgZm9yIGFsbCBwbGF0Zm9ybXMgLSBpZiBhIHBsYXRmb3JtIGhhcyBubworICogRFNPIHN1cHBvcnQgdGhlbiB0aGlzIHdpbGwgYmUgdGhlIG9ubHkgbWV0aG9kISAqLworRFNPX01FVEhPRCAqRFNPX01FVEhPRF9udWxsKHZvaWQpOworCisvKiBJZiBEU09fRExGQ04gaXMgZGVmaW5lZCwgdGhlIHN0YW5kYXJkIGRsZmNuLmgtc3R5bGUgZnVuY3Rpb25zCisgKiAoZGxvcGVuLCBkbGNsb3NlLCBkbHN5bSwgZXRjKSB3aWxsIGJlIHVzZWQgYW5kIGluY29ycG9yYXRlZCBpbnRvCisgKiB0aGlzIG1ldGhvZC4gSWYgbm90LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBOVUxMLiAqLworRFNPX01FVEhPRCAqRFNPX01FVEhPRF9kbGZjbih2b2lkKTsKKworLyogSWYgRFNPX0RMIGlzIGRlZmluZWQsIHRoZSBzdGFuZGFyZCBkbC5oLXN0eWxlIGZ1bmN0aW9ucyAoc2hsX2xvYWQsIAorICogc2hsX3VubG9hZCwgc2hsX2ZpbmRzeW0sIGV0Yykgd2lsbCBiZSB1c2VkIGFuZCBpbmNvcnBvcmF0ZWQgaW50bworICogdGhpcyBtZXRob2QuIElmIG5vdCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gTlVMTC4gKi8KK0RTT19NRVRIT0QgKkRTT19NRVRIT0RfZGwodm9pZCk7CisKKy8qIElmIFdJTjMyIGlzIGRlZmluZWQsIHVzZSBETExzLiBJZiBub3QsIHJldHVybiBOVUxMLiAqLworRFNPX01FVEhPRCAqRFNPX01FVEhPRF93aW4zMih2b2lkKTsKKworLyogSWYgVk1TIGlzIGRlZmluZWQsIHVzZSBzaGFyZWQgaW1hZ2VzLiBJZiBub3QsIHJldHVybiBOVUxMLiAqLworRFNPX01FVEhPRCAqRFNPX01FVEhPRF92bXModm9pZCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gd3JpdGVzIG51bGwtdGVybWluYXRlZCBwYXRobmFtZSBvZiBEU08gbW9kdWxlCisgKiBjb250YWluaW5nICdhZGRyJyBpbnRvICdzeicgbGFyZ2UgY2FsbGVyLXByb3ZpZGVkICdwYXRoJyBhbmQKKyAqIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIFtpbmNsdWRpbmcgdHJhaWxpbmcgemVyb10KKyAqIHdyaXR0ZW4gdG8gaXQuIElmICdzeicgaXMgMCBvciBuZWdhdGl2ZSwgJ3BhdGgnIGlzIGlnbm9yZWQgYW5kCisgKiByZXF1aXJlZCBhbW91bnQgb2YgY2hhcmFjaGVycyBbaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9dIHRvCisgKiBhY2NvbW9kYXRlIHBhdGhuYW1lIGlzIHJldHVybmVkLiBJZiAnYWRkcicgaXMgTlVMTCwgdGhlbgorICogcGF0aG5hbWUgb2YgY3J5cHRvbGliIGl0c2VsZiBpcyByZXR1cm5lZC4gTmVnYXRpdmUgb3IgemVybworICogcmV0dXJuIHZhbHVlIGRlbm90ZXMgZXJyb3IuCisgKi8KK2ludCBEU09fcGF0aGJ5YWRkcih2b2lkICphZGRyLGNoYXIgKnBhdGgsaW50IHN6KTsKKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aXRoIGNhdXRpb24hIEl0IGxvb2tzIHVwIHN5bWJvbHMgaW4KKyAqICphbGwqIGxvYWRlZCBtb2R1bGVzIGFuZCBpZiBtb2R1bGUgZ2V0cyB1bmxvYWRlZCBieSBzb21lYm9keSBlbHNlCisgKiBhdHRlbXB0IHRvIGRlcmVmZXJlbmNlIHRoZSBwb2ludGVyIGlzIGRvb21lZCB0byBoYXZlIGZhdGFsCisgKiBjb25zZXF1ZW5jZXMuIFByaW1hcnkgdXNhZ2UgZm9yIHRoaXMgZnVuY3Rpb24gaXMgdG8gcHJvYmUgKmNvcmUqCisgKiBzeXN0ZW0gZnVuY3Rpb25hbGl0eSwgZS5nLiBjaGVjayBpZiBnZXRuYW1laW5mbygzKSBpcyBhdmFpbGFibGUKKyAqIGF0IHJ1bi10aW1lIHdpdGhvdXQgYm90aGVyaW5nIGFib3V0IE9TLXNwZWNpZmljIGRldGFpbHMgc3VjaCBhcworICogbGliYy5zby52ZXJzaW9uaW5nIG9yIHdoZXJlIGRvZXMgaXQgYWN0dWFsbHkgcmVzaWRlOiBpbiBsaWJjCisgKiBpdHNlbGYgb3IgbGlic29ja2V0LiAqLwordm9pZCAqRFNPX2dsb2JhbF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIElmIEJlT1MgaXMgZGVmaW5lZCwgdXNlIHNoYXJlZCBpbWFnZXMuIElmIG5vdCwgcmV0dXJuIE5VTEwuICovCitEU09fTUVUSE9EICpEU09fTUVUSE9EX2Jlb3Modm9pZCk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfRFNPX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRFNPIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIERTT19GX0JFT1NfQklORF9GVU5DCQkJCSAxNDQKKyNkZWZpbmUgRFNPX0ZfQkVPU19CSU5EX1ZBUgkJCQkgMTQ1CisjZGVmaW5lIERTT19GX0JFT1NfTE9BRAkJCQkJIDE0NgorI2RlZmluZSBEU09fRl9CRU9TX05BTUVfQ09OVkVSVEVSCQkJIDE0NworI2RlZmluZSBEU09fRl9CRU9TX1VOTE9BRAkJCQkgMTQ4CisjZGVmaW5lIERTT19GX0RMRkNOX0JJTkRfRlVOQwkJCQkgMTAwCisjZGVmaW5lIERTT19GX0RMRkNOX0JJTkRfVkFSCQkJCSAxMDEKKyNkZWZpbmUgRFNPX0ZfRExGQ05fTE9BRAkJCQkgMTAyCisjZGVmaW5lIERTT19GX0RMRkNOX01FUkdFUgkJCQkgMTMwCisjZGVmaW5lIERTT19GX0RMRkNOX05BTUVfQ09OVkVSVEVSCQkJIDEyMworI2RlZmluZSBEU09fRl9ETEZDTl9VTkxPQUQJCQkJIDEwMworI2RlZmluZSBEU09fRl9ETF9CSU5EX0ZVTkMJCQkJIDEwNAorI2RlZmluZSBEU09fRl9ETF9CSU5EX1ZBUgkJCQkgMTA1CisjZGVmaW5lIERTT19GX0RMX0xPQUQJCQkJCSAxMDYKKyNkZWZpbmUgRFNPX0ZfRExfTUVSR0VSCQkJCQkgMTMxCisjZGVmaW5lIERTT19GX0RMX05BTUVfQ09OVkVSVEVSCQkJCSAxMjQKKyNkZWZpbmUgRFNPX0ZfRExfVU5MT0FECQkJCQkgMTA3CisjZGVmaW5lIERTT19GX0RTT19CSU5EX0ZVTkMJCQkJIDEwOAorI2RlZmluZSBEU09fRl9EU09fQklORF9WQVIJCQkJIDEwOQorI2RlZmluZSBEU09fRl9EU09fQ09OVkVSVF9GSUxFTkFNRQkJCSAxMjYKKyNkZWZpbmUgRFNPX0ZfRFNPX0NUUkwJCQkJCSAxMTAKKyNkZWZpbmUgRFNPX0ZfRFNPX0ZSRUUJCQkJCSAxMTEKKyNkZWZpbmUgRFNPX0ZfRFNPX0dFVF9GSUxFTkFNRQkJCQkgMTI3CisjZGVmaW5lIERTT19GX0RTT19HRVRfTE9BREVEX0ZJTEVOQU1FCQkJIDEyOAorI2RlZmluZSBEU09fRl9EU09fR0xPQkFMX0xPT0tVUAkJCQkgMTM5CisjZGVmaW5lIERTT19GX0RTT19MT0FECQkJCQkgMTEyCisjZGVmaW5lIERTT19GX0RTT19NRVJHRQkJCQkJIDEzMgorI2RlZmluZSBEU09fRl9EU09fTkVXX01FVEhPRAkJCQkgMTEzCisjZGVmaW5lIERTT19GX0RTT19QQVRIQllBRERSCQkJCSAxNDAKKyNkZWZpbmUgRFNPX0ZfRFNPX1NFVF9GSUxFTkFNRQkJCQkgMTI5CisjZGVmaW5lIERTT19GX0RTT19TRVRfTkFNRV9DT05WRVJURVIJCQkgMTIyCisjZGVmaW5lIERTT19GX0RTT19VUF9SRUYJCQkJIDExNAorI2RlZmluZSBEU09fRl9HTE9CQUxfTE9PS1VQX0ZVTkMJCQkgMTM4CisjZGVmaW5lIERTT19GX1BBVEhCWUFERFIJCQkJIDEzNworI2RlZmluZSBEU09fRl9WTVNfQklORF9TWU0JCQkJIDExNQorI2RlZmluZSBEU09fRl9WTVNfTE9BRAkJCQkJIDExNgorI2RlZmluZSBEU09fRl9WTVNfTUVSR0VSCQkJCSAxMzMKKyNkZWZpbmUgRFNPX0ZfVk1TX1VOTE9BRAkJCQkgMTE3CisjZGVmaW5lIERTT19GX1dJTjMyX0JJTkRfRlVOQwkJCQkgMTE4CisjZGVmaW5lIERTT19GX1dJTjMyX0JJTkRfVkFSCQkJCSAxMTkKKyNkZWZpbmUgRFNPX0ZfV0lOMzJfR0xPQkFMTE9PS1VQCQkJIDE0MgorI2RlZmluZSBEU09fRl9XSU4zMl9HTE9CQUxMT09LVVBfRlVOQwkJCSAxNDMKKyNkZWZpbmUgRFNPX0ZfV0lOMzJfSk9JTkVSCQkJCSAxMzUKKyNkZWZpbmUgRFNPX0ZfV0lOMzJfTE9BRAkJCQkgMTIwCisjZGVmaW5lIERTT19GX1dJTjMyX01FUkdFUgkJCQkgMTM0CisjZGVmaW5lIERTT19GX1dJTjMyX05BTUVfQ09OVkVSVEVSCQkJIDEyNQorI2RlZmluZSBEU09fRl9XSU4zMl9QQVRIQllBRERSCQkJCSAxNDEKKyNkZWZpbmUgRFNPX0ZfV0lOMzJfU1BMSVRURVIJCQkJIDEzNgorI2RlZmluZSBEU09fRl9XSU4zMl9VTkxPQUQJCQkJIDEyMQorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIERTT19SX0NUUkxfRkFJTEVECQkJCSAxMDAKKyNkZWZpbmUgRFNPX1JfRFNPX0FMUkVBRFlfTE9BREVECQkJIDExMAorI2RlZmluZSBEU09fUl9FTVBUWV9GSUxFX1NUUlVDVFVSRQkJCSAxMTMKKyNkZWZpbmUgRFNPX1JfRkFJTFVSRQkJCQkJIDExNAorI2RlZmluZSBEU09fUl9GSUxFTkFNRV9UT09fQklHCQkJCSAxMDEKKyNkZWZpbmUgRFNPX1JfRklOSVNIX0ZBSUxFRAkJCQkgMTAyCisjZGVmaW5lIERTT19SX0lOQ09SUkVDVF9GSUxFX1NZTlRBWAkJCSAxMTUKKyNkZWZpbmUgRFNPX1JfTE9BRF9GQUlMRUQJCQkJIDEwMworI2RlZmluZSBEU09fUl9OQU1FX1RSQU5TTEFUSU9OX0ZBSUxFRAkJCSAxMDkKKyNkZWZpbmUgRFNPX1JfTk9fRklMRU5BTUUJCQkJIDExMQorI2RlZmluZSBEU09fUl9OT19GSUxFX1NQRUNJRklDQVRJT04JCQkgMTE2CisjZGVmaW5lIERTT19SX05VTExfSEFORExFCQkJCSAxMDQKKyNkZWZpbmUgRFNPX1JfU0VUX0ZJTEVOQU1FX0ZBSUxFRAkJCSAxMTIKKyNkZWZpbmUgRFNPX1JfU1RBQ0tfRVJST1IJCQkJIDEwNQorI2RlZmluZSBEU09fUl9TWU1fRkFJTFVSRQkJCQkgMTA2CisjZGVmaW5lIERTT19SX1VOTE9BRF9GQUlMRUQJCQkJIDEwNworI2RlZmluZSBEU09fUl9VTlNVUFBPUlRFRAkJCQkgMTA4CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19kbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fZGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzQyMzZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fZGwuYwpAQCAtMCwwICsxLDM5MyBAQAorLyogZHNvX2RsLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZHNvLmg+CisKKyNpZm5kZWYgRFNPX0RMCitEU09fTUVUSE9EICpEU09fTUVUSE9EX2RsKHZvaWQpCisgICAgICAgeworICAgICAgIHJldHVybiBOVUxMOworICAgICAgIH0KKyNlbHNlCisKKyNpbmNsdWRlIDxkbC5oPgorCisvKiBQYXJ0IG9mIHRoZSBoYWNrIGluICJkbF9sb2FkIiAuLi4gKi8KKyNkZWZpbmUgRFNPX01BWF9UUkFOU0xBVEVEX1NJWkUgMjU2CisKK3N0YXRpYyBpbnQgZGxfbG9hZChEU08gKmRzbyk7CitzdGF0aWMgaW50IGRsX3VubG9hZChEU08gKmRzbyk7CitzdGF0aWMgdm9pZCAqZGxfYmluZF92YXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworc3RhdGljIERTT19GVU5DX1RZUEUgZGxfYmluZF9mdW5jKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKTsKKyNpZiAwCitzdGF0aWMgaW50IGRsX3VuYmluZF92YXIoRFNPICpkc28sIGNoYXIgKnN5bW5hbWUsIHZvaWQgKnN5bXB0cik7CitzdGF0aWMgaW50IGRsX3VuYmluZF9mdW5jKERTTyAqZHNvLCBjaGFyICpzeW1uYW1lLCBEU09fRlVOQ19UWVBFIHN5bXB0cik7CitzdGF0aWMgaW50IGRsX2luaXQoRFNPICpkc28pOworc3RhdGljIGludCBkbF9maW5pc2goRFNPICpkc28pOworc3RhdGljIGludCBkbF9jdHJsKERTTyAqZHNvLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOworI2VuZGlmCitzdGF0aWMgY2hhciAqZGxfbmFtZV9jb252ZXJ0ZXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3N0YXRpYyBjaGFyICpkbF9tZXJnZXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVzcGVjMSwgY29uc3QgY2hhciAqZmlsZXNwZWMyKTsKK3N0YXRpYyBpbnQgZGxfcGF0aGJ5YWRkcih2b2lkICphZGRyLGNoYXIgKnBhdGgsaW50IHN6KTsKK3N0YXRpYyB2b2lkICpkbF9nbG9iYWxsb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisKK3N0YXRpYyBEU09fTUVUSE9EIGRzb19tZXRoX2RsID0geworCSJPcGVuU1NMICdkbCcgc2hhcmVkIGxpYnJhcnkgbWV0aG9kIiwKKwlkbF9sb2FkLAorCWRsX3VubG9hZCwKKwlkbF9iaW5kX3ZhciwKKwlkbF9iaW5kX2Z1bmMsCisvKiBGb3Igbm93LCAidW5iaW5kIiBkb2Vzbid0IGV4aXN0ICovCisjaWYgMAorCU5VTEwsIC8qIHVuYmluZF92YXIgKi8KKwlOVUxMLCAvKiB1bmJpbmRfZnVuYyAqLworI2VuZGlmCisJTlVMTCwgLyogY3RybCAqLworCWRsX25hbWVfY29udmVydGVyLAorCWRsX21lcmdlciwKKwlOVUxMLCAvKiBpbml0ICovCisJTlVMTCwgLyogZmluaXNoICovCisJZGxfcGF0aGJ5YWRkciwKKwlkbF9nbG9iYWxsb29rdXAKKwl9OworCitEU09fTUVUSE9EICpEU09fTUVUSE9EX2RsKHZvaWQpCisJeworCXJldHVybigmZHNvX21ldGhfZGwpOworCX0KKworLyogRm9yIHRoaXMgRFNPX01FVEhPRCwgb3VyIG1ldGhfZGF0YSBTVEFDSyB3aWxsIGNvbnRhaW47CisgKiAoaSkgdGhlIGhhbmRsZSAoc2hsX3QpIHJldHVybmVkIGZyb20gc2hsX2xvYWQoKS4KKyAqIE5COiBJIGNoZWNrZWQgb24gSFBVWDExIGFuZCBzaGxfdCBpcyBpdHNlbGYgYSBwb2ludGVyCisgKiB0eXBlIHNvIHRoZSBjYXN0IGlzIHNhZmUuCisgKi8KKworc3RhdGljIGludCBkbF9sb2FkKERTTyAqZHNvKQorCXsKKwlzaGxfdCBwdHIgPSBOVUxMOworCS8qIFdlIGRvbid0IGRvIGFueSBmYW5jeSByZXRyaWVzIG9yIGFueXRoaW5nLCBqdXN0IHRha2UgdGhlIG1ldGhvZCdzCisJICogKG9yIERTTydzIGlmIGl0IGhhcyB0aGUgY2FsbGJhY2sgc2V0KSBiZXN0IHRyYW5zbGF0aW9uIG9mIHRoZQorCSAqIHBsYXRmb3JtLWluZGVwZW5kYW50IGZpbGVuYW1lIGFuZCB0cnkgb25jZSB3aXRoIHRoYXQuICovCisJY2hhciAqZmlsZW5hbWU9IERTT19jb252ZXJ0X2ZpbGVuYW1lKGRzbywgTlVMTCk7CisKKwlpZihmaWxlbmFtZSA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9ETF9MT0FELERTT19SX05PX0ZJTEVOQU1FKTsKKwkJZ290byBlcnI7CisJCX0KKwlwdHIgPSBzaGxfbG9hZChmaWxlbmFtZSwgQklORF9JTU1FRElBVEUgfAorCQkoZHNvLT5mbGFncyZEU09fRkxBR19OT19OQU1FX1RSQU5TTEFUSU9OPzA6RFlOQU1JQ19QQVRIKSwgMEwpOworCWlmKHB0ciA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9ETF9MT0FELERTT19SX0xPQURfRkFJTEVEKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJmaWxlbmFtZSgiLCBmaWxlbmFtZSwgIik6ICIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlnb3RvIGVycjsKKwkJfQorCWlmKCFza19wdXNoKGRzby0+bWV0aF9kYXRhLCAoY2hhciAqKXB0cikpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMX0xPQUQsRFNPX1JfU1RBQ0tfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCS8qIFN1Y2Nlc3MsIHN0aWNrIHRoZSBjb252ZXJ0ZWQgZmlsZW5hbWUgd2UndmUgbG9hZGVkIHVuZGVyIGludG8gdGhlIERTTworCSAqIChpdCBhbHNvIHNlcnZlcyBhcyB0aGUgaW5kaWNhdG9yIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBsb2FkZWQpLiAqLworCWRzby0+bG9hZGVkX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisJcmV0dXJuKDEpOworZXJyOgorCS8qIENsZWFudXAhICovCisJaWYoZmlsZW5hbWUgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKGZpbGVuYW1lKTsKKwlpZihwdHIgIT0gTlVMTCkKKwkJc2hsX3VubG9hZChwdHIpOworCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyBpbnQgZGxfdW5sb2FkKERTTyAqZHNvKQorCXsKKwlzaGxfdCBwdHI7CisJaWYoZHNvID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMX1VOTE9BRCxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZihza19udW0oZHNvLT5tZXRoX2RhdGEpIDwgMSkKKwkJcmV0dXJuKDEpOworCS8qIElzIHRoaXMgc3RhdGVtZW50IGxlZ2FsPyAqLworCXB0ciA9IChzaGxfdClza19wb3AoZHNvLT5tZXRoX2RhdGEpOworCWlmKHB0ciA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9ETF9VTkxPQUQsRFNPX1JfTlVMTF9IQU5ETEUpOworCQkvKiBTaG91bGQgcHVzaCB0aGUgdmFsdWUgYmFjayBvbnRvIHRoZSBzdGFjayBpbgorCQkgKiBjYXNlIG9mIGEgcmV0cnkuICovCisJCXNrX3B1c2goZHNvLT5tZXRoX2RhdGEsIChjaGFyICopcHRyKTsKKwkJcmV0dXJuKDApOworCQl9CisJc2hsX3VubG9hZChwdHIpOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyB2b2lkICpkbF9iaW5kX3ZhcihEU08gKmRzbywgY29uc3QgY2hhciAqc3ltbmFtZSkKKwl7CisJc2hsX3QgcHRyOworCXZvaWQgKnN5bTsKKworCWlmKChkc28gPT0gTlVMTCkgfHwgKHN5bW5hbWUgPT0gTlVMTCkpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMX0JJTkRfVkFSLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmKHNrX251bShkc28tPm1ldGhfZGF0YSkgPCAxKQorCQl7CisJCURTT2VycihEU09fRl9ETF9CSU5EX1ZBUixEU09fUl9TVEFDS19FUlJPUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXB0ciA9IChzaGxfdClza192YWx1ZShkc28tPm1ldGhfZGF0YSwgc2tfbnVtKGRzby0+bWV0aF9kYXRhKSAtIDEpOworCWlmKHB0ciA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9ETF9CSU5EX1ZBUixEU09fUl9OVUxMX0hBTkRMRSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmIChzaGxfZmluZHN5bSgmcHRyLCBzeW1uYW1lLCBUWVBFX1VOREVGSU5FRCwgJnN5bSkgPCAwKQorCQl7CisJCURTT2VycihEU09fRl9ETF9CSU5EX1ZBUixEU09fUl9TWU1fRkFJTFVSRSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSg0LCAic3ltbmFtZSgiLCBzeW1uYW1lLCAiKTogIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXJldHVybihzeW0pOworCX0KKworc3RhdGljIERTT19GVU5DX1RZUEUgZGxfYmluZF9mdW5jKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKQorCXsKKwlzaGxfdCBwdHI7CisJdm9pZCAqc3ltOworCisJaWYoKGRzbyA9PSBOVUxMKSB8fCAoc3ltbmFtZSA9PSBOVUxMKSkKKwkJeworCQlEU09lcnIoRFNPX0ZfRExfQklORF9GVU5DLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmKHNrX251bShkc28tPm1ldGhfZGF0YSkgPCAxKQorCQl7CisJCURTT2VycihEU09fRl9ETF9CSU5EX0ZVTkMsRFNPX1JfU1RBQ0tfRVJST1IpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlwdHIgPSAoc2hsX3Qpc2tfdmFsdWUoZHNvLT5tZXRoX2RhdGEsIHNrX251bShkc28tPm1ldGhfZGF0YSkgLSAxKTsKKwlpZihwdHIgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRExfQklORF9GVU5DLERTT19SX05VTExfSEFORExFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYgKHNobF9maW5kc3ltKCZwdHIsIHN5bW5hbWUsIFRZUEVfVU5ERUZJTkVELCAmc3ltKSA8IDApCisJCXsKKwkJRFNPZXJyKERTT19GX0RMX0JJTkRfRlVOQyxEU09fUl9TWU1fRkFJTFVSRSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSg0LCAic3ltbmFtZSgiLCBzeW1uYW1lLCAiKTogIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXJldHVybigoRFNPX0ZVTkNfVFlQRSlzeW0pOworCX0KKworc3RhdGljIGNoYXIgKmRsX21lcmdlcihEU08gKmRzbywgY29uc3QgY2hhciAqZmlsZXNwZWMxLCBjb25zdCBjaGFyICpmaWxlc3BlYzIpCisJeworCWNoYXIgKm1lcmdlZDsKKworCWlmKCFmaWxlc3BlYzEgJiYgIWZpbGVzcGVjMikKKwkJeworCQlEU09lcnIoRFNPX0ZfRExfTUVSR0VSLAorCQkJCUVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCS8qIElmIHRoZSBmaXJzdCBmaWxlIHNwZWNpZmljYXRpb24gaXMgYSByb290ZWQgcGF0aCwgaXQgcnVsZXMuCisJICAgc2FtZSBnb2VzIGlmIHRoZSBzZWNvbmQgZmlsZSBzcGVjaWZpY2F0aW9uIGlzIG1pc3NpbmcuICovCisJaWYgKCFmaWxlc3BlYzIgfHwgZmlsZXNwZWMxWzBdID09ICcvJykKKwkJeworCQltZXJnZWQgPSBPUEVOU1NMX21hbGxvYyhzdHJsZW4oZmlsZXNwZWMxKSArIDEpOworCQlpZighbWVyZ2VkKQorCQkJeworCQkJRFNPZXJyKERTT19GX0RMX01FUkdFUiwKKwkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCXN0cmNweShtZXJnZWQsIGZpbGVzcGVjMSk7CisJCX0KKwkvKiBJZiB0aGUgZmlyc3QgZmlsZSBzcGVjaWZpY2F0aW9uIGlzIG1pc3NpbmcsIHRoZSBzZWNvbmQgb25lIHJ1bGVzLiAqLworCWVsc2UgaWYgKCFmaWxlc3BlYzEpCisJCXsKKwkJbWVyZ2VkID0gT1BFTlNTTF9tYWxsb2Moc3RybGVuKGZpbGVzcGVjMikgKyAxKTsKKwkJaWYoIW1lcmdlZCkKKwkJCXsKKwkJCURTT2VycihEU09fRl9ETF9NRVJHRVIsCisJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQlzdHJjcHkobWVyZ2VkLCBmaWxlc3BlYzIpOworCQl9CisJZWxzZQorCQkvKiBUaGlzIHBhcnQgaXNuJ3QgYXMgdHJpdmlhbCBhcyBpdCBsb29rcy4gIEl0IGFzc3VtZXMgdGhhdAorCQkgICB0aGUgc2Vjb25kIGZpbGUgc3BlY2lmaWNhdGlvbiByZWFsbHkgaXMgYSBkaXJlY3RvcnksIGFuZAorCQkgICBtYWtlcyBubyBjaGVja3Mgd2hhdHNvZXZlci4gIFRoZXJlZm9yZSwgdGhlIHJlc3VsdCBiZWNvbWVzCisJCSAgIHRoZSBjb25jYXRlbmF0aW9uIG9mIGZpbGVzcGVjMiBmb2xsb3dlZCBieSBhIHNsYXNoIGZvbGxvd2VkCisJCSAgIGJ5IGZpbGVzcGVjMS4gKi8KKwkJeworCQlpbnQgc3BlYzJsZW4sIGxlbjsKKworCQlzcGVjMmxlbiA9IChmaWxlc3BlYzIgPyBzdHJsZW4oZmlsZXNwZWMyKSA6IDApOworCQlsZW4gPSBzcGVjMmxlbiArIChmaWxlc3BlYzEgPyBzdHJsZW4oZmlsZXNwZWMxKSA6IDApOworCisJCWlmKGZpbGVzcGVjMiAmJiBmaWxlc3BlYzJbc3BlYzJsZW4gLSAxXSA9PSAnLycpCisJCQl7CisJCQlzcGVjMmxlbi0tOworCQkJbGVuLS07CisJCQl9CisJCW1lcmdlZCA9IE9QRU5TU0xfbWFsbG9jKGxlbiArIDIpOworCQlpZighbWVyZ2VkKQorCQkJeworCQkJRFNPZXJyKERTT19GX0RMX01FUkdFUiwKKwkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCXN0cmNweShtZXJnZWQsIGZpbGVzcGVjMik7CisJCW1lcmdlZFtzcGVjMmxlbl0gPSAnLyc7CisJCXN0cmNweSgmbWVyZ2VkW3NwZWMybGVuICsgMV0sIGZpbGVzcGVjMSk7CisJCX0KKwlyZXR1cm4obWVyZ2VkKTsKKwl9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgaW4gZHNvX2RsZmNuLmMsIGJ1dCBhcyBpdCBpcyBoaWdobHkKKyAqIHVubGlrZWx5IHRoYXQgYm90aCB0aGUgImRsIiAqYW5kKiAiZGxmY24iIHZhcmlhbnRzIGFyZSBiZWluZyBjb21waWxlZCBhdCB0aGUKKyAqIHNhbWUgdGltZSwgdGhlcmUncyBubyBncmVhdCBkdXBsaWNhdGluZyB0aGUgY29kZS4gRmlndXJpbmcgb3V0IGFuIGVsZWdhbnQgCisgKiB3YXkgdG8gc2hhcmUgb25lIGNvcHkgb2YgdGhlIGNvZGUgd291bGQgYmUgbW9yZSBkaWZmaWN1bHQgYW5kIHdvdWxkIG5vdAorICogbGVhdmUgdGhlIGltcGxlbWVudGF0aW9ucyBpbmRlcGVuZGFudC4gKi8KKyNpZiBkZWZpbmVkKF9faHB1eCkKK3N0YXRpYyBjb25zdCBjaGFyIGV4dGVuc2lvbltdID0gIi5zbCI7CisjZWxzZQorc3RhdGljIGNvbnN0IGNoYXIgZXh0ZW5zaW9uW10gPSAiLnNvIjsKKyNlbmRpZgorc3RhdGljIGNoYXIgKmRsX25hbWVfY29udmVydGVyKERTTyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKKwl7CisJY2hhciAqdHJhbnNsYXRlZDsKKwlpbnQgbGVuLCByc2l6ZSwgdHJhbnNmb3JtOworCisJbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwlyc2l6ZSA9IGxlbiArIDE7CisJdHJhbnNmb3JtID0gKHN0cnN0cihmaWxlbmFtZSwgIi8iKSA9PSBOVUxMKTsKKwkJeworCQkvKiBXZSB3aWxsIGNvbnZlcnQgdGhpcyB0byAiJXMucz8iIG9yICJsaWIlcy5zPyIgKi8KKwkJcnNpemUgKz0gc3RybGVuKGV4dGVuc2lvbik7LyogVGhlIGxlbmd0aCBvZiAiLnM/IiAqLworCQlpZiAoKERTT19mbGFncyhkc28pICYgRFNPX0ZMQUdfTkFNRV9UUkFOU0xBVElPTl9FWFRfT05MWSkgPT0gMCkKKwkJCXJzaXplICs9IDM7IC8qIFRoZSBsZW5ndGggb2YgImxpYiIgKi8KKwkJfQorCXRyYW5zbGF0ZWQgPSBPUEVOU1NMX21hbGxvYyhyc2l6ZSk7CisJaWYodHJhbnNsYXRlZCA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9ETF9OQU1FX0NPTlZFUlRFUiwKKwkJCQlEU09fUl9OQU1FX1RSQU5TTEFUSU9OX0ZBSUxFRCk7IAorCQlyZXR1cm4oTlVMTCk7ICAgCisJCX0KKwlpZih0cmFuc2Zvcm0pCisJCXsKKwkJaWYgKChEU09fZmxhZ3MoZHNvKSAmIERTT19GTEFHX05BTUVfVFJBTlNMQVRJT05fRVhUX09OTFkpID09IDApCisJCQlzcHJpbnRmKHRyYW5zbGF0ZWQsICJsaWIlcyVzIiwgZmlsZW5hbWUsIGV4dGVuc2lvbik7CisJCWVsc2UKKwkJCXNwcmludGYodHJhbnNsYXRlZCwgIiVzJXMiLCBmaWxlbmFtZSwgZXh0ZW5zaW9uKTsKKwkJfQorCWVsc2UKKwkJc3ByaW50Zih0cmFuc2xhdGVkLCAiJXMiLCBmaWxlbmFtZSk7CisJcmV0dXJuKHRyYW5zbGF0ZWQpOworCX0KKworc3RhdGljIGludCBkbF9wYXRoYnlhZGRyKHZvaWQgKmFkZHIsY2hhciAqcGF0aCxpbnQgc3opCisJeworCXN0cnVjdCBzaGxfZGVzY3JpcHRvciBpbmY7CisJaW50IGksbGVuOworCisJaWYgKGFkZHIgPT0gTlVMTCkKKwkJeworCQl1bmlvbgl7IGludCgqZikodm9pZCosY2hhciosaW50KTsgdm9pZCAqcDsgfSB0ID0KKwkJCXsgZGxfcGF0aGJ5YWRkciB9OworCQlhZGRyID0gdC5wOworCQl9CisKKwlmb3IgKGk9LTE7c2hsX2dldF9yKGksJmluZik9PTA7aSsrKQorCQl7CisJCWlmICgoKHNpemVfdClhZGRyID49IGluZi50c3RhcnQgJiYgKHNpemVfdClhZGRyIDwgaW5mLnRlbmQpIHx8CisJCSAgICAoKHNpemVfdClhZGRyID49IGluZi5kc3RhcnQgJiYgKHNpemVfdClhZGRyIDwgaW5mLmRlbmQpKQorCQkJeworCQkJbGVuID0gKGludClzdHJsZW4oaW5mLmZpbGVuYW1lKTsKKwkJCWlmIChzeiA8PSAwKSByZXR1cm4gbGVuKzE7CisJCQlpZiAobGVuID49IHN6KSBsZW49c3otMTsKKwkJCW1lbWNweShwYXRoLGluZi5maWxlbmFtZSxsZW4pOworCQkJcGF0aFtsZW4rK10gPSAwOworCQkJcmV0dXJuIGxlbjsKKwkJCX0KKwkJfQorCisJcmV0dXJuIC0xOworCX0KKworc3RhdGljIHZvaWQgKmRsX2dsb2JhbGxvb2t1cChjb25zdCBjaGFyICpuYW1lKQorCXsKKwl2b2lkICpyZXQ7CisJc2hsX3QgaCA9IE5VTEw7CisKKwlyZXR1cm4gc2hsX2ZpbmRzeW0oJmgsbmFtZSxUWVBFX1VOREVGSU5FRCwmcmV0KSA/IE5VTEwgOiByZXQ7CisJfQorI2VuZGlmIC8qIERTT19ETCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fZGxmY24uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2RsZmNuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiZDMyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2RsZmNuLmMKQEAgLTAsMCArMSw0ODIgQEAKKy8qIGRzb19kbGZjbi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IEdlb2ZmIFRob3JwZSAoZ2VvZmZAZ2VvZmZ0aG9ycGUubmV0KSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBXZSBuZWVkIHRvIGRvIHRoaXMgZWFybHksIGJlY2F1c2Ugc3RkaW8uaCBpbmNsdWRlcyB0aGUgaGVhZGVyIGZpbGVzCisgICB0aGF0IGhhbmRsZSBfR05VX1NPVVJDRSBhbmQgb3RoZXIgc2ltaWxhciBtYWNyb3MuICBEZWZpbmluZyBpdCBsYXRlcgorICAgaXMgc2ltcGx5IHRvbyBsYXRlLCBiZWNhdXNlIHRob3NlIGhlYWRlcnMgYXJlIHByb3RlY3RlZCBmcm9tIHJlLQorICAgaW5jbHVzaW9uLiAgKi8KKyNpZmRlZiBfX2xpbnV4CisjIGlmbmRlZiBfR05VX1NPVVJDRQorIyAgZGVmaW5lIF9HTlVfU09VUkNFCS8qIG1ha2Ugc3VyZSBkbGFkZHIgaXMgZGVjbGFyZWQgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZHNvLmg+CisKKyNpZm5kZWYgRFNPX0RMRkNOCitEU09fTUVUSE9EICpEU09fTUVUSE9EX2RsZmNuKHZvaWQpCisJeworCXJldHVybiBOVUxMOworCX0KKyNlbHNlCisKKyNpZmRlZiBIQVZFX0RMRkNOX0gKKyMgaWZkZWYgX19vc2ZfXworIyAgZGVmaW5lIF9fRVhURU5TSU9OU19fCisjIGVuZGlmCisjIGluY2x1ZGUgPGRsZmNuLmg+CisjIGRlZmluZSBIQVZFX0RMSU5GTyAxCisjIGlmIGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBcCisgICAgIGRlZmluZWQoX19TQ09fVkVSU0lPTl9fKSB8fCBkZWZpbmVkKF9TQ09fRUxGKSB8fCBcCisgICAgIChkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChSVExEX1NFTEYpKQorIyAgdW5kZWYgSEFWRV9ETElORk8KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQYXJ0IG9mIHRoZSBoYWNrIGluICJkbGZjbl9sb2FkIiAuLi4gKi8KKyNkZWZpbmUgRFNPX01BWF9UUkFOU0xBVEVEX1NJWkUgMjU2CisKK3N0YXRpYyBpbnQgZGxmY25fbG9hZChEU08gKmRzbyk7CitzdGF0aWMgaW50IGRsZmNuX3VubG9hZChEU08gKmRzbyk7CitzdGF0aWMgdm9pZCAqZGxmY25fYmluZF92YXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworc3RhdGljIERTT19GVU5DX1RZUEUgZGxmY25fYmluZF9mdW5jKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKTsKKyNpZiAwCitzdGF0aWMgaW50IGRsZmNuX3VuYmluZChEU08gKmRzbywgY2hhciAqc3ltbmFtZSwgdm9pZCAqc3ltcHRyKTsKK3N0YXRpYyBpbnQgZGxmY25faW5pdChEU08gKmRzbyk7CitzdGF0aWMgaW50IGRsZmNuX2ZpbmlzaChEU08gKmRzbyk7CitzdGF0aWMgbG9uZyBkbGZjbl9jdHJsKERTTyAqZHNvLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOworI2VuZGlmCitzdGF0aWMgY2hhciAqZGxmY25fbmFtZV9jb252ZXJ0ZXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3N0YXRpYyBjaGFyICpkbGZjbl9tZXJnZXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVzcGVjMSwKKwljb25zdCBjaGFyICpmaWxlc3BlYzIpOworc3RhdGljIGludCBkbGZjbl9wYXRoYnlhZGRyKHZvaWQgKmFkZHIsY2hhciAqcGF0aCxpbnQgc3opOworc3RhdGljIHZvaWQgKmRsZmNuX2dsb2JhbGxvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKKworc3RhdGljIERTT19NRVRIT0QgZHNvX21ldGhfZGxmY24gPSB7CisJIk9wZW5TU0wgJ2RsZmNuJyBzaGFyZWQgbGlicmFyeSBtZXRob2QiLAorCWRsZmNuX2xvYWQsCisJZGxmY25fdW5sb2FkLAorCWRsZmNuX2JpbmRfdmFyLAorCWRsZmNuX2JpbmRfZnVuYywKKy8qIEZvciBub3csICJ1bmJpbmQiIGRvZXNuJ3QgZXhpc3QgKi8KKyNpZiAwCisJTlVMTCwgLyogdW5iaW5kX3ZhciAqLworCU5VTEwsIC8qIHVuYmluZF9mdW5jICovCisjZW5kaWYKKwlOVUxMLCAvKiBjdHJsICovCisJZGxmY25fbmFtZV9jb252ZXJ0ZXIsCisJZGxmY25fbWVyZ2VyLAorCU5VTEwsIC8qIGluaXQgKi8KKwlOVUxMLCAvKiBmaW5pc2ggKi8KKwlkbGZjbl9wYXRoYnlhZGRyLAorCWRsZmNuX2dsb2JhbGxvb2t1cAorCX07CisKK0RTT19NRVRIT0QgKkRTT19NRVRIT0RfZGxmY24odm9pZCkKKwl7CisJcmV0dXJuKCZkc29fbWV0aF9kbGZjbik7CisJfQorCisvKiBQcmlvciB0byB1c2luZyB0aGUgZGxvcGVuKCkgZnVuY3Rpb24sIHdlIHNob3VsZCBkZWNpZGUgb24gdGhlIGZsYWcKKyAqIHdlIHNlbmQuIFRoZXJlJ3MgYSBmZXcgZGlmZmVyZW50IHdheXMgb2YgZG9pbmcgdGhpcyBhbmQgaXQncyBhCisgKiBtZXNzeSB2ZW5uLWRpYWdyYW0gdG8gbWF0Y2ggdXAgd2hpY2ggcGxhdGZvcm1zIHN1cHBvcnQgd2hhdC4gU28KKyAqIGFzIHdlIGRvbid0IGhhdmUgYXV0b2NvbmYgeWV0LCBJJ20gaW1wbGVtZW50aW5nIGEgaGFjayB0aGF0IGNvdWxkCisgKiBiZSBoYWNrZWQgZnVydGhlciByZWxhdGl2ZWx5IGVhc2lseSB0byBkZWFsIHdpdGggY2FzZXMgYXMgd2UgZmluZAorICogdGhlbS4gSW5pdGlhbGx5IHRoaXMgaXMgdG8gY29wZSB3aXRoIE9wZW5CU0QuICovCisjaWYgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKQorIwlpZmRlZiBETF9MQVpZCisjCQlkZWZpbmUgRExPUEVOX0ZMQUcgRExfTEFaWQorIwllbHNlCisjCQlpZmRlZiBSVExEX05PVworIwkJCWRlZmluZSBETE9QRU5fRkxBRyBSVExEX05PVworIwkJZWxzZQorIwkJCWRlZmluZSBETE9QRU5fRkxBRyAwCisjCQllbmRpZgorIwllbmRpZgorI2Vsc2UKKyMJaWZkZWYgT1BFTlNTTF9TWVNfU1VOT1MKKyMJCWRlZmluZSBETE9QRU5fRkxBRyAxCisjCWVsc2UKKyMJCWRlZmluZSBETE9QRU5fRkxBRyBSVExEX05PVyAvKiBIb3BlIHRoaXMgd29ya3MgZXZlcnl3aGVyZSBlbHNlICovCisjCWVuZGlmCisjZW5kaWYKKworLyogRm9yIHRoaXMgRFNPX01FVEhPRCwgb3VyIG1ldGhfZGF0YSBTVEFDSyB3aWxsIGNvbnRhaW47CisgKiAoaSkgdGhlIGhhbmRsZSAodm9pZCopIHJldHVybmVkIGZyb20gZGxvcGVuKCkuCisgKi8KKworc3RhdGljIGludCBkbGZjbl9sb2FkKERTTyAqZHNvKQorCXsKKwl2b2lkICpwdHIgPSBOVUxMOworCS8qIFNlZSBhcHBsaWNhYmxlIGNvbW1lbnRzIGluIGRzb19kbC5jICovCisJY2hhciAqZmlsZW5hbWUgPSBEU09fY29udmVydF9maWxlbmFtZShkc28sIE5VTEwpOworCWludCBmbGFncyA9IERMT1BFTl9GTEFHOworCisJaWYoZmlsZW5hbWUgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRExGQ05fTE9BRCxEU09fUl9OT19GSUxFTkFNRSk7CisJCWdvdG8gZXJyOworCQl9CisKKyNpZmRlZiBSVExEX0dMT0JBTAorCWlmIChkc28tPmZsYWdzICYgRFNPX0ZMQUdfR0xPQkFMX1NZTUJPTFMpCisJCWZsYWdzIHw9IFJUTERfR0xPQkFMOworI2VuZGlmCisJcHRyID0gZGxvcGVuKGZpbGVuYW1lLCBmbGFncyk7CisJaWYocHRyID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMRkNOX0xPQUQsRFNPX1JfTE9BRF9GQUlMRUQpOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwgImZpbGVuYW1lKCIsIGZpbGVuYW1lLCAiKTogIiwgZGxlcnJvcigpKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZighc2tfdm9pZF9wdXNoKGRzby0+bWV0aF9kYXRhLCAoY2hhciAqKXB0cikpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMRkNOX0xPQUQsRFNPX1JfU1RBQ0tfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCS8qIFN1Y2Nlc3MgKi8KKwlkc28tPmxvYWRlZF9maWxlbmFtZSA9IGZpbGVuYW1lOworCXJldHVybigxKTsKK2VycjoKKwkvKiBDbGVhbnVwISAqLworCWlmKGZpbGVuYW1lICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShmaWxlbmFtZSk7CisJaWYocHRyICE9IE5VTEwpCisJCWRsY2xvc2UocHRyKTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBpbnQgZGxmY25fdW5sb2FkKERTTyAqZHNvKQorCXsKKwl2b2lkICpwdHI7CisJaWYoZHNvID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMRkNOX1VOTE9BRCxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZihza192b2lkX251bShkc28tPm1ldGhfZGF0YSkgPCAxKQorCQlyZXR1cm4oMSk7CisJcHRyID0gc2tfdm9pZF9wb3AoZHNvLT5tZXRoX2RhdGEpOworCWlmKHB0ciA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9ETEZDTl9VTkxPQUQsRFNPX1JfTlVMTF9IQU5ETEUpOworCQkvKiBTaG91bGQgcHVzaCB0aGUgdmFsdWUgYmFjayBvbnRvIHRoZSBzdGFjayBpbgorCQkgKiBjYXNlIG9mIGEgcmV0cnkuICovCisJCXNrX3ZvaWRfcHVzaChkc28tPm1ldGhfZGF0YSwgcHRyKTsKKwkJcmV0dXJuKDApOworCQl9CisJLyogRm9yIG5vdyBJJ20gbm90IGF3YXJlIG9mIGFueSBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIGRsY2xvc2UoKSAqLworCWRsY2xvc2UocHRyKTsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgdm9pZCAqZGxmY25fYmluZF92YXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpCisJeworCXZvaWQgKnB0ciwgKnN5bTsKKworCWlmKChkc28gPT0gTlVMTCkgfHwgKHN5bW5hbWUgPT0gTlVMTCkpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMRkNOX0JJTkRfVkFSLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmKHNrX3ZvaWRfbnVtKGRzby0+bWV0aF9kYXRhKSA8IDEpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMRkNOX0JJTkRfVkFSLERTT19SX1NUQUNLX0VSUk9SKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcHRyID0gc2tfdm9pZF92YWx1ZShkc28tPm1ldGhfZGF0YSwgc2tfdm9pZF9udW0oZHNvLT5tZXRoX2RhdGEpIC0gMSk7CisJaWYocHRyID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMRkNOX0JJTkRfVkFSLERTT19SX05VTExfSEFORExFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJc3ltID0gZGxzeW0ocHRyLCBzeW1uYW1lKTsKKwlpZihzeW0gPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRExGQ05fQklORF9WQVIsRFNPX1JfU1lNX0ZBSUxVUkUpOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwgInN5bW5hbWUoIiwgc3ltbmFtZSwgIik6ICIsIGRsZXJyb3IoKSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXJldHVybihzeW0pOworCX0KKworc3RhdGljIERTT19GVU5DX1RZUEUgZGxmY25fYmluZF9mdW5jKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKQorCXsKKwl2b2lkICpwdHI7CisJdW5pb24geworCQlEU09fRlVOQ19UWVBFIHN5bTsKKwkJdm9pZCAqZGxyZXQ7CisJfSB1OworCisJaWYoKGRzbyA9PSBOVUxMKSB8fCAoc3ltbmFtZSA9PSBOVUxMKSkKKwkJeworCQlEU09lcnIoRFNPX0ZfRExGQ05fQklORF9GVU5DLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmKHNrX3ZvaWRfbnVtKGRzby0+bWV0aF9kYXRhKSA8IDEpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMRkNOX0JJTkRfRlVOQyxEU09fUl9TVEFDS19FUlJPUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXB0ciA9IHNrX3ZvaWRfdmFsdWUoZHNvLT5tZXRoX2RhdGEsIHNrX3ZvaWRfbnVtKGRzby0+bWV0aF9kYXRhKSAtIDEpOworCWlmKHB0ciA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9ETEZDTl9CSU5EX0ZVTkMsRFNPX1JfTlVMTF9IQU5ETEUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwl1LmRscmV0ID0gZGxzeW0ocHRyLCBzeW1uYW1lKTsKKwlpZih1LmRscmV0ID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RMRkNOX0JJTkRfRlVOQyxEU09fUl9TWU1fRkFJTFVSRSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSg0LCAic3ltbmFtZSgiLCBzeW1uYW1lLCAiKTogIiwgZGxlcnJvcigpKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0dXJuIHUuc3ltOworCX0KKworc3RhdGljIGNoYXIgKmRsZmNuX21lcmdlcihEU08gKmRzbywgY29uc3QgY2hhciAqZmlsZXNwZWMxLAorCWNvbnN0IGNoYXIgKmZpbGVzcGVjMikKKwl7CisJY2hhciAqbWVyZ2VkOworCisJaWYoIWZpbGVzcGVjMSAmJiAhZmlsZXNwZWMyKQorCQl7CisJCURTT2VycihEU09fRl9ETEZDTl9NRVJHRVIsCisJCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJLyogSWYgdGhlIGZpcnN0IGZpbGUgc3BlY2lmaWNhdGlvbiBpcyBhIHJvb3RlZCBwYXRoLCBpdCBydWxlcy4KKwkgICBzYW1lIGdvZXMgaWYgdGhlIHNlY29uZCBmaWxlIHNwZWNpZmljYXRpb24gaXMgbWlzc2luZy4gKi8KKwlpZiAoIWZpbGVzcGVjMiB8fCAoZmlsZXNwZWMxICE9IE5VTEwgJiYgZmlsZXNwZWMxWzBdID09ICcvJykpCisJCXsKKwkJbWVyZ2VkID0gT1BFTlNTTF9tYWxsb2Moc3RybGVuKGZpbGVzcGVjMSkgKyAxKTsKKwkJaWYoIW1lcmdlZCkKKwkJCXsKKwkJCURTT2VycihEU09fRl9ETEZDTl9NRVJHRVIsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJc3RyY3B5KG1lcmdlZCwgZmlsZXNwZWMxKTsKKwkJfQorCS8qIElmIHRoZSBmaXJzdCBmaWxlIHNwZWNpZmljYXRpb24gaXMgbWlzc2luZywgdGhlIHNlY29uZCBvbmUgcnVsZXMuICovCisJZWxzZSBpZiAoIWZpbGVzcGVjMSkKKwkJeworCQltZXJnZWQgPSBPUEVOU1NMX21hbGxvYyhzdHJsZW4oZmlsZXNwZWMyKSArIDEpOworCQlpZighbWVyZ2VkKQorCQkJeworCQkJRFNPZXJyKERTT19GX0RMRkNOX01FUkdFUiwKKwkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCXN0cmNweShtZXJnZWQsIGZpbGVzcGVjMik7CisJCX0KKwllbHNlCisJCS8qIFRoaXMgcGFydCBpc24ndCBhcyB0cml2aWFsIGFzIGl0IGxvb2tzLiAgSXQgYXNzdW1lcyB0aGF0CisJCSAgIHRoZSBzZWNvbmQgZmlsZSBzcGVjaWZpY2F0aW9uIHJlYWxseSBpcyBhIGRpcmVjdG9yeSwgYW5kCisJCSAgIG1ha2VzIG5vIGNoZWNrcyB3aGF0c29ldmVyLiAgVGhlcmVmb3JlLCB0aGUgcmVzdWx0IGJlY29tZXMKKwkJICAgdGhlIGNvbmNhdGVuYXRpb24gb2YgZmlsZXNwZWMyIGZvbGxvd2VkIGJ5IGEgc2xhc2ggZm9sbG93ZWQKKwkJICAgYnkgZmlsZXNwZWMxLiAqLworCQl7CisJCWludCBzcGVjMmxlbiwgbGVuOworCisJCXNwZWMybGVuID0gc3RybGVuKGZpbGVzcGVjMik7CisJCWxlbiA9IHNwZWMybGVuICsgKGZpbGVzcGVjMSA/IHN0cmxlbihmaWxlc3BlYzEpIDogMCk7CisKKwkJaWYoZmlsZXNwZWMyICYmIGZpbGVzcGVjMltzcGVjMmxlbiAtIDFdID09ICcvJykKKwkJCXsKKwkJCXNwZWMybGVuLS07CisJCQlsZW4tLTsKKwkJCX0KKwkJbWVyZ2VkID0gT1BFTlNTTF9tYWxsb2MobGVuICsgMik7CisJCWlmKCFtZXJnZWQpCisJCQl7CisJCQlEU09lcnIoRFNPX0ZfRExGQ05fTUVSR0VSLAorCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJc3RyY3B5KG1lcmdlZCwgZmlsZXNwZWMyKTsKKwkJbWVyZ2VkW3NwZWMybGVuXSA9ICcvJzsKKwkJc3RyY3B5KCZtZXJnZWRbc3BlYzJsZW4gKyAxXSwgZmlsZXNwZWMxKTsKKwkJfQorCXJldHVybihtZXJnZWQpOworCX0KKworI2lmZGVmIE9QRU5TU0xfU1lTX01BQ09TWAorI2RlZmluZSBEU09fZXh0CSIuZHlsaWIiCisjZGVmaW5lIERTT19leHRsZW4gNgorI2Vsc2UKKyNkZWZpbmUgRFNPX2V4dAkiLnNvIgorI2RlZmluZSBEU09fZXh0bGVuIDMKKyNlbmRpZgorCisKK3N0YXRpYyBjaGFyICpkbGZjbl9uYW1lX2NvbnZlcnRlcihEU08gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUpCisJeworCWNoYXIgKnRyYW5zbGF0ZWQ7CisJaW50IGxlbiwgcnNpemUsIHRyYW5zZm9ybTsKKworCWxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisJcnNpemUgPSBsZW4gKyAxOworCXRyYW5zZm9ybSA9IChzdHJzdHIoZmlsZW5hbWUsICIvIikgPT0gTlVMTCk7CisJaWYodHJhbnNmb3JtKQorCQl7CisJCS8qIFdlIHdpbGwgY29udmVydCB0aGlzIHRvICIlcy5zbyIgb3IgImxpYiVzLnNvIiBldGMgKi8KKwkJcnNpemUgKz0gRFNPX2V4dGxlbjsJLyogVGhlIGxlbmd0aCBvZiAiLnNvIiAqLworCQlpZiAoKERTT19mbGFncyhkc28pICYgRFNPX0ZMQUdfTkFNRV9UUkFOU0xBVElPTl9FWFRfT05MWSkgPT0gMCkKKwkJCXJzaXplICs9IDM7IC8qIFRoZSBsZW5ndGggb2YgImxpYiIgKi8KKwkJfQorCXRyYW5zbGF0ZWQgPSBPUEVOU1NMX21hbGxvYyhyc2l6ZSk7CisJaWYodHJhbnNsYXRlZCA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9ETEZDTl9OQU1FX0NPTlZFUlRFUiwKKwkJCQlEU09fUl9OQU1FX1RSQU5TTEFUSU9OX0ZBSUxFRCk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmKHRyYW5zZm9ybSkKKwkJeworCQlpZiAoKERTT19mbGFncyhkc28pICYgRFNPX0ZMQUdfTkFNRV9UUkFOU0xBVElPTl9FWFRfT05MWSkgPT0gMCkKKwkJCXNwcmludGYodHJhbnNsYXRlZCwgImxpYiVzIiBEU09fZXh0LCBmaWxlbmFtZSk7CisJCWVsc2UKKwkJCXNwcmludGYodHJhbnNsYXRlZCwgIiVzIiBEU09fZXh0LCBmaWxlbmFtZSk7CisJCX0KKwllbHNlCisJCXNwcmludGYodHJhbnNsYXRlZCwgIiVzIiwgZmlsZW5hbWUpOworCXJldHVybih0cmFuc2xhdGVkKTsKKwl9CisKKyNpZmRlZiBfX3NnaQorLyoKK1RoaXMgaXMgYSBxdW90ZSBmcm9tIElSSVggbWFudWFsIGZvciBkbGFkZHIoM2MpOgorCisgICAgIDxkbGZjbi5oPiBkb2VzIG5vdCBjb250YWluIGEgcHJvdG90eXBlIGZvciBkbGFkZHIgb3IgZGVmaW5pdGlvbiBvZgorICAgICBEbF9pbmZvLiAgVGhlICNpbmNsdWRlIDxkbGZjbi5oPiAgaW4gdGhlIFNZTk9QU0lTIGxpbmUgaXMgdHJhZGl0aW9uYWwsCisgICAgIGJ1dCBjb250YWlucyBubyBkbGFkZHIgcHJvdG90eXBlIGFuZCBubyBJUklYIGxpYnJhcnkgY29udGFpbnMgYW4KKyAgICAgaW1wbGVtZW50YXRpb24uICBXcml0ZSB5b3VyIG93biBkZWNsYXJhdGlvbiBiYXNlZCBvbiB0aGUgY29kZSBiZWxvdy4KKworICAgICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgZGVwZW5kZW50IG9uIGludGVybmFsIGludGVyZmFjZXMgdGhhdCBhcmUgbm90CisgICAgIHBhcnQgb2YgdGhlIElSSVggY29tcGF0aWJpbGl0eSBndWFyYW50ZWU7IGhvd2V2ZXIsIHRoZXJlIGlzIG5vIGZ1dHVyZQorICAgICBpbnRlbnRpb24gdG8gY2hhbmdlIHRoaXMgaW50ZXJmYWNlLCBzbyBvbiBhIHByYWN0aWNhbCBsZXZlbCwgdGhlIGNvZGUKKyAgICAgYmVsb3cgaXMgc2FmZSB0byB1c2Ugb24gSVJJWC4KKyovCisjaW5jbHVkZSA8cmxkX2ludGVyZmFjZS5oPgorI2lmbmRlZiBfUkxEX0lOVEVSRkFDRV9ETEZDTl9IX0RMQUREUgorI2RlZmluZSBfUkxEX0lOVEVSRkFDRV9ETEZDTl9IX0RMQUREUgordHlwZWRlZiBzdHJ1Y3QgRGxfaW5mbyB7CisgICAgY29uc3QgY2hhciAqIGRsaV9mbmFtZTsKKyAgICB2b2lkICAgICAgICogZGxpX2ZiYXNlOworICAgIGNvbnN0IGNoYXIgKiBkbGlfc25hbWU7CisgICAgdm9pZCAgICAgICAqIGRsaV9zYWRkcjsKKyAgICBpbnQgICAgICAgICAgZGxpX3ZlcnNpb247CisgICAgaW50ICAgICAgICAgIGRsaV9yZXNlcnZlZDE7CisgICAgbG9uZyAgICAgICAgIGRsaV9yZXNlcnZlZFs0XTsKK30gRGxfaW5mbzsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBEbF9pbmZvIERsX2luZm87CisjZW5kaWYKKyNkZWZpbmUgX1JMRF9ETEFERFIgICAgICAgICAgICAgMTQKKworc3RhdGljIGludCBkbGFkZHIodm9pZCAqYWRkcmVzcywgRGxfaW5mbyAqZGwpCit7CisJdm9pZCAqdjsKKwl2ID0gX3JsZF9uZXdfaW50ZXJmYWNlKF9STERfRExBRERSLGFkZHJlc3MsZGwpOworCXJldHVybiAoaW50KXY7Cit9CisjZW5kaWYgLyogX19zZ2kgKi8KKworc3RhdGljIGludCBkbGZjbl9wYXRoYnlhZGRyKHZvaWQgKmFkZHIsY2hhciAqcGF0aCxpbnQgc3opCisJeworI2lmZGVmIEhBVkVfRExJTkZPCisJRGxfaW5mbyBkbGk7CisJaW50IGxlbjsKKworCWlmIChhZGRyID09IE5VTEwpCisJCXsKKwkJdW5pb24JeyBpbnQoKmYpKHZvaWQqLGNoYXIqLGludCk7IHZvaWQgKnA7IH0gdCA9CisJCQl7IGRsZmNuX3BhdGhieWFkZHIgfTsKKwkJYWRkciA9IHQucDsKKwkJfQorCisJaWYgKGRsYWRkcihhZGRyLCZkbGkpKQorCQl7CisJCWxlbiA9IChpbnQpc3RybGVuKGRsaS5kbGlfZm5hbWUpOworCQlpZiAoc3ogPD0gMCkgcmV0dXJuIGxlbisxOworCQlpZiAobGVuID49IHN6KSBsZW49c3otMTsKKwkJbWVtY3B5KHBhdGgsZGxpLmRsaV9mbmFtZSxsZW4pOworCQlwYXRoW2xlbisrXT0wOworCQlyZXR1cm4gbGVuOworCQl9CisKKwlFUlJfYWRkX2Vycm9yX2RhdGEoNCwgImRsZmNuX3BhdGhieWFkZHIoKTogIiwgZGxlcnJvcigpKTsKKyNlbmRpZgorCXJldHVybiAtMTsKKwl9CisKK3N0YXRpYyB2b2lkICpkbGZjbl9nbG9iYWxsb29rdXAoY29uc3QgY2hhciAqbmFtZSkKKwl7CisJdm9pZCAqcmV0ID0gTlVMTCwqaGFuZGxlID0gZGxvcGVuKE5VTEwsUlRMRF9MQVpZKTsKKwkKKwlpZiAoaGFuZGxlKQorCQl7CisJCXJldCA9IGRsc3ltKGhhbmRsZSxuYW1lKTsKKwkJZGxjbG9zZShoYW5kbGUpOworCQl9CisKKwlyZXR1cm4gcmV0OworCX0KKyNlbmRpZiAvKiBEU09fRExGQ04gKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiMDdjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2Vyci5jCkBAIC0wLDAgKzEsMTU5IEBACisvKiBjcnlwdG8vZHNvL2Rzb19lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Rzby5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfRFNPLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfRFNPLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIERTT19zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKERTT19GX0JFT1NfQklORF9GVU5DKSwJIkJFT1NfQklORF9GVU5DIn0sCit7RVJSX0ZVTkMoRFNPX0ZfQkVPU19CSU5EX1ZBUiksCSJCRU9TX0JJTkRfVkFSIn0sCit7RVJSX0ZVTkMoRFNPX0ZfQkVPU19MT0FEKSwJIkJFT1NfTE9BRCJ9LAore0VSUl9GVU5DKERTT19GX0JFT1NfTkFNRV9DT05WRVJURVIpLAkiQkVPU19OQU1FX0NPTlZFUlRFUiJ9LAore0VSUl9GVU5DKERTT19GX0JFT1NfVU5MT0FEKSwJIkJFT1NfVU5MT0FEIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRExGQ05fQklORF9GVU5DKSwJIkRMRkNOX0JJTkRfRlVOQyJ9LAore0VSUl9GVU5DKERTT19GX0RMRkNOX0JJTkRfVkFSKSwJIkRMRkNOX0JJTkRfVkFSIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRExGQ05fTE9BRCksCSJETEZDTl9MT0FEIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRExGQ05fTUVSR0VSKSwJIkRMRkNOX01FUkdFUiJ9LAore0VSUl9GVU5DKERTT19GX0RMRkNOX05BTUVfQ09OVkVSVEVSKSwJIkRMRkNOX05BTUVfQ09OVkVSVEVSIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRExGQ05fVU5MT0FEKSwJIkRMRkNOX1VOTE9BRCJ9LAore0VSUl9GVU5DKERTT19GX0RMX0JJTkRfRlVOQyksCSJETF9CSU5EX0ZVTkMifSwKK3tFUlJfRlVOQyhEU09fRl9ETF9CSU5EX1ZBUiksCSJETF9CSU5EX1ZBUiJ9LAore0VSUl9GVU5DKERTT19GX0RMX0xPQUQpLAkiRExfTE9BRCJ9LAore0VSUl9GVU5DKERTT19GX0RMX01FUkdFUiksCSJETF9NRVJHRVIifSwKK3tFUlJfRlVOQyhEU09fRl9ETF9OQU1FX0NPTlZFUlRFUiksCSJETF9OQU1FX0NPTlZFUlRFUiJ9LAore0VSUl9GVU5DKERTT19GX0RMX1VOTE9BRCksCSJETF9VTkxPQUQifSwKK3tFUlJfRlVOQyhEU09fRl9EU09fQklORF9GVU5DKSwJIkRTT19iaW5kX2Z1bmMifSwKK3tFUlJfRlVOQyhEU09fRl9EU09fQklORF9WQVIpLAkiRFNPX2JpbmRfdmFyIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRFNPX0NPTlZFUlRfRklMRU5BTUUpLAkiRFNPX2NvbnZlcnRfZmlsZW5hbWUifSwKK3tFUlJfRlVOQyhEU09fRl9EU09fQ1RSTCksCSJEU09fY3RybCJ9LAore0VSUl9GVU5DKERTT19GX0RTT19GUkVFKSwJIkRTT19mcmVlIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRFNPX0dFVF9GSUxFTkFNRSksCSJEU09fZ2V0X2ZpbGVuYW1lIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRFNPX0dFVF9MT0FERURfRklMRU5BTUUpLAkiRFNPX2dldF9sb2FkZWRfZmlsZW5hbWUifSwKK3tFUlJfRlVOQyhEU09fRl9EU09fR0xPQkFMX0xPT0tVUCksCSJEU09fZ2xvYmFsX2xvb2t1cCJ9LAore0VSUl9GVU5DKERTT19GX0RTT19MT0FEKSwJIkRTT19sb2FkIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRFNPX01FUkdFKSwJIkRTT19tZXJnZSJ9LAore0VSUl9GVU5DKERTT19GX0RTT19ORVdfTUVUSE9EKSwJIkRTT19uZXdfbWV0aG9kIn0sCit7RVJSX0ZVTkMoRFNPX0ZfRFNPX1BBVEhCWUFERFIpLAkiRFNPX3BhdGhieWFkZHIifSwKK3tFUlJfRlVOQyhEU09fRl9EU09fU0VUX0ZJTEVOQU1FKSwJIkRTT19zZXRfZmlsZW5hbWUifSwKK3tFUlJfRlVOQyhEU09fRl9EU09fU0VUX05BTUVfQ09OVkVSVEVSKSwJIkRTT19zZXRfbmFtZV9jb252ZXJ0ZXIifSwKK3tFUlJfRlVOQyhEU09fRl9EU09fVVBfUkVGKSwJIkRTT191cF9yZWYifSwKK3tFUlJfRlVOQyhEU09fRl9HTE9CQUxfTE9PS1VQX0ZVTkMpLAkiR0xPQkFMX0xPT0tVUF9GVU5DIn0sCit7RVJSX0ZVTkMoRFNPX0ZfUEFUSEJZQUREUiksCSJQQVRIQllBRERSIn0sCit7RVJSX0ZVTkMoRFNPX0ZfVk1TX0JJTkRfU1lNKSwJIlZNU19CSU5EX1NZTSJ9LAore0VSUl9GVU5DKERTT19GX1ZNU19MT0FEKSwJIlZNU19MT0FEIn0sCit7RVJSX0ZVTkMoRFNPX0ZfVk1TX01FUkdFUiksCSJWTVNfTUVSR0VSIn0sCit7RVJSX0ZVTkMoRFNPX0ZfVk1TX1VOTE9BRCksCSJWTVNfVU5MT0FEIn0sCit7RVJSX0ZVTkMoRFNPX0ZfV0lOMzJfQklORF9GVU5DKSwJIldJTjMyX0JJTkRfRlVOQyJ9LAore0VSUl9GVU5DKERTT19GX1dJTjMyX0JJTkRfVkFSKSwJIldJTjMyX0JJTkRfVkFSIn0sCit7RVJSX0ZVTkMoRFNPX0ZfV0lOMzJfR0xPQkFMTE9PS1VQKSwJIldJTjMyX0dMT0JBTExPT0tVUCJ9LAore0VSUl9GVU5DKERTT19GX1dJTjMyX0dMT0JBTExPT0tVUF9GVU5DKSwJIldJTjMyX0dMT0JBTExPT0tVUF9GVU5DIn0sCit7RVJSX0ZVTkMoRFNPX0ZfV0lOMzJfSk9JTkVSKSwJIldJTjMyX0pPSU5FUiJ9LAore0VSUl9GVU5DKERTT19GX1dJTjMyX0xPQUQpLAkiV0lOMzJfTE9BRCJ9LAore0VSUl9GVU5DKERTT19GX1dJTjMyX01FUkdFUiksCSJXSU4zMl9NRVJHRVIifSwKK3tFUlJfRlVOQyhEU09fRl9XSU4zMl9OQU1FX0NPTlZFUlRFUiksCSJXSU4zMl9OQU1FX0NPTlZFUlRFUiJ9LAore0VSUl9GVU5DKERTT19GX1dJTjMyX1BBVEhCWUFERFIpLAkiV0lOMzJfUEFUSEJZQUREUiJ9LAore0VSUl9GVU5DKERTT19GX1dJTjMyX1NQTElUVEVSKSwJIldJTjMyX1NQTElUVEVSIn0sCit7RVJSX0ZVTkMoRFNPX0ZfV0lOMzJfVU5MT0FEKSwJIldJTjMyX1VOTE9BRCJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIERTT19zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKERTT19SX0NUUkxfRkFJTEVEKSAgICAgICAgICAgLCJjb250cm9sIGNvbW1hbmQgZmFpbGVkIn0sCit7RVJSX1JFQVNPTihEU09fUl9EU09fQUxSRUFEWV9MT0FERUQpICAgICwiZHNvIGFscmVhZHkgbG9hZGVkIn0sCit7RVJSX1JFQVNPTihEU09fUl9FTVBUWV9GSUxFX1NUUlVDVFVSRSkgICwiZW1wdHkgZmlsZSBzdHJ1Y3R1cmUifSwKK3tFUlJfUkVBU09OKERTT19SX0ZBSUxVUkUpICAgICAgICAgICAgICAgLCJmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihEU09fUl9GSUxFTkFNRV9UT09fQklHKSAgICAgICwiZmlsZW5hbWUgdG9vIGJpZyJ9LAore0VSUl9SRUFTT04oRFNPX1JfRklOSVNIX0ZBSUxFRCkgICAgICAgICAsImNsZWFudXAgbWV0aG9kIGZ1bmN0aW9uIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oRFNPX1JfSU5DT1JSRUNUX0ZJTEVfU1lOVEFYKSAsImluY29ycmVjdCBmaWxlIHN5bnRheCJ9LAore0VSUl9SRUFTT04oRFNPX1JfTE9BRF9GQUlMRUQpICAgICAgICAgICAsImNvdWxkIG5vdCBsb2FkIHRoZSBzaGFyZWQgbGlicmFyeSJ9LAore0VSUl9SRUFTT04oRFNPX1JfTkFNRV9UUkFOU0xBVElPTl9GQUlMRUQpLCJuYW1lIHRyYW5zbGF0aW9uIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oRFNPX1JfTk9fRklMRU5BTUUpICAgICAgICAgICAsIm5vIGZpbGVuYW1lIn0sCit7RVJSX1JFQVNPTihEU09fUl9OT19GSUxFX1NQRUNJRklDQVRJT04pICwibm8gZmlsZSBzcGVjaWZpY2F0aW9uIn0sCit7RVJSX1JFQVNPTihEU09fUl9OVUxMX0hBTkRMRSkgICAgICAgICAgICwiYSBudWxsIHNoYXJlZCBsaWJyYXJ5IGhhbmRsZSB3YXMgdXNlZCJ9LAore0VSUl9SRUFTT04oRFNPX1JfU0VUX0ZJTEVOQU1FX0ZBSUxFRCkgICAsInNldCBmaWxlbmFtZSBmYWlsZWQifSwKK3tFUlJfUkVBU09OKERTT19SX1NUQUNLX0VSUk9SKSAgICAgICAgICAgLCJ0aGUgbWV0aF9kYXRhIHN0YWNrIGlzIGNvcnJ1cHQifSwKK3tFUlJfUkVBU09OKERTT19SX1NZTV9GQUlMVVJFKSAgICAgICAgICAgLCJjb3VsZCBub3QgYmluZCB0byB0aGUgcmVxdWVzdGVkIHN5bWJvbCBuYW1lIn0sCit7RVJSX1JFQVNPTihEU09fUl9VTkxPQURfRkFJTEVEKSAgICAgICAgICwiY291bGQgbm90IHVubG9hZCB0aGUgc2hhcmVkIGxpYnJhcnkifSwKK3tFUlJfUkVBU09OKERTT19SX1VOU1VQUE9SVEVEKSAgICAgICAgICAgLCJmdW5jdGlvbmFsaXR5IG5vdCBzdXBwb3J0ZWQifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfRFNPX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKERTT19zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxEU09fc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxEU09fc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vZHNvX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMTViNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19saWIuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyogZHNvX2xpYi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IEdlb2ZmIFRob3JwZSAoZ2VvZmZAZ2VvZmZ0aG9ycGUubmV0KSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9kc28uaD4KKworc3RhdGljIERTT19NRVRIT0QgKmRlZmF1bHRfRFNPX21ldGggPSBOVUxMOworCitEU08gKkRTT19uZXcodm9pZCkKKwl7CisJcmV0dXJuKERTT19uZXdfbWV0aG9kKE5VTEwpKTsKKwl9CisKK3ZvaWQgRFNPX3NldF9kZWZhdWx0X21ldGhvZChEU09fTUVUSE9EICptZXRoKQorCXsKKwlkZWZhdWx0X0RTT19tZXRoID0gbWV0aDsKKwl9CisKK0RTT19NRVRIT0QgKkRTT19nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCkKKwl7CisJcmV0dXJuKGRlZmF1bHRfRFNPX21ldGgpOworCX0KKworRFNPX01FVEhPRCAqRFNPX2dldF9tZXRob2QoRFNPICpkc28pCisJeworCXJldHVybihkc28tPm1ldGgpOworCX0KKworRFNPX01FVEhPRCAqRFNPX3NldF9tZXRob2QoRFNPICpkc28sIERTT19NRVRIT0QgKm1ldGgpCisJeworCURTT19NRVRIT0QgKm10bXA7CisJbXRtcCA9IGRzby0+bWV0aDsKKwlkc28tPm1ldGggPSBtZXRoOworCXJldHVybihtdG1wKTsKKwl9CisKK0RTTyAqRFNPX25ld19tZXRob2QoRFNPX01FVEhPRCAqbWV0aCkKKwl7CisJRFNPICpyZXQ7CisKKwlpZihkZWZhdWx0X0RTT19tZXRoID09IE5VTEwpCisJCS8qIFdlIGRlZmF1bHQgdG8gRFNPX01FVEhfb3BlbnNzbCgpIHdoaWNoIGluIHR1cm4gZGVmYXVsdHMKKwkJICogdG8gc3RlYWxpbmcgdGhlICJiZXN0IGF2YWlsYWJsZSIgbWV0aG9kLiBXaWxsIGZhbGxiYWNrCisJCSAqIHRvIERTT19NRVRIX251bGwoKSBpbiB0aGUgd29yc3QgY2FzZS4gKi8KKwkJZGVmYXVsdF9EU09fbWV0aCA9IERTT19NRVRIT0Rfb3BlbnNzbCgpOworCXJldCA9IChEU08gKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRFNPKSk7CisJaWYocmV0ID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19ORVdfTUVUSE9ELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJbWVtc2V0KHJldCwgMCwgc2l6ZW9mKERTTykpOworCXJldC0+bWV0aF9kYXRhID0gc2tfdm9pZF9uZXdfbnVsbCgpOworCWlmKHJldC0+bWV0aF9kYXRhID09IE5VTEwpCisJCXsKKwkJLyogc2tfbmV3IGRvZXNuJ3QgZ2VuZXJhdGUgYW55IGVycm9ycyBzbyB3ZSBkbyAqLworCQlEU09lcnIoRFNPX0ZfRFNPX05FV19NRVRIT0QsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlPUEVOU1NMX2ZyZWUocmV0KTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYobWV0aCA9PSBOVUxMKQorCQlyZXQtPm1ldGggPSBkZWZhdWx0X0RTT19tZXRoOworCWVsc2UKKwkJcmV0LT5tZXRoID0gbWV0aDsKKwlyZXQtPnJlZmVyZW5jZXMgPSAxOworCWlmKChyZXQtPm1ldGgtPmluaXQgIT0gTlVMTCkgJiYgIXJldC0+bWV0aC0+aW5pdChyZXQpKQorCQl7CisJCU9QRU5TU0xfZnJlZShyZXQpOworCQlyZXQ9TlVMTDsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworaW50IERTT19mcmVlKERTTyAqZHNvKQorCXsKKyAgICAgICAgaW50IGk7CisgCisJaWYoZHNvID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19GUkVFLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybigwKTsKKwkJfQorIAorCWk9Q1JZUFRPX2FkZCgmZHNvLT5yZWZlcmVuY2VzLC0xLENSWVBUT19MT0NLX0RTTyk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJEU08iLGRzbyk7CisjZW5kaWYKKwlpZihpID4gMCkgcmV0dXJuKDEpOworI2lmZGVmIFJFRl9DSEVDSworCWlmKGkgPCAwKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCJEU09fZnJlZSwgYmFkIHJlZmVyZW5jZSBjb3VudFxuIik7CisJCWFib3J0KCk7CisJCX0KKyNlbmRpZgorCisJaWYoKGRzby0+bWV0aC0+ZHNvX3VubG9hZCAhPSBOVUxMKSAmJiAhZHNvLT5tZXRoLT5kc29fdW5sb2FkKGRzbykpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19GUkVFLERTT19SX1VOTE9BRF9GQUlMRUQpOworCQlyZXR1cm4oMCk7CisJCX0KKyAKKwlpZigoZHNvLT5tZXRoLT5maW5pc2ggIT0gTlVMTCkgJiYgIWRzby0+bWV0aC0+ZmluaXNoKGRzbykpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19GUkVFLERTT19SX0ZJTklTSF9GQUlMRUQpOworCQlyZXR1cm4oMCk7CisJCX0KKwkKKwlza192b2lkX2ZyZWUoZHNvLT5tZXRoX2RhdGEpOworCWlmKGRzby0+ZmlsZW5hbWUgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKGRzby0+ZmlsZW5hbWUpOworCWlmKGRzby0+bG9hZGVkX2ZpbGVuYW1lICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShkc28tPmxvYWRlZF9maWxlbmFtZSk7CisgCisJT1BFTlNTTF9mcmVlKGRzbyk7CisJcmV0dXJuKDEpOworCX0KKworaW50IERTT19mbGFncyhEU08gKmRzbykKKwl7CisJcmV0dXJuKChkc28gPT0gTlVMTCkgPyAwIDogZHNvLT5mbGFncyk7CisJfQorCisKK2ludCBEU09fdXBfcmVmKERTTyAqZHNvKQorCXsKKwlpZiAoZHNvID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19VUF9SRUYsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlDUllQVE9fYWRkKCZkc28tPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19EU08pOworCXJldHVybigxKTsKKwl9CisKK0RTTyAqRFNPX2xvYWQoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBEU09fTUVUSE9EICptZXRoLCBpbnQgZmxhZ3MpCisJeworCURTTyAqcmV0OworCWludCBhbGxvY2F0ZWQgPSAwOworCisJaWYoZHNvID09IE5VTEwpCisJCXsKKwkJcmV0ID0gRFNPX25ld19tZXRob2QobWV0aCk7CisJCWlmKHJldCA9PSBOVUxMKQorCQkJeworCQkJRFNPZXJyKERTT19GX0RTT19MT0FELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlhbGxvY2F0ZWQgPSAxOworCQkvKiBQYXNzIHRoZSBwcm92aWRlZCBmbGFncyB0byB0aGUgbmV3IERTTyBvYmplY3QgKi8KKwkJaWYoRFNPX2N0cmwocmV0LCBEU09fQ1RSTF9TRVRfRkxBR1MsIGZsYWdzLCBOVUxMKSA8IDApCisJCQl7CisJCQlEU09lcnIoRFNPX0ZfRFNPX0xPQUQsRFNPX1JfQ1RSTF9GQUlMRUQpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXJldCA9IGRzbzsKKwkvKiBEb24ndCBsb2FkIGlmIHdlJ3JlIGN1cnJlbnRseSBhbHJlYWR5IGxvYWRlZCAqLworCWlmKHJldC0+ZmlsZW5hbWUgIT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX0xPQUQsRFNPX1JfRFNPX0FMUkVBRFlfTE9BREVEKTsKKwkJZ290byBlcnI7CisJCX0KKwkvKiBmaWxlbmFtZSBjYW4gb25seSBiZSBOVUxMIGlmIHdlIHdlcmUgcGFzc2VkIGEgZHNvIHRoYXQgYWxyZWFkeSBoYXMKKwkgKiBvbmUgc2V0LiAqLworCWlmKGZpbGVuYW1lICE9IE5VTEwpCisJCWlmKCFEU09fc2V0X2ZpbGVuYW1lKHJldCwgZmlsZW5hbWUpKQorCQkJeworCQkJRFNPZXJyKERTT19GX0RTT19MT0FELERTT19SX1NFVF9GSUxFTkFNRV9GQUlMRUQpOworCQkJZ290byBlcnI7CisJCQl9CisJZmlsZW5hbWUgPSByZXQtPmZpbGVuYW1lOworCWlmKGZpbGVuYW1lID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19MT0FELERTT19SX05PX0ZJTEVOQU1FKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZihyZXQtPm1ldGgtPmRzb19sb2FkID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19MT0FELERTT19SX1VOU1VQUE9SVEVEKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZighcmV0LT5tZXRoLT5kc29fbG9hZChyZXQpKQorCQl7CisJCURTT2VycihEU09fRl9EU09fTE9BRCxEU09fUl9MT0FEX0ZBSUxFRCk7CisJCWdvdG8gZXJyOworCQl9CisJLyogTG9hZCBzdWNjZWVkZWQgKi8KKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZihhbGxvY2F0ZWQpCisJCURTT19mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKwordm9pZCAqRFNPX2JpbmRfdmFyKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKQorCXsKKwl2b2lkICpyZXQgPSBOVUxMOworCisJaWYoKGRzbyA9PSBOVUxMKSB8fCAoc3ltbmFtZSA9PSBOVUxMKSkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX0JJTkRfVkFSLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmKGRzby0+bWV0aC0+ZHNvX2JpbmRfdmFyID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19CSU5EX1ZBUixEU09fUl9VTlNVUFBPUlRFRCk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmKChyZXQgPSBkc28tPm1ldGgtPmRzb19iaW5kX3Zhcihkc28sIHN5bW5hbWUpKSA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9EU09fQklORF9WQVIsRFNPX1JfU1lNX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwkvKiBTdWNjZXNzICovCisJcmV0dXJuKHJldCk7CisJfQorCitEU09fRlVOQ19UWVBFIERTT19iaW5kX2Z1bmMoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpCisJeworCURTT19GVU5DX1RZUEUgcmV0ID0gTlVMTDsKKworCWlmKChkc28gPT0gTlVMTCkgfHwgKHN5bW5hbWUgPT0gTlVMTCkpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19CSU5EX0ZVTkMsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYoZHNvLT5tZXRoLT5kc29fYmluZF9mdW5jID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19CSU5EX0ZVTkMsRFNPX1JfVU5TVVBQT1JURUQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlpZigocmV0ID0gZHNvLT5tZXRoLT5kc29fYmluZF9mdW5jKGRzbywgc3ltbmFtZSkpID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19CSU5EX0ZVTkMsRFNPX1JfU1lNX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwkvKiBTdWNjZXNzICovCisJcmV0dXJuKHJldCk7CisJfQorCisvKiBJIGRvbid0IHJlYWxseSBsaWtlIHRoZXNlICpfY3RybCBmdW5jdGlvbnMgdmVyeSBtdWNoIHRvIGJlIHBlcmZlY3RseQorICogaG9uZXN0LiBGb3Igb25lIHRoaW5nLCBJIHRoaW5rIEkgaGF2ZSB0byByZXR1cm4gYSBuZWdhdGl2ZSB2YWx1ZSBmb3IKKyAqIGFueSBlcnJvciBiZWNhdXNlIHBvc3NpYmxlIERTT19jdHJsKCkgY29tbWFuZHMgbWF5IHJldHVybiB2YWx1ZXMKKyAqIHN1Y2ggYXMgInNpemUicyB0aGF0IGNhbiBsZWdpdGltYXRlbHkgYmUgemVybyAobWFraW5nIHRoZSBzdGFuZGFyZAorICogImlmKERTT19jbWQoLi4uKSkiIGZvcm0gdGhhdCB3b3JrcyBhbG1vc3QgZXZlcnl3aGVyZSBlbHNlIGZhaWwgYXQKKyAqIG9kZCB0aW1lcy4gSSdkIHByZWZlciAib3V0cHV0IiB2YWx1ZXMgdG8gYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSBhbmQKKyAqIHRoZSByZXR1cm4gdmFsdWUgYXMgc3VjY2Vzcy9mYWlsdXJlIGxpa2UgdXN1YWwgLi4uIGJ1dCB3ZSBjb25mb3JtCisgKiB3aGVuIHdlIG11c3QuLi4gOi0pICovCitsb25nIERTT19jdHJsKERTTyAqZHNvLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpCisJeworCWlmKGRzbyA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9EU09fQ1RSTCxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oLTEpOworCQl9CisJLyogV2Ugc2hvdWxkIGludGVyY2VwdCBjZXJ0YWluIGdlbmVyaWMgY29tbWFuZHMgYW5kIG9ubHkgcGFzcyBjb250cm9sCisJICogdG8gdGhlIG1ldGhvZC1zcGVjaWZpYyBjdHJsKCkgZnVuY3Rpb24gaWYgaXQncyBzb21ldGhpbmcgd2UgZG9uJ3QKKwkgKiBoYW5kbGUuICovCisJc3dpdGNoKGNtZCkKKwkJeworCWNhc2UgRFNPX0NUUkxfR0VUX0ZMQUdTOgorCQlyZXR1cm4gZHNvLT5mbGFnczsKKwljYXNlIERTT19DVFJMX1NFVF9GTEFHUzoKKwkJZHNvLT5mbGFncyA9IChpbnQpbGFyZzsKKwkJcmV0dXJuKDApOworCWNhc2UgRFNPX0NUUkxfT1JfRkxBR1M6CisJCWRzby0+ZmxhZ3MgfD0gKGludClsYXJnOworCQlyZXR1cm4oMCk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJCX0KKwlpZigoZHNvLT5tZXRoID09IE5VTEwpIHx8IChkc28tPm1ldGgtPmRzb19jdHJsID09IE5VTEwpKQorCQl7CisJCURTT2VycihEU09fRl9EU09fQ1RSTCxEU09fUl9VTlNVUFBPUlRFRCk7CisJCXJldHVybigtMSk7CisJCX0KKwlyZXR1cm4oZHNvLT5tZXRoLT5kc29fY3RybChkc28sY21kLGxhcmcscGFyZykpOworCX0KKworaW50IERTT19zZXRfbmFtZV9jb252ZXJ0ZXIoRFNPICpkc28sIERTT19OQU1FX0NPTlZFUlRFUl9GVU5DIGNiLAorCQkJRFNPX05BTUVfQ09OVkVSVEVSX0ZVTkMgKm9sZGNiKQorCXsKKwlpZihkc28gPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX1NFVF9OQU1FX0NPTlZFUlRFUiwKKwkJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZihvbGRjYikKKwkJKm9sZGNiID0gZHNvLT5uYW1lX2NvbnZlcnRlcjsKKwlkc28tPm5hbWVfY29udmVydGVyID0gY2I7CisJcmV0dXJuKDEpOworCX0KKworY29uc3QgY2hhciAqRFNPX2dldF9maWxlbmFtZShEU08gKmRzbykKKwl7CisJaWYoZHNvID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19HRVRfRklMRU5BTUUsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0dXJuKGRzby0+ZmlsZW5hbWUpOworCX0KKworaW50IERTT19zZXRfZmlsZW5hbWUoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorCXsKKwljaGFyICpjb3BpZWQ7CisKKwlpZigoZHNvID09IE5VTEwpIHx8IChmaWxlbmFtZSA9PSBOVUxMKSkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX1NFVF9GSUxFTkFNRSxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZihkc28tPmxvYWRlZF9maWxlbmFtZSkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX1NFVF9GSUxFTkFNRSxEU09fUl9EU09fQUxSRUFEWV9MT0FERUQpOworCQlyZXR1cm4oMCk7CisJCX0KKwkvKiBXZSdsbCBkdXBsaWNhdGUgZmlsZW5hbWUgKi8KKwljb3BpZWQgPSBPUEVOU1NMX21hbGxvYyhzdHJsZW4oZmlsZW5hbWUpICsgMSk7CisJaWYoY29waWVkID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19TRVRfRklMRU5BTUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwlCVUZfc3RybGNweShjb3BpZWQsIGZpbGVuYW1lLCBzdHJsZW4oZmlsZW5hbWUpICsgMSk7CisJaWYoZHNvLT5maWxlbmFtZSkKKwkJT1BFTlNTTF9mcmVlKGRzby0+ZmlsZW5hbWUpOworCWRzby0+ZmlsZW5hbWUgPSBjb3BpZWQ7CisJcmV0dXJuKDEpOworCX0KKworY2hhciAqRFNPX21lcmdlKERTTyAqZHNvLCBjb25zdCBjaGFyICpmaWxlc3BlYzEsIGNvbnN0IGNoYXIgKmZpbGVzcGVjMikKKwl7CisJY2hhciAqcmVzdWx0ID0gTlVMTDsKKworCWlmKGRzbyA9PSBOVUxMIHx8IGZpbGVzcGVjMSA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9EU09fTUVSR0UsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYoKGRzby0+ZmxhZ3MgJiBEU09fRkxBR19OT19OQU1FX1RSQU5TTEFUSU9OKSA9PSAwKQorCQl7CisJCWlmKGRzby0+bWVyZ2VyICE9IE5VTEwpCisJCQlyZXN1bHQgPSBkc28tPm1lcmdlcihkc28sIGZpbGVzcGVjMSwgZmlsZXNwZWMyKTsKKwkJZWxzZSBpZihkc28tPm1ldGgtPmRzb19tZXJnZXIgIT0gTlVMTCkKKwkJCXJlc3VsdCA9IGRzby0+bWV0aC0+ZHNvX21lcmdlcihkc28sCisJCQkJZmlsZXNwZWMxLCBmaWxlc3BlYzIpOworCQl9CisJcmV0dXJuKHJlc3VsdCk7CisJfQorCitjaGFyICpEU09fY29udmVydF9maWxlbmFtZShEU08gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUpCisJeworCWNoYXIgKnJlc3VsdCA9IE5VTEw7CisKKwlpZihkc28gPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX0NPTlZFUlRfRklMRU5BTUUsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYoZmlsZW5hbWUgPT0gTlVMTCkKKwkJZmlsZW5hbWUgPSBkc28tPmZpbGVuYW1lOworCWlmKGZpbGVuYW1lID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX0RTT19DT05WRVJUX0ZJTEVOQU1FLERTT19SX05PX0ZJTEVOQU1FKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYoKGRzby0+ZmxhZ3MgJiBEU09fRkxBR19OT19OQU1FX1RSQU5TTEFUSU9OKSA9PSAwKQorCQl7CisJCWlmKGRzby0+bmFtZV9jb252ZXJ0ZXIgIT0gTlVMTCkKKwkJCXJlc3VsdCA9IGRzby0+bmFtZV9jb252ZXJ0ZXIoZHNvLCBmaWxlbmFtZSk7CisJCWVsc2UgaWYoZHNvLT5tZXRoLT5kc29fbmFtZV9jb252ZXJ0ZXIgIT0gTlVMTCkKKwkJCXJlc3VsdCA9IGRzby0+bWV0aC0+ZHNvX25hbWVfY29udmVydGVyKGRzbywgZmlsZW5hbWUpOworCQl9CisJaWYocmVzdWx0ID09IE5VTEwpCisJCXsKKwkJcmVzdWx0ID0gT1BFTlNTTF9tYWxsb2Moc3RybGVuKGZpbGVuYW1lKSArIDEpOworCQlpZihyZXN1bHQgPT0gTlVMTCkKKwkJCXsKKwkJCURTT2VycihEU09fRl9EU09fQ09OVkVSVF9GSUxFTkFNRSwKKwkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQlCVUZfc3RybGNweShyZXN1bHQsIGZpbGVuYW1lLCBzdHJsZW4oZmlsZW5hbWUpICsgMSk7CisJCX0KKwlyZXR1cm4ocmVzdWx0KTsKKwl9CisKK2NvbnN0IGNoYXIgKkRTT19nZXRfbG9hZGVkX2ZpbGVuYW1lKERTTyAqZHNvKQorCXsKKwlpZihkc28gPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX0dFVF9MT0FERURfRklMRU5BTUUsCisJCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0dXJuKGRzby0+bG9hZGVkX2ZpbGVuYW1lKTsKKwl9CisKK2ludCBEU09fcGF0aGJ5YWRkcih2b2lkICphZGRyLGNoYXIgKnBhdGgsaW50IHN6KQorCXsKKwlEU09fTUVUSE9EICptZXRoID0gZGVmYXVsdF9EU09fbWV0aDsKKwlpZiAobWV0aCA9PSBOVUxMKSBtZXRoID0gRFNPX01FVEhPRF9vcGVuc3NsKCk7CisJaWYgKG1ldGgtPnBhdGhieWFkZHIgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX1BBVEhCWUFERFIsRFNPX1JfVU5TVVBQT1JURUQpOworCQlyZXR1cm4gLTE7CisJCX0KKwlyZXR1cm4gKCptZXRoLT5wYXRoYnlhZGRyKShhZGRyLHBhdGgsc3opOworCX0KKwordm9pZCAqRFNPX2dsb2JhbF9sb29rdXAoY29uc3QgY2hhciAqbmFtZSkKKwl7CisJRFNPX01FVEhPRCAqbWV0aCA9IGRlZmF1bHRfRFNPX21ldGg7CisJaWYgKG1ldGggPT0gTlVMTCkgbWV0aCA9IERTT19NRVRIT0Rfb3BlbnNzbCgpOworCWlmIChtZXRoLT5nbG9iYWxsb29rdXAgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfRFNPX0dMT0JBTF9MT09LVVAsRFNPX1JfVU5TVVBQT1JURUQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCXJldHVybiAoKm1ldGgtPmdsb2JhbGxvb2t1cCkobmFtZSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fbnVsbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fbnVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDg0MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19udWxsLmMKQEAgLTAsMCArMSw5MCBAQAorLyogZHNvX251bGwuYyAqLworLyogV3JpdHRlbiBieSBHZW9mZiBUaG9ycGUgKGdlb2ZmQGdlb2ZmdGhvcnBlLm5ldCkgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogVGhpcyAiTlVMTCIgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIHRoZSBmYWxsYmFjayBmb3Igc3lzdGVtcyB0aGF0IGhhdmUKKyAqIG5vIGFwcHJvcHJpYXRlIHN1cHBvcnQgZm9yICJzaGFyZWQtbGlicmFyaWVzIi4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Rzby5oPgorCitzdGF0aWMgRFNPX01FVEhPRCBkc29fbWV0aF9udWxsID0geworCSJOVUxMIHNoYXJlZCBsaWJyYXJ5IG1ldGhvZCIsCisJTlVMTCwgLyogbG9hZCAqLworCU5VTEwsIC8qIHVubG9hZCAqLworCU5VTEwsIC8qIGJpbmRfdmFyICovCisJTlVMTCwgLyogYmluZF9mdW5jICovCisvKiBGb3Igbm93LCAidW5iaW5kIiBkb2Vzbid0IGV4aXN0ICovCisjaWYgMAorCU5VTEwsIC8qIHVuYmluZF92YXIgKi8KKwlOVUxMLCAvKiB1bmJpbmRfZnVuYyAqLworI2VuZGlmCisJTlVMTCwgLyogY3RybCAqLworCU5VTEwsIC8qIGRzb19uYW1lX2NvbnZlcnRlciAqLworCU5VTEwsIC8qIGRzb19tZXJnZXIgKi8KKwlOVUxMLCAvKiBpbml0ICovCisJTlVMTCwgLyogZmluaXNoICovCisJTlVMTCwgLyogcGF0aGJ5YWRkciAqLworCU5VTEwgIC8qIGdsb2JhbGxvb2t1cCAqLworCX07CisKK0RTT19NRVRIT0QgKkRTT19NRVRIT0RfbnVsbCh2b2lkKQorCXsKKwlyZXR1cm4oJmRzb19tZXRoX251bGwpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fb3BlbnNzbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Rzby9kc29fb3BlbnNzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2U4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb19vcGVuc3NsLmMKQEAgLTAsMCArMSw4MyBAQAorLyogZHNvX29wZW5zc2wuYyAqLworLyogV3JpdHRlbiBieSBHZW9mZiBUaG9ycGUgKGdlb2ZmQGdlb2ZmdGhvcnBlLm5ldCkgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Rzby5oPgorCisvKiBXZSBqdXN0IHBpbmNoIHRoZSBtZXRob2QgZnJvbSBhbiBhcHByb3ByaWF0ZSAiZGVmYXVsdCIgbWV0aG9kLiAqLworCitEU09fTUVUSE9EICpEU09fTUVUSE9EX29wZW5zc2wodm9pZCkKKwl7CisjaWZkZWYgREVGX0RTT19NRVRIT0QKKwlyZXR1cm4oREVGX0RTT19NRVRIT0QoKSk7CisjZWxpZiBkZWZpbmVkKERTT19ETEZDTikKKwlyZXR1cm4oRFNPX01FVEhPRF9kbGZjbigpKTsKKyNlbGlmIGRlZmluZWQoRFNPX0RMKQorCXJldHVybihEU09fTUVUSE9EX2RsKCkpOworI2VsaWYgZGVmaW5lZChEU09fV0lOMzIpCisJcmV0dXJuKERTT19NRVRIT0Rfd2luMzIoKSk7CisjZWxpZiBkZWZpbmVkKERTT19WTVMpCisJcmV0dXJuKERTT19NRVRIT0Rfdm1zKCkpOworI2VsaWYgZGVmaW5lZChEU09fQkVPUykKKwlyZXR1cm4oRFNPX01FVEhPRF9iZW9zKCkpOworI2Vsc2UKKwlyZXR1cm4oRFNPX01FVEhPRF9udWxsKCkpOworI2VuZGlmCisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb192bXMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vZHNvX3Ztcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTUxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb192bXMuYwpAQCAtMCwwICsxLDUwNCBAQAorLyogZHNvX3Ztcy5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZHNvLmg+CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisjcHJhZ21hIG1lc3NhZ2UgZGlzYWJsZSBET0xMQVJJRAorI2luY2x1ZGUgPHJtcy5oPgorI2luY2x1ZGUgPGxpYiRyb3V0aW5lcy5oPgorI2luY2x1ZGUgPHN0c2RlZi5oPgorI2luY2x1ZGUgPGRlc2NyaXAuaD4KKyNpbmNsdWRlIDxzdGFybGV0Lmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKK0RTT19NRVRIT0QgKkRTT19NRVRIT0Rfdm1zKHZvaWQpCisJeworCXJldHVybiBOVUxMOworCX0KKyNlbHNlCisjcHJhZ21hIG1lc3NhZ2UgZGlzYWJsZSBET0xMQVJJRAorCitzdGF0aWMgaW50IHZtc19sb2FkKERTTyAqZHNvKTsKK3N0YXRpYyBpbnQgdm1zX3VubG9hZChEU08gKmRzbyk7CitzdGF0aWMgdm9pZCAqdm1zX2JpbmRfdmFyKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKTsKK3N0YXRpYyBEU09fRlVOQ19UWVBFIHZtc19iaW5kX2Z1bmMoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworI2lmIDAKK3N0YXRpYyBpbnQgdm1zX3VuYmluZF92YXIoRFNPICpkc28sIGNoYXIgKnN5bW5hbWUsIHZvaWQgKnN5bXB0cik7CitzdGF0aWMgaW50IHZtc191bmJpbmRfZnVuYyhEU08gKmRzbywgY2hhciAqc3ltbmFtZSwgRFNPX0ZVTkNfVFlQRSBzeW1wdHIpOworc3RhdGljIGludCB2bXNfaW5pdChEU08gKmRzbyk7CitzdGF0aWMgaW50IHZtc19maW5pc2goRFNPICpkc28pOworc3RhdGljIGxvbmcgdm1zX2N0cmwoRFNPICpkc28sIGludCBjbWQsIGxvbmcgbGFyZywgdm9pZCAqcGFyZyk7CisjZW5kaWYKK3N0YXRpYyBjaGFyICp2bXNfbmFtZV9jb252ZXJ0ZXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3N0YXRpYyBjaGFyICp2bXNfbWVyZ2VyKERTTyAqZHNvLCBjb25zdCBjaGFyICpmaWxlc3BlYzEsCisJY29uc3QgY2hhciAqZmlsZXNwZWMyKTsKKworc3RhdGljIERTT19NRVRIT0QgZHNvX21ldGhfdm1zID0geworCSJPcGVuU1NMICdWTVMnIHNoYXJlZCBsaWJyYXJ5IG1ldGhvZCIsCisJdm1zX2xvYWQsCisJTlVMTCwgLyogdW5sb2FkICovCisJdm1zX2JpbmRfdmFyLAorCXZtc19iaW5kX2Z1bmMsCisvKiBGb3Igbm93LCAidW5iaW5kIiBkb2Vzbid0IGV4aXN0ICovCisjaWYgMAorCU5VTEwsIC8qIHVuYmluZF92YXIgKi8KKwlOVUxMLCAvKiB1bmJpbmRfZnVuYyAqLworI2VuZGlmCisJTlVMTCwgLyogY3RybCAqLworCXZtc19uYW1lX2NvbnZlcnRlciwKKwl2bXNfbWVyZ2VyLAorCU5VTEwsIC8qIGluaXQgKi8KKwlOVUxMICAvKiBmaW5pc2ggKi8KKwl9OworCisvKiBPbiBWTVMsIHRoZSBvbmx5ICJoYW5kbGUiIGlzIHRoZSBmaWxlIG5hbWUuICBMSUIkRklORF9JTUFHRV9TWU1CT0wgZGVwZW5kcworICogb24gdGhlIHJlZmVyZW5jZSB0byB0aGUgZmlsZSBuYW1lIGJlaW5nIHRoZSBzYW1lIGZvciBhbGwgY2FsbHMgcmVnYXJkaW5nCisgKiBvbmUgc2hhcmVkIGltYWdlLCBzbyB3ZSdsbCBqdXN0IHN0b3JlIGl0IGluIGFuIGluc3RhbmNlIG9mIHRoZSBmb2xsb3dpbmcKKyAqIHN0cnVjdHVyZSBhbmQgcHV0IGEgcG9pbnRlciB0byB0aGF0IGluc3RhbmNlIGluIHRoZSBtZXRoX2RhdGEgc3RhY2suCisgKi8KK3R5cGVkZWYgc3RydWN0IGRzb19pbnRlcm5hbF9zdAorCXsKKwkvKiBUaGlzIHNob3VsZCBjb250YWluIHRoZSBuYW1lIG9ubHksIG5vIGRpcmVjdG9yeSwKKwkgKiBubyBleHRlbnNpb24sIG5vdGhpbmcgYnV0IGEgbmFtZS4gKi8KKwlzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcyBmaWxlbmFtZV9kc2M7CisJY2hhciBmaWxlbmFtZVtGSUxFTkFNRV9NQVgrMV07CisJLyogVGhpcyBjb250YWlucyB3aGF0ZXZlciBpcyBub3QgaW4gZmlsZW5hbWUsIGlmIG5lZWRlZC4KKwkgKiBOb3JtYWxseSBub3QgZGVmaW5lZC4gKi8KKwlzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcyBpbWFnZW5hbWVfZHNjOworCWNoYXIgaW1hZ2VuYW1lW0ZJTEVOQU1FX01BWCsxXTsKKwl9IERTT19WTVNfSU5URVJOQUw7CisKKworRFNPX01FVEhPRCAqRFNPX01FVEhPRF92bXModm9pZCkKKwl7CisJcmV0dXJuKCZkc29fbWV0aF92bXMpOworCX0KKworc3RhdGljIGludCB2bXNfbG9hZChEU08gKmRzbykKKwl7CisJdm9pZCAqcHRyID0gTlVMTDsKKwkvKiBTZWUgYXBwbGljYWJsZSBjb21tZW50cyBpbiBkc29fZGwuYyAqLworCWNoYXIgKmZpbGVuYW1lID0gRFNPX2NvbnZlcnRfZmlsZW5hbWUoZHNvLCBOVUxMKTsKKwlEU09fVk1TX0lOVEVSTkFMICpwOworCWNvbnN0IGNoYXIgKnNwMSwgKnNwMjsJLyogU2VhcmNoIHJlc3VsdCAqLworCisJaWYoZmlsZW5hbWUgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfVk1TX0xPQUQsRFNPX1JfTk9fRklMRU5BTUUpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogQSBmaWxlIHNwZWNpZmljYXRpb24gbWF5IGxvb2sgbGlrZSB0aGlzOgorCSAqCisJICoJbm9kZTo6ZGV2OltkaXItc3BlY11uYW1lLnR5cGU7dmVyCisJICoKKwkgKiBvciAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBUT1BTLTIwKToKKwkgKgorCSAqCW5vZGU6OmRldjo8ZGlyLXNwZWM+bmFtZS50eXBlO3ZlcgorCSAqCisJICogYW5kIHRoZSBkaXItc3BlYyB1c2VzICcuJyBhcyBzZXBhcmF0b3IuICBBbHNvLCBhIGRpci1zcGVjCisJICogbWF5IGNvbnNpc3Qgb2Ygc2V2ZXJhbCBwYXJ0cywgd2l0aCBtaXhlZCB1c2Ugb2YgW10gYW5kIDw+OgorCSAqCisJICoJW2RpcjEuXTxkaXIyPgorCSAqCisJICogV2UgbmVlZCB0byBzcGxpdCB0aGUgZmlsZSBzcGVjaWZpY2F0aW9uIGludG8gdGhlIG5hbWUgYW5kCisJICogdGhlIHJlc3QgKGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgbmFtZSBpdHNlbGYpLgorCSAqLworCS8qIFN0YXJ0IHdpdGggdHJ5aW5nIHRvIGZpbmQgdGhlIGVuZCBvZiBhIGRpci1zcGVjLCBhbmQgc2F2ZSB0aGUKKwkgICBwb3NpdGlvbiBvZiB0aGUgYnl0ZSBhZnRlciBpbiBzcDEgKi8KKwlzcDEgPSBzdHJyY2hyKGZpbGVuYW1lLCAnXScpOworCXNwMiA9IHN0cnJjaHIoZmlsZW5hbWUsICc+Jyk7CisJaWYgKHNwMSA9PSBOVUxMKSBzcDEgPSBzcDI7CisJaWYgKHNwMiAhPSBOVUxMICYmIHNwMiA+IHNwMSkgc3AxID0gc3AyOworCWlmIChzcDEgPT0gTlVMTCkgc3AxID0gc3RycmNocihmaWxlbmFtZSwgJzonKTsKKwlpZiAoc3AxID09IE5VTEwpCisJCXNwMSA9IGZpbGVuYW1lOworCWVsc2UKKwkJc3AxKys7CQkvKiBUaGUgYnl0ZSBhZnRlciB0aGUgZm91bmQgY2hhcmFjdGVyICovCisJLyogTm93LCBsZXQncyBzZWUgaWYgdGhlcmUncyBhIHR5cGUsIGFuZCBzYXZlIHRoZSBwb3NpdGlvbiBpbiBzcDIgKi8KKwlzcDIgPSBzdHJjaHIoc3AxLCAnLicpOworCS8qIElmIHdlIGZvdW5kIGl0LCB0aGF0J3Mgd2hlcmUgd2UnbGwgY3V0LiAgT3RoZXJ3aXNlLCBsb29rIGZvciBhCisJICAgdmVyc2lvbiBudW1iZXIgYW5kIHNhdmUgdGhlIHBvc2l0aW9uIGluIHNwMiAqLworCWlmIChzcDIgPT0gTlVMTCkgc3AyID0gc3RyY2hyKHNwMSwgJzsnKTsKKwkvKiBJZiB0aGVyZSB3YXMgc3RpbGwgbm90aGluZyB0byBmaW5kLCBzZXQgc3AyIHRvIHBvaW50IGF0IHRoZSBlbmQgb2YKKwkgICB0aGUgc3RyaW5nICovCisJaWYgKHNwMiA9PSBOVUxMKSBzcDIgPSBzcDEgKyBzdHJsZW4oc3AxKTsKKworCS8qIENoZWNrIHRoYXQgd2Ugd29uJ3QgZ2V0IGJ1ZmZlciBvdmVyZmxvd3MgKi8KKwlpZiAoc3AyIC0gc3AxID4gRklMRU5BTUVfTUFYCisJCXx8IChzcDEgLSBmaWxlbmFtZSkgKyBzdHJsZW4oc3AyKSA+IEZJTEVOQU1FX01BWCkKKwkJeworCQlEU09lcnIoRFNPX0ZfVk1TX0xPQUQsRFNPX1JfRklMRU5BTUVfVE9PX0JJRyk7CisJCWdvdG8gZXJyOworCQl9CisKKwlwID0gKERTT19WTVNfSU5URVJOQUwgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRFNPX1ZNU19JTlRFUk5BTCkpOworCWlmKHAgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfVk1TX0xPQUQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJc3RybmNweShwLT5maWxlbmFtZSwgc3AxLCBzcDItc3AxKTsKKwlwLT5maWxlbmFtZVtzcDItc3AxXSA9ICdcMCc7CisKKwlzdHJuY3B5KHAtPmltYWdlbmFtZSwgZmlsZW5hbWUsIHNwMS1maWxlbmFtZSk7CisJcC0+aW1hZ2VuYW1lW3NwMS1maWxlbmFtZV0gPSAnXDAnOworCXN0cmNhdChwLT5pbWFnZW5hbWUsIHNwMik7CisKKwlwLT5maWxlbmFtZV9kc2MuZHNjJHdfbGVuZ3RoID0gc3RybGVuKHAtPmZpbGVuYW1lKTsKKwlwLT5maWxlbmFtZV9kc2MuZHNjJGJfZHR5cGUgPSBEU0MkS19EVFlQRV9UOworCXAtPmZpbGVuYW1lX2RzYy5kc2MkYl9jbGFzcyA9IERTQyRLX0NMQVNTX1M7CisJcC0+ZmlsZW5hbWVfZHNjLmRzYyRhX3BvaW50ZXIgPSBwLT5maWxlbmFtZTsKKwlwLT5pbWFnZW5hbWVfZHNjLmRzYyR3X2xlbmd0aCA9IHN0cmxlbihwLT5pbWFnZW5hbWUpOworCXAtPmltYWdlbmFtZV9kc2MuZHNjJGJfZHR5cGUgPSBEU0MkS19EVFlQRV9UOworCXAtPmltYWdlbmFtZV9kc2MuZHNjJGJfY2xhc3MgPSBEU0MkS19DTEFTU19TOworCXAtPmltYWdlbmFtZV9kc2MuZHNjJGFfcG9pbnRlciA9IHAtPmltYWdlbmFtZTsKKworCWlmKCFza192b2lkX3B1c2goZHNvLT5tZXRoX2RhdGEsIChjaGFyICopcCkpCisJCXsKKwkJRFNPZXJyKERTT19GX1ZNU19MT0FELERTT19SX1NUQUNLX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIFN1Y2Nlc3MgKGZvciBub3csIHdlIGxpZS4gIFdlIGFjdHVhbGx5IGRvIG5vdCBrbm93Li4uKSAqLworCWRzby0+bG9hZGVkX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisJcmV0dXJuKDEpOworZXJyOgorCS8qIENsZWFudXAhICovCisJaWYocCAhPSBOVUxMKQorCQlPUEVOU1NMX2ZyZWUocCk7CisJaWYoZmlsZW5hbWUgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKGZpbGVuYW1lKTsKKwlyZXR1cm4oMCk7CisJfQorCisvKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHVubG9hZCB0aGUgc2hhcmVkIGltYWdlLCBhcyB0aGVyZSBpcyBubworICogc3VjaCB0aGluZyBpbiBWTVMuICBOZXh0IHRpbWUgaXQgZ2V0IGxvYWRlZCBhZ2FpbiwgYSBuZXcgY29weSB3aWxsCisgKiBhY3R1YWxseSBiZSBsb2FkZWQuCisgKi8KK3N0YXRpYyBpbnQgdm1zX3VubG9hZChEU08gKmRzbykKKwl7CisJRFNPX1ZNU19JTlRFUk5BTCAqcDsKKwlpZihkc28gPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfVk1TX1VOTE9BRCxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZihza192b2lkX251bShkc28tPm1ldGhfZGF0YSkgPCAxKQorCQlyZXR1cm4oMSk7CisJcCA9IChEU09fVk1TX0lOVEVSTkFMICopc2tfdm9pZF9wb3AoZHNvLT5tZXRoX2RhdGEpOworCWlmKHAgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfVk1TX1VOTE9BRCxEU09fUl9OVUxMX0hBTkRMRSk7CisJCXJldHVybigwKTsKKwkJfQorCS8qIENsZWFudXAgKi8KKwlPUEVOU1NMX2ZyZWUocCk7CisJcmV0dXJuKDEpOworCX0KKworLyogV2UgbXVzdCBkbyB0aGlzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gYmVjYXVzZSBvZiB0aGUgd2F5IHRoZSBleGNlcHRpb24KKyAgIGhhbmRsZXIgd29ya3MgKGl0IG1ha2VzIHRoaXMgZnVuY3Rpb24gcmV0dXJuICovCitzdGF0aWMgaW50IGRvX2ZpbmRfc3ltYm9sKERTT19WTVNfSU5URVJOQUwgKnB0ciwKKwlzdHJ1Y3QgZHNjJGRlc2NyaXB0b3JfcyAqc3ltbmFtZV9kc2MsIHZvaWQgKipzeW0sCisJdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJLyogTWFrZSBzdXJlIHRoYXQgc2lnbmFscyBhcmUgY2F1Z2h0IGFuZCByZXR1cm5lZCBpbnN0ZWFkIG9mCisJICAgYWJvcnRpbmcgdGhlIHByb2dyYW0uICBUaGUgZXhjZXB0aW9uIGhhbmRsZXIgZ2V0cyB1bmVzdGFibGlzaGVkCisJICAgYXV0b21hdGljYWxseSBvbiByZXR1cm4gZnJvbSB0aGlzIGZ1bmN0aW9uLiAgKi8KKwlsaWIkZXN0YWJsaXNoKGxpYiRzaWdfdG9fcmV0KTsKKworCWlmKHB0ci0+aW1hZ2VuYW1lX2RzYy5kc2Mkd19sZW5ndGgpCisJCXJldHVybiBsaWIkZmluZF9pbWFnZV9zeW1ib2woJnB0ci0+ZmlsZW5hbWVfZHNjLAorCQkJc3ltbmFtZV9kc2MsIHN5bSwKKwkJCSZwdHItPmltYWdlbmFtZV9kc2MsIGZsYWdzKTsKKwllbHNlCisJCXJldHVybiBsaWIkZmluZF9pbWFnZV9zeW1ib2woJnB0ci0+ZmlsZW5hbWVfZHNjLAorCQkJc3ltbmFtZV9kc2MsIHN5bSwKKwkJCTAsIGZsYWdzKTsKKwl9CisKK3ZvaWQgdm1zX2JpbmRfc3ltKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lLCB2b2lkICoqc3ltKQorCXsKKwlEU09fVk1TX0lOVEVSTkFMICpwdHI7CisJaW50IHN0YXR1czsKKyNpZiAwCisJaW50IGZsYWdzID0gKDE8PDQpOyAvKiBMSUIkTV9GSVNfTUlYRURDQVNFLCBidXQgdGhpcyBzeW1ib2wgaXNuJ3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIFZNUyBvbGRlciB0aGFuIDcuMCBvciBzbyAqLworI2Vsc2UKKwlpbnQgZmxhZ3MgPSAwOworI2VuZGlmCisJc3RydWN0IGRzYyRkZXNjcmlwdG9yX3Mgc3ltbmFtZV9kc2M7CisJKnN5bSA9IE5VTEw7CisKKwlzeW1uYW1lX2RzYy5kc2Mkd19sZW5ndGggPSBzdHJsZW4oc3ltbmFtZSk7CisJc3ltbmFtZV9kc2MuZHNjJGJfZHR5cGUgPSBEU0MkS19EVFlQRV9UOworCXN5bW5hbWVfZHNjLmRzYyRiX2NsYXNzID0gRFNDJEtfQ0xBU1NfUzsKKwlzeW1uYW1lX2RzYy5kc2MkYV9wb2ludGVyID0gKGNoYXIgKilzeW1uYW1lOyAvKiBUaGUgY2FzdCBpcyBuZWVkZWQgKi8KKworCWlmKChkc28gPT0gTlVMTCkgfHwgKHN5bW5hbWUgPT0gTlVMTCkpCisJCXsKKwkJRFNPZXJyKERTT19GX1ZNU19CSU5EX1NZTSxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm47CisJCX0KKwlpZihza192b2lkX251bShkc28tPm1ldGhfZGF0YSkgPCAxKQorCQl7CisJCURTT2VycihEU09fRl9WTVNfQklORF9TWU0sRFNPX1JfU1RBQ0tfRVJST1IpOworCQlyZXR1cm47CisJCX0KKwlwdHIgPSAoRFNPX1ZNU19JTlRFUk5BTCAqKXNrX3ZvaWRfdmFsdWUoZHNvLT5tZXRoX2RhdGEsCisJCXNrX3ZvaWRfbnVtKGRzby0+bWV0aF9kYXRhKSAtIDEpOworCWlmKHB0ciA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9WTVNfQklORF9TWU0sRFNPX1JfTlVMTF9IQU5ETEUpOworCQlyZXR1cm47CisJCX0KKworCWlmKGRzby0+ZmxhZ3MgJiBEU09fRkxBR19VUENBU0VfU1lNQk9MKSBmbGFncyA9IDA7CisKKwlzdGF0dXMgPSBkb19maW5kX3N5bWJvbChwdHIsICZzeW1uYW1lX2RzYywgc3ltLCBmbGFncyk7CisKKwlpZighJFZNU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQl7CisJCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKwkJY2hhciBlcnJzdHJpbmdbMjU3XTsKKwkJc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MgZXJyc3RyaW5nX2RzYzsKKworCQllcnJzdHJpbmdfZHNjLmRzYyR3X2xlbmd0aCA9IHNpemVvZihlcnJzdHJpbmcpOworCQllcnJzdHJpbmdfZHNjLmRzYyRiX2R0eXBlID0gRFNDJEtfRFRZUEVfVDsKKwkJZXJyc3RyaW5nX2RzYy5kc2MkYl9jbGFzcyA9IERTQyRLX0NMQVNTX1M7CisJCWVycnN0cmluZ19kc2MuZHNjJGFfcG9pbnRlciA9IGVycnN0cmluZzsKKworCQkqc3ltID0gTlVMTDsKKworCQlzdGF0dXMgPSBzeXMkZ2V0bXNnKHN0YXR1cywgJmxlbmd0aCwgJmVycnN0cmluZ19kc2MsIDEsIDApOworCisJCWlmICghJFZNU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJbGliJHNpZ25hbChzdGF0dXMpOyAvKiBUaGlzIGlzIHJlYWxseSBiYWQuICBBYm9ydCEgICovCisJCWVsc2UKKwkJCXsKKwkJCWVycnN0cmluZ1tsZW5ndGhdID0gJ1wwJzsKKworCQkJRFNPZXJyKERTT19GX1ZNU19CSU5EX1NZTSxEU09fUl9TWU1fRkFJTFVSRSk7CisJCQlpZiAocHRyLT5pbWFnZW5hbWVfZHNjLmRzYyR3X2xlbmd0aCkKKwkJCQlFUlJfYWRkX2Vycm9yX2RhdGEoOSwKKwkJCQkJIlN5bWJvbCAiLCBzeW1uYW1lLAorCQkJCQkiIGluICIsIHB0ci0+ZmlsZW5hbWUsCisJCQkJCSIgKCIsIHB0ci0+aW1hZ2VuYW1lLCAiKSIsCisJCQkJCSI6ICIsIGVycnN0cmluZyk7CisJCQllbHNlCisJCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDYsCisJCQkJCSJTeW1ib2wgIiwgc3ltbmFtZSwKKwkJCQkJIiBpbiAiLCBwdHItPmZpbGVuYW1lLAorCQkJCQkiOiAiLCBlcnJzdHJpbmcpOworCQkJfQorCQlyZXR1cm47CisJCX0KKwlyZXR1cm47CisJfQorCitzdGF0aWMgdm9pZCAqdm1zX2JpbmRfdmFyKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKQorCXsKKwl2b2lkICpzeW0gPSAwOworCXZtc19iaW5kX3N5bShkc28sIHN5bW5hbWUsICZzeW0pOworCXJldHVybiBzeW07CisJfQorCitzdGF0aWMgRFNPX0ZVTkNfVFlQRSB2bXNfYmluZF9mdW5jKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKQorCXsKKwlEU09fRlVOQ19UWVBFIHN5bSA9IDA7CisJdm1zX2JpbmRfc3ltKGRzbywgc3ltbmFtZSwgKHZvaWQgKiopJnN5bSk7CisJcmV0dXJuIHN5bTsKKwl9CisKK3N0YXRpYyBjaGFyICp2bXNfbWVyZ2VyKERTTyAqZHNvLCBjb25zdCBjaGFyICpmaWxlc3BlYzEsIGNvbnN0IGNoYXIgKmZpbGVzcGVjMikKKwl7CisJaW50IHN0YXR1czsKKwlpbnQgZmlsZXNwZWMxbGVuLCBmaWxlc3BlYzJsZW47CisJc3RydWN0IEZBQiBmYWI7CisjaWZkZWYgTkFNTCRDX01BWFJTUworCXN0cnVjdCBOQU1MIG5hbTsKKwljaGFyIGVzYVtOQU1MJENfTUFYUlNTXTsKKyNlbHNlCisJc3RydWN0IE5BTSBuYW07CisJY2hhciBlc2FbTkFNJENfTUFYUlNTXTsKKyNlbmRpZgorCWNoYXIgKm1lcmdlZDsKKworCWlmICghZmlsZXNwZWMxKSBmaWxlc3BlYzEgPSAiIjsKKwlpZiAoIWZpbGVzcGVjMikgZmlsZXNwZWMyID0gIiI7CisJZmlsZXNwZWMxbGVuID0gc3RybGVuKGZpbGVzcGVjMSk7CisJZmlsZXNwZWMybGVuID0gc3RybGVuKGZpbGVzcGVjMik7CisKKwlmYWIgPSBjYyRybXNfZmFiOworI2lmZGVmIE5BTUwkQ19NQVhSU1MKKwluYW0gPSBjYyRybXNfbmFtbDsKKyNlbHNlCisJbmFtID0gY2Mkcm1zX25hbTsKKyNlbmRpZgorCisJZmFiLmZhYiRsX2ZuYSA9IChjaGFyICopZmlsZXNwZWMxOworCWZhYi5mYWIkYl9mbnMgPSBmaWxlc3BlYzFsZW47CisJZmFiLmZhYiRsX2RuYSA9IChjaGFyICopZmlsZXNwZWMyOworCWZhYi5mYWIkYl9kbnMgPSBmaWxlc3BlYzJsZW47CisjaWZkZWYgTkFNTCRDX01BWFJTUworCWlmIChmaWxlc3BlYzFsZW4gPiBOQU0kQ19NQVhSU1MpCisJCXsKKwkJZmFiLmZhYiRsX2ZuYSA9IDA7CisJCWZhYi5mYWIkYl9mbnMgPSAwOworCQluYW0ubmFtbCRsX2xvbmdfZmlsZW5hbWUgPSAoY2hhciAqKWZpbGVzcGVjMTsKKwkJbmFtLm5hbWwkbF9sb25nX2ZpbGVuYW1lX3NpemUgPSBmaWxlc3BlYzFsZW47CisJCX0KKwlpZiAoZmlsZXNwZWMybGVuID4gTkFNJENfTUFYUlNTKQorCQl7CisJCWZhYi5mYWIkbF9kbmEgPSAwOworCQlmYWIuZmFiJGJfZG5zID0gMDsKKwkJbmFtLm5hbWwkbF9sb25nX2RlZm5hbWUgPSAoY2hhciAqKWZpbGVzcGVjMjsKKwkJbmFtLm5hbWwkbF9sb25nX2RlZm5hbWVfc2l6ZSA9IGZpbGVzcGVjMmxlbjsKKwkJfQorCW5hbS5uYW1sJGxfZXNhID0gZXNhOworCW5hbS5uYW1sJGJfZXNzID0gTkFNJENfTUFYUlNTOworCW5hbS5uYW1sJGxfbG9uZ19leHBhbmQgPSBlc2E7CisJbmFtLm5hbWwkbF9sb25nX2V4cGFuZF9hbGxvYyA9IHNpemVvZihlc2EpOworCW5hbS5uYW1sJGJfbm9wID0gTkFNJE1fU1lOQ0hLIHwgTkFNJE1fUFdEOworCW5hbS5uYW1sJHZfbm9fc2hvcnRfdXBjYXNlID0gMTsKKwlmYWIuZmFiJGxfbmFtbCA9ICZuYW07CisjZWxzZQorCW5hbS5uYW0kbF9lc2EgPSBlc2E7CisJbmFtLm5hbSRiX2VzcyA9IE5BTSRDX01BWFJTUzsKKwluYW0ubmFtJGJfbm9wID0gTkFNJE1fU1lOQ0hLIHwgTkFNJE1fUFdEOworCWZhYi5mYWIkbF9uYW0gPSAmbmFtOworI2VuZGlmCisKKwlzdGF0dXMgPSBzeXMkcGFyc2UoJmZhYiwgMCwgMCk7CisKKwlpZighJFZNU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQl7CisJCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKwkJY2hhciBlcnJzdHJpbmdbMjU3XTsKKwkJc3RydWN0IGRzYyRkZXNjcmlwdG9yX3MgZXJyc3RyaW5nX2RzYzsKKworCQllcnJzdHJpbmdfZHNjLmRzYyR3X2xlbmd0aCA9IHNpemVvZihlcnJzdHJpbmcpOworCQllcnJzdHJpbmdfZHNjLmRzYyRiX2R0eXBlID0gRFNDJEtfRFRZUEVfVDsKKwkJZXJyc3RyaW5nX2RzYy5kc2MkYl9jbGFzcyA9IERTQyRLX0NMQVNTX1M7CisJCWVycnN0cmluZ19kc2MuZHNjJGFfcG9pbnRlciA9IGVycnN0cmluZzsKKworCQlzdGF0dXMgPSBzeXMkZ2V0bXNnKHN0YXR1cywgJmxlbmd0aCwgJmVycnN0cmluZ19kc2MsIDEsIDApOworCisJCWlmICghJFZNU19TVEFUVVNfU1VDQ0VTUyhzdGF0dXMpKQorCQkJbGliJHNpZ25hbChzdGF0dXMpOyAvKiBUaGlzIGlzIHJlYWxseSBiYWQuICBBYm9ydCEgICovCisJCWVsc2UKKwkJCXsKKwkJCWVycnN0cmluZ1tsZW5ndGhdID0gJ1wwJzsKKworCQkJRFNPZXJyKERTT19GX1ZNU19NRVJHRVIsRFNPX1JfRkFJTFVSRSk7CisJCQlFUlJfYWRkX2Vycm9yX2RhdGEoNywKKwkJCQkJICAgImZpbGVzcGVjIFwiIiwgZmlsZXNwZWMxLCAiXCIsICIsCisJCQkJCSAgICJkZWZhdWx0cyBcIiIsIGZpbGVzcGVjMiwgIlwiOiAiLAorCQkJCQkgICBlcnJzdHJpbmcpOworCQkJfQorCQlyZXR1cm4oTlVMTCk7CisJCX0KKyNpZmRlZiBOQU1MJENfTUFYUlNTCisJaWYgKG5hbS5uYW1sJGxfbG9uZ19leHBhbmRfc2l6ZSkKKwkJeworCQltZXJnZWQgPSBPUEVOU1NMX21hbGxvYyhuYW0ubmFtbCRsX2xvbmdfZXhwYW5kX3NpemUgKyAxKTsKKwkJaWYoIW1lcmdlZCkKKwkJCWdvdG8gbWFsbG9jX2VycjsKKwkJc3RybmNweShtZXJnZWQsIG5hbS5uYW1sJGxfbG9uZ19leHBhbmQsCisJCQluYW0ubmFtbCRsX2xvbmdfZXhwYW5kX3NpemUpOworCQltZXJnZWRbbmFtLm5hbWwkbF9sb25nX2V4cGFuZF9zaXplXSA9ICdcMCc7CisJCX0KKwllbHNlCisJCXsKKwkJbWVyZ2VkID0gT1BFTlNTTF9tYWxsb2MobmFtLm5hbWwkYl9lc2wgKyAxKTsKKwkJaWYoIW1lcmdlZCkKKwkJCWdvdG8gbWFsbG9jX2VycjsKKwkJc3RybmNweShtZXJnZWQsIG5hbS5uYW1sJGxfZXNhLAorCQkJbmFtLm5hbWwkYl9lc2wpOworCQltZXJnZWRbbmFtLm5hbWwkYl9lc2xdID0gJ1wwJzsKKwkJfQorI2Vsc2UKKwltZXJnZWQgPSBPUEVOU1NMX21hbGxvYyhuYW0ubmFtJGJfZXNsICsgMSk7CisJaWYoIW1lcmdlZCkKKwkJZ290byBtYWxsb2NfZXJyOworCXN0cm5jcHkobWVyZ2VkLCBuYW0ubmFtJGxfZXNhLAorCQluYW0ubmFtJGJfZXNsKTsKKwltZXJnZWRbbmFtLm5hbSRiX2VzbF0gPSAnXDAnOworI2VuZGlmCisJcmV0dXJuKG1lcmdlZCk7CisgbWFsbG9jX2VycjoKKwlEU09lcnIoRFNPX0ZfVk1TX01FUkdFUiwKKwkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCX0KKworc3RhdGljIGNoYXIgKnZtc19uYW1lX2NvbnZlcnRlcihEU08gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUpCisJeworICAgICAgICBpbnQgbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKyAgICAgICAgY2hhciAqbm90X3RyYW5zbGF0ZWQgPSBPUEVOU1NMX21hbGxvYyhsZW4rMSk7CisgICAgICAgIHN0cmNweShub3RfdHJhbnNsYXRlZCxmaWxlbmFtZSk7CisJcmV0dXJuKG5vdF90cmFuc2xhdGVkKTsKKwl9CisKKyNlbmRpZiAvKiBPUEVOU1NMX1NZU19WTVMgKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9kc28vZHNvX3dpbjMyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb193aW4zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjZjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZHNvL2Rzb193aW4zMi5jCkBAIC0wLDAgKzEsODQ0IEBACisvKiBkc29fd2luMzIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogV3JpdHRlbiBieSBHZW9mZiBUaG9ycGUgKGdlb2ZmQGdlb2ZmdGhvcnBlLm5ldCkgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Rzby5oPgorCisjaWYgIWRlZmluZWQoRFNPX1dJTjMyKQorRFNPX01FVEhPRCAqRFNPX01FVEhPRF93aW4zMih2b2lkKQorCXsKKwlyZXR1cm4gTlVMTDsKKwl9CisjZWxzZQorCisjaWZkZWYgX1dJTjMyX1dDRQorIyBpZiBfV0lOMzJfV0NFIDwgMzAwCitzdGF0aWMgRkFSUFJPQyBHZXRQcm9jQWRkcmVzc0EoSE1PRFVMRSBoTW9kdWxlLExQQ1NUUiBscFByb2NOYW1lKQorCXsKKwlXQ0hBUiBscFByb2NOYW1lV1s2NF07CisJaW50IGk7CisKKwlmb3IgKGk9MDtscFByb2NOYW1lW2ldICYmIGk8NjQ7aSsrKQorCQlscFByb2NOYW1lV1tpXSA9IChXQ0hBUilscFByb2NOYW1lW2ldOworCWlmIChpPT02NCkgcmV0dXJuIE5VTEw7CisJbHBQcm9jTmFtZVdbaV0gPSAwOworCisJcmV0dXJuIEdldFByb2NBZGRyZXNzVyhoTW9kdWxlLGxwUHJvY05hbWVXKTsKKwl9CisjIGVuZGlmCisjIHVuZGVmIEdldFByb2NBZGRyZXNzCisjIGRlZmluZSBHZXRQcm9jQWRkcmVzcyBHZXRQcm9jQWRkcmVzc0EKKworc3RhdGljIEhJTlNUQU5DRSBMb2FkTGlicmFyeUEoTFBDU1RSIGxwTGliRmlsZU5hbWUpCisJeworCVdDSEFSICpmbmFtdzsKKwlzaXplX3QgbGVuXzA9c3RybGVuKGxwTGliRmlsZU5hbWUpKzEsaTsKKworI2lmZGVmIF9NU0NfVkVSCisJZm5hbXcgPSAoV0NIQVIgKilfYWxsb2NhIChsZW5fMCpzaXplb2YoV0NIQVIpKTsKKyNlbHNlCisJZm5hbXcgPSAoV0NIQVIgKilhbGxvY2EgKGxlbl8wKnNpemVvZihXQ0hBUikpOworI2VuZGlmCisJaWYgKGZuYW13ID09IE5VTEwpCisJCXsKKwkJU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgX1dJTjMyX1dDRT49MTAxCisJaWYgKCFNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwwLGxwTGliRmlsZU5hbWUsbGVuXzAsZm5hbXcsbGVuXzApKQorI2VuZGlmCisJCWZvciAoaT0wO2k8bGVuXzA7aSsrKSBmbmFtd1tpXT0oV0NIQVIpbHBMaWJGaWxlTmFtZVtpXTsKKworCXJldHVybiBMb2FkTGlicmFyeVcoZm5hbXcpOworCX0KKyNlbmRpZgorCisvKiBQYXJ0IG9mIHRoZSBoYWNrIGluICJ3aW4zMl9sb2FkIiAuLi4gKi8KKyNkZWZpbmUgRFNPX01BWF9UUkFOU0xBVEVEX1NJWkUgMjU2CisKK3N0YXRpYyBpbnQgd2luMzJfbG9hZChEU08gKmRzbyk7CitzdGF0aWMgaW50IHdpbjMyX3VubG9hZChEU08gKmRzbyk7CitzdGF0aWMgdm9pZCAqd2luMzJfYmluZF92YXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworc3RhdGljIERTT19GVU5DX1RZUEUgd2luMzJfYmluZF9mdW5jKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKTsKKyNpZiAwCitzdGF0aWMgaW50IHdpbjMyX3VuYmluZF92YXIoRFNPICpkc28sIGNoYXIgKnN5bW5hbWUsIHZvaWQgKnN5bXB0cik7CitzdGF0aWMgaW50IHdpbjMyX3VuYmluZF9mdW5jKERTTyAqZHNvLCBjaGFyICpzeW1uYW1lLCBEU09fRlVOQ19UWVBFIHN5bXB0cik7CitzdGF0aWMgaW50IHdpbjMyX2luaXQoRFNPICpkc28pOworc3RhdGljIGludCB3aW4zMl9maW5pc2goRFNPICpkc28pOworc3RhdGljIGxvbmcgd2luMzJfY3RybChEU08gKmRzbywgaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKKyNlbmRpZgorc3RhdGljIGNoYXIgKndpbjMyX25hbWVfY29udmVydGVyKERTTyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CitzdGF0aWMgY2hhciAqd2luMzJfbWVyZ2VyKERTTyAqZHNvLCBjb25zdCBjaGFyICpmaWxlc3BlYzEsCisJY29uc3QgY2hhciAqZmlsZXNwZWMyKTsKK3N0YXRpYyBpbnQgd2luMzJfcGF0aGJ5YWRkcih2b2lkICphZGRyLGNoYXIgKnBhdGgsaW50IHN6KTsKK3N0YXRpYyB2b2lkICp3aW4zMl9nbG9iYWxsb29rdXAoY29uc3QgY2hhciAqbmFtZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpvcGVuc3NsX3N0cm5jaHIoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgYywgc2l6ZV90IGxlbik7CisKK3N0YXRpYyBEU09fTUVUSE9EIGRzb19tZXRoX3dpbjMyID0geworCSJPcGVuU1NMICd3aW4zMicgc2hhcmVkIGxpYnJhcnkgbWV0aG9kIiwKKwl3aW4zMl9sb2FkLAorCXdpbjMyX3VubG9hZCwKKwl3aW4zMl9iaW5kX3ZhciwKKwl3aW4zMl9iaW5kX2Z1bmMsCisvKiBGb3Igbm93LCAidW5iaW5kIiBkb2Vzbid0IGV4aXN0ICovCisjaWYgMAorCU5VTEwsIC8qIHVuYmluZF92YXIgKi8KKwlOVUxMLCAvKiB1bmJpbmRfZnVuYyAqLworI2VuZGlmCisJTlVMTCwgLyogY3RybCAqLworCXdpbjMyX25hbWVfY29udmVydGVyLAorCXdpbjMyX21lcmdlciwKKwlOVUxMLCAvKiBpbml0ICovCisJTlVMTCwgLyogZmluaXNoICovCisJd2luMzJfcGF0aGJ5YWRkciwKKwl3aW4zMl9nbG9iYWxsb29rdXAKKwl9OworCitEU09fTUVUSE9EICpEU09fTUVUSE9EX3dpbjMyKHZvaWQpCisJeworCXJldHVybigmZHNvX21ldGhfd2luMzIpOworCX0KKworLyogRm9yIHRoaXMgRFNPX01FVEhPRCwgb3VyIG1ldGhfZGF0YSBTVEFDSyB3aWxsIGNvbnRhaW47CisgKiAoaSkgYSBwb2ludGVyIHRvIHRoZSBoYW5kbGUgKEhJTlNUQU5DRSkgcmV0dXJuZWQgZnJvbQorICogICAgIExvYWRMaWJyYXJ5KCksIGFuZCBjb3BpZWQuCisgKi8KKworc3RhdGljIGludCB3aW4zMl9sb2FkKERTTyAqZHNvKQorCXsKKwlISU5TVEFOQ0UgaCA9IE5VTEwsICpwID0gTlVMTDsKKwkvKiBTZWUgYXBwbGljYWJsZSBjb21tZW50cyBmcm9tIGRzb19kbC5jICovCisJY2hhciAqZmlsZW5hbWUgPSBEU09fY29udmVydF9maWxlbmFtZShkc28sIE5VTEwpOworCisJaWYoZmlsZW5hbWUgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfV0lOMzJfTE9BRCxEU09fUl9OT19GSUxFTkFNRSk7CisJCWdvdG8gZXJyOworCQl9CisJaCA9IExvYWRMaWJyYXJ5QShmaWxlbmFtZSk7CisJaWYoaCA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9XSU4zMl9MT0FELERTT19SX0xPQURfRkFJTEVEKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDMsICJmaWxlbmFtZSgiLCBmaWxlbmFtZSwgIikiKTsKKwkJZ290byBlcnI7CisJCX0KKwlwID0gKEhJTlNUQU5DRSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihISU5TVEFOQ0UpKTsKKwlpZihwID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0xPQUQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCSpwID0gaDsKKwlpZighc2tfdm9pZF9wdXNoKGRzby0+bWV0aF9kYXRhLCBwKSkKKwkJeworCQlEU09lcnIoRFNPX0ZfV0lOMzJfTE9BRCxEU09fUl9TVEFDS19FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisJLyogU3VjY2VzcyAqLworCWRzby0+bG9hZGVkX2ZpbGVuYW1lID0gZmlsZW5hbWU7CisJcmV0dXJuKDEpOworZXJyOgorCS8qIENsZWFudXAgISovCisJaWYoZmlsZW5hbWUgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKGZpbGVuYW1lKTsKKwlpZihwICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShwKTsKKwlpZihoICE9IE5VTEwpCisJCUZyZWVMaWJyYXJ5KGgpOworCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyBpbnQgd2luMzJfdW5sb2FkKERTTyAqZHNvKQorCXsKKwlISU5TVEFOQ0UgKnA7CisJaWYoZHNvID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX1VOTE9BRCxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZihza192b2lkX251bShkc28tPm1ldGhfZGF0YSkgPCAxKQorCQlyZXR1cm4oMSk7CisJcCA9IHNrX3ZvaWRfcG9wKGRzby0+bWV0aF9kYXRhKTsKKwlpZihwID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX1VOTE9BRCxEU09fUl9OVUxMX0hBTkRMRSk7CisJCXJldHVybigwKTsKKwkJfQorCWlmKCFGcmVlTGlicmFyeSgqcCkpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX1VOTE9BRCxEU09fUl9VTkxPQURfRkFJTEVEKTsKKwkJLyogV2Ugc2hvdWxkIHB1c2ggdGhlIHZhbHVlIGJhY2sgb250byB0aGUgc3RhY2sgaW4KKwkJICogY2FzZSBvZiBhIHJldHJ5LiAqLworCQlza192b2lkX3B1c2goZHNvLT5tZXRoX2RhdGEsIHApOworCQlyZXR1cm4oMCk7CisJCX0KKwkvKiBDbGVhbnVwICovCisJT1BFTlNTTF9mcmVlKHApOworCXJldHVybigxKTsKKwl9CisKKy8qIFVzaW5nIEdldFByb2NBZGRyZXNzIGZvciB2YXJpYWJsZXM/IFRPRE86IENoZWNrIHRoaXMgb3V0IGluCisgKiB0aGUgV2luMzIgQVBJIGRvY3MsIHRoZXJlJ3MgcHJvYmFibHkgYSB2YXJpYW50IGZvciB2YXJpYWJsZXMuICovCitzdGF0aWMgdm9pZCAqd2luMzJfYmluZF92YXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpCisJeworCUhJTlNUQU5DRSAqcHRyOworCXZvaWQgKnN5bTsKKworCWlmKChkc28gPT0gTlVMTCkgfHwgKHN5bW5hbWUgPT0gTlVMTCkpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0JJTkRfVkFSLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmKHNrX3ZvaWRfbnVtKGRzby0+bWV0aF9kYXRhKSA8IDEpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0JJTkRfVkFSLERTT19SX1NUQUNLX0VSUk9SKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcHRyID0gc2tfdm9pZF92YWx1ZShkc28tPm1ldGhfZGF0YSwgc2tfdm9pZF9udW0oZHNvLT5tZXRoX2RhdGEpIC0gMSk7CisJaWYocHRyID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0JJTkRfVkFSLERTT19SX05VTExfSEFORExFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJc3ltID0gR2V0UHJvY0FkZHJlc3MoKnB0ciwgc3ltbmFtZSk7CisJaWYoc3ltID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0JJTkRfVkFSLERTT19SX1NZTV9GQUlMVVJFKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDMsICJzeW1uYW1lKCIsIHN5bW5hbWUsICIpIik7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXJldHVybihzeW0pOworCX0KKworc3RhdGljIERTT19GVU5DX1RZUEUgd2luMzJfYmluZF9mdW5jKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKQorCXsKKwlISU5TVEFOQ0UgKnB0cjsKKwl2b2lkICpzeW07CisKKwlpZigoZHNvID09IE5VTEwpIHx8IChzeW1uYW1lID09IE5VTEwpKQorCQl7CisJCURTT2VycihEU09fRl9XSU4zMl9CSU5EX0ZVTkMsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYoc2tfdm9pZF9udW0oZHNvLT5tZXRoX2RhdGEpIDwgMSkKKwkJeworCQlEU09lcnIoRFNPX0ZfV0lOMzJfQklORF9GVU5DLERTT19SX1NUQUNLX0VSUk9SKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcHRyID0gc2tfdm9pZF92YWx1ZShkc28tPm1ldGhfZGF0YSwgc2tfdm9pZF9udW0oZHNvLT5tZXRoX2RhdGEpIC0gMSk7CisJaWYocHRyID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0JJTkRfRlVOQyxEU09fUl9OVUxMX0hBTkRMRSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXN5bSA9IEdldFByb2NBZGRyZXNzKCpwdHIsIHN5bW5hbWUpOworCWlmKHN5bSA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9XSU4zMl9CSU5EX0ZVTkMsRFNPX1JfU1lNX0ZBSUxVUkUpOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoMywgInN5bW5hbWUoIiwgc3ltbmFtZSwgIikiKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJcmV0dXJuKChEU09fRlVOQ19UWVBFKXN5bSk7CisJfQorCitzdHJ1Y3QgZmlsZV9zdAorCXsKKwljb25zdCBjaGFyICpub2RlOyBpbnQgbm9kZWxlbjsKKwljb25zdCBjaGFyICpkZXZpY2U7IGludCBkZXZpY2VsZW47CisJY29uc3QgY2hhciAqcHJlZGlyOyBpbnQgcHJlZGlybGVuOworCWNvbnN0IGNoYXIgKmRpcjsgaW50IGRpcmxlbjsKKwljb25zdCBjaGFyICpmaWxlOyBpbnQgZmlsZWxlbjsKKwl9OworCitzdGF0aWMgc3RydWN0IGZpbGVfc3QgKndpbjMyX3NwbGl0dGVyKERTTyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwlpbnQgYXNzdW1lX2xhc3RfaXNfZGlyKQorCXsKKwlzdHJ1Y3QgZmlsZV9zdCAqcmVzdWx0ID0gTlVMTDsKKwllbnVtIHsgSU5fTk9ERSwgSU5fREVWSUNFLCBJTl9GSUxFIH0gcG9zaXRpb247CisJY29uc3QgY2hhciAqc3RhcnQgPSBmaWxlbmFtZTsKKwljaGFyIGxhc3Q7CisKKwlpZiAoIWZpbGVuYW1lKQorCQl7CisJCURTT2VycihEU09fRl9XSU4zMl9TUExJVFRFUixEU09fUl9OT19GSUxFTkFNRSk7CisJCS8qZ290byBlcnI7Ki8KKwkJcmV0dXJuKE5VTEwpOworCQl9CisKKwlyZXN1bHQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2Yoc3RydWN0IGZpbGVfc3QpKTsKKwlpZihyZXN1bHQgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfV0lOMzJfU1BMSVRURVIsCisJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCisJbWVtc2V0KHJlc3VsdCwgMCwgc2l6ZW9mKHN0cnVjdCBmaWxlX3N0KSk7CisJcG9zaXRpb24gPSBJTl9ERVZJQ0U7CisKKwlpZigoZmlsZW5hbWVbMF0gPT0gJ1xcJyAmJiBmaWxlbmFtZVsxXSA9PSAnXFwnKQorCQl8fCAoZmlsZW5hbWVbMF0gPT0gJy8nICYmIGZpbGVuYW1lWzFdID09ICcvJykpCisJCXsKKwkJcG9zaXRpb24gPSBJTl9OT0RFOworCQlmaWxlbmFtZSArPSAyOworCQlzdGFydCA9IGZpbGVuYW1lOworCQlyZXN1bHQtPm5vZGUgPSBzdGFydDsKKwkJfQorCisJZG8KKwkJeworCQlsYXN0ID0gZmlsZW5hbWVbMF07CisJCXN3aXRjaChsYXN0KQorCQkJeworCQljYXNlICc6JzoKKwkJCWlmKHBvc2l0aW9uICE9IElOX0RFVklDRSkKKwkJCQl7CisJCQkJRFNPZXJyKERTT19GX1dJTjMyX1NQTElUVEVSLAorCQkJCQlEU09fUl9JTkNPUlJFQ1RfRklMRV9TWU5UQVgpOworCQkJCS8qZ290byBlcnI7Ki8KKwkJCQlPUEVOU1NMX2ZyZWUocmVzdWx0KTsKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQkJfQorCQkJcmVzdWx0LT5kZXZpY2UgPSBzdGFydDsKKwkJCXJlc3VsdC0+ZGV2aWNlbGVuID0gKGludCkoZmlsZW5hbWUgLSBzdGFydCk7CisJCQlwb3NpdGlvbiA9IElOX0ZJTEU7CisJCQlzdGFydCA9ICsrZmlsZW5hbWU7CisJCQlyZXN1bHQtPmRpciA9IHN0YXJ0OworCQkJYnJlYWs7CisJCWNhc2UgJ1xcJzoKKwkJY2FzZSAnLyc6CisJCQlpZihwb3NpdGlvbiA9PSBJTl9OT0RFKQorCQkJCXsKKwkJCQlyZXN1bHQtPm5vZGVsZW4gPSAoaW50KShmaWxlbmFtZSAtIHN0YXJ0KTsKKwkJCQlwb3NpdGlvbiA9IElOX0ZJTEU7CisJCQkJc3RhcnQgPSArK2ZpbGVuYW1lOworCQkJCXJlc3VsdC0+ZGlyID0gc3RhcnQ7CisJCQkJfQorCQkJZWxzZSBpZihwb3NpdGlvbiA9PSBJTl9ERVZJQ0UpCisJCQkJeworCQkJCXBvc2l0aW9uID0gSU5fRklMRTsKKwkJCQlmaWxlbmFtZSsrOworCQkJCXJlc3VsdC0+ZGlyID0gc3RhcnQ7CisJCQkJcmVzdWx0LT5kaXJsZW4gPSAoaW50KShmaWxlbmFtZSAtIHN0YXJ0KTsKKwkJCQlzdGFydCA9IGZpbGVuYW1lOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJZmlsZW5hbWUrKzsKKwkJCQlyZXN1bHQtPmRpcmxlbiArPSAoaW50KShmaWxlbmFtZSAtIHN0YXJ0KTsKKwkJCQlzdGFydCA9IGZpbGVuYW1lOworCQkJCX0KKwkJCWJyZWFrOworCQljYXNlICdcMCc6CisJCQlpZihwb3NpdGlvbiA9PSBJTl9OT0RFKQorCQkJCXsKKwkJCQlyZXN1bHQtPm5vZGVsZW4gPSAoaW50KShmaWxlbmFtZSAtIHN0YXJ0KTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWlmKGZpbGVuYW1lIC0gc3RhcnQgPiAwKQorCQkJCQl7CisJCQkJCWlmIChhc3N1bWVfbGFzdF9pc19kaXIpCisJCQkJCQl7CisJCQkJCQlpZiAocG9zaXRpb24gPT0gSU5fREVWSUNFKQorCQkJCQkJCXsKKwkJCQkJCQlyZXN1bHQtPmRpciA9IHN0YXJ0OworCQkJCQkJCXJlc3VsdC0+ZGlybGVuID0gMDsKKwkJCQkJCQl9CisJCQkJCQlyZXN1bHQtPmRpcmxlbiArPQorCQkJCQkJCShpbnQpKGZpbGVuYW1lIC0gc3RhcnQpOworCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQlyZXN1bHQtPmZpbGUgPSBzdGFydDsKKwkJCQkJCXJlc3VsdC0+ZmlsZWxlbiA9CisJCQkJCQkJKGludCkoZmlsZW5hbWUgLSBzdGFydCk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZpbGVuYW1lKys7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCXdoaWxlKGxhc3QpOworCisJaWYoIXJlc3VsdC0+bm9kZWxlbikgcmVzdWx0LT5ub2RlID0gTlVMTDsKKwlpZighcmVzdWx0LT5kZXZpY2VsZW4pIHJlc3VsdC0+ZGV2aWNlID0gTlVMTDsKKwlpZighcmVzdWx0LT5kaXJsZW4pIHJlc3VsdC0+ZGlyID0gTlVMTDsKKwlpZighcmVzdWx0LT5maWxlbGVuKSByZXN1bHQtPmZpbGUgPSBOVUxMOworCisJcmV0dXJuKHJlc3VsdCk7CisJfQorCitzdGF0aWMgY2hhciAqd2luMzJfam9pbmVyKERTTyAqZHNvLCBjb25zdCBzdHJ1Y3QgZmlsZV9zdCAqZmlsZV9zcGxpdCkKKwl7CisJaW50IGxlbiA9IDAsIG9mZnNldCA9IDA7CisJY2hhciAqcmVzdWx0ID0gTlVMTDsKKwljb25zdCBjaGFyICpzdGFydDsKKworCWlmKCFmaWxlX3NwbGl0KQorCQl7CisJCURTT2VycihEU09fRl9XSU4zMl9KT0lORVIsCisJCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYoZmlsZV9zcGxpdC0+bm9kZSkKKwkJeworCQlsZW4gKz0gMiArIGZpbGVfc3BsaXQtPm5vZGVsZW47CS8qIDIgZm9yIHN0YXJ0aW5nIFxcICovCisJCWlmKGZpbGVfc3BsaXQtPnByZWRpciB8fCBmaWxlX3NwbGl0LT5kaXIgfHwgZmlsZV9zcGxpdC0+ZmlsZSkKKwkJCWxlbisrOwkvKiAxIGZvciBlbmRpbmcgXCAqLworCQl9CisJZWxzZSBpZihmaWxlX3NwbGl0LT5kZXZpY2UpCisJCXsKKwkJbGVuICs9IGZpbGVfc3BsaXQtPmRldmljZWxlbiArIDE7IC8qIDEgZm9yIGVuZGluZyA6ICovCisJCX0KKwlsZW4gKz0gZmlsZV9zcGxpdC0+cHJlZGlybGVuOworCWlmKGZpbGVfc3BsaXQtPnByZWRpciAmJiAoZmlsZV9zcGxpdC0+ZGlyIHx8IGZpbGVfc3BsaXQtPmZpbGUpKQorCQl7CisJCWxlbisrOwkvKiAxIGZvciBlbmRpbmcgXCAqLworCQl9CisJbGVuICs9IGZpbGVfc3BsaXQtPmRpcmxlbjsKKwlpZihmaWxlX3NwbGl0LT5kaXIgJiYgZmlsZV9zcGxpdC0+ZmlsZSkKKwkJeworCQlsZW4rKzsJLyogMSBmb3IgZW5kaW5nIFwgKi8KKwkJfQorCWxlbiArPSBmaWxlX3NwbGl0LT5maWxlbGVuOworCisJaWYoIWxlbikKKwkJeworCQlEU09lcnIoRFNPX0ZfV0lOMzJfSk9JTkVSLCBEU09fUl9FTVBUWV9GSUxFX1NUUlVDVFVSRSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCisJcmVzdWx0ID0gT1BFTlNTTF9tYWxsb2MobGVuICsgMSk7CisJaWYgKCFyZXN1bHQpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0pPSU5FUiwKKwkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisKKwlpZihmaWxlX3NwbGl0LT5ub2RlKQorCQl7CisJCXN0cmNweSgmcmVzdWx0W29mZnNldF0sICJcXFxcIik7IG9mZnNldCArPSAyOworCQlzdHJuY3B5KCZyZXN1bHRbb2Zmc2V0XSwgZmlsZV9zcGxpdC0+bm9kZSwKKwkJCWZpbGVfc3BsaXQtPm5vZGVsZW4pOyBvZmZzZXQgKz0gZmlsZV9zcGxpdC0+bm9kZWxlbjsKKwkJaWYoZmlsZV9zcGxpdC0+cHJlZGlyIHx8IGZpbGVfc3BsaXQtPmRpciB8fCBmaWxlX3NwbGl0LT5maWxlKQorCQkJeworCQkJcmVzdWx0W29mZnNldF0gPSAnXFwnOyBvZmZzZXQrKzsKKwkJCX0KKwkJfQorCWVsc2UgaWYoZmlsZV9zcGxpdC0+ZGV2aWNlKQorCQl7CisJCXN0cm5jcHkoJnJlc3VsdFtvZmZzZXRdLCBmaWxlX3NwbGl0LT5kZXZpY2UsCisJCQlmaWxlX3NwbGl0LT5kZXZpY2VsZW4pOyBvZmZzZXQgKz0gZmlsZV9zcGxpdC0+ZGV2aWNlbGVuOworCQlyZXN1bHRbb2Zmc2V0XSA9ICc6Jzsgb2Zmc2V0Kys7CisJCX0KKwlzdGFydCA9IGZpbGVfc3BsaXQtPnByZWRpcjsKKwl3aGlsZShmaWxlX3NwbGl0LT5wcmVkaXJsZW4gPiAoc3RhcnQgLSBmaWxlX3NwbGl0LT5wcmVkaXIpKQorCQl7CisJCWNvbnN0IGNoYXIgKmVuZCA9IG9wZW5zc2xfc3RybmNocihzdGFydCwgJy8nLAorCQkJZmlsZV9zcGxpdC0+cHJlZGlybGVuIC0gKHN0YXJ0IC0gZmlsZV9zcGxpdC0+cHJlZGlyKSk7CisJCWlmKCFlbmQpCisJCQllbmQgPSBzdGFydAorCQkJCSsgZmlsZV9zcGxpdC0+cHJlZGlybGVuCisJCQkJLSAoc3RhcnQgLSBmaWxlX3NwbGl0LT5wcmVkaXIpOworCQlzdHJuY3B5KCZyZXN1bHRbb2Zmc2V0XSwgc3RhcnQsCisJCQllbmQgLSBzdGFydCk7IG9mZnNldCArPSAoaW50KShlbmQgLSBzdGFydCk7CisJCXJlc3VsdFtvZmZzZXRdID0gJ1xcJzsgb2Zmc2V0Kys7CisJCXN0YXJ0ID0gZW5kICsgMTsKKwkJfQorI2lmIDAgLyogTm90IG5lZWRlZCwgc2luY2UgdGhlIGRpcmVjdG9yeSBjb252ZXJ0ZXIgYWJvdmUgYWxyZWFkeSBhcHBlbmVkZWQKKwkgYSBiYWNrc2xhc2ggKi8KKwlpZihmaWxlX3NwbGl0LT5wcmVkaXIgJiYgKGZpbGVfc3BsaXQtPmRpciB8fCBmaWxlX3NwbGl0LT5maWxlKSkKKwkJeworCQlyZXN1bHRbb2Zmc2V0XSA9ICdcXCc7IG9mZnNldCsrOworCQl9CisjZW5kaWYKKwlzdGFydCA9IGZpbGVfc3BsaXQtPmRpcjsKKwl3aGlsZShmaWxlX3NwbGl0LT5kaXJsZW4gPiAoc3RhcnQgLSBmaWxlX3NwbGl0LT5kaXIpKQorCQl7CisJCWNvbnN0IGNoYXIgKmVuZCA9IG9wZW5zc2xfc3RybmNocihzdGFydCwgJy8nLAorCQkJZmlsZV9zcGxpdC0+ZGlybGVuIC0gKHN0YXJ0IC0gZmlsZV9zcGxpdC0+ZGlyKSk7CisJCWlmKCFlbmQpCisJCQllbmQgPSBzdGFydAorCQkJCSsgZmlsZV9zcGxpdC0+ZGlybGVuCisJCQkJLSAoc3RhcnQgLSBmaWxlX3NwbGl0LT5kaXIpOworCQlzdHJuY3B5KCZyZXN1bHRbb2Zmc2V0XSwgc3RhcnQsCisJCQllbmQgLSBzdGFydCk7IG9mZnNldCArPSAoaW50KShlbmQgLSBzdGFydCk7CisJCXJlc3VsdFtvZmZzZXRdID0gJ1xcJzsgb2Zmc2V0Kys7CisJCXN0YXJ0ID0gZW5kICsgMTsKKwkJfQorI2lmIDAgLyogTm90IG5lZWRlZCwgc2luY2UgdGhlIGRpcmVjdG9yeSBjb252ZXJ0ZXIgYWJvdmUgYWxyZWFkeSBhcHBlbmVkZWQKKwkgYSBiYWNrc2xhc2ggKi8KKwlpZihmaWxlX3NwbGl0LT5kaXIgJiYgZmlsZV9zcGxpdC0+ZmlsZSkKKwkJeworCQlyZXN1bHRbb2Zmc2V0XSA9ICdcXCc7IG9mZnNldCsrOworCQl9CisjZW5kaWYKKwlzdHJuY3B5KCZyZXN1bHRbb2Zmc2V0XSwgZmlsZV9zcGxpdC0+ZmlsZSwKKwkJZmlsZV9zcGxpdC0+ZmlsZWxlbik7IG9mZnNldCArPSBmaWxlX3NwbGl0LT5maWxlbGVuOworCXJlc3VsdFtvZmZzZXRdID0gJ1wwJzsKKwlyZXR1cm4ocmVzdWx0KTsKKwl9CisKK3N0YXRpYyBjaGFyICp3aW4zMl9tZXJnZXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVzcGVjMSwgY29uc3QgY2hhciAqZmlsZXNwZWMyKQorCXsKKwljaGFyICptZXJnZWQgPSBOVUxMOworCXN0cnVjdCBmaWxlX3N0ICpmaWxlc3BlYzFfc3BsaXQgPSBOVUxMOworCXN0cnVjdCBmaWxlX3N0ICpmaWxlc3BlYzJfc3BsaXQgPSBOVUxMOworCisJaWYoIWZpbGVzcGVjMSAmJiAhZmlsZXNwZWMyKQorCQl7CisJCURTT2VycihEU09fRl9XSU4zMl9NRVJHRVIsCisJCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYgKCFmaWxlc3BlYzIpCisJCXsKKwkJbWVyZ2VkID0gT1BFTlNTTF9tYWxsb2Moc3RybGVuKGZpbGVzcGVjMSkgKyAxKTsKKwkJaWYoIW1lcmdlZCkKKwkJCXsKKwkJCURTT2VycihEU09fRl9XSU4zMl9NRVJHRVIsCisJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQlzdHJjcHkobWVyZ2VkLCBmaWxlc3BlYzEpOworCQl9CisJZWxzZSBpZiAoIWZpbGVzcGVjMSkKKwkJeworCQltZXJnZWQgPSBPUEVOU1NMX21hbGxvYyhzdHJsZW4oZmlsZXNwZWMyKSArIDEpOworCQlpZighbWVyZ2VkKQorCQkJeworCQkJRFNPZXJyKERTT19GX1dJTjMyX01FUkdFUiwKKwkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCXN0cmNweShtZXJnZWQsIGZpbGVzcGVjMik7CisJCX0KKwllbHNlCisJCXsKKwkJZmlsZXNwZWMxX3NwbGl0ID0gd2luMzJfc3BsaXR0ZXIoZHNvLCBmaWxlc3BlYzEsIDApOworCQlpZiAoIWZpbGVzcGVjMV9zcGxpdCkKKwkJCXsKKwkJCURTT2VycihEU09fRl9XSU4zMl9NRVJHRVIsCisJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQlmaWxlc3BlYzJfc3BsaXQgPSB3aW4zMl9zcGxpdHRlcihkc28sIGZpbGVzcGVjMiwgMSk7CisJCWlmICghZmlsZXNwZWMyX3NwbGl0KQorCQkJeworCQkJRFNPZXJyKERTT19GX1dJTjMyX01FUkdFUiwKKwkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlPUEVOU1NMX2ZyZWUoZmlsZXNwZWMxX3NwbGl0KTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKworCQkvKiBGaWxsIGluIGludG8gZmlsZXNwZWMxX3NwbGl0ICovCisJCWlmICghZmlsZXNwZWMxX3NwbGl0LT5ub2RlICYmICFmaWxlc3BlYzFfc3BsaXQtPmRldmljZSkKKwkJCXsKKwkJCWZpbGVzcGVjMV9zcGxpdC0+bm9kZSA9IGZpbGVzcGVjMl9zcGxpdC0+bm9kZTsKKwkJCWZpbGVzcGVjMV9zcGxpdC0+bm9kZWxlbiA9IGZpbGVzcGVjMl9zcGxpdC0+bm9kZWxlbjsKKwkJCWZpbGVzcGVjMV9zcGxpdC0+ZGV2aWNlID0gZmlsZXNwZWMyX3NwbGl0LT5kZXZpY2U7CisJCQlmaWxlc3BlYzFfc3BsaXQtPmRldmljZWxlbiA9IGZpbGVzcGVjMl9zcGxpdC0+ZGV2aWNlbGVuOworCQkJfQorCQlpZiAoIWZpbGVzcGVjMV9zcGxpdC0+ZGlyKQorCQkJeworCQkJZmlsZXNwZWMxX3NwbGl0LT5kaXIgPSBmaWxlc3BlYzJfc3BsaXQtPmRpcjsKKwkJCWZpbGVzcGVjMV9zcGxpdC0+ZGlybGVuID0gZmlsZXNwZWMyX3NwbGl0LT5kaXJsZW47CisJCQl9CisJCWVsc2UgaWYgKGZpbGVzcGVjMV9zcGxpdC0+ZGlyWzBdICE9ICdcXCcKKwkJCSYmIGZpbGVzcGVjMV9zcGxpdC0+ZGlyWzBdICE9ICcvJykKKwkJCXsKKwkJCWZpbGVzcGVjMV9zcGxpdC0+cHJlZGlyID0gZmlsZXNwZWMyX3NwbGl0LT5kaXI7CisJCQlmaWxlc3BlYzFfc3BsaXQtPnByZWRpcmxlbiA9IGZpbGVzcGVjMl9zcGxpdC0+ZGlybGVuOworCQkJfQorCQlpZiAoIWZpbGVzcGVjMV9zcGxpdC0+ZmlsZSkKKwkJCXsKKwkJCWZpbGVzcGVjMV9zcGxpdC0+ZmlsZSA9IGZpbGVzcGVjMl9zcGxpdC0+ZmlsZTsKKwkJCWZpbGVzcGVjMV9zcGxpdC0+ZmlsZWxlbiA9IGZpbGVzcGVjMl9zcGxpdC0+ZmlsZWxlbjsKKwkJCX0KKworCQltZXJnZWQgPSB3aW4zMl9qb2luZXIoZHNvLCBmaWxlc3BlYzFfc3BsaXQpOworCQl9CisJT1BFTlNTTF9mcmVlKGZpbGVzcGVjMV9zcGxpdCk7CisJT1BFTlNTTF9mcmVlKGZpbGVzcGVjMl9zcGxpdCk7CisJcmV0dXJuKG1lcmdlZCk7CisJfQorCitzdGF0aWMgY2hhciAqd2luMzJfbmFtZV9jb252ZXJ0ZXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorCXsKKwljaGFyICp0cmFuc2xhdGVkOworCWludCBsZW4sIHRyYW5zZm9ybTsKKworCWxlbiA9IHN0cmxlbihmaWxlbmFtZSk7CisJdHJhbnNmb3JtID0gKChzdHJzdHIoZmlsZW5hbWUsICIvIikgPT0gTlVMTCkgJiYKKwkJCShzdHJzdHIoZmlsZW5hbWUsICJcXCIpID09IE5VTEwpICYmCisJCQkoc3Ryc3RyKGZpbGVuYW1lLCAiOiIpID09IE5VTEwpKTsKKwlpZih0cmFuc2Zvcm0pCisJCS8qIFdlIHdpbGwgY29udmVydCB0aGlzIHRvICIlcy5kbGwiICovCisJCXRyYW5zbGF0ZWQgPSBPUEVOU1NMX21hbGxvYyhsZW4gKyA1KTsKKwllbHNlCisJCS8qIFdlIHdpbGwgc2ltcGx5IGR1cGxpY2F0ZSBmaWxlbmFtZSAqLworCQl0cmFuc2xhdGVkID0gT1BFTlNTTF9tYWxsb2MobGVuICsgMSk7CisJaWYodHJhbnNsYXRlZCA9PSBOVUxMKQorCQl7CisJCURTT2VycihEU09fRl9XSU4zMl9OQU1FX0NPTlZFUlRFUiwKKwkJCQlEU09fUl9OQU1FX1RSQU5TTEFUSU9OX0ZBSUxFRCk7IAorCQlyZXR1cm4oTlVMTCk7ICAgCisJCX0KKwlpZih0cmFuc2Zvcm0pCisJCXNwcmludGYodHJhbnNsYXRlZCwgIiVzLmRsbCIsIGZpbGVuYW1lKTsKKwllbHNlCisJCXNwcmludGYodHJhbnNsYXRlZCwgIiVzIiwgZmlsZW5hbWUpOworCXJldHVybih0cmFuc2xhdGVkKTsKKwl9CisKK3N0YXRpYyBjb25zdCBjaGFyICpvcGVuc3NsX3N0cm5jaHIoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgYywgc2l6ZV90IGxlbikKKwl7CisJc2l6ZV90IGk7CisJY29uc3QgY2hhciAqcDsKKwlmb3IgKGkgPSAwLCBwID0gc3RyaW5nOyBpIDwgbGVuICYmICpwOyBpKyssIHArKykKKwkJeworCQlpZiAoKnAgPT0gYykKKwkJCXJldHVybiBwOworCQl9CisJcmV0dXJuIE5VTEw7CisJfQorCisjaW5jbHVkZSA8dGxoZWxwMzIuaD4KKyNpZmRlZiBfV0lOMzJfV0NFCisjIGRlZmluZSBETExOQU1FICJUT09MSEVMUC5ETEwiCisjZWxzZQorIyBpZmRlZiBNT0RVTEVFTlRSWTMyCisjIHVuZGVmIE1PRFVMRUVOVFJZMzIJLyogdW5tYXNrIHRoZSBBU0NJSSB2ZXJzaW9uISAqLworIyBlbmRpZgorIyBkZWZpbmUgRExMTkFNRSAiS0VSTkVMMzIuRExMIgorI2VuZGlmCisKK3R5cGVkZWYgSEFORExFIChXSU5BUEkgKkNSRUFURVRPT0xIRUxQMzJTTkFQU0hPVCkoRFdPUkQsIERXT1JEKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpDTE9TRVRPT0xIRUxQMzJTTkFQU0hPVCkoSEFORExFKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpNT0RVTEUzMikoSEFORExFLCBNT0RVTEVFTlRSWTMyICopOworCitzdGF0aWMgaW50IHdpbjMyX3BhdGhieWFkZHIodm9pZCAqYWRkcixjaGFyICpwYXRoLGludCBzeikKKwl7CisJSE1PRFVMRSBkbGw7CisJSEFORExFIGhNb2R1bGVTbmFwID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7IAorCU1PRFVMRUVOVFJZMzIgbWUzMjsgCisJQ1JFQVRFVE9PTEhFTFAzMlNOQVBTSE9UIGNyZWF0ZV9zbmFwOworCUNMT1NFVE9PTEhFTFAzMlNOQVBTSE9UICBjbG9zZV9zbmFwOworCU1PRFVMRTMyIG1vZHVsZV9maXJzdCwgbW9kdWxlX25leHQ7CisJaW50IGxlbjsKKyAKKwlpZiAoYWRkciA9PSBOVUxMKQorCQl7CisJCXVuaW9uCXsgaW50KCpmKSh2b2lkKixjaGFyKixpbnQpOyB2b2lkICpwOyB9IHQgPQorCQkJeyB3aW4zMl9wYXRoYnlhZGRyIH07CisJCWFkZHIgPSB0LnA7CisJCX0KKworCWRsbCA9IExvYWRMaWJyYXJ5KFRFWFQoRExMTkFNRSkpOworCWlmIChkbGwgPT0gTlVMTCkKKwkJeworCQlEU09lcnIoRFNPX0ZfV0lOMzJfUEFUSEJZQUREUixEU09fUl9VTlNVUFBPUlRFRCk7CisJCXJldHVybiAtMTsKKwkJfQorCisJY3JlYXRlX3NuYXAgPSAoQ1JFQVRFVE9PTEhFTFAzMlNOQVBTSE9UKQorCQlHZXRQcm9jQWRkcmVzcyhkbGwsIkNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdCIpOworCWlmIChjcmVhdGVfc25hcCA9PSBOVUxMKQorCQl7CisJCUZyZWVMaWJyYXJ5KGRsbCk7CisJCURTT2VycihEU09fRl9XSU4zMl9QQVRIQllBRERSLERTT19SX1VOU1VQUE9SVEVEKTsKKwkJcmV0dXJuIC0xOworCQl9CisJLyogV2UgdGFrZSB0aGUgcmVzdCBmb3IgZ3JhbnRlZC4uLiAqLworI2lmZGVmIF9XSU4zMl9XQ0UKKwljbG9zZV9zbmFwID0gKENMT1NFVE9PTEhFTFAzMlNOQVBTSE9UKQorCQlHZXRQcm9jQWRkcmVzcyhkbGwsIkNsb3NlVG9vbGhlbHAzMlNuYXBzaG90Iik7CisjZWxzZQorCWNsb3NlX3NuYXAgPSAoQ0xPU0VUT09MSEVMUDMyU05BUFNIT1QpQ2xvc2VIYW5kbGU7CisjZW5kaWYKKwltb2R1bGVfZmlyc3QgPSAoTU9EVUxFMzIpR2V0UHJvY0FkZHJlc3MoZGxsLCJNb2R1bGUzMkZpcnN0Iik7CisJbW9kdWxlX25leHQgID0gKE1PRFVMRTMyKUdldFByb2NBZGRyZXNzKGRsbCwiTW9kdWxlMzJOZXh0Iik7CisKKwloTW9kdWxlU25hcCA9ICgqY3JlYXRlX3NuYXApKFRIMzJDU19TTkFQTU9EVUxFLDApOyAKKwlpZiggaE1vZHVsZVNuYXAgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgKSAKKwkJeyAKKwkJRnJlZUxpYnJhcnkoZGxsKTsKKwkJRFNPZXJyKERTT19GX1dJTjMyX1BBVEhCWUFERFIsRFNPX1JfVU5TVVBQT1JURUQpOworCQlyZXR1cm4gLTE7CisJCX0gCisgCisJbWUzMi5kd1NpemUgPSBzaXplb2YobWUzMik7IAorIAorCWlmKCEoKm1vZHVsZV9maXJzdCkoaE1vZHVsZVNuYXAsJm1lMzIpKSAKKwkJeyAKKwkJKCpjbG9zZV9zbmFwKShoTW9kdWxlU25hcCk7CisJCUZyZWVMaWJyYXJ5KGRsbCk7CisJCURTT2VycihEU09fRl9XSU4zMl9QQVRIQllBRERSLERTT19SX0ZBSUxVUkUpOworCQlyZXR1cm4gLTE7CisJCX0KKyAKKwlkbwl7IAorCQlpZiAoKEJZVEUgKilhZGRyID49IG1lMzIubW9kQmFzZUFkZHIgJiYKKwkJICAgIChCWVRFICopYWRkciA8ICBtZTMyLm1vZEJhc2VBZGRyK21lMzIubW9kQmFzZVNpemUpCisJCQl7CisJCQkoKmNsb3NlX3NuYXApKGhNb2R1bGVTbmFwKTsKKwkJCUZyZWVMaWJyYXJ5KGRsbCk7CisjaWZkZWYgX1dJTjMyX1dDRQorIyBpZiBfV0lOMzJfV0NFID49IDEwMQorCQkJcmV0dXJuIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLDAsbWUzMi5zekV4ZVBhdGgsLTEsCisJCQkJCQkJcGF0aCxzeixOVUxMLE5VTEwpOworIyBlbHNlCisJCQlsZW4gPSAoaW50KXdjc2xlbihtZTMyLnN6RXhlUGF0aCk7CisJCQlpZiAoc3ogPD0gMCkgcmV0dXJuIGxlbisxOworCQkJaWYgKGxlbiA+PSBzeikgbGVuPXN6LTE7CisJCQlmb3IoaT0wO2k8bGVuO2krKykKKwkJCQlwYXRoW2ldID0gKGNoYXIpbWUzMi5zekV4ZVBhdGhbaV07CisJCQlwYXRoW2xlbisrXSA9IDA7CisJCQlyZXR1cm4gbGVuOworIyBlbmRpZgorI2Vsc2UKKwkJCWxlbiA9IChpbnQpc3RybGVuKG1lMzIuc3pFeGVQYXRoKTsKKwkJCWlmIChzeiA8PSAwKSByZXR1cm4gbGVuKzE7CisJCQlpZiAobGVuID49IHN6KSBsZW49c3otMTsKKwkJCW1lbWNweShwYXRoLG1lMzIuc3pFeGVQYXRoLGxlbik7CisJCQlwYXRoW2xlbisrXSA9IDA7CisJCQlyZXR1cm4gbGVuOworI2VuZGlmCisJCQl9IAorCQl9IHdoaWxlKCgqbW9kdWxlX25leHQpKGhNb2R1bGVTbmFwLCAmbWUzMikpOyAKKyAKKwkoKmNsb3NlX3NuYXApKGhNb2R1bGVTbmFwKTsgCisJRnJlZUxpYnJhcnkoZGxsKTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyB2b2lkICp3aW4zMl9nbG9iYWxsb29rdXAoY29uc3QgY2hhciAqbmFtZSkKKwl7CisJSE1PRFVMRSBkbGw7CisJSEFORExFIGhNb2R1bGVTbmFwID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisJTU9EVUxFRU5UUlkzMiBtZTMyOworCUNSRUFURVRPT0xIRUxQMzJTTkFQU0hPVCBjcmVhdGVfc25hcDsKKwlDTE9TRVRPT0xIRUxQMzJTTkFQU0hPVCAgY2xvc2Vfc25hcDsKKwlNT0RVTEUzMiBtb2R1bGVfZmlyc3QsIG1vZHVsZV9uZXh0OworCUZBUlBST0MgcmV0PU5VTEw7CisKKwlkbGwgPSBMb2FkTGlicmFyeShURVhUKERMTE5BTUUpKTsKKwlpZiAoZGxsID09IE5VTEwpCisJCXsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0dMT0JBTExPT0tVUCxEU09fUl9VTlNVUFBPUlRFRCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwljcmVhdGVfc25hcCA9IChDUkVBVEVUT09MSEVMUDMyU05BUFNIT1QpCisJCUdldFByb2NBZGRyZXNzKGRsbCwiQ3JlYXRlVG9vbGhlbHAzMlNuYXBzaG90Iik7CisJaWYgKGNyZWF0ZV9zbmFwID09IE5VTEwpCisJCXsKKwkJRnJlZUxpYnJhcnkoZGxsKTsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0dMT0JBTExPT0tVUCxEU09fUl9VTlNVUFBPUlRFRCk7CisJCXJldHVybiBOVUxMOworCQl9CisJLyogV2UgdGFrZSB0aGUgcmVzdCBmb3IgZ3JhbnRlZC4uLiAqLworI2lmZGVmIF9XSU4zMl9XQ0UKKwljbG9zZV9zbmFwID0gKENMT1NFVE9PTEhFTFAzMlNOQVBTSE9UKQorCQlHZXRQcm9jQWRkcmVzcyhkbGwsIkNsb3NlVG9vbGhlbHAzMlNuYXBzaG90Iik7CisjZWxzZQorCWNsb3NlX3NuYXAgPSAoQ0xPU0VUT09MSEVMUDMyU05BUFNIT1QpQ2xvc2VIYW5kbGU7CisjZW5kaWYKKwltb2R1bGVfZmlyc3QgPSAoTU9EVUxFMzIpR2V0UHJvY0FkZHJlc3MoZGxsLCJNb2R1bGUzMkZpcnN0Iik7CisJbW9kdWxlX25leHQgID0gKE1PRFVMRTMyKUdldFByb2NBZGRyZXNzKGRsbCwiTW9kdWxlMzJOZXh0Iik7CisKKwloTW9kdWxlU25hcCA9ICgqY3JlYXRlX3NuYXApKFRIMzJDU19TTkFQTU9EVUxFLDApOworCWlmKCBoTW9kdWxlU25hcCA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSApCisJCXsKKwkJRnJlZUxpYnJhcnkoZGxsKTsKKwkJRFNPZXJyKERTT19GX1dJTjMyX0dMT0JBTExPT0tVUCxEU09fUl9VTlNVUFBPUlRFRCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwltZTMyLmR3U2l6ZSA9IHNpemVvZihtZTMyKTsKKworCWlmICghKCptb2R1bGVfZmlyc3QpKGhNb2R1bGVTbmFwLCZtZTMyKSkKKwkJeworCQkoKmNsb3NlX3NuYXApKGhNb2R1bGVTbmFwKTsKKwkJRnJlZUxpYnJhcnkoZGxsKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCWRvCXsKKwkJaWYgKChyZXQgPSBHZXRQcm9jQWRkcmVzcyhtZTMyLmhNb2R1bGUsbmFtZSkpKQorCQkJeworCQkJKCpjbG9zZV9zbmFwKShoTW9kdWxlU25hcCk7CisJCQlGcmVlTGlicmFyeShkbGwpOworCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfSB3aGlsZSgoKm1vZHVsZV9uZXh0KShoTW9kdWxlU25hcCwmbWUzMikpOworCisJKCpjbG9zZV9zbmFwKShoTW9kdWxlU25hcCk7IAorCUZyZWVMaWJyYXJ5KGRsbCk7CisJcmV0dXJuIE5VTEw7CisJfQorI2VuZGlmIC8qIERTT19XSU4zMiAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2ViY2RpYy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2ViY2RpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTUzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWJjZGljLmMKQEAgLTAsMCArMSwyMjEgQEAKKy8qIGNyeXB0by9lYmNkaWMuYyAqLworCisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaWYgZGVmaW5lZChQRURBTlRJQykgfHwgZGVmaW5lZChfX0RFQ0MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTUFDT1NYKQorc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyNlbmRpZgorCisjZWxzZSAvKkNIQVJTRVRfRUJDRElDKi8KKworI2luY2x1ZGUgImViY2RpYy5oIgorLyogICAgICBJbml0aWFsIFBvcnQgZm9yICBBcGFjaGUtMS4zICAgICBieSA8TWFydGluLktyYWVtZXJATWNoLlNOSS5EZT4KKyAqICAgICAgQWRhcHRlZCBmb3IgICAgICAgT3BlblNTTC0wLjkuNCAgYnkgPE1hcnRpbi5LcmFlbWVyQE1jaC5TTkkuRGU+CisgKi8KKworI2lmZGVmIF9PU0RfUE9TSVgKKy8qCisgICAgIkJTMjAwMCBPU0QiIGlzIGEgUE9TSVggc3Vic3lzdGVtIG9uIGEgbWFpbiBmcmFtZS4KKyAgICBJdCBpcyBtYWRlIGJ5IFNpZW1lbnMgQUcsIEdlcm1hbnksIGZvciB0aGVpciBCUzIwMDAgbWFpbmZyYW1lIG1hY2hpbmVzLgorICAgIFdpdGhpbiB0aGUgUE9TSVggc3Vic3lzdGVtLCB0aGUgc2FtZSBjaGFyYWN0ZXIgc2V0IHdhcyBjaG9zZW4gYXMgaW4KKyAgICAibmF0aXZlIEJTMjAwMCIsIG5hbWVseSBFQkNESUMuIChFREYwNCkKKworICAgIFRoZSBuYW1lICJBU0NJSSIgaW4gdGhlc2Ugcm91dGluZXMgaXMgbWlzbGVhZGluZzogYWN0dWFsbHksIGNvbnZlcnNpb24KKyAgICBpcyBub3QgYmV0d2VlbiBFQkNESUMgYW5kIEFTQ0lJLCBidXQgRUJDRElDKEVERjA0KSBhbmQgSVNPLTg4NTkuMTsKKyAgICB0aGF0IG1lYW5zIHRoYXQgKHdlc3Rlcm4gZXVyb3BlYW4pIG5hdGlvbmFsIGNoYXJhY3RlcnMgYXJlIHByZXNlcnZlZC4KKworICAgIFRoaXMgdGFibGUgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdXNlZCBieSByc2gvcmNwL2Z0cCBhbmQgb3RoZXIgUE9TSVggdG9vbHMuCisqLworCisvKiBIZXJlJ3MgdGhlIGJpamVjdGl2ZSBlYmNkaWMtdG8tYXNjaWkgdGFibGU6ICovCitjb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvYXNjaWlbMjU2XSA9IHsKKy8qMDAqLyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDg1LCAweDA5LCAweDg2LCAweDdmLAorICAgICAgIDB4ODcsIDB4OGQsIDB4OGUsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qLi4uLi4uLi4uLi4uLi4uLiovCisvKjEwKi8gMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHg4ZiwgMHgwYSwgMHgwOCwgMHg5NywKKyAgICAgICAweDE4LCAweDE5LCAweDljLCAweDlkLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKi4uLi4uLi4uLi4uLi4uLi4qLworLyoyMCovIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4OTIsIDB4MTcsIDB4MWIsCisgICAgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHgwNSwgMHgwNiwgMHgwNywgLyouLi4uLi4uLi4uLi4uLi4uKi8KKy8qMzAqLyAweDkwLCAweDkxLCAweDE2LCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDA0LAorICAgICAgIDB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4MTQsIDB4MTUsIDB4OWUsIDB4MWEsIC8qLi4uLi4uLi4uLi4uLi4uLiovCisvKjQwKi8gMHgyMCwgMHhhMCwgMHhlMiwgMHhlNCwgMHhlMCwgMHhlMSwgMHhlMywgMHhlNSwKKyAgICAgICAweGU3LCAweGYxLCAweDYwLCAweDJlLCAweDNjLCAweDI4LCAweDJiLCAweDdjLCAvKiAuLi4uLi4uLi5gLjwoK3wqLworLyo1MCovIDB4MjYsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZTgsIDB4ZWQsIDB4ZWUsIDB4ZWYsCisgICAgICAgMHhlYywgMHhkZiwgMHgyMSwgMHgyNCwgMHgyYSwgMHgyOSwgMHgzYiwgMHg5ZiwgLyomLi4uLi4uLi4uISQqKTsuKi8KKy8qNjAqLyAweDJkLCAweDJmLCAweGMyLCAweGM0LCAweGMwLCAweGMxLCAweGMzLCAweGM1LAorICAgICAgIDB4YzcsIDB4ZDEsIDB4NWUsIDB4MmMsIDB4MjUsIDB4NWYsIDB4M2UsIDB4M2YsIC8qLS8uLi4uLi4uLl4sJV8+PyovCisvKjcwKi8gMHhmOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjOCwgMHhjZCwgMHhjZSwgMHhjZiwKKyAgICAgICAweGNjLCAweGE4LCAweDNhLCAweDIzLCAweDQwLCAweDI3LCAweDNkLCAweDIyLCAvKi4uLi4uLi4uLi46I0AnPSIqLworLyo4MCovIDB4ZDgsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsCisgICAgICAgMHg2OCwgMHg2OSwgMHhhYiwgMHhiYiwgMHhmMCwgMHhmZCwgMHhmZSwgMHhiMSwgLyouYWJjZGVmZ2hpLi4uLi4uKi8KKy8qOTAqLyAweGIwLCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLAorICAgICAgIDB4NzEsIDB4NzIsIDB4YWEsIDB4YmEsIDB4ZTYsIDB4YjgsIDB4YzYsIDB4YTQsIC8qLmprbG1ub3Bxci4uLi4uLiovCisvKmEwKi8gMHhiNSwgMHhhZiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKKyAgICAgICAweDc5LCAweDdhLCAweGExLCAweGJmLCAweGQwLCAweGRkLCAweGRlLCAweGFlLCAvKi4uc3R1dnd4eXouLi4uLi4qLworLypiMCovIDB4YTIsIDB4YTMsIDB4YTUsIDB4YjcsIDB4YTksIDB4YTcsIDB4YjYsIDB4YmMsCisgICAgICAgMHhiZCwgMHhiZSwgMHhhYywgMHg1YiwgMHg1YywgMHg1ZCwgMHhiNCwgMHhkNywgLyouLi4uLi4uLi4uLltcXS4uKi8KKy8qYzAqLyAweGY5LCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LAorICAgICAgIDB4NDgsIDB4NDksIDB4YWQsIDB4ZjQsIDB4ZjYsIDB4ZjIsIDB4ZjMsIDB4ZjUsIC8qLkFCQ0RFRkdISS4uLi4uLiovCisvKmQwKi8gMHhhNiwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwKKyAgICAgICAweDUxLCAweDUyLCAweGI5LCAweGZiLCAweGZjLCAweGRiLCAweGZhLCAweGZmLCAvKi5KS0xNTk9QUVIuLi4uLi4qLworLyplMCovIDB4ZDksIDB4ZjcsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCisgICAgICAgMHg1OSwgMHg1YSwgMHhiMiwgMHhkNCwgMHhkNiwgMHhkMiwgMHhkMywgMHhkNSwgLyouLlNUVVZXWFlaLi4uLi4uKi8KKy8qZjAqLyAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LAorICAgICAgIDB4MzgsIDB4MzksIDB4YjMsIDB4N2IsIDB4ZGMsIDB4N2QsIDB4ZGEsIDB4N2UgIC8qMDEyMzQ1Njc4OS57Ln0ufiovCit9OworCisKKy8qIFRoZSBhc2NpaS10by1lYmNkaWMgdGFibGU6ICovCitjb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvZWJjZGljWzI1Nl0gPSB7CisvKjAwKi8gIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MzcsIDB4MmQsIDB4MmUsIDB4MmYsCisJMHgxNiwgMHgwNSwgMHgxNSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCisvKjEwKi8gIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4M2MsIDB4M2QsIDB4MzIsIDB4MjYsCisJMHgxOCwgMHgxOSwgMHgzZiwgMHgyNywgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgIC8qLi4uLi4uLi4uLi4uLi4uLiovCisvKjIwKi8gIDB4NDAsIDB4NWEsIDB4N2YsIDB4N2IsIDB4NWIsIDB4NmMsIDB4NTAsIDB4N2QsCisJMHg0ZCwgMHg1ZCwgMHg1YywgMHg0ZSwgMHg2YiwgMHg2MCwgMHg0YiwgMHg2MSwgIC8qICEiIyQlJicoKSorLC0uLyAqLworLyozMCovICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LAorCTB4ZjgsIDB4ZjksIDB4N2EsIDB4NWUsIDB4NGMsIDB4N2UsIDB4NmUsIDB4NmYsICAvKjAxMjM0NTY3ODk6Ozw9Pj8qLworLyo0MCovICAweDdjLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LAorCTB4YzgsIDB4YzksIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsICAvKkBBQkNERUZHSElKS0xNTk8qLworLyo1MCovICAweGQ3LCAweGQ4LCAweGQ5LCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LAorCTB4ZTcsIDB4ZTgsIDB4ZTksIDB4YmIsIDB4YmMsIDB4YmQsIDB4NmEsIDB4NmQsICAvKlBRUlNUVVZXWFlaW1xdXl8qLworLyo2MCovICAweDRhLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorCTB4ODgsIDB4ODksIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsICAvKmBhYmNkZWZnaGlqa2xtbm8qLworLyo3MCovICAweDk3LCAweDk4LCAweDk5LCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LAorCTB4YTcsIDB4YTgsIDB4YTksIDB4ZmIsIDB4NGYsIDB4ZmQsIDB4ZmYsIDB4MDcsICAvKnBxcnN0dXZ3eHl6e3x9fi4qLworLyo4MCovICAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDA0LCAweDA2LCAweDA4LAorCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MDksIDB4MGEsIDB4MTQsICAvKi4uLi4uLi4uLi4uLi4uLi4qLworLyo5MCovICAweDMwLCAweDMxLCAweDI1LCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDE3LAorCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4MWEsIDB4MWIsIDB4M2UsIDB4NWYsICAvKi4uLi4uLi4uLi4uLi4uLi4qLworLyphMCovICAweDQxLCAweGFhLCAweGIwLCAweGIxLCAweDlmLCAweGIyLCAweGQwLCAweGI1LAorCTB4NzksIDB4YjQsIDB4OWEsIDB4OGEsIDB4YmEsIDB4Y2EsIDB4YWYsIDB4YTEsICAvKi4uLi4uLi4uLi4uLi4uLi4qLworLypiMCovICAweDkwLCAweDhmLCAweGVhLCAweGZhLCAweGJlLCAweGEwLCAweGI2LCAweGIzLAorCTB4OWQsIDB4ZGEsIDB4OWIsIDB4OGIsIDB4YjcsIDB4YjgsIDB4YjksIDB4YWIsICAvKi4uLi4uLi4uLi4uLi4uLi4qLworLypjMCovICAweDY0LCAweDY1LCAweDYyLCAweDY2LCAweDYzLCAweDY3LCAweDllLCAweDY4LAorCTB4NzQsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzgsIDB4NzUsIDB4NzYsIDB4NzcsICAvKi4uLi4uLi4uLi4uLi4uLi4qLworLypkMCovICAweGFjLCAweDY5LCAweGVkLCAweGVlLCAweGViLCAweGVmLCAweGVjLCAweGJmLAorCTB4ODAsIDB4ZTAsIDB4ZmUsIDB4ZGQsIDB4ZmMsIDB4YWQsIDB4YWUsIDB4NTksICAvKi4uLi4uLi4uLi4uLi4uLi4qLworLyplMCovICAweDQ0LCAweDQ1LCAweDQyLCAweDQ2LCAweDQzLCAweDQ3LCAweDljLCAweDQ4LAorCTB4NTQsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTgsIDB4NTUsIDB4NTYsIDB4NTcsICAvKi4uLi4uLi4uLi4uLi4uLi4qLworLypmMCovICAweDhjLCAweDQ5LCAweGNkLCAweGNlLCAweGNiLCAweGNmLCAweGNjLCAweGUxLAorCTB4NzAsIDB4YzAsIDB4ZGUsIDB4ZGIsIDB4ZGMsIDB4OGQsIDB4OGUsIDB4ZGYgICAvKi4uLi4uLi4uLi4uLi4uLi4qLworfTsKKworI2Vsc2UgIC8qX09TRF9QT1NJWCovCisKKy8qCitUaGlzIGNvZGUgZG9lcyBiYXNpYyBjaGFyYWN0ZXIgbWFwcGluZyBmb3IgSUJNJ3MgVFBGIGFuZCBPUy8zOTAgb3BlcmF0aW5nIHN5c3RlbXMuCitJdCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEJTMjAwMCB0YWJsZS4KKworQmlqZWN0aXZlIEVCQ0RJQyAoY2hhcmFjdGVyIHNldCBJQk0tMTA0NykgdG8gVVMtQVNDSUkgdGFibGU6CitUaGlzIHRhYmxlIGlzIGJpamVjdGl2ZSAtIHRoZXJlIGFyZSBubyBhbWJpZ291cyBvciBkdXBsaWNhdGUgY2hhcmFjdGVycy4KKyovCitjb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvYXNjaWlbMjU2XSA9IHsKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDg1LCAweDA5LCAweDg2LCAweDdmLCAvKiAwMC0wZjogICAgICAgICAgICovCisgICAgMHg4NywgMHg4ZCwgMHg4ZSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLworICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4OGYsIDB4MGEsIDB4MDgsIDB4OTcsIC8qIDEwLTFmOiAgICAgICAgICAgKi8KKyAgICAweDE4LCAweDE5LCAweDljLCAweDlkLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCisgICAgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg5MiwgMHgxNywgMHgxYiwgLyogMjAtMmY6ICAgICAgICAgICAqLworICAgIDB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KKyAgICAweDkwLCAweDkxLCAweDE2LCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDA0LCAvKiAzMC0zZjogICAgICAgICAgICovCisgICAgMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHgxNCwgMHgxNSwgMHg5ZSwgMHgxYSwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLworICAgIDB4MjAsIDB4YTAsIDB4ZTIsIDB4ZTQsIDB4ZTAsIDB4ZTEsIDB4ZTMsIDB4ZTUsIC8qIDQwLTRmOiAgICAgICAgICAgKi8KKyAgICAweGU3LCAweGYxLCAweGEyLCAweDJlLCAweDNjLCAweDI4LCAweDJiLCAweDdjLCAvKiAgLi4uLi4uLi4uLi48KCt8ICovCisgICAgMHgyNiwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlOCwgMHhlZCwgMHhlZSwgMHhlZiwgLyogNTAtNWY6ICAgICAgICAgICAqLworICAgIDB4ZWMsIDB4ZGYsIDB4MjEsIDB4MjQsIDB4MmEsIDB4MjksIDB4M2IsIDB4NWUsIC8qICYuLi4uLi4uLi4hJCopO14gKi8KKyAgICAweDJkLCAweDJmLCAweGMyLCAweGM0LCAweGMwLCAweGMxLCAweGMzLCAweGM1LCAvKiA2MC02ZjogICAgICAgICAgICovCisgICAgMHhjNywgMHhkMSwgMHhhNiwgMHgyYywgMHgyNSwgMHg1ZiwgMHgzZSwgMHgzZiwgLyogLS8uLi4uLi4uLi4sJV8+PyAqLworICAgIDB4ZjgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4YzgsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDcwLTdmOiAgICAgICAgICAgKi8KKyAgICAweGNjLCAweDYwLCAweDNhLCAweDIzLCAweDQwLCAweDI3LCAweDNkLCAweDIyLCAvKiAuLi4uLi4uLi5gOiNAJz0iICovCisgICAgMHhkOCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogODAtOGY6ICAgICAgICAgICAqLworICAgIDB4NjgsIDB4NjksIDB4YWIsIDB4YmIsIDB4ZjAsIDB4ZmQsIDB4ZmUsIDB4YjEsIC8qIC5hYmNkZWZnaGkuLi4uLi4gKi8KKyAgICAweGIwLCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAvKiA5MC05ZjogICAgICAgICAgICovCisgICAgMHg3MSwgMHg3MiwgMHhhYSwgMHhiYSwgMHhlNiwgMHhiOCwgMHhjNiwgMHhhNCwgLyogLmprbG1ub3Bxci4uLi4uLiAqLworICAgIDB4YjUsIDB4N2UsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIC8qIGEwLWFmOiAgICAgICAgICAgKi8KKyAgICAweDc5LCAweDdhLCAweGExLCAweGJmLCAweGQwLCAweDViLCAweGRlLCAweGFlLCAvKiAufnN0dXZ3eHl6Li4uWy4uICovCisgICAgMHhhYywgMHhhMywgMHhhNSwgMHhiNywgMHhhOSwgMHhhNywgMHhiNiwgMHhiYywgLyogYjAtYmY6ICAgICAgICAgICAqLworICAgIDB4YmQsIDB4YmUsIDB4ZGQsIDB4YTgsIDB4YWYsIDB4NWQsIDB4YjQsIDB4ZDcsIC8qIC4uLi4uLi4uLi4uLi5dLi4gKi8KKyAgICAweDdiLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiBjMC1jZjogICAgICAgICAgICovCisgICAgMHg0OCwgMHg0OSwgMHhhZCwgMHhmNCwgMHhmNiwgMHhmMiwgMHhmMywgMHhmNSwgLyoge0FCQ0RFRkdISS4uLi4uLiAqLworICAgIDB4N2QsIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIDB4NTAsIC8qIGQwLWRmOiAgICAgICAgICAgKi8KKyAgICAweDUxLCAweDUyLCAweGI5LCAweGZiLCAweGZjLCAweGY5LCAweGZhLCAweGZmLCAvKiB9SktMTU5PUFFSLi4uLi4uICovCisgICAgMHg1YywgMHhmNywgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgLyogZTAtZWY6ICAgICAgICAgICAqLworICAgIDB4NTksIDB4NWEsIDB4YjIsIDB4ZDQsIDB4ZDYsIDB4ZDIsIDB4ZDMsIDB4ZDUsIC8qIFwuU1RVVldYWVouLi4uLi4gKi8KKyAgICAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiBmMC1mZjogICAgICAgICAgICovCisgICAgMHgzOCwgMHgzOSwgMHhiMywgMHhkYiwgMHhkYywgMHhkOSwgMHhkYSwgMHg5ZiAgLyogMDEyMzQ1Njc4OS4uLi4uLiAqLworfTsKKworCisvKgorVGhlIFVTLUFTQ0lJIHRvIEVCQ0RJQyAoY2hhcmFjdGVyIHNldCBJQk0tMTA0NykgdGFibGU6CitUaGlzIHRhYmxlIGlzIGJpamVjdGl2ZSAobm8gYW1iaWd1b3VzIG9yIGR1cGxpY2F0ZSBjaGFyYWN0ZXJzKQorKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgb3NfdG9lYmNkaWNbMjU2XSA9IHsKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDM3LCAweDJkLCAweDJlLCAweDJmLCAvKiAwMC0wZjogICAgICAgICAgICovCisgICAgMHgxNiwgMHgwNSwgMHgxNSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLworICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4M2MsIDB4M2QsIDB4MzIsIDB4MjYsIC8qIDEwLTFmOiAgICAgICAgICAgKi8KKyAgICAweDE4LCAweDE5LCAweDNmLCAweDI3LCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCisgICAgMHg0MCwgMHg1YSwgMHg3ZiwgMHg3YiwgMHg1YiwgMHg2YywgMHg1MCwgMHg3ZCwgLyogMjAtMmY6ICAgICAgICAgICAqLworICAgIDB4NGQsIDB4NWQsIDB4NWMsIDB4NGUsIDB4NmIsIDB4NjAsIDB4NGIsIDB4NjEsIC8qICAhIiMkJSYnKCkqKywtLi8gKi8KKyAgICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAzMC0zZjogICAgICAgICAgICovCisgICAgMHhmOCwgMHhmOSwgMHg3YSwgMHg1ZSwgMHg0YywgMHg3ZSwgMHg2ZSwgMHg2ZiwgLyogMDEyMzQ1Njc4OTo7PD0+PyAqLworICAgIDB4N2MsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDQwLTRmOiAgICAgICAgICAgKi8KKyAgICAweGM4LCAweGM5LCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAvKiBAQUJDREVGR0hJSktMTU5PICovCisgICAgMHhkNywgMHhkOCwgMHhkOSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgLyogNTAtNWY6ICAgICAgICAgICAqLworICAgIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4YWQsIDB4ZTAsIDB4YmQsIDB4NWYsIDB4NmQsIC8qIFBRUlNUVVZXWFlaW1xdXl8gKi8KKyAgICAweDc5LCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiA2MC02ZjogICAgICAgICAgICovCisgICAgMHg4OCwgMHg4OSwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgLyogYGFiY2RlZmdoaWprbG1ubyAqLworICAgIDB4OTcsIDB4OTgsIDB4OTksIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIC8qIDcwLTdmOiAgICAgICAgICAgKi8KKyAgICAweGE3LCAweGE4LCAweGE5LCAweGMwLCAweDRmLCAweGQwLCAweGExLCAweDA3LCAvKiBwcXJzdHV2d3h5ent8fX4uICovCisgICAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgwNCwgMHgwNiwgMHgwOCwgLyogODAtOGY6ICAgICAgICAgICAqLworICAgIDB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MDksIDB4MGEsIDB4MTQsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KKyAgICAweDMwLCAweDMxLCAweDI1LCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDE3LCAvKiA5MC05ZjogICAgICAgICAgICovCisgICAgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgxYSwgMHgxYiwgMHgzZSwgMHhmZiwgLyogLi4uLi4uLi4uLi4uLi4uLiAqLworICAgIDB4NDEsIDB4YWEsIDB4NGEsIDB4YjEsIDB4OWYsIDB4YjIsIDB4NmEsIDB4YjUsIC8qIGEwLWFmOiAgICAgICAgICAgKi8KKyAgICAweGJiLCAweGI0LCAweDlhLCAweDhhLCAweGIwLCAweGNhLCAweGFmLCAweGJjLCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCisgICAgMHg5MCwgMHg4ZiwgMHhlYSwgMHhmYSwgMHhiZSwgMHhhMCwgMHhiNiwgMHhiMywgLyogYjAtYmY6ICAgICAgICAgICAqLworICAgIDB4OWQsIDB4ZGEsIDB4OWIsIDB4OGIsIDB4YjcsIDB4YjgsIDB4YjksIDB4YWIsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KKyAgICAweDY0LCAweDY1LCAweDYyLCAweDY2LCAweDYzLCAweDY3LCAweDllLCAweDY4LCAvKiBjMC1jZjogICAgICAgICAgICovCisgICAgMHg3NCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3OCwgMHg3NSwgMHg3NiwgMHg3NywgLyogLi4uLi4uLi4uLi4uLi4uLiAqLworICAgIDB4YWMsIDB4NjksIDB4ZWQsIDB4ZWUsIDB4ZWIsIDB4ZWYsIDB4ZWMsIDB4YmYsIC8qIGQwLWRmOiAgICAgICAgICAgKi8KKyAgICAweDgwLCAweGZkLCAweGZlLCAweGZiLCAweGZjLCAweGJhLCAweGFlLCAweDU5LCAvKiAuLi4uLi4uLi4uLi4uLi4uICovCisgICAgMHg0NCwgMHg0NSwgMHg0MiwgMHg0NiwgMHg0MywgMHg0NywgMHg5YywgMHg0OCwgLyogZTAtZWY6ICAgICAgICAgICAqLworICAgIDB4NTQsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTgsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIC4uLi4uLi4uLi4uLi4uLi4gKi8KKyAgICAweDhjLCAweDQ5LCAweGNkLCAweGNlLCAweGNiLCAweGNmLCAweGNjLCAweGUxLCAvKiBmMC1mZjogICAgICAgICAgICovCisgICAgMHg3MCwgMHhkZCwgMHhkZSwgMHhkYiwgMHhkYywgMHg4ZCwgMHg4ZSwgMHhkZiAgLyogLi4uLi4uLi4uLi4uLi4uLiAqLworfTsKKyNlbmRpZiAvKl9PU0RfUE9TSVgqLworCisvKiBUcmFuc2xhdGUgYSBtZW1vcnkgYmxvY2sgZnJvbSBFQkNESUMgKGhvc3QgY2hhcnNldCkgdG8gQVNDSUkgKG5ldCBjaGFyc2V0KQorICogZGVzdCBhbmQgc3JjZSBtYXkgYmUgaWRlbnRpY2FsLCBvciBzZXBhcmF0ZSBtZW1vcnkgYmxvY2tzLCBidXQKKyAqIHNob3VsZCBub3Qgb3ZlcmxhcC4gVGhlc2UgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgaGF2ZSBhbiBpbnRlcmZhY2UKKyAqIGNvbXBhdGlibGUgdG8gbWVtY3B5KDMpLgorICovCisKK3ZvaWQgKgorZWJjZGljMmFzY2lpKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyY2UsIHNpemVfdCBjb3VudCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICp1ZGVzdCA9IGRlc3Q7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqdXNyY2UgPSBzcmNlOworCisgICAgd2hpbGUgKGNvdW50LS0gIT0gMCkgeworICAgICAgICAqdWRlc3QrKyA9IG9zX3RvYXNjaWlbKnVzcmNlKytdOworICAgIH0KKworICAgIHJldHVybiBkZXN0OworfQorCit2b2lkICoKK2FzY2lpMmViY2RpYyh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmNlLCBzaXplX3QgY291bnQpCit7CisgICAgdW5zaWduZWQgY2hhciAqdWRlc3QgPSBkZXN0OworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzcmNlID0gc3JjZTsKKworICAgIHdoaWxlIChjb3VudC0tICE9IDApIHsKKyAgICAgICAgKnVkZXN0KysgPSBvc190b2ViY2RpY1sqdXNyY2UrK107CisgICAgfQorCisgICAgcmV0dXJuIGRlc3Q7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2ViY2RpYy5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2ViY2RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjVhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWJjZGljLmgKQEAgLTAsMCArMSwxOSBAQAorLyogY3J5cHRvL2ViY2RpYy5oICovCisKKyNpZm5kZWYgSEVBREVSX0VCQ0RJQ19ICisjZGVmaW5lIEhFQURFUl9FQkNESUNfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIEF2b2lkIG5hbWUgY2xhc2hlcyB3aXRoIG90aGVyIGFwcGxpY2F0aW9ucyAqLworI2RlZmluZSBvc190b2FzY2lpICAgX29wZW5zc2xfb3NfdG9hc2NpaQorI2RlZmluZSBvc190b2ViY2RpYyAgX29wZW5zc2xfb3NfdG9lYmNkaWMKKyNkZWZpbmUgZWJjZGljMmFzY2lpIF9vcGVuc3NsX2ViY2RpYzJhc2NpaQorI2RlZmluZSBhc2NpaTJlYmNkaWMgX29wZW5zc2xfYXNjaWkyZWJjZGljCisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvYXNjaWlbMjU2XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIG9zX3RvZWJjZGljWzI1Nl07Cit2b2lkICplYmNkaWMyYXNjaWkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjZSwgc2l6ZV90IGNvdW50KTsKK3ZvaWQgKmFzY2lpMmViY2RpYyh2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzcmNlLCBzaXplX3QgY291bnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lYy5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3MDc4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lYy5oCkBAIC0wLDAgKzEsMTEwMCBAQAorLyogY3J5cHRvL2VjL2VjLmggKi8KKy8qCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQm9kbyBNb2VsbGVyIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisvKioKKyAqIFxmaWxlIGNyeXB0by9lYy9lYy5oIEluY2x1ZGUgZmlsZSBmb3IgdGhlIE9wZW5TU0wgRUMgZnVuY3Rpb25zCisgKiBcYXV0aG9yIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCb2RvIE1vZWxsZXIgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGFyZSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBUaGUgZWxsaXB0aWMgY3VydmUgYmluYXJ5IHBvbHlub21pYWwgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IAorICogU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9FQ19ICisjZGVmaW5lIEhFQURFUl9FQ19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX0VDCisjZXJyb3IgRUMgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3ltaGFja3MuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2VuZGlmCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VsaWYgZGVmaW5lZChfX1NVTlBST19DKQorIyBpZiBfX1NVTlBST19DID49IDB4NTIwCisjIHByYWdtYSBlcnJvcl9tZXNzYWdlcyAob2ZmLEVfQVJSQVlfT0ZfSU5DT01QTEVURV9OT05BTUUsRV9BUlJBWV9PRl9JTkNPTVBMRVRFKQorIyBlbmRpZgorI2VuZGlmCisKKyAgCisjaWZuZGVmIE9QRU5TU0xfRUNDX01BWF9GSUVMRF9CSVRTCisjIGRlZmluZSBPUEVOU1NMX0VDQ19NQVhfRklFTERfQklUUyA2NjEKKyNlbmRpZgorCisvKiogRW51bSBmb3IgdGhlIHBvaW50IGNvbnZlcnNpb24gZm9ybSBhcyBkZWZpbmVkIGluIFg5LjYyIChFQ0RTQSkKKyAqICBmb3IgdGhlIGVuY29kaW5nIG9mIGEgZWxsaXB0aWMgY3VydmUgcG9pbnQgKHgseSkgKi8KK3R5cGVkZWYgZW51bSB7CisJLyoqIHRoZSBwb2ludCBpcyBlbmNvZGVkIGFzIHp8fHgsIHdoZXJlIHRoZSBvY3RldCB6IHNwZWNpZmllcyAKKwkgKiAgd2hpY2ggc29sdXRpb24gb2YgdGhlIHF1YWRyYXRpYyBlcXVhdGlvbiB5IGlzICAqLworCVBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCA9IDIsCisJLyoqIHRoZSBwb2ludCBpcyBlbmNvZGVkIGFzIHp8fHh8fHksIHdoZXJlIHogaXMgdGhlIG9jdGV0IDB4MDIgICovCisJUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQgPSA0LAorCS8qKiB0aGUgcG9pbnQgaXMgZW5jb2RlZCBhcyB6fHx4fHx5LCB3aGVyZSB0aGUgb2N0ZXQgeiBzcGVjaWZpZXMKKyAgICAgICAgICogIHdoaWNoIHNvbHV0aW9uIG9mIHRoZSBxdWFkcmF0aWMgZXF1YXRpb24geSBpcyAgKi8KKwlQT0lOVF9DT05WRVJTSU9OX0hZQlJJRCA9IDYKK30gcG9pbnRfY29udmVyc2lvbl9mb3JtX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgZWNfbWV0aG9kX3N0IEVDX01FVEhPRDsKKwordHlwZWRlZiBzdHJ1Y3QgZWNfZ3JvdXBfc3QKKwkvKgorCSBFQ19NRVRIT0QgKm1ldGg7CisJIC0tIGZpZWxkIGRlZmluaXRpb24KKwkgLS0gY3VydmUgY29lZmZpY2llbnRzCisJIC0tIG9wdGlvbmFsIGdlbmVyYXRvciB3aXRoIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gKG9yZGVyLCBjb2ZhY3RvcikKKwkgLS0gb3B0aW9uYWwgZXh0cmEgZGF0YSAocHJlY29tcHV0ZWQgdGFibGUgZm9yIGZhc3QgY29tcHV0YXRpb24gb2YgbXVsdGlwbGVzIG9mIGdlbmVyYXRvcikKKwkgLS0gQVNOMSBzdHVmZgorCSovCisJRUNfR1JPVVA7CisKK3R5cGVkZWYgc3RydWN0IGVjX3BvaW50X3N0IEVDX1BPSU5UOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgRUNfTUVUSE9EcyBmb3IgY3VydmVzIG92ZXIgR0YocCkgICAgICAgICAgICAgICAgICAgKi8gICAgICAgCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBSZXR1cm5zIHRoZSBiYXNpYyBHRnAgZWMgbWV0aG9kcyB3aGljaCBwcm92aWRlcyB0aGUgYmFzaXMgZm9yIHRoZQorICogIG9wdGltaXplZCBtZXRob2RzLiAKKyAqICBccmV0dXJuICBFQ19NRVRIT0Qgb2JqZWN0CisgKi8KK2NvbnN0IEVDX01FVEhPRCAqRUNfR0ZwX3NpbXBsZV9tZXRob2Qodm9pZCk7CisKKy8qKiBSZXR1cm5zIEdGcCBtZXRob2RzIHVzaW5nIG1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24uCisgKiAgXHJldHVybiAgRUNfTUVUSE9EIG9iamVjdAorICovCitjb25zdCBFQ19NRVRIT0QgKkVDX0dGcF9tb250X21ldGhvZCh2b2lkKTsKKworLyoqIFJldHVybnMgR0ZwIG1ldGhvZHMgdXNpbmcgb3B0aW1pemVkIG1ldGhvZHMgZm9yIE5JU1QgcmVjb21tZW5kZWQgY3VydmVzCisgKiAgXHJldHVybiAgRUNfTUVUSE9EIG9iamVjdAorICovCitjb25zdCBFQ19NRVRIT0QgKkVDX0dGcF9uaXN0X21ldGhvZCh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIAorLyogICAgICAgICAgIEVDX01FVEhPRCBmb3IgY3VydmVzIG92ZXIgR0YoMl5tKSAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogUmV0dXJucyB0aGUgYmFzaWMgR0YybSBlYyBtZXRob2QgCisgKiAgXHJldHVybiAgRUNfTUVUSE9EIG9iamVjdAorICovCitjb25zdCBFQ19NRVRIT0QgKkVDX0dGMm1fc2ltcGxlX21ldGhvZCh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICBFQ19HUk9VUCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBDcmVhdGVzIGEgbmV3IEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgIG1ldGggIEVDX01FVEhPRCB0byB1c2UKKyAqICBccmV0dXJuICBuZXdseSBjcmVhdGVkIEVDX0dST1VQIG9iamVjdCBvciBOVUxMIGluIGNhc2Ugb2YgYW4gZXJyb3IuCisgKi8KK0VDX0dST1VQICpFQ19HUk9VUF9uZXcoY29uc3QgRUNfTUVUSE9EICptZXRoKTsKKworLyoqIEZyZWVzIGEgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0IHRvIGJlIGZyZWVkLgorICovCit2b2lkIEVDX0dST1VQX2ZyZWUoRUNfR1JPVVAgKmdyb3VwKTsKKworLyoqIENsZWFycyBhbmQgZnJlZXMgYSBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QgdG8gYmUgY2xlYXJlZCBhbmQgZnJlZWQuCisgKi8KK3ZvaWQgRUNfR1JPVVBfY2xlYXJfZnJlZShFQ19HUk9VUCAqZ3JvdXApOworCisvKiogQ29waWVzIEVDX0dST1VQIG9iamVjdHMuIE5vdGU6IGJvdGggRUNfR1JPVVBzIG11c3QgdXNlIHRoZSBzYW1lIEVDX01FVEhPRC4KKyAqICBccGFyYW0gIGRzdCAgZGVzdGluYXRpb24gRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBzcmMgIHNvdXJjZSBFQ19HUk9VUCBvYmplY3QKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IEVDX0dST1VQX2NvcHkoRUNfR1JPVVAgKmRzdCwgY29uc3QgRUNfR1JPVVAgKnNyYyk7CisKKy8qKiBDcmVhdGVzIGEgbmV3IEVDX0dST1VQIG9iamVjdCBhbmQgY29waWVzIHRoZSBjb3BpZXMgdGhlIGNvbnRlbnQKKyAqICBmb3JtIHNyYyB0byB0aGUgbmV3bHkgY3JlYXRlZCBFQ19LRVkgb2JqZWN0CisgKiAgXHBhcmFtICBzcmMgIHNvdXJjZSBFQ19HUk9VUCBvYmplY3QKKyAqICBccmV0dXJuIG5ld2x5IGNyZWF0ZWQgRUNfR1JPVVAgb2JqZWN0IG9yIE5VTEwgaW4gY2FzZSBvZiBhbiBlcnJvci4KKyAqLworRUNfR1JPVVAgKkVDX0dST1VQX2R1cChjb25zdCBFQ19HUk9VUCAqc3JjKTsKKworLyoqIFJldHVybnMgdGhlIEVDX01FVEhPRCBvZiB0aGUgRUNfR1JPVVAgb2JqZWN0LgorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIG9iamVjdCAKKyAqICBccmV0dXJuIEVDX01FVEhPRCB1c2VkIGluIHRoaXMgRUNfR1JPVVAgb2JqZWN0LgorICovCitjb25zdCBFQ19NRVRIT0QgKkVDX0dST1VQX21ldGhvZF9vZihjb25zdCBFQ19HUk9VUCAqZ3JvdXApOworCisvKiogUmV0dXJucyB0aGUgZmllbGQgdHlwZSBvZiB0aGUgRUNfTUVUSE9ELgorICogIFxwYXJhbSAgbWV0aCAgRUNfTUVUSE9EIG9iamVjdAorICogIFxyZXR1cm4gTklEIG9mIHRoZSB1bmRlcmx5aW5nIGZpZWxkIHR5cGUgT0lELgorICovCitpbnQgRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKGNvbnN0IEVDX01FVEhPRCAqbWV0aCk7CisKKy8qKiBTZXRzIHRoZSBnZW5lcmF0b3IgYW5kIGl0J3Mgb3JkZXIvY29mYWN0b3Igb2YgYSBFQ19HUk9VUCBvYmplY3QuCisgKiAgXHBhcmFtICBncm91cCAgICAgIEVDX0dST1VQIG9iamVjdCAKKyAqICBccGFyYW0gIGdlbmVyYXRvciAgRUNfUE9JTlQgb2JqZWN0IHdpdGggdGhlIGdlbmVyYXRvci4KKyAqICBccGFyYW0gIG9yZGVyICAgICAgdGhlIG9yZGVyIG9mIHRoZSBncm91cCBnZW5lcmF0ZWQgYnkgdGhlIGdlbmVyYXRvci4KKyAqICBccGFyYW0gIGNvZmFjdG9yICAgdGhlIGluZGV4IG9mIHRoZSBzdWItZ3JvdXAgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IKKyAqICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGdyb3VwIG9mIGFsbCBwb2ludHMgb24gdGhlIGVsbGlwdGljIGN1cnZlLgorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX0dST1VQX3NldF9nZW5lcmF0b3IoRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqZ2VuZXJhdG9yLCBjb25zdCBCSUdOVU0gKm9yZGVyLCBjb25zdCBCSUdOVU0gKmNvZmFjdG9yKTsKKworLyoqIFJldHVybnMgdGhlIGdlbmVyYXRvciBvZiBhIEVDX0dST1VQIG9iamVjdC4KKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccmV0dXJuIHRoZSBjdXJyZW50bHkgdXNlZCBnZW5lcmF0b3IgKHBvc3NpYmx5IE5VTEwpLgorICovCitjb25zdCBFQ19QT0lOVCAqRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKworLyoqIEdldHMgdGhlIG9yZGVyIG9mIGEgRUNfR1JPVVAKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIG9yZGVyICBCSUdOVU0gdG8gd2hpY2ggdGhlIG9yZGVyIGlzIGNvcGllZAorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX0dST1VQX2dldF9vcmRlcihjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqb3JkZXIsIEJOX0NUWCAqY3R4KTsKKworLyoqIEdldHMgdGhlIGNvZmFjdG9yIG9mIGEgRUNfR1JPVVAKKyAqICBccGFyYW0gIGdyb3VwICAgICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGNvZmFjdG9yICBCSUdOVU0gdG8gd2hpY2ggdGhlIGNvZmFjdG9yIGlzIGNvcGllZAorICogIFxwYXJhbSAgY3R4ICAgICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX0dST1VQX2dldF9jb2ZhY3Rvcihjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqY29mYWN0b3IsIEJOX0NUWCAqY3R4KTsKKworLyoqIFNldHMgdGhlIG5hbWUgb2YgYSBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIG5pZCAgICBOSUQgb2YgdGhlIGN1cnZlIG5hbWUgT0lECisgKi8KK3ZvaWQgRUNfR1JPVVBfc2V0X2N1cnZlX25hbWUoRUNfR1JPVVAgKmdyb3VwLCBpbnQgbmlkKTsKKworLyoqIFJldHVybnMgdGhlIGN1cnZlIG5hbWUgb2YgYSBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccmV0dXJuIE5JRCBvZiB0aGUgY3VydmUgbmFtZSBPSUQgb3IgMCBpZiBub3Qgc2V0LgorICovCitpbnQgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKwordm9pZCBFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKEVDX0dST1VQICpncm91cCwgaW50IGZsYWcpOworaW50IEVDX0dST1VQX2dldF9hc24xX2ZsYWcoY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKwordm9pZCBFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKEVDX0dST1VQICosIHBvaW50X2NvbnZlcnNpb25fZm9ybV90KTsKK3BvaW50X2NvbnZlcnNpb25fZm9ybV90IEVDX0dST1VQX2dldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oY29uc3QgRUNfR1JPVVAgKik7CisKK3Vuc2lnbmVkIGNoYXIgKkVDX0dST1VQX2dldDBfc2VlZChjb25zdCBFQ19HUk9VUCAqKTsKK3NpemVfdCBFQ19HUk9VUF9nZXRfc2VlZF9sZW4oY29uc3QgRUNfR1JPVVAgKik7CitzaXplX3QgRUNfR1JPVVBfc2V0X3NlZWQoRUNfR1JPVVAgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCBzaXplX3QgbGVuKTsKKworLyoqIFNldHMgdGhlIHBhcmFtZXRlciBvZiBhIGVjIG92ZXIgR0ZwIGRlZmluZWQgYnkgeV4yID0geF4zICsgYSp4ICsgYgorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEJJR05VTSB3aXRoIHRoZSBwcmltZSBudW1iZXIKKyAqICBccGFyYW0gIGEgICAgICBCSUdOVU0gd2l0aCBwYXJhbWV0ZXIgYSBvZiB0aGUgZXF1YXRpb24KKyAqICBccGFyYW0gIGIgICAgICBCSUdOVU0gd2l0aCBwYXJhbWV0ZXIgYiBvZiB0aGUgZXF1YXRpb24KKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19HUk9VUF9zZXRfY3VydmVfR0ZwKEVDX0dST1VQICpncm91cCwgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpOworCisvKiogR2V0cyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBlYyBvdmVyIEdGcCBkZWZpbmVkIGJ5IHleMiA9IHheMyArIGEqeCArIGIKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBCSUdOVU0gZm9yIHRoZSBwcmltZSBudW1iZXIKKyAqICBccGFyYW0gIGEgICAgICBCSUdOVU0gZm9yIHBhcmFtZXRlciBhIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgYiAgICAgIEJJR05VTSBmb3IgcGFyYW1ldGVyIGIgb2YgdGhlIGVxdWF0aW9uCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqcCwgQklHTlVNICphLCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KTsKKworLyoqIFNldHMgdGhlIHBhcmFtZXRlciBvZiBhIGVjIG92ZXIgR0YybSBkZWZpbmVkIGJ5IHleMiArIHgqeSA9IHheMyArIGEqeF4yICsgYgorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEJJR05VTSB3aXRoIHRoZSBwb2x5bm9taWFsIGRlZmluaW5nIHRoZSB1bmRlcmx5aW5nIGZpZWxkCisgKiAgXHBhcmFtICBhICAgICAgQklHTlVNIHdpdGggcGFyYW1ldGVyIGEgb2YgdGhlIGVxdWF0aW9uCisgKiAgXHBhcmFtICBiICAgICAgQklHTlVNIHdpdGggcGFyYW1ldGVyIGIgb2YgdGhlIGVxdWF0aW9uCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfR1JPVVBfc2V0X2N1cnZlX0dGMm0oRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCk7CisKKy8qKiBHZXRzIHRoZSBwYXJhbWV0ZXIgb2YgdGhlIGVjIG92ZXIgR0YybSBkZWZpbmVkIGJ5IHleMiArIHgqeSA9IHheMyArIGEqeF4yICsgYgorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEJJR05VTSBmb3IgdGhlIHBvbHlub21pYWwgZGVmaW5pbmcgdGhlIHVuZGVybHlpbmcgZmllbGQKKyAqICBccGFyYW0gIGEgICAgICBCSUdOVU0gZm9yIHBhcmFtZXRlciBhIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgYiAgICAgIEJJR05VTSBmb3IgcGFyYW1ldGVyIGIgb2YgdGhlIGVxdWF0aW9uCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0oY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnAsIEJJR05VTSAqYSwgQklHTlVNICpiLCBCTl9DVFggKmN0eCk7CisKKy8qKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IGEgZmllbGQgZWxlbWVudCAKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccmV0dXJuIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgYSBmaWVsZCBlbGVtZW50CisgKi8KK2ludCBFQ19HUk9VUF9nZXRfZGVncmVlKGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKy8qKiBDaGVja3Mgd2hldGhlciB0aGUgcGFyYW1ldGVyIGluIHRoZSBFQ19HUk9VUCBkZWZpbmUgYSB2YWxpZCBlYyBncm91cAorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBpZiBncm91cCBpcyBhIHZhbGlkIGVjIGdyb3VwIGFuZCAwIG90aGVyd2lzZQorICovCitpbnQgRUNfR1JPVVBfY2hlY2soY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKmN0eCk7CisKKy8qKiBDaGVja3Mgd2hldGhlciB0aGUgZGlzY3JpbWluYW50IG9mIHRoZSBlbGxpcHRpYyBjdXJ2ZSBpcyB6ZXJvIG9yIG5vdAorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBpZiB0aGUgZGlzY3JpbWluYW50IGlzIG5vdCB6ZXJvIGFuZCAwIG90aGVyd2lzZQorICovCitpbnQgRUNfR1JPVVBfY2hlY2tfZGlzY3JpbWluYW50KGNvbnN0IEVDX0dST1VQICpncm91cCwgQk5fQ1RYICpjdHgpOworCisvKiogQ29tcGFyZXMgdHdvIEVDX0dST1VQIG9iamVjdHMKKyAqICBccGFyYW0gIGEgICAgZmlyc3QgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBiICAgIHNlY29uZCBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGN0eCAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAwIGlmIGJvdGggZ3JvdXBzIGFyZSBlcXVhbCBhbmQgMSBvdGhlcndpc2UKKyAqLworaW50IEVDX0dST1VQX2NtcChjb25zdCBFQ19HUk9VUCAqYSwgY29uc3QgRUNfR1JPVVAgKmIsIEJOX0NUWCAqY3R4KTsKKworLyogRUNfR1JPVVBfbmV3X0dGKigpIGNhbGxzIEVDX0dST1VQX25ldygpIGFuZCBFQ19HUk9VUF9zZXRfR0YqKCkKKyAqIGFmdGVyIGNob29zaW5nIGFuIGFwcHJvcHJpYXRlIEVDX01FVEhPRCAqLworCisvKiogQ3JlYXRlcyBhIG5ldyBFQ19HUk9VUCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMgZGVmaW5lZAorICogIG92ZXIgR0ZwIChkZWZpbmVkIGJ5IHRoZSBlcXVhdGlvbiB5XjIgPSB4XjMgKyBhKnggKyBiKQorICogIFxwYXJhbSAgcCAgICBCSUdOVU0gd2l0aCB0aGUgcHJpbWUgbnVtYmVyCisgKiAgXHBhcmFtICBhICAgIEJJR05VTSB3aXRoIHRoZSBwYXJhbWV0ZXIgYSBvZiB0aGUgZXF1YXRpb24KKyAqICBccGFyYW0gIGIgICAgQklHTlVNIHdpdGggdGhlIHBhcmFtZXRlciBiIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgY3R4ICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIG5ld2x5IGNyZWF0ZWQgRUNfR1JPVVAgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgKi8KK0VDX0dST1VQICpFQ19HUk9VUF9uZXdfY3VydmVfR0ZwKGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KTsKKworLyoqIENyZWF0ZXMgYSBuZXcgRUNfR1JPVVAgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGRlZmluZWQKKyAqICBvdmVyIEdGMm0gKGRlZmluZWQgYnkgdGhlIGVxdWF0aW9uIHleMiArIHgqeSA9IHheMyArIGEqeF4yICsgYikKKyAqICBccGFyYW0gIHAgICAgQklHTlVNIHdpdGggdGhlIHBvbHlub21pYWwgZGVmaW5pbmcgdGhlIHVuZGVybHlpbmcgZmllbGQKKyAqICBccGFyYW0gIGEgICAgQklHTlVNIHdpdGggdGhlIHBhcmFtZXRlciBhIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgYiAgICBCSUdOVU0gd2l0aCB0aGUgcGFyYW1ldGVyIGIgb2YgdGhlIGVxdWF0aW9uCisgKiAgXHBhcmFtICBjdHggIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gbmV3bHkgY3JlYXRlZCBFQ19HUk9VUCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMKKyAqLworRUNfR1JPVVAgKkVDX0dST1VQX25ld19jdXJ2ZV9HRjJtKGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KTsKKworLyoqIENyZWF0ZXMgYSBFQ19HUk9VUCBvYmplY3Qgd2l0aCBhIGN1cnZlIHNwZWNpZmllZCBieSBhIE5JRAorICogIFxwYXJhbSAgbmlkICBOSUQgb2YgdGhlIE9JRCBvZiB0aGUgY3VydmUgbmFtZQorICogIFxyZXR1cm4gbmV3bHkgY3JlYXRlZCBFQ19HUk9VUCBvYmplY3Qgd2l0aCBzcGVjaWZpZWQgY3VydmUgb3IgTlVMTAorICogICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworRUNfR1JPVVAgKkVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKGludCBuaWQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgaGFuZGxpbmcgb2YgaW50ZXJuYWwgY3VydmVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeyAKKwlpbnQgbmlkOworCWNvbnN0IGNoYXIgKmNvbW1lbnQ7CisJfSBFQ19idWlsdGluX2N1cnZlOworCisvKiBFQ19idWlsdGluX2N1cnZlcyhFQ19idWlsdGluX2N1cnZlICpyLCBzaXplX3Qgc2l6ZSkgcmV0dXJucyBudW1iZXIgCisgKiBvZiBhbGwgYXZhaWxhYmxlIGN1cnZlcyBvciB6ZXJvIGlmIGEgZXJyb3Igb2NjdXJyZWQuIAorICogSW4gY2FzZSByIGlzdCBub3QgemVybyBuaXRlbXMgRUNfYnVpbHRpbl9jdXJ2ZSBzdHJ1Y3R1cmVzIAorICogYXJlIGZpbGxlZCB3aXRoIHRoZSBkYXRhIG9mIHRoZSBmaXJzdCBuaXRlbXMgaW50ZXJuYWwgZ3JvdXBzICovCitzaXplX3QgRUNfZ2V0X2J1aWx0aW5fY3VydmVzKEVDX2J1aWx0aW5fY3VydmUgKnIsIHNpemVfdCBuaXRlbXMpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICBFQ19QT0lOVCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIENyZWF0ZXMgYSBuZXcgRUNfUE9JTlQgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIEVDX0dST1VQCisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgdGhlIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHJldHVybiBuZXdseSBjcmVhdGVkIEVDX1BPSU5UIG9iamVjdCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK0VDX1BPSU5UICpFQ19QT0lOVF9uZXcoY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKworLyoqIEZyZWVzIGEgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICBwb2ludCAgRUNfUE9JTlQgb2JqZWN0IHRvIGJlIGZyZWVkCisgKi8KK3ZvaWQgRUNfUE9JTlRfZnJlZShFQ19QT0lOVCAqcG9pbnQpOworCisvKiogQ2xlYXJzIGFuZCBmcmVlcyBhIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgcG9pbnQgIEVDX1BPSU5UIG9iamVjdCB0byBiZSBjbGVhcmVkIGFuZCBmcmVlZAorICovCit2b2lkIEVDX1BPSU5UX2NsZWFyX2ZyZWUoRUNfUE9JTlQgKnBvaW50KTsKKworLyoqIENvcGllcyBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIGRzdCAgZGVzdGluYXRpb24gRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICBzcmMgIHNvdXJjZSBFQ19QT0lOVCBvYmplY3QKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9jb3B5KEVDX1BPSU5UICpkc3QsIGNvbnN0IEVDX1BPSU5UICpzcmMpOworCisvKiogQ3JlYXRlcyBhIG5ldyBFQ19QT0lOVCBvYmplY3QgYW5kIGNvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc3VwcGxpZWQKKyAqICBFQ19QT0lOVAorICogIFxwYXJhbSAgc3JjICAgIHNvdXJjZSBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIHRoZSBFQ19HUk9VUCBvYmplY3QKKyAqICBccmV0dXJuIG5ld2x5IGNyZWF0ZWQgRUNfUE9JTlQgb2JqZWN0IG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQgCisgKi8KK0VDX1BPSU5UICpFQ19QT0lOVF9kdXAoY29uc3QgRUNfUE9JTlQgKnNyYywgY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKyAKKy8qKiBSZXR1cm5zIHRoZSBFQ19NRVRIT0QgdXNlZCBpbiBFQ19QT0lOVCBvYmplY3QgCisgKiAgXHBhcmFtICBwb2ludCAgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHJldHVybiB0aGUgRUNfTUVUSE9EIHVzZWQKKyAqLworY29uc3QgRUNfTUVUSE9EICpFQ19QT0lOVF9tZXRob2Rfb2YoY29uc3QgRUNfUE9JTlQgKnBvaW50KTsKKworLyoqIFNldHMgYSBwb2ludCB0byBpbmZpbml0eSAobmV1dHJhbCBlbGVtZW50KQorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwb2ludCAgRUNfUE9JTlQgdG8gc2V0IHRvIGluZmluaXR5CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50KTsKKworLyoqIFNldHMgdGhlIGphY29iaWFuIHByb2plY3RpdmUgY29vcmRpbmF0ZXMgb2YgYSBFQ19QT0lOVCBvdmVyIEdGcAorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwICAgICAgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICB4ICAgICAgQklHTlVNIHdpdGggdGhlIHgtY29vcmRpbmF0ZQorICogIFxwYXJhbSAgeSAgICAgIEJJR05VTSB3aXRoIHRoZSB5LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIHogICAgICBCSUdOVU0gd2l0aCB0aGUgei1jb29yZGluYXRlCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwLAorCWNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LCBjb25zdCBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KTsKKworLyoqIEdldHMgdGhlIGphY29iaWFuIHByb2plY3RpdmUgY29vcmRpbmF0ZXMgb2YgYSBFQ19QT0lOVCBvdmVyIEdGcAorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwICAgICAgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICB4ICAgICAgQklHTlVNIGZvciB0aGUgeC1jb29yZGluYXRlCisgKiAgXHBhcmFtICB5ICAgICAgQklHTlVNIGZvciB0aGUgeS1jb29yZGluYXRlCisgKiAgXHBhcmFtICB6ICAgICAgQklHTlVNIGZvciB0aGUgei1jb29yZGluYXRlCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfZ2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsCisJY29uc3QgRUNfUE9JTlQgKnAsIEJJR05VTSAqeCwgQklHTlVNICp5LCBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KTsKKworLyoqIFNldHMgdGhlIGFmZmluZSBjb29yZGluYXRlcyBvZiBhIEVDX1BPSU5UIG92ZXIgR0ZwCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIHggICAgICBCSUdOVU0gd2l0aCB0aGUgeC1jb29yZGluYXRlCisgKiAgXHBhcmFtICB5ICAgICAgQklHTlVNIHdpdGggdGhlIHktY29vcmRpbmF0ZQorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnAsCisJY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksIEJOX0NUWCAqY3R4KTsKKworLyoqIEdldHMgdGhlIGFmZmluZSBjb29yZGluYXRlcyBvZiBhIEVDX1BPSU5UIG92ZXIgR0ZwCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIHggICAgICBCSUdOVU0gZm9yIHRoZSB4LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIHkgICAgICBCSUdOVU0gZm9yIHRoZSB5LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsCisJY29uc3QgRUNfUE9JTlQgKnAsIEJJR05VTSAqeCwgQklHTlVNICp5LCBCTl9DVFggKmN0eCk7CisKKy8qKiBTZXRzIHRoZSB4OS42MiBjb21wcmVzc2VkIGNvb3JkaW5hdGVzIG9mIGEgRUNfUE9JTlQgb3ZlciBHRnAKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgeCAgICAgIEJJR05VTSB3aXRoIHgtY29vcmRpbmF0ZQorICogIFxwYXJhbSAgeV9iaXQgIGludGVnZXIgd2l0aCB0aGUgeS1CaXQgKGVpdGhlciAwIG9yIDEpCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnAsCisJY29uc3QgQklHTlVNICp4LCBpbnQgeV9iaXQsIEJOX0NUWCAqY3R4KTsKKworLyoqIFNldHMgdGhlIGFmZmluZSBjb29yZGluYXRlcyBvZiBhIEVDX1BPSU5UIG92ZXIgR0YybQorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwICAgICAgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICB4ICAgICAgQklHTlVNIHdpdGggdGhlIHgtY29vcmRpbmF0ZQorICogIFxwYXJhbSAgeSAgICAgIEJJR05VTSB3aXRoIHRoZSB5LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0oY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcCwKKwljb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpOworCisvKiogR2V0cyB0aGUgYWZmaW5lIGNvb3JkaW5hdGVzIG9mIGEgRUNfUE9JTlQgb3ZlciBHRjJtCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIHggICAgICBCSUdOVU0gZm9yIHRoZSB4LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIHkgICAgICBCSUdOVU0gZm9yIHRoZSB5LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0oY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorCWNvbnN0IEVDX1BPSU5UICpwLCBCSUdOVU0gKngsIEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpOworCisvKiogU2V0cyB0aGUgeDkuNjIgY29tcHJlc3NlZCBjb29yZGluYXRlcyBvZiBhIEVDX1BPSU5UIG92ZXIgR0YybQorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwICAgICAgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICB4ICAgICAgQklHTlVNIHdpdGggeC1jb29yZGluYXRlCisgKiAgXHBhcmFtICB5X2JpdCAgaW50ZWdlciB3aXRoIHRoZSB5LUJpdCAoZWl0aGVyIDAgb3IgMSkKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRjJtKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnAsCisJY29uc3QgQklHTlVNICp4LCBpbnQgeV9iaXQsIEJOX0NUWCAqY3R4KTsKKworLyoqIEVuY29kZXMgYSBFQ19QT0lOVCBvYmplY3QgdG8gYSBvY3RldCBzdHJpbmcKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgZm9ybSAgIHBvaW50IGNvbnZlcnNpb24gZm9ybQorICogIFxwYXJhbSAgYnVmICAgIG1lbW9yeSBidWZmZXIgZm9yIHRoZSByZXN1bHQuIElmIE5VTEwgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAqICAgICAgICAgICAgICAgICByZXF1aXJlZCBidWZmZXIgc2l6ZS4KKyAqICBccGFyYW0gIGxlbiAgICBsZW5ndGggb2YgdGhlIG1lbW9yeSBidWZmZXIKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGVuY29kZWQgb2N0ZXQgc3RyaW5nIG9yIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworc2l6ZV90IEVDX1BPSU5UX3BvaW50Mm9jdChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwLAorCXBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm0sCisgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgQk5fQ1RYICpjdHgpOworCisvKiogRGVjb2RlcyBhIEVDX1BPSU5UIGZyb20gYSBvY3RldCBzdHJpbmcKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgYnVmICAgIG1lbW9yeSBidWZmZXIgd2l0aCB0aGUgZW5jb2RlZCBlYyBwb2ludAorICogIFxwYXJhbSAgbGVuICAgIGxlbmd0aCBvZiB0aGUgZW5jb2RlZCBlYyBwb2ludAorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5UX29jdDJwb2ludChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwLAorICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sIEJOX0NUWCAqY3R4KTsKKworLyogb3RoZXIgaW50ZXJmYWNlcyB0byBwb2ludDJvY3Qvb2N0MnBvaW50OiAqLworQklHTlVNICpFQ19QT0lOVF9wb2ludDJibihjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqLAorCXBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm0sIEJJR05VTSAqLCBCTl9DVFggKik7CitFQ19QT0lOVCAqRUNfUE9JTlRfYm4ycG9pbnQoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgQklHTlVNICosCisJRUNfUE9JTlQgKiwgQk5fQ1RYICopOworY2hhciAqRUNfUE9JTlRfcG9pbnQyaGV4KGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICosCisJcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgZm9ybSwgQk5fQ1RYICopOworRUNfUE9JTlQgKkVDX1BPSU5UX2hleDJwb2ludChjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBjaGFyICosCisJRUNfUE9JTlQgKiwgQk5fQ1RYICopOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgZnVuY3Rpb25zIGZvciBkb2luZyBFQ19QT0lOVCBhcml0aG1ldGljICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIENvbXB1dGVzIHRoZSBzdW0gb2YgdHdvIEVDX1BPSU5UIAorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICByICAgICAgRUNfUE9JTlQgb2JqZWN0IGZvciB0aGUgcmVzdWx0IChyID0gYSArIGIpCisgKiAgXHBhcmFtICBhICAgICAgRUNfUE9JTlQgb2JqZWN0IHdpdGggdGhlIGZpcnN0IHN1bW1hbmQKKyAqICBccGFyYW0gIGIgICAgICBFQ19QT0lOVCBvYmplY3Qgd2l0aCB0aGUgc2Vjb25kIHN1bW1hbmQKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9hZGQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgRUNfUE9JTlQgKmEsIGNvbnN0IEVDX1BPSU5UICpiLCBCTl9DVFggKmN0eCk7CisKKy8qKiBDb21wdXRlcyB0aGUgZG91YmxlIG9mIGEgRUNfUE9JTlQKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgciAgICAgIEVDX1BPSU5UIG9iamVjdCBmb3IgdGhlIHJlc3VsdCAociA9IDIgKiBhKQorICogIFxwYXJhbSAgYSAgICAgIEVDX1BPSU5UIG9iamVjdCAKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9kYmwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgRUNfUE9JTlQgKmEsIEJOX0NUWCAqY3R4KTsKKworLyoqIENvbXB1dGVzIHRoZSBpbnZlcnNlIG9mIGEgRUNfUE9JTlQKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgYSAgICAgIEVDX1BPSU5UIG9iamVjdCB0byBiZSBpbnZlcnRlZCAoaXQncyB1c2VkIGZvciB0aGUgcmVzdWx0IGFzIHdlbGwpCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfaW52ZXJ0KGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKmEsIEJOX0NUWCAqY3R4KTsKKworLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBwb2ludCBpcyB0aGUgbmV1dHJhbCBlbGVtZW50IG9mIHRoZSBncm91cAorICogIFxwYXJhbSAgZ3JvdXAgIHRoZSB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEVDX1BPSU5UIG9iamVjdAorICogIFxyZXR1cm4gMSBpZiB0aGUgcG9pbnQgaXMgdGhlIG5ldXRyYWwgZWxlbWVudCBhbmQgMCBvdGhlcndpc2UKKyAqLworaW50IEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnApOworCisvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIHBvaW50IGlzIG9uIHRoZSBjdXJ2ZSAKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcG9pbnQgIEVDX1BPSU5UIG9iamVjdCB0byBjaGVjaworICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBpZiBwb2ludCBpZiBvbiB0aGUgY3VydmUgYW5kIDAgb3RoZXJ3aXNlCisgKi8KK2ludCBFQ19QT0lOVF9pc19vbl9jdXJ2ZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwgQk5fQ1RYICpjdHgpOworCisvKiogQ29tcGFyZXMgdHdvIEVDX1BPSU5UcyAKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgYSAgICAgIGZpcnN0IEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgYiAgICAgIHNlY29uZCBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDAgaWYgYm90aCBwb2ludHMgYXJlIGVxdWFsIGFuZCBhIHZhbHVlICE9IDAgb3RoZXJ3aXNlCisgKi8KK2ludCBFQ19QT0lOVF9jbXAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfUE9JTlQgKmIsIEJOX0NUWCAqY3R4KTsKKworaW50IEVDX1BPSU5UX21ha2VfYWZmaW5lKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosIEJOX0NUWCAqKTsKK2ludCBFQ19QT0lOVHNfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKiwgc2l6ZV90IG51bSwgRUNfUE9JTlQgKltdLCBCTl9DVFggKik7CisKKy8qKiBDb21wdXRlcyByID0gZ2VuZXJhdG9yICogbiBzdW1fe2k9MH1ebnVtIHBbaV0gKiBtW2ldCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHIgICAgICBFQ19QT0lOVCBvYmplY3QgZm9yIHRoZSByZXN1bHQKKyAqICBccGFyYW0gIG4gICAgICBCSUdOVU0gd2l0aCB0aGUgbXVsdGlwbGllciBmb3IgdGhlIGdyb3VwIGdlbmVyYXRvciAob3B0aW9uYWwpCisgKiAgXHBhcmFtICBudW0gICAgbnVtYmVyIGZ1dGhlciBzdW1tYW5kcworICogIFxwYXJhbSAgcCAgICAgIGFycmF5IG9mIHNpemUgbnVtIG9mIEVDX1BPSU5UIG9iamVjdHMKKyAqICBccGFyYW0gIG0gICAgICBhcnJheSBvZiBzaXplIG51bSBvZiBCSUdOVU0gb2JqZWN0cworICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5Uc19tdWwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgQklHTlVNICpuLCBzaXplX3QgbnVtLCBjb25zdCBFQ19QT0lOVCAqcFtdLCBjb25zdCBCSUdOVU0gKm1bXSwgQk5fQ1RYICpjdHgpOworCisvKiogQ29tcHV0ZXMgciA9IGdlbmVyYXRvciAqIG4gKyBxICogbQorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICByICAgICAgRUNfUE9JTlQgb2JqZWN0IGZvciB0aGUgcmVzdWx0CisgKiAgXHBhcmFtICBuICAgICAgQklHTlVNIHdpdGggdGhlIG11bHRpcGxpZXIgZm9yIHRoZSBncm91cCBnZW5lcmF0b3IgKG9wdGlvbmFsKQorICogIFxwYXJhbSAgcSAgICAgIEVDX1BPSU5UIG9iamVjdCB3aXRoIHRoZSBmaXJzdCBmYWN0b3Igb2YgdGhlIHNlY29uZCBzdW1tYW5kCisgKiAgXHBhcmFtICBtICAgICAgQklHTlVNIHdpdGggdGhlIHNlY29uZCBmYWN0b3Igb2YgdGhlIHNlY29uZCBzdW1tYW5kCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfbXVsKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEJJR05VTSAqbiwgY29uc3QgRUNfUE9JTlQgKnEsIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpOworCisvKiogU3RvcmVzIG11bHRpcGxlcyBvZiBnZW5lcmF0b3IgZm9yIGZhc3RlciBwb2ludCBtdWx0aXBsaWNhdGlvbgorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX0dST1VQX3ByZWNvbXB1dGVfbXVsdChFQ19HUk9VUCAqZ3JvdXAsIEJOX0NUWCAqY3R4KTsKKworLyoqIFJlcG9ydHMgd2hldGhlciBhIHByZWNvbXB1dGF0aW9uIGhhcyBiZWVuIGRvbmUKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccmV0dXJuIDEgaWYgYSBwcmUtY29tcHV0YXRpb24gaGFzIGJlZW4gZG9uZSBhbmQgMCBvdGhlcndpc2UKKyAqLworaW50IEVDX0dST1VQX2hhdmVfcHJlY29tcHV0ZV9tdWx0KGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgIEFTTjEgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBFQ19HUk9VUF9nZXRfYmFzaXNfdHlwZSgpIHJldHVybnMgdGhlIE5JRCBvZiB0aGUgYmFzaXMgdHlwZQorICogdXNlZCB0byByZXByZXNlbnQgdGhlIGZpZWxkIGVsZW1lbnRzICovCitpbnQgRUNfR1JPVVBfZ2V0X2Jhc2lzX3R5cGUoY29uc3QgRUNfR1JPVVAgKik7CitpbnQgRUNfR1JPVVBfZ2V0X3RyaW5vbWlhbF9iYXNpcyhjb25zdCBFQ19HUk9VUCAqLCB1bnNpZ25lZCBpbnQgKmspOworaW50IEVDX0dST1VQX2dldF9wZW50YW5vbWlhbF9iYXNpcyhjb25zdCBFQ19HUk9VUCAqLCB1bnNpZ25lZCBpbnQgKmsxLCAKKwl1bnNpZ25lZCBpbnQgKmsyLCB1bnNpZ25lZCBpbnQgKmszKTsKKworI2RlZmluZSBPUEVOU1NMX0VDX05BTUVEX0NVUlZFCTB4MDAxCisKK3R5cGVkZWYgc3RydWN0IGVjcGtfcGFyYW1ldGVyc19zdCBFQ1BLUEFSQU1FVEVSUzsKKworRUNfR1JPVVAgKmQyaV9FQ1BLUGFyYW1ldGVycyhFQ19HUk9VUCAqKiwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7CitpbnQgaTJkX0VDUEtQYXJhbWV0ZXJzKGNvbnN0IEVDX0dST1VQICosIHVuc2lnbmVkIGNoYXIgKipvdXQpOworCisjZGVmaW5lIGQyaV9FQ1BLUGFyYW1ldGVyc19iaW8oYnAseCkgQVNOMV9kMmlfYmlvX29mKEVDX0dST1VQLE5VTEwsZDJpX0VDUEtQYXJhbWV0ZXJzLGJwLHgpCisjZGVmaW5lIGkyZF9FQ1BLUGFyYW1ldGVyc19iaW8oYnAseCkgQVNOMV9pMmRfYmlvX29mX2NvbnN0KEVDX0dST1VQLGkyZF9FQ1BLUGFyYW1ldGVycyxicCx4KQorI2RlZmluZSBkMmlfRUNQS1BhcmFtZXRlcnNfZnAoZnAseCkgKEVDX0dST1VQICopQVNOMV9kMmlfZnAoTlVMTCwgXAorICAgICAgICAgICAgICAgIChjaGFyICooKikoKSlkMmlfRUNQS1BhcmFtZXRlcnMsKGZwKSwodW5zaWduZWQgY2hhciAqKikoeCkpCisjZGVmaW5lIGkyZF9FQ1BLUGFyYW1ldGVyc19mcChmcCx4KSBBU04xX2kyZF9mcChpMmRfRUNQS1BhcmFtZXRlcnMsKGZwKSwgXAorCQkodW5zaWduZWQgY2hhciAqKSh4KSkKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworaW50ICAgICBFQ1BLUGFyYW1ldGVyc19wcmludChCSU8gKmJwLCBjb25zdCBFQ19HUk9VUCAqeCwgaW50IG9mZik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCAgICAgRUNQS1BhcmFtZXRlcnNfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IEVDX0dST1VQICp4LCBpbnQgb2ZmKTsKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgIEVDX0tFWSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgZWNfa2V5X3N0IEVDX0tFWTsKKworLyogc29tZSB2YWx1ZXMgZm9yIHRoZSBlbmNvZGluZ19mbGFnICovCisjZGVmaW5lIEVDX1BLRVlfTk9fUEFSQU1FVEVSUwkweDAwMQorI2RlZmluZSBFQ19QS0VZX05PX1BVQktFWQkweDAwMgorCisvKiogQ3JlYXRlcyBhIG5ldyBFQ19LRVkgb2JqZWN0LgorICogIFxyZXR1cm4gRUNfS0VZIG9iamVjdCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitFQ19LRVkgKkVDX0tFWV9uZXcodm9pZCk7CisKKy8qKiBDcmVhdGVzIGEgbmV3IEVDX0tFWSBvYmplY3QgdXNpbmcgYSBuYW1lZCBjdXJ2ZSBhcyB1bmRlcmx5aW5nCisgKiAgRUNfR1JPVVAgb2JqZWN0LgorICogIFxwYXJhbSAgbmlkICBOSUQgb2YgdGhlIG5hbWVkIGN1cnZlLgorICogIFxyZXR1cm4gRUNfS0VZIG9iamVjdCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLiAKKyAqLworRUNfS0VZICpFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoaW50IG5pZCk7CisKKy8qKiBGcmVlcyBhIEVDX0tFWSBvYmplY3QuCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QgdG8gYmUgZnJlZWQuCisgKi8KK3ZvaWQgRUNfS0VZX2ZyZWUoRUNfS0VZICprZXkpOworCisvKiogQ29waWVzIGEgRUNfS0VZIG9iamVjdC4KKyAqICBccGFyYW0gIGRzdCAgZGVzdGluYXRpb24gRUNfS0VZIG9iamVjdAorICogIFxwYXJhbSAgc3JjICBzcmMgRUNfS0VZIG9iamVjdAorICogIFxyZXR1cm4gZHN0IG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK0VDX0tFWSAqRUNfS0VZX2NvcHkoRUNfS0VZICpkc3QsIGNvbnN0IEVDX0tFWSAqc3JjKTsKKworLyoqIENyZWF0ZXMgYSBuZXcgRUNfS0VZIG9iamVjdCBhbmQgY29waWVzIHRoZSBjb250ZW50IGZyb20gc3JjIHRvIGl0LgorICogIFxwYXJhbSAgc3JjICB0aGUgc291cmNlIEVDX0tFWSBvYmplY3QKKyAqICBccmV0dXJuIG5ld2x5IGNyZWF0ZWQgRUNfS0VZIG9iamVjdCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitFQ19LRVkgKkVDX0tFWV9kdXAoY29uc3QgRUNfS0VZICpzcmMpOworCisvKiogSW5jcmVhc2VzIHRoZSBpbnRlcm5hbCByZWZlcmVuY2UgY291bnQgb2YgYSBFQ19LRVkgb2JqZWN0LgorICogIFxwYXJhbSAga2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK2ludCBFQ19LRVlfdXBfcmVmKEVDX0tFWSAqa2V5KTsKKworLyoqIFJldHVybnMgdGhlIEVDX0dST1VQIG9iamVjdCBvZiBhIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIGtleSAgRUNfS0VZIG9iamVjdAorICogIFxyZXR1cm4gdGhlIEVDX0dST1VQIG9iamVjdCAocG9zc2libHkgTlVMTCkuCisgKi8KK2NvbnN0IEVDX0dST1VQICpFQ19LRVlfZ2V0MF9ncm91cChjb25zdCBFQ19LRVkgKmtleSk7CisKKy8qKiBTZXRzIHRoZSBFQ19HUk9VUCBvZiBhIEVDX0tFWSBvYmplY3QuCisgKiAgXHBhcmFtICBrZXkgICAgRUNfS0VZIG9iamVjdAorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIHRvIHVzZSBpbiB0aGUgRUNfS0VZIG9iamVjdCAobm90ZTogdGhlIEVDX0tFWQorICogICAgICAgICAgICAgICAgIG9iamVjdCB3aWxsIHVzZSBhbiBvd24gY29weSBvZiB0aGUgRUNfR1JPVVApLgorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgRUNfS0VZX3NldF9ncm91cChFQ19LRVkgKmtleSwgY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKworLyoqIFJldHVybnMgdGhlIHByaXZhdGUga2V5IG9mIGEgRUNfS0VZIG9iamVjdC4KKyAqICBccGFyYW0gIGtleSAgRUNfS0VZIG9iamVjdAorICogIFxyZXR1cm4gYSBCSUdOVU0gd2l0aCB0aGUgcHJpdmF0ZSBrZXkgKHBvc3NpYmx5IE5VTEwpLgorICovCitjb25zdCBCSUdOVU0gKkVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGNvbnN0IEVDX0tFWSAqa2V5KTsKKworLyoqIFNldHMgdGhlIHByaXZhdGUga2V5IG9mIGEgRUNfS0VZIG9iamVjdC4KKyAqICBccGFyYW0gIGtleSAgRUNfS0VZIG9iamVjdAorICogIFxwYXJhbSAgcHJ2ICBCSUdOVU0gd2l0aCB0aGUgcHJpdmF0ZSBrZXkgKG5vdGU6IHRoZSBFQ19LRVkgb2JqZWN0CisgKiAgICAgICAgICAgICAgIHdpbGwgdXNlIGFuIG93biBjb3B5IG9mIHRoZSBCSUdOVU0pLgorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgRUNfS0VZX3NldF9wcml2YXRlX2tleShFQ19LRVkgKmtleSwgY29uc3QgQklHTlVNICpwcnYpOworCisvKiogUmV0dXJucyB0aGUgcHVibGljIGtleSBvZiBhIEVDX0tFWSBvYmplY3QuCisgKiAgXHBhcmFtICBrZXkgIHRoZSBFQ19LRVkgb2JqZWN0CisgKiAgXHJldHVybiBhIEVDX1BPSU5UIG9iamVjdCB3aXRoIHRoZSBwdWJsaWMga2V5IChwb3NzaWJseSBOVUxMKQorICovCitjb25zdCBFQ19QT0lOVCAqRUNfS0VZX2dldDBfcHVibGljX2tleShjb25zdCBFQ19LRVkgKmtleSk7CisKKy8qKiBTZXRzIHRoZSBwdWJsaWMga2V5IG9mIGEgRUNfS0VZIG9iamVjdC4KKyAqICBccGFyYW0gIGtleSAgRUNfS0VZIG9iamVjdAorICogIFxwYXJhbSAgcHViICBFQ19QT0lOVCBvYmplY3Qgd2l0aCB0aGUgcHVibGljIGtleSAobm90ZTogdGhlIEVDX0tFWSBvYmplY3QKKyAqICAgICAgICAgICAgICAgd2lsbCB1c2UgYW4gb3duIGNvcHkgb2YgdGhlIEVDX1BPSU5UIG9iamVjdCkuCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK2ludCBFQ19LRVlfc2V0X3B1YmxpY19rZXkoRUNfS0VZICprZXksIGNvbnN0IEVDX1BPSU5UICpwdWIpOworCit1bnNpZ25lZCBFQ19LRVlfZ2V0X2VuY19mbGFncyhjb25zdCBFQ19LRVkgKmtleSk7Cit2b2lkIEVDX0tFWV9zZXRfZW5jX2ZsYWdzKEVDX0tFWSAqLCB1bnNpZ25lZCBpbnQpOworcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgRUNfS0VZX2dldF9jb252X2Zvcm0oY29uc3QgRUNfS0VZICopOwordm9pZCBFQ19LRVlfc2V0X2NvbnZfZm9ybShFQ19LRVkgKiwgcG9pbnRfY29udmVyc2lvbl9mb3JtX3QpOworLyogZnVuY3Rpb25zIHRvIHNldC9nZXQgbWV0aG9kIHNwZWNpZmljIGRhdGEgICovCit2b2lkICpFQ19LRVlfZ2V0X2tleV9tZXRob2RfZGF0YShFQ19LRVkgKiwgCisJdm9pZCAqKCpkdXBfZnVuYykodm9pZCAqKSwgdm9pZCAoKmZyZWVfZnVuYykodm9pZCAqKSwgdm9pZCAoKmNsZWFyX2ZyZWVfZnVuYykodm9pZCAqKSk7Cit2b2lkIEVDX0tFWV9pbnNlcnRfa2V5X21ldGhvZF9kYXRhKEVDX0tFWSAqLCB2b2lkICpkYXRhLAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpOworLyogd3JhcHBlciBmdW5jdGlvbnMgZm9yIHRoZSB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdCAqLwordm9pZCBFQ19LRVlfc2V0X2FzbjFfZmxhZyhFQ19LRVkgKiwgaW50KTsKKworLyoqIENyZWF0ZXMgYSB0YWJsZSBvZiBwcmUtY29tcHV0ZWQgbXVsdGlwbGVzIG9mIHRoZSBnZW5lcmF0b3IgdG8gCisgKiAgYWNjZWxlcmF0ZSBmdXJ0aGVyIEVDX0tFWSBvcGVyYXRpb25zLgorICogIFxwYXJhbSAga2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHBhcmFtICBjdHggIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgRUNfS0VZX3ByZWNvbXB1dGVfbXVsdChFQ19LRVkgKmtleSwgQk5fQ1RYICpjdHgpOworCisvKiogQ3JlYXRlcyBhIG5ldyBlYyBwcml2YXRlIChhbmQgb3B0aW9uYWwgYSBuZXcgcHVibGljKSBrZXkuCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IEVDX0tFWV9nZW5lcmF0ZV9rZXkoRUNfS0VZICprZXkpOworCisvKiogVmVyaWZpZXMgdGhhdCBhIHByaXZhdGUgYW5kL29yIHB1YmxpYyBrZXkgaXMgdmFsaWQuCisgKiAgXHBhcmFtICBrZXkgIHRoZSBFQ19LRVkgb2JqZWN0CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgb3RoZXJ3aXNlLgorICovCitpbnQgRUNfS0VZX2NoZWNrX2tleShjb25zdCBFQ19LRVkgKmtleSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgIGRlLSBhbmQgZW5jb2RpbmcgZnVuY3Rpb25zIGZvciBTRUMxIEVDUHJpdmF0ZUtleSAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogRGVjb2RlcyBhIHByaXZhdGUga2V5IGZyb20gYSBtZW1vcnkgYnVmZmVyLgorICogIFxwYXJhbSAga2V5ICBhIHBvaW50ZXIgdG8gYSBFQ19LRVkgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSB1c2VkIChvciBOVUxMKQorICogIFxwYXJhbSAgaW4gICBwb2ludGVyIHRvIG1lbW9yeSB3aXRoIHRoZSBERVIgZW5jb2RlZCBwcml2YXRlIGtleQorICogIFxwYXJhbSAgbGVuICBsZW5ndGggb2YgdGhlIERFUiBlbmNvZGVkIHByaXZhdGUga2V5CisgKiAgXHJldHVybiB0aGUgZGVjb2RlZCBwcml2YXRlIGtleSBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitFQ19LRVkgKmQyaV9FQ1ByaXZhdGVLZXkoRUNfS0VZICoqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKTsKKworLyoqIEVuY29kZXMgYSBwcml2YXRlIGtleSBvYmplY3QgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGEgYnVmZmVyLgorICogIFxwYXJhbSAga2V5ICB0aGUgRUNfS0VZIG9iamVjdCB0byBlbmNvZGUKKyAqICBccGFyYW0gIG91dCAgdGhlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCAoaWYgTlVMTCB0aGUgZnVuY3Rpb24gcmV0dXJucyBudW1iZXIKKyAqICAgICAgICAgICAgICAgb2YgYnl0ZXMgbmVlZGVkKS4KKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IGkyZF9FQ1ByaXZhdGVLZXkoRUNfS0VZICprZXksIHVuc2lnbmVkIGNoYXIgKipvdXQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICBkZS0gYW5kIGVuY29kaW5nIGZ1bmN0aW9ucyBmb3IgRUMgcGFyYW1ldGVycyAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIERlY29kZXMgZWMgcGFyYW1ldGVyIGZyb20gYSBtZW1vcnkgYnVmZmVyLgorICogIFxwYXJhbSAga2V5ICBhIHBvaW50ZXIgdG8gYSBFQ19LRVkgb2JqZWN0IHdoaWNoIHNob3VsZCBiZSB1c2VkIChvciBOVUxMKQorICogIFxwYXJhbSAgaW4gICBwb2ludGVyIHRvIG1lbW9yeSB3aXRoIHRoZSBERVIgZW5jb2RlZCBlYyBwYXJhbWV0ZXJzCisgKiAgXHBhcmFtICBsZW4gIGxlbmd0aCBvZiB0aGUgREVSIGVuY29kZWQgZWMgcGFyYW1ldGVycworICogIFxyZXR1cm4gYSBFQ19LRVkgb2JqZWN0IHdpdGggdGhlIGRlY29kZWQgcGFyYW1ldGVycyBvciBOVUxMIGlmIGFuIGVycm9yCisgKiAgICAgICAgICBvY2N1cnJlZC4KKyAqLworRUNfS0VZICpkMmlfRUNQYXJhbWV0ZXJzKEVDX0tFWSAqKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7CisKKy8qKiBFbmNvZGVzIGVjIHBhcmFtZXRlciBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gYSBidWZmZXIuCisgKiAgXHBhcmFtICBrZXkgIHRoZSBFQ19LRVkgb2JqZWN0IHdpdGggZWMgcGFyYW10ZXJzIHRvIGVuY29kZQorICogIFxwYXJhbSAgb3V0ICB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0IChpZiBOVUxMIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bWJlcgorICogICAgICAgICAgICAgICBvZiBieXRlcyBuZWVkZWQpLgorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgaTJkX0VDUGFyYW1ldGVycyhFQ19LRVkgKmtleSwgdW5zaWduZWQgY2hhciAqKm91dCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICBkZS0gYW5kIGVuY29kaW5nIGZ1bmN0aW9ucyBmb3IgRUMgcHVibGljIGtleSAgICAgICAgICAgICAqLworLyogICAgICAgICAob2N0ZXQgc3RyaW5nLCBub3QgREVSIC0tIGhlbmNlICdvMmknIGFuZCAnaTJvJykgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogRGVjb2RlcyBhIGVjIHB1YmxpYyBrZXkgZnJvbSBhIG9jdGV0IHN0cmluZy4KKyAqICBccGFyYW0gIGtleSAgYSBwb2ludGVyIHRvIGEgRUNfS0VZIG9iamVjdCB3aGljaCBzaG91bGQgYmUgdXNlZAorICogIFxwYXJhbSAgaW4gICBtZW1vcnkgYnVmZmVyIHdpdGggdGhlIGVuY29kZWQgcHVibGljIGtleQorICogIFxwYXJhbSAgbGVuICBsZW5ndGggb2YgdGhlIGVuY29kZWQgcHVibGljIGtleQorICogIFxyZXR1cm4gRUNfS0VZIG9iamVjdCB3aXRoIGRlY29kZWQgcHVibGljIGtleSBvciBOVUxMIGlmIGFuIGVycm9yCisgKiAgICAgICAgICBvY2N1cnJlZC4KKyAqLworRUNfS0VZICpvMmlfRUNQdWJsaWNLZXkoRUNfS0VZICoqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKTsKKworLyoqIEVuY29kZXMgYSBlYyBwdWJsaWMga2V5IGluIGFuIG9jdGV0IHN0cmluZy4KKyAqICBccGFyYW0gIGtleSAgdGhlIEVDX0tFWSBvYmplY3Qgd2l0aCB0aGUgcHVibGljIGtleQorICogIFxwYXJhbSAgb3V0ICB0aGUgYnVmZmVyIGZvciB0aGUgcmVzdWx0IChpZiBOVUxMIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bWJlcgorICogICAgICAgICAgICAgICBvZiBieXRlcyBuZWVkZWQpLgorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK2ludCBpMm9fRUNQdWJsaWNLZXkoRUNfS0VZICprZXksIHVuc2lnbmVkIGNoYXIgKipvdXQpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCisvKiogUHJpbnRzIG91dCB0aGUgZWMgcGFyYW1ldGVycyBvbiBodW1hbiByZWFkYWJsZSBmb3JtLgorICogIFxwYXJhbSAgYnAgICBCSU8gb2JqZWN0IHRvIHdoaWNoIHRoZSBpbmZvcm1hdGlvbiBpcyBwcmludGVkCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitpbnQJRUNQYXJhbWV0ZXJzX3ByaW50KEJJTyAqYnAsIGNvbnN0IEVDX0tFWSAqa2V5KTsKKworLyoqIFByaW50cyBvdXQgdGhlIGNvbnRlbnRzIG9mIGEgRUNfS0VZIG9iamVjdAorICogIFxwYXJhbSAgYnAgICBCSU8gb2JqZWN0IHRvIHdoaWNoIHRoZSBpbmZvcm1hdGlvbiBpcyBwcmludGVkCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIG9mZiAgbGluZSBvZmZzZXQgCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworaW50CUVDX0tFWV9wcmludChCSU8gKmJwLCBjb25zdCBFQ19LRVkgKmtleSwgaW50IG9mZik7CisKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorLyoqIFByaW50cyBvdXQgdGhlIGVjIHBhcmFtZXRlcnMgb24gaHVtYW4gcmVhZGFibGUgZm9ybS4KKyAqICBccGFyYW0gIGZwICAgZmlsZSBkZXNjcmlwdG9yIHRvIHdoaWNoIHRoZSBpbmZvcm1hdGlvbiBpcyBwcmludGVkCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitpbnQJRUNQYXJhbWV0ZXJzX3ByaW50X2ZwKEZJTEUgKmZwLCBjb25zdCBFQ19LRVkgKmtleSk7CisKKy8qKiBQcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiBhIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIGZwICAgZmlsZSBkZXNjcmlwdG9yIHRvIHdoaWNoIHRoZSBpbmZvcm1hdGlvbiBpcyBwcmludGVkCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIG9mZiAgbGluZSBvZmZzZXQgCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworaW50CUVDX0tFWV9wcmludF9mcChGSUxFICpmcCwgY29uc3QgRUNfS0VZICprZXksIGludCBvZmYpOworCisjZW5kaWYKKworI2RlZmluZSBFQ1BhcmFtZXRlcnNfZHVwKHgpIEFTTjFfZHVwX29mKEVDX0tFWSxpMmRfRUNQYXJhbWV0ZXJzLGQyaV9FQ1BhcmFtZXRlcnMseCkKKworI2lmbmRlZiBfX2NwbHVzcGx1cworI2lmIGRlZmluZWQoX19TVU5QUk9fQykKKyMgIGlmIF9fU1VOUFJPX0MgPj0gMHg1MjAKKyMgcHJhZ21hIGVycm9yX21lc3NhZ2VzIChkZWZhdWx0LEVfQVJSQVlfT0ZfSU5DT01QTEVURV9OT05BTUUsRV9BUlJBWV9PRl9JTkNPTVBMRVRFKQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIEVWUF9QS0VZX0NUWF9zZXRfZWNfcGFyYW1nZW5fY3VydmVfbmlkKGN0eCwgbmlkKSBcCisJRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCBFVlBfUEtFWV9FQywgRVZQX1BLRVlfT1BfUEFSQU1HRU4sIFwKKwkJCQlFVlBfUEtFWV9DVFJMX0VDX1BBUkFNR0VOX0NVUlZFX05JRCwgbmlkLCBOVUxMKQorCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9FQ19QQVJBTUdFTl9DVVJWRV9OSUQJCShFVlBfUEtFWV9BTEdfQ1RSTCArIDEpCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfRUNfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBFQyBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBFQ19GX0NPTVBVVEVfV05BRgkJCQkgMTQzCisjZGVmaW5lIEVDX0ZfRDJJX0VDUEFSQU1FVEVSUwkJCQkgMTQ0CisjZGVmaW5lIEVDX0ZfRDJJX0VDUEtQQVJBTUVURVJTCQkJCSAxNDUKKyNkZWZpbmUgRUNfRl9EMklfRUNQUklWQVRFS0VZCQkJCSAxNDYKKyNkZWZpbmUgRUNfRl9ET19FQ19LRVlfUFJJTlQJCQkJIDIyMQorI2RlZmluZSBFQ19GX0VDS0VZX1BBUkFNMlRZUEUJCQkJIDIyMworI2RlZmluZSBFQ19GX0VDS0VZX1BBUkFNX0RFQ09ERQkJCQkgMjEyCisjZGVmaW5lIEVDX0ZfRUNLRVlfUFJJVl9ERUNPREUJCQkJIDIxMworI2RlZmluZSBFQ19GX0VDS0VZX1BSSVZfRU5DT0RFCQkJCSAyMTQKKyNkZWZpbmUgRUNfRl9FQ0tFWV9QVUJfREVDT0RFCQkJCSAyMTUKKyNkZWZpbmUgRUNfRl9FQ0tFWV9QVUJfRU5DT0RFCQkJCSAyMTYKKyNkZWZpbmUgRUNfRl9FQ0tFWV9UWVBFMlBBUkFNCQkJCSAyMjAKKyNkZWZpbmUgRUNfRl9FQ1BBUkFNRVRFUlNfUFJJTlQJCQkJIDE0NworI2RlZmluZSBFQ19GX0VDUEFSQU1FVEVSU19QUklOVF9GUAkJCSAxNDgKKyNkZWZpbmUgRUNfRl9FQ1BLUEFSQU1FVEVSU19QUklOVAkJCSAxNDkKKyNkZWZpbmUgRUNfRl9FQ1BLUEFSQU1FVEVSU19QUklOVF9GUAkJCSAxNTAKKyNkZWZpbmUgRUNfRl9FQ1BfTklTVF9NT0RfMTkyCQkJCSAyMDMKKyNkZWZpbmUgRUNfRl9FQ1BfTklTVF9NT0RfMjI0CQkJCSAyMDQKKyNkZWZpbmUgRUNfRl9FQ1BfTklTVF9NT0RfMjU2CQkJCSAyMDUKKyNkZWZpbmUgRUNfRl9FQ1BfTklTVF9NT0RfNTIxCQkJCSAyMDYKKyNkZWZpbmUgRUNfRl9FQ19BU04xX0dST1VQMkNVUlZFCQkJIDE1MworI2RlZmluZSBFQ19GX0VDX0FTTjFfR1JPVVAyRklFTERJRAkJCSAxNTQKKyNkZWZpbmUgRUNfRl9FQ19BU04xX0dST1VQMlBBUkFNRVRFUlMJCQkgMTU1CisjZGVmaW5lIEVDX0ZfRUNfQVNOMV9HUk9VUDJQS1BBUkFNRVRFUlMJCQkgMTU2CisjZGVmaW5lIEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQCQkJIDE1NworI2RlZmluZSBFQ19GX0VDX0FTTjFfUEtQQVJBTUVURVJTMkdST1VQCQkJIDE1OAorI2RlZmluZSBFQ19GX0VDX0VYX0RBVEFfU0VUX0RBVEEJCQkgMjExCisjZGVmaW5lIEVDX0ZfRUNfR0YyTV9NT05UR09NRVJZX1BPSU5UX01VTFRJUExZCQkgMjA4CisjZGVmaW5lIEVDX0ZfRUNfR0YyTV9TSU1QTEVfR1JPVVBfQ0hFQ0tfRElTQ1JJTUlOQU5UCSAxNTkKKyNkZWZpbmUgRUNfRl9FQ19HRjJNX1NJTVBMRV9HUk9VUF9TRVRfQ1VSVkUJCSAxOTUKKyNkZWZpbmUgRUNfRl9FQ19HRjJNX1NJTVBMRV9PQ1QyUE9JTlQJCQkgMTYwCisjZGVmaW5lIEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlQyT0NUCQkJIDE2MQorI2RlZmluZSBFQ19GX0VDX0dGMk1fU0lNUExFX1BPSU5UX0dFVF9BRkZJTkVfQ09PUkRJTkFURVMgMTYyCisjZGVmaW5lIEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlRfU0VUX0FGRklORV9DT09SRElOQVRFUyAxNjMKKyNkZWZpbmUgRUNfRl9FQ19HRjJNX1NJTVBMRV9TRVRfQ09NUFJFU1NFRF9DT09SRElOQVRFUwkgMTY0CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX01PTlRfRklFTERfREVDT0RFCQkJIDEzMworI2RlZmluZSBFQ19GX0VDX0dGUF9NT05UX0ZJRUxEX0VOQ09ERQkJCSAxMzQKKyNkZWZpbmUgRUNfRl9FQ19HRlBfTU9OVF9GSUVMRF9NVUwJCQkgMTMxCisjZGVmaW5lIEVDX0ZfRUNfR0ZQX01PTlRfRklFTERfU0VUX1RPX09ORQkJIDIwOQorI2RlZmluZSBFQ19GX0VDX0dGUF9NT05UX0ZJRUxEX1NRUgkJCSAxMzIKKyNkZWZpbmUgRUNfRl9FQ19HRlBfTU9OVF9HUk9VUF9TRVRfQ1VSVkUJCSAxODkKKyNkZWZpbmUgRUNfRl9FQ19HRlBfTU9OVF9HUk9VUF9TRVRfQ1VSVkVfR0ZQCQkgMTM1CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX05JU1RfRklFTERfTVVMCQkJIDIwMAorI2RlZmluZSBFQ19GX0VDX0dGUF9OSVNUX0ZJRUxEX1NRUgkJCSAyMDEKKyNkZWZpbmUgRUNfRl9FQ19HRlBfTklTVF9HUk9VUF9TRVRfQ1VSVkUJCSAyMDIKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX0dST1VQX0NIRUNLX0RJU0NSSU1JTkFOVAkgMTY1CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9HUk9VUF9TRVRfQ1VSVkUJCSAxNjYKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX0dST1VQX1NFVF9DVVJWRV9HRlAJCSAxMDAKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX0dST1VQX1NFVF9HRU5FUkFUT1IJCSAxMDEKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX01BS0VfQUZGSU5FCQkJIDEwMgorI2RlZmluZSBFQ19GX0VDX0dGUF9TSU1QTEVfT0NUMlBPSU5UCQkJIDEwMworI2RlZmluZSBFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlQyT0NUCQkJIDEwNAorI2RlZmluZSBFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlRTX01BS0VfQUZGSU5FCQkgMTM3CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTCSAxNjcKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX1BPSU5UX0dFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0ZQIDEwNQorI2RlZmluZSBFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlRfU0VUX0FGRklORV9DT09SRElOQVRFUwkgMTY4CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVF9TRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUCAxMjgKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTCSAxNjkKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTX0dGUCAxMjkKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9DSEVDSwkJCQkgMTcwCisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfQ0hFQ0tfRElTQ1JJTUlOQU5UCQkgMTcxCisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfQ09QWQkJCQkgMTA2CisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfR0VUMF9HRU5FUkFUT1IJCQkgMTM5CisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfR0VUX0NPRkFDVE9SCQkJIDE0MAorI2RlZmluZSBFQ19GX0VDX0dST1VQX0dFVF9DVVJWRV9HRjJNCQkJIDE3MgorI2RlZmluZSBFQ19GX0VDX0dST1VQX0dFVF9DVVJWRV9HRlAJCQkgMTMwCisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfR0VUX0RFR1JFRQkJCSAxNzMKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9HRVRfT1JERVIJCQkJIDE0MQorI2RlZmluZSBFQ19GX0VDX0dST1VQX0dFVF9QRU5UQU5PTUlBTF9CQVNJUwkJIDE5MworI2RlZmluZSBFQ19GX0VDX0dST1VQX0dFVF9UUklOT01JQUxfQkFTSVMJCSAxOTQKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9ORVcJCQkJIDEwOAorI2RlZmluZSBFQ19GX0VDX0dST1VQX05FV19CWV9DVVJWRV9OQU1FCQkJIDE3NAorI2RlZmluZSBFQ19GX0VDX0dST1VQX05FV19GUk9NX0RBVEEJCQkgMTc1CisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfUFJFQ09NUFVURV9NVUxUCQkJIDE0MgorI2RlZmluZSBFQ19GX0VDX0dST1VQX1NFVF9DVVJWRV9HRjJNCQkJIDE3NgorI2RlZmluZSBFQ19GX0VDX0dST1VQX1NFVF9DVVJWRV9HRlAJCQkgMTA5CisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfU0VUX0VYVFJBX0RBVEEJCQkgMTEwCisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfU0VUX0dFTkVSQVRPUgkJCSAxMTEKKyNkZWZpbmUgRUNfRl9FQ19LRVlfQ0hFQ0tfS0VZCQkJCSAxNzcKKyNkZWZpbmUgRUNfRl9FQ19LRVlfQ09QWQkJCQkgMTc4CisjZGVmaW5lIEVDX0ZfRUNfS0VZX0dFTkVSQVRFX0tFWQkJCSAxNzkKKyNkZWZpbmUgRUNfRl9FQ19LRVlfTkVXCQkJCQkgMTgyCisjZGVmaW5lIEVDX0ZfRUNfS0VZX1BSSU5UCQkJCSAxODAKKyNkZWZpbmUgRUNfRl9FQ19LRVlfUFJJTlRfRlAJCQkJIDE4MQorI2RlZmluZSBFQ19GX0VDX1BPSU5UU19NQUtFX0FGRklORQkJCSAxMzYKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9BREQJCQkJIDExMgorI2RlZmluZSBFQ19GX0VDX1BPSU5UX0NNUAkJCQkgMTEzCisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfQ09QWQkJCQkgMTE0CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfREJMCQkJCSAxMTUKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGMk0JIDE4MworI2RlZmluZSBFQ19GX0VDX1BPSU5UX0dFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0ZQCSAxMTYKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9HRVRfSlBST0pFQ1RJVkVfQ09PUkRJTkFURVNfR0ZQCSAxMTcKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9JTlZFUlQJCQkJIDIxMAorI2RlZmluZSBFQ19GX0VDX1BPSU5UX0lTX0FUX0lORklOSVRZCQkJIDExOAorI2RlZmluZSBFQ19GX0VDX1BPSU5UX0lTX09OX0NVUlZFCQkJIDExOQorI2RlZmluZSBFQ19GX0VDX1BPSU5UX01BS0VfQUZGSU5FCQkJIDEyMAorI2RlZmluZSBFQ19GX0VDX1BPSU5UX01VTAkJCQkgMTg0CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfTkVXCQkJCSAxMjEKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9PQ1QyUE9JTlQJCQkJIDEyMgorI2RlZmluZSBFQ19GX0VDX1BPSU5UX1BPSU5UMk9DVAkJCQkgMTIzCisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfU0VUX0FGRklORV9DT09SRElOQVRFU19HRjJNCSAxODUKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9TRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUAkgMTI0CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfU0VUX0NPTVBSRVNTRURfQ09PUkRJTkFURVNfR0YyTQkgMTg2CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfU0VUX0NPTVBSRVNTRURfQ09PUkRJTkFURVNfR0ZQCSAxMjUKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9TRVRfSlBST0pFQ1RJVkVfQ09PUkRJTkFURVNfR0ZQCSAxMjYKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9TRVRfVE9fSU5GSU5JVFkJCQkgMTI3CisjZGVmaW5lIEVDX0ZfRUNfUFJFX0NPTVBfRFVQCQkJCSAyMDcKKyNkZWZpbmUgRUNfRl9FQ19QUkVfQ09NUF9ORVcJCQkJIDE5NgorI2RlZmluZSBFQ19GX0VDX1dOQUZfTVVMCQkJCSAxODcKKyNkZWZpbmUgRUNfRl9FQ19XTkFGX1BSRUNPTVBVVEVfTVVMVAkJCSAxODgKKyNkZWZpbmUgRUNfRl9JMkRfRUNQQVJBTUVURVJTCQkJCSAxOTAKKyNkZWZpbmUgRUNfRl9JMkRfRUNQS1BBUkFNRVRFUlMJCQkJIDE5MQorI2RlZmluZSBFQ19GX0kyRF9FQ1BSSVZBVEVLRVkJCQkJIDE5MgorI2RlZmluZSBFQ19GX0kyT19FQ1BVQkxJQ0tFWQkJCQkgMTUxCisjZGVmaW5lIEVDX0ZfTzJJX0VDUFVCTElDS0VZCQkJCSAxNTIKKyNkZWZpbmUgRUNfRl9PTERfRUNfUFJJVl9ERUNPREUJCQkJIDIyMgorI2RlZmluZSBFQ19GX1BLRVlfRUNfQ1RSTAkJCQkgMTk3CisjZGVmaW5lIEVDX0ZfUEtFWV9FQ19DVFJMX1NUUgkJCQkgMTk4CisjZGVmaW5lIEVDX0ZfUEtFWV9FQ19ERVJJVkUJCQkJIDIxNworI2RlZmluZSBFQ19GX1BLRVlfRUNfS0VZR0VOCQkJCSAxOTkKKyNkZWZpbmUgRUNfRl9QS0VZX0VDX1BBUkFNR0VOCQkJCSAyMTkKKyNkZWZpbmUgRUNfRl9QS0VZX0VDX1NJR04JCQkJIDIxOAorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIEVDX1JfQVNOMV9FUlJPUgkJCQkJIDExNQorI2RlZmluZSBFQ19SX0FTTjFfVU5LTk9XTl9GSUVMRAkJCQkgMTE2CisjZGVmaW5lIEVDX1JfQlVGRkVSX1RPT19TTUFMTAkJCQkgMTAwCisjZGVmaW5lIEVDX1JfRDJJX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkUJCQkgMTE3CisjZGVmaW5lIEVDX1JfREVDT0RFX0VSUk9SCQkJCSAxNDIKKyNkZWZpbmUgRUNfUl9ESVNDUklNSU5BTlRfSVNfWkVSTwkJCSAxMTgKKyNkZWZpbmUgRUNfUl9FQ19HUk9VUF9ORVdfQllfTkFNRV9GQUlMVVJFCQkgMTE5CisjZGVmaW5lIEVDX1JfRklFTERfVE9PX0xBUkdFCQkJCSAxNDMKKyNkZWZpbmUgRUNfUl9HUk9VUDJQS1BBUkFNRVRFUlNfRkFJTFVSRQkJCSAxMjAKKyNkZWZpbmUgRUNfUl9JMkRfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRQkJCSAxMjEKKyNkZWZpbmUgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUwkJCSAxMDEKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0FSR1VNRU5UCQkJCSAxMTIKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0NPTVBSRVNTRURfUE9JTlQJCQkgMTEwCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9DT01QUkVTU0lPTl9CSVQJCQkgMTA5CisjZGVmaW5lIEVDX1JfSU5WQUxJRF9DVVJWRQkJCQkgMTQxCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9ESUdFU1RfVFlQRQkJCSAxMzgKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0VOQ09ESU5HCQkJCSAxMDIKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0ZJRUxECQkJCSAxMDMKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0ZPUk0JCQkJIDEwNAorI2RlZmluZSBFQ19SX0lOVkFMSURfR1JPVVBfT1JERVIJCQkgMTIyCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9QRU5UQU5PTUlBTF9CQVNJUwkJCSAxMzIKKyNkZWZpbmUgRUNfUl9JTlZBTElEX1BSSVZBVEVfS0VZCQkJIDEyMworI2RlZmluZSBFQ19SX0lOVkFMSURfVFJJTk9NSUFMX0JBU0lTCQkJIDEzNworI2RlZmluZSBFQ19SX0tFWVNfTk9UX1NFVAkJCQkgMTQwCisjZGVmaW5lIEVDX1JfTUlTU0lOR19QQVJBTUVURVJTCQkJCSAxMjQKKyNkZWZpbmUgRUNfUl9NSVNTSU5HX1BSSVZBVEVfS0VZCQkJIDEyNQorI2RlZmluZSBFQ19SX05PVF9BX05JU1RfUFJJTUUJCQkJIDEzNQorI2RlZmluZSBFQ19SX05PVF9BX1NVUFBPUlRFRF9OSVNUX1BSSU1FCQkJIDEzNgorI2RlZmluZSBFQ19SX05PVF9JTVBMRU1FTlRFRAkJCQkgMTI2CisjZGVmaW5lIEVDX1JfTk9UX0lOSVRJQUxJWkVECQkJCSAxMTEKKyNkZWZpbmUgRUNfUl9OT19GSUVMRF9NT0QJCQkJIDEzMworI2RlZmluZSBFQ19SX05PX1BBUkFNRVRFUlNfU0VUCQkJCSAxMzkKKyNkZWZpbmUgRUNfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIJCQkgMTM0CisjZGVmaW5lIEVDX1JfUEtQQVJBTUVURVJTMkdST1VQX0ZBSUxVUkUJCQkgMTI3CisjZGVmaW5lIEVDX1JfUE9JTlRfQVRfSU5GSU5JVFkJCQkJIDEwNgorI2RlZmluZSBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRQkJCSAxMDcKKyNkZWZpbmUgRUNfUl9TTE9UX0ZVTEwJCQkJCSAxMDgKKyNkZWZpbmUgRUNfUl9VTkRFRklORURfR0VORVJBVE9SCQkJIDExMworI2RlZmluZSBFQ19SX1VOREVGSU5FRF9PUkRFUgkJCQkgMTI4CisjZGVmaW5lIEVDX1JfVU5LTk9XTl9HUk9VUAkJCQkgMTI5CisjZGVmaW5lIEVDX1JfVU5LTk9XTl9PUkRFUgkJCQkgMTE0CisjZGVmaW5lIEVDX1JfVU5TVVBQT1JURURfRklFTEQJCQkJIDEzMQorI2RlZmluZSBFQ19SX1dST05HX09SREVSCQkJCSAxMzAKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lYzJfbXVsdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjMl9tdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2MzFhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lYzJfbXVsdC5jCkBAIC0wLDAgKzEsMzgxIEBACisvKiBjcnlwdG8vZWMvZWMyX211bHQuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBUaGUgRWxsaXB0aWMgQ3VydmUgUHVibGljLUtleSBDcnlwdG8gTGlicmFyeSAoRUNDIENvZGUpIGluY2x1ZGVkCisgKiBoZXJlaW4gaXMgZGV2ZWxvcGVkIGJ5IFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBpcyBjb250cmlidXRlZAorICogdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgRUNDIENvZGUgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYmVsb3cuCisgKgorICogVGhlIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZAorICogRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAiZWNfbGNsLmgiCisKKworLyogQ29tcHV0ZSB0aGUgeC1jb29yZGluYXRlIHgveiBmb3IgdGhlIHBvaW50IDIqKHgveikgaW4gTW9udGdvbWVyeSBwcm9qZWN0aXZlIAorICogY29vcmRpbmF0ZXMuCisgKiBVc2VzIGFsZ29yaXRobSBNZG91YmxlIGluIGFwcGVuZGl4IG9mIAorICogICAgIExvcGV6LCBKLiBhbmQgRGFoYWIsIFIuICAiRmFzdCBtdWx0aXBsaWNhdGlvbiBvbiBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciAKKyAqICAgICBHRigyXm0pIHdpdGhvdXQgcHJlY29tcHV0YXRpb24iIChDSEVTICc5OSwgTE5DUyAxNzE3KS4KKyAqIG1vZGlmaWVkIHRvIG5vdCByZXF1aXJlIHByZWNvbXB1dGF0aW9uIG9mIGM9Yl57Ml57bS0xfX0uCisgKi8KK3N0YXRpYyBpbnQgZ2YybV9NZG91YmxlKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICp4LCBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKnQxOworCWludCByZXQgPSAwOworCQorCS8qIFNpbmNlIE1kb3VibGUgaXMgc3RhdGljIHdlIGNhbiBndWFyYW50ZWUgdGhhdCBjdHggIT0gTlVMTC4gKi8KKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwl0MSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAodDEgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9zcXIoZ3JvdXAsIHgsIHgsIGN0eCkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX3Nxcihncm91cCwgdDEsIHosIGN0eCkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgeiwgeCwgdDEsIGN0eCkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX3Nxcihncm91cCwgeCwgeCwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfc3FyKGdyb3VwLCB0MSwgdDEsIGN0eCkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgdDEsICZncm91cC0+YiwgdDEsIGN0eCkpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9hZGQoeCwgeCwgdDEpKSBnb3RvIGVycjsKKworCXJldCA9IDE7CisKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybiByZXQ7CisJfQorCisvKiBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGUgeDEvejEgZm9yIHRoZSBwb2ludCAoeDEvejEpKyh4Mi94MikgaW4gTW9udGdvbWVyeSAKKyAqIHByb2plY3RpdmUgY29vcmRpbmF0ZXMuCisgKiBVc2VzIGFsZ29yaXRobSBNYWRkIGluIGFwcGVuZGl4IG9mIAorICogICAgIExvcGV6LCBKLiBhbmQgRGFoYWIsIFIuICAiRmFzdCBtdWx0aXBsaWNhdGlvbiBvbiBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciAKKyAqICAgICBHRigyXm0pIHdpdGhvdXQgcHJlY29tcHV0YXRpb24iIChDSEVTICc5OSwgTE5DUyAxNzE3KS4KKyAqLworc3RhdGljIGludCBnZjJtX01hZGQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBCSUdOVU0gKngsIEJJR05VTSAqeDEsIEJJR05VTSAqejEsIAorCWNvbnN0IEJJR05VTSAqeDIsIGNvbnN0IEJJR05VTSAqejIsIEJOX0NUWCAqY3R4KQorCXsKKwlCSUdOVU0gKnQxLCAqdDI7CisJaW50IHJldCA9IDA7CisJCisJLyogU2luY2UgTWFkZCBpcyBzdGF0aWMgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IGN0eCAhPSBOVUxMLiAqLworCUJOX0NUWF9zdGFydChjdHgpOworCXQxID0gQk5fQ1RYX2dldChjdHgpOworCXQyID0gQk5fQ1RYX2dldChjdHgpOworCWlmICh0MiA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICghQk5fY29weSh0MSwgeCkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgeDEsIHgxLCB6MiwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCB6MSwgejEsIHgyLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIHQyLCB4MSwgejEsIGN0eCkpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9hZGQoejEsIHoxLCB4MSkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX3Nxcihncm91cCwgejEsIHoxLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIHgxLCB6MSwgdDEsIGN0eCkpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9hZGQoeDEsIHgxLCB0MikpIGdvdG8gZXJyOworCisJcmV0ID0gMTsKKworIGVycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIENvbXB1dGUgdGhlIHgsIHkgYWZmaW5lIGNvb3JkaW5hdGVzIGZyb20gdGhlIHBvaW50ICh4MSwgejEpICh4MiwgejIpIAorICogdXNpbmcgTW9udGdvbWVyeSBwb2ludCBtdWx0aXBsaWNhdGlvbiBhbGdvcml0aG0gTXh5KCkgaW4gYXBwZW5kaXggb2YgCisgKiAgICAgTG9wZXosIEouIGFuZCBEYWhhYiwgUi4gICJGYXN0IG11bHRpcGxpY2F0aW9uIG9uIGVsbGlwdGljIGN1cnZlcyBvdmVyIAorICogICAgIEdGKDJebSkgd2l0aG91dCBwcmVjb21wdXRhdGlvbiIgKENIRVMgJzk5LCBMTkNTIDE3MTcpLgorICogUmV0dXJuczoKKyAqICAgICAwIG9uIGVycm9yCisgKiAgICAgMSBpZiByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIHRoZSBwb2ludCBhdCBpbmZpbml0eQorICogICAgIDIgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgZ2YybV9NeHkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwgQklHTlVNICp4MSwgCisJQklHTlVNICp6MSwgQklHTlVNICp4MiwgQklHTlVNICp6MiwgQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqdDMsICp0NCwgKnQ1OworCWludCByZXQgPSAwOworCQorCWlmIChCTl9pc196ZXJvKHoxKSkKKwkJeworCQlCTl96ZXJvKHgyKTsKKwkJQk5femVybyh6Mik7CisJCXJldHVybiAxOworCQl9CisJCisJaWYgKEJOX2lzX3plcm8oejIpKQorCQl7CisJCWlmICghQk5fY29weSh4MiwgeCkpIHJldHVybiAwOworCQlpZiAoIUJOX0dGMm1fYWRkKHoyLCB4LCB5KSkgcmV0dXJuIDA7CisJCXJldHVybiAyOworCQl9CisJCQorCS8qIFNpbmNlIE14eSBpcyBzdGF0aWMgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IGN0eCAhPSBOVUxMLiAqLworCUJOX0NUWF9zdGFydChjdHgpOworCXQzID0gQk5fQ1RYX2dldChjdHgpOworCXQ0ID0gQk5fQ1RYX2dldChjdHgpOworCXQ1ID0gQk5fQ1RYX2dldChjdHgpOworCWlmICh0NSA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICghQk5fb25lKHQ1KSkgZ290byBlcnI7CisKKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIHQzLCB6MSwgejIsIGN0eCkpIGdvdG8gZXJyOworCisJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCB6MSwgejEsIHgsIGN0eCkpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9hZGQoejEsIHoxLCB4MSkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgejIsIHoyLCB4LCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIHgxLCB6MiwgeDEsIGN0eCkpIGdvdG8gZXJyOworCWlmICghQk5fR0YybV9hZGQoejIsIHoyLCB4MikpIGdvdG8gZXJyOworCisJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCB6MiwgejIsIHoxLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9zcXIoZ3JvdXAsIHQ0LCB4LCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIUJOX0dGMm1fYWRkKHQ0LCB0NCwgeSkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgdDQsIHQ0LCB0MywgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9HRjJtX2FkZCh0NCwgdDQsIHoyKSkgZ290byBlcnI7CisKKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIHQzLCB0MywgeCwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZGl2KGdyb3VwLCB0MywgdDUsIHQzLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIHQ0LCB0MywgdDQsIGN0eCkpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgeDIsIHgxLCB0MywgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9HRjJtX2FkZCh6MiwgeDIsIHgpKSBnb3RvIGVycjsKKworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgejIsIHoyLCB0NCwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9HRjJtX2FkZCh6MiwgejIsIHkpKSBnb3RvIGVycjsKKworCXJldCA9IDI7CisKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybiByZXQ7CisJfQorCisvKiBDb21wdXRlcyBzY2FsYXIqcG9pbnQgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHIuCisgKiBwb2ludCBjYW4gbm90IGVxdWFsIHIuCisgKiBVc2VzIGFsZ29yaXRobSAyUCBvZgorICogICAgIExvcGV6LCBKLiBhbmQgRGFoYWIsIFIuICAiRmFzdCBtdWx0aXBsaWNhdGlvbiBvbiBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciAKKyAqICAgICBHRigyXm0pIHdpdGhvdXQgcHJlY29tcHV0YXRpb24iIChDSEVTICc5OSwgTE5DUyAxNzE3KS4KKyAqLworc3RhdGljIGludCBlY19HRjJtX21vbnRnb21lcnlfcG9pbnRfbXVsdGlwbHkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgQklHTlVNICpzY2FsYXIsCisJY29uc3QgRUNfUE9JTlQgKnBvaW50LCBCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNICp4MSwgKngyLCAqejEsICp6MjsKKwlpbnQgcmV0ID0gMCwgaTsKKwlCTl9VTE9ORyBtYXNrLHdvcmQ7CisKKwlpZiAociA9PSBwb2ludCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dGMk1fTU9OVEdPTUVSWV9QT0lOVF9NVUxUSVBMWSwgRUNfUl9JTlZBTElEX0FSR1VNRU5UKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkKKwkvKiBpZiByZXN1bHQgc2hvdWxkIGJlIHBvaW50IGF0IGluZmluaXR5ICovCisJaWYgKChzY2FsYXIgPT0gTlVMTCkgfHwgQk5faXNfemVybyhzY2FsYXIpIHx8IChwb2ludCA9PSBOVUxMKSB8fCAKKwkJRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIHBvaW50KSkKKwkJeworCQlyZXR1cm4gRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGdyb3VwLCByKTsKKwkJfQorCisJLyogb25seSBzdXBwb3J0IGFmZmluZSBjb29yZGluYXRlcyAqLworCWlmICghcG9pbnQtPlpfaXNfb25lKSByZXR1cm4gMDsKKworCS8qIFNpbmNlIHBvaW50X211bHRpcGx5IGlzIHN0YXRpYyB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQgY3R4ICE9IE5VTEwuICovCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJeDEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJejEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHoxID09IE5VTEwpIGdvdG8gZXJyOworCisJeDIgPSAmci0+WDsKKwl6MiA9ICZyLT5ZOworCisJaWYgKCFCTl9HRjJtX21vZF9hcnIoeDEsICZwb2ludC0+WCwgZ3JvdXAtPnBvbHkpKSBnb3RvIGVycjsgLyogeDEgPSB4ICovCisJaWYgKCFCTl9vbmUoejEpKSBnb3RvIGVycjsgLyogejEgPSAxICovCisJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfc3FyKGdyb3VwLCB6MiwgeDEsIGN0eCkpIGdvdG8gZXJyOyAvKiB6MiA9IHgxXjIgPSB4XjIgKi8KKwlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9zcXIoZ3JvdXAsIHgyLCB6MiwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9HRjJtX2FkZCh4MiwgeDIsICZncm91cC0+YikpIGdvdG8gZXJyOyAvKiB4MiA9IHheNCArIGIgKi8KKworCS8qIGZpbmQgdG9wIG1vc3QgYml0IGFuZCBnbyBvbmUgcGFzdCBpdCAqLworCWkgPSBzY2FsYXItPnRvcCAtIDE7CisJbWFzayA9IEJOX1RCSVQ7CisJd29yZCA9IHNjYWxhci0+ZFtpXTsKKwl3aGlsZSAoISh3b3JkICYgbWFzaykpIG1hc2sgPj49IDE7CisJbWFzayA+Pj0gMTsKKwkvKiBpZiB0b3AgbW9zdCBiaXQgd2FzIGF0IHdvcmQgYnJlYWssIGdvIHRvIG5leHQgd29yZCAqLworCWlmICghbWFzaykgCisJCXsKKwkJaS0tOworCQltYXNrID0gQk5fVEJJVDsKKwkJfQorCisJZm9yICg7IGkgPj0gMDsgaS0tKQorCQl7CisJCXdvcmQgPSBzY2FsYXItPmRbaV07CisJCXdoaWxlIChtYXNrKQorCQkJeworCQkJaWYgKHdvcmQgJiBtYXNrKQorCQkJCXsKKwkJCQlpZiAoIWdmMm1fTWFkZChncm91cCwgJnBvaW50LT5YLCB4MSwgejEsIHgyLCB6MiwgY3R4KSkgZ290byBlcnI7CisJCQkJaWYgKCFnZjJtX01kb3VibGUoZ3JvdXAsIHgyLCB6MiwgY3R4KSkgZ290byBlcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpZiAoIWdmMm1fTWFkZChncm91cCwgJnBvaW50LT5YLCB4MiwgejIsIHgxLCB6MSwgY3R4KSkgZ290byBlcnI7CisJCQkJaWYgKCFnZjJtX01kb3VibGUoZ3JvdXAsIHgxLCB6MSwgY3R4KSkgZ290byBlcnI7CisJCQkJfQorCQkJbWFzayA+Pj0gMTsKKwkJCX0KKwkJbWFzayA9IEJOX1RCSVQ7CisJCX0KKworCS8qIGNvbnZlcnQgb3V0IG9mICJwcm9qZWN0aXZlIiBjb29yZGluYXRlcyAqLworCWkgPSBnZjJtX014eShncm91cCwgJnBvaW50LT5YLCAmcG9pbnQtPlksIHgxLCB6MSwgeDIsIHoyLCBjdHgpOworCWlmIChpID09IDApIGdvdG8gZXJyOworCWVsc2UgaWYgKGkgPT0gMSkgCisJCXsKKwkJaWYgKCFFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkoZ3JvdXAsIHIpKSBnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIUJOX29uZSgmci0+WikpIGdvdG8gZXJyOworCQlyLT5aX2lzX29uZSA9IDE7CisJCX0KKworCS8qIEdGKDJebSkgZmllbGQgZWxlbWVudHMgc2hvdWxkIGFsd2F5cyBoYXZlIEJJR05VTTo6bmVnID0gMCAqLworCUJOX3NldF9uZWdhdGl2ZSgmci0+WCwgMCk7CisJQk5fc2V0X25lZ2F0aXZlKCZyLT5ZLCAwKTsKKworCXJldCA9IDE7CisKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCXJldHVybiByZXQ7CisJfQorCisKKy8qIENvbXB1dGVzIHRoZSBzdW0KKyAqICAgICBzY2FsYXIqZ3JvdXAtPmdlbmVyYXRvciArIHNjYWxhcnNbMF0qcG9pbnRzWzBdICsgLi4uICsgc2NhbGFyc1tudW0tMV0qcG9pbnRzW251bS0xXQorICogZ3JhY2VmdWxseSBpZ25vcmluZyBOVUxMIHNjYWxhciB2YWx1ZXMuCisgKi8KK2ludCBlY19HRjJtX3NpbXBsZV9tdWwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgQklHTlVNICpzY2FsYXIsCisJc2l6ZV90IG51bSwgY29uc3QgRUNfUE9JTlQgKnBvaW50c1tdLCBjb25zdCBCSUdOVU0gKnNjYWxhcnNbXSwgQk5fQ1RYICpjdHgpCisJeworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJc2l6ZV90IGk7CisJRUNfUE9JTlQgKnA9TlVMTDsKKworCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJLyogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSB3TkFGIGltcGxlbWVudGF0aW9uIGZvciAyCisJICogb3IgZmV3ZXIgcG9pbnRzLiAgVXNlIHRoZSBlY193TkFGX211bCBpbXBsZW1lbnRhdGlvbiBmb3IgMyBvciBtb3JlIHBvaW50cywKKwkgKiBvciBpZiB3ZSBjYW4gcGVyZm9ybSBhIGZhc3QgbXVsdGlwbGljYXRpb24gYmFzZWQgb24gcHJlY29tcHV0YXRpb24uCisJICovCisJaWYgKChzY2FsYXIgJiYgKG51bSA+IDEpKSB8fCAobnVtID4gMikgfHwgKG51bSA9PSAwICYmIEVDX0dST1VQX2hhdmVfcHJlY29tcHV0ZV9tdWx0KGdyb3VwKSkpCisJCXsKKwkJcmV0ID0gZWNfd05BRl9tdWwoZ3JvdXAsIHIsIHNjYWxhciwgbnVtLCBwb2ludHMsIHNjYWxhcnMsIGN0eCk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoKHAgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICghRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGdyb3VwLCByKSkgZ290byBlcnI7CisKKwlpZiAoc2NhbGFyKQorCQl7CisJCWlmICghZWNfR0YybV9tb250Z29tZXJ5X3BvaW50X211bHRpcGx5KGdyb3VwLCBwLCBzY2FsYXIsIGdyb3VwLT5nZW5lcmF0b3IsIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoQk5faXNfbmVnYXRpdmUoc2NhbGFyKSkgCisJCQlpZiAoIWdyb3VwLT5tZXRoLT5pbnZlcnQoZ3JvdXAsIHAsIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIWdyb3VwLT5tZXRoLT5hZGQoZ3JvdXAsIHIsIHIsIHAsIGN0eCkpIGdvdG8gZXJyOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCXsKKwkJaWYgKCFlY19HRjJtX21vbnRnb21lcnlfcG9pbnRfbXVsdGlwbHkoZ3JvdXAsIHAsIHNjYWxhcnNbaV0sIHBvaW50c1tpXSwgY3R4KSkgZ290byBlcnI7CisJCWlmIChCTl9pc19uZWdhdGl2ZShzY2FsYXJzW2ldKSkKKwkJCWlmICghZ3JvdXAtPm1ldGgtPmludmVydChncm91cCwgcCwgY3R4KSkgZ290byBlcnI7CisJCWlmICghZ3JvdXAtPm1ldGgtPmFkZChncm91cCwgciwgciwgcCwgY3R4KSkgZ290byBlcnI7CisJCX0KKworCXJldCA9IDE7CisKKyAgZXJyOgorCWlmIChwKSBFQ19QT0lOVF9mcmVlKHApOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKKy8qIFByZWNvbXB1dGF0aW9uIGZvciBwb2ludCBtdWx0aXBsaWNhdGlvbjogZmFsbCBiYWNrIHRvIHdOQUYgbWV0aG9kcworICogYmVjYXVzZSBlY19HRjJtX3NpbXBsZV9tdWwoKSB1c2VzIGVjX3dOQUZfbXVsKCkgaWYgYXBwcm9wcmlhdGUgKi8KKworaW50IGVjX0dGMm1fcHJlY29tcHV0ZV9tdWx0KEVDX0dST1VQICpncm91cCwgQk5fQ1RYICpjdHgpCisJeworCXJldHVybiBlY193TkFGX3ByZWNvbXB1dGVfbXVsdChncm91cCwgY3R4KTsKKyAJfQorCitpbnQgZWNfR0YybV9oYXZlX3ByZWNvbXB1dGVfbXVsdChjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCXJldHVybiBlY193TkFGX2hhdmVfcHJlY29tcHV0ZV9tdWx0KGdyb3VwKTsKKyAJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjMl9zbXBsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWMyX3NtcGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjM1N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjMl9zbXBsLmMKQEAgLTAsMCArMSwxMDM5IEBACisvKiBjcnlwdG8vZWMvZWMyX3NtcGwuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBUaGUgRWxsaXB0aWMgQ3VydmUgUHVibGljLUtleSBDcnlwdG8gTGlicmFyeSAoRUNDIENvZGUpIGluY2x1ZGVkCisgKiBoZXJlaW4gaXMgZGV2ZWxvcGVkIGJ5IFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBpcyBjb250cmlidXRlZAorICogdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgRUNDIENvZGUgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYmVsb3cuCisgKgorICogVGhlIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZAorICogRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCisjaW5jbHVkZSAiZWNfbGNsLmgiCisKKworY29uc3QgRUNfTUVUSE9EICpFQ19HRjJtX3NpbXBsZV9tZXRob2Qodm9pZCkKKwl7CisJc3RhdGljIGNvbnN0IEVDX01FVEhPRCByZXQgPSB7CisJCU5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsCisJCWVjX0dGMm1fc2ltcGxlX2dyb3VwX2luaXQsCisJCWVjX0dGMm1fc2ltcGxlX2dyb3VwX2ZpbmlzaCwKKwkJZWNfR0YybV9zaW1wbGVfZ3JvdXBfY2xlYXJfZmluaXNoLAorCQllY19HRjJtX3NpbXBsZV9ncm91cF9jb3B5LAorCQllY19HRjJtX3NpbXBsZV9ncm91cF9zZXRfY3VydmUsCisJCWVjX0dGMm1fc2ltcGxlX2dyb3VwX2dldF9jdXJ2ZSwKKwkJZWNfR0YybV9zaW1wbGVfZ3JvdXBfZ2V0X2RlZ3JlZSwKKwkJZWNfR0YybV9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50LAorCQllY19HRjJtX3NpbXBsZV9wb2ludF9pbml0LAorCQllY19HRjJtX3NpbXBsZV9wb2ludF9maW5pc2gsCisJCWVjX0dGMm1fc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaCwKKwkJZWNfR0YybV9zaW1wbGVfcG9pbnRfY29weSwKKwkJZWNfR0YybV9zaW1wbGVfcG9pbnRfc2V0X3RvX2luZmluaXR5LAorCQkwIC8qIHNldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAgKi8sCisJCTAgLyogZ2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCAqLywKKwkJZWNfR0YybV9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcywKKwkJZWNfR0YybV9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcywKKwkJZWNfR0YybV9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMsCisJCWVjX0dGMm1fc2ltcGxlX3BvaW50Mm9jdCwKKwkJZWNfR0YybV9zaW1wbGVfb2N0MnBvaW50LAorCQllY19HRjJtX3NpbXBsZV9hZGQsCisJCWVjX0dGMm1fc2ltcGxlX2RibCwKKwkJZWNfR0YybV9zaW1wbGVfaW52ZXJ0LAorCQllY19HRjJtX3NpbXBsZV9pc19hdF9pbmZpbml0eSwKKwkJZWNfR0YybV9zaW1wbGVfaXNfb25fY3VydmUsCisJCWVjX0dGMm1fc2ltcGxlX2NtcCwKKwkJZWNfR0YybV9zaW1wbGVfbWFrZV9hZmZpbmUsCisJCWVjX0dGMm1fc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSwKKworCQkvKiB0aGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZCBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gZWMyX211bHQuYyAqLworCQllY19HRjJtX3NpbXBsZV9tdWwsCisJCWVjX0dGMm1fcHJlY29tcHV0ZV9tdWx0LAorCQllY19HRjJtX2hhdmVfcHJlY29tcHV0ZV9tdWx0LAorCisJCWVjX0dGMm1fc2ltcGxlX2ZpZWxkX211bCwKKwkJZWNfR0YybV9zaW1wbGVfZmllbGRfc3FyLAorCQllY19HRjJtX3NpbXBsZV9maWVsZF9kaXYsCisJCTAgLyogZmllbGRfZW5jb2RlICovLAorCQkwIC8qIGZpZWxkX2RlY29kZSAqLywKKwkJMCAvKiBmaWVsZF9zZXRfdG9fb25lICovIH07CisKKwlyZXR1cm4gJnJldDsKKwl9CisKKworLyogSW5pdGlhbGl6ZSBhIEdGKDJebSktYmFzZWQgRUNfR1JPVVAgc3RydWN0dXJlLgorICogTm90ZSB0aGF0IGFsbCBvdGhlciBtZW1iZXJzIGFyZSBoYW5kbGVkIGJ5IEVDX0dST1VQX25ldy4KKyAqLworaW50IGVjX0dGMm1fc2ltcGxlX2dyb3VwX2luaXQoRUNfR1JPVVAgKmdyb3VwKQorCXsKKwlCTl9pbml0KCZncm91cC0+ZmllbGQpOworCUJOX2luaXQoJmdyb3VwLT5hKTsKKwlCTl9pbml0KCZncm91cC0+Yik7CisJcmV0dXJuIDE7CisJfQorCisKKy8qIEZyZWUgYSBHRigyXm0pLWJhc2VkIEVDX0dST1VQIHN0cnVjdHVyZS4KKyAqIE5vdGUgdGhhdCBhbGwgb3RoZXIgbWVtYmVycyBhcmUgaGFuZGxlZCBieSBFQ19HUk9VUF9mcmVlLgorICovCit2b2lkIGVjX0dGMm1fc2ltcGxlX2dyb3VwX2ZpbmlzaChFQ19HUk9VUCAqZ3JvdXApCisJeworCUJOX2ZyZWUoJmdyb3VwLT5maWVsZCk7CisJQk5fZnJlZSgmZ3JvdXAtPmEpOworCUJOX2ZyZWUoJmdyb3VwLT5iKTsKKwl9CisKKworLyogQ2xlYXIgYW5kIGZyZWUgYSBHRigyXm0pLWJhc2VkIEVDX0dST1VQIHN0cnVjdHVyZS4KKyAqIE5vdGUgdGhhdCBhbGwgb3RoZXIgbWVtYmVycyBhcmUgaGFuZGxlZCBieSBFQ19HUk9VUF9jbGVhcl9mcmVlLgorICovCit2b2lkIGVjX0dGMm1fc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaChFQ19HUk9VUCAqZ3JvdXApCisJeworCUJOX2NsZWFyX2ZyZWUoJmdyb3VwLT5maWVsZCk7CisJQk5fY2xlYXJfZnJlZSgmZ3JvdXAtPmEpOworCUJOX2NsZWFyX2ZyZWUoJmdyb3VwLT5iKTsKKwlncm91cC0+cG9seVswXSA9IDA7CisJZ3JvdXAtPnBvbHlbMV0gPSAwOworCWdyb3VwLT5wb2x5WzJdID0gMDsKKwlncm91cC0+cG9seVszXSA9IDA7CisJZ3JvdXAtPnBvbHlbNF0gPSAwOworCWdyb3VwLT5wb2x5WzVdID0gLTE7CisJfQorCisKKy8qIENvcHkgYSBHRigyXm0pLWJhc2VkIEVDX0dST1VQIHN0cnVjdHVyZS4KKyAqIE5vdGUgdGhhdCBhbGwgb3RoZXIgbWVtYmVycyBhcmUgaGFuZGxlZCBieSBFQ19HUk9VUF9jb3B5LgorICovCitpbnQgZWNfR0YybV9zaW1wbGVfZ3JvdXBfY29weShFQ19HUk9VUCAqZGVzdCwgY29uc3QgRUNfR1JPVVAgKnNyYykKKwl7CisJaW50IGk7CisJaWYgKCFCTl9jb3B5KCZkZXN0LT5maWVsZCwgJnNyYy0+ZmllbGQpKSByZXR1cm4gMDsKKwlpZiAoIUJOX2NvcHkoJmRlc3QtPmEsICZzcmMtPmEpKSByZXR1cm4gMDsKKwlpZiAoIUJOX2NvcHkoJmRlc3QtPmIsICZzcmMtPmIpKSByZXR1cm4gMDsKKwlkZXN0LT5wb2x5WzBdID0gc3JjLT5wb2x5WzBdOworCWRlc3QtPnBvbHlbMV0gPSBzcmMtPnBvbHlbMV07CisJZGVzdC0+cG9seVsyXSA9IHNyYy0+cG9seVsyXTsKKwlkZXN0LT5wb2x5WzNdID0gc3JjLT5wb2x5WzNdOworCWRlc3QtPnBvbHlbNF0gPSBzcmMtPnBvbHlbNF07CisJZGVzdC0+cG9seVs1XSA9IHNyYy0+cG9seVs1XTsKKwlpZiAoYm5fd2V4cGFuZCgmZGVzdC0+YSwgKGludCkoZGVzdC0+cG9seVswXSArIEJOX0JJVFMyIC0gMSkgLyBCTl9CSVRTMikgPT0gTlVMTCkgcmV0dXJuIDA7CisJaWYgKGJuX3dleHBhbmQoJmRlc3QtPmIsIChpbnQpKGRlc3QtPnBvbHlbMF0gKyBCTl9CSVRTMiAtIDEpIC8gQk5fQklUUzIpID09IE5VTEwpIHJldHVybiAwOworCWZvciAoaSA9IGRlc3QtPmEudG9wOyBpIDwgZGVzdC0+YS5kbWF4OyBpKyspIGRlc3QtPmEuZFtpXSA9IDA7CisJZm9yIChpID0gZGVzdC0+Yi50b3A7IGkgPCBkZXN0LT5iLmRtYXg7IGkrKykgZGVzdC0+Yi5kW2ldID0gMDsKKwlyZXR1cm4gMTsKKwl9CisKKworLyogU2V0IHRoZSBjdXJ2ZSBwYXJhbWV0ZXJzIG9mIGFuIEVDX0dST1VQIHN0cnVjdHVyZS4gKi8KK2ludCBlY19HRjJtX3NpbXBsZV9ncm91cF9zZXRfY3VydmUoRUNfR1JPVVAgKmdyb3VwLAorCWNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0ID0gMCwgaTsKKworCS8qIGdyb3VwLT5maWVsZCAqLworCWlmICghQk5fY29weSgmZ3JvdXAtPmZpZWxkLCBwKSkgZ290byBlcnI7CisJaSA9IEJOX0dGMm1fcG9seTJhcnIoJmdyb3VwLT5maWVsZCwgZ3JvdXAtPnBvbHksIDYpIC0gMTsKKwlpZiAoKGkgIT0gNSkgJiYgKGkgIT0gMykpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HRjJNX1NJTVBMRV9HUk9VUF9TRVRfQ1VSVkUsIEVDX1JfVU5TVVBQT1JURURfRklFTEQpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogZ3JvdXAtPmEgKi8KKwlpZiAoIUJOX0dGMm1fbW9kX2FycigmZ3JvdXAtPmEsIGEsIGdyb3VwLT5wb2x5KSkgZ290byBlcnI7CisJaWYoYm5fd2V4cGFuZCgmZ3JvdXAtPmEsIChpbnQpKGdyb3VwLT5wb2x5WzBdICsgQk5fQklUUzIgLSAxKSAvIEJOX0JJVFMyKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlmb3IgKGkgPSBncm91cC0+YS50b3A7IGkgPCBncm91cC0+YS5kbWF4OyBpKyspIGdyb3VwLT5hLmRbaV0gPSAwOworCQorCS8qIGdyb3VwLT5iICovCisJaWYgKCFCTl9HRjJtX21vZF9hcnIoJmdyb3VwLT5iLCBiLCBncm91cC0+cG9seSkpIGdvdG8gZXJyOworCWlmKGJuX3dleHBhbmQoJmdyb3VwLT5iLCAoaW50KShncm91cC0+cG9seVswXSArIEJOX0JJVFMyIC0gMSkgLyBCTl9CSVRTMikgPT0gTlVMTCkgZ290byBlcnI7CisJZm9yIChpID0gZ3JvdXAtPmIudG9wOyBpIDwgZ3JvdXAtPmIuZG1heDsgaSsrKSBncm91cC0+Yi5kW2ldID0gMDsKKwkJCisJcmV0ID0gMTsKKyAgZXJyOgorCXJldHVybiByZXQ7CisJfQorCisKKy8qIEdldCB0aGUgY3VydmUgcGFyYW1ldGVycyBvZiBhbiBFQ19HUk9VUCBzdHJ1Y3R1cmUuCisgKiBJZiBwLCBhLCBvciBiIGFyZSBOVUxMIHRoZW4gdGhlcmUgdmFsdWVzIHdpbGwgbm90IGJlIHNldCBidXQgdGhlIG1ldGhvZCB3aWxsIHJldHVybiB3aXRoIHN1Y2Nlc3MuCisgKi8KK2ludCBlY19HRjJtX3NpbXBsZV9ncm91cF9nZXRfY3VydmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnAsIEJJR05VTSAqYSwgQklHTlVNICpiLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldCA9IDA7CisJCisJaWYgKHAgIT0gTlVMTCkKKwkJeworCQlpZiAoIUJOX2NvcHkocCwgJmdyb3VwLT5maWVsZCkpIHJldHVybiAwOworCQl9CisKKwlpZiAoYSAhPSBOVUxMKQorCQl7CisJCWlmICghQk5fY29weShhLCAmZ3JvdXAtPmEpKSBnb3RvIGVycjsKKwkJfQorCisJaWYgKGIgIT0gTlVMTCkKKwkJeworCQlpZiAoIUJOX2NvcHkoYiwgJmdyb3VwLT5iKSkgZ290byBlcnI7CisJCX0KKwkKKwlyZXQgPSAxOworCQorICBlcnI6CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogR2V0cyB0aGUgZGVncmVlIG9mIHRoZSBmaWVsZC4gIEZvciBhIGN1cnZlIG92ZXIgR0YoMl5tKSB0aGlzIGlzIHRoZSB2YWx1ZSBtLiAqLworaW50IGVjX0dGMm1fc2ltcGxlX2dyb3VwX2dldF9kZWdyZWUoY29uc3QgRUNfR1JPVVAgKmdyb3VwKQorCXsKKwlyZXR1cm4gQk5fbnVtX2JpdHMoJmdyb3VwLT5maWVsZCktMTsKKwl9CisKKworLyogQ2hlY2tzIHRoZSBkaXNjcmltaW5hbnQgb2YgdGhlIGN1cnZlLgorICogeV4yICsgeCp5ID0geF4zICsgYSp4XjIgKyBiIGlzIGFuIGVsbGlwdGljIGN1cnZlIDw9PiBiICE9IDAgKG1vZCBwKSAKKyAqLworaW50IGVjX0dGMm1fc2ltcGxlX2dyb3VwX2NoZWNrX2Rpc2NyaW1pbmFudChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0ID0gMDsKKwlCSUdOVU0gKmI7CisJQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKworCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0dGMk1fU0lNUExFX0dST1VQX0NIRUNLX0RJU0NSSU1JTkFOVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwliID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChiID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKCFCTl9HRjJtX21vZF9hcnIoYiwgJmdyb3VwLT5iLCBncm91cC0+cG9seSkpIGdvdG8gZXJyOworCQorCS8qIGNoZWNrIHRoZSBkaXNjcmltaW5hbnQ6CisJICogeV4yICsgeCp5ID0geF4zICsgYSp4XjIgKyBiIGlzIGFuIGVsbGlwdGljIGN1cnZlIDw9PiBiICE9IDAgKG1vZCBwKSAKKwkgKi8KKwlpZiAoQk5faXNfemVybyhiKSkgZ290byBlcnI7CisKKwlyZXQgPSAxOworCitlcnI6CisJaWYgKGN0eCAhPSBOVUxMKQorCQlCTl9DVFhfZW5kKGN0eCk7CisJaWYgKG5ld19jdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogSW5pdGlhbGl6ZXMgYW4gRUNfUE9JTlQuICovCitpbnQgZWNfR0YybV9zaW1wbGVfcG9pbnRfaW5pdChFQ19QT0lOVCAqcG9pbnQpCisJeworCUJOX2luaXQoJnBvaW50LT5YKTsKKwlCTl9pbml0KCZwb2ludC0+WSk7CisJQk5faW5pdCgmcG9pbnQtPlopOworCXJldHVybiAxOworCX0KKworCisvKiBGcmVlcyBhbiBFQ19QT0lOVC4gKi8KK3ZvaWQgZWNfR0YybV9zaW1wbGVfcG9pbnRfZmluaXNoKEVDX1BPSU5UICpwb2ludCkKKwl7CisJQk5fZnJlZSgmcG9pbnQtPlgpOworCUJOX2ZyZWUoJnBvaW50LT5ZKTsKKwlCTl9mcmVlKCZwb2ludC0+Wik7CisJfQorCisKKy8qIENsZWFycyBhbmQgZnJlZXMgYW4gRUNfUE9JTlQuICovCit2b2lkIGVjX0dGMm1fc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaChFQ19QT0lOVCAqcG9pbnQpCisJeworCUJOX2NsZWFyX2ZyZWUoJnBvaW50LT5YKTsKKwlCTl9jbGVhcl9mcmVlKCZwb2ludC0+WSk7CisJQk5fY2xlYXJfZnJlZSgmcG9pbnQtPlopOworCXBvaW50LT5aX2lzX29uZSA9IDA7CisJfQorCisKKy8qIENvcHkgdGhlIGNvbnRlbnRzIG9mIG9uZSBFQ19QT0lOVCBpbnRvIGFub3RoZXIuICBBc3N1bWVzIGRlc3QgaXMgaW5pdGlhbGl6ZWQuICovCitpbnQgZWNfR0YybV9zaW1wbGVfcG9pbnRfY29weShFQ19QT0lOVCAqZGVzdCwgY29uc3QgRUNfUE9JTlQgKnNyYykKKwl7CisJaWYgKCFCTl9jb3B5KCZkZXN0LT5YLCAmc3JjLT5YKSkgcmV0dXJuIDA7CisJaWYgKCFCTl9jb3B5KCZkZXN0LT5ZLCAmc3JjLT5ZKSkgcmV0dXJuIDA7CisJaWYgKCFCTl9jb3B5KCZkZXN0LT5aLCAmc3JjLT5aKSkgcmV0dXJuIDA7CisJZGVzdC0+Wl9pc19vbmUgPSBzcmMtPlpfaXNfb25lOworCisJcmV0dXJuIDE7CisJfQorCisKKy8qIFNldCBhbiBFQ19QT0lOVCB0byB0aGUgcG9pbnQgYXQgaW5maW5pdHkuICAKKyAqIEEgcG9pbnQgYXQgaW5maW5pdHkgaXMgcmVwcmVzZW50ZWQgYnkgaGF2aW5nIFo9MC4KKyAqLworaW50IGVjX0dGMm1fc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCkKKwl7CisJcG9pbnQtPlpfaXNfb25lID0gMDsKKwlCTl96ZXJvKCZwb2ludC0+Wik7CisJcmV0dXJuIDE7CisJfQorCisKKy8qIFNldCB0aGUgY29vcmRpbmF0ZXMgb2YgYW4gRUNfUE9JTlQgdXNpbmcgYWZmaW5lIGNvb3JkaW5hdGVzLiAKKyAqIE5vdGUgdGhhdCB0aGUgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9ubHkgdXNlcyBhZmZpbmUgY29vcmRpbmF0ZXMuCisgKi8KK2ludCBlY19HRjJtX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LAorCWNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldCA9IDA7CQorCWlmICh4ID09IE5VTEwgfHwgeSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlRfU0VUX0FGRklORV9DT09SRElOQVRFUywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmICghQk5fY29weSgmcG9pbnQtPlgsIHgpKSBnb3RvIGVycjsKKwlCTl9zZXRfbmVnYXRpdmUoJnBvaW50LT5YLCAwKTsKKwlpZiAoIUJOX2NvcHkoJnBvaW50LT5ZLCB5KSkgZ290byBlcnI7CisJQk5fc2V0X25lZ2F0aXZlKCZwb2ludC0+WSwgMCk7CisJaWYgKCFCTl9jb3B5KCZwb2ludC0+WiwgQk5fdmFsdWVfb25lKCkpKSBnb3RvIGVycjsKKwlCTl9zZXRfbmVnYXRpdmUoJnBvaW50LT5aLCAwKTsKKwlwb2ludC0+Wl9pc19vbmUgPSAxOworCXJldCA9IDE7CisKKyAgZXJyOgorCXJldHVybiByZXQ7CisJfQorCisKKy8qIEdldHMgdGhlIGFmZmluZSBjb29yZGluYXRlcyBvZiBhbiBFQ19QT0lOVC4gCisgKiBOb3RlIHRoYXQgdGhlIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHVzZXMgYWZmaW5lIGNvb3JkaW5hdGVzLgorICovCitpbnQgZWNfR0YybV9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyhjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwKKwlCSUdOVU0gKngsIEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQgPSAwOworCisJaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HRjJNX1NJTVBMRV9QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTLCBFQ19SX1BPSU5UX0FUX0lORklOSVRZKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmIChCTl9jbXAoJnBvaW50LT5aLCBCTl92YWx1ZV9vbmUoKSkpIAorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlRfR0VUX0FGRklORV9DT09SRElOQVRFUywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoeCAhPSBOVUxMKQorCQl7CisJCWlmICghQk5fY29weSh4LCAmcG9pbnQtPlgpKSBnb3RvIGVycjsKKwkJQk5fc2V0X25lZ2F0aXZlKHgsIDApOworCQl9CisJaWYgKHkgIT0gTlVMTCkKKwkJeworCQlpZiAoIUJOX2NvcHkoeSwgJnBvaW50LT5ZKSkgZ290byBlcnI7CisJCUJOX3NldF9uZWdhdGl2ZSh5LCAwKTsKKwkJfQorCXJldCA9IDE7CisJCQorIGVycjoKKwlyZXR1cm4gcmV0OworCX0KKworCisvKiBDYWxjdWxhdGVzIGFuZCBzZXRzIHRoZSBhZmZpbmUgY29vcmRpbmF0ZXMgb2YgYW4gRUNfUE9JTlQgZnJvbSB0aGUgZ2l2ZW4KKyAqIGNvbXByZXNzZWQgY29vcmRpbmF0ZXMuICBVc2VzIGFsZ29yaXRobSAyLjMuNCBvZiBTRUMgMS4gCisgKiBOb3RlIHRoYXQgdGhlIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHVzZXMgYWZmaW5lIGNvb3JkaW5hdGVzLgorICoKKyAqIFRoZSBtZXRob2QgaXMgZnJvbSB0aGUgZm9sbG93aW5nIHB1YmxpY2F0aW9uOgorICogCisgKiAgICAgSGFycGVyLCBNZW5lemVzLCBWYW5zdG9uZToKKyAqICAgICAiUHVibGljLUtleSBDcnlwdG9zeXN0ZW1zIHdpdGggVmVyeSBTbWFsbCBLZXkgTGVuZ3RocyIsCisgKiAgICAgRVVST0NSWVBUICc5MiwgU3ByaW5nZXItVmVybGFnIExOQ1MgNjU4LAorICogICAgIHB1Ymxpc2hlZCBGZWJydWFyeSAxOTkzCisgKgorICogVVMgUGF0ZW50cyA2LDE0MSw0MjAgYW5kIDYsNjE4LDQ4MyAoVmFuc3RvbmUsIE11bGxpbiwgQWduZXcpIGRlc2NyaWJlCisgKiB0aGUgc2FtZSBtZXRob2QsIGJ1dCBjbGFpbSBubyBwcmlvcml0eSBkYXRlIGVhcmxpZXIgdGhhbiBKdWx5IDI5LCAxOTk0CisgKiAoYW5kIGFkZGl0aW9uYWxseSBmYWlsIHRvIGNpdGUgdGhlIEVVUk9DUllQVCAnOTIgcHVibGljYXRpb24gYXMgcHJpb3IgYXJ0KS4KKyAqLworaW50IGVjX0dGMm1fc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LAorCWNvbnN0IEJJR05VTSAqeF8sIGludCB5X2JpdCwgQk5fQ1RYICpjdHgpCisJeworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICp0bXAsICp4LCAqeSwgKno7CisJaW50IHJldCA9IDAsIHowOworCisJLyogY2xlYXIgZXJyb3IgcXVldWUgKi8KKwlFUlJfY2xlYXJfZXJyb3IoKTsKKworCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJeV9iaXQgPSAoeV9iaXQgIT0gMCkgPyAxIDogMDsKKworCUJOX0NUWF9zdGFydChjdHgpOworCXRtcCA9IEJOX0NUWF9nZXQoY3R4KTsKKwl4ID0gQk5fQ1RYX2dldChjdHgpOworCXkgPSBCTl9DVFhfZ2V0KGN0eCk7CisJeiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoeiA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICghQk5fR0YybV9tb2RfYXJyKHgsIHhfLCBncm91cC0+cG9seSkpIGdvdG8gZXJyOworCWlmIChCTl9pc196ZXJvKHgpKQorCQl7CisJCWlmICghQk5fR0YybV9tb2Rfc3FydF9hcnIoeSwgJmdyb3VwLT5iLCBncm91cC0+cG9seSwgY3R4KSkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfc3FyKGdyb3VwLCB0bXAsIHgsIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kaXYoZ3JvdXAsIHRtcCwgJmdyb3VwLT5iLCB0bXAsIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX0dGMm1fYWRkKHRtcCwgJmdyb3VwLT5hLCB0bXApKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9HRjJtX2FkZCh0bXAsIHgsIHRtcCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyKHosIHRtcCwgZ3JvdXAtPnBvbHksIGN0eCkpCisJCQl7CisJCQl1bnNpZ25lZCBsb25nIGVyciA9IEVSUl9wZWVrX2xhc3RfZXJyb3IoKTsKKwkJCQorCQkJaWYgKEVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9CTiAmJiBFUlJfR0VUX1JFQVNPTihlcnIpID09IEJOX1JfTk9fU09MVVRJT04pCisJCQkJeworCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfU0VUX0NPTVBSRVNTRURfQ09PUkRJTkFURVMsIEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UKTsKKwkJCQl9CisJCQllbHNlCisJCQkJRUNlcnIoRUNfRl9FQ19HRjJNX1NJTVBMRV9TRVRfQ09NUFJFU1NFRF9DT09SRElOQVRFUywgRVJSX1JfQk5fTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl6MCA9IChCTl9pc19vZGQoeikpID8gMSA6IDA7CisJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgeSwgeCwgeiwgY3R4KSkgZ290byBlcnI7CisJCWlmICh6MCAhPSB5X2JpdCkKKwkJCXsKKwkJCWlmICghQk5fR0YybV9hZGQoeSwgeSwgeCkpIGdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAoIUVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybShncm91cCwgcG9pbnQsIHgsIHksIGN0eCkpIGdvdG8gZXJyOworCisJcmV0ID0gMTsKKworIGVycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJaWYgKG5ld19jdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogQ29udmVydHMgYW4gRUNfUE9JTlQgdG8gYW4gb2N0ZXQgc3RyaW5nLiAgCisgKiBJZiBidWYgaXMgTlVMTCwgdGhlIGVuY29kZWQgbGVuZ3RoIHdpbGwgYmUgcmV0dXJuZWQuCisgKiBJZiB0aGUgbGVuZ3RoIGxlbiBvZiBidWYgaXMgc21hbGxlciB0aGFuIHJlcXVpcmVkIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK3NpemVfdCBlY19HRjJtX3NpbXBsZV9wb2ludDJvY3QoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQsIHBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm0sCisJdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKmN0eCkKKwl7CisJc2l6ZV90IHJldDsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCWludCB1c2VkX2N0eCA9IDA7CisJQklHTlVNICp4LCAqeSwgKnl4aTsKKwlzaXplX3QgZmllbGRfbGVuLCBpLCBza2lwOworCisJaWYgKChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCkKKwkJJiYgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpCisJCSYmIChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fSFlCUklEKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dGMk1fU0lNUExFX1BPSU5UMk9DVCwgRUNfUl9JTlZBTElEX0ZPUk0pOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpCisJCXsKKwkJLyogZW5jb2RlcyB0byBhIHNpbmdsZSAwIG9jdGV0ICovCisJCWlmIChidWYgIT0gTlVMTCkKKwkJCXsKKwkJCWlmIChsZW4gPCAxKQorCQkJCXsKKwkJCQlFQ2VycihFQ19GX0VDX0dGMk1fU0lNUExFX1BPSU5UMk9DVCwgRUNfUl9CVUZGRVJfVE9PX1NNQUxMKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlidWZbMF0gPSAwOworCQkJfQorCQlyZXR1cm4gMTsKKwkJfQorCisKKwkvKiByZXQgOj0gcmVxdWlyZWQgb3V0cHV0IGJ1ZmZlciBsZW5ndGggKi8KKwlmaWVsZF9sZW4gPSAoRUNfR1JPVVBfZ2V0X2RlZ3JlZShncm91cCkgKyA3KSAvIDg7CisJcmV0ID0gKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKSA/IDEgKyBmaWVsZF9sZW4gOiAxICsgMipmaWVsZF9sZW47CisKKwkvKiBpZiAnYnVmJyBpcyBOVUxMLCBqdXN0IHJldHVybiByZXF1aXJlZCBsZW5ndGggKi8KKwlpZiAoYnVmICE9IE5VTEwpCisJCXsKKwkJaWYgKGxlbiA8IHJldCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlQyT0NULCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJeworCQkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJCWlmIChjdHggPT0gTlVMTCkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQlCTl9DVFhfc3RhcnQoY3R4KTsKKwkJdXNlZF9jdHggPSAxOworCQl4ID0gQk5fQ1RYX2dldChjdHgpOworCQl5ID0gQk5fQ1RYX2dldChjdHgpOworCQl5eGkgPSBCTl9DVFhfZ2V0KGN0eCk7CisJCWlmICh5eGkgPT0gTlVMTCkgZ290byBlcnI7CisKKwkJaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0oZ3JvdXAsIHBvaW50LCB4LCB5LCBjdHgpKSBnb3RvIGVycjsKKworCQlidWZbMF0gPSBmb3JtOworCQlpZiAoKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpICYmICFCTl9pc196ZXJvKHgpKQorCQkJeworCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZGl2KGdyb3VwLCB5eGksIHksIHgsIGN0eCkpIGdvdG8gZXJyOworCQkJaWYgKEJOX2lzX29kZCh5eGkpKSBidWZbMF0rKzsKKwkJCX0KKworCQlpID0gMTsKKwkJCisJCXNraXAgPSBmaWVsZF9sZW4gLSBCTl9udW1fYnl0ZXMoeCk7CisJCWlmIChza2lwID4gZmllbGRfbGVuKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19HRjJNX1NJTVBMRV9QT0lOVDJPQ1QsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl3aGlsZSAoc2tpcCA+IDApCisJCQl7CisJCQlidWZbaSsrXSA9IDA7CisJCQlza2lwLS07CisJCQl9CisJCXNraXAgPSBCTl9ibjJiaW4oeCwgYnVmICsgaSk7CisJCWkgKz0gc2tpcDsKKwkJaWYgKGkgIT0gMSArIGZpZWxkX2xlbikKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlQyT0NULCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlpZiAoZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCB8fCBmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fSFlCUklEKQorCQkJeworCQkJc2tpcCA9IGZpZWxkX2xlbiAtIEJOX251bV9ieXRlcyh5KTsKKwkJCWlmIChza2lwID4gZmllbGRfbGVuKQorCQkJCXsKKwkJCQlFQ2VycihFQ19GX0VDX0dGMk1fU0lNUExFX1BPSU5UMk9DVCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXdoaWxlIChza2lwID4gMCkKKwkJCQl7CisJCQkJYnVmW2krK10gPSAwOworCQkJCXNraXAtLTsKKwkJCQl9CisJCQlza2lwID0gQk5fYm4yYmluKHksIGJ1ZiArIGkpOworCQkJaSArPSBza2lwOworCQkJfQorCisJCWlmIChpICE9IHJldCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlQyT0NULCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQorCWlmICh1c2VkX2N0eCkKKwkJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisKKyBlcnI6CisJaWYgKHVzZWRfY3R4KQorCQlCTl9DVFhfZW5kKGN0eCk7CisJaWYgKG5ld19jdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIDA7CisJfQorCisKKy8qIENvbnZlcnRzIGFuIG9jdGV0IHN0cmluZyByZXByZXNlbnRhdGlvbiB0byBhbiBFQ19QT0lOVC4gCisgKiBOb3RlIHRoYXQgdGhlIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHVzZXMgYWZmaW5lIGNvb3JkaW5hdGVzLgorICovCitpbnQgZWNfR0YybV9zaW1wbGVfb2N0MnBvaW50KGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgQk5fQ1RYICpjdHgpCisJeworCXBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm07CisJaW50IHlfYml0OworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICp4LCAqeSwgKnl4aTsKKwlzaXplX3QgZmllbGRfbGVuLCBlbmNfbGVuOworCWludCByZXQgPSAwOworCisJaWYgKGxlbiA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfT0NUMlBPSU5ULCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOworCQlyZXR1cm4gMDsKKwkJfQorCWZvcm0gPSBidWZbMF07CisJeV9iaXQgPSBmb3JtICYgMTsKKwlmb3JtID0gZm9ybSAmIH4xVTsKKwlpZiAoKGZvcm0gIT0gMCkJJiYgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKQorCQkmJiAoZm9ybSAhPSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCkKKwkJJiYgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfT0NUMlBPSU5ULCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmICgoZm9ybSA9PSAwIHx8IGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpICYmIHlfYml0KQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfT0NUMlBPSU5ULCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKGZvcm0gPT0gMCkKKwkJeworCQlpZiAobGVuICE9IDEpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0dGMk1fU0lNUExFX09DVDJQT0lOVCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKwkJCXJldHVybiAwOworCQkJfQorCisJCXJldHVybiBFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkoZ3JvdXAsIHBvaW50KTsKKwkJfQorCQorCWZpZWxkX2xlbiA9IChFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSArIDcpIC8gODsKKwllbmNfbGVuID0gKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKSA/IDEgKyBmaWVsZF9sZW4gOiAxICsgMipmaWVsZF9sZW47CisKKwlpZiAobGVuICE9IGVuY19sZW4pCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HRjJNX1NJTVBMRV9PQ1QyUE9JTlQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCXggPSBCTl9DVFhfZ2V0KGN0eCk7CisJeSA9IEJOX0NUWF9nZXQoY3R4KTsKKwl5eGkgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHl4aSA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICghQk5fYmluMmJuKGJ1ZiArIDEsIGZpZWxkX2xlbiwgeCkpIGdvdG8gZXJyOworCWlmIChCTl91Y21wKHgsICZncm91cC0+ZmllbGQpID49IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HRjJNX1NJTVBMRV9PQ1QyUE9JTlQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQpCisJCXsKKwkJaWYgKCFFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBwb2ludCwgeCwgeV9iaXQsIGN0eCkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghQk5fYmluMmJuKGJ1ZiArIDEgKyBmaWVsZF9sZW4sIGZpZWxkX2xlbiwgeSkpIGdvdG8gZXJyOworCQlpZiAoQk5fdWNtcCh5LCAmZ3JvdXAtPmZpZWxkKSA+PSAwKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19HRjJNX1NJTVBMRV9PQ1QyUE9JTlQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQpCisJCQl7CisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kaXYoZ3JvdXAsIHl4aSwgeSwgeCwgY3R4KSkgZ290byBlcnI7CisJCQlpZiAoeV9iaXQgIT0gQk5faXNfb2RkKHl4aSkpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfR0YyTV9TSU1QTEVfT0NUMlBPSU5ULCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKworCQlpZiAoIUVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybShncm91cCwgcG9pbnQsIHgsIHksIGN0eCkpIGdvdG8gZXJyOworCQl9CisJCisJaWYgKCFFQ19QT0lOVF9pc19vbl9jdXJ2ZShncm91cCwgcG9pbnQsIGN0eCkpIC8qIHRlc3QgcmVxdWlyZWQgYnkgWDkuNjIgKi8KKwkJeworCQlFQ2VycihFQ19GX0VDX0dGMk1fU0lNUExFX09DVDJQT0lOVCwgRUNfUl9QT0lOVF9JU19OT1RfT05fQ1VSVkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJcmV0ID0gMTsKKwkKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKKy8qIENvbXB1dGVzIGEgKyBiIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiByLiAgciBjb3VsZCBiZSBhIG9yIGIsIGEgY291bGQgYmUgYi4KKyAqIFVzZXMgYWxnb3JpdGhtIEEuMTAuMiBvZiBJRUVFIFAxMzYzLgorICovCitpbnQgZWNfR0YybV9zaW1wbGVfYWRkKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICpjdHgpCisJeworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICp4MCwgKnkwLCAqeDEsICp5MSwgKngyLCAqeTIsICpzLCAqdDsKKwlpbnQgcmV0ID0gMDsKKwkKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGEpKQorCQl7CisJCWlmICghRUNfUE9JTlRfY29weShyLCBiKSkgcmV0dXJuIDA7CisJCXJldHVybiAxOworCQl9CisKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGIpKQorCQl7CisJCWlmICghRUNfUE9JTlRfY29weShyLCBhKSkgcmV0dXJuIDA7CisJCXJldHVybiAxOworCQl9CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCXgwID0gQk5fQ1RYX2dldChjdHgpOworCXkwID0gQk5fQ1RYX2dldChjdHgpOworCXgxID0gQk5fQ1RYX2dldChjdHgpOworCXkxID0gQk5fQ1RYX2dldChjdHgpOworCXgyID0gQk5fQ1RYX2dldChjdHgpOworCXkyID0gQk5fQ1RYX2dldChjdHgpOworCXMgPSBCTl9DVFhfZ2V0KGN0eCk7CisJdCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAodCA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmIChhLT5aX2lzX29uZSkgCisJCXsKKwkJaWYgKCFCTl9jb3B5KHgwLCAmYS0+WCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX2NvcHkoeTAsICZhLT5ZKSkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0oZ3JvdXAsIGEsIHgwLCB5MCwgY3R4KSkgZ290byBlcnI7CisJCX0KKwlpZiAoYi0+Wl9pc19vbmUpIAorCQl7CisJCWlmICghQk5fY29weSh4MSwgJmItPlgpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9jb3B5KHkxLCAmYi0+WSkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBiLCB4MSwgeTEsIGN0eCkpIGdvdG8gZXJyOworCQl9CisKKworCWlmIChCTl9HRjJtX2NtcCh4MCwgeDEpKQorCQl7CisJCWlmICghQk5fR0YybV9hZGQodCwgeDAsIHgxKSkgZ290byBlcnI7CisJCWlmICghQk5fR0YybV9hZGQocywgeTAsIHkxKSkgZ290byBlcnI7CisJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2Rpdihncm91cCwgcywgcywgdCwgY3R4KSkgZ290byBlcnI7CisJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX3Nxcihncm91cCwgeDIsIHMsIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX0dGMm1fYWRkKHgyLCB4MiwgJmdyb3VwLT5hKSkgZ290byBlcnI7CisJCWlmICghQk5fR0YybV9hZGQoeDIsIHgyLCBzKSkgZ290byBlcnI7CisJCWlmICghQk5fR0YybV9hZGQoeDIsIHgyLCB0KSkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEJOX0dGMm1fY21wKHkwLCB5MSkgfHwgQk5faXNfemVybyh4MSkpCisJCQl7CisJCQlpZiAoIUVDX1BPSU5UX3NldF90b19pbmZpbml0eShncm91cCwgcikpIGdvdG8gZXJyOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kaXYoZ3JvdXAsIHMsIHkxLCB4MSwgY3R4KSkgZ290byBlcnI7CisJCWlmICghQk5fR0YybV9hZGQocywgcywgeDEpKSBnb3RvIGVycjsKKwkJCisJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX3Nxcihncm91cCwgeDIsIHMsIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX0dGMm1fYWRkKHgyLCB4MiwgcykpIGdvdG8gZXJyOworCQlpZiAoIUJOX0dGMm1fYWRkKHgyLCB4MiwgJmdyb3VwLT5hKSkgZ290byBlcnI7CisJCX0KKworCWlmICghQk5fR0YybV9hZGQoeTIsIHgxLCB4MikpIGdvdG8gZXJyOworCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgeTIsIHkyLCBzLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIUJOX0dGMm1fYWRkKHkyLCB5MiwgeDIpKSBnb3RvIGVycjsKKwlpZiAoIUJOX0dGMm1fYWRkKHkyLCB5MiwgeTEpKSBnb3RvIGVycjsKKworCWlmICghRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCByLCB4MiwgeTIsIGN0eCkpIGdvdG8gZXJyOworCisJcmV0ID0gMTsKKworIGVycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJaWYgKG5ld19jdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogQ29tcHV0ZXMgMiAqIGEgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHIuICByIGNvdWxkIGJlIGEuCisgKiBVc2VzIGFsZ29yaXRobSBBLjEwLjIgb2YgSUVFRSBQMTM2My4KKyAqLworaW50IGVjX0dGMm1fc2ltcGxlX2RibChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwgQk5fQ1RYICpjdHgpCisJeworCXJldHVybiBlY19HRjJtX3NpbXBsZV9hZGQoZ3JvdXAsIHIsIGEsIGEsIGN0eCk7CisJfQorCisKK2ludCBlY19HRjJtX3NpbXBsZV9pbnZlcnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIHBvaW50KSB8fCBCTl9pc196ZXJvKCZwb2ludC0+WSkpCisJCS8qIHBvaW50IGlzIGl0cyBvd24gaW52ZXJzZSAqLworCQlyZXR1cm4gMTsKKwkKKwlpZiAoIUVDX1BPSU5UX21ha2VfYWZmaW5lKGdyb3VwLCBwb2ludCwgY3R4KSkgcmV0dXJuIDA7CisJcmV0dXJuIEJOX0dGMm1fYWRkKCZwb2ludC0+WSwgJnBvaW50LT5YLCAmcG9pbnQtPlkpOworCX0KKworCisvKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4gcG9pbnQgaXMgdGhlIHBvaW50IGF0IGluZmluaXR5LiAqLworaW50IGVjX0dGMm1fc2ltcGxlX2lzX2F0X2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50KQorCXsKKwlyZXR1cm4gQk5faXNfemVybygmcG9pbnQtPlopOworCX0KKworCisvKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIEVDX1BPSU5UIGlzIGFuIGFjdHVhbCBwb2ludCBvbiB0aGUgY3VydmUgZGVmaW5lZAorICogaW4gdGhlIEVDX0dST1VQLiAgQSBwb2ludCBpcyB2YWxpZCBpZiBpdCBzYXRpc2ZpZXMgdGhlIFdlaWVyc3RyYXNzIGVxdWF0aW9uOgorICogICAgICB5XjIgKyB4KnkgPSB4XjMgKyBhKnheMiArIGIuCisgKi8KK2ludCBlY19HRjJtX3NpbXBsZV9pc19vbl9jdXJ2ZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQgPSAtMTsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCUJJR05VTSAqbGgsICp5MjsKKwlpbnQgKCpmaWVsZF9tdWwpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgY29uc3QgQklHTlVNICosIEJOX0NUWCAqKTsKKwlpbnQgKCpmaWVsZF9zcXIpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgQk5fQ1RYICopOworCisJaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpCisJCXJldHVybiAxOworCisJZmllbGRfbXVsID0gZ3JvdXAtPm1ldGgtPmZpZWxkX211bDsKKwlmaWVsZF9zcXIgPSBncm91cC0+bWV0aC0+ZmllbGRfc3FyOwkKKworCS8qIG9ubHkgc3VwcG9ydCBhZmZpbmUgY29vcmRpbmF0ZXMgKi8KKwlpZiAoIXBvaW50LT5aX2lzX29uZSkgZ290byBlcnI7CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwl5MiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlsaCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAobGggPT0gTlVMTCkgZ290byBlcnI7CisKKwkvKiBXZSBoYXZlIGEgY3VydmUgZGVmaW5lZCBieSBhIFdlaWVyc3RyYXNzIGVxdWF0aW9uCisJICogICAgICB5XjIgKyB4KnkgPSB4XjMgKyBhKnheMiArIGIuCisJICogIDw9PiB4XjMgKyBhKnheMiArIHgqeSArIGIgKyB5XjIgPSAwCisJICogIDw9PiAoKHggKyBhKSAqIHggKyB5ICkgKiB4ICsgYiArIHleMiA9IDAKKwkgKi8KKwlpZiAoIUJOX0dGMm1fYWRkKGxoLCAmcG9pbnQtPlgsICZncm91cC0+YSkpIGdvdG8gZXJyOworCWlmICghZmllbGRfbXVsKGdyb3VwLCBsaCwgbGgsICZwb2ludC0+WCwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9HRjJtX2FkZChsaCwgbGgsICZwb2ludC0+WSkpIGdvdG8gZXJyOworCWlmICghZmllbGRfbXVsKGdyb3VwLCBsaCwgbGgsICZwb2ludC0+WCwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9HRjJtX2FkZChsaCwgbGgsICZncm91cC0+YikpIGdvdG8gZXJyOworCWlmICghZmllbGRfc3FyKGdyb3VwLCB5MiwgJnBvaW50LT5ZLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIUJOX0dGMm1fYWRkKGxoLCBsaCwgeTIpKSBnb3RvIGVycjsKKwlyZXQgPSBCTl9pc196ZXJvKGxoKTsKKyBlcnI6CisJaWYgKGN0eCkgQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4KSBCTl9DVFhfZnJlZShuZXdfY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworCisvKiBJbmRpY2F0ZXMgd2hldGhlciB0d28gcG9pbnRzIGFyZSBlcXVhbC4KKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgLTEgICBlcnJvcgorICogICAwICAgZXF1YWwgKGluIGFmZmluZSBjb29yZGluYXRlcykKKyAqICAgMSAgIG5vdCBlcXVhbAorICovCitpbnQgZWNfR0YybV9zaW1wbGVfY21wKGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKmEsIGNvbnN0IEVDX1BPSU5UICpiLCBCTl9DVFggKmN0eCkKKwl7CisJQklHTlVNICphWCwgKmFZLCAqYlgsICpiWTsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCWludCByZXQgPSAtMTsKKworCWlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgYSkpCisJCXsKKwkJcmV0dXJuIEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBiKSA/IDAgOiAxOworCQl9CisJCisJaWYgKGEtPlpfaXNfb25lICYmIGItPlpfaXNfb25lKQorCQl7CisJCXJldHVybiAoKEJOX2NtcCgmYS0+WCwgJmItPlgpID09IDApICYmIEJOX2NtcCgmYS0+WSwgJmItPlkpID09IDApID8gMCA6IDE7CisJCX0KKworCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCWFYID0gQk5fQ1RYX2dldChjdHgpOworCWFZID0gQk5fQ1RYX2dldChjdHgpOworCWJYID0gQk5fQ1RYX2dldChjdHgpOworCWJZID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChiWSA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBhLCBhWCwgYVksIGN0eCkpIGdvdG8gZXJyOworCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBiLCBiWCwgYlksIGN0eCkpIGdvdG8gZXJyOworCXJldCA9ICgoQk5fY21wKGFYLCBiWCkgPT0gMCkgJiYgQk5fY21wKGFZLCBiWSkgPT0gMCkgPyAwIDogMTsKKworICBlcnI6CQorCWlmIChjdHgpIEJOX0NUWF9lbmQoY3R4KTsKKwlpZiAobmV3X2N0eCkgQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogRm9yY2VzIHRoZSBnaXZlbiBFQ19QT0lOVCB0byBpbnRlcm5hbGx5IHVzZSBhZmZpbmUgY29vcmRpbmF0ZXMuICovCitpbnQgZWNfR0YybV9zaW1wbGVfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KQorCXsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCUJJR05VTSAqeCwgKnk7CisJaW50IHJldCA9IDA7CisKKwlpZiAocG9pbnQtPlpfaXNfb25lIHx8IEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpCisJCXJldHVybiAxOworCQorCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJeCA9IEJOX0NUWF9nZXQoY3R4KTsKKwl5ID0gQk5fQ1RYX2dldChjdHgpOworCWlmICh5ID09IE5VTEwpIGdvdG8gZXJyOworCQorCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9jb3B5KCZwb2ludC0+WCwgeCkpIGdvdG8gZXJyOworCWlmICghQk5fY29weSgmcG9pbnQtPlksIHkpKSBnb3RvIGVycjsKKwlpZiAoIUJOX29uZSgmcG9pbnQtPlopKSBnb3RvIGVycjsKKwkKKwlyZXQgPSAxOwkJCisKKyAgZXJyOgorCWlmIChjdHgpIEJOX0NUWF9lbmQoY3R4KTsKKwlpZiAobmV3X2N0eCkgQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogRm9yY2VzIGVhY2ggb2YgdGhlIEVDX1BPSU5UcyBpbiB0aGUgZ2l2ZW4gYXJyYXkgdG8gdXNlIGFmZmluZSBjb29yZGluYXRlcy4gKi8KK2ludCBlY19HRjJtX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBzaXplX3QgbnVtLCBFQ19QT0lOVCAqcG9pbnRzW10sIEJOX0NUWCAqY3R4KQorCXsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJeworCQlpZiAoIWdyb3VwLT5tZXRoLT5tYWtlX2FmZmluZShncm91cCwgcG9pbnRzW2ldLCBjdHgpKSByZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIDE7CisJfQorCisKKy8qIFdyYXBwZXIgdG8gc2ltcGxlIGJpbmFyeSBwb2x5bm9taWFsIGZpZWxkIG11bHRpcGxpY2F0aW9uIGltcGxlbWVudGF0aW9uLiAqLworaW50IGVjX0dGMm1fc2ltcGxlX2ZpZWxkX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gQk5fR0YybV9tb2RfbXVsX2FycihyLCBhLCBiLCBncm91cC0+cG9seSwgY3R4KTsKKwl9CisKKworLyogV3JhcHBlciB0byBzaW1wbGUgYmluYXJ5IHBvbHlub21pYWwgZmllbGQgc3F1YXJpbmcgaW1wbGVtZW50YXRpb24uICovCitpbnQgZWNfR0YybV9zaW1wbGVfZmllbGRfc3FyKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIEJOX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gQk5fR0YybV9tb2Rfc3FyX2FycihyLCBhLCBncm91cC0+cG9seSwgY3R4KTsKKwl9CisKKworLyogV3JhcHBlciB0byBzaW1wbGUgYmluYXJ5IHBvbHlub21pYWwgZmllbGQgZGl2aXNpb24gaW1wbGVtZW50YXRpb24uICovCitpbnQgZWNfR0YybV9zaW1wbGVfZmllbGRfZGl2KGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpCisJeworCXJldHVybiBCTl9HRjJtX21vZF9kaXYociwgYSwgYiwgJmdyb3VwLT5maWVsZCwgY3R4KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfYW1ldGguYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19hbWV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMGY3ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfYW1ldGguYwpAQCAtMCwwICsxLDY1OSBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0NNUworI2luY2x1ZGUgPG9wZW5zc2wvY21zLmg+CisjZW5kaWYKKyNpbmNsdWRlICJhc24xX2xvY2wuaCIKKworc3RhdGljIGludCBlY2tleV9wYXJhbTJ0eXBlKGludCAqcHB0eXBlLCB2b2lkICoqcHB2YWwsIEVDX0tFWSAqZWNfa2V5KQorCXsKKwljb25zdCBFQ19HUk9VUCAgKmdyb3VwOworCWludCBuaWQ7CisJaWYgKGVjX2tleSA9PSBOVUxMIHx8IChncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVjX2tleSkpID09IE5VTEwpIAorCXsKKwkJRUNlcnIoRUNfRl9FQ0tFWV9QQVJBTTJUWVBFLCBFQ19SX01JU1NJTkdfUEFSQU1FVEVSUyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoRUNfR1JPVVBfZ2V0X2FzbjFfZmxhZyhncm91cCkKKyAgICAgICAgICAgICAgICAgICAgICYmIChuaWQgPSBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZShncm91cCkpKQorCQkvKiB3ZSBoYXZlIGEgJ25hbWVkIGN1cnZlJyA9PiBqdXN0IHNldCB0aGUgT0lEICovCisJCXsKKwkJKnBwdmFsID0gT0JKX25pZDJvYmoobmlkKTsKKwkJKnBwdHlwZSA9IFZfQVNOMV9PQkpFQ1Q7CisJCX0KKwllbHNlCS8qIGV4cGxpY2l0IHBhcmFtZXRlcnMgKi8KKwkJeworCQlBU04xX1NUUklORyAqcHN0ciA9IE5VTEw7CisJCXBzdHIgPSBBU04xX1NUUklOR19uZXcoKTsKKwkJaWYgKCFwc3RyKQorCQkJcmV0dXJuIDA7CisJCXBzdHItPmxlbmd0aCA9IGkyZF9FQ1BhcmFtZXRlcnMoZWNfa2V5LCAmcHN0ci0+ZGF0YSk7CisJCWlmIChwc3RyLT5sZW5ndGggPCAwKQorCQkJeworCQkJQVNOMV9TVFJJTkdfZnJlZShwc3RyKTsKKwkJCUVDZXJyKEVDX0ZfRUNLRVlfUEFSQU0yVFlQRSwgRVJSX1JfRUNfTElCKTsKKwkJCXJldHVybiAwOworCQkJfQorCQkqcHB2YWwgPSBwc3RyOworCQkqcHB0eXBlID0gVl9BU04xX1NFUVVFTkNFOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGVja2V5X3B1Yl9lbmNvZGUoWDUwOV9QVUJLRVkgKnBrLCBjb25zdCBFVlBfUEtFWSAqcGtleSkKKwl7CisJRUNfS0VZICplY19rZXkgPSBwa2V5LT5wa2V5LmVjOworCXZvaWQgKnB2YWwgPSBOVUxMOworCWludCBwdHlwZTsKKwl1bnNpZ25lZCBjaGFyICpwZW5jID0gTlVMTCwgKnA7CisJaW50IHBlbmNsZW47CisKKwlpZiAoIWVja2V5X3BhcmFtMnR5cGUoJnB0eXBlLCAmcHZhbCwgZWNfa2V5KSkKKwkJeworCQlFQ2VycihFQ19GX0VDS0VZX1BVQl9FTkNPREUsIEVSUl9SX0VDX0xJQik7CisJCXJldHVybiAwOworCQl9CisJcGVuY2xlbiA9IGkyb19FQ1B1YmxpY0tleShlY19rZXksIE5VTEwpOworCWlmIChwZW5jbGVuIDw9IDApCisJCWdvdG8gZXJyOworCXBlbmMgPSBPUEVOU1NMX21hbGxvYyhwZW5jbGVuKTsKKwlpZiAoIXBlbmMpCisJCWdvdG8gZXJyOworCXAgPSBwZW5jOworCXBlbmNsZW4gPSBpMm9fRUNQdWJsaWNLZXkoZWNfa2V5LCAmcCk7CisJaWYgKHBlbmNsZW4gPD0gMCkKKwkJZ290byBlcnI7CisJaWYgKFg1MDlfUFVCS0VZX3NldDBfcGFyYW0ocGssIE9CSl9uaWQyb2JqKEVWUF9QS0VZX0VDKSwKKwkJCQlwdHlwZSwgcHZhbCwgcGVuYywgcGVuY2xlbikpCisJCXJldHVybiAxOworCWVycjoKKwlpZiAocHR5cGUgPT0gVl9BU04xX09CSkVDVCkKKwkJQVNOMV9PQkpFQ1RfZnJlZShwdmFsKTsKKwllbHNlCisJCUFTTjFfU1RSSU5HX2ZyZWUocHZhbCk7CisJaWYgKHBlbmMpCisJCU9QRU5TU0xfZnJlZShwZW5jKTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBFQ19LRVkgKmVja2V5X3R5cGUycGFyYW0oaW50IHB0eXBlLCB2b2lkICpwdmFsKQorCXsKKwlFQ19LRVkgKmVja2V5ID0gTlVMTDsKKwlpZiAocHR5cGUgPT0gVl9BU04xX1NFUVVFTkNFKQorCQl7CisJCUFTTjFfU1RSSU5HICpwc3RyID0gcHZhbDsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqcG0gPSBOVUxMOworCQlpbnQgcG1sZW47CisJCXBtID0gcHN0ci0+ZGF0YTsKKwkJcG1sZW4gPSBwc3RyLT5sZW5ndGg7CisJCWlmICghKGVja2V5ID0gZDJpX0VDUGFyYW1ldGVycyhOVUxMLCAmcG0sIHBtbGVuKSkpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDS0VZX1RZUEUyUEFSQU0sIEVDX1JfREVDT0RFX0VSUk9SKTsKKwkJCWdvdG8gZWNlcnI7CisJCQl9CisJCX0KKwllbHNlIGlmIChwdHlwZSA9PSBWX0FTTjFfT0JKRUNUKQorCQl7CisJCUFTTjFfT0JKRUNUICpwb2lkID0gcHZhbDsKKwkJRUNfR1JPVVAgKmdyb3VwOworCisJCS8qIHR5cGUgPT0gVl9BU04xX09CSkVDVCA9PiB0aGUgcGFyYW1ldGVycyBhcmUgZ2l2ZW4KKwkJICogYnkgYW4gYXNuMSBPSUQKKwkJICovCisJCWlmICgoZWNrZXkgPSBFQ19LRVlfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDS0VZX1RZUEUyUEFSQU0sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZWNlcnI7CisJCQl9CisJCWdyb3VwID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoT0JKX29iajJuaWQocG9pZCkpOworCQlpZiAoZ3JvdXAgPT0gTlVMTCkKKwkJCWdvdG8gZWNlcnI7CisJCUVDX0dST1VQX3NldF9hc24xX2ZsYWcoZ3JvdXAsIE9QRU5TU0xfRUNfTkFNRURfQ1VSVkUpOworCQlpZiAoRUNfS0VZX3NldF9ncm91cChlY2tleSwgZ3JvdXApID09IDApCisJCQlnb3RvIGVjZXJyOworCQlFQ19HUk9VUF9mcmVlKGdyb3VwKTsKKwkJfQorCWVsc2UKKwkJeworCQlFQ2VycihFQ19GX0VDS0VZX1RZUEUyUEFSQU0sIEVDX1JfREVDT0RFX0VSUk9SKTsKKwkJZ290byBlY2VycjsKKwkJfQorCisJcmV0dXJuIGVja2V5OworCisJZWNlcnI6CisJaWYgKGVja2V5KQorCQlFQ19LRVlfZnJlZShlY2tleSk7CisJcmV0dXJuIE5VTEw7CisJfQorCitzdGF0aWMgaW50IGVja2V5X3B1Yl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIFg1MDlfUFVCS0VZICpwdWJrZXkpCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBOVUxMOworCXZvaWQgKnB2YWw7CisJaW50IHB0eXBlLCBwa2xlbjsKKwlFQ19LRVkgKmVja2V5ID0gTlVMTDsKKwlYNTA5X0FMR09SICpwYWxnOworCisJaWYgKCFYNTA5X1BVQktFWV9nZXQwX3BhcmFtKE5VTEwsICZwLCAmcGtsZW4sICZwYWxnLCBwdWJrZXkpKQorCQlyZXR1cm4gMDsKKwlYNTA5X0FMR09SX2dldDAoTlVMTCwgJnB0eXBlLCAmcHZhbCwgcGFsZyk7CisKKwllY2tleSA9IGVja2V5X3R5cGUycGFyYW0ocHR5cGUsIHB2YWwpOworCisJaWYgKCFlY2tleSkKKwkJeworCQlFQ2VycihFQ19GX0VDS0VZX1BVQl9ERUNPREUsIEVSUl9SX0VDX0xJQik7CisJCXJldHVybiAwOworCQl9CisKKwkvKiBXZSBoYXZlIHBhcmFtZXRlcnMgbm93IHNldCBwdWJsaWMga2V5ICovCisJaWYgKCFvMmlfRUNQdWJsaWNLZXkoJmVja2V5LCAmcCwgcGtsZW4pKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNLRVlfUFVCX0RFQ09ERSwgRUNfUl9ERUNPREVfRVJST1IpOworCQlnb3RvIGVjZXJyOworCQl9CisKKwlFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVja2V5KTsKKwlyZXR1cm4gMTsKKworCWVjZXJyOgorCWlmIChlY2tleSkKKwkJRUNfS0VZX2ZyZWUoZWNrZXkpOworCXJldHVybiAwOworCX0KKworc3RhdGljIGludCBlY2tleV9wdWJfY21wKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYikKKwl7CisJaW50ICByOworCWNvbnN0IEVDX0dST1VQICpncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGItPnBrZXkuZWMpOworCWNvbnN0IEVDX1BPSU5UICpwYSA9IEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoYS0+cGtleS5lYyksCisJICAgICAgICAgICAgICAgKnBiID0gRUNfS0VZX2dldDBfcHVibGljX2tleShiLT5wa2V5LmVjKTsKKwlyID0gRUNfUE9JTlRfY21wKGdyb3VwLCBwYSwgcGIsIE5VTEwpOworCWlmIChyID09IDApCisJCXJldHVybiAxOworCWlmIChyID09IDEpCisJCXJldHVybiAwOworCXJldHVybiAtMjsKKwl9CisKK3N0YXRpYyBpbnQgZWNrZXlfcHJpdl9kZWNvZGUoRVZQX1BLRVkgKnBrZXksIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gTlVMTDsKKwl2b2lkICpwdmFsOworCWludCBwdHlwZSwgcGtsZW47CisJRUNfS0VZICplY2tleSA9IE5VTEw7CisJWDUwOV9BTEdPUiAqcGFsZzsKKworCWlmICghUEtDUzhfcGtleV9nZXQwKE5VTEwsICZwLCAmcGtsZW4sICZwYWxnLCBwOCkpCisJCXJldHVybiAwOworCVg1MDlfQUxHT1JfZ2V0MChOVUxMLCAmcHR5cGUsICZwdmFsLCBwYWxnKTsKKworCWVja2V5ID0gZWNrZXlfdHlwZTJwYXJhbShwdHlwZSwgcHZhbCk7CisKKwlpZiAoIWVja2V5KQorCQlnb3RvIGVjbGliZXJyOworCisJLyogV2UgaGF2ZSBwYXJhbWV0ZXJzIG5vdyBzZXQgcHJpdmF0ZSBrZXkgKi8KKwlpZiAoIWQyaV9FQ1ByaXZhdGVLZXkoJmVja2V5LCAmcCwgcGtsZW4pKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNLRVlfUFJJVl9ERUNPREUsIEVDX1JfREVDT0RFX0VSUk9SKTsKKwkJZ290byBlY2VycjsKKwkJfQorCisJLyogY2FsY3VsYXRlIHB1YmxpYyBrZXkgKGlmIG5lY2Vzc2FyeSkgKi8KKwlpZiAoRUNfS0VZX2dldDBfcHVibGljX2tleShlY2tleSkgPT0gTlVMTCkKKwkJeworCQljb25zdCBCSUdOVU0gKnByaXZfa2V5OworCQljb25zdCBFQ19HUk9VUCAqZ3JvdXA7CisJCUVDX1BPSU5UICpwdWJfa2V5OworCQkvKiB0aGUgcHVibGljIGtleSB3YXMgbm90IGluY2x1ZGVkIGluIHRoZSBTRUMxIHByaXZhdGUKKwkJICoga2V5ID0+IGNhbGN1bGF0ZSB0aGUgcHVibGljIGtleSAqLworCQlncm91cCAgID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNrZXkpOworCQlwdWJfa2V5ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKwkJaWYgKHB1Yl9rZXkgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNLRVlfUFJJVl9ERUNPREUsIEVSUl9SX0VDX0xJQik7CisJCQlnb3RvIGVjbGliZXJyOworCQkJfQorCQlpZiAoIUVDX1BPSU5UX2NvcHkocHViX2tleSwgRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoZ3JvdXApKSkKKwkJCXsKKwkJCUVDX1BPSU5UX2ZyZWUocHViX2tleSk7CisJCQlFQ2VycihFQ19GX0VDS0VZX1BSSVZfREVDT0RFLCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlY2xpYmVycjsKKwkJCX0KKwkJcHJpdl9rZXkgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShlY2tleSk7CisJCWlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBwdWJfa2V5LCBwcml2X2tleSwgTlVMTCwgTlVMTCwgTlVMTCkpCisJCQl7CisJCQlFQ19QT0lOVF9mcmVlKHB1Yl9rZXkpOworCQkJRUNlcnIoRUNfRl9FQ0tFWV9QUklWX0RFQ09ERSwgRVJSX1JfRUNfTElCKTsKKwkJCWdvdG8gZWNsaWJlcnI7CisJCQl9CisJCWlmIChFQ19LRVlfc2V0X3B1YmxpY19rZXkoZWNrZXksIHB1Yl9rZXkpID09IDApCisJCQl7CisJCQlFQ19QT0lOVF9mcmVlKHB1Yl9rZXkpOworCQkJRUNlcnIoRUNfRl9FQ0tFWV9QUklWX0RFQ09ERSwgRVJSX1JfRUNfTElCKTsKKwkJCWdvdG8gZWNsaWJlcnI7CisJCQl9CisJCUVDX1BPSU5UX2ZyZWUocHViX2tleSk7CisJCX0KKworCUVWUF9QS0VZX2Fzc2lnbl9FQ19LRVkocGtleSwgZWNrZXkpOworCXJldHVybiAxOworCisJZWNsaWJlcnI6CisJRUNlcnIoRUNfRl9FQ0tFWV9QUklWX0RFQ09ERSwgRVJSX1JfRUNfTElCKTsKKwllY2VycjoKKwlpZiAoZWNrZXkpCisJCUVDX0tFWV9mcmVlKGVja2V5KTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgZWNrZXlfcHJpdl9lbmNvZGUoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGNvbnN0IEVWUF9QS0VZICpwa2V5KQoreworCUVDX0tFWQkJKmVjX2tleTsKKwl1bnNpZ25lZCBjaGFyCSplcCwgKnA7CisJaW50IAkJZXBsZW4sIHB0eXBlOworCXZvaWQJCSpwdmFsOworCXVuc2lnbmVkIGludCAgICB0bXBfZmxhZ3MsIG9sZF9mbGFnczsKKworCWVjX2tleSA9IHBrZXktPnBrZXkuZWM7CisKKwlpZiAoIWVja2V5X3BhcmFtMnR5cGUoJnB0eXBlLCAmcHZhbCwgZWNfa2V5KSkKKwkJeworCQlFQ2VycihFQ19GX0VDS0VZX1BSSVZfRU5DT0RFLCBFQ19SX0RFQ09ERV9FUlJPUik7CisJCXJldHVybiAwOworCQl9CisKKwkvKiBzZXQgdGhlIHByaXZhdGUga2V5ICovCisKKwkvKiBkbyBub3QgaW5jbHVkZSB0aGUgcGFyYW1ldGVycyBpbiB0aGUgU0VDMSBwcml2YXRlIGtleQorCSAqIHNlZSBQS0NTIzExIDEyLjExICovCisJb2xkX2ZsYWdzID0gRUNfS0VZX2dldF9lbmNfZmxhZ3MoZWNfa2V5KTsKKwl0bXBfZmxhZ3MgPSBvbGRfZmxhZ3MgfCBFQ19QS0VZX05PX1BBUkFNRVRFUlM7CisJRUNfS0VZX3NldF9lbmNfZmxhZ3MoZWNfa2V5LCB0bXBfZmxhZ3MpOworCWVwbGVuID0gaTJkX0VDUHJpdmF0ZUtleShlY19rZXksIE5VTEwpOworCWlmICghZXBsZW4pCisJeworCQlFQ19LRVlfc2V0X2VuY19mbGFncyhlY19rZXksIG9sZF9mbGFncyk7CisJCUVDZXJyKEVDX0ZfRUNLRVlfUFJJVl9FTkNPREUsIEVSUl9SX0VDX0xJQik7CisJCXJldHVybiAwOworCX0KKwllcCA9ICh1bnNpZ25lZCBjaGFyICopIE9QRU5TU0xfbWFsbG9jKGVwbGVuKTsKKwlpZiAoIWVwKQorCXsKKwkJRUNfS0VZX3NldF9lbmNfZmxhZ3MoZWNfa2V5LCBvbGRfZmxhZ3MpOworCQlFQ2VycihFQ19GX0VDS0VZX1BSSVZfRU5DT0RFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKwlwID0gZXA7CisJaWYgKCFpMmRfRUNQcml2YXRlS2V5KGVjX2tleSwgJnApKQorCXsKKwkJRUNfS0VZX3NldF9lbmNfZmxhZ3MoZWNfa2V5LCBvbGRfZmxhZ3MpOworCQlPUEVOU1NMX2ZyZWUoZXApOworCQlFQ2VycihFQ19GX0VDS0VZX1BSSVZfRU5DT0RFLCBFUlJfUl9FQ19MSUIpOworCX0KKwkvKiByZXN0b3JlIG9sZCBlbmNvZGluZyBmbGFncyAqLworCUVDX0tFWV9zZXRfZW5jX2ZsYWdzKGVjX2tleSwgb2xkX2ZsYWdzKTsKKworCWlmICghUEtDUzhfcGtleV9zZXQwKHA4LCBPQkpfbmlkMm9iaihOSURfWDlfNjJfaWRfZWNQdWJsaWNLZXkpLCAwLAorCQkJCXB0eXBlLCBwdmFsLCBlcCwgZXBsZW4pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGludF9lY19zaXplKGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4gRUNEU0Ffc2l6ZShwa2V5LT5wa2V5LmVjKTsKKwl9CisKK3N0YXRpYyBpbnQgZWNfYml0cyhjb25zdCBFVlBfUEtFWSAqcGtleSkKKwl7CisJQklHTlVNICpvcmRlciA9IEJOX25ldygpOworCWNvbnN0IEVDX0dST1VQICpncm91cDsKKwlpbnQgcmV0OworCisJaWYgKCFvcmRlcikKKwkJeworCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKHBrZXktPnBrZXkuZWMpOworCWlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgTlVMTCkpCisJCXsKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCXJldHVybiAwOworCQl9CisKKwlyZXQgPSBCTl9udW1fYml0cyhvcmRlcik7CisJQk5fZnJlZShvcmRlcik7CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgZWNfbWlzc2luZ19wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlpZiAoRUNfS0VZX2dldDBfZ3JvdXAocGtleS0+cGtleS5lYykgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGVjX2NvcHlfcGFyYW1ldGVycyhFVlBfUEtFWSAqdG8sIGNvbnN0IEVWUF9QS0VZICpmcm9tKQorCXsKKwlFQ19HUk9VUCAqZ3JvdXAgPSBFQ19HUk9VUF9kdXAoRUNfS0VZX2dldDBfZ3JvdXAoZnJvbS0+cGtleS5lYykpOworCWlmIChncm91cCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZiAoRUNfS0VZX3NldF9ncm91cCh0by0+cGtleS5lYywgZ3JvdXApID09IDApCisJCXJldHVybiAwOworCUVDX0dST1VQX2ZyZWUoZ3JvdXApOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBlY19jbXBfcGFyYW1ldGVycyhjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpCisJeworCWNvbnN0IEVDX0dST1VQICpncm91cF9hID0gRUNfS0VZX2dldDBfZ3JvdXAoYS0+cGtleS5lYyksCisJICAgICAgICAgICAgICAgKmdyb3VwX2IgPSBFQ19LRVlfZ2V0MF9ncm91cChiLT5wa2V5LmVjKTsKKwlpZiAoRUNfR1JPVVBfY21wKGdyb3VwX2EsIGdyb3VwX2IsIE5VTEwpKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworCX0KKworc3RhdGljIHZvaWQgaW50X2VjX2ZyZWUoRVZQX1BLRVkgKnBrZXkpCisJeworCUVDX0tFWV9mcmVlKHBrZXktPnBrZXkuZWMpOworCX0KKworc3RhdGljIGludCBkb19FQ19LRVlfcHJpbnQoQklPICpicCwgY29uc3QgRUNfS0VZICp4LCBpbnQgb2ZmLCBpbnQga3R5cGUpCisJeworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcj1OVUxMOworCWNvbnN0IGNoYXIgKmVjc3RyOworCXNpemVfdAlidWZfbGVuPTAsIGk7CisJaW50ICAgICByZXQ9MCwgcmVhc29uPUVSUl9SX0JJT19MSUI7CisJQklHTlVNICAqcHViX2tleT1OVUxMLCAqb3JkZXI9TlVMTDsKKwlCTl9DVFggICpjdHg9TlVMTDsKKwljb25zdCBFQ19HUk9VUCAqZ3JvdXA7CisJY29uc3QgRUNfUE9JTlQgKnB1YmxpY19rZXk7CisJY29uc3QgQklHTlVNICpwcml2X2tleTsKKyAKKwlpZiAoeCA9PSBOVUxMIHx8IChncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKHgpKSA9PSBOVUxMKQorCQl7CisJCXJlYXNvbiA9IEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUjsKKwkJZ290byBlcnI7CisJCX0KKworCWN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJcmVhc29uID0gRVJSX1JfTUFMTE9DX0ZBSUxVUkU7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoa3R5cGUgPiAwKQorCQl7CisJCXB1YmxpY19rZXkgPSBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KHgpOworCQlpZiAoKHB1Yl9rZXkgPSBFQ19QT0lOVF9wb2ludDJibihncm91cCwgcHVibGljX2tleSwKKwkJCUVDX0tFWV9nZXRfY29udl9mb3JtKHgpLCBOVUxMLCBjdHgpKSA9PSBOVUxMKQorCQkJeworCQkJcmVhc29uID0gRVJSX1JfRUNfTElCOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmIChwdWJfa2V5KQorCQkJYnVmX2xlbiA9IChzaXplX3QpQk5fbnVtX2J5dGVzKHB1Yl9rZXkpOworCQl9CisKKwlpZiAoa3R5cGUgPT0gMikKKwkJeworCQlwcml2X2tleSA9IEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KHgpOworCQlpZiAocHJpdl9rZXkgJiYgKGkgPSAoc2l6ZV90KUJOX251bV9ieXRlcyhwcml2X2tleSkpID4gYnVmX2xlbikKKwkJCWJ1Zl9sZW4gPSBpOworCQl9CisJZWxzZQorCQlwcml2X2tleSA9IE5VTEw7CisKKwlpZiAoa3R5cGUgPiAwKQorCQl7CisJCWJ1Zl9sZW4gKz0gMTA7CisJCWlmICgoYnVmZmVyID0gT1BFTlNTTF9tYWxsb2MoYnVmX2xlbikpID09IE5VTEwpCisJCQl7CisJCQlyZWFzb24gPSBFUlJfUl9NQUxMT0NfRkFJTFVSRTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJaWYgKGt0eXBlID09IDIpCisJCWVjc3RyID0gIlByaXZhdGUtS2V5IjsKKwllbHNlIGlmIChrdHlwZSA9PSAxKQorCQllY3N0ciA9ICJQdWJsaWMtS2V5IjsKKwllbHNlCisJCWVjc3RyID0gIkVDRFNBLVBhcmFtZXRlcnMiOworCisJaWYgKCFCSU9faW5kZW50KGJwLCBvZmYsIDEyOCkpCisJCWdvdG8gZXJyOworCWlmICgob3JkZXIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIG9yZGVyLCBOVUxMKSkKKwkJZ290byBlcnI7CisJaWYgKEJJT19wcmludGYoYnAsICIlczogKCVkIGJpdClcbiIsIGVjc3RyLAorCQlCTl9udW1fYml0cyhvcmRlcikpIDw9IDApIGdvdG8gZXJyOworICAKKwlpZiAoKHByaXZfa2V5ICE9IE5VTEwpICYmICFBU04xX2JuX3ByaW50KGJwLCAicHJpdjoiLCBwcml2X2tleSwgCisJCWJ1ZmZlciwgb2ZmKSkKKwkJZ290byBlcnI7CisJaWYgKChwdWJfa2V5ICE9IE5VTEwpICYmICFBU04xX2JuX3ByaW50KGJwLCAicHViOiAiLCBwdWJfa2V5LAorCQlidWZmZXIsIG9mZikpCisJCWdvdG8gZXJyOworCWlmICghRUNQS1BhcmFtZXRlcnNfcHJpbnQoYnAsIGdyb3VwLCBvZmYpKQorCQlnb3RvIGVycjsKKwlyZXQ9MTsKK2VycjoKKwlpZiAoIXJldCkKKyAJCUVDZXJyKEVDX0ZfRE9fRUNfS0VZX1BSSU5ULCByZWFzb24pOworCWlmIChwdWJfa2V5KSAKKwkJQk5fZnJlZShwdWJfa2V5KTsKKwlpZiAob3JkZXIpCisJCUJOX2ZyZWUob3JkZXIpOworCWlmIChjdHgpCisJCUJOX0NUWF9mcmVlKGN0eCk7CisJaWYgKGJ1ZmZlciAhPSBOVUxMKQorCQlPUEVOU1NMX2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgZWNrZXlfcGFyYW1fZGVjb2RlKEVWUF9QS0VZICpwa2V5LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwgaW50IGRlcmxlbikKKwl7CisJRUNfS0VZICplY2tleTsKKwlpZiAoIShlY2tleSA9IGQyaV9FQ1BhcmFtZXRlcnMoTlVMTCwgcGRlciwgZGVybGVuKSkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ0tFWV9QQVJBTV9ERUNPREUsIEVSUl9SX0VDX0xJQik7CisJCXJldHVybiAwOworCQl9CisJRVZQX1BLRVlfYXNzaWduX0VDX0tFWShwa2V5LCBlY2tleSk7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGVja2V5X3BhcmFtX2VuY29kZShjb25zdCBFVlBfUEtFWSAqcGtleSwgdW5zaWduZWQgY2hhciAqKnBkZXIpCisJeworCXJldHVybiBpMmRfRUNQYXJhbWV0ZXJzKHBrZXktPnBrZXkuZWMsIHBkZXIpOworCX0KKworc3RhdGljIGludCBlY2tleV9wYXJhbV9wcmludChCSU8gKmJwLCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKmN0eCkKKwl7CisJcmV0dXJuIGRvX0VDX0tFWV9wcmludChicCwgcGtleS0+cGtleS5lYywgaW5kZW50LCAwKTsKKwl9CisKK3N0YXRpYyBpbnQgZWNrZXlfcHViX3ByaW50KEJJTyAqYnAsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorCQkJCQkJCUFTTjFfUENUWCAqY3R4KQorCXsKKwlyZXR1cm4gZG9fRUNfS0VZX3ByaW50KGJwLCBwa2V5LT5wa2V5LmVjLCBpbmRlbnQsIDEpOworCX0KKworCitzdGF0aWMgaW50IGVja2V5X3ByaXZfcHJpbnQoQklPICpicCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisJCQkJCQkJQVNOMV9QQ1RYICpjdHgpCisJeworCXJldHVybiBkb19FQ19LRVlfcHJpbnQoYnAsIHBrZXktPnBrZXkuZWMsIGluZGVudCwgMik7CisJfQorCitzdGF0aWMgaW50IG9sZF9lY19wcml2X2RlY29kZShFVlBfUEtFWSAqcGtleSwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKnBkZXIsIGludCBkZXJsZW4pCisJeworCUVDX0tFWSAqZWM7CisJaWYgKCEoZWMgPSBkMmlfRUNQcml2YXRlS2V5IChOVUxMLCBwZGVyLCBkZXJsZW4pKSkKKwkJeworCQlFQ2VycihFQ19GX09MRF9FQ19QUklWX0RFQ09ERSwgRUNfUl9ERUNPREVfRVJST1IpOworCQlyZXR1cm4gMDsKKwkJfQorCUVWUF9QS0VZX2Fzc2lnbl9FQ19LRVkocGtleSwgZWMpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBvbGRfZWNfcHJpdl9lbmNvZGUoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVuc2lnbmVkIGNoYXIgKipwZGVyKQorCXsKKwlyZXR1cm4gaTJkX0VDUHJpdmF0ZUtleShwa2V5LT5wa2V5LmVjLCBwZGVyKTsKKwl9CisKK3N0YXRpYyBpbnQgZWNfcGtleV9jdHJsKEVWUF9QS0VZICpwa2V5LCBpbnQgb3AsIGxvbmcgYXJnMSwgdm9pZCAqYXJnMikKKwl7CisJc3dpdGNoIChvcCkKKwkJeworCQljYXNlIEFTTjFfUEtFWV9DVFJMX1BLQ1M3X1NJR046CisJCWlmIChhcmcxID09IDApCisJCQl7CisJCQlpbnQgc25pZCwgaG5pZDsKKwkJCVg1MDlfQUxHT1IgKmFsZzEsICphbGcyOworCQkJUEtDUzdfU0lHTkVSX0lORk9fZ2V0MF9hbGdzKGFyZzIsIE5VTEwsICZhbGcxLCAmYWxnMik7CisJCQlpZiAoYWxnMSA9PSBOVUxMIHx8IGFsZzEtPmFsZ29yaXRobSA9PSBOVUxMKQorCQkJCXJldHVybiAtMTsKKwkJCWhuaWQgPSBPQkpfb2JqMm5pZChhbGcxLT5hbGdvcml0aG0pOworCQkJaWYgKGhuaWQgPT0gTklEX3VuZGVmKQorCQkJCXJldHVybiAtMTsKKwkJCWlmICghT0JKX2ZpbmRfc2lnaWRfYnlfYWxncygmc25pZCwgaG5pZCwgRVZQX1BLRVlfaWQocGtleSkpKQorCQkJCXJldHVybiAtMTsgCisJCQlYNTA5X0FMR09SX3NldDAoYWxnMiwgT0JKX25pZDJvYmooc25pZCksIFZfQVNOMV9VTkRFRiwgMCk7CisJCQl9CisJCXJldHVybiAxOworI2lmbmRlZiBPUEVOU1NMX05PX0NNUworCQljYXNlIEFTTjFfUEtFWV9DVFJMX0NNU19TSUdOOgorCQlpZiAoYXJnMSA9PSAwKQorCQkJeworCQkJaW50IHNuaWQsIGhuaWQ7CisJCQlYNTA5X0FMR09SICphbGcxLCAqYWxnMjsKKwkJCUNNU19TaWduZXJJbmZvX2dldDBfYWxncyhhcmcyLCBOVUxMLCBOVUxMLAorCQkJCQkJCQkmYWxnMSwgJmFsZzIpOworCQkJaWYgKGFsZzEgPT0gTlVMTCB8fCBhbGcxLT5hbGdvcml0aG0gPT0gTlVMTCkKKwkJCQlyZXR1cm4gLTE7CisJCQlobmlkID0gT0JKX29iajJuaWQoYWxnMS0+YWxnb3JpdGhtKTsKKwkJCWlmIChobmlkID09IE5JRF91bmRlZikKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoIU9CSl9maW5kX3NpZ2lkX2J5X2FsZ3MoJnNuaWQsIGhuaWQsIEVWUF9QS0VZX2lkKHBrZXkpKSkKKwkJCQlyZXR1cm4gLTE7IAorCQkJWDUwOV9BTEdPUl9zZXQwKGFsZzIsIE9CSl9uaWQyb2JqKHNuaWQpLCBWX0FTTjFfVU5ERUYsIDApOworCQkJfQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCisJCWNhc2UgQVNOMV9QS0VZX0NUUkxfREVGQVVMVF9NRF9OSUQ6CisJCSooaW50ICopYXJnMiA9IE5JRF9zaGExOworCQlyZXR1cm4gMjsKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gLTI7CisKKwkJfQorCisJfQorCitjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCBlY2tleV9hc24xX21ldGggPSAKKwl7CisJRVZQX1BLRVlfRUMsCisJRVZQX1BLRVlfRUMsCisJMCwKKwkiRUMiLAorCSJPcGVuU1NMIEVDIGFsZ29yaXRobSIsCisKKwllY2tleV9wdWJfZGVjb2RlLAorCWVja2V5X3B1Yl9lbmNvZGUsCisJZWNrZXlfcHViX2NtcCwKKwllY2tleV9wdWJfcHJpbnQsCisKKwllY2tleV9wcml2X2RlY29kZSwKKwllY2tleV9wcml2X2VuY29kZSwKKwllY2tleV9wcml2X3ByaW50LAorCisJaW50X2VjX3NpemUsCisJZWNfYml0cywKKworCWVja2V5X3BhcmFtX2RlY29kZSwKKwllY2tleV9wYXJhbV9lbmNvZGUsCisJZWNfbWlzc2luZ19wYXJhbWV0ZXJzLAorCWVjX2NvcHlfcGFyYW1ldGVycywKKwllY19jbXBfcGFyYW1ldGVycywKKwllY2tleV9wYXJhbV9wcmludCwKKworCWludF9lY19mcmVlLAorCWVjX3BrZXlfY3RybCwKKwlvbGRfZWNfcHJpdl9kZWNvZGUsCisJb2xkX2VjX3ByaXZfZW5jb2RlCisJfTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19hc24xLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTU1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfYXNuMS5jCkBAIC0wLDAgKzEsMTQyOSBAQAorLyogY3J5cHRvL2VjL2VjX2FzbjEuYyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgTmlscyBMYXJzY2ggZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZWNfbGNsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKKworaW50IEVDX0dST1VQX2dldF9iYXNpc190eXBlKGNvbnN0IEVDX0dST1VQICpncm91cCkKKwl7CisJaW50IGk9MDsKKworCWlmIChFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoRUNfR1JPVVBfbWV0aG9kX29mKGdyb3VwKSkgIT0KKwkJTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCkKKwkJLyogZXZlcnl0aGluZyBlbHNlIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkICovCisJCXJldHVybiAwOworCisJd2hpbGUgKGdyb3VwLT5wb2x5W2ldICE9IDApCisJCWkrKzsKKworCWlmIChpID09IDQpCisJCXJldHVybiBOSURfWDlfNjJfcHBCYXNpczsKKwllbHNlIGlmIChpID09IDIpCisJCXJldHVybiBOSURfWDlfNjJfdHBCYXNpczsKKwllbHNlCisJCS8qIGV2ZXJ5dGhpbmcgZWxzZSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCAqLworCQlyZXR1cm4gMDsKKwl9CisKK2ludCBFQ19HUk9VUF9nZXRfdHJpbm9taWFsX2Jhc2lzKGNvbnN0IEVDX0dST1VQICpncm91cCwgdW5zaWduZWQgaW50ICprKQorCXsKKwlpZiAoZ3JvdXAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoRUNfR1JPVVBfbWV0aG9kX29mKGdyb3VwKS0+Z3JvdXBfc2V0X2N1cnZlICE9IGVjX0dGMm1fc2ltcGxlX2dyb3VwX3NldF9jdXJ2ZQorCSAgICB8fCAhKChncm91cC0+cG9seVswXSAhPSAwKSAmJiAoZ3JvdXAtPnBvbHlbMV0gIT0gMCkgJiYgKGdyb3VwLT5wb2x5WzJdID09IDApKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX0dFVF9UUklOT01JQUxfQkFTSVMsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoaykKKwkJKmsgPSBncm91cC0+cG9seVsxXTsKKworCXJldHVybiAxOworCX0KKworaW50IEVDX0dST1VQX2dldF9wZW50YW5vbWlhbF9iYXNpcyhjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIHVuc2lnbmVkIGludCAqazEsCisJdW5zaWduZWQgaW50ICprMiwgdW5zaWduZWQgaW50ICprMykKKwl7CisJaWYgKGdyb3VwID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKEVDX0dST1VQX21ldGhvZF9vZihncm91cCktPmdyb3VwX3NldF9jdXJ2ZSAhPSBlY19HRjJtX3NpbXBsZV9ncm91cF9zZXRfY3VydmUKKwkgICAgfHwgISgoZ3JvdXAtPnBvbHlbMF0gIT0gMCkgJiYgKGdyb3VwLT5wb2x5WzFdICE9IDApICYmIChncm91cC0+cG9seVsyXSAhPSAwKSAmJiAoZ3JvdXAtPnBvbHlbM10gIT0gMCkgJiYgKGdyb3VwLT5wb2x5WzRdID09IDApKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX0dFVF9QRU5UQU5PTUlBTF9CQVNJUywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmIChrMSkKKwkJKmsxID0gZ3JvdXAtPnBvbHlbM107CisJaWYgKGsyKQorCQkqazIgPSBncm91cC0+cG9seVsyXTsKKwlpZiAoazMpCisJCSprMyA9IGdyb3VwLT5wb2x5WzFdOworCisJcmV0dXJuIDE7CisJfQorCisKKworLyogc29tZSBzdHJ1Y3R1cmVzIG5lZWRlZCBmb3IgdGhlIGFzbjEgZW5jb2RpbmcgKi8KK3R5cGVkZWYgc3RydWN0IHg5XzYyX3BlbnRhbm9taWFsX3N0IHsKKwlsb25nIGsxOworCWxvbmcgazI7CisJbG9uZyBrMzsKKwl9IFg5XzYyX1BFTlRBTk9NSUFMOworCit0eXBlZGVmIHN0cnVjdCB4OV82Ml9jaGFyYWN0ZXJpc3RpY190d29fc3QgeworCWxvbmcgbTsKKwlBU04xX09CSkVDVCAgKnR5cGU7CisJdW5pb24JeworCQljaGFyICpwdHI7CisJCS8qIE5JRF9YOV82Ml9vbkJhc2lzICovCisJCUFTTjFfTlVMTCAgICAqb25CYXNpczsKKwkJLyogTklEX1g5XzYyX3RwQmFzaXMgKi8KKwkJQVNOMV9JTlRFR0VSICp0cEJhc2lzOworCQkvKiBOSURfWDlfNjJfcHBCYXNpcyAqLworCQlYOV82Ml9QRU5UQU5PTUlBTCAqcHBCYXNpczsKKwkJLyogYW55dGhpbmcgZWxzZSAqLworCQlBU04xX1RZUEUgKm90aGVyOworCQl9IHA7CisJfSBYOV82Ml9DSEFSQUNURVJJU1RJQ19UV087CisKK3R5cGVkZWYgc3RydWN0IHg5XzYyX2ZpZWxkaWRfc3QgeworICAgICAgICBBU04xX09CSkVDVCAqZmllbGRUeXBlOworCXVuaW9uCXsKKwkJY2hhciAqcHRyOworCQkvKiBOSURfWDlfNjJfcHJpbWVfZmllbGQgKi8KKwkJQVNOMV9JTlRFR0VSICpwcmltZTsKKwkJLyogTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCAqLworCQlYOV82Ml9DSEFSQUNURVJJU1RJQ19UV08gKmNoYXJfdHdvOworCQkvKiBhbnl0aGluZyBlbHNlICovCisJCUFTTjFfVFlQRSAqb3RoZXI7CisJCX0gcDsKKwl9IFg5XzYyX0ZJRUxESUQ7CisKK3R5cGVkZWYgc3RydWN0IHg5XzYyX2N1cnZlX3N0IHsKKyAgICAgICAgQVNOMV9PQ1RFVF9TVFJJTkcgKmE7CisgICAgICAgIEFTTjFfT0NURVRfU1RSSU5HICpiOworICAgICAgICBBU04xX0JJVF9TVFJJTkcgICAqc2VlZDsKKyAgICAgICAgfSBYOV82Ml9DVVJWRTsKKwordHlwZWRlZiBzdHJ1Y3QgZWNfcGFyYW1ldGVyc19zdCB7CisgICAgICAgIGxvbmcgICAgICAgICAgICAgIHZlcnNpb247CisgICAgICAgIFg5XzYyX0ZJRUxESUQgICAgICpmaWVsZElEOworICAgICAgICBYOV82Ml9DVVJWRSAgICAgICAqY3VydmU7CisgICAgICAgIEFTTjFfT0NURVRfU1RSSU5HICpiYXNlOworICAgICAgICBBU04xX0lOVEVHRVIgICAgICAqb3JkZXI7CisgICAgICAgIEFTTjFfSU5URUdFUiAgICAgICpjb2ZhY3RvcjsKKyAgICAgICAgfSBFQ1BBUkFNRVRFUlM7CisKK3N0cnVjdCBlY3BrX3BhcmFtZXRlcnNfc3QgeworCWludAl0eXBlOworCXVuaW9uIHsKKwkJQVNOMV9PQkpFQ1QgICpuYW1lZF9jdXJ2ZTsKKwkJRUNQQVJBTUVURVJTICpwYXJhbWV0ZXJzOworCQlBU04xX05VTEwgICAgKmltcGxpY2l0bHlDQTsKKwl9IHZhbHVlOworCX0vKiBFQ1BLUEFSQU1FVEVSUyAqLzsKKworLyogU0VDMSBFQ1ByaXZhdGVLZXkgKi8KK3R5cGVkZWYgc3RydWN0IGVjX3ByaXZhdGVrZXlfc3QgeworCWxvbmcgICAgICAgICAgICAgIHZlcnNpb247CisJQVNOMV9PQ1RFVF9TVFJJTkcgKnByaXZhdGVLZXk7CisgICAgICAgIEVDUEtQQVJBTUVURVJTICAgICpwYXJhbWV0ZXJzOworCUFTTjFfQklUX1NUUklORyAgICpwdWJsaWNLZXk7CisJfSBFQ19QUklWQVRFS0VZOworCisvKiB0aGUgT3BlblNTTCBBU04uMSBkZWZpbml0aW9ucyAqLworQVNOMV9TRVFVRU5DRShYOV82Ml9QRU5UQU5PTUlBTCkgPSB7CisJQVNOMV9TSU1QTEUoWDlfNjJfUEVOVEFOT01JQUwsIGsxLCBMT05HKSwKKwlBU04xX1NJTVBMRShYOV82Ml9QRU5UQU5PTUlBTCwgazIsIExPTkcpLAorCUFTTjFfU0lNUExFKFg5XzYyX1BFTlRBTk9NSUFMLCBrMywgTE9ORykKK30gQVNOMV9TRVFVRU5DRV9FTkQoWDlfNjJfUEVOVEFOT01JQUwpCisKK0RFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlMoWDlfNjJfUEVOVEFOT01JQUwpCitJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlMoWDlfNjJfUEVOVEFOT01JQUwpCisKK0FTTjFfQURCX1RFTVBMQVRFKGNoYXJfdHdvX2RlZikgPSBBU04xX1NJTVBMRShYOV82Ml9DSEFSQUNURVJJU1RJQ19UV08sIHAub3RoZXIsIEFTTjFfQU5ZKTsKKworQVNOMV9BREIoWDlfNjJfQ0hBUkFDVEVSSVNUSUNfVFdPKSA9IHsKKwlBREJfRU5UUlkoTklEX1g5XzYyX29uQmFzaXMsIEFTTjFfU0lNUExFKFg5XzYyX0NIQVJBQ1RFUklTVElDX1RXTywgcC5vbkJhc2lzLCBBU04xX05VTEwpKSwKKwlBREJfRU5UUlkoTklEX1g5XzYyX3RwQmFzaXMsIEFTTjFfU0lNUExFKFg5XzYyX0NIQVJBQ1RFUklTVElDX1RXTywgcC50cEJhc2lzLCBBU04xX0lOVEVHRVIpKSwKKwlBREJfRU5UUlkoTklEX1g5XzYyX3BwQmFzaXMsIEFTTjFfU0lNUExFKFg5XzYyX0NIQVJBQ1RFUklTVElDX1RXTywgcC5wcEJhc2lzLCBYOV82Ml9QRU5UQU5PTUlBTCkpCit9IEFTTjFfQURCX0VORChYOV82Ml9DSEFSQUNURVJJU1RJQ19UV08sIDAsIHR5cGUsIDAsICZjaGFyX3R3b19kZWZfdHQsIE5VTEwpOworCitBU04xX1NFUVVFTkNFKFg5XzYyX0NIQVJBQ1RFUklTVElDX1RXTykgPSB7CisJQVNOMV9TSU1QTEUoWDlfNjJfQ0hBUkFDVEVSSVNUSUNfVFdPLCBtLCBMT05HKSwKKwlBU04xX1NJTVBMRShYOV82Ml9DSEFSQUNURVJJU1RJQ19UV08sIHR5cGUsIEFTTjFfT0JKRUNUKSwKKwlBU04xX0FEQl9PQkpFQ1QoWDlfNjJfQ0hBUkFDVEVSSVNUSUNfVFdPKQorfSBBU04xX1NFUVVFTkNFX0VORChYOV82Ml9DSEFSQUNURVJJU1RJQ19UV08pCisKK0RFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlMoWDlfNjJfQ0hBUkFDVEVSSVNUSUNfVFdPKQorSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TKFg5XzYyX0NIQVJBQ1RFUklTVElDX1RXTykKKworQVNOMV9BREJfVEVNUExBVEUoZmllbGRJRF9kZWYpID0gQVNOMV9TSU1QTEUoWDlfNjJfRklFTERJRCwgcC5vdGhlciwgQVNOMV9BTlkpOworCitBU04xX0FEQihYOV82Ml9GSUVMRElEKSA9IHsKKwlBREJfRU5UUlkoTklEX1g5XzYyX3ByaW1lX2ZpZWxkLCBBU04xX1NJTVBMRShYOV82Ml9GSUVMRElELCBwLnByaW1lLCBBU04xX0lOVEVHRVIpKSwKKwlBREJfRU5UUlkoTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwgQVNOMV9TSU1QTEUoWDlfNjJfRklFTERJRCwgcC5jaGFyX3R3bywgWDlfNjJfQ0hBUkFDVEVSSVNUSUNfVFdPKSkKK30gQVNOMV9BREJfRU5EKFg5XzYyX0ZJRUxESUQsIDAsIGZpZWxkVHlwZSwgMCwgJmZpZWxkSURfZGVmX3R0LCBOVUxMKTsKKworQVNOMV9TRVFVRU5DRShYOV82Ml9GSUVMRElEKSA9IHsKKwlBU04xX1NJTVBMRShYOV82Ml9GSUVMRElELCBmaWVsZFR5cGUsIEFTTjFfT0JKRUNUKSwKKwlBU04xX0FEQl9PQkpFQ1QoWDlfNjJfRklFTERJRCkKK30gQVNOMV9TRVFVRU5DRV9FTkQoWDlfNjJfRklFTERJRCkKKworQVNOMV9TRVFVRU5DRShYOV82Ml9DVVJWRSkgPSB7CisJQVNOMV9TSU1QTEUoWDlfNjJfQ1VSVkUsIGEsIEFTTjFfT0NURVRfU1RSSU5HKSwKKwlBU04xX1NJTVBMRShYOV82Ml9DVVJWRSwgYiwgQVNOMV9PQ1RFVF9TVFJJTkcpLAorCUFTTjFfT1BUKFg5XzYyX0NVUlZFLCBzZWVkLCBBU04xX0JJVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFg5XzYyX0NVUlZFKQorCitBU04xX1NFUVVFTkNFKEVDUEFSQU1FVEVSUykgPSB7CisJQVNOMV9TSU1QTEUoRUNQQVJBTUVURVJTLCB2ZXJzaW9uLCBMT05HKSwKKwlBU04xX1NJTVBMRShFQ1BBUkFNRVRFUlMsIGZpZWxkSUQsIFg5XzYyX0ZJRUxESUQpLAorCUFTTjFfU0lNUExFKEVDUEFSQU1FVEVSUywgY3VydmUsIFg5XzYyX0NVUlZFKSwKKwlBU04xX1NJTVBMRShFQ1BBUkFNRVRFUlMsIGJhc2UsIEFTTjFfT0NURVRfU1RSSU5HKSwKKwlBU04xX1NJTVBMRShFQ1BBUkFNRVRFUlMsIG9yZGVyLCBBU04xX0lOVEVHRVIpLAorCUFTTjFfT1BUKEVDUEFSQU1FVEVSUywgY29mYWN0b3IsIEFTTjFfSU5URUdFUikKK30gQVNOMV9TRVFVRU5DRV9FTkQoRUNQQVJBTUVURVJTKQorCitERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TKEVDUEFSQU1FVEVSUykKK0lNUExFTUVOVF9BU04xX0FMTE9DX0ZVTkNUSU9OUyhFQ1BBUkFNRVRFUlMpCisKK0FTTjFfQ0hPSUNFKEVDUEtQQVJBTUVURVJTKSA9IHsKKwlBU04xX1NJTVBMRShFQ1BLUEFSQU1FVEVSUywgdmFsdWUubmFtZWRfY3VydmUsIEFTTjFfT0JKRUNUKSwKKwlBU04xX1NJTVBMRShFQ1BLUEFSQU1FVEVSUywgdmFsdWUucGFyYW1ldGVycywgRUNQQVJBTUVURVJTKSwKKwlBU04xX1NJTVBMRShFQ1BLUEFSQU1FVEVSUywgdmFsdWUuaW1wbGljaXRseUNBLCBBU04xX05VTEwpCit9IEFTTjFfQ0hPSUNFX0VORChFQ1BLUEFSQU1FVEVSUykKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OU19jb25zdChFQ1BLUEFSQU1FVEVSUykKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KEVDUEtQQVJBTUVURVJTLCBFQ1BLUEFSQU1FVEVSUykKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OU19jb25zdChFQ1BLUEFSQU1FVEVSUykKKworQVNOMV9TRVFVRU5DRShFQ19QUklWQVRFS0VZKSA9IHsKKwlBU04xX1NJTVBMRShFQ19QUklWQVRFS0VZLCB2ZXJzaW9uLCBMT05HKSwKKwlBU04xX1NJTVBMRShFQ19QUklWQVRFS0VZLCBwcml2YXRlS2V5LCBBU04xX09DVEVUX1NUUklORyksCisJQVNOMV9FWFBfT1BUKEVDX1BSSVZBVEVLRVksIHBhcmFtZXRlcnMsIEVDUEtQQVJBTUVURVJTLCAwKSwKKwlBU04xX0VYUF9PUFQoRUNfUFJJVkFURUtFWSwgcHVibGljS2V5LCBBU04xX0JJVF9TVFJJTkcsIDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEVDX1BSSVZBVEVLRVkpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlNfY29uc3QoRUNfUFJJVkFURUtFWSkKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KEVDX1BSSVZBVEVLRVksIEVDX1BSSVZBVEVLRVkpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfY29uc3QoRUNfUFJJVkFURUtFWSkKKworLyogc29tZSBkZWNsYXJhdGlvbnMgb2YgaW50ZXJuYWwgZnVuY3Rpb24gKi8KKworLyogZWNfYXNuMV9ncm91cDJmaWVsZCgpIHNldHMgdGhlIHZhbHVlcyBpbiBhIFg5XzYyX0ZJRUxESUQgb2JqZWN0ICovIAorc3RhdGljIGludCBlY19hc24xX2dyb3VwMmZpZWxkaWQoY29uc3QgRUNfR1JPVVAgKiwgWDlfNjJfRklFTERJRCAqKTsKKy8qIGVjX2FzbjFfZ3JvdXAyY3VydmUoKSBzZXRzIHRoZSB2YWx1ZXMgaW4gYSBYOV82Ml9DVVJWRSBvYmplY3QgKi8gCitzdGF0aWMgaW50IGVjX2FzbjFfZ3JvdXAyY3VydmUoY29uc3QgRUNfR1JPVVAgKiwgWDlfNjJfQ1VSVkUgKik7CisvKiBlY19hc24xX3BhcmFtZXRlcnMyZ3JvdXAoKSBjcmVhdGVzIGEgRUNfR1JPVVAgb2JqZWN0IGZyb20gYQorICogRUNQQVJBTUVURVJTIG9iamVjdCAqLworc3RhdGljIEVDX0dST1VQICplY19hc24xX3BhcmFtZXRlcnMyZ3JvdXAoY29uc3QgRUNQQVJBTUVURVJTICopOyAKKy8qIGVjX2FzbjFfZ3JvdXAycGFyYW1ldGVycygpIGNyZWF0ZXMgYSBFQ1BBUkFNRVRFUlMgb2JqZWN0IGZyb20gYSAKKyAqIEVDX0dST1VQIG9iamVjdCAqLworc3RhdGljIEVDUEFSQU1FVEVSUyAqZWNfYXNuMV9ncm91cDJwYXJhbWV0ZXJzKGNvbnN0IEVDX0dST1VQICosRUNQQVJBTUVURVJTICopOworLyogZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAoKSBjcmVhdGVzIGEgRUNfR1JPVVAgb2JqZWN0IGZyb20gYQorICogRUNQS1BBUkFNRVRFUlMgb2JqZWN0ICovCitzdGF0aWMgRUNfR1JPVVAgKmVjX2FzbjFfcGtwYXJhbWV0ZXJzMmdyb3VwKGNvbnN0IEVDUEtQQVJBTUVURVJTICopOyAKKy8qIGVjX2FzbjFfZ3JvdXAycGtwYXJhbWV0ZXJzKCkgY3JlYXRlcyBhIEVDUEtQQVJBTUVURVJTIG9iamVjdCBmcm9tIGEgCisgKiBFQ19HUk9VUCBvYmplY3QgKi8KK3N0YXRpYyBFQ1BLUEFSQU1FVEVSUyAqZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnMoY29uc3QgRUNfR1JPVVAgKiwgCisJRUNQS1BBUkFNRVRFUlMgKik7CisKKworLyogdGhlIGZ1bmN0aW9uIGRlZmluaXRpb25zICovCisKK3N0YXRpYyBpbnQgZWNfYXNuMV9ncm91cDJmaWVsZGlkKGNvbnN0IEVDX0dST1VQICpncm91cCwgWDlfNjJfRklFTERJRCAqZmllbGQpCisJeworCWludAkJCW9rPTAsIG5pZDsKKwlCSUdOVU0JCQkqdG1wID0gTlVMTDsKKwkKKwlpZiAoZ3JvdXAgPT0gTlVMTCB8fCBmaWVsZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIGNsZWFyIHRoZSBvbGQgdmFsdWVzIChpZiBuZWNlc3NhcnkpICovCisJaWYgKGZpZWxkLT5maWVsZFR5cGUgIT0gTlVMTCkKKwkJQVNOMV9PQkpFQ1RfZnJlZShmaWVsZC0+ZmllbGRUeXBlKTsKKwlpZiAoZmllbGQtPnAub3RoZXIgIT0gTlVMTCkKKwkJQVNOMV9UWVBFX2ZyZWUoZmllbGQtPnAub3RoZXIpOworCisJbmlkID0gRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKEVDX0dST1VQX21ldGhvZF9vZihncm91cCkpOworCS8qIHNldCBPSUQgZm9yIHRoZSBmaWVsZCAqLworCWlmICgoZmllbGQtPmZpZWxkVHlwZSA9IE9CSl9uaWQyb2JqKG5pZCkpID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMkZJRUxESUQsIEVSUl9SX09CSl9MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKG5pZCA9PSBOSURfWDlfNjJfcHJpbWVfZmllbGQpCisJCXsKKwkJaWYgKCh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCkgCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyRklFTERJRCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIHRoZSBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgYnkgdGhlIHByaW1lIG51bWJlciBwICovCisJCWlmICghRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcChncm91cCwgdG1wLCBOVUxMLCBOVUxMLCBOVUxMKSkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJGSUVMRElELCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIHNldCB0aGUgcHJpbWUgbnVtYmVyICovCisJCWZpZWxkLT5wLnByaW1lID0gQk5fdG9fQVNOMV9JTlRFR0VSKHRtcCxOVUxMKTsKKwkJaWYgKGZpZWxkLT5wLnByaW1lID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyRklFTERJRCwgRVJSX1JfQVNOMV9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCS8qIG5pZCA9PSBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkICovCisJCXsKKwkJaW50CQlmaWVsZF90eXBlOworCQlYOV82Ml9DSEFSQUNURVJJU1RJQ19UV08gKmNoYXJfdHdvOworCisJCWZpZWxkLT5wLmNoYXJfdHdvID0gWDlfNjJfQ0hBUkFDVEVSSVNUSUNfVFdPX25ldygpOworCQljaGFyX3R3byA9IGZpZWxkLT5wLmNoYXJfdHdvOworCisJCWlmIChjaGFyX3R3byA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMkZJRUxESUQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQorCQljaGFyX3R3by0+bSA9IChsb25nKUVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApOworCisJCWZpZWxkX3R5cGUgPSBFQ19HUk9VUF9nZXRfYmFzaXNfdHlwZShncm91cCk7CisKKwkJaWYgKGZpZWxkX3R5cGUgPT0gMCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJGSUVMRElELCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIHNldCBiYXNlIHR5cGUgT0lEICovCisJCWlmICgoY2hhcl90d28tPnR5cGUgPSBPQkpfbmlkMm9iaihmaWVsZF90eXBlKSkgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJGSUVMRElELCBFUlJfUl9PQkpfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChmaWVsZF90eXBlID09IE5JRF9YOV82Ml90cEJhc2lzKQorCQkJeworCQkJdW5zaWduZWQgaW50IGs7CisKKwkJCWlmICghRUNfR1JPVVBfZ2V0X3RyaW5vbWlhbF9iYXNpcyhncm91cCwgJmspKQorCQkJCWdvdG8gZXJyOworCisJCQljaGFyX3R3by0+cC50cEJhc2lzID0gQVNOMV9JTlRFR0VSX25ldygpOworCQkJaWYgKCFjaGFyX3R3by0+cC50cEJhc2lzKQorCQkJCXsKKwkJCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyRklFTERJRCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmICghQVNOMV9JTlRFR0VSX3NldChjaGFyX3R3by0+cC50cEJhc2lzLCAobG9uZylrKSkKKwkJCQl7CisJCQkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMkZJRUxESUQsCisJCQkJCUVSUl9SX0FTTjFfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKGZpZWxkX3R5cGUgPT0gTklEX1g5XzYyX3BwQmFzaXMpCisJCQl7CisJCQl1bnNpZ25lZCBpbnQgazEsIGsyLCBrMzsKKworCQkJaWYgKCFFQ19HUk9VUF9nZXRfcGVudGFub21pYWxfYmFzaXMoZ3JvdXAsICZrMSwgJmsyLCAmazMpKQorCQkJCWdvdG8gZXJyOworCisJCQljaGFyX3R3by0+cC5wcEJhc2lzID0gWDlfNjJfUEVOVEFOT01JQUxfbmV3KCk7CisJCQlpZiAoIWNoYXJfdHdvLT5wLnBwQmFzaXMpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJGSUVMRElELCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiBzZXQgaz8gdmFsdWVzICovCisJCQljaGFyX3R3by0+cC5wcEJhc2lzLT5rMSA9IChsb25nKWsxOworCQkJY2hhcl90d28tPnAucHBCYXNpcy0+azIgPSAobG9uZylrMjsKKwkJCWNoYXJfdHdvLT5wLnBwQmFzaXMtPmszID0gKGxvbmcpazM7CisJCQl9CisJCWVsc2UgLyogZmllbGRfdHlwZSA9PSBOSURfWDlfNjJfb25CYXNpcyAqLworCQkJeworCQkJLyogZm9yIE9OQiB0aGUgcGFyYW1ldGVycyBhcmUgKGFzbjEpIE5VTEwgKi8KKwkJCWNoYXJfdHdvLT5wLm9uQmFzaXMgPSBBU04xX05VTExfbmV3KCk7CisJCQlpZiAoIWNoYXJfdHdvLT5wLm9uQmFzaXMpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJGSUVMRElELCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQl9CisKKwlvayA9IDE7CisKK2VyciA6CWlmICh0bXApCisJCUJOX2ZyZWUodG1wKTsKKwlyZXR1cm4ob2spOworfQorCitzdGF0aWMgaW50IGVjX2FzbjFfZ3JvdXAyY3VydmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBYOV82Ml9DVVJWRSAqY3VydmUpCisJeworCWludCAgICAgICAgICAgb2s9MCwgbmlkOworCUJJR05VTSAgICAgICAgKnRtcF8xPU5VTEwsICp0bXBfMj1OVUxMOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcl8xPU5VTEwsICpidWZmZXJfMj1OVUxMLAorCSAgICAgICAgICAgICAgKmFfYnVmPU5VTEwsICpiX2J1Zj1OVUxMOworCXNpemVfdCAgICAgICAgbGVuXzEsIGxlbl8yOworCXVuc2lnbmVkIGNoYXIgY2hhcl96ZXJvID0gMDsKKworCWlmICghZ3JvdXAgfHwgIWN1cnZlIHx8ICFjdXJ2ZS0+YSB8fCAhY3VydmUtPmIpCisJCXJldHVybiAwOworCisJaWYgKCh0bXBfMSA9IEJOX25ldygpKSA9PSBOVUxMIHx8ICh0bXBfMiA9IEJOX25ldygpKSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJDVVJWRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJbmlkID0gRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKEVDX0dST1VQX21ldGhvZF9vZihncm91cCkpOworCisJLyogZ2V0IGEgYW5kIGIgKi8KKwlpZiAobmlkID09IE5JRF9YOV82Ml9wcmltZV9maWVsZCkKKwkJeworCQlpZiAoIUVDX0dST1VQX2dldF9jdXJ2ZV9HRnAoZ3JvdXAsIE5VTEwsIHRtcF8xLCB0bXBfMiwgTlVMTCkpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyQ1VSVkUsIEVSUl9SX0VDX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVsc2UJLyogbmlkID09IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQgKi8KKwkJeworCQlpZiAoIUVDX0dST1VQX2dldF9jdXJ2ZV9HRjJtKGdyb3VwLCBOVUxMLCB0bXBfMSwgdG1wXzIsIE5VTEwpKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMkNVUlZFLCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCWxlbl8xID0gKHNpemVfdClCTl9udW1fYnl0ZXModG1wXzEpOworCWxlbl8yID0gKHNpemVfdClCTl9udW1fYnl0ZXModG1wXzIpOworCisJaWYgKGxlbl8xID09IDApCisJCXsKKwkJLyogbGVuXzEgPT0gMCA9PiBhID09IDAgKi8KKwkJYV9idWYgPSAmY2hhcl96ZXJvOworCQlsZW5fMSA9IDE7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKChidWZmZXJfMSA9IE9QRU5TU0xfbWFsbG9jKGxlbl8xKSkgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJDVVJWRSwKKwkJCSAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoIChsZW5fMSA9IEJOX2JuMmJpbih0bXBfMSwgYnVmZmVyXzEpKSA9PSAwKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMkNVUlZFLCBFUlJfUl9CTl9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWFfYnVmID0gYnVmZmVyXzE7CisJCX0KKworCWlmIChsZW5fMiA9PSAwKQorCQl7CisJCS8qIGxlbl8yID09IDAgPT4gYiA9PSAwICovCisJCWJfYnVmID0gJmNoYXJfemVybzsKKwkJbGVuXzIgPSAxOworCQl9CisJZWxzZQorCQl7CisJCWlmICgoYnVmZmVyXzIgPSBPUEVOU1NMX21hbGxvYyhsZW5fMikpID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyQ1VSVkUsCisJCQkgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKCAobGVuXzIgPSBCTl9ibjJiaW4odG1wXzIsIGJ1ZmZlcl8yKSkgPT0gMCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJDVVJWRSwgRVJSX1JfQk5fTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQliX2J1ZiA9IGJ1ZmZlcl8yOworCQl9CisJCisJLyogc2V0IGEgYW5kIGIgKi8KKwlpZiAoIU1fQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KGN1cnZlLT5hLCBhX2J1ZiwgbGVuXzEpIHx8CisJICAgICFNX0FTTjFfT0NURVRfU1RSSU5HX3NldChjdXJ2ZS0+YiwgYl9idWYsIGxlbl8yKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyQ1VSVkUsIEVSUl9SX0FTTjFfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwkKKwkvKiBzZXQgdGhlIHNlZWQgKG9wdGlvbmFsKSAqLworCWlmIChncm91cC0+c2VlZCkKKwkJewkKKwkJaWYgKCFjdXJ2ZS0+c2VlZCkKKwkJCWlmICgoY3VydmUtPnNlZWQgPSBBU04xX0JJVF9TVFJJTkdfbmV3KCkpID09IE5VTEwpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJDVVJWRSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJY3VydmUtPnNlZWQtPmZsYWdzICY9IH4oQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlR8MHgwNyk7CisJCWN1cnZlLT5zZWVkLT5mbGFncyB8PSBBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVDsKKwkJaWYgKCFBU04xX0JJVF9TVFJJTkdfc2V0KGN1cnZlLT5zZWVkLCBncm91cC0+c2VlZCwgCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWdyb3VwLT5zZWVkX2xlbikpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyQ1VSVkUsIEVSUl9SX0FTTjFfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWlmIChjdXJ2ZS0+c2VlZCkKKwkJCXsKKwkJCUFTTjFfQklUX1NUUklOR19mcmVlKGN1cnZlLT5zZWVkKTsKKwkJCWN1cnZlLT5zZWVkID0gTlVMTDsKKwkJCX0KKwkJfQorCisJb2sgPSAxOworCitlcnI6CWlmIChidWZmZXJfMSkKKwkJT1BFTlNTTF9mcmVlKGJ1ZmZlcl8xKTsKKwlpZiAoYnVmZmVyXzIpCisJCU9QRU5TU0xfZnJlZShidWZmZXJfMik7CisJaWYgKHRtcF8xKQorCQlCTl9mcmVlKHRtcF8xKTsKKwlpZiAodG1wXzIpCisJCUJOX2ZyZWUodG1wXzIpOworCXJldHVybihvayk7CisJfQorCitzdGF0aWMgRUNQQVJBTUVURVJTICplY19hc24xX2dyb3VwMnBhcmFtZXRlcnMoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDUEFSQU1FVEVSUyAqcGFyYW0pCisJeworCWludAlvaz0wOworCXNpemVfdCAgbGVuPTA7CisJRUNQQVJBTUVURVJTICAgKnJldD1OVUxMOworCUJJR05VTQkgICAgICAgKnRtcD1OVUxMOworCXVuc2lnbmVkIGNoYXIgICpidWZmZXI9TlVMTDsKKwljb25zdCBFQ19QT0lOVCAqcG9pbnQ9TlVMTDsKKwlwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtOworCisJaWYgKCh0bXAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyUEFSQU1FVEVSUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHBhcmFtID09IE5VTEwpCisJeworCQlpZiAoKHJldCA9IEVDUEFSQU1FVEVSU19uZXcoKSkgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJQQVJBTUVURVJTLCAKKwkJCSAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCX0KKwllbHNlCisJCXJldCA9IHBhcmFtOworCisJLyogc2V0IHRoZSB2ZXJzaW9uIChhbHdheXMgb25lKSAqLworCXJldC0+dmVyc2lvbiA9IChsb25nKTB4MTsKKworCS8qIHNldCB0aGUgZmllbGRJRCAqLworCWlmICghZWNfYXNuMV9ncm91cDJmaWVsZGlkKGdyb3VwLCByZXQtPmZpZWxkSUQpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJQQVJBTUVURVJTLCBFUlJfUl9FQ19MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogc2V0IHRoZSBjdXJ2ZSAqLworCWlmICghZWNfYXNuMV9ncm91cDJjdXJ2ZShncm91cCwgcmV0LT5jdXJ2ZSkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMlBBUkFNRVRFUlMsIEVSUl9SX0VDX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBzZXQgdGhlIGJhc2UgcG9pbnQgKi8KKwlpZiAoKHBvaW50ID0gRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoZ3JvdXApKSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJQQVJBTUVURVJTLCBFQ19SX1VOREVGSU5FRF9HRU5FUkFUT1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJZm9ybSA9IEVDX0dST1VQX2dldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oZ3JvdXApOworCisJbGVuID0gRUNfUE9JTlRfcG9pbnQyb2N0KGdyb3VwLCBwb2ludCwgZm9ybSwgTlVMTCwgbGVuLCBOVUxMKTsKKwlpZiAobGVuID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMlBBUkFNRVRFUlMsIEVSUl9SX0VDX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKChidWZmZXIgPSBPUEVOU1NMX21hbGxvYyhsZW4pKSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJQQVJBTUVURVJTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCFFQ19QT0lOVF9wb2ludDJvY3QoZ3JvdXAsIHBvaW50LCBmb3JtLCBidWZmZXIsIGxlbiwgTlVMTCkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMlBBUkFNRVRFUlMsIEVSUl9SX0VDX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKHJldC0+YmFzZSA9PSBOVUxMICYmIChyZXQtPmJhc2UgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKSkgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyUEFSQU1FVEVSUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmICghQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KHJldC0+YmFzZSwgYnVmZmVyLCBsZW4pKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9HUk9VUDJQQVJBTUVURVJTLCBFUlJfUl9BU04xX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBzZXQgdGhlIG9yZGVyICovCisJaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIHRtcCwgTlVMTCkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMlBBUkFNRVRFUlMsIEVSUl9SX0VDX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJcmV0LT5vcmRlciA9IEJOX3RvX0FTTjFfSU5URUdFUih0bXAsIHJldC0+b3JkZXIpOworCWlmIChyZXQtPm9yZGVyID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMlBBUkFNRVRFUlMsIEVSUl9SX0FTTjFfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIHNldCB0aGUgY29mYWN0b3IgKG9wdGlvbmFsKSAqLworCWlmIChFQ19HUk9VUF9nZXRfY29mYWN0b3IoZ3JvdXAsIHRtcCwgTlVMTCkpCisJCXsKKwkJcmV0LT5jb2ZhY3RvciA9IEJOX3RvX0FTTjFfSU5URUdFUih0bXAsIHJldC0+Y29mYWN0b3IpOworCQlpZiAocmV0LT5jb2ZhY3RvciA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX0dST1VQMlBBUkFNRVRFUlMsIEVSUl9SX0FTTjFfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlvayA9IDE7CisKK2VyciA6CWlmKCFvaykKKwkJeworCQlpZiAocmV0ICYmICFwYXJhbSkKKwkJCUVDUEFSQU1FVEVSU19mcmVlKHJldCk7CisJCXJldCA9IE5VTEw7CisJCX0KKwlpZiAodG1wKQorCQlCTl9mcmVlKHRtcCk7CisJaWYgKGJ1ZmZlcikKKwkJT1BFTlNTTF9mcmVlKGJ1ZmZlcik7CisJcmV0dXJuKHJldCk7CisJfQorCitFQ1BLUEFSQU1FVEVSUyAqZWNfYXNuMV9ncm91cDJwa3BhcmFtZXRlcnMoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ1BLUEFSQU1FVEVSUyAqcGFyYW1zKQorCXsKKwlpbnQgICAgICAgICAgICBvayA9IDEsIHRtcDsKKwlFQ1BLUEFSQU1FVEVSUyAqcmV0ID0gcGFyYW1zOworCisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCWlmICgocmV0ID0gRUNQS1BBUkFNRVRFUlNfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfR1JPVVAyUEtQQVJBTUVURVJTLCAKKwkJCSAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWlmIChyZXQtPnR5cGUgPT0gMCAmJiByZXQtPnZhbHVlLm5hbWVkX2N1cnZlKQorCQkJQVNOMV9PQkpFQ1RfZnJlZShyZXQtPnZhbHVlLm5hbWVkX2N1cnZlKTsKKwkJZWxzZSBpZiAocmV0LT50eXBlID09IDEgJiYgcmV0LT52YWx1ZS5wYXJhbWV0ZXJzKQorCQkJRUNQQVJBTUVURVJTX2ZyZWUocmV0LT52YWx1ZS5wYXJhbWV0ZXJzKTsKKwkJfQorCisJaWYgKEVDX0dST1VQX2dldF9hc24xX2ZsYWcoZ3JvdXApKQorCQl7CisJCS8qIHVzZSB0aGUgYXNuMSBPSUQgdG8gZGVzY3JpYmUgdGhlCisJCSAqIHRoZSBlbGxpcHRpYyBjdXJ2ZSBwYXJhbWV0ZXJzCisJCSAqLworCQl0bXAgPSBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZShncm91cCk7CisJCWlmICh0bXApCisJCQl7CisJCQlyZXQtPnR5cGUgPSAwOworCQkJaWYgKChyZXQtPnZhbHVlLm5hbWVkX2N1cnZlID0gT0JKX25pZDJvYmoodG1wKSkgPT0gTlVMTCkKKwkJCQlvayA9IDA7CisJCQl9CisJCWVsc2UKKwkJCS8qIHdlIGRvbid0IGttb3cgdGhlIG5pZCA9PiBFUlJPUiAqLworCQkJb2sgPSAwOworCQl9CisJZWxzZQorCQl7CQorCQkvKiB1c2UgdGhlIEVDUEFSQU1FVEVSUyBzdHJ1Y3R1cmUgKi8KKwkJcmV0LT50eXBlID0gMTsKKwkJaWYgKChyZXQtPnZhbHVlLnBhcmFtZXRlcnMgPSBlY19hc24xX2dyb3VwMnBhcmFtZXRlcnMoCisJCSAgICAgZ3JvdXAsIE5VTEwpKSA9PSBOVUxMKQorCQkJb2sgPSAwOworCQl9CisKKwlpZiAoIW9rKQorCQl7CisJCUVDUEtQQVJBTUVURVJTX2ZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIEVDX0dST1VQICplY19hc24xX3BhcmFtZXRlcnMyZ3JvdXAoY29uc3QgRUNQQVJBTUVURVJTICpwYXJhbXMpCisJeworCWludAkJCW9rID0gMCwgdG1wOworCUVDX0dST1VQCQkqcmV0ID0gTlVMTDsKKwlCSUdOVU0JCQkqcCA9IE5VTEwsICphID0gTlVMTCwgKmIgPSBOVUxMOworCUVDX1BPSU5UCQkqcG9pbnQ9TlVMTDsKKwlsb25nICAgIAkJZmllbGRfYml0czsKKworCWlmICghcGFyYW1zLT5maWVsZElEIHx8ICFwYXJhbXMtPmZpZWxkSUQtPmZpZWxkVHlwZSB8fCAKKwkgICAgIXBhcmFtcy0+ZmllbGRJRC0+cC5wdHIpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19BU04xX1BBUkFNRVRFUlMyR1JPVVAsIEVDX1JfQVNOMV9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBub3cgZXh0cmFjdCB0aGUgY3VydmUgcGFyYW1ldGVycyBhIGFuZCBiICovCisJaWYgKCFwYXJhbXMtPmN1cnZlIHx8ICFwYXJhbXMtPmN1cnZlLT5hIHx8IAorCSAgICAhcGFyYW1zLT5jdXJ2ZS0+YS0+ZGF0YSB8fCAhcGFyYW1zLT5jdXJ2ZS0+YiB8fAorCSAgICAhcGFyYW1zLT5jdXJ2ZS0+Yi0+ZGF0YSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRUNfUl9BU04xX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKwlhID0gQk5fYmluMmJuKHBhcmFtcy0+Y3VydmUtPmEtPmRhdGEsIHBhcmFtcy0+Y3VydmUtPmEtPmxlbmd0aCwgTlVMTCk7CisJaWYgKGEgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRVJSX1JfQk5fTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwliID0gQk5fYmluMmJuKHBhcmFtcy0+Y3VydmUtPmItPmRhdGEsIHBhcmFtcy0+Y3VydmUtPmItPmxlbmd0aCwgTlVMTCk7CisJaWYgKGIgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRVJSX1JfQk5fTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIGdldCB0aGUgZmllbGQgcGFyYW1ldGVycyAqLworCXRtcCA9IE9CSl9vYmoybmlkKHBhcmFtcy0+ZmllbGRJRC0+ZmllbGRUeXBlKTsKKworCWlmICh0bXAgPT0gTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCkKKwkJeworCQlYOV82Ml9DSEFSQUNURVJJU1RJQ19UV08gKmNoYXJfdHdvOworCisJCWNoYXJfdHdvID0gcGFyYW1zLT5maWVsZElELT5wLmNoYXJfdHdvOworCisJCWZpZWxkX2JpdHMgPSBjaGFyX3R3by0+bTsKKwkJaWYgKGZpZWxkX2JpdHMgPiBPUEVOU1NMX0VDQ19NQVhfRklFTERfQklUUykKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFQ19SX0ZJRUxEX1RPT19MQVJHRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlpZiAoKHAgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBnZXQgdGhlIGJhc2UgdHlwZSAqLworCQl0bXAgPSBPQkpfb2JqMm5pZChjaGFyX3R3by0+dHlwZSk7CisKKwkJaWYgKHRtcCA9PSAgTklEX1g5XzYyX3RwQmFzaXMpCisJCQl7CisJCQlsb25nIHRtcF9sb25nOworCisJCQlpZiAoIWNoYXJfdHdvLT5wLnRwQmFzaXMpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFQ19SX0FTTjFfRVJST1IpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJdG1wX2xvbmcgPSBBU04xX0lOVEVHRVJfZ2V0KGNoYXJfdHdvLT5wLnRwQmFzaXMpOworCisJCQlpZiAoIShjaGFyX3R3by0+bSA+IHRtcF9sb25nICYmIHRtcF9sb25nID4gMCkpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFQ19SX0lOVkFMSURfVFJJTk9NSUFMX0JBU0lTKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkKKwkJCS8qIGNyZWF0ZSB0aGUgcG9seW5vbWlhbCAqLworCQkJaWYgKCFCTl9zZXRfYml0KHAsIChpbnQpY2hhcl90d28tPm0pKQorCQkJCWdvdG8gZXJyOworCQkJaWYgKCFCTl9zZXRfYml0KHAsIChpbnQpdG1wX2xvbmcpKQorCQkJCWdvdG8gZXJyOworCQkJaWYgKCFCTl9zZXRfYml0KHAsIDApKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlIGlmICh0bXAgPT0gTklEX1g5XzYyX3BwQmFzaXMpCisJCQl7CisJCQlYOV82Ml9QRU5UQU5PTUlBTCAqcGVudGE7CisKKwkJCXBlbnRhID0gY2hhcl90d28tPnAucHBCYXNpczsKKwkJCWlmICghcGVudGEpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFQ19SX0FTTjFfRVJST1IpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJaWYgKCEoY2hhcl90d28tPm0gPiBwZW50YS0+azMgJiYgcGVudGEtPmszID4gcGVudGEtPmsyICYmIHBlbnRhLT5rMiA+IHBlbnRhLT5rMSAmJiBwZW50YS0+azEgPiAwKSkKKwkJCQl7CisJCQkJRUNlcnIoRUNfRl9FQ19BU04xX1BBUkFNRVRFUlMyR1JPVVAsIEVDX1JfSU5WQUxJRF9QRU5UQU5PTUlBTF9CQVNJUyk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJCisJCQkvKiBjcmVhdGUgdGhlIHBvbHlub21pYWwgKi8KKwkJCWlmICghQk5fc2V0X2JpdChwLCAoaW50KWNoYXJfdHdvLT5tKSkgZ290byBlcnI7CisJCQlpZiAoIUJOX3NldF9iaXQocCwgKGludClwZW50YS0+azEpKSBnb3RvIGVycjsKKwkJCWlmICghQk5fc2V0X2JpdChwLCAoaW50KXBlbnRhLT5rMikpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9zZXRfYml0KHAsIChpbnQpcGVudGEtPmszKSkgZ290byBlcnI7CisJCQlpZiAoIUJOX3NldF9iaXQocCwgMCkpIGdvdG8gZXJyOworCQkJfQorCQllbHNlIGlmICh0bXAgPT0gTklEX1g5XzYyX29uQmFzaXMpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRUNfUl9OT1RfSU1QTEVNRU5URUQpOworCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UgLyogZXJyb3IgKi8KKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFQ19SX0FTTjFfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJLyogY3JlYXRlIHRoZSBFQ19HUk9VUCBzdHJ1Y3R1cmUgKi8KKwkJcmV0ID0gRUNfR1JPVVBfbmV3X2N1cnZlX0dGMm0ocCwgYSwgYiwgTlVMTCk7CisJCX0KKwllbHNlIGlmICh0bXAgPT0gTklEX1g5XzYyX3ByaW1lX2ZpZWxkKQorCQl7CisJCS8qIHdlIGhhdmUgYSBjdXJ2ZSBvdmVyIGEgcHJpbWUgZmllbGQgKi8KKwkJLyogZXh0cmFjdCB0aGUgcHJpbWUgbnVtYmVyICovCisJCWlmICghcGFyYW1zLT5maWVsZElELT5wLnByaW1lKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX1BBUkFNRVRFUlMyR1JPVVAsIEVDX1JfQVNOMV9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcCA9IEFTTjFfSU5URUdFUl90b19CTihwYXJhbXMtPmZpZWxkSUQtPnAucHJpbWUsIE5VTEwpOworCQlpZiAocCA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX1BBUkFNRVRFUlMyR1JPVVAsIEVSUl9SX0FTTjFfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChCTl9pc19uZWdhdGl2ZShwKSB8fCBCTl9pc196ZXJvKHApKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX1BBUkFNRVRFUlMyR1JPVVAsIEVDX1JfSU5WQUxJRF9GSUVMRCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlmaWVsZF9iaXRzID0gQk5fbnVtX2JpdHMocCk7CisJCWlmIChmaWVsZF9iaXRzID4gT1BFTlNTTF9FQ0NfTUFYX0ZJRUxEX0JJVFMpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRUNfUl9GSUVMRF9UT09fTEFSR0UpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJLyogY3JlYXRlIHRoZSBFQ19HUk9VUCBzdHJ1Y3R1cmUgKi8KKwkJcmV0ID0gRUNfR1JPVVBfbmV3X2N1cnZlX0dGcChwLCBhLCBiLCBOVUxMKTsKKwkJfQorCWVsc2UKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRUNfUl9JTlZBTElEX0ZJRUxEKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRVJSX1JfRUNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIGV4dHJhY3Qgc2VlZCAob3B0aW9uYWwpICovCisJaWYgKHBhcmFtcy0+Y3VydmUtPnNlZWQgIT0gTlVMTCkKKwkJeworCQlpZiAocmV0LT5zZWVkICE9IE5VTEwpCisJCQlPUEVOU1NMX2ZyZWUocmV0LT5zZWVkKTsKKwkJaWYgKCEocmV0LT5zZWVkID0gT1BFTlNTTF9tYWxsb2MocGFyYW1zLT5jdXJ2ZS0+c2VlZC0+bGVuZ3RoKSkpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgCisJCQkgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJbWVtY3B5KHJldC0+c2VlZCwgcGFyYW1zLT5jdXJ2ZS0+c2VlZC0+ZGF0YSwgCisJCSAgICAgICBwYXJhbXMtPmN1cnZlLT5zZWVkLT5sZW5ndGgpOworCQlyZXQtPnNlZWRfbGVuID0gcGFyYW1zLT5jdXJ2ZS0+c2VlZC0+bGVuZ3RoOworCQl9CisKKwlpZiAoIXBhcmFtcy0+b3JkZXIgfHwgIXBhcmFtcy0+YmFzZSB8fCAhcGFyYW1zLT5iYXNlLT5kYXRhKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFQ19SX0FTTjFfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKChwb2ludCA9IEVDX1BPSU5UX25ldyhyZXQpKSA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIHNldCB0aGUgcG9pbnQgY29udmVyc2lvbiBmb3JtICovCisJRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShyZXQsIChwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCkKKwkJCQkocGFyYW1zLT5iYXNlLT5kYXRhWzBdICYgfjB4MDEpKTsKKworCS8qIGV4dHJhY3QgdGhlIGVjIHBvaW50ICovCisJaWYgKCFFQ19QT0lOVF9vY3QycG9pbnQocmV0LCBwb2ludCwgcGFyYW1zLT5iYXNlLT5kYXRhLCAKKwkJICAgICAgICAgICAgICAgIHBhcmFtcy0+YmFzZS0+bGVuZ3RoLCBOVUxMKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRVJSX1JfRUNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIGV4dHJhY3QgdGhlIG9yZGVyICovCisJaWYgKChhID0gQVNOMV9JTlRFR0VSX3RvX0JOKHBhcmFtcy0+b3JkZXIsIGEpKSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFUlJfUl9BU04xX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKEJOX2lzX25lZ2F0aXZlKGEpIHx8IEJOX2lzX3plcm8oYSkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19BU04xX1BBUkFNRVRFUlMyR1JPVVAsIEVDX1JfSU5WQUxJRF9HUk9VUF9PUkRFUik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKEJOX251bV9iaXRzKGEpID4gKGludClmaWVsZF9iaXRzICsgMSkgLyogSGFzc2UgYm91bmQgKi8KKwkJeworCQlFQ2VycihFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCwgRUNfUl9JTlZBTElEX0dST1VQX09SREVSKTsKKwkJZ290byBlcnI7CisJCX0KKwkKKwkvKiBleHRyYWN0IHRoZSBjb2ZhY3RvciAob3B0aW9uYWwpICovCisJaWYgKHBhcmFtcy0+Y29mYWN0b3IgPT0gTlVMTCkKKwkJeworCQlpZiAoYikKKwkJCXsKKwkJCUJOX2ZyZWUoYik7CisJCQliID0gTlVMTDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJaWYgKChiID0gQVNOMV9JTlRFR0VSX3RvX0JOKHBhcmFtcy0+Y29mYWN0b3IsIGIpKSA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX1BBUkFNRVRFUlMyR1JPVVAsIEVSUl9SX0FTTjFfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCS8qIHNldCB0aGUgZ2VuZXJhdG9yLCBvcmRlciBhbmQgY29mYWN0b3IgKGlmIHByZXNlbnQpICovCisJaWYgKCFFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKHJldCwgcG9pbnQsIGEsIGIpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQLCBFUlJfUl9FQ19MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCisJb2sgPSAxOworCitlcnI6CWlmICghb2spCisJCXsKKwkJaWYgKHJldCkgCisJCQlFQ19HUk9VUF9jbGVhcl9mcmVlKHJldCk7CisJCXJldCA9IE5VTEw7CisJCX0KKworCWlmIChwKQkKKwkJQk5fZnJlZShwKTsKKwlpZiAoYSkJCisJCUJOX2ZyZWUoYSk7CisJaWYgKGIpCQorCQlCTl9mcmVlKGIpOworCWlmIChwb2ludCkJCisJCUVDX1BPSU5UX2ZyZWUocG9pbnQpOworCXJldHVybihyZXQpOworfQorCitFQ19HUk9VUCAqZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAoY29uc3QgRUNQS1BBUkFNRVRFUlMgKnBhcmFtcykKKwl7CisJRUNfR1JPVVAgKnJldD1OVUxMOworCWludCAgICAgIHRtcD0wOworCisJaWYgKHBhcmFtcyA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QS1BBUkFNRVRFUlMyR1JPVVAsIAorCQkgICAgICBFQ19SX01JU1NJTkdfUEFSQU1FVEVSUyk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAocGFyYW1zLT50eXBlID09IDApCisJCXsgLyogdGhlIGN1cnZlIGlzIGdpdmVuIGJ5IGFuIE9JRCAqLworCQl0bXAgPSBPQkpfb2JqMm5pZChwYXJhbXMtPnZhbHVlLm5hbWVkX2N1cnZlKTsKKwkJaWYgKChyZXQgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZSh0bXApKSA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19BU04xX1BLUEFSQU1FVEVSUzJHUk9VUCwgCisJCQkgICAgICBFQ19SX0VDX0dST1VQX05FV19CWV9OQU1FX0ZBSUxVUkUpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCUVDX0dST1VQX3NldF9hc24xX2ZsYWcocmV0LCBPUEVOU1NMX0VDX05BTUVEX0NVUlZFKTsKKwkJfQorCWVsc2UgaWYgKHBhcmFtcy0+dHlwZSA9PSAxKQorCQl7IC8qIHRoZSBwYXJhbWV0ZXJzIGFyZSBnaXZlbiBieSBhIEVDUEFSQU1FVEVSUworCQkgICAqIHN0cnVjdHVyZSAqLworCQlyZXQgPSBlY19hc24xX3BhcmFtZXRlcnMyZ3JvdXAocGFyYW1zLT52YWx1ZS5wYXJhbWV0ZXJzKTsKKwkJaWYgKCFyZXQpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0FTTjFfUEtQQVJBTUVURVJTMkdST1VQLCBFUlJfUl9FQ19MSUIpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCUVDX0dST1VQX3NldF9hc24xX2ZsYWcocmV0LCAweDApOworCQl9CisJZWxzZSBpZiAocGFyYW1zLT50eXBlID09IDIpCisJCXsgLyogaW1wbGljaXRseUNBICovCisJCXJldHVybiBOVUxMOworCQl9CisJZWxzZQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfQVNOMV9QS1BBUkFNRVRFUlMyR1JPVVAsIEVDX1JfQVNOMV9FUlJPUik7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXR1cm4gcmV0OworCX0KKworLyogRUNfR1JPVVAgPC0+IERFUiBlbmNvZGluZyBvZiBFQ1BLUEFSQU1FVEVSUyAqLworCitFQ19HUk9VUCAqZDJpX0VDUEtQYXJhbWV0ZXJzKEVDX0dST1VQICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbikKKwl7CisJRUNfR1JPVVAJKmdyb3VwICA9IE5VTEw7CisJRUNQS1BBUkFNRVRFUlMJKnBhcmFtcyA9IE5VTEw7CisKKwlpZiAoKHBhcmFtcyA9IGQyaV9FQ1BLUEFSQU1FVEVSUyhOVUxMLCBpbiwgbGVuKSkgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0QySV9FQ1BLUEFSQU1FVEVSUywgRUNfUl9EMklfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CisJCUVDUEtQQVJBTUVURVJTX2ZyZWUocGFyYW1zKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwkKKwlpZiAoKGdyb3VwID0gZWNfYXNuMV9wa3BhcmFtZXRlcnMyZ3JvdXAocGFyYW1zKSkgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0QySV9FQ1BLUEFSQU1FVEVSUywgRUNfUl9QS1BBUkFNRVRFUlMyR1JPVVBfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOyAKKwkJfQorCisJCisJaWYgKGEgJiYgKmEpCisJCUVDX0dST1VQX2NsZWFyX2ZyZWUoKmEpOworCWlmIChhKQorCQkqYSA9IGdyb3VwOworCisJRUNQS1BBUkFNRVRFUlNfZnJlZShwYXJhbXMpOworCXJldHVybihncm91cCk7CisJfQorCitpbnQgaTJkX0VDUEtQYXJhbWV0ZXJzKGNvbnN0IEVDX0dST1VQICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KQorCXsKKwlpbnQJCXJldD0wOworCUVDUEtQQVJBTUVURVJTCSp0bXAgPSBlY19hc24xX2dyb3VwMnBrcGFyYW1ldGVycyhhLCBOVUxMKTsKKwlpZiAodG1wID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9JMkRfRUNQS1BBUkFNRVRFUlMsIEVDX1JfR1JPVVAyUEtQQVJBTUVURVJTX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmICgocmV0ID0gaTJkX0VDUEtQQVJBTUVURVJTKHRtcCwgb3V0KSkgPT0gMCkKKwkJeworCQlFQ2VycihFQ19GX0kyRF9FQ1BLUEFSQU1FVEVSUywgRUNfUl9JMkRfRUNQS1BBUkFNRVRFUlNfRkFJTFVSRSk7CisJCUVDUEtQQVJBTUVURVJTX2ZyZWUodG1wKTsKKwkJcmV0dXJuIDA7CisJCX0JCisJRUNQS1BBUkFNRVRFUlNfZnJlZSh0bXApOworCXJldHVybihyZXQpOworCX0KKworLyogc29tZSBFQ19LRVkgZnVuY3Rpb25zICovCisKK0VDX0tFWSAqZDJpX0VDUHJpdmF0ZUtleShFQ19LRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKQorCXsKKwlpbnQgICAgICAgICAgICAgb2s9MDsKKwlFQ19LRVkgICAgICAgICAgKnJldD1OVUxMOworCUVDX1BSSVZBVEVLRVkgICAqcHJpdl9rZXk9TlVMTDsKKworCWlmICgocHJpdl9rZXkgPSBFQ19QUklWQVRFS0VZX25ldygpKSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRDJJX0VDUFJJVkFURUtFWSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYgKChwcml2X2tleSA9IGQyaV9FQ19QUklWQVRFS0VZKCZwcml2X2tleSwgaW4sIGxlbikpID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9EMklfRUNQUklWQVRFS0VZLCBFUlJfUl9FQ19MSUIpOworCQlFQ19QUklWQVRFS0VZX2ZyZWUocHJpdl9rZXkpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYgKGEgPT0gTlVMTCB8fCAqYSA9PSBOVUxMKQorCQl7CisJCWlmICgocmV0ID0gRUNfS0VZX25ldygpKSA9PSBOVUxMKQkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRDJJX0VDUFJJVkFURUtFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoYSkKKwkJCSphID0gcmV0OworCQl9CisJZWxzZQorCQlyZXQgPSAqYTsKKworCWlmIChwcml2X2tleS0+cGFyYW1ldGVycykKKwkJeworCQlpZiAocmV0LT5ncm91cCkKKwkJCUVDX0dST1VQX2NsZWFyX2ZyZWUocmV0LT5ncm91cCk7CisJCXJldC0+Z3JvdXAgPSBlY19hc24xX3BrcGFyYW1ldGVyczJncm91cChwcml2X2tleS0+cGFyYW1ldGVycyk7CisJCX0KKworCWlmIChyZXQtPmdyb3VwID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9EMklfRUNQUklWQVRFS0VZLCBFUlJfUl9FQ19MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCisJcmV0LT52ZXJzaW9uID0gcHJpdl9rZXktPnZlcnNpb247CisKKwlpZiAocHJpdl9rZXktPnByaXZhdGVLZXkpCisJCXsKKwkJcmV0LT5wcml2X2tleSA9IEJOX2JpbjJibigKKwkJCU1fQVNOMV9TVFJJTkdfZGF0YShwcml2X2tleS0+cHJpdmF0ZUtleSksCisJCQlNX0FTTjFfU1RSSU5HX2xlbmd0aChwcml2X2tleS0+cHJpdmF0ZUtleSksCisJCQlyZXQtPnByaXZfa2V5KTsKKwkJaWYgKHJldC0+cHJpdl9rZXkgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRDJJX0VDUFJJVkFURUtFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVSUl9SX0JOX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlFQ2VycihFQ19GX0QySV9FQ1BSSVZBVEVLRVksIAorICAgICAgICAgICAgICAgICAgICAgIEVDX1JfTUlTU0lOR19QUklWQVRFX0tFWSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAocHJpdl9rZXktPnB1YmxpY0tleSkKKwkJeworCQljb25zdCB1bnNpZ25lZCBjaGFyICpwdWJfb2N0OworCQlzaXplX3QgcHViX29jdF9sZW47CisKKwkJaWYgKHJldC0+cHViX2tleSkKKwkJCUVDX1BPSU5UX2NsZWFyX2ZyZWUocmV0LT5wdWJfa2V5KTsKKwkJcmV0LT5wdWJfa2V5ID0gRUNfUE9JTlRfbmV3KHJldC0+Z3JvdXApOworCQlpZiAocmV0LT5wdWJfa2V5ID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0QySV9FQ1BSSVZBVEVLRVksIEVSUl9SX0VDX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcHViX29jdCAgICAgPSBNX0FTTjFfU1RSSU5HX2RhdGEocHJpdl9rZXktPnB1YmxpY0tleSk7CisJCXB1Yl9vY3RfbGVuID0gTV9BU04xX1NUUklOR19sZW5ndGgocHJpdl9rZXktPnB1YmxpY0tleSk7CisJCS8qIHNhdmUgdGhlIHBvaW50IGNvbnZlcnNpb24gZm9ybSAqLworCQlyZXQtPmNvbnZfZm9ybSA9IChwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCkocHViX29jdFswXSAmIH4weDAxKTsKKwkJaWYgKCFFQ19QT0lOVF9vY3QycG9pbnQocmV0LT5ncm91cCwgcmV0LT5wdWJfa2V5LAorCQkJcHViX29jdCwgcHViX29jdF9sZW4sIE5VTEwpKQorCQkJeworCQkJRUNlcnIoRUNfRl9EMklfRUNQUklWQVRFS0VZLCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCW9rID0gMTsKK2VycjoKKwlpZiAoIW9rKQorCQl7CisJCWlmIChyZXQpCisJCQlFQ19LRVlfZnJlZShyZXQpOworCQlyZXQgPSBOVUxMOworCQl9CisKKwlpZiAocHJpdl9rZXkpCisJCUVDX1BSSVZBVEVLRVlfZnJlZShwcml2X2tleSk7CisKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludAlpMmRfRUNQcml2YXRlS2V5KEVDX0tFWSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCkKKwl7CisJaW50ICAgICAgICAgICAgIHJldD0wLCBvaz0wOworCXVuc2lnbmVkIGNoYXIgICAqYnVmZmVyPU5VTEw7CisJc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW49MCwgdG1wX2xlbjsKKwlFQ19QUklWQVRFS0VZICAgKnByaXZfa2V5PU5VTEw7CisKKwlpZiAoYSA9PSBOVUxMIHx8IGEtPmdyb3VwID09IE5VTEwgfHwgYS0+cHJpdl9rZXkgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0kyRF9FQ1BSSVZBVEVLRVksCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICgocHJpdl9rZXkgPSBFQ19QUklWQVRFS0VZX25ldygpKSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfSTJEX0VDUFJJVkFURUtFWSwKKyAgICAgICAgICAgICAgICAgICAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlwcml2X2tleS0+dmVyc2lvbiA9IGEtPnZlcnNpb247CisKKwlidWZfbGVuID0gKHNpemVfdClCTl9udW1fYnl0ZXMoYS0+cHJpdl9rZXkpOworCWJ1ZmZlciA9IE9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4pOworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0kyRF9FQ1BSSVZBVEVLRVksCisgICAgICAgICAgICAgICAgICAgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCQorCWlmICghQk5fYm4yYmluKGEtPnByaXZfa2V5LCBidWZmZXIpKQorCQl7CisJCUVDZXJyKEVDX0ZfSTJEX0VDUFJJVkFURUtFWSwgRVJSX1JfQk5fTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICghTV9BU04xX09DVEVUX1NUUklOR19zZXQocHJpdl9rZXktPnByaXZhdGVLZXksIGJ1ZmZlciwgYnVmX2xlbikpCisJCXsKKwkJRUNlcnIoRUNfRl9JMkRfRUNQUklWQVRFS0VZLCBFUlJfUl9BU04xX0xJQik7CisJCWdvdG8gZXJyOworCQl9CQorCisJaWYgKCEoYS0+ZW5jX2ZsYWcgJiBFQ19QS0VZX05PX1BBUkFNRVRFUlMpKQorCQl7CisJCWlmICgocHJpdl9rZXktPnBhcmFtZXRlcnMgPSBlY19hc24xX2dyb3VwMnBrcGFyYW1ldGVycygKKwkJCWEtPmdyb3VwLCBwcml2X2tleS0+cGFyYW1ldGVycykpID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0kyRF9FQ1BSSVZBVEVLRVksIEVSUl9SX0VDX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJaWYgKCEoYS0+ZW5jX2ZsYWcgJiBFQ19QS0VZX05PX1BVQktFWSkpCisJCXsKKwkJcHJpdl9rZXktPnB1YmxpY0tleSA9IE1fQVNOMV9CSVRfU1RSSU5HX25ldygpOworCQlpZiAocHJpdl9rZXktPnB1YmxpY0tleSA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9JMkRfRUNQUklWQVRFS0VZLAorCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCXRtcF9sZW4gPSBFQ19QT0lOVF9wb2ludDJvY3QoYS0+Z3JvdXAsIGEtPnB1Yl9rZXksIAorCQkJCWEtPmNvbnZfZm9ybSwgTlVMTCwgMCwgTlVMTCk7CisKKwkJaWYgKHRtcF9sZW4gPiBidWZfbGVuKQorCQkJeworCQkJdW5zaWduZWQgY2hhciAqdG1wX2J1ZmZlciA9IE9QRU5TU0xfcmVhbGxvYyhidWZmZXIsIHRtcF9sZW4pOworCQkJaWYgKCF0bXBfYnVmZmVyKQorCQkJCXsKKwkJCQlFQ2VycihFQ19GX0kyRF9FQ1BSSVZBVEVLRVksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlidWZmZXIgPSB0bXBfYnVmZmVyOworCQkJYnVmX2xlbiA9IHRtcF9sZW47CisJCQl9CisKKwkJaWYgKCFFQ19QT0lOVF9wb2ludDJvY3QoYS0+Z3JvdXAsIGEtPnB1Yl9rZXksIAorCQkJYS0+Y29udl9mb3JtLCBidWZmZXIsIGJ1Zl9sZW4sIE5VTEwpKQorCQkJeworCQkJRUNlcnIoRUNfRl9JMkRfRUNQUklWQVRFS0VZLCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJcHJpdl9rZXktPnB1YmxpY0tleS0+ZmxhZ3MgJj0gfihBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVHwweDA3KTsKKwkJcHJpdl9rZXktPnB1YmxpY0tleS0+ZmxhZ3MgfD0gQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlQ7CisJCWlmICghTV9BU04xX0JJVF9TVFJJTkdfc2V0KHByaXZfa2V5LT5wdWJsaWNLZXksIGJ1ZmZlciwgCisJCQkJYnVmX2xlbikpCisJCQl7CisJCQlFQ2VycihFQ19GX0kyRF9FQ1BSSVZBVEVLRVksIEVSUl9SX0FTTjFfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAoKHJldCA9IGkyZF9FQ19QUklWQVRFS0VZKHByaXZfa2V5LCBvdXQpKSA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfSTJEX0VDUFJJVkFURUtFWSwgRVJSX1JfRUNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwlvaz0xOworZXJyOgorCWlmIChidWZmZXIpCisJCU9QRU5TU0xfZnJlZShidWZmZXIpOworCWlmIChwcml2X2tleSkKKwkJRUNfUFJJVkFURUtFWV9mcmVlKHByaXZfa2V5KTsKKwlyZXR1cm4ob2s/cmV0OjApOworCX0KKworaW50IGkyZF9FQ1BhcmFtZXRlcnMoRUNfS0VZICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KQorCXsKKwlpZiAoYSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfSTJEX0VDUEFSQU1FVEVSUywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gaTJkX0VDUEtQYXJhbWV0ZXJzKGEtPmdyb3VwLCBvdXQpOworCX0KKworRUNfS0VZICpkMmlfRUNQYXJhbWV0ZXJzKEVDX0tFWSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4pCisJeworCUVDX0tFWSAgICpyZXQ7CisKKwlpZiAoaW4gPT0gTlVMTCB8fCAqaW4gPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0QySV9FQ1BBUkFNRVRFUlMsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAoYSA9PSBOVUxMIHx8ICphID09IE5VTEwpCisJCXsKKwkJaWYgKChyZXQgPSBFQ19LRVlfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0QySV9FQ1BBUkFNRVRFUlMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQlpZiAoYSkKKwkJCSphID0gcmV0OworCQl9CisJZWxzZQorCQlyZXQgPSAqYTsKKworCWlmICghZDJpX0VDUEtQYXJhbWV0ZXJzKCZyZXQtPmdyb3VwLCBpbiwgbGVuKSkKKwkJeworCQlFQ2VycihFQ19GX0QySV9FQ1BBUkFNRVRFUlMsIEVSUl9SX0VDX0xJQik7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXR1cm4gcmV0OworCX0KKworRUNfS0VZICpvMmlfRUNQdWJsaWNLZXkoRUNfS0VZICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbikKKwl7CisJRUNfS0VZICpyZXQ9TlVMTDsKKworCWlmIChhID09IE5VTEwgfHwgKCphKSA9PSBOVUxMIHx8ICgqYSktPmdyb3VwID09IE5VTEwpCisJCXsKKwkJLyogc29ycnksIGJ1dCBhIEVDX0dST1VQLXN0cnVjdHVyIGlzIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgICAqIHRvIHNldCB0aGUgcHVibGljIGtleSAqLworCQlFQ2VycihFQ19GX08ySV9FQ1BVQkxJQ0tFWSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXQgPSAqYTsKKwlpZiAocmV0LT5wdWJfa2V5ID09IE5VTEwgJiYgCisJCShyZXQtPnB1Yl9rZXkgPSBFQ19QT0lOVF9uZXcocmV0LT5ncm91cCkpID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9PMklfRUNQVUJMSUNLRVksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoIUVDX1BPSU5UX29jdDJwb2ludChyZXQtPmdyb3VwLCByZXQtPnB1Yl9rZXksICppbiwgbGVuLCBOVUxMKSkKKwkJeworCQlFQ2VycihFQ19GX08ySV9FQ1BVQkxJQ0tFWSwgRVJSX1JfRUNfTElCKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkvKiBzYXZlIHRoZSBwb2ludCBjb252ZXJzaW9uIGZvcm0gKi8KKwlyZXQtPmNvbnZfZm9ybSA9IChwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCkoKmluWzBdICYgfjB4MDEpOworCSppbiArPSBsZW47CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBpMm9fRUNQdWJsaWNLZXkoRUNfS0VZICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KQorCXsKKyAgICAgICAgc2l6ZV90IGJ1Zl9sZW49MDsKKwlpbnQgbmV3X2J1ZmZlciA9IDA7CisKKyAgICAgICAgaWYgKGEgPT0gTlVMTCkgCisJCXsKKwkJRUNlcnIoRUNfRl9JMk9fRUNQVUJMSUNLRVksIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybiAwOworCQl9CisKKyAgICAgICAgYnVmX2xlbiA9IEVDX1BPSU5UX3BvaW50Mm9jdChhLT5ncm91cCwgYS0+cHViX2tleSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5jb252X2Zvcm0sIE5VTEwsIDAsIE5VTEwpOworCisJaWYgKG91dCA9PSBOVUxMIHx8IGJ1Zl9sZW4gPT0gMCkKKwkvKiBvdXQgPT0gTlVMTCA9PiBqdXN0IHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBvY3RldCBzdHJpbmcgKi8KKwkJcmV0dXJuIGJ1Zl9sZW47CisKKwlpZiAoKm91dCA9PSBOVUxMKQorCQl7CisJCWlmICgoKm91dCA9IE9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4pKSA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9JMk9fRUNQVUJMSUNLRVksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQluZXdfYnVmZmVyID0gMTsKKwkJfQorICAgICAgICBpZiAoIUVDX1BPSU5UX3BvaW50Mm9jdChhLT5ncm91cCwgYS0+cHViX2tleSwgYS0+Y29udl9mb3JtLAorCQkJCSpvdXQsIGJ1Zl9sZW4sIE5VTEwpKQorCQl7CisJCUVDZXJyKEVDX0ZfSTJPX0VDUFVCTElDS0VZLCBFUlJfUl9FQ19MSUIpOworCQlPUEVOU1NMX2ZyZWUoKm91dCk7CisJCSpvdXQgPSBOVUxMOworCQlyZXR1cm4gMDsKKwkJfQorCWlmICghbmV3X2J1ZmZlcikKKwkJKm91dCArPSBidWZfbGVuOworCXJldHVybiBidWZfbGVuOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19jaGVjay5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzMTZiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19jaGVjay5jCkBAIC0wLDAgKzEsMTIzIEBACisvKiBjcnlwdG8vZWMvZWNfY2hlY2suYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlICJlY19sY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCitpbnQgRUNfR1JPVVBfY2hlY2soY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldCA9IDA7CisJQklHTlVNICpvcmRlcjsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCUVDX1BPSU5UICpwb2ludCA9IE5VTEw7CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19HUk9VUF9DSEVDSywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlpZiAoKG9yZGVyID0gQk5fQ1RYX2dldChjdHgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIGNoZWNrIHRoZSBkaXNjcmltaW5hbnQgKi8KKwlpZiAoIUVDX0dST1VQX2NoZWNrX2Rpc2NyaW1pbmFudChncm91cCwgY3R4KSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX0NIRUNLLCBFQ19SX0RJU0NSSU1JTkFOVF9JU19aRVJPKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIGNoZWNrIHRoZSBnZW5lcmF0b3IgKi8KKwlpZiAoZ3JvdXAtPmdlbmVyYXRvciA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfQ0hFQ0ssIEVDX1JfVU5ERUZJTkVEX0dFTkVSQVRPUik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCFFQ19QT0lOVF9pc19vbl9jdXJ2ZShncm91cCwgZ3JvdXAtPmdlbmVyYXRvciwgY3R4KSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX0NIRUNLLCBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBjaGVjayB0aGUgb3JkZXIgb2YgdGhlIGdlbmVyYXRvciAqLworCWlmICgocG9pbnQgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgb3JkZXIsIGN0eCkpIGdvdG8gZXJyOyAKKwlpZiAoQk5faXNfemVybyhvcmRlcikpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9DSEVDSywgRUNfUl9VTkRFRklORURfT1JERVIpOworCQlnb3RvIGVycjsKKwkJfQorCQorCWlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBwb2ludCwgb3JkZXIsIE5VTEwsIE5VTEwsIGN0eCkpIGdvdG8gZXJyOworCWlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIHBvaW50KSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX0NIRUNLLCBFQ19SX0lOVkFMSURfR1JPVVBfT1JERVIpOworCQlnb3RvIGVycjsKKwkJfQorCisJcmV0ID0gMTsKKworZXJyOgorCWlmIChjdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCWlmIChwb2ludCkKKwkJRUNfUE9JTlRfZnJlZShwb2ludCk7CisJcmV0dXJuIHJldDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfY3VydmUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19jdXJ2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMjc0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfY3VydmUuYwpAQCAtMCwwICsxLDIwNTkgQEAKKy8qIGNyeXB0by9lYy9lY19jdXJ2ZS5jICovCisvKgorICogV3JpdHRlbiBieSBOaWxzIExhcnNjaCBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGFyZSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBUaGUgZWxsaXB0aWMgY3VydmUgYmluYXJ5IHBvbHlub21pYWwgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IAorICogU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworCisjaW5jbHVkZSAiZWNfbGNsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29ial9tYWMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgeworCWludAlmaWVsZF90eXBlLAkvKiBlaXRoZXIgTklEX1g5XzYyX3ByaW1lX2ZpZWxkIG9yCisJCQkJICogTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCAqLworCQlzZWVkX2xlbiwKKwkJcGFyYW1fbGVuOworCXVuc2lnbmVkIGludCBjb2ZhY3RvcjsJLyogcHJvbW90ZWQgdG8gQk5fVUxPTkcgKi8KK30gRUNfQ1VSVkVfREFUQTsKKworLyogdGhlIG5pc3QgcHJpbWUgY3VydmVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMjQqNl07IH0KKwlfRUNfTklTVF9QUklNRV8xOTIgPSB7CisJeyBOSURfWDlfNjJfcHJpbWVfZmllbGQsMjAsMjQsMSB9LAorCXsgMHgzMCwweDQ1LDB4QUUsMHg2RiwweEM4LDB4NDIsMHgyRiwweDY0LDB4RUQsMHg1NywJLyogc2VlZCAqLworCSAgMHg5NSwweDI4LDB4RDMsMHg4MSwweDIwLDB4RUEsMHhFMSwweDIxLDB4OTYsMHhENSwKKworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogcCAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkUsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBhICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGQywKKwkgIDB4NjQsMHgyMSwweDA1LDB4MTksMHhFNSwweDlDLDB4ODAsMHhFNywweDBGLDB4QTcsCS8qIGIgKi8KKwkgIDB4RTksMHhBQiwweDcyLDB4MjQsMHgzMCwweDQ5LDB4RkUsMHhCOCwweERFLDB4RUMsCisJICAweEMxLDB4NDYsMHhCOSwweEIxLAorCSAgMHgxOCwweDhELDB4QTgsMHgwRSwweEIwLDB4MzAsMHg5MCwweEY2LDB4N0MsMHhCRiwJLyogeCAqLworCSAgMHgyMCwweEVCLDB4NDMsMHhBMSwweDg4LDB4MDAsMHhGNCwweEZGLDB4MEEsMHhGRCwKKwkgIDB4ODIsMHhGRiwweDEwLDB4MTIsCisJICAweDA3LDB4MTksMHgyYiwweDk1LDB4ZmYsMHhjOCwweGRhLDB4NzgsMHg2MywweDEwLAkvKiB5ICovCisJICAweDExLDB4ZWQsMHg2YiwweDI0LDB4Y2QsMHhkNSwweDczLDB4ZjksMHg3NywweGExLAorCSAgMHgxZSwweDc5LDB4NDgsMHgxMSwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIG9yZGVyICovCisJICAweEZGLDB4RkYsMHg5OSwweERFLDB4RjgsMHgzNiwweDE0LDB4NkIsMHhDOSwweEIxLAorCSAgMHhCNCwweEQyLDB4MjgsMHgzMSB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzI4KjZdOyB9CisJX0VDX05JU1RfUFJJTUVfMjI0ID0geworCXsgTklEX1g5XzYyX3ByaW1lX2ZpZWxkLDIwLDI4LDEgfSwKKwl7IDB4QkQsMHg3MSwweDM0LDB4NDcsMHg5OSwweEQ1LDB4QzcsMHhGQywweERDLDB4NDUsCS8qIHNlZWQgKi8KKwkgIDB4QjUsMHg5RiwweEEzLDB4QjksMHhBQiwweDhGLDB4NkEsMHg5NCwweDhCLDB4QzUsCisKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIHAgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBhICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLAorCSAgMHhCNCwweDA1LDB4MEEsMHg4NSwweDBDLDB4MDQsMHhCMywweEFCLDB4RjUsMHg0MSwJLyogYiAqLworCSAgMHgzMiwweDU2LDB4NTAsMHg0NCwweEIwLDB4QjcsMHhENywweEJGLDB4RDgsMHhCQSwKKwkgIDB4MjcsMHgwQiwweDM5LDB4NDMsMHgyMywweDU1LDB4RkYsMHhCNCwKKwkgIDB4QjcsMHgwRSwweDBDLDB4QkQsMHg2QiwweEI0LDB4QkYsMHg3RiwweDMyLDB4MTMsCS8qIHggKi8KKwkgIDB4OTAsMHhCOSwweDRBLDB4MDMsMHhDMSwweEQzLDB4NTYsMHhDMiwweDExLDB4MjIsCisJICAweDM0LDB4MzIsMHg4MCwweEQ2LDB4MTEsMHg1QywweDFELDB4MjEsCisJICAweGJkLDB4MzcsMHg2MywweDg4LDB4YjUsMHhmNywweDIzLDB4ZmIsMHg0YywweDIyLAkvKiB5ICovCisJICAweGRmLDB4ZTYsMHhjZCwweDQzLDB4NzUsMHhhMCwweDVhLDB4MDcsMHg0NywweDY0LAorCSAgMHg0NCwweGQ1LDB4ODEsMHg5OSwweDg1LDB4MDAsMHg3ZSwweDM0LAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogb3JkZXIgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHgxNiwweEEyLDB4RTAsMHhCOCwweEYwLDB4M0UsCisJICAweDEzLDB4REQsMHgyOSwweDQ1LDB4NUMsMHg1QywweDJBLDB4M0QgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCs0OCo2XTsgfQorCV9FQ19OSVNUX1BSSU1FXzM4NCA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwyMCw0OCwxIH0sCisJeyAweEEzLDB4MzUsMHg5MiwweDZBLDB4QTMsMHgxOSwweEEyLDB4N0EsMHgxRCwweDAwLAkvKiBzZWVkICovCisJICAweDg5LDB4NkEsMHg2NywweDczLDB4QTQsMHg4MiwweDdBLDB4Q0QsMHhBQywweDczLAorCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBwICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBhICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGRiwweEZGLDB4RkMsCisJICAweEIzLDB4MzEsMHgyRiwweEE3LDB4RTIsMHgzRSwweEU3LDB4RTQsMHg5OCwweDhFLAkvKiBiICovCisJICAweDA1LDB4NkIsMHhFMywweEY4LDB4MkQsMHgxOSwweDE4LDB4MUQsMHg5QywweDZFLAorCSAgMHhGRSwweDgxLDB4NDEsMHgxMiwweDAzLDB4MTQsMHgwOCwweDhGLDB4NTAsMHgxMywKKwkgIDB4ODcsMHg1QSwweEM2LDB4NTYsMHgzOSwweDhELDB4OEEsMHgyRSwweEQxLDB4OUQsCisJICAweDJBLDB4ODUsMHhDOCwweEVELDB4RDMsMHhFQywweDJBLDB4RUYsCisJICAweEFBLDB4ODcsMHhDQSwweDIyLDB4QkUsMHg4QiwweDA1LDB4MzcsMHg4RSwweEIxLAkvKiB4ICovCisJICAweEM3LDB4MUUsMHhGMywweDIwLDB4QUQsMHg3NCwweDZFLDB4MUQsMHgzQiwweDYyLAorCSAgMHg4QiwweEE3LDB4OUIsMHg5OCwweDU5LDB4RjcsMHg0MSwweEUwLDB4ODIsMHg1NCwKKwkgIDB4MkEsMHgzOCwweDU1LDB4MDIsMHhGMiwweDVELDB4QkYsMHg1NSwweDI5LDB4NkMsCisJICAweDNBLDB4NTQsMHg1RSwweDM4LDB4NzIsMHg3NiwweDBBLDB4QjcsCisJICAweDM2LDB4MTcsMHhkZSwweDRhLDB4OTYsMHgyNiwweDJjLDB4NmYsMHg1ZCwweDllLAkvKiB5ICovCisJICAweDk4LDB4YmYsMHg5MiwweDkyLDB4ZGMsMHgyOSwweGY4LDB4ZjQsMHgxZCwweGJkLAorCSAgMHgyOCwweDlhLDB4MTQsMHg3YywweGU5LDB4ZGEsMHgzMSwweDEzLDB4YjUsMHhmMCwKKwkgIDB4YjgsMHhjMCwweDBhLDB4NjAsMHhiMSwweGNlLDB4MWQsMHg3ZSwweDgxLDB4OWQsCisJICAweDdhLDB4NDMsMHgxZCwweDdjLDB4OTAsMHhlYSwweDBlLDB4NWYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhDNywweDYzLDB4NEQsMHg4MSwweEY0LDB4MzcsCisJICAweDJELDB4REYsMHg1OCwweDFBLDB4MEQsMHhCMiwweDQ4LDB4QjAsMHhBNywweDdBLAorCSAgMHhFQywweEVDLDB4MTksMHg2QSwweENDLDB4QzUsMHgyOSwweDczIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArNjYqNl07IH0KKwlfRUNfTklTVF9QUklNRV81MjEgPSB7CisJeyBOSURfWDlfNjJfcHJpbWVfZmllbGQsMjAsNjYsMSB9LAorCXsgMHhEMCwweDlFLDB4ODgsMHgwMCwweDI5LDB4MUMsMHhCOCwweDUzLDB4OTYsMHhDQywJLyogc2VlZCAqLworCSAgMHg2NywweDE3LDB4MzksMHgzMiwweDg0LDB4QUEsMHhBMCwweERBLDB4NjQsMHhCQSwKKworCSAgMHgwMSwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogcCAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4MDEsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIGEgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkMsCisJICAweDAwLDB4NTEsMHg5NSwweDNFLDB4QjksMHg2MSwweDhFLDB4MUMsMHg5QSwweDFGLAkvKiBiICovCisJICAweDkyLDB4OUEsMHgyMSwweEEwLDB4QjYsMHg4NSwweDQwLDB4RUUsMHhBMiwweERBLAorCSAgMHg3MiwweDVCLDB4OTksMHhCMywweDE1LDB4RjMsMHhCOCwweEI0LDB4ODksMHg5MSwKKwkgIDB4OEUsMHhGMSwweDA5LDB4RTEsMHg1NiwweDE5LDB4MzksMHg1MSwweEVDLDB4N0UsCisJICAweDkzLDB4N0IsMHgxNiwweDUyLDB4QzAsMHhCRCwweDNCLDB4QjEsMHhCRiwweDA3LAorCSAgMHgzNSwweDczLDB4REYsMHg4OCwweDNELDB4MkMsMHgzNCwweEYxLDB4RUYsMHg0NSwKKwkgIDB4MUYsMHhENCwweDZCLDB4NTAsMHgzRiwweDAwLAorCSAgMHgwMCwweEM2LDB4ODUsMHg4RSwweDA2LDB4QjcsMHgwNCwweDA0LDB4RTksMHhDRCwJLyogeCAqLworCSAgMHg5RSwweDNFLDB4Q0IsMHg2NiwweDIzLDB4OTUsMHhCNCwweDQyLDB4OUMsMHg2NCwKKwkgIDB4ODEsMHgzOSwweDA1LDB4M0YsMHhCNSwweDIxLDB4RjgsMHgyOCwweEFGLDB4NjAsCisJICAweDZCLDB4NEQsMHgzRCwweEJBLDB4QTEsMHg0QiwweDVFLDB4NzcsMHhFRiwweEU3LAorCSAgMHg1OSwweDI4LDB4RkUsMHgxRCwweEMxLDB4MjcsMHhBMiwweEZGLDB4QTgsMHhERSwKKwkgIDB4MzMsMHg0OCwweEIzLDB4QzEsMHg4NSwweDZBLDB4NDIsMHg5QiwweEY5LDB4N0UsCisJICAweDdFLDB4MzEsMHhDMiwweEU1LDB4QkQsMHg2NiwKKwkgIDB4MDEsMHgxOCwweDM5LDB4MjksMHg2YSwweDc4LDB4OWEsMHgzYiwweGMwLDB4MDQsCS8qIHkgKi8KKwkgIDB4NWMsMHg4YSwweDVmLDB4YjQsMHgyYywweDdkLDB4MWIsMHhkOSwweDk4LDB4ZjUsCisJICAweDQ0LDB4NDksMHg1NywweDliLDB4NDQsMHg2OCwweDE3LDB4YWYsMHhiZCwweDE3LAorCSAgMHgyNywweDNlLDB4NjYsMHgyYywweDk3LDB4ZWUsMHg3MiwweDk5LDB4NWUsMHhmNCwKKwkgIDB4MjYsMHg0MCwweGM1LDB4NTAsMHhiOSwweDAxLDB4M2YsMHhhZCwweDA3LDB4NjEsCisJICAweDM1LDB4M2MsMHg3MCwweDg2LDB4YTIsMHg3MiwweGMyLDB4NDAsMHg4OCwweGJlLAorCSAgMHg5NCwweDc2LDB4OWYsMHhkMSwweDY2LDB4NTAsCisJICAweDAxLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZBLDB4NTEsMHg4NiwweDg3LDB4ODMsMHhCRiwweDJGLAorCSAgMHg5NiwweDZCLDB4N0YsMHhDQywweDAxLDB4NDgsMHhGNywweDA5LDB4QTUsMHhEMCwKKwkgIDB4M0IsMHhCNSwweEM5LDB4QjgsMHg4OSwweDlDLDB4NDcsMHhBRSwweEJCLDB4NkYsCisJICAweEI3LDB4MUUsMHg5MSwweDM4LDB4NjQsMHgwOSB9CisJfTsKKworLyogdGhlIHg5LjYyIHByaW1lIGN1cnZlcyAobWludXMgdGhlIG5pc3QgcHJpbWUgY3VydmVzKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzI0KjZdOyB9CisJX0VDX1g5XzYyX1BSSU1FXzE5MlYyID0geworCXsgTklEX1g5XzYyX3ByaW1lX2ZpZWxkLDIwLDI0LDEgfSwKKwl7IDB4MzEsMHhBOSwweDJFLDB4RTIsMHgwMiwweDlGLDB4RDEsMHgwRCwweDkwLDB4MUIsCS8qIHNlZWQgKi8KKwkgIDB4MTEsMHgzRSwweDk5LDB4MDcsMHgxMCwweEYwLDB4RDIsMHgxQSwweEM2LDB4QjYsCisKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIHAgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogYSAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkUsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkMsCisJICAweENDLDB4MjIsMHhENiwweERGLDB4QjksMHg1QywweDZCLDB4MjUsMHhFNCwweDlDLAkvKiBiICovCisJICAweDBELDB4NjMsMHg2NCwweEE0LDB4RTUsMHg5OCwweDBDLDB4MzksMHgzQSwweEEyLAorCSAgMHgxNiwweDY4LDB4RDksMHg1MywKKwkgIDB4RUUsMHhBMiwweEJBLDB4RTcsMHhFMSwweDQ5LDB4NzgsMHg0MiwweEYyLDB4REUsCS8qIHggKi8KKwkgIDB4NzcsMHg2OSwweENGLDB4RTksMHhDOSwweDg5LDB4QzAsMHg3MiwweEFELDB4NjksCisJICAweDZGLDB4NDgsMHgwMywweDRBLAorCSAgMHg2NSwweDc0LDB4ZDEsMHgxZCwweDY5LDB4YjYsMHhlYywweDdhLDB4NjcsMHgyYiwJLyogeSAqLworCSAgMHhiOCwweDJhLDB4MDgsMHgzZCwweGYyLDB4ZjIsMHhiMCwweDg0LDB4N2QsMHhlOSwKKwkgIDB4NzAsMHhiMiwweGRlLDB4MTUsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZFLDB4NUYsMHhCMSwweEE3LDB4MjQsMHhEQywweDgwLDB4NDEsMHg4NiwKKwkgIDB4NDgsMHhEOCwweERELDB4MzEgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCsyNCo2XTsgfQorCV9FQ19YOV82Ml9QUklNRV8xOTJWMyA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwyMCwyNCwxIH0sCisJeyAweEM0LDB4NjksMHg2OCwweDQ0LDB4MzUsMHhERSwweEIzLDB4NzgsMHhDNCwweEI2LAkvKiBzZWVkICovCisJICAweDVDLDB4QTksMHg1OSwweDFFLDB4MkEsMHg1NywweDYzLDB4MDUsMHg5QSwweDJFLAorCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBwICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIGEgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZDLAorCSAgMHgyMiwweDEyLDB4M0QsMHhDMiwweDM5LDB4NUEsMHgwNSwweENBLDB4QTcsMHg0MiwJLyogYiAqLworCSAgMHgzRCwweEFFLDB4Q0MsMHhDOSwweDQ3LDB4NjAsMHhBNywweEQ0LDB4NjIsMHgyNSwKKwkgIDB4NkIsMHhENSwweDY5LDB4MTYsCisJICAweDdELDB4MjksMHg3NywweDgxLDB4MDAsMHhDNiwweDVBLDB4MUQsMHhBMSwweDc4LAkvKiB4ICovCisJICAweDM3LDB4MTYsMHg1OCwweDhELDB4Q0UsMHgyQiwweDhCLDB4NEEsMHhFRSwweDhFLAorCSAgMHgyMiwweDhGLDB4MTgsMHg5NiwKKwkgIDB4MzgsMHhhOSwweDBmLDB4MjIsMHg2MywweDczLDB4MzcsMHgzMywweDRiLDB4NDksCS8qIHkgKi8KKwkgIDB4ZGMsMHhiNiwweDZhLDB4NmQsMHhjOCwweGY5LDB4OTcsMHg4YSwweGNhLDB4NzYsCisJICAweDQ4LDB4YTksMHg0MywweGIwLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogb3JkZXIgKi8KKwkgIDB4RkYsMHhGRiwweDdBLDB4NjIsMHhEMCwweDMxLDB4QzgsMHgzRiwweDQyLDB4OTQsCisJICAweEY2LDB4NDAsMHhFQywweDEzIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMzAqNl07IH0KKwlfRUNfWDlfNjJfUFJJTUVfMjM5VjEgPSB7CisJeyBOSURfWDlfNjJfcHJpbWVfZmllbGQsMjAsMzAsMSB9LAorCXsgMHhFNCwweDNCLDB4QjQsMHg2MCwweEYwLDB4QjgsMHgwQywweEMwLDB4QzAsMHhCMCwJLyogc2VlZCAqLworCSAgMHg3NSwweDc5LDB4OEUsMHg5NCwweDgwLDB4NjAsMHhGOCwweDMyLDB4MUIsMHg3RCwKKworCSAgMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogcCAqLworCSAgMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4ODAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisKKwkgIDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIGEgKi8KKwkgIDB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDgwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZDLAorCisJICAweDZCLDB4MDEsMHg2QywweDNCLDB4REMsMHhGMSwweDg5LDB4NDEsMHhEMCwweEQ2LAkvKiBiICovCisJICAweDU0LDB4OTIsMHgxNCwweDc1LDB4Q0EsMHg3MSwweEE5LDB4REIsMHgyRiwweEIyLAorCSAgMHg3RCwweDFELDB4MzcsMHg3OSwweDYxLDB4ODUsMHhDMiwweDk0LDB4MkMsMHgwQSwKKworCSAgMHgwRiwweEZBLDB4OTYsMHgzQywweERDLDB4QTgsMHg4MSwweDZDLDB4Q0MsMHgzMywJLyogeCAqLworCSAgMHhCOCwweDY0LDB4MkIsMHhFRCwweEY5LDB4MDUsMHhDMywweEQzLDB4NTgsMHg1NywKKwkgIDB4M0QsMHgzRiwweDI3LDB4RkIsMHhCRCwweDNCLDB4M0MsMHhCOSwweEFBLDB4QUYsCisKKwkgIDB4N2QsMHhlYiwweGU4LDB4ZTQsMHhlOSwweDBhLDB4NWQsMHhhZSwweDZlLDB4NDAsCS8qIHkgKi8KKwkgIDB4NTQsMHhjYSwweDUzLDB4MGIsMHhhMCwweDQ2LDB4NTQsMHhiMywweDY4LDB4MTgsCisJICAweGNlLDB4MjIsMHg2YiwweDM5LDB4ZmMsMHhjYiwweDdiLDB4MDIsMHhmMSwweGFlLAorCisJICAweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLDB4OUUsMHg1RSwweDlBLDB4OUYsMHg1RCwKKwkgIDB4OTAsMHg3MSwweEZCLDB4RDEsMHg1MiwweDI2LDB4ODgsMHg5MCwweDlELDB4MEIgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCszMCo2XTsgfQorCV9FQ19YOV82Ml9QUklNRV8yMzlWMiA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwyMCwzMCwxIH0sCisJeyAweEU4LDB4QjQsMHgwMSwweDE2LDB4MDQsMHgwOSwweDUzLDB4MDMsMHhDQSwweDNCLAkvKiBzZWVkICovCisJICAweDgwLDB4OTksMHg5OCwweDJCLDB4RTAsMHg5RiwweENCLDB4OUEsMHhFNiwweDE2LAorCisJICAweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBwICovCisJICAweEZGLDB4RkYsMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHg4MCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKworCSAgMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogYSAqLworCSAgMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4ODAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkMsCisKKwkgIDB4NjEsMHg3RiwweEFCLDB4NjgsMHgzMiwweDU3LDB4NkMsMHhCQiwweEZFLDB4RDUsCS8qIGIgKi8KKwkgIDB4MEQsMHg5OSwweEYwLDB4MjQsMHg5QywweDNGLDB4RUUsMHg1OCwweEI5LDB4NEIsCisJICAweEEwLDB4MDMsMHg4QywweDdBLDB4RTgsMHg0QywweDhDLDB4ODMsMHgyRiwweDJDLAorCisJICAweDM4LDB4QUYsMHgwOSwweEQ5LDB4ODcsMHgyNywweDcwLDB4NTEsMHgyMCwweEM5LAkvKiB4ICovCisJICAweDIxLDB4QkIsMHg1RSwweDlFLDB4MjYsMHgyOSwweDZBLDB4M0MsMHhEQywweEYyLAorCSAgMHhGMywweDU3LDB4NTcsMHhBMCwweEVBLDB4RkQsMHg4NywweEI4LDB4MzAsMHhFNywKKworCSAgMHg1YiwweDAxLDB4MjUsMHhlNCwweGRiLDB4ZWEsMHgwZSwweGM3LDB4MjAsMHg2ZCwJLyogeSAqLworCSAgMHhhMCwweGZjLDB4MDEsMHhkOSwweGIwLDB4ODEsMHgzMiwweDlmLDB4YjUsMHg1NSwKKwkgIDB4ZGUsMHg2ZSwweGY0LDB4NjAsMHgyMywweDdkLDB4ZmYsMHg4YiwweGU0LDB4YmEsCisKKwkgIDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIG9yZGVyICovCisJICAweEZGLDB4RkYsMHg4MCwweDAwLDB4MDAsMHhDRiwweEE3LDB4RTgsMHg1OSwweDQzLAorCSAgMHg3NywweEQ0LDB4MTQsMHhDMCwweDM4LDB4MjEsMHhCQywweDU4LDB4MjAsMHg2MyB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzMwKjZdOyB9CisJX0VDX1g5XzYyX1BSSU1FXzIzOVYzID0geworCXsgTklEX1g5XzYyX3ByaW1lX2ZpZWxkLDIwLDMwLDEgfSwKKwl7IDB4N0QsMHg3MywweDc0LDB4MTYsMHg4RiwweEZFLDB4MzQsMHg3MSwweEI2LDB4MEEsCS8qIHNlZWQgKi8KKwkgIDB4ODUsMHg3NiwweDg2LDB4QTEsMHg5NCwweDc1LDB4RDMsMHhCRiwweEEyLDB4RkYsCisKKwkgIDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIHAgKi8KKwkgIDB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDgwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4N0YsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCisJICAweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBhICovCisJICAweEZGLDB4RkYsMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHg4MCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGQywKKworCSAgMHgyNSwweDU3LDB4MDUsMHhGQSwweDJBLDB4MzAsMHg2NiwweDU0LDB4QjEsMHhGNCwJLyogYiAqLworCSAgMHhDQiwweDAzLDB4RDYsMHhBNywweDUwLDB4QTMsMHgwQywweDI1LDB4MDEsMHgwMiwKKwkgIDB4RDQsMHg5OCwweDg3LDB4MTcsMHhEOSwweEJBLDB4MTUsMHhBQiwweDZELDB4M0UsCisKKwkgIDB4NjcsMHg2OCwweEFFLDB4OEUsMHgxOCwweEJCLDB4OTIsMHhDRiwweENGLDB4MDAsCS8qIHggKi8KKwkgIDB4NUMsMHg5NCwweDlBLDB4QTIsMHhDNiwweEQ5LDB4NDgsMHg1MywweEQwLDB4RTYsCisJICAweDYwLDB4QkIsMHhGOCwweDU0LDB4QjEsMHhDOSwweDUwLDB4NUYsMHhFOSwweDVBLAorCisJICAweDE2LDB4MDcsMHhlNiwweDg5LDB4OGYsMHgzOSwweDBjLDB4MDYsMHhiYywweDFkLAkvKiB5ICovCisJICAweDU1LDB4MmIsMHhhZCwweDIyLDB4NmYsMHgzYiwweDZmLDB4Y2YsMHhlNCwweDhiLAorCSAgMHg2ZSwweDgxLDB4ODQsMHg5OSwweGFmLDB4MTgsMHhlMywweGVkLDB4NmMsMHhmMywKKworCSAgMHg3RiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogb3JkZXIgKi8KKwkgIDB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRiwweDk3LDB4NUQsMHhFQiwweDQxLDB4QjMsCisJICAweEE2LDB4MDUsMHg3QywweDNDLDB4NDMsMHgyMSwweDQ2LDB4NTIsMHg2NSwweDUxIH0KKwl9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCszMio2XTsgfQorCV9FQ19YOV82Ml9QUklNRV8yNTZWMSA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwyMCwzMiwxIH0sCisJeyAweEM0LDB4OUQsMHgzNiwweDA4LDB4ODYsMHhFNywweDA0LDB4OTMsMHg2QSwweDY2LAkvKiBzZWVkICovCisJICAweDc4LDB4RTEsMHgxMywweDlELDB4MjYsMHhCNywweDgxLDB4OUYsMHg3RSwweDkwLAorCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHgwMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsCS8qIGEgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZDLAorCSAgMHg1QSwweEM2LDB4MzUsMHhEOCwweEFBLDB4M0EsMHg5MywweEU3LDB4QjMsMHhFQiwJLyogYiAqLworCSAgMHhCRCwweDU1LDB4NzYsMHg5OCwweDg2LDB4QkMsMHg2NSwweDFELDB4MDYsMHhCMCwKKwkgIDB4Q0MsMHg1MywweEIwLDB4RjYsMHgzQiwweENFLDB4M0MsMHgzRSwweDI3LDB4RDIsCisJICAweDYwLDB4NEIsCisJICAweDZCLDB4MTcsMHhEMSwweEYyLDB4RTEsMHgyQywweDQyLDB4NDcsMHhGOCwweEJDLAkvKiB4ICovCisJICAweEU2LDB4RTUsMHg2MywweEE0LDB4NDAsMHhGMiwweDc3LDB4MDMsMHg3RCwweDgxLAorCSAgMHgyRCwweEVCLDB4MzMsMHhBMCwweEY0LDB4QTEsMHgzOSwweDQ1LDB4RDgsMHg5OCwKKwkgIDB4QzIsMHg5NiwKKwkgIDB4NGYsMHhlMywweDQyLDB4ZTIsMHhmZSwweDFhLDB4N2YsMHg5YiwweDhlLDB4ZTcsCS8qIHkgKi8KKwkgIDB4ZWIsMHg0YSwweDdjLDB4MGYsMHg5ZSwweDE2LDB4MmIsMHhjZSwweDMzLDB4NTcsCisJICAweDZiLDB4MzEsMHg1ZSwweGNlLDB4Y2IsMHhiNiwweDQwLDB4NjgsMHgzNywweGJmLAorCSAgMHg1MSwweGY1LAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAwLDB4RkYsMHhGRiwJLyogb3JkZXIgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4QkMsMHhFNiwweEZBLDB4QUQsCisJICAweEE3LDB4MTcsMHg5RSwweDg0LDB4RjMsMHhCOSwweENBLDB4QzIsMHhGQywweDYzLAorCSAgMHgyNSwweDUxIH0KKwl9OworCisvKiB0aGUgc2VjZyBwcmltZSBjdXJ2ZXMgKG1pbnVzIHRoZSBuaXN0IGFuZCB4OS42MiBwcmltZSBjdXJ2ZXMpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMTQqNl07IH0KKwlfRUNfU0VDR19QUklNRV8xMTJSMSA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwyMCwxNCwxIH0sCisJeyAweDAwLDB4RjUsMHgwQiwweDAyLDB4OEUsMHg0RCwweDY5LDB4NkUsMHg2NywweDY4LAkvKiBzZWVkICovCisJICAweDc1LDB4NjEsMHg1MSwweDc1LDB4MjksMHgwNCwweDcyLDB4NzgsMHgzRiwweEIxLAorCisJICAweERCLDB4N0MsMHgyQSwweEJGLDB4NjIsMHhFMywweDVFLDB4NjYsMHg4MCwweDc2LAkvKiBwICovCisJICAweEJFLDB4QUQsMHgyMCwweDhCLAorCSAgMHhEQiwweDdDLDB4MkEsMHhCRiwweDYyLDB4RTMsMHg1RSwweDY2LDB4ODAsMHg3NiwJLyogYSAqLworCSAgMHhCRSwweEFELDB4MjAsMHg4OCwKKwkgIDB4NjUsMHg5RSwweEY4LDB4QkEsMHgwNCwweDM5LDB4MTYsMHhFRSwweERFLDB4ODksCS8qIGIgKi8KKwkgIDB4MTEsMHg3MCwweDJCLDB4MjIsCisJICAweDA5LDB4NDgsMHg3MiwweDM5LDB4OTksMHg1QSwweDVFLDB4RTcsMHg2QiwweDU1LAkvKiB4ICovCisJICAweEY5LDB4QzIsMHhGMCwweDk4LAorCSAgMHhhOCwweDljLDB4ZTUsMHhhZiwweDg3LDB4MjQsMHhjMCwweGEyLDB4M2UsMHgwZSwJLyogeSAqLworCSAgMHgwZiwweGY3LDB4NzUsMHgwMCwKKwkgIDB4REIsMHg3QywweDJBLDB4QkYsMHg2MiwweEUzLDB4NUUsMHg3NiwweDI4LDB4REYsCS8qIG9yZGVyICovCisJICAweEFDLDB4NjUsMHg2MSwweEM1IH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMTQqNl07IH0KKwlfRUNfU0VDR19QUklNRV8xMTJSMiA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwyMCwxNCw0IH0sCisJeyAweDAwLDB4MjcsMHg1NywweEExLDB4MTEsMHg0RCwweDY5LDB4NkUsMHg2NywweDY4LAkvKiBzZWVkICovCisJICAweDc1LDB4NjEsMHg1MSwweDc1LDB4NTMsMHgxNiwweEMwLDB4NUUsMHgwQiwweEQ0LAorCisJICAweERCLDB4N0MsMHgyQSwweEJGLDB4NjIsMHhFMywweDVFLDB4NjYsMHg4MCwweDc2LAkvKiBwICovCisJICAweEJFLDB4QUQsMHgyMCwweDhCLAorCSAgMHg2MSwweDI3LDB4QzIsMHg0QywweDA1LDB4RjMsMHg4QSwweDBBLDB4QUEsMHhGNiwJLyogYSAqLworCSAgMHg1QywweDBFLDB4RjAsMHgyQywKKwkgIDB4NTEsMHhERSwweEYxLDB4ODEsMHg1RCwweEI1LDB4RUQsMHg3NCwweEZDLDB4QzMsCS8qIGIgKi8KKwkgIDB4NEMsMHg4NSwweEQ3LDB4MDksCisJICAweDRCLDB4QTMsMHgwQSwweEI1LDB4RTgsMHg5MiwweEI0LDB4RTEsMHg2NCwweDlELAkvKiB4ICovCisJICAweEQwLDB4OTIsMHg4NiwweDQzLAorCSAgMHhhZCwweGNkLDB4NDYsMHhmNSwweDg4LDB4MmUsMHgzNywweDQ3LDB4ZGUsMHhmMywJLyogeSAqLworCSAgMHg2ZSwweDk1LDB4NmUsMHg5NywKKwkgIDB4MzYsMHhERiwweDBBLDB4QUYsMHhEOCwweEI4LDB4RDcsMHg1OSwweDdDLDB4QTEsCS8qIG9yZGVyICovCisJICAweDA1LDB4MjAsMHhEMCwweDRCIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMTYqNl07IH0KKwlfRUNfU0VDR19QUklNRV8xMjhSMSA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwyMCwxNiwxIH0sCisJeyAweDAwLDB4MEUsMHgwRCwweDRELDB4NjksMHg2RSwweDY3LDB4NjgsMHg3NSwweDYxLAkvKiBzZWVkICovCisJICAweDUxLDB4NzUsMHgwQywweEMwLDB4M0EsMHg0NCwweDczLDB4RDAsMHgzNiwweDc5LAorCisJICAweEZGLDB4RkYsMHhGRiwweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBwICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkQsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIGEgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZDLAorCSAgMHhFOCwweDc1LDB4NzksMHhDMSwweDEwLDB4NzksMHhGNCwweDNELDB4RDgsMHgyNCwJLyogYiAqLworCSAgMHg5OSwweDNDLDB4MkMsMHhFRSwweDVFLDB4RDMsCisJICAweDE2LDB4MUYsMHhGNywweDUyLDB4OEIsMHg4OSwweDlCLDB4MkQsMHgwQywweDI4LAkvKiB4ICovCisJICAweDYwLDB4N0MsMHhBNSwweDJDLDB4NUIsMHg4NiwKKwkgIDB4Y2YsMHg1YSwweGM4LDB4MzksMHg1YiwweGFmLDB4ZWIsMHgxMywweGMwLDB4MmQsCS8qIHkgKi8KKwkgIDB4YTIsMHg5MiwweGRkLDB4ZWQsMHg3YSwweDgzLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRSwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzUsMHhBMywJLyogb3JkZXIgKi8KKwkgIDB4MEQsMHgxQiwweDkwLDB4MzgsMHhBMSwweDE1IH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMTYqNl07IH0KKwlfRUNfU0VDR19QUklNRV8xMjhSMiA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwyMCwxNiw0IH0sCisJeyAweDAwLDB4NEQsMHg2OSwweDZFLDB4NjcsMHg2OCwweDc1LDB4NjEsMHg1MSwweDc1LAkvKiBzZWVkICovCisJICAweDEyLDB4RDgsMHhGMCwweDM0LDB4MzEsMHhGQywweEU2LDB4M0IsMHg4OCwweEY0LAorCisJICAweEZGLDB4RkYsMHhGRiwweEZELDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBwICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RDYsMHgwMywweDE5LDB4OTgsMHhEMSwweEIzLDB4QkIsMHhGRSwweEJGLDB4NTksCS8qIGEgKi8KKwkgIDB4Q0MsMHg5QiwweEJGLDB4RjksMHhBRSwweEUxLAorCSAgMHg1RSwweEVFLDB4RkMsMHhBMywweDgwLDB4RDAsMHgyOSwweDE5LDB4REMsMHgyQywJLyogYiAqLworCSAgMHg2NSwweDU4LDB4QkIsMHg2RCwweDhBLDB4NUQsCisJICAweDdCLDB4NkEsMHhBNSwweEQ4LDB4NUUsMHg1NywweDI5LDB4ODMsMHhFNiwweEZCLAkvKiB4ICovCisJICAweDMyLDB4QTcsMHhDRCwweEVCLDB4QzEsMHg0MCwKKwkgIDB4MjcsMHhiNiwweDkxLDB4NmEsMHg4OSwweDRkLDB4M2EsMHhlZSwweDcxLDB4MDYsCS8qIHkgKi8KKwkgIDB4ZmUsMHg4MCwweDVmLDB4YzMsMHg0YiwweDQ0LAorCSAgMHgzRiwweEZGLDB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRiwweEZGLDB4QkUsMHgwMCwJLyogb3JkZXIgKi8KKwkgIDB4MjQsMHg3MiwweDA2LDB4MTMsMHhCNSwweEEzIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMCsyMSo2XTsgfQorCV9FQ19TRUNHX1BSSU1FXzE2MEsxID0geworCXsgTklEX1g5XzYyX3ByaW1lX2ZpZWxkLDAsMjEsMSB9LAorCXsJCQkJCQkJLyogbm8gc2VlZCAqLworCSAgMHgwMCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogcCAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhBQywKKwkgIDB4NzMsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIGIgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDA3LAorCSAgMHgwMCwweDNCLDB4NEMsMHgzOCwweDJDLDB4RTMsMHg3QSwweEExLDB4OTIsMHhBNCwJLyogeCAqLworCSAgMHgwMSwweDlFLDB4NzYsMHgzMCwweDM2LDB4RjQsMHhGNSwweERELDB4NEQsMHg3RSwKKwkgIDB4QkIsCisJICAweDAwLDB4OTMsMHg4YywweGY5LDB4MzUsMHgzMSwweDhmLDB4ZGMsMHhlZCwweDZiLAkvKiB5ICovCisJICAweGMyLDB4ODIsMHg4NiwweDUzLDB4MTcsMHgzMywweGMzLDB4ZjAsMHgzYywweDRmLAorCSAgMHhlZSwKKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIG9yZGVyICovCisJICAweDAxLDB4QjgsMHhGQSwweDE2LDB4REYsMHhBQiwweDlBLDB4Q0EsMHgxNiwweEI2LAorCSAgMHhCMyB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzIxKjZdOyB9CisJX0VDX1NFQ0dfUFJJTUVfMTYwUjEgPSB7CisJeyBOSURfWDlfNjJfcHJpbWVfZmllbGQsMjAsMjEsMSB9LAorCXsgMHgxMCwweDUzLDB4Q0QsMHhFNCwweDJDLDB4MTQsMHhENiwweDk2LDB4RTYsMHg3NiwJLyogc2VlZCAqLworCSAgMHg4NywweDU2LDB4MTUsMHgxNywweDUzLDB4M0IsMHhGMywweEY4LDB4MzMsMHg0NSwKKworCSAgMHgwMCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogcCAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDdGLDB4RkYsMHhGRiwKKwkgIDB4RkYsCisJICAweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBhICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4N0YsMHhGRiwweEZGLAorCSAgMHhGQywKKwkgIDB4MDAsMHgxQywweDk3LDB4QkUsMHhGQywweDU0LDB4QkQsMHg3QSwweDhCLDB4NjUsCS8qIGIgKi8KKwkgIDB4QUMsMHhGOCwweDlGLDB4ODEsMHhENCwweEQ0LDB4QUQsMHhDNSwweDY1LDB4RkEsCisJICAweDQ1LAorCSAgMHgwMCwweDRBLDB4OTYsMHhCNSwweDY4LDB4OEUsMHhGNSwweDczLDB4MjgsMHg0NiwJLyogeCAqLworCSAgMHg2NCwweDY5LDB4ODksMHg2OCwweEMzLDB4OEIsMHhCOSwweDEzLDB4Q0IsMHhGQywKKwkgIDB4ODIsCisJICAweDAwLDB4MjMsMHhhNiwweDI4LDB4NTUsMHgzMSwweDY4LDB4OTQsMHg3ZCwweDU5LAkvKiB5ICovCisJICAweGRjLDB4YzksMHgxMiwweDA0LDB4MjMsMHg1MSwweDM3LDB4N2EsMHhjNSwweGZiLAorCSAgMHgzMiwKKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIG9yZGVyICovCisJICAweDAxLDB4RjQsMHhDOCwweEY5LDB4MjcsMHhBRSwweEQzLDB4Q0EsMHg3NSwweDIyLAorCSAgMHg1NyB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzIxKjZdOyB9CisJX0VDX1NFQ0dfUFJJTUVfMTYwUjIgPSB7CisJeyBOSURfWDlfNjJfcHJpbWVfZmllbGQsMjAsMjEsMSB9LAorCXsgMHhCOSwweDlCLDB4OTksMHhCMCwweDk5LDB4QjMsMHgyMywweEUwLDB4MjcsMHgwOSwJLyogc2VlZCAqLworCSAgMHhBNCwweEQ2LDB4OTYsMHhFNiwweDc2LDB4ODcsMHg1NiwweDE1LDB4MTcsMHg1MSwKKworCSAgMHgwMCwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogcCAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsMHhBQywKKwkgIDB4NzMsCisJICAweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBhICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwweEFDLAorCSAgMHg3MCwKKwkgIDB4MDAsMHhCNCwweEUxLDB4MzQsMHhEMywweEZCLDB4NTksMHhFQiwweDhCLDB4QUIsCS8qIGIgKi8KKwkgIDB4NTcsMHgyNywweDQ5LDB4MDQsMHg2NiwweDRELDB4NUEsMHhGNSwweDAzLDB4ODgsCisJICAweEJBLAorCSAgMHgwMCwweDUyLDB4REMsMHhCMCwweDM0LDB4MjksMHgzQSwweDExLDB4N0UsMHgxRiwJLyogeCAqLworCSAgMHg0RiwweEYxLDB4MUIsMHgzMCwweEY3LDB4MTksMHg5RCwweDMxLDB4NDQsMHhDRSwKKwkgIDB4NkQsCisJICAweDAwLDB4ZmUsMHhhZiwweGZlLDB4ZjIsMHhlMywweDMxLDB4ZjIsMHg5NiwweGUwLAkvKiB5ICovCisJICAweDcxLDB4ZmEsMHgwZCwweGY5LDB4OTgsMHgyYywweGZlLDB4YTcsMHhkNCwweDNmLAorCSAgMHgyZSwKKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIG9yZGVyICovCisJICAweDAwLDB4MzUsMHgxRSwweEU3LDB4ODYsMHhBOCwweDE4LDB4RjMsMHhBMSwweEExLAorCSAgMHg2QiB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArMjQqNl07IH0KKwlfRUNfU0VDR19QUklNRV8xOTJLMSA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwwLDI0LDEgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIHAgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkUsCisJICAweEZGLDB4RkYsMHhFRSwweDM3LAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogYSAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMywKKwkgIDB4REIsMHg0RiwweEYxLDB4MEUsMHhDMCwweDU3LDB4RTksMHhBRSwweDI2LDB4QjAsCS8qIHggKi8KKwkgIDB4N0QsMHgwMiwweDgwLDB4QjcsMHhGNCwweDM0LDB4MUQsMHhBNSwweEQxLDB4QjEsCisJICAweEVBLDB4RTAsMHg2QywweDdELAorCSAgMHg5YiwweDJmLDB4MmYsMHg2ZCwweDljLDB4NTYsMHgyOCwweGE3LDB4ODQsMHg0MSwJLyogeSAqLworCSAgMHg2MywweGQwLDB4MTUsMHhiZSwweDg2LDB4MzQsMHg0MCwweDgyLDB4YWEsMHg4OCwKKwkgIDB4ZDksMHg1ZSwweDJmLDB4OWQsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZFLDB4MjYsMHhGMiwweEZDLDB4MTcsMHgwRiwweDY5LDB4NDYsMHg2QSwKKwkgIDB4NzQsMHhERSwweEZELDB4OEQgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVswKzI5KjZdOyB9CisJX0VDX1NFQ0dfUFJJTUVfMjI0SzEgPSB7CisJeyBOSURfWDlfNjJfcHJpbWVfZmllbGQsMCwyOSwxIH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBwICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLDB4RkYsMHhGRiwweEU1LDB4NkQsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDUsCisJICAweDAwLDB4QTEsMHg0NSwweDVCLDB4MzMsMHg0RCwweEYwLDB4OTksMHhERiwweDMwLAkvKiB4ICovCisJICAweEZDLDB4MjgsMHhBMSwweDY5LDB4QTQsMHg2NywweEU5LDB4RTQsMHg3MCwweDc1LAorCSAgMHhBOSwweDBGLDB4N0UsMHg2NSwweDBFLDB4QjYsMHhCNywweEE0LDB4NUMsCisJICAweDAwLDB4N2UsMHgwOCwweDlmLDB4ZWQsMHg3ZiwweGJhLDB4MzQsMHg0MiwweDgyLAkvKiB5ICovCisJICAweGNhLDB4ZmIsMHhkNiwweGY3LDB4ZTMsMHgxOSwweGY3LDB4YzAsMHhiMCwweGJkLAorCSAgMHg1OSwweGUyLDB4Y2EsMHg0YiwweGRiLDB4NTUsMHg2ZCwweDYxLDB4YTUsCisJICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBvcmRlciAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4REMsMHhFOCwweEQyLDB4RUMsMHg2MSwKKwkgIDB4ODQsMHhDQSwweEYwLDB4QTksMHg3MSwweDc2LDB4OUYsMHhCMSwweEY3IH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMCszMio2XTsgfQorCV9FQ19TRUNHX1BSSU1FXzI1NksxID0geworCXsgTklEX1g5XzYyX3ByaW1lX2ZpZWxkLDAsMzIsMSB9LAorCXsJCQkJCQkJLyogbm8gc2VlZCAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogcCAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweEZGLDB4RkYsCisJICAweEZDLDB4MkYsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIGIgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDA3LAorCSAgMHg3OSwweEJFLDB4NjYsMHg3RSwweEY5LDB4REMsMHhCQiwweEFDLDB4NTUsMHhBMCwJLyogeCAqLworCSAgMHg2MiwweDk1LDB4Q0UsMHg4NywweDBCLDB4MDcsMHgwMiwweDlCLDB4RkMsMHhEQiwKKwkgIDB4MkQsMHhDRSwweDI4LDB4RDksMHg1OSwweEYyLDB4ODEsMHg1QiwweDE2LDB4RjgsCisJICAweDE3LDB4OTgsCisJICAweDQ4LDB4M2EsMHhkYSwweDc3LDB4MjYsMHhhMywweGM0LDB4NjUsMHg1ZCwweGE0LAkvKiB5ICovCisJICAweGZiLDB4ZmMsMHgwZSwweDExLDB4MDgsMHhhOCwweGZkLDB4MTcsMHhiNCwweDQ4LAorCSAgMHhhNiwweDg1LDB4NTQsMHgxOSwweDljLDB4NDcsMHhkMCwweDhmLDB4ZmIsMHgxMCwKKwkgIDB4ZDQsMHhiOCwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIG9yZGVyICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwweEJBLDB4QUUsMHhEQywweEU2LAorCSAgMHhBRiwweDQ4LDB4QTAsMHgzQiwweEJGLDB4RDIsMHg1RSwweDhDLDB4RDAsMHgzNiwKKwkgIDB4NDEsMHg0MSB9CisJfTsKKworLyogc29tZSB3YXAvd3RscyBjdXJ2ZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVswKzE1KjZdOyB9CisJX0VDX1dUTFNfOCA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwwLDE1LDEgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIHAgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkQsMHhFNywKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIGEgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIGIgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHggKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHkgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwKKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweEVDLDB4RUEsCS8qIG9yZGVyICovCisJICAweDU1LDB4MUEsMHhEOCwweDM3LDB4RTkgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVswKzIxKjZdOyB9CisJX0VDX1dUTFNfOSA9IHsKKwl7IE5JRF9YOV82Ml9wcmltZV9maWVsZCwwLDIxLDEgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4MDAsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIHAgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZDLDB4ODAsCisJICAweDhGLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogYSAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMywKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHggKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAxLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogeSAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDIsCisJICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBvcmRlciAqLworCSAgMHgwMSwweENELDB4QzksMHg4QSwweEUwLDB4RTIsMHhERSwweDU3LDB4NEEsMHhCRiwKKwkgIDB4MzMgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVswKzI4KjZdOyB9CisJX0VDX1dUTFNfMTIgPSB7CisJeyBOSURfWDlfNjJfcHJpbWVfZmllbGQsMCwyOCwxIH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBwICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLAorCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogYSAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkUsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRSwKKwkgIDB4QjQsMHgwNSwweDBBLDB4ODUsMHgwQywweDA0LDB4QjMsMHhBQiwweEY1LDB4NDEsCS8qIGIgKi8KKwkgIDB4MzIsMHg1NiwweDUwLDB4NDQsMHhCMCwweEI3LDB4RDcsMHhCRiwweEQ4LDB4QkEsCisJICAweDI3LDB4MEIsMHgzOSwweDQzLDB4MjMsMHg1NSwweEZGLDB4QjQsCisJICAweEI3LDB4MEUsMHgwQywweEJELDB4NkIsMHhCNCwweEJGLDB4N0YsMHgzMiwweDEzLAkvKiB4ICovCisJICAweDkwLDB4QjksMHg0QSwweDAzLDB4QzEsMHhEMywweDU2LDB4QzIsMHgxMSwweDIyLAorCSAgMHgzNCwweDMyLDB4ODAsMHhENiwweDExLDB4NUMsMHgxRCwweDIxLAorCSAgMHhiZCwweDM3LDB4NjMsMHg4OCwweGI1LDB4ZjcsMHgyMywweGZiLDB4NGMsMHgyMiwJLyogeSAqLworCSAgMHhkZiwweGU2LDB4Y2QsMHg0MywweDc1LDB4YTAsMHg1YSwweDA3LDB4NDcsMHg2NCwKKwkgIDB4NDQsMHhkNSwweDgxLDB4OTksMHg4NSwweDAwLDB4N2UsMHgzNCwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIG9yZGVyICovCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4MTYsMHhBMiwweEUwLDB4QjgsMHhGMCwweDNFLAorCSAgMHgxMywweERELDB4MjksMHg0NSwweDVDLDB4NUMsMHgyQSwweDNEIH0KKwl9OworCisvKiBjaGFyYWN0ZXJpc3RpYyB0d28gY3VydmVzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMTUqNl07IH0KKwlfRUNfU0VDR19DSEFSMl8xMTNSMSA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMTUsMiB9LAorCXsgMHgxMCwweEU3LDB4MjMsMHhBQiwweDE0LDB4RDYsMHg5NiwweEU2LDB4NzYsMHg4NywJLyogc2VlZCAqLworCSAgMHg1NiwweDE1LDB4MTcsMHg1NiwweEZFLDB4QkYsMHg4RiwweENCLDB4NDksMHhBOSwKKworCSAgMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMiwweDAxLAorCSAgMHgwMCwweDMwLDB4ODgsMHgyNSwweDBDLDB4QTYsMHhFNywweEM3LDB4RkUsMHg2NCwJLyogYSAqLworCSAgMHg5QywweEU4LDB4NTgsMHgyMCwweEY3LAorCSAgMHgwMCwweEU4LDB4QkUsMHhFNCwweEQzLDB4RTIsMHgyNiwweDA3LDB4NDQsMHgxOCwJLyogYiAqLworCSAgMHg4QiwweEUwLDB4RTksMHhDNywweDIzLAorCSAgMHgwMCwweDlELDB4NzMsMHg2MSwweDZGLDB4MzUsMHhGNCwweEFCLDB4MTQsMHgwNywJLyogeCAqLworCSAgMHhENywweDM1LDB4NjIsMHhDMSwweDBGLAorCSAgMHgwMCwweEE1LDB4MjgsMHgzMCwweDI3LDB4NzksMHg1OCwweEVFLDB4ODQsMHhEMSwJLyogeSAqLworCSAgMHgzMSwweDVFLDB4RDMsMHgxOCwweDg2LAorCSAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4RDksMHhDQywJLyogb3JkZXIgKi8KKwkgIDB4RUMsMHg4QSwweDM5LDB4RTUsMHg2RiB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzE1KjZdOyB9CisJX0VDX1NFQ0dfQ0hBUjJfMTEzUjIgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDIwLDE1LDIgfSwKKwl7IDB4MTAsMHhDMCwweEZCLDB4MTUsMHg3NiwweDA4LDB4NjAsMHhERSwweEYxLDB4RUUsCS8qIHNlZWQgKi8KKwkgIDB4RjQsMHhENiwweDk2LDB4RTYsMHg3NiwweDg3LDB4NTYsMHgxNSwweDE3LDB4NUQsCisKKwkgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDIsMHgwMSwKKwkgIDB4MDAsMHg2OCwweDk5LDB4MTgsMHhEQiwweEVDLDB4N0UsMHg1QSwweDBELDB4RDYsCS8qIGEgKi8KKwkgIDB4REYsMHhDMCwweEFBLDB4NTUsMHhDNywKKwkgIDB4MDAsMHg5NSwweEU5LDB4QTksMHhFQywweDlCLDB4MjksMHg3QiwweEQ0LDB4QkYsCS8qIGIgKi8KKwkgIDB4MzYsMHhFMCwweDU5LDB4MTgsMHg0RiwKKwkgIDB4MDEsMHhBNSwweDdBLDB4NkEsMHg3QiwweDI2LDB4Q0EsMHg1RSwweEY1LDB4MkYsCS8qIHggKi8KKwkgIDB4Q0QsMHhCOCwweDE2LDB4NDcsMHg5NywKKwkgIDB4MDAsMHhCMywweEFELDB4QzksMHg0RSwweEQxLDB4RkUsMHg2NywweDRDLDB4MDYsCS8qIHkgKi8KKwkgIDB4RTYsMHg5NSwweEJBLDB4QkEsMHgxRCwKKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDA4LDB4NzgsCS8qIG9yZGVyICovCisJICAweDlCLDB4MjQsMHg5NiwweEFGLDB4OTMgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCsxNyo2XTsgfQorCV9FQ19TRUNHX0NIQVIyXzEzMVIxID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwyMCwxNywyIH0sCisJeyAweDRELDB4NjksMHg2RSwweDY3LDB4NjgsMHg3NSwweDYxLDB4NTEsMHg3NSwweDk4LAkvKiBzZWVkICovCisJICAweDVCLDB4RDMsMHhBRCwweEJBLDB4REEsMHgyMSwweEI0LDB4M0EsMHg5NywweEUyLAorCisJICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDBELAorCSAgMHgwNywweEExLDB4MUIsMHgwOSwweEE3LDB4NkIsMHg1NiwweDIxLDB4NDQsMHg0MSwJLyogYSAqLworCSAgMHg4RiwweEYzLDB4RkYsMHg4QywweDI1LDB4NzAsMHhCOCwKKwkgIDB4MDIsMHgxNywweEMwLDB4NTYsMHgxMCwweDg4LDB4NEIsMHg2MywweEI5LDB4QzYsCS8qIGIgKi8KKwkgIDB4QzcsMHgyOSwweDE2LDB4NzgsMHhGOSwweEQzLDB4NDEsCisJICAweDAwLDB4ODEsMHhCQSwweEY5LDB4MUYsMHhERiwweDk4LDB4MzMsMHhDNCwweDBGLAkvKiB4ICovCisJICAweDlDLDB4MTgsMHgxMywweDQzLDB4NjMsMHg4MywweDk5LAorCSAgMHgwNywweDhDLDB4NkUsMHg3RSwweEEzLDB4OEMsMHgwMCwweDFGLDB4NzMsMHhDOCwJLyogeSAqLworCSAgMHgxMywweDRCLDB4MUIsMHg0RSwweEY5LDB4RTEsMHg1MCwKKwkgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MzEsCS8qIG9yZGVyICovCisJICAweDIzLDB4OTUsMHgzQSwweDk0LDB4NjQsMHhCNSwweDREIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMTcqNl07IH0KKwlfRUNfU0VDR19DSEFSMl8xMzFSMiA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMTcsMiB9LAorCXsgMHg5OCwweDVCLDB4RDMsMHhBRCwweEJBLDB4RDQsMHhENiwweDk2LDB4RTYsMHg3NiwJLyogc2VlZCAqLworCSAgMHg4NywweDU2LDB4MTUsMHgxNywweDVBLDB4MjEsMHhCNCwweDNBLDB4OTcsMHhFMywKKworCSAgMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwRCwKKwkgIDB4MDMsMHhFNSwweEE4LDB4ODksMHgxOSwweEQ3LDB4Q0EsMHhGQywweEJGLDB4NDEsCS8qIGEgKi8KKwkgIDB4NUYsMHgwNywweEMyLDB4MTcsMHg2NSwweDczLDB4QjIsCisJICAweDA0LDB4QjgsMHgyNiwweDZBLDB4NDYsMHhDNSwweDU2LDB4NTcsMHhBQywweDczLAkvKiBiICovCisJICAweDRDLDB4RTMsMHg4RiwweDAxLDB4OEYsMHgyMSwweDkyLAorCSAgMHgwMywweDU2LDB4REMsMHhEOCwweEYyLDB4RjksMHg1MCwweDMxLDB4QUQsMHg2NSwJLyogeCAqLworCSAgMHgyRCwweDIzLDB4OTUsMHgxQiwweEIzLDB4NjYsMHhBOCwKKwkgIDB4MDYsMHg0OCwweEYwLDB4NkQsMHg4NiwweDc5LDB4NDAsMHhBNSwweDM2LDB4NkQsCS8qIHkgKi8KKwkgIDB4OUUsMHgyNiwweDVELDB4RTksMHhFQiwweDI0LDB4MEYsCisJICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDY5LAkvKiBvcmRlciAqLworCSAgMHg1NCwweEEyLDB4MzMsMHgwNCwweDlCLDB4QTksMHg4RiB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArMjEqNl07IH0KKwlfRUNfTklTVF9DSEFSMl8xNjNLID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwwLDIxLDIgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweEM5LAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogYSAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDEsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMSwKKwkgIDB4MDIsMHhGRSwweDEzLDB4QzAsMHg1MywweDdCLDB4QkMsMHgxMSwweEFDLDB4QUEsCS8qIHggKi8KKwkgIDB4MDcsMHhENywweDkzLDB4REUsMHg0RSwweDZELDB4NUUsMHg1QywweDk0LDB4RUUsCisJICAweEU4LAorCSAgMHgwMiwweDg5LDB4MDcsMHgwRiwweEIwLDB4NUQsMHgzOCwweEZGLDB4NTgsMHgzMiwJLyogeSAqLworCSAgMHgxRiwweDJFLDB4ODAsMHgwNSwweDM2LDB4RDUsMHgzOCwweENDLDB4REEsMHhBMywKKwkgIDB4RDksCisJICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBvcmRlciAqLworCSAgMHgwMiwweDAxLDB4MDgsMHhBMiwweEUwLDB4Q0MsMHgwRCwweDk5LDB4RjgsMHhBNSwKKwkgIDB4RUYgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVswKzIxKjZdOyB9CisJX0VDX1NFQ0dfQ0hBUjJfMTYzUjEgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDAsMjEsMiB9LAorCXsJCQkJCQkJLyogbm8gc2VlZCAqLworI2lmIDAKKy8qIFRoZSBhbGdvcml0aG0gdXNlZCB0byBkZXJpdmUgdGhlIGN1cnZlIHBhcmFtZXRlcnMgZnJvbQorICogdGhlIHNlZWQgdXNlZCBoZXJlIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0aGFuIHRoZQorICogYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiBYOS42MiAuICovCisJICAweDI0LDB4QjcsMHhCMSwweDM3LDB4QzgsMHhBMSwweDRELDB4NjksMHg2RSwweDY3LAorCSAgMHg2OCwweDc1LDB4NjEsMHg1MSwweDc1LDB4NkYsMHhEMCwweERBLDB4MkUsMHg1QywKKyNlbmRpZgorCSAgMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4QzksCisJICAweDA3LDB4QjYsMHg4OCwweDJDLDB4QUEsMHhFRiwweEE4LDB4NEYsMHg5NSwweDU0LAkvKiBhICovCisJICAweEZGLDB4ODQsMHgyOCwweEJELDB4ODgsMHhFMiwweDQ2LDB4RDIsMHg3OCwweDJBLAorCSAgMHhFMiwKKwkgIDB4MDcsMHgxMywweDYxLDB4MkQsMHhDRCwweERDLDB4QjQsMHgwQSwweEFCLDB4OTQsCS8qIGIgKi8KKwkgIDB4NkIsMHhEQSwweDI5LDB4Q0EsMHg5MSwweEY3LDB4M0EsMHhGOSwweDU4LDB4QUYsCisJICAweEQ5LAorCSAgMHgwMywweDY5LDB4OTcsMHg5NiwweDk3LDB4QUIsMHg0MywweDg5LDB4NzcsMHg4OSwJLyogeCAqLworCSAgMHg1NiwweDY3LDB4ODksMHg1NiwweDdGLDB4NzgsMHg3QSwweDc4LDB4NzYsMHhBNiwKKwkgIDB4NTQsCisJICAweDAwLDB4NDMsMHg1RSwweERCLDB4NDIsMHhFRiwweEFGLDB4QjIsMHg5OCwweDlELAkvKiB5ICovCisJICAweDUxLDB4RkUsMHhGQywweEUzLDB4QzgsMHgwOSwweDg4LDB4RjQsMHgxRiwweEY4LAorCSAgMHg4MywKKwkgIDB4MDMsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIG9yZGVyICovCisJICAweEZGLDB4NDgsMHhBQSwweEI2LDB4ODksMHhDMiwweDlDLDB4QTcsMHgxMCwweDI3LAorCSAgMHg5QiB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArMjEqNl07IH0KKwlfRUNfTklTVF9DSEFSMl8xNjNCID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwwLDIxLDIgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKyNpZiAwCisvKiBUaGUgc2VlZCBoZXJlIHdhcyB1c2VkIHRvIGNyZWF0ZWQgdGhlIGN1cnZlIHBhcmFtZXRlcnMgaW4gbm9ybWFsCisgKiBiYXNpcyByZXByZXNlbnRhdGlvbiAoYW5kIG5vdCB0aGUgcG9seW5vbWlhbCByZXByZXNlbnRhdGlvbiB1c2VkIGhlcmUpICovCisJICAweDg1LDB4RTIsMHg1QiwweEZFLDB4NUMsMHg4NiwweDIyLDB4NkMsMHhEQiwweDEyLAorCSAgMHgwMSwweDZGLDB4NzUsMHg1MywweEY5LDB4RDAsMHhFNiwweDkzLDB4QTIsMHg2OCwKKyNlbmRpZgorCSAgMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4QzksCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMSwKKwkgIDB4MDIsMHgwQSwweDYwLDB4MTksMHgwNywweEI4LDB4QzksMHg1MywweENBLDB4MTQsCS8qIGIgKi8KKwkgIDB4ODEsMHhFQiwweDEwLDB4NTEsMHgyRiwweDc4LDB4NzQsMHg0QSwweDMyLDB4MDUsCisJICAweEZELAorCSAgMHgwMywweEYwLDB4RUIsMHhBMSwweDYyLDB4ODYsMHhBMiwweEQ1LDB4N0UsMHhBMCwJLyogeCAqLworCSAgMHg5OSwweDExLDB4NjgsMHhENCwweDk5LDB4NDYsMHgzNywweEU4LDB4MzQsMHgzRSwKKwkgIDB4MzYsCisJICAweDAwLDB4RDUsMHgxRiwweEJDLDB4NkMsMHg3MSwweEEwLDB4MDksMHg0RiwweEEyLAkvKiB5ICovCisJICAweENELDB4RDUsMHg0NSwweEIxLDB4MUMsMHg1QywweDBDLDB4NzksMHg3MywweDI0LAorCSAgMHhGMSwKKwkgIDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIG9yZGVyICovCisJICAweDAyLDB4OTIsMHhGRSwweDc3LDB4RTcsMHgwQywweDEyLDB4QTQsMHgyMywweDRDLAorCSAgMHgzMyB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzI1KjZdOyB9CisJX0VDX1NFQ0dfQ0hBUjJfMTkzUjEgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDIwLDI1LDIgfSwKKwl7IDB4MTAsMHgzRiwweEFFLDB4QzcsMHg0RCwweDY5LDB4NkUsMHg2NywweDY4LDB4NzUsCS8qIHNlZWQgKi8KKwkgIDB4NjEsMHg1MSwweDc1LDB4NzcsMHg3RiwweEM1LDB4QjEsMHg5MSwweEVGLDB4MzAsCisKKwkgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDgwLDB4MDEsCisJICAweDAwLDB4MTcsMHg4NSwweDhGLDB4RUIsMHg3QSwweDk4LDB4OTcsMHg1MSwweDY5LAkvKiBhICovCisJICAweEUxLDB4NzEsMHhGNywweDdCLDB4NDAsMHg4NywweERFLDB4MDksMHg4QSwweEM4LAorCSAgMHhBOSwweDExLDB4REYsMHg3QiwweDAxLAorCSAgMHgwMCwweEZELDB4RkIsMHg0OSwweEJGLDB4RTYsMHhDMywweEE4LDB4OUYsMHhBQywJLyogYiAqLworCSAgMHhBRCwweEFBLDB4N0EsMHgxRSwweDVCLDB4QkMsMHg3QywweEMxLDB4QzIsMHhFNSwKKwkgIDB4RDgsMHgzMSwweDQ3LDB4ODgsMHgxNCwKKwkgIDB4MDEsMHhGNCwweDgxLDB4QkMsMHg1RiwweDBGLDB4RjgsMHg0QSwweDc0LDB4QUQsCS8qIHggKi8KKwkgIDB4NkMsMHhERiwweDZGLDB4REUsMHhGNCwweEJGLDB4NjEsMHg3OSwweDYyLDB4NTMsCisJICAweDcyLDB4RDgsMHhDMCwweEM1LDB4RTEsCisJICAweDAwLDB4MjUsMHhFMywweDk5LDB4RjIsMHg5MCwweDM3LDB4MTIsMHhDQywweEYzLAkvKiB5ICovCisJICAweEVBLDB4OUUsMHgzQSwweDFBLDB4RDEsMHg3RiwweEIwLDB4QjMsMHgyMCwweDFCLAorCSAgMHg2QSwweEY3LDB4Q0UsMHgxQiwweDA1LAorCSAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogb3JkZXIgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4QzcsMHhGMywweDRBLDB4NzcsMHg4RiwweDQ0LDB4M0EsCisJICAweENDLDB4OTIsMHgwRSwweEJBLDB4NDkgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCsyNSo2XTsgfQorCV9FQ19TRUNHX0NIQVIyXzE5M1IyID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwyMCwyNSwyIH0sCisJeyAweDEwLDB4QjcsMHhCNCwweEQ2LDB4OTYsMHhFNiwweDc2LDB4ODcsMHg1NiwweDE1LAkvKiBzZWVkICovCisJICAweDE3LDB4NTEsMHgzNywweEM4LDB4QTEsMHg2RiwweEQwLDB4REEsMHgyMiwweDExLAorCisJICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHg4MCwweDAxLAorCSAgMHgwMSwweDYzLDB4RjMsMHg1QSwweDUxLDB4MzcsMHhDMiwweENFLDB4M0UsMHhBNiwJLyogYSAqLworCSAgMHhFRCwweDg2LDB4NjcsMHgxOSwweDBCLDB4MEIsMHhDNCwweDNFLDB4Q0QsMHg2OSwKKwkgIDB4OTcsMHg3NywweDAyLDB4NzAsMHg5QiwKKwkgIDB4MDAsMHhDOSwweEJCLDB4OUUsMHg4OSwweDI3LDB4RDQsMHhENiwweDRDLDB4MzcsCS8qIGIgKi8KKwkgIDB4N0UsMHgyQSwweEIyLDB4ODUsMHg2QSwweDVCLDB4MTYsMHhFMywweEVGLDB4QjcsCisJICAweEY2LDB4MUQsMHg0MywweDE2LDB4QUUsCisJICAweDAwLDB4RDksMHhCNiwweDdELDB4MTksMHgyRSwweDAzLDB4NjcsMHhDOCwweDAzLAkvKiB4ICovCisJICAweEYzLDB4OUUsMHgxQSwweDdFLDB4ODIsMHhDQSwweDE0LDB4QTYsMHg1MSwweDM1LAorCSAgMHgwQSwweEFFLDB4NjEsMHg3RSwweDhGLAorCSAgMHgwMSwweENFLDB4OTQsMHgzMywweDU2LDB4MDcsMHhDMywweDA0LDB4QUMsMHgyOSwJLyogeSAqLworCSAgMHhFNywweERFLDB4RkIsMHhEOSwweENBLDB4MDEsMHhGNSwweDk2LDB4RjksMHgyNywKKwkgIDB4MjIsMHg0QywweERFLDB4Q0YsMHg2QywKKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIG9yZGVyICovCisJICAweDAwLDB4MDAsMHgwMSwweDVBLDB4QUIsMHg1NiwweDFCLDB4MDAsMHg1NCwweDEzLAorCSAgMHhDQywweEQ0LDB4RUUsMHg5OSwweEQ1IH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMCszMCo2XTsgfQorCV9FQ19OSVNUX0NIQVIyXzIzM0sgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDAsMzAsNCB9LAorCXsJCQkJCQkJLyogbm8gc2VlZCAqLworCSAgMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLAorCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogYiAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisKKwkgIDB4MDEsMHg3MiwweDMyLDB4QkEsMHg4NSwweDNBLDB4N0UsMHg3MywweDFBLDB4RjEsCS8qIHggKi8KKwkgIDB4MjksMHhGMiwweDJGLDB4RjQsMHgxNCwweDk1LDB4NjMsMHhBNCwweDE5LDB4QzIsCisJICAweDZCLDB4RjUsMHgwQSwweDRDLDB4OUQsMHg2RSwweEVGLDB4QUQsMHg2MSwweDI2LAorCisJICAweDAxLDB4REIsMHg1MywweDdELDB4RUMsMHhFOCwweDE5LDB4QjcsMHhGNywweDBGLAkvKiB5ICovCisJICAweDU1LDB4NUEsMHg2NywweEM0LDB4MjcsMHhBOCwweENELDB4OUIsMHhGMSwweDhBLAorCSAgMHhFQiwweDlCLDB4NTYsMHhFMCwweEMxLDB4MTAsMHg1NiwweEZBLDB4RTYsMHhBMywKKworCSAgMHgwMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogb3JkZXIgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA2LDB4OUQsMHg1QiwweEI5LDB4MTUsCisJICAweEJDLDB4RDQsMHg2RSwweEZCLDB4MUEsMHhENSwweEYxLDB4NzMsMHhBQiwweERGIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMzAqNl07IH0KKwlfRUNfTklTVF9DSEFSMl8yMzNCID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwyMCwzMCwyIH0sCisJeyAweDc0LDB4RDUsMHg5RiwweEYwLDB4N0YsMHg2QiwweDQxLDB4M0QsMHgwRSwweEExLAkvKiBzZWVkICovCisJICAweDRCLDB4MzQsMHg0QiwweDIwLDB4QTIsMHhEQiwweDA0LDB4OUIsMHg1MCwweEMzLAorCisJICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwKKworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogYSAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisKKwkgIDB4MDAsMHg2NiwweDY0LDB4N0UsMHhERSwweDZDLDB4MzMsMHgyQywweDdGLDB4OEMsCS8qIGIgKi8KKwkgIDB4MDksMHgyMywweEJCLDB4NTgsMHgyMSwweDNCLDB4MzMsMHgzQiwweDIwLDB4RTksCisJICAweENFLDB4NDIsMHg4MSwweEZFLDB4MTEsMHg1RiwweDdELDB4OEYsMHg5MCwweEFELAorCisJICAweDAwLDB4RkEsMHhDOSwweERGLDB4Q0IsMHhBQywweDgzLDB4MTMsMHhCQiwweDIxLAkvKiB4ICovCisJICAweDM5LDB4RjEsMHhCQiwweDc1LDB4NUYsMHhFRiwweDY1LDB4QkMsMHgzOSwweDFGLAorCSAgMHg4QiwweDM2LDB4RjgsMHhGOCwweEVCLDB4NzMsMHg3MSwweEZELDB4NTUsMHg4QiwKKworCSAgMHgwMSwweDAwLDB4NkEsMHgwOCwweEE0LDB4MTksMHgwMywweDM1LDB4MDYsMHg3OCwJLyogeSAqLworCSAgMHhFNSwweDg1LDB4MjgsMHhCRSwweEJGLDB4OEEsMHgwQiwweEVGLDB4RjgsMHg2NywKKwkgIDB4QTcsMHhDQSwweDM2LDB4NzEsMHg2RiwweDdFLDB4MDEsMHhGOCwweDEwLDB4NTIsCisKKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIG9yZGVyICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMywweEU5LDB4NzQsMHhFNywweDJGLAorCSAgMHg4QSwweDY5LDB4MjIsMHgwMywweDFELDB4MjYsMHgwMywweENGLDB4RTAsMHhENyB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArMzAqNl07IH0KKwlfRUNfU0VDR19DSEFSMl8yMzlLMSA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMCwzMCw0IH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIGEgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwKKworCSAgMHgyOSwweEEwLDB4QjYsMHhBOCwweDg3LDB4QTksMHg4MywweEU5LDB4NzMsMHgwOSwJLyogeCAqLworCSAgMHg4OCwweEE2LDB4ODcsMHgyNywweEE4LDB4QjIsMHhEMSwweDI2LDB4QzQsMHg0QywKKwkgIDB4QzIsMHhDQywweDdCLDB4MkEsMHg2NSwweDU1LDB4MTksMHgzMCwweDM1LDB4REMsCisKKwkgIDB4NzYsMHgzMSwweDA4LDB4MDQsMHhGMSwweDJFLDB4NTQsMHg5QiwweERCLDB4MDEsCS8qIHkgKi8KKwkgIDB4MUMsMHgxMCwweDMwLDB4ODksMHhFNywweDM1LDB4MTAsMHhBQywweEIyLDB4NzUsCisJICAweEZDLDB4MzEsMHgyQSwweDVELDB4QzYsMHhCNywweDY1LDB4NTMsMHhGMCwweENBLAorCisJICAweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBvcmRlciAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NUEsMHg3OSwweEZFLDB4QzYsMHg3QywKKwkgIDB4QjYsMHhFOSwweDFGLDB4MUMsMHgxRCwweEE4LDB4MDAsMHhFNCwweDc4LDB4QTUgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVswKzM2KjZdOyB9CisJX0VDX05JU1RfQ0hBUjJfMjgzSyA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMCwzNiw0IH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhBMSwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIGEgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLAorCSAgMHgwNSwweDAzLDB4MjEsMHgzRiwweDc4LDB4Q0EsMHg0NCwweDg4LDB4M0YsMHgxQSwJLyogeCAqLworCSAgMHgzQiwweDgxLDB4NjIsMHhGMSwweDg4LDB4RTUsMHg1MywweENELDB4MjYsMHg1RiwKKwkgIDB4MjMsMHhDMSwweDU2LDB4N0EsMHgxNiwweDg3LDB4NjksMHgxMywweEIwLDB4QzIsCisJICAweEFDLDB4MjQsMHg1OCwweDQ5LDB4MjgsMHgzNiwKKwkgIDB4MDEsMHhDQywweERBLDB4MzgsMHgwRiwweDFDLDB4OUUsMHgzMSwweDhELDB4OTAsCS8qIHkgKi8KKwkgIDB4RjksMHg1RCwweDA3LDB4RTUsMHg0MiwweDZGLDB4RTgsMHg3RSwweDQ1LDB4QzAsCisJICAweEU4LDB4MTgsMHg0NiwweDk4LDB4RTQsMHg1OSwweDYyLDB4MzYsMHg0RSwweDM0LAorCSAgMHgxMSwweDYxLDB4NzcsMHhERCwweDIyLDB4NTksCisJICAweDAxLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RTksMHhBRSwKKwkgIDB4MkUsMHhEMCwweDc1LDB4NzcsMHgyNiwweDVELDB4RkYsMHg3RiwweDk0LDB4NDUsCisJICAweDFFLDB4MDYsMHgxRSwweDE2LDB4M0MsMHg2MSB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzM2KjZdOyB9CisJX0VDX05JU1RfQ0hBUjJfMjgzQiA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMzYsMiB9LAorCXsgMHg3NywweEUyLDB4QjAsMHg3MywweDcwLDB4RUIsMHgwRiwweDgzLDB4MkEsMHg2RCwJLyogbm8gc2VlZCAqLworCSAgMHhENSwweEI2LDB4MkQsMHhGQywweDg4LDB4Q0QsMHgwNiwweEJCLDB4ODQsMHhCRSwKKworCSAgMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhBMSwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIGEgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisJICAweDAyLDB4N0IsMHg2OCwweDBBLDB4QzgsMHhCOCwweDU5LDB4NkQsMHhBNSwweEE0LAkvKiBiICovCisJICAweEFGLDB4OEEsMHgxOSwweEEwLDB4MzAsMHgzRiwweENBLDB4OTcsMHhGRCwweDc2LAorCSAgMHg0NSwweDMwLDB4OUYsMHhBMiwweEE1LDB4ODEsMHg0OCwweDVBLDB4RjYsMHgyNiwKKwkgIDB4M0UsMHgzMSwweDNCLDB4NzksMHhBMiwweEY1LAorCSAgMHgwNSwweEY5LDB4MzksMHgyNSwweDhELDB4QjcsMHhERCwweDkwLDB4RTEsMHg5MywJLyogeCAqLworCSAgMHg0RiwweDhDLDB4NzAsMHhCMCwweERGLDB4RUMsMHgyRSwweEVELDB4MjUsMHhCOCwKKwkgIDB4NTUsMHg3RSwweEFDLDB4OUMsMHg4MCwweEUyLDB4RTEsMHg5OCwweEY4LDB4Q0QsCisJICAweEJFLDB4Q0QsMHg4NiwweEIxLDB4MjAsMHg1MywKKwkgIDB4MDMsMHg2NywweDY4LDB4NTQsMHhGRSwweDI0LDB4MTQsMHgxQywweEI5LDB4OEYsCS8qIHkgKi8KKwkgIDB4RTYsMHhENCwweEIyLDB4MEQsMHgwMiwweEI0LDB4NTEsMHg2RiwweEY3LDB4MDIsCisJICAweDM1LDB4MEUsMHhERCwweEIwLDB4ODIsMHg2NywweDc5LDB4QzgsMHgxMywweEYwLAorCSAgMHhERiwweDQ1LDB4QkUsMHg4MSwweDEyLDB4RjQsCisJICAweDAzLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RUYsMHg5MCwKKwkgIDB4MzksMHg5NiwweDYwLDB4RkMsMHg5MywweDhBLDB4OTAsMHgxNiwweDVCLDB4MDQsCisJICAweDJBLDB4N0MsMHhFRiwweEFELDB4QjMsMHgwNyB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArNTIqNl07IH0KKwlfRUNfTklTVF9DSEFSMl80MDlLID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwwLDUyLDQgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDEsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogYiAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMSwKKwkgIDB4MDAsMHg2MCwweEYwLDB4NUYsMHg2NSwweDhGLDB4NDksMHhDMSwweEFELDB4M0EsCS8qIHggKi8KKwkgIDB4QjEsMHg4OSwweDBGLDB4NzEsMHg4NCwweDIxLDB4MEUsMHhGRCwweDA5LDB4ODcsCisJICAweEUzLDB4MDcsMHhDOCwweDRDLDB4MjcsMHhBQywweENGLDB4QjgsMHhGOSwweEY2LAorCSAgMHg3QywweEMyLDB4QzQsMHg2MCwweDE4LDB4OUUsMHhCNSwweEFBLDB4QUEsMHg2MiwKKwkgIDB4RUUsMHgyMiwweDJFLDB4QjEsMHhCMywweDU1LDB4NDAsMHhDRiwweEU5LDB4MDIsCisJICAweDM3LDB4NDYsCisJICAweDAxLDB4RTMsMHg2OSwweDA1LDB4MEIsMHg3QywweDRFLDB4NDIsMHhBQywweEJBLAkvKiB5ICovCisJICAweDFELDB4QUMsMHhCRiwweDA0LDB4MjksMHg5QywweDM0LDB4NjAsMHg3OCwweDJGLAorCSAgMHg5MSwweDhFLDB4QTQsMHgyNywweEU2LDB4MzIsMHg1MSwweDY1LDB4RTksMHhFQSwKKwkgIDB4MTAsMHhFMywweERBLDB4NUYsMHg2QywweDQyLDB4RTksMHhDNSwweDUyLDB4MTUsCisJICAweEFBLDB4OUMsMHhBMiwweDdBLDB4NTgsMHg2MywweEVDLDB4NDgsMHhEOCwweEUwLAorCSAgMHgyOCwweDZCLAorCSAgMHgwMCwweDdGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwJLyogb3JkZXIgKi8KKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZFLDB4NUYsMHg4MywweEIyLAorCSAgMHhENCwweEVBLDB4MjAsMHg0MCwweDBFLDB4QzQsMHg1NSwweDdELDB4NUUsMHhEMywKKwkgIDB4RTMsMHhFNywweENBLDB4NUIsMHg0QiwweDVDLDB4ODMsMHhCOCwweEUwLDB4MUUsCisJICAweDVGLDB4Q0YgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCs1Mio2XTsgfQorCV9FQ19OSVNUX0NIQVIyXzQwOUIgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDIwLDUyLDIgfSwKKwl7IDB4NDAsMHg5OSwweEI1LDB4QTQsMHg1NywweEY5LDB4RDYsMHg5RiwweDc5LDB4MjEsCS8qIHNlZWQgKi8KKwkgIDB4M0QsMHgwOSwweDRDLDB4NEIsMHhDRCwweDRELDB4NDIsMHg2MiwweDIxLDB4MEIsCisKKwkgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDEsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAxLAorCSAgMHgwMCwweDIxLDB4QTUsMHhDMiwweEM4LDB4RUUsMHg5RiwweEVCLDB4NUMsMHg0QiwJLyogYiAqLworCSAgMHg5QSwweDc1LDB4M0IsMHg3QiwweDQ3LDB4NkIsMHg3RiwweEQ2LDB4NDIsMHgyRSwKKwkgIDB4RjEsMHhGMywweERELDB4NjcsMHg0NywweDYxLDB4RkEsMHg5OSwweEQ2LDB4QUMsCisJICAweDI3LDB4QzgsMHhBOSwweEExLDB4OTcsMHhCMiwweDcyLDB4ODIsMHgyRiwweDZDLAorCSAgMHhENSwweDdBLDB4NTUsMHhBQSwweDRGLDB4NTAsMHhBRSwweDMxLDB4N0IsMHgxMywKKwkgIDB4NTQsMHg1RiwKKwkgIDB4MDEsMHg1RCwweDQ4LDB4NjAsMHhEMCwweDg4LDB4REQsMHhCMywweDQ5LDB4NkIsCS8qIHggKi8KKwkgIDB4MEMsMHg2MCwweDY0LDB4NzUsMHg2MiwweDYwLDB4NDQsMHgxQywweERFLDB4NEEsCisJICAweEYxLDB4NzcsMHgxRCwweDRELDB4QjAsMHgxRiwweEZFLDB4NUIsMHgzNCwweEU1LAorCSAgMHg5NywweDAzLDB4REMsMHgyNSwweDVBLDB4ODYsMHg4QSwweDExLDB4ODAsMHg1MSwKKwkgIDB4NTYsMHgwMywweEFFLDB4QUIsMHg2MCwweDc5LDB4NEUsMHg1NCwweEJCLDB4NzksCisJICAweDk2LDB4QTcsCisJICAweDAwLDB4NjEsMHhCMSwweENGLDB4QUIsMHg2QiwweEU1LDB4RjMsMHgyQiwweEJGLAkvKiB5ICovCisJICAweEE3LDB4ODMsMHgyNCwweEVELDB4MTAsMHg2QSwweDc2LDB4MzYsMHhCOSwweEM1LAorCSAgMHhBNywweEJELDB4MTksMHg4RCwweDAxLDB4NTgsMHhBQSwweDRGLDB4NTQsMHg4OCwKKwkgIDB4RDAsMHg4RiwweDM4LDB4NTEsMHg0RiwweDFGLDB4REYsMHg0QiwweDRGLDB4NDAsCisJICAweEQyLDB4MTgsMHgxQiwweDM2LDB4ODEsMHhDMywweDY0LDB4QkEsMHgwMiwweDczLAorCSAgMHhDNywweDA2LAorCSAgMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogb3JkZXIgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4RTIsMHhBQSwweEQ2LAorCSAgMHhBNiwweDEyLDB4RjMsMHgzMywweDA3LDB4QkUsMHg1RiwweEE0LDB4N0MsMHgzQywKKwkgIDB4OUUsMHgwNSwweDJGLDB4ODMsMHg4MSwweDY0LDB4Q0QsMHgzNywweEQ5LDB4QTIsCisJICAweDExLDB4NzMgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVswKzcyKjZdOyB9CisJX0VDX05JU1RfQ0hBUjJfNTcxSyA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMCw3Miw0IH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDA0LDB4MjUsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDEsCisJICAweDAyLDB4NkUsMHhCNywweEE4LDB4NTksMHg5MiwweDNGLDB4QkMsMHg4MiwweDE4LAkvKiB4ICovCisJICAweDk2LDB4MzEsMHhGOCwweDEwLDB4M0YsMHhFNCwweEFDLDB4OUMsMHhBMiwweDk3LAorCSAgMHgwMCwweDEyLDB4RDUsMHhENCwweDYwLDB4MjQsMHg4MCwweDQ4LDB4MDEsMHg4NCwKKwkgIDB4MUMsMHhBNCwweDQzLDB4NzAsMHg5NSwweDg0LDB4OTMsMHhCMiwweDA1LDB4RTYsCisJICAweDQ3LDB4REEsMHgzMCwweDRELDB4QjQsMHhDRSwweEIwLDB4OEMsMHhCQiwweEQxLAorCSAgMHhCQSwweDM5LDB4NDksMHg0NywweDc2LDB4RkIsMHg5OCwweDhCLDB4NDcsMHgxNywKKwkgIDB4NEQsMHhDQSwweDg4LDB4QzcsMHhFMiwweDk0LDB4NTIsMHg4MywweEEwLDB4MUMsCisJICAweDg5LDB4NzIsCisJICAweDAzLDB4NDksMHhEQywweDgwLDB4N0YsMHg0RiwweEJGLDB4MzcsMHg0RiwweDRBLAkvKiB5ICovCisJICAweEVBLDB4REUsMHgzQiwweENBLDB4OTUsMHgzMSwweDRELDB4RDUsMHg4QywweEVDLAorCSAgMHg5RiwweDMwLDB4N0EsMHg1NCwweEZGLDB4QzYsMHgxRSwweEZDLDB4MDAsMHg2RCwKKwkgIDB4OEEsMHgyQywweDlELDB4NDksMHg3OSwweEMwLDB4QUMsMHg0NCwweEFFLDB4QTcsCisJICAweDRGLDB4QkUsMHhCQiwweEI5LDB4RjcsMHg3MiwweEFFLDB4REMsMHhCNiwweDIwLAorCSAgMHhCMCwweDFBLDB4N0IsMHhBNywweEFGLDB4MUIsMHgzMiwweDA0LDB4MzAsMHhDOCwKKwkgIDB4NTksMHgxOSwweDg0LDB4RjYsMHgwMSwweENELDB4NEMsMHgxNCwweDNFLDB4RjEsCisJICAweEM3LDB4QTMsCisJICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBvcmRlciAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEzLDB4MTgsMHg1MCwweEUxLAorCSAgMHhGMSwweDlBLDB4NjMsMHhFNCwweEIzLDB4OTEsMHhBOCwweERCLDB4OTEsMHg3RiwKKwkgIDB4NDEsMHgzOCwweEI2LDB4MzAsMHhEOCwweDRCLDB4RTUsMHhENiwweDM5LDB4MzgsCisJICAweDFFLDB4OTEsMHhERSwweEI0LDB4NUMsMHhGRSwweDc3LDB4OEYsMHg2MywweDdDLAorCSAgMHgxMCwweDAxIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArNzIqNl07IH0KKwlfRUNfTklTVF9DSEFSMl81NzFCID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwyMCw3MiwyIH0sCisJeyAweDJBLDB4QTAsMHg1OCwweEY3LDB4M0EsMHgwRSwweDMzLDB4QUIsMHg0OCwweDZCLAkvKiBzZWVkICovCisJICAweDBGLDB4NjEsMHgwNCwweDEwLDB4QzUsMHgzQSwweDdGLDB4MTMsMHgyMywweDEwLAorCisJICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDA0LDB4MjUsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDEsCisJICAweDAyLDB4RjQsMHgwRSwweDdFLDB4MjIsMHgyMSwweEYyLDB4OTUsMHhERSwweDI5LAkvKiBiICovCisJICAweDcxLDB4MTcsMHhCNywweEYzLDB4RDYsMHgyRiwweDVDLDB4NkEsMHg5NywweEZGLAorCSAgMHhDQiwweDhDLDB4RUYsMHhGMSwweENELDB4NkIsMHhBOCwweENFLDB4NEEsMHg5QSwKKwkgIDB4MTgsMHhBRCwweDg0LDB4RkYsMHhBQiwweEJELDB4OEUsMHhGQSwweDU5LDB4MzMsCisJICAweDJCLDB4RTcsMHhBRCwweDY3LDB4NTYsMHhBNiwweDZFLDB4MjksMHg0QSwweEZELAorCSAgMHgxOCwweDVBLDB4NzgsMHhGRiwweDEyLDB4QUEsMHg1MiwweDBFLDB4NEQsMHhFNywKKwkgIDB4MzksMHhCQSwweENBLDB4MEMsMHg3RiwweEZFLDB4RkYsMHg3RiwweDI5LDB4NTUsCisJICAweDcyLDB4N0EsCisJICAweDAzLDB4MDMsMHgwMCwweDFELDB4MzQsMHhCOCwweDU2LDB4MjksMHg2QywweDE2LAkvKiB4ICovCisJICAweEMwLDB4RDQsMHgwRCwweDNDLDB4RDcsMHg3NSwweDBBLDB4OTMsMHhEMSwweEQyLAorCSAgMHg5NSwweDVGLDB4QTgsMHgwQSwweEE1LDB4RjQsMHgwRiwweEM4LDB4REIsMHg3QiwKKwkgIDB4MkEsMHhCRCwweEJELDB4RTUsMHgzOSwweDUwLDB4RjQsMHhDMCwweEQyLDB4OTMsCisJICAweENELDB4RDcsMHgxMSwweEEzLDB4NUIsMHg2NywweEZCLDB4MTQsMHg5OSwweEFFLAorCSAgMHg2MCwweDAzLDB4ODYsMHgxNCwweEYxLDB4MzksMHg0QSwweEJGLDB4QTMsMHhCNCwKKwkgIDB4QzgsMHg1MCwweEQ5LDB4MjcsMHhFMSwweEU3LDB4NzYsMHg5QywweDhFLDB4RUMsCisJICAweDJELDB4MTksCisJICAweDAzLDB4N0IsMHhGMiwweDczLDB4NDIsMHhEQSwweDYzLDB4OUIsMHg2RCwweENDLAkvKiB5ICovCisJICAweEZGLDB4RkUsMHhCNywweDNELDB4NjksMHhENywweDhDLDB4NkMsMHgyNywweEE2LAorCSAgMHgwMCwweDlDLDB4QkIsMHhDQSwweDE5LDB4ODAsMHhGOCwweDUzLDB4MzksMHgyMSwKKwkgIDB4RTgsMHhBNiwweDg0LDB4NDIsMHgzRSwweDQzLDB4QkEsMHhCMCwweDhBLDB4NTcsCisJICAweDYyLDB4OTEsMHhBRiwweDhGLDB4NDYsMHgxQiwweEIyLDB4QTgsMHhCMywweDUzLAorCSAgMHgxRCwweDJGLDB4MDQsMHg4NSwweEMxLDB4OUIsMHgxNiwweEUyLDB4RjEsMHg1MSwKKwkgIDB4NkUsMHgyMywweERELDB4M0MsMHgxQSwweDQ4LDB4MjcsMHhBRiwweDFCLDB4OEEsCisJICAweEMxLDB4NUIsCisJICAweDAzLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkgIDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJICAweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEU2LDB4NjEsMHhDRSwweDE4LAorCSAgMHhGRiwweDU1LDB4OTgsMHg3MywweDA4LDB4MDUsMHg5QiwweDE4LDB4NjgsMHgyMywKKwkgIDB4ODUsMHgxRSwweEM3LDB4REQsMHg5QywweEExLDB4MTYsMHgxRCwweEU5LDB4M0QsCisJICAweDUxLDB4NzQsMHhENiwweDZFLDB4ODMsMHg4MiwweEU5LDB4QkIsMHgyRiwweEU4LAorCSAgMHg0RSwweDQ3IH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMjEqNl07IH0KKwlfRUNfWDlfNjJfQ0hBUjJfMTYzVjEgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDIwLDIxLDIgfSwKKwl7IDB4RDIsMHhDMCwweEZCLDB4MTUsMHg3NiwweDA4LDB4NjAsMHhERSwweEYxLDB4RUUsCisJICAweEY0LDB4RDYsMHg5NiwweEU2LDB4NzYsMHg4NywweDU2LDB4MTUsMHgxNywweDU0LAkvKiBzZWVkICovCisKKwkgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisJICAweDA3LAorCSAgMHgwNywweDI1LDB4NDYsMHhCNSwweDQzLDB4NTIsMHgzNCwweEE0LDB4MjIsMHhFMCwJLyogYSAqLworCSAgMHg3OCwweDk2LDB4NzUsMHhGNCwweDMyLDB4QzgsMHg5NCwweDM1LDB4REUsMHg1MiwKKwkgIDB4NDIsCisJICAweDAwLDB4QzksMHg1MSwweDdELDB4MDYsMHhENSwweDI0LDB4MEQsMHgzQywweEZGLAkvKiBiICovCisJICAweDM4LDB4QzcsMHg0QiwweDIwLDB4QjYsMHhDRCwweDRELDB4NkYsMHg5RCwweEQ0LAorCSAgMHhEOSwKKwkgIDB4MDcsMHhBRiwweDY5LDB4OTgsMHg5NSwweDQ2LDB4MTAsMHgzRCwweDc5LDB4MzIsCS8qIHggKi8KKwkgIDB4OUYsMHhDQywweDNELDB4NzQsMHg4OCwweDBGLDB4MzMsMHhCQiwweEU4LDB4MDMsCisJICAweENCLAorCSAgMHgwMSwweEVDLDB4MjMsMHgyMSwweDFCLDB4NTksMHg2NiwweEFELDB4RUEsMHgxRCwJLyogeSAqLworCSAgMHgzRiwweDg3LDB4RjcsMHhFQSwweDU4LDB4NDgsMHhBRSwweEYwLDB4QjcsMHhDQSwKKwkgIDB4OUYsCisJICAweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBvcmRlciAqLworCSAgMHgwMSwweEU2LDB4MEYsMHhDOCwweDgyLDB4MUMsMHhDNywweDRELDB4QUUsMHhBRiwKKwkgIDB4QzEgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCsyMSo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8xNjNWMiA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMjEsMiB9LAorCXsgMHg1MywweDgxLDB4NEMsMHgwNSwweDBELDB4NDQsMHhENiwweDk2LDB4RTYsMHg3NiwJLyogc2VlZCAqLworCSAgMHg4NywweDU2LDB4MTUsMHgxNywweDU4LDB4MEMsMHhBNCwweEUyLDB4OUYsMHhGRCwKKworIAkgIDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisJICAweDA3LAorCSAgMHgwMSwweDA4LDB4QjMsMHg5RSwweDc3LDB4QzQsMHhCMSwweDA4LDB4QkUsMHhEOSwJLyogYSAqLworCSAgMHg4MSwweEVELDB4MEUsMHg4OSwweDBFLDB4MTEsMHg3QywweDUxLDB4MUMsMHhGMCwKKwkgIDB4NzIsCisJICAweDA2LDB4NjcsMHhBQywweEVCLDB4MzgsMHhBRiwweDRFLDB4NDgsMHg4QywweDQwLAkvKiBiICovCisJICAweDc0LDB4MzMsMHhGRiwweEFFLDB4NEYsMHgxQywweDgxLDB4MTYsMHgzOCwweERGLAorCSAgMHgyMCwKKwkgIDB4MDAsMHgyNCwweDI2LDB4NkUsMHg0RSwweEI1LDB4MTAsMHg2RCwweDBBLDB4OTYsCS8qIHggKi8KKwkgIDB4NEQsMHg5MiwweEM0LDB4ODYsMHgwRSwweDI2LDB4NzEsMHhEQiwweDlCLDB4NkMsCisJICAweEM1LAorCSAgMHgwNywweDlGLDB4NjgsMHg0RCwweERGLDB4NjYsMHg4NCwweEM1LDB4Q0QsMHgyNSwJLyogeSAqLworCSAgMHg4QiwweDM4LDB4OTAsMHgwMiwweDFCLDB4MjMsMHg4NiwweERGLDB4RDEsMHg5RiwKKwkgIDB4QzUsCisJICAweDAzLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRCwweEY2LDB4NEQsMHhFMSwweDE1LDB4MUEsMHhEQiwweEI3LDB4OEYsMHgxMCwKKwkgIDB4QTcgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCsyMSo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8xNjNWMyA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMjEsMiB9LAorCXsgMHg1MCwweENCLDB4RjEsMHhEOSwweDVDLDB4QTksMHg0RCwweDY5LDB4NkUsMHg2NywJLyogc2VlZCAqLworCSAgMHg2OCwweDc1LDB4NjEsMHg1MSwweDc1LDB4RjEsMHg2QSwweDM2LDB4QTMsMHhCOCwKKworCSAgMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwKKwkgIDB4MDcsCisJICAweDA3LDB4QTUsMHgyNiwweEM2LDB4M0QsMHgzRSwweDI1LDB4QTIsMHg1NiwweEEwLAkvKiBhICovCisJICAweDA3LDB4NjksMHg5RiwweDU0LDB4NDcsMHhFMywweDJBLDB4RTQsMHg1NiwweEI1LAorCSAgMHgwRSwKKwkgIDB4MDMsMHhGNywweDA2LDB4MTcsMHg5OCwweEVCLDB4OTksMHhFMiwweDM4LDB4RkQsCS8qIGIgKi8KKwkgIDB4NkYsMHgxQiwweEY5LDB4NUIsMHg0OCwweEZFLDB4RUIsMHg0OCwweDU0LDB4MjUsCisJICAweDJCLAorCSAgMHgwMiwweEY5LDB4RjgsMHg3QiwweDdDLDB4NTcsMHg0RCwweDBCLDB4REUsMHhDRiwJLyogeCAqLworCSAgMHg4QSwweDIyLDB4RTYsMHg1MiwweDQ3LDB4NzUsMHhGOSwweDhDLDB4REUsMHhCRCwKKwkgIDB4Q0IsCisJICAweDA1LDB4QjksMHgzNSwweDU5LDB4MEMsMHgxNSwweDVFLDB4MTcsMHhFQSwweDQ4LAkvKiB5ICovCisJICAweEVCLDB4M0YsMHhGMywweDcxLDB4OEIsMHg4OSwweDNELDB4RjUsMHg5QSwweDA1LAorCSAgMHhEMCwKKwkgIDB4MDMsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCS8qIG9yZGVyICovCisJICAweEZFLDB4MUEsMHhFRSwweDE0LDB4MEYsMHgxMSwweDBBLDB4RkYsMHg5NiwweDEzLAorCSAgMHgwOSB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArMjMqNl07IH0KKwlfRUNfWDlfNjJfQ0hBUjJfMTc2VjEgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDAsMjMsMHhGRjZFIH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDcsCisJICAweDAwLDB4RTQsMHhFNiwweERCLDB4MjksMHg5NSwweDA2LDB4NUMsMHg0MCwweDdELAkvKiBhICovCisJICAweDlELDB4MzksMHhCOCwweEQwLDB4OTYsMHg3QiwweDk2LDB4NzAsMHg0QiwweEE4LAorCSAgMHhFOSwweEM5LDB4MEIsCisJICAweDAwLDB4NUQsMHhEQSwweDQ3LDB4MEEsMHhCRSwweDY0LDB4MTQsMHhERSwweDhFLAkvKiBiICovCisJICAweEMxLDB4MzMsMHhBRSwweDI4LDB4RTksMHhCQiwweEQ3LDB4RkMsMHhFQywweDBBLAorCSAgMHhFMCwweEZGLDB4RjIsCisJICAweDAwLDB4OEQsMHgxNiwweEMyLDB4ODYsMHg2NywweDk4LDB4QjYsMHgwMCwweEY5LAkvKiB4ICovCisJICAweEYwLDB4OEIsMHhCNCwweEE4LDB4RTgsMHg2MCwweEYzLDB4MjksMHg4QywweEUwLAorCSAgMHg0QSwweDU3LDB4OTgsCisJICAweDAwLDB4NkYsMHhBNCwweDUzLDB4OUMsMHgyRCwweEFELDB4REQsMHhENiwweEJBLAkvKiB5ICovCisJICAweEI1LDB4MTYsMHg3RCwweDYxLDB4QjQsMHgzNiwweEUxLDB4RDksMHgyQiwweEIxLAorCSAgMHg2QSwweDU2LDB4MkMsCisJICAweDAwLDB4MDAsMHgwMSwweDAwLDB4OTIsMHg1MywweDczLDB4OTcsMHhFQywweEE0LAkvKiBvcmRlciAqLworCSAgMHhGNiwweDE0LDB4NTcsMHg5OSwweEQ2LDB4MkIsMHgwQSwweDE5LDB4Q0UsMHgwNiwKKwkgIDB4RkUsMHgyNiwweEFEIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMjArMjQqNl07IH0KKwlfRUNfWDlfNjJfQ0hBUjJfMTkxVjEgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDIwLDI0LDIgfSwKKwl7IDB4NEUsMHgxMywweENBLDB4NTQsMHgyNywweDQ0LDB4RDYsMHg5NiwweEU2LDB4NzYsCS8qIHNlZWQgKi8KKwkgIDB4ODcsMHg1NiwweDE1LDB4MTcsMHg1NSwweDJGLDB4MjcsMHg5QSwweDhDLDB4ODQsCisKKwkgIDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMiwweDAxLAorCSAgMHgyOCwweDY2LDB4NTMsMHg3QiwweDY3LDB4NjcsMHg1MiwweDYzLDB4NkEsMHg2OCwJLyogYSAqLworCSAgMHhGNSwweDY1LDB4NTQsMHhFMSwweDI2LDB4NDAsMHgyNywweDZCLDB4NjQsMHg5RSwKKwkgIDB4RjcsMHg1MiwweDYyLDB4NjcsCisJICAweDJFLDB4NDUsMHhFRiwweDU3LDB4MUYsMHgwMCwweDc4LDB4NkYsMHg2NywweEIwLAkvKiBiICovCisJICAweDA4LDB4MUIsMHg5NCwweDk1LDB4QTMsMHhEOSwweDU0LDB4NjIsMHhGNSwweERFLAorCSAgMHgwQSwweEExLDB4ODUsMHhFQywKKwkgIDB4MzYsMHhCMywweERBLDB4RjgsMHhBMiwweDMyLDB4MDYsMHhGOSwweEM0LDB4RjIsCS8qIHggKi8KKwkgIDB4OTksMHhENywweEIyLDB4MUEsMHg5QywweDM2LDB4OTEsMHgzNywweEYyLDB4QzgsCisJICAweDRBLDB4RTEsMHhBQSwweDBELAorCSAgMHg3NiwweDVCLDB4RTcsMHgzNCwweDMzLDB4QjMsMHhGOSwweDVFLDB4MzMsMHgyOSwJLyogeSAqLworCSAgMHgzMiwweEU3LDB4MEUsMHhBMiwweDQ1LDB4Q0EsMHgyNCwweDE4LDB4RUEsMHgwRSwKKwkgIDB4RjksMHg4MCwweDE4LDB4RkIsCisJICAweDQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBvcmRlciAqLworCSAgMHgwMCwweDAwLDB4MDQsMHhBMiwweDBFLDB4OTAsMHhDMywweDkwLDB4NjcsMHhDOCwKKwkgIDB4OTMsMHhCQiwweEI5LDB4QTUgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCsyNCo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8xOTFWMiA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMjQsNCB9LAorCXsgMHgwOCwweDcxLDB4RUYsMHgyRiwweEVGLDB4MjQsMHhENiwweDk2LDB4RTYsMHg3NiwJLyogc2VlZCAqLworCSAgMHg4NywweDU2LDB4MTUsMHgxNywweDU4LDB4QkUsMHhFMCwweEQ5LDB4NUMsMHgxNSwKKworCSAgMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAyLDB4MDEsCisJICAweDQwLDB4MTAsMHgyOCwweDc3LDB4NEQsMHg3NywweDc3LDB4QzcsMHhCNywweDY2LAkvKiBhICovCisJICAweDZELDB4MTMsMHg2NiwweEVBLDB4NDMsMHgyMCwweDcxLDB4MjcsMHg0RiwweDg5LAorCSAgMHhGRiwweDAxLDB4RTcsMHgxOCwKKwkgIDB4MDYsMHgyMCwweDA0LDB4OEQsMHgyOCwweEJDLDB4QkQsMHgwMywweEI2LDB4MjQsCS8qIGIgKi8KKwkgIDB4OUMsMHg5OSwweDE4LDB4MkIsMHg3QywweDhDLDB4RDEsMHg5NywweDAwLDB4QzMsCisJICAweDYyLDB4QzQsMHg2QSwweDAxLAorCSAgMHgzOCwweDA5LDB4QjIsMHhCNywweENDLDB4MUIsMHgyOCwweENDLDB4NUEsMHg4NywJLyogeCAqLworCSAgMHg5MiwweDZBLDB4QUQsMHg4MywweEZELDB4MjgsMHg3OCwweDlFLDB4ODEsMHhFMiwKKwkgIDB4QzksMHhFMywweEJGLDB4MTAsCisJICAweDE3LDB4NDMsMHg0MywweDg2LDB4NjIsMHg2RCwweDE0LDB4RjMsMHhEQiwweEYwLAkvKiB5ICovCisJICAweDE3LDB4NjAsMHhEOSwweDIxLDB4M0EsMHgzRSwweDFDLDB4RjMsMHg3QSwweEVDLAorCSAgMHg0MywweDdELDB4NjYsMHg4QSwKKwkgIDB4MjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIG9yZGVyICovCisJICAweDAwLDB4MDAsMHg1MCwweDUwLDB4OEMsMHhCOCwweDlGLDB4NjUsMHgyOCwweDI0LAorCSAgMHhFMCwweDZCLDB4ODEsMHg3MyB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzIwKzI0KjZdOyB9CisJX0VDX1g5XzYyX0NIQVIyXzE5MVYzID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwyMCwyNCw2IH0sCisJeyAweEUwLDB4NTMsMHg1MSwweDJELDB4QzYsMHg4NCwweEQ2LDB4OTYsMHhFNiwweDc2LAkvKiBzZWVkICovCisJICAweDg3LDB4NTYsMHgxNSwweDE3LDB4NTAsMHg2NywweEFFLDB4NzgsMHg2RCwweDFGLAorCisJICAweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDIsMHgwMSwKKwkgIDB4NkMsMHgwMSwweDA3LDB4NDcsMHg1NiwweDA5LDB4OTEsMHgyMiwweDIyLDB4MTAsCS8qIGEgKi8KKwkgIDB4NTYsMHg5MSwweDFDLDB4NzcsMHhENywweDdFLDB4NzcsMHhBNywweDc3LDB4RTcsCisJICAweEU3LDB4RTcsMHg3RiwweENCLAorCSAgMHg3MSwweEZFLDB4MUEsMHhGOSwweDI2LDB4Q0YsMHg4NCwweDc5LDB4ODksMHhFRiwJLyogYiAqLworCSAgMHhFRiwweDhELDB4QjQsMHg1OSwweEY2LDB4NjMsMHg5NCwweEQ5LDB4MEYsMHgzMiwKKwkgIDB4QUQsMHgzRiwweDE1LDB4RTgsCisJICAweDM3LDB4NUQsMHg0QywweEUyLDB4NEYsMHhERSwweDQzLDB4NDQsMHg4OSwweERFLAkvKiB4ICovCisJICAweDg3LDB4NDYsMHhFNywweDE3LDB4ODYsMHgwMSwweDUwLDB4MDksMHhFNiwweDZFLAorCSAgMHgzOCwweEE5LDB4MjYsMHhERCwKKwkgIDB4NTQsMHg1QSwweDM5LDB4MTcsMHg2MSwweDk2LDB4NTcsMHg1RCwweDk4LDB4NTksCS8qIHkgKi8KKwkgIDB4OTksMHgzNiwweDZFLDB4NkEsMHhEMywweDRDLDB4RTAsMHhBNywweDdDLDB4RDcsCisJICAweDEyLDB4N0IsMHgwNiwweEJFLAorCSAgMHgxNSwweDU1LDB4NTUsMHg1NSwweDU1LDB4NTUsMHg1NSwweDU1LDB4NTUsMHg1NSwJLyogb3JkZXIgKi8KKwkgIDB4NTUsMHg1NSwweDYxLDB4MEMsMHgwQiwweDE5LDB4NjgsMHgxMiwweEJGLDB4QjYsCisJICAweDI4LDB4OEEsMHgzRSwweEEzIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMCsyNyo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8yMDhXMSA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMCwyNywweEZFNDggfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogYSAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4QzgsMHg2MSwweDlFLDB4RDQsMHg1QSwweDYyLDB4RTYsMHgyMSwweDJFLAkvKiBiICovCisJICAweDExLDB4NjAsMHgzNCwweDlFLDB4MkIsMHhGQSwweDg0LDB4NDQsMHgzOSwweEZBLAorCSAgMHhGQywweDJBLDB4M0YsMHhEMSwweDYzLDB4OEYsMHg5RSwKKwkgIDB4MDAsMHg4OSwweEZELDB4RkIsMHhFNCwweEFCLDB4RTEsMHg5MywweERGLDB4OTUsCS8qIHggKi8KKwkgIDB4NTksMHhFQywweEYwLDB4N0EsMHhDMCwweENFLDB4NzgsMHg1NSwweDRFLDB4MjcsCisJICAweDg0LDB4RUIsMHg4QywweDFFLDB4RDEsMHhBNSwweDdBLAorCSAgMHgwMCwweDBGLDB4NTUsMHhCNSwweDFBLDB4MDYsMHhFNywweDhFLDB4OUEsMHhDMywJLyogeSAqLworCSAgMHg4QSwweDAzLDB4NUYsMHhGNSwweDIwLDB4RDgsMHhCMCwweDE3LDB4ODEsMHhCRSwKKwkgIDB4QjEsMHhBNiwweEJCLDB4MDgsMHg2MSwweDdELDB4RTMsCisJICAweDAwLDB4MDAsMHgwMSwweDAxLDB4QkEsMHhGOSwweDVDLDB4OTcsMHgyMywweEM1LAkvKiBvcmRlciAqLworCSAgMHg3QiwweDZDLDB4MjEsMHhEQSwweDJFLDB4RkYsMHgyRCwweDVFLDB4RDUsMHg4OCwKKwkgIDB4QkQsMHhENSwweDcxLDB4N0UsMHgyMSwweDJGLDB4OUQgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCszMCo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8yMzlWMSA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMzAsNCB9LAorCXsgMHhEMywweDRCLDB4OUEsMHg0RCwweDY5LDB4NkUsMHg2NywweDY4LDB4NzUsMHg2MSwJLyogc2VlZCAqLworCSAgMHg1MSwweDc1LDB4Q0EsMHg3MSwweEI5LDB4MjAsMHhCRiwweEVGLDB4QjAsMHg1RCwKKworCSAgMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisKKwkgIDB4MzIsMHgwMSwweDA4LDB4NTcsMHgwNywweDdDLDB4NTQsMHgzMSwweDEyLDB4M0EsCS8qIGEgKi8KKwkgIDB4NDYsMHhCOCwweDA4LDB4OTAsMHg2NywweDU2LDB4RjUsMHg0MywweDQyLDB4M0UsCisJICAweDhELDB4MjcsMHg4NywweDc1LDB4NzgsMHgxMiwweDU3LDB4NzgsMHhBQywweDc2LAorCisJICAweDc5LDB4MDQsMHgwOCwweEYyLDB4RUUsMHhEQSwweEYzLDB4OTIsMHhCMCwweDEyLAkvKiBiICovCisJICAweEVELDB4RUYsMHhCMywweDM5LDB4MkYsMHgzMCwweEY0LDB4MzIsMHg3QywweDBDLAorCSAgMHhBMywweEYzLDB4MUYsMHhDMywweDgzLDB4QzQsMHgyMiwweEFBLDB4OEMsMHgxNiwKKworCSAgMHg1NywweDkyLDB4NzAsMHg5OCwweEZBLDB4OTMsMHgyRSwweDdDLDB4MEEsMHg5NiwJLyogeCAqLworCSAgMHhEMywweEZELDB4NUIsMHg3MCwweDZFLDB4RjcsMHhFNSwweEY1LDB4QzEsMHg1NiwKKwkgIDB4RTEsMHg2QiwweDdFLDB4N0MsMHg4NiwweDAzLDB4ODUsMHg1MiwweEU5LDB4MUQsCisKKwkgIDB4NjEsMHhEOCwweEVFLDB4NTAsMHg3NywweEMzLDB4M0YsMHhFQywweEY2LDB4RjEsCS8qIHkgKi8KKwkgIDB4QTEsMHg2QiwweDI2LDB4OEQsMHhFNCwweDY5LDB4QzMsMHhDNywweDc0LDB4NEUsCisJICAweEE5LDB4QTksMHg3MSwweDY0LDB4OUYsMHhDNywweEE5LDB4NjEsMHg2MywweDA1LAorCisJICAweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBvcmRlciAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MEYsMHg0RCwweDQyLDB4RkYsMHhFMSwKKwkgIDB4NDksMHgyQSwweDQ5LDB4OTMsMHhGMSwweENBLDB4RDYsMHg2NiwweEU0LDB4NDcgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCszMCo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8yMzlWMiA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMzAsNiB9LAorCXsgMHgyQSwweEE2LDB4OTgsMHgyRiwweERGLDB4QTQsMHhENiwweDk2LDB4RTYsMHg3NiwJLyogc2VlZCAqLworCSAgMHg4NywweDU2LDB4MTUsMHgxNywweDVELDB4MjYsMHg2NywweDI3LDB4MjcsMHg3RCwKKworCSAgMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisKKwkgIDB4NDIsMHgzMCwweDAxLDB4NzcsMHg1NywweEE3LDB4NjcsMHhGQSwweEU0LDB4MjMsCS8qIGEgKi8KKwkgIDB4OTgsMHg1NiwweDlCLDB4NzQsMHg2MywweDI1LDB4RDQsMHg1MywweDEzLDB4QUYsCisJICAweDA3LDB4NjYsMHgyNiwweDY0LDB4NzksMHhCNywweDU2LDB4NTQsMHhFNiwweDVGLAorCisJICAweDUwLDB4MzcsMHhFQSwweDY1LDB4NDEsMHg5NiwweENGLDB4RjAsMHhDRCwweDgyLAkvKiBiICovCisJICAweEIyLDB4QzEsMHg0QSwweDJGLDB4Q0YsMHgyRSwweDNGLDB4RjgsMHg3NywweDUyLAorCSAgMHg4NSwweEI1LDB4NDUsMHg3MiwweDJGLDB4MDMsMHhFQSwweENELDB4QjcsMHg0QiwKKworCSAgMHgyOCwweEY5LDB4RDAsMHg0RSwweDkwLDB4MDAsMHg2OSwweEM4LDB4REMsMHg0NywJLyogeCAqLworCSAgMHhBMCwweDg1LDB4MzQsMHhGRSwweDc2LDB4RDIsMHhCOSwweDAwLDB4QjcsMHhENywKKwkgIDB4RUYsMHgzMSwweEY1LDB4NzAsMHg5RiwweDIwLDB4MEMsMHg0QywweEEyLDB4MDUsCisKKwkgIDB4NTYsMHg2NywweDMzLDB4NEMsMHg0NSwweEFGLDB4RjMsMHhCNSwweEEwLDB4M0IsCS8qIHkgKi8KKwkgIDB4QUQsMHg5RCwweEQ3LDB4NUUsMHgyQywweDcxLDB4QTksMHg5MywweDYyLDB4NTYsCisJICAweDdELDB4NTQsMHg1MywweEY3LDB4RkEsMHg2RSwweDIyLDB4N0UsMHhDOCwweDMzLAorCisJICAweDE1LDB4NTUsMHg1NSwweDU1LDB4NTUsMHg1NSwweDU1LDB4NTUsMHg1NSwweDU1LAkvKiBvcmRlciAqLworCSAgMHg1NSwweDU1LDB4NTUsMHg1NSwweDU1LDB4M0MsMHg2RiwweDI4LDB4ODUsMHgyNSwKKwkgIDB4OUMsMHgzMSwweEUzLDB4RkMsMHhERiwweDE1LDB4NDYsMHgyNCwweDUyLDB4MkQgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCszMCo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8yMzlWMyA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsMzAsMHhBIH0sCisJeyAweDlFLDB4MDcsMHg2RiwweDRELDB4NjksMHg2RSwweDY3LDB4NjgsMHg3NSwweDYxLAkvKiBzZWVkICovCisJICAweDUxLDB4NzUsMHhFMSwweDFFLDB4OUYsMHhERCwweDc3LDB4RjksMHgyMCwweDQxLAorCisJICAweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMSwKKworCSAgMHgwMSwweDIzLDB4ODcsMHg3NCwweDY2LDB4NkEsMHg2NywweDc2LDB4NkQsMHg2NiwJLyogYSAqLworCSAgMHg3NiwweEY3LDB4NzgsMHhFNiwweDc2LDB4QjYsMHg2OSwweDk5LDB4MTcsMHg2NiwKKwkgIDB4NjYsMHhFNiwweDg3LDB4NjYsMHg2RCwweDg3LDB4NjYsMHhDNiwweDZBLDB4OUYsCisKKwkgIDB4NkEsMHg5NCwweDE5LDB4NzcsMHhCQSwweDlGLDB4NkEsMHg0MywweDUxLDB4OTksCS8qIGIgKi8KKwkgIDB4QUMsMHhGQywweDUxLDB4MDYsMHg3RSwweEQ1LDB4ODcsMHhGNSwweDE5LDB4QzUsCisJICAweEVDLDB4QjUsMHg0MSwweEI4LDB4RTQsMHg0MSwweDExLDB4REUsMHgxRCwweDQwLAorCisJICAweDcwLDB4RjYsMHhFOSwweEQwLDB4NEQsMHgyOCwweDlDLDB4NEUsMHg4OSwweDkxLAkvKiB4ICovCisJICAweDNDLDB4RTMsMHg1MywweDBCLDB4RkQsMHhFOSwweDAzLDB4OTcsMHg3RCwweDQyLAorCSAgMHhCMSwweDQ2LDB4RDUsMHgzOSwweEJGLDB4MUIsMHhERSwweDRFLDB4OUMsMHg5MiwKKworCSAgMHgyRSwweDVBLDB4MEUsMHhBRiwweDZFLDB4NUUsMHgxMywweDA1LDB4QjksMHgwMCwJLyogeSAqLworCSAgMHg0RCwweENFLDB4NUMsMHgwRSwweEQ3LDB4RkUsMHg1OSwweEEzLDB4NTYsMHgwOCwKKwkgIDB4RjMsMHgzOCwweDM3LDB4QzgsMHgxNiwweEQ4LDB4MEIsMHg3OSwweEY0LDB4NjEsCisKKwkgIDB4MEMsMHhDQywweENDLDB4Q0MsMHhDQywweENDLDB4Q0MsMHhDQywweENDLDB4Q0MsCS8qIG9yZGVyICovCisJICAweENDLDB4Q0MsMHhDQywweENDLDB4Q0MsMHhBQywweDQ5LDB4MTIsMHhEMiwweEQ5LAorCSAgMHhERiwweDkwLDB4M0UsMHhGOSwweDg4LDB4OEIsMHg4QSwweDBFLDB4NEMsMHhGRiB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArMzUqNl07IH0KKwlfRUNfWDlfNjJfQ0hBUjJfMjcyVzEgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDAsMzUsMHhGRjA2IH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwQiwKKwkgIDB4MDAsMHg5MSwweEEwLDB4OTEsMHhGMCwweDNCLDB4NUYsMHhCQSwweDRBLDB4QjIsCS8qIGEgKi8KKwkgIDB4Q0MsMHhGNCwweDlDLDB4NEUsMHhERCwweDIyLDB4MEYsMHhCMCwweDI4LDB4NzEsCisJICAweDJELDB4NDIsMHhCRSwweDc1LDB4MkIsMHgyQywweDQwLDB4MDksMHg0RCwweEJBLAorCSAgMHhDRCwweEI1LDB4ODYsMHhGQiwweDIwLAorCSAgMHgwMCwweDcxLDB4NjcsMHhFRiwweEM5LDB4MkIsMHhCMiwweEUzLDB4Q0UsMHg3QywJLyogYiAqLworCSAgMHg4QSwweEFBLDB4RkYsMHgzNCwweEUxLDB4MkEsMHg5QywweDU1LDB4NzAsMHgwMywKKwkgIDB4RDcsMHhDNywweDNBLDB4NkYsMHhBRiwweDAwLDB4M0YsMHg5OSwweEY2LDB4Q0MsCisJICAweDg0LDB4ODIsMHhFNSwweDQwLDB4RjcsCisJICAweDAwLDB4NjEsMHgwOCwweEJBLDB4QkIsMHgyQywweEVFLDB4QkMsMHhGNywweDg3LAkvKiB4ICovCisJICAweDA1LDB4OEEsMHgwNSwweDZDLDB4QkUsMHgwQywweEZFLDB4NjIsMHgyRCwweDc3LAorCSAgMHgyMywweEEyLDB4ODksMHhFMCwweDhBLDB4MDcsMHhBRSwweDEzLDB4RUYsMHgwRCwKKwkgIDB4MTAsMHhEMSwweDcxLDB4REQsMHg4RCwKKwkgIDB4MDAsMHgxMCwweEM3LDB4NjksMHg1NywweDE2LDB4ODUsMHgxRSwweEVGLDB4NkIsCS8qIHkgKi8KKwkgIDB4QTcsMHhGNiwweDg3LDB4MkUsMHg2MSwweDQyLDB4RkIsMHhEMiwweDQxLDB4QjgsCisJICAweDMwLDB4RkYsMHg1RSwweEZDLDB4QUMsMHhFQywweENBLDB4QjAsMHg1RSwweDAyLAorCSAgMHgwMCwweDVELDB4REUsMHg5RCwweDIzLAorCSAgMHgwMCwweDAwLDB4MDEsMHgwMCwweEZBLDB4RjUsMHgxMywweDU0LDB4RTAsMHhFMywJLyogb3JkZXIgKi8KKwkgIDB4OUUsMHg0OCwweDkyLDB4REYsMHg2RSwweDMxLDB4OUMsMHg3MiwweEM4LDB4MTYsCisJICAweDE2LDB4MDMsMHhGQSwweDQ1LDB4QUEsMHg3QiwweDk5LDB4OEEsMHgxNiwweDdCLAorCSAgMHg4RiwweDFFLDB4NjIsMHg5NSwweDIxIH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMCszOSo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8zMDRXMSA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMCwzOSwweEZFMkUgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDcsCisJICAweDAwLDB4RkQsMHgwRCwweDY5LDB4MzEsMHg0OSwweEExLDB4MTgsMHhGNiwweDUxLAkvKiBhICovCisJICAweEU2LDB4REMsMHhFNiwweDgwLDB4MjAsMHg4NSwweDM3LDB4N0UsMHg1RiwweDg4LAorCSAgMHgyRCwweDFCLDB4NTEsMHgwQiwweDQ0LDB4MTYsMHgwMCwweDc0LDB4QzEsMHgyOCwKKwkgIDB4ODAsMHg3OCwweDM2LDB4NUEsMHgwMywweDk2LDB4QzgsMHhFNiwweDgxLAorCSAgMHgwMCwweEJELDB4REIsMHg5NywweEU1LDB4NTUsMHhBNSwweDBBLDB4OTAsMHg4RSwJLyogYiAqLworCSAgMHg0MywweEIwLDB4MUMsMHg3OSwweDhFLDB4QTUsMHhEQSwweEE2LDB4NzgsMHg4RiwKKwkgIDB4MUUsMHhBMiwweDc5LDB4NEUsMHhGQywweEY1LDB4NzEsMHg2NiwweEI4LDB4QzEsCisJICAweDQwLDB4MzksMHg2MCwweDFFLDB4NTUsMHg4MiwweDczLDB4NDAsMHhCRSwKKwkgIDB4MDAsMHgxOSwweDdCLDB4MDcsMHg4NCwweDVFLDB4OUIsMHhFMiwweEQ5LDB4NkEsCS8qIHggKi8KKwkgIDB4REIsMHgwRiwweDVGLDB4M0MsMHg3RiwweDJDLDB4RkYsMHhCRCwweDdBLDB4M0UsCisJICAweEI4LDB4QjYsMHhGRSwweEMzLDB4NUMsMHg3RiwweEQ2LDB4N0YsMHgyNiwweERELAorCSAgMHhGNiwweDI4LDB4NUEsMHg2NCwweDRGLDB4NzQsMHgwQSwweDI2LDB4MTQsCisJICAweDAwLDB4RTEsMHg5RiwweEJFLDB4QjcsMHg2RSwweDBELDB4QTEsMHg3MSwweDUxLAkvKiB5ICovCisJICAweDdFLDB4Q0YsMHg0MCwweDFCLDB4NTAsMHgyOCwweDlCLDB4RjAsMHgxNCwweDEwLAorCSAgMHgzMiwweDg4LDB4NTIsMHg3QSwweDlCLDB4NDEsMHg2QSwweDEwLDB4NUUsMHg4MCwKKwkgIDB4MjYsMHgwQiwweDU0LDB4OUYsMHhEQywweDFCLDB4OTIsMHhDMCwweDNCLAorCSAgMHgwMCwweDAwLDB4MDEsMHgwMSwweEQ1LDB4NTYsMHg1NywweDJBLDB4QUIsMHhBQywJLyogb3JkZXIgKi8KKwkgIDB4ODAsMHgwMSwweDAxLDB4RDUsMHg1NiwweDU3LDB4MkEsMHhBQiwweEFDLDB4ODAsCisJICAweDAxLDB4MDIsMHgyRCwweDVDLDB4OTEsMHhERCwweDE3LDB4M0YsMHg4RiwweEI1LAorCSAgMHg2MSwweERBLDB4NjgsMHg5OSwweDE2LDB4NDQsMHg0MywweDA1LDB4MUQgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVsyMCs0NSo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl8zNTlWMSA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMjAsNDUsMHg0QyB9LAorCXsgMHgyQiwweDM1LDB4NDksMHgyMCwweEI3LDB4MjQsMHhENiwweDk2LDB4RTYsMHg3NiwJLyogc2VlZCAqLworCSAgMHg4NywweDU2LDB4MTUsMHgxNywweDU4LDB4NUIsMHhBMSwweDMzLDB4MkQsMHhDNiwKKworCSAgMHg4MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogcCAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLAorCSAgMHg1NiwweDY3LDB4NjcsMHg2QSwweDY1LDB4NEIsMHgyMCwweDc1LDB4NEYsMHgzNSwJLyogYSAqLworCSAgMHg2RSwweEE5LDB4MjAsMHgxNywweEQ5LDB4NDYsMHg1NiwweDdDLDB4NDYsMHg2NywKKwkgIDB4NTUsMHg1NiwweEYxLDB4OTUsMHg1NiwweEEwLDB4NDYsMHgxNiwweEI1LDB4NjcsCisJICAweEQyLDB4MjMsMHhBNSwweEUwLDB4NTYsMHg1NiwweEZCLDB4NTQsMHg5MCwweDE2LAorCSAgMHhBOSwweDY2LDB4NTYsMHhBNSwweDU3LAorCSAgMHgyNCwweDcyLDB4RTIsMHhEMCwweDE5LDB4N0MsMHg0OSwweDM2LDB4M0YsMHgxRiwJLyogYiAqLworCSAgMHhFNywweEY1LDB4QjYsMHhEQiwweDA3LDB4NUQsMHg1MiwweEI2LDB4OTQsMHg3RCwKKwkgIDB4MTMsMHg1RCwweDhDLDB4QTQsMHg0NSwweDgwLDB4NUQsMHgzOSwweEJDLDB4MzQsCisJICAweDU2LDB4MjYsMHgwOCwweDk2LDB4ODcsMHg3NCwweDJCLDB4NjMsMHgyOSwweEU3LAorCSAgMHgwNiwweDgwLDB4MjMsMHgxOSwweDg4LAorCSAgMHgzQywweDI1LDB4OEUsMHhGMywweDA0LDB4NzcsMHg2NywweEU3LDB4RUQsMHhFMCwJLyogeCAqLworCSAgMHhGMSwweEZELDB4QUEsMHg3OSwweERBLDB4RUUsMHgzOCwweDQxLDB4MzYsMHg2QSwKKwkgIDB4MTMsMHgyRSwweDE2LDB4M0EsMHhDRSwweEQ0LDB4RUQsMHgyNCwweDAxLDB4REYsCisJICAweDlDLDB4NkIsMHhEQywweERFLDB4OTgsMHhFOCwweEU3LDB4MDcsMHhDMCwweDdBLAorCSAgMHgyMiwweDM5LDB4QjEsMHhCMCwweDk3LAorCSAgMHg1MywweEQ3LDB4RTAsMHg4NSwweDI5LDB4NTQsMHg3MCwweDQ4LDB4MTIsMHgxRSwJLyogeSAqLworCSAgMHg5QywweDk1LDB4RjMsMHg3OSwweDFELDB4RDgsMHgwNCwweDk2LDB4MzksMHg0OCwKKwkgIDB4RjMsMHg0RiwweEFFLDB4N0IsMHhGNCwweDRFLDB4QTgsMHgyMywweDY1LDB4REMsCisJICAweDc4LDB4NjgsMHhGRSwweDU3LDB4RTQsMHhBRSwweDJELDB4RTIsMHgxMSwweDMwLAorCSAgMHg1QSwweDQwLDB4NzEsMHgwNCwweEJELAorCSAgMHgwMSwweEFGLDB4MjgsMHg2QiwweENBLDB4MUEsMHhGMiwweDg2LDB4QkMsMHhBMSwJLyogb3JkZXIgKi8KKwkgIDB4QUYsMHgyOCwweDZCLDB4Q0EsMHgxQSwweEYyLDB4ODYsMHhCQywweEExLDB4QUYsCisJICAweDI4LDB4NkIsMHhDOSwweEZCLDB4OEYsMHg2QiwweDg1LDB4QzUsMHg1NiwweDg5LAorCSAgMHgyQywweDIwLDB4QTcsMHhFQiwweDk2LDB4NEYsMHhFNywweDcxLDB4OUUsMHg3NCwKKwkgIDB4RjQsMHg5MCwweDc1LDB4OEQsMHgzQiB9CisJfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArNDcqNl07IH0KKwlfRUNfWDlfNjJfQ0hBUjJfMzY4VzEgPSB7CisJeyBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDAsNDcsMHhGRjcwIH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDAxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LAorCSAgMHgwMCwweEUwLDB4RDIsMHhFRSwweDI1LDB4MDksMHg1MiwweDA2LDB4RjUsMHhFMiwJLyogYSAqLworCSAgMHhBNCwweEY5LDB4RUQsMHgyMiwweDlGLDB4MUYsMHgyNSwweDZFLDB4NzksMHhBMCwKKwkgIDB4RTIsMHhCNCwweDU1LDB4OTcsMHgwRCwweDhELDB4MEQsMHg4NiwweDVCLDB4RDksCisJICAweDQ3LDB4NzgsMHhDNSwweDc2LDB4RDYsMHgyRiwweDBBLDB4QjcsMHg1MSwweDlDLAorCSAgMHhDRCwweDJBLDB4MUEsMHg5MCwweDZBLDB4RTMsMHgwRCwKKwkgIDB4MDAsMHhGQywweDEyLDB4MTcsMHhENCwweDMyLDB4MEEsMHg5MCwweDQ1LDB4MkMsCS8qIGIgKi8KKwkgIDB4NzYsMHgwQSwweDU4LDB4RUQsMHhDRCwweDMwLDB4QzgsMHhERCwweDA2LDB4OUIsCisJICAweDNDLDB4MzQsMHg0NSwweDM4LDB4MzcsMHhBMywweDRFLDB4RDUsMHgwQywweEI1LAorCSAgMHg0OSwweDE3LDB4RTEsMHhDMiwweDExLDB4MkQsMHg4NCwweEQxLDB4NjQsMHhGNCwKKwkgIDB4NDQsMHhGOCwweEY3LDB4NDcsMHg4NiwweDA0LDB4NkEsCisJICAweDAwLDB4MTAsMHg4NSwweEUyLDB4NzUsMHg1MywweDgxLDB4REMsMHhDQywweEUzLAkvKiB4ICovCisJICAweEMxLDB4NTUsMHg3QSwweEZBLDB4MTAsMHhDMiwweEYwLDB4QzAsMHhDMiwweDgyLAorCSAgMHg1NiwweDQ2LDB4QzUsMHhCMywweDRBLDB4MzksMHg0QywweEJDLDB4RkEsMHg4QiwKKwkgIDB4QzEsMHg2QiwweDIyLDB4RTcsMHhFNywweDg5LDB4RTksMHgyNywweEJFLDB4MjEsCisJICAweDZGLDB4MDIsMHhFMSwweEZCLDB4MTMsMHg2QSwweDVGLAorCSAgMHgwMCwweDdCLDB4M0UsMHhCMSwweEJELDB4REMsMHhCQSwweDYyLDB4RDUsMHhEOCwJLyogeSAqLworCSAgMHhCMiwweDA1LDB4OUIsMHg1MiwweDU3LDB4OTcsMHhGQywweDczLDB4ODIsMHgyQywKKwkgIDB4NTksMHgwNSwweDlDLDB4NjIsMHgzQSwweDQ1LDB4RkYsMHgzOCwweDQzLDB4Q0UsCisJICAweEU4LDB4RjgsMHg3QywweEQxLDB4ODUsMHg1QSwweERBLDB4QTgsMHgxRSwweDJBLAorCSAgMHgwNywweDUwLDB4QjgsMHgwRiwweERBLDB4MjMsMHgxMCwKKwkgIDB4MDAsMHgwMCwweDAxLDB4MDAsMHg5MCwweDUxLDB4MkQsMHhBOSwweEFGLDB4NzIsCS8qIG9yZGVyICovCisJICAweEIwLDB4ODMsMHg0OSwweEQ5LDB4OEEsMHg1RCwweEQ0LDB4QzcsMHhCMCwweDUzLAorCSAgMHgyRSwweENBLDB4NTEsMHhDRSwweDAzLDB4RTIsMHhEMSwweDBGLDB4M0IsMHg3QSwKKwkgIDB4QzUsMHg3OSwweEJELDB4ODcsMHhFOSwweDA5LDB4QUUsMHg0MCwweEE2LDB4RjEsCisJICAweDMxLDB4RTksMHhDRiwweENFLDB4NUIsMHhEOSwweDY3IH0KKwl9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMCs1NCo2XTsgfQorCV9FQ19YOV82Ml9DSEFSMl80MzFSMSA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMCw1NCwweDI3NjAgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAxLAorCSAgMHgxQSwweDgyLDB4N0UsMHhGMCwweDBELDB4RDYsMHhGQywweDBFLDB4MjMsMHg0QywJLyogYSAqLworCSAgMHhBRiwweDA0LDB4NkMsMHg2QSwweDVELDB4OEEsMHg4NSwweDM5LDB4NUIsMHgyMywKKwkgIDB4NkMsMHhDNCwweEFELDB4MkMsMHhGMywweDJBLDB4MEMsMHhBRCwweEJELDB4QzksCisJICAweERELDB4RjYsMHgyMCwweEIwLDB4RUIsMHg5OSwweDA2LDB4RDAsMHg5NSwweDdGLAorCSAgMHg2QywweDZGLDB4RUEsMHhDRCwweDYxLDB4NTQsMHg2OCwweERGLDB4MTAsMHg0RCwKKwkgIDB4RTIsMHg5NiwweENELDB4OEYsCisJICAweDEwLDB4RDksMHhCNCwweEEzLDB4RDksMHgwNCwweDdELDB4OEIsMHgxNSwweDQzLAkvKiBiICovCisJICAweDU5LDB4QUIsMHhGQiwweDFCLDB4N0YsMHg1NCwweDg1LDB4QjAsMHg0QywweEVCLAorCSAgMHg4NiwweDgyLDB4MzcsMHhERCwweEM5LDB4REUsMHhEQSwweDk4LDB4MkEsMHg2NywKKwkgIDB4OUEsMHg1QSwweDkxLDB4OUIsMHg2MiwweDZELDB4NEUsMHg1MCwweEE4LDB4REQsCisJICAweDczLDB4MUIsMHgxMCwweDdBLDB4OTksMHg2MiwweDM4LDB4MUYsMHhCNSwweEQ4LAorCSAgMHgwNywweEJGLDB4MjYsMHgxOCwKKwkgIDB4MTIsMHgwRiwweEMwLDB4NUQsMHgzQywweDY3LDB4QTksMHg5RCwweEUxLDB4NjEsCS8qIHggKi8KKwkgIDB4RDIsMHhGNCwweDA5LDB4MjYsMHgyMiwweEZFLDB4Q0EsMHg3MCwweDFCLDB4RTQsCisJICAweEY1LDB4MEYsMHg0NywweDU4LDB4NzEsMHg0RSwweDhBLDB4ODcsMHhCQiwweEYyLAorCSAgMHhBNiwweDU4LDB4RUYsMHg4QywweDIxLDB4RTcsMHhDNSwweEVGLDB4RTksMHg2NSwKKwkgIDB4MzYsMHgxRiwweDZDLDB4MjksMHg5OSwweEMwLDB4QzIsMHg0NywweEIwLDB4REIsCisJICAweEQ3LDB4MEMsMHhFNiwweEI3LAorCSAgMHgyMCwweEQwLDB4QUYsMHg4OSwweDAzLDB4QTksMHg2RiwweDhELDB4NUYsMHhBMiwJLyogeSAqLworCSAgMHhDMiwweDU1LDB4NzQsMHg1RCwweDNDLDB4NDUsMHgxQiwweDMwLDB4MkMsMHg5MywKKwkgIDB4NDYsMHhEOSwweEI3LDB4RTQsMHg4NSwweEU3LDB4QkMsMHhFNCwweDFGLDB4NkIsCisJICAweDU5LDB4MUYsMHgzRSwweDhGLDB4NkEsMHhERCwweENCLDB4QjAsMHhCQywweDRDLAorCSAgMHgyRiwweDk0LDB4N0EsMHg3RCwweEUxLDB4QTgsMHg5QiwweDYyLDB4NUQsMHg2QSwKKwkgIDB4NTksMHg4QiwweDM3LDB4NjAsCisJICAweDAwLDB4MDMsMHg0MCwweDM0LDB4MDMsMHg0MCwweDM0LDB4MDMsMHg0MCwweDM0LAkvKiBvcmRlciAqLworCSAgMHgwMywweDQwLDB4MzQsMHgwMywweDQwLDB4MzQsMHgwMywweDQwLDB4MzQsMHgwMywKKwkgIDB4NDAsMHgzNCwweDAzLDB4NDAsMHgzNCwweDAzLDB4NDAsMHgzNCwweDAzLDB4MjMsCisJICAweEMzLDB4MTMsMHhGQSwweEI1LDB4MDUsMHg4OSwweDcwLDB4M0IsMHg1RSwweEM2LAorCSAgMHg4RCwweDM1LDB4ODcsMHhGRSwweEM2LDB4MEQsMHgxNiwweDFDLDB4QzEsMHg0OSwKKwkgIDB4QzEsMHhBRCwweDRBLDB4OTEgfQorCX07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeyBFQ19DVVJWRV9EQVRBIGg7IHVuc2lnbmVkIGNoYXIgZGF0YVswKzE1KjZdOyB9CisJX0VDX1dUTFNfMSA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMCwxNSwyIH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHgwMCwweDAyLDB4MDEsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsCisJICAweDAxLDB4NjYsMHg3OSwweDc5LDB4QTQsMHgwQiwweEE0LDB4OTcsMHhFNSwweEQ1LAkvKiB4ICovCisJICAweEMyLDB4NzAsMHg3OCwweDA2LDB4MTcsCisJICAweDAwLDB4RjQsMHg0QiwweDRBLDB4RjEsMHhFQywweEMyLDB4NjMsMHgwRSwweDA4LAkvKiB5ICovCisJICAweDc4LDB4NUMsMHhFQiwweENDLDB4MTUsCisJICAweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRCwweEJGLAkvKiBvcmRlciAqLworCSAgMHg5MSwweEFGLDB4NkQsMHhFQSwweDczIH0KKwl9OworCisvKiBJUFNlYyBjdXJ2ZXMgKi8KKy8qIE5PVEU6IFRoZSBvZiBjdXJ2ZXMgb3ZlciBhIGV4dGVuc2lvbiBmaWVsZCBvZiBub24gcHJpbWUgZGVncmVlCisgKiBpcyBub3QgcmVjb21tZW5kZWQgKFdlaWwtZGVzY2VudCkuCisgKiBBcyB0aGUgZ3JvdXAgb3JkZXIgaXMgbm90IGEgcHJpbWUgdGhpcyBjdXJ2ZSBpcyBub3Qgc3VpdGFibGUKKyAqIGZvciBFQ0RTQS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7IEVDX0NVUlZFX0RBVEEgaDsgdW5zaWduZWQgY2hhciBkYXRhWzArMjAqNl07IH0KKwlfRUNfSVBTRUNfMTU1X0lEMyA9IHsKKwl7IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsMCwyMCwzIH0sCisJewkJCQkJCQkvKiBubyBzZWVkICovCisJICAweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBwICovCisJICAweDAwLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxLAorCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBhICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsMHgzMywweDhmLAorCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiB4ICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDdiLAorCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiB5ICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweGM4LAorCisJICAweDAyLDB4QUEsMHhBQSwweEFBLDB4QUEsMHhBQSwweEFBLDB4QUEsMHhBQSwweEFBLAkvKiBvcmRlciAqLworCSAgMHhDNywweEYzLDB4QzcsMHg4OCwweDFCLDB4RDAsMHg4NiwweDhGLDB4QTgsMHg2QyB9CisJfTsKKworLyogTk9URTogVGhlIG9mIGN1cnZlcyBvdmVyIGEgZXh0ZW5zaW9uIGZpZWxkIG9mIG5vbiBwcmltZSBkZWdyZWUKKyAqIGlzIG5vdCByZWNvbW1lbmRlZCAoV2VpbC1kZXNjZW50KS4KKyAqIEFzIHRoZSBncm91cCBvcmRlciBpcyBub3QgYSBwcmltZSB0aGlzIGN1cnZlIGlzIG5vdCBzdWl0YWJsZQorICogZm9yIEVDRFNBLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgRUNfQ1VSVkVfREFUQSBoOyB1bnNpZ25lZCBjaGFyIGRhdGFbMCsyNCo2XTsgfQorCV9FQ19JUFNFQ18xODVfSUQ0ID0geworCXsgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCwwLDI0LDIgfSwKKwl7CQkJCQkJCS8qIG5vIHNlZWQgKi8KKwkgIDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHAgKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAxLAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogYSAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAkvKiBiICovCisJICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAgMHgwMCwweDAwLDB4MWUsMHhlOSwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIHggKi8KKwkgIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAweDAwLDB4MDAsMHgwMCwweDE4LAorCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogeSAqLworCSAgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgIDB4MDAsMHgwMCwweDAwLDB4MGQsCisJICAweDAwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAkvKiBvcmRlciAqLworCSAgMHhGRiwweEZGLDB4RUQsMHhGOSwweDdDLDB4NDQsMHhEQiwweDlGLDB4MjQsMHgyMCwKKwkgIDB4QkEsMHhGQywweEE3LDB4NUUgfQorCX07CisKK3R5cGVkZWYgc3RydWN0IF9lY19saXN0X2VsZW1lbnRfc3QgeworCWludAluaWQ7CisJY29uc3QgRUNfQ1VSVkVfREFUQSAqZGF0YTsKKwljb25zdCBjaGFyICpjb21tZW50OworCX0gZWNfbGlzdF9lbGVtZW50OworCitzdGF0aWMgY29uc3QgZWNfbGlzdF9lbGVtZW50IGN1cnZlX2xpc3RbXSA9IHsKKwkvKiBwcmltZSBmaWVsZCBjdXJ2ZXMgKi8JCisJLyogc2VjZyBjdXJ2ZXMgKi8KKwl7IE5JRF9zZWNwMTEycjEsICZfRUNfU0VDR19QUklNRV8xMTJSMS5oLCAiU0VDRy9XVExTIGN1cnZlIG92ZXIgYSAxMTIgYml0IHByaW1lIGZpZWxkIn0sCisJeyBOSURfc2VjcDExMnIyLCAmX0VDX1NFQ0dfUFJJTUVfMTEyUjIuaCwgIlNFQ0cgY3VydmUgb3ZlciBhIDExMiBiaXQgcHJpbWUgZmllbGQifSwKKwl7IE5JRF9zZWNwMTI4cjEsICZfRUNfU0VDR19QUklNRV8xMjhSMS5oLCAiU0VDRyBjdXJ2ZSBvdmVyIGEgMTI4IGJpdCBwcmltZSBmaWVsZCJ9LAorCXsgTklEX3NlY3AxMjhyMiwgJl9FQ19TRUNHX1BSSU1FXzEyOFIyLmgsICJTRUNHIGN1cnZlIG92ZXIgYSAxMjggYml0IHByaW1lIGZpZWxkIn0sCisJeyBOSURfc2VjcDE2MGsxLCAmX0VDX1NFQ0dfUFJJTUVfMTYwSzEuaCwgIlNFQ0cgY3VydmUgb3ZlciBhIDE2MCBiaXQgcHJpbWUgZmllbGQifSwKKwl7IE5JRF9zZWNwMTYwcjEsICZfRUNfU0VDR19QUklNRV8xNjBSMS5oLCAiU0VDRyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZCJ9LAorCXsgTklEX3NlY3AxNjByMiwgJl9FQ19TRUNHX1BSSU1FXzE2MFIyLmgsICJTRUNHL1dUTFMgY3VydmUgb3ZlciBhIDE2MCBiaXQgcHJpbWUgZmllbGQifSwKKwkvKiBTRUNHIHNlY3AxOTJyMSBpcyB0aGUgc2FtZSBhcyBYOS42MiBwcmltZTE5MnYxIGFuZCBoZW5jZSBvbWl0dGVkICovCisJeyBOSURfc2VjcDE5MmsxLCAmX0VDX1NFQ0dfUFJJTUVfMTkySzEuaCwgIlNFQ0cgY3VydmUgb3ZlciBhIDE5MiBiaXQgcHJpbWUgZmllbGQifSwKKwl7IE5JRF9zZWNwMjI0azEsICZfRUNfU0VDR19QUklNRV8yMjRLMS5oLCAiU0VDRyBjdXJ2ZSBvdmVyIGEgMjI0IGJpdCBwcmltZSBmaWVsZCJ9LAorCXsgTklEX3NlY3AyMjRyMSwgJl9FQ19OSVNUX1BSSU1FXzIyNC5oLCAgICJOSVNUL1NFQ0cgY3VydmUgb3ZlciBhIDIyNCBiaXQgcHJpbWUgZmllbGQifSwKKwl7IE5JRF9zZWNwMjU2azEsICZfRUNfU0VDR19QUklNRV8yNTZLMS5oLCAiU0VDRyBjdXJ2ZSBvdmVyIGEgMjU2IGJpdCBwcmltZSBmaWVsZCJ9LAorCS8qIFNFQ0cgc2VjcDI1NnIxIGlzIHRoZSBzYW1lIGFzIFg5LjYyIHByaW1lMjU2djEgYW5kIGhlbmNlIG9taXR0ZWQgKi8KKwl7IE5JRF9zZWNwMzg0cjEsICZfRUNfTklTVF9QUklNRV8zODQuaCwgIk5JU1QvU0VDRyBjdXJ2ZSBvdmVyIGEgMzg0IGJpdCBwcmltZSBmaWVsZCJ9LAorCXsgTklEX3NlY3A1MjFyMSwgJl9FQ19OSVNUX1BSSU1FXzUyMS5oLCAiTklTVC9TRUNHIGN1cnZlIG92ZXIgYSA1MjEgYml0IHByaW1lIGZpZWxkIn0sCisJLyogWDkuNjIgY3VydmVzICovCisJeyBOSURfWDlfNjJfcHJpbWUxOTJ2MSwgJl9FQ19OSVNUX1BSSU1FXzE5Mi5oLCAiTklTVC9YOS42Mi9TRUNHIGN1cnZlIG92ZXIgYSAxOTIgYml0IHByaW1lIGZpZWxkIn0sCisJeyBOSURfWDlfNjJfcHJpbWUxOTJ2MiwgJl9FQ19YOV82Ml9QUklNRV8xOTJWMi5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDE5MiBiaXQgcHJpbWUgZmllbGQifSwKKwl7IE5JRF9YOV82Ml9wcmltZTE5MnYzLCAmX0VDX1g5XzYyX1BSSU1FXzE5MlYzLmgsICJYOS42MiBjdXJ2ZSBvdmVyIGEgMTkyIGJpdCBwcmltZSBmaWVsZCJ9LAorCXsgTklEX1g5XzYyX3ByaW1lMjM5djEsICZfRUNfWDlfNjJfUFJJTUVfMjM5VjEuaCwgIlg5LjYyIGN1cnZlIG92ZXIgYSAyMzkgYml0IHByaW1lIGZpZWxkIn0sCisJeyBOSURfWDlfNjJfcHJpbWUyMzl2MiwgJl9FQ19YOV82Ml9QUklNRV8yMzlWMi5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDIzOSBiaXQgcHJpbWUgZmllbGQifSwKKwl7IE5JRF9YOV82Ml9wcmltZTIzOXYzLCAmX0VDX1g5XzYyX1BSSU1FXzIzOVYzLmgsICJYOS42MiBjdXJ2ZSBvdmVyIGEgMjM5IGJpdCBwcmltZSBmaWVsZCJ9LAorCXsgTklEX1g5XzYyX3ByaW1lMjU2djEsICZfRUNfWDlfNjJfUFJJTUVfMjU2VjEuaCwgIlg5LjYyL1NFQ0cgY3VydmUgb3ZlciBhIDI1NiBiaXQgcHJpbWUgZmllbGQifSwKKwkvKiBjaGFyYWN0ZXJpc3RpYyB0d28gZmllbGQgY3VydmVzICovCisJLyogTklTVC9TRUNHIGN1cnZlcyAqLworCXsgTklEX3NlY3QxMTNyMSwgJl9FQ19TRUNHX0NIQVIyXzExM1IxLmgsICJTRUNHIGN1cnZlIG92ZXIgYSAxMTMgYml0IGJpbmFyeSBmaWVsZCJ9LAorCXsgTklEX3NlY3QxMTNyMiwgJl9FQ19TRUNHX0NIQVIyXzExM1IyLmgsICJTRUNHIGN1cnZlIG92ZXIgYSAxMTMgYml0IGJpbmFyeSBmaWVsZCJ9LAorCXsgTklEX3NlY3QxMzFyMSwgJl9FQ19TRUNHX0NIQVIyXzEzMVIxLmgsICJTRUNHL1dUTFMgY3VydmUgb3ZlciBhIDEzMSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfc2VjdDEzMXIyLCAmX0VDX1NFQ0dfQ0hBUjJfMTMxUjIuaCwgIlNFQ0cgY3VydmUgb3ZlciBhIDEzMSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfc2VjdDE2M2sxLCAmX0VDX05JU1RfQ0hBUjJfMTYzSy5oLCAgIk5JU1QvU0VDRy9XVExTIGN1cnZlIG92ZXIgYSAxNjMgYml0IGJpbmFyeSBmaWVsZCIgfSwKKwl7IE5JRF9zZWN0MTYzcjEsICZfRUNfU0VDR19DSEFSMl8xNjNSMS5oLCAiU0VDRyBjdXJ2ZSBvdmVyIGEgMTYzIGJpdCBiaW5hcnkgZmllbGQifSwKKwl7IE5JRF9zZWN0MTYzcjIsICZfRUNfTklTVF9DSEFSMl8xNjNCLmgsICAiTklTVC9TRUNHIGN1cnZlIG92ZXIgYSAxNjMgYml0IGJpbmFyeSBmaWVsZCIgfSwKKwl7IE5JRF9zZWN0MTkzcjEsICZfRUNfU0VDR19DSEFSMl8xOTNSMS5oLCAiU0VDRyBjdXJ2ZSBvdmVyIGEgMTkzIGJpdCBiaW5hcnkgZmllbGQifSwKKwl7IE5JRF9zZWN0MTkzcjIsICZfRUNfU0VDR19DSEFSMl8xOTNSMi5oLCAiU0VDRyBjdXJ2ZSBvdmVyIGEgMTkzIGJpdCBiaW5hcnkgZmllbGQifSwKKwl7IE5JRF9zZWN0MjMzazEsICZfRUNfTklTVF9DSEFSMl8yMzNLLmgsICAiTklTVC9TRUNHL1dUTFMgY3VydmUgb3ZlciBhIDIzMyBiaXQgYmluYXJ5IGZpZWxkIiB9LAorCXsgTklEX3NlY3QyMzNyMSwgJl9FQ19OSVNUX0NIQVIyXzIzM0IuaCwgICJOSVNUL1NFQ0cvV1RMUyBjdXJ2ZSBvdmVyIGEgMjMzIGJpdCBiaW5hcnkgZmllbGQiIH0sCisJeyBOSURfc2VjdDIzOWsxLCAmX0VDX1NFQ0dfQ0hBUjJfMjM5SzEuaCwgIlNFQ0cgY3VydmUgb3ZlciBhIDIzOSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfc2VjdDI4M2sxLCAmX0VDX05JU1RfQ0hBUjJfMjgzSy5oLCAgIk5JU1QvU0VDRyBjdXJ2ZSBvdmVyIGEgMjgzIGJpdCBiaW5hcnkgZmllbGQiIH0sCisJeyBOSURfc2VjdDI4M3IxLCAmX0VDX05JU1RfQ0hBUjJfMjgzQi5oLCAgIk5JU1QvU0VDRyBjdXJ2ZSBvdmVyIGEgMjgzIGJpdCBiaW5hcnkgZmllbGQiIH0sCisJeyBOSURfc2VjdDQwOWsxLCAmX0VDX05JU1RfQ0hBUjJfNDA5Sy5oLCAgIk5JU1QvU0VDRyBjdXJ2ZSBvdmVyIGEgNDA5IGJpdCBiaW5hcnkgZmllbGQiIH0sCisJeyBOSURfc2VjdDQwOXIxLCAmX0VDX05JU1RfQ0hBUjJfNDA5Qi5oLCAgIk5JU1QvU0VDRyBjdXJ2ZSBvdmVyIGEgNDA5IGJpdCBiaW5hcnkgZmllbGQiIH0sCisJeyBOSURfc2VjdDU3MWsxLCAmX0VDX05JU1RfQ0hBUjJfNTcxSy5oLCAgIk5JU1QvU0VDRyBjdXJ2ZSBvdmVyIGEgNTcxIGJpdCBiaW5hcnkgZmllbGQiIH0sCisJeyBOSURfc2VjdDU3MXIxLCAmX0VDX05JU1RfQ0hBUjJfNTcxQi5oLCAgIk5JU1QvU0VDRyBjdXJ2ZSBvdmVyIGEgNTcxIGJpdCBiaW5hcnkgZmllbGQiIH0sCisJLyogWDkuNjIgY3VydmVzICovCisJeyBOSURfWDlfNjJfYzJwbmIxNjN2MSwgJl9FQ19YOV82Ml9DSEFSMl8xNjNWMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDE2MyBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJwbmIxNjN2MiwgJl9FQ19YOV82Ml9DSEFSMl8xNjNWMi5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDE2MyBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJwbmIxNjN2MywgJl9FQ19YOV82Ml9DSEFSMl8xNjNWMy5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDE2MyBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJwbmIxNzZ2MSwgJl9FQ19YOV82Ml9DSEFSMl8xNzZWMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDE3NiBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJ0bmIxOTF2MSwgJl9FQ19YOV82Ml9DSEFSMl8xOTFWMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDE5MSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJ0bmIxOTF2MiwgJl9FQ19YOV82Ml9DSEFSMl8xOTFWMi5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDE5MSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJ0bmIxOTF2MywgJl9FQ19YOV82Ml9DSEFSMl8xOTFWMy5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDE5MSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJwbmIyMDh3MSwgJl9FQ19YOV82Ml9DSEFSMl8yMDhXMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDIwOCBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJ0bmIyMzl2MSwgJl9FQ19YOV82Ml9DSEFSMl8yMzlWMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDIzOSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJ0bmIyMzl2MiwgJl9FQ19YOV82Ml9DSEFSMl8yMzlWMi5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDIzOSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJ0bmIyMzl2MywgJl9FQ19YOV82Ml9DSEFSMl8yMzlWMy5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDIzOSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJwbmIyNzJ3MSwgJl9FQ19YOV82Ml9DSEFSMl8yNzJXMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDI3MiBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJwbmIzMDR3MSwgJl9FQ19YOV82Ml9DSEFSMl8zMDRXMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDMwNCBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJ0bmIzNTl2MSwgJl9FQ19YOV82Ml9DSEFSMl8zNTlWMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDM1OSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJwbmIzNjh3MSwgJl9FQ19YOV82Ml9DSEFSMl8zNjhXMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDM2OCBiaXQgYmluYXJ5IGZpZWxkIn0sCisJeyBOSURfWDlfNjJfYzJ0bmI0MzFyMSwgJl9FQ19YOV82Ml9DSEFSMl80MzFSMS5oLCAiWDkuNjIgY3VydmUgb3ZlciBhIDQzMSBiaXQgYmluYXJ5IGZpZWxkIn0sCisJLyogdGhlIFdBUC9XVExTIGN1cnZlcworCSAqIFt1bmxpa2UgU0VDRywgc3BlYyBoYXMgaXRzIG93biBPSURzIGZvciBjdXJ2ZXMgZnJvbSBYOS42Ml0gKi8KKwl7IE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMxLCAmX0VDX1dUTFNfMS5oLCAiV1RMUyBjdXJ2ZSBvdmVyIGEgMTEzIGJpdCBiaW5hcnkgZmllbGQifSwKKwl7IE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMzLCAmX0VDX05JU1RfQ0hBUjJfMTYzSy5oLCAgICJOSVNUL1NFQ0cvV1RMUyBjdXJ2ZSBvdmVyIGEgMTYzIGJpdCBiaW5hcnkgZmllbGQifSwKKwl7IE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM0LCAmX0VDX1NFQ0dfQ0hBUjJfMTEzUjEuaCwgICJTRUNHIGN1cnZlIG92ZXIgYSAxMTMgYml0IGJpbmFyeSBmaWVsZCJ9LAorCXsgTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczUsICZfRUNfWDlfNjJfQ0hBUjJfMTYzVjEuaCwgIlg5LjYyIGN1cnZlIG92ZXIgYSAxNjMgYml0IGJpbmFyeSBmaWVsZCJ9LAorCXsgTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczYsICZfRUNfU0VDR19QUklNRV8xMTJSMS5oLCAgIlNFQ0cvV1RMUyBjdXJ2ZSBvdmVyIGEgMTEyIGJpdCBwcmltZSBmaWVsZCJ9LAorCXsgTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczcsICZfRUNfU0VDR19QUklNRV8xNjBSMi5oLCAgIlNFQ0cvV1RMUyBjdXJ2ZSBvdmVyIGEgMTYwIGJpdCBwcmltZSBmaWVsZCJ9LAorCXsgTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczgsICZfRUNfV1RMU184LmgsICJXVExTIGN1cnZlIG92ZXIgYSAxMTIgYml0IHByaW1lIGZpZWxkIn0sCisJeyBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzOSwgJl9FQ19XVExTXzkuaCwgIldUTFMgY3VydmUgb3ZlciBhIDE2MCBiaXQgcHJpbWUgZmllbGQiIH0sCisJeyBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTAsICZfRUNfTklTVF9DSEFSMl8yMzNLLmgsICJOSVNUL1NFQ0cvV1RMUyBjdXJ2ZSBvdmVyIGEgMjMzIGJpdCBiaW5hcnkgZmllbGQifSwKKwl7IE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMSwgJl9FQ19OSVNUX0NIQVIyXzIzM0IuaCwgIk5JU1QvU0VDRy9XVExTIGN1cnZlIG92ZXIgYSAyMzMgYml0IGJpbmFyeSBmaWVsZCJ9LAorCXsgTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczEyLCAmX0VDX1dUTFNfMTIuaCwgIldUTFMgY3VydnMgb3ZlciBhIDIyNCBiaXQgcHJpbWUgZmllbGQifSwKKwkvKiBJUFNlYyBjdXJ2ZXMgKi8KKwl7IE5JRF9pcHNlYzMsICZfRUNfSVBTRUNfMTU1X0lEMy5oLCAiXG5cdElQU2VjL0lLRS9PYWtsZXkgY3VydmUgIzMgb3ZlciBhIDE1NSBiaXQgYmluYXJ5IGZpZWxkLlxuIiJcdE5vdCBzdWl0YWJsZSBmb3IgRUNEU0EuXG5cdFF1ZXN0aW9uYWJsZSBleHRlbnNpb24gZmllbGQhIn0sCisJeyBOSURfaXBzZWM0LCAmX0VDX0lQU0VDXzE4NV9JRDQuaCwgIlxuXHRJUFNlYy9JS0UvT2FrbGV5IGN1cnZlICM0IG92ZXIgYSAxODUgYml0IGJpbmFyeSBmaWVsZC5cbiIiXHROb3Qgc3VpdGFibGUgZm9yIEVDRFNBLlxuXHRRdWVzdGlvbmFibGUgZXh0ZW5zaW9uIGZpZWxkISJ9LAorfTsKKworI2RlZmluZSBjdXJ2ZV9saXN0X2xlbmd0aCAoc2l6ZW9mKGN1cnZlX2xpc3QpL3NpemVvZihlY19saXN0X2VsZW1lbnQpKQorCitzdGF0aWMgRUNfR1JPVVAgKmVjX2dyb3VwX25ld19mcm9tX2RhdGEoY29uc3QgRUNfQ1VSVkVfREFUQSAqZGF0YSkKKwl7CisJRUNfR1JPVVAgKmdyb3VwPU5VTEw7CisJRUNfUE9JTlQgKlA9TlVMTDsKKwlCTl9DVFgJICpjdHg9TlVMTDsKKwlCSUdOVU0gCSAqcD1OVUxMLCAqYT1OVUxMLCAqYj1OVUxMLCAqeD1OVUxMLCAqeT1OVUxMLCAqb3JkZXI9TlVMTDsKKwlpbnQJIG9rPTA7CisJaW50CSBzZWVkX2xlbixwYXJhbV9sZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqcGFyYW1zOworCisJaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9ORVdfRlJPTV9EQVRBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlzZWVkX2xlbiAgPSBkYXRhLT5zZWVkX2xlbjsKKwlwYXJhbV9sZW4gPSBkYXRhLT5wYXJhbV9sZW47CisJcGFyYW1zICAgID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikoZGF0YSsxKTsJLyogc2tpcCBoZWFkZXIgKi8KKwlwYXJhbXMgICArPSBzZWVkX2xlbjsJCQkJLyogc2tpcCBzZWVkICAgKi8KKworCWlmICghKHAgPSBCTl9iaW4yYm4ocGFyYW1zKzAqcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKQorCQl8fCAhKGEgPSBCTl9iaW4yYm4ocGFyYW1zKzEqcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKQorCQl8fCAhKGIgPSBCTl9iaW4yYm4ocGFyYW1zKzIqcGFyYW1fbGVuLCBwYXJhbV9sZW4sIE5VTEwpKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX05FV19GUk9NX0RBVEEsIEVSUl9SX0JOX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoZGF0YS0+ZmllbGRfdHlwZSA9PSBOSURfWDlfNjJfcHJpbWVfZmllbGQpCisJCXsKKwkJaWYgKChncm91cCA9IEVDX0dST1VQX25ld19jdXJ2ZV9HRnAocCwgYSwgYiwgY3R4KSkgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfTkVXX0ZST01fREFUQSwgRVJSX1JfRUNfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJZWxzZQkvKiBmaWVsZF90eXBlID09IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQgKi8KKwkJeworCQlpZiAoKGdyb3VwID0gRUNfR1JPVVBfbmV3X2N1cnZlX0dGMm0ocCwgYSwgYiwgY3R4KSkgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfTkVXX0ZST01fREFUQSwgRVJSX1JfRUNfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAoKFAgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfTkVXX0ZST01fREFUQSwgRVJSX1JfRUNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwkKKwlpZiAoISh4ID0gQk5fYmluMmJuKHBhcmFtcyszKnBhcmFtX2xlbiwgcGFyYW1fbGVuLCBOVUxMKSkKKwkJfHwgISh5ID0gQk5fYmluMmJuKHBhcmFtcys0KnBhcmFtX2xlbiwgcGFyYW1fbGVuLCBOVUxMKSkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9ORVdfRlJPTV9EQVRBLCBFUlJfUl9CTl9MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCWlmICghRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBQLCB4LCB5LCBjdHgpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfTkVXX0ZST01fREFUQSwgRVJSX1JfRUNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoIShvcmRlciA9IEJOX2JpbjJibihwYXJhbXMrNSpwYXJhbV9sZW4sIHBhcmFtX2xlbiwgTlVMTCkpCisJCXx8ICFCTl9zZXRfd29yZCh4LCAoQk5fVUxPTkcpZGF0YS0+Y29mYWN0b3IpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfTkVXX0ZST01fREFUQSwgRVJSX1JfQk5fTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoIUVDX0dST1VQX3NldF9nZW5lcmF0b3IoZ3JvdXAsIFAsIG9yZGVyLCB4KSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX05FV19GUk9NX0RBVEEsIEVSUl9SX0VDX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKHNlZWRfbGVuKQorCQl7CisJCWlmICghRUNfR1JPVVBfc2V0X3NlZWQoZ3JvdXAsIHBhcmFtcy1zZWVkX2xlbiwgc2VlZF9sZW4pKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19HUk9VUF9ORVdfRlJPTV9EQVRBLCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlvaz0xOworZXJyOgorCWlmICghb2spCisJCXsKKwkJRUNfR1JPVVBfZnJlZShncm91cCk7CisJCWdyb3VwID0gTlVMTDsKKwkJfQorCWlmIChQKQorCQlFQ19QT0lOVF9mcmVlKFApOworCWlmIChjdHgpCisJCUJOX0NUWF9mcmVlKGN0eCk7CisJaWYgKHApCisJCUJOX2ZyZWUocCk7CisJaWYgKGEpCisJCUJOX2ZyZWUoYSk7CisJaWYgKGIpCisJCUJOX2ZyZWUoYik7CisJaWYgKG9yZGVyKQorCQlCTl9mcmVlKG9yZGVyKTsKKwlpZiAoeCkKKwkJQk5fZnJlZSh4KTsKKwlpZiAoeSkKKwkJQk5fZnJlZSh5KTsKKwlyZXR1cm4gZ3JvdXA7CisJfQorCitFQ19HUk9VUCAqRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoaW50IG5pZCkKKwl7CisJc2l6ZV90IGk7CisJRUNfR1JPVVAgKnJldCA9IE5VTEw7CisKKwlpZiAobmlkIDw9IDApCisJCXJldHVybiBOVUxMOworCisJZm9yIChpPTA7IGk8Y3VydmVfbGlzdF9sZW5ndGg7IGkrKykKKwkJaWYgKGN1cnZlX2xpc3RbaV0ubmlkID09IG5pZCkKKwkJCXsKKwkJCXJldCA9IGVjX2dyb3VwX25ld19mcm9tX2RhdGEoY3VydmVfbGlzdFtpXS5kYXRhKTsKKwkJCWJyZWFrOworCQkJfQorCisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfTkVXX0JZX0NVUlZFX05BTUUsIEVDX1JfVU5LTk9XTl9HUk9VUCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlFQ19HUk9VUF9zZXRfY3VydmVfbmFtZShyZXQsIG5pZCk7CisKKwlyZXR1cm4gcmV0OworCX0KKworc2l6ZV90IEVDX2dldF9idWlsdGluX2N1cnZlcyhFQ19idWlsdGluX2N1cnZlICpyLCBzaXplX3Qgbml0ZW1zKQorCXsKKwlzaXplX3QJaSwgbWluOworCisJaWYgKHIgPT0gTlVMTCB8fCBuaXRlbXMgPT0gMCkKKwkJcmV0dXJuIGN1cnZlX2xpc3RfbGVuZ3RoOworCisJbWluID0gbml0ZW1zIDwgY3VydmVfbGlzdF9sZW5ndGggPyBuaXRlbXMgOiBjdXJ2ZV9saXN0X2xlbmd0aDsKKworCWZvciAoaSA9IDA7IGkgPCBtaW47IGkrKykKKwkJeworCQlyW2ldLm5pZCA9IGN1cnZlX2xpc3RbaV0ubmlkOworCQlyW2ldLmNvbW1lbnQgPSBjdXJ2ZV9saXN0W2ldLmNvbW1lbnQ7CisJCX0KKworCXJldHVybiBjdXJ2ZV9saXN0X2xlbmd0aDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfY3Z0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfY3Z0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ1NjQwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19jdnQuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogY3J5cHRvL2VjL2VjX2N2dC5jICovCisvKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IEJvZG8gTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGFyZSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBUaGUgZWxsaXB0aWMgY3VydmUgYmluYXJ5IHBvbHlub21pYWwgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgImVjX2xjbC5oIgorCisKK0VDX0dST1VQICpFQ19HUk9VUF9uZXdfY3VydmVfR0ZwKGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KQorCXsKKwljb25zdCBFQ19NRVRIT0QgKm1ldGg7CisJRUNfR1JPVVAgKnJldDsKKworCW1ldGggPSBFQ19HRnBfbmlzdF9tZXRob2QoKTsKKwkKKwlyZXQgPSBFQ19HUk9VUF9uZXcobWV0aCk7CisJaWYgKHJldCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghRUNfR1JPVVBfc2V0X2N1cnZlX0dGcChyZXQsIHAsIGEsIGIsIGN0eCkpCisJCXsKKwkJdW5zaWduZWQgbG9uZyBlcnI7CisJCSAgCisJCWVyciA9IEVSUl9wZWVrX2xhc3RfZXJyb3IoKTsKKworCQlpZiAoIShFUlJfR0VUX0xJQihlcnIpID09IEVSUl9MSUJfRUMgJiYKKwkJCSgoRVJSX0dFVF9SRUFTT04oZXJyKSA9PSBFQ19SX05PVF9BX05JU1RfUFJJTUUpIHx8CisJCQkgKEVSUl9HRVRfUkVBU09OKGVycikgPT0gRUNfUl9OT1RfQV9TVVBQT1JURURfTklTVF9QUklNRSkpKSkKKwkJCXsKKwkJCS8qIHJlYWwgZXJyb3IgKi8KKwkJCQorCQkJRUNfR1JPVVBfY2xlYXJfZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQkKKwkJCisJCS8qIG5vdCBhbiBhY3R1YWwgZXJyb3IsIHdlIGp1c3QgY2Fubm90IHVzZSBFQ19HRnBfbmlzdF9tZXRob2QgKi8KKworCQlFUlJfY2xlYXJfZXJyb3IoKTsKKworCQlFQ19HUk9VUF9jbGVhcl9mcmVlKHJldCk7CisJCW1ldGggPSBFQ19HRnBfbW9udF9tZXRob2QoKTsKKworCQlyZXQgPSBFQ19HUk9VUF9uZXcobWV0aCk7CisJCWlmIChyZXQgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCWlmICghRUNfR1JPVVBfc2V0X2N1cnZlX0dGcChyZXQsIHAsIGEsIGIsIGN0eCkpCisJCQl7CisJCQlFQ19HUk9VUF9jbGVhcl9mcmVlKHJldCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJcmV0dXJuIHJldDsKKwl9CisKKworRUNfR1JPVVAgKkVDX0dST1VQX25ld19jdXJ2ZV9HRjJtKGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KQorCXsKKwljb25zdCBFQ19NRVRIT0QgKm1ldGg7CisJRUNfR1JPVVAgKnJldDsKKwkKKwltZXRoID0gRUNfR0YybV9zaW1wbGVfbWV0aG9kKCk7CisJCisJcmV0ID0gRUNfR1JPVVBfbmV3KG1ldGgpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIUVDX0dST1VQX3NldF9jdXJ2ZV9HRjJtKHJldCwgcCwgYSwgYiwgY3R4KSkKKwkJeworCQlFQ19HUk9VUF9jbGVhcl9mcmVlKHJldCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXR1cm4gcmV0OworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19lcnIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI0ODMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX2Vyci5jCkBAIC0wLDAgKzEsMjU4IEBACisvKiBjcnlwdG8vZWMvZWNfZXJyLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBOT1RFOiB0aGlzIGZpbGUgd2FzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBta2Vyci5wbCBzY3JpcHQ6IGFueSBjaGFuZ2VzCisgKiBtYWRlIHRvIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IG5leHQgdXBkYXRlcyB0aGlzIGZpbGUsCisgKiBvbmx5IHJlYXNvbiBzdHJpbmdzIHdpbGwgYmUgcHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfRUMsZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9FQywwLHJlYXNvbikKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBFQ19zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKEVDX0ZfQ09NUFVURV9XTkFGKSwJIkNPTVBVVEVfV05BRiJ9LAore0VSUl9GVU5DKEVDX0ZfRDJJX0VDUEFSQU1FVEVSUyksCSJkMmlfRUNQYXJhbWV0ZXJzIn0sCit7RVJSX0ZVTkMoRUNfRl9EMklfRUNQS1BBUkFNRVRFUlMpLAkiZDJpX0VDUEtQYXJhbWV0ZXJzIn0sCit7RVJSX0ZVTkMoRUNfRl9EMklfRUNQUklWQVRFS0VZKSwJImQyaV9FQ1ByaXZhdGVLZXkifSwKK3tFUlJfRlVOQyhFQ19GX0RPX0VDX0tFWV9QUklOVCksCSJET19FQ19LRVlfUFJJTlQifSwKK3tFUlJfRlVOQyhFQ19GX0VDS0VZX1BBUkFNMlRZUEUpLAkiRUNLRVlfUEFSQU0yVFlQRSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNLRVlfUEFSQU1fREVDT0RFKSwJIkVDS0VZX1BBUkFNX0RFQ09ERSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNLRVlfUFJJVl9ERUNPREUpLAkiRUNLRVlfUFJJVl9ERUNPREUifSwKK3tFUlJfRlVOQyhFQ19GX0VDS0VZX1BSSVZfRU5DT0RFKSwJIkVDS0VZX1BSSVZfRU5DT0RFIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ0tFWV9QVUJfREVDT0RFKSwJIkVDS0VZX1BVQl9ERUNPREUifSwKK3tFUlJfRlVOQyhFQ19GX0VDS0VZX1BVQl9FTkNPREUpLAkiRUNLRVlfUFVCX0VOQ09ERSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNLRVlfVFlQRTJQQVJBTSksCSJFQ0tFWV9UWVBFMlBBUkFNIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ1BBUkFNRVRFUlNfUFJJTlQpLAkiRUNQYXJhbWV0ZXJzX3ByaW50In0sCit7RVJSX0ZVTkMoRUNfRl9FQ1BBUkFNRVRFUlNfUFJJTlRfRlApLAkiRUNQYXJhbWV0ZXJzX3ByaW50X2ZwIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ1BLUEFSQU1FVEVSU19QUklOVCksCSJFQ1BLUGFyYW1ldGVyc19wcmludCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNQS1BBUkFNRVRFUlNfUFJJTlRfRlApLAkiRUNQS1BhcmFtZXRlcnNfcHJpbnRfZnAifSwKK3tFUlJfRlVOQyhFQ19GX0VDUF9OSVNUX01PRF8xOTIpLAkiRUNQX05JU1RfTU9EXzE5MiJ9LAore0VSUl9GVU5DKEVDX0ZfRUNQX05JU1RfTU9EXzIyNCksCSJFQ1BfTklTVF9NT0RfMjI0In0sCit7RVJSX0ZVTkMoRUNfRl9FQ1BfTklTVF9NT0RfMjU2KSwJIkVDUF9OSVNUX01PRF8yNTYifSwKK3tFUlJfRlVOQyhFQ19GX0VDUF9OSVNUX01PRF81MjEpLAkiRUNQX05JU1RfTU9EXzUyMSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfQVNOMV9HUk9VUDJDVVJWRSksCSJFQ19BU04xX0dST1VQMkNVUlZFIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19BU04xX0dST1VQMkZJRUxESUQpLAkiRUNfQVNOMV9HUk9VUDJGSUVMRElEIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19BU04xX0dST1VQMlBBUkFNRVRFUlMpLAkiRUNfQVNOMV9HUk9VUDJQQVJBTUVURVJTIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19BU04xX0dST1VQMlBLUEFSQU1FVEVSUyksCSJFQ19BU04xX0dST1VQMlBLUEFSQU1FVEVSUyJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfQVNOMV9QQVJBTUVURVJTMkdST1VQKSwJIkVDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfQVNOMV9QS1BBUkFNRVRFUlMyR1JPVVApLAkiRUNfQVNOMV9QS1BBUkFNRVRFUlMyR1JPVVAifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0VYX0RBVEFfU0VUX0RBVEEpLAkiRUNfRVhfREFUQV9zZXRfZGF0YSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0YyTV9NT05UR09NRVJZX1BPSU5UX01VTFRJUExZKSwJIkVDX0dGMk1fTU9OVEdPTUVSWV9QT0lOVF9NVUxUSVBMWSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0YyTV9TSU1QTEVfR1JPVVBfQ0hFQ0tfRElTQ1JJTUlOQU5UKSwJImVjX0dGMm1fc2ltcGxlX2dyb3VwX2NoZWNrX2Rpc2NyaW1pbmFudCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0YyTV9TSU1QTEVfR1JPVVBfU0VUX0NVUlZFKSwJImVjX0dGMm1fc2ltcGxlX2dyb3VwX3NldF9jdXJ2ZSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0YyTV9TSU1QTEVfT0NUMlBPSU5UKSwJImVjX0dGMm1fc2ltcGxlX29jdDJwb2ludCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlQyT0NUKSwJImVjX0dGMm1fc2ltcGxlX3BvaW50Mm9jdCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0YyTV9TSU1QTEVfUE9JTlRfR0VUX0FGRklORV9DT09SRElOQVRFUyksCSJlY19HRjJtX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRjJNX1NJTVBMRV9QT0lOVF9TRVRfQUZGSU5FX0NPT1JESU5BVEVTKSwJImVjX0dGMm1fc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGMk1fU0lNUExFX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTKSwJImVjX0dGMm1fc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfTU9OVF9GSUVMRF9ERUNPREUpLAkiZWNfR0ZwX21vbnRfZmllbGRfZGVjb2RlIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfTU9OVF9GSUVMRF9FTkNPREUpLAkiZWNfR0ZwX21vbnRfZmllbGRfZW5jb2RlIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfTU9OVF9GSUVMRF9NVUwpLAkiZWNfR0ZwX21vbnRfZmllbGRfbXVsIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfTU9OVF9GSUVMRF9TRVRfVE9fT05FKSwJImVjX0dGcF9tb250X2ZpZWxkX3NldF90b19vbmUifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGUF9NT05UX0ZJRUxEX1NRUiksCSJlY19HRnBfbW9udF9maWVsZF9zcXIifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGUF9NT05UX0dST1VQX1NFVF9DVVJWRSksCSJlY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGUF9NT05UX0dST1VQX1NFVF9DVVJWRV9HRlApLAkiRUNfR0ZQX01PTlRfR1JPVVBfU0VUX0NVUlZFX0dGUCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0ZQX05JU1RfRklFTERfTVVMKSwJImVjX0dGcF9uaXN0X2ZpZWxkX211bCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0ZQX05JU1RfRklFTERfU1FSKSwJImVjX0dGcF9uaXN0X2ZpZWxkX3NxciJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0ZQX05JU1RfR1JPVVBfU0VUX0NVUlZFKSwJImVjX0dGcF9uaXN0X2dyb3VwX3NldF9jdXJ2ZSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0ZQX1NJTVBMRV9HUk9VUF9DSEVDS19ESVNDUklNSU5BTlQpLAkiZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGUF9TSU1QTEVfR1JPVVBfU0VUX0NVUlZFKSwJImVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfU0lNUExFX0dST1VQX1NFVF9DVVJWRV9HRlApLAkiRUNfR0ZQX1NJTVBMRV9HUk9VUF9TRVRfQ1VSVkVfR0ZQIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfU0lNUExFX0dST1VQX1NFVF9HRU5FUkFUT1IpLAkiRUNfR0ZQX1NJTVBMRV9HUk9VUF9TRVRfR0VORVJBVE9SIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfU0lNUExFX01BS0VfQUZGSU5FKSwJImVjX0dGcF9zaW1wbGVfbWFrZV9hZmZpbmUifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGUF9TSU1QTEVfT0NUMlBPSU5UKSwJImVjX0dGcF9zaW1wbGVfb2N0MnBvaW50In0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfU0lNUExFX1BPSU5UMk9DVCksCSJlY19HRnBfc2ltcGxlX3BvaW50Mm9jdCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVFNfTUFLRV9BRkZJTkUpLAkiZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlRfR0VUX0FGRklORV9DT09SRElOQVRFUyksCSJlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlRfR0VUX0FGRklORV9DT09SRElOQVRFU19HRlApLAkiRUNfR0ZQX1NJTVBMRV9QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVF9TRVRfQUZGSU5FX0NPT1JESU5BVEVTKSwJImVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcyJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVF9TRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUCksCSJFQ19HRlBfU0lNUExFX1BPSU5UX1NFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0ZQIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HRlBfU0lNUExFX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTKSwJImVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dGUF9TSU1QTEVfU0VUX0NPTVBSRVNTRURfQ09PUkRJTkFURVNfR0ZQKSwJIkVDX0dGUF9TSU1QTEVfU0VUX0NPTVBSRVNTRURfQ09PUkRJTkFURVNfR0ZQIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HUk9VUF9DSEVDSyksCSJFQ19HUk9VUF9jaGVjayJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR1JPVVBfQ0hFQ0tfRElTQ1JJTUlOQU5UKSwJIkVDX0dST1VQX2NoZWNrX2Rpc2NyaW1pbmFudCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR1JPVVBfQ09QWSksCSJFQ19HUk9VUF9jb3B5In0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HUk9VUF9HRVQwX0dFTkVSQVRPUiksCSJFQ19HUk9VUF9nZXQwX2dlbmVyYXRvciJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR1JPVVBfR0VUX0NPRkFDVE9SKSwJIkVDX0dST1VQX2dldF9jb2ZhY3RvciJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR1JPVVBfR0VUX0NVUlZFX0dGMk0pLAkiRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0ifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dST1VQX0dFVF9DVVJWRV9HRlApLAkiRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfR1JPVVBfR0VUX0RFR1JFRSksCSJFQ19HUk9VUF9nZXRfZGVncmVlIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HUk9VUF9HRVRfT1JERVIpLAkiRUNfR1JPVVBfZ2V0X29yZGVyIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HUk9VUF9HRVRfUEVOVEFOT01JQUxfQkFTSVMpLAkiRUNfR1JPVVBfZ2V0X3BlbnRhbm9taWFsX2Jhc2lzIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HUk9VUF9HRVRfVFJJTk9NSUFMX0JBU0lTKSwJIkVDX0dST1VQX2dldF90cmlub21pYWxfYmFzaXMifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dST1VQX05FVyksCSJFQ19HUk9VUF9uZXcifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dST1VQX05FV19CWV9DVVJWRV9OQU1FKSwJIkVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HUk9VUF9ORVdfRlJPTV9EQVRBKSwJIkVDX0dST1VQX05FV19GUk9NX0RBVEEifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dST1VQX1BSRUNPTVBVVEVfTVVMVCksCSJFQ19HUk9VUF9wcmVjb21wdXRlX211bHQifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dST1VQX1NFVF9DVVJWRV9HRjJNKSwJIkVDX0dST1VQX3NldF9jdXJ2ZV9HRjJtIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HUk9VUF9TRVRfQ1VSVkVfR0ZQKSwJIkVDX0dST1VQX3NldF9jdXJ2ZV9HRnAifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0dST1VQX1NFVF9FWFRSQV9EQVRBKSwJIkVDX0dST1VQX1NFVF9FWFRSQV9EQVRBIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19HUk9VUF9TRVRfR0VORVJBVE9SKSwJIkVDX0dST1VQX3NldF9nZW5lcmF0b3IifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0tFWV9DSEVDS19LRVkpLAkiRUNfS0VZX2NoZWNrX2tleSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfS0VZX0NPUFkpLAkiRUNfS0VZX2NvcHkifSwKK3tFUlJfRlVOQyhFQ19GX0VDX0tFWV9HRU5FUkFURV9LRVkpLAkiRUNfS0VZX2dlbmVyYXRlX2tleSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfS0VZX05FVyksCSJFQ19LRVlfbmV3In0sCit7RVJSX0ZVTkMoRUNfRl9FQ19LRVlfUFJJTlQpLAkiRUNfS0VZX3ByaW50In0sCit7RVJSX0ZVTkMoRUNfRl9FQ19LRVlfUFJJTlRfRlApLAkiRUNfS0VZX3ByaW50X2ZwIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19QT0lOVFNfTUFLRV9BRkZJTkUpLAkiRUNfUE9JTlRzX21ha2VfYWZmaW5lIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19QT0lOVF9BREQpLAkiRUNfUE9JTlRfYWRkIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19QT0lOVF9DTVApLAkiRUNfUE9JTlRfY21wIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19QT0lOVF9DT1BZKSwJIkVDX1BPSU5UX2NvcHkifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX0RCTCksCSJFQ19QT0lOVF9kYmwifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX0dFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0YyTSksCSJFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0ifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX0dFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0ZQKSwJIkVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19QT0lOVF9HRVRfSlBST0pFQ1RJVkVfQ09PUkRJTkFURVNfR0ZQKSwJIkVDX1BPSU5UX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX0lOVkVSVCksCSJFQ19QT0lOVF9pbnZlcnQifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX0lTX0FUX0lORklOSVRZKSwJIkVDX1BPSU5UX2lzX2F0X2luZmluaXR5In0sCit7RVJSX0ZVTkMoRUNfRl9FQ19QT0lOVF9JU19PTl9DVVJWRSksCSJFQ19QT0lOVF9pc19vbl9jdXJ2ZSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfUE9JTlRfTUFLRV9BRkZJTkUpLAkiRUNfUE9JTlRfbWFrZV9hZmZpbmUifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX01VTCksCSJFQ19QT0lOVF9tdWwifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX05FVyksCSJFQ19QT0lOVF9uZXcifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX09DVDJQT0lOVCksCSJFQ19QT0lOVF9vY3QycG9pbnQifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX1BPSU5UMk9DVCksCSJFQ19QT0lOVF9wb2ludDJvY3QifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX1NFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0YyTSksCSJFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0ifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX1NFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0ZQKSwJIkVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwIn0sCit7RVJSX0ZVTkMoRUNfRl9FQ19QT0lOVF9TRVRfQ09NUFJFU1NFRF9DT09SRElOQVRFU19HRjJNKSwJIkVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGMm0ifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTX0dGUCksCSJFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1BPSU5UX1NFVF9KUFJPSkVDVElWRV9DT09SRElOQVRFU19HRlApLAkiRUNfUE9JTlRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfUE9JTlRfU0VUX1RPX0lORklOSVRZKSwJIkVDX1BPSU5UX3NldF90b19pbmZpbml0eSJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfUFJFX0NPTVBfRFVQKSwJIkVDX1BSRV9DT01QX0RVUCJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfUFJFX0NPTVBfTkVXKSwJIkVDX1BSRV9DT01QX05FVyJ9LAore0VSUl9GVU5DKEVDX0ZfRUNfV05BRl9NVUwpLAkiZWNfd05BRl9tdWwifSwKK3tFUlJfRlVOQyhFQ19GX0VDX1dOQUZfUFJFQ09NUFVURV9NVUxUKSwJImVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0In0sCit7RVJSX0ZVTkMoRUNfRl9JMkRfRUNQQVJBTUVURVJTKSwJImkyZF9FQ1BhcmFtZXRlcnMifSwKK3tFUlJfRlVOQyhFQ19GX0kyRF9FQ1BLUEFSQU1FVEVSUyksCSJpMmRfRUNQS1BhcmFtZXRlcnMifSwKK3tFUlJfRlVOQyhFQ19GX0kyRF9FQ1BSSVZBVEVLRVkpLAkiaTJkX0VDUHJpdmF0ZUtleSJ9LAore0VSUl9GVU5DKEVDX0ZfSTJPX0VDUFVCTElDS0VZKSwJImkyb19FQ1B1YmxpY0tleSJ9LAore0VSUl9GVU5DKEVDX0ZfTzJJX0VDUFVCTElDS0VZKSwJIm8yaV9FQ1B1YmxpY0tleSJ9LAore0VSUl9GVU5DKEVDX0ZfT0xEX0VDX1BSSVZfREVDT0RFKSwJIk9MRF9FQ19QUklWX0RFQ09ERSJ9LAore0VSUl9GVU5DKEVDX0ZfUEtFWV9FQ19DVFJMKSwJIlBLRVlfRUNfQ1RSTCJ9LAore0VSUl9GVU5DKEVDX0ZfUEtFWV9FQ19DVFJMX1NUUiksCSJQS0VZX0VDX0NUUkxfU1RSIn0sCit7RVJSX0ZVTkMoRUNfRl9QS0VZX0VDX0RFUklWRSksCSJQS0VZX0VDX0RFUklWRSJ9LAore0VSUl9GVU5DKEVDX0ZfUEtFWV9FQ19LRVlHRU4pLAkiUEtFWV9FQ19LRVlHRU4ifSwKK3tFUlJfRlVOQyhFQ19GX1BLRVlfRUNfUEFSQU1HRU4pLAkiUEtFWV9FQ19QQVJBTUdFTiJ9LAore0VSUl9GVU5DKEVDX0ZfUEtFWV9FQ19TSUdOKSwJIlBLRVlfRUNfU0lHTiJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEVDX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oRUNfUl9BU04xX0VSUk9SKSAgICAgICAgICAgICAsImFzbjEgZXJyb3IifSwKK3tFUlJfUkVBU09OKEVDX1JfQVNOMV9VTktOT1dOX0ZJRUxEKSAgICAgLCJhc24xIHVua25vd24gZmllbGQifSwKK3tFUlJfUkVBU09OKEVDX1JfQlVGRkVSX1RPT19TTUFMTCkgICAgICAgLCJidWZmZXIgdG9vIHNtYWxsIn0sCit7RVJSX1JFQVNPTihFQ19SX0QySV9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFKSwiZDJpIGVjcGtwYXJhbWV0ZXJzIGZhaWx1cmUifSwKK3tFUlJfUkVBU09OKEVDX1JfREVDT0RFX0VSUk9SKSAgICAgICAgICAgLCJkZWNvZGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKEVDX1JfRElTQ1JJTUlOQU5UX0lTX1pFUk8pICAgLCJkaXNjcmltaW5hbnQgaXMgemVybyJ9LAore0VSUl9SRUFTT04oRUNfUl9FQ19HUk9VUF9ORVdfQllfTkFNRV9GQUlMVVJFKSwiZWMgZ3JvdXAgbmV3IGJ5IG5hbWUgZmFpbHVyZSJ9LAore0VSUl9SRUFTT04oRUNfUl9GSUVMRF9UT09fTEFSR0UpICAgICAgICAsImZpZWxkIHRvbyBsYXJnZSJ9LAore0VSUl9SRUFTT04oRUNfUl9HUk9VUDJQS1BBUkFNRVRFUlNfRkFJTFVSRSksImdyb3VwMnBrcGFyYW1ldGVycyBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihFQ19SX0kyRF9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFKSwiaTJkIGVjcGtwYXJhbWV0ZXJzIGZhaWx1cmUifSwKK3tFUlJfUkVBU09OKEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpICAgLCJpbmNvbXBhdGlibGUgb2JqZWN0cyJ9LAore0VSUl9SRUFTT04oRUNfUl9JTlZBTElEX0FSR1VNRU5UKSAgICAgICAsImludmFsaWQgYXJndW1lbnQifSwKK3tFUlJfUkVBU09OKEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UKSwiaW52YWxpZCBjb21wcmVzc2VkIHBvaW50In0sCit7RVJSX1JFQVNPTihFQ19SX0lOVkFMSURfQ09NUFJFU1NJT05fQklUKSwiaW52YWxpZCBjb21wcmVzc2lvbiBiaXQifSwKK3tFUlJfUkVBU09OKEVDX1JfSU5WQUxJRF9DVVJWRSkgICAgICAgICAgLCJpbnZhbGlkIGN1cnZlIn0sCit7RVJSX1JFQVNPTihFQ19SX0lOVkFMSURfRElHRVNUX1RZUEUpICAgICwiaW52YWxpZCBkaWdlc3QgdHlwZSJ9LAore0VSUl9SRUFTT04oRUNfUl9JTlZBTElEX0VOQ09ESU5HKSAgICAgICAsImludmFsaWQgZW5jb2RpbmcifSwKK3tFUlJfUkVBU09OKEVDX1JfSU5WQUxJRF9GSUVMRCkgICAgICAgICAgLCJpbnZhbGlkIGZpZWxkIn0sCit7RVJSX1JFQVNPTihFQ19SX0lOVkFMSURfRk9STSkgICAgICAgICAgICwiaW52YWxpZCBmb3JtIn0sCit7RVJSX1JFQVNPTihFQ19SX0lOVkFMSURfR1JPVVBfT1JERVIpICAgICwiaW52YWxpZCBncm91cCBvcmRlciJ9LAore0VSUl9SRUFTT04oRUNfUl9JTlZBTElEX1BFTlRBTk9NSUFMX0JBU0lTKSwiaW52YWxpZCBwZW50YW5vbWlhbCBiYXNpcyJ9LAore0VSUl9SRUFTT04oRUNfUl9JTlZBTElEX1BSSVZBVEVfS0VZKSAgICAsImludmFsaWQgcHJpdmF0ZSBrZXkifSwKK3tFUlJfUkVBU09OKEVDX1JfSU5WQUxJRF9UUklOT01JQUxfQkFTSVMpLCJpbnZhbGlkIHRyaW5vbWlhbCBiYXNpcyJ9LAore0VSUl9SRUFTT04oRUNfUl9LRVlTX05PVF9TRVQpICAgICAgICAgICAsImtleXMgbm90IHNldCJ9LAore0VSUl9SRUFTT04oRUNfUl9NSVNTSU5HX1BBUkFNRVRFUlMpICAgICAsIm1pc3NpbmcgcGFyYW1ldGVycyJ9LAore0VSUl9SRUFTT04oRUNfUl9NSVNTSU5HX1BSSVZBVEVfS0VZKSAgICAsIm1pc3NpbmcgcHJpdmF0ZSBrZXkifSwKK3tFUlJfUkVBU09OKEVDX1JfTk9UX0FfTklTVF9QUklNRSkgICAgICAgLCJub3QgYSBOSVNUIHByaW1lIn0sCit7RVJSX1JFQVNPTihFQ19SX05PVF9BX1NVUFBPUlRFRF9OSVNUX1BSSU1FKSwibm90IGEgc3VwcG9ydGVkIE5JU1QgcHJpbWUifSwKK3tFUlJfUkVBU09OKEVDX1JfTk9UX0lNUExFTUVOVEVEKSAgICAgICAgLCJub3QgaW1wbGVtZW50ZWQifSwKK3tFUlJfUkVBU09OKEVDX1JfTk9UX0lOSVRJQUxJWkVEKSAgICAgICAgLCJub3QgaW5pdGlhbGl6ZWQifSwKK3tFUlJfUkVBU09OKEVDX1JfTk9fRklFTERfTU9EKSAgICAgICAgICAgLCJubyBmaWVsZCBtb2QifSwKK3tFUlJfUkVBU09OKEVDX1JfTk9fUEFSQU1FVEVSU19TRVQpICAgICAgLCJubyBwYXJhbWV0ZXJzIHNldCJ9LAore0VSUl9SRUFTT04oRUNfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpICAsInBhc3NlZCBudWxsIHBhcmFtZXRlciJ9LAore0VSUl9SRUFTT04oRUNfUl9QS1BBUkFNRVRFUlMyR1JPVVBfRkFJTFVSRSksInBrcGFyYW1ldGVyczJncm91cCBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihFQ19SX1BPSU5UX0FUX0lORklOSVRZKSAgICAgICwicG9pbnQgYXQgaW5maW5pdHkifSwKK3tFUlJfUkVBU09OKEVDX1JfUE9JTlRfSVNfTk9UX09OX0NVUlZFKSAgLCJwb2ludCBpcyBub3Qgb24gY3VydmUifSwKK3tFUlJfUkVBU09OKEVDX1JfU0xPVF9GVUxMKSAgICAgICAgICAgICAgLCJzbG90IGZ1bGwifSwKK3tFUlJfUkVBU09OKEVDX1JfVU5ERUZJTkVEX0dFTkVSQVRPUikgICAgLCJ1bmRlZmluZWQgZ2VuZXJhdG9yIn0sCit7RVJSX1JFQVNPTihFQ19SX1VOREVGSU5FRF9PUkRFUikgICAgICAgICwidW5kZWZpbmVkIG9yZGVyIn0sCit7RVJSX1JFQVNPTihFQ19SX1VOS05PV05fR1JPVVApICAgICAgICAgICwidW5rbm93biBncm91cCJ9LAore0VSUl9SRUFTT04oRUNfUl9VTktOT1dOX09SREVSKSAgICAgICAgICAsInVua25vd24gb3JkZXIifSwKK3tFUlJfUkVBU09OKEVDX1JfVU5TVVBQT1JURURfRklFTEQpICAgICAgLCJ1bnN1cHBvcnRlZCBmaWVsZCJ9LAore0VSUl9SRUFTT04oRUNfUl9XUk9OR19PUkRFUikgICAgICAgICAgICAsIndyb25nIG9yZGVyIn0sCit7MCxOVUxMfQorCX07CisKKyNlbmRpZgorCit2b2lkIEVSUl9sb2FkX0VDX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKEVDX3N0cl9mdW5jdHNbMF0uZXJyb3IpID09IE5VTEwpCisJCXsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLEVDX3N0cl9mdW5jdHMpOworCQlFUlJfbG9hZF9zdHJpbmdzKDAsRUNfc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfa2V5LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmYjBlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19rZXkuYwpAQCAtMCwwICsxLDQ1NyBAQAorLyogY3J5cHRvL2VjL2VjX2tleS5jICovCisvKgorICogV3JpdHRlbiBieSBOaWxzIExhcnNjaCBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogUG9ydGlvbnMgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIAorICogY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZWNfbGNsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworRUNfS0VZICpFQ19LRVlfbmV3KHZvaWQpCisJeworCUVDX0tFWSAqcmV0OworCisJcmV0PShFQ19LRVkgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfS0VZKSk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfS0VZX05FVywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKworCXJldC0+dmVyc2lvbiA9IDE7CQorCXJldC0+Z3JvdXAgICA9IE5VTEw7CisJcmV0LT5wdWJfa2V5ID0gTlVMTDsKKwlyZXQtPnByaXZfa2V5PSBOVUxMOworCXJldC0+ZW5jX2ZsYWc9IDA7IAorCXJldC0+Y29udl9mb3JtID0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQ7CisJcmV0LT5yZWZlcmVuY2VzPSAxOworCXJldC0+bWV0aG9kX2RhdGEgPSBOVUxMOworCXJldHVybihyZXQpOworCX0KKworRUNfS0VZICpFQ19LRVlfbmV3X2J5X2N1cnZlX25hbWUoaW50IG5pZCkKKwl7CisJRUNfS0VZICpyZXQgPSBFQ19LRVlfbmV3KCk7CisJaWYgKHJldCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXQtPmdyb3VwID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUobmlkKTsKKwlpZiAocmV0LT5ncm91cCA9PSBOVUxMKQorCQl7CisJCUVDX0tFWV9mcmVlKHJldCk7CisJCXJldHVybiBOVUxMOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKK3ZvaWQgRUNfS0VZX2ZyZWUoRUNfS0VZICpyKQorCXsKKwlpbnQgaTsKKworCWlmIChyID09IE5VTEwpIHJldHVybjsKKworCWk9Q1JZUFRPX2FkZCgmci0+cmVmZXJlbmNlcywtMSxDUllQVE9fTE9DS19FQyk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJFQ19LRVkiLHIpOworI2VuZGlmCisJaWYgKGkgPiAwKSByZXR1cm47CisjaWZkZWYgUkVGX0NIRUNLCisJaWYgKGkgPCAwKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCJFQ19LRVlfZnJlZSwgYmFkIHJlZmVyZW5jZSBjb3VudFxuIik7CisJCWFib3J0KCk7CisJCX0KKyNlbmRpZgorCisJaWYgKHItPmdyb3VwICAgICE9IE5VTEwpIAorCQlFQ19HUk9VUF9mcmVlKHItPmdyb3VwKTsKKwlpZiAoci0+cHViX2tleSAgIT0gTlVMTCkKKwkJRUNfUE9JTlRfZnJlZShyLT5wdWJfa2V5KTsKKwlpZiAoci0+cHJpdl9rZXkgIT0gTlVMTCkKKwkJQk5fY2xlYXJfZnJlZShyLT5wcml2X2tleSk7CisKKwlFQ19FWF9EQVRBX2ZyZWVfYWxsX2RhdGEoJnItPm1ldGhvZF9kYXRhKTsKKworCU9QRU5TU0xfY2xlYW5zZSgodm9pZCAqKXIsIHNpemVvZihFQ19LRVkpKTsKKworCU9QRU5TU0xfZnJlZShyKTsKKwl9CisKK0VDX0tFWSAqRUNfS0VZX2NvcHkoRUNfS0VZICpkZXN0LCBjb25zdCBFQ19LRVkgKnNyYykKKwl7CisJRUNfRVhUUkFfREFUQSAqZDsKKworCWlmIChkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19LRVlfQ09QWSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwkvKiBjb3B5IHRoZSBwYXJhbWV0ZXJzICovCisJaWYgKHNyYy0+Z3JvdXApCisJCXsKKwkJY29uc3QgRUNfTUVUSE9EICptZXRoID0gRUNfR1JPVVBfbWV0aG9kX29mKHNyYy0+Z3JvdXApOworCQkvKiBjbGVhciB0aGUgb2xkIGdyb3VwICovCisJCWlmIChkZXN0LT5ncm91cCkKKwkJCUVDX0dST1VQX2ZyZWUoZGVzdC0+Z3JvdXApOworCQlkZXN0LT5ncm91cCA9IEVDX0dST1VQX25ldyhtZXRoKTsKKwkJaWYgKGRlc3QtPmdyb3VwID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKCFFQ19HUk9VUF9jb3B5KGRlc3QtPmdyb3VwLCBzcmMtPmdyb3VwKSkKKwkJCXJldHVybiBOVUxMOworCQl9CisJLyogIGNvcHkgdGhlIHB1YmxpYyBrZXkgKi8KKwlpZiAoc3JjLT5wdWJfa2V5ICYmIHNyYy0+Z3JvdXApCisJCXsKKwkJaWYgKGRlc3QtPnB1Yl9rZXkpCisJCQlFQ19QT0lOVF9mcmVlKGRlc3QtPnB1Yl9rZXkpOworCQlkZXN0LT5wdWJfa2V5ID0gRUNfUE9JTlRfbmV3KHNyYy0+Z3JvdXApOworCQlpZiAoZGVzdC0+cHViX2tleSA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghRUNfUE9JTlRfY29weShkZXN0LT5wdWJfa2V5LCBzcmMtPnB1Yl9rZXkpKQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkvKiBjb3B5IHRoZSBwcml2YXRlIGtleSAqLworCWlmIChzcmMtPnByaXZfa2V5KQorCQl7CisJCWlmIChkZXN0LT5wcml2X2tleSA9PSBOVUxMKQorCQkJeworCQkJZGVzdC0+cHJpdl9rZXkgPSBCTl9uZXcoKTsKKwkJCWlmIChkZXN0LT5wcml2X2tleSA9PSBOVUxMKQorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQlpZiAoIUJOX2NvcHkoZGVzdC0+cHJpdl9rZXksIHNyYy0+cHJpdl9rZXkpKQorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkvKiBjb3B5IG1ldGhvZC9leHRyYSBkYXRhICovCisJRUNfRVhfREFUQV9mcmVlX2FsbF9kYXRhKCZkZXN0LT5tZXRob2RfZGF0YSk7CisKKwlmb3IgKGQgPSBzcmMtPm1ldGhvZF9kYXRhOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQorCQl7CisJCXZvaWQgKnQgPSBkLT5kdXBfZnVuYyhkLT5kYXRhKTsKKwkJCisJCWlmICh0ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFFQ19FWF9EQVRBX3NldF9kYXRhKCZkZXN0LT5tZXRob2RfZGF0YSwgdCwgZC0+ZHVwX2Z1bmMsIGQtPmZyZWVfZnVuYywgZC0+Y2xlYXJfZnJlZV9mdW5jKSkKKwkJCXJldHVybiAwOworCQl9CisKKwkvKiBjb3B5IHRoZSByZXN0ICovCisJZGVzdC0+ZW5jX2ZsYWcgID0gc3JjLT5lbmNfZmxhZzsKKwlkZXN0LT5jb252X2Zvcm0gPSBzcmMtPmNvbnZfZm9ybTsKKwlkZXN0LT52ZXJzaW9uICAgPSBzcmMtPnZlcnNpb247CisKKwlyZXR1cm4gZGVzdDsKKwl9CisKK0VDX0tFWSAqRUNfS0VZX2R1cChjb25zdCBFQ19LRVkgKmVjX2tleSkKKwl7CisJRUNfS0VZICpyZXQgPSBFQ19LRVlfbmV3KCk7CisJaWYgKHJldCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoRUNfS0VZX2NvcHkocmV0LCBlY19rZXkpID09IE5VTEwpCisJCXsKKwkJRUNfS0VZX2ZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworaW50IEVDX0tFWV91cF9yZWYoRUNfS0VZICpyKQorCXsKKwlpbnQgaSA9IENSWVBUT19hZGQoJnItPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX0VDKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIkVDX0tFWSIscik7CisjZW5kaWYKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDIpCisJCXsKKwkJZnByaW50ZihzdGRlcnIsICJFQ19LRVlfdXAsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQlhYm9ydCgpOworCQl9CisjZW5kaWYKKwlyZXR1cm4gKChpID4gMSkgPyAxIDogMCk7CisJfQorCitpbnQgRUNfS0VZX2dlbmVyYXRlX2tleShFQ19LRVkgKmVja2V5KQorCXsJCisJaW50CW9rID0gMDsKKwlCTl9DVFgJKmN0eCA9IE5VTEw7CisJQklHTlVNCSpwcml2X2tleSA9IE5VTEwsICpvcmRlciA9IE5VTEw7CisJRUNfUE9JTlQgKnB1Yl9rZXkgPSBOVUxMOworCisJaWYgKCFlY2tleSB8fCAhZWNrZXktPmdyb3VwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfS0VZX0dFTkVSQVRFX0tFWSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmICgob3JkZXIgPSBCTl9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKGVja2V5LT5wcml2X2tleSA9PSBOVUxMKQorCQl7CisJCXByaXZfa2V5ID0gQk5fbmV3KCk7CisJCWlmIChwcml2X2tleSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCXByaXZfa2V5ID0gZWNrZXktPnByaXZfa2V5OworCisJaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZWNrZXktPmdyb3VwLCBvcmRlciwgY3R4KSkKKwkJZ290byBlcnI7CisKKwlkbworCQlpZiAoIUJOX3JhbmRfcmFuZ2UocHJpdl9rZXksIG9yZGVyKSkKKwkJCWdvdG8gZXJyOworCXdoaWxlIChCTl9pc196ZXJvKHByaXZfa2V5KSk7CisKKwlpZiAoZWNrZXktPnB1Yl9rZXkgPT0gTlVMTCkKKwkJeworCQlwdWJfa2V5ID0gRUNfUE9JTlRfbmV3KGVja2V5LT5ncm91cCk7CisJCWlmIChwdWJfa2V5ID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJcHViX2tleSA9IGVja2V5LT5wdWJfa2V5OworCisJaWYgKCFFQ19QT0lOVF9tdWwoZWNrZXktPmdyb3VwLCBwdWJfa2V5LCBwcml2X2tleSwgTlVMTCwgTlVMTCwgY3R4KSkKKwkJZ290byBlcnI7CisKKwllY2tleS0+cHJpdl9rZXkgPSBwcml2X2tleTsKKwllY2tleS0+cHViX2tleSAgPSBwdWJfa2V5OworCisJb2s9MTsKKworZXJyOgkKKwlpZiAob3JkZXIpCisJCUJOX2ZyZWUob3JkZXIpOworCWlmIChwdWJfa2V5ICAhPSBOVUxMICYmIGVja2V5LT5wdWJfa2V5ICA9PSBOVUxMKQorCQlFQ19QT0lOVF9mcmVlKHB1Yl9rZXkpOworCWlmIChwcml2X2tleSAhPSBOVUxMICYmIGVja2V5LT5wcml2X2tleSA9PSBOVUxMKQorCQlCTl9mcmVlKHByaXZfa2V5KTsKKwlpZiAoY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKGN0eCk7CisJcmV0dXJuKG9rKTsKKwl9CisKK2ludCBFQ19LRVlfY2hlY2tfa2V5KGNvbnN0IEVDX0tFWSAqZWNrZXkpCisJeworCWludAlvayAgID0gMDsKKwlCTl9DVFgJKmN0eCA9IE5VTEw7CisJY29uc3QgQklHTlVNCSpvcmRlciAgPSBOVUxMOworCUVDX1BPSU5UICpwb2ludCA9IE5VTEw7CisKKwlpZiAoIWVja2V5IHx8ICFlY2tleS0+Z3JvdXAgfHwgIWVja2V5LT5wdWJfa2V5KQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfS0VZX0NIRUNLX0tFWSwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkKKwlpZiAoKGN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJaWYgKChwb2ludCA9IEVDX1BPSU5UX25ldyhlY2tleS0+Z3JvdXApKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCS8qIHRlc3Rpbmcgd2hldGhlciB0aGUgcHViX2tleSBpcyBvbiB0aGUgZWxsaXB0aWMgY3VydmUgKi8KKwlpZiAoIUVDX1BPSU5UX2lzX29uX2N1cnZlKGVja2V5LT5ncm91cCwgZWNrZXktPnB1Yl9rZXksIGN0eCkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19LRVlfQ0hFQ0tfS0VZLCBFQ19SX1BPSU5UX0lTX05PVF9PTl9DVVJWRSk7CisJCWdvdG8gZXJyOworCQl9CisJLyogdGVzdGluZyB3aGV0aGVyIHB1Yl9rZXkgKiBvcmRlciBpcyB0aGUgcG9pbnQgYXQgaW5maW5pdHkgKi8KKwlvcmRlciA9ICZlY2tleS0+Z3JvdXAtPm9yZGVyOworCWlmIChCTl9pc196ZXJvKG9yZGVyKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0tFWV9DSEVDS19LRVksIEVDX1JfSU5WQUxJRF9HUk9VUF9PUkRFUik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCFFQ19QT0lOVF9tdWwoZWNrZXktPmdyb3VwLCBwb2ludCwgTlVMTCwgZWNrZXktPnB1Yl9rZXksIG9yZGVyLCBjdHgpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfS0VZX0NIRUNLX0tFWSwgRVJSX1JfRUNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGVja2V5LT5ncm91cCwgcG9pbnQpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfS0VZX0NIRUNLX0tFWSwgRUNfUl9XUk9OR19PUkRFUik7CisJCWdvdG8gZXJyOworCQl9CisJLyogaW4gY2FzZSB0aGUgcHJpdl9rZXkgaXMgcHJlc2VudCA6IAorCSAqIGNoZWNrIGlmIGdlbmVyYXRvciAqIHByaXZfa2V5ID09IHB1Yl9rZXkgCisJICovCisJaWYgKGVja2V5LT5wcml2X2tleSkKKwkJeworCQlpZiAoQk5fY21wKGVja2V5LT5wcml2X2tleSwgb3JkZXIpID49IDApCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0tFWV9DSEVDS19LRVksIEVDX1JfV1JPTkdfT1JERVIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmICghRUNfUE9JTlRfbXVsKGVja2V5LT5ncm91cCwgcG9pbnQsIGVja2V5LT5wcml2X2tleSwKKwkJCU5VTEwsIE5VTEwsIGN0eCkpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0tFWV9DSEVDS19LRVksIEVSUl9SX0VDX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKEVDX1BPSU5UX2NtcChlY2tleS0+Z3JvdXAsIHBvaW50LCBlY2tleS0+cHViX2tleSwgCisJCQljdHgpICE9IDApCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0tFWV9DSEVDS19LRVksIEVDX1JfSU5WQUxJRF9QUklWQVRFX0tFWSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCW9rID0gMTsKK2VycjoKKwlpZiAoY3R4ICAgIT0gTlVMTCkKKwkJQk5fQ1RYX2ZyZWUoY3R4KTsKKwlpZiAocG9pbnQgIT0gTlVMTCkKKwkJRUNfUE9JTlRfZnJlZShwb2ludCk7CisJcmV0dXJuKG9rKTsKKwl9CisKK2NvbnN0IEVDX0dST1VQICpFQ19LRVlfZ2V0MF9ncm91cChjb25zdCBFQ19LRVkgKmtleSkKKwl7CisJcmV0dXJuIGtleS0+Z3JvdXA7CisJfQorCitpbnQgRUNfS0VZX3NldF9ncm91cChFQ19LRVkgKmtleSwgY29uc3QgRUNfR1JPVVAgKmdyb3VwKQorCXsKKwlpZiAoa2V5LT5ncm91cCAhPSBOVUxMKQorCQlFQ19HUk9VUF9mcmVlKGtleS0+Z3JvdXApOworCWtleS0+Z3JvdXAgPSBFQ19HUk9VUF9kdXAoZ3JvdXApOworCXJldHVybiAoa2V5LT5ncm91cCA9PSBOVUxMKSA/IDAgOiAxOworCX0KKworY29uc3QgQklHTlVNICpFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShjb25zdCBFQ19LRVkgKmtleSkKKwl7CisJcmV0dXJuIGtleS0+cHJpdl9rZXk7CisJfQorCitpbnQgRUNfS0VZX3NldF9wcml2YXRlX2tleShFQ19LRVkgKmtleSwgY29uc3QgQklHTlVNICpwcml2X2tleSkKKwl7CisJaWYgKGtleS0+cHJpdl9rZXkpCisJCUJOX2NsZWFyX2ZyZWUoa2V5LT5wcml2X2tleSk7CisJa2V5LT5wcml2X2tleSA9IEJOX2R1cChwcml2X2tleSk7CisJcmV0dXJuIChrZXktPnByaXZfa2V5ID09IE5VTEwpID8gMCA6IDE7CisJfQorCitjb25zdCBFQ19QT0lOVCAqRUNfS0VZX2dldDBfcHVibGljX2tleShjb25zdCBFQ19LRVkgKmtleSkKKwl7CisJcmV0dXJuIGtleS0+cHViX2tleTsKKwl9CisKK2ludCBFQ19LRVlfc2V0X3B1YmxpY19rZXkoRUNfS0VZICprZXksIGNvbnN0IEVDX1BPSU5UICpwdWJfa2V5KQorCXsKKwlpZiAoa2V5LT5wdWJfa2V5ICE9IE5VTEwpCisJCUVDX1BPSU5UX2ZyZWUoa2V5LT5wdWJfa2V5KTsKKwlrZXktPnB1Yl9rZXkgPSBFQ19QT0lOVF9kdXAocHViX2tleSwga2V5LT5ncm91cCk7CisJcmV0dXJuIChrZXktPnB1Yl9rZXkgPT0gTlVMTCkgPyAwIDogMTsKKwl9CisKK3Vuc2lnbmVkIGludCBFQ19LRVlfZ2V0X2VuY19mbGFncyhjb25zdCBFQ19LRVkgKmtleSkKKwl7CisJcmV0dXJuIGtleS0+ZW5jX2ZsYWc7CisJfQorCit2b2lkIEVDX0tFWV9zZXRfZW5jX2ZsYWdzKEVDX0tFWSAqa2V5LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCisJeworCWtleS0+ZW5jX2ZsYWcgPSBmbGFnczsKKwl9CisKK3BvaW50X2NvbnZlcnNpb25fZm9ybV90IEVDX0tFWV9nZXRfY29udl9mb3JtKGNvbnN0IEVDX0tFWSAqa2V5KQorCXsKKwlyZXR1cm4ga2V5LT5jb252X2Zvcm07CisJfQorCit2b2lkIEVDX0tFWV9zZXRfY29udl9mb3JtKEVDX0tFWSAqa2V5LCBwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBjZm9ybSkKKwl7CisJa2V5LT5jb252X2Zvcm0gPSBjZm9ybTsKKwlpZiAoa2V5LT5ncm91cCAhPSBOVUxMKQorCQlFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKGtleS0+Z3JvdXAsIGNmb3JtKTsKKwl9CisKK3ZvaWQgKkVDX0tFWV9nZXRfa2V5X21ldGhvZF9kYXRhKEVDX0tFWSAqa2V5LAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpCisJeworCXJldHVybiBFQ19FWF9EQVRBX2dldF9kYXRhKGtleS0+bWV0aG9kX2RhdGEsIGR1cF9mdW5jLCBmcmVlX2Z1bmMsIGNsZWFyX2ZyZWVfZnVuYyk7CisJfQorCit2b2lkIEVDX0tFWV9pbnNlcnRfa2V5X21ldGhvZF9kYXRhKEVDX0tFWSAqa2V5LCB2b2lkICpkYXRhLAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpCisJeworCUVDX0VYVFJBX0RBVEEgKmV4X2RhdGE7CisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FQyk7CisJZXhfZGF0YSA9IEVDX0VYX0RBVEFfZ2V0X2RhdGEoa2V5LT5tZXRob2RfZGF0YSwgZHVwX2Z1bmMsIGZyZWVfZnVuYywgY2xlYXJfZnJlZV9mdW5jKTsKKwlpZiAoZXhfZGF0YSA9PSBOVUxMKQorCQlFQ19FWF9EQVRBX3NldF9kYXRhKCZrZXktPm1ldGhvZF9kYXRhLCBkYXRhLCBkdXBfZnVuYywgZnJlZV9mdW5jLCBjbGVhcl9mcmVlX2Z1bmMpOworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FQyk7CisJfQorCit2b2lkIEVDX0tFWV9zZXRfYXNuMV9mbGFnKEVDX0tFWSAqa2V5LCBpbnQgZmxhZykKKwl7CisJaWYgKGtleS0+Z3JvdXAgIT0gTlVMTCkKKwkJRUNfR1JPVVBfc2V0X2FzbjFfZmxhZyhrZXktPmdyb3VwLCBmbGFnKTsKKwl9CisKK2ludCBFQ19LRVlfcHJlY29tcHV0ZV9tdWx0KEVDX0tFWSAqa2V5LCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGtleS0+Z3JvdXAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIEVDX0dST1VQX3ByZWNvbXB1dGVfbXVsdChrZXktPmdyb3VwLCBjdHgpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19sY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19sY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJjMzRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX2xjbC5oCkBAIC0wLDAgKzEsMzkzIEBACisvKiBjcnlwdG8vZWMvZWNfbGNsLmggKi8KKy8qCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQm9kbyBNb2VsbGVyIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBhcmUgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGFib3ZlLgorICoKKyAqIFRoZSBlbGxpcHRpYyBjdXJ2ZSBiaW5hcnkgcG9seW5vbWlhbCBzb2Z0d2FyZSBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgCisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9vYmpfbWFjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2lmIGRlZmluZWQoX19TVU5QUk9fQykKKyMgaWYgX19TVU5QUk9fQyA+PSAweDUyMAorIyBwcmFnbWEgZXJyb3JfbWVzc2FnZXMgKG9mZixFX0FSUkFZX09GX0lOQ09NUExFVEVfTk9OQU1FLEVfQVJSQVlfT0ZfSU5DT01QTEVURSkKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBTdHJ1Y3R1cmUgZGV0YWlscyBhcmUgbm90IHBhcnQgb2YgdGhlIGV4cG9ydGVkIGludGVyZmFjZSwKKyAqIHNvIGFsbCB0aGlzIG1heSBjaGFuZ2UgaW4gZnV0dXJlIHZlcnNpb25zLiAqLworCitzdHJ1Y3QgZWNfbWV0aG9kX3N0IHsKKwkvKiB1c2VkIGJ5IEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZTogKi8KKwlpbnQgZmllbGRfdHlwZTsgLyogYSBOSUQgKi8KKworCS8qIHVzZWQgYnkgRUNfR1JPVVBfbmV3LCBFQ19HUk9VUF9mcmVlLCBFQ19HUk9VUF9jbGVhcl9mcmVlLCBFQ19HUk9VUF9jb3B5OiAqLworCWludCAoKmdyb3VwX2luaXQpKEVDX0dST1VQICopOworCXZvaWQgKCpncm91cF9maW5pc2gpKEVDX0dST1VQICopOworCXZvaWQgKCpncm91cF9jbGVhcl9maW5pc2gpKEVDX0dST1VQICopOworCWludCAoKmdyb3VwX2NvcHkpKEVDX0dST1VQICosIGNvbnN0IEVDX0dST1VQICopOworCisJLyogdXNlZCBieSBFQ19HUk9VUF9zZXRfY3VydmVfR0ZwLCBFQ19HUk9VUF9nZXRfY3VydmVfR0ZwLCAqLworCS8qIEVDX0dST1VQX3NldF9jdXJ2ZV9HRjJtLCBhbmQgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm06ICovCisJaW50ICgqZ3JvdXBfc2V0X2N1cnZlKShFQ19HUk9VUCAqLCBjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKik7CisJaW50ICgqZ3JvdXBfZ2V0X2N1cnZlKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnAsIEJJR05VTSAqYSwgQklHTlVNICpiLCBCTl9DVFggKik7CisKKwkvKiB1c2VkIGJ5IEVDX0dST1VQX2dldF9kZWdyZWU6ICovCisJaW50ICgqZ3JvdXBfZ2V0X2RlZ3JlZSkoY29uc3QgRUNfR1JPVVAgKik7CisKKwkvKiB1c2VkIGJ5IEVDX0dST1VQX2NoZWNrOiAqLworCWludCAoKmdyb3VwX2NoZWNrX2Rpc2NyaW1pbmFudCkoY29uc3QgRUNfR1JPVVAgKiwgQk5fQ1RYICopOworCisJLyogdXNlZCBieSBFQ19QT0lOVF9uZXcsIEVDX1BPSU5UX2ZyZWUsIEVDX1BPSU5UX2NsZWFyX2ZyZWUsIEVDX1BPSU5UX2NvcHk6ICovCisJaW50ICgqcG9pbnRfaW5pdCkoRUNfUE9JTlQgKik7CisJdm9pZCAoKnBvaW50X2ZpbmlzaCkoRUNfUE9JTlQgKik7CisJdm9pZCAoKnBvaW50X2NsZWFyX2ZpbmlzaCkoRUNfUE9JTlQgKik7CisJaW50ICgqcG9pbnRfY29weSkoRUNfUE9JTlQgKiwgY29uc3QgRUNfUE9JTlQgKik7CisKKwkvKiB1c2VkIGJ5IEVDX1BPSU5UX3NldF90b19pbmZpbml0eSwKKwkgKiBFQ19QT0lOVF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwLAorCSAqIEVDX1BPSU5UX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAsCisJICogRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAsICAgICAuLi5fR0YybSwKKwkgKiBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCwgICAgIC4uLl9HRjJtLAorCSAqIEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcCwgLi4uX0dGMm06CisJICovCisJaW50ICgqcG9pbnRfc2V0X3RvX2luZmluaXR5KShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKKwlpbnQgKCpwb2ludF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLAorCQljb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwgY29uc3QgQklHTlVNICp6LCBCTl9DVFggKik7CisJaW50ICgqcG9pbnRfZ2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCkoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKiwKKwkJQklHTlVNICp4LCBCSUdOVU0gKnksIEJJR05VTSAqeiwgQk5fQ1RYICopOworCWludCAoKnBvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMpKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosCisJCWNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LCBCTl9DVFggKik7CisJaW50ICgqcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcykoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKiwKKwkJQklHTlVNICp4LCBCSUdOVU0gKnksIEJOX0NUWCAqKTsKKwlpbnQgKCpwb2ludF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcykoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKiwKKwkJY29uc3QgQklHTlVNICp4LCBpbnQgeV9iaXQsIEJOX0NUWCAqKTsKKworCS8qIHVzZWQgYnkgRUNfUE9JTlRfcG9pbnQyb2N0LCBFQ19QT0lOVF9vY3QycG9pbnQ6ICovCisJc2l6ZV90ICgqcG9pbnQyb2N0KShjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqLCBwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtLAorCSAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKik7CisJaW50ICgqb2N0MnBvaW50KShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLAorCSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKik7CisKKwkvKiB1c2VkIGJ5IEVDX1BPSU5UX2FkZCwgRUNfUE9JTlRfZGJsLCBFQ1BfUE9JTlRfaW52ZXJ0OiAqLworCWludCAoKmFkZCkoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICopOworCWludCAoKmRibCkoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBCTl9DVFggKik7CisJaW50ICgqaW52ZXJ0KShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLCBCTl9DVFggKik7CisKKwkvKiB1c2VkIGJ5IEVDX1BPSU5UX2lzX2F0X2luZmluaXR5LCBFQ19QT0lOVF9pc19vbl9jdXJ2ZSwgRUNfUE9JTlRfY21wOiAqLworCWludCAoKmlzX2F0X2luZmluaXR5KShjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKKwlpbnQgKCppc19vbl9jdXJ2ZSkoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKiwgQk5fQ1RYICopOworCWludCAoKnBvaW50X2NtcCkoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKmEsIGNvbnN0IEVDX1BPSU5UICpiLCBCTl9DVFggKik7CisKKwkvKiB1c2VkIGJ5IEVDX1BPSU5UX21ha2VfYWZmaW5lLCBFQ19QT0lOVHNfbWFrZV9hZmZpbmU6ICovCisJaW50ICgqbWFrZV9hZmZpbmUpKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosIEJOX0NUWCAqKTsKKwlpbnQgKCpwb2ludHNfbWFrZV9hZmZpbmUpKGNvbnN0IEVDX0dST1VQICosIHNpemVfdCBudW0sIEVDX1BPSU5UICpbXSwgQk5fQ1RYICopOworCisJLyogdXNlZCBieSBFQ19QT0lOVHNfbXVsLCBFQ19QT0lOVF9tdWwsIEVDX1BPSU5UX3ByZWNvbXB1dGVfbXVsdCwgRUNfUE9JTlRfaGF2ZV9wcmVjb21wdXRlX211bHQKKwkgKiAoZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgYXJlIHVzZWQgaWYgdGhlICdtdWwnIHBvaW50ZXIgaXMgMCk6ICovCisJaW50ICgqbXVsKShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKnNjYWxhciwKKwkJc2l6ZV90IG51bSwgY29uc3QgRUNfUE9JTlQgKnBvaW50c1tdLCBjb25zdCBCSUdOVU0gKnNjYWxhcnNbXSwgQk5fQ1RYICopOworCWludCAoKnByZWNvbXB1dGVfbXVsdCkoRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKik7CisJaW50ICgqaGF2ZV9wcmVjb21wdXRlX211bHQpKGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKworCS8qIGludGVybmFsIGZ1bmN0aW9ucyAqLworCisJLyogJ2ZpZWxkX211bCcsICdmaWVsZF9zcXInLCBhbmQgJ2ZpZWxkX2RpdicgY2FuIGJlIHVzZWQgYnkgJ2FkZCcgYW5kICdkYmwnIHNvIHRoYXQKKwkgKiB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbnMgb2YgcG9pbnQgb3BlcmF0aW9ucyBjYW4gYmUgdXNlZCB3aXRoIGRpZmZlcmVudAorCSAqIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMgb2YgZXhwZW5zaXZlIGZpZWxkIG9wZXJhdGlvbnM6ICovCisJaW50ICgqZmllbGRfbXVsKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKik7CisJaW50ICgqZmllbGRfc3FyKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICopOworCWludCAoKmZpZWxkX2RpdikoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICopOworCisJaW50ICgqZmllbGRfZW5jb2RlKShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICopOyAvKiBlLmcuIHRvIE1vbnRnb21lcnkgKi8KKwlpbnQgKCpmaWVsZF9kZWNvZGUpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBCTl9DVFggKik7IC8qIGUuZy4gZnJvbSBNb250Z29tZXJ5ICovCisJaW50ICgqZmllbGRfc2V0X3RvX29uZSkoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpyLCBCTl9DVFggKik7Cit9IC8qIEVDX01FVEhPRCAqLzsKKwordHlwZWRlZiBzdHJ1Y3QgZWNfZXh0cmFfZGF0YV9zdCB7CisJc3RydWN0IGVjX2V4dHJhX2RhdGFfc3QgKm5leHQ7CisJdm9pZCAqZGF0YTsKKwl2b2lkICooKmR1cF9mdW5jKSh2b2lkICopOworCXZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKik7CisJdm9pZCAoKmNsZWFyX2ZyZWVfZnVuYykodm9pZCAqKTsKK30gRUNfRVhUUkFfREFUQTsgLyogdXNlZCBpbiBFQ19HUk9VUCAqLworCitzdHJ1Y3QgZWNfZ3JvdXBfc3QgeworCWNvbnN0IEVDX01FVEhPRCAqbWV0aDsKKworCUVDX1BPSU5UICpnZW5lcmF0b3I7IC8qIG9wdGlvbmFsICovCisJQklHTlVNIG9yZGVyLCBjb2ZhY3RvcjsKKworCWludCBjdXJ2ZV9uYW1lOy8qIG9wdGlvbmFsIE5JRCBmb3IgbmFtZWQgY3VydmUgKi8KKwlpbnQgYXNuMV9mbGFnOyAvKiBmbGFnIHRvIGNvbnRyb2wgdGhlIGFzbjEgZW5jb2RpbmcgKi8KKwlwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBhc24xX2Zvcm07CisKKwl1bnNpZ25lZCBjaGFyICpzZWVkOyAvKiBvcHRpb25hbCBzZWVkIGZvciBwYXJhbWV0ZXJzIChhcHBlYXJzIGluIEFTTjEpICovCisJc2l6ZV90IHNlZWRfbGVuOworCisJRUNfRVhUUkFfREFUQSAqZXh0cmFfZGF0YTsgLyogbGlua2VkIGxpc3QgKi8KKworCS8qIFRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGZ1bmN0aW9ucywKKwkgKiBldmVuIGlmIHRoZXkgYXBwZWFyIGdlbmVyaWMgKi8KKwkKKwlCSUdOVU0gZmllbGQ7IC8qIEZpZWxkIHNwZWNpZmljYXRpb24uCisJICAgICAgICAgICAgICAgKiBGb3IgY3VydmVzIG92ZXIgR0YocCksIHRoaXMgaXMgdGhlIG1vZHVsdXM7CisJICAgICAgICAgICAgICAgKiBmb3IgY3VydmVzIG92ZXIgR0YoMl5tKSwgdGhpcyBpcyB0aGUgCisJICAgICAgICAgICAgICAgKiBpcnJlZHVjaWJsZSBwb2x5bm9taWFsIGRlZmluaW5nIHRoZSBmaWVsZC4KKwkgICAgICAgICAgICAgICAqLworCisJaW50IHBvbHlbNl07IC8qIEZpZWxkIHNwZWNpZmljYXRpb24gZm9yIGN1cnZlcyBvdmVyIEdGKDJebSkuCisJICAgICAgICAgICAgICAqIFRoZSBpcnJlZHVjaWJsZSBmKHQpIGlzIHRoZW4gb2YgdGhlIGZvcm06CisJICAgICAgICAgICAgICAqICAgICB0XnBvbHlbMF0gKyB0XnBvbHlbMV0gKyAuLi4gKyB0XnBvbHlba10KKwkgICAgICAgICAgICAgICogd2hlcmUgbSA9IHBvbHlbMF0gPiBwb2x5WzFdID4gLi4uID4gcG9seVtrXSA9IDAuCisJICAgICAgICAgICAgICAqIFRoZSBhcnJheSBpcyB0ZXJtaW5hdGVkIHdpdGggcG9seVtrKzFdPS0xLgorCSAgICAgICAgICAgICAgKiBBbGwgZWxsaXB0aWMgY3VydmUgaXJyZWR1Y2libGVzIGhhdmUgYXQgbW9zdCA1CisJICAgICAgICAgICAgICAqIG5vbi16ZXJvIHRlcm1zLgorCSAgICAgICAgICAgICAgKi8KKworCUJJR05VTSBhLCBiOyAvKiBDdXJ2ZSBjb2VmZmljaWVudHMuCisJICAgICAgICAgICAgICAqIChIZXJlIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgQklHTlVNcyBjYW4gYmUgdXNlZAorCSAgICAgICAgICAgICAgKiBvciBhYnVzZWQgZm9yIGFsbCBraW5kcyBvZiBmaWVsZHMsIG5vdCBqdXN0IEdGKHApLikKKwkgICAgICAgICAgICAgICogRm9yIGNoYXJhY3RlcmlzdGljICA+IDMsICB0aGUgY3VydmUgaXMgZGVmaW5lZAorCSAgICAgICAgICAgICAgKiBieSBhIFdlaWVyc3RyYXNzIGVxdWF0aW9uIG9mIHRoZSBmb3JtCisJICAgICAgICAgICAgICAqICAgICB5XjIgPSB4XjMgKyBhKnggKyBiLgorCSAgICAgICAgICAgICAgKiBGb3IgY2hhcmFjdGVyaXN0aWMgIDIsICB0aGUgY3VydmUgaXMgZGVmaW5lZCBieQorCSAgICAgICAgICAgICAgKiBhbiBlcXVhdGlvbiBvZiB0aGUgZm9ybQorCSAgICAgICAgICAgICAgKiAgICAgeV4yICsgeCp5ID0geF4zICsgYSp4XjIgKyBiLgorCSAgICAgICAgICAgICAgKi8KKworCWludCBhX2lzX21pbnVzMzsgLyogZW5hYmxlIG9wdGltaXplZCBwb2ludCBhcml0aG1ldGljcyBmb3Igc3BlY2lhbCBjYXNlICovCisKKwl2b2lkICpmaWVsZF9kYXRhMTsgLyogbWV0aG9kLXNwZWNpZmljIChlLmcuLCBNb250Z29tZXJ5IHN0cnVjdHVyZSkgKi8KKwl2b2lkICpmaWVsZF9kYXRhMjsgLyogbWV0aG9kLXNwZWNpZmljICovCisJaW50ICgqZmllbGRfbW9kX2Z1bmMpKEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgY29uc3QgQklHTlVNICosCUJOX0NUWCAqKTsgLyogbWV0aG9kLXNwZWNpZmljICovCit9IC8qIEVDX0dST1VQICovOworCitzdHJ1Y3QgZWNfa2V5X3N0IHsKKwlpbnQgdmVyc2lvbjsKKworCUVDX0dST1VQICpncm91cDsKKworCUVDX1BPSU5UICpwdWJfa2V5OworCUJJR05VTQkgKnByaXZfa2V5OworCisJdW5zaWduZWQgaW50IGVuY19mbGFnOworCXBvaW50X2NvbnZlcnNpb25fZm9ybV90IGNvbnZfZm9ybTsKKworCWludCAJcmVmZXJlbmNlczsKKworCUVDX0VYVFJBX0RBVEEgKm1ldGhvZF9kYXRhOworfSAvKiBFQ19LRVkgKi87CisKKy8qIEJhc2ljYWxseSBhICdtaXhpbicgZm9yIGV4dHJhIGRhdGEsIGJ1dCBhdmFpbGFibGUgZm9yIEVDX0dST1VQcy9FQ19LRVlzIG9ubHkKKyAqICh3aXRoIHZpc2liaWxpdHkgbGltaXRlZCB0byAncGFja2FnZScgbGV2ZWwgZm9yIG5vdykuCisgKiBXZSB1c2UgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIGluZGV4IGZvciByZXRyaWV2YWw7IHRoaXMgb2J2aWF0ZXMKKyAqIGdsb2JhbCBleF9kYXRhLXN0eWxlIGluZGV4IHRhYmxlcy4KKyAqLworaW50IEVDX0VYX0RBVEFfc2V0X2RhdGEoRUNfRVhUUkFfREFUQSAqKiwgdm9pZCAqZGF0YSwKKwl2b2lkICooKmR1cF9mdW5jKSh2b2lkICopLCB2b2lkICgqZnJlZV9mdW5jKSh2b2lkICopLCB2b2lkICgqY2xlYXJfZnJlZV9mdW5jKSh2b2lkICopKTsKK3ZvaWQgKkVDX0VYX0RBVEFfZ2V0X2RhdGEoY29uc3QgRUNfRVhUUkFfREFUQSAqLAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpOwordm9pZCBFQ19FWF9EQVRBX2ZyZWVfZGF0YShFQ19FWFRSQV9EQVRBICoqLAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpOwordm9pZCBFQ19FWF9EQVRBX2NsZWFyX2ZyZWVfZGF0YShFQ19FWFRSQV9EQVRBICoqLAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpOwordm9pZCBFQ19FWF9EQVRBX2ZyZWVfYWxsX2RhdGEoRUNfRVhUUkFfREFUQSAqKik7Cit2b2lkIEVDX0VYX0RBVEFfY2xlYXJfZnJlZV9hbGxfZGF0YShFQ19FWFRSQV9EQVRBICoqKTsKKworCisKK3N0cnVjdCBlY19wb2ludF9zdCB7CisJY29uc3QgRUNfTUVUSE9EICptZXRoOworCisJLyogQWxsIG1lbWJlcnMgZXhjZXB0ICdtZXRoJyBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGZ1bmN0aW9ucywKKwkgKiBldmVuIGlmIHRoZXkgYXBwZWFyIGdlbmVyaWMgKi8KKworCUJJR05VTSBYOworCUJJR05VTSBZOworCUJJR05VTSBaOyAvKiBKYWNvYmlhbiBwcm9qZWN0aXZlIGNvb3JkaW5hdGVzOgorCSAgICAgICAgICAgKiAoWCwgWSwgWikgIHJlcHJlc2VudHMgIChYL1peMiwgWS9aXjMpICBpZiAgWiAhPSAwICovCisJaW50IFpfaXNfb25lOyAvKiBlbmFibGUgb3B0aW1pemVkIHBvaW50IGFyaXRobWV0aWNzIGZvciBzcGVjaWFsIGNhc2UgKi8KK30gLyogRUNfUE9JTlQgKi87CisKKworCisvKiBtZXRob2QgZnVuY3Rpb25zIGluIGVjX211bHQuYworICogKGVjX2xpYi5jIHVzZXMgdGhlc2UgYXMgZGVmYXVsdHMgaWYgZ3JvdXAtPm1ldGhvZC0+bXVsIGlzIDApICovCitpbnQgZWNfd05BRl9tdWwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgQklHTlVNICpzY2FsYXIsCisJc2l6ZV90IG51bSwgY29uc3QgRUNfUE9JTlQgKnBvaW50c1tdLCBjb25zdCBCSUdOVU0gKnNjYWxhcnNbXSwgQk5fQ1RYICopOworaW50IGVjX3dOQUZfcHJlY29tcHV0ZV9tdWx0KEVDX0dST1VQICpncm91cCwgQk5fQ1RYICopOworaW50IGVjX3dOQUZfaGF2ZV9wcmVjb21wdXRlX211bHQoY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKworCisvKiBtZXRob2QgZnVuY3Rpb25zIGluIGVjcF9zbXBsLmMgKi8KK2ludCBlY19HRnBfc2ltcGxlX2dyb3VwX2luaXQoRUNfR1JPVVAgKik7Cit2b2lkIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZmluaXNoKEVDX0dST1VQICopOwordm9pZCBlY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaChFQ19HUk9VUCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX2dyb3VwX2NvcHkoRUNfR1JPVVAgKiwgY29uc3QgRUNfR1JPVVAgKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmUoRUNfR1JPVVAgKiwgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2N1cnZlKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqcCwgQklHTlVNICphLCBCSUdOVU0gKmIsIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX2dyb3VwX2dldF9kZWdyZWUoY29uc3QgRUNfR1JPVVAgKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQoY29uc3QgRUNfR1JPVVAgKiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfcG9pbnRfaW5pdChFQ19QT0lOVCAqKTsKK3ZvaWQgZWNfR0ZwX3NpbXBsZV9wb2ludF9maW5pc2goRUNfUE9JTlQgKik7Cit2b2lkIGVjX0dGcF9zaW1wbGVfcG9pbnRfY2xlYXJfZmluaXNoKEVDX1BPSU5UICopOworaW50IGVjX0dGcF9zaW1wbGVfcG9pbnRfY29weShFQ19QT0lOVCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKiwKKwljb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwgY29uc3QgQklHTlVNICp6LCBCTl9DVFggKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICosCisJQklHTlVNICp4LCBCSUdOVU0gKnksIEJJR05VTSAqeiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcyhjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLAorCWNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LCBCTl9DVFggKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICosCisJQklHTlVNICp4LCBCSUdOVU0gKnksIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosCisJY29uc3QgQklHTlVNICp4LCBpbnQgeV9iaXQsIEJOX0NUWCAqKTsKK3NpemVfdCBlY19HRnBfc2ltcGxlX3BvaW50Mm9jdChjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqLCBwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtLAorCXVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfb2N0MnBvaW50KGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosCisJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKik7CitpbnQgZWNfR0ZwX3NpbXBsZV9hZGQoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfZGJsKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfaW52ZXJ0KGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX2lzX2F0X2luZmluaXR5KGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICopOworaW50IGVjX0dGcF9zaW1wbGVfaXNfb25fY3VydmUoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfY21wKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lKGNvbnN0IEVDX0dST1VQICosIHNpemVfdCBudW0sIEVDX1BPSU5UICpbXSwgQk5fQ1RYICopOworaW50IGVjX0dGcF9zaW1wbGVfZmllbGRfbXVsKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfc2ltcGxlX2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICopOworCisKKy8qIG1ldGhvZCBmdW5jdGlvbnMgaW4gZWNwX21vbnQuYyAqLworaW50IGVjX0dGcF9tb250X2dyb3VwX2luaXQoRUNfR1JPVVAgKik7CitpbnQgZWNfR0ZwX21vbnRfZ3JvdXBfc2V0X2N1cnZlKEVDX0dST1VQICosIGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqKTsKK3ZvaWQgZWNfR0ZwX21vbnRfZ3JvdXBfZmluaXNoKEVDX0dST1VQICopOwordm9pZCBlY19HRnBfbW9udF9ncm91cF9jbGVhcl9maW5pc2goRUNfR1JPVVAgKik7CitpbnQgZWNfR0ZwX21vbnRfZ3JvdXBfY29weShFQ19HUk9VUCAqLCBjb25zdCBFQ19HUk9VUCAqKTsKK2ludCBlY19HRnBfbW9udF9maWVsZF9tdWwoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9tb250X2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICopOworaW50IGVjX0dGcF9tb250X2ZpZWxkX2VuY29kZShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICopOworaW50IGVjX0dGcF9tb250X2ZpZWxkX2RlY29kZShjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICopOworaW50IGVjX0dGcF9tb250X2ZpZWxkX3NldF90b19vbmUoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpyLCBCTl9DVFggKik7CisKKworLyogbWV0aG9kIGZ1bmN0aW9ucyBpbiBlY3BfbmlzdC5jICovCitpbnQgZWNfR0ZwX25pc3RfZ3JvdXBfY29weShFQ19HUk9VUCAqZGVzdCwgY29uc3QgRUNfR1JPVVAgKnNyYyk7CitpbnQgZWNfR0ZwX25pc3RfZ3JvdXBfc2V0X2N1cnZlKEVDX0dST1VQICosIGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqKTsKK2ludCBlY19HRnBfbmlzdF9maWVsZF9tdWwoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICopOworaW50IGVjX0dGcF9uaXN0X2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICopOworCisKKy8qIG1ldGhvZCBmdW5jdGlvbnMgaW4gZWMyX3NtcGwuYyAqLworaW50IGVjX0dGMm1fc2ltcGxlX2dyb3VwX2luaXQoRUNfR1JPVVAgKik7Cit2b2lkIGVjX0dGMm1fc2ltcGxlX2dyb3VwX2ZpbmlzaChFQ19HUk9VUCAqKTsKK3ZvaWQgZWNfR0YybV9zaW1wbGVfZ3JvdXBfY2xlYXJfZmluaXNoKEVDX0dST1VQICopOworaW50IGVjX0dGMm1fc2ltcGxlX2dyb3VwX2NvcHkoRUNfR1JPVVAgKiwgY29uc3QgRUNfR1JPVVAgKik7CitpbnQgZWNfR0YybV9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlKEVDX0dST1VQICosIGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9ncm91cF9nZXRfY3VydmUoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpwLCBCSUdOVU0gKmEsIEJJR05VTSAqYiwgQk5fQ1RYICopOworaW50IGVjX0dGMm1fc2ltcGxlX2dyb3VwX2dldF9kZWdyZWUoY29uc3QgRUNfR1JPVVAgKik7CitpbnQgZWNfR0YybV9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50KGNvbnN0IEVDX0dST1VQICosIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9wb2ludF9pbml0KEVDX1BPSU5UICopOwordm9pZCBlY19HRjJtX3NpbXBsZV9wb2ludF9maW5pc2goRUNfUE9JTlQgKik7Cit2b2lkIGVjX0dGMm1fc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaChFQ19QT0lOVCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9wb2ludF9jb3B5KEVDX1BPSU5UICosIGNvbnN0IEVDX1BPSU5UICopOworaW50IGVjX0dGMm1fc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosCisJY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICosCisJQklHTlVNICp4LCBCSUdOVU0gKnksIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcyhjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLAorCWNvbnN0IEJJR05VTSAqeCwgaW50IHlfYml0LCBCTl9DVFggKik7CitzaXplX3QgZWNfR0YybV9zaW1wbGVfcG9pbnQyb2N0KGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICosIHBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm0sCisJdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKik7CitpbnQgZWNfR0YybV9zaW1wbGVfb2N0MnBvaW50KGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosCisJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKik7CitpbnQgZWNfR0YybV9zaW1wbGVfYWRkKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfUE9JTlQgKmIsIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9kYmwoY29uc3QgRUNfR1JPVVAgKiwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBCTl9DVFggKik7CitpbnQgZWNfR0YybV9zaW1wbGVfaW52ZXJ0KGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9pc19hdF9pbmZpbml0eShjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9pc19vbl9jdXJ2ZShjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqLCBCTl9DVFggKik7CitpbnQgZWNfR0YybV9zaW1wbGVfY21wKGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICopOworaW50IGVjX0dGMm1fc2ltcGxlX21ha2VfYWZmaW5lKGNvbnN0IEVDX0dST1VQICosIEVDX1BPSU5UICosIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKiwgc2l6ZV90IG51bSwgRUNfUE9JTlQgKltdLCBCTl9DVFggKik7CitpbnQgZWNfR0YybV9zaW1wbGVfZmllbGRfbXVsKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9maWVsZF9zcXIoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIEJOX0NUWCAqKTsKK2ludCBlY19HRjJtX3NpbXBsZV9maWVsZF9kaXYoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICopOworCisKKy8qIG1ldGhvZCBmdW5jdGlvbnMgaW4gZWMyX211bHQuYyAqLworaW50IGVjX0dGMm1fc2ltcGxlX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKnNjYWxhciwKKwlzaXplX3QgbnVtLCBjb25zdCBFQ19QT0lOVCAqcG9pbnRzW10sIGNvbnN0IEJJR05VTSAqc2NhbGFyc1tdLCBCTl9DVFggKik7CitpbnQgZWNfR0YybV9wcmVjb21wdXRlX211bHQoRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKmN0eCk7CitpbnQgZWNfR0YybV9oYXZlX3ByZWNvbXB1dGVfbXVsdChjb25zdCBFQ19HUk9VUCAqZ3JvdXApOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX2xpYi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkN2RhMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfbGliLmMKQEAgLTAsMCArMSwxMTY0IEBACisvKiBjcnlwdG8vZWMvZWNfbGliLmMgKi8KKy8qCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQm9kbyBNb2VsbGVyIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBCaW5hcnkgcG9seW5vbWlhbCBFQ0Mgc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisKKyNpbmNsdWRlICJlY19sY2wuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgRUNfdmVyc2lvbltdID0gIkVDIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKKworLyogZnVuY3Rpb25zIGZvciBFQ19HUk9VUCBvYmplY3RzICovCisKK0VDX0dST1VQICpFQ19HUk9VUF9uZXcoY29uc3QgRUNfTUVUSE9EICptZXRoKQorCXsKKwlFQ19HUk9VUCAqcmV0OworCisJaWYgKG1ldGggPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX05FVywgRUNfUl9TTE9UX0ZVTEwpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmIChtZXRoLT5ncm91cF9pbml0ID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9ORVcsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YgKnJldCk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfTkVXLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXQtPm1ldGggPSBtZXRoOworCisJcmV0LT5leHRyYV9kYXRhID0gTlVMTDsKKworCXJldC0+Z2VuZXJhdG9yID0gTlVMTDsKKwlCTl9pbml0KCZyZXQtPm9yZGVyKTsKKwlCTl9pbml0KCZyZXQtPmNvZmFjdG9yKTsKKworCXJldC0+Y3VydmVfbmFtZSA9IDA7CQorCXJldC0+YXNuMV9mbGFnICA9IDA7CisJcmV0LT5hc24xX2Zvcm0gID0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQ7CisKKwlyZXQtPnNlZWQgPSBOVUxMOworCXJldC0+c2VlZF9sZW4gPSAwOworCisJaWYgKCFtZXRoLT5ncm91cF9pbml0KHJldCkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldHVybiBOVUxMOworCQl9CisJCisJcmV0dXJuIHJldDsKKwl9CisKKwordm9pZCBFQ19HUk9VUF9mcmVlKEVDX0dST1VQICpncm91cCkKKwl7CisJaWYgKCFncm91cCkgcmV0dXJuOworCisJaWYgKGdyb3VwLT5tZXRoLT5ncm91cF9maW5pc2ggIT0gMCkKKwkJZ3JvdXAtPm1ldGgtPmdyb3VwX2ZpbmlzaChncm91cCk7CisKKwlFQ19FWF9EQVRBX2ZyZWVfYWxsX2RhdGEoJmdyb3VwLT5leHRyYV9kYXRhKTsKKworCWlmIChncm91cC0+Z2VuZXJhdG9yICE9IE5VTEwpCisJCUVDX1BPSU5UX2ZyZWUoZ3JvdXAtPmdlbmVyYXRvcik7CisJQk5fZnJlZSgmZ3JvdXAtPm9yZGVyKTsKKwlCTl9mcmVlKCZncm91cC0+Y29mYWN0b3IpOworCisJaWYgKGdyb3VwLT5zZWVkKQorCQlPUEVOU1NMX2ZyZWUoZ3JvdXAtPnNlZWQpOworCisJT1BFTlNTTF9mcmVlKGdyb3VwKTsKKwl9CisgCisKK3ZvaWQgRUNfR1JPVVBfY2xlYXJfZnJlZShFQ19HUk9VUCAqZ3JvdXApCisJeworCWlmICghZ3JvdXApIHJldHVybjsKKworCWlmIChncm91cC0+bWV0aC0+Z3JvdXBfY2xlYXJfZmluaXNoICE9IDApCisJCWdyb3VwLT5tZXRoLT5ncm91cF9jbGVhcl9maW5pc2goZ3JvdXApOworCWVsc2UgaWYgKGdyb3VwLT5tZXRoLT5ncm91cF9maW5pc2ggIT0gMCkKKwkJZ3JvdXAtPm1ldGgtPmdyb3VwX2ZpbmlzaChncm91cCk7CisKKwlFQ19FWF9EQVRBX2NsZWFyX2ZyZWVfYWxsX2RhdGEoJmdyb3VwLT5leHRyYV9kYXRhKTsKKworCWlmIChncm91cC0+Z2VuZXJhdG9yICE9IE5VTEwpCisJCUVDX1BPSU5UX2NsZWFyX2ZyZWUoZ3JvdXAtPmdlbmVyYXRvcik7CisJQk5fY2xlYXJfZnJlZSgmZ3JvdXAtPm9yZGVyKTsKKwlCTl9jbGVhcl9mcmVlKCZncm91cC0+Y29mYWN0b3IpOworCisJaWYgKGdyb3VwLT5zZWVkKQorCQl7CisJCU9QRU5TU0xfY2xlYW5zZShncm91cC0+c2VlZCwgZ3JvdXAtPnNlZWRfbGVuKTsKKwkJT1BFTlNTTF9mcmVlKGdyb3VwLT5zZWVkKTsKKwkJfQorCisJT1BFTlNTTF9jbGVhbnNlKGdyb3VwLCBzaXplb2YgKmdyb3VwKTsKKwlPUEVOU1NMX2ZyZWUoZ3JvdXApOworCX0KKworCitpbnQgRUNfR1JPVVBfY29weShFQ19HUk9VUCAqZGVzdCwgY29uc3QgRUNfR1JPVVAgKnNyYykKKwl7CisJRUNfRVhUUkFfREFUQSAqZDsKKworCWlmIChkZXN0LT5tZXRoLT5ncm91cF9jb3B5ID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9DT1BZLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChkZXN0LT5tZXRoICE9IHNyYy0+bWV0aCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX0NPUFksIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChkZXN0ID09IHNyYykKKwkJcmV0dXJuIDE7CisJCisJRUNfRVhfREFUQV9mcmVlX2FsbF9kYXRhKCZkZXN0LT5leHRyYV9kYXRhKTsKKworCWZvciAoZCA9IHNyYy0+ZXh0cmFfZGF0YTsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKwkJeworCQl2b2lkICp0ID0gZC0+ZHVwX2Z1bmMoZC0+ZGF0YSk7CisJCQorCQlpZiAodCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWlmICghRUNfRVhfREFUQV9zZXRfZGF0YSgmZGVzdC0+ZXh0cmFfZGF0YSwgdCwgZC0+ZHVwX2Z1bmMsIGQtPmZyZWVfZnVuYywgZC0+Y2xlYXJfZnJlZV9mdW5jKSkKKwkJCXJldHVybiAwOworCQl9CisKKwlpZiAoc3JjLT5nZW5lcmF0b3IgIT0gTlVMTCkKKwkJeworCQlpZiAoZGVzdC0+Z2VuZXJhdG9yID09IE5VTEwpCisJCQl7CisJCQlkZXN0LT5nZW5lcmF0b3IgPSBFQ19QT0lOVF9uZXcoZGVzdCk7CisJCQlpZiAoZGVzdC0+Z2VuZXJhdG9yID09IE5VTEwpIHJldHVybiAwOworCQkJfQorCQlpZiAoIUVDX1BPSU5UX2NvcHkoZGVzdC0+Z2VuZXJhdG9yLCBzcmMtPmdlbmVyYXRvcikpIHJldHVybiAwOworCQl9CisJZWxzZQorCQl7CisJCS8qIHNyYy0+Z2VuZXJhdG9yID09IE5VTEwgKi8KKwkJaWYgKGRlc3QtPmdlbmVyYXRvciAhPSBOVUxMKQorCQkJeworCQkJRUNfUE9JTlRfY2xlYXJfZnJlZShkZXN0LT5nZW5lcmF0b3IpOworCQkJZGVzdC0+Z2VuZXJhdG9yID0gTlVMTDsKKwkJCX0KKwkJfQorCisJaWYgKCFCTl9jb3B5KCZkZXN0LT5vcmRlciwgJnNyYy0+b3JkZXIpKSByZXR1cm4gMDsKKwlpZiAoIUJOX2NvcHkoJmRlc3QtPmNvZmFjdG9yLCAmc3JjLT5jb2ZhY3RvcikpIHJldHVybiAwOworCisJZGVzdC0+Y3VydmVfbmFtZSA9IHNyYy0+Y3VydmVfbmFtZTsKKwlkZXN0LT5hc24xX2ZsYWcgID0gc3JjLT5hc24xX2ZsYWc7CisJZGVzdC0+YXNuMV9mb3JtICA9IHNyYy0+YXNuMV9mb3JtOworCisJaWYgKHNyYy0+c2VlZCkKKwkJeworCQlpZiAoZGVzdC0+c2VlZCkKKwkJCU9QRU5TU0xfZnJlZShkZXN0LT5zZWVkKTsKKwkJZGVzdC0+c2VlZCA9IE9QRU5TU0xfbWFsbG9jKHNyYy0+c2VlZF9sZW4pOworCQlpZiAoZGVzdC0+c2VlZCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCWlmICghbWVtY3B5KGRlc3QtPnNlZWQsIHNyYy0+c2VlZCwgc3JjLT5zZWVkX2xlbikpCisJCQlyZXR1cm4gMDsKKwkJZGVzdC0+c2VlZF9sZW4gPSBzcmMtPnNlZWRfbGVuOworCQl9CisJZWxzZQorCQl7CisJCWlmIChkZXN0LT5zZWVkKQorCQkJT1BFTlNTTF9mcmVlKGRlc3QtPnNlZWQpOworCQlkZXN0LT5zZWVkID0gTlVMTDsKKwkJZGVzdC0+c2VlZF9sZW4gPSAwOworCQl9CisJCisKKwlyZXR1cm4gZGVzdC0+bWV0aC0+Z3JvdXBfY29weShkZXN0LCBzcmMpOworCX0KKworCitFQ19HUk9VUCAqRUNfR1JPVVBfZHVwKGNvbnN0IEVDX0dST1VQICphKQorCXsKKwlFQ19HUk9VUCAqdCA9IE5VTEw7CisJaW50IG9rID0gMDsKKworCWlmIChhID09IE5VTEwpIHJldHVybiBOVUxMOworCisJaWYgKCh0ID0gRUNfR1JPVVBfbmV3KGEtPm1ldGgpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJaWYgKCFFQ19HUk9VUF9jb3B5KHQsIGEpKSBnb3RvIGVycjsKKworCW9rID0gMTsKKworICBlcnI6CQorCWlmICghb2spCisJCXsKKwkJaWYgKHQpIEVDX0dST1VQX2ZyZWUodCk7CisJCXJldHVybiBOVUxMOworCQl9CisJZWxzZSByZXR1cm4gdDsKKwl9CisKKworY29uc3QgRUNfTUVUSE9EICpFQ19HUk9VUF9tZXRob2Rfb2YoY29uc3QgRUNfR1JPVVAgKmdyb3VwKQorCXsKKwlyZXR1cm4gZ3JvdXAtPm1ldGg7CisJfQorCisKK2ludCBFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoY29uc3QgRUNfTUVUSE9EICptZXRoKQorICAgICAgICB7CisgICAgICAgIHJldHVybiBtZXRoLT5maWVsZF90eXBlOworICAgICAgICB9CisKKworaW50IEVDX0dST1VQX3NldF9nZW5lcmF0b3IoRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqZ2VuZXJhdG9yLCBjb25zdCBCSUdOVU0gKm9yZGVyLCBjb25zdCBCSUdOVU0gKmNvZmFjdG9yKQorCXsKKwlpZiAoZ2VuZXJhdG9yID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9TRVRfR0VORVJBVE9SLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMCAgIDsKKwkJfQorCisJaWYgKGdyb3VwLT5nZW5lcmF0b3IgPT0gTlVMTCkKKwkJeworCQlncm91cC0+Z2VuZXJhdG9yID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKwkJaWYgKGdyb3VwLT5nZW5lcmF0b3IgPT0gTlVMTCkgcmV0dXJuIDA7CisJCX0KKwlpZiAoIUVDX1BPSU5UX2NvcHkoZ3JvdXAtPmdlbmVyYXRvciwgZ2VuZXJhdG9yKSkgcmV0dXJuIDA7CisKKwlpZiAob3JkZXIgIT0gTlVMTCkKKwkJeyBpZiAoIUJOX2NvcHkoJmdyb3VwLT5vcmRlciwgb3JkZXIpKSByZXR1cm4gMDsgfQkKKwllbHNlCisJCUJOX3plcm8oJmdyb3VwLT5vcmRlcik7CisKKwlpZiAoY29mYWN0b3IgIT0gTlVMTCkKKwkJeyBpZiAoIUJOX2NvcHkoJmdyb3VwLT5jb2ZhY3RvciwgY29mYWN0b3IpKSByZXR1cm4gMDsgfQkKKwllbHNlCisJCUJOX3plcm8oJmdyb3VwLT5jb2ZhY3Rvcik7CisKKwlyZXR1cm4gMTsKKwl9CisKKworY29uc3QgRUNfUE9JTlQgKkVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGNvbnN0IEVDX0dST1VQICpncm91cCkKKwl7CisJcmV0dXJuIGdyb3VwLT5nZW5lcmF0b3I7CisJfQorCisKK2ludCBFQ19HUk9VUF9nZXRfb3JkZXIoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKm9yZGVyLCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKCFCTl9jb3B5KG9yZGVyLCAmZ3JvdXAtPm9yZGVyKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gIUJOX2lzX3plcm8ob3JkZXIpOworCX0KKworCitpbnQgRUNfR1JPVVBfZ2V0X2NvZmFjdG9yKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpjb2ZhY3RvciwgQk5fQ1RYICpjdHgpCisJeworCWlmICghQk5fY29weShjb2ZhY3RvciwgJmdyb3VwLT5jb2ZhY3RvcikpCisJCXJldHVybiAwOworCisJcmV0dXJuICFCTl9pc196ZXJvKCZncm91cC0+Y29mYWN0b3IpOworCX0KKworCit2b2lkIEVDX0dST1VQX3NldF9jdXJ2ZV9uYW1lKEVDX0dST1VQICpncm91cCwgaW50IG5pZCkKKwl7CisJZ3JvdXAtPmN1cnZlX25hbWUgPSBuaWQ7CisJfQorCisKK2ludCBFQ19HUk9VUF9nZXRfY3VydmVfbmFtZShjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCXJldHVybiBncm91cC0+Y3VydmVfbmFtZTsKKwl9CisKKwordm9pZCBFQ19HUk9VUF9zZXRfYXNuMV9mbGFnKEVDX0dST1VQICpncm91cCwgaW50IGZsYWcpCisJeworCWdyb3VwLT5hc24xX2ZsYWcgPSBmbGFnOworCX0KKworCitpbnQgRUNfR1JPVVBfZ2V0X2FzbjFfZmxhZyhjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCXJldHVybiBncm91cC0+YXNuMV9mbGFnOworCX0KKworCit2b2lkIEVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oRUNfR1JPVVAgKmdyb3VwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtKQorCXsKKwlncm91cC0+YXNuMV9mb3JtID0gZm9ybTsKKwl9CisKKworcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgRUNfR1JPVVBfZ2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCXJldHVybiBncm91cC0+YXNuMV9mb3JtOworCX0KKworCitzaXplX3QgRUNfR1JPVVBfc2V0X3NlZWQoRUNfR1JPVVAgKmdyb3VwLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBzaXplX3QgbGVuKQorCXsKKwlpZiAoZ3JvdXAtPnNlZWQpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGdyb3VwLT5zZWVkKTsKKwkJZ3JvdXAtPnNlZWQgPSBOVUxMOworCQlncm91cC0+c2VlZF9sZW4gPSAwOworCQl9CisKKwlpZiAoIWxlbiB8fCAhcCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKGdyb3VwLT5zZWVkID0gT1BFTlNTTF9tYWxsb2MobGVuKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGdyb3VwLT5zZWVkLCBwLCBsZW4pOworCWdyb3VwLT5zZWVkX2xlbiA9IGxlbjsKKworCXJldHVybiBsZW47CisJfQorCisKK3Vuc2lnbmVkIGNoYXIgKkVDX0dST1VQX2dldDBfc2VlZChjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCXJldHVybiBncm91cC0+c2VlZDsKKwl9CisKKworc2l6ZV90IEVDX0dST1VQX2dldF9zZWVkX2xlbihjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCXJldHVybiBncm91cC0+c2VlZF9sZW47CisJfQorCisKK2ludCBFQ19HUk9VUF9zZXRfY3VydmVfR0ZwKEVDX0dST1VQICpncm91cCwgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+Z3JvdXBfc2V0X2N1cnZlID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9TRVRfQ1VSVkVfR0ZQLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+Z3JvdXBfc2V0X2N1cnZlKGdyb3VwLCBwLCBhLCBiLCBjdHgpOworCX0KKworCitpbnQgRUNfR1JPVVBfZ2V0X2N1cnZlX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqcCwgQklHTlVNICphLCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPmdyb3VwX2dldF9jdXJ2ZSA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfR0VUX0NVUlZFX0dGUCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gZ3JvdXAtPm1ldGgtPmdyb3VwX2dldF9jdXJ2ZShncm91cCwgcCwgYSwgYiwgY3R4KTsKKwl9CisKKworaW50IEVDX0dST1VQX3NldF9jdXJ2ZV9HRjJtKEVDX0dST1VQICpncm91cCwgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+Z3JvdXBfc2V0X2N1cnZlID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9TRVRfQ1VSVkVfR0YyTSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gZ3JvdXAtPm1ldGgtPmdyb3VwX3NldF9jdXJ2ZShncm91cCwgcCwgYSwgYiwgY3R4KTsKKwl9CisKKworaW50IEVDX0dST1VQX2dldF9jdXJ2ZV9HRjJtKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpwLCBCSUdOVU0gKmEsIEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+Z3JvdXBfZ2V0X2N1cnZlID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HUk9VUF9HRVRfQ1VSVkVfR0YyTSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gZ3JvdXAtPm1ldGgtPmdyb3VwX2dldF9jdXJ2ZShncm91cCwgcCwgYSwgYiwgY3R4KTsKKwl9CisKKworaW50IEVDX0dST1VQX2dldF9kZWdyZWUoY29uc3QgRUNfR1JPVVAgKmdyb3VwKQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPmdyb3VwX2dldF9kZWdyZWUgPT0gMCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dST1VQX0dFVF9ERUdSRUUsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5ncm91cF9nZXRfZGVncmVlKGdyb3VwKTsKKwl9CisKKworaW50IEVDX0dST1VQX2NoZWNrX2Rpc2NyaW1pbmFudChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPmdyb3VwX2NoZWNrX2Rpc2NyaW1pbmFudCA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR1JPVVBfQ0hFQ0tfRElTQ1JJTUlOQU5ULCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+Z3JvdXBfY2hlY2tfZGlzY3JpbWluYW50KGdyb3VwLCBjdHgpOworCX0KKworCitpbnQgRUNfR1JPVVBfY21wKGNvbnN0IEVDX0dST1VQICphLCBjb25zdCBFQ19HUk9VUCAqYiwgQk5fQ1RYICpjdHgpCisJeworCWludCAgICByID0gMDsKKwlCSUdOVU0gKmExLCAqYTIsICphMywgKmIxLCAqYjIsICpiMzsKKwlCTl9DVFggKmN0eF9uZXcgPSBOVUxMOworCisJLyogY29tcGFyZSB0aGUgZmllbGQgdHlwZXMqLworCWlmIChFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoRUNfR1JPVVBfbWV0aG9kX29mKGEpKSAhPQorCSAgICBFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoRUNfR1JPVVBfbWV0aG9kX29mKGIpKSkKKwkJcmV0dXJuIDE7CisJLyogY29tcGFyZSB0aGUgY3VydmUgbmFtZSAoaWYgcHJlc2VudCkgKi8KKwlpZiAoRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoYSkgJiYgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoYikgJiYKKwkgICAgRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoYSkgPT0gRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoYikpCisJCXJldHVybiAwOworCisJaWYgKCFjdHgpCisJCWN0eF9uZXcgPSBjdHggPSBCTl9DVFhfbmV3KCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtMTsKKwkKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlhMSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlhMiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlhMyA9IEJOX0NUWF9nZXQoY3R4KTsKKwliMSA9IEJOX0NUWF9nZXQoY3R4KTsKKwliMiA9IEJOX0NUWF9nZXQoY3R4KTsKKwliMyA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoIWIzKQorCQl7CisJCUJOX0NUWF9lbmQoY3R4KTsKKwkJaWYgKGN0eF9uZXcpCisJCQlCTl9DVFhfZnJlZShjdHgpOworCQlyZXR1cm4gLTE7CisJCX0KKworCS8qIFhYWCBUaGlzIGFwcHJvYWNoIGFzc3VtZXMgdGhhdCB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24KKwkgKiBvZiBjdXJ2ZXMgb3ZlciB0aGUgc2FtZSBmaWVsZCB0eXBlIGlzIHRoZSBzYW1lLgorCSAqLworCWlmICghYS0+bWV0aC0+Z3JvdXBfZ2V0X2N1cnZlKGEsIGExLCBhMiwgYTMsIGN0eCkgfHwKKwkgICAgIWItPm1ldGgtPmdyb3VwX2dldF9jdXJ2ZShiLCBiMSwgYjIsIGIzLCBjdHgpKQorCQlyID0gMTsKKworCWlmIChyIHx8IEJOX2NtcChhMSwgYjEpIHx8IEJOX2NtcChhMiwgYjIpIHx8IEJOX2NtcChhMywgYjMpKQorCQlyID0gMTsKKworCS8qIFhYWCBFQ19QT0lOVF9jbXAoKSBhc3N1bWVzIHRoYXQgdGhlIG1ldGhvZHMgYXJlIGVxdWFsICovCisJaWYgKHIgfHwgRUNfUE9JTlRfY21wKGEsIEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGEpLAorCSAgICBFQ19HUk9VUF9nZXQwX2dlbmVyYXRvcihiKSwgY3R4KSkKKwkJciA9IDE7CisKKwlpZiAoIXIpCisJCXsKKwkJLyogY29tcGFyZSB0aGUgb3JkZXIgYW5kIGNvZmFjdG9yICovCisJCWlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGEsIGExLCBjdHgpIHx8CisJCSAgICAhRUNfR1JPVVBfZ2V0X29yZGVyKGIsIGIxLCBjdHgpIHx8CisJCSAgICAhRUNfR1JPVVBfZ2V0X2NvZmFjdG9yKGEsIGEyLCBjdHgpIHx8CisJCSAgICAhRUNfR1JPVVBfZ2V0X2NvZmFjdG9yKGIsIGIyLCBjdHgpKQorCQkJeworCQkJQk5fQ1RYX2VuZChjdHgpOworCQkJaWYgKGN0eF9uZXcpCisJCQkJQk5fQ1RYX2ZyZWUoY3R4KTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJaWYgKEJOX2NtcChhMSwgYjEpIHx8IEJOX2NtcChhMiwgYjIpKQorCQkJciA9IDE7CisJCX0KKworCUJOX0NUWF9lbmQoY3R4KTsKKwlpZiAoY3R4X25ldykKKwkJQk5fQ1RYX2ZyZWUoY3R4KTsKKworCXJldHVybiByOworCX0KKworCisvKiB0aGlzIGhhcyAncGFja2FnZScgdmlzaWJpbGl0eSAqLworaW50IEVDX0VYX0RBVEFfc2V0X2RhdGEoRUNfRVhUUkFfREFUQSAqKmV4X2RhdGEsIHZvaWQgKmRhdGEsCisJdm9pZCAqKCpkdXBfZnVuYykodm9pZCAqKSwgdm9pZCAoKmZyZWVfZnVuYykodm9pZCAqKSwgdm9pZCAoKmNsZWFyX2ZyZWVfZnVuYykodm9pZCAqKSkKKwl7CisJRUNfRVhUUkFfREFUQSAqZDsKKworCWlmIChleF9kYXRhID09IE5VTEwpCisJCXJldHVybiAwOworCisJZm9yIChkID0gKmV4X2RhdGE7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCisJCXsKKwkJaWYgKGQtPmR1cF9mdW5jID09IGR1cF9mdW5jICYmIGQtPmZyZWVfZnVuYyA9PSBmcmVlX2Z1bmMgJiYgZC0+Y2xlYXJfZnJlZV9mdW5jID09IGNsZWFyX2ZyZWVfZnVuYykKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfRVhfREFUQV9TRVRfREFUQSwgRUNfUl9TTE9UX0ZVTEwpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCWlmIChkYXRhID09IE5VTEwpCisJCS8qIG5vIGV4cGxpY2l0IGVudHJ5IG5lZWRlZCAqLworCQlyZXR1cm4gMTsKKworCWQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YgKmQpOworCWlmIChkID09IE5VTEwpCisJCXJldHVybiAwOworCisJZC0+ZGF0YSA9IGRhdGE7CisJZC0+ZHVwX2Z1bmMgPSBkdXBfZnVuYzsKKwlkLT5mcmVlX2Z1bmMgPSBmcmVlX2Z1bmM7CisJZC0+Y2xlYXJfZnJlZV9mdW5jID0gY2xlYXJfZnJlZV9mdW5jOworCisJZC0+bmV4dCA9ICpleF9kYXRhOworCSpleF9kYXRhID0gZDsKKworCXJldHVybiAxOworCX0KKworLyogdGhpcyBoYXMgJ3BhY2thZ2UnIHZpc2liaWxpdHkgKi8KK3ZvaWQgKkVDX0VYX0RBVEFfZ2V0X2RhdGEoY29uc3QgRUNfRVhUUkFfREFUQSAqZXhfZGF0YSwKKwl2b2lkICooKmR1cF9mdW5jKSh2b2lkICopLCB2b2lkICgqZnJlZV9mdW5jKSh2b2lkICopLCB2b2lkICgqY2xlYXJfZnJlZV9mdW5jKSh2b2lkICopKQorCXsKKwljb25zdCBFQ19FWFRSQV9EQVRBICpkOworCisJZm9yIChkID0gZXhfZGF0YTsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKKwkJeworCQlpZiAoZC0+ZHVwX2Z1bmMgPT0gZHVwX2Z1bmMgJiYgZC0+ZnJlZV9mdW5jID09IGZyZWVfZnVuYyAmJiBkLT5jbGVhcl9mcmVlX2Z1bmMgPT0gY2xlYXJfZnJlZV9mdW5jKQorCQkJcmV0dXJuIGQtPmRhdGE7CisJCX0KKwkKKwlyZXR1cm4gTlVMTDsKKwl9CisKKy8qIHRoaXMgaGFzICdwYWNrYWdlJyB2aXNpYmlsaXR5ICovCit2b2lkIEVDX0VYX0RBVEFfZnJlZV9kYXRhKEVDX0VYVFJBX0RBVEEgKipleF9kYXRhLAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpCisJeworCUVDX0VYVFJBX0RBVEEgKipwOworCisJaWYgKGV4X2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChwID0gZXhfZGF0YTsgKnAgIT0gTlVMTDsgcCA9ICYoKCpwKS0+bmV4dCkpCisJCXsKKwkJaWYgKCgqcCktPmR1cF9mdW5jID09IGR1cF9mdW5jICYmICgqcCktPmZyZWVfZnVuYyA9PSBmcmVlX2Z1bmMgJiYgKCpwKS0+Y2xlYXJfZnJlZV9mdW5jID09IGNsZWFyX2ZyZWVfZnVuYykKKwkJCXsKKwkJCUVDX0VYVFJBX0RBVEEgKm5leHQgPSAoKnApLT5uZXh0OworCisJCQkoKnApLT5mcmVlX2Z1bmMoKCpwKS0+ZGF0YSk7CisJCQlPUEVOU1NMX2ZyZWUoKnApOworCQkJCisJCQkqcCA9IG5leHQ7CisJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKy8qIHRoaXMgaGFzICdwYWNrYWdlJyB2aXNpYmlsaXR5ICovCit2b2lkIEVDX0VYX0RBVEFfY2xlYXJfZnJlZV9kYXRhKEVDX0VYVFJBX0RBVEEgKipleF9kYXRhLAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpCisJeworCUVDX0VYVFJBX0RBVEEgKipwOworCisJaWYgKGV4X2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yIChwID0gZXhfZGF0YTsgKnAgIT0gTlVMTDsgcCA9ICYoKCpwKS0+bmV4dCkpCisJCXsKKwkJaWYgKCgqcCktPmR1cF9mdW5jID09IGR1cF9mdW5jICYmICgqcCktPmZyZWVfZnVuYyA9PSBmcmVlX2Z1bmMgJiYgKCpwKS0+Y2xlYXJfZnJlZV9mdW5jID09IGNsZWFyX2ZyZWVfZnVuYykKKwkJCXsKKwkJCUVDX0VYVFJBX0RBVEEgKm5leHQgPSAoKnApLT5uZXh0OworCisJCQkoKnApLT5jbGVhcl9mcmVlX2Z1bmMoKCpwKS0+ZGF0YSk7CisJCQlPUEVOU1NMX2ZyZWUoKnApOworCQkJCisJCQkqcCA9IG5leHQ7CisJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisKKy8qIHRoaXMgaGFzICdwYWNrYWdlJyB2aXNpYmlsaXR5ICovCit2b2lkIEVDX0VYX0RBVEFfZnJlZV9hbGxfZGF0YShFQ19FWFRSQV9EQVRBICoqZXhfZGF0YSkKKwl7CisJRUNfRVhUUkFfREFUQSAqZDsKKworCWlmIChleF9kYXRhID09IE5VTEwpCisJCXJldHVybjsKKworCWQgPSAqZXhfZGF0YTsKKwl3aGlsZSAoZCkKKwkJeworCQlFQ19FWFRSQV9EQVRBICpuZXh0ID0gZC0+bmV4dDsKKwkJCisJCWQtPmZyZWVfZnVuYyhkLT5kYXRhKTsKKwkJT1BFTlNTTF9mcmVlKGQpOworCQkKKwkJZCA9IG5leHQ7CisJCX0KKwkqZXhfZGF0YSA9IE5VTEw7CisJfQorCisvKiB0aGlzIGhhcyAncGFja2FnZScgdmlzaWJpbGl0eSAqLwordm9pZCBFQ19FWF9EQVRBX2NsZWFyX2ZyZWVfYWxsX2RhdGEoRUNfRVhUUkFfREFUQSAqKmV4X2RhdGEpCisJeworCUVDX0VYVFJBX0RBVEEgKmQ7CisKKwlpZiAoZXhfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlkID0gKmV4X2RhdGE7CisJd2hpbGUgKGQpCisJCXsKKwkJRUNfRVhUUkFfREFUQSAqbmV4dCA9IGQtPm5leHQ7CisJCQorCQlkLT5jbGVhcl9mcmVlX2Z1bmMoZC0+ZGF0YSk7CisJCU9QRU5TU0xfZnJlZShkKTsKKwkJCisJCWQgPSBuZXh0OworCQl9CisJKmV4X2RhdGEgPSBOVUxMOworCX0KKworCisvKiBmdW5jdGlvbnMgZm9yIEVDX1BPSU5UIG9iamVjdHMgKi8KKworRUNfUE9JTlQgKkVDX1BPSU5UX25ldyhjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCUVDX1BPSU5UICpyZXQ7CisKKwlpZiAoZ3JvdXAgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX05FVywgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X2luaXQgPT0gMCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX05FVywgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZiAqcmV0KTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9ORVcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldC0+bWV0aCA9IGdyb3VwLT5tZXRoOworCQorCWlmICghcmV0LT5tZXRoLT5wb2ludF9pbml0KHJldCkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldHVybiBOVUxMOworCQl9CisJCisJcmV0dXJuIHJldDsKKwl9CisKKwordm9pZCBFQ19QT0lOVF9mcmVlKEVDX1BPSU5UICpwb2ludCkKKwl7CisJaWYgKCFwb2ludCkgcmV0dXJuOworCisJaWYgKHBvaW50LT5tZXRoLT5wb2ludF9maW5pc2ggIT0gMCkKKwkJcG9pbnQtPm1ldGgtPnBvaW50X2ZpbmlzaChwb2ludCk7CisJT1BFTlNTTF9mcmVlKHBvaW50KTsKKwl9CisgCisKK3ZvaWQgRUNfUE9JTlRfY2xlYXJfZnJlZShFQ19QT0lOVCAqcG9pbnQpCisJeworCWlmICghcG9pbnQpIHJldHVybjsKKworCWlmIChwb2ludC0+bWV0aC0+cG9pbnRfY2xlYXJfZmluaXNoICE9IDApCisJCXBvaW50LT5tZXRoLT5wb2ludF9jbGVhcl9maW5pc2gocG9pbnQpOworCWVsc2UgaWYgKHBvaW50LT5tZXRoLT5wb2ludF9maW5pc2ggIT0gMCkKKwkJcG9pbnQtPm1ldGgtPnBvaW50X2ZpbmlzaChwb2ludCk7CisJT1BFTlNTTF9jbGVhbnNlKHBvaW50LCBzaXplb2YgKnBvaW50KTsKKwlPUEVOU1NMX2ZyZWUocG9pbnQpOworCX0KKworCitpbnQgRUNfUE9JTlRfY29weShFQ19QT0lOVCAqZGVzdCwgY29uc3QgRUNfUE9JTlQgKnNyYykKKwl7CisJaWYgKGRlc3QtPm1ldGgtPnBvaW50X2NvcHkgPT0gMCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX0NPUFksIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAwOworCQl9CisJaWYgKGRlc3QtPm1ldGggIT0gc3JjLT5tZXRoKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfQ09QWSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJaWYgKGRlc3QgPT0gc3JjKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gZGVzdC0+bWV0aC0+cG9pbnRfY29weShkZXN0LCBzcmMpOworCX0KKworCitFQ19QT0lOVCAqRUNfUE9JTlRfZHVwKGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCUVDX1BPSU5UICp0OworCWludCByOworCisJaWYgKGEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKwl0ID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKwlpZiAodCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJciA9IEVDX1BPSU5UX2NvcHkodCwgYSk7CisJaWYgKCFyKQorCQl7CisJCUVDX1BPSU5UX2ZyZWUodCk7CisJCXJldHVybiBOVUxMOworCQl9CisJZWxzZSByZXR1cm4gdDsKKwl9CisKKworY29uc3QgRUNfTUVUSE9EICpFQ19QT0lOVF9tZXRob2Rfb2YoY29uc3QgRUNfUE9JTlQgKnBvaW50KQorCXsKKwlyZXR1cm4gcG9pbnQtPm1ldGg7CisJfQorCisKK2ludCBFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQpCisJeworCWlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X3RvX2luZmluaXR5ID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9TRVRfVE9fSU5GSU5JVFksIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAwOworCQl9CisJaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfU0VUX1RPX0lORklOSVRZLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gZ3JvdXAtPm1ldGgtPnBvaW50X3NldF90b19pbmZpbml0eShncm91cCwgcG9pbnQpOworCX0KKworCitpbnQgRUNfUE9JTlRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCwKKwljb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwgY29uc3QgQklHTlVNICp6LCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9TRVRfSlBST0pFQ1RJVkVfQ09PUkRJTkFURVNfR0ZQLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX1NFVF9KUFJPSkVDVElWRV9DT09SRElOQVRFU19HRlAsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+cG9pbnRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgcG9pbnQsIHgsIHksIHosIGN0eCk7CisJfQorCisKK2ludCBFQ19QT0lOVF9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50LAorCUJJR05VTSAqeCwgQklHTlVNICp5LCBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAgPT0gMCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX0dFVF9KUFJPSkVDVElWRV9DT09SRElOQVRFU19HRlAsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAwOworCQl9CisJaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfR0VUX0pQUk9KRUNUSVZFX0NPT1JESU5BVEVTX0dGUCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeSwgeiwgY3R4KTsKKwl9CisKKworaW50IEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LAorCWNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9TRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9TRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KTsKKwl9CisKKworaW50IEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCwKKwljb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcyA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfU0VUX0FGRklORV9DT09SRElOQVRFU19HRjJNLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX1NFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0YyTSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KTsKKwl9CisKKworaW50IEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50LAorCUJJR05VTSAqeCwgQklHTlVNICp5LCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5tZXRoLT5wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KTsKKwl9CisKKworaW50IEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwKKwlCSUdOVU0gKngsIEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+cG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfR0VUX0FGRklORV9DT09SRElOQVRFU19HRjJNLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX0dFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0YyTSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KTsKKwl9CisKKworaW50IEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCwKKwljb25zdCBCSUdOVU0gKngsIGludCB5X2JpdCwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+cG9pbnRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMgPT0gMCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTX0dGUCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9TRVRfQ09NUFJFU1NFRF9DT09SRElOQVRFU19HRlAsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+cG9pbnRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMoZ3JvdXAsIHBvaW50LCB4LCB5X2JpdCwgY3R4KTsKKwl9CisKKworaW50IEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGMm0oY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsCisJY29uc3QgQklHTlVNICp4LCBpbnQgeV9iaXQsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9TRVRfQ09NUFJFU1NFRF9DT09SRElOQVRFU19HRjJNLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChncm91cC0+bWV0aCAhPSBwb2ludC0+bWV0aCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTX0dGMk0sIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+cG9pbnRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMoZ3JvdXAsIHBvaW50LCB4LCB5X2JpdCwgY3R4KTsKKwl9CisKKworc2l6ZV90IEVDX1BPSU5UX3BvaW50Mm9jdChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwgcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgZm9ybSwKKyAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5tZXRoLT5wb2ludDJvY3QgPT0gMCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX1BPSU5UMk9DVCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9QT0lOVDJPQ1QsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+cG9pbnQyb2N0KGdyb3VwLCBwb2ludCwgZm9ybSwgYnVmLCBsZW4sIGN0eCk7CisJfQorCisKK2ludCBFQ19QT0lOVF9vY3QycG9pbnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+b2N0MnBvaW50ID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9PQ1QyUE9JTlQsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAwOworCQl9CisJaWYgKGdyb3VwLT5tZXRoICE9IHBvaW50LT5tZXRoKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfT0NUMlBPSU5ULCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gZ3JvdXAtPm1ldGgtPm9jdDJwb2ludChncm91cCwgcG9pbnQsIGJ1ZiwgbGVuLCBjdHgpOworCX0KKworCitpbnQgRUNfUE9JTlRfYWRkKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+YWRkID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9BREQsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAwOworCQl9CisJaWYgKChncm91cC0+bWV0aCAhPSByLT5tZXRoKSB8fCAoci0+bWV0aCAhPSBhLT5tZXRoKSB8fCAoYS0+bWV0aCAhPSBiLT5tZXRoKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BPSU5UX0FERCwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5hZGQoZ3JvdXAsIHIsIGEsIGIsIGN0eCk7CisJfQorCisKK2ludCBFQ19QT0lOVF9kYmwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqciwgY29uc3QgRUNfUE9JTlQgKmEsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPmRibCA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfREJMLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmICgoZ3JvdXAtPm1ldGggIT0gci0+bWV0aCkgfHwgKHItPm1ldGggIT0gYS0+bWV0aCkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9EQkwsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+ZGJsKGdyb3VwLCByLCBhLCBjdHgpOworCX0KKworCitpbnQgRUNfUE9JTlRfaW52ZXJ0KGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKmEsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPmRibCA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfSU5WRVJULCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChncm91cC0+bWV0aCAhPSBhLT5tZXRoKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfSU5WRVJULCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gZ3JvdXAtPm1ldGgtPmludmVydChncm91cCwgYSwgY3R4KTsKKwl9CisKKworaW50IEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPmlzX2F0X2luZmluaXR5ID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9JU19BVF9JTkZJTklUWSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9JU19BVF9JTkZJTklUWSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5pc19hdF9pbmZpbml0eShncm91cCwgcG9pbnQpOworCX0KKworCitpbnQgRUNfUE9JTlRfaXNfb25fY3VydmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPmlzX29uX2N1cnZlID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9JU19PTl9DVVJWRSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9JU19PTl9DVVJWRSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5pc19vbl9jdXJ2ZShncm91cCwgcG9pbnQsIGN0eCk7CisJfQorCisKK2ludCBFQ19QT0lOVF9jbXAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfUE9JTlQgKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPnBvaW50X2NtcCA9PSAwKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfUE9JTlRfQ01QLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmICgoZ3JvdXAtPm1ldGggIT0gYS0+bWV0aCkgfHwgKGEtPm1ldGggIT0gYi0+bWV0aCkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9DTVAsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+cG9pbnRfY21wKGdyb3VwLCBhLCBiLCBjdHgpOworCX0KKworCitpbnQgRUNfUE9JTlRfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPm1ha2VfYWZmaW5lID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9NQUtFX0FGRklORSwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoZ3JvdXAtPm1ldGggIT0gcG9pbnQtPm1ldGgpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVF9NQUtFX0FGRklORSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGdyb3VwLT5tZXRoLT5tYWtlX2FmZmluZShncm91cCwgcG9pbnQsIGN0eCk7CisJfQorCisKK2ludCBFQ19QT0lOVHNfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBzaXplX3QgbnVtLCBFQ19QT0lOVCAqcG9pbnRzW10sIEJOX0NUWCAqY3R4KQorCXsKKwlzaXplX3QgaTsKKworCWlmIChncm91cC0+bWV0aC0+cG9pbnRzX21ha2VfYWZmaW5lID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19QT0lOVFNfTUFLRV9BRkZJTkUsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybiAwOworCQl9CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQl7CisJCWlmIChncm91cC0+bWV0aCAhPSBwb2ludHNbaV0tPm1ldGgpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX1BPSU5UU19NQUtFX0FGRklORSwgRUNfUl9JTkNPTVBBVElCTEVfT0JKRUNUUyk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCXJldHVybiBncm91cC0+bWV0aC0+cG9pbnRzX21ha2VfYWZmaW5lKGdyb3VwLCBudW0sIHBvaW50cywgY3R4KTsKKwl9CisKKworLyogRnVuY3Rpb25zIGZvciBwb2ludCBtdWx0aXBsaWNhdGlvbi4KKyAqCisgKiBJZiBncm91cC0+bWV0aC0+bXVsIGlzIDAsIHdlIHVzZSB0aGUgd05BRi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgaW4gZWNfbXVsdC5jOworICogb3RoZXJ3aXNlIHdlIGRpc3BhdGNoIHRocm91Z2ggbWV0aG9kcy4KKyAqLworCitpbnQgRUNfUE9JTlRzX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKnNjYWxhciwKKwlzaXplX3QgbnVtLCBjb25zdCBFQ19QT0lOVCAqcG9pbnRzW10sIGNvbnN0IEJJR05VTSAqc2NhbGFyc1tdLCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5tZXRoLT5tdWwgPT0gMCkKKwkJLyogdXNlIGRlZmF1bHQgKi8KKwkJcmV0dXJuIGVjX3dOQUZfbXVsKGdyb3VwLCByLCBzY2FsYXIsIG51bSwgcG9pbnRzLCBzY2FsYXJzLCBjdHgpOworCisJcmV0dXJuIGdyb3VwLT5tZXRoLT5tdWwoZ3JvdXAsIHIsIHNjYWxhciwgbnVtLCBwb2ludHMsIHNjYWxhcnMsIGN0eCk7CisJfQorCitpbnQgRUNfUE9JTlRfbXVsKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEJJR05VTSAqZ19zY2FsYXIsCisJY29uc3QgRUNfUE9JTlQgKnBvaW50LCBjb25zdCBCSUdOVU0gKnBfc2NhbGFyLCBCTl9DVFggKmN0eCkKKwl7CisJLyoganVzdCBhIGNvbnZlbmllbnQgaW50ZXJmYWNlIHRvIEVDX1BPSU5Uc19tdWwoKSAqLworCisJY29uc3QgRUNfUE9JTlQgKnBvaW50c1sxXTsKKwljb25zdCBCSUdOVU0gKnNjYWxhcnNbMV07CisKKwlwb2ludHNbMF0gPSBwb2ludDsKKwlzY2FsYXJzWzBdID0gcF9zY2FsYXI7CisKKwlyZXR1cm4gRUNfUE9JTlRzX211bChncm91cCwgciwgZ19zY2FsYXIsIChwb2ludCAhPSBOVUxMICYmIHBfc2NhbGFyICE9IE5VTEwpLCBwb2ludHMsIHNjYWxhcnMsIGN0eCk7CisJfQorCitpbnQgRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KEVDX0dST1VQICpncm91cCwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+bWV0aC0+bXVsID09IDApCisJCS8qIHVzZSBkZWZhdWx0ICovCisJCXJldHVybiBlY193TkFGX3ByZWNvbXB1dGVfbXVsdChncm91cCwgY3R4KTsKKworCWlmIChncm91cC0+bWV0aC0+cHJlY29tcHV0ZV9tdWx0ICE9IDApCisJCXJldHVybiBncm91cC0+bWV0aC0+cHJlY29tcHV0ZV9tdWx0KGdyb3VwLCBjdHgpOworCWVsc2UKKwkJcmV0dXJuIDE7IC8qIG5vdGhpbmcgdG8gZG8sIHNvIHJlcG9ydCBzdWNjZXNzICovCisJfQorCitpbnQgRUNfR1JPVVBfaGF2ZV9wcmVjb21wdXRlX211bHQoY29uc3QgRUNfR1JPVVAgKmdyb3VwKQorCXsKKwlpZiAoZ3JvdXAtPm1ldGgtPm11bCA9PSAwKQorCQkvKiB1c2UgZGVmYXVsdCAqLworCQlyZXR1cm4gZWNfd05BRl9oYXZlX3ByZWNvbXB1dGVfbXVsdChncm91cCk7CisKKwlpZiAoZ3JvdXAtPm1ldGgtPmhhdmVfcHJlY29tcHV0ZV9tdWx0ICE9IDApCisJCXJldHVybiBncm91cC0+bWV0aC0+aGF2ZV9wcmVjb21wdXRlX211bHQoZ3JvdXApOworCWVsc2UKKwkJcmV0dXJuIDA7IC8qIGNhbm5vdCB0ZWxsIHdoZXRoZXIgcHJlY29tcHV0YXRpb24gaGFzIGJlZW4gcGVyZm9ybWVkICovCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX211bHQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19tdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1ZGY1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19tdWx0LmMKQEAgLTAsMCArMSw5MzggQEAKKy8qIGNyeXB0by9lYy9lY19tdWx0LmMgKi8KKy8qCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQm9kbyBNb2VsbGVyIGFuZCBOaWxzIExhcnNjaCBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwKKyAqIGFuZCBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpbmNsdWRlICJlY19sY2wuaCIKKworCisvKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIHdOQUYtYmFzZWQgaW50ZXJsZWF2aW5nIG11bHRpLWV4cG9uZW50YXRpb24gbWV0aG9kCisgKiAoPFVSTDpodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtZGFybXN0YWR0LmRlL1RJL01pdGFyYmVpdGVyL21vZWxsZXIuaHRtbCNtdWx0aWV4cD4pOworICogZm9yIG11bHRpcGxpY2F0aW9uIHdpdGggcHJlY29tcHV0YXRpb24sIHdlIHVzZSB3TkFGIHNwbGl0dGluZworICogKDxVUkw6aHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LWRhcm1zdGFkdC5kZS9USS9NaXRhcmJlaXRlci9tb2VsbGVyLmh0bWwjZmFzdGV4cD4pLgorICovCisKKworCisKKy8qIHN0cnVjdHVyZSBmb3IgcHJlY29tcHV0ZWQgbXVsdGlwbGVzIG9mIHRoZSBnZW5lcmF0b3IgKi8KK3R5cGVkZWYgc3RydWN0IGVjX3ByZV9jb21wX3N0IHsKKwljb25zdCBFQ19HUk9VUCAqZ3JvdXA7IC8qIHBhcmVudCBFQ19HUk9VUCBvYmplY3QgKi8KKwlzaXplX3QgYmxvY2tzaXplOyAgICAgIC8qIGJsb2NrIHNpemUgZm9yIHdOQUYgc3BsaXR0aW5nICovCisJc2l6ZV90IG51bWJsb2NrczsgICAgICAvKiBtYXguIG51bWJlciBvZiBibG9ja3MgZm9yIHdoaWNoIHdlIGhhdmUgcHJlY29tcHV0YXRpb24gKi8KKwlzaXplX3QgdzsgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplICovCisJRUNfUE9JTlQgKipwb2ludHM7ICAgICAvKiBhcnJheSB3aXRoIHByZS1jYWxjdWxhdGVkIG11bHRpcGxlcyBvZiBnZW5lcmF0b3I6CisJICAgICAgICAgICAgICAgICAgICAgICAgKiAnbnVtJyBwb2ludGVycyB0byBFQ19QT0lOVCBvYmplY3RzIGZvbGxvd2VkIGJ5IGEgTlVMTCAqLworCXNpemVfdCBudW07ICAgICAgICAgICAgLyogbnVtYmxvY2tzICogMl4ody0xKSAqLworCWludCByZWZlcmVuY2VzOworfSBFQ19QUkVfQ09NUDsKKyAKKy8qIGZ1bmN0aW9ucyB0byBtYW5hZ2UgRUNfUFJFX0NPTVAgd2l0aGluIHRoZSBFQ19HUk9VUCBleHRyYV9kYXRhIGZyYW1ld29yayAqLworc3RhdGljIHZvaWQgKmVjX3ByZV9jb21wX2R1cCh2b2lkICopOworc3RhdGljIHZvaWQgZWNfcHJlX2NvbXBfZnJlZSh2b2lkICopOworc3RhdGljIHZvaWQgZWNfcHJlX2NvbXBfY2xlYXJfZnJlZSh2b2lkICopOworCitzdGF0aWMgRUNfUFJFX0NPTVAgKmVjX3ByZV9jb21wX25ldyhjb25zdCBFQ19HUk9VUCAqZ3JvdXApCisJeworCUVDX1BSRV9DT01QICpyZXQgPSBOVUxMOworCisJaWYgKCFncm91cCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSAoRUNfUFJFX0NPTVAgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfUFJFX0NPTVApKTsKKwlpZiAoIXJldCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1BSRV9DT01QX05FVywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gcmV0OworCQl9CisJcmV0LT5ncm91cCA9IGdyb3VwOworCXJldC0+YmxvY2tzaXplID0gODsgLyogZGVmYXVsdCAqLworCXJldC0+bnVtYmxvY2tzID0gMDsKKwlyZXQtPncgPSA0OyAvKiBkZWZhdWx0ICovCisJcmV0LT5wb2ludHMgPSBOVUxMOworCXJldC0+bnVtID0gMDsKKwlyZXQtPnJlZmVyZW5jZXMgPSAxOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgdm9pZCAqZWNfcHJlX2NvbXBfZHVwKHZvaWQgKnNyY18pCisJeworCUVDX1BSRV9DT01QICpzcmMgPSBzcmNfOworCisJLyogbm8gbmVlZCB0byBhY3R1YWxseSBjb3B5LCB0aGVzZSBvYmplY3RzIG5ldmVyIGNoYW5nZSEgKi8KKworCUNSWVBUT19hZGQoJnNyYy0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfRUNfUFJFX0NPTVApOworCisJcmV0dXJuIHNyY187CisJfQorCitzdGF0aWMgdm9pZCBlY19wcmVfY29tcF9mcmVlKHZvaWQgKnByZV8pCisJeworCWludCBpOworCUVDX1BSRV9DT01QICpwcmUgPSBwcmVfOworCisJaWYgKCFwcmUpCisJCXJldHVybjsKKworCWkgPSBDUllQVE9fYWRkKCZwcmUtPnJlZmVyZW5jZXMsIC0xLCBDUllQVE9fTE9DS19FQ19QUkVfQ09NUCk7CisJaWYgKGkgPiAwKQorCQlyZXR1cm47CisKKwlpZiAocHJlLT5wb2ludHMpCisJCXsKKwkJRUNfUE9JTlQgKipwOworCisJCWZvciAocCA9IHByZS0+cG9pbnRzOyAqcCAhPSBOVUxMOyBwKyspCisJCQlFQ19QT0lOVF9mcmVlKCpwKTsKKwkJT1BFTlNTTF9mcmVlKHByZS0+cG9pbnRzKTsKKwkJfQorCU9QRU5TU0xfZnJlZShwcmUpOworCX0KKworc3RhdGljIHZvaWQgZWNfcHJlX2NvbXBfY2xlYXJfZnJlZSh2b2lkICpwcmVfKQorCXsKKwlpbnQgaTsKKwlFQ19QUkVfQ09NUCAqcHJlID0gcHJlXzsKKworCWlmICghcHJlKQorCQlyZXR1cm47CisKKwlpID0gQ1JZUFRPX2FkZCgmcHJlLT5yZWZlcmVuY2VzLCAtMSwgQ1JZUFRPX0xPQ0tfRUNfUFJFX0NPTVApOworCWlmIChpID4gMCkKKwkJcmV0dXJuOworCisJaWYgKHByZS0+cG9pbnRzKQorCQl7CisJCUVDX1BPSU5UICoqcDsKKworCQlmb3IgKHAgPSBwcmUtPnBvaW50czsgKnAgIT0gTlVMTDsgcCsrKQorCQkJRUNfUE9JTlRfY2xlYXJfZnJlZSgqcCk7CisJCU9QRU5TU0xfY2xlYW5zZShwcmUtPnBvaW50cywgc2l6ZW9mIHByZS0+cG9pbnRzKTsKKwkJT1BFTlNTTF9mcmVlKHByZS0+cG9pbnRzKTsKKwkJfQorCU9QRU5TU0xfY2xlYW5zZShwcmUsIHNpemVvZiBwcmUpOworCU9QRU5TU0xfZnJlZShwcmUpOworCX0KKworCisKKworLyogRGV0ZXJtaW5lIHRoZSBtb2RpZmllZCB3aWR0aC0odysxKSBOb24tQWRqYWNlbnQgRm9ybSAod05BRikgb2YgJ3NjYWxhcicuCisgKiBUaGlzIGlzIGFuIGFycmF5ICByW10gIG9mIHZhbHVlcyB0aGF0IGFyZSBlaXRoZXIgemVybyBvciBvZGQgd2l0aCBhbgorICogYWJzb2x1dGUgdmFsdWUgbGVzcyB0aGFuICAyXncgIHNhdGlzZnlpbmcKKyAqICAgICBzY2FsYXIgPSBcc3VtX2ogcltqXSoyXmoKKyAqIHdoZXJlIGF0IG1vc3Qgb25lIG9mIGFueSAgdysxICBjb25zZWN1dGl2ZSBkaWdpdHMgaXMgbm9uLXplcm8KKyAqIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0IG1heSBiZSBvbmx5CisgKiB3LTEgemVyb3MgYXdheSBmcm9tIHRoYXQgbmV4dCBub24temVybyBkaWdpdC4KKyAqLworc3RhdGljIHNpZ25lZCBjaGFyICpjb21wdXRlX3dOQUYoY29uc3QgQklHTlVNICpzY2FsYXIsIGludCB3LCBzaXplX3QgKnJldF9sZW4pCisJeworCWludCB3aW5kb3dfdmFsOworCWludCBvayA9IDA7CisJc2lnbmVkIGNoYXIgKnIgPSBOVUxMOworCWludCBzaWduID0gMTsKKwlpbnQgYml0LCBuZXh0X2JpdCwgbWFzazsKKwlzaXplX3QgbGVuID0gMCwgajsKKwkKKwlpZiAoQk5faXNfemVybyhzY2FsYXIpKQorCQl7CisJCXIgPSBPUEVOU1NMX21hbGxvYygxKTsKKwkJaWYgKCFyKQorCQkJeworCQkJRUNlcnIoRUNfRl9DT01QVVRFX1dOQUYsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlyWzBdID0gMDsKKwkJKnJldF9sZW4gPSAxOworCQlyZXR1cm4gcjsKKwkJfQorCQkKKwlpZiAodyA8PSAwIHx8IHcgPiA3KSAvKiAnc2lnbmVkIGNoYXInIGNhbiByZXByZXNlbnQgaW50ZWdlcnMgd2l0aCBhYnNvbHV0ZSB2YWx1ZXMgbGVzcyB0aGFuIDJeNyAqLworCQl7CisJCUVDZXJyKEVDX0ZfQ09NUFVURV9XTkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisJYml0ID0gMSA8PCB3OyAvKiBhdCBtb3N0IDEyOCAqLworCW5leHRfYml0ID0gYml0IDw8IDE7IC8qIGF0IG1vc3QgMjU2ICovCisJbWFzayA9IG5leHRfYml0IC0gMTsgLyogYXQgbW9zdCAyNTUgKi8KKworCWlmIChCTl9pc19uZWdhdGl2ZShzY2FsYXIpKQorCQl7CisJCXNpZ24gPSAtMTsKKwkJfQorCisJaWYgKHNjYWxhci0+ZCA9PSBOVUxMIHx8IHNjYWxhci0+dG9wID09IDApCisJCXsKKwkJRUNlcnIoRUNfRl9DT01QVVRFX1dOQUYsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKworCWxlbiA9IEJOX251bV9iaXRzKHNjYWxhcik7CisJciA9IE9QRU5TU0xfbWFsbG9jKGxlbiArIDEpOyAvKiBtb2RpZmllZCB3TkFGIG1heSBiZSBvbmUgZGlnaXQgbG9uZ2VyIHRoYW4gYmluYXJ5IHJlcHJlc2VudGF0aW9uCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoKnJldF9sZW4gd2lsbCBiZSBzZXQgdG8gdGhlIGFjdHVhbCBsZW5ndGgsIGkuZS4gYXQgbW9zdAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQk5fbnVtX2JpdHMoc2NhbGFyKSArIDEpICovCisJaWYgKHIgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0NPTVBVVEVfV05BRiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCXdpbmRvd192YWwgPSBzY2FsYXItPmRbMF0gJiBtYXNrOworCWogPSAwOworCXdoaWxlICgod2luZG93X3ZhbCAhPSAwKSB8fCAoaiArIHcgKyAxIDwgbGVuKSkgLyogaWYgait3KzEgPj0gbGVuLCB3aW5kb3dfdmFsIHdpbGwgbm90IGluY3JlYXNlICovCisJCXsKKwkJaW50IGRpZ2l0ID0gMDsKKworCQkvKiAwIDw9IHdpbmRvd192YWwgPD0gMl4odysxKSAqLworCisJCWlmICh3aW5kb3dfdmFsICYgMSkKKwkJCXsKKwkJCS8qIDAgPCB3aW5kb3dfdmFsIDwgMl4odysxKSAqLworCisJCQlpZiAod2luZG93X3ZhbCAmIGJpdCkKKwkJCQl7CisJCQkJZGlnaXQgPSB3aW5kb3dfdmFsIC0gbmV4dF9iaXQ7IC8qIC0yXncgPCBkaWdpdCA8IDAgKi8KKworI2lmIDEgLyogbW9kaWZpZWQgd05BRiAqLworCQkJCWlmIChqICsgdyArIDEgPj0gbGVuKQorCQkJCQl7CisJCQkJCS8qIHNwZWNpYWwgY2FzZSBmb3IgZ2VuZXJhdGluZyBtb2RpZmllZCB3TkFGczoKKwkJCQkJICogbm8gbmV3IGJpdHMgd2lsbCBiZSBhZGRlZCBpbnRvIHdpbmRvd192YWwsCisJCQkJCSAqIHNvIHVzaW5nIGEgcG9zaXRpdmUgZGlnaXQgaGVyZSB3aWxsIGRlY3JlYXNlCisJCQkJCSAqIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHJlcHJlc2VudGF0aW9uICovCisJCQkJCQorCQkJCQlkaWdpdCA9IHdpbmRvd192YWwgJiAobWFzayA+PiAxKTsgLyogMCA8IGRpZ2l0IDwgMl53ICovCisJCQkJCX0KKyNlbmRpZgorCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJZGlnaXQgPSB3aW5kb3dfdmFsOyAvKiAwIDwgZGlnaXQgPCAyXncgKi8KKwkJCQl9CisJCQkKKwkJCWlmIChkaWdpdCA8PSAtYml0IHx8IGRpZ2l0ID49IGJpdCB8fCAhKGRpZ2l0ICYgMSkpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfQ09NUFVURV9XTkFGLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQl3aW5kb3dfdmFsIC09IGRpZ2l0OworCisJCQkvKiBub3cgd2luZG93X3ZhbCBpcyAwIG9yIDJeKHcrMSkgaW4gc3RhbmRhcmQgd05BRiBnZW5lcmF0aW9uOworCQkJICogZm9yIG1vZGlmaWVkIHdpbmRvdyBOQUZzLCBpdCBtYXkgYWxzbyBiZSAyXncKKwkJCSAqLworCQkJaWYgKHdpbmRvd192YWwgIT0gMCAmJiB3aW5kb3dfdmFsICE9IG5leHRfYml0ICYmIHdpbmRvd192YWwgIT0gYml0KQorCQkJCXsKKwkJCQlFQ2VycihFQ19GX0NPTVBVVEVfV05BRiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKworCQlyW2orK10gPSBzaWduICogZGlnaXQ7CisKKwkJd2luZG93X3ZhbCA+Pj0gMTsKKwkJd2luZG93X3ZhbCArPSBiaXQgKiBCTl9pc19iaXRfc2V0KHNjYWxhciwgaiArIHcpOworCisJCWlmICh3aW5kb3dfdmFsID4gbmV4dF9iaXQpCisJCQl7CisJCQlFQ2VycihFQ19GX0NPTVBVVEVfV05BRiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCWlmIChqID4gbGVuICsgMSkKKwkJeworCQlFQ2VycihFQ19GX0NPTVBVVEVfV05BRiwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCWxlbiA9IGo7CisJb2sgPSAxOworCisgZXJyOgorCWlmICghb2spCisJCXsKKwkJT1BFTlNTTF9mcmVlKHIpOworCQlyID0gTlVMTDsKKwkJfQorCWlmIChvaykKKwkJKnJldF9sZW4gPSBsZW47CisJcmV0dXJuIHI7CisJfQorCisKKy8qIFRPRE86IHRhYmxlIHNob3VsZCBiZSBvcHRpbWlzZWQgZm9yIHRoZSB3TkFGLWJhc2VkIGltcGxlbWVudGF0aW9uLAorICogICAgICAgc29tZXRpbWVzIHNtYWxsZXIgd2luZG93cyB3aWxsIGdpdmUgYmV0dGVyIHBlcmZvcm1hbmNlCisgKiAgICAgICAodGh1cyB0aGUgYm91bmRhcmllcyBzaG91bGQgYmUgaW5jcmVhc2VkKQorICovCisjZGVmaW5lIEVDX3dpbmRvd19iaXRzX2Zvcl9zY2FsYXJfc2l6ZShiKSBcCisJCSgoc2l6ZV90KSBcCisJCSAoKGIpID49IDIwMDAgPyA2IDogXAorCQkgIChiKSA+PSAgODAwID8gNSA6IFwKKwkJICAoYikgPj0gIDMwMCA/IDQgOiBcCisJCSAgKGIpID49ICAgNzAgPyAzIDogXAorCQkgIChiKSA+PSAgIDIwID8gMiA6IFwKKwkJICAxKSkKKworLyogQ29tcHV0ZQorICogICAgICBcc3VtIHNjYWxhcnNbaV0qcG9pbnRzW2ldLAorICogYWxzbyBpbmNsdWRpbmcKKyAqICAgICAgc2NhbGFyKmdlbmVyYXRvcgorICogaW4gdGhlIGFkZGl0aW9uIGlmIHNjYWxhciAhPSBOVUxMCisgKi8KK2ludCBlY193TkFGX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKnNjYWxhciwKKwlzaXplX3QgbnVtLCBjb25zdCBFQ19QT0lOVCAqcG9pbnRzW10sIGNvbnN0IEJJR05VTSAqc2NhbGFyc1tdLCBCTl9DVFggKmN0eCkKKwl7CisJQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKwljb25zdCBFQ19QT0lOVCAqZ2VuZXJhdG9yID0gTlVMTDsKKwlFQ19QT0lOVCAqdG1wID0gTlVMTDsKKwlzaXplX3QgdG90YWxudW07CisJc2l6ZV90IGJsb2Nrc2l6ZSA9IDAsIG51bWJsb2NrcyA9IDA7IC8qIGZvciB3TkFGIHNwbGl0dGluZyAqLworCXNpemVfdCBwcmVfcG9pbnRzX3Blcl9ibG9jayA9IDA7CisJc2l6ZV90IGksIGo7CisJaW50IGs7CisJaW50IHJfaXNfaW52ZXJ0ZWQgPSAwOworCWludCByX2lzX2F0X2luZmluaXR5ID0gMTsKKwlzaXplX3QgKndzaXplID0gTlVMTDsgLyogaW5kaXZpZHVhbCB3aW5kb3cgc2l6ZXMgKi8KKwlzaWduZWQgY2hhciAqKndOQUYgPSBOVUxMOyAvKiBpbmRpdmlkdWFsIHdOQUZzICovCisJc2l6ZV90ICp3TkFGX2xlbiA9IE5VTEw7CisJc2l6ZV90IG1heF9sZW4gPSAwOworCXNpemVfdCBudW1fdmFsOworCUVDX1BPSU5UICoqdmFsID0gTlVMTDsgLyogcHJlY29tcHV0YXRpb24gKi8KKwlFQ19QT0lOVCAqKnY7CisJRUNfUE9JTlQgKioqdmFsX3N1YiA9IE5VTEw7IC8qIHBvaW50ZXJzIHRvIHN1Yi1hcnJheXMgb2YgJ3ZhbCcgb3IgJ3ByZV9jb21wLT5wb2ludHMnICovCisJY29uc3QgRUNfUFJFX0NPTVAgKnByZV9jb21wID0gTlVMTDsKKwlpbnQgbnVtX3NjYWxhciA9IDA7IC8qIGZsYWc6IHdpbGwgYmUgc2V0IHRvIDEgaWYgJ3NjYWxhcicgbXVzdCBiZSB0cmVhdGVkIGxpa2Ugb3RoZXIgc2NhbGFycywKKwkgICAgICAgICAgICAgICAgICAgICAqIGkuZS4gcHJlY29tcHV0YXRpb24gaXMgbm90IGF2YWlsYWJsZSAqLworCWludCByZXQgPSAwOworCQorCWlmIChncm91cC0+bWV0aCAhPSByLT5tZXRoKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfV05BRl9NVUwsIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMpOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKChzY2FsYXIgPT0gTlVMTCkgJiYgKG51bSA9PSAwKSkKKwkJeworCQlyZXR1cm4gRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGdyb3VwLCByKTsKKwkJfQorCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQl7CisJCWlmIChncm91cC0+bWV0aCAhPSBwb2ludHNbaV0tPm1ldGgpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX1dOQUZfTVVMLCBFQ19SX0lOQ09NUEFUSUJMRV9PQkpFQ1RTKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCX0KKworCWlmIChzY2FsYXIgIT0gTlVMTCkKKwkJeworCQlnZW5lcmF0b3IgPSBFQ19HUk9VUF9nZXQwX2dlbmVyYXRvcihncm91cCk7CisJCWlmIChnZW5lcmF0b3IgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfV05BRl9NVUwsIEVDX1JfVU5ERUZJTkVEX0dFTkVSQVRPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJCisJCS8qIGxvb2sgaWYgd2UgY2FuIHVzZSBwcmVjb21wdXRlZCBtdWx0aXBsZXMgb2YgZ2VuZXJhdG9yICovCisKKwkJcHJlX2NvbXAgPSBFQ19FWF9EQVRBX2dldF9kYXRhKGdyb3VwLT5leHRyYV9kYXRhLCBlY19wcmVfY29tcF9kdXAsIGVjX3ByZV9jb21wX2ZyZWUsIGVjX3ByZV9jb21wX2NsZWFyX2ZyZWUpOworCisJCWlmIChwcmVfY29tcCAmJiBwcmVfY29tcC0+bnVtYmxvY2tzICYmIChFQ19QT0lOVF9jbXAoZ3JvdXAsIGdlbmVyYXRvciwgcHJlX2NvbXAtPnBvaW50c1swXSwgY3R4KSA9PSAwKSkKKwkJCXsKKwkJCWJsb2Nrc2l6ZSA9IHByZV9jb21wLT5ibG9ja3NpemU7CisKKwkJCS8qIGRldGVybWluZSBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgdGhhdCB3TkFGIHNwbGl0dGluZyBtYXkgeWllbGQKKwkJCSAqIChOQjogbWF4aW11bSB3TkFGIGxlbmd0aCBpcyBiaXQgbGVuZ3RoIHBsdXMgb25lKSAqLworCQkJbnVtYmxvY2tzID0gKEJOX251bV9iaXRzKHNjYWxhcikgLyBibG9ja3NpemUpICsgMTsKKworCQkJLyogd2UgY2Fubm90IHVzZSBtb3JlIGJsb2NrcyB0aGFuIHdlIGhhdmUgcHJlY29tcHV0YXRpb24gZm9yICovCisJCQlpZiAobnVtYmxvY2tzID4gcHJlX2NvbXAtPm51bWJsb2NrcykKKwkJCQludW1ibG9ja3MgPSBwcmVfY29tcC0+bnVtYmxvY2tzOworCisJCQlwcmVfcG9pbnRzX3Blcl9ibG9jayA9IChzaXplX3QpMSA8PCAocHJlX2NvbXAtPncgLSAxKTsKKworCQkJLyogY2hlY2sgdGhhdCBwcmVfY29tcCBsb29rcyBzYW5lICovCisJCQlpZiAocHJlX2NvbXAtPm51bSAhPSAocHJlX2NvbXAtPm51bWJsb2NrcyAqIHByZV9wb2ludHNfcGVyX2Jsb2NrKSkKKwkJCQl7CisJCQkJRUNlcnIoRUNfRl9FQ19XTkFGX01VTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJLyogY2FuJ3QgdXNlIHByZWNvbXB1dGF0aW9uICovCisJCQlwcmVfY29tcCA9IE5VTEw7CisJCQludW1ibG9ja3MgPSAxOworCQkJbnVtX3NjYWxhciA9IDE7IC8qIHRyZWF0ICdzY2FsYXInIGxpa2UgJ251bSctdGggZWxlbWVudCBvZiAnc2NhbGFycycgKi8KKwkJCX0KKwkJfQorCQorCXRvdGFsbnVtID0gbnVtICsgbnVtYmxvY2tzOworCisJd3NpemUgICAgPSBPUEVOU1NMX21hbGxvYyh0b3RhbG51bSAqIHNpemVvZiB3c2l6ZVswXSk7CisJd05BRl9sZW4gPSBPUEVOU1NMX21hbGxvYyh0b3RhbG51bSAqIHNpemVvZiB3TkFGX2xlblswXSk7CisJd05BRiAgICAgPSBPUEVOU1NMX21hbGxvYygodG90YWxudW0gKyAxKSAqIHNpemVvZiB3TkFGWzBdKTsgLyogaW5jbHVkZXMgc3BhY2UgZm9yIHBpdm90ICovCisJdmFsX3N1YiAgPSBPUEVOU1NMX21hbGxvYyh0b3RhbG51bSAqIHNpemVvZiB2YWxfc3ViWzBdKTsKKwkJIAorCWlmICghd3NpemUgfHwgIXdOQUZfbGVuIHx8ICF3TkFGIHx8ICF2YWxfc3ViKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfV05BRl9NVUwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCXdOQUZbMF0gPSBOVUxMOwkvKiBwcmVsaW1pbmFyeSBwaXZvdCAqLworCisJLyogbnVtX3ZhbCB3aWxsIGJlIHRoZSB0b3RhbCBudW1iZXIgb2YgdGVtcG9yYXJpbHkgcHJlY29tcHV0ZWQgcG9pbnRzICovCisJbnVtX3ZhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtICsgbnVtX3NjYWxhcjsgaSsrKQorCQl7CisJCXNpemVfdCBiaXRzOworCisJCWJpdHMgPSBpIDwgbnVtID8gQk5fbnVtX2JpdHMoc2NhbGFyc1tpXSkgOiBCTl9udW1fYml0cyhzY2FsYXIpOworCQl3c2l6ZVtpXSA9IEVDX3dpbmRvd19iaXRzX2Zvcl9zY2FsYXJfc2l6ZShiaXRzKTsKKwkJbnVtX3ZhbCArPSAoc2l6ZV90KTEgPDwgKHdzaXplW2ldIC0gMSk7CisJCXdOQUZbaSArIDFdID0gTlVMTDsgLyogbWFrZSBzdXJlIHdlIGFsd2F5cyBoYXZlIGEgcGl2b3QgKi8KKwkJd05BRltpXSA9IGNvbXB1dGVfd05BRigoaSA8IG51bSA/IHNjYWxhcnNbaV0gOiBzY2FsYXIpLCB3c2l6ZVtpXSwgJndOQUZfbGVuW2ldKTsKKwkJaWYgKHdOQUZbaV0gPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQlpZiAod05BRl9sZW5baV0gPiBtYXhfbGVuKQorCQkJbWF4X2xlbiA9IHdOQUZfbGVuW2ldOworCQl9CisKKwlpZiAobnVtYmxvY2tzKQorCQl7CisJCS8qIHdlIGdvIGhlcmUgaWZmIHNjYWxhciAhPSBOVUxMICovCisJCQorCQlpZiAocHJlX2NvbXAgPT0gTlVMTCkKKwkJCXsKKwkJCWlmIChudW1fc2NhbGFyICE9IDEpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfV05BRl9NVUwsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkvKiB3ZSBoYXZlIGFscmVhZHkgZ2VuZXJhdGVkIGEgd05BRiBmb3IgJ3NjYWxhcicgKi8KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJc2lnbmVkIGNoYXIgKnRtcF93TkFGID0gTlVMTDsKKwkJCXNpemVfdCB0bXBfbGVuID0gMDsKKwkJCQorCQkJaWYgKG51bV9zY2FsYXIgIT0gMCkKKwkJCQl7CisJCQkJRUNlcnIoRUNfRl9FQ19XTkFGX01VTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJLyogdXNlIHRoZSB3aW5kb3cgc2l6ZSBmb3Igd2hpY2ggd2UgaGF2ZSBwcmVjb21wdXRhdGlvbiAqLworCQkJd3NpemVbbnVtXSA9IHByZV9jb21wLT53OworCQkJdG1wX3dOQUYgPSBjb21wdXRlX3dOQUYoc2NhbGFyLCB3c2l6ZVtudW1dLCAmdG1wX2xlbik7CisJCQlpZiAoIXRtcF93TkFGKQorCQkJCWdvdG8gZXJyOworCisJCQlpZiAodG1wX2xlbiA8PSBtYXhfbGVuKQorCQkJCXsKKwkJCQkvKiBPbmUgb2YgdGhlIG90aGVyIHdOQUZzIGlzIGF0IGxlYXN0IGFzIGxvbmcKKwkJCQkgKiBhcyB0aGUgd05BRiBiZWxvbmdpbmcgdG8gdGhlIGdlbmVyYXRvciwKKwkJCQkgKiBzbyB3TkFGIHNwbGl0dGluZyB3aWxsIG5vdCBidXkgdXMgYW55dGhpbmcuICovCisKKwkJCQludW1ibG9ja3MgPSAxOworCQkJCXRvdGFsbnVtID0gbnVtICsgMTsgLyogZG9uJ3QgdXNlIHdOQUYgc3BsaXR0aW5nICovCisJCQkJd05BRltudW1dID0gdG1wX3dOQUY7CisJCQkJd05BRltudW0gKyAxXSA9IE5VTEw7CisJCQkJd05BRl9sZW5bbnVtXSA9IHRtcF9sZW47CisJCQkJaWYgKHRtcF9sZW4gPiBtYXhfbGVuKQorCQkJCQltYXhfbGVuID0gdG1wX2xlbjsKKwkJCQkvKiBwcmVfY29tcC0+cG9pbnRzIHN0YXJ0cyB3aXRoIHRoZSBwb2ludHMgdGhhdCB3ZSBuZWVkIGhlcmU6ICovCisJCQkJdmFsX3N1YltudW1dID0gcHJlX2NvbXAtPnBvaW50czsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCS8qIGRvbid0IGluY2x1ZGUgdG1wX3dOQUYgZGlyZWN0bHkgaW50byB3TkFGIGFycmF5CisJCQkJICogLSB1c2Ugd05BRiBzcGxpdHRpbmcgYW5kIGluY2x1ZGUgdGhlIGJsb2NrcyAqLworCisJCQkJc2lnbmVkIGNoYXIgKnBwOworCQkJCUVDX1BPSU5UICoqdG1wX3BvaW50czsKKwkJCQkKKwkJCQlpZiAodG1wX2xlbiA8IG51bWJsb2NrcyAqIGJsb2Nrc2l6ZSkKKwkJCQkJeworCQkJCQkvKiBwb3NzaWJseSB3ZSBjYW4gZG8gd2l0aCBmZXdlciBibG9ja3MgdGhhbiBlc3RpbWF0ZWQgKi8KKwkJCQkJbnVtYmxvY2tzID0gKHRtcF9sZW4gKyBibG9ja3NpemUgLSAxKSAvIGJsb2Nrc2l6ZTsKKwkJCQkJaWYgKG51bWJsb2NrcyA+IHByZV9jb21wLT5udW1ibG9ja3MpCisJCQkJCQl7CisJCQkJCQlFQ2VycihFQ19GX0VDX1dOQUZfTVVMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJCQlnb3RvIGVycjsKKwkJCQkJCX0KKwkJCQkJdG90YWxudW0gPSBudW0gKyBudW1ibG9ja3M7CisJCQkJCX0KKwkJCQkKKwkJCQkvKiBzcGxpdCB3TkFGIGluICdudW1ibG9ja3MnIHBhcnRzICovCisJCQkJcHAgPSB0bXBfd05BRjsKKwkJCQl0bXBfcG9pbnRzID0gcHJlX2NvbXAtPnBvaW50czsKKworCQkJCWZvciAoaSA9IG51bTsgaSA8IHRvdGFsbnVtOyBpKyspCisJCQkJCXsKKwkJCQkJaWYgKGkgPCB0b3RhbG51bSAtIDEpCisJCQkJCQl7CisJCQkJCQl3TkFGX2xlbltpXSA9IGJsb2Nrc2l6ZTsKKwkJCQkJCWlmICh0bXBfbGVuIDwgYmxvY2tzaXplKQorCQkJCQkJCXsKKwkJCQkJCQlFQ2VycihFQ19GX0VDX1dOQUZfTVVMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJCQkJZ290byBlcnI7CisJCQkJCQkJfQorCQkJCQkJdG1wX2xlbiAtPSBibG9ja3NpemU7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCS8qIGxhc3QgYmxvY2sgZ2V0cyB3aGF0ZXZlciBpcyBsZWZ0CisJCQkJCQkgKiAodGhpcyBjb3VsZCBiZSBtb3JlIG9yIGxlc3MgdGhhbiAnYmxvY2tzaXplJyEpICovCisJCQkJCQl3TkFGX2xlbltpXSA9IHRtcF9sZW47CisJCQkJCQorCQkJCQl3TkFGW2kgKyAxXSA9IE5VTEw7CisJCQkJCXdOQUZbaV0gPSBPUEVOU1NMX21hbGxvYyh3TkFGX2xlbltpXSk7CisJCQkJCWlmICh3TkFGW2ldID09IE5VTEwpCisJCQkJCQl7CisJCQkJCQlFQ2VycihFQ19GX0VDX1dOQUZfTVVMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJCQlPUEVOU1NMX2ZyZWUodG1wX3dOQUYpOworCQkJCQkJZ290byBlcnI7CisJCQkJCQl9CisJCQkJCW1lbWNweSh3TkFGW2ldLCBwcCwgd05BRl9sZW5baV0pOworCQkJCQlpZiAod05BRl9sZW5baV0gPiBtYXhfbGVuKQorCQkJCQkJbWF4X2xlbiA9IHdOQUZfbGVuW2ldOworCisJCQkJCWlmICgqdG1wX3BvaW50cyA9PSBOVUxMKQorCQkJCQkJeworCQkJCQkJRUNlcnIoRUNfRl9FQ19XTkFGX01VTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCQkJT1BFTlNTTF9mcmVlKHRtcF93TkFGKTsKKwkJCQkJCWdvdG8gZXJyOworCQkJCQkJfQorCQkJCQl2YWxfc3ViW2ldID0gdG1wX3BvaW50czsKKwkJCQkJdG1wX3BvaW50cyArPSBwcmVfcG9pbnRzX3Blcl9ibG9jazsKKwkJCQkJcHAgKz0gYmxvY2tzaXplOworCQkJCQl9CisJCQkJT1BFTlNTTF9mcmVlKHRtcF93TkFGKTsKKwkJCQl9CisJCQl9CisJCX0KKworCS8qIEFsbCBwb2ludHMgd2UgcHJlY29tcHV0ZSBub3cgZ28gaW50byBhIHNpbmdsZSBhcnJheSAndmFsJy4KKwkgKiAndmFsX3N1YltpXScgaXMgYSBwb2ludGVyIHRvIHRoZSBzdWJhcnJheSBmb3IgdGhlIGktdGggcG9pbnQsCisJICogb3IgdG8gYSBzdWJhcnJheSBvZiAncHJlX2NvbXAtPnBvaW50cycgaWYgd2UgYWxyZWFkeSBoYXZlIHByZWNvbXB1dGF0aW9uLiAqLworCXZhbCA9IE9QRU5TU0xfbWFsbG9jKChudW1fdmFsICsgMSkgKiBzaXplb2YgdmFsWzBdKTsKKwlpZiAodmFsID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19XTkFGX01VTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCXZhbFtudW1fdmFsXSA9IE5VTEw7IC8qIHBpdm90IGVsZW1lbnQgKi8KKworCS8qIGFsbG9jYXRlIHBvaW50cyBmb3IgcHJlY29tcHV0YXRpb24gKi8KKwl2ID0gdmFsOworCWZvciAoaSA9IDA7IGkgPCBudW0gKyBudW1fc2NhbGFyOyBpKyspCisJCXsKKwkJdmFsX3N1YltpXSA9IHY7CisJCWZvciAoaiA9IDA7IGogPCAoKHNpemVfdCkxIDw8ICh3c2l6ZVtpXSAtIDEpKTsgaisrKQorCQkJeworCQkJKnYgPSBFQ19QT0lOVF9uZXcoZ3JvdXApOworCQkJaWYgKCp2ID09IE5VTEwpIGdvdG8gZXJyOworCQkJdisrOworCQkJfQorCQl9CisJaWYgKCEodiA9PSB2YWwgKyBudW1fdmFsKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX1dOQUZfTVVMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoISh0bXAgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSkKKwkJZ290byBlcnI7CisKKwkvKiBwcmVwYXJlIHByZWNvbXB1dGVkIHZhbHVlczoKKwkgKiAgICB2YWxfc3ViW2ldWzBdIDo9ICAgICBwb2ludHNbaV0KKwkgKiAgICB2YWxfc3ViW2ldWzFdIDo9IDMgKiBwb2ludHNbaV0KKwkgKiAgICB2YWxfc3ViW2ldWzJdIDo9IDUgKiBwb2ludHNbaV0KKwkgKiAgICAuLi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtICsgbnVtX3NjYWxhcjsgaSsrKQorCQl7CisJCWlmIChpIDwgbnVtKQorCQkJeworCQkJaWYgKCFFQ19QT0lOVF9jb3B5KHZhbF9zdWJbaV1bMF0sIHBvaW50c1tpXSkpIGdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoIUVDX1BPSU5UX2NvcHkodmFsX3N1YltpXVswXSwgZ2VuZXJhdG9yKSkgZ290byBlcnI7CisJCQl9CisKKwkJaWYgKHdzaXplW2ldID4gMSkKKwkJCXsKKwkJCWlmICghRUNfUE9JTlRfZGJsKGdyb3VwLCB0bXAsIHZhbF9zdWJbaV1bMF0sIGN0eCkpIGdvdG8gZXJyOworCQkJZm9yIChqID0gMTsgaiA8ICgoc2l6ZV90KTEgPDwgKHdzaXplW2ldIC0gMSkpOyBqKyspCisJCQkJeworCQkJCWlmICghRUNfUE9JTlRfYWRkKGdyb3VwLCB2YWxfc3ViW2ldW2pdLCB2YWxfc3ViW2ldW2ogLSAxXSwgdG1wLCBjdHgpKSBnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCX0KKworI2lmIDEgLyogb3B0aW9uYWw7IEVDX3dpbmRvd19iaXRzX2Zvcl9zY2FsYXJfc2l6ZSBhc3N1bWVzIHdlIGRvIHRoaXMgc3RlcCAqLworCWlmICghRUNfUE9JTlRzX21ha2VfYWZmaW5lKGdyb3VwLCBudW1fdmFsLCB2YWwsIGN0eCkpCisJCWdvdG8gZXJyOworI2VuZGlmCisKKwlyX2lzX2F0X2luZmluaXR5ID0gMTsKKworCWZvciAoayA9IG1heF9sZW4gLSAxOyBrID49IDA7IGstLSkKKwkJeworCQlpZiAoIXJfaXNfYXRfaW5maW5pdHkpCisJCQl7CisJCQlpZiAoIUVDX1BPSU5UX2RibChncm91cCwgciwgciwgY3R4KSkgZ290byBlcnI7CisJCQl9CisJCQorCQlmb3IgKGkgPSAwOyBpIDwgdG90YWxudW07IGkrKykKKwkJCXsKKwkJCWlmICh3TkFGX2xlbltpXSA+IChzaXplX3QpaykKKwkJCQl7CisJCQkJaW50IGRpZ2l0ID0gd05BRltpXVtrXTsKKwkJCQlpbnQgaXNfbmVnOworCisJCQkJaWYgKGRpZ2l0KSAKKwkJCQkJeworCQkJCQlpc19uZWcgPSBkaWdpdCA8IDA7CisKKwkJCQkJaWYgKGlzX25lZykKKwkJCQkJCWRpZ2l0ID0gLWRpZ2l0OworCisJCQkJCWlmIChpc19uZWcgIT0gcl9pc19pbnZlcnRlZCkKKwkJCQkJCXsKKwkJCQkJCWlmICghcl9pc19hdF9pbmZpbml0eSkKKwkJCQkJCQl7CisJCQkJCQkJaWYgKCFFQ19QT0lOVF9pbnZlcnQoZ3JvdXAsIHIsIGN0eCkpIGdvdG8gZXJyOworCQkJCQkJCX0KKwkJCQkJCXJfaXNfaW52ZXJ0ZWQgPSAhcl9pc19pbnZlcnRlZDsKKwkJCQkJCX0KKworCQkJCQkvKiBkaWdpdCA+IDAgKi8KKworCQkJCQlpZiAocl9pc19hdF9pbmZpbml0eSkKKwkJCQkJCXsKKwkJCQkJCWlmICghRUNfUE9JTlRfY29weShyLCB2YWxfc3ViW2ldW2RpZ2l0ID4+IDFdKSkgZ290byBlcnI7CisJCQkJCQlyX2lzX2F0X2luZmluaXR5ID0gMDsKKwkJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJaWYgKCFFQ19QT0lOVF9hZGQoZ3JvdXAsIHIsIHIsIHZhbF9zdWJbaV1bZGlnaXQgPj4gMV0sIGN0eCkpIGdvdG8gZXJyOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAocl9pc19hdF9pbmZpbml0eSkKKwkJeworCQlpZiAoIUVDX1BPSU5UX3NldF90b19pbmZpbml0eShncm91cCwgcikpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmIChyX2lzX2ludmVydGVkKQorCQkJaWYgKCFFQ19QT0lOVF9pbnZlcnQoZ3JvdXAsIHIsIGN0eCkpIGdvdG8gZXJyOworCQl9CisJCisJcmV0ID0gMTsKKworIGVycjoKKwlpZiAobmV3X2N0eCAhPSBOVUxMKQorCQlCTl9DVFhfZnJlZShuZXdfY3R4KTsKKwlpZiAodG1wICE9IE5VTEwpCisJCUVDX1BPSU5UX2ZyZWUodG1wKTsKKwlpZiAod3NpemUgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKHdzaXplKTsKKwlpZiAod05BRl9sZW4gIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKHdOQUZfbGVuKTsKKwlpZiAod05BRiAhPSBOVUxMKQorCQl7CisJCXNpZ25lZCBjaGFyICoqdzsKKwkJCisJCWZvciAodyA9IHdOQUY7ICp3ICE9IE5VTEw7IHcrKykKKwkJCU9QRU5TU0xfZnJlZSgqdyk7CisJCQorCQlPUEVOU1NMX2ZyZWUod05BRik7CisJCX0KKwlpZiAodmFsICE9IE5VTEwpCisJCXsKKwkJZm9yICh2ID0gdmFsOyAqdiAhPSBOVUxMOyB2KyspCisJCQlFQ19QT0lOVF9jbGVhcl9mcmVlKCp2KTsKKworCQlPUEVOU1NMX2ZyZWUodmFsKTsKKwkJfQorCWlmICh2YWxfc3ViICE9IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHZhbF9zdWIpOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogZWNfd05BRl9wcmVjb21wdXRlX211bHQoKQorICogY3JlYXRlcyBhbiBFQ19QUkVfQ09NUCBvYmplY3Qgd2l0aCBwcmVwcmVjb21wdXRlZCBtdWx0aXBsZXMgb2YgdGhlIGdlbmVyYXRvcgorICogZm9yIHVzZSB3aXRoIHdOQUYgc3BsaXR0aW5nIGFzIGltcGxlbWVudGVkIGluIGVjX3dOQUZfbXVsKCkuCisgKiAKKyAqICdwcmVfY29tcC0+cG9pbnRzJyBpcyBhbiBhcnJheSBvZiBtdWx0aXBsZXMgb2YgdGhlIGdlbmVyYXRvcgorICogb2YgdGhlIGZvbGxvd2luZyBmb3JtOgorICogcG9pbnRzWzBdID0gICAgIGdlbmVyYXRvcjsKKyAqIHBvaW50c1sxXSA9IDMgKiBnZW5lcmF0b3I7CisgKiAuLi4KKyAqIHBvaW50c1syXih3LTEpLTFdID0gICAgICgyXih3LTEpLTEpICogZ2VuZXJhdG9yOworICogcG9pbnRzWzJeKHctMSldICAgPSAgICAgMl5ibG9ja3NpemUgKiBnZW5lcmF0b3I7CisgKiBwb2ludHNbMl4ody0xKSsxXSA9IDMgKiAyXmJsb2Nrc2l6ZSAqIGdlbmVyYXRvcjsKKyAqIC4uLgorICogcG9pbnRzWzJeKHctMSkqKG51bWJsb2Nrcy0xKS0xXSA9ICgyXih3LTEpKSAqICAyXihibG9ja3NpemUqKG51bWJsb2Nrcy0yKSkgKiBnZW5lcmF0b3IKKyAqIHBvaW50c1syXih3LTEpKihudW1ibG9ja3MtMSldICAgPSAgICAgICAgICAgICAgMl4oYmxvY2tzaXplKihudW1ibG9ja3MtMSkpICogZ2VuZXJhdG9yCisgKiAuLi4KKyAqIHBvaW50c1syXih3LTEpKm51bWJsb2Nrcy0xXSAgICAgPSAoMl4ody0xKSkgKiAgMl4oYmxvY2tzaXplKihudW1ibG9ja3MtMSkpICogZ2VuZXJhdG9yCisgKiBwb2ludHNbMl4ody0xKSpudW1ibG9ja3NdICAgICAgID0gTlVMTAorICovCitpbnQgZWNfd05BRl9wcmVjb21wdXRlX211bHQoRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKmN0eCkKKwl7CisJY29uc3QgRUNfUE9JTlQgKmdlbmVyYXRvcjsKKwlFQ19QT0lOVCAqdG1wX3BvaW50ID0gTlVMTCwgKmJhc2UgPSBOVUxMLCAqKnZhcjsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCUJJR05VTSAqb3JkZXI7CisJc2l6ZV90IGksIGJpdHMsIHcsIHByZV9wb2ludHNfcGVyX2Jsb2NrLCBibG9ja3NpemUsIG51bWJsb2NrcywgbnVtOworCUVDX1BPSU5UICoqcG9pbnRzID0gTlVMTDsKKwlFQ19QUkVfQ09NUCAqcHJlX2NvbXA7CisJaW50IHJldCA9IDA7CisKKwkvKiBpZiB0aGVyZSBpcyBhbiBvbGQgRUNfUFJFX0NPTVAgb2JqZWN0LCB0aHJvdyBpdCBhd2F5ICovCisJRUNfRVhfREFUQV9mcmVlX2RhdGEoJmdyb3VwLT5leHRyYV9kYXRhLCBlY19wcmVfY29tcF9kdXAsIGVjX3ByZV9jb21wX2ZyZWUsIGVjX3ByZV9jb21wX2NsZWFyX2ZyZWUpOworCisJaWYgKChwcmVfY29tcCA9IGVjX3ByZV9jb21wX25ldyhncm91cCkpID09IE5VTEwpCisJCXJldHVybiAwOworCisJZ2VuZXJhdG9yID0gRUNfR1JPVVBfZ2V0MF9nZW5lcmF0b3IoZ3JvdXApOworCWlmIChnZW5lcmF0b3IgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX1dOQUZfUFJFQ09NUFVURV9NVUxULCBFQ19SX1VOREVGSU5FRF9HRU5FUkFUT1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKGN0eCA9PSBOVUxMKQorCQl7CisJCWN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisJCWlmIChjdHggPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQl9CisJCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJb3JkZXIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKG9yZGVyID09IE5VTEwpIGdvdG8gZXJyOworCQorCWlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCBvcmRlciwgY3R4KSkgZ290byBlcnI7CQkKKwlpZiAoQk5faXNfemVybyhvcmRlcikpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19XTkFGX1BSRUNPTVBVVEVfTVVMVCwgRUNfUl9VTktOT1dOX09SREVSKTsKKwkJZ290byBlcnI7CisJCX0KKworCWJpdHMgPSBCTl9udW1fYml0cyhvcmRlcik7CisJLyogVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIG1lYW4gd2UgcHJlY29tcHV0ZSAoYXBwcm94aW1hdGVseSkKKwkgKiBvbmUgcG9pbnQgcGVyIGJpdC4KKwkgKgorCSAqIFRCRDogVGhlIGNvbWJpbmF0aW9uICA4LCA0ICBpcyBwZXJmZWN0IGZvciAxNjAgYml0czsgZm9yIG90aGVyCisJICogYml0IGxlbmd0aHMsIG90aGVyIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgbWlnaHQgcHJvdmlkZSBiZXR0ZXIKKwkgKiBlZmZpY2llbmN5LgorCSAqLworCWJsb2Nrc2l6ZSA9IDg7CisJdyA9IDQ7CisJaWYgKEVDX3dpbmRvd19iaXRzX2Zvcl9zY2FsYXJfc2l6ZShiaXRzKSA+IHcpCisJCXsKKwkJLyogbGV0J3Mgbm90IG1ha2UgdGhlIHdpbmRvdyB0b28gc21hbGwgLi4uICovCisJCXcgPSBFQ193aW5kb3dfYml0c19mb3Jfc2NhbGFyX3NpemUoYml0cyk7CisJCX0KKworCW51bWJsb2NrcyA9IChiaXRzICsgYmxvY2tzaXplIC0gMSkgLyBibG9ja3NpemU7IC8qIG1heC4gbnVtYmVyIG9mIGJsb2NrcyB0byB1c2UgZm9yIHdOQUYgc3BsaXR0aW5nICovCisJCisJcHJlX3BvaW50c19wZXJfYmxvY2sgPSAoc2l6ZV90KTEgPDwgKHcgLSAxKTsKKwludW0gPSBwcmVfcG9pbnRzX3Blcl9ibG9jayAqIG51bWJsb2NrczsgLyogbnVtYmVyIG9mIHBvaW50cyB0byBjb21wdXRlIGFuZCBzdG9yZSAqLworCisJcG9pbnRzID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mIChFQ19QT0lOVCopKihudW0gKyAxKSk7CisJaWYgKCFwb2ludHMpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19XTkFGX1BSRUNPTVBVVEVfTVVMVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJdmFyID0gcG9pbnRzOworCXZhcltudW1dID0gTlVMTDsgLyogcGl2b3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCXsKKwkJaWYgKCh2YXJbaV0gPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSA9PSBOVUxMKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19XTkFGX1BSRUNPTVBVVEVfTVVMVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCWlmICghKHRtcF9wb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCkpIHx8ICEoYmFzZSA9IEVDX1BPSU5UX25ldyhncm91cCkpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfV05BRl9QUkVDT01QVVRFX01VTFQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0JCisJCisJaWYgKCFFQ19QT0lOVF9jb3B5KGJhc2UsIGdlbmVyYXRvcikpCisJCWdvdG8gZXJyOworCQorCS8qIGRvIHRoZSBwcmVjb21wdXRhdGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBudW1ibG9ja3M7IGkrKykKKwkJeworCQlzaXplX3QgajsKKworCQlpZiAoIUVDX1BPSU5UX2RibChncm91cCwgdG1wX3BvaW50LCBiYXNlLCBjdHgpKQorCQkJZ290byBlcnI7CisKKwkJaWYgKCFFQ19QT0lOVF9jb3B5KCp2YXIrKywgYmFzZSkpCisJCQlnb3RvIGVycjsKKworCQlmb3IgKGogPSAxOyBqIDwgcHJlX3BvaW50c19wZXJfYmxvY2s7IGorKywgdmFyKyspCisJCQl7CisJCQkvKiBjYWxjdWxhdGUgb2RkIG11bHRpcGxlcyBvZiB0aGUgY3VycmVudCBiYXNlIHBvaW50ICovCisJCQlpZiAoIUVDX1BPSU5UX2FkZChncm91cCwgKnZhciwgdG1wX3BvaW50LCAqKHZhciAtIDEpLCBjdHgpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChpIDwgbnVtYmxvY2tzIC0gMSkKKwkJCXsKKwkJCS8qIGdldCB0aGUgbmV4dCBiYXNlIChtdWx0aXBseSBjdXJyZW50IG9uZSBieSAyXmJsb2Nrc2l6ZSkgKi8KKwkJCXNpemVfdCBrOworCisJCQlpZiAoYmxvY2tzaXplIDw9IDIpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfV05BRl9QUkVDT01QVVRFX01VTFQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CQkJCQorCisJCQlpZiAoIUVDX1BPSU5UX2RibChncm91cCwgYmFzZSwgdG1wX3BvaW50LCBjdHgpKQorCQkJCWdvdG8gZXJyOworCQkJZm9yIChrID0gMjsgayA8IGJsb2Nrc2l6ZTsgaysrKQorCQkJCXsKKwkJCQlpZiAoIUVDX1BPSU5UX2RibChncm91cCxiYXNlLGJhc2UsY3R4KSkKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorIAkJfQorCisJaWYgKCFFQ19QT0lOVHNfbWFrZV9hZmZpbmUoZ3JvdXAsIG51bSwgcG9pbnRzLCBjdHgpKQorCQlnb3RvIGVycjsKKwkKKwlwcmVfY29tcC0+Z3JvdXAgPSBncm91cDsKKwlwcmVfY29tcC0+YmxvY2tzaXplID0gYmxvY2tzaXplOworCXByZV9jb21wLT5udW1ibG9ja3MgPSBudW1ibG9ja3M7CisJcHJlX2NvbXAtPncgPSB3OworCXByZV9jb21wLT5wb2ludHMgPSBwb2ludHM7CisJcG9pbnRzID0gTlVMTDsKKwlwcmVfY29tcC0+bnVtID0gbnVtOworCisJaWYgKCFFQ19FWF9EQVRBX3NldF9kYXRhKCZncm91cC0+ZXh0cmFfZGF0YSwgcHJlX2NvbXAsCisJCWVjX3ByZV9jb21wX2R1cCwgZWNfcHJlX2NvbXBfZnJlZSwgZWNfcHJlX2NvbXBfY2xlYXJfZnJlZSkpCisJCWdvdG8gZXJyOworCXByZV9jb21wID0gTlVMTDsKKworCXJldCA9IDE7CisgZXJyOgorCWlmIChjdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCWlmIChwcmVfY29tcCkKKwkJZWNfcHJlX2NvbXBfZnJlZShwcmVfY29tcCk7CisJaWYgKHBvaW50cykKKwkJeworCQlFQ19QT0lOVCAqKnA7CisKKwkJZm9yIChwID0gcG9pbnRzOyAqcCAhPSBOVUxMOyBwKyspCisJCQlFQ19QT0lOVF9mcmVlKCpwKTsKKwkJT1BFTlNTTF9mcmVlKHBvaW50cyk7CisJCX0KKwlpZiAodG1wX3BvaW50KQorCQlFQ19QT0lOVF9mcmVlKHRtcF9wb2ludCk7CisJaWYgKGJhc2UpCisJCUVDX1BPSU5UX2ZyZWUoYmFzZSk7CisJcmV0dXJuIHJldDsKKwl9CisKKworaW50IGVjX3dOQUZfaGF2ZV9wcmVjb21wdXRlX211bHQoY29uc3QgRUNfR1JPVVAgKmdyb3VwKQorCXsKKwlpZiAoRUNfRVhfREFUQV9nZXRfZGF0YShncm91cC0+ZXh0cmFfZGF0YSwgZWNfcHJlX2NvbXBfZHVwLCBlY19wcmVfY29tcF9mcmVlLCBlY19wcmVfY29tcF9jbGVhcl9mcmVlKSAhPSBOVUxMKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19wbWV0aC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX3BtZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzMzA3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY19wbWV0aC5jCkBAIC0wLDAgKzEsMzQwIEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKworLyogRUMgcGtleSBjb250ZXh0IHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwkvKiBLZXkgYW5kIHBhcmFtZ2VuIGdyb3VwICovCisJRUNfR1JPVVAgKmdlbl9ncm91cDsKKwkvKiBtZXNzYWdlIGRpZ2VzdCAqLworCWNvbnN0IEVWUF9NRCAqbWQ7CisJfSBFQ19QS0VZX0NUWDsKKworc3RhdGljIGludCBwa2V5X2VjX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCUVDX1BLRVlfQ1RYICpkY3R4OworCWRjdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfUEtFWV9DVFgpKTsKKwlpZiAoIWRjdHgpCisJCXJldHVybiAwOworCWRjdHgtPmdlbl9ncm91cCA9IE5VTEw7CisJZGN0eC0+bWQgPSBOVUxMOworCisJY3R4LT5kYXRhID0gZGN0eDsKKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBwa2V5X2VjX2NvcHkoRVZQX1BLRVlfQ1RYICpkc3QsIEVWUF9QS0VZX0NUWCAqc3JjKQorCXsKKwlFQ19QS0VZX0NUWCAqZGN0eCwgKnNjdHg7CisJaWYgKCFwa2V5X2VjX2luaXQoZHN0KSkKKwkJcmV0dXJuIDA7CisgICAgICAgCXNjdHggPSBzcmMtPmRhdGE7CisJZGN0eCA9IGRzdC0+ZGF0YTsKKwlpZiAoc2N0eC0+Z2VuX2dyb3VwKQorCQl7CisJCWRjdHgtPmdlbl9ncm91cCA9IEVDX0dST1VQX2R1cChzY3R4LT5nZW5fZ3JvdXApOworCQlpZiAoIWRjdHgtPmdlbl9ncm91cCkKKwkJCXJldHVybiAwOworCQl9CisJZGN0eC0+bWQgPSBzY3R4LT5tZDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyB2b2lkIHBrZXlfZWNfY2xlYW51cChFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJRUNfUEtFWV9DVFggKmRjdHggPSBjdHgtPmRhdGE7CisJaWYgKGRjdHgpCisJCXsKKwkJaWYgKGRjdHgtPmdlbl9ncm91cCkKKwkJCUVDX0dST1VQX2ZyZWUoZGN0eC0+Z2VuX2dyb3VwKTsKKwkJT1BFTlNTTF9mcmVlKGRjdHgpOworCQl9CisJfQorCitzdGF0aWMgaW50IHBrZXlfZWNfc2lnbihFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJzLCBzaXplX3QgdGJzbGVuKQorCXsKKwlpbnQgcmV0LCB0eXBlOworCXVuc2lnbmVkIGludCBzbHRtcDsKKwlFQ19QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKwlFQ19LRVkgKmVjID0gY3R4LT5wa2V5LT5wa2V5LmVjOworCisJaWYgKCFzaWcpCisJCXsKKwkJKnNpZ2xlbiA9IEVDRFNBX3NpemUoZWMpOworCQlyZXR1cm4gMTsKKwkJfQorCWVsc2UgaWYoKnNpZ2xlbiA8IChzaXplX3QpRUNEU0Ffc2l6ZShlYykpCisJCXsKKwkJRUNlcnIoRUNfRl9QS0VZX0VDX1NJR04sIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoZGN0eC0+bWQpCisJCXR5cGUgPSBFVlBfTURfdHlwZShkY3R4LT5tZCk7CisJZWxzZQorCQl0eXBlID0gTklEX3NoYTE7CisKKworCXJldCA9IEVDRFNBX3NpZ24odHlwZSwgdGJzLCB0YnNsZW4sIHNpZywgJnNsdG1wLCBlYyk7CisKKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQ7CisJKnNpZ2xlbiA9IChzaXplX3Qpc2x0bXA7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IHBrZXlfZWNfdmVyaWZ5KEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCBzaWdsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbikKKwl7CisJaW50IHJldCwgdHlwZTsKKwlFQ19QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKwlFQ19LRVkgKmVjID0gY3R4LT5wa2V5LT5wa2V5LmVjOworCisJaWYgKGRjdHgtPm1kKQorCQl0eXBlID0gRVZQX01EX3R5cGUoZGN0eC0+bWQpOworCWVsc2UKKwkJdHlwZSA9IE5JRF9zaGExOworCisJcmV0ID0gRUNEU0FfdmVyaWZ5KHR5cGUsIHRicywgdGJzbGVuLCBzaWcsIHNpZ2xlbiwgZWMpOworCisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9lY19kZXJpdmUoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgc2l6ZV90ICprZXlsZW4pCisJeworCWludCByZXQ7CisJc2l6ZV90IG91dGxlbjsKKwljb25zdCBFQ19QT0lOVCAqcHVia2V5ID0gTlVMTDsKKwlpZiAoIWN0eC0+cGtleSB8fCAhY3R4LT5wZWVya2V5KQorCQl7CisJCUVDZXJyKEVDX0ZfUEtFWV9FQ19ERVJJVkUsIEVDX1JfS0VZU19OT1RfU0VUKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmICgha2V5KQorCQl7CisJCWNvbnN0IEVDX0dST1VQICpncm91cDsKKwkJZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChjdHgtPnBrZXktPnBrZXkuZWMpOworCQkqa2V5bGVuID0gKEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApICsgNykvODsKKwkJcmV0dXJuIDE7CisJCX0KKworCXB1YmtleSA9IEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoY3R4LT5wZWVya2V5LT5wa2V5LmVjKTsKKworCS8qIE5COiB1bmxpa2UgUEtTIzMgREgsIGlmICpvdXRsZW4gaXMgbGVzcyB0aGFuIG1heGltdW0gc2l6ZSB0aGlzIGlzCisJICogbm90IGFuIGVycm9yLCB0aGUgcmVzdWx0IGlzIHRydW5jYXRlZC4KKwkgKi8KKworCW91dGxlbiA9ICprZXlsZW47CisJCQorCXJldCA9IEVDREhfY29tcHV0ZV9rZXkoa2V5LCBvdXRsZW4sIHB1YmtleSwgY3R4LT5wa2V5LT5wa2V5LmVjLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqa2V5bGVuID0gcmV0OworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBwa2V5X2VjX2N0cmwoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKQorCXsKKwlFQ19QS0VZX0NUWCAqZGN0eCA9IGN0eC0+ZGF0YTsKKwlFQ19HUk9VUCAqZ3JvdXA7CisJc3dpdGNoICh0eXBlKQorCQl7CisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9FQ19QQVJBTUdFTl9DVVJWRV9OSUQ6CisJCWdyb3VwID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUocDEpOworCQlpZiAoZ3JvdXAgPT0gTlVMTCkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfUEtFWV9FQ19DVFJMLCBFQ19SX0lOVkFMSURfQ1VSVkUpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmIChkY3R4LT5nZW5fZ3JvdXApCisJCQlFQ19HUk9VUF9mcmVlKGRjdHgtPmdlbl9ncm91cCk7CisJCWRjdHgtPmdlbl9ncm91cCA9IGdyb3VwOworCQlyZXR1cm4gMTsKKworCQljYXNlIEVWUF9QS0VZX0NUUkxfTUQ6CisJCWlmIChFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGExICYmCisJCSAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGEyMjQgJiYKKwkJICAgIEVWUF9NRF90eXBlKChjb25zdCBFVlBfTUQgKilwMikgIT0gTklEX3NoYTI1NiAmJgorCQkgICAgRVZQX01EX3R5cGUoKGNvbnN0IEVWUF9NRCAqKXAyKSAhPSBOSURfc2hhMzg0ICYmCisJCSAgICBFVlBfTURfdHlwZSgoY29uc3QgRVZQX01EICopcDIpICE9IE5JRF9zaGE1MTIpCisJCQl7CisJCQlFQ2VycihFQ19GX1BLRVlfRUNfQ1RSTCwgRUNfUl9JTlZBTElEX0RJR0VTVF9UWVBFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlkY3R4LT5tZCA9IHAyOworCQlyZXR1cm4gMTsKKworCQljYXNlIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVk6CisJCS8qIERlZmF1bHQgYmVoYXZpb3VyIGlzIE9LICovCisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklUOgorCQljYXNlIEVWUF9QS0VZX0NUUkxfUEtDUzdfU0lHTjoKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX0NNU19TSUdOOgorCQlyZXR1cm4gMTsKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gLTI7CisKKwkJfQorCX0KKwkJCQorc3RhdGljIGludCBwa2V5X2VjX2N0cmxfc3RyKEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqdmFsdWUpCisJeworCWlmICghc3RyY21wKHR5cGUsICJlY19wYXJhbWdlbl9jdXJ2ZSIpKQorCQl7CisJCWludCBuaWQ7CisJCW5pZCA9IE9CSl9zbjJuaWQodmFsdWUpOworCQlpZiAobmlkID09IE5JRF91bmRlZikKKwkJCW5pZCA9IE9CSl9sbjJuaWQodmFsdWUpOworCQlpZiAobmlkID09IE5JRF91bmRlZikKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfUEtFWV9FQ19DVFJMX1NUUiwgRUNfUl9JTlZBTElEX0NVUlZFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlyZXR1cm4gRVZQX1BLRVlfQ1RYX3NldF9lY19wYXJhbWdlbl9jdXJ2ZV9uaWQoY3R4LCBuaWQpOworCQl9CisJcmV0dXJuIC0yOworCX0KKworc3RhdGljIGludCBwa2V5X2VjX3BhcmFtZ2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSkKKwl7CisJRUNfS0VZICplYyA9IE5VTEw7CisJRUNfUEtFWV9DVFggKmRjdHggPSBjdHgtPmRhdGE7CisJaW50IHJldCA9IDA7CisJaWYgKGRjdHgtPmdlbl9ncm91cCA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfUEtFWV9FQ19QQVJBTUdFTiwgRUNfUl9OT19QQVJBTUVURVJTX1NFVCk7CisJCXJldHVybiAwOworCQl9CisJZWMgPSBFQ19LRVlfbmV3KCk7CisJaWYgKCFlYykKKwkJcmV0dXJuIDA7CisJcmV0ID0gRUNfS0VZX3NldF9ncm91cChlYywgZGN0eC0+Z2VuX2dyb3VwKTsKKwlpZiAocmV0KQorCQlFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVjKTsKKwllbHNlCisJCUVDX0tFWV9mcmVlKGVjKTsKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIGludCBwa2V5X2VjX2tleWdlbihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpCisJeworCUVDX0tFWSAqZWMgPSBOVUxMOworCWlmIChjdHgtPnBrZXkgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX1BLRVlfRUNfS0VZR0VOLCBFQ19SX05PX1BBUkFNRVRFUlNfU0VUKTsKKwkJcmV0dXJuIDA7CisJCX0KKwllYyA9IEVDX0tFWV9uZXcoKTsKKwlpZiAoIWVjKQorCQlyZXR1cm4gMDsKKwlFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksIGVjKTsKKwkvKiBOb3RlOiBpZiBlcnJvciByZXR1cm4sIHBrZXkgaXMgZnJlZWQgYnkgcGFyZW50IHJvdXRpbmUgKi8KKwlpZiAoIUVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhwa2V5LCBjdHgtPnBrZXkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gRUNfS0VZX2dlbmVyYXRlX2tleShwa2V5LT5wa2V5LmVjKTsKKwl9CisKK2NvbnN0IEVWUF9QS0VZX01FVEhPRCBlY19wa2V5X21ldGggPSAKKwl7CisJRVZQX1BLRVlfRUMsCisJMCwKKwlwa2V5X2VjX2luaXQsCisJcGtleV9lY19jb3B5LAorCXBrZXlfZWNfY2xlYW51cCwKKworCTAsCisJcGtleV9lY19wYXJhbWdlbiwKKworCTAsCisJcGtleV9lY19rZXlnZW4sCisKKwkwLAorCXBrZXlfZWNfc2lnbiwKKworCTAsCisJcGtleV9lY192ZXJpZnksCisKKwkwLDAsCisKKwkwLDAsMCwwLAorCisJMCwwLAorCisJMCwwLAorCisJMCwKKwlwa2V5X2VjX2Rlcml2ZSwKKworCXBrZXlfZWNfY3RybCwKKwlwa2V5X2VjX2N0cmxfc3RyCisKKwl9OwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX3ByaW50LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWNfcHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2M4YTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjX3ByaW50LmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qIGNyeXB0by9lYy9lY19wcmludC5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSAiZWNfbGNsLmgiCisKK0JJR05VTSAqRUNfUE9JTlRfcG9pbnQyYm4oY29uc3QgRUNfR1JPVVAgKmdyb3VwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUNfUE9JTlQgKnBvaW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY29udmVyc2lvbl9mb3JtX3QgZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQklHTlVNICpyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KQorCXsKKwlzaXplX3QgICAgICAgIGJ1Zl9sZW49MDsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisKKwlidWZfbGVuID0gRUNfUE9JTlRfcG9pbnQyb2N0KGdyb3VwLCBwb2ludCwgZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBjdHgpOworCWlmIChidWZfbGVuID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKChidWYgPSBPUEVOU1NMX21hbGxvYyhidWZfbGVuKSkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIUVDX1BPSU5UX3BvaW50Mm9jdChncm91cCwgcG9pbnQsIGZvcm0sIGJ1ZiwgYnVmX2xlbiwgY3R4KSkKKwkJeworCQlPUEVOU1NMX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldCA9IEJOX2JpbjJibihidWYsIGJ1Zl9sZW4sIHJldCk7CisKKwlPUEVOU1NMX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK0VDX1BPSU5UICpFQ19QT0lOVF9ibjJwb2ludChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQklHTlVNICpibiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19QT0lOVCAqcG9pbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KQorCXsKKwlzaXplX3QgICAgICAgIGJ1Zl9sZW49MDsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJRUNfUE9JTlQgICAgICAqcmV0OworCisJaWYgKChidWZfbGVuID0gQk5fbnVtX2J5dGVzKGJuKSkgPT0gMCkgcmV0dXJuIE5VTEw7CisJYnVmID0gT1BFTlNTTF9tYWxsb2MoYnVmX2xlbik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghQk5fYm4yYmluKGJuLCBidWYpKSAKKwkJeworCQlPUEVOU1NMX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCWlmIChwb2ludCA9PSBOVUxMKQorCQl7CisJCWlmICgocmV0ID0gRUNfUE9JTlRfbmV3KGdyb3VwKSkgPT0gTlVMTCkKKwkJCXsKKwkJCU9QRU5TU0xfZnJlZShidWYpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwllbHNlCisJCXJldCA9IHBvaW50OworCisJaWYgKCFFQ19QT0lOVF9vY3QycG9pbnQoZ3JvdXAsIHJldCwgYnVmLCBidWZfbGVuLCBjdHgpKQorCQl7CisJCWlmIChwb2ludCA9PSBOVUxMKQorCQkJRUNfUE9JTlRfY2xlYXJfZnJlZShyZXQpOworCQlPUEVOU1NMX2ZyZWUoYnVmKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCU9QRU5TU0xfZnJlZShidWYpOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgY29uc3QgY2hhciAqSEVYX0RJR0lUUyA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKworLyogdGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGZyZWVkICh1c2luZyBPUEVOU1NMX2ZyZWUoKSkgKi8KK2NoYXIgKkVDX1BPSU5UX3BvaW50MmhleChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRUNfUE9JTlQgKnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQk5fQ1RYICpjdHgpCisJeworCWNoYXIgICAgICAgICAgKnJldCwgKnA7CisJc2l6ZV90ICAgICAgICBidWZfbGVuPTAsaTsKKwl1bnNpZ25lZCBjaGFyICpidWYsICpwYnVmOworCisJYnVmX2xlbiA9IEVDX1BPSU5UX3BvaW50Mm9jdChncm91cCwgcG9pbnQsIGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgY3R4KTsKKwlpZiAoYnVmX2xlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICgoYnVmID0gT1BFTlNTTF9tYWxsb2MoYnVmX2xlbikpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFFQ19QT0lOVF9wb2ludDJvY3QoZ3JvdXAsIHBvaW50LCBmb3JtLCBidWYsIGJ1Zl9sZW4sIGN0eCkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGJ1Zik7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXQgPSAoY2hhciAqKU9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4qMisyKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGJ1Zik7CisJCXJldHVybiBOVUxMOworCQl9CisJcCA9IHJldDsKKwlwYnVmID0gYnVmOworCWZvciAoaT1idWZfbGVuOyBpID4gMDsgaS0tKQorCQl7CisJCQlpbnQgdiA9IChpbnQpICoocGJ1ZisrKTsKKwkJCSoocCsrKT1IRVhfRElHSVRTW3Y+PjRdOworCQkJKihwKyspPUhFWF9ESUdJVFNbdiYweDBGXTsKKwkJfQorCSpwPSdcMCc7CisKKwlPUEVOU1NMX2ZyZWUoYnVmKTsKKworCXJldHVybiByZXQ7CisJfQorCitFQ19QT0lOVCAqRUNfUE9JTlRfaGV4MnBvaW50KGNvbnN0IEVDX0dST1VQICpncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19QT0lOVCAqcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJOX0NUWCAqY3R4KQorCXsKKwlFQ19QT0lOVCAqcmV0PU5VTEw7CisJQklHTlVNICAgKnRtcF9ibj1OVUxMOworCisJaWYgKCFCTl9oZXgyYm4oJnRtcF9ibiwgYnVmKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBFQ19QT0lOVF9ibjJwb2ludChncm91cCwgdG1wX2JuLCBwb2ludCwgY3R4KTsKKworCUJOX2NsZWFyX2ZyZWUodG1wX2JuKTsKKworCXJldHVybiByZXQ7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjL2Vja19wcm4uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY2tfcHJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QzZTE3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY2tfcHJuLmMKQEAgLTAsMCArMSwzOTEgQEAKKy8qIGNyeXB0by9lYy9lY2tfcHJuLmMgKi8KKy8qCisgKiBXcml0dGVuIGJ5IE5pbHMgTGFyc2NoIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBQb3J0aW9ucyBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgCisgKiBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgRUNQS1BhcmFtZXRlcnNfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IEVDX0dST1VQICp4LCBpbnQgb2ZmKQorCXsKKwlCSU8gKmI7CisJaW50IHJldDsKKworCWlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ1BLUEFSQU1FVEVSU19QUklOVF9GUCxFUlJfUl9CVUZfTElCKTsKKwkJcmV0dXJuKDApOworCQl9CisJQklPX3NldF9mcChiLCBmcCwgQklPX05PQ0xPU0UpOworCXJldCA9IEVDUEtQYXJhbWV0ZXJzX3ByaW50KGIsIHgsIG9mZik7CisJQklPX2ZyZWUoYik7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgRUNfS0VZX3ByaW50X2ZwKEZJTEUgKmZwLCBjb25zdCBFQ19LRVkgKngsIGludCBvZmYpCisJeworCUJJTyAqYjsKKwlpbnQgcmV0OworIAorCWlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19LRVlfUFJJTlRfRlAsIEVSUl9SX0JJT19MSUIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlCSU9fc2V0X2ZwKGIsIGZwLCBCSU9fTk9DTE9TRSk7CisJcmV0ID0gRUNfS0VZX3ByaW50KGIsIHgsIG9mZik7CisJQklPX2ZyZWUoYik7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgRUNQYXJhbWV0ZXJzX3ByaW50X2ZwKEZJTEUgKmZwLCBjb25zdCBFQ19LRVkgKngpCisJeworCUJJTyAqYjsKKwlpbnQgcmV0OworIAorCWlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ1BBUkFNRVRFUlNfUFJJTlRfRlAsIEVSUl9SX0JJT19MSUIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlCSU9fc2V0X2ZwKGIsIGZwLCBCSU9fTk9DTE9TRSk7CisJcmV0ID0gRUNQYXJhbWV0ZXJzX3ByaW50KGIsIHgpOworCUJJT19mcmVlKGIpOworCXJldHVybihyZXQpOworCX0KKyNlbmRpZgorCitpbnQgRUNfS0VZX3ByaW50KEJJTyAqYnAsIGNvbnN0IEVDX0tFWSAqeCwgaW50IG9mZikKKwl7CisJRVZQX1BLRVkgKnBrOworCWludCByZXQ7CisJcGsgPSBFVlBfUEtFWV9uZXcoKTsKKwlpZiAoIXBrIHx8ICFFVlBfUEtFWV9zZXQxX0VDX0tFWShwaywgKEVDX0tFWSAqKXgpKQorCQlyZXR1cm4gMDsKKwlyZXQgPSBFVlBfUEtFWV9wcmludF9wcml2YXRlKGJwLCBwaywgb2ZmLCBOVUxMKTsKKwlFVlBfUEtFWV9mcmVlKHBrKTsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEVDUGFyYW1ldGVyc19wcmludChCSU8gKmJwLCBjb25zdCBFQ19LRVkgKngpCisJeworCUVWUF9QS0VZICpwazsKKwlpbnQgcmV0OworCXBrID0gRVZQX1BLRVlfbmV3KCk7CisJaWYgKCFwayB8fCAhRVZQX1BLRVlfc2V0MV9FQ19LRVkocGssIChFQ19LRVkgKil4KSkKKwkJcmV0dXJuIDA7CisJcmV0ID0gRVZQX1BLRVlfcHJpbnRfcGFyYW1zKGJwLCBwaywgNCwgTlVMTCk7CisJRVZQX1BLRVlfZnJlZShwayk7CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgcHJpbnRfYmluKEJJTyAqZnAsIGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgdW5zaWduZWQgY2hhciAqbnVtLAorCQlzaXplX3QgbGVuLCBpbnQgb2ZmKTsKKworaW50IEVDUEtQYXJhbWV0ZXJzX3ByaW50KEJJTyAqYnAsIGNvbnN0IEVDX0dST1VQICp4LCBpbnQgb2ZmKQorCXsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI9TlVMTDsKKwlzaXplX3QJYnVmX2xlbj0wLCBpOworCWludCAgICAgcmV0PTAsIHJlYXNvbj1FUlJfUl9CSU9fTElCOworCUJOX0NUWCAgKmN0eD1OVUxMOworCWNvbnN0IEVDX1BPSU5UICpwb2ludD1OVUxMOworCUJJR05VTQkqcD1OVUxMLCAqYT1OVUxMLCAqYj1OVUxMLCAqZ2VuPU5VTEwsCisJCSpvcmRlcj1OVUxMLCAqY29mYWN0b3I9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzZWVkOworCXNpemVfdAlzZWVkX2xlbj0wOworCQorCXN0YXRpYyBjb25zdCBjaGFyICpnZW5fY29tcHJlc3NlZCA9ICJHZW5lcmF0b3IgKGNvbXByZXNzZWQpOiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmdlbl91bmNvbXByZXNzZWQgPSAiR2VuZXJhdG9yICh1bmNvbXByZXNzZWQpOiI7CisJc3RhdGljIGNvbnN0IGNoYXIgKmdlbl9oeWJyaWQgPSAiR2VuZXJhdG9yIChoeWJyaWQpOiI7CisgCisJaWYgKCF4KQorCQl7CisJCXJlYXNvbiA9IEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUjsKKwkJZ290byBlcnI7CisJCX0KKworCWN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJcmVhc29uID0gRVJSX1JfTUFMTE9DX0ZBSUxVUkU7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoRUNfR1JPVVBfZ2V0X2FzbjFfZmxhZyh4KSkKKwkJeworCQkvKiB0aGUgY3VydmUgcGFyYW1ldGVyIGFyZSBnaXZlbiBieSBhbiBhc24xIE9JRCAqLworCQlpbnQgbmlkOworCisJCWlmICghQklPX2luZGVudChicCwgb2ZmLCAxMjgpKQorCQkJZ290byBlcnI7CisKKwkJbmlkID0gRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoeCk7CisJCWlmIChuaWQgPT0gMCkKKwkJCWdvdG8gZXJyOworCisJCWlmIChCSU9fcHJpbnRmKGJwLCAiQVNOMSBPSUQ6ICVzIiwgT0JKX25pZDJzbihuaWQpKSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChCSU9fcHJpbnRmKGJwLCAiXG4iKSA8PSAwKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJLyogZXhwbGljaXQgcGFyYW1ldGVycyAqLworCQlpbnQgaXNfY2hhcl90d28gPSAwOworCQlwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtOworCQlpbnQgdG1wX25pZCA9IEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZShFQ19HUk9VUF9tZXRob2Rfb2YoeCkpOworCisJCWlmICh0bXBfbmlkID09IE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQpCisJCQlpc19jaGFyX3R3byA9IDE7CisKKwkJaWYgKChwID0gQk5fbmV3KCkpID09IE5VTEwgfHwgKGEgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAorCQkJKGIgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fCAob3JkZXIgPSBCTl9uZXcoKSkgPT0gTlVMTCB8fAorCQkJKGNvZmFjdG9yID0gQk5fbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlyZWFzb24gPSBFUlJfUl9NQUxMT0NfRkFJTFVSRTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChpc19jaGFyX3R3bykKKwkJCXsKKwkJCWlmICghRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0oeCwgcCwgYSwgYiwgY3R4KSkKKwkJCQl7CisJCQkJcmVhc29uID0gRVJSX1JfRUNfTElCOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJZWxzZSAvKiBwcmltZSBmaWVsZCAqLworCQkJeworCQkJaWYgKCFFQ19HUk9VUF9nZXRfY3VydmVfR0ZwKHgsIHAsIGEsIGIsIGN0eCkpCisJCQkJeworCQkJCXJlYXNvbiA9IEVSUl9SX0VDX0xJQjsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisKKwkJaWYgKChwb2ludCA9IEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKHgpKSA9PSBOVUxMKQorCQkJeworCQkJcmVhc29uID0gRVJSX1JfRUNfTElCOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmICghRUNfR1JPVVBfZ2V0X29yZGVyKHgsIG9yZGVyLCBOVUxMKSB8fCAKKyAgICAgICAgICAgIAkJIUVDX0dST1VQX2dldF9jb2ZhY3Rvcih4LCBjb2ZhY3RvciwgTlVMTCkpCisJCQl7CisJCQlyZWFzb24gPSBFUlJfUl9FQ19MSUI7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJCisJCWZvcm0gPSBFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKHgpOworCisJCWlmICgoZ2VuID0gRUNfUE9JTlRfcG9pbnQyYm4oeCwgcG9pbnQsIAorCQkJCWZvcm0sIE5VTEwsIGN0eCkpID09IE5VTEwpCisJCQl7CisJCQlyZWFzb24gPSBFUlJfUl9FQ19MSUI7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlidWZfbGVuID0gKHNpemVfdClCTl9udW1fYnl0ZXMocCk7CisJCWlmIChidWZfbGVuIDwgKGkgPSAoc2l6ZV90KUJOX251bV9ieXRlcyhhKSkpCisJCQlidWZfbGVuID0gaTsKKwkJaWYgKGJ1Zl9sZW4gPCAoaSA9IChzaXplX3QpQk5fbnVtX2J5dGVzKGIpKSkKKwkJCWJ1Zl9sZW4gPSBpOworCQlpZiAoYnVmX2xlbiA8IChpID0gKHNpemVfdClCTl9udW1fYnl0ZXMoZ2VuKSkpCisJCQlidWZfbGVuID0gaTsKKwkJaWYgKGJ1Zl9sZW4gPCAoaSA9IChzaXplX3QpQk5fbnVtX2J5dGVzKG9yZGVyKSkpCisJCQlidWZfbGVuID0gaTsKKwkJaWYgKGJ1Zl9sZW4gPCAoaSA9IChzaXplX3QpQk5fbnVtX2J5dGVzKGNvZmFjdG9yKSkpIAorCQkJYnVmX2xlbiA9IGk7CisKKwkJaWYgKChzZWVkID0gRUNfR1JPVVBfZ2V0MF9zZWVkKHgpKSAhPSBOVUxMKQorCQkJc2VlZF9sZW4gPSBFQ19HUk9VUF9nZXRfc2VlZF9sZW4oeCk7CisKKwkJYnVmX2xlbiArPSAxMDsKKwkJaWYgKChidWZmZXIgPSBPUEVOU1NMX21hbGxvYyhidWZfbGVuKSkgPT0gTlVMTCkKKwkJCXsKKwkJCXJlYXNvbiA9IEVSUl9SX01BTExPQ19GQUlMVVJFOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKCFCSU9faW5kZW50KGJwLCBvZmYsIDEyOCkpCisJCQlnb3RvIGVycjsKKworCQkvKiBwcmludCB0aGUgJ3Nob3J0IG5hbWUnIG9mIHRoZSBmaWVsZCB0eXBlICovCisJCWlmIChCSU9fcHJpbnRmKGJwLCAiRmllbGQgVHlwZTogJXNcbiIsIE9CSl9uaWQyc24odG1wX25pZCkpCisJCQk8PSAwKQorCQkJZ290byBlcnI7ICAKKworCQlpZiAoaXNfY2hhcl90d28pCisJCQl7CisJCQkvKiBwcmludCB0aGUgJ3Nob3J0IG5hbWUnIG9mIHRoZSBiYXNlIHR5cGUgT0lEICovCisJCQlpbnQgYmFzaXNfdHlwZSA9IEVDX0dST1VQX2dldF9iYXNpc190eXBlKHgpOworCQkJaWYgKGJhc2lzX3R5cGUgPT0gMCkKKwkJCQlnb3RvIGVycjsKKworCQkJaWYgKCFCSU9faW5kZW50KGJwLCBvZmYsIDEyOCkpCisJCQkJZ290byBlcnI7CisKKwkJCWlmIChCSU9fcHJpbnRmKGJwLCAiQmFzaXMgVHlwZTogJXNcbiIsIAorCQkJCU9CSl9uaWQyc24oYmFzaXNfdHlwZSkpIDw9IDApCisJCQkJZ290byBlcnI7CisKKwkJCS8qIHByaW50IHRoZSBwb2x5bm9taWFsICovCisJCQlpZiAoKHAgIT0gTlVMTCkgJiYgIUFTTjFfYm5fcHJpbnQoYnAsICJQb2x5bm9taWFsOiIsIHAsIGJ1ZmZlciwKKwkJCQlvZmYpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoKHAgIT0gTlVMTCkgJiYgIUFTTjFfYm5fcHJpbnQoYnAsICJQcmltZToiLCBwLCBidWZmZXIsb2ZmKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKChhICE9IE5VTEwpICYmICFBU04xX2JuX3ByaW50KGJwLCAiQTogICAiLCBhLCBidWZmZXIsIG9mZikpIAorCQkJZ290byBlcnI7CisJCWlmICgoYiAhPSBOVUxMKSAmJiAhQVNOMV9ibl9wcmludChicCwgIkI6ICAgIiwgYiwgYnVmZmVyLCBvZmYpKQorCQkJZ290byBlcnI7CisJCWlmIChmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCkKKwkJCXsKKwkJCWlmICgoZ2VuICE9IE5VTEwpICYmICFBU04xX2JuX3ByaW50KGJwLCBnZW5fY29tcHJlc3NlZCwgZ2VuLAorCQkJCWJ1ZmZlciwgb2ZmKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZSBpZiAoZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCkKKwkJCXsKKwkJCWlmICgoZ2VuICE9IE5VTEwpICYmICFBU04xX2JuX3ByaW50KGJwLCBnZW5fdW5jb21wcmVzc2VkLCBnZW4sCisJCQkJYnVmZmVyLCBvZmYpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlIC8qIGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQgKi8KKwkJCXsKKwkJCWlmICgoZ2VuICE9IE5VTEwpICYmICFBU04xX2JuX3ByaW50KGJwLCBnZW5faHlicmlkLCBnZW4sCisJCQkJYnVmZmVyLCBvZmYpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoKG9yZGVyICE9IE5VTEwpICYmICFBU04xX2JuX3ByaW50KGJwLCAiT3JkZXI6ICIsIG9yZGVyLCAKKwkJCWJ1ZmZlciwgb2ZmKSkgZ290byBlcnI7CisJCWlmICgoY29mYWN0b3IgIT0gTlVMTCkgJiYgIUFTTjFfYm5fcHJpbnQoYnAsICJDb2ZhY3RvcjogIiwgY29mYWN0b3IsIAorCQkJYnVmZmVyLCBvZmYpKSBnb3RvIGVycjsKKwkJaWYgKHNlZWQgJiYgIXByaW50X2JpbihicCwgIlNlZWQ6Iiwgc2VlZCwgc2VlZF9sZW4sIG9mZikpCisJCQlnb3RvIGVycjsKKwkJfQorCXJldD0xOworZXJyOgorCWlmICghcmV0KQorIAkJRUNlcnIoRUNfRl9FQ1BLUEFSQU1FVEVSU19QUklOVCwgcmVhc29uKTsKKwlpZiAocCkgCisJCUJOX2ZyZWUocCk7CisJaWYgKGEpIAorCQlCTl9mcmVlKGEpOworCWlmIChiKQorCQlCTl9mcmVlKGIpOworCWlmIChnZW4pCisJCUJOX2ZyZWUoZ2VuKTsKKwlpZiAob3JkZXIpCisJCUJOX2ZyZWUob3JkZXIpOworCWlmIChjb2ZhY3RvcikKKwkJQk5fZnJlZShjb2ZhY3Rvcik7CisJaWYgKGN0eCkKKwkJQk5fQ1RYX2ZyZWUoY3R4KTsKKwlpZiAoYnVmZmVyICE9IE5VTEwpIAorCQlPUEVOU1NMX2ZyZWUoYnVmZmVyKTsKKwlyZXR1cm4ocmV0KTsJCisJfQorCitzdGF0aWMgaW50IHByaW50X2JpbihCSU8gKmZwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4sIGludCBvZmYpCisJeworCXNpemVfdCBpOworCWNoYXIgc3RyWzEyOF07CisKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAxOworCWlmIChvZmYpCisJCXsKKwkJaWYgKG9mZiA+IDEyOCkKKwkJCW9mZj0xMjg7CisJCW1lbXNldChzdHIsJyAnLG9mZik7CisJCWlmIChCSU9fd3JpdGUoZnAsIHN0ciwgb2ZmKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCX0KKworCWlmIChCSU9fcHJpbnRmKGZwLCIlcyIsIG5hbWUpIDw9IDApCisJCXJldHVybiAwOworCisJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCXsKKwkJaWYgKChpJTE1KSA9PSAwKQorCQkJeworCQkJc3RyWzBdPSdcbic7CisJCQltZW1zZXQoJihzdHJbMV0pLCcgJyxvZmYrNCk7CisJCQlpZiAoQklPX3dyaXRlKGZwLCBzdHIsIG9mZisxKzQpIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmIChCSU9fcHJpbnRmKGZwLCIlMDJ4JXMiLGJ1ZltpXSwoKGkrMSkgPT0gbGVuKT8iIjoiOiIpIDw9IDApCisJCQlyZXR1cm4gMDsKKwkJfQorCWlmIChCSU9fd3JpdGUoZnAsIlxuIiwxKSA8PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY3BfbW9udC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjcF9tb250LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjNGE0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY3BfbW9udC5jCkBAIC0wLDAgKzEsMzE1IEBACisvKiBjcnlwdG8vZWMvZWNwX21vbnQuYyAqLworLyoKKyAqIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCb2RvIE1vZWxsZXIgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNVTiBNSUNST1NZU1RFTVMsIElOQy4sCisgKiBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2luY2x1ZGUgImVjX2xjbC5oIgorCisKK2NvbnN0IEVDX01FVEhPRCAqRUNfR0ZwX21vbnRfbWV0aG9kKHZvaWQpCisJeworCXN0YXRpYyBjb25zdCBFQ19NRVRIT0QgcmV0ID0geworCQlOSURfWDlfNjJfcHJpbWVfZmllbGQsCisJCWVjX0dGcF9tb250X2dyb3VwX2luaXQsCisJCWVjX0dGcF9tb250X2dyb3VwX2ZpbmlzaCwKKwkJZWNfR0ZwX21vbnRfZ3JvdXBfY2xlYXJfZmluaXNoLAorCQllY19HRnBfbW9udF9ncm91cF9jb3B5LAorCQllY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUsCisJCWVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2N1cnZlLAorCQllY19HRnBfc2ltcGxlX2dyb3VwX2dldF9kZWdyZWUsCisJCWVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50LAorCQllY19HRnBfc2ltcGxlX3BvaW50X2luaXQsCisJCWVjX0dGcF9zaW1wbGVfcG9pbnRfZmluaXNoLAorCQllY19HRnBfc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaCwKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludF9jb3B5LAorCQllY19HRnBfc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eSwKKwkJZWNfR0ZwX3NpbXBsZV9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwLAorCQllY19HRnBfc2ltcGxlX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAsCisJCWVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcywKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorCQllY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzLAorCQllY19HRnBfc2ltcGxlX3BvaW50Mm9jdCwKKwkJZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsCisJCWVjX0dGcF9zaW1wbGVfYWRkLAorCQllY19HRnBfc2ltcGxlX2RibCwKKwkJZWNfR0ZwX3NpbXBsZV9pbnZlcnQsCisJCWVjX0dGcF9zaW1wbGVfaXNfYXRfaW5maW5pdHksCisJCWVjX0dGcF9zaW1wbGVfaXNfb25fY3VydmUsCisJCWVjX0dGcF9zaW1wbGVfY21wLAorCQllY19HRnBfc2ltcGxlX21ha2VfYWZmaW5lLAorCQllY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSwKKwkJMCAvKiBtdWwgKi8sCisJCTAgLyogcHJlY29tcHV0ZV9tdWx0ICovLAorCQkwIC8qIGhhdmVfcHJlY29tcHV0ZV9tdWx0ICovLAkKKwkJZWNfR0ZwX21vbnRfZmllbGRfbXVsLAorCQllY19HRnBfbW9udF9maWVsZF9zcXIsCisJCTAgLyogZmllbGRfZGl2ICovLAorCQllY19HRnBfbW9udF9maWVsZF9lbmNvZGUsCisJCWVjX0dGcF9tb250X2ZpZWxkX2RlY29kZSwKKwkJZWNfR0ZwX21vbnRfZmllbGRfc2V0X3RvX29uZSB9OworCisJcmV0dXJuICZyZXQ7CisJfQorCisKK2ludCBlY19HRnBfbW9udF9ncm91cF9pbml0KEVDX0dST1VQICpncm91cCkKKwl7CisJaW50IG9rOworCisJb2sgPSBlY19HRnBfc2ltcGxlX2dyb3VwX2luaXQoZ3JvdXApOworCWdyb3VwLT5maWVsZF9kYXRhMSA9IE5VTEw7CisJZ3JvdXAtPmZpZWxkX2RhdGEyID0gTlVMTDsKKwlyZXR1cm4gb2s7CisJfQorCisKK3ZvaWQgZWNfR0ZwX21vbnRfZ3JvdXBfZmluaXNoKEVDX0dST1VQICpncm91cCkKKwl7CisJaWYgKGdyb3VwLT5maWVsZF9kYXRhMSAhPSBOVUxMKQorCQl7CisJCUJOX01PTlRfQ1RYX2ZyZWUoZ3JvdXAtPmZpZWxkX2RhdGExKTsKKwkJZ3JvdXAtPmZpZWxkX2RhdGExID0gTlVMTDsKKwkJfQorCWlmIChncm91cC0+ZmllbGRfZGF0YTIgIT0gTlVMTCkKKwkJeworCQlCTl9mcmVlKGdyb3VwLT5maWVsZF9kYXRhMik7CisJCWdyb3VwLT5maWVsZF9kYXRhMiA9IE5VTEw7CisJCX0KKwllY19HRnBfc2ltcGxlX2dyb3VwX2ZpbmlzaChncm91cCk7CisJfQorCisKK3ZvaWQgZWNfR0ZwX21vbnRfZ3JvdXBfY2xlYXJfZmluaXNoKEVDX0dST1VQICpncm91cCkKKwl7CisJaWYgKGdyb3VwLT5maWVsZF9kYXRhMSAhPSBOVUxMKQorCQl7CisJCUJOX01PTlRfQ1RYX2ZyZWUoZ3JvdXAtPmZpZWxkX2RhdGExKTsKKwkJZ3JvdXAtPmZpZWxkX2RhdGExID0gTlVMTDsKKwkJfQorCWlmIChncm91cC0+ZmllbGRfZGF0YTIgIT0gTlVMTCkKKwkJeworCQlCTl9jbGVhcl9mcmVlKGdyb3VwLT5maWVsZF9kYXRhMik7CisJCWdyb3VwLT5maWVsZF9kYXRhMiA9IE5VTEw7CisJCX0KKwllY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaChncm91cCk7CisJfQorCisKK2ludCBlY19HRnBfbW9udF9ncm91cF9jb3B5KEVDX0dST1VQICpkZXN0LCBjb25zdCBFQ19HUk9VUCAqc3JjKQorCXsKKwlpZiAoZGVzdC0+ZmllbGRfZGF0YTEgIT0gTlVMTCkKKwkJeworCQlCTl9NT05UX0NUWF9mcmVlKGRlc3QtPmZpZWxkX2RhdGExKTsKKwkJZGVzdC0+ZmllbGRfZGF0YTEgPSBOVUxMOworCQl9CisJaWYgKGRlc3QtPmZpZWxkX2RhdGEyICE9IE5VTEwpCisJCXsKKwkJQk5fY2xlYXJfZnJlZShkZXN0LT5maWVsZF9kYXRhMik7CisJCWRlc3QtPmZpZWxkX2RhdGEyID0gTlVMTDsKKwkJfQorCisJaWYgKCFlY19HRnBfc2ltcGxlX2dyb3VwX2NvcHkoZGVzdCwgc3JjKSkgcmV0dXJuIDA7CisKKwlpZiAoc3JjLT5maWVsZF9kYXRhMSAhPSBOVUxMKQorCQl7CisJCWRlc3QtPmZpZWxkX2RhdGExID0gQk5fTU9OVF9DVFhfbmV3KCk7CisJCWlmIChkZXN0LT5maWVsZF9kYXRhMSA9PSBOVUxMKSByZXR1cm4gMDsKKwkJaWYgKCFCTl9NT05UX0NUWF9jb3B5KGRlc3QtPmZpZWxkX2RhdGExLCBzcmMtPmZpZWxkX2RhdGExKSkgZ290byBlcnI7CisJCX0KKwlpZiAoc3JjLT5maWVsZF9kYXRhMiAhPSBOVUxMKQorCQl7CisJCWRlc3QtPmZpZWxkX2RhdGEyID0gQk5fZHVwKHNyYy0+ZmllbGRfZGF0YTIpOworCQlpZiAoZGVzdC0+ZmllbGRfZGF0YTIgPT0gTlVMTCkgZ290byBlcnI7CisJCX0KKworCXJldHVybiAxOworCisgZXJyOgorCWlmIChkZXN0LT5maWVsZF9kYXRhMSAhPSBOVUxMKQorCQl7CisJCUJOX01PTlRfQ1RYX2ZyZWUoZGVzdC0+ZmllbGRfZGF0YTEpOworCQlkZXN0LT5maWVsZF9kYXRhMSA9IE5VTEw7CisJCX0KKwlyZXR1cm4gMDsJCisJfQorCisKK2ludCBlY19HRnBfbW9udF9ncm91cF9zZXRfY3VydmUoRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCkKKwl7CisJQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKwlCTl9NT05UX0NUWCAqbW9udCA9IE5VTEw7CisJQklHTlVNICpvbmUgPSBOVUxMOworCWludCByZXQgPSAwOworCisJaWYgKGdyb3VwLT5maWVsZF9kYXRhMSAhPSBOVUxMKQorCQl7CisJCUJOX01PTlRfQ1RYX2ZyZWUoZ3JvdXAtPmZpZWxkX2RhdGExKTsKKwkJZ3JvdXAtPmZpZWxkX2RhdGExID0gTlVMTDsKKwkJfQorCWlmIChncm91cC0+ZmllbGRfZGF0YTIgIT0gTlVMTCkKKwkJeworCQlCTl9mcmVlKGdyb3VwLT5maWVsZF9kYXRhMik7CisJCWdyb3VwLT5maWVsZF9kYXRhMiA9IE5VTEw7CisJCX0KKwkKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworCW1vbnQgPSBCTl9NT05UX0NUWF9uZXcoKTsKKwlpZiAobW9udCA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoIUJOX01PTlRfQ1RYX3NldChtb250LCBwLCBjdHgpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX01PTlRfR1JPVVBfU0VUX0NVUlZFLCBFUlJfUl9CTl9MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCW9uZSA9IEJOX25ldygpOworCWlmIChvbmUgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKCFCTl90b19tb250Z29tZXJ5KG9uZSwgQk5fdmFsdWVfb25lKCksIG1vbnQsIGN0eCkpIGdvdG8gZXJyOworCisJZ3JvdXAtPmZpZWxkX2RhdGExID0gbW9udDsKKwltb250ID0gTlVMTDsKKwlncm91cC0+ZmllbGRfZGF0YTIgPSBvbmU7CisJb25lID0gTlVMTDsKKworCXJldCA9IGVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlKGdyb3VwLCBwLCBhLCBiLCBjdHgpOworCisJaWYgKCFyZXQpCisJCXsKKwkJQk5fTU9OVF9DVFhfZnJlZShncm91cC0+ZmllbGRfZGF0YTEpOworCQlncm91cC0+ZmllbGRfZGF0YTEgPSBOVUxMOworCQlCTl9mcmVlKGdyb3VwLT5maWVsZF9kYXRhMik7CisJCWdyb3VwLT5maWVsZF9kYXRhMiA9IE5VTEw7CisJCX0KKworIGVycjoKKwlpZiAobmV3X2N0eCAhPSBOVUxMKQorCQlCTl9DVFhfZnJlZShuZXdfY3R4KTsKKwlpZiAobW9udCAhPSBOVUxMKQorCQlCTl9NT05UX0NUWF9mcmVlKG1vbnQpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfbW9udF9maWVsZF9tdWwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5maWVsZF9kYXRhMSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX01PTlRfRklFTERfTVVMLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CisJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gQk5fbW9kX211bF9tb250Z29tZXJ5KHIsIGEsIGIsIGdyb3VwLT5maWVsZF9kYXRhMSwgY3R4KTsKKwl9CisKKworaW50IGVjX0dGcF9tb250X2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5maWVsZF9kYXRhMSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX01PTlRfRklFTERfU1FSLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CisJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gQk5fbW9kX211bF9tb250Z29tZXJ5KHIsIGEsIGEsIGdyb3VwLT5maWVsZF9kYXRhMSwgY3R4KTsKKwl9CisKKworaW50IGVjX0dGcF9tb250X2ZpZWxkX2VuY29kZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5maWVsZF9kYXRhMSA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX01PTlRfRklFTERfRU5DT0RFLCBFQ19SX05PVF9JTklUSUFMSVpFRCk7CisJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gQk5fdG9fbW9udGdvbWVyeShyLCBhLCAoQk5fTU9OVF9DVFggKilncm91cC0+ZmllbGRfZGF0YTEsIGN0eCk7CisJfQorCisKK2ludCBlY19HRnBfbW9udF9maWVsZF9kZWNvZGUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgQk5fQ1RYICpjdHgpCisJeworCWlmIChncm91cC0+ZmllbGRfZGF0YTEgPT0gTlVMTCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dGUF9NT05UX0ZJRUxEX0RFQ09ERSwgRUNfUl9OT1RfSU5JVElBTElaRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIEJOX2Zyb21fbW9udGdvbWVyeShyLCBhLCBncm91cC0+ZmllbGRfZGF0YTEsIGN0eCk7CisJfQorCisKK2ludCBlY19HRnBfbW9udF9maWVsZF9zZXRfdG9fb25lKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBCTl9DVFggKmN0eCkKKwl7CisJaWYgKGdyb3VwLT5maWVsZF9kYXRhMiA9PSBOVUxMKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX01PTlRfRklFTERfU0VUX1RPX09ORSwgRUNfUl9OT1RfSU5JVElBTElaRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKCFCTl9jb3B5KHIsIGdyb3VwLT5maWVsZF9kYXRhMikpIHJldHVybiAwOworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY3BfbmlzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjcF9uaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1NjgyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY3BfbmlzdC5jCkBAIC0wLDAgKzEsMjEwIEBACisvKiBjcnlwdG8vZWMvZWNwX25pc3QuYyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgTmlscyBMYXJzY2ggZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIFBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFNVTiBNSUNST1NZU1RFTVMsIElOQy4sCisgKiBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqX21hYy5oPgorI2luY2x1ZGUgImVjX2xjbC5oIgorCitjb25zdCBFQ19NRVRIT0QgKkVDX0dGcF9uaXN0X21ldGhvZCh2b2lkKQorCXsKKwlzdGF0aWMgY29uc3QgRUNfTUVUSE9EIHJldCA9IHsKKwkJTklEX1g5XzYyX3ByaW1lX2ZpZWxkLAorCQllY19HRnBfc2ltcGxlX2dyb3VwX2luaXQsCisJCWVjX0dGcF9zaW1wbGVfZ3JvdXBfZmluaXNoLAorCQllY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaCwKKwkJZWNfR0ZwX25pc3RfZ3JvdXBfY29weSwKKwkJZWNfR0ZwX25pc3RfZ3JvdXBfc2V0X2N1cnZlLAorCQllY19HRnBfc2ltcGxlX2dyb3VwX2dldF9jdXJ2ZSwKKwkJZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfZGVncmVlLAorCQllY19HRnBfc2ltcGxlX2dyb3VwX2NoZWNrX2Rpc2NyaW1pbmFudCwKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludF9pbml0LAorCQllY19HRnBfc2ltcGxlX3BvaW50X2ZpbmlzaCwKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludF9jbGVhcl9maW5pc2gsCisJCWVjX0dGcF9zaW1wbGVfcG9pbnRfY29weSwKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfdG9faW5maW5pdHksCisJCWVjX0dGcF9zaW1wbGVfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCwKKwkJZWNfR0ZwX3NpbXBsZV9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwLAorCQllY19HRnBfc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMsCisJCWVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcywKKwkJZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcywKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QsCisJCWVjX0dGcF9zaW1wbGVfb2N0MnBvaW50LAorCQllY19HRnBfc2ltcGxlX2FkZCwKKwkJZWNfR0ZwX3NpbXBsZV9kYmwsCisJCWVjX0dGcF9zaW1wbGVfaW52ZXJ0LAorCQllY19HRnBfc2ltcGxlX2lzX2F0X2luZmluaXR5LAorCQllY19HRnBfc2ltcGxlX2lzX29uX2N1cnZlLAorCQllY19HRnBfc2ltcGxlX2NtcCwKKwkJZWNfR0ZwX3NpbXBsZV9tYWtlX2FmZmluZSwKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUsCisJCTAgLyogbXVsICovLAorCQkwIC8qIHByZWNvbXB1dGVfbXVsdCAqLywKKwkJMCAvKiBoYXZlX3ByZWNvbXB1dGVfbXVsdCAqLywJCisJCWVjX0dGcF9uaXN0X2ZpZWxkX211bCwKKwkJZWNfR0ZwX25pc3RfZmllbGRfc3FyLAorCQkwIC8qIGZpZWxkX2RpdiAqLywKKwkJMCAvKiBmaWVsZF9lbmNvZGUgKi8sCisJCTAgLyogZmllbGRfZGVjb2RlICovLAorCQkwIC8qIGZpZWxkX3NldF90b19vbmUgKi8gfTsKKworCXJldHVybiAmcmV0OworCX0KKworaW50IGVjX0dGcF9uaXN0X2dyb3VwX2NvcHkoRUNfR1JPVVAgKmRlc3QsIGNvbnN0IEVDX0dST1VQICpzcmMpCisJeworCWRlc3QtPmZpZWxkX21vZF9mdW5jID0gc3JjLT5maWVsZF9tb2RfZnVuYzsKKworCXJldHVybiBlY19HRnBfc2ltcGxlX2dyb3VwX2NvcHkoZGVzdCwgc3JjKTsKKwl9CisKK2ludCBlY19HRnBfbmlzdF9ncm91cF9zZXRfY3VydmUoRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBCSUdOVU0gKnAsCisJY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0ID0gMDsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCUJJR05VTSAqdG1wX2JuOworCQorCWlmIChjdHggPT0gTlVMTCkKKwkJaWYgKChjdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSByZXR1cm4gMDsKKworCUJOX0NUWF9zdGFydChjdHgpOworCWlmICgodG1wX2JuID0gQk5fQ1RYX2dldChjdHgpKSA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmIChCTl91Y21wKEJOX2dldDBfbmlzdF9wcmltZV8xOTIoKSwgcCkgPT0gMCkKKwkJZ3JvdXAtPmZpZWxkX21vZF9mdW5jID0gQk5fbmlzdF9tb2RfMTkyOworCWVsc2UgaWYgKEJOX3VjbXAoQk5fZ2V0MF9uaXN0X3ByaW1lXzIyNCgpLCBwKSA9PSAwKQorCQlncm91cC0+ZmllbGRfbW9kX2Z1bmMgPSBCTl9uaXN0X21vZF8yMjQ7CisJZWxzZSBpZiAoQk5fdWNtcChCTl9nZXQwX25pc3RfcHJpbWVfMjU2KCksIHApID09IDApCisJCWdyb3VwLT5maWVsZF9tb2RfZnVuYyA9IEJOX25pc3RfbW9kXzI1NjsKKwllbHNlIGlmIChCTl91Y21wKEJOX2dldDBfbmlzdF9wcmltZV8zODQoKSwgcCkgPT0gMCkKKwkJZ3JvdXAtPmZpZWxkX21vZF9mdW5jID0gQk5fbmlzdF9tb2RfMzg0OworCWVsc2UgaWYgKEJOX3VjbXAoQk5fZ2V0MF9uaXN0X3ByaW1lXzUyMSgpLCBwKSA9PSAwKQorCQlncm91cC0+ZmllbGRfbW9kX2Z1bmMgPSBCTl9uaXN0X21vZF81MjE7CisJZWxzZQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX05JU1RfR1JPVVBfU0VUX0NVUlZFLCBFQ19SX05PVF9BX05JU1RfUFJJTUUpOworCQlnb3RvIGVycjsKKwkJfQorCisJcmV0ID0gZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmUoZ3JvdXAsIHAsIGEsIGIsIGN0eCk7CisKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfbmlzdF9maWVsZF9tdWwoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKwljb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQJcmV0PTA7CisJQk5fQ1RYCSpjdHhfbmV3PU5VTEw7CisKKwlpZiAoIWdyb3VwIHx8ICFyIHx8ICFhIHx8ICFiKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX05JU1RfRklFTERfTVVMLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlnb3RvIGVycjsKKwkJfQorCWlmICghY3R4KQorCQlpZiAoKGN0eF9uZXcgPSBjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKCFCTl9tdWwociwgYSwgYiwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFncm91cC0+ZmllbGRfbW9kX2Z1bmMociwgciwgJmdyb3VwLT5maWVsZCwgY3R4KSkKKwkJZ290byBlcnI7CisKKwlyZXQ9MTsKK2VycjoKKwlpZiAoY3R4X25ldykKKwkJQk5fQ1RYX2ZyZWUoY3R4X25ldyk7CisJcmV0dXJuIHJldDsKKwl9CisKKworaW50IGVjX0dGcF9uaXN0X2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAorCUJOX0NUWCAqY3R4KQorCXsKKwlpbnQJcmV0PTA7CisJQk5fQ1RYCSpjdHhfbmV3PU5VTEw7CisKKwlpZiAoIWdyb3VwIHx8ICFyIHx8ICFhKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX05JU1RfRklFTERfU1FSLCBFQ19SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCFjdHgpCisJCWlmICgoY3R4X25ldyA9IGN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoIUJOX3NxcihyLCBhLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIWdyb3VwLT5maWVsZF9tb2RfZnVuYyhyLCByLCAmZ3JvdXAtPmZpZWxkLCBjdHgpKQorCQlnb3RvIGVycjsKKworCXJldD0xOworZXJyOgorCWlmIChjdHhfbmV3KQorCQlCTl9DVFhfZnJlZShjdHhfbmV3KTsKKwlyZXR1cm4gcmV0OworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY3Bfc21wbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjL2VjcF9zbXBsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyNmY4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY3Bfc21wbC5jCkBAIC0wLDAgKzEsMTcxNiBAQAorLyogY3J5cHRvL2VjL2VjcF9zbXBsLmMgKi8KKy8qIEluY2x1ZGVzIGNvZGUgd3JpdHRlbiBieSBMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPgorICogZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuIAorICogSW5jbHVkZXMgY29kZSB3cml0dGVuIGJ5IEJvZG8gTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBQb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLAorICogYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zeW1oYWNrcy5oPgorCisjaW5jbHVkZSAiZWNfbGNsLmgiCisKK2NvbnN0IEVDX01FVEhPRCAqRUNfR0ZwX3NpbXBsZV9tZXRob2Qodm9pZCkKKwl7CisJc3RhdGljIGNvbnN0IEVDX01FVEhPRCByZXQgPSB7CisJCU5JRF9YOV82Ml9wcmltZV9maWVsZCwKKwkJZWNfR0ZwX3NpbXBsZV9ncm91cF9pbml0LAorCQllY19HRnBfc2ltcGxlX2dyb3VwX2ZpbmlzaCwKKwkJZWNfR0ZwX3NpbXBsZV9ncm91cF9jbGVhcl9maW5pc2gsCisJCWVjX0dGcF9zaW1wbGVfZ3JvdXBfY29weSwKKwkJZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmUsCisJCWVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2N1cnZlLAorCQllY19HRnBfc2ltcGxlX2dyb3VwX2dldF9kZWdyZWUsCisJCWVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50LAorCQllY19HRnBfc2ltcGxlX3BvaW50X2luaXQsCisJCWVjX0dGcF9zaW1wbGVfcG9pbnRfZmluaXNoLAorCQllY19HRnBfc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaCwKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludF9jb3B5LAorCQllY19HRnBfc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eSwKKwkJZWNfR0ZwX3NpbXBsZV9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwLAorCQllY19HRnBfc2ltcGxlX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAsCisJCWVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcywKKwkJZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzLAorCQllY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzLAorCQllY19HRnBfc2ltcGxlX3BvaW50Mm9jdCwKKwkJZWNfR0ZwX3NpbXBsZV9vY3QycG9pbnQsCisJCWVjX0dGcF9zaW1wbGVfYWRkLAorCQllY19HRnBfc2ltcGxlX2RibCwKKwkJZWNfR0ZwX3NpbXBsZV9pbnZlcnQsCisJCWVjX0dGcF9zaW1wbGVfaXNfYXRfaW5maW5pdHksCisJCWVjX0dGcF9zaW1wbGVfaXNfb25fY3VydmUsCisJCWVjX0dGcF9zaW1wbGVfY21wLAorCQllY19HRnBfc2ltcGxlX21ha2VfYWZmaW5lLAorCQllY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSwKKwkJMCAvKiBtdWwgKi8sCisJCTAgLyogcHJlY29tcHV0ZV9tdWx0ICovLAorCQkwIC8qIGhhdmVfcHJlY29tcHV0ZV9tdWx0ICovLAkKKwkJZWNfR0ZwX3NpbXBsZV9maWVsZF9tdWwsCisJCWVjX0dGcF9zaW1wbGVfZmllbGRfc3FyLAorCQkwIC8qIGZpZWxkX2RpdiAqLywKKwkJMCAvKiBmaWVsZF9lbmNvZGUgKi8sCisJCTAgLyogZmllbGRfZGVjb2RlICovLAorCQkwIC8qIGZpZWxkX3NldF90b19vbmUgKi8gfTsKKworCXJldHVybiAmcmV0OworCX0KKworCisvKiBNb3N0IG1ldGhvZCBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGgKKyAqIG5vbi10cml2aWFsIHJlcHJlc2VudGF0aW9ucyBvZiBmaWVsZCBlbGVtZW50cyBpZiBuZWNlc3NhcnkKKyAqIChzZWUgZWNwX21vbnQuYyk6IHdoaWxlIHN0YW5kYXJkIG1vZHVsYXIgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCisgKiBhcmUgdXNlZCwgdGhlIGZpZWxkX211bCBhbmQgZmllbGRfc3FyIG1ldGhvZHMgd2lsbCBiZSB1c2VkIGZvcgorICogbXVsdGlwbGljYXRpb24sIGFuZCBmaWVsZF9lbmNvZGUgYW5kIGZpZWxkX2RlY29kZSAoaWYgZGVmaW5lZCkKKyAqIHdpbGwgYmUgdXNlZCBmb3IgY29udmVydGluZyBiZXR3ZWVuIHJlcHJlc2VudGF0aW9ucy4KKworICogRnVuY3Rpb25zIGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lKCkgYW5kCisgKiBlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMoKSBzcGVjaWZpY2FsbHkgYXNzdW1lCisgKiB0aGF0IGlmIGEgbm9uLXRyaXZpYWwgcmVwcmVzZW50YXRpb24gaXMgdXNlZCwgaXQgaXMgYSBNb250Z29tZXJ5CisgKiByZXByZXNlbnRhdGlvbiAoaS5lLiAnZW5jb2RpbmcnIG1lYW5zIG11bHRpcGx5aW5nIGJ5IHNvbWUgZmFjdG9yIFIpLgorICovCisKKworaW50IGVjX0dGcF9zaW1wbGVfZ3JvdXBfaW5pdChFQ19HUk9VUCAqZ3JvdXApCisJeworCUJOX2luaXQoJmdyb3VwLT5maWVsZCk7CisJQk5faW5pdCgmZ3JvdXAtPmEpOworCUJOX2luaXQoJmdyb3VwLT5iKTsKKwlncm91cC0+YV9pc19taW51czMgPSAwOworCXJldHVybiAxOworCX0KKworCit2b2lkIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZmluaXNoKEVDX0dST1VQICpncm91cCkKKwl7CisJQk5fZnJlZSgmZ3JvdXAtPmZpZWxkKTsKKwlCTl9mcmVlKCZncm91cC0+YSk7CisJQk5fZnJlZSgmZ3JvdXAtPmIpOworCX0KKworCit2b2lkIGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2xlYXJfZmluaXNoKEVDX0dST1VQICpncm91cCkKKwl7CisJQk5fY2xlYXJfZnJlZSgmZ3JvdXAtPmZpZWxkKTsKKwlCTl9jbGVhcl9mcmVlKCZncm91cC0+YSk7CisJQk5fY2xlYXJfZnJlZSgmZ3JvdXAtPmIpOworCX0KKworCitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9jb3B5KEVDX0dST1VQICpkZXN0LCBjb25zdCBFQ19HUk9VUCAqc3JjKQorCXsKKwlpZiAoIUJOX2NvcHkoJmRlc3QtPmZpZWxkLCAmc3JjLT5maWVsZCkpIHJldHVybiAwOworCWlmICghQk5fY29weSgmZGVzdC0+YSwgJnNyYy0+YSkpIHJldHVybiAwOworCWlmICghQk5fY29weSgmZGVzdC0+YiwgJnNyYy0+YikpIHJldHVybiAwOworCisJZGVzdC0+YV9pc19taW51czMgPSBzcmMtPmFfaXNfbWludXMzOworCisJcmV0dXJuIDE7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX2dyb3VwX3NldF9jdXJ2ZShFQ19HUk9VUCAqZ3JvdXAsCisJY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQgPSAwOworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICp0bXBfYTsKKwkKKwkvKiBwIG11c3QgYmUgYSBwcmltZSA+IDMgKi8KKwlpZiAoQk5fbnVtX2JpdHMocCkgPD0gMiB8fCAhQk5faXNfb2RkKHApKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9HUk9VUF9TRVRfQ1VSVkUsIEVDX1JfSU5WQUxJRF9GSUVMRCk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCXRtcF9hID0gQk5fQ1RYX2dldChjdHgpOworCWlmICh0bXBfYSA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIGdyb3VwLT5maWVsZCAqLworCWlmICghQk5fY29weSgmZ3JvdXAtPmZpZWxkLCBwKSkgZ290byBlcnI7CisJQk5fc2V0X25lZ2F0aXZlKCZncm91cC0+ZmllbGQsIDApOworCisJLyogZ3JvdXAtPmEgKi8KKwlpZiAoIUJOX25ubW9kKHRtcF9hLCBhLCBwLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZSkKKwkJeyBpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9lbmNvZGUoZ3JvdXAsICZncm91cC0+YSwgdG1wX2EsIGN0eCkpIGdvdG8gZXJyOyB9CQorCWVsc2UKKwkJaWYgKCFCTl9jb3B5KCZncm91cC0+YSwgdG1wX2EpKSBnb3RvIGVycjsKKwkKKwkvKiBncm91cC0+YiAqLworCWlmICghQk5fbm5tb2QoJmdyb3VwLT5iLCBiLCBwLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZSkKKwkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCAmZ3JvdXAtPmIsICZncm91cC0+YiwgY3R4KSkgZ290byBlcnI7CisJCisJLyogZ3JvdXAtPmFfaXNfbWludXMzICovCisJaWYgKCFCTl9hZGRfd29yZCh0bXBfYSwgMykpIGdvdG8gZXJyOworCWdyb3VwLT5hX2lzX21pbnVzMyA9ICgwID09IEJOX2NtcCh0bXBfYSwgJmdyb3VwLT5maWVsZCkpOworCisJcmV0ID0gMTsKKworIGVycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJaWYgKG5ld19jdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKworaW50IGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2N1cnZlKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpwLCBCSUdOVU0gKmEsIEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQgPSAwOworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJCisJaWYgKHAgIT0gTlVMTCkKKwkJeworCQlpZiAoIUJOX2NvcHkocCwgJmdyb3VwLT5maWVsZCkpIHJldHVybiAwOworCQl9CisKKwlpZiAoYSAhPSBOVUxMIHx8IGIgIT0gTlVMTCkKKwkJeworCQlpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZSkKKwkJCXsKKwkJCWlmIChjdHggPT0gTlVMTCkKKwkJCQl7CisJCQkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJCQlpZiAoY3R4ID09IE5VTEwpCisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWlmIChhICE9IE5VTEwpCisJCQkJeworCQkJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZShncm91cCwgYSwgJmdyb3VwLT5hLCBjdHgpKSBnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoYiAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIGIsICZncm91cC0+YiwgY3R4KSkgZ290byBlcnI7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoYSAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIUJOX2NvcHkoYSwgJmdyb3VwLT5hKSkgZ290byBlcnI7CisJCQkJfQorCQkJaWYgKGIgIT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKCFCTl9jb3B5KGIsICZncm91cC0+YikpIGdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCQorCXJldCA9IDE7CisJCisgZXJyOgorCWlmIChuZXdfY3R4KQorCQlCTl9DVFhfZnJlZShuZXdfY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworCitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfZGVncmVlKGNvbnN0IEVDX0dST1VQICpncm91cCkKKwl7CisJcmV0dXJuIEJOX251bV9iaXRzKCZncm91cC0+ZmllbGQpOworCX0KKworCitpbnQgZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKmN0eCkKKwl7CisJaW50IHJldCA9IDA7CisJQklHTlVNICphLCpiLCpvcmRlciwqdG1wXzEsKnRtcF8yOworCWNvbnN0IEJJR05VTSAqcCA9ICZncm91cC0+ZmllbGQ7CisJQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKworCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0dGUF9TSU1QTEVfR1JPVVBfQ0hFQ0tfRElTQ1JJTUlOQU5ULCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCUJOX0NUWF9zdGFydChjdHgpOworCWEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJYiA9IEJOX0NUWF9nZXQoY3R4KTsKKwl0bXBfMSA9IEJOX0NUWF9nZXQoY3R4KTsKKwl0bXBfMiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlvcmRlciA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAob3JkZXIgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZSkKKwkJeworCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIGEsICZncm91cC0+YSwgY3R4KSkgZ290byBlcnI7CisJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZShncm91cCwgYiwgJmdyb3VwLT5iLCBjdHgpKSBnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIUJOX2NvcHkoYSwgJmdyb3VwLT5hKSkgZ290byBlcnI7CisJCWlmICghQk5fY29weShiLCAmZ3JvdXAtPmIpKSBnb3RvIGVycjsKKwkJfQorCQorCS8qIGNoZWNrIHRoZSBkaXNjcmltaW5hbnQ6CisJICogeV4yID0geF4zICsgYSp4ICsgYiBpcyBhbiBlbGxpcHRpYyBjdXJ2ZSA8PT4gNCphXjMgKyAyNypiXjIgIT0gMCAobW9kIHApIAorICAgICAgICAgKiAwID08IGEsIGIgPCBwICovCisJaWYgKEJOX2lzX3plcm8oYSkpCisJCXsKKwkJaWYgKEJOX2lzX3plcm8oYikpIGdvdG8gZXJyOworCQl9CisJZWxzZSBpZiAoIUJOX2lzX3plcm8oYikpCisJCXsKKwkJaWYgKCFCTl9tb2Rfc3FyKHRtcF8xLCBhLCBwLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9tb2RfbXVsKHRtcF8yLCB0bXBfMSwgYSwgcCwgY3R4KSkgZ290byBlcnI7CisJCWlmICghQk5fbHNoaWZ0KHRtcF8xLCB0bXBfMiwgMikpIGdvdG8gZXJyOworCQkvKiB0bXBfMSA9IDQqYV4zICovCisKKwkJaWYgKCFCTl9tb2Rfc3FyKHRtcF8yLCBiLCBwLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9tdWxfd29yZCh0bXBfMiwgMjcpKSBnb3RvIGVycjsKKwkJLyogdG1wXzIgPSAyNypiXjIgKi8KKworCQlpZiAoIUJOX21vZF9hZGQoYSwgdG1wXzEsIHRtcF8yLCBwLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKEJOX2lzX3plcm8oYSkpIGdvdG8gZXJyOworCQl9CisJcmV0ID0gMTsKKworZXJyOgorCWlmIChjdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50X2luaXQoRUNfUE9JTlQgKnBvaW50KQorCXsKKwlCTl9pbml0KCZwb2ludC0+WCk7CisJQk5faW5pdCgmcG9pbnQtPlkpOworCUJOX2luaXQoJnBvaW50LT5aKTsKKwlwb2ludC0+Wl9pc19vbmUgPSAwOworCisJcmV0dXJuIDE7CisJfQorCisKK3ZvaWQgZWNfR0ZwX3NpbXBsZV9wb2ludF9maW5pc2goRUNfUE9JTlQgKnBvaW50KQorCXsKKwlCTl9mcmVlKCZwb2ludC0+WCk7CisJQk5fZnJlZSgmcG9pbnQtPlkpOworCUJOX2ZyZWUoJnBvaW50LT5aKTsKKwl9CisKKwordm9pZCBlY19HRnBfc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaChFQ19QT0lOVCAqcG9pbnQpCisJeworCUJOX2NsZWFyX2ZyZWUoJnBvaW50LT5YKTsKKwlCTl9jbGVhcl9mcmVlKCZwb2ludC0+WSk7CisJQk5fY2xlYXJfZnJlZSgmcG9pbnQtPlopOworCXBvaW50LT5aX2lzX29uZSA9IDA7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50X2NvcHkoRUNfUE9JTlQgKmRlc3QsIGNvbnN0IEVDX1BPSU5UICpzcmMpCisJeworCWlmICghQk5fY29weSgmZGVzdC0+WCwgJnNyYy0+WCkpIHJldHVybiAwOworCWlmICghQk5fY29weSgmZGVzdC0+WSwgJnNyYy0+WSkpIHJldHVybiAwOworCWlmICghQk5fY29weSgmZGVzdC0+WiwgJnNyYy0+WikpIHJldHVybiAwOworCWRlc3QtPlpfaXNfb25lID0gc3JjLT5aX2lzX29uZTsKKworCXJldHVybiAxOworCX0KKworCitpbnQgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfdG9faW5maW5pdHkoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQpCisJeworCXBvaW50LT5aX2lzX29uZSA9IDA7CisJQk5femVybygmcG9pbnQtPlopOworCXJldHVybiAxOworCX0KKworCitpbnQgZWNfR0ZwX3NpbXBsZV9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LAorCWNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LCBjb25zdCBCSUdOVU0gKnosIEJOX0NUWCAqY3R4KQorCXsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCWludCByZXQgPSAwOworCQorCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKHggIT0gTlVMTCkKKwkJeworCQlpZiAoIUJOX25ubW9kKCZwb2ludC0+WCwgeCwgJmdyb3VwLT5maWVsZCwgY3R4KSkgZ290byBlcnI7CisJCWlmIChncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKQorCQkJeworCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCAmcG9pbnQtPlgsICZwb2ludC0+WCwgY3R4KSkgZ290byBlcnI7CisJCQl9CisJCX0KKwkKKwlpZiAoeSAhPSBOVUxMKQorCQl7CisJCWlmICghQk5fbm5tb2QoJnBvaW50LT5ZLCB5LCAmZ3JvdXAtPmZpZWxkLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9lbmNvZGUpCisJCQl7CisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9lbmNvZGUoZ3JvdXAsICZwb2ludC0+WSwgJnBvaW50LT5ZLCBjdHgpKSBnb3RvIGVycjsKKwkJCX0KKwkJfQorCQorCWlmICh6ICE9IE5VTEwpCisJCXsKKwkJaW50IFpfaXNfb25lOworCisJCWlmICghQk5fbm5tb2QoJnBvaW50LT5aLCB6LCAmZ3JvdXAtPmZpZWxkLCBjdHgpKSBnb3RvIGVycjsKKwkJWl9pc19vbmUgPSBCTl9pc19vbmUoJnBvaW50LT5aKTsKKwkJaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9lbmNvZGUpCisJCQl7CisJCQlpZiAoWl9pc19vbmUgJiYgKGdyb3VwLT5tZXRoLT5maWVsZF9zZXRfdG9fb25lICE9IDApKQorCQkJCXsKKwkJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9zZXRfdG9fb25lKGdyb3VwLCAmcG9pbnQtPlosIGN0eCkpIGdvdG8gZXJyOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCAmcG9pbnQtPlosICZwb2ludC0+WiwgY3R4KSkgZ290byBlcnI7CisJCQkJfQorCQkJfQorCQlwb2ludC0+Wl9pc19vbmUgPSBaX2lzX29uZTsKKwkJfQorCQorCXJldCA9IDE7CisJCisgZXJyOgorCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQsCisJQklHTlVNICp4LCBCSUdOVU0gKnksIEJJR05VTSAqeiwgQk5fQ1RYICpjdHgpCisJeworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJCisJaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUgIT0gMCkKKwkJeworCQlpZiAoY3R4ID09IE5VTEwpCisJCQl7CisJCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQkJaWYgKGN0eCA9PSBOVUxMKQorCQkJCXJldHVybiAwOworCQkJfQorCisJCWlmICh4ICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIHgsICZwb2ludC0+WCwgY3R4KSkgZ290byBlcnI7CisJCQl9CisJCWlmICh5ICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIHksICZwb2ludC0+WSwgY3R4KSkgZ290byBlcnI7CisJCQl9CisJCWlmICh6ICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIHosICZwb2ludC0+WiwgY3R4KSkgZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCQorCQl7CisJCWlmICh4ICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIUJOX2NvcHkoeCwgJnBvaW50LT5YKSkgZ290byBlcnI7CisJCQl9CisJCWlmICh5ICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIUJOX2NvcHkoeSwgJnBvaW50LT5ZKSkgZ290byBlcnI7CisJCQl9CisJCWlmICh6ICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIUJOX2NvcHkoeiwgJnBvaW50LT5aKSkgZ290byBlcnI7CisJCQl9CisJCX0KKwkKKwlyZXQgPSAxOworCisgZXJyOgorCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsCisJY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKKwkJeworCQkvKiB1bmxpa2UgZm9yIHByb2plY3RpdmUgY29vcmRpbmF0ZXMsIHdlIGRvIG5vdCB0b2xlcmF0ZSB0aGlzICovCisJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVF9TRVRfQUZGSU5FX0NPT1JESU5BVEVTLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIEVDX1BPSU5UX3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCB4LCB5LCBCTl92YWx1ZV9vbmUoKSwgY3R4KTsKKwl9CisKKworaW50IGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyhjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwKKwlCSUdOVU0gKngsIEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpCisJeworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICpaLCAqWl8xLCAqWl8yLCAqWl8zOworCWNvbnN0IEJJR05VTSAqWl87CisJaW50IHJldCA9IDA7CisKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIHBvaW50KSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlRfR0VUX0FGRklORV9DT09SRElOQVRFUywgRUNfUl9QT0lOVF9BVF9JTkZJTklUWSk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCVogPSBCTl9DVFhfZ2V0KGN0eCk7CisJWl8xID0gQk5fQ1RYX2dldChjdHgpOworCVpfMiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlaXzMgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKFpfMyA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIHRyYW5zZm9ybSAgKFgsIFksIFopICBpbnRvICAoeCwgeSkgOj0gKFgvWl4yLCBZL1peMykgKi8KKwkKKwlpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZSkKKwkJeworCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIFosICZwb2ludC0+WiwgY3R4KSkgZ290byBlcnI7CisJCVpfID0gWjsKKwkJfQorCWVsc2UKKwkJeworCQlaXyA9ICZwb2ludC0+WjsKKwkJfQorCQorCWlmIChCTl9pc19vbmUoWl8pKQorCQl7CisJCWlmIChncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKQorCQkJeworCQkJaWYgKHggIT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZGVjb2RlKGdyb3VwLCB4LCAmcG9pbnQtPlgsIGN0eCkpIGdvdG8gZXJyOworCQkJCX0KKwkJCWlmICh5ICE9IE5VTEwpCisJCQkJeworCQkJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZShncm91cCwgeSwgJnBvaW50LT5ZLCBjdHgpKSBnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmICh4ICE9IE5VTEwpCisJCQkJeworCQkJCWlmICghQk5fY29weSh4LCAmcG9pbnQtPlgpKSBnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoeSAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIUJOX2NvcHkoeSwgJnBvaW50LT5ZKSkgZ290byBlcnI7CisJCQkJfQorCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWlmICghQk5fbW9kX2ludmVyc2UoWl8xLCBaXywgJmdyb3VwLT5maWVsZCwgY3R4KSkKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTLCBFUlJfUl9CTl9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCQorCQlpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZSA9PSAwKQorCQkJeworCQkJLyogZmllbGRfc3FyIHdvcmtzIG9uIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uICovCisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9zcXIoZ3JvdXAsIFpfMiwgWl8xLCBjdHgpKSBnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKCFCTl9tb2Rfc3FyKFpfMiwgWl8xLCAmZ3JvdXAtPmZpZWxkLCBjdHgpKSBnb3RvIGVycjsKKwkJCX0KKwkKKwkJaWYgKHggIT0gTlVMTCkKKwkJCXsKKwkJCS8qIGluIHRoZSBNb250Z29tZXJ5IGNhc2UsIGZpZWxkX211bCB3aWxsIGNhbmNlbCBvdXQgTW9udGdvbWVyeSBmYWN0b3IgaW4gWDogKi8KKwkJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgeCwgJnBvaW50LT5YLCBaXzIsIGN0eCkpIGdvdG8gZXJyOworCQkJfQorCisJCWlmICh5ICE9IE5VTEwpCisJCQl7CisJCQlpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2VuY29kZSA9PSAwKQorCQkJCXsKKwkJCQkvKiBmaWVsZF9tdWwgd29ya3Mgb24gc3RhbmRhcmQgcmVwcmVzZW50YXRpb24gKi8KKwkJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIFpfMywgWl8yLCBaXzEsIGN0eCkpIGdvdG8gZXJyOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKCFCTl9tb2RfbXVsKFpfMywgWl8yLCBaXzEsICZncm91cC0+ZmllbGQsIGN0eCkpIGdvdG8gZXJyOworCQkJCX0KKworCQkJLyogaW4gdGhlIE1vbnRnb21lcnkgY2FzZSwgZmllbGRfbXVsIHdpbGwgY2FuY2VsIG91dCBNb250Z29tZXJ5IGZhY3RvciBpbiBZOiAqLworCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCB5LCAmcG9pbnQtPlksIFpfMywgY3R4KSkgZ290byBlcnI7CisJCQl9CisJCX0KKworCXJldCA9IDE7CisKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnBvaW50LAorCWNvbnN0IEJJR05VTSAqeF8sIGludCB5X2JpdCwgQk5fQ1RYICpjdHgpCisJeworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICp0bXAxLCAqdG1wMiwgKngsICp5OworCWludCByZXQgPSAwOworCisJLyogY2xlYXIgZXJyb3IgcXVldWUqLworCUVSUl9jbGVhcl9lcnJvcigpOworCisJaWYgKGN0eCA9PSBOVUxMKQorCQl7CisJCWN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisJCWlmIChjdHggPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQl9CisKKwl5X2JpdCA9ICh5X2JpdCAhPSAwKTsKKworCUJOX0NUWF9zdGFydChjdHgpOworCXRtcDEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJdG1wMiA9IEJOX0NUWF9nZXQoY3R4KTsKKwl4ID0gQk5fQ1RYX2dldChjdHgpOworCXkgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHkgPT0gTlVMTCkgZ290byBlcnI7CisKKwkvKiBSZWNvdmVyIHkuICBXZSBoYXZlIGEgV2VpZXJzdHJhc3MgZXF1YXRpb24KKwkgKiAgICAgeV4yID0geF4zICsgYSp4ICsgYiwKKwkgKiBzbyAgeSAgaXMgb25lIG9mIHRoZSBzcXVhcmUgcm9vdHMgb2YgIHheMyArIGEqeCArIGIuCisJICovCisKKwkvKiB0bXAxIDo9IHheMyAqLworCWlmICghQk5fbm5tb2QoeCwgeF8sICZncm91cC0+ZmllbGQsY3R4KSkgZ290byBlcnI7CisJaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUgPT0gMCkKKwkJeworCQkvKiBmaWVsZF97c3FyLG11bH0gd29yayBvbiBzdGFuZGFyZCByZXByZXNlbnRhdGlvbiAqLworCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9zcXIoZ3JvdXAsIHRtcDIsIHhfLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCB0bXAxLCB0bXAyLCB4XywgY3R4KSkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFCTl9tb2Rfc3FyKHRtcDIsIHhfLCAmZ3JvdXAtPmZpZWxkLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9tb2RfbXVsKHRtcDEsIHRtcDIsIHhfLCAmZ3JvdXAtPmZpZWxkLCBjdHgpKSBnb3RvIGVycjsKKwkJfQorCQorCS8qIHRtcDEgOj0gdG1wMSArIGEqeCAqLworCWlmIChncm91cC0+YV9pc19taW51czMpCisJCXsKKwkJaWYgKCFCTl9tb2RfbHNoaWZ0MV9xdWljayh0bXAyLCB4LCAmZ3JvdXAtPmZpZWxkKSkgZ290byBlcnI7CisJCWlmICghQk5fbW9kX2FkZF9xdWljayh0bXAyLCB0bXAyLCB4LCAmZ3JvdXAtPmZpZWxkKSkgZ290byBlcnI7CisJCWlmICghQk5fbW9kX3N1Yl9xdWljayh0bXAxLCB0bXAxLCB0bXAyLCAmZ3JvdXAtPmZpZWxkKSkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUpCisJCQl7CisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIHRtcDIsICZncm91cC0+YSwgY3R4KSkgZ290byBlcnI7CisJCQlpZiAoIUJOX21vZF9tdWwodG1wMiwgdG1wMiwgeCwgJmdyb3VwLT5maWVsZCwgY3R4KSkgZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCS8qIGZpZWxkX211bCB3b3JrcyBvbiBzdGFuZGFyZCByZXByZXNlbnRhdGlvbiAqLworCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCB0bXAyLCAmZ3JvdXAtPmEsIHgsIGN0eCkpIGdvdG8gZXJyOworCQkJfQorCQkKKwkJaWYgKCFCTl9tb2RfYWRkX3F1aWNrKHRtcDEsIHRtcDEsIHRtcDIsICZncm91cC0+ZmllbGQpKSBnb3RvIGVycjsKKwkJfQorCQorCS8qIHRtcDEgOj0gdG1wMSArIGIgKi8KKwlpZiAoZ3JvdXAtPm1ldGgtPmZpZWxkX2RlY29kZSkKKwkJeworCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9kZWNvZGUoZ3JvdXAsIHRtcDIsICZncm91cC0+YiwgY3R4KSkgZ290byBlcnI7CisJCWlmICghQk5fbW9kX2FkZF9xdWljayh0bXAxLCB0bXAxLCB0bXAyLCAmZ3JvdXAtPmZpZWxkKSkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFCTl9tb2RfYWRkX3F1aWNrKHRtcDEsIHRtcDEsICZncm91cC0+YiwgJmdyb3VwLT5maWVsZCkpIGdvdG8gZXJyOworCQl9CisJCisJaWYgKCFCTl9tb2Rfc3FydCh5LCB0bXAxLCAmZ3JvdXAtPmZpZWxkLCBjdHgpKQorCQl7CisJCXVuc2lnbmVkIGxvbmcgZXJyID0gRVJSX3BlZWtfbGFzdF9lcnJvcigpOworCQkKKwkJaWYgKEVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9CTiAmJiBFUlJfR0VUX1JFQVNPTihlcnIpID09IEJOX1JfTk9UX0FfU1FVQVJFKQorCQkJeworCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQlFQ2VycihFQ19GX0VDX0dGUF9TSU1QTEVfU0VUX0NPTVBSRVNTRURfQ09PUkRJTkFURVMsIEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UKTsKKwkJCX0KKwkJZWxzZQorCQkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTLCBFUlJfUl9CTl9MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHlfYml0ICE9IEJOX2lzX29kZCh5KSkKKwkJeworCQlpZiAoQk5faXNfemVybyh5KSkKKwkJCXsKKwkJCWludCBrcm9uOworCisJCQlrcm9uID0gQk5fa3JvbmVja2VyKHgsICZncm91cC0+ZmllbGQsIGN0eCk7CisJCQlpZiAoa3JvbiA9PSAtMikgZ290byBlcnI7CisKKwkJCWlmIChrcm9uID09IDEpCisJCQkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTLCBFQ19SX0lOVkFMSURfQ09NUFJFU1NJT05fQklUKTsKKwkJCWVsc2UKKwkJCQkvKiBCTl9tb2Rfc3FydCgpIHNob3VsZCBoYXZlIGNvdWdodCB0aGlzIGVycm9yIChub3QgYSBzcXVhcmUpICovCisJCQkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTLCBFQ19SX0lOVkFMSURfQ09NUFJFU1NFRF9QT0lOVCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKCFCTl91c3ViKHksICZncm91cC0+ZmllbGQsIHkpKSBnb3RvIGVycjsKKwkJfQorCWlmICh5X2JpdCAhPSBCTl9pc19vZGQoeSkpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoIUVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KSkgZ290byBlcnI7CisKKwlyZXQgPSAxOworCisgZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlpZiAobmV3X2N0eCAhPSBOVUxMKQorCQlCTl9DVFhfZnJlZShuZXdfY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworCitzaXplX3QgZWNfR0ZwX3NpbXBsZV9wb2ludDJvY3QoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQsIHBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm0sCisJdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKmN0eCkKKwl7CisJc2l6ZV90IHJldDsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCWludCB1c2VkX2N0eCA9IDA7CisJQklHTlVNICp4LCAqeTsKKwlzaXplX3QgZmllbGRfbGVuLCBpLCBza2lwOworCisJaWYgKChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCkKKwkJJiYgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQpCisJCSYmIChmb3JtICE9IFBPSU5UX0NPTlZFUlNJT05fSFlCUklEKSkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlQyT0NULCBFQ19SX0lOVkFMSURfRk9STSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIHBvaW50KSkKKwkJeworCQkvKiBlbmNvZGVzIHRvIGEgc2luZ2xlIDAgb2N0ZXQgKi8KKwkJaWYgKGJ1ZiAhPSBOVUxMKQorCQkJeworCQkJaWYgKGxlbiA8IDEpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVDJPQ1QsIEVDX1JfQlVGRkVSX1RPT19TTUFMTCk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJYnVmWzBdID0gMDsKKwkJCX0KKwkJcmV0dXJuIDE7CisJCX0KKworCisJLyogcmV0IDo9IHJlcXVpcmVkIG91dHB1dCBidWZmZXIgbGVuZ3RoICovCisJZmllbGRfbGVuID0gQk5fbnVtX2J5dGVzKCZncm91cC0+ZmllbGQpOworCXJldCA9IChmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCkgPyAxICsgZmllbGRfbGVuIDogMSArIDIqZmllbGRfbGVuOworCisJLyogaWYgJ2J1ZicgaXMgTlVMTCwganVzdCByZXR1cm4gcmVxdWlyZWQgbGVuZ3RoICovCisJaWYgKGJ1ZiAhPSBOVUxMKQorCQl7CisJCWlmIChsZW4gPCByZXQpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlQyT0NULCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJeworCQkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJCWlmIChjdHggPT0gTlVMTCkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQlCTl9DVFhfc3RhcnQoY3R4KTsKKwkJdXNlZF9jdHggPSAxOworCQl4ID0gQk5fQ1RYX2dldChjdHgpOworCQl5ID0gQk5fQ1RYX2dldChjdHgpOworCQlpZiAoeSA9PSBOVUxMKSBnb3RvIGVycjsKKworCQlpZiAoIUVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KSkgZ290byBlcnI7CisKKwkJaWYgKChmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCB8fCBmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fSFlCUklEKSAmJiBCTl9pc19vZGQoeSkpCisJCQlidWZbMF0gPSBmb3JtICsgMTsKKwkJZWxzZQorCQkJYnVmWzBdID0gZm9ybTsKKwkKKwkJaSA9IDE7CisJCQorCQlza2lwID0gZmllbGRfbGVuIC0gQk5fbnVtX2J5dGVzKHgpOworCQlpZiAoc2tpcCA+IGZpZWxkX2xlbikKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVDJPQ1QsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl3aGlsZSAoc2tpcCA+IDApCisJCQl7CisJCQlidWZbaSsrXSA9IDA7CisJCQlza2lwLS07CisJCQl9CisJCXNraXAgPSBCTl9ibjJiaW4oeCwgYnVmICsgaSk7CisJCWkgKz0gc2tpcDsKKwkJaWYgKGkgIT0gMSArIGZpZWxkX2xlbikKKwkJCXsKKwkJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVDJPQ1QsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChmb3JtID09IFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEIHx8IGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQpCisJCQl7CisJCQlza2lwID0gZmllbGRfbGVuIC0gQk5fbnVtX2J5dGVzKHkpOworCQkJaWYgKHNraXAgPiBmaWVsZF9sZW4pCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVDJPQ1QsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl3aGlsZSAoc2tpcCA+IDApCisJCQkJeworCQkJCWJ1ZltpKytdID0gMDsKKwkJCQlza2lwLS07CisJCQkJfQorCQkJc2tpcCA9IEJOX2JuMmJpbih5LCBidWYgKyBpKTsKKwkJCWkgKz0gc2tpcDsKKwkJCX0KKworCQlpZiAoaSAhPSByZXQpCisJCQl7CisJCQlFQ2VycihFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlQyT0NULCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQorCWlmICh1c2VkX2N0eCkKKwkJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisKKyBlcnI6CisJaWYgKHVzZWRfY3R4KQorCQlCTl9DVFhfZW5kKGN0eCk7CisJaWYgKG5ld19jdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIDA7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX29jdDJwb2ludChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sIEJOX0NUWCAqY3R4KQorCXsKKwlwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtOworCWludCB5X2JpdDsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCUJJR05VTSAqeCwgKnk7CisJc2l6ZV90IGZpZWxkX2xlbiwgZW5jX2xlbjsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChsZW4gPT0gMCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dGUF9TSU1QTEVfT0NUMlBPSU5ULCBFQ19SX0JVRkZFUl9UT09fU01BTEwpOworCQlyZXR1cm4gMDsKKwkJfQorCWZvcm0gPSBidWZbMF07CisJeV9iaXQgPSBmb3JtICYgMTsKKwlmb3JtID0gZm9ybSAmIH4xVTsKKwlpZiAoKGZvcm0gIT0gMCkJJiYgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKQorCQkmJiAoZm9ybSAhPSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCkKKwkJJiYgKGZvcm0gIT0gUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQpKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9PQ1QyUE9JTlQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisJCXJldHVybiAwOworCQl9CisJaWYgKChmb3JtID09IDAgfHwgZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCkgJiYgeV9iaXQpCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX09DVDJQT0lOVCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmIChmb3JtID09IDApCisJCXsKKwkJaWYgKGxlbiAhPSAxKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX09DVDJQT0lOVCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKwkJCXJldHVybiAwOworCQkJfQorCisJCXJldHVybiBFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkoZ3JvdXAsIHBvaW50KTsKKwkJfQorCQorCWZpZWxkX2xlbiA9IEJOX251bV9ieXRlcygmZ3JvdXAtPmZpZWxkKTsKKwllbmNfbGVuID0gKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKSA/IDEgKyBmaWVsZF9sZW4gOiAxICsgMipmaWVsZF9sZW47CisKKwlpZiAobGVuICE9IGVuY19sZW4pCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX09DVDJQT0lOVCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJeCA9IEJOX0NUWF9nZXQoY3R4KTsKKwl5ID0gQk5fQ1RYX2dldChjdHgpOworCWlmICh5ID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKCFCTl9iaW4yYm4oYnVmICsgMSwgZmllbGRfbGVuLCB4KSkgZ290byBlcnI7CisJaWYgKEJOX3VjbXAoeCwgJmdyb3VwLT5maWVsZCkgPj0gMCkKKwkJeworCQlFQ2VycihFQ19GX0VDX0dGUF9TSU1QTEVfT0NUMlBPSU5ULCBFQ19SX0lOVkFMSURfRU5DT0RJTkcpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKGZvcm0gPT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKQorCQl7CisJCWlmICghRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeV9iaXQsIGN0eCkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghQk5fYmluMmJuKGJ1ZiArIDEgKyBmaWVsZF9sZW4sIGZpZWxkX2xlbiwgeSkpIGdvdG8gZXJyOworCQlpZiAoQk5fdWNtcCh5LCAmZ3JvdXAtPmZpZWxkKSA+PSAwKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX09DVDJQT0lOVCwgRUNfUl9JTlZBTElEX0VOQ09ESU5HKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoZm9ybSA9PSBQT0lOVF9DT05WRVJTSU9OX0hZQlJJRCkKKwkJCXsKKwkJCWlmICh5X2JpdCAhPSBCTl9pc19vZGQoeSkpCisJCQkJeworCQkJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9PQ1QyUE9JTlQsIEVDX1JfSU5WQUxJRF9FTkNPRElORyk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCisJCWlmICghRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHBvaW50LCB4LCB5LCBjdHgpKSBnb3RvIGVycjsKKwkJfQorCQorCWlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZ3JvdXAsIHBvaW50LCBjdHgpKSAvKiB0ZXN0IHJlcXVpcmVkIGJ5IFg5LjYyICovCisJCXsKKwkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX09DVDJQT0lOVCwgRUNfUl9QT0lOVF9JU19OT1RfT05fQ1VSVkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJcmV0ID0gMTsKKwkKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX2FkZChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfUE9JTlQgKmIsIEJOX0NUWCAqY3R4KQorCXsKKwlpbnQgKCpmaWVsZF9tdWwpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgY29uc3QgQklHTlVNICosIEJOX0NUWCAqKTsKKwlpbnQgKCpmaWVsZF9zcXIpKGNvbnN0IEVDX0dST1VQICosIEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgQk5fQ1RYICopOworCWNvbnN0IEJJR05VTSAqcDsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCUJJR05VTSAqbjAsICpuMSwgKm4yLCAqbjMsICpuNCwgKm41LCAqbjY7CisJaW50IHJldCA9IDA7CisJCisJaWYgKGEgPT0gYikKKwkJcmV0dXJuIEVDX1BPSU5UX2RibChncm91cCwgciwgYSwgY3R4KTsKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGEpKQorCQlyZXR1cm4gRUNfUE9JTlRfY29weShyLCBiKTsKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGIpKQorCQlyZXR1cm4gRUNfUE9JTlRfY29weShyLCBhKTsKKwkKKwlmaWVsZF9tdWwgPSBncm91cC0+bWV0aC0+ZmllbGRfbXVsOworCWZpZWxkX3NxciA9IGdyb3VwLT5tZXRoLT5maWVsZF9zcXI7CisJcCA9ICZncm91cC0+ZmllbGQ7CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCW4wID0gQk5fQ1RYX2dldChjdHgpOworCW4xID0gQk5fQ1RYX2dldChjdHgpOworCW4yID0gQk5fQ1RYX2dldChjdHgpOworCW4zID0gQk5fQ1RYX2dldChjdHgpOworCW40ID0gQk5fQ1RYX2dldChjdHgpOworCW41ID0gQk5fQ1RYX2dldChjdHgpOworCW42ID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChuNiA9PSBOVUxMKSBnb3RvIGVuZDsKKworCS8qIE5vdGUgdGhhdCBpbiB0aGlzIGZ1bmN0aW9uIHdlIG11c3Qgbm90IHJlYWQgY29tcG9uZW50cyBvZiAnYScgb3IgJ2InCisJICogb25jZSB3ZSBoYXZlIHdyaXR0ZW4gdGhlIGNvcnJlc3BvbmRpbmcgY29tcG9uZW50cyBvZiAncicuCisJICogKCdyJyBtaWdodCBiZSBvbmUgb2YgJ2EnIG9yICdiJy4pCisJICovCisKKwkvKiBuMSwgbjIgKi8KKwlpZiAoYi0+Wl9pc19vbmUpCisJCXsKKwkJaWYgKCFCTl9jb3B5KG4xLCAmYS0+WCkpIGdvdG8gZW5kOworCQlpZiAoIUJOX2NvcHkobjIsICZhLT5ZKSkgZ290byBlbmQ7CisJCS8qIG4xID0gWF9hICovCisJCS8qIG4yID0gWV9hICovCisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFmaWVsZF9zcXIoZ3JvdXAsIG4wLCAmYi0+WiwgY3R4KSkgZ290byBlbmQ7CisJCWlmICghZmllbGRfbXVsKGdyb3VwLCBuMSwgJmEtPlgsIG4wLCBjdHgpKSBnb3RvIGVuZDsKKwkJLyogbjEgPSBYX2EgKiBaX2JeMiAqLworCisJCWlmICghZmllbGRfbXVsKGdyb3VwLCBuMCwgbjAsICZiLT5aLCBjdHgpKSBnb3RvIGVuZDsKKwkJaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG4yLCAmYS0+WSwgbjAsIGN0eCkpIGdvdG8gZW5kOworCQkvKiBuMiA9IFlfYSAqIFpfYl4zICovCisJCX0KKworCS8qIG4zLCBuNCAqLworCWlmIChhLT5aX2lzX29uZSkKKwkJeworCQlpZiAoIUJOX2NvcHkobjMsICZiLT5YKSkgZ290byBlbmQ7CisJCWlmICghQk5fY29weShuNCwgJmItPlkpKSBnb3RvIGVuZDsKKwkJLyogbjMgPSBYX2IgKi8KKwkJLyogbjQgPSBZX2IgKi8KKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIWZpZWxkX3Nxcihncm91cCwgbjAsICZhLT5aLCBjdHgpKSBnb3RvIGVuZDsKKwkJaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG4zLCAmYi0+WCwgbjAsIGN0eCkpIGdvdG8gZW5kOworCQkvKiBuMyA9IFhfYiAqIFpfYV4yICovCisKKwkJaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG4wLCBuMCwgJmEtPlosIGN0eCkpIGdvdG8gZW5kOworCQlpZiAoIWZpZWxkX211bChncm91cCwgbjQsICZiLT5ZLCBuMCwgY3R4KSkgZ290byBlbmQ7CisJCS8qIG40ID0gWV9iICogWl9hXjMgKi8KKwkJfQorCisJLyogbjUsIG42ICovCisJaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKG41LCBuMSwgbjMsIHApKSBnb3RvIGVuZDsKKwlpZiAoIUJOX21vZF9zdWJfcXVpY2sobjYsIG4yLCBuNCwgcCkpIGdvdG8gZW5kOworCS8qIG41ID0gbjEgLSBuMyAqLworCS8qIG42ID0gbjIgLSBuNCAqLworCisJaWYgKEJOX2lzX3plcm8objUpKQorCQl7CisJCWlmIChCTl9pc196ZXJvKG42KSkKKwkJCXsKKwkJCS8qIGEgaXMgdGhlIHNhbWUgcG9pbnQgYXMgYiAqLworCQkJQk5fQ1RYX2VuZChjdHgpOworCQkJcmV0ID0gRUNfUE9JTlRfZGJsKGdyb3VwLCByLCBhLCBjdHgpOworCQkJY3R4ID0gTlVMTDsKKwkJCWdvdG8gZW5kOworCQkJfQorCQllbHNlCisJCQl7CisJCQkvKiBhIGlzIHRoZSBpbnZlcnNlIG9mIGIgKi8KKwkJCUJOX3plcm8oJnItPlopOworCQkJci0+Wl9pc19vbmUgPSAwOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisKKwkvKiAnbjcnLCAnbjgnICovCisJaWYgKCFCTl9tb2RfYWRkX3F1aWNrKG4xLCBuMSwgbjMsIHApKSBnb3RvIGVuZDsKKwlpZiAoIUJOX21vZF9hZGRfcXVpY2sobjIsIG4yLCBuNCwgcCkpIGdvdG8gZW5kOworCS8qICduNycgPSBuMSArIG4zICovCisJLyogJ244JyA9IG4yICsgbjQgKi8KKworCS8qIFpfciAqLworCWlmIChhLT5aX2lzX29uZSAmJiBiLT5aX2lzX29uZSkKKwkJeworCQlpZiAoIUJOX2NvcHkoJnItPlosIG41KSkgZ290byBlbmQ7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGEtPlpfaXNfb25lKQorCQkJeyBpZiAoIUJOX2NvcHkobjAsICZiLT5aKSkgZ290byBlbmQ7IH0KKwkJZWxzZSBpZiAoYi0+Wl9pc19vbmUpCisJCQl7IGlmICghQk5fY29weShuMCwgJmEtPlopKSBnb3RvIGVuZDsgfQorCQllbHNlCisJCQl7IGlmICghZmllbGRfbXVsKGdyb3VwLCBuMCwgJmEtPlosICZiLT5aLCBjdHgpKSBnb3RvIGVuZDsgfQorCQlpZiAoIWZpZWxkX211bChncm91cCwgJnItPlosIG4wLCBuNSwgY3R4KSkgZ290byBlbmQ7CisJCX0KKwlyLT5aX2lzX29uZSA9IDA7CisJLyogWl9yID0gWl9hICogWl9iICogbjUgKi8KKworCS8qIFhfciAqLworCWlmICghZmllbGRfc3FyKGdyb3VwLCBuMCwgbjYsIGN0eCkpIGdvdG8gZW5kOworCWlmICghZmllbGRfc3FyKGdyb3VwLCBuNCwgbjUsIGN0eCkpIGdvdG8gZW5kOworCWlmICghZmllbGRfbXVsKGdyb3VwLCBuMywgbjEsIG40LCBjdHgpKSBnb3RvIGVuZDsKKwlpZiAoIUJOX21vZF9zdWJfcXVpY2soJnItPlgsIG4wLCBuMywgcCkpIGdvdG8gZW5kOworCS8qIFhfciA9IG42XjIgLSBuNV4yICogJ243JyAqLworCQorCS8qICduOScgKi8KKwlpZiAoIUJOX21vZF9sc2hpZnQxX3F1aWNrKG4wLCAmci0+WCwgcCkpIGdvdG8gZW5kOworCWlmICghQk5fbW9kX3N1Yl9xdWljayhuMCwgbjMsIG4wLCBwKSkgZ290byBlbmQ7CisJLyogbjkgPSBuNV4yICogJ243JyAtIDIgKiBYX3IgKi8KKworCS8qIFlfciAqLworCWlmICghZmllbGRfbXVsKGdyb3VwLCBuMCwgbjAsIG42LCBjdHgpKSBnb3RvIGVuZDsKKwlpZiAoIWZpZWxkX211bChncm91cCwgbjUsIG40LCBuNSwgY3R4KSkgZ290byBlbmQ7IC8qIG5vdyBuNSBpcyBuNV4zICovCisJaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG4xLCBuMiwgbjUsIGN0eCkpIGdvdG8gZW5kOworCWlmICghQk5fbW9kX3N1Yl9xdWljayhuMCwgbjAsIG4xLCBwKSkgZ290byBlbmQ7CisJaWYgKEJOX2lzX29kZChuMCkpCisJCWlmICghQk5fYWRkKG4wLCBuMCwgcCkpIGdvdG8gZW5kOworCS8qIG5vdyAgMCA8PSBuMCA8IDIqcCwgIGFuZCBuMCBpcyBldmVuICovCisJaWYgKCFCTl9yc2hpZnQxKCZyLT5ZLCBuMCkpIGdvdG8gZW5kOworCS8qIFlfciA9IChuNiAqICduOScgLSAnbjgnICogJ241XjMnKSAvIDIgKi8KKworCXJldCA9IDE7CisKKyBlbmQ6CisJaWYgKGN0eCkgLyogb3RoZXJ3aXNlIHdlIGFscmVhZHkgY2FsbGVkIEJOX0NUWF9lbmQgKi8KKwkJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX2RibChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBFQ19QT0lOVCAqYSwgQk5fQ1RYICpjdHgpCisJeworCWludCAoKmZpZWxkX211bCkoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgQk5fQ1RYICopOworCWludCAoKmZpZWxkX3NxcikoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBCTl9DVFggKik7CisJY29uc3QgQklHTlVNICpwOworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICpuMCwgKm4xLCAqbjIsICpuMzsKKwlpbnQgcmV0ID0gMDsKKwkKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGEpKQorCQl7CisJCUJOX3plcm8oJnItPlopOworCQlyLT5aX2lzX29uZSA9IDA7CisJCXJldHVybiAxOworCQl9CisKKwlmaWVsZF9tdWwgPSBncm91cC0+bWV0aC0+ZmllbGRfbXVsOworCWZpZWxkX3NxciA9IGdyb3VwLT5tZXRoLT5maWVsZF9zcXI7CisJcCA9ICZncm91cC0+ZmllbGQ7CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCW4wID0gQk5fQ1RYX2dldChjdHgpOworCW4xID0gQk5fQ1RYX2dldChjdHgpOworCW4yID0gQk5fQ1RYX2dldChjdHgpOworCW4zID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChuMyA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIE5vdGUgdGhhdCBpbiB0aGlzIGZ1bmN0aW9uIHdlIG11c3Qgbm90IHJlYWQgY29tcG9uZW50cyBvZiAnYScKKwkgKiBvbmNlIHdlIGhhdmUgd3JpdHRlbiB0aGUgY29ycmVzcG9uZGluZyBjb21wb25lbnRzIG9mICdyJy4KKwkgKiAoJ3InIG1pZ2h0IHRoZSBzYW1lIGFzICdhJy4pCisJICovCisKKwkvKiBuMSAqLworCWlmIChhLT5aX2lzX29uZSkKKwkJeworCQlpZiAoIWZpZWxkX3Nxcihncm91cCwgbjAsICZhLT5YLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9tb2RfbHNoaWZ0MV9xdWljayhuMSwgbjAsIHApKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9tb2RfYWRkX3F1aWNrKG4wLCBuMCwgbjEsIHApKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9tb2RfYWRkX3F1aWNrKG4xLCBuMCwgJmdyb3VwLT5hLCBwKSkgZ290byBlcnI7CisJCS8qIG4xID0gMyAqIFhfYV4yICsgYV9jdXJ2ZSAqLworCQl9CisJZWxzZSBpZiAoZ3JvdXAtPmFfaXNfbWludXMzKQorCQl7CisJCWlmICghZmllbGRfc3FyKGdyb3VwLCBuMSwgJmEtPlosIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX21vZF9hZGRfcXVpY2sobjAsICZhLT5YLCBuMSwgcCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX21vZF9zdWJfcXVpY2sobjIsICZhLT5YLCBuMSwgcCkpIGdvdG8gZXJyOworCQlpZiAoIWZpZWxkX211bChncm91cCwgbjEsIG4wLCBuMiwgY3R4KSkgZ290byBlcnI7CisJCWlmICghQk5fbW9kX2xzaGlmdDFfcXVpY2sobjAsIG4xLCBwKSkgZ290byBlcnI7CisJCWlmICghQk5fbW9kX2FkZF9xdWljayhuMSwgbjAsIG4xLCBwKSkgZ290byBlcnI7CisJCS8qIG4xID0gMyAqIChYX2EgKyBaX2FeMikgKiAoWF9hIC0gWl9hXjIpCisJCSAqICAgID0gMyAqIFhfYV4yIC0gMyAqIFpfYV40ICovCisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFmaWVsZF9zcXIoZ3JvdXAsIG4wLCAmYS0+WCwgY3R4KSkgZ290byBlcnI7CisJCWlmICghQk5fbW9kX2xzaGlmdDFfcXVpY2sobjEsIG4wLCBwKSkgZ290byBlcnI7CisJCWlmICghQk5fbW9kX2FkZF9xdWljayhuMCwgbjAsIG4xLCBwKSkgZ290byBlcnI7CisJCWlmICghZmllbGRfc3FyKGdyb3VwLCBuMSwgJmEtPlosIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIWZpZWxkX3Nxcihncm91cCwgbjEsIG4xLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIG4xLCBuMSwgJmdyb3VwLT5hLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9tb2RfYWRkX3F1aWNrKG4xLCBuMSwgbjAsIHApKSBnb3RvIGVycjsKKwkJLyogbjEgPSAzICogWF9hXjIgKyBhX2N1cnZlICogWl9hXjQgKi8KKwkJfQorCisJLyogWl9yICovCisJaWYgKGEtPlpfaXNfb25lKQorCQl7CisJCWlmICghQk5fY29weShuMCwgJmEtPlkpKSBnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIWZpZWxkX211bChncm91cCwgbjAsICZhLT5ZLCAmYS0+WiwgY3R4KSkgZ290byBlcnI7CisJCX0KKwlpZiAoIUJOX21vZF9sc2hpZnQxX3F1aWNrKCZyLT5aLCBuMCwgcCkpIGdvdG8gZXJyOworCXItPlpfaXNfb25lID0gMDsKKwkvKiBaX3IgPSAyICogWV9hICogWl9hICovCisKKwkvKiBuMiAqLworCWlmICghZmllbGRfc3FyKGdyb3VwLCBuMywgJmEtPlksIGN0eCkpIGdvdG8gZXJyOworCWlmICghZmllbGRfbXVsKGdyb3VwLCBuMiwgJmEtPlgsIG4zLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIUJOX21vZF9sc2hpZnRfcXVpY2sobjIsIG4yLCAyLCBwKSkgZ290byBlcnI7CisJLyogbjIgPSA0ICogWF9hICogWV9hXjIgKi8KKworCS8qIFhfciAqLworCWlmICghQk5fbW9kX2xzaGlmdDFfcXVpY2sobjAsIG4yLCBwKSkgZ290byBlcnI7CisJaWYgKCFmaWVsZF9zcXIoZ3JvdXAsICZyLT5YLCBuMSwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKCZyLT5YLCAmci0+WCwgbjAsIHApKSBnb3RvIGVycjsKKwkvKiBYX3IgPSBuMV4yIC0gMiAqIG4yICovCisJCisJLyogbjMgKi8KKwlpZiAoIWZpZWxkX3Nxcihncm91cCwgbjAsIG4zLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIUJOX21vZF9sc2hpZnRfcXVpY2sobjMsIG4wLCAzLCBwKSkgZ290byBlcnI7CisJLyogbjMgPSA4ICogWV9hXjQgKi8KKwkKKwkvKiBZX3IgKi8KKwlpZiAoIUJOX21vZF9zdWJfcXVpY2sobjAsIG4yLCAmci0+WCwgcCkpIGdvdG8gZXJyOworCWlmICghZmllbGRfbXVsKGdyb3VwLCBuMCwgbjEsIG4wLCBjdHgpKSBnb3RvIGVycjsKKwlpZiAoIUJOX21vZF9zdWJfcXVpY2soJnItPlksIG4wLCBuMywgcCkpIGdvdG8gZXJyOworCS8qIFlfciA9IG4xICogKG4yIC0gWF9yKSAtIG4zICovCisKKwlyZXQgPSAxOworCisgZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlpZiAobmV3X2N0eCAhPSBOVUxMKQorCQlCTl9DVFhfZnJlZShuZXdfY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworCitpbnQgZWNfR0ZwX3NpbXBsZV9pbnZlcnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KQorCXsKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIHBvaW50KSB8fCBCTl9pc196ZXJvKCZwb2ludC0+WSkpCisJCS8qIHBvaW50IGlzIGl0cyBvd24gaW52ZXJzZSAqLworCQlyZXR1cm4gMTsKKwkKKwlyZXR1cm4gQk5fdXN1YigmcG9pbnQtPlksICZncm91cC0+ZmllbGQsICZwb2ludC0+WSk7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX2lzX2F0X2luZmluaXR5KGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKnBvaW50KQorCXsKKwlyZXR1cm4gQk5faXNfemVybygmcG9pbnQtPlopOworCX0KKworCitpbnQgZWNfR0ZwX3NpbXBsZV9pc19vbl9jdXJ2ZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwb2ludCwgQk5fQ1RYICpjdHgpCisJeworCWludCAoKmZpZWxkX211bCkoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgQk5fQ1RYICopOworCWludCAoKmZpZWxkX3NxcikoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBCTl9DVFggKik7CisJY29uc3QgQklHTlVNICpwOworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICpyaCwgKnRtcCwgKlo0LCAqWjY7CisJaW50IHJldCA9IC0xOworCisJaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpCisJCXJldHVybiAxOworCQorCWZpZWxkX211bCA9IGdyb3VwLT5tZXRoLT5maWVsZF9tdWw7CisJZmllbGRfc3FyID0gZ3JvdXAtPm1ldGgtPmZpZWxkX3NxcjsKKwlwID0gJmdyb3VwLT5maWVsZDsKKworCWlmIChjdHggPT0gTlVMTCkKKwkJeworCQljdHggPSBuZXdfY3R4ID0gQk5fQ1RYX25ldygpOworCQlpZiAoY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCX0KKworCUJOX0NUWF9zdGFydChjdHgpOworCXJoID0gQk5fQ1RYX2dldChjdHgpOworCXRtcCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlaNCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlaNiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoWjYgPT0gTlVMTCkgZ290byBlcnI7CisKKwkvKiBXZSBoYXZlIGEgY3VydmUgZGVmaW5lZCBieSBhIFdlaWVyc3RyYXNzIGVxdWF0aW9uCisJICogICAgICB5XjIgPSB4XjMgKyBhKnggKyBiLgorCSAqIFRoZSBwb2ludCB0byBjb25zaWRlciBpcyBnaXZlbiBpbiBKYWNvYmlhbiBwcm9qZWN0aXZlIGNvb3JkaW5hdGVzCisJICogd2hlcmUgIChYLCBZLCBaKSAgcmVwcmVzZW50cyAgKHgsIHkpID0gKFgvWl4yLCBZL1peMykuCisJICogU3Vic3RpdHV0aW5nIHRoaXMgYW5kIG11bHRpcGx5aW5nIGJ5ICBaXjYgIHRyYW5zZm9ybXMgdGhlIGFib3ZlIGVxdWF0aW9uIGludG8KKwkgKiAgICAgIFleMiA9IFheMyArIGEqWCpaXjQgKyBiKlpeNi4KKwkgKiBUbyB0ZXN0IHRoaXMsIHdlIGFkZCB1cCB0aGUgcmlnaHQtaGFuZCBzaWRlIGluICdyaCcuCisJICovCisKKwkvKiByaCA6PSBYXjIgKi8KKwlpZiAoIWZpZWxkX3Nxcihncm91cCwgcmgsICZwb2ludC0+WCwgY3R4KSkgZ290byBlcnI7CisKKwlpZiAoIXBvaW50LT5aX2lzX29uZSkKKwkJeworCQlpZiAoIWZpZWxkX3Nxcihncm91cCwgdG1wLCAmcG9pbnQtPlosIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIWZpZWxkX3Nxcihncm91cCwgWjQsIHRtcCwgY3R4KSkgZ290byBlcnI7CisJCWlmICghZmllbGRfbXVsKGdyb3VwLCBaNiwgWjQsIHRtcCwgY3R4KSkgZ290byBlcnI7CisKKwkJLyogcmggOj0gKHJoICsgYSpaXjQpKlggKi8KKwkJaWYgKGdyb3VwLT5hX2lzX21pbnVzMykKKwkJCXsKKwkJCWlmICghQk5fbW9kX2xzaGlmdDFfcXVpY2sodG1wLCBaNCwgcCkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9tb2RfYWRkX3F1aWNrKHRtcCwgdG1wLCBaNCwgcCkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9tb2Rfc3ViX3F1aWNrKHJoLCByaCwgdG1wLCBwKSkgZ290byBlcnI7CisJCQlpZiAoIWZpZWxkX211bChncm91cCwgcmgsIHJoLCAmcG9pbnQtPlgsIGN0eCkpIGdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoIWZpZWxkX211bChncm91cCwgdG1wLCBaNCwgJmdyb3VwLT5hLCBjdHgpKSBnb3RvIGVycjsKKwkJCWlmICghQk5fbW9kX2FkZF9xdWljayhyaCwgcmgsIHRtcCwgcCkpIGdvdG8gZXJyOworCQkJaWYgKCFmaWVsZF9tdWwoZ3JvdXAsIHJoLCByaCwgJnBvaW50LT5YLCBjdHgpKSBnb3RvIGVycjsKKwkJCX0KKworCQkvKiByaCA6PSByaCArIGIqWl42ICovCisJCWlmICghZmllbGRfbXVsKGdyb3VwLCB0bXAsICZncm91cC0+YiwgWjYsIGN0eCkpIGdvdG8gZXJyOworCQlpZiAoIUJOX21vZF9hZGRfcXVpY2socmgsIHJoLCB0bXAsIHApKSBnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBwb2ludC0+Wl9pc19vbmUgKi8KKworCQkvKiByaCA6PSAocmggKyBhKSpYICovCisJCWlmICghQk5fbW9kX2FkZF9xdWljayhyaCwgcmgsICZncm91cC0+YSwgcCkpIGdvdG8gZXJyOworCQlpZiAoIWZpZWxkX211bChncm91cCwgcmgsIHJoLCAmcG9pbnQtPlgsIGN0eCkpIGdvdG8gZXJyOworCQkvKiByaCA6PSByaCArIGIgKi8KKwkJaWYgKCFCTl9tb2RfYWRkX3F1aWNrKHJoLCByaCwgJmdyb3VwLT5iLCBwKSkgZ290byBlcnI7CisJCX0KKworCS8qICdsaCcgOj0gWV4yICovCisJaWYgKCFmaWVsZF9zcXIoZ3JvdXAsIHRtcCwgJnBvaW50LT5ZLCBjdHgpKSBnb3RvIGVycjsKKworCXJldCA9ICgwID09IEJOX3VjbXAodG1wLCByaCkpOworCisgZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlpZiAobmV3X2N0eCAhPSBOVUxMKQorCQlCTl9DVFhfZnJlZShuZXdfY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworCitpbnQgZWNfR0ZwX3NpbXBsZV9jbXAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqYSwgY29uc3QgRUNfUE9JTlQgKmIsIEJOX0NUWCAqY3R4KQorCXsKKwkvKiByZXR1cm4gdmFsdWVzOgorCSAqICAtMSAgIGVycm9yCisJICogICAwICAgZXF1YWwgKGluIGFmZmluZSBjb29yZGluYXRlcykKKwkgKiAgIDEgICBub3QgZXF1YWwKKwkgKi8KKworCWludCAoKmZpZWxkX211bCkoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBjb25zdCBCSUdOVU0gKiwgQk5fQ1RYICopOworCWludCAoKmZpZWxkX3NxcikoY29uc3QgRUNfR1JPVVAgKiwgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBCTl9DVFggKik7CisJQk5fQ1RYICpuZXdfY3R4ID0gTlVMTDsKKwlCSUdOVU0gKnRtcDEsICp0bXAyLCAqWmEyMywgKlpiMjM7CisJY29uc3QgQklHTlVNICp0bXAxXywgKnRtcDJfOworCWludCByZXQgPSAtMTsKKwkKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIGEpKQorCQl7CisJCXJldHVybiBFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgYikgPyAwIDogMTsKKwkJfQorCQorCWlmIChhLT5aX2lzX29uZSAmJiBiLT5aX2lzX29uZSkKKwkJeworCQlyZXR1cm4gKChCTl9jbXAoJmEtPlgsICZiLT5YKSA9PSAwKSAmJiBCTl9jbXAoJmEtPlksICZiLT5ZKSA9PSAwKSA/IDAgOiAxOworCQl9CisKKwlmaWVsZF9tdWwgPSBncm91cC0+bWV0aC0+ZmllbGRfbXVsOworCWZpZWxkX3NxciA9IGdyb3VwLT5tZXRoLT5maWVsZF9zcXI7CisKKwlpZiAoY3R4ID09IE5VTEwpCisJCXsKKwkJY3R4ID0gbmV3X2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwl0bXAxID0gQk5fQ1RYX2dldChjdHgpOworCXRtcDIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJWmEyMyA9IEJOX0NUWF9nZXQoY3R4KTsKKwlaYjIzID0gQk5fQ1RYX2dldChjdHgpOworCWlmIChaYjIzID09IE5VTEwpIGdvdG8gZW5kOworCisJLyogV2UgaGF2ZSB0byBkZWNpZGUgd2hldGhlcgorCSAqICAgICAoWF9hL1pfYV4yLCBZX2EvWl9hXjMpID0gKFhfYi9aX2JeMiwgWV9iL1pfYl4zKSwKKwkgKiBvciBlcXVpdmFsZW50bHksIHdoZXRoZXIKKwkgKiAgICAgKFhfYSpaX2JeMiwgWV9hKlpfYl4zKSA9IChYX2IqWl9hXjIsIFlfYipaX2FeMykuCisJICovCisKKwlpZiAoIWItPlpfaXNfb25lKQorCQl7CisJCWlmICghZmllbGRfc3FyKGdyb3VwLCBaYjIzLCAmYi0+WiwgY3R4KSkgZ290byBlbmQ7CisJCWlmICghZmllbGRfbXVsKGdyb3VwLCB0bXAxLCAmYS0+WCwgWmIyMywgY3R4KSkgZ290byBlbmQ7CisJCXRtcDFfID0gdG1wMTsKKwkJfQorCWVsc2UKKwkJdG1wMV8gPSAmYS0+WDsKKwlpZiAoIWEtPlpfaXNfb25lKQorCQl7CisJCWlmICghZmllbGRfc3FyKGdyb3VwLCBaYTIzLCAmYS0+WiwgY3R4KSkgZ290byBlbmQ7CisJCWlmICghZmllbGRfbXVsKGdyb3VwLCB0bXAyLCAmYi0+WCwgWmEyMywgY3R4KSkgZ290byBlbmQ7CisJCXRtcDJfID0gdG1wMjsKKwkJfQorCWVsc2UKKwkJdG1wMl8gPSAmYi0+WDsKKwkKKwkvKiBjb21wYXJlICBYX2EqWl9iXjIgIHdpdGggIFhfYipaX2FeMiAqLworCWlmIChCTl9jbXAodG1wMV8sIHRtcDJfKSAhPSAwKQorCQl7CisJCXJldCA9IDE7IC8qIHBvaW50cyBkaWZmZXIgKi8KKwkJZ290byBlbmQ7CisJCX0KKworCisJaWYgKCFiLT5aX2lzX29uZSkKKwkJeworCQlpZiAoIWZpZWxkX211bChncm91cCwgWmIyMywgWmIyMywgJmItPlosIGN0eCkpIGdvdG8gZW5kOworCQlpZiAoIWZpZWxkX211bChncm91cCwgdG1wMSwgJmEtPlksIFpiMjMsIGN0eCkpIGdvdG8gZW5kOworCQkvKiB0bXAxXyA9IHRtcDEgKi8KKwkJfQorCWVsc2UKKwkJdG1wMV8gPSAmYS0+WTsKKwlpZiAoIWEtPlpfaXNfb25lKQorCQl7CisJCWlmICghZmllbGRfbXVsKGdyb3VwLCBaYTIzLCBaYTIzLCAmYS0+WiwgY3R4KSkgZ290byBlbmQ7CisJCWlmICghZmllbGRfbXVsKGdyb3VwLCB0bXAyLCAmYi0+WSwgWmEyMywgY3R4KSkgZ290byBlbmQ7CisJCS8qIHRtcDJfID0gdG1wMiAqLworCQl9CisJZWxzZQorCQl0bXAyXyA9ICZiLT5ZOworCisJLyogY29tcGFyZSAgWV9hKlpfYl4zICB3aXRoICBZX2IqWl9hXjMgKi8KKwlpZiAoQk5fY21wKHRtcDFfLCB0bXAyXykgIT0gMCkKKwkJeworCQlyZXQgPSAxOyAvKiBwb2ludHMgZGlmZmVyICovCisJCWdvdG8gZW5kOworCQl9CisKKwkvKiBwb2ludHMgYXJlIGVxdWFsICovCisJcmV0ID0gMDsKKworIGVuZDoKKwlCTl9DVFhfZW5kKGN0eCk7CisJaWYgKG5ld19jdHggIT0gTlVMTCkKKwkJQk5fQ1RYX2ZyZWUobmV3X2N0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKworaW50IGVjX0dGcF9zaW1wbGVfbWFrZV9hZmZpbmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KQorCXsKKwlCTl9DVFggKm5ld19jdHggPSBOVUxMOworCUJJR05VTSAqeCwgKnk7CisJaW50IHJldCA9IDA7CisKKwlpZiAocG9pbnQtPlpfaXNfb25lIHx8IEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBwb2ludCkpCisJCXJldHVybiAxOworCisJaWYgKGN0eCA9PSBOVUxMKQorCQl7CisJCWN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisJCWlmIChjdHggPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwl4ID0gQk5fQ1RYX2dldChjdHgpOworCXkgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHkgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAoIUVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBwb2ludCwgeCwgeSwgY3R4KSkgZ290byBlcnI7CisJaWYgKCFFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgcG9pbnQsIHgsIHksIGN0eCkpIGdvdG8gZXJyOworCWlmICghcG9pbnQtPlpfaXNfb25lKQorCQl7CisJCUVDZXJyKEVDX0ZfRUNfR0ZQX1NJTVBMRV9NQUtFX0FGRklORSwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCQorCXJldCA9IDE7CisKKyBlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCWlmIChuZXdfY3R4ICE9IE5VTEwpCisJCUJOX0NUWF9mcmVlKG5ld19jdHgpOworCXJldHVybiByZXQ7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIHNpemVfdCBudW0sIEVDX1BPSU5UICpwb2ludHNbXSwgQk5fQ1RYICpjdHgpCisJeworCUJOX0NUWCAqbmV3X2N0eCA9IE5VTEw7CisJQklHTlVNICp0bXAwLCAqdG1wMTsKKwlzaXplX3QgcG93MiA9IDA7CisJQklHTlVNICoqaGVhcCA9IE5VTEw7CisJc2l6ZV90IGk7CisJaW50IHJldCA9IDA7CisKKwlpZiAobnVtID09IDApCisJCXJldHVybiAxOworCisJaWYgKGN0eCA9PSBOVUxMKQorCQl7CisJCWN0eCA9IG5ld19jdHggPSBCTl9DVFhfbmV3KCk7CisJCWlmIChjdHggPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQl9CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwl0bXAwID0gQk5fQ1RYX2dldChjdHgpOworCXRtcDEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHRtcDAgID09IE5VTEwgfHwgdG1wMSA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIEJlZm9yZSBjb252ZXJ0aW5nIHRoZSBpbmRpdmlkdWFsIHBvaW50cywgY29tcHV0ZSBpbnZlcnNlcyBvZiBhbGwgWiB2YWx1ZXMuCisJICogTW9kdWxhciBpbnZlcnNpb24gaXMgcmF0aGVyIHNsb3csIGJ1dCBsdWNraWx5IHdlIGNhbiBkbyB3aXRoIGEgc2luZ2xlCisJICogZXhwbGljaXQgaW52ZXJzaW9uLCBwbHVzIGFib3V0IDMgbXVsdGlwbGljYXRpb25zIHBlciBpbnB1dCB2YWx1ZS4KKwkgKi8KKworCXBvdzIgPSAxOworCXdoaWxlIChudW0gPiBwb3cyKQorCQlwb3cyIDw8PSAxOworCS8qIE5vdyBwb3cyIGlzIHRoZSBzbWFsbGVzdCBwb3dlciBvZiAyIHNhdGlmc3lpbmcgcG93MiA+PSBudW0uCisJICogV2UgbmVlZCB0d2ljZSB0aGF0LiAqLworCXBvdzIgPDw9IDE7CisKKwloZWFwID0gT1BFTlNTTF9tYWxsb2MocG93MiAqIHNpemVvZiBoZWFwWzBdKTsKKwlpZiAoaGVhcCA9PSBOVUxMKSBnb3RvIGVycjsKKwkKKwkvKiBUaGUgYXJyYXkgaXMgdXNlZCBhcyBhIGJpbmFyeSB0cmVlLCBleGFjdGx5IGFzIGluIGhlYXBzb3J0OgorCSAqCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFsxXQorCSAqICAgICAgICAgICAgICAgICBoZWFwWzJdICAgICAgICAgICAgICAgICAgICAgaGVhcFszXQorCSAqICAgICAgICAgIGhlYXBbNF0gICAgICAgaGVhcFs1XSAgICAgICBoZWFwWzZdICAgICAgIGhlYXBbN10KKwkgKiAgIGhlYXBbOF1oZWFwWzldIGhlYXBbMTBdaGVhcFsxMV0gaGVhcFsxMl1oZWFwWzEzXSBoZWFwWzE0XSBoZWFwWzE1XQorCSAqCisJICogV2UgcHV0IHRoZSBaJ3MgaW4gdGhlIGxhc3QgbGluZTsKKwkgKiB0aGVuIHdlIHNldCBlYWNoIG90aGVyIG5vZGUgdG8gdGhlIHByb2R1Y3Qgb2YgaXRzIHR3byBjaGlsZC1ub2RlcyAod2hlcmUKKwkgKiBlbXB0eSBvciAwIGVudHJpZXMgYXJlIHRyZWF0ZWQgYXMgb25lcyk7CisJICogdGhlbiB3ZSBpbnZlcnQgaGVhcFsxXTsKKwkgKiB0aGVuIHdlIGludmVydCBlYWNoIG90aGVyIG5vZGUgYnkgcmVwbGFjaW5nIGl0IGJ5IHRoZSBwcm9kdWN0IG9mIGl0cworCSAqIHBhcmVudCAoYWZ0ZXIgaW52ZXJzaW9uKSBhbmQgaXRzIHNpYmxpbmcgKGJlZm9yZSBpbnZlcnNpb24pLgorCSAqLworCWhlYXBbMF0gPSBOVUxMOworCWZvciAoaSA9IHBvdzIvMiAtIDE7IGkgPiAwOyBpLS0pCisJCWhlYXBbaV0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJaGVhcFtwb3cyLzIgKyBpXSA9ICZwb2ludHNbaV0tPlo7CisJZm9yIChpID0gcG93Mi8yICsgbnVtOyBpIDwgcG93MjsgaSsrKQorCQloZWFwW2ldID0gTlVMTDsKKwkKKwkvKiBzZXQgZWFjaCBub2RlIHRvIHRoZSBwcm9kdWN0IG9mIGl0cyBjaGlsZHJlbiAqLworCWZvciAoaSA9IHBvdzIvMiAtIDE7IGkgPiAwOyBpLS0pCisJCXsKKwkJaGVhcFtpXSA9IEJOX25ldygpOworCQlpZiAoaGVhcFtpXSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJCisJCWlmIChoZWFwWzIqaV0gIT0gTlVMTCkKKwkJCXsKKwkJCWlmICgoaGVhcFsyKmkgKyAxXSA9PSBOVUxMKSB8fCBCTl9pc196ZXJvKGhlYXBbMippICsgMV0pKQorCQkJCXsKKwkJCQlpZiAoIUJOX2NvcHkoaGVhcFtpXSwgaGVhcFsyKmldKSkgZ290byBlcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpZiAoQk5faXNfemVybyhoZWFwWzIqaV0pKQorCQkJCQl7CisJCQkJCWlmICghQk5fY29weShoZWFwW2ldLCBoZWFwWzIqaSArIDFdKSkgZ290byBlcnI7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCBoZWFwW2ldLAorCQkJCQkJaGVhcFsyKmldLCBoZWFwWzIqaSArIDFdLCBjdHgpKSBnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisJLyogaW52ZXJ0IGhlYXBbMV0gKi8KKwlpZiAoIUJOX2lzX3plcm8oaGVhcFsxXSkpCisJCXsKKwkJaWYgKCFCTl9tb2RfaW52ZXJzZShoZWFwWzFdLCBoZWFwWzFdLCAmZ3JvdXAtPmZpZWxkLCBjdHgpKQorCQkJeworCQkJRUNlcnIoRUNfRl9FQ19HRlBfU0lNUExFX1BPSU5UU19NQUtFX0FGRklORSwgRVJSX1JfQk5fTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJaWYgKGdyb3VwLT5tZXRoLT5maWVsZF9lbmNvZGUgIT0gMCkKKwkJeworCQkvKiBpbiB0aGUgTW9udGdvbWVyeSBjYXNlLCB3ZSBqdXN0IHR1cm5lZCAgUipIICAocmVwcmVzZW50aW5nIEgpCisJCSAqIGludG8gIDEvKFIqSCksICBidXQgd2UgbmVlZCAgUiooMS9IKSAgKHJlcHJlc2VudGluZyAxL0gpOworCQkgKiBpLmUuIHdlIGhhdmUgbmVlZCB0byBtdWx0aXBseSBieSB0aGUgTW9udGdvbWVyeSBmYWN0b3IgdHdpY2UgKi8KKwkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCBoZWFwWzFdLCBoZWFwWzFdLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfZW5jb2RlKGdyb3VwLCBoZWFwWzFdLCBoZWFwWzFdLCBjdHgpKSBnb3RvIGVycjsKKwkJfQorCisJLyogc2V0IG90aGVyIGhlYXBbaV0ncyB0byB0aGVpciBpbnZlcnNlcyAqLworCWZvciAoaSA9IDI7IGkgPCBwb3cyLzIgKyBudW07IGkgKz0gMikKKwkJeworCQkvKiBpIGlzIGV2ZW4gKi8KKwkJaWYgKChoZWFwW2kgKyAxXSAhPSBOVUxMKSAmJiAhQk5faXNfemVybyhoZWFwW2kgKyAxXSkpCisJCQl7CisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsIHRtcDAsIGhlYXBbaS8yXSwgaGVhcFtpICsgMV0sIGN0eCkpIGdvdG8gZXJyOworCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCB0bXAxLCBoZWFwW2kvMl0sIGhlYXBbaV0sIGN0eCkpIGdvdG8gZXJyOworCQkJaWYgKCFCTl9jb3B5KGhlYXBbaV0sIHRtcDApKSBnb3RvIGVycjsKKwkJCWlmICghQk5fY29weShoZWFwW2kgKyAxXSwgdG1wMSkpIGdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoIUJOX2NvcHkoaGVhcFtpXSwgaGVhcFtpLzJdKSkgZ290byBlcnI7CisJCQl9CisJCX0KKworCS8qIHdlIGhhdmUgcmVwbGFjZWQgYWxsIG5vbi16ZXJvIFoncyBieSB0aGVpciBpbnZlcnNlcywgbm93IGZpeCB1cCBhbGwgdGhlIHBvaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJeworCQlFQ19QT0lOVCAqcCA9IHBvaW50c1tpXTsKKwkJCisJCWlmICghQk5faXNfemVybygmcC0+WikpCisJCQl7CisJCQkvKiB0dXJuICAoWCwgWSwgMS9aKSAgaW50byAgKFgvWl4yLCBZL1peMywgMSkgKi8KKworCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfc3FyKGdyb3VwLCB0bXAxLCAmcC0+WiwgY3R4KSkgZ290byBlcnI7CisJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9tdWwoZ3JvdXAsICZwLT5YLCAmcC0+WCwgdG1wMSwgY3R4KSkgZ290byBlcnI7CisKKwkJCWlmICghZ3JvdXAtPm1ldGgtPmZpZWxkX211bChncm91cCwgdG1wMSwgdG1wMSwgJnAtPlosIGN0eCkpIGdvdG8gZXJyOworCQkJaWYgKCFncm91cC0+bWV0aC0+ZmllbGRfbXVsKGdyb3VwLCAmcC0+WSwgJnAtPlksIHRtcDEsIGN0eCkpIGdvdG8gZXJyOworCQkKKwkJCWlmIChncm91cC0+bWV0aC0+ZmllbGRfc2V0X3RvX29uZSAhPSAwKQorCQkJCXsKKwkJCQlpZiAoIWdyb3VwLT5tZXRoLT5maWVsZF9zZXRfdG9fb25lKGdyb3VwLCAmcC0+WiwgY3R4KSkgZ290byBlcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpZiAoIUJOX29uZSgmcC0+WikpIGdvdG8gZXJyOworCQkJCX0KKwkJCXAtPlpfaXNfb25lID0gMTsKKwkJCX0KKwkJfQorCisJcmV0ID0gMTsKKwkJCisgZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlpZiAobmV3X2N0eCAhPSBOVUxMKQorCQlCTl9DVFhfZnJlZShuZXdfY3R4KTsKKwlpZiAoaGVhcCAhPSBOVUxMKQorCQl7CisJCS8qIGhlYXBbcG93Mi8yXSAuLiBoZWFwW3BvdzItMV0gaGF2ZSBub3QgYmVlbiBhbGxvY2F0ZWQgbG9jYWxseSEgKi8KKwkJZm9yIChpID0gcG93Mi8yIC0gMTsgaSA+IDA7IGktLSkKKwkJCXsKKwkJCWlmIChoZWFwW2ldICE9IE5VTEwpCisJCQkJQk5fY2xlYXJfZnJlZShoZWFwW2ldKTsKKwkJCX0KKwkJT1BFTlNTTF9mcmVlKGhlYXApOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKKworaW50IGVjX0dGcF9zaW1wbGVfZmllbGRfbXVsKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpCisJeworCXJldHVybiBCTl9tb2RfbXVsKHIsIGEsIGIsICZncm91cC0+ZmllbGQsIGN0eCk7CisJfQorCisKK2ludCBlY19HRnBfc2ltcGxlX2ZpZWxkX3Nxcihjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBCTl9DVFggKmN0eCkKKwl7CisJcmV0dXJuIEJOX21vZF9zcXIociwgYSwgJmdyb3VwLT5maWVsZCwgY3R4KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWN0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWMvZWN0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwOWNiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lYy9lY3Rlc3QuYwpAQCAtMCwwICsxLDEzMzQgQEAKKy8qIGNyeXB0by9lYy9lY3Rlc3QuYyAqLworLyoKKyAqIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBCb2RvIE1vZWxsZXIgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGVsbGlwdGljIGN1cnZlIGJpbmFyeSBwb2x5bm9taWFsIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSAKKyAqIFNoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYSBvZiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgRkxBVF9JTkMKKyNpbmNsdWRlICJlX29zLmgiCisjZWxzZQorI2luY2x1ZGUgIi4uL2Vfb3MuaCIKKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworCisjaWZkZWYgT1BFTlNTTF9OT19FQworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pIHsgcHV0cygiRWxsaXB0aWMgY3VydmVzIGFyZSBkaXNhYmxlZC4iKTsgcmV0dXJuIDA7IH0KKyNlbHNlCisKKworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29ial9tYWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NSVBTXykgJiYgKF9NU0NfVkVSLzEwMD09MTIpCisvKiBzdXBwcmVzcyAidG9vIGJpZyB0b28gb3B0aW1pemUiIHdhcm5pbmcgKi8KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOjQ5NTkpCisjZW5kaWYKKworI2RlZmluZSBBQk9SVCBkbyB7IFwKKwlmZmx1c2goc3Rkb3V0KTsgXAorCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IEFCT1JUXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOyBcCisJRVhJVCgxKTsgXAorfSB3aGlsZSAoMCkKKwordm9pZCBwcmltZV9maWVsZF90ZXN0cyh2b2lkKTsKK3ZvaWQgY2hhcjJfZmllbGRfdGVzdHModm9pZCk7Cit2b2lkIGludGVybmFsX2N1cnZlX3Rlc3Qodm9pZCk7CisKKyNkZWZpbmUgVElNSU5HX0JBU0VfUFQgMAorI2RlZmluZSBUSU1JTkdfUkFORF9QVCAxCisjZGVmaW5lIFRJTUlOR19TSU1VTCAyCisKKyNpZiAwCitzdGF0aWMgdm9pZCB0aW1pbmdzKEVDX0dST1VQICpncm91cCwgaW50IHR5cGUsIEJOX0NUWCAqY3R4KQorCXsKKwljbG9ja190IGNsY2s7CisJaW50IGksIGo7CisJQklHTlVNICpzOworCUJJR05VTSAqclsxMF0sICpyMFsxMF07CisJRUNfUE9JTlQgKlA7CisJCQorCXMgPSBCTl9uZXcoKTsKKwlpZiAocyA9PSBOVUxMKSBBQk9SVDsKKworCWZwcmludGYoc3Rkb3V0LCAiVGltaW5ncyBmb3IgJWQtYml0IGZpZWxkLCAiLCBFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSk7CisJaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIHMsIGN0eCkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiJWQtYml0IHNjYWxhcnMgIiwgKGludClCTl9udW1fYml0cyhzKSk7CisJZmZsdXNoKHN0ZG91dCk7CisKKwlQID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKwlpZiAoUCA9PSBOVUxMKSBBQk9SVDsKKwlFQ19QT0lOVF9jb3B5KFAsIEVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGdyb3VwKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJeworCQlpZiAoKHJbaV0gPSBCTl9uZXcoKSkgPT0gTlVMTCkgQUJPUlQ7CisJCWlmICghQk5fcHNldWRvX3JhbmQocltpXSwgQk5fbnVtX2JpdHMocyksIDAsIDApKSBBQk9SVDsKKwkJaWYgKHR5cGUgIT0gVElNSU5HX0JBU0VfUFQpCisJCQl7CisJCQlpZiAoKHIwW2ldID0gQk5fbmV3KCkpID09IE5VTEwpIEFCT1JUOworCQkJaWYgKCFCTl9wc2V1ZG9fcmFuZChyMFtpXSwgQk5fbnVtX2JpdHMocyksIDAsIDApKSBBQk9SVDsKKwkJCX0KKwkJfQorCisJY2xjayA9IGNsb2NrKCk7CisJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCXsKKwkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCisJCQl7CisJCQlpZiAoIUVDX1BPSU5UX211bChncm91cCwgUCwgKHR5cGUgIT0gVElNSU5HX1JBTkRfUFQpID8gcltpXSA6IE5VTEwsIAorCQkJCSh0eXBlICE9IFRJTUlOR19CQVNFX1BUKSA/IFAgOiBOVUxMLCAodHlwZSAhPSBUSU1JTkdfQkFTRV9QVCkgPyByMFtpXSA6IE5VTEwsIGN0eCkpIEFCT1JUOworCQkJfQorCQl9CisJY2xjayA9IGNsb2NrKCkgLSBjbGNrOworCisJZnByaW50ZihzdGRvdXQsICJcbiIpOworCisjaWZkZWYgQ0xPQ0tTX1BFUl9TRUMKKwkvKiAiVG8gZGV0ZXJtaW5lIHRoZSB0aW1lIGluIHNlY29uZHMsIHRoZSB2YWx1ZSByZXR1cm5lZAorCSAqIGJ5IHRoZSBjbG9jayBmdW5jdGlvbiBzaG91bGQgYmUgZGl2aWRlZCBieSB0aGUgdmFsdWUKKwkgKiBvZiB0aGUgbWFjcm8gQ0xPQ0tTX1BFUl9TRUMuIgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gSVNPL0lFQyA5ODk5ICovCisjCWRlZmluZSBVTklUICJzIgorI2Vsc2UKKwkvKiAiYENMT0NLU19QRVJfU0VDJyB1bmRlY2xhcmVkIChmaXJzdCB1c2UgdGhpcyBmdW5jdGlvbikiCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY2Mgb24gTmVYVHN0ZXAvT3BlblN0ZXAgKi8KKyMJZGVmaW5lIFVOSVQgInVuaXRzIgorIwlkZWZpbmUgQ0xPQ0tTX1BFUl9TRUMgMQorI2VuZGlmCisKKwlpZiAodHlwZSA9PSBUSU1JTkdfQkFTRV9QVCkgeworCQlmcHJpbnRmKHN0ZG91dCwgIiVpICVzIGluICUuMmYgIiBVTklUICJcbiIsIGkqaiwKKwkJCSJiYXNlIHBvaW50IG11bHRpcGxpY2F0aW9ucyIsIChkb3VibGUpY2xjay9DTE9DS1NfUEVSX1NFQyk7CisJfSBlbHNlIGlmICh0eXBlID09IFRJTUlOR19SQU5EX1BUKSB7CisJCWZwcmludGYoc3Rkb3V0LCAiJWkgJXMgaW4gJS4yZiAiIFVOSVQgIlxuIiwgaSpqLAorCQkJInJhbmRvbSBwb2ludCBtdWx0aXBsaWNhdGlvbnMiLCAoZG91YmxlKWNsY2svQ0xPQ0tTX1BFUl9TRUMpOworCX0gZWxzZSBpZiAodHlwZSA9PSBUSU1JTkdfU0lNVUwpIHsKKwkJZnByaW50ZihzdGRvdXQsICIlaSAlcyBpbiAlLjJmICIgVU5JVCAiXG4iLCBpKmosCisJCQkicypQK3QqUSBvcGVyYXRpb25zIiwgKGRvdWJsZSljbGNrL0NMT0NLU19QRVJfU0VDKTsKKwl9CisJZnByaW50ZihzdGRvdXQsICJhdmVyYWdlOiAlLjRmICIgVU5JVCAiXG4iLCAoZG91YmxlKWNsY2svKENMT0NLU19QRVJfU0VDKmkqaikpOworCisJRUNfUE9JTlRfZnJlZShQKTsKKwlCTl9mcmVlKHMpOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQl7CisJCUJOX2ZyZWUocltpXSk7CisJCWlmICh0eXBlICE9IFRJTUlOR19CQVNFX1BUKSBCTl9mcmVlKHIwW2ldKTsKKwkJfQorCX0KKyNlbmRpZgorCit2b2lkIHByaW1lX2ZpZWxkX3Rlc3RzKCkKKwl7CQorCUJOX0NUWCAqY3R4ID0gTlVMTDsKKwlCSUdOVU0gKnAsICphLCAqYjsKKwlFQ19HUk9VUCAqZ3JvdXA7CisJRUNfR1JPVVAgKlBfMTYwID0gTlVMTCwgKlBfMTkyID0gTlVMTCwgKlBfMjI0ID0gTlVMTCwgKlBfMjU2ID0gTlVMTCwgKlBfMzg0ID0gTlVMTCwgKlBfNTIxID0gTlVMTDsKKwlFQ19QT0lOVCAqUCwgKlEsICpSOworCUJJR05VTSAqeCwgKnksICp6OworCXVuc2lnbmVkIGNoYXIgYnVmWzEwMF07CisJc2l6ZV90IGksIGxlbjsKKwlpbnQgazsKKwkKKyNpZiAxIC8qIG9wdGlvbmFsICovCisJY3R4ID0gQk5fQ1RYX25ldygpOworCWlmICghY3R4KSBBQk9SVDsKKyNlbmRpZgorCisJcCA9IEJOX25ldygpOworCWEgPSBCTl9uZXcoKTsKKwliID0gQk5fbmV3KCk7CisJaWYgKCFwIHx8ICFhIHx8ICFiKSBBQk9SVDsKKworCWlmICghQk5faGV4MmJuKCZwLCAiMTciKSkgQUJPUlQ7CisJaWYgKCFCTl9oZXgyYm4oJmEsICIxIikpIEFCT1JUOworCWlmICghQk5faGV4MmJuKCZiLCAiMSIpKSBBQk9SVDsKKwkKKwlncm91cCA9IEVDX0dST1VQX25ldyhFQ19HRnBfbW9udF9tZXRob2QoKSk7IC8qIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIEVDX0dST1VQX25ld19jdXJ2ZV9HRnAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNvIHRoYXQgdGhlIGxpYnJhcnkgZ2V0cyB0byBjaG9vc2UgdGhlIEVDX01FVEhPRCAqLworCWlmICghZ3JvdXApIEFCT1JUOworCisJaWYgKCFFQ19HUk9VUF9zZXRfY3VydmVfR0ZwKGdyb3VwLCBwLCBhLCBiLCBjdHgpKSBBQk9SVDsKKworCXsKKwkJRUNfR1JPVVAgKnRtcDsKKwkJdG1wID0gRUNfR1JPVVBfbmV3KEVDX0dST1VQX21ldGhvZF9vZihncm91cCkpOworCQlpZiAoIXRtcCkgQUJPUlQ7CisJCWlmICghRUNfR1JPVVBfY29weSh0bXAsIGdyb3VwKSkgQUJPUlQ7CisJCUVDX0dST1VQX2ZyZWUoZ3JvdXApOworCQlncm91cCA9IHRtcDsKKwl9CisJCisJaWYgKCFFQ19HUk9VUF9nZXRfY3VydmVfR0ZwKGdyb3VwLCBwLCBhLCBiLCBjdHgpKSBBQk9SVDsKKworCWZwcmludGYoc3Rkb3V0LCAiQ3VydmUgZGVmaW5lZCBieSBXZWllcnN0cmFzcyBlcXVhdGlvblxuICAgICB5XjIgPSB4XjMgKyBhKnggKyBiICAobW9kIDB4Iik7CisJQk5fcHJpbnRfZnAoc3Rkb3V0LCBwKTsKKwlmcHJpbnRmKHN0ZG91dCwgIilcbiAgICAgYSA9IDB4Iik7CisJQk5fcHJpbnRfZnAoc3Rkb3V0LCBhKTsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuICAgICBiID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIGIpOworCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKworCVAgPSBFQ19QT0lOVF9uZXcoZ3JvdXApOworCVEgPSBFQ19QT0lOVF9uZXcoZ3JvdXApOworCVIgPSBFQ19QT0lOVF9uZXcoZ3JvdXApOworCWlmICghUCB8fCAhUSB8fCAhUikgQUJPUlQ7CisJCisJaWYgKCFFQ19QT0lOVF9zZXRfdG9faW5maW5pdHkoZ3JvdXAsIFApKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBQKSkgQUJPUlQ7CisKKwlidWZbMF0gPSAwOworCWlmICghRUNfUE9JTlRfb2N0MnBvaW50KGdyb3VwLCBRLCBidWYsIDEsIGN0eCkpIEFCT1JUOworCisJaWYgKCFFQ19QT0lOVF9hZGQoZ3JvdXAsIFAsIFAsIFEsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFApKSBBQk9SVDsKKworCXggPSBCTl9uZXcoKTsKKwl5ID0gQk5fbmV3KCk7CisJeiA9IEJOX25ldygpOworCWlmICgheCB8fCAheSB8fCAheikgQUJPUlQ7CisKKwlpZiAoIUJOX2hleDJibigmeCwgIkQiKSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFEsIHgsIDEsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZ3JvdXAsIFEsIGN0eCkpCisJCXsKKwkJaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgUSwgeCwgeSwgY3R4KSkgQUJPUlQ7CisJCWZwcmludGYoc3RkZXJyLCAiUG9pbnQgaXMgbm90IG9uIGN1cnZlOiB4ID0gMHgiKTsKKwkJQk5fcHJpbnRfZnAoc3RkZXJyLCB4KTsKKwkJZnByaW50ZihzdGRlcnIsICIsIHkgPSAweCIpOworCQlCTl9wcmludF9mcChzdGRlcnIsIHkpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJCUFCT1JUOworCQl9CisKKwlmcHJpbnRmKHN0ZG91dCwgIkEgY3ljbGljIHN1Ymdyb3VwOlxuIik7CisJayA9IDEwMDsKKwlkbworCQl7CisJCWlmIChrLS0gPT0gMCkgQUJPUlQ7CisKKwkJaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBQKSkKKwkJCWZwcmludGYoc3Rkb3V0LCAiICAgICBwb2ludCBhdCBpbmZpbml0eVxuIik7CisJCWVsc2UKKwkJCXsKKwkJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFAsIHgsIHksIGN0eCkpIEFCT1JUOworCisJCQlmcHJpbnRmKHN0ZG91dCwgIiAgICAgeCA9IDB4Iik7CisJCQlCTl9wcmludF9mcChzdGRvdXQsIHgpOworCQkJZnByaW50ZihzdGRvdXQsICIsIHkgPSAweCIpOworCQkJQk5fcHJpbnRfZnAoc3Rkb3V0LCB5KTsKKwkJCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKwkJCX0KKwkJCisJCWlmICghRUNfUE9JTlRfY29weShSLCBQKSkgQUJPUlQ7CisJCWlmICghRUNfUE9JTlRfYWRkKGdyb3VwLCBQLCBQLCBRLCBjdHgpKSBBQk9SVDsKKworI2lmIDAgLyogb3B0aW9uYWwgKi8KKwkJeworCQkJRUNfUE9JTlQgKnBvaW50c1szXTsKKwkJCisJCQlwb2ludHNbMF0gPSBSOworCQkJcG9pbnRzWzFdID0gUTsKKwkJCXBvaW50c1syXSA9IFA7CisJCQlpZiAoIUVDX1BPSU5Uc19tYWtlX2FmZmluZShncm91cCwgMiwgcG9pbnRzLCBjdHgpKSBBQk9SVDsKKwkJfQorI2VuZGlmCisKKwkJfQorCXdoaWxlICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFApKTsKKworCWlmICghRUNfUE9JTlRfYWRkKGdyb3VwLCBQLCBRLCBSLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBQKSkgQUJPUlQ7CisKKwlsZW4gPSBFQ19QT0lOVF9wb2ludDJvY3QoZ3JvdXAsIFEsIFBPSU5UX0NPTlZFUlNJT05fQ09NUFJFU1NFRCwgYnVmLCBzaXplb2YgYnVmLCBjdHgpOworCWlmIChsZW4gPT0gMCkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9vY3QycG9pbnQoZ3JvdXAsIFAsIGJ1ZiwgbGVuLCBjdHgpKSBBQk9SVDsKKwlpZiAoMCAhPSBFQ19QT0lOVF9jbXAoZ3JvdXAsIFAsIFEsIGN0eCkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiR2VuZXJhdG9yIGFzIG9jdGVjdCBzdHJpbmcsIGNvbXByZXNzZWQgZm9ybTpcbiAgICAgIik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSBmcHJpbnRmKHN0ZG91dCwgIiUwMlgiLCBidWZbaV0pOworCQorCWxlbiA9IEVDX1BPSU5UX3BvaW50Mm9jdChncm91cCwgUSwgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQsIGJ1Ziwgc2l6ZW9mIGJ1ZiwgY3R4KTsKKwlpZiAobGVuID09IDApIEFCT1JUOworCWlmICghRUNfUE9JTlRfb2N0MnBvaW50KGdyb3VwLCBQLCBidWYsIGxlbiwgY3R4KSkgQUJPUlQ7CisJaWYgKDAgIT0gRUNfUE9JTlRfY21wKGdyb3VwLCBQLCBRLCBjdHgpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuR2VuZXJhdG9yIGFzIG9jdGVjdCBzdHJpbmcsIHVuY29tcHJlc3NlZCBmb3JtOlxuICAgICAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIGZwcmludGYoc3Rkb3V0LCAiJTAyWCIsIGJ1ZltpXSk7CisJCisJbGVuID0gRUNfUE9JTlRfcG9pbnQyb2N0KGdyb3VwLCBRLCBQT0lOVF9DT05WRVJTSU9OX0hZQlJJRCwgYnVmLCBzaXplb2YgYnVmLCBjdHgpOworCWlmIChsZW4gPT0gMCkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9vY3QycG9pbnQoZ3JvdXAsIFAsIGJ1ZiwgbGVuLCBjdHgpKSBBQk9SVDsKKwlpZiAoMCAhPSBFQ19QT0lOVF9jbXAoZ3JvdXAsIFAsIFEsIGN0eCkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiXG5HZW5lcmF0b3IgYXMgb2N0ZWN0IHN0cmluZywgaHlicmlkIGZvcm06XG4gICAgICIpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgZnByaW50ZihzdGRvdXQsICIlMDJYIiwgYnVmW2ldKTsKKwkKKwlpZiAoIUVDX1BPSU5UX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFIsIHgsIHksIHosIGN0eCkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiXG5BIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZlcnNlIG9mIHRoYXQgZ2VuZXJhdG9yIGluXG5KYWNvYmlhbiBwcm9qZWN0aXZlIGNvb3JkaW5hdGVzOlxuICAgICBYID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIHgpOworCWZwcmludGYoc3Rkb3V0LCAiLCBZID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIHkpOworCWZwcmludGYoc3Rkb3V0LCAiLCBaID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIHopOworCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKworCWlmICghRUNfUE9JTlRfaW52ZXJ0KGdyb3VwLCBQLCBjdHgpKSBBQk9SVDsKKwlpZiAoMCAhPSBFQ19QT0lOVF9jbXAoZ3JvdXAsIFAsIFIsIGN0eCkpIEFCT1JUOworCisKKwkvKiBDdXJ2ZSBzZWNwMTYwcjEgKENlcnRpY29tIFJlc2VhcmNoIFNFQyAyIFZlcnNpb24gMS4wLCBzZWN0aW9uIDIuNC4yLCAyMDAwKQorCSAqIC0tIG5vdCBhIE5JU1QgY3VydmUsIGJ1dCBjb21tb25seSB1c2VkICovCisJCisJaWYgKCFCTl9oZXgyYm4oJnAsICJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZGIikpIEFCT1JUOworCWlmICgxICE9IEJOX2lzX3ByaW1lX2V4KHAsIEJOX3ByaW1lX2NoZWNrcywgY3R4LCBOVUxMKSkgQUJPUlQ7CisJaWYgKCFCTl9oZXgyYm4oJmEsICJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjdGRkZGRkZDIikpIEFCT1JUOworCWlmICghQk5faGV4MmJuKCZiLCAiMUM5N0JFRkM1NEJEN0E4QjY1QUNGODlGODFENEQ0QURDNTY1RkE0NSIpKSBBQk9SVDsKKwlpZiAoIUVDX0dST1VQX3NldF9jdXJ2ZV9HRnAoZ3JvdXAsIHAsIGEsIGIsIGN0eCkpIEFCT1JUOworCisJaWYgKCFCTl9oZXgyYm4oJngsICI0QTk2QjU2ODhFRjU3MzI4NDY2NDY5ODk2OEMzOEJCOTEzQ0JGQzgyIikpIEFCT1JUOworCWlmICghQk5faGV4MmJuKCZ5LCAiMjNhNjI4NTUzMTY4OTQ3ZDU5ZGNjOTEyMDQyMzUxMzc3YWM1ZmIzMiIpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBQLCB4LCB5LCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX29uX2N1cnZlKGdyb3VwLCBQLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmeiwgIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDFGNEM4RjkyN0FFRDNDQTc1MjI1NyIpKSBBQk9SVDsKKwlpZiAoIUVDX0dST1VQX3NldF9nZW5lcmF0b3IoZ3JvdXAsIFAsIHosIEJOX3ZhbHVlX29uZSgpKSkgQUJPUlQ7CisKKwlpZiAoIUVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBQLCB4LCB5LCBjdHgpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuU0VDMiBjdXJ2ZSBzZWNwMTYwcjEgLS0gR2VuZXJhdG9yOlxuICAgICB4ID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIHgpOworCWZwcmludGYoc3Rkb3V0LCAiXG4gICAgIHkgPSAweCIpOworCUJOX3ByaW50X2ZwKHN0ZG91dCwgeSk7CisJZnByaW50ZihzdGRvdXQsICJcbiIpOworCS8qIEdfeSB2YWx1ZSB0YWtlbiBmcm9tIHRoZSBzdGFuZGFyZDogKi8KKwlpZiAoIUJOX2hleDJibigmeiwgIjIzYTYyODU1MzE2ODk0N2Q1OWRjYzkxMjA0MjM1MTM3N2FjNWZiMzIiKSkgQUJPUlQ7CisJaWYgKDAgIT0gQk5fY21wKHksIHopKSBBQk9SVDsKKworCWZwcmludGYoc3Rkb3V0LCAidmVyaWZ5IGRlZ3JlZSAuLi4iKTsKKwlpZiAoRUNfR1JPVVBfZ2V0X2RlZ3JlZShncm91cCkgIT0gMTYwKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIiBva1xuIik7CisJCisJZnByaW50ZihzdGRvdXQsICJ2ZXJpZnkgZ3JvdXAgb3JkZXIgLi4uIik7CisJZmZsdXNoKHN0ZG91dCk7CisJaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIHosIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBRLCB6LCBOVUxMLCBOVUxMLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBRKSkgQUJPUlQ7CisJZnByaW50ZihzdGRvdXQsICIuIik7CisJZmZsdXNoKHN0ZG91dCk7CisJaWYgKCFFQ19HUk9VUF9wcmVjb21wdXRlX211bHQoZ3JvdXAsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBRLCB6LCBOVUxMLCBOVUxMLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBRKSkgQUJPUlQ7CisJZnByaW50ZihzdGRvdXQsICIgb2tcbiIpOworCisJaWYgKCEoUF8xNjAgPSBFQ19HUk9VUF9uZXcoRUNfR1JPVVBfbWV0aG9kX29mKGdyb3VwKSkpKSBBQk9SVDsKKwlpZiAoIUVDX0dST1VQX2NvcHkoUF8xNjAsIGdyb3VwKSkgQUJPUlQ7CisKKworCS8qIEN1cnZlIFAtMTkyIChGSVBTIFBVQiAxODYtMiwgQXBwLiA2KSAqLworCQorCWlmICghQk5faGV4MmJuKCZwLCAiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRkZGRkZGRkZGIikpIEFCT1JUOworCWlmICgxICE9IEJOX2lzX3ByaW1lX2V4KHAsIEJOX3ByaW1lX2NoZWNrcywgY3R4LCBOVUxMKSkgQUJPUlQ7CisJaWYgKCFCTl9oZXgyYm4oJmEsICJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkMiKSkgQUJPUlQ7CisJaWYgKCFCTl9oZXgyYm4oJmIsICI2NDIxMDUxOUU1OUM4MEU3MEZBN0U5QUI3MjI0MzA0OUZFQjhERUVDQzE0NkI5QjEiKSkgQUJPUlQ7CisJaWYgKCFFQ19HUk9VUF9zZXRfY3VydmVfR0ZwKGdyb3VwLCBwLCBhLCBiLCBjdHgpKSBBQk9SVDsKKworCWlmICghQk5faGV4MmJuKCZ4LCAiMTg4REE4MEVCMDMwOTBGNjdDQkYyMEVCNDNBMTg4MDBGNEZGMEFGRDgyRkYxMDEyIikpIEFCT1JUOworCWlmICghRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBQLCB4LCAxLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX29uX2N1cnZlKGdyb3VwLCBQLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmeiwgIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRjk5REVGODM2MTQ2QkM5QjFCNEQyMjgzMSIpKSBBQk9SVDsKKwlpZiAoIUVDX0dST1VQX3NldF9nZW5lcmF0b3IoZ3JvdXAsIFAsIHosIEJOX3ZhbHVlX29uZSgpKSkgQUJPUlQ7CisKKwlpZiAoIUVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBQLCB4LCB5LCBjdHgpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuTklTVCBjdXJ2ZSBQLTE5MiAtLSBHZW5lcmF0b3I6XG4gICAgIHggPSAweCIpOworCUJOX3ByaW50X2ZwKHN0ZG91dCwgeCk7CisJZnByaW50ZihzdGRvdXQsICJcbiAgICAgeSA9IDB4Iik7CisJQk5fcHJpbnRfZnAoc3Rkb3V0LCB5KTsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuIik7CisJLyogR195IHZhbHVlIHRha2VuIGZyb20gdGhlIHN0YW5kYXJkOiAqLworCWlmICghQk5faGV4MmJuKCZ6LCAiMDcxOTJCOTVGRkM4REE3ODYzMTAxMUVENkIyNENERDU3M0Y5NzdBMTFFNzk0ODExIikpIEFCT1JUOworCWlmICgwICE9IEJOX2NtcCh5LCB6KSkgQUJPUlQ7CisKKwlmcHJpbnRmKHN0ZG91dCwgInZlcmlmeSBkZWdyZWUgLi4uIik7CisJaWYgKEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApICE9IDE5MikgQUJPUlQ7CisJZnByaW50ZihzdGRvdXQsICIgb2tcbiIpOworCQorCWZwcmludGYoc3Rkb3V0LCAidmVyaWZ5IGdyb3VwIG9yZGVyIC4uLiIpOworCWZmbHVzaChzdGRvdXQpOworCWlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCB6LCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX211bChncm91cCwgUSwgeiwgTlVMTCwgTlVMTCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUSkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiLiIpOworCWZmbHVzaChzdGRvdXQpOworCWlmICghRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KGdyb3VwLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX211bChncm91cCwgUSwgeiwgTlVMTCwgTlVMTCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUSkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiIG9rXG4iKTsKKworCWlmICghKFBfMTkyID0gRUNfR1JPVVBfbmV3KEVDX0dST1VQX21ldGhvZF9vZihncm91cCkpKSkgQUJPUlQ7CisJaWYgKCFFQ19HUk9VUF9jb3B5KFBfMTkyLCBncm91cCkpIEFCT1JUOworCisKKwkvKiBDdXJ2ZSBQLTIyNCAoRklQUyBQVUIgMTg2LTIsIEFwcC4gNikgKi8KKwkKKwlpZiAoIUJOX2hleDJibigmcCwgIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIikpIEFCT1JUOworCWlmICgxICE9IEJOX2lzX3ByaW1lX2V4KHAsIEJOX3ByaW1lX2NoZWNrcywgY3R4LCBOVUxMKSkgQUJPUlQ7CisJaWYgKCFCTl9oZXgyYm4oJmEsICJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRSIpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmYiwgIkI0MDUwQTg1MEMwNEIzQUJGNTQxMzI1NjUwNDRCMEI3RDdCRkQ4QkEyNzBCMzk0MzIzNTVGRkI0IikpIEFCT1JUOworCWlmICghRUNfR1JPVVBfc2V0X2N1cnZlX0dGcChncm91cCwgcCwgYSwgYiwgY3R4KSkgQUJPUlQ7CisKKwlpZiAoIUJOX2hleDJibigmeCwgIkI3MEUwQ0JENkJCNEJGN0YzMjEzOTBCOTRBMDNDMUQzNTZDMjExMjIzNDMyODBENjExNUMxRDIxIikpIEFCT1JUOworCWlmICghRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLCBQLCB4LCAwLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX29uX2N1cnZlKGdyb3VwLCBQLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmeiwgIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYxNkEyRTBCOEYwM0UxM0REMjk0NTVDNUMyQTNEIikpIEFCT1JUOworCWlmICghRUNfR1JPVVBfc2V0X2dlbmVyYXRvcihncm91cCwgUCwgeiwgQk5fdmFsdWVfb25lKCkpKSBBQk9SVDsKKworCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFAsIHgsIHksIGN0eCkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiXG5OSVNUIGN1cnZlIFAtMjI0IC0tIEdlbmVyYXRvcjpcbiAgICAgeCA9IDB4Iik7CisJQk5fcHJpbnRfZnAoc3Rkb3V0LCB4KTsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuICAgICB5ID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIHkpOworCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKwkvKiBHX3kgdmFsdWUgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQ6ICovCisJaWYgKCFCTl9oZXgyYm4oJnosICJCRDM3NjM4OEI1RjcyM0ZCNEMyMkRGRTZDRDQzNzVBMDVBMDc0NzY0NDRENTgxOTk4NTAwN0UzNCIpKSBBQk9SVDsKKwlpZiAoMCAhPSBCTl9jbXAoeSwgeikpIEFCT1JUOworCQorCWZwcmludGYoc3Rkb3V0LCAidmVyaWZ5IGRlZ3JlZSAuLi4iKTsKKwlpZiAoRUNfR1JPVVBfZ2V0X2RlZ3JlZShncm91cCkgIT0gMjI0KSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIiBva1xuIik7CisJCisJZnByaW50ZihzdGRvdXQsICJ2ZXJpZnkgZ3JvdXAgb3JkZXIgLi4uIik7CisJZmZsdXNoKHN0ZG91dCk7CisJaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIHosIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBRLCB6LCBOVUxMLCBOVUxMLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBRKSkgQUJPUlQ7CisJZnByaW50ZihzdGRvdXQsICIuIik7CisJZmZsdXNoKHN0ZG91dCk7CisJaWYgKCFFQ19HUk9VUF9wcmVjb21wdXRlX211bHQoZ3JvdXAsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBRLCB6LCBOVUxMLCBOVUxMLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBRKSkgQUJPUlQ7CisJZnByaW50ZihzdGRvdXQsICIgb2tcbiIpOworCisJaWYgKCEoUF8yMjQgPSBFQ19HUk9VUF9uZXcoRUNfR1JPVVBfbWV0aG9kX29mKGdyb3VwKSkpKSBBQk9SVDsKKwlpZiAoIUVDX0dST1VQX2NvcHkoUF8yMjQsIGdyb3VwKSkgQUJPUlQ7CisKKworCS8qIEN1cnZlIFAtMjU2IChGSVBTIFBVQiAxODYtMiwgQXBwLiA2KSAqLworCQorCWlmICghQk5faGV4MmJuKCZwLCAiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIpKSBBQk9SVDsKKwlpZiAoMSAhPSBCTl9pc19wcmltZV9leChwLCBCTl9wcmltZV9jaGVja3MsIGN0eCwgTlVMTCkpIEFCT1JUOworCWlmICghQk5faGV4MmJuKCZhLCAiRkZGRkZGRkYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQyIpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmYiwgIjVBQzYzNUQ4QUEzQTkzRTdCM0VCQkQ1NTc2OTg4NkJDNjUxRDA2QjBDQzUzQjBGNjNCQ0UzQzNFMjdEMjYwNEIiKSkgQUJPUlQ7CisJaWYgKCFFQ19HUk9VUF9zZXRfY3VydmVfR0ZwKGdyb3VwLCBwLCBhLCBiLCBjdHgpKSBBQk9SVDsKKworCWlmICghQk5faGV4MmJuKCZ4LCAiNkIxN0QxRjJFMTJDNDI0N0Y4QkNFNkU1NjNBNDQwRjI3NzAzN0Q4MTJERUIzM0EwRjRBMTM5NDVEODk4QzI5NiIpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgUCwgeCwgMSwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19vbl9jdXJ2ZShncm91cCwgUCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFCTl9oZXgyYm4oJnosICJGRkZGRkZGRjAwMDAwMDAwRkZGRkZGRkZGRkZGRkZGRkJDRTZGQUFEQTcxNzlFIgorCQkiODRGM0I5Q0FDMkZDNjMyNTUxIikpIEFCT1JUOworCWlmICghRUNfR1JPVVBfc2V0X2dlbmVyYXRvcihncm91cCwgUCwgeiwgQk5fdmFsdWVfb25lKCkpKSBBQk9SVDsKKworCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFAsIHgsIHksIGN0eCkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiXG5OSVNUIGN1cnZlIFAtMjU2IC0tIEdlbmVyYXRvcjpcbiAgICAgeCA9IDB4Iik7CisJQk5fcHJpbnRfZnAoc3Rkb3V0LCB4KTsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuICAgICB5ID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIHkpOworCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKwkvKiBHX3kgdmFsdWUgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQ6ICovCisJaWYgKCFCTl9oZXgyYm4oJnosICI0RkUzNDJFMkZFMUE3RjlCOEVFN0VCNEE3QzBGOUUxNjJCQ0UzMzU3NkIzMTVFQ0VDQkI2NDA2ODM3QkY1MUY1IikpIEFCT1JUOworCWlmICgwICE9IEJOX2NtcCh5LCB6KSkgQUJPUlQ7CisJCisJZnByaW50ZihzdGRvdXQsICJ2ZXJpZnkgZGVncmVlIC4uLiIpOworCWlmIChFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSAhPSAyNTYpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiIG9rXG4iKTsKKwkKKwlmcHJpbnRmKHN0ZG91dCwgInZlcmlmeSBncm91cCBvcmRlciAuLi4iKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgeiwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIFEsIHosIE5VTEwsIE5VTEwsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFEpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIi4iKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoIUVDX0dST1VQX3ByZWNvbXB1dGVfbXVsdChncm91cCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIFEsIHosIE5VTEwsIE5VTEwsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFEpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIiBva1xuIik7CisKKwlpZiAoIShQXzI1NiA9IEVDX0dST1VQX25ldyhFQ19HUk9VUF9tZXRob2Rfb2YoZ3JvdXApKSkpIEFCT1JUOworCWlmICghRUNfR1JPVVBfY29weShQXzI1NiwgZ3JvdXApKSBBQk9SVDsKKworCisJLyogQ3VydmUgUC0zODQgKEZJUFMgUFVCIDE4Ni0yLCBBcHAuIDYpICovCisJCisJaWYgKCFCTl9oZXgyYm4oJnAsICJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIgorCQkiRkZGRkZGRkZGRkZGRkZGRkZFRkZGRkZGRkYwMDAwMDAwMDAwMDAwMDAwRkZGRkZGRkYiKSkgQUJPUlQ7CisJaWYgKDEgIT0gQk5faXNfcHJpbWVfZXgocCwgQk5fcHJpbWVfY2hlY2tzLCBjdHgsIE5VTEwpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmYSwgIkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiCisJCSJGRkZGRkZGRkZGRkZGRkZGRkVGRkZGRkZGRjAwMDAwMDAwMDAwMDAwMDBGRkZGRkZGQyIpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmYiwgIkIzMzEyRkE3RTIzRUU3RTQ5ODhFMDU2QkUzRjgyRDE5MTgxRDlDNkVGRTgxNDEiCisJCSIxMjAzMTQwODhGNTAxMzg3NUFDNjU2Mzk4RDhBMkVEMTlEMkE4NUM4RUREM0VDMkFFRiIpKSBBQk9SVDsKKwlpZiAoIUVDX0dST1VQX3NldF9jdXJ2ZV9HRnAoZ3JvdXAsIHAsIGEsIGIsIGN0eCkpIEFCT1JUOworCisJaWYgKCFCTl9oZXgyYm4oJngsICJBQTg3Q0EyMkJFOEIwNTM3OEVCMUM3MUVGMzIwQUQ3NDZFMUQzQjYyOEJBNzlCIgorCQkiOTg1OUY3NDFFMDgyNTQyQTM4NTUwMkYyNURCRjU1Mjk2QzNBNTQ1RTM4NzI3NjBBQjciKSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFAsIHgsIDEsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZ3JvdXAsIFAsIGN0eCkpIEFCT1JUOworCWlmICghQk5faGV4MmJuKCZ6LCAiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIKKwkJIkZGQzc2MzREODFGNDM3MkRERjU4MUEwREIyNDhCMEE3N0FFQ0VDMTk2QUNDQzUyOTczIikpIEFCT1JUOworCWlmICghRUNfR1JPVVBfc2V0X2dlbmVyYXRvcihncm91cCwgUCwgeiwgQk5fdmFsdWVfb25lKCkpKSBBQk9SVDsKKworCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFAsIHgsIHksIGN0eCkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiXG5OSVNUIGN1cnZlIFAtMzg0IC0tIEdlbmVyYXRvcjpcbiAgICAgeCA9IDB4Iik7CisJQk5fcHJpbnRfZnAoc3Rkb3V0LCB4KTsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuICAgICB5ID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIHkpOworCWZwcmludGYoc3Rkb3V0LCAiXG4iKTsKKwkvKiBHX3kgdmFsdWUgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQ6ICovCisJaWYgKCFCTl9oZXgyYm4oJnosICIzNjE3REU0QTk2MjYyQzZGNUQ5RTk4QkY5MjkyREMyOUY4RjQxREJEMjg5QTE0IgorCQkiN0NFOURBMzExM0I1RjBCOEMwMEE2MEIxQ0UxRDdFODE5RDdBNDMxRDdDOTBFQTBFNUYiKSkgQUJPUlQ7CisJaWYgKDAgIT0gQk5fY21wKHksIHopKSBBQk9SVDsKKwkKKwlmcHJpbnRmKHN0ZG91dCwgInZlcmlmeSBkZWdyZWUgLi4uIik7CisJaWYgKEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApICE9IDM4NCkgQUJPUlQ7CisJZnByaW50ZihzdGRvdXQsICIgb2tcbiIpOworCQorCWZwcmludGYoc3Rkb3V0LCAidmVyaWZ5IGdyb3VwIG9yZGVyIC4uLiIpOworCWZmbHVzaChzdGRvdXQpOworCWlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLCB6LCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX211bChncm91cCwgUSwgeiwgTlVMTCwgTlVMTCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUSkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiLiIpOworCWZmbHVzaChzdGRvdXQpOworCWlmICghRUNfR1JPVVBfcHJlY29tcHV0ZV9tdWx0KGdyb3VwLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX211bChncm91cCwgUSwgeiwgTlVMTCwgTlVMTCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUSkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiIG9rXG4iKTsKKworCWlmICghKFBfMzg0ID0gRUNfR1JPVVBfbmV3KEVDX0dST1VQX21ldGhvZF9vZihncm91cCkpKSkgQUJPUlQ7CisJaWYgKCFFQ19HUk9VUF9jb3B5KFBfMzg0LCBncm91cCkpIEFCT1JUOworCisKKwkvKiBDdXJ2ZSBQLTUyMSAoRklQUyBQVUIgMTg2LTIsIEFwcC4gNikgKi8KKwkKKwlpZiAoIUJOX2hleDJibigmcCwgIjFGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiCisJCSJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkYiCisJCSJGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIikpIEFCT1JUOworCWlmICgxICE9IEJOX2lzX3ByaW1lX2V4KHAsIEJOX3ByaW1lX2NoZWNrcywgY3R4LCBOVUxMKSkgQUJPUlQ7CisJaWYgKCFCTl9oZXgyYm4oJmEsICIxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIgorCQkiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGIgorCQkiRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGQyIpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmYiwgIjA1MTk1M0VCOTYxOEUxQzlBMUY5MjlBMjFBMEI2ODU0MEVFQTJEQTcyNUI5OUIiCisJCSIzMTVGM0I4QjQ4OTkxOEVGMTA5RTE1NjE5Mzk1MUVDN0U5MzdCMTY1MkMwQkQzQkIxQkYwNzM1NzMiCisJCSJERjg4M0QyQzM0RjFFRjQ1MUZENDZCNTAzRjAwIikpIEFCT1JUOworCWlmICghRUNfR1JPVVBfc2V0X2N1cnZlX0dGcChncm91cCwgcCwgYSwgYiwgY3R4KSkgQUJPUlQ7CisKKwlpZiAoIUJOX2hleDJibigmeCwgIkM2ODU4RTA2QjcwNDA0RTlDRDlFM0VDQjY2MjM5NUI0NDI5QzY0ODEzOTA1M0YiCisJCSJCNTIxRjgyOEFGNjA2QjREM0RCQUExNEI1RTc3RUZFNzU5MjhGRTFEQzEyN0EyRkZBOERFMzM0OEIiCisJCSIzQzE4NTZBNDI5QkY5N0U3RTMxQzJFNUJENjYiKSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAoZ3JvdXAsIFAsIHgsIDAsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZ3JvdXAsIFAsIGN0eCkpIEFCT1JUOworCWlmICghQk5faGV4MmJuKCZ6LCAiMUZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRiIKKwkJIkZGRkZGRkZGRkZGRkZGRkZGRkZGQTUxODY4NzgzQkYyRjk2NkI3RkNDMDE0OEY3MDlBNUQwM0JCNSIKKwkJIkM5Qjg4OTlDNDdBRUJCNkZCNzFFOTEzODY0MDkiKSkgQUJPUlQ7CisJaWYgKCFFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKGdyb3VwLCBQLCB6LCBCTl92YWx1ZV9vbmUoKSkpIEFCT1JUOworCisJaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwgUCwgeCwgeSwgY3R4KSkgQUJPUlQ7CisJZnByaW50ZihzdGRvdXQsICJcbk5JU1QgY3VydmUgUC01MjEgLS0gR2VuZXJhdG9yOlxuICAgICB4ID0gMHgiKTsKKwlCTl9wcmludF9mcChzdGRvdXQsIHgpOworCWZwcmludGYoc3Rkb3V0LCAiXG4gICAgIHkgPSAweCIpOworCUJOX3ByaW50X2ZwKHN0ZG91dCwgeSk7CisJZnByaW50ZihzdGRvdXQsICJcbiIpOworCS8qIEdfeSB2YWx1ZSB0YWtlbiBmcm9tIHRoZSBzdGFuZGFyZDogKi8KKwlpZiAoIUJOX2hleDJibigmeiwgIjExODM5Mjk2QTc4OUEzQkMwMDQ1QzhBNUZCNDJDN0QxQkQ5OThGNTQ0NDk1NzkiCisJCSJCNDQ2ODE3QUZCRDE3MjczRTY2MkM5N0VFNzI5OTVFRjQyNjQwQzU1MEI5MDEzRkFEMDc2MTM1M0MiCisJCSI3MDg2QTI3MkMyNDA4OEJFOTQ3NjlGRDE2NjUwIikpIEFCT1JUOworCWlmICgwICE9IEJOX2NtcCh5LCB6KSkgQUJPUlQ7CisJCisJZnByaW50ZihzdGRvdXQsICJ2ZXJpZnkgZGVncmVlIC4uLiIpOworCWlmIChFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSAhPSA1MjEpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiIG9rXG4iKTsKKwkKKwlmcHJpbnRmKHN0ZG91dCwgInZlcmlmeSBncm91cCBvcmRlciAuLi4iKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgeiwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIFEsIHosIE5VTEwsIE5VTEwsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFEpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIi4iKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlpZiAoIUVDX0dST1VQX3ByZWNvbXB1dGVfbXVsdChncm91cCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIFEsIHosIE5VTEwsIE5VTEwsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFEpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIiBva1xuIik7CisKKwlpZiAoIShQXzUyMSA9IEVDX0dST1VQX25ldyhFQ19HUk9VUF9tZXRob2Rfb2YoZ3JvdXApKSkpIEFCT1JUOworCWlmICghRUNfR1JPVVBfY29weShQXzUyMSwgZ3JvdXApKSBBQk9SVDsKKworCisJLyogbW9yZSB0ZXN0cyB1c2luZyB0aGUgbGFzdCBjdXJ2ZSAqLworCisJaWYgKCFFQ19QT0lOVF9jb3B5KFEsIFApKSBBQk9SVDsKKwlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFEpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2RibChncm91cCwgUCwgUCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19vbl9jdXJ2ZShncm91cCwgUCwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pbnZlcnQoZ3JvdXAsIFEsIGN0eCkpIEFCT1JUOyAvKiBQID0gLTJRICovCisKKwlpZiAoIUVDX1BPSU5UX2FkZChncm91cCwgUiwgUCwgUSwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9hZGQoZ3JvdXAsIFIsIFIsIFEsIGN0eCkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFIpKSBBQk9SVDsgLyogUiA9IFAgKyAyUSAqLworCisJeworCQljb25zdCBFQ19QT0lOVCAqcG9pbnRzWzRdOworCQljb25zdCBCSUdOVU0gKnNjYWxhcnNbNF07CisJCUJJR05VTSBzY2FsYXIzOworCQorCQlpZiAoRUNfUE9JTlRfaXNfYXRfaW5maW5pdHkoZ3JvdXAsIFEpKSBBQk9SVDsKKwkJcG9pbnRzWzBdID0gUTsKKwkJcG9pbnRzWzFdID0gUTsKKwkJcG9pbnRzWzJdID0gUTsKKwkJcG9pbnRzWzNdID0gUTsKKworCQlpZiAoIUJOX2FkZCh5LCB6LCBCTl92YWx1ZV9vbmUoKSkpIEFCT1JUOworCQlpZiAoQk5faXNfb2RkKHkpKSBBQk9SVDsKKwkJaWYgKCFCTl9yc2hpZnQxKHksIHkpKSBBQk9SVDsKKwkJc2NhbGFyc1swXSA9IHk7IC8qIChncm91cCBvcmRlciArIDEpLzIsICBzbyAgeSpRICsgeSpRID0gUSAqLworCQlzY2FsYXJzWzFdID0geTsKKworCQlmcHJpbnRmKHN0ZG91dCwgImNvbWJpbmVkIG11bHRpcGxpY2F0aW9uIC4uLiIpOworCQlmZmx1c2goc3Rkb3V0KTsKKworCQkvKiB6IGlzIHN0aWxsIHRoZSBncm91cCBvcmRlciAqLworCQlpZiAoIUVDX1BPSU5Uc19tdWwoZ3JvdXAsIFAsIE5VTEwsIDIsIHBvaW50cywgc2NhbGFycywgY3R4KSkgQUJPUlQ7CisJCWlmICghRUNfUE9JTlRzX211bChncm91cCwgUiwgeiwgMiwgcG9pbnRzLCBzY2FsYXJzLCBjdHgpKSBBQk9SVDsKKwkJaWYgKDAgIT0gRUNfUE9JTlRfY21wKGdyb3VwLCBQLCBSLCBjdHgpKSBBQk9SVDsKKwkJaWYgKDAgIT0gRUNfUE9JTlRfY21wKGdyb3VwLCBSLCBRLCBjdHgpKSBBQk9SVDsKKworCQlmcHJpbnRmKHN0ZG91dCwgIi4iKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisKKwkJaWYgKCFCTl9wc2V1ZG9fcmFuZCh5LCBCTl9udW1fYml0cyh5KSwgMCwgMCkpIEFCT1JUOworCQlpZiAoIUJOX2FkZCh6LCB6LCB5KSkgQUJPUlQ7CisJCUJOX3NldF9uZWdhdGl2ZSh6LCAxKTsKKwkJc2NhbGFyc1swXSA9IHk7CisJCXNjYWxhcnNbMV0gPSB6OyAvKiB6ID0gLShvcmRlciArIHkpICovCisKKwkJaWYgKCFFQ19QT0lOVHNfbXVsKGdyb3VwLCBQLCBOVUxMLCAyLCBwb2ludHMsIHNjYWxhcnMsIGN0eCkpIEFCT1JUOworCQlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBQKSkgQUJPUlQ7CisKKwkJZnByaW50ZihzdGRvdXQsICIuIik7CisJCWZmbHVzaChzdGRvdXQpOworCisJCWlmICghQk5fcHNldWRvX3JhbmQoeCwgQk5fbnVtX2JpdHMoeSkgLSAxLCAwLCAwKSkgQUJPUlQ7CisJCWlmICghQk5fYWRkKHosIHgsIHkpKSBBQk9SVDsKKwkJQk5fc2V0X25lZ2F0aXZlKHosIDEpOworCQlzY2FsYXJzWzBdID0geDsKKwkJc2NhbGFyc1sxXSA9IHk7CisJCXNjYWxhcnNbMl0gPSB6OyAvKiB6ID0gLSh4K3kpICovCisKKwkJQk5faW5pdCgmc2NhbGFyMyk7CisJCUJOX3plcm8oJnNjYWxhcjMpOworCQlzY2FsYXJzWzNdID0gJnNjYWxhcjM7CisKKwkJaWYgKCFFQ19QT0lOVHNfbXVsKGdyb3VwLCBQLCBOVUxMLCA0LCBwb2ludHMsIHNjYWxhcnMsIGN0eCkpIEFCT1JUOworCQlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBQKSkgQUJPUlQ7CisKKwkJZnByaW50ZihzdGRvdXQsICIgb2tcblxuIik7CisKKwkJQk5fZnJlZSgmc2NhbGFyMyk7CisJfQorCisKKyNpZiAwCisJdGltaW5ncyhQXzE2MCwgVElNSU5HX0JBU0VfUFQsIGN0eCk7CisJdGltaW5ncyhQXzE2MCwgVElNSU5HX1JBTkRfUFQsIGN0eCk7CisJdGltaW5ncyhQXzE2MCwgVElNSU5HX1NJTVVMLCBjdHgpOworCXRpbWluZ3MoUF8xOTIsIFRJTUlOR19CQVNFX1BULCBjdHgpOworCXRpbWluZ3MoUF8xOTIsIFRJTUlOR19SQU5EX1BULCBjdHgpOworCXRpbWluZ3MoUF8xOTIsIFRJTUlOR19TSU1VTCwgY3R4KTsKKwl0aW1pbmdzKFBfMjI0LCBUSU1JTkdfQkFTRV9QVCwgY3R4KTsKKwl0aW1pbmdzKFBfMjI0LCBUSU1JTkdfUkFORF9QVCwgY3R4KTsKKwl0aW1pbmdzKFBfMjI0LCBUSU1JTkdfU0lNVUwsIGN0eCk7CisJdGltaW5ncyhQXzI1NiwgVElNSU5HX0JBU0VfUFQsIGN0eCk7CisJdGltaW5ncyhQXzI1NiwgVElNSU5HX1JBTkRfUFQsIGN0eCk7CisJdGltaW5ncyhQXzI1NiwgVElNSU5HX1NJTVVMLCBjdHgpOworCXRpbWluZ3MoUF8zODQsIFRJTUlOR19CQVNFX1BULCBjdHgpOworCXRpbWluZ3MoUF8zODQsIFRJTUlOR19SQU5EX1BULCBjdHgpOworCXRpbWluZ3MoUF8zODQsIFRJTUlOR19TSU1VTCwgY3R4KTsKKwl0aW1pbmdzKFBfNTIxLCBUSU1JTkdfQkFTRV9QVCwgY3R4KTsKKwl0aW1pbmdzKFBfNTIxLCBUSU1JTkdfUkFORF9QVCwgY3R4KTsKKwl0aW1pbmdzKFBfNTIxLCBUSU1JTkdfU0lNVUwsIGN0eCk7CisjZW5kaWYKKworCisJaWYgKGN0eCkKKwkJQk5fQ1RYX2ZyZWUoY3R4KTsKKwlCTl9mcmVlKHApOyBCTl9mcmVlKGEpOwlCTl9mcmVlKGIpOworCUVDX0dST1VQX2ZyZWUoZ3JvdXApOworCUVDX1BPSU5UX2ZyZWUoUCk7CisJRUNfUE9JTlRfZnJlZShRKTsKKwlFQ19QT0lOVF9mcmVlKFIpOworCUJOX2ZyZWUoeCk7IEJOX2ZyZWUoeSk7IEJOX2ZyZWUoeik7CisKKwlpZiAoUF8xNjApIEVDX0dST1VQX2ZyZWUoUF8xNjApOworCWlmIChQXzE5MikgRUNfR1JPVVBfZnJlZShQXzE5Mik7CisJaWYgKFBfMjI0KSBFQ19HUk9VUF9mcmVlKFBfMjI0KTsKKwlpZiAoUF8yNTYpIEVDX0dST1VQX2ZyZWUoUF8yNTYpOworCWlmIChQXzM4NCkgRUNfR1JPVVBfZnJlZShQXzM4NCk7CisJaWYgKFBfNTIxKSBFQ19HUk9VUF9mcmVlKFBfNTIxKTsKKworCX0KKworLyogQ2hhbmdlIHRlc3QgYmFzZWQgb24gd2hldGhlciBiaW5hcnkgcG9pbnQgY29tcHJlc3Npb24gaXMgZW5hYmxlZCBvciBub3QuICovCisjaWZkZWYgT1BFTlNTTF9FQ19CSU5fUFRfQ09NUAorI2RlZmluZSBDSEFSMl9DVVJWRV9URVNUX0lOVEVSTkFMKF9uYW1lLCBfcCwgX2EsIF9iLCBfeCwgX3ksIF95X2JpdCwgX29yZGVyLCBfY29mLCBfZGVncmVlLCBfdmFyaWFibGUpIFwKKwlpZiAoIUJOX2hleDJibigmeCwgX3gpKSBBQk9SVDsgXAorCWlmICghRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0YybShncm91cCwgUCwgeCwgX3lfYml0LCBjdHgpKSBBQk9SVDsgXAorCWlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZ3JvdXAsIFAsIGN0eCkpIEFCT1JUOyBcCisJaWYgKCFCTl9oZXgyYm4oJnosIF9vcmRlcikpIEFCT1JUOyBcCisJaWYgKCFCTl9oZXgyYm4oJmNvZiwgX2NvZikpIEFCT1JUOyBcCisJaWYgKCFFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKGdyb3VwLCBQLCB6LCBjb2YpKSBBQk9SVDsgXAorCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBQLCB4LCB5LCBjdHgpKSBBQk9SVDsgXAorCWZwcmludGYoc3Rkb3V0LCAiXG4lcyAtLSBHZW5lcmF0b3I6XG4gICAgIHggPSAweCIsIF9uYW1lKTsgXAorCUJOX3ByaW50X2ZwKHN0ZG91dCwgeCk7IFwKKwlmcHJpbnRmKHN0ZG91dCwgIlxuICAgICB5ID0gMHgiKTsgXAorCUJOX3ByaW50X2ZwKHN0ZG91dCwgeSk7IFwKKwlmcHJpbnRmKHN0ZG91dCwgIlxuIik7IFwKKwkvKiBHX3kgdmFsdWUgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQ6ICovIFwKKwlpZiAoIUJOX2hleDJibigmeiwgX3kpKSBBQk9SVDsgXAorCWlmICgwICE9IEJOX2NtcCh5LCB6KSkgQUJPUlQ7CisjZWxzZSAKKyNkZWZpbmUgQ0hBUjJfQ1VSVkVfVEVTVF9JTlRFUk5BTChfbmFtZSwgX3AsIF9hLCBfYiwgX3gsIF95LCBfeV9iaXQsIF9vcmRlciwgX2NvZiwgX2RlZ3JlZSwgX3ZhcmlhYmxlKSBcCisJaWYgKCFCTl9oZXgyYm4oJngsIF94KSkgQUJPUlQ7IFwKKwlpZiAoIUJOX2hleDJibigmeSwgX3kpKSBBQk9SVDsgXAorCWlmICghRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBQLCB4LCB5LCBjdHgpKSBBQk9SVDsgXAorCWlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZ3JvdXAsIFAsIGN0eCkpIEFCT1JUOyBcCisJaWYgKCFCTl9oZXgyYm4oJnosIF9vcmRlcikpIEFCT1JUOyBcCisJaWYgKCFCTl9oZXgyYm4oJmNvZiwgX2NvZikpIEFCT1JUOyBcCisJaWYgKCFFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKGdyb3VwLCBQLCB6LCBjb2YpKSBBQk9SVDsgXAorCWZwcmludGYoc3Rkb3V0LCAiXG4lcyAtLSBHZW5lcmF0b3I6XG4gICAgIHggPSAweCIsIF9uYW1lKTsgXAorCUJOX3ByaW50X2ZwKHN0ZG91dCwgeCk7IFwKKwlmcHJpbnRmKHN0ZG91dCwgIlxuICAgICB5ID0gMHgiKTsgXAorCUJOX3ByaW50X2ZwKHN0ZG91dCwgeSk7IFwKKwlmcHJpbnRmKHN0ZG91dCwgIlxuIik7CisjZW5kaWYKKworI2RlZmluZSBDSEFSMl9DVVJWRV9URVNUKF9uYW1lLCBfcCwgX2EsIF9iLCBfeCwgX3ksIF95X2JpdCwgX29yZGVyLCBfY29mLCBfZGVncmVlLCBfdmFyaWFibGUpIFwKKwlpZiAoIUJOX2hleDJibigmcCwgX3ApKSBBQk9SVDsgXAorCWlmICghQk5faGV4MmJuKCZhLCBfYSkpIEFCT1JUOyBcCisJaWYgKCFCTl9oZXgyYm4oJmIsIF9iKSkgQUJPUlQ7IFwKKwlpZiAoIUVDX0dST1VQX3NldF9jdXJ2ZV9HRjJtKGdyb3VwLCBwLCBhLCBiLCBjdHgpKSBBQk9SVDsgXAorCUNIQVIyX0NVUlZFX1RFU1RfSU5URVJOQUwoX25hbWUsIF9wLCBfYSwgX2IsIF94LCBfeSwgX3lfYml0LCBfb3JkZXIsIF9jb2YsIF9kZWdyZWUsIF92YXJpYWJsZSkgXAorCWZwcmludGYoc3Rkb3V0LCAidmVyaWZ5IGRlZ3JlZSAuLi4iKTsgXAorCWlmIChFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSAhPSBfZGVncmVlKSBBQk9SVDsgXAorCWZwcmludGYoc3Rkb3V0LCAiIG9rXG4iKTsgXAorCWZwcmludGYoc3Rkb3V0LCAidmVyaWZ5IGdyb3VwIG9yZGVyIC4uLiIpOyBcCisJZmZsdXNoKHN0ZG91dCk7IFwKKwlpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgeiwgY3R4KSkgQUJPUlQ7IFwKKwlpZiAoIUVDX1BPSU5UX211bChncm91cCwgUSwgeiwgTlVMTCwgTlVMTCwgY3R4KSkgQUJPUlQ7IFwKKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBRKSkgQUJPUlQ7IFwKKwlmcHJpbnRmKHN0ZG91dCwgIi4iKTsgXAorCWZmbHVzaChzdGRvdXQpOyBcCisJaWYgKCFFQ19HUk9VUF9wcmVjb21wdXRlX211bHQoZ3JvdXAsIGN0eCkpIEFCT1JUOyBcCisJaWYgKCFFQ19QT0lOVF9tdWwoZ3JvdXAsIFEsIHosIE5VTEwsIE5VTEwsIGN0eCkpIEFCT1JUOyBcCisJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUSkpIEFCT1JUOyBcCisJZnByaW50ZihzdGRvdXQsICIgb2tcbiIpOyBcCisJaWYgKCEoX3ZhcmlhYmxlID0gRUNfR1JPVVBfbmV3KEVDX0dST1VQX21ldGhvZF9vZihncm91cCkpKSkgQUJPUlQ7IFwKKwlpZiAoIUVDX0dST1VQX2NvcHkoX3ZhcmlhYmxlLCBncm91cCkpIEFCT1JUOworCit2b2lkIGNoYXIyX2ZpZWxkX3Rlc3RzKCkKKwl7CQorCUJOX0NUWCAqY3R4ID0gTlVMTDsKKwlCSUdOVU0gKnAsICphLCAqYjsKKwlFQ19HUk9VUCAqZ3JvdXA7CisJRUNfR1JPVVAgKkMyX0sxNjMgPSBOVUxMLCAqQzJfSzIzMyA9IE5VTEwsICpDMl9LMjgzID0gTlVMTCwgKkMyX0s0MDkgPSBOVUxMLCAqQzJfSzU3MSA9IE5VTEw7CisJRUNfR1JPVVAgKkMyX0IxNjMgPSBOVUxMLCAqQzJfQjIzMyA9IE5VTEwsICpDMl9CMjgzID0gTlVMTCwgKkMyX0I0MDkgPSBOVUxMLCAqQzJfQjU3MSA9IE5VTEw7CisJRUNfUE9JTlQgKlAsICpRLCAqUjsKKwlCSUdOVU0gKngsICp5LCAqeiwgKmNvZjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMDBdOworCXNpemVfdCBpLCBsZW47CisJaW50IGs7CisJCisjaWYgMSAvKiBvcHRpb25hbCAqLworCWN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoIWN0eCkgQUJPUlQ7CisjZW5kaWYKKworCXAgPSBCTl9uZXcoKTsKKwlhID0gQk5fbmV3KCk7CisJYiA9IEJOX25ldygpOworCWlmICghcCB8fCAhYSB8fCAhYikgQUJPUlQ7CisKKwlpZiAoIUJOX2hleDJibigmcCwgIjEzIikpIEFCT1JUOworCWlmICghQk5faGV4MmJuKCZhLCAiMyIpKSBBQk9SVDsKKwlpZiAoIUJOX2hleDJibigmYiwgIjEiKSkgQUJPUlQ7CisJCisJZ3JvdXAgPSBFQ19HUk9VUF9uZXcoRUNfR0YybV9zaW1wbGVfbWV0aG9kKCkpOyAvKiBhcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSBFQ19HUk9VUF9uZXdfY3VydmVfR0YybQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc28gdGhhdCB0aGUgbGlicmFyeSBnZXRzIHRvIGNob29zZSB0aGUgRUNfTUVUSE9EICovCisJaWYgKCFncm91cCkgQUJPUlQ7CisJaWYgKCFFQ19HUk9VUF9zZXRfY3VydmVfR0YybShncm91cCwgcCwgYSwgYiwgY3R4KSkgQUJPUlQ7CisKKwl7CisJCUVDX0dST1VQICp0bXA7CisJCXRtcCA9IEVDX0dST1VQX25ldyhFQ19HUk9VUF9tZXRob2Rfb2YoZ3JvdXApKTsKKwkJaWYgKCF0bXApIEFCT1JUOworCQlpZiAoIUVDX0dST1VQX2NvcHkodG1wLCBncm91cCkpIEFCT1JUOworCQlFQ19HUk9VUF9mcmVlKGdyb3VwKTsKKwkJZ3JvdXAgPSB0bXA7CisJfQorCQorCWlmICghRUNfR1JPVVBfZ2V0X2N1cnZlX0dGMm0oZ3JvdXAsIHAsIGEsIGIsIGN0eCkpIEFCT1JUOworCisJZnByaW50ZihzdGRvdXQsICJDdXJ2ZSBkZWZpbmVkIGJ5IFdlaWVyc3RyYXNzIGVxdWF0aW9uXG4gICAgIHleMiArIHgqeSA9IHheMyArIGEqeF4yICsgYiAgKG1vZCAweCIpOworCUJOX3ByaW50X2ZwKHN0ZG91dCwgcCk7CisJZnByaW50ZihzdGRvdXQsICIpXG4gICAgIGEgPSAweCIpOworCUJOX3ByaW50X2ZwKHN0ZG91dCwgYSk7CisJZnByaW50ZihzdGRvdXQsICJcbiAgICAgYiA9IDB4Iik7CisJQk5fcHJpbnRfZnAoc3Rkb3V0LCBiKTsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuKDB4Li4uIG1lYW5zIGJpbmFyeSBwb2x5bm9taWFsKVxuIik7CisKKwlQID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKwlRID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKwlSID0gRUNfUE9JTlRfbmV3KGdyb3VwKTsKKwlpZiAoIVAgfHwgIVEgfHwgIVIpIEFCT1JUOworCQorCWlmICghRUNfUE9JTlRfc2V0X3RvX2luZmluaXR5KGdyb3VwLCBQKSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUCkpIEFCT1JUOworCisJYnVmWzBdID0gMDsKKwlpZiAoIUVDX1BPSU5UX29jdDJwb2ludChncm91cCwgUSwgYnVmLCAxLCBjdHgpKSBBQk9SVDsKKworCWlmICghRUNfUE9JTlRfYWRkKGdyb3VwLCBQLCBQLCBRLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBQKSkgQUJPUlQ7CisKKwl4ID0gQk5fbmV3KCk7CisJeSA9IEJOX25ldygpOworCXogPSBCTl9uZXcoKTsKKwljb2YgPSBCTl9uZXcoKTsKKwlpZiAoIXggfHwgIXkgfHwgIXogfHwgIWNvZikgQUJPUlQ7CisKKwlpZiAoIUJOX2hleDJibigmeCwgIjYiKSkgQUJPUlQ7CisvKiBDaGFuZ2UgdGVzdCBiYXNlZCBvbiB3aGV0aGVyIGJpbmFyeSBwb2ludCBjb21wcmVzc2lvbiBpcyBlbmFibGVkIG9yIG5vdC4gKi8KKyNpZmRlZiBPUEVOU1NMX0VDX0JJTl9QVF9DT01QCisJaWYgKCFFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBRLCB4LCAxLCBjdHgpKSBBQk9SVDsKKyNlbHNlCisJaWYgKCFCTl9oZXgyYm4oJnksICI4IikpIEFCT1JUOworCWlmICghRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBRLCB4LCB5LCBjdHgpKSBBQk9SVDsKKyNlbmRpZgorCWlmICghRUNfUE9JTlRfaXNfb25fY3VydmUoZ3JvdXAsIFEsIGN0eCkpCisJCXsKKy8qIENoYW5nZSB0ZXN0IGJhc2VkIG9uIHdoZXRoZXIgYmluYXJ5IHBvaW50IGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgb3Igbm90LiAqLworI2lmZGVmIE9QRU5TU0xfRUNfQklOX1BUX0NPTVAKKwkJaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0oZ3JvdXAsIFEsIHgsIHksIGN0eCkpIEFCT1JUOworI2VuZGlmCisJCWZwcmludGYoc3RkZXJyLCAiUG9pbnQgaXMgbm90IG9uIGN1cnZlOiB4ID0gMHgiKTsKKwkJQk5fcHJpbnRfZnAoc3RkZXJyLCB4KTsKKwkJZnByaW50ZihzdGRlcnIsICIsIHkgPSAweCIpOworCQlCTl9wcmludF9mcChzdGRlcnIsIHkpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJCUFCT1JUOworCQl9CisKKwlmcHJpbnRmKHN0ZG91dCwgIkEgY3ljbGljIHN1Ymdyb3VwOlxuIik7CisJayA9IDEwMDsKKwlkbworCQl7CisJCWlmIChrLS0gPT0gMCkgQUJPUlQ7CisKKwkJaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBQKSkKKwkJCWZwcmludGYoc3Rkb3V0LCAiICAgICBwb2ludCBhdCBpbmZpbml0eVxuIik7CisJCWVsc2UKKwkJCXsKKwkJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCBQLCB4LCB5LCBjdHgpKSBBQk9SVDsKKworCQkJZnByaW50ZihzdGRvdXQsICIgICAgIHggPSAweCIpOworCQkJQk5fcHJpbnRfZnAoc3Rkb3V0LCB4KTsKKwkJCWZwcmludGYoc3Rkb3V0LCAiLCB5ID0gMHgiKTsKKwkJCUJOX3ByaW50X2ZwKHN0ZG91dCwgeSk7CisJCQlmcHJpbnRmKHN0ZG91dCwgIlxuIik7CisJCQl9CisJCQorCQlpZiAoIUVDX1BPSU5UX2NvcHkoUiwgUCkpIEFCT1JUOworCQlpZiAoIUVDX1BPSU5UX2FkZChncm91cCwgUCwgUCwgUSwgY3R4KSkgQUJPUlQ7CisJCX0KKwl3aGlsZSAoIUVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBQKSk7CisKKwlpZiAoIUVDX1BPSU5UX2FkZChncm91cCwgUCwgUSwgUiwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUCkpIEFCT1JUOworCisvKiBDaGFuZ2UgdGVzdCBiYXNlZCBvbiB3aGV0aGVyIGJpbmFyeSBwb2ludCBjb21wcmVzc2lvbiBpcyBlbmFibGVkIG9yIG5vdC4gKi8KKyNpZmRlZiBPUEVOU1NMX0VDX0JJTl9QVF9DT01QCisJbGVuID0gRUNfUE9JTlRfcG9pbnQyb2N0KGdyb3VwLCBRLCBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQsIGJ1Ziwgc2l6ZW9mIGJ1ZiwgY3R4KTsKKwlpZiAobGVuID09IDApIEFCT1JUOworCWlmICghRUNfUE9JTlRfb2N0MnBvaW50KGdyb3VwLCBQLCBidWYsIGxlbiwgY3R4KSkgQUJPUlQ7CisJaWYgKDAgIT0gRUNfUE9JTlRfY21wKGdyb3VwLCBQLCBRLCBjdHgpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIkdlbmVyYXRvciBhcyBvY3RldCBzdHJpbmcsIGNvbXByZXNzZWQgZm9ybTpcbiAgICAgIik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSBmcHJpbnRmKHN0ZG91dCwgIiUwMlgiLCBidWZbaV0pOworI2VuZGlmCisJCisJbGVuID0gRUNfUE9JTlRfcG9pbnQyb2N0KGdyb3VwLCBRLCBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCwgYnVmLCBzaXplb2YgYnVmLCBjdHgpOworCWlmIChsZW4gPT0gMCkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9vY3QycG9pbnQoZ3JvdXAsIFAsIGJ1ZiwgbGVuLCBjdHgpKSBBQk9SVDsKKwlpZiAoMCAhPSBFQ19QT0lOVF9jbXAoZ3JvdXAsIFAsIFEsIGN0eCkpIEFCT1JUOworCWZwcmludGYoc3Rkb3V0LCAiXG5HZW5lcmF0b3IgYXMgb2N0ZXQgc3RyaW5nLCB1bmNvbXByZXNzZWQgZm9ybTpcbiAgICAgIik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSBmcHJpbnRmKHN0ZG91dCwgIiUwMlgiLCBidWZbaV0pOworCQorLyogQ2hhbmdlIHRlc3QgYmFzZWQgb24gd2hldGhlciBiaW5hcnkgcG9pbnQgY29tcHJlc3Npb24gaXMgZW5hYmxlZCBvciBub3QuICovCisjaWZkZWYgT1BFTlNTTF9FQ19CSU5fUFRfQ09NUAorCWxlbiA9IEVDX1BPSU5UX3BvaW50Mm9jdChncm91cCwgUSwgUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQsIGJ1Ziwgc2l6ZW9mIGJ1ZiwgY3R4KTsKKwlpZiAobGVuID09IDApIEFCT1JUOworCWlmICghRUNfUE9JTlRfb2N0MnBvaW50KGdyb3VwLCBQLCBidWYsIGxlbiwgY3R4KSkgQUJPUlQ7CisJaWYgKDAgIT0gRUNfUE9JTlRfY21wKGdyb3VwLCBQLCBRLCBjdHgpKSBBQk9SVDsKKwlmcHJpbnRmKHN0ZG91dCwgIlxuR2VuZXJhdG9yIGFzIG9jdGV0IHN0cmluZywgaHlicmlkIGZvcm06XG4gICAgICIpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgZnByaW50ZihzdGRvdXQsICIlMDJYIiwgYnVmW2ldKTsKKyNlbmRpZgorCisJZnByaW50ZihzdGRvdXQsICJcbiIpOworCQorCWlmICghRUNfUE9JTlRfaW52ZXJ0KGdyb3VwLCBQLCBjdHgpKSBBQk9SVDsKKwlpZiAoMCAhPSBFQ19QT0lOVF9jbXAoZ3JvdXAsIFAsIFIsIGN0eCkpIEFCT1JUOworCisKKwkvKiBDdXJ2ZSBLLTE2MyAoRklQUyBQVUIgMTg2LTIsIEFwcC4gNikgKi8KKwlDSEFSMl9DVVJWRV9URVNUCisJCSgKKwkJIk5JU1QgY3VydmUgSy0xNjMiLAorCQkiMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEM5IiwKKwkJIjEiLAorCQkiMSIsCisJCSIwMkZFMTNDMDUzN0JCQzExQUNBQTA3RDc5M0RFNEU2RDVFNUM5NEVFRTgiLAorCQkiMDI4OTA3MEZCMDVEMzhGRjU4MzIxRjJFODAwNTM2RDUzOENDREFBM0Q5IiwKKwkJMSwKKwkJIjA0MDAwMDAwMDAwMDAwMDAwMDAwMDIwMTA4QTJFMENDMEQ5OUY4QTVFRiIsCisJCSIyIiwKKwkJMTYzLAorCQlDMl9LMTYzCisJCSk7CisKKwkvKiBDdXJ2ZSBCLTE2MyAoRklQUyBQVUIgMTg2LTIsIEFwcC4gNikgKi8KKwlDSEFSMl9DVVJWRV9URVNUCisJCSgKKwkJIk5JU1QgY3VydmUgQi0xNjMiLAorCQkiMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEM5IiwKKwkJIjEiLAorCQkiMDIwQTYwMTkwN0I4Qzk1M0NBMTQ4MUVCMTA1MTJGNzg3NDRBMzIwNUZEIiwKKwkJIjAzRjBFQkExNjI4NkEyRDU3RUEwOTkxMTY4RDQ5OTQ2MzdFODM0M0UzNiIsCisJCSIwMEQ1MUZCQzZDNzFBMDA5NEZBMkNERDU0NUIxMUM1QzBDNzk3MzI0RjEiLAorCQkxLAorCQkiMDQwMDAwMDAwMDAwMDAwMDAwMDAwMjkyRkU3N0U3MEMxMkE0MjM0QzMzIiwKKwkJIjIiLAorCQkxNjMsCisJCUMyX0IxNjMKKwkJKTsKKworCS8qIEN1cnZlIEstMjMzIChGSVBTIFBVQiAxODYtMiwgQXBwLiA2KSAqLworCUNIQVIyX0NVUlZFX1RFU1QKKwkJKAorCQkiTklTVCBjdXJ2ZSBLLTIzMyIsCisJCSIwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDEiLAorCQkiMCIsCisJCSIxIiwKKwkJIjAxNzIzMkJBODUzQTdFNzMxQUYxMjlGMjJGRjQxNDk1NjNBNDE5QzI2QkY1MEE0QzlENkVFRkFENjEyNiIsCisJCSIwMURCNTM3REVDRTgxOUI3RjcwRjU1NUE2N0M0MjdBOENEOUJGMThBRUI5QjU2RTBDMTEwNTZGQUU2QTMiLAorCQkwLAorCQkiMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDY5RDVCQjkxNUJDRDQ2RUZCMUFENUYxNzNBQkRGIiwKKwkJIjQiLAorCQkyMzMsCisJCUMyX0syMzMKKwkJKTsKKworCS8qIEN1cnZlIEItMjMzIChGSVBTIFBVQiAxODYtMiwgQXBwLiA2KSAqLworCUNIQVIyX0NVUlZFX1RFU1QKKwkJKAorCQkiTklTVCBjdXJ2ZSBCLTIzMyIsCisJCSIwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDEiLAorCQkiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwKKwkJIjAwNjY2NDdFREU2QzMzMkM3RjhDMDkyM0JCNTgyMTNCMzMzQjIwRTlDRTQyODFGRTExNUY3RDhGOTBBRCIsCisJCSIwMEZBQzlERkNCQUM4MzEzQkIyMTM5RjFCQjc1NUZFRjY1QkMzOTFGOEIzNkY4RjhFQjczNzFGRDU1OEIiLAorCQkiMDEwMDZBMDhBNDE5MDMzNTA2NzhFNTg1MjhCRUJGOEEwQkVGRjg2N0E3Q0EzNjcxNkY3RTAxRjgxMDUyIiwKKwkJMSwKKwkJIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzRTk3NEU3MkY4QTY5MjIwMzFEMjYwM0NGRTBENyIsCisJCSIyIiwKKwkJMjMzLAorCQlDMl9CMjMzCisJCSk7CisKKwkvKiBDdXJ2ZSBLLTI4MyAoRklQUyBQVUIgMTg2LTIsIEFwcC4gNikgKi8KKwlDSEFSMl9DVVJWRV9URVNUCisJCSgKKwkJIk5JU1QgY3VydmUgSy0yODMiLAorCQkiMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMEExIiwKKwkJIjAiLAorCQkiMSIsCisJCSIwNTAzMjEzRjc4Q0E0NDg4M0YxQTNCODE2MkYxODhFNTUzQ0QyNjVGMjNDMTU2N0ExNjg3NjkxM0IwQzJBQzI0NTg0OTI4MzYiLAorCQkiMDFDQ0RBMzgwRjFDOUUzMThEOTBGOTVEMDdFNTQyNkZFODdFNDVDMEU4MTg0Njk4RTQ1OTYyMzY0RTM0MTE2MTc3REQyMjU5IiwKKwkJMCwKKwkJIjAxRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkU5QUUyRUQwNzU3NzI2NURGRjdGOTQ0NTFFMDYxRTE2M0M2MSIsCisJCSI0IiwKKwkJMjgzLAorCQlDMl9LMjgzCisJCSk7CisKKwkvKiBDdXJ2ZSBCLTI4MyAoRklQUyBQVUIgMTg2LTIsIEFwcC4gNikgKi8KKwlDSEFSMl9DVVJWRV9URVNUCisJCSgKKwkJIk5JU1QgY3VydmUgQi0yODMiLAorCQkiMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMEExIiwKKwkJIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSIsCisJCSIwMjdCNjgwQUM4Qjg1OTZEQTVBNEFGOEExOUEwMzAzRkNBOTdGRDc2NDUzMDlGQTJBNTgxNDg1QUY2MjYzRTMxM0I3OUEyRjUiLAorCQkiMDVGOTM5MjU4REI3REQ5MEUxOTM0RjhDNzBCMERGRUMyRUVEMjVCODU1N0VBQzlDODBFMkUxOThGOENEQkVDRDg2QjEyMDUzIiwKKwkJIjAzNjc2ODU0RkUyNDE0MUNCOThGRTZENEIyMEQwMkI0NTE2RkY3MDIzNTBFRERCMDgyNjc3OUM4MTNGMERGNDVCRTgxMTJGNCIsCisJCTEsCisJCSIwM0ZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZFRjkwMzk5NjYwRkM5MzhBOTAxNjVCMDQyQTdDRUZBREIzMDciLAorCQkiMiIsCisJCTI4MywKKwkJQzJfQjI4MworCQkpOworCisJLyogQ3VydmUgSy00MDkgKEZJUFMgUFVCIDE4Ni0yLCBBcHAuIDYpICovCisJQ0hBUjJfQ1VSVkVfVEVTVAorCQkoCisJCSJOSVNUIGN1cnZlIEstNDA5IiwKKwkJIjAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwKKwkJIjAiLAorCQkiMSIsCisJCSIwMDYwRjA1RjY1OEY0OUMxQUQzQUIxODkwRjcxODQyMTBFRkQwOTg3RTMwN0M4NEMyN0FDQ0ZCOEY5RjY3Q0MyQzQ2MDE4OUVCNUFBQUE2MkVFMjIyRUIxQjM1NTQwQ0ZFOTAyMzc0NiIsCisJCSIwMUUzNjkwNTBCN0M0RTQyQUNCQTFEQUNCRjA0Mjk5QzM0NjA3ODJGOTE4RUE0MjdFNjMyNTE2NUU5RUExMEUzREE1RjZDNDJFOUM1NTIxNUFBOUNBMjdBNTg2M0VDNDhEOEUwMjg2QiIsCisJCTEsCisJCSIwMDdGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkU1RjgzQjJENEVBMjA0MDBFQzQ1NTdENUVEM0UzRTdDQTVCNEI1QzgzQjhFMDFFNUZDRiIsCisJCSI0IiwKKwkJNDA5LAorCQlDMl9LNDA5CisJCSk7CisKKwkvKiBDdXJ2ZSBCLTQwOSAoRklQUyBQVUIgMTg2LTIsIEFwcC4gNikgKi8KKwlDSEFSMl9DVVJWRV9URVNUCisJCSgKKwkJIk5JU1QgY3VydmUgQi00MDkiLAorCQkiMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDEiLAorCQkiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEiLAorCQkiMDAyMUE1QzJDOEVFOUZFQjVDNEI5QTc1M0I3QjQ3NkI3RkQ2NDIyRUYxRjNERDY3NDc2MUZBOTlENkFDMjdDOEE5QTE5N0IyNzI4MjJGNkNENTdBNTVBQTRGNTBBRTMxN0IxMzU0NUYiLAorCQkiMDE1RDQ4NjBEMDg4RERCMzQ5NkIwQzYwNjQ3NTYyNjA0NDFDREU0QUYxNzcxRDREQjAxRkZFNUIzNEU1OTcwM0RDMjU1QTg2OEExMTgwNTE1NjAzQUVBQjYwNzk0RTU0QkI3OTk2QTciLAorCQkiMDA2MUIxQ0ZBQjZCRTVGMzJCQkZBNzgzMjRFRDEwNkE3NjM2QjlDNUE3QkQxOThEMDE1OEFBNEY1NDg4RDA4RjM4NTE0RjFGREY0QjRGNDBEMjE4MUIzNjgxQzM2NEJBMDI3M0M3MDYiLAorCQkxLAorCQkiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRTJBQUQ2QTYxMkYzMzMwN0JFNUZBNDdDM0M5RTA1MkY4MzgxNjRDRDM3RDlBMjExNzMiLAorCQkiMiIsCisJCTQwOSwKKwkJQzJfQjQwOQorCQkpOworCisJLyogQ3VydmUgSy01NzEgKEZJUFMgUFVCIDE4Ni0yLCBBcHAuIDYpICovCisJQ0hBUjJfQ1VSVkVfVEVTVAorCQkoCisJCSJOSVNUIGN1cnZlIEstNTcxIiwKKwkJIjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDI1IiwKKwkJIjAiLAorCQkiMSIsCisJCSIwMjZFQjdBODU5OTIzRkJDODIxODk2MzFGODEwM0ZFNEFDOUNBMjk3MDAxMkQ1RDQ2MDI0ODA0ODAxODQxQ0E0NDM3MDk1ODQ5M0IyMDVFNjQ3REEzMDREQjRDRUIwOENCQkQxQkEzOTQ5NDc3NkZCOTg4QjQ3MTc0RENBODhDN0UyOTQ1MjgzQTAxQzg5NzIiLAorCQkiMDM0OURDODA3RjRGQkYzNzRGNEFFQURFM0JDQTk1MzE0REQ1OENFQzlGMzA3QTU0RkZDNjFFRkMwMDZEOEEyQzlENDk3OUMwQUM0NEFFQTc0RkJFQkJCOUY3NzJBRURDQjYyMEIwMUE3QkE3QUYxQjMyMDQzMEM4NTkxOTg0RjYwMUNENEMxNDNFRjFDN0EzIiwKKwkJMCwKKwkJIjAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzMTg1MEUxRjE5QTYzRTRCMzkxQThEQjkxN0Y0MTM4QjYzMEQ4NEJFNUQ2MzkzODFFOTFERUI0NUNGRTc3OEY2MzdDMTAwMSIsCisJCSI0IiwKKwkJNTcxLAorCQlDMl9LNTcxCisJCSk7CisKKwkvKiBDdXJ2ZSBCLTU3MSAoRklQUyBQVUIgMTg2LTIsIEFwcC4gNikgKi8KKwlDSEFSMl9DVVJWRV9URVNUCisJCSgKKwkJIk5JU1QgY3VydmUgQi01NzEiLAorCQkiODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MjUiLAorCQkiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwKKwkJIjAyRjQwRTdFMjIyMUYyOTVERTI5NzExN0I3RjNENjJGNUM2QTk3RkZDQjhDRUZGMUNENkJBOENFNEE5QTE4QUQ4NEZGQUJCRDhFRkE1OTMzMkJFN0FENjc1NkE2NkUyOTRBRkQxODVBNzhGRjEyQUE1MjBFNERFNzM5QkFDQTBDN0ZGRUZGN0YyOTU1NzI3QSIsCisJCSIwMzAzMDAxRDM0Qjg1NjI5NkMxNkMwRDQwRDNDRDc3NTBBOTNEMUQyOTU1RkE4MEFBNUY0MEZDOERCN0IyQUJEQkRFNTM5NTBGNEMwRDI5M0NERDcxMUEzNUI2N0ZCMTQ5OUFFNjAwMzg2MTRGMTM5NEFCRkEzQjRDODUwRDkyN0UxRTc3NjlDOEVFQzJEMTkiLAorCQkiMDM3QkYyNzM0MkRBNjM5QjZEQ0NGRkZFQjczRDY5RDc4QzZDMjdBNjAwOUNCQkNBMTk4MEY4NTMzOTIxRThBNjg0NDIzRTQzQkFCMDhBNTc2MjkxQUY4RjQ2MUJCMkE4QjM1MzFEMkYwNDg1QzE5QjE2RTJGMTUxNkUyM0REM0MxQTQ4MjdBRjFCOEFDMTVCIiwKKwkJMSwKKwkJIjAzRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkU2NjFDRTE4RkY1NTk4NzMwODA1OUIxODY4MjM4NTFFQzdERDlDQTExNjFERTkzRDUxNzRENjZFODM4MkU5QkIyRkU4NEU0NyIsCisJCSIyIiwKKwkJNTcxLAorCQlDMl9CNTcxCisJCSk7CisKKwkvKiBtb3JlIHRlc3RzIHVzaW5nIHRoZSBsYXN0IGN1cnZlICovCisKKwlpZiAoIUVDX1BPSU5UX2NvcHkoUSwgUCkpIEFCT1JUOworCWlmIChFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUSkpIEFCT1JUOworCWlmICghRUNfUE9JTlRfZGJsKGdyb3VwLCBQLCBQLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2lzX29uX2N1cnZlKGdyb3VwLCBQLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2ludmVydChncm91cCwgUSwgY3R4KSkgQUJPUlQ7IC8qIFAgPSAtMlEgKi8KKworCWlmICghRUNfUE9JTlRfYWRkKGdyb3VwLCBSLCBQLCBRLCBjdHgpKSBBQk9SVDsKKwlpZiAoIUVDX1BPSU5UX2FkZChncm91cCwgUiwgUiwgUSwgY3R4KSkgQUJPUlQ7CisJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUikpIEFCT1JUOyAvKiBSID0gUCArIDJRICovCisKKwl7CisJCWNvbnN0IEVDX1BPSU5UICpwb2ludHNbM107CisJCWNvbnN0IEJJR05VTSAqc2NhbGFyc1szXTsKKwkKKwkJaWYgKEVDX1BPSU5UX2lzX2F0X2luZmluaXR5KGdyb3VwLCBRKSkgQUJPUlQ7CisJCXBvaW50c1swXSA9IFE7CisJCXBvaW50c1sxXSA9IFE7CisJCXBvaW50c1syXSA9IFE7CisKKwkJaWYgKCFCTl9hZGQoeSwgeiwgQk5fdmFsdWVfb25lKCkpKSBBQk9SVDsKKwkJaWYgKEJOX2lzX29kZCh5KSkgQUJPUlQ7CisJCWlmICghQk5fcnNoaWZ0MSh5LCB5KSkgQUJPUlQ7CisJCXNjYWxhcnNbMF0gPSB5OyAvKiAoZ3JvdXAgb3JkZXIgKyAxKS8yLCAgc28gIHkqUSArIHkqUSA9IFEgKi8KKwkJc2NhbGFyc1sxXSA9IHk7CisKKwkJZnByaW50ZihzdGRvdXQsICJjb21iaW5lZCBtdWx0aXBsaWNhdGlvbiAuLi4iKTsKKwkJZmZsdXNoKHN0ZG91dCk7CisKKwkJLyogeiBpcyBzdGlsbCB0aGUgZ3JvdXAgb3JkZXIgKi8KKwkJaWYgKCFFQ19QT0lOVHNfbXVsKGdyb3VwLCBQLCBOVUxMLCAyLCBwb2ludHMsIHNjYWxhcnMsIGN0eCkpIEFCT1JUOworCQlpZiAoIUVDX1BPSU5Uc19tdWwoZ3JvdXAsIFIsIHosIDIsIHBvaW50cywgc2NhbGFycywgY3R4KSkgQUJPUlQ7CisJCWlmICgwICE9IEVDX1BPSU5UX2NtcChncm91cCwgUCwgUiwgY3R4KSkgQUJPUlQ7CisJCWlmICgwICE9IEVDX1BPSU5UX2NtcChncm91cCwgUiwgUSwgY3R4KSkgQUJPUlQ7CisKKwkJZnByaW50ZihzdGRvdXQsICIuIik7CisJCWZmbHVzaChzdGRvdXQpOworCisJCWlmICghQk5fcHNldWRvX3JhbmQoeSwgQk5fbnVtX2JpdHMoeSksIDAsIDApKSBBQk9SVDsKKwkJaWYgKCFCTl9hZGQoeiwgeiwgeSkpIEFCT1JUOworCQlCTl9zZXRfbmVnYXRpdmUoeiwgMSk7CisJCXNjYWxhcnNbMF0gPSB5OworCQlzY2FsYXJzWzFdID0gejsgLyogeiA9IC0ob3JkZXIgKyB5KSAqLworCisJCWlmICghRUNfUE9JTlRzX211bChncm91cCwgUCwgTlVMTCwgMiwgcG9pbnRzLCBzY2FsYXJzLCBjdHgpKSBBQk9SVDsKKwkJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUCkpIEFCT1JUOworCisJCWZwcmludGYoc3Rkb3V0LCAiLiIpOworCQlmZmx1c2goc3Rkb3V0KTsKKworCQlpZiAoIUJOX3BzZXVkb19yYW5kKHgsIEJOX251bV9iaXRzKHkpIC0gMSwgMCwgMCkpIEFCT1JUOworCQlpZiAoIUJOX2FkZCh6LCB4LCB5KSkgQUJPUlQ7CisJCUJOX3NldF9uZWdhdGl2ZSh6LCAxKTsKKwkJc2NhbGFyc1swXSA9IHg7CisJCXNjYWxhcnNbMV0gPSB5OworCQlzY2FsYXJzWzJdID0gejsgLyogeiA9IC0oeCt5KSAqLworCisJCWlmICghRUNfUE9JTlRzX211bChncm91cCwgUCwgTlVMTCwgMywgcG9pbnRzLCBzY2FsYXJzLCBjdHgpKSBBQk9SVDsKKwkJaWYgKCFFQ19QT0lOVF9pc19hdF9pbmZpbml0eShncm91cCwgUCkpIEFCT1JUOworCisJCWZwcmludGYoc3Rkb3V0LCAiIG9rXG5cbiIpOworCX0KKworCisjaWYgMAorCXRpbWluZ3MoQzJfSzE2MywgVElNSU5HX0JBU0VfUFQsIGN0eCk7CisJdGltaW5ncyhDMl9LMTYzLCBUSU1JTkdfUkFORF9QVCwgY3R4KTsKKwl0aW1pbmdzKEMyX0sxNjMsIFRJTUlOR19TSU1VTCwgY3R4KTsKKwl0aW1pbmdzKEMyX0IxNjMsIFRJTUlOR19CQVNFX1BULCBjdHgpOworCXRpbWluZ3MoQzJfQjE2MywgVElNSU5HX1JBTkRfUFQsIGN0eCk7CisJdGltaW5ncyhDMl9CMTYzLCBUSU1JTkdfU0lNVUwsIGN0eCk7CisJdGltaW5ncyhDMl9LMjMzLCBUSU1JTkdfQkFTRV9QVCwgY3R4KTsKKwl0aW1pbmdzKEMyX0syMzMsIFRJTUlOR19SQU5EX1BULCBjdHgpOworCXRpbWluZ3MoQzJfSzIzMywgVElNSU5HX1NJTVVMLCBjdHgpOworCXRpbWluZ3MoQzJfQjIzMywgVElNSU5HX0JBU0VfUFQsIGN0eCk7CisJdGltaW5ncyhDMl9CMjMzLCBUSU1JTkdfUkFORF9QVCwgY3R4KTsKKwl0aW1pbmdzKEMyX0IyMzMsIFRJTUlOR19TSU1VTCwgY3R4KTsKKwl0aW1pbmdzKEMyX0syODMsIFRJTUlOR19CQVNFX1BULCBjdHgpOworCXRpbWluZ3MoQzJfSzI4MywgVElNSU5HX1JBTkRfUFQsIGN0eCk7CisJdGltaW5ncyhDMl9LMjgzLCBUSU1JTkdfU0lNVUwsIGN0eCk7CisJdGltaW5ncyhDMl9CMjgzLCBUSU1JTkdfQkFTRV9QVCwgY3R4KTsKKwl0aW1pbmdzKEMyX0IyODMsIFRJTUlOR19SQU5EX1BULCBjdHgpOworCXRpbWluZ3MoQzJfQjI4MywgVElNSU5HX1NJTVVMLCBjdHgpOworCXRpbWluZ3MoQzJfSzQwOSwgVElNSU5HX0JBU0VfUFQsIGN0eCk7CisJdGltaW5ncyhDMl9LNDA5LCBUSU1JTkdfUkFORF9QVCwgY3R4KTsKKwl0aW1pbmdzKEMyX0s0MDksIFRJTUlOR19TSU1VTCwgY3R4KTsKKwl0aW1pbmdzKEMyX0I0MDksIFRJTUlOR19CQVNFX1BULCBjdHgpOworCXRpbWluZ3MoQzJfQjQwOSwgVElNSU5HX1JBTkRfUFQsIGN0eCk7CisJdGltaW5ncyhDMl9CNDA5LCBUSU1JTkdfU0lNVUwsIGN0eCk7CisJdGltaW5ncyhDMl9LNTcxLCBUSU1JTkdfQkFTRV9QVCwgY3R4KTsKKwl0aW1pbmdzKEMyX0s1NzEsIFRJTUlOR19SQU5EX1BULCBjdHgpOworCXRpbWluZ3MoQzJfSzU3MSwgVElNSU5HX1NJTVVMLCBjdHgpOworCXRpbWluZ3MoQzJfQjU3MSwgVElNSU5HX0JBU0VfUFQsIGN0eCk7CisJdGltaW5ncyhDMl9CNTcxLCBUSU1JTkdfUkFORF9QVCwgY3R4KTsKKwl0aW1pbmdzKEMyX0I1NzEsIFRJTUlOR19TSU1VTCwgY3R4KTsKKyNlbmRpZgorCisKKwlpZiAoY3R4KQorCQlCTl9DVFhfZnJlZShjdHgpOworCUJOX2ZyZWUocCk7IEJOX2ZyZWUoYSk7CUJOX2ZyZWUoYik7CisJRUNfR1JPVVBfZnJlZShncm91cCk7CisJRUNfUE9JTlRfZnJlZShQKTsKKwlFQ19QT0lOVF9mcmVlKFEpOworCUVDX1BPSU5UX2ZyZWUoUik7CisJQk5fZnJlZSh4KTsgQk5fZnJlZSh5KTsgQk5fZnJlZSh6KTsgQk5fZnJlZShjb2YpOworCisJaWYgKEMyX0sxNjMpIEVDX0dST1VQX2ZyZWUoQzJfSzE2Myk7CisJaWYgKEMyX0IxNjMpIEVDX0dST1VQX2ZyZWUoQzJfQjE2Myk7CisJaWYgKEMyX0syMzMpIEVDX0dST1VQX2ZyZWUoQzJfSzIzMyk7CisJaWYgKEMyX0IyMzMpIEVDX0dST1VQX2ZyZWUoQzJfQjIzMyk7CisJaWYgKEMyX0syODMpIEVDX0dST1VQX2ZyZWUoQzJfSzI4Myk7CisJaWYgKEMyX0IyODMpIEVDX0dST1VQX2ZyZWUoQzJfQjI4Myk7CisJaWYgKEMyX0s0MDkpIEVDX0dST1VQX2ZyZWUoQzJfSzQwOSk7CisJaWYgKEMyX0I0MDkpIEVDX0dST1VQX2ZyZWUoQzJfQjQwOSk7CisJaWYgKEMyX0s1NzEpIEVDX0dST1VQX2ZyZWUoQzJfSzU3MSk7CisJaWYgKEMyX0I1NzEpIEVDX0dST1VQX2ZyZWUoQzJfQjU3MSk7CisKKwl9CisKK3ZvaWQgaW50ZXJuYWxfY3VydmVfdGVzdCh2b2lkKQorCXsKKwlFQ19idWlsdGluX2N1cnZlICpjdXJ2ZXMgPSBOVUxMOworCXNpemVfdCBjcnZfbGVuID0gMCwgbiA9IDA7CisJaW50ICAgIG9rID0gMTsKKworCWNydl9sZW4gPSBFQ19nZXRfYnVpbHRpbl9jdXJ2ZXMoTlVMTCwgMCk7CisKKwljdXJ2ZXMgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRUNfYnVpbHRpbl9jdXJ2ZSkgKiBjcnZfbGVuKTsKKworCWlmIChjdXJ2ZXMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKCFFQ19nZXRfYnVpbHRpbl9jdXJ2ZXMoY3VydmVzLCBjcnZfbGVuKSkKKwkJeworCQlPUEVOU1NMX2ZyZWUoY3VydmVzKTsKKwkJcmV0dXJuOworCQl9CisKKwlmcHJpbnRmKHN0ZG91dCwgInRlc3RpbmcgaW50ZXJuYWwgY3VydmVzOiAiKTsKKwkJCisJZm9yIChuID0gMDsgbiA8IGNydl9sZW47IG4rKykKKwkJeworCQlFQ19HUk9VUCAqZ3JvdXAgPSBOVUxMOworCQlpbnQgbmlkID0gY3VydmVzW25dLm5pZDsKKwkJaWYgKChncm91cCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKG5pZCkpID09IE5VTEwpCisJCQl7CisJCQlvayA9IDA7CisJCQlmcHJpbnRmKHN0ZG91dCwgIlxuRUNfR1JPVVBfbmV3X2N1cnZlX25hbWUoKSBmYWlsZWQgd2l0aCIKKwkJCQkiIGN1cnZlICVzXG4iLCBPQkpfbmlkMnNuKG5pZCkpOworCQkJLyogdHJ5IG5leHQgY3VydmUgKi8KKwkJCWNvbnRpbnVlOworCQkJfQorCQlpZiAoIUVDX0dST1VQX2NoZWNrKGdyb3VwLCBOVUxMKSkKKwkJCXsKKwkJCW9rID0gMDsKKwkJCWZwcmludGYoc3Rkb3V0LCAiXG5FQ19HUk9VUF9jaGVjaygpIGZhaWxlZCB3aXRoIgorCQkJCSIgY3VydmUgJXNcbiIsIE9CSl9uaWQyc24obmlkKSk7CisJCQlFQ19HUk9VUF9mcmVlKGdyb3VwKTsKKwkJCS8qIHRyeSB0aGUgbmV4dCBjdXJ2ZSAqLworCQkJY29udGludWU7CisJCQl9CisJCWZwcmludGYoc3Rkb3V0LCAiLiIpOworCQlmZmx1c2goc3Rkb3V0KTsKKwkJRUNfR1JPVVBfZnJlZShncm91cCk7CisJCX0KKwlpZiAob2spCisJCWZwcmludGYoc3Rkb3V0LCAiIG9rXG4iKTsKKwllbHNlCisJCWZwcmludGYoc3Rkb3V0LCAiIGZhaWxlZFxuIik7CisJT1BFTlNTTF9mcmVlKGN1cnZlcyk7CisJcmV0dXJuOworCX0KKworc3RhdGljIGNvbnN0IGNoYXIgcm5kX3NlZWRbXSA9ICJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHkiOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorCXsJCisJCisJLyogZW5hYmxlIG1lbW9yeSBsZWFrIGNoZWNraW5nIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkICovCisJaWYgKCEoKGdldGVudigiT1BFTlNTTF9ERUJVR19NRU1PUlkiKSAhPSBOVUxMKSAmJiAoMCA9PSBzdHJjbXAoZ2V0ZW52KCJPUEVOU1NMX0RFQlVHX01FTU9SWSIpLCAib2ZmIikpKSkKKwkJeworCQlDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKTsKKwkJQ1JZUFRPX3NldF9tZW1fZGVidWdfb3B0aW9ucyhWX0NSWVBUT19NREVCVUdfQUxMKTsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBPUEVOU1NMX0RFQlVHX01FTU9SWT1vZmYgKi8KKwkJQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKDAsIDAsIDAsIDAsIDApOworCQl9CisJQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pOworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKwlSQU5EX3NlZWQocm5kX3NlZWQsIHNpemVvZiBybmRfc2VlZCk7IC8qIG9yIEJOX2dlbmVyYXRlX3ByaW1lIG1heSBmYWlsICovCisKKwlwcmltZV9maWVsZF90ZXN0cygpOworCXB1dHMoIiIpOworCWNoYXIyX2ZpZWxkX3Rlc3RzKCk7CisJLyogdGVzdCB0aGUgaW50ZXJuYWwgY3VydmVzICovCisJaW50ZXJuYWxfY3VydmVfdGVzdCgpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJRU5HSU5FX2NsZWFudXAoKTsKKyNlbmRpZgorCUNSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisJRVJSX2ZyZWVfc3RyaW5ncygpOworCUVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKE5VTEwpOworCUNSWVBUT19tZW1fbGVha3NfZnAoc3RkZXJyKTsKKwkKKwlyZXR1cm4gMDsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjZGguaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjZGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI1OGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjZGgvZWNkaC5oCkBAIC0wLDAgKzEsMTIzIEBACisvKiBjcnlwdG8vZWNkaC9lY2RoLmggKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogVGhlIEVsbGlwdGljIEN1cnZlIFB1YmxpYy1LZXkgQ3J5cHRvIExpYnJhcnkgKEVDQyBDb2RlKSBpbmNsdWRlZAorICogaGVyZWluIGlzIGRldmVsb3BlZCBieSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgaXMgY29udHJpYnV0ZWQKKyAqIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIEVDQyBDb2RlIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGJlbG93LgorICoKKyAqIFRoZSBFQ0RIIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBEb3VnbGFzIFN0ZWJpbGEgb2YKKyAqIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisjaWZuZGVmIEhFQURFUl9FQ0RIX0gKKyNkZWZpbmUgSEVBREVSX0VDREhfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19FQ0RICisjZXJyb3IgRUNESCBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworY29uc3QgRUNESF9NRVRIT0QgKkVDREhfT3BlblNTTCh2b2lkKTsKKwordm9pZAkgIEVDREhfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IEVDREhfTUVUSE9EICopOworY29uc3QgRUNESF9NRVRIT0QgKkVDREhfZ2V0X2RlZmF1bHRfbWV0aG9kKHZvaWQpOworaW50IAkgIEVDREhfc2V0X21ldGhvZChFQ19LRVkgKiwgY29uc3QgRUNESF9NRVRIT0QgKik7CisKK2ludCBFQ0RIX2NvbXB1dGVfa2V5KHZvaWQgKm91dCwgc2l6ZV90IG91dGxlbiwgY29uc3QgRUNfUE9JTlQgKnB1Yl9rZXksIEVDX0tFWSAqZWNkaCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKigqS0RGKShjb25zdCB2b2lkICppbiwgc2l6ZV90IGlubGVuLCB2b2lkICpvdXQsIHNpemVfdCAqb3V0bGVuKSk7CisKK2ludCAJICBFQ0RIX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3IAorCQkqbmV3X2Z1bmMsIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludCAJICBFQ0RIX3NldF9leF9kYXRhKEVDX0tFWSAqZCwgaW50IGlkeCwgdm9pZCAqYXJnKTsKK3ZvaWQgCSAgKkVDREhfZ2V0X2V4X2RhdGEoRUNfS0VZICpkLCBpbnQgaWR4KTsKKworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0VDREhfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBFQ0RIIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIEVDREhfRl9FQ0RIX0NPTVBVVEVfS0VZCQkJCSAxMDAKKyNkZWZpbmUgRUNESF9GX0VDREhfREFUQV9ORVdfTUVUSE9ECQkJIDEwMQorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIEVDREhfUl9LREZfRkFJTEVECQkJCSAxMDIKKyNkZWZpbmUgRUNESF9SX05PX1BSSVZBVEVfVkFMVUUJCQkJIDEwMAorI2RlZmluZSBFQ0RIX1JfUE9JTlRfQVJJVEhNRVRJQ19GQUlMVVJFCQkJIDEwMQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjZGgvZWNkaHRlc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjZGh0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyYTg3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjZGh0ZXN0LmMKQEAgLTAsMCArMSwzNjggQEAKKy8qIGNyeXB0by9lY2RoL2VjZGh0ZXN0LmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogVGhlIEVsbGlwdGljIEN1cnZlIFB1YmxpYy1LZXkgQ3J5cHRvIExpYnJhcnkgKEVDQyBDb2RlKSBpbmNsdWRlZAorICogaGVyZWluIGlzIGRldmVsb3BlZCBieSBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgaXMgY29udHJpYnV0ZWQKKyAqIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIEVDQyBDb2RlIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGJlbG93LgorICoKKyAqIFRoZSBFQ0RIIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBEb3VnbGFzIFN0ZWJpbGEgb2YKKyAqIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiLi4vZV9vcy5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgkvKiBmb3IgT1BFTlNTTF9OT19FQ0RIICovCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX0VDREgKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcHJpbnRmKCJObyBFQ0RIIHN1cHBvcnRcbiIpOworICAgIHJldHVybigwKTsKK30KKyNlbHNlCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWNkaC5oPgorCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMTYKKyNkZWZpbmUgTVNfQ0FMTEJBQ0sJX2ZhciBfbG9hZGRzCisjZWxzZQorI2RlZmluZSBNU19DQUxMQkFDSworI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgdm9pZCBNU19DQUxMQkFDSyBjYihpbnQgcCwgaW50IG4sIHZvaWQgKmFyZyk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgcm5kX3NlZWRbXSA9ICJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHkiOworCisKK3N0YXRpYyBjb25zdCBpbnQgS0RGMV9TSEExX2xlbiA9IDIwOworc3RhdGljIHZvaWQgKktERjFfU0hBMShjb25zdCB2b2lkICppbiwgc2l6ZV90IGlubGVuLCB2b2lkICpvdXQsIHNpemVfdCAqb3V0bGVuKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKwlpZiAoKm91dGxlbiA8IFNIQV9ESUdFU1RfTEVOR1RIKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlCisJCSpvdXRsZW4gPSBTSEFfRElHRVNUX0xFTkdUSDsKKwlyZXR1cm4gU0hBMShpbiwgaW5sZW4sIG91dCk7CisjZWxzZQorCXJldHVybiBOVUxMOworI2VuZGlmCisJfQorCisKK3N0YXRpYyBpbnQgdGVzdF9lY2RoX2N1cnZlKGludCBuaWQsIGNvbnN0IGNoYXIgKnRleHQsIEJOX0NUWCAqY3R4LCBCSU8gKm91dCkKKwl7CisJRUNfS0VZICphPU5VTEw7CisJRUNfS0VZICpiPU5VTEw7CisJQklHTlVNICp4X2E9TlVMTCwgKnlfYT1OVUxMLAorCSAgICAgICAqeF9iPU5VTEwsICp5X2I9TlVMTDsKKwljaGFyIGJ1ZlsxMl07CisJdW5zaWduZWQgY2hhciAqYWJ1Zj1OVUxMLCpiYnVmPU5VTEw7CisJaW50IGksYWxlbixibGVuLGFvdXQsYm91dCxyZXQ9MDsKKwljb25zdCBFQ19HUk9VUCAqZ3JvdXA7CisKKwlhID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKG5pZCk7CisJYiA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworCWlmIChhID09IE5VTEwgfHwgYiA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCWdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoYSk7CisKKwlpZiAoKHhfYT1CTl9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKCh5X2E9Qk5fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCWlmICgoeF9iPUJOX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoKHlfYj1CTl9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisKKwlCSU9fcHV0cyhvdXQsIlRlc3Rpbmcga2V5IGdlbmVyYXRpb24gd2l0aCAiKTsKKwlCSU9fcHV0cyhvdXQsdGV4dCk7CisjaWZkZWYgTk9JU1kKKwlCSU9fcHV0cyhvdXQsIlxuIik7CisjZWxzZQorCSh2b2lkKUJJT19mbHVzaChvdXQpOworI2VuZGlmCisKKwlpZiAoIUVDX0tFWV9nZW5lcmF0ZV9rZXkoYSkpIGdvdG8gZXJyOworCQorCWlmIChFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUoRUNfR1JPVVBfbWV0aG9kX29mKGdyb3VwKSkgPT0gTklEX1g5XzYyX3ByaW1lX2ZpZWxkKSAKKwkJeworCQlpZiAoIUVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwKGdyb3VwLAorCQkJRUNfS0VZX2dldDBfcHVibGljX2tleShhKSwgeF9hLCB5X2EsIGN0eCkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLAorCQkJRUNfS0VZX2dldDBfcHVibGljX2tleShhKSwgeF9hLCB5X2EsIGN0eCkpIGdvdG8gZXJyOworCQl9CisjaWZkZWYgTk9JU1kKKwlCSU9fcHV0cyhvdXQsIiAgcHJpIDE9Iik7CisJQk5fcHJpbnQob3V0LGEtPnByaXZfa2V5KTsKKwlCSU9fcHV0cyhvdXQsIlxuICBwdWIgMT0iKTsKKwlCTl9wcmludChvdXQseF9hKTsKKwlCSU9fcHV0cyhvdXQsIiwiKTsKKwlCTl9wcmludChvdXQseV9hKTsKKwlCSU9fcHV0cyhvdXQsIlxuIik7CisjZWxzZQorCUJJT19wcmludGYob3V0LCIgLiIpOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworI2VuZGlmCisKKwlpZiAoIUVDX0tFWV9nZW5lcmF0ZV9rZXkoYikpIGdvdG8gZXJyOworCisJaWYgKEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZShFQ19HUk9VUF9tZXRob2Rfb2YoZ3JvdXApKSA9PSBOSURfWDlfNjJfcHJpbWVfZmllbGQpIAorCQl7CisJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIAorCQkJRUNfS0VZX2dldDBfcHVibGljX2tleShiKSwgeF9iLCB5X2IsIGN0eCkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLCAKKwkJCUVDX0tFWV9nZXQwX3B1YmxpY19rZXkoYiksIHhfYiwgeV9iLCBjdHgpKSBnb3RvIGVycjsKKwkJfQorCisjaWZkZWYgTk9JU1kKKwlCSU9fcHV0cyhvdXQsIiAgcHJpIDI9Iik7CisJQk5fcHJpbnQob3V0LGItPnByaXZfa2V5KTsKKwlCSU9fcHV0cyhvdXQsIlxuICBwdWIgMj0iKTsKKwlCTl9wcmludChvdXQseF9iKTsKKwlCSU9fcHV0cyhvdXQsIiwiKTsKKwlCTl9wcmludChvdXQseV9iKTsKKwlCSU9fcHV0cyhvdXQsIlxuIik7CisjZWxzZQorCUJJT19wcmludGYob3V0LCIuIik7CisJKHZvaWQpQklPX2ZsdXNoKG91dCk7CisjZW5kaWYKKworCWFsZW49S0RGMV9TSEExX2xlbjsKKwlhYnVmPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoYWxlbik7CisJYW91dD1FQ0RIX2NvbXB1dGVfa2V5KGFidWYsYWxlbixFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGIpLGEsS0RGMV9TSEExKTsKKworI2lmZGVmIE5PSVNZCisJQklPX3B1dHMob3V0LCIgIGtleTEgPSIpOworCWZvciAoaT0wOyBpPGFvdXQ7IGkrKykKKwkJeworCQlzcHJpbnRmKGJ1ZiwiJTAyWCIsYWJ1ZltpXSk7CisJCUJJT19wdXRzKG91dCxidWYpOworCQl9CisJQklPX3B1dHMob3V0LCJcbiIpOworI2Vsc2UKKwlCSU9fcHJpbnRmKG91dCwiLiIpOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworI2VuZGlmCisKKwlibGVuPUtERjFfU0hBMV9sZW47CisJYmJ1Zj0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGJsZW4pOworCWJvdXQ9RUNESF9jb21wdXRlX2tleShiYnVmLGJsZW4sRUNfS0VZX2dldDBfcHVibGljX2tleShhKSxiLEtERjFfU0hBMSk7CisKKyNpZmRlZiBOT0lTWQorCUJJT19wdXRzKG91dCwiICBrZXkyID0iKTsKKwlmb3IgKGk9MDsgaTxib3V0OyBpKyspCisJCXsKKwkJc3ByaW50ZihidWYsIiUwMlgiLGJidWZbaV0pOworCQlCSU9fcHV0cyhvdXQsYnVmKTsKKwkJfQorCUJJT19wdXRzKG91dCwiXG4iKTsKKyNlbHNlCisJQklPX3ByaW50ZihvdXQsIi4iKTsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKyNlbmRpZgorCisJaWYgKChhb3V0IDwgNCkgfHwgKGJvdXQgIT0gYW91dCkgfHwgKG1lbWNtcChhYnVmLGJidWYsYW91dCkgIT0gMCkpCisJCXsKKyNpZm5kZWYgTk9JU1kKKwkJQklPX3ByaW50ZihvdXQsICIgZmFpbGVkXG5cbiIpOworCQlCSU9fcHJpbnRmKG91dCwgImtleSBhOlxuIik7CisJCUJJT19wcmludGYob3V0LCAicHJpdmF0ZSBrZXk6ICIpOworCQlCTl9wcmludChvdXQsIEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGEpKTsKKwkJQklPX3ByaW50ZihvdXQsICJcbiIpOworCQlCSU9fcHJpbnRmKG91dCwgInB1YmxpYyBrZXkgKHgseSk6ICIpOworCQlCTl9wcmludChvdXQsIHhfYSk7CisJCUJJT19wcmludGYob3V0LCAiLCIpOworCQlCTl9wcmludChvdXQsIHlfYSk7CisJCUJJT19wcmludGYob3V0LCAiXG5rZXkgYjpcbiIpOworCQlCSU9fcHJpbnRmKG91dCwgInByaXZhdGUga2V5OiAiKTsKKwkJQk5fcHJpbnQob3V0LCBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShiKSk7CisJCUJJT19wcmludGYob3V0LCAiXG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJwdWJsaWMga2V5ICh4LHkpOiAiKTsKKwkJQk5fcHJpbnQob3V0LCB4X2IpOworCQlCSU9fcHJpbnRmKG91dCwgIiwiKTsKKwkJQk5fcHJpbnQob3V0LCB5X2IpOworCQlCSU9fcHJpbnRmKG91dCwgIlxuIik7CisJCUJJT19wcmludGYob3V0LCAiZ2VuZXJhdGVkIGtleSBhOiAiKTsKKwkJZm9yIChpPTA7IGk8Ym91dDsgaSsrKQorCQkJeworCQkJc3ByaW50ZihidWYsICIlMDJYIiwgYmJ1ZltpXSk7CisJCQlCSU9fcHV0cyhvdXQsIGJ1Zik7CisJCQl9CisJCUJJT19wcmludGYob3V0LCAiXG4iKTsKKwkJQklPX3ByaW50ZihvdXQsICJnZW5lcmF0ZWQga2V5IGI6ICIpOworCQlmb3IgKGk9MDsgaTxhb3V0OyBpKyspCisJCQl7CisJCQlzcHJpbnRmKGJ1ZiwgIiUwMlgiLCBhYnVmW2ldKTsKKwkJCUJJT19wdXRzKG91dCxidWYpOworCQkJfQorCQlCSU9fcHJpbnRmKG91dCwgIlxuIik7CisjZW5kaWYKKwkJZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVDREggcm91dGluZXNcbiIpOworCQlyZXQ9MDsKKwkJfQorCWVsc2UKKwkJeworI2lmbmRlZiBOT0lTWQorCQlCSU9fcHJpbnRmKG91dCwgIiBva1xuIik7CisjZW5kaWYKKwkJcmV0PTE7CisJCX0KK2VycjoKKwlFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisKKwlpZiAoYWJ1ZiAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYWJ1Zik7CisJaWYgKGJidWYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGJidWYpOworCWlmICh4X2EpIEJOX2ZyZWUoeF9hKTsKKwlpZiAoeV9hKSBCTl9mcmVlKHlfYSk7CisJaWYgKHhfYikgQk5fZnJlZSh4X2IpOworCWlmICh5X2IpIEJOX2ZyZWUoeV9iKTsKKwlpZiAoYikgRUNfS0VZX2ZyZWUoYik7CisJaWYgKGEpIEVDX0tFWV9mcmVlKGEpOworCXJldHVybihyZXQpOworCX0KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKwl7CisJQk5fQ1RYICpjdHg9TlVMTDsKKwlpbnQgcmV0PTE7CisJQklPICpvdXQ7CisKKwlDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKTsKKwlDUllQVE9fZGJnX3NldF9vcHRpb25zKFZfQ1JZUFRPX01ERUJVR19BTEwpOworCUNSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09OKTsKKworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjMyCisJQ1JZUFRPX21hbGxvY19pbml0KCk7CisjZW5kaWYKKworCVJBTkRfc2VlZChybmRfc2VlZCwgc2l6ZW9mIHJuZF9zZWVkKTsKKworCW91dD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKG91dCA9PSBOVUxMKSBFWElUKDEpOworCUJJT19zZXRfZnAob3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisKKwlpZiAoKGN0eD1CTl9DVFhfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJLyogTklTVCBQUklNRSBDVVJWRVMgVEVTVFMgKi8KKwlpZiAoIXRlc3RfZWNkaF9jdXJ2ZShOSURfWDlfNjJfcHJpbWUxOTJ2MSwgIk5JU1QgUHJpbWUtQ3VydmUgUC0xOTIiLCBjdHgsIG91dCkpIGdvdG8gZXJyOworCWlmICghdGVzdF9lY2RoX2N1cnZlKE5JRF9zZWNwMjI0cjEsICJOSVNUIFByaW1lLUN1cnZlIFAtMjI0IiwgY3R4LCBvdXQpKSBnb3RvIGVycjsKKwlpZiAoIXRlc3RfZWNkaF9jdXJ2ZShOSURfWDlfNjJfcHJpbWUyNTZ2MSwgIk5JU1QgUHJpbWUtQ3VydmUgUC0yNTYiLCBjdHgsIG91dCkpIGdvdG8gZXJyOworCWlmICghdGVzdF9lY2RoX2N1cnZlKE5JRF9zZWNwMzg0cjEsICJOSVNUIFByaW1lLUN1cnZlIFAtMzg0IiwgY3R4LCBvdXQpKSBnb3RvIGVycjsKKwlpZiAoIXRlc3RfZWNkaF9jdXJ2ZShOSURfc2VjcDUyMXIxLCAiTklTVCBQcmltZS1DdXJ2ZSBQLTUyMSIsIGN0eCwgb3V0KSkgZ290byBlcnI7CisJLyogTklTVCBCSU5BUlkgQ1VSVkVTIFRFU1RTICovCisJaWYgKCF0ZXN0X2VjZGhfY3VydmUoTklEX3NlY3QxNjNrMSwgIk5JU1QgQmluYXJ5LUN1cnZlIEstMTYzIiwgY3R4LCBvdXQpKSBnb3RvIGVycjsKKwlpZiAoIXRlc3RfZWNkaF9jdXJ2ZShOSURfc2VjdDE2M3IyLCAiTklTVCBCaW5hcnktQ3VydmUgQi0xNjMiLCBjdHgsIG91dCkpIGdvdG8gZXJyOworCWlmICghdGVzdF9lY2RoX2N1cnZlKE5JRF9zZWN0MjMzazEsICJOSVNUIEJpbmFyeS1DdXJ2ZSBLLTIzMyIsIGN0eCwgb3V0KSkgZ290byBlcnI7CisJaWYgKCF0ZXN0X2VjZGhfY3VydmUoTklEX3NlY3QyMzNyMSwgIk5JU1QgQmluYXJ5LUN1cnZlIEItMjMzIiwgY3R4LCBvdXQpKSBnb3RvIGVycjsKKwlpZiAoIXRlc3RfZWNkaF9jdXJ2ZShOSURfc2VjdDI4M2sxLCAiTklTVCBCaW5hcnktQ3VydmUgSy0yODMiLCBjdHgsIG91dCkpIGdvdG8gZXJyOworCWlmICghdGVzdF9lY2RoX2N1cnZlKE5JRF9zZWN0MjgzcjEsICJOSVNUIEJpbmFyeS1DdXJ2ZSBCLTI4MyIsIGN0eCwgb3V0KSkgZ290byBlcnI7CisJaWYgKCF0ZXN0X2VjZGhfY3VydmUoTklEX3NlY3Q0MDlrMSwgIk5JU1QgQmluYXJ5LUN1cnZlIEstNDA5IiwgY3R4LCBvdXQpKSBnb3RvIGVycjsKKwlpZiAoIXRlc3RfZWNkaF9jdXJ2ZShOSURfc2VjdDQwOXIxLCAiTklTVCBCaW5hcnktQ3VydmUgQi00MDkiLCBjdHgsIG91dCkpIGdvdG8gZXJyOworCWlmICghdGVzdF9lY2RoX2N1cnZlKE5JRF9zZWN0NTcxazEsICJOSVNUIEJpbmFyeS1DdXJ2ZSBLLTU3MSIsIGN0eCwgb3V0KSkgZ290byBlcnI7CisJaWYgKCF0ZXN0X2VjZGhfY3VydmUoTklEX3NlY3Q1NzFyMSwgIk5JU1QgQmluYXJ5LUN1cnZlIEItNTcxIiwgY3R4LCBvdXQpKSBnb3RvIGVycjsKKworCXJldCA9IDA7CisKK2VycjoKKwlFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisJaWYgKGN0eCkgQk5fQ1RYX2ZyZWUoY3R4KTsKKwlCSU9fZnJlZShvdXQpOworCUNSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisJRVJSX3JlbW92ZV90aHJlYWRfc3RhdGUoTlVMTCk7CisJQ1JZUFRPX21lbV9sZWFrc19mcChzdGRlcnIpOworCUVYSVQocmV0KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBNU19DQUxMQkFDSyBjYihpbnQgcCwgaW50IG4sIHZvaWQgKmFyZykKKwl7CisJY2hhciBjPScqJzsKKworCWlmIChwID09IDApIGM9Jy4nOworCWlmIChwID09IDEpIGM9JysnOworCWlmIChwID09IDIpIGM9JyonOworCWlmIChwID09IDMpIGM9J1xuJzsKKwlCSU9fd3JpdGUoKEJJTyAqKWFyZywmYywxKTsKKwkodm9pZClCSU9fZmx1c2goKEJJTyAqKWFyZyk7CisjaWZkZWYgTElOVAorCXA9bjsKKyNlbmRpZgorCX0KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWNkaC9lY2hfZXJyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkaC9lY2hfZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0YjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjaF9lcnIuYwpAQCAtMCwwICsxLDk4IEBACisvKiBjcnlwdG8vZWNkaC9lY2hfZXJyLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBOT1RFOiB0aGlzIGZpbGUgd2FzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBta2Vyci5wbCBzY3JpcHQ6IGFueSBjaGFuZ2VzCisgKiBtYWRlIHRvIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IG5leHQgdXBkYXRlcyB0aGlzIGZpbGUsCisgKiBvbmx5IHJlYXNvbiBzdHJpbmdzIHdpbGwgYmUgcHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9FQ0RILGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfRUNESCwwLHJlYXNvbikKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBFQ0RIX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoRUNESF9GX0VDREhfQ09NUFVURV9LRVkpLAkiRUNESF9jb21wdXRlX2tleSJ9LAore0VSUl9GVU5DKEVDREhfRl9FQ0RIX0RBVEFfTkVXX01FVEhPRCksCSJFQ0RIX0RBVEFfbmV3X21ldGhvZCJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEVDREhfc3RyX3JlYXNvbnNbXT0KKwl7Cit7RVJSX1JFQVNPTihFQ0RIX1JfS0RGX0ZBSUxFRCkgICAgICAgICAgICwiS0RGIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oRUNESF9SX05PX1BSSVZBVEVfVkFMVUUpICAgICAsIm5vIHByaXZhdGUgdmFsdWUifSwKK3tFUlJfUkVBU09OKEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUpLCJwb2ludCBhcml0aG1ldGljIGZhaWx1cmUifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfRUNESF9zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhFQ0RIX3N0cl9mdW5jdHNbMF0uZXJyb3IpID09IE5VTEwpCisJCXsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLEVDREhfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxFQ0RIX3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjZGgvZWNoX2tleS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjZGgvZWNoX2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NGRhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkaC9lY2hfa2V5LmMKQEAgLTAsMCArMSw4MyBAQAorLyogY3J5cHRvL2VjZGgvZWNkaF9rZXkuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBUaGUgRWxsaXB0aWMgQ3VydmUgUHVibGljLUtleSBDcnlwdG8gTGlicmFyeSAoRUNDIENvZGUpIGluY2x1ZGVkCisgKiBoZXJlaW4gaXMgZGV2ZWxvcGVkIGJ5IFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBpcyBjb250cmlidXRlZAorICogdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgRUNDIENvZGUgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYmVsb3cuCisgKgorICogVGhlIEVDREggc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IERvdWdsYXMgU3RlYmlsYSBvZgorICogU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImVjaF9sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorCitpbnQgRUNESF9jb21wdXRlX2tleSh2b2lkICpvdXQsIHNpemVfdCBvdXRsZW4sIGNvbnN0IEVDX1BPSU5UICpwdWJfa2V5LAorCUVDX0tFWSAqZWNrZXksCisJdm9pZCAqKCpLREYpKGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4sIHZvaWQgKm91dCwgc2l6ZV90ICpvdXRsZW4pKQoreworCUVDREhfREFUQSAqZWNkaCA9IGVjZGhfY2hlY2soZWNrZXkpOworCWlmIChlY2RoID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiBlY2RoLT5tZXRoLT5jb21wdXRlX2tleShvdXQsIG91dGxlbiwgcHViX2tleSwgZWNrZXksIEtERik7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWNkaC9lY2hfbGliLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkaC9lY2hfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5YjFkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjaF9saWIuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogY3J5cHRvL2VjZGgvZWNoX2xpYi5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFRoZSBFbGxpcHRpYyBDdXJ2ZSBQdWJsaWMtS2V5IENyeXB0byBMaWJyYXJ5IChFQ0MgQ29kZSkgaW5jbHVkZWQKKyAqIGhlcmVpbiBpcyBkZXZlbG9wZWQgYnkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGlzIGNvbnRyaWJ1dGVkCisgKiB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBFQ0MgQ29kZSBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBiZWxvdy4KKyAqCisgKiBUaGUgRUNESCBzb2Z0d2FyZSBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRG91Z2xhcyBTdGViaWxhIG9mCisgKiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZWNoX2xvY2wuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworY29uc3QgY2hhciBFQ0RIX3ZlcnNpb25bXT0iRUNESCIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCitzdGF0aWMgY29uc3QgRUNESF9NRVRIT0QgKmRlZmF1bHRfRUNESF9tZXRob2QgPSBOVUxMOworCitzdGF0aWMgdm9pZCAqZWNkaF9kYXRhX25ldyh2b2lkKTsKK3N0YXRpYyB2b2lkICplY2RoX2RhdGFfZHVwKHZvaWQgKik7CitzdGF0aWMgdm9pZCAgZWNkaF9kYXRhX2ZyZWUodm9pZCAqKTsKKwordm9pZCBFQ0RIX3NldF9kZWZhdWx0X21ldGhvZChjb25zdCBFQ0RIX01FVEhPRCAqbWV0aCkKKwl7CisJZGVmYXVsdF9FQ0RIX21ldGhvZCA9IG1ldGg7CisJfQorCitjb25zdCBFQ0RIX01FVEhPRCAqRUNESF9nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCkKKwl7CisJaWYoIWRlZmF1bHRfRUNESF9tZXRob2QpIAorCQlkZWZhdWx0X0VDREhfbWV0aG9kID0gRUNESF9PcGVuU1NMKCk7CisJcmV0dXJuIGRlZmF1bHRfRUNESF9tZXRob2Q7CisJfQorCitpbnQgRUNESF9zZXRfbWV0aG9kKEVDX0tFWSAqZWNrZXksIGNvbnN0IEVDREhfTUVUSE9EICptZXRoKQorCXsKKwljb25zdCBFQ0RIX01FVEhPRCAqbXRtcDsKKwlFQ0RIX0RBVEEgKmVjZGg7CisKKwllY2RoID0gZWNkaF9jaGVjayhlY2tleSk7CisKKwlpZiAoZWNkaCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworICAgICAgICBtdG1wID0gZWNkaC0+bWV0aDsKKyNpZiAwCisgICAgICAgIGlmIChtdG1wLT5maW5pc2gpCisJCW10bXAtPmZpbmlzaChlY2tleSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoZWNkaC0+ZW5naW5lKQorCQl7CisJCUVOR0lORV9maW5pc2goZWNkaC0+ZW5naW5lKTsKKwkJZWNkaC0+ZW5naW5lID0gTlVMTDsKKwkJfQorI2VuZGlmCisgICAgICAgIGVjZGgtPm1ldGggPSBtZXRoOworI2lmIDAKKyAgICAgICAgaWYgKG1ldGgtPmluaXQpIAorCQltZXRoLT5pbml0KGVja2V5KTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBFQ0RIX0RBVEEgKkVDREhfREFUQV9uZXdfbWV0aG9kKEVOR0lORSAqZW5naW5lKQorCXsKKwlFQ0RIX0RBVEEgKnJldDsKKworCXJldD0oRUNESF9EQVRBICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVDREhfREFUQSkpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlFQ0RIZXJyKEVDREhfRl9FQ0RIX0RBVEFfTkVXX01FVEhPRCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKworCXJldC0+aW5pdCA9IE5VTEw7CisKKwlyZXQtPm1ldGggPSBFQ0RIX2dldF9kZWZhdWx0X21ldGhvZCgpOworCXJldC0+ZW5naW5lID0gZW5naW5lOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmICghcmV0LT5lbmdpbmUpCisJCXJldC0+ZW5naW5lID0gRU5HSU5FX2dldF9kZWZhdWx0X0VDREgoKTsKKwlpZiAocmV0LT5lbmdpbmUpCisJCXsKKwkJcmV0LT5tZXRoID0gRU5HSU5FX2dldF9FQ0RIKHJldC0+ZW5naW5lKTsKKwkJaWYgKCFyZXQtPm1ldGgpCisJCQl7CisJCQlFQ0RIZXJyKEVDREhfRl9FQ0RIX0RBVEFfTkVXX01FVEhPRCwgRVJSX1JfRU5HSU5FX0xJQik7CisJCQlFTkdJTkVfZmluaXNoKHJldC0+ZW5naW5lKTsKKwkJCU9QRU5TU0xfZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKyNlbmRpZgorCisJcmV0LT5mbGFncyA9IHJldC0+bWV0aC0+ZmxhZ3M7CisJQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9FQ0RILCByZXQsICZyZXQtPmV4X2RhdGEpOworI2lmIDAKKwlpZiAoKHJldC0+bWV0aC0+aW5pdCAhPSBOVUxMKSAmJiAhcmV0LT5tZXRoLT5pbml0KHJldCkpCisJCXsKKwkJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfRUNESCwgcmV0LCAmcmV0LT5leF9kYXRhKTsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldD1OVUxMOworCQl9CisjZW5kaWYJCisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgdm9pZCAqZWNkaF9kYXRhX25ldyh2b2lkKQorCXsKKwlyZXR1cm4gKHZvaWQgKilFQ0RIX0RBVEFfbmV3X21ldGhvZChOVUxMKTsKKwl9CisKK3N0YXRpYyB2b2lkICplY2RoX2RhdGFfZHVwKHZvaWQgKmRhdGEpCit7CisJRUNESF9EQVRBICpyID0gKEVDREhfREFUQSAqKWRhdGE7CisKKwkvKiBYWFg6IGR1bW15IG9wZXJhdGlvbiAqLworCWlmIChyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICh2b2lkICopZWNkaF9kYXRhX25ldygpOworfQorCit2b2lkIGVjZGhfZGF0YV9mcmVlKHZvaWQgKmRhdGEpCisJeworCUVDREhfREFUQSAqciA9IChFQ0RIX0RBVEEgKilkYXRhOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYgKHItPmVuZ2luZSkKKwkJRU5HSU5FX2ZpbmlzaChyLT5lbmdpbmUpOworI2VuZGlmCisKKwlDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9FQ0RILCByLCAmci0+ZXhfZGF0YSk7CisKKwlPUEVOU1NMX2NsZWFuc2UoKHZvaWQgKilyLCBzaXplb2YoRUNESF9EQVRBKSk7CisKKwlPUEVOU1NMX2ZyZWUocik7CisJfQorCitFQ0RIX0RBVEEgKmVjZGhfY2hlY2soRUNfS0VZICprZXkpCisJeworCUVDREhfREFUQSAqZWNkaF9kYXRhOworIAorCXZvaWQgKmRhdGEgPSBFQ19LRVlfZ2V0X2tleV9tZXRob2RfZGF0YShrZXksIGVjZGhfZGF0YV9kdXAsCisJCQkJCWVjZGhfZGF0YV9mcmVlLCBlY2RoX2RhdGFfZnJlZSk7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwl7CisJCWVjZGhfZGF0YSA9IChFQ0RIX0RBVEEgKillY2RoX2RhdGFfbmV3KCk7CisJCWlmIChlY2RoX2RhdGEgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlFQ19LRVlfaW5zZXJ0X2tleV9tZXRob2RfZGF0YShrZXksICh2b2lkICopZWNkaF9kYXRhLAorCQkJZWNkaF9kYXRhX2R1cCwgZWNkaF9kYXRhX2ZyZWUsIGVjZGhfZGF0YV9mcmVlKTsKKwl9CisJZWxzZQorCQllY2RoX2RhdGEgPSAoRUNESF9EQVRBICopZGF0YTsKKwkKKworCXJldHVybiBlY2RoX2RhdGE7CisJfQorCitpbnQgRUNESF9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKwl7CisJcmV0dXJuIENSWVBUT19nZXRfZXhfbmV3X2luZGV4KENSWVBUT19FWF9JTkRFWF9FQ0RILCBhcmdsLCBhcmdwLAorCQkJCW5ld19mdW5jLCBkdXBfZnVuYywgZnJlZV9mdW5jKTsKKwl9CisKK2ludCBFQ0RIX3NldF9leF9kYXRhKEVDX0tFWSAqZCwgaW50IGlkeCwgdm9pZCAqYXJnKQorCXsKKwlFQ0RIX0RBVEEgKmVjZGg7CisJZWNkaCA9IGVjZGhfY2hlY2soZCk7CisJaWYgKGVjZGggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuKENSWVBUT19zZXRfZXhfZGF0YSgmZWNkaC0+ZXhfZGF0YSxpZHgsYXJnKSk7CisJfQorCit2b2lkICpFQ0RIX2dldF9leF9kYXRhKEVDX0tFWSAqZCwgaW50IGlkeCkKKwl7CisJRUNESF9EQVRBICplY2RoOworCWVjZGggPSBlY2RoX2NoZWNrKGQpOworCWlmIChlY2RoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybihDUllQVE9fZ2V0X2V4X2RhdGEoJmVjZGgtPmV4X2RhdGEsaWR4KSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjZGgvZWNoX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjaF9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ODUyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjaF9sb2NsLmgKQEAgLTAsMCArMSw5NCBAQAorLyogY3J5cHRvL2VjZGgvZWNoX2xvY2wuaCAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX0VDSF9MT0NMX0gKKyNkZWZpbmUgSEVBREVSX0VDSF9MT0NMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZWNkaC5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgZWNkaF9tZXRob2QgCisJeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqY29tcHV0ZV9rZXkpKHZvaWQgKmtleSwgc2l6ZV90IG91dGxlbiwgY29uc3QgRUNfUE9JTlQgKnB1Yl9rZXksIEVDX0tFWSAqZWNkaCwKKwkgICAgICAgICAgICAgICAgICAgdm9pZCAqKCpLREYpKGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4sIHZvaWQgKm91dCwgc2l6ZV90ICpvdXRsZW4pKTsKKyNpZiAwCisJaW50ICgqaW5pdCkoRUNfS0VZICplY2tleSk7CisJaW50ICgqZmluaXNoKShFQ19LRVkgKmVja2V5KTsKKyNlbmRpZgorCWludCBmbGFnczsKKwljaGFyICphcHBfZGF0YTsKKwl9OworCit0eXBlZGVmIHN0cnVjdCBlY2RoX2RhdGFfc3QgeworCS8qIEVDX0tFWV9NRVRIX0RBVEEgcGFydCAqLworCWludCAoKmluaXQpKEVDX0tFWSAqKTsKKwkvKiBtZXRob2Qgc3BlY2lmaWMgcGFydCAqLworCUVOR0lORQkqZW5naW5lOworCWludAlmbGFnczsKKwljb25zdCBFQ0RIX01FVEhPRCAqbWV0aDsKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworfSBFQ0RIX0RBVEE7CisKK0VDREhfREFUQSAqZWNkaF9jaGVjayhFQ19LRVkgKik7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogSEVBREVSX0VDSF9MT0NMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RoL2VjaF9vc3NsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkaC9lY2hfb3NzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDBmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkaC9lY2hfb3NzbC5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiBjcnlwdG8vZWNkaC9lY2hfb3NzbC5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFRoZSBFbGxpcHRpYyBDdXJ2ZSBQdWJsaWMtS2V5IENyeXB0byBMaWJyYXJ5IChFQ0MgQ29kZSkgaW5jbHVkZWQKKyAqIGhlcmVpbiBpcyBkZXZlbG9wZWQgYnkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGlzIGNvbnRyaWJ1dGVkCisgKiB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBFQ0MgQ29kZSBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBiZWxvdy4KKyAqCisgKiBUaGUgRUNESCBzb2Z0d2FyZSBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRG91Z2xhcyBTdGViaWxhIG9mCisgKiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpbmNsdWRlICJlY2hfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29ial9tYWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKK3N0YXRpYyBpbnQgZWNkaF9jb21wdXRlX2tleSh2b2lkICpvdXQsIHNpemVfdCBsZW4sIGNvbnN0IEVDX1BPSU5UICpwdWJfa2V5LAorCUVDX0tFWSAqZWNkaCwgCisJdm9pZCAqKCpLREYpKGNvbnN0IHZvaWQgKmluLCBzaXplX3QgaW5sZW4sIHZvaWQgKm91dCwgc2l6ZV90ICpvdXRsZW4pKTsKKworc3RhdGljIEVDREhfTUVUSE9EIG9wZW5zc2xfZWNkaF9tZXRoID0geworCSJPcGVuU1NMIEVDREggbWV0aG9kIiwKKwllY2RoX2NvbXB1dGVfa2V5LAorI2lmIDAKKwlOVUxMLCAvKiBpbml0ICAgICAqLworCU5VTEwsIC8qIGZpbmlzaCAgICovCisjZW5kaWYKKwkwLCAgICAvKiBmbGFncyAgICAqLworCU5VTEwgIC8qIGFwcF9kYXRhICovCit9OworCitjb25zdCBFQ0RIX01FVEhPRCAqRUNESF9PcGVuU1NMKHZvaWQpCisJeworCXJldHVybiAmb3BlbnNzbF9lY2RoX21ldGg7CisJfQorCisKKy8qIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBwcmltaXRpdmVzIGluIHRoZSBJRUVFIDEzNjMgc3RhbmRhcmQ6CisgKiAgLSBFQ0tBUy1ESDEKKyAqICAtIEVDU1ZEUC1ESAorICogRmluYWxseSBhbiBvcHRpb25hbCBLREYgaXMgYXBwbGllZC4KKyAqLworc3RhdGljIGludCBlY2RoX2NvbXB1dGVfa2V5KHZvaWQgKm91dCwgc2l6ZV90IG91dGxlbiwgY29uc3QgRUNfUE9JTlQgKnB1Yl9rZXksCisJRUNfS0VZICplY2RoLAorCXZvaWQgKigqS0RGKShjb25zdCB2b2lkICppbiwgc2l6ZV90IGlubGVuLCB2b2lkICpvdXQsIHNpemVfdCAqb3V0bGVuKSkKKwl7CisJQk5fQ1RYICpjdHg7CisJRUNfUE9JTlQgKnRtcD1OVUxMOworCUJJR05VTSAqeD1OVUxMLCAqeT1OVUxMOworCWNvbnN0IEJJR05VTSAqcHJpdl9rZXk7CisJY29uc3QgRUNfR1JPVVAqIGdyb3VwOworCWludCByZXQ9IC0xOworCXNpemVfdCBidWZsZW4sIGxlbjsKKwl1bnNpZ25lZCBjaGFyICpidWY9TlVMTDsKKworCWlmIChvdXRsZW4gPiBJTlRfTUFYKQorCQl7CisJCUVDREhlcnIoRUNESF9GX0VDREhfQ09NUFVURV9LRVksRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyAvKiBzb3J0IG9mLCBhbnl3YXkgKi8KKwkJcmV0dXJuIC0xOworCQl9CisKKwlpZiAoKGN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJeCA9IEJOX0NUWF9nZXQoY3R4KTsKKwl5ID0gQk5fQ1RYX2dldChjdHgpOworCQorCXByaXZfa2V5ID0gRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoZWNkaCk7CisJaWYgKHByaXZfa2V5ID09IE5VTEwpCisJCXsKKwkJRUNESGVycihFQ0RIX0ZfRUNESF9DT01QVVRFX0tFWSxFQ0RIX1JfTk9fUFJJVkFURV9WQUxVRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlncm91cCA9IEVDX0tFWV9nZXQwX2dyb3VwKGVjZGgpOworCWlmICgodG1wPUVDX1BPSU5UX25ldyhncm91cCkpID09IE5VTEwpCisJCXsKKwkJRUNESGVycihFQ0RIX0ZfRUNESF9DT01QVVRFX0tFWSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoIUVDX1BPSU5UX211bChncm91cCwgdG1wLCBOVUxMLCBwdWJfa2V5LCBwcml2X2tleSwgY3R4KSkgCisJCXsKKwkJRUNESGVycihFQ0RIX0ZfRUNESF9DT01QVVRFX0tFWSxFQ0RIX1JfUE9JTlRfQVJJVEhNRVRJQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwkJCisJaWYgKEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZShFQ19HUk9VUF9tZXRob2Rfb2YoZ3JvdXApKSA9PSBOSURfWDlfNjJfcHJpbWVfZmllbGQpIAorCQl7CisJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsIHRtcCwgeCwgeSwgY3R4KSkgCisJCQl7CisJCQlFQ0RIZXJyKEVDREhfRl9FQ0RIX0NPTVBVVEVfS0VZLEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0oZ3JvdXAsIHRtcCwgeCwgeSwgY3R4KSkgCisJCQl7CisJCQlFQ0RIZXJyKEVDREhfRl9FQ0RIX0NPTVBVVEVfS0VZLEVDREhfUl9QT0lOVF9BUklUSE1FVElDX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCWJ1ZmxlbiA9IChFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSArIDcpLzg7CisJbGVuID0gQk5fbnVtX2J5dGVzKHgpOworCWlmIChsZW4gPiBidWZsZW4pCisJCXsKKwkJRUNESGVycihFQ0RIX0ZfRUNESF9DT01QVVRFX0tFWSxFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKChidWYgPSBPUEVOU1NMX21hbGxvYyhidWZsZW4pKSA9PSBOVUxMKQorCQl7CisJCUVDREhlcnIoRUNESF9GX0VDREhfQ09NUFVURV9LRVksRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCQorCW1lbXNldChidWYsIDAsIGJ1ZmxlbiAtIGxlbik7CisJaWYgKGxlbiAhPSAoc2l6ZV90KUJOX2JuMmJpbih4LCBidWYgKyBidWZsZW4gLSBsZW4pKQorCQl7CisJCUVDREhlcnIoRUNESF9GX0VDREhfQ09NUFVURV9LRVksRVJSX1JfQk5fTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChLREYgIT0gMCkKKwkJeworCQlpZiAoS0RGKGJ1ZiwgYnVmbGVuLCBvdXQsICZvdXRsZW4pID09IE5VTEwpCisJCQl7CisJCQlFQ0RIZXJyKEVDREhfRl9FQ0RIX0NPTVBVVEVfS0VZLEVDREhfUl9LREZfRkFJTEVEKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlyZXQgPSBvdXRsZW47CisJCX0KKwllbHNlCisJCXsKKwkJLyogbm8gS0RGLCBqdXN0IGNvcHkgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KKwkJaWYgKG91dGxlbiA+IGJ1ZmxlbikKKwkJCW91dGxlbiA9IGJ1ZmxlbjsKKwkJbWVtY3B5KG91dCwgYnVmLCBvdXRsZW4pOworCQlyZXQgPSBvdXRsZW47CisJCX0KKwkKK2VycjoKKwlpZiAodG1wKSBFQ19QT0lOVF9mcmVlKHRtcCk7CisJaWYgKGN0eCkgQk5fQ1RYX2VuZChjdHgpOworCWlmIChjdHgpIEJOX0NUWF9mcmVlKGN0eCk7CisJaWYgKGJ1ZikgT1BFTlNTTF9mcmVlKGJ1Zik7CisJcmV0dXJuKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2VjZHNhLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkc2EvZWNkc2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjFjNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2VjZHNhLmgKQEAgLTAsMCArMSwyNTggQEAKKy8qIGNyeXB0by9lY2RzYS9lY2RzYS5oICovCisvKioKKyAqIFxmaWxlICAgY3J5cHRvL2VjZHNhL2VjZHNhLmggSW5jbHVkZSBmaWxlIGZvciB0aGUgT3BlblNTTCBFQ0RTQSBmdW5jdGlvbnMKKyAqIFxhdXRob3IgV3JpdHRlbiBieSBOaWxzIExhcnNjaCBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKyNpZm5kZWYgSEVBREVSX0VDRFNBX0gKKyNkZWZpbmUgSEVBREVSX0VDRFNBX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKworI2lmZGVmIE9QRU5TU0xfTk9fRUNEU0EKKyNlcnJvciBFQ0RTQSBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgRUNEU0FfU0lHX3N0CisJeworCUJJR05VTSAqcjsKKwlCSUdOVU0gKnM7CisJfSBFQ0RTQV9TSUc7CisKKy8qKiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemUgYSBFQ0RTQV9TSUcgc3RydWN0dXJlCisgKiAgXHJldHVybiBwb2ludGVyIHRvIGEgRUNEU0FfU0lHIHN0cnVjdHVyZSBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK0VDRFNBX1NJRyAqRUNEU0FfU0lHX25ldyh2b2lkKTsKKworLyoqIGZyZWVzIGEgRUNEU0FfU0lHIHN0cnVjdHVyZQorICogIFxwYXJhbSAgc2lnICBwb2ludGVyIHRvIHRoZSBFQ0RTQV9TSUcgc3RydWN0dXJlCisgKi8KK3ZvaWQJICBFQ0RTQV9TSUdfZnJlZShFQ0RTQV9TSUcgKnNpZyk7CisKKy8qKiBERVIgZW5jb2RlIGNvbnRlbnQgb2YgRUNEU0FfU0lHIG9iamVjdCAobm90ZTogdGhpcyBmdW5jdGlvbiBtb2RpZmllcyAqcHAKKyAqICAoKnBwICs9IGxlbmd0aCBvZiB0aGUgREVSIGVuY29kZWQgc2lnbmF0dXJlKSkuCisgKiAgXHBhcmFtICBzaWcgIHBvaW50ZXIgdG8gdGhlIEVDRFNBX1NJRyBvYmplY3QKKyAqICBccGFyYW0gIHBwICAgcG9pbnRlciB0byBhIHVuc2lnbmVkIGNoYXIgcG9pbnRlciBmb3IgdGhlIG91dHB1dCBvciBOVUxMCisgKiAgXHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBERVIgZW5jb2RlZCBFQ0RTQV9TSUcgb2JqZWN0IG9yIDAgCisgKi8KK2ludAkgIGkyZF9FQ0RTQV9TSUcoY29uc3QgRUNEU0FfU0lHICpzaWcsIHVuc2lnbmVkIGNoYXIgKipwcCk7CisKKy8qKiBEZWNvZGVzIGEgREVSIGVuY29kZWQgRUNEU0Egc2lnbmF0dXJlIChub3RlOiB0aGlzIGZ1bmN0aW9uIGNoYW5nZXMgKnBwCisgKiAgKCpwcCArPSBsZW4pKS4gCisgKiAgXHBhcmFtICBzaWcgIHBvaW50ZXIgdG8gRUNEU0FfU0lHIHBvaW50ZXIgKG1heSBiZSBOVUxMKQorICogIFxwYXJhbSAgcHAgICBtZW1vcnkgYnVmZmVyIHdpdGggdGhlIERFUiBlbmNvZGVkIHNpZ25hdHVyZQorICogIFxwYXJhbSAgbGVuICBsZW5ndGggb2YgdGhlIGJ1ZmZlcgorICogIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgZGVjb2RlZCBFQ0RTQV9TSUcgc3RydWN0dXJlIChvciBOVUxMKQorICovCitFQ0RTQV9TSUcgKmQyaV9FQ0RTQV9TSUcoRUNEU0FfU0lHICoqc2lnLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuKTsKKworLyoqIENvbXB1dGVzIHRoZSBFQ0RTQSBzaWduYXR1cmUgb2YgdGhlIGdpdmVuIGhhc2ggdmFsdWUgdXNpbmcKKyAqICB0aGUgc3VwcGxpZWQgcHJpdmF0ZSBrZXkgYW5kIHJldHVybnMgdGhlIGNyZWF0ZWQgc2lnbmF0dXJlLgorICogIFxwYXJhbSAgZGdzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGhhc2ggdmFsdWUKKyAqICBccGFyYW0gIGRnc3RfbGVuICBsZW5ndGggb2YgdGhlIGhhc2ggdmFsdWUKKyAqICBccGFyYW0gIGVja2V5ICAgICBFQ19LRVkgb2JqZWN0IGNvbnRhaW5pbmcgYSBwcml2YXRlIEVDIGtleQorICogIFxyZXR1cm4gcG9pbnRlciB0byBhIEVDRFNBX1NJRyBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitFQ0RTQV9TSUcgKkVDRFNBX2RvX3NpZ24oY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCxpbnQgZGdzdF9sZW4sRUNfS0VZICplY2tleSk7CisKKy8qKiBDb21wdXRlcyBFQ0RTQSBzaWduYXR1cmUgb2YgYSBnaXZlbiBoYXNoIHZhbHVlIHVzaW5nIHRoZSBzdXBwbGllZAorICogIHByaXZhdGUga2V5IChub3RlOiBzaWcgbXVzdCBwb2ludCB0byBFQ0RTQV9zaXplKGVja2V5KSBieXRlcyBvZiBtZW1vcnkpLgorICogIFxwYXJhbSAgZGdzdCAgICAgcG9pbnRlciB0byB0aGUgaGFzaCB2YWx1ZSB0byBzaWduCisgKiAgXHBhcmFtICBkZ3N0bGVuICBsZW5ndGggb2YgdGhlIGhhc2ggdmFsdWUKKyAqICBccGFyYW0gIGtpbnYgICAgIEJJR05VTSB3aXRoIGEgcHJlLWNvbXB1dGVkIGludmVyc2UgayAob3B0aW9uYWwpCisgKiAgXHBhcmFtICBycCAgICAgICBCSUdOVU0gd2l0aCBhIHByZS1jb21wdXRlZCBycCB2YWx1ZSAob3B0aW9hbmwpLCAKKyAqICAgICAgICAgICAgICAgICAgIHNlZSBFQ0RTQV9zaWduX3NldHVwCisgKiAgXHBhcmFtICBlY2tleSAgICBFQ19LRVkgb2JqZWN0IGNvbnRhaW5pbmcgYSBwcml2YXRlIEVDIGtleQorICogIFxyZXR1cm4gcG9pbnRlciB0byBhIEVDRFNBX1NJRyBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitFQ0RTQV9TSUcgKkVDRFNBX2RvX3NpZ25fZXgoY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwgaW50IGRnc3RsZW4sIAorCQljb25zdCBCSUdOVU0gKmtpbnYsIGNvbnN0IEJJR05VTSAqcnAsIEVDX0tFWSAqZWNrZXkpOworCisvKiogVmVyaWZpZXMgdGhhdCB0aGUgc3VwcGxpZWQgc2lnbmF0dXJlIGlzIGEgdmFsaWQgRUNEU0EKKyAqICBzaWduYXR1cmUgb2YgdGhlIHN1cHBsaWVkIGhhc2ggdmFsdWUgdXNpbmcgdGhlIHN1cHBsaWVkIHB1YmxpYyBrZXkuCisgKiAgXHBhcmFtICBkZ3N0ICAgICAgcG9pbnRlciB0byB0aGUgaGFzaCB2YWx1ZQorICogIFxwYXJhbSAgZGdzdF9sZW4gIGxlbmd0aCBvZiB0aGUgaGFzaCB2YWx1ZQorICogIFxwYXJhbSAgc2lnICAgICAgIEVDRFNBX1NJRyBzdHJ1Y3R1cmUKKyAqICBccGFyYW0gIGVja2V5ICAgICBFQ19LRVkgb2JqZWN0IGNvbnRhaW5pbmcgYSBwdWJsaWMgRUMga2V5CisgKiAgXHJldHVybiAxIGlmIHRoZSBzaWduYXR1cmUgaXMgdmFsaWQsIDAgaWYgdGhlIHNpZ25hdHVyZSBpcyBpbnZhbGlkCisgKiAgICAgICAgICBhbmQgLTEgb24gZXJyb3IKKyAqLworaW50CSAgRUNEU0FfZG9fdmVyaWZ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkZ3N0X2xlbiwKKwkJY29uc3QgRUNEU0FfU0lHICpzaWcsIEVDX0tFWSogZWNrZXkpOworCitjb25zdCBFQ0RTQV9NRVRIT0QgKkVDRFNBX09wZW5TU0wodm9pZCk7CisKKy8qKiBTZXRzIHRoZSBkZWZhdWx0IEVDRFNBIG1ldGhvZAorICogIFxwYXJhbSAgbWV0aCAgbmV3IGRlZmF1bHQgRUNEU0FfTUVUSE9ECisgKi8KK3ZvaWQJICBFQ0RTQV9zZXRfZGVmYXVsdF9tZXRob2QoY29uc3QgRUNEU0FfTUVUSE9EICptZXRoKTsKKworLyoqIFJldHVybnMgdGhlIGRlZmF1bHQgRUNEU0EgbWV0aG9kCisgKiAgXHJldHVybiBwb2ludGVyIHRvIEVDRFNBX01FVEhPRCBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgZGVmYXVsdCBtZXRob2QKKyAqLworY29uc3QgRUNEU0FfTUVUSE9EICpFQ0RTQV9nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCk7CisKKy8qKiBTZXRzIG1ldGhvZCB0byBiZSB1c2VkIGZvciB0aGUgRUNEU0Egb3BlcmF0aW9ucworICogIFxwYXJhbSAgZWNrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIG1ldGggICBuZXcgbWV0aG9kCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgb3RoZXJ3aXNlIAorICovCitpbnQgCSAgRUNEU0Ffc2V0X21ldGhvZChFQ19LRVkgKmVja2V5LCBjb25zdCBFQ0RTQV9NRVRIT0QgKm1ldGgpOworCisvKiogUmV0dXJucyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIERFUiBlbmNvZGVkIHNpZ25hdHVyZQorICogIFxwYXJhbSAgZWNrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccmV0dXJuIG51bWJlcnMgb2YgYnl0ZXMgcmVxdWlyZWQgZm9yIHRoZSBERVIgZW5jb2RlZCBzaWduYXR1cmUKKyAqLworaW50CSAgRUNEU0Ffc2l6ZShjb25zdCBFQ19LRVkgKmVja2V5KTsKKworLyoqIFByZWNvbXB1dGUgcGFydHMgb2YgdGhlIHNpZ25pbmcgb3BlcmF0aW9uCisgKiAgXHBhcmFtICBlY2tleSAgRUNfS0VZIG9iamVjdCBjb250YWluaW5nIGEgcHJpdmF0ZSBFQyBrZXkKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccGFyYW0gIGtpbnYgICBCSUdOVU0gcG9pbnRlciBmb3IgdGhlIGludmVyc2Ugb2YgaworICogIFxwYXJhbSAgcnAgICAgIEJJR05VTSBwb2ludGVyIGZvciB4IGNvb3JkaW5hdGUgb2YgayAqIGdlbmVyYXRvcgorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIG90aGVyd2lzZQorICovCitpbnQgCSAgRUNEU0Ffc2lnbl9zZXR1cChFQ19LRVkgKmVja2V5LCBCTl9DVFggKmN0eCwgQklHTlVNICoqa2ludiwgCisJCUJJR05VTSAqKnJwKTsKKworLyoqIENvbXB1dGVzIEVDRFNBIHNpZ25hdHVyZSBvZiBhIGdpdmVuIGhhc2ggdmFsdWUgdXNpbmcgdGhlIHN1cHBsaWVkCisgKiAgcHJpdmF0ZSBrZXkgKG5vdGU6IHNpZyBtdXN0IHBvaW50IHRvIEVDRFNBX3NpemUoZWNrZXkpIGJ5dGVzIG9mIG1lbW9yeSkuCisgKiAgXHBhcmFtICB0eXBlICAgICB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkCisgKiAgXHBhcmFtICBkZ3N0ICAgICBwb2ludGVyIHRvIHRoZSBoYXNoIHZhbHVlIHRvIHNpZ24KKyAqICBccGFyYW0gIGRnc3RsZW4gIGxlbmd0aCBvZiB0aGUgaGFzaCB2YWx1ZQorICogIFxwYXJhbSAgc2lnICAgICAgbWVtb3J5IGZvciB0aGUgREVSIGVuY29kZWQgY3JlYXRlZCBzaWduYXR1cmUKKyAqICBccGFyYW0gIHNpZ2xlbiAgIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgc2lnbmF0dXJlCisgKiAgXHBhcmFtICBlY2tleSAgICBFQ19LRVkgb2JqZWN0IGNvbnRhaW5pbmcgYSBwcml2YXRlIEVDIGtleQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIG90aGVyd2lzZQorICovCitpbnQJICBFQ0RTQV9zaWduKGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdGxlbiwgCisJCXVuc2lnbmVkIGNoYXIgKnNpZywgdW5zaWduZWQgaW50ICpzaWdsZW4sIEVDX0tFWSAqZWNrZXkpOworCisKKy8qKiBDb21wdXRlcyBFQ0RTQSBzaWduYXR1cmUgb2YgYSBnaXZlbiBoYXNoIHZhbHVlIHVzaW5nIHRoZSBzdXBwbGllZAorICogIHByaXZhdGUga2V5IChub3RlOiBzaWcgbXVzdCBwb2ludCB0byBFQ0RTQV9zaXplKGVja2V5KSBieXRlcyBvZiBtZW1vcnkpLgorICogIFxwYXJhbSAgdHlwZSAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZAorICogIFxwYXJhbSAgZGdzdCAgICAgcG9pbnRlciB0byB0aGUgaGFzaCB2YWx1ZSB0byBzaWduCisgKiAgXHBhcmFtICBkZ3N0bGVuICBsZW5ndGggb2YgdGhlIGhhc2ggdmFsdWUKKyAqICBccGFyYW0gIHNpZyAgICAgIGJ1ZmZlciB0byBob2xkIHRoZSBERVIgZW5jb2RlZCBzaWduYXR1cmUKKyAqICBccGFyYW0gIHNpZ2xlbiAgIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiB0aGUgcmV0dXJuZWQgc2lnbmF0dXJlCisgKiAgXHBhcmFtICBraW52ICAgICBCSUdOVU0gd2l0aCBhIHByZS1jb21wdXRlZCBpbnZlcnNlIGsgKG9wdGlvbmFsKQorICogIFxwYXJhbSAgcnAgICAgICAgQklHTlVNIHdpdGggYSBwcmUtY29tcHV0ZWQgcnAgdmFsdWUgKG9wdGlvYW5sKSwgCisgKiAgICAgICAgICAgICAgICAgICBzZWUgRUNEU0Ffc2lnbl9zZXR1cAorICogIFxwYXJhbSAgZWNrZXkgICAgRUNfS0VZIG9iamVjdCBjb250YWluaW5nIGEgcHJpdmF0ZSBFQyBrZXkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBvdGhlcndpc2UKKyAqLworaW50CSAgRUNEU0Ffc2lnbl9leChpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwgaW50IGRnc3RsZW4sIAorCQl1bnNpZ25lZCBjaGFyICpzaWcsIHVuc2lnbmVkIGludCAqc2lnbGVuLCBjb25zdCBCSUdOVU0gKmtpbnYsCisJCWNvbnN0IEJJR05VTSAqcnAsIEVDX0tFWSAqZWNrZXkpOworCisvKiogVmVyaWZpZXMgdGhhdCB0aGUgZ2l2ZW4gc2lnbmF0dXJlIGlzIHZhbGlkIEVDRFNBIHNpZ25hdHVyZQorICogIG9mIHRoZSBzdXBwbGllZCBoYXNoIHZhbHVlIHVzaW5nIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleS4KKyAqICBccGFyYW0gIHR5cGUgICAgIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQKKyAqICBccGFyYW0gIGRnc3QgICAgIHBvaW50ZXIgdG8gdGhlIGhhc2ggdmFsdWUgCisgKiAgXHBhcmFtICBkZ3N0bGVuICBsZW5ndGggb2YgdGhlIGhhc2ggdmFsdWUKKyAqICBccGFyYW0gIHNpZyAgICAgIHBvaW50ZXIgdG8gdGhlIERFUiBlbmNvZGVkIHNpZ25hdHVyZQorICogIFxwYXJhbSAgc2lnbGVuICAgbGVuZ3RoIG9mIHRoZSBERVIgZW5jb2RlZCBzaWduYXR1cmUKKyAqICBccGFyYW0gIGVja2V5ICAgIEVDX0tFWSBvYmplY3QgY29udGFpbmluZyBhIHB1YmxpYyBFQyBrZXkKKyAqICBccmV0dXJuIDEgaWYgdGhlIHNpZ25hdHVyZSBpcyB2YWxpZCwgMCBpZiB0aGUgc2lnbmF0dXJlIGlzIGludmFsaWQKKyAqICAgICAgICAgIGFuZCAtMSBvbiBlcnJvcgorICovCitpbnQgCSAgRUNEU0FfdmVyaWZ5KGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdGxlbiwgCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgaW50IHNpZ2xlbiwgRUNfS0VZICplY2tleSk7CisKKy8qIHRoZSBzdGFuZGFyZCBleF9kYXRhIGZ1bmN0aW9ucyAqLworaW50IAkgIEVDRFNBX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3IAorCQkqbmV3X2Z1bmMsIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludCAJICBFQ0RTQV9zZXRfZXhfZGF0YShFQ19LRVkgKmQsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkIAkgICpFQ0RTQV9nZXRfZXhfZGF0YShFQ19LRVkgKmQsIGludCBpZHgpOworCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfRUNEU0Ffc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBFQ0RTQSBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBFQ0RTQV9GX0VDRFNBX0RBVEFfTkVXX01FVEhPRAkJCSAxMDAKKyNkZWZpbmUgRUNEU0FfRl9FQ0RTQV9ET19TSUdOCQkJCSAxMDEKKyNkZWZpbmUgRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlkJCQkJIDEwMgorI2RlZmluZSBFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVAJCQkgMTAzCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgRUNEU0FfUl9CQURfU0lHTkFUVVJFCQkJCSAxMDAKKyNkZWZpbmUgRUNEU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUJCSAxMDEKKyNkZWZpbmUgRUNEU0FfUl9FUlJfRUNfTElCCQkJCSAxMDIKKyNkZWZpbmUgRUNEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMJCQkgMTAzCisjZGVmaW5lIEVDRFNBX1JfTkVFRF9ORVdfU0VUVVBfVkFMVUVTCQkJIDEwNgorI2RlZmluZSBFQ0RTQV9SX1JBTkRPTV9OVU1CRVJfR0VORVJBVElPTl9GQUlMRUQJCSAxMDQKKyNkZWZpbmUgRUNEU0FfUl9TSUdOQVRVUkVfTUFMTE9DX0ZBSUxFRAkJCSAxMDUKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY2RzYXRlc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY2RzYXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTRlMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2VjZHNhdGVzdC5jCkBAIC0wLDAgKzEsNTAwIEBACisvKiBjcnlwdG8vZWNkc2EvZWNkc2F0ZXN0LmMgKi8KKy8qCisgKiBXcml0dGVuIGJ5IE5pbHMgTGFyc2NoIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBhcmUgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGFib3ZlLgorICoKKyAqIFRoZSBlbGxpcHRpYyBjdXJ2ZSBiaW5hcnkgcG9seW5vbWlhbCBzb2Z0d2FyZSBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgCisgKiBTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPiAvKiBUbyBzZWUgaWYgT1BFTlNTTF9OT19FQ0RTQSBpcyBkZWZpbmVkICovCisKKyNpZmRlZiBPUEVOU1NMX05PX0VDRFNBCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkKKwl7CisJcHV0cygiRWxsaXB0aWMgY3VydmVzIGFyZSBkaXNhYmxlZC4iKTsKKwlyZXR1cm4gMDsKKwl9CisjZWxzZQorCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZWNkc2EuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgcm5kX3NlZWRbXSA9ICJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgIgorCSJ0aGluayBpdCBoYXMgZW50cm9weSI7CisKKy8qIGRlY2xhcmF0aW9uIG9mIHRoZSB0ZXN0IGZ1bmN0aW9ucyAqLworaW50IHg5XzYyX3Rlc3RzKEJJTyAqKTsKK2ludCB4OV82Ml90ZXN0X2ludGVybmFsKEJJTyAqb3V0LCBpbnQgbmlkLCBjb25zdCBjaGFyICpyLCBjb25zdCBjaGFyICpzKTsKK2ludCB0ZXN0X2J1aWx0aW4oQklPICopOworCisvKiBmdW5jdGlvbnMgdG8gY2hhbmdlIHRoZSBSQU5EX01FVEhPRCAqLworaW50IGNoYW5nZV9yYW5kKHZvaWQpOworaW50IHJlc3RvcmVfcmFuZCh2b2lkKTsKK2ludCBmYnl0ZXModW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtKTsKKworUkFORF9NRVRIT0QJZmFrZV9yYW5kOworY29uc3QgUkFORF9NRVRIT0QgKm9sZF9yYW5kOworCitpbnQgY2hhbmdlX3JhbmQodm9pZCkKKwl7CisJLyogc2F2ZSBvbGQgcmFuZCBtZXRob2QgKi8KKwlpZiAoKG9sZF9yYW5kID0gUkFORF9nZXRfcmFuZF9tZXRob2QoKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmYWtlX3JhbmQuc2VlZCAgICA9IG9sZF9yYW5kLT5zZWVkOworCWZha2VfcmFuZC5jbGVhbnVwID0gb2xkX3JhbmQtPmNsZWFudXA7CisJZmFrZV9yYW5kLmFkZCAgICAgPSBvbGRfcmFuZC0+YWRkOworCWZha2VfcmFuZC5zdGF0dXMgID0gb2xkX3JhbmQtPnN0YXR1czsKKwkvKiB1c2Ugb3duIHJhbmRvbSBmdW5jdGlvbiAqLworCWZha2VfcmFuZC5ieXRlcyAgICAgID0gZmJ5dGVzOworCWZha2VfcmFuZC5wc2V1ZG9yYW5kID0gb2xkX3JhbmQtPmJ5dGVzOworCS8qIHNldCBuZXcgUkFORF9NRVRIT0QgKi8KKwlpZiAoIVJBTkRfc2V0X3JhbmRfbWV0aG9kKCZmYWtlX3JhbmQpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCByZXN0b3JlX3JhbmQodm9pZCkKKwl7CisJaWYgKCFSQU5EX3NldF9yYW5kX21ldGhvZChvbGRfcmFuZCkpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGZieXRlc19jb3VudGVyID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpudW1iZXJzWzhdID0geworCSI2NTEwNTY3NzA5MDYwMTUwNzYwNTY4MTA3NjM0NTYzNTg1NjcxOTAxMDAxNTY2OTU2MTU2NjU2NTkiLAorCSI2MTQwNTA3MDY3MDY1MDAxMDYzMDY1MDY1NTY1NjY3NDA1NTYwMDA2MTYxNTU2NTY1NjY1NjU2NjU0IiwKKwkiODc2MzAwMTAxNTA3MTA3NTY3NTAxMDY2MTMwNzYxNjcxMDc4MzU3MDEwNjcxMDY3NzgxNzc2NzE2NiIKKwkiNzE2NzYxNzg3MjY3MTciLAorCSI3MDAwMDAwMTc1NjkwNTY2NDY2NTU1MDU3ODE3NTcxNTcxMDc1NzA1MDE1NzU3NzU3MDU3Nzk1NzU1IgorCSI1NTY1NzE1Njc1NjY1NSIsCisJIjEyNzU1NTIxOTExMTMyMTIzMDAwMTIwMzA0MzkxODcxNDYxNjQ2NDYxNDY2NDY0NjY3NDk0OTQ3OTkiLAorCSIxNTQyNzI1NTY1MjE2NTIzOTg1Nzg5MjM2OTU2MjY1MjY1MjY1MjM1Njc1ODExOTQ5NDA0MDQwMDQxIiwKKwkiMTQ1NjQyNzU1NTIxOTExNTM0NjUxMzIxMjMwMDA3NTM0MTIwMzA0MzkxODcxNDYxNjQ2NDYxNDY2NCIKKwkiNjQ2Njc0OTQ5NDc5OTAiLAorCSIxNzEyNzg3MjU1NjUyMTY1MjM5NjcyODU3ODkyMzY5NTYyNjUyNjUyNjUyMzU2NzU4MTE5NDk0MDQwIgorCSI0MDA0MTY3MDIxNjM2MyJ9OworCitpbnQgZmJ5dGVzKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG51bSkKKwl7CisJaW50CXJldDsKKwlCSUdOVU0JKnRtcCA9IE5VTEw7CisKKwlpZiAoZmJ5dGVzX2NvdW50ZXIgPj0gOCkKKwkJcmV0dXJuIDA7CisJdG1wID0gQk5fbmV3KCk7CisJaWYgKCF0bXApCisJCXJldHVybiAwOworCWlmICghQk5fZGVjMmJuKCZ0bXAsIG51bWJlcnNbZmJ5dGVzX2NvdW50ZXJdKSkKKwkJeworCQlCTl9mcmVlKHRtcCk7CisJCXJldHVybiAwOworCQl9CisJZmJ5dGVzX2NvdW50ZXIgKys7CisJcmV0ID0gQk5fYm4yYmluKHRtcCwgYnVmKTsJCisJaWYgKHJldCA9PSAwIHx8IHJldCAhPSBudW0pCisJCXJldCA9IDA7CisJZWxzZQorCQlyZXQgPSAxOworCWlmICh0bXApCisJCUJOX2ZyZWUodG1wKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogc29tZSB0ZXN0cyBmcm9tIHRoZSBYOS42MiBkcmFmdCAqLworaW50IHg5XzYyX3Rlc3RfaW50ZXJuYWwoQklPICpvdXQsIGludCBuaWQsIGNvbnN0IGNoYXIgKnJfaW4sIGNvbnN0IGNoYXIgKnNfaW4pCisJeworCWludAlyZXQgPSAwOworCWNvbnN0IGNoYXIgbWVzc2FnZVtdID0gImFiYyI7CisJdW5zaWduZWQgY2hhciBkaWdlc3RbMjBdOworCXVuc2lnbmVkIGludCAgZGdzdF9sZW4gPSAwOworCUVWUF9NRF9DVFggbWRfY3R4OworCUVDX0tFWSAgICAqa2V5ID0gTlVMTDsKKwlFQ0RTQV9TSUcgKnNpZ25hdHVyZSA9IE5VTEw7CisJQklHTlVNICAgICpyID0gTlVMTCwgKnMgPSBOVUxMOworCisJRVZQX01EX0NUWF9pbml0KCZtZF9jdHgpOworCS8qIGdldCB0aGUgbWVzc2FnZSBkaWdlc3QgKi8KKwlFVlBfRGlnZXN0SW5pdCgmbWRfY3R4LCBFVlBfZWNkc2EoKSk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCAoY29uc3Qgdm9pZCopbWVzc2FnZSwgMyk7CisJRVZQX0RpZ2VzdEZpbmFsKCZtZF9jdHgsIGRpZ2VzdCwgJmRnc3RfbGVuKTsKKworCUJJT19wcmludGYob3V0LCAidGVzdGluZyAlczogIiwgT0JKX25pZDJzbihuaWQpKTsKKwkvKiBjcmVhdGUgdGhlIGtleSAqLworCWlmICgoa2V5ID0gRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKG5pZCkpID09IE5VTEwpCisJCWdvdG8geDk2Ml9pbnRfZXJyOworCWlmICghRUNfS0VZX2dlbmVyYXRlX2tleShrZXkpKQorCQlnb3RvIHg5NjJfaW50X2VycjsKKwlCSU9fcHJpbnRmKG91dCwgIi4iKTsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKwkvKiBjcmVhdGUgdGhlIHNpZ25hdHVyZSAqLworCXNpZ25hdHVyZSA9IEVDRFNBX2RvX3NpZ24oZGlnZXN0LCAyMCwga2V5KTsKKwlpZiAoc2lnbmF0dXJlID09IE5VTEwpCisJCWdvdG8geDk2Ml9pbnRfZXJyOworCUJJT19wcmludGYob3V0LCAiLiIpOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCS8qIGNvbXBhcmUgdGhlIGNyZWF0ZWQgc2lnbmF0dXJlIHdpdGggdGhlIGV4cGVjdGVkIHNpZ25hdHVyZSAqLworCWlmICgociA9IEJOX25ldygpKSA9PSBOVUxMIHx8IChzID0gQk5fbmV3KCkpID09IE5VTEwpCisJCWdvdG8geDk2Ml9pbnRfZXJyOworCWlmICghQk5fZGVjMmJuKCZyLCByX2luKSB8fAorCSAgICAhQk5fZGVjMmJuKCZzLCBzX2luKSkKKwkJZ290byB4OTYyX2ludF9lcnI7CisJaWYgKEJOX2NtcChzaWduYXR1cmUtPnIgLHIpIHx8IEJOX2NtcChzaWduYXR1cmUtPnMsIHMpKQorCQlnb3RvIHg5NjJfaW50X2VycjsKKwlCSU9fcHJpbnRmKG91dCwgIi4iKTsKKwkodm9pZClCSU9fZmx1c2gob3V0KTsKKwkvKiB2ZXJpZnkgdGhlIHNpZ25hdHVyZSAqLworCWlmIChFQ0RTQV9kb192ZXJpZnkoZGlnZXN0LCAyMCwgc2lnbmF0dXJlLCBrZXkpICE9IDEpCisJCWdvdG8geDk2Ml9pbnRfZXJyOworCUJJT19wcmludGYob3V0LCAiLiIpOworCSh2b2lkKUJJT19mbHVzaChvdXQpOworCisJQklPX3ByaW50ZihvdXQsICIgb2tcbiIpOworCXJldCA9IDE7Cit4OTYyX2ludF9lcnI6CisJaWYgKCFyZXQpCisJCUJJT19wcmludGYob3V0LCAiIGZhaWxlZFxuIik7CisJaWYgKGtleSkKKwkJRUNfS0VZX2ZyZWUoa2V5KTsKKwlpZiAoc2lnbmF0dXJlKQorCQlFQ0RTQV9TSUdfZnJlZShzaWduYXR1cmUpOworCWlmIChyKQorCQlCTl9mcmVlKHIpOworCWlmIChzKQorCQlCTl9mcmVlKHMpOworCUVWUF9NRF9DVFhfY2xlYW51cCgmbWRfY3R4KTsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IHg5XzYyX3Rlc3RzKEJJTyAqb3V0KQorCXsKKwlpbnQgcmV0ID0gMDsKKworCUJJT19wcmludGYob3V0LCAic29tZSB0ZXN0cyBmcm9tIFg5LjYyOlxuIik7CisKKwkvKiBzZXQgb3duIHJhbmQgbWV0aG9kICovCisJaWYgKCFjaGFuZ2VfcmFuZCgpKQorCQlnb3RvIHg5NjJfZXJyOworCisJaWYgKCF4OV82Ml90ZXN0X2ludGVybmFsKG91dCwgTklEX1g5XzYyX3ByaW1lMTkydjEsCisJCSIzMzQyNDAzNTM2NDA1OTgxNzI5MzkzNDg4MzM0Njk0NjAwNDE1NTk2ODgxODI2ODY5MzUxNjc3NjEzIiwKKwkJIjU3MzU4MjIzMjg4ODgxNTUyNTQ2ODM4OTQ5OTc4OTc1NzE5NTE1Njg1NTM2NDI4OTIwMjk5ODIzNDIiKSkKKwkJZ290byB4OTYyX2VycjsKKwlpZiAoIXg5XzYyX3Rlc3RfaW50ZXJuYWwob3V0LCBOSURfWDlfNjJfcHJpbWUyMzl2MSwKKwkJIjMwODYzNjE0MzE3NTE2NzgxMTQ5MjYyMjU0NzMwMDY2ODAxODg1NDk1OTM3ODc1ODUzMTc3ODE0NzQiCisJCSI2MjA1ODMwNjQzMjE3NiIsCisJCSIzMjM4MTM1NTMyMDk3OTczNTc3MDgwNzg3NzY4MzEyNTA1MDU5MzE4OTEwNTE3NTUwMDc4NDI3ODE5IgorCQkiNzg1MDUxNzk0NDg3ODMiKSkKKwkJZ290byB4OTYyX2VycjsKKwlpZiAoIXg5XzYyX3Rlc3RfaW50ZXJuYWwob3V0LCBOSURfWDlfNjJfYzJ0bmIxOTF2MSwKKwkJIjg3MTk0MzgzMTY0ODcxNTQzMzU1NzIyMjg0OTI2OTA0NDE5OTk3MjM3NTkxNTM1MDY2NTI4MDQ4IiwKKwkJIjMwODk5MjY5MTk2NTgwNDk0NzM2MTU0MTY2NDU0OTA4NTg5NTI5MjE1Mzc3NzAyNTc3MjA2MzU5OCIpKQorCQlnb3RvIHg5NjJfZXJyOworCWlmICgheDlfNjJfdGVzdF9pbnRlcm5hbChvdXQsIE5JRF9YOV82Ml9jMnRuYjIzOXYxLAorCQkiMjE1OTYzMzMyMTA0MTk2MTE5ODUwMTgzNDAwMzkwMzQ2MTI2Mjg4MTgxNTE0ODY4NDE3ODk2NDI0NSIKKwkJIjU4NzY5MjIzOTE1NTIiLAorCQkiMTk3MDMwMzc0MDAwNzMxNjg2NzM4MzM0OTk3NjU0OTk3MjI3MDUyODQ5ODA0MDcyMTk4ODE5MTAyNiIKKwkJIjQ5NDEzNDY1NzM3MTc0IikpCisJCWdvdG8geDk2Ml9lcnI7CisKKwlyZXQgPSAxOworeDk2Ml9lcnI6CisJaWYgKCFyZXN0b3JlX3JhbmQoKSkKKwkJcmV0ID0gMDsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IHRlc3RfYnVpbHRpbihCSU8gKm91dCkKKwl7CisJRUNfYnVpbHRpbl9jdXJ2ZSAqY3VydmVzID0gTlVMTDsKKwlzaXplX3QJCWNydl9sZW4gPSAwLCBuID0gMDsKKwlFQ19LRVkJCSplY2tleSA9IE5VTEwsICp3cm9uZ19lY2tleSA9IE5VTEw7CisJRUNfR1JPVVAJKmdyb3VwOworCXVuc2lnbmVkIGNoYXIJZGlnZXN0WzIwXSwgd3JvbmdfZGlnZXN0WzIwXTsKKwl1bnNpZ25lZCBjaGFyCSpzaWduYXR1cmUgPSBOVUxMOyAKKwl1bnNpZ25lZCBpbnQJc2lnX2xlbjsKKwlpbnQJCW5pZCwgcmV0ID0gIDA7CisJCisJLyogZmlsbCBkaWdlc3QgdmFsdWVzIHdpdGggc29tZSByYW5kb20gZGF0YSAqLworCWlmICghUkFORF9wc2V1ZG9fYnl0ZXMoZGlnZXN0LCAyMCkgfHwKKwkgICAgIVJBTkRfcHNldWRvX2J5dGVzKHdyb25nX2RpZ2VzdCwgMjApKQorCQl7CisJCUJJT19wcmludGYob3V0LCAiRVJST1I6IHVuYWJsZSB0byBnZXQgcmFuZG9tIGRhdGFcbiIpOworCQlnb3RvIGJ1aWx0aW5fZXJyOworCQl9CisKKwkvKiBjcmVhdGUgYW5kIHZlcmlmeSBhIGVjZHNhIHNpZ25hdHVyZSB3aXRoIGV2ZXJ5IGF2YWlsYmxlIGN1cnZlCisJICogKHdpdGggKSAqLworCUJJT19wcmludGYob3V0LCAiXG50ZXN0aW5nIEVDRFNBX3NpZ24oKSBhbmQgRUNEU0FfdmVyaWZ5KCkgIgorCQkid2l0aCBzb21lIGludGVybmFsIGN1cnZlczpcbiIpOworCisJLyogZ2V0IGEgbGlzdCBvZiBhbGwgaW50ZXJuYWwgY3VydmVzICovCisJY3J2X2xlbiA9IEVDX2dldF9idWlsdGluX2N1cnZlcyhOVUxMLCAwKTsKKworCWN1cnZlcyA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFQ19idWlsdGluX2N1cnZlKSAqIGNydl9sZW4pOworCisJaWYgKGN1cnZlcyA9PSBOVUxMKQorCQl7CisJCUJJT19wcmludGYob3V0LCAibWFsbG9jIGVycm9yXG4iKTsKKwkJZ290byBidWlsdGluX2VycjsKKwkJfQorCQorCWlmICghRUNfZ2V0X2J1aWx0aW5fY3VydmVzKGN1cnZlcywgY3J2X2xlbikpCisJCXsKKwkJQklPX3ByaW50ZihvdXQsICJ1bmFibGUgdG8gZ2V0IGludGVybmFsIGN1cnZlc1xuIik7CisJCWdvdG8gYnVpbHRpbl9lcnI7CisJCX0KKworCS8qIG5vdyBjcmVhdGUgYW5kIHZlcmlmeSBhIHNpZ25hdHVyZSBmb3IgZXZlcnkgY3VydmUgKi8KKwlmb3IgKG4gPSAwOyBuIDwgY3J2X2xlbjsgbisrKQorCQl7CisJCXVuc2lnbmVkIGNoYXIgZGlydCwgb2Zmc2V0OworCisJCW5pZCA9IGN1cnZlc1tuXS5uaWQ7CisJCWlmIChuaWQgPT0gTklEX2lwc2VjNCkKKwkJCWNvbnRpbnVlOworCQkvKiBjcmVhdGUgbmV3IGVjZHNhIGtleSAoPT0gRUNfS0VZKSAqLworCQlpZiAoKGVja2V5ID0gRUNfS0VZX25ldygpKSA9PSBOVUxMKQorCQkJZ290byBidWlsdGluX2VycjsKKwkJZ3JvdXAgPSBFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworCQlpZiAoZ3JvdXAgPT0gTlVMTCkKKwkJCWdvdG8gYnVpbHRpbl9lcnI7CisJCWlmIChFQ19LRVlfc2V0X2dyb3VwKGVja2V5LCBncm91cCkgPT0gMCkKKwkJCWdvdG8gYnVpbHRpbl9lcnI7CisJCUVDX0dST1VQX2ZyZWUoZ3JvdXApOworCQlpZiAoRUNfR1JPVVBfZ2V0X2RlZ3JlZShFQ19LRVlfZ2V0MF9ncm91cChlY2tleSkpIDwgMTYwKQorCQkJLyogZHJvcCB0aGUgY3VydmUgKi8gCisJCQl7CisJCQlFQ19LRVlfZnJlZShlY2tleSk7CisJCQllY2tleSA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJCX0KKwkJQklPX3ByaW50ZihvdXQsICIlczogIiwgT0JKX25pZDJzbihuaWQpKTsKKwkJLyogY3JlYXRlIGtleSAqLworCQlpZiAoIUVDX0tFWV9nZW5lcmF0ZV9rZXkoZWNrZXkpKQorCQkJeworCQkJQklPX3ByaW50ZihvdXQsICIgZmFpbGVkXG4iKTsKKwkJCWdvdG8gYnVpbHRpbl9lcnI7CisJCQl9CisJCS8qIGNyZWF0ZSBzZWNvbmQga2V5ICovCisJCWlmICgod3JvbmdfZWNrZXkgPSBFQ19LRVlfbmV3KCkpID09IE5VTEwpCisJCQlnb3RvIGJ1aWx0aW5fZXJyOworCQlncm91cCA9IEVDX0dST1VQX25ld19ieV9jdXJ2ZV9uYW1lKG5pZCk7CisJCWlmIChncm91cCA9PSBOVUxMKQorCQkJZ290byBidWlsdGluX2VycjsKKwkJaWYgKEVDX0tFWV9zZXRfZ3JvdXAod3JvbmdfZWNrZXksIGdyb3VwKSA9PSAwKQorCQkJZ290byBidWlsdGluX2VycjsKKwkJRUNfR1JPVVBfZnJlZShncm91cCk7CisJCWlmICghRUNfS0VZX2dlbmVyYXRlX2tleSh3cm9uZ19lY2tleSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworCQkJZ290byBidWlsdGluX2VycjsKKwkJCX0KKworCQlCSU9fcHJpbnRmKG91dCwgIi4iKTsKKwkJKHZvaWQpQklPX2ZsdXNoKG91dCk7CisJCS8qIGNoZWNrIGtleSAqLworCQlpZiAoIUVDX0tFWV9jaGVja19rZXkoZWNrZXkpKQorCQkJeworCQkJQklPX3ByaW50ZihvdXQsICIgZmFpbGVkXG4iKTsKKwkJCWdvdG8gYnVpbHRpbl9lcnI7CisJCQl9CisJCUJJT19wcmludGYob3V0LCAiLiIpOworCQkodm9pZClCSU9fZmx1c2gob3V0KTsKKwkJLyogY3JlYXRlIHNpZ25hdHVyZSAqLworCQlzaWdfbGVuID0gRUNEU0Ffc2l6ZShlY2tleSk7CisJCWlmICgoc2lnbmF0dXJlID0gT1BFTlNTTF9tYWxsb2Moc2lnX2xlbikpID09IE5VTEwpCisJCQlnb3RvIGJ1aWx0aW5fZXJyOworICAgICAgICAgICAgICAgIGlmICghRUNEU0Ffc2lnbigwLCBkaWdlc3QsIDIwLCBzaWduYXR1cmUsICZzaWdfbGVuLCBlY2tleSkpCisJCQl7CisJCQlCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworCQkJZ290byBidWlsdGluX2VycjsKKwkJCX0KKwkJQklPX3ByaW50ZihvdXQsICIuIik7CisJCSh2b2lkKUJJT19mbHVzaChvdXQpOworCQkvKiB2ZXJpZnkgc2lnbmF0dXJlICovCisJCWlmIChFQ0RTQV92ZXJpZnkoMCwgZGlnZXN0LCAyMCwgc2lnbmF0dXJlLCBzaWdfbGVuLCBlY2tleSkgIT0gMSkKKwkJCXsKKwkJCUJJT19wcmludGYob3V0LCAiIGZhaWxlZFxuIik7CisJCQlnb3RvIGJ1aWx0aW5fZXJyOworCQkJfQorCQlCSU9fcHJpbnRmKG91dCwgIi4iKTsKKwkJKHZvaWQpQklPX2ZsdXNoKG91dCk7CisJCS8qIHZlcmlmeSBzaWduYXR1cmUgd2l0aCB0aGUgd3Jvbmcga2V5ICovCisJCWlmIChFQ0RTQV92ZXJpZnkoMCwgZGlnZXN0LCAyMCwgc2lnbmF0dXJlLCBzaWdfbGVuLCAKKwkJCXdyb25nX2Vja2V5KSA9PSAxKQorCQkJeworCQkJQklPX3ByaW50ZihvdXQsICIgZmFpbGVkXG4iKTsKKwkJCWdvdG8gYnVpbHRpbl9lcnI7CisJCQl9CisJCUJJT19wcmludGYob3V0LCAiLiIpOworCQkodm9pZClCSU9fZmx1c2gob3V0KTsKKwkJLyogd3JvbmcgZGlnZXN0ICovCisJCWlmIChFQ0RTQV92ZXJpZnkoMCwgd3JvbmdfZGlnZXN0LCAyMCwgc2lnbmF0dXJlLCBzaWdfbGVuLAorCQkJZWNrZXkpID09IDEpCisJCQl7CisJCQlCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworCQkJZ290byBidWlsdGluX2VycjsKKwkJCX0KKwkJQklPX3ByaW50ZihvdXQsICIuIik7CisJCSh2b2lkKUJJT19mbHVzaChvdXQpOworCQkvKiBtb2RpZnkgYSBzaW5nbGUgYnl0ZSBvZiB0aGUgc2lnbmF0dXJlICovCisJCW9mZnNldCA9IHNpZ25hdHVyZVsxMF0gJSBzaWdfbGVuOworCQlkaXJ0ICAgPSBzaWduYXR1cmVbMTFdOworCQlzaWduYXR1cmVbb2Zmc2V0XSBePSBkaXJ0ID8gZGlydCA6IDE7IAorCQlpZiAoRUNEU0FfdmVyaWZ5KDAsIGRpZ2VzdCwgMjAsIHNpZ25hdHVyZSwgc2lnX2xlbiwgZWNrZXkpID09IDEpCisJCQl7CisJCQlCSU9fcHJpbnRmKG91dCwgIiBmYWlsZWRcbiIpOworCQkJZ290byBidWlsdGluX2VycjsKKwkJCX0KKwkJQklPX3ByaW50ZihvdXQsICIuIik7CisJCSh2b2lkKUJJT19mbHVzaChvdXQpOworCQkKKwkJQklPX3ByaW50ZihvdXQsICIgb2tcbiIpOworCQkvKiBjbGVhbnVwICovCisJCU9QRU5TU0xfZnJlZShzaWduYXR1cmUpOworCQlzaWduYXR1cmUgPSBOVUxMOworCQlFQ19LRVlfZnJlZShlY2tleSk7CisJCWVja2V5ID0gTlVMTDsKKwkJRUNfS0VZX2ZyZWUod3JvbmdfZWNrZXkpOworCQl3cm9uZ19lY2tleSA9IE5VTEw7CisJCX0KKworCXJldCA9IDE7CQorYnVpbHRpbl9lcnI6CisJaWYgKGVja2V5KQorCQlFQ19LRVlfZnJlZShlY2tleSk7CisJaWYgKHdyb25nX2Vja2V5KQorCQlFQ19LRVlfZnJlZSh3cm9uZ19lY2tleSk7CisJaWYgKHNpZ25hdHVyZSkKKwkJT1BFTlNTTF9mcmVlKHNpZ25hdHVyZSk7CisJaWYgKGN1cnZlcykKKwkJT1BFTlNTTF9mcmVlKGN1cnZlcyk7CisKKwlyZXR1cm4gcmV0OworCX0KKworaW50IG1haW4odm9pZCkKKwl7CisJaW50IAlyZXQgPSAxOworCUJJTwkqb3V0OworCisJb3V0ID0gQklPX25ld19mcChzdGRvdXQsIEJJT19OT0NMT1NFKTsKKwkKKwkvKiBlbmFibGUgbWVtb3J5IGxlYWsgY2hlY2tpbmcgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWQgKi8KKwlpZiAoISgoZ2V0ZW52KCJPUEVOU1NMX0RFQlVHX01FTU9SWSIpICE9IE5VTEwpICYmIAorCQkoMCA9PSBzdHJjbXAoZ2V0ZW52KCJPUEVOU1NMX0RFQlVHX01FTU9SWSIpLCAib2ZmIikpKSkKKwkJeworCQlDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKTsKKwkJQ1JZUFRPX3NldF9tZW1fZGVidWdfb3B0aW9ucyhWX0NSWVBUT19NREVCVUdfQUxMKTsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBPUEVOU1NMX0RFQlVHX01FTU9SWT1vZmYgKi8KKwkJQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKDAsIDAsIDAsIDAsIDApOworCQl9CisJQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pOworCisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworCS8qIGluaXRpYWxpemUgdGhlIHBybmcgKi8KKwlSQU5EX3NlZWQocm5kX3NlZWQsIHNpemVvZihybmRfc2VlZCkpOworCisJLyogdGhlIHRlc3RzICovCisJaWYgKCF4OV82Ml90ZXN0cyhvdXQpKSAgZ290byBlcnI7CisJaWYgKCF0ZXN0X2J1aWx0aW4ob3V0KSkgZ290byBlcnI7CisJCisJcmV0ID0gMDsKK2VycjoJCisJaWYgKHJldCkgCQorCQlCSU9fcHJpbnRmKG91dCwgIlxuRUNEU0EgdGVzdCBmYWlsZWRcbiIpOworCWVsc2UgCisJCUJJT19wcmludGYob3V0LCAiXG5FQ0RTQSB0ZXN0IHBhc3NlZFxuIik7CisJaWYgKHJldCkKKwkJRVJSX3ByaW50X2Vycm9ycyhvdXQpOworCUNSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisJRVJSX3JlbW92ZV90aHJlYWRfc3RhdGUoTlVMTCk7CisJRVJSX2ZyZWVfc3RyaW5ncygpOworCUNSWVBUT19tZW1fbGVha3Mob3V0KTsKKwlpZiAob3V0ICE9IE5VTEwpCisJCUJJT19mcmVlKG91dCk7CisJcmV0dXJuIHJldDsKKwl9CQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWNkc2EvZWNzX2FzbjEuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY3NfYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOTU0ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkc2EvZWNzX2FzbjEuYwpAQCAtMCwwICsxLDY3IEBACisvKiBjcnlwdG8vZWNkc2EvZWNzX2FzbjEuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlICJlY3NfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorCitBU04xX1NFUVVFTkNFKEVDRFNBX1NJRykgPSB7CisJQVNOMV9TSU1QTEUoRUNEU0FfU0lHLCByLCBDQklHTlVNKSwKKwlBU04xX1NJTVBMRShFQ0RTQV9TSUcsIHMsIENCSUdOVU0pCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEVDRFNBX1NJRykKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OU19jb25zdChFQ0RTQV9TSUcpCitERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChFQ0RTQV9TSUcsIEVDRFNBX1NJRykKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OU19jb25zdChFQ0RTQV9TSUcpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWNkc2EvZWNzX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2Vjc19lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGUzOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2Vjc19lcnIuYwpAQCAtMCwwICsxLDEwNCBAQAorLyogY3J5cHRvL2VjZHNhL2Vjc19lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9FQ0RTQSxmdW5jLDApCisjZGVmaW5lIEVSUl9SRUFTT04ocmVhc29uKSBFUlJfUEFDSyhFUlJfTElCX0VDRFNBLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEVDRFNBX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoRUNEU0FfRl9FQ0RTQV9EQVRBX05FV19NRVRIT0QpLAkiRUNEU0FfREFUQV9ORVdfTUVUSE9EIn0sCit7RVJSX0ZVTkMoRUNEU0FfRl9FQ0RTQV9ET19TSUdOKSwJIkVDRFNBX2RvX3NpZ24ifSwKK3tFUlJfRlVOQyhFQ0RTQV9GX0VDRFNBX0RPX1ZFUklGWSksCSJFQ0RTQV9kb192ZXJpZnkifSwKK3tFUlJfRlVOQyhFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVApLAkiRUNEU0Ffc2lnbl9zZXR1cCJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEVDRFNBX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oRUNEU0FfUl9CQURfU0lHTkFUVVJFKSAgICAgICAsImJhZCBzaWduYXR1cmUifSwKK3tFUlJfUkVBU09OKEVDRFNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKSwiZGF0YSB0b28gbGFyZ2UgZm9yIGtleSBzaXplIn0sCit7RVJSX1JFQVNPTihFQ0RTQV9SX0VSUl9FQ19MSUIpICAgICAgICAgICwiZXJyIGVjIGxpYiJ9LAore0VSUl9SRUFTT04oRUNEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMpICAsIm1pc3NpbmcgcGFyYW1ldGVycyJ9LAore0VSUl9SRUFTT04oRUNEU0FfUl9ORUVEX05FV19TRVRVUF9WQUxVRVMpLCJuZWVkIG5ldyBzZXR1cCB2YWx1ZXMifSwKK3tFUlJfUkVBU09OKEVDRFNBX1JfUkFORE9NX05VTUJFUl9HRU5FUkFUSU9OX0ZBSUxFRCksInJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBmYWlsZWQifSwKK3tFUlJfUkVBU09OKEVDRFNBX1JfU0lHTkFUVVJFX01BTExPQ19GQUlMRUQpLCJzaWduYXR1cmUgbWFsbG9jIGZhaWxlZCJ9LAorezAsTlVMTH0KKwl9OworCisjZW5kaWYKKwordm9pZCBFUlJfbG9hZF9FQ0RTQV9zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhFQ0RTQV9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxFQ0RTQV9zdHJfZnVuY3RzKTsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLEVDRFNBX3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2Vjc19saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY3NfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlOGEzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY3NfbGliLmMKQEAgLTAsMCArMSwyNjEgQEAKKy8qIGNyeXB0by9lY2RzYS9lY3NfbGliLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiZWNzX2xvY2wuaCIKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKK2NvbnN0IGNoYXIgRUNEU0FfdmVyc2lvbltdPSJFQ0RTQSIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCitzdGF0aWMgY29uc3QgRUNEU0FfTUVUSE9EICpkZWZhdWx0X0VDRFNBX21ldGhvZCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkICplY2RzYV9kYXRhX25ldyh2b2lkKTsKK3N0YXRpYyB2b2lkICplY2RzYV9kYXRhX2R1cCh2b2lkICopOworc3RhdGljIHZvaWQgIGVjZHNhX2RhdGFfZnJlZSh2b2lkICopOworCit2b2lkIEVDRFNBX3NldF9kZWZhdWx0X21ldGhvZChjb25zdCBFQ0RTQV9NRVRIT0QgKm1ldGgpCit7CisJZGVmYXVsdF9FQ0RTQV9tZXRob2QgPSBtZXRoOworfQorCitjb25zdCBFQ0RTQV9NRVRIT0QgKkVDRFNBX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKQoreworCWlmKCFkZWZhdWx0X0VDRFNBX21ldGhvZCkgCisJCWRlZmF1bHRfRUNEU0FfbWV0aG9kID0gRUNEU0FfT3BlblNTTCgpOworCXJldHVybiBkZWZhdWx0X0VDRFNBX21ldGhvZDsKK30KKworaW50IEVDRFNBX3NldF9tZXRob2QoRUNfS0VZICplY2tleSwgY29uc3QgRUNEU0FfTUVUSE9EICptZXRoKQoreworICAgICAgICBjb25zdCBFQ0RTQV9NRVRIT0QgKm10bXA7CisJRUNEU0FfREFUQSAqZWNkc2E7CisKKwllY2RzYSA9IGVjZHNhX2NoZWNrKGVja2V5KTsKKworCWlmIChlY2RzYSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworICAgICAgICBtdG1wID0gZWNkc2EtPm1ldGg7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYgKGVjZHNhLT5lbmdpbmUpCisJeworCQlFTkdJTkVfZmluaXNoKGVjZHNhLT5lbmdpbmUpOworCQllY2RzYS0+ZW5naW5lID0gTlVMTDsKKwl9CisjZW5kaWYKKyAgICAgICAgZWNkc2EtPm1ldGggPSBtZXRoOworCisgICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgRUNEU0FfREFUQSAqRUNEU0FfREFUQV9uZXdfbWV0aG9kKEVOR0lORSAqZW5naW5lKQoreworCUVDRFNBX0RBVEEgKnJldDsKKworCXJldD0oRUNEU0FfREFUQSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihFQ0RTQV9EQVRBKSk7CisJaWYgKHJldCA9PSBOVUxMKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9EQVRBX05FV19NRVRIT0QsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCX0KKworCXJldC0+aW5pdCA9IE5VTEw7CisKKwlyZXQtPm1ldGggPSBFQ0RTQV9nZXRfZGVmYXVsdF9tZXRob2QoKTsKKwlyZXQtPmVuZ2luZSA9IGVuZ2luZTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoIXJldC0+ZW5naW5lKQorCQlyZXQtPmVuZ2luZSA9IEVOR0lORV9nZXRfZGVmYXVsdF9FQ0RTQSgpOworCWlmIChyZXQtPmVuZ2luZSkKKwl7CisJCXJldC0+bWV0aCA9IEVOR0lORV9nZXRfRUNEU0EocmV0LT5lbmdpbmUpOworCQlpZiAoIXJldC0+bWV0aCkKKwkJeworCQkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9EQVRBX05FV19NRVRIT0QsIEVSUl9SX0VOR0lORV9MSUIpOworCQkJRU5HSU5FX2ZpbmlzaChyZXQtPmVuZ2luZSk7CisJCQlPUEVOU1NMX2ZyZWUocmV0KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorI2VuZGlmCisKKwlyZXQtPmZsYWdzID0gcmV0LT5tZXRoLT5mbGFnczsKKwlDUllQVE9fbmV3X2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX0VDRFNBLCByZXQsICZyZXQtPmV4X2RhdGEpOworI2lmIDAKKwlpZiAoKHJldC0+bWV0aC0+aW5pdCAhPSBOVUxMKSAmJiAhcmV0LT5tZXRoLT5pbml0KHJldCkpCisJeworCQlDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9FQ0RTQSwgcmV0LCAmcmV0LT5leF9kYXRhKTsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldD1OVUxMOworCX0KKyNlbmRpZgkKKwlyZXR1cm4ocmV0KTsKK30KKworc3RhdGljIHZvaWQgKmVjZHNhX2RhdGFfbmV3KHZvaWQpCit7CisJcmV0dXJuICh2b2lkICopRUNEU0FfREFUQV9uZXdfbWV0aG9kKE5VTEwpOworfQorCitzdGF0aWMgdm9pZCAqZWNkc2FfZGF0YV9kdXAodm9pZCAqZGF0YSkKK3sKKwlFQ0RTQV9EQVRBICpyID0gKEVDRFNBX0RBVEEgKilkYXRhOworCisJLyogWFhYOiBkdW1teSBvcGVyYXRpb24gKi8KKwlpZiAociA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlY2RzYV9kYXRhX25ldygpOworfQorCitzdGF0aWMgdm9pZCBlY2RzYV9kYXRhX2ZyZWUodm9pZCAqZGF0YSkKK3sKKwlFQ0RTQV9EQVRBICpyID0gKEVDRFNBX0RBVEEgKilkYXRhOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYgKHItPmVuZ2luZSkKKwkJRU5HSU5FX2ZpbmlzaChyLT5lbmdpbmUpOworI2VuZGlmCisJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfRUNEU0EsIHIsICZyLT5leF9kYXRhKTsKKworCU9QRU5TU0xfY2xlYW5zZSgodm9pZCAqKXIsIHNpemVvZihFQ0RTQV9EQVRBKSk7CisKKwlPUEVOU1NMX2ZyZWUocik7Cit9CisKK0VDRFNBX0RBVEEgKmVjZHNhX2NoZWNrKEVDX0tFWSAqa2V5KQoreworCUVDRFNBX0RBVEEgKmVjZHNhX2RhdGE7CisgCisJdm9pZCAqZGF0YSA9IEVDX0tFWV9nZXRfa2V5X21ldGhvZF9kYXRhKGtleSwgZWNkc2FfZGF0YV9kdXAsCisJCQkJCWVjZHNhX2RhdGFfZnJlZSwgZWNkc2FfZGF0YV9mcmVlKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCXsKKwkJZWNkc2FfZGF0YSA9IChFQ0RTQV9EQVRBICopZWNkc2FfZGF0YV9uZXcoKTsKKwkJaWYgKGVjZHNhX2RhdGEgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlFQ19LRVlfaW5zZXJ0X2tleV9tZXRob2RfZGF0YShrZXksICh2b2lkICopZWNkc2FfZGF0YSwKKwkJCWVjZHNhX2RhdGFfZHVwLCBlY2RzYV9kYXRhX2ZyZWUsIGVjZHNhX2RhdGFfZnJlZSk7CisJfQorCWVsc2UKKwkJZWNkc2FfZGF0YSA9IChFQ0RTQV9EQVRBICopZGF0YTsKKwkKKworCXJldHVybiBlY2RzYV9kYXRhOworfQorCitpbnQgRUNEU0Ffc2l6ZShjb25zdCBFQ19LRVkgKnIpCit7CisJaW50IHJldCxpOworCUFTTjFfSU5URUdFUiBiczsKKwlCSUdOVU0JKm9yZGVyPU5VTEw7CisJdW5zaWduZWQgY2hhciBidWZbNF07CisJY29uc3QgRUNfR1JPVVAgKmdyb3VwOworCisJaWYgKHIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChyKTsKKwlpZiAoZ3JvdXAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKG9yZGVyID0gQk5fbmV3KCkpID09IE5VTEwpIHJldHVybiAwOworCWlmICghRUNfR1JPVVBfZ2V0X29yZGVyKGdyb3VwLG9yZGVyLE5VTEwpKQorCXsKKwkJQk5fY2xlYXJfZnJlZShvcmRlcik7CisJCXJldHVybiAwOworCX0gCisJaT1CTl9udW1fYml0cyhvcmRlcik7CisJYnMubGVuZ3RoPShpKzcpLzg7CisJYnMuZGF0YT1idWY7CisJYnMudHlwZT1WX0FTTjFfSU5URUdFUjsKKwkvKiBJZiB0aGUgdG9wIGJpdCBpcyBzZXQgdGhlIGFzbjEgZW5jb2RpbmcgaXMgMSBsYXJnZXIuICovCisJYnVmWzBdPTB4ZmY7CQorCisJaT1pMmRfQVNOMV9JTlRFR0VSKCZicyxOVUxMKTsKKwlpKz1pOyAvKiByIGFuZCBzICovCisJcmV0PUFTTjFfb2JqZWN0X3NpemUoMSxpLFZfQVNOMV9TRVFVRU5DRSk7CisJQk5fY2xlYXJfZnJlZShvcmRlcik7CisJcmV0dXJuKHJldCk7Cit9CisKKworaW50IEVDRFNBX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKQoreworCXJldHVybiBDUllQVE9fZ2V0X2V4X25ld19pbmRleChDUllQVE9fRVhfSU5ERVhfRUNEU0EsIGFyZ2wsIGFyZ3AsCisJCQkJbmV3X2Z1bmMsIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworfQorCitpbnQgRUNEU0Ffc2V0X2V4X2RhdGEoRUNfS0VZICpkLCBpbnQgaWR4LCB2b2lkICphcmcpCit7CisJRUNEU0FfREFUQSAqZWNkc2E7CisJZWNkc2EgPSBlY2RzYV9jaGVjayhkKTsKKwlpZiAoZWNkc2EgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuKENSWVBUT19zZXRfZXhfZGF0YSgmZWNkc2EtPmV4X2RhdGEsaWR4LGFyZykpOworfQorCit2b2lkICpFQ0RTQV9nZXRfZXhfZGF0YShFQ19LRVkgKmQsIGludCBpZHgpCit7CisJRUNEU0FfREFUQSAqZWNkc2E7CisJZWNkc2EgPSBlY2RzYV9jaGVjayhkKTsKKwlpZiAoZWNkc2EgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuKENSWVBUT19nZXRfZXhfZGF0YSgmZWNkc2EtPmV4X2RhdGEsaWR4KSk7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZWNkc2EvZWNzX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY3NfbG9jbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjlhODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkc2EvZWNzX2xvY2wuaApAQCAtMCwwICsxLDEwNyBAQAorLyogY3J5cHRvL2VjZHNhL2Vjc19sb2NsLmggKi8KKy8qCisgKiBXcml0dGVuIGJ5IE5pbHMgTGFyc2NoIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0CisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9FQ1NfTE9DTF9ICisjZGVmaW5lIEhFQURFUl9FQ1NfTE9DTF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBlY2RzYV9tZXRob2QgCisJeworCWNvbnN0IGNoYXIgKm5hbWU7CisJRUNEU0FfU0lHICooKmVjZHNhX2RvX3NpZ24pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkZ3N0X2xlbiwgCisJCQljb25zdCBCSUdOVU0gKmludiwgY29uc3QgQklHTlVNICpycCwgRUNfS0VZICplY2tleSk7CisJaW50ICgqZWNkc2Ffc2lnbl9zZXR1cCkoRUNfS0VZICplY2tleSwgQk5fQ1RYICpjdHgsIEJJR05VTSAqKmtpbnYsIAorCQkJQklHTlVNICoqcik7CisJaW50ICgqZWNkc2FfZG9fdmVyaWZ5KShjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sIAorCQkJY29uc3QgRUNEU0FfU0lHICpzaWcsIEVDX0tFWSAqZWNrZXkpOworI2lmIDAKKwlpbnQgKCppbml0KShFQ19LRVkgKmVja2V5KTsKKwlpbnQgKCpmaW5pc2gpKEVDX0tFWSAqZWNrZXkpOworI2VuZGlmCisJaW50IGZsYWdzOworCWNoYXIgKmFwcF9kYXRhOworCX07CisKK3R5cGVkZWYgc3RydWN0IGVjZHNhX2RhdGFfc3QgeworCS8qIEVDX0tFWV9NRVRIX0RBVEEgcGFydCAqLworCWludCAoKmluaXQpKEVDX0tFWSAqKTsKKwkvKiBtZXRob2QgKEVDRFNBKSBzcGVjaWZpYyBwYXJ0ICovCisJRU5HSU5FCSplbmdpbmU7CisJaW50CWZsYWdzOworCWNvbnN0IEVDRFNBX01FVEhPRCAqbWV0aDsKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworfSBFQ0RTQV9EQVRBOworCisvKiogZWNkc2FfY2hlY2sKKyAqIGNoZWNrcyB3aGV0aGVyIEVDS0VZLT5tZXRoX2RhdGEgaXMgYSBwb2ludGVyIHRvIGEgRUNEU0FfREFUQSBzdHJ1Y3R1cmUKKyAqIGFuZCBpZiBub3QgaXQgcmVtb3ZlcyB0aGUgb2xkIG1ldGhfZGF0YSBhbmQgY3JlYXRlcyBhIEVDRFNBX0RBVEEgc3RydWN0dXJlLgorICogXHBhcmFtICBlY2tleSBwb2ludGVyIHRvIGEgRUNfS0VZIG9iamVjdAorICogXHJldHVybiBwb2ludGVyIHRvIGEgRUNEU0FfREFUQSBzdHJ1Y3R1cmUKKyAqLworRUNEU0FfREFUQSAqZWNkc2FfY2hlY2soRUNfS0VZICplY2tleSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogSEVBREVSX0VDU19MT0NMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY3Nfb3NzbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2Vjc19vc3NsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxY2Y1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY3Nfb3NzbC5jCkBAIC0wLDAgKzEsNDcyIEBACisvKiBjcnlwdG8vZWNkc2EvZWNzX29zc2wuYyAqLworLyoKKyAqIFdyaXR0ZW4gYnkgTmlscyBMYXJzY2ggZm9yIHRoZSBPcGVuU1NMIHByb2plY3QKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlICJlY3NfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmpfbWFjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCitzdGF0aWMgRUNEU0FfU0lHICplY2RzYV9kb19zaWduKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkbGVuLCAKKwkJY29uc3QgQklHTlVNICosIGNvbnN0IEJJR05VTSAqLCBFQ19LRVkgKmVja2V5KTsKK3N0YXRpYyBpbnQgZWNkc2Ffc2lnbl9zZXR1cChFQ19LRVkgKmVja2V5LCBCTl9DVFggKmN0eF9pbiwgQklHTlVNICoqa2ludnAsIAorCQlCSUdOVU0gKipycCk7CitzdGF0aWMgaW50IGVjZHNhX2RvX3ZlcmlmeShjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sIAorCQljb25zdCBFQ0RTQV9TSUcgKnNpZywgRUNfS0VZICplY2tleSk7CisKK3N0YXRpYyBFQ0RTQV9NRVRIT0Qgb3BlbnNzbF9lY2RzYV9tZXRoID0geworCSJPcGVuU1NMIEVDRFNBIG1ldGhvZCIsCisJZWNkc2FfZG9fc2lnbiwKKwllY2RzYV9zaWduX3NldHVwLAorCWVjZHNhX2RvX3ZlcmlmeSwKKyNpZiAwCisJTlVMTCwgLyogaW5pdCAgICAgKi8KKwlOVUxMLCAvKiBmaW5pc2ggICAqLworI2VuZGlmCisJMCwgICAgLyogZmxhZ3MgICAgKi8KKwlOVUxMICAvKiBhcHBfZGF0YSAqLworfTsKKworY29uc3QgRUNEU0FfTUVUSE9EICpFQ0RTQV9PcGVuU1NMKHZvaWQpCit7CisJcmV0dXJuICZvcGVuc3NsX2VjZHNhX21ldGg7Cit9CisKK3N0YXRpYyBpbnQgZWNkc2Ffc2lnbl9zZXR1cChFQ19LRVkgKmVja2V5LCBCTl9DVFggKmN0eF9pbiwgQklHTlVNICoqa2ludnAsCisJCUJJR05VTSAqKnJwKQoreworCUJOX0NUWCAgICpjdHggPSBOVUxMOworCUJJR05VTQkgKmsgPSBOVUxMLCAqciA9IE5VTEwsICpvcmRlciA9IE5VTEwsICpYID0gTlVMTDsKKwlFQ19QT0lOVCAqdG1wX3BvaW50PU5VTEw7CisJY29uc3QgRUNfR1JPVVAgKmdyb3VwOworCWludCAJIHJldCA9IDA7CisKKwlpZiAoZWNrZXkgPT0gTlVMTCB8fCAoZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChlY2tleSkpID09IE5VTEwpCisJeworCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVAsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybiAwOworCX0KKworCWlmIChjdHhfaW4gPT0gTlVMTCkgCisJeworCQlpZiAoKGN0eCA9IEJOX0NUWF9uZXcoKSkgPT0gTlVMTCkKKwkJeworCQkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9TSUdOX1NFVFVQLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UKKwkJY3R4ID0gY3R4X2luOworCisJayAgICAgPSBCTl9uZXcoKTsJLyogdGhpcyB2YWx1ZSBpcyBsYXRlciByZXR1cm5lZCBpbiAqa2ludnAgKi8KKwlyICAgICA9IEJOX25ldygpOwkvKiB0aGlzIHZhbHVlIGlzIGxhdGVyIHJldHVybmVkIGluICpycCAgICAqLworCW9yZGVyID0gQk5fbmV3KCk7CisJWCAgICAgPSBCTl9uZXcoKTsKKwlpZiAoIWsgfHwgIXIgfHwgIW9yZGVyIHx8ICFYKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9TSUdOX1NFVFVQLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoKHRtcF9wb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCkpID09IE5VTEwpCisJeworCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVAsIEVSUl9SX0VDX0xJQik7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgb3JkZXIsIGN0eCkpCisJeworCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVAsIEVSUl9SX0VDX0xJQik7CisJCWdvdG8gZXJyOworCX0KKwkKKwlkbworCXsKKwkJLyogZ2V0IHJhbmRvbSBrICovCQorCQlkbworCQkJaWYgKCFCTl9yYW5kX3JhbmdlKGssIG9yZGVyKSkKKwkJCXsKKwkJCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVAsCisJCQkJIEVDRFNBX1JfUkFORE9NX05VTUJFUl9HRU5FUkFUSU9OX0ZBSUxFRCk7CQorCQkJCWdvdG8gZXJyOworCQkJfQorCQl3aGlsZSAoQk5faXNfemVybyhrKSk7CisKKwkJLyogY29tcHV0ZSByIHRoZSB4LWNvb3JkaW5hdGUgb2YgZ2VuZXJhdG9yICogayAqLworCQlpZiAoIUVDX1BPSU5UX211bChncm91cCwgdG1wX3BvaW50LCBrLCBOVUxMLCBOVUxMLCBjdHgpKQorCQl7CisJCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVAsIEVSUl9SX0VDX0xJQik7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKEVDX0dST1VQX21ldGhvZF9vZihncm91cCkpID09IE5JRF9YOV82Ml9wcmltZV9maWVsZCkKKwkJeworCQkJaWYgKCFFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChncm91cCwKKwkJCQl0bXBfcG9pbnQsIFgsIE5VTEwsIGN0eCkpCisJCQl7CisJCQkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9TSUdOX1NFVFVQLEVSUl9SX0VDX0xJQik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwkJZWxzZSAvKiBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkICovCisJCXsKKwkJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLAorCQkJCXRtcF9wb2ludCwgWCwgTlVMTCwgY3R4KSkKKwkJCXsKKwkJCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVAsRVJSX1JfRUNfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQlpZiAoIUJOX25ubW9kKHIsIFgsIG9yZGVyLCBjdHgpKQorCQl7CisJCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX1NJR05fU0VUVVAsIEVSUl9SX0JOX0xJQik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwl3aGlsZSAoQk5faXNfemVybyhyKSk7CisKKwkvKiBjb21wdXRlIHRoZSBpbnZlcnNlIG9mIGsgKi8KKwlpZiAoIUJOX21vZF9pbnZlcnNlKGssIGssIG9yZGVyLCBjdHgpKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9TSUdOX1NFVFVQLCBFUlJfUl9CTl9MSUIpOworCQlnb3RvIGVycjsJCisJfQorCS8qIGNsZWFyIG9sZCB2YWx1ZXMgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCpycCAhPSBOVUxMKQorCQlCTl9jbGVhcl9mcmVlKCpycCk7CisJaWYgKCpraW52cCAhPSBOVUxMKSAKKwkJQk5fY2xlYXJfZnJlZSgqa2ludnApOworCS8qIHNhdmUgdGhlIHByZS1jb21wdXRlZCB2YWx1ZXMgICovCisJKnJwICAgID0gcjsKKwkqa2ludnAgPSBrOworCXJldCA9IDE7CitlcnI6CisJaWYgKCFyZXQpCisJeworCQlpZiAoayAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKGspOworCQlpZiAociAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHIpOworCX0KKwlpZiAoY3R4X2luID09IE5VTEwpIAorCQlCTl9DVFhfZnJlZShjdHgpOworCWlmIChvcmRlciAhPSBOVUxMKQorCQlCTl9mcmVlKG9yZGVyKTsKKwlpZiAodG1wX3BvaW50ICE9IE5VTEwpIAorCQlFQ19QT0lOVF9mcmVlKHRtcF9wb2ludCk7CisJaWYgKFgpCisJCUJOX2NsZWFyX2ZyZWUoWCk7CisJcmV0dXJuKHJldCk7Cit9CisKKworc3RhdGljIEVDRFNBX1NJRyAqZWNkc2FfZG9fc2lnbihjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sIAorCQljb25zdCBCSUdOVU0gKmluX2tpbnYsIGNvbnN0IEJJR05VTSAqaW5fciwgRUNfS0VZICplY2tleSkKK3sKKwlpbnQgICAgIG9rID0gMCwgaTsKKwlCSUdOVU0gKmtpbnY9TlVMTCwgKnMsICptPU5VTEwsKnRtcD1OVUxMLCpvcmRlcj1OVUxMOworCWNvbnN0IEJJR05VTSAqY2tpbnY7CisJQk5fQ1RYICAgICAqY3R4ID0gTlVMTDsKKwljb25zdCBFQ19HUk9VUCAgICpncm91cDsKKwlFQ0RTQV9TSUcgICpyZXQ7CisJRUNEU0FfREFUQSAqZWNkc2E7CisJY29uc3QgQklHTlVNICpwcml2X2tleTsKKworCWVjZHNhICAgID0gZWNkc2FfY2hlY2soZWNrZXkpOworCWdyb3VwICAgID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNrZXkpOworCXByaXZfa2V5ID0gRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoZWNrZXkpOworCQorCWlmIChncm91cCA9PSBOVUxMIHx8IHByaXZfa2V5ID09IE5VTEwgfHwgZWNkc2EgPT0gTlVMTCkKKwl7CisJCUVDRFNBZXJyKEVDRFNBX0ZfRUNEU0FfRE9fU0lHTiwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gRUNEU0FfU0lHX25ldygpOworCWlmICghcmV0KQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19TSUdOLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzID0gcmV0LT5zOworCisJaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwgfHwgKG9yZGVyID0gQk5fbmV3KCkpID09IE5VTEwgfHwKKwkJKHRtcCA9IEJOX25ldygpKSA9PSBOVUxMIHx8IChtID0gQk5fbmV3KCkpID09IE5VTEwpCisJeworCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX0RPX1NJR04sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKCFFQ19HUk9VUF9nZXRfb3JkZXIoZ3JvdXAsIG9yZGVyLCBjdHgpKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19TSUdOLCBFUlJfUl9FQ19MSUIpOworCQlnb3RvIGVycjsKKwl9CisJaSA9IEJOX251bV9iaXRzKG9yZGVyKTsKKwkvKiBOZWVkIHRvIHRydW5jYXRlIGRpZ2VzdCBpZiBpdCBpcyB0b28gbG9uZzogZmlyc3QgdHJ1bmNhdGUgd2hvbGUKKwkgKiBieXRlcy4KKwkgKi8KKwlpZiAoOCAqIGRnc3RfbGVuID4gaSkKKwkJZGdzdF9sZW4gPSAoaSArIDcpLzg7CisJaWYgKCFCTl9iaW4yYm4oZGdzdCwgZGdzdF9sZW4sIG0pKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19TSUdOLCBFUlJfUl9CTl9MSUIpOworCQlnb3RvIGVycjsKKwl9CisJLyogSWYgc3RpbGwgdG9vIGxvbmcgdHJ1bmNhdGUgcmVtYWluaW5nIGJpdHMgd2l0aCBhIHNoaWZ0ICovCisJaWYgKCg4ICogZGdzdF9sZW4gPiBpKSAmJiAhQk5fcnNoaWZ0KG0sIG0sIDggLSAoaSAmIDB4NykpKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19TSUdOLCBFUlJfUl9CTl9MSUIpOworCQlnb3RvIGVycjsKKwl9CisJZG8KKwl7CisJCWlmIChpbl9raW52ID09IE5VTEwgfHwgaW5fciA9PSBOVUxMKQorCQl7CisJCQlpZiAoIUVDRFNBX3NpZ25fc2V0dXAoZWNrZXksIGN0eCwgJmtpbnYsICZyZXQtPnIpKQorCQkJeworCQkJCUVDRFNBZXJyKEVDRFNBX0ZfRUNEU0FfRE9fU0lHTixFUlJfUl9FQ0RTQV9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJY2tpbnYgPSBraW52OworCQl9CisJCWVsc2UKKwkJeworCQkJY2tpbnYgID0gaW5fa2ludjsKKwkJCWlmIChCTl9jb3B5KHJldC0+ciwgaW5fcikgPT0gTlVMTCkKKwkJCXsKKwkJCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX0RPX1NJR04sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJCWlmICghQk5fbW9kX211bCh0bXAsIHByaXZfa2V5LCByZXQtPnIsIG9yZGVyLCBjdHgpKQorCQl7CisJCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX0RPX1NJR04sIEVSUl9SX0JOX0xJQik7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoIUJOX21vZF9hZGRfcXVpY2socywgdG1wLCBtLCBvcmRlcikpCisJCXsKKwkJCUVDRFNBZXJyKEVDRFNBX0ZfRUNEU0FfRE9fU0lHTiwgRVJSX1JfQk5fTElCKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmICghQk5fbW9kX211bChzLCBzLCBja2ludiwgb3JkZXIsIGN0eCkpCisJCXsKKwkJCUVDRFNBZXJyKEVDRFNBX0ZfRUNEU0FfRE9fU0lHTiwgRVJSX1JfQk5fTElCKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmIChCTl9pc196ZXJvKHMpKQorCQl7CisJCQkvKiBpZiBraW52IGFuZCByIGhhdmUgYmVlbiBzdXBwbGllZCBieSB0aGUgY2FsbGVyCisJCQkgKiBkb24ndCB0byBnZW5lcmF0ZSBuZXcga2ludiBhbmQgciB2YWx1ZXMgKi8KKwkJCWlmIChpbl9raW52ICE9IE5VTEwgJiYgaW5fciAhPSBOVUxMKQorCQkJeworCQkJCUVDRFNBZXJyKEVDRFNBX0ZfRUNEU0FfRE9fU0lHTiwgRUNEU0FfUl9ORUVEX05FV19TRVRVUF9WQUxVRVMpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCWVsc2UKKwkJCS8qIHMgIT0gMCA9PiB3ZSBoYXZlIGEgdmFsaWQgc2lnbmF0dXJlICovCisJCQlicmVhazsKKwl9CisJd2hpbGUgKDEpOworCisJb2sgPSAxOworZXJyOgorCWlmICghb2spCisJeworCQlFQ0RTQV9TSUdfZnJlZShyZXQpOworCQlyZXQgPSBOVUxMOworCX0KKwlpZiAoY3R4KQorCQlCTl9DVFhfZnJlZShjdHgpOworCWlmIChtKQorCQlCTl9jbGVhcl9mcmVlKG0pOworCWlmICh0bXApCisJCUJOX2NsZWFyX2ZyZWUodG1wKTsKKwlpZiAob3JkZXIpCisJCUJOX2ZyZWUob3JkZXIpOworCWlmIChraW52KQorCQlCTl9jbGVhcl9mcmVlKGtpbnYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZWNkc2FfZG9fdmVyaWZ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkZ3N0X2xlbiwKKwkJY29uc3QgRUNEU0FfU0lHICpzaWcsIEVDX0tFWSAqZWNrZXkpCit7CisJaW50IHJldCA9IC0xLCBpOworCUJOX0NUWCAgICpjdHg7CisJQklHTlVNICAgKm9yZGVyLCAqdTEsICp1MiwgKm0sICpYOworCUVDX1BPSU5UICpwb2ludCA9IE5VTEw7CisJY29uc3QgRUNfR1JPVVAgKmdyb3VwOworCWNvbnN0IEVDX1BPSU5UICpwdWJfa2V5OworCisJLyogY2hlY2sgaW5wdXQgdmFsdWVzICovCisJaWYgKGVja2V5ID09IE5VTEwgfHwgKGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNrZXkpKSA9PSBOVUxMIHx8CisJICAgIChwdWJfa2V5ID0gRUNfS0VZX2dldDBfcHVibGljX2tleShlY2tleSkpID09IE5VTEwgfHwgc2lnID09IE5VTEwpCisJeworCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX0RPX1ZFUklGWSwgRUNEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMpOworCQlyZXR1cm4gLTE7CisJfQorCisJY3R4ID0gQk5fQ1RYX25ldygpOworCWlmICghY3R4KQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIC0xOworCX0KKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlvcmRlciA9IEJOX0NUWF9nZXQoY3R4KTsJCisJdTEgICAgPSBCTl9DVFhfZ2V0KGN0eCk7CisJdTIgICAgPSBCTl9DVFhfZ2V0KGN0eCk7CisJbSAgICAgPSBCTl9DVFhfZ2V0KGN0eCk7CisJWCAgICAgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKCFYKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVSUl9SX0JOX0xJQik7CisJCWdvdG8gZXJyOworCX0KKwkKKwlpZiAoIUVDX0dST1VQX2dldF9vcmRlcihncm91cCwgb3JkZXIsIGN0eCkpCisJeworCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX0RPX1ZFUklGWSwgRVJSX1JfRUNfTElCKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKEJOX2lzX3plcm8oc2lnLT5yKSAgICAgICAgICB8fCBCTl9pc19uZWdhdGl2ZShzaWctPnIpIHx8IAorCSAgICBCTl91Y21wKHNpZy0+ciwgb3JkZXIpID49IDAgfHwgQk5faXNfemVybyhzaWctPnMpICB8fAorCSAgICBCTl9pc19uZWdhdGl2ZShzaWctPnMpICAgICAgfHwgQk5fdWNtcChzaWctPnMsIG9yZGVyKSA+PSAwKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVDRFNBX1JfQkFEX1NJR05BVFVSRSk7CisJCXJldCA9IDA7CS8qIHNpZ25hdHVyZSBpcyBpbnZhbGlkICovCisJCWdvdG8gZXJyOworCX0KKwkvKiBjYWxjdWxhdGUgdG1wMSA9IGludihTKSBtb2Qgb3JkZXIgKi8KKwlpZiAoIUJOX21vZF9pbnZlcnNlKHUyLCBzaWctPnMsIG9yZGVyLCBjdHgpKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVSUl9SX0JOX0xJQik7CisJCWdvdG8gZXJyOworCX0KKwkvKiBkaWdlc3QgLT4gbSAqLworCWkgPSBCTl9udW1fYml0cyhvcmRlcik7CisJLyogTmVlZCB0byB0cnVuY2F0ZSBkaWdlc3QgaWYgaXQgaXMgdG9vIGxvbmc6IGZpcnN0IHRydW5jYXRlIHdob2xlCisJICogYnl0ZXMuCisJICovCisJaWYgKDggKiBkZ3N0X2xlbiA+IGkpCisJCWRnc3RfbGVuID0gKGkgKyA3KS84OworCWlmICghQk5fYmluMmJuKGRnc3QsIGRnc3RfbGVuLCBtKSkKKwl7CisJCUVDRFNBZXJyKEVDRFNBX0ZfRUNEU0FfRE9fVkVSSUZZLCBFUlJfUl9CTl9MSUIpOworCQlnb3RvIGVycjsKKwl9CisJLyogSWYgc3RpbGwgdG9vIGxvbmcgdHJ1bmNhdGUgcmVtYWluaW5nIGJpdHMgd2l0aCBhIHNoaWZ0ICovCisJaWYgKCg4ICogZGdzdF9sZW4gPiBpKSAmJiAhQk5fcnNoaWZ0KG0sIG0sIDggLSAoaSAmIDB4NykpKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVSUl9SX0JOX0xJQik7CisJCWdvdG8gZXJyOworCX0KKwkvKiB1MSA9IG0gKiB0bXAgbW9kIG9yZGVyICovCisJaWYgKCFCTl9tb2RfbXVsKHUxLCBtLCB1Miwgb3JkZXIsIGN0eCkpCisJeworCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX0RPX1ZFUklGWSwgRVJSX1JfQk5fTElCKTsKKwkJZ290byBlcnI7CisJfQorCS8qIHUyID0gciAqIHcgbW9kIHEgKi8KKwlpZiAoIUJOX21vZF9tdWwodTIsIHNpZy0+ciwgdTIsIG9yZGVyLCBjdHgpKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVSUl9SX0JOX0xJQik7CisJCWdvdG8gZXJyOworCX0KKworCWlmICgocG9pbnQgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSA9PSBOVUxMKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJfQorCWlmICghRUNfUE9JTlRfbXVsKGdyb3VwLCBwb2ludCwgdTEsIHB1Yl9rZXksIHUyLCBjdHgpKQorCXsKKwkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVSUl9SX0VDX0xJQik7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKEVDX0dST1VQX21ldGhvZF9vZihncm91cCkpID09IE5JRF9YOV82Ml9wcmltZV9maWVsZCkKKwl7CisJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoZ3JvdXAsCisJCQlwb2ludCwgWCwgTlVMTCwgY3R4KSkKKwkJeworCQkJRUNEU0FlcnIoRUNEU0FfRl9FQ0RTQV9ET19WRVJJRlksIEVSUl9SX0VDX0xJQik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwllbHNlIC8qIE5JRF9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQgKi8KKwl7CisJCWlmICghRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGdyb3VwLAorCQkJcG9pbnQsIFgsIE5VTEwsIGN0eCkpCisJCXsKKwkJCUVDRFNBZXJyKEVDRFNBX0ZfRUNEU0FfRE9fVkVSSUZZLCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisJCisJaWYgKCFCTl9ubm1vZCh1MSwgWCwgb3JkZXIsIGN0eCkpCisJeworCQlFQ0RTQWVycihFQ0RTQV9GX0VDRFNBX0RPX1ZFUklGWSwgRVJSX1JfQk5fTElCKTsKKwkJZ290byBlcnI7CisJfQorCS8qICBpZiB0aGUgc2lnbmF0dXJlIGlzIGNvcnJlY3QgdTEgaXMgZXF1YWwgdG8gc2lnLT5yICovCisJcmV0ID0gKEJOX3VjbXAodTEsIHNpZy0+cikgPT0gMCk7CitlcnI6CisJQk5fQ1RYX2VuZChjdHgpOworCUJOX0NUWF9mcmVlKGN0eCk7CisJaWYgKHBvaW50KQorCQlFQ19QT0lOVF9mcmVlKHBvaW50KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2Vjc19zaWduLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZWNkc2EvZWNzX3NpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNkNWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2Vjc19zaWduLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIGNyeXB0by9lY2RzYS9lY2RzYV9zaWduLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZWNzX2xvY2wuaCIKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK0VDRFNBX1NJRyAqRUNEU0FfZG9fc2lnbihjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGxlbiwgRUNfS0VZICplY2tleSkKK3sKKwlyZXR1cm4gRUNEU0FfZG9fc2lnbl9leChkZ3N0LCBkbGVuLCBOVUxMLCBOVUxMLCBlY2tleSk7Cit9CisKK0VDRFNBX1NJRyAqRUNEU0FfZG9fc2lnbl9leChjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGxlbiwKKwljb25zdCBCSUdOVU0gKmtpbnYsIGNvbnN0IEJJR05VTSAqcnAsIEVDX0tFWSAqZWNrZXkpCit7CisJRUNEU0FfREFUQSAqZWNkc2EgPSBlY2RzYV9jaGVjayhlY2tleSk7CisJaWYgKGVjZHNhID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBlY2RzYS0+bWV0aC0+ZWNkc2FfZG9fc2lnbihkZ3N0LCBkbGVuLCBraW52LCBycCwgZWNrZXkpOworfQorCitpbnQgRUNEU0Ffc2lnbihpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwgaW50IGRsZW4sIHVuc2lnbmVkIGNoYXIgCisJCSpzaWcsIHVuc2lnbmVkIGludCAqc2lnbGVuLCBFQ19LRVkgKmVja2V5KQoreworCXJldHVybiBFQ0RTQV9zaWduX2V4KHR5cGUsIGRnc3QsIGRsZW4sIHNpZywgc2lnbGVuLCBOVUxMLCBOVUxMLCBlY2tleSk7Cit9CisKK2ludCBFQ0RTQV9zaWduX2V4KGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGxlbiwgdW5zaWduZWQgY2hhciAKKwkqc2lnLCB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgY29uc3QgQklHTlVNICpraW52LCBjb25zdCBCSUdOVU0gKnIsIAorCUVDX0tFWSAqZWNrZXkpCit7CisJRUNEU0FfU0lHICpzOworCVJBTkRfc2VlZChkZ3N0LCBkbGVuKTsKKwlzID0gRUNEU0FfZG9fc2lnbl9leChkZ3N0LCBkbGVuLCBraW52LCByLCBlY2tleSk7CisJaWYgKHMgPT0gTlVMTCkKKwl7CisJCSpzaWdsZW49MDsKKwkJcmV0dXJuIDA7CisJfQorCSpzaWdsZW4gPSBpMmRfRUNEU0FfU0lHKHMsICZzaWcpOworCUVDRFNBX1NJR19mcmVlKHMpOworCXJldHVybiAxOworfQorCitpbnQgRUNEU0Ffc2lnbl9zZXR1cChFQ19LRVkgKmVja2V5LCBCTl9DVFggKmN0eF9pbiwgQklHTlVNICoqa2ludnAsIAorCQlCSUdOVU0gKipycCkKK3sKKwlFQ0RTQV9EQVRBICplY2RzYSA9IGVjZHNhX2NoZWNrKGVja2V5KTsKKwlpZiAoZWNkc2EgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGVjZHNhLT5tZXRoLT5lY2RzYV9zaWduX3NldHVwKGVja2V5LCBjdHhfaW4sIGtpbnZwLCBycCk7IAorfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VjZHNhL2Vjc192cmYuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY3NfdnJmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5YWNmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lY2RzYS9lY3NfdnJmLmMKQEAgLTAsMCArMSw5NiBAQAorLyogY3J5cHRvL2VjZHNhL2VjZHNhX3ZyZi5jICovCisvKgorICogV3JpdHRlbiBieSBOaWxzIExhcnNjaCBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdAorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImVjc19sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorCisvKiByZXR1cm5zCisgKiAgICAgIDE6IGNvcnJlY3Qgc2lnbmF0dXJlCisgKiAgICAgIDA6IGluY29ycmVjdCBzaWduYXR1cmUKKyAqICAgICAtMTogZXJyb3IKKyAqLworaW50IEVDRFNBX2RvX3ZlcmlmeShjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sIAorCQljb25zdCBFQ0RTQV9TSUcgKnNpZywgRUNfS0VZICplY2tleSkKKwl7CisJRUNEU0FfREFUQSAqZWNkc2EgPSBlY2RzYV9jaGVjayhlY2tleSk7CisJaWYgKGVjZHNhID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiBlY2RzYS0+bWV0aC0+ZWNkc2FfZG9fdmVyaWZ5KGRnc3QsIGRnc3RfbGVuLCBzaWcsIGVja2V5KTsKKwl9CisKKy8qIHJldHVybnMKKyAqICAgICAgMTogY29ycmVjdCBzaWduYXR1cmUKKyAqICAgICAgMDogaW5jb3JyZWN0IHNpZ25hdHVyZQorICogICAgIC0xOiBlcnJvcgorICovCitpbnQgRUNEU0FfdmVyaWZ5KGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ2J1ZiwgaW50IHNpZ19sZW4sIEVDX0tFWSAqZWNrZXkpCisgCXsKKwlFQ0RTQV9TSUcgKnM7CisJaW50IHJldD0tMTsKKworCXMgPSBFQ0RTQV9TSUdfbmV3KCk7CisJaWYgKHMgPT0gTlVMTCkgcmV0dXJuKHJldCk7CisJaWYgKGQyaV9FQ0RTQV9TSUcoJnMsICZzaWdidWYsIHNpZ19sZW4pID09IE5VTEwpIGdvdG8gZXJyOworCXJldD1FQ0RTQV9kb192ZXJpZnkoZGdzdCwgZGdzdF9sZW4sIHMsIGVja2V5KTsKK2VycjoKKwlFQ0RTQV9TSUdfZnJlZShzKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL1JFQURNRSBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjliNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL1JFQURNRQpAQCAtMCwwICsxLDIxMSBAQAorTm90ZXM6IDIwMDEtMDktMjQKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgImRlc2NyaXB0aW9uIiAoaWYgb25lIGNob29zZXMgdG8gY2FsbCBpdCB0aGF0KSBuZWVkZWQgc29tZSBtYWpvciB1cGRhdGluZworc28gaGVyZSBnb2VzLiBUaGlzIHVwZGF0ZSBhZGRyZXNzZXMgYSBjaGFuZ2UgYmVpbmcgbWFkZSBhdCB0aGUgc2FtZSB0aW1lIHRvCitPcGVuU1NMLCBhbmQgaXQgcHJldHR5IG11Y2ggY29tcGxldGVseSByZXN0cnVjdHVyZXMgdGhlIHVuZGVybHlpbmcgbWVjaGFuaWNzIG9mCit0aGUgIkVOR0lORSIgY29kZS4gU28gaXQgc2VydmVzIGEgZG91YmxlIHB1cnBvc2Ugb2YgYmVpbmcgYSAiRU5HSU5FIGludGVybmFscworZm9yIG1hc29jaGlzdHMiIGRvY3VtZW50ICphbmQqIGEgcmF0aGVyIGV4dGVuc2l2ZSBjb21taXQgbG9nIG1lc3NhZ2UuIChJJ2QgZ2V0CitseW5jaGVkIGZvciBzdGlja2luZyBhbGwgdGhpcyBpbiBDSEFOR0VTIG9yIHRoZSBjb21taXQgbWFpbHMgOi0pLgorCitFTkdJTkVfVEFCTEUgdW5kZXJsaWVzIHRoaXMgcmVzdHJ1Y3R1cmluZywgYXMgZGVzY3JpYmVkIGluIHRoZSBpbnRlcm5hbCBoZWFkZXIKKyJlbmdfaW50LmgiLCBpbXBsZW1lbnRlZCBpbiBlbmdfdGFibGUuYywgYW5kIHVzZWQgaW4gZWFjaCBvZiB0aGUgImNsYXNzIiBmaWxlczsKK3RiX3JzYS5jLCB0Yl9kc2EuYywgZXRjLgorCitIb3dldmVyLCAiRVZQX0NJUEhFUiIgdW5kZXJsaWVzIHRoZSBtb3RpdmF0aW9uIGFuZCBkZXNpZ24gb2YgRU5HSU5FX1RBQkxFIHNvCitJJ2xsIG1lbnRpb24gYSBiaXQgYWJvdXQgdGhhdCBmaXJzdC4gRVZQX0NJUEhFUiAoYW5kIG1vc3Qgb2YgdGhpcyBhcHBsaWVzCitlcXVhbGx5IHRvIEVWUF9NRCBmb3IgZGlnZXN0cykgaXMgYm90aCBhICJtZXRob2QiIGFuZCBhIGFsZ29yaXRobS9tb2RlCitpZGVudGlmaWVyIHRoYXQsIGluIHRoZSBjdXJyZW50IEFQSSwgImxpbmdlcnMiLiBUaGVzZSBjaXBoZXIgZGVzY3JpcHRpb24gKworaW1wbGVtZW50YXRpb24gc3RydWN0dXJlcyBjYW4gYmUgZGVmaW5lZCBvciBvYnRhaW5lZCBkaXJlY3RseSBieSBhcHBsaWNhdGlvbnMsCitvciBjYW4gYmUgbG9hZGVkICJlbiBtYXNzZSIgaW50byBFVlAgc3RvcmFnZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGNhdGFsb2d1ZWQgYW5kCitzZWFyY2hlZCBpbiB2YXJpb3VzIHdheXMsIGllLiB0d28gd2F5cyBvZiBlbmNyeXB0aW5nIHdpdGggdGhlICJkZXNfY2JjIgorYWxnb3JpdGhtL21vZGUgcGFpciBhcmU7CisKKyhpKSBkaXJlY3RseTsKKyAgICAgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyID0gRVZQX2Rlc19jYmMoKTsKKyAgICAgRVZQX0VuY3J5cHRJbml0KCZjdHgsIGNpcGhlciwga2V5LCBpdik7CisgICAgIFsgLi4uIHVzZSBFVlBfRW5jcnlwdFVwZGF0ZSgpIGFuZCBFVlBfRW5jcnlwdEZpbmFsKCkgLi4uXQorCisoaWkpIGluZGlyZWN0bHk7IAorICAgICBPcGVuU1NMX2FkZF9hbGxfY2lwaGVycygpOworICAgICBjaXBoZXIgPSBFVlBfZ2V0X2NpcGhlcmJ5bmFtZSgiZGVzX2NiYyIpOworICAgICBFVlBfRW5jcnlwdEluaXQoJmN0eCwgY2lwaGVyLCBrZXksIGl2KTsKKyAgICAgWyAuLi4gZXRjIC4uLiBdCisKK1RoZSBsYXR0ZXIgaXMgbW9yZSBnZW5lcmFsbHkgdXNlZCBiZWNhdXNlIGl0IGFsc28gYWxsb3dzIGNpcGhlcnMvZGlnZXN0cyB0byBiZQorbG9va2VkIHVwIGJhc2VkIG9uIG90aGVyIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSB1c2VmdWwgZm9yIGF1dG9tYXRpYyBjaXBoZXIKK3NlbGVjdGlvbiwgZWcuIGluIFNTTC9UTFMsIG9yIGJ5IHVzZXItY29udHJvbGxhYmxlIGNvbmZpZ3VyYXRpb24uCisKK1RoZSBpbXBvcnRhbnQgcG9pbnQgYWJvdXQgdGhpcyBpcyB0aGF0IEVWUF9DSVBIRVIgZGVmaW5pdGlvbnMgYW5kIHN0cnVjdHVyZXMgYXJlCitwYXNzZWQgYXJvdW5kIHdpdGggaW1wdW5pdHkgYW5kIHRoZXJlIGlzIG5vIHNhZmUgd2F5LCB3aXRob3V0IHJlcXVpcmluZyBtYXNzaXZlCityZXdyaXRlcyBvZiBtYW55IGFwcGxpY2F0aW9ucywgdG8gYXNzdW1lIHRoYXQgRVZQX0NJUEhFUnMgY2FuIGJlIHJlZmVyZW5jZQorY291bnRlZC4gT25lIGFuIEVWUF9DSVBIRVIgaXMgZXhwb3NlZCB0byB0aGUgY2FsbGVyLCBuZWl0aGVyIGl0IG5vciBhbnl0aGluZyBpdAorY29tZXMgZnJvbSBjYW4gInNhZmVseSIgYmUgZGVzdHJveWVkLiBVbmxlc3Mgb2YgY291cnNlIHRoZSB3YXkgb2YgZ2V0dGluZyB0bworc3VjaCBjaXBoZXJzIGlzIHZpYSBlbnRpcmVseSBkaXN0aW5jdCBBUEkgY2FsbHMgdGhhdCBkaWRuJ3QgZXhpc3QgYmVmb3JlLgorSG93ZXZlciBleGlzdGluZyBBUEkgdXNhZ2UgY2Fubm90IGJlIG1hZGUgdG8gdW5kZXJzdGFuZCB3aGVuIGFuIEVWUF9DSVBIRVIKK3BvaW50ZXIsIHRoYXQgaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBjYWxsZXIsIGlzIG5vIGxvbmdlciBiZWluZyB1c2VkLgorCitUaGUgb3RoZXIgcHJvYmxlbSB3aXRoIHRoZSBleGlzdGluZyBBUEkgdy5yLnQuIHRvIGhvb2tpbmcgRVZQX0NJUEhFUiBzdXBwb3J0CitpbnRvIEVOR0lORSBpcyBzdG9yYWdlIC0gdGhlIE9CSl9OQU1FLWJhc2VkIHN0b3JhZ2UgdXNlZCBieSBFVlAgdG8gcmVnaXN0ZXIKK2NpcGhlcnMgc2ltdWx0YW5lb3VzbHkgcmVnaXN0ZXJzIGNpcGhlciAqdHlwZXMqIGFuZCBjaXBoZXIgKmltcGxlbWVudGF0aW9ucyogLQordGhleSBhcmUgZWZmZWN0aXZlbHkgdGhlIHNhbWUgdGhpbmcsIGFuICJFVlBfQ0lQSEVSIiBwb2ludGVyLiBUaGUgcHJvYmxlbSB3aXRoCitob29raW5nIGluIEVOR0lORXMgaXMgdGhhdCBtdWx0aXBsZSBFTkdJTkVzIG1heSBpbXBsZW1lbnQgdGhlIHNhbWUgY2lwaGVycy4gVGhlCitzb2x1dGlvbiBpcyBuZWNlc3NhcmlseSB0aGF0IEVOR0lORS1wcm92aWRlZCBjaXBoZXJzIHNpbXBseSBhcmUgbm90IHJlZ2lzdGVyZWQsCitzdG9yZWQsIG9yIGV4cG9zZWQgdG8gdGhlIGNhbGxlciBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgZXhpc3RpbmcgY2lwaGVycy4gVGhpcyBpcworZXNwZWNpYWxseSBuZWNlc3NhcnkgY29uc2lkZXJpbmcgdGhlIGZhY3QgRU5HSU5FIHVzZXMgcmVmZXJlbmNlIGNvdW50cyB0byBhbGxvdworZm9yIGNsZWFudXAsIG1vZHVsYXJpdHksIGFuZCBEU08gc3VwcG9ydCAtIHlldCBFVlBfQ0lQSEVScywgYXMgZXhwb3NlZCB0bworY2FsbGVycyBpbiB0aGUgY3VycmVudCBBUEksIHN1cHBvcnQgbm8gc3VjaCBjb250cm9scy4KKworQW5vdGhlciBzdGlja2luZyBwb2ludCBmb3IgaW50ZWdyYXRpbmcgY2lwaGVyIHN1cHBvcnQgaW50byBFTkdJTkUgaXMgbGlua2FnZS4KK0FscmVhZHkgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggdGhlIHdheSBFTkdJTkUgc3VwcG9ydHMgUlNBLCBEU0EsIGV0YyB3aGVyZWJ5Cit0aGV5IGFyZSBhdmFpbGFibGUgKmJlY2F1c2UqIHRoZXkncmUgcGFydCBvZiBhIGdpYW50IEVOR0lORSBjYWxsZWQgIm9wZW5zc2wiLgorSWUuIGFsbCBpbXBsZW1lbnRhdGlvbnMgKmhhdmUqIHRvIGNvbWUgZnJvbSBhbiBFTkdJTkUsIGJ1dCB3ZSBnZXQgcm91bmQgdGhhdCBieQoraGF2aW5nIGEgZ2lhbnQgRU5HSU5FIHdpdGggYWxsIHRoZSBzb2Z0d2FyZSBzdXBwb3J0IGVuY2Fwc3VsYXRlZC4gVGhpcyBjcmVhdGVzCitsaW5rZXIgaGFzc2xlcyBpZiBub3RoaW5nIGVsc2UgLSBsaW5raW5nIGEgMS1saW5lIGFwcGxpY2F0aW9uIHRoYXQgY2FsbHMgMiBiYXNpYworUlNBIGZ1bmN0aW9ucyAoZWcuICJSU0FfZnJlZShSU0FfbmV3KCkpOyIpIHdpbGwgcmVzdWx0IGluIGxhcmdlIHF1YW50aXRpZXMgb2YKK0VOR0lORSBjb2RlIGJlaW5nIGxpbmtlZCBpbiAqYW5kKiBiZWNhdXNlIG9mIHRoYXQgRFNBLCBESCwgYW5kIFJBTkQgYWxzby4gSWYgd2UKK2NvbnRpbnVlIHdpdGggdGhpcyBhcHByb2FjaCBmb3IgRVZQX0NJUEhFUiBzdXBwb3J0IChldmVuIGlmIGl0ICp3YXMqIHBvc3NpYmxlKQord2Ugd291bGQgbG9zZSBvdXIgYWJpbGl0eSB0byBsaW5rIHNlbGVjdGl2ZWx5IGJ5IHNlbGVjdGl2ZWx5IGxvYWRpbmcgY2VydGFpbgoraW1wbGVtZW50YXRpb25zIG9mIGNlcnRhaW4gZnVuY3Rpb25hbGl0eS4gVG91Y2hpbmcgYW55IHBhcnQgb2YgYW55IGtpbmQgb2YKK2NyeXB0byB3b3VsZCByZXN1bHQgaW4gbWFzc2l2ZSBzdGF0aWMgbGlua2FnZSBvZiBldmVyeXRoaW5nIGVsc2UuIFNvIHRoZQorc29sdXRpb24gaXMgdG8gY2hhbmdlIHRoZSB3YXkgRU5HSU5FIGZlZWRzIGV4aXN0aW5nICJjbGFzc2VzIiwgaWUuIGhvdyB0aGUKK2hvb2tpbmcgdG8gRU5HSU5FIHdvcmtzIGZyb20gUlNBLCBEU0EsIERILCBSQU5ELCBhcyB3ZWxsIGFzIGFkZGluZyBuZXcgaG9va2luZworZm9yIEVWUF9DSVBIRVIsIGFuZCBFVlBfTUQuCisKK1RoZSB3YXkgdGhpcyBpcyBub3cgYmVpbmcgZG9uZSBpcyBieSBtb3N0bHkgcmV2ZXJ0aW5nIGJhY2sgdG8gaG93IHRoaW5ncyB1c2VkIHRvCit3b3JrIHByaW9yIHRvIEVOR0lORSA6LSkuIEllLiBSU0Egbm93IGhhcyBhICJSU0FfTUVUSE9EIiBwb2ludGVyIGFnYWluIC0gdGhpcword2FzIHByZXZpb3VzbHkgcmVwbGFjZWQgYnkgYW4gIkVOR0lORSIgcG9pbnRlciBhbmQgYWxsIFJTQSBjb2RlIHRoYXQgcmVxdWlyZWQKK3RoZSBSU0FfTUVUSE9EIHdvdWxkIGNhbGwgRU5HSU5FX2dldF9SU0EoKSBlYWNoIHRpbWUgb24gaXRzIEVOR0lORSBoYW5kbGUgdG8KK3RlbXBvcmFyaWx5IGdldCBhbmQgdXNlIHRoZSBFTkdJTkUncyBSU0EgaW1wbGVtZW50YXRpb24uIEFwYXJ0IGZyb20gYmVpbmcgbW9yZQorZWZmaWNpZW50LCBzd2l0Y2hpbmcgYmFjayB0byBlYWNoIFJTQSBoYXZpbmcgYW4gUlNBX01FVEhPRCBwb2ludGVyIGFsc28gYWxsb3dzCit1cyB0byBjb25jZWl2YWJseSBvcGVyYXRlIHdpdGggKm5vKiBFTkdJTkUuIEFzIHdlJ2xsIHNlZSwgdGhpcyByZW1vdmVzIGFueSBuZWVkCitmb3IgYSBmYWxsYmFjayBFTkdJTkUgdGhhdCBlbmNhcHN1bGF0ZXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgLSB3ZSBjYW4gc2ltcGx5CitoYXZlIG91ciBSU0Egc3RydWN0dXJlIHBvaW50aW5nIGl0cyBSU0FfTUVUSE9EIHBvaW50ZXIgdG8gdGhlIHNvZnR3YXJlCitpbXBsZW1lbnRhdGlvbiBhbmQgaGF2ZSBpdHMgRU5HSU5FIHBvaW50ZXIgc2V0IHRvIE5VTEwuCisKK0EgbG9vayBhdCB0aGUgRVZQX0NJUEhFUiBob29raW5nIGlzIG1vc3QgZXhwbGFuYXRvcnksIHRoZSBSU0EsIERTQSAoZXRjKSBjYXNlcwordHVybiBvdXQgdG8gYmUgZGVnZW5lcmF0ZSBmb3JtcyBvZiB0aGUgc2FtZSB0aGluZy4gVGhlIEVWUCBzdG9yYWdlIG9mIGNpcGhlcnMsCithbmQgdGhlIGV4aXN0aW5nIEVWUCBBUEkgZnVuY3Rpb25zIHRoYXQgcmV0dXJuICJzb2Z0d2FyZSIgaW1wbGVtZW50YXRpb25zIGFuZAorZGVzY3JpcHRpb25zIHJlbWFpbiB1bnRvdWNoZWQuIEhvd2V2ZXIsIHRoZSBzdG9yYWdlIHRha2VzIG1vcmUgbWVhbmluZyBpbiB0ZXJtcworb2YgImNpcGhlciBkZXNjcmlwdGlvbiIgYW5kIGxlc3MgbWVhbmluZyBpbiB0ZXJtcyBvZiAiaW1wbGVtZW50YXRpb24iLiBXaGVuIGFuCitFVlBfQ0lQSEVSX0NUWCBpcyBhY3R1YWxseSBpbml0aWFsaXNlZCB3aXRoIGFuIEVWUF9DSVBIRVIgbWV0aG9kIGFuZCBpcyBhYm91dCB0bworYmVnaW4gZW4vZGVjcnlwdGlvbiwgdGhlIGhvb2tpbmcgdG8gRU5HSU5FIGNvbWVzIGludG8gcGxheS4gV2hhdCBoYXBwZW5zIGlzIHRoYXQKK2NpcGhlci1zcGVjaWZpYyBFTkdJTkUgY29kZSBpcyBhc2tlZCBmb3IgYW4gRU5HSU5FIHBvaW50ZXIgKGEgZnVuY3Rpb25hbAorcmVmZXJlbmNlKSBmb3IgYW55IEVOR0lORSB0aGF0IGlzIHJlZ2lzdGVyZWQgdG8gcGVyZm9ybSB0aGUgYWxnby9tb2RlIHRoYXQgdGhlCitwcm92aWRlZCBFVlBfQ0lQSEVSIHN0cnVjdHVyZSByZXByZXNlbnRzLiBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdGhhdAorRU5HSU5FIGNvZGUgd2lsbCByZXR1cm4gTlVMTCBiZWNhdXNlIG5vIEVOR0lORXMgd2lsbCBoYXZlIGhhZCBhbnkgY2lwaGVyCitpbXBsZW1lbnRhdGlvbnMgKnJlZ2lzdGVyZWQqLiBBcyBzdWNoLCBhIE5VTEwgRU5HSU5FIHBvaW50ZXIgaXMgc3RvcmVkIGluIHRoZQorRVZQX0NJUEhFUl9DVFggY29udGV4dCwgYW5kIHRoZSBFVlBfQ0lQSEVSIHN0cnVjdHVyZSBpcyBsZWZ0IGhvb2tlZCBpbnRvIHRoZQorY29udGV4dCBhbmQgc28gaXMgdXNlZCBhcyB0aGUgaW1wbGVtZW50YXRpb24uIFByZXR0eSBtdWNoIGhvdyB0aGluZ3Mgd29yayBub3cKK2V4Y2VwdCB3ZSdkIGhhdmUgYSByZWR1bmRhbnQgRU5HSU5FIHBvaW50ZXIgc2V0IHRvIE5VTEwgYW5kIGRvaW5nIG5vdGhpbmcuCisKK0NvbnZlcnNlbHksIGlmIGFuIEVOR0lORSAqaGFzKiBiZWVuIHJlZ2lzdGVyZWQgdG8gcGVyZm9ybSB0aGUgYWxnb3JpdGhtL21vZGUKK2NvbWJpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSBwcm92aWRlZCBFVlBfQ0lQSEVSLCB0aGVuIGEgZnVuY3Rpb25hbCByZWZlcmVuY2UKK3RvIHRoYXQgRU5HSU5FIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIEVWUF9DSVBIRVJfQ1RYIGR1cmluZyBpbml0aWFsaXNhdGlvbi4KK1RoYXQgZnVuY3Rpb25hbCByZWZlcmVuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGNvbnRleHQgKGFuZCByZWxlYXNlZCBvbgorY2xlYW51cCkgLSBhbmQgaGF2aW5nIHRoYXQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgKnNhZmUqIHdheSB0byB1c2UgYW4gRVZQX0NJUEhFUgorZGVmaW5pdGlvbiB0aGF0IGlzIHByaXZhdGUgdG8gdGhlIEVOR0lORS4gSWUuIHRoZSBFVlBfQ0lQSEVSIHByb3ZpZGVkIGJ5IHRoZQorYXBwbGljYXRpb24gd2lsbCBhY3R1YWxseSBiZSByZXBsYWNlZCBieSBhbiBFVlBfQ0lQSEVSIGZyb20gdGhlIHJlZ2lzdGVyZWQKK0VOR0lORSAtIGl0IHdpbGwgc3VwcG9ydCB0aGUgc2FtZSBhbGdvcml0aG0vbW9kZSBhcyB0aGUgb3JpZ2luYWwgYnV0IHdpbGwgYmUgYQorY29tcGxldGVseSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uIEJlY2F1c2UgdGhpcyBFVlBfQ0lQSEVSIGlzbid0IHN0b3JlZCBpbiB0aGUKK0VWUCBzdG9yYWdlLCBub3IgaXMgaXQgcmV0dXJuZWQgdG8gYXBwbGljYXRpb25zIGZyb20gdHJhZGl0aW9uYWwgQVBJIGZ1bmN0aW9ucywKK3RoZXJlIGlzIG5vIGFzc29jaWF0ZWQgcHJvYmxlbSB3aXRoIGl0IG5vdCBoYXZpbmcgcmVmZXJlbmNlIGNvdW50cy4gQW5kIG9mCitjb3Vyc2UsIHdoZW4gb25lIG9mIHRoZXNlICJwcml2YXRlIiBjaXBoZXIgaW1wbGVtZW50YXRpb25zIGlzIGhvb2tlZCBpbnRvCitFVlBfQ0lQSEVSX0NUWCwgaXQgaXMgZG9uZSB3aGlsc3QgdGhlIEVWUF9DSVBIRVJfQ1RYIGhvbGRzIGEgZnVuY3Rpb25hbAorcmVmZXJlbmNlIHRvIHRoZSBFTkdJTkUgdGhhdCBvd25zIGl0LCB0aHVzIHRoZSB1c2Ugb2YgdGhlIEVOR0lORSdzIEVWUF9DSVBIRVIgaXMKK3NhZmUuCisKK1RoZSAiY2lwaGVyLXNwZWNpZmljIEVOR0lORSBjb2RlIiBJIG1lbnRpb25lZCBpcyBpbXBsZW1lbnRlZCBpbiB0Yl9jaXBoZXIuYyBidXQKK2luIGVzc2VuY2UgaXQgaXMgc2ltcGx5IGFuIGluc3RhbnRpYXRpb24gb2YgIkVOR0lORV9UQUJMRSIgY29kZSBmb3IgdXNlIGJ5CitFVlBfQ0lQSEVSIGNvZGUuIHRiX2RpZ2VzdC5jIGlzIHZpcnR1YWxseSBpZGVudGljYWwgYnV0LCBvZiBjb3Vyc2UsIGl0IGlzIGZvcgordXNlIGJ5IEVWUF9NRCBjb2RlLiBEaXR0byBmb3IgdGJfcnNhLmMsIHRiX2RzYS5jLCBldGMuIFRoZXNlIGluc3RhbnRpYXRpb25zIG9mCitFTkdJTkVfVEFCTEUgZXNzZW50aWFsbHkgcHJvdmlkZSBsaW5rZXItc2VwYXJhdGlvbiBvZiB0aGUgY2xhc3NlcyBzbyB0aGF0IGV2ZW4KK2lmIEVOR0lORXMgaW1wbGVtZW50ICphbGwqIHBvc3NpYmxlIGFsZ29yaXRobXMsIGFuIGFwcGxpY2F0aW9uIHVzaW5nIG9ubHkKK0VWUF9DSVBIRVIgY29kZSB3aWxsIGxpbmsgYXQgbW9zdCBjb2RlIHJlbGF0aW5nIHRvIEVWUF9DSVBIRVIsIHRiX2NpcGhlci5jLCBjb3JlCitFTkdJTkUgY29kZSB0aGF0IGlzIGluZGVwZW5kYW50IG9mIGNsYXNzLCBhbmQgb2YgY291cnNlIHRoZSBFTkdJTkUKK2ltcGxlbWVudGF0aW9uIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGxvYWRlZC4gSXQgd2lsbCAqbm90KiBob3dldmVyIGxpbmsgYW55CitjbGFzcy1zcGVjaWZpYyBFTkdJTkUgY29kZSBmb3IgZGlnZXN0cywgUlNBLCBldGMgbm9yIHdpbGwgaXQgYmxlZWQgb3ZlciBpbnRvCitvdGhlciBBUElzLCBzdWNoIGFzIHRoZSBSU0EvRFNBL2V0YyBsaWJyYXJ5IGNvZGUuCisKK0VOR0lORV9UQUJMRSBpcyBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gbWF5IHNlZW0gbmVjZXNzYXJ5IGJ1dCB0aGlzIGlzCittb3N0bHkgdG8gYXZvaWQgYSBsb3Qgb2YgImluaXQoKSItdGhyYXNoaW5nIG9uIEVOR0lORXMgKHRoYXQgbWF5IGhhdmUgdG8gbG9hZAorRFNPcywgYW5kIG90aGVyIGV4cGVuc2l2ZSBzZXR1cCB0aGF0IHNob3VsZG4ndCBiZSB0aHJhc2hlZCB1bm5lY2Vzc2FyaWx5KSAqYW5kKgordG8gZHVwbGljYXRlICJkZWZhdWx0IiBiZWhhdmlvdXIuIEJhc2ljYWxseSBhbiBFTkdJTkVfVEFCTEUgaW5zdGFudGlhdGlvbiwgZm9yCitleGFtcGxlIHRiX2NpcGhlci5jLCBpbXBsZW1lbnRzIGEgaGFzaC10YWJsZSBrZXllZCBieSBpbnRlZ2VyICJuaWQiIHZhbHVlcy4KK1RoZXNlIG5pZHMgcHJvdmlkZSB0aGUgdW5pcXVlbm5lc3Mgb2YgYW4gYWxnb3JpdGhtL21vZGUgLSBhbmQgZWFjaCBuaWQgd2lsbCBoYXNoCit0byBhIHBvdGVudGlhbGx5IE5VTEwgIkVOR0lORV9QSUxFIi4gQW4gRU5HSU5FX1BJTEUgaXMgZXNzZW50aWFsbHkgYSBsaXN0IG9mCitwb2ludGVycyB0byBFTkdJTkVzIHRoYXQgaW1wbGVtZW50IHRoYXQgcGFydGljdWxhciAnbmlkJy4gRWFjaCAicGlsZSIgdXNlcyBzb21lCitjYWNoaW5nIHRyaWNrcyBzdWNoIHRoYXQgcmVxdWVzdHMgb24gdGhhdCAnbmlkJyB3aWxsIGJlIGNhY2hlZCBhbmQgYWxsIGZ1dHVyZQorcmVxdWVzdHMgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgKHdlbGwsIGF0IGxlYXN0IHdpdGggbWluaW1hbCBvcGVyYXRpb24pIHVubGVzcworYSBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgcGlsZSwgZWcuIHBlcmhhcHMgYW4gRU5HSU5FIHdhcyB1bmxvYWRlZC4gVGhlIHJlYXNvbiBpcwordGhhdCBhbiBhcHBsaWNhdGlvbiBjb3VsZCBoYXZlIHN1cHBvcnQgZm9yIDEwIEVOR0lORXMgc3RhdGljYWxseSBsaW5rZWQKK2luLCBhbmQgdGhlIG1hY2hpbmUgaW4gcXVlc3Rpb24gbWF5IG5vdCBoYXZlIGFueSBvZiB0aGUgaGFyZHdhcmUgdGhvc2UgMTAKK0VOR0lORXMgc3VwcG9ydC4gSWYgZWFjaCBvZiB0aG9zZSBFTkdJTkVzIGhhcyBhICJkZXNfY2JjIiBpbXBsZW1lbnRhdGlvbiwgd2UKK3dhbnQgdG8gYXZvaWQgZXZlcnkgRVZQX0NJUEhFUl9DVFggc2V0dXAgZnJvbSB0cnlpbmcgKGFuZCBmYWlsaW5nKSB0byBpbml0aWFsaXNlCitlYWNoIG9mIHRob3NlIDEwIEVOR0lORXMuIEluc3RlYWQsIHRoZSBmaXJzdCBzdWNoIHJlcXVlc3Qgd2lsbCB0cnkgdG8gZG8gdGhhdAorYW5kIHdpbGwgZWl0aGVyIHJldHVybiAoYW5kIGNhY2hlKSBhIE5VTEwgRU5HSU5FIHBvaW50ZXIgb3Igd2lsbCByZXR1cm4gYQorZnVuY3Rpb25hbCByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IHRoYXQgc3VjY2Vzc2Z1bGx5IGluaXRpYWxpc2VkLiBJbiB0aGUgbGF0dGVyCitjYXNlIGl0IHdpbGwgYWxzbyBjYWNoZSBhbiBleHRyYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSB0byB0aGUgRU5HSU5FIGFzIGEKKyJkZWZhdWx0IiBmb3IgdGhhdCAnbmlkJy4gVGhlIGNhY2hpbmcgaXMgYWNrbm93bGVkZ2VkIGJ5IGEgJ3VwdG9kYXRlJyB2YXJpYWJsZQordGhhdCBpcyB1bnNldCBvbmx5IGlmIHVuL3JlZ2lzdHJhdGlvbiB0YWtlcyBwbGFjZSBvbiB0aGF0IHBpbGUuIEllLiBpZgoraW1wbGVtZW50YXRpb25zIG9mICJkZXNfY2JjIiBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4gVGhpcyBiZWhhdmlvdXIgY2FuIGJlCit0d2Vha2VkOyB0aGUgRU5HSU5FX1RBQkxFX0ZMQUdfTk9JTklUIHZhbHVlIGNhbiBiZSBwYXNzZWQgdG8KK0VOR0lORV9zZXRfdGFibGVfZmxhZ3MoKSwgaW4gd2hpY2ggY2FzZSB0aGUgb25seSBFTkdJTkVzIHRoYXQgdGJfY2lwaGVyLmMgd2lsbAordHJ5IHRvIGluaXRpYWxpc2UgZnJvbSB0aGUgInBpbGUiIHdpbGwgYmUgdGhvc2UgdGhhdCBhcmUgYWxyZWFkeSBpbml0aWFsaXNlZAorKGllLiBpdCdzIHNpbXBseSBhbiBpbmNyZW1lbnQgb2YgdGhlIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGNvdW50LCBhbmQgbm8gcmVhbAorImluaXRpYWxpc2F0aW9uIiB3aWxsIHRha2UgcGxhY2UpLgorCitSU0EsIERTQSwgREgsIGFuZCBSQU5EIGFsbCBoYXZlIHRoZWlyIG93biBFTkdJTkVfVEFCTEUgY29kZSBhcyB3ZWxsLCBhbmQgdGhlCitkaWZmZXJlbmNlIGlzIHRoYXQgdGhleSBhbGwgdXNlIGFuIGltcGxpY2l0ICduaWQnIG9mIDEuIFdoZXJlYXMgRVZQX0NJUEhFUnMgYXJlCithY3R1YWxseSBxdWFsaXRhdGl2ZWx5IGRpZmZlcmVudCBkZXBlbmRpbmcgb24gJ25pZCcgKHRoZSAiZGVzX2NiYyIgRVZQX0NJUEhFUiBpcworbm90IGFuIGludGVyb3BlcmFibGUgaW1wbGVtZW50YXRpb24gb2YgImFlc18yNTZfY2JjIiksIFJTQV9NRVRIT0RzIGFyZQorbmVjZXNzYXJpbHkgaW50ZXJvcGVyYWJsZSBhbmQgZG9uJ3QgaGF2ZSBkaWZmZXJlbnQgZmxhdm91cnMsIG9ubHkgZGlmZmVyZW50CitpbXBsZW1lbnRhdGlvbnMuIEluIG90aGVyIHdvcmRzLCB0aGUgRU5HSU5FX1RBQkxFIGZvciBSU0Egd2lsbCBlaXRoZXIgYmUgZW1wdHksCitvciB3aWxsIGhhdmUgYSBzaW5nbGUgRU5HSU5HX1BJTEUgaGFzaGVkIHRvIGJ5IHRoZSAnbmlkJyAxIGFuZCB0aGF0IHBpbGUKK3JlcHJlc2VudHMgRU5HSU5FcyB0aGF0IGltcGxlbWVudCB0aGUgc2luZ2xlICJ0eXBlIiBvZiBSU0EgdGhlcmUgaXMuCisKK0NsZWFudXAgLSB0aGUgcmVnaXN0cmF0aW9uIGFuZCB1bnJlZ2lzdHJhdGlvbiBtYXkgcG9zZSBxdWVzdGlvbnMgYWJvdXQgaG93CitjbGVhbnVwIHdvcmtzIHdpdGggdGhlIEVOR0lORV9QSUxFIGRvaW5nIGFsbCB0aGlzIGNhY2hpbmcgbm9uc2Vuc2UgKGllLiB3aGVuIHRoZQorYXBwbGljYXRpb24gb3IgRVZQX0NJUEhFUiBjb2RlIHJlbGVhc2VzIGl0cyBsYXN0IHJlZmVyZW5jZSB0byBhbiBFTkdJTkUsIHRoZQorRU5HSU5FX1BJTEUgY29kZSBtYXkgc3RpbGwgaGF2ZSByZWZlcmVuY2VzIGFuZCB0aHVzIHRob3NlIEVOR0lORXMgd2lsbCBzdGF5Citob29rZWQgaW4gZm9yZXZlcikuIFRoZSB3YXkgdGhpcyBpcyBoYW5kbGVkIGlzIHZpYSAidW5yZWdpc3RyYXRpb24iLiBXaXRoIHRoZXNlCituZXcgRU5HSU5FIGNoYW5nZXMsIGFuIGFic3RyYWN0IEVOR0lORSBjYW4gYmUgbG9hZGVkIGFuZCBpbml0aWFsaXNlZCwgYnV0IHRoYXQKK2lzIGFuIGFsZ29yaXRobS1hZ25vc3RpYyBwcm9jZXNzLiBFdmVuIGlmIGluaXRpYWxpc2VkLCBpdCB3aWxsIG5vdCBoYXZlCityZWdpc3RlcmVkIGFueSBvZiBpdHMgaW1wbGVtZW50YXRpb25zICh0byBkbyBzbyB3b3VsZCBsaW5rIGFsbCBjbGFzcyAidGFibGUiCitjb2RlIGRlc3BpdGUgdGhlIGZhY3QgdGhlIGFwcGxpY2F0aW9uIG1heSB1c2Ugb25seSBjaXBoZXJzLCBmb3IgZXhhbXBsZSkuIFRoaXMKK2lzIGRlbGliZXJhdGVseSBhIGRpc3RpbmN0IHN0ZXAuIE1vcmVvdmVyLCByZWdpc3RyYXRpb24gYW5kIHVucmVnaXN0cmF0aW9uIGhhcworbm90aGluZyB0byBkbyB3aXRoIHdoZXRoZXIgYW4gRU5HSU5FIGlzICpmdW5jdGlvbmFsKiBvciBub3QgKGllLiB5b3UgY2FuIGV2ZW4KK3JlZ2lzdGVyIGFuIEVOR0lORSBhbmQgaXRzIGltcGxlbWVudGF0aW9ucyB3aXRob3V0IGl0IGJlaW5nIG9wZXJhdGlvbmFsLCB5b3UgbWF5Citub3QgZXZlbiBoYXZlIHRoZSBkcml2ZXJzIHRvIG1ha2UgaXQgb3BlcmF0ZSkuIFdoYXQgYWN0dWFsbHkgaGFwcGVucyB3aXRoCityZXNwZWN0IHRvIGNsZWFudXAgaXMgbWFuYWdlZCBpbnNpZGUgZW5nX2xpYi5jIHdpdGggdGhlICJlbmdpbmVfY2xlYW51cF8qKioiCitmdW5jdGlvbnMuIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW50ZXJuYWwtb25seSBhbmQgZWFjaCBwYXJ0IG9mIEVOR0lORSBjb2RlIHRoYXQKK2NvdWxkIHJlcXVpcmUgY2xlYW51cCB3aWxsLCB1cG9uIHBlcmZvcm1pbmcgaXRzIGZpcnN0IGFsbG9jYXRpb24sIHJlZ2lzdGVyIGEKK2NhbGxiYWNrIHdpdGggdGhlICJlbmdpbmVfY2xlYW51cCIgY29kZS4gVGhlIG90aGVyIHBhcnQgb2YgdGhpcyB0aGF0IG1ha2VzIGl0Cit0aWNrIGlzIHRoYXQgdGhlIEVOR0lORV9UQUJMRSBpbnN0YW50aWF0aW9ucyAodGJfKioqLmMpIHVzZSBOVUxMIGFzIHRoZWlyCitpbml0aWFsaXNlZCBzdGF0ZS4gU28gaWYgUlNBIGNvZGUgYXNrcyBmb3IgYW4gRU5HSU5FIGFuZCBubyBFTkdJTkUgaGFzCityZWdpc3RlcmVkIGFuIGltcGxlbWVudGF0aW9uLCB0aGUgY29kZSB3aWxsIHNpbXBseSByZXR1cm4gTlVMTCBhbmQgdGhlIHRiX3JzYS5jCitzdGF0ZSB3aWxsIGJlIHVuY2hhbmdlZC4gVGh1cywgbm8gY2xlYW51cCBpcyByZXF1aXJlZCB1bmxlc3MgcmVnaXN0cmF0aW9uIHRha2VzCitwbGFjZS4gRU5HSU5FX2NsZWFudXAoKSB3aWxsIHNpbXBseSBpdGVyYXRlIGFjcm9zcyBhIGxpc3Qgb2YgcmVnaXN0ZXJlZCBjbGVhbnVwCitjYWxsYmFja3MgY2FsbGluZyBlYWNoIGluIHR1cm4sIGFuZCB3aWxsIHRoZW4gaW50ZXJuYWxseSBkZWxldGUgaXRzIG93biBzdG9yYWdlCisoYSBTVEFDSykuIFdoZW4gYSBjbGVhbnVwIGNhbGxiYWNrIGlzIG5leHQgcmVnaXN0ZXJlZCAoZWcuIGlmIHRoZSBjbGVhbnVwKCkgaXMKK3BhcnQgb2YgYSBncmFjZWZ1bGwgcmVzdGFydCBhbmQgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNsZWFudXAgYWxsIHN0YXRlIHRoZW4KK3N0YXJ0IGFnYWluKSwgdGhlIGludGVybmFsIFNUQUNLIHN0b3JhZ2Ugd2lsbCBiZSBmcmVzaGx5IGFsbG9jYXRlZC4gVGhpcyBpcyBtdWNoCit0aGUgc2FtZSBhcyB0aGUgc2l0dWF0aW9uIGluIHRoZSBFTkdJTkVfVEFCTEUgaW5zdGFudGlhdGlvbnMgLi4uIE5VTEwgaXMgdGhlCitpbml0aWFsaXNlZCBzdGF0ZSwgc28gb25seSBtb2RpZmljYXRpb24gb3BlcmF0aW9ucyAobm90IHF1ZXJpZXMpIHdpbGwgY2F1c2UgdGhhdAorY29kZSB0byBoYXZlIHRvIHJlZ2lzdGVyIGEgY2xlYW51cC4KKworV2hhdCBlbHNlPyBUaGUgYmlnbnVtIGNhbGxiYWNrcyBhbmQgYXNzb2NpYXRlZCBFTkdJTkUgZnVuY3Rpb25zIGhhdmUgYmVlbgorcmVtb3ZlZCBmb3IgdHdvIG9idmlvdXMgcmVhc29uczsgKGkpIHRoZXJlIHdhcyBubyB3YXkgdG8gZ2VuZXJhbGlzZSB0aGVtIHRvIHRoZQorbWVjaGFuaXNtIG5vdyB1c2VkIGJ5IFJTQS9EU0EvLi4uLCBiZWNhdXNlIHRoZXJlJ3Mgbm8gc3VjaCB0aGluZyBhcyBhIEJJR05VTQorbWV0aG9kLCBhbmQgKGlpKSBiZWNhdXNlIG9mIChpKSwgdGhlcmUgd2FzIG5vIG1lYW5pbmdmdWwgd2F5IGZvciBsaWJyYXJ5IG9yCithcHBsaWNhdGlvbiBjb2RlIHRvIGF1dG9tYXRpY2FsbHkgaG9vayBhbmQgdXNlIEVOR0lORSBzdXBwbGllZCBiaWdudW0gZnVuY3Rpb25zCithbnl3YXkuIEFsc28sIEVOR0lORV9jcHkoKSBoYXMgYmVlbiByZW1vdmVkIChhbHRob3VnaCBhbiBpbnRlcm5hbC1vbmx5IHZlcnNpb24KK2V4aXN0cykgLSB0aGUgaWRlYSBvZiBwcm92aWRpbmcgYW4gRU5HSU5FX2NweSgpIGZ1bmN0aW9uIHByb2JhYmx5IHdhc24ndCBhIGdvb2QKK29uZSBhbmQgbm93IGNlcnRhaW5seSBkb2Vzbid0IG1ha2Ugc2Vuc2UgaW4gYW55IGdlbmVyYWxpc2VkIHdheS4gU29tZSBvZiB0aGUKK1JTQSwgRFNBLCBESCwgYW5kIFJBTkQgZnVuY3Rpb25zIHRoYXQgd2VyZSBmaWRkbGVkIGR1cmluZyB0aGUgb3JpZ2luYWwgRU5HSU5FCitjaGFuZ2VzIGhhdmUgbm93LCBhcyBhIGNvbnNlcXVlbmNlLCBiZWVuIHJldmVydGVkIGJhY2suIFRoaXMgaXMgYmVjYXVzZSB0aGUKK2hvb2tpbmcgb2YgRU5HSU5FIGlzIG5vdyBhdXRvbWF0aWMgKGFuZCBwYXNzaXZlLCBpdCBjYW4gaW50ZXJhbGx5IHVzZSBhIE5VTEwKK0VOR0lORSBwb2ludGVyIHRvIHNpbXBseSBpZ25vcmUgRU5HSU5FIGZyb20gdGhlbiBvbikuCisKK0hlbGwsIHRoYXQgc2hvdWxkIGJlIGVub3VnaCBmb3Igbm93IC4uLiBjb21tZW50cyB3ZWxjb21lOiBnZW9mZkBvcGVuc3NsLm9yZworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19hbGwuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzEyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19hbGwuYwpAQCAtMCwwICsxLDEyNiBAQAorLyogY3J5cHRvL2VuZ2luZS9lbmdfYWxsLmMgLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSA8cmljaGFyZEBsZXZpdHRlLm9yZz4gZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlICJlbmdfaW50LmgiCisKK3ZvaWQgRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKHZvaWQpCisJeworI2lmIDAKKwkvKiBUaGVyZSdzIG5vIGxvbmdlciBhbnkgbmVlZCBmb3IgYW4gIm9wZW5zc2wiIEVOR0lORSB1bmxlc3MsIG9uZSBkYXksCisJICogaXQgaXMgdGhlICpvbmx5KiB3YXkgZm9yIHN0YW5kYXJkIGJ1aWx0aW4gaW1wbGVtZW50YXRpb25zIHRvIGJlIGJlCisJICogYWNjZXNzZWQgKGllLiBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBzdGF0aWNhbGx5IGxpbmsgYmluYXJpZXMgd2l0aAorCSAqICpubyogYnVpbHRpbiBpbXBsZW1lbnRhdGlvbnMpLiAqLworCUVOR0lORV9sb2FkX29wZW5zc2woKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fSFcpICYmIChkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKEhBVkVfQ1JZUFRPREVWKSkKKwlFTkdJTkVfbG9hZF9jcnlwdG9kZXYoKTsKKyNlbmRpZgorCUVOR0lORV9sb2FkX2R5bmFtaWMoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19TVEFUSUNfRU5HSU5FCisjaWZuZGVmIE9QRU5TU0xfTk9fSFcKKyNpZm5kZWYgT1BFTlNTTF9OT19IV180NzU4X0NDQQorCUVOR0lORV9sb2FkXzQ3NThjY2EoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0hXX0FFUAorCUVOR0lORV9sb2FkX2FlcCgpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSFdfQVRBTExBCisJRU5HSU5FX2xvYWRfYXRhbGxhKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19IV19DU1dJRlQKKwlFTkdJTkVfbG9hZF9jc3dpZnQoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0hXX05DSVBIRVIKKwlFTkdJTkVfbG9hZF9jaGlsKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19IV19OVVJPTgorCUVOR0lORV9sb2FkX251cm9uKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19IV19TVVJFV0FSRQorCUVOR0lORV9sb2FkX3N1cmV3YXJlKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19IV19VQlNFQworCUVOR0lORV9sb2FkX3Vic2VjKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19IV19QQURMT0NLCisJRU5HSU5FX2xvYWRfcGFkbG9jaygpOworI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19HT1NUCisJRU5HSU5FX2xvYWRfZ29zdCgpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fR01QCisJRU5HSU5FX2xvYWRfZ21wKCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0NBUElFTkcpCisJRU5HSU5FX2xvYWRfY2FwaSgpOworI2VuZGlmCisjZW5kaWYKKwl9CisKKyNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKEhBVkVfQ1JZUFRPREVWKQordm9pZCBFTkdJTkVfc2V0dXBfYnNkX2NyeXB0b2Rldih2b2lkKSB7CisJc3RhdGljIGludCBic2RfY3J5cHRvZGV2X2RlZmF1bHRfbG9hZGVkID0gMDsKKwlpZiAoIWJzZF9jcnlwdG9kZXZfZGVmYXVsdF9sb2FkZWQpIHsKKwkJRU5HSU5FX2xvYWRfY3J5cHRvZGV2KCk7CisJCUVOR0lORV9yZWdpc3Rlcl9hbGxfY29tcGxldGUoKTsKKwl9CisJYnNkX2NyeXB0b2Rldl9kZWZhdWx0X2xvYWRlZD0xOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19jbmYuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2NuZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YzQwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19jbmYuYwpAQCAtMCwwICsxLDI1OSBAQAorLyogZW5nX2NuZi5jICovCisvKiBXcml0dGVuIGJ5IFN0ZXBoZW4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImVuZ19pbnQuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKworLyogI2RlZmluZSBFTkdJTkVfQ09ORl9ERUJVRyAqLworCisvKiBFTkdJTkUgY29uZmlnIG1vZHVsZSAqLworCitzdGF0aWMgY2hhciAqc2tpcF9kb3QoY2hhciAqbmFtZSkKKwl7CisJY2hhciAqcDsKKwlwID0gc3RyY2hyKG5hbWUsICcuJyk7CisJaWYgKHApCisJCXJldHVybiBwICsgMTsKKwlyZXR1cm4gbmFtZTsKKwl9CisKK3N0YXRpYyBTVEFDS19PRihFTkdJTkUpICppbml0aWFsaXplZF9lbmdpbmVzID0gTlVMTDsKKworc3RhdGljIGludCBpbnRfZW5naW5lX2luaXQoRU5HSU5FICplKQorCXsKKwlpZiAoIUVOR0lORV9pbml0KGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWluaXRpYWxpemVkX2VuZ2luZXMpCisJCWluaXRpYWxpemVkX2VuZ2luZXMgPSBza19FTkdJTkVfbmV3X251bGwoKTsKKwlpZiAoIWluaXRpYWxpemVkX2VuZ2luZXMgfHwgIXNrX0VOR0lORV9wdXNoKGluaXRpYWxpemVkX2VuZ2luZXMsIGUpKQorCQl7CisJCUVOR0lORV9maW5pc2goZSk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCQorCitzdGF0aWMgaW50IGludF9lbmdpbmVfY29uZmlndXJlKGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlLCBjb25zdCBDT05GICpjbmYpCisJeworCWludCBpOworCWludCByZXQgPSAwOworCWxvbmcgZG9faW5pdCA9IC0xOworCVNUQUNLX09GKENPTkZfVkFMVUUpICplY21kczsKKwlDT05GX1ZBTFVFICplY21kID0gTlVMTDsKKwljaGFyICpjdHJsbmFtZSwgKmN0cmx2YWx1ZTsKKwlFTkdJTkUgKmUgPSBOVUxMOworCWludCBzb2Z0ID0gMDsKKworCW5hbWUgPSBza2lwX2RvdChuYW1lKTsKKyNpZmRlZiBFTkdJTkVfQ09ORl9ERUJVRworCWZwcmludGYoc3RkZXJyLCAiQ29uZmlndXJpbmcgZW5naW5lICVzXG4iLCBuYW1lKTsKKyNlbmRpZgorCS8qIFZhbHVlIGlzIGEgc2VjdGlvbiBjb250YWluaW5nIEVOR0lORSBjb21tYW5kcyAqLworCWVjbWRzID0gTkNPTkZfZ2V0X3NlY3Rpb24oY25mLCB2YWx1ZSk7CisKKwlpZiAoIWVjbWRzKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9JTlRfRU5HSU5FX0NPTkZJR1VSRSwgRU5HSU5FX1JfRU5HSU5FX1NFQ1RJT05fRVJST1IpOworCQlyZXR1cm4gMDsKKwkJfQorCisJZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKGVjbWRzKTsgaSsrKQorCQl7CisJCWVjbWQgPSBza19DT05GX1ZBTFVFX3ZhbHVlKGVjbWRzLCBpKTsKKwkJY3RybG5hbWUgPSBza2lwX2RvdChlY21kLT5uYW1lKTsKKwkJY3RybHZhbHVlID0gZWNtZC0+dmFsdWU7CisjaWZkZWYgRU5HSU5FX0NPTkZfREVCVUcKKwlmcHJpbnRmKHN0ZGVyciwgIkVOR0lORSBjb25mOiBkb2luZyBjdHJsKCVzLCVzKVxuIiwgY3RybG5hbWUsIGN0cmx2YWx1ZSk7CisjZW5kaWYKKworCQkvKiBGaXJzdCBoYW5kbGUgc29tZSBzcGVjaWFsIHBzZXVkbyBjdHJscyAqLworCisJCS8qIE92ZXJyaWRlIGVuZ2luZSBuYW1lIHRvIHVzZSAqLworCQlpZiAoIXN0cmNtcChjdHJsbmFtZSwgImVuZ2luZV9pZCIpKQorCQkJbmFtZSA9IGN0cmx2YWx1ZTsKKwkJZWxzZSBpZiAoIXN0cmNtcChjdHJsbmFtZSwgInNvZnRfbG9hZCIpKQorCQkJc29mdCA9IDE7CisJCS8qIExvYWQgYSBkeW5hbWljIEVOR0lORSAqLworCQllbHNlIGlmICghc3RyY21wKGN0cmxuYW1lLCAiZHluYW1pY19wYXRoIikpCisJCQl7CisJCQllID0gRU5HSU5FX2J5X2lkKCJkeW5hbWljIik7CisJCQlpZiAoIWUpCisJCQkJZ290byBlcnI7CisJCQlpZiAoIUVOR0lORV9jdHJsX2NtZF9zdHJpbmcoZSwgIlNPX1BBVEgiLCBjdHJsdmFsdWUsIDApKQorCQkJCWdvdG8gZXJyOworCQkJaWYgKCFFTkdJTkVfY3RybF9jbWRfc3RyaW5nKGUsICJMSVNUX0FERCIsICIyIiwgMCkpCisJCQkJZ290byBlcnI7CisJCQlpZiAoIUVOR0lORV9jdHJsX2NtZF9zdHJpbmcoZSwgIkxPQUQiLCBOVUxMLCAwKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJLyogLi4uIGFkZCBvdGhlciBwc2V1ZG9zIGhlcmUgLi4uICovCisJCWVsc2UKKwkJCXsKKwkJCS8qIEF0IHRoaXMgcG9pbnQgd2UgbmVlZCBhbiBFTkdJTkUgc3RydWN0dXJhbCByZWZlcmVuY2UKKwkJCSAqIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuCisJCQkgKi8KKwkJCWlmICghZSkKKwkJCQl7CisJCQkJZSA9IEVOR0lORV9ieV9pZChuYW1lKTsKKwkJCQlpZiAoIWUgJiYgc29mdCkKKwkJCQkJeworCQkJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJCX0KKwkJCQlpZiAoIWUpCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCS8qIEFsbG93ICJFTVBUWSIgdG8gbWVhbiBubyB2YWx1ZTogdGhpcyBhbGxvd3MgYSB2YWxpZAorCQkJICogInZhbHVlIiB0byBiZSBwYXNzZWQgdG8gY3RybHMgb2YgdHlwZSBOT19JTlBVVAorCQkgCSAqLworCQkJaWYgKCFzdHJjbXAoY3RybHZhbHVlLCAiRU1QVFkiKSkKKwkJCQljdHJsdmFsdWUgPSBOVUxMOworCQkJaWYgKCFzdHJjbXAoY3RybG5hbWUsICJpbml0IikpCisJCQkJeworCQkJCWlmICghTkNPTkZfZ2V0X251bWJlcl9lKGNuZiwgdmFsdWUsICJpbml0IiwgJmRvX2luaXQpKQorCQkJCQlnb3RvIGVycjsKKwkJCQlpZiAoZG9faW5pdCA9PSAxKQorCQkJCQl7CisJCQkJCWlmICghaW50X2VuZ2luZV9pbml0KGUpKQorCQkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQllbHNlIGlmIChkb19pbml0ICE9IDApCisJCQkJCXsKKwkJCQkJRU5HSU5FZXJyKEVOR0lORV9GX0lOVF9FTkdJTkVfQ09ORklHVVJFLCBFTkdJTkVfUl9JTlZBTElEX0lOSVRfVkFMVUUpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UgaWYgKCFzdHJjbXAoY3RybG5hbWUsICJkZWZhdWx0X2FsZ29yaXRobXMiKSkKKwkJCQl7CisJCQkJaWYgKCFFTkdJTkVfc2V0X2RlZmF1bHRfc3RyaW5nKGUsIGN0cmx2YWx1ZSkpCisJCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWVsc2UgaWYgKCFFTkdJTkVfY3RybF9jbWRfc3RyaW5nKGUsCisJCQkJCWN0cmxuYW1lLCBjdHJsdmFsdWUsIDApKQorCQkJCWdvdG8gZXJyOworCQkJfQorCisKKworCQl9CisJaWYgKGUgJiYgKGRvX2luaXQgPT0gLTEpICYmICFpbnRfZW5naW5lX2luaXQoZSkpCisJCXsKKwkJZWNtZCA9IE5VTEw7CisJCWdvdG8gZXJyOworCQl9CisJcmV0ID0gMTsKKwllcnI6CisJaWYgKHJldCAhPSAxKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9JTlRfRU5HSU5FX0NPTkZJR1VSRSwgRU5HSU5FX1JfRU5HSU5FX0NPTkZJR1VSQVRJT05fRVJST1IpOworCQlpZiAoZWNtZCkKKwkJCUVSUl9hZGRfZXJyb3JfZGF0YSg2LCAic2VjdGlvbj0iLCBlY21kLT5zZWN0aW9uLCAKKwkJCQkJCSIsIG5hbWU9IiwgZWNtZC0+bmFtZSwKKwkJCQkJCSIsIHZhbHVlPSIsIGVjbWQtPnZhbHVlKTsKKwkJfQorCWlmIChlKQorCQlFTkdJTkVfZnJlZShlKTsKKwlyZXR1cm4gcmV0OworCX0KKworCitzdGF0aWMgaW50IGludF9lbmdpbmVfbW9kdWxlX2luaXQoQ09ORl9JTU9EVUxFICptZCwgY29uc3QgQ09ORiAqY25mKQorCXsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqZWxpc3Q7CisJQ09ORl9WQUxVRSAqY3ZhbDsKKwlpbnQgaTsKKyNpZmRlZiBFTkdJTkVfQ09ORl9ERUJVRworCWZwcmludGYoc3RkZXJyLCAiQ2FsbGVkIGVuZ2luZSBtb2R1bGU6IG5hbWUgJXMsIHZhbHVlICVzXG4iLAorCQkJQ09ORl9pbW9kdWxlX2dldF9uYW1lKG1kKSwgQ09ORl9pbW9kdWxlX2dldF92YWx1ZShtZCkpOworI2VuZGlmCisJLyogVmFsdWUgaXMgYSBzZWN0aW9uIGNvbnRhaW5pbmcgRU5HSU5FcyB0byBjb25maWd1cmUgKi8KKwllbGlzdCA9IE5DT05GX2dldF9zZWN0aW9uKGNuZiwgQ09ORl9pbW9kdWxlX2dldF92YWx1ZShtZCkpOworCisJaWYgKCFlbGlzdCkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfSU5UX0VOR0lORV9NT0RVTEVfSU5JVCwgRU5HSU5FX1JfRU5HSU5FU19TRUNUSU9OX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWZvciAoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShlbGlzdCk7IGkrKykKKwkJeworCQljdmFsID0gc2tfQ09ORl9WQUxVRV92YWx1ZShlbGlzdCwgaSk7CisJCWlmICghaW50X2VuZ2luZV9jb25maWd1cmUoY3ZhbC0+bmFtZSwgY3ZhbC0+dmFsdWUsIGNuZikpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgdm9pZCBpbnRfZW5naW5lX21vZHVsZV9maW5pc2goQ09ORl9JTU9EVUxFICptZCkKKwl7CisJRU5HSU5FICplOworCXdoaWxlICgoZSA9IHNrX0VOR0lORV9wb3AoaW5pdGlhbGl6ZWRfZW5naW5lcykpKQorCQlFTkdJTkVfZmluaXNoKGUpOworCXNrX0VOR0lORV9mcmVlKGluaXRpYWxpemVkX2VuZ2luZXMpOworCWluaXRpYWxpemVkX2VuZ2luZXMgPSBOVUxMOworCX0KKwkKKwordm9pZCBFTkdJTkVfYWRkX2NvbmZfbW9kdWxlKHZvaWQpCisJeworCUNPTkZfbW9kdWxlX2FkZCgiZW5naW5lcyIsCisJCQlpbnRfZW5naW5lX21vZHVsZV9pbml0LAorCQkJaW50X2VuZ2luZV9tb2R1bGVfZmluaXNoKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19jcnlwdG9kZXYuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2NyeXB0b2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZjRjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19jcnlwdG9kZXYuYwpAQCAtMCwwICsxLDE0MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgQm9iIEJlY2sgPGJlY2tAb3BlbmJzZC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlbyBkZSBSYWFkdAorICogQ29weXJpZ2h0IChjKSAyMDAyIE1hcmt1cyBGcmllZGwKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKKyNpZiAoZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZCh1bml4KSkgJiYgIWRlZmluZWQoVVNHKSAmJiBcCisJKGRlZmluZWQoT3BlbkJTRCkgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykpCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjIGlmIChPcGVuQlNEID49IDIwMDExMikgfHwgKChfX0ZyZWVCU0RfdmVyc2lvbiA+PSA0NzAxMDEgJiYgX19GcmVlQlNEX3ZlcnNpb24gPCA1MDAwMDApIHx8IF9fRnJlZUJTRF92ZXJzaW9uID49IDUwMDA0MSkKKyMgIGRlZmluZSBIQVZFX0NSWVBUT0RFVgorIyBlbmRpZgorIyBpZiAoT3BlbkJTRCA+PSAyMDAxMTApCisjICBkZWZpbmUgSEFWRV9TWVNMT0dfUgorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9DUllQVE9ERVYKKwordm9pZAorRU5HSU5FX2xvYWRfY3J5cHRvZGV2KHZvaWQpCit7CisJLyogVGhpcyBpcyBhIE5PUCBvbiBwbGF0Zm9ybXMgd2l0aG91dCAvZGV2L2NyeXB0byAqLworCXJldHVybjsKK30KKworI2Vsc2UgCisgCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2NyeXB0b2Rldi5oPgorI2luY2x1ZGUgPGNyeXB0by9kaC9kaC5oPgorI2luY2x1ZGUgPGNyeXB0by9kc2EvZHNhLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Vyci9lcnIuaD4KKyNpbmNsdWRlIDxjcnlwdG8vcnNhL3JzYS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0cnVjdCBkZXZfY3J5cHRvX3N0YXRlIHsKKwlzdHJ1Y3Qgc2Vzc2lvbl9vcCBkX3Nlc3M7CisJaW50IGRfZmQ7CisKKyNpZmRlZiBVU0VfQ1JZUFRPREVWX0RJR0VTVFMKKwljaGFyIGR1bW15X21hY19rZXlbSEFTSF9NQVhfTEVOXTsKKworCXVuc2lnbmVkIGNoYXIgZGlnZXN0X3Jlc1tIQVNIX01BWF9MRU5dOworCWNoYXIgKm1hY19kYXRhOworCWludCBtYWNfbGVuOworCisJaW50IGNvcHk7CisjZW5kaWYKK307CisKK3N0YXRpYyB1X2ludDMyX3QgY3J5cHRvZGV2X2FzeW1mZWF0ID0gMDsKKworc3RhdGljIGludCBnZXRfYXN5bV9kZXZfY3J5cHRvKHZvaWQpOworc3RhdGljIGludCBvcGVuX2Rldl9jcnlwdG8odm9pZCk7CitzdGF0aWMgaW50IGdldF9kZXZfY3J5cHRvKHZvaWQpOworc3RhdGljIGludCBnZXRfY3J5cHRvZGV2X2NpcGhlcnMoY29uc3QgaW50ICoqY25pZHMpOworI2lmZGVmIFVTRV9DUllQVE9ERVZfRElHRVNUUworc3RhdGljIGludCBnZXRfY3J5cHRvZGV2X2RpZ2VzdHMoY29uc3QgaW50ICoqY25pZHMpOworI2VuZGlmCitzdGF0aWMgaW50IGNyeXB0b2Rldl91c2FibGVfY2lwaGVycyhjb25zdCBpbnQgKipuaWRzKTsKK3N0YXRpYyBpbnQgY3J5cHRvZGV2X3VzYWJsZV9kaWdlc3RzKGNvbnN0IGludCAqKm5pZHMpOworc3RhdGljIGludCBjcnlwdG9kZXZfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubCk7CitzdGF0aWMgaW50IGNyeXB0b2Rldl9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpOworc3RhdGljIGludCBjcnlwdG9kZXZfY2xlYW51cChFVlBfQ0lQSEVSX0NUWCAqY3R4KTsKK3N0YXRpYyBpbnQgY3J5cHRvZGV2X2VuZ2luZV9jaXBoZXJzKEVOR0lORSAqZSwgY29uc3QgRVZQX0NJUEhFUiAqKmNpcGhlciwKKyAgICBjb25zdCBpbnQgKipuaWRzLCBpbnQgbmlkKTsKK3N0YXRpYyBpbnQgY3J5cHRvZGV2X2VuZ2luZV9kaWdlc3RzKEVOR0lORSAqZSwgY29uc3QgRVZQX01EICoqZGlnZXN0LAorICAgIGNvbnN0IGludCAqKm5pZHMsIGludCBuaWQpOworc3RhdGljIGludCBibjJjcnBhcmFtKGNvbnN0IEJJR05VTSAqYSwgc3RydWN0IGNycGFyYW0gKmNycCk7CitzdGF0aWMgaW50IGNycGFyYW0yYm4oc3RydWN0IGNycGFyYW0gKmNycCwgQklHTlVNICphKTsKK3N0YXRpYyB2b2lkIHphcHBhcmFtcyhzdHJ1Y3QgY3J5cHRfa29wICprb3ApOworc3RhdGljIGludCBjcnlwdG9kZXZfYXN5bShzdHJ1Y3QgY3J5cHRfa29wICprb3AsIGludCBybGVuLCBCSUdOVU0gKnIsCisgICAgaW50IHNsZW4sIEJJR05VTSAqcyk7CisKK3N0YXRpYyBpbnQgY3J5cHRvZGV2X2JuX21vZF9leHAoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCisgICAgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpOworc3RhdGljIGludCBjcnlwdG9kZXZfcnNhX25vY3J0X21vZF9leHAoQklHTlVNICpyMCwgY29uc3QgQklHTlVNICpJLAorICAgIFJTQSAqcnNhLCBCTl9DVFggKmN0eCk7CitzdGF0aWMgaW50IGNyeXB0b2Rldl9yc2FfbW9kX2V4cChCSUdOVU0gKnIwLCBjb25zdCBCSUdOVU0gKkksIFJTQSAqcnNhLCBCTl9DVFggKmN0eCk7CitzdGF0aWMgaW50IGNyeXB0b2Rldl9kc2FfYm5fbW9kX2V4cChEU0EgKmRzYSwgQklHTlVNICpyLCBCSUdOVU0gKmEsCisgICAgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpOworc3RhdGljIGludCBjcnlwdG9kZXZfZHNhX2RzYV9tb2RfZXhwKERTQSAqZHNhLCBCSUdOVU0gKnQxLCBCSUdOVU0gKmcsCisgICAgQklHTlVNICp1MSwgQklHTlVNICpwdWJfa2V5LCBCSUdOVU0gKnUyLCBCSUdOVU0gKnAsCisgICAgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICptb250KTsKK3N0YXRpYyBEU0FfU0lHICpjcnlwdG9kZXZfZHNhX2RvX3NpZ24oY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwKKyAgICBpbnQgZGxlbiwgRFNBICpkc2EpOworc3RhdGljIGludCBjcnlwdG9kZXZfZHNhX3ZlcmlmeShjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sCisgICAgRFNBX1NJRyAqc2lnLCBEU0EgKmRzYSk7CitzdGF0aWMgaW50IGNyeXB0b2Rldl9tb2RfZXhwX2RoKGNvbnN0IERIICpkaCwgQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCisgICAgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LAorICAgIEJOX01PTlRfQ1RYICptX2N0eCk7CitzdGF0aWMgaW50IGNyeXB0b2Rldl9kaF9jb21wdXRlX2tleSh1bnNpZ25lZCBjaGFyICprZXksCisgICAgY29uc3QgQklHTlVNICpwdWJfa2V5LCBESCAqZGgpOworc3RhdGljIGludCBjcnlwdG9kZXZfY3RybChFTkdJTkUgKmUsIGludCBjbWQsIGxvbmcgaSwgdm9pZCAqcCwKKyAgICB2b2lkICgqZikodm9pZCkpOwordm9pZCBFTkdJTkVfbG9hZF9jcnlwdG9kZXYodm9pZCk7CisKK3N0YXRpYyBjb25zdCBFTkdJTkVfQ01EX0RFRk4gY3J5cHRvZGV2X2RlZm5zW10gPSB7CisJeyAwLCBOVUxMLCBOVUxMLCAwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgeworCWludAlpZDsKKwlpbnQJbmlkOworCWludAlpdm1heDsKKwlpbnQJa2V5bGVuOworfSBjaXBoZXJzW10gPSB7CisJeyBDUllQVE9fQVJDNCwJCQlOSURfcmM0LAkJMCwJMTYsIH0sCisJeyBDUllQVE9fREVTX0NCQywJCU5JRF9kZXNfY2JjLAkJOCwJIDgsIH0sCisJeyBDUllQVE9fM0RFU19DQkMsCQlOSURfZGVzX2VkZTNfY2JjLAk4LAkyNCwgfSwKKwl7IENSWVBUT19BRVNfQ0JDLAkJTklEX2Flc18xMjhfY2JjLAkxNiwJMTYsIH0sCisJeyBDUllQVE9fQUVTX0NCQywJCU5JRF9hZXNfMTkyX2NiYywJMTYsCTI0LCB9LAorCXsgQ1JZUFRPX0FFU19DQkMsCQlOSURfYWVzXzI1Nl9jYmMsCTE2LAkzMiwgfSwKKwl7IENSWVBUT19CTEZfQ0JDLAkJTklEX2JmX2NiYywJCTgsCTE2LCB9LAorCXsgQ1JZUFRPX0NBU1RfQ0JDLAkJTklEX2Nhc3Q1X2NiYywJCTgsCTE2LCB9LAorCXsgQ1JZUFRPX1NLSVBKQUNLX0NCQywJCU5JRF91bmRlZiwJCTAsCSAwLCB9LAorCXsgMCwJCQkJTklEX3VuZGVmLAkJMCwJIDAsIH0sCit9OworCisjaWZkZWYgVVNFX0NSWVBUT0RFVl9ESUdFU1RTCitzdGF0aWMgc3RydWN0IHsKKwlpbnQJaWQ7CisJaW50CW5pZDsKKwlpbnQgCWtleWxlbjsKK30gZGlnZXN0c1tdID0geworCXsgQ1JZUFRPX01ENV9ITUFDLAkJTklEX2htYWNXaXRoTUQ1LAkxNn0sCisJeyBDUllQVE9fU0hBMV9ITUFDLAkJTklEX2htYWNXaXRoU0hBMSwJMjB9LAorCXsgQ1JZUFRPX1JJUEVNRDE2MF9ITUFDLAlOSURfcmlwZW1kMTYwLAkJMTYvKj8qL30sCisJeyBDUllQVE9fTUQ1X0tQREssCQlOSURfdW5kZWYsCQkwfSwKKwl7IENSWVBUT19TSEExX0tQREssCQlOSURfdW5kZWYsCQkwfSwKKwl7IENSWVBUT19NRDUsCQkJTklEX21kNSwJCTE2fSwKKwl7IENSWVBUT19TSEExLAkJCU5JRF9zaGExLAkJMjB9LAorCXsgMCwJCQkJTklEX3VuZGVmLAkJMH0sCit9OworI2VuZGlmCisKKy8qCisgKiBSZXR1cm4gYSBmZCBpZiAvZGV2L2NyeXB0byBzZWVtcyB1c2FibGUsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50CitvcGVuX2Rldl9jcnlwdG8odm9pZCkKK3sKKwlzdGF0aWMgaW50IGZkID0gLTE7CisKKwlpZiAoZmQgPT0gLTEpIHsKKwkJaWYgKChmZCA9IG9wZW4oIi9kZXYvY3J5cHRvIiwgT19SRFdSLCAwKSkgPT0gLTEpCisJCQlyZXR1cm4gKC0xKTsKKwkJLyogY2xvc2Ugb24gZXhlYyAqLworCQlpZiAoZmNudGwoZmQsIEZfU0VURkQsIDEpID09IC0xKSB7CisJCQljbG9zZShmZCk7CisJCQlmZCA9IC0xOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9CisJcmV0dXJuIChmZCk7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9kZXZfY3J5cHRvKHZvaWQpCit7CisJaW50IGZkLCByZXRmZDsKKworCWlmICgoZmQgPSBvcGVuX2Rldl9jcnlwdG8oKSkgPT0gLTEpCisJCXJldHVybiAoLTEpOworCWlmIChpb2N0bChmZCwgQ1JJT0dFVCwgJnJldGZkKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisKKwkvKiBjbG9zZSBvbiBleGVjICovCisJaWYgKGZjbnRsKHJldGZkLCBGX1NFVEZELCAxKSA9PSAtMSkgeworCQljbG9zZShyZXRmZCk7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKHJldGZkKTsKK30KKworLyogQ2FjaGluZyB2ZXJzaW9uIGZvciBhc3ltIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBpbnQKK2dldF9hc3ltX2Rldl9jcnlwdG8odm9pZCkKK3sKKwlzdGF0aWMgaW50IGZkID0gLTE7CisKKwlpZiAoZmQgPT0gLTEpCisJCWZkID0gZ2V0X2Rldl9jcnlwdG8oKTsKKwlyZXR1cm4gZmQ7Cit9CisKKy8qCisgKiBGaW5kIG91dCB3aGF0IGNpcGhlcnMgL2Rldi9jcnlwdG8gd2lsbCBsZXQgdXMgaGF2ZSBhIHNlc3Npb24gZm9yLgorICogWFhYIG5vdGUsIHRoYXQgc29tZSBvZiB0aGVzZSBvcGVuc3NsIGRvZXNuJ3QgZGVhbCB3aXRoIHlldCEKKyAqIHJldHVybmluZyB0aGVtIGhlcmUgaXMgaGFybWxlc3MsIGFzIGxvbmcgYXMgd2UgcmV0dXJuIE5VTEwKKyAqIHdoZW4gYXNrZWQgZm9yIGEgaGFuZGxlciBpbiB0aGUgY3J5cHRvZGV2X2VuZ2luZV9jaXBoZXJzIHJvdXRpbmUKKyAqLworc3RhdGljIGludAorZ2V0X2NyeXB0b2Rldl9jaXBoZXJzKGNvbnN0IGludCAqKmNuaWRzKQoreworCXN0YXRpYyBpbnQgbmlkc1tDUllQVE9fQUxHT1JJVEhNX01BWF07CisJc3RydWN0IHNlc3Npb25fb3Agc2VzczsKKwlpbnQgZmQsIGksIGNvdW50ID0gMDsKKworCWlmICgoZmQgPSBnZXRfZGV2X2NyeXB0bygpKSA8IDApIHsKKwkJKmNuaWRzID0gTlVMTDsKKwkJcmV0dXJuICgwKTsKKwl9CisJbWVtc2V0KCZzZXNzLCAwLCBzaXplb2Yoc2VzcykpOworCXNlc3Mua2V5ID0gKGNhZGRyX3QpIjEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ubyI7CisKKwlmb3IgKGkgPSAwOyBjaXBoZXJzW2ldLmlkICYmIGNvdW50IDwgQ1JZUFRPX0FMR09SSVRITV9NQVg7IGkrKykgeworCQlpZiAoY2lwaGVyc1tpXS5uaWQgPT0gTklEX3VuZGVmKQorCQkJY29udGludWU7CisJCXNlc3MuY2lwaGVyID0gY2lwaGVyc1tpXS5pZDsKKwkJc2Vzcy5rZXlsZW4gPSBjaXBoZXJzW2ldLmtleWxlbjsKKwkJc2Vzcy5tYWMgPSAwOworCQlpZiAoaW9jdGwoZmQsIENJT0NHU0VTU0lPTiwgJnNlc3MpICE9IC0xICYmCisJCSAgICBpb2N0bChmZCwgQ0lPQ0ZTRVNTSU9OLCAmc2Vzcy5zZXMpICE9IC0xKQorCQkJbmlkc1tjb3VudCsrXSA9IGNpcGhlcnNbaV0ubmlkOworCX0KKwljbG9zZShmZCk7CisKKwlpZiAoY291bnQgPiAwKQorCQkqY25pZHMgPSBuaWRzOworCWVsc2UKKwkJKmNuaWRzID0gTlVMTDsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworI2lmZGVmIFVTRV9DUllQVE9ERVZfRElHRVNUUworLyoKKyAqIEZpbmQgb3V0IHdoYXQgZGlnZXN0cyAvZGV2L2NyeXB0byB3aWxsIGxldCB1cyBoYXZlIGEgc2Vzc2lvbiBmb3IuCisgKiBYWFggbm90ZSwgdGhhdCBzb21lIG9mIHRoZXNlIG9wZW5zc2wgZG9lc24ndCBkZWFsIHdpdGggeWV0IQorICogcmV0dXJuaW5nIHRoZW0gaGVyZSBpcyBoYXJtbGVzcywgYXMgbG9uZyBhcyB3ZSByZXR1cm4gTlVMTAorICogd2hlbiBhc2tlZCBmb3IgYSBoYW5kbGVyIGluIHRoZSBjcnlwdG9kZXZfZW5naW5lX2RpZ2VzdHMgcm91dGluZQorICovCitzdGF0aWMgaW50CitnZXRfY3J5cHRvZGV2X2RpZ2VzdHMoY29uc3QgaW50ICoqY25pZHMpCit7CisJc3RhdGljIGludCBuaWRzW0NSWVBUT19BTEdPUklUSE1fTUFYXTsKKwlzdHJ1Y3Qgc2Vzc2lvbl9vcCBzZXNzOworCWludCBmZCwgaSwgY291bnQgPSAwOworCisJaWYgKChmZCA9IGdldF9kZXZfY3J5cHRvKCkpIDwgMCkgeworCQkqY25pZHMgPSBOVUxMOworCQlyZXR1cm4gKDApOworCX0KKwltZW1zZXQoJnNlc3MsIDAsIHNpemVvZihzZXNzKSk7CisJc2Vzcy5tYWNrZXkgPSAoY2FkZHJfdCkiMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vIjsKKwlmb3IgKGkgPSAwOyBkaWdlc3RzW2ldLmlkICYmIGNvdW50IDwgQ1JZUFRPX0FMR09SSVRITV9NQVg7IGkrKykgeworCQlpZiAoZGlnZXN0c1tpXS5uaWQgPT0gTklEX3VuZGVmKQorCQkJY29udGludWU7CisJCXNlc3MubWFjID0gZGlnZXN0c1tpXS5pZDsKKwkJc2Vzcy5tYWNrZXlsZW4gPSBkaWdlc3RzW2ldLmtleWxlbjsKKwkJc2Vzcy5jaXBoZXIgPSAwOworCQlpZiAoaW9jdGwoZmQsIENJT0NHU0VTU0lPTiwgJnNlc3MpICE9IC0xICYmCisJCSAgICBpb2N0bChmZCwgQ0lPQ0ZTRVNTSU9OLCAmc2Vzcy5zZXMpICE9IC0xKQorCQkJbmlkc1tjb3VudCsrXSA9IGRpZ2VzdHNbaV0ubmlkOworCX0KKwljbG9zZShmZCk7CisKKwlpZiAoY291bnQgPiAwKQorCQkqY25pZHMgPSBuaWRzOworCWVsc2UKKwkJKmNuaWRzID0gTlVMTDsKKwlyZXR1cm4gKGNvdW50KTsKK30KKyNlbmRpZiAgLyogMCAqLworCisvKgorICogRmluZCB0aGUgdXNlYWJsZSBjaXBoZXJzfGRpZ2VzdHMgZnJvbSBkZXYvY3J5cHRvIC0gdGhpcyBpcyB0aGUgZmlyc3QKKyAqIHRoaW5nIGNhbGxlZCBieSB0aGUgZW5naW5lIGluaXQgY3J1ZCB3aGljaCBkZXRlcm1pbmVzIHdoYXQgaXQKKyAqIGNhbiB1c2UgZm9yIGNpcGhlcnMgZnJvbSB0aGlzIGVuZ2luZS4gV2Ugd2FudCB0byByZXR1cm4KKyAqIG9ubHkgd2hhdCB3ZSBjYW4gZG8sIGFueXRoaW5lIGVsc2UgaXMgaGFuZGxlZCBieSBzb2Z0d2FyZS4KKyAqCisgKiBJZiB3ZSBjYW4ndCBpbml0aWFsaXplIHRoZSBkZXZpY2UgdG8gZG8gYW55dGhpbmcgdXNlZnVsIGZvcgorICogYW55IHJlYXNvbiwgd2Ugd2FudCB0byByZXR1cm4gYSBOVUxMIGFycmF5LCBhbmQgMCBsZW5ndGgsCisgKiB3aGljaCBmb3JjZXMgZXZlcnl0aGluZyB0byBiZSBkb25lIGlzIHNvZnR3YXJlLiBCeSBwdXR0aW5nCisgKiB0aGUgaW5pdGFsaXphdGlvbiBvZiB0aGUgZGV2aWNlIGluIGhlcmUsIHdlIGVuc3VyZSB3ZSBjYW4KKyAqIHVzZSB0aGlzIGVuZ2luZSBhcyB0aGUgZGVmYXVsdCwgYW5kIGlmIGZvciB3aGF0ZXZlciByZWFzb24KKyAqIC9kZXYvY3J5cHRvIHdvbid0IGRvIHdoYXQgd2Ugd2FudCBpdCB3aWxsIGp1c3QgYmUgZG9uZSBpbgorICogc29mdHdhcmUKKyAqCisgKiBUaGlzIGNhbiAoc2hvdWxkKSBiZSBncmVhdGx5IGV4cGFuZGVkIHRvIHBlcmhhcHMgdGFrZSBpbnRvCisgKiBhY2NvdW50IHNwZWVkIG9mIHRoZSBkZXZpY2UsIGFuZCB3aGF0IHdlIHdhbnQgdG8gZG8uCisgKiAoYWx0aG91Z2ggdGhlIGRpc2FibGluZyBvZiBwYXJ0aWN1bGFyIGFsZydzIGNvdWxkIGJlIGNvbnRyb2xsZWQKKyAqIGJ5IHRoZSBkZXZpY2UgZHJpdmVyIHdpdGggc3lzY3RsJ3MuKSAtIHRoaXMgaXMgd2hlcmUgd2UKKyAqIHdhbnQgbW9zdCBvZiB0aGUgZGVjaXNpb25zIG1hZGUgYWJvdXQgd2hhdCB3ZSBhY3R1YWxseSB3YW50CisgKiB0byB1c2UgZnJvbSAvZGV2L2NyeXB0by4KKyAqLworc3RhdGljIGludAorY3J5cHRvZGV2X3VzYWJsZV9jaXBoZXJzKGNvbnN0IGludCAqKm5pZHMpCit7CisJcmV0dXJuIChnZXRfY3J5cHRvZGV2X2NpcGhlcnMobmlkcykpOworfQorCitzdGF0aWMgaW50CitjcnlwdG9kZXZfdXNhYmxlX2RpZ2VzdHMoY29uc3QgaW50ICoqbmlkcykKK3sKKyNpZmRlZiBVU0VfQ1JZUFRPREVWX0RJR0VTVFMKKwlyZXR1cm4gKGdldF9jcnlwdG9kZXZfZGlnZXN0cyhuaWRzKSk7CisjZWxzZQorCS8qCisJICogWFhYWCBqdXN0IGRpc2FibGUgYWxsIGRpZ2VzdHMgZm9yIG5vdywgYmVjYXVzZSBpdCBzdWNrcy4KKwkgKiB3ZSBuZWVkIGEgYmV0dGVyIHdheSB0byBkZWNpZGUgdGhpcyAtIGkuZS4gSSBtYXkgbm90CisJICogd2FudCBkaWdlc3RzIG9uIHNsb3cgY2FyZHMgbGlrZSBoaWZuIG9uIGZhc3QgbWFjaGluZXMsCisJICogYnV0IG1pZ2h0IHdhbnQgdGhlbSBvbiBzbG93IG9yIGxvYWRlZCBtYWNoaW5lcywgZXRjLgorCSAqIHdpbGwgYWxzbyB3YW50IHRoZW0gd2hlbiB1c2luZyBjcnlwdG8gY2FyZHMgdGhhdCBkb24ndAorCSAqIHN1Y2sgbW9vc2UgZ29uYWRzIC0gd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIGRlY2lkZSBzb21ldGhpbmcKKwkgKiBhcyByZWFzb25hYmxlIGRlZmF1bHQgd2l0aG91dCBoYXZpbmcgaGFja2VyeSB0aGF0J3MgY2FyZCBkZXBlbmRlbnQuCisJICogb2YgY291cnNlLCB0aGUgZGVmYXVsdCBzaG91bGQgcHJvYmFibHkgYmUganVzdCBkbyBldmVyeXRoaW5nLAorCSAqIHdpdGggcGVyaGFwcyBhIHN5c2N0bCB0byB0dXJuIGFsZ29yaXRtcyBvZmYgKG9yIGhhdmUgdGhlbSBvZmYKKwkgKiBieSBkZWZhdWx0KSBvbiBjYXJkcyB0aGF0IGdlbmVyYWxseSBzdWNrIGxpa2UgdGhlIGhpZm4uCisJICovCisJKm5pZHMgPSBOVUxMOworCXJldHVybiAoMCk7CisjZW5kaWYKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCit7CisJc3RydWN0IGNyeXB0X29wIGNyeXA7CisJc3RydWN0IGRldl9jcnlwdG9fc3RhdGUgKnN0YXRlID0gY3R4LT5jaXBoZXJfZGF0YTsKKwlzdHJ1Y3Qgc2Vzc2lvbl9vcCAqc2VzcyA9ICZzdGF0ZS0+ZF9zZXNzOworCWNvbnN0IHZvaWQgKmlpdjsKKwl1bnNpZ25lZCBjaGFyIHNhdmVfaXZbRVZQX01BWF9JVl9MRU5HVEhdOworCisJaWYgKHN0YXRlLT5kX2ZkIDwgMCkKKwkJcmV0dXJuICgwKTsKKwlpZiAoIWlubCkKKwkJcmV0dXJuICgxKTsKKwlpZiAoKGlubCAlIGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplKSAhPSAwKQorCQlyZXR1cm4gKDApOworCisJbWVtc2V0KCZjcnlwLCAwLCBzaXplb2YoY3J5cCkpOworCisJY3J5cC5zZXMgPSBzZXNzLT5zZXM7CisJY3J5cC5mbGFncyA9IDA7CisJY3J5cC5sZW4gPSBpbmw7CisJY3J5cC5zcmMgPSAoY2FkZHJfdCkgaW47CisJY3J5cC5kc3QgPSAoY2FkZHJfdCkgb3V0OworCWNyeXAubWFjID0gMDsKKworCWNyeXAub3AgPSBjdHgtPmVuY3J5cHQgPyBDT1BfRU5DUllQVCA6IENPUF9ERUNSWVBUOworCisJaWYgKGN0eC0+Y2lwaGVyLT5pdl9sZW4pIHsKKwkJY3J5cC5pdiA9IChjYWRkcl90KSBjdHgtPml2OworCQlpZiAoIWN0eC0+ZW5jcnlwdCkgeworCQkJaWl2ID0gaW4gKyBpbmwgLSBjdHgtPmNpcGhlci0+aXZfbGVuOworCQkJbWVtY3B5KHNhdmVfaXYsIGlpdiwgY3R4LT5jaXBoZXItPml2X2xlbik7CisJCX0KKwl9IGVsc2UKKwkJY3J5cC5pdiA9IE5VTEw7CisKKwlpZiAoaW9jdGwoc3RhdGUtPmRfZmQsIENJT0NDUllQVCwgJmNyeXApID09IC0xKSB7CisJCS8qIFhYWCBuZWVkIGJldHRlciBlcnJyb3IgaGFuZGxpbmcKKwkJICogdGhpcyBjYW4gZmFpbCBmb3IgYSBudW1iZXIgb2YgZGlmZmVyZW50IHJlYXNvbnMuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChjdHgtPmNpcGhlci0+aXZfbGVuKSB7CisJCWlmIChjdHgtPmVuY3J5cHQpCisJCQlpaXYgPSBvdXQgKyBpbmwgLSBjdHgtPmNpcGhlci0+aXZfbGVuOworCQllbHNlCisJCQlpaXYgPSBzYXZlX2l2OworCQltZW1jcHkoY3R4LT5pdiwgaWl2LCBjdHgtPmNpcGhlci0+aXZfbGVuKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKK3sKKwlzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSAqc3RhdGUgPSBjdHgtPmNpcGhlcl9kYXRhOworCXN0cnVjdCBzZXNzaW9uX29wICpzZXNzID0gJnN0YXRlLT5kX3Nlc3M7CisJaW50IGNpcGhlciA9IC0xLCBpOworCisJZm9yIChpID0gMDsgY2lwaGVyc1tpXS5pZDsgaSsrKQorCQlpZiAoY3R4LT5jaXBoZXItPm5pZCA9PSBjaXBoZXJzW2ldLm5pZCAmJgorCQkgICAgY3R4LT5jaXBoZXItPml2X2xlbiA8PSBjaXBoZXJzW2ldLml2bWF4ICYmCisJCSAgICBjdHgtPmtleV9sZW4gPT0gY2lwaGVyc1tpXS5rZXlsZW4pIHsKKwkJCWNpcGhlciA9IGNpcGhlcnNbaV0uaWQ7CisJCQlicmVhazsKKwkJfQorCisJaWYgKCFjaXBoZXJzW2ldLmlkKSB7CisJCXN0YXRlLT5kX2ZkID0gLTE7CisJCXJldHVybiAoMCk7CisJfQorCisJbWVtc2V0KHNlc3MsIDAsIHNpemVvZihzdHJ1Y3Qgc2Vzc2lvbl9vcCkpOworCisJaWYgKChzdGF0ZS0+ZF9mZCA9IGdldF9kZXZfY3J5cHRvKCkpIDwgMCkKKwkJcmV0dXJuICgwKTsKKworCXNlc3MtPmtleSA9IChjYWRkcl90KWtleTsKKwlzZXNzLT5rZXlsZW4gPSBjdHgtPmtleV9sZW47CisJc2Vzcy0+Y2lwaGVyID0gY2lwaGVyOworCisJaWYgKGlvY3RsKHN0YXRlLT5kX2ZkLCBDSU9DR1NFU1NJT04sIHNlc3MpID09IC0xKSB7CisJCWNsb3NlKHN0YXRlLT5kX2ZkKTsKKwkJc3RhdGUtPmRfZmQgPSAtMTsKKwkJcmV0dXJuICgwKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIGZyZWUgYW55dGhpbmcgd2UgYWxsb2NhdGVkIGVhcmxpZXIgd2hlbiBpbml0dGluZyBhCisgKiBzZXNzaW9uLCBhbmQgY2xvc2UgdGhlIHNlc3Npb24uCisgKi8KK3N0YXRpYyBpbnQKK2NyeXB0b2Rldl9jbGVhbnVwKEVWUF9DSVBIRVJfQ1RYICpjdHgpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldl9jcnlwdG9fc3RhdGUgKnN0YXRlID0gY3R4LT5jaXBoZXJfZGF0YTsKKwlzdHJ1Y3Qgc2Vzc2lvbl9vcCAqc2VzcyA9ICZzdGF0ZS0+ZF9zZXNzOworCisJaWYgKHN0YXRlLT5kX2ZkIDwgMCkKKwkJcmV0dXJuICgwKTsKKworCS8qIFhYWCBpZiB0aGlzIGlvY3RsIGZhaWxzLCBzb21ldGluZydzIHdyb25nLiB0aGUgaW52b2tlcgorCSAqIG1heSBoYXZlIGNhbGxlZCB1cyB3aXRoIGEgYm9ndXMgY3R4LCBvciB3ZSBjb3VsZAorCSAqIGhhdmUgYSBkZXZpY2UgdGhhdCBmb3Igd2hhdGV2ZXIgcmVhc29uIGp1c3QgZG9lc24ndAorCSAqIHdhbnQgdG8gcGxheSBiYWxsIC0gaXQncyBub3QgY2xlYXIgd2hhdCdzIHJpZ2h0CisJICogaGVyZSAtIHNob3VsZCB0aGlzIGJlIGFuIGVycm9yPyBzaG91bGQgaXQganVzdAorCSAqIGluY3JlYXNlIGEgY291bnRlciwgaG1tLiBGb3IgcmlnaHQgbm93LCB3ZSByZXR1cm4KKwkgKiAwIC0gSSBkb24ndCBiZWxpZXZlIHRoYXQgdG8gYmUgInJpZ2h0Ii4gd2UgY291bGQKKwkgKiBjYWxsIHRoZSBnb3JweSBvcGVuc3NsIGxpYiBlcnJvciBoYW5kbGVycyB0aGF0CisJICogcHJpbnQgbWVzc2FnZXMgdG8gdXNlcnMgb2YgdGhlIGxpYnJhcnkuIGhtbS4uCisJICovCisKKwlpZiAoaW9jdGwoc3RhdGUtPmRfZmQsIENJT0NGU0VTU0lPTiwgJnNlc3MtPnNlcykgPT0gLTEpIHsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAxOworCX0KKwljbG9zZShzdGF0ZS0+ZF9mZCk7CisJc3RhdGUtPmRfZmQgPSAtMTsKKworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIGxpYmNyeXB0byBFVlAgc3R1ZmYgLSB0aGlzIGlzIGhvdyB3ZSBnZXQgd2lyZWQgdG8gRVZQIHNvIHRoZSBlbmdpbmUKKyAqIGdldHMgY2FsbGVkIHdoZW4gbGliY3J5cHRvIHJlcXVlc3RzIGEgY2lwaGVyIE5JRC4KKyAqLworCisvKiBSQzQgKi8KK2NvbnN0IEVWUF9DSVBIRVIgY3J5cHRvZGV2X3JjNCA9IHsKKwlOSURfcmM0LAorCTEsIDE2LCAwLAorCUVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCwKKwljcnlwdG9kZXZfaW5pdF9rZXksCisJY3J5cHRvZGV2X2NpcGhlciwKKwljcnlwdG9kZXZfY2xlYW51cCwKKwlzaXplb2Yoc3RydWN0IGRldl9jcnlwdG9fc3RhdGUpLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMCit9OworCisvKiBERVMgQ0JDIEVWUCAqLworY29uc3QgRVZQX0NJUEhFUiBjcnlwdG9kZXZfZGVzX2NiYyA9IHsKKwlOSURfZGVzX2NiYywKKwk4LCA4LCA4LAorCUVWUF9DSVBIX0NCQ19NT0RFLAorCWNyeXB0b2Rldl9pbml0X2tleSwKKwljcnlwdG9kZXZfY2lwaGVyLAorCWNyeXB0b2Rldl9jbGVhbnVwLAorCXNpemVvZihzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSksCisJRVZQX0NJUEhFUl9zZXRfYXNuMV9pdiwKKwlFVlBfQ0lQSEVSX2dldF9hc24xX2l2LAorCU5VTEwKK307CisKKy8qIDNERVMgQ0JDIEVWUCAqLworY29uc3QgRVZQX0NJUEhFUiBjcnlwdG9kZXZfM2Rlc19jYmMgPSB7CisJTklEX2Rlc19lZGUzX2NiYywKKwk4LCAyNCwgOCwKKwlFVlBfQ0lQSF9DQkNfTU9ERSwKKwljcnlwdG9kZXZfaW5pdF9rZXksCisJY3J5cHRvZGV2X2NpcGhlciwKKwljcnlwdG9kZXZfY2xlYW51cCwKKwlzaXplb2Yoc3RydWN0IGRldl9jcnlwdG9fc3RhdGUpLAorCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsCisJRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwlOVUxMCit9OworCitjb25zdCBFVlBfQ0lQSEVSIGNyeXB0b2Rldl9iZl9jYmMgPSB7CisJTklEX2JmX2NiYywKKwk4LCAxNiwgOCwKKwlFVlBfQ0lQSF9DQkNfTU9ERSwKKwljcnlwdG9kZXZfaW5pdF9rZXksCisJY3J5cHRvZGV2X2NpcGhlciwKKwljcnlwdG9kZXZfY2xlYW51cCwKKwlzaXplb2Yoc3RydWN0IGRldl9jcnlwdG9fc3RhdGUpLAorCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsCisJRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwlOVUxMCit9OworCitjb25zdCBFVlBfQ0lQSEVSIGNyeXB0b2Rldl9jYXN0X2NiYyA9IHsKKwlOSURfY2FzdDVfY2JjLAorCTgsIDE2LCA4LAorCUVWUF9DSVBIX0NCQ19NT0RFLAorCWNyeXB0b2Rldl9pbml0X2tleSwKKwljcnlwdG9kZXZfY2lwaGVyLAorCWNyeXB0b2Rldl9jbGVhbnVwLAorCXNpemVvZihzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSksCisJRVZQX0NJUEhFUl9zZXRfYXNuMV9pdiwKKwlFVlBfQ0lQSEVSX2dldF9hc24xX2l2LAorCU5VTEwKK307CisKK2NvbnN0IEVWUF9DSVBIRVIgY3J5cHRvZGV2X2Flc19jYmMgPSB7CisJTklEX2Flc18xMjhfY2JjLAorCTE2LCAxNiwgMTYsCisJRVZQX0NJUEhfQ0JDX01PREUsCisJY3J5cHRvZGV2X2luaXRfa2V5LAorCWNyeXB0b2Rldl9jaXBoZXIsCisJY3J5cHRvZGV2X2NsZWFudXAsCisJc2l6ZW9mKHN0cnVjdCBkZXZfY3J5cHRvX3N0YXRlKSwKKwlFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCUVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsCisJTlVMTAorfTsKKworY29uc3QgRVZQX0NJUEhFUiBjcnlwdG9kZXZfYWVzXzE5Ml9jYmMgPSB7CisJTklEX2Flc18xOTJfY2JjLAorCTE2LCAyNCwgMTYsCisJRVZQX0NJUEhfQ0JDX01PREUsCisJY3J5cHRvZGV2X2luaXRfa2V5LAorCWNyeXB0b2Rldl9jaXBoZXIsCisJY3J5cHRvZGV2X2NsZWFudXAsCisJc2l6ZW9mKHN0cnVjdCBkZXZfY3J5cHRvX3N0YXRlKSwKKwlFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCUVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsCisJTlVMTAorfTsKKworY29uc3QgRVZQX0NJUEhFUiBjcnlwdG9kZXZfYWVzXzI1Nl9jYmMgPSB7CisJTklEX2Flc18yNTZfY2JjLAorCTE2LCAzMiwgMTYsCisJRVZQX0NJUEhfQ0JDX01PREUsCisJY3J5cHRvZGV2X2luaXRfa2V5LAorCWNyeXB0b2Rldl9jaXBoZXIsCisJY3J5cHRvZGV2X2NsZWFudXAsCisJc2l6ZW9mKHN0cnVjdCBkZXZfY3J5cHRvX3N0YXRlKSwKKwlFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCUVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsCisJTlVMTAorfTsKKworLyoKKyAqIFJlZ2lzdGVyZWQgYnkgdGhlIEVOR0lORSB3aGVuIHVzZWQgdG8gZmluZCBvdXQgaG93IHRvIGRlYWwgd2l0aAorICogYSBwYXJ0aWN1bGFyIE5JRCBpbiB0aGUgRU5HSU5FLiB0aGlzIHNheXMgd2hhdCB3ZSdsbCBkbyBhdCB0aGUKKyAqIHRvcCBsZXZlbCAtIG5vdGUsIHRoYXQgbGlzdCBpcyByZXN0cmljdGVkIGJ5IHdoYXQgd2UgYW5zd2VyIHdpdGgKKyAqLworc3RhdGljIGludAorY3J5cHRvZGV2X2VuZ2luZV9jaXBoZXJzKEVOR0lORSAqZSwgY29uc3QgRVZQX0NJUEhFUiAqKmNpcGhlciwKKyAgICBjb25zdCBpbnQgKipuaWRzLCBpbnQgbmlkKQoreworCWlmICghY2lwaGVyKQorCQlyZXR1cm4gKGNyeXB0b2Rldl91c2FibGVfY2lwaGVycyhuaWRzKSk7CisKKwlzd2l0Y2ggKG5pZCkgeworCWNhc2UgTklEX3JjNDoKKwkJKmNpcGhlciA9ICZjcnlwdG9kZXZfcmM0OworCQlicmVhazsKKwljYXNlIE5JRF9kZXNfZWRlM19jYmM6CisJCSpjaXBoZXIgPSAmY3J5cHRvZGV2XzNkZXNfY2JjOworCQlicmVhazsKKwljYXNlIE5JRF9kZXNfY2JjOgorCQkqY2lwaGVyID0gJmNyeXB0b2Rldl9kZXNfY2JjOworCQlicmVhazsKKwljYXNlIE5JRF9iZl9jYmM6CisJCSpjaXBoZXIgPSAmY3J5cHRvZGV2X2JmX2NiYzsKKwkJYnJlYWs7CisJY2FzZSBOSURfY2FzdDVfY2JjOgorCQkqY2lwaGVyID0gJmNyeXB0b2Rldl9jYXN0X2NiYzsKKwkJYnJlYWs7CisJY2FzZSBOSURfYWVzXzEyOF9jYmM6CisJCSpjaXBoZXIgPSAmY3J5cHRvZGV2X2Flc19jYmM7CisJCWJyZWFrOworCWNhc2UgTklEX2Flc18xOTJfY2JjOgorCQkqY2lwaGVyID0gJmNyeXB0b2Rldl9hZXNfMTkyX2NiYzsKKwkJYnJlYWs7CisJY2FzZSBOSURfYWVzXzI1Nl9jYmM6CisJCSpjaXBoZXIgPSAmY3J5cHRvZGV2X2Flc18yNTZfY2JjOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqY2lwaGVyID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAoKmNpcGhlciAhPSBOVUxMKTsKK30KKworCisjaWZkZWYgVVNFX0NSWVBUT0RFVl9ESUdFU1RTCisKKy8qIGNvbnZlcnQgZGlnZXN0IHR5cGUgdG8gY3J5cHRvZGV2ICovCitzdGF0aWMgaW50CitkaWdlc3RfbmlkX3RvX2NyeXB0b2RldihpbnQgbmlkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgZGlnZXN0c1tpXS5pZDsgaSsrKQorCQlpZiAoZGlnZXN0c1tpXS5uaWQgPT0gbmlkKQorCQkJcmV0dXJuIChkaWdlc3RzW2ldLmlkKTsKKwlyZXR1cm4gKDApOworfQorCisKK3N0YXRpYyBpbnQKK2RpZ2VzdF9rZXlfbGVuZ3RoKGludCBuaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBkaWdlc3RzW2ldLmlkOyBpKyspCisJCWlmIChkaWdlc3RzW2ldLm5pZCA9PSBuaWQpCisJCQlyZXR1cm4gZGlnZXN0c1tpXS5rZXlsZW47CisJcmV0dXJuICgwKTsKK30KKworCitzdGF0aWMgaW50IGNyeXB0b2Rldl9kaWdlc3RfaW5pdChFVlBfTURfQ1RYICpjdHgpCit7CisJc3RydWN0IGRldl9jcnlwdG9fc3RhdGUgKnN0YXRlID0gY3R4LT5tZF9kYXRhOworCXN0cnVjdCBzZXNzaW9uX29wICpzZXNzID0gJnN0YXRlLT5kX3Nlc3M7CisJaW50IGRpZ2VzdDsKKworCWlmICgoZGlnZXN0ID0gZGlnZXN0X25pZF90b19jcnlwdG9kZXYoY3R4LT5kaWdlc3QtPnR5cGUpKSA9PSBOSURfdW5kZWYpeworCQlwcmludGYoImNyeXB0b2Rldl9kaWdlc3RfaW5pdDogQ2FuJ3QgZ2V0IGRpZ2VzdCBcbiIpOworCQlyZXR1cm4gKDApOworCX0KKworCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBkZXZfY3J5cHRvX3N0YXRlKSk7CisKKwlpZiAoKHN0YXRlLT5kX2ZkID0gZ2V0X2Rldl9jcnlwdG8oKSkgPCAwKSB7CisJCXByaW50ZigiY3J5cHRvZGV2X2RpZ2VzdF9pbml0OiBDYW4ndCBnZXQgRGV2IFxuIik7CisJCXJldHVybiAoMCk7CisJfQorCisJc2Vzcy0+bWFja2V5ID0gc3RhdGUtPmR1bW15X21hY19rZXk7CisJc2Vzcy0+bWFja2V5bGVuID0gZGlnZXN0X2tleV9sZW5ndGgoY3R4LT5kaWdlc3QtPnR5cGUpOworCXNlc3MtPm1hYyA9IGRpZ2VzdDsKKworCWlmIChpb2N0bChzdGF0ZS0+ZF9mZCwgQ0lPQ0dTRVNTSU9OLCBzZXNzKSA8IDApIHsKKwkJY2xvc2Uoc3RhdGUtPmRfZmQpOworCQlzdGF0ZS0+ZF9mZCA9IC0xOworCQlwcmludGYoImNyeXB0b2Rldl9kaWdlc3RfaW5pdDogT3BlbiBzZXNzaW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAoMCk7CisJfQorCisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludCBjcnlwdG9kZXZfZGlnZXN0X3VwZGF0ZShFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsCisJCXNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgY3J5cHRfb3AgY3J5cDsKKwlzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSAqc3RhdGUgPSBjdHgtPm1kX2RhdGE7CisJc3RydWN0IHNlc3Npb25fb3AgKnNlc3MgPSAmc3RhdGUtPmRfc2VzczsKKworCWlmICghZGF0YSB8fCBzdGF0ZS0+ZF9mZCA8IDApIHsKKwkJcHJpbnRmKCJjcnlwdG9kZXZfZGlnZXN0X3VwZGF0ZTogaWxsZWdhbCBpbnB1dHMgXG4iKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAoIWNvdW50KSB7CisJCXJldHVybiAoMCk7CisJfQorCisJaWYgKCEoY3R4LT5mbGFncyAmIEVWUF9NRF9DVFhfRkxBR19PTkVTSE9UKSkgeworCQkvKiBpZiBhcHBsaWNhdGlvbiBkb2Vzbid0IHN1cHBvcnQgb25lIGJ1ZmZlciAqLworCQlzdGF0ZS0+bWFjX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2Moc3RhdGUtPm1hY19kYXRhLCBzdGF0ZS0+bWFjX2xlbiArIGNvdW50KTsKKworCQlpZiAoIXN0YXRlLT5tYWNfZGF0YSkgeworCQkJcHJpbnRmKCJjcnlwdG9kZXZfZGlnZXN0X3VwZGF0ZTogcmVhbGxvYyBmYWlsZWRcbiIpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCW1lbWNweShzdGF0ZS0+bWFjX2RhdGEgKyBzdGF0ZS0+bWFjX2xlbiwgZGF0YSwgY291bnQpOworICAgCQlzdGF0ZS0+bWFjX2xlbiArPSBjb3VudDsKKwkKKwkJcmV0dXJuICgxKTsKKwl9CisKKwltZW1zZXQoJmNyeXAsIDAsIHNpemVvZihjcnlwKSk7CisKKwljcnlwLnNlcyA9IHNlc3MtPnNlczsKKwljcnlwLmZsYWdzID0gMDsKKwljcnlwLmxlbiA9IGNvdW50OworCWNyeXAuc3JjID0gKGNhZGRyX3QpIGRhdGE7CisJY3J5cC5kc3QgPSBOVUxMOworCWNyeXAubWFjID0gKGNhZGRyX3QpIHN0YXRlLT5kaWdlc3RfcmVzOworCWlmIChpb2N0bChzdGF0ZS0+ZF9mZCwgQ0lPQ0NSWVBULCAmY3J5cCkgPCAwKSB7CisJCXByaW50ZigiY3J5cHRvZGV2X2RpZ2VzdF91cGRhdGU6IGRpZ2VzdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gKDApOworCX0KKwlyZXR1cm4gKDEpOworfQorCisKK3N0YXRpYyBpbnQgY3J5cHRvZGV2X2RpZ2VzdF9maW5hbChFVlBfTURfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm1kKQoreworCXN0cnVjdCBjcnlwdF9vcCBjcnlwOworCXN0cnVjdCBkZXZfY3J5cHRvX3N0YXRlICpzdGF0ZSA9IGN0eC0+bWRfZGF0YTsKKwlzdHJ1Y3Qgc2Vzc2lvbl9vcCAqc2VzcyA9ICZzdGF0ZS0+ZF9zZXNzOworCisJaW50IHJldCA9IDE7CisKKwlpZiAoIW1kIHx8IHN0YXRlLT5kX2ZkIDwgMCkgeworCQlwcmludGYoImNyeXB0b2Rldl9kaWdlc3RfZmluYWw6IGlsbGVnYWwgaW5wdXRcbiIpOworCQlyZXR1cm4oMCk7CisJfQorCisJaWYgKCEgKGN0eC0+ZmxhZ3MgJiBFVlBfTURfQ1RYX0ZMQUdfT05FU0hPVCkgKSB7CisJCS8qIGlmIGFwcGxpY2F0aW9uIGRvZXNuJ3Qgc3VwcG9ydCBvbmUgYnVmZmVyICovCisJCW1lbXNldCgmY3J5cCwgMCwgc2l6ZW9mKGNyeXApKTsKKworCQljcnlwLnNlcyA9IHNlc3MtPnNlczsKKwkJY3J5cC5mbGFncyA9IDA7CisJCWNyeXAubGVuID0gc3RhdGUtPm1hY19sZW47CisJCWNyeXAuc3JjID0gc3RhdGUtPm1hY19kYXRhOworCQljcnlwLmRzdCA9IE5VTEw7CisJCWNyeXAubWFjID0gKGNhZGRyX3QpbWQ7CisKKwkJaWYgKGlvY3RsKHN0YXRlLT5kX2ZkLCBDSU9DQ1JZUFQsICZjcnlwKSA8IDApIHsKKwkJCXByaW50ZigiY3J5cHRvZGV2X2RpZ2VzdF9maW5hbDogZGlnZXN0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gKDApOworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJbWVtY3B5KG1kLCBzdGF0ZS0+ZGlnZXN0X3JlcywgY3R4LT5kaWdlc3QtPm1kX3NpemUpOworCisJcmV0dXJuIChyZXQpOworfQorCisKK3N0YXRpYyBpbnQgY3J5cHRvZGV2X2RpZ2VzdF9jbGVhbnVwKEVWUF9NRF9DVFggKmN0eCkKK3sKKwlpbnQgcmV0ID0gMTsKKwlzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSAqc3RhdGUgPSBjdHgtPm1kX2RhdGE7CisJc3RydWN0IHNlc3Npb25fb3AgKnNlc3MgPSAmc3RhdGUtPmRfc2VzczsKKworCWlmIChzdGF0ZS0+ZF9mZCA8IDApIHsKKwkJcHJpbnRmKCJjcnlwdG9kZXZfZGlnZXN0X2NsZWFudXA6IGlsbGVnYWwgaW5wdXRcbiIpOworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChzdGF0ZS0+bWFjX2RhdGEpIHsKKwkJT1BFTlNTTF9mcmVlKHN0YXRlLT5tYWNfZGF0YSk7CisJCXN0YXRlLT5tYWNfZGF0YSA9IE5VTEw7CisJCXN0YXRlLT5tYWNfbGVuID0gMDsKKwl9CisKKwlpZiAoc3RhdGUtPmNvcHkpCisJCXJldHVybiAxOworCisJaWYgKGlvY3RsKHN0YXRlLT5kX2ZkLCBDSU9DRlNFU1NJT04sICZzZXNzLT5zZXMpIDwgMCkgeworCQlwcmludGYoImNyeXB0b2Rldl9kaWdlc3RfY2xlYW51cDogZmFpbGVkIHRvIGNsb3NlIHNlc3Npb25cbiIpOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXJldCA9IDE7CisJfQorCWNsb3NlKHN0YXRlLT5kX2ZkKTsJCisJc3RhdGUtPmRfZmQgPSAtMTsKKworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGludCBjcnlwdG9kZXZfZGlnZXN0X2NvcHkoRVZQX01EX0NUWCAqdG8sY29uc3QgRVZQX01EX0NUWCAqZnJvbSkKK3sKKwlzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSAqZnN0YXRlID0gZnJvbS0+bWRfZGF0YTsKKwlzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSAqZHN0YXRlID0gdG8tPm1kX2RhdGE7CisKKwltZW1jcHkoZHN0YXRlLCBmc3RhdGUsIHNpemVvZihzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSkpOworCisJaWYgKGZzdGF0ZS0+bWFjX2xlbiAhPSAwKSB7CisJCWRzdGF0ZS0+bWFjX2RhdGEgPSBPUEVOU1NMX21hbGxvYyhmc3RhdGUtPm1hY19sZW4pOworCQltZW1jcHkoZHN0YXRlLT5tYWNfZGF0YSwgZnN0YXRlLT5tYWNfZGF0YSwgZnN0YXRlLT5tYWNfbGVuKTsKKwl9CisKKwlkc3RhdGUtPmNvcHkgPSAxOworCisJcmV0dXJuIDE7Cit9CisKKworY29uc3QgRVZQX01EIGNyeXB0b2Rldl9zaGExID0geworCU5JRF9zaGExLAorCU5JRF91bmRlZiwgCisJU0hBX0RJR0VTVF9MRU5HVEgsIAorCUVWUF9NRF9GTEFHX09ORVNIT1QsCisJY3J5cHRvZGV2X2RpZ2VzdF9pbml0LAorCWNyeXB0b2Rldl9kaWdlc3RfdXBkYXRlLAorCWNyeXB0b2Rldl9kaWdlc3RfZmluYWwsCisJY3J5cHRvZGV2X2RpZ2VzdF9jb3B5LAorCWNyeXB0b2Rldl9kaWdlc3RfY2xlYW51cCwKKwlFVlBfUEtFWV9OVUxMX21ldGhvZCwKKwlTSEFfQ0JMT0NLLAorCXNpemVvZihzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSksCit9OworCitjb25zdCBFVlBfTUQgY3J5cHRvZGV2X21kNSA9IHsKKwlOSURfbWQ1LAorCU5JRF91bmRlZiwgCisJMTYgLyogTUQ1X0RJR0VTVF9MRU5HVEggKi8sIAorCUVWUF9NRF9GTEFHX09ORVNIT1QsCisJY3J5cHRvZGV2X2RpZ2VzdF9pbml0LAorCWNyeXB0b2Rldl9kaWdlc3RfdXBkYXRlLAorCWNyeXB0b2Rldl9kaWdlc3RfZmluYWwsCisJY3J5cHRvZGV2X2RpZ2VzdF9jb3B5LAorCWNyeXB0b2Rldl9kaWdlc3RfY2xlYW51cCwKKwlFVlBfUEtFWV9OVUxMX21ldGhvZCwKKwk2NCAvKiBNRDVfQ0JMT0NLICovLAorCXNpemVvZihzdHJ1Y3QgZGV2X2NyeXB0b19zdGF0ZSksCit9OworCisjZW5kaWYgLyogVVNFX0NSWVBUT0RFVl9ESUdFU1RTICovCisKKworc3RhdGljIGludAorY3J5cHRvZGV2X2VuZ2luZV9kaWdlc3RzKEVOR0lORSAqZSwgY29uc3QgRVZQX01EICoqZGlnZXN0LAorICAgIGNvbnN0IGludCAqKm5pZHMsIGludCBuaWQpCit7CisJaWYgKCFkaWdlc3QpCisJCXJldHVybiAoY3J5cHRvZGV2X3VzYWJsZV9kaWdlc3RzKG5pZHMpKTsKKworCXN3aXRjaCAobmlkKSB7CisjaWZkZWYgVVNFX0NSWVBUT0RFVl9ESUdFU1RTCisJY2FzZSBOSURfbWQ1OgorCQkqZGlnZXN0ID0gJmNyeXB0b2Rldl9tZDU7IAorCQlicmVhazsKKwljYXNlIE5JRF9zaGExOgorCQkqZGlnZXN0ID0gJmNyeXB0b2Rldl9zaGExOworIAkJYnJlYWs7CisJZGVmYXVsdDoKKyNlbmRpZiAvKiBVU0VfQ1JZUFRPREVWX0RJR0VTVFMgKi8KKwkJKmRpZ2VzdCA9IE5VTEw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKCpkaWdlc3QgIT0gTlVMTCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgQklHTlVNIHRvIHRoZSByZXByZXNlbnRhdGlvbiB0aGF0IC9kZXYvY3J5cHRvIG5lZWRzLgorICogVXBvbiBjb21wbGV0aW9uIG9mIHVzZSwgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZworICogY3JwLT5jcnBfcC4KKyAqLworc3RhdGljIGludAorYm4yY3JwYXJhbShjb25zdCBCSUdOVU0gKmEsIHN0cnVjdCBjcnBhcmFtICpjcnApCit7CisJaW50IGksIGosIGs7CisJc3NpemVfdCBieXRlcywgYml0czsKKwl1X2NoYXIgKmI7CisKKwljcnAtPmNycF9wID0gTlVMTDsKKwljcnAtPmNycF9uYml0cyA9IDA7CisKKwliaXRzID0gQk5fbnVtX2JpdHMoYSk7CisJYnl0ZXMgPSAoYml0cyArIDcpIC8gODsKKworCWIgPSBtYWxsb2MoYnl0ZXMpOworCWlmIChiID09IE5VTEwpCisJCXJldHVybiAoMSk7CisJbWVtc2V0KGIsIDAsIGJ5dGVzKTsKKworCWNycC0+Y3JwX3AgPSAoY2FkZHJfdCkgYjsKKwljcnAtPmNycF9uYml0cyA9IGJpdHM7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGEtPnRvcDsgaSsrKSB7CisJCWZvciAoayA9IDA7IGsgPCBCTl9CSVRTMiAvIDg7IGsrKykgeworCQkJaWYgKChqICsgaykgPj0gYnl0ZXMpCisJCQkJcmV0dXJuICgwKTsKKwkJCWJbaiArIGtdID0gYS0+ZFtpXSA+PiAoayAqIDgpOworCQl9CisJCWogKz0gQk5fQklUUzIgLyA4OworCX0KKwlyZXR1cm4gKDApOworfQorCisvKiBDb252ZXJ0IGEgL2Rldi9jcnlwdG8gcGFyYW1ldGVyIHRvIGEgQklHTlVNICovCitzdGF0aWMgaW50CitjcnBhcmFtMmJuKHN0cnVjdCBjcnBhcmFtICpjcnAsIEJJR05VTSAqYSkKK3sKKwl1X2ludDhfdCAqcGQ7CisJaW50IGksIGJ5dGVzOworCisJYnl0ZXMgPSAoY3JwLT5jcnBfbmJpdHMgKyA3KSAvIDg7CisKKwlpZiAoYnl0ZXMgPT0gMCkKKwkJcmV0dXJuICgtMSk7CisKKwlpZiAoKHBkID0gKHVfaW50OF90ICopIG1hbGxvYyhieXRlcykpID09IE5VTEwpCisJCXJldHVybiAoLTEpOworCisJZm9yIChpID0gMDsgaSA8IGJ5dGVzOyBpKyspCisJCXBkW2ldID0gY3JwLT5jcnBfcFtieXRlcyAtIGkgLSAxXTsKKworCUJOX2JpbjJibihwZCwgYnl0ZXMsIGEpOworCWZyZWUocGQpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIHZvaWQKK3phcHBhcmFtcyhzdHJ1Y3QgY3J5cHRfa29wICprb3ApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwga29wLT5jcmtfaXBhcmFtcyArIGtvcC0+Y3JrX29wYXJhbXM7IGkrKykgeworCQlpZiAoa29wLT5jcmtfcGFyYW1baV0uY3JwX3ApCisJCQlmcmVlKGtvcC0+Y3JrX3BhcmFtW2ldLmNycF9wKTsKKwkJa29wLT5jcmtfcGFyYW1baV0uY3JwX3AgPSBOVUxMOworCQlrb3AtPmNya19wYXJhbVtpXS5jcnBfbmJpdHMgPSAwOworCX0KK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X2FzeW0oc3RydWN0IGNyeXB0X2tvcCAqa29wLCBpbnQgcmxlbiwgQklHTlVNICpyLCBpbnQgc2xlbiwgQklHTlVNICpzKQoreworCWludCBmZCwgcmV0ID0gLTE7CisKKwlpZiAoKGZkID0gZ2V0X2FzeW1fZGV2X2NyeXB0bygpKSA8IDApCisJCXJldHVybiAocmV0KTsKKworCWlmIChyKSB7CisJCWtvcC0+Y3JrX3BhcmFtW2tvcC0+Y3JrX2lwYXJhbXNdLmNycF9wID0gY2FsbG9jKHJsZW4sIHNpemVvZihjaGFyKSk7CisJCWtvcC0+Y3JrX3BhcmFtW2tvcC0+Y3JrX2lwYXJhbXNdLmNycF9uYml0cyA9IHJsZW4gKiA4OworCQlrb3AtPmNya19vcGFyYW1zKys7CisJfQorCWlmIChzKSB7CisJCWtvcC0+Y3JrX3BhcmFtW2tvcC0+Y3JrX2lwYXJhbXMrMV0uY3JwX3AgPSBjYWxsb2Moc2xlbiwgc2l6ZW9mKGNoYXIpKTsKKwkJa29wLT5jcmtfcGFyYW1ba29wLT5jcmtfaXBhcmFtcysxXS5jcnBfbmJpdHMgPSBzbGVuICogODsKKwkJa29wLT5jcmtfb3BhcmFtcysrOworCX0KKworCWlmIChpb2N0bChmZCwgQ0lPQ0tFWSwga29wKSA9PSAwKSB7CisJCWlmIChyKQorCQkJY3JwYXJhbTJibigma29wLT5jcmtfcGFyYW1ba29wLT5jcmtfaXBhcmFtc10sIHIpOworCQlpZiAocykKKwkJCWNycGFyYW0yYm4oJmtvcC0+Y3JrX3BhcmFtW2tvcC0+Y3JrX2lwYXJhbXMrMV0sIHMpOworCQlyZXQgPSAwOworCX0KKworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X2JuX21vZF9leHAoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKyAgICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqaW5fbW9udCkKK3sKKwlzdHJ1Y3QgY3J5cHRfa29wIGtvcDsKKwlpbnQgcmV0ID0gMTsKKworCS8qIEN1cnJlbnRseSwgd2Uga25vdyB3ZSBjYW4gZG8gbW9kIGV4cCBpZmYgd2UgY2FuIGRvIGFueQorCSAqIGFzeW1tZXRyaWMgb3BlcmF0aW9ucyBhdCBhbGwuCisJICovCisJaWYgKGNyeXB0b2Rldl9hc3ltZmVhdCA9PSAwKSB7CisJCXJldCA9IEJOX21vZF9leHAociwgYSwgcCwgbSwgY3R4KTsKKwkJcmV0dXJuIChyZXQpOworCX0KKworCW1lbXNldCgma29wLCAwLCBzaXplb2Yga29wKTsKKwlrb3AuY3JrX29wID0gQ1JLX01PRF9FWFA7CisKKwkvKiBpbnB1dHM6IGFecCAlIG0gKi8KKwlpZiAoYm4yY3JwYXJhbShhLCAma29wLmNya19wYXJhbVswXSkpCisJCWdvdG8gZXJyOworCWlmIChibjJjcnBhcmFtKHAsICZrb3AuY3JrX3BhcmFtWzFdKSkKKwkJZ290byBlcnI7CisJaWYgKGJuMmNycGFyYW0obSwgJmtvcC5jcmtfcGFyYW1bMl0pKQorCQlnb3RvIGVycjsKKwlrb3AuY3JrX2lwYXJhbXMgPSAzOworCisJaWYgKGNyeXB0b2Rldl9hc3ltKCZrb3AsIEJOX251bV9ieXRlcyhtKSwgciwgMCwgTlVMTCkpIHsKKwkJY29uc3QgUlNBX01FVEhPRCAqbWV0aCA9IFJTQV9QS0NTMV9TU0xlYXkoKTsKKwkJcHJpbnRmKCJPQ0YgYXN5bSBwcm9jZXNzIGZhaWxlZCwgUnVubmluZyBpbiBzb2Z0d2FyZVxuIik7CisJCXJldCA9IG1ldGgtPmJuX21vZF9leHAociwgYSwgcCwgbSwgY3R4LCBpbl9tb250KTsKKworCX0gZWxzZSBpZiAoRUNBTkNFTEVEID09IGtvcC5jcmtfc3RhdHVzKSB7CisJCWNvbnN0IFJTQV9NRVRIT0QgKm1ldGggPSBSU0FfUEtDUzFfU1NMZWF5KCk7CisJCXByaW50ZigiT0NGIGhhcmR3YXJlIG9wZXJhdGlvbiBjYW5jZWxsZWQuIFJ1bm5pbmcgaW4gU29mdHdhcmVcbiIpOworCQlyZXQgPSBtZXRoLT5ibl9tb2RfZXhwKHIsIGEsIHAsIG0sIGN0eCwgaW5fbW9udCk7CisJfQorCS8qIGVsc2UgY3J5cHRvZGV2IG9wZXJhdGlvbiB3b3JrZWQgb2sgPT0+IHJldCA9IDEqLworCitlcnI6CisJemFwcGFyYW1zKCZrb3ApOworCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X3JzYV9ub2NydF9tb2RfZXhwKEJJR05VTSAqcjAsIGNvbnN0IEJJR05VTSAqSSwgUlNBICpyc2EsIEJOX0NUWCAqY3R4KQoreworCWludCByOworCWN0eCA9IEJOX0NUWF9uZXcoKTsKKwlyID0gY3J5cHRvZGV2X2JuX21vZF9leHAocjAsIEksIHJzYS0+ZCwgcnNhLT5uLCBjdHgsIE5VTEwpOworCUJOX0NUWF9mcmVlKGN0eCk7CisJcmV0dXJuIChyKTsKK30KKworc3RhdGljIGludAorY3J5cHRvZGV2X3JzYV9tb2RfZXhwKEJJR05VTSAqcjAsIGNvbnN0IEJJR05VTSAqSSwgUlNBICpyc2EsIEJOX0NUWCAqY3R4KQoreworCXN0cnVjdCBjcnlwdF9rb3Aga29wOworCWludCByZXQgPSAxOworCisJaWYgKCFyc2EtPnAgfHwgIXJzYS0+cSB8fCAhcnNhLT5kbXAxIHx8ICFyc2EtPmRtcTEgfHwgIXJzYS0+aXFtcCkgeworCQkvKiBYWFggMCBtZWFucyBmYWlsdXJlPz8gKi8KKwkJcmV0dXJuICgwKTsKKwl9CisKKwltZW1zZXQoJmtvcCwgMCwgc2l6ZW9mIGtvcCk7CisJa29wLmNya19vcCA9IENSS19NT0RfRVhQX0NSVDsKKwkvKiBpbnB1dHM6IHJzYS0+cCByc2EtPnEgSSByc2EtPmRtcDEgcnNhLT5kbXExIHJzYS0+aXFtcCAqLworCWlmIChibjJjcnBhcmFtKHJzYS0+cCwgJmtvcC5jcmtfcGFyYW1bMF0pKQorCQlnb3RvIGVycjsKKwlpZiAoYm4yY3JwYXJhbShyc2EtPnEsICZrb3AuY3JrX3BhcmFtWzFdKSkKKwkJZ290byBlcnI7CisJaWYgKGJuMmNycGFyYW0oSSwgJmtvcC5jcmtfcGFyYW1bMl0pKQorCQlnb3RvIGVycjsKKwlpZiAoYm4yY3JwYXJhbShyc2EtPmRtcDEsICZrb3AuY3JrX3BhcmFtWzNdKSkKKwkJZ290byBlcnI7CisJaWYgKGJuMmNycGFyYW0ocnNhLT5kbXExLCAma29wLmNya19wYXJhbVs0XSkpCisJCWdvdG8gZXJyOworCWlmIChibjJjcnBhcmFtKHJzYS0+aXFtcCwgJmtvcC5jcmtfcGFyYW1bNV0pKQorCQlnb3RvIGVycjsKKwlrb3AuY3JrX2lwYXJhbXMgPSA2OworCisJaWYgKGNyeXB0b2Rldl9hc3ltKCZrb3AsIEJOX251bV9ieXRlcyhyc2EtPm4pLCByMCwgMCwgTlVMTCkpIHsKKwkJY29uc3QgUlNBX01FVEhPRCAqbWV0aCA9IFJTQV9QS0NTMV9TU0xlYXkoKTsKKwkJcHJpbnRmKCJPQ0YgYXN5bSBwcm9jZXNzIGZhaWxlZCwgcnVubmluZyBpbiBTb2Z0d2FyZVxuIik7CisJCXJldCA9ICgqbWV0aC0+cnNhX21vZF9leHApKHIwLCBJLCByc2EsIGN0eCk7CisKKwl9IGVsc2UgaWYgKEVDQU5DRUxFRCA9PSBrb3AuY3JrX3N0YXR1cykgeworCQljb25zdCBSU0FfTUVUSE9EICptZXRoID0gUlNBX1BLQ1MxX1NTTGVheSgpOworCQlwcmludGYoIk9DRiBoYXJkd2FyZSBvcGVyYXRpb24gY2FuY2VsbGVkLiBSdW5uaW5nIGluIFNvZnR3YXJlXG4iKTsKKwkJcmV0ID0gKCptZXRoLT5yc2FfbW9kX2V4cCkocjAsIEksIHJzYSwgY3R4KTsKKwl9CisJLyogZWxzZSBjcnlwdG9kZXYgb3BlcmF0aW9uIHdvcmtlZCBvayA9PT4gcmV0ID0gMSovCisKK2VycjoKKwl6YXBwYXJhbXMoJmtvcCk7CisJcmV0dXJuIChyZXQpOworfQorCitzdGF0aWMgUlNBX01FVEhPRCBjcnlwdG9kZXZfcnNhID0geworCSJjcnlwdG9kZXYgUlNBIG1ldGhvZCIsCisJTlVMTCwJCQkJLyogcnNhX3B1Yl9lbmMgKi8KKwlOVUxMLAkJCQkvKiByc2FfcHViX2RlYyAqLworCU5VTEwsCQkJCS8qIHJzYV9wcml2X2VuYyAqLworCU5VTEwsCQkJCS8qIHJzYV9wcml2X2RlYyAqLworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAkJCQkvKiBpbml0ICovCisJTlVMTCwJCQkJLyogZmluaXNoICovCisJMCwJCQkJLyogZmxhZ3MgKi8KKwlOVUxMLAkJCQkvKiBhcHBfZGF0YSAqLworCU5VTEwsCQkJCS8qIHJzYV9zaWduICovCisJTlVMTAkJCQkvKiByc2FfdmVyaWZ5ICovCit9OworCitzdGF0aWMgaW50CitjcnlwdG9kZXZfZHNhX2JuX21vZF9leHAoRFNBICpkc2EsIEJJR05VTSAqciwgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisgICAgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwgQk5fTU9OVF9DVFggKm1fY3R4KQoreworCXJldHVybiAoY3J5cHRvZGV2X2JuX21vZF9leHAociwgYSwgcCwgbSwgY3R4LCBtX2N0eCkpOworfQorCitzdGF0aWMgaW50CitjcnlwdG9kZXZfZHNhX2RzYV9tb2RfZXhwKERTQSAqZHNhLCBCSUdOVU0gKnQxLCBCSUdOVU0gKmcsCisgICAgQklHTlVNICp1MSwgQklHTlVNICpwdWJfa2V5LCBCSUdOVU0gKnUyLCBCSUdOVU0gKnAsCisgICAgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICptb250KQoreworCUJJR05VTSB0MjsKKwlpbnQgcmV0ID0gMDsKKworCUJOX2luaXQoJnQyKTsKKworCS8qIHYgPSAoIGdedTEgKiB5XnUyIG1vZCBwICkgbW9kIHEgKi8KKwkvKiBsZXQgdDEgPSBnIF4gdTEgbW9kIHAgKi8KKwlyZXQgPSAwOworCisJaWYgKCFkc2EtPm1ldGgtPmJuX21vZF9leHAoZHNhLHQxLGRzYS0+Zyx1MSxkc2EtPnAsY3R4LG1vbnQpKQorCQlnb3RvIGVycjsKKworCS8qIGxldCB0MiA9IHkgXiB1MiBtb2QgcCAqLworCWlmICghZHNhLT5tZXRoLT5ibl9tb2RfZXhwKGRzYSwmdDIsZHNhLT5wdWJfa2V5LHUyLGRzYS0+cCxjdHgsbW9udCkpCisJCWdvdG8gZXJyOworCS8qIGxldCB1MSA9IHQxICogdDIgbW9kIHAgKi8KKwlpZiAoIUJOX21vZF9tdWwodTEsdDEsJnQyLGRzYS0+cCxjdHgpKQorCQlnb3RvIGVycjsKKworCUJOX2NvcHkodDEsdTEpOworCisJcmV0ID0gMTsKK2VycjoKKwlCTl9mcmVlKCZ0Mik7CisJcmV0dXJuKHJldCk7Cit9CisKK3N0YXRpYyBEU0FfU0lHICoKK2NyeXB0b2Rldl9kc2FfZG9fc2lnbihjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGxlbiwgRFNBICpkc2EpCit7CisJc3RydWN0IGNyeXB0X2tvcCBrb3A7CisJQklHTlVNICpyID0gTlVMTCwgKnMgPSBOVUxMOworCURTQV9TSUcgKmRzYXJldCA9IE5VTEw7CisKKwlpZiAoKHIgPSBCTl9uZXcoKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJaWYgKChzID0gQk5fbmV3KCkpID09IE5VTEwpIHsKKwkJQk5fZnJlZShyKTsKKwkJZ290byBlcnI7CisJfQorCisJbWVtc2V0KCZrb3AsIDAsIHNpemVvZiBrb3ApOworCWtvcC5jcmtfb3AgPSBDUktfRFNBX1NJR047CisKKwkvKiBpbnB1dHM6IGRnc3QgZHNhLT5wIGRzYS0+cSBkc2EtPmcgZHNhLT5wcml2X2tleSAqLworCWtvcC5jcmtfcGFyYW1bMF0uY3JwX3AgPSAoY2FkZHJfdClkZ3N0OworCWtvcC5jcmtfcGFyYW1bMF0uY3JwX25iaXRzID0gZGxlbiAqIDg7CisJaWYgKGJuMmNycGFyYW0oZHNhLT5wLCAma29wLmNya19wYXJhbVsxXSkpCisJCWdvdG8gZXJyOworCWlmIChibjJjcnBhcmFtKGRzYS0+cSwgJmtvcC5jcmtfcGFyYW1bMl0pKQorCQlnb3RvIGVycjsKKwlpZiAoYm4yY3JwYXJhbShkc2EtPmcsICZrb3AuY3JrX3BhcmFtWzNdKSkKKwkJZ290byBlcnI7CisJaWYgKGJuMmNycGFyYW0oZHNhLT5wcml2X2tleSwgJmtvcC5jcmtfcGFyYW1bNF0pKQorCQlnb3RvIGVycjsKKwlrb3AuY3JrX2lwYXJhbXMgPSA1OworCisJaWYgKGNyeXB0b2Rldl9hc3ltKCZrb3AsIEJOX251bV9ieXRlcyhkc2EtPnEpLCByLAorCSAgICBCTl9udW1fYnl0ZXMoZHNhLT5xKSwgcykgPT0gMCkgeworCQlkc2FyZXQgPSBEU0FfU0lHX25ldygpOworCQlkc2FyZXQtPnIgPSByOworCQlkc2FyZXQtPnMgPSBzOworCX0gZWxzZSB7CisJCWNvbnN0IERTQV9NRVRIT0QgKm1ldGggPSBEU0FfT3BlblNTTCgpOworCQlCTl9mcmVlKHIpOworCQlCTl9mcmVlKHMpOworCQlkc2FyZXQgPSAobWV0aC0+ZHNhX2RvX3NpZ24pKGRnc3QsIGRsZW4sIGRzYSk7CisJfQorZXJyOgorCWtvcC5jcmtfcGFyYW1bMF0uY3JwX3AgPSBOVUxMOworCXphcHBhcmFtcygma29wKTsKKwlyZXR1cm4gKGRzYXJldCk7Cit9CisKK3N0YXRpYyBpbnQKK2NyeXB0b2Rldl9kc2FfdmVyaWZ5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkbGVuLAorICAgIERTQV9TSUcgKnNpZywgRFNBICpkc2EpCit7CisJc3RydWN0IGNyeXB0X2tvcCBrb3A7CisJaW50IGRzYXJldCA9IDE7CisKKwltZW1zZXQoJmtvcCwgMCwgc2l6ZW9mIGtvcCk7CisJa29wLmNya19vcCA9IENSS19EU0FfVkVSSUZZOworCisJLyogaW5wdXRzOiBkZ3N0IGRzYS0+cCBkc2EtPnEgZHNhLT5nIGRzYS0+cHViX2tleSBzaWctPnIgc2lnLT5zICovCisJa29wLmNya19wYXJhbVswXS5jcnBfcCA9IChjYWRkcl90KWRnc3Q7CisJa29wLmNya19wYXJhbVswXS5jcnBfbmJpdHMgPSBkbGVuICogODsKKwlpZiAoYm4yY3JwYXJhbShkc2EtPnAsICZrb3AuY3JrX3BhcmFtWzFdKSkKKwkJZ290byBlcnI7CisJaWYgKGJuMmNycGFyYW0oZHNhLT5xLCAma29wLmNya19wYXJhbVsyXSkpCisJCWdvdG8gZXJyOworCWlmIChibjJjcnBhcmFtKGRzYS0+ZywgJmtvcC5jcmtfcGFyYW1bM10pKQorCQlnb3RvIGVycjsKKwlpZiAoYm4yY3JwYXJhbShkc2EtPnB1Yl9rZXksICZrb3AuY3JrX3BhcmFtWzRdKSkKKwkJZ290byBlcnI7CisJaWYgKGJuMmNycGFyYW0oc2lnLT5yLCAma29wLmNya19wYXJhbVs1XSkpCisJCWdvdG8gZXJyOworCWlmIChibjJjcnBhcmFtKHNpZy0+cywgJmtvcC5jcmtfcGFyYW1bNl0pKQorCQlnb3RvIGVycjsKKwlrb3AuY3JrX2lwYXJhbXMgPSA3OworCisJaWYgKGNyeXB0b2Rldl9hc3ltKCZrb3AsIDAsIE5VTEwsIDAsIE5VTEwpID09IDApIHsKKy8qT0NGIHN1Y2Nlc3MgdmFsdWUgaXMgMCwgaWYgbm90IHplcm8sIGNoYW5nZSBkc2FyZXQgdG8gZmFpbCovCisJCWlmKDAgIT0ga29wLmNya19zdGF0dXMpIGRzYXJldCAgPSAwOworCX0gZWxzZSB7CisJCWNvbnN0IERTQV9NRVRIT0QgKm1ldGggPSBEU0FfT3BlblNTTCgpOworCisJCWRzYXJldCA9IChtZXRoLT5kc2FfZG9fdmVyaWZ5KShkZ3N0LCBkbGVuLCBzaWcsIGRzYSk7CisJfQorZXJyOgorCWtvcC5jcmtfcGFyYW1bMF0uY3JwX3AgPSBOVUxMOworCXphcHBhcmFtcygma29wKTsKKwlyZXR1cm4gKGRzYXJldCk7Cit9CisKK3N0YXRpYyBEU0FfTUVUSE9EIGNyeXB0b2Rldl9kc2EgPSB7CisJImNyeXB0b2RldiBEU0EgbWV0aG9kIiwKKwlOVUxMLAorCU5VTEwsCQkJCS8qIGRzYV9zaWduX3NldHVwICovCisJTlVMTCwKKwlOVUxMLAkJCQkvKiBkc2FfbW9kX2V4cCAqLworCU5VTEwsCisJTlVMTCwJCQkJLyogaW5pdCAqLworCU5VTEwsCQkJCS8qIGZpbmlzaCAqLworCTAsCS8qIGZsYWdzICovCisJTlVMTAkvKiBhcHBfZGF0YSAqLworfTsKKworc3RhdGljIGludAorY3J5cHRvZGV2X21vZF9leHBfZGgoY29uc3QgREggKmRoLCBCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKyAgICBjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsCisgICAgQk5fTU9OVF9DVFggKm1fY3R4KQoreworCXJldHVybiAoY3J5cHRvZGV2X2JuX21vZF9leHAociwgYSwgcCwgbSwgY3R4LCBtX2N0eCkpOworfQorCitzdGF0aWMgaW50CitjcnlwdG9kZXZfZGhfY29tcHV0ZV9rZXkodW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCBCSUdOVU0gKnB1Yl9rZXksIERIICpkaCkKK3sKKwlzdHJ1Y3QgY3J5cHRfa29wIGtvcDsKKwlpbnQgZGhyZXQgPSAxOworCWludCBmZCwga2V5bGVuOworCisJaWYgKChmZCA9IGdldF9hc3ltX2Rldl9jcnlwdG8oKSkgPCAwKSB7CisJCWNvbnN0IERIX01FVEhPRCAqbWV0aCA9IERIX09wZW5TU0woKTsKKworCQlyZXR1cm4gKChtZXRoLT5jb21wdXRlX2tleSkoa2V5LCBwdWJfa2V5LCBkaCkpOworCX0KKworCWtleWxlbiA9IEJOX251bV9iaXRzKGRoLT5wKTsKKworCW1lbXNldCgma29wLCAwLCBzaXplb2Yga29wKTsKKwlrb3AuY3JrX29wID0gQ1JLX0RIX0NPTVBVVEVfS0VZOworCisJLyogaW5wdXRzOiBkaC0+cHJpdl9rZXkgcHViX2tleSBkaC0+cCBrZXkgKi8KKwlpZiAoYm4yY3JwYXJhbShkaC0+cHJpdl9rZXksICZrb3AuY3JrX3BhcmFtWzBdKSkKKwkJZ290byBlcnI7CisJaWYgKGJuMmNycGFyYW0ocHViX2tleSwgJmtvcC5jcmtfcGFyYW1bMV0pKQorCQlnb3RvIGVycjsKKwlpZiAoYm4yY3JwYXJhbShkaC0+cCwgJmtvcC5jcmtfcGFyYW1bMl0pKQorCQlnb3RvIGVycjsKKwlrb3AuY3JrX2lwYXJhbXMgPSAzOworCisJa29wLmNya19wYXJhbVszXS5jcnBfcCA9IChjYWRkcl90KSBrZXk7CisJa29wLmNya19wYXJhbVszXS5jcnBfbmJpdHMgPSBrZXlsZW4gKiA4OworCWtvcC5jcmtfb3BhcmFtcyA9IDE7CisKKwlpZiAoaW9jdGwoZmQsIENJT0NLRVksICZrb3ApID09IC0xKSB7CisJCWNvbnN0IERIX01FVEhPRCAqbWV0aCA9IERIX09wZW5TU0woKTsKKworCQlkaHJldCA9IChtZXRoLT5jb21wdXRlX2tleSkoa2V5LCBwdWJfa2V5LCBkaCk7CisJfQorZXJyOgorCWtvcC5jcmtfcGFyYW1bM10uY3JwX3AgPSBOVUxMOworCXphcHBhcmFtcygma29wKTsKKwlyZXR1cm4gKGRocmV0KTsKK30KKworc3RhdGljIERIX01FVEhPRCBjcnlwdG9kZXZfZGggPSB7CisJImNyeXB0b2RldiBESCBtZXRob2QiLAorCU5VTEwsCQkJCS8qIGNyeXB0b2Rldl9kaF9nZW5lcmF0ZV9rZXkgKi8KKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCTAsCS8qIGZsYWdzICovCisJTlVMTAkvKiBhcHBfZGF0YSAqLworfTsKKworLyoKKyAqIGN0cmwgcmlnaHQgbm93IGlzIGp1c3QgYSB3cmFwcGVyIHRoYXQgZG9lc24ndCBkbyBtdWNoCisgKiBidXQgSSBleHBlY3Qgd2UnbGwgd2FudCBzb21lIG9wdGlvbnMgc29vbi4KKyAqLworc3RhdGljIGludAorY3J5cHRvZGV2X2N0cmwoRU5HSU5FICplLCBpbnQgY21kLCBsb25nIGksIHZvaWQgKnAsIHZvaWQgKCpmKSh2b2lkKSkKK3sKKyNpZmRlZiBIQVZFX1NZU0xPR19SCisJc3RydWN0IHN5c2xvZ19kYXRhIHNkID0gU1lTTE9HX0RBVEFfSU5JVDsKKyNlbmRpZgorCisJc3dpdGNoIChjbWQpIHsKKwlkZWZhdWx0OgorI2lmZGVmIEhBVkVfU1lTTE9HX1IKKwkJc3lzbG9nX3IoTE9HX0VSUiwgJnNkLAorCQkgICAgImNyeXB0b2Rldl9jdHJsOiB1bmtub3duIGNvbW1hbmQgJWQiLCBjbWQpOworI2Vsc2UKKwkJc3lzbG9nKExPR19FUlIsICJjcnlwdG9kZXZfY3RybDogdW5rbm93biBjb21tYW5kICVkIiwgY21kKTsKKyNlbmRpZgorCQlicmVhazsKKwl9CisJcmV0dXJuICgxKTsKK30KKwordm9pZAorRU5HSU5FX2xvYWRfY3J5cHRvZGV2KHZvaWQpCit7CisJRU5HSU5FICplbmdpbmUgPSBFTkdJTkVfbmV3KCk7CisJaW50IGZkOworCisJaWYgKGVuZ2luZSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChmZCA9IGdldF9kZXZfY3J5cHRvKCkpIDwgMCkgeworCQlFTkdJTkVfZnJlZShlbmdpbmUpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBmaW5kIG91dCB3aGF0IGFzeW1tZXRyaWMgY3J5cHRvIGFsZ29yaXRobXMgd2Ugc3VwcG9ydAorCSAqLworCWlmIChpb2N0bChmZCwgQ0lPQ0FTWU1GRUFULCAmY3J5cHRvZGV2X2FzeW1mZWF0KSA9PSAtMSkgeworCQljbG9zZShmZCk7CisJCUVOR0lORV9mcmVlKGVuZ2luZSk7CisJCXJldHVybjsKKwl9CisJY2xvc2UoZmQpOworCisJaWYgKCFFTkdJTkVfc2V0X2lkKGVuZ2luZSwgImNyeXB0b2RldiIpIHx8CisJICAgICFFTkdJTkVfc2V0X25hbWUoZW5naW5lLCAiQlNEIGNyeXB0b2RldiBlbmdpbmUiKSB8fAorCSAgICAhRU5HSU5FX3NldF9jaXBoZXJzKGVuZ2luZSwgY3J5cHRvZGV2X2VuZ2luZV9jaXBoZXJzKSB8fAorCSAgICAhRU5HSU5FX3NldF9kaWdlc3RzKGVuZ2luZSwgY3J5cHRvZGV2X2VuZ2luZV9kaWdlc3RzKSB8fAorCSAgICAhRU5HSU5FX3NldF9jdHJsX2Z1bmN0aW9uKGVuZ2luZSwgY3J5cHRvZGV2X2N0cmwpIHx8CisJICAgICFFTkdJTkVfc2V0X2NtZF9kZWZucyhlbmdpbmUsIGNyeXB0b2Rldl9kZWZucykpIHsKKwkJRU5HSU5FX2ZyZWUoZW5naW5lKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChFTkdJTkVfc2V0X1JTQShlbmdpbmUsICZjcnlwdG9kZXZfcnNhKSkgeworCQljb25zdCBSU0FfTUVUSE9EICpyc2FfbWV0aCA9IFJTQV9QS0NTMV9TU0xlYXkoKTsKKworCQljcnlwdG9kZXZfcnNhLmJuX21vZF9leHAgPSByc2FfbWV0aC0+Ym5fbW9kX2V4cDsKKwkJY3J5cHRvZGV2X3JzYS5yc2FfbW9kX2V4cCA9IHJzYV9tZXRoLT5yc2FfbW9kX2V4cDsKKwkJY3J5cHRvZGV2X3JzYS5yc2FfcHViX2VuYyA9IHJzYV9tZXRoLT5yc2FfcHViX2VuYzsKKwkJY3J5cHRvZGV2X3JzYS5yc2FfcHViX2RlYyA9IHJzYV9tZXRoLT5yc2FfcHViX2RlYzsKKwkJY3J5cHRvZGV2X3JzYS5yc2FfcHJpdl9lbmMgPSByc2FfbWV0aC0+cnNhX3ByaXZfZW5jOworCQljcnlwdG9kZXZfcnNhLnJzYV9wcml2X2RlYyA9IHJzYV9tZXRoLT5yc2FfcHJpdl9kZWM7CisJCWlmIChjcnlwdG9kZXZfYXN5bWZlYXQgJiBDUkZfTU9EX0VYUCkgeworCQkJY3J5cHRvZGV2X3JzYS5ibl9tb2RfZXhwID0gY3J5cHRvZGV2X2JuX21vZF9leHA7CisJCQlpZiAoY3J5cHRvZGV2X2FzeW1mZWF0ICYgQ1JGX01PRF9FWFBfQ1JUKQorCQkJCWNyeXB0b2Rldl9yc2EucnNhX21vZF9leHAgPQorCQkJCSAgICBjcnlwdG9kZXZfcnNhX21vZF9leHA7CisJCQllbHNlCisJCQkJY3J5cHRvZGV2X3JzYS5yc2FfbW9kX2V4cCA9CisJCQkJICAgIGNyeXB0b2Rldl9yc2Ffbm9jcnRfbW9kX2V4cDsKKwkJfQorCX0KKworCWlmIChFTkdJTkVfc2V0X0RTQShlbmdpbmUsICZjcnlwdG9kZXZfZHNhKSkgeworCQljb25zdCBEU0FfTUVUSE9EICptZXRoID0gRFNBX09wZW5TU0woKTsKKworCQltZW1jcHkoJmNyeXB0b2Rldl9kc2EsIG1ldGgsIHNpemVvZihEU0FfTUVUSE9EKSk7CisJCWlmIChjcnlwdG9kZXZfYXN5bWZlYXQgJiBDUkZfRFNBX1NJR04pCisJCQljcnlwdG9kZXZfZHNhLmRzYV9kb19zaWduID0gY3J5cHRvZGV2X2RzYV9kb19zaWduOworCQlpZiAoY3J5cHRvZGV2X2FzeW1mZWF0ICYgQ1JGX01PRF9FWFApIHsKKwkJCWNyeXB0b2Rldl9kc2EuYm5fbW9kX2V4cCA9IGNyeXB0b2Rldl9kc2FfYm5fbW9kX2V4cDsKKwkJCWNyeXB0b2Rldl9kc2EuZHNhX21vZF9leHAgPSBjcnlwdG9kZXZfZHNhX2RzYV9tb2RfZXhwOworCQl9CisJCWlmIChjcnlwdG9kZXZfYXN5bWZlYXQgJiBDUkZfRFNBX1ZFUklGWSkKKwkJCWNyeXB0b2Rldl9kc2EuZHNhX2RvX3ZlcmlmeSA9IGNyeXB0b2Rldl9kc2FfdmVyaWZ5OworCX0KKworCWlmIChFTkdJTkVfc2V0X0RIKGVuZ2luZSwgJmNyeXB0b2Rldl9kaCkpeworCQljb25zdCBESF9NRVRIT0QgKmRoX21ldGggPSBESF9PcGVuU1NMKCk7CisKKwkJY3J5cHRvZGV2X2RoLmdlbmVyYXRlX2tleSA9IGRoX21ldGgtPmdlbmVyYXRlX2tleTsKKwkJY3J5cHRvZGV2X2RoLmNvbXB1dGVfa2V5ID0gZGhfbWV0aC0+Y29tcHV0ZV9rZXk7CisJCWNyeXB0b2Rldl9kaC5ibl9tb2RfZXhwID0gZGhfbWV0aC0+Ym5fbW9kX2V4cDsKKwkJaWYgKGNyeXB0b2Rldl9hc3ltZmVhdCAmIENSRl9NT0RfRVhQKSB7CisJCQljcnlwdG9kZXZfZGguYm5fbW9kX2V4cCA9IGNyeXB0b2Rldl9tb2RfZXhwX2RoOworCQkJaWYgKGNyeXB0b2Rldl9hc3ltZmVhdCAmIENSRl9ESF9DT01QVVRFX0tFWSkKKwkJCQljcnlwdG9kZXZfZGguY29tcHV0ZV9rZXkgPQorCQkJCSAgICBjcnlwdG9kZXZfZGhfY29tcHV0ZV9rZXk7CisJCX0KKwl9CisKKwlFTkdJTkVfYWRkKGVuZ2luZSk7CisJRU5HSU5FX2ZyZWUoZW5naW5lKTsKKwlFUlJfY2xlYXJfZXJyb3IoKTsKK30KKworI2VuZGlmIC8qIEhBVkVfQ1JZUFRPREVWICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19jdHJsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19jdHJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlMjVkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2N0cmwuYwpAQCAtMCwwICsxLDM4OSBAQAorLyogY3J5cHRvL2VuZ2luZS9lbmdfY3RybC5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImVuZ19pbnQuaCIKKworLyogV2hlbiBxdWVyeWluZyBhIEVOR0lORS1zcGVjaWZpYyBjb250cm9sIGNvbW1hbmQncyAnZGVzY3JpcHRpb24nLCB0aGlzIHN0cmluZworICogaXMgdXNlZCBpZiB0aGUgRU5HSU5FX0NNRF9ERUZOIGhhcyBjbWRfZGVzYyBzZXQgdG8gTlVMTC4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICppbnRfbm9fZGVzY3JpcHRpb24gPSAiIjsKKworLyogVGhlc2UgaW50ZXJuYWwgZnVuY3Rpb25zIGhhbmRsZSAnQ01EJy1yZWxhdGVkIGNvbnRyb2wgY29tbWFuZHMgd2hlbiB0aGUKKyAqIEVOR0lORSBpbiBxdWVzdGlvbiBoYXMgYXNrZWQgdXMgdG8gdGFrZSBjYXJlIG9mIGl0IChpZS4gdGhlIEVOR0lORSBkaWQgbm90CisgKiBzZXQgdGhlIEVOR0lORV9GTEFHU19NQU5VQUxfQ01EX0NUUkwgZmxhZy4gKi8KKworc3RhdGljIGludCBpbnRfY3RybF9jbWRfaXNfbnVsbChjb25zdCBFTkdJTkVfQ01EX0RFRk4gKmRlZm4pCisJeworCWlmKChkZWZuLT5jbWRfbnVtID09IDApIHx8IChkZWZuLT5jbWRfbmFtZSA9PSBOVUxMKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGludF9jdHJsX2NtZF9ieV9uYW1lKGNvbnN0IEVOR0lORV9DTURfREVGTiAqZGVmbiwgY29uc3QgY2hhciAqcykKKwl7CisJaW50IGlkeCA9IDA7CisJd2hpbGUoIWludF9jdHJsX2NtZF9pc19udWxsKGRlZm4pICYmIChzdHJjbXAoZGVmbi0+Y21kX25hbWUsIHMpICE9IDApKQorCQl7CisJCWlkeCsrOworCQlkZWZuKys7CisJCX0KKwlpZihpbnRfY3RybF9jbWRfaXNfbnVsbChkZWZuKSkKKwkJLyogVGhlIGdpdmVuIG5hbWUgd2Fzbid0IGZvdW5kICovCisJCXJldHVybiAtMTsKKwlyZXR1cm4gaWR4OworCX0KKworc3RhdGljIGludCBpbnRfY3RybF9jbWRfYnlfbnVtKGNvbnN0IEVOR0lORV9DTURfREVGTiAqZGVmbiwgdW5zaWduZWQgaW50IG51bSkKKwl7CisJaW50IGlkeCA9IDA7CisJLyogTkI6IEl0IGlzIHN0aXB1bGF0ZWQgdGhhdCAnY21kX2RlZm4nIGxpc3RzIGFyZSBvcmRlcmVkIGJ5IGNtZF9udW0uIFNvCisJICogb3VyIHNlYXJjaGVzIGRvbid0IG5lZWQgdG8gdGFrZSBhbnkgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LiAqLworCXdoaWxlKCFpbnRfY3RybF9jbWRfaXNfbnVsbChkZWZuKSAmJiAoZGVmbi0+Y21kX251bSA8IG51bSkpCisJCXsKKwkJaWR4Kys7CisJCWRlZm4rKzsKKwkJfQorCWlmKGRlZm4tPmNtZF9udW0gPT0gbnVtKQorCQlyZXR1cm4gaWR4OworCS8qIFRoZSBnaXZlbiBjbWRfbnVtIHdhc24ndCBmb3VuZCAqLworCXJldHVybiAtMTsKKwl9CisKK3N0YXRpYyBpbnQgaW50X2N0cmxfaGVscGVyKEVOR0lORSAqZSwgaW50IGNtZCwgbG9uZyBpLCB2b2lkICpwLAorCQkJICAgdm9pZCAoKmYpKHZvaWQpKQorCXsKKwlpbnQgaWR4OworCWNoYXIgKnMgPSAoY2hhciAqKXA7CisJLyogVGFrZSBjYXJlIG9mIHRoZSBlYXN5IG9uZSBmaXJzdCAoZWcuIGl0IHJlcXVpcmVzIG5vIHNlYXJjaGVzKSAqLworCWlmKGNtZCA9PSBFTkdJTkVfQ1RSTF9HRVRfRklSU1RfQ01EX1RZUEUpCisJCXsKKwkJaWYoKGUtPmNtZF9kZWZucyA9PSBOVUxMKSB8fCBpbnRfY3RybF9jbWRfaXNfbnVsbChlLT5jbWRfZGVmbnMpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBlLT5jbWRfZGVmbnMtPmNtZF9udW07CisJCX0KKwkvKiBPbmUgb3IgdHdvIGNvbW1hbmRzIHJlcXVpcmUgdGhhdCAicCIgYmUgYSB2YWxpZCBzdHJpbmcgYnVmZmVyICovCisJaWYoKGNtZCA9PSBFTkdJTkVfQ1RSTF9HRVRfQ01EX0ZST01fTkFNRSkgfHwKKwkJCShjbWQgPT0gRU5HSU5FX0NUUkxfR0VUX05BTUVfRlJPTV9DTUQpIHx8CisJCQkoY21kID09IEVOR0lORV9DVFJMX0dFVF9ERVNDX0ZST01fQ01EKSkKKwkJeworCQlpZihzID09IE5VTEwpCisJCQl7CisJCQlFTkdJTkVlcnIoRU5HSU5FX0ZfSU5UX0NUUkxfSEVMUEVSLAorCQkJCUVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkvKiBOb3cgaGFuZGxlIGNtZF9uYW1lIC0+IGNtZF9udW0gY29udmVyc2lvbiAqLworCWlmKGNtZCA9PSBFTkdJTkVfQ1RSTF9HRVRfQ01EX0ZST01fTkFNRSkKKwkJeworCQlpZigoZS0+Y21kX2RlZm5zID09IE5VTEwpIHx8ICgoaWR4ID0gaW50X2N0cmxfY21kX2J5X25hbWUoCisJCQkJCQllLT5jbWRfZGVmbnMsIHMpKSA8IDApKQorCQkJeworCQkJRU5HSU5FZXJyKEVOR0lORV9GX0lOVF9DVFJMX0hFTFBFUiwKKwkJCQlFTkdJTkVfUl9JTlZBTElEX0NNRF9OQU1FKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJcmV0dXJuIGUtPmNtZF9kZWZuc1tpZHhdLmNtZF9udW07CisJCX0KKwkvKiBGb3IgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmRzLCB0aGUgJ2xvbmcnIGFyZ3VtZW50IG11c3Qgc3BlY2lmeSBhCisJICogdmFsaWUgY29tbWFuZCBudW1iZXIgLSBzbyB3ZSBuZWVkIHRvIGNvbmR1Y3QgYSBzZWFyY2guICovCisJaWYoKGUtPmNtZF9kZWZucyA9PSBOVUxMKSB8fCAoKGlkeCA9IGludF9jdHJsX2NtZF9ieV9udW0oZS0+Y21kX2RlZm5zLAorCQkJCQkodW5zaWduZWQgaW50KWkpKSA8IDApKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9JTlRfQ1RSTF9IRUxQRVIsCisJCQlFTkdJTkVfUl9JTlZBTElEX0NNRF9OVU1CRVIpOworCQlyZXR1cm4gLTE7CisJCX0KKwkvKiBOb3cgdGhlIGxvZ2ljIHNwbGl0cyBkZXBlbmRpbmcgb24gY29tbWFuZCB0eXBlICovCisJc3dpdGNoKGNtZCkKKwkJeworCWNhc2UgRU5HSU5FX0NUUkxfR0VUX05FWFRfQ01EX1RZUEU6CisJCWlkeCsrOworCQlpZihpbnRfY3RybF9jbWRfaXNfbnVsbChlLT5jbWRfZGVmbnMgKyBpZHgpKQorCQkJLyogZW5kLW9mLWxpc3QgKi8KKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gZS0+Y21kX2RlZm5zW2lkeF0uY21kX251bTsKKwljYXNlIEVOR0lORV9DVFJMX0dFVF9OQU1FX0xFTl9GUk9NX0NNRDoKKwkJcmV0dXJuIHN0cmxlbihlLT5jbWRfZGVmbnNbaWR4XS5jbWRfbmFtZSk7CisJY2FzZSBFTkdJTkVfQ1RSTF9HRVRfTkFNRV9GUk9NX0NNRDoKKwkJcmV0dXJuIEJJT19zbnByaW50ZihzLHN0cmxlbihlLT5jbWRfZGVmbnNbaWR4XS5jbWRfbmFtZSkgKyAxLAorCQkJCSAgICAiJXMiLCBlLT5jbWRfZGVmbnNbaWR4XS5jbWRfbmFtZSk7CisJY2FzZSBFTkdJTkVfQ1RSTF9HRVRfREVTQ19MRU5fRlJPTV9DTUQ6CisJCWlmKGUtPmNtZF9kZWZuc1tpZHhdLmNtZF9kZXNjKQorCQkJcmV0dXJuIHN0cmxlbihlLT5jbWRfZGVmbnNbaWR4XS5jbWRfZGVzYyk7CisJCXJldHVybiBzdHJsZW4oaW50X25vX2Rlc2NyaXB0aW9uKTsKKwljYXNlIEVOR0lORV9DVFJMX0dFVF9ERVNDX0ZST01fQ01EOgorCQlpZihlLT5jbWRfZGVmbnNbaWR4XS5jbWRfZGVzYykKKwkJCXJldHVybiBCSU9fc25wcmludGYocywKKwkJCQkJICAgIHN0cmxlbihlLT5jbWRfZGVmbnNbaWR4XS5jbWRfZGVzYykgKyAxLAorCQkJCQkgICAgIiVzIiwgZS0+Y21kX2RlZm5zW2lkeF0uY21kX2Rlc2MpOworCQlyZXR1cm4gQklPX3NucHJpbnRmKHMsIHN0cmxlbihpbnRfbm9fZGVzY3JpcHRpb24pICsgMSwiJXMiLAorCQkJCSAgICBpbnRfbm9fZGVzY3JpcHRpb24pOworCWNhc2UgRU5HSU5FX0NUUkxfR0VUX0NNRF9GTEFHUzoKKwkJcmV0dXJuIGUtPmNtZF9kZWZuc1tpZHhdLmNtZF9mbGFnczsKKwkJfQorCS8qIFNob3VsZG4ndCByZWFsbHkgYmUgaGVyZSAuLi4gKi8KKwlFTkdJTkVlcnIoRU5HSU5FX0ZfSU5UX0NUUkxfSEVMUEVSLEVOR0lORV9SX0lOVEVSTkFMX0xJU1RfRVJST1IpOworCXJldHVybiAtMTsKKwl9CisKK2ludCBFTkdJTkVfY3RybChFTkdJTkUgKmUsIGludCBjbWQsIGxvbmcgaSwgdm9pZCAqcCwgdm9pZCAoKmYpKHZvaWQpKQorCXsKKwlpbnQgY3RybF9leGlzdHMsIHJlZl9leGlzdHM7CisJaWYoZSA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfQ1RSTCxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlyZWZfZXhpc3RzID0gKChlLT5zdHJ1Y3RfcmVmID4gMCkgPyAxIDogMCk7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJY3RybF9leGlzdHMgPSAoKGUtPmN0cmwgPT0gTlVMTCkgPyAwIDogMSk7CisJaWYoIXJlZl9leGlzdHMpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9DVFJMLEVOR0lORV9SX05PX1JFRkVSRU5DRSk7CisJCXJldHVybiAwOworCQl9CisJLyogSW50ZXJjZXB0IGFueSAicm9vdC1sZXZlbCIgY29tbWFuZHMgYmVmb3JlIHRyeWluZyB0byBoYW5kIHRoZW0gb24gdG8KKwkgKiBjdHJsKCkgaGFuZGxlcnMuICovCisJc3dpdGNoKGNtZCkKKwkJeworCWNhc2UgRU5HSU5FX0NUUkxfSEFTX0NUUkxfRlVOQ1RJT046CisJCXJldHVybiBjdHJsX2V4aXN0czsKKwljYXNlIEVOR0lORV9DVFJMX0dFVF9GSVJTVF9DTURfVFlQRToKKwljYXNlIEVOR0lORV9DVFJMX0dFVF9ORVhUX0NNRF9UWVBFOgorCWNhc2UgRU5HSU5FX0NUUkxfR0VUX0NNRF9GUk9NX05BTUU6CisJY2FzZSBFTkdJTkVfQ1RSTF9HRVRfTkFNRV9MRU5fRlJPTV9DTUQ6CisJY2FzZSBFTkdJTkVfQ1RSTF9HRVRfTkFNRV9GUk9NX0NNRDoKKwljYXNlIEVOR0lORV9DVFJMX0dFVF9ERVNDX0xFTl9GUk9NX0NNRDoKKwljYXNlIEVOR0lORV9DVFJMX0dFVF9ERVNDX0ZST01fQ01EOgorCWNhc2UgRU5HSU5FX0NUUkxfR0VUX0NNRF9GTEFHUzoKKwkJaWYoY3RybF9leGlzdHMgJiYgIShlLT5mbGFncyAmIEVOR0lORV9GTEFHU19NQU5VQUxfQ01EX0NUUkwpKQorCQkJcmV0dXJuIGludF9jdHJsX2hlbHBlcihlLGNtZCxpLHAsZik7CisJCWlmKCFjdHJsX2V4aXN0cykKKwkJCXsKKwkJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfQ1RSTCxFTkdJTkVfUl9OT19DT05UUk9MX0ZVTkNUSU9OKTsKKwkJCS8qIEZvciB0aGVzZSBjbWQtcmVsYXRlZCBmdW5jdGlvbnMsIGZhaWx1cmUgaXMgaW5kaWNhdGVkCisJCQkgKiBieSBhIC0xIHJldHVybiB2YWx1ZSAoYmVjYXVzZSAwIGlzIHVzZWQgYXMgYSB2YWxpZAorCQkJICogcmV0dXJuIGluIHNvbWUgcGxhY2VzKS4gKi8KKwkJCXJldHVybiAtMTsKKwkJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwkJfQorCS8qIEFueXRoaW5nIGVsc2UgcmVxdWlyZXMgYSBjdHJsKCkgaGFuZGxlciB0byBleGlzdC4gKi8KKwlpZighY3RybF9leGlzdHMpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9DVFJMLEVOR0lORV9SX05PX0NPTlRST0xfRlVOQ1RJT04pOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBlLT5jdHJsKGUsIGNtZCwgaSwgcCwgZik7CisJfQorCitpbnQgRU5HSU5FX2NtZF9pc19leGVjdXRhYmxlKEVOR0lORSAqZSwgaW50IGNtZCkKKwl7CisJaW50IGZsYWdzOworCWlmKChmbGFncyA9IEVOR0lORV9jdHJsKGUsIEVOR0lORV9DVFJMX0dFVF9DTURfRkxBR1MsIGNtZCwgTlVMTCwgTlVMTCkpIDwgMCkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0NNRF9JU19FWEVDVVRBQkxFLAorCQkJRU5HSU5FX1JfSU5WQUxJRF9DTURfTlVNQkVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZighKGZsYWdzICYgRU5HSU5FX0NNRF9GTEFHX05PX0lOUFVUKSAmJgorCQkJIShmbGFncyAmIEVOR0lORV9DTURfRkxBR19OVU1FUklDKSAmJgorCQkJIShmbGFncyAmIEVOR0lORV9DTURfRkxBR19TVFJJTkcpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBFTkdJTkVfY3RybF9jbWQoRU5HSU5FICplLCBjb25zdCBjaGFyICpjbWRfbmFtZSwKKyAgICAgICAgbG9uZyBpLCB2b2lkICpwLCB2b2lkICgqZikodm9pZCksIGludCBjbWRfb3B0aW9uYWwpCisgICAgICAgIHsKKwlpbnQgbnVtOworCisJaWYoKGUgPT0gTlVMTCkgfHwgKGNtZF9uYW1lID09IE5VTEwpKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfQ1RSTF9DTUQsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmKChlLT5jdHJsID09IE5VTEwpIHx8ICgobnVtID0gRU5HSU5FX2N0cmwoZSwKKwkJCQkJRU5HSU5FX0NUUkxfR0VUX0NNRF9GUk9NX05BTUUsCisJCQkJCTAsICh2b2lkICopY21kX25hbWUsIE5VTEwpKSA8PSAwKSkKKwkJeworCQkvKiBJZiB0aGUgY29tbWFuZCBkaWRuJ3QgKmhhdmUqIHRvIGJlIHN1cHBvcnRlZCwgd2UgZmFrZQorCQkgKiBzdWNjZXNzLiBUaGlzIGFsbG93cyBjZXJ0YWluIHNldHRpbmdzIHRvIGJlIHNwZWNpZmllZCBmb3IKKwkJICogbXVsdGlwbGUgRU5HSU5FcyBhbmQgb25seSByZXF1aXJlIGEgY2hhbmdlIG9mIEVOR0lORSBpZAorCQkgKiAod2l0aG91dCBoYXZpbmcgdG8gc2VsZWN0aXZlbHkgYXBwbHkgc2V0dGluZ3MpLiBFZy4gY2hhbmdpbmcKKwkJICogZnJvbSBhIGhhcmR3YXJlIGRldmljZSBiYWNrIHRvIHRoZSByZWd1bGFyIHNvZnR3YXJlIEVOR0lORQorCQkgKiB3aXRob3V0IGVkaXRpbmcgdGhlIGNvbmZpZyBmaWxlLCBldGMuICovCisJCWlmKGNtZF9vcHRpb25hbCkKKwkJCXsKKwkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJcmV0dXJuIDE7CisJCQl9CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfQ1RSTF9DTUQsCisJCQlFTkdJTkVfUl9JTlZBTElEX0NNRF9OQU1FKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkvKiBGb3JjZSB0aGUgcmVzdWx0IG9mIHRoZSBjb250cm9sIGNvbW1hbmQgdG8gMCBvciAxLCBmb3IgdGhlIHJlYXNvbnMKKwkgKiBtZW50aW9uZWQgYmVmb3JlLiAqLworICAgICAgICBpZiAoRU5HSU5FX2N0cmwoZSwgbnVtLCBpLCBwLCBmKSA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKK2ludCBFTkdJTkVfY3RybF9jbWRfc3RyaW5nKEVOR0lORSAqZSwgY29uc3QgY2hhciAqY21kX25hbWUsIGNvbnN0IGNoYXIgKmFyZywKKwkJCQlpbnQgY21kX29wdGlvbmFsKQorCXsKKwlpbnQgbnVtLCBmbGFnczsKKwlsb25nIGw7CisJY2hhciAqcHRyOworCWlmKChlID09IE5VTEwpIHx8IChjbWRfbmFtZSA9PSBOVUxMKSkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0NUUkxfQ01EX1NUUklORywKKwkJCUVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybiAwOworCQl9CisJaWYoKGUtPmN0cmwgPT0gTlVMTCkgfHwgKChudW0gPSBFTkdJTkVfY3RybChlLAorCQkJCQlFTkdJTkVfQ1RSTF9HRVRfQ01EX0ZST01fTkFNRSwKKwkJCQkJMCwgKHZvaWQgKiljbWRfbmFtZSwgTlVMTCkpIDw9IDApKQorCQl7CisJCS8qIElmIHRoZSBjb21tYW5kIGRpZG4ndCAqaGF2ZSogdG8gYmUgc3VwcG9ydGVkLCB3ZSBmYWtlCisJCSAqIHN1Y2Nlc3MuIFRoaXMgYWxsb3dzIGNlcnRhaW4gc2V0dGluZ3MgdG8gYmUgc3BlY2lmaWVkIGZvcgorCQkgKiBtdWx0aXBsZSBFTkdJTkVzIGFuZCBvbmx5IHJlcXVpcmUgYSBjaGFuZ2Ugb2YgRU5HSU5FIGlkCisJCSAqICh3aXRob3V0IGhhdmluZyB0byBzZWxlY3RpdmVseSBhcHBseSBzZXR0aW5ncykuIEVnLiBjaGFuZ2luZworCQkgKiBmcm9tIGEgaGFyZHdhcmUgZGV2aWNlIGJhY2sgdG8gdGhlIHJlZ3VsYXIgc29mdHdhcmUgRU5HSU5FCisJCSAqIHdpdGhvdXQgZWRpdGluZyB0aGUgY29uZmlnIGZpbGUsIGV0Yy4gKi8KKwkJaWYoY21kX29wdGlvbmFsKQorCQkJeworCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9DVFJMX0NNRF9TVFJJTkcsCisJCQlFTkdJTkVfUl9JTlZBTElEX0NNRF9OQU1FKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZighRU5HSU5FX2NtZF9pc19leGVjdXRhYmxlKGUsIG51bSkpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9DVFJMX0NNRF9TVFJJTkcsCisJCQlFTkdJTkVfUl9DTURfTk9UX0VYRUNVVEFCTEUpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmKChmbGFncyA9IEVOR0lORV9jdHJsKGUsIEVOR0lORV9DVFJMX0dFVF9DTURfRkxBR1MsIG51bSwgTlVMTCwgTlVMTCkpIDwgMCkKKwkJeworCQkvKiBTaG91bGRuJ3QgaGFwcGVuLCBnaXZlbiB0aGF0IEVOR0lORV9jbWRfaXNfZXhlY3V0YWJsZSgpCisJCSAqIHJldHVybmVkIHN1Y2Nlc3MuICovCisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfQ1RSTF9DTURfU1RSSU5HLAorCQkJRU5HSU5FX1JfSU5URVJOQUxfTElTVF9FUlJPUik7CisJCXJldHVybiAwOworCQl9CisJLyogSWYgdGhlIGNvbW1hbmQgdGFrZXMgbm8gaW5wdXQsIHRoZXJlIG11c3QgYmUgbm8gaW5wdXQuIEFuZCB2aWNlCisJICogdmVyc2EuICovCisJaWYoZmxhZ3MgJiBFTkdJTkVfQ01EX0ZMQUdfTk9fSU5QVVQpCisJCXsKKwkJaWYoYXJnICE9IE5VTEwpCisJCQl7CisJCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0NUUkxfQ01EX1NUUklORywKKwkJCQlFTkdJTkVfUl9DT01NQU5EX1RBS0VTX05PX0lOUFVUKTsKKwkJCXJldHVybiAwOworCQkJfQorCQkvKiBXZSBkZWxpYmVyYXRlbHkgZm9yY2UgdGhlIHJlc3VsdCBvZiBFTkdJTkVfY3RybCgpIHRvIDAgb3IgMQorCQkgKiByYXRoZXIgdGhhbiByZXR1cm5pbmcgaXQgYXMgInJldHVybiBkYXRhIi4gVGhpcyBpcyB0byBlbnN1cmUKKwkJICogdXNhZ2Ugb2YgdGhlc2UgY29tbWFuZHMgaXMgY29uc2lzdGVudCBhY3Jvc3MgYXBwbGljYXRpb25zIGFuZAorCQkgKiB0aGF0IGNlcnRhaW4gYXBwbGljYXRpb25zIGRvbid0IHVuZGVyc3RhbmQgaXQgb25lIHdheSwgYW5kCisJCSAqIG90aGVycyBhbm90aGVyLiAqLworCQlpZihFTkdJTkVfY3RybChlLCBudW0sIDAsICh2b2lkICopYXJnLCBOVUxMKSA+IDApCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJCX0KKwkvKiBTbywgd2UgcmVxdWlyZSBpbnB1dCAqLworCWlmKGFyZyA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfQ1RSTF9DTURfU1RSSU5HLAorCQkJRU5HSU5FX1JfQ09NTUFORF9UQUtFU19JTlBVVCk7CisJCXJldHVybiAwOworCQl9CisJLyogSWYgaXQgdGFrZXMgc3RyaW5nIGlucHV0LCB0aGF0J3MgZWFzeSAqLworCWlmKGZsYWdzICYgRU5HSU5FX0NNRF9GTEFHX1NUUklORykKKwkJeworCQkvKiBTYW1lIGV4cGxhbmF0aW9uIGFzIGFib3ZlICovCisJCWlmKEVOR0lORV9jdHJsKGUsIG51bSwgMCwgKHZvaWQgKilhcmcsIE5VTEwpID4gMCkKKwkJCXJldHVybiAxOworCQlyZXR1cm4gMDsKKwkJfQorCS8qIElmIGl0IGRvZXNuJ3QgdGFrZSBudW1lcmljIGVpdGhlciwgdGhlbiBpdCBpcyB1bnN1cHBvcnRlZCBmb3IgdXNlIGluCisJICogYSBjb25maWctc2V0dGluZyBzaXR1YXRpb24sIHdoaWNoIGlzIHdoYXQgdGhpcyBmdW5jdGlvbiBpcyBmb3IuIFRoaXMKKwkgKiBzaG91bGQgbmV2ZXIgaGFwcGVuIHRob3VnaCwgYmVjYXVzZSBFTkdJTkVfY21kX2lzX2V4ZWN1dGFibGUoKSB3YXMKKwkgKiB1c2VkLiAqLworCWlmKCEoZmxhZ3MgJiBFTkdJTkVfQ01EX0ZMQUdfTlVNRVJJQykpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9DVFJMX0NNRF9TVFJJTkcsCisJCQlFTkdJTkVfUl9JTlRFUk5BTF9MSVNUX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlsID0gc3RydG9sKGFyZywgJnB0ciwgMTApOworCWlmKChhcmcgPT0gcHRyKSB8fCAoKnB0ciAhPSAnXDAnKSkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0NUUkxfQ01EX1NUUklORywKKwkJCUVOR0lORV9SX0FSR1VNRU5UX0lTX05PVF9BX05VTUJFUik7CisJCXJldHVybiAwOworCQl9CisJLyogRm9yY2UgdGhlIHJlc3VsdCBvZiB0aGUgY29udHJvbCBjb21tYW5kIHRvIDAgb3IgMSwgZm9yIHRoZSByZWFzb25zCisJICogbWVudGlvbmVkIGJlZm9yZS4gKi8KKwlpZihFTkdJTkVfY3RybChlLCBudW0sIGwsIE5VTEwsIE5VTEwpID4gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfZHluLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19keW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDdkYTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfZHluLmMKQEAgLTAsMCArMSw1NDggQEAKKy8qIGNyeXB0by9lbmdpbmUvZW5nX2R5bi5jICovCisvKiBXcml0dGVuIGJ5IEdlb2ZmIFRob3JwZSAoZ2VvZmZAZ2VvZmZ0aG9ycGUubmV0KSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgImVuZ19pbnQuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Rzby5oPgorCisvKiBTaGFyZWQgbGlicmFyaWVzIGltcGxlbWVudGluZyBFTkdJTkVzIGZvciB1c2UgYnkgdGhlICJkeW5hbWljIiBFTkdJTkUgbG9hZGVyCisgKiBzaG91bGQgaW1wbGVtZW50IHRoZSBob29rLXVwIGZ1bmN0aW9ucyB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvdG90eXBlcy4gKi8KKworLyogT3VyIEVOR0lORSBoYW5kbGVycyAqLworc3RhdGljIGludCBkeW5hbWljX2luaXQoRU5HSU5FICplKTsKK3N0YXRpYyBpbnQgZHluYW1pY19maW5pc2goRU5HSU5FICplKTsKK3N0YXRpYyBpbnQgZHluYW1pY19jdHJsKEVOR0lORSAqZSwgaW50IGNtZCwgbG9uZyBpLCB2b2lkICpwLCB2b2lkICgqZikodm9pZCkpOworLyogUHJlZGVjbGFyZSBvdXIgY29udGV4dCB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBzdF9keW5hbWljX2RhdGFfY3R4IGR5bmFtaWNfZGF0YV9jdHg7CisvKiBUaGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBpbXBvcnRhbnQgY29udHJvbCBjb21tYW5kICovCitzdGF0aWMgaW50IGR5bmFtaWNfbG9hZChFTkdJTkUgKmUsIGR5bmFtaWNfZGF0YV9jdHggKmN0eCk7CisKKyNkZWZpbmUgRFlOQU1JQ19DTURfU09fUEFUSAkJRU5HSU5FX0NNRF9CQVNFCisjZGVmaW5lIERZTkFNSUNfQ01EX05PX1ZDSEVDSwkJKEVOR0lORV9DTURfQkFTRSArIDEpCisjZGVmaW5lIERZTkFNSUNfQ01EX0lECQkJKEVOR0lORV9DTURfQkFTRSArIDIpCisjZGVmaW5lIERZTkFNSUNfQ01EX0xJU1RfQURECQkoRU5HSU5FX0NNRF9CQVNFICsgMykKKyNkZWZpbmUgRFlOQU1JQ19DTURfRElSX0xPQUQJCShFTkdJTkVfQ01EX0JBU0UgKyA0KQorI2RlZmluZSBEWU5BTUlDX0NNRF9ESVJfQURECQkoRU5HSU5FX0NNRF9CQVNFICsgNSkKKyNkZWZpbmUgRFlOQU1JQ19DTURfTE9BRAkJKEVOR0lORV9DTURfQkFTRSArIDYpCisKKy8qIFRoZSBjb25zdGFudHMgdXNlZCB3aGVuIGNyZWF0aW5nIHRoZSBFTkdJTkUgKi8KK3N0YXRpYyBjb25zdCBjaGFyICplbmdpbmVfZHluYW1pY19pZCA9ICJkeW5hbWljIjsKK3N0YXRpYyBjb25zdCBjaGFyICplbmdpbmVfZHluYW1pY19uYW1lID0gIkR5bmFtaWMgZW5naW5lIGxvYWRpbmcgc3VwcG9ydCI7CitzdGF0aWMgY29uc3QgRU5HSU5FX0NNRF9ERUZOIGR5bmFtaWNfY21kX2RlZm5zW10gPSB7CisJe0RZTkFNSUNfQ01EX1NPX1BBVEgsCisJCSJTT19QQVRIIiwKKwkJIlNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgbmV3IEVOR0lORSBzaGFyZWQgbGlicmFyeSIsCisJCUVOR0lORV9DTURfRkxBR19TVFJJTkd9LAorCXtEWU5BTUlDX0NNRF9OT19WQ0hFQ0ssCisJCSJOT19WQ0hFQ0siLAorCQkiU3BlY2lmaWVzIHRvIGNvbnRpbnVlIGV2ZW4gaWYgdmVyc2lvbiBjaGVja2luZyBmYWlscyAoYm9vbGVhbikiLAorCQlFTkdJTkVfQ01EX0ZMQUdfTlVNRVJJQ30sCisJe0RZTkFNSUNfQ01EX0lELAorCQkiSUQiLAorCQkiU3BlY2lmaWVzIGFuIEVOR0lORSBpZCBuYW1lIGZvciBsb2FkaW5nIiwKKwkJRU5HSU5FX0NNRF9GTEFHX1NUUklOR30sCisJe0RZTkFNSUNfQ01EX0xJU1RfQURELAorCQkiTElTVF9BREQiLAorCQkiV2hldGhlciB0byBhZGQgYSBsb2FkZWQgRU5HSU5FIHRvIHRoZSBpbnRlcm5hbCBsaXN0ICgwPW5vLDE9eWVzLDI9bWFuZGF0b3J5KSIsCisJCUVOR0lORV9DTURfRkxBR19OVU1FUklDfSwKKwl7RFlOQU1JQ19DTURfRElSX0xPQUQsCisJCSJESVJfTE9BRCIsCisJCSJTcGVjaWZpZXMgd2hldGhlciB0byBsb2FkIGZyb20gJ0RJUl9BREQnIGRpcmVjdG9yaWVzICgwPW5vLDE9eWVzLDI9bWFuZGF0b3J5KSIsCisJCUVOR0lORV9DTURfRkxBR19OVU1FUklDfSwKKwl7RFlOQU1JQ19DTURfRElSX0FERCwKKwkJIkRJUl9BREQiLAorCQkiQWRkcyBhIGRpcmVjdG9yeSBmcm9tIHdoaWNoIEVOR0lORXMgY2FuIGJlIGxvYWRlZCIsCisJCUVOR0lORV9DTURfRkxBR19TVFJJTkd9LAorCXtEWU5BTUlDX0NNRF9MT0FELAorCQkiTE9BRCIsCisJCSJMb2FkIHVwIHRoZSBFTkdJTkUgc3BlY2lmaWVkIGJ5IG90aGVyIHNldHRpbmdzIiwKKwkJRU5HSU5FX0NNRF9GTEFHX05PX0lOUFVUfSwKKwl7MCwgTlVMTCwgTlVMTCwgMH0KKwl9Oworc3RhdGljIGNvbnN0IEVOR0lORV9DTURfREVGTiBkeW5hbWljX2NtZF9kZWZuc19lbXB0eVtdID0geworCXswLCBOVUxMLCBOVUxMLCAwfQorCX07CisKKy8qIExvYWRpbmcgY29kZSBzdG9yZXMgc3RhdGUgaW5zaWRlIHRoZSBFTkdJTkUgc3RydWN0dXJlIHZpYSB0aGUgImV4X2RhdGEiCisgKiBlbGVtZW50LiBXZSBsb2FkIGFsbCBvdXIgc3RhdGUgaW50byBhIHNpbmdsZSBzdHJ1Y3R1cmUgYW5kIHVzZSB0aGF0IGFzIGEKKyAqIHNpbmdsZSBjb250ZXh0IGluIHRoZSAiZXhfZGF0YSIgc3RhY2suICovCitzdHJ1Y3Qgc3RfZHluYW1pY19kYXRhX2N0eAorCXsKKwkvKiBUaGUgRFNPIG9iamVjdCB3ZSBsb2FkIHRoYXQgc3VwcGxpZXMgdGhlIEVOR0lORSBjb2RlICovCisJRFNPICpkeW5hbWljX2RzbzsKKwkvKiBUaGUgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgdmVyc2lvbiBjaGVja2luZyBzaGFyZWQgbGlicmFyeSBmdW5jdGlvbiAqLworCWR5bmFtaWNfdl9jaGVja19mbiB2X2NoZWNrOworCS8qIFRoZSBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBlbmdpbmUtYmluZGluZyBzaGFyZWQgbGlicmFyeSBmdW5jdGlvbiAqLworCWR5bmFtaWNfYmluZF9lbmdpbmUgYmluZF9lbmdpbmU7CisJLyogVGhlIGRlZmF1bHQgbmFtZS9wYXRoIGZvciBsb2FkaW5nIHRoZSBzaGFyZWQgbGlicmFyeSAqLworCWNvbnN0IGNoYXIgKkRZTkFNSUNfTElCTkFNRTsKKwkvKiBXaGV0aGVyIHRvIGNvbnRpbnVlIGxvYWRpbmcgb24gYSB2ZXJzaW9uIGNoZWNrIGZhaWx1cmUgKi8KKwlpbnQgbm9fdmNoZWNrOworCS8qIElmIG5vbi1OVUxMLCBzdGlwdWxhdGVzIHRoZSAnaWQnIG9mIHRoZSBFTkdJTkUgdG8gYmUgbG9hZGVkICovCisJY29uc3QgY2hhciAqZW5naW5lX2lkOworCS8qIElmIG5vbi16ZXJvLCBhIHN1Y2Nlc3NmdWxseSBsb2FkZWQgRU5HSU5FIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgaW50ZXJuYWwKKwkgKiBFTkdJTkUgbGlzdC4gSWYgMiwgdGhlIGFkZCBtdXN0IHN1Y2NlZWQgb3IgdGhlIGVudGlyZSBsb2FkIHNob3VsZCBmYWlsLiAqLworCWludCBsaXN0X2FkZF92YWx1ZTsKKwkvKiBUaGUgc3ltYm9sIG5hbWUgZm9yIHRoZSB2ZXJzaW9uIGNoZWNraW5nIGZ1bmN0aW9uICovCisJY29uc3QgY2hhciAqRFlOQU1JQ19GMTsKKwkvKiBUaGUgc3ltYm9sIG5hbWUgZm9yIHRoZSAiaW5pdGlhbGlzZSBFTkdJTkUgc3RydWN0dXJlIiBmdW5jdGlvbiAqLworCWNvbnN0IGNoYXIgKkRZTkFNSUNfRjI7CisJLyogV2hldGhlciB0byBuZXZlciB1c2UgJ2RpcnMnLCB1c2UgJ2RpcnMnIGFzIGEgZmFsbGJhY2ssIG9yIG9ubHkgdXNlCisJICogJ2RpcnMnIGZvciBsb2FkaW5nLiBEZWZhdWx0IGlzIHRvIHVzZSAnZGlycycgYXMgYSBmYWxsYmFjay4gKi8KKwlpbnQgZGlyX2xvYWQ7CisJLyogQSBzdGFjayBvZiBkaXJlY3RvcmllcyBmcm9tIHdoaWNoIEVOR0lORXMgY291bGQgYmUgbG9hZGVkICovCisJU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpkaXJzOworCX07CisKKy8qIFRoaXMgaXMgdGhlICJleF9kYXRhIiBpbmRleCB3ZSBvYnRhaW4gYW5kIHJlc2VydmUgZm9yIHVzZSB3aXRoIG91ciBjb250ZXh0CisgKiBzdHJ1Y3R1cmUuICovCitzdGF0aWMgaW50IGR5bmFtaWNfZXhfZGF0YV9pZHggPSAtMTsKKworc3RhdGljIHZvaWQgaW50X2ZyZWVfc3RyKGNoYXIgKnMpIHsgT1BFTlNTTF9mcmVlKHMpOyB9CisvKiBCZWNhdXNlIG91ciBleF9kYXRhIGVsZW1lbnQgbWF5IG9yIG1heSBub3QgZ2V0IGFsbG9jYXRlZCBkZXBlbmRpbmcgb24gd2hldGhlcgorICogYSAiZmlyc3QtdXNlIiBvY2N1cnMgYmVmb3JlIHRoZSBFTkdJTkUgaXMgZnJlZWQsIHdlIGhhdmUgYSBtZW1vcnkgbGVhaworICogcHJvYmxlbSB0byBzb2x2ZS4gV2UgY2FuJ3QgZGVjbGFyZSBhICJuZXciIGhhbmRsZXIgZm9yIHRoZSBleF9kYXRhIGFzIHdlCisgKiBkb24ndCB3YW50IGEgZHluYW1pY19kYXRhX2N0eCBpbiAqYWxsKiBFTkdJTkUgc3RydWN0dXJlcyBvZiBhbGwgdHlwZXMgKHRoaXMKKyAqIGlzIGEgYnVnIGluIHRoZSBkZXNpZ24gb2YgQ1JZUFRPX0VYX0RBVEEpLiBBcyBzdWNoLCB3ZSBqdXN0IGRlY2xhcmUgYSAiZnJlZSIKKyAqIGhhbmRsZXIgYW5kIHRoYXQgd2lsbCBnZXQgY2FsbGVkIGlmIGFuIEVOR0lORSBpcyBiZWluZyBkZXN0cm95ZWQgYW5kIHRoZXJlCisgKiB3YXMgYW4gZXhfZGF0YSBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gb3VyIGNvbnRleHQgdHlwZS4gKi8KK3N0YXRpYyB2b2lkIGR5bmFtaWNfZGF0YV9jdHhfZnJlZV9mdW5jKHZvaWQgKnBhcmVudCwgdm9pZCAqcHRyLAorCQkJQ1JZUFRPX0VYX0RBVEEgKmFkLCBpbnQgaWR4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApCisJeworCWlmKHB0cikKKwkJeworCQlkeW5hbWljX2RhdGFfY3R4ICpjdHggPSAoZHluYW1pY19kYXRhX2N0eCAqKXB0cjsKKwkJaWYoY3R4LT5keW5hbWljX2RzbykKKwkJCURTT19mcmVlKGN0eC0+ZHluYW1pY19kc28pOworCQlpZihjdHgtPkRZTkFNSUNfTElCTkFNRSkKKwkJCU9QRU5TU0xfZnJlZSgodm9pZCopY3R4LT5EWU5BTUlDX0xJQk5BTUUpOworCQlpZihjdHgtPmVuZ2luZV9pZCkKKwkJCU9QRU5TU0xfZnJlZSgodm9pZCopY3R4LT5lbmdpbmVfaWQpOworCQlpZihjdHgtPmRpcnMpCisJCQlza19PUEVOU1NMX1NUUklOR19wb3BfZnJlZShjdHgtPmRpcnMsIGludF9mcmVlX3N0cik7CisJCU9QRU5TU0xfZnJlZShjdHgpOworCQl9CisJfQorCisvKiBDb25zdHJ1Y3QgdGhlIHBlci1FTkdJTkUgY29udGV4dC4gV2UgY3JlYXRlIGl0IGJsaW5kbHkgYW5kIHRoZW4gdXNlIGEgbG9jayB0bworICogY2hlY2sgZm9yIGEgcmFjZSAtIGlmIHNvLCBhbGwgYnV0IG9uZSBvZiB0aGUgdGhyZWFkcyAicmFjaW5nIiB3aWxsIGhhdmUKKyAqIHdhc3RlZCB0aGVpciB0aW1lLiBUaGUgYWx0ZXJuYXRpdmUgaW52b2x2ZXMgY3JlYXRpbmcgZXZlcnl0aGluZyBpbnNpZGUgdGhlCisgKiBsb2NrIHdoaWNoIGlzIGZhciB3b3JzZS4gKi8KK3N0YXRpYyBpbnQgZHluYW1pY19zZXRfZGF0YV9jdHgoRU5HSU5FICplLCBkeW5hbWljX2RhdGFfY3R4ICoqY3R4KQorCXsKKwlkeW5hbWljX2RhdGFfY3R4ICpjOworCWMgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoZHluYW1pY19kYXRhX2N0eCkpOworCWlmKCFjKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9EWU5BTUlDX1NFVF9EQVRBX0NUWCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJbWVtc2V0KGMsIDAsIHNpemVvZihkeW5hbWljX2RhdGFfY3R4KSk7CisJYy0+ZHluYW1pY19kc28gPSBOVUxMOworCWMtPnZfY2hlY2sgPSBOVUxMOworCWMtPmJpbmRfZW5naW5lID0gTlVMTDsKKwljLT5EWU5BTUlDX0xJQk5BTUUgPSBOVUxMOworCWMtPm5vX3ZjaGVjayA9IDA7CisJYy0+ZW5naW5lX2lkID0gTlVMTDsKKwljLT5saXN0X2FkZF92YWx1ZSA9IDA7CisJYy0+RFlOQU1JQ19GMSA9ICJ2X2NoZWNrIjsKKwljLT5EWU5BTUlDX0YyID0gImJpbmRfZW5naW5lIjsKKwljLT5kaXJfbG9hZCA9IDE7CisJYy0+ZGlycyA9IHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCk7CisJaWYoIWMtPmRpcnMpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0RZTkFNSUNfU0VUX0RBVEFfQ1RYLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJT1BFTlNTTF9mcmVlKGMpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlpZigoKmN0eCA9IChkeW5hbWljX2RhdGFfY3R4ICopRU5HSU5FX2dldF9leF9kYXRhKGUsCisJCQkJZHluYW1pY19leF9kYXRhX2lkeCkpID09IE5VTEwpCisJCXsKKwkJLyogR29vZCwgd2UncmUgdGhlIGZpcnN0ICovCisJCUVOR0lORV9zZXRfZXhfZGF0YShlLCBkeW5hbWljX2V4X2RhdGFfaWR4LCBjKTsKKwkJKmN0eCA9IGM7CisJCWMgPSBOVUxMOworCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJLyogSWYgd2UgbG9zdCB0aGUgcmFjZSB0byBzZXQgdGhlIGNvbnRleHQsIGMgaXMgbm9uLU5VTEwgYW5kICpjdHggaXMgdGhlCisJICogY29udGV4dCBvZiB0aGUgdGhyZWFkIHRoYXQgd29uLiAqLworCWlmKGMpCisJCU9QRU5TU0xfZnJlZShjKTsKKwlyZXR1cm4gMTsKKwl9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBjb250ZXh0IHN0cnVjdHVyZSBmcm9tIGFuIEVOR0lORSdzICJleF9kYXRhIiwgb3IKKyAqIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LCBzZXRzIGl0IHVwLiAqLworc3RhdGljIGR5bmFtaWNfZGF0YV9jdHggKmR5bmFtaWNfZ2V0X2RhdGFfY3R4KEVOR0lORSAqZSkKKwl7CisJZHluYW1pY19kYXRhX2N0eCAqY3R4OworCWlmKGR5bmFtaWNfZXhfZGF0YV9pZHggPCAwKQorCQl7CisJCS8qIENyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIEVOR0lORSBleF9kYXRhLCBhbmQgYXNzb2NpYXRlIG91cgorCQkgKiAiZnJlZSIgZnVuY3Rpb24gd2l0aCBpdCB0byBlbnN1cmUgYW55IGFsbG9jYXRlZCBjb250ZXh0cyBnZXQKKwkJICogZnJlZWQgd2hlbiBhbiBFTkdJTkUgZ29lcyB1bmRlcmdyb3VuZC4gKi8KKwkJaW50IG5ld19pZHggPSBFTkdJTkVfZ2V0X2V4X25ld19pbmRleCgwLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkJCQlkeW5hbWljX2RhdGFfY3R4X2ZyZWVfZnVuYyk7CisJCWlmKG5ld19pZHggPT0gLTEpCisJCQl7CisJCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRFlOQU1JQ19HRVRfREFUQV9DVFgsRU5HSU5FX1JfTk9fSU5ERVgpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwkJLyogQXZvaWQgYSByYWNlIGJ5IGNoZWNraW5nIGFnYWluIGluc2lkZSB0aGlzIGxvY2sgKi8KKwkJaWYoZHluYW1pY19leF9kYXRhX2lkeCA8IDApCisJCQl7CisJCQkvKiBHb29kLCBzb21lb25lIGRpZG4ndCBiZWF0IHVzIHRvIGl0ICovCisJCQlkeW5hbWljX2V4X2RhdGFfaWR4ID0gbmV3X2lkeDsKKwkJCW5ld19pZHggPSAtMTsKKwkJCX0KKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJCS8qIEluIHRoZW9yeSB3ZSBjb3VsZCAiZ2l2ZSBiYWNrIiB0aGUgaW5kZXggaGVyZSBpZgorCQkgKiAobmV3X2lkeD4tMSksIGJ1dCBpdCdzIG5vdCBwb3NzaWJsZSBhbmQgd291bGRuJ3QgZ2FpbiB1cyBtdWNoCisJCSAqIGlmIGl0IHdlcmUuICovCisJCX0KKwljdHggPSAoZHluYW1pY19kYXRhX2N0eCAqKUVOR0lORV9nZXRfZXhfZGF0YShlLCBkeW5hbWljX2V4X2RhdGFfaWR4KTsKKwkvKiBDaGVjayBpZiB0aGUgY29udGV4dCBuZWVkcyB0byBiZSBjcmVhdGVkICovCisJaWYoKGN0eCA9PSBOVUxMKSAmJiAhZHluYW1pY19zZXRfZGF0YV9jdHgoZSwgJmN0eCkpCisJCS8qICJzZXRfZGF0YSIgd2lsbCBzZXQgZXJyb3JzIGlmIG5lY2Vzc2FyeSAqLworCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY3R4OworCX0KKworc3RhdGljIEVOR0lORSAqZW5naW5lX2R5bmFtaWModm9pZCkKKwl7CisJRU5HSU5FICpyZXQgPSBFTkdJTkVfbmV3KCk7CisJaWYoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisJaWYoIUVOR0lORV9zZXRfaWQocmV0LCBlbmdpbmVfZHluYW1pY19pZCkgfHwKKwkJCSFFTkdJTkVfc2V0X25hbWUocmV0LCBlbmdpbmVfZHluYW1pY19uYW1lKSB8fAorCQkJIUVOR0lORV9zZXRfaW5pdF9mdW5jdGlvbihyZXQsIGR5bmFtaWNfaW5pdCkgfHwKKwkJCSFFTkdJTkVfc2V0X2ZpbmlzaF9mdW5jdGlvbihyZXQsIGR5bmFtaWNfZmluaXNoKSB8fAorCQkJIUVOR0lORV9zZXRfY3RybF9mdW5jdGlvbihyZXQsIGR5bmFtaWNfY3RybCkgfHwKKwkJCSFFTkdJTkVfc2V0X2ZsYWdzKHJldCwgRU5HSU5FX0ZMQUdTX0JZX0lEX0NPUFkpIHx8CisJCQkhRU5HSU5FX3NldF9jbWRfZGVmbnMocmV0LCBkeW5hbWljX2NtZF9kZWZucykpCisJCXsKKwkJRU5HSU5FX2ZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKwordm9pZCBFTkdJTkVfbG9hZF9keW5hbWljKHZvaWQpCisJeworCUVOR0lORSAqdG9hZGQgPSBlbmdpbmVfZHluYW1pYygpOworCWlmKCF0b2FkZCkgcmV0dXJuOworCUVOR0lORV9hZGQodG9hZGQpOworCS8qIElmIHRoZSAiYWRkIiB3b3JrZWQsIGl0IGdldHMgYSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZS4gU28gZWl0aGVyIHdheSwKKwkgKiB3ZSByZWxlYXNlIG91ciBqdXN0LWNyZWF0ZWQgcmVmZXJlbmNlLiAqLworCUVOR0lORV9mcmVlKHRvYWRkKTsKKwkvKiBJZiB0aGUgImFkZCIgZGlkbid0IHdvcmssIGl0IHdhcyBwcm9iYWJseSBhIGNvbmZsaWN0IGJlY2F1c2UgaXQgd2FzCisJICogYWxyZWFkeSBhZGRlZCAoZWcuIHNvbWVvbmUgY2FsbGluZyBFTkdJTkVfbG9hZF9ibGFoIHRoZW4gY2FsbGluZworCSAqIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpIHBlcmhhcHMpLiAqLworCUVSUl9jbGVhcl9lcnJvcigpOworCX0KKworc3RhdGljIGludCBkeW5hbWljX2luaXQoRU5HSU5FICplKQorCXsKKwkvKiBXZSBhbHdheXMgcmV0dXJuIGZhaWx1cmUgLSB0aGUgImR5YW5hbWljIiBlbmdpbmUgaXRzZWxmIGNhbid0IGJlIHVzZWQKKwkgKiBmb3IgYW55dGhpbmcuICovCisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGR5bmFtaWNfZmluaXNoKEVOR0lORSAqZSkKKwl7CisJLyogVGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIG9uIGFjY291bnQgb2YgImR5bmFtaWNfaW5pdCIgYWx3YXlzCisJICogZmFpbGluZy4gKi8KKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgZHluYW1pY19jdHJsKEVOR0lORSAqZSwgaW50IGNtZCwgbG9uZyBpLCB2b2lkICpwLCB2b2lkICgqZikodm9pZCkpCisJeworCWR5bmFtaWNfZGF0YV9jdHggKmN0eCA9IGR5bmFtaWNfZ2V0X2RhdGFfY3R4KGUpOworCWludCBpbml0aWFsaXNlZDsKKwkKKwlpZighY3R4KQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9EWU5BTUlDX0NUUkwsRU5HSU5FX1JfTk9UX0xPQURFRCk7CisJCXJldHVybiAwOworCQl9CisJaW5pdGlhbGlzZWQgPSAoKGN0eC0+ZHluYW1pY19kc28gPT0gTlVMTCkgPyAwIDogMSk7CisJLyogQWxsIG91ciBjb250cm9sIGNvbW1hbmRzIHJlcXVpcmUgdGhlIEVOR0lORSB0byBiZSB1bmluaXRpYWxpc2VkICovCisJaWYoaW5pdGlhbGlzZWQpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0RZTkFNSUNfQ1RSTCwKKwkJCUVOR0lORV9SX0FMUkVBRFlfTE9BREVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlzd2l0Y2goY21kKQorCQl7CisJY2FzZSBEWU5BTUlDX0NNRF9TT19QQVRIOgorCQkvKiBhIE5VTEwgJ3AnIG9yIGEgc3RyaW5nIG9mIHplcm8tbGVuZ3RoIGlzIHRoZSBzYW1lIHRoaW5nICovCisJCWlmKHAgJiYgKHN0cmxlbigoY29uc3QgY2hhciAqKXApIDwgMSkpCisJCQlwID0gTlVMTDsKKwkJaWYoY3R4LT5EWU5BTUlDX0xJQk5BTUUpCisJCQlPUEVOU1NMX2ZyZWUoKHZvaWQqKWN0eC0+RFlOQU1JQ19MSUJOQU1FKTsKKwkJaWYocCkKKwkJCWN0eC0+RFlOQU1JQ19MSUJOQU1FID0gQlVGX3N0cmR1cChwKTsKKwkJZWxzZQorCQkJY3R4LT5EWU5BTUlDX0xJQk5BTUUgPSBOVUxMOworCQlyZXR1cm4gKGN0eC0+RFlOQU1JQ19MSUJOQU1FID8gMSA6IDApOworCWNhc2UgRFlOQU1JQ19DTURfTk9fVkNIRUNLOgorCQljdHgtPm5vX3ZjaGVjayA9ICgoaSA9PSAwKSA/IDAgOiAxKTsKKwkJcmV0dXJuIDE7CisJY2FzZSBEWU5BTUlDX0NNRF9JRDoKKwkJLyogYSBOVUxMICdwJyBvciBhIHN0cmluZyBvZiB6ZXJvLWxlbmd0aCBpcyB0aGUgc2FtZSB0aGluZyAqLworCQlpZihwICYmIChzdHJsZW4oKGNvbnN0IGNoYXIgKilwKSA8IDEpKQorCQkJcCA9IE5VTEw7CisJCWlmKGN0eC0+ZW5naW5lX2lkKQorCQkJT1BFTlNTTF9mcmVlKCh2b2lkKiljdHgtPmVuZ2luZV9pZCk7CisJCWlmKHApCisJCQljdHgtPmVuZ2luZV9pZCA9IEJVRl9zdHJkdXAocCk7CisJCWVsc2UKKwkJCWN0eC0+ZW5naW5lX2lkID0gTlVMTDsKKwkJcmV0dXJuIChjdHgtPmVuZ2luZV9pZCA/IDEgOiAwKTsKKwljYXNlIERZTkFNSUNfQ01EX0xJU1RfQUREOgorCQlpZigoaSA8IDApIHx8IChpID4gMikpCisJCQl7CisJCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRFlOQU1JQ19DVFJMLAorCQkJCUVOR0lORV9SX0lOVkFMSURfQVJHVU1FTlQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWN0eC0+bGlzdF9hZGRfdmFsdWUgPSAoaW50KWk7CisJCXJldHVybiAxOworCWNhc2UgRFlOQU1JQ19DTURfTE9BRDoKKwkJcmV0dXJuIGR5bmFtaWNfbG9hZChlLCBjdHgpOworCWNhc2UgRFlOQU1JQ19DTURfRElSX0xPQUQ6CisJCWlmKChpIDwgMCkgfHwgKGkgPiAyKSkKKwkJCXsKKwkJCUVOR0lORWVycihFTkdJTkVfRl9EWU5BTUlDX0NUUkwsCisJCQkJRU5HSU5FX1JfSU5WQUxJRF9BUkdVTUVOVCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJY3R4LT5kaXJfbG9hZCA9IChpbnQpaTsKKwkJcmV0dXJuIDE7CisJY2FzZSBEWU5BTUlDX0NNRF9ESVJfQUREOgorCQkvKiBhIE5VTEwgJ3AnIG9yIGEgc3RyaW5nIG9mIHplcm8tbGVuZ3RoIGlzIHRoZSBzYW1lIHRoaW5nICovCisJCWlmKCFwIHx8IChzdHJsZW4oKGNvbnN0IGNoYXIgKilwKSA8IDEpKQorCQkJeworCQkJRU5HSU5FZXJyKEVOR0lORV9GX0RZTkFNSUNfQ1RSTCwKKwkJCQlFTkdJTkVfUl9JTlZBTElEX0FSR1VNRU5UKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl7CisJCWNoYXIgKnRtcF9zdHIgPSBCVUZfc3RyZHVwKHApOworCQlpZighdG1wX3N0cikKKwkJCXsKKwkJCUVOR0lORWVycihFTkdJTkVfRl9EWU5BTUlDX0NUUkwsCisJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCXNrX09QRU5TU0xfU1RSSU5HX2luc2VydChjdHgtPmRpcnMsIHRtcF9zdHIsIC0xKTsKKwkJfQorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwkJfQorCUVOR0lORWVycihFTkdJTkVfRl9EWU5BTUlDX0NUUkwsRU5HSU5FX1JfQ1RSTF9DT01NQU5EX05PVF9JTVBMRU1FTlRFRCk7CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGludF9sb2FkKGR5bmFtaWNfZGF0YV9jdHggKmN0eCkKKwl7CisJaW50IG51bSwgbG9vcDsKKwkvKiBVbmxlc3MgdG9sZCBub3QgdG8sIHRyeSBhIGRpcmVjdCBsb2FkICovCisJaWYoKGN0eC0+ZGlyX2xvYWQgIT0gMikgJiYgKERTT19sb2FkKGN0eC0+ZHluYW1pY19kc28sCisJCQkJY3R4LT5EWU5BTUlDX0xJQk5BTUUsIE5VTEwsIDApKSAhPSBOVUxMKQorCQlyZXR1cm4gMTsKKwkvKiBJZiB3ZSdyZSBub3QgYWxsb3dlZCB0byB1c2UgJ2RpcnMnIG9yIHdlIGhhdmUgbm9uZSwgZmFpbCAqLworCWlmKCFjdHgtPmRpcl9sb2FkIHx8IChudW0gPSBza19PUEVOU1NMX1NUUklOR19udW0oY3R4LT5kaXJzKSkgPCAxKQorCQlyZXR1cm4gMDsKKwlmb3IobG9vcCA9IDA7IGxvb3AgPCBudW07IGxvb3ArKykKKwkJeworCQljb25zdCBjaGFyICpzID0gc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoY3R4LT5kaXJzLCBsb29wKTsKKwkJY2hhciAqbWVyZ2UgPSBEU09fbWVyZ2UoY3R4LT5keW5hbWljX2RzbywgY3R4LT5EWU5BTUlDX0xJQk5BTUUsIHMpOworCQlpZighbWVyZ2UpCisJCQlyZXR1cm4gMDsKKwkJaWYoRFNPX2xvYWQoY3R4LT5keW5hbWljX2RzbywgbWVyZ2UsIE5VTEwsIDApKQorCQkJeworCQkJLyogRm91bmQgd2hhdCB3ZSdyZSBsb29raW5nIGZvciAqLworCQkJT1BFTlNTTF9mcmVlKG1lcmdlKTsKKwkJCXJldHVybiAxOworCQkJfQorCQlPUEVOU1NMX2ZyZWUobWVyZ2UpOworCQl9CisJcmV0dXJuIDA7CisJfQorCitzdGF0aWMgaW50IGR5bmFtaWNfbG9hZChFTkdJTkUgKmUsIGR5bmFtaWNfZGF0YV9jdHggKmN0eCkKKwl7CisJRU5HSU5FIGNweTsKKwlkeW5hbWljX2ZucyBmbnM7CisKKwlpZighY3R4LT5keW5hbWljX2RzbykKKwkJY3R4LT5keW5hbWljX2RzbyA9IERTT19uZXcoKTsKKwlpZighY3R4LT5EWU5BTUlDX0xJQk5BTUUpCisJCXsKKwkJaWYoIWN0eC0+ZW5naW5lX2lkKQorCQkJcmV0dXJuIDA7CisJCWN0eC0+RFlOQU1JQ19MSUJOQU1FID0KKwkJCURTT19jb252ZXJ0X2ZpbGVuYW1lKGN0eC0+ZHluYW1pY19kc28sIGN0eC0+ZW5naW5lX2lkKTsKKwkJfQorCWlmKCFpbnRfbG9hZChjdHgpKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9EWU5BTUlDX0xPQUQsCisJCQlFTkdJTkVfUl9EU09fTk9UX0ZPVU5EKTsKKwkJRFNPX2ZyZWUoY3R4LT5keW5hbWljX2Rzbyk7CisJCWN0eC0+ZHluYW1pY19kc28gPSBOVUxMOworCQlyZXR1cm4gMDsKKwkJfQorCS8qIFdlIGhhdmUgdG8gZmluZCBhIGJpbmQgZnVuY3Rpb24gb3RoZXJ3aXNlIGl0J2xsIGFsd2F5cyBlbmQgYmFkbHkgKi8KKwlpZighKGN0eC0+YmluZF9lbmdpbmUgPSAoZHluYW1pY19iaW5kX2VuZ2luZSlEU09fYmluZF9mdW5jKAorCQkJCQljdHgtPmR5bmFtaWNfZHNvLCBjdHgtPkRZTkFNSUNfRjIpKSkKKwkJeworCQljdHgtPmJpbmRfZW5naW5lID0gTlVMTDsKKwkJRFNPX2ZyZWUoY3R4LT5keW5hbWljX2Rzbyk7CisJCWN0eC0+ZHluYW1pY19kc28gPSBOVUxMOworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRFlOQU1JQ19MT0FELAorCQkJRU5HSU5FX1JfRFNPX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCS8qIERvIHdlIHBlcmZvcm0gdmVyc2lvbiBjaGVja2luZz8gKi8KKwlpZighY3R4LT5ub192Y2hlY2spCisJCXsKKwkJdW5zaWduZWQgbG9uZyB2Y2hlY2tfcmVzID0gMDsKKwkJLyogTm93IHdlIHRyeSB0byBmaW5kIGEgdmVyc2lvbiBjaGVja2luZyBmdW5jdGlvbiBhbmQgZGVjaWRlIGhvdworCQkgKiB0byBjb3BlIHdpdGggZmFpbHVyZSBpZi93aGVuIGl0IGZhaWxzLiAqLworCQljdHgtPnZfY2hlY2sgPSAoZHluYW1pY192X2NoZWNrX2ZuKURTT19iaW5kX2Z1bmMoCisJCQkJY3R4LT5keW5hbWljX2RzbywgY3R4LT5EWU5BTUlDX0YxKTsKKwkJaWYoY3R4LT52X2NoZWNrKQorCQkJdmNoZWNrX3JlcyA9IGN0eC0+dl9jaGVjayhPU1NMX0RZTkFNSUNfVkVSU0lPTik7CisJCS8qIFdlIGZhaWwgaWYgdGhlIHZlcnNpb24gY2hlY2tlciB2ZXRvJ2QgdGhlIGxvYWQgKm9yKiBpZiBpdCBpcworCQkgKiBkZWZlcnJpbmcgdG8gdXMgKGJ5IHJldHVybmluZyBpdHMgdmVyc2lvbikgYW5kIHdlIHRoaW5rIGl0IGlzCisJCSAqIHRvbyBvbGQuICovCisJCWlmKHZjaGVja19yZXMgPCBPU1NMX0RZTkFNSUNfT0xERVNUKQorCQkJeworCQkJLyogRmFpbCAqLworCQkJY3R4LT5iaW5kX2VuZ2luZSA9IE5VTEw7CisJCQljdHgtPnZfY2hlY2sgPSBOVUxMOworCQkJRFNPX2ZyZWUoY3R4LT5keW5hbWljX2Rzbyk7CisJCQljdHgtPmR5bmFtaWNfZHNvID0gTlVMTDsKKwkJCUVOR0lORWVycihFTkdJTkVfRl9EWU5BTUlDX0xPQUQsCisJCQkJRU5HSU5FX1JfVkVSU0lPTl9JTkNPTVBBVElCSUxJVFkpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkvKiBGaXJzdCBiaW5hcnkgY29weSB0aGUgRU5HSU5FIHN0cnVjdHVyZSBzbyB0aGF0IHdlIGNhbiByb2xsIGJhY2sgaWYKKwkgKiB0aGUgaGFuZC1vdmVyIGZhaWxzICovCisJbWVtY3B5KCZjcHksIGUsIHNpemVvZihFTkdJTkUpKTsKKwkvKiBQcm92aWRlIHRoZSBFUlIsICJleF9kYXRhIiwgbWVtb3J5LCBhbmQgbG9ja2luZyBjYWxsYmFja3Mgc28gdGhlCisJICogbG9hZGVkIGxpYnJhcnkgdXNlcyBvdXIgc3RhdGUgcmF0aGVyIHRoYW4gaXRzIG93bi4gRklYTUU6IEFzIG5vdGVkIGluCisJICogZW5naW5lLmgsIG11Y2ggb2YgdGhpcyB3b3VsZCBiZSBzaW1wbGlmaWVkIGlmIGVhY2ggYXJlYSBvZiBjb2RlCisJICogcHJvdmlkZWQgaXRzIG93biAic3VtbWFyeSIgc3RydWN0dXJlIG9mIGFsbCByZWxhdGVkIGNhbGxiYWNrcy4gSXQKKwkgKiB3b3VsZCBhbHNvIGluY3JlYXNlIG9wYXF1ZW5lc3MuICovCisJZm5zLnN0YXRpY19zdGF0ZSA9IEVOR0lORV9nZXRfc3RhdGljX3N0YXRlKCk7CisJZm5zLmVycl9mbnMgPSBFUlJfZ2V0X2ltcGxlbWVudGF0aW9uKCk7CisJZm5zLmV4X2RhdGFfZm5zID0gQ1JZUFRPX2dldF9leF9kYXRhX2ltcGxlbWVudGF0aW9uKCk7CisJQ1JZUFRPX2dldF9tZW1fZnVuY3Rpb25zKCZmbnMubWVtX2Zucy5tYWxsb2NfY2IsCisJCQkJJmZucy5tZW1fZm5zLnJlYWxsb2NfY2IsCisJCQkJJmZucy5tZW1fZm5zLmZyZWVfY2IpOworCWZucy5sb2NrX2Zucy5sb2NrX2xvY2tpbmdfY2IgPSBDUllQVE9fZ2V0X2xvY2tpbmdfY2FsbGJhY2soKTsKKwlmbnMubG9ja19mbnMubG9ja19hZGRfbG9ja19jYiA9IENSWVBUT19nZXRfYWRkX2xvY2tfY2FsbGJhY2soKTsKKwlmbnMubG9ja19mbnMuZHlubG9ja19jcmVhdGVfY2IgPSBDUllQVE9fZ2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKCk7CisJZm5zLmxvY2tfZm5zLmR5bmxvY2tfbG9ja19jYiA9IENSWVBUT19nZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrKCk7CisJZm5zLmxvY2tfZm5zLmR5bmxvY2tfZGVzdHJveV9jYiA9IENSWVBUT19nZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKCk7CisJLyogTm93IHRoYXQgd2UndmUgbG9hZGVkIHRoZSBkeW5hbWljIGVuZ2luZSwgbWFrZSBzdXJlIG5vICJkeW5hbWljIgorCSAqIEVOR0lORSBlbGVtZW50cyB3aWxsIHNob3cgdGhyb3VnaC4gKi8KKwllbmdpbmVfc2V0X2FsbF9udWxsKGUpOworCisJLyogVHJ5IHRvIGJpbmQgdGhlIEVOR0lORSBvbnRvIG91ciBvd24gRU5HSU5FIHN0cnVjdHVyZSAqLworCWlmKCFjdHgtPmJpbmRfZW5naW5lKGUsIGN0eC0+ZW5naW5lX2lkLCAmZm5zKSkKKwkJeworCQljdHgtPmJpbmRfZW5naW5lID0gTlVMTDsKKwkJY3R4LT52X2NoZWNrID0gTlVMTDsKKwkJRFNPX2ZyZWUoY3R4LT5keW5hbWljX2Rzbyk7CisJCWN0eC0+ZHluYW1pY19kc28gPSBOVUxMOworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRFlOQU1JQ19MT0FELEVOR0lORV9SX0lOSVRfRkFJTEVEKTsKKwkJLyogQ29weSB0aGUgb3JpZ2luYWwgRU5HSU5FIHN0cnVjdHVyZSBiYWNrICovCisJCW1lbWNweShlLCAmY3B5LCBzaXplb2YoRU5HSU5FKSk7CisJCXJldHVybiAwOworCQl9CisJLyogRG8gd2UgdHJ5IHRvIGFkZCB0aGlzIEVOR0lORSB0byB0aGUgaW50ZXJuYWwgbGlzdCB0b28/ICovCisJaWYoY3R4LT5saXN0X2FkZF92YWx1ZSA+IDApCisJCXsKKwkJaWYoIUVOR0lORV9hZGQoZSkpCisJCQl7CisJCQkvKiBEbyB3ZSB0b2xlcmF0ZSB0aGlzIG9yIGZhaWw/ICovCisJCQlpZihjdHgtPmxpc3RfYWRkX3ZhbHVlID4gMSkKKwkJCQl7CisJCQkJLyogRmFpbCAtIE5COiBCeSB0aGlzIHRpbWUsIGl0J3MgdG9vIGxhdGUgdG8KKwkJCQkgKiByb2xsYmFjaywgYW5kIHRyeWluZyB0byBkbyBzbyBhbGxvd3MgdGhlCisJCQkJICogYmluZF9lbmdpbmUoKSBjb2RlIHRvIGhhdmUgY3JlYXRlZCBsZWFrcy4gV2UKKwkJCQkgKiBqdXN0IGhhdmUgdG8gZmFpbCB3aGVyZSB3ZSBhcmUsIGFmdGVyIHRoZQorCQkJCSAqIEVOR0lORSBoYXMgY2hhbmdlZC4gKi8KKwkJCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRFlOQU1JQ19MT0FELAorCQkJCQlFTkdJTkVfUl9DT05GTElDVElOR19FTkdJTkVfSUQpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCS8qIFRvbGVyYXRlICovCisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCX0KKwkJfQorCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjNzBhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2Vyci5jCkBAIC0wLDAgKzEsMTczIEBACisvKiBjcnlwdG8vZW5naW5lL2VuZ19lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDEwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfRU5HSU5FLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfRU5HSU5FLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEVOR0lORV9zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKEVOR0lORV9GX0RZTkFNSUNfQ1RSTCksCSJEWU5BTUlDX0NUUkwifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9EWU5BTUlDX0dFVF9EQVRBX0NUWCksCSJEWU5BTUlDX0dFVF9EQVRBX0NUWCJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0RZTkFNSUNfTE9BRCksCSJEWU5BTUlDX0xPQUQifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9EWU5BTUlDX1NFVF9EQVRBX0NUWCksCSJEWU5BTUlDX1NFVF9EQVRBX0NUWCJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9BREQpLAkiRU5HSU5FX2FkZCJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9CWV9JRCksCSJFTkdJTkVfYnlfaWQifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfQ01EX0lTX0VYRUNVVEFCTEUpLAkiRU5HSU5FX2NtZF9pc19leGVjdXRhYmxlIn0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX0NUUkwpLAkiRU5HSU5FX2N0cmwifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfQ1RSTF9DTUQpLAkiRU5HSU5FX2N0cmxfY21kIn0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX0NUUkxfQ01EX1NUUklORyksCSJFTkdJTkVfY3RybF9jbWRfc3RyaW5nIn0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX0ZJTklTSCksCSJFTkdJTkVfZmluaXNoIn0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX0ZSRUVfVVRJTCksCSJFTkdJTkVfRlJFRV9VVElMIn0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX0dFVF9DSVBIRVIpLAkiRU5HSU5FX2dldF9jaXBoZXIifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfR0VUX0RFRkFVTFRfVFlQRSksCSJFTkdJTkVfR0VUX0RFRkFVTFRfVFlQRSJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9HRVRfRElHRVNUKSwJIkVOR0lORV9nZXRfZGlnZXN0In0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX0dFVF9ORVhUKSwJIkVOR0lORV9nZXRfbmV4dCJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9HRVRfUEtFWV9BU04xX01FVEgpLAkiRU5HSU5FX2dldF9wa2V5X2FzbjFfbWV0aCJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9HRVRfUEtFWV9NRVRIKSwJIkVOR0lORV9nZXRfcGtleV9tZXRoIn0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX0dFVF9QUkVWKSwJIkVOR0lORV9nZXRfcHJldiJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9JTklUKSwJIkVOR0lORV9pbml0In0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX0xJU1RfQUREKSwJIkVOR0lORV9MSVNUX0FERCJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9MSVNUX1JFTU9WRSksCSJFTkdJTkVfTElTVF9SRU1PVkUifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfTE9BRF9QUklWQVRFX0tFWSksCSJFTkdJTkVfbG9hZF9wcml2YXRlX2tleSJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9MT0FEX1BVQkxJQ19LRVkpLAkiRU5HSU5FX2xvYWRfcHVibGljX2tleSJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9MT0FEX1NTTF9DTElFTlRfQ0VSVCksCSJFTkdJTkVfbG9hZF9zc2xfY2xpZW50X2NlcnQifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfTkVXKSwJIkVOR0lORV9uZXcifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfUkVNT1ZFKSwJIkVOR0lORV9yZW1vdmUifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfU0VUX0RFRkFVTFRfU1RSSU5HKSwJIkVOR0lORV9zZXRfZGVmYXVsdF9zdHJpbmcifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfU0VUX0RFRkFVTFRfVFlQRSksCSJFTkdJTkVfU0VUX0RFRkFVTFRfVFlQRSJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9TRVRfSUQpLAkiRU5HSU5FX3NldF9pZCJ9LAore0VSUl9GVU5DKEVOR0lORV9GX0VOR0lORV9TRVRfTkFNRSksCSJFTkdJTkVfc2V0X25hbWUifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfVEFCTEVfUkVHSVNURVIpLAkiRU5HSU5FX1RBQkxFX1JFR0lTVEVSIn0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfRU5HSU5FX1VOTE9BRF9LRVkpLAkiRU5HSU5FX1VOTE9BRF9LRVkifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfVU5MT0NLRURfRklOSVNIKSwJIkVOR0lORV9VTkxPQ0tFRF9GSU5JU0gifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9FTkdJTkVfVVBfUkVGKSwJIkVOR0lORV91cF9yZWYifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9JTlRfQ1RSTF9IRUxQRVIpLAkiSU5UX0NUUkxfSEVMUEVSIn0sCit7RVJSX0ZVTkMoRU5HSU5FX0ZfSU5UX0VOR0lORV9DT05GSUdVUkUpLAkiSU5UX0VOR0lORV9DT05GSUdVUkUifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9JTlRfRU5HSU5FX01PRFVMRV9JTklUKSwJIklOVF9FTkdJTkVfTU9EVUxFX0lOSVQifSwKK3tFUlJfRlVOQyhFTkdJTkVfRl9MT0dfTUVTU0FHRSksCSJMT0dfTUVTU0FHRSJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEVOR0lORV9zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKEVOR0lORV9SX0FMUkVBRFlfTE9BREVEKSAgICAgLCJhbHJlYWR5IGxvYWRlZCJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfQVJHVU1FTlRfSVNfTk9UX0FfTlVNQkVSKSwiYXJndW1lbnQgaXMgbm90IGEgbnVtYmVyIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9DTURfTk9UX0VYRUNVVEFCTEUpICwiY21kIG5vdCBleGVjdXRhYmxlIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9DT01NQU5EX1RBS0VTX0lOUFVUKSwiY29tbWFuZCB0YWtlcyBpbnB1dCJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfQ09NTUFORF9UQUtFU19OT19JTlBVVCksImNvbW1hbmQgdGFrZXMgbm8gaW5wdXQifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0NPTkZMSUNUSU5HX0VOR0lORV9JRCksImNvbmZsaWN0aW5nIGVuZ2luZSBpZCJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfQ1RSTF9DT01NQU5EX05PVF9JTVBMRU1FTlRFRCksImN0cmwgY29tbWFuZCBub3QgaW1wbGVtZW50ZWQifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0RIX05PVF9JTVBMRU1FTlRFRCkgLCJkaCBub3QgaW1wbGVtZW50ZWQifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0RTQV9OT1RfSU1QTEVNRU5URUQpLCJkc2Egbm90IGltcGxlbWVudGVkIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9EU09fRkFJTFVSRSkgICAgICAgICwiRFNPIGZhaWx1cmUifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0RTT19OT1RfRk9VTkQpICAgICAgLCJkc28gbm90IGZvdW5kIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9FTkdJTkVTX1NFQ1RJT05fRVJST1IpLCJlbmdpbmVzIHNlY3Rpb24gZXJyb3IifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0VOR0lORV9DT05GSUdVUkFUSU9OX0VSUk9SKSwiZW5naW5lIGNvbmZpZ3VyYXRpb24gZXJyb3IifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0VOR0lORV9JU19OT1RfSU5fTElTVCksImVuZ2luZSBpcyBub3QgaW4gdGhlIGxpc3QifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0VOR0lORV9TRUNUSU9OX0VSUk9SKSwiZW5naW5lIHNlY3Rpb24gZXJyb3IifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0ZBSUxFRF9MT0FESU5HX1BSSVZBVEVfS0VZKSwiZmFpbGVkIGxvYWRpbmcgcHJpdmF0ZSBrZXkifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0ZBSUxFRF9MT0FESU5HX1BVQkxJQ19LRVkpLCJmYWlsZWQgbG9hZGluZyBwdWJsaWMga2V5In0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9GSU5JU0hfRkFJTEVEKSAgICAgICwiZmluaXNoIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfR0VUX0hBTkRMRV9GQUlMRUQpICAsImNvdWxkIG5vdCBvYnRhaW4gaGFyZHdhcmUgaGFuZGxlIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9JRF9PUl9OQU1FX01JU1NJTkcpICwiJ2lkJyBvciAnbmFtZScgbWlzc2luZyJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfSU5JVF9GQUlMRUQpICAgICAgICAsImluaXQgZmFpbGVkIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9JTlRFUk5BTF9MSVNUX0VSUk9SKSwiaW50ZXJuYWwgbGlzdCBlcnJvciJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfSU5WQUxJRF9BUkdVTUVOVCkgICAsImludmFsaWQgYXJndW1lbnQifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX0lOVkFMSURfQ01EX05BTUUpICAgLCJpbnZhbGlkIGNtZCBuYW1lIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9JTlZBTElEX0NNRF9OVU1CRVIpICwiaW52YWxpZCBjbWQgbnVtYmVyIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9JTlZBTElEX0lOSVRfVkFMVUUpICwiaW52YWxpZCBpbml0IHZhbHVlIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9JTlZBTElEX1NUUklORykgICAgICwiaW52YWxpZCBzdHJpbmcifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX05PVF9JTklUSUFMSVNFRCkgICAgLCJub3QgaW5pdGlhbGlzZWQifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX05PVF9MT0FERUQpICAgICAgICAgLCJub3QgbG9hZGVkIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9OT19DT05UUk9MX0ZVTkNUSU9OKSwibm8gY29udHJvbCBmdW5jdGlvbiJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfTk9fSU5ERVgpICAgICAgICAgICAsIm5vIGluZGV4In0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9OT19MT0FEX0ZVTkNUSU9OKSAgICwibm8gbG9hZCBmdW5jdGlvbiJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfTk9fUkVGRVJFTkNFKSAgICAgICAsIm5vIHJlZmVyZW5jZSJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfTk9fU1VDSF9FTkdJTkUpICAgICAsIm5vIHN1Y2ggZW5naW5lIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9OT19VTkxPQURfRlVOQ1RJT04pICwibm8gdW5sb2FkIGZ1bmN0aW9uIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9QUk9WSURFX1BBUkFNRVRFUlMpICwicHJvdmlkZSBwYXJhbWV0ZXJzIn0sCit7RVJSX1JFQVNPTihFTkdJTkVfUl9SU0FfTk9UX0lNUExFTUVOVEVEKSwicnNhIG5vdCBpbXBsZW1lbnRlZCJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfVU5JTVBMRU1FTlRFRF9DSVBIRVIpLCJ1bmltcGxlbWVudGVkIGNpcGhlciJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfVU5JTVBMRU1FTlRFRF9ESUdFU1QpLCJ1bmltcGxlbWVudGVkIGRpZ2VzdCJ9LAore0VSUl9SRUFTT04oRU5HSU5FX1JfVU5JTVBMRU1FTlRFRF9QVUJMSUNfS0VZX01FVEhPRCksInVuaW1wbGVtZW50ZWQgcHVibGljIGtleSBtZXRob2QifSwKK3tFUlJfUkVBU09OKEVOR0lORV9SX1ZFUlNJT05fSU5DT01QQVRJQklMSVRZKSwidmVyc2lvbiBpbmNvbXBhdGliaWxpdHkifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfRU5HSU5FX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKEVOR0lORV9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxFTkdJTkVfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxFTkdJTkVfc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19mYXQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2ZhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjZlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19mYXQuYwpAQCAtMCwwICsxLDE4MSBAQAorLyogY3J5cHRvL2VuZ2luZS9lbmdfZmF0LmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIEVDREggc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKworI2luY2x1ZGUgImVuZ19pbnQuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKworaW50IEVOR0lORV9zZXRfZGVmYXVsdChFTkdJTkUgKmUsIHVuc2lnbmVkIGludCBmbGFncykKKwl7CisJaWYoKGZsYWdzICYgRU5HSU5FX01FVEhPRF9DSVBIRVJTKSAmJiAhRU5HSU5FX3NldF9kZWZhdWx0X2NpcGhlcnMoZSkpCisJCXJldHVybiAwOworCWlmKChmbGFncyAmIEVOR0lORV9NRVRIT0RfRElHRVNUUykgJiYgIUVOR0lORV9zZXRfZGVmYXVsdF9kaWdlc3RzKGUpKQorCQlyZXR1cm4gMDsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwlpZigoZmxhZ3MgJiBFTkdJTkVfTUVUSE9EX1JTQSkgJiYgIUVOR0lORV9zZXRfZGVmYXVsdF9SU0EoZSkpCisJCXJldHVybiAwOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJaWYoKGZsYWdzICYgRU5HSU5FX01FVEhPRF9EU0EpICYmICFFTkdJTkVfc2V0X2RlZmF1bHRfRFNBKGUpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJaWYoKGZsYWdzICYgRU5HSU5FX01FVEhPRF9ESCkgJiYgIUVOR0lORV9zZXRfZGVmYXVsdF9ESChlKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJaWYoKGZsYWdzICYgRU5HSU5FX01FVEhPRF9FQ0RIKSAmJiAhRU5HSU5FX3NldF9kZWZhdWx0X0VDREgoZSkpCisJCXJldHVybiAwOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwlpZigoZmxhZ3MgJiBFTkdJTkVfTUVUSE9EX0VDRFNBKSAmJiAhRU5HSU5FX3NldF9kZWZhdWx0X0VDRFNBKGUpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCWlmKChmbGFncyAmIEVOR0lORV9NRVRIT0RfUkFORCkgJiYgIUVOR0lORV9zZXRfZGVmYXVsdF9SQU5EKGUpKQorCQlyZXR1cm4gMDsKKwlpZigoZmxhZ3MgJiBFTkdJTkVfTUVUSE9EX1BLRVlfTUVUSFMpCisJCQkJJiYgIUVOR0lORV9zZXRfZGVmYXVsdF9wa2V5X21ldGhzKGUpKQorCQlyZXR1cm4gMDsKKwlpZigoZmxhZ3MgJiBFTkdJTkVfTUVUSE9EX1BLRVlfQVNOMV9NRVRIUykKKwkJCQkmJiAhRU5HSU5FX3NldF9kZWZhdWx0X3BrZXlfYXNuMV9tZXRocyhlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CisJfQorCisvKiBTZXQgZGVmYXVsdCBhbGdvcml0aG1zIHVzaW5nIGEgc3RyaW5nICovCisKK3N0YXRpYyBpbnQgaW50X2RlZl9jYihjb25zdCBjaGFyICphbGcsIGludCBsZW4sIHZvaWQgKmFyZykKKwl7CisJdW5zaWduZWQgaW50ICpwZmxhZ3MgPSBhcmc7CisJaWYgKCFzdHJuY21wKGFsZywgIkFMTCIsIGxlbikpCisJCSpwZmxhZ3MgfD0gRU5HSU5FX01FVEhPRF9BTEw7CisJZWxzZSBpZiAoIXN0cm5jbXAoYWxnLCAiUlNBIiwgbGVuKSkKKwkJKnBmbGFncyB8PSBFTkdJTkVfTUVUSE9EX1JTQTsKKwllbHNlIGlmICghc3RybmNtcChhbGcsICJEU0EiLCBsZW4pKQorCQkqcGZsYWdzIHw9IEVOR0lORV9NRVRIT0RfRFNBOworCWVsc2UgaWYgKCFzdHJuY21wKGFsZywgIkVDREgiLCBsZW4pKQorCQkqcGZsYWdzIHw9IEVOR0lORV9NRVRIT0RfRUNESDsKKwllbHNlIGlmICghc3RybmNtcChhbGcsICJFQ0RTQSIsIGxlbikpCisJCSpwZmxhZ3MgfD0gRU5HSU5FX01FVEhPRF9FQ0RTQTsKKwllbHNlIGlmICghc3RybmNtcChhbGcsICJESCIsIGxlbikpCisJCSpwZmxhZ3MgfD0gRU5HSU5FX01FVEhPRF9ESDsKKwllbHNlIGlmICghc3RybmNtcChhbGcsICJSQU5EIiwgbGVuKSkKKwkJKnBmbGFncyB8PSBFTkdJTkVfTUVUSE9EX1JBTkQ7CisJZWxzZSBpZiAoIXN0cm5jbXAoYWxnLCAiQ0lQSEVSUyIsIGxlbikpCisJCSpwZmxhZ3MgfD0gRU5HSU5FX01FVEhPRF9DSVBIRVJTOworCWVsc2UgaWYgKCFzdHJuY21wKGFsZywgIkRJR0VTVFMiLCBsZW4pKQorCQkqcGZsYWdzIHw9IEVOR0lORV9NRVRIT0RfRElHRVNUUzsKKwllbHNlIGlmICghc3RybmNtcChhbGcsICJQS0VZIiwgbGVuKSkKKwkJKnBmbGFncyB8PQorCQkJRU5HSU5FX01FVEhPRF9QS0VZX01FVEhTfEVOR0lORV9NRVRIT0RfUEtFWV9BU04xX01FVEhTOworCWVsc2UgaWYgKCFzdHJuY21wKGFsZywgIlBLRVlfQ1JZUFRPIiwgbGVuKSkKKwkJKnBmbGFncyB8PSBFTkdJTkVfTUVUSE9EX1BLRVlfTUVUSFM7CisJZWxzZSBpZiAoIXN0cm5jbXAoYWxnLCAiUEtFWV9BU04xIiwgbGVuKSkKKwkJKnBmbGFncyB8PSBFTkdJTkVfTUVUSE9EX1BLRVlfQVNOMV9NRVRIUzsKKwllbHNlCisJCXJldHVybiAwOworCXJldHVybiAxOworCX0KKworCitpbnQgRU5HSU5FX3NldF9kZWZhdWx0X3N0cmluZyhFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmRlZl9saXN0KQorCXsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOworCWlmICghQ09ORl9wYXJzZV9saXN0KGRlZl9saXN0LCAnLCcsIDEsIGludF9kZWZfY2IsICZmbGFncykpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9TRVRfREVGQVVMVF9TVFJJTkcsCisJCQkJCUVOR0lORV9SX0lOVkFMSURfU1RSSU5HKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJzdHI9IixkZWZfbGlzdCk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIEVOR0lORV9zZXRfZGVmYXVsdChlLCBmbGFncyk7CisJfQorCitpbnQgRU5HSU5FX3JlZ2lzdGVyX2NvbXBsZXRlKEVOR0lORSAqZSkKKwl7CisJRU5HSU5FX3JlZ2lzdGVyX2NpcGhlcnMoZSk7CisJRU5HSU5FX3JlZ2lzdGVyX2RpZ2VzdHMoZSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJRU5HSU5FX3JlZ2lzdGVyX1JTQShlKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCUVOR0lORV9yZWdpc3Rlcl9EU0EoZSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCUVOR0lORV9yZWdpc3Rlcl9ESChlKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlFTkdJTkVfcmVnaXN0ZXJfRUNESChlKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDRFNBCisJRU5HSU5FX3JlZ2lzdGVyX0VDRFNBKGUpOworI2VuZGlmCisJRU5HSU5FX3JlZ2lzdGVyX1JBTkQoZSk7CisJRU5HSU5FX3JlZ2lzdGVyX3BrZXlfbWV0aHMoZSk7CisJcmV0dXJuIDE7CisJfQorCitpbnQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9jb21wbGV0ZSh2b2lkKQorCXsKKwlFTkdJTkUgKmU7CisKKwlmb3IoZT1FTkdJTkVfZ2V0X2ZpcnN0KCkgOyBlIDsgZT1FTkdJTkVfZ2V0X25leHQoZSkpCisJCUVOR0lORV9yZWdpc3Rlcl9jb21wbGV0ZShlKTsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19pbml0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzM2NmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2luaXQuYwpAQCAtMCwwICsxLDE1NCBAQAorLyogY3J5cHRvL2VuZ2luZS9lbmdfaW5pdC5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImVuZ19pbnQuaCIKKworLyogSW5pdGlhbGlzZSBhIGVuZ2luZSB0eXBlIGZvciB1c2UgKG9yIHVwIGl0cyBmdW5jdGlvbmFsIHJlZmVyZW5jZSBjb3VudAorICogaWYgaXQncyBhbHJlYWR5IGluIHVzZSkuIFRoaXMgdmVyc2lvbiBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseS4gKi8KK2ludCBlbmdpbmVfdW5sb2NrZWRfaW5pdChFTkdJTkUgKmUpCisJeworCWludCB0b19yZXR1cm4gPSAxOworCisJaWYoKGUtPmZ1bmN0X3JlZiA9PSAwKSAmJiBlLT5pbml0KQorCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBmdW5jdGlvbmFsIHJlZmVyZW5jZSBhbmQgdGhlIGVuZ2luZQorCQkgKiByZXF1aXJlcyBpbml0aWFsaXNhdGlvbiBzbyB3ZSBkbyBpdCBub3cuICovCisJCXRvX3JldHVybiA9IGUtPmluaXQoZSk7CisJaWYodG9fcmV0dXJuKQorCQl7CisJCS8qIE9LLCB3ZSByZXR1cm4gYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSB3aGljaCBpcyBhbHNvIGEKKwkJICogc3RydWN0dXJhbCByZWZlcmVuY2UuICovCisJCWUtPnN0cnVjdF9yZWYrKzsKKwkJZS0+ZnVuY3RfcmVmKys7CisJCWVuZ2luZV9yZWZfZGVidWcoZSwgMCwgMSkKKwkJZW5naW5lX3JlZl9kZWJ1ZyhlLCAxLCAxKQorCQl9CisJcmV0dXJuIHRvX3JldHVybjsKKwl9CisKKy8qIEZyZWUgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSB0byBhIGVuZ2luZSB0eXBlLiBUaGlzIHZlcnNpb24gaXMgb25seSB1c2VkCisgKiBpbnRlcm5hbGx5LiAqLworaW50IGVuZ2luZV91bmxvY2tlZF9maW5pc2goRU5HSU5FICplLCBpbnQgdW5sb2NrX2Zvcl9oYW5kbGVycykKKwl7CisJaW50IHRvX3JldHVybiA9IDE7CisKKwkvKiBSZWR1Y2UgdGhlIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGNvdW50IGhlcmUgc28gaWYgaXQncyB0aGUgdGVybWluYXRpbmcKKwkgKiBjYXNlLCB3ZSBjYW4gcmVsZWFzZSB0aGUgbG9jayBzYWZlbHkgYW5kIGNhbGwgdGhlIGZpbmlzaCgpIGhhbmRsZXIKKwkgKiB3aXRob3V0IHJpc2sgb2YgYSByYWNlLiBXZSBnZXQgYSByYWNlIGlmIHdlIGxlYXZlIHRoZSBjb3VudCB1bnRpbAorCSAqIGFmdGVyIGFuZCBzb21ldGhpbmcgZWxzZSBpcyBjYWxsaW5nICJmaW5pc2giIGF0IHRoZSBzYW1lIHRpbWUgLQorCSAqIHRoZXJlJ3MgYSBjaGFuY2UgdGhhdCBib3RoIHRocmVhZHMgd2lsbCB0b2dldGhlciB0YWtlIHRoZSBjb3VudCBmcm9tCisJICogMiB0byAwIHdpdGhvdXQgZWl0aGVyIGNhbGxpbmcgZmluaXNoKCkuICovCisJZS0+ZnVuY3RfcmVmLS07CisJZW5naW5lX3JlZl9kZWJ1ZyhlLCAxLCAtMSk7CisJaWYoKGUtPmZ1bmN0X3JlZiA9PSAwKSAmJiBlLT5maW5pc2gpCisJCXsKKwkJaWYodW5sb2NrX2Zvcl9oYW5kbGVycykKKwkJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FTkdJTkUpOworCQl0b19yZXR1cm4gPSBlLT5maW5pc2goZSk7CisJCWlmKHVubG9ja19mb3JfaGFuZGxlcnMpCisJCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJCWlmKCF0b19yZXR1cm4pCisJCQlyZXR1cm4gMDsKKwkJfQorI2lmZGVmIFJFRl9DSEVDSworCWlmKGUtPmZ1bmN0X3JlZiA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIkVOR0lORV9maW5pc2gsIGJhZCBmdW5jdGlvbmFsIHJlZmVyZW5jZSBjb3VudFxuIik7CisJCWFib3J0KCk7CisJCX0KKyNlbmRpZgorCS8qIFJlbGVhc2UgdGhlIHN0cnVjdHVyYWwgcmVmZXJlbmNlIHRvbyAqLworCWlmKCFlbmdpbmVfZnJlZV91dGlsKGUsIDApKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfVU5MT0NLRURfRklOSVNILEVOR0lORV9SX0ZJTklTSF9GQUlMRUQpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiB0b19yZXR1cm47CisJfQorCisvKiBUaGUgQVBJIChsb2NrZWQpIHZlcnNpb24gb2YgImluaXQiICovCitpbnQgRU5HSU5FX2luaXQoRU5HSU5FICplKQorCXsKKwlpbnQgcmV0OworCWlmKGUgPT0gTlVMTCkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0lOSVQsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJcmV0ID0gZW5naW5lX3VubG9ja2VkX2luaXQoZSk7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIFRoZSBBUEkgKGxvY2tlZCkgdmVyc2lvbiBvZiAiZmluaXNoIiAqLworaW50IEVOR0lORV9maW5pc2goRU5HSU5FICplKQorCXsKKwlpbnQgdG9fcmV0dXJuID0gMTsKKworCWlmKGUgPT0gTlVMTCkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0ZJTklTSCxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwl0b19yZXR1cm4gPSBlbmdpbmVfdW5sb2NrZWRfZmluaXNoKGUsIDEpOworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FTkdJTkUpOworCWlmKCF0b19yZXR1cm4pCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9GSU5JU0gsRU5HSU5FX1JfRklOSVNIX0ZBSUxFRCk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIHRvX3JldHVybjsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19pbnQuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2ludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MWVmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19pbnQuaApAQCAtMCwwICsxLDIwNiBAQAorLyogY3J5cHRvL2VuZ2luZS9lbmdfaW50LmggKi8KKy8qIFdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIChnZW9mZkBnZW9mZnRob3JwZS5uZXQpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBFQ0RIIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisKKyNpZm5kZWYgSEVBREVSX0VOR0lORV9JTlRfSAorI2RlZmluZSBIRUFERVJfRU5HSU5FX0lOVF9ICisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorLyogVGFrZSBwdWJsaWMgZGVmaW5pdGlvbnMgZnJvbSBlbmdpbmUuaCAqLworI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIElmIHdlIGNvbXBpbGUgd2l0aCB0aGlzIHN5bWJvbCBkZWZpbmVkLCB0aGVuIGJvdGggcmVmZXJlbmNlIGNvdW50cyBpbiB0aGUKKyAqIEVOR0lORSBzdHJ1Y3R1cmUgd2lsbCBiZSBtb25pdG9yZWQgd2l0aCBhIGxpbmUgb2Ygb3V0cHV0IG9uIHN0ZGVyciBmb3IgZWFjaAorICogY2hhbmdlLiBUaGlzIHByaW50cyB0aGUgZW5naW5lJ3MgcG9pbnRlciBhZGRyZXNzICh0cnVuY2F0ZWQgdG8gdW5zaWduZWQgaW50KSwKKyAqICJzdHJ1Y3QiIG9yICJmdW5jdCIgdG8gaW5kaWNhdGUgdGhlIHJlZmVyZW5jZSB0eXBlLCB0aGUgYmVmb3JlIGFuZCBhZnRlcgorICogcmVmZXJlbmNlIGNvdW50LCBhbmQgdGhlIGZpbGU6bGluZS1udW1iZXIgcGFpci4gVGhlICJlbmdpbmVfcmVmX2RlYnVnIgorICogc3RhdGVtZW50cyBtdXN0IGNvbWUgKmFmdGVyKiB0aGUgY2hhbmdlLiAqLworI2lmZGVmIEVOR0lORV9SRUZfQ09VTlRfREVCVUcKKworI2RlZmluZSBlbmdpbmVfcmVmX2RlYnVnKGUsIGlzZnVuY3QsIGRpZmYpIFwKKwlmcHJpbnRmKHN0ZGVyciwgImVuZ2luZTogJTA4eCAlcyBmcm9tICVkIHRvICVkICglczolZClcbiIsIFwKKwkJKHVuc2lnbmVkIGludCkoZSksIChpc2Z1bmN0ID8gImZ1bmN0IiA6ICJzdHJ1Y3QiKSwgXAorCQkoKGlzZnVuY3QpID8gKChlKS0+ZnVuY3RfcmVmIC0gKGRpZmYpKSA6ICgoZSktPnN0cnVjdF9yZWYgLSAoZGlmZikpKSwgXAorCQkoKGlzZnVuY3QpID8gKGUpLT5mdW5jdF9yZWYgOiAoZSktPnN0cnVjdF9yZWYpLCBcCisJCShfX0ZJTEVfXyksIChfX0xJTkVfXykpOworCisjZWxzZQorCisjZGVmaW5lIGVuZ2luZV9yZWZfZGVidWcoZSwgaXNmdW5jdCwgZGlmZikKKworI2VuZGlmCisKKy8qIEFueSBjb2RlIHRoYXQgd2lsbCBuZWVkIGNsZWFudXAgb3BlcmF0aW9ucyBzaG91bGQgdXNlIHRoZXNlIGZ1bmN0aW9ucyB0bworICogcmVnaXN0ZXIgY2FsbGJhY2tzLiBFTkdJTkVfY2xlYW51cCgpIHdpbGwgY2FsbCBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MgaW4KKyAqIG9yZGVyLiBOQjogYm90aCB0aGUgImFkZCIgZnVuY3Rpb25zIGFzc3VtZSBDUllQVE9fTE9DS19FTkdJTkUgdG8gYWxyZWFkeSBiZQorICogaGVsZCAoaW4gIndyaXRlIiBtb2RlKS4gKi8KK3R5cGVkZWYgdm9pZCAoRU5HSU5FX0NMRUFOVVBfQ0IpKHZvaWQpOwordHlwZWRlZiBzdHJ1Y3Qgc3RfZW5naW5lX2NsZWFudXBfaXRlbQorCXsKKwlFTkdJTkVfQ0xFQU5VUF9DQiAqY2I7CisJfSBFTkdJTkVfQ0xFQU5VUF9JVEVNOworREVDTEFSRV9TVEFDS19PRihFTkdJTkVfQ0xFQU5VUF9JVEVNKQordm9pZCBlbmdpbmVfY2xlYW51cF9hZGRfZmlyc3QoRU5HSU5FX0NMRUFOVVBfQ0IgKmNiKTsKK3ZvaWQgZW5naW5lX2NsZWFudXBfYWRkX2xhc3QoRU5HSU5FX0NMRUFOVVBfQ0IgKmNiKTsKKworLyogV2UgbmVlZCBzdGFja3Mgb2YgRU5HSU5FcyBmb3IgdXNlIGluIGVuZ190YWJsZS5jICovCitERUNMQVJFX1NUQUNLX09GKEVOR0lORSkKKworLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCB0aGVuIGVuZ2luZV90YWJsZV9zZWxlY3QoKSwgdGhlIGZ1bmN0aW9uIHRoYXQgaXMKKyAqIHVzZWQgYnkgUlNBLCBEU0EgKGV0YykgY29kZSB0byBzZWxlY3QgcmVnaXN0ZXJlZCBFTkdJTkVzLCBjYWNoZSBkZWZhdWx0cyBhbmQKKyAqIGZ1bmN0aW9uYWwgcmVmZXJlbmNlcyAoZXRjKSwgd2lsbCBkaXNwbGF5IGRlYnVnZ2luZyBzdW1tYXJpZXMgdG8gc3RkZXJyLiAqLworLyogI2RlZmluZSBFTkdJTkVfVEFCTEVfREVCVUcgKi8KKworLyogVGhpcyByZXByZXNlbnRzIGFuIGltcGxlbWVudGF0aW9uIHRhYmxlLiBEZXBlbmRlbnQgY29kZSBzaG91bGQgaW5zdGFudGlhdGUgaXQKKyAqIGFzIGEgKEVOR0lORV9UQUJMRSAqKSBwb2ludGVyIHZhbHVlIHNldCBpbml0aWFsbHkgdG8gTlVMTC4gKi8KK3R5cGVkZWYgc3RydWN0IHN0X2VuZ2luZV90YWJsZSBFTkdJTkVfVEFCTEU7CitpbnQgZW5naW5lX3RhYmxlX3JlZ2lzdGVyKEVOR0lORV9UQUJMRSAqKnRhYmxlLCBFTkdJTkVfQ0xFQU5VUF9DQiAqY2xlYW51cCwKKwkJRU5HSU5FICplLCBjb25zdCBpbnQgKm5pZHMsIGludCBudW1fbmlkcywgaW50IHNldGRlZmF1bHQpOwordm9pZCBlbmdpbmVfdGFibGVfdW5yZWdpc3RlcihFTkdJTkVfVEFCTEUgKip0YWJsZSwgRU5HSU5FICplKTsKK3ZvaWQgZW5naW5lX3RhYmxlX2NsZWFudXAoRU5HSU5FX1RBQkxFICoqdGFibGUpOworI2lmbmRlZiBFTkdJTkVfVEFCTEVfREVCVUcKK0VOR0lORSAqZW5naW5lX3RhYmxlX3NlbGVjdChFTkdJTkVfVEFCTEUgKip0YWJsZSwgaW50IG5pZCk7CisjZWxzZQorRU5HSU5FICplbmdpbmVfdGFibGVfc2VsZWN0X3RtcChFTkdJTkVfVEFCTEUgKip0YWJsZSwgaW50IG5pZCwgY29uc3QgY2hhciAqZiwgaW50IGwpOworI2RlZmluZSBlbmdpbmVfdGFibGVfc2VsZWN0KHQsbikgZW5naW5lX3RhYmxlX3NlbGVjdF90bXAodCxuLF9fRklMRV9fLF9fTElORV9fKQorI2VuZGlmCit0eXBlZGVmIHZvaWQgKGVuZ2luZV90YWJsZV9kb2FsbF9jYikoaW50IG5pZCwgU1RBQ0tfT0YoRU5HSU5FKSAqc2ssIEVOR0lORSAqZGVmLCB2b2lkICphcmcpOwordm9pZCBlbmdpbmVfdGFibGVfZG9hbGwoRU5HSU5FX1RBQkxFICp0YWJsZSwgZW5naW5lX3RhYmxlX2RvYWxsX2NiICpjYiwgdm9pZCAqYXJnKTsKKworLyogSW50ZXJuYWwgdmVyc2lvbnMgb2YgQVBJIGZ1bmN0aW9ucyB0aGF0IGhhdmUgY29udHJvbCBvdmVyIGxvY2tpbmcuIFRoZXNlIGFyZQorICogdXNlZCBiZXR3ZWVuIEMgZmlsZXMgd2hlbiBmdW5jdGlvbmFsaXR5IG5lZWRzIHRvIGJlIHNoYXJlZCBidXQgdGhlIGNhbGxlciBtYXkKKyAqIGFscmVhZHkgYmUgY29udHJvbGxpbmcgb2YgdGhlIENSWVBUT19MT0NLX0VOR0lORSBsb2NrLiAqLworaW50IGVuZ2luZV91bmxvY2tlZF9pbml0KEVOR0lORSAqZSk7CitpbnQgZW5naW5lX3VubG9ja2VkX2ZpbmlzaChFTkdJTkUgKmUsIGludCB1bmxvY2tfZm9yX2hhbmRsZXJzKTsKK2ludCBlbmdpbmVfZnJlZV91dGlsKEVOR0lORSAqZSwgaW50IGxvY2tlZCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCBhbGwgInNldCJhYmxlIHZhbHVlcyBpbiBhbiBFTkdJTkUgdG8gTlVMTC4gVGhpcworICogd29uJ3QgdG91Y2ggcmVmZXJlbmNlIGNvdW50cyBvciBleF9kYXRhLCBidXQgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGFsbCB0aGUKKyAqIEVOR0lORV9zZXRfKioqKCkgZnVuY3Rpb25zIHdpdGggYSBOVUxMIHZhbHVlLiAqLwordm9pZCBlbmdpbmVfc2V0X2FsbF9udWxsKEVOR0lORSAqZSk7CisKKy8qIE5COiBCaXR3aXNlIE9SLWFibGUgdmFsdWVzIGZvciB0aGUgImZsYWdzIiB2YXJpYWJsZSBpbiBFTkdJTkUgYXJlIG5vdyBleHBvc2VkCisgKiBpbiBlbmdpbmUuaC4gKi8KKworLyogRnJlZSB1cCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgcHVibGljIGtleSBtZXRob2RzIGFzc29jaWF0ZWQgd2l0aCBFTkdJTkUgKi8KKwordm9pZCBlbmdpbmVfcGtleV9tZXRoc19mcmVlKEVOR0lORSAqZSk7Cit2b2lkIGVuZ2luZV9wa2V5X2FzbjFfbWV0aHNfZnJlZShFTkdJTkUgKmUpOworCisvKiBUaGlzIGlzIGEgc3RydWN0dXJlIGZvciBzdG9yaW5nIGltcGxlbWVudGF0aW9ucyBvZiB2YXJpb3VzIGNyeXB0bworICogYWxnb3JpdGhtcyBhbmQgZnVuY3Rpb25zLiAqLworc3RydWN0IGVuZ2luZV9zdAorCXsKKwljb25zdCBjaGFyICppZDsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IFJTQV9NRVRIT0QgKnJzYV9tZXRoOworCWNvbnN0IERTQV9NRVRIT0QgKmRzYV9tZXRoOworCWNvbnN0IERIX01FVEhPRCAqZGhfbWV0aDsKKwljb25zdCBFQ0RIX01FVEhPRCAqZWNkaF9tZXRoOworCWNvbnN0IEVDRFNBX01FVEhPRCAqZWNkc2FfbWV0aDsKKwljb25zdCBSQU5EX01FVEhPRCAqcmFuZF9tZXRoOworCWNvbnN0IFNUT1JFX01FVEhPRCAqc3RvcmVfbWV0aDsKKwkvKiBDaXBoZXIgaGFuZGxpbmcgaXMgdmlhIHRoaXMgY2FsbGJhY2sgKi8KKwlFTkdJTkVfQ0lQSEVSU19QVFIgY2lwaGVyczsKKwkvKiBEaWdlc3QgaGFuZGxpbmcgaXMgdmlhIHRoaXMgY2FsbGJhY2sgKi8KKwlFTkdJTkVfRElHRVNUU19QVFIgZGlnZXN0czsKKwkvKiBQdWJsaWMga2V5IGhhbmRsaW5nIHZpYSB0aGlzIGNhbGxiYWNrICovCisJRU5HSU5FX1BLRVlfTUVUSFNfUFRSIHBrZXlfbWV0aHM7CisJLyogQVNOMSBwdWJsaWMga2V5IGhhbmRsaW5nIHZpYSB0aGlzIGNhbGxiYWNrICovCisJRU5HSU5FX1BLRVlfQVNOMV9NRVRIU19QVFIgcGtleV9hc24xX21ldGhzOworCisJRU5HSU5FX0dFTl9JTlRfRlVOQ19QVFIJZGVzdHJveTsKKworCUVOR0lORV9HRU5fSU5UX0ZVTkNfUFRSIGluaXQ7CisJRU5HSU5FX0dFTl9JTlRfRlVOQ19QVFIgZmluaXNoOworCUVOR0lORV9DVFJMX0ZVTkNfUFRSIGN0cmw7CisJRU5HSU5FX0xPQURfS0VZX1BUUiBsb2FkX3ByaXZrZXk7CisJRU5HSU5FX0xPQURfS0VZX1BUUiBsb2FkX3B1YmtleTsKKworCUVOR0lORV9TU0xfQ0xJRU5UX0NFUlRfUFRSIGxvYWRfc3NsX2NsaWVudF9jZXJ0OworCisJY29uc3QgRU5HSU5FX0NNRF9ERUZOICpjbWRfZGVmbnM7CisJaW50IGZsYWdzOworCS8qIHJlZmVyZW5jZSBjb3VudCBvbiB0aGUgc3RydWN0dXJlIGl0c2VsZiAqLworCWludCBzdHJ1Y3RfcmVmOworCS8qIHJlZmVyZW5jZSBjb3VudCBvbiB1c2FiaWxpdHkgb2YgdGhlIGVuZ2luZSB0eXBlLiBOQjogVGhpcworCSAqIGNvbnRyb2xzIHRoZSBsb2FkaW5nIGFuZCBpbml0aWFsaXNhdGlvbiBvZiBhbnkgZnVuY3Rpb25saXR5CisJICogcmVxdWlyZWQgYnkgdGhpcyBlbmdpbmUsIHdoZXJlYXMgdGhlIHByZXZpb3VzIGNvdW50IGlzCisJICogc2ltcGx5IHRvIGNvcGUgd2l0aCAoZGUpYWxsb2NhdGlvbiBvZiB0aGlzIHN0cnVjdHVyZS4gSGVuY2UsCisJICogcnVubmluZ19yZWYgPD0gc3RydWN0X3JlZiBhdCBhbGwgdGltZXMuICovCisJaW50IGZ1bmN0X3JlZjsKKwkvKiBBIHBsYWNlIHRvIHN0b3JlIHBlci1FTkdJTkUgZGF0YSAqLworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisJLyogVXNlZCB0byBtYWludGFpbiB0aGUgbGlua2VkLWxpc3Qgb2YgZW5naW5lcy4gKi8KKwlzdHJ1Y3QgZW5naW5lX3N0ICpwcmV2OworCXN0cnVjdCBlbmdpbmVfc3QgKm5leHQ7CisJfTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBIRUFERVJfRU5HSU5FX0lOVF9IICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTY2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19saWIuYwpAQCAtMCwwICsxLDMzMiBAQAorLyogY3J5cHRvL2VuZ2luZS9lbmdfbGliLmMgKi8KKy8qIFdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIChnZW9mZkBnZW9mZnRob3JwZS5uZXQpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImVuZ19pbnQuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworLyogVGhlICJuZXciLyJmcmVlIiBzdHVmZiBmaXJzdCAqLworCitFTkdJTkUgKkVOR0lORV9uZXcodm9pZCkKKwl7CisJRU5HSU5FICpyZXQ7CisKKwlyZXQgPSAoRU5HSU5FICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVOR0lORSkpOworCWlmKHJldCA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfTkVXLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJbWVtc2V0KHJldCwgMCwgc2l6ZW9mKEVOR0lORSkpOworCXJldC0+c3RydWN0X3JlZiA9IDE7CisJZW5naW5lX3JlZl9kZWJ1ZyhyZXQsIDAsIDEpCisJQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9FTkdJTkUsIHJldCwgJnJldC0+ZXhfZGF0YSk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIFBsYWNlZCBoZXJlIChjbG9zZSBwcm94aW1pdHkgdG8gRU5HSU5FX25ldykgc28gdGhhdCBtb2RpZmljYXRpb25zIHRvIHRoZQorICogZWxlbWVudHMgb2YgdGhlIEVOR0lORSBzdHJ1Y3R1cmUgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGNhdWdodCBhbmQgY2hhbmdlZAorICogaGVyZS4gKi8KK3ZvaWQgZW5naW5lX3NldF9hbGxfbnVsbChFTkdJTkUgKmUpCisJeworCWUtPmlkID0gTlVMTDsKKwllLT5uYW1lID0gTlVMTDsKKwllLT5yc2FfbWV0aCA9IE5VTEw7CisJZS0+ZHNhX21ldGggPSBOVUxMOworCWUtPmRoX21ldGggPSBOVUxMOworCWUtPnJhbmRfbWV0aCA9IE5VTEw7CisJZS0+c3RvcmVfbWV0aCA9IE5VTEw7CisJZS0+Y2lwaGVycyA9IE5VTEw7CisJZS0+ZGlnZXN0cyA9IE5VTEw7CisJZS0+ZGVzdHJveSA9IE5VTEw7CisJZS0+aW5pdCA9IE5VTEw7CisJZS0+ZmluaXNoID0gTlVMTDsKKwllLT5jdHJsID0gTlVMTDsKKwllLT5sb2FkX3ByaXZrZXkgPSBOVUxMOworCWUtPmxvYWRfcHVia2V5ID0gTlVMTDsKKwllLT5jbWRfZGVmbnMgPSBOVUxMOworCWUtPmZsYWdzID0gMDsKKwl9CisKK2ludCBlbmdpbmVfZnJlZV91dGlsKEVOR0lORSAqZSwgaW50IGxvY2tlZCkKKwl7CisJaW50IGk7CisKKwlpZihlID09IE5VTEwpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9GUkVFX1VUSUwsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmKGxvY2tlZCkKKwkJaSA9IENSWVBUT19hZGQoJmUtPnN0cnVjdF9yZWYsLTEsQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwllbHNlCisJCWkgPSAtLWUtPnN0cnVjdF9yZWY7CisJZW5naW5lX3JlZl9kZWJ1ZyhlLCAwLCAtMSkKKwlpZiAoaSA+IDApIHJldHVybiAxOworI2lmZGVmIFJFRl9DSEVDSworCWlmIChpIDwgMCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiRU5HSU5FX2ZyZWUsIGJhZCBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSBjb3VudFxuIik7CisJCWFib3J0KCk7CisJCX0KKyNlbmRpZgorCS8qIEZyZWUgdXAgYW55IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwdWJsaWMga2V5IG1ldGhvZHMgKi8KKwllbmdpbmVfcGtleV9tZXRoc19mcmVlKGUpOworCWVuZ2luZV9wa2V5X2FzbjFfbWV0aHNfZnJlZShlKTsKKwkvKiBHaXZlIHRoZSBFTkdJTkUgYSBjaGFuY2UgdG8gZG8gYW55IHN0cnVjdHVyYWwgY2xlYW51cCBjb3JyZXNwb25kaW5nCisJICogdG8gYWxsb2NhdGlvbiBpdCBkaWQgaW4gaXRzIGNvbnN0cnVjdG9yIChlZy4gdW5sb2FkIGVycm9yIHN0cmluZ3MpICovCisJaWYoZS0+ZGVzdHJveSkKKwkJZS0+ZGVzdHJveShlKTsKKwlDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9FTkdJTkUsIGUsICZlLT5leF9kYXRhKTsKKwlPUEVOU1NMX2ZyZWUoZSk7CisJcmV0dXJuIDE7CisJfQorCitpbnQgRU5HSU5FX2ZyZWUoRU5HSU5FICplKQorCXsKKwlyZXR1cm4gZW5naW5lX2ZyZWVfdXRpbChlLCAxKTsKKwl9CisKKy8qIENsZWFudXAgc3R1ZmYgKi8KKworLyogRU5HSU5FX2NsZWFudXAoKSBpcyBjb2RlZCBzdWNoIHRoYXQgYW55dGhpbmcgdGhhdCBkb2VzIHdvcmsgdGhhdCB3aWxsIG5lZWQKKyAqIGNsZWFudXAgY2FuIHJlZ2lzdGVyIGEgImNsZWFudXAiIGNhbGxiYWNrIGhlcmUuIFRoYXQgd2F5IHdlIGRvbid0IGdldCBsaW5rZXIKKyAqIGJsb2F0IGJ5IHJlZmVycmluZyB0byBhbGwgKnBvc3NpYmxlKiBjbGVhbnVwcywgYnV0IGFueSBsaW5rZXIgYmxvYXQgaW50byBjb2RlCisgKiAiWCIgd2lsbCBjYXVzZSBYJ3MgY2xlYW51cCBmdW5jdGlvbiB0byBlbmQgdXAgaGVyZS4gKi8KK3N0YXRpYyBTVEFDS19PRihFTkdJTkVfQ0xFQU5VUF9JVEVNKSAqY2xlYW51cF9zdGFjayA9IE5VTEw7CitzdGF0aWMgaW50IGludF9jbGVhbnVwX2NoZWNrKGludCBjcmVhdGUpCisJeworCWlmKGNsZWFudXBfc3RhY2spIHJldHVybiAxOworCWlmKCFjcmVhdGUpIHJldHVybiAwOworCWNsZWFudXBfc3RhY2sgPSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX25ld19udWxsKCk7CisJcmV0dXJuIChjbGVhbnVwX3N0YWNrID8gMSA6IDApOworCX0KK3N0YXRpYyBFTkdJTkVfQ0xFQU5VUF9JVEVNICppbnRfY2xlYW51cF9pdGVtKEVOR0lORV9DTEVBTlVQX0NCICpjYikKKwl7CisJRU5HSU5FX0NMRUFOVVBfSVRFTSAqaXRlbSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZigKKwkJCQkJRU5HSU5FX0NMRUFOVVBfSVRFTSkpOworCWlmKCFpdGVtKSByZXR1cm4gTlVMTDsKKwlpdGVtLT5jYiA9IGNiOworCXJldHVybiBpdGVtOworCX0KK3ZvaWQgZW5naW5lX2NsZWFudXBfYWRkX2ZpcnN0KEVOR0lORV9DTEVBTlVQX0NCICpjYikKKwl7CisJRU5HSU5FX0NMRUFOVVBfSVRFTSAqaXRlbTsKKwlpZighaW50X2NsZWFudXBfY2hlY2soMSkpIHJldHVybjsKKwlpdGVtID0gaW50X2NsZWFudXBfaXRlbShjYik7CisJaWYoaXRlbSkKKwkJc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9pbnNlcnQoY2xlYW51cF9zdGFjaywgaXRlbSwgMCk7CisJfQordm9pZCBlbmdpbmVfY2xlYW51cF9hZGRfbGFzdChFTkdJTkVfQ0xFQU5VUF9DQiAqY2IpCisJeworCUVOR0lORV9DTEVBTlVQX0lURU0gKml0ZW07CisJaWYoIWludF9jbGVhbnVwX2NoZWNrKDEpKSByZXR1cm47CisJaXRlbSA9IGludF9jbGVhbnVwX2l0ZW0oY2IpOworCWlmKGl0ZW0pCisJCXNrX0VOR0lORV9DTEVBTlVQX0lURU1fcHVzaChjbGVhbnVwX3N0YWNrLCBpdGVtKTsKKwl9CisvKiBUaGUgQVBJIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYWxsIGNsZWFudXAgKi8KK3N0YXRpYyB2b2lkIGVuZ2luZV9jbGVhbnVwX2NiX2ZyZWUoRU5HSU5FX0NMRUFOVVBfSVRFTSAqaXRlbSkKKwl7CisJKCooaXRlbS0+Y2IpKSgpOworCU9QRU5TU0xfZnJlZShpdGVtKTsKKwl9Cit2b2lkIEVOR0lORV9jbGVhbnVwKHZvaWQpCisJeworCWlmKGludF9jbGVhbnVwX2NoZWNrKDApKQorCQl7CisJCXNrX0VOR0lORV9DTEVBTlVQX0lURU1fcG9wX2ZyZWUoY2xlYW51cF9zdGFjaywKKwkJCWVuZ2luZV9jbGVhbnVwX2NiX2ZyZWUpOworCQljbGVhbnVwX3N0YWNrID0gTlVMTDsKKwkJfQorCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBoYW5kbGVkIChzb21laG93KSB0aHJvdWdoIFJBTkQsIGVnLiBieSBpdAorCSAqIHJlZ2lzdGVyaW5nIGEgY2xlYW51cCBjYWxsYmFjay4gKi8KKwlSQU5EX3NldF9yYW5kX21ldGhvZChOVUxMKTsKKwl9CisKKy8qIE5vdyB0aGUgImV4X2RhdGEiIHN1cHBvcnQgKi8KKworaW50IEVOR0lORV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJCUNSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKQorCXsKKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX0VOR0lORSwgYXJnbCwgYXJncCwKKwkJCW5ld19mdW5jLCBkdXBfZnVuYywgZnJlZV9mdW5jKTsKKwl9CisKK2ludCBFTkdJTkVfc2V0X2V4X2RhdGEoRU5HSU5FICplLCBpbnQgaWR4LCB2b2lkICphcmcpCisJeworCXJldHVybihDUllQVE9fc2V0X2V4X2RhdGEoJmUtPmV4X2RhdGEsIGlkeCwgYXJnKSk7CisJfQorCit2b2lkICpFTkdJTkVfZ2V0X2V4X2RhdGEoY29uc3QgRU5HSU5FICplLCBpbnQgaWR4KQorCXsKKwlyZXR1cm4oQ1JZUFRPX2dldF9leF9kYXRhKCZlLT5leF9kYXRhLCBpZHgpKTsKKwl9CisKKy8qIEZ1bmN0aW9ucyB0byBnZXQvc2V0IGFuIEVOR0lORSdzIGVsZW1lbnRzIC0gbWFpbmx5IHRvIGF2b2lkIGV4cG9zaW5nIHRoZQorICogRU5HSU5FIHN0cnVjdHVyZSBpdHNlbGYuICovCisKK2ludCBFTkdJTkVfc2V0X2lkKEVOR0lORSAqZSwgY29uc3QgY2hhciAqaWQpCisJeworCWlmKGlkID09IE5VTEwpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9TRVRfSUQsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCWUtPmlkID0gaWQ7CisJcmV0dXJuIDE7CisJfQorCitpbnQgRU5HSU5FX3NldF9uYW1lKEVOR0lORSAqZSwgY29uc3QgY2hhciAqbmFtZSkKKwl7CisJaWYobmFtZSA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfU0VUX05BTUUsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCWUtPm5hbWUgPSBuYW1lOworCXJldHVybiAxOworCX0KKworaW50IEVOR0lORV9zZXRfZGVzdHJveV9mdW5jdGlvbihFTkdJTkUgKmUsIEVOR0lORV9HRU5fSU5UX0ZVTkNfUFRSIGRlc3Ryb3lfZikKKwl7CisJZS0+ZGVzdHJveSA9IGRlc3Ryb3lfZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBFTkdJTkVfc2V0X2luaXRfZnVuY3Rpb24oRU5HSU5FICplLCBFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUiBpbml0X2YpCisJeworCWUtPmluaXQgPSBpbml0X2Y7CisJcmV0dXJuIDE7CisJfQorCitpbnQgRU5HSU5FX3NldF9maW5pc2hfZnVuY3Rpb24oRU5HSU5FICplLCBFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUiBmaW5pc2hfZikKKwl7CisJZS0+ZmluaXNoID0gZmluaXNoX2Y7CisJcmV0dXJuIDE7CisJfQorCitpbnQgRU5HSU5FX3NldF9jdHJsX2Z1bmN0aW9uKEVOR0lORSAqZSwgRU5HSU5FX0NUUkxfRlVOQ19QVFIgY3RybF9mKQorCXsKKwllLT5jdHJsID0gY3RybF9mOworCXJldHVybiAxOworCX0KKworaW50IEVOR0lORV9zZXRfZmxhZ3MoRU5HSU5FICplLCBpbnQgZmxhZ3MpCisJeworCWUtPmZsYWdzID0gZmxhZ3M7CisJcmV0dXJuIDE7CisJfQorCitpbnQgRU5HSU5FX3NldF9jbWRfZGVmbnMoRU5HSU5FICplLCBjb25zdCBFTkdJTkVfQ01EX0RFRk4gKmRlZm5zKQorCXsKKwllLT5jbWRfZGVmbnMgPSBkZWZuczsKKwlyZXR1cm4gMTsKKwl9CisKK2NvbnN0IGNoYXIgKkVOR0lORV9nZXRfaWQoY29uc3QgRU5HSU5FICplKQorCXsKKwlyZXR1cm4gZS0+aWQ7CisJfQorCitjb25zdCBjaGFyICpFTkdJTkVfZ2V0X25hbWUoY29uc3QgRU5HSU5FICplKQorCXsKKwlyZXR1cm4gZS0+bmFtZTsKKwl9CisKK0VOR0lORV9HRU5fSU5UX0ZVTkNfUFRSIEVOR0lORV9nZXRfZGVzdHJveV9mdW5jdGlvbihjb25zdCBFTkdJTkUgKmUpCisJeworCXJldHVybiBlLT5kZXN0cm95OworCX0KKworRU5HSU5FX0dFTl9JTlRfRlVOQ19QVFIgRU5HSU5FX2dldF9pbml0X2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSkKKwl7CisJcmV0dXJuIGUtPmluaXQ7CisJfQorCitFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUiBFTkdJTkVfZ2V0X2ZpbmlzaF9mdW5jdGlvbihjb25zdCBFTkdJTkUgKmUpCisJeworCXJldHVybiBlLT5maW5pc2g7CisJfQorCitFTkdJTkVfQ1RSTF9GVU5DX1BUUiBFTkdJTkVfZ2V0X2N0cmxfZnVuY3Rpb24oY29uc3QgRU5HSU5FICplKQorCXsKKwlyZXR1cm4gZS0+Y3RybDsKKwl9CisKK2ludCBFTkdJTkVfZ2V0X2ZsYWdzKGNvbnN0IEVOR0lORSAqZSkKKwl7CisJcmV0dXJuIGUtPmZsYWdzOworCX0KKworY29uc3QgRU5HSU5FX0NNRF9ERUZOICpFTkdJTkVfZ2V0X2NtZF9kZWZucyhjb25zdCBFTkdJTkUgKmUpCisJeworCXJldHVybiBlLT5jbWRfZGVmbnM7CisJfQorCisvKiBlbmdfbGliLm8gaXMgcHJldHR5IG11Y2ggbGlua2VkIGludG8gYW55dGhpbmcgdGhhdCB0b3VjaGVzIEVOR0lORSBhbHJlYWR5LCBzbworICogcHV0IHRoZSAic3RhdGljX3N0YXRlIiBoYWNrIGhlcmUuICovCisKK3N0YXRpYyBpbnQgaW50ZXJuYWxfc3RhdGljX2hhY2sgPSAwOworCit2b2lkICpFTkdJTkVfZ2V0X3N0YXRpY19zdGF0ZSh2b2lkKQorCXsKKwlyZXR1cm4gJmludGVybmFsX3N0YXRpY19oYWNrOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2xpc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzg0NmVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfbGlzdC5jCkBAIC0wLDAgKzEsNDMzIEBACisvKiBjcnlwdG8vZW5naW5lL2VuZ19saXN0LmMgKi8KKy8qIFdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIChnZW9mZkBnZW9mZnRob3JwZS5uZXQpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBFQ0RIIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisKKyNpbmNsdWRlICJlbmdfaW50LmgiCisKKy8qIFRoZSBsaW5rZWQtbGlzdCBvZiBwb2ludGVycyB0byBlbmdpbmUgdHlwZXMuIGVuZ2luZV9saXN0X2hlYWQKKyAqIGluY29ycG9yYXRlcyBhbiBpbXBsaWNpdCBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSBidXQgZW5naW5lX2xpc3RfdGFpbAorICogZG9lcyBub3QgLSB0aGUgbGF0dGVyIGlzIGEgY29tcHV0YXRpb25hbCBuaWNlaXR5IGFuZCBvbmx5IHBvaW50cworICogdG8gc29tZXRoaW5nIHRoYXQgaXMgYWxyZWFkeSBwb2ludGVkIHRvIGJ5IGl0cyBwcmVkZWNlc3NvciBpbiB0aGUKKyAqIGxpc3QgKG9yIGVuZ2luZV9saXN0X2hlYWQgaXRzZWxmKS4gSW4gdGhlIHNhbWUgd2F5LCB0aGUgdXNlIG9mIHRoZQorICogInByZXYiIHBvaW50ZXIgaW4gZWFjaCBFTkdJTkUgaXMgdG8gc2F2ZSBleGNlc3NpdmUgbGlzdCBpdGVyYXRpb24sCisgKiBpdCBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYW4gZXh0cmEgc3RydWN0dXJhbCByZWZlcmVuY2UuIEhlbmNlLAorICogZW5naW5lX2xpc3RfaGVhZCwgYW5kIGVhY2ggbm9uLW51bGwgIm5leHQiIHBvaW50ZXIgYWNjb3VudCBmb3IKKyAqIHRoZSBsaXN0IGl0c2VsZiBhc3N1bWluZyBleGFjdGx5IDEgc3RydWN0dXJhbCByZWZlcmVuY2Ugb24gZWFjaAorICogbGlzdCBtZW1iZXIuICovCitzdGF0aWMgRU5HSU5FICplbmdpbmVfbGlzdF9oZWFkID0gTlVMTDsKK3N0YXRpYyBFTkdJTkUgKmVuZ2luZV9saXN0X3RhaWwgPSBOVUxMOworCisvKiBUaGlzIGNsZWFudXAgZnVuY3Rpb24gaXMgb25seSBuZWVkZWQgaW50ZXJuYWxseS4gSWYgaXQgc2hvdWxkIGJlIGNhbGxlZCwgd2UKKyAqIHJlZ2lzdGVyIGl0IHdpdGggdGhlICJFTkdJTkVfY2xlYW51cCgpIiBzdGFjayB0byBiZSBjYWxsZWQgZHVyaW5nIGNsZWFudXAuICovCisKK3N0YXRpYyB2b2lkIGVuZ2luZV9saXN0X2NsZWFudXAodm9pZCkKKwl7CisJRU5HSU5FICppdGVyYXRvciA9IGVuZ2luZV9saXN0X2hlYWQ7CisKKwl3aGlsZShpdGVyYXRvciAhPSBOVUxMKQorCQl7CisJCUVOR0lORV9yZW1vdmUoaXRlcmF0b3IpOworCQlpdGVyYXRvciA9IGVuZ2luZV9saXN0X2hlYWQ7CisJCX0KKwlyZXR1cm47CisJfQorCisvKiBUaGVzZSBzdGF0aWMgZnVuY3Rpb25zIHN0YXJ0aW5nIHdpdGggYSBsb3dlciBjYXNlICJlbmdpbmVfIiBhbHdheXMKKyAqIHRha2UgcGxhY2Ugd2hlbiBDUllQVE9fTE9DS19FTkdJTkUgaGFzIGJlZW4gbG9ja2VkIHVwLiAqLworc3RhdGljIGludCBlbmdpbmVfbGlzdF9hZGQoRU5HSU5FICplKQorCXsKKwlpbnQgY29uZmxpY3QgPSAwOworCUVOR0lORSAqaXRlcmF0b3IgPSBOVUxMOworCisJaWYoZSA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfTElTVF9BREQsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCWl0ZXJhdG9yID0gZW5naW5lX2xpc3RfaGVhZDsKKwl3aGlsZShpdGVyYXRvciAmJiAhY29uZmxpY3QpCisJCXsKKwkJY29uZmxpY3QgPSAoc3RyY21wKGl0ZXJhdG9yLT5pZCwgZS0+aWQpID09IDApOworCQlpdGVyYXRvciA9IGl0ZXJhdG9yLT5uZXh0OworCQl9CisJaWYoY29uZmxpY3QpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9MSVNUX0FERCwKKwkJCUVOR0lORV9SX0NPTkZMSUNUSU5HX0VOR0lORV9JRCk7CisJCXJldHVybiAwOworCQl9CisJaWYoZW5naW5lX2xpc3RfaGVhZCA9PSBOVUxMKQorCQl7CisJCS8qIFdlIGFyZSBhZGRpbmcgdG8gYW4gZW1wdHkgbGlzdC4gKi8KKwkJaWYoZW5naW5lX2xpc3RfdGFpbCkKKwkJCXsKKwkJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfTElTVF9BREQsCisJCQkJRU5HSU5FX1JfSU5URVJOQUxfTElTVF9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJZW5naW5lX2xpc3RfaGVhZCA9IGU7CisJCWUtPnByZXYgPSBOVUxMOworCQkvKiBUaGUgZmlyc3QgdGltZSB0aGUgbGlzdCBhbGxvY2F0ZXMsIHdlIHNob3VsZCByZWdpc3RlciB0aGUKKwkJICogY2xlYW51cC4gKi8KKwkJZW5naW5lX2NsZWFudXBfYWRkX2xhc3QoZW5naW5lX2xpc3RfY2xlYW51cCk7CisJCX0KKwllbHNlCisJCXsKKwkJLyogV2UgYXJlIGFkZGluZyB0byB0aGUgdGFpbCBvZiBhbiBleGlzdGluZyBsaXN0LiAqLworCQlpZigoZW5naW5lX2xpc3RfdGFpbCA9PSBOVUxMKSB8fAorCQkJCShlbmdpbmVfbGlzdF90YWlsLT5uZXh0ICE9IE5VTEwpKQorCQkJeworCQkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9MSVNUX0FERCwKKwkJCQlFTkdJTkVfUl9JTlRFUk5BTF9MSVNUX0VSUk9SKTsKKwkJCXJldHVybiAwOworCQkJfQorCQllbmdpbmVfbGlzdF90YWlsLT5uZXh0ID0gZTsKKwkJZS0+cHJldiA9IGVuZ2luZV9saXN0X3RhaWw7CisJCX0KKwkvKiBIYXZpbmcgdGhlIGVuZ2luZSBpbiB0aGUgbGlzdCBhc3N1bWVzIGEgc3RydWN0dXJhbAorCSAqIHJlZmVyZW5jZS4gKi8KKwllLT5zdHJ1Y3RfcmVmKys7CisJZW5naW5lX3JlZl9kZWJ1ZyhlLCAwLCAxKQorCS8qIEhvd2V2ZXIgaXQgY2FtZSB0byBiZSwgZSBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaXN0LiAqLworCWVuZ2luZV9saXN0X3RhaWwgPSBlOworCWUtPm5leHQgPSBOVUxMOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBlbmdpbmVfbGlzdF9yZW1vdmUoRU5HSU5FICplKQorCXsKKwlFTkdJTkUgKml0ZXJhdG9yOworCisJaWYoZSA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfTElTVF9SRU1PVkUsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCS8qIFdlIG5lZWQgdG8gY2hlY2sgdGhhdCBlIGlzIGluIG91ciBsaW5rZWQgbGlzdCEgKi8KKwlpdGVyYXRvciA9IGVuZ2luZV9saXN0X2hlYWQ7CisJd2hpbGUoaXRlcmF0b3IgJiYgKGl0ZXJhdG9yICE9IGUpKQorCQlpdGVyYXRvciA9IGl0ZXJhdG9yLT5uZXh0OworCWlmKGl0ZXJhdG9yID09IE5VTEwpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9MSVNUX1JFTU9WRSwKKwkJCUVOR0lORV9SX0VOR0lORV9JU19OT1RfSU5fTElTVCk7CisJCXJldHVybiAwOworCQl9CisJLyogdW4tbGluayBlIGZyb20gdGhlIGNoYWluLiAqLworCWlmKGUtPm5leHQpCisJCWUtPm5leHQtPnByZXYgPSBlLT5wcmV2OworCWlmKGUtPnByZXYpCisJCWUtPnByZXYtPm5leHQgPSBlLT5uZXh0OworCS8qIENvcnJlY3Qgb3VyIGhlYWQvdGFpbCBpZiBuZWNlc3NhcnkuICovCisJaWYoZW5naW5lX2xpc3RfaGVhZCA9PSBlKQorCQllbmdpbmVfbGlzdF9oZWFkID0gZS0+bmV4dDsKKwlpZihlbmdpbmVfbGlzdF90YWlsID09IGUpCisJCWVuZ2luZV9saXN0X3RhaWwgPSBlLT5wcmV2OworCWVuZ2luZV9mcmVlX3V0aWwoZSwgMCk7CisJcmV0dXJuIDE7CisJfQorCisvKiBHZXQgdGhlIGZpcnN0L2xhc3QgIkVOR0lORSIgdHlwZSBhdmFpbGFibGUuICovCitFTkdJTkUgKkVOR0lORV9nZXRfZmlyc3Qodm9pZCkKKwl7CisJRU5HSU5FICpyZXQ7CisKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJcmV0ID0gZW5naW5lX2xpc3RfaGVhZDsKKwlpZihyZXQpCisJCXsKKwkJcmV0LT5zdHJ1Y3RfcmVmKys7CisJCWVuZ2luZV9yZWZfZGVidWcocmV0LCAwLCAxKQorCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJcmV0dXJuIHJldDsKKwl9CisKK0VOR0lORSAqRU5HSU5FX2dldF9sYXN0KHZvaWQpCisJeworCUVOR0lORSAqcmV0OworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FTkdJTkUpOworCXJldCA9IGVuZ2luZV9saXN0X3RhaWw7CisJaWYocmV0KQorCQl7CisJCXJldC0+c3RydWN0X3JlZisrOworCQllbmdpbmVfcmVmX2RlYnVnKHJldCwgMCwgMSkKKwkJfQorCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FTkdJTkUpOworCXJldHVybiByZXQ7CisJfQorCisvKiBJdGVyYXRlIHRvIHRoZSBuZXh0L3ByZXZpb3VzICJFTkdJTkUiIHR5cGUgKE5VTEwgPSBlbmQgb2YgdGhlIGxpc3QpLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X25leHQoRU5HSU5FICplKQorCXsKKwlFTkdJTkUgKnJldCA9IE5VTEw7CisJaWYoZSA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfR0VUX05FWFQsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlyZXQgPSBlLT5uZXh0OworCWlmKHJldCkKKwkJeworCQkvKiBSZXR1cm4gYSB2YWxpZCBzdHJ1Y3R1cmFsIHJlZmVybmNlIHRvIHRoZSBuZXh0IEVOR0lORSAqLworCQlyZXQtPnN0cnVjdF9yZWYrKzsKKwkJZW5naW5lX3JlZl9kZWJ1ZyhyZXQsIDAsIDEpCisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwkvKiBSZWxlYXNlIHRoZSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgRU5HSU5FICovCisJRU5HSU5FX2ZyZWUoZSk7CisJcmV0dXJuIHJldDsKKwl9CisKK0VOR0lORSAqRU5HSU5FX2dldF9wcmV2KEVOR0lORSAqZSkKKwl7CisJRU5HSU5FICpyZXQgPSBOVUxMOworCWlmKGUgPT0gTlVMTCkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0dFVF9QUkVWLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJcmV0ID0gZS0+cHJldjsKKwlpZihyZXQpCisJCXsKKwkJLyogUmV0dXJuIGEgdmFsaWQgc3RydWN0dXJhbCByZWZlcmVuY2UgdG8gdGhlIG5leHQgRU5HSU5FICovCisJCXJldC0+c3RydWN0X3JlZisrOworCQllbmdpbmVfcmVmX2RlYnVnKHJldCwgMCwgMSkKKwkJfQorCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FTkdJTkUpOworCS8qIFJlbGVhc2UgdGhlIHN0cnVjdHVyYWwgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyBFTkdJTkUgKi8KKwlFTkdJTkVfZnJlZShlKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogQWRkIGFub3RoZXIgIkVOR0lORSIgdHlwZSBpbnRvIHRoZSBsaXN0LiAqLworaW50IEVOR0lORV9hZGQoRU5HSU5FICplKQorCXsKKwlpbnQgdG9fcmV0dXJuID0gMTsKKwlpZihlID09IE5VTEwpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9BREQsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmKChlLT5pZCA9PSBOVUxMKSB8fCAoZS0+bmFtZSA9PSBOVUxMKSkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0FERCwKKwkJCUVOR0lORV9SX0lEX09SX05BTUVfTUlTU0lORyk7CisJCX0KKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJaWYoIWVuZ2luZV9saXN0X2FkZChlKSkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0FERCwKKwkJCUVOR0lORV9SX0lOVEVSTkFMX0xJU1RfRVJST1IpOworCQl0b19yZXR1cm4gPSAwOworCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJcmV0dXJuIHRvX3JldHVybjsKKwl9CisKKy8qIFJlbW92ZSBhbiBleGlzdGluZyAiRU5HSU5FIiB0eXBlIGZyb20gdGhlIGFycmF5LiAqLworaW50IEVOR0lORV9yZW1vdmUoRU5HSU5FICplKQorCXsKKwlpbnQgdG9fcmV0dXJuID0gMTsKKwlpZihlID09IE5VTEwpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9SRU1PVkUsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlpZighZW5naW5lX2xpc3RfcmVtb3ZlKGUpKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfUkVNT1ZFLAorCQkJRU5HSU5FX1JfSU5URVJOQUxfTElTVF9FUlJPUik7CisJCXRvX3JldHVybiA9IDA7CisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlyZXR1cm4gdG9fcmV0dXJuOworCX0KKworc3RhdGljIHZvaWQgZW5naW5lX2NweShFTkdJTkUgKmRlc3QsIGNvbnN0IEVOR0lORSAqc3JjKQorCXsKKwlkZXN0LT5pZCA9IHNyYy0+aWQ7CisJZGVzdC0+bmFtZSA9IHNyYy0+bmFtZTsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwlkZXN0LT5yc2FfbWV0aCA9IHNyYy0+cnNhX21ldGg7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwlkZXN0LT5kc2FfbWV0aCA9IHNyYy0+ZHNhX21ldGg7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCWRlc3QtPmRoX21ldGggPSBzcmMtPmRoX21ldGg7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJZGVzdC0+ZWNkaF9tZXRoID0gc3JjLT5lY2RoX21ldGg7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCWRlc3QtPmVjZHNhX21ldGggPSBzcmMtPmVjZHNhX21ldGg7CisjZW5kaWYKKwlkZXN0LT5yYW5kX21ldGggPSBzcmMtPnJhbmRfbWV0aDsKKwlkZXN0LT5zdG9yZV9tZXRoID0gc3JjLT5zdG9yZV9tZXRoOworCWRlc3QtPmNpcGhlcnMgPSBzcmMtPmNpcGhlcnM7CisJZGVzdC0+ZGlnZXN0cyA9IHNyYy0+ZGlnZXN0czsKKwlkZXN0LT5wa2V5X21ldGhzID0gc3JjLT5wa2V5X21ldGhzOworCWRlc3QtPmRlc3Ryb3kgPSBzcmMtPmRlc3Ryb3k7CisJZGVzdC0+aW5pdCA9IHNyYy0+aW5pdDsKKwlkZXN0LT5maW5pc2ggPSBzcmMtPmZpbmlzaDsKKwlkZXN0LT5jdHJsID0gc3JjLT5jdHJsOworCWRlc3QtPmxvYWRfcHJpdmtleSA9IHNyYy0+bG9hZF9wcml2a2V5OworCWRlc3QtPmxvYWRfcHVia2V5ID0gc3JjLT5sb2FkX3B1YmtleTsKKwlkZXN0LT5jbWRfZGVmbnMgPSBzcmMtPmNtZF9kZWZuczsKKwlkZXN0LT5mbGFncyA9IHNyYy0+ZmxhZ3M7CisJfQorCitFTkdJTkUgKkVOR0lORV9ieV9pZChjb25zdCBjaGFyICppZCkKKwl7CisJRU5HSU5FICppdGVyYXRvcjsKKwljaGFyICpsb2FkX2RpciA9IE5VTEw7CisJaWYoaWQgPT0gTlVMTCkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0JZX0lELAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJaXRlcmF0b3IgPSBlbmdpbmVfbGlzdF9oZWFkOworCXdoaWxlKGl0ZXJhdG9yICYmIChzdHJjbXAoaWQsIGl0ZXJhdG9yLT5pZCkgIT0gMCkpCisJCWl0ZXJhdG9yID0gaXRlcmF0b3ItPm5leHQ7CisJaWYoaXRlcmF0b3IpCisJCXsKKwkJLyogV2UgbmVlZCB0byByZXR1cm4gYSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZS4gSWYgdGhpcyBpcyBhbgorCQkgKiBFTkdJTkUgdHlwZSB0aGF0IHJldHVybnMgY29waWVzLCBtYWtlIGEgZHVwbGljYXRlIC0gb3RoZXJ3aXNlCisJCSAqIGluY3JlbWVudCB0aGUgZXhpc3RpbmcgRU5HSU5FJ3MgcmVmZXJlbmNlIGNvdW50LiAqLworCQlpZihpdGVyYXRvci0+ZmxhZ3MgJiBFTkdJTkVfRkxBR1NfQllfSURfQ09QWSkKKwkJCXsKKwkJCUVOR0lORSAqY3AgPSBFTkdJTkVfbmV3KCk7CisJCQlpZighY3ApCisJCQkJaXRlcmF0b3IgPSBOVUxMOworCQkJZWxzZQorCQkJCXsKKwkJCQllbmdpbmVfY3B5KGNwLCBpdGVyYXRvcik7CisJCQkJaXRlcmF0b3IgPSBjcDsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWl0ZXJhdG9yLT5zdHJ1Y3RfcmVmKys7CisJCQllbmdpbmVfcmVmX2RlYnVnKGl0ZXJhdG9yLCAwLCAxKQorCQkJfQorCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisjaWYgMAorCWlmKGl0ZXJhdG9yID09IE5VTEwpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9CWV9JRCwKKwkJCUVOR0lORV9SX05PX1NVQ0hfRU5HSU5FKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJpZD0iLCBpZCk7CisJCX0KKwlyZXR1cm4gaXRlcmF0b3I7CisjZWxzZQorCS8qIEVFSyEgRXhwZXJpbWVudGFsIGNvZGUgc3RhcnRzICovCisJaWYoaXRlcmF0b3IpIHJldHVybiBpdGVyYXRvcjsKKwkvKiBQcmV2ZW50IGluZmluaXRlIHJlY3VzcmlvbiBpZiB3ZSdyZSBsb29raW5nIGZvciB0aGUgZHluYW1pYyBlbmdpbmUuICovCisJaWYgKHN0cmNtcChpZCwgImR5bmFtaWMiKSkKKwkJeworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQlpZigobG9hZF9kaXIgPSBnZXRlbnYoIk9QRU5TU0xfRU5HSU5FUyIpKSA9PSAwKSBsb2FkX2RpciA9ICJTU0xST09UOltFTkdJTkVTXSI7CisjZWxzZQorCQlpZigobG9hZF9kaXIgPSBnZXRlbnYoIk9QRU5TU0xfRU5HSU5FUyIpKSA9PSAwKSBsb2FkX2RpciA9IEVOR0lORVNESVI7CisjZW5kaWYKKwkJaXRlcmF0b3IgPSBFTkdJTkVfYnlfaWQoImR5bmFtaWMiKTsKKwkJaWYoIWl0ZXJhdG9yIHx8ICFFTkdJTkVfY3RybF9jbWRfc3RyaW5nKGl0ZXJhdG9yLCAiSUQiLCBpZCwgMCkgfHwKKwkJCQkhRU5HSU5FX2N0cmxfY21kX3N0cmluZyhpdGVyYXRvciwgIkRJUl9MT0FEIiwgIjIiLCAwKSB8fAorCQkJCSFFTkdJTkVfY3RybF9jbWRfc3RyaW5nKGl0ZXJhdG9yLCAiRElSX0FERCIsCisJCQkJCWxvYWRfZGlyLCAwKSB8fAorCQkJCSFFTkdJTkVfY3RybF9jbWRfc3RyaW5nKGl0ZXJhdG9yLCAiTE9BRCIsIE5VTEwsIDApKQorCQkJCWdvdG8gbm90Zm91bmQ7CisJCXJldHVybiBpdGVyYXRvcjsKKwkJfQorbm90Zm91bmQ6CisJRU5HSU5FX2ZyZWUoaXRlcmF0b3IpOworCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfQllfSUQsRU5HSU5FX1JfTk9fU1VDSF9FTkdJTkUpOworCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiaWQ9IiwgaWQpOworCXJldHVybiBOVUxMOworCS8qIEVFSyEgRXhwZXJpbWVudGFsIGNvZGUgZW5kcyAqLworI2VuZGlmCisJfQorCitpbnQgRU5HSU5FX3VwX3JlZihFTkdJTkUgKmUpCisJeworCWlmIChlID09IE5VTEwpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9VUF9SRUYsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlDUllQVE9fYWRkKCZlLT5zdHJ1Y3RfcmVmLDEsQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19vcGVuc3NsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ19vcGVuc3NsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiYjk1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX29wZW5zc2wuYwpAQCAtMCwwICsxLDM4NCBAQAorLyogY3J5cHRvL2VuZ2luZS9lbmdfb3BlbnNzbC5jICovCisvKiBXcml0dGVuIGJ5IEdlb2ZmIFRob3JwZSAoZ2VvZmZAZ2VvZmZ0aG9ycGUubmV0KSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogRUNESCBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZHNvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjZW5kaWYKKworLyogVGhpcyB0ZXN0aW5nIGd1bmsgaXMgaW1wbGVtZW50ZWQgKGFuZCBleHBsYWluZWQpIGxvd2VyIGRvd24uIEl0IGFsc28gYXNzdW1lcworICogdGhlIGFwcGxpY2F0aW9uIGV4cGxpY2l0bHkgY2FsbHMgIkVOR0lORV9sb2FkX29wZW5zc2woKSIgYmVjYXVzZSB0aGlzIGlzIG5vCisgKiBsb25nZXIgYXV0b21hdGljIGluIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpLiAqLworI2RlZmluZSBURVNUX0VOR19PUEVOU1NMX1JDNAorI2RlZmluZSBURVNUX0VOR19PUEVOU1NMX1BLRVkKKy8qICNkZWZpbmUgVEVTVF9FTkdfT1BFTlNTTF9SQzRfT1RIRVJTICovCisjZGVmaW5lIFRFU1RfRU5HX09QRU5TU0xfUkM0X1BfSU5JVAorLyogI2RlZmluZSBURVNUX0VOR19PUEVOU1NMX1JDNF9QX0NJUEhFUiAqLworI2RlZmluZSBURVNUX0VOR19PUEVOU1NMX1NIQQorLyogI2RlZmluZSBURVNUX0VOR19PUEVOU1NMX1NIQV9PVEhFUlMgKi8KKy8qICNkZWZpbmUgVEVTVF9FTkdfT1BFTlNTTF9TSEFfUF9JTklUICovCisvKiAjZGVmaW5lIFRFU1RfRU5HX09QRU5TU0xfU0hBX1BfVVBEQVRFICovCisvKiAjZGVmaW5lIFRFU1RfRU5HX09QRU5TU0xfU0hBX1BfRklOQUwgKi8KKworLyogTm93IGNoZWNrIHdoYXQgb2YgdGhvc2UgYWxnb3JpdGhtcyBhcmUgYWN0dWFsbHkgZW5hYmxlZCAqLworI2lmZGVmIE9QRU5TU0xfTk9fUkM0CisjdW5kZWYgVEVTVF9FTkdfT1BFTlNTTF9SQzQKKyN1bmRlZiBURVNUX0VOR19PUEVOU1NMX1JDNF9PVEhFUlMKKyN1bmRlZiBURVNUX0VOR19PUEVOU1NMX1JDNF9QX0lOSVQKKyN1bmRlZiBURVNUX0VOR19PUEVOU1NMX1JDNF9QX0NJUEhFUgorI2VuZGlmCisjaWYgZGVmaW5lZChPUEVOU1NMX05PX1NIQSkgfHwgZGVmaW5lZChPUEVOU1NMX05PX1NIQTApIHx8IGRlZmluZWQoT1BFTlNTTF9OT19TSEExKQorI3VuZGVmIFRFU1RfRU5HX09QRU5TU0xfU0hBCisjdW5kZWYgVEVTVF9FTkdfT1BFTlNTTF9TSEFfT1RIRVJTCisjdW5kZWYgVEVTVF9FTkdfT1BFTlNTTF9TSEFfUF9JTklUCisjdW5kZWYgVEVTVF9FTkdfT1BFTlNTTF9TSEFfUF9VUERBVEUKKyN1bmRlZiBURVNUX0VOR19PUEVOU1NMX1NIQV9QX0ZJTkFMIAorI2VuZGlmCisKKyNpZmRlZiBURVNUX0VOR19PUEVOU1NMX1JDNAorc3RhdGljIGludCBvcGVuc3NsX2NpcGhlcnMoRU5HSU5FICplLCBjb25zdCBFVlBfQ0lQSEVSICoqY2lwaGVyLAorCQkJCWNvbnN0IGludCAqKm5pZHMsIGludCBuaWQpOworI2VuZGlmCisjaWZkZWYgVEVTVF9FTkdfT1BFTlNTTF9TSEEKK3N0YXRpYyBpbnQgb3BlbnNzbF9kaWdlc3RzKEVOR0lORSAqZSwgY29uc3QgRVZQX01EICoqZGlnZXN0LAorCQkJCWNvbnN0IGludCAqKm5pZHMsIGludCBuaWQpOworI2VuZGlmCisKKyNpZmRlZiBURVNUX0VOR19PUEVOU1NMX1BLRVkKK3N0YXRpYyBFVlBfUEtFWSAqb3BlbnNzbF9sb2FkX3ByaXZrZXkoRU5HSU5FICplbmcsIGNvbnN0IGNoYXIgKmtleV9pZCwKKwlVSV9NRVRIT0QgKnVpX21ldGhvZCwgdm9pZCAqY2FsbGJhY2tfZGF0YSk7CisjZW5kaWYKKworLyogVGhlIGNvbnN0YW50cyB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIEVOR0lORSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmVuZ2luZV9vcGVuc3NsX2lkID0gIm9wZW5zc2wiOworc3RhdGljIGNvbnN0IGNoYXIgKmVuZ2luZV9vcGVuc3NsX25hbWUgPSAiU29mdHdhcmUgZW5naW5lIHN1cHBvcnQiOworCisvKiBUaGlzIGludGVybmFsIGZ1bmN0aW9uIGlzIHVzZWQgYnkgRU5HSU5FX29wZW5zc2woKSBhbmQgcG9zc2libHkgYnkgdGhlCisgKiAiZHluYW1pYyIgRU5HSU5FIHN1cHBvcnQgdG9vICovCitzdGF0aWMgaW50IGJpbmRfaGVscGVyKEVOR0lORSAqZSkKKwl7CisJaWYoIUVOR0lORV9zZXRfaWQoZSwgZW5naW5lX29wZW5zc2xfaWQpCisJCQl8fCAhRU5HSU5FX3NldF9uYW1lKGUsIGVuZ2luZV9vcGVuc3NsX25hbWUpCisjaWZuZGVmIFRFU1RfRU5HX09QRU5TU0xfTk9fQUxHT1JJVEhNUworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQkJfHwgIUVOR0lORV9zZXRfUlNBKGUsIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCQkJfHwgIUVOR0lORV9zZXRfRFNBKGUsIERTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSkKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJCXx8ICFFTkdJTkVfc2V0X0VDREgoZSwgRUNESF9PcGVuU1NMKCkpCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCQkJfHwgIUVOR0lORV9zZXRfRUNEU0EoZSwgRUNEU0FfT3BlblNTTCgpKQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwkJCXx8ICFFTkdJTkVfc2V0X0RIKGUsIERIX2dldF9kZWZhdWx0X21ldGhvZCgpKQorI2VuZGlmCisJCQl8fCAhRU5HSU5FX3NldF9SQU5EKGUsIFJBTkRfU1NMZWF5KCkpCisjaWZkZWYgVEVTVF9FTkdfT1BFTlNTTF9SQzQKKwkJCXx8ICFFTkdJTkVfc2V0X2NpcGhlcnMoZSwgb3BlbnNzbF9jaXBoZXJzKQorI2VuZGlmCisjaWZkZWYgVEVTVF9FTkdfT1BFTlNTTF9TSEEKKwkJCXx8ICFFTkdJTkVfc2V0X2RpZ2VzdHMoZSwgb3BlbnNzbF9kaWdlc3RzKQorI2VuZGlmCisjZW5kaWYKKyNpZmRlZiBURVNUX0VOR19PUEVOU1NMX1BLRVkKKwkJCXx8ICFFTkdJTkVfc2V0X2xvYWRfcHJpdmtleV9mdW5jdGlvbihlLCBvcGVuc3NsX2xvYWRfcHJpdmtleSkKKyNlbmRpZgorCQkJKQorCQlyZXR1cm4gMDsKKwkvKiBJZiB3ZSBhZGQgZXJyb3JzIHRvIHRoaXMgRU5HSU5FLCBlbnN1cmUgdGhlIGVycm9yIGhhbmRsaW5nIGlzIHNldHVwIGhlcmUgKi8KKwkvKiBvcGVuc3NsX2xvYWRfZXJyb3Jfc3RyaW5ncygpOyAqLworCXJldHVybiAxOworCX0KKworc3RhdGljIEVOR0lORSAqZW5naW5lX29wZW5zc2wodm9pZCkKKwl7CisJRU5HSU5FICpyZXQgPSBFTkdJTkVfbmV3KCk7CisJaWYoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisJaWYoIWJpbmRfaGVscGVyKHJldCkpCisJCXsKKwkJRU5HSU5FX2ZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKwordm9pZCBFTkdJTkVfbG9hZF9vcGVuc3NsKHZvaWQpCisJeworCUVOR0lORSAqdG9hZGQgPSBlbmdpbmVfb3BlbnNzbCgpOworCWlmKCF0b2FkZCkgcmV0dXJuOworCUVOR0lORV9hZGQodG9hZGQpOworCS8qIElmIHRoZSAiYWRkIiB3b3JrZWQsIGl0IGdldHMgYSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZS4gU28gZWl0aGVyIHdheSwKKwkgKiB3ZSByZWxlYXNlIG91ciBqdXN0LWNyZWF0ZWQgcmVmZXJlbmNlLiAqLworCUVOR0lORV9mcmVlKHRvYWRkKTsKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKwl9CisKKy8qIFRoaXMgc3R1ZmYgaXMgbmVlZGVkIGlmIHRoaXMgRU5HSU5FIGlzIGJlaW5nIGNvbXBpbGVkIGludG8gYSBzZWxmLWNvbnRhaW5lZAorICogc2hhcmVkLWxpYnJhcnkuICovCisjaWZkZWYgRU5HSU5FX0RZTkFNSUNfU1VQUE9SVAorc3RhdGljIGludCBiaW5kX2ZuKEVOR0lORSAqZSwgY29uc3QgY2hhciAqaWQpCisJeworCWlmKGlkICYmIChzdHJjbXAoaWQsIGVuZ2luZV9vcGVuc3NsX2lkKSAhPSAwKSkKKwkJcmV0dXJuIDA7CisJaWYoIWJpbmRfaGVscGVyKGUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CitJTVBMRU1FTlRfRFlOQU1JQ19DSEVDS19GTigpCitJTVBMRU1FTlRfRFlOQU1JQ19CSU5EX0ZOKGJpbmRfZm4pCisjZW5kaWYgLyogRU5HSU5FX0RZTkFNSUNfU1VQUE9SVCAqLworCisjaWZkZWYgVEVTVF9FTkdfT1BFTlNTTF9SQzQKKy8qIFRoaXMgc2VjdGlvbiBvZiBjb2RlIGNvbXBpbGVzIGFuICJhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiIgb2YgdHdvIG1vZGVzIG9mCisgKiBSQzQgaW50byB0aGlzIEVOR0lORS4gVGhlIHJlc3VsdCBpcyB0aGF0IEVWUF9DSVBIRVIgb3BlcmF0aW9uIGZvciAicmM0IgorICogc2hvdWxkIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzIGdvIHZpYSB0aGlzIHN1cHBvcnQgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQKKyAqIEVWUCBzdXBwb3J0LiBUaGVyZSBhcmUgb3RoZXIgc3ltYm9scyB0byB0d2VhayB0aGUgdGVzdGluZzsKKyAqICAgIFRFU1RfRU5DX09QRU5TU0xfUkM0X09USEVSUyAtIHByaW50IGEgb25lIGxpbmUgbWVzc2FnZSB0byBzdGRlcnIgZWFjaCB0aW1lCisgKiAgICAgICAgd2UncmUgYXNrZWQgZm9yIGEgY2lwaGVyIHdlIGRvbid0IHN1cHBvcnQgKHNob3VsZCBub3QgaGFwcGVuKS4KKyAqICAgIFRFU1RfRU5HX09QRU5TU0xfUkM0X1BfSU5JVCAtIHByaW50IGEgb25lIGxpbmUgbWVzc2FnZSB0byBzdGRlcnIgZWFjaCB0aW1lCisgKiAgICAgICAgdGhlICJpbml0X2tleSIgaGFuZGxlciBpcyBjYWxsZWQuCisgKiAgICBURVNUX0VOR19PUEVOU1NMX1JDNF9QX0NJUEhFUiAtIGRpdHRvIGZvciB0aGUgImNpcGhlciIgaGFuZGxlci4KKyAqLworI2luY2x1ZGUgPG9wZW5zc2wvcmM0Lmg+CisjZGVmaW5lIFRFU1RfUkM0X0tFWV9TSVpFCQkxNgorc3RhdGljIGludCB0ZXN0X2NpcGhlcl9uaWRzW10gPSB7TklEX3JjNCxOSURfcmM0XzQwfTsKK3N0YXRpYyBpbnQgdGVzdF9jaXBoZXJfbmlkc19udW1iZXIgPSAyOwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIga2V5W1RFU1RfUkM0X0tFWV9TSVpFXTsKKwlSQzRfS0VZIGtzOworCX0gVEVTVF9SQzRfS0VZOworI2RlZmluZSB0ZXN0KGN0eCkgKChURVNUX1JDNF9LRVkgKikoY3R4KS0+Y2lwaGVyX2RhdGEpCitzdGF0aWMgaW50IHRlc3RfcmM0X2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKQorCXsKKyNpZmRlZiBURVNUX0VOR19PUEVOU1NMX1JDNF9QX0lOSVQKKwlmcHJpbnRmKHN0ZGVyciwgIihURVNUX0VOR19PUEVOU1NMX1JDNCkgdGVzdF9pbml0X2tleSgpIGNhbGxlZFxuIik7CisjZW5kaWYKKwltZW1jcHkoJnRlc3QoY3R4KS0+a2V5WzBdLGtleSxFVlBfQ0lQSEVSX0NUWF9rZXlfbGVuZ3RoKGN0eCkpOworCVJDNF9zZXRfa2V5KCZ0ZXN0KGN0eCktPmtzLEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY3R4KSwKKwkJdGVzdChjdHgpLT5rZXkpOworCXJldHVybiAxOworCX0KK3N0YXRpYyBpbnQgdGVzdF9yYzRfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCisJeworI2lmZGVmIFRFU1RfRU5HX09QRU5TU0xfUkM0X1BfQ0lQSEVSCisJZnByaW50ZihzdGRlcnIsICIoVEVTVF9FTkdfT1BFTlNTTF9SQzQpIHRlc3RfY2lwaGVyKCkgY2FsbGVkXG4iKTsKKyNlbmRpZgorCVJDNCgmdGVzdChjdHgpLT5rcyxpbmwsaW4sb3V0KTsKKwlyZXR1cm4gMTsKKwl9CitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiB0ZXN0X3I0X2NpcGhlcj0KKwl7CisJTklEX3JjNCwKKwkxLFRFU1RfUkM0X0tFWV9TSVpFLDAsCisJRVZQX0NJUEhfVkFSSUFCTEVfTEVOR1RILAorCXRlc3RfcmM0X2luaXRfa2V5LAorCXRlc3RfcmM0X2NpcGhlciwKKwlOVUxMLAorCXNpemVvZihURVNUX1JDNF9LRVkpLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwKKwl9Oworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgdGVzdF9yNF80MF9jaXBoZXI9CisJeworCU5JRF9yYzRfNDAsCisJMSw1IC8qIDQwIGJpdCAqLywwLAorCUVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCwKKwl0ZXN0X3JjNF9pbml0X2tleSwKKwl0ZXN0X3JjNF9jaXBoZXIsCisJTlVMTCwKKwlzaXplb2YoVEVTVF9SQzRfS0VZKSwKKwlOVUxMLCAKKwlOVUxMLAorCU5VTEwsCisJTlVMTAorCX07CitzdGF0aWMgaW50IG9wZW5zc2xfY2lwaGVycyhFTkdJTkUgKmUsIGNvbnN0IEVWUF9DSVBIRVIgKipjaXBoZXIsCisJCQljb25zdCBpbnQgKipuaWRzLCBpbnQgbmlkKQorCXsKKwlpZighY2lwaGVyKQorCQl7CisJCS8qIFdlIGFyZSByZXR1cm5pbmcgYSBsaXN0IG9mIHN1cHBvcnRlZCBuaWRzICovCisJCSpuaWRzID0gdGVzdF9jaXBoZXJfbmlkczsKKwkJcmV0dXJuIHRlc3RfY2lwaGVyX25pZHNfbnVtYmVyOworCQl9CisJLyogV2UgYXJlIGJlaW5nIGFza2VkIGZvciBhIHNwZWNpZmljIGNpcGhlciAqLworCWlmKG5pZCA9PSBOSURfcmM0KQorCQkqY2lwaGVyID0gJnRlc3RfcjRfY2lwaGVyOworCWVsc2UgaWYobmlkID09IE5JRF9yYzRfNDApCisJCSpjaXBoZXIgPSAmdGVzdF9yNF80MF9jaXBoZXI7CisJZWxzZQorCQl7CisjaWZkZWYgVEVTVF9FTkdfT1BFTlNTTF9SQzRfT1RIRVJTCisJCWZwcmludGYoc3RkZXJyLCAiKFRFU1RfRU5HX09QRU5TU0xfUkM0KSByZXR1cm5pbmcgTlVMTCBmb3IgIgorCQkJCSJuaWQgJWRcbiIsIG5pZCk7CisjZW5kaWYKKwkJKmNpcGhlciA9IE5VTEw7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKyNpZmRlZiBURVNUX0VOR19PUEVOU1NMX1NIQQorLyogTXVjaCB0aGUgc2FtZSBzb3J0IG9mIGNvbW1lbnQgYXMgZm9yIFRFU1RfRU5HX09QRU5TU0xfUkM0ICovCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KK3N0YXRpYyBpbnQgdGVzdF9kaWdlc3Rfbmlkc1tdID0ge05JRF9zaGExfTsKK3N0YXRpYyBpbnQgdGVzdF9kaWdlc3Rfbmlkc19udW1iZXIgPSAxOworc3RhdGljIGludCB0ZXN0X3NoYTFfaW5pdChFVlBfTURfQ1RYICpjdHgpCisJeworI2lmZGVmIFRFU1RfRU5HX09QRU5TU0xfU0hBX1BfSU5JVAorCWZwcmludGYoc3RkZXJyLCAiKFRFU1RfRU5HX09QRU5TU0xfU0hBKSB0ZXN0X3NoYTFfaW5pdCgpIGNhbGxlZFxuIik7CisjZW5kaWYKKwlyZXR1cm4gU0hBMV9Jbml0KGN0eC0+bWRfZGF0YSk7CisJfQorc3RhdGljIGludCB0ZXN0X3NoYTFfdXBkYXRlKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCkKKwl7CisjaWZkZWYgVEVTVF9FTkdfT1BFTlNTTF9TSEFfUF9VUERBVEUKKwlmcHJpbnRmKHN0ZGVyciwgIihURVNUX0VOR19PUEVOU1NMX1NIQSkgdGVzdF9zaGExX3VwZGF0ZSgpIGNhbGxlZFxuIik7CisjZW5kaWYKKwlyZXR1cm4gU0hBMV9VcGRhdGUoY3R4LT5tZF9kYXRhLGRhdGEsY291bnQpOworCX0KK3N0YXRpYyBpbnQgdGVzdF9zaGExX2ZpbmFsKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCkKKwl7CisjaWZkZWYgVEVTVF9FTkdfT1BFTlNTTF9TSEFfUF9GSU5BTAorCWZwcmludGYoc3RkZXJyLCAiKFRFU1RfRU5HX09QRU5TU0xfU0hBKSB0ZXN0X3NoYTFfZmluYWwoKSBjYWxsZWRcbiIpOworI2VuZGlmCisJcmV0dXJuIFNIQTFfRmluYWwobWQsY3R4LT5tZF9kYXRhKTsKKwl9CitzdGF0aWMgY29uc3QgRVZQX01EIHRlc3Rfc2hhX21kPQorCXsKKwlOSURfc2hhMSwKKwlOSURfc2hhMVdpdGhSU0FFbmNyeXB0aW9uLAorCVNIQV9ESUdFU1RfTEVOR1RILAorCTAsCisJdGVzdF9zaGExX2luaXQsCisJdGVzdF9zaGExX3VwZGF0ZSwKKwl0ZXN0X3NoYTFfZmluYWwsCisJTlVMTCwKKwlOVUxMLAorCUVWUF9QS0VZX1JTQV9tZXRob2QsCisJU0hBX0NCTE9DSywKKwlzaXplb2YoRVZQX01EICopK3NpemVvZihTSEFfQ1RYKSwKKwl9Oworc3RhdGljIGludCBvcGVuc3NsX2RpZ2VzdHMoRU5HSU5FICplLCBjb25zdCBFVlBfTUQgKipkaWdlc3QsCisJCQljb25zdCBpbnQgKipuaWRzLCBpbnQgbmlkKQorCXsKKwlpZighZGlnZXN0KQorCQl7CisJCS8qIFdlIGFyZSByZXR1cm5pbmcgYSBsaXN0IG9mIHN1cHBvcnRlZCBuaWRzICovCisJCSpuaWRzID0gdGVzdF9kaWdlc3RfbmlkczsKKwkJcmV0dXJuIHRlc3RfZGlnZXN0X25pZHNfbnVtYmVyOworCQl9CisJLyogV2UgYXJlIGJlaW5nIGFza2VkIGZvciBhIHNwZWNpZmljIGRpZ2VzdCAqLworCWlmKG5pZCA9PSBOSURfc2hhMSkKKwkJKmRpZ2VzdCA9ICZ0ZXN0X3NoYV9tZDsKKwllbHNlCisJCXsKKyNpZmRlZiBURVNUX0VOR19PUEVOU1NMX1NIQV9PVEhFUlMKKwkJZnByaW50ZihzdGRlcnIsICIoVEVTVF9FTkdfT1BFTlNTTF9TSEEpIHJldHVybmluZyBOVUxMIGZvciAiCisJCQkJIm5pZCAlZFxuIiwgbmlkKTsKKyNlbmRpZgorCQkqZGlnZXN0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKworI2lmZGVmIFRFU1RfRU5HX09QRU5TU0xfUEtFWQorc3RhdGljIEVWUF9QS0VZICpvcGVuc3NsX2xvYWRfcHJpdmtleShFTkdJTkUgKmVuZywgY29uc3QgY2hhciAqa2V5X2lkLAorCVVJX01FVEhPRCAqdWlfbWV0aG9kLCB2b2lkICpjYWxsYmFja19kYXRhKQorCXsKKwlCSU8gKmluOworCUVWUF9QS0VZICprZXk7CisJZnByaW50ZihzdGRlcnIsICIoVEVTVF9FTkdfT1BFTlNTTF9QS0VZKUxvYWRpbmcgUHJpdmF0ZSBrZXkgJXNcbiIsIGtleV9pZCk7CisJaW4gPSBCSU9fbmV3X2ZpbGUoa2V5X2lkLCAiciIpOworCWlmICghaW4pCisJCXJldHVybiBOVUxMOworCWtleSA9IFBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGluLCBOVUxMLCAwLCBOVUxMKTsKKwlCSU9fZnJlZShpbik7CisJcmV0dXJuIGtleTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX3BrZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5nX3BrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGZhMmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfcGtleS5jCkBAIC0wLDAgKzEsMTk2IEBACisvKiBjcnlwdG8vZW5naW5lL2VuZ19wa2V5LmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZW5nX2ludC5oIgorCisvKiBCYXNpYyBnZXQvc2V0IHN0dWZmICovCisKK2ludCBFTkdJTkVfc2V0X2xvYWRfcHJpdmtleV9mdW5jdGlvbihFTkdJTkUgKmUsIEVOR0lORV9MT0FEX0tFWV9QVFIgbG9hZHByaXZfZikKKwl7CisJZS0+bG9hZF9wcml2a2V5ID0gbG9hZHByaXZfZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBFTkdJTkVfc2V0X2xvYWRfcHVia2V5X2Z1bmN0aW9uKEVOR0lORSAqZSwgRU5HSU5FX0xPQURfS0VZX1BUUiBsb2FkcHViX2YpCisJeworCWUtPmxvYWRfcHVia2V5ID0gbG9hZHB1Yl9mOworCXJldHVybiAxOworCX0KKworaW50IEVOR0lORV9zZXRfbG9hZF9zc2xfY2xpZW50X2NlcnRfZnVuY3Rpb24oRU5HSU5FICplLAorCQkJCUVOR0lORV9TU0xfQ0xJRU5UX0NFUlRfUFRSIGxvYWRzc2xfZikKKwl7CisJZS0+bG9hZF9zc2xfY2xpZW50X2NlcnQgPSBsb2Fkc3NsX2Y7CisJcmV0dXJuIDE7CisJfQorCitFTkdJTkVfTE9BRF9LRVlfUFRSIEVOR0lORV9nZXRfbG9hZF9wcml2a2V5X2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSkKKwl7CisJcmV0dXJuIGUtPmxvYWRfcHJpdmtleTsKKwl9CisKK0VOR0lORV9MT0FEX0tFWV9QVFIgRU5HSU5FX2dldF9sb2FkX3B1YmtleV9mdW5jdGlvbihjb25zdCBFTkdJTkUgKmUpCisJeworCXJldHVybiBlLT5sb2FkX3B1YmtleTsKKwl9CisKK0VOR0lORV9TU0xfQ0xJRU5UX0NFUlRfUFRSIEVOR0lORV9nZXRfc3NsX2NsaWVudF9jZXJ0X2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSkKKwl7CisJcmV0dXJuIGUtPmxvYWRfc3NsX2NsaWVudF9jZXJ0OworCX0KKworLyogQVBJIGZ1bmN0aW9ucyB0byBsb2FkIHB1YmxpYy9wcml2YXRlIGtleXMgKi8KKworRVZQX1BLRVkgKkVOR0lORV9sb2FkX3ByaXZhdGVfa2V5KEVOR0lORSAqZSwgY29uc3QgY2hhciAqa2V5X2lkLAorCVVJX01FVEhPRCAqdWlfbWV0aG9kLCB2b2lkICpjYWxsYmFja19kYXRhKQorCXsKKwlFVlBfUEtFWSAqcGtleTsKKworCWlmKGUgPT0gTlVMTCkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0xPQURfUFJJVkFURV9LRVksCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlpZihlLT5mdW5jdF9yZWYgPT0gMCkKKwkJeworCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9MT0FEX1BSSVZBVEVfS0VZLAorCQkJRU5HSU5FX1JfTk9UX0lOSVRJQUxJU0VEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlpZiAoIWUtPmxvYWRfcHJpdmtleSkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0xPQURfUFJJVkFURV9LRVksCisJCQlFTkdJTkVfUl9OT19MT0FEX0ZVTkNUSU9OKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlwa2V5ID0gZS0+bG9hZF9wcml2a2V5KGUsIGtleV9pZCwgdWlfbWV0aG9kLCBjYWxsYmFja19kYXRhKTsKKwlpZiAoIXBrZXkpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9MT0FEX1BSSVZBVEVfS0VZLAorCQkJRU5HSU5FX1JfRkFJTEVEX0xPQURJTkdfUFJJVkFURV9LRVkpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBwa2V5OworCX0KKworRVZQX1BLRVkgKkVOR0lORV9sb2FkX3B1YmxpY19rZXkoRU5HSU5FICplLCBjb25zdCBjaGFyICprZXlfaWQsCisJVUlfTUVUSE9EICp1aV9tZXRob2QsIHZvaWQgKmNhbGxiYWNrX2RhdGEpCisJeworCUVWUF9QS0VZICpwa2V5OworCisJaWYoZSA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfTE9BRF9QVUJMSUNfS0VZLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJaWYoZS0+ZnVuY3RfcmVmID09IDApCisJCXsKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfTE9BRF9QVUJMSUNfS0VZLAorCQkJRU5HSU5FX1JfTk9UX0lOSVRJQUxJU0VEKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlpZiAoIWUtPmxvYWRfcHVia2V5KQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfTE9BRF9QVUJMSUNfS0VZLAorCQkJRU5HSU5FX1JfTk9fTE9BRF9GVU5DVElPTik7CisJCXJldHVybiAwOworCQl9CisJcGtleSA9IGUtPmxvYWRfcHVia2V5KGUsIGtleV9pZCwgdWlfbWV0aG9kLCBjYWxsYmFja19kYXRhKTsKKwlpZiAoIXBrZXkpCisJCXsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9MT0FEX1BVQkxJQ19LRVksCisJCQlFTkdJTkVfUl9GQUlMRURfTE9BRElOR19QVUJMSUNfS0VZKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gcGtleTsKKwl9CisKK2ludCBFTkdJTkVfbG9hZF9zc2xfY2xpZW50X2NlcnQoRU5HSU5FICplLCBTU0wgKnMsCisJU1RBQ0tfT0YoWDUwOV9OQU1FKSAqY2FfZG4sIFg1MDkgKipwY2VydCwgRVZQX1BLRVkgKipwcGtleSwKKwlTVEFDS19PRihYNTA5KSAqKnBvdGhlciwgVUlfTUVUSE9EICp1aV9tZXRob2QsIHZvaWQgKmNhbGxiYWNrX2RhdGEpCisJeworCisJaWYoZSA9PSBOVUxMKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfTE9BRF9TU0xfQ0xJRU5UX0NFUlQsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlpZihlLT5mdW5jdF9yZWYgPT0gMCkKKwkJeworCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwkJRU5HSU5FZXJyKEVOR0lORV9GX0VOR0lORV9MT0FEX1NTTF9DTElFTlRfQ0VSVCwKKwkJCUVOR0lORV9SX05PVF9JTklUSUFMSVNFRCk7CisJCXJldHVybiAwOworCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJaWYgKCFlLT5sb2FkX3NzbF9jbGllbnRfY2VydCkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0xPQURfU1NMX0NMSUVOVF9DRVJULAorCQkJRU5HSU5FX1JfTk9fTE9BRF9GVU5DVElPTik7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGUtPmxvYWRfc3NsX2NsaWVudF9jZXJ0KGUsIHMsIGNhX2RuLCBwY2VydCwgcHBrZXksIHBvdGhlciwKKwkJCQkJdWlfbWV0aG9kLCBjYWxsYmFja19kYXRhKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ190YWJsZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfdGFibGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRlOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdfdGFibGUuYwpAQCAtMCwwICsxLDM1MSBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlICJlbmdfaW50LmgiCisKKy8qIFRoZSB0eXBlIG9mIHRoZSBpdGVtcyBpbiB0aGUgdGFibGUgKi8KK3R5cGVkZWYgc3RydWN0IHN0X2VuZ2luZV9waWxlCisJeworCS8qIFRoZSAnbmlkJyBvZiB0aGlzIGFsZ29yaXRobS9tb2RlICovCisJaW50IG5pZDsKKwkvKiBFTkdJTkVzIHRoYXQgaW1wbGVtZW50IHRoaXMgYWxnb3JpdGhtL21vZGUuICovCisJU1RBQ0tfT0YoRU5HSU5FKSAqc2s7CisJLyogVGhlIGRlZmF1bHQgRU5HSU5FIHRvIHBlcmZvcm0gdGhpcyBhbGdvcml0aG0vbW9kZS4gKi8KKwlFTkdJTkUgKmZ1bmN0OworCS8qIFplcm8gaWYgJ3NrJyBpcyBuZXdlciB0aGFuIHRoZSBjYWNoZWQgJ2Z1bmN0Jywgbm9uLXplcm8gb3RoZXJ3aXNlICovCisJaW50IHVwdG9kYXRlOworCX0gRU5HSU5FX1BJTEU7CisKK0RFQ0xBUkVfTEhBU0hfT0YoRU5HSU5FX1BJTEUpOworCisvKiBUaGUgdHlwZSBleHBvc2VkIGluIGVuZ19pbnQuaCAqLworc3RydWN0IHN0X2VuZ2luZV90YWJsZQorCXsKKwlMSEFTSF9PRihFTkdJTkVfUElMRSkgcGlsZXM7CisJfTsgLyogRU5HSU5FX1RBQkxFICovCisKKwordHlwZWRlZiBzdHJ1Y3Qgc3RfZW5naW5lX3BpbGVfZG9hbGwKKwl7CisJZW5naW5lX3RhYmxlX2RvYWxsX2NiICpjYjsKKwl2b2lkICphcmc7CisJfSBFTkdJTkVfUElMRV9ET0FMTDsKKwkKKworLyogR2xvYmFsIGZsYWdzIChFTkdJTkVfVEFCTEVfRkxBR18qKiopLiAqLworc3RhdGljIHVuc2lnbmVkIGludCB0YWJsZV9mbGFncyA9IDA7CisKKy8qIEFQSSBmdW5jdGlvbiBtYW5pcHVsYXRpbmcgJ3RhYmxlX2ZsYWdzJyAqLwordW5zaWduZWQgaW50IEVOR0lORV9nZXRfdGFibGVfZmxhZ3Modm9pZCkKKwl7CisJcmV0dXJuIHRhYmxlX2ZsYWdzOworCX0KKwordm9pZCBFTkdJTkVfc2V0X3RhYmxlX2ZsYWdzKHVuc2lnbmVkIGludCBmbGFncykKKwl7CisJdGFibGVfZmxhZ3MgPSBmbGFnczsKKwl9CisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyBmb3IgdGhlICJwaWxlcyIgaGFzaCB0YWJsZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZW5naW5lX3BpbGVfaGFzaChjb25zdCBFTkdJTkVfUElMRSAqYykKKwl7CisJcmV0dXJuIGMtPm5pZDsKKwl9CisKK3N0YXRpYyBpbnQgZW5naW5lX3BpbGVfY21wKGNvbnN0IEVOR0lORV9QSUxFICphLCBjb25zdCBFTkdJTkVfUElMRSAqYikKKwl7CisJcmV0dXJuIGEtPm5pZCAtIGItPm5pZDsKKwl9CitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0hBU0hfRk4oZW5naW5lX3BpbGUsIEVOR0lORV9QSUxFKQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9DT01QX0ZOKGVuZ2luZV9waWxlLCBFTkdJTkVfUElMRSkKKworc3RhdGljIGludCBpbnRfdGFibGVfY2hlY2soRU5HSU5FX1RBQkxFICoqdCwgaW50IGNyZWF0ZSkKKwl7CisJTEhBU0hfT0YoRU5HSU5FX1BJTEUpICpsaDsKKworCWlmKCp0KSByZXR1cm4gMTsKKwlpZighY3JlYXRlKSByZXR1cm4gMDsKKwlpZigobGggPSBsaF9FTkdJTkVfUElMRV9uZXcoKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJKnQgPSAoRU5HSU5FX1RBQkxFICopbGg7CisJcmV0dXJuIDE7CisJfQorCisvKiBQcml2YXRlbHkgZXhwb3NlZCAodmlhIGVuZ19pbnQuaCkgZnVuY3Rpb25zIGZvciBhZGRpbmcgYW5kL29yIHJlbW92aW5nCisgKiBFTkdJTkVzIGZyb20gdGhlIGltcGxlbWVudGF0aW9uIHRhYmxlICovCitpbnQgZW5naW5lX3RhYmxlX3JlZ2lzdGVyKEVOR0lORV9UQUJMRSAqKnRhYmxlLCBFTkdJTkVfQ0xFQU5VUF9DQiAqY2xlYW51cCwKKwkJRU5HSU5FICplLCBjb25zdCBpbnQgKm5pZHMsIGludCBudW1fbmlkcywgaW50IHNldGRlZmF1bHQpCisJeworCWludCByZXQgPSAwLCBhZGRlZCA9IDA7CisJRU5HSU5FX1BJTEUgdG1wbGF0ZSwgKmZuZDsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJaWYoISgqdGFibGUpKQorCQlhZGRlZCA9IDE7CisJaWYoIWludF90YWJsZV9jaGVjayh0YWJsZSwgMSkpCisJCWdvdG8gZW5kOworCWlmKGFkZGVkKQorCQkvKiBUaGUgY2xlYW51cCBjYWxsYmFjayBuZWVkcyB0byBiZSBhZGRlZCAqLworCQllbmdpbmVfY2xlYW51cF9hZGRfZmlyc3QoY2xlYW51cCk7CisJd2hpbGUobnVtX25pZHMtLSkKKwkJeworCQl0bXBsYXRlLm5pZCA9ICpuaWRzOworCQlmbmQgPSBsaF9FTkdJTkVfUElMRV9yZXRyaWV2ZSgmKCp0YWJsZSktPnBpbGVzLCAmdG1wbGF0ZSk7CisJCWlmKCFmbmQpCisJCQl7CisJCQlmbmQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRU5HSU5FX1BJTEUpKTsKKwkJCWlmKCFmbmQpIGdvdG8gZW5kOworCQkJZm5kLT51cHRvZGF0ZSA9IDE7CisJCQlmbmQtPm5pZCA9ICpuaWRzOworCQkJZm5kLT5zayA9IHNrX0VOR0lORV9uZXdfbnVsbCgpOworCQkJaWYoIWZuZC0+c2spCisJCQkJeworCQkJCU9QRU5TU0xfZnJlZShmbmQpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWZuZC0+ZnVuY3QgPSBOVUxMOworCQkJKHZvaWQpbGhfRU5HSU5FX1BJTEVfaW5zZXJ0KCYoKnRhYmxlKS0+cGlsZXMsIGZuZCk7CisJCQl9CisJCS8qIEEgcmVnaXN0cmF0aW9uIHNob3VsZG4ndCBhZGQgZHVwbGNpYXRlIGVudHJpZXMgKi8KKwkJKHZvaWQpc2tfRU5HSU5FX2RlbGV0ZV9wdHIoZm5kLT5zaywgZSk7CisJCS8qIGlmICdzZXRkZWZhdWx0JywgdGhpcyBFTkdJTkUgZ29lcyB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworCQlpZighc2tfRU5HSU5FX3B1c2goZm5kLT5zaywgZSkpCisJCQlnb3RvIGVuZDsKKwkJLyogInRvdWNoIiB0aGlzIEVOR0lORV9QSUxFICovCisJCWZuZC0+dXB0b2RhdGUgPSAwOworCQlpZihzZXRkZWZhdWx0KQorCQkJeworCQkJaWYoIWVuZ2luZV91bmxvY2tlZF9pbml0KGUpKQorCQkJCXsKKwkJCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX1RBQkxFX1JFR0lTVEVSLAorCQkJCQkJRU5HSU5FX1JfSU5JVF9GQUlMRUQpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWlmKGZuZC0+ZnVuY3QpCisJCQkJZW5naW5lX3VubG9ja2VkX2ZpbmlzaChmbmQtPmZ1bmN0LCAwKTsKKwkJCWZuZC0+ZnVuY3QgPSBlOworCQkJZm5kLT51cHRvZGF0ZSA9IDE7CisJCQl9CisJCW5pZHMrKzsKKwkJfQorCXJldCA9IDE7CitlbmQ6CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJcmV0dXJuIHJldDsKKwl9CitzdGF0aWMgdm9pZCBpbnRfdW5yZWdpc3Rlcl9jYl9kb2FsbF9hcmcoRU5HSU5FX1BJTEUgKnBpbGUsIEVOR0lORSAqZSkKKwl7CisJaW50IG47CisJLyogSXRlcmF0ZSB0aGUgJ2MtPnNrJyBzdGFjayByZW1vdmluZyBhbnkgb2NjdXJhbmNlIG9mICdlJyAqLworCXdoaWxlKChuID0gc2tfRU5HSU5FX2ZpbmQocGlsZS0+c2ssIGUpKSA+PSAwKQorCQl7CisJCSh2b2lkKXNrX0VOR0lORV9kZWxldGUocGlsZS0+c2ssIG4pOworCQlwaWxlLT51cHRvZGF0ZSA9IDA7CisJCX0KKwlpZihwaWxlLT5mdW5jdCA9PSBlKQorCQl7CisJCWVuZ2luZV91bmxvY2tlZF9maW5pc2goZSwgMCk7CisJCXBpbGUtPmZ1bmN0ID0gTlVMTDsKKwkJfQorCX0KK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfRE9BTExfQVJHX0ZOKGludF91bnJlZ2lzdGVyX2NiLCBFTkdJTkVfUElMRSwgRU5HSU5FKQorCit2b2lkIGVuZ2luZV90YWJsZV91bnJlZ2lzdGVyKEVOR0lORV9UQUJMRSAqKnRhYmxlLCBFTkdJTkUgKmUpCisJeworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRU5HSU5FKTsKKwlpZihpbnRfdGFibGVfY2hlY2sodGFibGUsIDApKQorCQlsaF9FTkdJTkVfUElMRV9kb2FsbF9hcmcoJigqdGFibGUpLT5waWxlcywKKwkJCQkJIExIQVNIX0RPQUxMX0FSR19GTihpbnRfdW5yZWdpc3Rlcl9jYiksCisJCQkJCSBFTkdJTkUsIGUpOworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FTkdJTkUpOworCX0KKworc3RhdGljIHZvaWQgaW50X2NsZWFudXBfY2JfZG9hbGwoRU5HSU5FX1BJTEUgKnApCisJeworCXNrX0VOR0lORV9mcmVlKHAtPnNrKTsKKwlpZihwLT5mdW5jdCkKKwkJZW5naW5lX3VubG9ja2VkX2ZpbmlzaChwLT5mdW5jdCwgMCk7CisJT1BFTlNTTF9mcmVlKHApOworCX0KK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfRE9BTExfRk4oaW50X2NsZWFudXBfY2IsIEVOR0lORV9QSUxFKQorCit2b2lkIGVuZ2luZV90YWJsZV9jbGVhbnVwKEVOR0lORV9UQUJMRSAqKnRhYmxlKQorCXsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJaWYoKnRhYmxlKQorCQl7CisJCWxoX0VOR0lORV9QSUxFX2RvYWxsKCYoKnRhYmxlKS0+cGlsZXMsCisJCQkJICAgICBMSEFTSF9ET0FMTF9GTihpbnRfY2xlYW51cF9jYikpOworCQlsaF9FTkdJTkVfUElMRV9mcmVlKCYoKnRhYmxlKS0+cGlsZXMpOworCQkqdGFibGUgPSBOVUxMOworCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VOR0lORSk7CisJfQorCisvKiByZXR1cm4gYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBmb3IgYSBnaXZlbiAnbmlkJyAqLworI2lmbmRlZiBFTkdJTkVfVEFCTEVfREVCVUcKK0VOR0lORSAqZW5naW5lX3RhYmxlX3NlbGVjdChFTkdJTkVfVEFCTEUgKip0YWJsZSwgaW50IG5pZCkKKyNlbHNlCitFTkdJTkUgKmVuZ2luZV90YWJsZV9zZWxlY3RfdG1wKEVOR0lORV9UQUJMRSAqKnRhYmxlLCBpbnQgbmlkLCBjb25zdCBjaGFyICpmLCBpbnQgbCkKKyNlbmRpZgorCXsKKwlFTkdJTkUgKnJldCA9IE5VTEw7CisJRU5HSU5FX1BJTEUgdG1wbGF0ZSwgKmZuZD1OVUxMOworCWludCBpbml0cmVzLCBsb29wID0gMDsKKworCWlmKCEoKnRhYmxlKSkKKwkJeworI2lmZGVmIEVOR0lORV9UQUJMRV9ERUJVRworCQlmcHJpbnRmKHN0ZGVyciwgImVuZ2luZV90YWJsZV9kYmc6ICVzOiVkLCBuaWQ9JWQsIG5vdGhpbmcgIgorCQkJInJlZ2lzdGVyZWQhXG4iLCBmLCBsLCBuaWQpOworI2VuZGlmCisJCXJldHVybiBOVUxMOworCQl9CisJRVJSX3NldF9tYXJrKCk7CisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FTkdJTkUpOworCS8qIENoZWNrIGFnYWluIGluc2lkZSB0aGUgbG9jayBvdGhlcndpc2Ugd2UgY291bGQgcmFjZSBhZ2FpbnN0IGNsZWFudXAKKwkgKiBvcGVyYXRpb25zLiBCdXQgZG9uJ3Qgd29ycnkgYWJvdXQgYSBmcHJpbnRmKHN0ZGVycikuICovCisJaWYoIWludF90YWJsZV9jaGVjayh0YWJsZSwgMCkpIGdvdG8gZW5kOworCXRtcGxhdGUubmlkID0gbmlkOworCWZuZCA9IGxoX0VOR0lORV9QSUxFX3JldHJpZXZlKCYoKnRhYmxlKS0+cGlsZXMsICZ0bXBsYXRlKTsKKwlpZighZm5kKSBnb3RvIGVuZDsKKwlpZihmbmQtPmZ1bmN0ICYmIGVuZ2luZV91bmxvY2tlZF9pbml0KGZuZC0+ZnVuY3QpKQorCQl7CisjaWZkZWYgRU5HSU5FX1RBQkxFX0RFQlVHCisJCWZwcmludGYoc3RkZXJyLCAiZW5naW5lX3RhYmxlX2RiZzogJXM6JWQsIG5pZD0lZCwgdXNpbmcgIgorCQkJIkVOR0lORSAnJXMnIGNhY2hlZFxuIiwgZiwgbCwgbmlkLCBmbmQtPmZ1bmN0LT5pZCk7CisjZW5kaWYKKwkJcmV0ID0gZm5kLT5mdW5jdDsKKwkJZ290byBlbmQ7CisJCX0KKwlpZihmbmQtPnVwdG9kYXRlKQorCQl7CisJCXJldCA9IGZuZC0+ZnVuY3Q7CisJCWdvdG8gZW5kOworCQl9Cit0cnluZXh0OgorCXJldCA9IHNrX0VOR0lORV92YWx1ZShmbmQtPnNrLCBsb29wKyspOworCWlmKCFyZXQpCisJCXsKKyNpZmRlZiBFTkdJTkVfVEFCTEVfREVCVUcKKwkJZnByaW50ZihzdGRlcnIsICJlbmdpbmVfdGFibGVfZGJnOiAlczolZCwgbmlkPSVkLCBubyAiCisJCQkJInJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zIHdvdWxkIGluaXRpYWxpc2VcbiIsCisJCQkJZiwgbCwgbmlkKTsKKyNlbmRpZgorCQlnb3RvIGVuZDsKKwkJfQorCS8qIFRyeSB0byBpbml0aWFsaXNlIHRoZSBFTkdJTkU/ICovCisJaWYoKHJldC0+ZnVuY3RfcmVmID4gMCkgfHwgISh0YWJsZV9mbGFncyAmIEVOR0lORV9UQUJMRV9GTEFHX05PSU5JVCkpCisJCWluaXRyZXMgPSBlbmdpbmVfdW5sb2NrZWRfaW5pdChyZXQpOworCWVsc2UKKwkJaW5pdHJlcyA9IDA7CisJaWYoaW5pdHJlcykKKwkJeworCQkvKiBVcGRhdGUgJ2Z1bmN0JyAqLworCQlpZigoZm5kLT5mdW5jdCAhPSByZXQpICYmIGVuZ2luZV91bmxvY2tlZF9pbml0KHJldCkpCisJCQl7CisJCQkvKiBJZiB0aGVyZSB3YXMgYSBwcmV2aW91cyBkZWZhdWx0IHdlIHJlbGVhc2UgaXQuICovCisJCQlpZihmbmQtPmZ1bmN0KQorCQkJCWVuZ2luZV91bmxvY2tlZF9maW5pc2goZm5kLT5mdW5jdCwgMCk7CisJCQlmbmQtPmZ1bmN0ID0gcmV0OworI2lmZGVmIEVOR0lORV9UQUJMRV9ERUJVRworCQkJZnByaW50ZihzdGRlcnIsICJlbmdpbmVfdGFibGVfZGJnOiAlczolZCwgbmlkPSVkLCAiCisJCQkJInNldHRpbmcgZGVmYXVsdCB0byAnJXMnXG4iLCBmLCBsLCBuaWQsIHJldC0+aWQpOworI2VuZGlmCisJCQl9CisjaWZkZWYgRU5HSU5FX1RBQkxFX0RFQlVHCisJCWZwcmludGYoc3RkZXJyLCAiZW5naW5lX3RhYmxlX2RiZzogJXM6JWQsIG5pZD0lZCwgdXNpbmcgIgorCQkJCSJuZXdseSBpbml0aWFsaXNlZCAnJXMnXG4iLCBmLCBsLCBuaWQsIHJldC0+aWQpOworI2VuZGlmCisJCWdvdG8gZW5kOworCQl9CisJZ290byB0cnluZXh0OworZW5kOgorCS8qIElmIGl0IGZhaWxlZCwgaXQgaXMgdW5saWtlbHkgdG8gc3VjY2VlZCBhZ2FpbiB1bnRpbCBzb21lIGZ1dHVyZQorCSAqIHJlZ2lzdHJhdGlvbnMgaGF2ZSB0YWtlbiBwbGFjZS4gSW4gYWxsIGNhc2VzLCB3ZSBjYWNoZS4gKi8KKwlpZihmbmQpIGZuZC0+dXB0b2RhdGUgPSAxOworI2lmZGVmIEVOR0lORV9UQUJMRV9ERUJVRworCWlmKHJldCkKKwkJZnByaW50ZihzdGRlcnIsICJlbmdpbmVfdGFibGVfZGJnOiAlczolZCwgbmlkPSVkLCBjYWNoaW5nICIKKwkJCQkiRU5HSU5FICclcydcbiIsIGYsIGwsIG5pZCwgcmV0LT5pZCk7CisJZWxzZQorCQlmcHJpbnRmKHN0ZGVyciwgImVuZ2luZV90YWJsZV9kYmc6ICVzOiVkLCBuaWQ9JWQsIGNhY2hpbmcgIgorCQkJCSInbm8gbWF0Y2hpbmcgRU5HSU5FJ1xuIiwgZiwgbCwgbmlkKTsKKyNlbmRpZgorCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FTkdJTkUpOworCS8qIFdoYXRldmVyIGhhcHBlbmVkLCBhbnkgZmFpbGVkIGluaXQoKXMgYXJlIG5vdCBmYWlsdXJlcyBpbiB0aGlzCisJICogY29udGV4dCwgc28gY2xlYXIgb3VyIGVycm9yIHN0YXRlLiAqLworCUVSUl9wb3BfdG9fbWFyaygpOworCXJldHVybiByZXQ7CisJfQorCisvKiBUYWJsZSBlbnVtZXJhdGlvbiAqLworCitzdGF0aWMgdm9pZCBpbnRfY2JfZG9hbGxfYXJnKEVOR0lORV9QSUxFICpwaWxlLCBFTkdJTkVfUElMRV9ET0FMTCAqZGFsbCkKKwl7CisJZGFsbC0+Y2IocGlsZS0+bmlkLCBwaWxlLT5zaywgcGlsZS0+ZnVuY3QsIGRhbGwtPmFyZyk7CisJfQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9ET0FMTF9BUkdfRk4oaW50X2NiLCBFTkdJTkVfUElMRSxFTkdJTkVfUElMRV9ET0FMTCkKKwordm9pZCBlbmdpbmVfdGFibGVfZG9hbGwoRU5HSU5FX1RBQkxFICp0YWJsZSwgZW5naW5lX3RhYmxlX2RvYWxsX2NiICpjYiwKKwkJCQkJCQkJdm9pZCAqYXJnKQorCXsKKwlFTkdJTkVfUElMRV9ET0FMTCBkYWxsOworCWRhbGwuY2IgPSBjYjsKKwlkYWxsLmFyZyA9IGFyZzsKKwlsaF9FTkdJTkVfUElMRV9kb2FsbF9hcmcoJnRhYmxlLT5waWxlcywgTEhBU0hfRE9BTExfQVJHX0ZOKGludF9jYiksCisJCQkJIEVOR0lORV9QSUxFX0RPQUxMLCAmZGFsbCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdpbmUuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZDk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvZW5naW5lLmgKQEAgLTAsMCArMSw4MzAgQEAKKy8qIG9wZW5zc2wvZW5naW5lLmggKi8KKy8qIFdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIChnZW9mZkBnZW9mZnRob3JwZS5uZXQpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBFQ0RIIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisKKyNpZm5kZWYgSEVBREVSX0VOR0lORV9ICisjZGVmaW5lIEhFQURFUl9FTkdJTkVfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNlcnJvciBFTkdJTkUgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKyNpbmNsdWRlIDxvcGVuc3NsL2VjZGguaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC91aS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gY29udHJvbCBjb21iaW5hdGlvbnMgb2YgYWxnb3JpdGhtIChtZXRob2RzKQorICogYnkgYml0d2lzZSAiT1IiaW5nLiAqLworI2RlZmluZSBFTkdJTkVfTUVUSE9EX1JTQQkJKHVuc2lnbmVkIGludCkweDAwMDEKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9EU0EJCSh1bnNpZ25lZCBpbnQpMHgwMDAyCisjZGVmaW5lIEVOR0lORV9NRVRIT0RfREgJCSh1bnNpZ25lZCBpbnQpMHgwMDA0CisjZGVmaW5lIEVOR0lORV9NRVRIT0RfUkFORAkJKHVuc2lnbmVkIGludCkweDAwMDgKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9FQ0RICQkodW5zaWduZWQgaW50KTB4MDAxMAorI2RlZmluZSBFTkdJTkVfTUVUSE9EX0VDRFNBCQkodW5zaWduZWQgaW50KTB4MDAyMAorI2RlZmluZSBFTkdJTkVfTUVUSE9EX0NJUEhFUlMJCSh1bnNpZ25lZCBpbnQpMHgwMDQwCisjZGVmaW5lIEVOR0lORV9NRVRIT0RfRElHRVNUUwkJKHVuc2lnbmVkIGludCkweDAwODAKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9TVE9SRQkJKHVuc2lnbmVkIGludCkweDAxMDAKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9QS0VZX01FVEhTCSh1bnNpZ25lZCBpbnQpMHgwMjAwCisjZGVmaW5lIEVOR0lORV9NRVRIT0RfUEtFWV9BU04xX01FVEhTCSh1bnNpZ25lZCBpbnQpMHgwNDAwCisvKiBPYnZpb3VzIGFsbC1vci1ub3RoaW5nIGNhc2VzLiAqLworI2RlZmluZSBFTkdJTkVfTUVUSE9EX0FMTAkJKHVuc2lnbmVkIGludCkweEZGRkYKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9OT05FCQkodW5zaWduZWQgaW50KTB4MDAwMAorCisvKiBUaGlzKGVzZSkgZmxhZyhzKSBjb250cm9scyBiZWhhdmlvdXIgb2YgdGhlIEVOR0lORV9UQUJMRSBtZWNoYW5pc20gdXNlZAorICogaW50ZXJuYWxseSB0byBjb250cm9sIHJlZ2lzdHJhdGlvbiBvZiBFTkdJTkUgaW1wbGVtZW50YXRpb25zLCBhbmQgY2FuIGJlIHNldAorICogYnkgRU5HSU5FX3NldF90YWJsZV9mbGFncygpLiBUaGUgIk5PSU5JVCIgZmxhZyBwcmV2ZW50cyBhdHRlbXB0cyB0bworICogaW5pdGlhbGlzZSByZWdpc3RlcmVkIEVOR0lORXMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQuICovCisjZGVmaW5lIEVOR0lORV9UQUJMRV9GTEFHX05PSU5JVAkodW5zaWduZWQgaW50KTB4MDAwMQorCisvKiBFTkdJTkUgZmxhZ3MgdGhhdCBjYW4gYmUgc2V0IGJ5IEVOR0lORV9zZXRfZmxhZ3MoKS4gKi8KKy8qICNkZWZpbmUgRU5HSU5FX0ZMQUdTX01BTExPQ0VECTB4MDAwMSAqLyAvKiBOb3QgdXNlZCAqLworCisvKiBUaGlzIGZsYWcgaXMgZm9yIEVOR0lORXMgdGhhdCB3aXNoIHRvIGhhbmRsZSB0aGUgdmFyaW91cyAnQ01EJy1yZWxhdGVkCisgKiBjb250cm9sIGNvbW1hbmRzIG9uIHRoZWlyIG93bi4gV2l0aG91dCB0aGlzIGZsYWcsIEVOR0lORV9jdHJsKCkgaGFuZGxlcyB0aGVzZQorICogY29udHJvbCBjb21tYW5kcyBvbiBiZWhhbGYgb2YgdGhlIEVOR0lORSB1c2luZyB0aGVpciAiY21kX2RlZm5zIiBkYXRhLiAqLworI2RlZmluZSBFTkdJTkVfRkxBR1NfTUFOVUFMX0NNRF9DVFJMCShpbnQpMHgwMDAyCisKKy8qIFRoaXMgZmxhZyBpcyBmb3IgRU5HSU5FcyB3aG8gcmV0dXJuIG5ldyBkdXBsaWNhdGUgc3RydWN0dXJlcyB3aGVuIGZvdW5kIHZpYQorICogIkVOR0lORV9ieV9pZCgpIi4gV2hlbiBhbiBFTkdJTkUgbXVzdCBzdG9yZSBzdGF0ZSAoZWcuIGlmIEVOR0lORV9jdHJsKCkKKyAqIGNvbW1hbmRzIGFyZSBjYWxsZWQgaW4gc2VxdWVuY2UgYXMgcGFydCBvZiBzb21lIHN0YXRlZnVsIHByb2Nlc3MgbGlrZQorICoga2V5LWdlbmVyYXRpb24gc2V0dXAgYW5kIGV4ZWN1dGlvbiksIGl0IGNhbiBzZXQgdGhpcyBmbGFnIC0gdGhlbiBlYWNoIGF0dGVtcHQKKyAqIHRvIG9idGFpbiB0aGUgRU5HSU5FIHdpbGwgcmVzdWx0IGluIGl0IGJlaW5nIGNvcGllZCBpbnRvIGEgbmV3IHN0cnVjdHVyZS4KKyAqIE5vcm1hbGx5LCBFTkdJTkVzIGRvbid0IGRlY2xhcmUgdGhpcyBmbGFnIHNvIEVOR0lORV9ieV9pZCgpIGp1c3QgaW5jcmVtZW50cworICogdGhlIGV4aXN0aW5nIEVOR0lORSdzIHN0cnVjdHVyYWwgcmVmZXJlbmNlIGNvdW50LiAqLworI2RlZmluZSBFTkdJTkVfRkxBR1NfQllfSURfQ09QWQkJKGludCkweDAwMDQKKworLyogRU5HSU5FcyBjYW4gc3VwcG9ydCB0aGVpciBvd24gY29tbWFuZCB0eXBlcywgYW5kIHRoZXNlIGZsYWdzIGFyZSB1c2VkIGluCisgKiBFTkdJTkVfQ1RSTF9HRVRfQ01EX0ZMQUdTIHRvIGluZGljYXRlIHRvIHRoZSBjYWxsZXIgd2hhdCBraW5kIG9mIGlucHV0IGVhY2gKKyAqIGNvbW1hbmQgZXhwZWN0cy4gQ3VycmVudGx5IG9ubHkgbnVtZXJpYyBhbmQgc3RyaW5nIGlucHV0IGlzIHN1cHBvcnRlZC4gSWYgYQorICogY29udHJvbCBjb21tYW5kIHN1cHBvcnRzIG5vbmUgb2YgdGhlIF9OVU1FUklDLCBfU1RSSU5HLCBvciBfTk9fSU5QVVQgb3B0aW9ucywKKyAqIHRoZW4gaXQgaXMgcmVnYXJkZWQgYXMgYW4gImludGVybmFsIiBjb250cm9sIGNvbW1hbmQgLSBhbmQgbm90IGZvciB1c2UgaW4KKyAqIGNvbmZpZyBzZXR0aW5nIHNpdHVhdGlvbnMuIEFzIHN1Y2gsIHRoZXkncmUgbm90IGF2YWlsYWJsZSB0byB0aGUKKyAqIEVOR0lORV9jdHJsX2NtZF9zdHJpbmcoKSBmdW5jdGlvbiwgb25seSByYXcgRU5HSU5FX2N0cmwoKSBhY2Nlc3MuIENoYW5nZXMgdG8KKyAqIHRoaXMgbGlzdCBvZiAnY29tbWFuZCB0eXBlcycgc2hvdWxkIGJlIHJlZmxlY3RlZCBjYXJlZnVsbHkgaW4KKyAqIEVOR0lORV9jbWRfaXNfZXhlY3V0YWJsZSgpIGFuZCBFTkdJTkVfY3RybF9jbWRfc3RyaW5nKCkuICovCisKKy8qIGFjY2VwdHMgYSAnbG9uZycgaW5wdXQgdmFsdWUgKDNyZCBwYXJhbWV0ZXIgdG8gRU5HSU5FX2N0cmwpICovCisjZGVmaW5lIEVOR0lORV9DTURfRkxBR19OVU1FUklDCQkodW5zaWduZWQgaW50KTB4MDAwMQorLyogYWNjZXB0cyBzdHJpbmcgaW5wdXQgKGNhc3QgZnJvbSAndm9pZConIHRvICdjb25zdCBjaGFyIConLCA0dGggcGFyYW1ldGVyIHRvCisgKiBFTkdJTkVfY3RybCkgKi8KKyNkZWZpbmUgRU5HSU5FX0NNRF9GTEFHX1NUUklORwkJKHVuc2lnbmVkIGludCkweDAwMDIKKy8qIEluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sIGNvbW1hbmQgdGFrZXMgKm5vKiBpbnB1dC4gSWUuIHRoZSBjb250cm9sIGNvbW1hbmQKKyAqIGlzIHVucGFyYW1ldGVyaXNlZC4gKi8KKyNkZWZpbmUgRU5HSU5FX0NNRF9GTEFHX05PX0lOUFVUCSh1bnNpZ25lZCBpbnQpMHgwMDA0CisvKiBJbmRpY2F0ZXMgdGhhdCB0aGUgY29udHJvbCBjb21tYW5kIGlzIGludGVybmFsLiBUaGlzIGNvbnRyb2wgY29tbWFuZCB3b24ndAorICogYmUgc2hvd24gaW4gYW55IG91dHB1dCwgYW5kIGlzIG9ubHkgdXNhYmxlIHRocm91Z2ggdGhlIEVOR0lORV9jdHJsX2NtZCgpCisgKiBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgRU5HSU5FX0NNRF9GTEFHX0lOVEVSTkFMCSh1bnNpZ25lZCBpbnQpMHgwMDA4CisKKy8qIE5COiBUaGVzZSAzIGNvbnRyb2wgY29tbWFuZHMgYXJlIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gRU5HSU5FcworICogcmVseWluZyBvbiB0aGVzZSBjb21tYW5kcyBzaG91bGQgY29tcGlsZSBjb25kaXRpb25hbCBzdXBwb3J0IGZvcgorICogY29tcGF0aWJpbGl0eSAoZWcuIGlmIHRoZXNlIHN5bWJvbHMgYXJlIGRlZmluZWQpIGJ1dCBzaG91bGQgYWxzbyBtaWdyYXRlIHRoZQorICogc2FtZSBmdW5jdGlvbmFsaXR5IHRvIHRoZWlyIG93biBFTkdJTkUtc3BlY2lmaWMgY29udHJvbCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUKKyAqICJkaXNjb3ZlcmVkIiBieSBjYWxsaW5nIGFwcGxpY2F0aW9ucy4gVGhlIGZhY3QgdGhlc2UgY29udHJvbCBjb21tYW5kcworICogd291bGRuJ3QgYmUgImV4ZWN1dGFibGUiIChpZS4gdXNhYmxlIGJ5IHRleHQtYmFzZWQgY29uZmlnKSBkb2Vzbid0IGNoYW5nZSB0aGUKKyAqIGZhY3QgdGhhdCBhcHBsaWNhdGlvbiBjb2RlIGNhbiBmaW5kIGFuZCB1c2UgdGhlbSB3aXRob3V0IHJlcXVpcmluZyBwZXItRU5HSU5FCisgKiBoYWNraW5nLiAqLworCisvKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB0byB0ZWxsIHRoZSBjdHJsIGZ1bmN0aW9uIHdoYXQgc2hvdWxkIGJlIGRvbmUuCisgKiBBbGwgY29tbWFuZCBudW1iZXJzIGFyZSBzaGFyZWQgYmV0d2VlbiBhbGwgZW5naW5lcywgZXZlbiBpZiBzb21lIGRvbid0CisgKiBtYWtlIHNlbnNlIHRvIHNvbWUgZW5naW5lcy4gIEluIHN1Y2ggYSBjYXNlLCB0aGV5IGRvIG5vdGhpbmcgYnV0IHJldHVybgorICogdGhlIGVycm9yIEVOR0lORV9SX0NUUkxfQ09NTUFORF9OT1RfSU1QTEVNRU5URUQuICovCisjZGVmaW5lIEVOR0lORV9DVFJMX1NFVF9MT0dTVFJFQU0JCTEKKyNkZWZpbmUgRU5HSU5FX0NUUkxfU0VUX1BBU1NXT1JEX0NBTExCQUNLCTIKKyNkZWZpbmUgRU5HSU5FX0NUUkxfSFVQCQkJCTMgLyogQ2xvc2UgYW5kIHJlaW5pdGlhbGlzZSBhbnkKKwkJCQkJCSAgICAgaGFuZGxlcy9jb25uZWN0aW9ucyBldGMuICovCisjZGVmaW5lIEVOR0lORV9DVFJMX1NFVF9VU0VSX0lOVEVSRkFDRSAgICAgICAgICA0IC8qIEFsdGVybmF0aXZlIHRvIGNhbGxiYWNrICovCisjZGVmaW5lIEVOR0lORV9DVFJMX1NFVF9DQUxMQkFDS19EQVRBICAgICAgICAgICA1IC8qIFVzZXItc3BlY2lmaWMgZGF0YSwgdXNlZAorCQkJCQkJICAgICB3aGVuIGNhbGxpbmcgdGhlIHBhc3N3b3JkCisJCQkJCQkgICAgIGNhbGxiYWNrIGFuZCB0aGUgdXNlcgorCQkJCQkJICAgICBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfTE9BRF9DT05GSUdVUkFUSU9OCQk2IC8qIExvYWQgYSBjb25maWd1cmF0aW9uLCBnaXZlbgorCQkJCQkJICAgICBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYQorCQkJCQkJICAgICBmaWxlIG5hbWUgb3Igc28gKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfTE9BRF9TRUNUSU9OCQk3IC8qIExvYWQgZGF0YSBmcm9tIGEgZ2l2ZW4KKwkJCQkJCSAgICAgc2VjdGlvbiBpbiB0aGUgYWxyZWFkeSBsb2FkZWQKKwkJCQkJCSAgICAgY29uZmlndXJhdGlvbiAqLworCisvKiBUaGVzZSBjb250cm9sIGNvbW1hbmRzIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGRlYWwgd2l0aCBhbiBhcmJpdHJhcnkgZW5naW5lCisgKiBpbiBhIGR5bmFtaWMgd2F5LiBXYXJuOiBOZWdhdGl2ZSByZXR1cm4gdmFsdWVzIGluZGljYXRlIGVycm9ycyBGT1IgVEhFU0UKKyAqIENPTU1BTkRTIGJlY2F1c2UgemVybyBpcyB1c2VkIHRvIGluZGljYXRlICdlbmQtb2YtbGlzdCcuIE90aGVyIGNvbW1hbmRzLAorICogaW5jbHVkaW5nIEVOR0lORS1zcGVjaWZpYyBjb21tYW5kIHR5cGVzLCByZXR1cm4gemVybyBmb3IgYW4gZXJyb3IuCisgKgorICogQW4gRU5HSU5FIGNhbiBjaG9vc2UgdG8gaW1wbGVtZW50IHRoZXNlIGN0cmwgZnVuY3Rpb25zLCBhbmQgY2FuIGludGVybmFsbHkKKyAqIG1hbmFnZSB0aGluZ3MgaG93ZXZlciBpdCBjaG9vc2VzIC0gaXQgZG9lcyBzbyBieSBzZXR0aW5nIHRoZQorICogRU5HSU5FX0ZMQUdTX01BTlVBTF9DTURfQ1RSTCBmbGFnICh1c2luZyBFTkdJTkVfc2V0X2ZsYWdzKCkpLiBPdGhlcndpc2UgdGhlCisgKiBFTkdJTkVfY3RybCgpIGNvZGUgaGFuZGxlcyB0aGlzIG9uIHRoZSBFTkdJTkUncyBiZWhhbGYgdXNpbmcgdGhlIGNtZF9kZWZucworICogZGF0YSAoc2V0IHVzaW5nIEVOR0lORV9zZXRfY21kX2RlZm5zKCkpLiBUaGlzIG1lYW5zIGFuIEVOR0lORSdzIGN0cmwoKQorICogaGFuZGxlciBuZWVkIG9ubHkgaW1wbGVtZW50IGl0cyBvd24gY29tbWFuZHMgLSB0aGUgYWJvdmUgIm1ldGEiIGNvbW1hbmRzIHdpbGwKKyAqIGJlIHRha2VuIGNhcmUgb2YuICovCisKKy8qIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIHN1cHBsaWVkIEVOR0lORSBoYXMgYSBjdHJsKCkgaGFuZGxlci4gSWYgIm5vdCIsIHRoZW4KKyAqIGFsbCB0aGUgcmVtYWluaW5nIGNvbnRyb2wgY29tbWFuZHMgd2lsbCByZXR1cm4gZmFpbHVyZSwgc28gaXQgaXMgd29ydGgKKyAqIGNoZWNraW5nIHRoaXMgZmlyc3QgaWYgdGhlIGNhbGxlciBpcyB0cnlpbmcgdG8gImRpc2NvdmVyIiB0aGUgZW5naW5lJ3MKKyAqIGNhcGFiaWxpdGllcyBhbmQgZG9lc24ndCB3YW50IGVycm9ycyBnZW5lcmF0ZWQgdW5uZWNlc3NhcmlseS4gKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfSEFTX0NUUkxfRlVOQ1RJT04JCTEwCisvKiBSZXR1cm5zIGEgcG9zaXRpdmUgY29tbWFuZCBudW1iZXIgZm9yIHRoZSBmaXJzdCBjb21tYW5kIHN1cHBvcnRlZCBieSB0aGUKKyAqIGVuZ2luZS4gUmV0dXJucyB6ZXJvIGlmIG5vIGN0cmwgY29tbWFuZHMgYXJlIHN1cHBvcnRlZC4gKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfR0VUX0ZJUlNUX0NNRF9UWVBFCQkxMQorLyogVGhlICdsb25nJyBhcmd1bWVudCBzcGVjaWZpZXMgYSBjb21tYW5kIGltcGxlbWVudGVkIGJ5IHRoZSBlbmdpbmUsIGFuZCB0aGUKKyAqIHJldHVybiB2YWx1ZSBpcyB0aGUgbmV4dCBjb21tYW5kIHN1cHBvcnRlZCwgb3IgemVybyBpZiB0aGVyZSBhcmUgbm8gbW9yZS4gKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfR0VUX05FWFRfQ01EX1RZUEUJCTEyCisvKiBUaGUgJ3ZvaWQqJyBhcmd1bWVudCBpcyBhIGNvbW1hbmQgbmFtZSAoY2FzdCBmcm9tICdjb25zdCBjaGFyIConKSwgYW5kIHRoZQorICogcmV0dXJuIHZhbHVlIGlzIHRoZSBjb21tYW5kIHRoYXQgY29ycmVzcG9uZHMgdG8gaXQuICovCisjZGVmaW5lIEVOR0lORV9DVFJMX0dFVF9DTURfRlJPTV9OQU1FCQkxMworLyogVGhlIG5leHQgdHdvIGFsbG93IGEgY29tbWFuZCB0byBiZSBjb252ZXJ0ZWQgaW50byBpdHMgY29ycmVzcG9uZGluZyBzdHJpbmcKKyAqIGZvcm0uIEluIGVhY2ggY2FzZSwgdGhlICdsb25nJyBhcmd1bWVudCBzdXBwbGllcyB0aGUgY29tbWFuZC4gSW4gdGhlIE5BTUVfTEVOCisgKiBjYXNlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQgbmFtZSAobm90IGNvdW50aW5nIGEKKyAqIHRyYWlsaW5nIEVPTCkuIEluIHRoZSBOQU1FIGNhc2UsIHRoZSAndm9pZConIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgYnVmZmVyCisgKiBsYXJnZSBlbm91Z2gsIGFuZCBpdCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIChXSVRIIGEKKyAqIHRyYWlsaW5nIEVPTCkuICovCisjZGVmaW5lIEVOR0lORV9DVFJMX0dFVF9OQU1FX0xFTl9GUk9NX0NNRAkxNAorI2RlZmluZSBFTkdJTkVfQ1RSTF9HRVRfTkFNRV9GUk9NX0NNRAkJMTUKKy8qIFRoZSBuZXh0IHR3byBhcmUgc2ltaWxhciBidXQgZ2l2ZSBhICJzaG9ydCBkZXNjcmlwdGlvbiIgb2YgYSBjb21tYW5kLiAqLworI2RlZmluZSBFTkdJTkVfQ1RSTF9HRVRfREVTQ19MRU5fRlJPTV9DTUQJMTYKKyNkZWZpbmUgRU5HSU5FX0NUUkxfR0VUX0RFU0NfRlJPTV9DTUQJCTE3CisvKiBXaXRoIHRoaXMgY29tbWFuZCwgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgT1InZCBjb21iaW5hdGlvbiBvZgorICogRU5HSU5FX0NNRF9GTEFHXyoqKiB2YWx1ZXMgdGhhdCBpbmRpY2F0ZSB3aGF0IGtpbmQgb2YgaW5wdXQgYSBnaXZlbgorICogZW5naW5lLXNwZWNpZmljIGN0cmwgY29tbWFuZCBleHBlY3RzLiAqLworI2RlZmluZSBFTkdJTkVfQ1RSTF9HRVRfQ01EX0ZMQUdTCQkxOAorCisvKiBFTkdJTkUgaW1wbGVtZW50YXRpb25zIHNob3VsZCBzdGFydCB0aGUgbnVtYmVyaW5nIG9mIHRoZWlyIG93biBjb250cm9sCisgKiBjb21tYW5kcyBmcm9tIHRoaXMgdmFsdWUuIChpZS4gRU5HSU5FX0NNRF9CQVNFLCBFTkdJTkVfQ01EX0JBU0UgKyAxLCBldGMpLiAqLworI2RlZmluZSBFTkdJTkVfQ01EX0JBU0UJCQkJMjAwCisKKy8qIE5COiBUaGVzZSAyIG5DaXBoZXIgImNoaWwiIGNvbnRyb2wgY29tbWFuZHMgYXJlIGRlcHJlY2F0ZWQsIGFuZCB0aGVpcgorICogZnVuY3Rpb25hbGl0eSBpcyBub3cgYXZhaWxhYmxlIHRocm91Z2ggRU5HSU5FLXNwZWNpZmljIGNvbnRyb2wgY29tbWFuZHMKKyAqIChleHBvc2VkIHRocm91Z2ggdGhlIGFib3ZlLW1lbnRpb25lZCAnQ01EJy1oYW5kbGluZykuIENvZGUgdXNpbmcgdGhlc2UgMgorICogY29tbWFuZHMgc2hvdWxkIGJlIG1pZ3JhdGVkIHRvIHRoZSBtb3JlIGdlbmVyYWwgY29tbWFuZCBoYW5kbGluZyBiZWZvcmUgdGhlc2UKKyAqIGFyZSByZW1vdmVkLiAqLworCisvKiBGbGFncyBzcGVjaWZpYyB0byB0aGUgbkNpcGhlciAiY2hpbCIgZW5naW5lICovCisjZGVmaW5lIEVOR0lORV9DVFJMX0NISUxfU0VUX0ZPUktDSEVDSwkJMTAwCisJLyogRGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB0aGUgKGxvbmcpaSBhcmd1bWVudCwgdGhpcyBzZXRzIG9yCisJICogdW5zZXRzIHRoZSBTaW1wbGVGb3JrQ2hlY2sgZmxhZyBpbiB0aGUgQ0hJTCBBUEkgdG8gZW5hYmxlIG9yCisJICogZGlzYWJsZSBjaGVja2luZyBhbmQgd29ya2Fyb3VuZHMgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGZvcmsoKS4KKwkgKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfQ0hJTF9OT19MT0NLSU5HCQkxMDEKKwkvKiBUaGlzIHByZXZlbnRzIHRoZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmcm9tIHByb3ZpZGluZyBtdXRleAorCSAqIGNhbGxiYWNrcyB0byB0aGUgbkNpcGhlciBsaWJyYXJ5LiAqLworCisvKiBJZiBhbiBFTkdJTkUgc3VwcG9ydHMgaXRzIG93biBzcGVjaWZpYyBjb250cm9sIGNvbW1hbmRzIGFuZCB3aXNoZXMgdGhlCisgKiBmcmFtZXdvcmsgdG8gaGFuZGxlIHRoZSBhYm92ZSAnRU5HSU5FX0NNRF8qKionLW1hbmlwdWxhdGlvbiBjb21tYW5kcyBvbiBpdHMKKyAqIGJlaGFsZiwgaXQgc2hvdWxkIHN1cHBseSBhIG51bGwtdGVybWluYXRlZCBhcnJheSBvZiBFTkdJTkVfQ01EX0RFRk4gZW50cmllcworICogdG8gRU5HSU5FX3NldF9jbWRfZGVmbnMoKS4gSXQgc2hvdWxkIGFsc28gaW1wbGVtZW50IGEgY3RybCgpIGhhbmRsZXIgdGhhdAorICogc3VwcG9ydHMgdGhlIHN0YXRlZCBjb21tYW5kcyAoaWUuIHRoZSAiY21kX251bSIgZW50cmllcyBhcyBkZXNjcmliZWQgYnkgdGhlCisgKiBhcnJheSkuIE5COiBUaGUgYXJyYXkgbXVzdCBiZSBvcmRlcmVkIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgY21kX251bS4KKyAqICJudWxsLXRlcm1pbmF0ZWQiIG1lYW5zIHRoYXQgdGhlIGxhc3QgRU5HSU5FX0NNRF9ERUZOIGVsZW1lbnQgaGFzIGNtZF9udW0gc2V0CisgKiB0byB6ZXJvIGFuZC9vciBjbWRfbmFtZSBzZXQgdG8gTlVMTC4gKi8KK3R5cGVkZWYgc3RydWN0IEVOR0lORV9DTURfREVGTl9zdAorCXsKKwl1bnNpZ25lZCBpbnQgY21kX251bTsgLyogVGhlIGNvbW1hbmQgbnVtYmVyICovCisJY29uc3QgY2hhciAqY21kX25hbWU7IC8qIFRoZSBjb21tYW5kIG5hbWUgaXRzZWxmICovCisJY29uc3QgY2hhciAqY21kX2Rlc2M7IC8qIEEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQgKi8KKwl1bnNpZ25lZCBpbnQgY21kX2ZsYWdzOyAvKiBUaGUgaW5wdXQgdGhlIGNvbW1hbmQgZXhwZWN0cyAqLworCX0gRU5HSU5FX0NNRF9ERUZOOworCisvKiBHZW5lcmljIGZ1bmN0aW9uIHBvaW50ZXIgKi8KK3R5cGVkZWYgaW50ICgqRU5HSU5FX0dFTl9GVU5DX1BUUikodm9pZCk7CisvKiBHZW5lcmljIGZ1bmN0aW9uIHBvaW50ZXIgdGFraW5nIG5vIGFyZ3VtZW50cyAqLwordHlwZWRlZiBpbnQgKCpFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUikoRU5HSU5FICopOworLyogU3BlY2lmaWMgY29udHJvbCBmdW5jdGlvbiBwb2ludGVyICovCit0eXBlZGVmIGludCAoKkVOR0lORV9DVFJMX0ZVTkNfUFRSKShFTkdJTkUgKiwgaW50LCBsb25nLCB2b2lkICosIHZvaWQgKCpmKSh2b2lkKSk7CisvKiBHZW5lcmljIGxvYWRfa2V5IGZ1bmN0aW9uIHBvaW50ZXIgKi8KK3R5cGVkZWYgRVZQX1BLRVkgKiAoKkVOR0lORV9MT0FEX0tFWV9QVFIpKEVOR0lORSAqLCBjb25zdCBjaGFyICosCisJVUlfTUVUSE9EICp1aV9tZXRob2QsIHZvaWQgKmNhbGxiYWNrX2RhdGEpOwordHlwZWRlZiBpbnQgKCpFTkdJTkVfU1NMX0NMSUVOVF9DRVJUX1BUUikoRU5HSU5FICosIFNTTCAqc3NsLAorCVNUQUNLX09GKFg1MDlfTkFNRSkgKmNhX2RuLCBYNTA5ICoqcGNlcnQsIEVWUF9QS0VZICoqcGtleSwKKwlTVEFDS19PRihYNTA5KSAqKnBvdGhlciwgVUlfTUVUSE9EICp1aV9tZXRob2QsIHZvaWQgKmNhbGxiYWNrX2RhdGEpOworLyogVGhlc2UgY2FsbGJhY2sgdHlwZXMgYXJlIGZvciBhbiBFTkdJTkUncyBoYW5kbGVyIGZvciBjaXBoZXIgYW5kIGRpZ2VzdCBsb2dpYy4KKyAqIFRoZXNlIGhhbmRsZXJzIGhhdmUgdGhlc2UgcHJvdG90eXBlczsKKyAqICAgaW50IGZvbyhFTkdJTkUgKmUsIGNvbnN0IEVWUF9DSVBIRVIgKipjaXBoZXIsIGNvbnN0IGludCAqKm5pZHMsIGludCBuaWQpOworICogICBpbnQgZm9vKEVOR0lORSAqZSwgY29uc3QgRVZQX01EICoqZGlnZXN0LCBjb25zdCBpbnQgKipuaWRzLCBpbnQgbmlkKTsKKyAqIExvb2tpbmcgYXQgaG93IHRvIGltcGxlbWVudCB0aGVzZSBoYW5kbGVycyBpbiB0aGUgY2FzZSBvZiBjaXBoZXIgc3VwcG9ydCwgaWYKKyAqIHRoZSBmcmFtZXdvcmsgd2FudHMgdGhlIEVWUF9DSVBIRVIgZm9yICduaWQnLCBpdCB3aWxsIGNhbGw7CisgKiAgIGZvbyhlLCAmcF9ldnBfY2lwaGVyLCBOVUxMLCBuaWQpOyAgICAocmV0dXJuIHplcm8gZm9yIGZhaWx1cmUpCisgKiBJZiB0aGUgZnJhbWV3b3JrIHdhbnRzIGEgbGlzdCBvZiBzdXBwb3J0ZWQgJ25pZCdzLCBpdCB3aWxsIGNhbGw7CisgKiAgIGZvbyhlLCBOVUxMLCAmcF9uaWRzLCAwKTsgKHJldHVybnMgbnVtYmVyIG9mICduaWRzJyBvciAtMSBmb3IgZXJyb3IpCisgKi8KKy8qIFJldHVybnMgdG8gYSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBzdXBwb3J0ZWQgY2lwaGVyICduaWQncy4gSWYgdGhlIHNlY29uZAorICogcGFyYW1ldGVyIGlzIG5vbi1OVUxMIGl0IGlzIHNldCB0byB0aGUgc2l6ZSBvZiB0aGUgcmV0dXJuZWQgYXJyYXkuICovCit0eXBlZGVmIGludCAoKkVOR0lORV9DSVBIRVJTX1BUUikoRU5HSU5FICosIGNvbnN0IEVWUF9DSVBIRVIgKiosIGNvbnN0IGludCAqKiwgaW50KTsKK3R5cGVkZWYgaW50ICgqRU5HSU5FX0RJR0VTVFNfUFRSKShFTkdJTkUgKiwgY29uc3QgRVZQX01EICoqLCBjb25zdCBpbnQgKiosIGludCk7Cit0eXBlZGVmIGludCAoKkVOR0lORV9QS0VZX01FVEhTX1BUUikoRU5HSU5FICosIEVWUF9QS0VZX01FVEhPRCAqKiwgY29uc3QgaW50ICoqLCBpbnQpOwordHlwZWRlZiBpbnQgKCpFTkdJTkVfUEtFWV9BU04xX01FVEhTX1BUUikoRU5HSU5FICosIEVWUF9QS0VZX0FTTjFfTUVUSE9EICoqLCBjb25zdCBpbnQgKiosIGludCk7CisvKiBTVFJVQ1RVUkUgZnVuY3Rpb25zIC4uLiBhbGwgb2YgdGhlc2UgZnVuY3Rpb25zIGRlYWwgd2l0aCBwb2ludGVycyB0byBFTkdJTkUKKyAqIHN0cnVjdHVyZXMgd2hlcmUgdGhlIHBvaW50ZXJzIGhhdmUgYSAic3RydWN0dXJhbCByZWZlcmVuY2UiLiBUaGlzIG1lYW5zIHRoYXQKKyAqIHRoZWlyIHJlZmVyZW5jZSBpcyB0byBhbGxvd2VkIGFjY2VzcyB0byB0aGUgc3RydWN0dXJlIGJ1dCBpdCBkb2VzIG5vdCBpbXBseQorICogdGhhdCB0aGUgc3RydWN0dXJlIGlzIGZ1bmN0aW9uYWwuIFRvIHNpbXBseSBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IHRoZQorICogc3RydWN0dXJhbCByZWZlcmVuY2UgY291bnQsIHVzZSBFTkdJTkVfYnlfaWQgYW5kIEVOR0lORV9mcmVlLiBOQjogVGhpcyBpcyBub3QKKyAqIHJlcXVpcmVkIHdoZW4gaXRlcmF0aW5nIHVzaW5nIEVOR0lORV9nZXRfbmV4dCBhcyBpdCB3aWxsIGF1dG9tYXRpY2FsbHkKKyAqIGRlY3JlbWVudCB0aGUgc3RydWN0dXJhbCByZWZlcmVuY2UgY291bnQgb2YgdGhlICJjdXJyZW50IiBFTkdJTkUgYW5kCisgKiBpbmNyZW1lbnQgdGhlIHN0cnVjdHVyYWwgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBFTkdJTkUgaXQgcmV0dXJucyAodW5sZXNzIGl0CisgKiBpcyBOVUxMKS4gKi8KKworLyogR2V0IHRoZSBmaXJzdC9sYXN0ICJFTkdJTkUiIHR5cGUgYXZhaWxhYmxlLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2ZpcnN0KHZvaWQpOworRU5HSU5FICpFTkdJTkVfZ2V0X2xhc3Qodm9pZCk7CisvKiBJdGVyYXRlIHRvIHRoZSBuZXh0L3ByZXZpb3VzICJFTkdJTkUiIHR5cGUgKE5VTEwgPSBlbmQgb2YgdGhlIGxpc3QpLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X25leHQoRU5HSU5FICplKTsKK0VOR0lORSAqRU5HSU5FX2dldF9wcmV2KEVOR0lORSAqZSk7CisvKiBBZGQgYW5vdGhlciAiRU5HSU5FIiB0eXBlIGludG8gdGhlIGFycmF5LiAqLworaW50IEVOR0lORV9hZGQoRU5HSU5FICplKTsKKy8qIFJlbW92ZSBhbiBleGlzdGluZyAiRU5HSU5FIiB0eXBlIGZyb20gdGhlIGFycmF5LiAqLworaW50IEVOR0lORV9yZW1vdmUoRU5HSU5FICplKTsKKy8qIFJldHJpZXZlIGFuIGVuZ2luZSBmcm9tIHRoZSBsaXN0IGJ5IGl0cyB1bmlxdWUgImlkIiB2YWx1ZS4gKi8KK0VOR0lORSAqRU5HSU5FX2J5X2lkKGNvbnN0IGNoYXIgKmlkKTsKKy8qIEFkZCBhbGwgdGhlIGJ1aWx0LWluIGVuZ2luZXMuICovCit2b2lkIEVOR0lORV9sb2FkX29wZW5zc2wodm9pZCk7Cit2b2lkIEVOR0lORV9sb2FkX2R5bmFtaWModm9pZCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1RBVElDX0VOR0lORQordm9pZCBFTkdJTkVfbG9hZF80NzU4Y2NhKHZvaWQpOwordm9pZCBFTkdJTkVfbG9hZF9hZXAodm9pZCk7Cit2b2lkIEVOR0lORV9sb2FkX2F0YWxsYSh2b2lkKTsKK3ZvaWQgRU5HSU5FX2xvYWRfY2hpbCh2b2lkKTsKK3ZvaWQgRU5HSU5FX2xvYWRfY3N3aWZ0KHZvaWQpOwordm9pZCBFTkdJTkVfbG9hZF9udXJvbih2b2lkKTsKK3ZvaWQgRU5HSU5FX2xvYWRfc3VyZXdhcmUodm9pZCk7Cit2b2lkIEVOR0lORV9sb2FkX3Vic2VjKHZvaWQpOwordm9pZCBFTkdJTkVfbG9hZF9wYWRsb2NrKHZvaWQpOwordm9pZCBFTkdJTkVfbG9hZF9jYXBpKHZvaWQpOworI2lmbmRlZiBPUEVOU1NMX05PX0dNUAordm9pZCBFTkdJTkVfbG9hZF9nbXAodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19HT1NUCit2b2lkIEVOR0lORV9sb2FkX2dvc3Qodm9pZCk7CisjZW5kaWYKKyNlbmRpZgordm9pZCBFTkdJTkVfbG9hZF9jcnlwdG9kZXYodm9pZCk7Cit2b2lkIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcyh2b2lkKTsKKworLyogR2V0IGFuZCBzZXQgZ2xvYmFsIGZsYWdzIChFTkdJTkVfVEFCTEVfRkxBR18qKiopIGZvciB0aGUgaW1wbGVtZW50YXRpb24KKyAqICJyZWdpc3RyeSIgaGFuZGxpbmcuICovCit1bnNpZ25lZCBpbnQgRU5HSU5FX2dldF90YWJsZV9mbGFncyh2b2lkKTsKK3ZvaWQgRU5HSU5FX3NldF90YWJsZV9mbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MpOworCisvKiBNYW5hZ2UgcmVnaXN0cmF0aW9uIG9mIEVOR0lORXMgcGVyICJ0YWJsZSIuIEZvciBlYWNoIHR5cGUsIHRoZXJlIGFyZSAzCisgKiBmdW5jdGlvbnM7CisgKiAgIEVOR0lORV9yZWdpc3Rlcl8qKiooZSkgLSByZWdpc3RlcnMgdGhlIGltcGxlbWVudGF0aW9uIGZyb20gJ2UnIChpZiBpdCBoYXMgb25lKQorICogICBFTkdJTkVfdW5yZWdpc3Rlcl8qKiooZSkgLSB1bnJlZ2lzdGVyIHRoZSBpbXBsZW1lbnRhdGlvbiBmcm9tICdlJworICogICBFTkdJTkVfcmVnaXN0ZXJfYWxsXyoqKigpIC0gY2FsbCBFTkdJTkVfcmVnaXN0ZXJfKioqKCkgZm9yIGVhY2ggJ2UnIGluIHRoZSBsaXN0CisgKiBDbGVhbnVwIGlzIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJlZCBmcm9tIGVhY2ggdGFibGUgd2hlbiByZXF1aXJlZCwgc28KKyAqIEVOR0lORV9jbGVhbnVwKCkgd2lsbCByZXZlcnNlIGFueSAicmVnaXN0ZXIiIG9wZXJhdGlvbnMuICovCisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfUlNBKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV91bnJlZ2lzdGVyX1JTQShFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX1JTQSh2b2lkKTsKKworaW50IEVOR0lORV9yZWdpc3Rlcl9EU0EoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfRFNBKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfRFNBKHZvaWQpOworCitpbnQgRU5HSU5FX3JlZ2lzdGVyX0VDREgoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfRUNESChFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX0VDREgodm9pZCk7CisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfRUNEU0EoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfRUNEU0EoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9FQ0RTQSh2b2lkKTsKKworaW50IEVOR0lORV9yZWdpc3Rlcl9ESChFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9ESChFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX0RIKHZvaWQpOworCitpbnQgRU5HSU5FX3JlZ2lzdGVyX1JBTkQoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfUkFORChFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX1JBTkQodm9pZCk7CisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfU1RPUkUoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfU1RPUkUoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9TVE9SRSh2b2lkKTsKKworaW50IEVOR0lORV9yZWdpc3Rlcl9jaXBoZXJzKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV91bnJlZ2lzdGVyX2NpcGhlcnMoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9jaXBoZXJzKHZvaWQpOworCitpbnQgRU5HSU5FX3JlZ2lzdGVyX2RpZ2VzdHMoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfZGlnZXN0cyhFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX2RpZ2VzdHModm9pZCk7CisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfcGtleV9tZXRocyhFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9wa2V5X21ldGhzKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfcGtleV9tZXRocyh2b2lkKTsKKworaW50IEVOR0lORV9yZWdpc3Rlcl9wa2V5X2FzbjFfbWV0aHMoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfcGtleV9hc24xX21ldGhzKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfcGtleV9hc24xX21ldGhzKHZvaWQpOworCisvKiBUaGVzZSBmdW5jdGlvbnMgcmVnaXN0ZXIgYWxsIHN1cHBvcnQgZnJvbSB0aGUgYWJvdmUgY2F0ZWdvcmllcy4gTm90ZSwgdXNlIG9mCisgKiB0aGVzZSBmdW5jdGlvbnMgY2FuIHJlc3VsdCBpbiBzdGF0aWMgbGlua2FnZSBvZiBjb2RlIHlvdXIgYXBwbGljYXRpb24gbWF5IG5vdAorICogbmVlZC4gSWYgeW91IG9ubHkgbmVlZCBhIHN1YnNldCBvZiBmdW5jdGlvbmFsaXR5LCBjb25zaWRlciB1c2luZyBtb3JlCisgKiBzZWxlY3RpdmUgaW5pdGlhbGlzYXRpb24uICovCitpbnQgRU5HSU5FX3JlZ2lzdGVyX2NvbXBsZXRlKEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9jb21wbGV0ZSh2b2lkKTsKKworLyogU2VuZCBwYXJhbWV0cmlzZWQgY29udHJvbCBjb21tYW5kcyB0byB0aGUgZW5naW5lLiBUaGUgcG9zc2liaWxpdGllcyB0byBzZW5kCisgKiBkb3duIGFuIGludGVnZXIsIGEgcG9pbnRlciB0byBkYXRhIG9yIGEgZnVuY3Rpb24gcG9pbnRlciBhcmUgcHJvdmlkZWQuIEFueSBvZgorICogdGhlIHBhcmFtZXRlcnMgbWF5IG9yIG1heSBub3QgYmUgTlVMTCwgZGVwZW5kaW5nIG9uIHRoZSBjb21tYW5kIG51bWJlci4gSW4KKyAqIGFjdHVhbGl0eSwgdGhpcyBmdW5jdGlvbiBvbmx5IHJlcXVpcmVzIGEgc3RydWN0dXJhbCAocmF0aGVyIHRoYW4gZnVuY3Rpb25hbCkKKyAqIHJlZmVyZW5jZSB0byBhbiBlbmdpbmUsIGJ1dCBtYW55IGNvbnRyb2wgY29tbWFuZHMgbWF5IHJlcXVpcmUgdGhlIGVuZ2luZSBiZQorICogZnVuY3Rpb25hbC4gVGhlIGNhbGxlciBzaG91bGQgYmUgYXdhcmUgb2YgdHJ5aW5nIGNvbW1hbmRzIHRoYXQgcmVxdWlyZSBhbgorICogb3BlcmF0aW9uYWwgRU5HSU5FLCBhbmQgb25seSB1c2UgZnVuY3Rpb25hbCByZWZlcmVuY2VzIGluIHN1Y2ggc2l0dWF0aW9ucy4gKi8KK2ludCBFTkdJTkVfY3RybChFTkdJTkUgKmUsIGludCBjbWQsIGxvbmcgaSwgdm9pZCAqcCwgdm9pZCAoKmYpKHZvaWQpKTsKKworLyogVGhpcyBmdW5jdGlvbiB0ZXN0cyBpZiBhbiBFTkdJTkUtc3BlY2lmaWMgY29tbWFuZCBpcyB1c2FibGUgYXMgYSAic2V0dGluZyIuCisgKiBFZy4gaW4gYW4gYXBwbGljYXRpb24ncyBjb25maWcgZmlsZSB0aGF0IGdldHMgcHJvY2Vzc2VkIHRocm91Z2gKKyAqIEVOR0lORV9jdHJsX2NtZF9zdHJpbmcoKS4gSWYgdGhpcyByZXR1cm5zIHplcm8sIGl0IGlzIG5vdCBhdmFpbGFibGUgdG8KKyAqIEVOR0lORV9jdHJsX2NtZF9zdHJpbmcoKSwgb25seSBFTkdJTkVfY3RybCgpLiAqLworaW50IEVOR0lORV9jbWRfaXNfZXhlY3V0YWJsZShFTkdJTkUgKmUsIGludCBjbWQpOworCisvKiBUaGlzIGZ1bmN0aW9uIHdvcmtzIGxpa2UgRU5HSU5FX2N0cmwoKSB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGFraW5nIGEKKyAqIGNvbW1hbmQgbmFtZSBpbnN0ZWFkIG9mIGEgY29tbWFuZCBudW1iZXIsIGFuZCBjYW4gaGFuZGxlIG9wdGlvbmFsIGNvbW1hbmRzLgorICogU2VlIHRoZSBjb21tZW50IG9uIEVOR0lORV9jdHJsX2NtZF9zdHJpbmcoKSBmb3IgYW4gZXhwbGFuYXRpb24gb24gaG93IHRvCisgKiB1c2UgdGhlIGNtZF9uYW1lIGFuZCBjbWRfb3B0aW9uYWwuICovCitpbnQgRU5HSU5FX2N0cmxfY21kKEVOR0lORSAqZSwgY29uc3QgY2hhciAqY21kX25hbWUsCisgICAgICAgIGxvbmcgaSwgdm9pZCAqcCwgdm9pZCAoKmYpKHZvaWQpLCBpbnQgY21kX29wdGlvbmFsKTsKKworLyogVGhpcyBmdW5jdGlvbiBwYXNzZXMgYSBjb21tYW5kLW5hbWUgYW5kIGFyZ3VtZW50IHRvIGFuIEVOR0lORS4gVGhlIGNtZF9uYW1lCisgKiBpcyBjb252ZXJ0ZWQgdG8gYSBjb21tYW5kIG51bWJlciBhbmQgdGhlIGNvbnRyb2wgY29tbWFuZCBpcyBjYWxsZWQgdXNpbmcKKyAqICdhcmcnIGFzIGFuIGFyZ3VtZW50ICh1bmxlc3MgdGhlIEVOR0lORSBkb2Vzbid0IHN1cHBvcnQgc3VjaCBhIGNvbW1hbmQsIGluCisgKiB3aGljaCBjYXNlIG5vIGNvbnRyb2wgY29tbWFuZCBpcyBjYWxsZWQpLiBUaGUgY29tbWFuZCBpcyBjaGVja2VkIGZvciBpbnB1dAorICogZmxhZ3MsIGFuZCBpZiBuZWNlc3NhcnkgdGhlIGFyZ3VtZW50IHdpbGwgYmUgY29udmVydGVkIHRvIGEgbnVtZXJpYyB2YWx1ZS4gSWYKKyAqIGNtZF9vcHRpb25hbCBpcyBub24temVybywgdGhlbiBpZiB0aGUgRU5HSU5FIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZ2l2ZW4KKyAqIGNtZF9uYW1lIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBzdWNjZXNzIGFueXdheS4gVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZAorICogZm9yIGFwcGxpY2F0aW9ucyB0byB1c2Ugc28gdGhhdCB1c2VycyAob3IgY29uZmlnIGZpbGVzKSBjYW4gc3VwcGx5CisgKiBlbmdpbmUtc3BlY2lmaWMgY29uZmlnIGRhdGEgdG8gdGhlIEVOR0lORSBhdCBydW4tdGltZSB0byBjb250cm9sIGJlaGF2aW91ciBvZgorICogc3BlY2lmaWMgZW5naW5lcy4gQXMgc3VjaCwgaXQgc2hvdWxkbid0IGJlIHVzZWQgZm9yIGNhbGxpbmcgRU5HSU5FX2N0cmwoKQorICogZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGRhdGEsIGRlYWwgd2l0aCBiaW5hcnkgZGF0YSwgb3IgdGhhdCBhcmUgb3RoZXJ3aXNlCisgKiBzdXBwb3NlZCB0byBiZSB1c2VkIGRpcmVjdGx5IHRocm91Z2ggRU5HSU5FX2N0cmwoKSBpbiBhcHBsaWNhdGlvbiBjb2RlLiBBbnkKKyAqICJyZXR1cm4iIGRhdGEgZnJvbSBhbiBFTkdJTkVfY3RybCgpIG9wZXJhdGlvbiBpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgbG9zdCAtCisgKiB0aGUgcmV0dXJuIHZhbHVlIGlzIGludGVycHJldGVkIGFzIGZhaWx1cmUgaWYgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvLAorICogc3VjY2VzcyBvdGhlcndpc2UsIGFuZCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHZhbHVlIGFzIGEgcmVzdWx0LiBJbgorICogb3RoZXIgd29yZHMsIHZlbmRvcnMgb2YgJ0VOR0lORSctZW5hYmxlZCBkZXZpY2VzIHNob3VsZCB3cml0ZSBFTkdJTkUKKyAqIGltcGxlbWVudGF0aW9ucyB3aXRoIHBhcmFtZXRlcmlzYXRpb25zIHRoYXQgd29yayBpbiB0aGlzIHNjaGVtZSwgc28gdGhhdAorICogY29tcGxpYW50IEVOR0lORS1iYXNlZCBhcHBsaWNhdGlvbnMgY2FuIHdvcmsgY29uc2lzdGVudGx5IHdpdGggdGhlIHNhbWUKKyAqIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzYW1lIEVOR0lORS1lbmFibGVkIGRldmljZXMsIGFjcm9zcyBhcHBsaWNhdGlvbnMuICovCitpbnQgRU5HSU5FX2N0cmxfY21kX3N0cmluZyhFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmNtZF9uYW1lLCBjb25zdCBjaGFyICphcmcsCisJCQkJaW50IGNtZF9vcHRpb25hbCk7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZnVsIGZvciBtYW51ZmFjdHVyaW5nIG5ldyBFTkdJTkUgc3RydWN0dXJlcy4gVGhleQorICogZG9uJ3QgYWRkcmVzcyByZWZlcmVuY2UgY291bnRpbmcgYXQgYWxsIC0gb25lIHVzZXMgdGhlbSB0byBwb3B1bGF0ZSBhbiBFTkdJTkUKKyAqIHN0cnVjdHVyZSB3aXRoIHBlcnNvbmFsaXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpbmdzIHByaW9yIHRvIHVzaW5nIGl0CisgKiBkaXJlY3RseSBvciBhZGRpbmcgaXQgdG8gdGhlIGJ1aWx0aW4gRU5HSU5FIGxpc3QgaW4gT3BlblNTTC4gVGhlc2UgYXJlIGFsc28KKyAqIGhlcmUgc28gdGhhdCB0aGUgRU5HSU5FIHN0cnVjdHVyZSBkb2Vzbid0IGhhdmUgdG8gYmUgZXhwb3NlZCBhbmQgYnJlYWsgYmluYXJ5CisgKiBjb21wYXRpYmlsaXR5ISAqLworRU5HSU5FICpFTkdJTkVfbmV3KHZvaWQpOworaW50IEVOR0lORV9mcmVlKEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX3VwX3JlZihFTkdJTkUgKmUpOworaW50IEVOR0lORV9zZXRfaWQoRU5HSU5FICplLCBjb25zdCBjaGFyICppZCk7CitpbnQgRU5HSU5FX3NldF9uYW1lKEVOR0lORSAqZSwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgRU5HSU5FX3NldF9SU0EoRU5HSU5FICplLCBjb25zdCBSU0FfTUVUSE9EICpyc2FfbWV0aCk7CitpbnQgRU5HSU5FX3NldF9EU0EoRU5HSU5FICplLCBjb25zdCBEU0FfTUVUSE9EICpkc2FfbWV0aCk7CitpbnQgRU5HSU5FX3NldF9FQ0RIKEVOR0lORSAqZSwgY29uc3QgRUNESF9NRVRIT0QgKmVjZGhfbWV0aCk7CitpbnQgRU5HSU5FX3NldF9FQ0RTQShFTkdJTkUgKmUsIGNvbnN0IEVDRFNBX01FVEhPRCAqZWNkc2FfbWV0aCk7CitpbnQgRU5HSU5FX3NldF9ESChFTkdJTkUgKmUsIGNvbnN0IERIX01FVEhPRCAqZGhfbWV0aCk7CitpbnQgRU5HSU5FX3NldF9SQU5EKEVOR0lORSAqZSwgY29uc3QgUkFORF9NRVRIT0QgKnJhbmRfbWV0aCk7CitpbnQgRU5HSU5FX3NldF9TVE9SRShFTkdJTkUgKmUsIGNvbnN0IFNUT1JFX01FVEhPRCAqc3RvcmVfbWV0aCk7CitpbnQgRU5HSU5FX3NldF9kZXN0cm95X2Z1bmN0aW9uKEVOR0lORSAqZSwgRU5HSU5FX0dFTl9JTlRfRlVOQ19QVFIgZGVzdHJveV9mKTsKK2ludCBFTkdJTkVfc2V0X2luaXRfZnVuY3Rpb24oRU5HSU5FICplLCBFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUiBpbml0X2YpOworaW50IEVOR0lORV9zZXRfZmluaXNoX2Z1bmN0aW9uKEVOR0lORSAqZSwgRU5HSU5FX0dFTl9JTlRfRlVOQ19QVFIgZmluaXNoX2YpOworaW50IEVOR0lORV9zZXRfY3RybF9mdW5jdGlvbihFTkdJTkUgKmUsIEVOR0lORV9DVFJMX0ZVTkNfUFRSIGN0cmxfZik7CitpbnQgRU5HSU5FX3NldF9sb2FkX3ByaXZrZXlfZnVuY3Rpb24oRU5HSU5FICplLCBFTkdJTkVfTE9BRF9LRVlfUFRSIGxvYWRwcml2X2YpOworaW50IEVOR0lORV9zZXRfbG9hZF9wdWJrZXlfZnVuY3Rpb24oRU5HSU5FICplLCBFTkdJTkVfTE9BRF9LRVlfUFRSIGxvYWRwdWJfZik7CitpbnQgRU5HSU5FX3NldF9sb2FkX3NzbF9jbGllbnRfY2VydF9mdW5jdGlvbihFTkdJTkUgKmUsCisJCQkJRU5HSU5FX1NTTF9DTElFTlRfQ0VSVF9QVFIgbG9hZHNzbF9mKTsKK2ludCBFTkdJTkVfc2V0X2NpcGhlcnMoRU5HSU5FICplLCBFTkdJTkVfQ0lQSEVSU19QVFIgZik7CitpbnQgRU5HSU5FX3NldF9kaWdlc3RzKEVOR0lORSAqZSwgRU5HSU5FX0RJR0VTVFNfUFRSIGYpOworaW50IEVOR0lORV9zZXRfcGtleV9tZXRocyhFTkdJTkUgKmUsIEVOR0lORV9QS0VZX01FVEhTX1BUUiBmKTsKK2ludCBFTkdJTkVfc2V0X3BrZXlfYXNuMV9tZXRocyhFTkdJTkUgKmUsIEVOR0lORV9QS0VZX0FTTjFfTUVUSFNfUFRSIGYpOworaW50IEVOR0lORV9zZXRfZmxhZ3MoRU5HSU5FICplLCBpbnQgZmxhZ3MpOworaW50IEVOR0lORV9zZXRfY21kX2RlZm5zKEVOR0lORSAqZSwgY29uc3QgRU5HSU5FX0NNRF9ERUZOICpkZWZucyk7CisvKiBUaGVzZSBmdW5jdGlvbnMgYWxsb3cgY29udHJvbCBvdmVyIGFueSBwZXItc3RydWN0dXJlIEVOR0lORSBkYXRhLiAqLworaW50IEVOR0lORV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJCUNSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludCBFTkdJTkVfc2V0X2V4X2RhdGEoRU5HSU5FICplLCBpbnQgaWR4LCB2b2lkICphcmcpOwordm9pZCAqRU5HSU5FX2dldF9leF9kYXRhKGNvbnN0IEVOR0lORSAqZSwgaW50IGlkeCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFueXRoaW5nIHRoYXQgbmVlZHMgaXQuIEVnLiB0aGUgRU5HSU5FX2FkZCgpIGZ1bmN0aW9uCisgKiBhdXRvbWF0aWNhbGx5IGVuc3VyZXMgdGhlIGxpc3QgY2xlYW51cCBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHRvIGJlIGNhbGxlZAorICogZnJvbSBFTkdJTkVfY2xlYW51cCgpLiBTaW1pbGFybHksIGFsbCBFTkdJTkVfcmVnaXN0ZXJfKioqIGZ1bmN0aW9ucyBlbnN1cmUKKyAqIEVOR0lORV9jbGVhbnVwKCkgd2lsbCBjbGVhbiB1cCBhZnRlciB0aGVtLiAqLwordm9pZCBFTkdJTkVfY2xlYW51cCh2b2lkKTsKKworLyogVGhlc2UgcmV0dXJuIHZhbHVlcyBmcm9tIHdpdGhpbiB0aGUgRU5HSU5FIHN0cnVjdHVyZS4gVGhlc2UgY2FuIGJlIHVzZWZ1bAorICogd2l0aCBmdW5jdGlvbmFsIHJlZmVyZW5jZXMgYXMgd2VsbCBhcyBzdHJ1Y3R1cmFsIHJlZmVyZW5jZXMgLSBpdCBkZXBlbmRzCisgKiB3aGljaCB5b3Ugb2J0YWluZWQuIFVzaW5nIHRoZSByZXN1bHQgZm9yIGZ1bmN0aW9uYWwgcHVycG9zZXMgaWYgeW91IG9ubHkKKyAqIG9idGFpbmVkIGEgc3RydWN0dXJhbCByZWZlcmVuY2UgbWF5IGJlIHByb2JsZW1hdGljISAqLworY29uc3QgY2hhciAqRU5HSU5FX2dldF9pZChjb25zdCBFTkdJTkUgKmUpOworY29uc3QgY2hhciAqRU5HSU5FX2dldF9uYW1lKGNvbnN0IEVOR0lORSAqZSk7Citjb25zdCBSU0FfTUVUSE9EICpFTkdJTkVfZ2V0X1JTQShjb25zdCBFTkdJTkUgKmUpOworY29uc3QgRFNBX01FVEhPRCAqRU5HSU5FX2dldF9EU0EoY29uc3QgRU5HSU5FICplKTsKK2NvbnN0IEVDREhfTUVUSE9EICpFTkdJTkVfZ2V0X0VDREgoY29uc3QgRU5HSU5FICplKTsKK2NvbnN0IEVDRFNBX01FVEhPRCAqRU5HSU5FX2dldF9FQ0RTQShjb25zdCBFTkdJTkUgKmUpOworY29uc3QgREhfTUVUSE9EICpFTkdJTkVfZ2V0X0RIKGNvbnN0IEVOR0lORSAqZSk7Citjb25zdCBSQU5EX01FVEhPRCAqRU5HSU5FX2dldF9SQU5EKGNvbnN0IEVOR0lORSAqZSk7Citjb25zdCBTVE9SRV9NRVRIT0QgKkVOR0lORV9nZXRfU1RPUkUoY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9HRU5fSU5UX0ZVTkNfUFRSIEVOR0lORV9nZXRfZGVzdHJveV9mdW5jdGlvbihjb25zdCBFTkdJTkUgKmUpOworRU5HSU5FX0dFTl9JTlRfRlVOQ19QVFIgRU5HSU5FX2dldF9pbml0X2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUiBFTkdJTkVfZ2V0X2ZpbmlzaF9mdW5jdGlvbihjb25zdCBFTkdJTkUgKmUpOworRU5HSU5FX0NUUkxfRlVOQ19QVFIgRU5HSU5FX2dldF9jdHJsX2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfTE9BRF9LRVlfUFRSIEVOR0lORV9nZXRfbG9hZF9wcml2a2V5X2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfTE9BRF9LRVlfUFRSIEVOR0lORV9nZXRfbG9hZF9wdWJrZXlfZnVuY3Rpb24oY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9TU0xfQ0xJRU5UX0NFUlRfUFRSIEVOR0lORV9nZXRfc3NsX2NsaWVudF9jZXJ0X2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfQ0lQSEVSU19QVFIgRU5HSU5FX2dldF9jaXBoZXJzKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfRElHRVNUU19QVFIgRU5HSU5FX2dldF9kaWdlc3RzKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfUEtFWV9NRVRIU19QVFIgRU5HSU5FX2dldF9wa2V5X21ldGhzKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfUEtFWV9BU04xX01FVEhTX1BUUiBFTkdJTkVfZ2V0X3BrZXlfYXNuMV9tZXRocyhjb25zdCBFTkdJTkUgKmUpOworY29uc3QgRVZQX0NJUEhFUiAqRU5HSU5FX2dldF9jaXBoZXIoRU5HSU5FICplLCBpbnQgbmlkKTsKK2NvbnN0IEVWUF9NRCAqRU5HSU5FX2dldF9kaWdlc3QoRU5HSU5FICplLCBpbnQgbmlkKTsKK2NvbnN0IEVWUF9QS0VZX01FVEhPRCAqRU5HSU5FX2dldF9wa2V5X21ldGgoRU5HSU5FICplLCBpbnQgbmlkKTsKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICpFTkdJTkVfZ2V0X3BrZXlfYXNuMV9tZXRoKEVOR0lORSAqZSwgaW50IG5pZCk7Citjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRU5HSU5FX2dldF9wa2V5X2FzbjFfbWV0aF9zdHIoRU5HSU5FICplLAorCQkJCQljb25zdCBjaGFyICpzdHIsIGludCBsZW4pOworY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKkVOR0lORV9wa2V5X2FzbjFfZmluZF9zdHIoRU5HSU5FICoqcGUsCisJCQkJCWNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbik7Citjb25zdCBFTkdJTkVfQ01EX0RFRk4gKkVOR0lORV9nZXRfY21kX2RlZm5zKGNvbnN0IEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX2dldF9mbGFncyhjb25zdCBFTkdJTkUgKmUpOworCisvKiBGVU5DVElPTkFMIGZ1bmN0aW9ucy4gVGhlc2UgZnVuY3Rpb25zIGRlYWwgd2l0aCBFTkdJTkUgc3RydWN0dXJlcworICogdGhhdCBoYXZlIChvciB3aWxsKSBiZSBpbml0aWFsaXNlZCBmb3IgdXNlLiBCcm9hZGx5IHNwZWFraW5nLCB0aGUKKyAqIHN0cnVjdHVyYWwgZnVuY3Rpb25zIGFyZSB1c2VmdWwgZm9yIGl0ZXJhdGluZyB0aGUgbGlzdCBvZiBhdmFpbGFibGUKKyAqIGVuZ2luZSB0eXBlcywgY3JlYXRpbmcgbmV3IGVuZ2luZSB0eXBlcywgYW5kIG90aGVyICJsaXN0IiBvcGVyYXRpb25zLgorICogVGhlc2UgZnVuY3Rpb25zIGFjdHVhbGx5IGRlYWwgd2l0aCBFTkdJTkVzIHRoYXQgYXJlIHRvIGJlIHVzZWQuIEFzCisgKiBzdWNoIHRoZXNlIGZ1bmN0aW9ucyBjYW4gZmFpbCAoaWYgYXBwbGljYWJsZSkgd2hlbiBwYXJ0aWN1bGFyCisgKiBlbmdpbmVzIGFyZSB1bmF2YWlsYWJsZSAtIGVnLiBpZiBhIGhhcmR3YXJlIGFjY2VsZXJhdG9yIGlzIG5vdAorICogYXR0YWNoZWQgb3Igbm90IGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4gRWFjaCBFTkdJTkUgaGFzIDIgcmVmZXJlbmNlCisgKiBjb3VudHM7IHN0cnVjdHVyYWwgYW5kIGZ1bmN0aW9uYWwuIEV2ZXJ5IHRpbWUgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZQorICogaXMgb2J0YWluZWQgb3IgcmVsZWFzZWQsIGEgY29ycmVzcG9uZGluZyBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSBpcworICogYXV0b21hdGljYWxseSBvYnRhaW5lZCBvciByZWxlYXNlZCB0b28uICovCisKKy8qIEluaXRpYWxpc2UgYSBlbmdpbmUgdHlwZSBmb3IgdXNlIChvciB1cCBpdHMgcmVmZXJlbmNlIGNvdW50IGlmIGl0J3MKKyAqIGFscmVhZHkgaW4gdXNlKS4gVGhpcyB3aWxsIGZhaWwgaWYgdGhlIGVuZ2luZSBpcyBub3QgY3VycmVudGx5CisgKiBvcGVyYXRpb25hbCBhbmQgY2Fubm90IGluaXRpYWxpc2UuICovCitpbnQgRU5HSU5FX2luaXQoRU5HSU5FICplKTsKKy8qIEZyZWUgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSB0byBhIGVuZ2luZSB0eXBlLiBUaGlzIGRvZXMgbm90IHJlcXVpcmUKKyAqIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvIEVOR0lORV9mcmVlIGFzIGl0IGFsc28gcmVsZWFzZXMgYSBzdHJ1Y3R1cmFsCisgKiByZWZlcmVuY2UuICovCitpbnQgRU5HSU5FX2ZpbmlzaChFTkdJTkUgKmUpOworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBoYW5kbGUga2V5cyB0aGF0IGFyZSBzdG9yZWQgaW4gc29tZSBzZWNvbmRhcnkKKyAqIGxvY2F0aW9uLCBoYW5kbGVkIGJ5IHRoZSBlbmdpbmUuICBUaGUgc3RvcmFnZSBtYXkgYmUgb24gYSBjYXJkIG9yCisgKiB3aGF0ZXZlci4gKi8KK0VWUF9QS0VZICpFTkdJTkVfbG9hZF9wcml2YXRlX2tleShFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmtleV9pZCwKKwlVSV9NRVRIT0QgKnVpX21ldGhvZCwgdm9pZCAqY2FsbGJhY2tfZGF0YSk7CitFVlBfUEtFWSAqRU5HSU5FX2xvYWRfcHVibGljX2tleShFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmtleV9pZCwKKwlVSV9NRVRIT0QgKnVpX21ldGhvZCwgdm9pZCAqY2FsbGJhY2tfZGF0YSk7CitpbnQgRU5HSU5FX2xvYWRfc3NsX2NsaWVudF9jZXJ0KEVOR0lORSAqZSwgU1NMICpzLAorCVNUQUNLX09GKFg1MDlfTkFNRSkgKmNhX2RuLCBYNTA5ICoqcGNlcnQsIEVWUF9QS0VZICoqcHBrZXksCisJU1RBQ0tfT0YoWDUwOSkgKipwb3RoZXIsCisJVUlfTUVUSE9EICp1aV9tZXRob2QsIHZvaWQgKmNhbGxiYWNrX2RhdGEpOworCisvKiBUaGlzIHJldHVybnMgYSBwb2ludGVyIGZvciB0aGUgY3VycmVudCBFTkdJTkUgc3RydWN0dXJlIHRoYXQKKyAqIGlzIChieSBkZWZhdWx0KSBwZXJmb3JtaW5nIGFueSBSU0Egb3BlcmF0aW9ucy4gVGhlIHZhbHVlIHJldHVybmVkCisgKiBpcyBhbiBpbmNyZW1lbnRlZCByZWZlcmVuY2UsIHNvIGl0IHNob3VsZCBiZSBmcmVlJ2QgKEVOR0lORV9maW5pc2gpCisgKiBiZWZvcmUgaXQgaXMgZGlzY2FyZGVkLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfUlNBKHZvaWQpOworLyogU2FtZSBmb3IgdGhlIG90aGVyICJtZXRob2RzIiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfRFNBKHZvaWQpOworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfRUNESCh2b2lkKTsKK0VOR0lORSAqRU5HSU5FX2dldF9kZWZhdWx0X0VDRFNBKHZvaWQpOworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfREgodm9pZCk7CitFTkdJTkUgKkVOR0lORV9nZXRfZGVmYXVsdF9SQU5EKHZvaWQpOworLyogVGhlc2UgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGdldCBhIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIHRvIHBlcmZvcm0KKyAqIGNpcGhlcmluZyBvciBkaWdlc3RpbmcgY29ycmVzcG9uZGluZyB0byAibmlkIi4gKi8KK0VOR0lORSAqRU5HSU5FX2dldF9jaXBoZXJfZW5naW5lKGludCBuaWQpOworRU5HSU5FICpFTkdJTkVfZ2V0X2RpZ2VzdF9lbmdpbmUoaW50IG5pZCk7CitFTkdJTkUgKkVOR0lORV9nZXRfcGtleV9tZXRoX2VuZ2luZShpbnQgbmlkKTsKK0VOR0lORSAqRU5HSU5FX2dldF9wa2V5X2FzbjFfbWV0aF9lbmdpbmUoaW50IG5pZCk7CisKKy8qIFRoaXMgc2V0cyBhIG5ldyBkZWZhdWx0IEVOR0lORSBzdHJ1Y3R1cmUgZm9yIHBlcmZvcm1pbmcgUlNBCisgKiBvcGVyYXRpb25zLiBJZiB0aGUgcmVzdWx0IGlzIG5vbi16ZXJvIChzdWNjZXNzKSB0aGVuIHRoZSBFTkdJTkUKKyAqIHN0cnVjdHVyZSB3aWxsIGhhdmUgaGFkIGl0cyByZWZlcmVuY2UgY291bnQgdXAnZCBzbyB0aGUgY2FsbGVyCisgKiBzaG91bGQgc3RpbGwgZnJlZSB0aGVpciBvd24gcmVmZXJlbmNlICdlJy4gKi8KK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfUlNBKEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX3NldF9kZWZhdWx0X3N0cmluZyhFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmRlZl9saXN0KTsKKy8qIFNhbWUgZm9yIHRoZSBvdGhlciAibWV0aG9kcyIgKi8KK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfRFNBKEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX3NldF9kZWZhdWx0X0VDREgoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfRUNEU0EoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfREgoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfUkFORChFTkdJTkUgKmUpOworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9jaXBoZXJzKEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX3NldF9kZWZhdWx0X2RpZ2VzdHMoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfcGtleV9tZXRocyhFTkdJTkUgKmUpOworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9wa2V5X2FzbjFfbWV0aHMoRU5HSU5FICplKTsKKworLyogVGhlIGNvbWJpbmF0aW9uICJzZXQiIC0gdGhlIGZsYWdzIGFyZSBiaXR3aXNlICJPUiJkIGZyb20gdGhlCisgKiBFTkdJTkVfTUVUSE9EXyoqKiBkZWZpbmVzIGFib3ZlLiBBcyB3aXRoIHRoZSAiRU5HSU5FX3JlZ2lzdGVyX2NvbXBsZXRlKCkiCisgKiBmdW5jdGlvbiwgdGhpcyBmdW5jdGlvbiBjYW4gcmVzdWx0IGluIHVubmVjZXNzYXJ5IHN0YXRpYyBsaW5rYWdlLiBJZiB5b3VyCisgKiBhcHBsaWNhdGlvbiByZXF1aXJlcyBvbmx5IHNwZWNpZmljIGZ1bmN0aW9uYWxpdHksIGNvbnNpZGVyIHVzaW5nIG1vcmUKKyAqIHNlbGVjdGl2ZSBmdW5jdGlvbnMuICovCitpbnQgRU5HSU5FX3NldF9kZWZhdWx0KEVOR0lORSAqZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKKwordm9pZCBFTkdJTkVfYWRkX2NvbmZfbW9kdWxlKHZvaWQpOworCisvKiBEZXByZWNhdGVkIGZ1bmN0aW9ucyAuLi4gKi8KKy8qIGludCBFTkdJTkVfY2xlYXJfZGVmYXVsdHModm9pZCk7ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIERZTkFNSUMgRU5HSU5FIFNVUFBPUlQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQmluYXJ5L2JlaGF2aW91ciBjb21wYXRpYmlsaXR5IGxldmVscyAqLworI2RlZmluZSBPU1NMX0RZTkFNSUNfVkVSU0lPTgkJKHVuc2lnbmVkIGxvbmcpMHgwMDAyMDAwMAorLyogQmluYXJ5IHZlcnNpb25zIG9sZGVyIHRoYW4gdGhpcyBhcmUgdG9vIG9sZCBmb3IgdXMgKHdoZXRoZXIgd2UncmUgYSBsb2FkZXIgb3IKKyAqIGEgbG9hZGVlKSAqLworI2RlZmluZSBPU1NMX0RZTkFNSUNfT0xERVNUCQkodW5zaWduZWQgbG9uZykweDAwMDIwMDAwCisKKy8qIFdoZW4gY29tcGlsaW5nIGFuIEVOR0lORSBlbnRpcmVseSBhcyBhbiBleHRlcm5hbCBzaGFyZWQgbGlicmFyeSwgbG9hZGFibGUgYnkKKyAqIHRoZSAiZHluYW1pYyIgRU5HSU5FLCB0aGVzZSB0eXBlcyBhcmUgbmVlZGVkLiBUaGUgJ2R5bmFtaWNfZm5zJyBzdHJ1Y3R1cmUKKyAqIHR5cGUgcHJvdmlkZXMgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24ncyAob3IgbGlicmFyeSdzKSBlcnJvciBmdW5jdGlvbmFsaXR5CisgKiBhbmQgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb24gcG9pbnRlcnMgdG8gdGhlIGxvYWRlZCBsaWJyYXJ5LiBUaGVzZSBzaG91bGQKKyAqIGJlIHVzZWQvc2V0IGluIHRoZSBsb2FkZWQgbGlicmFyeSBjb2RlIHNvIHRoYXQgdGhlIGxvYWRpbmcgYXBwbGljYXRpb24ncworICogJ3N0YXRlJyB3aWxsIGJlIHVzZWQvY2hhbmdlZCBpbiBhbGwgb3BlcmF0aW9ucy4gVGhlICdzdGF0aWNfc3RhdGUnIHBvaW50ZXIKKyAqIGFsbG93cyB0aGUgbG9hZGVkIGxpYnJhcnkgdG8ga25vdyBpZiBpdCBzaGFyZXMgdGhlIHNhbWUgc3RhdGljIGRhdGEgYXMgdGhlCisgKiBjYWxsaW5nIGFwcGxpY2F0aW9uIChvciBsaWJyYXJ5KSwgYW5kIHRodXMgd2hldGhlciB0aGVzZSBjYWxsYmFja3MgbmVlZCB0byBiZQorICogc2V0IG9yIG5vdC4gKi8KK3R5cGVkZWYgdm9pZCAqKCpkeW5fTUVNX21hbGxvY19jYikoc2l6ZV90KTsKK3R5cGVkZWYgdm9pZCAqKCpkeW5fTUVNX3JlYWxsb2NfY2IpKHZvaWQgKiwgc2l6ZV90KTsKK3R5cGVkZWYgdm9pZCAoKmR5bl9NRU1fZnJlZV9jYikodm9pZCAqKTsKK3R5cGVkZWYgc3RydWN0IHN0X2R5bmFtaWNfTUVNX2ZucyB7CisJZHluX01FTV9tYWxsb2NfY2IJCQltYWxsb2NfY2I7CisJZHluX01FTV9yZWFsbG9jX2NiCQkJcmVhbGxvY19jYjsKKwlkeW5fTUVNX2ZyZWVfY2IJCQkJZnJlZV9jYjsKKwl9IGR5bmFtaWNfTUVNX2ZuczsKKy8qIEZJWE1FOiBQZXJoYXBzIHRoZSBtZW1vcnkgYW5kIGxvY2tpbmcgY29kZSAoY3J5cHRvLmgpIHNob3VsZCBkZWNsYXJlIGFuZCB1c2UKKyAqIHRoZXNlIHR5cGVzIHNvIHdlIChhbmQgYW55IG90aGVyIGRlcGVuZGFudCBjb2RlKSBjYW4gc2ltcGxpZnkgYSBiaXQ/PyAqLwordHlwZWRlZiB2b2lkICgqZHluX2xvY2tfbG9ja2luZ19jYikoaW50LGludCxjb25zdCBjaGFyICosaW50KTsKK3R5cGVkZWYgaW50ICgqZHluX2xvY2tfYWRkX2xvY2tfY2IpKGludCosaW50LGludCxjb25zdCBjaGFyICosaW50KTsKK3R5cGVkZWYgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICooKmR5bl9keW5sb2NrX2NyZWF0ZV9jYikoCisJCQkJCQljb25zdCBjaGFyICosaW50KTsKK3R5cGVkZWYgdm9pZCAoKmR5bl9keW5sb2NrX2xvY2tfY2IpKGludCxzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKiwKKwkJCQkJCWNvbnN0IGNoYXIgKixpbnQpOwordHlwZWRlZiB2b2lkICgqZHluX2R5bmxvY2tfZGVzdHJveV9jYikoc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICosCisJCQkJCQljb25zdCBjaGFyICosaW50KTsKK3R5cGVkZWYgc3RydWN0IHN0X2R5bmFtaWNfTE9DS19mbnMgeworCWR5bl9sb2NrX2xvY2tpbmdfY2IJCQlsb2NrX2xvY2tpbmdfY2I7CisJZHluX2xvY2tfYWRkX2xvY2tfY2IJCQlsb2NrX2FkZF9sb2NrX2NiOworCWR5bl9keW5sb2NrX2NyZWF0ZV9jYgkJCWR5bmxvY2tfY3JlYXRlX2NiOworCWR5bl9keW5sb2NrX2xvY2tfY2IJCQlkeW5sb2NrX2xvY2tfY2I7CisJZHluX2R5bmxvY2tfZGVzdHJveV9jYgkJCWR5bmxvY2tfZGVzdHJveV9jYjsKKwl9IGR5bmFtaWNfTE9DS19mbnM7CisvKiBUaGUgdG9wLWxldmVsIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3Qgc3RfZHluYW1pY19mbnMgeworCXZvaWQgCQkJCQkqc3RhdGljX3N0YXRlOworCWNvbnN0IEVSUl9GTlMJCQkJKmVycl9mbnM7CisJY29uc3QgQ1JZUFRPX0VYX0RBVEFfSU1QTAkJKmV4X2RhdGFfZm5zOworCWR5bmFtaWNfTUVNX2ZucwkJCQltZW1fZm5zOworCWR5bmFtaWNfTE9DS19mbnMJCQlsb2NrX2ZuczsKKwl9IGR5bmFtaWNfZm5zOworCisvKiBUaGUgdmVyc2lvbiBjaGVja2luZyBmdW5jdGlvbiBzaG91bGQgYmUgb2YgdGhpcyBwcm90b3R5cGUuIE5COiBUaGUKKyAqIG9zc2xfdmVyc2lvbiB2YWx1ZSBwYXNzZWQgaW4gaXMgdGhlIE9TU0xfRFlOQU1JQ19WRVJTSU9OIG9mIHRoZSBsb2FkaW5nIGNvZGUuCisgKiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgemVybywgaXQgaW5kaWNhdGVzIGEgKHBvdGVudGlhbCkgdmVyc2lvbgorICogaW5jb21wYXRpYmlsaXR5IGFuZCB0aGUgbG9hZGVkIGxpYnJhcnkgZG9lc24ndCBiZWxpZXZlIGl0IGNhbiBwcm9jZWVkLgorICogT3RoZXJ3aXNlLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIChsYXRlc3QpIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZQorICogbG9hZGluZyBsaWJyYXJ5LiBUaGUgbG9hZGVyIG1heSBzdGlsbCBkZWNpZGUgdGhhdCB0aGUgbG9hZGVkIGNvZGUncyB2ZXJzaW9uCisgKiBpcyB1bnNhdGlzZmFjdG9yeSBhbmQgY291bGQgdmV0byB0aGUgbG9hZC4gVGhlIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvCisgKiBiZSBpbXBsZW1lbnRlZCB3aXRoIHRoZSBzeW1ib2wgbmFtZSAidl9jaGVjayIsIGFuZCBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAqIGNhbiBiZSBmdWxseSBpbnN0YW50aWF0ZWQgd2l0aCBJTVBMRU1FTlRfRFlOQU1JQ19DSEVDS19GTigpLiAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nICgqZHluYW1pY192X2NoZWNrX2ZuKSh1bnNpZ25lZCBsb25nIG9zc2xfdmVyc2lvbik7CisjZGVmaW5lIElNUExFTUVOVF9EWU5BTUlDX0NIRUNLX0ZOKCkgXAorCU9QRU5TU0xfRVhQT1JUIHVuc2lnbmVkIGxvbmcgdl9jaGVjayh1bnNpZ25lZCBsb25nIHYpIHsgXAorCQlpZih2ID49IE9TU0xfRFlOQU1JQ19PTERFU1QpIHJldHVybiBPU1NMX0RZTkFNSUNfVkVSU0lPTjsgXAorCQlyZXR1cm4gMDsgfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0aGUgRU5HSU5FIHN0cnVjdHVyZSB0byBpbml0aWFsaXNlIHdpdGggaXRzIG93bgorICogZnVuY3Rpb24gYW5kIGNvbW1hbmQgc2V0dGluZ3MuIEl0IHNob3VsZCBub3QgYWRqdXN0IHRoZSBzdHJ1Y3R1cmFsIG9yCisgKiBmdW5jdGlvbmFsIHJlZmVyZW5jZSBjb3VudHMuIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLCAoYSkgdGhlIGxvYWQgd2lsbAorICogYmUgYWJvcnRlZCwgKGIpIHRoZSBwcmV2aW91cyBFTkdJTkUgc3RhdGUgd2lsbCBiZSBtZW1jcHknZCBiYWNrIG9udG8gdGhlCisgKiBzdHJ1Y3R1cmUsIGFuZCAoYykgdGhlIHNoYXJlZCBsaWJyYXJ5IHdpbGwgYmUgdW5sb2FkZWQuIFNvIGltcGxlbWVudGF0aW9ucworICogc2hvdWxkIGRvIHRoZWlyIG93biBpbnRlcm5hbCBjbGVhbnVwIGluIGZhaWx1cmUgY2lyY3Vtc3RhbmNlcyBvdGhlcndpc2UgdGhleQorICogY291bGQgbGVhay4gVGhlICdpZCcgcGFyYW1ldGVyLCBpZiBub24tTlVMTCwgcmVwcmVzZW50cyB0aGUgRU5HSU5FIGlkIHRoYXQKKyAqIHRoZSBsb2FkZXIgaXMgbG9va2luZyBmb3IuIElmIHRoaXMgaXMgTlVMTCwgdGhlIHNoYXJlZCBsaWJyYXJ5IGNhbiBjaG9vc2UgdG8KKyAqIHJldHVybiBmYWlsdXJlIG9yIHRvIGluaXRpYWxpc2UgYSAnZGVmYXVsdCcgRU5HSU5FLiBJZiBub24tTlVMTCwgdGhlIHNoYXJlZAorICogbGlicmFyeSBtdXN0IGluaXRpYWxpc2Ugb25seSBhbiBFTkdJTkUgbWF0Y2hpbmcgdGhlIHBhc3NlZCAnaWQnLiBUaGUgZnVuY3Rpb24KKyAqIGlzIGV4cGVjdGVkIHRvIGJlIGltcGxlbWVudGVkIHdpdGggdGhlIHN5bWJvbCBuYW1lICJiaW5kX2VuZ2luZSIuIEEgc3RhbmRhcmQKKyAqIGltcGxlbWVudGF0aW9uIGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBJTVBMRU1FTlRfRFlOQU1JQ19CSU5EX0ZOKGZuKSB3aGVyZQorICogdGhlIHBhcmFtZXRlciAnZm4nIGlzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBwb3B1bGF0ZXMgdGhlIEVOR0lORSBzdHJ1Y3R1cmUKKyAqIGFuZCByZXR1cm5zIGFuIGludCB2YWx1ZSAoemVybyBmb3IgZmFpbHVyZSkuICdmbicgc2hvdWxkIGhhdmUgcHJvdG90eXBlOworICogICAgW3N0YXRpY10gaW50IGZuKEVOR0lORSAqZSwgY29uc3QgY2hhciAqaWQpOyAqLwordHlwZWRlZiBpbnQgKCpkeW5hbWljX2JpbmRfZW5naW5lKShFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmlkLAorCQkJCWNvbnN0IGR5bmFtaWNfZm5zICpmbnMpOworI2RlZmluZSBJTVBMRU1FTlRfRFlOQU1JQ19CSU5EX0ZOKGZuKSBcCisJT1BFTlNTTF9FWFBPUlQgXAorCWludCBiaW5kX2VuZ2luZShFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmlkLCBjb25zdCBkeW5hbWljX2ZucyAqZm5zKSB7IFwKKwkJaWYoRU5HSU5FX2dldF9zdGF0aWNfc3RhdGUoKSA9PSBmbnMtPnN0YXRpY19zdGF0ZSkgZ290byBza2lwX2NiczsgXAorCQlpZighQ1JZUFRPX3NldF9tZW1fZnVuY3Rpb25zKGZucy0+bWVtX2Zucy5tYWxsb2NfY2IsIFwKKwkJCWZucy0+bWVtX2Zucy5yZWFsbG9jX2NiLCBmbnMtPm1lbV9mbnMuZnJlZV9jYikpIFwKKwkJCXJldHVybiAwOyBcCisJCUNSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhmbnMtPmxvY2tfZm5zLmxvY2tfbG9ja2luZ19jYik7IFwKKwkJQ1JZUFRPX3NldF9hZGRfbG9ja19jYWxsYmFjayhmbnMtPmxvY2tfZm5zLmxvY2tfYWRkX2xvY2tfY2IpOyBcCisJCUNSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2soZm5zLT5sb2NrX2Zucy5keW5sb2NrX2NyZWF0ZV9jYik7IFwKKwkJQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2soZm5zLT5sb2NrX2Zucy5keW5sb2NrX2xvY2tfY2IpOyBcCisJCUNSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrKGZucy0+bG9ja19mbnMuZHlubG9ja19kZXN0cm95X2NiKTsgXAorCQlpZighQ1JZUFRPX3NldF9leF9kYXRhX2ltcGxlbWVudGF0aW9uKGZucy0+ZXhfZGF0YV9mbnMpKSBcCisJCQlyZXR1cm4gMDsgXAorCQlpZighRVJSX3NldF9pbXBsZW1lbnRhdGlvbihmbnMtPmVycl9mbnMpKSByZXR1cm4gMDsgXAorCXNraXBfY2JzOiBcCisJCWlmKCFmbihlLGlkKSkgcmV0dXJuIDA7IFwKKwkJcmV0dXJuIDE7IH0KKworLyogSWYgdGhlIGxvYWRpbmcgYXBwbGljYXRpb24gKG9yIGxpYnJhcnkpIGFuZCB0aGUgbG9hZGVkIEVOR0lORSBsaWJyYXJ5IHNoYXJlCisgKiB0aGUgc2FtZSBzdGF0aWMgZGF0YSAoZWcuIHRoZXkncmUgYm90aCBkeW5hbWljYWxseSBsaW5rZWQgdG8gdGhlIHNhbWUKKyAqIGxpYmNyeXB0by5zbykgd2UgbmVlZCBhIHdheSB0byBhdm9pZCB0cnlpbmcgdG8gc2V0IHN5c3RlbSBjYWxsYmFja3MgLSB0aGlzCisgKiB3b3VsZCBmYWlsLCBhbmQgZm9yIHRoZSBzYW1lIHJlYXNvbiB0aGF0IGl0J3MgdW5uZWNlc3NhcnkgdG8gdHJ5LiBJZiB0aGUKKyAqIGxvYWRlZCBFTkdJTkUgaGFzIChvciBnZXRzIGZyb20gdGhyb3VnaCB0aGUgbG9hZGVyKSBpdHMgb3duIGNvcHkgb2YgdGhlCisgKiBsaWJjcnlwdG8gc3RhdGljIGRhdGEsIHdlIHdpbGwgbmVlZCB0byBzZXQgdGhlIGNhbGxiYWNrcy4gVGhlIGVhc2llc3Qgd2F5IHRvCisgKiBkZXRlY3QgdGhpcyBpcyB0byBoYXZlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgcG9pbnRlciB0byBzb21lIHN0YXRpYyBkYXRhCisgKiBhbmQgbGV0IHRoZSBsb2FkaW5nIGFwcGxpY2F0aW9uIGFuZCBsb2FkZWQgRU5HSU5FIGNvbXBhcmUgdGhlaXIgcmVzcGVjdGl2ZQorICogdmFsdWVzLiAqLwordm9pZCAqRU5HSU5FX2dldF9zdGF0aWNfc3RhdGUodm9pZCk7CisKKyNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKEhBVkVfQ1JZUFRPREVWKQordm9pZCBFTkdJTkVfc2V0dXBfYnNkX2NyeXB0b2Rldih2b2lkKTsKKyNlbmRpZgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0VOR0lORV9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIEVOR0lORSBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBFTkdJTkVfRl9EWU5BTUlDX0NUUkwJCQkJIDE4MAorI2RlZmluZSBFTkdJTkVfRl9EWU5BTUlDX0dFVF9EQVRBX0NUWAkJCSAxODEKKyNkZWZpbmUgRU5HSU5FX0ZfRFlOQU1JQ19MT0FECQkJCSAxODIKKyNkZWZpbmUgRU5HSU5FX0ZfRFlOQU1JQ19TRVRfREFUQV9DVFgJCQkgMTgzCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9BREQJCQkJIDEwNQorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfQllfSUQJCQkJIDEwNgorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfQ01EX0lTX0VYRUNVVEFCTEUJCSAxNzAKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0NUUkwJCQkJIDE0MgorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfQ1RSTF9DTUQJCQkgMTc4CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9DVFJMX0NNRF9TVFJJTkcJCQkgMTcxCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9GSU5JU0gJCQkJIDEwNworI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfRlJFRV9VVElMCQkJIDEwOAorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfR0VUX0NJUEhFUgkJCSAxODUKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0dFVF9ERUZBVUxUX1RZUEUJCSAxNzcKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0dFVF9ESUdFU1QJCQkgMTg2CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9HRVRfTkVYVAkJCSAxMTUKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0dFVF9QS0VZX0FTTjFfTUVUSAkJIDE5MworI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfR0VUX1BLRVlfTUVUSAkJCSAxOTIKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0dFVF9QUkVWCQkJIDExNgorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfSU5JVAkJCQkgMTE5CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9MSVNUX0FERAkJCSAxMjAKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0xJU1RfUkVNT1ZFCQkJIDEyMQorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfTE9BRF9QUklWQVRFX0tFWQkJIDE1MAorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfTE9BRF9QVUJMSUNfS0VZCQkJIDE1MQorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfTE9BRF9TU0xfQ0xJRU5UX0NFUlQJCSAxOTQKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX05FVwkJCQkgMTIyCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9SRU1PVkUJCQkJIDEyMworI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfU0VUX0RFRkFVTFRfU1RSSU5HCQkgMTg5CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9TRVRfREVGQVVMVF9UWVBFCQkgMTI2CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9TRVRfSUQJCQkJIDEyOQorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfU0VUX05BTUUJCQkgMTMwCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9UQUJMRV9SRUdJU1RFUgkJCSAxODQKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX1VOTE9BRF9LRVkJCQkgMTUyCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9VTkxPQ0tFRF9GSU5JU0gJCQkgMTkxCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9VUF9SRUYJCQkJIDE5MAorI2RlZmluZSBFTkdJTkVfRl9JTlRfQ1RSTF9IRUxQRVIJCQkgMTcyCisjZGVmaW5lIEVOR0lORV9GX0lOVF9FTkdJTkVfQ09ORklHVVJFCQkJIDE4OAorI2RlZmluZSBFTkdJTkVfRl9JTlRfRU5HSU5FX01PRFVMRV9JTklUCQkJIDE4NworI2RlZmluZSBFTkdJTkVfRl9MT0dfTUVTU0FHRQkJCQkgMTQxCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgRU5HSU5FX1JfQUxSRUFEWV9MT0FERUQJCQkJIDEwMAorI2RlZmluZSBFTkdJTkVfUl9BUkdVTUVOVF9JU19OT1RfQV9OVU1CRVIJCSAxMzMKKyNkZWZpbmUgRU5HSU5FX1JfQ01EX05PVF9FWEVDVVRBQkxFCQkJIDEzNAorI2RlZmluZSBFTkdJTkVfUl9DT01NQU5EX1RBS0VTX0lOUFVUCQkJIDEzNQorI2RlZmluZSBFTkdJTkVfUl9DT01NQU5EX1RBS0VTX05PX0lOUFVUCQkJIDEzNgorI2RlZmluZSBFTkdJTkVfUl9DT05GTElDVElOR19FTkdJTkVfSUQJCQkgMTAzCisjZGVmaW5lIEVOR0lORV9SX0NUUkxfQ09NTUFORF9OT1RfSU1QTEVNRU5URUQJCSAxMTkKKyNkZWZpbmUgRU5HSU5FX1JfREhfTk9UX0lNUExFTUVOVEVECQkJIDEzOQorI2RlZmluZSBFTkdJTkVfUl9EU0FfTk9UX0lNUExFTUVOVEVECQkJIDE0MAorI2RlZmluZSBFTkdJTkVfUl9EU09fRkFJTFVSRQkJCQkgMTA0CisjZGVmaW5lIEVOR0lORV9SX0RTT19OT1RfRk9VTkQJCQkJIDEzMgorI2RlZmluZSBFTkdJTkVfUl9FTkdJTkVTX1NFQ1RJT05fRVJST1IJCQkgMTQ4CisjZGVmaW5lIEVOR0lORV9SX0VOR0lORV9DT05GSUdVUkFUSU9OX0VSUk9SCQkgMTAyCisjZGVmaW5lIEVOR0lORV9SX0VOR0lORV9JU19OT1RfSU5fTElTVAkJCSAxMDUKKyNkZWZpbmUgRU5HSU5FX1JfRU5HSU5FX1NFQ1RJT05fRVJST1IJCQkgMTQ5CisjZGVmaW5lIEVOR0lORV9SX0ZBSUxFRF9MT0FESU5HX1BSSVZBVEVfS0VZCQkgMTI4CisjZGVmaW5lIEVOR0lORV9SX0ZBSUxFRF9MT0FESU5HX1BVQkxJQ19LRVkJCSAxMjkKKyNkZWZpbmUgRU5HSU5FX1JfRklOSVNIX0ZBSUxFRAkJCQkgMTA2CisjZGVmaW5lIEVOR0lORV9SX0dFVF9IQU5ETEVfRkFJTEVECQkJIDEwNworI2RlZmluZSBFTkdJTkVfUl9JRF9PUl9OQU1FX01JU1NJTkcJCQkgMTA4CisjZGVmaW5lIEVOR0lORV9SX0lOSVRfRkFJTEVECQkJCSAxMDkKKyNkZWZpbmUgRU5HSU5FX1JfSU5URVJOQUxfTElTVF9FUlJPUgkJCSAxMTAKKyNkZWZpbmUgRU5HSU5FX1JfSU5WQUxJRF9BUkdVTUVOVAkJCSAxNDMKKyNkZWZpbmUgRU5HSU5FX1JfSU5WQUxJRF9DTURfTkFNRQkJCSAxMzcKKyNkZWZpbmUgRU5HSU5FX1JfSU5WQUxJRF9DTURfTlVNQkVSCQkJIDEzOAorI2RlZmluZSBFTkdJTkVfUl9JTlZBTElEX0lOSVRfVkFMVUUJCQkgMTUxCisjZGVmaW5lIEVOR0lORV9SX0lOVkFMSURfU1RSSU5HCQkJCSAxNTAKKyNkZWZpbmUgRU5HSU5FX1JfTk9UX0lOSVRJQUxJU0VECQkJIDExNworI2RlZmluZSBFTkdJTkVfUl9OT1RfTE9BREVECQkJCSAxMTIKKyNkZWZpbmUgRU5HSU5FX1JfTk9fQ09OVFJPTF9GVU5DVElPTgkJCSAxMjAKKyNkZWZpbmUgRU5HSU5FX1JfTk9fSU5ERVgJCQkJIDE0NAorI2RlZmluZSBFTkdJTkVfUl9OT19MT0FEX0ZVTkNUSU9OCQkJIDEyNQorI2RlZmluZSBFTkdJTkVfUl9OT19SRUZFUkVOQ0UJCQkJIDEzMAorI2RlZmluZSBFTkdJTkVfUl9OT19TVUNIX0VOR0lORQkJCQkgMTE2CisjZGVmaW5lIEVOR0lORV9SX05PX1VOTE9BRF9GVU5DVElPTgkJCSAxMjYKKyNkZWZpbmUgRU5HSU5FX1JfUFJPVklERV9QQVJBTUVURVJTCQkJIDExMworI2RlZmluZSBFTkdJTkVfUl9SU0FfTk9UX0lNUExFTUVOVEVECQkJIDE0MQorI2RlZmluZSBFTkdJTkVfUl9VTklNUExFTUVOVEVEX0NJUEhFUgkJCSAxNDYKKyNkZWZpbmUgRU5HSU5FX1JfVU5JTVBMRU1FTlRFRF9ESUdFU1QJCQkgMTQ3CisjZGVmaW5lIEVOR0lORV9SX1VOSU1QTEVNRU5URURfUFVCTElDX0tFWV9NRVRIT0QJIDEwMQorI2RlZmluZSBFTkdJTkVfUl9WRVJTSU9OX0lOQ09NUEFUSUJJTElUWQkJIDE0NQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdpbmV0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL2VuZ2luZXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ3MGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS9lbmdpbmV0ZXN0LmMKQEAgLTAsMCArMSwyODMgQEAKKy8qIGNyeXB0by9lbmdpbmUvZW5naW5ldGVzdC5jICovCisvKiBXcml0dGVuIGJ5IEdlb2ZmIFRob3JwZSAoZ2VvZmZAZ2VvZmZ0aG9ycGUubmV0KSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworI2lmZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHByaW50ZigiTm8gRU5HSU5FIHN1cHBvcnRcbiIpOworICAgIHJldHVybigwKTsKK30KKyNlbHNlCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworc3RhdGljIHZvaWQgZGlzcGxheV9lbmdpbmVfbGlzdCh2b2lkKQorCXsKKwlFTkdJTkUgKmg7CisJaW50IGxvb3A7CisKKwloID0gRU5HSU5FX2dldF9maXJzdCgpOworCWxvb3AgPSAwOworCXByaW50ZigibGlzdGluZyBhdmFpbGFibGUgZW5naW5lIHR5cGVzXG4iKTsKKwl3aGlsZShoKQorCQl7CisJCXByaW50ZigiZW5naW5lICVpLCBpZCA9IFwiJXNcIiwgbmFtZSA9IFwiJXNcIlxuIiwKKwkJCWxvb3ArKywgRU5HSU5FX2dldF9pZChoKSwgRU5HSU5FX2dldF9uYW1lKGgpKTsKKwkJaCA9IEVOR0lORV9nZXRfbmV4dChoKTsKKwkJfQorCXByaW50ZigiZW5kIG9mIGxpc3RcbiIpOworCS8qIEVOR0lORV9nZXRfZmlyc3QoKSBpbmNyZWFzZXMgdGhlIHN0cnVjdF9yZWYgY291bnRlciwgc28gd2UgCisgICAgICAgICAgIG11c3QgY2FsbCBFTkdJTkVfZnJlZSgpIHRvIGRlY3JlYXNlIGl0IGFnYWluICovCisJRU5HSU5FX2ZyZWUoaCk7CisJfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorCXsKKwlFTkdJTkUgKmJsb2NrWzUxMl07CisJY2hhciBidWZbMjU2XTsKKwljb25zdCBjaGFyICppZCwgKm5hbWU7CisJRU5HSU5FICpwdHI7CisJaW50IGxvb3A7CisJaW50IHRvX3JldHVybiA9IDE7CisJRU5HSU5FICpuZXdfaDEgPSBOVUxMOworCUVOR0lORSAqbmV3X2gyID0gTlVMTDsKKwlFTkdJTkUgKm5ld19oMyA9IE5VTEw7CisJRU5HSU5FICpuZXdfaDQgPSBOVUxMOworCisJLyogZW5hYmxlIG1lbW9yeSBsZWFrIGNoZWNraW5nIHVubGVzcyBleHBsaWNpdGx5IGRpc2FibGVkICovCisJaWYgKCEoKGdldGVudigiT1BFTlNTTF9ERUJVR19NRU1PUlkiKSAhPSBOVUxMKSAmJiAoMCA9PSBzdHJjbXAoZ2V0ZW52KCJPUEVOU1NMX0RFQlVHX01FTU9SWSIpLCAib2ZmIikpKSkKKwkJeworCQlDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKTsKKwkJQ1JZUFRPX3NldF9tZW1fZGVidWdfb3B0aW9ucyhWX0NSWVBUT19NREVCVUdfQUxMKTsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBPUEVOU1NMX0RFQlVHX01FTU9SWT1vZmYgKi8KKwkJQ1JZUFRPX3NldF9tZW1fZGVidWdfZnVuY3Rpb25zKDAsIDAsIDAsIDAsIDApOworCQl9CisJQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pOworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisKKwltZW1zZXQoYmxvY2ssIDAsIDUxMiAqIHNpemVvZihFTkdJTkUgKikpOworCWlmKCgobmV3X2gxID0gRU5HSU5FX25ldygpKSA9PSBOVUxMKSB8fAorCQkJIUVOR0lORV9zZXRfaWQobmV3X2gxLCAidGVzdF9pZDAiKSB8fAorCQkJIUVOR0lORV9zZXRfbmFtZShuZXdfaDEsICJGaXJzdCB0ZXN0IGl0ZW0iKSB8fAorCQkJKChuZXdfaDIgPSBFTkdJTkVfbmV3KCkpID09IE5VTEwpIHx8CisJCQkhRU5HSU5FX3NldF9pZChuZXdfaDIsICJ0ZXN0X2lkMSIpIHx8CisJCQkhRU5HSU5FX3NldF9uYW1lKG5ld19oMiwgIlNlY29uZCB0ZXN0IGl0ZW0iKSB8fAorCQkJKChuZXdfaDMgPSBFTkdJTkVfbmV3KCkpID09IE5VTEwpIHx8CisJCQkhRU5HSU5FX3NldF9pZChuZXdfaDMsICJ0ZXN0X2lkMiIpIHx8CisJCQkhRU5HSU5FX3NldF9uYW1lKG5ld19oMywgIlRoaXJkIHRlc3QgaXRlbSIpIHx8CisJCQkoKG5ld19oNCA9IEVOR0lORV9uZXcoKSkgPT0gTlVMTCkgfHwKKwkJCSFFTkdJTkVfc2V0X2lkKG5ld19oNCwgInRlc3RfaWQzIikgfHwKKwkJCSFFTkdJTkVfc2V0X25hbWUobmV3X2g0LCAiRm91cnRoIHRlc3QgaXRlbSIpKQorCQl7CisJCXByaW50ZigiQ291bGRuJ3Qgc2V0IHVwIHRlc3QgRU5HSU5FIHN0cnVjdHVyZXNcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCXByaW50ZigiXG5lbmdpbmV0ZXN0IGJlZ2lubmluZ1xuXG4iKTsKKwlkaXNwbGF5X2VuZ2luZV9saXN0KCk7CisJaWYoIUVOR0lORV9hZGQobmV3X2gxKSkKKwkJeworCQlwcmludGYoIkFkZCBmYWlsZWQhXG4iKTsKKwkJZ290byBlbmQ7CisJCX0KKwlkaXNwbGF5X2VuZ2luZV9saXN0KCk7CisJcHRyID0gRU5HSU5FX2dldF9maXJzdCgpOworCWlmKCFFTkdJTkVfcmVtb3ZlKHB0cikpCisJCXsKKwkJcHJpbnRmKCJSZW1vdmUgZmFpbGVkIVxuIik7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKHB0cikKKwkJRU5HSU5FX2ZyZWUocHRyKTsKKwlkaXNwbGF5X2VuZ2luZV9saXN0KCk7CisJaWYoIUVOR0lORV9hZGQobmV3X2gzKSB8fCAhRU5HSU5FX2FkZChuZXdfaDIpKQorCQl7CisJCXByaW50ZigiQWRkIGZhaWxlZCFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWRpc3BsYXlfZW5naW5lX2xpc3QoKTsKKwlpZighRU5HSU5FX3JlbW92ZShuZXdfaDIpKQorCQl7CisJCXByaW50ZigiUmVtb3ZlIGZhaWxlZCFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWRpc3BsYXlfZW5naW5lX2xpc3QoKTsKKwlpZighRU5HSU5FX2FkZChuZXdfaDQpKQorCQl7CisJCXByaW50ZigiQWRkIGZhaWxlZCFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWRpc3BsYXlfZW5naW5lX2xpc3QoKTsKKwlpZihFTkdJTkVfYWRkKG5ld19oMykpCisJCXsKKwkJcHJpbnRmKCJBZGQgKnNob3VsZCogaGF2ZSBmYWlsZWQgYnV0IGRpZG4ndCFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWVsc2UKKwkJcHJpbnRmKCJBZGQgdGhhdCBzaG91bGQgZmFpbCBkaWQuXG4iKTsKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKwlpZihFTkdJTkVfcmVtb3ZlKG5ld19oMikpCisJCXsKKwkJcHJpbnRmKCJSZW1vdmUgKnNob3VsZCogaGF2ZSBmYWlsZWQgYnV0IGRpZG4ndCFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWVsc2UKKwkJcHJpbnRmKCJSZW1vdmUgdGhhdCBzaG91bGQgZmFpbCBkaWQuXG4iKTsKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKwlpZighRU5HSU5FX3JlbW92ZShuZXdfaDMpKQorCQl7CisJCXByaW50ZigiUmVtb3ZlIGZhaWxlZCFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWRpc3BsYXlfZW5naW5lX2xpc3QoKTsKKwlpZighRU5HSU5FX3JlbW92ZShuZXdfaDQpKQorCQl7CisJCXByaW50ZigiUmVtb3ZlIGZhaWxlZCFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWRpc3BsYXlfZW5naW5lX2xpc3QoKTsKKwkvKiBEZXBlbmRpbmcgb24gd2hldGhlciB0aGVyZSdzIGFueSBoYXJkd2FyZSBzdXBwb3J0IGNvbXBpbGVkCisJICogaW4sIHRoaXMgcmVtb3ZlIG1heSBiZSBkZXN0aW5lZCB0byBmYWlsLiAqLworCXB0ciA9IEVOR0lORV9nZXRfZmlyc3QoKTsKKwlpZihwdHIpCisJCWlmKCFFTkdJTkVfcmVtb3ZlKHB0cikpCisJCQlwcmludGYoIlJlbW92ZSBmYWlsZWQhaSAtIHByb2JhYmx5IG5vIGhhcmR3YXJlICIKKwkJCQkic3VwcG9ydCBwcmVzZW50LlxuIik7CisJaWYgKHB0cikKKwkJRU5HSU5FX2ZyZWUocHRyKTsKKwlkaXNwbGF5X2VuZ2luZV9saXN0KCk7CisJaWYoIUVOR0lORV9hZGQobmV3X2gxKSB8fCAhRU5HSU5FX3JlbW92ZShuZXdfaDEpKQorCQl7CisJCXByaW50ZigiQ291bGRuJ3QgYWRkIGFuZCByZW1vdmUgdG8gYW4gZW1wdHkgbGlzdCFcbiIpOworCQlnb3RvIGVuZDsKKwkJfQorCWVsc2UKKwkJcHJpbnRmKCJTdWNjZXNzZnVsbHkgYWRkZWQgYW5kIHJlbW92ZWQgdG8gYW4gZW1wdHkgbGlzdCFcbiIpOworCXByaW50ZigiQWJvdXQgdG8gYmVlZiB1cCB0aGUgZW5naW5lLXR5cGUgbGlzdFxuIik7CisJZm9yKGxvb3AgPSAwOyBsb29wIDwgNTEyOyBsb29wKyspCisJCXsKKwkJc3ByaW50ZihidWYsICJpZCVpIiwgbG9vcCk7CisJCWlkID0gQlVGX3N0cmR1cChidWYpOworCQlzcHJpbnRmKGJ1ZiwgIkZha2UgZW5naW5lIHR5cGUgJWkiLCBsb29wKTsKKwkJbmFtZSA9IEJVRl9zdHJkdXAoYnVmKTsKKwkJaWYoKChibG9ja1tsb29wXSA9IEVOR0lORV9uZXcoKSkgPT0gTlVMTCkgfHwKKwkJCQkhRU5HSU5FX3NldF9pZChibG9ja1tsb29wXSwgaWQpIHx8CisJCQkJIUVOR0lORV9zZXRfbmFtZShibG9ja1tsb29wXSwgbmFtZSkpCisJCQl7CisJCQlwcmludGYoIkNvdWxkbid0IGNyZWF0ZSBibG9jayBvZiBFTkdJTkUgc3RydWN0dXJlcy5cbiIKKwkJCQkiSSdsbCBwcm9iYWJseSBhbHNvIGNvcmUtZHVtcCBub3csIGRhbW4uXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisJZm9yKGxvb3AgPSAwOyBsb29wIDwgNTEyOyBsb29wKyspCisJCXsKKwkJaWYoIUVOR0lORV9hZGQoYmxvY2tbbG9vcF0pKQorCQkJeworCQkJcHJpbnRmKCJcbkFkZGluZyBzdG9wcGVkIGF0ICVpLCAoJXMsJXMpXG4iLAorCQkJCWxvb3AsIEVOR0lORV9nZXRfaWQoYmxvY2tbbG9vcF0pLAorCQkJCUVOR0lORV9nZXRfbmFtZShibG9ja1tsb29wXSkpOworCQkJZ290byBjbGVhbnVwX2xvb3A7CisJCQl9CisJCWVsc2UKKwkJCXByaW50ZigiLiIpOyBmZmx1c2goc3Rkb3V0KTsKKwkJfQorY2xlYW51cF9sb29wOgorCXByaW50ZigiXG5BYm91dCB0byBlbXB0eSB0aGUgZW5naW5lLXR5cGUgbGlzdFxuIik7CisJd2hpbGUoKHB0ciA9IEVOR0lORV9nZXRfZmlyc3QoKSkgIT0gTlVMTCkKKwkJeworCQlpZighRU5HSU5FX3JlbW92ZShwdHIpKQorCQkJeworCQkJcHJpbnRmKCJcblJlbW92ZSBmYWlsZWQhXG4iKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlFTkdJTkVfZnJlZShwdHIpOworCQlwcmludGYoIi4iKTsgZmZsdXNoKHN0ZG91dCk7CisJCX0KKwlmb3IobG9vcCA9IDA7IGxvb3AgPCA1MTI7IGxvb3ArKykKKwkJeworCQlPUEVOU1NMX2ZyZWUoKHZvaWQgKilFTkdJTkVfZ2V0X2lkKGJsb2NrW2xvb3BdKSk7CisJCU9QRU5TU0xfZnJlZSgodm9pZCAqKUVOR0lORV9nZXRfbmFtZShibG9ja1tsb29wXSkpOworCQl9CisJcHJpbnRmKCJcblRlc3RzIGNvbXBsZXRlZCBoYXBwaWx5XG4iKTsKKwl0b19yZXR1cm4gPSAwOworZW5kOgorCWlmKHRvX3JldHVybikKKwkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCWlmKG5ld19oMSkgRU5HSU5FX2ZyZWUobmV3X2gxKTsKKwlpZihuZXdfaDIpIEVOR0lORV9mcmVlKG5ld19oMik7CisJaWYobmV3X2gzKSBFTkdJTkVfZnJlZShuZXdfaDMpOworCWlmKG5ld19oNCkgRU5HSU5FX2ZyZWUobmV3X2g0KTsKKwlmb3IobG9vcCA9IDA7IGxvb3AgPCA1MTI7IGxvb3ArKykKKwkJaWYoYmxvY2tbbG9vcF0pCisJCQlFTkdJTkVfZnJlZShibG9ja1tsb29wXSk7CisJRU5HSU5FX2NsZWFudXAoKTsKKwlDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOworCUVSUl9mcmVlX3N0cmluZ3MoKTsKKwlFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShOVUxMKTsKKwlDUllQVE9fbWVtX2xlYWtzX2ZwKHN0ZGVycik7CisJcmV0dXJuIHRvX3JldHVybjsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvdGJfY2lwaGVyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX2NpcGhlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3N2ZjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX2NpcGhlci5jCkBAIC0wLDAgKzEsMTQzIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlICJlbmdfaW50LmgiCisKKy8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgdGhlbiBFTkdJTkVfZ2V0X2NpcGhlcl9lbmdpbmUoKSwgdGhlIGZ1bmN0aW9uIHRoYXQKKyAqIGlzIHVzZWQgYnkgRVZQIHRvIGhvb2sgaW4gY2lwaGVyIGNvZGUgYW5kIGNhY2hlIGRlZmF1bHRzIChldGMpLCB3aWxsIGRpc3BsYXkKKyAqIGJyaWVmIGRlYnVnZ2luZyBzdW1tYXJpZXMgdG8gc3RkZXJyIHdpdGggdGhlICduaWQnLiAqLworLyogI2RlZmluZSBFTkdJTkVfQ0lQSEVSX0RFQlVHICovCisKK3N0YXRpYyBFTkdJTkVfVEFCTEUgKmNpcGhlcl90YWJsZSA9IE5VTEw7CisKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfY2lwaGVycyhFTkdJTkUgKmUpCisJeworCWVuZ2luZV90YWJsZV91bnJlZ2lzdGVyKCZjaXBoZXJfdGFibGUsIGUpOworCX0KKworc3RhdGljIHZvaWQgZW5naW5lX3VucmVnaXN0ZXJfYWxsX2NpcGhlcnModm9pZCkKKwl7CisJZW5naW5lX3RhYmxlX2NsZWFudXAoJmNpcGhlcl90YWJsZSk7CisJfQorCitpbnQgRU5HSU5FX3JlZ2lzdGVyX2NpcGhlcnMoRU5HSU5FICplKQorCXsKKwlpZihlLT5jaXBoZXJzKQorCQl7CisJCWNvbnN0IGludCAqbmlkczsKKwkJaW50IG51bV9uaWRzID0gZS0+Y2lwaGVycyhlLCBOVUxMLCAmbmlkcywgMCk7CisJCWlmKG51bV9uaWRzID4gMCkKKwkJCXJldHVybiBlbmdpbmVfdGFibGVfcmVnaXN0ZXIoJmNpcGhlcl90YWJsZSwKKwkJCQkJZW5naW5lX3VucmVnaXN0ZXJfYWxsX2NpcGhlcnMsIGUsIG5pZHMsCisJCQkJCW51bV9uaWRzLCAwKTsKKwkJfQorCXJldHVybiAxOworCX0KKwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX2NpcGhlcnMoKQorCXsKKwlFTkdJTkUgKmU7CisKKwlmb3IoZT1FTkdJTkVfZ2V0X2ZpcnN0KCkgOyBlIDsgZT1FTkdJTkVfZ2V0X25leHQoZSkpCisJCUVOR0lORV9yZWdpc3Rlcl9jaXBoZXJzKGUpOworCX0KKworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9jaXBoZXJzKEVOR0lORSAqZSkKKwl7CisJaWYoZS0+Y2lwaGVycykKKwkJeworCQljb25zdCBpbnQgKm5pZHM7CisJCWludCBudW1fbmlkcyA9IGUtPmNpcGhlcnMoZSwgTlVMTCwgJm5pZHMsIDApOworCQlpZihudW1fbmlkcyA+IDApCisJCQlyZXR1cm4gZW5naW5lX3RhYmxlX3JlZ2lzdGVyKCZjaXBoZXJfdGFibGUsCisJCQkJCWVuZ2luZV91bnJlZ2lzdGVyX2FsbF9jaXBoZXJzLCBlLCBuaWRzLAorCQkJCQludW1fbmlkcywgMSk7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKy8qIEV4cG9zZWQgQVBJIGZ1bmN0aW9uIHRvIGdldCBhIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGZyb20gdGhlIGltcGxlbWVudGF0aW9uCisgKiB0YWJsZSAoaWUuIHRyeSB0byBnZXQgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSB0YWJsZWQgc3RydWN0dXJhbAorICogcmVmZXJlbmNlcykgZm9yIGEgZ2l2ZW4gY2lwaGVyICduaWQnICovCitFTkdJTkUgKkVOR0lORV9nZXRfY2lwaGVyX2VuZ2luZShpbnQgbmlkKQorCXsKKwlyZXR1cm4gZW5naW5lX3RhYmxlX3NlbGVjdCgmY2lwaGVyX3RhYmxlLCBuaWQpOworCX0KKworLyogT2J0YWlucyBhIGNpcGhlciBpbXBsZW1lbnRhdGlvbiBmcm9tIGFuIEVOR0lORSBmdW5jdGlvbmFsIHJlZmVyZW5jZSAqLworY29uc3QgRVZQX0NJUEhFUiAqRU5HSU5FX2dldF9jaXBoZXIoRU5HSU5FICplLCBpbnQgbmlkKQorCXsKKwljb25zdCBFVlBfQ0lQSEVSICpyZXQ7CisJRU5HSU5FX0NJUEhFUlNfUFRSIGZuID0gRU5HSU5FX2dldF9jaXBoZXJzKGUpOworCWlmKCFmbiB8fCAhZm4oZSwgJnJldCwgTlVMTCwgbmlkKSkKKwkJeworCQlFTkdJTkVlcnIoRU5HSU5FX0ZfRU5HSU5FX0dFVF9DSVBIRVIsCisJCQkJRU5HSU5FX1JfVU5JTVBMRU1FTlRFRF9DSVBIRVIpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCXJldHVybiByZXQ7CisJfQorCisvKiBHZXRzIHRoZSBjaXBoZXIgY2FsbGJhY2sgZnJvbSBhbiBFTkdJTkUgc3RydWN0dXJlICovCitFTkdJTkVfQ0lQSEVSU19QVFIgRU5HSU5FX2dldF9jaXBoZXJzKGNvbnN0IEVOR0lORSAqZSkKKwl7CisJcmV0dXJuIGUtPmNpcGhlcnM7CisJfQorCisvKiBTZXRzIHRoZSBjaXBoZXIgY2FsbGJhY2sgaW4gYW4gRU5HSU5FIHN0cnVjdHVyZSAqLworaW50IEVOR0lORV9zZXRfY2lwaGVycyhFTkdJTkUgKmUsIEVOR0lORV9DSVBIRVJTX1BUUiBmKQorCXsKKwllLT5jaXBoZXJzID0gZjsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX2RoLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX2RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5ZDQyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvdGJfZGguYwpAQCAtMCwwICsxLDExOCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZW5nX2ludC5oIgorCisvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIHRoZW4gRU5HSU5FX2dldF9kZWZhdWx0X0RIKCksIHRoZSBmdW5jdGlvbiB0aGF0IGlzCisgKiB1c2VkIGJ5IERIIHRvIGhvb2sgaW4gaW1wbGVtZW50YXRpb24gY29kZSBhbmQgY2FjaGUgZGVmYXVsdHMgKGV0YyksIHdpbGwKKyAqIGRpc3BsYXkgYnJpZWYgZGVidWdnaW5nIHN1bW1hcmllcyB0byBzdGRlcnIgd2l0aCB0aGUgJ25pZCcuICovCisvKiAjZGVmaW5lIEVOR0lORV9ESF9ERUJVRyAqLworCitzdGF0aWMgRU5HSU5FX1RBQkxFICpkaF90YWJsZSA9IE5VTEw7CitzdGF0aWMgY29uc3QgaW50IGR1bW15X25pZCA9IDE7CisKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfREgoRU5HSU5FICplKQorCXsKKwllbmdpbmVfdGFibGVfdW5yZWdpc3RlcigmZGhfdGFibGUsIGUpOworCX0KKworc3RhdGljIHZvaWQgZW5naW5lX3VucmVnaXN0ZXJfYWxsX0RIKHZvaWQpCisJeworCWVuZ2luZV90YWJsZV9jbGVhbnVwKCZkaF90YWJsZSk7CisJfQorCitpbnQgRU5HSU5FX3JlZ2lzdGVyX0RIKEVOR0lORSAqZSkKKwl7CisJaWYoZS0+ZGhfbWV0aCkKKwkJcmV0dXJuIGVuZ2luZV90YWJsZV9yZWdpc3RlcigmZGhfdGFibGUsCisJCQkJZW5naW5lX3VucmVnaXN0ZXJfYWxsX0RILCBlLCAmZHVtbXlfbmlkLCAxLCAwKTsKKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9ESCgpCisJeworCUVOR0lORSAqZTsKKworCWZvcihlPUVOR0lORV9nZXRfZmlyc3QoKSA7IGUgOyBlPUVOR0lORV9nZXRfbmV4dChlKSkKKwkJRU5HSU5FX3JlZ2lzdGVyX0RIKGUpOworCX0KKworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9ESChFTkdJTkUgKmUpCisJeworCWlmKGUtPmRoX21ldGgpCisJCXJldHVybiBlbmdpbmVfdGFibGVfcmVnaXN0ZXIoJmRoX3RhYmxlLAorCQkJCWVuZ2luZV91bnJlZ2lzdGVyX2FsbF9ESCwgZSwgJmR1bW15X25pZCwgMSwgMSk7CisJcmV0dXJuIDE7CisJfQorCisvKiBFeHBvc2VkIEFQSSBmdW5jdGlvbiB0byBnZXQgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbgorICogdGFibGUgKGllLiB0cnkgdG8gZ2V0IGEgZnVuY3Rpb25hbCByZWZlcmVuY2UgZnJvbSB0aGUgdGFibGVkIHN0cnVjdHVyYWwKKyAqIHJlZmVyZW5jZXMpLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfREgodm9pZCkKKwl7CisJcmV0dXJuIGVuZ2luZV90YWJsZV9zZWxlY3QoJmRoX3RhYmxlLCBkdW1teV9uaWQpOworCX0KKworLyogT2J0YWlucyBhbiBESCBpbXBsZW1lbnRhdGlvbiBmcm9tIGFuIEVOR0lORSBmdW5jdGlvbmFsIHJlZmVyZW5jZSAqLworY29uc3QgREhfTUVUSE9EICpFTkdJTkVfZ2V0X0RIKGNvbnN0IEVOR0lORSAqZSkKKwl7CisJcmV0dXJuIGUtPmRoX21ldGg7CisJfQorCisvKiBTZXRzIGFuIERIIGltcGxlbWVudGF0aW9uIGluIGFuIEVOR0lORSBzdHJ1Y3R1cmUgKi8KK2ludCBFTkdJTkVfc2V0X0RIKEVOR0lORSAqZSwgY29uc3QgREhfTUVUSE9EICpkaF9tZXRoKQorCXsKKwllLT5kaF9tZXRoID0gZGhfbWV0aDsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX2RpZ2VzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS90Yl9kaWdlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y0YmIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS90Yl9kaWdlc3QuYwpAQCAtMCwwICsxLDE0MyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZW5nX2ludC5oIgorCisvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIHRoZW4gRU5HSU5FX2dldF9kaWdlc3RfZW5naW5lKCksIHRoZSBmdW5jdGlvbiB0aGF0CisgKiBpcyB1c2VkIGJ5IEVWUCB0byBob29rIGluIGRpZ2VzdCBjb2RlIGFuZCBjYWNoZSBkZWZhdWx0cyAoZXRjKSwgd2lsbCBkaXNwbGF5CisgKiBicmllZiBkZWJ1Z2dpbmcgc3VtbWFyaWVzIHRvIHN0ZGVyciB3aXRoIHRoZSAnbmlkJy4gKi8KKy8qICNkZWZpbmUgRU5HSU5FX0RJR0VTVF9ERUJVRyAqLworCitzdGF0aWMgRU5HSU5FX1RBQkxFICpkaWdlc3RfdGFibGUgPSBOVUxMOworCit2b2lkIEVOR0lORV91bnJlZ2lzdGVyX2RpZ2VzdHMoRU5HSU5FICplKQorCXsKKwllbmdpbmVfdGFibGVfdW5yZWdpc3RlcigmZGlnZXN0X3RhYmxlLCBlKTsKKwl9CisKK3N0YXRpYyB2b2lkIGVuZ2luZV91bnJlZ2lzdGVyX2FsbF9kaWdlc3RzKHZvaWQpCisJeworCWVuZ2luZV90YWJsZV9jbGVhbnVwKCZkaWdlc3RfdGFibGUpOworCX0KKworaW50IEVOR0lORV9yZWdpc3Rlcl9kaWdlc3RzKEVOR0lORSAqZSkKKwl7CisJaWYoZS0+ZGlnZXN0cykKKwkJeworCQljb25zdCBpbnQgKm5pZHM7CisJCWludCBudW1fbmlkcyA9IGUtPmRpZ2VzdHMoZSwgTlVMTCwgJm5pZHMsIDApOworCQlpZihudW1fbmlkcyA+IDApCisJCQlyZXR1cm4gZW5naW5lX3RhYmxlX3JlZ2lzdGVyKCZkaWdlc3RfdGFibGUsCisJCQkJCWVuZ2luZV91bnJlZ2lzdGVyX2FsbF9kaWdlc3RzLCBlLCBuaWRzLAorCQkJCQludW1fbmlkcywgMCk7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9kaWdlc3RzKCkKKwl7CisJRU5HSU5FICplOworCisJZm9yKGU9RU5HSU5FX2dldF9maXJzdCgpIDsgZSA7IGU9RU5HSU5FX2dldF9uZXh0KGUpKQorCQlFTkdJTkVfcmVnaXN0ZXJfZGlnZXN0cyhlKTsKKwl9CisKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfZGlnZXN0cyhFTkdJTkUgKmUpCisJeworCWlmKGUtPmRpZ2VzdHMpCisJCXsKKwkJY29uc3QgaW50ICpuaWRzOworCQlpbnQgbnVtX25pZHMgPSBlLT5kaWdlc3RzKGUsIE5VTEwsICZuaWRzLCAwKTsKKwkJaWYobnVtX25pZHMgPiAwKQorCQkJcmV0dXJuIGVuZ2luZV90YWJsZV9yZWdpc3RlcigmZGlnZXN0X3RhYmxlLAorCQkJCQllbmdpbmVfdW5yZWdpc3Rlcl9hbGxfZGlnZXN0cywgZSwgbmlkcywKKwkJCQkJbnVtX25pZHMsIDEpOworCQl9CisJcmV0dXJuIDE7CisJfQorCisvKiBFeHBvc2VkIEFQSSBmdW5jdGlvbiB0byBnZXQgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbgorICogdGFibGUgKGllLiB0cnkgdG8gZ2V0IGEgZnVuY3Rpb25hbCByZWZlcmVuY2UgZnJvbSB0aGUgdGFibGVkIHN0cnVjdHVyYWwKKyAqIHJlZmVyZW5jZXMpIGZvciBhIGdpdmVuIGRpZ2VzdCAnbmlkJyAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2RpZ2VzdF9lbmdpbmUoaW50IG5pZCkKKwl7CisJcmV0dXJuIGVuZ2luZV90YWJsZV9zZWxlY3QoJmRpZ2VzdF90YWJsZSwgbmlkKTsKKwl9CisKKy8qIE9idGFpbnMgYSBkaWdlc3QgaW1wbGVtZW50YXRpb24gZnJvbSBhbiBFTkdJTkUgZnVuY3Rpb25hbCByZWZlcmVuY2UgKi8KK2NvbnN0IEVWUF9NRCAqRU5HSU5FX2dldF9kaWdlc3QoRU5HSU5FICplLCBpbnQgbmlkKQorCXsKKwljb25zdCBFVlBfTUQgKnJldDsKKwlFTkdJTkVfRElHRVNUU19QVFIgZm4gPSBFTkdJTkVfZ2V0X2RpZ2VzdHMoZSk7CisJaWYoIWZuIHx8ICFmbihlLCAmcmV0LCBOVUxMLCBuaWQpKQorCQl7CisJCUVOR0lORWVycihFTkdJTkVfRl9FTkdJTkVfR0VUX0RJR0VTVCwKKwkJCQlFTkdJTkVfUl9VTklNUExFTUVOVEVEX0RJR0VTVCk7CisJCXJldHVybiBOVUxMOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIEdldHMgdGhlIGRpZ2VzdCBjYWxsYmFjayBmcm9tIGFuIEVOR0lORSBzdHJ1Y3R1cmUgKi8KK0VOR0lORV9ESUdFU1RTX1BUUiBFTkdJTkVfZ2V0X2RpZ2VzdHMoY29uc3QgRU5HSU5FICplKQorCXsKKwlyZXR1cm4gZS0+ZGlnZXN0czsKKwl9CisKKy8qIFNldHMgdGhlIGRpZ2VzdCBjYWxsYmFjayBpbiBhbiBFTkdJTkUgc3RydWN0dXJlICovCitpbnQgRU5HSU5FX3NldF9kaWdlc3RzKEVOR0lORSAqZSwgRU5HSU5FX0RJR0VTVFNfUFRSIGYpCisJeworCWUtPmRpZ2VzdHMgPSBmOworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvdGJfZHNhLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX2RzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Njc0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX2RzYS5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlICJlbmdfaW50LmgiCisKKy8qIElmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgdGhlbiBFTkdJTkVfZ2V0X2RlZmF1bHRfRFNBKCksIHRoZSBmdW5jdGlvbiB0aGF0IGlzCisgKiB1c2VkIGJ5IERTQSB0byBob29rIGluIGltcGxlbWVudGF0aW9uIGNvZGUgYW5kIGNhY2hlIGRlZmF1bHRzIChldGMpLCB3aWxsCisgKiBkaXNwbGF5IGJyaWVmIGRlYnVnZ2luZyBzdW1tYXJpZXMgdG8gc3RkZXJyIHdpdGggdGhlICduaWQnLiAqLworLyogI2RlZmluZSBFTkdJTkVfRFNBX0RFQlVHICovCisKK3N0YXRpYyBFTkdJTkVfVEFCTEUgKmRzYV90YWJsZSA9IE5VTEw7CitzdGF0aWMgY29uc3QgaW50IGR1bW15X25pZCA9IDE7CisKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfRFNBKEVOR0lORSAqZSkKKwl7CisJZW5naW5lX3RhYmxlX3VucmVnaXN0ZXIoJmRzYV90YWJsZSwgZSk7CisJfQorCitzdGF0aWMgdm9pZCBlbmdpbmVfdW5yZWdpc3Rlcl9hbGxfRFNBKHZvaWQpCisJeworCWVuZ2luZV90YWJsZV9jbGVhbnVwKCZkc2FfdGFibGUpOworCX0KKworaW50IEVOR0lORV9yZWdpc3Rlcl9EU0EoRU5HSU5FICplKQorCXsKKwlpZihlLT5kc2FfbWV0aCkKKwkJcmV0dXJuIGVuZ2luZV90YWJsZV9yZWdpc3RlcigmZHNhX3RhYmxlLAorCQkJCWVuZ2luZV91bnJlZ2lzdGVyX2FsbF9EU0EsIGUsICZkdW1teV9uaWQsIDEsIDApOworCXJldHVybiAxOworCX0KKwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX0RTQSgpCisJeworCUVOR0lORSAqZTsKKworCWZvcihlPUVOR0lORV9nZXRfZmlyc3QoKSA7IGUgOyBlPUVOR0lORV9nZXRfbmV4dChlKSkKKwkJRU5HSU5FX3JlZ2lzdGVyX0RTQShlKTsKKwl9CisKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfRFNBKEVOR0lORSAqZSkKKwl7CisJaWYoZS0+ZHNhX21ldGgpCisJCXJldHVybiBlbmdpbmVfdGFibGVfcmVnaXN0ZXIoJmRzYV90YWJsZSwKKwkJCQllbmdpbmVfdW5yZWdpc3Rlcl9hbGxfRFNBLCBlLCAmZHVtbXlfbmlkLCAxLCAxKTsKKwlyZXR1cm4gMTsKKwl9CisKKy8qIEV4cG9zZWQgQVBJIGZ1bmN0aW9uIHRvIGdldCBhIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGZyb20gdGhlIGltcGxlbWVudGF0aW9uCisgKiB0YWJsZSAoaWUuIHRyeSB0byBnZXQgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSB0YWJsZWQgc3RydWN0dXJhbAorICogcmVmZXJlbmNlcykuICovCitFTkdJTkUgKkVOR0lORV9nZXRfZGVmYXVsdF9EU0Eodm9pZCkKKwl7CisJcmV0dXJuIGVuZ2luZV90YWJsZV9zZWxlY3QoJmRzYV90YWJsZSwgZHVtbXlfbmlkKTsKKwl9CisKKy8qIE9idGFpbnMgYW4gRFNBIGltcGxlbWVudGF0aW9uIGZyb20gYW4gRU5HSU5FIGZ1bmN0aW9uYWwgcmVmZXJlbmNlICovCitjb25zdCBEU0FfTUVUSE9EICpFTkdJTkVfZ2V0X0RTQShjb25zdCBFTkdJTkUgKmUpCisJeworCXJldHVybiBlLT5kc2FfbWV0aDsKKwl9CisKKy8qIFNldHMgYW4gRFNBIGltcGxlbWVudGF0aW9uIGluIGFuIEVOR0lORSBzdHJ1Y3R1cmUgKi8KK2ludCBFTkdJTkVfc2V0X0RTQShFTkdJTkUgKmUsIGNvbnN0IERTQV9NRVRIT0QgKmRzYV9tZXRoKQorCXsKKwllLT5kc2FfbWV0aCA9IGRzYV9tZXRoOworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvdGJfZWNkaC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS90Yl9lY2RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlYzc4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvdGJfZWNkaC5jCkBAIC0wLDAgKzEsMTMzIEBACisvKiBjcnlwdG8vZW5naW5lL3RiX2VjZGguYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBUaGUgRWxsaXB0aWMgQ3VydmUgUHVibGljLUtleSBDcnlwdG8gTGlicmFyeSAoRUNDIENvZGUpIGluY2x1ZGVkCisgKiBoZXJlaW4gaXMgZGV2ZWxvcGVkIGJ5IFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBpcyBjb250cmlidXRlZAorICogdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgRUNDIENvZGUgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYmVsb3cuCisgKgorICogVGhlIEVDREggZW5naW5lIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBOaWxzIEd1cmEgYW5kCisgKiBEb3VnbGFzIFN0ZWJpbGEgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImVuZ19pbnQuaCIKKworLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCB0aGVuIEVOR0lORV9nZXRfZGVmYXVsdF9FQ0RIKCksIHRoZSBmdW5jdGlvbiB0aGF0IGlzCisgKiB1c2VkIGJ5IEVDREggdG8gaG9vayBpbiBpbXBsZW1lbnRhdGlvbiBjb2RlIGFuZCBjYWNoZSBkZWZhdWx0cyAoZXRjKSwgd2lsbAorICogZGlzcGxheSBicmllZiBkZWJ1Z2dpbmcgc3VtbWFyaWVzIHRvIHN0ZGVyciB3aXRoIHRoZSAnbmlkJy4gKi8KKy8qICNkZWZpbmUgRU5HSU5FX0VDREhfREVCVUcgKi8KKworc3RhdGljIEVOR0lORV9UQUJMRSAqZWNkaF90YWJsZSA9IE5VTEw7CitzdGF0aWMgY29uc3QgaW50IGR1bW15X25pZCA9IDE7CisKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfRUNESChFTkdJTkUgKmUpCisJeworCWVuZ2luZV90YWJsZV91bnJlZ2lzdGVyKCZlY2RoX3RhYmxlLCBlKTsKKwl9CisKK3N0YXRpYyB2b2lkIGVuZ2luZV91bnJlZ2lzdGVyX2FsbF9FQ0RIKHZvaWQpCisJeworCWVuZ2luZV90YWJsZV9jbGVhbnVwKCZlY2RoX3RhYmxlKTsKKwl9CisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfRUNESChFTkdJTkUgKmUpCisJeworCWlmKGUtPmVjZGhfbWV0aCkKKwkJcmV0dXJuIGVuZ2luZV90YWJsZV9yZWdpc3RlcigmZWNkaF90YWJsZSwKKwkJCQllbmdpbmVfdW5yZWdpc3Rlcl9hbGxfRUNESCwgZSwgJmR1bW15X25pZCwgMSwgMCk7CisJcmV0dXJuIDE7CisJfQorCit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfRUNESCgpCisJeworCUVOR0lORSAqZTsKKworCWZvcihlPUVOR0lORV9nZXRfZmlyc3QoKSA7IGUgOyBlPUVOR0lORV9nZXRfbmV4dChlKSkKKwkJRU5HSU5FX3JlZ2lzdGVyX0VDREgoZSk7CisJfQorCitpbnQgRU5HSU5FX3NldF9kZWZhdWx0X0VDREgoRU5HSU5FICplKQorCXsKKwlpZihlLT5lY2RoX21ldGgpCisJCXJldHVybiBlbmdpbmVfdGFibGVfcmVnaXN0ZXIoJmVjZGhfdGFibGUsCisJCQkJZW5naW5lX3VucmVnaXN0ZXJfYWxsX0VDREgsIGUsICZkdW1teV9uaWQsIDEsIDEpOworCXJldHVybiAxOworCX0KKworLyogRXhwb3NlZCBBUEkgZnVuY3Rpb24gdG8gZ2V0IGEgZnVuY3Rpb25hbCByZWZlcmVuY2UgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24KKyAqIHRhYmxlIChpZS4gdHJ5IHRvIGdldCBhIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGZyb20gdGhlIHRhYmxlZCBzdHJ1Y3R1cmFsCisgKiByZWZlcmVuY2VzKS4gKi8KK0VOR0lORSAqRU5HSU5FX2dldF9kZWZhdWx0X0VDREgodm9pZCkKKwl7CisJcmV0dXJuIGVuZ2luZV90YWJsZV9zZWxlY3QoJmVjZGhfdGFibGUsIGR1bW15X25pZCk7CisJfQorCisvKiBPYnRhaW5zIGFuIEVDREggaW1wbGVtZW50YXRpb24gZnJvbSBhbiBFTkdJTkUgZnVuY3Rpb25hbCByZWZlcmVuY2UgKi8KK2NvbnN0IEVDREhfTUVUSE9EICpFTkdJTkVfZ2V0X0VDREgoY29uc3QgRU5HSU5FICplKQorCXsKKwlyZXR1cm4gZS0+ZWNkaF9tZXRoOworCX0KKworLyogU2V0cyBhbiBFQ0RIIGltcGxlbWVudGF0aW9uIGluIGFuIEVOR0lORSBzdHJ1Y3R1cmUgKi8KK2ludCBFTkdJTkVfc2V0X0VDREgoRU5HSU5FICplLCBjb25zdCBFQ0RIX01FVEhPRCAqZWNkaF9tZXRoKQorCXsKKwllLT5lY2RoX21ldGggPSBlY2RoX21ldGg7CisJcmV0dXJuIDE7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS90Yl9lY2RzYS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS90Yl9lY2RzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNWVjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX2VjZHNhLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZW5nX2ludC5oIgorCisvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIHRoZW4gRU5HSU5FX2dldF9kZWZhdWx0X0VDRFNBKCksIHRoZSBmdW5jdGlvbiB0aGF0IGlzCisgKiB1c2VkIGJ5IEVDRFNBIHRvIGhvb2sgaW4gaW1wbGVtZW50YXRpb24gY29kZSBhbmQgY2FjaGUgZGVmYXVsdHMgKGV0YyksIHdpbGwKKyAqIGRpc3BsYXkgYnJpZWYgZGVidWdnaW5nIHN1bW1hcmllcyB0byBzdGRlcnIgd2l0aCB0aGUgJ25pZCcuICovCisvKiAjZGVmaW5lIEVOR0lORV9FQ0RTQV9ERUJVRyAqLworCitzdGF0aWMgRU5HSU5FX1RBQkxFICplY2RzYV90YWJsZSA9IE5VTEw7CitzdGF0aWMgY29uc3QgaW50IGR1bW15X25pZCA9IDE7CisKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfRUNEU0EoRU5HSU5FICplKQorCXsKKwllbmdpbmVfdGFibGVfdW5yZWdpc3RlcigmZWNkc2FfdGFibGUsIGUpOworCX0KKworc3RhdGljIHZvaWQgZW5naW5lX3VucmVnaXN0ZXJfYWxsX0VDRFNBKHZvaWQpCisJeworCWVuZ2luZV90YWJsZV9jbGVhbnVwKCZlY2RzYV90YWJsZSk7CisJfQorCitpbnQgRU5HSU5FX3JlZ2lzdGVyX0VDRFNBKEVOR0lORSAqZSkKKwl7CisJaWYoZS0+ZWNkc2FfbWV0aCkKKwkJcmV0dXJuIGVuZ2luZV90YWJsZV9yZWdpc3RlcigmZWNkc2FfdGFibGUsCisJCQkJZW5naW5lX3VucmVnaXN0ZXJfYWxsX0VDRFNBLCBlLCAmZHVtbXlfbmlkLCAxLCAwKTsKKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9FQ0RTQSgpCisJeworCUVOR0lORSAqZTsKKworCWZvcihlPUVOR0lORV9nZXRfZmlyc3QoKSA7IGUgOyBlPUVOR0lORV9nZXRfbmV4dChlKSkKKwkJRU5HSU5FX3JlZ2lzdGVyX0VDRFNBKGUpOworCX0KKworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9FQ0RTQShFTkdJTkUgKmUpCisJeworCWlmKGUtPmVjZHNhX21ldGgpCisJCXJldHVybiBlbmdpbmVfdGFibGVfcmVnaXN0ZXIoJmVjZHNhX3RhYmxlLAorCQkJCWVuZ2luZV91bnJlZ2lzdGVyX2FsbF9FQ0RTQSwgZSwgJmR1bW15X25pZCwgMSwgMSk7CisJcmV0dXJuIDE7CisJfQorCisvKiBFeHBvc2VkIEFQSSBmdW5jdGlvbiB0byBnZXQgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbgorICogdGFibGUgKGllLiB0cnkgdG8gZ2V0IGEgZnVuY3Rpb25hbCByZWZlcmVuY2UgZnJvbSB0aGUgdGFibGVkIHN0cnVjdHVyYWwKKyAqIHJlZmVyZW5jZXMpLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfRUNEU0Eodm9pZCkKKwl7CisJcmV0dXJuIGVuZ2luZV90YWJsZV9zZWxlY3QoJmVjZHNhX3RhYmxlLCBkdW1teV9uaWQpOworCX0KKworLyogT2J0YWlucyBhbiBFQ0RTQSBpbXBsZW1lbnRhdGlvbiBmcm9tIGFuIEVOR0lORSBmdW5jdGlvbmFsIHJlZmVyZW5jZSAqLworY29uc3QgRUNEU0FfTUVUSE9EICpFTkdJTkVfZ2V0X0VDRFNBKGNvbnN0IEVOR0lORSAqZSkKKwl7CisJcmV0dXJuIGUtPmVjZHNhX21ldGg7CisJfQorCisvKiBTZXRzIGFuIEVDRFNBIGltcGxlbWVudGF0aW9uIGluIGFuIEVOR0lORSBzdHJ1Y3R1cmUgKi8KK2ludCBFTkdJTkVfc2V0X0VDRFNBKEVOR0lORSAqZSwgY29uc3QgRUNEU0FfTUVUSE9EICplY2RzYV9tZXRoKQorCXsKKwllLT5lY2RzYV9tZXRoID0gZWNkc2FfbWV0aDsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX3JhbmQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvdGJfcmFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNmY2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX3JhbmQuYwpAQCAtMCwwICsxLDExOCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZW5nX2ludC5oIgorCisvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIHRoZW4gRU5HSU5FX2dldF9kZWZhdWx0X1JBTkQoKSwgdGhlIGZ1bmN0aW9uIHRoYXQgaXMKKyAqIHVzZWQgYnkgUkFORCB0byBob29rIGluIGltcGxlbWVudGF0aW9uIGNvZGUgYW5kIGNhY2hlIGRlZmF1bHRzIChldGMpLCB3aWxsCisgKiBkaXNwbGF5IGJyaWVmIGRlYnVnZ2luZyBzdW1tYXJpZXMgdG8gc3RkZXJyIHdpdGggdGhlICduaWQnLiAqLworLyogI2RlZmluZSBFTkdJTkVfUkFORF9ERUJVRyAqLworCitzdGF0aWMgRU5HSU5FX1RBQkxFICpyYW5kX3RhYmxlID0gTlVMTDsKK3N0YXRpYyBjb25zdCBpbnQgZHVtbXlfbmlkID0gMTsKKwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9SQU5EKEVOR0lORSAqZSkKKwl7CisJZW5naW5lX3RhYmxlX3VucmVnaXN0ZXIoJnJhbmRfdGFibGUsIGUpOworCX0KKworc3RhdGljIHZvaWQgZW5naW5lX3VucmVnaXN0ZXJfYWxsX1JBTkQodm9pZCkKKwl7CisJZW5naW5lX3RhYmxlX2NsZWFudXAoJnJhbmRfdGFibGUpOworCX0KKworaW50IEVOR0lORV9yZWdpc3Rlcl9SQU5EKEVOR0lORSAqZSkKKwl7CisJaWYoZS0+cmFuZF9tZXRoKQorCQlyZXR1cm4gZW5naW5lX3RhYmxlX3JlZ2lzdGVyKCZyYW5kX3RhYmxlLAorCQkJCWVuZ2luZV91bnJlZ2lzdGVyX2FsbF9SQU5ELCBlLCAmZHVtbXlfbmlkLCAxLCAwKTsKKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9SQU5EKCkKKwl7CisJRU5HSU5FICplOworCisJZm9yKGU9RU5HSU5FX2dldF9maXJzdCgpIDsgZSA7IGU9RU5HSU5FX2dldF9uZXh0KGUpKQorCQlFTkdJTkVfcmVnaXN0ZXJfUkFORChlKTsKKwl9CisKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfUkFORChFTkdJTkUgKmUpCisJeworCWlmKGUtPnJhbmRfbWV0aCkKKwkJcmV0dXJuIGVuZ2luZV90YWJsZV9yZWdpc3RlcigmcmFuZF90YWJsZSwKKwkJCQllbmdpbmVfdW5yZWdpc3Rlcl9hbGxfUkFORCwgZSwgJmR1bW15X25pZCwgMSwgMSk7CisJcmV0dXJuIDE7CisJfQorCisvKiBFeHBvc2VkIEFQSSBmdW5jdGlvbiB0byBnZXQgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbgorICogdGFibGUgKGllLiB0cnkgdG8gZ2V0IGEgZnVuY3Rpb25hbCByZWZlcmVuY2UgZnJvbSB0aGUgdGFibGVkIHN0cnVjdHVyYWwKKyAqIHJlZmVyZW5jZXMpLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfUkFORCh2b2lkKQorCXsKKwlyZXR1cm4gZW5naW5lX3RhYmxlX3NlbGVjdCgmcmFuZF90YWJsZSwgZHVtbXlfbmlkKTsKKwl9CisKKy8qIE9idGFpbnMgYW4gUkFORCBpbXBsZW1lbnRhdGlvbiBmcm9tIGFuIEVOR0lORSBmdW5jdGlvbmFsIHJlZmVyZW5jZSAqLworY29uc3QgUkFORF9NRVRIT0QgKkVOR0lORV9nZXRfUkFORChjb25zdCBFTkdJTkUgKmUpCisJeworCXJldHVybiBlLT5yYW5kX21ldGg7CisJfQorCisvKiBTZXRzIGFuIFJBTkQgaW1wbGVtZW50YXRpb24gaW4gYW4gRU5HSU5FIHN0cnVjdHVyZSAqLworaW50IEVOR0lORV9zZXRfUkFORChFTkdJTkUgKmUsIGNvbnN0IFJBTkRfTUVUSE9EICpyYW5kX21ldGgpCisJeworCWUtPnJhbmRfbWV0aCA9IHJhbmRfbWV0aDsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX3JzYS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS90Yl9yc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmM3MDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2VuZ2luZS90Yl9yc2EuYwpAQCAtMCwwICsxLDExOCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZW5nX2ludC5oIgorCisvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIHRoZW4gRU5HSU5FX2dldF9kZWZhdWx0X1JTQSgpLCB0aGUgZnVuY3Rpb24gdGhhdCBpcworICogdXNlZCBieSBSU0EgdG8gaG9vayBpbiBpbXBsZW1lbnRhdGlvbiBjb2RlIGFuZCBjYWNoZSBkZWZhdWx0cyAoZXRjKSwgd2lsbAorICogZGlzcGxheSBicmllZiBkZWJ1Z2dpbmcgc3VtbWFyaWVzIHRvIHN0ZGVyciB3aXRoIHRoZSAnbmlkJy4gKi8KKy8qICNkZWZpbmUgRU5HSU5FX1JTQV9ERUJVRyAqLworCitzdGF0aWMgRU5HSU5FX1RBQkxFICpyc2FfdGFibGUgPSBOVUxMOworc3RhdGljIGNvbnN0IGludCBkdW1teV9uaWQgPSAxOworCit2b2lkIEVOR0lORV91bnJlZ2lzdGVyX1JTQShFTkdJTkUgKmUpCisJeworCWVuZ2luZV90YWJsZV91bnJlZ2lzdGVyKCZyc2FfdGFibGUsIGUpOworCX0KKworc3RhdGljIHZvaWQgZW5naW5lX3VucmVnaXN0ZXJfYWxsX1JTQSh2b2lkKQorCXsKKwllbmdpbmVfdGFibGVfY2xlYW51cCgmcnNhX3RhYmxlKTsKKwl9CisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfUlNBKEVOR0lORSAqZSkKKwl7CisJaWYoZS0+cnNhX21ldGgpCisJCXJldHVybiBlbmdpbmVfdGFibGVfcmVnaXN0ZXIoJnJzYV90YWJsZSwKKwkJCQllbmdpbmVfdW5yZWdpc3Rlcl9hbGxfUlNBLCBlLCAmZHVtbXlfbmlkLCAxLCAwKTsKKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9SU0EoKQorCXsKKwlFTkdJTkUgKmU7CisKKwlmb3IoZT1FTkdJTkVfZ2V0X2ZpcnN0KCkgOyBlIDsgZT1FTkdJTkVfZ2V0X25leHQoZSkpCisJCUVOR0lORV9yZWdpc3Rlcl9SU0EoZSk7CisJfQorCitpbnQgRU5HSU5FX3NldF9kZWZhdWx0X1JTQShFTkdJTkUgKmUpCisJeworCWlmKGUtPnJzYV9tZXRoKQorCQlyZXR1cm4gZW5naW5lX3RhYmxlX3JlZ2lzdGVyKCZyc2FfdGFibGUsCisJCQkJZW5naW5lX3VucmVnaXN0ZXJfYWxsX1JTQSwgZSwgJmR1bW15X25pZCwgMSwgMSk7CisJcmV0dXJuIDE7CisJfQorCisvKiBFeHBvc2VkIEFQSSBmdW5jdGlvbiB0byBnZXQgYSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBmcm9tIHRoZSBpbXBsZW1lbnRhdGlvbgorICogdGFibGUgKGllLiB0cnkgdG8gZ2V0IGEgZnVuY3Rpb25hbCByZWZlcmVuY2UgZnJvbSB0aGUgdGFibGVkIHN0cnVjdHVyYWwKKyAqIHJlZmVyZW5jZXMpLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfUlNBKHZvaWQpCisJeworCXJldHVybiBlbmdpbmVfdGFibGVfc2VsZWN0KCZyc2FfdGFibGUsIGR1bW15X25pZCk7CisJfQorCisvKiBPYnRhaW5zIGFuIFJTQSBpbXBsZW1lbnRhdGlvbiBmcm9tIGFuIEVOR0lORSBmdW5jdGlvbmFsIHJlZmVyZW5jZSAqLworY29uc3QgUlNBX01FVEhPRCAqRU5HSU5FX2dldF9SU0EoY29uc3QgRU5HSU5FICplKQorCXsKKwlyZXR1cm4gZS0+cnNhX21ldGg7CisJfQorCisvKiBTZXRzIGFuIFJTQSBpbXBsZW1lbnRhdGlvbiBpbiBhbiBFTkdJTkUgc3RydWN0dXJlICovCitpbnQgRU5HSU5FX3NldF9SU0EoRU5HSU5FICplLCBjb25zdCBSU0FfTUVUSE9EICpyc2FfbWV0aCkKKwl7CisJZS0+cnNhX21ldGggPSByc2FfbWV0aDsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX3N0b3JlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZW5naW5lL3RiX3N0b3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjNDM1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lbmdpbmUvdGJfc3RvcmUuYwpAQCAtMCwwICsxLDEyMyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiZW5nX2ludC5oIgorCisvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIHRoZW4gRU5HSU5FX2dldF9kZWZhdWx0X1NUT1JFKCksIHRoZSBmdW5jdGlvbiB0aGF0IGlzCisgKiB1c2VkIGJ5IFNUT1JFIHRvIGhvb2sgaW4gaW1wbGVtZW50YXRpb24gY29kZSBhbmQgY2FjaGUgZGVmYXVsdHMgKGV0YyksIHdpbGwKKyAqIGRpc3BsYXkgYnJpZWYgZGVidWdnaW5nIHN1bW1hcmllcyB0byBzdGRlcnIgd2l0aCB0aGUgJ25pZCcuICovCisvKiAjZGVmaW5lIEVOR0lORV9TVE9SRV9ERUJVRyAqLworCitzdGF0aWMgRU5HSU5FX1RBQkxFICpzdG9yZV90YWJsZSA9IE5VTEw7CitzdGF0aWMgY29uc3QgaW50IGR1bW15X25pZCA9IDE7CisKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfU1RPUkUoRU5HSU5FICplKQorCXsKKwllbmdpbmVfdGFibGVfdW5yZWdpc3Rlcigmc3RvcmVfdGFibGUsIGUpOworCX0KKworc3RhdGljIHZvaWQgZW5naW5lX3VucmVnaXN0ZXJfYWxsX1NUT1JFKHZvaWQpCisJeworCWVuZ2luZV90YWJsZV9jbGVhbnVwKCZzdG9yZV90YWJsZSk7CisJfQorCitpbnQgRU5HSU5FX3JlZ2lzdGVyX1NUT1JFKEVOR0lORSAqZSkKKwl7CisJaWYoZS0+c3RvcmVfbWV0aCkKKwkJcmV0dXJuIGVuZ2luZV90YWJsZV9yZWdpc3Rlcigmc3RvcmVfdGFibGUsCisJCQkJZW5naW5lX3VucmVnaXN0ZXJfYWxsX1NUT1JFLCBlLCAmZHVtbXlfbmlkLCAxLCAwKTsKKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9TVE9SRSgpCisJeworCUVOR0lORSAqZTsKKworCWZvcihlPUVOR0lORV9nZXRfZmlyc3QoKSA7IGUgOyBlPUVOR0lORV9nZXRfbmV4dChlKSkKKwkJRU5HSU5FX3JlZ2lzdGVyX1NUT1JFKGUpOworCX0KKworLyogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSByZW1vdmVkIGJlY2F1c2UgdGhleSdyZSB1c2VsZXNzLiAqLworI2lmIDAKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfU1RPUkUoRU5HSU5FICplKQorCXsKKwlpZihlLT5zdG9yZV9tZXRoKQorCQlyZXR1cm4gZW5naW5lX3RhYmxlX3JlZ2lzdGVyKCZzdG9yZV90YWJsZSwKKwkJCQllbmdpbmVfdW5yZWdpc3Rlcl9hbGxfU1RPUkUsIGUsICZkdW1teV9uaWQsIDEsIDEpOworCXJldHVybiAxOworCX0KKyNlbmRpZgorCisjaWYgMAorLyogRXhwb3NlZCBBUEkgZnVuY3Rpb24gdG8gZ2V0IGEgZnVuY3Rpb25hbCByZWZlcmVuY2UgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24KKyAqIHRhYmxlIChpZS4gdHJ5IHRvIGdldCBhIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGZyb20gdGhlIHRhYmxlZCBzdHJ1Y3R1cmFsCisgKiByZWZlcmVuY2VzKS4gKi8KK0VOR0lORSAqRU5HSU5FX2dldF9kZWZhdWx0X1NUT1JFKHZvaWQpCisJeworCXJldHVybiBlbmdpbmVfdGFibGVfc2VsZWN0KCZzdG9yZV90YWJsZSwgZHVtbXlfbmlkKTsKKwl9CisjZW5kaWYKKworLyogT2J0YWlucyBhbiBTVE9SRSBpbXBsZW1lbnRhdGlvbiBmcm9tIGFuIEVOR0lORSBmdW5jdGlvbmFsIHJlZmVyZW5jZSAqLworY29uc3QgU1RPUkVfTUVUSE9EICpFTkdJTkVfZ2V0X1NUT1JFKGNvbnN0IEVOR0lORSAqZSkKKwl7CisJcmV0dXJuIGUtPnN0b3JlX21ldGg7CisJfQorCisvKiBTZXRzIGFuIFNUT1JFIGltcGxlbWVudGF0aW9uIGluIGFuIEVOR0lORSBzdHJ1Y3R1cmUgKi8KK2ludCBFTkdJTkVfc2V0X1NUT1JFKEVOR0lORSAqZSwgY29uc3QgU1RPUkVfTUVUSE9EICpzdG9yZV9tZXRoKQorCXsKKwllLT5zdG9yZV9tZXRoID0gc3RvcmVfbWV0aDsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXJyL2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Vyci9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTcxM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Vyci9lcnIuYwpAQCAtMCwwICsxLDExMzUgQEAKKy8qIGNyeXB0by9lcnIvZXJyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCitERUNMQVJFX0xIQVNIX09GKEVSUl9TVFJJTkdfREFUQSk7CitERUNMQVJFX0xIQVNIX09GKEVSUl9TVEFURSk7CisKK3N0YXRpYyB2b2lkIGVycl9sb2FkX3N0cmluZ3MoaW50IGxpYiwgRVJSX1NUUklOR19EQVRBICpzdHIpOworCitzdGF0aWMgdm9pZCBFUlJfU1RBVEVfZnJlZShFUlJfU1RBVEUgKnMpOworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorc3RhdGljIEVSUl9TVFJJTkdfREFUQSBFUlJfc3RyX2xpYnJhcmllc1tdPQorCXsKK3tFUlJfUEFDSyhFUlJfTElCX05PTkUsMCwwKQkJLCJ1bmtub3duIGxpYnJhcnkifSwKK3tFUlJfUEFDSyhFUlJfTElCX1NZUywwLDApCQksInN5c3RlbSBsaWJyYXJ5In0sCit7RVJSX1BBQ0soRVJSX0xJQl9CTiwwLDApCQksImJpZ251bSByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfUlNBLDAsMCkJCSwicnNhIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9ESCwwLDApCQksIkRpZmZpZS1IZWxsbWFuIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9FVlAsMCwwKQkJLCJkaWdpdGFsIGVudmVsb3BlIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9CVUYsMCwwKQkJLCJtZW1vcnkgYnVmZmVyIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9PQkosMCwwKQkJLCJvYmplY3QgaWRlbnRpZmllciByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfUEVNLDAsMCkJCSwiUEVNIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9EU0EsMCwwKQkJLCJkc2Egcm91dGluZXMifSwKK3tFUlJfUEFDSyhFUlJfTElCX1g1MDksMCwwKQkJLCJ4NTA5IGNlcnRpZmljYXRlIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9BU04xLDAsMCkJCSwiYXNuMSBlbmNvZGluZyByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfQ09ORiwwLDApCQksImNvbmZpZ3VyYXRpb24gZmlsZSByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfQ1JZUFRPLDAsMCkJCSwiY29tbW9uIGxpYmNyeXB0byByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfRUMsMCwwKQkJLCJlbGxpcHRpYyBjdXJ2ZSByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfU1NMLDAsMCkJCSwiU1NMIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9CSU8sMCwwKQkJLCJCSU8gcm91dGluZXMifSwKK3tFUlJfUEFDSyhFUlJfTElCX1BLQ1M3LDAsMCkJCSwiUEtDUzcgcm91dGluZXMifSwKK3tFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywwLDApCQksIlg1MDkgVjMgcm91dGluZXMifSwKK3tFUlJfUEFDSyhFUlJfTElCX1BLQ1MxMiwwLDApCQksIlBLQ1MxMiByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfUkFORCwwLDApCQksInJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9EU08sMCwwKQkJLCJEU08gc3VwcG9ydCByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfVFMsMCwwKQkJLCJ0aW1lIHN0YW1wIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9FTkdJTkUsMCwwKQkJLCJlbmdpbmUgcm91dGluZXMifSwKK3tFUlJfUEFDSyhFUlJfTElCX09DU1AsMCwwKQkJLCJPQ1NQIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9GSVBTLDAsMCkJCSwiRklQUyByb3V0aW5lcyJ9LAore0VSUl9QQUNLKEVSUl9MSUJfQ01TLDAsMCkJCSwiQ01TIHJvdXRpbmVzIn0sCit7RVJSX1BBQ0soRVJSX0xJQl9ITUFDLDAsMCkJCSwiSE1BQyByb3V0aW5lcyJ9LAorezAsTlVMTH0sCisJfTsKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBFUlJfc3RyX2Z1bmN0c1tdPQorCXsKKwl7RVJSX1BBQ0soMCxTWVNfRl9GT1BFTiwwKSwgICAgIAkiZm9wZW4ifSwKKwl7RVJSX1BBQ0soMCxTWVNfRl9DT05ORUNULDApLAkJImNvbm5lY3QifSwKKwl7RVJSX1BBQ0soMCxTWVNfRl9HRVRTRVJWQllOQU1FLDApLAkiZ2V0c2VydmJ5bmFtZSJ9LAorCXtFUlJfUEFDSygwLFNZU19GX1NPQ0tFVCwwKSwJCSJzb2NrZXQifSwgCisJe0VSUl9QQUNLKDAsU1lTX0ZfSU9DVExTT0NLRVQsMCksCSJpb2N0bHNvY2tldCJ9LAorCXtFUlJfUEFDSygwLFNZU19GX0JJTkQsMCksCQkiYmluZCJ9LAorCXtFUlJfUEFDSygwLFNZU19GX0xJU1RFTiwwKSwJCSJsaXN0ZW4ifSwKKwl7RVJSX1BBQ0soMCxTWVNfRl9BQ0NFUFQsMCksCQkiYWNjZXB0In0sCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lORE9XUworCXtFUlJfUEFDSygwLFNZU19GX1dTQVNUQVJUVVAsMCksCSJXU0FzdGFydHVwIn0sCisjZW5kaWYKKwl7RVJSX1BBQ0soMCxTWVNfRl9PUEVORElSLDApLAkJIm9wZW5kaXIifSwKKwl7RVJSX1BBQ0soMCxTWVNfRl9GUkVBRCwwKSwJCSJmcmVhZCJ9LAorCXswLE5VTEx9LAorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgRVJSX3N0cl9yZWFzb25zW109CisJewore0VSUl9SX1NZU19MSUIJCQkJLCJzeXN0ZW0gbGliIn0sCit7RVJSX1JfQk5fTElCCQkJCSwiQk4gbGliIn0sCit7RVJSX1JfUlNBX0xJQgkJCQksIlJTQSBsaWIifSwKK3tFUlJfUl9ESF9MSUIJCQkJLCJESCBsaWIifSwKK3tFUlJfUl9FVlBfTElCCQkJCSwiRVZQIGxpYiJ9LAore0VSUl9SX0JVRl9MSUIJCQkJLCJCVUYgbGliIn0sCit7RVJSX1JfT0JKX0xJQgkJCQksIk9CSiBsaWIifSwKK3tFUlJfUl9QRU1fTElCCQkJCSwiUEVNIGxpYiJ9LAore0VSUl9SX0RTQV9MSUIJCQkJLCJEU0EgbGliIn0sCit7RVJSX1JfWDUwOV9MSUIJCQkJLCJYNTA5IGxpYiJ9LAore0VSUl9SX0FTTjFfTElCCQkJCSwiQVNOMSBsaWIifSwKK3tFUlJfUl9DT05GX0xJQgkJCQksIkNPTkYgbGliIn0sCit7RVJSX1JfQ1JZUFRPX0xJQgkJCSwiQ1JZUFRPIGxpYiJ9LAore0VSUl9SX0VDX0xJQgkJCQksIkVDIGxpYiJ9LAore0VSUl9SX1NTTF9MSUIJCQkJLCJTU0wgbGliIn0sCit7RVJSX1JfQklPX0xJQgkJCQksIkJJTyBsaWIifSwKK3tFUlJfUl9QS0NTN19MSUIJCQksIlBLQ1M3IGxpYiJ9LAore0VSUl9SX1g1MDlWM19MSUIJCQksIlg1MDlWMyBsaWIifSwKK3tFUlJfUl9QS0NTMTJfTElCCQkJLCJQS0NTMTIgbGliIn0sCit7RVJSX1JfUkFORF9MSUIJCQkJLCJSQU5EIGxpYiJ9LAore0VSUl9SX0RTT19MSUIJCQkJLCJEU08gbGliIn0sCit7RVJSX1JfRU5HSU5FX0xJQgkJCSwiRU5HSU5FIGxpYiJ9LAore0VSUl9SX09DU1BfTElCCQkJCSwiT0NTUCBsaWIifSwKK3tFUlJfUl9UU19MSUIJCQkJLCJUUyBsaWIifSwKKwore0VSUl9SX05FU1RFRF9BU04xX0VSUk9SCQksIm5lc3RlZCBhc24xIGVycm9yIn0sCit7RVJSX1JfQkFEX0FTTjFfT0JKRUNUX0hFQURFUgkJLCJiYWQgYXNuMSBvYmplY3QgaGVhZGVyIn0sCit7RVJSX1JfQkFEX0dFVF9BU04xX09CSkVDVF9DQUxMCQksImJhZCBnZXQgYXNuMSBvYmplY3QgY2FsbCJ9LAore0VSUl9SX0VYUEVDVElOR19BTl9BU04xX1NFUVVFTkNFCSwiZXhwZWN0aW5nIGFuIGFzbjEgc2VxdWVuY2UifSwKK3tFUlJfUl9BU04xX0xFTkdUSF9NSVNNQVRDSAkJLCJhc24xIGxlbmd0aCBtaXNtYXRjaCJ9LAore0VSUl9SX01JU1NJTkdfQVNOMV9FT1MJCQksIm1pc3NpbmcgYXNuMSBlb3MifSwKKwore0VSUl9SX0ZBVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICwiZmF0YWwifSwKK3tFUlJfUl9NQUxMT0NfRkFJTFVSRQkJCSwibWFsbG9jIGZhaWx1cmUifSwKK3tFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQJLCJjYWxsZWQgYSBmdW5jdGlvbiB5b3Ugc2hvdWxkIG5vdCBjYWxsIn0sCit7RVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSCQksInBhc3NlZCBhIG51bGwgcGFyYW1ldGVyIn0sCit7RVJSX1JfSU5URVJOQUxfRVJST1IJCQksImludGVybmFsIGVycm9yIn0sCit7RVJSX1JfRElTQUJMRUQJCQkJLCJjYWxsZWQgYSBmdW5jdGlvbiB0aGF0IHdhcyBkaXNhYmxlZCBhdCBjb21waWxlLXRpbWUifSwKKworezAsTlVMTH0sCisJfTsKKyNlbmRpZgorCisKKy8qIERlZmluZSB0aGUgcHJlZGVjbGFyZWQgKGJ1dCBleHRlcm5hbGx5IG9wYXF1ZSkgIkVSUl9GTlMiIHR5cGUgKi8KK3N0cnVjdCBzdF9FUlJfRk5TCisJeworCS8qIFdvcmtzIG9uIHRoZSAiZXJyb3JfaGFzaCIgc3RyaW5nIHRhYmxlICovCisJTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqKCpjYl9lcnJfZ2V0KShpbnQgY3JlYXRlKTsKKwl2b2lkICgqY2JfZXJyX2RlbCkodm9pZCk7CisJRVJSX1NUUklOR19EQVRBICooKmNiX2Vycl9nZXRfaXRlbSkoY29uc3QgRVJSX1NUUklOR19EQVRBICopOworCUVSUl9TVFJJTkdfREFUQSAqKCpjYl9lcnJfc2V0X2l0ZW0pKEVSUl9TVFJJTkdfREFUQSAqKTsKKwlFUlJfU1RSSU5HX0RBVEEgKigqY2JfZXJyX2RlbF9pdGVtKShFUlJfU1RSSU5HX0RBVEEgKik7CisJLyogV29ya3Mgb24gdGhlICJ0aHJlYWRfaGFzaCIgZXJyb3Itc3RhdGUgdGFibGUgKi8KKwlMSEFTSF9PRihFUlJfU1RBVEUpICooKmNiX3RocmVhZF9nZXQpKGludCBjcmVhdGUpOworCXZvaWQgKCpjYl90aHJlYWRfcmVsZWFzZSkoTEhBU0hfT0YoRVJSX1NUQVRFKSAqKmhhc2gpOworCUVSUl9TVEFURSAqKCpjYl90aHJlYWRfZ2V0X2l0ZW0pKGNvbnN0IEVSUl9TVEFURSAqKTsKKwlFUlJfU1RBVEUgKigqY2JfdGhyZWFkX3NldF9pdGVtKShFUlJfU1RBVEUgKik7CisJdm9pZCAoKmNiX3RocmVhZF9kZWxfaXRlbSkoY29uc3QgRVJSX1NUQVRFICopOworCS8qIFJldHVybnMgdGhlIG5leHQgYXZhaWxhYmxlIGVycm9yICJsaWJyYXJ5IiBudW1iZXJzICovCisJaW50ICgqY2JfZ2V0X25leHRfbGliKSh2b2lkKTsKKwl9OworCisvKiBQcmVkZWNsYXJhdGlvbnMgb2YgdGhlICJlcnJfZGVmYXVsdHMiIGZ1bmN0aW9ucyAqLworc3RhdGljIExIQVNIX09GKEVSUl9TVFJJTkdfREFUQSkgKmludF9lcnJfZ2V0KGludCBjcmVhdGUpOworc3RhdGljIHZvaWQgaW50X2Vycl9kZWwodm9pZCk7CitzdGF0aWMgRVJSX1NUUklOR19EQVRBICppbnRfZXJyX2dldF9pdGVtKGNvbnN0IEVSUl9TVFJJTkdfREFUQSAqKTsKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgKmludF9lcnJfc2V0X2l0ZW0oRVJSX1NUUklOR19EQVRBICopOworc3RhdGljIEVSUl9TVFJJTkdfREFUQSAqaW50X2Vycl9kZWxfaXRlbShFUlJfU1RSSU5HX0RBVEEgKik7CitzdGF0aWMgTEhBU0hfT0YoRVJSX1NUQVRFKSAqaW50X3RocmVhZF9nZXQoaW50IGNyZWF0ZSk7CitzdGF0aWMgdm9pZCBpbnRfdGhyZWFkX3JlbGVhc2UoTEhBU0hfT0YoRVJSX1NUQVRFKSAqKmhhc2gpOworc3RhdGljIEVSUl9TVEFURSAqaW50X3RocmVhZF9nZXRfaXRlbShjb25zdCBFUlJfU1RBVEUgKik7CitzdGF0aWMgRVJSX1NUQVRFICppbnRfdGhyZWFkX3NldF9pdGVtKEVSUl9TVEFURSAqKTsKK3N0YXRpYyB2b2lkIGludF90aHJlYWRfZGVsX2l0ZW0oY29uc3QgRVJSX1NUQVRFICopOworc3RhdGljIGludCBpbnRfZXJyX2dldF9uZXh0X2xpYih2b2lkKTsKKy8qIFRoZSBzdGF0aWMgRVJSX0ZOUyB0YWJsZSB1c2luZyB0aGVzZSBkZWZhdWx0cyBmdW5jdGlvbnMgKi8KK3N0YXRpYyBjb25zdCBFUlJfRk5TIGVycl9kZWZhdWx0cyA9CisJeworCWludF9lcnJfZ2V0LAorCWludF9lcnJfZGVsLAorCWludF9lcnJfZ2V0X2l0ZW0sCisJaW50X2Vycl9zZXRfaXRlbSwKKwlpbnRfZXJyX2RlbF9pdGVtLAorCWludF90aHJlYWRfZ2V0LAorCWludF90aHJlYWRfcmVsZWFzZSwKKwlpbnRfdGhyZWFkX2dldF9pdGVtLAorCWludF90aHJlYWRfc2V0X2l0ZW0sCisJaW50X3RocmVhZF9kZWxfaXRlbSwKKwlpbnRfZXJyX2dldF9uZXh0X2xpYgorCX07CisKKy8qIFRoZSByZXBsYWNhYmxlIHRhYmxlIG9mIEVSUl9GTlMgZnVuY3Rpb25zIHdlIHVzZSBhdCBydW4tdGltZSAqLworc3RhdGljIGNvbnN0IEVSUl9GTlMgKmVycl9mbnMgPSBOVUxMOworCisvKiBFZy4gcmF0aGVyIHRoYW4gdXNpbmcgImVycl9nZXQoKSIsIHVzZSAiRVJSRk4oZXJyX2dldCkoKSIuICovCisjZGVmaW5lIEVSUkZOKGEpIGVycl9mbnMtPmNiXyMjYQorCisvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdXNlZCBieSAiZXJyX2RlZmF1bHRzIiAtIGFzIHN1Y2gsIHRoZSBzZXR0aW5nLCByZWFkaW5nLAorICogY3JlYXRpbmcsIGFuZCBkZWxldGluZyBvZiB0aGlzIGRhdGEgc2hvdWxkIG9ubHkgYmUgcGVybWl0dGVkIHZpYSB0aGUKKyAqICJlcnJfZGVmYXVsdHMiIGZ1bmN0aW9ucy4gVGhpcyB3YXksIGEgbGlua2VkIG1vZHVsZSBjYW4gY29tcGxldGVseSBkZWZlciBhbGwKKyAqIEVSUiBzdGF0ZSBvcGVyYXRpb24gKHRvZ2V0aGVyIHdpdGggcmVxdWlzaXRlIGxvY2tpbmcpIHRvIHRoZSBpbXBsZW1lbnRhdGlvbnMKKyAqIGFuZCBzdGF0ZSBpbiB0aGUgbG9hZGluZyBhcHBsaWNhdGlvbi4gKi8KK3N0YXRpYyBMSEFTSF9PRihFUlJfU1RSSU5HX0RBVEEpICppbnRfZXJyb3JfaGFzaCA9IE5VTEw7CitzdGF0aWMgTEhBU0hfT0YoRVJSX1NUQVRFKSAqaW50X3RocmVhZF9oYXNoID0gTlVMTDsKK3N0YXRpYyBpbnQgaW50X3RocmVhZF9oYXNoX3JlZmVyZW5jZXMgPSAwOworc3RhdGljIGludCBpbnRfZXJyX2xpYnJhcnlfbnVtYmVyPSBFUlJfTElCX1VTRVI7CisKKy8qIEludGVybmFsIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHdoZXRoZXIgImVycl9mbnMiIGlzIHNldCBhbmQgaWYgbm90LCBzZXRzIGl0IHRvCisgKiB0aGUgZGVmYXVsdHMuICovCitzdGF0aWMgdm9pZCBlcnJfZm5zX2NoZWNrKHZvaWQpCisJeworCWlmIChlcnJfZm5zKSByZXR1cm47CisJCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworCWlmICghZXJyX2ZucykKKwkJZXJyX2ZucyA9ICZlcnJfZGVmYXVsdHM7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisJfQorCisvKiBBUEkgZnVuY3Rpb25zIHRvIGdldCBvciBzZXQgdGhlIHVuZGVybHlpbmcgRVJSIGZ1bmN0aW9ucy4gKi8KKworY29uc3QgRVJSX0ZOUyAqRVJSX2dldF9pbXBsZW1lbnRhdGlvbih2b2lkKQorCXsKKwllcnJfZm5zX2NoZWNrKCk7CisJcmV0dXJuIGVycl9mbnM7CisJfQorCitpbnQgRVJSX3NldF9pbXBsZW1lbnRhdGlvbihjb25zdCBFUlJfRk5TICpmbnMpCisJeworCWludCByZXQgPSAwOworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworCS8qIEl0J3MgdG9vIGxhdGUgaWYgJ2Vycl9mbnMnIGlzIG5vbi1OVUxMLiBCVFc6IG5vdCBtdWNoIHBvaW50IHNldHRpbmcKKwkgKiBhbiBlcnJvciBpcyB0aGVyZT8hICovCisJaWYgKCFlcnJfZm5zKQorCQl7CisJCWVycl9mbnMgPSBmbnM7CisJCXJldCA9IDE7CisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogVGhlc2UgYXJlIHRoZSBjYWxsYmFja3MgcHJvdmlkZWQgdG8gImxoX25ldygpIiB3aGVuIGNyZWF0aW5nIHRoZSBMSEFTSCB0YWJsZXMKKyAqIGludGVybmFsIHRvIHRoZSAiZXJyX2RlZmF1bHRzIiBpbXBsZW1lbnRhdGlvbi4gKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2Vycm9yX3ZhbHVlcyhpbnQgaW5jLGludCB0b3AsY29uc3QgY2hhciAqKmZpbGUsaW50ICpsaW5lLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKipkYXRhLGludCAqZmxhZ3MpOworCisvKiBUaGUgaW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgaW4gdGhlICJlcnJfZGVmYXVsdHMiIGltcGxlbWVudGF0aW9uICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVycl9zdHJpbmdfZGF0YV9oYXNoKGNvbnN0IEVSUl9TVFJJTkdfREFUQSAqYSkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQsbDsKKworCWw9YS0+ZXJyb3I7CisJcmV0PWxeRVJSX0dFVF9MSUIobCleRVJSX0dFVF9GVU5DKGwpOworCXJldHVybihyZXRecmV0JTE5KjEzKTsKKwl9CitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0hBU0hfRk4oZXJyX3N0cmluZ19kYXRhLCBFUlJfU1RSSU5HX0RBVEEpCisKK3N0YXRpYyBpbnQgZXJyX3N0cmluZ19kYXRhX2NtcChjb25zdCBFUlJfU1RSSU5HX0RBVEEgKmEsCisJCQkgICAgICAgY29uc3QgRVJSX1NUUklOR19EQVRBICpiKQorCXsKKwlyZXR1cm4gKGludCkoYS0+ZXJyb3IgLSBiLT5lcnJvcik7CisJfQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9DT01QX0ZOKGVycl9zdHJpbmdfZGF0YSwgRVJSX1NUUklOR19EQVRBKQorCitzdGF0aWMgTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqaW50X2Vycl9nZXQoaW50IGNyZWF0ZSkKKwl7CisJTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqcmV0ID0gTlVMTDsKKworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKwlpZiAoIWludF9lcnJvcl9oYXNoICYmIGNyZWF0ZSkKKwkJeworCQlDUllQVE9fcHVzaF9pbmZvKCJpbnRfZXJyX2dldCAoZXJyLmMpIik7CisJCWludF9lcnJvcl9oYXNoID0gbGhfRVJSX1NUUklOR19EQVRBX25ldygpOworCQlDUllQVE9fcG9wX2luZm8oKTsKKwkJfQorCWlmIChpbnRfZXJyb3JfaGFzaCkKKwkJcmV0ID0gaW50X2Vycm9yX2hhc2g7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIHZvaWQgaW50X2Vycl9kZWwodm9pZCkKKwl7CisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworCWlmIChpbnRfZXJyb3JfaGFzaCkKKwkJeworCQlsaF9FUlJfU1RSSU5HX0RBVEFfZnJlZShpbnRfZXJyb3JfaGFzaCk7CisJCWludF9lcnJvcl9oYXNoID0gTlVMTDsKKwkJfQorCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FUlIpOworCX0KKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSAqaW50X2Vycl9nZXRfaXRlbShjb25zdCBFUlJfU1RSSU5HX0RBVEEgKmQpCisJeworCUVSUl9TVFJJTkdfREFUQSAqcDsKKwlMSEFTSF9PRihFUlJfU1RSSU5HX0RBVEEpICpoYXNoOworCisJZXJyX2Zuc19jaGVjaygpOworCWhhc2ggPSBFUlJGTihlcnJfZ2V0KSgwKTsKKwlpZiAoIWhhc2gpCisJCXJldHVybiBOVUxMOworCisJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19FUlIpOworCXAgPSBsaF9FUlJfU1RSSU5HX0RBVEFfcmV0cmlldmUoaGFzaCwgZCk7CisJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisKKwlyZXR1cm4gcDsKKwl9CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgKmludF9lcnJfc2V0X2l0ZW0oRVJSX1NUUklOR19EQVRBICpkKQorCXsKKwlFUlJfU1RSSU5HX0RBVEEgKnA7CisJTEhBU0hfT0YoRVJSX1NUUklOR19EQVRBKSAqaGFzaDsKKworCWVycl9mbnNfY2hlY2soKTsKKwloYXNoID0gRVJSRk4oZXJyX2dldCkoMSk7CisJaWYgKCFoYXNoKQorCQlyZXR1cm4gTlVMTDsKKworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKwlwID0gbGhfRVJSX1NUUklOR19EQVRBX2luc2VydChoYXNoLCBkKTsKKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKworCXJldHVybiBwOworCX0KKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSAqaW50X2Vycl9kZWxfaXRlbShFUlJfU1RSSU5HX0RBVEEgKmQpCisJeworCUVSUl9TVFJJTkdfREFUQSAqcDsKKwlMSEFTSF9PRihFUlJfU1RSSU5HX0RBVEEpICpoYXNoOworCisJZXJyX2Zuc19jaGVjaygpOworCWhhc2ggPSBFUlJGTihlcnJfZ2V0KSgwKTsKKwlpZiAoIWhhc2gpCisJCXJldHVybiBOVUxMOworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworCXAgPSBsaF9FUlJfU1RSSU5HX0RBVEFfZGVsZXRlKGhhc2gsIGQpOworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FUlIpOworCisJcmV0dXJuIHA7CisJfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlcnJfc3RhdGVfaGFzaChjb25zdCBFUlJfU1RBVEUgKmEpCisJeworCXJldHVybiBDUllQVE9fVEhSRUFESURfaGFzaCgmYS0+dGlkKSAqIDEzOworCX0KK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfSEFTSF9GTihlcnJfc3RhdGUsIEVSUl9TVEFURSkKKworc3RhdGljIGludCBlcnJfc3RhdGVfY21wKGNvbnN0IEVSUl9TVEFURSAqYSwgY29uc3QgRVJSX1NUQVRFICpiKQorCXsKKwlyZXR1cm4gQ1JZUFRPX1RIUkVBRElEX2NtcCgmYS0+dGlkLCAmYi0+dGlkKTsKKwl9CitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0NPTVBfRk4oZXJyX3N0YXRlLCBFUlJfU1RBVEUpCisKK3N0YXRpYyBMSEFTSF9PRihFUlJfU1RBVEUpICppbnRfdGhyZWFkX2dldChpbnQgY3JlYXRlKQorCXsKKwlMSEFTSF9PRihFUlJfU1RBVEUpICpyZXQgPSBOVUxMOworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworCWlmICghaW50X3RocmVhZF9oYXNoICYmIGNyZWF0ZSkKKwkJeworCQlDUllQVE9fcHVzaF9pbmZvKCJpbnRfdGhyZWFkX2dldCAoZXJyLmMpIik7CisJCWludF90aHJlYWRfaGFzaCA9IGxoX0VSUl9TVEFURV9uZXcoKTsKKwkJQ1JZUFRPX3BvcF9pbmZvKCk7CisJCX0KKwlpZiAoaW50X3RocmVhZF9oYXNoKQorCQl7CisJCWludF90aHJlYWRfaGFzaF9yZWZlcmVuY2VzKys7CisJCXJldCA9IGludF90aHJlYWRfaGFzaDsKKwkJfQorCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FUlIpOworCXJldHVybiByZXQ7CisJfQorCitzdGF0aWMgdm9pZCBpbnRfdGhyZWFkX3JlbGVhc2UoTEhBU0hfT0YoRVJSX1NUQVRFKSAqKmhhc2gpCisJeworCWludCBpOworCisJaWYgKGhhc2ggPT0gTlVMTCB8fCAqaGFzaCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpID0gQ1JZUFRPX2FkZCgmaW50X3RocmVhZF9oYXNoX3JlZmVyZW5jZXMsIC0xLCBDUllQVE9fTE9DS19FUlIpOworCisjaWZkZWYgUkVGX1BSSU5UCisJZnByaW50ZihzdGRlcnIsIiU0ZDolc1xuIixpbnRfdGhyZWFkX2hhc2hfcmVmZXJlbmNlcywiRVJSIik7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsImludF90aHJlYWRfcmVsZWFzZSwgYmFkIHJlZmVyZW5jZSBjb3VudFxuIik7CisJCWFib3J0KCk7IC8qIG9rICovCisJCX0KKyNlbmRpZgorCSpoYXNoID0gTlVMTDsKKwl9CisKK3N0YXRpYyBFUlJfU1RBVEUgKmludF90aHJlYWRfZ2V0X2l0ZW0oY29uc3QgRVJSX1NUQVRFICpkKQorCXsKKwlFUlJfU1RBVEUgKnA7CisJTEhBU0hfT0YoRVJSX1NUQVRFKSAqaGFzaDsKKworCWVycl9mbnNfY2hlY2soKTsKKwloYXNoID0gRVJSRk4odGhyZWFkX2dldCkoMCk7CisJaWYgKCFoYXNoKQorCQlyZXR1cm4gTlVMTDsKKworCUNSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKwlwID0gbGhfRVJSX1NUQVRFX3JldHJpZXZlKGhhc2gsIGQpOworCUNSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19FUlIpOworCisJRVJSRk4odGhyZWFkX3JlbGVhc2UpKCZoYXNoKTsKKwlyZXR1cm4gcDsKKwl9CisKK3N0YXRpYyBFUlJfU1RBVEUgKmludF90aHJlYWRfc2V0X2l0ZW0oRVJSX1NUQVRFICpkKQorCXsKKwlFUlJfU1RBVEUgKnA7CisJTEhBU0hfT0YoRVJSX1NUQVRFKSAqaGFzaDsKKworCWVycl9mbnNfY2hlY2soKTsKKwloYXNoID0gRVJSRk4odGhyZWFkX2dldCkoMSk7CisJaWYgKCFoYXNoKQorCQlyZXR1cm4gTlVMTDsKKworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKwlwID0gbGhfRVJSX1NUQVRFX2luc2VydChoYXNoLCBkKTsKKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKworCUVSUkZOKHRocmVhZF9yZWxlYXNlKSgmaGFzaCk7CisJcmV0dXJuIHA7CisJfQorCitzdGF0aWMgdm9pZCBpbnRfdGhyZWFkX2RlbF9pdGVtKGNvbnN0IEVSUl9TVEFURSAqZCkKKwl7CisJRVJSX1NUQVRFICpwOworCUxIQVNIX09GKEVSUl9TVEFURSkgKmhhc2g7CisKKwllcnJfZm5zX2NoZWNrKCk7CisJaGFzaCA9IEVSUkZOKHRocmVhZF9nZXQpKDApOworCWlmICghaGFzaCkKKwkJcmV0dXJuOworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworCXAgPSBsaF9FUlJfU1RBVEVfZGVsZXRlKGhhc2gsIGQpOworCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWFrIG1lbW9yeSAqLworCWlmIChpbnRfdGhyZWFkX2hhc2hfcmVmZXJlbmNlcyA9PSAxCisJICAgICYmIGludF90aHJlYWRfaGFzaCAmJiBsaF9FUlJfU1RBVEVfbnVtX2l0ZW1zKGludF90aHJlYWRfaGFzaCkgPT0gMCkKKwkJeworCQlsaF9FUlJfU1RBVEVfZnJlZShpbnRfdGhyZWFkX2hhc2gpOworCQlpbnRfdGhyZWFkX2hhc2ggPSBOVUxMOworCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisKKwlFUlJGTih0aHJlYWRfcmVsZWFzZSkoJmhhc2gpOworCWlmIChwKQorCQlFUlJfU1RBVEVfZnJlZShwKTsKKwl9CisKK3N0YXRpYyBpbnQgaW50X2Vycl9nZXRfbmV4dF9saWIodm9pZCkKKwl7CisJaW50IHJldDsKKworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKwlyZXQgPSBpbnRfZXJyX2xpYnJhcnlfbnVtYmVyKys7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisKKwlyZXR1cm4gcmV0OworCX0KKworCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisjZGVmaW5lIE5VTV9TWVNfU1RSX1JFQVNPTlMgMTI3CisjZGVmaW5lIExFTl9TWVNfU1RSX1JFQVNPTiAzMgorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFNZU19zdHJfcmVhc29uc1tOVU1fU1lTX1NUUl9SRUFTT05TICsgMV07CisvKiBTWVNfc3RyX3JlYXNvbnMgaXMgZmlsbGVkIHdpdGggY29waWVzIG9mIHN0cmVycm9yKCkgcmVzdWx0cyBhdAorICogaW5pdGlhbGl6YXRpb24uCisgKiAnZXJybm8nIHZhbHVlcyB1cCB0byAxMjcgc2hvdWxkIGNvdmVyIGFsbCB1c3VhbCBlcnJvcnMsCisgKiBvdGhlcnMgd2lsbCBiZSBkaXNwbGF5ZWQgbnVtZXJpY2FsbHkgYnkgRVJSX2Vycm9yX3N0cmluZy4KKyAqIEl0IGlzIGNydWNpYWwgdGhhdCB3ZSBoYXZlIHNvbWV0aGluZyBmb3IgZWFjaCByZWFzb24gY29kZQorICogdGhhdCBvY2N1cnMgaW4gRVJSX3N0cl9yZWFzb25zLCBvciBib2d1cyByZWFzb24gc3RyaW5ncworICogd2lsbCBiZSByZXR1cm5lZCBmb3IgU1lTZXJyKCksIHdoaWNoIGFsd2F5cyBnZXRzIGFuIGVycm5vCisgKiB2YWx1ZSBhbmQgbmV2ZXIgb25lIG9mIHRob3NlICdzdGFuZGFyZCcgcmVhc29uIGNvZGVzLiAqLworCitzdGF0aWMgdm9pZCBidWlsZF9TWVNfc3RyX3JlYXNvbnModm9pZCkKKwl7CisJLyogT1BFTlNTTF9tYWxsb2MgY2Fubm90IGJlIHVzZWQgaGVyZSwgdXNlIHN0YXRpYyBzdG9yYWdlIGluc3RlYWQgKi8KKwlzdGF0aWMgY2hhciBzdHJlcnJvcl90YWJbTlVNX1NZU19TVFJfUkVBU09OU11bTEVOX1NZU19TVFJfUkVBU09OXTsKKwlpbnQgaTsKKwlzdGF0aWMgaW50IGluaXQgPSAxOworCisJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19FUlIpOworCWlmICghaW5pdCkKKwkJeworCQlDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKwkJcmV0dXJuOworCQl9CisJCisJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FUlIpOworCWlmICghaW5pdCkKKwkJeworCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVJSKTsKKwkJcmV0dXJuOworCQl9CisKKwlmb3IgKGkgPSAxOyBpIDw9IE5VTV9TWVNfU1RSX1JFQVNPTlM7IGkrKykKKwkJeworCQlFUlJfU1RSSU5HX0RBVEEgKnN0ciA9ICZTWVNfc3RyX3JlYXNvbnNbaSAtIDFdOworCisJCXN0ci0+ZXJyb3IgPSAodW5zaWduZWQgbG9uZylpOworCQlpZiAoc3RyLT5zdHJpbmcgPT0gTlVMTCkKKwkJCXsKKwkJCWNoYXIgKCpkZXN0KVtMRU5fU1lTX1NUUl9SRUFTT05dID0gJihzdHJlcnJvcl90YWJbaSAtIDFdKTsKKwkJCWNoYXIgKnNyYyA9IHN0cmVycm9yKGkpOworCQkJaWYgKHNyYyAhPSBOVUxMKQorCQkJCXsKKwkJCQlzdHJuY3B5KCpkZXN0LCBzcmMsIHNpemVvZiAqZGVzdCk7CisJCQkJKCpkZXN0KVtzaXplb2YgKmRlc3QgLSAxXSA9ICdcMCc7CisJCQkJc3RyLT5zdHJpbmcgPSAqZGVzdDsKKwkJCQl9CisJCQl9CisJCWlmIChzdHItPnN0cmluZyA9PSBOVUxMKQorCQkJc3RyLT5zdHJpbmcgPSAidW5rbm93biI7CisJCX0KKworCS8qIE5vdyB3ZSBzdGlsbCBoYXZlIFNZU19zdHJfcmVhc29uc1tOVU1fU1lTX1NUUl9SRUFTT05TXSA9IHswLCBOVUxMfSwKKwkgKiBhcyByZXF1aXJlZCBieSBFUlJfbG9hZF9zdHJpbmdzLiAqLworCisJaW5pdCA9IDA7CisJCisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VSUik7CisJfQorI2VuZGlmCisKKyNkZWZpbmUgZXJyX2NsZWFyX2RhdGEocCxpKSBcCisJZG8geyBcCisJaWYgKCgocCktPmVycl9kYXRhW2ldICE9IE5VTEwpICYmIFwKKwkJKHApLT5lcnJfZGF0YV9mbGFnc1tpXSAmIEVSUl9UWFRfTUFMTE9DRUQpIFwKKwkJeyAgXAorCQlPUEVOU1NMX2ZyZWUoKHApLT5lcnJfZGF0YVtpXSk7IFwKKwkJKHApLT5lcnJfZGF0YVtpXT1OVUxMOyBcCisJCX0gXAorCShwKS0+ZXJyX2RhdGFfZmxhZ3NbaV09MDsgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBlcnJfY2xlYXIocCxpKSBcCisJZG8geyBcCisJKHApLT5lcnJfZmxhZ3NbaV09MDsgXAorCShwKS0+ZXJyX2J1ZmZlcltpXT0wOyBcCisJZXJyX2NsZWFyX2RhdGEocCxpKTsgXAorCShwKS0+ZXJyX2ZpbGVbaV09TlVMTDsgXAorCShwKS0+ZXJyX2xpbmVbaV09IC0xOyBcCisJfSB3aGlsZSgwKQorCitzdGF0aWMgdm9pZCBFUlJfU1RBVEVfZnJlZShFUlJfU1RBVEUgKnMpCisJeworCWludCBpOworCisJaWYgKHMgPT0gTlVMTCkKKwkgICAgcmV0dXJuOworCisJZm9yIChpPTA7IGk8RVJSX05VTV9FUlJPUlM7IGkrKykKKwkJeworCQllcnJfY2xlYXJfZGF0YShzLGkpOworCQl9CisJT1BFTlNTTF9mcmVlKHMpOworCX0KKwordm9pZCBFUlJfbG9hZF9FUlJfc3RyaW5ncyh2b2lkKQorCXsKKwllcnJfZm5zX2NoZWNrKCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisJZXJyX2xvYWRfc3RyaW5ncygwLEVSUl9zdHJfbGlicmFyaWVzKTsKKwllcnJfbG9hZF9zdHJpbmdzKDAsRVJSX3N0cl9yZWFzb25zKTsKKwllcnJfbG9hZF9zdHJpbmdzKEVSUl9MSUJfU1lTLEVSUl9zdHJfZnVuY3RzKTsKKwlidWlsZF9TWVNfc3RyX3JlYXNvbnMoKTsKKwllcnJfbG9hZF9zdHJpbmdzKEVSUl9MSUJfU1lTLFNZU19zdHJfcmVhc29ucyk7CisjZW5kaWYKKwl9CisKK3N0YXRpYyB2b2lkIGVycl9sb2FkX3N0cmluZ3MoaW50IGxpYiwgRVJSX1NUUklOR19EQVRBICpzdHIpCisJeworCXdoaWxlIChzdHItPmVycm9yKQorCQl7CisJCWlmIChsaWIpCisJCQlzdHItPmVycm9yfD1FUlJfUEFDSyhsaWIsMCwwKTsKKwkJRVJSRk4oZXJyX3NldF9pdGVtKShzdHIpOworCQlzdHIrKzsKKwkJfQorCX0KKwordm9pZCBFUlJfbG9hZF9zdHJpbmdzKGludCBsaWIsIEVSUl9TVFJJTkdfREFUQSAqc3RyKQorCXsKKwlFUlJfbG9hZF9FUlJfc3RyaW5ncygpOworCWVycl9sb2FkX3N0cmluZ3MobGliLCBzdHIpOworCX0KKwordm9pZCBFUlJfdW5sb2FkX3N0cmluZ3MoaW50IGxpYiwgRVJSX1NUUklOR19EQVRBICpzdHIpCisJeworCXdoaWxlIChzdHItPmVycm9yKQorCQl7CisJCWlmIChsaWIpCisJCQlzdHItPmVycm9yfD1FUlJfUEFDSyhsaWIsMCwwKTsKKwkJRVJSRk4oZXJyX2RlbF9pdGVtKShzdHIpOworCQlzdHIrKzsKKwkJfQorCX0KKwordm9pZCBFUlJfZnJlZV9zdHJpbmdzKHZvaWQpCisJeworCWVycl9mbnNfY2hlY2soKTsKKwlFUlJGTihlcnJfZGVsKSgpOworCX0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEVSUl9wdXRfZXJyb3IoaW50IGxpYiwgaW50IGZ1bmMsIGludCByZWFzb24sIGNvbnN0IGNoYXIgKmZpbGUsCisJICAgICBpbnQgbGluZSkKKwl7CisJRVJSX1NUQVRFICplczsKKworI2lmZGVmIF9PU0RfUE9TSVgKKwkvKiBJbiB0aGUgQlMyMDAwLU9TRCBQT1NJWCBzdWJzeXN0ZW0sIHRoZSBjb21waWxlciBnZW5lcmF0ZXMKKwkgKiBwYXRoIG5hbWVzIGluIHRoZSBmb3JtICIqUE9TSVgoL2V0Yy9wYXNzd2QpIi4KKwkgKiBUaGlzIGRpcnR5IGhhY2sgc3RyaXBzIHRoZW0gdG8gc29tZXRoaW5nIHNlbnNpYmxlLgorCSAqIEBAQCBXZSBzaG91bGRuJ3QgbW9kaWZ5IGEgY29uc3Qgc3RyaW5nLCB0aG91Z2guCisJICovCisJaWYgKHN0cm5jbXAoZmlsZSwiKlBPU0lYKCIsIHNpemVvZigiKlBPU0lYKCIpLTEpID09IDApIHsKKwkJY2hhciAqZW5kOworCisJCS8qIFNraXAgdGhlICIqUE9TSVgoIiBwcmVmaXggKi8KKwkJZmlsZSArPSBzaXplb2YoIipQT1NJWCgiKS0xOworCQllbmQgPSAmZmlsZVtzdHJsZW4oZmlsZSktMV07CisJCWlmICgqZW5kID09ICcpJykKKwkJCSplbmQgPSAnXDAnOworCQkvKiBPcHRpb25hbDogdXNlIHRoZSBiYXNlbmFtZSBvZiB0aGUgcGF0aCBvbmx5LiAqLworCQlpZiAoKGVuZCA9IHN0cnJjaHIoZmlsZSwgJy8nKSkgIT0gTlVMTCkKKwkJCWZpbGUgPSAmZW5kWzFdOworCX0KKyNlbmRpZgorCWVzPUVSUl9nZXRfc3RhdGUoKTsKKworCWVzLT50b3A9KGVzLT50b3ArMSklRVJSX05VTV9FUlJPUlM7CisJaWYgKGVzLT50b3AgPT0gZXMtPmJvdHRvbSkKKwkJZXMtPmJvdHRvbT0oZXMtPmJvdHRvbSsxKSVFUlJfTlVNX0VSUk9SUzsKKwllcy0+ZXJyX2ZsYWdzW2VzLT50b3BdPTA7CisJZXMtPmVycl9idWZmZXJbZXMtPnRvcF09RVJSX1BBQ0sobGliLGZ1bmMscmVhc29uKTsKKwllcy0+ZXJyX2ZpbGVbZXMtPnRvcF09ZmlsZTsKKwllcy0+ZXJyX2xpbmVbZXMtPnRvcF09bGluZTsKKwllcnJfY2xlYXJfZGF0YShlcyxlcy0+dG9wKTsKKwl9CisKK3ZvaWQgRVJSX2NsZWFyX2Vycm9yKHZvaWQpCisJeworCWludCBpOworCUVSUl9TVEFURSAqZXM7CisKKwllcz1FUlJfZ2V0X3N0YXRlKCk7CisKKwlmb3IgKGk9MDsgaTxFUlJfTlVNX0VSUk9SUzsgaSsrKQorCQl7CisJCWVycl9jbGVhcihlcyxpKTsKKwkJfQorCWVzLT50b3A9ZXMtPmJvdHRvbT0wOworCX0KKworCit1bnNpZ25lZCBsb25nIEVSUl9nZXRfZXJyb3Iodm9pZCkKKwl7IHJldHVybihnZXRfZXJyb3JfdmFsdWVzKDEsMCxOVUxMLE5VTEwsTlVMTCxOVUxMKSk7IH0KKwordW5zaWduZWQgbG9uZyBFUlJfZ2V0X2Vycm9yX2xpbmUoY29uc3QgY2hhciAqKmZpbGUsCisJICAgICBpbnQgKmxpbmUpCisJeyByZXR1cm4oZ2V0X2Vycm9yX3ZhbHVlcygxLDAsZmlsZSxsaW5lLE5VTEwsTlVMTCkpOyB9CisKK3Vuc2lnbmVkIGxvbmcgRVJSX2dldF9lcnJvcl9saW5lX2RhdGEoY29uc3QgY2hhciAqKmZpbGUsIGludCAqbGluZSwKKwkgICAgIGNvbnN0IGNoYXIgKipkYXRhLCBpbnQgKmZsYWdzKQorCXsgcmV0dXJuKGdldF9lcnJvcl92YWx1ZXMoMSwwLGZpbGUsbGluZSxkYXRhLGZsYWdzKSk7IH0KKworCit1bnNpZ25lZCBsb25nIEVSUl9wZWVrX2Vycm9yKHZvaWQpCisJeyByZXR1cm4oZ2V0X2Vycm9yX3ZhbHVlcygwLDAsTlVMTCxOVUxMLE5VTEwsTlVMTCkpOyB9CisKK3Vuc2lnbmVkIGxvbmcgRVJSX3BlZWtfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKQorCXsgcmV0dXJuKGdldF9lcnJvcl92YWx1ZXMoMCwwLGZpbGUsbGluZSxOVUxMLE5VTEwpKTsgfQorCit1bnNpZ25lZCBsb25nIEVSUl9wZWVrX2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAorCSAgICAgY29uc3QgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpCisJeyByZXR1cm4oZ2V0X2Vycm9yX3ZhbHVlcygwLDAsZmlsZSxsaW5lLGRhdGEsZmxhZ3MpKTsgfQorCisKK3Vuc2lnbmVkIGxvbmcgRVJSX3BlZWtfbGFzdF9lcnJvcih2b2lkKQorCXsgcmV0dXJuKGdldF9lcnJvcl92YWx1ZXMoMCwxLE5VTEwsTlVMTCxOVUxMLE5VTEwpKTsgfQorCit1bnNpZ25lZCBsb25nIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lKQorCXsgcmV0dXJuKGdldF9lcnJvcl92YWx1ZXMoMCwxLGZpbGUsbGluZSxOVUxMLE5VTEwpKTsgfQorCit1bnNpZ25lZCBsb25nIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZV9kYXRhKGNvbnN0IGNoYXIgKipmaWxlLCBpbnQgKmxpbmUsCisJICAgICBjb25zdCBjaGFyICoqZGF0YSwgaW50ICpmbGFncykKKwl7IHJldHVybihnZXRfZXJyb3JfdmFsdWVzKDAsMSxmaWxlLGxpbmUsZGF0YSxmbGFncykpOyB9CisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2Vycm9yX3ZhbHVlcyhpbnQgaW5jLCBpbnQgdG9wLCBjb25zdCBjaGFyICoqZmlsZSwgaW50ICpsaW5lLAorCSAgICAgY29uc3QgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpCisJewkKKwlpbnQgaT0wOworCUVSUl9TVEFURSAqZXM7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwllcz1FUlJfZ2V0X3N0YXRlKCk7CisKKwlpZiAoaW5jICYmIHRvcCkKKwkJeworCQlpZiAoZmlsZSkgKmZpbGUgPSAiIjsKKwkJaWYgKGxpbmUpICpsaW5lID0gMDsKKwkJaWYgKGRhdGEpICpkYXRhID0gIiI7CisJCWlmIChmbGFncykgKmZsYWdzID0gMDsKKwkJCQorCQlyZXR1cm4gRVJSX1JfSU5URVJOQUxfRVJST1I7CisJCX0KKworCWlmIChlcy0+Ym90dG9tID09IGVzLT50b3ApIHJldHVybiAwOworCWlmICh0b3ApCisJCWk9ZXMtPnRvcDsJCQkgLyogbGFzdCBlcnJvciAqLworCWVsc2UKKwkJaT0oZXMtPmJvdHRvbSsxKSVFUlJfTlVNX0VSUk9SUzsgLyogZmlyc3QgZXJyb3IgKi8KKworCXJldD1lcy0+ZXJyX2J1ZmZlcltpXTsKKwlpZiAoaW5jKQorCQl7CisJCWVzLT5ib3R0b209aTsKKwkJZXMtPmVycl9idWZmZXJbaV09MDsKKwkJfQorCisJaWYgKChmaWxlICE9IE5VTEwpICYmIChsaW5lICE9IE5VTEwpKQorCQl7CisJCWlmIChlcy0+ZXJyX2ZpbGVbaV0gPT0gTlVMTCkKKwkJCXsKKwkJCSpmaWxlPSJOQSI7CisJCQlpZiAobGluZSAhPSBOVUxMKSAqbGluZT0wOworCQkJfQorCQllbHNlCisJCQl7CisJCQkqZmlsZT1lcy0+ZXJyX2ZpbGVbaV07CisJCQlpZiAobGluZSAhPSBOVUxMKSAqbGluZT1lcy0+ZXJyX2xpbmVbaV07CisJCQl9CisJCX0KKworCWlmIChkYXRhID09IE5VTEwpCisJCXsKKwkJaWYgKGluYykKKwkJCXsKKwkJCWVycl9jbGVhcl9kYXRhKGVzLCBpKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpZiAoZXMtPmVycl9kYXRhW2ldID09IE5VTEwpCisJCQl7CisJCQkqZGF0YT0iIjsKKwkJCWlmIChmbGFncyAhPSBOVUxMKSAqZmxhZ3M9MDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJKmRhdGE9ZXMtPmVycl9kYXRhW2ldOworCQkJaWYgKGZsYWdzICE9IE5VTEwpICpmbGFncz1lcy0+ZXJyX2RhdGFfZmxhZ3NbaV07CisJCQl9CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKwordm9pZCBFUlJfZXJyb3Jfc3RyaW5nX24odW5zaWduZWQgbG9uZyBlLCBjaGFyICpidWYsIHNpemVfdCBsZW4pCisJeworCWNoYXIgbHNidWZbNjRdLCBmc2J1Zls2NF0sIHJzYnVmWzY0XTsKKwljb25zdCBjaGFyICpscywqZnMsKnJzOworCXVuc2lnbmVkIGxvbmcgbCxmLHI7CisKKwlsPUVSUl9HRVRfTElCKGUpOworCWY9RVJSX0dFVF9GVU5DKGUpOworCXI9RVJSX0dFVF9SRUFTT04oZSk7CisKKwlscz1FUlJfbGliX2Vycm9yX3N0cmluZyhlKTsKKwlmcz1FUlJfZnVuY19lcnJvcl9zdHJpbmcoZSk7CisJcnM9RVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoZSk7CisKKwlpZiAobHMgPT0gTlVMTCkgCisJCUJJT19zbnByaW50Zihsc2J1Ziwgc2l6ZW9mKGxzYnVmKSwgImxpYiglbHUpIiwgbCk7CisJaWYgKGZzID09IE5VTEwpCisJCUJJT19zbnByaW50Zihmc2J1Ziwgc2l6ZW9mKGZzYnVmKSwgImZ1bmMoJWx1KSIsIGYpOworCWlmIChycyA9PSBOVUxMKQorCQlCSU9fc25wcmludGYocnNidWYsIHNpemVvZihyc2J1ZiksICJyZWFzb24oJWx1KSIsIHIpOworCisJQklPX3NucHJpbnRmKGJ1ZiwgbGVuLCJlcnJvcjolMDhsWDolczolczolcyIsIGUsIGxzP2xzOmxzYnVmLCAKKwkJZnM/ZnM6ZnNidWYsIHJzP3JzOnJzYnVmKTsKKwlpZiAoc3RybGVuKGJ1ZikgPT0gbGVuLTEpCisJCXsKKwkJLyogb3V0cHV0IG1heSBiZSB0cnVuY2F0ZWQ7IG1ha2Ugc3VyZSB3ZSBhbHdheXMgaGF2ZSA1IAorCQkgKiBjb2xvbi1zZXBhcmF0ZWQgZmllbGRzLCBpLmUuIDQgY29sb25zIC4uLiAqLworI2RlZmluZSBOVU1fQ09MT05TIDQKKwkJaWYgKGxlbiA+IE5VTV9DT0xPTlMpIC8qIC4uLiBpZiBwb3NzaWJsZSAqLworCQkJeworCQkJaW50IGk7CisJCQljaGFyICpzID0gYnVmOworCQkJCisJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0NPTE9OUzsgaSsrKQorCQkJCXsKKwkJCQljaGFyICpjb2xvbiA9IHN0cmNocihzLCAnOicpOworCQkJCWlmIChjb2xvbiA9PSBOVUxMIHx8IGNvbG9uID4gJmJ1ZltsZW4tMV0gLSBOVU1fQ09MT05TICsgaSkKKwkJCQkJeworCQkJCQkvKiBzZXQgY29sb24gbm8uIGkgYXQgbGFzdCBwb3NzaWJsZSBwb3NpdGlvbgorCQkJCQkgKiAoYnVmW2xlbi0xXSBpcyB0aGUgdGVybWluYXRpbmcgMCkqLworCQkJCQljb2xvbiA9ICZidWZbbGVuLTFdIC0gTlVNX0NPTE9OUyArIGk7CisJCQkJCSpjb2xvbiA9ICc6JzsKKwkJCQkJfQorCQkJCXMgPSBjb2xvbiArIDE7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisvKiBCQUQgZm9yIG11bHRpLXRocmVhZGluZzogdXNlcyBhIGxvY2FsIGJ1ZmZlciBpZiByZXQgPT0gTlVMTCAqLworLyogRVJSX2Vycm9yX3N0cmluZ19uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgZm9yIHJldCAhPSBOVUxMCisgKiBhcyBFUlJfZXJyb3Jfc3RyaW5nIGNhbm5vdCBrbm93IGhvdyBsYXJnZSB0aGUgYnVmZmVyIGlzICovCitjaGFyICpFUlJfZXJyb3Jfc3RyaW5nKHVuc2lnbmVkIGxvbmcgZSwgY2hhciAqcmV0KQorCXsKKwlzdGF0aWMgY2hhciBidWZbMjU2XTsKKworCWlmIChyZXQgPT0gTlVMTCkgcmV0PWJ1ZjsKKwlFUlJfZXJyb3Jfc3RyaW5nX24oZSwgcmV0LCAyNTYpOworCisJcmV0dXJuIHJldDsKKwl9CisKK0xIQVNIX09GKEVSUl9TVFJJTkdfREFUQSkgKkVSUl9nZXRfc3RyaW5nX3RhYmxlKHZvaWQpCisJeworCWVycl9mbnNfY2hlY2soKTsKKwlyZXR1cm4gRVJSRk4oZXJyX2dldCkoMCk7CisJfQorCitMSEFTSF9PRihFUlJfU1RBVEUpICpFUlJfZ2V0X2Vycl9zdGF0ZV90YWJsZSh2b2lkKQorCXsKKwllcnJfZm5zX2NoZWNrKCk7CisJcmV0dXJuIEVSUkZOKHRocmVhZF9nZXQpKDApOworCX0KKwordm9pZCBFUlJfcmVsZWFzZV9lcnJfc3RhdGVfdGFibGUoTEhBU0hfT0YoRVJSX1NUQVRFKSAqKmhhc2gpCisJeworCWVycl9mbnNfY2hlY2soKTsKKwlFUlJGTih0aHJlYWRfcmVsZWFzZSkoaGFzaCk7CisJfQorCitjb25zdCBjaGFyICpFUlJfbGliX2Vycm9yX3N0cmluZyh1bnNpZ25lZCBsb25nIGUpCisJeworCUVSUl9TVFJJTkdfREFUQSBkLCpwOworCXVuc2lnbmVkIGxvbmcgbDsKKworCWVycl9mbnNfY2hlY2soKTsKKwlsPUVSUl9HRVRfTElCKGUpOworCWQuZXJyb3I9RVJSX1BBQ0sobCwwLDApOworCXA9RVJSRk4oZXJyX2dldF9pdGVtKSgmZCk7CisJcmV0dXJuKChwID09IE5VTEwpP05VTEw6cC0+c3RyaW5nKTsKKwl9CisKK2NvbnN0IGNoYXIgKkVSUl9mdW5jX2Vycm9yX3N0cmluZyh1bnNpZ25lZCBsb25nIGUpCisJeworCUVSUl9TVFJJTkdfREFUQSBkLCpwOworCXVuc2lnbmVkIGxvbmcgbCxmOworCisJZXJyX2Zuc19jaGVjaygpOworCWw9RVJSX0dFVF9MSUIoZSk7CisJZj1FUlJfR0VUX0ZVTkMoZSk7CisJZC5lcnJvcj1FUlJfUEFDSyhsLGYsMCk7CisJcD1FUlJGTihlcnJfZ2V0X2l0ZW0pKCZkKTsKKwlyZXR1cm4oKHAgPT0gTlVMTCk/TlVMTDpwLT5zdHJpbmcpOworCX0KKworY29uc3QgY2hhciAqRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcodW5zaWduZWQgbG9uZyBlKQorCXsKKwlFUlJfU1RSSU5HX0RBVEEgZCwqcD1OVUxMOworCXVuc2lnbmVkIGxvbmcgbCxyOworCisJZXJyX2Zuc19jaGVjaygpOworCWw9RVJSX0dFVF9MSUIoZSk7CisJcj1FUlJfR0VUX1JFQVNPTihlKTsKKwlkLmVycm9yPUVSUl9QQUNLKGwsMCxyKTsKKwlwPUVSUkZOKGVycl9nZXRfaXRlbSkoJmQpOworCWlmICghcCkKKwkJeworCQlkLmVycm9yPUVSUl9QQUNLKDAsMCxyKTsKKwkJcD1FUlJGTihlcnJfZ2V0X2l0ZW0pKCZkKTsKKwkJfQorCXJldHVybigocCA9PSBOVUxMKT9OVUxMOnAtPnN0cmluZyk7CisJfQorCit2b2lkIEVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKGNvbnN0IENSWVBUT19USFJFQURJRCAqaWQpCisJeworCUVSUl9TVEFURSB0bXA7CisKKwlpZiAoaWQpCisJCUNSWVBUT19USFJFQURJRF9jcHkoJnRtcC50aWQsIGlkKTsKKwllbHNlCisJCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZ0bXAudGlkKTsKKwllcnJfZm5zX2NoZWNrKCk7CisJLyogdGhyZWFkX2RlbF9pdGVtIGF1dG9tYXRpY2FsbHkgZGVzdHJveXMgdGhlIExIQVNIIGlmIHRoZSBudW1iZXIgb2YKKwkgKiBpdGVtcyByZWFjaGVzIHplcm8uICovCisJRVJSRk4odGhyZWFkX2RlbF9pdGVtKSgmdG1wKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECit2b2lkIEVSUl9yZW1vdmVfc3RhdGUodW5zaWduZWQgbG9uZyBwaWQpCisJeworCUVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKE5VTEwpOworCX0KKyNlbmRpZgorCitFUlJfU1RBVEUgKkVSUl9nZXRfc3RhdGUodm9pZCkKKwl7CisJc3RhdGljIEVSUl9TVEFURSBmYWxsYmFjazsKKwlFUlJfU1RBVEUgKnJldCx0bXAsKnRtcHA9TlVMTDsKKwlpbnQgaTsKKwlDUllQVE9fVEhSRUFESUQgdGlkOworCisJZXJyX2Zuc19jaGVjaygpOworCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZ0aWQpOworCUNSWVBUT19USFJFQURJRF9jcHkoJnRtcC50aWQsICZ0aWQpOworCXJldD1FUlJGTih0aHJlYWRfZ2V0X2l0ZW0pKCZ0bXApOworCisJLyogcmV0ID09IHRoZSBlcnJvciBzdGF0ZSwgaWYgTlVMTCwgbWFrZSBhIG5ldyBvbmUgKi8KKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJcmV0PShFUlJfU1RBVEUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRVJSX1NUQVRFKSk7CisJCWlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKCZmYWxsYmFjayk7CisJCUNSWVBUT19USFJFQURJRF9jcHkoJnJldC0+dGlkLCAmdGlkKTsKKwkJcmV0LT50b3A9MDsKKwkJcmV0LT5ib3R0b209MDsKKwkJZm9yIChpPTA7IGk8RVJSX05VTV9FUlJPUlM7IGkrKykKKwkJCXsKKwkJCXJldC0+ZXJyX2RhdGFbaV09TlVMTDsKKwkJCXJldC0+ZXJyX2RhdGFfZmxhZ3NbaV09MDsKKwkJCX0KKwkJdG1wcCA9IEVSUkZOKHRocmVhZF9zZXRfaXRlbSkocmV0KTsKKwkJLyogVG8gY2hlY2sgaWYgaW5zZXJ0aW9uIGZhaWxlZCwgZG8gYSBnZXQuICovCisJCWlmIChFUlJGTih0aHJlYWRfZ2V0X2l0ZW0pKHJldCkgIT0gcmV0KQorCQkJeworCQkJRVJSX1NUQVRFX2ZyZWUocmV0KTsgLyogY291bGQgbm90IGluc2VydCBpdCAqLworCQkJcmV0dXJuKCZmYWxsYmFjayk7CisJCQl9CisJCS8qIElmIGEgcmFjZSBvY2N1cmVkIGluIHRoaXMgZnVuY3Rpb24gYW5kIHdlIGNhbWUgc2Vjb25kLCB0bXBwCisJCSAqIGlzIHRoZSBmaXJzdCBvbmUgdGhhdCB3ZSBqdXN0IHJlcGxhY2VkLiAqLworCQlpZiAodG1wcCkKKwkJCUVSUl9TVEFURV9mcmVlKHRtcHApOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBFUlJfZ2V0X25leHRfZXJyb3JfbGlicmFyeSh2b2lkKQorCXsKKwllcnJfZm5zX2NoZWNrKCk7CisJcmV0dXJuIEVSUkZOKGdldF9uZXh0X2xpYikoKTsKKwl9CisKK3ZvaWQgRVJSX3NldF9lcnJvcl9kYXRhKGNoYXIgKmRhdGEsIGludCBmbGFncykKKwl7CisJRVJSX1NUQVRFICplczsKKwlpbnQgaTsKKworCWVzPUVSUl9nZXRfc3RhdGUoKTsKKworCWk9ZXMtPnRvcDsKKwlpZiAoaSA9PSAwKQorCQlpPUVSUl9OVU1fRVJST1JTLTE7CisKKwllcnJfY2xlYXJfZGF0YShlcyxpKTsKKwllcy0+ZXJyX2RhdGFbaV09ZGF0YTsKKwllcy0+ZXJyX2RhdGFfZmxhZ3NbaV09ZmxhZ3M7CisJfQorCit2b2lkIEVSUl9hZGRfZXJyb3JfZGF0YShpbnQgbnVtLCAuLi4pCisJeworCXZhX2xpc3QgYXJnczsKKwlpbnQgaSxuLHM7CisJY2hhciAqc3RyLCpwLCphOworCisJcz04MDsKKwlzdHI9T1BFTlNTTF9tYWxsb2MocysxKTsKKwlpZiAoc3RyID09IE5VTEwpIHJldHVybjsKKwlzdHJbMF09J1wwJzsKKworCXZhX3N0YXJ0KGFyZ3MsIG51bSk7CisJbj0wOworCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCQl7CisJCWE9dmFfYXJnKGFyZ3MsIGNoYXIqKTsKKwkJLyogaWdub3JlIE5VTExzLCB0aGFua3MgdG8gQm9iIEJlY2sgPGJlY2tAb2J0dXNlLmNvbT4gKi8KKwkJaWYgKGEgIT0gTlVMTCkKKwkJCXsKKwkJCW4rPXN0cmxlbihhKTsKKwkJCWlmIChuID4gcykKKwkJCQl7CisJCQkJcz1uKzIwOworCQkJCXA9T1BFTlNTTF9yZWFsbG9jKHN0cixzKzEpOworCQkJCWlmIChwID09IE5VTEwpCisJCQkJCXsKKwkJCQkJT1BFTlNTTF9mcmVlKHN0cik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQlzdHI9cDsKKwkJCQl9CisJCQlCVUZfc3RybGNhdChzdHIsYSwoc2l6ZV90KXMrMSk7CisJCQl9CisJCX0KKwlFUlJfc2V0X2Vycm9yX2RhdGEoc3RyLEVSUl9UWFRfTUFMTE9DRUR8RVJSX1RYVF9TVFJJTkcpOworCitlcnI6CisJdmFfZW5kKGFyZ3MpOworCX0KKworaW50IEVSUl9zZXRfbWFyayh2b2lkKQorCXsKKwlFUlJfU1RBVEUgKmVzOworCisJZXM9RVJSX2dldF9zdGF0ZSgpOworCisJaWYgKGVzLT5ib3R0b20gPT0gZXMtPnRvcCkgcmV0dXJuIDA7CisJZXMtPmVycl9mbGFnc1tlcy0+dG9wXXw9RVJSX0ZMQUdfTUFSSzsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBFUlJfcG9wX3RvX21hcmsodm9pZCkKKwl7CisJRVJSX1NUQVRFICplczsKKworCWVzPUVSUl9nZXRfc3RhdGUoKTsKKworCXdoaWxlKGVzLT5ib3R0b20gIT0gZXMtPnRvcAorCQkmJiAoZXMtPmVycl9mbGFnc1tlcy0+dG9wXSAmIEVSUl9GTEFHX01BUkspID09IDApCisJCXsKKwkJZXJyX2NsZWFyKGVzLGVzLT50b3ApOworCQllcy0+dG9wLT0xOworCQlpZiAoZXMtPnRvcCA9PSAtMSkgZXMtPnRvcD1FUlJfTlVNX0VSUk9SUy0xOworCQl9CisJCQorCWlmIChlcy0+Ym90dG9tID09IGVzLT50b3ApIHJldHVybiAwOworCWVzLT5lcnJfZmxhZ3NbZXMtPnRvcF0mPX5FUlJfRkxBR19NQVJLOworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lcnIvZXJyLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vZXJyL2Vyci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjhjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXJyL2Vyci5oCkBAIC0wLDAgKzEsMzg1IEBACisvKiBjcnlwdG8vZXJyL2Vyci5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfRVJSX0gKKyNkZWZpbmUgSEVBREVSX0VSUl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0xIQVNICisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2VuZGlmCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorI2RlZmluZSBFUlJfUFVUX2Vycm9yKGEsYixjLGQsZSkJRVJSX3B1dF9lcnJvcihhLGIsYyxkLGUpCisjZWxzZQorI2RlZmluZSBFUlJfUFVUX2Vycm9yKGEsYixjLGQsZSkJRVJSX3B1dF9lcnJvcihhLGIsYyxOVUxMLDApCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgRVJSX1RYVF9NQUxMT0NFRAkweDAxCisjZGVmaW5lIEVSUl9UWFRfU1RSSU5HCQkweDAyCisKKyNkZWZpbmUgRVJSX0ZMQUdfTUFSSwkJMHgwMQorCisjZGVmaW5lIEVSUl9OVU1fRVJST1JTCTE2Cit0eXBlZGVmIHN0cnVjdCBlcnJfc3RhdGVfc3QKKwl7CisJQ1JZUFRPX1RIUkVBRElEIHRpZDsKKwlpbnQgZXJyX2ZsYWdzW0VSUl9OVU1fRVJST1JTXTsKKwl1bnNpZ25lZCBsb25nIGVycl9idWZmZXJbRVJSX05VTV9FUlJPUlNdOworCWNoYXIgKmVycl9kYXRhW0VSUl9OVU1fRVJST1JTXTsKKwlpbnQgZXJyX2RhdGFfZmxhZ3NbRVJSX05VTV9FUlJPUlNdOworCWNvbnN0IGNoYXIgKmVycl9maWxlW0VSUl9OVU1fRVJST1JTXTsKKwlpbnQgZXJyX2xpbmVbRVJSX05VTV9FUlJPUlNdOworCWludCB0b3AsYm90dG9tOworCX0gRVJSX1NUQVRFOworCisvKiBsaWJyYXJ5ICovCisjZGVmaW5lIEVSUl9MSUJfTk9ORQkJMQorI2RlZmluZSBFUlJfTElCX1NZUwkJMgorI2RlZmluZSBFUlJfTElCX0JOCQkzCisjZGVmaW5lIEVSUl9MSUJfUlNBCQk0CisjZGVmaW5lIEVSUl9MSUJfREgJCTUKKyNkZWZpbmUgRVJSX0xJQl9FVlAJCTYKKyNkZWZpbmUgRVJSX0xJQl9CVUYJCTcKKyNkZWZpbmUgRVJSX0xJQl9PQkoJCTgKKyNkZWZpbmUgRVJSX0xJQl9QRU0JCTkKKyNkZWZpbmUgRVJSX0xJQl9EU0EJCTEwCisjZGVmaW5lIEVSUl9MSUJfWDUwOQkJMTEKKy8qICNkZWZpbmUgRVJSX0xJQl9NRVRIICAgICAgICAgMTIgKi8KKyNkZWZpbmUgRVJSX0xJQl9BU04xCQkxMworI2RlZmluZSBFUlJfTElCX0NPTkYJCTE0CisjZGVmaW5lIEVSUl9MSUJfQ1JZUFRPCQkxNQorI2RlZmluZSBFUlJfTElCX0VDCQkxNgorI2RlZmluZSBFUlJfTElCX1NTTAkJMjAKKy8qICNkZWZpbmUgRVJSX0xJQl9TU0wyMyAgICAgICAgMjEgKi8KKy8qICNkZWZpbmUgRVJSX0xJQl9TU0wyICAgICAgICAgMjIgKi8KKy8qICNkZWZpbmUgRVJSX0xJQl9TU0wzICAgICAgICAgMjMgKi8KKy8qICNkZWZpbmUgRVJSX0xJQl9SU0FSRUYgICAgICAgMzAgKi8KKy8qICNkZWZpbmUgRVJSX0xJQl9QUk9YWSAgICAgICAgMzEgKi8KKyNkZWZpbmUgRVJSX0xJQl9CSU8JCTMyCisjZGVmaW5lIEVSUl9MSUJfUEtDUzcJCTMzCisjZGVmaW5lIEVSUl9MSUJfWDUwOVYzCQkzNAorI2RlZmluZSBFUlJfTElCX1BLQ1MxMgkJMzUKKyNkZWZpbmUgRVJSX0xJQl9SQU5ECQkzNgorI2RlZmluZSBFUlJfTElCX0RTTwkJMzcKKyNkZWZpbmUgRVJSX0xJQl9FTkdJTkUJCTM4CisjZGVmaW5lIEVSUl9MSUJfT0NTUCAgICAgICAgICAgIDM5CisjZGVmaW5lIEVSUl9MSUJfVUkgICAgICAgICAgICAgIDQwCisjZGVmaW5lIEVSUl9MSUJfQ09NUCAgICAgICAgICAgIDQxCisjZGVmaW5lIEVSUl9MSUJfRUNEU0EJCTQyCisjZGVmaW5lIEVSUl9MSUJfRUNESAkJNDMKKyNkZWZpbmUgRVJSX0xJQl9TVE9SRSAgICAgICAgICAgNDQKKyNkZWZpbmUgRVJSX0xJQl9GSVBTCQk0NQorI2RlZmluZSBFUlJfTElCX0NNUwkJNDYKKyNkZWZpbmUgRVJSX0xJQl9UUwkJNDcKKyNkZWZpbmUgRVJSX0xJQl9ITUFDCQk0OAorI2RlZmluZSBFUlJfTElCX0pQQUtFCQk0OQorCisjZGVmaW5lIEVSUl9MSUJfVVNFUgkJMTI4CisKKyNkZWZpbmUgU1lTZXJyKGYscikgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9TWVMsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgQk5lcnIoZixyKSAgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9CTiwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBSU0FlcnIoZixyKSAgRVJSX1BVVF9lcnJvcihFUlJfTElCX1JTQSwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBESGVycihmLHIpICAgRVJSX1BVVF9lcnJvcihFUlJfTElCX0RILChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIEVWUGVycihmLHIpICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfRVZQLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIEJVRmVycihmLHIpICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfQlVGLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIE9CSmVycihmLHIpICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfT0JKLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIFBFTWVycihmLHIpICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfUEVNLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIERTQWVycihmLHIpICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfRFNBLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIFg1MDllcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfWDUwOSwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBBU04xZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX0FTTjEsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgQ09ORmVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9DT05GLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIENSWVBUT2VycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9DUllQVE8sKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgRUNlcnIoZixyKSAgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9FQywoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBTU0xlcnIoZixyKSAgRVJSX1BVVF9lcnJvcihFUlJfTElCX1NTTCwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBCSU9lcnIoZixyKSAgRVJSX1BVVF9lcnJvcihFUlJfTElCX0JJTywoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBQS0NTN2VycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9QS0NTNywoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBYNTA5VjNlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfWDUwOVYzLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIFBLQ1MxMmVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9QS0NTMTIsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgUkFORGVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9SQU5ELChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIERTT2VycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9EU08sKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgRU5HSU5FZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX0VOR0lORSwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBPQ1NQZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX09DU1AsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgVUllcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfVUksKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgQ09NUGVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9DT01QLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIEVDRFNBZXJyKGYscikgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9FQ0RTQSwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBFQ0RIZXJyKGYscikgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9FQ0RILChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIFNUT1JFZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX1NUT1JFLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIEZJUFNlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfRklQUywoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBDTVNlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfQ01TLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIFRTZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX1RTLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIEhNQUNlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfSE1BQywoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBKUEFLRWVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9KUEFLRSwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorCisvKiBCb3JsYW5kIEMgc2VlbXMgdG9vIHN0dXBpZCB0byBiZSBhYmxlIHRvIHNoaWZ0IGFuZCBkbyBsb25ncyBpbgorICogdGhlIHByZS1wcm9jZXNzb3IgOi0oICovCisjZGVmaW5lIEVSUl9QQUNLKGwsZixyKQkJKCgoKCh1bnNpZ25lZCBsb25nKWwpJjB4ZmZMKSoweDEwMDAwMDApfCBcCisJCQkJKCgoKHVuc2lnbmVkIGxvbmcpZikmMHhmZmZMKSoweDEwMDApfCBcCisJCQkJKCgoKHVuc2lnbmVkIGxvbmcpcikmMHhmZmZMKSkpCisjZGVmaW5lIEVSUl9HRVRfTElCKGwpCQkoaW50KSgoKCh1bnNpZ25lZCBsb25nKWwpPj4yNEwpJjB4ZmZMKQorI2RlZmluZSBFUlJfR0VUX0ZVTkMobCkJCShpbnQpKCgoKHVuc2lnbmVkIGxvbmcpbCk+PjEyTCkmMHhmZmZMKQorI2RlZmluZSBFUlJfR0VUX1JFQVNPTihsKQkoaW50KSgobCkmMHhmZmZMKQorI2RlZmluZSBFUlJfRkFUQUxfRVJST1IobCkJKGludCkoKGwpJkVSUl9SX0ZBVEFMKQorCisKKy8qIE9TIGZ1bmN0aW9ucyAqLworI2RlZmluZSBTWVNfRl9GT1BFTgkJMQorI2RlZmluZSBTWVNfRl9DT05ORUNUCQkyCisjZGVmaW5lIFNZU19GX0dFVFNFUlZCWU5BTUUJMworI2RlZmluZSBTWVNfRl9TT0NLRVQJCTQKKyNkZWZpbmUgU1lTX0ZfSU9DVExTT0NLRVQJNQorI2RlZmluZSBTWVNfRl9CSU5ECQk2CisjZGVmaW5lIFNZU19GX0xJU1RFTgkJNworI2RlZmluZSBTWVNfRl9BQ0NFUFQJCTgKKyNkZWZpbmUgU1lTX0ZfV1NBU1RBUlRVUAk5IC8qIFdpbnNvY2sgc3R1ZmYgKi8KKyNkZWZpbmUgU1lTX0ZfT1BFTkRJUgkJMTAKKyNkZWZpbmUgU1lTX0ZfRlJFQUQJCTExCisKKworLyogcmVhc29ucyAqLworI2RlZmluZSBFUlJfUl9TWVNfTElCCUVSUl9MSUJfU1lTICAgICAgIC8qIDIgKi8KKyNkZWZpbmUgRVJSX1JfQk5fTElCCUVSUl9MSUJfQk4gICAgICAgIC8qIDMgKi8KKyNkZWZpbmUgRVJSX1JfUlNBX0xJQglFUlJfTElCX1JTQSAgICAgICAvKiA0ICovCisjZGVmaW5lIEVSUl9SX0RIX0xJQglFUlJfTElCX0RIICAgICAgICAvKiA1ICovCisjZGVmaW5lIEVSUl9SX0VWUF9MSUIJRVJSX0xJQl9FVlAgICAgICAgLyogNiAqLworI2RlZmluZSBFUlJfUl9CVUZfTElCCUVSUl9MSUJfQlVGICAgICAgIC8qIDcgKi8KKyNkZWZpbmUgRVJSX1JfT0JKX0xJQglFUlJfTElCX09CSiAgICAgICAvKiA4ICovCisjZGVmaW5lIEVSUl9SX1BFTV9MSUIJRVJSX0xJQl9QRU0gICAgICAgLyogOSAqLworI2RlZmluZSBFUlJfUl9EU0FfTElCCUVSUl9MSUJfRFNBICAgICAgLyogMTAgKi8KKyNkZWZpbmUgRVJSX1JfWDUwOV9MSUIJRVJSX0xJQl9YNTA5ICAgICAvKiAxMSAqLworI2RlZmluZSBFUlJfUl9BU04xX0xJQglFUlJfTElCX0FTTjEgICAgIC8qIDEzICovCisjZGVmaW5lIEVSUl9SX0NPTkZfTElCCUVSUl9MSUJfQ09ORiAgICAgLyogMTQgKi8KKyNkZWZpbmUgRVJSX1JfQ1JZUFRPX0xJQiBFUlJfTElCX0NSWVBUTyAgLyogMTUgKi8KKyNkZWZpbmUgRVJSX1JfRUNfTElCCUVSUl9MSUJfRUMgICAgICAgLyogMTYgKi8KKyNkZWZpbmUgRVJSX1JfU1NMX0xJQglFUlJfTElCX1NTTCAgICAgIC8qIDIwICovCisjZGVmaW5lIEVSUl9SX0JJT19MSUIJRVJSX0xJQl9CSU8gICAgICAvKiAzMiAqLworI2RlZmluZSBFUlJfUl9QS0NTN19MSUIJRVJSX0xJQl9QS0NTNyAgICAvKiAzMyAqLworI2RlZmluZSBFUlJfUl9YNTA5VjNfTElCIEVSUl9MSUJfWDUwOVYzICAvKiAzNCAqLworI2RlZmluZSBFUlJfUl9QS0NTMTJfTElCIEVSUl9MSUJfUEtDUzEyICAvKiAzNSAqLworI2RlZmluZSBFUlJfUl9SQU5EX0xJQglFUlJfTElCX1JBTkQgICAgIC8qIDM2ICovCisjZGVmaW5lIEVSUl9SX0RTT19MSUIJRVJSX0xJQl9EU08gICAgICAvKiAzNyAqLworI2RlZmluZSBFUlJfUl9FTkdJTkVfTElCIEVSUl9MSUJfRU5HSU5FICAvKiAzOCAqLworI2RlZmluZSBFUlJfUl9PQ1NQX0xJQiAgRVJSX0xJQl9PQ1NQICAgICAvKiAzOSAqLworI2RlZmluZSBFUlJfUl9VSV9MSUIgICAgRVJSX0xJQl9VSSAgICAgICAvKiA0MCAqLworI2RlZmluZSBFUlJfUl9DT01QX0xJQglFUlJfTElCX0NPTVAgICAgIC8qIDQxICovCisjZGVmaW5lIEVSUl9SX0VDRFNBX0xJQiBFUlJfTElCX0VDRFNBCSAvKiA0MiAqLworI2RlZmluZSBFUlJfUl9FQ0RIX0xJQiAgRVJSX0xJQl9FQ0RICSAvKiA0MyAqLworI2RlZmluZSBFUlJfUl9TVE9SRV9MSUIgRVJSX0xJQl9TVE9SRSAgICAvKiA0NCAqLworI2RlZmluZSBFUlJfUl9UU19MSUIJRVJSX0xJQl9UUyAgICAgICAvKiA0NSAqLworCisjZGVmaW5lIEVSUl9SX05FU1RFRF9BU04xX0VSUk9SCQkJNTgKKyNkZWZpbmUgRVJSX1JfQkFEX0FTTjFfT0JKRUNUX0hFQURFUgkJNTkKKyNkZWZpbmUgRVJSX1JfQkFEX0dFVF9BU04xX09CSkVDVF9DQUxMCQk2MAorI2RlZmluZSBFUlJfUl9FWFBFQ1RJTkdfQU5fQVNOMV9TRVFVRU5DRQk2MQorI2RlZmluZSBFUlJfUl9BU04xX0xFTkdUSF9NSVNNQVRDSAkJNjIKKyNkZWZpbmUgRVJSX1JfTUlTU0lOR19BU04xX0VPUwkJCTYzCisKKy8qIGZhdGFsIGVycm9yICovCisjZGVmaW5lIEVSUl9SX0ZBVEFMCQkJCTY0CisjZGVmaW5lCUVSUl9SX01BTExPQ19GQUlMVVJFCQkJKDF8RVJSX1JfRkFUQUwpCisjZGVmaW5lCUVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRAkoMnxFUlJfUl9GQVRBTCkKKyNkZWZpbmUJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSCQkoM3xFUlJfUl9GQVRBTCkKKyNkZWZpbmUJRVJSX1JfSU5URVJOQUxfRVJST1IJCQkoNHxFUlJfUl9GQVRBTCkKKyNkZWZpbmUJRVJSX1JfRElTQUJMRUQJCQkJKDV8RVJSX1JfRkFUQUwpCisKKy8qIDk5IGlzIHRoZSBtYXhpbXVtIHBvc3NpYmxlIEVSUl9SXy4uLiBjb2RlLCBoaWdoZXIgdmFsdWVzCisgKiBhcmUgcmVzZXJ2ZWQgZm9yIHRoZSBpbmRpdmlkdWFsIGxpYnJhcmllcyAqLworCisKK3R5cGVkZWYgc3RydWN0IEVSUl9zdHJpbmdfZGF0YV9zdAorCXsKKwl1bnNpZ25lZCBsb25nIGVycm9yOworCWNvbnN0IGNoYXIgKnN0cmluZzsKKwl9IEVSUl9TVFJJTkdfREFUQTsKKwordm9pZCBFUlJfcHV0X2Vycm9yKGludCBsaWIsIGludCBmdW5jLGludCByZWFzb24sY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7Cit2b2lkIEVSUl9zZXRfZXJyb3JfZGF0YShjaGFyICpkYXRhLGludCBmbGFncyk7CisKK3Vuc2lnbmVkIGxvbmcgRVJSX2dldF9lcnJvcih2b2lkKTsKK3Vuc2lnbmVkIGxvbmcgRVJSX2dldF9lcnJvcl9saW5lKGNvbnN0IGNoYXIgKipmaWxlLGludCAqbGluZSk7Cit1bnNpZ25lZCBsb25nIEVSUl9nZXRfZXJyb3JfbGluZV9kYXRhKGNvbnN0IGNoYXIgKipmaWxlLGludCAqbGluZSwKKwkJCQkgICAgICBjb25zdCBjaGFyICoqZGF0YSwgaW50ICpmbGFncyk7Cit1bnNpZ25lZCBsb25nIEVSUl9wZWVrX2Vycm9yKHZvaWQpOwordW5zaWduZWQgbG9uZyBFUlJfcGVla19lcnJvcl9saW5lKGNvbnN0IGNoYXIgKipmaWxlLGludCAqbGluZSk7Cit1bnNpZ25lZCBsb25nIEVSUl9wZWVrX2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSxpbnQgKmxpbmUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKipkYXRhLGludCAqZmxhZ3MpOwordW5zaWduZWQgbG9uZyBFUlJfcGVla19sYXN0X2Vycm9yKHZvaWQpOwordW5zaWduZWQgbG9uZyBFUlJfcGVla19sYXN0X2Vycm9yX2xpbmUoY29uc3QgY2hhciAqKmZpbGUsaW50ICpsaW5lKTsKK3Vuc2lnbmVkIGxvbmcgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lX2RhdGEoY29uc3QgY2hhciAqKmZpbGUsaW50ICpsaW5lLAorCQkJCSAgICAgICBjb25zdCBjaGFyICoqZGF0YSxpbnQgKmZsYWdzKTsKK3ZvaWQgRVJSX2NsZWFyX2Vycm9yKHZvaWQgKTsKK2NoYXIgKkVSUl9lcnJvcl9zdHJpbmcodW5zaWduZWQgbG9uZyBlLGNoYXIgKmJ1Zik7Cit2b2lkIEVSUl9lcnJvcl9zdHJpbmdfbih1bnNpZ25lZCBsb25nIGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7Citjb25zdCBjaGFyICpFUlJfbGliX2Vycm9yX3N0cmluZyh1bnNpZ25lZCBsb25nIGUpOworY29uc3QgY2hhciAqRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKHVuc2lnbmVkIGxvbmcgZSk7Citjb25zdCBjaGFyICpFUlJfcmVhc29uX2Vycm9yX3N0cmluZyh1bnNpZ25lZCBsb25nIGUpOwordm9pZCBFUlJfcHJpbnRfZXJyb3JzX2NiKGludCAoKmNiKShjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIHZvaWQgKnUpLAorCQkJIHZvaWQgKnUpOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQordm9pZCBFUlJfcHJpbnRfZXJyb3JzX2ZwKEZJTEUgKmZwKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTwordm9pZCBFUlJfcHJpbnRfZXJyb3JzKEJJTyAqYnApOwordm9pZCBFUlJfYWRkX2Vycm9yX2RhdGEoaW50IG51bSwgLi4uKTsKKyNlbmRpZgordm9pZCBFUlJfbG9hZF9zdHJpbmdzKGludCBsaWIsRVJSX1NUUklOR19EQVRBIHN0cltdKTsKK3ZvaWQgRVJSX3VubG9hZF9zdHJpbmdzKGludCBsaWIsRVJSX1NUUklOR19EQVRBIHN0cltdKTsKK3ZvaWQgRVJSX2xvYWRfRVJSX3N0cmluZ3Modm9pZCk7Cit2b2lkIEVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKHZvaWQpOwordm9pZCBFUlJfZnJlZV9zdHJpbmdzKHZvaWQpOworCit2b2lkIEVSUl9yZW1vdmVfdGhyZWFkX3N0YXRlKGNvbnN0IENSWVBUT19USFJFQURJRCAqdGlkKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECit2b2lkIEVSUl9yZW1vdmVfc3RhdGUodW5zaWduZWQgbG9uZyBwaWQpOyAvKiBpZiB6ZXJvIHdlIGxvb2sgaXQgdXAgKi8KKyNlbmRpZgorRVJSX1NUQVRFICpFUlJfZ2V0X3N0YXRlKHZvaWQpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fTEhBU0gKK0xIQVNIX09GKEVSUl9TVFJJTkdfREFUQSkgKkVSUl9nZXRfc3RyaW5nX3RhYmxlKHZvaWQpOworTEhBU0hfT0YoRVJSX1NUQVRFKSAqRVJSX2dldF9lcnJfc3RhdGVfdGFibGUodm9pZCk7Cit2b2lkIEVSUl9yZWxlYXNlX2Vycl9zdGF0ZV90YWJsZShMSEFTSF9PRihFUlJfU1RBVEUpICoqaGFzaCk7CisjZW5kaWYKKworaW50IEVSUl9nZXRfbmV4dF9lcnJvcl9saWJyYXJ5KHZvaWQpOworCitpbnQgRVJSX3NldF9tYXJrKHZvaWQpOworaW50IEVSUl9wb3BfdG9fbWFyayh2b2lkKTsKKworLyogQWxyZWFkeSBkZWZpbmVkIGluIG9zc2xfdHlwLmggKi8KKy8qIHR5cGVkZWYgc3RydWN0IHN0X0VSUl9GTlMgRVJSX0ZOUzsgKi8KKy8qIEFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiBhbmQgcHJvdmlkZSB0aGUgcmV0dXJuIHZhbHVlIHRvIGxvYWRlZAorICogbW9kdWxlcyB0aGF0IHNob3VsZCB1c2UgdGhlIGFwcGxpY2F0aW9uJ3MgRVJSIHN0YXRlL2Z1bmN0aW9uYWxpdHkgKi8KK2NvbnN0IEVSUl9GTlMgKkVSUl9nZXRfaW1wbGVtZW50YXRpb24odm9pZCk7CisvKiBBIGxvYWRlZCBtb2R1bGUgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBwcmlvciB0byBhbnkgRVJSIG9wZXJhdGlvbnMgdXNpbmcKKyAqIHRoZSBhcHBsaWNhdGlvbidzICJFUlJfRk5TIi4gKi8KK2ludCBFUlJfc2V0X2ltcGxlbWVudGF0aW9uKGNvbnN0IEVSUl9GTlMgKmZucyk7CisKKyNpZmRlZglfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2Vyci9lcnJfYWxsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXJyL2Vycl9hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzA0OWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2Vyci9lcnJfYWxsLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qIGNyeXB0by9lcnIvZXJyX2FsbC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FQworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbXAuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisjaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Rzby5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3VpLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vY3NwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3RzLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fQ01TCisjaW5jbHVkZSA8b3BlbnNzbC9jbXMuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0pQQUtFCisjaW5jbHVkZSA8b3BlbnNzbC9qcGFrZS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9jb21wLmg+CisKK3ZvaWQgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisJRVJSX2xvYWRfRVJSX3N0cmluZ3MoKTsgLyogaW5jbHVkZSBlcnJvciBzdHJpbmdzIGZvciBTWVNlcnIgKi8KKwlFUlJfbG9hZF9CTl9zdHJpbmdzKCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJRVJSX2xvYWRfUlNBX3N0cmluZ3MoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJRVJSX2xvYWRfREhfc3RyaW5ncygpOworI2VuZGlmCisJRVJSX2xvYWRfRVZQX3N0cmluZ3MoKTsKKwlFUlJfbG9hZF9CVUZfc3RyaW5ncygpOworCUVSUl9sb2FkX09CSl9zdHJpbmdzKCk7CisJRVJSX2xvYWRfUEVNX3N0cmluZ3MoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwlFUlJfbG9hZF9EU0Ffc3RyaW5ncygpOworI2VuZGlmCisJRVJSX2xvYWRfWDUwOV9zdHJpbmdzKCk7CisJRVJSX2xvYWRfQVNOMV9zdHJpbmdzKCk7CisJRVJSX2xvYWRfQ09ORl9zdHJpbmdzKCk7CisJRVJSX2xvYWRfQ1JZUFRPX3N0cmluZ3MoKTsKKwlFUlJfbG9hZF9DT01QX3N0cmluZ3MoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCUVSUl9sb2FkX0VDX3N0cmluZ3MoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDRFNBCisJRVJSX2xvYWRfRUNEU0Ffc3RyaW5ncygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCUVSUl9sb2FkX0VDREhfc3RyaW5ncygpOworI2VuZGlmCisJLyogc2tpcCBFUlJfbG9hZF9TU0xfc3RyaW5ncygpIGJlY2F1c2UgaXQgaXMgbm90IGluIHRoaXMgbGlicmFyeSAqLworCUVSUl9sb2FkX0JJT19zdHJpbmdzKCk7CisJRVJSX2xvYWRfUEtDUzdfc3RyaW5ncygpOwkKKwlFUlJfbG9hZF9YNTA5VjNfc3RyaW5ncygpOworCUVSUl9sb2FkX1BLQ1MxMl9zdHJpbmdzKCk7CisJRVJSX2xvYWRfUkFORF9zdHJpbmdzKCk7CisJRVJSX2xvYWRfRFNPX3N0cmluZ3MoKTsKKwlFUlJfbG9hZF9UU19zdHJpbmdzKCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJRVJSX2xvYWRfRU5HSU5FX3N0cmluZ3MoKTsKKyNlbmRpZgorCUVSUl9sb2FkX09DU1Bfc3RyaW5ncygpOworCUVSUl9sb2FkX1VJX3N0cmluZ3MoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKwlFUlJfbG9hZF9DTVNfc3RyaW5ncygpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSlBBS0UKKwlFUlJfbG9hZF9KUEFLRV9zdHJpbmdzKCk7CisjZW5kaWYKKwlFUlJfbG9hZF9DT01QX3N0cmluZ3MoKTsKKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9lcnIvZXJyX3Bybi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2Vyci9lcnJfcHJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxNjhhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lcnIvZXJyX3Bybi5jCkBAIC0wLDAgKzEsMTE0IEBACisvKiBjcnlwdG8vZXJyL2Vycl9wcm4uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKwordm9pZCBFUlJfcHJpbnRfZXJyb3JzX2NiKGludCAoKmNiKShjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIHZvaWQgKnUpLAorCQkJIHZvaWQgKnUpCisJeworCXVuc2lnbmVkIGxvbmcgbDsKKwljaGFyIGJ1ZlsyNTZdOworCWNoYXIgYnVmMls0MDk2XTsKKwljb25zdCBjaGFyICpmaWxlLCpkYXRhOworCWludCBsaW5lLGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZXM7CisJQ1JZUFRPX1RIUkVBRElEIGN1cjsKKworCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZjdXIpOworCWVzPUNSWVBUT19USFJFQURJRF9oYXNoKCZjdXIpOworCXdoaWxlICgobD1FUlJfZ2V0X2Vycm9yX2xpbmVfZGF0YSgmZmlsZSwmbGluZSwmZGF0YSwmZmxhZ3MpKSAhPSAwKQorCQl7CisJCUVSUl9lcnJvcl9zdHJpbmdfbihsLCBidWYsIHNpemVvZiBidWYpOworCQlCSU9fc25wcmludGYoYnVmMiwgc2l6ZW9mKGJ1ZjIpLCAiJWx1OiVzOiVzOiVkOiVzXG4iLCBlcywgYnVmLAorCQkJZmlsZSwgbGluZSwgKGZsYWdzICYgRVJSX1RYVF9TVFJJTkcpID8gZGF0YSA6ICIiKTsKKwkJaWYgKGNiKGJ1ZjIsIHN0cmxlbihidWYyKSwgdSkgPD0gMCkKKwkJCWJyZWFrOyAvKiBhYm9ydCBvdXRwdXR0aW5nIHRoZSBlcnJvciByZXBvcnQgKi8KKwkJfQorCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorc3RhdGljIGludCBwcmludF9mcChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIHZvaWQgKmZwKQorCXsKKwlCSU8gYmlvOworCisJQklPX3NldCgmYmlvLEJJT19zX2ZpbGUoKSk7CisJQklPX3NldF9mcCgmYmlvLGZwLEJJT19OT0NMT1NFKTsKKworCXJldHVybiBCSU9fcHJpbnRmKCZiaW8sICIlcyIsIHN0cik7CisJfQordm9pZCBFUlJfcHJpbnRfZXJyb3JzX2ZwKEZJTEUgKmZwKQorCXsKKwlFUlJfcHJpbnRfZXJyb3JzX2NiKHByaW50X2ZwLCBmcCk7CisJfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcHJpbnRfYmlvKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgdm9pZCAqYnApCisJeworCXJldHVybiBCSU9fd3JpdGUoKEJJTyAqKWJwLCBzdHIsIGxlbik7CisJfQordm9pZCBFUlJfcHJpbnRfZXJyb3JzKEJJTyAqYnApCisJeworCUVSUl9wcmludF9lcnJvcnNfY2IocHJpbnRfYmlvLCBicCk7CisJfQorCisJCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXJyL29wZW5zc2wuZWMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXJyL29wZW5zc2wuZWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA1NTRiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9lcnIvb3BlbnNzbC5lYwpAQCAtMCwwICsxLDk2IEBACisjIGNyeXB0by9lcnIvb3BlbnNzbC5lYworCisjIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdXRpbC9ta2Vyci5wbAorCisjIGZpbGVzIHRoYXQgbWF5IGhhdmUgdG8gYmUgcmV3cml0dGVuIGJ5IHV0aWwvbWtlcnIucGwKK0wgRVJSCQlOT05FCQkJCU5PTkUKK0wgQk4JCWNyeXB0by9ibi9ibi5oCQkJY3J5cHRvL2JuL2JuX2Vyci5jCitMIFJTQQkJY3J5cHRvL3JzYS9yc2EuaAkJY3J5cHRvL3JzYS9yc2FfZXJyLmMKK0wgREgJCWNyeXB0by9kaC9kaC5oCQkJY3J5cHRvL2RoL2RoX2Vyci5jCitMIEVWUAkJY3J5cHRvL2V2cC9ldnAuaAkJY3J5cHRvL2V2cC9ldnBfZXJyLmMKK0wgQlVGCQljcnlwdG8vYnVmZmVyL2J1ZmZlci5oCQljcnlwdG8vYnVmZmVyL2J1Zl9lcnIuYworTCBPQkoJCWNyeXB0by9vYmplY3RzL29iamVjdHMuaAljcnlwdG8vb2JqZWN0cy9vYmpfZXJyLmMKK0wgUEVNCQljcnlwdG8vcGVtL3BlbS5oCQljcnlwdG8vcGVtL3BlbV9lcnIuYworTCBEU0EJCWNyeXB0by9kc2EvZHNhLmgJCWNyeXB0by9kc2EvZHNhX2Vyci5jCitMIFg1MDkJCWNyeXB0by94NTA5L3g1MDkuaAkJY3J5cHRvL3g1MDkveDUwOV9lcnIuYworTCBBU04xCQljcnlwdG8vYXNuMS9hc24xLmgJCWNyeXB0by9hc24xL2FzbjFfZXJyLmMKK0wgQ09ORgkJY3J5cHRvL2NvbmYvY29uZi5oCQljcnlwdG8vY29uZi9jb25mX2Vyci5jCitMIENSWVBUTwljcnlwdG8vY3J5cHRvLmgJCQljcnlwdG8vY3B0X2Vyci5jCitMIEVDCQljcnlwdG8vZWMvZWMuaAkJCWNyeXB0by9lYy9lY19lcnIuYworTCBTU0wJCXNzbC9zc2wuaAkJCXNzbC9zc2xfZXJyLmMKK0wgQklPCQljcnlwdG8vYmlvL2Jpby5oCQljcnlwdG8vYmlvL2Jpb19lcnIuYworTCBQS0NTNwkJY3J5cHRvL3BrY3M3L3BrY3M3LmgJCWNyeXB0by9wa2NzNy9wa2NzN2Vyci5jCitMIFg1MDlWMwljcnlwdG8veDUwOXYzL3g1MDl2My5oCQljcnlwdG8veDUwOXYzL3YzZXJyLmMKK0wgUEtDUzEyCWNyeXB0by9wa2NzMTIvcGtjczEyLmgJCWNyeXB0by9wa2NzMTIvcGsxMmVyci5jCitMIFJBTkQJCWNyeXB0by9yYW5kL3JhbmQuaAkJY3J5cHRvL3JhbmQvcmFuZF9lcnIuYworTCBEU08JCWNyeXB0by9kc28vZHNvLmgJCWNyeXB0by9kc28vZHNvX2Vyci5jCitMIEVOR0lORQljcnlwdG8vZW5naW5lL2VuZ2luZS5oCQljcnlwdG8vZW5naW5lL2VuZ19lcnIuYworTCBPQ1NQCQljcnlwdG8vb2NzcC9vY3NwLmgJCWNyeXB0by9vY3NwL29jc3BfZXJyLmMKK0wgVUkJCWNyeXB0by91aS91aS5oCQkJY3J5cHRvL3VpL3VpX2Vyci5jCitMIENPTVAJCWNyeXB0by9jb21wL2NvbXAuaAkJY3J5cHRvL2NvbXAvY29tcF9lcnIuYworTCBFQ0RTQQkJY3J5cHRvL2VjZHNhL2VjZHNhLmgJCWNyeXB0by9lY2RzYS9lY3NfZXJyLmMKK0wgRUNESAkJY3J5cHRvL2VjZGgvZWNkaC5oCQljcnlwdG8vZWNkaC9lY2hfZXJyLmMKK0wgU1RPUkUJCWNyeXB0by9zdG9yZS9zdG9yZS5oCQljcnlwdG8vc3RvcmUvc3RyX2Vyci5jCitMIFRTCQljcnlwdG8vdHMvdHMuaAkJCWNyeXB0by90cy90c19lcnIuYworTCBITUFDCQljcnlwdG8vaG1hYy9obWFjLmgJCWNyeXB0by9obWFjL2htYWNfZXJyLmMKK0wgQ01TCQljcnlwdG8vY21zL2Ntcy5oCQljcnlwdG8vY21zL2Ntc19lcnIuYworTCBKUEFLRQkJY3J5cHRvL2pwYWtlL2pwYWtlLmgJCWNyeXB0by9qcGFrZS9qcGFrZV9lcnIuYworCisjIGFkZGl0aW9uYWwgaGVhZGVyIGZpbGVzIHRvIGJlIHNjYW5uZWQgZm9yIGZ1bmN0aW9uIG5hbWVzCitMIE5PTkUJCWNyeXB0by94NTA5L3g1MDlfdmZ5LmgJCU5PTkUKK0wgTk9ORQkJY3J5cHRvL2VjL2VjX2xjbC5oCQlOT05FCitMIE5PTkUJCWNyeXB0by9hc24xL2Fzbl9sY2wuaAkJTk9ORQorTCBOT05FCQljcnlwdG8vY21zL2Ntc19sY2wuaAkJTk9ORQorCisKK0YgUlNBUkVGX0ZfUlNBX0JOMkJJTgorRiBSU0FSRUZfRl9SU0FfUFJJVkFURV9ERUNSWVBUCitGIFJTQVJFRl9GX1JTQV9QUklWQVRFX0VOQ1JZUFQKK0YgUlNBUkVGX0ZfUlNBX1BVQkxJQ19ERUNSWVBUCitGIFJTQVJFRl9GX1JTQV9QVUJMSUNfRU5DUllQVAorI0YgU1NMX0ZfQ0xJRU5UX0NFUlRJRklDQVRFCisKK1IgU1NMX1JfU1NMVjNfQUxFUlRfVU5FWFBFQ1RFRF9NRVNTQUdFCQkxMDEwCitSIFNTTF9SX1NTTFYzX0FMRVJUX0JBRF9SRUNPUkRfTUFDCQkxMDIwCitSIFNTTF9SX1RMU1YxX0FMRVJUX0RFQ1JZUFRJT05fRkFJTEVECQkxMDIxCitSIFNTTF9SX1RMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVwkJMTAyMgorUiBTU0xfUl9TU0xWM19BTEVSVF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkUJMTAzMAorUiBTU0xfUl9TU0xWM19BTEVSVF9IQU5EU0hBS0VfRkFJTFVSRQkJMTA0MAorUiBTU0xfUl9TU0xWM19BTEVSVF9OT19DRVJUSUZJQ0FURQkJMTA0MQorUiBTU0xfUl9TU0xWM19BTEVSVF9CQURfQ0VSVElGSUNBVEUJCTEwNDIKK1IgU1NMX1JfU1NMVjNfQUxFUlRfVU5TVVBQT1JURURfQ0VSVElGSUNBVEUJMTA0MworUiBTU0xfUl9TU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9SRVZPS0VECQkxMDQ0CitSIFNTTF9SX1NTTFYzX0FMRVJUX0NFUlRJRklDQVRFX0VYUElSRUQJCTEwNDUKK1IgU1NMX1JfU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfVU5LTk9XTgkJMTA0NgorUiBTU0xfUl9TU0xWM19BTEVSVF9JTExFR0FMX1BBUkFNRVRFUgkJMTA0NworUiBTU0xfUl9UTFNWMV9BTEVSVF9VTktOT1dOX0NBCQkJMTA0OAorUiBTU0xfUl9UTFNWMV9BTEVSVF9BQ0NFU1NfREVOSUVECQkxMDQ5CitSIFNTTF9SX1RMU1YxX0FMRVJUX0RFQ09ERV9FUlJPUgkJMTA1MAorUiBTU0xfUl9UTFNWMV9BTEVSVF9ERUNSWVBUX0VSUk9SCQkxMDUxCitSIFNTTF9SX1RMU1YxX0FMRVJUX0VYUE9SVF9SRVNUUklDVElPTgkJMTA2MAorUiBTU0xfUl9UTFNWMV9BTEVSVF9QUk9UT0NPTF9WRVJTSU9OCQkxMDcwCitSIFNTTF9SX1RMU1YxX0FMRVJUX0lOU1VGRklDSUVOVF9TRUNVUklUWQkxMDcxCitSIFNTTF9SX1RMU1YxX0FMRVJUX0lOVEVSTkFMX0VSUk9SCQkxMDgwCitSIFNTTF9SX1RMU1YxX0FMRVJUX1VTRVJfQ0FOQ0VMTEVECQkxMDkwCitSIFNTTF9SX1RMU1YxX0FMRVJUX05PX1JFTkVHT1RJQVRJT04JCTExMDAKK1IgU1NMX1JfVExTVjFfVU5TVVBQT1JURURfRVhURU5TSU9OCQkxMTEwCitSIFNTTF9SX1RMU1YxX0NFUlRJRklDQVRFX1VOT0JUQUlOQUJMRQkJMTExMQorUiBTU0xfUl9UTFNWMV9VTlJFQ09HTklaRURfTkFNRQkJCTExMTIKK1IgU1NMX1JfVExTVjFfQkFEX0NFUlRJRklDQVRFX1NUQVRVU19SRVNQT05TRQkxMTEzCitSIFNTTF9SX1RMU1YxX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFCTExMTQKKworUiBSU0FSRUZfUl9DT05URU5UX0VOQ09ESU5HCQkJMHgwNDAwCitSIFJTQVJFRl9SX0RBVEEJCQkJCTB4MDQwMQorUiBSU0FSRUZfUl9ESUdFU1RfQUxHT1JJVEhNCQkJMHgwNDAyCitSIFJTQVJFRl9SX0VOQ09ESU5HCQkJCTB4MDQwMworUiBSU0FSRUZfUl9LRVkJCQkJCTB4MDQwNAorUiBSU0FSRUZfUl9LRVlfRU5DT0RJTkcJCQkJMHgwNDA1CitSIFJTQVJFRl9SX0xFTgkJCQkJMHgwNDA2CitSIFJTQVJFRl9SX01PRFVMVVNfTEVOCQkJCTB4MDQwNworUiBSU0FSRUZfUl9ORUVEX1JBTkRPTQkJCQkweDA0MDgKK1IgUlNBUkVGX1JfUFJJVkFURV9LRVkJCQkJMHgwNDA5CitSIFJTQVJFRl9SX1BVQkxJQ19LRVkJCQkJMHgwNDBhCitSIFJTQVJFRl9SX1NJR05BVFVSRQkJCQkweDA0MGIKK1IgUlNBUkVGX1JfU0lHTkFUVVJFX0VOQ09ESU5HCQkJMHgwNDBjCitSIFJTQVJFRl9SX0VOQ1JZUFRJT05fQUxHT1JJVEhNCQkJMHgwNDBkCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvYmlvX2I2NC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9iaW9fYjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhMmE2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvYmlvX2I2NC5jCkBAIC0wLDAgKzEsNTk4IEBACisvKiBjcnlwdG8vZXZwL2Jpb19iNjQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCitzdGF0aWMgaW50IGI2NF93cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IGI2NF9yZWFkKEJJTyAqaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IGI2NF9wdXRzKEJJTyAqaCwgY29uc3QgY2hhciAqc3RyKTsKKy8qc3RhdGljIGludCBiNjRfZ2V0cyhCSU8gKmgsIGNoYXIgKnN0ciwgaW50IHNpemUpOyAqLworc3RhdGljIGxvbmcgYjY0X2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBiNjRfbmV3KEJJTyAqaCk7CitzdGF0aWMgaW50IGI2NF9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgbG9uZyBiNjRfY2FsbGJhY2tfY3RybChCSU8gKmgsaW50IGNtZCxiaW9faW5mb19jYiAqZnApOworI2RlZmluZSBCNjRfQkxPQ0tfU0laRQkxMDI0CisjZGVmaW5lIEI2NF9CTE9DS19TSVpFMgk3NjgKKyNkZWZpbmUgQjY0X05PTkUJMAorI2RlZmluZSBCNjRfRU5DT0RFCTEKKyNkZWZpbmUgQjY0X0RFQ09ERQkyCisKK3R5cGVkZWYgc3RydWN0IGI2NF9zdHJ1Y3QKKwl7CisJLypCSU8gKmJpbzsgbW92ZWQgdG8gdGhlIEJJTyBzdHJ1Y3R1cmUgKi8KKwlpbnQgYnVmX2xlbjsKKwlpbnQgYnVmX29mZjsKKwlpbnQgdG1wX2xlbjsJCS8qIHVzZWQgdG8gZmluZCB0aGUgc3RhcnQgd2hlbiBkZWNvZGluZyAqLworCWludCB0bXBfbmw7CQkvKiBJZiB0cnVlLCBzY2FuIHVudGlsICdcbicgKi8KKwlpbnQgZW5jb2RlOworCWludCBzdGFydDsJCS8qIGhhdmUgd2Ugc3RhcnRlZCBkZWNvZGluZyB5ZXQ/ICovCisJaW50IGNvbnQ7CQkvKiA8PSAwIHdoZW4gZmluaXNoZWQgKi8KKwlFVlBfRU5DT0RFX0NUWCBiYXNlNjQ7CisJY2hhciBidWZbRVZQX0VOQ09ERV9MRU5HVEgoQjY0X0JMT0NLX1NJWkUpKzEwXTsKKwljaGFyIHRtcFtCNjRfQkxPQ0tfU0laRV07CisJfSBCSU9fQjY0X0NUWDsKKworc3RhdGljIEJJT19NRVRIT0QgbWV0aG9kc19iNjQ9CisJeworCUJJT19UWVBFX0JBU0U2NCwiYmFzZTY0IGVuY29kaW5nIiwKKwliNjRfd3JpdGUsCisJYjY0X3JlYWQsCisJYjY0X3B1dHMsCisJTlVMTCwgLyogYjY0X2dldHMsICovCisJYjY0X2N0cmwsCisJYjY0X25ldywKKwliNjRfZnJlZSwKKwliNjRfY2FsbGJhY2tfY3RybCwKKwl9OworCitCSU9fTUVUSE9EICpCSU9fZl9iYXNlNjQodm9pZCkKKwl7CisJcmV0dXJuKCZtZXRob2RzX2I2NCk7CisJfQorCitzdGF0aWMgaW50IGI2NF9uZXcoQklPICpiaSkKKwl7CisJQklPX0I2NF9DVFggKmN0eDsKKworCWN0eD0oQklPX0I2NF9DVFggKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQklPX0I2NF9DVFgpKTsKKwlpZiAoY3R4ID09IE5VTEwpIHJldHVybigwKTsKKworCWN0eC0+YnVmX2xlbj0wOworCWN0eC0+dG1wX2xlbj0wOworCWN0eC0+dG1wX25sPTA7CisJY3R4LT5idWZfb2ZmPTA7CisJY3R4LT5jb250PTE7CisJY3R4LT5zdGFydD0xOworCWN0eC0+ZW5jb2RlPTA7CisKKwliaS0+aW5pdD0xOworCWJpLT5wdHI9KGNoYXIgKiljdHg7CisJYmktPmZsYWdzPTA7CisJYmktPm51bSA9IDA7CisJcmV0dXJuKDEpOworCX0KKworc3RhdGljIGludCBiNjRfZnJlZShCSU8gKmEpCisJeworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKwlPUEVOU1NMX2ZyZWUoYS0+cHRyKTsKKwlhLT5wdHI9TlVMTDsKKwlhLT5pbml0PTA7CisJYS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCQorc3RhdGljIGludCBiNjRfcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpCisJeworCWludCByZXQ9MCxpLGlpLGosayx4LG4sbnVtLHJldF9jb2RlPTA7CisJQklPX0I2NF9DVFggKmN0eDsKKwl1bnNpZ25lZCBjaGFyICpwLCpxOworCisJaWYgKG91dCA9PSBOVUxMKSByZXR1cm4oMCk7CisJY3R4PShCSU9fQjY0X0NUWCAqKWItPnB0cjsKKworCWlmICgoY3R4ID09IE5VTEwpIHx8IChiLT5uZXh0X2JpbyA9PSBOVUxMKSkgcmV0dXJuKDApOworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCisJaWYgKGN0eC0+ZW5jb2RlICE9IEI2NF9ERUNPREUpCisJCXsKKwkJY3R4LT5lbmNvZGU9QjY0X0RFQ09ERTsKKwkJY3R4LT5idWZfbGVuPTA7CisJCWN0eC0+YnVmX29mZj0wOworCQljdHgtPnRtcF9sZW49MDsKKwkJRVZQX0RlY29kZUluaXQoJihjdHgtPmJhc2U2NCkpOworCQl9CisKKwkvKiBGaXJzdCBjaGVjayBpZiB0aGVyZSBhcmUgYnl0ZXMgZGVjb2RlZC9lbmNvZGVkICovCisJaWYgKGN0eC0+YnVmX2xlbiA+IDApCisJCXsKKwkJT1BFTlNTTF9hc3NlcnQoY3R4LT5idWZfbGVuID49IGN0eC0+YnVmX29mZik7CisJCWk9Y3R4LT5idWZfbGVuLWN0eC0+YnVmX29mZjsKKwkJaWYgKGkgPiBvdXRsKSBpPW91dGw7CisJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+YnVmX29mZitpIDwgKGludClzaXplb2YoY3R4LT5idWYpKTsKKwkJbWVtY3B5KG91dCwmKGN0eC0+YnVmW2N0eC0+YnVmX29mZl0pLGkpOworCQlyZXQ9aTsKKwkJb3V0Kz1pOworCQlvdXRsLT1pOworCQljdHgtPmJ1Zl9vZmYrPWk7CisJCWlmIChjdHgtPmJ1Zl9sZW4gPT0gY3R4LT5idWZfb2ZmKQorCQkJeworCQkJY3R4LT5idWZfbGVuPTA7CisJCQljdHgtPmJ1Zl9vZmY9MDsKKwkJCX0KKwkJfQorCisJLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSByb29tIG9mIG91dGwgYnl0ZXMgYW5kIGFuIGVtcHR5CisJICogYnVmZmVyLCBzbyB3ZSBzaG91bGQgcmVhZCBpbiBzb21lIG1vcmUuICovCisKKwlyZXRfY29kZT0wOworCXdoaWxlIChvdXRsID4gMCkKKwkJeworCQlpZiAoY3R4LT5jb250IDw9IDApCisJCQlicmVhazsKKworCQlpPUJJT19yZWFkKGItPm5leHRfYmlvLCYoY3R4LT50bXBbY3R4LT50bXBfbGVuXSksCisJCQlCNjRfQkxPQ0tfU0laRS1jdHgtPnRtcF9sZW4pOworCisJCWlmIChpIDw9IDApCisJCQl7CisJCQlyZXRfY29kZT1pOworCisJCQkvKiBTaG91bGQgd2UgY29udGludWUgbmV4dCB0aW1lIHdlIGFyZSBjYWxsZWQ/ICovCisJCQlpZiAoIUJJT19zaG91bGRfcmV0cnkoYi0+bmV4dF9iaW8pKQorCQkJCXsKKwkJCQljdHgtPmNvbnQ9aTsKKwkJCQkvKiBJZiBidWZmZXIgZW1wdHkgYnJlYWsgKi8KKwkJCQlpZihjdHgtPnRtcF9sZW4gPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJLyogRmFsbCB0aHJvdWdoIGFuZCBwcm9jZXNzIHdoYXQgd2UgaGF2ZSAqLworCQkJCWVsc2UKKwkJCQkJaSA9IDA7CisJCQkJfQorCQkJLyogZWxzZSB3ZSByZXRyeSBhbmQgYWRkIG1vcmUgZGF0YSB0byBidWZmZXIgKi8KKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJCX0KKwkJaSs9Y3R4LT50bXBfbGVuOworCQljdHgtPnRtcF9sZW4gPSBpOworCisJCS8qIFdlIG5lZWQgdG8gc2NhbiwgYSBsaW5lIGF0IGEgdGltZSB1bnRpbCB3ZQorCQkgKiBoYXZlIGEgdmFsaWQgbGluZSBpZiB3ZSBhcmUgc3RhcnRpbmcuICovCisJCWlmIChjdHgtPnN0YXJ0ICYmIChCSU9fZ2V0X2ZsYWdzKGIpICYgQklPX0ZMQUdTX0JBU0U2NF9OT19OTCkpCisJCQl7CisJCQkvKiBjdHgtPnN0YXJ0PTE7ICovCisJCQljdHgtPnRtcF9sZW49MDsKKwkJCX0KKwkJZWxzZSBpZiAoY3R4LT5zdGFydCkKKwkJCXsKKwkJCXE9cD0odW5zaWduZWQgY2hhciAqKWN0eC0+dG1wOworCQkJZm9yIChqPTA7IGo8aTsgaisrKQorCQkJCXsKKwkJCQlpZiAoKihxKyspICE9ICdcbicpIGNvbnRpbnVlOworCisJCQkJLyogZHVlIHRvIGEgcHJldmlvdXMgdmVyeSBsb25nIGxpbmUsCisJCQkJICogd2UgbmVlZCB0byBrZWVwIG9uIHNjYW5uaW5nIGZvciBhICdcbicKKwkJCQkgKiBiZWZvcmUgd2UgZXZlbiBzdGFydCBsb29raW5nIGZvcgorCQkJCSAqIGJhc2U2NCBlbmNvZGVkIHN0dWZmLiAqLworCQkJCWlmIChjdHgtPnRtcF9ubCkKKwkJCQkJeworCQkJCQlwPXE7CisJCQkJCWN0eC0+dG1wX25sPTA7CisJCQkJCWNvbnRpbnVlOworCQkJCQl9CisKKwkJCQlrPUVWUF9EZWNvZGVVcGRhdGUoJihjdHgtPmJhc2U2NCksCisJCQkJCSh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsCisJCQkJCSZudW0scCxxLXApOworCQkJCWlmICgoayA8PSAwKSAmJiAobnVtID09IDApICYmIChjdHgtPnN0YXJ0KSkKKwkJCQkJRVZQX0RlY29kZUluaXQoJmN0eC0+YmFzZTY0KTsKKwkJCQllbHNlIAorCQkJCQl7CisJCQkJCWlmIChwICE9ICh1bnNpZ25lZCBjaGFyICopCisJCQkJCQkmKGN0eC0+dG1wWzBdKSkKKwkJCQkJCXsKKwkJCQkJCWktPShwLSAodW5zaWduZWQgY2hhciAqKQorCQkJCQkJCSYoY3R4LT50bXBbMF0pKTsKKwkJCQkJCWZvciAoeD0wOyB4IDwgaTsgeCsrKQorCQkJCQkJCWN0eC0+dG1wW3hdPXBbeF07CisJCQkJCQl9CisJCQkJCUVWUF9EZWNvZGVJbml0KCZjdHgtPmJhc2U2NCk7CisJCQkJCWN0eC0+c3RhcnQ9MDsKKwkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQlwPXE7CisJCQkJfQorCisJCQkvKiB3ZSBmZWxsIG9mZiB0aGUgZW5kIHdpdGhvdXQgc3RhcnRpbmcgKi8KKwkJCWlmIChqID09IGkpCisJCQkJeworCQkJCS8qIElzIHRoaXMgaXMgb25lIGxvbmcgY2h1bms/LCBpZiBzbywga2VlcCBvbgorCQkJCSAqIHJlYWRpbmcgdW50aWwgYSBuZXcgbGluZS4gKi8KKwkJCQlpZiAocCA9PSAodW5zaWduZWQgY2hhciAqKSYoY3R4LT50bXBbMF0pKQorCQkJCQl7CisJCQkJCS8qIENoZWNrIGJ1ZmZlciBmdWxsICovCisJCQkJCWlmIChpID09IEI2NF9CTE9DS19TSVpFKQorCQkJCQkJeworCQkJCQkJY3R4LT50bXBfbmw9MTsKKwkJCQkJCWN0eC0+dG1wX2xlbj0wOworCQkJCQkJfQorCQkJCQl9CisJCQkJZWxzZSBpZiAocCAhPSBxKSAvKiBmaW5pc2hlZCBvbiBhICdcbicgKi8KKwkJCQkJeworCQkJCQluPXEtcDsKKwkJCQkJZm9yIChpaT0wOyBpaTxuOyBpaSsrKQorCQkJCQkJY3R4LT50bXBbaWldPXBbaWldOworCQkJCQljdHgtPnRtcF9sZW49bjsKKwkJCQkJfQorCQkJCS8qIGVsc2UgZmluaXNoZWQgb24gYSAnXG4nICovCisJCQkJY29udGludWU7CisJCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWN0eC0+dG1wX2xlbj0wOworCQkJfQorCQl9CisJCWVsc2UgaWYgKChpIDwgQjY0X0JMT0NLX1NJWkUpICYmIChjdHgtPmNvbnQgPiAwKSkKKwkJeworCQkJLyogSWYgYnVmZmVyIGlzbid0IGZ1bGwgYW5kIHdlIGNhbiByZXRyeSB0aGVuCisJCQkgKiByZXN0YXJ0IHRvIHJlYWQgaW4gbW9yZSBkYXRhLgorCQkJICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChCSU9fZ2V0X2ZsYWdzKGIpICYgQklPX0ZMQUdTX0JBU0U2NF9OT19OTCkKKwkJCXsKKwkJCWludCB6LGpqOworCisjaWYgMAorCQkJamo9KGk+PjIpPDwyOworI2Vsc2UKKwkJCWpqID0gaSAmIH4zOyAvKiBwcm9jZXNzIHBlciA0ICovCisjZW5kaWYKKwkJCXo9RVZQX0RlY29kZUJsb2NrKCh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsCisJCQkJKHVuc2lnbmVkIGNoYXIgKiljdHgtPnRtcCxqaik7CisJCQlpZiAoamogPiAyKQorCQkJCXsKKwkJCQlpZiAoY3R4LT50bXBbamotMV0gPT0gJz0nKQorCQkJCQl7CisJCQkJCXotLTsKKwkJCQkJaWYgKGN0eC0+dG1wW2pqLTJdID09ICc9JykKKwkJCQkJCXotLTsKKwkJCQkJfQorCQkJCX0KKwkJCS8qIHogaXMgbm93IG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgYW5kIGpqIGlzIHRoZQorCQkJICogbnVtYmVyIGNvbnN1bWVkICovCisJCQlpZiAoamogIT0gaSkKKwkJCQl7CisJCQkJbWVtbW92ZShjdHgtPnRtcCwgJmN0eC0+dG1wW2pqXSwgaS1qaik7CisJCQkJY3R4LT50bXBfbGVuPWktamo7CisJCQkJfQorCQkJY3R4LT5idWZfbGVuPTA7CisJCQlpZiAoeiA+IDApCisJCQkJeworCQkJCWN0eC0+YnVmX2xlbj16OworCQkJCX0KKwkJCWk9ejsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaT1FVlBfRGVjb2RlVXBkYXRlKCYoY3R4LT5iYXNlNjQpLAorCQkJCSh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsJmN0eC0+YnVmX2xlbiwKKwkJCQkodW5zaWduZWQgY2hhciAqKWN0eC0+dG1wLGkpOworCQkJY3R4LT50bXBfbGVuID0gMDsKKwkJCX0KKwkJY3R4LT5idWZfb2ZmPTA7CisJCWlmIChpIDwgMCkKKwkJCXsKKwkJCXJldF9jb2RlPTA7CisJCQljdHgtPmJ1Zl9sZW49MDsKKwkJCWJyZWFrOworCQkJfQorCisJCWlmIChjdHgtPmJ1Zl9sZW4gPD0gb3V0bCkKKwkJCWk9Y3R4LT5idWZfbGVuOworCQllbHNlCisJCQlpPW91dGw7CisKKwkJbWVtY3B5KG91dCxjdHgtPmJ1ZixpKTsKKwkJcmV0Kz1pOworCQljdHgtPmJ1Zl9vZmY9aTsKKwkJaWYgKGN0eC0+YnVmX29mZiA9PSBjdHgtPmJ1Zl9sZW4pCisJCQl7CisJCQljdHgtPmJ1Zl9sZW49MDsKKwkJCWN0eC0+YnVmX29mZj0wOworCQkJfQorCQlvdXRsLT1pOworCQlvdXQrPWk7CisJCX0KKwkvKiBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7ICovCisJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwlyZXR1cm4oKHJldCA9PSAwKT9yZXRfY29kZTpyZXQpOworCX0KKworc3RhdGljIGludCBiNjRfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkKKwl7CisJaW50IHJldD0wOworCWludCBuOworCWludCBpOworCUJJT19CNjRfQ1RYICpjdHg7CisKKwljdHg9KEJJT19CNjRfQ1RYICopYi0+cHRyOworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKworCWlmIChjdHgtPmVuY29kZSAhPSBCNjRfRU5DT0RFKQorCQl7CisJCWN0eC0+ZW5jb2RlPUI2NF9FTkNPREU7CisJCWN0eC0+YnVmX2xlbj0wOworCQljdHgtPmJ1Zl9vZmY9MDsKKwkJY3R4LT50bXBfbGVuPTA7CisJCUVWUF9FbmNvZGVJbml0KCYoY3R4LT5iYXNlNjQpKTsKKwkJfQorCisJT1BFTlNTTF9hc3NlcnQoY3R4LT5idWZfb2ZmIDwgKGludClzaXplb2YoY3R4LT5idWYpKTsKKwlPUEVOU1NMX2Fzc2VydChjdHgtPmJ1Zl9sZW4gPD0gKGludClzaXplb2YoY3R4LT5idWYpKTsKKwlPUEVOU1NMX2Fzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKKwluPWN0eC0+YnVmX2xlbi1jdHgtPmJ1Zl9vZmY7CisJd2hpbGUgKG4gPiAwKQorCQl7CisJCWk9QklPX3dyaXRlKGItPm5leHRfYmlvLCYoY3R4LT5idWZbY3R4LT5idWZfb2ZmXSksbik7CisJCWlmIChpIDw9IDApCisJCQl7CisJCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCQkJcmV0dXJuKGkpOworCQkJfQorCQlPUEVOU1NMX2Fzc2VydChpIDw9IG4pOworCQljdHgtPmJ1Zl9vZmYrPWk7CisJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+YnVmX29mZiA8PSAoaW50KXNpemVvZihjdHgtPmJ1ZikpOworCQlPUEVOU1NMX2Fzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKKwkJbi09aTsKKwkJfQorCS8qIGF0IHRoaXMgcG9pbnQgYWxsIHBlbmRpbmcgZGF0YSBoYXMgYmVlbiB3cml0dGVuICovCisJY3R4LT5idWZfb2ZmPTA7CisJY3R4LT5idWZfbGVuPTA7CisKKwlpZiAoKGluID09IE5VTEwpIHx8IChpbmwgPD0gMCkpIHJldHVybigwKTsKKworCXdoaWxlIChpbmwgPiAwKQorCQl7CisJCW49KGlubCA+IEI2NF9CTE9DS19TSVpFKT9CNjRfQkxPQ0tfU0laRTppbmw7CisKKwkJaWYgKEJJT19nZXRfZmxhZ3MoYikgJiBCSU9fRkxBR1NfQkFTRTY0X05PX05MKQorCQkJeworCQkJaWYgKGN0eC0+dG1wX2xlbiA+IDApCisJCQkJeworCQkJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+dG1wX2xlbiA8PSAzKTsKKwkJCQluPTMtY3R4LT50bXBfbGVuOworCQkJCS8qIFRoZXJlJ3MgYSB0aGVvcmV0aWNhbCBwb3NzaWJpbGl0eSBmb3IgdGhpcyAqLworCQkJCWlmIChuID4gaW5sKSAKKwkJCQkJbj1pbmw7CisJCQkJbWVtY3B5KCYoY3R4LT50bXBbY3R4LT50bXBfbGVuXSksaW4sbik7CisJCQkJY3R4LT50bXBfbGVuKz1uOworCQkJCXJldCArPSBuOworCQkJCWlmIChjdHgtPnRtcF9sZW4gPCAzKQorCQkJCQlicmVhazsKKwkJCQljdHgtPmJ1Zl9sZW49RVZQX0VuY29kZUJsb2NrKCh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsKHVuc2lnbmVkIGNoYXIgKiljdHgtPnRtcCxjdHgtPnRtcF9sZW4pOworCQkJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+YnVmX2xlbiA8PSAoaW50KXNpemVvZihjdHgtPmJ1ZikpOworCQkJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+YnVmX2xlbiA+PSBjdHgtPmJ1Zl9vZmYpOworCQkJCS8qIFNpbmNlIHdlJ3JlIG5vdyBkb25lIHVzaW5nIHRoZSB0ZW1wb3JhcnkKKwkJCQkgICBidWZmZXIsIHRoZSBsZW5ndGggc2hvdWxkIGJlIDAnZCAqLworCQkJCWN0eC0+dG1wX2xlbj0wOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKG4gPCAzKQorCQkJCQl7CisJCQkJCW1lbWNweShjdHgtPnRtcCxpbixuKTsKKwkJCQkJY3R4LT50bXBfbGVuPW47CisJCQkJCXJldCArPSBuOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCW4tPW4lMzsKKwkJCQljdHgtPmJ1Zl9sZW49RVZQX0VuY29kZUJsb2NrKCh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilpbixuKTsKKwkJCQlPUEVOU1NMX2Fzc2VydChjdHgtPmJ1Zl9sZW4gPD0gKGludClzaXplb2YoY3R4LT5idWYpKTsKKwkJCQlPUEVOU1NMX2Fzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKKwkJCQlyZXQgKz0gbjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUVWUF9FbmNvZGVVcGRhdGUoJihjdHgtPmJhc2U2NCksCisJCQkJKHVuc2lnbmVkIGNoYXIgKiljdHgtPmJ1ZiwmY3R4LT5idWZfbGVuLAorCQkJCSh1bnNpZ25lZCBjaGFyICopaW4sbik7CisJCQlPUEVOU1NMX2Fzc2VydChjdHgtPmJ1Zl9sZW4gPD0gKGludClzaXplb2YoY3R4LT5idWYpKTsKKwkJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+YnVmX2xlbiA+PSBjdHgtPmJ1Zl9vZmYpOworCQkJcmV0ICs9IG47CisJCQl9CisJCWlubC09bjsKKwkJaW4rPW47CisKKwkJY3R4LT5idWZfb2ZmPTA7CisJCW49Y3R4LT5idWZfbGVuOworCQl3aGlsZSAobiA+IDApCisJCQl7CisJCQlpPUJJT193cml0ZShiLT5uZXh0X2JpbywmKGN0eC0+YnVmW2N0eC0+YnVmX29mZl0pLG4pOworCQkJaWYgKGkgPD0gMCkKKwkJCQl7CisJCQkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJCQlyZXR1cm4oKHJldCA9PSAwKT9pOnJldCk7CisJCQkJfQorCQkJT1BFTlNTTF9hc3NlcnQoaSA8PSBuKTsKKwkJCW4tPWk7CisJCQljdHgtPmJ1Zl9vZmYrPWk7CisJCQlPUEVOU1NMX2Fzc2VydChjdHgtPmJ1Zl9vZmYgPD0gKGludClzaXplb2YoY3R4LT5idWYpKTsKKwkJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+YnVmX2xlbiA+PSBjdHgtPmJ1Zl9vZmYpOworCQkJfQorCQljdHgtPmJ1Zl9sZW49MDsKKwkJY3R4LT5idWZfb2ZmPTA7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIGI2NF9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJQklPX0I2NF9DVFggKmN0eDsKKwlsb25nIHJldD0xOworCWludCBpOworCisJY3R4PShCSU9fQjY0X0NUWCAqKWItPnB0cjsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBCSU9fQ1RSTF9SRVNFVDoKKwkJY3R4LT5jb250PTE7CisJCWN0eC0+c3RhcnQ9MTsKKwkJY3R4LT5lbmNvZGU9QjY0X05PTkU7CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRU9GOgkvKiBNb3JlIHRvIHJlYWQgKi8KKwkJaWYgKGN0eC0+Y29udCA8PSAwKQorCQkJcmV0PTE7CisJCWVsc2UKKwkJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfV1BFTkRJTkc6IC8qIE1vcmUgdG8gd3JpdGUgaW4gYnVmZmVyICovCisJCU9QRU5TU0xfYXNzZXJ0KGN0eC0+YnVmX2xlbiA+PSBjdHgtPmJ1Zl9vZmYpOworCQlyZXQ9Y3R4LT5idWZfbGVuLWN0eC0+YnVmX29mZjsKKwkJaWYgKChyZXQgPT0gMCkgJiYgKGN0eC0+ZW5jb2RlICE9IEI2NF9OT05FKQorCQkJJiYgKGN0eC0+YmFzZTY0Lm51bSAhPSAwKSkKKwkJCXJldD0xOworCQllbHNlIGlmIChyZXQgPD0gMCkKKwkJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfUEVORElORzogLyogTW9yZSB0byByZWFkIGluIGJ1ZmZlciAqLworCQlPUEVOU1NMX2Fzc2VydChjdHgtPmJ1Zl9sZW4gPj0gY3R4LT5idWZfb2ZmKTsKKwkJcmV0PWN0eC0+YnVmX2xlbi1jdHgtPmJ1Zl9vZmY7CisJCWlmIChyZXQgPD0gMCkKKwkJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRkxVU0g6CisJCS8qIGRvIGEgZmluYWwgd3JpdGUgKi8KK2FnYWluOgorCQl3aGlsZSAoY3R4LT5idWZfbGVuICE9IGN0eC0+YnVmX29mZikKKwkJCXsKKwkJCWk9YjY0X3dyaXRlKGIsTlVMTCwwKTsKKwkJCWlmIChpIDwgMCkKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJaWYgKEJJT19nZXRfZmxhZ3MoYikgJiBCSU9fRkxBR1NfQkFTRTY0X05PX05MKQorCQkJeworCQkJaWYgKGN0eC0+dG1wX2xlbiAhPSAwKQorCQkJCXsKKwkJCQljdHgtPmJ1Zl9sZW49RVZQX0VuY29kZUJsb2NrKAorCQkJCQkodW5zaWduZWQgY2hhciAqKWN0eC0+YnVmLAorCQkJCQkodW5zaWduZWQgY2hhciAqKWN0eC0+dG1wLAorCQkJCQljdHgtPnRtcF9sZW4pOworCQkJCWN0eC0+YnVmX29mZj0wOworCQkJCWN0eC0+dG1wX2xlbj0wOworCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJfQorCQllbHNlIGlmIChjdHgtPmVuY29kZSAhPSBCNjRfTk9ORSAmJiBjdHgtPmJhc2U2NC5udW0gIT0gMCkKKwkJCXsKKwkJCWN0eC0+YnVmX29mZj0wOworCQkJRVZQX0VuY29kZUZpbmFsKCYoY3R4LT5iYXNlNjQpLAorCQkJCSh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsCisJCQkJJihjdHgtPmJ1Zl9sZW4pKTsKKwkJCS8qIHB1c2ggb3V0IHRoZSBieXRlcyAqLworCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJLyogRmluYWxseSBmbHVzaCB0aGUgdW5kZXJseWluZyBCSU8gKi8KKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6CisJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJYnJlYWs7CisKKwljYXNlIEJJT19DVFJMX0RVUDoKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9JTkZPOgorCWNhc2UgQklPX0NUUkxfR0VUOgorCWNhc2UgQklPX0NUUkxfU0VUOgorCWRlZmF1bHQ6CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgbG9uZyBiNjRfY2FsbGJhY2tfY3RybChCSU8gKmIsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCkKKwl7CisJbG9uZyByZXQ9MTsKKworCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJc3dpdGNoIChjbWQpCisJCXsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2NhbGxiYWNrX2N0cmwoYi0+bmV4dF9iaW8sY21kLGZwKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgYjY0X3B1dHMoQklPICpiLCBjb25zdCBjaGFyICpzdHIpCisJeworCXJldHVybiBiNjRfd3JpdGUoYixzdHIsc3RybGVuKHN0cikpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvYmlvX2VuYy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9iaW9fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlZmI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvYmlvX2VuYy5jCkBAIC0wLDAgKzEsNDI4IEBACisvKiBjcnlwdG8vZXZwL2Jpb19lbmMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCitzdGF0aWMgaW50IGVuY193cml0ZShCSU8gKmgsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IGVuY19yZWFkKEJJTyAqaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CisvKnN0YXRpYyBpbnQgZW5jX3B1dHMoQklPICpoLCBjb25zdCBjaGFyICpzdHIpOyAqLworLypzdGF0aWMgaW50IGVuY19nZXRzKEJJTyAqaCwgY2hhciAqc3RyLCBpbnQgc2l6ZSk7ICovCitzdGF0aWMgbG9uZyBlbmNfY3RybChCSU8gKmgsIGludCBjbWQsIGxvbmcgYXJnMSwgdm9pZCAqYXJnMik7CitzdGF0aWMgaW50IGVuY19uZXcoQklPICpoKTsKK3N0YXRpYyBpbnQgZW5jX2ZyZWUoQklPICpkYXRhKTsKK3N0YXRpYyBsb25nIGVuY19jYWxsYmFja19jdHJsKEJJTyAqaCwgaW50IGNtZCwgYmlvX2luZm9fY2IgKmZwcyk7CisjZGVmaW5lIEVOQ19CTE9DS19TSVpFCSgxMDI0KjQpCisjZGVmaW5lIEJVRl9PRkZTRVQJKEVWUF9NQVhfQkxPQ0tfTEVOR1RIKjIpCisKK3R5cGVkZWYgc3RydWN0IGVuY19zdHJ1Y3QKKwl7CisJaW50IGJ1Zl9sZW47CisJaW50IGJ1Zl9vZmY7CisJaW50IGNvbnQ7CQkvKiA8PSAwIHdoZW4gZmluaXNoZWQgKi8KKwlpbnQgZmluaXNoZWQ7CisJaW50IG9rOwkJCS8qIGJhZCBkZWNyeXB0ICovCisJRVZQX0NJUEhFUl9DVFggY2lwaGVyOworCS8qIGJ1ZiBpcyBsYXJnZXIgdGhhbiBFTkNfQkxPQ0tfU0laRSBiZWNhdXNlIEVWUF9EZWNyeXB0VXBkYXRlCisJICogY2FuIHJldHVybiB1cCB0byBhIGJsb2NrIG1vcmUgZGF0YSB0aGFuIGlzIHByZXNlbnRlZCB0byBpdAorCSAqLworCWNoYXIgYnVmW0VOQ19CTE9DS19TSVpFK0JVRl9PRkZTRVQrMl07CisJfSBCSU9fRU5DX0NUWDsKKworc3RhdGljIEJJT19NRVRIT0QgbWV0aG9kc19lbmM9CisJeworCUJJT19UWVBFX0NJUEhFUiwiY2lwaGVyIiwKKwllbmNfd3JpdGUsCisJZW5jX3JlYWQsCisJTlVMTCwgLyogZW5jX3B1dHMsICovCisJTlVMTCwgLyogZW5jX2dldHMsICovCisJZW5jX2N0cmwsCisJZW5jX25ldywKKwllbmNfZnJlZSwKKwllbmNfY2FsbGJhY2tfY3RybCwKKwl9OworCitCSU9fTUVUSE9EICpCSU9fZl9jaXBoZXIodm9pZCkKKwl7CisJcmV0dXJuKCZtZXRob2RzX2VuYyk7CisJfQorCitzdGF0aWMgaW50IGVuY19uZXcoQklPICpiaSkKKwl7CisJQklPX0VOQ19DVFggKmN0eDsKKworCWN0eD0oQklPX0VOQ19DVFggKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQklPX0VOQ19DVFgpKTsKKwlpZiAoY3R4ID09IE5VTEwpIHJldHVybigwKTsKKwlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgtPmNpcGhlcik7CisKKwljdHgtPmJ1Zl9sZW49MDsKKwljdHgtPmJ1Zl9vZmY9MDsKKwljdHgtPmNvbnQ9MTsKKwljdHgtPmZpbmlzaGVkPTA7CisJY3R4LT5vaz0xOworCisJYmktPmluaXQ9MDsKKwliaS0+cHRyPShjaGFyICopY3R4OworCWJpLT5mbGFncz0wOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgZW5jX2ZyZWUoQklPICphKQorCXsKKwlCSU9fRU5DX0NUWCAqYjsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKwliPShCSU9fRU5DX0NUWCAqKWEtPnB0cjsKKwlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCYoYi0+Y2lwaGVyKSk7CisJT1BFTlNTTF9jbGVhbnNlKGEtPnB0cixzaXplb2YoQklPX0VOQ19DVFgpKTsKKwlPUEVOU1NMX2ZyZWUoYS0+cHRyKTsKKwlhLT5wdHI9TlVMTDsKKwlhLT5pbml0PTA7CisJYS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCQorc3RhdGljIGludCBlbmNfcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpCisJeworCWludCByZXQ9MCxpOworCUJJT19FTkNfQ1RYICpjdHg7CisKKwlpZiAob3V0ID09IE5VTEwpIHJldHVybigwKTsKKwljdHg9KEJJT19FTkNfQ1RYICopYi0+cHRyOworCisJaWYgKChjdHggPT0gTlVMTCkgfHwgKGItPm5leHRfYmlvID09IE5VTEwpKSByZXR1cm4oMCk7CisKKwkvKiBGaXJzdCBjaGVjayBpZiB0aGVyZSBhcmUgYnl0ZXMgZGVjb2RlZC9lbmNvZGVkICovCisJaWYgKGN0eC0+YnVmX2xlbiA+IDApCisJCXsKKwkJaT1jdHgtPmJ1Zl9sZW4tY3R4LT5idWZfb2ZmOworCQlpZiAoaSA+IG91dGwpIGk9b3V0bDsKKwkJbWVtY3B5KG91dCwmKGN0eC0+YnVmW2N0eC0+YnVmX29mZl0pLGkpOworCQlyZXQ9aTsKKwkJb3V0Kz1pOworCQlvdXRsLT1pOworCQljdHgtPmJ1Zl9vZmYrPWk7CisJCWlmIChjdHgtPmJ1Zl9sZW4gPT0gY3R4LT5idWZfb2ZmKQorCQkJeworCQkJY3R4LT5idWZfbGVuPTA7CisJCQljdHgtPmJ1Zl9vZmY9MDsKKwkJCX0KKwkJfQorCisJLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSByb29tIG9mIG91dGwgYnl0ZXMgYW5kIGFuIGVtcHR5CisJICogYnVmZmVyLCBzbyB3ZSBzaG91bGQgcmVhZCBpbiBzb21lIG1vcmUuICovCisKKwl3aGlsZSAob3V0bCA+IDApCisJCXsKKwkJaWYgKGN0eC0+Y29udCA8PSAwKSBicmVhazsKKworCQkvKiByZWFkIGluIGF0IElWIG9mZnNldCwgcmVhZCB0aGUgRVZQX0NpcGhlcgorCQkgKiBkb2N1bWVudGF0aW9uIGFib3V0IHdoeSAqLworCQlpPUJJT19yZWFkKGItPm5leHRfYmlvLCYoY3R4LT5idWZbQlVGX09GRlNFVF0pLEVOQ19CTE9DS19TSVpFKTsKKworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJLyogU2hvdWxkIGJlIGNvbnRpbnVlIG5leHQgdGltZSB3ZSBhcmUgY2FsbGVkPyAqLworCQkJaWYgKCFCSU9fc2hvdWxkX3JldHJ5KGItPm5leHRfYmlvKSkKKwkJCQl7CisJCQkJY3R4LT5jb250PWk7CisJCQkJaT1FVlBfQ2lwaGVyRmluYWxfZXgoJihjdHgtPmNpcGhlciksCisJCQkJCSh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsCisJCQkJCSYoY3R4LT5idWZfbGVuKSk7CisJCQkJY3R4LT5vaz1pOworCQkJCWN0eC0+YnVmX29mZj0wOworCQkJCX0KKwkJCWVsc2UgCisJCQkJeworCQkJCXJldD0ocmV0ID09IDApP2k6cmV0OworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJRVZQX0NpcGhlclVwZGF0ZSgmKGN0eC0+Y2lwaGVyKSwKKwkJCQkodW5zaWduZWQgY2hhciAqKWN0eC0+YnVmLCZjdHgtPmJ1Zl9sZW4sCisJCQkJKHVuc2lnbmVkIGNoYXIgKikmKGN0eC0+YnVmW0JVRl9PRkZTRVRdKSxpKTsKKwkJCWN0eC0+Y29udD0xOworCQkJLyogTm90ZTogaXQgaXMgcG9zc2libGUgZm9yIEVWUF9DaXBoZXJVcGRhdGUgdG8KKwkJCSAqIGRlY3J5cHQgemVybyBieXRlcyBiZWNhdXNlIHRoaXMgaXMgb3IgbG9va3MgbGlrZQorCQkJICogdGhlIGZpbmFsIGJsb2NrOiBpZiB0aGlzIGhhcHBlbnMgd2Ugc2hvdWxkIHJldHJ5CisJCQkgKiBhbmQgZWl0aGVyIHJlYWQgbW9yZSBkYXRhIG9yIGRlY3J5cHQgdGhlIGZpbmFsCisJCQkgKiBibG9jaworCQkJICovCisJCQlpZihjdHgtPmJ1Zl9sZW4gPT0gMCkgY29udGludWU7CisJCQl9CisKKwkJaWYgKGN0eC0+YnVmX2xlbiA8PSBvdXRsKQorCQkJaT1jdHgtPmJ1Zl9sZW47CisJCWVsc2UKKwkJCWk9b3V0bDsKKwkJaWYgKGkgPD0gMCkgYnJlYWs7CisJCW1lbWNweShvdXQsY3R4LT5idWYsaSk7CisJCXJldCs9aTsKKwkJY3R4LT5idWZfb2ZmPWk7CisJCW91dGwtPWk7CisJCW91dCs9aTsKKwkJfQorCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJcmV0dXJuKChyZXQgPT0gMCk/Y3R4LT5jb250OnJldCk7CisJfQorCitzdGF0aWMgaW50IGVuY193cml0ZShCSU8gKmIsIGNvbnN0IGNoYXIgKmluLCBpbnQgaW5sKQorCXsKKwlpbnQgcmV0PTAsbixpOworCUJJT19FTkNfQ1RYICpjdHg7CisKKwljdHg9KEJJT19FTkNfQ1RYICopYi0+cHRyOworCXJldD1pbmw7CisKKwlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJbj1jdHgtPmJ1Zl9sZW4tY3R4LT5idWZfb2ZmOworCXdoaWxlIChuID4gMCkKKwkJeworCQlpPUJJT193cml0ZShiLT5uZXh0X2JpbywmKGN0eC0+YnVmW2N0eC0+YnVmX29mZl0pLG4pOworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJCXJldHVybihpKTsKKwkJCX0KKwkJY3R4LT5idWZfb2ZmKz1pOworCQluLT1pOworCQl9CisJLyogYXQgdGhpcyBwb2ludCBhbGwgcGVuZGluZyBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4gKi8KKworCWlmICgoaW4gPT0gTlVMTCkgfHwgKGlubCA8PSAwKSkgcmV0dXJuKDApOworCisJY3R4LT5idWZfb2ZmPTA7CisJd2hpbGUgKGlubCA+IDApCisJCXsKKwkJbj0oaW5sID4gRU5DX0JMT0NLX1NJWkUpP0VOQ19CTE9DS19TSVpFOmlubDsKKwkJRVZQX0NpcGhlclVwZGF0ZSgmKGN0eC0+Y2lwaGVyKSwKKwkJCSh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsJmN0eC0+YnVmX2xlbiwKKwkJCSh1bnNpZ25lZCBjaGFyICopaW4sbik7CisJCWlubC09bjsKKwkJaW4rPW47CisKKwkJY3R4LT5idWZfb2ZmPTA7CisJCW49Y3R4LT5idWZfbGVuOworCQl3aGlsZSAobiA+IDApCisJCQl7CisJCQlpPUJJT193cml0ZShiLT5uZXh0X2JpbywmKGN0eC0+YnVmW2N0eC0+YnVmX29mZl0pLG4pOworCQkJaWYgKGkgPD0gMCkKKwkJCQl7CisJCQkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJCQlyZXR1cm4gKHJldCA9PSBpbmwpID8gaSA6IHJldCAtIGlubDsKKwkJCQl9CisJCQluLT1pOworCQkJY3R4LT5idWZfb2ZmKz1pOworCQkJfQorCQljdHgtPmJ1Zl9sZW49MDsKKwkJY3R4LT5idWZfb2ZmPTA7CisJCX0KKwlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgZW5jX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlCSU8gKmRiaW87CisJQklPX0VOQ19DVFggKmN0eCwqZGN0eDsKKwlsb25nIHJldD0xOworCWludCBpOworCUVWUF9DSVBIRVJfQ1RYICoqY19jdHg7CisKKwljdHg9KEJJT19FTkNfQ1RYICopYi0+cHRyOworCisJc3dpdGNoIChjbWQpCisJCXsKKwljYXNlIEJJT19DVFJMX1JFU0VUOgorCQljdHgtPm9rPTE7CisJCWN0eC0+ZmluaXNoZWQ9MDsKKwkJRVZQX0NpcGhlckluaXRfZXgoJihjdHgtPmNpcGhlciksTlVMTCxOVUxMLE5VTEwsTlVMTCwKKwkJCWN0eC0+Y2lwaGVyLmVuY3J5cHQpOworCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0VPRjoJLyogTW9yZSB0byByZWFkICovCisJCWlmIChjdHgtPmNvbnQgPD0gMCkKKwkJCXJldD0xOworCQllbHNlCisJCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCQlyZXQ9Y3R4LT5idWZfbGVuLWN0eC0+YnVmX29mZjsKKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9QRU5ESU5HOiAvKiBNb3JlIHRvIHJlYWQgaW4gYnVmZmVyICovCisJCXJldD1jdHgtPmJ1Zl9sZW4tY3R4LT5idWZfb2ZmOworCQlpZiAocmV0IDw9IDApCisJCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0ZMVVNIOgorCQkvKiBkbyBhIGZpbmFsIHdyaXRlICovCithZ2FpbjoKKwkJd2hpbGUgKGN0eC0+YnVmX2xlbiAhPSBjdHgtPmJ1Zl9vZmYpCisJCQl7CisJCQlpPWVuY193cml0ZShiLE5VTEwsMCk7CisJCQlpZiAoaSA8IDApCisJCQkJcmV0dXJuIGk7CisJCQl9CisKKwkJaWYgKCFjdHgtPmZpbmlzaGVkKQorCQkJeworCQkJY3R4LT5maW5pc2hlZD0xOworCQkJY3R4LT5idWZfb2ZmPTA7CisJCQlyZXQ9RVZQX0NpcGhlckZpbmFsX2V4KCYoY3R4LT5jaXBoZXIpLAorCQkJCSh1bnNpZ25lZCBjaGFyICopY3R4LT5idWYsCisJCQkJJihjdHgtPmJ1Zl9sZW4pKTsKKwkJCWN0eC0+b2s9KGludClyZXQ7CisJCQlpZiAocmV0IDw9IDApIGJyZWFrOworCisJCQkvKiBwdXNoIG91dCB0aGUgYnl0ZXMgKi8KKwkJCWdvdG8gYWdhaW47CisJCQl9CisJCQorCQkvKiBGaW5hbGx5IGZsdXNoIHRoZSB1bmRlcmx5aW5nIEJJTyAqLworCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DX0dFVF9DSVBIRVJfU1RBVFVTOgorCQlyZXQ9KGxvbmcpY3R4LT5vazsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19ET19TVEFURV9NQUNISU5FOgorCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX0NJUEhFUl9DVFg6CisJCWNfY3R4PShFVlBfQ0lQSEVSX0NUWCAqKilwdHI7CisJCSgqY19jdHgpPSAmKGN0eC0+Y2lwaGVyKTsKKwkJYi0+aW5pdD0xOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0RVUDoKKwkJZGJpbz0oQklPICopcHRyOworCQlkY3R4PShCSU9fRU5DX0NUWCAqKWRiaW8tPnB0cjsKKwkJRVZQX0NJUEhFUl9DVFhfaW5pdCgmZGN0eC0+Y2lwaGVyKTsKKwkJcmV0ID0gRVZQX0NJUEhFUl9DVFhfY29weSgmZGN0eC0+Y2lwaGVyLCZjdHgtPmNpcGhlcik7CisJCWlmIChyZXQpCisJCQlkYmlvLT5pbml0PTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgbG9uZyBlbmNfY2FsbGJhY2tfY3RybChCSU8gKmIsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCkKKwl7CisJbG9uZyByZXQ9MTsKKworCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJc3dpdGNoIChjbWQpCisJCXsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2NhbGxiYWNrX2N0cmwoYi0+bmV4dF9iaW8sY21kLGZwKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKKy8qCit2b2lkIEJJT19zZXRfY2lwaGVyX2N0eChiLGMpCitCSU8gKmI7CitFVlBfQ0lQSEVSX2N0eCAqYzsKKwl7CisJaWYgKGIgPT0gTlVMTCkgcmV0dXJuOworCisJaWYgKChiLT5jYWxsYmFjayAhPSBOVUxMKSAmJgorCQkoYi0+Y2FsbGJhY2soYixCSU9fQ0JfQ1RSTCwoY2hhciAqKWMsQklPX0NUUkxfU0VULGUsMEwpIDw9IDApKQorCQlyZXR1cm47CisKKwliLT5pbml0PTE7CisJY3R4PShCSU9fRU5DX0NUWCAqKWItPnB0cjsKKwltZW1jcHkoY3R4LT5jaXBoZXIsYyxzaXplb2YoRVZQX0NJUEhFUl9DVFgpKTsKKwkKKwlpZiAoYi0+Y2FsbGJhY2sgIT0gTlVMTCkKKwkJYi0+Y2FsbGJhY2soYixCSU9fQ0JfQ1RSTCwoY2hhciAqKWMsQklPX0NUUkxfU0VULGUsMUwpOworCX0KKyovCisKK3ZvaWQgQklPX3NldF9jaXBoZXIoQklPICpiLCBjb25zdCBFVlBfQ0lQSEVSICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICprLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaSwgaW50IGUpCisJeworCUJJT19FTkNfQ1RYICpjdHg7CisKKwlpZiAoYiA9PSBOVUxMKSByZXR1cm47CisKKwlpZiAoKGItPmNhbGxiYWNrICE9IE5VTEwpICYmCisJCShiLT5jYWxsYmFjayhiLEJJT19DQl9DVFJMLChjb25zdCBjaGFyICopYyxCSU9fQ1RSTF9TRVQsZSwwTCkgPD0gMCkpCisJCXJldHVybjsKKworCWItPmluaXQ9MTsKKwljdHg9KEJJT19FTkNfQ1RYICopYi0+cHRyOworCUVWUF9DaXBoZXJJbml0X2V4KCYoY3R4LT5jaXBoZXIpLGMsTlVMTCwgayxpLGUpOworCQorCWlmIChiLT5jYWxsYmFjayAhPSBOVUxMKQorCQliLT5jYWxsYmFjayhiLEJJT19DQl9DVFJMLChjb25zdCBjaGFyICopYyxCSU9fQ1RSTF9TRVQsZSwxTCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2Jpb19tZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9iaW9fbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQxZTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9iaW9fbWQuYwpAQCAtMCwwICsxLDI3MCBAQAorLyogY3J5cHRvL2V2cC9iaW9fbWQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisvKiBCSU9fcHV0IGFuZCBCSU9fZ2V0IGJvdGggYWRkIHRvIHRoZSBkaWdlc3QsCisgKiBCSU9fZ2V0cyByZXR1cm5zIHRoZSBkaWdlc3QgKi8KKworc3RhdGljIGludCBtZF93cml0ZShCSU8gKmgsIGNoYXIgY29uc3QgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgaW50IG1kX3JlYWQoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKKy8qc3RhdGljIGludCBtZF9wdXRzKEJJTyAqaCwgY29uc3QgY2hhciAqc3RyKTsgKi8KK3N0YXRpYyBpbnQgbWRfZ2V0cyhCSU8gKmgsIGNoYXIgKnN0ciwgaW50IHNpemUpOworc3RhdGljIGxvbmcgbWRfY3RybChCSU8gKmgsIGludCBjbWQsIGxvbmcgYXJnMSwgdm9pZCAqYXJnMik7CitzdGF0aWMgaW50IG1kX25ldyhCSU8gKmgpOworc3RhdGljIGludCBtZF9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgbG9uZyBtZF9jYWxsYmFja19jdHJsKEJJTyAqaCxpbnQgY21kLGJpb19pbmZvX2NiICpmcCk7CisKK3N0YXRpYyBCSU9fTUVUSE9EIG1ldGhvZHNfbWQ9CisJeworCUJJT19UWVBFX01ELCJtZXNzYWdlIGRpZ2VzdCIsCisJbWRfd3JpdGUsCisJbWRfcmVhZCwKKwlOVUxMLCAvKiBtZF9wdXRzLCAqLworCW1kX2dldHMsCisJbWRfY3RybCwKKwltZF9uZXcsCisJbWRfZnJlZSwKKwltZF9jYWxsYmFja19jdHJsLAorCX07CisKK0JJT19NRVRIT0QgKkJJT19mX21kKHZvaWQpCisJeworCXJldHVybigmbWV0aG9kc19tZCk7CisJfQorCitzdGF0aWMgaW50IG1kX25ldyhCSU8gKmJpKQorCXsKKwlFVlBfTURfQ1RYICpjdHg7CisKKwljdHg9RVZQX01EX0NUWF9jcmVhdGUoKTsKKwlpZiAoY3R4ID09IE5VTEwpIHJldHVybigwKTsKKworCWJpLT5pbml0PTA7CisJYmktPnB0cj0oY2hhciAqKWN0eDsKKwliaS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IG1kX2ZyZWUoQklPICphKQorCXsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJRVZQX01EX0NUWF9kZXN0cm95KGEtPnB0cik7CisJYS0+cHRyPU5VTEw7CisJYS0+aW5pdD0wOworCWEtPmZsYWdzPTA7CisJcmV0dXJuKDEpOworCX0KKwkKK3N0YXRpYyBpbnQgbWRfcmVhZChCSU8gKmIsIGNoYXIgKm91dCwgaW50IG91dGwpCisJeworCWludCByZXQ9MDsKKwlFVlBfTURfQ1RYICpjdHg7CisKKwlpZiAob3V0ID09IE5VTEwpIHJldHVybigwKTsKKwljdHg9Yi0+cHRyOworCisJaWYgKChjdHggPT0gTlVMTCkgfHwgKGItPm5leHRfYmlvID09IE5VTEwpKSByZXR1cm4oMCk7CisKKwlyZXQ9QklPX3JlYWQoYi0+bmV4dF9iaW8sb3V0LG91dGwpOworCWlmIChiLT5pbml0KQorCQl7CisJCWlmIChyZXQgPiAwKQorCQkJeworCQkJaWYgKEVWUF9EaWdlc3RVcGRhdGUoY3R4LCh1bnNpZ25lZCBjaGFyICopb3V0LAorCQkJCSh1bnNpZ25lZCBpbnQpcmV0KTw9MCkgcmV0dXJuICgtMSk7CisJCQl9CisJCX0KKwlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgbWRfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICppbiwgaW50IGlubCkKKwl7CisJaW50IHJldD0wOworCUVWUF9NRF9DVFggKmN0eDsKKworCWlmICgoaW4gPT0gTlVMTCkgfHwgKGlubCA8PSAwKSkgcmV0dXJuKDApOworCWN0eD1iLT5wdHI7CisKKwlpZiAoKGN0eCAhPSBOVUxMKSAmJiAoYi0+bmV4dF9iaW8gIT0gTlVMTCkpCisJCXJldD1CSU9fd3JpdGUoYi0+bmV4dF9iaW8saW4saW5sKTsKKwlpZiAoYi0+aW5pdCkKKwkJeworCQlpZiAocmV0ID4gMCkKKwkJCXsKKwkJCUVWUF9EaWdlc3RVcGRhdGUoY3R4LChjb25zdCB1bnNpZ25lZCBjaGFyICopaW4sCisJCQkJKHVuc2lnbmVkIGludClyZXQpOworCQkJfQorCQl9CisJaWYoYi0+bmV4dF9iaW8gIT0gTlVMTCkKKwkJeworCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIG1kX2N0cmwoQklPICpiLCBpbnQgY21kLCBsb25nIG51bSwgdm9pZCAqcHRyKQorCXsKKwlFVlBfTURfQ1RYICpjdHgsKmRjdHgsKipwY3R4OworCWNvbnN0IEVWUF9NRCAqKnBwbWQ7CisJRVZQX01EICptZDsKKwlsb25nIHJldD0xOworCUJJTyAqZGJpbzsKKworCWN0eD1iLT5wdHI7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgQklPX0NUUkxfUkVTRVQ6CisJCWlmIChiLT5pbml0KQorCQkJcmV0ID0gRVZQX0RpZ2VzdEluaXRfZXgoY3R4LGN0eC0+ZGlnZXN0LCBOVUxMKTsKKwkJZWxzZQorCQkJcmV0PTA7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19HRVRfTUQ6CisJCWlmIChiLT5pbml0KQorCQkJeworCQkJcHBtZD1wdHI7CisJCQkqcHBtZD1jdHgtPmRpZ2VzdDsKKwkJCX0KKwkJZWxzZQorCQkJcmV0PTA7CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX01EX0NUWDoKKwkJcGN0eD1wdHI7CisJCSpwY3R4PWN0eDsKKwkJYi0+aW5pdCA9IDE7CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX01EX0NUWDoKKwkJaWYgKGItPmluaXQpCisJCQliLT5wdHI9cHRyOworCQllbHNlCisJCQlyZXQ9MDsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19ET19TVEFURV9NQUNISU5FOgorCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCWJyZWFrOworCisJY2FzZSBCSU9fQ19TRVRfTUQ6CisJCW1kPXB0cjsKKwkJcmV0ID0gRVZQX0RpZ2VzdEluaXRfZXgoY3R4LG1kLCBOVUxMKTsKKwkJaWYgKHJldCA+IDApCisJCQliLT5pbml0PTE7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRFVQOgorCQlkYmlvPXB0cjsKKwkJZGN0eD1kYmlvLT5wdHI7CisJCUVWUF9NRF9DVFhfY29weV9leChkY3R4LGN0eCk7CisJCWItPmluaXQ9MTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIG1kX2NhbGxiYWNrX2N0cmwoQklPICpiLCBpbnQgY21kLCBiaW9faW5mb19jYiAqZnApCisJeworCWxvbmcgcmV0PTE7CisKKwlpZiAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgcmV0dXJuKDApOworCXN3aXRjaCAoY21kKQorCQl7CisJZGVmYXVsdDoKKwkJcmV0PUJJT19jYWxsYmFja19jdHJsKGItPm5leHRfYmlvLGNtZCxmcCk7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IG1kX2dldHMoQklPICpicCwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKKwl7CisJRVZQX01EX0NUWCAqY3R4OworCXVuc2lnbmVkIGludCByZXQ7CisKKworCWN0eD1icC0+cHRyOworCWlmIChzaXplIDwgY3R4LT5kaWdlc3QtPm1kX3NpemUpCisJCXJldHVybigwKTsKKwlpZiAoRVZQX0RpZ2VzdEZpbmFsX2V4KGN0eCwodW5zaWduZWQgY2hhciAqKWJ1ZiwmcmV0KTw9MCkgCisJCXJldHVybiAtMTsKKwkJCisJcmV0dXJuKChpbnQpcmV0KTsKKwl9CisKKy8qCitzdGF0aWMgaW50IG1kX3B1dHMoYnAsc3RyKQorQklPICpicDsKK2NoYXIgKnN0cjsKKwl7CisJcmV0dXJuKC0xKTsKKwl9CisqLworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2Jpb19vay5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9iaW9fb2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGJjMWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9iaW9fb2suYwpAQCAtMCwwICsxLDU3NSBAQAorLyogY3J5cHRvL2V2cC9iaW9fb2suYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKgorCUZyb206IEFybmUgQW5zcGVyIDxhcm5lQGN5YmVyLmVlPgorCisJV2h5IEJJT19mX3JlbGlhYmxlPworCisJSSB3cm90ZSBmdW5jdGlvbiB3aGljaCB0b29rIEJJTyogYXMgYXJndW1lbnQsIHJlYWQgZGF0YSBmcm9tIGl0CisJYW5kIHByb2Nlc3NlZCBpdC4gVGhlbiBJIHdhbnRlZCB0byBzdG9yZSB0aGUgaW5wdXQgZmlsZSBpbiAKKwllbmNyeXB0ZWQgZm9ybS4gT0sgSSBwdXNoZWQgQklPX2ZfY2lwaGVyIHRvIHRoZSBCSU8gc3RhY2sKKwlhbmQgZXZlcnl0aGluZyB3YXMgT0suIEJVVCBpZiB1c2VyIHR5cGVzIHdyb25nIHBhc3N3b3JkIAorCUJJT19mX2NpcGhlciBvdXRwdXRzIG9ubHkgZ2FyYmFnZSBhbmQgbXkgZnVuY3Rpb24gY3Jhc2hlcy4gWWVzCisJSSBjYW4gYW5kIEkgc2hvdWxkIGZpeCBteSBmdW5jdGlvbiwgYnV0IEJJT19mX2NpcGhlciBpcyAKKwllYXN5IHdheSB0byBhZGQgZW5jcnlwdGlvbiBzdXBwb3J0IHRvIG1hbnkgZXhpc3RpbmcgYXBwbGljYXRpb25zCisJYW5kIGl0J3MgaGFyZCB0byBkZWJ1ZyBhbmQgZml4IHRoZW0gYWxsLiAKKworCVNvIEkgd2FudGVkIGFub3RoZXIgQklPIHdoaWNoIHdvdWxkIGNhdGNoIHRoZSBpbmNvcnJlY3QgcGFzc3dvcmRzIGFuZAorCWZpbGUgZGFtYWdlcyB3aGljaCBjYXVzZSBnYXJiYWdlIG9uIEJJT19mX2NpcGhlcidzIG91dHB1dC4gCisKKwlUaGUgZWFzeSB3YXkgaXMgdG8gcHVzaCB0aGUgQklPX2ZfbWQgYW5kIHNhdmUgdGhlIGNoZWNrc3VtIGF0IAorCXRoZSBlbmQgb2YgdGhlIGZpbGUuIEhvd2V2ZXIgdGhlcmUgYXJlIHNldmVyYWwgcHJvYmxlbXMgd2l0aCB0aGlzCisJYXBwcm9hY2g6CisKKwkxKSB5b3UgbXVzdCBzb21laG93IHNlcGFyYXRlIGNoZWNrc3VtIGZyb20gYWN0dWFsIGRhdGEuIAorCTIpIHlvdSBuZWVkIGxvdCdzIG9mIG1lbW9yeSB3aGVuIHJlYWRpbmcgdGhlIGZpbGUsIGJlY2F1c2UgeW91IAorCW11c3QgcmVhZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCB2ZXJpZnkgdGhlIGNoZWNrc3VtIGJlZm9yZQorCWxldHRpbmcgdGhlIGFwcGxpY2F0aW9uIHRvIHJlYWQgdGhlIGRhdGEuIAorCQorCUJJT19mX3JlbGlhYmxlIHRyaWVzIHRvIHNvbHZlIGJvdGggcHJvYmxlbXMsIHNvIHRoYXQgeW91IGNhbiAKKwlyZWFkIGFuZCB3cml0ZSBhcmJpdHJhcnkgbG9uZyBzdHJlYW1zIHVzaW5nIG9ubHkgZml4ZWQgYW1vdW50CisJb2YgbWVtb3J5LgorCisJQklPX2ZfcmVsaWFibGUgc3BsaXRzIGRhdGEgc3RyZWFtIGludG8gYmxvY2tzLiBFYWNoIGJsb2NrIGlzIHByZWZpeGVkCisJd2l0aCBpdCdzIGxlbmd0aCBhbmQgc3VmZml4ZWQgd2l0aCBpdCdzIGRpZ2VzdC4gU28geW91IG5lZWQgb25seSAKKwlzZXZlcmFsIEtieXRlcyBvZiBtZW1vcnkgdG8gYnVmZmVyIHNpbmdsZSBibG9jayBiZWZvcmUgdmVyaWZ5aW5nIAorCWl0J3MgZGlnZXN0LiAKKworCUJJT19mX3JlbGlhYmxlIGdvZXMgZnVydGhlciBhbmQgYWRkcyBzZXZlcmFsIGltcG9ydGFudCBjYXBhYmlsaXRpZXM6CisKKwkxKSB0aGUgZGlnZXN0IG9mIHRoZSBibG9jayBpcyBjb21wdXRlZCBvdmVyIHRoZSB3aG9sZSBzdHJlYW0gCisJLS0gc28gbm9ib2R5IGNhbiByZWFycmFuZ2UgdGhlIGJsb2NrcyBvciByZW1vdmUgb3IgcmVwbGFjZSB0aGVtLgorCisJMikgdG8gZGV0ZWN0IGludmFsaWQgcGFzc3dvcmRzIHJpZ2h0IGF0IHRoZSBzdGFydCBCSU9fZl9yZWxpYWJsZSAKKwlhZGRzIHNwZWNpYWwgcHJlZml4IHRvIHRoZSBzdHJlYW0uIEluIG9yZGVyIHRvIGF2b2lkIGtub3duIHBsYWluLXRleHQKKwlhdHRhY2tzIHRoaXMgcHJlZml4IGlzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgorCisJCSopIGRpZ2VzdCBpcyBpbml0aWFsaXplZCB3aXRoIHJhbmRvbSBzZWVkIGluc3RlYWQgb2YgCisJCXN0YW5kYXJkaXplZCBvbmUuCisJCSopIHNhbWUgc2VlZCBpcyB3cml0dGVuIHRvIG91dHB1dAorCQkqKSB3ZWxsLWtub3duIHRleHQgaXMgdGhlbiBoYXNoZWQgYW5kIHRoZSBvdXRwdXQgCisJCW9mIHRoZSBkaWdlc3QgaXMgYWxzbyB3cml0dGVuIHRvIG91dHB1dC4KKworCXJlYWRlciBjYW4gbm93IHJlYWQgdGhlIHNlZWQgZnJvbSBzdHJlYW0sIGhhc2ggdGhlIHNhbWUgc3RyaW5nCisJYW5kIHRoZW4gY29tcGFyZSB0aGUgZGlnZXN0IG91dHB1dC4KKworCUJhZCB0aGluZ3M6IEJJT19mX3JlbGlhYmxlIGtub3dzIHdoYXQncyBnb2luZyBvbiBpbiBFVlBfRGlnZXN0LiBJIAorCWluaXRpYWxseSB3cm90ZSBhbmQgdGVzdGVkIHRoaXMgY29kZSBvbiB4ODYgbWFjaGluZSBhbmQgd3JvdGUgdGhlCisJZGlnZXN0cyBvdXQgaW4gbWFjaGluZS1kZXBlbmRlbnQgb3JkZXIgOiggVGhlcmUgYXJlIHBlb3BsZSB1c2luZworCXRoaXMgY29kZSBhbmQgSSBjYW5ub3QgY2hhbmdlIHRoaXMgZWFzaWx5IHdpdGhvdXQgbWFraW5nIGV4aXN0aW5nCisJZGF0YSBmaWxlcyB1bnJlYWRhYmxlLgorCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK3N0YXRpYyBpbnQgb2tfd3JpdGUoQklPICpoLCBjb25zdCBjaGFyICpidWYsIGludCBudW0pOworc3RhdGljIGludCBva19yZWFkKEJJTyAqaCwgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CitzdGF0aWMgbG9uZyBva19jdHJsKEJJTyAqaCwgaW50IGNtZCwgbG9uZyBhcmcxLCB2b2lkICphcmcyKTsKK3N0YXRpYyBpbnQgb2tfbmV3KEJJTyAqaCk7CitzdGF0aWMgaW50IG9rX2ZyZWUoQklPICpkYXRhKTsKK3N0YXRpYyBsb25nIG9rX2NhbGxiYWNrX2N0cmwoQklPICpoLCBpbnQgY21kLCBiaW9faW5mb19jYiAqZnApOworCitzdGF0aWMgdm9pZCBzaWdfb3V0KEJJTyogYik7CitzdGF0aWMgdm9pZCBzaWdfaW4oQklPKiBiKTsKK3N0YXRpYyB2b2lkIGJsb2NrX291dChCSU8qIGIpOworc3RhdGljIHZvaWQgYmxvY2tfaW4oQklPKiBiKTsKKyNkZWZpbmUgT0tfQkxPQ0tfU0laRQkoMTAyNCo0KQorI2RlZmluZSBPS19CTE9DS19CTE9DSwk0CisjZGVmaW5lIElPQlMJCShPS19CTE9DS19TSVpFKyBPS19CTE9DS19CTE9DSysgMypFVlBfTUFYX01EX1NJWkUpCisjZGVmaW5lIFdFTExLTk9XTiAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cncyBiYWNrLiIKKwordHlwZWRlZiBzdHJ1Y3Qgb2tfc3RydWN0CisJeworCXNpemVfdCBidWZfbGVuOworCXNpemVfdCBidWZfb2ZmOworCXNpemVfdCBidWZfbGVuX3NhdmU7CisJc2l6ZV90IGJ1Zl9vZmZfc2F2ZTsKKwlpbnQgY29udDsJCS8qIDw9IDAgd2hlbiBmaW5pc2hlZCAqLworCWludCBmaW5pc2hlZDsKKwlFVlBfTURfQ1RYIG1kOworCWludCBibG9ja291dDsJCS8qIG91dHB1dCBibG9jayBpcyByZWFkeSAqLyAKKwlpbnQgc2lnaW87CQkvKiBtdXN0IHByb2Nlc3Mgc2lnbmF0dXJlICovCisJdW5zaWduZWQgY2hhciBidWZbSU9CU107CisJfSBCSU9fT0tfQ1RYOworCitzdGF0aWMgQklPX01FVEhPRCBtZXRob2RzX29rPQorCXsKKwlCSU9fVFlQRV9DSVBIRVIsInJlbGlhYmxlIiwKKwlva193cml0ZSwKKwlva19yZWFkLAorCU5VTEwsIC8qIG9rX3B1dHMsICovCisJTlVMTCwgLyogb2tfZ2V0cywgKi8KKwlva19jdHJsLAorCW9rX25ldywKKwlva19mcmVlLAorCW9rX2NhbGxiYWNrX2N0cmwsCisJfTsKKworQklPX01FVEhPRCAqQklPX2ZfcmVsaWFibGUodm9pZCkKKwl7CisJcmV0dXJuKCZtZXRob2RzX29rKTsKKwl9CisKK3N0YXRpYyBpbnQgb2tfbmV3KEJJTyAqYmkpCisJeworCUJJT19PS19DVFggKmN0eDsKKworCWN0eD0oQklPX09LX0NUWCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU9fT0tfQ1RYKSk7CisJaWYgKGN0eCA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwljdHgtPmJ1Zl9sZW49MDsKKwljdHgtPmJ1Zl9vZmY9MDsKKwljdHgtPmJ1Zl9sZW5fc2F2ZT0wOworCWN0eC0+YnVmX29mZl9zYXZlPTA7CisJY3R4LT5jb250PTE7CisJY3R4LT5maW5pc2hlZD0wOworCWN0eC0+YmxvY2tvdXQ9IDA7CisJY3R4LT5zaWdpbz0xOworCisJRVZQX01EX0NUWF9pbml0KCZjdHgtPm1kKTsKKworCWJpLT5pbml0PTA7CisJYmktPnB0cj0oY2hhciAqKWN0eDsKKwliaS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IG9rX2ZyZWUoQklPICphKQorCXsKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJRVZQX01EX0NUWF9jbGVhbnVwKCYoKEJJT19PS19DVFggKilhLT5wdHIpLT5tZCk7CisJT1BFTlNTTF9jbGVhbnNlKGEtPnB0cixzaXplb2YoQklPX09LX0NUWCkpOworCU9QRU5TU0xfZnJlZShhLT5wdHIpOworCWEtPnB0cj1OVUxMOworCWEtPmluaXQ9MDsKKwlhLT5mbGFncz0wOworCXJldHVybigxKTsKKwl9CisJCitzdGF0aWMgaW50IG9rX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgcmV0PTAsaSxuOworCUJJT19PS19DVFggKmN0eDsKKworCWlmIChvdXQgPT0gTlVMTCkgcmV0dXJuKDApOworCWN0eD0oQklPX09LX0NUWCAqKWItPnB0cjsKKworCWlmICgoY3R4ID09IE5VTEwpIHx8IChiLT5uZXh0X2JpbyA9PSBOVUxMKSB8fCAoYi0+aW5pdCA9PSAwKSkgcmV0dXJuKDApOworCisJd2hpbGUob3V0bCA+IDApCisJCXsKKworCQkvKiBjb3B5IGNsZWFuIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIgKi8KKwkJaWYgKGN0eC0+YmxvY2tvdXQpCisJCQl7CisJCQlpPWN0eC0+YnVmX2xlbi1jdHgtPmJ1Zl9vZmY7CisJCQlpZiAoaSA+IG91dGwpIGk9b3V0bDsKKwkJCW1lbWNweShvdXQsJihjdHgtPmJ1ZltjdHgtPmJ1Zl9vZmZdKSxpKTsKKwkJCXJldCs9aTsKKwkJCW91dCs9aTsKKwkJCW91dGwtPWk7CisJCQljdHgtPmJ1Zl9vZmYrPWk7CisKKwkJCS8qIGFsbCBjbGVhbiBieXRlcyBhcmUgb3V0ICovCisJCQlpZiAoY3R4LT5idWZfbGVuID09IGN0eC0+YnVmX29mZikKKwkJCQl7CisJCQkJY3R4LT5idWZfb2ZmPTA7CisKKwkJCQkvKiBjb3B5IHN0YXJ0IG9mIHRoZSBuZXh0IGJsb2NrIGludG8gcHJvcGVyIHBsYWNlICovCisJCQkJaWYoY3R4LT5idWZfbGVuX3NhdmUtIGN0eC0+YnVmX29mZl9zYXZlID4gMCkKKwkJCQkJeworCQkJCQljdHgtPmJ1Zl9sZW49IGN0eC0+YnVmX2xlbl9zYXZlLSBjdHgtPmJ1Zl9vZmZfc2F2ZTsKKwkJCQkJbWVtbW92ZShjdHgtPmJ1ZiwgJihjdHgtPmJ1ZltjdHgtPmJ1Zl9vZmZfc2F2ZV0pLAorCQkJCQkJCWN0eC0+YnVmX2xlbik7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJY3R4LT5idWZfbGVuPTA7CisJCQkJCX0KKwkJCQljdHgtPmJsb2Nrb3V0PSAwOworCQkJCX0KKwkJCX0KKwkKKwkJLyogb3V0cHV0IGJ1ZmZlciBmdWxsIC0tIGNhbmNlbCAqLworCQlpZiAob3V0bCA9PSAwKSBicmVhazsKKworCQkvKiBubyBjbGVhbiBieXRlcyBpbiBidWZmZXIgLS0gZmlsbCBpdCAqLworCQluPUlPQlMtIGN0eC0+YnVmX2xlbjsKKwkJaT1CSU9fcmVhZChiLT5uZXh0X2JpbywmKGN0eC0+YnVmW2N0eC0+YnVmX2xlbl0pLG4pOworCisJCWlmIChpIDw9IDApIGJyZWFrOwkvKiBub3RoaW5nIG5ldyAqLworCisJCWN0eC0+YnVmX2xlbis9IGk7CisKKwkJLyogbm8gc2lnbmF0dXJlIHlldCAtLSBjaGVjayBpZiB3ZSBnb3Qgb25lICovCisJCWlmIChjdHgtPnNpZ2lvID09IDEpIHNpZ19pbihiKTsKKworCQkvKiBzaWduYXR1cmUgb2sgLS0gY2hlY2sgaWYgd2UgZ290IGJsb2NrICovCisJCWlmIChjdHgtPnNpZ2lvID09IDApIGJsb2NrX2luKGIpOworCisJCS8qIGludmFsaWQgYmxvY2sgLS0gY2FuY2VsICovCisJCWlmIChjdHgtPmNvbnQgPD0gMCkgYnJlYWs7CisKKwkJfQorCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IG9rX3dyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqaW4sIGludCBpbmwpCisJeworCWludCByZXQ9MCxuLGk7CisJQklPX09LX0NUWCAqY3R4OworCisJaWYgKGlubCA8PSAwKSByZXR1cm4gaW5sOworCisJY3R4PShCSU9fT0tfQ1RYICopYi0+cHRyOworCXJldD1pbmw7CisKKwlpZiAoKGN0eCA9PSBOVUxMKSB8fCAoYi0+bmV4dF9iaW8gPT0gTlVMTCkgfHwgKGItPmluaXQgPT0gMCkpIHJldHVybigwKTsKKworCWlmKGN0eC0+c2lnaW8pIHNpZ19vdXQoYik7CisKKwlkb3sKKwkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCQluPWN0eC0+YnVmX2xlbi1jdHgtPmJ1Zl9vZmY7CisJCXdoaWxlIChjdHgtPmJsb2Nrb3V0ICYmIG4gPiAwKQorCQkJeworCQkJaT1CSU9fd3JpdGUoYi0+bmV4dF9iaW8sJihjdHgtPmJ1ZltjdHgtPmJ1Zl9vZmZdKSxuKTsKKwkJCWlmIChpIDw9IDApCisJCQkJeworCQkJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCQkJaWYoIUJJT19zaG91bGRfcmV0cnkoYikpCisJCQkJCWN0eC0+Y29udD0gMDsKKwkJCQlyZXR1cm4oaSk7CisJCQkJfQorCQkJY3R4LT5idWZfb2ZmKz1pOworCQkJbi09aTsKKwkJCX0KKworCQkvKiBhdCB0aGlzIHBvaW50IGFsbCBwZW5kaW5nIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiAqLworCQljdHgtPmJsb2Nrb3V0PSAwOworCQlpZiAoY3R4LT5idWZfbGVuID09IGN0eC0+YnVmX29mZikKKwkJCXsKKwkJCWN0eC0+YnVmX2xlbj1PS19CTE9DS19CTE9DSzsKKwkJCWN0eC0+YnVmX29mZj0wOworCQkJfQorCQorCQlpZiAoKGluID09IE5VTEwpIHx8IChpbmwgPD0gMCkpIHJldHVybigwKTsKKworCQluPSAoaW5sKyBjdHgtPmJ1Zl9sZW4gPiBPS19CTE9DS19TSVpFKyBPS19CTE9DS19CTE9DSykgPyAKKwkJCShpbnQpKE9LX0JMT0NLX1NJWkUrT0tfQkxPQ0tfQkxPQ0stY3R4LT5idWZfbGVuKSA6IGlubDsKKworCQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoJihjdHgtPmJ1ZltjdHgtPmJ1Zl9sZW5dKSksKHVuc2lnbmVkIGNoYXIgKilpbixuKTsKKwkJY3R4LT5idWZfbGVuKz0gbjsKKwkJaW5sLT1uOworCQlpbis9bjsKKworCQlpZihjdHgtPmJ1Zl9sZW4gPj0gT0tfQkxPQ0tfU0laRSsgT0tfQkxPQ0tfQkxPQ0spCisJCQl7CisJCQlibG9ja19vdXQoYik7CisJCQl9CisJfXdoaWxlKGlubCA+IDApOworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgbG9uZyBva19jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJQklPX09LX0NUWCAqY3R4OworCUVWUF9NRCAqbWQ7CisJY29uc3QgRVZQX01EICoqcHBtZDsKKwlsb25nIHJldD0xOworCWludCBpOworCisJY3R4PWItPnB0cjsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBCSU9fQ1RSTF9SRVNFVDoKKwkJY3R4LT5idWZfbGVuPTA7CisJCWN0eC0+YnVmX29mZj0wOworCQljdHgtPmJ1Zl9sZW5fc2F2ZT0wOworCQljdHgtPmJ1Zl9vZmZfc2F2ZT0wOworCQljdHgtPmNvbnQ9MTsKKwkJY3R4LT5maW5pc2hlZD0wOworCQljdHgtPmJsb2Nrb3V0PSAwOworCQljdHgtPnNpZ2lvPTE7CisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfRU9GOgkvKiBNb3JlIHRvIHJlYWQgKi8KKwkJaWYgKGN0eC0+Y29udCA8PSAwKQorCQkJcmV0PTE7CisJCWVsc2UKKwkJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfUEVORElORzogLyogTW9yZSB0byByZWFkIGluIGJ1ZmZlciAqLworCWNhc2UgQklPX0NUUkxfV1BFTkRJTkc6IC8qIE1vcmUgdG8gcmVhZCBpbiBidWZmZXIgKi8KKwkJcmV0PWN0eC0+YmxvY2tvdXQgPyBjdHgtPmJ1Zl9sZW4tY3R4LT5idWZfb2ZmIDogMDsKKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKwkJLyogZG8gYSBmaW5hbCB3cml0ZSAqLworCQlpZihjdHgtPmJsb2Nrb3V0ID09IDApCisJCQlibG9ja19vdXQoYik7CisKKwkJd2hpbGUgKGN0eC0+YmxvY2tvdXQpCisJCQl7CisJCQlpPW9rX3dyaXRlKGIsTlVMTCwwKTsKKwkJCWlmIChpIDwgMCkKKwkJCQl7CisJCQkJcmV0PWk7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCWN0eC0+ZmluaXNoZWQ9MTsKKwkJY3R4LT5idWZfb2ZmPWN0eC0+YnVmX2xlbj0wOworCQljdHgtPmNvbnQ9KGludClyZXQ7CisJCQorCQkvKiBGaW5hbGx5IGZsdXNoIHRoZSB1bmRlcmx5aW5nIEJJTyAqLworCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6CisJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9JTkZPOgorCQlyZXQ9KGxvbmcpY3R4LT5jb250OworCQlicmVhazsKKwljYXNlIEJJT19DX1NFVF9NRDoKKwkJbWQ9cHRyOworCQlFVlBfRGlnZXN0SW5pdF9leCgmY3R4LT5tZCwgbWQsIE5VTEwpOworCQliLT5pbml0PTE7CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX01EOgorCQlpZiAoYi0+aW5pdCkKKwkJCXsKKwkJCXBwbWQ9cHRyOworCQkJKnBwbWQ9Y3R4LT5tZC5kaWdlc3Q7CisJCQl9CisJCWVsc2UKKwkJCXJldD0wOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgb2tfY2FsbGJhY2tfY3RybChCSU8gKmIsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCkKKwl7CisJbG9uZyByZXQ9MTsKKworCWlmIChiLT5uZXh0X2JpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJc3dpdGNoIChjbWQpCisJCXsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2NhbGxiYWNrX2N0cmwoYi0+bmV4dF9iaW8sY21kLGZwKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyB2b2lkIGxvbmdzd2FwKHZvaWQgKl9wdHIsIHNpemVfdCBsZW4pCit7CWNvbnN0IHVuaW9uIHsgbG9uZyBvbmU7IGNoYXIgbGl0dGxlOyB9IGlzX2VuZGlhbiA9IHsxfTsKKworCWlmIChpc19lbmRpYW4ubGl0dGxlKSB7CisJCXNpemVfdCBpOworCQl1bnNpZ25lZCBjaGFyICpwPV9wdHIsYzsKKworCQlmb3IoaT0gMDtpIDwgbGVuO2krPSA0KSB7CisJCQljPXBbMF0scFswXT1wWzNdLHBbM109YzsKKwkJCWM9cFsxXSxwWzFdPXBbMl0scFsyXT1jOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzaWdfb3V0KEJJTyogYikKKwl7CisJQklPX09LX0NUWCAqY3R4OworCUVWUF9NRF9DVFggKm1kOworCisJY3R4PWItPnB0cjsKKwltZD0mY3R4LT5tZDsKKworCWlmKGN0eC0+YnVmX2xlbisgMiogbWQtPmRpZ2VzdC0+bWRfc2l6ZSA+IE9LX0JMT0NLX1NJWkUpIHJldHVybjsKKworCUVWUF9EaWdlc3RJbml0X2V4KG1kLCBtZC0+ZGlnZXN0LCBOVUxMKTsKKwkvKiBGSVhNRTogdGhlcmUncyBhYnNvbHV0ZWx5IG5vIGd1YXJhbnRlZSB0aGlzIG1ha2VzIGFueSBzZW5zZSBhdCBhbGwsCisJICogcGFydGljdWxhcmx5IG5vdyBFVlBfTURfQ1RYIGhhcyBiZWVuIHJlc3RydWN0dXJlZC4KKwkgKi8KKwlSQU5EX3BzZXVkb19ieXRlcyhtZC0+bWRfZGF0YSwgbWQtPmRpZ2VzdC0+bWRfc2l6ZSk7CisJbWVtY3B5KCYoY3R4LT5idWZbY3R4LT5idWZfbGVuXSksIG1kLT5tZF9kYXRhLCBtZC0+ZGlnZXN0LT5tZF9zaXplKTsKKwlsb25nc3dhcCgmKGN0eC0+YnVmW2N0eC0+YnVmX2xlbl0pLCBtZC0+ZGlnZXN0LT5tZF9zaXplKTsKKwljdHgtPmJ1Zl9sZW4rPSBtZC0+ZGlnZXN0LT5tZF9zaXplOworCisJRVZQX0RpZ2VzdFVwZGF0ZShtZCwgV0VMTEtOT1dOLCBzdHJsZW4oV0VMTEtOT1dOKSk7CisJRVZQX0RpZ2VzdEZpbmFsX2V4KG1kLCAmKGN0eC0+YnVmW2N0eC0+YnVmX2xlbl0pLCBOVUxMKTsKKwljdHgtPmJ1Zl9sZW4rPSBtZC0+ZGlnZXN0LT5tZF9zaXplOworCWN0eC0+YmxvY2tvdXQ9IDE7CisJY3R4LT5zaWdpbz0gMDsKKwl9CisKK3N0YXRpYyB2b2lkIHNpZ19pbihCSU8qIGIpCisJeworCUJJT19PS19DVFggKmN0eDsKKwlFVlBfTURfQ1RYICptZDsKKwl1bnNpZ25lZCBjaGFyIHRtcFtFVlBfTUFYX01EX1NJWkVdOworCWludCByZXQ9IDA7CisKKwljdHg9Yi0+cHRyOworCW1kPSZjdHgtPm1kOworCisJaWYoKGludCkoY3R4LT5idWZfbGVuLWN0eC0+YnVmX29mZikgPCAyKm1kLT5kaWdlc3QtPm1kX3NpemUpIHJldHVybjsKKworCUVWUF9EaWdlc3RJbml0X2V4KG1kLCBtZC0+ZGlnZXN0LCBOVUxMKTsKKwltZW1jcHkobWQtPm1kX2RhdGEsICYoY3R4LT5idWZbY3R4LT5idWZfb2ZmXSksIG1kLT5kaWdlc3QtPm1kX3NpemUpOworCWxvbmdzd2FwKG1kLT5tZF9kYXRhLCBtZC0+ZGlnZXN0LT5tZF9zaXplKTsKKwljdHgtPmJ1Zl9vZmYrPSBtZC0+ZGlnZXN0LT5tZF9zaXplOworCisJRVZQX0RpZ2VzdFVwZGF0ZShtZCwgV0VMTEtOT1dOLCBzdHJsZW4oV0VMTEtOT1dOKSk7CisJRVZQX0RpZ2VzdEZpbmFsX2V4KG1kLCB0bXAsIE5VTEwpOworCXJldD0gbWVtY21wKCYoY3R4LT5idWZbY3R4LT5idWZfb2ZmXSksIHRtcCwgbWQtPmRpZ2VzdC0+bWRfc2l6ZSkgPT0gMDsKKwljdHgtPmJ1Zl9vZmYrPSBtZC0+ZGlnZXN0LT5tZF9zaXplOworCWlmKHJldCA9PSAxKQorCQl7CisJCWN0eC0+c2lnaW89IDA7CisJCWlmKGN0eC0+YnVmX2xlbiAhPSBjdHgtPmJ1Zl9vZmYpCisJCQl7CisJCQltZW1tb3ZlKGN0eC0+YnVmLCAmKGN0eC0+YnVmW2N0eC0+YnVmX29mZl0pLCBjdHgtPmJ1Zl9sZW4tIGN0eC0+YnVmX29mZik7CisJCQl9CisJCWN0eC0+YnVmX2xlbi09IGN0eC0+YnVmX29mZjsKKwkJY3R4LT5idWZfb2ZmPSAwOworCQl9CisJZWxzZQorCQl7CisJCWN0eC0+Y29udD0gMDsKKwkJfQorCX0KKworc3RhdGljIHZvaWQgYmxvY2tfb3V0KEJJTyogYikKKwl7CisJQklPX09LX0NUWCAqY3R4OworCUVWUF9NRF9DVFggKm1kOworCXVuc2lnbmVkIGxvbmcgdGw7CisKKwljdHg9Yi0+cHRyOworCW1kPSZjdHgtPm1kOworCisJdGw9IGN0eC0+YnVmX2xlbi0gT0tfQkxPQ0tfQkxPQ0s7CisJY3R4LT5idWZbMF09KHVuc2lnbmVkIGNoYXIpKHRsPj4yNCk7CisJY3R4LT5idWZbMV09KHVuc2lnbmVkIGNoYXIpKHRsPj4xNik7CisJY3R4LT5idWZbMl09KHVuc2lnbmVkIGNoYXIpKHRsPj44KTsKKwljdHgtPmJ1ZlszXT0odW5zaWduZWQgY2hhcikodGwpOworCUVWUF9EaWdlc3RVcGRhdGUobWQsICh1bnNpZ25lZCBjaGFyKikgJihjdHgtPmJ1ZltPS19CTE9DS19CTE9DS10pLCB0bCk7CisJRVZQX0RpZ2VzdEZpbmFsX2V4KG1kLCAmKGN0eC0+YnVmW2N0eC0+YnVmX2xlbl0pLCBOVUxMKTsKKwljdHgtPmJ1Zl9sZW4rPSBtZC0+ZGlnZXN0LT5tZF9zaXplOworCWN0eC0+YmxvY2tvdXQ9IDE7CisJfQorCitzdGF0aWMgdm9pZCBibG9ja19pbihCSU8qIGIpCisJeworCUJJT19PS19DVFggKmN0eDsKKwlFVlBfTURfQ1RYICptZDsKKwl1bnNpZ25lZCBsb25nIHRsPSAwOworCXVuc2lnbmVkIGNoYXIgdG1wW0VWUF9NQVhfTURfU0laRV07CisKKwljdHg9Yi0+cHRyOworCW1kPSZjdHgtPm1kOworCisJYXNzZXJ0KHNpemVvZih0bCk+PU9LX0JMT0NLX0JMT0NLKTsJLyogYWx3YXlzIHRydWUgKi8KKwl0bCA9Y3R4LT5idWZbMF07IHRsPDw9ODsKKwl0bHw9Y3R4LT5idWZbMV07IHRsPDw9ODsKKwl0bHw9Y3R4LT5idWZbMl07IHRsPDw9ODsKKwl0bHw9Y3R4LT5idWZbM107CisKKwlpZiAoY3R4LT5idWZfbGVuIDwgdGwrIE9LX0JMT0NLX0JMT0NLKyBtZC0+ZGlnZXN0LT5tZF9zaXplKSByZXR1cm47CisgCisJRVZQX0RpZ2VzdFVwZGF0ZShtZCwgKHVuc2lnbmVkIGNoYXIqKSAmKGN0eC0+YnVmW09LX0JMT0NLX0JMT0NLXSksIHRsKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgobWQsIHRtcCwgTlVMTCk7CisJaWYobWVtY21wKCYoY3R4LT5idWZbdGwrIE9LX0JMT0NLX0JMT0NLXSksIHRtcCwgbWQtPmRpZ2VzdC0+bWRfc2l6ZSkgPT0gMCkKKwkJeworCQkvKiB0aGVyZSBtaWdodCBiZSBwYXJ0cyBmcm9tIG5leHQgYmxvY2sgbHVya2luZyBhcm91bmQgISAqLworCQljdHgtPmJ1Zl9vZmZfc2F2ZT0gdGwrIE9LX0JMT0NLX0JMT0NLKyBtZC0+ZGlnZXN0LT5tZF9zaXplOworCQljdHgtPmJ1Zl9sZW5fc2F2ZT0gY3R4LT5idWZfbGVuOworCQljdHgtPmJ1Zl9vZmY9IE9LX0JMT0NLX0JMT0NLOworCQljdHgtPmJ1Zl9sZW49IHRsKyBPS19CTE9DS19CTE9DSzsKKwkJY3R4LT5ibG9ja291dD0gMTsKKwkJfQorCWVsc2UKKwkJeworCQljdHgtPmNvbnQ9IDA7CisJCX0KKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvY19hbGwuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvY19hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjZjNGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9jX2FsbC5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qIGNyeXB0by9ldnAvY19hbGwuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorCisjaWYgMAorI3VuZGVmIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zCisKK3ZvaWQgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXModm9pZCkKKwl7CisJT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfbm9jb25mKCk7CisJfQorI2VuZGlmCisKK3ZvaWQgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfbm9jb25mKHZvaWQpCisJeworCS8qCisJICogRm9yIHRoZSBtb21lbnQgT1BFTlNTTF9jcHVpZF9zZXR1cCBkb2VzIHNvbWV0aGluZworCSAqIG9ubHkgb24gSUEtMzIsIGJ1dCB3ZSByZXNlcnZlIHRoZSBvcHRpb24gZm9yIGFsbAorCSAqIHBsYXRmb3Jtcy4uLgorCSAqLworCU9QRU5TU0xfY3B1aWRfc2V0dXAoKTsKKwlPcGVuU1NMX2FkZF9hbGxfY2lwaGVycygpOworCU9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjIGlmIGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoSEFWRV9DUllQVE9ERVYpCisJRU5HSU5FX3NldHVwX2JzZF9jcnlwdG9kZXYoKTsKKyMgZW5kaWYKKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvY19hbGxjLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2NfYWxsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjkyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2NfYWxsYy5jCkBAIC0wLDAgKzEsMjI0IEBACisvKiBjcnlwdG8vZXZwL2NfYWxsYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorCit2b2lkIE9wZW5TU0xfYWRkX2FsbF9jaXBoZXJzKHZvaWQpCisJeworCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisJRVZQX2FkZF9jaXBoZXIoRVZQX2Rlc19jZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Rlc19jZmIxKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9kZXNfY2ZiOCgpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfZGVzX2VkZV9jZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Rlc19lZGUzX2NmYigpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfZGVzX2VkZTNfY2ZiMSgpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfZGVzX2VkZTNfY2ZiOCgpKTsKKworCUVWUF9hZGRfY2lwaGVyKEVWUF9kZXNfb2ZiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9kZXNfZWRlX29mYigpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfZGVzX2VkZTNfb2ZiKCkpOworCisJRVZQX2FkZF9jaXBoZXIoRVZQX2Rlc3hfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Rlc3hfY2JjLCJERVNYIik7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fZGVzeF9jYmMsImRlc3giKTsKKworCUVWUF9hZGRfY2lwaGVyKEVWUF9kZXNfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Rlc19jYmMsIkRFUyIpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Rlc19jYmMsImRlcyIpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9kZXNfZWRlX2NiYygpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfZGVzX2VkZTNfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Rlc19lZGUzX2NiYywiREVTMyIpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Rlc19lZGUzX2NiYywiZGVzMyIpOworCisJRVZQX2FkZF9jaXBoZXIoRVZQX2Rlc19lY2IoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Rlc19lZGUoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Rlc19lZGUzKCkpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKKwlFVlBfYWRkX2NpcGhlcihFVlBfcmM0KCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9yYzRfNDAoKSk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKwlFVlBfYWRkX2NpcGhlcihFVlBfaWRlYV9lY2IoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2lkZWFfY2ZiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9pZGVhX29mYigpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfaWRlYV9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05faWRlYV9jYmMsIklERUEiKTsKKwlFVlBfYWRkX2NpcGhlcl9hbGlhcyhTTl9pZGVhX2NiYywiaWRlYSIpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisJRVZQX2FkZF9jaXBoZXIoRVZQX3NlZWRfZWNiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9zZWVkX2NmYigpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfc2VlZF9vZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3NlZWRfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX3NlZWRfY2JjLCJTRUVEIik7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fc2VlZF9jYmMsInNlZWQiKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkMyCisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjMl9lY2IoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjMl9jZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjMl9vZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjMl9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjMl80MF9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjMl82NF9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fcmMyX2NiYywiUkMyIik7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fcmMyX2NiYywicmMyIik7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0JGCisJRVZQX2FkZF9jaXBoZXIoRVZQX2JmX2VjYigpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfYmZfY2ZiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9iZl9vZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2JmX2NiYygpKTsKKwlFVlBfYWRkX2NpcGhlcl9hbGlhcyhTTl9iZl9jYmMsIkJGIik7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fYmZfY2JjLCJiZiIpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2JmX2NiYywiYmxvd2Zpc2giKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FTVAorCUVWUF9hZGRfY2lwaGVyKEVWUF9jYXN0NV9lY2IoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Nhc3Q1X2NmYigpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfY2FzdDVfb2ZiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYXN0NV9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fY2FzdDVfY2JjLCJDQVNUIik7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fY2FzdDVfY2JjLCJjYXN0Iik7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fY2FzdDVfY2JjLCJDQVNULWNiYyIpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Nhc3Q1X2NiYywiY2FzdC1jYmMiKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM1CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjNV8zMl8xMl8xNl9lY2IoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjNV8zMl8xMl8xNl9jZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjNV8zMl8xMl8xNl9vZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjNV8zMl8xMl8xNl9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fcmM1X2NiYywicmM1Iik7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fcmM1X2NiYywiUkM1Iik7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0FFUworCUVWUF9hZGRfY2lwaGVyKEVWUF9hZXNfMTI4X2VjYigpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfYWVzXzEyOF9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Flc18xMjhfY2ZiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9hZXNfMTI4X2NmYjEoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Flc18xMjhfY2ZiOCgpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfYWVzXzEyOF9vZmIoKSk7CisjaWYgMAorCUVWUF9hZGRfY2lwaGVyKEVWUF9hZXNfMTI4X2N0cigpKTsKKyNlbmRpZgorCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Flc18xMjhfY2JjLCJBRVMxMjgiKTsKKwlFVlBfYWRkX2NpcGhlcl9hbGlhcyhTTl9hZXNfMTI4X2NiYywiYWVzMTI4Iik7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Flc18xOTJfZWNiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9hZXNfMTkyX2NiYygpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfYWVzXzE5Ml9jZmIoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Flc18xOTJfY2ZiMSgpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfYWVzXzE5Ml9jZmI4KCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9hZXNfMTkyX29mYigpKTsKKyNpZiAwCisJRVZQX2FkZF9jaXBoZXIoRVZQX2Flc18xOTJfY3RyKCkpOworI2VuZGlmCisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fYWVzXzE5Ml9jYmMsIkFFUzE5MiIpOworCUVWUF9hZGRfY2lwaGVyX2FsaWFzKFNOX2Flc18xOTJfY2JjLCJhZXMxOTIiKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfYWVzXzI1Nl9lY2IoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Flc18yNTZfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9hZXNfMjU2X2NmYigpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfYWVzXzI1Nl9jZmIxKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9hZXNfMjU2X2NmYjgoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Flc18yNTZfb2ZiKCkpOworI2lmIDAKKwlFVlBfYWRkX2NpcGhlcihFVlBfYWVzXzI1Nl9jdHIoKSk7CisjZW5kaWYKKwlFVlBfYWRkX2NpcGhlcl9hbGlhcyhTTl9hZXNfMjU2X2NiYywiQUVTMjU2Iik7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fYWVzXzI1Nl9jYmMsImFlczI1NiIpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8xMjhfZWNiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8xMjhfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8xMjhfY2ZiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8xMjhfY2ZiMSgpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfY2FtZWxsaWFfMTI4X2NmYjgoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2NhbWVsbGlhXzEyOF9vZmIoKSk7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fY2FtZWxsaWFfMTI4X2NiYywiQ0FNRUxMSUExMjgiKTsKKwlFVlBfYWRkX2NpcGhlcl9hbGlhcyhTTl9jYW1lbGxpYV8xMjhfY2JjLCJjYW1lbGxpYTEyOCIpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8xOTJfZWNiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8xOTJfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8xOTJfY2ZiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8xOTJfY2ZiMSgpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfY2FtZWxsaWFfMTkyX2NmYjgoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2NhbWVsbGlhXzE5Ml9vZmIoKSk7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fY2FtZWxsaWFfMTkyX2NiYywiQ0FNRUxMSUExOTIiKTsKKwlFVlBfYWRkX2NpcGhlcl9hbGlhcyhTTl9jYW1lbGxpYV8xOTJfY2JjLCJjYW1lbGxpYTE5MiIpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8yNTZfZWNiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8yNTZfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8yNTZfY2ZiKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9jYW1lbGxpYV8yNTZfY2ZiMSgpKTsKKwlFVlBfYWRkX2NpcGhlcihFVlBfY2FtZWxsaWFfMjU2X2NmYjgoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2NhbWVsbGlhXzI1Nl9vZmIoKSk7CisJRVZQX2FkZF9jaXBoZXJfYWxpYXMoU05fY2FtZWxsaWFfMjU2X2NiYywiQ0FNRUxMSUEyNTYiKTsKKwlFVlBfYWRkX2NpcGhlcl9hbGlhcyhTTl9jYW1lbGxpYV8yNTZfY2JjLCJjYW1lbGxpYTI1NiIpOworI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9jX2FsbGQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvY19hbGxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExZTFmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvY19hbGxkLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIGNyeXB0by9ldnAvY19hbGxkLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczEyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKK3ZvaWQgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHModm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ0CisJRVZQX2FkZF9kaWdlc3QoRVZQX21kNCgpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01ENQorCUVWUF9hZGRfZGlnZXN0KEVWUF9tZDUoKSk7CisJRVZQX2FkZF9kaWdlc3RfYWxpYXMoU05fbWQ1LCJzc2wyLW1kNSIpOworCUVWUF9hZGRfZGlnZXN0X2FsaWFzKFNOX21kNSwic3NsMy1tZDUiKTsKKyNlbmRpZgorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0hBKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQTApCisJRVZQX2FkZF9kaWdlc3QoRVZQX3NoYSgpKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwlFVlBfYWRkX2RpZ2VzdChFVlBfZHNzKCkpOworI2VuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEExKQorCUVWUF9hZGRfZGlnZXN0KEVWUF9zaGExKCkpOworCUVWUF9hZGRfZGlnZXN0X2FsaWFzKFNOX3NoYTEsInNzbDMtc2hhMSIpOworCUVWUF9hZGRfZGlnZXN0X2FsaWFzKFNOX3NoYTFXaXRoUlNBRW5jcnlwdGlvbixTTl9zaGExV2l0aFJTQSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJRVZQX2FkZF9kaWdlc3QoRVZQX2RzczEoKSk7CisJRVZQX2FkZF9kaWdlc3RfYWxpYXMoU05fZHNhV2l0aFNIQTEsU05fZHNhV2l0aFNIQTFfMik7CisJRVZQX2FkZF9kaWdlc3RfYWxpYXMoU05fZHNhV2l0aFNIQTEsIkRTUzEiKTsKKwlFVlBfYWRkX2RpZ2VzdF9hbGlhcyhTTl9kc2FXaXRoU0hBMSwiZHNzMSIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwlFVlBfYWRkX2RpZ2VzdChFVlBfZWNkc2EoKSk7CisjZW5kaWYKKyNlbmRpZgorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fTURDMikgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19ERVMpCisJRVZQX2FkZF9kaWdlc3QoRVZQX21kYzIoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SSVBFTUQKKwlFVlBfYWRkX2RpZ2VzdChFVlBfcmlwZW1kMTYwKCkpOworCUVWUF9hZGRfZGlnZXN0X2FsaWFzKFNOX3JpcGVtZDE2MCwicmlwZW1kIik7CisJRVZQX2FkZF9kaWdlc3RfYWxpYXMoU05fcmlwZW1kMTYwLCJybWQxNjAiKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTI1NgorCUVWUF9hZGRfZGlnZXN0KEVWUF9zaGEyMjQoKSk7CisJRVZQX2FkZF9kaWdlc3QoRVZQX3NoYTI1NigpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTUxMgorCUVWUF9hZGRfZGlnZXN0KEVWUF9zaGEzODQoKSk7CisJRVZQX2FkZF9kaWdlc3QoRVZQX3NoYTUxMigpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1dISVJMUE9PTAorCUVWUF9hZGRfZGlnZXN0KEVWUF93aGlybHBvb2woKSk7CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2RpZ2VzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9kaWdlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJiYTJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9kaWdlc3QuYwpAQCAtMCwwICsxLDM3NyBAQAorLyogY3J5cHRvL2V2cC9kaWdlc3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisKK3ZvaWQgRVZQX01EX0NUWF9pbml0KEVWUF9NRF9DVFggKmN0eCkKKwl7CisJbWVtc2V0KGN0eCwnXDAnLHNpemVvZiAqY3R4KTsKKwl9CisKK0VWUF9NRF9DVFggKkVWUF9NRF9DVFhfY3JlYXRlKHZvaWQpCisJeworCUVWUF9NRF9DVFggKmN0eD1PUEVOU1NMX21hbGxvYyhzaXplb2YgKmN0eCk7CisKKwlpZiAoY3R4KQorCQlFVlBfTURfQ1RYX2luaXQoY3R4KTsKKworCXJldHVybiBjdHg7CisJfQorCitpbnQgRVZQX0RpZ2VzdEluaXQoRVZQX01EX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKnR5cGUpCisJeworCUVWUF9NRF9DVFhfaW5pdChjdHgpOworCXJldHVybiBFVlBfRGlnZXN0SW5pdF9leChjdHgsIHR5cGUsIE5VTEwpOworCX0KKworaW50IEVWUF9EaWdlc3RJbml0X2V4KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlLCBFTkdJTkUgKmltcGwpCisJeworCUVWUF9NRF9DVFhfY2xlYXJfZmxhZ3MoY3R4LEVWUF9NRF9DVFhfRkxBR19DTEVBTkVEKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkvKiBXaGV0aGVyIGl0J3MgbmljZSBvciBub3QsICJJbml0cyIgY2FuIGJlIHVzZWQgb24gIkZpbmFsIidkIGNvbnRleHRzCisJICogc28gdGhpcyBjb250ZXh0IG1heSBhbHJlYWR5IGhhdmUgYW4gRU5HSU5FISBUcnkgdG8gYXZvaWQgcmVsZWFzaW5nCisJICogdGhlIHByZXZpb3VzIGhhbmRsZSwgcmUtcXVlcnlpbmcgZm9yIGFuIEVOR0lORSwgYW5kIGhhdmluZyBhCisJICogcmVpbml0aWFsaXNhdGlvbiwgd2hlbiBpdCBtYXkgYWxsIGJlIHVuZWNlc3NhcnkuICovCisJaWYgKGN0eC0+ZW5naW5lICYmIGN0eC0+ZGlnZXN0ICYmICghdHlwZSB8fAorCQkJKHR5cGUgJiYgKHR5cGUtPnR5cGUgPT0gY3R4LT5kaWdlc3QtPnR5cGUpKSkpCisJCWdvdG8gc2tpcF90b19pbml0OworCWlmICh0eXBlKQorCQl7CisJCS8qIEVuc3VyZSBhbiBFTkdJTkUgbGVmdCBseWluZyBhcm91bmQgZnJvbSBsYXN0IHRpbWUgaXMgY2xlYXJlZAorCQkgKiAodGhlIHByZXZpb3VzIGNoZWNrIGF0dGVtcHRlZCB0byBhdm9pZCB0aGlzIGlmIHRoZSBzYW1lCisJCSAqIEVOR0lORSBhbmQgRVZQX01EIGNvdWxkIGJlIHVzZWQpLiAqLworCQlpZihjdHgtPmVuZ2luZSkKKwkJCUVOR0lORV9maW5pc2goY3R4LT5lbmdpbmUpOworCQlpZihpbXBsKQorCQkJeworCQkJaWYgKCFFTkdJTkVfaW5pdChpbXBsKSkKKwkJCQl7CisJCQkJRVZQZXJyKEVWUF9GX0VWUF9ESUdFU1RJTklUX0VYLEVWUF9SX0lOSVRJQUxJWkFUSU9OX0VSUk9SKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCS8qIEFzayBpZiBhbiBFTkdJTkUgaXMgcmVzZXJ2ZWQgZm9yIHRoaXMgam9iICovCisJCQlpbXBsID0gRU5HSU5FX2dldF9kaWdlc3RfZW5naW5lKHR5cGUtPnR5cGUpOworCQlpZihpbXBsKQorCQkJeworCQkJLyogVGhlcmUncyBhbiBFTkdJTkUgZm9yIHRoaXMgam9iIC4uLiAoYXBwYXJlbnRseSkgKi8KKwkJCWNvbnN0IEVWUF9NRCAqZCA9IEVOR0lORV9nZXRfZGlnZXN0KGltcGwsIHR5cGUtPnR5cGUpOworCQkJaWYoIWQpCisJCQkJeworCQkJCS8qIFNhbWUgY29tbWVudCBmcm9tIGV2cF9lbmMuYyAqLworCQkJCUVWUGVycihFVlBfRl9FVlBfRElHRVNUSU5JVF9FWCxFVlBfUl9JTklUSUFMSVpBVElPTl9FUlJPUik7CisJCQkJRU5HSU5FX2ZpbmlzaChpbXBsKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkvKiBXZSdsbCB1c2UgdGhlIEVOR0lORSdzIHByaXZhdGUgZGlnZXN0IGRlZmluaXRpb24gKi8KKwkJCXR5cGUgPSBkOworCQkJLyogU3RvcmUgdGhlIEVOR0lORSBmdW5jdGlvbmFsIHJlZmVyZW5jZSBzbyB3ZSBrbm93CisJCQkgKiAndHlwZScgY2FtZSBmcm9tIGFuIEVOR0lORSBhbmQgd2UgbmVlZCB0byByZWxlYXNlCisJCQkgKiBpdCB3aGVuIGRvbmUuICovCisJCQljdHgtPmVuZ2luZSA9IGltcGw7CisJCQl9CisJCWVsc2UKKwkJCWN0eC0+ZW5naW5lID0gTlVMTDsKKwkJfQorCWVsc2UKKwlpZighY3R4LT5kaWdlc3QpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9ESUdFU1RJTklUX0VYLEVWUF9SX05PX0RJR0VTVF9TRVQpOworCQlyZXR1cm4gMDsKKwkJfQorI2VuZGlmCisJaWYgKGN0eC0+ZGlnZXN0ICE9IHR5cGUpCisJCXsKKwkJaWYgKGN0eC0+ZGlnZXN0ICYmIGN0eC0+ZGlnZXN0LT5jdHhfc2l6ZSkKKwkJCU9QRU5TU0xfZnJlZShjdHgtPm1kX2RhdGEpOworCQljdHgtPmRpZ2VzdD10eXBlOworCQlpZiAoIShjdHgtPmZsYWdzICYgRVZQX01EX0NUWF9GTEFHX05PX0lOSVQpICYmIHR5cGUtPmN0eF9zaXplKQorCQkJeworCQkJY3R4LT51cGRhdGUgPSB0eXBlLT51cGRhdGU7CisJCQljdHgtPm1kX2RhdGE9T1BFTlNTTF9tYWxsb2ModHlwZS0+Y3R4X3NpemUpOworCQkJaWYgKGN0eC0+bWRfZGF0YSA9PSBOVUxMKQorCQkJCXsKKwkJCQlFVlBlcnIoRVZQX0ZfRVZQX0RJR0VTVElOSVRfRVgsCisJCQkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorc2tpcF90b19pbml0OgorI2VuZGlmCisJaWYgKGN0eC0+cGN0eCkKKwkJeworCQlpbnQgcjsKKwkJciA9IEVWUF9QS0VZX0NUWF9jdHJsKGN0eC0+cGN0eCwgLTEsIEVWUF9QS0VZX09QX1RZUEVfU0lHLAorCQkJCQlFVlBfUEtFWV9DVFJMX0RJR0VTVElOSVQsIDAsIGN0eCk7CisJCWlmIChyIDw9IDAgJiYgKHIgIT0gLTIpKQorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoY3R4LT5mbGFncyAmIEVWUF9NRF9DVFhfRkxBR19OT19JTklUKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gY3R4LT5kaWdlc3QtPmluaXQoY3R4KTsKKwl9CisKK2ludCBFVlBfRGlnZXN0VXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQorCXsKKwlyZXR1cm4gY3R4LT51cGRhdGUoY3R4LGRhdGEsY291bnQpOworCX0KKworLyogVGhlIGNhbGxlciBjYW4gYXNzdW1lIHRoYXQgdGhpcyByZW1vdmVzIGFueSBzZWNyZXQgZGF0YSBmcm9tIHRoZSBjb250ZXh0ICovCitpbnQgRVZQX0RpZ2VzdEZpbmFsKEVWUF9NRF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqbWQsIHVuc2lnbmVkIGludCAqc2l6ZSkKKwl7CisJaW50IHJldDsKKwlyZXQgPSBFVlBfRGlnZXN0RmluYWxfZXgoY3R4LCBtZCwgc2l6ZSk7CisJRVZQX01EX0NUWF9jbGVhbnVwKGN0eCk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIFRoZSBjYWxsZXIgY2FuIGFzc3VtZSB0aGF0IHRoaXMgcmVtb3ZlcyBhbnkgc2VjcmV0IGRhdGEgZnJvbSB0aGUgY29udGV4dCAqLworaW50IEVWUF9EaWdlc3RGaW5hbF9leChFVlBfTURfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKnNpemUpCisJeworCWludCByZXQ7CisKKwlPUEVOU1NMX2Fzc2VydChjdHgtPmRpZ2VzdC0+bWRfc2l6ZSA8PSBFVlBfTUFYX01EX1NJWkUpOworCXJldD1jdHgtPmRpZ2VzdC0+ZmluYWwoY3R4LG1kKTsKKwlpZiAoc2l6ZSAhPSBOVUxMKQorCQkqc2l6ZT1jdHgtPmRpZ2VzdC0+bWRfc2l6ZTsKKwlpZiAoY3R4LT5kaWdlc3QtPmNsZWFudXApCisJCXsKKwkJY3R4LT5kaWdlc3QtPmNsZWFudXAoY3R4KTsKKwkJRVZQX01EX0NUWF9zZXRfZmxhZ3MoY3R4LEVWUF9NRF9DVFhfRkxBR19DTEVBTkVEKTsKKwkJfQorCW1lbXNldChjdHgtPm1kX2RhdGEsMCxjdHgtPmRpZ2VzdC0+Y3R4X3NpemUpOworCXJldHVybiByZXQ7CisJfQorCitpbnQgRVZQX01EX0NUWF9jb3B5KEVWUF9NRF9DVFggKm91dCwgY29uc3QgRVZQX01EX0NUWCAqaW4pCisJeworCUVWUF9NRF9DVFhfaW5pdChvdXQpOworCXJldHVybiBFVlBfTURfQ1RYX2NvcHlfZXgob3V0LCBpbik7CisJfQorCitpbnQgRVZQX01EX0NUWF9jb3B5X2V4KEVWUF9NRF9DVFggKm91dCwgY29uc3QgRVZQX01EX0NUWCAqaW4pCisJeworCXVuc2lnbmVkIGNoYXIgKnRtcF9idWY7CisJaWYgKChpbiA9PSBOVUxMKSB8fCAoaW4tPmRpZ2VzdCA9PSBOVUxMKSkKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX01EX0NUWF9DT1BZX0VYLEVWUF9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCk7CisJCXJldHVybiAwOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJLyogTWFrZSBzdXJlIGl0J3Mgc2FmZSB0byBjb3B5IGEgZGlnZXN0IGNvbnRleHQgdXNpbmcgYW4gRU5HSU5FICovCisJaWYgKGluLT5lbmdpbmUgJiYgIUVOR0lORV9pbml0KGluLT5lbmdpbmUpKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfTURfQ1RYX0NPUFlfRVgsRVJSX1JfRU5HSU5FX0xJQik7CisJCXJldHVybiAwOworCQl9CisjZW5kaWYKKworCWlmIChvdXQtPmRpZ2VzdCA9PSBpbi0+ZGlnZXN0KQorCQl7CisJCXRtcF9idWYgPSBvdXQtPm1kX2RhdGE7CisJICAgIAlFVlBfTURfQ1RYX3NldF9mbGFncyhvdXQsRVZQX01EX0NUWF9GTEFHX1JFVVNFKTsKKwkJfQorCWVsc2UgdG1wX2J1ZiA9IE5VTEw7CisJRVZQX01EX0NUWF9jbGVhbnVwKG91dCk7CisJbWVtY3B5KG91dCxpbixzaXplb2YgKm91dCk7CisKKwlpZiAoaW4tPm1kX2RhdGEgJiYgb3V0LT5kaWdlc3QtPmN0eF9zaXplKQorCQl7CisJCWlmICh0bXBfYnVmKQorCQkJb3V0LT5tZF9kYXRhID0gdG1wX2J1ZjsKKwkJZWxzZQorCQkJeworCQkJb3V0LT5tZF9kYXRhPU9QRU5TU0xfbWFsbG9jKG91dC0+ZGlnZXN0LT5jdHhfc2l6ZSk7CisJCQlpZiAoIW91dC0+bWRfZGF0YSkKKwkJCQl7CisJCQkJRVZQZXJyKEVWUF9GX0VWUF9NRF9DVFhfQ09QWV9FWCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQltZW1jcHkob3V0LT5tZF9kYXRhLGluLT5tZF9kYXRhLG91dC0+ZGlnZXN0LT5jdHhfc2l6ZSk7CisJCX0KKworCW91dC0+dXBkYXRlID0gaW4tPnVwZGF0ZTsKKworCWlmIChpbi0+cGN0eCkKKwkJeworCQlvdXQtPnBjdHggPSBFVlBfUEtFWV9DVFhfZHVwKGluLT5wY3R4KTsKKwkJaWYgKCFvdXQtPnBjdHgpCisJCQl7CisJCQlFVlBfTURfQ1RYX2NsZWFudXAob3V0KTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwlpZiAob3V0LT5kaWdlc3QtPmNvcHkpCisJCXJldHVybiBvdXQtPmRpZ2VzdC0+Y29weShvdXQsaW4pOworCQorCXJldHVybiAxOworCX0KKworaW50IEVWUF9EaWdlc3QoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50LAorCQl1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpzaXplLCBjb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqaW1wbCkKKwl7CisJRVZQX01EX0NUWCBjdHg7CisJaW50IHJldDsKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKwlFVlBfTURfQ1RYX3NldF9mbGFncygmY3R4LEVWUF9NRF9DVFhfRkxBR19PTkVTSE9UKTsKKwlyZXQ9RVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgdHlwZSwgaW1wbCkKKwkgICYmIEVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgZGF0YSwgY291bnQpCisJICAmJiBFVlBfRGlnZXN0RmluYWxfZXgoJmN0eCwgbWQsIHNpemUpOworCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKworCXJldHVybiByZXQ7CisJfQorCit2b2lkIEVWUF9NRF9DVFhfZGVzdHJveShFVlBfTURfQ1RYICpjdHgpCisJeworCUVWUF9NRF9DVFhfY2xlYW51cChjdHgpOworCU9QRU5TU0xfZnJlZShjdHgpOworCX0KKworLyogVGhpcyBjYWxsIGZyZWVzIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQgKi8KK2ludCBFVlBfTURfQ1RYX2NsZWFudXAoRVZQX01EX0NUWCAqY3R4KQorCXsKKwkvKiBEb24ndCBhc3N1bWUgY3R4LT5tZF9kYXRhIHdhcyBjbGVhbmVkIGluIEVWUF9EaWdlc3RfRmluYWwsCisJICogYmVjYXVzZSBzb21ldGltZXMgb25seSBjb3BpZXMgb2YgdGhlIGNvbnRleHQgYXJlIGV2ZXIgZmluYWxpc2VkLgorCSAqLworCWlmIChjdHgtPmRpZ2VzdCAmJiBjdHgtPmRpZ2VzdC0+Y2xlYW51cAorCSAgICAmJiAhRVZQX01EX0NUWF90ZXN0X2ZsYWdzKGN0eCxFVlBfTURfQ1RYX0ZMQUdfQ0xFQU5FRCkpCisJCWN0eC0+ZGlnZXN0LT5jbGVhbnVwKGN0eCk7CisJaWYgKGN0eC0+ZGlnZXN0ICYmIGN0eC0+ZGlnZXN0LT5jdHhfc2l6ZSAmJiBjdHgtPm1kX2RhdGEKKwkgICAgJiYgIUVWUF9NRF9DVFhfdGVzdF9mbGFncyhjdHgsIEVWUF9NRF9DVFhfRkxBR19SRVVTRSkpCisJCXsKKwkJT1BFTlNTTF9jbGVhbnNlKGN0eC0+bWRfZGF0YSxjdHgtPmRpZ2VzdC0+Y3R4X3NpemUpOworCQlPUEVOU1NMX2ZyZWUoY3R4LT5tZF9kYXRhKTsKKwkJfQorCWlmIChjdHgtPnBjdHgpCisJCUVWUF9QS0VZX0NUWF9mcmVlKGN0eC0+cGN0eCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYoY3R4LT5lbmdpbmUpCisJCS8qIFRoZSBFVlBfTUQgd2UgdXNlZCBiZWxvbmdzIHRvIGFuIEVOR0lORSwgcmVsZWFzZSB0aGUKKwkJICogZnVuY3Rpb25hbCByZWZlcmVuY2Ugd2UgaGVsZCBmb3IgdGhpcyByZWFzb24uICovCisJCUVOR0lORV9maW5pc2goY3R4LT5lbmdpbmUpOworI2VuZGlmCisJbWVtc2V0KGN0eCwnXDAnLHNpemVvZiAqY3R4KTsKKworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9hZXMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDZjMGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX2Flcy5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0FFUworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgImV2cF9sb2NsLmgiCisKK3N0YXRpYyBpbnQgYWVzX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpOworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlBRVNfS0VZIGtzOworCX0gRVZQX0FFU19LRVk7CisKKyNkZWZpbmUgZGF0YShjdHgpCUVWUF9DX0RBVEEoRVZQX0FFU19LRVksY3R4KQorCitJTVBMRU1FTlRfQkxPQ0tfQ0lQSEVSKGFlc18xMjgsIGtzLCBBRVMsIEVWUF9BRVNfS0VZLAorCQkgICAgICAgTklEX2Flc18xMjgsIDE2LCAxNiwgMTYsIDEyOCwKKwkJICAgICAgIDAsIGFlc19pbml0X2tleSwgTlVMTCwgCisJCSAgICAgICBFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCQkgICAgICAgRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwkJICAgICAgIE5VTEwpCitJTVBMRU1FTlRfQkxPQ0tfQ0lQSEVSKGFlc18xOTIsIGtzLCBBRVMsIEVWUF9BRVNfS0VZLAorCQkgICAgICAgTklEX2Flc18xOTIsIDE2LCAyNCwgMTYsIDEyOCwKKwkJICAgICAgIDAsIGFlc19pbml0X2tleSwgTlVMTCwgCisJCSAgICAgICBFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCQkgICAgICAgRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwkJICAgICAgIE5VTEwpCitJTVBMRU1FTlRfQkxPQ0tfQ0lQSEVSKGFlc18yNTYsIGtzLCBBRVMsIEVWUF9BRVNfS0VZLAorCQkgICAgICAgTklEX2Flc18yNTYsIDE2LCAzMiwgMTYsIDEyOCwKKwkJICAgICAgIDAsIGFlc19pbml0X2tleSwgTlVMTCwgCisJCSAgICAgICBFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCQkgICAgICAgRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwkJICAgICAgIE5VTEwpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FFU19DRkJSKGtzaXplLGNiaXRzKQlJTVBMRU1FTlRfQ0ZCUihhZXMsQUVTLEVWUF9BRVNfS0VZLGtzLGtzaXplLGNiaXRzLDE2KQorCitJTVBMRU1FTlRfQUVTX0NGQlIoMTI4LDEpCitJTVBMRU1FTlRfQUVTX0NGQlIoMTkyLDEpCitJTVBMRU1FTlRfQUVTX0NGQlIoMjU2LDEpCisKK0lNUExFTUVOVF9BRVNfQ0ZCUigxMjgsOCkKK0lNUExFTUVOVF9BRVNfQ0ZCUigxOTIsOCkKK0lNUExFTUVOVF9BRVNfQ0ZCUigyNTYsOCkKKworc3RhdGljIGludCBhZXNfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKKwl7CisJaW50IHJldDsKKworCWlmICgoY3R4LT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfTU9ERSkgPT0gRVZQX0NJUEhfQ0ZCX01PREUKKwkgICAgfHwgKGN0eC0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX01PREUpID09IEVWUF9DSVBIX09GQl9NT0RFCisJICAgIHx8IGVuYykgCisJCXJldD1BRVNfc2V0X2VuY3J5cHRfa2V5KGtleSwgY3R4LT5rZXlfbGVuICogOCwgY3R4LT5jaXBoZXJfZGF0YSk7CisJZWxzZQorCQlyZXQ9QUVTX3NldF9kZWNyeXB0X2tleShrZXksIGN0eC0+a2V5X2xlbiAqIDgsIGN0eC0+Y2lwaGVyX2RhdGEpOworCisJaWYocmV0IDwgMCkKKwkJeworCQlFVlBlcnIoRVZQX0ZfQUVTX0lOSVRfS0VZLEVWUF9SX0FFU19LRVlfU0VUVVBfRkFJTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfYmYuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9iZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMjI0ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfYmYuYwpAQCAtMCwwICsxLDg4IEBACisvKiBjcnlwdG8vZXZwL2VfYmYuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2lmbmRlZiBPUEVOU1NMX05PX0JGCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlICJldnBfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmxvd2Zpc2guaD4KKworc3RhdGljIGludCBiZl9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYyk7CisKK3R5cGVkZWYgc3RydWN0CisJeworCUJGX0tFWSBrczsKKwl9IEVWUF9CRl9LRVk7CisKKyNkZWZpbmUgZGF0YShjdHgpCUVWUF9DX0RBVEEoRVZQX0JGX0tFWSxjdHgpCisKK0lNUExFTUVOVF9CTE9DS19DSVBIRVIoYmYsIGtzLCBCRiwgRVZQX0JGX0tFWSwgTklEX2JmLCA4LCAxNiwgOCwgNjQsCisJCQlFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEgsIGJmX2luaXRfa2V5LCBOVUxMLCAKKwkJCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsIEVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsIE5VTEwpCisJCitzdGF0aWMgaW50IGJmX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKQorCXsKKwlCRl9zZXRfa2V5KCZkYXRhKGN0eCktPmtzLEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY3R4KSxrZXkpOworCXJldHVybiAxOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfY2FtZWxsaWEuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9jYW1lbGxpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjQwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfY2FtZWxsaWEuYwpAQCAtMCwwICsxLDEzMSBAQAorLyogY3J5cHRvL2V2cC9lX2NhbWVsbGlhLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19DQU1FTExJQQorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NhbWVsbGlhLmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKworc3RhdGljIGludCBjYW1lbGxpYV9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpOworCisvKiBDYW1lbGxpYSBzdWJrZXkgU3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdAorCXsKKwlDQU1FTExJQV9LRVkga3M7CisJfSBFVlBfQ0FNRUxMSUFfS0VZOworCisvKiBBdHRyaWJ1dGUgb3BlcmF0aW9uIGZvciBDYW1lbGxpYSAqLworI2RlZmluZSBkYXRhKGN0eCkJRVZQX0NfREFUQShFVlBfQ0FNRUxMSUFfS0VZLGN0eCkKKworSU1QTEVNRU5UX0JMT0NLX0NJUEhFUihjYW1lbGxpYV8xMjgsIGtzLCBDYW1lbGxpYSwgRVZQX0NBTUVMTElBX0tFWSwKKwlOSURfY2FtZWxsaWFfMTI4LCAxNiwgMTYsIDE2LCAxMjgsCisJMCwgY2FtZWxsaWFfaW5pdF9rZXksIE5VTEwsIAorCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsCisJRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwlOVUxMKQorSU1QTEVNRU5UX0JMT0NLX0NJUEhFUihjYW1lbGxpYV8xOTIsIGtzLCBDYW1lbGxpYSwgRVZQX0NBTUVMTElBX0tFWSwKKwlOSURfY2FtZWxsaWFfMTkyLCAxNiwgMjQsIDE2LCAxMjgsCisJMCwgY2FtZWxsaWFfaW5pdF9rZXksIE5VTEwsIAorCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsCisJRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwlOVUxMKQorSU1QTEVNRU5UX0JMT0NLX0NJUEhFUihjYW1lbGxpYV8yNTYsIGtzLCBDYW1lbGxpYSwgRVZQX0NBTUVMTElBX0tFWSwKKwlOSURfY2FtZWxsaWFfMjU2LCAxNiwgMzIsIDE2LCAxMjgsCisJMCwgY2FtZWxsaWFfaW5pdF9rZXksIE5VTEwsIAorCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsCisJRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwlOVUxMKQorCisjZGVmaW5lIElNUExFTUVOVF9DQU1FTExJQV9DRkJSKGtzaXplLGNiaXRzKQlJTVBMRU1FTlRfQ0ZCUihjYW1lbGxpYSxDYW1lbGxpYSxFVlBfQ0FNRUxMSUFfS0VZLGtzLGtzaXplLGNiaXRzLDE2KQorCitJTVBMRU1FTlRfQ0FNRUxMSUFfQ0ZCUigxMjgsMSkKK0lNUExFTUVOVF9DQU1FTExJQV9DRkJSKDE5MiwxKQorSU1QTEVNRU5UX0NBTUVMTElBX0NGQlIoMjU2LDEpCisKK0lNUExFTUVOVF9DQU1FTExJQV9DRkJSKDEyOCw4KQorSU1QTEVNRU5UX0NBTUVMTElBX0NGQlIoMTkyLDgpCitJTVBMRU1FTlRfQ0FNRUxMSUFfQ0ZCUigyNTYsOCkKKworCisKKy8qIFRoZSBzdWJrZXkgZm9yIENhbWVsbGlhIGlzIGdlbmVyYXRlZC4gKi8gCitzdGF0aWMgaW50IGNhbWVsbGlhX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwljb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKKwl7CisJaW50IHJldDsKKworCXJldD1DYW1lbGxpYV9zZXRfa2V5KGtleSwgY3R4LT5rZXlfbGVuICogOCwgY3R4LT5jaXBoZXJfZGF0YSk7CisKKwlpZihyZXQgPCAwKQorCQl7CisJCUVWUGVycihFVlBfRl9DQU1FTExJQV9JTklUX0tFWSxFVlBfUl9DQU1FTExJQV9LRVlfU0VUVVBfRkFJTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworI2Vsc2UKKworIyBpZmRlZiBQRURBTlRJQworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyMgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfY2FzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX2Nhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdiY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX2Nhc3QuYwpAQCAtMCwwICsxLDkwIEBACisvKiBjcnlwdG8vZXZwL2VfY2FzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19DQVNUCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlICJldnBfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY2FzdC5oPgorCitzdGF0aWMgaW50IGNhc3RfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LGludCBlbmMpOworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlDQVNUX0tFWSBrczsKKwl9IEVWUF9DQVNUX0tFWTsKKworI2RlZmluZSBkYXRhKGN0eCkJRVZQX0NfREFUQShFVlBfQ0FTVF9LRVksY3R4KQorCitJTVBMRU1FTlRfQkxPQ0tfQ0lQSEVSKGNhc3Q1LCBrcywgQ0FTVCwgRVZQX0NBU1RfS0VZLCAKKwkJCU5JRF9jYXN0NSwgOCwgQ0FTVF9LRVlfTEVOR1RILCA4LCA2NCwKKwkJCUVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCwgY2FzdF9pbml0X2tleSwgTlVMTCwKKwkJCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsIEVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsIE5VTEwpCisJCQkKK3N0YXRpYyBpbnQgY2FzdF9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCisJeworCUNBU1Rfc2V0X2tleSgmZGF0YShjdHgpLT5rcyxFVlBfQ0lQSEVSX0NUWF9rZXlfbGVuZ3RoKGN0eCksa2V5KTsKKwlyZXR1cm4gMTsKKwl9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX2Rlcy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMDA5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfZGVzLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qIGNyeXB0by9ldnAvZV9kZXMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2lmbmRlZiBPUEVOU1NMX05PX0RFUworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCitzdGF0aWMgaW50IGRlc19pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYyk7CitzdGF0aWMgaW50IGRlc19jdHJsKEVWUF9DSVBIRVJfQ1RYICpjLCBpbnQgdHlwZSwgaW50IGFyZywgdm9pZCAqcHRyKTsKKworLyogQmVjYXVzZSBvZiB2YXJpb3VzIGNhc3RzIGFuZCBkaWZmZXJlbnQgbmFtZXMgY2FuJ3QgdXNlIElNUExFTUVOVF9CTE9DS19DSVBIRVIgKi8KKworc3RhdGljIGludCBkZXNfZWNiX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sKQoreworCUJMT0NLX0NJUEhFUl9lY2JfbG9vcCgpCisJCURFU19lY2JfZW5jcnlwdCgoREVTX2NibG9jayAqKShpbiArIGkpLCAoREVTX2NibG9jayAqKShvdXQgKyBpKSwgY3R4LT5jaXBoZXJfZGF0YSwgY3R4LT5lbmNyeXB0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZXNfb2ZiX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sKQoreworCXdoaWxlKGlubD49RVZQX01BWENIVU5LKQorCQl7CisJCURFU19vZmI2NF9lbmNyeXB0KGluLCBvdXQsIChsb25nKUVWUF9NQVhDSFVOSywgY3R4LT5jaXBoZXJfZGF0YSwKKwkJCQkoREVTX2NibG9jayAqKWN0eC0+aXYsICZjdHgtPm51bSk7CisJCWlubC09RVZQX01BWENIVU5LOworCQlpbiArPUVWUF9NQVhDSFVOSzsKKwkJb3V0Kz1FVlBfTUFYQ0hVTks7CisJCX0KKwlpZiAoaW5sKQorCQlERVNfb2ZiNjRfZW5jcnlwdChpbiwgb3V0LCAobG9uZylpbmwsIGN0eC0+Y2lwaGVyX2RhdGEsCisJCQkJKERFU19jYmxvY2sgKiljdHgtPml2LCAmY3R4LT5udW0pOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRlc19jYmNfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCit7CisJd2hpbGUoaW5sPj1FVlBfTUFYQ0hVTkspCisJCXsKKwkJREVTX25jYmNfZW5jcnlwdChpbiwgb3V0LCAobG9uZylFVlBfTUFYQ0hVTkssIGN0eC0+Y2lwaGVyX2RhdGEsCisJCQkJKERFU19jYmxvY2sgKiljdHgtPml2LCBjdHgtPmVuY3J5cHQpOworCQlpbmwtPUVWUF9NQVhDSFVOSzsKKwkJaW4gKz1FVlBfTUFYQ0hVTks7CisJCW91dCs9RVZQX01BWENIVU5LOworCQl9CisJaWYgKGlubCkKKwkJREVTX25jYmNfZW5jcnlwdChpbiwgb3V0LCAobG9uZylpbmwsIGN0eC0+Y2lwaGVyX2RhdGEsCisJCQkJKERFU19jYmxvY2sgKiljdHgtPml2LCBjdHgtPmVuY3J5cHQpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRlc19jZmI2NF9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sKQoreworCXdoaWxlKGlubD49RVZQX01BWENIVU5LKQorCQl7CisJCURFU19jZmI2NF9lbmNyeXB0KGluLG91dCwgKGxvbmcpRVZQX01BWENIVU5LLCBjdHgtPmNpcGhlcl9kYXRhLAorCQkJCShERVNfY2Jsb2NrICopY3R4LT5pdiwgJmN0eC0+bnVtLCBjdHgtPmVuY3J5cHQpOworCQlpbmwtPUVWUF9NQVhDSFVOSzsKKwkJaW4gKz1FVlBfTUFYQ0hVTks7CisJCW91dCs9RVZQX01BWENIVU5LOworCQl9CisJaWYgKGlubCkKKwkJREVTX2NmYjY0X2VuY3J5cHQoaW4sIG91dCwgKGxvbmcpaW5sLCBjdHgtPmNpcGhlcl9kYXRhLAorCQkJICAoREVTX2NibG9jayAqKWN0eC0+aXYsICZjdHgtPm51bSwgY3R4LT5lbmNyeXB0KTsKKwlyZXR1cm4gMTsKK30KKworLyogQWx0aG91Z2ggd2UgaGF2ZSBhIENGQi1yIGltcGxlbWVudGF0aW9uIGZvciBERVMsIGl0IGRvZXNuJ3QgcGFjayB0aGUgcmlnaHQKKyAgIHdheSwgc28gd3JhcCBpdCBoZXJlICovCitzdGF0aWMgaW50IGRlc19jZmIxX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubCkKKyAgICB7CisgICAgc2l6ZV90IG4sY2h1bms9RVZQX01BWENIVU5LLzg7CisgICAgdW5zaWduZWQgY2hhciBjWzFdLGRbMV07CisKKyAgICBpZiAoaW5sPGNodW5rKSBjaHVuaz1pbmw7CisKKyAgICB3aGlsZSAoaW5sICYmIGlubD49Y2h1bmspCisJeworCWZvcihuPTAgOyBuIDwgY2h1bmsqODsgKytuKQorCSAgICB7CisJICAgIGNbMF09KGluW24vOF0mKDEgPDwgKDctbiU4KSkpID8gMHg4MCA6IDA7CisJICAgIERFU19jZmJfZW5jcnlwdChjLGQsMSwxLGN0eC0+Y2lwaGVyX2RhdGEsKERFU19jYmxvY2sgKiljdHgtPml2LAorCQkJY3R4LT5lbmNyeXB0KTsKKwkgICAgb3V0W24vOF09KG91dFtuLzhdJn4oMHg4MCA+PiAodW5zaWduZWQgaW50KShuJTgpKSkgfAorCQkgICAgICgoZFswXSYweDgwKSA+PiAodW5zaWduZWQgaW50KShuJTgpKTsKKwkgICAgfQorCWlubC09Y2h1bms7CisJaW4gKz1jaHVuazsKKwlvdXQrPWNodW5rOworCWlmIChpbmw8Y2h1bmspIGNodW5rPWlubDsKKwl9CisKKyAgICByZXR1cm4gMTsKKyAgICB9CisKK3N0YXRpYyBpbnQgZGVzX2NmYjhfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sKQorICAgIHsKKyAgICB3aGlsZSAoaW5sPj1FVlBfTUFYQ0hVTkspCisJeworCURFU19jZmJfZW5jcnlwdChpbixvdXQsOCwobG9uZylFVlBfTUFYQ0hVTkssY3R4LT5jaXBoZXJfZGF0YSwKKwkJCShERVNfY2Jsb2NrICopY3R4LT5pdixjdHgtPmVuY3J5cHQpOworCWlubC09RVZQX01BWENIVU5LOworCWluICs9RVZQX01BWENIVU5LOworCW91dCs9RVZQX01BWENIVU5LOworCX0KKyAgICBpZiAoaW5sKQorCURFU19jZmJfZW5jcnlwdChpbixvdXQsOCwobG9uZylpbmwsY3R4LT5jaXBoZXJfZGF0YSwKKwkJCShERVNfY2Jsb2NrICopY3R4LT5pdixjdHgtPmVuY3J5cHQpOworICAgIHJldHVybiAxOworICAgIH0KKworQkxPQ0tfQ0lQSEVSX2RlZnMoZGVzLCBERVNfa2V5X3NjaGVkdWxlLCBOSURfZGVzLCA4LCA4LCA4LCA2NCwKKwkJCUVWUF9DSVBIX1JBTkRfS0VZLCBkZXNfaW5pdF9rZXksIE5VTEwsCisJCQlFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCQkJRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwkJCWRlc19jdHJsKQorCitCTE9DS19DSVBIRVJfZGVmX2NmYihkZXMsREVTX2tleV9zY2hlZHVsZSxOSURfZGVzLDgsOCwxLAorCQkgICAgIEVWUF9DSVBIX1JBTkRfS0VZLCBkZXNfaW5pdF9rZXksTlVMTCwKKwkJICAgICBFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCQkgICAgIEVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsZGVzX2N0cmwpCisKK0JMT0NLX0NJUEhFUl9kZWZfY2ZiKGRlcyxERVNfa2V5X3NjaGVkdWxlLE5JRF9kZXMsOCw4LDgsCisJCSAgICAgRVZQX0NJUEhfUkFORF9LRVksZGVzX2luaXRfa2V5LE5VTEwsCisJCSAgICAgRVZQX0NJUEhFUl9zZXRfYXNuMV9pdiwKKwkJICAgICBFVlBfQ0lQSEVSX2dldF9hc24xX2l2LGRlc19jdHJsKQorCitzdGF0aWMgaW50IGRlc19pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKKwl7CisJREVTX2NibG9jayAqZGVza2V5ID0gKERFU19jYmxvY2sgKilrZXk7CisjaWZkZWYgRVZQX0NIRUNLX0RFU19LRVkKKwlpZihERVNfc2V0X2tleV9jaGVja2VkKGRlc2tleSxjdHgtPmNpcGhlcl9kYXRhKSAhPSAwKQorCQlyZXR1cm4gMDsKKyNlbHNlCisJREVTX3NldF9rZXlfdW5jaGVja2VkKGRlc2tleSxjdHgtPmNpcGhlcl9kYXRhKTsKKyNlbmRpZgorCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBkZXNfY3RybChFVlBfQ0lQSEVSX0NUWCAqYywgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cikKKwl7CisJCisJc3dpdGNoKHR5cGUpCisJCXsKKwljYXNlIEVWUF9DVFJMX1JBTkRfS0VZOgorCQlpZiAoUkFORF9ieXRlcyhwdHIsIDgpIDw9IDApCisJCQlyZXR1cm4gMDsKKwkJREVTX3NldF9vZGRfcGFyaXR5KChERVNfY2Jsb2NrICopcHRyKTsKKwkJcmV0dXJuIDE7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX2RlczMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9kZXMzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzMmNmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9kZXMzLmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qIGNyeXB0by9ldnAvZV9kZXMzLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgImV2cF9sb2NsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworc3RhdGljIGludCBkZXNfZWRlX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppdixpbnQgZW5jKTsKKworc3RhdGljIGludCBkZXNfZWRlM19pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LGludCBlbmMpOworCitzdGF0aWMgaW50IGRlczNfY3RybChFVlBfQ0lQSEVSX0NUWCAqYywgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cik7CisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIERFU19rZXlfc2NoZWR1bGUga3MxOy8qIGtleSBzY2hlZHVsZSAqLworICAgIERFU19rZXlfc2NoZWR1bGUga3MyOy8qIGtleSBzY2hlZHVsZSAoZm9yIGVkZSkgKi8KKyAgICBERVNfa2V5X3NjaGVkdWxlIGtzMzsvKiBrZXkgc2NoZWR1bGUgKGZvciBlZGUzKSAqLworICAgIH0gREVTX0VERV9LRVk7CisKKyNkZWZpbmUgZGF0YShjdHgpICgoREVTX0VERV9LRVkgKikoY3R4KS0+Y2lwaGVyX2RhdGEpCisKKy8qIEJlY2F1c2Ugb2YgdmFyaW91cyBjYXN0cyBhbmQgZGlmZmVyZW50IGFyZ3MgY2FuJ3QgdXNlIElNUExFTUVOVF9CTE9DS19DSVBIRVIgKi8KKworc3RhdGljIGludCBkZXNfZWRlX2VjYl9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCit7CisJQkxPQ0tfQ0lQSEVSX2VjYl9sb29wKCkKKwkJREVTX2VjYjNfZW5jcnlwdCgoY29uc3RfREVTX2NibG9jayAqKShpbiArIGkpLAorCQkJCSAoREVTX2NibG9jayAqKShvdXQgKyBpKSwKKwkJCQkgJmRhdGEoY3R4KS0+a3MxLCAmZGF0YShjdHgpLT5rczIsCisJCQkJICZkYXRhKGN0eCktPmtzMywKKwkJCQkgY3R4LT5lbmNyeXB0KTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZXNfZWRlX29mYl9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCit7CisJaWYgKGlubD49RVZQX01BWENIVU5LKQorCQl7CisJCURFU19lZGUzX29mYjY0X2VuY3J5cHQoaW4sIG91dCwgKGxvbmcpRVZQX01BWENIVU5LLAorCQkJICAgICAgICZkYXRhKGN0eCktPmtzMSwgJmRhdGEoY3R4KS0+a3MyLCAmZGF0YShjdHgpLT5rczMsCisJCQkgICAgICAgKERFU19jYmxvY2sgKiljdHgtPml2LCAmY3R4LT5udW0pOworCQlpbmwtPUVWUF9NQVhDSFVOSzsKKwkJaW4gKz1FVlBfTUFYQ0hVTks7CisJCW91dCs9RVZQX01BWENIVU5LOworCQl9CisJaWYgKGlubCkKKwkJREVTX2VkZTNfb2ZiNjRfZW5jcnlwdChpbiwgb3V0LCAobG9uZylpbmwsCisJCQkJJmRhdGEoY3R4KS0+a3MxLCAmZGF0YShjdHgpLT5rczIsICZkYXRhKGN0eCktPmtzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREVTX2NibG9jayAqKWN0eC0+aXYsICZjdHgtPm51bSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZXNfZWRlX2NiY19jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCit7CisjaWZkZWYgS1NTTF9ERUJVRworCXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGNoYXIgKmNwOworCXByaW50ZigiZGVzX2VkZV9jYmNfY2lwaGVyKGN0eD0lbHgsIGJ1Zmxlbj0lZClcbiIsIGN0eCwgY3R4LT5idWZfbGVuKTsKKwlwcmludGYoIlx0IGl2PSAiKTsKKyAgICAgICAgZm9yKGk9MDtpPDg7aSsrKQorICAgICAgICAgICAgICAgIHByaW50ZigiJTAyWCIsY3R4LT5pdltpXSk7CisJcHJpbnRmKCJcbiIpOworCX0KKyNlbmRpZiAgICAvKiBLU1NMX0RFQlVHICovCisJaWYgKGlubD49RVZQX01BWENIVU5LKQorCQl7CisJCURFU19lZGUzX2NiY19lbmNyeXB0KGluLCBvdXQsIChsb25nKUVWUF9NQVhDSFVOSywKKwkJCSAgICAgJmRhdGEoY3R4KS0+a3MxLCAmZGF0YShjdHgpLT5rczIsICZkYXRhKGN0eCktPmtzMywKKwkJCSAgICAgKERFU19jYmxvY2sgKiljdHgtPml2LCBjdHgtPmVuY3J5cHQpOworCQlpbmwtPUVWUF9NQVhDSFVOSzsKKwkJaW4gKz1FVlBfTUFYQ0hVTks7CisJCW91dCs9RVZQX01BWENIVU5LOworCQl9CisJaWYgKGlubCkKKwkJREVTX2VkZTNfY2JjX2VuY3J5cHQoaW4sIG91dCwgKGxvbmcpaW5sLAorCQkJICAgICAmZGF0YShjdHgpLT5rczEsICZkYXRhKGN0eCktPmtzMiwgJmRhdGEoY3R4KS0+a3MzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREVTX2NibG9jayAqKWN0eC0+aXYsIGN0eC0+ZW5jcnlwdCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVzX2VkZV9jZmI2NF9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCit7CisJaWYgKGlubD49RVZQX01BWENIVU5LKQorCQl7CisJCURFU19lZGUzX2NmYjY0X2VuY3J5cHQoaW4sIG91dCwgKGxvbmcpRVZQX01BWENIVU5LLCAKKwkJCSAgICAgICAmZGF0YShjdHgpLT5rczEsICZkYXRhKGN0eCktPmtzMiwgJmRhdGEoY3R4KS0+a3MzLAorCQkJICAgICAgIChERVNfY2Jsb2NrICopY3R4LT5pdiwgJmN0eC0+bnVtLCBjdHgtPmVuY3J5cHQpOworCQlpbmwtPUVWUF9NQVhDSFVOSzsKKwkJaW4gKz1FVlBfTUFYQ0hVTks7CisJCW91dCs9RVZQX01BWENIVU5LOworCQl9CisJaWYgKGlubCkKKwkJREVTX2VkZTNfY2ZiNjRfZW5jcnlwdChpbiwgb3V0LCAobG9uZylpbmwsCisJCQkgICAgICAgJmRhdGEoY3R4KS0+a3MxLCAmZGF0YShjdHgpLT5rczIsICZkYXRhKGN0eCktPmtzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoREVTX2NibG9jayAqKWN0eC0+aXYsICZjdHgtPm51bSwgY3R4LT5lbmNyeXB0KTsKKwlyZXR1cm4gMTsKK30KKworLyogQWx0aG91Z2ggd2UgaGF2ZSBhIENGQi1yIGltcGxlbWVudGF0aW9uIGZvciAzLURFUywgaXQgZG9lc24ndCBwYWNrIHRoZSByaWdodAorICAgd2F5LCBzbyB3cmFwIGl0IGhlcmUgKi8KK3N0YXRpYyBpbnQgZGVzX2VkZTNfY2ZiMV9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sKQorICAgIHsKKyAgICBzaXplX3QgbjsKKyAgICB1bnNpZ25lZCBjaGFyIGNbMV0sZFsxXTsKKworICAgIGZvcihuPTAgOyBuIDwgaW5sIDsgKytuKQorCXsKKwljWzBdPShpbltuLzhdJigxIDw8ICg3LW4lOCkpKSA/IDB4ODAgOiAwOworCURFU19lZGUzX2NmYl9lbmNyeXB0KGMsZCwxLDEsCisJCQkgICAgICZkYXRhKGN0eCktPmtzMSwmZGF0YShjdHgpLT5rczIsJmRhdGEoY3R4KS0+a3MzLAorCQkJICAgICAoREVTX2NibG9jayAqKWN0eC0+aXYsY3R4LT5lbmNyeXB0KTsKKwlvdXRbbi84XT0ob3V0W24vOF0mfigweDgwID4+ICh1bnNpZ25lZCBpbnQpKG4lOCkpKSB8CisJCSAoKGRbMF0mMHg4MCkgPj4gKHVuc2lnbmVkIGludCkobiU4KSk7CisJfQorCisgICAgcmV0dXJuIDE7CisgICAgfQorCitzdGF0aWMgaW50IGRlc19lZGUzX2NmYjhfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubCkKKyAgICB7CisgICAgd2hpbGUgKGlubD49RVZQX01BWENIVU5LKQorCXsKKwlERVNfZWRlM19jZmJfZW5jcnlwdChpbixvdXQsOCwobG9uZylFVlBfTUFYQ0hVTkssCisJCQkgJmRhdGEoY3R4KS0+a3MxLCZkYXRhKGN0eCktPmtzMiwmZGF0YShjdHgpLT5rczMsCisJCQkgKERFU19jYmxvY2sgKiljdHgtPml2LGN0eC0+ZW5jcnlwdCk7CisJaW5sLT1FVlBfTUFYQ0hVTks7CisJaW4gKz1FVlBfTUFYQ0hVTks7CisJb3V0Kz1FVlBfTUFYQ0hVTks7CisJfQorICAgIGlmIChpbmwpCisJREVTX2VkZTNfY2ZiX2VuY3J5cHQoaW4sb3V0LDgsKGxvbmcpaW5sLAorCQkJJmRhdGEoY3R4KS0+a3MxLCZkYXRhKGN0eCktPmtzMiwmZGF0YShjdHgpLT5rczMsCisJCQkoREVTX2NibG9jayAqKWN0eC0+aXYsY3R4LT5lbmNyeXB0KTsKKyAgICByZXR1cm4gMTsKKyAgICB9CisKK0JMT0NLX0NJUEhFUl9kZWZzKGRlc19lZGUsIERFU19FREVfS0VZLCBOSURfZGVzX2VkZSwgOCwgMTYsIDgsIDY0LAorCQkJRVZQX0NJUEhfUkFORF9LRVksIGRlc19lZGVfaW5pdF9rZXksIE5VTEwsIAorCQkJRVZQX0NJUEhFUl9zZXRfYXNuMV9pdiwKKwkJCUVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsCisJCQlkZXMzX2N0cmwpCisKKyNkZWZpbmUgZGVzX2VkZTNfY2ZiNjRfY2lwaGVyIGRlc19lZGVfY2ZiNjRfY2lwaGVyCisjZGVmaW5lIGRlc19lZGUzX29mYl9jaXBoZXIgZGVzX2VkZV9vZmJfY2lwaGVyCisjZGVmaW5lIGRlc19lZGUzX2NiY19jaXBoZXIgZGVzX2VkZV9jYmNfY2lwaGVyCisjZGVmaW5lIGRlc19lZGUzX2VjYl9jaXBoZXIgZGVzX2VkZV9lY2JfY2lwaGVyCisKK0JMT0NLX0NJUEhFUl9kZWZzKGRlc19lZGUzLCBERVNfRURFX0tFWSwgTklEX2Rlc19lZGUzLCA4LCAyNCwgOCwgNjQsCisJCQlFVlBfQ0lQSF9SQU5EX0tFWSwgZGVzX2VkZTNfaW5pdF9rZXksIE5VTEwsIAorCQkJRVZQX0NJUEhFUl9zZXRfYXNuMV9pdiwKKwkJCUVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsCisJCQlkZXMzX2N0cmwpCisKK0JMT0NLX0NJUEhFUl9kZWZfY2ZiKGRlc19lZGUzLERFU19FREVfS0VZLE5JRF9kZXNfZWRlMywyNCw4LDEsCisJCSAgICAgRVZQX0NJUEhfUkFORF9LRVksIGRlc19lZGUzX2luaXRfa2V5LE5VTEwsCisJCSAgICAgRVZQX0NJUEhFUl9zZXRfYXNuMV9pdiwKKwkJICAgICBFVlBfQ0lQSEVSX2dldF9hc24xX2l2LAorCQkgICAgIGRlczNfY3RybCkKKworQkxPQ0tfQ0lQSEVSX2RlZl9jZmIoZGVzX2VkZTMsREVTX0VERV9LRVksTklEX2Rlc19lZGUzLDI0LDgsOCwKKwkJICAgICBFVlBfQ0lQSF9SQU5EX0tFWSwgZGVzX2VkZTNfaW5pdF9rZXksTlVMTCwKKwkJICAgICBFVlBfQ0lQSEVSX3NldF9hc24xX2l2LAorCQkgICAgIEVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsCisJCSAgICAgZGVzM19jdHJsKQorCitzdGF0aWMgaW50IGRlc19lZGVfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKQorCXsKKwlERVNfY2Jsb2NrICpkZXNrZXkgPSAoREVTX2NibG9jayAqKWtleTsKKyNpZmRlZiBFVlBfQ0hFQ0tfREVTX0tFWQorCWlmIChERVNfc2V0X2tleV9jaGVja2VkKCZkZXNrZXlbMF0sJmRhdGEoY3R4KS0+a3MxKQorCQkhISBERVNfc2V0X2tleV9jaGVja2VkKCZkZXNrZXlbMV0sJmRhdGEoY3R4KS0+a3MyKSkKKwkJcmV0dXJuIDA7CisjZWxzZQorCURFU19zZXRfa2V5X3VuY2hlY2tlZCgmZGVza2V5WzBdLCZkYXRhKGN0eCktPmtzMSk7CisJREVTX3NldF9rZXlfdW5jaGVja2VkKCZkZXNrZXlbMV0sJmRhdGEoY3R4KS0+a3MyKTsKKyNlbmRpZgorCW1lbWNweSgmZGF0YShjdHgpLT5rczMsJmRhdGEoY3R4KS0+a3MxLAorCSAgICAgICBzaXplb2YoZGF0YShjdHgpLT5rczEpKTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZGVzX2VkZTNfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKKwl7CisJREVTX2NibG9jayAqZGVza2V5ID0gKERFU19jYmxvY2sgKilrZXk7CisjaWZkZWYgS1NTTF9ERUJVRworCXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHByaW50ZigiZGVzX2VkZTNfaW5pdF9rZXkoY3R4PSVseClcbiIsIGN0eCk7CisJcHJpbnRmKCJcdEtFWT0gIik7CisgICAgICAgIGZvcihpPTA7aTwyNDtpKyspIHByaW50ZigiJTAyWCIsa2V5W2ldKTsgcHJpbnRmKCJcbiIpOworCXByaW50ZigiXHQgSVY9ICIpOworICAgICAgICBmb3IoaT0wO2k8ODtpKyspIHByaW50ZigiJTAyWCIsaXZbaV0pOyBwcmludGYoIlxuIik7CisJfQorI2VuZGlmCS8qIEtTU0xfREVCVUcgKi8KKworI2lmZGVmIEVWUF9DSEVDS19ERVNfS0VZCisJaWYgKERFU19zZXRfa2V5X2NoZWNrZWQoJmRlc2tleVswXSwmZGF0YShjdHgpLT5rczEpCisJCXx8IERFU19zZXRfa2V5X2NoZWNrZWQoJmRlc2tleVsxXSwmZGF0YShjdHgpLT5rczIpCisJCXx8IERFU19zZXRfa2V5X2NoZWNrZWQoJmRlc2tleVsyXSwmZGF0YShjdHgpLT5rczMpKQorCQlyZXR1cm4gMDsKKyNlbHNlCisJREVTX3NldF9rZXlfdW5jaGVja2VkKCZkZXNrZXlbMF0sJmRhdGEoY3R4KS0+a3MxKTsKKwlERVNfc2V0X2tleV91bmNoZWNrZWQoJmRlc2tleVsxXSwmZGF0YShjdHgpLT5rczIpOworCURFU19zZXRfa2V5X3VuY2hlY2tlZCgmZGVza2V5WzJdLCZkYXRhKGN0eCktPmtzMyk7CisjZW5kaWYKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZGVzM19jdHJsKEVWUF9DSVBIRVJfQ1RYICpjLCBpbnQgdHlwZSwgaW50IGFyZywgdm9pZCAqcHRyKQorCXsKKworCURFU19jYmxvY2sgKmRlc2tleSA9IHB0cjsKKworCXN3aXRjaCh0eXBlKQorCQl7CisJY2FzZSBFVlBfQ1RSTF9SQU5EX0tFWToKKwkJaWYgKFJBTkRfYnl0ZXMocHRyLCBjLT5rZXlfbGVuKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCURFU19zZXRfb2RkX3Bhcml0eShkZXNrZXkpOworCQlpZiAoYy0+a2V5X2xlbiA+PSAxNikKKwkJCURFU19zZXRfb2RkX3Bhcml0eShkZXNrZXkgKyAxKTsKKwkJaWYgKGMtPmtleV9sZW4gPj0gMjQpCisJCQlERVNfc2V0X29kZF9wYXJpdHkoZGVza2V5ICsgMik7CisJCXJldHVybiAxOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCQl9CisJfQorCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZSh2b2lkKQoreworCXJldHVybiAmZGVzX2VkZV9lY2I7Cit9CisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlMyh2b2lkKQoreworCXJldHVybiAmZGVzX2VkZTNfZWNiOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfZHNhLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfZHNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2ZjI3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9kc2EuYwpAQCAtMCwwICsxLDcxIEBACisvKiBjcnlwdG8vZXZwL2VfZHNhLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCitzdGF0aWMgRVZQX1BLRVlfTUVUSE9EIGRzc19tZXRob2Q9CisJeworCURTQV9zaWduLAorCURTQV92ZXJpZnksCisJe0VWUF9QS0VZX0RTQSxFVlBfUEtFWV9EU0EyLEVWUF9QS0VZX0RTQTMsTlVMTH0sCisJfTsKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX2lkZWEuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9pZGVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2YjA4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9pZGVhLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qIGNyeXB0by9ldnAvZV9pZGVhLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKworI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgImV2cF9sb2NsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9pZGVhLmg+CisKK3N0YXRpYyBpbnQgaWRlYV9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsaW50IGVuYyk7CisKKy8qIE5CIGlkZWFfZWNiX2VuY3J5cHQgZG9lc24ndCB0YWtlIGFuICdlbmNyeXB0JyBhcmd1bWVudCBzbyB3ZSB0cmVhdCBpdCBhcyBhIHNwZWNpYWwKKyAqIGNhc2UgCisgKi8KKworc3RhdGljIGludCBpZGVhX2VjYl9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCit7CisJQkxPQ0tfQ0lQSEVSX2VjYl9sb29wKCkKKwkJaWRlYV9lY2JfZW5jcnlwdChpbiArIGksIG91dCArIGksIGN0eC0+Y2lwaGVyX2RhdGEpOworCXJldHVybiAxOworfQorCisvKiBDYW4ndCB1c2UgSU1QTEVNRU5UX0JMT0NLX0NJUEhFUiBiZWNhdXNlIGlkZWFfZWNiX2VuY3J5cHQgaXMgZGlmZmVyZW50ICovCisKK3R5cGVkZWYgc3RydWN0CisJeworCUlERUFfS0VZX1NDSEVEVUxFIGtzOworCX0gRVZQX0lERUFfS0VZOworCitCTE9DS19DSVBIRVJfZnVuY19jYmMoaWRlYSwgaWRlYSwgRVZQX0lERUFfS0VZLCBrcykKK0JMT0NLX0NJUEhFUl9mdW5jX29mYihpZGVhLCBpZGVhLCA2NCwgRVZQX0lERUFfS0VZLCBrcykKK0JMT0NLX0NJUEhFUl9mdW5jX2NmYihpZGVhLCBpZGVhLCA2NCwgRVZQX0lERUFfS0VZLCBrcykKKworQkxPQ0tfQ0lQSEVSX2RlZnMoaWRlYSwgSURFQV9LRVlfU0NIRURVTEUsIE5JRF9pZGVhLCA4LCAxNiwgOCwgNjQsCisJCQkwLCBpZGVhX2luaXRfa2V5LCBOVUxMLCAKKwkJCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsIEVWUF9DSVBIRVJfZ2V0X2FzbjFfaXYsIE5VTEwpCisKK3N0YXRpYyBpbnQgaWRlYV9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCisJeworCWlmKCFlbmMpIHsKKwkJaWYgKEVWUF9DSVBIRVJfQ1RYX21vZGUoY3R4KSA9PSBFVlBfQ0lQSF9PRkJfTU9ERSkgZW5jID0gMTsKKwkJZWxzZSBpZiAoRVZQX0NJUEhFUl9DVFhfbW9kZShjdHgpID09IEVWUF9DSVBIX0NGQl9NT0RFKSBlbmMgPSAxOworCX0KKwlpZiAoZW5jKSBpZGVhX3NldF9lbmNyeXB0X2tleShrZXksY3R4LT5jaXBoZXJfZGF0YSk7CisJZWxzZQorCQl7CisJCUlERUFfS0VZX1NDSEVEVUxFIHRtcDsKKworCQlpZGVhX3NldF9lbmNyeXB0X2tleShrZXksJnRtcCk7CisJCWlkZWFfc2V0X2RlY3J5cHRfa2V5KCZ0bXAsY3R4LT5jaXBoZXJfZGF0YSk7CisJCU9QRU5TU0xfY2xlYW5zZSgodW5zaWduZWQgY2hhciAqKSZ0bXAsCisJCQkJc2l6ZW9mKElERUFfS0VZX1NDSEVEVUxFKSk7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX251bGwuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9udWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmNTBlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9udWxsLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIGNyeXB0by9ldnAvZV9udWxsLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorCitzdGF0aWMgaW50IG51bGxfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LGludCBlbmMpOworc3RhdGljIGludCBudWxsX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpOworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgbl9jaXBoZXI9CisJeworCU5JRF91bmRlZiwKKwkxLDAsMCwKKwkwLAorCW51bGxfaW5pdF9rZXksCisJbnVsbF9jaXBoZXIsCisJTlVMTCwKKwkwLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwKKwl9OworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZW5jX251bGwodm9pZCkKKwl7CisJcmV0dXJuKCZuX2NpcGhlcik7CisJfQorCitzdGF0aWMgaW50IG51bGxfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCisJeworCS8qCW1lbXNldCgmKGN0eC0+YyksMCxzaXplb2YoY3R4LT5jKSk7Ki8KKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgbnVsbF9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpCisJeworCWlmIChpbiAhPSBvdXQpCisJCW1lbWNweSgoY2hhciAqKW91dCwoY29uc3QgY2hhciAqKWluLGlubCk7CisJcmV0dXJuIDE7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2Vfb2xkLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2Vfb2xkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0MmFmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9vbGQuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogY3J5cHRvL2V2cC9lX29sZC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDQuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorc3RhdGljIHZvaWQgKmR1bW15ID0gJmR1bW15OworI2Vsc2UKKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKy8qIERlZmluZSBzb21lIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLCBzbyBvbGRlciBwcm9ncmFtcworICAgZG9uJ3QgY3Jhc2ggYW5kIGJ1cm4gdG9vIHF1aWNrbHkuICBPbiBXaW5kb3dzIGFuZCBWTVMsCisgICB0aGVzZSB3aWxsIG5ldmVyIGJlIHVzZWQsIHNpbmNlIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzCisgICBpbiBzaGFyZWQgbGlicmFyaWVzIGFyZSBzZWxlY3RlZCBieSBlbnRyeSBwb2ludCBsb2NhdGlvbiwKKyAgIG5vdCBieSBuYW1lLiAgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX0JGCisjdW5kZWYgRVZQX2JmX2NmYgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2JmX2NmYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9iZl9jZmIodm9pZCkgeyByZXR1cm4gRVZQX2JmX2NmYjY0KCk7IH0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisjdW5kZWYgRVZQX2Rlc19jZmIKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfY2ZiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19jZmIodm9pZCkgeyByZXR1cm4gRVZQX2Rlc19jZmI2NCgpOyB9CisjdW5kZWYgRVZQX2Rlc19lZGUzX2NmYgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGUzX2NmYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlM19jZmIodm9pZCkgeyByZXR1cm4gRVZQX2Rlc19lZGUzX2NmYjY0KCk7IH0KKyN1bmRlZiBFVlBfZGVzX2VkZV9jZmIKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlX2NmYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlX2NmYih2b2lkKSB7IHJldHVybiBFVlBfZGVzX2VkZV9jZmI2NCgpOyB9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKyN1bmRlZiBFVlBfaWRlYV9jZmIKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9pZGVhX2NmYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9pZGVhX2NmYih2b2lkKSB7IHJldHVybiBFVlBfaWRlYV9jZmI2NCgpOyB9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorI3VuZGVmIEVWUF9yYzJfY2ZiCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmMyX2NmYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzJfY2ZiKHZvaWQpIHsgcmV0dXJuIEVWUF9yYzJfY2ZiNjQoKTsgfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19DQVNUCisjdW5kZWYgRVZQX2Nhc3Q1X2NmYgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Nhc3Q1X2NmYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYXN0NV9jZmIodm9pZCkgeyByZXR1cm4gRVZQX2Nhc3Q1X2NmYjY0KCk7IH0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM1CisjdW5kZWYgRVZQX3JjNV8zMl8xMl8xNl9jZmIKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzVfMzJfMTJfMTZfY2ZiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjNV8zMl8xMl8xNl9jZmIodm9pZCkgeyByZXR1cm4gRVZQX3JjNV8zMl8xMl8xNl9jZmI2NCgpOyB9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0FFUworI3VuZGVmIEVWUF9hZXNfMTI4X2NmYgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfY2ZiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfY2ZiKHZvaWQpIHsgcmV0dXJuIEVWUF9hZXNfMTI4X2NmYjEyOCgpOyB9CisjdW5kZWYgRVZQX2Flc18xOTJfY2ZiCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzE5Ml9jZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzE5Ml9jZmIodm9pZCkgeyByZXR1cm4gRVZQX2Flc18xOTJfY2ZiMTI4KCk7IH0KKyN1bmRlZiBFVlBfYWVzXzI1Nl9jZmIKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMjU2X2NmYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMjU2X2NmYih2b2lkKSB7IHJldHVybiBFVlBfYWVzXzI1Nl9jZmIxMjgoKTsgfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX3JjMi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX3JjMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3OGQ3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfcmMyLmMKQEAgLTAsMCArMSwyMzcgQEAKKy8qIGNyeXB0by9ldnAvZV9yYzIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkMyCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgImV2cF9sb2NsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9yYzIuaD4KKworc3RhdGljIGludCByYzJfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaXYsaW50IGVuYyk7CitzdGF0aWMgaW50IHJjMl9tZXRoX3RvX21hZ2ljKEVWUF9DSVBIRVJfQ1RYICpjdHgpOworc3RhdGljIGludCByYzJfbWFnaWNfdG9fbWV0aChpbnQgaSk7CitzdGF0aWMgaW50IHJjMl9zZXRfYXNuMV90eXBlX2FuZF9pdihFVlBfQ0lQSEVSX0NUWCAqYywgQVNOMV9UWVBFICp0eXBlKTsKK3N0YXRpYyBpbnQgcmMyX2dldF9hc24xX3R5cGVfYW5kX2l2KEVWUF9DSVBIRVJfQ1RYICpjLCBBU04xX1RZUEUgKnR5cGUpOworc3RhdGljIGludCByYzJfY3RybChFVlBfQ0lQSEVSX0NUWCAqYywgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cik7CisKK3R5cGVkZWYgc3RydWN0CisJeworCWludCBrZXlfYml0czsJLyogZWZmZWN0aXZlIGtleSBiaXRzICovCisJUkMyX0tFWSBrczsJLyoga2V5IHNjaGVkdWxlICovCisJfSBFVlBfUkMyX0tFWTsKKworI2RlZmluZSBkYXRhKGN0eCkJKChFVlBfUkMyX0tFWSAqKShjdHgpLT5jaXBoZXJfZGF0YSkKKworSU1QTEVNRU5UX0JMT0NLX0NJUEhFUihyYzIsIGtzLCBSQzIsIEVWUF9SQzJfS0VZLCBOSURfcmMyLAorCQkJOCwKKwkJCVJDMl9LRVlfTEVOR1RILCA4LCA2NCwKKwkJCUVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCB8IEVWUF9DSVBIX0NUUkxfSU5JVCwKKwkJCXJjMl9pbml0X2tleSwgTlVMTCwKKwkJCXJjMl9zZXRfYXNuMV90eXBlX2FuZF9pdiwgcmMyX2dldF9hc24xX3R5cGVfYW5kX2l2LCAKKwkJCXJjMl9jdHJsKQorCisjZGVmaW5lIFJDMl80MF9NQUdJQwkweGEwCisjZGVmaW5lIFJDMl82NF9NQUdJQwkweDc4CisjZGVmaW5lIFJDMl8xMjhfTUFHSUMJMHgzYQorCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiByMl82NF9jYmNfY2lwaGVyPQorCXsKKwlOSURfcmMyXzY0X2NiYywKKwk4LDggLyogNjQgYml0ICovLDgsCisJRVZQX0NJUEhfQ0JDX01PREUgfCBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEggfCBFVlBfQ0lQSF9DVFJMX0lOSVQsCisJcmMyX2luaXRfa2V5LAorCXJjMl9jYmNfY2lwaGVyLAorCU5VTEwsCisJc2l6ZW9mKEVWUF9SQzJfS0VZKSwKKwlyYzJfc2V0X2FzbjFfdHlwZV9hbmRfaXYsCisJcmMyX2dldF9hc24xX3R5cGVfYW5kX2l2LAorCXJjMl9jdHJsLAorCU5VTEwKKwl9OworCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiByMl80MF9jYmNfY2lwaGVyPQorCXsKKwlOSURfcmMyXzQwX2NiYywKKwk4LDUgLyogNDAgYml0ICovLDgsCisJRVZQX0NJUEhfQ0JDX01PREUgfCBFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEggfCBFVlBfQ0lQSF9DVFJMX0lOSVQsCisJcmMyX2luaXRfa2V5LAorCXJjMl9jYmNfY2lwaGVyLAorCU5VTEwsCisJc2l6ZW9mKEVWUF9SQzJfS0VZKSwKKwlyYzJfc2V0X2FzbjFfdHlwZV9hbmRfaXYsCisJcmMyX2dldF9hc24xX3R5cGVfYW5kX2l2LAorCXJjMl9jdHJsLAorCU5VTEwKKwl9OworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmMyXzY0X2NiYyh2b2lkKQorCXsKKwlyZXR1cm4oJnIyXzY0X2NiY19jaXBoZXIpOworCX0KKworY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl80MF9jYmModm9pZCkKKwl7CisJcmV0dXJuKCZyMl80MF9jYmNfY2lwaGVyKTsKKwl9CisJCitzdGF0aWMgaW50IHJjMl9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKKwl7CisJUkMyX3NldF9rZXkoJmRhdGEoY3R4KS0+a3MsRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjdHgpLAorCQkgICAga2V5LGRhdGEoY3R4KS0+a2V5X2JpdHMpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCByYzJfbWV0aF90b19tYWdpYyhFVlBfQ0lQSEVSX0NUWCAqZSkKKwl7CisJaW50IGk7CisKKwlFVlBfQ0lQSEVSX0NUWF9jdHJsKGUsIEVWUF9DVFJMX0dFVF9SQzJfS0VZX0JJVFMsIDAsICZpKTsKKwlpZiAJKGkgPT0gMTI4KSByZXR1cm4oUkMyXzEyOF9NQUdJQyk7CisJZWxzZSBpZiAoaSA9PSA2NCkgIHJldHVybihSQzJfNjRfTUFHSUMpOworCWVsc2UgaWYgKGkgPT0gNDApICByZXR1cm4oUkMyXzQwX01BR0lDKTsKKwllbHNlIHJldHVybigwKTsKKwl9CisKK3N0YXRpYyBpbnQgcmMyX21hZ2ljX3RvX21ldGgoaW50IGkpCisJeworCWlmICAgICAgKGkgPT0gUkMyXzEyOF9NQUdJQykgcmV0dXJuIDEyODsKKwllbHNlIGlmIChpID09IFJDMl82NF9NQUdJQykgIHJldHVybiA2NDsKKwllbHNlIGlmIChpID09IFJDMl80MF9NQUdJQykgIHJldHVybiA0MDsKKwllbHNlCisJCXsKKwkJRVZQZXJyKEVWUF9GX1JDMl9NQUdJQ19UT19NRVRILEVWUF9SX1VOU1VQUE9SVEVEX0tFWV9TSVpFKTsKKwkJcmV0dXJuKDApOworCQl9CisJfQorCitzdGF0aWMgaW50IHJjMl9nZXRfYXNuMV90eXBlX2FuZF9pdihFVlBfQ0lQSEVSX0NUWCAqYywgQVNOMV9UWVBFICp0eXBlKQorCXsKKwlsb25nIG51bT0wOworCWludCBpPTA7CisJaW50IGtleV9iaXRzOworCXVuc2lnbmVkIGludCBsOworCXVuc2lnbmVkIGNoYXIgaXZbRVZQX01BWF9JVl9MRU5HVEhdOworCisJaWYgKHR5cGUgIT0gTlVMTCkKKwkJeworCQlsPUVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aChjKTsKKwkJT1BFTlNTTF9hc3NlcnQobCA8PSBzaXplb2YoaXYpKTsKKwkJaT1BU04xX1RZUEVfZ2V0X2ludF9vY3RldHN0cmluZyh0eXBlLCZudW0saXYsbCk7CisJCWlmIChpICE9IChpbnQpbCkKKwkJCXJldHVybigtMSk7CisJCWtleV9iaXRzID1yYzJfbWFnaWNfdG9fbWV0aCgoaW50KW51bSk7CisJCWlmICgha2V5X2JpdHMpCisJCQlyZXR1cm4oLTEpOworCQlpZihpID4gMCkgRVZQX0NpcGhlckluaXRfZXgoYywgTlVMTCwgTlVMTCwgTlVMTCwgaXYsIC0xKTsKKwkJRVZQX0NJUEhFUl9DVFhfY3RybChjLCBFVlBfQ1RSTF9TRVRfUkMyX0tFWV9CSVRTLCBrZXlfYml0cywgTlVMTCk7CisJCUVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoKGMsIGtleV9iaXRzIC8gOCk7CisJCX0KKwlyZXR1cm4oaSk7CisJfQorCitzdGF0aWMgaW50IHJjMl9zZXRfYXNuMV90eXBlX2FuZF9pdihFVlBfQ0lQSEVSX0NUWCAqYywgQVNOMV9UWVBFICp0eXBlKQorCXsKKwlsb25nIG51bTsKKwlpbnQgaT0wLGo7CisKKwlpZiAodHlwZSAhPSBOVUxMKQorCQl7CisJCW51bT1yYzJfbWV0aF90b19tYWdpYyhjKTsKKwkJaj1FVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoYyk7CisJCWk9QVNOMV9UWVBFX3NldF9pbnRfb2N0ZXRzdHJpbmcodHlwZSxudW0sYy0+b2l2LGopOworCQl9CisJcmV0dXJuKGkpOworCX0KKworc3RhdGljIGludCByYzJfY3RybChFVlBfQ0lQSEVSX0NUWCAqYywgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cikKKwl7CisJc3dpdGNoKHR5cGUpCisJCXsKKwljYXNlIEVWUF9DVFJMX0lOSVQ6CisJCWRhdGEoYyktPmtleV9iaXRzID0gRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjKSAqIDg7CisJCXJldHVybiAxOworCisJY2FzZSBFVlBfQ1RSTF9HRVRfUkMyX0tFWV9CSVRTOgorCQkqKGludCAqKXB0ciA9IGRhdGEoYyktPmtleV9iaXRzOworCQlyZXR1cm4gMTsKKwkJCQorCWNhc2UgRVZQX0NUUkxfU0VUX1JDMl9LRVlfQklUUzoKKwkJaWYoYXJnID4gMCkKKwkJCXsKKwkJCWRhdGEoYyktPmtleV9iaXRzID0gYXJnOworCQkJcmV0dXJuIDE7CisJCQl9CisJCXJldHVybiAwOworI2lmZGVmIFBCRV9QUkZfVEVTVAorCWNhc2UgRVZQX0NUUkxfUEJFX1BSRl9OSUQ6CisJCSooaW50ICopcHRyID0gTklEX2htYWNXaXRoTUQ1OworCQlyZXR1cm4gMTsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCQl9CisJfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9yYzQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV9yYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUxNzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX3JjNC5jCkBAIC0wLDAgKzEsMTM2IEBACisvKiBjcnlwdG8vZXZwL2VfcmM0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKworI2lmbmRlZiBPUEVOU1NMX05PX1JDNAorCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgorCisvKiBGSVhNRTogc3VyZWx5IHRoaXMgaXMgYXZhaWxhYmxlIGVsc2V3aGVyZT8gKi8KKyNkZWZpbmUgRVZQX1JDNF9LRVlfU0laRQkJMTYKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgUkM0X0tFWSBrczsJLyogd29ya2luZyBrZXkgKi8KKyAgICB9IEVWUF9SQzRfS0VZOworCisjZGVmaW5lIGRhdGEoY3R4KSAoKEVWUF9SQzRfS0VZICopKGN0eCktPmNpcGhlcl9kYXRhKQorCitzdGF0aWMgaW50IHJjNF9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICppdixpbnQgZW5jKTsKK3N0YXRpYyBpbnQgcmM0X2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sKTsKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIHI0X2NpcGhlcj0KKwl7CisJTklEX3JjNCwKKwkxLEVWUF9SQzRfS0VZX1NJWkUsMCwKKwlFVlBfQ0lQSF9WQVJJQUJMRV9MRU5HVEgsCisJcmM0X2luaXRfa2V5LAorCXJjNF9jaXBoZXIsCisJTlVMTCwKKwlzaXplb2YoRVZQX1JDNF9LRVkpLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwKKwl9OworCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiByNF80MF9jaXBoZXI9CisJeworCU5JRF9yYzRfNDAsCisJMSw1IC8qIDQwIGJpdCAqLywwLAorCUVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCwKKwlyYzRfaW5pdF9rZXksCisJcmM0X2NpcGhlciwKKwlOVUxMLAorCXNpemVvZihFVlBfUkM0X0tFWSksCisJTlVMTCwgCisJTlVMTCwKKwlOVUxMLAorCU5VTEwKKwl9OworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmM0KHZvaWQpCisJeworCXJldHVybigmcjRfY2lwaGVyKTsKKwl9CisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzRfNDAodm9pZCkKKwl7CisJcmV0dXJuKCZyNF80MF9jaXBoZXIpOworCX0KKworc3RhdGljIGludCByYzRfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCisJeworCVJDNF9zZXRfa2V5KCZkYXRhKGN0eCktPmtzLEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY3R4KSwKKwkJICAgIGtleSk7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IHJjNF9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubCkKKwl7CisJUkM0KCZkYXRhKGN0eCktPmtzLGlubCxpbixvdXQpOworCXJldHVybiAxOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX3JjNS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX3JjNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YTEwYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfcmM1LmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qIGNyeXB0by9ldnAvZV9yYzUuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM1CisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgImV2cF9sb2NsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9yYzUuaD4KKworc3RhdGljIGludCByXzMyXzEyXzE2X2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppdixpbnQgZW5jKTsKK3N0YXRpYyBpbnQgcmM1X2N0cmwoRVZQX0NJUEhFUl9DVFggKmMsIGludCB0eXBlLCBpbnQgYXJnLCB2b2lkICpwdHIpOworCit0eXBlZGVmIHN0cnVjdAorCXsKKwlpbnQgcm91bmRzOwkvKiBudW1iZXIgb2Ygcm91bmRzICovCisJUkM1XzMyX0tFWSBrczsJLyoga2V5IHNjaGVkdWxlICovCisJfSBFVlBfUkM1X0tFWTsKKworI2RlZmluZSBkYXRhKGN0eCkJRVZQX0NfREFUQShFVlBfUkM1X0tFWSxjdHgpCisKK0lNUExFTUVOVF9CTE9DS19DSVBIRVIocmM1XzMyXzEyXzE2LCBrcywgUkM1XzMyLCBFVlBfUkM1X0tFWSwgTklEX3JjNSwKKwkJICAgICAgIDgsIFJDNV8zMl9LRVlfTEVOR1RILCA4LCA2NCwKKwkJICAgICAgIEVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCB8IEVWUF9DSVBIX0NUUkxfSU5JVCwKKwkJICAgICAgIHJfMzJfMTJfMTZfaW5pdF9rZXksIE5VTEwsCisJCSAgICAgICBOVUxMLCBOVUxMLCByYzVfY3RybCkKKworc3RhdGljIGludCByYzVfY3RybChFVlBfQ0lQSEVSX0NUWCAqYywgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cikKKwl7CisJc3dpdGNoKHR5cGUpCisJCXsKKwljYXNlIEVWUF9DVFJMX0lOSVQ6CisJCWRhdGEoYyktPnJvdW5kcyA9IFJDNV8xMl9ST1VORFM7CisJCXJldHVybiAxOworCisJY2FzZSBFVlBfQ1RSTF9HRVRfUkM1X1JPVU5EUzoKKwkJKihpbnQgKilwdHIgPSBkYXRhKGMpLT5yb3VuZHM7CisJCXJldHVybiAxOworCQkJCisJY2FzZSBFVlBfQ1RSTF9TRVRfUkM1X1JPVU5EUzoKKwkJc3dpdGNoKGFyZykKKwkJCXsKKwkJY2FzZSBSQzVfOF9ST1VORFM6CisJCWNhc2UgUkM1XzEyX1JPVU5EUzoKKwkJY2FzZSBSQzVfMTZfUk9VTkRTOgorCQkJZGF0YShjKS0+cm91bmRzID0gYXJnOworCQkJcmV0dXJuIDE7CisKKwkJZGVmYXVsdDoKKwkJCUVWUGVycihFVlBfRl9SQzVfQ1RSTCwgRVZQX1JfVU5TVVBPUlRFRF9OVU1CRVJfT0ZfUk9VTkRTKTsKKwkJCXJldHVybiAwOworCQkJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCQl9CisJfQorCitzdGF0aWMgaW50IHJfMzJfMTJfMTZfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKQorCXsKKwlSQzVfMzJfc2V0X2tleSgmZGF0YShjdHgpLT5rcyxFVlBfQ0lQSEVSX0NUWF9rZXlfbGVuZ3RoKGN0eCksCisJCSAgICAgICBrZXksZGF0YShjdHgpLT5yb3VuZHMpOworCXJldHVybiAxOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2Vfc2VlZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX3NlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDE3NTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lX3NlZWQuYwpAQCAtMCwwICsxLDgzIEBACisvKiBjcnlwdG8vZXZwL2Vfc2VlZC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fU0VFRAorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NlZWQuaD4KKyNpbmNsdWRlICJldnBfbG9jbC5oIgorCitzdGF0aWMgaW50IHNlZWRfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAljb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYyk7CisKK3R5cGVkZWYgc3RydWN0CisJeworCVNFRURfS0VZX1NDSEVEVUxFIGtzOworCX0gRVZQX1NFRURfS0VZOworCitJTVBMRU1FTlRfQkxPQ0tfQ0lQSEVSKHNlZWQsIGtzLCBTRUVELCBFVlBfU0VFRF9LRVksIE5JRF9zZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYsIDE2LCAxMjgsCisgICAgICAgICAgICAgICAgICAgICAgIDAsIHNlZWRfaW5pdF9rZXksIDAsIDAsIDAsIDApCisKK3N0YXRpYyBpbnQgc2VlZF9pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCisJeworCVNFRURfc2V0X2tleShrZXksIGN0eC0+Y2lwaGVyX2RhdGEpOworCXJldHVybiAxOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfeGNiY19kLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2VfeGNiY19kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwZTg4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZV94Y2JjX2QuYwpAQCAtMCwwICsxLDEzOCBAQAorLyogY3J5cHRvL2V2cC9lX3hjYmNfZC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgorCitzdGF0aWMgaW50IGRlc3hfY2JjX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsaW50IGVuYyk7CitzdGF0aWMgaW50IGRlc3hfY2JjX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubCk7CisKKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgREVTX2tleV9zY2hlZHVsZSBrczsvKiBrZXkgc2NoZWR1bGUgKi8KKyAgICBERVNfY2Jsb2NrIGludzsKKyAgICBERVNfY2Jsb2NrIG91dHc7CisgICAgfSBERVNYX0NCQ19LRVk7CisKKyNkZWZpbmUgZGF0YShjdHgpICgoREVTWF9DQkNfS0VZICopKGN0eCktPmNpcGhlcl9kYXRhKQorCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBkX3hjYmNfY2lwaGVyPQorCXsKKwlOSURfZGVzeF9jYmMsCisJOCwyNCw4LAorCUVWUF9DSVBIX0NCQ19NT0RFLAorCWRlc3hfY2JjX2luaXRfa2V5LAorCWRlc3hfY2JjX2NpcGhlciwKKwlOVUxMLAorCXNpemVvZihERVNYX0NCQ19LRVkpLAorCUVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsCisJRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwKKwlOVUxMLAorCU5VTEwKKwl9OworCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzeF9jYmModm9pZCkKKwl7CisJcmV0dXJuKCZkX3hjYmNfY2lwaGVyKTsKKwl9CisJCitzdGF0aWMgaW50IGRlc3hfY2JjX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCisJeworCURFU19jYmxvY2sgKmRlc2tleSA9IChERVNfY2Jsb2NrICopa2V5OworCisJREVTX3NldF9rZXlfdW5jaGVja2VkKGRlc2tleSwmZGF0YShjdHgpLT5rcyk7CisJbWVtY3B5KCZkYXRhKGN0eCktPmlud1swXSwma2V5WzhdLDgpOworCW1lbWNweSgmZGF0YShjdHgpLT5vdXR3WzBdLCZrZXlbMTZdLDgpOworCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGRlc3hfY2JjX2NpcGhlcihFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubCkKKwl7CisJd2hpbGUgKGlubD49RVZQX01BWENIVU5LKQorCQl7CisJCURFU194Y2JjX2VuY3J5cHQoaW4sb3V0LChsb25nKUVWUF9NQVhDSFVOSywmZGF0YShjdHgpLT5rcywKKwkJCSAoREVTX2NibG9jayAqKSYoY3R4LT5pdlswXSksCisJCQkgJmRhdGEoY3R4KS0+aW53LAorCQkJICZkYXRhKGN0eCktPm91dHcsCisJCQkgY3R4LT5lbmNyeXB0KTsKKwkJaW5sLT1FVlBfTUFYQ0hVTks7CisJCWluICs9RVZQX01BWENIVU5LOworCQlvdXQrPUVWUF9NQVhDSFVOSzsKKwkJfQorCWlmIChpbmwpCisJCURFU194Y2JjX2VuY3J5cHQoaW4sb3V0LChsb25nKWlubCwmZGF0YShjdHgpLT5rcywKKwkJCShERVNfY2Jsb2NrICopJihjdHgtPml2WzBdKSwKKwkJCSZkYXRhKGN0eCktPmludywKKwkJCSZkYXRhKGN0eCktPm91dHcsCisJCQljdHgtPmVuY3J5cHQpOworCXJldHVybiAxOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9lbmNvZGUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyYzc0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZW5jb2RlLmMKQEAgLTAsMCArMSw0NDYgQEAKKy8qIGNyeXB0by9ldnAvZW5jb2RlLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisjZGVmaW5lIGNvbnZfYmluMmFzY2lpKGEpCShkYXRhX2JpbjJhc2NpaVsoYSkmMHgzZl0pCisjZGVmaW5lIGNvbnZfYXNjaWkyYmluKGEpCShkYXRhX2FzY2lpMmJpblsoYSkmMHg3Zl0pCisjZWxzZQorLyogV2UgYXNzdW1lIHRoYXQgUEVNIGVuY29kZWQgZmlsZXMgYXJlIEVCQ0RJQyBmaWxlcworICogKGkuZS4sIHByaW50YWJsZSB0ZXh0IGZpbGVzKS4gQ29udmVydCB0aGVtIGhlcmUgd2hpbGUgZGVjb2RpbmcuCisgKiBXaGVuIGVuY29kaW5nLCBvdXRwdXQgaXMgRUJDRElDICh0ZXh0KSBmb3JtYXQgYWdhaW4uCisgKiAoTm8gbmVlZCBmb3IgY29udmVyc2lvbiBpbiB0aGUgY29udl9iaW4yYXNjaWkgbWFjcm8sIGFzIHRoZQorICogdW5kZXJseWluZyB0ZXh0c3RyaW5nIGRhdGFfYmluMmFzY2lpW10gaXMgYWxyZWFkeSBFQkNESUMpCisgKi8KKyNkZWZpbmUgY29udl9iaW4yYXNjaWkoYSkJKGRhdGFfYmluMmFzY2lpWyhhKSYweDNmXSkKKyNkZWZpbmUgY29udl9hc2NpaTJiaW4oYSkJKGRhdGFfYXNjaWkyYmluW29zX3RvYXNjaWlbYV0mMHg3Zl0pCisjZW5kaWYKKworLyogNjQgY2hhciBsaW5lcworICogcGFkIGlucHV0IHdpdGggMAorICogbGVmdCBvdmVyIGNoYXJzIGFyZSBzZXQgdG8gPQorICogMSBieXRlICA9PiB4eD09CisgKiAyIGJ5dGVzID0+IHh4eD0KKyAqIDMgYnl0ZXMgPT4geHh4eAorICovCisjZGVmaW5lIEJJTl9QRVJfTElORSAgICAoNjQvNCozKQorI2RlZmluZSBDSFVOS1NfUEVSX0xJTkUgKDY0LzQpCisjZGVmaW5lIENIQVJfUEVSX0xJTkUgICAoNjQrMSkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF0YV9iaW4yYXNjaWlbNjVdPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlwKK2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKworLyogMHhGMCBpcyBhIEVPTE4KKyAqIDB4RjEgaXMgaWdub3JlIGJ1dCBuZXh0IG5lZWRzIHRvIGJlIDB4RjAgKGZvciBcclxuIHByb2Nlc3NpbmcpLgorICogMHhGMiBpcyBFT0YKKyAqIDB4RTAgaXMgaWdub3JlIGF0IHN0YXJ0IG9mIGxpbmUuCisgKiAweEZGIGlzIGVycm9yCisgKi8KKworI2RlZmluZSBCNjRfRU9MTgkJMHhGMAorI2RlZmluZSBCNjRfQ1IJCQkweEYxCisjZGVmaW5lIEI2NF9FT0YJCQkweEYyCisjZGVmaW5lIEI2NF9XUwkJCTB4RTAKKyNkZWZpbmUgQjY0X0VSUk9SICAgICAgIAkweEZGCisjZGVmaW5lIEI2NF9OT1RfQkFTRTY0KGEpCSgoKGEpfDB4MTMpID09IDB4RjMpCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRhdGFfYXNjaWkyYmluWzEyOF09eworCTB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkweEZGLDB4RTAsMHhGMCwweEZGLDB4RkYsMHhGMSwweEZGLDB4RkYsCisJMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCTB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwkweEUwLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsCisJMHhGRiwweEZGLDB4RkYsMHgzRSwweEZGLDB4RjIsMHhGRiwweDNGLAorCTB4MzQsMHgzNSwweDM2LDB4MzcsMHgzOCwweDM5LDB4M0EsMHgzQiwKKwkweDNDLDB4M0QsMHhGRiwweEZGLDB4RkYsMHgwMCwweEZGLDB4RkYsCisJMHhGRiwweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LAorCTB4MDcsMHgwOCwweDA5LDB4MEEsMHgwQiwweDBDLDB4MEQsMHgwRSwKKwkweDBGLDB4MTAsMHgxMSwweDEyLDB4MTMsMHgxNCwweDE1LDB4MTYsCisJMHgxNywweDE4LDB4MTksMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLAorCTB4RkYsMHgxQSwweDFCLDB4MUMsMHgxRCwweDFFLDB4MUYsMHgyMCwKKwkweDIxLDB4MjIsMHgyMywweDI0LDB4MjUsMHgyNiwweDI3LDB4MjgsCisJMHgyOSwweDJBLDB4MkIsMHgyQywweDJELDB4MkUsMHgyRiwweDMwLAorCTB4MzEsMHgzMiwweDMzLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwKKwl9OworCit2b2lkIEVWUF9FbmNvZGVJbml0KEVWUF9FTkNPREVfQ1RYICpjdHgpCisJeworCWN0eC0+bGVuZ3RoPTQ4OworCWN0eC0+bnVtPTA7CisJY3R4LT5saW5lX251bT0wOworCX0KKwordm9pZCBFVlBfRW5jb2RlVXBkYXRlKEVWUF9FTkNPREVfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmwpCisJeworCWludCBpLGo7CisJdW5zaWduZWQgaW50IHRvdGFsPTA7CisKKwkqb3V0bD0wOworCWlmIChpbmwgPT0gMCkgcmV0dXJuOworCU9QRU5TU0xfYXNzZXJ0KGN0eC0+bGVuZ3RoIDw9IChpbnQpc2l6ZW9mKGN0eC0+ZW5jX2RhdGEpKTsKKwlpZiAoKGN0eC0+bnVtK2lubCkgPCBjdHgtPmxlbmd0aCkKKwkJeworCQltZW1jcHkoJihjdHgtPmVuY19kYXRhW2N0eC0+bnVtXSksaW4saW5sKTsKKwkJY3R4LT5udW0rPWlubDsKKwkJcmV0dXJuOworCQl9CisJaWYgKGN0eC0+bnVtICE9IDApCisJCXsKKwkJaT1jdHgtPmxlbmd0aC1jdHgtPm51bTsKKwkJbWVtY3B5KCYoY3R4LT5lbmNfZGF0YVtjdHgtPm51bV0pLGluLGkpOworCQlpbis9aTsKKwkJaW5sLT1pOworCQlqPUVWUF9FbmNvZGVCbG9jayhvdXQsY3R4LT5lbmNfZGF0YSxjdHgtPmxlbmd0aCk7CisJCWN0eC0+bnVtPTA7CisJCW91dCs9ajsKKwkJKihvdXQrKyk9J1xuJzsKKwkJKm91dD0nXDAnOworCQl0b3RhbD1qKzE7CisJCX0KKwl3aGlsZSAoaW5sID49IGN0eC0+bGVuZ3RoKQorCQl7CisJCWo9RVZQX0VuY29kZUJsb2NrKG91dCxpbixjdHgtPmxlbmd0aCk7CisJCWluKz1jdHgtPmxlbmd0aDsKKwkJaW5sLT1jdHgtPmxlbmd0aDsKKwkJb3V0Kz1qOworCQkqKG91dCsrKT0nXG4nOworCQkqb3V0PSdcMCc7CisJCXRvdGFsKz1qKzE7CisJCX0KKwlpZiAoaW5sICE9IDApCisJCW1lbWNweSgmKGN0eC0+ZW5jX2RhdGFbMF0pLGluLGlubCk7CisJY3R4LT5udW09aW5sOworCSpvdXRsPXRvdGFsOworCX0KKwordm9pZCBFVlBfRW5jb2RlRmluYWwoRVZQX0VOQ09ERV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGwpCisJeworCXVuc2lnbmVkIGludCByZXQ9MDsKKworCWlmIChjdHgtPm51bSAhPSAwKQorCQl7CisJCXJldD1FVlBfRW5jb2RlQmxvY2sob3V0LGN0eC0+ZW5jX2RhdGEsY3R4LT5udW0pOworCQlvdXRbcmV0KytdPSdcbic7CisJCW91dFtyZXRdPSdcMCc7CisJCWN0eC0+bnVtPTA7CisJCX0KKwkqb3V0bD1yZXQ7CisJfQorCitpbnQgRVZQX0VuY29kZUJsb2NrKHVuc2lnbmVkIGNoYXIgKnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsIGludCBkbGVuKQorCXsKKwlpbnQgaSxyZXQ9MDsKKwl1bnNpZ25lZCBsb25nIGw7CisKKwlmb3IgKGk9ZGxlbjsgaSA+IDA7IGktPTMpCisJCXsKKwkJaWYgKGkgPj0gMykKKwkJCXsKKwkJCWw9CSgoKHVuc2lnbmVkIGxvbmcpZlswXSk8PDE2TCl8CisJCQkJKCgodW5zaWduZWQgbG9uZylmWzFdKTw8IDhMKXxmWzJdOworCQkJKih0KyspPWNvbnZfYmluMmFzY2lpKGw+PjE4TCk7CisJCQkqKHQrKyk9Y29udl9iaW4yYXNjaWkobD4+MTJMKTsKKwkJCSoodCsrKT1jb252X2JpbjJhc2NpaShsPj4gNkwpOworCQkJKih0KyspPWNvbnZfYmluMmFzY2lpKGwgICAgICk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWw9KCh1bnNpZ25lZCBsb25nKWZbMF0pPDwxNkw7CisJCQlpZiAoaSA9PSAyKSBsfD0oKHVuc2lnbmVkIGxvbmcpZlsxXTw8OEwpOworCisJCQkqKHQrKyk9Y29udl9iaW4yYXNjaWkobD4+MThMKTsKKwkJCSoodCsrKT1jb252X2JpbjJhc2NpaShsPj4xMkwpOworCQkJKih0KyspPShpID09IDEpPyc9Jzpjb252X2JpbjJhc2NpaShsPj4gNkwpOworCQkJKih0KyspPSc9JzsKKwkJCX0KKwkJcmV0Kz00OworCQlmKz0zOworCQl9CisKKwkqdD0nXDAnOworCXJldHVybihyZXQpOworCX0KKwordm9pZCBFVlBfRGVjb2RlSW5pdChFVlBfRU5DT0RFX0NUWCAqY3R4KQorCXsKKwljdHgtPmxlbmd0aD0zMDsKKwljdHgtPm51bT0wOworCWN0eC0+bGluZV9udW09MDsKKwljdHgtPmV4cGVjdF9ubD0wOworCX0KKworLyogLTEgZm9yIGVycm9yCisgKiAgMCBmb3IgbGFzdCBsaW5lCisgKiAgMSBmb3IgZnVsbCBsaW5lCisgKi8KK2ludCBFVlBfRGVjb2RlVXBkYXRlKEVWUF9FTkNPREVfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmwpCisJeworCWludCBzZW9mPSAtMSxlb2Y9MCxydj0gLTEscmV0PTAsaSx2LHRtcCxuLGxuLHRtcDIsZXhwX25sOworCXVuc2lnbmVkIGNoYXIgKmQ7CisKKwluPWN0eC0+bnVtOworCWQ9Y3R4LT5lbmNfZGF0YTsKKwlsbj1jdHgtPmxpbmVfbnVtOworCWV4cF9ubD1jdHgtPmV4cGVjdF9ubDsKKworCS8qIGxhc3QgbGluZSBvZiBpbnB1dC4gKi8KKwlpZiAoKGlubCA9PSAwKSB8fCAoKG4gPT0gMCkgJiYgKGNvbnZfYXNjaWkyYmluKGluWzBdKSA9PSBCNjRfRU9GKSkpCisJCXsgcnY9MDsgZ290byBlbmQ7IH0KKwkJCisJLyogV2UgcGFyc2UgdGhlIGlucHV0IGRhdGEgKi8KKwlmb3IgKGk9MDsgaTxpbmw7IGkrKykKKwkJeworCQkvKiBJZiB0aGUgY3VycmVudCBsaW5lIGlzID4gODAgY2hhcmFjdGVycywgc2NyZWFtIGFsb3QgKi8KKwkJaWYgKGxuID49IDgwKSB7IHJ2PSAtMTsgZ290byBlbmQ7IH0KKworCQkvKiBHZXQgY2hhciBhbmQgcHV0IGl0IGludG8gdGhlIGJ1ZmZlciAqLworCQl0bXA9ICooaW4rKyk7CisJCXY9Y29udl9hc2NpaTJiaW4odG1wKTsKKwkJLyogb25seSBzYXZlIHRoZSBnb29kIGRhdGEgOi0pICovCisJCWlmICghQjY0X05PVF9CQVNFNjQodikpCisJCQl7CisJCQlPUEVOU1NMX2Fzc2VydChuIDwgKGludClzaXplb2YoY3R4LT5lbmNfZGF0YSkpOworCQkJZFtuKytdPXRtcDsKKwkJCWxuKys7CisJCQl9CisJCWVsc2UgaWYgKHYgPT0gQjY0X0VSUk9SKQorCQkJeworCQkJcnY9IC0xOworCQkJZ290byBlbmQ7CisJCQl9CisKKwkJLyogaGF2ZSB3ZSBzZWVuIGEgJz0nIHdoaWNoIGlzICdkZWZpbml0bHknIHRoZSBsYXN0CisJCSAqIGlucHV0IGxpbmUuICBzZW9mIHdpbGwgcG9pbnQgdG8gdGhlIGNoYXJhY3RlciB0aGF0CisJCSAqIGhvbGRzIGl0LiBhbmQgZW9mIHdpbGwgaG9sZCBob3cgbWFueSBjaGFyYWN0ZXJzIHRvCisJCSAqIGNob3Agb2ZmLiAqLworCQlpZiAodG1wID09ICc9JykKKwkJCXsKKwkJCWlmIChzZW9mID09IC0xKSBzZW9mPW47CisJCQllb2YrKzsKKwkJCX0KKworCQlpZiAodiA9PSBCNjRfQ1IpCisJCQl7CisJCQlsbiA9IDA7CisJCQlpZiAoZXhwX25sKQorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCS8qIGVvbG4gKi8KKwkJaWYgKHYgPT0gQjY0X0VPTE4pCisJCQl7CisJCQlsbj0wOworCQkJaWYgKGV4cF9ubCkKKwkJCQl7CisJCQkJZXhwX25sPTA7CisJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQlleHBfbmw9MDsKKworCQkvKiBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiBpbnB1dCBhbmQgaXQgbG9va3MgbGlrZSBhCisJCSAqIGxpbmUsIHByb2Nlc3MgaXQuICovCisJCWlmICgoKGkrMSkgPT0gaW5sKSAmJiAoKChuJjMpID09IDApIHx8IGVvZikpCisJCQl7CisJCQl2PUI2NF9FT0Y7CisJCQkvKiBJbiBjYXNlIHRoaW5ncyB3ZXJlIGdpdmVuIHVzIGluIHJlYWxseSBzbWFsbAorCQkJICAgcmVjb3JkcyAoc28gdHdvICc9JyB3ZXJlIGdpdmVuIGluIHNlcGFyYXRlCisJCQkgICB1cGRhdGVzKSwgZW9mIG1heSBjb250YWluIHRoZSBpbmNvcnJlY3QgbnVtYmVyCisJCQkgICBvZiBlbmRpbmcgYnl0ZXMgdG8gc2tpcCwgc28gbGV0J3MgcmVkbyB0aGUgY291bnQgKi8KKwkJCWVvZiA9IDA7CisJCQlpZiAoZFtuLTFdID09ICc9JykgZW9mKys7CisJCQlpZiAoZFtuLTJdID09ICc9JykgZW9mKys7CisJCQkvKiBUaGVyZSB3aWxsIG5ldmVyIGJlIG1vcmUgdGhhbiB0d28gJz0nICovCisJCQl9CisKKwkJaWYgKCh2ID09IEI2NF9FT0YgJiYgKG4mMykgPT0gMCkgfHwgKG4gPj0gNjQpKQorCQkJeworCQkJLyogVGhpcyBpcyBuZWVkZWQgdG8gd29yayBjb3JyZWN0bHkgb24gNjQgYnl0ZSBpbnB1dAorCQkJICogbGluZXMuICBXZSBwcm9jZXNzIHRoZSBsaW5lIGFuZCB0aGVuIG5lZWQgdG8KKwkJCSAqIGFjY2VwdCB0aGUgJ1xuJyAqLworCQkJaWYgKCh2ICE9IEI2NF9FT0YpICYmIChuID49IDY0KSkgZXhwX25sPTE7CisJCQl0bXAyPXY7CisJCQlpZiAobiA+IDApCisJCQkJeworCQkJCXY9RVZQX0RlY29kZUJsb2NrKG91dCxkLG4pOworCQkJCW49MDsKKwkJCQlpZiAodiA8IDApIHsgcnY9MDsgZ290byBlbmQ7IH0KKwkJCQlyZXQrPSh2LWVvZik7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQllb2Y9MTsKKwkJCQl2PTA7CisJCQkJfQorCisJCQkvKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgaGFkIGEgc2hvcnQKKwkJCSAqIGJ1dCB2YWxpZCBpbnB1dCBsaW5lICovCisJCQlpZiAoKHYgPCBjdHgtPmxlbmd0aCkgJiYgZW9mKQorCQkJCXsKKwkJCQlydj0wOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWVsc2UKKwkJCQljdHgtPmxlbmd0aD12OworCisJCQlpZiAoc2VvZiA+PSAwKSB7IHJ2PTA7IGdvdG8gZW5kOyB9CisJCQlvdXQrPXY7CisJCQl9CisJCX0KKwlydj0xOworZW5kOgorCSpvdXRsPXJldDsKKwljdHgtPm51bT1uOworCWN0eC0+bGluZV9udW09bG47CisJY3R4LT5leHBlY3Rfbmw9ZXhwX25sOworCXJldHVybihydik7CisJfQorCitpbnQgRVZQX0RlY29kZUJsb2NrKHVuc2lnbmVkIGNoYXIgKnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsIGludCBuKQorCXsKKwlpbnQgaSxyZXQ9MCxhLGIsYyxkOworCXVuc2lnbmVkIGxvbmcgbDsKKworCS8qIHRyaW0gd2hpdGUgc3BhY2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuICovCisJd2hpbGUgKChjb252X2FzY2lpMmJpbigqZikgPT0gQjY0X1dTKSAmJiAobiA+IDApKQorCQl7CisJCWYrKzsKKwkJbi0tOworCQl9CisKKwkvKiBzdHJpcCBvZmYgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgbGluZQorCSAqIGFzY2lpMmJpbiB2YWx1ZXMgQjY0X1dTLCBCNjRfRU9MTiwgQjY0X0VPTE4gYW5kIEI2NF9FT0YgKi8KKwl3aGlsZSAoKG4gPiAzKSAmJiAoQjY0X05PVF9CQVNFNjQoY29udl9hc2NpaTJiaW4oZltuLTFdKSkpKQorCQluLS07CisKKwlpZiAobiU0ICE9IDApIHJldHVybigtMSk7CisKKwlmb3IgKGk9MDsgaTxuOyBpKz00KQorCQl7CisJCWE9Y29udl9hc2NpaTJiaW4oKihmKyspKTsKKwkJYj1jb252X2FzY2lpMmJpbigqKGYrKykpOworCQljPWNvbnZfYXNjaWkyYmluKCooZisrKSk7CisJCWQ9Y29udl9hc2NpaTJiaW4oKihmKyspKTsKKwkJaWYgKAkoYSAmIDB4ODApIHx8IChiICYgMHg4MCkgfHwKKwkJCShjICYgMHg4MCkgfHwgKGQgJiAweDgwKSkKKwkJCXJldHVybigtMSk7CisJCWw9KAkoKCh1bnNpZ25lZCBsb25nKWEpPDwxOEwpfAorCQkJKCgodW5zaWduZWQgbG9uZyliKTw8MTJMKXwKKwkJCSgoKHVuc2lnbmVkIGxvbmcpYyk8PCA2TCl8CisJCQkoKCh1bnNpZ25lZCBsb25nKWQpICAgICApKTsKKwkJKih0KyspPSh1bnNpZ25lZCBjaGFyKShsPj4xNkwpJjB4ZmY7CisJCSoodCsrKT0odW5zaWduZWQgY2hhcikobD4+IDhMKSYweGZmOworCQkqKHQrKyk9KHVuc2lnbmVkIGNoYXIpKGwgICAgICkmMHhmZjsKKwkJcmV0Kz0zOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgRVZQX0RlY29kZUZpbmFsKEVWUF9FTkNPREVfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsKQorCXsKKwlpbnQgaTsKKworCSpvdXRsPTA7CisJaWYgKGN0eC0+bnVtICE9IDApCisJCXsKKwkJaT1FVlBfRGVjb2RlQmxvY2sob3V0LGN0eC0+ZW5jX2RhdGEsY3R4LT5udW0pOworCQlpZiAoaSA8IDApIHJldHVybigtMSk7CisJCWN0eC0+bnVtPTA7CisJCSpvdXRsPWk7CisJCXJldHVybigxKTsKKwkJfQorCWVsc2UKKwkJcmV0dXJuKDEpOworCX0KKworI2lmZGVmIHVuZGVmCitpbnQgRVZQX0RlY29kZVZhbGlkKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKKwl7CisJaW50IGksbnVtPTAsYmFkPTA7CisKKwlpZiAobGVuID09IDApIHJldHVybigtMSk7CisJd2hpbGUgKGNvbnZfYXNjaWkyYmluKCpidWYpID09IEI2NF9XUykKKwkJeworCQlidWYrKzsKKwkJbGVuLS07CisJCWlmIChsZW4gPT0gMCkgcmV0dXJuKC0xKTsKKwkJfQorCisJZm9yIChpPWxlbjsgaSA+PSA0OyBpLT00KQorCQl7CisJCWlmICgJKGNvbnZfYXNjaWkyYmluKGJ1ZlswXSkgPj0gMHg0MCkgfHwKKwkJCShjb252X2FzY2lpMmJpbihidWZbMV0pID49IDB4NDApIHx8CisJCQkoY29udl9hc2NpaTJiaW4oYnVmWzJdKSA+PSAweDQwKSB8fAorCQkJKGNvbnZfYXNjaWkyYmluKGJ1ZlszXSkgPj0gMHg0MCkpCisJCQlyZXR1cm4oLTEpOworCQlidWYrPTQ7CisJCW51bSs9MSsoYnVmWzJdICE9ICc9JykrKGJ1ZlszXSAhPSAnPScpOworCQl9CisJaWYgKChpID09IDEpICYmIChjb252X2FzY2lpMmJpbihidWZbMF0pID09IEI2NF9FT0xOKSkKKwkJcmV0dXJuKG51bSk7CisJaWYgKChpID09IDIpICYmIChjb252X2FzY2lpMmJpbihidWZbMF0pID09IEI2NF9FT0xOKSAmJgorCQkoY29udl9hc2NpaTJiaW4oYnVmWzBdKSA9PSBCNjRfRU9MTikpCisJCXJldHVybihudW0pOworCXJldHVybigxKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTc5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cC5oCkBAIC0wLDAgKzEsMTMyNCBAQAorLyogY3J5cHRvL2V2cC9ldnAuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9FTlZFTE9QRV9ICisjZGVmaW5lIEhFQURFUl9FTlZFTE9QRV9ICisKKyNpZmRlZiBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCisjIGluY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNlbHNlCisjIGRlZmluZSBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCisjIGluY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyMgdW5kZWYgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUworI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisKKy8qCisjZGVmaW5lIEVWUF9SQzJfS0VZX1NJWkUJCTE2CisjZGVmaW5lIEVWUF9SQzRfS0VZX1NJWkUJCTE2CisjZGVmaW5lIEVWUF9CTE9XRklTSF9LRVlfU0laRQkJMTYKKyNkZWZpbmUgRVZQX0NBU1Q1X0tFWV9TSVpFCQkxNgorI2RlZmluZSBFVlBfUkM1XzMyXzEyXzE2X0tFWV9TSVpFCTE2CisqLworI2RlZmluZSBFVlBfTUFYX01EX1NJWkUJCQk2NAkvKiBsb25nZXN0IGtub3duIGlzIFNIQTUxMiAqLworI2RlZmluZSBFVlBfTUFYX0tFWV9MRU5HVEgJCTMyCisjZGVmaW5lIEVWUF9NQVhfSVZfTEVOR1RICQkxNgorI2RlZmluZSBFVlBfTUFYX0JMT0NLX0xFTkdUSAkJMzIKKworI2RlZmluZSBQS0NTNV9TQUxUX0xFTgkJCTgKKy8qIERlZmF1bHQgUEtDUyM1IGl0ZXJhdGlvbiBjb3VudCAqLworI2RlZmluZSBQS0NTNV9ERUZBVUxUX0lURVIJCTIwNDgKKworI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorCisjZGVmaW5lIEVWUF9QS19SU0EJMHgwMDAxCisjZGVmaW5lIEVWUF9QS19EU0EJMHgwMDAyCisjZGVmaW5lIEVWUF9QS19ESAkweDAwMDQKKyNkZWZpbmUgRVZQX1BLX0VDCTB4MDAwOAorI2RlZmluZSBFVlBfUEtUX1NJR04JMHgwMDEwCisjZGVmaW5lIEVWUF9QS1RfRU5DCTB4MDAyMAorI2RlZmluZSBFVlBfUEtUX0VYQ0gJMHgwMDQwCisjZGVmaW5lIEVWUF9QS1NfUlNBCTB4MDEwMAorI2RlZmluZSBFVlBfUEtTX0RTQQkweDAyMDAKKyNkZWZpbmUgRVZQX1BLU19FQwkweDA0MDAKKyNkZWZpbmUgRVZQX1BLVF9FWFAJMHgxMDAwIC8qIDw9IDUxMiBiaXQga2V5ICovCisKKyNkZWZpbmUgRVZQX1BLRVlfTk9ORQlOSURfdW5kZWYKKyNkZWZpbmUgRVZQX1BLRVlfUlNBCU5JRF9yc2FFbmNyeXB0aW9uCisjZGVmaW5lIEVWUF9QS0VZX1JTQTIJTklEX3JzYQorI2RlZmluZSBFVlBfUEtFWV9EU0EJTklEX2RzYQorI2RlZmluZSBFVlBfUEtFWV9EU0ExCU5JRF9kc2FfMgorI2RlZmluZSBFVlBfUEtFWV9EU0EyCU5JRF9kc2FXaXRoU0hBCisjZGVmaW5lIEVWUF9QS0VZX0RTQTMJTklEX2RzYVdpdGhTSEExCisjZGVmaW5lIEVWUF9QS0VZX0RTQTQJTklEX2RzYVdpdGhTSEExXzIKKyNkZWZpbmUgRVZQX1BLRVlfREgJTklEX2RoS2V5QWdyZWVtZW50CisjZGVmaW5lIEVWUF9QS0VZX0VDCU5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleQorI2RlZmluZSBFVlBfUEtFWV9ITUFDCU5JRF9obWFjCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVHlwZSBuZWVkcyB0byBiZSBhIGJpdCBmaWVsZAorICogU3ViLXR5cGUgbmVlZHMgdG8gYmUgZm9yIHZhcmlhdGlvbnMgb24gdGhlIG1ldGhvZCwgYXMgaW4sIGNhbiBpdCBkbworICogYXJiaXRyYXJ5IGVuY3J5cHRpb24uLi4uICovCitzdHJ1Y3QgZXZwX3BrZXlfc3QKKwl7CisJaW50IHR5cGU7CisJaW50IHNhdmVfdHlwZTsKKwlpbnQgcmVmZXJlbmNlczsKKwljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisJRU5HSU5FICplbmdpbmU7CisJdW5pb24JeworCQljaGFyICpwdHI7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCXN0cnVjdCByc2Ffc3QgKnJzYTsJLyogUlNBICovCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkJc3RydWN0IGRzYV9zdCAqZHNhOwkvKiBEU0EgKi8KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCXN0cnVjdCBkaF9zdCAqZGg7CS8qIERIICovCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCQlzdHJ1Y3QgZWNfa2V5X3N0ICplYzsJLyogRUNDICovCisjZW5kaWYKKwkJfSBwa2V5OworCWludCBzYXZlX3BhcmFtZXRlcnM7CisJU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICphdHRyaWJ1dGVzOyAvKiBbIDAgXSAqLworCX0gLyogRVZQX1BLRVkgKi87CisKKyNkZWZpbmUgRVZQX1BLRVlfTU9fU0lHTgkweDAwMDEKKyNkZWZpbmUgRVZQX1BLRVlfTU9fVkVSSUZZCTB4MDAwMgorI2RlZmluZSBFVlBfUEtFWV9NT19FTkNSWVBUCTB4MDAwNAorI2RlZmluZSBFVlBfUEtFWV9NT19ERUNSWVBUCTB4MDAwOAorCisjaWZuZGVmIEVWUF9NRAorc3RydWN0IGVudl9tZF9zdAorCXsKKwlpbnQgdHlwZTsKKwlpbnQgcGtleV90eXBlOworCWludCBtZF9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICgqaW5pdCkoRVZQX01EX0NUWCAqY3R4KTsKKwlpbnQgKCp1cGRhdGUpKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCk7CisJaW50ICgqZmluYWwpKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCk7CisJaW50ICgqY29weSkoRVZQX01EX0NUWCAqdG8sY29uc3QgRVZQX01EX0NUWCAqZnJvbSk7CisJaW50ICgqY2xlYW51cCkoRVZQX01EX0NUWCAqY3R4KTsKKworCS8qIEZJWE1FOiBwcm90b3R5cGUgdGhlc2Ugc29tZSBkYXkgKi8KKwlpbnQgKCpzaWduKShpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqbSwgdW5zaWduZWQgaW50IG1fbGVuZ3RoLAorCQkgICAgdW5zaWduZWQgY2hhciAqc2lncmV0LCB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgdm9pZCAqa2V5KTsKKwlpbnQgKCp2ZXJpZnkpKGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICptLCB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ2J1ZiwgdW5zaWduZWQgaW50IHNpZ2xlbiwKKwkJICAgICAgdm9pZCAqa2V5KTsKKwlpbnQgcmVxdWlyZWRfcGtleV90eXBlWzVdOyAvKkVWUF9QS0VZX3h4eCAqLworCWludCBibG9ja19zaXplOworCWludCBjdHhfc2l6ZTsgLyogaG93IGJpZyBkb2VzIHRoZSBjdHgtPm1kX2RhdGEgbmVlZCB0byBiZSAqLworCS8qIGNvbnRyb2wgZnVuY3Rpb24gKi8KKwlpbnQgKCptZF9jdHJsKShFVlBfTURfQ1RYICpjdHgsIGludCBjbWQsIGludCBwMSwgdm9pZCAqcDIpOworCX0gLyogRVZQX01EICovOworCit0eXBlZGVmIGludCBldnBfc2lnbl9tZXRob2QoaW50IHR5cGUsY29uc3QgdW5zaWduZWQgY2hhciAqbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsdW5zaWduZWQgY2hhciAqc2lncmV0LAorCQkJICAgIHVuc2lnbmVkIGludCAqc2lnbGVuLCB2b2lkICprZXkpOwordHlwZWRlZiBpbnQgZXZwX3ZlcmlmeV9tZXRob2QoaW50IHR5cGUsY29uc3QgdW5zaWduZWQgY2hhciAqbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLAorCQkJICAgIHVuc2lnbmVkIGludCBzaWdsZW4sIHZvaWQgKmtleSk7CisKKyNkZWZpbmUgRVZQX01EX0ZMQUdfT05FU0hPVAkweDAwMDEgLyogZGlnZXN0IGNhbiBvbmx5IGhhbmRsZSBhIHNpbmdsZQorCQkJCQkqIGJsb2NrICovCisKKyNkZWZpbmUgRVZQX01EX0ZMQUdfUEtFWV9ESUdFU1QJMHgwMDAyIC8qIGRpZ2VzdCBpcyBhICJjbG9uZSIgZGlnZXN0IHVzZWQKKwkJCQkJKiB3aGljaCBpcyBhIGNvcHkgb2YgYW4gZXhpc3RpbmcKKwkJCQkJKiBvbmUgZm9yIGEgc3BlY2lmaWMgcHVibGljIGtleSB0eXBlLgorCQkJCQkqIEVWUF9kc3MxKCkgZXRjICovCisKKy8qIERpZ2VzdCB1c2VzIEVWUF9QS0VZX01FVEhPRCBmb3Igc2lnbmluZyBpbnN0ZWFkIG9mIE1EIHNwZWNpZmljIHNpZ25pbmcgKi8KKworI2RlZmluZSBFVlBfTURfRkxBR19QS0VZX01FVEhPRF9TSUdOQVRVUkUJMHgwMDA0CisKKy8qIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXIgZmxhZ3MuLi4gKi8KKworI2RlZmluZSBFVlBfTURfRkxBR19ESUdBTEdJRF9NQVNLCQkweDAwMTgKKworLyogTlVMTCBvciBhYnNlbnQgcGFyYW1ldGVyIGFjY2VwdGVkLiBVc2UgTlVMTCAqLworCisjZGVmaW5lIEVWUF9NRF9GTEFHX0RJR0FMR0lEX05VTEwJCTB4MDAwMAorCisvKiBOVUxMIG9yIGFic2VudCBwYXJhbWV0ZXIgYWNjZXB0ZWQuIFVzZSBOVUxMIGZvciBQS0NTIzEgb3RoZXJ3aXNlIGFic2VudCAqLworCisjZGVmaW5lIEVWUF9NRF9GTEFHX0RJR0FMR0lEX0FCU0VOVAkJMHgwMDA4CisKKy8qIEN1c3RvbSBoYW5kbGluZyB2aWEgY3RybCAqLworCisjZGVmaW5lIEVWUF9NRF9GTEFHX0RJR0FMR0lEX0NVU1RPTQkJMHgwMDE4CisKKy8qIERpZ2VzdCBjdHJscyAqLworCisjZGVmaW5lCUVWUF9NRF9DVFJMX0RJR0FMR0lECQkJMHgxCisjZGVmaW5lCUVWUF9NRF9DVFJMX01JQ0FMRwkJCTB4MgorCisvKiBNaW5pbXVtIEFsZ29yaXRobSBzcGVjaWZpYyBjdHJsIHZhbHVlICovCisKKyNkZWZpbmUJRVZQX01EX0NUUkxfQUxHX0NUUkwJCQkweDEwMDAKKworI2RlZmluZSBFVlBfUEtFWV9OVUxMX21ldGhvZAlOVUxMLE5VTEwsezAsMCwwLDB9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNkZWZpbmUgRVZQX1BLRVlfRFNBX21ldGhvZAkoZXZwX3NpZ25fbWV0aG9kICopRFNBX3NpZ24sIFwKKwkJCQkoZXZwX3ZlcmlmeV9tZXRob2QgKilEU0FfdmVyaWZ5LCBcCisJCQkJe0VWUF9QS0VZX0RTQSxFVlBfUEtFWV9EU0EyLEVWUF9QS0VZX0RTQTMsIFwKKwkJCQkJRVZQX1BLRVlfRFNBNCwwfQorI2Vsc2UKKyNkZWZpbmUgRVZQX1BLRVlfRFNBX21ldGhvZAlFVlBfUEtFWV9OVUxMX21ldGhvZAorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorI2RlZmluZSBFVlBfUEtFWV9FQ0RTQV9tZXRob2QgICAoZXZwX3NpZ25fbWV0aG9kICopRUNEU0Ffc2lnbiwgXAorCQkJCShldnBfdmVyaWZ5X21ldGhvZCAqKUVDRFNBX3ZlcmlmeSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0VWUF9QS0VZX0VDLDAsMCwwfQorI2Vsc2UgICAKKyNkZWZpbmUgRVZQX1BLRVlfRUNEU0FfbWV0aG9kICAgRVZQX1BLRVlfTlVMTF9tZXRob2QKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjZGVmaW5lIEVWUF9QS0VZX1JTQV9tZXRob2QJKGV2cF9zaWduX21ldGhvZCAqKVJTQV9zaWduLCBcCisJCQkJKGV2cF92ZXJpZnlfbWV0aG9kICopUlNBX3ZlcmlmeSwgXAorCQkJCXtFVlBfUEtFWV9SU0EsRVZQX1BLRVlfUlNBMiwwLDB9CisjZGVmaW5lIEVWUF9QS0VZX1JTQV9BU04xX09DVEVUX1NUUklOR19tZXRob2QgXAorCQkJCShldnBfc2lnbl9tZXRob2QgKilSU0Ffc2lnbl9BU04xX09DVEVUX1NUUklORywgXAorCQkJCShldnBfdmVyaWZ5X21ldGhvZCAqKVJTQV92ZXJpZnlfQVNOMV9PQ1RFVF9TVFJJTkcsIFwKKwkJCQl7RVZQX1BLRVlfUlNBLEVWUF9QS0VZX1JTQTIsMCwwfQorI2Vsc2UKKyNkZWZpbmUgRVZQX1BLRVlfUlNBX21ldGhvZAlFVlBfUEtFWV9OVUxMX21ldGhvZAorI2RlZmluZSBFVlBfUEtFWV9SU0FfQVNOMV9PQ1RFVF9TVFJJTkdfbWV0aG9kIEVWUF9QS0VZX05VTExfbWV0aG9kCisjZW5kaWYKKworI2VuZGlmIC8qICFFVlBfTUQgKi8KKworc3RydWN0IGVudl9tZF9jdHhfc3QKKwl7CisJY29uc3QgRVZQX01EICpkaWdlc3Q7CisJRU5HSU5FICplbmdpbmU7IC8qIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGlmICdkaWdlc3QnIGlzIEVOR0lORS1wcm92aWRlZCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAqbWRfZGF0YTsKKwkvKiBQdWJsaWMga2V5IGNvbnRleHQgZm9yIHNpZ24vdmVyaWZ5ICovCisJRVZQX1BLRVlfQ1RYICpwY3R4OworCS8qIFVwZGF0ZSBmdW5jdGlvbjogdXN1YWxseSBjb3BpZWQgZnJvbSBFVlBfTUQgKi8KKwlpbnQgKCp1cGRhdGUpKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCk7CisJfSAvKiBFVlBfTURfQ1RYICovOworCisvKiB2YWx1ZXMgZm9yIEVWUF9NRF9DVFggZmxhZ3MgKi8KKworI2RlZmluZSBFVlBfTURfQ1RYX0ZMQUdfT05FU0hPVAkJMHgwMDAxIC8qIGRpZ2VzdCB1cGRhdGUgd2lsbCBiZSBjYWxsZWQKKwkJCQkJCSogb25jZSBvbmx5ICovCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19DTEVBTkVECQkweDAwMDIgLyogY29udGV4dCBoYXMgYWxyZWFkeSBiZWVuCisJCQkJCQkqIGNsZWFuZWQgKi8KKyNkZWZpbmUgRVZQX01EX0NUWF9GTEFHX1JFVVNFCQkweDAwMDQgLyogRG9uJ3QgZnJlZSB1cCBjdHgtPm1kX2RhdGEKKwkJCQkJCSogaW4gRVZQX01EX0NUWF9jbGVhbnVwICovCisvKiBGSVBTIGFuZCBwYWQgb3B0aW9ucyBhcmUgaWdub3JlZCBpbiAxLjAuMCwgZGVmaW5pdGlvbnMgYXJlIGhlcmUKKyAqIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSByZXVzZSB0aGUgdmFsdWVzIGZvciBvdGhlciBwdXJwb3Nlcy4KKyAqLworCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19OT05fRklQU19BTExPVwkweDAwMDgJLyogQWxsb3cgdXNlIG9mIG5vbiBGSVBTIGRpZ2VzdAorCQkJCQkJICogaW4gRklQUyBtb2RlICovCisKKy8qIFRoZSBmb2xsb3dpbmcgUEFEIG9wdGlvbnMgYXJlIGFsc28gY3VycmVudGx5IGlnbm9yZWQgaW4gMS4wLjAsIGRpZ2VzdAorICogcGFyYW1ldGVycyBhcmUgaGFuZGxlZCB0aHJvdWdoIEVWUF9EaWdlc3RTaWduKigpIGFuZCBFVlBfRGlnZXN0VmVyaWZ5KigpCisgKiBpbnN0ZWFkLgorICovCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19QQURfTUFTSwkweEYwCS8qIFJTQSBtb2RlIHRvIHVzZSAqLworI2RlZmluZSBFVlBfTURfQ1RYX0ZMQUdfUEFEX1BLQ1MxCTB4MDAJLyogUEtDUyMxIHYxLjUgbW9kZSAqLworI2RlZmluZSBFVlBfTURfQ1RYX0ZMQUdfUEFEX1g5MzEJMHgxMAkvKiBYOS4zMSBtb2RlICovCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19QQURfUFNTCQkweDIwCS8qIFBTUyBtb2RlICovCisKKyNkZWZpbmUgRVZQX01EX0NUWF9GTEFHX05PX0lOSVQJCTB4MDEwMCAvKiBEb24ndCBpbml0aWFsaXplIG1kX2RhdGEgKi8KKworc3RydWN0IGV2cF9jaXBoZXJfc3QKKwl7CisJaW50IG5pZDsKKwlpbnQgYmxvY2tfc2l6ZTsKKwlpbnQga2V5X2xlbjsJCS8qIERlZmF1bHQgdmFsdWUgZm9yIHZhcmlhYmxlIGxlbmd0aCBjaXBoZXJzICovCisJaW50IGl2X2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBWYXJpb3VzIGZsYWdzICovCisJaW50ICgqaW5pdCkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpOwkvKiBpbml0IGtleSAqLworCWludCAoKmRvX2NpcGhlcikoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sKTsvKiBlbmNyeXB0L2RlY3J5cHQgZGF0YSAqLworCWludCAoKmNsZWFudXApKEVWUF9DSVBIRVJfQ1RYICopOyAvKiBjbGVhbnVwIGN0eCAqLworCWludCBjdHhfc2l6ZTsJCS8qIGhvdyBiaWcgY3R4LT5jaXBoZXJfZGF0YSBuZWVkcyB0byBiZSAqLworCWludCAoKnNldF9hc24xX3BhcmFtZXRlcnMpKEVWUF9DSVBIRVJfQ1RYICosIEFTTjFfVFlQRSAqKTsgLyogUG9wdWxhdGUgYSBBU04xX1RZUEUgd2l0aCBwYXJhbWV0ZXJzICovCisJaW50ICgqZ2V0X2FzbjFfcGFyYW1ldGVycykoRVZQX0NJUEhFUl9DVFggKiwgQVNOMV9UWVBFICopOyAvKiBHZXQgcGFyYW1ldGVycyBmcm9tIGEgQVNOMV9UWVBFICovCisJaW50ICgqY3RybCkoRVZQX0NJUEhFUl9DVFggKiwgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cik7IC8qIE1pc2NlbGxhbmVvdXMgb3BlcmF0aW9ucyAqLworCXZvaWQgKmFwcF9kYXRhOwkJLyogQXBwbGljYXRpb24gZGF0YSAqLworCX0gLyogRVZQX0NJUEhFUiAqLzsKKworLyogVmFsdWVzIGZvciBjaXBoZXIgZmxhZ3MgKi8KKworLyogTW9kZXMgZm9yIGNpcGhlcnMgKi8KKworI2RlZmluZQkJRVZQX0NJUEhfU1RSRUFNX0NJUEhFUgkJMHgwCisjZGVmaW5lCQlFVlBfQ0lQSF9FQ0JfTU9ERQkJMHgxCisjZGVmaW5lCQlFVlBfQ0lQSF9DQkNfTU9ERQkJMHgyCisjZGVmaW5lCQlFVlBfQ0lQSF9DRkJfTU9ERQkJMHgzCisjZGVmaW5lCQlFVlBfQ0lQSF9PRkJfTU9ERQkJMHg0CisjZGVmaW5lIAlFVlBfQ0lQSF9NT0RFCQkJMHhGMDAwNworLyogU2V0IGlmIHZhcmlhYmxlIGxlbmd0aCBjaXBoZXIgKi8KKyNkZWZpbmUgCUVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSAkweDgKKy8qIFNldCBpZiB0aGUgaXYgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUgYnkgdGhlIGNpcGhlciBpdHNlbGYgKi8KKyNkZWZpbmUgCUVWUF9DSVBIX0NVU1RPTV9JVgkJMHgxMAorLyogU2V0IGlmIHRoZSBjaXBoZXIncyBpbml0KCkgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBpZiBrZXkgaXMgTlVMTCAqLworI2RlZmluZSAJRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVAkweDIwCisvKiBDYWxsIGN0cmwoKSB0byBpbml0IGNpcGhlciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIAlFVlBfQ0lQSF9DVFJMX0lOSVQJCTB4NDAKKy8qIERvbid0IHVzZSBzdGFuZGFyZCBrZXkgbGVuZ3RoIGZ1bmN0aW9uICovCisjZGVmaW5lIAlFVlBfQ0lQSF9DVVNUT01fS0VZX0xFTkdUSAkweDgwCisvKiBEb24ndCB1c2Ugc3RhbmRhcmQgYmxvY2sgcGFkZGluZyAqLworI2RlZmluZSAJRVZQX0NJUEhfTk9fUEFERElORwkJMHgxMDAKKy8qIGNpcGhlciBoYW5kbGVzIHJhbmRvbSBrZXkgZ2VuZXJhdGlvbiAqLworI2RlZmluZSAJRVZQX0NJUEhfUkFORF9LRVkJCTB4MjAwCisvKiBjaXBoZXIgaGFzIGl0cyBvd24gYWRkaXRpb25hbCBjb3B5aW5nIGxvZ2ljICovCisjZGVmaW5lIAlFVlBfQ0lQSF9DVVNUT01fQ09QWQkJMHg0MDAKKy8qIEFsbG93IHVzZSBkZWZhdWx0IEFTTjEgZ2V0L3NldCBpdiAqLworI2RlZmluZQkJRVZQX0NJUEhfRkxBR19ERUZBVUxUX0FTTjEJMHgxMDAwCisvKiBCdWZmZXIgbGVuZ3RoIGluIGJpdHMgbm90IGJ5dGVzOiBDRkIxIG1vZGUgb25seSAqLworI2RlZmluZQkJRVZQX0NJUEhfRkxBR19MRU5HVEhfQklUUwkweDIwMDAKKworLyogY3RybCgpIHZhbHVlcyAqLworCisjZGVmaW5lCQlFVlBfQ1RSTF9JTklUCQkJMHgwCisjZGVmaW5lIAlFVlBfQ1RSTF9TRVRfS0VZX0xFTkdUSAkJMHgxCisjZGVmaW5lIAlFVlBfQ1RSTF9HRVRfUkMyX0tFWV9CSVRTCTB4MgorI2RlZmluZSAJRVZQX0NUUkxfU0VUX1JDMl9LRVlfQklUUwkweDMKKyNkZWZpbmUgCUVWUF9DVFJMX0dFVF9SQzVfUk9VTkRTCQkweDQKKyNkZWZpbmUgCUVWUF9DVFJMX1NFVF9SQzVfUk9VTkRTCQkweDUKKyNkZWZpbmUgCUVWUF9DVFJMX1JBTkRfS0VZCQkweDYKKyNkZWZpbmUgCUVWUF9DVFJMX1BCRV9QUkZfTklECQkweDcKKyNkZWZpbmUgCUVWUF9DVFJMX0NPUFkJCQkweDgKKwordHlwZWRlZiBzdHJ1Y3QgZXZwX2NpcGhlcl9pbmZvX3N0CisJeworCWNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcjsKKwl1bnNpZ25lZCBjaGFyIGl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKKwl9IEVWUF9DSVBIRVJfSU5GTzsKKworc3RydWN0IGV2cF9jaXBoZXJfY3R4X3N0CisJeworCWNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcjsKKwlFTkdJTkUgKmVuZ2luZTsJLyogZnVuY3Rpb25hbCByZWZlcmVuY2UgaWYgJ2NpcGhlcicgaXMgRU5HSU5FLXByb3ZpZGVkICovCisJaW50IGVuY3J5cHQ7CQkvKiBlbmNyeXB0IG9yIGRlY3J5cHQgKi8KKwlpbnQgYnVmX2xlbjsJCS8qIG51bWJlciB3ZSBoYXZlIGxlZnQgKi8KKworCXVuc2lnbmVkIGNoYXIgIG9pdltFVlBfTUFYX0lWX0xFTkdUSF07CS8qIG9yaWdpbmFsIGl2ICovCisJdW5zaWduZWQgY2hhciAgaXZbRVZQX01BWF9JVl9MRU5HVEhdOwkvKiB3b3JraW5nIGl2ICovCisJdW5zaWduZWQgY2hhciBidWZbRVZQX01BWF9CTE9DS19MRU5HVEhdOy8qIHNhdmVkIHBhcnRpYWwgYmxvY2sgKi8KKwlpbnQgbnVtOwkJCQkvKiB1c2VkIGJ5IGNmYi9vZmIgbW9kZSAqLworCisJdm9pZCAqYXBwX2RhdGE7CQkvKiBhcHBsaWNhdGlvbiBzdHVmZiAqLworCWludCBrZXlfbGVuOwkJLyogTWF5IGNoYW5nZSBmb3IgdmFyaWFibGUgbGVuZ3RoIGNpcGhlciAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIFZhcmlvdXMgZmxhZ3MgKi8KKwl2b2lkICpjaXBoZXJfZGF0YTsgLyogcGVyIEVWUCBkYXRhICovCisJaW50IGZpbmFsX3VzZWQ7CisJaW50IGJsb2NrX21hc2s7CisJdW5zaWduZWQgY2hhciBmaW5hbFtFVlBfTUFYX0JMT0NLX0xFTkdUSF07LyogcG9zc2libGUgZmluYWwgYmxvY2sgKi8KKwl9IC8qIEVWUF9DSVBIRVJfQ1RYICovOworCit0eXBlZGVmIHN0cnVjdCBldnBfRW5jb2RlX0N0eF9zdAorCXsKKwlpbnQgbnVtOwkvKiBudW1iZXIgc2F2ZWQgaW4gYSBwYXJ0aWFsIGVuY29kZS9kZWNvZGUgKi8KKwlpbnQgbGVuZ3RoOwkvKiBUaGUgbGVuZ3RoIGlzIGVpdGhlciB0aGUgb3V0cHV0IGxpbmUgbGVuZ3RoCisJCQkgKiAoaW4gaW5wdXQgYnl0ZXMpIG9yIHRoZSBzaG9ydGVzdCBpbnB1dCBsaW5lCisJCQkgKiBsZW5ndGggdGhhdCBpcyBvay4gIE9uY2UgZGVjb2RpbmcgYmVnaW5zLAorCQkJICogdGhlIGxlbmd0aCBpcyBhZGp1c3RlZCB1cCBlYWNoIHRpbWUgYSBsb25nZXIKKwkJCSAqIGxpbmUgaXMgZGVjb2RlZCAqLworCXVuc2lnbmVkIGNoYXIgZW5jX2RhdGFbODBdOwkvKiBkYXRhIHRvIGVuY29kZSAqLworCWludCBsaW5lX251bTsJLyogbnVtYmVyIHJlYWQgb24gY3VycmVudCBsaW5lICovCisJaW50IGV4cGVjdF9ubDsKKwl9IEVWUF9FTkNPREVfQ1RYOworCisvKiBQYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIGZ1bmN0aW9uICovCit0eXBlZGVmIGludCAoRVZQX1BCRV9LRVlHRU4pKEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCQlBU04xX1RZUEUgKnBhcmFtLCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsCisgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICptZCwgaW50IGVuX2RlKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2RlZmluZSBFVlBfUEtFWV9hc3NpZ25fUlNBKHBrZXkscnNhKSBFVlBfUEtFWV9hc3NpZ24oKHBrZXkpLEVWUF9QS0VZX1JTQSxcCisJCQkJCShjaGFyICopKHJzYSkpCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2RlZmluZSBFVlBfUEtFWV9hc3NpZ25fRFNBKHBrZXksZHNhKSBFVlBfUEtFWV9hc3NpZ24oKHBrZXkpLEVWUF9QS0VZX0RTQSxcCisJCQkJCShjaGFyICopKGRzYSkpCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisjZGVmaW5lIEVWUF9QS0VZX2Fzc2lnbl9ESChwa2V5LGRoKSBFVlBfUEtFWV9hc3NpZ24oKHBrZXkpLEVWUF9QS0VZX0RILFwKKwkJCQkJKGNoYXIgKikoZGgpKQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworI2RlZmluZSBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksZWNrZXkpIEVWUF9QS0VZX2Fzc2lnbigocGtleSksRVZQX1BLRVlfRUMsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKGVja2V5KSkKKyNlbmRpZgorCisvKiBBZGQgc29tZSBleHRyYSBjb21iaW5hdGlvbnMgKi8KKyNkZWZpbmUgRVZQX2dldF9kaWdlc3RieW5pZChhKSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShPQkpfbmlkMnNuKGEpKQorI2RlZmluZSBFVlBfZ2V0X2RpZ2VzdGJ5b2JqKGEpIEVWUF9nZXRfZGlnZXN0YnluaWQoT0JKX29iajJuaWQoYSkpCisjZGVmaW5lIEVWUF9nZXRfY2lwaGVyYnluaWQoYSkgRVZQX2dldF9jaXBoZXJieW5hbWUoT0JKX25pZDJzbihhKSkKKyNkZWZpbmUgRVZQX2dldF9jaXBoZXJieW9iaihhKSBFVlBfZ2V0X2NpcGhlcmJ5bmlkKE9CSl9vYmoybmlkKGEpKQorCitpbnQgRVZQX01EX3R5cGUoY29uc3QgRVZQX01EICptZCk7CisjZGVmaW5lIEVWUF9NRF9uaWQoZSkJCQlFVlBfTURfdHlwZShlKQorI2RlZmluZSBFVlBfTURfbmFtZShlKQkJCU9CSl9uaWQyc24oRVZQX01EX25pZChlKSkKK2ludCBFVlBfTURfcGtleV90eXBlKGNvbnN0IEVWUF9NRCAqbWQpOwkKK2ludCBFVlBfTURfc2l6ZShjb25zdCBFVlBfTUQgKm1kKTsKK2ludCBFVlBfTURfYmxvY2tfc2l6ZShjb25zdCBFVlBfTUQgKm1kKTsKK3Vuc2lnbmVkIGxvbmcgRVZQX01EX2ZsYWdzKGNvbnN0IEVWUF9NRCAqbWQpOworCitjb25zdCBFVlBfTUQgKkVWUF9NRF9DVFhfbWQoY29uc3QgRVZQX01EX0NUWCAqY3R4KTsKKyNkZWZpbmUgRVZQX01EX0NUWF9zaXplKGUpCQlFVlBfTURfc2l6ZShFVlBfTURfQ1RYX21kKGUpKQorI2RlZmluZSBFVlBfTURfQ1RYX2Jsb2NrX3NpemUoZSkJRVZQX01EX2Jsb2NrX3NpemUoRVZQX01EX0NUWF9tZChlKSkKKyNkZWZpbmUgRVZQX01EX0NUWF90eXBlKGUpCQlFVlBfTURfdHlwZShFVlBfTURfQ1RYX21kKGUpKQorCitpbnQgRVZQX0NJUEhFUl9uaWQoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKKyNkZWZpbmUgRVZQX0NJUEhFUl9uYW1lKGUpCQlPQkpfbmlkMnNuKEVWUF9DSVBIRVJfbmlkKGUpKQoraW50IEVWUF9DSVBIRVJfYmxvY2tfc2l6ZShjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpOworaW50IEVWUF9DSVBIRVJfa2V5X2xlbmd0aChjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpOworaW50IEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcik7Cit1bnNpZ25lZCBsb25nIEVWUF9DSVBIRVJfZmxhZ3MoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKKyNkZWZpbmUgRVZQX0NJUEhFUl9tb2RlKGUpCQkoRVZQX0NJUEhFUl9mbGFncyhlKSAmIEVWUF9DSVBIX01PREUpCisKK2NvbnN0IEVWUF9DSVBIRVIgKiBFVlBfQ0lQSEVSX0NUWF9jaXBoZXIoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CitpbnQgRVZQX0NJUEhFUl9DVFhfbmlkKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpOworaW50IEVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CitpbnQgRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KTsKK2ludCBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CitpbnQgRVZQX0NJUEhFUl9DVFhfY29weShFVlBfQ0lQSEVSX0NUWCAqb3V0LCBjb25zdCBFVlBfQ0lQSEVSX0NUWCAqaW4pOwordm9pZCAqIEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KTsKK3ZvaWQgRVZQX0NJUEhFUl9DVFhfc2V0X2FwcF9kYXRhKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHZvaWQgKmRhdGEpOworI2RlZmluZSBFVlBfQ0lQSEVSX0NUWF90eXBlKGMpICAgICAgICAgRVZQX0NJUEhFUl90eXBlKEVWUF9DSVBIRVJfQ1RYX2NpcGhlcihjKSkKK3Vuc2lnbmVkIGxvbmcgRVZQX0NJUEhFUl9DVFhfZmxhZ3MoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CisjZGVmaW5lIEVWUF9DSVBIRVJfQ1RYX21vZGUoZSkJCShFVlBfQ0lQSEVSX0NUWF9mbGFncyhlKSAmIEVWUF9DSVBIX01PREUpCisKKyNkZWZpbmUgRVZQX0VOQ09ERV9MRU5HVEgobCkJKCgobCsyKS8zKjQpKyhsLzQ4KzEpKjIrODApCisjZGVmaW5lIEVWUF9ERUNPREVfTEVOR1RIKGwpCSgobCszKS80KjMrODApCisKKyNkZWZpbmUgRVZQX1NpZ25Jbml0X2V4KGEsYixjKQkJRVZQX0RpZ2VzdEluaXRfZXgoYSxiLGMpCisjZGVmaW5lIEVWUF9TaWduSW5pdChhLGIpCQlFVlBfRGlnZXN0SW5pdChhLGIpCisjZGVmaW5lIEVWUF9TaWduVXBkYXRlKGEsYixjKQkJRVZQX0RpZ2VzdFVwZGF0ZShhLGIsYykKKyNkZWZpbmUJRVZQX1ZlcmlmeUluaXRfZXgoYSxiLGMpCUVWUF9EaWdlc3RJbml0X2V4KGEsYixjKQorI2RlZmluZQlFVlBfVmVyaWZ5SW5pdChhLGIpCQlFVlBfRGlnZXN0SW5pdChhLGIpCisjZGVmaW5lCUVWUF9WZXJpZnlVcGRhdGUoYSxiLGMpCQlFVlBfRGlnZXN0VXBkYXRlKGEsYixjKQorI2RlZmluZSBFVlBfT3BlblVwZGF0ZShhLGIsYyxkLGUpCUVWUF9EZWNyeXB0VXBkYXRlKGEsYixjLGQsZSkKKyNkZWZpbmUgRVZQX1NlYWxVcGRhdGUoYSxiLGMsZCxlKQlFVlBfRW5jcnlwdFVwZGF0ZShhLGIsYyxkLGUpCQorI2RlZmluZSBFVlBfRGlnZXN0U2lnblVwZGF0ZShhLGIsYykJRVZQX0RpZ2VzdFVwZGF0ZShhLGIsYykKKyNkZWZpbmUgRVZQX0RpZ2VzdFZlcmlmeVVwZGF0ZShhLGIsYykJRVZQX0RpZ2VzdFVwZGF0ZShhLGIsYykKKworI2lmZGVmIENPTlNUX1NUUklDVAordm9pZCBCSU9fc2V0X21kKEJJTyAqLGNvbnN0IEVWUF9NRCAqbWQpOworI2Vsc2UKKyMgZGVmaW5lIEJJT19zZXRfbWQoYixtZCkJCUJJT19jdHJsKGIsQklPX0NfU0VUX01ELDAsKGNoYXIgKiltZCkKKyNlbmRpZgorI2RlZmluZSBCSU9fZ2V0X21kKGIsbWRwKQkJQklPX2N0cmwoYixCSU9fQ19HRVRfTUQsMCwoY2hhciAqKW1kcCkKKyNkZWZpbmUgQklPX2dldF9tZF9jdHgoYixtZGNwKSAgICAgQklPX2N0cmwoYixCSU9fQ19HRVRfTURfQ1RYLDAsKGNoYXIgKiltZGNwKQorI2RlZmluZSBCSU9fc2V0X21kX2N0eChiLG1kY3ApICAgICBCSU9fY3RybChiLEJJT19DX1NFVF9NRF9DVFgsMCwoY2hhciAqKW1kY3ApCisjZGVmaW5lIEJJT19nZXRfY2lwaGVyX3N0YXR1cyhiKQlCSU9fY3RybChiLEJJT19DX0dFVF9DSVBIRVJfU1RBVFVTLDAsTlVMTCkKKyNkZWZpbmUgQklPX2dldF9jaXBoZXJfY3R4KGIsY19wcCkJQklPX2N0cmwoYixCSU9fQ19HRVRfQ0lQSEVSX0NUWCwwLChjaGFyICopY19wcCkKKworaW50IEVWUF9DaXBoZXIoRVZQX0NJUEhFUl9DVFggKmMsCisJCXVuc2lnbmVkIGNoYXIgKm91dCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisJCXVuc2lnbmVkIGludCBpbmwpOworCisjZGVmaW5lIEVWUF9hZGRfY2lwaGVyX2FsaWFzKG4sYWxpYXMpIFwKKwlPQkpfTkFNRV9hZGQoKGFsaWFzKSxPQkpfTkFNRV9UWVBFX0NJUEhFUl9NRVRIfE9CSl9OQU1FX0FMSUFTLChuKSkKKyNkZWZpbmUgRVZQX2FkZF9kaWdlc3RfYWxpYXMobixhbGlhcykgXAorCU9CSl9OQU1FX2FkZCgoYWxpYXMpLE9CSl9OQU1FX1RZUEVfTURfTUVUSHxPQkpfTkFNRV9BTElBUywobikpCisjZGVmaW5lIEVWUF9kZWxldGVfY2lwaGVyX2FsaWFzKGFsaWFzKSBcCisJT0JKX05BTUVfcmVtb3ZlKGFsaWFzLE9CSl9OQU1FX1RZUEVfQ0lQSEVSX01FVEh8T0JKX05BTUVfQUxJQVMpOworI2RlZmluZSBFVlBfZGVsZXRlX2RpZ2VzdF9hbGlhcyhhbGlhcykgXAorCU9CSl9OQU1FX3JlbW92ZShhbGlhcyxPQkpfTkFNRV9UWVBFX01EX01FVEh8T0JKX05BTUVfQUxJQVMpOworCit2b2lkCUVWUF9NRF9DVFhfaW5pdChFVlBfTURfQ1RYICpjdHgpOworaW50CUVWUF9NRF9DVFhfY2xlYW51cChFVlBfTURfQ1RYICpjdHgpOworRVZQX01EX0NUWCAqRVZQX01EX0NUWF9jcmVhdGUodm9pZCk7Cit2b2lkCUVWUF9NRF9DVFhfZGVzdHJveShFVlBfTURfQ1RYICpjdHgpOworaW50ICAgICBFVlBfTURfQ1RYX2NvcHlfZXgoRVZQX01EX0NUWCAqb3V0LGNvbnN0IEVWUF9NRF9DVFggKmluKTsgIAordm9pZAlFVlBfTURfQ1RYX3NldF9mbGFncyhFVlBfTURfQ1RYICpjdHgsIGludCBmbGFncyk7Cit2b2lkCUVWUF9NRF9DVFhfY2xlYXJfZmxhZ3MoRVZQX01EX0NUWCAqY3R4LCBpbnQgZmxhZ3MpOworaW50IAlFVlBfTURfQ1RYX3Rlc3RfZmxhZ3MoY29uc3QgRVZQX01EX0NUWCAqY3R4LGludCBmbGFncyk7CitpbnQJRVZQX0RpZ2VzdEluaXRfZXgoRVZQX01EX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqaW1wbCk7CitpbnQJRVZQX0RpZ2VzdFVwZGF0ZShFVlBfTURfQ1RYICpjdHgsY29uc3Qgdm9pZCAqZCwKKwkJCSBzaXplX3QgY250KTsKK2ludAlFVlBfRGlnZXN0RmluYWxfZXgoRVZQX01EX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm1kLHVuc2lnbmVkIGludCAqcyk7CitpbnQJRVZQX0RpZ2VzdChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQsCisJCXVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKnNpemUsIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICppbXBsKTsKKworaW50ICAgICBFVlBfTURfQ1RYX2NvcHkoRVZQX01EX0NUWCAqb3V0LGNvbnN0IEVWUF9NRF9DVFggKmluKTsgIAoraW50CUVWUF9EaWdlc3RJbml0KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlKTsKK2ludAlFVlBfRGlnZXN0RmluYWwoRVZQX01EX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm1kLHVuc2lnbmVkIGludCAqcyk7CisKK2ludAlFVlBfcmVhZF9wd19zdHJpbmcoY2hhciAqYnVmLGludCBsZW5ndGgsY29uc3QgY2hhciAqcHJvbXB0LGludCB2ZXJpZnkpOworaW50CUVWUF9yZWFkX3B3X3N0cmluZ19taW4oY2hhciAqYnVmLGludCBtaW5sZW4saW50IG1heGxlbixjb25zdCBjaGFyICpwcm9tcHQsaW50IHZlcmlmeSk7Cit2b2lkCUVWUF9zZXRfcHdfcHJvbXB0KGNvbnN0IGNoYXIgKnByb21wdCk7CitjaGFyICoJRVZQX2dldF9wd19wcm9tcHQodm9pZCk7CisKK2ludAlFVlBfQnl0ZXNUb0tleShjb25zdCBFVlBfQ0lQSEVSICp0eXBlLGNvbnN0IEVWUF9NRCAqbWQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCWludCBkYXRhbCwgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICprZXksdW5zaWduZWQgY2hhciAqaXYpOworCit2b2lkCUVWUF9DSVBIRVJfQ1RYX3NldF9mbGFncyhFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgZmxhZ3MpOwordm9pZAlFVlBfQ0lQSEVSX0NUWF9jbGVhcl9mbGFncyhFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgZmxhZ3MpOworaW50IAlFVlBfQ0lQSEVSX0NUWF90ZXN0X2ZsYWdzKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgsaW50IGZsYWdzKTsKKworaW50CUVWUF9FbmNyeXB0SW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICppdik7CitpbnQJRVZQX0VuY3J5cHRJbml0X2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBFTkdJTkUgKmltcGwsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqaXYpOworaW50CUVWUF9FbmNyeXB0VXBkYXRlKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJaW50ICpvdXRsLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGlubCk7CitpbnQJRVZQX0VuY3J5cHRGaW5hbF9leChFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCk7CitpbnQJRVZQX0VuY3J5cHRGaW5hbChFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCk7CisKK2ludAlFVlBfRGVjcnlwdEluaXQoRVZQX0NJUEhFUl9DVFggKmN0eCxjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqaXYpOworaW50CUVWUF9EZWNyeXB0SW5pdF9leChFVlBfQ0lQSEVSX0NUWCAqY3R4LGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgRU5HSU5FICppbXBsLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2KTsKK2ludAlFVlBfRGVjcnlwdFVwZGF0ZShFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCWludCAqb3V0bCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmwpOworaW50CUVWUF9EZWNyeXB0RmluYWwoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0bSwgaW50ICpvdXRsKTsKK2ludAlFVlBfRGVjcnlwdEZpbmFsX2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dG0sIGludCAqb3V0bCk7CisKK2ludAlFVlBfQ2lwaGVySW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSxjb25zdCB1bnNpZ25lZCBjaGFyICppdiwKKwkJICAgICAgIGludCBlbmMpOworaW50CUVWUF9DaXBoZXJJbml0X2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBFTkdJTkUgKmltcGwsCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksY29uc3QgdW5zaWduZWQgY2hhciAqaXYsCisJCSAgICAgICBpbnQgZW5jKTsKK2ludAlFVlBfQ2lwaGVyVXBkYXRlKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJaW50ICpvdXRsLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGlubCk7CitpbnQJRVZQX0NpcGhlckZpbmFsKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dG0sIGludCAqb3V0bCk7CitpbnQJRVZQX0NpcGhlckZpbmFsX2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dG0sIGludCAqb3V0bCk7CisKK2ludAlFVlBfU2lnbkZpbmFsKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCx1bnNpZ25lZCBpbnQgKnMsCisJCUVWUF9QS0VZICpwa2V5KTsKKworaW50CUVWUF9WZXJpZnlGaW5hbChFVlBfTURfQ1RYICpjdHgsY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLAorCQl1bnNpZ25lZCBpbnQgc2lnbGVuLEVWUF9QS0VZICpwa2V5KTsKKworaW50CUVWUF9EaWdlc3RTaWduSW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqKnBjdHgsCisJCQljb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqZSwgRVZQX1BLRVkgKnBrZXkpOworaW50CUVWUF9EaWdlc3RTaWduRmluYWwoRVZQX01EX0NUWCAqY3R4LAorCQkJdW5zaWduZWQgY2hhciAqc2lncmV0LCBzaXplX3QgKnNpZ2xlbik7CisKK2ludAlFVlBfRGlnZXN0VmVyaWZ5SW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqKnBjdHgsCisJCQljb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqZSwgRVZQX1BLRVkgKnBrZXkpOworaW50CUVWUF9EaWdlc3RWZXJpZnlGaW5hbChFVlBfTURfQ1RYICpjdHgsCisJCQl1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCBzaWdsZW4pOworCitpbnQJRVZQX09wZW5Jbml0KEVWUF9DSVBIRVJfQ1RYICpjdHgsY29uc3QgRVZQX0NJUEhFUiAqdHlwZSwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqZWssIGludCBla2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LAorCQlFVlBfUEtFWSAqcHJpdik7CitpbnQJRVZQX09wZW5GaW5hbChFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCk7CisKK2ludAlFVlBfU2VhbEluaXQoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqdHlwZSwKKwkJIHVuc2lnbmVkIGNoYXIgKiplaywgaW50ICpla2wsIHVuc2lnbmVkIGNoYXIgKml2LAorCQlFVlBfUEtFWSAqKnB1YmssIGludCBucHViayk7CitpbnQJRVZQX1NlYWxGaW5hbChFVlBfQ0lQSEVSX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgKm91dGwpOworCit2b2lkCUVWUF9FbmNvZGVJbml0KEVWUF9FTkNPREVfQ1RYICpjdHgpOwordm9pZAlFVlBfRW5jb2RlVXBkYXRlKEVWUF9FTkNPREVfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqb3V0LGludCAqb3V0bCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4saW50IGlubCk7Cit2b2lkCUVWUF9FbmNvZGVGaW5hbChFVlBfRU5DT0RFX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgKm91dGwpOworaW50CUVWUF9FbmNvZGVCbG9jayh1bnNpZ25lZCBjaGFyICp0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpmLCBpbnQgbik7CisKK3ZvaWQJRVZQX0RlY29kZUluaXQoRVZQX0VOQ09ERV9DVFggKmN0eCk7CitpbnQJRVZQX0RlY29kZVVwZGF0ZShFVlBfRU5DT0RFX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgKm91dGwsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaW5sKTsKK2ludAlFVlBfRGVjb2RlRmluYWwoRVZQX0VOQ09ERV9DVFggKmN0eCwgdW5zaWduZWQKKwkJY2hhciAqb3V0LCBpbnQgKm91dGwpOworaW50CUVWUF9EZWNvZGVCbG9jayh1bnNpZ25lZCBjaGFyICp0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpmLCBpbnQgbik7CisKK3ZvaWQgRVZQX0NJUEhFUl9DVFhfaW5pdChFVlBfQ0lQSEVSX0NUWCAqYSk7CitpbnQgRVZQX0NJUEhFUl9DVFhfY2xlYW51cChFVlBfQ0lQSEVSX0NUWCAqYSk7CitFVlBfQ0lQSEVSX0NUWCAqRVZQX0NJUEhFUl9DVFhfbmV3KHZvaWQpOwordm9pZCBFVlBfQ0lQSEVSX0NUWF9mcmVlKEVWUF9DSVBIRVJfQ1RYICphKTsKK2ludCBFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aChFVlBfQ0lQSEVSX0NUWCAqeCwgaW50IGtleWxlbik7CitpbnQgRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoRVZQX0NJUEhFUl9DVFggKmMsIGludCBwYWQpOworaW50IEVWUF9DSVBIRVJfQ1RYX2N0cmwoRVZQX0NJUEhFUl9DVFggKmN0eCwgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cik7CitpbnQgRVZQX0NJUEhFUl9DVFhfcmFuZF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5KTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworQklPX01FVEhPRCAqQklPX2ZfbWQodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fZl9iYXNlNjQodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fZl9jaXBoZXIodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fZl9yZWxpYWJsZSh2b2lkKTsKK3ZvaWQgQklPX3NldF9jaXBoZXIoQklPICpiLGNvbnN0IEVWUF9DSVBIRVIgKmMsY29uc3QgdW5zaWduZWQgY2hhciAqaywKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaSwgaW50IGVuYyk7CisjZW5kaWYKKworY29uc3QgRVZQX01EICpFVlBfbWRfbnVsbCh2b2lkKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDIKK2NvbnN0IEVWUF9NRCAqRVZQX21kMih2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01ENAorY29uc3QgRVZQX01EICpFVlBfbWQ0KHZvaWQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1Citjb25zdCBFVlBfTUQgKkVWUF9tZDUodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYSh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTEodm9pZCk7Citjb25zdCBFVlBfTUQgKkVWUF9kc3Modm9pZCk7Citjb25zdCBFVlBfTUQgKkVWUF9kc3MxKHZvaWQpOworY29uc3QgRVZQX01EICpFVlBfZWNkc2Eodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEyNTYKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTIyNCh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTI1Nih2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTUxMgorY29uc3QgRVZQX01EICpFVlBfc2hhMzg0KHZvaWQpOworY29uc3QgRVZQX01EICpFVlBfc2hhNTEyKHZvaWQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTURDMgorY29uc3QgRVZQX01EICpFVlBfbWRjMih2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JJUEVNRAorY29uc3QgRVZQX01EICpFVlBfcmlwZW1kMTYwKHZvaWQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fV0hJUkxQT09MCitjb25zdCBFVlBfTUQgKkVWUF93aGlybHBvb2wodm9pZCk7CisjZW5kaWYKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9lbmNfbnVsbCh2b2lkKTsJCS8qIGRvZXMgbm90aGluZyA6LSkgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGUodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZV9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19jZmI2NCh2b2lkKTsKKyMgZGVmaW5lIEVWUF9kZXNfY2ZiIEVWUF9kZXNfY2ZiNjQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfY2ZiMSh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfY2ZiOCh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlX2NmYjY0KHZvaWQpOworIyBkZWZpbmUgRVZQX2Rlc19lZGVfY2ZiIEVWUF9kZXNfZWRlX2NmYjY0CisjaWYgMAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGVfY2ZiMSh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlX2NmYjgodm9pZCk7CisjZW5kaWYKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlM19jZmI2NCh2b2lkKTsKKyMgZGVmaW5lIEVWUF9kZXNfZWRlM19jZmIgRVZQX2Rlc19lZGUzX2NmYjY0Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfY2ZiMSh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlM19jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19vZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZV9vZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfb2ZiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZV9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc3hfY2JjKHZvaWQpOworLyogVGhpcyBzaG91bGQgbm93IGJlIHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBkZXZfY3J5cHRvIEVOR0lORS4gQnV0IGFsc28sIHdoeSBhcmUKKyAqIHJjNCBhbmQgbWQ1IGRlY2xhcmF0aW9ucyBtYWRlIGhlcmUgaW5zaWRlIGEgIk5PX0RFUyIgcHJlY29tcGlsZXIgYnJhbmNoPyAqLworI2lmIDAKKyMgaWZkZWYgT1BFTlNTTF9PUEVOQlNEX0RFVl9DUllQVE8KK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXZfY3J5cHRvX2Rlc19lZGUzX2NiYyh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXZfY3J5cHRvX3JjNCh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX2Rldl9jcnlwdG9fbWQ1KHZvaWQpOworIyBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzQodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmM0XzQwKHZvaWQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2lkZWFfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2lkZWFfY2ZiNjQodm9pZCk7CisjIGRlZmluZSBFVlBfaWRlYV9jZmIgRVZQX2lkZWFfY2ZiNjQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9pZGVhX29mYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9pZGVhX2NiYyh2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmMyX2NiYyh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzJfNDBfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl82NF9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmMyX2NmYjY0KHZvaWQpOworIyBkZWZpbmUgRVZQX3JjMl9jZmIgRVZQX3JjMl9jZmI2NAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl9vZmIodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CRgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2JmX2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9iZl9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYmZfY2ZiNjQodm9pZCk7CisjIGRlZmluZSBFVlBfYmZfY2ZiIEVWUF9iZl9jZmI2NAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2JmX29mYih2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYXN0NV9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfY2FzdDVfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Nhc3Q1X2NmYjY0KHZvaWQpOworIyBkZWZpbmUgRVZQX2Nhc3Q1X2NmYiBFVlBfY2FzdDVfY2ZiNjQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYXN0NV9vZmIodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzVfMzJfMTJfMTZfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjNV8zMl8xMl8xNl9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmM1XzMyXzEyXzE2X2NmYjY0KHZvaWQpOworIyBkZWZpbmUgRVZQX3JjNV8zMl8xMl8xNl9jZmIgRVZQX3JjNV8zMl8xMl8xNl9jZmI2NAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjNV8zMl8xMl8xNl9vZmIodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTI4X2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTI4X2NiYyh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTI4X2NmYjEodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzEyOF9jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfY2ZiMTI4KHZvaWQpOworIyBkZWZpbmUgRVZQX2Flc18xMjhfY2ZiIEVWUF9hZXNfMTI4X2NmYjEyOAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfb2ZiKHZvaWQpOworI2lmIDAKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTI4X2N0cih2b2lkKTsKKyNlbmRpZgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xOTJfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xOTJfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xOTJfY2ZiMSh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTkyX2NmYjgodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzE5Ml9jZmIxMjgodm9pZCk7CisjIGRlZmluZSBFVlBfYWVzXzE5Ml9jZmIgRVZQX2Flc18xOTJfY2ZiMTI4Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzE5Ml9vZmIodm9pZCk7CisjaWYgMAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xOTJfY3RyKHZvaWQpOworI2VuZGlmCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jZmIxKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18yNTZfY2ZiOCh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMjU2X2NmYjEyOCh2b2lkKTsKKyMgZGVmaW5lIEVWUF9hZXNfMjU2X2NmYiBFVlBfYWVzXzI1Nl9jZmIxMjgKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMjU2X29mYih2b2lkKTsKKyNpZiAwCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jdHIodm9pZCk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfY2FtZWxsaWFfMTI4X2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYW1lbGxpYV8xMjhfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzEyOF9jZmIxKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzEyOF9jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzEyOF9jZmIxMjgodm9pZCk7CisjIGRlZmluZSBFVlBfY2FtZWxsaWFfMTI4X2NmYiBFVlBfY2FtZWxsaWFfMTI4X2NmYjEyOAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzEyOF9vZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfY2FtZWxsaWFfMTkyX2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYW1lbGxpYV8xOTJfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzE5Ml9jZmIxKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzE5Ml9jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzE5Ml9jZmIxMjgodm9pZCk7CisjIGRlZmluZSBFVlBfY2FtZWxsaWFfMTkyX2NmYiBFVlBfY2FtZWxsaWFfMTkyX2NmYjEyOAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzE5Ml9vZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfY2FtZWxsaWFfMjU2X2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYW1lbGxpYV8yNTZfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzI1Nl9jZmIxKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzI1Nl9jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzI1Nl9jZmIxMjgodm9pZCk7CisjIGRlZmluZSBFVlBfY2FtZWxsaWFfMjU2X2NmYiBFVlBfY2FtZWxsaWFfMjU2X2NmYjEyOAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzI1Nl9vZmIodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX2NiYyh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX2NmYjEyOCh2b2lkKTsKKyMgZGVmaW5lIEVWUF9zZWVkX2NmYiBFVlBfc2VlZF9jZmIxMjgKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX29mYih2b2lkKTsKKyNlbmRpZgorCit2b2lkIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX25vY29uZih2b2lkKTsKK3ZvaWQgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfY29uZih2b2lkKTsKKworI2lmZGVmIE9QRU5TU0xfTE9BRF9DT05GCisjZGVmaW5lIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgXAorCQlPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19jb25mKCkKKyNlbHNlCisjZGVmaW5lIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgXAorCQlPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYoKQorI2VuZGlmCisKK3ZvaWQgT3BlblNTTF9hZGRfYWxsX2NpcGhlcnModm9pZCk7Cit2b2lkIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKHZvaWQpOworI2RlZmluZSBTU0xlYXlfYWRkX2FsbF9hbGdvcml0aG1zKCkgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKQorI2RlZmluZSBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgT3BlblNTTF9hZGRfYWxsX2NpcGhlcnMoKQorI2RlZmluZSBTU0xlYXlfYWRkX2FsbF9kaWdlc3RzKCkgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKQorCitpbnQgRVZQX2FkZF9jaXBoZXIoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKK2ludCBFVlBfYWRkX2RpZ2VzdChjb25zdCBFVlBfTUQgKmRpZ2VzdCk7CisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9nZXRfY2lwaGVyYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3QgRVZQX01EICpFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgRVZQX2NsZWFudXAodm9pZCk7CisKK3ZvaWQgRVZQX0NJUEhFUl9kb19hbGwodm9pZCAoKmZuKShjb25zdCBFVlBfQ0lQSEVSICpjaXBoLAorCQljb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywgdm9pZCAqeCksIHZvaWQgKmFyZyk7Cit2b2lkIEVWUF9DSVBIRVJfZG9fYWxsX3NvcnRlZCh2b2lkICgqZm4pKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGgsCisJCWNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvLCB2b2lkICp4KSwgdm9pZCAqYXJnKTsKKwordm9pZCBFVlBfTURfZG9fYWxsKHZvaWQgKCpmbikoY29uc3QgRVZQX01EICpjaXBoLAorCQljb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywgdm9pZCAqeCksIHZvaWQgKmFyZyk7Cit2b2lkIEVWUF9NRF9kb19hbGxfc29ydGVkKHZvaWQgKCpmbikoY29uc3QgRVZQX01EICpjaXBoLAorCQljb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywgdm9pZCAqeCksIHZvaWQgKmFyZyk7CisKK2ludAkJRVZQX1BLRVlfZGVjcnlwdF9vbGQodW5zaWduZWQgY2hhciAqZGVjX2tleSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuY19rZXksaW50IGVuY19rZXlfbGVuLAorCQkJRVZQX1BLRVkgKnByaXZhdGVfa2V5KTsKK2ludAkJRVZQX1BLRVlfZW5jcnlwdF9vbGQodW5zaWduZWQgY2hhciAqZW5jX2tleSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSxpbnQga2V5X2xlbiwKKwkJCUVWUF9QS0VZICpwdWJfa2V5KTsKK2ludAkJRVZQX1BLRVlfdHlwZShpbnQgdHlwZSk7CitpbnQJCUVWUF9QS0VZX2lkKGNvbnN0IEVWUF9QS0VZICpwa2V5KTsKK2ludAkJRVZQX1BLRVlfYmFzZV9pZChjb25zdCBFVlBfUEtFWSAqcGtleSk7CitpbnQJCUVWUF9QS0VZX2JpdHMoRVZQX1BLRVkgKnBrZXkpOworaW50CQlFVlBfUEtFWV9zaXplKEVWUF9QS0VZICpwa2V5KTsKK2ludCAJCUVWUF9QS0VZX3NldF90eXBlKEVWUF9QS0VZICpwa2V5LGludCB0eXBlKTsKK2ludAkJRVZQX1BLRVlfc2V0X3R5cGVfc3RyKEVWUF9QS0VZICpwa2V5LCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pOworaW50IAkJRVZQX1BLRVlfYXNzaWduKEVWUF9QS0VZICpwa2V5LGludCB0eXBlLHZvaWQgKmtleSk7Cit2b2lkICoJCUVWUF9QS0VZX2dldDAoRVZQX1BLRVkgKnBrZXkpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitzdHJ1Y3QgcnNhX3N0OworaW50IEVWUF9QS0VZX3NldDFfUlNBKEVWUF9QS0VZICpwa2V5LHN0cnVjdCByc2Ffc3QgKmtleSk7CitzdHJ1Y3QgcnNhX3N0ICpFVlBfUEtFWV9nZXQxX1JTQShFVlBfUEtFWSAqcGtleSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKK3N0cnVjdCBkc2Ffc3Q7CitpbnQgRVZQX1BLRVlfc2V0MV9EU0EoRVZQX1BLRVkgKnBrZXksc3RydWN0IGRzYV9zdCAqa2V5KTsKK3N0cnVjdCBkc2Ffc3QgKkVWUF9QS0VZX2dldDFfRFNBKEVWUF9QS0VZICpwa2V5KTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICitzdHJ1Y3QgZGhfc3Q7CitpbnQgRVZQX1BLRVlfc2V0MV9ESChFVlBfUEtFWSAqcGtleSxzdHJ1Y3QgZGhfc3QgKmtleSk7CitzdHJ1Y3QgZGhfc3QgKkVWUF9QS0VZX2dldDFfREgoRVZQX1BLRVkgKnBrZXkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKK3N0cnVjdCBlY19rZXlfc3Q7CitpbnQgRVZQX1BLRVlfc2V0MV9FQ19LRVkoRVZQX1BLRVkgKnBrZXksc3RydWN0IGVjX2tleV9zdCAqa2V5KTsKK3N0cnVjdCBlY19rZXlfc3QgKkVWUF9QS0VZX2dldDFfRUNfS0VZKEVWUF9QS0VZICpwa2V5KTsKKyNlbmRpZgorCitFVlBfUEtFWSAqCUVWUF9QS0VZX25ldyh2b2lkKTsKK3ZvaWQJCUVWUF9QS0VZX2ZyZWUoRVZQX1BLRVkgKnBrZXkpOworCitFVlBfUEtFWSAqCWQyaV9QdWJsaWNLZXkoaW50IHR5cGUsRVZQX1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CitpbnQJCWkyZF9QdWJsaWNLZXkoRVZQX1BLRVkgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCk7CisKK0VWUF9QS0VZICoJZDJpX1ByaXZhdGVLZXkoaW50IHR5cGUsRVZQX1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CitFVlBfUEtFWSAqCWQyaV9BdXRvUHJpdmF0ZUtleShFVlBfUEtFWSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKK2ludAkJaTJkX1ByaXZhdGVLZXkoRVZQX1BLRVkgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCk7CisKK2ludCBFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMoRVZQX1BLRVkgKnRvLCBjb25zdCBFVlBfUEtFWSAqZnJvbSk7CitpbnQgRVZQX1BLRVlfbWlzc2luZ19wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICpwa2V5KTsKK2ludCBFVlBfUEtFWV9zYXZlX3BhcmFtZXRlcnMoRVZQX1BLRVkgKnBrZXksaW50IG1vZGUpOworaW50IEVWUF9QS0VZX2NtcF9wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYik7CisKK2ludCBFVlBfUEtFWV9jbXAoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKTsKKworaW50IEVWUF9QS0VZX3ByaW50X3B1YmxpYyhCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksCisJCQkJaW50IGluZGVudCwgQVNOMV9QQ1RYICpwY3R4KTsKK2ludCBFVlBfUEtFWV9wcmludF9wcml2YXRlKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwKKwkJCQlpbnQgaW5kZW50LCBBU04xX1BDVFggKnBjdHgpOworaW50IEVWUF9QS0VZX3ByaW50X3BhcmFtcyhCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksCisJCQkJaW50IGluZGVudCwgQVNOMV9QQ1RYICpwY3R4KTsKKworaW50IEVWUF9QS0VZX2dldF9kZWZhdWx0X2RpZ2VzdF9uaWQoRVZQX1BLRVkgKnBrZXksIGludCAqcG5pZCk7CisKK2ludCBFVlBfQ0lQSEVSX3R5cGUoY29uc3QgRVZQX0NJUEhFUiAqY3R4KTsKKworLyogY2FsbHMgbWV0aG9kcyAqLworaW50IEVWUF9DSVBIRVJfcGFyYW1fdG9fYXNuMShFVlBfQ0lQSEVSX0NUWCAqYywgQVNOMV9UWVBFICp0eXBlKTsKK2ludCBFVlBfQ0lQSEVSX2FzbjFfdG9fcGFyYW0oRVZQX0NJUEhFUl9DVFggKmMsIEFTTjFfVFlQRSAqdHlwZSk7CisKKy8qIFRoZXNlIGFyZSB1c2VkIGJ5IEVWUF9DSVBIRVIgbWV0aG9kcyAqLworaW50IEVWUF9DSVBIRVJfc2V0X2FzbjFfaXYoRVZQX0NJUEhFUl9DVFggKmMsQVNOMV9UWVBFICp0eXBlKTsKK2ludCBFVlBfQ0lQSEVSX2dldF9hc24xX2l2KEVWUF9DSVBIRVJfQ1RYICpjLEFTTjFfVFlQRSAqdHlwZSk7CisKKy8qIFBLQ1M1IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gKi8KK2ludCBQS0NTNV9QQkVfa2V5aXZnZW4oRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkgQVNOMV9UWVBFICpwYXJhbSwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBFVlBfTUQgKm1kLAorCQkJIGludCBlbl9kZSk7CitpbnQgUEtDUzVfUEJLREYyX0hNQUNfU0hBMShjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLCBpbnQgaXRlciwKKwkJCSAgIGludCBrZXlsZW4sIHVuc2lnbmVkIGNoYXIgKm91dCk7CitpbnQgUEtDUzVfUEJLREYyX0hNQUMoY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbiwgaW50IGl0ZXIsCisJCQkgICBjb25zdCBFVlBfTUQgKmRpZ2VzdCwKKwkJICAgICAgaW50IGtleWxlbiwgdW5zaWduZWQgY2hhciAqb3V0KTsKK2ludCBQS0NTNV92Ml9QQkVfa2V5aXZnZW4oRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkgQVNOMV9UWVBFICpwYXJhbSwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBFVlBfTUQgKm1kLAorCQkJIGludCBlbl9kZSk7CisKK3ZvaWQgUEtDUzVfUEJFX2FkZCh2b2lkKTsKKworaW50IEVWUF9QQkVfQ2lwaGVySW5pdCAoQVNOMV9PQkpFQ1QgKnBiZV9vYmosIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCSAgICAgQVNOMV9UWVBFICpwYXJhbSwgRVZQX0NJUEhFUl9DVFggKmN0eCwgaW50IGVuX2RlKTsKKworLyogUEJFIHR5cGUgKi8KKworLyogQ2FuIGFwcGVhciBhcyB0aGUgb3V0ZXJtb3N0IEFsZ29yaXRobUlkZW50aWZpZXIgKi8KKyNkZWZpbmUgRVZQX1BCRV9UWVBFX09VVEVSCTB4MAorLyogSXMgYW4gUFJGIHR5cGUgT0lEICovCisjZGVmaW5lIEVWUF9QQkVfVFlQRV9QUkYJMHgxCisKK2ludCBFVlBfUEJFX2FsZ19hZGRfdHlwZShpbnQgcGJlX3R5cGUsIGludCBwYmVfbmlkLCBpbnQgY2lwaGVyX25pZCwgaW50IG1kX25pZCwKKwkgICAgIEVWUF9QQkVfS0VZR0VOICprZXlnZW4pOworaW50IEVWUF9QQkVfYWxnX2FkZChpbnQgbmlkLCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIGNvbnN0IEVWUF9NRCAqbWQsCisJCSAgICBFVlBfUEJFX0tFWUdFTiAqa2V5Z2VuKTsKK2ludCBFVlBfUEJFX2ZpbmQoaW50IHR5cGUsIGludCBwYmVfbmlkLAorCQkJaW50ICpwY25pZCwgaW50ICpwbW5pZCwgRVZQX1BCRV9LRVlHRU4gKipwa2V5Z2VuKTsKK3ZvaWQgRVZQX1BCRV9jbGVhbnVwKHZvaWQpOworCisjZGVmaW5lIEFTTjFfUEtFWV9BTElBUwkJMHgxCisjZGVmaW5lIEFTTjFfUEtFWV9EWU5BTUlDCTB4MgorI2RlZmluZSBBU04xX1BLRVlfU0lHUEFSQU1fTlVMTAkweDQKKworI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9QS0NTN19TSUdOCTB4MQorI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9QS0NTN19FTkNSWVBUCTB4MgorI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9ERUZBVUxUX01EX05JRAkweDMKKyNkZWZpbmUgQVNOMV9QS0VZX0NUUkxfQ01TX1NJR04JCTB4NQorI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9DTVNfRU5WRUxPUEUJMHg3CisKK2ludCBFVlBfUEtFWV9hc24xX2dldF9jb3VudCh2b2lkKTsKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICpFVlBfUEtFWV9hc24xX2dldDAoaW50IGlkeCk7Citjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRVZQX1BLRVlfYXNuMV9maW5kKEVOR0lORSAqKnBlLCBpbnQgdHlwZSk7Citjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRVZQX1BLRVlfYXNuMV9maW5kX3N0cihFTkdJTkUgKipwZSwKKwkJCQkJY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKTsKK2ludCBFVlBfUEtFWV9hc24xX2FkZDAoY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoKTsKK2ludCBFVlBfUEtFWV9hc24xX2FkZF9hbGlhcyhpbnQgdG8sIGludCBmcm9tKTsKK2ludCBFVlBfUEtFWV9hc24xX2dldDBfaW5mbyhpbnQgKnBwa2V5X2lkLCBpbnQgKnBrZXlfYmFzZV9pZCwgaW50ICpwcGtleV9mbGFncywKKwkJCQljb25zdCBjaGFyICoqcGluZm8sIGNvbnN0IGNoYXIgKipwcGVtX3N0ciwKKwkJCQkJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoKTsKKworY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QqIEVWUF9QS0VZX2dldDBfYXNuMShFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWV9BU04xX01FVEhPRCogRVZQX1BLRVlfYXNuMV9uZXcoaW50IGlkLCBpbnQgZmxhZ3MsCisJCQkJCWNvbnN0IGNoYXIgKnBlbV9zdHIsIGNvbnN0IGNoYXIgKmluZm8pOwordm9pZCBFVlBfUEtFWV9hc24xX2NvcHkoRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmRzdCwgCisJCQljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqc3JjKTsKK3ZvaWQgRVZQX1BLRVlfYXNuMV9mcmVlKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCk7Cit2b2lkIEVWUF9QS0VZX2FzbjFfc2V0X3B1YmxpYyhFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGgsCisJCWludCAoKnB1Yl9kZWNvZGUpKEVWUF9QS0VZICpwaywgWDUwOV9QVUJLRVkgKnB1YiksCisJCWludCAoKnB1Yl9lbmNvZGUpKFg1MDlfUFVCS0VZICpwdWIsIGNvbnN0IEVWUF9QS0VZICpwayksCisJCWludCAoKnB1Yl9jbXApKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYiksCisJCWludCAoKnB1Yl9wcmludCkoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorCQkJCQkJCUFTTjFfUENUWCAqcGN0eCksCisJCWludCAoKnBrZXlfc2l6ZSkoY29uc3QgRVZQX1BLRVkgKnBrKSwKKwkJaW50ICgqcGtleV9iaXRzKShjb25zdCBFVlBfUEtFWSAqcGspKTsKK3ZvaWQgRVZQX1BLRVlfYXNuMV9zZXRfcHJpdmF0ZShFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGgsCisJCWludCAoKnByaXZfZGVjb2RlKShFVlBfUEtFWSAqcGssIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKSwKKwkJaW50ICgqcHJpdl9lbmNvZGUpKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4LCBjb25zdCBFVlBfUEtFWSAqcGspLAorCQlpbnQgKCpwcml2X3ByaW50KShCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisJCQkJCQkJQVNOMV9QQ1RYICpwY3R4KSk7Cit2b2lkIEVWUF9QS0VZX2FzbjFfc2V0X3BhcmFtKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJaW50ICgqcGFyYW1fZGVjb2RlKShFVlBfUEtFWSAqcGtleSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwgaW50IGRlcmxlbiksCisJCWludCAoKnBhcmFtX2VuY29kZSkoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVuc2lnbmVkIGNoYXIgKipwZGVyKSwKKwkJaW50ICgqcGFyYW1fbWlzc2luZykoY29uc3QgRVZQX1BLRVkgKnBrKSwKKwkJaW50ICgqcGFyYW1fY29weSkoRVZQX1BLRVkgKnRvLCBjb25zdCBFVlBfUEtFWSAqZnJvbSksCisJCWludCAoKnBhcmFtX2NtcCkoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKSwKKwkJaW50ICgqcGFyYW1fcHJpbnQpKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKnBjdHgpKTsKKwordm9pZCBFVlBfUEtFWV9hc24xX3NldF9mcmVlKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJdm9pZCAoKnBrZXlfZnJlZSkoRVZQX1BLRVkgKnBrZXkpKTsKK3ZvaWQgRVZQX1BLRVlfYXNuMV9zZXRfY3RybChFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGgsCisJCWludCAoKnBrZXlfY3RybCkoRVZQX1BLRVkgKnBrZXksIGludCBvcCwKKwkJCQkJCQlsb25nIGFyZzEsIHZvaWQgKmFyZzIpKTsKKworCisjZGVmaW5lIEVWUF9QS0VZX09QX1VOREVGSU5FRAkJMAorI2RlZmluZSBFVlBfUEtFWV9PUF9QQVJBTUdFTgkJKDE8PDEpCisjZGVmaW5lIEVWUF9QS0VZX09QX0tFWUdFTgkJKDE8PDIpCisjZGVmaW5lIEVWUF9QS0VZX09QX1NJR04JCSgxPDwzKQorI2RlZmluZSBFVlBfUEtFWV9PUF9WRVJJRlkJCSgxPDw0KQorI2RlZmluZSBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSCSgxPDw1KQorI2RlZmluZSBFVlBfUEtFWV9PUF9TSUdOQ1RYCQkoMTw8NikKKyNkZWZpbmUgRVZQX1BLRVlfT1BfVkVSSUZZQ1RYCQkoMTw8NykKKyNkZWZpbmUgRVZQX1BLRVlfT1BfRU5DUllQVAkJKDE8PDgpCisjZGVmaW5lIEVWUF9QS0VZX09QX0RFQ1JZUFQJCSgxPDw5KQorI2RlZmluZSBFVlBfUEtFWV9PUF9ERVJJVkUJCSgxPDwxMCkKKworI2RlZmluZSBFVlBfUEtFWV9PUF9UWVBFX1NJRwlcCisJKEVWUF9QS0VZX09QX1NJR04gfCBFVlBfUEtFWV9PUF9WRVJJRlkgfCBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSIFwKKwkJfCBFVlBfUEtFWV9PUF9TSUdOQ1RYIHwgRVZQX1BLRVlfT1BfVkVSSUZZQ1RYKQorCisjZGVmaW5lIEVWUF9QS0VZX09QX1RZUEVfQ1JZUFQgXAorCShFVlBfUEtFWV9PUF9FTkNSWVBUIHwgRVZQX1BLRVlfT1BfREVDUllQVCkKKworI2RlZmluZSBFVlBfUEtFWV9PUF9UWVBFX05PR0VOIFwKKwkoRVZQX1BLRVlfT1BfU0lHIHwgRVZQX1BLRVlfT1BfQ1JZUFQgfCBFVlBfUEtFWV9PUF9ERVJJVkUpCisKKyNkZWZpbmUgRVZQX1BLRVlfT1BfVFlQRV9HRU4gXAorCQkoRVZQX1BLRVlfT1BfUEFSQU1HRU4gfCBFVlBfUEtFWV9PUF9LRVlHRU4pCisKKyNkZWZpbmUJIEVWUF9QS0VZX0NUWF9zZXRfc2lnbmF0dXJlX21kKGN0eCwgbWQpCVwKKwkJRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCAtMSwgRVZQX1BLRVlfT1BfVFlQRV9TSUcsICBcCisJCQkJCUVWUF9QS0VZX0NUUkxfTUQsIDAsICh2b2lkICopbWQpCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9NRAkJMQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX1BFRVJfS0VZCQkyCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9QS0NTN19FTkNSWVBUCTMKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9QS0NTN19ERUNSWVBUCTQKKworI2RlZmluZSBFVlBfUEtFWV9DVFJMX1BLQ1M3X1NJR04JNQorCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfU0VUX01BQ19LRVkJNgorCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVAk3CisKKy8qIFVzZWQgYnkgR09TVCBrZXkgZW5jcnlwdGlvbiBpbiBUTFMgKi8KKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9TRVRfSVYgCQk4CisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9DTVNfRU5DUllQVAk5CisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfQ01TX0RFQ1JZUFQJMTAKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9DTVNfU0lHTgkJMTEKKworI2RlZmluZSBFVlBfUEtFWV9BTEdfQ1RSTAkJMHgxMDAwCisKKworI2RlZmluZSBFVlBfUEtFWV9GTEFHX0FVVE9BUkdMRU4JMgorCitjb25zdCBFVlBfUEtFWV9NRVRIT0QgKkVWUF9QS0VZX21ldGhfZmluZChpbnQgdHlwZSk7CitFVlBfUEtFWV9NRVRIT0QqIEVWUF9QS0VZX21ldGhfbmV3KGludCBpZCwgaW50IGZsYWdzKTsKK3ZvaWQgRVZQX1BLRVlfbWV0aF9mcmVlKEVWUF9QS0VZX01FVEhPRCAqcG1ldGgpOworaW50IEVWUF9QS0VZX21ldGhfYWRkMChjb25zdCBFVlBfUEtFWV9NRVRIT0QgKnBtZXRoKTsKKworRVZQX1BLRVlfQ1RYICpFVlBfUEtFWV9DVFhfbmV3KEVWUF9QS0VZICpwa2V5LCBFTkdJTkUgKmUpOworRVZQX1BLRVlfQ1RYICpFVlBfUEtFWV9DVFhfbmV3X2lkKGludCBpZCwgRU5HSU5FICplKTsKK0VWUF9QS0VZX0NUWCAqRVZQX1BLRVlfQ1RYX2R1cChFVlBfUEtFWV9DVFggKmN0eCk7Cit2b2lkIEVWUF9QS0VZX0NUWF9mcmVlKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworaW50IEVWUF9QS0VZX0NUWF9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQga2V5dHlwZSwgaW50IG9wdHlwZSwKKwkJCQlpbnQgY21kLCBpbnQgcDEsIHZvaWQgKnAyKTsKK2ludCBFVlBfUEtFWV9DVFhfY3RybF9zdHIoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkJCQljb25zdCBjaGFyICp2YWx1ZSk7CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X29wZXJhdGlvbihFVlBfUEtFWV9DVFggKmN0eCk7Cit2b2lkIEVWUF9QS0VZX0NUWF9zZXQwX2tleWdlbl9pbmZvKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgKmRhdCwgaW50IGRhdGxlbik7CisKK0VWUF9QS0VZICpFVlBfUEtFWV9uZXdfbWFjX2tleShpbnQgdHlwZSwgRU5HSU5FICplLAorCQkJCXVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbik7CisKK3ZvaWQgRVZQX1BLRVlfQ1RYX3NldF9kYXRhKEVWUF9QS0VZX0NUWCAqY3R4LCB2b2lkICpkYXRhKTsKK3ZvaWQgKkVWUF9QS0VZX0NUWF9nZXRfZGF0YShFVlBfUEtFWV9DVFggKmN0eCk7CitFVlBfUEtFWSAqRVZQX1BLRVlfQ1RYX2dldDBfcGtleShFVlBfUEtFWV9DVFggKmN0eCk7CisKK0VWUF9QS0VZICpFVlBfUEtFWV9DVFhfZ2V0MF9wZWVya2V5KEVWUF9QS0VZX0NUWCAqY3R4KTsKKwordm9pZCBFVlBfUEtFWV9DVFhfc2V0X2FwcF9kYXRhKEVWUF9QS0VZX0NUWCAqY3R4LCB2b2lkICpkYXRhKTsKK3ZvaWQgKkVWUF9QS0VZX0NUWF9nZXRfYXBwX2RhdGEoRVZQX1BLRVlfQ1RYICpjdHgpOworCitpbnQgRVZQX1BLRVlfc2lnbl9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KTsKK2ludCBFVlBfUEtFWV9zaWduKEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbik7CitpbnQgRVZQX1BLRVlfdmVyaWZ5X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworaW50IEVWUF9QS0VZX3ZlcmlmeShFVlBfUEtFWV9DVFggKmN0eCwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbik7CitpbnQgRVZQX1BLRVlfdmVyaWZ5X3JlY292ZXJfaW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CitpbnQgRVZQX1BLRVlfdmVyaWZ5X3JlY292ZXIoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQl1bnNpZ25lZCBjaGFyICpyb3V0LCBzaXplX3QgKnJvdXRsZW4sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCBzaWdsZW4pOworaW50IEVWUF9QS0VZX2VuY3J5cHRfaW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CitpbnQgRVZQX1BLRVlfZW5jcnlwdChFVlBfUEtFWV9DVFggKmN0eCwKKwkJCXVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubGVuKTsKK2ludCBFVlBfUEtFWV9kZWNyeXB0X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworaW50IEVWUF9QS0VZX2RlY3J5cHQoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQl1bnNpZ25lZCBjaGFyICpvdXQsIHNpemVfdCAqb3V0bGVuLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmxlbik7CisKK2ludCBFVlBfUEtFWV9kZXJpdmVfaW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CitpbnQgRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGVlcik7CitpbnQgRVZQX1BLRVlfZGVyaXZlKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICprZXksIHNpemVfdCAqa2V5bGVuKTsKKwordHlwZWRlZiBpbnQgRVZQX1BLRVlfZ2VuX2NiKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworaW50IEVWUF9QS0VZX3BhcmFtZ2VuX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworaW50IEVWUF9QS0VZX3BhcmFtZ2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqKnBwa2V5KTsKK2ludCBFVlBfUEtFWV9rZXlnZW5faW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CitpbnQgRVZQX1BLRVlfa2V5Z2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqKnBwa2V5KTsKKwordm9pZCBFVlBfUEtFWV9DVFhfc2V0X2NiKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWV9nZW5fY2IgKmNiKTsKK0VWUF9QS0VZX2dlbl9jYiAqRVZQX1BLRVlfQ1RYX2dldF9jYihFVlBfUEtFWV9DVFggKmN0eCk7CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X2tleWdlbl9pbmZvKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgaWR4KTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9pbml0KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9jb3B5KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqY29weSkoRVZQX1BLRVlfQ1RYICpkc3QsIEVWUF9QS0VZX0NUWCAqc3JjKSk7CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfY2xlYW51cChFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCXZvaWQgKCpjbGVhbnVwKShFVlBfUEtFWV9DVFggKmN0eCkpOworCit2b2lkIEVWUF9QS0VZX21ldGhfc2V0X3BhcmFtZ2VuKEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqcGFyYW1nZW5faW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKnBhcmFtZ2VuKShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9rZXlnZW4oRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCprZXlnZW5faW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKmtleWdlbikoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KSk7CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfc2lnbihFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKnNpZ25faW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKnNpZ24pKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCAqc2lnbGVuLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF92ZXJpZnkoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCp2ZXJpZnlfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKnZlcmlmeSkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJzLCBzaXplX3QgdGJzbGVuKSk7CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfdmVyaWZ5X3JlY292ZXIoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCp2ZXJpZnlfcmVjb3Zlcl9pbml0KShFVlBfUEtFWV9DVFggKmN0eCksCisJaW50ICgqdmVyaWZ5X3JlY292ZXIpKEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJCQl1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCAqc2lnbGVuLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9zaWduY3R4KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqc2lnbmN0eF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX01EX0NUWCAqbWN0eCksCisJaW50ICgqc2lnbmN0eCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCisJCQkJCUVWUF9NRF9DVFggKm1jdHgpKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF92ZXJpZnljdHgoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCp2ZXJpZnljdHhfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpLAorCWludCAoKnZlcmlmeWN0eCkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZyxpbnQgc2lnbGVuLAorCQkJCQlFVlBfTURfQ1RYICptY3R4KSk7CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfZW5jcnlwdChFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKmVuY3J5cHRfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKmVuY3J5cHRmbikoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9kZWNyeXB0KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqZGVjcnlwdF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCksCisJaW50ICgqZGVjcnlwdCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9kZXJpdmUoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCpkZXJpdmVfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKmRlcml2ZSkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgc2l6ZV90ICprZXlsZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9jdHJsKEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqY3RybCkoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKSwKKwlpbnQgKCpjdHJsX3N0cikoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQkJCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKSk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfRVZQX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRVZQIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIEVWUF9GX0FFU19JTklUX0tFWQkJCQkgMTMzCisjZGVmaW5lIEVWUF9GX0NBTUVMTElBX0lOSVRfS0VZCQkJCSAxNTkKKyNkZWZpbmUgRVZQX0ZfRDJJX1BLRVkJCQkJCSAxMDAKKyNkZWZpbmUgRVZQX0ZfRE9fU0lHVkVSX0lOSVQJCQkJIDE2MQorI2RlZmluZSBFVlBfRl9EU0FQS0VZMlBLQ1M4CQkJCSAxMzQKKyNkZWZpbmUgRVZQX0ZfRFNBX1BLRVkyUEtDUzgJCQkJIDEzNQorI2RlZmluZSBFVlBfRl9FQ0RTQV9QS0VZMlBLQ1M4CQkJCSAxMjkKKyNkZWZpbmUgRVZQX0ZfRUNLRVlfUEtFWTJQS0NTOAkJCQkgMTMyCisjZGVmaW5lIEVWUF9GX0VWUF9DSVBIRVJJTklUX0VYCQkJCSAxMjMKKyNkZWZpbmUgRVZQX0ZfRVZQX0NJUEhFUl9DVFhfQ09QWQkJCSAxNjMKKyNkZWZpbmUgRVZQX0ZfRVZQX0NJUEhFUl9DVFhfQ1RSTAkJCSAxMjQKKyNkZWZpbmUgRVZQX0ZfRVZQX0NJUEhFUl9DVFhfU0VUX0tFWV9MRU5HVEgJCSAxMjIKKyNkZWZpbmUgRVZQX0ZfRVZQX0RFQ1JZUFRGSU5BTF9FWAkJCSAxMDEKKyNkZWZpbmUgRVZQX0ZfRVZQX0RJR0VTVElOSVRfRVgJCQkJIDEyOAorI2RlZmluZSBFVlBfRl9FVlBfRU5DUllQVEZJTkFMX0VYCQkJIDEyNworI2RlZmluZSBFVlBfRl9FVlBfTURfQ1RYX0NPUFlfRVgJCQkgMTEwCisjZGVmaW5lIEVWUF9GX0VWUF9NRF9TSVpFCQkJCSAxNjIKKyNkZWZpbmUgRVZQX0ZfRVZQX09QRU5JTklUCQkJCSAxMDIKKyNkZWZpbmUgRVZQX0ZfRVZQX1BCRV9BTEdfQURECQkJCSAxMTUKKyNkZWZpbmUgRVZQX0ZfRVZQX1BCRV9BTEdfQUREX1RZUEUJCQkgMTYwCisjZGVmaW5lIEVWUF9GX0VWUF9QQkVfQ0lQSEVSSU5JVAkJCSAxMTYKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLQ1M4MlBLRVkJCQkJIDExMQorI2RlZmluZSBFVlBfRl9FVlBfUEtDUzgyUEtFWV9CUk9LRU4JCQkgMTM2CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZMlBLQ1M4X0JST0tFTgkJCSAxMTMKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfQ09QWV9QQVJBTUVURVJTCQkJIDEwMworI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9DVFhfQ1RSTAkJCQkgMTM3CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0NUWF9DVFJMX1NUUgkJCSAxNTAKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfQ1RYX0RVUAkJCQkgMTU2CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0RFQ1JZUFQJCQkJIDEwNAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9ERUNSWVBUX0lOSVQJCQkgMTM4CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0RFQ1JZUFRfT0xECQkJIDE1MQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9ERVJJVkUJCQkJIDE1MworI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9ERVJJVkVfSU5JVAkJCSAxNTQKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfREVSSVZFX1NFVF9QRUVSCQkJIDE1NQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9FTkNSWVBUCQkJCSAxMDUKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfRU5DUllQVF9JTklUCQkJIDEzOQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9FTkNSWVBUX09MRAkJCSAxNTIKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfR0VUMV9ESAkJCQkgMTE5CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0dFVDFfRFNBCQkJCSAxMjAKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfR0VUMV9FQ0RTQQkJCSAxMzAKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfR0VUMV9FQ19LRVkJCQkgMTMxCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0dFVDFfUlNBCQkJCSAxMjEKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfS0VZR0VOCQkJCSAxNDYKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfS0VZR0VOX0lOSVQJCQkgMTQ3CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX05FVwkJCQkgMTA2CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX1BBUkFNR0VOCQkJCSAxNDgKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfUEFSQU1HRU5fSU5JVAkJCSAxNDkKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfU0lHTgkJCQkgMTQwCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX1NJR05fSU5JVAkJCSAxNDEKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfVkVSSUZZCQkJCSAxNDIKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfVkVSSUZZX0lOSVQJCQkgMTQzCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX1ZFUklGWV9SRUNPVkVSCQkJIDE0NAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9WRVJJRllfUkVDT1ZFUl9JTklUCQkgMTQ1CisjZGVmaW5lIEVWUF9GX0VWUF9SSUpOREFFTAkJCQkgMTI2CisjZGVmaW5lIEVWUF9GX0VWUF9TSUdORklOQUwJCQkJIDEwNworI2RlZmluZSBFVlBfRl9FVlBfVkVSSUZZRklOQUwJCQkJIDEwOAorI2RlZmluZSBFVlBfRl9JTlRfQ1RYX05FVwkJCQkgMTU3CisjZGVmaW5lIEVWUF9GX1BLQ1M1X1BCRV9LRVlJVkdFTgkJCSAxMTcKKyNkZWZpbmUgRVZQX0ZfUEtDUzVfVjJfUEJFX0tFWUlWR0VOCQkJIDExOAorI2RlZmluZSBFVlBfRl9QS0NTOF9TRVRfQlJPS0VOCQkJCSAxMTIKKyNkZWZpbmUgRVZQX0ZfUEtFWV9TRVRfVFlQRQkJCQkgMTU4CisjZGVmaW5lIEVWUF9GX1JDMl9NQUdJQ19UT19NRVRICQkJCSAxMDkKKyNkZWZpbmUgRVZQX0ZfUkM1X0NUUkwJCQkJCSAxMjUKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBFVlBfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRAkJCSAxNDMKKyNkZWZpbmUgRVZQX1JfQVNOMV9MSUIJCQkJCSAxNDAKKyNkZWZpbmUgRVZQX1JfQkFEX0JMT0NLX0xFTkdUSAkJCQkgMTM2CisjZGVmaW5lIEVWUF9SX0JBRF9ERUNSWVBUCQkJCSAxMDAKKyNkZWZpbmUgRVZQX1JfQkFEX0tFWV9MRU5HVEgJCQkJIDEzNworI2RlZmluZSBFVlBfUl9CTl9ERUNPREVfRVJST1IJCQkJIDExMgorI2RlZmluZSBFVlBfUl9CTl9QVUJLRVlfRVJST1IJCQkJIDExMworI2RlZmluZSBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMCQkJCSAxNTUKKyNkZWZpbmUgRVZQX1JfQ0FNRUxMSUFfS0VZX1NFVFVQX0ZBSUxFRAkJCSAxNTcKKyNkZWZpbmUgRVZQX1JfQ0lQSEVSX1BBUkFNRVRFUl9FUlJPUgkJCSAxMjIKKyNkZWZpbmUgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVECQkJIDE0NworI2RlZmluZSBFVlBfUl9DVFJMX05PVF9JTVBMRU1FTlRFRAkJCSAxMzIKKyNkZWZpbmUgRVZQX1JfQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVECQkgMTMzCisjZGVmaW5lIEVWUF9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSAkJIDEzOAorI2RlZmluZSBFVlBfUl9ERUNPREVfRVJST1IJCQkJIDExNAorI2RlZmluZSBFVlBfUl9ESUZGRVJFTlRfS0VZX1RZUEVTCQkJIDEwMQorI2RlZmluZSBFVlBfUl9ESUZGRVJFTlRfUEFSQU1FVEVSUwkJCSAxNTMKKyNkZWZpbmUgRVZQX1JfRU5DT0RFX0VSUk9SCQkJCSAxMTUKKyNkZWZpbmUgRVZQX1JfRVZQX1BCRV9DSVBIRVJJTklUX0VSUk9SCQkJIDExOQorI2RlZmluZSBFVlBfUl9FWFBFQ1RJTkdfQU5fUlNBX0tFWQkJCSAxMjcKKyNkZWZpbmUgRVZQX1JfRVhQRUNUSU5HX0FfREhfS0VZCQkJIDEyOAorI2RlZmluZSBFVlBfUl9FWFBFQ1RJTkdfQV9EU0FfS0VZCQkJIDEyOQorI2RlZmluZSBFVlBfUl9FWFBFQ1RJTkdfQV9FQ0RTQV9LRVkJCQkgMTQxCisjZGVmaW5lIEVWUF9SX0VYUEVDVElOR19BX0VDX0tFWQkJCSAxNDIKKyNkZWZpbmUgRVZQX1JfSU5JVElBTElaQVRJT05fRVJST1IJCQkgMTM0CisjZGVmaW5lIEVWUF9SX0lOUFVUX05PVF9JTklUSUFMSVpFRAkJCSAxMTEKKyNkZWZpbmUgRVZQX1JfSU5WQUxJRF9ESUdFU1QJCQkJIDE1MgorI2RlZmluZSBFVlBfUl9JTlZBTElEX0tFWV9MRU5HVEgJCQkgMTMwCisjZGVmaW5lIEVWUF9SX0lOVkFMSURfT1BFUkFUSU9OCQkJCSAxNDgKKyNkZWZpbmUgRVZQX1JfSVZfVE9PX0xBUkdFCQkJCSAxMDIKKyNkZWZpbmUgRVZQX1JfS0VZR0VOX0ZBSUxVUkUJCQkJIDEyMAorI2RlZmluZSBFVlBfUl9NRVNTQUdFX0RJR0VTVF9JU19OVUxMCQkJIDE1OQorI2RlZmluZSBFVlBfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRAkJCSAxNDQKKyNkZWZpbmUgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTCQkJIDEwMworI2RlZmluZSBFVlBfUl9OT19DSVBIRVJfU0VUCQkJCSAxMzEKKyNkZWZpbmUgRVZQX1JfTk9fREVGQVVMVF9ESUdFU1QJCQkJIDE1OAorI2RlZmluZSBFVlBfUl9OT19ESUdFU1RfU0VUCQkJCSAxMzkKKyNkZWZpbmUgRVZQX1JfTk9fRFNBX1BBUkFNRVRFUlMJCQkJIDExNgorI2RlZmluZSBFVlBfUl9OT19LRVlfU0VUCQkJCSAxNTQKKyNkZWZpbmUgRVZQX1JfTk9fT1BFUkFUSU9OX1NFVAkJCQkgMTQ5CisjZGVmaW5lIEVWUF9SX05PX1NJR05fRlVOQ1RJT05fQ09ORklHVVJFRAkJIDEwNAorI2RlZmluZSBFVlBfUl9OT19WRVJJRllfRlVOQ1RJT05fQ09ORklHVVJFRAkJIDEwNQorI2RlZmluZSBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFCSAxNTAKKyNkZWZpbmUgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVECQkJIDE1MQorI2RlZmluZSBFVlBfUl9QS0NTOF9VTktOT1dOX0JST0tFTl9UWVBFCQkJIDExNworI2RlZmluZSBFVlBfUl9QUklWQVRFX0tFWV9ERUNPREVfRVJST1IJCQkgMTQ1CisjZGVmaW5lIEVWUF9SX1BSSVZBVEVfS0VZX0VOQ09ERV9FUlJPUgkJCSAxNDYKKyNkZWZpbmUgRVZQX1JfUFVCTElDX0tFWV9OT1RfUlNBCQkJIDEwNgorI2RlZmluZSBFVlBfUl9VTktOT1dOX0NJUEhFUgkJCQkgMTYwCisjZGVmaW5lIEVWUF9SX1VOS05PV05fRElHRVNUCQkJCSAxNjEKKyNkZWZpbmUgRVZQX1JfVU5LTk9XTl9QQkVfQUxHT1JJVEhNCQkJIDEyMQorI2RlZmluZSBFVlBfUl9VTlNVUE9SVEVEX05VTUJFUl9PRl9ST1VORFMJCSAxMzUKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfQUxHT1JJVEhNCQkJIDE1NgorI2RlZmluZSBFVlBfUl9VTlNVUFBPUlRFRF9DSVBIRVIJCQkgMTA3CisjZGVmaW5lIEVWUF9SX1VOU1VQUE9SVEVEX0tFWUxFTkdUSAkJCSAxMjMKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfS0VZX0RFUklWQVRJT05fRlVOQ1RJT04JIDEyNAorI2RlZmluZSBFVlBfUl9VTlNVUFBPUlRFRF9LRVlfU0laRQkJCSAxMDgKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfUFJGCQkJCSAxMjUKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfUFJJVkFURV9LRVlfQUxHT1JJVEhNCQkgMTE4CisjZGVmaW5lIEVWUF9SX1VOU1VQUE9SVEVEX1NBTFRfVFlQRQkJCSAxMjYKKyNkZWZpbmUgRVZQX1JfV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RICQkJIDEwOQorI2RlZmluZSBFVlBfUl9XUk9OR19QVUJMSUNfS0VZX1RZUEUJCQkgMTEwCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9hY25mLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9hY25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzYTE4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX2FjbmYuYwpAQCAtMCwwICsxLDczIEBACisvKiBldnBfYWNuZi5jICovCisvKiBXcml0dGVuIGJ5IFN0ZXBoZW4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKworCisvKiBMb2FkIGFsbCBhbGdvcml0aG1zIGFuZCBjb25maWd1cmUgT3BlblNTTC4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbgorICogT1BFTlNTTF9MT0FEX0NPTkYgaXMgc2V0LgorICovCisKK3ZvaWQgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfY29uZih2b2lkKQorCXsKKwlPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYoKTsKKwlPUEVOU1NMX2NvbmZpZyhOVUxMKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9lbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWQ2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9lbmMuYwpAQCAtMCwwICsxLDYwMyBAQAorLyogY3J5cHRvL2V2cC9ldnBfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorI2luY2x1ZGUgImV2cF9sb2NsLmgiCisKK2NvbnN0IGNoYXIgRVZQX3ZlcnNpb25bXT0iRVZQIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKK3ZvaWQgRVZQX0NJUEhFUl9DVFhfaW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4KQorCXsKKwltZW1zZXQoY3R4LDAsc2l6ZW9mKEVWUF9DSVBIRVJfQ1RYKSk7CisJLyogY3R4LT5jaXBoZXI9TlVMTDsgKi8KKwl9CisKK0VWUF9DSVBIRVJfQ1RYICpFVlBfQ0lQSEVSX0NUWF9uZXcodm9pZCkKKwl7CisJRVZQX0NJUEhFUl9DVFggKmN0eD1PUEVOU1NMX21hbGxvYyhzaXplb2YgKmN0eCk7CisJaWYgKGN0eCkKKwkJRVZQX0NJUEhFUl9DVFhfaW5pdChjdHgpOworCXJldHVybiBjdHg7CisJfQorCitpbnQgRVZQX0NpcGhlckluaXQoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKKwl7CisJaWYgKGNpcGhlcikKKwkJRVZQX0NJUEhFUl9DVFhfaW5pdChjdHgpOworCXJldHVybiBFVlBfQ2lwaGVySW5pdF9leChjdHgsY2lwaGVyLE5VTEwsa2V5LGl2LGVuYyk7CisJfQorCitpbnQgRVZQX0NpcGhlckluaXRfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBFTkdJTkUgKmltcGwsCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKQorCXsKKwlpZiAoZW5jID09IC0xKQorCQllbmMgPSBjdHgtPmVuY3J5cHQ7CisJZWxzZQorCQl7CisJCWlmIChlbmMpCisJCQllbmMgPSAxOworCQljdHgtPmVuY3J5cHQgPSBlbmM7CisJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkvKiBXaGV0aGVyIGl0J3MgbmljZSBvciBub3QsICJJbml0cyIgY2FuIGJlIHVzZWQgb24gIkZpbmFsIidkIGNvbnRleHRzCisJICogc28gdGhpcyBjb250ZXh0IG1heSBhbHJlYWR5IGhhdmUgYW4gRU5HSU5FISBUcnkgdG8gYXZvaWQgcmVsZWFzaW5nCisJICogdGhlIHByZXZpb3VzIGhhbmRsZSwgcmUtcXVlcnlpbmcgZm9yIGFuIEVOR0lORSwgYW5kIGhhdmluZyBhCisJICogcmVpbml0aWFsaXNhdGlvbiwgd2hlbiBpdCBtYXkgYWxsIGJlIHVuZWNlc3NhcnkuICovCisJaWYgKGN0eC0+ZW5naW5lICYmIGN0eC0+Y2lwaGVyICYmICghY2lwaGVyIHx8CisJCQkoY2lwaGVyICYmIChjaXBoZXItPm5pZCA9PSBjdHgtPmNpcGhlci0+bmlkKSkpKQorCQlnb3RvIHNraXBfdG9faW5pdDsKKyNlbmRpZgorCWlmIChjaXBoZXIpCisJCXsKKwkJLyogRW5zdXJlIGEgY29udGV4dCBsZWZ0IGx5aW5nIGFyb3VuZCBmcm9tIGxhc3QgdGltZSBpcyBjbGVhcmVkCisJCSAqICh0aGUgcHJldmlvdXMgY2hlY2sgYXR0ZW1wdGVkIHRvIGF2b2lkIHRoaXMgaWYgdGhlIHNhbWUKKwkJICogRU5HSU5FIGFuZCBFVlBfQ0lQSEVSIGNvdWxkIGJlIHVzZWQpLiAqLworCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKGN0eCk7CisKKwkJLyogUmVzdG9yZSBlbmNyeXB0IGZpZWxkOiBpdCBpcyB6ZXJvZWQgYnkgY2xlYW51cCAqLworCQljdHgtPmVuY3J5cHQgPSBlbmM7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWlmKGltcGwpCisJCQl7CisJCQlpZiAoIUVOR0lORV9pbml0KGltcGwpKQorCQkJCXsKKwkJCQlFVlBlcnIoRVZQX0ZfRVZQX0NJUEhFUklOSVRfRVgsIEVWUF9SX0lOSVRJQUxJWkFUSU9OX0VSUk9SKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCS8qIEFzayBpZiBhbiBFTkdJTkUgaXMgcmVzZXJ2ZWQgZm9yIHRoaXMgam9iICovCisJCQlpbXBsID0gRU5HSU5FX2dldF9jaXBoZXJfZW5naW5lKGNpcGhlci0+bmlkKTsKKwkJaWYoaW1wbCkKKwkJCXsKKwkJCS8qIFRoZXJlJ3MgYW4gRU5HSU5FIGZvciB0aGlzIGpvYiAuLi4gKGFwcGFyZW50bHkpICovCisJCQljb25zdCBFVlBfQ0lQSEVSICpjID0gRU5HSU5FX2dldF9jaXBoZXIoaW1wbCwgY2lwaGVyLT5uaWQpOworCQkJaWYoIWMpCisJCQkJeworCQkJCS8qIE9uZSBwb3NpdGl2ZSBzaWRlLWVmZmVjdCBvZiBVUydzIGV4cG9ydAorCQkJCSAqIGNvbnRyb2wgaGlzdG9yeSwgaXMgdGhhdCB3ZSBzaG91bGQgYXQgbGVhc3QKKwkJCQkgKiBiZSBhYmxlIHRvIGF2b2lkIHVzaW5nIFVTIG1pc3BlbGxpbmdzIG9mCisJCQkJICogImluaXRpYWxpc2F0aW9uIj8gKi8KKwkJCQlFVlBlcnIoRVZQX0ZfRVZQX0NJUEhFUklOSVRfRVgsIEVWUF9SX0lOSVRJQUxJWkFUSU9OX0VSUk9SKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkvKiBXZSdsbCB1c2UgdGhlIEVOR0lORSdzIHByaXZhdGUgY2lwaGVyIGRlZmluaXRpb24gKi8KKwkJCWNpcGhlciA9IGM7CisJCQkvKiBTdG9yZSB0aGUgRU5HSU5FIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIHNvIHdlIGtub3cKKwkJCSAqICdjaXBoZXInIGNhbWUgZnJvbSBhbiBFTkdJTkUgYW5kIHdlIG5lZWQgdG8gcmVsZWFzZQorCQkJICogaXQgd2hlbiBkb25lLiAqLworCQkJY3R4LT5lbmdpbmUgPSBpbXBsOworCQkJfQorCQllbHNlCisJCQljdHgtPmVuZ2luZSA9IE5VTEw7CisjZW5kaWYKKworCQljdHgtPmNpcGhlcj1jaXBoZXI7CisJCWlmIChjdHgtPmNpcGhlci0+Y3R4X3NpemUpCisJCQl7CisJCQljdHgtPmNpcGhlcl9kYXRhPU9QRU5TU0xfbWFsbG9jKGN0eC0+Y2lwaGVyLT5jdHhfc2l6ZSk7CisJCQlpZiAoIWN0eC0+Y2lwaGVyX2RhdGEpCisJCQkJeworCQkJCUVWUGVycihFVlBfRl9FVlBfQ0lQSEVSSU5JVF9FWCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJY3R4LT5jaXBoZXJfZGF0YSA9IE5VTEw7CisJCQl9CisJCWN0eC0+a2V5X2xlbiA9IGNpcGhlci0+a2V5X2xlbjsKKwkJY3R4LT5mbGFncyA9IDA7CisJCWlmKGN0eC0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX0NUUkxfSU5JVCkKKwkJCXsKKwkJCWlmKCFFVlBfQ0lQSEVSX0NUWF9jdHJsKGN0eCwgRVZQX0NUUkxfSU5JVCwgMCwgTlVMTCkpCisJCQkJeworCQkJCUVWUGVycihFVlBfRl9FVlBfQ0lQSEVSSU5JVF9FWCwgRVZQX1JfSU5JVElBTElaQVRJT05fRVJST1IpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCWVsc2UgaWYoIWN0eC0+Y2lwaGVyKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfQ0lQSEVSSU5JVF9FWCwgRVZQX1JfTk9fQ0lQSEVSX1NFVCk7CisJCXJldHVybiAwOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitza2lwX3RvX2luaXQ6CisjZW5kaWYKKwkvKiB3ZSBhc3N1bWUgYmxvY2sgc2l6ZSBpcyBhIHBvd2VyIG9mIDIgaW4gKmNyeXB0VXBkYXRlICovCisJT1BFTlNTTF9hc3NlcnQoY3R4LT5jaXBoZXItPmJsb2NrX3NpemUgPT0gMQorCSAgICB8fCBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZSA9PSA4CisJICAgIHx8IGN0eC0+Y2lwaGVyLT5ibG9ja19zaXplID09IDE2KTsKKworCWlmKCEoRVZQX0NJUEhFUl9DVFhfZmxhZ3MoY3R4KSAmIEVWUF9DSVBIX0NVU1RPTV9JVikpIHsKKwkJc3dpdGNoKEVWUF9DSVBIRVJfQ1RYX21vZGUoY3R4KSkgeworCisJCQljYXNlIEVWUF9DSVBIX1NUUkVBTV9DSVBIRVI6CisJCQljYXNlIEVWUF9DSVBIX0VDQl9NT0RFOgorCQkJYnJlYWs7CisKKwkJCWNhc2UgRVZQX0NJUEhfQ0ZCX01PREU6CisJCQljYXNlIEVWUF9DSVBIX09GQl9NT0RFOgorCisJCQljdHgtPm51bSA9IDA7CisKKwkJCWNhc2UgRVZQX0NJUEhfQ0JDX01PREU6CisKKwkJCU9QRU5TU0xfYXNzZXJ0KEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aChjdHgpIDw9CisJCQkJCShpbnQpc2l6ZW9mKGN0eC0+aXYpKTsKKwkJCWlmKGl2KSBtZW1jcHkoY3R4LT5vaXYsIGl2LCBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoY3R4KSk7CisJCQltZW1jcHkoY3R4LT5pdiwgY3R4LT5vaXYsIEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aChjdHgpKTsKKwkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmKGtleSB8fCAoY3R4LT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVCkpIHsKKwkJaWYoIWN0eC0+Y2lwaGVyLT5pbml0KGN0eCxrZXksaXYsZW5jKSkgcmV0dXJuIDA7CisJfQorCWN0eC0+YnVmX2xlbj0wOworCWN0eC0+ZmluYWxfdXNlZD0wOworCWN0eC0+YmxvY2tfbWFzaz1jdHgtPmNpcGhlci0+YmxvY2tfc2l6ZS0xOworCXJldHVybiAxOworCX0KKworaW50IEVWUF9DaXBoZXJVcGRhdGUoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGwsCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGlubCkKKwl7CisJaWYgKGN0eC0+ZW5jcnlwdCkKKwkJcmV0dXJuIEVWUF9FbmNyeXB0VXBkYXRlKGN0eCxvdXQsb3V0bCxpbixpbmwpOworCWVsc2UJcmV0dXJuIEVWUF9EZWNyeXB0VXBkYXRlKGN0eCxvdXQsb3V0bCxpbixpbmwpOworCX0KKworaW50IEVWUF9DaXBoZXJGaW5hbF9leChFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCkKKwl7CisJaWYgKGN0eC0+ZW5jcnlwdCkKKwkJcmV0dXJuIEVWUF9FbmNyeXB0RmluYWxfZXgoY3R4LG91dCxvdXRsKTsKKwllbHNlCXJldHVybiBFVlBfRGVjcnlwdEZpbmFsX2V4KGN0eCxvdXQsb3V0bCk7CisJfQorCitpbnQgRVZQX0NpcGhlckZpbmFsKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsKQorCXsKKwlpZiAoY3R4LT5lbmNyeXB0KQorCQlyZXR1cm4gRVZQX0VuY3J5cHRGaW5hbChjdHgsb3V0LG91dGwpOworCWVsc2UJcmV0dXJuIEVWUF9EZWNyeXB0RmluYWwoY3R4LG91dCxvdXRsKTsKKwl9CisKK2ludCBFVlBfRW5jcnlwdEluaXQoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICppdikKKwl7CisJcmV0dXJuIEVWUF9DaXBoZXJJbml0KGN0eCwgY2lwaGVyLCBrZXksIGl2LCAxKTsKKwl9CisKK2ludCBFVlBfRW5jcnlwdEluaXRfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCxjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIEVOR0lORSAqaW1wbCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICppdikKKwl7CisJcmV0dXJuIEVWUF9DaXBoZXJJbml0X2V4KGN0eCwgY2lwaGVyLCBpbXBsLCBrZXksIGl2LCAxKTsKKwl9CisKK2ludCBFVlBfRGVjcnlwdEluaXQoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICppdikKKwl7CisJcmV0dXJuIEVWUF9DaXBoZXJJbml0KGN0eCwgY2lwaGVyLCBrZXksIGl2LCAwKTsKKwl9CisKK2ludCBFVlBfRGVjcnlwdEluaXRfZXgoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBFTkdJTkUgKmltcGwsCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2KQorCXsKKwlyZXR1cm4gRVZQX0NpcGhlckluaXRfZXgoY3R4LCBjaXBoZXIsIGltcGwsIGtleSwgaXYsIDApOworCX0KKworaW50IEVWUF9FbmNyeXB0VXBkYXRlKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmwpCisJeworCWludCBpLGosYmw7CisKKwlpZiAoaW5sIDw9IDApCisJCXsKKwkJKm91dGwgPSAwOworCQlyZXR1cm4gaW5sID09IDA7CisJCX0KKworCWlmKGN0eC0+YnVmX2xlbiA9PSAwICYmIChpbmwmKGN0eC0+YmxvY2tfbWFzaykpID09IDApCisJCXsKKwkJaWYoY3R4LT5jaXBoZXItPmRvX2NpcGhlcihjdHgsb3V0LGluLGlubCkpCisJCQl7CisJCQkqb3V0bD1pbmw7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJKm91dGw9MDsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJaT1jdHgtPmJ1Zl9sZW47CisJYmw9Y3R4LT5jaXBoZXItPmJsb2NrX3NpemU7CisJT1BFTlNTTF9hc3NlcnQoYmwgPD0gKGludClzaXplb2YoY3R4LT5idWYpKTsKKwlpZiAoaSAhPSAwKQorCQl7CisJCWlmIChpK2lubCA8IGJsKQorCQkJeworCQkJbWVtY3B5KCYoY3R4LT5idWZbaV0pLGluLGlubCk7CisJCQljdHgtPmJ1Zl9sZW4rPWlubDsKKwkJCSpvdXRsPTA7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaj1ibC1pOworCQkJbWVtY3B5KCYoY3R4LT5idWZbaV0pLGluLGopOworCQkJaWYoIWN0eC0+Y2lwaGVyLT5kb19jaXBoZXIoY3R4LG91dCxjdHgtPmJ1ZixibCkpIHJldHVybiAwOworCQkJaW5sLT1qOworCQkJaW4rPWo7CisJCQlvdXQrPWJsOworCQkJKm91dGw9Ymw7CisJCQl9CisJCX0KKwllbHNlCisJCSpvdXRsID0gMDsKKwlpPWlubCYoYmwtMSk7CisJaW5sLT1pOworCWlmIChpbmwgPiAwKQorCQl7CisJCWlmKCFjdHgtPmNpcGhlci0+ZG9fY2lwaGVyKGN0eCxvdXQsaW4saW5sKSkgcmV0dXJuIDA7CisJCSpvdXRsKz1pbmw7CisJCX0KKworCWlmIChpICE9IDApCisJCW1lbWNweShjdHgtPmJ1ZiwmKGluW2lubF0pLGkpOworCWN0eC0+YnVmX2xlbj1pOworCXJldHVybiAxOworCX0KKworaW50IEVWUF9FbmNyeXB0RmluYWwoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGwpCisJeworCWludCByZXQ7CisJcmV0ID0gRVZQX0VuY3J5cHRGaW5hbF9leChjdHgsIG91dCwgb3V0bCk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBFVlBfRW5jcnlwdEZpbmFsX2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsKQorCXsKKwlpbnQgbixyZXQ7CisJdW5zaWduZWQgaW50IGksIGIsIGJsOworCisJYj1jdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKKwlPUEVOU1NMX2Fzc2VydChiIDw9IHNpemVvZiBjdHgtPmJ1Zik7CisJaWYgKGIgPT0gMSkKKwkJeworCQkqb3V0bD0wOworCQlyZXR1cm4gMTsKKwkJfQorCWJsPWN0eC0+YnVmX2xlbjsKKwlpZiAoY3R4LT5mbGFncyAmIEVWUF9DSVBIX05PX1BBRERJTkcpCisJCXsKKwkJaWYoYmwpCisJCQl7CisJCQlFVlBlcnIoRVZQX0ZfRVZQX0VOQ1JZUFRGSU5BTF9FWCxFVlBfUl9EQVRBX05PVF9NVUxUSVBMRV9PRl9CTE9DS19MRU5HVEgpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCSpvdXRsID0gMDsKKwkJcmV0dXJuIDE7CisJCX0KKworCW49Yi1ibDsKKwlmb3IgKGk9Ymw7IGk8YjsgaSsrKQorCQljdHgtPmJ1ZltpXT1uOworCXJldD1jdHgtPmNpcGhlci0+ZG9fY2lwaGVyKGN0eCxvdXQsY3R4LT5idWYsYik7CisKKworCWlmKHJldCkKKwkJKm91dGw9YjsKKworCXJldHVybiByZXQ7CisJfQorCitpbnQgRVZQX0RlY3J5cHRVcGRhdGUoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGwsCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGlubCkKKwl7CisJaW50IGZpeF9sZW47CisJdW5zaWduZWQgaW50IGI7CisKKwlpZiAoaW5sIDw9IDApCisJCXsKKwkJKm91dGwgPSAwOworCQlyZXR1cm4gaW5sID09IDA7CisJCX0KKworCWlmIChjdHgtPmZsYWdzICYgRVZQX0NJUEhfTk9fUEFERElORykKKwkJcmV0dXJuIEVWUF9FbmNyeXB0VXBkYXRlKGN0eCwgb3V0LCBvdXRsLCBpbiwgaW5sKTsKKworCWI9Y3R4LT5jaXBoZXItPmJsb2NrX3NpemU7CisJT1BFTlNTTF9hc3NlcnQoYiA8PSBzaXplb2YgY3R4LT5maW5hbCk7CisKKwlpZihjdHgtPmZpbmFsX3VzZWQpCisJCXsKKwkJbWVtY3B5KG91dCxjdHgtPmZpbmFsLGIpOworCQlvdXQrPWI7CisJCWZpeF9sZW4gPSAxOworCQl9CisJZWxzZQorCQlmaXhfbGVuID0gMDsKKworCisJaWYoIUVWUF9FbmNyeXB0VXBkYXRlKGN0eCxvdXQsb3V0bCxpbixpbmwpKQorCQlyZXR1cm4gMDsKKworCS8qIGlmIHdlIGhhdmUgJ2RlY3J5cHRlZCcgYSBtdWx0aXBsZSBvZiBibG9jayBzaXplLCBtYWtlIHN1cmUKKwkgKiB3ZSBoYXZlIGEgY29weSBvZiB0aGlzIGxhc3QgYmxvY2sgKi8KKwlpZiAoYiA+IDEgJiYgIWN0eC0+YnVmX2xlbikKKwkJeworCQkqb3V0bC09YjsKKwkJY3R4LT5maW5hbF91c2VkPTE7CisJCW1lbWNweShjdHgtPmZpbmFsLCZvdXRbKm91dGxdLGIpOworCQl9CisJZWxzZQorCQljdHgtPmZpbmFsX3VzZWQgPSAwOworCisJaWYgKGZpeF9sZW4pCisJCSpvdXRsICs9IGI7CisJCQorCXJldHVybiAxOworCX0KKworaW50IEVWUF9EZWNyeXB0RmluYWwoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGwpCisJeworCWludCByZXQ7CisJcmV0ID0gRVZQX0RlY3J5cHRGaW5hbF9leChjdHgsIG91dCwgb3V0bCk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBFVlBfRGVjcnlwdEZpbmFsX2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsKQorCXsKKwlpbnQgaSxuOworCXVuc2lnbmVkIGludCBiOworCisJKm91dGw9MDsKKwliPWN0eC0+Y2lwaGVyLT5ibG9ja19zaXplOworCWlmIChjdHgtPmZsYWdzICYgRVZQX0NJUEhfTk9fUEFERElORykKKwkJeworCQlpZihjdHgtPmJ1Zl9sZW4pCisJCQl7CisJCQlFVlBlcnIoRVZQX0ZfRVZQX0RFQ1JZUFRGSU5BTF9FWCxFVlBfUl9EQVRBX05PVF9NVUxUSVBMRV9PRl9CTE9DS19MRU5HVEgpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCSpvdXRsID0gMDsKKwkJcmV0dXJuIDE7CisJCX0KKwlpZiAoYiA+IDEpCisJCXsKKwkJaWYgKGN0eC0+YnVmX2xlbiB8fCAhY3R4LT5maW5hbF91c2VkKQorCQkJeworCQkJRVZQZXJyKEVWUF9GX0VWUF9ERUNSWVBURklOQUxfRVgsRVZQX1JfV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RIKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKwkJT1BFTlNTTF9hc3NlcnQoYiA8PSBzaXplb2YgY3R4LT5maW5hbCk7CisJCW49Y3R4LT5maW5hbFtiLTFdOworCQlpZiAobiA9PSAwIHx8IG4gPiAoaW50KWIpCisJCQl7CisJCQlFVlBlcnIoRVZQX0ZfRVZQX0RFQ1JZUFRGSU5BTF9FWCxFVlBfUl9CQURfREVDUllQVCk7CisJCQlyZXR1cm4oMCk7CisJCQl9CisJCWZvciAoaT0wOyBpPG47IGkrKykKKwkJCXsKKwkJCWlmIChjdHgtPmZpbmFsWy0tYl0gIT0gbikKKwkJCQl7CisJCQkJRVZQZXJyKEVWUF9GX0VWUF9ERUNSWVBURklOQUxfRVgsRVZQX1JfQkFEX0RFQ1JZUFQpOworCQkJCXJldHVybigwKTsKKwkJCQl9CisJCQl9CisJCW49Y3R4LT5jaXBoZXItPmJsb2NrX3NpemUtbjsKKwkJZm9yIChpPTA7IGk8bjsgaSsrKQorCQkJb3V0W2ldPWN0eC0+ZmluYWxbaV07CisJCSpvdXRsPW47CisJCX0KKwllbHNlCisJCSpvdXRsPTA7CisJcmV0dXJuKDEpOworCX0KKwordm9pZCBFVlBfQ0lQSEVSX0NUWF9mcmVlKEVWUF9DSVBIRVJfQ1RYICpjdHgpCisJeworCWlmIChjdHgpCisJCXsKKwkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cChjdHgpOworCQlPUEVOU1NMX2ZyZWUoY3R4KTsKKwkJfQorCX0KKworaW50IEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoRVZQX0NJUEhFUl9DVFggKmMpCisJeworCWlmIChjLT5jaXBoZXIgIT0gTlVMTCkKKwkJeworCQlpZihjLT5jaXBoZXItPmNsZWFudXAgJiYgIWMtPmNpcGhlci0+Y2xlYW51cChjKSkKKwkJCXJldHVybiAwOworCQkvKiBDbGVhbnNlIGNpcGhlciBjb250ZXh0IGRhdGEgKi8KKwkJaWYgKGMtPmNpcGhlcl9kYXRhKQorCQkJT1BFTlNTTF9jbGVhbnNlKGMtPmNpcGhlcl9kYXRhLCBjLT5jaXBoZXItPmN0eF9zaXplKTsKKwkJfQorCWlmIChjLT5jaXBoZXJfZGF0YSkKKwkJT1BFTlNTTF9mcmVlKGMtPmNpcGhlcl9kYXRhKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoYy0+ZW5naW5lKQorCQkvKiBUaGUgRVZQX0NJUEhFUiB3ZSB1c2VkIGJlbG9uZ3MgdG8gYW4gRU5HSU5FLCByZWxlYXNlIHRoZQorCQkgKiBmdW5jdGlvbmFsIHJlZmVyZW5jZSB3ZSBoZWxkIGZvciB0aGlzIHJlYXNvbi4gKi8KKwkJRU5HSU5FX2ZpbmlzaChjLT5lbmdpbmUpOworI2VuZGlmCisJbWVtc2V0KGMsMCxzaXplb2YoRVZQX0NJUEhFUl9DVFgpKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aChFVlBfQ0lQSEVSX0NUWCAqYywgaW50IGtleWxlbikKKwl7CisJaWYoYy0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX0NVU1RPTV9LRVlfTEVOR1RIKSAKKwkJcmV0dXJuIEVWUF9DSVBIRVJfQ1RYX2N0cmwoYywgRVZQX0NUUkxfU0VUX0tFWV9MRU5HVEgsIGtleWxlbiwgTlVMTCk7CisJaWYoYy0+a2V5X2xlbiA9PSBrZXlsZW4pIHJldHVybiAxOworCWlmKChrZXlsZW4gPiAwKSAmJiAoYy0+Y2lwaGVyLT5mbGFncyAmIEVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCkpCisJCXsKKwkJYy0+a2V5X2xlbiA9IGtleWxlbjsKKwkJcmV0dXJuIDE7CisJCX0KKwlFVlBlcnIoRVZQX0ZfRVZQX0NJUEhFUl9DVFhfU0VUX0tFWV9MRU5HVEgsRVZQX1JfSU5WQUxJRF9LRVlfTEVOR1RIKTsKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZyhFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgcGFkKQorCXsKKwlpZiAocGFkKSBjdHgtPmZsYWdzICY9IH5FVlBfQ0lQSF9OT19QQURESU5HOworCWVsc2UgY3R4LT5mbGFncyB8PSBFVlBfQ0lQSF9OT19QQURESU5HOworCXJldHVybiAxOworCX0KKworaW50IEVWUF9DSVBIRVJfQ1RYX2N0cmwoRVZQX0NJUEhFUl9DVFggKmN0eCwgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cikKK3sKKwlpbnQgcmV0OworCWlmKCFjdHgtPmNpcGhlcikgeworCQlFVlBlcnIoRVZQX0ZfRVZQX0NJUEhFUl9DVFhfQ1RSTCwgRVZQX1JfTk9fQ0lQSEVSX1NFVCk7CisJCXJldHVybiAwOworCX0KKworCWlmKCFjdHgtPmNpcGhlci0+Y3RybCkgeworCQlFVlBlcnIoRVZQX0ZfRVZQX0NJUEhFUl9DVFhfQ1RSTCwgRVZQX1JfQ1RSTF9OT1RfSU1QTEVNRU5URUQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBjdHgtPmNpcGhlci0+Y3RybChjdHgsIHR5cGUsIGFyZywgcHRyKTsKKwlpZihyZXQgPT0gLTEpIHsKKwkJRVZQZXJyKEVWUF9GX0VWUF9DSVBIRVJfQ1RYX0NUUkwsIEVWUF9SX0NUUkxfT1BFUkFUSU9OX05PVF9JTVBMRU1FTlRFRCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgRVZQX0NJUEhFUl9DVFhfcmFuZF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5KQorCXsKKwlpZiAoY3R4LT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfUkFORF9LRVkpCisJCXJldHVybiBFVlBfQ0lQSEVSX0NUWF9jdHJsKGN0eCwgRVZQX0NUUkxfUkFORF9LRVksIDAsIGtleSk7CisJaWYgKFJBTkRfYnl0ZXMoa2V5LCBjdHgtPmtleV9sZW4pIDw9IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworCX0KKworaW50IEVWUF9DSVBIRVJfQ1RYX2NvcHkoRVZQX0NJUEhFUl9DVFggKm91dCwgY29uc3QgRVZQX0NJUEhFUl9DVFggKmluKQorCXsKKwlpZiAoKGluID09IE5VTEwpIHx8IChpbi0+Y2lwaGVyID09IE5VTEwpKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfQ0lQSEVSX0NUWF9DT1BZLEVWUF9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCk7CisJCXJldHVybiAwOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJLyogTWFrZSBzdXJlIGl0J3Mgc2FmZSB0byBjb3B5IGEgY2lwaGVyIGNvbnRleHQgdXNpbmcgYW4gRU5HSU5FICovCisJaWYgKGluLT5lbmdpbmUgJiYgIUVOR0lORV9pbml0KGluLT5lbmdpbmUpKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfQ0lQSEVSX0NUWF9DT1BZLEVSUl9SX0VOR0lORV9MSUIpOworCQlyZXR1cm4gMDsKKwkJfQorI2VuZGlmCisKKwlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKG91dCk7CisJbWVtY3B5KG91dCxpbixzaXplb2YgKm91dCk7CisKKwlpZiAoaW4tPmNpcGhlcl9kYXRhICYmIGluLT5jaXBoZXItPmN0eF9zaXplKQorCQl7CisJCW91dC0+Y2lwaGVyX2RhdGE9T1BFTlNTTF9tYWxsb2MoaW4tPmNpcGhlci0+Y3R4X3NpemUpOworCQlpZiAoIW91dC0+Y2lwaGVyX2RhdGEpCisJCQl7CisJCQlFVlBlcnIoRVZQX0ZfRVZQX0NJUEhFUl9DVFhfQ09QWSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJbWVtY3B5KG91dC0+Y2lwaGVyX2RhdGEsaW4tPmNpcGhlcl9kYXRhLGluLT5jaXBoZXItPmN0eF9zaXplKTsKKwkJfQorCisJaWYgKGluLT5jaXBoZXItPmZsYWdzICYgRVZQX0NJUEhfQ1VTVE9NX0NPUFkpCisJCXJldHVybiBpbi0+Y2lwaGVyLT5jdHJsKChFVlBfQ0lQSEVSX0NUWCAqKWluLCBFVlBfQ1RSTF9DT1BZLCAwLCBvdXQpOworCXJldHVybiAxOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9ldnBfZXJyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJmZWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9ldnBfZXJyLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qIGNyeXB0by9ldnAvZXZwX2Vyci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDggVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogTk9URTogdGhpcyBmaWxlIHdhcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgbWtlcnIucGwgc2NyaXB0OiBhbnkgY2hhbmdlcworICogbWFkZSB0byBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBuZXh0IHVwZGF0ZXMgdGhpcyBmaWxlLAorICogb25seSByZWFzb24gc3RyaW5ncyB3aWxsIGJlIHByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9FVlAsZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9FVlAsMCxyZWFzb24pCisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgRVZQX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoRVZQX0ZfQUVTX0lOSVRfS0VZKSwJIkFFU19JTklUX0tFWSJ9LAore0VSUl9GVU5DKEVWUF9GX0NBTUVMTElBX0lOSVRfS0VZKSwJIkNBTUVMTElBX0lOSVRfS0VZIn0sCit7RVJSX0ZVTkMoRVZQX0ZfRDJJX1BLRVkpLAkiRDJJX1BLRVkifSwKK3tFUlJfRlVOQyhFVlBfRl9ET19TSUdWRVJfSU5JVCksCSJET19TSUdWRVJfSU5JVCJ9LAore0VSUl9GVU5DKEVWUF9GX0RTQVBLRVkyUEtDUzgpLAkiRFNBUEtFWTJQS0NTOCJ9LAore0VSUl9GVU5DKEVWUF9GX0RTQV9QS0VZMlBLQ1M4KSwJIkRTQV9QS0VZMlBLQ1M4In0sCit7RVJSX0ZVTkMoRVZQX0ZfRUNEU0FfUEtFWTJQS0NTOCksCSJFQ0RTQV9QS0VZMlBLQ1M4In0sCit7RVJSX0ZVTkMoRVZQX0ZfRUNLRVlfUEtFWTJQS0NTOCksCSJFQ0tFWV9QS0VZMlBLQ1M4In0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX0NJUEhFUklOSVRfRVgpLAkiRVZQX0NpcGhlckluaXRfZXgifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfQ0lQSEVSX0NUWF9DT1BZKSwJIkVWUF9DSVBIRVJfQ1RYX2NvcHkifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfQ0lQSEVSX0NUWF9DVFJMKSwJIkVWUF9DSVBIRVJfQ1RYX2N0cmwifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfQ0lQSEVSX0NUWF9TRVRfS0VZX0xFTkdUSCksCSJFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aCJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9ERUNSWVBURklOQUxfRVgpLAkiRVZQX0RlY3J5cHRGaW5hbF9leCJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9ESUdFU1RJTklUX0VYKSwJIkVWUF9EaWdlc3RJbml0X2V4In0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX0VOQ1JZUFRGSU5BTF9FWCksCSJFVlBfRW5jcnlwdEZpbmFsX2V4In0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX01EX0NUWF9DT1BZX0VYKSwJIkVWUF9NRF9DVFhfY29weV9leCJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9NRF9TSVpFKSwJIkVWUF9NRF9TSVpFIn0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX09QRU5JTklUKSwJIkVWUF9PcGVuSW5pdCJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QQkVfQUxHX0FERCksCSJFVlBfUEJFX2FsZ19hZGQifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEJFX0FMR19BRERfVFlQRSksCSJFVlBfUEJFX2FsZ19hZGRfdHlwZSJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QQkVfQ0lQSEVSSU5JVCksCSJFVlBfUEJFX0NpcGhlckluaXQifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtDUzgyUEtFWSksCSJFVlBfUEtDUzgyUEtFWSJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0NTODJQS0VZX0JST0tFTiksCSJFVlBfUEtDUzgyUEtFWV9CUk9LRU4ifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWTJQS0NTOF9CUk9LRU4pLAkiRVZQX1BLRVkyUEtDUzhfYnJva2VuIn0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1BLRVlfQ09QWV9QQVJBTUVURVJTKSwJIkVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX0NUWF9DVFJMKSwJIkVWUF9QS0VZX0NUWF9jdHJsIn0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1BLRVlfQ1RYX0NUUkxfU1RSKSwJIkVWUF9QS0VZX0NUWF9jdHJsX3N0ciJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX0NUWF9EVVApLAkiRVZQX1BLRVlfQ1RYX2R1cCJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX0RFQ1JZUFQpLAkiRVZQX1BLRVlfZGVjcnlwdCJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX0RFQ1JZUFRfSU5JVCksCSJFVlBfUEtFWV9kZWNyeXB0X2luaXQifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9ERUNSWVBUX09MRCksCSJFVlBfUEtFWV9kZWNyeXB0X29sZCJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX0RFUklWRSksCSJFVlBfUEtFWV9kZXJpdmUifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9ERVJJVkVfSU5JVCksCSJFVlBfUEtFWV9kZXJpdmVfaW5pdCJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX0RFUklWRV9TRVRfUEVFUiksCSJFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9FTkNSWVBUKSwJIkVWUF9QS0VZX2VuY3J5cHQifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9FTkNSWVBUX0lOSVQpLAkiRVZQX1BLRVlfZW5jcnlwdF9pbml0In0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1BLRVlfRU5DUllQVF9PTEQpLAkiRVZQX1BLRVlfZW5jcnlwdF9vbGQifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9HRVQxX0RIKSwJIkVWUF9QS0VZX2dldDFfREgifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9HRVQxX0RTQSksCSJFVlBfUEtFWV9nZXQxX0RTQSJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX0dFVDFfRUNEU0EpLAkiRVZQX1BLRVlfR0VUMV9FQ0RTQSJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX0dFVDFfRUNfS0VZKSwJIkVWUF9QS0VZX2dldDFfRUNfS0VZIn0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1BLRVlfR0VUMV9SU0EpLAkiRVZQX1BLRVlfZ2V0MV9SU0EifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9LRVlHRU4pLAkiRVZQX1BLRVlfa2V5Z2VuIn0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1BLRVlfS0VZR0VOX0lOSVQpLAkiRVZQX1BLRVlfa2V5Z2VuX2luaXQifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9ORVcpLAkiRVZQX1BLRVlfbmV3In0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1BLRVlfUEFSQU1HRU4pLAkiRVZQX1BLRVlfcGFyYW1nZW4ifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9QQVJBTUdFTl9JTklUKSwJIkVWUF9QS0VZX3BhcmFtZ2VuX2luaXQifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9TSUdOKSwJIkVWUF9QS0VZX3NpZ24ifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9TSUdOX0lOSVQpLAkiRVZQX1BLRVlfc2lnbl9pbml0In0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1BLRVlfVkVSSUZZKSwJIkVWUF9QS0VZX3ZlcmlmeSJ9LAore0VSUl9GVU5DKEVWUF9GX0VWUF9QS0VZX1ZFUklGWV9JTklUKSwJIkVWUF9QS0VZX3ZlcmlmeV9pbml0In0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1BLRVlfVkVSSUZZX1JFQ09WRVIpLAkiRVZQX1BLRVlfdmVyaWZ5X3JlY292ZXIifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUEtFWV9WRVJJRllfUkVDT1ZFUl9JTklUKSwJIkVWUF9QS0VZX3ZlcmlmeV9yZWNvdmVyX2luaXQifSwKK3tFUlJfRlVOQyhFVlBfRl9FVlBfUklKTkRBRUwpLAkiRVZQX1JJSk5EQUVMIn0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1NJR05GSU5BTCksCSJFVlBfU2lnbkZpbmFsIn0sCit7RVJSX0ZVTkMoRVZQX0ZfRVZQX1ZFUklGWUZJTkFMKSwJIkVWUF9WZXJpZnlGaW5hbCJ9LAore0VSUl9GVU5DKEVWUF9GX0lOVF9DVFhfTkVXKSwJIklOVF9DVFhfTkVXIn0sCit7RVJSX0ZVTkMoRVZQX0ZfUEtDUzVfUEJFX0tFWUlWR0VOKSwJIlBLQ1M1X1BCRV9rZXlpdmdlbiJ9LAore0VSUl9GVU5DKEVWUF9GX1BLQ1M1X1YyX1BCRV9LRVlJVkdFTiksCSJQS0NTNV92Ml9QQkVfa2V5aXZnZW4ifSwKK3tFUlJfRlVOQyhFVlBfRl9QS0NTOF9TRVRfQlJPS0VOKSwJIlBLQ1M4X3NldF9icm9rZW4ifSwKK3tFUlJfRlVOQyhFVlBfRl9QS0VZX1NFVF9UWVBFKSwJIlBLRVlfU0VUX1RZUEUifSwKK3tFUlJfRlVOQyhFVlBfRl9SQzJfTUFHSUNfVE9fTUVUSCksCSJSQzJfTUFHSUNfVE9fTUVUSCJ9LAore0VSUl9GVU5DKEVWUF9GX1JDNV9DVFJMKSwJIlJDNV9DVFJMIn0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgRVZQX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oRVZQX1JfQUVTX0tFWV9TRVRVUF9GQUlMRUQpICAsImFlcyBrZXkgc2V0dXAgZmFpbGVkIn0sCit7RVJSX1JFQVNPTihFVlBfUl9BU04xX0xJQikgICAgICAgICAgICAgICwiYXNuMSBsaWIifSwKK3tFUlJfUkVBU09OKEVWUF9SX0JBRF9CTE9DS19MRU5HVEgpICAgICAgLCJiYWQgYmxvY2sgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihFVlBfUl9CQURfREVDUllQVCkgICAgICAgICAgICwiYmFkIGRlY3J5cHQifSwKK3tFUlJfUkVBU09OKEVWUF9SX0JBRF9LRVlfTEVOR1RIKSAgICAgICAgLCJiYWQga2V5IGxlbmd0aCJ9LAore0VSUl9SRUFTT04oRVZQX1JfQk5fREVDT0RFX0VSUk9SKSAgICAgICAsImJuIGRlY29kZSBlcnJvciJ9LAore0VSUl9SRUFTT04oRVZQX1JfQk5fUFVCS0VZX0VSUk9SKSAgICAgICAsImJuIHB1YmtleSBlcnJvciJ9LAore0VSUl9SRUFTT04oRVZQX1JfQlVGRkVSX1RPT19TTUFMTCkgICAgICAsImJ1ZmZlciB0b28gc21hbGwifSwKK3tFUlJfUkVBU09OKEVWUF9SX0NBTUVMTElBX0tFWV9TRVRVUF9GQUlMRUQpLCJjYW1lbGxpYSBrZXkgc2V0dXAgZmFpbGVkIn0sCit7RVJSX1JFQVNPTihFVlBfUl9DSVBIRVJfUEFSQU1FVEVSX0VSUk9SKSwiY2lwaGVyIHBhcmFtZXRlciBlcnJvciJ9LAore0VSUl9SRUFTT04oRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKSAsImNvbW1hbmQgbm90IHN1cHBvcnRlZCJ9LAore0VSUl9SRUFTT04oRVZQX1JfQ1RSTF9OT1RfSU1QTEVNRU5URUQpICAsImN0cmwgbm90IGltcGxlbWVudGVkIn0sCit7RVJSX1JFQVNPTihFVlBfUl9DVFJMX09QRVJBVElPTl9OT1RfSU1QTEVNRU5URUQpLCJjdHJsIG9wZXJhdGlvbiBub3QgaW1wbGVtZW50ZWQifSwKK3tFUlJfUkVBU09OKEVWUF9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSCksImRhdGEgbm90IG11bHRpcGxlIG9mIGJsb2NrIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oRVZQX1JfREVDT0RFX0VSUk9SKSAgICAgICAgICAsImRlY29kZSBlcnJvciJ9LAore0VSUl9SRUFTT04oRVZQX1JfRElGRkVSRU5UX0tFWV9UWVBFUykgICAsImRpZmZlcmVudCBrZXkgdHlwZXMifSwKK3tFUlJfUkVBU09OKEVWUF9SX0RJRkZFUkVOVF9QQVJBTUVURVJTKSAgLCJkaWZmZXJlbnQgcGFyYW1ldGVycyJ9LAore0VSUl9SRUFTT04oRVZQX1JfRU5DT0RFX0VSUk9SKSAgICAgICAgICAsImVuY29kZSBlcnJvciJ9LAore0VSUl9SRUFTT04oRVZQX1JfRVZQX1BCRV9DSVBIRVJJTklUX0VSUk9SKSwiZXZwIHBiZSBjaXBoZXJpbml0IGVycm9yIn0sCit7RVJSX1JFQVNPTihFVlBfUl9FWFBFQ1RJTkdfQU5fUlNBX0tFWSkgICwiZXhwZWN0aW5nIGFuIHJzYSBrZXkifSwKK3tFUlJfUkVBU09OKEVWUF9SX0VYUEVDVElOR19BX0RIX0tFWSkgICAgLCJleHBlY3RpbmcgYSBkaCBrZXkifSwKK3tFUlJfUkVBU09OKEVWUF9SX0VYUEVDVElOR19BX0RTQV9LRVkpICAgLCJleHBlY3RpbmcgYSBkc2Ega2V5In0sCit7RVJSX1JFQVNPTihFVlBfUl9FWFBFQ1RJTkdfQV9FQ0RTQV9LRVkpICwiZXhwZWN0aW5nIGEgZWNkc2Ega2V5In0sCit7RVJSX1JFQVNPTihFVlBfUl9FWFBFQ1RJTkdfQV9FQ19LRVkpICAgICwiZXhwZWN0aW5nIGEgZWMga2V5In0sCit7RVJSX1JFQVNPTihFVlBfUl9JTklUSUFMSVpBVElPTl9FUlJPUikgICwiaW5pdGlhbGl6YXRpb24gZXJyb3IifSwKK3tFUlJfUkVBU09OKEVWUF9SX0lOUFVUX05PVF9JTklUSUFMSVpFRCkgLCJpbnB1dCBub3QgaW5pdGlhbGl6ZWQifSwKK3tFUlJfUkVBU09OKEVWUF9SX0lOVkFMSURfRElHRVNUKSAgICAgICAgLCJpbnZhbGlkIGRpZ2VzdCJ9LAore0VSUl9SRUFTT04oRVZQX1JfSU5WQUxJRF9LRVlfTEVOR1RIKSAgICAsImludmFsaWQga2V5IGxlbmd0aCJ9LAore0VSUl9SRUFTT04oRVZQX1JfSU5WQUxJRF9PUEVSQVRJT04pICAgICAsImludmFsaWQgb3BlcmF0aW9uIn0sCit7RVJSX1JFQVNPTihFVlBfUl9JVl9UT09fTEFSR0UpICAgICAgICAgICwiaXYgdG9vIGxhcmdlIn0sCit7RVJSX1JFQVNPTihFVlBfUl9LRVlHRU5fRkFJTFVSRSkgICAgICAgICwia2V5Z2VuIGZhaWx1cmUifSwKK3tFUlJfUkVBU09OKEVWUF9SX01FU1NBR0VfRElHRVNUX0lTX05VTEwpLCJtZXNzYWdlIGRpZ2VzdCBpcyBudWxsIn0sCit7RVJSX1JFQVNPTihFVlBfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCkgICwibWV0aG9kIG5vdCBzdXBwb3J0ZWQifSwKK3tFUlJfUkVBU09OKEVWUF9SX01JU1NJTkdfUEFSQU1FVEVSUykgICAgLCJtaXNzaW5nIHBhcmFtZXRlcnMifSwKK3tFUlJfUkVBU09OKEVWUF9SX05PX0NJUEhFUl9TRVQpICAgICAgICAgLCJubyBjaXBoZXIgc2V0In0sCit7RVJSX1JFQVNPTihFVlBfUl9OT19ERUZBVUxUX0RJR0VTVCkgICAgICwibm8gZGVmYXVsdCBkaWdlc3QifSwKK3tFUlJfUkVBU09OKEVWUF9SX05PX0RJR0VTVF9TRVQpICAgICAgICAgLCJubyBkaWdlc3Qgc2V0In0sCit7RVJSX1JFQVNPTihFVlBfUl9OT19EU0FfUEFSQU1FVEVSUykgICAgICwibm8gZHNhIHBhcmFtZXRlcnMifSwKK3tFUlJfUkVBU09OKEVWUF9SX05PX0tFWV9TRVQpICAgICAgICAgICAgLCJubyBrZXkgc2V0In0sCit7RVJSX1JFQVNPTihFVlBfUl9OT19PUEVSQVRJT05fU0VUKSAgICAgICwibm8gb3BlcmF0aW9uIHNldCJ9LAore0VSUl9SRUFTT04oRVZQX1JfTk9fU0lHTl9GVU5DVElPTl9DT05GSUdVUkVEKSwibm8gc2lnbiBmdW5jdGlvbiBjb25maWd1cmVkIn0sCit7RVJSX1JFQVNPTihFVlBfUl9OT19WRVJJRllfRlVOQ1RJT05fQ09ORklHVVJFRCksIm5vIHZlcmlmeSBmdW5jdGlvbiBjb25maWd1cmVkIn0sCit7RVJSX1JFQVNPTihFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKSwib3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMga2V5dHlwZSJ9LAore0VSUl9SRUFTT04oRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKSwib3BlcmF0b24gbm90IGluaXRpYWxpemVkIn0sCit7RVJSX1JFQVNPTihFVlBfUl9QS0NTOF9VTktOT1dOX0JST0tFTl9UWVBFKSwicGtjczggdW5rbm93biBicm9rZW4gdHlwZSJ9LAore0VSUl9SRUFTT04oRVZQX1JfUFJJVkFURV9LRVlfREVDT0RFX0VSUk9SKSwicHJpdmF0ZSBrZXkgZGVjb2RlIGVycm9yIn0sCit7RVJSX1JFQVNPTihFVlBfUl9QUklWQVRFX0tFWV9FTkNPREVfRVJST1IpLCJwcml2YXRlIGtleSBlbmNvZGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKEVWUF9SX1BVQkxJQ19LRVlfTk9UX1JTQSkgICAgLCJwdWJsaWMga2V5IG5vdCByc2EifSwKK3tFUlJfUkVBU09OKEVWUF9SX1VOS05PV05fQ0lQSEVSKSAgICAgICAgLCJ1bmtub3duIGNpcGhlciJ9LAore0VSUl9SRUFTT04oRVZQX1JfVU5LTk9XTl9ESUdFU1QpICAgICAgICAsInVua25vd24gZGlnZXN0In0sCit7RVJSX1JFQVNPTihFVlBfUl9VTktOT1dOX1BCRV9BTEdPUklUSE0pICwidW5rbm93biBwYmUgYWxnb3JpdGhtIn0sCit7RVJSX1JFQVNPTihFVlBfUl9VTlNVUE9SVEVEX05VTUJFUl9PRl9ST1VORFMpLCJ1bnN1cG9ydGVkIG51bWJlciBvZiByb3VuZHMifSwKK3tFUlJfUkVBU09OKEVWUF9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSkgLCJ1bnN1cHBvcnRlZCBhbGdvcml0aG0ifSwKK3tFUlJfUkVBU09OKEVWUF9SX1VOU1VQUE9SVEVEX0NJUEhFUikgICAgLCJ1bnN1cHBvcnRlZCBjaXBoZXIifSwKK3tFUlJfUkVBU09OKEVWUF9SX1VOU1VQUE9SVEVEX0tFWUxFTkdUSCkgLCJ1bnN1cHBvcnRlZCBrZXlsZW5ndGgifSwKK3tFUlJfUkVBU09OKEVWUF9SX1VOU1VQUE9SVEVEX0tFWV9ERVJJVkFUSU9OX0ZVTkNUSU9OKSwidW5zdXBwb3J0ZWQga2V5IGRlcml2YXRpb24gZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKEVWUF9SX1VOU1VQUE9SVEVEX0tFWV9TSVpFKSAgLCJ1bnN1cHBvcnRlZCBrZXkgc2l6ZSJ9LAore0VSUl9SRUFTT04oRVZQX1JfVU5TVVBQT1JURURfUFJGKSAgICAgICAsInVuc3VwcG9ydGVkIHByZiJ9LAore0VSUl9SRUFTT04oRVZQX1JfVU5TVVBQT1JURURfUFJJVkFURV9LRVlfQUxHT1JJVEhNKSwidW5zdXBwb3J0ZWQgcHJpdmF0ZSBrZXkgYWxnb3JpdGhtIn0sCit7RVJSX1JFQVNPTihFVlBfUl9VTlNVUFBPUlRFRF9TQUxUX1RZUEUpICwidW5zdXBwb3J0ZWQgc2FsdCB0eXBlIn0sCit7RVJSX1JFQVNPTihFVlBfUl9XUk9OR19GSU5BTF9CTE9DS19MRU5HVEgpLCJ3cm9uZyBmaW5hbCBibG9jayBsZW5ndGgifSwKK3tFUlJfUkVBU09OKEVWUF9SX1dST05HX1BVQkxJQ19LRVlfVFlQRSkgLCJ3cm9uZyBwdWJsaWMga2V5IHR5cGUifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfRVZQX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKEVWUF9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxFVlBfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxFVlBfc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9rZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWQ2YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9rZXkuYwpAQCAtMCwwICsxLDE4MCBAQAorLyogY3J5cHRvL2V2cC9ldnBfa2V5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdWkuaD4KKworLyogc2hvdWxkIGJlIGluaXQgdG8gemVyb3MuICovCitzdGF0aWMgY2hhciBwcm9tcHRfc3RyaW5nWzgwXTsKKwordm9pZCBFVlBfc2V0X3B3X3Byb21wdChjb25zdCBjaGFyICpwcm9tcHQpCisJeworCWlmIChwcm9tcHQgPT0gTlVMTCkKKwkJcHJvbXB0X3N0cmluZ1swXT0nXDAnOworCWVsc2UKKwkJeworCQlzdHJuY3B5KHByb21wdF9zdHJpbmcscHJvbXB0LDc5KTsKKwkJcHJvbXB0X3N0cmluZ1s3OV09J1wwJzsKKwkJfQorCX0KKworY2hhciAqRVZQX2dldF9wd19wcm9tcHQodm9pZCkKKwl7CisJaWYgKHByb21wdF9zdHJpbmdbMF0gPT0gJ1wwJykKKwkJcmV0dXJuKE5VTEwpOworCWVsc2UKKwkJcmV0dXJuKHByb21wdF9zdHJpbmcpOworCX0KKworLyogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgdGhlIHN0YW5kYXJkIGZ1bmN0aW9uIGZvciByZWFkaW5nIHBhc3N3b3JkcyBpcworICogaW4gdGhlIERFUyBsaWJyYXJ5IC0tIGlmIHNvbWVvbmUgZXZlciB3YW50cyB0byBkaXNhYmxlIERFUywKKyAqIHRoaXMgZnVuY3Rpb24gd2lsbCBmYWlsICovCitpbnQgRVZQX3JlYWRfcHdfc3RyaW5nKGNoYXIgKmJ1ZiwgaW50IGxlbiwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgdmVyaWZ5KQorCXsKKwlyZXR1cm4gRVZQX3JlYWRfcHdfc3RyaW5nX21pbihidWYsIDAsIGxlbiwgcHJvbXB0LCB2ZXJpZnkpOworCX0KKworaW50IEVWUF9yZWFkX3B3X3N0cmluZ19taW4oY2hhciAqYnVmLCBpbnQgbWluLCBpbnQgbGVuLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCB2ZXJpZnkpCisJeworCWludCByZXQ7CisJY2hhciBidWZmW0JVRlNJWl07CisJVUkgKnVpOworCisJaWYgKChwcm9tcHQgPT0gTlVMTCkgJiYgKHByb21wdF9zdHJpbmdbMF0gIT0gJ1wwJykpCisJCXByb21wdD1wcm9tcHRfc3RyaW5nOworCXVpID0gVUlfbmV3KCk7CisJVUlfYWRkX2lucHV0X3N0cmluZyh1aSxwcm9tcHQsMCxidWYsbWluLChsZW4+PUJVRlNJWik/QlVGU0laLTE6bGVuKTsKKwlpZiAodmVyaWZ5KQorCQlVSV9hZGRfdmVyaWZ5X3N0cmluZyh1aSxwcm9tcHQsMCwKKwkJCWJ1ZmYsbWluLChsZW4+PUJVRlNJWik/QlVGU0laLTE6bGVuLGJ1Zik7CisJcmV0ID0gVUlfcHJvY2Vzcyh1aSk7CisJVUlfZnJlZSh1aSk7CisJT1BFTlNTTF9jbGVhbnNlKGJ1ZmYsQlVGU0laKTsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEVWUF9CeXRlc1RvS2V5KGNvbnN0IEVWUF9DSVBIRVIgKnR5cGUsIGNvbnN0IEVWUF9NRCAqbWQsIAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGRhdGFsLAorCSAgICAgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICprZXksIHVuc2lnbmVkIGNoYXIgKml2KQorCXsKKwlFVlBfTURfQ1RYIGM7CisJdW5zaWduZWQgY2hhciBtZF9idWZbRVZQX01BWF9NRF9TSVpFXTsKKwlpbnQgbml2LG5rZXksYWRkbWQ9MDsKKwl1bnNpZ25lZCBpbnQgbWRzPTAsaTsKKworCW5rZXk9dHlwZS0+a2V5X2xlbjsKKwluaXY9dHlwZS0+aXZfbGVuOworCU9QRU5TU0xfYXNzZXJ0KG5rZXkgPD0gRVZQX01BWF9LRVlfTEVOR1RIKTsKKwlPUEVOU1NMX2Fzc2VydChuaXYgPD0gRVZQX01BWF9JVl9MRU5HVEgpOworCisJaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuKG5rZXkpOworCisJRVZQX01EX0NUWF9pbml0KCZjKTsKKwlmb3IgKDs7KQorCQl7CisJCWlmICghRVZQX0RpZ2VzdEluaXRfZXgoJmMsbWQsIE5VTEwpKQorCQkJcmV0dXJuIDA7CisJCWlmIChhZGRtZCsrKQorCQkJRVZQX0RpZ2VzdFVwZGF0ZSgmYywmKG1kX2J1ZlswXSksbWRzKTsKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmYyxkYXRhLGRhdGFsKTsKKwkJaWYgKHNhbHQgIT0gTlVMTCkKKwkJCUVWUF9EaWdlc3RVcGRhdGUoJmMsc2FsdCxQS0NTNV9TQUxUX0xFTik7CisJCUVWUF9EaWdlc3RGaW5hbF9leCgmYywmKG1kX2J1ZlswXSksJm1kcyk7CisKKwkJZm9yIChpPTE7IGk8KHVuc2lnbmVkIGludCljb3VudDsgaSsrKQorCQkJeworCQkJRVZQX0RpZ2VzdEluaXRfZXgoJmMsbWQsIE5VTEwpOworCQkJRVZQX0RpZ2VzdFVwZGF0ZSgmYywmKG1kX2J1ZlswXSksbWRzKTsKKwkJCUVWUF9EaWdlc3RGaW5hbF9leCgmYywmKG1kX2J1ZlswXSksJm1kcyk7CisJCQl9CisJCWk9MDsKKwkJaWYgKG5rZXkpCisJCQl7CisJCQlmb3IgKDs7KQorCQkJCXsKKwkJCQlpZiAobmtleSA9PSAwKSBicmVhazsKKwkJCQlpZiAoaSA9PSBtZHMpIGJyZWFrOworCQkJCWlmIChrZXkgIT0gTlVMTCkKKwkJCQkJKihrZXkrKyk9bWRfYnVmW2ldOworCQkJCW5rZXktLTsKKwkJCQlpKys7CisJCQkJfQorCQkJfQorCQlpZiAobml2ICYmIChpICE9IG1kcykpCisJCQl7CisJCQlmb3IgKDs7KQorCQkJCXsKKwkJCQlpZiAobml2ID09IDApIGJyZWFrOworCQkJCWlmIChpID09IG1kcykgYnJlYWs7CisJCQkJaWYgKGl2ICE9IE5VTEwpCisJCQkJCSooaXYrKyk9bWRfYnVmW2ldOworCQkJCW5pdi0tOworCQkJCWkrKzsKKwkJCQl9CisJCQl9CisJCWlmICgobmtleSA9PSAwKSAmJiAobml2ID09IDApKSBicmVhazsKKwkJfQorCUVWUF9NRF9DVFhfY2xlYW51cCgmYyk7CisJT1BFTlNTTF9jbGVhbnNlKCYobWRfYnVmWzBdKSxFVlBfTUFYX01EX1NJWkUpOworCXJldHVybih0eXBlLT5rZXlfbGVuKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX2xpYi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9ldnBfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5NTFhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX2xpYi5jCkBAIC0wLDAgKzEsMzEyIEBACisvKiBjcnlwdG8vZXZwL2V2cF9saWIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKK2ludCBFVlBfQ0lQSEVSX3BhcmFtX3RvX2FzbjEoRVZQX0NJUEhFUl9DVFggKmMsIEFTTjFfVFlQRSAqdHlwZSkKKwl7CisJaW50IHJldDsKKworCWlmIChjLT5jaXBoZXItPnNldF9hc24xX3BhcmFtZXRlcnMgIT0gTlVMTCkKKwkJcmV0PWMtPmNpcGhlci0+c2V0X2FzbjFfcGFyYW1ldGVycyhjLHR5cGUpOworCWVsc2UKKwkJcmV0PS0xOworCXJldHVybihyZXQpOworCX0KKworaW50IEVWUF9DSVBIRVJfYXNuMV90b19wYXJhbShFVlBfQ0lQSEVSX0NUWCAqYywgQVNOMV9UWVBFICp0eXBlKQorCXsKKwlpbnQgcmV0OworCisJaWYgKGMtPmNpcGhlci0+Z2V0X2FzbjFfcGFyYW1ldGVycyAhPSBOVUxMKQorCQlyZXQ9Yy0+Y2lwaGVyLT5nZXRfYXNuMV9wYXJhbWV0ZXJzKGMsdHlwZSk7CisJZWxzZQorCQlyZXQ9LTE7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgRVZQX0NJUEhFUl9nZXRfYXNuMV9pdihFVlBfQ0lQSEVSX0NUWCAqYywgQVNOMV9UWVBFICp0eXBlKQorCXsKKwlpbnQgaT0wOworCXVuc2lnbmVkIGludCBsOworCisJaWYgKHR5cGUgIT0gTlVMTCkgCisJCXsKKwkJbD1FVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoYyk7CisJCU9QRU5TU0xfYXNzZXJ0KGwgPD0gc2l6ZW9mKGMtPml2KSk7CisJCWk9QVNOMV9UWVBFX2dldF9vY3RldHN0cmluZyh0eXBlLGMtPm9pdixsKTsKKwkJaWYgKGkgIT0gKGludClsKQorCQkJcmV0dXJuKC0xKTsKKwkJZWxzZSBpZiAoaSA+IDApCisJCQltZW1jcHkoYy0+aXYsYy0+b2l2LGwpOworCQl9CisJcmV0dXJuKGkpOworCX0KKworaW50IEVWUF9DSVBIRVJfc2V0X2FzbjFfaXYoRVZQX0NJUEhFUl9DVFggKmMsIEFTTjFfVFlQRSAqdHlwZSkKKwl7CisJaW50IGk9MDsKKwl1bnNpZ25lZCBpbnQgajsKKworCWlmICh0eXBlICE9IE5VTEwpCisJCXsKKwkJaj1FVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoYyk7CisJCU9QRU5TU0xfYXNzZXJ0KGogPD0gc2l6ZW9mKGMtPml2KSk7CisJCWk9QVNOMV9UWVBFX3NldF9vY3RldHN0cmluZyh0eXBlLGMtPm9pdixqKTsKKwkJfQorCXJldHVybihpKTsKKwl9CisKKy8qIENvbnZlcnQgdGhlIHZhcmlvdXMgY2lwaGVyIE5JRHMgYW5kIGR1bW1pZXMgdG8gYSBwcm9wZXIgT0lEIE5JRCAqLworaW50IEVWUF9DSVBIRVJfdHlwZShjb25zdCBFVlBfQ0lQSEVSICpjdHgpCit7CisJaW50IG5pZDsKKwlBU04xX09CSkVDVCAqb3RtcDsKKwluaWQgPSBFVlBfQ0lQSEVSX25pZChjdHgpOworCisJc3dpdGNoKG5pZCkgeworCisJCWNhc2UgTklEX3JjMl9jYmM6CisJCWNhc2UgTklEX3JjMl82NF9jYmM6CisJCWNhc2UgTklEX3JjMl80MF9jYmM6CisKKwkJcmV0dXJuIE5JRF9yYzJfY2JjOworCisJCWNhc2UgTklEX3JjNDoKKwkJY2FzZSBOSURfcmM0XzQwOgorCisJCXJldHVybiBOSURfcmM0OworCisJCWNhc2UgTklEX2Flc18xMjhfY2ZiMTI4OgorCQljYXNlIE5JRF9hZXNfMTI4X2NmYjg6CisJCWNhc2UgTklEX2Flc18xMjhfY2ZiMToKKworCQlyZXR1cm4gTklEX2Flc18xMjhfY2ZiMTI4OworCisJCWNhc2UgTklEX2Flc18xOTJfY2ZiMTI4OgorCQljYXNlIE5JRF9hZXNfMTkyX2NmYjg6CisJCWNhc2UgTklEX2Flc18xOTJfY2ZiMToKKworCQlyZXR1cm4gTklEX2Flc18xOTJfY2ZiMTI4OworCisJCWNhc2UgTklEX2Flc18yNTZfY2ZiMTI4OgorCQljYXNlIE5JRF9hZXNfMjU2X2NmYjg6CisJCWNhc2UgTklEX2Flc18yNTZfY2ZiMToKKworCQlyZXR1cm4gTklEX2Flc18yNTZfY2ZiMTI4OworCisJCWNhc2UgTklEX2Rlc19jZmI2NDoKKwkJY2FzZSBOSURfZGVzX2NmYjg6CisJCWNhc2UgTklEX2Rlc19jZmIxOgorCisJCXJldHVybiBOSURfZGVzX2NmYjY0OworCisJCWNhc2UgTklEX2Rlc19lZGUzX2NmYjY0OgorCQljYXNlIE5JRF9kZXNfZWRlM19jZmI4OgorCQljYXNlIE5JRF9kZXNfZWRlM19jZmIxOgorCisJCXJldHVybiBOSURfZGVzX2NmYjY0OworCisJCWRlZmF1bHQ6CisJCS8qIENoZWNrIGl0IGhhcyBhbiBPSUQgYW5kIGl0IGlzIHZhbGlkICovCisJCW90bXAgPSBPQkpfbmlkMm9iaihuaWQpOworCQlpZighb3RtcCB8fCAhb3RtcC0+ZGF0YSkgbmlkID0gTklEX3VuZGVmOworCQlBU04xX09CSkVDVF9mcmVlKG90bXApOworCQlyZXR1cm4gbmlkOworCX0KK30KKworaW50IEVWUF9DSVBIRVJfYmxvY2tfc2l6ZShjb25zdCBFVlBfQ0lQSEVSICplKQorCXsKKwlyZXR1cm4gZS0+YmxvY2tfc2l6ZTsKKwl9CisKK2ludCBFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZTsKKwl9CisKK2ludCBFVlBfQ2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGludCBpbmwpCisJeworCXJldHVybiBjdHgtPmNpcGhlci0+ZG9fY2lwaGVyKGN0eCxvdXQsaW4saW5sKTsKKwl9CisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9DSVBIRVJfQ1RYX2NpcGhlcihjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gY3R4LT5jaXBoZXI7CisJfQorCit1bnNpZ25lZCBsb25nIEVWUF9DSVBIRVJfZmxhZ3MoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKQorCXsKKwlyZXR1cm4gY2lwaGVyLT5mbGFnczsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgRVZQX0NJUEhFUl9DVFhfZmxhZ3MoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+Y2lwaGVyLT5mbGFnczsKKwl9CisKK3ZvaWQgKkVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gY3R4LT5hcHBfZGF0YTsKKwl9CisKK3ZvaWQgRVZQX0NJUEhFUl9DVFhfc2V0X2FwcF9kYXRhKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHZvaWQgKmRhdGEpCisJeworCWN0eC0+YXBwX2RhdGEgPSBkYXRhOworCX0KKworaW50IEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcikKKwl7CisJcmV0dXJuIGNpcGhlci0+aXZfbGVuOworCX0KKworaW50IEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aChjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gY3R4LT5jaXBoZXItPml2X2xlbjsKKwl9CisKK2ludCBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKQorCXsKKwlyZXR1cm4gY2lwaGVyLT5rZXlfbGVuOworCX0KKworaW50IEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+a2V5X2xlbjsKKwl9CisKK2ludCBFVlBfQ0lQSEVSX25pZChjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpCisJeworCXJldHVybiBjaXBoZXItPm5pZDsKKwl9CisKK2ludCBFVlBfQ0lQSEVSX0NUWF9uaWQoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+Y2lwaGVyLT5uaWQ7CisJfQorCitpbnQgRVZQX01EX2Jsb2NrX3NpemUoY29uc3QgRVZQX01EICptZCkgCisJeworCXJldHVybiBtZC0+YmxvY2tfc2l6ZTsKKwl9CisKK2ludCBFVlBfTURfdHlwZShjb25zdCBFVlBfTUQgKm1kKQorCXsKKwlyZXR1cm4gbWQtPnR5cGU7CisJfQorCitpbnQgRVZQX01EX3BrZXlfdHlwZShjb25zdCBFVlBfTUQgKm1kKQorCXsKKwlyZXR1cm4gbWQtPnBrZXlfdHlwZTsKKwl9CisKK2ludCBFVlBfTURfc2l6ZShjb25zdCBFVlBfTUQgKm1kKQorCXsKKwlpZiAoIW1kKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfTURfU0laRSwgRVZQX1JfTUVTU0FHRV9ESUdFU1RfSVNfTlVMTCk7CisJCXJldHVybiAtMTsKKwkJfQorCXJldHVybiBtZC0+bWRfc2l6ZTsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgRVZQX01EX2ZsYWdzKGNvbnN0IEVWUF9NRCAqbWQpCisJeworCXJldHVybiBtZC0+ZmxhZ3M7CisJfQorCitjb25zdCBFVlBfTUQgKkVWUF9NRF9DVFhfbWQoY29uc3QgRVZQX01EX0NUWCAqY3R4KQorCXsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGN0eC0+ZGlnZXN0OworCX0KKwordm9pZCBFVlBfTURfQ1RYX3NldF9mbGFncyhFVlBfTURfQ1RYICpjdHgsIGludCBmbGFncykKKwl7CisJY3R4LT5mbGFncyB8PSBmbGFnczsKKwl9CisKK3ZvaWQgRVZQX01EX0NUWF9jbGVhcl9mbGFncyhFVlBfTURfQ1RYICpjdHgsIGludCBmbGFncykKKwl7CisJY3R4LT5mbGFncyAmPSB+ZmxhZ3M7CisJfQorCitpbnQgRVZQX01EX0NUWF90ZXN0X2ZsYWdzKGNvbnN0IEVWUF9NRF9DVFggKmN0eCwgaW50IGZsYWdzKQorCXsKKwlyZXR1cm4gKGN0eC0+ZmxhZ3MgJiBmbGFncyk7CisJfQorCit2b2lkIEVWUF9DSVBIRVJfQ1RYX3NldF9mbGFncyhFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgZmxhZ3MpCisJeworCWN0eC0+ZmxhZ3MgfD0gZmxhZ3M7CisJfQorCit2b2lkIEVWUF9DSVBIRVJfQ1RYX2NsZWFyX2ZsYWdzKEVWUF9DSVBIRVJfQ1RYICpjdHgsIGludCBmbGFncykKKwl7CisJY3R4LT5mbGFncyAmPSB+ZmxhZ3M7CisJfQorCitpbnQgRVZQX0NJUEhFUl9DVFhfdGVzdF9mbGFncyhjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgZmxhZ3MpCisJeworCXJldHVybiAoY3R4LT5mbGFncyAmIGZsYWdzKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9sb2NsLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyZDc0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX2xvY2wuaApAQCAtMCwwICsxLDM0NSBAQAorLyogZXZwX2xvY2wuaCAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogTWFjcm9zIHRvIGNvZGUgYmxvY2sgY2lwaGVyIHdyYXBwZXJzICovCisKKy8qIFdyYXBwZXIgZnVuY3Rpb25zIGZvciBlYWNoIGNpcGhlciBtb2RlICovCisKKyNkZWZpbmUgQkxPQ0tfQ0lQSEVSX2VjYl9sb29wKCkgXAorCXNpemVfdCBpLCBibDsgXAorCWJsID0gY3R4LT5jaXBoZXItPmJsb2NrX3NpemU7XAorCWlmKGlubCA8IGJsKSByZXR1cm4gMTtcCisJaW5sIC09IGJsOyBcCisJZm9yKGk9MDsgaSA8PSBpbmw7IGkrPWJsKSAKKworI2RlZmluZSBCTE9DS19DSVBIRVJfZnVuY19lY2IoY25hbWUsIGNwcmVmaXgsIGtzdHJ1Y3QsIGtzY2hlZCkgXAorc3RhdGljIGludCBjbmFtZSMjX2VjYl9jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubCkgXAore1wKKwlCTE9DS19DSVBIRVJfZWNiX2xvb3AoKSBcCisJCWNwcmVmaXgjI19lY2JfZW5jcnlwdChpbiArIGksIG91dCArIGksICYoKGtzdHJ1Y3QgKiljdHgtPmNpcGhlcl9kYXRhKS0+a3NjaGVkLCBjdHgtPmVuY3J5cHQpO1wKKwlyZXR1cm4gMTtcCit9CisKKyNkZWZpbmUgRVZQX01BWENIVU5LICgoc2l6ZV90KTE8PChzaXplb2YobG9uZykqOC0yKSkKKworI2RlZmluZSBCTE9DS19DSVBIRVJfZnVuY19vZmIoY25hbWUsIGNwcmVmaXgsIGNiaXRzLCBrc3RydWN0LCBrc2NoZWQpIFwKK3N0YXRpYyBpbnQgY25hbWUjI19vZmJfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpIFwKK3tcCisJd2hpbGUoaW5sPj1FVlBfTUFYQ0hVTkspXAorCSAgICB7XAorCSAgICBjcHJlZml4IyNfb2ZiIyNjYml0cyMjX2VuY3J5cHQoaW4sIG91dCwgKGxvbmcpRVZQX01BWENIVU5LLCAmKChrc3RydWN0ICopY3R4LT5jaXBoZXJfZGF0YSktPmtzY2hlZCwgY3R4LT5pdiwgJmN0eC0+bnVtKTtcCisJICAgIGlubC09RVZQX01BWENIVU5LO1wKKwkgICAgaW4gKz1FVlBfTUFYQ0hVTks7XAorCSAgICBvdXQrPUVWUF9NQVhDSFVOSztcCisJICAgIH1cCisJaWYgKGlubClcCisJICAgIGNwcmVmaXgjI19vZmIjI2NiaXRzIyNfZW5jcnlwdChpbiwgb3V0LCAobG9uZylpbmwsICYoKGtzdHJ1Y3QgKiljdHgtPmNpcGhlcl9kYXRhKS0+a3NjaGVkLCBjdHgtPml2LCAmY3R4LT5udW0pO1wKKwlyZXR1cm4gMTtcCit9CisKKyNkZWZpbmUgQkxPQ0tfQ0lQSEVSX2Z1bmNfY2JjKGNuYW1lLCBjcHJlZml4LCBrc3RydWN0LCBrc2NoZWQpIFwKK3N0YXRpYyBpbnQgY25hbWUjI19jYmNfY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmwpIFwKK3tcCisJd2hpbGUoaW5sPj1FVlBfTUFYQ0hVTkspIFwKKwkgICAge1wKKwkgICAgY3ByZWZpeCMjX2NiY19lbmNyeXB0KGluLCBvdXQsIChsb25nKUVWUF9NQVhDSFVOSywgJigoa3N0cnVjdCAqKWN0eC0+Y2lwaGVyX2RhdGEpLT5rc2NoZWQsIGN0eC0+aXYsIGN0eC0+ZW5jcnlwdCk7XAorCSAgICBpbmwtPUVWUF9NQVhDSFVOSztcCisJICAgIGluICs9RVZQX01BWENIVU5LO1wKKwkgICAgb3V0Kz1FVlBfTUFYQ0hVTks7XAorCSAgICB9XAorCWlmIChpbmwpXAorCSAgICBjcHJlZml4IyNfY2JjX2VuY3J5cHQoaW4sIG91dCwgKGxvbmcpaW5sLCAmKChrc3RydWN0ICopY3R4LT5jaXBoZXJfZGF0YSktPmtzY2hlZCwgY3R4LT5pdiwgY3R4LT5lbmNyeXB0KTtcCisJcmV0dXJuIDE7XAorfQorCisjZGVmaW5lIEJMT0NLX0NJUEhFUl9mdW5jX2NmYihjbmFtZSwgY3ByZWZpeCwgY2JpdHMsIGtzdHJ1Y3QsIGtzY2hlZCkgXAorc3RhdGljIGludCBjbmFtZSMjX2NmYiMjY2JpdHMjI19jaXBoZXIoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubCkgXAore1wKKwlzaXplX3QgY2h1bms9RVZQX01BWENIVU5LO1wKKwlpZiAoY2JpdHM9PTEpICBjaHVuaz4+PTM7XAorCWlmIChpbmw8Y2h1bmspIGNodW5rPWlubDtcCisJd2hpbGUoaW5sICYmIGlubD49Y2h1bmspXAorCSAgICB7XAorICAgICAgICAgICAgY3ByZWZpeCMjX2NmYiMjY2JpdHMjI19lbmNyeXB0KGluLCBvdXQsIChsb25nKSgoY2JpdHM9PTEpICYmICEoY3R4LT5mbGFncyAmIEVWUF9DSVBIX0ZMQUdfTEVOR1RIX0JJVFMpID9pbmwqODppbmwpLCAmKChrc3RydWN0ICopY3R4LT5jaXBoZXJfZGF0YSktPmtzY2hlZCwgY3R4LT5pdiwgJmN0eC0+bnVtLCBjdHgtPmVuY3J5cHQpO1wKKwkgICAgaW5sLT1jaHVuaztcCisJICAgIGluICs9Y2h1bms7XAorCSAgICBvdXQrPWNodW5rO1wKKwkgICAgaWYoaW5sPGNodW5rKSBjaHVuaz1pbmw7XAorCSAgICB9XAorCXJldHVybiAxO1wKK30KKworI2RlZmluZSBCTE9DS19DSVBIRVJfYWxsX2Z1bmNzKGNuYW1lLCBjcHJlZml4LCBjYml0cywga3N0cnVjdCwga3NjaGVkKSBcCisJQkxPQ0tfQ0lQSEVSX2Z1bmNfY2JjKGNuYW1lLCBjcHJlZml4LCBrc3RydWN0LCBrc2NoZWQpIFwKKwlCTE9DS19DSVBIRVJfZnVuY19jZmIoY25hbWUsIGNwcmVmaXgsIGNiaXRzLCBrc3RydWN0LCBrc2NoZWQpIFwKKwlCTE9DS19DSVBIRVJfZnVuY19lY2IoY25hbWUsIGNwcmVmaXgsIGtzdHJ1Y3QsIGtzY2hlZCkgXAorCUJMT0NLX0NJUEhFUl9mdW5jX29mYihjbmFtZSwgY3ByZWZpeCwgY2JpdHMsIGtzdHJ1Y3QsIGtzY2hlZCkKKworI2RlZmluZSBCTE9DS19DSVBIRVJfZGVmMShjbmFtZSwgbm1vZGUsIG1vZGUsIE1PREUsIGtzdHJ1Y3QsIG5pZCwgYmxvY2tfc2l6ZSwgXAorCQkJICBrZXlfbGVuLCBpdl9sZW4sIGZsYWdzLCBpbml0X2tleSwgY2xlYW51cCwgXAorCQkJICBzZXRfYXNuMSwgZ2V0X2FzbjEsIGN0cmwpIFwKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGNuYW1lIyNfIyNtb2RlID0geyBcCisJbmlkIyNfIyNubW9kZSwgYmxvY2tfc2l6ZSwga2V5X2xlbiwgaXZfbGVuLCBcCisJZmxhZ3MgfCBFVlBfQ0lQSF8jI01PREUjI19NT0RFLCBcCisJaW5pdF9rZXksIFwKKwljbmFtZSMjXyMjbW9kZSMjX2NpcGhlciwgXAorCWNsZWFudXAsIFwKKwlzaXplb2Yoa3N0cnVjdCksIFwKKwlzZXRfYXNuMSwgZ2V0X2FzbjEsXAorCWN0cmwsIFwKKwlOVUxMIFwKK307IFwKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF8jI2NuYW1lIyNfIyNtb2RlKHZvaWQpIHsgcmV0dXJuICZjbmFtZSMjXyMjbW9kZTsgfQorCisjZGVmaW5lIEJMT0NLX0NJUEhFUl9kZWZfY2JjKGNuYW1lLCBrc3RydWN0LCBuaWQsIGJsb2NrX3NpemUsIGtleV9sZW4sIFwKKwkJCSAgICAgaXZfbGVuLCBmbGFncywgaW5pdF9rZXksIGNsZWFudXAsIHNldF9hc24xLCBcCisJCQkgICAgIGdldF9hc24xLCBjdHJsKSBcCitCTE9DS19DSVBIRVJfZGVmMShjbmFtZSwgY2JjLCBjYmMsIENCQywga3N0cnVjdCwgbmlkLCBibG9ja19zaXplLCBrZXlfbGVuLCBcCisJCSAgaXZfbGVuLCBmbGFncywgaW5pdF9rZXksIGNsZWFudXAsIHNldF9hc24xLCBnZXRfYXNuMSwgY3RybCkKKworI2RlZmluZSBCTE9DS19DSVBIRVJfZGVmX2NmYihjbmFtZSwga3N0cnVjdCwgbmlkLCBrZXlfbGVuLCBcCisJCQkgICAgIGl2X2xlbiwgY2JpdHMsIGZsYWdzLCBpbml0X2tleSwgY2xlYW51cCwgXAorCQkJICAgICBzZXRfYXNuMSwgZ2V0X2FzbjEsIGN0cmwpIFwKK0JMT0NLX0NJUEhFUl9kZWYxKGNuYW1lLCBjZmIjI2NiaXRzLCBjZmIjI2NiaXRzLCBDRkIsIGtzdHJ1Y3QsIG5pZCwgMSwgXAorCQkgIGtleV9sZW4sIGl2X2xlbiwgZmxhZ3MsIGluaXRfa2V5LCBjbGVhbnVwLCBzZXRfYXNuMSwgXAorCQkgIGdldF9hc24xLCBjdHJsKQorCisjZGVmaW5lIEJMT0NLX0NJUEhFUl9kZWZfb2ZiKGNuYW1lLCBrc3RydWN0LCBuaWQsIGtleV9sZW4sIFwKKwkJCSAgICAgaXZfbGVuLCBjYml0cywgZmxhZ3MsIGluaXRfa2V5LCBjbGVhbnVwLCBcCisJCQkgICAgIHNldF9hc24xLCBnZXRfYXNuMSwgY3RybCkgXAorQkxPQ0tfQ0lQSEVSX2RlZjEoY25hbWUsIG9mYiMjY2JpdHMsIG9mYiwgT0ZCLCBrc3RydWN0LCBuaWQsIDEsIFwKKwkJICBrZXlfbGVuLCBpdl9sZW4sIGZsYWdzLCBpbml0X2tleSwgY2xlYW51cCwgc2V0X2FzbjEsIFwKKwkJICBnZXRfYXNuMSwgY3RybCkKKworI2RlZmluZSBCTE9DS19DSVBIRVJfZGVmX2VjYihjbmFtZSwga3N0cnVjdCwgbmlkLCBibG9ja19zaXplLCBrZXlfbGVuLCBcCisJCQkgICAgIGZsYWdzLCBpbml0X2tleSwgY2xlYW51cCwgc2V0X2FzbjEsIFwKKwkJCSAgICAgZ2V0X2FzbjEsIGN0cmwpIFwKK0JMT0NLX0NJUEhFUl9kZWYxKGNuYW1lLCBlY2IsIGVjYiwgRUNCLCBrc3RydWN0LCBuaWQsIGJsb2NrX3NpemUsIGtleV9sZW4sIFwKKwkJICAwLCBmbGFncywgaW5pdF9rZXksIGNsZWFudXAsIHNldF9hc24xLCBnZXRfYXNuMSwgY3RybCkKKworI2RlZmluZSBCTE9DS19DSVBIRVJfZGVmcyhjbmFtZSwga3N0cnVjdCwgXAorCQkJICBuaWQsIGJsb2NrX3NpemUsIGtleV9sZW4sIGl2X2xlbiwgY2JpdHMsIGZsYWdzLCBcCisJCQkgIGluaXRfa2V5LCBjbGVhbnVwLCBzZXRfYXNuMSwgZ2V0X2FzbjEsIGN0cmwpIFwKK0JMT0NLX0NJUEhFUl9kZWZfY2JjKGNuYW1lLCBrc3RydWN0LCBuaWQsIGJsb2NrX3NpemUsIGtleV9sZW4sIGl2X2xlbiwgZmxhZ3MsIFwKKwkJICAgICBpbml0X2tleSwgY2xlYW51cCwgc2V0X2FzbjEsIGdldF9hc24xLCBjdHJsKSBcCitCTE9DS19DSVBIRVJfZGVmX2NmYihjbmFtZSwga3N0cnVjdCwgbmlkLCBrZXlfbGVuLCBpdl9sZW4sIGNiaXRzLCBcCisJCSAgICAgZmxhZ3MsIGluaXRfa2V5LCBjbGVhbnVwLCBzZXRfYXNuMSwgZ2V0X2FzbjEsIGN0cmwpIFwKK0JMT0NLX0NJUEhFUl9kZWZfb2ZiKGNuYW1lLCBrc3RydWN0LCBuaWQsIGtleV9sZW4sIGl2X2xlbiwgY2JpdHMsIFwKKwkJICAgICBmbGFncywgaW5pdF9rZXksIGNsZWFudXAsIHNldF9hc24xLCBnZXRfYXNuMSwgY3RybCkgXAorQkxPQ0tfQ0lQSEVSX2RlZl9lY2IoY25hbWUsIGtzdHJ1Y3QsIG5pZCwgYmxvY2tfc2l6ZSwga2V5X2xlbiwgZmxhZ3MsIFwKKwkJICAgICBpbml0X2tleSwgY2xlYW51cCwgc2V0X2FzbjEsIGdldF9hc24xLCBjdHJsKQorCisKKy8qCisjZGVmaW5lIEJMT0NLX0NJUEhFUl9kZWZzKGNuYW1lLCBrc3RydWN0LCBcCisJCQkJbmlkLCBibG9ja19zaXplLCBrZXlfbGVuLCBpdl9sZW4sIGZsYWdzLFwKKwkJCQkgaW5pdF9rZXksIGNsZWFudXAsIHNldF9hc24xLCBnZXRfYXNuMSwgY3RybClcCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBjbmFtZSMjX2NiYyA9IHtcCisJbmlkIyNfY2JjLCBibG9ja19zaXplLCBrZXlfbGVuLCBpdl9sZW4sIFwKKwlmbGFncyB8IEVWUF9DSVBIX0NCQ19NT0RFLFwKKwlpbml0X2tleSxcCisJY25hbWUjI19jYmNfY2lwaGVyLFwKKwljbGVhbnVwLFwKKwlzaXplb2YoRVZQX0NJUEhFUl9DVFgpLXNpemVvZigoKChFVlBfQ0lQSEVSX0NUWCAqKU5VTEwpLT5jKSkrXAorCQlzaXplb2YoKCgoRVZQX0NJUEhFUl9DVFggKilOVUxMKS0+Yy5rc3RydWN0KSksXAorCXNldF9hc24xLCBnZXRfYXNuMSxcCisJY3RybCwgXAorCU5VTEwgXAorfTtcCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfIyNjbmFtZSMjX2NiYyh2b2lkKSB7IHJldHVybiAmY25hbWUjI19jYmM7IH1cCitzdGF0aWMgY29uc3QgRVZQX0NJUEhFUiBjbmFtZSMjX2NmYiA9IHtcCisJbmlkIyNfY2ZiNjQsIDEsIGtleV9sZW4sIGl2X2xlbiwgXAorCWZsYWdzIHwgRVZQX0NJUEhfQ0ZCX01PREUsXAorCWluaXRfa2V5LFwKKwljbmFtZSMjX2NmYl9jaXBoZXIsXAorCWNsZWFudXAsXAorCXNpemVvZihFVlBfQ0lQSEVSX0NUWCktc2l6ZW9mKCgoKEVWUF9DSVBIRVJfQ1RYICopTlVMTCktPmMpKStcCisJCXNpemVvZigoKChFVlBfQ0lQSEVSX0NUWCAqKU5VTEwpLT5jLmtzdHJ1Y3QpKSxcCisJc2V0X2FzbjEsIGdldF9hc24xLFwKKwljdHJsLFwKKwlOVUxMIFwKK307XAorY29uc3QgRVZQX0NJUEhFUiAqRVZQXyMjY25hbWUjI19jZmIodm9pZCkgeyByZXR1cm4gJmNuYW1lIyNfY2ZiOyB9XAorc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgY25hbWUjI19vZmIgPSB7XAorCW5pZCMjX29mYjY0LCAxLCBrZXlfbGVuLCBpdl9sZW4sIFwKKwlmbGFncyB8IEVWUF9DSVBIX09GQl9NT0RFLFwKKwlpbml0X2tleSxcCisJY25hbWUjI19vZmJfY2lwaGVyLFwKKwljbGVhbnVwLFwKKwlzaXplb2YoRVZQX0NJUEhFUl9DVFgpLXNpemVvZigoKChFVlBfQ0lQSEVSX0NUWCAqKU5VTEwpLT5jKSkrXAorCQlzaXplb2YoKCgoRVZQX0NJUEhFUl9DVFggKilOVUxMKS0+Yy5rc3RydWN0KSksXAorCXNldF9hc24xLCBnZXRfYXNuMSxcCisJY3RybCxcCisJTlVMTCBcCit9O1wKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF8jI2NuYW1lIyNfb2ZiKHZvaWQpIHsgcmV0dXJuICZjbmFtZSMjX29mYjsgfVwKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIGNuYW1lIyNfZWNiID0ge1wKKwluaWQjI19lY2IsIGJsb2NrX3NpemUsIGtleV9sZW4sIGl2X2xlbiwgXAorCWZsYWdzIHwgRVZQX0NJUEhfRUNCX01PREUsXAorCWluaXRfa2V5LFwKKwljbmFtZSMjX2VjYl9jaXBoZXIsXAorCWNsZWFudXAsXAorCXNpemVvZihFVlBfQ0lQSEVSX0NUWCktc2l6ZW9mKCgoKEVWUF9DSVBIRVJfQ1RYICopTlVMTCktPmMpKStcCisJCXNpemVvZigoKChFVlBfQ0lQSEVSX0NUWCAqKU5VTEwpLT5jLmtzdHJ1Y3QpKSxcCisJc2V0X2FzbjEsIGdldF9hc24xLFwKKwljdHJsLFwKKwlOVUxMIFwKK307XAorY29uc3QgRVZQX0NJUEhFUiAqRVZQXyMjY25hbWUjI19lY2Iodm9pZCkgeyByZXR1cm4gJmNuYW1lIyNfZWNiOyB9CisqLworCisjZGVmaW5lIElNUExFTUVOVF9CTE9DS19DSVBIRVIoY25hbWUsIGtzY2hlZCwgY3ByZWZpeCwga3N0cnVjdCwgbmlkLCBcCisJCQkgICAgICAgYmxvY2tfc2l6ZSwga2V5X2xlbiwgaXZfbGVuLCBjYml0cywgXAorCQkJICAgICAgIGZsYWdzLCBpbml0X2tleSwgXAorCQkJICAgICAgIGNsZWFudXAsIHNldF9hc24xLCBnZXRfYXNuMSwgY3RybCkgXAorCUJMT0NLX0NJUEhFUl9hbGxfZnVuY3MoY25hbWUsIGNwcmVmaXgsIGNiaXRzLCBrc3RydWN0LCBrc2NoZWQpIFwKKwlCTE9DS19DSVBIRVJfZGVmcyhjbmFtZSwga3N0cnVjdCwgbmlkLCBibG9ja19zaXplLCBrZXlfbGVuLCBpdl9sZW4sIFwKKwkJCSAgY2JpdHMsIGZsYWdzLCBpbml0X2tleSwgY2xlYW51cCwgc2V0X2FzbjEsIFwKKwkJCSAgZ2V0X2FzbjEsIGN0cmwpCisKKyNkZWZpbmUgRVZQX0NfREFUQShrc3RydWN0LCBjdHgpCSgoa3N0cnVjdCAqKShjdHgpLT5jaXBoZXJfZGF0YSkKKworI2RlZmluZSBJTVBMRU1FTlRfQ0ZCUihjaXBoZXIsY3ByZWZpeCxrc3RydWN0LGtzY2hlZCxrZXlzaXplLGNiaXRzLGl2X2xlbikgXAorCUJMT0NLX0NJUEhFUl9mdW5jX2NmYihjaXBoZXIjI18jI2tleXNpemUsY3ByZWZpeCxjYml0cyxrc3RydWN0LGtzY2hlZCkgXAorCUJMT0NLX0NJUEhFUl9kZWZfY2ZiKGNpcGhlciMjXyMja2V5c2l6ZSxrc3RydWN0LCBcCisJCQkgICAgIE5JRF8jI2NpcGhlciMjXyMja2V5c2l6ZSwga2V5c2l6ZS84LCBpdl9sZW4sIGNiaXRzLCBcCisJCQkgICAgIDAsIGNpcGhlciMjX2luaXRfa2V5LCBOVUxMLCBcCisJCQkgICAgIEVWUF9DSVBIRVJfc2V0X2FzbjFfaXYsIFwKKwkJCSAgICAgRVZQX0NJUEhFUl9nZXRfYXNuMV9pdiwgXAorCQkJICAgICBOVUxMKQorCitzdHJ1Y3QgZXZwX3BrZXlfY3R4X3N0CisJeworCS8qIE1ldGhvZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcGVyYXRpb24gKi8KKwljb25zdCBFVlBfUEtFWV9NRVRIT0QgKnBtZXRoOworCS8qIEVuZ2luZSB0aGF0IGltcGxlbWVudHMgdGhpcyBtZXRob2Qgb3IgTlVMTCBpZiBidWlsdGluICovCisJRU5HSU5FICplbmdpbmU7CisJLyogS2V5OiBtYXkgYmUgTlVMTCAqLworCUVWUF9QS0VZICpwa2V5OworCS8qIFBlZXIga2V5IGZvciBrZXkgYWdyZWVtZW50LCBtYXkgYmUgTlVMTCAqLworCUVWUF9QS0VZICpwZWVya2V5OworCS8qIEFjdHVhbCBvcGVyYXRpb24gKi8KKwlpbnQgb3BlcmF0aW9uOworCS8qIEFsZ29yaXRobSBzcGVjaWZpYyBkYXRhICovCisJdm9pZCAqZGF0YTsKKwkvKiBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhICovCisJdm9pZCAqYXBwX2RhdGE7CisJLyogS2V5Z2VuIGNhbGxiYWNrICovCisJRVZQX1BLRVlfZ2VuX2NiICpwa2V5X2dlbmNiOworCS8qIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGtleWdlbiBkYXRhICovCisJaW50ICprZXlnZW5faW5mbzsKKwlpbnQga2V5Z2VuX2luZm9fY291bnQ7CisJfSAvKiBFVlBfUEtFWV9DVFggKi87CisKKyNkZWZpbmUgRVZQX1BLRVlfRkxBR19EWU5BTUlDCTEKKworc3RydWN0IGV2cF9wa2V5X21ldGhvZF9zdAorCXsKKwlpbnQgcGtleV9pZDsKKwlpbnQgZmxhZ3M7CisKKwlpbnQgKCppbml0KShFVlBfUEtFWV9DVFggKmN0eCk7CisJaW50ICgqY29weSkoRVZQX1BLRVlfQ1RYICpkc3QsIEVWUF9QS0VZX0NUWCAqc3JjKTsKKwl2b2lkICgqY2xlYW51cCkoRVZQX1BLRVlfQ1RYICpjdHgpOworCisJaW50ICgqcGFyYW1nZW5faW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpOworCWludCAoKnBhcmFtZ2VuKShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpOworCisJaW50ICgqa2V5Z2VuX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKKwlpbnQgKCprZXlnZW4pKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSk7CisKKwlpbnQgKCpzaWduX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKKwlpbnQgKCpzaWduKShFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pOworCisJaW50ICgqdmVyaWZ5X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKKwlpbnQgKCp2ZXJpZnkpKEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pOworCisJaW50ICgqdmVyaWZ5X3JlY292ZXJfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpOworCWludCAoKnZlcmlmeV9yZWNvdmVyKShFVlBfUEtFWV9DVFggKmN0eCwKKwkJCQl1bnNpZ25lZCBjaGFyICpyb3V0LCBzaXplX3QgKnJvdXRsZW4sCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3Qgc2lnbGVuKTsKKworCWludCAoKnNpZ25jdHhfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpOworCWludCAoKnNpZ25jdHgpKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCAqc2lnbGVuLAorCQkJCQlFVlBfTURfQ1RYICptY3R4KTsKKworCWludCAoKnZlcmlmeWN0eF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX01EX0NUWCAqbWN0eCk7CisJaW50ICgqdmVyaWZ5Y3R4KShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLGludCBzaWdsZW4sCisJCQkJCUVWUF9NRF9DVFggKm1jdHgpOworCisJaW50ICgqZW5jcnlwdF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7CisJaW50ICgqZW5jcnlwdCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pOworCisJaW50ICgqZGVjcnlwdF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCk7CisJaW50ICgqZGVjcnlwdCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pOworCisJaW50ICgqZGVyaXZlX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KTsKKwlpbnQgKCpkZXJpdmUpKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICprZXksIHNpemVfdCAqa2V5bGVuKTsKKworCWludCAoKmN0cmwpKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgdHlwZSwgaW50IHAxLCB2b2lkICpwMik7CisJaW50ICgqY3RybF9zdHIpKEVWUF9QS0VZX0NUWCAqY3R4LCBjb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICp2YWx1ZSk7CisKKworCX0gLyogRVZQX1BLRVlfTUVUSE9EICovOworCit2b2lkIGV2cF9wa2V5X3NldF9jYl90cmFuc2xhdGUoQk5fR0VOQ0IgKmNiLCBFVlBfUEtFWV9DVFggKmN0eCk7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9wYmUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX3BiZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZDkzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9wYmUuYwpAQCAtMCwwICsxLDMxMSBAQAorLyogZXZwX3BiZS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisvKiBQYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIChQQkUpIGZ1bmN0aW9ucyAqLworCitERUNMQVJFX1NUQUNLX09GKEVWUF9QQkVfQ1RMKQorc3RhdGljIFNUQUNLX09GKEVWUF9QQkVfQ1RMKSAqcGJlX2FsZ3M7CisKKy8qIFNldHVwIGEgY2lwaGVyIGNvbnRleHQgZnJvbSBhIFBCRSBhbGdvcml0aG0gKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJaW50IHBiZV90eXBlOworCWludCBwYmVfbmlkOworCWludCBjaXBoZXJfbmlkOworCWludCBtZF9uaWQ7CisJRVZQX1BCRV9LRVlHRU4gKmtleWdlbjsKKwl9IEVWUF9QQkVfQ1RMOworCitzdGF0aWMgY29uc3QgRVZQX1BCRV9DVEwgYnVpbHRpbl9wYmVbXSA9IAorCXsKKwl7RVZQX1BCRV9UWVBFX09VVEVSLCBOSURfcGJlV2l0aE1EMkFuZERFU19DQkMsCisJCQlOSURfZGVzX2NiYywgTklEX21kMiwgUEtDUzVfUEJFX2tleWl2Z2VufSwKKwl7RVZQX1BCRV9UWVBFX09VVEVSLCBOSURfcGJlV2l0aE1ENUFuZERFU19DQkMsCisJCQlOSURfZGVzX2NiYywgTklEX21kNSwgUEtDUzVfUEJFX2tleWl2Z2VufSwKKwl7RVZQX1BCRV9UWVBFX09VVEVSLCBOSURfcGJlV2l0aFNIQTFBbmRSQzJfQ0JDLAorCQkJTklEX3JjMl82NF9jYmMsIE5JRF9zaGExLCBQS0NTNV9QQkVfa2V5aXZnZW59LAorCisJe0VWUF9QQkVfVFlQRV9PVVRFUiwgTklEX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDNCwKKwkJCU5JRF9yYzQsIE5JRF9zaGExLCBQS0NTMTJfUEJFX2tleWl2Z2VufSwKKwl7RVZQX1BCRV9UWVBFX09VVEVSLCBOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQsCisJCQlOSURfcmM0XzQwLCBOSURfc2hhMSwgUEtDUzEyX1BCRV9rZXlpdmdlbn0sCisJe0VWUF9QQkVfVFlQRV9PVVRFUiwgTklEX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMsCisJCSAJTklEX2Rlc19lZGUzX2NiYywgTklEX3NoYTEsIFBLQ1MxMl9QQkVfa2V5aXZnZW59LAorCXtFVlBfUEJFX1RZUEVfT1VURVIsIE5JRF9wYmVfV2l0aFNIQTFBbmQyX0tleV9UcmlwbGVERVNfQ0JDLCAKKwkJCU5JRF9kZXNfZWRlX2NiYywgTklEX3NoYTEsIFBLQ1MxMl9QQkVfa2V5aXZnZW59LAorCXtFVlBfUEJFX1RZUEVfT1VURVIsIE5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDLAorCQkJTklEX3JjMl9jYmMsIE5JRF9zaGExLCBQS0NTMTJfUEJFX2tleWl2Z2VufSwKKwl7RVZQX1BCRV9UWVBFX09VVEVSLCBOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDLAorCQkJTklEX3JjMl80MF9jYmMsIE5JRF9zaGExLCBQS0NTMTJfUEJFX2tleWl2Z2VufSwKKworI2lmbmRlZiBPUEVOU1NMX05PX0hNQUMKKwl7RVZQX1BCRV9UWVBFX09VVEVSLCBOSURfcGJlczIsIC0xLCAtMSwgUEtDUzVfdjJfUEJFX2tleWl2Z2VufSwKKyNlbmRpZgorCXtFVlBfUEJFX1RZUEVfT1VURVIsIE5JRF9wYmVXaXRoTUQyQW5kUkMyX0NCQywKKwkJCU5JRF9yYzJfNjRfY2JjLCBOSURfbWQyLCBQS0NTNV9QQkVfa2V5aXZnZW59LAorCXtFVlBfUEJFX1RZUEVfT1VURVIsIE5JRF9wYmVXaXRoTUQ1QW5kUkMyX0NCQywKKwkJCU5JRF9yYzJfNjRfY2JjLCBOSURfbWQ1LCBQS0NTNV9QQkVfa2V5aXZnZW59LAorCXtFVlBfUEJFX1RZUEVfT1VURVIsIE5JRF9wYmVXaXRoU0hBMUFuZERFU19DQkMsCisJCQlOSURfZGVzX2NiYywgTklEX3NoYTEsIFBLQ1M1X1BCRV9rZXlpdmdlbn0sCisKKworCXtFVlBfUEJFX1RZUEVfUFJGLCBOSURfaG1hY1dpdGhTSEExLCAtMSwgTklEX3NoYTEsIDB9LAorCXtFVlBfUEJFX1RZUEVfUFJGLCBOSURfaG1hY1dpdGhNRDUsIC0xLCBOSURfbWQ1LCAwfSwKKwl7RVZQX1BCRV9UWVBFX1BSRiwgTklEX2htYWNXaXRoU0hBMjI0LCAtMSwgTklEX3NoYTIyNCwgMH0sCisJe0VWUF9QQkVfVFlQRV9QUkYsIE5JRF9obWFjV2l0aFNIQTI1NiwgLTEsIE5JRF9zaGEyNTYsIDB9LAorCXtFVlBfUEJFX1RZUEVfUFJGLCBOSURfaG1hY1dpdGhTSEEzODQsIC0xLCBOSURfc2hhMzg0LCAwfSwKKwl7RVZQX1BCRV9UWVBFX1BSRiwgTklEX2htYWNXaXRoU0hBNTEyLCAtMSwgTklEX3NoYTUxMiwgMH0sCisJe0VWUF9QQkVfVFlQRV9QUkYsIE5JRF9pZF9ITUFDR29zdFIzNDExXzk0LCAtMSwgTklEX2lkX0dvc3RSMzQxMV85NCwgMH0sCisJfTsKKworI2lmZGVmIFRFU1QKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJaW50IGksIG5pZF9tZCwgbmlkX2NpcGhlcjsKKwlFVlBfUEJFX0NUTCAqdHBiZSwgKnRwYmUyOworCS8qT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsqLworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihidWlsdGluX3BiZSkvc2l6ZW9mKEVWUF9QQkVfQ1RMKTsgaSsrKQorCQl7CisJCXRwYmUgPSBidWlsdGluX3BiZSArIGk7CisJCWZwcmludGYoc3RkZXJyLCAiJWQgJWQgJXMgIiwgdHBiZS0+cGJlX3R5cGUsIHRwYmUtPnBiZV9uaWQsCisJCQkJCQlPQkpfbmlkMnNuKHRwYmUtPnBiZV9uaWQpKTsKKwkJaWYgKEVWUF9QQkVfZmluZCh0cGJlLT5wYmVfdHlwZSwgdHBiZS0+cGJlX25pZCwKKwkJCQkJJm5pZF9jaXBoZXIgLCZuaWRfbWQsMCkpCisJCQlmcHJpbnRmKHN0ZGVyciwgIkZvdW5kICVzICVzXG4iLAorCQkJCQlPQkpfbmlkMnNuKG5pZF9jaXBoZXIpLAorCQkJCQlPQkpfbmlkMnNuKG5pZF9tZCkpOworCQllbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwgIkZpbmQgRVJST1IhIVxuIik7CisJCX0KKworCXJldHVybiAwOworCX0KKyNlbmRpZgorCQkKKworCitpbnQgRVZQX1BCRV9DaXBoZXJJbml0KEFTTjFfT0JKRUNUICpwYmVfb2JqLCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJICAgICAgIEFTTjFfVFlQRSAqcGFyYW0sIEVWUF9DSVBIRVJfQ1RYICpjdHgsIGludCBlbl9kZSkKKwl7CisJY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyOworCWNvbnN0IEVWUF9NRCAqbWQ7CisJaW50IGNpcGhlcl9uaWQsIG1kX25pZDsKKwlFVlBfUEJFX0tFWUdFTiAqa2V5Z2VuOworCisJaWYgKCFFVlBfUEJFX2ZpbmQoRVZQX1BCRV9UWVBFX09VVEVSLCBPQkpfb2JqMm5pZChwYmVfb2JqKSwKKwkJCQkJJmNpcGhlcl9uaWQsICZtZF9uaWQsICZrZXlnZW4pKQorCQl7CisJCWNoYXIgb2JqX3RtcFs4MF07CisJCUVWUGVycihFVlBfRl9FVlBfUEJFX0NJUEhFUklOSVQsRVZQX1JfVU5LTk9XTl9QQkVfQUxHT1JJVEhNKTsKKwkJaWYgKCFwYmVfb2JqKSBCVUZfc3RybGNweSAob2JqX3RtcCwgIk5VTEwiLCBzaXplb2Ygb2JqX3RtcCk7CisJCWVsc2UgaTJ0X0FTTjFfT0JKRUNUKG9ial90bXAsIHNpemVvZiBvYmpfdG1wLCBwYmVfb2JqKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJUWVBFPSIsIG9ial90bXApOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYoIXBhc3MpCisJCXBhc3NsZW4gPSAwOworCWVsc2UgaWYgKHBhc3NsZW4gPT0gLTEpCisJCXBhc3NsZW4gPSBzdHJsZW4ocGFzcyk7CisKKwlpZiAoY2lwaGVyX25pZCA9PSAtMSkKKwkJY2lwaGVyID0gTlVMTDsKKwllbHNlCisJCXsKKwkJY2lwaGVyID0gRVZQX2dldF9jaXBoZXJieW5pZChjaXBoZXJfbmlkKTsKKwkJaWYgKCFjaXBoZXIpCisJCQl7CisJCQlFVlBlcnIoRVZQX0ZfRVZQX1BCRV9DSVBIRVJJTklULEVWUF9SX1VOS05PV05fQ0lQSEVSKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwlpZiAobWRfbmlkID09IC0xKQorCQltZCA9IE5VTEw7CisJZWxzZQorCQl7CisJCW1kID0gRVZQX2dldF9kaWdlc3RieW5pZChtZF9uaWQpOworCQlpZiAoIW1kKQorCQkJeworCQkJRVZQZXJyKEVWUF9GX0VWUF9QQkVfQ0lQSEVSSU5JVCxFVlBfUl9VTktOT1dOX0RJR0VTVCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJaWYgKCFrZXlnZW4oY3R4LCBwYXNzLCBwYXNzbGVuLCBwYXJhbSwgY2lwaGVyLCBtZCwgZW5fZGUpKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEJFX0NJUEhFUklOSVQsRVZQX1JfS0VZR0VOX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOwkKK30KKworREVDTEFSRV9PQkpfQlNFQVJDSF9DTVBfRk4oRVZQX1BCRV9DVEwsIEVWUF9QQkVfQ1RMLCBwYmUyKTsKKworc3RhdGljIGludCBwYmUyX2NtcChjb25zdCBFVlBfUEJFX0NUTCAqcGJlMSwgY29uc3QgRVZQX1BCRV9DVEwgKnBiZTIpCisJeworCWludCByZXQgPSBwYmUxLT5wYmVfdHlwZSAtIHBiZTItPnBiZV90eXBlOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJZWxzZQorCQlyZXR1cm4gcGJlMS0+cGJlX25pZCAtIHBiZTItPnBiZV9uaWQ7CisJfQorCitJTVBMRU1FTlRfT0JKX0JTRUFSQ0hfQ01QX0ZOKEVWUF9QQkVfQ1RMLCBFVlBfUEJFX0NUTCwgcGJlMik7CisKK3N0YXRpYyBpbnQgcGJlX2NtcChjb25zdCBFVlBfUEJFX0NUTCAqIGNvbnN0ICphLCBjb25zdCBFVlBfUEJFX0NUTCAqIGNvbnN0ICpiKQorCXsKKwlpbnQgcmV0ID0gKCphKS0+cGJlX3R5cGUgLSAoKmIpLT5wYmVfdHlwZTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWVsc2UKKwkJcmV0dXJuICgqYSktPnBiZV9uaWQgLSAoKmIpLT5wYmVfbmlkOworCX0KKworLyogQWRkIGEgUEJFIGFsZ29yaXRobSAqLworCitpbnQgRVZQX1BCRV9hbGdfYWRkX3R5cGUoaW50IHBiZV90eXBlLCBpbnQgcGJlX25pZCwgaW50IGNpcGhlcl9uaWQsIGludCBtZF9uaWQsCisJCQkgRVZQX1BCRV9LRVlHRU4gKmtleWdlbikKKwl7CisJRVZQX1BCRV9DVEwgKnBiZV90bXA7CisJaWYgKCFwYmVfYWxncykKKwkJcGJlX2FsZ3MgPSBza19FVlBfUEJFX0NUTF9uZXcocGJlX2NtcCk7CisJaWYgKCEocGJlX3RtcCA9IChFVlBfUEJFX0NUTCopIE9QRU5TU0xfbWFsbG9jIChzaXplb2YoRVZQX1BCRV9DVEwpKSkpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QQkVfQUxHX0FERF9UWVBFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlwYmVfdG1wLT5wYmVfdHlwZSA9IHBiZV90eXBlOworCXBiZV90bXAtPnBiZV9uaWQgPSBwYmVfbmlkOworCXBiZV90bXAtPmNpcGhlcl9uaWQgPSBjaXBoZXJfbmlkOworCXBiZV90bXAtPm1kX25pZCA9IG1kX25pZDsKKwlwYmVfdG1wLT5rZXlnZW4gPSBrZXlnZW47CisKKworCXNrX0VWUF9QQkVfQ1RMX3B1c2ggKHBiZV9hbGdzLCBwYmVfdG1wKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBFVlBfUEJFX2FsZ19hZGQoaW50IG5pZCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBFVlBfTUQgKm1kLAorCQkgICAgRVZQX1BCRV9LRVlHRU4gKmtleWdlbikKKwl7CisJaW50IGNpcGhlcl9uaWQsIG1kX25pZDsKKwlpZiAoY2lwaGVyKQorCQljaXBoZXJfbmlkID0gRVZQX0NJUEhFUl90eXBlKGNpcGhlcik7CisJZWxzZQorCQljaXBoZXJfbmlkID0gLTE7CisJaWYgKG1kKQorCQltZF9uaWQgPSBFVlBfTURfdHlwZShtZCk7CisJZWxzZQorCQltZF9uaWQgPSAtMTsKKworCXJldHVybiBFVlBfUEJFX2FsZ19hZGRfdHlwZShFVlBfUEJFX1RZUEVfT1VURVIsIG5pZCwKKwkJCQkJY2lwaGVyX25pZCwgbWRfbmlkLCBrZXlnZW4pOworCX0KKworaW50IEVWUF9QQkVfZmluZChpbnQgdHlwZSwgaW50IHBiZV9uaWQsCisJCSBpbnQgKnBjbmlkLCBpbnQgKnBtbmlkLCBFVlBfUEJFX0tFWUdFTiAqKnBrZXlnZW4pCisJeworCUVWUF9QQkVfQ1RMICpwYmV0bXAgPSBOVUxMLCBwYmVsdTsKKwlpbnQgaTsKKwlpZiAocGJlX25pZCA9PSBOSURfdW5kZWYpCisJCXJldHVybiAwOworCisJcGJlbHUucGJlX3R5cGUgPSB0eXBlOworCXBiZWx1LnBiZV9uaWQgPSBwYmVfbmlkOworCisJaWYgKHBiZV9hbGdzKQorCQl7CisJCWkgPSBza19FVlBfUEJFX0NUTF9maW5kKHBiZV9hbGdzLCAmcGJlbHUpOworCQlpZiAoaSAhPSAtMSkKKwkJCXBiZXRtcCA9IHNrX0VWUF9QQkVfQ1RMX3ZhbHVlIChwYmVfYWxncywgaSk7CisJCX0KKwlpZiAocGJldG1wID09IE5VTEwpCisJCXsKKwkJcGJldG1wID0gT0JKX2JzZWFyY2hfcGJlMigmcGJlbHUsIGJ1aWx0aW5fcGJlLAorCQkJCSAgICAgc2l6ZW9mKGJ1aWx0aW5fcGJlKS9zaXplb2YoRVZQX1BCRV9DVEwpKTsKKwkJfQorCWlmIChwYmV0bXAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHBjbmlkKQorCQkqcGNuaWQgPSBwYmV0bXAtPmNpcGhlcl9uaWQ7CisJaWYgKHBtbmlkKQorCQkqcG1uaWQgPSBwYmV0bXAtPm1kX25pZDsKKwlpZiAocGtleWdlbikKKwkJKnBrZXlnZW4gPSBwYmV0bXAtPmtleWdlbjsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyB2b2lkIGZyZWVfZXZwX3BiZV9jdGwoRVZQX1BCRV9DVEwgKnBiZSkKKwkgeworCSBPUEVOU1NMX2ZyZWVGdW5jKHBiZSk7CisJIH0KKwordm9pZCBFVlBfUEJFX2NsZWFudXAodm9pZCkKKwl7CisJc2tfRVZQX1BCRV9DVExfcG9wX2ZyZWUocGJlX2FsZ3MsIGZyZWVfZXZwX3BiZV9jdGwpOworCXBiZV9hbGdzID0gTlVMTDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9wa2V5LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL2V2cF9wa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VlYmY2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX3BrZXkuYwpAQCAtMCwwICsxLDI0MiBAQAorLyogZXZwX3BrZXkuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgImFzbjFfbG9jbC5oIgorCisvKiBFeHRyYWN0IGEgcHJpdmF0ZSBrZXkgZnJvbSBhIFBLQ1M4IHN0cnVjdHVyZSAqLworCitFVlBfUEtFWSAqRVZQX1BLQ1M4MlBLRVkoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgpCit7CisJRVZQX1BLRVkgKnBrZXkgPSBOVUxMOworCUFTTjFfT0JKRUNUICphbGdvaWQ7CisJY2hhciBvYmpfdG1wWzgwXTsKKworCWlmICghUEtDUzhfcGtleV9nZXQwKCZhbGdvaWQsIE5VTEwsIE5VTEwsIE5VTEwsIHA4KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIShwa2V5ID0gRVZQX1BLRVlfbmV3KCkpKSB7CisJCUVWUGVycihFVlBfRl9FVlBfUEtDUzgyUEtFWSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmICghRVZQX1BLRVlfc2V0X3R5cGUocGtleSwgT0JKX29iajJuaWQoYWxnb2lkKSkpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0NTODJQS0VZLCBFVlBfUl9VTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0pOworCQlpMnRfQVNOMV9PQkpFQ1Qob2JqX3RtcCwgODAsIGFsZ29pZCk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiVFlQRT0iLCBvYmpfdG1wKTsKKwkJZ290byBlcnJvcjsKKwkJfQorCisJaWYgKHBrZXktPmFtZXRoLT5wcml2X2RlY29kZSkKKwkJeworCQlpZiAoIXBrZXktPmFtZXRoLT5wcml2X2RlY29kZShwa2V5LCBwOCkpCisJCQl7CisJCQlFVlBlcnIoRVZQX0ZfRVZQX1BLQ1M4MlBLRVksCisJCQkJCUVWUF9SX1BSSVZBVEVfS0VZX0RFQ09ERV9FUlJPUik7CisJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtDUzgyUEtFWSwgRVZQX1JfTUVUSE9EX05PVF9TVVBQT1JURUQpOworCQlnb3RvIGVycm9yOworCQl9CisKKwlyZXR1cm4gcGtleTsKKworCWVycm9yOgorCUVWUF9QS0VZX2ZyZWUgKHBrZXkpOworCXJldHVybiBOVUxMOworfQorCitQS0NTOF9QUklWX0tFWV9JTkZPICpFVlBfUEtFWTJQS0NTOChFVlBfUEtFWSAqcGtleSkKK3sKKwlyZXR1cm4gRVZQX1BLRVkyUEtDUzhfYnJva2VuKHBrZXksIFBLQ1M4X09LKTsKK30KKworLyogVHVybiBhIHByaXZhdGUga2V5IGludG8gYSBQS0NTOCBzdHJ1Y3R1cmUgKi8KKworUEtDUzhfUFJJVl9LRVlfSU5GTyAqRVZQX1BLRVkyUEtDUzhfYnJva2VuKEVWUF9QS0VZICpwa2V5LCBpbnQgYnJva2VuKQoreworCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4OworCisJaWYgKCEocDggPSBQS0NTOF9QUklWX0tFWV9JTkZPX25ldygpKSkgewkKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZMlBLQ1M4X0JST0tFTixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlwOC0+YnJva2VuID0gYnJva2VuOworCisJaWYgKHBrZXktPmFtZXRoKQorCQl7CisJCWlmIChwa2V5LT5hbWV0aC0+cHJpdl9lbmNvZGUpCisJCQl7CisJCQlpZiAoIXBrZXktPmFtZXRoLT5wcml2X2VuY29kZShwOCwgcGtleSkpCisJCQkJeworCQkJCUVWUGVycihFVlBfRl9FVlBfUEtFWTJQS0NTOF9CUk9LRU4sCisJCQkJCUVWUF9SX1BSSVZBVEVfS0VZX0VOQ09ERV9FUlJPUik7CisJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUVWUGVycihFVlBfRl9FVlBfUEtFWTJQS0NTOF9CUk9LRU4sCisJCQkJCUVWUF9SX01FVEhPRF9OT1RfU1VQUE9SVEVEKTsKKwkJCWdvdG8gZXJyb3I7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZMlBLQ1M4X0JST0tFTiwKKwkJCQlFVlBfUl9VTlNVUFBPUlRFRF9QUklWQVRFX0tFWV9BTEdPUklUSE0pOworCQlnb3RvIGVycm9yOworCQl9CisJUkFORF9hZGQocDgtPnBrZXktPnZhbHVlLm9jdGV0X3N0cmluZy0+ZGF0YSwKKwkJIHA4LT5wa2V5LT52YWx1ZS5vY3RldF9zdHJpbmctPmxlbmd0aCwgMC4wKTsKKwlyZXR1cm4gcDg7CisJZXJyb3I6CisJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4KTsKKwlyZXR1cm4gTlVMTDsKK30KKworUEtDUzhfUFJJVl9LRVlfSU5GTyAqUEtDUzhfc2V0X2Jyb2tlbihQS0NTOF9QUklWX0tFWV9JTkZPICpwOCwgaW50IGJyb2tlbikKK3sKKwlzd2l0Y2ggKGJyb2tlbikgeworCisJCWNhc2UgUEtDUzhfT0s6CisJCXA4LT5icm9rZW4gPSBQS0NTOF9PSzsKKwkJcmV0dXJuIHA4OworCQlicmVhazsKKworCQljYXNlIFBLQ1M4X05PX09DVEVUOgorCQlwOC0+YnJva2VuID0gUEtDUzhfTk9fT0NURVQ7CisJCXA4LT5wa2V5LT50eXBlID0gVl9BU04xX1NFUVVFTkNFOworCQlyZXR1cm4gcDg7CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCUVWUGVycihFVlBfRl9QS0NTOF9TRVRfQlJPS0VOLEVWUF9SX1BLQ1M4X1VOS05PV05fQlJPS0VOX1RZUEUpOworCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qIEVWUF9QS0VZIGF0dHJpYnV0ZSBmdW5jdGlvbnMgKi8KKworaW50IEVWUF9QS0VZX2dldF9hdHRyX2NvdW50KGNvbnN0IEVWUF9QS0VZICprZXkpCit7CisJcmV0dXJuIFg1MDlhdF9nZXRfYXR0cl9jb3VudChrZXktPmF0dHJpYnV0ZXMpOworfQorCitpbnQgRVZQX1BLRVlfZ2V0X2F0dHJfYnlfTklEKGNvbnN0IEVWUF9QS0VZICprZXksIGludCBuaWQsCisJCQkgIGludCBsYXN0cG9zKQoreworCXJldHVybiBYNTA5YXRfZ2V0X2F0dHJfYnlfTklEKGtleS0+YXR0cmlidXRlcywgbmlkLCBsYXN0cG9zKTsKK30KKworaW50IEVWUF9QS0VZX2dldF9hdHRyX2J5X09CSihjb25zdCBFVlBfUEtFWSAqa2V5LCBBU04xX09CSkVDVCAqb2JqLAorCQkJICBpbnQgbGFzdHBvcykKK3sKKwlyZXR1cm4gWDUwOWF0X2dldF9hdHRyX2J5X09CSihrZXktPmF0dHJpYnV0ZXMsIG9iaiwgbGFzdHBvcyk7Cit9CisKK1g1MDlfQVRUUklCVVRFICpFVlBfUEtFWV9nZXRfYXR0cihjb25zdCBFVlBfUEtFWSAqa2V5LCBpbnQgbG9jKQoreworCXJldHVybiBYNTA5YXRfZ2V0X2F0dHIoa2V5LT5hdHRyaWJ1dGVzLCBsb2MpOworfQorCitYNTA5X0FUVFJJQlVURSAqRVZQX1BLRVlfZGVsZXRlX2F0dHIoRVZQX1BLRVkgKmtleSwgaW50IGxvYykKK3sKKwlyZXR1cm4gWDUwOWF0X2RlbGV0ZV9hdHRyKGtleS0+YXR0cmlidXRlcywgbG9jKTsKK30KKworaW50IEVWUF9QS0VZX2FkZDFfYXR0cihFVlBfUEtFWSAqa2V5LCBYNTA5X0FUVFJJQlVURSAqYXR0cikKK3sKKwlpZihYNTA5YXRfYWRkMV9hdHRyKCZrZXktPmF0dHJpYnV0ZXMsIGF0dHIpKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IEVWUF9QS0VZX2FkZDFfYXR0cl9ieV9PQkooRVZQX1BLRVkgKmtleSwKKwkJCWNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCit7CisJaWYoWDUwOWF0X2FkZDFfYXR0cl9ieV9PQkooJmtleS0+YXR0cmlidXRlcywgb2JqLAorCQkJCXR5cGUsIGJ5dGVzLCBsZW4pKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IEVWUF9QS0VZX2FkZDFfYXR0cl9ieV9OSUQoRVZQX1BLRVkgKmtleSwKKwkJCWludCBuaWQsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCit7CisJaWYoWDUwOWF0X2FkZDFfYXR0cl9ieV9OSUQoJmtleS0+YXR0cmlidXRlcywgbmlkLAorCQkJCXR5cGUsIGJ5dGVzLCBsZW4pKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IEVWUF9QS0VZX2FkZDFfYXR0cl9ieV90eHQoRVZQX1BLRVkgKmtleSwKKwkJCWNvbnN0IGNoYXIgKmF0dHJuYW1lLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQoreworCWlmKFg1MDlhdF9hZGQxX2F0dHJfYnlfdHh0KCZrZXktPmF0dHJpYnV0ZXMsIGF0dHJuYW1lLAorCQkJCXR5cGUsIGJ5dGVzLCBsZW4pKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX3Rlc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDJlZmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9ldnBfdGVzdC5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKiBXcml0dGVuIGJ5IEJlbiBMYXVyaWUsIDIwMDEgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIi4uL2Vfb3MuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorCitzdGF0aWMgdm9pZCBoZXhkdW1wKEZJTEUgKmYsY29uc3QgY2hhciAqdGl0bGUsY29uc3QgdW5zaWduZWQgY2hhciAqcyxpbnQgbCkKKyAgICB7CisgICAgaW50IG49MDsKKworICAgIGZwcmludGYoZiwiJXMiLHRpdGxlKTsKKyAgICBmb3IoIDsgbiA8IGwgOyArK24pCisJeworCWlmKChuJTE2KSA9PSAwKQorCSAgICBmcHJpbnRmKGYsIlxuJTA0eCIsbik7CisJZnByaW50ZihmLCIgJTAyeCIsc1tuXSk7CisJfQorICAgIGZwcmludGYoZiwiXG4iKTsKKyAgICB9CisKK3N0YXRpYyBpbnQgY29udmVydCh1bnNpZ25lZCBjaGFyICpzKQorICAgIHsKKyAgICB1bnNpZ25lZCBjaGFyICpkOworCisgICAgZm9yKGQ9cyA7ICpzIDsgcys9MiwrK2QpCisJeworCXVuc2lnbmVkIGludCBuOworCisJaWYoIXNbMV0pCisJICAgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIk9kZCBudW1iZXIgb2YgaGV4IGRpZ2l0cyEiKTsKKwkgICAgRVhJVCg0KTsKKwkgICAgfQorCXNzY2FuZigoY2hhciAqKXMsIiUyeCIsJm4pOworCSpkPSh1bnNpZ25lZCBjaGFyKW47CisJfQorICAgIHJldHVybiBzLWQ7CisgICAgfQorCitzdGF0aWMgY2hhciAqc3N0cnNlcChjaGFyICoqc3RyaW5nLCBjb25zdCBjaGFyICpkZWxpbSkKKyAgICB7CisgICAgY2hhciBpc2RlbGltWzI1Nl07CisgICAgY2hhciAqdG9rZW4gPSAqc3RyaW5nOworCisgICAgaWYgKCoqc3RyaW5nID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbWVtc2V0KGlzZGVsaW0sIDAsIDI1Nik7CisgICAgaXNkZWxpbVswXSA9IDE7CisKKyAgICB3aGlsZSAoKmRlbGltKQorICAgICAgICB7CisgICAgICAgIGlzZGVsaW1bKHVuc2lnbmVkIGNoYXIpKCpkZWxpbSldID0gMTsKKyAgICAgICAgZGVsaW0rKzsKKyAgICAgICAgfQorCisgICAgd2hpbGUgKCFpc2RlbGltWyh1bnNpZ25lZCBjaGFyKSgqKnN0cmluZyldKQorICAgICAgICB7CisgICAgICAgICgqc3RyaW5nKSsrOworICAgICAgICB9CisKKyAgICBpZiAoKipzdHJpbmcpCisgICAgICAgIHsKKyAgICAgICAgKipzdHJpbmcgPSAwOworICAgICAgICAoKnN0cmluZykrKzsKKyAgICAgICAgfQorCisgICAgcmV0dXJuIHRva2VuOworICAgIH0KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnVzdHJzZXAoY2hhciAqKnAsY29uc3QgY2hhciAqc2VwKQorICAgIHsgcmV0dXJuICh1bnNpZ25lZCBjaGFyICopc3N0cnNlcChwLHNlcCk7IH0KKworc3RhdGljIGludCB0ZXN0MV9leGl0KGludCBlYykKKwl7CisJRVhJVChlYyk7CisJcmV0dXJuKDApOwkJLyogVG8ga2VlcCBzb21lIGNvbXBpbGVycyBxdWlldCAqLworCX0KKworc3RhdGljIHZvaWQgdGVzdDEoY29uc3QgRVZQX0NJUEhFUiAqYyxjb25zdCB1bnNpZ25lZCBjaGFyICprZXksaW50IGtuLAorCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LGludCBpbiwKKwkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpwbGFpbnRleHQsaW50IHBuLAorCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQsaW50IGNuLAorCQkgIGludCBlbmNkZWMpCisgICAgeworICAgIEVWUF9DSVBIRVJfQ1RYIGN0eDsKKyAgICB1bnNpZ25lZCBjaGFyIG91dFs0MDk2XTsKKyAgICBpbnQgb3V0bCxvdXRsMjsKKworICAgIHByaW50ZigiVGVzdGluZyBjaXBoZXIgJXMlc1xuIixFVlBfQ0lQSEVSX25hbWUoYyksCisJICAgKGVuY2RlYyA9PSAxID8gIihlbmNyeXB0KSIgOiAoZW5jZGVjID09IDAgPyAiKGRlY3J5cHQpIiA6ICIoZW5jcnlwdC9kZWNyeXB0KSIpKSk7CisgICAgaGV4ZHVtcChzdGRvdXQsIktleSIsa2V5LGtuKTsKKyAgICBpZihpbikKKwloZXhkdW1wKHN0ZG91dCwiSVYiLGl2LGluKTsKKyAgICBoZXhkdW1wKHN0ZG91dCwiUGxhaW50ZXh0IixwbGFpbnRleHQscG4pOworICAgIGhleGR1bXAoc3Rkb3V0LCJDaXBoZXJ0ZXh0IixjaXBoZXJ0ZXh0LGNuKTsKKyAgICAKKyAgICBpZihrbiAhPSBjLT5rZXlfbGVuKQorCXsKKwlmcHJpbnRmKHN0ZGVyciwiS2V5IGxlbmd0aCBkb2Vzbid0IG1hdGNoLCBnb3QgJWQgZXhwZWN0ZWQgJWx1XG4iLGtuLAorCQkodW5zaWduZWQgbG9uZyljLT5rZXlfbGVuKTsKKwl0ZXN0MV9leGl0KDUpOworCX0KKyAgICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZjdHgpOworICAgIGlmIChlbmNkZWMgIT0gMCkKKyAgICAgICAgeworCWlmKCFFVlBfRW5jcnlwdEluaXRfZXgoJmN0eCxjLE5VTEwsa2V5LGl2KSkKKwkgICAgeworCSAgICBmcHJpbnRmKHN0ZGVyciwiRW5jcnlwdEluaXQgZmFpbGVkXG4iKTsKKwkgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCSAgICB0ZXN0MV9leGl0KDEwKTsKKwkgICAgfQorCUVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCZjdHgsMCk7CisKKwlpZighRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCxvdXQsJm91dGwscGxhaW50ZXh0LHBuKSkKKwkgICAgeworCSAgICBmcHJpbnRmKHN0ZGVyciwiRW5jcnlwdCBmYWlsZWRcbiIpOworCSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisJICAgIHRlc3QxX2V4aXQoNik7CisJICAgIH0KKwlpZighRVZQX0VuY3J5cHRGaW5hbF9leCgmY3R4LG91dCtvdXRsLCZvdXRsMikpCisJICAgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIkVuY3J5cHRGaW5hbCBmYWlsZWRcbiIpOworCSAgICBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisJICAgIHRlc3QxX2V4aXQoNyk7CisJICAgIH0KKworCWlmKG91dGwrb3V0bDIgIT0gY24pCisJICAgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIkNpcGhlcnRleHQgbGVuZ3RoIG1pc21hdGNoIGdvdCAlZCBleHBlY3RlZCAlZFxuIiwKKwkJICAgIG91dGwrb3V0bDIsY24pOworCSAgICB0ZXN0MV9leGl0KDgpOworCSAgICB9CisKKwlpZihtZW1jbXAob3V0LGNpcGhlcnRleHQsY24pKQorCSAgICB7CisJICAgIGZwcmludGYoc3RkZXJyLCJDaXBoZXJ0ZXh0IG1pc21hdGNoXG4iKTsKKwkgICAgaGV4ZHVtcChzdGRlcnIsIkdvdCIsb3V0LGNuKTsKKwkgICAgaGV4ZHVtcChzdGRlcnIsIkV4cGVjdGVkIixjaXBoZXJ0ZXh0LGNuKTsKKwkgICAgdGVzdDFfZXhpdCg5KTsKKwkgICAgfQorCX0KKworICAgIGlmIChlbmNkZWMgPD0gMCkKKyAgICAgICAgeworCWlmKCFFVlBfRGVjcnlwdEluaXRfZXgoJmN0eCxjLE5VTEwsa2V5LGl2KSkKKwkgICAgeworCSAgICBmcHJpbnRmKHN0ZGVyciwiRGVjcnlwdEluaXQgZmFpbGVkXG4iKTsKKwkgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCSAgICB0ZXN0MV9leGl0KDExKTsKKwkgICAgfQorCUVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCZjdHgsMCk7CisKKwlpZighRVZQX0RlY3J5cHRVcGRhdGUoJmN0eCxvdXQsJm91dGwsY2lwaGVydGV4dCxjbikpCisJICAgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIkRlY3J5cHQgZmFpbGVkXG4iKTsKKwkgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCSAgICB0ZXN0MV9leGl0KDYpOworCSAgICB9CisJaWYoIUVWUF9EZWNyeXB0RmluYWxfZXgoJmN0eCxvdXQrb3V0bCwmb3V0bDIpKQorCSAgICB7CisJICAgIGZwcmludGYoc3RkZXJyLCJEZWNyeXB0RmluYWwgZmFpbGVkXG4iKTsKKwkgICAgRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCSAgICB0ZXN0MV9leGl0KDcpOworCSAgICB9CisKKwlpZihvdXRsK291dGwyICE9IHBuKQorCSAgICB7CisJICAgIGZwcmludGYoc3RkZXJyLCJQbGFpbnRleHQgbGVuZ3RoIG1pc21hdGNoIGdvdCAlZCBleHBlY3RlZCAlZFxuIiwKKwkJICAgIG91dGwrb3V0bDIscG4pOworCSAgICB0ZXN0MV9leGl0KDgpOworCSAgICB9CisKKwlpZihtZW1jbXAob3V0LHBsYWludGV4dCxwbikpCisJICAgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsIlBsYWludGV4dCBtaXNtYXRjaFxuIik7CisJICAgIGhleGR1bXAoc3RkZXJyLCJHb3QiLG91dCxwbik7CisJICAgIGhleGR1bXAoc3RkZXJyLCJFeHBlY3RlZCIscGxhaW50ZXh0LHBuKTsKKwkgICAgdGVzdDFfZXhpdCg5KTsKKwkgICAgfQorCX0KKworICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisKKyAgICBwcmludGYoIlxuIik7CisgICAgfQorCitzdGF0aWMgaW50IHRlc3RfY2lwaGVyKGNvbnN0IGNoYXIgKmNpcGhlcixjb25zdCB1bnNpZ25lZCBjaGFyICprZXksaW50IGtuLAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsaW50IGluLAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGxhaW50ZXh0LGludCBwbiwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQsaW50IGNuLAorCQkgICAgICAgaW50IGVuY2RlYykKKyAgICB7CisgICAgY29uc3QgRVZQX0NJUEhFUiAqYzsKKworICAgIGM9RVZQX2dldF9jaXBoZXJieW5hbWUoY2lwaGVyKTsKKyAgICBpZighYykKKwlyZXR1cm4gMDsKKworICAgIHRlc3QxKGMsa2V5LGtuLGl2LGluLHBsYWludGV4dCxwbixjaXBoZXJ0ZXh0LGNuLGVuY2RlYyk7CisKKyAgICByZXR1cm4gMTsKKyAgICB9CisKK3N0YXRpYyBpbnQgdGVzdF9kaWdlc3QoY29uc3QgY2hhciAqZGlnZXN0LAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGxhaW50ZXh0LGludCBwbiwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNpcGhlcnRleHQsIHVuc2lnbmVkIGludCBjbikKKyAgICB7CisgICAgY29uc3QgRVZQX01EICpkOworICAgIEVWUF9NRF9DVFggY3R4OworICAgIHVuc2lnbmVkIGNoYXIgbWRbRVZQX01BWF9NRF9TSVpFXTsKKyAgICB1bnNpZ25lZCBpbnQgbWRuOworCisgICAgZD1FVlBfZ2V0X2RpZ2VzdGJ5bmFtZShkaWdlc3QpOworICAgIGlmKCFkKQorCXJldHVybiAwOworCisgICAgcHJpbnRmKCJUZXN0aW5nIGRpZ2VzdCAlc1xuIixFVlBfTURfbmFtZShkKSk7CisgICAgaGV4ZHVtcChzdGRvdXQsIlBsYWludGV4dCIscGxhaW50ZXh0LHBuKTsKKyAgICBoZXhkdW1wKHN0ZG91dCwiRGlnZXN0IixjaXBoZXJ0ZXh0LGNuKTsKKworICAgIEVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKyAgICBpZighRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCxkLCBOVUxMKSkKKwl7CisJZnByaW50ZihzdGRlcnIsIkRpZ2VzdEluaXQgZmFpbGVkXG4iKTsKKwlFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisJRVhJVCgxMDApOworCX0KKyAgICBpZighRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LHBsYWludGV4dCxwbikpCisJeworCWZwcmludGYoc3RkZXJyLCJEaWdlc3RVcGRhdGUgZmFpbGVkXG4iKTsKKwlFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisJRVhJVCgxMDEpOworCX0KKyAgICBpZighRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsbWQsJm1kbikpCisJeworCWZwcmludGYoc3RkZXJyLCJEaWdlc3RGaW5hbCBmYWlsZWRcbiIpOworCUVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKwlFWElUKDEwMSk7CisJfQorICAgIEVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKworICAgIGlmKG1kbiAhPSBjbikKKwl7CisJZnByaW50ZihzdGRlcnIsIkRpZ2VzdCBsZW5ndGggbWlzbWF0Y2gsIGdvdCAlZCBleHBlY3RlZCAlZFxuIixtZG4sY24pOworCUVYSVQoMTAyKTsKKwl9CisKKyAgICBpZihtZW1jbXAobWQsY2lwaGVydGV4dCxjbikpCisJeworCWZwcmludGYoc3RkZXJyLCJEaWdlc3QgbWlzbWF0Y2hcbiIpOworCWhleGR1bXAoc3RkZXJyLCJHb3QiLG1kLGNuKTsKKwloZXhkdW1wKHN0ZGVyciwiRXhwZWN0ZWQiLGNpcGhlcnRleHQsY24pOworCUVYSVQoMTAzKTsKKwl9CisKKyAgICBwcmludGYoIlxuIik7CisKKyAgICBFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisKKyAgICByZXR1cm4gMTsKKyAgICB9CisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQorICAgIHsKKyAgICBjb25zdCBjaGFyICpzelRlc3RGaWxlOworICAgIEZJTEUgKmY7CisKKyAgICBpZihhcmdjICE9IDIpCisJeworCWZwcmludGYoc3RkZXJyLCIlcyA8dGVzdCBmaWxlPlxuIixhcmd2WzBdKTsKKwlFWElUKDEpOworCX0KKyAgICBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKTsKKyAgICBDUllQVE9fc2V0X21lbV9kZWJ1Z19vcHRpb25zKFZfQ1JZUFRPX01ERUJVR19BTEwpOworICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09OKTsKKworICAgIHN6VGVzdEZpbGU9YXJndlsxXTsKKworICAgIGY9Zm9wZW4oc3pUZXN0RmlsZSwiciIpOworICAgIGlmKCFmKQorCXsKKwlwZXJyb3Ioc3pUZXN0RmlsZSk7CisJRVhJVCgyKTsKKwl9CisKKyAgICAvKiBMb2FkIHVwIHRoZSBzb2Z0d2FyZSBFVlBfQ0lQSEVSIGFuZCBFVlBfTUQgZGVmaW5pdGlvbnMgKi8KKyAgICBPcGVuU1NMX2FkZF9hbGxfY2lwaGVycygpOworICAgIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisgICAgLyogTG9hZCBhbGwgY29tcGlsZWQtaW4gRU5HSU5FcyAqLworICAgIEVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOworI2VuZGlmCisjaWYgMAorICAgIE9QRU5TU0xfY29uZmlnKCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyAgICAvKiBSZWdpc3RlciBhbGwgYXZhaWxhYmxlIEVOR0lORSBpbXBsZW1lbnRhdGlvbnMgb2YgY2lwaGVycyBhbmQgZGlnZXN0cy4KKyAgICAgKiBUaGlzIGNvdWxkIHBlcmhhcHMgYmUgY2hhbmdlZCB0byAiRU5HSU5FX3JlZ2lzdGVyX2FsbF9jb21wbGV0ZSgpIj8gKi8KKyAgICBFTkdJTkVfcmVnaXN0ZXJfYWxsX2NpcGhlcnMoKTsKKyAgICBFTkdJTkVfcmVnaXN0ZXJfYWxsX2RpZ2VzdHMoKTsKKyAgICAvKiBJZiB3ZSBhZGQgY29tbWFuZC1saW5lIG9wdGlvbnMsIHRoaXMgc3RhdGVtZW50IHNob3VsZCBiZSBzd2l0Y2hhYmxlLgorICAgICAqIEl0J2xsIHByZXZlbnQgRU5HSU5FcyBiZWluZyBFTkdJTkVfaW5pdCgpaWFsaXNlZCBmb3IgY2lwaGVyL2RpZ2VzdCB1c2UgaWYKKyAgICAgKiB0aGV5IHdlcmVuJ3QgYWxyZWFkeSBpbml0aWFsaXNlZC4gKi8KKyAgICAvKiBFTkdJTkVfc2V0X2NpcGhlcl9mbGFncyhFTkdJTkVfQ0lQSEVSX0ZMQUdfTk9JTklUKTsgKi8KKyNlbmRpZgorCisgICAgZm9yKCA7IDsgKQorCXsKKwljaGFyIGxpbmVbNDA5Nl07CisJY2hhciAqcDsKKwljaGFyICpjaXBoZXI7CisJdW5zaWduZWQgY2hhciAqaXYsKmtleSwqcGxhaW50ZXh0LCpjaXBoZXJ0ZXh0OworCWludCBlbmNkZWM7CisJaW50IGtuLGluLHBuLGNuOworCisJaWYoIWZnZXRzKChjaGFyICopbGluZSxzaXplb2YgbGluZSxmKSkKKwkgICAgYnJlYWs7CisJaWYobGluZVswXSA9PSAnIycgfHwgbGluZVswXSA9PSAnXG4nKQorCSAgICBjb250aW51ZTsKKwlwPWxpbmU7CisJY2lwaGVyPXNzdHJzZXAoJnAsIjoiKTsJCisJa2V5PXVzdHJzZXAoJnAsIjoiKTsKKwlpdj11c3Ryc2VwKCZwLCI6Iik7CisJcGxhaW50ZXh0PXVzdHJzZXAoJnAsIjoiKTsKKwljaXBoZXJ0ZXh0PXVzdHJzZXAoJnAsIjoiKTsKKwlpZiAocFstMV0gPT0gJ1xuJykgeworCSAgICBwWy0xXSA9ICdcMCc7CisJICAgIGVuY2RlYyA9IC0xOworCX0gZWxzZSB7CisJICAgIGVuY2RlYyA9IGF0b2koc3N0cnNlcCgmcCwiXG4iKSk7CisJfQorCSAgICAgIAorCisJa249Y29udmVydChrZXkpOworCWluPWNvbnZlcnQoaXYpOworCXBuPWNvbnZlcnQocGxhaW50ZXh0KTsKKwljbj1jb252ZXJ0KGNpcGhlcnRleHQpOworCisJaWYoIXRlc3RfY2lwaGVyKGNpcGhlcixrZXksa24saXYsaW4scGxhaW50ZXh0LHBuLGNpcGhlcnRleHQsY24sZW5jZGVjKQorCSAgICYmICF0ZXN0X2RpZ2VzdChjaXBoZXIscGxhaW50ZXh0LHBuLGNpcGhlcnRleHQsY24pKQorCSAgICB7CisjaWZkZWYgT1BFTlNTTF9OT19BRVMKKwkgICAgaWYgKHN0cnN0cihjaXBoZXIsICJBRVMiKSA9PSBjaXBoZXIpCisJCXsKKwkJZnByaW50ZihzdGRvdXQsICJDaXBoZXIgZGlzYWJsZWQsIHNraXBwaW5nICVzXG4iLCBjaXBoZXIpOyAKKwkJY29udGludWU7CisJCX0KKyNlbmRpZgorI2lmZGVmIE9QRU5TU0xfTk9fREVTCisJICAgIGlmIChzdHJzdHIoY2lwaGVyLCAiREVTIikgPT0gY2lwaGVyKQorCQl7CisJCWZwcmludGYoc3Rkb3V0LCAiQ2lwaGVyIGRpc2FibGVkLCBza2lwcGluZyAlc1xuIiwgY2lwaGVyKTsgCisJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX05PX1JDNAorCSAgICBpZiAoc3Ryc3RyKGNpcGhlciwgIlJDNCIpID09IGNpcGhlcikKKwkJeworCQlmcHJpbnRmKHN0ZG91dCwgIkNpcGhlciBkaXNhYmxlZCwgc2tpcHBpbmcgJXNcbiIsIGNpcGhlcik7IAorCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9OT19DQU1FTExJQQorCSAgICBpZiAoc3Ryc3RyKGNpcGhlciwgIkNBTUVMTElBIikgPT0gY2lwaGVyKQorCQl7CisJCWZwcmludGYoc3Rkb3V0LCAiQ2lwaGVyIGRpc2FibGVkLCBza2lwcGluZyAlc1xuIiwgY2lwaGVyKTsgCisJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX05PX1NFRUQKKwkgICAgaWYgKHN0cnN0cihjaXBoZXIsICJTRUVEIikgPT0gY2lwaGVyKQorCQl7CisJCWZwcmludGYoc3Rkb3V0LCAiQ2lwaGVyIGRpc2FibGVkLCBza2lwcGluZyAlc1xuIiwgY2lwaGVyKTsgCisJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkgICAgZnByaW50ZihzdGRlcnIsIkNhbid0IGZpbmQgJXNcbiIsY2lwaGVyKTsKKwkgICAgRVhJVCgzKTsKKwkgICAgfQorCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorICAgIEVOR0lORV9jbGVhbnVwKCk7CisjZW5kaWYKKyAgICBFVlBfY2xlYW51cCgpOworICAgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgICAgRVJSX3JlbW92ZV90aHJlYWRfc3RhdGUoTlVMTCk7CisgICAgRVJSX2ZyZWVfc3RyaW5ncygpOworICAgIENSWVBUT19tZW1fbGVha3NfZnAoc3RkZXJyKTsKKworICAgIHJldHVybiAwOworICAgIH0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwdGVzdHMudHh0IGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9ldnB0ZXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViMTIxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvZXZwdGVzdHMudHh0CkBAIC0wLDAgKzEsMzIxIEBACisjY2lwaGVyOmtleTppdjpwbGFpbnRleHQ6Y2lwaGVydGV4dDowLzEoZGVjcnlwdC9lbmNyeXB0KQorI2RpZ2VzdDo6OmlucHV0Om91dHB1dAorCisjIFNIQSgxKSB0ZXN0cyAoZnJvbSBzaGF0ZXN0LmMpCitTSEExOjo6NjE2MjYzOmE5OTkzZTM2NDcwNjgxNmFiYTNlMjU3MTc4NTBjMjZjOWNkMGQ4OWQKKworIyBNRDUgdGVzdHMgKGZyb20gbWQ1dGVzdC5jKQorTUQ1Ojo6OmQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlCitNRDU6Ojo2MTowY2MxNzViOWMwZjFiNmE4MzFjMzk5ZTI2OTc3MjY2MQorTUQ1Ojo6NjE2MjYzOjkwMDE1MDk4M2NkMjRmYjBkNjk2M2Y3ZDI4ZTE3ZjcyCitNRDU6Ojo2ZDY1NzM3MzYxNjc2NTIwNjQ2OTY3NjU3Mzc0OmY5NmI2OTdkN2NiNzkzOGQ1MjVhMmYzMWFhZjE2MWQwCitNRDU6Ojo2MTYyNjM2NDY1NjY2NzY4Njk2YTZiNmM2ZDZlNmY3MDcxNzI3Mzc0NzU3Njc3Nzg3OTdhOmMzZmNkM2Q3NjE5MmU0MDA3ZGZiNDk2Y2NhNjdlMTNiCitNRDU6Ojo0MTQyNDM0NDQ1NDY0NzQ4NDk0YTRiNGM0ZDRlNGY1MDUxNTI1MzU0NTU1NjU3NTg1OTVhNjE2MjYzNjQ2NTY2Njc2ODY5NmE2YjZjNmQ2ZTZmNzA3MTcyNzM3NDc1NzY3Nzc4Nzk3YTMwMzEzMjMzMzQzNTM2MzczODM5OmQxNzRhYjk4ZDI3N2Q5ZjVhNTYxMWMyYzlmNDE5ZDlmCitNRDU6OjozMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNjM3MzgzOTMwMzEzMjMzMzQzNTM2MzczODM5MzAzMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNjM3MzgzOTMwMzEzMjMzMzQzNTM2MzczODM5MzAzMTMyMzMzNDM1MzYzNzM4MzkzMDMxMzIzMzM0MzUzNjM3MzgzOTMwOjU3ZWRmNGEyMmJlM2M5NTVhYzQ5ZGEyZTIxMDdiNjdhCisKKyMgQUVTIDEyOCBFQ0IgdGVzdHMgKGZyb20gRklQUy0xOTcgdGVzdCB2ZWN0b3JzLCBlbmNyeXB0KQorCitBRVMtMTI4LUVDQjowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo6MDAxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0NEREVFRkY6NjlDNEUwRDg2QTdCMDQzMEQ4Q0RCNzgwNzBCNEM1NUE6MQorCisjIEFFUyAxOTIgRUNCIHRlc3RzIChmcm9tIEZJUFMtMTk3IHRlc3QgdmVjdG9ycywgZW5jcnlwdCkKKworQUVTLTE5Mi1FQ0I6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEYxMDExMTIxMzE0MTUxNjE3OjowMDExMjIzMzQ0NTU2Njc3ODg5OUFBQkJDQ0RERUVGRjpEREE5N0NBNDg2NENERkUwNkVBRjcwQTBFQzBENzE5MToxCisKKyMgQUVTIDI1NiBFQ0IgdGVzdHMgKGZyb20gRklQUy0xOTcgdGVzdCB2ZWN0b3JzLCBlbmNyeXB0KQorCitBRVMtMjU2LUVDQjowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGOjowMDExMjIzMzQ0NTU2Njc3ODg5OUFBQkJDQ0RERUVGRjo4RUEyQjdDQTUxNjc0NUJGRUFGQzQ5OTA0QjQ5NjA4OToxCisKKyMgQUVTIDEyOCBFQ0IgdGVzdHMgKGZyb20gTklTVCB0ZXN0IHZlY3RvcnMsIGVuY3J5cHQpCisKKyNBRVMtMTI4LUVDQjowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDo6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6QzM0QzA1MkNDMERBOEQ3MzQ1MUFGRTVGMDNCRTI5N0Y6MQorCisjIEFFUyAxMjggRUNCIHRlc3RzIChmcm9tIE5JU1QgdGVzdCB2ZWN0b3JzLCBkZWNyeXB0KQorCisjQUVTLTEyOC1FQ0I6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6OjQ0NDE2QUMyRDFGNTNDNTgzMzAzOTE3RTZCRTlFQkUwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAKKworIyBBRVMgMTkyIEVDQiB0ZXN0cyAoZnJvbSBOSVNUIHRlc3QgdmVjdG9ycywgZGVjcnlwdCkKKworI0FFUy0xOTItRUNCOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDo6NDhFMzFFOUUyNTY3MThGMjkyMjkzMTlDMTlGMTVCQTQ6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MAorCisjIEFFUyAyNTYgRUNCIHRlc3RzIChmcm9tIE5JU1QgdGVzdCB2ZWN0b3JzLCBkZWNyeXB0KQorCisjQUVTLTI1Ni1FQ0I6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDo6MDU4Q0NGRkRCQkNCMzgyRDFGNkY1NjU4NUQ4QTRBREU6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MAorCisjIEFFUyAxMjggQ0JDIHRlc3RzIChmcm9tIE5JU1QgdGVzdCB2ZWN0b3JzLCBlbmNyeXB0KQorCisjQUVTLTEyOC1DQkM6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6OEEwNUZDNUUwOTVBRjQ4NDhBMDhEMzI4RDM2ODhFM0Q6MQorCisjIEFFUyAxOTIgQ0JDIHRlc3RzIChmcm9tIE5JU1QgdGVzdCB2ZWN0b3JzLCBlbmNyeXB0KQorCisjQUVTLTE5Mi1DQkM6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjdCRDk2NkQ1M0FEOEMxQkI4NUQyQURGQUU4N0JCMTA0OjEKKworIyBBRVMgMjU2IENCQyB0ZXN0cyAoZnJvbSBOSVNUIHRlc3QgdmVjdG9ycywgZW5jcnlwdCkKKworI0FFUy0yNTYtQ0JDOjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6RkUzQzUzNjUzRTJGNDVCNTZGQ0Q4OEIyQ0M4OThGRjA6MQorCisjIEFFUyAxMjggQ0JDIHRlc3RzIChmcm9tIE5JU1QgdGVzdCB2ZWN0b3JzLCBkZWNyeXB0KQorCisjQUVTLTEyOC1DQkM6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6RkFDQTM3RTBCMEM4NTM3M0RGNzA2RTczRjdDOUFGODY6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6MAorCisjIEFFUyB0ZXN0cyBmcm9tIE5JU1QgZG9jdW1lbnQgU1A4MDAtMzhBCisjIEZvciBhbGwgRUNCIGVuY3J5cHRzIGFuZCBkZWNyeXB0cywgdGhlIHRyYW5zZm9ybWVkIHNlcXVlbmNlIGlzCisjICAgQUVTLWJpdHMtRUNCOmtleTo6cGxhaW50ZXh0OmNpcGhlcnRleHQ6ZW5jZGVjCisjIEVDQi1BRVMxMjguRW5jcnlwdCBhbmQgRUNCLUFFUzEyOC5EZWNyeXB0CitBRVMtMTI4LUVDQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6M0FENzdCQjQwRDdBMzY2MEE4OUVDQUYzMjQ2NkVGOTcKK0FFUy0xMjgtRUNCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTpGNUQzRDU4NTAzQjk2OTlERTc4NTg5NUE5NkZEQkFBRgorQUVTLTEyOC1FQ0I6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6OjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjQzQjFDRDdGNTk4RUNFMjM4ODFCMDBFM0VEMDMwNjg4CitBRVMtMTI4LUVDQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6N0IwQzc4NUUyN0U4QUQzRjgyMjMyMDcxMDQ3MjVERDQKKyMgRUNCLUFFUzE5Mi5FbmNyeXB0IGFuZCBFQ0ItQUVTMTkyLkRlY3J5cHQgCitBRVMtMTkyLUVDQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6OjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOkJEMzM0RjFENkU0NUYyNUZGNzEyQTIxNDU3MUZBNUNDCitBRVMtMTkyLUVDQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6OkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjk3NDEwNDg0NkQwQUQzQUQ3NzM0RUNCM0VDRUU0RUVGCitBRVMtMTkyLUVDQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6OjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOkVGN0FGRDIyNzBFMkU2MEFEQ0UwQkEyRkFDRTY0NDRFCitBRVMtMTkyLUVDQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6OkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjlBNEI0MUJBNzM4RDZDNzJGQjE2NjkxNjAzQzE4RTBFCisjIEVDQi1BRVMyNTYuRW5jcnlwdCBhbmQgRUNCLUFFUzI1Ni5EZWNyeXB0IAorQUVTLTI1Ni1FQ0I6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDo6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6RjNFRUQxQkRCNUQyQTAzQzA2NEI1QTdFM0RCMTgxRjgKK0FFUy0yNTYtRUNCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6OkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjU5MUNDQjEwRDQxMEVEMjZEQzVCQTc0QTMxMzYyODcwCitBRVMtMjU2LUVDQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjpCNkVEMjFCOTlDQTZGNEY5RjE1M0U3QjFCRUFGRUQxRAorQUVTLTI1Ni1FQ0I6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDo6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6MjMzMDRCN0EzOUY5RjNGRjA2N0Q4RDhGOUUyNEVDQzcKKyMgRm9yIGFsbCBDQkMgZW5jcnlwdHMgYW5kIGRlY3J5cHRzLCB0aGUgdHJhbnNmb3JtZWQgc2VxdWVuY2UgaXMKKyMgICBBRVMtYml0cy1DQkM6a2V5OklWL2NpcGhlcnRleHQnOnBsYWludGV4dDpjaXBoZXJ0ZXh0OmVuY2RlYworIyBDQkMtQUVTMTI4LkVuY3J5cHQgYW5kIENCQy1BRVMxMjguRGVjcnlwdCAKK0FFUy0xMjgtQ0JDOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOjc2NDlBQkFDODExOUIyNDZDRUU5OEU5QjEyRTkxOTdECitBRVMtMTI4LUNCQzoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo3NjQ5QUJBQzgxMTlCMjQ2Q0VFOThFOUIxMkU5MTk3RDpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTo1MDg2Q0I5QjUwNzIxOUVFOTVEQjExM0E5MTc2NzhCMgorQUVTLTEyOC1DQkM6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6NTA4NkNCOUI1MDcyMTlFRTk1REIxMTNBOTE3Njc4QjI6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6NzNCRUQ2QjhFM0MxNzQzQjcxMTZFNjlFMjIyMjk1MTYKK0FFUy0xMjgtQ0JDOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjczQkVENkI4RTNDMTc0M0I3MTE2RTY5RTIyMjI5NTE2OkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjNGRjFDQUExNjgxRkFDMDkxMjBFQ0EzMDc1ODZFMUE3CisjIENCQy1BRVMxOTIuRW5jcnlwdCBhbmQgQ0JDLUFFUzE5Mi5EZWNyeXB0IAorQUVTLTE5Mi1DQkM6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOjRGMDIxREIyNDNCQzYzM0Q3MTc4MTgzQTlGQTA3MUU4CitBRVMtMTkyLUNCQzo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6NEYwMjFEQjI0M0JDNjMzRDcxNzgxODNBOUZBMDcxRTg6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6QjREOUFEQTlBRDdERURGNEU1RTczODc2M0Y2OTE0NUEKK0FFUy0xOTItQ0JDOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3QjpCNEQ5QURBOUFEN0RFREY0RTVFNzM4NzYzRjY5MTQ1QTozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjo1NzFCMjQyMDEyRkI3QUUwN0ZBOUJBQUMzREYxMDJFMAorQUVTLTE5Mi1DQkM6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjU3MUIyNDIwMTJGQjdBRTA3RkE5QkFBQzNERjEwMkUwOkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjA4QjBFMjc5ODg1OTg4ODFEOTIwQTlFNjRGNTYxNUNECisjIENCQy1BRVMyNTYuRW5jcnlwdCBhbmQgQ0JDLUFFUzI1Ni5EZWNyeXB0IAorQUVTLTI1Ni1DQkM6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTpGNThDNEMwNEQ2RTVGMUJBNzc5RUFCRkI1RjdCRkJENgorQUVTLTI1Ni1DQkM6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDpGNThDNEMwNEQ2RTVGMUJBNzc5RUFCRkI1RjdCRkJENjpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTo5Q0ZDNEU5NjdFREI4MDhENjc5Rjc3N0JDNjcwMkM3RAorQUVTLTI1Ni1DQkM6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDo5Q0ZDNEU5NjdFREI4MDhENjc5Rjc3N0JDNjcwMkM3RDozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjozOUYyMzM2OUE5RDlCQUNGQTUzMEUyNjMwNDIzMTQ2MQorQUVTLTI1Ni1DQkM6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDozOUYyMzM2OUE5RDlCQUNGQTUzMEUyNjMwNDIzMTQ2MTpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDpCMkVCMDVFMkMzOUJFOUZDREE2QzE5MDc4QzZBOUQxQgorIyBXZSBkb24ndCBzdXBwb3J0IENGQnsxLDh9LUFFU3h4eC57RW4sRGV9Y3J5cHQKKyMgRm9yIGFsbCBDRkIxMjggZW5jcnlwdHMgYW5kIGRlY3J5cHRzLCB0aGUgdHJhbnNmb3JtZWQgc2VxdWVuY2UgaXMKKyMgICBBRVMtYml0cy1DRkI6a2V5OklWL2NpcGhlcnRleHQnOnBsYWludGV4dDpjaXBoZXJ0ZXh0OmVuY2RlYworIyBDRkIxMjgtQUVTMTI4LkVuY3J5cHQgCitBRVMtMTI4LUNGQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTozQjNGRDkyRUI3MkRBRDIwMzMzNDQ5RjhFODNDRkI0QToxCitBRVMtMTI4LUNGQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzozQjNGRDkyRUI3MkRBRDIwMzMzNDQ5RjhFODNDRkI0QTpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTpDOEE2NDUzN0EwQjNBOTNGQ0RFM0NEQUQ5RjFDRTU4QjoxCitBRVMtMTI4LUNGQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzpDOEE2NDUzN0EwQjNBOTNGQ0RFM0NEQUQ5RjFDRTU4QjozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjoyNjc1MUY2N0EzQ0JCMTQwQjE4MDhDRjE4N0E0RjRERjoxCitBRVMtMTI4LUNGQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzoyNjc1MUY2N0EzQ0JCMTQwQjE4MDhDRjE4N0E0RjRERjpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDpDMDRCMDUzNTdDNUQxQzBFRUFDNEM2NkY5RkY3RjJFNjoxCisjIENGQjEyOC1BRVMxMjguRGVjcnlwdCAKK0FFUy0xMjgtQ0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOjNCM0ZEOTJFQjcyREFEMjAzMzM0NDlGOEU4M0NGQjRBOjAKK0FFUy0xMjgtQ0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjNCM0ZEOTJFQjcyREFEMjAzMzM0NDlGOEU4M0NGQjRBOkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOkM4QTY0NTM3QTBCM0E5M0ZDREUzQ0RBRDlGMUNFNThCOjAKK0FFUy0xMjgtQ0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOkM4QTY0NTM3QTBCM0E5M0ZDREUzQ0RBRDlGMUNFNThCOjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjI2NzUxRjY3QTNDQkIxNDBCMTgwOENGMTg3QTRGNERGOjAKK0FFUy0xMjgtQ0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjI2NzUxRjY3QTNDQkIxNDBCMTgwOENGMTg3QTRGNERGOkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOkMwNEIwNTM1N0M1RDFDMEVFQUM0QzY2RjlGRjdGMkU2OjAKKyMgQ0ZCMTI4LUFFUzE5Mi5FbmNyeXB0CitBRVMtMTkyLUNGQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6Q0RDODBENkZEREYxOENBQjM0QzI1OTA5Qzk5QTQxNzQ6MQorQUVTLTE5Mi1DRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOkNEQzgwRDZGRERGMThDQUIzNEMyNTkwOUM5OUE0MTc0OkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjY3Q0U3RjdGODExNzM2MjE5NjFBMkI3MDE3MUQzRDdBOjEKK0FFUy0xOTItQ0ZCOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3Qjo2N0NFN0Y3RjgxMTczNjIxOTYxQTJCNzAxNzFEM0Q3QTozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjoyRTFFOEExREQ1OUI4OEIxQzhFNjBGRUQxRUZBQzRDOToxCitBRVMtMTkyLUNGQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6MkUxRThBMURENTlCODhCMUM4RTYwRkVEMUVGQUM0Qzk6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6QzA1RjlGOUNBOTgzNEZBMDQyQUU4RkJBNTg0QjA5RkY6MQorIyBDRkIxMjgtQUVTMTkyLkRlY3J5cHQKK0FFUy0xOTItQ0ZCOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3QjowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTpDREM4MEQ2RkRERjE4Q0FCMzRDMjU5MDlDOTlBNDE3NDowCitBRVMtMTkyLUNGQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6Q0RDODBENkZEREYxOENBQjM0QzI1OTA5Qzk5QTQxNzQ6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6NjdDRTdGN0Y4MTE3MzYyMTk2MUEyQjcwMTcxRDNEN0E6MAorQUVTLTE5Mi1DRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjY3Q0U3RjdGODExNzM2MjE5NjFBMkI3MDE3MUQzRDdBOjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjJFMUU4QTFERDU5Qjg4QjFDOEU2MEZFRDFFRkFDNEM5OjAKK0FFUy0xOTItQ0ZCOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3QjoyRTFFOEExREQ1OUI4OEIxQzhFNjBGRUQxRUZBQzRDOTpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDpDMDVGOUY5Q0E5ODM0RkEwNDJBRThGQkE1ODRCMDlGRjowCisjIENGQjEyOC1BRVMyNTYuRW5jcnlwdCAKK0FFUy0yNTYtQ0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6REM3RTg0QkZEQTc5MTY0QjdFQ0Q4NDg2OTg1RDM4NjA6MQorQUVTLTI1Ni1DRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDpEQzdFODRCRkRBNzkxNjRCN0VDRDg0ODY5ODVEMzg2MDpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTozOUZGRUQxNDNCMjhCMUM4MzIxMTNDNjMzMUU1NDA3QjoxCitBRVMtMjU2LUNGQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjM5RkZFRDE0M0IyOEIxQzgzMjExM0M2MzMxRTU0MDdCOjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOkRGMTAxMzI0MTVFNTRCOTJBMTNFRDBBODI2N0FFMkY5OjEKK0FFUy0yNTYtQ0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6REYxMDEzMjQxNUU1NEI5MkExM0VEMEE4MjY3QUUyRjk6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6NzVBMzg1NzQxQUI5Q0VGODIwMzE2MjNENTVCMUU0NzE6MQorIyBDRkIxMjgtQUVTMjU2LkRlY3J5cHQgCitBRVMtMjU2LUNGQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOkRDN0U4NEJGREE3OTE2NEI3RUNEODQ4Njk4NUQzODYwOjAKK0FFUy0yNTYtQ0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6REM3RTg0QkZEQTc5MTY0QjdFQ0Q4NDg2OTg1RDM4NjA6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6MzlGRkVEMTQzQjI4QjFDODMyMTEzQzYzMzFFNTQwN0I6MAorQUVTLTI1Ni1DRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDozOUZGRUQxNDNCMjhCMUM4MzIxMTNDNjMzMUU1NDA3QjozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjpERjEwMTMyNDE1RTU0QjkyQTEzRUQwQTgyNjdBRTJGOTowCitBRVMtMjU2LUNGQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OkRGMTAxMzI0MTVFNTRCOTJBMTNFRDBBODI2N0FFMkY5OkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjc1QTM4NTc0MUFCOUNFRjgyMDMxNjIzRDU1QjFFNDcxOjAKKyMgRm9yIGFsbCBPRkIgZW5jcnlwdHMgYW5kIGRlY3J5cHRzLCB0aGUgdHJhbnNmb3JtZWQgc2VxdWVuY2UgaXMKKyMgICBBRVMtYml0cy1DRkI6a2V5OklWL291dHB1dCc6cGxhaW50ZXh0OmNpcGhlcnRleHQ6ZW5jZGVjCisjIE9GQi1BRVMxMjguRW5jcnlwdCAKK0FFUy0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOjNCM0ZEOTJFQjcyREFEMjAzMzM0NDlGOEU4M0NGQjRBOjEgCitBRVMtMTI4LU9GQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo1MEZFNjdDQzk5NkQzMkI2REEwOTM3RTk5QkFGRUM2MDpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTo3Nzg5NTA4RDE2OTE4RjAzRjUzQzUyREFDNTRFRDgyNToxIAorQUVTLTEyOC1PRkI6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6RDlBNERBREEwODkyMjM5RjZCOEIzRDc2ODBFMTU2NzQ6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6OTc0MDA1MUU5QzVGRUNGNjQzNDRGN0E4MjI2MEVEQ0M6MSAKK0FFUy0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOkE3ODgxOTU4M0YwMzA4RTdBNkJGMzZCMTM4NkFCRjIzOkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjMwNEM2NTI4RjY1OUM3Nzg2NkE1MTBEOUMxRDZBRTVFOjEgCisjIE9GQi1BRVMxMjguRGVjcnlwdCAKK0FFUy0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOjNCM0ZEOTJFQjcyREFEMjAzMzM0NDlGOEU4M0NGQjRBOjAKK0FFUy0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjUwRkU2N0NDOTk2RDMyQjZEQTA5MzdFOTlCQUZFQzYwOkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjc3ODk1MDhEMTY5MThGMDNGNTNDNTJEQUM1NEVEODI1OjAKK0FFUy0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOkQ5QTREQURBMDg5MjIzOUY2QjhCM0Q3NjgwRTE1Njc0OjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjk3NDAwNTFFOUM1RkVDRjY0MzQ0RjdBODIyNjBFRENDOjAKK0FFUy0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOkE3ODgxOTU4M0YwMzA4RTdBNkJGMzZCMTM4NkFCRjIzOkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjMwNEM2NTI4RjY1OUM3Nzg2NkE1MTBEOUMxRDZBRTVFOjAKKyMgT0ZCLUFFUzE5Mi5FbmNyeXB0IAorQUVTLTE5Mi1PRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOkNEQzgwRDZGRERGMThDQUIzNEMyNTkwOUM5OUE0MTc0OjEgCitBRVMtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6QTYwOUIzOERGM0IxMTMzRERERkYyNzE4QkEwOTU2NUU6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6RkNDMjhCOEQ0QzYzODM3QzA5RTgxNzAwQzExMDA0MDE6MSAKK0FFUy0xOTItT0ZCOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3Qjo1MkVGMDFEQTUyNjAyRkUwOTc1Rjc4QUM4NEJGOEE1MDozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjo4RDlBOUFFQUMwRjY1OTZGNTU5QzZENERBRjU5QTVGMjoxIAorQUVTLTE5Mi1PRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOkJENTI4NkFDNjNBQUJEN0VCMDY3QUM1NEI1NTNGNzFEOkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjZEOUYyMDA4NTdDQTZDM0U5Q0FDNTI0QkQ5QUNDOTJBOjEgCisjIE9GQi1BRVMxOTIuRGVjcnlwdCAKK0FFUy0xOTItT0ZCOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3QjowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTpDREM4MEQ2RkRERjE4Q0FCMzRDMjU5MDlDOTlBNDE3NDowIAorQUVTLTE5Mi1PRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOkE2MDlCMzhERjNCMTEzM0REREZGMjcxOEJBMDk1NjVFOkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOkZDQzI4QjhENEM2MzgzN0MwOUU4MTcwMEMxMTAwNDAxOjAgCitBRVMtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6NTJFRjAxREE1MjYwMkZFMDk3NUY3OEFDODRCRjhBNTA6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6OEQ5QTlBRUFDMEY2NTk2RjU1OUM2RDREQUY1OUE1RjI6MCAKK0FFUy0xOTItT0ZCOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3QjpCRDUyODZBQzYzQUFCRDdFQjA2N0FDNTRCNTUzRjcxRDpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDo2RDlGMjAwODU3Q0E2QzNFOUNBQzUyNEJEOUFDQzkyQTowIAorIyBPRkItQUVTMjU2LkVuY3J5cHQgCitBRVMtMjU2LU9GQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOkRDN0U4NEJGREE3OTE2NEI3RUNEODQ4Njk4NUQzODYwOjEKK0FFUy0yNTYtT0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6QjdCRjNBNURGNDM5ODlERDk3RjBGQTk3RUJDRTJGNEE6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6NEZFQkRDNjc0MEQyMEIzQUM4OEY2QUQ4MkE0RkIwOEQ6MQorQUVTLTI1Ni1PRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDpFMUM2NTYzMDVFRDFBN0E2NTYzODA1NzQ2RkUwM0VEQzozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjo3MUFCNDdBMDg2RTg2RUVERjM5RDFDNUJCQTk3QzQwODoxCitBRVMtMjU2LU9GQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjQxNjM1QkU2MjVCNDhBRkMxNjY2REQ0MkEwOUQ5NkU3OkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjAxMjYxNDFENjdGMzdCRTg1MzhGNUE4QkU3NDBFNDg0OjEKKyMgT0ZCLUFFUzI1Ni5EZWNyeXB0IAorQUVTLTI1Ni1PRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTpEQzdFODRCRkRBNzkxNjRCN0VDRDg0ODY5ODVEMzg2MDowCitBRVMtMjU2LU9GQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OkI3QkYzQTVERjQzOTg5REQ5N0YwRkE5N0VCQ0UyRjRBOkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjRGRUJEQzY3NDBEMjBCM0FDODhGNkFEODJBNEZCMDhEOjAKK0FFUy0yNTYtT0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6RTFDNjU2MzA1RUQxQTdBNjU2MzgwNTc0NkZFMDNFREM6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6NzFBQjQ3QTA4NkU4NkVFREYzOUQxQzVCQkE5N0M0MDg6MAorQUVTLTI1Ni1PRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDo0MTYzNUJFNjI1QjQ4QUZDMTY2NkRENDJBMDlEOTZFNzpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDowMTI2MTQxRDY3RjM3QkU4NTM4RjVBOEJFNzQwRTQ4NDowCisKKyMgREVTIEVDQiB0ZXN0cyAoZnJvbSBkZXN0ZXN0KQorCitERVMtRUNCOjAwMDAwMDAwMDAwMDAwMDA6OjAwMDAwMDAwMDAwMDAwMDA6OENBNjRERTlDMUIxMjNBNworREVTLUVDQjpGRkZGRkZGRkZGRkZGRkZGOjpGRkZGRkZGRkZGRkZGRkZGOjczNTlCMjE2M0U0RURDNTgKK0RFUy1FQ0I6MzAwMDAwMDAwMDAwMDAwMDo6MTAwMDAwMDAwMDAwMDAwMTo5NThFNkU2MjdBMDU1NTdCCitERVMtRUNCOjExMTExMTExMTExMTExMTE6OjExMTExMTExMTExMTExMTE6RjQwMzc5QUI5RTBFQzUzMworREVTLUVDQjowMTIzNDU2Nzg5QUJDREVGOjoxMTExMTExMTExMTExMTExOjE3NjY4REZDNzI5MjUzMkQKK0RFUy1FQ0I6MTExMTExMTExMTExMTExMTo6MDEyMzQ1Njc4OUFCQ0RFRjo4QTVBRTFGODFBQjhGMkRECitERVMtRUNCOkZFRENCQTk4NzY1NDMyMTA6OjAxMjM0NTY3ODlBQkNERUY6RUQzOUQ5NTBGQTc0QkNDNAorCisjIERFU1gtQ0JDIHRlc3RzIChmcm9tIGRlc3Rlc3QpCitERVNYLUNCQzowMTIzNDU2Nzg5YWJjZGVmZjFlMGQzYzJiNWE0OTc4NmZlZGNiYTk4NzY1NDMyMTA6ZmVkY2JhOTg3NjU0MzIxMDozNzM2MzUzNDMzMzIzMTIwNEU2Rjc3MjA2OTczMjA3NDY4NjUyMDc0Njk2RDY1MjA2NjZGNzIyMDAwMDAwMDAwOjg0NkIyOTE0ODUxRTlBMjk1NDczMkY4QUEwQTYxMUMxMTVDREMyRDc5NTFCMTA1M0E2M0M1RTAzQjIxQUEzQzQKKworIyBERVMgRURFMyBDQkMgdGVzdHMgKGZyb20gZGVzdGVzdCkKK0RFUy1FREUzLUNCQzowMTIzNDU2Nzg5YWJjZGVmZjFlMGQzYzJiNWE0OTc4NmZlZGNiYTk4NzY1NDMyMTA6ZmVkY2JhOTg3NjU0MzIxMDozNzM2MzUzNDMzMzIzMTIwNEU2Rjc3MjA2OTczMjA3NDY4NjUyMDc0Njk2RDY1MjA2NjZGNzIyMDAwMDAwMDAwOjNGRTMwMUM5NjJBQzAxRDAyMjEzNzYzQzFDQkQ0Q0RDNzk5NjU3QzA2NEVDRjVENDFDNjczODEyQ0ZERTk2NzUKKworIyBSQzQgdGVzdHMgKGZyb20gcmM0dGVzdCkKK1JDNDowMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZjo6MDEyMzQ1Njc4OWFiY2RlZjo3NWI3ODc4MDk5ZTBjNTk2CitSQzQ6MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY6OjAwMDAwMDAwMDAwMDAwMDA6NzQ5NGMyZTcxMDRiMDg3OQorUkM0OjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOjowMDAwMDAwMDAwMDAwMDAwOmRlMTg4OTQxYTMzNzVkM2EKK1JDNDplZjAxMjM0NWVmMDEyMzQ1ZWYwMTIzNDVlZjAxMjM0NTo6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDpkNmExNDFhN2VjM2MzOGRmYmQ2MTVhMTE2MmUxYzdiYTM2YjY3ODU4CitSQzQ6MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY6OjEyMzQ1Njc4OUFCQ0RFRjAxMjM0NTY3ODlBQkNERUYwMTIzNDU2Nzg5QUJDREVGMDEyMzQ1Njc4OjY2YTA5NDlmOGFmN2Q2ODkxZjdmODMyYmE4MzNjMDBjODkyZWJlMzAxNDNjZTI4NzQwMDExZWNmCitSQzQ6ZWYwMTIzNDVlZjAxMjM0NWVmMDEyMzQ1ZWYwMTIzNDU6OjAwMDAwMDAwMDAwMDAwMDAwMDAwOmQ2YTE0MWE3ZWMzYzM4ZGZiZDYxCisKKworIyBDYW1lbGxpYSB0ZXN0cyBmcm9tIFJGQzM3MTMKKyMgRm9yIGFsbCBFQ0IgZW5jcnlwdHMgYW5kIGRlY3J5cHRzLCB0aGUgdHJhbnNmb3JtZWQgc2VxdWVuY2UgaXMKKyMgICBDQU1FTExJQS1iaXRzLUVDQjprZXk6OnBsYWludGV4dDpjaXBoZXJ0ZXh0OmVuY2RlYworQ0FNRUxMSUEtMTI4LUVDQjowMTIzNDU2Nzg5YWJjZGVmZmVkY2JhOTg3NjU0MzIxMDo6MDEyMzQ1Njc4OWFiY2RlZmZlZGNiYTk4NzY1NDMyMTA6Njc2NzMxMzg1NDk2Njk3MzA4NTcwNjU2NDhlYWJlNDMKK0NBTUVMTElBLTE5Mi1FQ0I6MDEyMzQ1Njc4OWFiY2RlZmZlZGNiYTk4NzY1NDMyMTAwMDExMjIzMzQ0NTU2Njc3OjowMTIzNDU2Nzg5YWJjZGVmZmVkY2JhOTg3NjU0MzIxMDpiNDk5MzQwMWIzZTk5NmY4NGVlNWNlZTdkNzliMDliOQorQ0FNRUxMSUEtMjU2LUVDQjowMTIzNDU2Nzg5YWJjZGVmZmVkY2JhOTg3NjU0MzIxMDAwMTEyMjMzNDQ1NTY2Nzc4ODk5YWFiYmNjZGRlZWZmOjowMTIzNDU2Nzg5YWJjZGVmZmVkY2JhOTg3NjU0MzIxMDo5YWNjMjM3ZGZmMTZkNzZjMjBlZjdjOTE5ZTNhNzUwOQorCisjIEVDQi1DQU1FTExJQTEyOC5FbmNyeXB0CitDQU1FTExJQS0xMjgtRUNCOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjowMDExMjIzMzQ0NTU2Njc3ODg5OUFBQkJDQ0RERUVGRjo3N0NGNDEyMDY3QUY4MjcwNjEzNTI5MTQ5OTE5NTQ2RjoxCitDQU1FTExJQS0xOTItRUNCOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGMTAxMTEyMTMxNDE1MTYxNzo6MDAxMTIyMzM0NDU1NjY3Nzg4OTlBQUJCQ0NEREVFRkY6QjIyRjNDMzZCNzJEMzEzMjlFRUU4QUREQzI5MDZDNjg6MQorQ0FNRUxMSUEtMjU2LUVDQjowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjEwMTExMjEzMTQxNTE2MTcxODE5MUExQjFDMUQxRTFGOjowMDExMjIzMzQ0NTU2Njc3ODg5OUFBQkJDQ0RERUVGRjoyRURGMUYzNDE4RDUzQjg4ODQxRkM4OTg1RkIxRUNGMjoxCisKKyMgRUNCLUNBTUVMTElBMTI4LkVuY3J5cHQgYW5kIEVDQi1DQU1FTExJQTEyOC5EZWNyeXB0IAorQ0FNRUxMSUEtMTI4LUVDQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6NDMyRkM1RENENjI4MTE1QjdDMzg4RDc3MEIyNzBDOTYKK0NBTUVMTElBLTEyOC1FQ0I6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6OkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjBCRTFGMTQwMjM3ODJBMjJFODM4NEM1QUJCN0ZBQjJCCitDQU1FTExJQS0xMjgtRUNCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjpBMEExQUJDRDE4OTNBQjZGRTBGRTVCNjVERjVGODYzNgorQ0FNRUxMSUEtMTI4LUVDQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6RTYxOTI1RTBENURGQUE5QkIyOUY4MTVCMzA3NkU1MUEKKworIyBFQ0ItQ0FNRUxMSUExOTIuRW5jcnlwdCBhbmQgRUNCLUNBTUVMTElBMTkyLkRlY3J5cHQgCitDQU1FTExJQS0xOTItRUNCOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3Qjo6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6Q0NDQzZDNEUxMzhCNDU4NDg1MTRENDhEMEQzNDM5RDMKK0NBTUVMTElBLTE5Mi1FQ0I6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTo1NzEzQzYyQzE0QjJFQzBGODM5M0I2QUZENkY1Nzg1QQorQ0FNRUxMSUEtMTkyLUVDQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6OjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOkI0MEVEMkI2MEVCNTREMDlEMDMwQ0Y1MTFGRUVGMzY2CitDQU1FTExJQS0xOTItRUNCOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3Qjo6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6OTA5REJEOTU3OTkwOTY3NDhDQjI3MzU3RTczRTFEMjYKKworIyBFQ0ItQ0FNRUxMSUEyNTYuRW5jcnlwdCBhbmQgRUNCLUNBTUVMTElBMjU2LkRlY3J5cHQgCitDQU1FTExJQS0yNTYtRUNCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6OjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOkJFRkQyMTlCMTEyRkEwMDA5ODkxOUNEMTAxQzlDQ0ZBCitDQU1FTExJQS0yNTYtRUNCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6OkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOkM5MUQzQThGMUFFQTA4QTkzODZDRjRCNjZDMDE2OUVBCitDQU1FTExJQS0yNTYtRUNCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6OjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOkE2MjNENzExREM1RjI1QTUxQkI4QTgwRDU2Mzk3RDI4CitDQU1FTExJQS0yNTYtRUNCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6OkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjc5NjAxMDlGQjZEQzQyOTQ3RkNGRTU5RUEzQzVFQjZCCisKKyMgRm9yIGFsbCBDQkMgZW5jcnlwdHMgYW5kIGRlY3J5cHRzLCB0aGUgdHJhbnNmb3JtZWQgc2VxdWVuY2UgaXMKKyMgICBDQU1FTExJQS1iaXRzLUNCQzprZXk6SVYvY2lwaGVydGV4dCc6cGxhaW50ZXh0OmNpcGhlcnRleHQ6ZW5jZGVjCisjIENCQy1DQU1FTExJQTEyOC5FbmNyeXB0IGFuZCBDQkMtQ0FNRUxMSUExMjguRGVjcnlwdCAKK0NBTUVMTElBLTEyOC1DQkM6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6MTYwN0NGNDk0QjM2QkJGMDBEQUVCMEI1MDNDODMxQUIKK0NBTUVMTElBLTEyOC1DQkM6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6MTYwN0NGNDk0QjM2QkJGMDBEQUVCMEI1MDNDODMxQUI6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6QTJGMkNGNjcxNjI5RUY3ODQwQzVBNURGQjUwNzQ4ODcKK0NBTUVMTElBLTEyOC1DQkM6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6QTJGMkNGNjcxNjI5RUY3ODQwQzVBNURGQjUwNzQ4ODc6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6MEYwNjE2NTAwOENGOEI4QjVBNjM1ODYzNjI1NDNFNTQKK0NBTUVMTElBLTEyOC1DQkM6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6MzZBODRDREFGRDVGOUE4NUFEQTBGMEE5OTNENkQ1Nzc6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6NzRDNjQyNjhDREI4QjhGQUY1QjM0RThBRjM3MzI5ODAKKworIyBDQkMtQ0FNRUxMSUExOTIuRW5jcnlwdCBhbmQgQ0JDLUNBTUVMTElBMTkyLkRlY3J5cHQgCitDQU1FTExJQS0xOTItQ0JDOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3QjowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQToyQTQ4MzBBQjVBQzRBMUEyNDA1OTU1RkQyMTk1Q0Y5MworQ0FNRUxMSUEtMTkyLUNCQzo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6MkE0ODMwQUI1QUM0QTFBMjQwNTk1NUZEMjE5NUNGOTM6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6NUQ1QTg2OUJEMTRDRTU0MjY0Rjg5MkE2REQyRUMzRDUKK0NBTUVMTElBLTE5Mi1DQkM6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjVENUE4NjlCRDE0Q0U1NDI2NEY4OTJBNkREMkVDM0Q1OjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjM3RDM1OUMzMzQ5ODM2RDg4NEUzMTBBRERGNjhDNDQ5CitDQU1FTExJQS0xOTItQ0JDOjhFNzNCMEY3REEwRTY0NTJDODEwRjMyQjgwOTA3OUU1NjJGOEVBRDI1MjJDNkI3QjozN0QzNTlDMzM0OTgzNkQ4ODRFMzEwQURERjY4QzQ0OTpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDowMUZBQUE5MzBCNEFCOTkxNkU5NjY4RTE0MjhDNkIwOAorCisjIENCQy1DQU1FTExJQTI1Ni5FbmNyeXB0IGFuZCBDQkMtQ0FNRUxMSUEyNTYuRGVjcnlwdCAKK0NBTUVMTElBLTI1Ni1DQkM6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTpFNkNGQTM1RkMwMkIxMzRBNEQyQzBCNjczN0FDM0VEQQorQ0FNRUxMSUEtMjU2LUNCQzo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OkU2Q0ZBMzVGQzAyQjEzNEE0RDJDMEI2NzM3QUMzRURBOkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjM2Q0JFQjczQkQ1MDRCNDA3MEIxQjdERTJCMjFFQjUwCitDQU1FTExJQS0yNTYtQ0JDOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6MzZDQkVCNzNCRDUwNEI0MDcwQjFCN0RFMkIyMUVCNTA6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6RTMxQTYwNTUyOTdEOTZDQTMzMzBDREYxQjE4NjBBODMKK0NBTUVMTElBLTI1Ni1DQkM6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDpFMzFBNjA1NTI5N0Q5NkNBMzMzMENERjFCMTg2MEE4MzpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDo1RDU2M0Y2RDFDQ0NGMjM2MDUxQzBDNUMxQzU4RjI4RgorCisjIFdlIGRvbid0IHN1cHBvcnQgQ0ZCezEsOH0tQ0FNRUxMSUF4eHgue0VuLERlfWNyeXB0CisjIEZvciBhbGwgQ0ZCMTI4IGVuY3J5cHRzIGFuZCBkZWNyeXB0cywgdGhlIHRyYW5zZm9ybWVkIHNlcXVlbmNlIGlzCisjICAgQ0FNRUxMSUEtYml0cy1DRkI6a2V5OklWL2NpcGhlcnRleHQnOnBsYWludGV4dDpjaXBoZXJ0ZXh0OmVuY2RlYworIyBDRkIxMjgtQ0FNRUxMSUExMjguRW5jcnlwdCAKK0NBTUVMTElBLTEyOC1DRkI6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6MTRGNzY0NjE4NzgxN0VCNTg2NTk5MTQ2QjgyQkQ3MTk6MQorQ0FNRUxMSUEtMTI4LUNGQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzoxNEY3NjQ2MTg3ODE3RUI1ODY1OTkxNDZCODJCRDcxOTpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTpBNTNEMjhCQjgyREY3NDExMDNFQTRGOTIxQTQ0ODgwQjoxCitDQU1FTExJQS0xMjgtQ0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOkE1M0QyOEJCODJERjc0MTEwM0VBNEY5MjFBNDQ4ODBCOjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjlDMjE1N0E2NjQ2MjZEMURFRjlFQTQyMEZERTY5Qjk2OjEKK0NBTUVMTElBLTEyOC1DRkI6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6OUMyMTU3QTY2NDYyNkQxREVGOUVBNDIwRkRFNjlCOTY6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6NzQyQTI1RjA1NDIzNDBDN0JBRUYyNENBODQ4MkJCMDk6MQorCisjIENGQjEyOC1DQU1FTExJQTEyOC5EZWNyeXB0IAorQ0FNRUxMSUEtMTI4LUNGQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQToxNEY3NjQ2MTg3ODE3RUI1ODY1OTkxNDZCODJCRDcxOTowCitDQU1FTExJQS0xMjgtQ0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjE0Rjc2NDYxODc4MTdFQjU4NjU5OTE0NkI4MkJENzE5OkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOkE1M0QyOEJCODJERjc0MTEwM0VBNEY5MjFBNDQ4ODBCOjAKK0NBTUVMTElBLTEyOC1DRkI6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6QTUzRDI4QkI4MkRGNzQxMTAzRUE0RjkyMUE0NDg4MEI6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6OUMyMTU3QTY2NDYyNkQxREVGOUVBNDIwRkRFNjlCOTY6MAorQ0FNRUxMSUEtMTI4LUNGQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo5QzIxNTdBNjY0NjI2RDFERUY5RUE0MjBGREU2OUI5NjpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDo3NDJBMjVGMDU0MjM0MEM3QkFFRjI0Q0E4NDgyQkIwOTowCisKKyMgQ0ZCMTI4LUNBTUVMTElBMTkyLkVuY3J5cHQKK0NBTUVMTElBLTE5Mi1DRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOkM4MzJCQjk3ODA2NzdEQUE4MkQ5QjY4NjBEQ0Q1NjVFOjEKK0NBTUVMTElBLTE5Mi1DRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOkM4MzJCQjk3ODA2NzdEQUE4MkQ5QjY4NjBEQ0Q1NjVFOkFFMkQ4QTU3MUUwM0FDOUM5RUI3NkZBQzQ1QUY4RTUxOjg2Rjg0OTE2Mjc5MDZENzgwQzdBNkQ0NkVBMzMxRjk4OjEKK0NBTUVMTElBLTE5Mi1DRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjg2Rjg0OTE2Mjc5MDZENzgwQzdBNkQ0NkVBMzMxRjk4OjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjY5NTExQ0NFNTk0Q0Y3MTBDQjk4QkI2M0Q3MjIxRjAxOjEKK0NBTUVMTElBLTE5Mi1DRkI6OEU3M0IwRjdEQTBFNjQ1MkM4MTBGMzJCODA5MDc5RTU2MkY4RUFEMjUyMkM2QjdCOjY5NTExQ0NFNTk0Q0Y3MTBDQjk4QkI2M0Q3MjIxRjAxOkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOkQ1QjUzNzhBM0FCRUQ1NTgwM0YyNTU2NUQ4OTA3Qjg0OjEKKworIyBDRkIxMjgtQ0FNRUxMSUExOTIuRGVjcnlwdAorQ0FNRUxMSUEtMTkyLUNGQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6QzgzMkJCOTc4MDY3N0RBQTgyRDlCNjg2MERDRDU2NUU6MAorQ0FNRUxMSUEtMTkyLUNGQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6QzgzMkJCOTc4MDY3N0RBQTgyRDlCNjg2MERDRDU2NUU6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6ODZGODQ5MTYyNzkwNkQ3ODBDN0E2RDQ2RUEzMzFGOTg6MAorQ0FNRUxMSUEtMTkyLUNGQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6ODZGODQ5MTYyNzkwNkQ3ODBDN0E2RDQ2RUEzMzFGOTg6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6Njk1MTFDQ0U1OTRDRjcxMENCOThCQjYzRDcyMjFGMDE6MAorQ0FNRUxMSUEtMTkyLUNGQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6Njk1MTFDQ0U1OTRDRjcxMENCOThCQjYzRDcyMjFGMDE6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6RDVCNTM3OEEzQUJFRDU1ODAzRjI1NTY1RDg5MDdCODQ6MAorCisjIENGQjEyOC1DQU1FTExJQTI1Ni5FbmNyeXB0IAorQ0FNRUxMSUEtMjU2LUNGQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOkNGNjEwN0JCMENFQTdEN0ZCMUJEMzFGNUU3QjA2QzkzOjEKK0NBTUVMTElBLTI1Ni1DRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDpDRjYxMDdCQjBDRUE3RDdGQjFCRDMxRjVFN0IwNkM5MzpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MTo4OUJFREI0Q0NERDg2NEVBMTFCQTRDQkU4NDlCNUUyQjoxCitDQU1FTExJQS0yNTYtQ0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6ODlCRURCNENDREQ4NjRFQTExQkE0Q0JFODQ5QjVFMkI6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6NTU1RkMzRjM0QkREMkQ1NEM2MkQ5RTNCRjMzOEMxQzQ6MQorQ0FNRUxMSUEtMjU2LUNGQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjU1NUZDM0YzNEJERDJENTRDNjJEOUUzQkYzMzhDMUM0OkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjU5NTNBRENFMTREQjhDN0YzOUYxQkQzOUYzNTlCRkZBOjEKKworIyBDRkIxMjgtQ0FNRUxMSUEyNTYuRGVjcnlwdCAKK0NBTUVMTElBLTI1Ni1DRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTpDRjYxMDdCQjBDRUE3RDdGQjFCRDMxRjVFN0IwNkM5MzowCitDQU1FTExJQS0yNTYtQ0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6Q0Y2MTA3QkIwQ0VBN0Q3RkIxQkQzMUY1RTdCMDZDOTM6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6ODlCRURCNENDREQ4NjRFQTExQkE0Q0JFODQ5QjVFMkI6MAorQ0FNRUxMSUEtMjU2LUNGQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0Ojg5QkVEQjRDQ0REODY0RUExMUJBNENCRTg0OUI1RTJCOjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjU1NUZDM0YzNEJERDJENTRDNjJEOUUzQkYzMzhDMUM0OjAKK0NBTUVMTElBLTI1Ni1DRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDo1NTVGQzNGMzRCREQyRDU0QzYyRDlFM0JGMzM4QzFDNDpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDo1OTUzQURDRTE0REI4QzdGMzlGMUJEMzlGMzU5QkZGQTowCisKKyMgRm9yIGFsbCBPRkIgZW5jcnlwdHMgYW5kIGRlY3J5cHRzLCB0aGUgdHJhbnNmb3JtZWQgc2VxdWVuY2UgaXMKKyMgICBDQU1FTExJQS1iaXRzLU9GQjprZXk6SVYvb3V0cHV0JzpwbGFpbnRleHQ6Y2lwaGVydGV4dDplbmNkZWMKKyMgT0ZCLUNBTUVMTElBMTI4LkVuY3J5cHQgCitDQU1FTExJQS0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOjE0Rjc2NDYxODc4MTdFQjU4NjU5OTE0NkI4MkJENzE5OjEKK0NBTUVMTElBLTEyOC1PRkI6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6NTBGRTY3Q0M5OTZEMzJCNkRBMDkzN0U5OUJBRkVDNjA6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6MjU2MjNEQjU2OUNBNTFFMDE0ODI2NDk5NzdFMjhEODQ6MQorQ0FNRUxMSUEtMTI4LU9GQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzpEOUE0REFEQTA4OTIyMzlGNkI4QjNENzY4MEUxNTY3NDozMEM4MUM0NkEzNUNFNDExRTVGQkMxMTkxQTBBNTJFRjpDNzc2NjM0QTYwNzI5REM2NTdEMTJCOUZDQTgwMUU5ODoxCitDQU1FTExJQS0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOkE3ODgxOTU4M0YwMzA4RTdBNkJGMzZCMTM4NkFCRjIzOkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOkQ3NzYzNzlCRTBFNTA4MjVFNjgxREExQTRDOTgwRThFOjEKKworIyBPRkItQ0FNRUxMSUExMjguRGVjcnlwdCAKK0NBTUVMTElBLTEyOC1PRkI6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6MTRGNzY0NjE4NzgxN0VCNTg2NTk5MTQ2QjgyQkQ3MTk6MAorQ0FNRUxMSUEtMTI4LU9GQjoyQjdFMTUxNjI4QUVEMkE2QUJGNzE1ODgwOUNGNEYzQzo1MEZFNjdDQzk5NkQzMkI2REEwOTM3RTk5QkFGRUM2MDpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MToyNTYyM0RCNTY5Q0E1MUUwMTQ4MjY0OTk3N0UyOEQ4NDowCitDQU1FTExJQS0xMjgtT0ZCOjJCN0UxNTE2MjhBRUQyQTZBQkY3MTU4ODA5Q0Y0RjNDOkQ5QTREQURBMDg5MjIzOUY2QjhCM0Q3NjgwRTE1Njc0OjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOkM3NzY2MzRBNjA3MjlEQzY1N0QxMkI5RkNBODAxRTk4OjAKK0NBTUVMTElBLTEyOC1PRkI6MkI3RTE1MTYyOEFFRDJBNkFCRjcxNTg4MDlDRjRGM0M6QTc4ODE5NTgzRjAzMDhFN0E2QkYzNkIxMzg2QUJGMjM6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6RDc3NjM3OUJFMEU1MDgyNUU2ODFEQTFBNEM5ODBFOEU6MAorCisjIE9GQi1DQU1FTExJQTE5Mi5FbmNyeXB0IAorQ0FNRUxMSUEtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6QzgzMkJCOTc4MDY3N0RBQTgyRDlCNjg2MERDRDU2NUU6MQorQ0FNRUxMSUEtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6QTYwOUIzOERGM0IxMTMzRERERkYyNzE4QkEwOTU2NUU6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6OEVDRUI3RDAzNTBENzJDN0Y3ODU2MkFFQkRGOTkzMzk6MQorQ0FNRUxMSUEtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6NTJFRjAxREE1MjYwMkZFMDk3NUY3OEFDODRCRjhBNTA6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6QkRENjJEQkJCOTcwMDg0NkM1M0I1MDdGNTQ0Njk2RjA6MQorQ0FNRUxMSUEtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6QkQ1Mjg2QUM2M0FBQkQ3RUIwNjdBQzU0QjU1M0Y3MUQ6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6RTI4MDE0RTA0NkI4MDJGMzg1QzRDMkUxM0VBRDRBNzI6MQorCisjIE9GQi1DQU1FTExJQTE5Mi5EZWNyeXB0IAorQ0FNRUxMSUEtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NkJDMUJFRTIyRTQwOUY5NkU5M0Q3RTExNzM5MzE3MkE6QzgzMkJCOTc4MDY3N0RBQTgyRDlCNjg2MERDRDU2NUU6MAorQ0FNRUxMSUEtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6QTYwOUIzOERGM0IxMTMzRERERkYyNzE4QkEwOTU2NUU6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6OEVDRUI3RDAzNTBENzJDN0Y3ODU2MkFFQkRGOTkzMzk6MAorQ0FNRUxMSUEtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6NTJFRjAxREE1MjYwMkZFMDk3NUY3OEFDODRCRjhBNTA6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6QkRENjJEQkJCOTcwMDg0NkM1M0I1MDdGNTQ0Njk2RjA6MAorQ0FNRUxMSUEtMTkyLU9GQjo4RTczQjBGN0RBMEU2NDUyQzgxMEYzMkI4MDkwNzlFNTYyRjhFQUQyNTIyQzZCN0I6QkQ1Mjg2QUM2M0FBQkQ3RUIwNjdBQzU0QjU1M0Y3MUQ6RjY5RjI0NDVERjRGOUIxN0FEMkI0MTdCRTY2QzM3MTA6RTI4MDE0RTA0NkI4MDJGMzg1QzRDMkUxM0VBRDRBNzI6MAorCisjIE9GQi1DQU1FTExJQTI1Ni5FbmNyeXB0IAorQ0FNRUxMSUEtMjU2LU9GQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjZCQzFCRUUyMkU0MDlGOTZFOTNEN0UxMTczOTMxNzJBOkNGNjEwN0JCMENFQTdEN0ZCMUJEMzFGNUU3QjA2QzkzOjEKK0NBTUVMTElBLTI1Ni1PRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDpCN0JGM0E1REY0Mzk4OUREOTdGMEZBOTdFQkNFMkY0QTpBRTJEOEE1NzFFMDNBQzlDOUVCNzZGQUM0NUFGOEU1MToxMjdBRDk3RThFMzk5NEU0ODIwMDI3RDdCQTEwOTM2ODoxCitDQU1FTExJQS0yNTYtT0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6RTFDNjU2MzA1RUQxQTdBNjU2MzgwNTc0NkZFMDNFREM6MzBDODFDNDZBMzVDRTQxMUU1RkJDMTE5MUEwQTUyRUY6NkJGRjYyNjVBNkE2QjdBNTM1QkM2NUE4MEIxNzIxNEU6MQorQ0FNRUxMSUEtMjU2LU9GQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OjQxNjM1QkU2MjVCNDhBRkMxNjY2REQ0MkEwOUQ5NkU3OkY2OUYyNDQ1REY0RjlCMTdBRDJCNDE3QkU2NkMzNzEwOjBBNEEwNDA0RTI2QUE3OEEyN0NCMjcxRThCRjNDRjIwOjEKKworIyBPRkItQ0FNRUxMSUEyNTYuRGVjcnlwdCAKK0NBTUVMTElBLTI1Ni1PRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDowMDAxMDIwMzA0MDUwNjA3MDgwOTBBMEIwQzBEMEUwRjo2QkMxQkVFMjJFNDA5Rjk2RTkzRDdFMTE3MzkzMTcyQTpDRjYxMDdCQjBDRUE3RDdGQjFCRDMxRjVFN0IwNkM5MzowCitDQU1FTExJQS0yNTYtT0ZCOjYwM0RFQjEwMTVDQTcxQkUyQjczQUVGMDg1N0Q3NzgxMUYzNTJDMDczQjYxMDhENzJEOTgxMEEzMDkxNERGRjQ6QjdCRjNBNURGNDM5ODlERDk3RjBGQTk3RUJDRTJGNEE6QUUyRDhBNTcxRTAzQUM5QzlFQjc2RkFDNDVBRjhFNTE6MTI3QUQ5N0U4RTM5OTRFNDgyMDAyN0Q3QkExMDkzNjg6MAorQ0FNRUxMSUEtMjU2LU9GQjo2MDNERUIxMDE1Q0E3MUJFMkI3M0FFRjA4NTdENzc4MTFGMzUyQzA3M0I2MTA4RDcyRDk4MTBBMzA5MTRERkY0OkUxQzY1NjMwNUVEMUE3QTY1NjM4MDU3NDZGRTAzRURDOjMwQzgxQzQ2QTM1Q0U0MTFFNUZCQzExOTFBMEE1MkVGOjZCRkY2MjY1QTZBNkI3QTUzNUJDNjVBODBCMTcyMTRFOjAKK0NBTUVMTElBLTI1Ni1PRkI6NjAzREVCMTAxNUNBNzFCRTJCNzNBRUYwODU3RDc3ODExRjM1MkMwNzNCNjEwOEQ3MkQ5ODEwQTMwOTE0REZGNDo0MTYzNUJFNjI1QjQ4QUZDMTY2NkRENDJBMDlEOTZFNzpGNjlGMjQ0NURGNEY5QjE3QUQyQjQxN0JFNjZDMzcxMDowQTRBMDQwNEUyNkFBNzhBMjdDQjI3MUU4QkYzQ0YyMDowCisKKyMgU0VFRCB0ZXN0IHZlY3RvcnMgZnJvbSBSRkM0MjY5CitTRUVELUVDQjowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDo6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6NUVCQUM2RTAwNTRFMTY2ODE5QUZGMUNDNkQzNDZDREI6MAorU0VFRC1FQ0I6MDAwMTAyMDMwNDA1MDYwNzA4MDkwQTBCMEMwRDBFMEY6OjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOkMxMUYyMkYyMDE0MDUwNTA4NDQ4MzU5N0U0MzcwRjQzOjAKK1NFRUQtRUNCOjQ3MDY0ODA4NTFFNjFCRTg1RDc0QkZCM0ZEOTU2MTg1Ojo4M0EyRjhBMjg4NjQxRkI5QTRFOUE1Q0MyRjEzMUM3RDpFRTU0RDEzRUJDQUU3MDZEMjI2QkMzMTQyQ0Q0MEQ0QTowCitTRUVELUVDQjoyOERCQzNCQzQ5RkZEODdEQ0ZBNTA5QjExRDQyMkJFNzo6QjQxRTZCRTJFQkE4NEExNDhFMkVFRDg0NTkzQzVFQzc6OUI5QjdCRkNEMTgxM0NCOTVEMEIzNjE4RjQwRjUxMjI6MAorU0VFRC1FQ0I6MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA6OjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjVFQkFDNkUwMDU0RTE2NjgxOUFGRjFDQzZEMzQ2Q0RCOjEKK1NFRUQtRUNCOjAwMDEwMjAzMDQwNTA2MDcwODA5MEEwQjBDMEQwRTBGOjowMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDpDMTFGMjJGMjAxNDA1MDUwODQ0ODM1OTdFNDM3MEY0MzoxCitTRUVELUVDQjo0NzA2NDgwODUxRTYxQkU4NUQ3NEJGQjNGRDk1NjE4NTo6ODNBMkY4QTI4ODY0MUZCOUE0RTlBNUNDMkYxMzFDN0Q6RUU1NEQxM0VCQ0FFNzA2RDIyNkJDMzE0MkNENDBENEE6MQorU0VFRC1FQ0I6MjhEQkMzQkM0OUZGRDg3RENGQTUwOUIxMUQ0MjJCRTc6OkI0MUU2QkUyRUJBODRBMTQ4RTJFRUQ4NDU5M0M1RUM3OjlCOUI3QkZDRDE4MTNDQjk1RDBCMzYxOEY0MEY1MTIyOjEKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9kc3MuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9kc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGMyNjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9tX2Rzcy5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIGNyeXB0by9ldnAvbV9kc3MuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisKK3N0YXRpYyBpbnQgaW5pdChFVlBfTURfQ1RYICpjdHgpCisJeyByZXR1cm4gU0hBMV9Jbml0KGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGludCB1cGRhdGUoRVZQX01EX0NUWCAqY3R4LGNvbnN0IHZvaWQgKmRhdGEsc2l6ZV90IGNvdW50KQorCXsgcmV0dXJuIFNIQTFfVXBkYXRlKGN0eC0+bWRfZGF0YSxkYXRhLGNvdW50KTsgfQorCitzdGF0aWMgaW50IGZpbmFsKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCkKKwl7IHJldHVybiBTSEExX0ZpbmFsKG1kLGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGNvbnN0IEVWUF9NRCBkc2FfbWQ9CisJeworCU5JRF9kc2FXaXRoU0hBLAorCU5JRF9kc2FXaXRoU0hBLAorCVNIQV9ESUdFU1RfTEVOR1RILAorCUVWUF9NRF9GTEFHX1BLRVlfRElHRVNULAorCWluaXQsCisJdXBkYXRlLAorCWZpbmFsLAorCU5VTEwsCisJTlVMTCwKKwlFVlBfUEtFWV9EU0FfbWV0aG9kLAorCVNIQV9DQkxPQ0ssCisJc2l6ZW9mKEVWUF9NRCAqKStzaXplb2YoU0hBX0NUWCksCisJfTsKKworY29uc3QgRVZQX01EICpFVlBfZHNzKHZvaWQpCisJeworCXJldHVybigmZHNhX21kKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9kc3MxLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fZHNzMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDNmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fZHNzMS5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiBjcnlwdG8vZXZwL21fZHNzMS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNlbmRpZgorCitzdGF0aWMgaW50IGluaXQoRVZQX01EX0NUWCAqY3R4KQorCXsgcmV0dXJuIFNIQTFfSW5pdChjdHgtPm1kX2RhdGEpOyB9CisKK3N0YXRpYyBpbnQgdXBkYXRlKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCkKKwl7IHJldHVybiBTSEExX1VwZGF0ZShjdHgtPm1kX2RhdGEsZGF0YSxjb3VudCk7IH0KKworc3RhdGljIGludCBmaW5hbChFVlBfTURfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqbWQpCisJeyByZXR1cm4gU0hBMV9GaW5hbChtZCxjdHgtPm1kX2RhdGEpOyB9CisKK3N0YXRpYyBjb25zdCBFVlBfTUQgZHNzMV9tZD0KKwl7CisJTklEX2RzYSwKKwlOSURfZHNhV2l0aFNIQTEsCisJU0hBX0RJR0VTVF9MRU5HVEgsCisJRVZQX01EX0ZMQUdfUEtFWV9ESUdFU1QsCisJaW5pdCwKKwl1cGRhdGUsCisJZmluYWwsCisJTlVMTCwKKwlOVUxMLAorCUVWUF9QS0VZX0RTQV9tZXRob2QsCisJU0hBX0NCTE9DSywKKwlzaXplb2YoRVZQX01EICopK3NpemVvZihTSEFfQ1RYKSwKKwl9OworCitjb25zdCBFVlBfTUQgKkVWUF9kc3MxKHZvaWQpCisJeworCXJldHVybigmZHNzMV9tZCk7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fZWNkc2EuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9lY2RzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODdhNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fZWNkc2EuYwpAQCAtMCwwICsxLDE0OCBAQAorLyogY3J5cHRvL2V2cC9tX2VjZHNhLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKK3N0YXRpYyBpbnQgaW5pdChFVlBfTURfQ1RYICpjdHgpCisJeyByZXR1cm4gU0hBMV9Jbml0KGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGludCB1cGRhdGUoRVZQX01EX0NUWCAqY3R4LGNvbnN0IHZvaWQgKmRhdGEsc2l6ZV90IGNvdW50KQorCXsgcmV0dXJuIFNIQTFfVXBkYXRlKGN0eC0+bWRfZGF0YSxkYXRhLGNvdW50KTsgfQorCitzdGF0aWMgaW50IGZpbmFsKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCkKKwl7IHJldHVybiBTSEExX0ZpbmFsKG1kLGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGNvbnN0IEVWUF9NRCBlY2RzYV9tZD0KKwl7CisJTklEX2VjZHNhX3dpdGhfU0hBMSwKKwlOSURfZWNkc2Ffd2l0aF9TSEExLAorCVNIQV9ESUdFU1RfTEVOR1RILAorCUVWUF9NRF9GTEFHX1BLRVlfRElHRVNULAorCWluaXQsCisJdXBkYXRlLAorCWZpbmFsLAorCU5VTEwsCisJTlVMTCwKKwlFVlBfUEtFWV9FQ0RTQV9tZXRob2QsCisJU0hBX0NCTE9DSywKKwlzaXplb2YoRVZQX01EICopK3NpemVvZihTSEFfQ1RYKSwKKwl9OworCitjb25zdCBFVlBfTUQgKkVWUF9lY2RzYSh2b2lkKQorCXsKKwlyZXR1cm4oJmVjZHNhX21kKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9tZDQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9tZDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTBiN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9tX21kNC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiBjcnlwdG8vZXZwL21fbWQ0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKworI2lmbmRlZiBPUEVOU1NMX05PX01ENAorCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKworc3RhdGljIGludCBpbml0KEVWUF9NRF9DVFggKmN0eCkKKwl7IHJldHVybiBNRDRfSW5pdChjdHgtPm1kX2RhdGEpOyB9CisKK3N0YXRpYyBpbnQgdXBkYXRlKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCkKKwl7IHJldHVybiBNRDRfVXBkYXRlKGN0eC0+bWRfZGF0YSxkYXRhLGNvdW50KTsgfQorCitzdGF0aWMgaW50IGZpbmFsKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCkKKwl7IHJldHVybiBNRDRfRmluYWwobWQsY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgY29uc3QgRVZQX01EIG1kNF9tZD0KKwl7CisJTklEX21kNCwKKwlOSURfbWQ0V2l0aFJTQUVuY3J5cHRpb24sCisJTUQ0X0RJR0VTVF9MRU5HVEgsCisJMCwKKwlpbml0LAorCXVwZGF0ZSwKKwlmaW5hbCwKKwlOVUxMLAorCU5VTEwsCisJRVZQX1BLRVlfUlNBX21ldGhvZCwKKwlNRDRfQ0JMT0NLLAorCXNpemVvZihFVlBfTUQgKikrc2l6ZW9mKE1ENF9DVFgpLAorCX07CisKK2NvbnN0IEVWUF9NRCAqRVZQX21kNCh2b2lkKQorCXsKKwlyZXR1cm4oJm1kNF9tZCk7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fbWQ1LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjMTQyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9tZDUuYwpAQCAtMCwwICsxLDEwMSBAQAorLyogY3J5cHRvL2V2cC9tX21kNS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdChFVlBfTURfQ1RYICpjdHgpCisJeyByZXR1cm4gTUQ1X0luaXQoY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgaW50IHVwZGF0ZShFVlBfTURfQ1RYICpjdHgsY29uc3Qgdm9pZCAqZGF0YSxzaXplX3QgY291bnQpCisJeyByZXR1cm4gTUQ1X1VwZGF0ZShjdHgtPm1kX2RhdGEsZGF0YSxjb3VudCk7IH0KKworc3RhdGljIGludCBmaW5hbChFVlBfTURfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqbWQpCisJeyByZXR1cm4gTUQ1X0ZpbmFsKG1kLGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGNvbnN0IEVWUF9NRCBtZDVfbWQ9CisJeworCU5JRF9tZDUsCisJTklEX21kNVdpdGhSU0FFbmNyeXB0aW9uLAorCU1ENV9ESUdFU1RfTEVOR1RILAorCTAsCisJaW5pdCwKKwl1cGRhdGUsCisJZmluYWwsCisJTlVMTCwKKwlOVUxMLAorCUVWUF9QS0VZX1JTQV9tZXRob2QsCisJTUQ1X0NCTE9DSywKKwlzaXplb2YoRVZQX01EICopK3NpemVvZihNRDVfQ1RYKSwKKwl9OworCitjb25zdCBFVlBfTUQgKkVWUF9tZDUodm9pZCkKKwl7CisJcmV0dXJuKCZtZDVfbWQpOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9tX21kYzIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9tZGMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4ZDU1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9tZGMyLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qIGNyeXB0by9ldnAvbV9tZGMyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKworI2lmbmRlZiBPUEVOU1NMX05PX01EQzIKKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZGMyLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorCitzdGF0aWMgaW50IGluaXQoRVZQX01EX0NUWCAqY3R4KQorCXsgcmV0dXJuIE1EQzJfSW5pdChjdHgtPm1kX2RhdGEpOyB9CisKK3N0YXRpYyBpbnQgdXBkYXRlKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCkKKwl7IHJldHVybiBNREMyX1VwZGF0ZShjdHgtPm1kX2RhdGEsZGF0YSxjb3VudCk7IH0KKworc3RhdGljIGludCBmaW5hbChFVlBfTURfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqbWQpCisJeyByZXR1cm4gTURDMl9GaW5hbChtZCxjdHgtPm1kX2RhdGEpOyB9CisKK3N0YXRpYyBjb25zdCBFVlBfTUQgbWRjMl9tZD0KKwl7CisJTklEX21kYzIsCisJTklEX21kYzJXaXRoUlNBLAorCU1EQzJfRElHRVNUX0xFTkdUSCwKKwkwLAorCWluaXQsCisJdXBkYXRlLAorCWZpbmFsLAorCU5VTEwsCisJTlVMTCwKKwlFVlBfUEtFWV9SU0FfQVNOMV9PQ1RFVF9TVFJJTkdfbWV0aG9kLAorCU1EQzJfQkxPQ0ssCisJc2l6ZW9mKEVWUF9NRCAqKStzaXplb2YoTURDMl9DVFgpLAorCX07CisKK2NvbnN0IEVWUF9NRCAqRVZQX21kYzIodm9pZCkKKwl7CisJcmV0dXJuKCZtZGMyX21kKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9udWxsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fbnVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMDcyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fbnVsbC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIGNyeXB0by9ldnAvbV9udWxsLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCitzdGF0aWMgaW50IGluaXQoRVZQX01EX0NUWCAqY3R4KQorCXsgcmV0dXJuIDE7IH0KKworc3RhdGljIGludCB1cGRhdGUoRVZQX01EX0NUWCAqY3R4LGNvbnN0IHZvaWQgKmRhdGEsc2l6ZV90IGNvdW50KQorCXsgcmV0dXJuIDE7IH0KKworc3RhdGljIGludCBmaW5hbChFVlBfTURfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqbWQpCisJeyByZXR1cm4gMTsgfQorCitzdGF0aWMgY29uc3QgRVZQX01EIG51bGxfbWQ9CisJeworCU5JRF91bmRlZiwKKwlOSURfdW5kZWYsCisJMCwKKwkwLAorCWluaXQsCisJdXBkYXRlLAorCWZpbmFsLAorCU5VTEwsCisJTlVMTCwKKwlFVlBfUEtFWV9OVUxMX21ldGhvZCwKKwkwLAorCXNpemVvZihFVlBfTUQgKiksCisJfTsKKworY29uc3QgRVZQX01EICpFVlBfbWRfbnVsbCh2b2lkKQorCXsKKwlyZXR1cm4oJm51bGxfbWQpOworCX0KKworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fcmlwZW1kLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fcmlwZW1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkNjBlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9yaXBlbWQuYwpAQCAtMCwwICsxLDEwMSBAQAorLyogY3J5cHRvL2V2cC9tX3JpcGVtZC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SSVBFTUQKKworI2luY2x1ZGUgPG9wZW5zc2wvcmlwZW1kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdChFVlBfTURfQ1RYICpjdHgpCisJeyByZXR1cm4gUklQRU1EMTYwX0luaXQoY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgaW50IHVwZGF0ZShFVlBfTURfQ1RYICpjdHgsY29uc3Qgdm9pZCAqZGF0YSxzaXplX3QgY291bnQpCisJeyByZXR1cm4gUklQRU1EMTYwX1VwZGF0ZShjdHgtPm1kX2RhdGEsZGF0YSxjb3VudCk7IH0KKworc3RhdGljIGludCBmaW5hbChFVlBfTURfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqbWQpCisJeyByZXR1cm4gUklQRU1EMTYwX0ZpbmFsKG1kLGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGNvbnN0IEVWUF9NRCByaXBlbWQxNjBfbWQ9CisJeworCU5JRF9yaXBlbWQxNjAsCisJTklEX3JpcGVtZDE2MFdpdGhSU0EsCisJUklQRU1EMTYwX0RJR0VTVF9MRU5HVEgsCisJMCwKKwlpbml0LAorCXVwZGF0ZSwKKwlmaW5hbCwKKwlOVUxMLAorCU5VTEwsCisJRVZQX1BLRVlfUlNBX21ldGhvZCwKKwlSSVBFTUQxNjBfQ0JMT0NLLAorCXNpemVvZihFVlBfTUQgKikrc2l6ZW9mKFJJUEVNRDE2MF9DVFgpLAorCX07CisKK2NvbnN0IEVWUF9NRCAqRVZQX3JpcGVtZDE2MCh2b2lkKQorCXsKKwlyZXR1cm4oJnJpcGVtZDE2MF9tZCk7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fc2hhMS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9tX3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTI3OTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9tX3NoYTEuYwpAQCAtMCwwICsxLDIwNCBAQAorLyogY3J5cHRvL2V2cC9tX3NoYTEuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKworc3RhdGljIGludCBpbml0KEVWUF9NRF9DVFggKmN0eCkKKwl7IHJldHVybiBTSEExX0luaXQoY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgaW50IHVwZGF0ZShFVlBfTURfQ1RYICpjdHgsY29uc3Qgdm9pZCAqZGF0YSxzaXplX3QgY291bnQpCisJeyByZXR1cm4gU0hBMV9VcGRhdGUoY3R4LT5tZF9kYXRhLGRhdGEsY291bnQpOyB9CisKK3N0YXRpYyBpbnQgZmluYWwoRVZQX01EX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm1kKQorCXsgcmV0dXJuIFNIQTFfRmluYWwobWQsY3R4LT5tZF9kYXRhKTsgfQorCitzdGF0aWMgY29uc3QgRVZQX01EIHNoYTFfbWQ9CisJeworCU5JRF9zaGExLAorCU5JRF9zaGExV2l0aFJTQUVuY3J5cHRpb24sCisJU0hBX0RJR0VTVF9MRU5HVEgsCisJRVZQX01EX0ZMQUdfUEtFWV9NRVRIT0RfU0lHTkFUVVJFfEVWUF9NRF9GTEFHX0RJR0FMR0lEX0FCU0VOVCwKKwlpbml0LAorCXVwZGF0ZSwKKwlmaW5hbCwKKwlOVUxMLAorCU5VTEwsCisJRVZQX1BLRVlfUlNBX21ldGhvZCwKKwlTSEFfQ0JMT0NLLAorCXNpemVvZihFVlBfTUQgKikrc2l6ZW9mKFNIQV9DVFgpLAorCX07CisKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTEodm9pZCkKKwl7CisJcmV0dXJuKCZzaGExX21kKTsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1NIQTI1Ngorc3RhdGljIGludCBpbml0MjI0KEVWUF9NRF9DVFggKmN0eCkKKwl7IHJldHVybiBTSEEyMjRfSW5pdChjdHgtPm1kX2RhdGEpOyB9CitzdGF0aWMgaW50IGluaXQyNTYoRVZQX01EX0NUWCAqY3R4KQorCXsgcmV0dXJuIFNIQTI1Nl9Jbml0KGN0eC0+bWRfZGF0YSk7IH0KKy8qCisgKiBFdmVuIHRob3VnaCB0aGVyZSdyZSBzZXBhcmF0ZSBTSEEyMjRfW1VwZGF0ZXxGaW5hbF0sIHdlIGNhbGwKKyAqIFNIQTI1NiBmdW5jdGlvbnMgZXZlbiBpbiBTSEEyMjQgY29udGV4dC4gVGhpcyBpcyB3aGF0IGhhcHBlbnMKKyAqIHRoZXJlIGFueXdheSwgc28gd2UgY2FuIHNwYXJlIGZldyBDUFUgY3ljbGVzOi0pCisgKi8KK3N0YXRpYyBpbnQgdXBkYXRlMjU2KEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCkKKwl7IHJldHVybiBTSEEyNTZfVXBkYXRlKGN0eC0+bWRfZGF0YSxkYXRhLGNvdW50KTsgfQorc3RhdGljIGludCBmaW5hbDI1NihFVlBfTURfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqbWQpCisJeyByZXR1cm4gU0hBMjU2X0ZpbmFsKG1kLGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGNvbnN0IEVWUF9NRCBzaGEyMjRfbWQ9CisJeworCU5JRF9zaGEyMjQsCisJTklEX3NoYTIyNFdpdGhSU0FFbmNyeXB0aW9uLAorCVNIQTIyNF9ESUdFU1RfTEVOR1RILAorCUVWUF9NRF9GTEFHX1BLRVlfTUVUSE9EX1NJR05BVFVSRXxFVlBfTURfRkxBR19ESUdBTEdJRF9BQlNFTlQsCisJaW5pdDIyNCwKKwl1cGRhdGUyNTYsCisJZmluYWwyNTYsCisJTlVMTCwKKwlOVUxMLAorCUVWUF9QS0VZX1JTQV9tZXRob2QsCisJU0hBMjU2X0NCTE9DSywKKwlzaXplb2YoRVZQX01EICopK3NpemVvZihTSEEyNTZfQ1RYKSwKKwl9OworCitjb25zdCBFVlBfTUQgKkVWUF9zaGEyMjQodm9pZCkKKwl7IHJldHVybigmc2hhMjI0X21kKTsgfQorCitzdGF0aWMgY29uc3QgRVZQX01EIHNoYTI1Nl9tZD0KKwl7CisJTklEX3NoYTI1NiwKKwlOSURfc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24sCisJU0hBMjU2X0RJR0VTVF9MRU5HVEgsCisJRVZQX01EX0ZMQUdfUEtFWV9NRVRIT0RfU0lHTkFUVVJFfEVWUF9NRF9GTEFHX0RJR0FMR0lEX0FCU0VOVCwKKwlpbml0MjU2LAorCXVwZGF0ZTI1NiwKKwlmaW5hbDI1NiwKKwlOVUxMLAorCU5VTEwsCisJRVZQX1BLRVlfUlNBX21ldGhvZCwKKwlTSEEyNTZfQ0JMT0NLLAorCXNpemVvZihFVlBfTUQgKikrc2l6ZW9mKFNIQTI1Nl9DVFgpLAorCX07CisKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTI1Nih2b2lkKQorCXsgcmV0dXJuKCZzaGEyNTZfbWQpOyB9CisjZW5kaWYJLyogaWZuZGVmIE9QRU5TU0xfTk9fU0hBMjU2ICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEE1MTIKK3N0YXRpYyBpbnQgaW5pdDM4NChFVlBfTURfQ1RYICpjdHgpCisJeyByZXR1cm4gU0hBMzg0X0luaXQoY3R4LT5tZF9kYXRhKTsgfQorc3RhdGljIGludCBpbml0NTEyKEVWUF9NRF9DVFggKmN0eCkKKwl7IHJldHVybiBTSEE1MTJfSW5pdChjdHgtPm1kX2RhdGEpOyB9CisvKiBTZWUgY29tbWVudCBpbiBTSEEyMjQvMjU2IHNlY3Rpb24gKi8KK3N0YXRpYyBpbnQgdXBkYXRlNTEyKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCkKKwl7IHJldHVybiBTSEE1MTJfVXBkYXRlKGN0eC0+bWRfZGF0YSxkYXRhLGNvdW50KTsgfQorc3RhdGljIGludCBmaW5hbDUxMihFVlBfTURfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqbWQpCisJeyByZXR1cm4gU0hBNTEyX0ZpbmFsKG1kLGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGNvbnN0IEVWUF9NRCBzaGEzODRfbWQ9CisJeworCU5JRF9zaGEzODQsCisJTklEX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uLAorCVNIQTM4NF9ESUdFU1RfTEVOR1RILAorCUVWUF9NRF9GTEFHX1BLRVlfTUVUSE9EX1NJR05BVFVSRXxFVlBfTURfRkxBR19ESUdBTEdJRF9BQlNFTlQsCisJaW5pdDM4NCwKKwl1cGRhdGU1MTIsCisJZmluYWw1MTIsCisJTlVMTCwKKwlOVUxMLAorCUVWUF9QS0VZX1JTQV9tZXRob2QsCisJU0hBNTEyX0NCTE9DSywKKwlzaXplb2YoRVZQX01EICopK3NpemVvZihTSEE1MTJfQ1RYKSwKKwl9OworCitjb25zdCBFVlBfTUQgKkVWUF9zaGEzODQodm9pZCkKKwl7IHJldHVybigmc2hhMzg0X21kKTsgfQorCitzdGF0aWMgY29uc3QgRVZQX01EIHNoYTUxMl9tZD0KKwl7CisJTklEX3NoYTUxMiwKKwlOSURfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24sCisJU0hBNTEyX0RJR0VTVF9MRU5HVEgsCisJRVZQX01EX0ZMQUdfUEtFWV9NRVRIT0RfU0lHTkFUVVJFfEVWUF9NRF9GTEFHX0RJR0FMR0lEX0FCU0VOVCwKKwlpbml0NTEyLAorCXVwZGF0ZTUxMiwKKwlmaW5hbDUxMiwKKwlOVUxMLAorCU5VTEwsCisJRVZQX1BLRVlfUlNBX21ldGhvZCwKKwlTSEE1MTJfQ0JMT0NLLAorCXNpemVvZihFVlBfTUQgKikrc2l6ZW9mKFNIQTUxMl9DVFgpLAorCX07CisKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTUxMih2b2lkKQorCXsgcmV0dXJuKCZzaGE1MTJfbWQpOyB9CisjZW5kaWYJLyogaWZuZGVmIE9QRU5TU0xfTk9fU0hBNTEyICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fc2lndmVyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL21fc2lndmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiN2Y5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV9zaWd2ZXIuYwpAQCAtMCwwICsxLDIwMCBAQAorLyogbV9zaWd2ZXIuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYsMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKworc3RhdGljIGludCBkb19zaWd2ZXJfaW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqKnBjdHgsCisJCQkgIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICplLCBFVlBfUEtFWSAqcGtleSwKKwkJCSAgaW50IHZlcikKKwl7CisJaWYgKGN0eC0+cGN0eCA9PSBOVUxMKQorCQljdHgtPnBjdHggPSBFVlBfUEtFWV9DVFhfbmV3KHBrZXksIGUpOworCWlmIChjdHgtPnBjdHggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodHlwZSA9PSBOVUxMKQorCQl7CisJCWludCBkZWZfbmlkOworCQlpZiAoRVZQX1BLRVlfZ2V0X2RlZmF1bHRfZGlnZXN0X25pZChwa2V5LCAmZGVmX25pZCkgPiAwKQorCQkJdHlwZSA9IEVWUF9nZXRfZGlnZXN0YnluaWQoZGVmX25pZCk7CisJCX0KKworCWlmICh0eXBlID09IE5VTEwpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0RPX1NJR1ZFUl9JTklULCBFVlBfUl9OT19ERUZBVUxUX0RJR0VTVCk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAodmVyKQorCQl7CisJCWlmIChjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHhfaW5pdCkKKwkJCXsKKwkJCWlmIChjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHhfaW5pdChjdHgtPnBjdHgsIGN0eCkgPD0wKQorCQkJCXJldHVybiAwOworCQkJY3R4LT5wY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9WRVJJRllDVFg7CisJCQl9CisJCWVsc2UgaWYgKEVWUF9QS0VZX3ZlcmlmeV9pbml0KGN0eC0+cGN0eCkgPD0gMCkKKwkJCXJldHVybiAwOworCQl9CisJZWxzZQorCQl7CisJCWlmIChjdHgtPnBjdHgtPnBtZXRoLT5zaWduY3R4X2luaXQpCisJCQl7CisJCQlpZiAoY3R4LT5wY3R4LT5wbWV0aC0+c2lnbmN0eF9pbml0KGN0eC0+cGN0eCwgY3R4KSA8PSAwKQorCQkJCXJldHVybiAwOworCQkJY3R4LT5wY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9TSUdOQ1RYOworCQkJfQorCQllbHNlIGlmIChFVlBfUEtFWV9zaWduX2luaXQoY3R4LT5wY3R4KSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoRVZQX1BLRVlfQ1RYX3NldF9zaWduYXR1cmVfbWQoY3R4LT5wY3R4LCB0eXBlKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAocGN0eCkKKwkJKnBjdHggPSBjdHgtPnBjdHg7CisJaWYgKCFFVlBfRGlnZXN0SW5pdF9leChjdHgsIHR5cGUsIGUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBFVlBfRGlnZXN0U2lnbkluaXQoRVZQX01EX0NUWCAqY3R4LCBFVlBfUEtFWV9DVFggKipwY3R4LAorCQkJY29uc3QgRVZQX01EICp0eXBlLCBFTkdJTkUgKmUsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4gZG9fc2lndmVyX2luaXQoY3R4LCBwY3R4LCB0eXBlLCBlLCBwa2V5LCAwKTsKKwl9CisKK2ludCBFVlBfRGlnZXN0VmVyaWZ5SW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqKnBjdHgsCisJCQljb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqZSwgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBkb19zaWd2ZXJfaW5pdChjdHgsIHBjdHgsIHR5cGUsIGUsIHBrZXksIDEpOworCX0KKworaW50IEVWUF9EaWdlc3RTaWduRmluYWwoRVZQX01EX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWdyZXQsIHNpemVfdCAqc2lnbGVuKQorCXsKKwlpbnQgc2N0eCwgciA9IDA7CisJaWYgKGN0eC0+cGN0eC0+cG1ldGgtPnNpZ25jdHgpCisJCXNjdHggPSAxOworCWVsc2UKKwkJc2N0eCA9IDA7CisJaWYgKHNpZ3JldCkKKwkJeworCQlNU19TVEFUSUMgRVZQX01EX0NUWCB0bXBfY3R4OworCQl1bnNpZ25lZCBjaGFyIG1kW0VWUF9NQVhfTURfU0laRV07CisJCXVuc2lnbmVkIGludCBtZGxlbjsKKwkJRVZQX01EX0NUWF9pbml0KCZ0bXBfY3R4KTsKKwkJaWYgKCFFVlBfTURfQ1RYX2NvcHlfZXgoJnRtcF9jdHgsY3R4KSkKKwkJICAgICAJcmV0dXJuIDA7CisJCWlmIChzY3R4KQorCQkJciA9IHRtcF9jdHgucGN0eC0+cG1ldGgtPnNpZ25jdHgodG1wX2N0eC5wY3R4LAorCQkJCQlzaWdyZXQsIHNpZ2xlbiwgJnRtcF9jdHgpOworCQllbHNlCisJCQlyID0gRVZQX0RpZ2VzdEZpbmFsX2V4KCZ0bXBfY3R4LG1kLCZtZGxlbik7CisJCUVWUF9NRF9DVFhfY2xlYW51cCgmdG1wX2N0eCk7CisJCWlmIChzY3R4IHx8ICFyKQorCQkJcmV0dXJuIHI7CisJCWlmIChFVlBfUEtFWV9zaWduKGN0eC0+cGN0eCwgc2lncmV0LCBzaWdsZW4sIG1kLCBtZGxlbikgPD0gMCkKKwkJCXJldHVybiAwOworCQl9CisJZWxzZQorCQl7CisJCWlmIChzY3R4KQorCQkJeworCQkJaWYgKGN0eC0+cGN0eC0+cG1ldGgtPnNpZ25jdHgoY3R4LT5wY3R4LCBzaWdyZXQsIHNpZ2xlbiwgY3R4KSA8PSAwKQorCQkJCXJldHVybiAwOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpbnQgcyA9IEVWUF9NRF9zaXplKGN0eC0+ZGlnZXN0KTsKKwkJCWlmIChzIDwgMCB8fCBFVlBfUEtFWV9zaWduKGN0eC0+cGN0eCwgc2lncmV0LCBzaWdsZW4sIE5VTEwsIHMpIDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2ludCBFVlBfRGlnZXN0VmVyaWZ5RmluYWwoRVZQX01EX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCBzaWdsZW4pCisJeworCU1TX1NUQVRJQyBFVlBfTURfQ1RYIHRtcF9jdHg7CisJdW5zaWduZWQgY2hhciBtZFtFVlBfTUFYX01EX1NJWkVdOworCWludCByOworCXVuc2lnbmVkIGludCBtZGxlbjsKKwlpbnQgdmN0eDsKKworCWlmIChjdHgtPnBjdHgtPnBtZXRoLT52ZXJpZnljdHgpCisJCXZjdHggPSAxOworCWVsc2UKKwkJdmN0eCA9IDA7CisJRVZQX01EX0NUWF9pbml0KCZ0bXBfY3R4KTsKKwlpZiAoIUVWUF9NRF9DVFhfY29weV9leCgmdG1wX2N0eCxjdHgpKQorCQlyZXR1cm4gLTE7CQorCWlmICh2Y3R4KQorCQl7CisJCXIgPSB0bXBfY3R4LnBjdHgtPnBtZXRoLT52ZXJpZnljdHgodG1wX2N0eC5wY3R4LAorCQkJCQlzaWcsIHNpZ2xlbiwgJnRtcF9jdHgpOworCQl9CisJZWxzZQorCQlyID0gRVZQX0RpZ2VzdEZpbmFsX2V4KCZ0bXBfY3R4LG1kLCZtZGxlbik7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZ0bXBfY3R4KTsKKwlpZiAodmN0eCB8fCAhcikKKwkJcmV0dXJuIHI7CisJcmV0dXJuIEVWUF9QS0VZX3ZlcmlmeShjdHgtPnBjdHgsIHNpZywgc2lnbGVuLCBtZCwgbWRsZW4pOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV93cC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9tX3dwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlNDdjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbV93cC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIGNyeXB0by9ldnAvbV93cC5jICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19XSElSTFBPT0wKKworI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC93aHJscG9vbC5oPgorCitzdGF0aWMgaW50IGluaXQoRVZQX01EX0NUWCAqY3R4KQorCXsgcmV0dXJuIFdISVJMUE9PTF9Jbml0KGN0eC0+bWRfZGF0YSk7IH0KKworc3RhdGljIGludCB1cGRhdGUoRVZQX01EX0NUWCAqY3R4LGNvbnN0IHZvaWQgKmRhdGEsc2l6ZV90IGNvdW50KQorCXsgcmV0dXJuIFdISVJMUE9PTF9VcGRhdGUoY3R4LT5tZF9kYXRhLGRhdGEsY291bnQpOyB9CisKK3N0YXRpYyBpbnQgZmluYWwoRVZQX01EX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm1kKQorCXsgcmV0dXJuIFdISVJMUE9PTF9GaW5hbChtZCxjdHgtPm1kX2RhdGEpOyB9CisKK3N0YXRpYyBjb25zdCBFVlBfTUQgd2hpcmxwb29sX21kPQorCXsKKwlOSURfd2hpcmxwb29sLAorCTAsCisJV0hJUkxQT09MX0RJR0VTVF9MRU5HVEgsCisJMCwKKwlpbml0LAorCXVwZGF0ZSwKKwlmaW5hbCwKKwlOVUxMLAorCU5VTEwsCisJRVZQX1BLRVlfTlVMTF9tZXRob2QsCisJV0hJUkxQT09MX0JCTE9DSy84LAorCXNpemVvZihFVlBfTUQgKikrc2l6ZW9mKFdISVJMUE9PTF9DVFgpLAorCX07CisKK2NvbnN0IEVWUF9NRCAqRVZQX3doaXJscG9vbCh2b2lkKQorCXsKKwlyZXR1cm4oJndoaXJscG9vbF9tZCk7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL25hbWVzLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL25hbWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4NjlmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvbmFtZXMuYwpAQCAtMCwwICsxLDIwMSBAQAorLyogY3J5cHRvL2V2cC9uYW1lcy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworaW50IEVWUF9hZGRfY2lwaGVyKGNvbnN0IEVWUF9DSVBIRVIgKmMpCisJeworCWludCByOworCisJcj1PQkpfTkFNRV9hZGQoT0JKX25pZDJzbihjLT5uaWQpLE9CSl9OQU1FX1RZUEVfQ0lQSEVSX01FVEgsKGNvbnN0IGNoYXIgKiljKTsKKwlpZiAociA9PSAwKSByZXR1cm4oMCk7CisJY2hlY2tfZGVmZXIoYy0+bmlkKTsKKwlyPU9CSl9OQU1FX2FkZChPQkpfbmlkMmxuKGMtPm5pZCksT0JKX05BTUVfVFlQRV9DSVBIRVJfTUVUSCwoY29uc3QgY2hhciAqKWMpOworCXJldHVybihyKTsKKwl9CisKKworaW50IEVWUF9hZGRfZGlnZXN0KGNvbnN0IEVWUF9NRCAqbWQpCisJeworCWludCByOworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwluYW1lPU9CSl9uaWQyc24obWQtPnR5cGUpOworCXI9T0JKX05BTUVfYWRkKG5hbWUsT0JKX05BTUVfVFlQRV9NRF9NRVRILChjb25zdCBjaGFyICopbWQpOworCWlmIChyID09IDApIHJldHVybigwKTsKKwljaGVja19kZWZlcihtZC0+dHlwZSk7CisJcj1PQkpfTkFNRV9hZGQoT0JKX25pZDJsbihtZC0+dHlwZSksT0JKX05BTUVfVFlQRV9NRF9NRVRILChjb25zdCBjaGFyICopbWQpOworCWlmIChyID09IDApIHJldHVybigwKTsKKworCWlmIChtZC0+cGtleV90eXBlICYmIG1kLT50eXBlICE9IG1kLT5wa2V5X3R5cGUpCisJCXsKKwkJcj1PQkpfTkFNRV9hZGQoT0JKX25pZDJzbihtZC0+cGtleV90eXBlKSwKKwkJCU9CSl9OQU1FX1RZUEVfTURfTUVUSHxPQkpfTkFNRV9BTElBUyxuYW1lKTsKKwkJaWYgKHIgPT0gMCkgcmV0dXJuKDApOworCQljaGVja19kZWZlcihtZC0+cGtleV90eXBlKTsKKwkJcj1PQkpfTkFNRV9hZGQoT0JKX25pZDJsbihtZC0+cGtleV90eXBlKSwKKwkJCU9CSl9OQU1FX1RZUEVfTURfTUVUSHxPQkpfTkFNRV9BTElBUyxuYW1lKTsKKwkJfQorCXJldHVybihyKTsKKwl9CisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9nZXRfY2lwaGVyYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpCisJeworCWNvbnN0IEVWUF9DSVBIRVIgKmNwOworCisJY3A9KGNvbnN0IEVWUF9DSVBIRVIgKilPQkpfTkFNRV9nZXQobmFtZSxPQkpfTkFNRV9UWVBFX0NJUEhFUl9NRVRIKTsKKwlyZXR1cm4oY3ApOworCX0KKworY29uc3QgRVZQX01EICpFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKQorCXsKKwljb25zdCBFVlBfTUQgKmNwOworCisJY3A9KGNvbnN0IEVWUF9NRCAqKU9CSl9OQU1FX2dldChuYW1lLE9CSl9OQU1FX1RZUEVfTURfTUVUSCk7CisJcmV0dXJuKGNwKTsKKwl9CisKK3ZvaWQgRVZQX2NsZWFudXAodm9pZCkKKwl7CisJT0JKX05BTUVfY2xlYW51cChPQkpfTkFNRV9UWVBFX0NJUEhFUl9NRVRIKTsKKwlPQkpfTkFNRV9jbGVhbnVwKE9CSl9OQU1FX1RZUEVfTURfTUVUSCk7CisJLyogVGhlIGFib3ZlIGNhbGxzIHdpbGwgb25seSBjbGVhbiBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBuYW1lCisJICAgaGFzaCB0YWJsZSwgYnV0IG5vdCB0aGUgaGFzaCB0YWJsZSBpdHNlbGYuICBUaGUgZm9sbG93aW5nIGxpbmUKKwkgICBkb2VzIHRoYXQgcGFydC4gIC0tIFJpY2hhcmQgTGV2aXR0ZSAqLworCU9CSl9OQU1FX2NsZWFudXAoLTEpOworCisJRVZQX1BCRV9jbGVhbnVwKCk7CisJaWYgKG9ial9jbGVhbnVwX2RlZmVyID09IDIpCisJCXsKKwkJb2JqX2NsZWFudXBfZGVmZXIgPSAwOworCQlPQkpfY2xlYW51cCgpOworCQl9CisJT0JKX3NpZ2lkX2ZyZWUoKTsKKwl9CisKK3N0cnVjdCBkb2FsbF9jaXBoZXIKKwl7CisJdm9pZCAqYXJnOworCXZvaWQgKCpmbikoY29uc3QgRVZQX0NJUEhFUiAqY2lwaCwKKwkJCWNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvLCB2b2lkICphcmcpOworCX07CisKK3N0YXRpYyB2b2lkIGRvX2FsbF9jaXBoZXJfZm4oY29uc3QgT0JKX05BTUUgKm5tLCB2b2lkICphcmcpCisJeworCXN0cnVjdCBkb2FsbF9jaXBoZXIgKmRjID0gYXJnOworCWlmIChubS0+YWxpYXMpCisJCWRjLT5mbihOVUxMLCBubS0+bmFtZSwgbm0tPmRhdGEsIGRjLT5hcmcpOworCWVsc2UKKwkJZGMtPmZuKChjb25zdCBFVlBfQ0lQSEVSICopbm0tPmRhdGEsIG5tLT5uYW1lLCBOVUxMLCBkYy0+YXJnKTsKKwl9CisKK3ZvaWQgRVZQX0NJUEhFUl9kb19hbGwodm9pZCAoKmZuKShjb25zdCBFVlBfQ0lQSEVSICpjaXBoLAorCQljb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywgdm9pZCAqeCksIHZvaWQgKmFyZykKKwl7CisJc3RydWN0IGRvYWxsX2NpcGhlciBkYzsKKwlkYy5mbiA9IGZuOworCWRjLmFyZyA9IGFyZzsKKwlPQkpfTkFNRV9kb19hbGwoT0JKX05BTUVfVFlQRV9DSVBIRVJfTUVUSCwgZG9fYWxsX2NpcGhlcl9mbiwgJmRjKTsKKwl9CisKK3ZvaWQgRVZQX0NJUEhFUl9kb19hbGxfc29ydGVkKHZvaWQgKCpmbikoY29uc3QgRVZQX0NJUEhFUiAqY2lwaCwKKwkJY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8sIHZvaWQgKngpLCB2b2lkICphcmcpCisJeworCXN0cnVjdCBkb2FsbF9jaXBoZXIgZGM7CisJZGMuZm4gPSBmbjsKKwlkYy5hcmcgPSBhcmc7CisJT0JKX05BTUVfZG9fYWxsX3NvcnRlZChPQkpfTkFNRV9UWVBFX0NJUEhFUl9NRVRILCBkb19hbGxfY2lwaGVyX2ZuLCZkYyk7CisJfQorCitzdHJ1Y3QgZG9hbGxfbWQKKwl7CisJdm9pZCAqYXJnOworCXZvaWQgKCpmbikoY29uc3QgRVZQX01EICpjaXBoLAorCQkJY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8sIHZvaWQgKmFyZyk7CisJfTsKKworc3RhdGljIHZvaWQgZG9fYWxsX21kX2ZuKGNvbnN0IE9CSl9OQU1FICpubSwgdm9pZCAqYXJnKQorCXsKKwlzdHJ1Y3QgZG9hbGxfbWQgKmRjID0gYXJnOworCWlmIChubS0+YWxpYXMpCisJCWRjLT5mbihOVUxMLCBubS0+bmFtZSwgbm0tPmRhdGEsIGRjLT5hcmcpOworCWVsc2UKKwkJZGMtPmZuKChjb25zdCBFVlBfTUQgKilubS0+ZGF0YSwgbm0tPm5hbWUsIE5VTEwsIGRjLT5hcmcpOworCX0KKwordm9pZCBFVlBfTURfZG9fYWxsKHZvaWQgKCpmbikoY29uc3QgRVZQX01EICptZCwKKwkJY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8sIHZvaWQgKngpLCB2b2lkICphcmcpCisJeworCXN0cnVjdCBkb2FsbF9tZCBkYzsKKwlkYy5mbiA9IGZuOworCWRjLmFyZyA9IGFyZzsKKwlPQkpfTkFNRV9kb19hbGwoT0JKX05BTUVfVFlQRV9NRF9NRVRILCBkb19hbGxfbWRfZm4sICZkYyk7CisJfQorCit2b2lkIEVWUF9NRF9kb19hbGxfc29ydGVkKHZvaWQgKCpmbikoY29uc3QgRVZQX01EICptZCwKKwkJY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8sIHZvaWQgKngpLCB2b2lkICphcmcpCisJeworCXN0cnVjdCBkb2FsbF9tZCBkYzsKKwlkYy5mbiA9IGZuOworCWRjLmFyZyA9IGFyZzsKKwlPQkpfTkFNRV9kb19hbGxfc29ydGVkKE9CSl9OQU1FX1RZUEVfTURfTUVUSCwgZG9fYWxsX21kX2ZuLCAmZGMpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvb3BlbmJzZF9ody5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9vcGVuYnNkX2h3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzMWE1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvb3BlbmJzZF9ody5jCkBAIC0wLDAgKzEsNDQ2IEBACisvKiBXcml0dGVuIGJ5IEJlbiBMYXVyaWUsIDIwMDEgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgImV2cF9sb2NsLmgiCisKKy8qIFRoaXMgc3R1ZmYgc2hvdWxkIG5vdyBhbGwgYmUgc3VwcG9ydGVkIHRocm91Z2gKKyAqIGNyeXB0by9lbmdpbmUvaHdfb3BlbmJzZF9kZXZfY3J5cHRvLmMgdW5sZXNzIEkgYm90Y2hlZCBpdCB1cCAqLworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKworI2lmIDAKKworLyogY2hlY2sgZmxhZyBhZnRlciBPcGVuU1NMIGhlYWRlcnMgdG8gZW5zdXJlIG1ha2UgZGVwZW5kIHdvcmtzICovCisjaWZkZWYgT1BFTlNTTF9PUEVOQlNEX0RFVl9DUllQVE8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGNyeXB0by9jcnlwdG9kZXYuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLyogbG9uZ2VzdCBrZXkgc3VwcG9ydGVkIGluIGhhcmR3YXJlICovCisjZGVmaW5lIE1BWF9IV19LRVkJMjQKKyNkZWZpbmUgTUFYX0hXX0lWCTgKKworI2RlZmluZSBNRDVfRElHRVNUX0xFTkdUSAkxNgorI2RlZmluZSBNRDVfQ0JMT0NLCQk2NAorCitzdGF0aWMgaW50IGZkOworc3RhdGljIGludCBkZXZfZmFpbGVkOworCit0eXBlZGVmIHN0cnVjdCBzZXNzaW9uX29wIHNlc3Npb25fb3A7CisKKyNkZWZpbmUgQ0RBVEEoY3R4KSBFVlBfQ19EQVRBKHNlc3Npb25fb3AsY3R4KQorCitzdGF0aWMgdm9pZCBlcnIoY29uc3QgY2hhciAqc3RyKQorICAgIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiJXM6IGVycm5vICVkXG4iLHN0cixlcnJubyk7CisgICAgfQorCitzdGF0aWMgaW50IGRldl9jcnlwdG9faW5pdChzZXNzaW9uX29wICpzZXMpCisgICAgeworICAgIGlmKGRldl9mYWlsZWQpCisJcmV0dXJuIDA7CisgICAgaWYoIWZkKQorCXsKKwlpbnQgY3J5cHRvZGV2X2ZkOworCisgICAgICAgIGlmICgoY3J5cHRvZGV2X2ZkPW9wZW4oIi9kZXYvY3J5cHRvIixPX1JEV1IsMCkpIDwgMCkKKwkgICAgeworCSAgICBlcnIoIi9kZXYvY3J5cHRvIik7CisJICAgIGRldl9mYWlsZWQ9MTsKKwkgICAgcmV0dXJuIDA7CisJICAgIH0KKyAgICAgICAgaWYgKGlvY3RsKGNyeXB0b2Rldl9mZCxDUklPR0VULCZmZCkgPT0gLTEpCisJICAgIHsKKwkgICAgZXJyKCJDUklPR0VUIGZhaWxlZCIpOworCSAgICBjbG9zZShjcnlwdG9kZXZfZmQpOworCSAgICBkZXZfZmFpbGVkPTE7CisJICAgIHJldHVybiAwOworCSAgICB9CisJY2xvc2UoY3J5cHRvZGV2X2ZkKTsKKwl9CisgICAgYXNzZXJ0KHNlcyk7CisgICAgbWVtc2V0KHNlcywnXDAnLHNpemVvZiAqc2VzKTsKKworICAgIHJldHVybiAxOworICAgIH0KKworc3RhdGljIGludCBkZXZfY3J5cHRvX2NsZWFudXAoRVZQX0NJUEhFUl9DVFggKmN0eCkKKyAgICB7CisgICAgaWYoaW9jdGwoZmQsQ0lPQ0ZTRVNTSU9OLCZDREFUQShjdHgpLT5zZXMpID09IC0xKQorCWVycigiQ0lPQ0ZTRVNTSU9OIGZhaWxlZCIpOworCisgICAgT1BFTlNTTF9mcmVlKENEQVRBKGN0eCktPmtleSk7CisKKyAgICByZXR1cm4gMTsKKyAgICB9CisKK3N0YXRpYyBpbnQgZGV2X2NyeXB0b19pbml0X2tleShFVlBfQ0lQSEVSX0NUWCAqY3R4LGludCBjaXBoZXIsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LGludCBrbGVuKQorICAgIHsKKyAgICBpZighZGV2X2NyeXB0b19pbml0KENEQVRBKGN0eCkpKQorCXJldHVybiAwOworCisgICAgQ0RBVEEoY3R4KS0+a2V5PU9QRU5TU0xfbWFsbG9jKE1BWF9IV19LRVkpOworCisgICAgYXNzZXJ0KGN0eC0+Y2lwaGVyLT5pdl9sZW4gPD0gTUFYX0hXX0lWKTsKKworICAgIG1lbWNweShDREFUQShjdHgpLT5rZXksa2V5LGtsZW4pOworICAgIAorICAgIENEQVRBKGN0eCktPmNpcGhlcj1jaXBoZXI7CisgICAgQ0RBVEEoY3R4KS0+a2V5bGVuPWtsZW47CisKKyAgICBpZiAoaW9jdGwoZmQsQ0lPQ0dTRVNTSU9OLENEQVRBKGN0eCkpID09IC0xKQorCXsKKwllcnIoIkNJT0NHU0VTU0lPTiBmYWlsZWQiKTsKKwlyZXR1cm4gMDsKKwl9CisgICAgcmV0dXJuIDE7CisgICAgfQorCitzdGF0aWMgaW50IGRldl9jcnlwdG9fY2lwaGVyKEVWUF9DSVBIRVJfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBpbnQgaW5sKQorICAgIHsKKyAgICBzdHJ1Y3QgY3J5cHRfb3AgY3J5cDsKKyAgICB1bnNpZ25lZCBjaGFyIGxiW01BWF9IV19JVl07CisKKyAgICBpZighaW5sKQorCXJldHVybiAxOworCisgICAgYXNzZXJ0KENEQVRBKGN0eCkpOworICAgIGFzc2VydCghZGV2X2ZhaWxlZCk7CisKKyAgICBtZW1zZXQoJmNyeXAsJ1wwJyxzaXplb2YgY3J5cCk7CisgICAgY3J5cC5zZXM9Q0RBVEEoY3R4KS0+c2VzOworICAgIGNyeXAub3A9Y3R4LT5lbmNyeXB0ID8gQ09QX0VOQ1JZUFQgOiBDT1BfREVDUllQVDsKKyAgICBjcnlwLmZsYWdzPTA7CisgICAgY3J5cC5sZW49aW5sOworICAgIGFzc2VydCgoaW5sJihjdHgtPmNpcGhlci0+YmxvY2tfc2l6ZS0xKSkgPT0gMCk7CisgICAgY3J5cC5zcmM9KGNhZGRyX3QpaW47CisgICAgY3J5cC5kc3Q9KGNhZGRyX3Qpb3V0OworICAgIGNyeXAubWFjPTA7CisgICAgaWYoY3R4LT5jaXBoZXItPml2X2xlbikKKwljcnlwLml2PShjYWRkcl90KWN0eC0+aXY7CisKKyAgICBpZighY3R4LT5lbmNyeXB0KQorCW1lbWNweShsYiwmaW5bY3J5cC5sZW4tY3R4LT5jaXBoZXItPml2X2xlbl0sY3R4LT5jaXBoZXItPml2X2xlbik7CisKKyAgICBpZihpb2N0bChmZCwgQ0lPQ0NSWVBULCAmY3J5cCkgPT0gLTEpCisJeworCWlmKGVycm5vID09IEVJTlZBTCkgLyogYnVmZmVycyBhcmUgbWlzYWxpZ25lZCAqLworCSAgICB7CisJICAgIHVuc2lnbmVkIGludCBjaW5sPTA7CisJICAgIGNoYXIgKmNpbj1OVUxMOworCSAgICBjaGFyICpjb3V0PU5VTEw7CisKKwkgICAgLyogTkI6IHRoaXMgY2FuIG9ubHkgbWFrZSBjaW5sICE9IGlubCB3aXRoIHN0cmVhbSBjaXBoZXJzICovCisJICAgIGNpbmw9KGlubCszKS80KjQ7CisKKwkgICAgaWYoKCh1bnNpZ25lZCBsb25nKWluJjMpIHx8IGNpbmwgIT0gaW5sKQorCQl7CisJCWNpbj1PUEVOU1NMX21hbGxvYyhjaW5sKTsKKwkJbWVtY3B5KGNpbixpbixpbmwpOworCQljcnlwLnNyYz1jaW47CisJCX0KKworCSAgICBpZigoKHVuc2lnbmVkIGxvbmcpb3V0JjMpIHx8IGNpbmwgIT0gaW5sKQorCQl7CisJCWNvdXQ9T1BFTlNTTF9tYWxsb2MoY2lubCk7CisJCWNyeXAuZHN0PWNvdXQ7CisJCX0KKworCSAgICBjcnlwLmxlbj1jaW5sOworCisJICAgIGlmKGlvY3RsKGZkLCBDSU9DQ1JZUFQsICZjcnlwKSA9PSAtMSkKKwkJeworCQllcnIoIkNJT0NDUllQVCgyKSBmYWlsZWQiKTsKKwkJcHJpbnRmKCJzcmM9JXAgZHN0PSVwXG4iLGNyeXAuc3JjLGNyeXAuZHN0KTsKKwkJYWJvcnQoKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkJCisJICAgIGlmKGNvdXQpCisJCXsKKwkJbWVtY3B5KG91dCxjb3V0LGlubCk7CisJCU9QRU5TU0xfZnJlZShjb3V0KTsKKwkJfQorCSAgICBpZihjaW4pCisJCU9QRU5TU0xfZnJlZShjaW4pOworCSAgICB9CisJZWxzZSAKKwkgICAgewkgICAgCisJICAgIGVycigiQ0lPQ0NSWVBUIGZhaWxlZCIpOworCSAgICBhYm9ydCgpOworCSAgICByZXR1cm4gMDsKKwkgICAgfQorCX0KKworICAgIGlmKGN0eC0+ZW5jcnlwdCkKKwltZW1jcHkoY3R4LT5pdiwmb3V0W2NyeXAubGVuLWN0eC0+Y2lwaGVyLT5pdl9sZW5dLGN0eC0+Y2lwaGVyLT5pdl9sZW4pOworICAgIGVsc2UKKwltZW1jcHkoY3R4LT5pdixsYixjdHgtPmNpcGhlci0+aXZfbGVuKTsKKworICAgIHJldHVybiAxOworICAgIH0KKworc3RhdGljIGludCBkZXZfY3J5cHRvX2Rlc19lZGUzX2luaXRfa2V5KEVWUF9DSVBIRVJfQ1RYICpjdHgsCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpCisgICAgeyByZXR1cm4gZGV2X2NyeXB0b19pbml0X2tleShjdHgsQ1JZUFRPXzNERVNfQ0JDLGtleSwyNCk7IH0KKworI2RlZmluZSBkZXZfY3J5cHRvX2Rlc19lZGUzX2NiY19jaXBoZXIgZGV2X2NyeXB0b19jaXBoZXIKKworQkxPQ0tfQ0lQSEVSX2RlZl9jYmMoZGV2X2NyeXB0b19kZXNfZWRlMywgc2Vzc2lvbl9vcCwgTklEX2Rlc19lZGUzLCA4LCAyNCwgOCwKKwkJICAgICAwLCBkZXZfY3J5cHRvX2Rlc19lZGUzX2luaXRfa2V5LAorCQkgICAgIGRldl9jcnlwdG9fY2xlYW51cCwgCisJCSAgICAgRVZQX0NJUEhFUl9zZXRfYXNuMV9pdiwKKwkJICAgICBFVlBfQ0lQSEVSX2dldF9hc24xX2l2LAorCQkgICAgIE5VTEwpCisKK3N0YXRpYyBpbnQgZGV2X2NyeXB0b19yYzRfaW5pdF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYykKKyAgICB7IHJldHVybiBkZXZfY3J5cHRvX2luaXRfa2V5KGN0eCxDUllQVE9fQVJDNCxrZXksMTYpOyB9CisKK3N0YXRpYyBjb25zdCBFVlBfQ0lQSEVSIHI0X2NpcGhlcj0KKyAgICB7CisgICAgTklEX3JjNCwKKyAgICAxLDE2LDAsCS8qIEZJWE1FOiBrZXkgc2hvdWxkIGJlIHVwIHRvIDI1NiBieXRlcyAqLworICAgIEVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSCwKKyAgICBkZXZfY3J5cHRvX3JjNF9pbml0X2tleSwKKyAgICBkZXZfY3J5cHRvX2NpcGhlciwKKyAgICBkZXZfY3J5cHRvX2NsZWFudXAsCisgICAgc2l6ZW9mKHNlc3Npb25fb3ApLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMCisgICAgfTsKKworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rldl9jcnlwdG9fcmM0KHZvaWQpCisgICAgeyByZXR1cm4gJnI0X2NpcGhlcjsgfQorCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBzZXNzaW9uX29wIHNlc3M7CisgICAgY2hhciAqZGF0YTsKKyAgICBpbnQgbGVuOworICAgIHVuc2lnbmVkIGNoYXIgbWRbRVZQX01BWF9NRF9TSVpFXTsKKyAgICB9IE1EX0RBVEE7CisKK3N0YXRpYyBpbnQgZGV2X2NyeXB0b19pbml0X2RpZ2VzdChNRF9EQVRBICptZF9kYXRhLGludCBtYWMpCisgICAgeworICAgIGlmKCFkZXZfY3J5cHRvX2luaXQoJm1kX2RhdGEtPnNlc3MpKQorCXJldHVybiAwOworCisgICAgbWRfZGF0YS0+bGVuPTA7CisgICAgbWRfZGF0YS0+ZGF0YT1OVUxMOworCisgICAgbWRfZGF0YS0+c2Vzcy5tYWM9bWFjOworCisgICAgaWYgKGlvY3RsKGZkLENJT0NHU0VTU0lPTiwmbWRfZGF0YS0+c2VzcykgPT0gLTEpCisJeworCWVycigiQ0lPQ0dTRVNTSU9OIGZhaWxlZCIpOworCXJldHVybiAwOworCX0KKyAgICByZXR1cm4gMTsKKyAgICB9CisKK3N0YXRpYyBpbnQgZGV2X2NyeXB0b19jbGVhbnVwX2RpZ2VzdChNRF9EQVRBICptZF9kYXRhKQorICAgIHsKKyAgICBpZiAoaW9jdGwoZmQsQ0lPQ0ZTRVNTSU9OLCZtZF9kYXRhLT5zZXNzLnNlcykgPT0gLTEpCisJeworCWVycigiQ0lPQ0ZTRVNTSU9OIGZhaWxlZCIpOworCXJldHVybiAwOworCX0KKworICAgIHJldHVybiAxOworICAgIH0KKworLyogRklYTUU6IGlmIGRldmljZSBjYW4gZG8gY2hhaW5lZCBNQUNzLCB0aGVuIGRvbid0IGFjY3VtdWxhdGUgKi8KKy8qIEZJWE1FOiBtb3ZlIGFjY3VtdWxhdGlvbiB0byB0aGUgZnJhbWV3b3JrICovCitzdGF0aWMgaW50IGRldl9jcnlwdG9fbWQ1X2luaXQoRVZQX01EX0NUWCAqY3R4KQorICAgIHsgcmV0dXJuIGRldl9jcnlwdG9faW5pdF9kaWdlc3QoY3R4LT5tZF9kYXRhLENSWVBUT19NRDUpOyB9CisKK3N0YXRpYyBpbnQgZG9fZGlnZXN0KGludCBzZXMsdW5zaWduZWQgY2hhciAqbWQsY29uc3Qgdm9pZCAqZGF0YSxpbnQgbGVuKQorICAgIHsKKyAgICBzdHJ1Y3QgY3J5cHRfb3AgY3J5cDsKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBtZDV6ZXJvWzE2XT0KKwl7CisJMHhkNCwweDFkLDB4OGMsMHhkOSwweDhmLDB4MDAsMHhiMiwweDA0LAorCTB4ZTksMHg4MCwweDA5LDB4OTgsMHhlYywweGY4LDB4NDIsMHg3ZQorCX07CisKKyAgICAvKiBzb21lIGNhcmRzIGNhbid0IGRvIHplcm8gbGVuZ3RoICovCisgICAgaWYoIWxlbikKKwl7CisJbWVtY3B5KG1kLG1kNXplcm8sMTYpOworCXJldHVybiAxOworCX0KKworICAgIG1lbXNldCgmY3J5cCwnXDAnLHNpemVvZiBjcnlwKTsKKyAgICBjcnlwLnNlcz1zZXM7CisgICAgY3J5cC5vcD1DT1BfRU5DUllQVDsvKiByZXF1aXJlZCB0byBkbyB0aGUgTUFDIHJhdGhlciB0aGFuIGNoZWNrIGl0ICovCisgICAgY3J5cC5sZW49bGVuOworICAgIGNyeXAuc3JjPShjYWRkcl90KWRhdGE7CisgICAgY3J5cC5kc3Q9KGNhZGRyX3QpZGF0YTsgLy8gRklYTUUhISEKKyAgICBjcnlwLm1hYz0oY2FkZHJfdCltZDsKKworICAgIGlmKGlvY3RsKGZkLCBDSU9DQ1JZUFQsICZjcnlwKSA9PSAtMSkKKwl7CisJaWYoZXJybm8gPT0gRUlOVkFMKSAvKiBidWZmZXIgaXMgbWlzYWxpZ25lZCAqLworCSAgICB7CisJICAgIGNoYXIgKmRjb3B5OworCisJICAgIGRjb3B5PU9QRU5TU0xfbWFsbG9jKGxlbik7CisJICAgIG1lbWNweShkY29weSxkYXRhLGxlbik7CisJICAgIGNyeXAuc3JjPWRjb3B5OworCSAgICBjcnlwLmRzdD1jcnlwLnNyYzsgLy8gRklYTUUhISEKKworCSAgICBpZihpb2N0bChmZCwgQ0lPQ0NSWVBULCAmY3J5cCkgPT0gLTEpCisJCXsKKwkJZXJyKCJDSU9DQ1JZUFQoTUFDMikgZmFpbGVkIik7CisJCWFib3J0KCk7CisJCXJldHVybiAwOworCQl9CisJICAgIE9QRU5TU0xfZnJlZShkY29weSk7CisJICAgIH0KKwllbHNlCisJICAgIHsKKwkgICAgZXJyKCJDSU9DQ1JZUFQoTUFDKSBmYWlsZWQiKTsKKwkgICAgYWJvcnQoKTsKKwkgICAgcmV0dXJuIDA7CisJICAgIH0KKwl9CisgICAgLy8gICAgcHJpbnRmKCJkb25lXG4iKTsKKworICAgIHJldHVybiAxOworICAgIH0KKworc3RhdGljIGludCBkZXZfY3J5cHRvX21kNV91cGRhdGUoRVZQX01EX0NUWCAqY3R4LGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJIHVuc2lnbmVkIGxvbmcgbGVuKQorICAgIHsKKyAgICBNRF9EQVRBICptZF9kYXRhPWN0eC0+bWRfZGF0YTsKKworICAgIGlmKGN0eC0+ZmxhZ3MmRVZQX01EX0NUWF9GTEFHX09ORVNIT1QpCisJcmV0dXJuIGRvX2RpZ2VzdChtZF9kYXRhLT5zZXNzLnNlcyxtZF9kYXRhLT5tZCxkYXRhLGxlbik7CisKKyAgICBtZF9kYXRhLT5kYXRhPU9QRU5TU0xfcmVhbGxvYyhtZF9kYXRhLT5kYXRhLG1kX2RhdGEtPmxlbitsZW4pOworICAgIG1lbWNweShtZF9kYXRhLT5kYXRhK21kX2RhdGEtPmxlbixkYXRhLGxlbik7CisgICAgbWRfZGF0YS0+bGVuKz1sZW47CisKKyAgICByZXR1cm4gMTsKKyAgICB9CQorCitzdGF0aWMgaW50IGRldl9jcnlwdG9fbWQ1X2ZpbmFsKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCkKKyAgICB7CisgICAgaW50IHJldDsKKyAgICBNRF9EQVRBICptZF9kYXRhPWN0eC0+bWRfZGF0YTsKKworICAgIGlmKGN0eC0+ZmxhZ3MmRVZQX01EX0NUWF9GTEFHX09ORVNIT1QpCisJeworCW1lbWNweShtZCxtZF9kYXRhLT5tZCxNRDVfRElHRVNUX0xFTkdUSCk7CisJcmV0PTE7CisJfQorICAgIGVsc2UKKwl7CisJcmV0PWRvX2RpZ2VzdChtZF9kYXRhLT5zZXNzLnNlcyxtZCxtZF9kYXRhLT5kYXRhLG1kX2RhdGEtPmxlbik7CisJT1BFTlNTTF9mcmVlKG1kX2RhdGEtPmRhdGEpOworCW1kX2RhdGEtPmRhdGE9TlVMTDsKKwltZF9kYXRhLT5sZW49MDsKKwl9CisKKyAgICByZXR1cm4gcmV0OworICAgIH0KKworc3RhdGljIGludCBkZXZfY3J5cHRvX21kNV9jb3B5KEVWUF9NRF9DVFggKnRvLGNvbnN0IEVWUF9NRF9DVFggKmZyb20pCisgICAgeworICAgIGNvbnN0IE1EX0RBVEEgKmZyb21fbWQ9ZnJvbS0+bWRfZGF0YTsKKyAgICBNRF9EQVRBICp0b19tZD10by0+bWRfZGF0YTsKKworICAgIC8vIEhvdyBkbyB3ZSBjb3B5IHNlc3Npb25zPworICAgIGFzc2VydChmcm9tLT5kaWdlc3QtPmZsYWdzJkVWUF9NRF9GTEFHX09ORVNIT1QpOworCisgICAgdG9fbWQtPmRhdGE9T1BFTlNTTF9tYWxsb2MoZnJvbV9tZC0+bGVuKTsKKyAgICBtZW1jcHkodG9fbWQtPmRhdGEsZnJvbV9tZC0+ZGF0YSxmcm9tX21kLT5sZW4pOworCisgICAgcmV0dXJuIDE7CisgICAgfQorCitzdGF0aWMgaW50IGRldl9jcnlwdG9fbWQ1X2NsZWFudXAoRVZQX01EX0NUWCAqY3R4KQorICAgIHsKKyAgICByZXR1cm4gZGV2X2NyeXB0b19jbGVhbnVwX2RpZ2VzdChjdHgtPm1kX2RhdGEpOworICAgIH0KKworc3RhdGljIGNvbnN0IEVWUF9NRCBtZDVfbWQ9CisgICAgeworICAgIE5JRF9tZDUsCisgICAgTklEX21kNVdpdGhSU0FFbmNyeXB0aW9uLAorICAgIE1ENV9ESUdFU1RfTEVOR1RILAorICAgIEVWUF9NRF9GTEFHX09ORVNIT1QsCS8vIFhYWDogc2V0IGFjY29yZGluZyB0byBkZXZpY2UgaW5mby4uLgorICAgIGRldl9jcnlwdG9fbWQ1X2luaXQsCisgICAgZGV2X2NyeXB0b19tZDVfdXBkYXRlLAorICAgIGRldl9jcnlwdG9fbWQ1X2ZpbmFsLAorICAgIGRldl9jcnlwdG9fbWQ1X2NvcHksCisgICAgZGV2X2NyeXB0b19tZDVfY2xlYW51cCwKKyAgICBFVlBfUEtFWV9SU0FfbWV0aG9kLAorICAgIE1ENV9DQkxPQ0ssCisgICAgc2l6ZW9mKE1EX0RBVEEpLAorICAgIH07CisKK2NvbnN0IEVWUF9NRCAqRVZQX2Rldl9jcnlwdG9fbWQ1KHZvaWQpCisgICAgeyByZXR1cm4gJm1kNV9tZDsgfQorCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wNV9jcnB0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3A1X2NycHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNmYThkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wNV9jcnB0LmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIHA1X2NycHQuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisvKiBEb2Vzbid0IGRvIGFueXRoaW5nIG5vdzogQnVpbHRpbiBQQkUgYWxnb3JpdGhtcyBpbiBzdGF0aWMgdGFibGUuCisgKi8KKwordm9pZCBQS0NTNV9QQkVfYWRkKHZvaWQpCit7Cit9CisKK2ludCBQS0NTNV9QQkVfa2V5aXZnZW4oRVZQX0NJUEhFUl9DVFggKmNjdHgsIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCQkJIEFTTjFfVFlQRSAqcGFyYW0sIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgY29uc3QgRVZQX01EICptZCwKKwkJCSBpbnQgZW5fZGUpCit7CisJRVZQX01EX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBtZF90bXBbRVZQX01BWF9NRF9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGtleVtFVlBfTUFYX0tFWV9MRU5HVEhdLCBpdltFVlBfTUFYX0lWX0xFTkdUSF07CisJaW50IGk7CisJUEJFUEFSQU0gKnBiZTsKKwlpbnQgc2FsdGxlbiwgaXRlcjsKKwl1bnNpZ25lZCBjaGFyICpzYWx0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBidWY7CisJaW50IG1kc2l6ZTsKKworCS8qIEV4dHJhY3QgdXNlZnVsIGluZm8gZnJvbSBwYXJhbWV0ZXIgKi8KKwlpZiAocGFyYW0gPT0gTlVMTCB8fCBwYXJhbS0+dHlwZSAhPSBWX0FTTjFfU0VRVUVOQ0UgfHwKKwkgICAgcGFyYW0tPnZhbHVlLnNlcXVlbmNlID09IE5VTEwpIHsKKwkJRVZQZXJyKEVWUF9GX1BLQ1M1X1BCRV9LRVlJVkdFTixFVlBfUl9ERUNPREVfRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYnVmID0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5kYXRhOworCWlmICghKHBiZSA9IGQyaV9QQkVQQVJBTShOVUxMLCAmcGJ1ZiwgcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGgpKSkgeworCQlFVlBlcnIoRVZQX0ZfUEtDUzVfUEJFX0tFWUlWR0VOLEVWUF9SX0RFQ09ERV9FUlJPUik7CisJCXJldHVybiAwOworCX0KKworCWlmICghcGJlLT5pdGVyKSBpdGVyID0gMTsKKwllbHNlIGl0ZXIgPSBBU04xX0lOVEVHRVJfZ2V0IChwYmUtPml0ZXIpOworCXNhbHQgPSBwYmUtPnNhbHQtPmRhdGE7CisJc2FsdGxlbiA9IHBiZS0+c2FsdC0+bGVuZ3RoOworCisJaWYoIXBhc3MpIHBhc3NsZW4gPSAwOworCWVsc2UgaWYocGFzc2xlbiA9PSAtMSkgcGFzc2xlbiA9IHN0cmxlbihwYXNzKTsKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKwlFVlBfRGlnZXN0SW5pdF9leCgmY3R4LCBtZCwgTlVMTCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBwYXNzLCBwYXNzbGVuKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIHNhbHQsIHNhbHRsZW4pOworCVBCRVBBUkFNX2ZyZWUocGJlKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgoJmN0eCwgbWRfdG1wLCBOVUxMKTsKKwltZHNpemUgPSBFVlBfTURfc2l6ZShtZCk7CisJaWYgKG1kc2l6ZSA8IDApCisJICAgIHJldHVybiAwOworCWZvciAoaSA9IDE7IGkgPCBpdGVyOyBpKyspIHsKKwkJRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgbWQsIE5VTEwpOworCQlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIG1kX3RtcCwgbWRzaXplKTsKKwkJRVZQX0RpZ2VzdEZpbmFsX2V4ICgmY3R4LCBtZF90bXAsIE5VTEwpOworCX0KKwlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisJT1BFTlNTTF9hc3NlcnQoRVZQX0NJUEhFUl9rZXlfbGVuZ3RoKGNpcGhlcikgPD0gKGludClzaXplb2YobWRfdG1wKSk7CisJbWVtY3B5KGtleSwgbWRfdG1wLCBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoY2lwaGVyKSk7CisJT1BFTlNTTF9hc3NlcnQoRVZQX0NJUEhFUl9pdl9sZW5ndGgoY2lwaGVyKSA8PSAxNik7CisJbWVtY3B5KGl2LCBtZF90bXAgKyAoMTYgLSBFVlBfQ0lQSEVSX2l2X2xlbmd0aChjaXBoZXIpKSwKKwkJCQkJCSBFVlBfQ0lQSEVSX2l2X2xlbmd0aChjaXBoZXIpKTsKKwlFVlBfQ2lwaGVySW5pdF9leChjY3R4LCBjaXBoZXIsIE5VTEwsIGtleSwgaXYsIGVuX2RlKTsKKwlPUEVOU1NMX2NsZWFuc2UobWRfdG1wLCBFVlBfTUFYX01EX1NJWkUpOworCU9QRU5TU0xfY2xlYW5zZShrZXksIEVWUF9NQVhfS0VZX0xFTkdUSCk7CisJT1BFTlNTTF9jbGVhbnNlKGl2LCBFVlBfTUFYX0lWX0xFTkdUSCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3A1X2NycHQyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3A1X2NycHQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0Mzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcDVfY3JwdDIuYwpAQCAtMCwwICsxLDI5OSBAQAorLyogcDVfY3JwdDIuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0hNQUMpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0hBKQorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisKKy8qIHNldCB0aGlzIHRvIHByaW50IG91dCBpbmZvIGFib3V0IHRoZSBrZXlnZW4gYWxnb3JpdGhtICovCisvKiAjZGVmaW5lIERFQlVHX1BLQ1M1VjIgKi8KKworI2lmZGVmIERFQlVHX1BLQ1M1VjIKKwlzdGF0aWMgdm9pZCBoX19kdW1wIChjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKTsKKyNlbmRpZgorCisvKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFBLQ1MjNSB2Mi4wIHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24ga2V5CisgKiBkZXJpdmF0aW9uIGZ1bmN0aW9uIFBCS0RGMi4KKyAqIFNIQTEgdmVyc2lvbiB2ZXJpZmllZCBhZ2FpbnN0IHRlc3QgdmVjdG9ycyBwb3N0ZWQgYnkgUGV0ZXIgR3V0bWFubgorICogPHBndXQwMDFAY3MuYXVja2xhbmQuYWMubno+IHRvIHRoZSBQS0NTLVRORyA8cGtjcy10bmdAcnNhLmNvbT4gbWFpbGluZyBsaXN0LgorICovCisKK2ludCBQS0NTNV9QQktERjJfSE1BQyhjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLCBpbnQgaXRlciwKKwkJCSAgIGNvbnN0IEVWUF9NRCAqZGlnZXN0LAorCQkJICAgaW50IGtleWxlbiwgdW5zaWduZWQgY2hhciAqb3V0KQorCXsKKwl1bnNpZ25lZCBjaGFyIGRpZ3RtcFtFVlBfTUFYX01EX1NJWkVdLCAqcCwgaXRtcFs0XTsKKwlpbnQgY3BsZW4sIGosIGssIHRrZXlsZW4sIG1kbGVuOworCXVuc2lnbmVkIGxvbmcgaSA9IDE7CisJSE1BQ19DVFggaGN0eDsKKworCW1kbGVuID0gRVZQX01EX3NpemUoZGlnZXN0KTsKKwlpZiAobWRsZW4gPCAwKQorCQlyZXR1cm4gMDsKKworCUhNQUNfQ1RYX2luaXQoJmhjdHgpOworCXAgPSBvdXQ7CisJdGtleWxlbiA9IGtleWxlbjsKKwlpZighcGFzcykKKwkJcGFzc2xlbiA9IDA7CisJZWxzZSBpZihwYXNzbGVuID09IC0xKQorCQlwYXNzbGVuID0gc3RybGVuKHBhc3MpOworCXdoaWxlKHRrZXlsZW4pCisJCXsKKwkJaWYodGtleWxlbiA+IG1kbGVuKQorCQkJY3BsZW4gPSBtZGxlbjsKKwkJZWxzZQorCQkJY3BsZW4gPSB0a2V5bGVuOworCQkvKiBXZSBhcmUgdW5saWtlbHkgdG8gZXZlciB1c2UgbW9yZSB0aGFuIDI1NiBibG9ja3MgKDUxMjAgYml0cyEpCisJCSAqIGJ1dCBqdXN0IGluIGNhc2UuLi4KKwkJICovCisJCWl0bXBbMF0gPSAodW5zaWduZWQgY2hhcikoKGkgPj4gMjQpICYgMHhmZik7CisJCWl0bXBbMV0gPSAodW5zaWduZWQgY2hhcikoKGkgPj4gMTYpICYgMHhmZik7CisJCWl0bXBbMl0gPSAodW5zaWduZWQgY2hhcikoKGkgPj4gOCkgJiAweGZmKTsKKwkJaXRtcFszXSA9ICh1bnNpZ25lZCBjaGFyKShpICYgMHhmZik7CisJCUhNQUNfSW5pdF9leCgmaGN0eCwgcGFzcywgcGFzc2xlbiwgZGlnZXN0LCBOVUxMKTsKKwkJSE1BQ19VcGRhdGUoJmhjdHgsIHNhbHQsIHNhbHRsZW4pOworCQlITUFDX1VwZGF0ZSgmaGN0eCwgaXRtcCwgNCk7CisJCUhNQUNfRmluYWwoJmhjdHgsIGRpZ3RtcCwgTlVMTCk7CisJCW1lbWNweShwLCBkaWd0bXAsIGNwbGVuKTsKKwkJZm9yKGogPSAxOyBqIDwgaXRlcjsgaisrKQorCQkJeworCQkJSE1BQyhkaWdlc3QsIHBhc3MsIHBhc3NsZW4sCisJCQkJIGRpZ3RtcCwgbWRsZW4sIGRpZ3RtcCwgTlVMTCk7CisJCQlmb3IoayA9IDA7IGsgPCBjcGxlbjsgaysrKQorCQkJCXBba10gXj0gZGlndG1wW2tdOworCQkJfQorCQl0a2V5bGVuLT0gY3BsZW47CisJCWkrKzsKKwkJcCs9IGNwbGVuOworCQl9CisJSE1BQ19DVFhfY2xlYW51cCgmaGN0eCk7CisjaWZkZWYgREVCVUdfUEtDUzVWMgorCWZwcmludGYoc3RkZXJyLCAiUGFzc3dvcmQ6XG4iKTsKKwloX19kdW1wIChwYXNzLCBwYXNzbGVuKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlNhbHQ6XG4iKTsKKwloX19kdW1wIChzYWx0LCBzYWx0bGVuKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkl0ZXJhdGlvbiBjb3VudCAlZFxuIiwgaXRlcik7CisJZnByaW50ZihzdGRlcnIsICJLZXk6XG4iKTsKKwloX19kdW1wIChvdXQsIGtleWxlbik7CisjZW5kaWYKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBQS0NTNV9QQktERjJfSE1BQ19TSEExKGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpdGVyLAorCQkJICAgaW50IGtleWxlbiwgdW5zaWduZWQgY2hhciAqb3V0KQorCXsKKwlyZXR1cm4gUEtDUzVfUEJLREYyX0hNQUMocGFzcywgcGFzc2xlbiwgc2FsdCwgc2FsdGxlbiwgaXRlciwgRVZQX3NoYTEoKSwKKwkJCQkJa2V5bGVuLCBvdXQpOworCX0KKworI2lmZGVmIERPX1RFU1QKK21haW4oKQoreworCXVuc2lnbmVkIGNoYXIgb3V0WzRdOworCXVuc2lnbmVkIGNoYXIgc2FsdFtdID0gezB4MTIsIDB4MzQsIDB4NTYsIDB4Nzh9OworCVBLQ1M1X1BCS0RGMl9ITUFDX1NIQTEoInBhc3N3b3JkIiwgLTEsIHNhbHQsIDQsIDUsIDQsIG91dCk7CisJZnByaW50ZihzdGRlcnIsICJPdXQgJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQkJIG91dFswXSwgb3V0WzFdLCBvdXRbMl0sIG91dFszXSk7Cit9CisKKyNlbmRpZgorCisvKiBOb3cgdGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGl0c2VsZi4gVGhpcyBpcyBhIGJpdCBldmlsIGJlY2F1c2UKKyAqIGl0IGhhcyB0byBjaGVjayB0aGUgQVNOMSBwYXJhbWV0ZXJzIGFyZSB2YWxpZDogYW5kIHRoZXJlIGFyZSBxdWl0ZSBhCisgKiBmZXcgb2YgdGhlbS4uLgorICovCisKK2ludCBQS0NTNV92Ml9QQkVfa2V5aXZnZW4oRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQVNOMV9UWVBFICpwYXJhbSwgY29uc3QgRVZQX0NJUEhFUiAqYywgY29uc3QgRVZQX01EICptZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5fZGUpCit7CisJdW5zaWduZWQgY2hhciAqc2FsdCwga2V5W0VWUF9NQVhfS0VZX0xFTkdUSF07CisJY29uc3QgdW5zaWduZWQgY2hhciAqcGJ1ZjsKKwlpbnQgc2FsdGxlbiwgaXRlciwgcGxlbjsKKwl1bnNpZ25lZCBpbnQga2V5bGVuOworCVBCRTJQQVJBTSAqcGJlMiA9IE5VTEw7CisJY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyOworCVBCS0RGMlBBUkFNICprZGYgPSBOVUxMOworCWNvbnN0IEVWUF9NRCAqcHJmbWQ7CisJaW50IHByZl9uaWQsIGhtYWNfbWRfbmlkOworCisJaWYgKHBhcmFtID09IE5VTEwgfHwgcGFyYW0tPnR5cGUgIT0gVl9BU04xX1NFUVVFTkNFIHx8CisJICAgIHBhcmFtLT52YWx1ZS5zZXF1ZW5jZSA9PSBOVUxMKSB7CisJCUVWUGVycihFVlBfRl9QS0NTNV9WMl9QQkVfS0VZSVZHRU4sRVZQX1JfREVDT0RFX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGJ1ZiA9IHBhcmFtLT52YWx1ZS5zZXF1ZW5jZS0+ZGF0YTsKKwlwbGVuID0gcGFyYW0tPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGg7CisJaWYoIShwYmUyID0gZDJpX1BCRTJQQVJBTShOVUxMLCAmcGJ1ZiwgcGxlbikpKSB7CisJCUVWUGVycihFVlBfRl9QS0NTNV9WMl9QQkVfS0VZSVZHRU4sRVZQX1JfREVDT0RFX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2VlIGlmIHdlIHJlY29nbmlzZSB0aGUga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gKi8KKworCWlmKE9CSl9vYmoybmlkKHBiZTItPmtleWZ1bmMtPmFsZ29yaXRobSkgIT0gTklEX2lkX3Bia2RmMikgeworCQlFVlBlcnIoRVZQX0ZfUEtDUzVfVjJfUEJFX0tFWUlWR0VOLAorCQkJCUVWUF9SX1VOU1VQUE9SVEVEX0tFWV9ERVJJVkFUSU9OX0ZVTkNUSU9OKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogbGV0cyBzZWUgaWYgd2UgcmVjb2duaXNlIHRoZSBlbmNyeXB0aW9uIGFsZ29yaXRobS4KKwkgKi8KKworCWNpcGhlciA9IEVWUF9nZXRfY2lwaGVyYnlvYmoocGJlMi0+ZW5jcnlwdGlvbi0+YWxnb3JpdGhtKTsKKworCWlmKCFjaXBoZXIpIHsKKwkJRVZQZXJyKEVWUF9GX1BLQ1M1X1YyX1BCRV9LRVlJVkdFTiwKKwkJCQkJCUVWUF9SX1VOU1VQUE9SVEVEX0NJUEhFUik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIEZpeHVwIGNpcGhlciBiYXNlZCBvbiBBbGdvcml0aG1JZGVudGlmaWVyICovCisJRVZQX0NpcGhlckluaXRfZXgoY3R4LCBjaXBoZXIsIE5VTEwsIE5VTEwsIE5VTEwsIGVuX2RlKTsKKwlpZihFVlBfQ0lQSEVSX2FzbjFfdG9fcGFyYW0oY3R4LCBwYmUyLT5lbmNyeXB0aW9uLT5wYXJhbWV0ZXIpIDwgMCkgeworCQlFVlBlcnIoRVZQX0ZfUEtDUzVfVjJfUEJFX0tFWUlWR0VOLAorCQkJCQlFVlBfUl9DSVBIRVJfUEFSQU1FVEVSX0VSUk9SKTsKKwkJZ290byBlcnI7CisJfQorCWtleWxlbiA9IEVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgoY3R4KTsKKwlPUEVOU1NMX2Fzc2VydChrZXlsZW4gPD0gc2l6ZW9mIGtleSk7CisKKwkvKiBOb3cgZGVjb2RlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uICovCisKKwlpZighcGJlMi0+a2V5ZnVuYy0+cGFyYW1ldGVyIHx8CisJCSAocGJlMi0+a2V5ZnVuYy0+cGFyYW1ldGVyLT50eXBlICE9IFZfQVNOMV9TRVFVRU5DRSkpCisJCXsKKwkJRVZQZXJyKEVWUF9GX1BLQ1M1X1YyX1BCRV9LRVlJVkdFTixFVlBfUl9ERUNPREVfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJcGJ1ZiA9IHBiZTItPmtleWZ1bmMtPnBhcmFtZXRlci0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisJcGxlbiA9IHBiZTItPmtleWZ1bmMtPnBhcmFtZXRlci0+dmFsdWUuc2VxdWVuY2UtPmxlbmd0aDsKKwlpZighKGtkZiA9IGQyaV9QQktERjJQQVJBTShOVUxMLCAmcGJ1ZiwgcGxlbikpICkgeworCQlFVlBlcnIoRVZQX0ZfUEtDUzVfVjJfUEJFX0tFWUlWR0VOLEVWUF9SX0RFQ09ERV9FUlJPUik7CisJCWdvdG8gZXJyOworCX0KKworCVBCRTJQQVJBTV9mcmVlKHBiZTIpOworCXBiZTIgPSBOVUxMOworCisJLyogTm93IGNoZWNrIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBrZGYgKi8KKworCWlmKGtkZi0+a2V5bGVuZ3RoICYmIChBU04xX0lOVEVHRVJfZ2V0KGtkZi0+a2V5bGVuZ3RoKSAhPSAoaW50KWtleWxlbikpeworCQlFVlBlcnIoRVZQX0ZfUEtDUzVfVjJfUEJFX0tFWUlWR0VOLAorCQkJCQkJRVZQX1JfVU5TVVBQT1JURURfS0VZTEVOR1RIKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGtkZi0+cHJmKQorCQlwcmZfbmlkID0gT0JKX29iajJuaWQoa2RmLT5wcmYtPmFsZ29yaXRobSk7CisJZWxzZQorCQlwcmZfbmlkID0gTklEX2htYWNXaXRoU0hBMTsKKworCWlmICghRVZQX1BCRV9maW5kKEVWUF9QQkVfVFlQRV9QUkYsIHByZl9uaWQsIE5VTEwsICZobWFjX21kX25pZCwgMCkpCisJCXsKKwkJRVZQZXJyKEVWUF9GX1BLQ1M1X1YyX1BCRV9LRVlJVkdFTiwgRVZQX1JfVU5TVVBQT1JURURfUFJGKTsKKwkJZ290byBlcnI7CisJCX0KKworCXByZm1kID0gRVZQX2dldF9kaWdlc3RieW5pZChobWFjX21kX25pZCk7CisJaWYgKHByZm1kID09IE5VTEwpCisJCXsKKwkJRVZQZXJyKEVWUF9GX1BLQ1M1X1YyX1BCRV9LRVlJVkdFTiwgRVZQX1JfVU5TVVBQT1JURURfUFJGKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmKGtkZi0+c2FsdC0+dHlwZSAhPSBWX0FTTjFfT0NURVRfU1RSSU5HKSB7CisJCUVWUGVycihFVlBfRl9QS0NTNV9WMl9QQkVfS0VZSVZHRU4sCisJCQkJCQlFVlBfUl9VTlNVUFBPUlRFRF9TQUxUX1RZUEUpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBpdCBzZWVtcyB0aGF0IGl0cyBhbGwgT0sgKi8KKwlzYWx0ID0ga2RmLT5zYWx0LT52YWx1ZS5vY3RldF9zdHJpbmctPmRhdGE7CisJc2FsdGxlbiA9IGtkZi0+c2FsdC0+dmFsdWUub2N0ZXRfc3RyaW5nLT5sZW5ndGg7CisJaXRlciA9IEFTTjFfSU5URUdFUl9nZXQoa2RmLT5pdGVyKTsKKwlpZighUEtDUzVfUEJLREYyX0hNQUMocGFzcywgcGFzc2xlbiwgc2FsdCwgc2FsdGxlbiwgaXRlciwgcHJmbWQsCisJCQkJCQkgICBrZXlsZW4sIGtleSkpCisJCWdvdG8gZXJyOworCUVWUF9DaXBoZXJJbml0X2V4KGN0eCwgTlVMTCwgTlVMTCwga2V5LCBOVUxMLCBlbl9kZSk7CisJT1BFTlNTTF9jbGVhbnNlKGtleSwga2V5bGVuKTsKKwlQQktERjJQQVJBTV9mcmVlKGtkZik7CisJcmV0dXJuIDE7CisKKwllcnI6CisJUEJFMlBBUkFNX2ZyZWUocGJlMik7CisJUEJLREYyUEFSQU1fZnJlZShrZGYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgREVCVUdfUEtDUzVWMgorc3RhdGljIHZvaWQgaF9fZHVtcCAoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlbikKK3sKKyAgICAgICAgZm9yICg7IGxlbiAtLTsgcCsrKSBmcHJpbnRmKHN0ZGVyciwgIiUwMlggIiwgKnApOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX2RlYy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDFkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BfZGVjLmMKQEAgLTAsMCArMSw4NyBAQAorLyogY3J5cHRvL2V2cC9wX2RlYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKK2ludCBFVlBfUEtFWV9kZWNyeXB0X29sZCh1bnNpZ25lZCBjaGFyICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVrLCBpbnQgZWtsLAorCSAgICAgRVZQX1BLRVkgKnByaXYpCisJeworCWludCByZXQ9IC0xOworCQorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCWlmIChwcml2LT50eXBlICE9IEVWUF9QS0VZX1JTQSkKKwkJeworI2VuZGlmCisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9ERUNSWVBUX09MRCxFVlBfUl9QVUJMSUNfS0VZX05PVF9SU0EpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQlnb3RvIGVycjsKKyAgICAgICAgICAgICAgICB9CisKKwlyZXQ9UlNBX3ByaXZhdGVfZGVjcnlwdChla2wsZWssa2V5LHByaXYtPnBrZXkucnNhLFJTQV9QS0NTMV9QQURESU5HKTsKK2VycjoKKyNlbmRpZgorCXJldHVybihyZXQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcF9lbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWEzYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX2VuYy5jCkBAIC0wLDAgKzEsODYgQEAKKy8qIGNyeXB0by9ldnAvcF9lbmMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCitpbnQgRVZQX1BLRVlfZW5jcnlwdF9vbGQodW5zaWduZWQgY2hhciAqZWssIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleV9sZW4sCisJICAgICBFVlBfUEtFWSAqcHViaykKKwl7CisJaW50IHJldD0wOworCQorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCWlmIChwdWJrLT50eXBlICE9IEVWUF9QS0VZX1JTQSkKKwkJeworI2VuZGlmCisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9FTkNSWVBUX09MRCxFVlBfUl9QVUJMSUNfS0VZX05PVF9SU0EpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQlnb3RvIGVycjsKKwkJfQorCXJldD1SU0FfcHVibGljX2VuY3J5cHQoa2V5X2xlbixrZXksZWsscHViay0+cGtleS5yc2EsUlNBX1BLQ1MxX1BBRERJTkcpOworZXJyOgorI2VuZGlmCisJcmV0dXJuKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX2xpYi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MTZjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BfbGliLmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qIGNyeXB0by9ldnAvcF9saWIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xX21hYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImFzbjFfbG9jbC5oIgorCitzdGF0aWMgdm9pZCBFVlBfUEtFWV9mcmVlX2l0KEVWUF9QS0VZICp4KTsKKworaW50IEVWUF9QS0VZX2JpdHMoRVZQX1BLRVkgKnBrZXkpCisJeworCWlmIChwa2V5ICYmIHBrZXktPmFtZXRoICYmIHBrZXktPmFtZXRoLT5wa2V5X2JpdHMpCisJCXJldHVybiBwa2V5LT5hbWV0aC0+cGtleV9iaXRzKHBrZXkpOworCXJldHVybiAwOworCX0KKworaW50IEVWUF9QS0VZX3NpemUoRVZQX1BLRVkgKnBrZXkpCisJeworCWlmIChwa2V5ICYmIHBrZXktPmFtZXRoICYmIHBrZXktPmFtZXRoLT5wa2V5X3NpemUpCisJCXJldHVybiBwa2V5LT5hbWV0aC0+cGtleV9zaXplKHBrZXkpOworCXJldHVybiAwOworCX0KKworaW50IEVWUF9QS0VZX3NhdmVfcGFyYW1ldGVycyhFVlBfUEtFWSAqcGtleSwgaW50IG1vZGUpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCWlmIChwa2V5LT50eXBlID09IEVWUF9QS0VZX0RTQSkKKwkJeworCQlpbnQgcmV0PXBrZXktPnNhdmVfcGFyYW1ldGVyczsKKworCQlpZiAobW9kZSA+PSAwKQorCQkJcGtleS0+c2F2ZV9wYXJhbWV0ZXJzPW1vZGU7CisJCXJldHVybihyZXQpOworCQl9CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCWlmIChwa2V5LT50eXBlID09IEVWUF9QS0VZX0VDKQorCQl7CisJCWludCByZXQgPSBwa2V5LT5zYXZlX3BhcmFtZXRlcnM7CisKKwkJaWYgKG1vZGUgPj0gMCkKKwkJCXBrZXktPnNhdmVfcGFyYW1ldGVycyA9IG1vZGU7CisJCXJldHVybihyZXQpOworCQl9CisjZW5kaWYKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgRVZQX1BLRVlfY29weV9wYXJhbWV0ZXJzKEVWUF9QS0VZICp0bywgY29uc3QgRVZQX1BLRVkgKmZyb20pCisJeworCWlmICh0by0+dHlwZSAhPSBmcm9tLT50eXBlKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9DT1BZX1BBUkFNRVRFUlMsRVZQX1JfRElGRkVSRU5UX0tFWV9UWVBFUyk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoRVZQX1BLRVlfbWlzc2luZ19wYXJhbWV0ZXJzKGZyb20pKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9DT1BZX1BBUkFNRVRFUlMsRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoZnJvbS0+YW1ldGggJiYgZnJvbS0+YW1ldGgtPnBhcmFtX2NvcHkpCisJCXJldHVybiBmcm9tLT5hbWV0aC0+cGFyYW1fY29weSh0bywgZnJvbSk7CitlcnI6CisJcmV0dXJuIDA7CisJfQorCitpbnQgRVZQX1BLRVlfbWlzc2luZ19wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlpZiAocGtleS0+YW1ldGggJiYgcGtleS0+YW1ldGgtPnBhcmFtX21pc3NpbmcpCisJCXJldHVybiBwa2V5LT5hbWV0aC0+cGFyYW1fbWlzc2luZyhwa2V5KTsKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBFVlBfUEtFWV9jbXBfcGFyYW1ldGVycyhjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpCisJeworCWlmIChhLT50eXBlICE9IGItPnR5cGUpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+YW1ldGggJiYgYS0+YW1ldGgtPnBhcmFtX2NtcCkKKwkJcmV0dXJuIGEtPmFtZXRoLT5wYXJhbV9jbXAoYSwgYik7CisJcmV0dXJuIC0yOworCX0KKworaW50IEVWUF9QS0VZX2NtcChjb25zdCBFVlBfUEtFWSAqYSwgY29uc3QgRVZQX1BLRVkgKmIpCisJeworCWlmIChhLT50eXBlICE9IGItPnR5cGUpCisJCXJldHVybiAtMTsKKworCWlmIChhLT5hbWV0aCkKKwkJeworCQlpbnQgcmV0OworCQkvKiBDb21wYXJlIHBhcmFtZXRlcnMgaWYgdGhlIGFsZ29yaXRobSBoYXMgdGhlbSAqLworCQlpZiAoYS0+YW1ldGgtPnBhcmFtX2NtcCkKKwkJCXsKKwkJCXJldCA9IGEtPmFtZXRoLT5wYXJhbV9jbXAoYSwgYik7CisJCQlpZiAocmV0IDw9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKworCQlpZiAoYS0+YW1ldGgtPnB1Yl9jbXApCisJCQlyZXR1cm4gYS0+YW1ldGgtPnB1Yl9jbXAoYSwgYik7CisJCX0KKworCXJldHVybiAtMjsKKwl9CisKK0VWUF9QS0VZICpFVlBfUEtFWV9uZXcodm9pZCkKKwl7CisJRVZQX1BLRVkgKnJldDsKKworCXJldD0oRVZQX1BLRVkgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoRVZQX1BLRVkpKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX05FVyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCXJldC0+dHlwZT1FVlBfUEtFWV9OT05FOworCXJldC0+c2F2ZV90eXBlPUVWUF9QS0VZX05PTkU7CisJcmV0LT5yZWZlcmVuY2VzPTE7CisJcmV0LT5hbWV0aD1OVUxMOworCXJldC0+ZW5naW5lPU5VTEw7CisJcmV0LT5wa2V5LnB0cj1OVUxMOworCXJldC0+YXR0cmlidXRlcz1OVUxMOworCXJldC0+c2F2ZV9wYXJhbWV0ZXJzPTE7CisJcmV0dXJuKHJldCk7CisJfQorCisvKiBTZXR1cCBhIHB1YmxpYyBrZXkgQVNOMSBtZXRob2QgYW5kIEVOR0lORSBmcm9tIGEgTklEIG9yIGEgc3RyaW5nLgorICogSWYgcGtleSBpcyBOVUxMIGp1c3QgcmV0dXJuIDEgb3IgMCBpZiB0aGUgYWxnb3JpdGhtIGV4aXN0cy4KKyAqLworCitzdGF0aWMgaW50IHBrZXlfc2V0X3R5cGUoRVZQX1BLRVkgKnBrZXksIGludCB0eXBlLCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCisJeworCWNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aDsKKwlFTkdJTkUgKmUgPSBOVUxMOworCWlmIChwa2V5KQorCQl7CisJCWlmIChwa2V5LT5wa2V5LnB0cikKKwkJCUVWUF9QS0VZX2ZyZWVfaXQocGtleSk7CisJCS8qIElmIGtleSB0eXBlIG1hdGNoZXMgYW5kIGEgbWV0aG9kIGV4aXN0cyB0aGVuIHRoaXMKKwkJICogbG9va3VwIGhhcyBzdWNjZWVkZWQgb25jZSBzbyBqdXN0IGluZGljYXRlIHN1Y2Nlc3MuCisJCSAqLworCQlpZiAoKHR5cGUgPT0gcGtleS0+c2F2ZV90eXBlKSAmJiBwa2V5LT5hbWV0aCkKKwkJCXJldHVybiAxOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCQkvKiBJZiB3ZSBoYXZlIGFuIEVOR0lORSByZWxlYXNlIGl0ICovCisJCWlmIChwa2V5LT5lbmdpbmUpCisJCQl7CisJCQlFTkdJTkVfZmluaXNoKHBrZXktPmVuZ2luZSk7CisJCQlwa2V5LT5lbmdpbmUgPSBOVUxMOworCQkJfQorI2VuZGlmCisJCX0KKwlpZiAoc3RyKQorCQlhbWV0aCA9IEVWUF9QS0VZX2FzbjFfZmluZF9zdHIoJmUsIHN0ciwgbGVuKTsKKwllbHNlCisJCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kKCZlLCB0eXBlKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlpZiAoIXBrZXkgJiYgZSkKKwkJRU5HSU5FX2ZpbmlzaChlKTsKKyNlbmRpZgorCWlmICghYW1ldGgpCisJCXsKKwkJRVZQZXJyKEVWUF9GX1BLRVlfU0VUX1RZUEUsIEVWUF9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CisJCXJldHVybiAwOworCQl9CisJaWYgKHBrZXkpCisJCXsKKwkJcGtleS0+YW1ldGggPSBhbWV0aDsKKwkJcGtleS0+ZW5naW5lID0gZTsKKworCQlwa2V5LT50eXBlID0gcGtleS0+YW1ldGgtPnBrZXlfaWQ7CisJCXBrZXktPnNhdmVfdHlwZT10eXBlOworCQl9CisJcmV0dXJuIDE7CisJfQorCitpbnQgRVZQX1BLRVlfc2V0X3R5cGUoRVZQX1BLRVkgKnBrZXksIGludCB0eXBlKQorCXsKKwlyZXR1cm4gcGtleV9zZXRfdHlwZShwa2V5LCB0eXBlLCBOVUxMLCAtMSk7CisJfQorCitpbnQgRVZQX1BLRVlfc2V0X3R5cGVfc3RyKEVWUF9QS0VZICpwa2V5LCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCisJeworCXJldHVybiBwa2V5X3NldF90eXBlKHBrZXksIEVWUF9QS0VZX05PTkUsIHN0ciwgbGVuKTsKKwl9CisKK2ludCBFVlBfUEtFWV9hc3NpZ24oRVZQX1BLRVkgKnBrZXksIGludCB0eXBlLCB2b2lkICprZXkpCisJeworCWlmICghRVZQX1BLRVlfc2V0X3R5cGUocGtleSwgdHlwZSkpCisJCXJldHVybiAwOworCXBrZXktPnBrZXkucHRyPWtleTsKKwlyZXR1cm4gKGtleSAhPSBOVUxMKTsKKwl9CisKK3ZvaWQgKkVWUF9QS0VZX2dldDAoRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBwa2V5LT5wa2V5LnB0cjsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK2ludCBFVlBfUEtFWV9zZXQxX1JTQShFVlBfUEtFWSAqcGtleSwgUlNBICprZXkpCit7CisJaW50IHJldCA9IEVWUF9QS0VZX2Fzc2lnbl9SU0EocGtleSwga2V5KTsKKwlpZihyZXQpCisJCVJTQV91cF9yZWYoa2V5KTsKKwlyZXR1cm4gcmV0OworfQorCitSU0EgKkVWUF9QS0VZX2dldDFfUlNBKEVWUF9QS0VZICpwa2V5KQorCXsKKwlpZihwa2V5LT50eXBlICE9IEVWUF9QS0VZX1JTQSkgeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfR0VUMV9SU0EsIEVWUF9SX0VYUEVDVElOR19BTl9SU0FfS0VZKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVJTQV91cF9yZWYocGtleS0+cGtleS5yc2EpOworCXJldHVybiBwa2V5LT5wa2V5LnJzYTsKK30KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCitpbnQgRVZQX1BLRVlfc2V0MV9EU0EoRVZQX1BLRVkgKnBrZXksIERTQSAqa2V5KQoreworCWludCByZXQgPSBFVlBfUEtFWV9hc3NpZ25fRFNBKHBrZXksIGtleSk7CisJaWYocmV0KQorCQlEU0FfdXBfcmVmKGtleSk7CisJcmV0dXJuIHJldDsKK30KKworRFNBICpFVlBfUEtFWV9nZXQxX0RTQShFVlBfUEtFWSAqcGtleSkKKwl7CisJaWYocGtleS0+dHlwZSAhPSBFVlBfUEtFWV9EU0EpIHsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX0dFVDFfRFNBLCBFVlBfUl9FWFBFQ1RJTkdfQV9EU0FfS0VZKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCURTQV91cF9yZWYocGtleS0+cGtleS5kc2EpOworCXJldHVybiBwa2V5LT5wa2V5LmRzYTsKK30KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKworaW50IEVWUF9QS0VZX3NldDFfRUNfS0VZKEVWUF9QS0VZICpwa2V5LCBFQ19LRVkgKmtleSkKK3sKKwlpbnQgcmV0ID0gRVZQX1BLRVlfYXNzaWduX0VDX0tFWShwa2V5LGtleSk7CisJaWYgKHJldCkKKwkJRUNfS0VZX3VwX3JlZihrZXkpOworCXJldHVybiByZXQ7Cit9CisKK0VDX0tFWSAqRVZQX1BLRVlfZ2V0MV9FQ19LRVkoRVZQX1BLRVkgKnBrZXkpCit7CisJaWYgKHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfRUMpCisJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfR0VUMV9FQ19LRVksIEVWUF9SX0VYUEVDVElOR19BX0VDX0tFWSk7CisJCXJldHVybiBOVUxMOworCX0KKwlFQ19LRVlfdXBfcmVmKHBrZXktPnBrZXkuZWMpOworCXJldHVybiBwa2V5LT5wa2V5LmVjOworfQorI2VuZGlmCisKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisKK2ludCBFVlBfUEtFWV9zZXQxX0RIKEVWUF9QS0VZICpwa2V5LCBESCAqa2V5KQoreworCWludCByZXQgPSBFVlBfUEtFWV9hc3NpZ25fREgocGtleSwga2V5KTsKKwlpZihyZXQpCisJCURIX3VwX3JlZihrZXkpOworCXJldHVybiByZXQ7Cit9CisKK0RIICpFVlBfUEtFWV9nZXQxX0RIKEVWUF9QS0VZICpwa2V5KQorCXsKKwlpZihwa2V5LT50eXBlICE9IEVWUF9QS0VZX0RIKSB7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9HRVQxX0RILCBFVlBfUl9FWFBFQ1RJTkdfQV9ESF9LRVkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJREhfdXBfcmVmKHBrZXktPnBrZXkuZGgpOworCXJldHVybiBwa2V5LT5wa2V5LmRoOworfQorI2VuZGlmCisKK2ludCBFVlBfUEtFWV90eXBlKGludCB0eXBlKQorCXsKKwlpbnQgcmV0OworCWNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aDsKKwlFTkdJTkUgKmU7CisJYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmQoJmUsIHR5cGUpOworCWlmIChhbWV0aCkKKwkJcmV0ID0gYW1ldGgtPnBrZXlfaWQ7CisJZWxzZQorCQlyZXQgPSBOSURfdW5kZWY7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYgKGUpCisJCUVOR0lORV9maW5pc2goZSk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEVWUF9QS0VZX2lkKGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4gcGtleS0+dHlwZTsKKwl9CisKK2ludCBFVlBfUEtFWV9iYXNlX2lkKGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4gRVZQX1BLRVlfdHlwZShwa2V5LT50eXBlKTsKKwl9CisKK3ZvaWQgRVZQX1BLRVlfZnJlZShFVlBfUEtFWSAqeCkKKwl7CisJaW50IGk7CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJngtPnJlZmVyZW5jZXMsLTEsQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworI2lmZGVmIFJFRl9QUklOVAorCVJFRl9QUklOVCgiRVZQX1BLRVkiLHgpOworI2VuZGlmCisJaWYgKGkgPiAwKSByZXR1cm47CisjaWZkZWYgUkVGX0NIRUNLCisJaWYgKGkgPCAwKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCJFVlBfUEtFWV9mcmVlLCBiYWQgcmVmZXJlbmNlIGNvdW50XG4iKTsKKwkJYWJvcnQoKTsKKwkJfQorI2VuZGlmCisJRVZQX1BLRVlfZnJlZV9pdCh4KTsKKwlpZiAoeC0+YXR0cmlidXRlcykKKwkJc2tfWDUwOV9BVFRSSUJVVEVfcG9wX2ZyZWUoeC0+YXR0cmlidXRlcywgWDUwOV9BVFRSSUJVVEVfZnJlZSk7CisJT1BFTlNTTF9mcmVlKHgpOworCX0KKworc3RhdGljIHZvaWQgRVZQX1BLRVlfZnJlZV9pdChFVlBfUEtFWSAqeCkKKwl7CisJaWYgKHgtPmFtZXRoICYmIHgtPmFtZXRoLT5wa2V5X2ZyZWUpCisJCXgtPmFtZXRoLT5wa2V5X2ZyZWUoeCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYgKHgtPmVuZ2luZSkKKwkJeworCQlFTkdJTkVfZmluaXNoKHgtPmVuZ2luZSk7CisJCXgtPmVuZ2luZSA9IE5VTEw7CisJCX0KKyNlbmRpZgorCX0KKworc3RhdGljIGludCB1bnN1cF9hbGcoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorCQkJCWNvbnN0IGNoYXIgKmtzdHIpCisJeworCUJJT19pbmRlbnQob3V0LCBpbmRlbnQsIDEyOCk7CisJQklPX3ByaW50ZihvdXQsICIlcyBhbGdvcml0aG0gXCIlc1wiIHVuc3VwcG9ydGVkXG4iLAorCQkJCQkJa3N0ciwgT0JKX25pZDJsbihwa2V5LT50eXBlKSk7CisJcmV0dXJuIDE7CisJfQorCitpbnQgRVZQX1BLRVlfcHJpbnRfcHVibGljKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwKKwkJCQlpbnQgaW5kZW50LCBBU04xX1BDVFggKnBjdHgpCisJeworCWlmIChwa2V5LT5hbWV0aCAmJiBwa2V5LT5hbWV0aC0+cHViX3ByaW50KQorCQlyZXR1cm4gcGtleS0+YW1ldGgtPnB1Yl9wcmludChvdXQsIHBrZXksIGluZGVudCwgcGN0eCk7CisJCisJcmV0dXJuIHVuc3VwX2FsZyhvdXQsIHBrZXksIGluZGVudCwgIlB1YmxpYyBLZXkiKTsKKwl9CisKK2ludCBFVlBfUEtFWV9wcmludF9wcml2YXRlKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwKKwkJCQlpbnQgaW5kZW50LCBBU04xX1BDVFggKnBjdHgpCisJeworCWlmIChwa2V5LT5hbWV0aCAmJiBwa2V5LT5hbWV0aC0+cHJpdl9wcmludCkKKwkJcmV0dXJuIHBrZXktPmFtZXRoLT5wcml2X3ByaW50KG91dCwgcGtleSwgaW5kZW50LCBwY3R4KTsKKwkKKwlyZXR1cm4gdW5zdXBfYWxnKG91dCwgcGtleSwgaW5kZW50LCAiUHJpdmF0ZSBLZXkiKTsKKwl9CisKK2ludCBFVlBfUEtFWV9wcmludF9wYXJhbXMoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LAorCQkJCWludCBpbmRlbnQsIEFTTjFfUENUWCAqcGN0eCkKKwl7CisJaWYgKHBrZXktPmFtZXRoICYmIHBrZXktPmFtZXRoLT5wYXJhbV9wcmludCkKKwkJcmV0dXJuIHBrZXktPmFtZXRoLT5wYXJhbV9wcmludChvdXQsIHBrZXksIGluZGVudCwgcGN0eCk7CisJcmV0dXJuIHVuc3VwX2FsZyhvdXQsIHBrZXksIGluZGVudCwgIlBhcmFtZXRlcnMiKTsKKwl9CisKK2ludCBFVlBfUEtFWV9nZXRfZGVmYXVsdF9kaWdlc3RfbmlkKEVWUF9QS0VZICpwa2V5LCBpbnQgKnBuaWQpCisJeworCWlmICghcGtleS0+YW1ldGggfHwgIXBrZXktPmFtZXRoLT5wa2V5X2N0cmwpCisJCXJldHVybiAtMjsKKwlyZXR1cm4gcGtleS0+YW1ldGgtPnBrZXlfY3RybChwa2V5LCBBU04xX1BLRVlfQ1RSTF9ERUZBVUxUX01EX05JRCwKKwkJCQkJCTAsIHBuaWQpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX29wZW4uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcF9vcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhNTlhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcF9vcGVuLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIGNyeXB0by9ldnAvcF9vcGVuLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCitpbnQgRVZQX09wZW5Jbml0KEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IEVWUF9DSVBIRVIgKnR5cGUsCisJY29uc3QgdW5zaWduZWQgY2hhciAqZWssIGludCBla2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LAorCUVWUF9QS0VZICpwcml2KQorCXsKKwl1bnNpZ25lZCBjaGFyICprZXk9TlVMTDsKKwlpbnQgaSxzaXplPTAscmV0PTA7CisKKwlpZih0eXBlKSB7CQorCQlFVlBfQ0lQSEVSX0NUWF9pbml0KGN0eCk7CisJCWlmKCFFVlBfRGVjcnlwdEluaXRfZXgoY3R4LHR5cGUsTlVMTCwgTlVMTCxOVUxMKSkgcmV0dXJuIDA7CisJfQorCisJaWYoIXByaXYpIHJldHVybiAxOworCisJaWYgKHByaXYtPnR5cGUgIT0gRVZQX1BLRVlfUlNBKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfT1BFTklOSVQsRVZQX1JfUFVCTElDX0tFWV9OT1RfUlNBKTsKKwkJZ290byBlcnI7CisgICAgICAgICAgICAgICAgfQorCisJc2l6ZT1SU0Ffc2l6ZShwcml2LT5wa2V5LnJzYSk7CisJa2V5PSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2Moc2l6ZSsyKTsKKwlpZiAoa2V5ID09IE5VTEwpCisJCXsKKwkJLyogRVJST1IgKi8KKwkJRVZQZXJyKEVWUF9GX0VWUF9PUEVOSU5JVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpPUVWUF9QS0VZX2RlY3J5cHRfb2xkKGtleSxlayxla2wscHJpdik7CisJaWYgKChpIDw9IDApIHx8ICFFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aChjdHgsIGkpKQorCQl7CisJCS8qIEVSUk9SICovCisJCWdvdG8gZXJyOworCQl9CisJaWYoIUVWUF9EZWNyeXB0SW5pdF9leChjdHgsTlVMTCxOVUxMLGtleSxpdikpIGdvdG8gZXJyOworCisJcmV0PTE7CitlcnI6CisJaWYgKGtleSAhPSBOVUxMKSBPUEVOU1NMX2NsZWFuc2Uoa2V5LHNpemUpOworCU9QRU5TU0xfZnJlZShrZXkpOworCXJldHVybihyZXQpOworCX0KKworaW50IEVWUF9PcGVuRmluYWwoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGwpCisJeworCWludCBpOworCisJaT1FVlBfRGVjcnlwdEZpbmFsX2V4KGN0eCxvdXQsb3V0bCk7CisJRVZQX0RlY3J5cHRJbml0X2V4KGN0eCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKwlyZXR1cm4oaSk7CisJfQorI2Vsc2UgLyogIU9QRU5TU0xfTk9fUlNBICovCisKKyMgaWZkZWYgUEVEQU5USUMKK3N0YXRpYyB2b2lkICpkdW1teT0mZHVtbXk7CisjIGVuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX3NlYWwuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcF9zZWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzMjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcF9zZWFsLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qIGNyeXB0by9ldnAvcF9zZWFsLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworaW50IEVWUF9TZWFsSW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCBFVlBfQ0lQSEVSICp0eXBlLCB1bnNpZ25lZCBjaGFyICoqZWssCisJICAgICBpbnQgKmVrbCwgdW5zaWduZWQgY2hhciAqaXYsIEVWUF9QS0VZICoqcHViaywgaW50IG5wdWJrKQorCXsKKwl1bnNpZ25lZCBjaGFyIGtleVtFVlBfTUFYX0tFWV9MRU5HVEhdOworCWludCBpOworCQorCWlmKHR5cGUpIHsKKwkJRVZQX0NJUEhFUl9DVFhfaW5pdChjdHgpOworCQlpZighRVZQX0VuY3J5cHRJbml0X2V4KGN0eCx0eXBlLE5VTEwsTlVMTCxOVUxMKSkgcmV0dXJuIDA7CisJfQorCWlmICgobnB1YmsgPD0gMCkgfHwgIXB1YmspCisJCXJldHVybiAxOworCWlmIChFVlBfQ0lQSEVSX0NUWF9yYW5kX2tleShjdHgsIGtleSkgPD0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aChjdHgpKQorCQlSQU5EX3BzZXVkb19ieXRlcyhpdixFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoY3R4KSk7CisKKwlpZighRVZQX0VuY3J5cHRJbml0X2V4KGN0eCxOVUxMLE5VTEwsa2V5LGl2KSkgcmV0dXJuIDA7CisKKwlmb3IgKGk9MDsgaTxucHViazsgaSsrKQorCQl7CisJCWVrbFtpXT1FVlBfUEtFWV9lbmNyeXB0X29sZChla1tpXSxrZXksRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjdHgpLAorCQkJcHVia1tpXSk7CisJCWlmIChla2xbaV0gPD0gMCkgcmV0dXJuKC0xKTsKKwkJfQorCXJldHVybihucHViayk7CisJfQorCisvKiBNQUNSTwordm9pZCBFVlBfU2VhbFVwZGF0ZShjdHgsb3V0LG91dGwsaW4saW5sKQorRVZQX0NJUEhFUl9DVFggKmN0eDsKK3Vuc2lnbmVkIGNoYXIgKm91dDsKK2ludCAqb3V0bDsKK3Vuc2lnbmVkIGNoYXIgKmluOworaW50IGlubDsKKwl7CisJRVZQX0VuY3J5cHRVcGRhdGUoY3R4LG91dCxvdXRsLGluLGlubCk7CisJfQorKi8KKworaW50IEVWUF9TZWFsRmluYWwoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgKm91dGwpCisJeworCWludCBpOworCWkgPSBFVlBfRW5jcnlwdEZpbmFsX2V4KGN0eCxvdXQsb3V0bCk7CisJRVZQX0VuY3J5cHRJbml0X2V4KGN0eCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKKwlyZXR1cm4gaTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3Bfc2lnbi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX3NpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGY2ZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wX3NpZ24uYwpAQCAtMCwwICsxLDEzNyBAQAorLyogY3J5cHRvL2V2cC9wX3NpZ24uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpZmRlZiB1bmRlZgordm9pZCBFVlBfU2lnbkluaXQoRVZQX01EX0NUWCAqY3R4LCBFVlBfTUQgKnR5cGUpCisJeworCUVWUF9EaWdlc3RJbml0X2V4KGN0eCx0eXBlKTsKKwl9CisKK3ZvaWQgRVZQX1NpZ25VcGRhdGUoRVZQX01EX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCSAgICAgdW5zaWduZWQgaW50IGNvdW50KQorCXsKKwlFVlBfRGlnZXN0VXBkYXRlKGN0eCxkYXRhLGNvdW50KTsKKwl9CisjZW5kaWYKKworaW50IEVWUF9TaWduRmluYWwoRVZQX01EX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWdyZXQsIHVuc2lnbmVkIGludCAqc2lnbGVuLAorCSAgICAgRVZQX1BLRVkgKnBrZXkpCisJeworCXVuc2lnbmVkIGNoYXIgbVtFVlBfTUFYX01EX1NJWkVdOworCXVuc2lnbmVkIGludCBtX2xlbjsKKwlpbnQgaSxvaz0wLHY7CisJTVNfU1RBVElDIEVWUF9NRF9DVFggdG1wX2N0eDsKKworCSpzaWdsZW49MDsKKwlFVlBfTURfQ1RYX2luaXQoJnRtcF9jdHgpOworCUVWUF9NRF9DVFhfY29weV9leCgmdG1wX2N0eCxjdHgpOyAgIAorCUVWUF9EaWdlc3RGaW5hbF9leCgmdG1wX2N0eCwmKG1bMF0pLCZtX2xlbik7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZ0bXBfY3R4KTsKKworCWlmIChjdHgtPmRpZ2VzdC0+ZmxhZ3MgJiBFVlBfTURfRkxBR19QS0VZX01FVEhPRF9TSUdOQVRVUkUpCisJCXsKKwkJRVZQX1BLRVlfQ1RYICpwa2N0eCA9IE5VTEw7CisJCXNpemVfdCBzbHRtcCA9IChzaXplX3QpRVZQX1BLRVlfc2l6ZShwa2V5KTsKKwkJaSA9IDA7CisJCXBrY3R4ID0gRVZQX1BLRVlfQ1RYX25ldyhwa2V5LCBOVUxMKTsKKwkJaWYgKCFwa2N0eCkKKwkJCWdvdG8gZXJyOworCQlpZiAoRVZQX1BLRVlfc2lnbl9pbml0KHBrY3R4KSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChFVlBfUEtFWV9DVFhfc2V0X3NpZ25hdHVyZV9tZChwa2N0eCwgY3R4LT5kaWdlc3QpIDw9IDApCisJCQlnb3RvIGVycjsKKwkJaWYgKEVWUF9QS0VZX3NpZ24ocGtjdHgsIHNpZ3JldCwgJnNsdG1wLCBtLCBtX2xlbikgPD0gMCkKKwkJCWdvdG8gZXJyOworCQkqc2lnbGVuID0gc2x0bXA7CisJCWkgPSAxOworCQllcnI6CisJCUVWUF9QS0VZX0NUWF9mcmVlKHBrY3R4KTsKKwkJcmV0dXJuIGk7CisJCX0KKworCWZvciAoaT0wOyBpPDQ7IGkrKykKKwkJeworCQl2PWN0eC0+ZGlnZXN0LT5yZXF1aXJlZF9wa2V5X3R5cGVbaV07CisJCWlmICh2ID09IDApIGJyZWFrOworCQlpZiAocGtleS0+dHlwZSA9PSB2KQorCQkJeworCQkJb2s9MTsKKwkJCWJyZWFrOworCQkJfQorCQl9CisJaWYgKCFvaykKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1NJR05GSU5BTCxFVlBfUl9XUk9OR19QVUJMSUNfS0VZX1RZUEUpOworCQlyZXR1cm4oMCk7CisJCX0KKworCWlmIChjdHgtPmRpZ2VzdC0+c2lnbiA9PSBOVUxMKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfU0lHTkZJTkFMLEVWUF9SX05PX1NJR05fRlVOQ1RJT05fQ09ORklHVVJFRCk7CisJCXJldHVybigwKTsKKwkJfQorCXJldHVybihjdHgtPmRpZ2VzdC0+c2lnbihjdHgtPmRpZ2VzdC0+dHlwZSxtLG1fbGVuLHNpZ3JldCxzaWdsZW4sCisJCXBrZXktPnBrZXkucHRyKSk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BfdmVyaWZ5LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BfdmVyaWZ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNDY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcF92ZXJpZnkuYwpAQCAtMCwwICsxLDExOSBAQAorLyogY3J5cHRvL2V2cC9wX3ZlcmlmeS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworaW50IEVWUF9WZXJpZnlGaW5hbChFVlBfTURfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ2J1ZiwKKwkgICAgIHVuc2lnbmVkIGludCBzaWdsZW4sIEVWUF9QS0VZICpwa2V5KQorCXsKKwl1bnNpZ25lZCBjaGFyIG1bRVZQX01BWF9NRF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgbV9sZW47CisJaW50IGksb2s9MCx2OworCU1TX1NUQVRJQyBFVlBfTURfQ1RYIHRtcF9jdHg7CisKKwlFVlBfTURfQ1RYX2luaXQoJnRtcF9jdHgpOworCUVWUF9NRF9DVFhfY29weV9leCgmdG1wX2N0eCxjdHgpOyAgICAgCisJRVZQX0RpZ2VzdEZpbmFsX2V4KCZ0bXBfY3R4LCYobVswXSksJm1fbGVuKTsKKwlFVlBfTURfQ1RYX2NsZWFudXAoJnRtcF9jdHgpOworCisJaWYgKGN0eC0+ZGlnZXN0LT5mbGFncyAmIEVWUF9NRF9GTEFHX1BLRVlfTUVUSE9EX1NJR05BVFVSRSkKKwkJeworCQlFVlBfUEtFWV9DVFggKnBrY3R4ID0gTlVMTDsKKwkJaSA9IC0xOworCQlwa2N0eCA9IEVWUF9QS0VZX0NUWF9uZXcocGtleSwgTlVMTCk7CisJCWlmICghcGtjdHgpCisJCQlnb3RvIGVycjsKKwkJaWYgKEVWUF9QS0VZX3ZlcmlmeV9pbml0KHBrY3R4KSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChFVlBfUEtFWV9DVFhfc2V0X3NpZ25hdHVyZV9tZChwa2N0eCwgY3R4LT5kaWdlc3QpIDw9IDApCisJCQlnb3RvIGVycjsKKwkJaSA9IEVWUF9QS0VZX3ZlcmlmeShwa2N0eCwgc2lnYnVmLCBzaWdsZW4sIG0sIG1fbGVuKTsKKwkJZXJyOgorCQlFVlBfUEtFWV9DVFhfZnJlZShwa2N0eCk7CisJCXJldHVybiBpOworCQl9CisKKwlmb3IgKGk9MDsgaTw0OyBpKyspCisJCXsKKwkJdj1jdHgtPmRpZ2VzdC0+cmVxdWlyZWRfcGtleV90eXBlW2ldOworCQlpZiAodiA9PSAwKSBicmVhazsKKwkJaWYgKHBrZXktPnR5cGUgPT0gdikKKwkJCXsKKwkJCW9rPTE7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCWlmICghb2spCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9WRVJJRllGSU5BTCxFVlBfUl9XUk9OR19QVUJMSUNfS0VZX1RZUEUpOworCQlyZXR1cm4oLTEpOworCQl9CisgICAgICAgIGlmIChjdHgtPmRpZ2VzdC0+dmVyaWZ5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworCQlFVlBlcnIoRVZQX0ZfRVZQX1ZFUklGWUZJTkFMLEVWUF9SX05PX1ZFUklGWV9GVU5DVElPTl9DT05GSUdVUkVEKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlyZXR1cm4oY3R4LT5kaWdlc3QtPnZlcmlmeShjdHgtPmRpZ2VzdC0+dHlwZSxtLG1fbGVuLAorCQlzaWdidWYsc2lnbGVuLHBrZXktPnBrZXkucHRyKSk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BtZXRoX2ZuLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BtZXRoX2ZuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2NzZmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcG1ldGhfZm4uYwpAQCAtMCwwICsxLDM2OCBAQAorLyogcG1ldGhfZm4uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgImV2cF9sb2NsLmgiCisKKyNkZWZpbmUgTV9jaGVja19hdXRvYXJnKGN0eCwgYXJnLCBhcmdsZW4sIGVycikgXAorCWlmIChjdHgtPnBtZXRoLT5mbGFncyAmIEVWUF9QS0VZX0ZMQUdfQVVUT0FSR0xFTikgXAorCQl7IFwKKwkJc2l6ZV90IHBrc2l6ZSA9IChzaXplX3QpRVZQX1BLRVlfc2l6ZShjdHgtPnBrZXkpOyBcCisJCWlmICghYXJnKSBcCisJCQl7IFwKKwkJCSphcmdsZW4gPSBwa3NpemU7IFwKKwkJCXJldHVybiAxOyBcCisJCQl9IFwKKwkJZWxzZSBpZiAoKmFyZ2xlbiA8IHBrc2l6ZSkgXAorCQkJeyBcCisJCQlFVlBlcnIoZXJyLCBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMKTsgLypja2Vycl9pZ25vcmUqL1wKKwkJCXJldHVybiAwOyBcCisJCQl9IFwKKwkJfQorCitpbnQgRVZQX1BLRVlfc2lnbl9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0OworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5zaWduKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9TSUdOX0lOSVQsCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJcmV0dXJuIC0yOworCQl9CisJY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9TSUdOOworCWlmICghY3R4LT5wbWV0aC0+c2lnbl9pbml0KQorCQlyZXR1cm4gMTsKKwlyZXQgPSBjdHgtPnBtZXRoLT5zaWduX2luaXQoY3R4KTsKKwlpZiAocmV0IDw9IDApCisJCWN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfVU5ERUZJTkVEOworCXJldHVybiByZXQ7CisJfQorCitpbnQgRVZQX1BLRVlfc2lnbihFVlBfUEtFWV9DVFggKmN0eCwKKwkJCXVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pCisJeworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5zaWduKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9TSUdOLAorCQkJRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisJCXJldHVybiAtMjsKKwkJfQorCWlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9TSUdOKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9TSUdOLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworCQlyZXR1cm4gLTE7CisJCX0KKwlNX2NoZWNrX2F1dG9hcmcoY3R4LCBzaWcsIHNpZ2xlbiwgRVZQX0ZfRVZQX1BLRVlfU0lHTikKKwlyZXR1cm4gY3R4LT5wbWV0aC0+c2lnbihjdHgsIHNpZywgc2lnbGVuLCB0YnMsIHRic2xlbik7CisJfQorCitpbnQgRVZQX1BLRVlfdmVyaWZ5X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCWludCByZXQ7CisJaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPnZlcmlmeSkKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfVkVSSUZZX0lOSVQsCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJcmV0dXJuIC0yOworCQl9CisJY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9WRVJJRlk7CisJaWYgKCFjdHgtPnBtZXRoLT52ZXJpZnlfaW5pdCkKKwkJcmV0dXJuIDE7CisJcmV0ID0gY3R4LT5wbWV0aC0+dmVyaWZ5X2luaXQoY3R4KTsKKwlpZiAocmV0IDw9IDApCisJCWN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfVU5ERUZJTkVEOworCXJldHVybiByZXQ7CisJfQorCitpbnQgRVZQX1BLRVlfdmVyaWZ5KEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3Qgc2lnbGVuLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJzLCBzaXplX3QgdGJzbGVuKQorCXsKKwlpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+dmVyaWZ5KQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9WRVJJRlksCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJcmV0dXJuIC0yOworCQl9CisJaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX1ZFUklGWSkKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfVkVSSUZZLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworCQlyZXR1cm4gLTE7CisJCX0KKwlyZXR1cm4gY3R4LT5wbWV0aC0+dmVyaWZ5KGN0eCwgc2lnLCBzaWdsZW4sIHRicywgdGJzbGVuKTsKKwl9CisKK2ludCBFVlBfUEtFWV92ZXJpZnlfcmVjb3Zlcl9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0OworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT52ZXJpZnlfcmVjb3ZlcikKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfVkVSSUZZX1JFQ09WRVJfSU5JVCwKKwkJCUVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworCQlyZXR1cm4gLTI7CisJCX0KKwljdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1ZFUklGWVJFQ09WRVI7CisJaWYgKCFjdHgtPnBtZXRoLT52ZXJpZnlfcmVjb3Zlcl9pbml0KQorCQlyZXR1cm4gMTsKKwlyZXQgPSBjdHgtPnBtZXRoLT52ZXJpZnlfcmVjb3Zlcl9pbml0KGN0eCk7CisJaWYgKHJldCA8PSAwKQorCQljdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1VOREVGSU5FRDsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEVWUF9QS0VZX3ZlcmlmeV9yZWNvdmVyKEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJdW5zaWduZWQgY2hhciAqcm91dCwgc2l6ZV90ICpyb3V0bGVuLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3Qgc2lnbGVuKQorCXsKKwlpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+dmVyaWZ5X3JlY292ZXIpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX1ZFUklGWV9SRUNPVkVSLAorCQkJRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisJCXJldHVybiAtMjsKKwkJfQorCWlmIChjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9WRVJJRllfUkVDT1ZFUiwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKwkJcmV0dXJuIC0xOworCQl9CisJTV9jaGVja19hdXRvYXJnKGN0eCwgcm91dCwgcm91dGxlbiwgRVZQX0ZfRVZQX1BLRVlfVkVSSUZZX1JFQ09WRVIpCisJcmV0dXJuIGN0eC0+cG1ldGgtPnZlcmlmeV9yZWNvdmVyKGN0eCwgcm91dCwgcm91dGxlbiwgc2lnLCBzaWdsZW4pOworCX0KKworaW50IEVWUF9QS0VZX2VuY3J5cHRfaW5pdChFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJaW50IHJldDsKKwlpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+ZW5jcnlwdCkKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfRU5DUllQVF9JTklULAorCQkJRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisJCXJldHVybiAtMjsKKwkJfQorCWN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfRU5DUllQVDsKKwlpZiAoIWN0eC0+cG1ldGgtPmVuY3J5cHRfaW5pdCkKKwkJcmV0dXJuIDE7CisJcmV0ID0gY3R4LT5wbWV0aC0+ZW5jcnlwdF9pbml0KGN0eCk7CisJaWYgKHJldCA8PSAwKQorCQljdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1VOREVGSU5FRDsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEVWUF9QS0VZX2VuY3J5cHQoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQl1bnNpZ25lZCBjaGFyICpvdXQsIHNpemVfdCAqb3V0bGVuLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmxlbikKKwl7CisJaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPmVuY3J5cHQpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX0VOQ1JZUFQsCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJcmV0dXJuIC0yOworCQl9CisJaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0VOQ1JZUFQpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX0VOQ1JZUFQsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CisJCXJldHVybiAtMTsKKwkJfQorCU1fY2hlY2tfYXV0b2FyZyhjdHgsIG91dCwgb3V0bGVuLCBFVlBfRl9FVlBfUEtFWV9FTkNSWVBUKQorCXJldHVybiBjdHgtPnBtZXRoLT5lbmNyeXB0KGN0eCwgb3V0LCBvdXRsZW4sIGluLCBpbmxlbik7CisJfQorCitpbnQgRVZQX1BLRVlfZGVjcnlwdF9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0OworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5kZWNyeXB0KQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9ERUNSWVBUX0lOSVQsCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJcmV0dXJuIC0yOworCQl9CisJY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9ERUNSWVBUOworCWlmICghY3R4LT5wbWV0aC0+ZGVjcnlwdF9pbml0KQorCQlyZXR1cm4gMTsKKwlyZXQgPSBjdHgtPnBtZXRoLT5kZWNyeXB0X2luaXQoY3R4KTsKKwlpZiAocmV0IDw9IDApCisJCWN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfVU5ERUZJTkVEOworCXJldHVybiByZXQ7CisJfQorCitpbnQgRVZQX1BLRVlfZGVjcnlwdChFVlBfUEtFWV9DVFggKmN0eCwKKwkJCXVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubGVuKQorCXsKKwlpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+ZGVjcnlwdCkKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfREVDUllQVCwKKwkJCUVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworCQlyZXR1cm4gLTI7CisJCX0KKwlpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfREVDUllQVCkKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfREVDUllQVCwgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKwkJcmV0dXJuIC0xOworCQl9CisJTV9jaGVja19hdXRvYXJnKGN0eCwgb3V0LCBvdXRsZW4sIEVWUF9GX0VWUF9QS0VZX0RFQ1JZUFQpCisJcmV0dXJuIGN0eC0+cG1ldGgtPmRlY3J5cHQoY3R4LCBvdXQsIG91dGxlbiwgaW4sIGlubGVuKTsKKwl9CisKKworaW50IEVWUF9QS0VZX2Rlcml2ZV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlpbnQgcmV0OworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5kZXJpdmUpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX0RFUklWRV9JTklULAorCQkJRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisJCXJldHVybiAtMjsKKwkJfQorCWN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfREVSSVZFOworCWlmICghY3R4LT5wbWV0aC0+ZGVyaXZlX2luaXQpCisJCXJldHVybiAxOworCXJldCA9IGN0eC0+cG1ldGgtPmRlcml2ZV9pbml0KGN0eCk7CisJaWYgKHJldCA8PSAwKQorCQljdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1VOREVGSU5FRDsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEVWUF9QS0VZX2Rlcml2ZV9zZXRfcGVlcihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBlZXIpCisJeworCWludCByZXQ7CisJaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIShjdHgtPnBtZXRoLT5kZXJpdmV8fGN0eC0+cG1ldGgtPmVuY3J5cHR8fGN0eC0+cG1ldGgtPmRlY3J5cHQpIHx8ICFjdHgtPnBtZXRoLT5jdHJsKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9ERVJJVkVfU0VUX1BFRVIsCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJcmV0dXJuIC0yOworCQl9CisJaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0RFUklWRSAmJiBjdHgtPm9wZXJhdGlvbiAhPSBFVlBfUEtFWV9PUF9FTkNSWVBUICYmIGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0RFQ1JZUFQpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX0RFUklWRV9TRVRfUEVFUiwKKwkJCQkJRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVEKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwlyZXQgPSBjdHgtPnBtZXRoLT5jdHJsKGN0eCwgRVZQX1BLRVlfQ1RSTF9QRUVSX0tFWSwgMCwgcGVlcik7CisKKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocmV0ID09IDIpCisJCXJldHVybiAxOworCisJaWYgKCFjdHgtPnBrZXkpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX0RFUklWRV9TRVRfUEVFUiwgRVZQX1JfTk9fS0VZX1NFVCk7CisJCXJldHVybiAtMTsKKwkJfQorCisJaWYgKGN0eC0+cGtleS0+dHlwZSAhPSBwZWVyLT50eXBlKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9ERVJJVkVfU0VUX1BFRVIsCisJCQkJCQlFVlBfUl9ESUZGRVJFTlRfS0VZX1RZUEVTKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwkvKiByYW5AY3J5cHRvY29tLnJ1OiBGb3IgY2xhcml0eS4gIFRoZSBlcnJvciBpcyBpZiBwYXJhbWV0ZXJzIGluIHBlZXIgYXJlCisJICogcHJlc2VudCAoIW1pc3NpbmcpIGJ1dCBkb24ndCBtYXRjaC4gIEVWUF9QS0VZX2NtcF9wYXJhbWV0ZXJzIG1heSByZXR1cm4KKwkgKiAxIChtYXRjaCksIDAgKGRvbid0IG1hdGNoKSBhbmQgLTIgKGNvbXBhcmlzb24gaXMgbm90IGRlZmluZWQpLiAgLTEKKwkgKiAoZGlmZmVyZW50IGtleSB0eXBlcykgaXMgaW1wb3NzaWJsZSBoZXJlIGJlY2F1c2UgaXQgaXMgY2hlY2tlZCBlYXJsaWVyLgorCSAqIC0yIGlzIE9LIGZvciB1cyBoZXJlLCBhcyB3ZWxsIGFzIDEsIHNvIHdlIGNhbiBjaGVjayBmb3IgMCBvbmx5LiAqLworCWlmICghRVZQX1BLRVlfbWlzc2luZ19wYXJhbWV0ZXJzKHBlZXIpICYmCisJCSFFVlBfUEtFWV9jbXBfcGFyYW1ldGVycyhjdHgtPnBrZXksIHBlZXIpKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9ERVJJVkVfU0VUX1BFRVIsCisJCQkJCQlFVlBfUl9ESUZGRVJFTlRfUEFSQU1FVEVSUyk7CisJCXJldHVybiAtMTsKKwkJfQorCisJaWYgKGN0eC0+cGVlcmtleSkKKwkJRVZQX1BLRVlfZnJlZShjdHgtPnBlZXJrZXkpOworCWN0eC0+cGVlcmtleSA9IHBlZXI7CisKKwlyZXQgPSBjdHgtPnBtZXRoLT5jdHJsKGN0eCwgRVZQX1BLRVlfQ1RSTF9QRUVSX0tFWSwgMSwgcGVlcik7CisKKwlpZiAocmV0IDw9IDApCisJCXsKKwkJY3R4LT5wZWVya2V5ID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwkJfQorCisJQ1JZUFRPX2FkZCgmcGVlci0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKwlyZXR1cm4gMTsKKwl9CisKKworaW50IEVWUF9QS0VZX2Rlcml2ZShFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5LCBzaXplX3QgKnBrZXlsZW4pCisJeworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5kZXJpdmUpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX0RFUklWRSwKKwkJCUVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworCQlyZXR1cm4gLTI7CisJCX0KKwlpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfREVSSVZFKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9ERVJJVkUsIEVWUF9SX09QRVJBVE9OX05PVF9JTklUSUFMSVpFRCk7CisJCXJldHVybiAtMTsKKwkJfQorCU1fY2hlY2tfYXV0b2FyZyhjdHgsIGtleSwgcGtleWxlbiwgRVZQX0ZfRVZQX1BLRVlfREVSSVZFKQorCXJldHVybiBjdHgtPnBtZXRoLT5kZXJpdmUoY3R4LCBrZXksIHBrZXlsZW4pOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wbWV0aF9nbi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2V2cC9wbWV0aF9nbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzQxNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BtZXRoX2duLmMKQEAgLTAsMCArMSwyMjAgQEAKKy8qIHBtZXRoX2duLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA2LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKworaW50IEVWUF9QS0VZX3BhcmFtZ2VuX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCWludCByZXQ7CisJaWYgKCFjdHggfHwgIWN0eC0+cG1ldGggfHwgIWN0eC0+cG1ldGgtPnBhcmFtZ2VuKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9QQVJBTUdFTl9JTklULAorCQkJRVZQX1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZVFlQRSk7CisJCXJldHVybiAtMjsKKwkJfQorCWN0eC0+b3BlcmF0aW9uID0gRVZQX1BLRVlfT1BfUEFSQU1HRU47CisJaWYgKCFjdHgtPnBtZXRoLT5wYXJhbWdlbl9pbml0KQorCQlyZXR1cm4gMTsKKwlyZXQgPSBjdHgtPnBtZXRoLT5wYXJhbWdlbl9pbml0KGN0eCk7CisJaWYgKHJldCA8PSAwKQorCQljdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1VOREVGSU5FRDsKKwlyZXR1cm4gcmV0OworCX0KKworaW50IEVWUF9QS0VZX3BhcmFtZ2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqKnBwa2V5KQorCXsKKwlpbnQgcmV0OworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5wYXJhbWdlbikKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfUEFSQU1HRU4sCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJcmV0dXJuIC0yOworCQl9CisKKwlpZiAoY3R4LT5vcGVyYXRpb24gIT0gRVZQX1BLRVlfT1BfUEFSQU1HRU4pCisJCXsKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX1BBUkFNR0VOLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworCQlyZXR1cm4gLTE7CisJCX0KKworCWlmICghcHBrZXkpCisJCXJldHVybiAtMTsKKworCWlmICghKnBwa2V5KQorCQkqcHBrZXkgPSBFVlBfUEtFWV9uZXcoKTsKKworCXJldCA9IGN0eC0+cG1ldGgtPnBhcmFtZ2VuKGN0eCwgKnBwa2V5KTsKKwlpZiAocmV0IDw9IDApCisJCXsKKwkJRVZQX1BLRVlfZnJlZSgqcHBrZXkpOworCQkqcHBrZXkgPSBOVUxMOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBFVlBfUEtFWV9rZXlnZW5faW5pdChFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJaW50IHJldDsKKwlpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+a2V5Z2VuKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9LRVlHRU5fSU5JVCwKKwkJCUVWUF9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworCQlyZXR1cm4gLTI7CisJCX0KKwljdHgtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX0tFWUdFTjsKKwlpZiAoIWN0eC0+cG1ldGgtPmtleWdlbl9pbml0KQorCQlyZXR1cm4gMTsKKwlyZXQgPSBjdHgtPnBtZXRoLT5rZXlnZW5faW5pdChjdHgpOworCWlmIChyZXQgPD0gMCkKKwkJY3R4LT5vcGVyYXRpb24gPSBFVlBfUEtFWV9PUF9VTkRFRklORUQ7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBFVlBfUEtFWV9rZXlnZW4oRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICoqcHBrZXkpCisJeworCWludCByZXQ7CisKKwlpZiAoIWN0eCB8fCAhY3R4LT5wbWV0aCB8fCAhY3R4LT5wbWV0aC0+a2V5Z2VuKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9LRVlHRU4sCisJCQlFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFKTsKKwkJcmV0dXJuIC0yOworCQl9CisJaWYgKGN0eC0+b3BlcmF0aW9uICE9IEVWUF9QS0VZX09QX0tFWUdFTikKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfS0VZR0VOLCBFVlBfUl9PUEVSQVRPTl9OT1RfSU5JVElBTElaRUQpOworCQlyZXR1cm4gLTE7CisJCX0KKworCWlmICghcHBrZXkpCisJCXJldHVybiAtMTsKKworCWlmICghKnBwa2V5KQorCQkqcHBrZXkgPSBFVlBfUEtFWV9uZXcoKTsKKworCXJldCA9IGN0eC0+cG1ldGgtPmtleWdlbihjdHgsICpwcGtleSk7CisJaWYgKHJldCA8PSAwKQorCQl7CisJCUVWUF9QS0VZX2ZyZWUoKnBwa2V5KTsKKwkJKnBwa2V5ID0gTlVMTDsKKwkJfQorCXJldHVybiByZXQ7CisJfQorCit2b2lkIEVWUF9QS0VZX0NUWF9zZXRfY2IoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZX2dlbl9jYiAqY2IpCisJeworCWN0eC0+cGtleV9nZW5jYiA9IGNiOworCX0KKworRVZQX1BLRVlfZ2VuX2NiICpFVlBfUEtFWV9DVFhfZ2V0X2NiKEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gY3R4LT5wa2V5X2dlbmNiOworCX0KKworLyogInRyYW5zbGF0aW9uIGNhbGxiYWNrIiB0byBjYWxsIEVWUF9QS0VZX0NUWCBjYWxsYmFja3MgdXNpbmcgQk5fR0VOQ0IKKyAqIHN0eWxlIGNhbGxiYWNrcy4KKyAqLworCitzdGF0aWMgaW50IHRyYW5zX2NiKGludCBhLCBpbnQgYiwgQk5fR0VOQ0IgKmdjYikKKwl7CisJRVZQX1BLRVlfQ1RYICpjdHggPSBnY2ItPmFyZzsKKwljdHgtPmtleWdlbl9pbmZvWzBdID0gYTsKKwljdHgtPmtleWdlbl9pbmZvWzFdID0gYjsKKwlyZXR1cm4gY3R4LT5wa2V5X2dlbmNiKGN0eCk7CisJfQkKKwordm9pZCBldnBfcGtleV9zZXRfY2JfdHJhbnNsYXRlKEJOX0dFTkNCICpjYiwgRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCUJOX0dFTkNCX3NldChjYiwgdHJhbnNfY2IsIGN0eCkKKwl9CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X2tleWdlbl9pbmZvKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgaWR4KQorCXsKKwlpZiAoaWR4ID09IC0xKQorCQlyZXR1cm4gY3R4LT5rZXlnZW5faW5mb19jb3VudDsgCisJaWYgKGlkeCA8IDAgfHwgaWR4ID4gY3R4LT5rZXlnZW5faW5mb19jb3VudCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGN0eC0+a2V5Z2VuX2luZm9baWR4XTsKKwl9CisKK0VWUF9QS0VZICpFVlBfUEtFWV9uZXdfbWFjX2tleShpbnQgdHlwZSwgRU5HSU5FICplLAorCQkJCXVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbikKKwl7CisJRVZQX1BLRVlfQ1RYICptYWNfY3R4ID0gTlVMTDsKKwlFVlBfUEtFWSAqbWFjX2tleSA9IE5VTEw7CisJbWFjX2N0eCA9IEVWUF9QS0VZX0NUWF9uZXdfaWQodHlwZSwgZSk7CisJaWYgKCFtYWNfY3R4KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoRVZQX1BLRVlfa2V5Z2VuX2luaXQobWFjX2N0eCkgPD0gMCkKKwkJZ290byBtZXJyOworCWlmIChFVlBfUEtFWV9DVFhfY3RybChtYWNfY3R4LCAtMSwgRVZQX1BLRVlfT1BfS0VZR0VOLAorCQkJCUVWUF9QS0VZX0NUUkxfU0VUX01BQ19LRVksIGtleWxlbiwga2V5KSA8PSAwKQorCQlnb3RvIG1lcnI7CisJaWYgKEVWUF9QS0VZX2tleWdlbihtYWNfY3R4LCAmbWFjX2tleSkgPD0gMCkKKwkJZ290byBtZXJyOworCW1lcnI6CisJaWYgKG1hY19jdHgpCisJCUVWUF9QS0VZX0NUWF9mcmVlKG1hY19jdHgpOworCXJldHVybiBtYWNfa2V5OworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9ldnAvcG1ldGhfbGliLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BtZXRoX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZDhkZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXZwL3BtZXRoX2xpYi5jCkBAIC0wLDAgKzEsNTM4IEBACisvKiBwbWV0aF9saWIuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKyNpbmNsdWRlICJhc24xX2xvY2wuaCIKKyNpbmNsdWRlICJldnBfbG9jbC5oIgorCit0eXBlZGVmIGludCBza19jbXBfZm5fdHlwZShjb25zdCBjaGFyICogY29uc3QgKmEsIGNvbnN0IGNoYXIgKiBjb25zdCAqYik7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoRVZQX1BLRVlfTUVUSE9EKQorU1RBQ0tfT0YoRVZQX1BLRVlfTUVUSE9EKSAqYXBwX3BrZXlfbWV0aG9kcyA9IE5VTEw7CisKK2V4dGVybiBjb25zdCBFVlBfUEtFWV9NRVRIT0QgcnNhX3BrZXlfbWV0aCwgZGhfcGtleV9tZXRoLCBkc2FfcGtleV9tZXRoOworZXh0ZXJuIGNvbnN0IEVWUF9QS0VZX01FVEhPRCBlY19wa2V5X21ldGgsIGhtYWNfcGtleV9tZXRoOworCitzdGF0aWMgY29uc3QgRVZQX1BLRVlfTUVUSE9EICpzdGFuZGFyZF9tZXRob2RzW10gPQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkmcnNhX3BrZXlfbWV0aCwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJJmRoX3BrZXlfbWV0aCwKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCSZkc2FfcGtleV9tZXRoLAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKwkmZWNfcGtleV9tZXRoLAorI2VuZGlmCisJJmhtYWNfcGtleV9tZXRoLAorCX07CisKK0RFQ0xBUkVfT0JKX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IEVWUF9QS0VZX01FVEhPRCAqLCBjb25zdCBFVlBfUEtFWV9NRVRIT0QgKiwKKwkJCSAgIHBtZXRoKTsKKworc3RhdGljIGludCBwbWV0aF9jbXAoY29uc3QgRVZQX1BLRVlfTUVUSE9EICogY29uc3QgKmEsCisJCSAgICAgY29uc3QgRVZQX1BLRVlfTUVUSE9EICogY29uc3QgKmIpCisJeworICAgICAgICByZXR1cm4gKCgqYSktPnBrZXlfaWQgLSAoKmIpLT5wa2V5X2lkKTsKKwl9CisKK0lNUExFTUVOVF9PQkpfQlNFQVJDSF9DTVBfRk4oY29uc3QgRVZQX1BLRVlfTUVUSE9EICosIGNvbnN0IEVWUF9QS0VZX01FVEhPRCAqLAorCQkJICAgICBwbWV0aCk7CisKK2NvbnN0IEVWUF9QS0VZX01FVEhPRCAqRVZQX1BLRVlfbWV0aF9maW5kKGludCB0eXBlKQorCXsKKwlFVlBfUEtFWV9NRVRIT0QgdG1wOworCWNvbnN0IEVWUF9QS0VZX01FVEhPRCAqdCA9ICZ0bXAsICoqcmV0OworCXRtcC5wa2V5X2lkID0gdHlwZTsKKwlpZiAoYXBwX3BrZXlfbWV0aG9kcykKKwkJeworCQlpbnQgaWR4OworCQlpZHggPSBza19FVlBfUEtFWV9NRVRIT0RfZmluZChhcHBfcGtleV9tZXRob2RzLCAmdG1wKTsKKwkJaWYgKGlkeCA+PSAwKQorCQkJcmV0dXJuIHNrX0VWUF9QS0VZX01FVEhPRF92YWx1ZShhcHBfcGtleV9tZXRob2RzLCBpZHgpOworCQl9CisJcmV0ID0gT0JKX2JzZWFyY2hfcG1ldGgoJnQsIHN0YW5kYXJkX21ldGhvZHMsCisJCQkgIHNpemVvZihzdGFuZGFyZF9tZXRob2RzKS9zaXplb2YoRVZQX1BLRVlfTUVUSE9EICopKTsKKwlpZiAoIXJldCB8fCAhKnJldCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICpyZXQ7CisJfQorCitzdGF0aWMgRVZQX1BLRVlfQ1RYICppbnRfY3R4X25ldyhFVlBfUEtFWSAqcGtleSwgRU5HSU5FICplLCBpbnQgaWQpCisJeworCUVWUF9QS0VZX0NUWCAqcmV0OworCWNvbnN0IEVWUF9QS0VZX01FVEhPRCAqcG1ldGg7CisJaWYgKGlkID09IC0xKQorCQl7CisJCWlmICghcGtleSB8fCAhcGtleS0+YW1ldGgpCisJCQlyZXR1cm4gTlVMTDsKKwkJaWQgPSBwa2V5LT5hbWV0aC0+cGtleV9pZDsKKwkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCS8qIFRyeSB0byBmaW5kIGFuIEVOR0lORSB3aGljaCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kICovCisJaWYgKGUpCisJCXsKKwkJaWYgKCFFTkdJTkVfaW5pdChlKSkKKwkJCXsKKwkJCUVWUGVycihFVlBfRl9JTlRfQ1RYX05FVyxFUlJfUl9FTkdJTkVfTElCKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJZWxzZQorCQllID0gRU5HSU5FX2dldF9wa2V5X21ldGhfZW5naW5lKGlkKTsKKworCS8qIElmIGFuIEVOR0lORSBoYW5kbGVkIHRoaXMgbWV0aG9kIGxvb2sgaXQgdXAuIE90aGV3aXNlCisJICogdXNlIGludGVybmFsIHRhYmxlcy4KKwkgKi8KKworCWlmIChlKQorCQlwbWV0aCA9IEVOR0lORV9nZXRfcGtleV9tZXRoKGUsIGlkKTsKKwllbHNlCisjZW5kaWYKKwkJcG1ldGggPSBFVlBfUEtFWV9tZXRoX2ZpbmQoaWQpOworCisJaWYgKHBtZXRoID09IE5VTEwpCisJCXsKKwkJRVZQZXJyKEVWUF9GX0lOVF9DVFhfTkVXLEVWUF9SX1VOU1VQUE9SVEVEX0FMR09SSVRITSk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXQgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRVZQX1BLRVlfQ1RYKSk7CisJaWYgKCFyZXQpCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwkJaWYgKGUpCisJCQlFTkdJTkVfZmluaXNoKGUpOworI2VuZGlmCisJCUVWUGVycihFVlBfRl9JTlRfQ1RYX05FVyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCQl9CisJcmV0LT5lbmdpbmUgPSBlOworCXJldC0+cG1ldGggPSBwbWV0aDsKKwlyZXQtPm9wZXJhdGlvbiA9IEVWUF9QS0VZX09QX1VOREVGSU5FRDsKKwlyZXQtPnBrZXkgPSBwa2V5OworCXJldC0+cGVlcmtleSA9IE5VTEw7CisJcmV0LT5wa2V5X2dlbmNiID0gMDsKKwlpZiAocGtleSkKKwkJQ1JZUFRPX2FkZCgmcGtleS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKwlyZXQtPmRhdGEgPSBOVUxMOworCisJaWYgKHBtZXRoLT5pbml0KQorCQl7CisJCWlmIChwbWV0aC0+aW5pdChyZXQpIDw9IDApCisJCQl7CisJCQlFVlBfUEtFWV9DVFhfZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCXJldHVybiByZXQ7CisJfQorCitFVlBfUEtFWV9NRVRIT0QqIEVWUF9QS0VZX21ldGhfbmV3KGludCBpZCwgaW50IGZsYWdzKQorCXsKKwlFVlBfUEtFWV9NRVRIT0QgKnBtZXRoOworCXBtZXRoID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVWUF9QS0VZX01FVEhPRCkpOworCWlmICghcG1ldGgpCisJCXJldHVybiBOVUxMOworCisJcG1ldGgtPnBrZXlfaWQgPSBpZDsKKwlwbWV0aC0+ZmxhZ3MgPSBmbGFncyB8IEVWUF9QS0VZX0ZMQUdfRFlOQU1JQzsKKworCXBtZXRoLT5pbml0ID0gMDsKKwlwbWV0aC0+Y29weSA9IDA7CisJcG1ldGgtPmNsZWFudXAgPSAwOworCXBtZXRoLT5wYXJhbWdlbl9pbml0ID0gMDsKKwlwbWV0aC0+cGFyYW1nZW4gPSAwOworCXBtZXRoLT5rZXlnZW5faW5pdCA9IDA7CisJcG1ldGgtPmtleWdlbiA9IDA7CisJcG1ldGgtPnNpZ25faW5pdCA9IDA7CisJcG1ldGgtPnNpZ24gPSAwOworCXBtZXRoLT52ZXJpZnlfaW5pdCA9IDA7CisJcG1ldGgtPnZlcmlmeSA9IDA7CisJcG1ldGgtPnZlcmlmeV9yZWNvdmVyX2luaXQgPSAwOworCXBtZXRoLT52ZXJpZnlfcmVjb3ZlciA9IDA7CisJcG1ldGgtPnNpZ25jdHhfaW5pdCA9IDA7CisJcG1ldGgtPnNpZ25jdHggPSAwOworCXBtZXRoLT52ZXJpZnljdHhfaW5pdCA9IDA7CisJcG1ldGgtPnZlcmlmeWN0eCA9IDA7CisJcG1ldGgtPmVuY3J5cHRfaW5pdCA9IDA7CisJcG1ldGgtPmVuY3J5cHQgPSAwOworCXBtZXRoLT5kZWNyeXB0X2luaXQgPSAwOworCXBtZXRoLT5kZWNyeXB0ID0gMDsKKwlwbWV0aC0+ZGVyaXZlX2luaXQgPSAwOworCXBtZXRoLT5kZXJpdmUgPSAwOworCXBtZXRoLT5jdHJsID0gMDsKKwlwbWV0aC0+Y3RybF9zdHIgPSAwOworCisJcmV0dXJuIHBtZXRoOworCX0KKwordm9pZCBFVlBfUEtFWV9tZXRoX2ZyZWUoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCkKKwl7CisJaWYgKHBtZXRoICYmIChwbWV0aC0+ZmxhZ3MgJiBFVlBfUEtFWV9GTEFHX0RZTkFNSUMpKQorCQlPUEVOU1NMX2ZyZWUocG1ldGgpOworCX0KKworRVZQX1BLRVlfQ1RYICpFVlBfUEtFWV9DVFhfbmV3KEVWUF9QS0VZICpwa2V5LCBFTkdJTkUgKmUpCisJeworCXJldHVybiBpbnRfY3R4X25ldyhwa2V5LCBlLCAtMSk7CisJfQorCitFVlBfUEtFWV9DVFggKkVWUF9QS0VZX0NUWF9uZXdfaWQoaW50IGlkLCBFTkdJTkUgKmUpCisJeworCXJldHVybiBpbnRfY3R4X25ldyhOVUxMLCBlLCBpZCk7CisJfQorCitFVlBfUEtFWV9DVFggKkVWUF9QS0VZX0NUWF9kdXAoRVZQX1BLRVlfQ1RYICpwY3R4KQorCXsKKwlFVlBfUEtFWV9DVFggKnJjdHg7CisJaWYgKCFwY3R4LT5wbWV0aCB8fCAhcGN0eC0+cG1ldGgtPmNvcHkpCisJCXJldHVybiBOVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCS8qIE1ha2Ugc3VyZSBpdCdzIHNhZmUgdG8gY29weSBhIHBrZXkgY29udGV4dCB1c2luZyBhbiBFTkdJTkUgKi8KKwlpZiAocGN0eC0+ZW5naW5lICYmICFFTkdJTkVfaW5pdChwY3R4LT5lbmdpbmUpKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9DVFhfRFVQLEVSUl9SX0VOR0lORV9MSUIpOworCQlyZXR1cm4gMDsKKwkJfQorI2VuZGlmCisJcmN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfUEtFWV9DVFgpKTsKKwlpZiAoIXJjdHgpCisJCXJldHVybiBOVUxMOworCisJcmN0eC0+cG1ldGggPSBwY3R4LT5wbWV0aDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlyY3R4LT5lbmdpbmUgPSBwY3R4LT5lbmdpbmU7CisjZW5kaWYKKworCWlmIChwY3R4LT5wa2V5KQorCQlDUllQVE9fYWRkKCZwY3R4LT5wa2V5LT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworCisJcmN0eC0+cGtleSA9IHBjdHgtPnBrZXk7CisKKwlpZiAocGN0eC0+cGVlcmtleSkKKwkJQ1JZUFRPX2FkZCgmcGN0eC0+cGVlcmtleS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKworCXJjdHgtPnBlZXJrZXkgPSBwY3R4LT5wZWVya2V5OworCisJcmN0eC0+ZGF0YSA9IE5VTEw7CisJcmN0eC0+YXBwX2RhdGEgPSBOVUxMOworCXJjdHgtPm9wZXJhdGlvbiA9IHBjdHgtPm9wZXJhdGlvbjsKKworCWlmIChwY3R4LT5wbWV0aC0+Y29weShyY3R4LCBwY3R4KSA+IDApCisJCXJldHVybiByY3R4OworCisJRVZQX1BLRVlfQ1RYX2ZyZWUocmN0eCk7CisJcmV0dXJuIE5VTEw7CisKKwl9CisKK2ludCBFVlBfUEtFWV9tZXRoX2FkZDAoY29uc3QgRVZQX1BLRVlfTUVUSE9EICpwbWV0aCkKKwl7CisJaWYgKGFwcF9wa2V5X21ldGhvZHMgPT0gTlVMTCkKKwkJeworCQlhcHBfcGtleV9tZXRob2RzID0gc2tfRVZQX1BLRVlfTUVUSE9EX25ldyhwbWV0aF9jbXApOworCQlpZiAoIWFwcF9wa2V5X21ldGhvZHMpCisJCQlyZXR1cm4gMDsKKwkJfQorCWlmICghc2tfRVZQX1BLRVlfTUVUSE9EX3B1c2goYXBwX3BrZXlfbWV0aG9kcywgcG1ldGgpKQorCQlyZXR1cm4gMDsKKwlza19FVlBfUEtFWV9NRVRIT0Rfc29ydChhcHBfcGtleV9tZXRob2RzKTsKKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgRVZQX1BLRVlfQ1RYX2ZyZWUoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCWlmIChjdHggPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChjdHgtPnBtZXRoICYmIGN0eC0+cG1ldGgtPmNsZWFudXApCisJCWN0eC0+cG1ldGgtPmNsZWFudXAoY3R4KTsKKwlpZiAoY3R4LT5wa2V5KQorCQlFVlBfUEtFWV9mcmVlKGN0eC0+cGtleSk7CisJaWYgKGN0eC0+cGVlcmtleSkKKwkJRVZQX1BLRVlfZnJlZShjdHgtPnBlZXJrZXkpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmKGN0eC0+ZW5naW5lKQorCQkvKiBUaGUgRVZQX1BLRVlfQ1RYIHdlIHVzZWQgYmVsb25ncyB0byBhbiBFTkdJTkUsIHJlbGVhc2UgdGhlCisJCSAqIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIHdlIGhlbGQgZm9yIHRoaXMgcmVhc29uLiAqLworCQlFTkdJTkVfZmluaXNoKGN0eC0+ZW5naW5lKTsKKyNlbmRpZgorCU9QRU5TU0xfZnJlZShjdHgpOworCX0KKworaW50IEVWUF9QS0VZX0NUWF9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQga2V5dHlwZSwgaW50IG9wdHlwZSwKKwkJCQlpbnQgY21kLCBpbnQgcDEsIHZvaWQgKnAyKQorCXsKKwlpbnQgcmV0OworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5jdHJsKQorCQl7CisJCUVWUGVycihFVlBfRl9FVlBfUEtFWV9DVFhfQ1RSTCwgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIC0yOworCQl9CisJaWYgKChrZXl0eXBlICE9IC0xKSAmJiAoY3R4LT5wbWV0aC0+cGtleV9pZCAhPSBrZXl0eXBlKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGN0eC0+b3BlcmF0aW9uID09IEVWUF9QS0VZX09QX1VOREVGSU5FRCkKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfQ1RYX0NUUkwsIEVWUF9SX05PX09QRVJBVElPTl9TRVQpOworCQlyZXR1cm4gLTE7CisJCX0KKworCWlmICgob3B0eXBlICE9IC0xKSAmJiAhKGN0eC0+b3BlcmF0aW9uICYgb3B0eXBlKSkKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfQ1RYX0NUUkwsIEVWUF9SX0lOVkFMSURfT1BFUkFUSU9OKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwlyZXQgPSBjdHgtPnBtZXRoLT5jdHJsKGN0eCwgY21kLCBwMSwgcDIpOworCisJaWYgKHJldCA9PSAtMikKKwkJRVZQZXJyKEVWUF9GX0VWUF9QS0VZX0NUWF9DVFJMLCBFVlBfUl9DT01NQU5EX05PVF9TVVBQT1JURUQpOworCisJcmV0dXJuIHJldDsKKworCX0KKworaW50IEVWUF9QS0VZX0NUWF9jdHJsX3N0cihFVlBfUEtFWV9DVFggKmN0eCwKKwkJCQkJY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCisJeworCWlmICghY3R4IHx8ICFjdHgtPnBtZXRoIHx8ICFjdHgtPnBtZXRoLT5jdHJsX3N0cikKKwkJeworCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfQ1RYX0NUUkxfU1RSLAorCQkJCQkJRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIC0yOworCQl9CisJaWYgKCFzdHJjbXAobmFtZSwgImRpZ2VzdCIpKQorCQl7CisJCWNvbnN0IEVWUF9NRCAqbWQ7CisJCWlmICghdmFsdWUgfHwgIShtZCA9IEVWUF9nZXRfZGlnZXN0YnluYW1lKHZhbHVlKSkpCisJCQl7CisJCQlFVlBlcnIoRVZQX0ZfRVZQX1BLRVlfQ1RYX0NUUkxfU1RSLAorCQkJCQkJRVZQX1JfSU5WQUxJRF9ESUdFU1QpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCXJldHVybiBFVlBfUEtFWV9DVFhfc2V0X3NpZ25hdHVyZV9tZChjdHgsIG1kKTsKKwkJfQorCXJldHVybiBjdHgtPnBtZXRoLT5jdHJsX3N0cihjdHgsIG5hbWUsIHZhbHVlKTsKKwl9CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X29wZXJhdGlvbihFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+b3BlcmF0aW9uOworCX0KKwordm9pZCBFVlBfUEtFWV9DVFhfc2V0MF9rZXlnZW5faW5mbyhFVlBfUEtFWV9DVFggKmN0eCwgaW50ICpkYXQsIGludCBkYXRsZW4pCisJeworCWN0eC0+a2V5Z2VuX2luZm8gPSBkYXQ7CisJY3R4LT5rZXlnZW5faW5mb19jb3VudCA9IGRhdGxlbjsKKwl9CisKK3ZvaWQgRVZQX1BLRVlfQ1RYX3NldF9kYXRhKEVWUF9QS0VZX0NUWCAqY3R4LCB2b2lkICpkYXRhKQorCXsKKwljdHgtPmRhdGEgPSBkYXRhOworCX0KKwordm9pZCAqRVZQX1BLRVlfQ1RYX2dldF9kYXRhKEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gY3R4LT5kYXRhOworCX0KKworRVZQX1BLRVkgKkVWUF9QS0VZX0NUWF9nZXQwX3BrZXkoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPnBrZXk7CisJfQorCitFVlBfUEtFWSAqRVZQX1BLRVlfQ1RYX2dldDBfcGVlcmtleShFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+cGVlcmtleTsKKwl9CisJCit2b2lkIEVWUF9QS0VZX0NUWF9zZXRfYXBwX2RhdGEoRVZQX1BLRVlfQ1RYICpjdHgsIHZvaWQgKmRhdGEpCisJeworCWN0eC0+YXBwX2RhdGEgPSBkYXRhOworCX0KKwordm9pZCAqRVZQX1BLRVlfQ1RYX2dldF9hcHBfZGF0YShFVlBfUEtFWV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+YXBwX2RhdGE7CisJfQorCit2b2lkIEVWUF9QS0VZX21ldGhfc2V0X2luaXQoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCppbml0KShFVlBfUEtFWV9DVFggKmN0eCkpCisJeworCXBtZXRoLT5pbml0ID0gaW5pdDsKKwl9CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfY29weShFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKmNvcHkpKEVWUF9QS0VZX0NUWCAqZHN0LCBFVlBfUEtFWV9DVFggKnNyYykpCisJeworCXBtZXRoLT5jb3B5ID0gY29weTsKKwl9CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfY2xlYW51cChFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCXZvaWQgKCpjbGVhbnVwKShFVlBfUEtFWV9DVFggKmN0eCkpCisJeworCXBtZXRoLT5jbGVhbnVwID0gY2xlYW51cDsKKwl9CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfcGFyYW1nZW4oRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCpwYXJhbWdlbl9pbml0KShFVlBfUEtFWV9DVFggKmN0eCksCisJaW50ICgqcGFyYW1nZW4pKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSkpCisJeworCXBtZXRoLT5wYXJhbWdlbl9pbml0ID0gcGFyYW1nZW5faW5pdDsKKwlwbWV0aC0+cGFyYW1nZW4gPSBwYXJhbWdlbjsKKwl9CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfa2V5Z2VuKEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqa2V5Z2VuX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KSwKKwlpbnQgKCprZXlnZW4pKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGtleSkpCisJeworCXBtZXRoLT5rZXlnZW5faW5pdCA9IGtleWdlbl9pbml0OworCXBtZXRoLT5rZXlnZW4gPSBrZXlnZW47CisJfQorCit2b2lkIEVWUF9QS0VZX21ldGhfc2V0X3NpZ24oRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCpzaWduX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KSwKKwlpbnQgKCpzaWduKShFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJzLCBzaXplX3QgdGJzbGVuKSkKKwl7CisJcG1ldGgtPnNpZ25faW5pdCA9IHNpZ25faW5pdDsKKwlwbWV0aC0+c2lnbiA9IHNpZ247CisJfQorCit2b2lkIEVWUF9QS0VZX21ldGhfc2V0X3ZlcmlmeShFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKnZlcmlmeV9pbml0KShFVlBfUEtFWV9DVFggKmN0eCksCisJaW50ICgqdmVyaWZ5KShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3Qgc2lnbGVuLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pKQorCXsKKwlwbWV0aC0+dmVyaWZ5X2luaXQgPSB2ZXJpZnlfaW5pdDsKKwlwbWV0aC0+dmVyaWZ5ID0gdmVyaWZ5OworCX0KKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF92ZXJpZnlfcmVjb3ZlcihFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKnZlcmlmeV9yZWNvdmVyX2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KSwKKwlpbnQgKCp2ZXJpZnlfcmVjb3ZlcikoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQkJCXVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbikpCisJeworCXBtZXRoLT52ZXJpZnlfcmVjb3Zlcl9pbml0ID0gdmVyaWZ5X3JlY292ZXJfaW5pdDsKKwlwbWV0aC0+dmVyaWZ5X3JlY292ZXIgPSB2ZXJpZnlfcmVjb3ZlcjsKKwl9CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfc2lnbmN0eChFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKnNpZ25jdHhfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpLAorCWludCAoKnNpZ25jdHgpKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCAqc2lnbGVuLAorCQkJCQlFVlBfTURfQ1RYICptY3R4KSkKKwl7CisJcG1ldGgtPnNpZ25jdHhfaW5pdCA9IHNpZ25jdHhfaW5pdDsKKwlwbWV0aC0+c2lnbmN0eCA9IHNpZ25jdHg7CisJfQorCit2b2lkIEVWUF9QS0VZX21ldGhfc2V0X3ZlcmlmeWN0eChFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKnZlcmlmeWN0eF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX01EX0NUWCAqbWN0eCksCisJaW50ICgqdmVyaWZ5Y3R4KShFVlBfUEtFWV9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2lnLGludCBzaWdsZW4sCisJCQkJCUVWUF9NRF9DVFggKm1jdHgpKQorCXsKKwlwbWV0aC0+dmVyaWZ5Y3R4X2luaXQgPSB2ZXJpZnljdHhfaW5pdDsKKwlwbWV0aC0+dmVyaWZ5Y3R4ID0gdmVyaWZ5Y3R4OworCX0KKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9lbmNyeXB0KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqZW5jcnlwdF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCksCisJaW50ICgqZW5jcnlwdGZuKShFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgKm91dGxlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmxlbikpCisJeworCXBtZXRoLT5lbmNyeXB0X2luaXQgPSBlbmNyeXB0X2luaXQ7CisJcG1ldGgtPmVuY3J5cHQgPSBlbmNyeXB0Zm47CisJfQorCit2b2lkIEVWUF9QS0VZX21ldGhfc2V0X2RlY3J5cHQoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCpkZWNyeXB0X2luaXQpKEVWUF9QS0VZX0NUWCAqY3R4KSwKKwlpbnQgKCpkZWNyeXB0KShFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgKm91dGxlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmxlbikpCisJeworCXBtZXRoLT5kZWNyeXB0X2luaXQgPSBkZWNyeXB0X2luaXQ7CisJcG1ldGgtPmRlY3J5cHQgPSBkZWNyeXB0OworCX0KKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9kZXJpdmUoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCpkZXJpdmVfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKmRlcml2ZSkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgc2l6ZV90ICprZXlsZW4pKQorCXsKKwlwbWV0aC0+ZGVyaXZlX2luaXQgPSBkZXJpdmVfaW5pdDsKKwlwbWV0aC0+ZGVyaXZlID0gZGVyaXZlOworCX0KKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9jdHJsKEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqY3RybCkoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKSwKKwlpbnQgKCpjdHJsX3N0cikoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKSkKKwl7CisJcG1ldGgtPmN0cmwgPSBjdHJsOworCXBtZXRoLT5jdHJsX3N0ciA9IGN0cmxfc3RyOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9leF9kYXRhLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXhfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYmM4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vZXhfZGF0YS5jCkBAIC0wLDAgKzEsNjM2IEBACisvKiBjcnlwdG8vZXhfZGF0YS5jICovCisKKy8qCisgKiBPdmVyaGF1bCBub3RlczsKKyAqCisgKiBUaGlzIGNvZGUgaXMgbm93ICptb3N0bHkqIHRocmVhZC1zYWZlLiBJdCBpcyBub3cgZWFzaWVyIHRvIHVuZGVyc3RhbmQgaW4gd2hhdAorICogd2F5cyBpdCBpcyBzYWZlIGFuZCBpbiB3aGF0IHdheXMgaXQgaXMgbm90LCB3aGljaCBpcyBhbiBpbXByb3ZlbWVudC4gRmlyc3RseSwKKyAqIGFsbCBwZXItY2xhc3Mgc3RhY2tzIGFuZCBpbmRleC1jb3VudGVycyBmb3IgZXhfZGF0YSBhcmUgc3RvcmVkIGluIHRoZSBzYW1lCisgKiBnbG9iYWwgTEhBU0ggdGFibGUgKGtleWVkIGJ5IGNsYXNzKS4gVGhpcyBoYXNoIHRhYmxlIHVzZXMgbG9ja2luZyBmb3IgYWxsCisgKiBhY2Nlc3Mgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCksIHdoaWNoIG11c3Qgb25seSBiZQorICogY2FsbGVkIHdoZW4gbm8gb3RoZXIgdGhyZWFkcyBjYW4gcG9zc2libHkgcmFjZSBhZ2FpbnN0IGl0IChldmVuIGlmIGl0IHdhcworICogbG9ja2VkLCB0aGUgcmFjZSB3b3VsZCBtZWFuIGl0J3MgcG9zc2libGUgdGhlIGhhc2ggdGFibGUgbWlnaHQgaGF2ZSBiZWVuCisgKiByZWNyZWF0ZWQgYWZ0ZXIgdGhlIGNsZWFudXApLiBBcyBjbGFzc2VzIGNhbiBvbmx5IGJlIGFkZGVkIHRvIHRoZSBoYXNoIHRhYmxlLAorICogYW5kIHdpdGhpbiBlYWNoIGNsYXNzLCB0aGUgc3RhY2sgb2YgbWV0aG9kcyBjYW4gb25seSBiZSBpbmNyZW1lbnRlZCwgdGhlCisgKiBsb2NraW5nIG1lY2hhbmljcyBhcmUgc2ltcGxlciB0aGFuIHRoZXkgd291bGQgb3RoZXJ3aXNlIGJlLiBGb3IgZXhhbXBsZSwgdGhlCisgKiBuZXcvZHVwL2ZyZWUgZXhfZGF0YSBmdW5jdGlvbnMgd2lsbCBsb2NrIHRoZSBoYXNoIHRhYmxlLCBjb3B5IHRoZSBtZXRob2QKKyAqIHBvaW50ZXJzIGl0IG5lZWRzIGZyb20gdGhlIHJlbGV2YW50IGNsYXNzLCB0aGVuIHVubG9jayB0aGUgaGFzaCB0YWJsZSBiZWZvcmUKKyAqIGFjdHVhbGx5IGFwcGx5aW5nIHRob3NlIG1ldGhvZCBwb2ludGVycyB0byB0aGUgdGFzayBvZiB0aGUgbmV3L2R1cC9mcmVlCisgKiBvcGVyYXRpb25zLiBBcyB0aGV5IGNhbid0IGJlIHJlbW92ZWQgZnJvbSB0aGUgbWV0aG9kLXN0YWNrLCBvbmx5CisgKiBzdXBwbGVtZW50ZWQsIHRoZXJlJ3Mgbm8gcmFjZSBjb25kaXRpb25zIGFzc29jaWF0ZWQgd2l0aCB1c2luZyB0aGVtIG91dHNpZGUKKyAqIHRoZSBsb2NrLiBUaGUgZ2V0L3NldF9leF9kYXRhIGZ1bmN0aW9ucyBhcmUgbm90IGxvY2tlZCBiZWNhdXNlIHRoZXkgZG8gbm90CisgKiBpbnZvbHZlIHRoaXMgZ2xvYmFsIHN0YXRlIGF0IGFsbCAtIHRoZXkgb3BlcmF0ZSBkaXJlY3RseSB3aXRoIGEgcHJldmlvdXNseQorICogb2J0YWluZWQgcGVyLWNsYXNzIG1ldGhvZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyICJleF9kYXRhIiB2YXJpYWJsZS4gVGhlc2UKKyAqIHZhcmlhYmxlcyBhcmUgdXN1YWxseSBpbnN0YW50aWF0ZWQgcGVyLWNvbnRleHQgKGVnLiBlYWNoIFJTQSBzdHJ1Y3R1cmUgaGFzCisgKiBvbmUpIHNvIGxvY2tpbmcgb24gcmVhZC93cml0ZSBhY2Nlc3MgdG8gdGhhdCB2YXJpYWJsZSBjYW4gYmUgbG9ja2VkIGxvY2FsbHkKKyAqIGlmIHJlcXVpcmVkIChlZy4gdXNpbmcgdGhlICJSU0EiIGxvY2sgdG8gc3luY2hyb25pc2UgYWNjZXNzIHRvIGEKKyAqIHBlci1SU0Etc3RydWN0dXJlIGV4X2RhdGEgdmFyaWFibGUgaWYgcmVxdWlyZWQpLgorICogW0dlb2ZmXQorICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisKKy8qIFdoYXQgYW4gImltcGxlbWVudGF0aW9uIG9mIGV4X2RhdGEgZnVuY3Rpb25hbGl0eSIgbG9va3MgbGlrZSAqLworc3RydWN0IHN0X0NSWVBUT19FWF9EQVRBX0lNUEwKKwl7CisJLyoqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBHTE9CQUwgT1BFUkFUSU9OUyAqLworCS8qIFJldHVybiBhIG5ldyBjbGFzcyBpbmRleCAqLworCWludCAoKmNiX25ld19jbGFzcykodm9pZCk7CisJLyogQ2xlYW51cCBhbGwgc3RhdGUgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gKi8KKwl2b2lkICgqY2JfY2xlYW51cCkodm9pZCk7CisJLyoqKioqKioqKioqKioqKioqKioqKioqKi8KKwkvKiBQRVItQ0xBU1MgT1BFUkFUSU9OUyAqLworCS8qIEdldCBhIG5ldyBtZXRob2QgaW5kZXggd2l0aGluIGEgY2xhc3MgKi8KKwlpbnQgKCpjYl9nZXRfbmV3X2luZGV4KShpbnQgY2xhc3NfaW5kZXgsIGxvbmcgYXJnbCwgdm9pZCAqYXJncCwKKwkJCUNSWVBUT19FWF9uZXcgKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKKwkJCUNSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworCS8qIEluaXRpYWxpc2UgYSBuZXcgQ1JZUFRPX0VYX0RBVEEgb2YgYSBnaXZlbiBjbGFzcyAqLworCWludCAoKmNiX25ld19leF9kYXRhKShpbnQgY2xhc3NfaW5kZXgsIHZvaWQgKm9iaiwKKwkJCUNSWVBUT19FWF9EQVRBICphZCk7CisJLyogRHVwbGljYXRlIGEgQ1JZUFRPX0VYX0RBVEEgb2YgYSBnaXZlbiBjbGFzcyBvbnRvIGEgY29weSAqLworCWludCAoKmNiX2R1cF9leF9kYXRhKShpbnQgY2xhc3NfaW5kZXgsIENSWVBUT19FWF9EQVRBICp0bywKKwkJCUNSWVBUT19FWF9EQVRBICpmcm9tKTsKKwkvKiBDbGVhbnVwIGEgQ1JZUFRPX0VYX0RBVEEgb2YgYSBnaXZlbiBjbGFzcyAqLworCXZvaWQgKCpjYl9mcmVlX2V4X2RhdGEpKGludCBjbGFzc19pbmRleCwgdm9pZCAqb2JqLAorCQkJQ1JZUFRPX0VYX0RBVEEgKmFkKTsKKwl9OworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gd2UgdXNlIGF0IHJ1bi10aW1lICovCitzdGF0aWMgY29uc3QgQ1JZUFRPX0VYX0RBVEFfSU1QTCAqaW1wbCA9IE5VTEw7CisKKy8qIFRvIGNhbGwgImltcGwiIGZ1bmN0aW9ucywgdXNlIHRoaXMgbWFjcm8gcmF0aGVyIHRoYW4gcmVmZXJyaW5nIHRvICdpbXBsJyBkaXJlY3RseSwgZWcuCisgKiBFWF9JTVBMKGdldF9uZXdfaW5kZXgpKC4uLik7ICovCisjZGVmaW5lIEVYX0lNUEwoYSkgaW1wbC0+Y2JfIyNhCisKKy8qIFByZWRlY2xhcmUgdGhlICJkZWZhdWx0IiBleF9kYXRhIGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgaW50IGludF9uZXdfY2xhc3Modm9pZCk7CitzdGF0aWMgdm9pZCBpbnRfY2xlYW51cCh2b2lkKTsKK3N0YXRpYyBpbnQgaW50X2dldF9uZXdfaW5kZXgoaW50IGNsYXNzX2luZGV4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsCisJCUNSWVBUT19FWF9uZXcgKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKKwkJQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitzdGF0aWMgaW50IGludF9uZXdfZXhfZGF0YShpbnQgY2xhc3NfaW5kZXgsIHZvaWQgKm9iaiwKKwkJQ1JZUFRPX0VYX0RBVEEgKmFkKTsKK3N0YXRpYyBpbnQgaW50X2R1cF9leF9kYXRhKGludCBjbGFzc19pbmRleCwgQ1JZUFRPX0VYX0RBVEEgKnRvLAorCQlDUllQVE9fRVhfREFUQSAqZnJvbSk7CitzdGF0aWMgdm9pZCBpbnRfZnJlZV9leF9kYXRhKGludCBjbGFzc19pbmRleCwgdm9pZCAqb2JqLAorCQlDUllQVE9fRVhfREFUQSAqYWQpOworc3RhdGljIENSWVBUT19FWF9EQVRBX0lNUEwgaW1wbF9kZWZhdWx0ID0KKwl7CisJaW50X25ld19jbGFzcywKKwlpbnRfY2xlYW51cCwKKwlpbnRfZ2V0X25ld19pbmRleCwKKwlpbnRfbmV3X2V4X2RhdGEsCisJaW50X2R1cF9leF9kYXRhLAorCWludF9mcmVlX2V4X2RhdGEKKwl9OworCisvKiBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IGNoZWNrcyB3aGV0aGVyICJpbXBsIiBpcyBzZXQgYW5kIGlmIG5vdCwgc2V0cyBpdCB0bworICogdGhlIGRlZmF1bHQuICovCitzdGF0aWMgdm9pZCBpbXBsX2NoZWNrKHZvaWQpCisJeworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVhfREFUQSk7CisJaWYoIWltcGwpCisJCWltcGwgPSAmaW1wbF9kZWZhdWx0OworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKwl9CisvKiBBIG1hY3JvIHdyYXBwZXIgZm9yIGltcGxfY2hlY2sgdGhhdCBmaXJzdCB1c2VzIGEgbm9uLWxvY2tlZCB0ZXN0IGJlZm9yZQorICogaW52b2tpbmcgdGhlIGZ1bmN0aW9uICh3aGljaCBjaGVja3MgYWdhaW4gaW5zaWRlIGEgbG9jaykuICovCisjZGVmaW5lIElNUExfQ0hFQ0sgaWYoIWltcGwpIGltcGxfY2hlY2soKTsKKworLyogQVBJIGZ1bmN0aW9ucyB0byBnZXQvc2V0IHRoZSAiZXhfZGF0YSIgaW1wbGVtZW50YXRpb24gKi8KK2NvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKkNSWVBUT19nZXRfZXhfZGF0YV9pbXBsZW1lbnRhdGlvbih2b2lkKQorCXsKKwlJTVBMX0NIRUNLCisJcmV0dXJuIGltcGw7CisJfQoraW50IENSWVBUT19zZXRfZXhfZGF0YV9pbXBsZW1lbnRhdGlvbihjb25zdCBDUllQVE9fRVhfREFUQV9JTVBMICppKQorCXsKKwlpbnQgdG9yZXQgPSAwOworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfRVhfREFUQSk7CisJaWYoIWltcGwpCisJCXsKKwkJaW1wbCA9IGk7CisJCXRvcmV0ID0gMTsKKwkJfQorCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKwlyZXR1cm4gdG9yZXQ7CisJfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEludGVyYWwgKGRlZmF1bHQpIGltcGxlbWVudGF0aW9uIG9mICJleF9kYXRhIiBzdXBwb3J0LiBBUEkgZnVuY3Rpb25zIGFyZQorICogZnVydGhlciBkb3duLiAqLworCisvKiBUaGUgdHlwZSB0aGF0IHJlcHJlc2VudHMgd2hhdCBlYWNoICJjbGFzcyIgdXNlZCB0byBpbXBsZW1lbnQgbG9jYWxseS4gQSBTVEFDSworICogb2YgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgcGx1cyBhIGluZGV4LWNvdW50ZXIuIFRoZSAnY2xhc3NfaW5kZXgnIGlzIHRoZSBnbG9iYWwKKyAqIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGl0ZW1zLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc3RfZXhfY2xhc3NfaXRlbSB7CisJaW50IGNsYXNzX2luZGV4OworCVNUQUNLX09GKENSWVBUT19FWF9EQVRBX0ZVTkNTKSAqbWV0aDsKKwlpbnQgbWV0aF9udW07Cit9IEVYX0NMQVNTX0lURU07CisKKy8qIFdoZW4gYXNzaWduaW5nIG5ldyBjbGFzcyBpbmRleGVzLCB0aGlzIGlzIG91ciBjb3VudGVyICovCitzdGF0aWMgaW50IGV4X2NsYXNzID0gQ1JZUFRPX0VYX0lOREVYX1VTRVI7CisKKy8qIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBvZiBFWF9DTEFTU19JVEVNIGl0ZW1zICovCitERUNMQVJFX0xIQVNIX09GKEVYX0NMQVNTX0lURU0pOworc3RhdGljIExIQVNIX09GKEVYX0NMQVNTX0lURU0pICpleF9kYXRhID0gTlVMTDsKKworLyogVGhlIGNhbGxiYWNrcyByZXF1aXJlZCBpbiB0aGUgImV4X2RhdGEiIGhhc2ggdGFibGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV4X2NsYXNzX2l0ZW1faGFzaChjb25zdCBFWF9DTEFTU19JVEVNICphKQorCXsKKwlyZXR1cm4gYS0+Y2xhc3NfaW5kZXg7CisJfQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9IQVNIX0ZOKGV4X2NsYXNzX2l0ZW0sIEVYX0NMQVNTX0lURU0pCisKK3N0YXRpYyBpbnQgZXhfY2xhc3NfaXRlbV9jbXAoY29uc3QgRVhfQ0xBU1NfSVRFTSAqYSwgY29uc3QgRVhfQ0xBU1NfSVRFTSAqYikKKwl7CisJcmV0dXJuIGEtPmNsYXNzX2luZGV4IC0gYi0+Y2xhc3NfaW5kZXg7CisJfQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9DT01QX0ZOKGV4X2NsYXNzX2l0ZW0sIEVYX0NMQVNTX0lURU0pCisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSAiaW1wbF9kZWZhdWx0IiBpbXBsZW1lbnRhdGlvbiB0byBhY2Nlc3MgdGhlCisgKiBzdGF0ZSAqLworCitzdGF0aWMgaW50IGV4X2RhdGFfY2hlY2sodm9pZCkKKwl7CisJaW50IHRvcmV0ID0gMTsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworCWlmKCFleF9kYXRhCisJICAgJiYgKGV4X2RhdGEgPSBsaF9FWF9DTEFTU19JVEVNX25ldygpKSA9PSBOVUxMKQorCQl0b3JldCA9IDA7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworCXJldHVybiB0b3JldDsKKwl9CisvKiBUaGlzIG1hY3JvcyBoZWxwcyByZWR1Y2UgdGhlIGxvY2tpbmcgZnJvbSByZXBlYXRlZCBjaGVja3MgYmVjYXVzZSB0aGUKKyAqIGV4X2RhdGFfY2hlY2soKSBmdW5jdGlvbiBjaGVja3MgZXhfZGF0YSBhZ2FpbiBpbnNpZGUgYSBsb2NrLiAqLworI2RlZmluZSBFWF9EQVRBX0NIRUNLKGlmZmFpbCkgaWYoIWV4X2RhdGEgJiYgIWV4X2RhdGFfY2hlY2soKSkge2lmZmFpbH0KKworLyogVGhpcyAiaW5uZXIiIGNhbGxiYWNrIGlzIHVzZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgZm9sbG93cyBpdCAqLworc3RhdGljIHZvaWQgZGVmX2NsZWFudXBfdXRpbF9jYihDUllQVE9fRVhfREFUQV9GVU5DUyAqZnVuY3MpCisJeworCU9QRU5TU0xfZnJlZShmdW5jcyk7CisJfQorCisvKiBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgaW4gbGhfZG9hbGwgdG8gZGVzdHJveSBhbGwgRVhfQ0xBU1NfSVRFTSB2YWx1ZXMgZnJvbQorICogImV4X2RhdGEiIHByaW9yIHRvIHRoZSBleF9kYXRhIGhhc2ggdGFibGUgYmVpbmcgaXRzZWxmIGRlc3Ryb3llZC4gRG9lc24ndCBkbworICogYW55IGxvY2tpbmcuICovCitzdGF0aWMgdm9pZCBkZWZfY2xlYW51cF9jYih2b2lkICphX3ZvaWQpCisJeworCUVYX0NMQVNTX0lURU0gKml0ZW0gPSAoRVhfQ0xBU1NfSVRFTSAqKWFfdm9pZDsKKwlza19DUllQVE9fRVhfREFUQV9GVU5DU19wb3BfZnJlZShpdGVtLT5tZXRoLCBkZWZfY2xlYW51cF91dGlsX2NiKTsKKwlPUEVOU1NMX2ZyZWUoaXRlbSk7CisJfQorCisvKiBSZXR1cm4gdGhlIEVYX0NMQVNTX0lURU0gZnJvbSB0aGUgImV4X2RhdGEiIGhhc2ggdGFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBhCisgKiBnaXZlbiBjbGFzcy4gSGFuZGxlcyBsb2NraW5nLiAqLworc3RhdGljIEVYX0NMQVNTX0lURU0gKmRlZl9nZXRfY2xhc3MoaW50IGNsYXNzX2luZGV4KQorCXsKKwlFWF9DTEFTU19JVEVNIGQsICpwLCAqZ2VuOworCUVYX0RBVEFfQ0hFQ0socmV0dXJuIE5VTEw7KQorCWQuY2xhc3NfaW5kZXggPSBjbGFzc19pbmRleDsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworCXAgPSBsaF9FWF9DTEFTU19JVEVNX3JldHJpZXZlKGV4X2RhdGEsICZkKTsKKwlpZighcCkKKwkJeworCQlnZW4gPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoRVhfQ0xBU1NfSVRFTSkpOworCQlpZihnZW4pCisJCQl7CisJCQlnZW4tPmNsYXNzX2luZGV4ID0gY2xhc3NfaW5kZXg7CisJCQlnZW4tPm1ldGhfbnVtID0gMDsKKwkJCWdlbi0+bWV0aCA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX25ld19udWxsKCk7CisJCQlpZighZ2VuLT5tZXRoKQorCQkJCU9QRU5TU0xfZnJlZShnZW4pOworCQkJZWxzZQorCQkJCXsKKwkJCQkvKiBCZWNhdXNlIHdlJ3JlIGluc2lkZSB0aGUgZXhfZGF0YSBsb2NrLCB0aGUKKwkJCQkgKiByZXR1cm4gdmFsdWUgZnJvbSB0aGUgaW5zZXJ0IHdpbGwgYmUgTlVMTCAqLworCQkJCSh2b2lkKWxoX0VYX0NMQVNTX0lURU1faW5zZXJ0KGV4X2RhdGEsIGdlbik7CisJCQkJcCA9IGdlbjsKKwkJCQl9CisJCQl9CisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVhfREFUQSk7CisJaWYoIXApCisJCUNSWVBUT2VycihDUllQVE9fRl9ERUZfR0VUX0NMQVNTLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlyZXR1cm4gcDsKKwl9CisKKy8qIEFkZCBhIG5ldyBtZXRob2QgdG8gdGhlIGdpdmVuIEVYX0NMQVNTX0lURU0gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZworICogaW5kZXggKG9yIC0xIGZvciBlcnJvcikuIEhhbmRsZXMgbG9ja2luZy4gKi8KK3N0YXRpYyBpbnQgZGVmX2FkZF9pbmRleChFWF9DTEFTU19JVEVNICppdGVtLCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsCisJCUNSWVBUT19FWF9uZXcgKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKKwkJQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKwl7CisJaW50IHRvcmV0ID0gLTE7CisJQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKmEgPSAoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKilPUEVOU1NMX21hbGxvYygKKwkJCQkJc2l6ZW9mKENSWVBUT19FWF9EQVRBX0ZVTkNTKSk7CisJaWYoIWEpCisJCXsKKwkJQ1JZUFRPZXJyKENSWVBUT19GX0RFRl9BRERfSU5ERVgsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gLTE7CisJCX0KKwlhLT5hcmdsPWFyZ2w7CisJYS0+YXJncD1hcmdwOworCWEtPm5ld19mdW5jPW5ld19mdW5jOworCWEtPmR1cF9mdW5jPWR1cF9mdW5jOworCWEtPmZyZWVfZnVuYz1mcmVlX2Z1bmM7CisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKwl3aGlsZSAoc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfbnVtKGl0ZW0tPm1ldGgpIDw9IGl0ZW0tPm1ldGhfbnVtKQorCQl7CisJCWlmICghc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcHVzaChpdGVtLT5tZXRoLCBOVUxMKSkKKwkJCXsKKwkJCUNSWVBUT2VycihDUllQVE9fRl9ERUZfQUREX0lOREVYLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCU9QRU5TU0xfZnJlZShhKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJdG9yZXQgPSBpdGVtLT5tZXRoX251bSsrOworCSh2b2lkKXNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3NldChpdGVtLT5tZXRoLCB0b3JldCwgYSk7CitlcnI6CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworCXJldHVybiB0b3JldDsKKwl9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBmdW5jdGlvbnMgaW4gdGhlIGRlZmF1bHQgQ1JZUFRPX0VYX0RBVEFfSU1QTCBzdHJ1Y3R1cmUgKi8KKworc3RhdGljIGludCBpbnRfbmV3X2NsYXNzKHZvaWQpCisJeworCWludCB0b3JldDsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworCXRvcmV0ID0gZXhfY2xhc3MrKzsKKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfRVhfREFUQSk7CisJcmV0dXJuIHRvcmV0OworCX0KKworc3RhdGljIHZvaWQgaW50X2NsZWFudXAodm9pZCkKKwl7CisJRVhfREFUQV9DSEVDSyhyZXR1cm47KQorCWxoX0VYX0NMQVNTX0lURU1fZG9hbGwoZXhfZGF0YSwgZGVmX2NsZWFudXBfY2IpOworCWxoX0VYX0NMQVNTX0lURU1fZnJlZShleF9kYXRhKTsKKwlleF9kYXRhID0gTlVMTDsKKwlpbXBsID0gTlVMTDsKKwl9CisKK3N0YXRpYyBpbnQgaW50X2dldF9uZXdfaW5kZXgoaW50IGNsYXNzX2luZGV4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsCisJCUNSWVBUT19FWF9uZXcgKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKKwkJQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKwl7CisJRVhfQ0xBU1NfSVRFTSAqaXRlbSA9IGRlZl9nZXRfY2xhc3MoY2xhc3NfaW5kZXgpOworCWlmKCFpdGVtKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGRlZl9hZGRfaW5kZXgoaXRlbSwgYXJnbCwgYXJncCwgbmV3X2Z1bmMsIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworCX0KKworLyogVGhyZWFkLXNhZmUgYnkgY29weWluZyBhIGNsYXNzJ3MgYXJyYXkgb2YgIkNSWVBUT19FWF9EQVRBX0ZVTkNTIiBlbnRyaWVzIGluCisgKiB0aGUgbG9jaywgdGhlbiB1c2luZyB0aGVtIG91dHNpZGUgdGhlIGxvY2suIE5COiBUaHJlYWQtc2FmZXR5IG9ubHkgYXBwbGllcyB0bworICogdGhlIGdsb2JhbCAiZXhfZGF0YSIgc3RhdGUgKGllLiBjbGFzcyBkZWZpbml0aW9ucyksIG5vdCB0aHJlYWQtc2FmZSBvbiAnYWQnCisgKiBpdHNlbGYuICovCitzdGF0aWMgaW50IGludF9uZXdfZXhfZGF0YShpbnQgY2xhc3NfaW5kZXgsIHZvaWQgKm9iaiwKKwkJQ1JZUFRPX0VYX0RBVEEgKmFkKQorCXsKKwlpbnQgbXgsaTsKKwl2b2lkICpwdHI7CisJQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKipzdG9yYWdlID0gTlVMTDsKKwlFWF9DTEFTU19JVEVNICppdGVtID0gZGVmX2dldF9jbGFzcyhjbGFzc19pbmRleCk7CisJaWYoIWl0ZW0pCisJCS8qIGVycm9yIGlzIGFscmVhZHkgc2V0ICovCisJCXJldHVybiAwOworCWFkLT5zayA9IE5VTEw7CisJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKwlteCA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShpdGVtLT5tZXRoKTsKKwlpZihteCA+IDApCisJCXsKKwkJc3RvcmFnZSA9IE9QRU5TU0xfbWFsbG9jKG14ICogc2l6ZW9mKENSWVBUT19FWF9EQVRBX0ZVTkNTKikpOworCQlpZighc3RvcmFnZSkKKwkJCWdvdG8gc2tpcDsKKwkJZm9yKGkgPSAwOyBpIDwgbXg7IGkrKykKKwkJCXN0b3JhZ2VbaV0gPSBza19DUllQVE9fRVhfREFUQV9GVU5DU192YWx1ZShpdGVtLT5tZXRoLGkpOworCQl9Citza2lwOgorCUNSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKwlpZigobXggPiAwKSAmJiAhc3RvcmFnZSkKKwkJeworCQlDUllQVE9lcnIoQ1JZUFRPX0ZfSU5UX05FV19FWF9EQVRBLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlmb3IoaSA9IDA7IGkgPCBteDsgaSsrKQorCQl7CisJCWlmKHN0b3JhZ2VbaV0gJiYgc3RvcmFnZVtpXS0+bmV3X2Z1bmMpCisJCQl7CisJCQlwdHIgPSBDUllQVE9fZ2V0X2V4X2RhdGEoYWQsIGkpOworCQkJc3RvcmFnZVtpXS0+bmV3X2Z1bmMob2JqLHB0cixhZCxpLAorCQkJCXN0b3JhZ2VbaV0tPmFyZ2wsc3RvcmFnZVtpXS0+YXJncCk7CisJCQl9CisJCX0KKwlpZihzdG9yYWdlKQorCQlPUEVOU1NMX2ZyZWUoc3RvcmFnZSk7CisJcmV0dXJuIDE7CisJfQorCisvKiBTYW1lIHRocmVhZC1zYWZldHkgbm90ZXMgYXMgZm9yICJpbnRfbmV3X2V4X2RhdGEiICovCitzdGF0aWMgaW50IGludF9kdXBfZXhfZGF0YShpbnQgY2xhc3NfaW5kZXgsIENSWVBUT19FWF9EQVRBICp0bywKKwkJQ1JZUFRPX0VYX0RBVEEgKmZyb20pCisJeworCWludCBteCwgaiwgaTsKKwljaGFyICpwdHI7CisJQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKipzdG9yYWdlID0gTlVMTDsKKwlFWF9DTEFTU19JVEVNICppdGVtOworCWlmKCFmcm9tLT5zaykKKwkJLyogJ3RvJyBzaG91bGQgYmUgImJsYW5rIiB3aGljaCAqaXMqIGp1c3QgbGlrZSAnZnJvbScgKi8KKwkJcmV0dXJuIDE7CisJaWYoKGl0ZW0gPSBkZWZfZ2V0X2NsYXNzKGNsYXNzX2luZGV4KSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKwlteCA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShpdGVtLT5tZXRoKTsKKwlqID0gc2tfdm9pZF9udW0oZnJvbS0+c2spOworCWlmKGogPCBteCkKKwkJbXggPSBqOworCWlmKG14ID4gMCkKKwkJeworCQlzdG9yYWdlID0gT1BFTlNTTF9tYWxsb2MobXggKiBzaXplb2YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MqKSk7CisJCWlmKCFzdG9yYWdlKQorCQkJZ290byBza2lwOworCQlmb3IoaSA9IDA7IGkgPCBteDsgaSsrKQorCQkJc3RvcmFnZVtpXSA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3ZhbHVlKGl0ZW0tPm1ldGgsaSk7CisJCX0KK3NraXA6CisJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX0VYX0RBVEEpOworCWlmKChteCA+IDApICYmICFzdG9yYWdlKQorCQl7CisJCUNSWVBUT2VycihDUllQVE9fRl9JTlRfRFVQX0VYX0RBVEEsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCWZvcihpID0gMDsgaSA8IG14OyBpKyspCisJCXsKKwkJcHRyID0gQ1JZUFRPX2dldF9leF9kYXRhKGZyb20sIGkpOworCQlpZihzdG9yYWdlW2ldICYmIHN0b3JhZ2VbaV0tPmR1cF9mdW5jKQorCQkJc3RvcmFnZVtpXS0+ZHVwX2Z1bmModG8sZnJvbSwmcHRyLGksCisJCQkJc3RvcmFnZVtpXS0+YXJnbCxzdG9yYWdlW2ldLT5hcmdwKTsKKwkJQ1JZUFRPX3NldF9leF9kYXRhKHRvLGkscHRyKTsKKwkJfQorCWlmKHN0b3JhZ2UpCisJCU9QRU5TU0xfZnJlZShzdG9yYWdlKTsKKwlyZXR1cm4gMTsKKwl9CisKKy8qIFNhbWUgdGhyZWFkLXNhZmV0eSBub3RlcyBhcyBmb3IgImludF9uZXdfZXhfZGF0YSIgKi8KK3N0YXRpYyB2b2lkIGludF9mcmVlX2V4X2RhdGEoaW50IGNsYXNzX2luZGV4LCB2b2lkICpvYmosCisJCUNSWVBUT19FWF9EQVRBICphZCkKKwl7CisJaW50IG14LGk7CisJRVhfQ0xBU1NfSVRFTSAqaXRlbTsKKwl2b2lkICpwdHI7CisJQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgKipzdG9yYWdlID0gTlVMTDsKKwlpZigoaXRlbSA9IGRlZl9nZXRfY2xhc3MoY2xhc3NfaW5kZXgpKSA9PSBOVUxMKQorCQlyZXR1cm47CisJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKwlteCA9IHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX251bShpdGVtLT5tZXRoKTsKKwlpZihteCA+IDApCisJCXsKKwkJc3RvcmFnZSA9IE9QRU5TU0xfbWFsbG9jKG14ICogc2l6ZW9mKENSWVBUT19FWF9EQVRBX0ZVTkNTKikpOworCQlpZighc3RvcmFnZSkKKwkJCWdvdG8gc2tpcDsKKwkJZm9yKGkgPSAwOyBpIDwgbXg7IGkrKykKKwkJCXN0b3JhZ2VbaV0gPSBza19DUllQVE9fRVhfREFUQV9GVU5DU192YWx1ZShpdGVtLT5tZXRoLGkpOworCQl9Citza2lwOgorCUNSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19FWF9EQVRBKTsKKwlpZigobXggPiAwKSAmJiAhc3RvcmFnZSkKKwkJeworCQlDUllQVE9lcnIoQ1JZUFRPX0ZfSU5UX0ZSRUVfRVhfREFUQSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybjsKKwkJfQorCWZvcihpID0gMDsgaSA8IG14OyBpKyspCisJCXsKKwkJaWYoc3RvcmFnZVtpXSAmJiBzdG9yYWdlW2ldLT5mcmVlX2Z1bmMpCisJCQl7CisJCQlwdHIgPSBDUllQVE9fZ2V0X2V4X2RhdGEoYWQsaSk7CisJCQlzdG9yYWdlW2ldLT5mcmVlX2Z1bmMob2JqLHB0cixhZCxpLAorCQkJCXN0b3JhZ2VbaV0tPmFyZ2wsc3RvcmFnZVtpXS0+YXJncCk7CisJCQl9CisJCX0KKwlpZihzdG9yYWdlKQorCQlPUEVOU1NMX2ZyZWUoc3RvcmFnZSk7CisJaWYoYWQtPnNrKQorCQl7CisJCXNrX3ZvaWRfZnJlZShhZC0+c2spOworCQlhZC0+c2s9TlVMTDsKKwkJfQorCX0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQVBJIGZ1bmN0aW9ucyB0aGF0IGRlZmVyIGFsbCAic3RhdGUiIG9wZXJhdGlvbnMgdG8gdGhlICJleF9kYXRhIgorICogaW1wbGVtZW50YXRpb24gd2UgaGF2ZSBzZXQuICovCisKKy8qIE9idGFpbiBhbiBpbmRleCBmb3IgYSBuZXcgY2xhc3MgKG5vdCB0aGUgc2FtZSBhcyBnZXR0aW5nIGEgbmV3IGluZGV4IHdpdGhpbgorICogYW4gZXhpc3RpbmcgY2xhc3MgLSB0aGlzIGlzIGFjdHVhbGx5IGdldHRpbmcgYSBuZXcgKmNsYXNzKikgKi8KK2ludCBDUllQVE9fZXhfZGF0YV9uZXdfY2xhc3Modm9pZCkKKwl7CisJSU1QTF9DSEVDSworCXJldHVybiBFWF9JTVBMKG5ld19jbGFzcykoKTsKKwl9CisKKy8qIFJlbGVhc2UgYWxsICJleF9kYXRhIiBzdGF0ZSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4gVGhpcyBjYW4ndCBiZSBtYWRlCisgKiB0aHJlYWQtc2FmZSB3aXRob3V0IG92ZXJoYXVsaW5nIGEgbG90IG9mIHN0dWZmLCBhbmQgc2hvdWxkbid0IHJlYWxseSBiZQorICogY2FsbGVkIHVuZGVyIHBvdGVudGlhbCByYWNlLWNvbmRpdGlvbnMgYW55d2F5IChpdCdzIGZvciBwcm9ncmFtIHNodXRkb3duCisgKiBhZnRlciBhbGwpLiAqLwordm9pZCBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSh2b2lkKQorCXsKKwlJTVBMX0NIRUNLCisJRVhfSU1QTChjbGVhbnVwKSgpOworCX0KKworLyogSW5zaWRlIGFuIGV4aXN0aW5nIGNsYXNzLCBnZXQvcmVnaXN0ZXIgYSBuZXcgaW5kZXguICovCitpbnQgQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoaW50IGNsYXNzX2luZGV4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsCisJCUNSWVBUT19FWF9uZXcgKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKKwkJQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKwl7CisJaW50IHJldCA9IC0xOworCisJSU1QTF9DSEVDSworCXJldCA9IEVYX0lNUEwoZ2V0X25ld19pbmRleCkoY2xhc3NfaW5kZXgsCisJCQlhcmdsLCBhcmdwLCBuZXdfZnVuYywgZHVwX2Z1bmMsIGZyZWVfZnVuYyk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIEluaXRpYWxpc2UgYSBuZXcgQ1JZUFRPX0VYX0RBVEEgZm9yIHVzZSBpbiBhIHBhcnRpY3VsYXIgY2xhc3MgLSBpbmNsdWRpbmcKKyAqIGNhbGxpbmcgbmV3KCkgY2FsbGJhY2tzIGZvciBlYWNoIGluZGV4IGluIHRoZSBjbGFzcyB1c2VkIGJ5IHRoaXMgdmFyaWFibGUgKi8KK2ludCBDUllQVE9fbmV3X2V4X2RhdGEoaW50IGNsYXNzX2luZGV4LCB2b2lkICpvYmosIENSWVBUT19FWF9EQVRBICphZCkKKwl7CisJSU1QTF9DSEVDSworCXJldHVybiBFWF9JTVBMKG5ld19leF9kYXRhKShjbGFzc19pbmRleCwgb2JqLCBhZCk7CisJfQorCisvKiBEdXBsaWNhdGUgYSBDUllQVE9fRVhfREFUQSB2YXJpYWJsZSAtIGluY2x1ZGluZyBjYWxsaW5nIGR1cCgpIGNhbGxiYWNrcyBmb3IKKyAqIGVhY2ggaW5kZXggaW4gdGhlIGNsYXNzIHVzZWQgYnkgdGhpcyB2YXJpYWJsZSAqLworaW50IENSWVBUT19kdXBfZXhfZGF0YShpbnQgY2xhc3NfaW5kZXgsIENSWVBUT19FWF9EQVRBICp0bywKKwkgICAgIENSWVBUT19FWF9EQVRBICpmcm9tKQorCXsKKwlJTVBMX0NIRUNLCisJcmV0dXJuIEVYX0lNUEwoZHVwX2V4X2RhdGEpKGNsYXNzX2luZGV4LCB0bywgZnJvbSk7CisJfQorCisvKiBDbGVhbnVwIGEgQ1JZUFRPX0VYX0RBVEEgdmFyaWFibGUgLSBpbmNsdWRpbmcgY2FsbGluZyBmcmVlKCkgY2FsbGJhY2tzIGZvcgorICogZWFjaCBpbmRleCBpbiB0aGUgY2xhc3MgdXNlZCBieSB0aGlzIHZhcmlhYmxlICovCit2b2lkIENSWVBUT19mcmVlX2V4X2RhdGEoaW50IGNsYXNzX2luZGV4LCB2b2lkICpvYmosIENSWVBUT19FWF9EQVRBICphZCkKKwl7CisJSU1QTF9DSEVDSworCUVYX0lNUEwoZnJlZV9leF9kYXRhKShjbGFzc19pbmRleCwgb2JqLCBhZCk7CisJfQorCisvKiBGb3IgYSBnaXZlbiBDUllQVE9fRVhfREFUQSB2YXJpYWJsZSwgc2V0IHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEKKyAqIHBhcnRpY3VsYXIgaW5kZXggaW4gdGhlIGNsYXNzIHVzZWQgYnkgdGhpcyB2YXJpYWJsZSAqLworaW50IENSWVBUT19zZXRfZXhfZGF0YShDUllQVE9fRVhfREFUQSAqYWQsIGludCBpZHgsIHZvaWQgKnZhbCkKKwl7CisJaW50IGk7CisKKwlpZiAoYWQtPnNrID09IE5VTEwpCisJCXsKKwkJaWYgKChhZC0+c2s9c2tfdm9pZF9uZXdfbnVsbCgpKSA9PSBOVUxMKQorCQkJeworCQkJQ1JZUFRPZXJyKENSWVBUT19GX0NSWVBUT19TRVRfRVhfREFUQSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oMCk7CisJCQl9CisJCX0KKwlpPXNrX3ZvaWRfbnVtKGFkLT5zayk7CisKKwl3aGlsZSAoaSA8PSBpZHgpCisJCXsKKwkJaWYgKCFza192b2lkX3B1c2goYWQtPnNrLE5VTEwpKQorCQkJeworCQkJQ1JZUFRPZXJyKENSWVBUT19GX0NSWVBUT19TRVRfRVhfREFUQSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4oMCk7CisJCQl9CisJCWkrKzsKKwkJfQorCXNrX3ZvaWRfc2V0KGFkLT5zayxpZHgsdmFsKTsKKwlyZXR1cm4oMSk7CisJfQorCisvKiBGb3IgYSBnaXZlbiBDUllQVE9fRVhfREFUQV8gdmFyaWFibGUsIGdldCB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhCisgKiBwYXJ0aWN1bGFyIGluZGV4IGluIHRoZSBjbGFzcyB1c2VkIGJ5IHRoaXMgdmFyaWFibGUgKi8KK3ZvaWQgKkNSWVBUT19nZXRfZXhfZGF0YShjb25zdCBDUllQVE9fRVhfREFUQSAqYWQsIGludCBpZHgpCisJeworCWlmIChhZC0+c2sgPT0gTlVMTCkKKwkJcmV0dXJuKDApOworCWVsc2UgaWYgKGlkeCA+PSBza192b2lkX251bShhZC0+c2spKQorCQlyZXR1cm4oMCk7CisJZWxzZQorCQlyZXR1cm4oc2tfdm9pZF92YWx1ZShhZC0+c2ssaWR4KSk7CisJfQorCitJTVBMRU1FTlRfU1RBQ0tfT0YoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vaG1hYy9obV9hbWV0aC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2htYWMvaG1fYW1ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDhhODkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2htYWMvaG1fYW1ldGguYwpAQCAtMCwwICsxLDE2NyBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDcuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgImFzbjFfbG9jbC5oIgorCisjZGVmaW5lIEhNQUNfVEVTVF9QUklWQVRFX0tFWV9GT1JNQVQKKworLyogSE1BQyAiQVNOMSIgbWV0aG9kLiBUaGlzIGlzIGp1c3QgaGVyZSB0byBpbmRpY2F0ZSB0aGUKKyAqIG1heGltdW0gSE1BQyBvdXRwdXQgbGVuZ3RoIGFuZCB0byBmcmVlIHVwIGFuIEhNQUMKKyAqIGtleS4KKyAqLworCitzdGF0aWMgaW50IGhtYWNfc2l6ZShjb25zdCBFVlBfUEtFWSAqcGtleSkKKwl7CisJcmV0dXJuIEVWUF9NQVhfTURfU0laRTsKKwl9CisKK3N0YXRpYyB2b2lkIGhtYWNfa2V5X2ZyZWUoRVZQX1BLRVkgKnBrZXkpCisJeworCUFTTjFfT0NURVRfU1RSSU5HICpvcyA9IChBU04xX09DVEVUX1NUUklORyAqKXBrZXktPnBrZXkucHRyOworCWlmIChvcykKKwkJeworCQlpZiAob3MtPmRhdGEpCisJCQlPUEVOU1NMX2NsZWFuc2Uob3MtPmRhdGEsIG9zLT5sZW5ndGgpOworCQlBU04xX09DVEVUX1NUUklOR19mcmVlKG9zKTsKKwkJfQorCX0KKworCitzdGF0aWMgaW50IGhtYWNfcGtleV9jdHJsKEVWUF9QS0VZICpwa2V5LCBpbnQgb3AsIGxvbmcgYXJnMSwgdm9pZCAqYXJnMikKKwl7CisJc3dpdGNoIChvcCkKKwkJeworCQljYXNlIEFTTjFfUEtFWV9DVFJMX0RFRkFVTFRfTURfTklEOgorCQkqKGludCAqKWFyZzIgPSBOSURfc2hhMTsKKwkJcmV0dXJuIDE7CisKKwkJZGVmYXVsdDoKKwkJcmV0dXJuIC0yOworCQl9CisJfQorCisjaWZkZWYgSE1BQ19URVNUX1BSSVZBVEVfS0VZX0ZPUk1BVAorLyogQSBib2d1cyBwcml2YXRlIGtleSBmb3JtYXQgZm9yIHRlc3QgcHVycG9zZXMuIFRoaXMgaXMgc2ltcGx5IHRoZQorICogSE1BQyBrZXkgd2l0aCAiSE1BQyBQUklWQVRFIEtFWSIgaW4gdGhlIGhlYWRlcnMuIFdoZW4gZW5hYmxlZCB0aGUKKyAqIGdlbnBrZXkgdXRpbGl0eSBjYW4gYmUgdXNlZCB0byAiZ2VuZXJhdGUiIEhNQUMga2V5cy4KKyAqLworCitzdGF0aWMgaW50IG9sZF9obWFjX2RlY29kZShFVlBfUEtFWSAqcGtleSwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqKnBkZXIsIGludCBkZXJsZW4pCisJeworCUFTTjFfT0NURVRfU1RSSU5HICpvczsKKwlvcyA9IEFTTjFfT0NURVRfU1RSSU5HX25ldygpOworCWlmICghb3MgfHwgIUFTTjFfT0NURVRfU1RSSU5HX3NldChvcywgKnBkZXIsIGRlcmxlbikpCisJCXJldHVybiAwOworCUVWUF9QS0VZX2Fzc2lnbihwa2V5LCBFVlBfUEtFWV9ITUFDLCBvcyk7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IG9sZF9obWFjX2VuY29kZShjb25zdCBFVlBfUEtFWSAqcGtleSwgdW5zaWduZWQgY2hhciAqKnBkZXIpCisJeworCWludCBpbmM7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9zID0gKEFTTjFfT0NURVRfU1RSSU5HICopcGtleS0+cGtleS5wdHI7CisJaWYgKHBkZXIpCisJCXsKKwkJaWYgKCEqcGRlcikKKwkJCXsKKwkJCSpwZGVyID0gT1BFTlNTTF9tYWxsb2Mob3MtPmxlbmd0aCk7CisJCQlpbmMgPSAwOworCQkJfQorCQllbHNlIGluYyA9IDE7CisKKwkJbWVtY3B5KCpwZGVyLCBvcy0+ZGF0YSwgb3MtPmxlbmd0aCk7CisKKwkJaWYgKGluYykKKwkJCSpwZGVyICs9IG9zLT5sZW5ndGg7CisJCX0KKwkJCQorCXJldHVybiBvcy0+bGVuZ3RoOworCX0KKworI2VuZGlmCisKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EIGhtYWNfYXNuMV9tZXRoID0gCisJeworCUVWUF9QS0VZX0hNQUMsCisJRVZQX1BLRVlfSE1BQywKKwkwLAorCisJIkhNQUMiLAorCSJPcGVuU1NMIEhNQUMgbWV0aG9kIiwKKworCTAsMCwwLDAsCisKKwkwLDAsMCwKKworCWhtYWNfc2l6ZSwKKwkwLAorCTAsMCwwLDAsMCwwLAorCisJaG1hY19rZXlfZnJlZSwKKwlobWFjX3BrZXlfY3RybCwKKyNpZmRlZiBITUFDX1RFU1RfUFJJVkFURV9LRVlfRk9STUFUCisJb2xkX2htYWNfZGVjb2RlLAorCW9sZF9obWFjX2VuY29kZQorI2Vsc2UKKwkwLDAKKyNlbmRpZgorCX07CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9obWFjL2htX3BtZXRoLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vaG1hYy9obV9wbWV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTkyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vaG1hYy9obV9wbWV0aC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNy4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KKyNpbmNsdWRlICJldnBfbG9jbC5oIgorCisvKiBITUFDIHBrZXkgY29udGV4dCBzdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJY29uc3QgRVZQX01EICptZDsJLyogTUQgZm9yIEhNQUMgdXNlICovCisJQVNOMV9PQ1RFVF9TVFJJTkcga3RtcDsgLyogVGVtcCBzdG9yYWdlIGZvciBrZXkgKi8KKwlITUFDX0NUWCBjdHg7CisJfSBITUFDX1BLRVlfQ1RYOworCitzdGF0aWMgaW50IHBrZXlfaG1hY19pbml0KEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlITUFDX1BLRVlfQ1RYICpoY3R4OworCWhjdHggPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoSE1BQ19QS0VZX0NUWCkpOworCWlmICghaGN0eCkKKwkJcmV0dXJuIDA7CisJaGN0eC0+bWQgPSBOVUxMOworCWhjdHgtPmt0bXAuZGF0YSA9IE5VTEw7CisJaGN0eC0+a3RtcC5sZW5ndGggPSAwOworCWhjdHgtPmt0bXAuZmxhZ3MgPSAwOworCWhjdHgtPmt0bXAudHlwZSA9IFZfQVNOMV9PQ1RFVF9TVFJJTkc7CisJSE1BQ19DVFhfaW5pdCgmaGN0eC0+Y3R4KTsKKworCWN0eC0+ZGF0YSA9IGhjdHg7CisJY3R4LT5rZXlnZW5faW5mb19jb3VudCA9IDA7CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9obWFjX2NvcHkoRVZQX1BLRVlfQ1RYICpkc3QsIEVWUF9QS0VZX0NUWCAqc3JjKQorCXsKKwlITUFDX1BLRVlfQ1RYICpzY3R4LCAqZGN0eDsKKwlpZiAoIXBrZXlfaG1hY19pbml0KGRzdCkpCisJCXJldHVybiAwOworICAgICAgIAlzY3R4ID0gc3JjLT5kYXRhOworCWRjdHggPSBkc3QtPmRhdGE7CisJZGN0eC0+bWQgPSBzY3R4LT5tZDsKKwlITUFDX0NUWF9pbml0KCZkY3R4LT5jdHgpOworCUhNQUNfQ1RYX2NvcHkoJmRjdHgtPmN0eCwgJnNjdHgtPmN0eCk7CisJaWYgKHNjdHgtPmt0bXAuZGF0YSkKKwkJeworCQlpZiAoIUFTTjFfT0NURVRfU1RSSU5HX3NldCgmZGN0eC0+a3RtcCwKKwkJCQkJc2N0eC0+a3RtcC5kYXRhLCBzY3R4LT5rdG1wLmxlbmd0aCkpCisJCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworc3RhdGljIHZvaWQgcGtleV9obWFjX2NsZWFudXAoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCUhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPmRhdGE7CisJSE1BQ19DVFhfY2xlYW51cCgmaGN0eC0+Y3R4KTsKKwlpZiAoaGN0eC0+a3RtcC5kYXRhKQorCQl7CisJCWlmIChoY3R4LT5rdG1wLmxlbmd0aCkKKwkJCU9QRU5TU0xfY2xlYW5zZShoY3R4LT5rdG1wLmRhdGEsIGhjdHgtPmt0bXAubGVuZ3RoKTsKKwkJT1BFTlNTTF9mcmVlKGhjdHgtPmt0bXAuZGF0YSk7CisJCWhjdHgtPmt0bXAuZGF0YSA9IE5VTEw7CisJCX0KKwlPUEVOU1NMX2ZyZWUoaGN0eCk7CisJfQorCitzdGF0aWMgaW50IHBrZXlfaG1hY19rZXlnZW4oRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlBU04xX09DVEVUX1NUUklORyAqaGtleSA9IE5VTEw7CisJSE1BQ19QS0VZX0NUWCAqaGN0eCA9IGN0eC0+ZGF0YTsKKwlpZiAoIWhjdHgtPmt0bXAuZGF0YSkKKwkJcmV0dXJuIDA7CisJaGtleSA9IEFTTjFfT0NURVRfU1RSSU5HX2R1cCgmaGN0eC0+a3RtcCk7CisJaWYgKCFoa2V5KQorCQlyZXR1cm4gMDsKKwlFVlBfUEtFWV9hc3NpZ24ocGtleSwgRVZQX1BLRVlfSE1BQywgaGtleSk7CisJCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGludF91cGRhdGUoRVZQX01EX0NUWCAqY3R4LGNvbnN0IHZvaWQgKmRhdGEsc2l6ZV90IGNvdW50KQorCXsKKwlITUFDX1BLRVlfQ1RYICpoY3R4ID0gY3R4LT5wY3R4LT5kYXRhOworCUhNQUNfVXBkYXRlKCZoY3R4LT5jdHgsIGRhdGEsIGNvdW50KTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgaG1hY19zaWduY3R4X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpCisJeworCUVWUF9NRF9DVFhfc2V0X2ZsYWdzKG1jdHgsIEVWUF9NRF9DVFhfRkxBR19OT19JTklUKTsKKwltY3R4LT51cGRhdGUgPSBpbnRfdXBkYXRlOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBobWFjX3NpZ25jdHgoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCisJCQkJCUVWUF9NRF9DVFggKm1jdHgpCisJeworCXVuc2lnbmVkIGludCBobGVuOworCUhNQUNfUEtFWV9DVFggKmhjdHggPSBjdHgtPmRhdGE7CisJaW50IGwgPSBFVlBfTURfQ1RYX3NpemUobWN0eCk7CisKKwlpZiAobCA8IDApCisJCXJldHVybiAwOworCSpzaWdsZW4gPSBsOworCWlmICghc2lnKQorCQlyZXR1cm4gMTsKKworCUhNQUNfRmluYWwoJmhjdHgtPmN0eCwgc2lnLCAmaGxlbik7CisJKnNpZ2xlbiA9IChzaXplX3QpaGxlbjsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9obWFjX2N0cmwoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKQorCXsKKwlITUFDX1BLRVlfQ1RYICpoY3R4ID0gY3R4LT5kYXRhOworCUFTTjFfT0NURVRfU1RSSU5HICprZXk7CisJc3dpdGNoICh0eXBlKQorCQl7CisKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX1NFVF9NQUNfS0VZOgorCQlpZiAoKCFwMiAmJiBwMSA+IDApIHx8IChwMSA8IC0xKSkKKwkJCXJldHVybiAwOworCQlpZiAoIUFTTjFfT0NURVRfU1RSSU5HX3NldCgmaGN0eC0+a3RtcCwgcDIsIHAxKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKworCQljYXNlIEVWUF9QS0VZX0NUUkxfTUQ6CisJCWhjdHgtPm1kID0gcDI7CisJCWJyZWFrOworCisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklUOgorCQlrZXkgPSAoQVNOMV9PQ1RFVF9TVFJJTkcgKiljdHgtPnBrZXktPnBrZXkucHRyOworCQlITUFDX0luaXRfZXgoJmhjdHgtPmN0eCwga2V5LT5kYXRhLCBrZXktPmxlbmd0aCwgaGN0eC0+bWQsCisJCQkJY3R4LT5lbmdpbmUpOworCQlicmVhazsKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gLTI7CisKKwkJfQorCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBwa2V5X2htYWNfY3RybF9zdHIoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQljb25zdCBjaGFyICp0eXBlLCBjb25zdCBjaGFyICp2YWx1ZSkKKwl7CisJaWYgKCF2YWx1ZSkKKwkJeworCQlyZXR1cm4gMDsKKwkJfQorCWlmICghc3RyY21wKHR5cGUsICJrZXkiKSkKKwkJeworCQl2b2lkICpwID0gKHZvaWQgKil2YWx1ZTsKKwkJcmV0dXJuIHBrZXlfaG1hY19jdHJsKGN0eCwgRVZQX1BLRVlfQ1RSTF9TRVRfTUFDX0tFWSwKKwkJCQktMSwgcCk7CisJCX0KKwlpZiAoIXN0cmNtcCh0eXBlLCAiaGV4a2V5IikpCisJCXsKKwkJdW5zaWduZWQgY2hhciAqa2V5OworCQlpbnQgcjsKKwkJbG9uZyBrZXlsZW47CisJCWtleSA9IHN0cmluZ190b19oZXgodmFsdWUsICZrZXlsZW4pOworCQlpZiAoIWtleSkKKwkJCXJldHVybiAwOworCQlyID0gcGtleV9obWFjX2N0cmwoY3R4LCBFVlBfUEtFWV9DVFJMX1NFVF9NQUNfS0VZLCBrZXlsZW4sIGtleSk7CisJCU9QRU5TU0xfZnJlZShrZXkpOworCQlyZXR1cm4gcjsKKwkJfQorCXJldHVybiAtMjsKKwl9CisKK2NvbnN0IEVWUF9QS0VZX01FVEhPRCBobWFjX3BrZXlfbWV0aCA9IAorCXsKKwlFVlBfUEtFWV9ITUFDLAorCTAsCisJcGtleV9obWFjX2luaXQsCisJcGtleV9obWFjX2NvcHksCisJcGtleV9obWFjX2NsZWFudXAsCisKKwkwLCAwLAorCisJMCwKKwlwa2V5X2htYWNfa2V5Z2VuLAorCisJMCwgMCwKKworCTAsIDAsCisKKwkwLDAsCisKKwlobWFjX3NpZ25jdHhfaW5pdCwKKwlobWFjX3NpZ25jdHgsCisKKwkwLDAsCisKKwkwLDAsCisKKwkwLDAsCisKKwkwLDAsCisKKwlwa2V5X2htYWNfY3RybCwKKwlwa2V5X2htYWNfY3RybF9zdHIKKworCX07CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vaG1hYy9obWFjLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vaG1hYy9obWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwMTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9obWFjL2htYWMuYwpAQCAtMCwwICsxLDIxNyBAQAorLyogY3J5cHRvL2htYWMvaG1hYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorCitpbnQgSE1BQ19Jbml0X2V4KEhNQUNfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmtleSwgaW50IGxlbiwKKwkJICBjb25zdCBFVlBfTUQgKm1kLCBFTkdJTkUgKmltcGwpCisJeworCWludCBpLGoscmVzZXQ9MDsKKwl1bnNpZ25lZCBjaGFyIHBhZFtITUFDX01BWF9NRF9DQkxPQ0tdOworCisJaWYgKG1kICE9IE5VTEwpCisJCXsKKwkJcmVzZXQ9MTsKKwkJY3R4LT5tZD1tZDsKKwkJfQorCWVsc2UKKwkJbWQ9Y3R4LT5tZDsKKworCWlmIChrZXkgIT0gTlVMTCkKKwkJeworCQlyZXNldD0xOworCQlqPUVWUF9NRF9ibG9ja19zaXplKG1kKTsKKwkJT1BFTlNTTF9hc3NlcnQoaiA8PSAoaW50KXNpemVvZihjdHgtPmtleSkpOworCQlpZiAoaiA8IGxlbikKKwkJCXsKKwkJCWlmICghRVZQX0RpZ2VzdEluaXRfZXgoJmN0eC0+bWRfY3R4LG1kLCBpbXBsKSkKKwkJCQlnb3RvIGVycjsKKwkJCWlmICghRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LT5tZF9jdHgsa2V5LGxlbikpCisJCQkJZ290byBlcnI7CisJCQlpZiAoIUVWUF9EaWdlc3RGaW5hbF9leCgmKGN0eC0+bWRfY3R4KSxjdHgtPmtleSwKKwkJCQkmY3R4LT5rZXlfbGVuZ3RoKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJT1BFTlNTTF9hc3NlcnQobGVuPj0wICYmIGxlbjw9KGludClzaXplb2YoY3R4LT5rZXkpKTsKKwkJCW1lbWNweShjdHgtPmtleSxrZXksbGVuKTsKKwkJCWN0eC0+a2V5X2xlbmd0aD1sZW47CisJCQl9CisJCWlmKGN0eC0+a2V5X2xlbmd0aCAhPSBITUFDX01BWF9NRF9DQkxPQ0spCisJCQltZW1zZXQoJmN0eC0+a2V5W2N0eC0+a2V5X2xlbmd0aF0sIDAsCisJCQkJSE1BQ19NQVhfTURfQ0JMT0NLIC0gY3R4LT5rZXlfbGVuZ3RoKTsKKwkJfQorCisJaWYgKHJlc2V0KQkKKwkJeworCQlmb3IgKGk9MDsgaTxITUFDX01BWF9NRF9DQkxPQ0s7IGkrKykKKwkJCXBhZFtpXT0weDM2XmN0eC0+a2V5W2ldOworCQlpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjdHgtPmlfY3R4LG1kLCBpbXBsKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoIUVWUF9EaWdlc3RVcGRhdGUoJmN0eC0+aV9jdHgscGFkLEVWUF9NRF9ibG9ja19zaXplKG1kKSkpCisJCQlnb3RvIGVycjsKKworCQlmb3IgKGk9MDsgaTxITUFDX01BWF9NRF9DQkxPQ0s7IGkrKykKKwkJCXBhZFtpXT0weDVjXmN0eC0+a2V5W2ldOworCQlpZiAoIUVWUF9EaWdlc3RJbml0X2V4KCZjdHgtPm9fY3R4LG1kLCBpbXBsKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoIUVWUF9EaWdlc3RVcGRhdGUoJmN0eC0+b19jdHgscGFkLEVWUF9NRF9ibG9ja19zaXplKG1kKSkpCisJCQlnb3RvIGVycjsKKwkJfQorCWlmICghRVZQX01EX0NUWF9jb3B5X2V4KCZjdHgtPm1kX2N0eCwmY3R4LT5pX2N0eCkpCisJCQlnb3RvIGVycjsKKwlyZXR1cm4gMTsKKwllcnI6CisJcmV0dXJuIDA7CisJfQorCitpbnQgSE1BQ19Jbml0KEhNQUNfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmtleSwgaW50IGxlbiwgY29uc3QgRVZQX01EICptZCkKKwl7CisJaWYoa2V5ICYmIG1kKQorCSAgICBITUFDX0NUWF9pbml0KGN0eCk7CisJcmV0dXJuIEhNQUNfSW5pdF9leChjdHgsa2V5LGxlbixtZCwgTlVMTCk7CisJfQorCitpbnQgSE1BQ19VcGRhdGUoSE1BQ19DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGxlbikKKwl7CisJcmV0dXJuIEVWUF9EaWdlc3RVcGRhdGUoJmN0eC0+bWRfY3R4LGRhdGEsbGVuKTsKKwl9CisKK2ludCBITUFDX0ZpbmFsKEhNQUNfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKmxlbikKKwl7CisJaW50IGo7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciBidWZbRVZQX01BWF9NRF9TSVpFXTsKKworCWo9RVZQX01EX2Jsb2NrX3NpemUoY3R4LT5tZCk7CisKKwlpZiAoIUVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LT5tZF9jdHgsYnVmLCZpKSkKKwkJZ290byBlcnI7CisJaWYgKCFFVlBfTURfQ1RYX2NvcHlfZXgoJmN0eC0+bWRfY3R4LCZjdHgtPm9fY3R4KSkKKwkJZ290byBlcnI7CisJaWYgKCFFVlBfRGlnZXN0VXBkYXRlKCZjdHgtPm1kX2N0eCxidWYsaSkpCisJCWdvdG8gZXJyOworCWlmICghRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgtPm1kX2N0eCxtZCxsZW4pKQorCQlnb3RvIGVycjsKKwlyZXR1cm4gMTsKKwllcnI6CisJcmV0dXJuIDA7CisJfQorCit2b2lkIEhNQUNfQ1RYX2luaXQoSE1BQ19DVFggKmN0eCkKKwl7CisJRVZQX01EX0NUWF9pbml0KCZjdHgtPmlfY3R4KTsKKwlFVlBfTURfQ1RYX2luaXQoJmN0eC0+b19jdHgpOworCUVWUF9NRF9DVFhfaW5pdCgmY3R4LT5tZF9jdHgpOworCX0KKworaW50IEhNQUNfQ1RYX2NvcHkoSE1BQ19DVFggKmRjdHgsIEhNQUNfQ1RYICpzY3R4KQorCXsKKwlpZiAoIUVWUF9NRF9DVFhfY29weSgmZGN0eC0+aV9jdHgsICZzY3R4LT5pX2N0eCkpCisJCWdvdG8gZXJyOworCWlmICghRVZQX01EX0NUWF9jb3B5KCZkY3R4LT5vX2N0eCwgJnNjdHgtPm9fY3R4KSkKKwkJZ290byBlcnI7CisJaWYgKCFFVlBfTURfQ1RYX2NvcHkoJmRjdHgtPm1kX2N0eCwgJnNjdHgtPm1kX2N0eCkpCisJCWdvdG8gZXJyOworCW1lbWNweShkY3R4LT5rZXksIHNjdHgtPmtleSwgSE1BQ19NQVhfTURfQ0JMT0NLKTsKKwlkY3R4LT5rZXlfbGVuZ3RoID0gc2N0eC0+a2V5X2xlbmd0aDsKKwlkY3R4LT5tZCA9IHNjdHgtPm1kOworCXJldHVybiAxOworCWVycjoKKwlyZXR1cm4gMDsKKwl9CisKK3ZvaWQgSE1BQ19DVFhfY2xlYW51cChITUFDX0NUWCAqY3R4KQorCXsKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eC0+aV9jdHgpOworCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4LT5vX2N0eCk7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgtPm1kX2N0eCk7CisJbWVtc2V0KGN0eCwwLHNpemVvZiAqY3R4KTsKKwl9CisKK3Vuc2lnbmVkIGNoYXIgKkhNQUMoY29uc3QgRVZQX01EICpldnBfbWQsIGNvbnN0IHZvaWQgKmtleSwgaW50IGtleV9sZW4sCisJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwgdW5zaWduZWQgY2hhciAqbWQsCisJCSAgICB1bnNpZ25lZCBpbnQgKm1kX2xlbikKKwl7CisJSE1BQ19DVFggYzsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtW0VWUF9NQVhfTURfU0laRV07CisKKwlpZiAobWQgPT0gTlVMTCkgbWQ9bTsKKwlITUFDX0NUWF9pbml0KCZjKTsKKwlpZiAoIUhNQUNfSW5pdCgmYyxrZXksa2V5X2xlbixldnBfbWQpKQorCQlnb3RvIGVycjsKKwlpZiAoIUhNQUNfVXBkYXRlKCZjLGQsbikpCisJCWdvdG8gZXJyOworCWlmICghSE1BQ19GaW5hbCgmYyxtZCxtZF9sZW4pKQorCQlnb3RvIGVycjsKKwlITUFDX0NUWF9jbGVhbnVwKCZjKTsKKwlyZXR1cm4gbWQ7CisJZXJyOgorCXJldHVybiBOVUxMOworCX0KKwordm9pZCBITUFDX0NUWF9zZXRfZmxhZ3MoSE1BQ19DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJRVZQX01EX0NUWF9zZXRfZmxhZ3MoJmN0eC0+aV9jdHgsIGZsYWdzKTsKKwlFVlBfTURfQ1RYX3NldF9mbGFncygmY3R4LT5vX2N0eCwgZmxhZ3MpOworCUVWUF9NRF9DVFhfc2V0X2ZsYWdzKCZjdHgtPm1kX2N0eCwgZmxhZ3MpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9obWFjL2htYWMuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9obWFjL2htYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUwMDIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2htYWMvaG1hYy5oCkBAIC0wLDAgKzEsMTEwIEBACisvKiBjcnlwdG8vaG1hYy9obWFjLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKyNpZm5kZWYgSEVBREVSX0hNQUNfSAorI2RlZmluZSBIRUFERVJfSE1BQ19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX0hNQUMKKyNlcnJvciBITUFDIGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjZGVmaW5lIEhNQUNfTUFYX01EX0NCTE9DSwkxMjgJLyogbGFyZ2VzdCBrbm93biBpcyBTSEE1MTIgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgaG1hY19jdHhfc3QKKwl7CisJY29uc3QgRVZQX01EICptZDsKKwlFVlBfTURfQ1RYIG1kX2N0eDsKKwlFVlBfTURfQ1RYIGlfY3R4OworCUVWUF9NRF9DVFggb19jdHg7CisJdW5zaWduZWQgaW50IGtleV9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBrZXlbSE1BQ19NQVhfTURfQ0JMT0NLXTsKKwl9IEhNQUNfQ1RYOworCisjZGVmaW5lIEhNQUNfc2l6ZShlKQkoRVZQX01EX3NpemUoKGUpLT5tZCkpCisKKwordm9pZCBITUFDX0NUWF9pbml0KEhNQUNfQ1RYICpjdHgpOwordm9pZCBITUFDX0NUWF9jbGVhbnVwKEhNQUNfQ1RYICpjdHgpOworCisjZGVmaW5lIEhNQUNfY2xlYW51cChjdHgpIEhNQUNfQ1RYX2NsZWFudXAoY3R4KSAvKiBkZXByZWNhdGVkICovCisKK2ludCBITUFDX0luaXQoSE1BQ19DVFggKmN0eCwgY29uc3Qgdm9pZCAqa2V5LCBpbnQgbGVuLAorCSAgICAgICBjb25zdCBFVlBfTUQgKm1kKTsgLyogZGVwcmVjYXRlZCAqLworaW50IEhNQUNfSW5pdF9leChITUFDX0NUWCAqY3R4LCBjb25zdCB2b2lkICprZXksIGludCBsZW4sCisJCSAgY29uc3QgRVZQX01EICptZCwgRU5HSU5FICppbXBsKTsKK2ludCBITUFDX1VwZGF0ZShITUFDX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgbGVuKTsKK2ludCBITUFDX0ZpbmFsKEhNQUNfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKmxlbik7Cit1bnNpZ25lZCBjaGFyICpITUFDKGNvbnN0IEVWUF9NRCAqZXZwX21kLCBjb25zdCB2b2lkICprZXksIGludCBrZXlfbGVuLAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sIHVuc2lnbmVkIGNoYXIgKm1kLAorCQkgICAgdW5zaWduZWQgaW50ICptZF9sZW4pOworaW50IEhNQUNfQ1RYX2NvcHkoSE1BQ19DVFggKmRjdHgsIEhNQUNfQ1RYICpzY3R4KTsKKwordm9pZCBITUFDX0NUWF9zZXRfZmxhZ3MoSE1BQ19DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9obWFjL2htYWN0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vaG1hYy9obWFjdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTA2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vaG1hYy9obWFjdGVzdC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKiBjcnlwdG8vaG1hYy9obWFjdGVzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiLi4vZV9vcy5oIgorCisjaWZkZWYgT1BFTlNTTF9OT19ITUFDCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHByaW50ZigiTm8gSE1BQyBzdXBwb3J0XG4iKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZWxzZQorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorI2lmbmRlZiBPUEVOU1NMX05PX01ENQorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisjZW5kaWYKKworI2lmZGVmIENIQVJTRVRfRUJDRElDCisjaW5jbHVkZSA8b3BlbnNzbC9lYmNkaWMuaD4KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CitzdGF0aWMgc3RydWN0IHRlc3Rfc3QKKwl7CisJdW5zaWduZWQgY2hhciBrZXlbMTZdOworCWludCBrZXlfbGVuOworCXVuc2lnbmVkIGNoYXIgZGF0YVs2NF07CisJaW50IGRhdGFfbGVuOworCXVuc2lnbmVkIGNoYXIgKmRpZ2VzdDsKKwl9IHRlc3RbNF09eworCXsJIiIsCisJCTAsCisJCSJNb3JlIHRleHQgdGVzdCB2ZWN0b3JzIHRvIHN0dWZmIHVwIEVCQ0RJQyBtYWNoaW5lcyA6LSkiLAorCQk1NCwKKwkJKHVuc2lnbmVkIGNoYXIgKikiZTkxMzlkMWU2ZWUwNjRlZjhjZjUxNGZjN2RjODNlODYiLAorCX0sewl7MHgwYiwweDBiLDB4MGIsMHgwYiwweDBiLDB4MGIsMHgwYiwweDBiLAorCQkgMHgwYiwweDBiLDB4MGIsMHgwYiwweDBiLDB4MGIsMHgwYiwweDBiLH0sCisJCTE2LAorCQkiSGkgVGhlcmUiLAorCQk4LAorCQkodW5zaWduZWQgY2hhciAqKSI5Mjk0NzI3YTM2MzhiYjFjMTNmNDhlZjgxNThiZmM5ZCIsCisJfSx7CSJKZWZlIiwKKwkJNCwKKwkJIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iLAorCQkyOCwKKwkJKHVuc2lnbmVkIGNoYXIgKikiNzUwYzc4M2U2YWIwYjUwM2VhYTg2ZTMxMGE1ZGI3MzgiLAorCX0seworCQl7MHhhYSwweGFhLDB4YWEsMHhhYSwweGFhLDB4YWEsMHhhYSwweGFhLAorCQkgMHhhYSwweGFhLDB4YWEsMHhhYSwweGFhLDB4YWEsMHhhYSwweGFhLH0sCisJCTE2LAorCQl7MHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLAorCQkgMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLAorCQkgMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLAorCQkgMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLAorCQkgMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLAorCQkgMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLDB4ZGQsMHhkZCwweGRkLAorCQkgMHhkZCwweGRkfSwKKwkJNTAsCisJCSh1bnNpZ25lZCBjaGFyICopIjU2YmUzNDUyMWQxNDRjODhkYmI4YzczM2YwZThiM2Y2IiwKKwl9LAorCX07CisjZW5kaWYKKworc3RhdGljIGNoYXIgKnB0KHVuc2lnbmVkIGNoYXIgKm1kKTsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisJeworI2lmbmRlZiBPUEVOU1NMX05PX01ENQorCWludCBpOworCWNoYXIgKnA7CisjZW5kaWYKKwlpbnQgZXJyPTA7CisKKyNpZmRlZiBPUEVOU1NMX05PX01ENQorCXByaW50ZigidGVzdCBza2lwcGVkOiBNRDUgZGlzYWJsZWRcbiIpOworI2Vsc2UKKworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJZWJjZGljMmFzY2lpKHRlc3RbMF0uZGF0YSwgdGVzdFswXS5kYXRhLCB0ZXN0WzBdLmRhdGFfbGVuKTsKKwllYmNkaWMyYXNjaWkodGVzdFsxXS5kYXRhLCB0ZXN0WzFdLmRhdGEsIHRlc3RbMV0uZGF0YV9sZW4pOworCWViY2RpYzJhc2NpaSh0ZXN0WzJdLmtleSwgIHRlc3RbMl0ua2V5LCAgdGVzdFsyXS5rZXlfbGVuKTsKKwllYmNkaWMyYXNjaWkodGVzdFsyXS5kYXRhLCB0ZXN0WzJdLmRhdGEsIHRlc3RbMl0uZGF0YV9sZW4pOworI2VuZGlmCisKKwlmb3IgKGk9MDsgaTw0OyBpKyspCisJCXsKKwkJcD1wdChITUFDKEVWUF9tZDUoKSwKKwkJCXRlc3RbaV0ua2V5LCB0ZXN0W2ldLmtleV9sZW4sCisJCQl0ZXN0W2ldLmRhdGEsIHRlc3RbaV0uZGF0YV9sZW4sCisJCQlOVUxMLE5VTEwpKTsKKworCQlpZiAoc3RyY21wKHAsKGNoYXIgKil0ZXN0W2ldLmRpZ2VzdCkgIT0gMCkKKwkJCXsKKwkJCXByaW50ZigiZXJyb3IgY2FsY3VsYXRpbmcgSE1BQyBvbiAlZCBlbnRyeSdcbiIsaSk7CisJCQlwcmludGYoImdvdCAlcyBpbnN0ZWFkIG9mICVzXG4iLHAsdGVzdFtpXS5kaWdlc3QpOworCQkJZXJyKys7CisJCQl9CisJCWVsc2UKKwkJCXByaW50ZigidGVzdCAlZCBva1xuIixpKTsKKwkJfQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fTUQ1ICovCisJRVhJVChlcnIpOworCXJldHVybigwKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKK3N0YXRpYyBjaGFyICpwdCh1bnNpZ25lZCBjaGFyICptZCkKKwl7CisJaW50IGk7CisJc3RhdGljIGNoYXIgYnVmWzgwXTsKKworCWZvciAoaT0wOyBpPE1ENV9ESUdFU1RfTEVOR1RIOyBpKyspCisJCXNwcmludGYoJihidWZbaSoyXSksIiUwMngiLG1kW2ldKTsKKwlyZXR1cm4oYnVmKTsKKwl9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2lhNjRjcHVpZC5TIGIvbGliL29wZW5zc2wvY3J5cHRvL2lhNjRjcHVpZC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDVmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vaWE2NGNwdWlkLlMKQEAgLTAsMCArMSwxNjcgQEAKKy8vIFdvcmtzIG9uIGFsbCBJQS02NCBwbGF0Zm9ybXM6IExpbnV4LCBIUC1VWCwgV2luNjRpLi4uCisvLyBPbiBXaW42NGkgY29tcGlsZSB3aXRoIGlhcy5leGUuCisudGV4dAorCisuZ2xvYmFsCU9QRU5TU0xfY3B1aWRfc2V0dXAjCisucHJvYwlPUEVOU1NMX2NwdWlkX3NldHVwIworT1BFTlNTTF9jcHVpZF9zZXR1cDoKK3sgLm1pYjsJYnIucmV0LnNwdGsubWFueQliMAkJfTs7CisuZW5kcAlPUEVOU1NMX2NwdWlkX3NldHVwIworCisuZ2xvYmFsCU9QRU5TU0xfcmR0c2MjCisucHJvYwlPUEVOU1NMX3JkdHNjIworT1BFTlNTTF9yZHRzYzoKK3sgLm1pYjsJbW92CQkJcjg9YXIuaXRjCisJYnIucmV0LnNwdGsubWFueQliMAkJfTs7CisuZW5kcCAgIE9QRU5TU0xfcmR0c2MjCisKKy5nbG9iYWwJT1BFTlNTTF9hdG9taWNfYWRkIworLnByb2MJT1BFTlNTTF9hdG9taWNfYWRkIworLmFsaWduCTMyCitPUEVOU1NMX2F0b21pY19hZGQ6Cit7IC5taWk7CWxkNAkJcjI9W3IzMl0KKwlub3AuaQkJMAorCW5vcC5pCQkwCQl9OzsKKy5Mc3BpbjoKK3sgLm1paTsJbW92CQlhci5jY3Y9cjIKKwlhZGQJCXI4PXIyLHIzMworCW1vdgkJcjM9cjIJCX07OworeyAubW1pOwltZgorCWNtcHhjaGc0LmFjcQlyMj1bcjMyXSxyOCxhci5jY3YKKwlub3AuaQkJMAkJfTs7Cit7IC5taWI7CWNtcC5uZQkJcDYscDA9cjIscjMKKwlub3AuaQkJMAorKHA2KQlici5kcG50CQkuTHNwaW4JCX07OworeyAubWliOwlub3AubQkJMAorCXN4dDQJCXI4PXI4CisJYnIucmV0LnNwdGsubWFueQliMAl9OzsKKy5lbmRwCU9QRU5TU0xfYXRvbWljX2FkZCMKKworLy8gUmV0dXJucyBhIHN0cnVjdHVyZSBjb21wcmlzaW5nIHBvaW50ZXIgdG8gdGhlIHRvcCBvZiBzdGFjayBvZgorLy8gdGhlIGNhbGxlciBhbmQgcG9pbnRlciBiZXlvbmQgYmFja2luZyBzdG9yYWdlIGZvciB0aGUgY3VycmVudAorLy8gcmVnaXN0ZXIgZnJhbWUuIFRoZSBsYXR0ZXIgaXMgcmVxdWlyZWQsIGJlY2F1c2UgaXQgbWlnaHQgYmUKKy8vIGluc3VmZmljaWVudCB0byB3aXBlIGJhY2tpbmcgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUKKy8vIChhcyB0aGlzIHByb2NlZHVyZSBkb2VzKSwgb25lIG1pZ2h0IGhhdmUgdG8gZ28gZnVydGhlciwgdG93YXJkCisvLyBoaWdoZXIgYWRkcmVzc2VzIHRvIHJlYWNoIGZvciB3aG9sZSAicmV0cm9hY3RpdmVseSIgc2F2ZWQKKy8vIGNvbnRleHQuLi4KKy5nbG9iYWwJT1BFTlNTTF93aXBlX2NwdSMKKy5wcm9jCU9QRU5TU0xfd2lwZV9jcHUjCisuYWxpZ24JMzIKK09QRU5TU0xfd2lwZV9jcHU6CisJLnByb2xvZ3VlCisJLmZmcmFtZQkwCisJLnNhdmUJYXIucGZzLHIyCisJLnNhdmUJYXIubGMscjMKK3sgLm1pYjsJYWxsb2MJCXIyPWFyLnBmcywwLDk2LDAsOTYKKwltb3YJCXIzPWFyLmxjCisJYnJwLmxvb3AuaW1wCS5MX3dpcGVfdG9wLC5MX3dpcGVfZW5kLTE2CisJCQkJCX07OworeyAubWlpOwltb3YJCXI5PWFyLmJzcAorCW1vdgkJcjg9cHIKKwltb3YJCWFyLmxjPTk2CX07OworCS5ib2R5Cit7IC5taWk7CWFkZAkJcjk9OTYqOC04LHI5CisJbW92CQlhci5lYz0xCQl9OzsKKworLy8gT25lIGNhbiBzd2VlcCBkb3VibGUgYXMgZmFzdCwgYnV0IHRoZW4gd2UgY2FuJ3QgcXVhcmFudGVlCisvLyB0aGF0IGJhY2tpbmcgc3RvcmFnZSBpcyB3aXBlZC4uLgorLkxfd2lwZV90b3A6Cit7IC5tZmk7CXN0OAkJW3I5XT1yMCwtOAorCW1vdgkJZjEyNz1mMAorCW1vdgkJcjEyNz1yMAkJfQoreyAubWZiOwlub3AubQkJMAorCW5vcC5mCQkwCisJYnIuY3RvcC5zcHRrCS5MX3dpcGVfdG9wCX07OworLkxfd2lwZV9lbmQ6CisKK3sgLm1maTsJbW92CQlyMTE9cjAKKwltb3YJCWY2PWYwCisJbW92CQlyMTQ9cjAJCX0KK3sgLm1maTsJbW92CQlyMTU9cjAKKwltb3YJCWY3PWYwCisJbW92CQlyMTY9cjAJCX0KK3sgLm1maTsJbW92CQlyMTc9cjAKKwltb3YJCWY4PWYwCisJbW92CQlyMTg9cjAJCX0KK3sgLm1maTsJbW92CQlyMTk9cjAKKwltb3YJCWY5PWYwCisJbW92CQlyMjA9cjAJCX0KK3sgLm1maTsJbW92CQlyMjE9cjAKKwltb3YJCWYxMD1mMAorCW1vdgkJcjIyPXIwCQl9Cit7IC5tZmk7CW1vdgkJcjIzPXIwCisJbW92CQlmMTE9ZjAKKwltb3YJCXIyND1yMAkJfQoreyAubWZpOwltb3YJCXIyNT1yMAorCW1vdgkJZjEyPWYwCisJbW92CQlyMjY9cjAJCX0KK3sgLm1maTsJbW92CQlyMjc9cjAKKwltb3YJCWYxMz1mMAorCW1vdgkJcjI4PXIwCQl9Cit7IC5tZmk7CW1vdgkJcjI5PXIwCisJbW92CQlmMTQ9ZjAKKwltb3YJCXIzMD1yMAkJfQoreyAubWZpOwltb3YJCXIzMT1yMAorCW1vdgkJZjE1PWYwCisJbm9wLmkJCTAJCX0KK3sgLm1maTsJbW92CQlmMTY9ZjAJCX0KK3sgLm1maTsJbW92CQlmMTc9ZjAJCX0KK3sgLm1maTsJbW92CQlmMTg9ZjAJCX0KK3sgLm1maTsJbW92CQlmMTk9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjA9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjE9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjI9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjM9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjQ9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjU9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjY9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjc9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjg9ZjAJCX0KK3sgLm1maTsJbW92CQlmMjk9ZjAJCX0KK3sgLm1maTsJbW92CQlmMzA9ZjAJCX0KK3sgLm1maTsJYWRkCQlyOT05Nio4KzgscjkKKwltb3YJCWYzMT1mMAorCW1vdgkJcHI9cjgsMHgxZmZmZgl9Cit7IC5taWI7CW1vdgkJcjg9c3AKKwltb3YJCWFyLmxjPXIzCisJYnIucmV0LnNwdGsJYjAJCX07OworLmVuZHAJT1BFTlNTTF93aXBlX2NwdSMKKworLmdsb2JhbAlPUEVOU1NMX2NsZWFuc2UjCisucHJvYwlPUEVOU1NMX2NsZWFuc2UjCitPUEVOU1NMX2NsZWFuc2U6Cit7IC5taWI7CWNtcC5lcQkJcDYscDA9MCxyMzMJICAgIC8vIGxlbj09MAorI2lmIGRlZmluZWQoX0hQVVhfU09VUkNFKSAmJiAhZGVmaW5lZChfTFA2NCkKKwlhZGRwNAkJcjMyPTAscjMyCisjZW5kaWYKKyhwNikJYnIucmV0LnNwbnQJYjAJCX07OworeyAubWliOwlhbmQJCXIyPTcscjMyCisJY21wLmxldQkJcDYscDA9MTUscjMzCSAgICAvLyBsZW4+PTE1CisocDYpCWJyLmNvbmQuZHB0awkuTG90CQl9OzsKKworLkxpdHRsZToKK3sgLm1pYjsJc3QxCQlbcjMyXT1yMCwxCisJY21wLmx0dQkJcDYscDc9MSxyMzMJfSAgLy8gbGVuPjEKK3sgLm1iYjsJYWRkCQlyMzM9LTEscjMzCSAgIC8vIGxlbi0tCisocDYpCWJyLmNvbmQuZHB0awkuTGl0dGxlCisocDcpCWJyLnJldC5zcHRrLm1hbnkJYjAJfTs7CisKKy5Mb3Q6Cit7IC5taWI7CWNtcC5lcQkJcDYscDA9MCxyMgorKHA2KQlici5jb25kLmRwdGsJLkxhbGlnbmVkCX07OworeyAubW1pOwlzdDEJCVtyMzJdPXIwLDE7OworCWFuZAkJcjI9NyxyMzIJfQoreyAubWliOwlhZGQJCXIzMz0tMSxyMzMKKwlicgkJLkxvdAkJfTs7CisKKy5MYWxpZ25lZDoKK3sgLm1taTsJc3Q4CQlbcjMyXT1yMCw4CisJYW5kCQlyMj0tOCxyMzMJICAgIC8vIGxlbiZ+NworCWFkZAkJcjMzPS04LHIzMwl9OzsgLy8gbGVuLT04Cit7IC5taWI7CWNtcC5sdHUJCXA2LHAwPTgscjIJICAgIC8vICgobGVuKzgpJn43KT44CisocDYpCWJyLmNvbmQuZHB0awkuTGFsaWduZWQJfTs7CisKK3sgLm1iYjsJY21wLmVxCQlwNixwNz1yMCxyMzMKKyhwNykJYnIuY29uZC5kcG50CS5MaXR0bGUKKyhwNikJYnIucmV0LnNwdGsubWFueQliMAl9OzsKKy5lbmRwCU9QRU5TU0xfY2xlYW5zZSMKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9pbnN0YWxsLmNvbSBiL2xpYi9vcGVuc3NsL2NyeXB0by9pbnN0YWxsLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDNlNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2luc3RhbGwuY29tCkBAIC0wLDAgKzEsMTU1IEBACiskISBJTlNUQUxMLkNPTSAtLSBJbnN0YWxscyB0aGUgZmlsZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnkgdHJlZQorJCEKKyQhIEF1dGhvcjogUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPgorJCEgVGltZSBvZiBjcmVhdGlvbjogMjItTUFZLTE5OTggMTA6MTMKKyQhCiskISBDaGFuZ2VzIGJ5IFpvbHRhbiBBcnBhZGZmeSA8em9saUBwb2xhcmhvbWUuY29tPgorJCEKKyQhIFAxCXJvb3Qgb2YgdGhlIGRpcmVjdG9yeSB0cmVlCiskIQorJAlJRiBQMSAuRVFTLiAiIgorJAlUSEVOCiskCSAgICBXUklURSBTWVMkT1VUUFVUICJGaXJzdCBhcmd1bWVudCBtaXNzaW5nLiIKKyQJICAgIFdSSVRFIFNZUyRPVVRQVVQgLQorCQkgICJJdCBzaG91bGQgYmUgdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3Ugd2FudCB0aGluZ3MgaW5zdGFsbGVkLiIKKyQJICAgIEVYSVQKKyQJRU5ESUYKKyQKKyQJSUYgKEYkR0VUU1lJKCJDUFUiKS5MVC4xMjgpCiskCVRIRU4KKyQJICAgIEFSQ0ggOj0gVkFYCiskCUVMU0UKKyQJICAgIEFSQ0ggPSBGJEVESVQoIEYkR0VUU1lJKCAiQVJDSF9OQU1FIiksICJVUENBU0UiKQorJAkgICAgSUYgKEFSQ0ggLkVRUy4gIiIpIFRIRU4gQVJDSCA9ICJVTksiCiskCUVORElGCiskCiskCVJPT1QgPSBGJFBBUlNFKFAxLCJbXUEuOzAiLCwsIlNZTlRBWF9PTkxZLE5PX0NPTkNFQUwiKSAtICJBLjswIgorJAlST09UX0RFViA9IEYkUEFSU0UoUk9PVCwsLCJERVZJQ0UiLCJTWU5UQVhfT05MWSIpCiskCVJPT1RfRElSID0gRiRQQVJTRShST09ULCwsIkRJUkVDVE9SWSIsIlNZTlRBWF9PTkxZIikgLQorCQkgICAtICJbMDAwMDAwLiIgLSAiXVsiIC0gIlsiIC0gIl0iCiskCVJPT1QgPSBST09UX0RFViArICJbIiArIFJPT1RfRElSCiskCiskCURFRklORS9OT0xPRyBXUktfU1NMUk9PVCAnUk9PVCcuXSAvVFJBTlM9Q09OQworJAlERUZJTkUvTk9MT0cgV1JLX1NTTExJQiBXUktfU1NMUk9PVDpbJ0FSQ0gnX0xJQl0KKyQJREVGSU5FL05PTE9HIFdSS19TU0xJTkNMVURFIFdSS19TU0xST09UOltJTkNMVURFXQorJAorJAlJRiBGJFBBUlNFKCJXUktfU1NMUk9PVDpbMDAwMDAwXSIpIC5FUVMuICIiIFRIRU4gLQorCSAgIENSRUFURS9ESVIvTE9HIFdSS19TU0xST09UOlswMDAwMDBdCiskCUlGIEYkUEFSU0UoIldSS19TU0xMSUI6IikgLkVRUy4gIiIgVEhFTiAtCisJICAgQ1JFQVRFL0RJUi9MT0cgV1JLX1NTTExJQjoKKyQJSUYgRiRQQVJTRSgiV1JLX1NTTElOQ0xVREU6IikgLkVRUy4gIiIgVEhFTiAtCisJICAgQ1JFQVRFL0RJUi9MT0cgV1JLX1NTTElOQ0xVREU6CiskCiskCVNESVJTIDo9ICwtCisJCSBfJ0FSQ0gnLC0KKwkJIE9CSkVDVFMsLQorCQkgTUQyLE1ENCxNRDUsU0hBLE1EQzIsSE1BQyxSSVBFTUQsV0hSTFBPT0wsLQorCQkgREVTLEFFUyxSQzIsUkM0LFJDNSxJREVBLEJGLENBU1QsQ0FNRUxMSUEsU0VFRCwtCisJCSBCTixFQyxSU0EsRFNBLEVDRFNBLERILEVDREgsRFNPLEVOR0lORSwtCisJCSBCVUZGRVIsQklPLFNUQUNLLExIQVNILFJBTkQsRVJSLC0KKwkJIEVWUCxBU04xLFBFTSxYNTA5LFg1MDlWMyxDT05GLFRYVF9EQixQS0NTNyxQS0NTMTIsQ09NUCxPQ1NQLC0KKwkJIFVJLEtSQjUsLQorCQkgU1RPUkUsQ01TLFBRVUVVRSxUUyxKUEFLRQorJAlFWEhFQURFUl8gOj0gY3J5cHRvLmgsb3BlbnNzbHYuaCxlYmNkaWMuaCxzeW1oYWNrcy5oLG9zc2xfdHlwLmgKKyQJRVhIRUFERVJfXydBUkNIJyA6PSBvcGVuc3NsY29uZi5oCiskCUVYSEVBREVSX09CSkVDVFMgOj0gb2JqZWN0cy5oLG9ial9tYWMuaAorJAlFWEhFQURFUl9NRDIgOj0gbWQyLmgKKyQJRVhIRUFERVJfTUQ0IDo9IG1kNC5oCiskCUVYSEVBREVSX01ENSA6PSBtZDUuaAorJAlFWEhFQURFUl9TSEEgOj0gc2hhLmgKKyQJRVhIRUFERVJfTURDMiA6PSBtZGMyLmgKKyQJRVhIRUFERVJfSE1BQyA6PSBobWFjLmgKKyQJRVhIRUFERVJfUklQRU1EIDo9IHJpcGVtZC5oCiskCUVYSEVBREVSX1dIUkxQT09MIDo9IHdocmxwb29sLmgKKyQJRVhIRUFERVJfREVTIDo9IGRlcy5oLGRlc19vbGQuaAorJAlFWEhFQURFUl9BRVMgOj0gYWVzLmgKKyQJRVhIRUFERVJfUkMyIDo9IHJjMi5oCiskCUVYSEVBREVSX1JDNCA6PSByYzQuaAorJAlFWEhFQURFUl9SQzUgOj0gcmM1LmgKKyQJRVhIRUFERVJfSURFQSA6PSBpZGVhLmgKKyQJRVhIRUFERVJfQkYgOj0gYmxvd2Zpc2guaAorJAlFWEhFQURFUl9DQVNUIDo9IGNhc3QuaAorJAlFWEhFQURFUl9DQU1FTExJQSA6PSBjYW1lbGxpYS5oCiskCUVYSEVBREVSX1NFRUQgOj0gc2VlZC5oCiskCUVYSEVBREVSX01PREVTIDo9IG1vZGVzLmgKKyQJRVhIRUFERVJfQk4gOj0gYm4uaAorJAlFWEhFQURFUl9FQyA6PSBlYy5oCiskCUVYSEVBREVSX1JTQSA6PSByc2EuaAorJAlFWEhFQURFUl9EU0EgOj0gZHNhLmgKKyQJRVhIRUFERVJfRUNEU0EgOj0gZWNkc2EuaAorJAlFWEhFQURFUl9ESCA6PSBkaC5oCiskCUVYSEVBREVSX0VDREggOj0gZWNkaC5oCiskCUVYSEVBREVSX0RTTyA6PSBkc28uaAorJAlFWEhFQURFUl9FTkdJTkUgOj0gZW5naW5lLmgKKyQJRVhIRUFERVJfQlVGRkVSIDo9IGJ1ZmZlci5oCiskCUVYSEVBREVSX0JJTyA6PSBiaW8uaAorJAlFWEhFQURFUl9TVEFDSyA6PSBzdGFjay5oLHNhZmVzdGFjay5oCiskCUVYSEVBREVSX0xIQVNIIDo9IGxoYXNoLmgKKyQJRVhIRUFERVJfUkFORCA6PSByYW5kLmgKKyQJRVhIRUFERVJfRVJSIDo9IGVyci5oCiskCUVYSEVBREVSX0VWUCA6PSBldnAuaAorJAlFWEhFQURFUl9BU04xIDo9IGFzbjEuaCxhc24xX21hYy5oLGFzbjF0LmgKKyQJRVhIRUFERVJfUEVNIDo9IHBlbS5oLHBlbTIuaAorJAlFWEhFQURFUl9YNTA5IDo9IHg1MDkuaCx4NTA5X3ZmeS5oCiskCUVYSEVBREVSX1g1MDlWMyA6PSB4NTA5djMuaAorJAlFWEhFQURFUl9DT05GIDo9IGNvbmYuaCxjb25mX2FwaS5oCiskCUVYSEVBREVSX1RYVF9EQiA6PSB0eHRfZGIuaAorJAlFWEhFQURFUl9QS0NTNyA6PSBwa2NzNy5oCiskCUVYSEVBREVSX1BLQ1MxMiA6PSBwa2NzMTIuaAorJAlFWEhFQURFUl9DT01QIDo9IGNvbXAuaAorJAlFWEhFQURFUl9PQ1NQIDo9IG9jc3AuaAorJAlFWEhFQURFUl9VSSA6PSB1aS5oLHVpX2NvbXBhdC5oCiskCUVYSEVBREVSX0tSQjUgOj0ga3JiNV9hc24uaAorJCEJRVhIRUFERVJfU1RPUkUgOj0gc3RvcmUuaCxzdHJfY29tcGF0LmgKKyQJRVhIRUFERVJfU1RPUkUgOj0gc3RvcmUuaAorJAlFWEhFQURFUl9DTVMgOj0gY21zLmgKKyQJRVhIRUFERVJfUFFVRVVFIDo9IHBxdWV1ZS5oCiskCUVYSEVBREVSX1RTIDo9IHRzLmgKKyQJRVhIRUFERVJfSlBBS0UgOj0ganBha2UuaAorJAlMSUJTIDo9IExJQkNSWVBUTworJAorJAlFWEVfRElSIDo9IFstLidBUkNIJy5FWEUuQ1JZUFRPXQorJAorJAlJID0gMAorJCBMT09QX1NESVJTOiAKKyQJRCA9IEYkRURJVChGJEVMRU1FTlQoSSwgIiwiLCBTRElSUyksIlRSSU0iKQorJAlJID0gSSArIDEKKyQJSUYgRCAuRVFTLiAiLCIgVEhFTiBHT1RPIExPT1BfU0RJUlNfRU5ECiskCXRtcCA9IEVYSEVBREVSXydEJworJAlJRiBEIC5FUVMuICIiCiskCVRIRU4KKyQJICBDT1BZICd0bXAnIFdSS19TU0xJTkNMVURFOiAvTE9HCiskCUVMU0UKKyQJICBJRiBEIC5FUVMuICJfJydBUkNIJyIKKyQJICBUSEVOCiskCSAgICBDT1BZIFstLidBUkNIJy5DUllQVE9dJ3RtcCcgV1JLX1NTTElOQ0xVREU6IC9MT0cKKyQJICBFTFNFCiskCSAgICBDT1BZIFsuJ0QnXSd0bXAnIFdSS19TU0xJTkNMVURFOiAvTE9HCiskCSAgRU5ESUYKKyQJRU5ESUYKKyQJU0VUIEZJTEUvUFJPVD1XT1JMRDpSRSBXUktfU1NMSU5DTFVERTondG1wJworJAlHT1RPIExPT1BfU0RJUlMKKyQgTE9PUF9TRElSU19FTkQ6CiskCiskCUkgPSAwCiskIExPT1BfTElCOiAKKyQJRSA9IEYkRURJVChGJEVMRU1FTlQoSSwgIiwiLCBMSUJTKSwiVFJJTSIpCiskCUkgPSBJICsgMQorJAlJRiBFIC5FUVMuICIsIiBUSEVOIEdPVE8gTE9PUF9MSUJfRU5ECiskCVNFVCBOT09OCiskCUlGIEYkU0VBUkNIKEVYRV9ESVIrRSsiLk9MQiIpIC5ORVMuICIiCiskCVRIRU4KKyQJICBDT1BZICdFWEVfRElSJydFJy5PTEIgV1JLX1NTTExJQjonRScuT0xCL2xvZworJAkgIFNFVCBGSUxFL1BST1Q9VzpSRSBXUktfU1NMTElCOidFJy5PTEIKKyQJRU5ESUYKKyQJISBQcmVwYXJpbmcgZm9yIHRoZSB0aW1lIHdoZW4gd2UgaGF2ZSBzaGFyZWFibGUgaW1hZ2VzCiskCUlGIEYkU0VBUkNIKEVYRV9ESVIrRSsiLkVYRSIpIC5ORVMuICIiCiskCVRIRU4KKyQJICBDT1BZICdFWEVfRElSJydFJy5FWEUgV1JLX1NTTExJQjonRScuRVhFL2xvZworJAkgIFNFVCBGSUxFL1BST1Q9VzpSRSBXUktfU1NMTElCOidFJy5FWEUKKyQJRU5ESUYKKyQJU0VUIE9OCiskCUdPVE8gTE9PUF9MSUIKKyQgTE9PUF9MSUJfRU5EOgorJAorJAlFWElUCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vanBha2UvanBha2UuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9qcGFrZS9qcGFrZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmQ5ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vanBha2UvanBha2UuYwpAQCAtMCwwICsxLDQ4MiBAQAorI2luY2x1ZGUgImpwYWtlLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKworLyoKKyAqIEluIHRoZSBkZWZpbml0aW9uLCAoeGEsIHhiLCB4YywgeGQpIGFyZSBBbGljZSdzICh4MSwgeDIsIHgzLCB4NCkgb3IKKyAqIEJvYidzICh4MywgeDQsIHgxLCB4MikuIElmIHlvdSBzZWUgd2hhdCBJIG1lYW4uCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgY2hhciAqbmFtZTsgIC8qIE11c3QgYmUgdW5pcXVlICovCisgICAgY2hhciAqcGVlcl9uYW1lOworICAgIEJJR05VTSAqcDsKKyAgICBCSUdOVU0gKmc7CisgICAgQklHTlVNICpxOworICAgIEJJR05VTSAqZ3hjOyAvKiBBbGljZSdzIGdee3gzfSBvciBCb2IncyBnXnt4MX0gKi8KKyAgICBCSUdOVU0gKmd4ZDsgLyogQWxpY2UncyBnXnt4NH0gb3IgQm9iJ3MgZ157eDJ9ICovCisgICAgfSBKUEFLRV9DVFhfUFVCTElDOworCitzdHJ1Y3QgSlBBS0VfQ1RYCisgICAgeworICAgIEpQQUtFX0NUWF9QVUJMSUMgcDsKKyAgICBCSUdOVU0gKnNlY3JldDsgICAvKiBUaGUgc2hhcmVkIHNlY3JldCAqLworICAgIEJOX0NUWCAqY3R4OworICAgIEJJR05VTSAqeGE7ICAgICAgIC8qIEFsaWNlJ3MgeDEgb3IgQm9iJ3MgeDMgKi8KKyAgICBCSUdOVU0gKnhiOyAgICAgICAvKiBBbGljZSdzIHgyIG9yIEJvYidzIHg0ICovCisgICAgQklHTlVNICprZXk7ICAgICAgLyogVGhlIGNhbGN1bGF0ZWQgKHNoYXJlZCkga2V5ICovCisgICAgfTsKKworc3RhdGljIHZvaWQgSlBBS0VfWktQX2luaXQoSlBBS0VfWktQICp6a3ApCisgICAgeworICAgIHprcC0+Z3IgPSBCTl9uZXcoKTsKKyAgICB6a3AtPmIgPSBCTl9uZXcoKTsKKyAgICB9CisKK3N0YXRpYyB2b2lkIEpQQUtFX1pLUF9yZWxlYXNlKEpQQUtFX1pLUCAqemtwKQorICAgIHsKKyAgICBCTl9mcmVlKHprcC0+Yik7CisgICAgQk5fZnJlZSh6a3AtPmdyKTsKKyAgICB9CisKKy8qIFR3byBiaXJkcyB3aXRoIG9uZSBzdG9uZSAtIG1ha2UgdGhlIGdsb2JhbCBuYW1lIGFzIGV4cGVjdGVkICovCisjZGVmaW5lIEpQQUtFX1NURVBfUEFSVF9pbml0CUpQQUtFX1NURVAyX2luaXQKKyNkZWZpbmUgSlBBS0VfU1RFUF9QQVJUX3JlbGVhc2UJSlBBS0VfU1RFUDJfcmVsZWFzZQorCit2b2lkIEpQQUtFX1NURVBfUEFSVF9pbml0KEpQQUtFX1NURVBfUEFSVCAqcCkKKyAgICB7CisgICAgcC0+Z3ggPSBCTl9uZXcoKTsKKyAgICBKUEFLRV9aS1BfaW5pdCgmcC0+emtweCk7CisgICAgfQorCit2b2lkIEpQQUtFX1NURVBfUEFSVF9yZWxlYXNlKEpQQUtFX1NURVBfUEFSVCAqcCkKKyAgICB7CisgICAgSlBBS0VfWktQX3JlbGVhc2UoJnAtPnprcHgpOworICAgIEJOX2ZyZWUocC0+Z3gpOworICAgIH0KKwordm9pZCBKUEFLRV9TVEVQMV9pbml0KEpQQUtFX1NURVAxICpzMSkKKyAgICB7CisgICAgSlBBS0VfU1RFUF9QQVJUX2luaXQoJnMxLT5wMSk7CisgICAgSlBBS0VfU1RFUF9QQVJUX2luaXQoJnMxLT5wMik7CisgICAgfQorCit2b2lkIEpQQUtFX1NURVAxX3JlbGVhc2UoSlBBS0VfU1RFUDEgKnMxKQorICAgIHsKKyAgICBKUEFLRV9TVEVQX1BBUlRfcmVsZWFzZSgmczEtPnAyKTsKKyAgICBKUEFLRV9TVEVQX1BBUlRfcmVsZWFzZSgmczEtPnAxKTsKKyAgICB9CisKK3N0YXRpYyB2b2lkIEpQQUtFX0NUWF9pbml0KEpQQUtFX0NUWCAqY3R4LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgY29uc3QgY2hhciAqcGVlcl9uYW1lLCBjb25zdCBCSUdOVU0gKnAsCisJCQkgICBjb25zdCBCSUdOVU0gKmcsIGNvbnN0IEJJR05VTSAqcSwKKwkJCSAgIGNvbnN0IEJJR05VTSAqc2VjcmV0KQorICAgIHsKKyAgICBjdHgtPnAubmFtZSA9IE9QRU5TU0xfc3RyZHVwKG5hbWUpOworICAgIGN0eC0+cC5wZWVyX25hbWUgPSBPUEVOU1NMX3N0cmR1cChwZWVyX25hbWUpOworICAgIGN0eC0+cC5wID0gQk5fZHVwKHApOworICAgIGN0eC0+cC5nID0gQk5fZHVwKGcpOworICAgIGN0eC0+cC5xID0gQk5fZHVwKHEpOworICAgIGN0eC0+c2VjcmV0ID0gQk5fZHVwKHNlY3JldCk7CisKKyAgICBjdHgtPnAuZ3hjID0gQk5fbmV3KCk7CisgICAgY3R4LT5wLmd4ZCA9IEJOX25ldygpOworCisgICAgY3R4LT54YSA9IEJOX25ldygpOworICAgIGN0eC0+eGIgPSBCTl9uZXcoKTsKKyAgICBjdHgtPmtleSA9IEJOX25ldygpOworICAgIGN0eC0+Y3R4ID0gQk5fQ1RYX25ldygpOworICAgIH0KKyAgICAKK3N0YXRpYyB2b2lkIEpQQUtFX0NUWF9yZWxlYXNlKEpQQUtFX0NUWCAqY3R4KQorICAgIHsKKyAgICBCTl9DVFhfZnJlZShjdHgtPmN0eCk7CisgICAgQk5fY2xlYXJfZnJlZShjdHgtPmtleSk7CisgICAgQk5fY2xlYXJfZnJlZShjdHgtPnhiKTsKKyAgICBCTl9jbGVhcl9mcmVlKGN0eC0+eGEpOworCisgICAgQk5fZnJlZShjdHgtPnAuZ3hkKTsKKyAgICBCTl9mcmVlKGN0eC0+cC5neGMpOworCisgICAgQk5fY2xlYXJfZnJlZShjdHgtPnNlY3JldCk7CisgICAgQk5fZnJlZShjdHgtPnAucSk7CisgICAgQk5fZnJlZShjdHgtPnAuZyk7CisgICAgQk5fZnJlZShjdHgtPnAucCk7CisgICAgT1BFTlNTTF9mcmVlKGN0eC0+cC5wZWVyX25hbWUpOworICAgIE9QRU5TU0xfZnJlZShjdHgtPnAubmFtZSk7CisKKyAgICBtZW1zZXQoY3R4LCAnXDAnLCBzaXplb2YgKmN0eCk7CisgICAgfQorICAgIAorSlBBS0VfQ1RYICpKUEFLRV9DVFhfbmV3KGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnBlZXJfbmFtZSwKKwkJCSBjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqZywgY29uc3QgQklHTlVNICpxLAorCQkJIGNvbnN0IEJJR05VTSAqc2VjcmV0KQorICAgIHsKKyAgICBKUEFLRV9DVFggKmN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZiAqY3R4KTsKKworICAgIEpQQUtFX0NUWF9pbml0KGN0eCwgbmFtZSwgcGVlcl9uYW1lLCBwLCBnLCBxLCBzZWNyZXQpOworCisgICAgcmV0dXJuIGN0eDsKKyAgICB9CisKK3ZvaWQgSlBBS0VfQ1RYX2ZyZWUoSlBBS0VfQ1RYICpjdHgpCisgICAgeworICAgIEpQQUtFX0NUWF9yZWxlYXNlKGN0eCk7CisgICAgT1BFTlNTTF9mcmVlKGN0eCk7CisgICAgfQorCitzdGF0aWMgdm9pZCBoYXNobGVuZ3RoKFNIQV9DVFggKnNoYSwgc2l6ZV90IGwpCisgICAgeworICAgIHVuc2lnbmVkIGNoYXIgYlsyXTsKKworICAgIE9QRU5TU0xfYXNzZXJ0KGwgPD0gMHhmZmZmKTsKKyAgICBiWzBdID0gbCA+PiA4OworICAgIGJbMV0gPSBsJjB4ZmY7CisgICAgU0hBMV9VcGRhdGUoc2hhLCBiLCAyKTsKKyAgICB9CisKK3N0YXRpYyB2b2lkIGhhc2hzdHJpbmcoU0hBX0NUWCAqc2hhLCBjb25zdCBjaGFyICpzdHJpbmcpCisgICAgeworICAgIHNpemVfdCBsID0gc3RybGVuKHN0cmluZyk7CisKKyAgICBoYXNobGVuZ3RoKHNoYSwgbCk7CisgICAgU0hBMV9VcGRhdGUoc2hhLCBzdHJpbmcsIGwpOworICAgIH0KKworc3RhdGljIHZvaWQgaGFzaGJuKFNIQV9DVFggKnNoYSwgY29uc3QgQklHTlVNICpibikKKyAgICB7CisgICAgc2l6ZV90IGwgPSBCTl9udW1fYnl0ZXMoYm4pOworICAgIHVuc2lnbmVkIGNoYXIgKmJpbiA9IE9QRU5TU0xfbWFsbG9jKGwpOworCisgICAgaGFzaGxlbmd0aChzaGEsIGwpOworICAgIEJOX2JuMmJpbihibiwgYmluKTsKKyAgICBTSEExX1VwZGF0ZShzaGEsIGJpbiwgbCk7CisgICAgT1BFTlNTTF9mcmVlKGJpbik7CisgICAgfQorCisvKiBoPWhhc2goZywgZ15yLCBnXngsIG5hbWUpICovCitzdGF0aWMgdm9pZCB6a3BfaGFzaChCSUdOVU0gKmgsIGNvbnN0IEJJR05VTSAqemtwZywgY29uc3QgSlBBS0VfU1RFUF9QQVJUICpwLAorCQkgICAgIGNvbnN0IGNoYXIgKnByb29mX25hbWUpCisgICAgeworICAgIHVuc2lnbmVkIGNoYXIgbWRbU0hBX0RJR0VTVF9MRU5HVEhdOworICAgIFNIQV9DVFggc2hhOworCisgICAvKgorICAgICogWFhYOiBoYXNoIHNob3VsZCBub3QgYWxsb3cgbW92aW5nIG9mIHRoZSBib3VuZGFyaWVzIC0gSmF2YSBjb2RlCisgICAgKiBpcyBmbGF3ZWQgaW4gdGhpcyByZXNwZWN0LiBMZW5ndGggZW5jb2Rpbmcgc2VlbXMgc2ltcGxlc3QuCisgICAgKi8KKyAgICBTSEExX0luaXQoJnNoYSk7CisgICAgaGFzaGJuKCZzaGEsIHprcGcpOworICAgIE9QRU5TU0xfYXNzZXJ0KCFCTl9pc196ZXJvKHAtPnprcHguZ3IpKTsKKyAgICBoYXNoYm4oJnNoYSwgcC0+emtweC5ncik7CisgICAgaGFzaGJuKCZzaGEsIHAtPmd4KTsKKyAgICBoYXNoc3RyaW5nKCZzaGEsIHByb29mX25hbWUpOworICAgIFNIQTFfRmluYWwobWQsICZzaGEpOworICAgIEJOX2JpbjJibihtZCwgU0hBX0RJR0VTVF9MRU5HVEgsIGgpOworICAgIH0KKworLyoKKyAqIFByb3ZlIGtub3dsZWRnZSBvZiB4CisgKiBOb3RlIHRoYXQgcC0+Z3ggaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkCisgKi8KK3N0YXRpYyB2b2lkIGdlbmVyYXRlX3prcChKUEFLRV9TVEVQX1BBUlQgKnAsIGNvbnN0IEJJR05VTSAqeCwKKwkJCSBjb25zdCBCSUdOVU0gKnprcGcsIEpQQUtFX0NUWCAqY3R4KQorICAgIHsKKyAgICBCSUdOVU0gKnIgPSBCTl9uZXcoKTsKKyAgICBCSUdOVU0gKmggPSBCTl9uZXcoKTsKKyAgICBCSUdOVU0gKnQgPSBCTl9uZXcoKTsKKworICAgLyoKKyAgICAqIHIgaW4gWzAscSkKKyAgICAqIFhYWDogSmF2YSBjaG9vc2VzIHIgaW4gWzAsIDJeMTYwKSAtIGkuZS4gZGlzdHJpYnV0aW9uIG5vdCB1bmlmb3JtCisgICAgKi8KKyAgICBCTl9yYW5kX3JhbmdlKHIsIGN0eC0+cC5xKTsKKyAgIC8qIGdeciAqLworICAgIEJOX21vZF9leHAocC0+emtweC5nciwgemtwZywgciwgY3R4LT5wLnAsIGN0eC0+Y3R4KTsKKworICAgLyogaD1oYXNoLi4uICovCisgICAgemtwX2hhc2goaCwgemtwZywgcCwgY3R4LT5wLm5hbWUpOworCisgICAvKiBiID0gciAtIHgqaCAqLworICAgIEJOX21vZF9tdWwodCwgeCwgaCwgY3R4LT5wLnEsIGN0eC0+Y3R4KTsKKyAgICBCTl9tb2Rfc3ViKHAtPnprcHguYiwgciwgdCwgY3R4LT5wLnEsIGN0eC0+Y3R4KTsKKworICAgLyogY2xlYW51cCAqLworICAgIEJOX2ZyZWUodCk7CisgICAgQk5fZnJlZShoKTsKKyAgICBCTl9mcmVlKHIpOworICAgIH0KKworc3RhdGljIGludCB2ZXJpZnlfemtwKGNvbnN0IEpQQUtFX1NURVBfUEFSVCAqcCwgY29uc3QgQklHTlVNICp6a3BnLAorCQkgICAgICBKUEFLRV9DVFggKmN0eCkKKyAgICB7CisgICAgQklHTlVNICpoID0gQk5fbmV3KCk7CisgICAgQklHTlVNICp0MSA9IEJOX25ldygpOworICAgIEJJR05VTSAqdDIgPSBCTl9uZXcoKTsKKyAgICBCSUdOVU0gKnQzID0gQk5fbmV3KCk7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB6a3BfaGFzaChoLCB6a3BnLCBwLCBjdHgtPnAucGVlcl9uYW1lKTsKKworICAgLyogdDEgPSBnXmIgKi8KKyAgICBCTl9tb2RfZXhwKHQxLCB6a3BnLCBwLT56a3B4LmIsIGN0eC0+cC5wLCBjdHgtPmN0eCk7CisgICAvKiB0MiA9IChnXngpXmggPSBnXntoeH0gKi8KKyAgICBCTl9tb2RfZXhwKHQyLCBwLT5neCwgaCwgY3R4LT5wLnAsIGN0eC0+Y3R4KTsKKyAgIC8qIHQzID0gdDEgKiB0MiA9IGdee2h4fSAqIGdeYiA9IGdee2h4K2J9ID0gZ15yIChhbGxlZ2VkbHkpICovCisgICAgQk5fbW9kX211bCh0MywgdDEsIHQyLCBjdHgtPnAucCwgY3R4LT5jdHgpOworCisgICAvKiB2ZXJpZnkgdDMgPT0gZ15yICovCisgICAgaWYoQk5fY21wKHQzLCBwLT56a3B4LmdyKSA9PSAwKQorCXJldCA9IDE7CisgICAgZWxzZQorCUpQQUtFZXJyKEpQQUtFX0ZfVkVSSUZZX1pLUCwgSlBBS0VfUl9aS1BfVkVSSUZZX0ZBSUxFRCk7CisKKyAgIC8qIGNsZWFudXAgKi8KKyAgICBCTl9mcmVlKHQzKTsKKyAgICBCTl9mcmVlKHQyKTsKKyAgICBCTl9mcmVlKHQxKTsKKyAgICBCTl9mcmVlKGgpOworCisgICAgcmV0dXJuIHJldDsKKyAgICB9ICAgIAorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9zdGVwX3BhcnQoSlBBS0VfU1RFUF9QQVJUICpwLCBjb25zdCBCSUdOVU0gKngsCisJCQkgICAgICAgY29uc3QgQklHTlVNICpnLCBKUEFLRV9DVFggKmN0eCkKKyAgICB7CisgICAgQk5fbW9kX2V4cChwLT5neCwgZywgeCwgY3R4LT5wLnAsIGN0eC0+Y3R4KTsKKyAgICBnZW5lcmF0ZV96a3AocCwgeCwgZywgY3R4KTsKKyAgICB9CisKKy8qIEdlbmVyYXRlIGVhY2ggcGFydHkncyByYW5kb20gbnVtYmVycy4geGEgaXMgaW4gWzAsIHEpLCB4YiBpcyBpbiBbMSwgcSkuICovCitzdGF0aWMgdm9pZCBnZW5yYW5kKEpQQUtFX0NUWCAqY3R4KQorICAgIHsKKyAgICBCSUdOVU0gKnFtMTsKKworICAgLyogeGEgaW4gWzAsIHEpICovCisgICAgQk5fcmFuZF9yYW5nZShjdHgtPnhhLCBjdHgtPnAucSk7CisKKyAgIC8qIHEtMSAqLworICAgIHFtMSA9IEJOX25ldygpOworICAgIEJOX2NvcHkocW0xLCBjdHgtPnAucSk7CisgICAgQk5fc3ViX3dvcmQocW0xLCAxKTsKKworICAgLyogLi4uIGFuZCB4YiBpbiBbMCwgcS0xKSAqLworICAgIEJOX3JhbmRfcmFuZ2UoY3R4LT54YiwgcW0xKTsKKyAgIC8qIFsxLCBxKSAqLworICAgIEJOX2FkZF93b3JkKGN0eC0+eGIsIDEpOworCisgICAvKiBjbGVhbnVwICovCisgICAgQk5fZnJlZShxbTEpOworICAgIH0KKworaW50IEpQQUtFX1NURVAxX2dlbmVyYXRlKEpQQUtFX1NURVAxICpzZW5kLCBKUEFLRV9DVFggKmN0eCkKKyAgICB7CisgICAgZ2VucmFuZChjdHgpOworICAgIGdlbmVyYXRlX3N0ZXBfcGFydCgmc2VuZC0+cDEsIGN0eC0+eGEsIGN0eC0+cC5nLCBjdHgpOworICAgIGdlbmVyYXRlX3N0ZXBfcGFydCgmc2VuZC0+cDIsIGN0eC0+eGIsIGN0eC0+cC5nLCBjdHgpOworCisgICAgcmV0dXJuIDE7CisgICAgfQorCitpbnQgSlBBS0VfU1RFUDFfcHJvY2VzcyhKUEFLRV9DVFggKmN0eCwgY29uc3QgSlBBS0VfU1RFUDEgKnJlY2VpdmVkKQorICAgIHsKKyAgIC8qIHZlcmlmeSB0aGVpciBaS1AoeGMpICovCisgICAgaWYoIXZlcmlmeV96a3AoJnJlY2VpdmVkLT5wMSwgY3R4LT5wLmcsIGN0eCkpCisJeworCUpQQUtFZXJyKEpQQUtFX0ZfSlBBS0VfU1RFUDFfUFJPQ0VTUywgSlBBS0VfUl9WRVJJRllfWDNfRkFJTEVEKTsKKwlyZXR1cm4gMDsKKwl9CisKKyAgIC8qIHZlcmlmeSB0aGVpciBaS1AoeGQpICovCisgICAgaWYoIXZlcmlmeV96a3AoJnJlY2VpdmVkLT5wMiwgY3R4LT5wLmcsIGN0eCkpCisJeworCUpQQUtFZXJyKEpQQUtFX0ZfSlBBS0VfU1RFUDFfUFJPQ0VTUywgSlBBS0VfUl9WRVJJRllfWDRfRkFJTEVEKTsKKwlyZXR1cm4gMDsKKwl9CisKKyAgIC8qIGdeeGQgIT0gMSAqLworICAgIGlmKEJOX2lzX29uZShyZWNlaXZlZC0+cDIuZ3gpKQorCXsKKwlKUEFLRWVycihKUEFLRV9GX0pQQUtFX1NURVAxX1BST0NFU1MsIEpQQUtFX1JfR19UT19USEVfWDRfSVNfT05FKTsKKwlyZXR1cm4gMDsKKwl9CisKKyAgIC8qIFNhdmUgdGhlIGJpdHMgd2UgbmVlZCBmb3IgbGF0ZXIgKi8KKyAgICBCTl9jb3B5KGN0eC0+cC5neGMsIHJlY2VpdmVkLT5wMS5neCk7CisgICAgQk5fY29weShjdHgtPnAuZ3hkLCByZWNlaXZlZC0+cDIuZ3gpOworCisgICAgcmV0dXJuIDE7CisgICAgfQorCisKK2ludCBKUEFLRV9TVEVQMl9nZW5lcmF0ZShKUEFLRV9TVEVQMiAqc2VuZCwgSlBBS0VfQ1RYICpjdHgpCisgICAgeworICAgIEJJR05VTSAqdDEgPSBCTl9uZXcoKTsKKyAgICBCSUdOVU0gKnQyID0gQk5fbmV3KCk7CisKKyAgIC8qCisgICAgKiBYID0gZ157KHhhICsgeGMgKyB4ZCkgKiB4YiAqIHN9CisgICAgKiB0MSA9IGdeeGEKKyAgICAqLworICAgIEJOX21vZF9leHAodDEsIGN0eC0+cC5nLCBjdHgtPnhhLCBjdHgtPnAucCwgY3R4LT5jdHgpOworICAgLyogdDIgPSB0MSAqIGdee3hjfSA9IGdee3hhfSAqIGdee3hjfSA9IGdee3hhICsgeGN9ICovCisgICAgQk5fbW9kX211bCh0MiwgdDEsIGN0eC0+cC5neGMsIGN0eC0+cC5wLCBjdHgtPmN0eCk7CisgICAvKiB0MSA9IHQyICogZ157eGR9ID0gZ157eGEgKyB4YyArIHhkfSAqLworICAgIEJOX21vZF9tdWwodDEsIHQyLCBjdHgtPnAuZ3hkLCBjdHgtPnAucCwgY3R4LT5jdHgpOworICAgLyogdDIgPSB4YiAqIHMgKi8KKyAgICBCTl9tb2RfbXVsKHQyLCBjdHgtPnhiLCBjdHgtPnNlY3JldCwgY3R4LT5wLnEsIGN0eC0+Y3R4KTsKKworICAgLyoKKyAgICAqIFpLUCh4YiAqIHMpCisgICAgKiBYWFg6IHRoaXMgaXMga2luZGEgZnVua3ksIGJlY2F1c2Ugd2UncmUgdXNpbmcKKyAgICAqCisgICAgKiBnJyA9IGdee3hhICsgeGMgKyB4ZH0KKyAgICAqCisgICAgKiBhcyB0aGUgZ2VuZXJhdG9yLCB3aGljaCBtZWFucyBYIGlzIGcnXnt4YiAqIHN9CisgICAgKiBYID0gdDFee3QyfSA9IHQxXnt4YiAqIHN9ID0gZ157KHhhICsgeGMgKyB4ZCkgKiB4YiAqIHN9CisgICAgKi8KKyAgICBnZW5lcmF0ZV9zdGVwX3BhcnQoc2VuZCwgdDIsIHQxLCBjdHgpOworCisgICAvKiBjbGVhbnVwICovCisgICAgQk5fZnJlZSh0MSk7CisgICAgQk5fZnJlZSh0Mik7CisKKyAgICByZXR1cm4gMTsKKyAgICB9CisKKy8qIGd4ID0gZ157eGMgKyB4YSArIHhifSAqIHhkICogcyAqLworc3RhdGljIGludCBjb21wdXRlX2tleShKUEFLRV9DVFggKmN0eCwgY29uc3QgQklHTlVNICpneCkKKyAgICB7CisgICAgQklHTlVNICp0MSA9IEJOX25ldygpOworICAgIEJJR05VTSAqdDIgPSBCTl9uZXcoKTsKKyAgICBCSUdOVU0gKnQzID0gQk5fbmV3KCk7CisKKyAgIC8qCisgICAgKiBLID0gKGd4L2dee3hiICogeGQgKiBzfSlee3hifQorICAgICogICA9IChnXnsoeGMgKyB4YSArIHhiKSAqIHhkICogcyAtIHhiICogeGQgKnN9KV57eGJ9CisgICAgKiAgID0gKGdeeyh4YSArIHhjKSAqIHhkICogc30pXnt4Yn0KKyAgICAqICAgPSBnXnsoeGEgKyB4YykgKiB4YiAqIHhkICogc30KKyAgICAqIFt3aGljaCBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdobyBjYWxjdWxhdGVzIGl0XQorICAgICovCisKKyAgIC8qIHQxID0gKGdee3hkfSlee3hifSA9IGdee3hiICogeGR9ICovCisgICAgQk5fbW9kX2V4cCh0MSwgY3R4LT5wLmd4ZCwgY3R4LT54YiwgY3R4LT5wLnAsIGN0eC0+Y3R4KTsKKyAgIC8qIHQyID0gLXMgPSBxLXMgKi8KKyAgICBCTl9zdWIodDIsIGN0eC0+cC5xLCBjdHgtPnNlY3JldCk7CisgICAvKiB0MyA9IHQxXnQyID0gZ157LXhiICogeGQgKiBzfSAqLworICAgIEJOX21vZF9leHAodDMsIHQxLCB0MiwgY3R4LT5wLnAsIGN0eC0+Y3R4KTsKKyAgIC8qIHQxID0gZ3ggKiB0MyA9IFgvZ157eGIgKiB4ZCAqIHN9ICovCisgICAgQk5fbW9kX211bCh0MSwgZ3gsIHQzLCBjdHgtPnAucCwgY3R4LT5jdHgpOworICAgLyogSyA9IHQxXnt4Yn0gKi8KKyAgICBCTl9tb2RfZXhwKGN0eC0+a2V5LCB0MSwgY3R4LT54YiwgY3R4LT5wLnAsIGN0eC0+Y3R4KTsKKworICAgLyogY2xlYW51cCAqLworICAgIEJOX2ZyZWUodDMpOworICAgIEJOX2ZyZWUodDIpOworICAgIEJOX2ZyZWUodDEpOworCisgICAgcmV0dXJuIDE7CisgICAgfQorCitpbnQgSlBBS0VfU1RFUDJfcHJvY2VzcyhKUEFLRV9DVFggKmN0eCwgY29uc3QgSlBBS0VfU1RFUDIgKnJlY2VpdmVkKQorICAgIHsKKyAgICBCSUdOVU0gKnQxID0gQk5fbmV3KCk7CisgICAgQklHTlVNICp0MiA9IEJOX25ldygpOworICAgIGludCByZXQgPSAwOworCisgICAvKgorICAgICogZycgPSBnXnt4YyArIHhhICsgeGJ9IFtmcm9tIG91ciBQT1ZdCisgICAgKiB0MSA9IHhhICsgeGIKKyAgICAqLworICAgIEJOX21vZF9hZGQodDEsIGN0eC0+eGEsIGN0eC0+eGIsIGN0eC0+cC5xLCBjdHgtPmN0eCk7CisgICAvKiB0MiA9IGdee3QxfSA9IGdee3hhK3hifSAqLworICAgIEJOX21vZF9leHAodDIsIGN0eC0+cC5nLCB0MSwgY3R4LT5wLnAsIGN0eC0+Y3R4KTsKKyAgIC8qIHQxID0gZ157eGN9ICogdDIgPSBnXnt4YyArIHhhICsgeGJ9ICovCisgICAgQk5fbW9kX211bCh0MSwgY3R4LT5wLmd4YywgdDIsIGN0eC0+cC5wLCBjdHgtPmN0eCk7CisKKyAgICBpZih2ZXJpZnlfemtwKHJlY2VpdmVkLCB0MSwgY3R4KSkKKwlyZXQgPSAxOworICAgIGVsc2UKKwlKUEFLRWVycihKUEFLRV9GX0pQQUtFX1NURVAyX1BST0NFU1MsIEpQQUtFX1JfVkVSSUZZX0JfRkFJTEVEKTsKKworICAgIGNvbXB1dGVfa2V5KGN0eCwgcmVjZWl2ZWQtPmd4KTsKKworICAgLyogY2xlYW51cCAqLworICAgIEJOX2ZyZWUodDIpOworICAgIEJOX2ZyZWUodDEpOworCisgICAgcmV0dXJuIHJldDsKKyAgICB9CisKK3N0YXRpYyB2b2lkIHF1aWNraGFzaGJuKHVuc2lnbmVkIGNoYXIgKm1kLCBjb25zdCBCSUdOVU0gKmJuKQorICAgIHsKKyAgICBTSEFfQ1RYIHNoYTsKKworICAgIFNIQTFfSW5pdCgmc2hhKTsKKyAgICBoYXNoYm4oJnNoYSwgYm4pOworICAgIFNIQTFfRmluYWwobWQsICZzaGEpOworICAgIH0KKwordm9pZCBKUEFLRV9TVEVQM0FfaW5pdChKUEFLRV9TVEVQM0EgKnMzYSkKKyAgICB7fQorCitpbnQgSlBBS0VfU1RFUDNBX2dlbmVyYXRlKEpQQUtFX1NURVAzQSAqc2VuZCwgSlBBS0VfQ1RYICpjdHgpCisgICAgeworICAgIHF1aWNraGFzaGJuKHNlbmQtPmhoaywgY3R4LT5rZXkpOworICAgIFNIQTEoc2VuZC0+aGhrLCBzaXplb2Ygc2VuZC0+aGhrLCBzZW5kLT5oaGspOworCisgICAgcmV0dXJuIDE7CisgICAgfQorCitpbnQgSlBBS0VfU1RFUDNBX3Byb2Nlc3MoSlBBS0VfQ1RYICpjdHgsIGNvbnN0IEpQQUtFX1NURVAzQSAqcmVjZWl2ZWQpCisgICAgeworICAgIHVuc2lnbmVkIGNoYXIgaGhrW1NIQV9ESUdFU1RfTEVOR1RIXTsKKworICAgIHF1aWNraGFzaGJuKGhoaywgY3R4LT5rZXkpOworICAgIFNIQTEoaGhrLCBzaXplb2YgaGhrLCBoaGspOworICAgIGlmKG1lbWNtcChoaGssIHJlY2VpdmVkLT5oaGssIHNpemVvZiBoaGspKQorCXsKKwlKUEFLRWVycihKUEFLRV9GX0pQQUtFX1NURVAzQV9QUk9DRVNTLCBKUEFLRV9SX0hBU0hfT0ZfSEFTSF9PRl9LRVlfTUlTTUFUQ0gpOworCXJldHVybiAwOworCX0KKyAgICByZXR1cm4gMTsKKyAgICB9CisKK3ZvaWQgSlBBS0VfU1RFUDNBX3JlbGVhc2UoSlBBS0VfU1RFUDNBICpzM2EpCisgICAge30KKwordm9pZCBKUEFLRV9TVEVQM0JfaW5pdChKUEFLRV9TVEVQM0IgKnMzYikKKyAgICB7fQorCitpbnQgSlBBS0VfU1RFUDNCX2dlbmVyYXRlKEpQQUtFX1NURVAzQiAqc2VuZCwgSlBBS0VfQ1RYICpjdHgpCisgICAgeworICAgIHF1aWNraGFzaGJuKHNlbmQtPmhrLCBjdHgtPmtleSk7CisKKyAgICByZXR1cm4gMTsKKyAgICB9CisKK2ludCBKUEFLRV9TVEVQM0JfcHJvY2VzcyhKUEFLRV9DVFggKmN0eCwgY29uc3QgSlBBS0VfU1RFUDNCICpyZWNlaXZlZCkKKyAgICB7CisgICAgdW5zaWduZWQgY2hhciBoa1tTSEFfRElHRVNUX0xFTkdUSF07CisKKyAgICBxdWlja2hhc2hibihoaywgY3R4LT5rZXkpOworICAgIGlmKG1lbWNtcChoaywgcmVjZWl2ZWQtPmhrLCBzaXplb2YgaGspKQorCXsKKwlKUEFLRWVycihKUEFLRV9GX0pQQUtFX1NURVAzQl9QUk9DRVNTLCBKUEFLRV9SX0hBU0hfT0ZfS0VZX01JU01BVENIKTsKKwlyZXR1cm4gMDsKKwl9CisgICAgcmV0dXJuIDE7CisgICAgfQorCit2b2lkIEpQQUtFX1NURVAzQl9yZWxlYXNlKEpQQUtFX1NURVAzQiAqczNiKQorICAgIHt9CisKK2NvbnN0IEJJR05VTSAqSlBBS0VfZ2V0X3NoYXJlZF9rZXkoSlBBS0VfQ1RYICpjdHgpCisgICAgeworICAgIHJldHVybiBjdHgtPmtleTsKKyAgICB9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9qcGFrZS9qcGFrZS5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2pwYWtlL2pwYWtlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzZWExOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9qcGFrZS9qcGFrZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogSW1wbGVtZW50IEotUEFLRSwgYXMgZGVzY3JpYmVkIGluCisgKiBodHRwOi8vZ3JvdXBlci5pZWVlLm9yZy9ncm91cHMvMTM2My9SZXNlYXJjaC9jb250cmlidXRpb25zL2hhby1yeWFuLTIwMDgucGRmCisgKiAKKyAqIFdpdGggaGludHMgZnJvbSBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+ZmgyNDAvc29mdHdhcmUvSlBBS0UyLmphdmEuCisgKi8KKworI2lmbmRlZiBIRUFERVJfSlBBS0VfSAorI2RlZmluZSBIRUFERVJfSlBBS0VfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19KUEFLRQorI2Vycm9yIEpQQUtFIGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKwordHlwZWRlZiBzdHJ1Y3QgSlBBS0VfQ1RYIEpQQUtFX0NUWDsKKworLyogTm90ZSB0aGF0ICJnIiBpbiB0aGUgWktQcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIEotUEFLRSBnLiAqLwordHlwZWRlZiBzdHJ1Y3QKKyAgICB7CisgICAgQklHTlVNICpncjsgLyogZ15yIChyIHJhbmRvbSkgKi8KKyAgICBCSUdOVU0gKmI7ICAvKiBiID0gciAtIHgqaCwgaD1oYXNoKGcsIGdeciwgZ154LCBuYW1lKSAqLworICAgIH0gSlBBS0VfWktQOworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBCSUdOVU0gKmd4OyAgICAgICAvKiBnXnggaW4gc3RlcCAxLCBnXih4YSArIHhjICsgeGQpICogeGIgKiBzIGluIHN0ZXAgMiAqLworICAgIEpQQUtFX1pLUCB6a3B4OyAgIC8qIFpLUCh4KSBvciBaS1AoeGIgKiBzKSAqLworICAgIH0gSlBBS0VfU1RFUF9QQVJUOworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICBKUEFLRV9TVEVQX1BBUlQgcDE7ICAgLyogZ154MywgWktQKHgzKSBvciBnXngxLCBaS1AoeDEpICovCisgICAgSlBBS0VfU1RFUF9QQVJUIHAyOyAgIC8qIGdeeDQsIFpLUCh4NCkgb3IgZ154MiwgWktQKHgyKSAqLworICAgIH0gSlBBS0VfU1RFUDE7CisKK3R5cGVkZWYgSlBBS0VfU1RFUF9QQVJUIEpQQUtFX1NURVAyOworCit0eXBlZGVmIHN0cnVjdAorICAgIHsKKyAgICB1bnNpZ25lZCBjaGFyIGhoa1tTSEFfRElHRVNUX0xFTkdUSF07CisgICAgfSBKUEFLRV9TVEVQM0E7CisKK3R5cGVkZWYgc3RydWN0CisgICAgeworICAgIHVuc2lnbmVkIGNoYXIgaGtbU0hBX0RJR0VTVF9MRU5HVEhdOworICAgIH0gSlBBS0VfU1RFUDNCOworCisvKiBQYXJhbWV0ZXJzIGFyZSBjb3BpZWQgKi8KK0pQQUtFX0NUWCAqSlBBS0VfQ1RYX25ldyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwZWVyX25hbWUsCisJCQkgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmcsIGNvbnN0IEJJR05VTSAqcSwKKwkJCSBjb25zdCBCSUdOVU0gKnNlY3JldCk7Cit2b2lkIEpQQUtFX0NUWF9mcmVlKEpQQUtFX0NUWCAqY3R4KTsKKworLyoKKyAqIE5vdGUgdGhhdCBKUEFLRV9TVEVQMSBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyBiZWZvcmUgcmVsZWFzZQorICogd2l0aG91dCBhbm90aGVyIGluaXQuCisgKi8KK3ZvaWQgSlBBS0VfU1RFUDFfaW5pdChKUEFLRV9TVEVQMSAqczEpOworaW50IEpQQUtFX1NURVAxX2dlbmVyYXRlKEpQQUtFX1NURVAxICpzZW5kLCBKUEFLRV9DVFggKmN0eCk7CitpbnQgSlBBS0VfU1RFUDFfcHJvY2VzcyhKUEFLRV9DVFggKmN0eCwgY29uc3QgSlBBS0VfU1RFUDEgKnJlY2VpdmVkKTsKK3ZvaWQgSlBBS0VfU1RFUDFfcmVsZWFzZShKUEFLRV9TVEVQMSAqczEpOworCisvKgorICogTm90ZSB0aGF0IEpQQUtFX1NURVAyIGNhbiBiZSB1c2VkIG11bHRpcGxlIHRpbWVzIGJlZm9yZSByZWxlYXNlCisgKiB3aXRob3V0IGFub3RoZXIgaW5pdC4KKyAqLwordm9pZCBKUEFLRV9TVEVQMl9pbml0KEpQQUtFX1NURVAyICpzMik7CitpbnQgSlBBS0VfU1RFUDJfZ2VuZXJhdGUoSlBBS0VfU1RFUDIgKnNlbmQsIEpQQUtFX0NUWCAqY3R4KTsKK2ludCBKUEFLRV9TVEVQMl9wcm9jZXNzKEpQQUtFX0NUWCAqY3R4LCBjb25zdCBKUEFLRV9TVEVQMiAqcmVjZWl2ZWQpOwordm9pZCBKUEFLRV9TVEVQMl9yZWxlYXNlKEpQQUtFX1NURVAyICpzMik7CisKKy8qCisgKiBPcHRpb25hbGx5IHZlcmlmeSB0aGUgc2hhcmVkIGtleS4gSWYgdGhlIHNoYXJlZCBzZWNyZXRzIGRvIG5vdAorICogbWF0Y2gsIHRoZSB0d28gZW5kcyB3aWxsIGRpc2FncmVlIGFib3V0IHRoZSBzaGFyZWQga2V5LCBidXQKKyAqIG90aGVyd2lzZSB0aGUgcHJvdG9jb2wgd2lsbCBzdWNjZWVkLgorICovCit2b2lkIEpQQUtFX1NURVAzQV9pbml0KEpQQUtFX1NURVAzQSAqczNhKTsKK2ludCBKUEFLRV9TVEVQM0FfZ2VuZXJhdGUoSlBBS0VfU1RFUDNBICpzZW5kLCBKUEFLRV9DVFggKmN0eCk7CitpbnQgSlBBS0VfU1RFUDNBX3Byb2Nlc3MoSlBBS0VfQ1RYICpjdHgsIGNvbnN0IEpQQUtFX1NURVAzQSAqcmVjZWl2ZWQpOwordm9pZCBKUEFLRV9TVEVQM0FfcmVsZWFzZShKUEFLRV9TVEVQM0EgKnMzYSk7CisKK3ZvaWQgSlBBS0VfU1RFUDNCX2luaXQoSlBBS0VfU1RFUDNCICpzM2IpOworaW50IEpQQUtFX1NURVAzQl9nZW5lcmF0ZShKUEFLRV9TVEVQM0IgKnNlbmQsIEpQQUtFX0NUWCAqY3R4KTsKK2ludCBKUEFLRV9TVEVQM0JfcHJvY2VzcyhKUEFLRV9DVFggKmN0eCwgY29uc3QgSlBBS0VfU1RFUDNCICpyZWNlaXZlZCk7Cit2b2lkIEpQQUtFX1NURVAzQl9yZWxlYXNlKEpQQUtFX1NURVAzQiAqczNiKTsKKworLyoKKyAqIHRoZSByZXR1cm4gdmFsdWUgYmVsb25ncyB0byB0aGUgbGlicmFyeSBhbmQgd2lsbCBiZSByZWxlYXNlZCB3aGVuCisgKiBjdHggaXMgcmVsZWFzZWQsIGFuZCB3aWxsIGNoYW5nZSB3aGVuIGEgbmV3IGhhbmRzaGFrZSBpcyBwZXJmb3JtZWQuCisgKi8KK2NvbnN0IEJJR05VTSAqSlBBS0VfZ2V0X3NoYXJlZF9rZXkoSlBBS0VfQ1RYICpjdHgpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0pQQUtFX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgSlBBS0UgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgSlBBS0VfRl9KUEFLRV9TVEVQMV9QUk9DRVNTCQkJIDEwMQorI2RlZmluZSBKUEFLRV9GX0pQQUtFX1NURVAyX1BST0NFU1MJCQkgMTAyCisjZGVmaW5lIEpQQUtFX0ZfSlBBS0VfU1RFUDNBX1BST0NFU1MJCQkgMTAzCisjZGVmaW5lIEpQQUtFX0ZfSlBBS0VfU1RFUDNCX1BST0NFU1MJCQkgMTA0CisjZGVmaW5lIEpQQUtFX0ZfVkVSSUZZX1pLUAkJCQkgMTAwCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgSlBBS0VfUl9HX1RPX1RIRV9YNF9JU19PTkUJCQkgMTA1CisjZGVmaW5lIEpQQUtFX1JfSEFTSF9PRl9IQVNIX09GX0tFWV9NSVNNQVRDSAkJIDEwNgorI2RlZmluZSBKUEFLRV9SX0hBU0hfT0ZfS0VZX01JU01BVENICQkJIDEwNworI2RlZmluZSBKUEFLRV9SX1ZFUklGWV9CX0ZBSUxFRAkJCQkgMTAyCisjZGVmaW5lIEpQQUtFX1JfVkVSSUZZX1gzX0ZBSUxFRAkJCSAxMDMKKyNkZWZpbmUgSlBBS0VfUl9WRVJJRllfWDRfRkFJTEVECQkJIDEwNAorI2RlZmluZSBKUEFLRV9SX1pLUF9WRVJJRllfRkFJTEVECQkJIDEwMAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2pwYWtlL2pwYWtlX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2pwYWtlL2pwYWtlX2Vyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOTUwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vanBha2UvanBha2VfZXJyLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qIGNyeXB0by9qcGFrZS9qcGFrZV9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA4IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2pwYWtlLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9KUEFLRSxmdW5jLDApCisjZGVmaW5lIEVSUl9SRUFTT04ocmVhc29uKSBFUlJfUEFDSyhFUlJfTElCX0pQQUtFLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIEpQQUtFX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoSlBBS0VfRl9KUEFLRV9TVEVQMV9QUk9DRVNTKSwJIkpQQUtFX1NURVAxX3Byb2Nlc3MifSwKK3tFUlJfRlVOQyhKUEFLRV9GX0pQQUtFX1NURVAyX1BST0NFU1MpLAkiSlBBS0VfU1RFUDJfcHJvY2VzcyJ9LAore0VSUl9GVU5DKEpQQUtFX0ZfSlBBS0VfU1RFUDNBX1BST0NFU1MpLAkiSlBBS0VfU1RFUDNBX3Byb2Nlc3MifSwKK3tFUlJfRlVOQyhKUEFLRV9GX0pQQUtFX1NURVAzQl9QUk9DRVNTKSwJIkpQQUtFX1NURVAzQl9wcm9jZXNzIn0sCit7RVJSX0ZVTkMoSlBBS0VfRl9WRVJJRllfWktQKSwJIlZFUklGWV9aS1AifSwKK3swLE5VTEx9CisJfTsKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBKUEFLRV9zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKEpQQUtFX1JfR19UT19USEVfWDRfSVNfT05FKSAgLCJnIHRvIHRoZSB4NCBpcyBvbmUifSwKK3tFUlJfUkVBU09OKEpQQUtFX1JfSEFTSF9PRl9IQVNIX09GX0tFWV9NSVNNQVRDSCksImhhc2ggb2YgaGFzaCBvZiBrZXkgbWlzbWF0Y2gifSwKK3tFUlJfUkVBU09OKEpQQUtFX1JfSEFTSF9PRl9LRVlfTUlTTUFUQ0gpLCJoYXNoIG9mIGtleSBtaXNtYXRjaCJ9LAore0VSUl9SRUFTT04oSlBBS0VfUl9WRVJJRllfQl9GQUlMRUQpICAgICAsInZlcmlmeSBiIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oSlBBS0VfUl9WRVJJRllfWDNfRkFJTEVEKSAgICAsInZlcmlmeSB4MyBmYWlsZWQifSwKK3tFUlJfUkVBU09OKEpQQUtFX1JfVkVSSUZZX1g0X0ZBSUxFRCkgICAgLCJ2ZXJpZnkgeDQgZmFpbGVkIn0sCit7RVJSX1JFQVNPTihKUEFLRV9SX1pLUF9WRVJJRllfRkFJTEVEKSAgICwiemtwIHZlcmlmeSBmYWlsZWQifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfSlBBS0Vfc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworCWlmIChFUlJfZnVuY19lcnJvcl9zdHJpbmcoSlBBS0Vfc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsSlBBS0Vfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxKUEFLRV9zdHJfcmVhc29ucyk7CisJCX0KKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9qcGFrZS9qcGFrZXRlc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9qcGFrZS9qcGFrZXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJhNzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2pwYWtlL2pwYWtldGVzdC5jCkBAIC0wLDAgKzEsMTkyIEBACisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19KUEFLRQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwcmludGYoIk5vIEotUEFLRSBzdXBwb3J0XG4iKTsKKyAgICByZXR1cm4oMCk7Cit9CisKKyNlbHNlCisKKyNpbmNsdWRlIDxvcGVuc3NsL2pwYWtlLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworc3RhdGljIHZvaWQgc2hvd2JuKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEJJR05VTSAqYm4pCisgICAgeworICAgIGZwdXRzKG5hbWUsIHN0ZG91dCk7CisgICAgZnB1dHMoIiA9ICIsIHN0ZG91dCk7CisgICAgQk5fcHJpbnRfZnAoc3Rkb3V0LCBibik7CisgICAgcHV0YygnXG4nLCBzdGRvdXQpOworICAgIH0KKworc3RhdGljIGludCBydW5fanBha2UoSlBBS0VfQ1RYICphbGljZSwgSlBBS0VfQ1RYICpib2IpCisgICAgeworICAgIEpQQUtFX1NURVAxIGFsaWNlX3MxOworICAgIEpQQUtFX1NURVAxIGJvYl9zMTsKKyAgICBKUEFLRV9TVEVQMiBhbGljZV9zMjsKKyAgICBKUEFLRV9TVEVQMiBib2JfczI7CisgICAgSlBBS0VfU1RFUDNBIGFsaWNlX3MzYTsKKyAgICBKUEFLRV9TVEVQM0IgYm9iX3MzYjsKKworICAgLyogQWxpY2UgLT4gQm9iOiBzdGVwIDEgKi8KKyAgICBwdXRzKCJBLT5CIHMxIik7CisgICAgSlBBS0VfU1RFUDFfaW5pdCgmYWxpY2VfczEpOworICAgIEpQQUtFX1NURVAxX2dlbmVyYXRlKCZhbGljZV9zMSwgYWxpY2UpOworICAgIGlmKCFKUEFLRV9TVEVQMV9wcm9jZXNzKGJvYiwgJmFsaWNlX3MxKSkKKwl7CisJcHJpbnRmKCJCb2IgZmFpbHMgdG8gcHJvY2VzcyBBbGljZSdzIHN0ZXAgMVxuIik7CisJRVJSX3ByaW50X2Vycm9yc19mcChzdGRvdXQpOworCXJldHVybiAxOworCX0KKyAgICBKUEFLRV9TVEVQMV9yZWxlYXNlKCZhbGljZV9zMSk7CisKKyAgIC8qIEJvYiAtPiBBbGljZTogc3RlcCAxICovCisgICAgcHV0cygiQi0+QSBzMSIpOworICAgIEpQQUtFX1NURVAxX2luaXQoJmJvYl9zMSk7CisgICAgSlBBS0VfU1RFUDFfZ2VuZXJhdGUoJmJvYl9zMSwgYm9iKTsKKyAgICBpZighSlBBS0VfU1RFUDFfcHJvY2VzcyhhbGljZSwgJmJvYl9zMSkpCisJeworCXByaW50ZigiQWxpY2UgZmFpbHMgdG8gcHJvY2VzcyBCb2IncyBzdGVwIDFcbiIpOworCUVSUl9wcmludF9lcnJvcnNfZnAoc3Rkb3V0KTsKKwlyZXR1cm4gMjsKKwl9CisgICAgSlBBS0VfU1RFUDFfcmVsZWFzZSgmYm9iX3MxKTsKKworICAgLyogQWxpY2UgLT4gQm9iOiBzdGVwIDIgKi8KKyAgICBwdXRzKCJBLT5CIHMyIik7CisgICAgSlBBS0VfU1RFUDJfaW5pdCgmYWxpY2VfczIpOworICAgIEpQQUtFX1NURVAyX2dlbmVyYXRlKCZhbGljZV9zMiwgYWxpY2UpOworICAgIGlmKCFKUEFLRV9TVEVQMl9wcm9jZXNzKGJvYiwgJmFsaWNlX3MyKSkKKwl7CisJcHJpbnRmKCJCb2IgZmFpbHMgdG8gcHJvY2VzcyBBbGljZSdzIHN0ZXAgMlxuIik7CisJRVJSX3ByaW50X2Vycm9yc19mcChzdGRvdXQpOworCXJldHVybiAzOworCX0KKyAgICBKUEFLRV9TVEVQMl9yZWxlYXNlKCZhbGljZV9zMik7CisKKyAgIC8qIEJvYiAtPiBBbGljZTogc3RlcCAyICovCisgICAgcHV0cygiQi0+QSBzMiIpOworICAgIEpQQUtFX1NURVAyX2luaXQoJmJvYl9zMik7CisgICAgSlBBS0VfU1RFUDJfZ2VuZXJhdGUoJmJvYl9zMiwgYm9iKTsKKyAgICBpZighSlBBS0VfU1RFUDJfcHJvY2VzcyhhbGljZSwgJmJvYl9zMikpCisJeworCXByaW50ZigiQWxpY2UgZmFpbHMgdG8gcHJvY2VzcyBCb2IncyBzdGVwIDJcbiIpOworCUVSUl9wcmludF9lcnJvcnNfZnAoc3Rkb3V0KTsKKwlyZXR1cm4gNDsKKwl9CisgICAgSlBBS0VfU1RFUDJfcmVsZWFzZSgmYm9iX3MyKTsKKworICAgIHNob3dibigiQWxpY2UncyBrZXkiLCBKUEFLRV9nZXRfc2hhcmVkX2tleShhbGljZSkpOworICAgIHNob3dibigiQm9iJ3Mga2V5ICAiLCBKUEFLRV9nZXRfc2hhcmVkX2tleShib2IpKTsKKworICAgLyogQWxpY2UgLT4gQm9iOiBzdGVwIDNhICovCisgICAgcHV0cygiQS0+QiBzM2EiKTsKKyAgICBKUEFLRV9TVEVQM0FfaW5pdCgmYWxpY2VfczNhKTsKKyAgICBKUEFLRV9TVEVQM0FfZ2VuZXJhdGUoJmFsaWNlX3MzYSwgYWxpY2UpOworICAgIGlmKCFKUEFLRV9TVEVQM0FfcHJvY2Vzcyhib2IsICZhbGljZV9zM2EpKQorCXsKKwlwcmludGYoIkJvYiBmYWlscyB0byBwcm9jZXNzIEFsaWNlJ3Mgc3RlcCAzYVxuIik7CisJRVJSX3ByaW50X2Vycm9yc19mcChzdGRvdXQpOworCXJldHVybiA1OworCX0KKyAgICBKUEFLRV9TVEVQM0FfcmVsZWFzZSgmYWxpY2VfczNhKTsKKyAgICAKKyAgIC8qIEJvYiAtPiBBbGljZTogc3RlcCAzYiAqLworICAgIHB1dHMoIkItPkEgczNiIik7CisgICAgSlBBS0VfU1RFUDNCX2luaXQoJmJvYl9zM2IpOworICAgIEpQQUtFX1NURVAzQl9nZW5lcmF0ZSgmYm9iX3MzYiwgYm9iKTsKKyAgICBpZighSlBBS0VfU1RFUDNCX3Byb2Nlc3MoYWxpY2UsICZib2JfczNiKSkKKwl7CisJcHJpbnRmKCJBbGljZSBmYWlscyB0byBwcm9jZXNzIEJvYidzIHN0ZXAgM2JcbiIpOworCUVSUl9wcmludF9lcnJvcnNfZnAoc3Rkb3V0KTsKKwlyZXR1cm4gNjsKKwl9CisgICAgSlBBS0VfU1RFUDNCX3JlbGVhc2UoJmJvYl9zM2IpOworCisgICAgcmV0dXJuIDA7CisgICAgfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgICAgeworICAgIEpQQUtFX0NUWCAqYWxpY2U7CisgICAgSlBBS0VfQ1RYICpib2I7CisgICAgQklHTlVNICpwID0gTlVMTDsKKyAgICBCSUdOVU0gKmcgPSBOVUxMOworICAgIEJJR05VTSAqcSA9IE5VTEw7CisgICAgQklHTlVNICpzZWNyZXQgPSBCTl9uZXcoKTsKKyAgICBCSU8gKmJpb19lcnI7CisKKyAgICBiaW9fZXJyID0gQklPX25ld19mcChzdGRlcnIsIEJJT19OT0NMT1NFKTsKKworICAgIENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpOworICAgIENSWVBUT19kYmdfc2V0X29wdGlvbnMoVl9DUllQVE9fTURFQlVHX0FMTCk7CisgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pOworCisgICAgRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKworICAgIC8qCisgICAgQk5faGV4MmJuKCZwLCAiZmQ3ZjUzODExZDc1MTIyOTUyZGY0YTljMmVlY2U0ZTdmNjExYjc1MjNjZWY0NDAwYzMxZTNmODBiNjUxMjY2OTQ1NWQ0MDIyNTFmYjU5M2Q4ZDU4ZmFiZmM1ZjViYTMwZjZjYjliNTU2Y2Q3ODEzYjgwMWQzNDZmZjI2NjYwYjc2Yjk5NTBhNWE0OWY5ZmU4MDQ3YjEwMjJjMjRmYmJhOWQ3ZmViN2M2MWJmODNiNTdlN2M2YThhNjE1MGYwNGZiODNmNmQzYzUxZWMzMDIzNTU0MTM1YTE2OTEzMmY2NzVmM2FlMmI2MWQ3MmFlZmYyMjIwMzE5OWRkMTQ4MDFjNyIpOworICAgIEJOX2hleDJibigmZywgImY3ZTFhMDg1ZDY5YjNkZGVjYmJjYWI1YzM2Yjg1N2I5Nzk5NGFmYmJmYTNhZWE4MmY5NTc0YzBiM2QwNzgyNjc1MTU5NTc4ZWJhZDQ1OTRmZTY3MTA3MTA4MTgwYjQ0OTE2NzEyM2U4NGMyODE2MTNiN2NmMDkzMjhjYzhhNmUxM2MxNjdhOGI1NDdjOGQyOGUwYTNhZTFlMmJiM2E2NzU5MTZlYTM3ZjBiZmEyMTM1NjJmMWZiNjI3YTAxMjQzYmNjYTRmMWJlYTg1MTkwODlhODgzZGZlMTVhZTU5ZjA2OTI4YjY2NWU4MDdiNTUyNTY0MDE0YzNiZmVjZjQ5MmEiKTsKKyAgICBCTl9oZXgyYm4oJnEsICI5NzYwNTA4ZjE1MjMwYmNjYjI5MmI5ODJhMmViODQwYmYwNTgxY2Y1Iik7CisgICAgKi8KKyAgICAvKgorICAgIHAgPSBCTl9uZXcoKTsKKyAgICBCTl9nZW5lcmF0ZV9wcmltZShwLCAxMDI0LCAxLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAqLworICAgLyogVXNlIGEgc2FmZSBwcmltZSBmb3IgcCAodGhhdCB3ZSBmb3VuZCBlYXJsaWVyKSAqLworICAgIEJOX2hleDJibigmcCwgIkY5RTVCMzY1NjY1RUE3QTA1QTlDNTM0NTAyNzgwRkVFNkYxQUI1QkQ0RjQ5OTQ3RkQwMzZEQkQ3RTkwNTI2OUFGNDZFRjI4QjBGQzA3NDg3RUU0RjVEMjBGQjNDMEFGOEU3MDBGM0EyRkEzNDE0OTcwQ0JFRDQ0RkVERkY4MENFNzhEODAwRjE4NEJCODI0MzVEMTM3QUFEQTJDNkMxNjUyMzI0NzkzMEE2M0I4NTY2MUQxRkM4MTdBNTFBQ0Q5NjE2OEU5NTg5OEExRjgzQTc5RkZCNTI5MzY4QUE3ODMzQUJEMUIwQzNBRUREQjE0RDJFMUEyRjcxRDk5Rjc2M0YiKTsKKyAgICBzaG93Ym4oInAiLCBwKTsKKyAgICBnID0gQk5fbmV3KCk7CisgICAgQk5fc2V0X3dvcmQoZywgMik7CisgICAgc2hvd2JuKCJnIiwgZyk7CisgICAgcSA9IEJOX25ldygpOworICAgIEJOX3JzaGlmdDEocSwgcCk7CisgICAgc2hvd2JuKCJxIiwgcSk7CisKKyAgICBCTl9yYW5kKHNlY3JldCwgMzIsIC0xLCAwKTsKKworICAgLyogQSBub3JtYWwgcnVuLCBleHBlY3QgdGhpcyB0byB3b3JrLi4uICovCisgICAgYWxpY2UgPSBKUEFLRV9DVFhfbmV3KCJBbGljZSIsICJCb2IiLCBwLCBnLCBxLCBzZWNyZXQpOworICAgIGJvYiA9IEpQQUtFX0NUWF9uZXcoIkJvYiIsICJBbGljZSIsIHAsIGcsIHEsIHNlY3JldCk7CisKKyAgICBpZihydW5fanBha2UoYWxpY2UsIGJvYikgIT0gMCkKKwl7CisJZnByaW50ZihzdGRlcnIsICJQbGFpbiBKUEFLRSBydW4gZmFpbGVkXG4iKTsKKwlyZXR1cm4gMTsKKwl9CisKKyAgICBKUEFLRV9DVFhfZnJlZShib2IpOworICAgIEpQQUtFX0NUWF9mcmVlKGFsaWNlKTsKKworICAgLyogTm93IGdpdmUgQWxpY2UgYW5kIEJvYiBkaWZmZXJlbnQgc2VjcmV0cyAqLworICAgIGFsaWNlID0gSlBBS0VfQ1RYX25ldygiQWxpY2UiLCAiQm9iIiwgcCwgZywgcSwgc2VjcmV0KTsKKyAgICBCTl9hZGRfd29yZChzZWNyZXQsIDEpOworICAgIGJvYiA9IEpQQUtFX0NUWF9uZXcoIkJvYiIsICJBbGljZSIsIHAsIGcsIHEsIHNlY3JldCk7CisKKyAgICBpZihydW5fanBha2UoYWxpY2UsIGJvYikgIT0gNSkKKwl7CisJZnByaW50ZihzdGRlcnIsICJNaXNtYXRjaGVkIHNlY3JldCBKUEFLRSBydW4gZmFpbGVkXG4iKTsKKwlyZXR1cm4gMTsKKwl9CisKKyAgICBKUEFLRV9DVFhfZnJlZShib2IpOworICAgIEpQQUtFX0NUWF9mcmVlKGFsaWNlKTsKKworICAgIEJOX2ZyZWUoc2VjcmV0KTsKKyAgICBCTl9mcmVlKHEpOworICAgIEJOX2ZyZWUoZyk7CisgICAgQk5fZnJlZShwKTsKKworICAgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgICAgRVJSX3JlbW92ZV90aHJlYWRfc3RhdGUoTlVMTCk7CisgICAgRVJSX2ZyZWVfc3RyaW5ncygpOworICAgIENSWVBUT19tZW1fbGVha3MoYmlvX2Vycik7CisKKyAgICByZXR1cm4gMDsKKyAgICB9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2tyYjUva3JiNV9hc24uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9rcmI1L2tyYjVfYXNuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiNzQxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9rcmI1L2tyYjVfYXNuLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qIGtyYjVfYXNuLmMgKi8KKy8qIFdyaXR0ZW4gYnkgVmVybiBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCwKKyoqIHVzaW5nIG9jc3AveyouaCwqYXNuKi5jfSBhcyBhIHN0YXJ0aW5nIHBvaW50CisqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2tyYjVfYXNuLmg+CisKKworQVNOMV9TRVFVRU5DRShLUkI1X0VOQ0RBVEEpID0geworCUFTTjFfRVhQKEtSQjVfRU5DREFUQSwgZXR5cGUsCQlBU04xX0lOVEVHRVIsCSAgMCksCisJQVNOMV9FWFBfT1BUKEtSQjVfRU5DREFUQSwga3ZubywJQVNOMV9JTlRFR0VSLAkgIDEpLAorCUFTTjFfRVhQKEtSQjVfRU5DREFUQSwgY2lwaGVyLAkJQVNOMV9PQ1RFVF9TVFJJTkcsMikKK30gQVNOMV9TRVFVRU5DRV9FTkQoS1JCNV9FTkNEQVRBKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoS1JCNV9FTkNEQVRBKQorCisKK0FTTjFfU0VRVUVOQ0UoS1JCNV9QUklOQ05BTUUpID0geworCUFTTjFfRVhQKEtSQjVfUFJJTkNOQU1FLCBuYW1ldHlwZSwJQVNOMV9JTlRFR0VSLAkgIDApLAorCUFTTjFfRVhQX1NFUVVFTkNFX09GKEtSQjVfUFJJTkNOQU1FLCBuYW1lc3RyaW5nLCBBU04xX0dFTkVSQUxTVFJJTkcsIDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEtSQjVfUFJJTkNOQU1FKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoS1JCNV9QUklOQ05BTUUpCisKKworLyogW0FQUExJQ0FUSU9OIDFdID0gMHg2MSAqLworQVNOMV9TRVFVRU5DRShLUkI1X1RLVEJPRFkpID0geworCUFTTjFfRVhQKEtSQjVfVEtUQk9EWSwgdGt0dm5vLAkJQVNOMV9JTlRFR0VSLAkgIDApLAorCUFTTjFfRVhQKEtSQjVfVEtUQk9EWSwgcmVhbG0sIAkJQVNOMV9HRU5FUkFMU1RSSU5HLCAxKSwKKwlBU04xX0VYUChLUkI1X1RLVEJPRFksIHNuYW1lLAkJS1JCNV9QUklOQ05BTUUsCSAgMiksCisJQVNOMV9FWFAoS1JCNV9US1RCT0RZLCBlbmNkYXRhLAkJS1JCNV9FTkNEQVRBLAkgIDMpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEtSQjVfVEtUQk9EWSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEtSQjVfVEtUQk9EWSkKKworCitBU04xX0lURU1fVEVNUExBVEUoS1JCNV9USUNLRVQpID0gCisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19FWFBUQUd8QVNOMV9URkxHX0FQUExJQ0FUSU9OLCAxLAorCQkJS1JCNV9USUNLRVQsIEtSQjVfVEtUQk9EWSkKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoS1JCNV9USUNLRVQpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhLUkI1X1RJQ0tFVCkKKworCisvKiBbQVBQTElDQVRJT04gMTRdID0gMHg2ZSAqLworQVNOMV9TRVFVRU5DRShLUkI1X0FQUkVRQk9EWSkgPSB7CisJQVNOMV9FWFAoS1JCNV9BUFJFUUJPRFksIHB2bm8sCQlBU04xX0lOVEVHRVIsCSAgMCksCisJQVNOMV9FWFAoS1JCNV9BUFJFUUJPRFksIG1zZ3R5cGUsCUFTTjFfSU5URUdFUiwJICAxKSwKKwlBU04xX0VYUChLUkI1X0FQUkVRQk9EWSwgYXBvcHRpb25zLAlBU04xX0JJVF9TVFJJTkcsICAyKSwKKwlBU04xX0VYUChLUkI1X0FQUkVRQk9EWSwgdGlja2V0LCAJS1JCNV9USUNLRVQsCSAgMyksCisJQVNOMV9FWFAoS1JCNV9BUFJFUUJPRFksIGF1dGhlbnRpY2F0b3IsCUtSQjVfRU5DREFUQSwJICA0KSwKK30gQVNOMV9TRVFVRU5DRV9FTkQoS1JCNV9BUFJFUUJPRFkpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhLUkI1X0FQUkVRQk9EWSkKKworQVNOMV9JVEVNX1RFTVBMQVRFKEtSQjVfQVBSRVEpID0gCisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19FWFBUQUd8QVNOMV9URkxHX0FQUExJQ0FUSU9OLCAxNCwKKwkJCUtSQjVfQVBSRVEsIEtSQjVfQVBSRVFCT0RZKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChLUkI1X0FQUkVRKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoS1JCNV9BUFJFUSkKKworCisvKiAgQXV0aGVudGljYXRvciBzdHVmZiAJKi8KKworQVNOMV9TRVFVRU5DRShLUkI1X0NIRUNLU1VNKSA9IHsKKwlBU04xX0VYUChLUkI1X0NIRUNLU1VNLCBjdHlwZSwJCUFTTjFfSU5URUdFUiwJICAwKSwKKwlBU04xX0VYUChLUkI1X0NIRUNLU1VNLCBjaGVja3N1bSwJQVNOMV9PQ1RFVF9TVFJJTkcsMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoS1JCNV9DSEVDS1NVTSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEtSQjVfQ0hFQ0tTVU0pCisKKworQVNOMV9TRVFVRU5DRShLUkI1X0VOQ0tFWSkgPSB7CisJQVNOMV9FWFAoS1JCNV9FTkNLRVksCWt0eXBlLAkJQVNOMV9JTlRFR0VSLAkgIDApLAorCUFTTjFfRVhQKEtSQjVfRU5DS0VZLAlrZXl2YWx1ZSwJQVNOMV9PQ1RFVF9TVFJJTkcsMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoS1JCNV9FTkNLRVkpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhLUkI1X0VOQ0tFWSkKKworCisvKiBTRVEgT0YgU0VROyBzZWUgQVNOMV9FWFBfU0VRVUVOQ0VfT0ZfT1BUKCkgYmVsb3cgKi8KK0FTTjFfU0VRVUVOQ0UoS1JCNV9BVVRIREFUQSkgPSB7CisJQVNOMV9FWFAoS1JCNV9BVVRIREFUQSwJYWR0eXBlLAkJQVNOMV9JTlRFR0VSLAkgIDApLAorCUFTTjFfRVhQKEtSQjVfQVVUSERBVEEsCWFkZGF0YSwgCUFTTjFfT0NURVRfU1RSSU5HLDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEtSQjVfQVVUSERBVEEpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhLUkI1X0FVVEhEQVRBKQorCisKKy8qIFtBUFBMSUNBVElPTiAyXSA9IDB4NjIgKi8KK0FTTjFfU0VRVUVOQ0UoS1JCNV9BVVRIRU5UQk9EWSkgPSB7CisJQVNOMV9FWFAoS1JCNV9BVVRIRU5UQk9EWSwJYXZubywJQVNOMV9JTlRFR0VSLAkgIDApLAorCUFTTjFfRVhQKEtSQjVfQVVUSEVOVEJPRFksCWNyZWFsbSwJQVNOMV9HRU5FUkFMU1RSSU5HLCAxKSwKKwlBU04xX0VYUChLUkI1X0FVVEhFTlRCT0RZLAljbmFtZSwJS1JCNV9QUklOQ05BTUUsCSAgMiksCisJQVNOMV9FWFBfT1BUKEtSQjVfQVVUSEVOVEJPRFksCWNrc3VtLAlLUkI1X0NIRUNLU1VNLAkgIDMpLAorCUFTTjFfRVhQKEtSQjVfQVVUSEVOVEJPRFksCWN1c2VjLAlBU04xX0lOVEVHRVIsCSAgNCksCisJQVNOMV9FWFAoS1JCNV9BVVRIRU5UQk9EWSwJY3RpbWUsCUFTTjFfR0VORVJBTElaRURUSU1FLCA1KSwKKwlBU04xX0VYUF9PUFQoS1JCNV9BVVRIRU5UQk9EWSwJc3Via2V5LAlLUkI1X0VOQ0tFWSwJICA2KSwKKwlBU04xX0VYUF9PUFQoS1JCNV9BVVRIRU5UQk9EWSwJc2VxbnVtLAlBU04xX0lOVEVHRVIsCSAgNyksCisJQVNOMV9FWFBfU0VRVUVOQ0VfT0ZfT1BUCisJCSAgICAoS1JCNV9BVVRIRU5UQk9EWSwJYXV0aG9yaXphdGlvbiwJS1JCNV9BVVRIREFUQSwgOCksCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEtSQjVfQVVUSEVOVEJPRFkpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhLUkI1X0FVVEhFTlRCT0RZKQorCitBU04xX0lURU1fVEVNUExBVEUoS1JCNV9BVVRIRU5UKSA9IAorCUFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfRVhQVEFHfEFTTjFfVEZMR19BUFBMSUNBVElPTiwgMiwKKwkJCUtSQjVfQVVUSEVOVCwgS1JCNV9BVVRIRU5UQk9EWSkKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoS1JCNV9BVVRIRU5UKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoS1JCNV9BVVRIRU5UKQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8va3JiNS9rcmI1X2Fzbi5oIGIvbGliL29wZW5zc2wvY3J5cHRvL2tyYjUva3JiNV9hc24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTcyNWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2tyYjUva3JiNV9hc24uaApAQCAtMCwwICsxLDI1NiBAQAorLyoga3JiNV9hc24uaCAqLworLyogV3JpdHRlbiBieSBWZXJuIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+IGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LAorKiogdXNpbmcgb2NzcC97Ki5oLCphc24qLmN9IGFzIGEgc3RhcnRpbmcgcG9pbnQKKyovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9LUkI1X0FTTl9ICisjZGVmaW5lIEhFQURFUl9LUkI1X0FTTl9ICisKKy8qCisjaW5jbHVkZSA8a3JiNS5oPgorKi8KKyNpbmNsdWRlIDxvcGVuc3NsL3NhZmVzdGFjay5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qCUFTTi4xIGZyb20gS2VyYmVyb3MgUkZDIDE1MTAKKyovCisKKy8qCUVuY3J5cHRlZERhdGEgOjo9ICAgU0VRVUVOQ0UgeworKioJCWV0eXBlWzBdICAgICAgICAgICAgICAgICAgICAgIElOVEVHRVIsIC0tIEVuY3J5cHRpb25UeXBlCisqKgkJa3Zub1sxXSAgICAgICAgICAgICAgICAgICAgICAgSU5URUdFUiBPUFRJT05BTCwKKyoqCQljaXBoZXJbMl0gICAgICAgICAgICAgICAgICAgICBPQ1RFVCBTVFJJTkcgLS0gY2lwaGVydGV4dAorKioJfQorKi8KK3R5cGVkZWYJc3RydWN0CWtyYjVfZW5jZGF0YV9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqZXR5cGU7CisJQVNOMV9JTlRFR0VSCQkJKmt2bm87CisJQVNOMV9PQ1RFVF9TVFJJTkcJCSpjaXBoZXI7CisJfQlLUkI1X0VOQ0RBVEE7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoS1JCNV9FTkNEQVRBKQorCisvKglQcmluY2lwYWxOYW1lIDo6PSAgIFNFUVVFTkNFIHsKKyoqCQluYW1lLXR5cGVbMF0gICAgICAgICAgICAgICAgICBJTlRFR0VSLAorKioJCW5hbWUtc3RyaW5nWzFdICAgICAgICAgICAgICAgIFNFUVVFTkNFIE9GIEdlbmVyYWxTdHJpbmcKKyoqCX0KKyovCit0eXBlZGVmCXN0cnVjdAlrcmI1X3ByaW5jbmFtZV9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqbmFtZXR5cGU7CisJU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKQkqbmFtZXN0cmluZzsKKwl9CUtSQjVfUFJJTkNOQU1FOworCitERUNMQVJFX1NUQUNLX09GKEtSQjVfUFJJTkNOQU1FKQorCisKKy8qCVRpY2tldCA6Oj0JW0FQUExJQ0FUSU9OIDFdIFNFUVVFTkNFIHsKKyoqCQl0a3Qtdm5vWzBdICAgICAgICAgICAgICAgICAgICBJTlRFR0VSLAorKioJCXJlYWxtWzFdICAgICAgICAgICAgICAgICAgICAgIFJlYWxtLAorKioJCXNuYW1lWzJdICAgICAgICAgICAgICAgICAgICAgIFByaW5jaXBhbE5hbWUsCisqKgkJZW5jLXBhcnRbM10gICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkRGF0YQorKioJfQorKi8KK3R5cGVkZWYJc3RydWN0CWtyYjVfdGt0Ym9keV9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqdGt0dm5vOworCUFTTjFfR0VORVJBTFNUUklORwkJKnJlYWxtOworCUtSQjVfUFJJTkNOQU1FCQkJKnNuYW1lOworCUtSQjVfRU5DREFUQQkJCSplbmNkYXRhOworCX0JS1JCNV9US1RCT0RZOworCit0eXBlZGVmIFNUQUNLX09GKEtSQjVfVEtUQk9EWSkgS1JCNV9USUNLRVQ7CitERUNMQVJFX1NUQUNLX09GKEtSQjVfVEtUQk9EWSkKKworCisvKglBUC1SRVEgOjo9ICAgICAgW0FQUExJQ0FUSU9OIDE0XSBTRVFVRU5DRSB7CisqKgkJcHZub1swXSAgICAgICAgICAgICAgICAgICAgICAgSU5URUdFUiwKKyoqCQltc2ctdHlwZVsxXSAgICAgICAgICAgICAgICAgICBJTlRFR0VSLAorKioJCWFwLW9wdGlvbnNbMl0gICAgICAgICAgICAgICAgIEFQT3B0aW9ucywKKyoqCQl0aWNrZXRbM10gICAgICAgICAgICAgICAgICAgICBUaWNrZXQsCisqKgkJYXV0aGVudGljYXRvcls0XSAgICAgICAgICAgICAgRW5jcnlwdGVkRGF0YQorKioJfQorKioKKyoqCUFQT3B0aW9ucyA6Oj0gICBCSVQgU1RSSU5HIHsKKyoqCQlyZXNlcnZlZCgwKSwgdXNlLXNlc3Npb24ta2V5KDEpLCBtdXR1YWwtcmVxdWlyZWQoMikgfQorKi8KK3R5cGVkZWYJc3RydWN0CWtyYjVfYXBfcmVxX3N0CisJeworCUFTTjFfSU5URUdFUgkJCSpwdm5vOworCUFTTjFfSU5URUdFUgkJCSptc2d0eXBlOworCUFTTjFfQklUX1NUUklORwkJCSphcG9wdGlvbnM7CisJS1JCNV9USUNLRVQJCQkqdGlja2V0OworCUtSQjVfRU5DREFUQQkJCSphdXRoZW50aWNhdG9yOworCX0JS1JCNV9BUFJFUUJPRFk7CisKK3R5cGVkZWYgU1RBQ0tfT0YoS1JCNV9BUFJFUUJPRFkpIEtSQjVfQVBSRVE7CitERUNMQVJFX1NUQUNLX09GKEtSQjVfQVBSRVFCT0RZKQorCisKKy8qCUF1dGhlbnRpY2F0b3IgU3R1ZmYJKi8KKworCisvKglDaGVja3N1bSA6Oj0gICBTRVFVRU5DRSB7CisqKgkJY2tzdW10eXBlWzBdICAgICAgICAgICAgICAgICAgSU5URUdFUiwKKyoqCQljaGVja3N1bVsxXSAgICAgICAgICAgICAgICAgICBPQ1RFVCBTVFJJTkcKKyoqCX0KKyovCit0eXBlZGVmCXN0cnVjdAlrcmI1X2NoZWNrc3VtX3N0CisJeworCUFTTjFfSU5URUdFUgkJCSpjdHlwZTsKKwlBU04xX09DVEVUX1NUUklORwkJKmNoZWNrc3VtOworCX0JS1JCNV9DSEVDS1NVTTsKKworREVDTEFSRV9TVEFDS19PRihLUkI1X0NIRUNLU1VNKQorCisKKy8qCUVuY3J5cHRpb25LZXkgOjo9ICAgU0VRVUVOQ0UgeworKioJCWtleXR5cGVbMF0gICAgICAgICAgICAgICAgICAgIElOVEVHRVIsCisqKgkJa2V5dmFsdWVbMV0gICAgICAgICAgICAgICAgICAgT0NURVQgU1RSSU5HCisqKgl9CisqLwordHlwZWRlZiBzdHJ1Y3QgIGtyYjVfZW5jcnlwdGlvbmtleV9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqa3R5cGU7CisJQVNOMV9PQ1RFVF9TVFJJTkcJCSprZXl2YWx1ZTsKKwl9CUtSQjVfRU5DS0VZOworCitERUNMQVJFX1NUQUNLX09GKEtSQjVfRU5DS0VZKQorCisKKy8qCUF1dGhvcml6YXRpb25EYXRhIDo6PSAgIFNFUVVFTkNFIE9GIFNFUVVFTkNFIHsKKyoqCQlhZC10eXBlWzBdICAgICAgICAgICAgICAgICAgICBJTlRFR0VSLAorKiogICAgICAgICAgICAgIGFkLWRhdGFbMV0gICAgICAgICAgICAgICAgICAgIE9DVEVUIFNUUklORworKioJfQorKi8KK3R5cGVkZWYgc3RydWN0CWtyYjVfYXV0aG9yaXphdGlvbl9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqYWR0eXBlOworCUFTTjFfT0NURVRfU1RSSU5HCQkqYWRkYXRhOworCX0JS1JCNV9BVVRIREFUQTsKKworREVDTEFSRV9TVEFDS19PRihLUkI1X0FVVEhEQVRBKQorCisJCQkKKy8qCS0tIFVuZW5jcnlwdGVkIGF1dGhlbnRpY2F0b3IKKyoqCUF1dGhlbnRpY2F0b3IgOjo9ICAgIFtBUFBMSUNBVElPTiAyXSBTRVFVRU5DRSAgICB7CisqKgkJYXV0aGVudGljYXRvci12bm9bMF0gICAgICAgICAgSU5URUdFUiwKKyoqCQljcmVhbG1bMV0gICAgICAgICAgICAgICAgICAgICBSZWFsbSwKKyoqCQljbmFtZVsyXSAgICAgICAgICAgICAgICAgICAgICBQcmluY2lwYWxOYW1lLAorKioJCWNrc3VtWzNdICAgICAgICAgICAgICAgICAgICAgIENoZWNrc3VtIE9QVElPTkFMLAorKioJCWN1c2VjWzRdICAgICAgICAgICAgICAgICAgICAgIElOVEVHRVIsCisqKgkJY3RpbWVbNV0gICAgICAgICAgICAgICAgICAgICAgS2VyYmVyb3NUaW1lLAorKioJCXN1YmtleVs2XSAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb25LZXkgT1BUSU9OQUwsCisqKgkJc2VxLW51bWJlcls3XSAgICAgICAgICAgICAgICAgSU5URUdFUiBPUFRJT05BTCwKKyoqCQlhdXRob3JpemF0aW9uLWRhdGFbOF0gICAgICAgICBBdXRob3JpemF0aW9uRGF0YSBPUFRJT05BTAorKioJfQorKi8KK3R5cGVkZWYgc3RydWN0CWtyYjVfYXV0aGVudGljYXRvcl9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqYXZubzsKKwlBU04xX0dFTkVSQUxTVFJJTkcJCSpjcmVhbG07CisJS1JCNV9QUklOQ05BTUUJCQkqY25hbWU7CisJS1JCNV9DSEVDS1NVTQkJCSpja3N1bTsKKwlBU04xX0lOVEVHRVIJCQkqY3VzZWM7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUJCSpjdGltZTsKKwlLUkI1X0VOQ0tFWQkJCSpzdWJrZXk7CisJQVNOMV9JTlRFR0VSCQkJKnNlcW51bTsKKwlLUkI1X0FVVEhEQVRBCQkJKmF1dGhvcml6YXRpb247CisJfQlLUkI1X0FVVEhFTlRCT0RZOworCit0eXBlZGVmIFNUQUNLX09GKEtSQjVfQVVUSEVOVEJPRFkpIEtSQjVfQVVUSEVOVDsKK0RFQ0xBUkVfU1RBQ0tfT0YoS1JCNV9BVVRIRU5UQk9EWSkKKworCisvKiAgREVDTEFSRV9BU04xX0ZVTkNUSU9OUyh0eXBlKSA9IERFQ0xBUkVfQVNOMV9GVU5DVElPTlNfbmFtZSh0eXBlLCB0eXBlKSA9CisqKgl0eXBlICpuYW1lIyNfbmV3KHZvaWQpOworKioJdm9pZCBuYW1lIyNfZnJlZSh0eXBlICphKTsKKyoqCURFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TKHR5cGUsIG5hbWUsIG5hbWUpID0KKyoqCSBERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OUyh0eXBlLCBpdG5hbWUsIG5hbWUpID0KKyoqCSAgdHlwZSAqZDJpXyMjbmFtZSh0eXBlICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7CisqKgkgIGludCBpMmRfIyNuYW1lKHR5cGUgKmEsIHVuc2lnbmVkIGNoYXIgKipvdXQpOworKioJICBERUNMQVJFX0FTTjFfSVRFTShpdG5hbWUpID0gT1BFTlNTTF9FWFRFUk4gY29uc3QgQVNOMV9JVEVNIGl0bmFtZSMjX2l0CisqLworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfRU5DREFUQSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoS1JCNV9QUklOQ05BTUUpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfVEtUQk9EWSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoS1JCNV9BUFJFUUJPRFkpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfVElDS0VUKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhLUkI1X0FQUkVRKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfQ0hFQ0tTVU0pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfRU5DS0VZKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhLUkI1X0FVVEhEQVRBKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhLUkI1X0FVVEhFTlRCT0RZKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhLUkI1X0FVVEhFTlQpCisKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbGhhc2gvbGhfc3RhdHMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9saGFzaC9saF9zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTYxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbGhhc2gvbGhfc3RhdHMuYwpAQCAtMCwwICsxLDI0OCBAQAorLyogY3J5cHRvL2xoYXNoL2xoX3N0YXRzLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisvKiBJZiB5b3Ugd2lzaCB0byBidWlsZCB0aGlzIG91dHNpZGUgb2YgU1NMZWF5LCByZW1vdmUgdGhlIGZvbGxvd2luZyBsaW5lcworICogYW5kIHRoaW5ncyBzaG91bGQgd29yayBhcyBleHBlY3RlZCAqLworI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19CSU8KKwordm9pZCBsaF9zdGF0cyhMSEFTSCAqbGgsIEZJTEUgKm91dCkKKwl7CisJZnByaW50ZihvdXQsIm51bV9pdGVtcyAgICAgICAgICAgICA9ICVsdVxuIixsaC0+bnVtX2l0ZW1zKTsKKwlmcHJpbnRmKG91dCwibnVtX25vZGVzICAgICAgICAgICAgID0gJXVcbiIsbGgtPm51bV9ub2Rlcyk7CisJZnByaW50ZihvdXQsIm51bV9hbGxvY19ub2RlcyAgICAgICA9ICV1XG4iLGxoLT5udW1fYWxsb2Nfbm9kZXMpOworCWZwcmludGYob3V0LCJudW1fZXhwYW5kcyAgICAgICAgICAgPSAlbHVcbiIsbGgtPm51bV9leHBhbmRzKTsKKwlmcHJpbnRmKG91dCwibnVtX2V4cGFuZF9yZWFsbG9jcyAgID0gJWx1XG4iLGxoLT5udW1fZXhwYW5kX3JlYWxsb2NzKTsKKwlmcHJpbnRmKG91dCwibnVtX2NvbnRyYWN0cyAgICAgICAgID0gJWx1XG4iLGxoLT5udW1fY29udHJhY3RzKTsKKwlmcHJpbnRmKG91dCwibnVtX2NvbnRyYWN0X3JlYWxsb2NzID0gJWx1XG4iLGxoLT5udW1fY29udHJhY3RfcmVhbGxvY3MpOworCWZwcmludGYob3V0LCJudW1faGFzaF9jYWxscyAgICAgICAgPSAlbHVcbiIsbGgtPm51bV9oYXNoX2NhbGxzKTsKKwlmcHJpbnRmKG91dCwibnVtX2NvbXBfY2FsbHMgICAgICAgID0gJWx1XG4iLGxoLT5udW1fY29tcF9jYWxscyk7CisJZnByaW50ZihvdXQsIm51bV9pbnNlcnQgICAgICAgICAgICA9ICVsdVxuIixsaC0+bnVtX2luc2VydCk7CisJZnByaW50ZihvdXQsIm51bV9yZXBsYWNlICAgICAgICAgICA9ICVsdVxuIixsaC0+bnVtX3JlcGxhY2UpOworCWZwcmludGYob3V0LCJudW1fZGVsZXRlICAgICAgICAgICAgPSAlbHVcbiIsbGgtPm51bV9kZWxldGUpOworCWZwcmludGYob3V0LCJudW1fbm9fZGVsZXRlICAgICAgICAgPSAlbHVcbiIsbGgtPm51bV9ub19kZWxldGUpOworCWZwcmludGYob3V0LCJudW1fcmV0cmlldmUgICAgICAgICAgPSAlbHVcbiIsbGgtPm51bV9yZXRyaWV2ZSk7CisJZnByaW50ZihvdXQsIm51bV9yZXRyaWV2ZV9taXNzICAgICA9ICVsdVxuIixsaC0+bnVtX3JldHJpZXZlX21pc3MpOworCWZwcmludGYob3V0LCJudW1faGFzaF9jb21wcyAgICAgICAgPSAlbHVcbiIsbGgtPm51bV9oYXNoX2NvbXBzKTsKKyNpZiAwCisJZnByaW50ZihvdXQsInAgICAgICAgICAgICAgICAgICAgICA9ICV1XG4iLGxoLT5wKTsKKwlmcHJpbnRmKG91dCwicG1heCAgICAgICAgICAgICAgICAgID0gJXVcbiIsbGgtPnBtYXgpOworCWZwcmludGYob3V0LCJ1cF9sb2FkICAgICAgICAgICAgICAgPSAlbHVcbiIsbGgtPnVwX2xvYWQpOworCWZwcmludGYob3V0LCJkb3duX2xvYWQgICAgICAgICAgICAgPSAlbHVcbiIsbGgtPmRvd25fbG9hZCk7CisjZW5kaWYKKwl9CisKK3ZvaWQgbGhfbm9kZV9zdGF0cyhMSEFTSCAqbGgsIEZJTEUgKm91dCkKKwl7CisJTEhBU0hfTk9ERSAqbjsKKwl1bnNpZ25lZCBpbnQgaSxudW07CisKKwlmb3IgKGk9MDsgaTxsaC0+bnVtX25vZGVzOyBpKyspCisJCXsKKwkJZm9yIChuPWxoLT5iW2ldLG51bT0wOyBuICE9IE5VTEw7IG49bi0+bmV4dCkKKwkJCW51bSsrOworCQlmcHJpbnRmKG91dCwibm9kZSAlNnUgLT4gJTN1XG4iLGksbnVtKTsKKwkJfQorCX0KKwordm9pZCBsaF9ub2RlX3VzYWdlX3N0YXRzKExIQVNIICpsaCwgRklMRSAqb3V0KQorCXsKKwlMSEFTSF9OT0RFICpuOworCXVuc2lnbmVkIGxvbmcgbnVtOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgdG90YWw9MCxuX3VzZWQ9MDsKKworCWZvciAoaT0wOyBpPGxoLT5udW1fbm9kZXM7IGkrKykKKwkJeworCQlmb3IgKG49bGgtPmJbaV0sbnVtPTA7IG4gIT0gTlVMTDsgbj1uLT5uZXh0KQorCQkJbnVtKys7CisJCWlmIChudW0gIT0gMCkKKwkJCXsKKwkJCW5fdXNlZCsrOworCQkJdG90YWwrPW51bTsKKwkJCX0KKwkJfQorCWZwcmludGYob3V0LCIlbHUgbm9kZXMgdXNlZCBvdXQgb2YgJXVcbiIsbl91c2VkLGxoLT5udW1fbm9kZXMpOworCWZwcmludGYob3V0LCIlbHUgaXRlbXNcbiIsdG90YWwpOworCWlmIChuX3VzZWQgPT0gMCkgcmV0dXJuOworCWZwcmludGYob3V0LCJsb2FkICVkLiUwMmQgIGFjdHVhbCBsb2FkICVkLiUwMmRcbiIsCisJCShpbnQpKHRvdGFsL2xoLT5udW1fbm9kZXMpLAorCQkoaW50KSgodG90YWwlbGgtPm51bV9ub2RlcykqMTAwL2xoLT5udW1fbm9kZXMpLAorCQkoaW50KSh0b3RhbC9uX3VzZWQpLAorCQkoaW50KSgodG90YWwlbl91c2VkKSoxMDAvbl91c2VkKSk7CisJfQorCisjZWxzZQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCit2b2lkIGxoX3N0YXRzKGNvbnN0IF9MSEFTSCAqbGgsIEZJTEUgKmZwKQorCXsKKwlCSU8gKmJwOworCisJYnA9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChicCA9PSBOVUxMKSBnb3RvIGVuZDsKKwlCSU9fc2V0X2ZwKGJwLGZwLEJJT19OT0NMT1NFKTsKKwlsaF9zdGF0c19iaW8obGgsYnApOworCUJJT19mcmVlKGJwKTsKK2VuZDo7CisJfQorCit2b2lkIGxoX25vZGVfc3RhdHMoY29uc3QgX0xIQVNIICpsaCwgRklMRSAqZnApCisJeworCUJJTyAqYnA7CisKKwlicD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJaWYgKGJwID09IE5VTEwpIGdvdG8gZW5kOworCUJJT19zZXRfZnAoYnAsZnAsQklPX05PQ0xPU0UpOworCWxoX25vZGVfc3RhdHNfYmlvKGxoLGJwKTsKKwlCSU9fZnJlZShicCk7CitlbmQ6OworCX0KKwordm9pZCBsaF9ub2RlX3VzYWdlX3N0YXRzKGNvbnN0IF9MSEFTSCAqbGgsIEZJTEUgKmZwKQorCXsKKwlCSU8gKmJwOworCisJYnA9QklPX25ldyhCSU9fc19maWxlKCkpOworCWlmIChicCA9PSBOVUxMKSBnb3RvIGVuZDsKKwlCSU9fc2V0X2ZwKGJwLGZwLEJJT19OT0NMT1NFKTsKKwlsaF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxicCk7CisJQklPX2ZyZWUoYnApOworZW5kOjsKKwl9CisKKyNlbmRpZgorCit2b2lkIGxoX3N0YXRzX2Jpbyhjb25zdCBfTEhBU0ggKmxoLCBCSU8gKm91dCkKKwl7CisJQklPX3ByaW50ZihvdXQsIm51bV9pdGVtcyAgICAgICAgICAgICA9ICVsdVxuIixsaC0+bnVtX2l0ZW1zKTsKKwlCSU9fcHJpbnRmKG91dCwibnVtX25vZGVzICAgICAgICAgICAgID0gJXVcbiIsbGgtPm51bV9ub2Rlcyk7CisJQklPX3ByaW50ZihvdXQsIm51bV9hbGxvY19ub2RlcyAgICAgICA9ICV1XG4iLGxoLT5udW1fYWxsb2Nfbm9kZXMpOworCUJJT19wcmludGYob3V0LCJudW1fZXhwYW5kcyAgICAgICAgICAgPSAlbHVcbiIsbGgtPm51bV9leHBhbmRzKTsKKwlCSU9fcHJpbnRmKG91dCwibnVtX2V4cGFuZF9yZWFsbG9jcyAgID0gJWx1XG4iLAorCQkgICBsaC0+bnVtX2V4cGFuZF9yZWFsbG9jcyk7CisJQklPX3ByaW50ZihvdXQsIm51bV9jb250cmFjdHMgICAgICAgICA9ICVsdVxuIixsaC0+bnVtX2NvbnRyYWN0cyk7CisJQklPX3ByaW50ZihvdXQsIm51bV9jb250cmFjdF9yZWFsbG9jcyA9ICVsdVxuIiwKKwkJICAgbGgtPm51bV9jb250cmFjdF9yZWFsbG9jcyk7CisJQklPX3ByaW50ZihvdXQsIm51bV9oYXNoX2NhbGxzICAgICAgICA9ICVsdVxuIixsaC0+bnVtX2hhc2hfY2FsbHMpOworCUJJT19wcmludGYob3V0LCJudW1fY29tcF9jYWxscyAgICAgICAgPSAlbHVcbiIsbGgtPm51bV9jb21wX2NhbGxzKTsKKwlCSU9fcHJpbnRmKG91dCwibnVtX2luc2VydCAgICAgICAgICAgID0gJWx1XG4iLGxoLT5udW1faW5zZXJ0KTsKKwlCSU9fcHJpbnRmKG91dCwibnVtX3JlcGxhY2UgICAgICAgICAgID0gJWx1XG4iLGxoLT5udW1fcmVwbGFjZSk7CisJQklPX3ByaW50ZihvdXQsIm51bV9kZWxldGUgICAgICAgICAgICA9ICVsdVxuIixsaC0+bnVtX2RlbGV0ZSk7CisJQklPX3ByaW50ZihvdXQsIm51bV9ub19kZWxldGUgICAgICAgICA9ICVsdVxuIixsaC0+bnVtX25vX2RlbGV0ZSk7CisJQklPX3ByaW50ZihvdXQsIm51bV9yZXRyaWV2ZSAgICAgICAgICA9ICVsdVxuIixsaC0+bnVtX3JldHJpZXZlKTsKKwlCSU9fcHJpbnRmKG91dCwibnVtX3JldHJpZXZlX21pc3MgICAgID0gJWx1XG4iLGxoLT5udW1fcmV0cmlldmVfbWlzcyk7CisJQklPX3ByaW50ZihvdXQsIm51bV9oYXNoX2NvbXBzICAgICAgICA9ICVsdVxuIixsaC0+bnVtX2hhc2hfY29tcHMpOworI2lmIDAKKwlCSU9fcHJpbnRmKG91dCwicCAgICAgICAgICAgICAgICAgICAgID0gJXVcbiIsbGgtPnApOworCUJJT19wcmludGYob3V0LCJwbWF4ICAgICAgICAgICAgICAgICAgPSAldVxuIixsaC0+cG1heCk7CisJQklPX3ByaW50ZihvdXQsInVwX2xvYWQgICAgICAgICAgICAgICA9ICVsdVxuIixsaC0+dXBfbG9hZCk7CisJQklPX3ByaW50ZihvdXQsImRvd25fbG9hZCAgICAgICAgICAgICA9ICVsdVxuIixsaC0+ZG93bl9sb2FkKTsKKyNlbmRpZgorCX0KKwordm9pZCBsaF9ub2RlX3N0YXRzX2Jpbyhjb25zdCBfTEhBU0ggKmxoLCBCSU8gKm91dCkKKwl7CisJTEhBU0hfTk9ERSAqbjsKKwl1bnNpZ25lZCBpbnQgaSxudW07CisKKwlmb3IgKGk9MDsgaTxsaC0+bnVtX25vZGVzOyBpKyspCisJCXsKKwkJZm9yIChuPWxoLT5iW2ldLG51bT0wOyBuICE9IE5VTEw7IG49bi0+bmV4dCkKKwkJCW51bSsrOworCQlCSU9fcHJpbnRmKG91dCwibm9kZSAlNnUgLT4gJTN1XG4iLGksbnVtKTsKKwkJfQorCX0KKwordm9pZCBsaF9ub2RlX3VzYWdlX3N0YXRzX2Jpbyhjb25zdCBfTEhBU0ggKmxoLCBCSU8gKm91dCkKKwl7CisJTEhBU0hfTk9ERSAqbjsKKwl1bnNpZ25lZCBsb25nIG51bTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsPTAsbl91c2VkPTA7CisKKwlmb3IgKGk9MDsgaTxsaC0+bnVtX25vZGVzOyBpKyspCisJCXsKKwkJZm9yIChuPWxoLT5iW2ldLG51bT0wOyBuICE9IE5VTEw7IG49bi0+bmV4dCkKKwkJCW51bSsrOworCQlpZiAobnVtICE9IDApCisJCQl7CisJCQluX3VzZWQrKzsKKwkJCXRvdGFsKz1udW07CisJCQl9CisJCX0KKwlCSU9fcHJpbnRmKG91dCwiJWx1IG5vZGVzIHVzZWQgb3V0IG9mICV1XG4iLG5fdXNlZCxsaC0+bnVtX25vZGVzKTsKKwlCSU9fcHJpbnRmKG91dCwiJWx1IGl0ZW1zXG4iLHRvdGFsKTsKKwlpZiAobl91c2VkID09IDApIHJldHVybjsKKwlCSU9fcHJpbnRmKG91dCwibG9hZCAlZC4lMDJkICBhY3R1YWwgbG9hZCAlZC4lMDJkXG4iLAorCQkgICAoaW50KSh0b3RhbC9saC0+bnVtX25vZGVzKSwKKwkJICAgKGludCkoKHRvdGFsJWxoLT5udW1fbm9kZXMpKjEwMC9saC0+bnVtX25vZGVzKSwKKwkJICAgKGludCkodG90YWwvbl91c2VkKSwKKwkJICAgKGludCkoKHRvdGFsJW5fdXNlZCkqMTAwL25fdXNlZCkpOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbGhhc2gvbGhfdGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2xoYXNoL2xoX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTcwMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2xoYXNoL2xoX3Rlc3QuYwpAQCAtMCwwICsxLDg4IEBACisvKiBjcnlwdG8vbGhhc2gvbGhfdGVzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKworbWFpbigpCisJeworCUxIQVNIICpjb25mOworCWNoYXIgYnVmWzI1Nl07CisJaW50IGk7CisKKwljb25mPWxoX25ldyhsaF9zdHJoYXNoLHN0cmNtcCk7CisJZm9yICg7OykKKwkJeworCQljaGFyICpwOworCisJCWJ1ZlswXT0nXDAnOworCQlmZ2V0cyhidWYsMjU2LHN0ZGluKTsKKwkJaWYgKGJ1ZlswXSA9PSAnXDAnKSBicmVhazsKKwkJaT1zdHJsZW4oYnVmKTsKKwkJcD1PUEVOU1NMX21hbGxvYyhpKzEpOworCQltZW1jcHkocCxidWYsaSsxKTsKKwkJbGhfaW5zZXJ0KGNvbmYscCk7CisJCX0KKworCWxoX25vZGVfc3RhdHMoY29uZixzdGRvdXQpOworCWxoX3N0YXRzKGNvbmYsc3Rkb3V0KTsKKwlsaF9ub2RlX3VzYWdlX3N0YXRzKGNvbmYsc3Rkb3V0KTsKKwlleGl0KDApOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9saGFzaC9saGFzaC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL2xoYXNoL2xoYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmNzQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9saGFzaC9saGFzaC5jCkBAIC0wLDAgKzEsNDc1IEBACisvKiBjcnlwdG8vbGhhc2gvbGhhc2guYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBDb2RlIGZvciBkeW5hbWljIGhhc2ggdGFibGUgcm91dGluZXMKKyAqIEF1dGhvciAtIEVyaWMgWW91bmcgdiAyLjAKKyAqCisgKiAyLjIgZWF5IC0gYWRkZWQgI2luY2x1ZGUgImNyeXB0by5oIiBzbyB0aGUgbWVtb3J5IGxlYWsgY2hlY2tpbmcgY29kZSBpcworICoJICAgICBwcmVzZW50LiBlYXkgMTgtSnVuLTk4CisgKgorICogMi4xIGVheSAtIEFkZGVkIGFuICdlcnJvciBpbiBsYXN0IG9wZXJhdGlvbicgZmxhZy4gZWF5IDYtTWF5LTk4CisgKgorICogMi4wIGVheSAtIEZpeGVkIGEgYnVnIHRoYXQgb2NjdXJyZWQgd2hlbiB1c2luZyBsaF9kZWxldGUKKyAqCSAgICAgZnJvbSBpbnNpZGUgbGhfZG9hbGwoKS4gIEFzIGVudHJpZXMgd2VyZSBkZWxldGVkLAorICoJICAgICB0aGUgJ3RhYmxlJyB3YXMgJ2NvbnRyYWN0KCllZCcsIG1ha2luZyBzb21lIGVudHJpZXMKKyAqCSAgICAganVtcCBmcm9tIHRoZSBlbmQgb2YgdGhlIHRhYmxlIHRvIHRoZSBzdGFydCwgdGhlcmUgYnkKKyAqCSAgICAgc2tpcHBpbmcgdGhlIGxoX2RvYWxsKCkgcHJvY2Vzc2luZy4gZWF5IC0gNC8xMi85NQorICoKKyAqIDEuOSBlYXkgLSBGaXhlZCBhIG1lbW9yeSBsZWFrIGluIGxoX2ZyZWUsIHRoZSBMSEFTSF9OT0RFcworICoJICAgICB3ZXJlIG5vdCBiZWluZyBmcmVlKCllZC4gMjEvMTEvOTUKKyAqCisgKiAxLjggZWF5IC0gUHV0IHRoZSBzdGF0cyByb3V0aW5lcyBpbnRvIGEgc2VwYXJhdGUgZmlsZSwgbGhfc3RhdHMuYworICoJICAgICAxOS8wOS85NQorICoKKyAqIDEuNyBlYXkgLSBSZW1vdmVkIHRoZSBmcHV0cygpIGZvciByZWFsbG9jIGZhaWx1cmVzIC0gdGhlIGNvZGUKKyAqICAgICAgICAgICBzaG91bGQgc2lsZW50bHkgdG9sZXJhdGUgdGhlbS4gIEkgaGF2ZSBhbHNvIGZpeGVkIHRoaW5ncworICogICAgICAgICAgIGxpbnQgY29tcGxhaW5lZCBhYm91dCAwNC8wNS85NQorICoKKyAqIDEuNiBlYXkgLSBGaXhlZCBhbiBpbnZhbGlkIHBvaW50ZXJzIGluIGNvbnRyYWN0L2V4cGFuZCAyNy8wNy85MgorICoKKyAqIDEuNSBlYXkgLSBGaXhlZCBhIG1pc3VzZSBvZiByZWFsbG9jIGluIGV4cGFuZCAwMi8wMy8xOTkyCisgKgorICogMS40IGVheSAtIEZpeGVkIGxoX2RvYWxsIHNvIHRoZSBmdW5jdGlvbiBjYW4gY2FsbCBsaF9kZWxldGUgMjgvMDUvOTEKKyAqCisgKiAxLjMgZWF5IC0gRml4ZWQgYSBmZXcgbGludCBwcm9ibGVtcyAxOS8zLzE5OTEKKyAqCisgKiAxLjIgZWF5IC0gRml4ZWQgbGhfZG9hbGwgcHJvYmxlbSAxMy8zLzE5OTEKKyAqCisgKiAxLjEgZWF5IC0gQWRkZWQgbGhfZG9hbGwKKyAqCisgKiAxLjAgZWF5IC0gRmlyc3QgdmVyc2lvbgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKworY29uc3QgY2hhciBsaF92ZXJzaW9uW109ImxoYXNoIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKKyN1bmRlZiBNSU5fTk9ERVMgCisjZGVmaW5lIE1JTl9OT0RFUwkxNgorI2RlZmluZSBVUF9MT0FECQkoMipMSF9MT0FEX01VTFQpIC8qIGxvYWQgdGltZXMgMjU2ICAoZGVmYXVsdCAyKSAqLworI2RlZmluZSBET1dOX0xPQUQJKExIX0xPQURfTVVMVCkgICAvKiBsb2FkIHRpbWVzIDI1NiAgKGRlZmF1bHQgMSkgKi8KKworc3RhdGljIHZvaWQgZXhwYW5kKF9MSEFTSCAqbGgpOworc3RhdGljIHZvaWQgY29udHJhY3QoX0xIQVNIICpsaCk7CitzdGF0aWMgTEhBU0hfTk9ERSAqKmdldHJuKF9MSEFTSCAqbGgsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnJoYXNoKTsKKworX0xIQVNIICpsaF9uZXcoTEhBU0hfSEFTSF9GTl9UWVBFIGgsIExIQVNIX0NPTVBfRk5fVFlQRSBjKQorCXsKKwlfTEhBU0ggKnJldDsKKwlpbnQgaTsKKworCWlmICgocmV0PU9QRU5TU0xfbWFsbG9jKHNpemVvZihfTEhBU0gpKSkgPT0gTlVMTCkKKwkJZ290byBlcnIwOworCWlmICgocmV0LT5iPU9QRU5TU0xfbWFsbG9jKHNpemVvZihMSEFTSF9OT0RFICopKk1JTl9OT0RFUykpID09IE5VTEwpCisJCWdvdG8gZXJyMTsKKwlmb3IgKGk9MDsgaTxNSU5fTk9ERVM7IGkrKykKKwkJcmV0LT5iW2ldPU5VTEw7CisJcmV0LT5jb21wPSgoYyA9PSBOVUxMKT8oTEhBU0hfQ09NUF9GTl9UWVBFKXN0cmNtcDpjKTsKKwlyZXQtPmhhc2g9KChoID09IE5VTEwpPyhMSEFTSF9IQVNIX0ZOX1RZUEUpbGhfc3RyaGFzaDpoKTsKKwlyZXQtPm51bV9ub2Rlcz1NSU5fTk9ERVMvMjsKKwlyZXQtPm51bV9hbGxvY19ub2Rlcz1NSU5fTk9ERVM7CisJcmV0LT5wPTA7CisJcmV0LT5wbWF4PU1JTl9OT0RFUy8yOworCXJldC0+dXBfbG9hZD1VUF9MT0FEOworCXJldC0+ZG93bl9sb2FkPURPV05fTE9BRDsKKwlyZXQtPm51bV9pdGVtcz0wOworCisJcmV0LT5udW1fZXhwYW5kcz0wOworCXJldC0+bnVtX2V4cGFuZF9yZWFsbG9jcz0wOworCXJldC0+bnVtX2NvbnRyYWN0cz0wOworCXJldC0+bnVtX2NvbnRyYWN0X3JlYWxsb2NzPTA7CisJcmV0LT5udW1faGFzaF9jYWxscz0wOworCXJldC0+bnVtX2NvbXBfY2FsbHM9MDsKKwlyZXQtPm51bV9pbnNlcnQ9MDsKKwlyZXQtPm51bV9yZXBsYWNlPTA7CisJcmV0LT5udW1fZGVsZXRlPTA7CisJcmV0LT5udW1fbm9fZGVsZXRlPTA7CisJcmV0LT5udW1fcmV0cmlldmU9MDsKKwlyZXQtPm51bV9yZXRyaWV2ZV9taXNzPTA7CisJcmV0LT5udW1faGFzaF9jb21wcz0wOworCisJcmV0LT5lcnJvcj0wOworCXJldHVybihyZXQpOworZXJyMToKKwlPUEVOU1NMX2ZyZWUocmV0KTsKK2VycjA6CisJcmV0dXJuKE5VTEwpOworCX0KKwordm9pZCBsaF9mcmVlKF9MSEFTSCAqbGgpCisJeworCXVuc2lnbmVkIGludCBpOworCUxIQVNIX05PREUgKm4sKm5uOworCisJaWYgKGxoID09IE5VTEwpCisJICAgIHJldHVybjsKKworCWZvciAoaT0wOyBpPGxoLT5udW1fbm9kZXM7IGkrKykKKwkJeworCQluPWxoLT5iW2ldOworCQl3aGlsZSAobiAhPSBOVUxMKQorCQkJeworCQkJbm49bi0+bmV4dDsKKwkJCU9QRU5TU0xfZnJlZShuKTsKKwkJCW49bm47CisJCQl9CisJCX0KKwlPUEVOU1NMX2ZyZWUobGgtPmIpOworCU9QRU5TU0xfZnJlZShsaCk7CisJfQorCit2b2lkICpsaF9pbnNlcnQoX0xIQVNIICpsaCwgdm9pZCAqZGF0YSkKKwl7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCUxIQVNIX05PREUgKm5uLCoqcm47CisJdm9pZCAqcmV0OworCisJbGgtPmVycm9yPTA7CisJaWYgKGxoLT51cF9sb2FkIDw9IChsaC0+bnVtX2l0ZW1zKkxIX0xPQURfTVVMVC9saC0+bnVtX25vZGVzKSkKKwkJZXhwYW5kKGxoKTsKKworCXJuPWdldHJuKGxoLGRhdGEsJmhhc2gpOworCisJaWYgKCpybiA9PSBOVUxMKQorCQl7CisJCWlmICgobm49KExIQVNIX05PREUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoTEhBU0hfTk9ERSkpKSA9PSBOVUxMKQorCQkJeworCQkJbGgtPmVycm9yKys7CisJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCW5uLT5kYXRhPWRhdGE7CisJCW5uLT5uZXh0PU5VTEw7CisjaWZuZGVmIE9QRU5TU0xfTk9fSEFTSF9DT01QCisJCW5uLT5oYXNoPWhhc2g7CisjZW5kaWYKKwkJKnJuPW5uOworCQlyZXQ9TlVMTDsKKwkJbGgtPm51bV9pbnNlcnQrKzsKKwkJbGgtPm51bV9pdGVtcysrOworCQl9CisJZWxzZSAvKiByZXBsYWNlIHNhbWUga2V5ICovCisJCXsKKwkJcmV0PSAoKnJuKS0+ZGF0YTsKKwkJKCpybiktPmRhdGE9ZGF0YTsKKwkJbGgtPm51bV9yZXBsYWNlKys7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3ZvaWQgKmxoX2RlbGV0ZShfTEhBU0ggKmxoLCBjb25zdCB2b2lkICpkYXRhKQorCXsKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisJTEhBU0hfTk9ERSAqbm4sKipybjsKKwl2b2lkICpyZXQ7CisKKwlsaC0+ZXJyb3I9MDsKKwlybj1nZXRybihsaCxkYXRhLCZoYXNoKTsKKworCWlmICgqcm4gPT0gTlVMTCkKKwkJeworCQlsaC0+bnVtX25vX2RlbGV0ZSsrOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwllbHNlCisJCXsKKwkJbm49ICpybjsKKwkJKnJuPW5uLT5uZXh0OworCQlyZXQ9bm4tPmRhdGE7CisJCU9QRU5TU0xfZnJlZShubik7CisJCWxoLT5udW1fZGVsZXRlKys7CisJCX0KKworCWxoLT5udW1faXRlbXMtLTsKKwlpZiAoKGxoLT5udW1fbm9kZXMgPiBNSU5fTk9ERVMpICYmCisJCShsaC0+ZG93bl9sb2FkID49IChsaC0+bnVtX2l0ZW1zKkxIX0xPQURfTVVMVC9saC0+bnVtX25vZGVzKSkpCisJCWNvbnRyYWN0KGxoKTsKKworCXJldHVybihyZXQpOworCX0KKwordm9pZCAqbGhfcmV0cmlldmUoX0xIQVNIICpsaCwgY29uc3Qgdm9pZCAqZGF0YSkKKwl7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCUxIQVNIX05PREUgKipybjsKKwl2b2lkICpyZXQ7CisKKwlsaC0+ZXJyb3I9MDsKKwlybj1nZXRybihsaCxkYXRhLCZoYXNoKTsKKworCWlmICgqcm4gPT0gTlVMTCkKKwkJeworCQlsaC0+bnVtX3JldHJpZXZlX21pc3MrKzsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJZWxzZQorCQl7CisJCXJldD0gKCpybiktPmRhdGE7CisJCWxoLT5udW1fcmV0cmlldmUrKzsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIHZvaWQgZG9hbGxfdXRpbF9mbihfTEhBU0ggKmxoLCBpbnQgdXNlX2FyZywgTEhBU0hfRE9BTExfRk5fVFlQRSBmdW5jLAorCQkJICBMSEFTSF9ET0FMTF9BUkdfRk5fVFlQRSBmdW5jX2FyZywgdm9pZCAqYXJnKQorCXsKKwlpbnQgaTsKKwlMSEFTSF9OT0RFICphLCpuOworCisJaWYgKGxoID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIHJldmVyc2UgdGhlIG9yZGVyIHNvIHdlIHNlYXJjaCBmcm9tICd0b3AgdG8gYm90dG9tJworCSAqIFdlIHdlcmUgaGF2aW5nIG1lbW9yeSBsZWFrcyBvdGhlcndpc2UgKi8KKwlmb3IgKGk9bGgtPm51bV9ub2Rlcy0xOyBpPj0wOyBpLS0pCisJCXsKKwkJYT1saC0+YltpXTsKKwkJd2hpbGUgKGEgIT0gTlVMTCkKKwkJCXsKKwkJCS8qIDI4LzA1LzkxIC0gZWF5IC0gbiBhZGRlZCBzbyBpdGVtcyBjYW4gYmUgZGVsZXRlZAorCQkJICogdmlhIGxoX2RvYWxsICovCisJCQkvKiAyMi8wNS8wOCAtIGJlbiAtIGVoPyBzaW5jZSBhIGlzIG5vdCBwYXNzZWQsCisJCQkgKiB0aGlzIHNob3VsZCBub3QgYmUgbmVlZGVkICovCisJCQluPWEtPm5leHQ7CisJCQlpZih1c2VfYXJnKQorCQkJCWZ1bmNfYXJnKGEtPmRhdGEsYXJnKTsKKwkJCWVsc2UKKwkJCQlmdW5jKGEtPmRhdGEpOworCQkJYT1uOworCQkJfQorCQl9CisJfQorCit2b2lkIGxoX2RvYWxsKF9MSEFTSCAqbGgsIExIQVNIX0RPQUxMX0ZOX1RZUEUgZnVuYykKKwl7CisJZG9hbGxfdXRpbF9mbihsaCwgMCwgZnVuYywgKExIQVNIX0RPQUxMX0FSR19GTl9UWVBFKTAsIE5VTEwpOworCX0KKwordm9pZCBsaF9kb2FsbF9hcmcoX0xIQVNIICpsaCwgTEhBU0hfRE9BTExfQVJHX0ZOX1RZUEUgZnVuYywgdm9pZCAqYXJnKQorCXsKKwlkb2FsbF91dGlsX2ZuKGxoLCAxLCAoTEhBU0hfRE9BTExfRk5fVFlQRSkwLCBmdW5jLCBhcmcpOworCX0KKworc3RhdGljIHZvaWQgZXhwYW5kKF9MSEFTSCAqbGgpCisJeworCUxIQVNIX05PREUgKipuLCoqbjEsKipuMiwqbnA7CisJdW5zaWduZWQgaW50IHAsaSxqOworCXVuc2lnbmVkIGxvbmcgaGFzaCxubmk7CisKKwlsaC0+bnVtX25vZGVzKys7CisJbGgtPm51bV9leHBhbmRzKys7CisJcD0oaW50KWxoLT5wKys7CisJbjE9ICYobGgtPmJbcF0pOworCW4yPSAmKGxoLT5iW3ArKGludClsaC0+cG1heF0pOworCSpuMj1OVUxMOyAgICAgICAgLyogMjcvMDcvOTIgLSBlYXkgLSB1bmRlZmluZWQgcG9pbnRlciBidWcgKi8KKwlubmk9bGgtPm51bV9hbGxvY19ub2RlczsKKwkKKwlmb3IgKG5wPSAqbjE7IG5wICE9IE5VTEw7ICkKKwkJeworI2lmbmRlZiBPUEVOU1NMX05PX0hBU0hfQ09NUAorCQloYXNoPW5wLT5oYXNoOworI2Vsc2UKKwkJaGFzaD1saC0+aGFzaChucC0+ZGF0YSk7CisJCWxoLT5udW1faGFzaF9jYWxscysrOworI2VuZGlmCisJCWlmICgoaGFzaCVubmkpICE9IHApCisJCQl7IC8qIG1vdmUgaXQgKi8KKwkJCSpuMT0gKCpuMSktPm5leHQ7CisJCQlucC0+bmV4dD0gKm4yOworCQkJKm4yPW5wOworCQkJfQorCQllbHNlCisJCQluMT0gJigoKm4xKS0+bmV4dCk7CisJCW5wPSAqbjE7CisJCX0KKworCWlmICgobGgtPnApID49IGxoLT5wbWF4KQorCQl7CisJCWo9KGludClsaC0+bnVtX2FsbG9jX25vZGVzKjI7CisJCW49KExIQVNIX05PREUgKiopT1BFTlNTTF9yZWFsbG9jKGxoLT5iLAorCQkJKGludCkoc2l6ZW9mKExIQVNIX05PREUgKikqaikpOworCQlpZiAobiA9PSBOVUxMKQorCQkJeworLyoJCQlmcHV0cygicmVhbGxvYyBlcnJvciBpbiBsaGFzaCIsc3RkZXJyKTsgKi8KKwkJCWxoLT5lcnJvcisrOworCQkJbGgtPnA9MDsKKwkJCXJldHVybjsKKwkJCX0KKwkJLyogZWxzZSAqLworCQlmb3IgKGk9KGludClsaC0+bnVtX2FsbG9jX25vZGVzOyBpPGo7IGkrKykvKiAyNi8wMi85MiBlYXkgKi8KKwkJCW5baV09TlVMTDsJCQkgIC8qIDAyLzAzLzkyIGVheSAqLworCQlsaC0+cG1heD1saC0+bnVtX2FsbG9jX25vZGVzOworCQlsaC0+bnVtX2FsbG9jX25vZGVzPWo7CisJCWxoLT5udW1fZXhwYW5kX3JlYWxsb2NzKys7CisJCWxoLT5wPTA7CisJCWxoLT5iPW47CisJCX0KKwl9CisKK3N0YXRpYyB2b2lkIGNvbnRyYWN0KF9MSEFTSCAqbGgpCisJeworCUxIQVNIX05PREUgKipuLCpuMSwqbnA7CisKKwlucD1saC0+YltsaC0+cCtsaC0+cG1heC0xXTsKKwlsaC0+YltsaC0+cCtsaC0+cG1heC0xXT1OVUxMOyAvKiAyNC8wNy05MiAtIGVheSAtIHdlaXJkIGJ1dCA6LSggKi8KKwlpZiAobGgtPnAgPT0gMCkKKwkJeworCQluPShMSEFTSF9OT0RFICoqKU9QRU5TU0xfcmVhbGxvYyhsaC0+YiwKKwkJCSh1bnNpZ25lZCBpbnQpKHNpemVvZihMSEFTSF9OT0RFICopKmxoLT5wbWF4KSk7CisJCWlmIChuID09IE5VTEwpCisJCQl7CisvKgkJCWZwdXRzKCJyZWFsbG9jIGVycm9yIGluIGxoYXNoIixzdGRlcnIpOyAqLworCQkJbGgtPmVycm9yKys7CisJCQlyZXR1cm47CisJCQl9CisJCWxoLT5udW1fY29udHJhY3RfcmVhbGxvY3MrKzsKKwkJbGgtPm51bV9hbGxvY19ub2Rlcy89MjsKKwkJbGgtPnBtYXgvPTI7CisJCWxoLT5wPWxoLT5wbWF4LTE7CisJCWxoLT5iPW47CisJCX0KKwllbHNlCisJCWxoLT5wLS07CisKKwlsaC0+bnVtX25vZGVzLS07CisJbGgtPm51bV9jb250cmFjdHMrKzsKKworCW4xPWxoLT5iWyhpbnQpbGgtPnBdOworCWlmIChuMSA9PSBOVUxMKQorCQlsaC0+YlsoaW50KWxoLT5wXT1ucDsKKwllbHNlCisJCXsKKwkJd2hpbGUgKG4xLT5uZXh0ICE9IE5VTEwpCisJCQluMT1uMS0+bmV4dDsKKwkJbjEtPm5leHQ9bnA7CisJCX0KKwl9CisKK3N0YXRpYyBMSEFTSF9OT0RFICoqZ2V0cm4oX0xIQVNIICpsaCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqcmhhc2gpCisJeworCUxIQVNIX05PREUgKipyZXQsKm4xOworCXVuc2lnbmVkIGxvbmcgaGFzaCxubjsKKwlMSEFTSF9DT01QX0ZOX1RZUEUgY2Y7CisKKwloYXNoPSgqKGxoLT5oYXNoKSkoZGF0YSk7CisJbGgtPm51bV9oYXNoX2NhbGxzKys7CisJKnJoYXNoPWhhc2g7CisKKwlubj1oYXNoJWxoLT5wbWF4OworCWlmIChubiA8IGxoLT5wKQorCQlubj1oYXNoJWxoLT5udW1fYWxsb2Nfbm9kZXM7CisKKwljZj1saC0+Y29tcDsKKwlyZXQ9ICYobGgtPmJbKGludClubl0pOworCWZvciAobjE9ICpyZXQ7IG4xICE9IE5VTEw7IG4xPW4xLT5uZXh0KQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fSEFTSF9DT01QCisJCWxoLT5udW1faGFzaF9jb21wcysrOworCQlpZiAobjEtPmhhc2ggIT0gaGFzaCkKKwkJCXsKKwkJCXJldD0gJihuMS0+bmV4dCk7CisJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQlsaC0+bnVtX2NvbXBfY2FsbHMrKzsKKwkJaWYoY2YobjEtPmRhdGEsZGF0YSkgPT0gMCkKKwkJCWJyZWFrOworCQlyZXQ9ICYobjEtPm5leHQpOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCisvKiBUaGUgZm9sbG93aW5nIGhhc2ggc2VlbXMgdG8gd29yayB2ZXJ5IHdlbGwgb24gbm9ybWFsIHRleHQgc3RyaW5ncworICogbm8gY29sbGlzaW9ucyBvbiAvdXNyL2RpY3Qvd29yZHMgYW5kIGl0IGRpc3RyaWJ1dGVzIG9uICUyXm4gcXVpdGUKKyAqIHdlbGwsIG5vdCBhcyBnb29kIGFzIE1ENSwgYnV0IHN0aWxsIGdvb2QuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbGhfc3RyaGFzaChjb25zdCBjaGFyICpjKQorCXsKKwl1bnNpZ25lZCBsb25nIHJldD0wOworCWxvbmcgbjsKKwl1bnNpZ25lZCBsb25nIHY7CisJaW50IHI7CisKKwlpZiAoKGMgPT0gTlVMTCkgfHwgKCpjID09ICdcMCcpKQorCQlyZXR1cm4ocmV0KTsKKy8qCisJdW5zaWduZWQgY2hhciBiWzE2XTsKKwlNRDUoYyxzdHJsZW4oYyksYik7CisJcmV0dXJuKGJbMF18KGJbMV08PDgpfChiWzJdPDwxNil8KGJbM108PDI0KSk7IAorKi8KKworCW49MHgxMDA7CisJd2hpbGUgKCpjKQorCQl7CisJCXY9bnwoKmMpOworCQluKz0weDEwMDsKKwkJcj0gKGludCkoKHY+PjIpXnYpJjB4MGY7CisJCXJldD0ocmV0PDxyKXwocmV0Pj4oMzItcikpOworCQlyZXQmPTB4RkZGRkZGRkZMOworCQlyZXRePXYqdjsKKwkJYysrOworCQl9CisJcmV0dXJuKChyZXQ+PjE2KV5yZXQpOworCX0KKwordW5zaWduZWQgbG9uZyBsaF9udW1faXRlbXMoY29uc3QgX0xIQVNIICpsaCkKKwl7CisJcmV0dXJuIGxoID8gbGgtPm51bV9pdGVtcyA6IDA7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL2xoYXNoL2xoYXNoLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vbGhhc2gvbGhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q4NzYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL2xoYXNoL2xoYXNoLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qIGNyeXB0by9saGFzaC9saGFzaC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIEhlYWRlciBmb3IgZHluYW1pYyBoYXNoIHRhYmxlIHJvdXRpbmVzCisgKiBBdXRob3IgLSBFcmljIFlvdW5nCisgKi8KKworI2lmbmRlZiBIRUFERVJfTEhBU0hfSAorI2RlZmluZSBIRUFERVJfTEhBU0hfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgbGhhc2hfbm9kZV9zdAorCXsKKwl2b2lkICpkYXRhOworCXN0cnVjdCBsaGFzaF9ub2RlX3N0ICpuZXh0OworI2lmbmRlZiBPUEVOU1NMX05PX0hBU0hfQ09NUAorCXVuc2lnbmVkIGxvbmcgaGFzaDsKKyNlbmRpZgorCX0gTEhBU0hfTk9ERTsKKwordHlwZWRlZiBpbnQgKCpMSEFTSF9DT01QX0ZOX1RZUEUpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAoKkxIQVNIX0hBU0hfRk5fVFlQRSkoY29uc3Qgdm9pZCAqKTsKK3R5cGVkZWYgdm9pZCAoKkxIQVNIX0RPQUxMX0ZOX1RZUEUpKHZvaWQgKik7Cit0eXBlZGVmIHZvaWQgKCpMSEFTSF9ET0FMTF9BUkdfRk5fVFlQRSkodm9pZCAqLCB2b2lkICopOworCisvKiBNYWNyb3MgZm9yIGRlY2xhcmluZyBhbmQgaW1wbGVtZW50aW5nIHR5cGUtc2FmZSB3cmFwcGVycyBmb3IgTEhBU0ggY2FsbGJhY2tzLgorICogVGhpcyB3YXksIGNhbGxiYWNrcyBjYW4gYmUgcHJvdmlkZWQgdG8gTEhBU0ggc3RydWN0dXJlcyB3aXRob3V0IGZ1bmN0aW9uCisgKiBwb2ludGVyIGNhc3RpbmcgYW5kIHRoZSBtYWNyby1kZWZpbmVkIGNhbGxiYWNrcyBwcm92aWRlIHBlci12YXJpYWJsZSBjYXN0aW5nCisgKiBiZWZvcmUgZGVmZXJyaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHR5cGUtc3BlY2lmaWMgY2FsbGJhY2tzLiBOQjogSXQgaXMKKyAqIHBvc3NpYmxlIHRvIHBsYWNlIGEgInN0YXRpYyIgaW4gZnJvbnQgb2YgYm90aCB0aGUgREVDTEFSRSBhbmQgSU1QTEVNRU5UCisgKiBtYWNyb3MgaWYgdGhlIGZ1bmN0aW9ucyBhcmUgc3RyaWN0bHkgaW50ZXJuYWwuICovCisKKy8qIEZpcnN0OiAiaGFzaCIgZnVuY3Rpb25zICovCisjZGVmaW5lIERFQ0xBUkVfTEhBU0hfSEFTSF9GTihuYW1lLCBvX3R5cGUpIFwKKwl1bnNpZ25lZCBsb25nIG5hbWUjI19MSEFTSF9IQVNIKGNvbnN0IHZvaWQgKik7CisjZGVmaW5lIElNUExFTUVOVF9MSEFTSF9IQVNIX0ZOKG5hbWUsIG9fdHlwZSkgXAorCXVuc2lnbmVkIGxvbmcgbmFtZSMjX0xIQVNIX0hBU0goY29uc3Qgdm9pZCAqYXJnKSB7IFwKKwkJY29uc3Qgb190eXBlICphID0gYXJnOyBcCisJCXJldHVybiBuYW1lIyNfaGFzaChhKTsgfQorI2RlZmluZSBMSEFTSF9IQVNIX0ZOKG5hbWUpIG5hbWUjI19MSEFTSF9IQVNICisKKy8qIFNlY29uZDogImNvbXBhcmUiIGZ1bmN0aW9ucyAqLworI2RlZmluZSBERUNMQVJFX0xIQVNIX0NPTVBfRk4obmFtZSwgb190eXBlKSBcCisJaW50IG5hbWUjI19MSEFTSF9DT01QKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKKyNkZWZpbmUgSU1QTEVNRU5UX0xIQVNIX0NPTVBfRk4obmFtZSwgb190eXBlKSBcCisJaW50IG5hbWUjI19MSEFTSF9DT01QKGNvbnN0IHZvaWQgKmFyZzEsIGNvbnN0IHZvaWQgKmFyZzIpIHsgXAorCQljb25zdCBvX3R5cGUgKmEgPSBhcmcxOwkJICAgIFwKKwkJY29uc3Qgb190eXBlICpiID0gYXJnMjsgXAorCQlyZXR1cm4gbmFtZSMjX2NtcChhLGIpOyB9CisjZGVmaW5lIExIQVNIX0NPTVBfRk4obmFtZSkgbmFtZSMjX0xIQVNIX0NPTVAKKworLyogVGhpcmQ6ICJkb2FsbCIgZnVuY3Rpb25zICovCisjZGVmaW5lIERFQ0xBUkVfTEhBU0hfRE9BTExfRk4obmFtZSwgb190eXBlKSBcCisJdm9pZCBuYW1lIyNfTEhBU0hfRE9BTEwodm9pZCAqKTsKKyNkZWZpbmUgSU1QTEVNRU5UX0xIQVNIX0RPQUxMX0ZOKG5hbWUsIG9fdHlwZSkgXAorCXZvaWQgbmFtZSMjX0xIQVNIX0RPQUxMKHZvaWQgKmFyZykgeyBcCisJCW9fdHlwZSAqYSA9IGFyZzsgXAorCQluYW1lIyNfZG9hbGwoYSk7IH0KKyNkZWZpbmUgTEhBU0hfRE9BTExfRk4obmFtZSkgbmFtZSMjX0xIQVNIX0RPQUxMCisKKy8qIEZvdXJ0aDogImRvYWxsX2FyZyIgZnVuY3Rpb25zICovCisjZGVmaW5lIERFQ0xBUkVfTEhBU0hfRE9BTExfQVJHX0ZOKG5hbWUsIG9fdHlwZSwgYV90eXBlKSBcCisJdm9pZCBuYW1lIyNfTEhBU0hfRE9BTExfQVJHKHZvaWQgKiwgdm9pZCAqKTsKKyNkZWZpbmUgSU1QTEVNRU5UX0xIQVNIX0RPQUxMX0FSR19GTihuYW1lLCBvX3R5cGUsIGFfdHlwZSkgXAorCXZvaWQgbmFtZSMjX0xIQVNIX0RPQUxMX0FSRyh2b2lkICphcmcxLCB2b2lkICphcmcyKSB7IFwKKwkJb190eXBlICphID0gYXJnMTsgXAorCQlhX3R5cGUgKmIgPSBhcmcyOyBcCisJCW5hbWUjI19kb2FsbF9hcmcoYSwgYik7IH0KKyNkZWZpbmUgTEhBU0hfRE9BTExfQVJHX0ZOKG5hbWUpIG5hbWUjI19MSEFTSF9ET0FMTF9BUkcKKwordHlwZWRlZiBzdHJ1Y3QgbGhhc2hfc3QKKwl7CisJTEhBU0hfTk9ERSAqKmI7CisJTEhBU0hfQ09NUF9GTl9UWVBFIGNvbXA7CisJTEhBU0hfSEFTSF9GTl9UWVBFIGhhc2g7CisJdW5zaWduZWQgaW50IG51bV9ub2RlczsKKwl1bnNpZ25lZCBpbnQgbnVtX2FsbG9jX25vZGVzOworCXVuc2lnbmVkIGludCBwOworCXVuc2lnbmVkIGludCBwbWF4OworCXVuc2lnbmVkIGxvbmcgdXBfbG9hZDsgLyogbG9hZCB0aW1lcyAyNTYgKi8KKwl1bnNpZ25lZCBsb25nIGRvd25fbG9hZDsgLyogbG9hZCB0aW1lcyAyNTYgKi8KKwl1bnNpZ25lZCBsb25nIG51bV9pdGVtczsKKworCXVuc2lnbmVkIGxvbmcgbnVtX2V4cGFuZHM7CisJdW5zaWduZWQgbG9uZyBudW1fZXhwYW5kX3JlYWxsb2NzOworCXVuc2lnbmVkIGxvbmcgbnVtX2NvbnRyYWN0czsKKwl1bnNpZ25lZCBsb25nIG51bV9jb250cmFjdF9yZWFsbG9jczsKKwl1bnNpZ25lZCBsb25nIG51bV9oYXNoX2NhbGxzOworCXVuc2lnbmVkIGxvbmcgbnVtX2NvbXBfY2FsbHM7CisJdW5zaWduZWQgbG9uZyBudW1faW5zZXJ0OworCXVuc2lnbmVkIGxvbmcgbnVtX3JlcGxhY2U7CisJdW5zaWduZWQgbG9uZyBudW1fZGVsZXRlOworCXVuc2lnbmVkIGxvbmcgbnVtX25vX2RlbGV0ZTsKKwl1bnNpZ25lZCBsb25nIG51bV9yZXRyaWV2ZTsKKwl1bnNpZ25lZCBsb25nIG51bV9yZXRyaWV2ZV9taXNzOworCXVuc2lnbmVkIGxvbmcgbnVtX2hhc2hfY29tcHM7CisKKwlpbnQgZXJyb3I7CisJfSBfTEhBU0g7CS8qIERvIG5vdCB1c2UgX0xIQVNIIGRpcmVjdGx5LCB1c2UgTEhBU0hfT0YKKwkJCSAqIGFuZCBmcmllbmRzICovCisKKyNkZWZpbmUgTEhfTE9BRF9NVUxUCTI1NgorCisvKiBJbmRpY2F0ZXMgYSBtYWxsb2MoKSBlcnJvciBpbiB0aGUgbGFzdCBjYWxsLCB0aGlzIGlzIG9ubHkgYmFkCisgKiBpbiBsaF9pbnNlcnQoKS4gKi8KKyNkZWZpbmUgbGhfZXJyb3IobGgpCSgobGgpLT5lcnJvcikKKworX0xIQVNIICpsaF9uZXcoTEhBU0hfSEFTSF9GTl9UWVBFIGgsIExIQVNIX0NPTVBfRk5fVFlQRSBjKTsKK3ZvaWQgbGhfZnJlZShfTEhBU0ggKmxoKTsKK3ZvaWQgKmxoX2luc2VydChfTEhBU0ggKmxoLCB2b2lkICpkYXRhKTsKK3ZvaWQgKmxoX2RlbGV0ZShfTEhBU0ggKmxoLCBjb25zdCB2b2lkICpkYXRhKTsKK3ZvaWQgKmxoX3JldHJpZXZlKF9MSEFTSCAqbGgsIGNvbnN0IHZvaWQgKmRhdGEpOwordm9pZCBsaF9kb2FsbChfTEhBU0ggKmxoLCBMSEFTSF9ET0FMTF9GTl9UWVBFIGZ1bmMpOwordm9pZCBsaF9kb2FsbF9hcmcoX0xIQVNIICpsaCwgTEhBU0hfRE9BTExfQVJHX0ZOX1RZUEUgZnVuYywgdm9pZCAqYXJnKTsKK3Vuc2lnbmVkIGxvbmcgbGhfc3RyaGFzaChjb25zdCBjaGFyICpjKTsKK3Vuc2lnbmVkIGxvbmcgbGhfbnVtX2l0ZW1zKGNvbnN0IF9MSEFTSCAqbGgpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCit2b2lkIGxoX3N0YXRzKGNvbnN0IF9MSEFTSCAqbGgsIEZJTEUgKm91dCk7Cit2b2lkIGxoX25vZGVfc3RhdHMoY29uc3QgX0xIQVNIICpsaCwgRklMRSAqb3V0KTsKK3ZvaWQgbGhfbm9kZV91c2FnZV9zdGF0cyhjb25zdCBfTEhBU0ggKmxoLCBGSUxFICpvdXQpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK3ZvaWQgbGhfc3RhdHNfYmlvKGNvbnN0IF9MSEFTSCAqbGgsIEJJTyAqb3V0KTsKK3ZvaWQgbGhfbm9kZV9zdGF0c19iaW8oY29uc3QgX0xIQVNIICpsaCwgQklPICpvdXQpOwordm9pZCBsaF9ub2RlX3VzYWdlX3N0YXRzX2Jpbyhjb25zdCBfTEhBU0ggKmxoLCBCSU8gKm91dCk7CisjZW5kaWYKKworLyogVHlwZSBjaGVja2luZy4uLiAqLworCisjZGVmaW5lIExIQVNIX09GKHR5cGUpIHN0cnVjdCBsaGFzaF9zdF8jI3R5cGUKKworI2RlZmluZSBERUNMQVJFX0xIQVNIX09GKHR5cGUpIExIQVNIX09GKHR5cGUpIHsgaW50IGR1bW15OyB9CisKKyNkZWZpbmUgQ0hFQ0tFRF9MSEFTSF9PRih0eXBlLGxoKSBcCisgICgoX0xIQVNIICopQ0hFQ0tFRF9QVFJfT0YoTEhBU0hfT0YodHlwZSksbGgpKQorCisvKiBEZWZpbmUgd3JhcHBlciBmdW5jdGlvbnMuICovCisjZGVmaW5lIExITV9saF9uZXcodHlwZSwgbmFtZSkgXAorICAoKExIQVNIX09GKHR5cGUpICopbGhfbmV3KExIQVNIX0hBU0hfRk4obmFtZSksIExIQVNIX0NPTVBfRk4obmFtZSkpKQorI2RlZmluZSBMSE1fbGhfZXJyb3IodHlwZSwgbGgpIFwKKyAgbGhfZXJyb3IoQ0hFQ0tFRF9MSEFTSF9PRih0eXBlLGxoKSkKKyNkZWZpbmUgTEhNX2xoX2luc2VydCh0eXBlLCBsaCwgaW5zdCkgXAorICAoKHR5cGUgKilsaF9pbnNlcnQoQ0hFQ0tFRF9MSEFTSF9PRih0eXBlLCBsaCksIFwKKwkJICAgICBDSEVDS0VEX1BUUl9PRih0eXBlLCBpbnN0KSkpCisjZGVmaW5lIExITV9saF9yZXRyaWV2ZSh0eXBlLCBsaCwgaW5zdCkgXAorICAoKHR5cGUgKilsaF9yZXRyaWV2ZShDSEVDS0VEX0xIQVNIX09GKHR5cGUsIGxoKSwgXAorCQkgICAgICAgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgaW5zdCkpKQorI2RlZmluZSBMSE1fbGhfZGVsZXRlKHR5cGUsIGxoLCBpbnN0KSBcCisgICgodHlwZSAqKWxoX2RlbGV0ZShDSEVDS0VEX0xIQVNIX09GKHR5cGUsIGxoKSwJCQlcCisJCSAgICAgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgaW5zdCkpKQorI2RlZmluZSBMSE1fbGhfZG9hbGwodHlwZSwgbGgsZm4pIGxoX2RvYWxsKENIRUNLRURfTEhBU0hfT0YodHlwZSwgbGgpLCBmbikKKyNkZWZpbmUgTEhNX2xoX2RvYWxsX2FyZyh0eXBlLCBsaCwgZm4sIGFyZ190eXBlLCBhcmcpIFwKKyAgbGhfZG9hbGxfYXJnKENIRUNLRURfTEhBU0hfT0YodHlwZSwgbGgpLCBmbiwgQ0hFQ0tFRF9QVFJfT0YoYXJnX3R5cGUsIGFyZykpCisjZGVmaW5lIExITV9saF9udW1faXRlbXModHlwZSwgbGgpIGxoX251bV9pdGVtcyhDSEVDS0VEX0xIQVNIX09GKHR5cGUsIGxoKSkKKyNkZWZpbmUgTEhNX2xoX2Rvd25fbG9hZCh0eXBlLCBsaCkgKENIRUNLRURfTEhBU0hfT0YodHlwZSwgbGgpLT5kb3duX2xvYWQpCisjZGVmaW5lIExITV9saF9ub2RlX3N0YXRzX2Jpbyh0eXBlLCBsaCwgb3V0KSBcCisgIGxoX25vZGVfc3RhdHNfYmlvKENIRUNLRURfTEhBU0hfT0YodHlwZSwgbGgpLCBvdXQpCisjZGVmaW5lIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2Jpbyh0eXBlLCBsaCwgb3V0KSBcCisgIGxoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKENIRUNLRURfTEhBU0hfT0YodHlwZSwgbGgpLCBvdXQpCisjZGVmaW5lIExITV9saF9zdGF0c19iaW8odHlwZSwgbGgsIG91dCkgXAorICBsaF9zdGF0c19iaW8oQ0hFQ0tFRF9MSEFTSF9PRih0eXBlLCBsaCksIG91dCkKKyNkZWZpbmUgTEhNX2xoX2ZyZWUodHlwZSwgbGgpIGxoX2ZyZWUoQ0hFQ0tFRF9MSEFTSF9PRih0eXBlLCBsaCkpCisKK0RFQ0xBUkVfTEhBU0hfT0YoT1BFTlNTTF9TVFJJTkcpOworREVDTEFSRV9MSEFTSF9PRihPUEVOU1NMX0NTVFJJTkcpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9saGFzaC9udW0ucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vbGhhc2gvbnVtLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZmVkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbGhhc2gvbnVtLnBsCkBAIC0wLDAgKzEsMTcgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorCisjbm9kZSAgICAgMTAgLT4gICA0CisKK3doaWxlICg8PikKKwl7CisJbmV4dCB1bmxlc3MgL15ub2RlLzsKKwljaG9wOworCUBhPXNwbGl0OworCSRudW17JGFbM119Kys7CisJfQorCitAYT1zb3J0IHskYSA8PT4gJGIgfSBrZXlzICVudW07Citmb3JlYWNoICgwIC4uICRhWyQjYV0pCisJeworCXByaW50ZiAiJTRkOiU0ZFxuIiwkXywkbnVteyRffTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbWQzMl9jb21tb24uaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDMyX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYjc4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQzMl9jb21tb24uaApAQCAtMCwwICsxLDQwOCBAQAorLyogY3J5cHRvL21kMzJfY29tbW9uLmggKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgaXMgYSBnZW5lcmljIDMyIGJpdCAiY29sbGVjdG9yIiBmb3IgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtcy4KKyAqIFdoZW5ldmVyIG5lZWRlZCBpdCBjb2xsZWN0cyBpbnB1dCBjaGFyYWN0ZXIgc3RyZWFtIGludG8gY2h1bmtzIG9mCisgKiAzMiBiaXQgdmFsdWVzIGFuZCBpbnZva2VzIGEgYmxvY2sgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBhY3R1YWwgaGFzaAorICogY2FsY3VsYXRpb25zLgorICoKKyAqIFBvcnRpbmcgZ3VpZGUuCisgKgorICogT2JsaWdhdG9yeSBtYWNyb3M6CisgKgorICogREFUQV9PUkRFUl9JU19CSUdfRU5ESUFOIG9yIERBVEFfT1JERVJfSVNfTElUVExFX0VORElBTgorICoJdGhpcyBtYWNybyBkZWZpbmVzIGJ5dGUgb3JkZXIgb2YgaW5wdXQgc3RyZWFtLgorICogSEFTSF9DQkxPQ0sKKyAqCXNpemUgb2YgYSB1bml0IGNodW5rIEhBU0hfQkxPQ0sgb3BlcmF0ZXMgb24uCisgKiBIQVNIX0xPTkcKKyAqCWhhcyB0byBiZSBhdCBsZXN0IDMyIGJpdCB3aWRlLCBpZiBpdCdzIHdpZGVyLCB0aGVuCisgKglIQVNIX0xPTkdfTE9HMiAqaGFzIHRvKiBiZSBkZWZpbmVkIGFsb25nCisgKiBIQVNIX0NUWAorICoJY29udGV4dCBzdHJ1Y3R1cmUgdGhhdCBhdCBsZWFzdCBjb250YWlucyBmb2xsb3dpbmcKKyAqCW1lbWJlcnM6CisgKgkJdHlwZWRlZiBzdHJ1Y3QgeworICoJCQkuLi4KKyAqCQkJSEFTSF9MT05HCU5sLE5oOworICoJCQllaXRoZXIgeworICoJCQlIQVNIX0xPTkcJZGF0YVtIQVNIX0xCTE9DS107CisgKgkJCXVuc2lnbmVkIGNoYXIJZGF0YVtIQVNIX0NCTE9DS107CisgKgkJCX07CisgKgkJCXVuc2lnbmVkIGludAludW07CisgKgkJCS4uLgorICoJCQl9IEhBU0hfQ1RYOworICoJZGF0YVtdIHZlY3RvciBpcyBleHBlY3RlZCB0byBiZSB6ZXJvZWQgdXBvbiBmaXJzdCBjYWxsIHRvCisgKglIQVNIX1VQREFURS4KKyAqIEhBU0hfVVBEQVRFCisgKgluYW1lIG9mICJVcGRhdGUiIGZ1bmN0aW9uLCBpbXBsZW1lbnRlZCBoZXJlLgorICogSEFTSF9UUkFOU0ZPUk0KKyAqCW5hbWUgb2YgIlRyYW5zZm9ybSIgZnVuY3Rpb24sIGltcGxlbWVudGVkIGhlcmUuCisgKiBIQVNIX0ZJTkFMCisgKgluYW1lIG9mICJGaW5hbCIgZnVuY3Rpb24sIGltcGxlbWVudGVkIGhlcmUuCisgKiBIQVNIX0JMT0NLX0RBVEFfT1JERVIKKyAqCW5hbWUgb2YgImJsb2NrIiBmdW5jdGlvbiBjYXBhYmxlIG9mIHRyZWF0aW5nICp1bmFsaWduZWQqIGlucHV0CisgKgltZXNzYWdlIGluIG9yaWdpbmFsIChkYXRhKSBieXRlIG9yZGVyLCBpbXBsZW1lbnRlZCBleHRlcm5hbGx5LgorICogSEFTSF9NQUtFX1NUUklORworICoJbWFjcm8gY29udmVyaW5nIGNvbnRleHQgdmFyaWFibGVzIHRvIGFuIEFTQ0lJIGhhc2ggc3RyaW5nLgorICoKKyAqIE1ENSBleGFtcGxlOgorICoKKyAqCSNkZWZpbmUgREFUQV9PUkRFUl9JU19MSVRUTEVfRU5ESUFOCisgKgorICoJI2RlZmluZSBIQVNIX0xPTkcJCU1ENV9MT05HCisgKgkjZGVmaW5lIEhBU0hfTE9OR19MT0cyCQlNRDVfTE9OR19MT0cyCisgKgkjZGVmaW5lIEhBU0hfQ1RYCQlNRDVfQ1RYCisgKgkjZGVmaW5lIEhBU0hfQ0JMT0NLCQlNRDVfQ0JMT0NLCisgKgkjZGVmaW5lIEhBU0hfVVBEQVRFCQlNRDVfVXBkYXRlCisgKgkjZGVmaW5lIEhBU0hfVFJBTlNGT1JNCQlNRDVfVHJhbnNmb3JtCisgKgkjZGVmaW5lIEhBU0hfRklOQUwJCU1ENV9GaW5hbAorICoJI2RlZmluZSBIQVNIX0JMT0NLX0RBVEFfT1JERVIJbWQ1X2Jsb2NrX2RhdGFfb3JkZXIKKyAqCisgKgkJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorICovCisKKyNpZiAhZGVmaW5lZChEQVRBX09SREVSX0lTX0JJR19FTkRJQU4pICYmICFkZWZpbmVkKERBVEFfT1JERVJfSVNfTElUVExFX0VORElBTikKKyNlcnJvciAiREFUQV9PUkRFUiBtdXN0IGJlIGRlZmluZWQhIgorI2VuZGlmCisKKyNpZm5kZWYgSEFTSF9DQkxPQ0sKKyNlcnJvciAiSEFTSF9DQkxPQ0sgbXVzdCBiZSBkZWZpbmVkISIKKyNlbmRpZgorI2lmbmRlZiBIQVNIX0xPTkcKKyNlcnJvciAiSEFTSF9MT05HIG11c3QgYmUgZGVmaW5lZCEiCisjZW5kaWYKKyNpZm5kZWYgSEFTSF9DVFgKKyNlcnJvciAiSEFTSF9DVFggbXVzdCBiZSBkZWZpbmVkISIKKyNlbmRpZgorCisjaWZuZGVmIEhBU0hfVVBEQVRFCisjZXJyb3IgIkhBU0hfVVBEQVRFIG11c3QgYmUgZGVmaW5lZCEiCisjZW5kaWYKKyNpZm5kZWYgSEFTSF9UUkFOU0ZPUk0KKyNlcnJvciAiSEFTSF9UUkFOU0ZPUk0gbXVzdCBiZSBkZWZpbmVkISIKKyNlbmRpZgorI2lmbmRlZiBIQVNIX0ZJTkFMCisjZXJyb3IgIkhBU0hfRklOQUwgbXVzdCBiZSBkZWZpbmVkISIKKyNlbmRpZgorCisjaWZuZGVmIEhBU0hfQkxPQ0tfREFUQV9PUkRFUgorI2Vycm9yICJIQVNIX0JMT0NLX0RBVEFfT1JERVIgbXVzdCBiZSBkZWZpbmVkISIKKyNlbmRpZgorCisvKgorICogRW5nYWdlIGNvbXBpbGVyIHNwZWNpZmljIHJvdGF0ZSBpbnRyaW5zaWMgZnVuY3Rpb24gaWYgYXZhaWxhYmxlLgorICovCisjdW5kZWYgUk9UQVRFCisjaWZuZGVmIFBFREFOVElDCisjIGlmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19JQ0MpCisjICBkZWZpbmUgUk9UQVRFKGEsbikJX2xyb3RsKGEsbikKKyMgZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pCisjICBpZiBkZWZpbmVkKF9fUE9XRVJQQ19fKQorIyAgIGRlZmluZSBST1RBVEUoYSxuKQlfX3Jsd2lubShhLG4sMCwzMSkKKyMgIGVsaWYgZGVmaW5lZChfX01DNjhLX18pCisgICAgLyogTW90b3JvbGEgc3BlY2lmaWMgdHdlYWsuIDxhcHByb0BmeS5jaGFsbWVycy5zZT4gKi8KKyMgICBkZWZpbmUgUk9UQVRFKGEsbikJKCBuPDI0ID8gX19yb2woYSxuKSA6IF9fcm9yKGEsMzItbikgKQorIyAgZWxzZQorIyAgIGRlZmluZSBST1RBVEUoYSxuKQlfX3JvbChhLG4pCisjICBlbmRpZgorIyBlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fPj0yICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0lOTElORV9BU00pCisgIC8qCisgICAqIFNvbWUgR05VIEMgaW5saW5lIGFzc2VtYmxlciB0ZW1wbGF0ZXMuIE5vdGUgdGhhdCB0aGVzZSBhcmUKKyAgICogcm90YXRlcyBieSAqY29uc3RhbnQqIG51bWJlciBvZiBiaXRzISBCdXQgdGhhdCdzIGV4YWN0bHkKKyAgICogd2hhdCB3ZSBuZWVkIGhlcmUuLi4KKyAgICogCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgICAqLworIyAgaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyMgICBkZWZpbmUgUk9UQVRFKGEsbikJKHsgcmVnaXN0ZXIgdW5zaWduZWQgaW50IHJldDsJXAorCQkJCWFzbSAoCQkJXAorCQkJCSJyb2xsICUxLCUwIgkJXAorCQkJCTogIj1yIihyZXQpCQlcCisJCQkJOiAiSSIobiksICIwIihhKQlcCisJCQkJOiAiY2MiKTsJCVwKKwkJCSAgIHJldDsJCQkJXAorCQkJfSkKKyMgIGVsaWYgZGVmaW5lZChfQVJDSF9QUEMpIHx8IGRlZmluZWQoX0FSQ0hfUFBDNjQpIHx8IFwKKwlkZWZpbmVkKF9fcG93ZXJwYykgfHwgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisjICAgZGVmaW5lIFJPVEFURShhLG4pCSh7IHJlZ2lzdGVyIHVuc2lnbmVkIGludCByZXQ7CVwKKwkJCQlhc20gKAkJCVwKKwkJCQkicmx3aW5tICUwLCUxLCUyLDAsMzEiCVwKKwkJCQk6ICI9ciIocmV0KQkJXAorCQkJCTogInIiKGEpLCAiSSIobikpOwlcCisJCQkgICByZXQ7CQkJCVwKKwkJCX0pCisjICBlbGlmIGRlZmluZWQoX19zMzkweF9fKQorIyAgIGRlZmluZSBST1RBVEUoYSxuKSAoeyByZWdpc3RlciB1bnNpZ25lZCBpbnQgcmV0OwlcCisJCQkJYXNtICgicmxsICUwLCUxLCUyIglcCisJCQkJOiAiPXIiKHJldCkJCVwKKwkJCQk6ICJyIihhKSwgIkkiKG4pKTsJXAorCQkJICByZXQ7CQkJCVwKKwkJCX0pCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmIC8qIFBFREFOVElDICovCisKKyNpZm5kZWYgUk9UQVRFCisjZGVmaW5lIFJPVEFURShhLG4pICAgICAoKChhKTw8KG4pKXwoKChhKSYweGZmZmZmZmZmKT4+KDMyLShuKSkpKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKERBVEFfT1JERVJfSVNfQklHX0VORElBTikKKworI2lmbmRlZiBQRURBTlRJQworIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXz49MiAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19JTkxJTkVfQVNNKQorIyAgaWYgKChkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykpICYmICFkZWZpbmVkKEkzODZfT05MWSkpIHx8IFwKKyAgICAgIChkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pKQorIyAgIGlmICFkZWZpbmVkKEJfRU5ESUFOKQorICAgIC8qCisgICAgICogVGhpcyBnaXZlcyB+MzAtNDAlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluIFNIQS0yNTYgY29tcGlsZWQKKyAgICAgKiB3aXRoIGdjYyBbb24gUDRdLiBXZWxsLCBmaXJzdCBtYWNybyB0byBiZSBmcmFuay4gV2UgY2FuIHB1bGwKKyAgICAgKiB0aGlzIHRyaWNrIG9uIHg4NiogcGxhdGZvcm1zIG9ubHksIGJlY2F1c2UgdGhlc2UgQ1BVcyBjYW4gZmV0Y2gKKyAgICAgKiB1bmFsaWduZWQgZGF0YSB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uLgorICAgICAqLworIyAgIGRlZmluZSBIT1NUX2MybChjLGwpCSh7IHVuc2lnbmVkIGludCByPSooKGNvbnN0IHVuc2lnbmVkIGludCAqKShjKSk7CVwKKwkJCQkgICBhc20gKCJic3dhcGwgJTAiOiI9ciIocik6IjAiKHIpKTsJXAorCQkJCSAgIChjKSs9NDsgKGwpPXI7CQkJfSkKKyMgICBkZWZpbmUgSE9TVF9sMmMobCxjKQkoeyB1bnNpZ25lZCBpbnQgcj0obCk7CQkJXAorCQkJCSAgIGFzbSAoImJzd2FwbCAlMCI6Ij1yIihyKToiMCIocikpOwlcCisJCQkJICAgKigodW5zaWduZWQgaW50ICopKGMpKT1yOyAoYykrPTQ7IHI7CX0pCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9fczM5MHhfXykKKyMgZGVmaW5lIEhPU1RfYzJsKGMsbCkgKChsKT0qKChjb25zdCB1bnNpZ25lZCBpbnQgKikoYykpLCAoYykrPTQsIChsKSkKKyMgZGVmaW5lIEhPU1RfbDJjKGwsYykgKCooKHVuc2lnbmVkIGludCAqKShjKSk9KGwpLCAoYykrPTQsIChsKSkKKyNlbmRpZgorCisjaWZuZGVmIEhPU1RfYzJsCisjZGVmaW5lIEhPU1RfYzJsKGMsbCkJKGwgPSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PDI0KSwJCVwKKwkJCSBsfD0oKCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwxNiksCQlcCisJCQkgbHw9KCgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8IDgpLAkJXAorCQkJIGx8PSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSkgICAgKSwJCVwKKwkJCSBsKQorI2VuZGlmCisjaWZuZGVmIEhPU1RfbDJjCisjZGVmaW5lIEhPU1RfbDJjKGwsYykJKCooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4yNCkmMHhmZiksCVwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MTYpJjB4ZmYpLAlcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PiA4KSYweGZmKSwJXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpICAgICkmMHhmZiksCVwKKwkJCSBsKQorI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoREFUQV9PUkRFUl9JU19MSVRUTEVfRU5ESUFOKQorCisjaWZuZGVmIFBFREFOVElDCisjIGlmIGRlZmluZWQoX19HTlVDX18pICYmIF9fR05VQ19fPj0yICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fQVNNKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0lOTElORV9BU00pCisjICBpZiBkZWZpbmVkKF9fczM5MHhfXykKKyMgICBkZWZpbmUgSE9TVF9jMmwoYyxsKQkoeyBhc20gKCJscnYJJTAsJTEiCQkJXAorCQkJCSAgIDoiPWQiKGwpIDoibSIoKihjb25zdCB1bnNpZ25lZCBpbnQgKikoYykpKTtcCisJCQkJICAgKGMpKz00OyAobCk7CQkJCX0pCisjICAgZGVmaW5lIEhPU1RfbDJjKGwsYykJKHsgYXNtICgic3RydgklMSwlMCIJCQlcCisJCQkJICAgOiI9bSIoKih1bnNpZ25lZCBpbnQgKikoYykpIDoiZCIobCkpO1wKKwkJCQkgICAoYykrPTQ7IChsKTsJCQkJfSkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorIyBpZm5kZWYgQl9FTkRJQU4KKyAgIC8qIFNlZSBjb21tZW50IGluIERBVEFfT1JERVJfSVNfQklHX0VORElBTiBzZWN0aW9uLiAqLworIyAgZGVmaW5lIEhPU1RfYzJsKGMsbCkJKChsKT0qKChjb25zdCB1bnNpZ25lZCBpbnQgKikoYykpLCAoYykrPTQsIGwpCisjICBkZWZpbmUgSE9TVF9sMmMobCxjKQkoKigodW5zaWduZWQgaW50ICopKGMpKT0obCksIChjKSs9NCwgbCkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhPU1RfYzJsCisjZGVmaW5lIEhPU1RfYzJsKGMsbCkJKGwgPSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSkgICAgKSwJCVwKKwkJCSBsfD0oKCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwgOCksCQlcCisJCQkgbHw9KCgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8MTYpLAkJXAorCQkJIGx8PSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PDI0KSwJCVwKKwkJCSBsKQorI2VuZGlmCisjaWZuZGVmIEhPU1RfbDJjCisjZGVmaW5lIEhPU1RfbDJjKGwsYykJKCooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpICAgICkmMHhmZiksCVwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+IDgpJjB4ZmYpLAlcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjE2KSYweGZmKSwJXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4yNCkmMHhmZiksCVwKKwkJCSBsKQorI2VuZGlmCisKKyNlbmRpZgorCisvKgorICogVGltZSBmb3Igc29tZSBhY3Rpb246LSkKKyAqLworCitpbnQgSEFTSF9VUERBVEUgKEhBU0hfQ1RYICpjLCBjb25zdCB2b2lkICpkYXRhXywgc2l6ZV90IGxlbikKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YT1kYXRhXzsKKwl1bnNpZ25lZCBjaGFyICpwOworCUhBU0hfTE9ORyBsOworCXNpemVfdCBuOworCisJaWYgKGxlbj09MCkgcmV0dXJuIDE7CisKKwlsPShjLT5ObCsoKChIQVNIX0xPTkcpbGVuKTw8MykpJjB4ZmZmZmZmZmZVTDsKKwkvKiA5NS0wNS0yNCBlYXkgRml4ZWQgYSBidWcgd2l0aCB0aGUgb3ZlcmZsb3cgaGFuZGxpbmcsIHRoYW5rcyB0bworCSAqIFdlaSBEYWkgPHdlaWRhaUBlc2tpbW8uY29tPiBmb3IgcG9pbnRpbmcgaXQgb3V0LiAqLworCWlmIChsIDwgYy0+TmwpIC8qIG92ZXJmbG93ICovCisJCWMtPk5oKys7CisJYy0+TmgrPShIQVNIX0xPTkcpKGxlbj4+MjkpOwkvKiBtaWdodCBjYXVzZSBjb21waWxlciB3YXJuaW5nIG9uIDE2LWJpdCAqLworCWMtPk5sPWw7CisKKwluID0gYy0+bnVtOworCWlmIChuICE9IDApCisJCXsKKwkJcD0odW5zaWduZWQgY2hhciAqKWMtPmRhdGE7CisKKwkJaWYgKGxlbiA+PSBIQVNIX0NCTE9DSyB8fCBsZW4rbiA+PSBIQVNIX0NCTE9DSykKKwkJCXsKKwkJCW1lbWNweSAocCtuLGRhdGEsSEFTSF9DQkxPQ0stbik7CisJCQlIQVNIX0JMT0NLX0RBVEFfT1JERVIgKGMscCwxKTsKKwkJCW4gICAgICA9IEhBU0hfQ0JMT0NLLW47CisJCQlkYXRhICArPSBuOworCQkJbGVuICAgLT0gbjsKKwkJCWMtPm51bSA9IDA7CisJCQltZW1zZXQgKHAsMCxIQVNIX0NCTE9DSyk7CS8qIGtlZXAgaXQgemVyb2VkICovCisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW1lbWNweSAocCtuLGRhdGEsbGVuKTsKKwkJCWMtPm51bSArPSAodW5zaWduZWQgaW50KWxlbjsKKwkJCXJldHVybiAxOworCQkJfQorCQl9CisKKwluID0gbGVuL0hBU0hfQ0JMT0NLOworCWlmIChuID4gMCkKKwkJeworCQlIQVNIX0JMT0NLX0RBVEFfT1JERVIgKGMsZGF0YSxuKTsKKwkJbiAgICAqPSBIQVNIX0NCTE9DSzsKKwkJZGF0YSArPSBuOworCQlsZW4gIC09IG47CisJCX0KKworCWlmIChsZW4gIT0gMCkKKwkJeworCQlwID0gKHVuc2lnbmVkIGNoYXIgKiljLT5kYXRhOworCQljLT5udW0gPSAodW5zaWduZWQgaW50KWxlbjsKKwkJbWVtY3B5IChwLGRhdGEsbGVuKTsKKwkJfQorCXJldHVybiAxOworCX0KKworCit2b2lkIEhBU0hfVFJBTlNGT1JNIChIQVNIX0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKKwl7CisJSEFTSF9CTE9DS19EQVRBX09SREVSIChjLGRhdGEsMSk7CisJfQorCisKK2ludCBIQVNIX0ZJTkFMICh1bnNpZ25lZCBjaGFyICptZCwgSEFTSF9DVFggKmMpCisJeworCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKWMtPmRhdGE7CisJc2l6ZV90IG4gPSBjLT5udW07CisKKwlwW25dID0gMHg4MDsgLyogdGhlcmUgaXMgYWx3YXlzIHJvb20gZm9yIG9uZSAqLworCW4rKzsKKworCWlmIChuID4gKEhBU0hfQ0JMT0NLLTgpKQorCQl7CisJCW1lbXNldCAocCtuLDAsSEFTSF9DQkxPQ0stbik7CisJCW49MDsKKwkJSEFTSF9CTE9DS19EQVRBX09SREVSIChjLHAsMSk7CisJCX0KKwltZW1zZXQgKHArbiwwLEhBU0hfQ0JMT0NLLTgtbik7CisKKwlwICs9IEhBU0hfQ0JMT0NLLTg7CisjaWYgICBkZWZpbmVkKERBVEFfT1JERVJfSVNfQklHX0VORElBTikKKwkodm9pZClIT1NUX2wyYyhjLT5OaCxwKTsKKwkodm9pZClIT1NUX2wyYyhjLT5ObCxwKTsKKyNlbGlmIGRlZmluZWQoREFUQV9PUkRFUl9JU19MSVRUTEVfRU5ESUFOKQorCSh2b2lkKUhPU1RfbDJjKGMtPk5sLHApOworCSh2b2lkKUhPU1RfbDJjKGMtPk5oLHApOworI2VuZGlmCisJcCAtPSBIQVNIX0NCTE9DSzsKKwlIQVNIX0JMT0NLX0RBVEFfT1JERVIgKGMscCwxKTsKKwljLT5udW09MDsKKwltZW1zZXQgKHAsMCxIQVNIX0NCTE9DSyk7CisKKyNpZm5kZWYgSEFTSF9NQUtFX1NUUklORworI2Vycm9yICJIQVNIX01BS0VfU1RSSU5HIG11c3QgYmUgZGVmaW5lZCEiCisjZWxzZQorCUhBU0hfTUFLRV9TVFJJTkcoYyxtZCk7CisjZW5kaWYKKworCXJldHVybiAxOworCX0KKworI2lmbmRlZiBNRDMyX1JFR19UCisjZGVmaW5lIE1EMzJfUkVHX1QgbG9uZworLyoKKyAqIFRoaXMgY29tbWVudCB3YXMgb3JpZ2luYWx5IHdyaXR0ZW4gZm9yIE1ENSwgd2hpY2ggaXMgd2h5IGl0CisgKiBkaXNjdXNzZXMgQS1ELiBCdXQgaXQgYmFzaWNhbGx5IGFwcGxpZXMgdG8gYWxsIDMyLWJpdCBkaWdlc3RzLAorICogd2hpY2ggaXMgd2h5IGl0IHdhcyBtb3ZlZCB0byBjb21tb24gaGVhZGVyIGZpbGUuCisgKgorICogSW4gY2FzZSB5b3Ugd29uZGVyIHdoeSBBLUQgYXJlIGRlY2xhcmVkIGFzIGxvbmcgYW5kIG5vdAorICogYXMgTUQ1X0xPTkcuIERvaW5nIHNvIHJlc3VsdHMgaW4gc2xpZ2h0IHBlcmZvcm1hbmNlCisgKiBib29zdCBvbiBMUDY0IGFyY2hpdGVjdHVyZXMuIFRoZSBjYXRjaCBpcyB3ZSBkb24ndAorICogcmVhbGx5IGNhcmUgaWYgMzIgTVNCcyBvZiBhIDY0LWJpdCByZWdpc3RlciBnZXQgcG9sbHV0ZWQKKyAqIHdpdGggZXZlbnR1YWwgb3ZlcmZsb3dzIGFzIHdlICpzYXZlKiBvbmx5IDMyIExTQnMgaW4KKyAqICplaXRoZXIqIGNhc2UuIE5vdyBkZWNsYXJpbmcgJ2VtIGxvbmcgZXhjdXNlcyB0aGUgY29tcGlsZXIKKyAqIGZyb20ga2VlcGluZyAzMiBNU0JzIHplcm9lZCByZXN1bHRpbmcgaW4gMTMlIHBlcmZvcm1hbmNlCisgKiBpbXByb3ZlbWVudCB1bmRlciBTUEFSQyBTb2xhcmlzNy82NCBhbmQgNSUgdW5kZXIgQWxwaGFMaW51eC4KKyAqIFdlbGwsIHRvIGJlIGhvbmVzdCBpdCBzaG91bGQgc2F5IHRoYXQgdGhpcyAqcHJldmVudHMqIAorICogcGVyZm9ybWFuY2UgZGVncmFkYXRpb24uCisgKgkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgKiBBcHBhcmVudGx5IHRoZXJlJ3JlIExQNjQgY29tcGlsZXJzIHRoYXQgZ2VuZXJhdGUgYmV0dGVyCisgKiBjb2RlIGlmIEEtRCBhcmUgZGVjbGFyZWQgaW50LiBNb3N0IG5vdGFibHkgR0NDLXg4Nl82NAorICogZ2VuZXJhdGVzIGJldHRlciBjb2RlLgorICoJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDQvbWQ0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ0L21kNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MTQxNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ0L21kNC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiBjcnlwdG8vbWQ0L21kNC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ0Lmg+CisKKyNkZWZpbmUgQlVGU0laRQkxMDI0KjE2CisKK3ZvaWQgZG9fZnAoRklMRSAqZik7Cit2b2lkIHB0KHVuc2lnbmVkIGNoYXIgKm1kKTsKKyNpZiAhZGVmaW5lZChfT1NEX1BPU0lYKSAmJiAhZGVmaW5lZChfX0RKR1BQX18pCitpbnQgcmVhZChpbnQsIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCWludCBpLGVycj0wOworCUZJTEUgKklOOworCisJaWYgKGFyZ2MgPT0gMSkKKwkJeworCQlkb19mcChzdGRpbik7CisJCX0KKwllbHNlCisJCXsKKwkJZm9yIChpPTE7IGk8YXJnYzsgaSsrKQorCQkJeworCQkJSU49Zm9wZW4oYXJndltpXSwiciIpOworCQkJaWYgKElOID09IE5VTEwpCisJCQkJeworCQkJCXBlcnJvcihhcmd2W2ldKTsKKwkJCQllcnIrKzsKKwkJCQljb250aW51ZTsKKwkJCQl9CisJCQlwcmludGYoIk1ENCglcyk9ICIsYXJndltpXSk7CisJCQlkb19mcChJTik7CisJCQlmY2xvc2UoSU4pOworCQkJfQorCQl9CisJZXhpdChlcnIpOworCX0KKwordm9pZCBkb19mcChGSUxFICpmKQorCXsKKwlNRDRfQ1RYIGM7CisJdW5zaWduZWQgY2hhciBtZFtNRDRfRElHRVNUX0xFTkdUSF07CisJaW50IGZkOworCWludCBpOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFXTsKKworCWZkPWZpbGVubyhmKTsKKwlNRDRfSW5pdCgmYyk7CisJZm9yICg7OykKKwkJeworCQlpPXJlYWQoZmQsYnVmLHNpemVvZiBidWYpOworCQlpZiAoaSA8PSAwKSBicmVhazsKKwkJTUQ0X1VwZGF0ZSgmYyxidWYsKHVuc2lnbmVkIGxvbmcpaSk7CisJCX0KKwlNRDRfRmluYWwoJihtZFswXSksJmMpOworCXB0KG1kKTsKKwl9CisKK3ZvaWQgcHQodW5zaWduZWQgY2hhciAqbWQpCisJeworCWludCBpOworCisJZm9yIChpPTA7IGk8TUQ0X0RJR0VTVF9MRU5HVEg7IGkrKykKKwkJcHJpbnRmKCIlMDJ4IixtZFtpXSk7CisJcHJpbnRmKCJcbiIpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21kNC9tZDQuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDQvbWQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlZDliMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDQvbWQ0LmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qIGNyeXB0by9tZDQvbWQ0LmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfTUQ0X0gKKyNkZWZpbmUgSEVBREVSX01ENF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX05PX01ENAorI2Vycm9yIE1ENCBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisvKgorICogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqICEgTUQ0X0xPTkcgaGFzIHRvIGJlIGF0IGxlYXN0IDMyIGJpdHMgd2lkZS4gSWYgaXQncyB3aWRlciwgdGhlbiAhCisgKiAhIE1ENF9MT05HX0xPRzIgaGFzIHRvIGJlIGRlZmluZWQgYWxvbmcuCQkJICAgIQorICogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqLworCisjaWYgZGVmaW5lZChfX0xQMzJfXykKKyNkZWZpbmUgTUQ0X0xPTkcgdW5zaWduZWQgbG9uZworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19DUkFZKSB8fCBkZWZpbmVkKF9fSUxQNjRfXykKKyNkZWZpbmUgTUQ0X0xPTkcgdW5zaWduZWQgbG9uZworI2RlZmluZSBNRDRfTE9OR19MT0cyIDMKKy8qCisgKiBfQ1JBWSBub3RlLiBJIGNvdWxkIGRlY2xhcmUgc2hvcnQsIGJ1dCBJIGhhdmUgbm8gaWRlYSB3aGF0IGltcGFjdAorICogZG9lcyBpdCBoYXZlIG9uIHBlcmZvcm1hbmNlIG9uIG5vbmUtVDNFIG1hY2hpbmVzLiBJIGNvdWxkIGRlY2xhcmUKKyAqIGludCwgYnV0IGF0IGxlYXN0IG9uIEM5MCBzaXplb2YoaW50KSBjYW4gYmUgY2hvc2VuIGF0IGNvbXBpbGUgdGltZS4KKyAqIFNvIEkndmUgY2hvc2VuIGxvbmcuLi4KKyAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgKi8KKyNlbHNlCisjZGVmaW5lIE1ENF9MT05HIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNkZWZpbmUgTUQ0X0NCTE9DSwk2NAorI2RlZmluZSBNRDRfTEJMT0NLCShNRDRfQ0JMT0NLLzQpCisjZGVmaW5lIE1ENF9ESUdFU1RfTEVOR1RIIDE2CisKK3R5cGVkZWYgc3RydWN0IE1ENHN0YXRlX3N0CisJeworCU1ENF9MT05HIEEsQixDLEQ7CisJTUQ0X0xPTkcgTmwsTmg7CisJTUQ0X0xPTkcgZGF0YVtNRDRfTEJMT0NLXTsKKwl1bnNpZ25lZCBpbnQgbnVtOworCX0gTUQ0X0NUWDsKKworaW50IE1ENF9Jbml0KE1ENF9DVFggKmMpOworaW50IE1ENF9VcGRhdGUoTUQ0X0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgTUQ0X0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBNRDRfQ1RYICpjKTsKK3Vuc2lnbmVkIGNoYXIgKk1ENChjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwgdW5zaWduZWQgY2hhciAqbWQpOwordm9pZCBNRDRfVHJhbnNmb3JtKE1ENF9DVFggKmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIpOworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21kNC9tZDRfZGdzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNC9tZDRfZGdzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzQyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ0L21kNF9kZ3N0LmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qIGNyeXB0by9tZDQvbWQ0X2Rnc3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJtZDRfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KKworY29uc3QgY2hhciBNRDRfdmVyc2lvbltdPSJNRDQiIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworLyogSW1wbGVtZW50ZWQgZnJvbSBSRkMxMTg2IFRoZSBNRDQgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtCisgKi8KKworI2RlZmluZSBJTklUX0RBVEFfQSAodW5zaWduZWQgbG9uZykweDY3NDUyMzAxTAorI2RlZmluZSBJTklUX0RBVEFfQiAodW5zaWduZWQgbG9uZykweGVmY2RhYjg5TAorI2RlZmluZSBJTklUX0RBVEFfQyAodW5zaWduZWQgbG9uZykweDk4YmFkY2ZlTAorI2RlZmluZSBJTklUX0RBVEFfRCAodW5zaWduZWQgbG9uZykweDEwMzI1NDc2TAorCitpbnQgTUQ0X0luaXQoTUQ0X0NUWCAqYykKKwl7CisJbWVtc2V0IChjLDAsc2l6ZW9mKCpjKSk7CisJYy0+QT1JTklUX0RBVEFfQTsKKwljLT5CPUlOSVRfREFUQV9COworCWMtPkM9SU5JVF9EQVRBX0M7CisJYy0+RD1JTklUX0RBVEFfRDsKKwlyZXR1cm4gMTsKKwl9CisKKyNpZm5kZWYgbWQ0X2Jsb2NrX2RhdGFfb3JkZXIKKyNpZmRlZiBYCisjdW5kZWYgWAorI2VuZGlmCit2b2lkIG1kNF9ibG9ja19kYXRhX29yZGVyIChNRDRfQ1RYICpjLCBjb25zdCB2b2lkICpkYXRhXywgc2l6ZV90IG51bSkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YT1kYXRhXzsKKwlyZWdpc3RlciB1bnNpZ25lZCBNRDMyX1JFR19UIEEsQixDLEQsbDsKKyNpZm5kZWYgTUQzMl9YQVJSQVkKKwkvKiBTZWUgY29tbWVudCBpbiBjcnlwdG8vc2hhL3NoYV9sb2NsLmggZm9yIGRldGFpbHMuICovCisJdW5zaWduZWQgTUQzMl9SRUdfVAlYWDAsIFhYMSwgWFgyLCBYWDMsIFhYNCwgWFg1LCBYWDYsIFhYNywKKwkJCQlYWDgsIFhYOSxYWDEwLFhYMTEsWFgxMixYWDEzLFhYMTQsWFgxNTsKKyMgZGVmaW5lIFgoaSkJWFgjI2kKKyNlbHNlCisJTUQ0X0xPTkcgWFhbTUQ0X0xCTE9DS107CisjIGRlZmluZSBYKGkpCVhYW2ldCisjZW5kaWYKKworCUE9Yy0+QTsKKwlCPWMtPkI7CisJQz1jLT5DOworCUQ9Yy0+RDsKKworCWZvciAoO251bS0tOykKKwkJeworCUhPU1RfYzJsKGRhdGEsbCk7IFgoIDApPWw7CQlIT1NUX2MybChkYXRhLGwpOyBYKCAxKT1sOworCS8qIFJvdW5kIDAgKi8KKwlSMChBLEIsQyxELFgoIDApLCAzLDApOwlIT1NUX2MybChkYXRhLGwpOyBYKCAyKT1sOworCVIwKEQsQSxCLEMsWCggMSksIDcsMCk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDMpPWw7CisJUjAoQyxELEEsQixYKCAyKSwxMSwwKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggNCk9bDsKKwlSMChCLEMsRCxBLFgoIDMpLDE5LDApOwlIT1NUX2MybChkYXRhLGwpOyBYKCA1KT1sOworCVIwKEEsQixDLEQsWCggNCksIDMsMCk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDYpPWw7CisJUjAoRCxBLEIsQyxYKCA1KSwgNywwKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggNyk9bDsKKwlSMChDLEQsQSxCLFgoIDYpLDExLDApOwlIT1NUX2MybChkYXRhLGwpOyBYKCA4KT1sOworCVIwKEIsQyxELEEsWCggNyksMTksMCk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDkpPWw7CisJUjAoQSxCLEMsRCxYKCA4KSwgMywwKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxMCk9bDsKKwlSMChELEEsQixDLFgoIDkpLCA3LDApOwlIT1NUX2MybChkYXRhLGwpOyBYKDExKT1sOworCVIwKEMsRCxBLEIsWCgxMCksMTEsMCk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoMTIpPWw7CisJUjAoQixDLEQsQSxYKDExKSwxOSwwKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxMyk9bDsKKwlSMChBLEIsQyxELFgoMTIpLCAzLDApOwlIT1NUX2MybChkYXRhLGwpOyBYKDE0KT1sOworCVIwKEQsQSxCLEMsWCgxMyksIDcsMCk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoMTUpPWw7CisJUjAoQyxELEEsQixYKDE0KSwxMSwwKTsKKwlSMChCLEMsRCxBLFgoMTUpLDE5LDApOworCS8qIFJvdW5kIDEgKi8KKwlSMShBLEIsQyxELFgoIDApLCAzLDB4NUE4Mjc5OTlMKTsKKwlSMShELEEsQixDLFgoIDQpLCA1LDB4NUE4Mjc5OTlMKTsKKwlSMShDLEQsQSxCLFgoIDgpLCA5LDB4NUE4Mjc5OTlMKTsKKwlSMShCLEMsRCxBLFgoMTIpLDEzLDB4NUE4Mjc5OTlMKTsKKwlSMShBLEIsQyxELFgoIDEpLCAzLDB4NUE4Mjc5OTlMKTsKKwlSMShELEEsQixDLFgoIDUpLCA1LDB4NUE4Mjc5OTlMKTsKKwlSMShDLEQsQSxCLFgoIDkpLCA5LDB4NUE4Mjc5OTlMKTsKKwlSMShCLEMsRCxBLFgoMTMpLDEzLDB4NUE4Mjc5OTlMKTsKKwlSMShBLEIsQyxELFgoIDIpLCAzLDB4NUE4Mjc5OTlMKTsKKwlSMShELEEsQixDLFgoIDYpLCA1LDB4NUE4Mjc5OTlMKTsKKwlSMShDLEQsQSxCLFgoMTApLCA5LDB4NUE4Mjc5OTlMKTsKKwlSMShCLEMsRCxBLFgoMTQpLDEzLDB4NUE4Mjc5OTlMKTsKKwlSMShBLEIsQyxELFgoIDMpLCAzLDB4NUE4Mjc5OTlMKTsKKwlSMShELEEsQixDLFgoIDcpLCA1LDB4NUE4Mjc5OTlMKTsKKwlSMShDLEQsQSxCLFgoMTEpLCA5LDB4NUE4Mjc5OTlMKTsKKwlSMShCLEMsRCxBLFgoMTUpLDEzLDB4NUE4Mjc5OTlMKTsKKwkvKiBSb3VuZCAyICovCisJUjIoQSxCLEMsRCxYKCAwKSwgMywweDZFRDlFQkExTCk7CisJUjIoRCxBLEIsQyxYKCA4KSwgOSwweDZFRDlFQkExTCk7CisJUjIoQyxELEEsQixYKCA0KSwxMSwweDZFRDlFQkExTCk7CisJUjIoQixDLEQsQSxYKDEyKSwxNSwweDZFRDlFQkExTCk7CisJUjIoQSxCLEMsRCxYKCAyKSwgMywweDZFRDlFQkExTCk7CisJUjIoRCxBLEIsQyxYKDEwKSwgOSwweDZFRDlFQkExTCk7CisJUjIoQyxELEEsQixYKCA2KSwxMSwweDZFRDlFQkExTCk7CisJUjIoQixDLEQsQSxYKDE0KSwxNSwweDZFRDlFQkExTCk7CisJUjIoQSxCLEMsRCxYKCAxKSwgMywweDZFRDlFQkExTCk7CisJUjIoRCxBLEIsQyxYKCA5KSwgOSwweDZFRDlFQkExTCk7CisJUjIoQyxELEEsQixYKCA1KSwxMSwweDZFRDlFQkExTCk7CisJUjIoQixDLEQsQSxYKDEzKSwxNSwweDZFRDlFQkExTCk7CisJUjIoQSxCLEMsRCxYKCAzKSwgMywweDZFRDlFQkExTCk7CisJUjIoRCxBLEIsQyxYKDExKSwgOSwweDZFRDlFQkExTCk7CisJUjIoQyxELEEsQixYKCA3KSwxMSwweDZFRDlFQkExTCk7CisJUjIoQixDLEQsQSxYKDE1KSwxNSwweDZFRDlFQkExTCk7CisKKwlBID0gYy0+QSArPSBBOworCUIgPSBjLT5CICs9IEI7CisJQyA9IGMtPkMgKz0gQzsKKwlEID0gYy0+RCArPSBEOworCQl9CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbWQ0L21kNF9sb2NsLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ0L21kNF9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwODViMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDQvbWQ0X2xvY2wuaApAQCAtMCwwICsxLDExMiBAQAorLyogY3J5cHRvL21kNC9tZDRfbG9jbC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDQuaD4KKworI2lmbmRlZiBNRDRfTE9OR19MT0cyCisjZGVmaW5lIE1ENF9MT05HX0xPRzIgMiAvKiBkZWZhdWx0IHRvIDMyIGJpdHMgKi8KKyNlbmRpZgorCit2b2lkIG1kNF9ibG9ja19kYXRhX29yZGVyIChNRDRfQ1RYICpjLCBjb25zdCB2b2lkICpwLHNpemVfdCBudW0pOworCisjZGVmaW5lIERBVEFfT1JERVJfSVNfTElUVExFX0VORElBTgorCisjZGVmaW5lIEhBU0hfTE9ORwkJTUQ0X0xPTkcKKyNkZWZpbmUgSEFTSF9DVFgJCU1ENF9DVFgKKyNkZWZpbmUgSEFTSF9DQkxPQ0sJCU1ENF9DQkxPQ0sKKyNkZWZpbmUgSEFTSF9VUERBVEUJCU1ENF9VcGRhdGUKKyNkZWZpbmUgSEFTSF9UUkFOU0ZPUk0JCU1ENF9UcmFuc2Zvcm0KKyNkZWZpbmUgSEFTSF9GSU5BTAkJTUQ0X0ZpbmFsCisjZGVmaW5lCUhBU0hfTUFLRV9TVFJJTkcoYyxzKQlkbyB7CVwKKwl1bnNpZ25lZCBsb25nIGxsOwkJXAorCWxsPShjKS0+QTsgSE9TVF9sMmMobGwsKHMpKTsJXAorCWxsPShjKS0+QjsgSE9TVF9sMmMobGwsKHMpKTsJXAorCWxsPShjKS0+QzsgSE9TVF9sMmMobGwsKHMpKTsJXAorCWxsPShjKS0+RDsgSE9TVF9sMmMobGwsKHMpKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lCUhBU0hfQkxPQ0tfREFUQV9PUkRFUgltZDRfYmxvY2tfZGF0YV9vcmRlcgorCisjaW5jbHVkZSAibWQzMl9jb21tb24uaCIKKworLyoKKyNkZWZpbmUJRih4LHkseikJKCgoeCkgJiAoeSkpICB8ICAoKH4oeCkpICYgKHopKSkKKyNkZWZpbmUJRyh4LHkseikJKCgoeCkgJiAoeSkpICB8ICAoKHgpICYgKCh6KSkpIHwgKCh5KSAmICgoeikpKSkKKyovCisKKy8qIEFzIHBvaW50ZWQgb3V0IGJ5IFdlaSBEYWkgPHdlaWRhaUBlc2tpbW8uY29tPiwgdGhlIGFib3ZlIGNhbiBiZQorICogc2ltcGxpZmllZCB0byB0aGUgY29kZSBiZWxvdy4gIFdlaSBhdHRyaWJ1dGVzIHRoZXNlIG9wdGltaXphdGlvbnMKKyAqIHRvIFBldGVyIEd1dG1hbm4ncyBTSFMgY29kZSwgYW5kIGhlIGF0dHJpYnV0ZXMgaXQgdG8gUmljaCBTY2hyb2VwcGVsLgorICovCisjZGVmaW5lCUYoYixjLGQpCSgoKChjKSBeIChkKSkgJiAoYikpIF4gKGQpKQorI2RlZmluZSBHKGIsYyxkKQkoKChiKSAmIChjKSkgfCAoKGIpICYgKGQpKSB8ICgoYykgJiAoZCkpKQorI2RlZmluZQlIKGIsYyxkKQkoKGIpIF4gKGMpIF4gKGQpKQorCisjZGVmaW5lIFIwKGEsYixjLGQsayxzLHQpIHsgXAorCWErPSgoaykrKHQpK0YoKGIpLChjKSwoZCkpKTsgXAorCWE9Uk9UQVRFKGEscyk7IH07CisKKyNkZWZpbmUgUjEoYSxiLGMsZCxrLHMsdCkgeyBcCisJYSs9KChrKSsodCkrRygoYiksKGMpLChkKSkpOyBcCisJYT1ST1RBVEUoYSxzKTsgfTtcCisKKyNkZWZpbmUgUjIoYSxiLGMsZCxrLHMsdCkgeyBcCisJYSs9KChrKSsodCkrSCgoYiksKGMpLChkKSkpOyBcCisJYT1ST1RBVEUoYSxzKTsgfTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDQvbWQ0X29uZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNC9tZDRfb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2NDM2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDQvbWQ0X29uZS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIGNyeXB0by9tZDQvbWQ0X29uZS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKworI2lmZGVmIENIQVJTRVRfRUJDRElDCisjaW5jbHVkZSA8b3BlbnNzbC9lYmNkaWMuaD4KKyNlbmRpZgorCit1bnNpZ25lZCBjaGFyICpNRDQoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sIHVuc2lnbmVkIGNoYXIgKm1kKQorCXsKKwlNRDRfQ1RYIGM7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbVtNRDRfRElHRVNUX0xFTkdUSF07CisKKwlpZiAobWQgPT0gTlVMTCkgbWQ9bTsKKwlpZiAoIU1ENF9Jbml0KCZjKSkKKwkJcmV0dXJuIE5VTEw7CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJTUQ0X1VwZGF0ZSgmYyxkLG4pOworI2Vsc2UKKwl7CisJCWNoYXIgdGVtcFsxMDI0XTsKKwkJdW5zaWduZWQgbG9uZyBjaHVuazsKKworCQl3aGlsZSAobiA+IDApCisJCXsKKwkJCWNodW5rID0gKG4gPiBzaXplb2YodGVtcCkpID8gc2l6ZW9mKHRlbXApIDogbjsKKwkJCWViY2RpYzJhc2NpaSh0ZW1wLCBkLCBjaHVuayk7CisJCQlNRDRfVXBkYXRlKCZjLHRlbXAsY2h1bmspOworCQkJbiAtPSBjaHVuazsKKwkJCWQgKz0gY2h1bms7CisJCX0KKwl9CisjZW5kaWYKKwlNRDRfRmluYWwobWQsJmMpOworCU9QRU5TU0xfY2xlYW5zZSgmYyxzaXplb2YoYykpOyAvKiBzZWN1cml0eSBjb25zaWRlcmF0aW9uICovCisJcmV0dXJuKG1kKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDQvbWQ0cy5jcHAgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ0L21kNHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZWM5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ0L21kNHMuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8vCisvLyBnZXR0c2MuaW5sCisvLworLy8gZ2l2ZXMgYWNjZXNzIHRvIHRoZSBQZW50aXVtJ3MgKHNlY3JldCkgY3ljbGUgY291bnRlcgorLy8KKy8vIFRoaXMgc29mdHdhcmUgd2FzIHdyaXR0ZW4gYnkgTGVvbmFyZCBKYW5rZSAoamFua2VAdW5peGcudWJjLmNhKQorLy8gaW4gMTk5Ni03IGFuZCBpcyBlbnRlcmVkLCBieSBoaW0sIGludG8gdGhlIHB1YmxpYyBkb21haW4uCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQordm9pZCBHZXRUU0ModW5zaWduZWQgbG9uZyYpOworI3ByYWdtYSBhdXggR2V0VFNDID0gMHgwZiAweDMxICJtb3YgW2VkaV0sIGVheCIgcGFybSBbZWRpXSBtb2RpZnkgW2VkeCBlYXhdOworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKK2lubGluZQordm9pZCBHZXRUU0ModW5zaWduZWQgbG9uZyYgdHNjKQoreworICBhc20gdm9sYXRpbGUoIi5ieXRlIDE1LCA0OVxuXHQiCisJICAgICAgIDogIj1lYXgiICh0c2MpCisJICAgICAgIDoKKwkgICAgICAgOiAiJWVkeCIsICIlZWF4Iik7Cit9CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQoraW5saW5lCit2b2lkIEdldFRTQyh1bnNpZ25lZCBsb25nJiB0c2MpCit7CisgIHVuc2lnbmVkIGxvbmcgYTsKKyAgX19hc20gX2VtaXQgMGZoCisgIF9fYXNtIF9lbWl0IDMxaAorICBfX2FzbSBtb3YgYSwgZWF4OworICB0c2M9YTsKK30KKyNlbmRpZiAgICAgIAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNC5oPgorCitleHRlcm4gIkMiIHsKK3ZvaWQgbWQ0X2Jsb2NrX3g4NihNRDRfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcixpbnQgbnVtKTsKK30KKwordm9pZCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKKwl7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNjQqMjU2XTsKKwlNRDRfQ1RYIGN0eDsKKwl1bnNpZ25lZCBsb25nIHMxLHMyLGUxLGUyOworCXVuc2lnbmVkIGNoYXIga1sxNl07CisJdW5zaWduZWQgbG9uZyBkYXRhWzJdOworCXVuc2lnbmVkIGNoYXIgaXZbOF07CisJaW50IGksbnVtPTAsbnVtbTsKKwlpbnQgaj0wOworCisJaWYgKGFyZ2MgPj0gMikKKwkJbnVtPWF0b2koYXJndlsxXSk7CisKKwlpZiAobnVtID09IDApIG51bT0xNjsKKwlpZiAobnVtID4gMjUwKSBudW09MTY7CisJbnVtbT1udW0rMjsKKwludW0qPTY0OworCW51bW0qPTY0OworCisJZm9yIChqPTA7IGo8NjsgaisrKQorCQl7CisJCWZvciAoaT0wOyBpPDEwOyBpKyspIC8qKi8KKwkJCXsKKwkJCW1kNF9ibG9ja194ODYoJmN0eCxidWZmZXIsbnVtbSk7CisJCQlHZXRUU0MoczEpOworCQkJbWQ0X2Jsb2NrX3g4NigmY3R4LGJ1ZmZlcixudW1tKTsKKwkJCUdldFRTQyhlMSk7CisJCQlHZXRUU0MoczIpOworCQkJbWQ0X2Jsb2NrX3g4NigmY3R4LGJ1ZmZlcixudW0pOworCQkJR2V0VFNDKGUyKTsKKwkJCW1kNF9ibG9ja194ODYoJmN0eCxidWZmZXIsbnVtKTsKKwkJCX0KKwkJcHJpbnRmKCJtZDQgKCVkIGJ5dGVzKSAlZCAlZCAoJS4yZilcbiIsbnVtLAorCQkJZTEtczEsZTItczIsKGRvdWJsZSkoKGUxLXMxKS0oZTItczIpKS8yKTsKKwkJfQorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21kNC9tZDR0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ0L21kNHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU5MTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNC9tZDR0ZXN0LmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIGNyeXB0by9tZDQvbWQ0dGVzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiLi4vZV9vcy5oIgorCisjaWZkZWYgT1BFTlNTTF9OT19NRDQKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcHJpbnRmKCJObyBNRDQgc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ0Lmg+CisKK3N0YXRpYyBjaGFyICp0ZXN0W109eworCSIiLAorCSJhIiwKKwkiYWJjIiwKKwkibWVzc2FnZSBkaWdlc3QiLAorCSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCisJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiwKKwkiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCU5VTEwsCisJfTsKKworc3RhdGljIGNoYXIgKnJldFtdPXsKKyIzMWQ2Y2ZlMGQxNmFlOTMxYjczYzU5ZDdlMGMwODljMCIsCisiYmRlNTJjYjMxZGUzM2U0NjI0NWUwNWZiZGJkNmZiMjQiLAorImE0NDgwMTdhYWYyMWQ4NTI1ZmMxMGFlODdhYTY3MjlkIiwKKyJkOTEzMGE4MTY0NTQ5ZmU4MTg4NzQ4MDZlMWM3MDE0YiIsCisiZDc5ZTFjMzA4YWE1YmJjZGVlYThlZDYzZGY0MTJkYTkiLAorIjA0M2Y4NTgyZjI0MWRiMzUxY2U2MjdlMTUzZTdmMGU0IiwKKyJlMzNiNGRkYzljMzhmMjE5OWMzZTdiMTY0ZmNjMDUzNiIsCit9OworCitzdGF0aWMgY2hhciAqcHQodW5zaWduZWQgY2hhciAqbWQpOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKwl7CisJaW50IGksZXJyPTA7CisJY2hhciAqKlAsKipSOworCWNoYXIgKnA7CisJdW5zaWduZWQgY2hhciBtZFtNRDRfRElHRVNUX0xFTkdUSF07CisKKwlQPXRlc3Q7CisJUj1yZXQ7CisJaT0xOworCXdoaWxlICgqUCAhPSBOVUxMKQorCQl7CisJCUVWUF9EaWdlc3QoJihQWzBdWzBdKSxzdHJsZW4oKGNoYXIgKikqUCksbWQsTlVMTCxFVlBfbWQ0KCksIE5VTEwpOworCQlwPXB0KG1kKTsKKwkJaWYgKHN0cmNtcChwLChjaGFyICopKlIpICE9IDApCisJCQl7CisJCQlwcmludGYoImVycm9yIGNhbGN1bGF0aW5nIE1ENCBvbiAnJXMnXG4iLCpQKTsKKwkJCXByaW50ZigiZ290ICVzIGluc3RlYWQgb2YgJXNcbiIscCwqUik7CisJCQllcnIrKzsKKwkJCX0KKwkJZWxzZQorCQkJcHJpbnRmKCJ0ZXN0ICVkIG9rXG4iLGkpOworCQlpKys7CisJCVIrKzsKKwkJUCsrOworCQl9CisJRVhJVChlcnIpOworCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyBjaGFyICpwdCh1bnNpZ25lZCBjaGFyICptZCkKKwl7CisJaW50IGk7CisJc3RhdGljIGNoYXIgYnVmWzgwXTsKKworCWZvciAoaT0wOyBpPE1ENF9ESUdFU1RfTEVOR1RIOyBpKyspCisJCXNwcmludGYoJihidWZbaSoyXSksIiUwMngiLG1kW2ldKTsKKwlyZXR1cm4oYnVmKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvYXNtL21kNS01ODYucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L2FzbS9tZDUtNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYjY2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L2FzbS9tZDUtNTg2LnBsCkBAIC0wLDAgKzEsMzA3IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworIyBOb3JtYWwgaXMgdGhlCisjIG1kNV9ibG9ja194ODYoTUQ1X0NUWCAqYywgVUxPTkcgKlgpOworIyB2ZXJzaW9uLCBub24tbm9ybWFsIGlzIHRoZQorIyBtZDVfYmxvY2tfeDg2KE1ENV9DVFggKmMsIFVMT05HICpYLGludCBibG9ja3MpOworCiskbm9ybWFsPTA7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwkMCk7CisKKyRBPSJlYXgiOworJEI9ImVieCI7CiskQz0iZWN4IjsKKyREPSJlZHgiOworJHRtcDE9ImVkaSI7CiskdG1wMj0iZWJwIjsKKyRYPSJlc2kiOworCisjIFdoYXQgd2UgbmVlZCB0byBsb2FkIGludG8gJHRtcCBmb3IgdGhlIG5leHQgcm91bmQKKyVMdG1wMT0oIlIwIiwmTnAoJEMpLCAiUjEiLCZOcCgkQyksICJSMiIsJk5wKCRDKSwgIlIzIiwmTnAoJEQpKTsKK0B4bz0oCisgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwJIyBSMAorIDEsIDYsIDExLCAwLCA1LCAxMCwgMTUsIDQsIDksIDE0LCAzLCA4LCAxMywgMiwgNywgMTIsCSMgUjEKKyA1LCA4LCAxMSwgMTQsIDEsIDQsIDcsIDEwLCAxMywgMCwgMywgNiwgOSwgMTIsIDE1LCAyLAkjIFIyCisgMCwgNywgMTQsIDUsIDEyLCAzLCAxMCwgMSwgOCwgMTUsIDYsIDEzLCA0LCAxMSwgMiwgOSwJIyBSMworICk7CisKKyZtZDVfYmxvY2soIm1kNV9ibG9ja19hc21fZGF0YV9vcmRlciIpOworJmFzbV9maW5pc2goKTsKKworc3ViIE5wCisJeworCWxvY2FsKCRwKT1AXzsKKwlsb2NhbCglbik9KCRBLCRELCRCLCRBLCRDLCRCLCRELCRDKTsKKwlyZXR1cm4oJG57JHB9KTsKKwl9CisKK3N1YiBSMAorCXsKKwlsb2NhbCgkcG9zLCRhLCRiLCRjLCRkLCRLLCRraSwkcywkdCk9QF87CisKKwkmbW92KCR0bXAxLCRDKSAgaWYgJHBvcyA8IDA7CisJJm1vdigkdG1wMiwmRFdQKCR4b1ska2ldKjQsJEssIiIsMCkpIGlmICRwb3MgPCAwOyAjIHZlcnkgZmlyc3Qgb25lIAorCisJIyBib2R5IHByb3BlcgorCisJJmNvbW1lbnQoIlIwICRraSIpOworCSZ4b3IoJHRtcDEsJGQpOyAjIEYgZnVuY3Rpb24gLSBwYXJ0IDIKKworCSZhbmQoJHRtcDEsJGIpOyAjIEYgZnVuY3Rpb24gLSBwYXJ0IDMKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJnhvcigkdG1wMSwkZCk7ICMgRiBmdW5jdGlvbiAtIHBhcnQgNAorCisJJmFkZCgkYSwkdG1wMSk7CisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zIDwgMTsJIyBuZXh0IHRtcDEgZm9yIFIwCisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zID09IDE7CSMgbmV4dCB0bXAxIGZvciBSMQorCisJJnJvdGwoJGEsJHMpOworCisJJm1vdigkdG1wMiwmRFdQKCR4b1ska2krMV0qNCwkSywiIiwwKSkgaWYgKCRwb3MgIT0gMik7CisKKwkmYWRkKCRhLCRiKTsKKwl9CisKK3N1YiBSMQorCXsKKwlsb2NhbCgkcG9zLCRhLCRiLCRjLCRkLCRLLCRraSwkcywkdCk9QF87CisKKwkmY29tbWVudCgiUjEgJGtpIik7CisKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJnhvcigkdG1wMSwkYik7ICMgRyBmdW5jdGlvbiAtIHBhcnQgMgorCSZhbmQoJHRtcDEsJGQpOyAjIEcgZnVuY3Rpb24gLSBwYXJ0IDMKKworCSZtb3YoJHRtcDIsJkRXUCgkeG9bJGtpKzFdKjQsJEssIiIsMCkpIGlmICgkcG9zICE9IDIpOworCSZ4b3IoJHRtcDEsJGMpOwkJCSMgRyBmdW5jdGlvbiAtIHBhcnQgNAorCisJJmFkZCgkYSwkdG1wMSk7CisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zIDwgMTsJIyBHIGZ1bmN0aW9uIC0gcGFydCAxCisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zID09IDE7CSMgRyBmdW5jdGlvbiAtIHBhcnQgMQorCisJJnJvdGwoJGEsJHMpOworCisJJmFkZCgkYSwkYik7CisJfQorCitzdWIgUjIKKwl7CisJbG9jYWwoJG4sJHBvcywkYSwkYiwkYywkZCwkSywka2ksJHMsJHQpPUBfOworCSMgVGhpcyBvbmUgaXMgZGlmZmVyZW50LCBvbmx5IDMgbG9naWNhbCBvcGVyYXRpb25zCisKK2lmICgoJG4gJiAxKSA9PSAwKQorCXsKKwkmY29tbWVudCgiUjIgJGtpIik7CisJIyBtYWtlIHN1cmUgdG8gZG8gJ0QnIGZpcnN0LCBub3QgJ0InLCBlbHNlIHdlIGNsYXNoIHdpdGgKKwkjIHRoZSBsYXN0IGFkZCBmcm9tIHRoZSBwcmV2aW91cyByb3VuZC4KKworCSZ4b3IoJHRtcDEsJGQpOyAjIEggZnVuY3Rpb24gLSBwYXJ0IDIKKworCSZ4b3IoJHRtcDEsJGIpOyAjIEggZnVuY3Rpb24gLSBwYXJ0IDMKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJmFkZCgkYSwkdG1wMSk7CisKKwkmcm90bCgkYSwkcyk7CisKKwkmbW92KCR0bXAyLCZEV1AoJHhvWyRraSsxXSo0LCRLLCIiLDApKTsKKwkmbW92KCR0bXAxLCZOcCgkYykpOworCX0KK2Vsc2UKKwl7CisJJmNvbW1lbnQoIlIyICRraSIpOworCSMgbWFrZSBzdXJlIHRvIGRvICdEJyBmaXJzdCwgbm90ICdCJywgZWxzZSB3ZSBjbGFzaCB3aXRoCisJIyB0aGUgbGFzdCBhZGQgZnJvbSB0aGUgcHJldmlvdXMgcm91bmQuCisKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJmFkZCgkYiwkYyk7CQkJIyBNT1ZFRCBGT1JXQVJECisJJnhvcigkdG1wMSwkZCk7ICMgSCBmdW5jdGlvbiAtIHBhcnQgMgorCisJJnhvcigkdG1wMSwkYik7ICMgSCBmdW5jdGlvbiAtIHBhcnQgMworCSZtb3YoJHRtcDIsJkRXUCgkeG9bJGtpKzFdKjQsJEssIiIsMCkpIGlmICgkcG9zICE9IDIpOworCisJJmFkZCgkYSwkdG1wMSk7CisJJm1vdigkdG1wMSwmTnAoJGMpKSBpZiAkcG9zIDwgMTsJIyBIIGZ1bmN0aW9uIC0gcGFydCAxCisJJm1vdigkdG1wMSwtMSkgaWYgJHBvcyA9PSAxOwkJIyBJIGZ1bmN0aW9uIC0gcGFydCAxCisKKwkmcm90bCgkYSwkcyk7CisKKwkmYWRkKCRhLCRiKTsKKwl9CisJfQorCitzdWIgUjMKKwl7CisJbG9jYWwoJHBvcywkYSwkYiwkYywkZCwkSywka2ksJHMsJHQpPUBfOworCisJJmNvbW1lbnQoIlIzICRraSIpOworCisJIyAmbm90KCR0bXAxKQorCSZ4b3IoJHRtcDEsJGQpIGlmICRwb3MgPCAwOyAJIyBJIGZ1bmN0aW9uIC0gcGFydCAyCisKKwkmb3IoJHRtcDEsJGIpOwkJCQkjIEkgZnVuY3Rpb24gLSBwYXJ0IDMKKwkmbGVhKCRhLCZEV1AoJHQsJGEsJHRtcDIsMSkpOworCisJJnhvcigkdG1wMSwkYyk7IAkJCSMgSSBmdW5jdGlvbiAtIHBhcnQgNAorCSZtb3YoJHRtcDIsJkRXUCgkeG9bJGtpKzFdKjQsJEssIiIsMCkpCWlmICRwb3MgIT0gMjsgIyBsb2FkIFgvayB2YWx1ZQorCSZtb3YoJHRtcDIsJndwYXJhbSgwKSkgaWYgJHBvcyA9PSAyOworCisJJmFkZCgkYSwkdG1wMSk7CisJJm1vdigkdG1wMSwtMSkgaWYgJHBvcyA8IDE7CSMgSCBmdW5jdGlvbiAtIHBhcnQgMQorCSZhZGQoJEssNjQpIGlmICRwb3MgPj0xICYmICEkbm9ybWFsOworCisJJnJvdGwoJGEsJHMpOworCisJJnhvcigkdG1wMSwmTnAoJGQpKSBpZiAkcG9zIDw9IDA7IAkjIEkgZnVuY3Rpb24gLSBwYXJ0ID0gZmlyc3QgdGltZQorCSZtb3YoJHRtcDEsJkRXUCggMCwkdG1wMiwiIiwwKSkgaWYgJHBvcyA+IDA7CisJJmFkZCgkYSwkYik7CisJfQorCisKK3N1YiBtZDVfYmxvY2sKKwl7CisJbG9jYWwoJG5hbWUpPUBfOworCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsIiIsMyk7CisKKwkjIHBhcmFtZXRlciAxIGlzIHRoZSBNRDVfQ1RYIHN0cnVjdHVyZS4KKwkjIEEJMAorCSMgQgk0CisJIyBDCTgKKwkjIEQgCTEyCisKKwkmcHVzaCgiZXNpIik7CisJICZwdXNoKCJlZGkiKTsKKwkmbW92KCR0bXAxLAkmd3BhcmFtKDApKTsgIyBlZGkKKwkgJm1vdigkWCwJJndwYXJhbSgxKSk7ICMgZXNpCisJJm1vdigkQywJJndwYXJhbSgyKSk7CisJICZwdXNoKCJlYnAiKTsKKwkmc2hsKCRDLAk2KTsKKwkmcHVzaCgiZWJ4Iik7CisJICZhZGQoJEMsCSRYKTsgIyBvZmZzZXQgd2UgZW5kIGF0CisJJnN1YigkQywJNjQpOworCSAmbW92KCRBLAkmRFdQKCAwLCR0bXAxLCIiLDApKTsKKwkmcHVzaCgkQyk7CSMgUHV0IG9uIHRoZSBUT1MKKwkgJm1vdigkQiwJJkRXUCggNCwkdG1wMSwiIiwwKSk7CisJJm1vdigkQywJJkRXUCggOCwkdG1wMSwiIiwwKSk7CisJICZtb3YoJEQsCSZEV1AoMTIsJHRtcDEsIiIsMCkpOworCisJJnNldF9sYWJlbCgic3RhcnQiKSB1bmxlc3MgJG5vcm1hbDsKKwkmY29tbWVudCgiIik7CisJJmNvbW1lbnQoIlIwIHNlY3Rpb24iKTsKKworCSZSMCgtMiwkQSwkQiwkQywkRCwkWCwgMCwgNywweGQ3NmFhNDc4KTsKKwkmUjAoIDAsJEQsJEEsJEIsJEMsJFgsIDEsMTIsMHhlOGM3Yjc1Nik7CisJJlIwKCAwLCRDLCRELCRBLCRCLCRYLCAyLDE3LDB4MjQyMDcwZGIpOworCSZSMCggMCwkQiwkQywkRCwkQSwkWCwgMywyMiwweGMxYmRjZWVlKTsKKwkmUjAoIDAsJEEsJEIsJEMsJEQsJFgsIDQsIDcsMHhmNTdjMGZhZik7CisJJlIwKCAwLCRELCRBLCRCLCRDLCRYLCA1LDEyLDB4NDc4N2M2MmEpOworCSZSMCggMCwkQywkRCwkQSwkQiwkWCwgNiwxNywweGE4MzA0NjEzKTsKKwkmUjAoIDAsJEIsJEMsJEQsJEEsJFgsIDcsMjIsMHhmZDQ2OTUwMSk7CisJJlIwKCAwLCRBLCRCLCRDLCRELCRYLCA4LCA3LDB4Njk4MDk4ZDgpOworCSZSMCggMCwkRCwkQSwkQiwkQywkWCwgOSwxMiwweDhiNDRmN2FmKTsKKwkmUjAoIDAsJEMsJEQsJEEsJEIsJFgsMTAsMTcsMHhmZmZmNWJiMSk7CisJJlIwKCAwLCRCLCRDLCRELCRBLCRYLDExLDIyLDB4ODk1Y2Q3YmUpOworCSZSMCggMCwkQSwkQiwkQywkRCwkWCwxMiwgNywweDZiOTAxMTIyKTsKKwkmUjAoIDAsJEQsJEEsJEIsJEMsJFgsMTMsMTIsMHhmZDk4NzE5Myk7CisJJlIwKCAwLCRDLCRELCRBLCRCLCRYLDE0LDE3LDB4YTY3OTQzOGUpOworCSZSMCggMSwkQiwkQywkRCwkQSwkWCwxNSwyMiwweDQ5YjQwODIxKTsKKworCSZjb21tZW50KCIiKTsKKwkmY29tbWVudCgiUjEgc2VjdGlvbiIpOworCSZSMSgtMSwkQSwkQiwkQywkRCwkWCwxNiwgNSwweGY2MWUyNTYyKTsKKwkmUjEoIDAsJEQsJEEsJEIsJEMsJFgsMTcsIDksMHhjMDQwYjM0MCk7CisJJlIxKCAwLCRDLCRELCRBLCRCLCRYLDE4LDE0LDB4MjY1ZTVhNTEpOworCSZSMSggMCwkQiwkQywkRCwkQSwkWCwxOSwyMCwweGU5YjZjN2FhKTsKKwkmUjEoIDAsJEEsJEIsJEMsJEQsJFgsMjAsIDUsMHhkNjJmMTA1ZCk7CisJJlIxKCAwLCRELCRBLCRCLCRDLCRYLDIxLCA5LDB4MDI0NDE0NTMpOworCSZSMSggMCwkQywkRCwkQSwkQiwkWCwyMiwxNCwweGQ4YTFlNjgxKTsKKwkmUjEoIDAsJEIsJEMsJEQsJEEsJFgsMjMsMjAsMHhlN2QzZmJjOCk7CisJJlIxKCAwLCRBLCRCLCRDLCRELCRYLDI0LCA1LDB4MjFlMWNkZTYpOworCSZSMSggMCwkRCwkQSwkQiwkQywkWCwyNSwgOSwweGMzMzcwN2Q2KTsKKwkmUjEoIDAsJEMsJEQsJEEsJEIsJFgsMjYsMTQsMHhmNGQ1MGQ4Nyk7CisJJlIxKCAwLCRCLCRDLCRELCRBLCRYLDI3LDIwLDB4NDU1YTE0ZWQpOworCSZSMSggMCwkQSwkQiwkQywkRCwkWCwyOCwgNSwweGE5ZTNlOTA1KTsKKwkmUjEoIDAsJEQsJEEsJEIsJEMsJFgsMjksIDksMHhmY2VmYTNmOCk7CisJJlIxKCAwLCRDLCRELCRBLCRCLCRYLDMwLDE0LDB4Njc2ZjAyZDkpOworCSZSMSggMSwkQiwkQywkRCwkQSwkWCwzMSwyMCwweDhkMmE0YzhhKTsKKworCSZjb21tZW50KCIiKTsKKwkmY29tbWVudCgiUjIgc2VjdGlvbiIpOworCSZSMiggMCwtMSwkQSwkQiwkQywkRCwkWCwzMiwgNCwweGZmZmEzOTQyKTsKKwkmUjIoIDEsIDAsJEQsJEEsJEIsJEMsJFgsMzMsMTEsMHg4NzcxZjY4MSk7CisJJlIyKCAyLCAwLCRDLCRELCRBLCRCLCRYLDM0LDE2LDB4NmQ5ZDYxMjIpOworCSZSMiggMywgMCwkQiwkQywkRCwkQSwkWCwzNSwyMywweGZkZTUzODBjKTsKKwkmUjIoIDQsIDAsJEEsJEIsJEMsJEQsJFgsMzYsIDQsMHhhNGJlZWE0NCk7CisJJlIyKCA1LCAwLCRELCRBLCRCLCRDLCRYLDM3LDExLDB4NGJkZWNmYTkpOworCSZSMiggNiwgMCwkQywkRCwkQSwkQiwkWCwzOCwxNiwweGY2YmI0YjYwKTsKKwkmUjIoIDcsIDAsJEIsJEMsJEQsJEEsJFgsMzksMjMsMHhiZWJmYmM3MCk7CisJJlIyKCA4LCAwLCRBLCRCLCRDLCRELCRYLDQwLCA0LDB4Mjg5YjdlYzYpOworCSZSMiggOSwgMCwkRCwkQSwkQiwkQywkWCw0MSwxMSwweGVhYTEyN2ZhKTsKKwkmUjIoMTAsIDAsJEMsJEQsJEEsJEIsJFgsNDIsMTYsMHhkNGVmMzA4NSk7CisJJlIyKDExLCAwLCRCLCRDLCRELCRBLCRYLDQzLDIzLDB4MDQ4ODFkMDUpOworCSZSMigxMiwgMCwkQSwkQiwkQywkRCwkWCw0NCwgNCwweGQ5ZDRkMDM5KTsKKwkmUjIoMTMsIDAsJEQsJEEsJEIsJEMsJFgsNDUsMTEsMHhlNmRiOTllNSk7CisJJlIyKDE0LCAwLCRDLCRELCRBLCRCLCRYLDQ2LDE2LDB4MWZhMjdjZjgpOworCSZSMigxNSwgMSwkQiwkQywkRCwkQSwkWCw0NywyMywweGM0YWM1NjY1KTsKKworCSZjb21tZW50KCIiKTsKKwkmY29tbWVudCgiUjMgc2VjdGlvbiIpOworCSZSMygtMSwkQSwkQiwkQywkRCwkWCw0OCwgNiwweGY0MjkyMjQ0KTsKKwkmUjMoIDAsJEQsJEEsJEIsJEMsJFgsNDksMTAsMHg0MzJhZmY5Nyk7CisJJlIzKCAwLCRDLCRELCRBLCRCLCRYLDUwLDE1LDB4YWI5NDIzYTcpOworCSZSMyggMCwkQiwkQywkRCwkQSwkWCw1MSwyMSwweGZjOTNhMDM5KTsKKwkmUjMoIDAsJEEsJEIsJEMsJEQsJFgsNTIsIDYsMHg2NTViNTljMyk7CisJJlIzKCAwLCRELCRBLCRCLCRDLCRYLDUzLDEwLDB4OGYwY2NjOTIpOworCSZSMyggMCwkQywkRCwkQSwkQiwkWCw1NCwxNSwweGZmZWZmNDdkKTsKKwkmUjMoIDAsJEIsJEMsJEQsJEEsJFgsNTUsMjEsMHg4NTg0NWRkMSk7CisJJlIzKCAwLCRBLCRCLCRDLCRELCRYLDU2LCA2LDB4NmZhODdlNGYpOworCSZSMyggMCwkRCwkQSwkQiwkQywkWCw1NywxMCwweGZlMmNlNmUwKTsKKwkmUjMoIDAsJEMsJEQsJEEsJEIsJFgsNTgsMTUsMHhhMzAxNDMxNCk7CisJJlIzKCAwLCRCLCRDLCRELCRBLCRYLDU5LDIxLDB4NGUwODExYTEpOworCSZSMyggMCwkQSwkQiwkQywkRCwkWCw2MCwgNiwweGY3NTM3ZTgyKTsKKwkmUjMoIDAsJEQsJEEsJEIsJEMsJFgsNjEsMTAsMHhiZDNhZjIzNSk7CisJJlIzKCAwLCRDLCRELCRBLCRCLCRYLDYyLDE1LDB4MmFkN2QyYmIpOworCSZSMyggMiwkQiwkQywkRCwkQSwkWCw2MywyMSwweGViODZkMzkxKTsKKworCSMgJm1vdigkdG1wMiwmd3BhcmFtKDApKTsJIyBkb25lIGluIHRoZSBsYXN0IFIzCisJIyAmbW92KCR0bXAxLAkmRFdQKCAwLCR0bXAyLCIiLDApKTsgIyBkb25lIGlzIHRoZSBsYXN0IFIzCisKKwkmYWRkKCRBLCR0bXAxKTsKKwkgJm1vdigkdG1wMSwJJkRXUCggNCwkdG1wMiwiIiwwKSk7CisKKwkmYWRkKCRCLCR0bXAxKTsKKwkmbW92KCR0bXAxLAkmRFdQKCA4LCR0bXAyLCIiLDApKTsKKworCSZhZGQoJEMsJHRtcDEpOworCSZtb3YoJHRtcDEsCSZEV1AoMTIsJHRtcDIsIiIsMCkpOworCisJJmFkZCgkRCwkdG1wMSk7CisJJm1vdigmRFdQKCAwLCR0bXAyLCIiLDApLCRBKTsKKworCSZtb3YoJkRXUCggNCwkdG1wMiwiIiwwKSwkQik7CisJJm1vdigkdG1wMSwmc3d0bXAoMCkpIHVubGVzcyAkbm9ybWFsOworCisJJm1vdigmRFdQKCA4LCR0bXAyLCIiLDApLCRDKTsKKwkgJm1vdigmRFdQKDEyLCR0bXAyLCIiLDApLCREKTsKKworCSZjbXAoJHRtcDEsJFgpIHVubGVzcyAkbm9ybWFsOwkJCSMgY2hlY2sgY291bnQKKwkgJmphZSgmbGFiZWwoInN0YXJ0IikpIHVubGVzcyAkbm9ybWFsOworCisJJnBvcCgiZWF4Iik7ICMgcG9wIHRoZSB0ZW1wIHZhcmlhYmxlIG9mZiB0aGUgc3RhY2sKKwkgJnBvcCgiZWJ4Iik7CisJJnBvcCgiZWJwIik7CisJICZwb3AoImVkaSIpOworCSZwb3AoImVzaSIpOworCSAmcmV0KCk7CisJJmZ1bmN0aW9uX2VuZF9CKCRuYW1lKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvYXNtL21kNS1pYTY0LlMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L2FzbS9tZDUtaWE2NC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZGUwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L2FzbS9tZDUtaWE2NC5TCkBAIC0wLDAgKzEsOTkyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMDUgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCithIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKK3dpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKK2Rpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCit0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKK1RoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCitpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCitFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECitOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCitMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCitPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KK1dJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgKi8KKworLy8JQ29tbW9uIHJlZ2lzdGVycyBhcmUgYXNzaWduZWQgYXMgZm9sbG93czoKKy8vCisvLwlDT01NT04KKy8vCisvLwl0MAkJQ29uc3QgVGJsIFB0cglUUHRyCisvLwl0MQkJUm91bmQgQ29uc3RhbnQJVFJvdW5kCisvLwl0NAkJQmxvY2sgcmVzaWR1YWwJTGVuUmVzaWQKKy8vCXQ1CQlSZXNpZHVhbCBEYXRhCURUbXAKKy8vCisvLwl7aW4sb3V0fTAJQmxvY2sgMCBDeWNsZQlSb3RhdGVNMAorLy8Je2luLG91dH0xCUJsb2NrIFZhbHVlIDEyCU0xMgorLy8Je2luLG91dH0yCUJsb2NrIFZhbHVlIDgJTTgKKy8vCXtpbixvdXR9MwlCbG9jayBWYWx1ZSA0CU00CisvLwl7aW4sb3V0fTQJQmxvY2sgVmFsdWUgMAlNMAorLy8Je2luLG91dH01CUJsb2NrIDEgQ3ljbGUJUm90YXRlTTEKKy8vCXtpbixvdXR9NglCbG9jayBWYWx1ZSAxMwlNMTMKKy8vCXtpbixvdXR9NwlCbG9jayBWYWx1ZSA5CU05CisvLwl7aW4sb3V0fTgJQmxvY2sgVmFsdWUgNQlNNQorLy8Je2luLG91dH05CUJsb2NrIFZhbHVlIDEJTTEKKy8vCXtpbixvdXR9MTAJQmxvY2sgMiBDeWNsZQlSb3RhdGVNMgorLy8Je2luLG91dH0xMQlCbG9jayBWYWx1ZSAxNAlNMTQKKy8vCXtpbixvdXR9MTIJQmxvY2sgVmFsdWUgMTAJTTEwCisvLwl7aW4sb3V0fTEzCUJsb2NrIFZhbHVlIDYJTTYKKy8vCXtpbixvdXR9MTQJQmxvY2sgVmFsdWUgMglNMgorLy8Je2luLG91dH0xNQlCbG9jayAzIEN5Y2xlCVJvdGF0ZU0zCisvLwl7aW4sb3V0fTE2CUJsb2NrIFZhbHVlIDE1CU0xNQorLy8Je2luLG91dH0xNwlCbG9jayBWYWx1ZSAxMQlNMTEKKy8vCXtpbixvdXR9MTgJQmxvY2sgVmFsdWUgNwlNNworLy8Je2luLG91dH0xOQlCbG9jayBWYWx1ZSAzCU0zCisvLwl7aW4sb3V0fTIwCVNjcmF0Y2gJCQlaCisvLwl7aW4sb3V0fTIxCVNjcmF0Y2gJCQlZCisvLwl7aW4sb3V0fTIyCVNjcmF0Y2gJCQlYCisvLwl7aW4sb3V0fTIzCVNjcmF0Y2gJCQlXCisvLwl7aW4sb3V0fTI0CURpZ2VzdCBBCQlBCisvLwl7aW4sb3V0fTI1CURpZ2VzdCBCCQlCCisvLwl7aW4sb3V0fTI2CURpZ2VzdCBDCQlDCisvLwl7aW4sb3V0fTI3CURpZ2VzdCBECQlECisvLwl7aW4sb3V0fTI4CUFjdGl2ZSBEYXRhIFB0cglEUHRyCisvLwlpbjI4CQlEdW1teSBWYWx1ZQkJLQorLy8Jb3V0MjgJCUR1bW15IFZhbHVlCQktCisvLwlidDAJCQlDb3JvdXRpbmUgTGluawlRVUlDS19SVE4KKy8vCisvLy8JVGhlc2UgcHJlZGljYXRlcyBhcmUgdXNlZCBmb3IgY29tcHV0aW5nIHRoZSBwYWRkaW5nIGJsb2NrKHMpIGFuZAorLy8vCWFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgZHJpdmVyIGFuZCBkaWdlc3QgY28tcm91dGluZXMKKy8vCisvLwlwdDAJCQlFeHRyYSBQYWQgQmxvY2sJcEV4dHJhCisvLwlwdDEJCQlMb2FkIG5leHQgd29yZAlwTG9hZAorLy8JcHQyCQkJU2tpcCBuZXh0IHdvcmQJcFNraXAKKy8vCXB0MwkJCVNlYXJjaCBmb3IgUGFkCXBOb1BhZAorLy8JcHQ0CQkJUGFkIFdvcmQgMAkJcFBhZDAKKy8vCXB0NQkJCVBhZCBXb3JkIDEJCXBQYWQxCisvLwlwdDYJCQlQYWQgV29yZCAyCQlwUGFkMgorLy8JcHQ3CQkJUGFkIFdvcmQgMwkJcFBhZDMKKworI2RlZmluZQlEVG1wCQlyMTkKKyNkZWZpbmUJTGVuUmVzaWQJcjE4CisjZGVmaW5lCVFVSUNLX1JUTgliNgorI2RlZmluZQlUUHRyCQlyMTQKKyNkZWZpbmUJVFJvdW5kCQlyMTUKKyNkZWZpbmUJcEV4dHJhCQlwNgorI2RlZmluZQlwTG9hZAkJcDcKKyNkZWZpbmUJcE5vUGFkCQlwOQorI2RlZmluZQlwUGFkMAkJcDEwCisjZGVmaW5lCXBQYWQxCQlwMTEKKyNkZWZpbmUJcFBhZDIJCXAxMgorI2RlZmluZQlwUGFkMwkJcDEzCisjZGVmaW5lCXBTa2lwCQlwOAorCisjZGVmaW5lCUFfCQlvdXQyNAorI2RlZmluZQlCXwkJb3V0MjUKKyNkZWZpbmUJQ18JCW91dDI2CisjZGVmaW5lCURfCQlvdXQyNworI2RlZmluZQlEUHRyXwkJb3V0MjgKKyNkZWZpbmUJTTBfCQlvdXQ0CisjZGVmaW5lCU0xXwkJb3V0OQorI2RlZmluZQlNMTBfCQlvdXQxMgorI2RlZmluZQlNMTFfCQlvdXQxNworI2RlZmluZQlNMTJfCQlvdXQxCisjZGVmaW5lCU0xM18JCW91dDYKKyNkZWZpbmUJTTE0XwkJb3V0MTEKKyNkZWZpbmUJTTE1XwkJb3V0MTYKKyNkZWZpbmUJTTJfCQlvdXQxNAorI2RlZmluZQlNM18JCW91dDE5CisjZGVmaW5lCU00XwkJb3V0MworI2RlZmluZQlNNV8JCW91dDgKKyNkZWZpbmUJTTZfCQlvdXQxMworI2RlZmluZQlNN18JCW91dDE4CisjZGVmaW5lCU04XwkJb3V0MgorI2RlZmluZQlNOV8JCW91dDcKKyNkZWZpbmUJUm90YXRlTTBfCW91dDAKKyNkZWZpbmUJUm90YXRlTTFfCW91dDUKKyNkZWZpbmUJUm90YXRlTTJfCW91dDEwCisjZGVmaW5lCVJvdGF0ZU0zXwlvdXQxNQorI2RlZmluZQlXXwkJb3V0MjMKKyNkZWZpbmUJWF8JCW91dDIyCisjZGVmaW5lCVlfCQlvdXQyMQorI2RlZmluZQlaXwkJb3V0MjAKKworI2RlZmluZQlBCQlpbjI0CisjZGVmaW5lCUIJCWluMjUKKyNkZWZpbmUJQwkJaW4yNgorI2RlZmluZQlECQlpbjI3CisjZGVmaW5lCURQdHIJCWluMjgKKyNkZWZpbmUJTTAJCWluNAorI2RlZmluZQlNMQkJaW45CisjZGVmaW5lCU0xMAkJaW4xMgorI2RlZmluZQlNMTEJCWluMTcKKyNkZWZpbmUJTTEyCQlpbjEKKyNkZWZpbmUJTTEzCQlpbjYKKyNkZWZpbmUJTTE0CQlpbjExCisjZGVmaW5lCU0xNQkJaW4xNgorI2RlZmluZQlNMgkJaW4xNAorI2RlZmluZQlNMwkJaW4xOQorI2RlZmluZQlNNAkJaW4zCisjZGVmaW5lCU01CQlpbjgKKyNkZWZpbmUJTTYJCWluMTMKKyNkZWZpbmUJTTcJCWluMTgKKyNkZWZpbmUJTTgJCWluMgorI2RlZmluZQlNOQkJaW43CisjZGVmaW5lCVJvdGF0ZU0wCWluMAorI2RlZmluZQlSb3RhdGVNMQlpbjUKKyNkZWZpbmUJUm90YXRlTTIJaW4xMAorI2RlZmluZQlSb3RhdGVNMwlpbjE1CisjZGVmaW5lCVcJCWluMjMKKyNkZWZpbmUJWAkJaW4yMgorI2RlZmluZQlZCQlpbjIxCisjZGVmaW5lCVoJCWluMjAKKworLyogcmVnaXN0ZXIgc3RhY2sgY29uZmlndXJhdGlvbiBmb3IgbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyKCk6ICovCisjZGVmaW5lCU1ENV9OSU5QCTMKKyNkZWZpbmUJTUQ1X05MT0MJMAorI2RlZmluZSBNRDVfTk9VVAkyOQorI2RlZmluZSBNRDVfTlJPVAkwCisKKy8qIHJlZ2lzdGVyIHN0YWNrIGNvbmZpZ3VyYXRpb24gZm9yIGhlbHBlcnM6ICovCisjZGVmaW5lCV9OSU5QVVRTCU1ENV9OT1VUCisjZGVmaW5lCV9OTE9DQUxTCTAKKyNkZWZpbmUgX05PVVRQVVQJMAorI2RlZmluZQlfTlJPVEFURQkyNAkvKiB0aGlzIG11c3QgYmUgPD0gX05JTlBVVFMgKi8KKworI2lmIGRlZmluZWQoX0hQVVhfU09VUkNFKSAmJiAhZGVmaW5lZChfTFA2NCkKKyNkZWZpbmUJQUREUAlhZGRwNAorI2Vsc2UKKyNkZWZpbmUJQUREUAlhZGQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfSFBVWF9TT1VSQ0UpIHx8IGRlZmluZWQoQl9FTkRJQU4pCisjZGVmaW5lIEhPU1RfSVNfQklHX0VORElBTgorI2VuZGlmCisKKy8vCU1hY3JvcyBmb3IgZ2V0dGluZyB0aGUgbGVmdCBhbmQgcmlnaHQgcG9ydGlvbnMgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcworCisjZGVmaW5lCUdFVExXKGRzdCwgc3JjLCBhbGlnbikJZGVwLnogZHN0ID0gc3JjLCAzMiAtIDggKiBhbGlnbiwgOCAqIGFsaWduCisjZGVmaW5lCUdFVFJXKGRzdCwgc3JjLCBhbGlnbikJZXh0ci51IGRzdCA9IHNyYywgOCAqIGFsaWduLCAzMiAtIDggKiBhbGlnbgorCisvLwlNRDUgZHJpdmVyCisvLworLy8JCVJlYWRzIGFuIGlucHV0IGJsb2NrLCB0aGVuIGNhbGxzIHRoZSBkaWdlc3QgYmxvY2sKKy8vCQlzdWJyb3V0aW5lIGFuZCBhZGRzIHRoZSByZXN1bHRzIHRvIHRoZSBhY2N1bXVsYXRlZAorLy8JCWRpZ2VzdC4gIEl0IGFsbG9jYXRlcyAzMiBvdXRzIHdoaWNoIHRoZSBzdWJyb3V0aW5lCisvLwkJdXNlcyBhcyBpdCdzIGlucHV0cyBhbmQgcm90YXRpbmcKKy8vCQlyZWdpc3RlcnMuIEluaXRpYWxpemVzIHRoZSByb3VuZCBjb25zdGFudCBwb2ludGVyIGFuZAorLy8JCXRha2VzIGNhcmUgb2Ygc2F2aW5nL3Jlc3RvcmluZyBhci5sYworLy8KKy8vLwlJTlBVVAorLy8KKy8vCWluMAkJQ29udGV4dCBQdHIJCUN0eFB0cjAKKy8vCWluMQkJSW5wdXQgRGF0YSBQdHIJCURQdHJJbgorLy8JaW4yCQlJbnRlZ3JhbCBCbG9ja3MJCUJsb2NrQ291bnQKKy8vCXJwCQlSZXR1cm4gQWRkcmVzcwkJLQorLy8KKy8vLwlDT0RFCisvLworLy8JdjIJCUlucHV0IEFsaWduCQlJbkFsaWduCisvLwl0MAkJU2hhcmVkIHcvZGlnZXN0CQktCisvLwl0MQkJU2hhcmVkIHcvZGlnZXN0CQktCisvLwl0MgkJU2hhcmVkIHcvZGlnZXN0CQktCisvLwl0MwkJU2hhcmVkIHcvZGlnZXN0CQktCisvLwl0NAkJU2hhcmVkIHcvZGlnZXN0CQktCisvLwl0NQkJU2hhcmVkIHcvZGlnZXN0CQktCisvLwl0NgkJUEZTIFNhdmUJCVBGU1NhdmUKKy8vCXQ3CQlhci5sYyBTYXZlCQlMQ1NhdmUKKy8vCXQ4CQlTYXZlZCBQUgkJUFJTYXZlCisvLwl0OQkJMm5kIEN0eFB0cgkJQ3R4UHRyMQorLy8JdDEwCQlUYWJsZSBCYXNlCQlDVGFibGUKKy8vCXQxMQkJVGFibGVbMF0JCUNUYWJsZTAKKy8vCXQxMwkJQWNjdW11bGF0b3IgQQkJQWNjdW1BCisvLwl0MTQJCUFjY3VtdWxhdG9yIEIJCUFjY3VtQgorLy8JdDE1CQlBY2N1bXVsYXRvciBDCQlBY2N1bUMKKy8vCXQxNgkJQWNjdW11bGF0b3IgRAkJQWNjdW1ECisvLwlwdDAJCVNoYXJlZCB3L2RpZ2VzdAkJLQorLy8JcHQxCQlTaGFyZWQgdy9kaWdlc3QJCS0KKy8vCXB0MgkJU2hhcmVkIHcvZGlnZXN0CQktCisvLwlwdDMJCVNoYXJlZCB3L2RpZ2VzdAkJLQorLy8JcHQ0CQlTaGFyZWQgdy9kaWdlc3QJCS0KKy8vCXB0NQkJU2hhcmVkIHcvZGlnZXN0CQktCisvLwlwdDYJCVNoYXJlZCB3L2RpZ2VzdAkJLQorLy8JcHQ3CQlTaGFyZWQgdy9kaWdlc3QJCS0KKy8vCXB0OAkJTm90IEFsaWduZWQJCXBPZmYKKy8vCXB0OAkJQmxvY2tzIExlZnQJCXBBZ2FpbgorCisjZGVmaW5lCUFjY3VtQQkJcjI3CisjZGVmaW5lCUFjY3VtQgkJcjI4CisjZGVmaW5lCUFjY3VtQwkJcjI5CisjZGVmaW5lCUFjY3VtRAkJcjMwCisjZGVmaW5lCUNUYWJsZQkJcjI0CisjZGVmaW5lCUNUYWJsZTAJCXIyNQorI2RlZmluZQlDdHhQdHIwCQlpbjAKKyNkZWZpbmUJQ3R4UHRyMQkJcjIzCisjZGVmaW5lCURQdHJJbgkJaW4xCisjZGVmaW5lCUJsb2NrQ291bnQJaW4yCisjZGVmaW5lCUluQWxpZ24JCXIxMAorI2RlZmluZQlMQ1NhdmUJCXIyMQorI2RlZmluZQlQRlNTYXZlCQlyMjAKKyNkZWZpbmUJUFJTYXZlCQlyMjIKKyNkZWZpbmUJcEFnYWluCQlwNjMKKyNkZWZpbmUJcE9mZgkJcDYzCisKKwkudGV4dAorCisvKiBtZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIoTUQ1X0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IG51bSkKKworICAgICB3aGVyZToKKyAgICAgIGM6IGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSBvZiB0aGlzIHR5cGU6CisKKwkgICB0eXBlZGVmIHN0cnVjdCBNRDVzdGF0ZV9zdAorCSAgICAgeworCSAgICAgICBNRDVfTE9ORyBBLEIsQyxEOworCSAgICAgICBNRDVfTE9ORyBObCxOaDsKKwkgICAgICAgTUQ1X0xPTkcgZGF0YVtNRDVfTEJMT0NLXTsKKwkgICAgICAgdW5zaWduZWQgaW50IG51bTsKKwkgICAgIH0KKwkgICBNRDVfQ1RYOworCisgICAgICBkYXRhOiBhIHBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKG1heSBiZSBtaXNhbGlnbmVkKQorICAgICAgbnVtOiAgdGhlIG51bWJlciBvZiAxNi1ieXRlIGJsb2NrcyB0byBoYXNoIChpLmUuLCB0aGUgbGVuZ3RoCisgICAgICAgICAgICBvZiBEQVRBIGlzIDE2Kk5VTS4KKworICAgKi8KKworCS50eXBlCW1kNV9ibG9ja19hc21fZGF0YV9vcmRlciwgQGZ1bmN0aW9uCisJLmdsb2JhbAltZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIKKwkuYWxpZ24JMzIKKwkucHJvYwltZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIKK21kNV9ibG9ja19hc21fZGF0YV9vcmRlcjoKKy5tZDVfYmxvY2s6CisJLnByb2xvZ3VlCit7CS5tbWkKKwkuc2F2ZQlhci5wZnMsIFBGU1NhdmUKKwlhbGxvYwlQRlNTYXZlID0gYXIucGZzLCBNRDVfTklOUCwgTUQ1X05MT0MsIE1ENV9OT1VULCBNRDVfTlJPVAorCUFERFAJQ3R4UHRyMSA9IDgsIEN0eFB0cjAKKwltb3YJQ1RhYmxlID0gaXAKK30KK3sJLm1taQorCUFERFAJRFB0ckluID0gMCwgRFB0ckluCisJQUREUAlDdHhQdHIwID0gMCwgQ3R4UHRyMAorCS5zYXZlCWFyLmxjLCBMQ1NhdmUKKwltb3YJTENTYXZlID0gYXIubGMKK30KKzs7Cit7CS5tbWkKKwlhZGQJQ1RhYmxlID0gLm1kNV90YmxfZGF0YV9vcmRlciMtLm1kNV9ibG9jayMsIENUYWJsZQorCWFuZAlJbkFsaWduID0gMHgzLCBEUHRySW4KK30KKworewkubW1pCisJbGQ0CUFjY3VtQSA9IFtDdHhQdHIwXSwgNAorCWxkNAlBY2N1bUMgPSBbQ3R4UHRyMV0sIDQKKwkuc2F2ZSBwciwgUFJTYXZlCisJbW92CVBSU2F2ZSA9IHByCisJLmJvZHkKK30KKzs7Cit7CS5tbWkKKwlsZDQJQWNjdW1CID0gW0N0eFB0cjBdCisJbGQ0CUFjY3VtRCA9IFtDdHhQdHIxXQorCWRlcAlEUHRyXyA9IDAsIERQdHJJbiwgMCwgMgorfSA7OworI2lmZGVmIEhPU1RfSVNfQklHX0VORElBTgorCXJ1bQlwc3IuYmU7OwkvLyBzd2l0Y2ggdG8gbGl0dGxlLWVuZGlhbgorI2VuZGlmCit7CS5tbWIKKwlsZDQJQ1RhYmxlMCA9IFtDVGFibGVdLCA0CisJY21wLm5lCXBPZmYsIHAwID0gMCwgSW5BbGlnbgorKHBPZmYpCWJyLmNvbmQuc3BudC5tYW55IC5tZDVfdW5hbGlnbmVkCit9IDs7CisKKy8vCVRoZSBGRiBsb2FkL2NvbXB1dGUgbG9vcCByb3RhdGVzIHZhbHVlcyB0aHJlZSB0aW1lcywgc28gdGhhdAorLy8JbG9hZGluZyBpbnRvIE0xMiBoZXJlIHByb2R1Y2VzIHRoZSBNMCB2YWx1ZSwgTTEzIC0+IE0xLCBldGMuCisKKy5tZDVfYmxvY2tfbG9vcDA6Cit7CS5tbWkKKwlsZDQJTTEyXyA9IFtEUHRyX10sIDQKKwltb3YJVFB0ciA9IENUYWJsZQorCW1vdglUUm91bmQgPSBDVGFibGUwCit9IDs7Cit7CS5tbWkKKwlsZDQJTTEzXyA9IFtEUHRyX10sIDQKKwltb3YJQV8gPSBBY2N1bUEKKwltb3YJQl8gPSBBY2N1bUIKK30gOzsKK3sJLm1taQorCWxkNAlNMTRfID0gW0RQdHJfXSwgNAorCW1vdglDXyA9IEFjY3VtQworCW1vdglEXyA9IEFjY3VtRAorfSA7OworewkubW1iCisJbGQ0CU0xNV8gPSBbRFB0cl9dLCA0CisJYWRkCUJsb2NrQ291bnQgPSAtMSwgQmxvY2tDb3VudAorCWJyLmNhbGwuc3B0ay5tYW55IFFVSUNLX1JUTiA9IG1kNV9kaWdlc3RfYmxvY2swCit9IDs7CisKKy8vCU5vdywgd2UgYWRkIHRoZSBuZXcgZGlnZXN0IHZhbHVlcyBhbmQgZG8gc29tZSBjbGVhbi11cAorLy8JYmVmb3JlIGNoZWNraW5nIGlmIHRoZXJlJ3MgYW5vdGhlciBmdWxsIGJsb2NrIHRvIHByb2Nlc3MKKworewkubW1pCisJYWRkCUFjY3VtQSA9IEFjY3VtQSwgQV8KKwlhZGQJQWNjdW1CID0gQWNjdW1CLCBCXworCWNtcC5uZQlwQWdhaW4sIHAwID0gMCwgQmxvY2tDb3VudAorfQorewkubWliCisJYWRkCUFjY3VtQyA9IEFjY3VtQywgQ18KKwlhZGQJQWNjdW1EID0gQWNjdW1ELCBEXworKHBBZ2FpbikgYnIuY29uZC5kcHRrLm1hbnkgLm1kNV9ibG9ja19sb29wMAorfSA7OworCisubWQ1X2V4aXQ6CisjaWZkZWYgSE9TVF9JU19CSUdfRU5ESUFOCisJc3VtCXBzci5iZTs7CS8vIHN3aXRjaCBiYWNrIHRvIGJpZy1lbmRpYW4gbW9kZQorI2VuZGlmCit7CS5tbWkKKwlzdDQJW0N0eFB0cjBdID0gQWNjdW1CLCAtNAorCXN0NAlbQ3R4UHRyMV0gPSBBY2N1bUQsIC00CisJbW92CXByID0gUFJTYXZlLCAweDFmZmZmIDs7Cit9Cit7CS5tbWkKKwlzdDQJW0N0eFB0cjBdID0gQWNjdW1BCisJc3Q0CVtDdHhQdHIxXSA9IEFjY3VtQworCW1vdglhci5sYyA9IExDU2F2ZQorfSA7OworewkubWliCisJbW92CWFyLnBmcyA9IFBGU1NhdmUKKwlici5yZXQuc3B0ay5mZXcJcnAKK30gOzsKKworI2RlZmluZQlNRDVVTkFMSUdORUQob2Zmc2V0KQkJCQkJCVwKKy5tZDVfcHJvY2VzcyMjb2Zmc2V0OgkJCQkJCQlcCit7CS5taWIgOwkJCQkJCQkJXAorCW5vcAkweDAJOwkJCQkJCVwKKwlHRVRSVyhEVG1wLCBEVG1wLCBvZmZzZXQpIDsJCQkJCVwKK30gOzsJCQkJCQkJCQlcCisubWQ1X2Jsb2NrX2xvb3AjI29mZnNldDoJCQkJCQlcCit7CS5tbWkgOwkJCQkJCQkJXAorCWxkNAlZXyA9IFtEUHRyX10sIDQgOwkJCQkJXAorCW1vdglUUHRyID0gQ1RhYmxlIDsJCQkJCQlcCisJbW92CVRSb3VuZCA9IENUYWJsZTAgOwkJCQkJXAorfSA7OwkJCQkJCQkJCVwKK3sJLm1taSA7CQkJCQkJCQlcCisJbGQ0CU0xM18gPSBbRFB0cl9dLCA0IDsJCQkJCVwKKwltb3YJQV8gPSBBY2N1bUEgOwkJCQkJCVwKKwltb3YJQl8gPSBBY2N1bUIgOwkJCQkJCVwKK30gOzsJCQkJCQkJCQlcCit7CS5taWkgOwkJCQkJCQkJXAorCWxkNAlNMTRfID0gW0RQdHJfXSwgNCA7CQkJCQlcCisJR0VUTFcoV18sIFlfLCBvZmZzZXQpIDsJCQkJCQlcCisJbW92CUNfID0gQWNjdW1DIDsJCQkJCQlcCit9CQkJCQkJCQkJXAorewkubW1pIDsJCQkJCQkJCVwKKwltb3YJRF8gPSBBY2N1bUQgOzsJCQkJCQlcCisJb3IJTTEyXyA9IFdfLCBEVG1wIDsJCQkJCVwKKwlHRVRSVyhEVG1wLCBZXywgb2Zmc2V0KSA7CQkJCQlcCit9CQkJCQkJCQkJXAorewkubWliIDsJCQkJCQkJCVwKKwlsZDQJTTE1XyA9IFtEUHRyX10sIDQgOwkJCQkJXAorCWFkZAlCbG9ja0NvdW50ID0gLTEsIEJsb2NrQ291bnQgOwkJCQlcCisJYnIuY2FsbC5zcHRrLm1hbnkgUVVJQ0tfUlROID0gbWQ1X2RpZ2VzdF9ibG9jayMjb2Zmc2V0OwkJXAorfSA7OwkJCQkJCQkJCVwKK3sJLm1taSA7CQkJCQkJCQlcCisJYWRkCUFjY3VtQSA9IEFjY3VtQSwgQV8gOwkJCQkJXAorCWFkZAlBY2N1bUIgPSBBY2N1bUIsIEJfIDsJCQkJCVwKKwljbXAubmUJcEFnYWluLCBwMCA9IDAsIEJsb2NrQ291bnQgOwkJCQlcCit9CQkJCQkJCQkJXAorewkubWliIDsJCQkJCQkJCVwKKwlhZGQJQWNjdW1DID0gQWNjdW1DLCBDXyA7CQkJCQlcCisJYWRkCUFjY3VtRCA9IEFjY3VtRCwgRF8gOwkJCQkJXAorKHBBZ2FpbikgYnIuY29uZC5kcHRrLm1hbnkgLm1kNV9ibG9ja19sb29wIyNvZmZzZXQgOwkJCVwKK30gOzsJCQkJCQkJCQlcCit7CS5taWIgOwkJCQkJCQkJXAorCW5vcAkweDAgOwkJCQkJCQlcCisJbm9wCTB4MCA7CQkJCQkJCVwKKwlici5jb25kLnNwdGsubWFueSAubWQ1X2V4aXQgOwkJCQkJXAorfSA7OworCisJLmFsaWduCTMyCisubWQ1X3VuYWxpZ25lZDoKKy8vCisvLwlCZWNhdXNlIHZhcmlhYmxlIHNoaWZ0cyBhcmUgZXhwZW5zaXZlLCB3ZSBzcGVjaWFsIGNhc2UgZWFjaCBvZgorLy8JdGhlIGZvdXIgYWxpZ25lbWVudHMuIEluIHByYWN0aWNlLCB0aGlzIHdvbid0IGh1cnQgdG9vIG11Y2gKKy8vCXNpbmNlIG9ubHkgb25lIHdvcmtpbmcgc2V0IG9mIGNvZGUgd2lsbCBiZSBsb2FkZWQuCisvLworewkubWliCisJbGQ0CURUbXAgPSBbRFB0cl9dLCA0CisJY21wLmVxCXBPZmYsIHAwID0gMSwgSW5BbGlnbgorKHBPZmYpCWJyLmNvbmQuZHBudC5tYW55IC5tZDVfcHJvY2VzczEKK30gOzsKK3sJLm1pYgorCWNtcC5lcQlwT2ZmLCBwMCA9IDIsIEluQWxpZ24KKwlub3AJMHgwCisocE9mZikJYnIuY29uZC5kcG50Lm1hbnkgLm1kNV9wcm9jZXNzMgorfSA7OworCU1ENVVOQUxJR05FRCgzKQorCU1ENVVOQUxJR05FRCgxKQorCU1ENVVOQUxJR05FRCgyKQorCisJLmVuZHAgbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisKKworLy8gTUQ1IFBlcmZvcm0gdGhlIEYgZnVuY3Rpb24gYW5kIGxvYWQKKy8vCisvLyBQYXNzZWQgdGhlIGZpcnN0IDQgd29yZHMgKE0wIC0gTTMpIGFuZCBpbml0aWFsIChBLCBCLCBDLCBEKSB2YWx1ZXMsCisvLyBjb21wdXRlcyB0aGUgRkYoKSByb3VuZCBvZiBmdW5jdGlvbnMsIHRoZW4gYnJhbmNoZXMgdG8gdGhlIGNvbW1vbgorLy8gZGlnZXN0IGNvZGUgdG8gZmluaXNoIHVwIHdpdGggR0coKSwgSEgsIGFuZCBJSSgpLgorLy8KKy8vIElOUFVUCisvLworLy8gcnAgUmV0dXJuIEFkZHJlc3MgLQorLy8KKy8vIENPREUKKy8vCisvLyB2MCBQRlMgYml0IGJ1Y2tldCBQRlMKKy8vIHYxIExvb3AgVHJpcCBDb3VudCBMVHJpcAorLy8gcHQwIExvYWQgbmV4dCB3b3JkIHBNb3JlCisKKy8qIEZvciBGIHJvdW5kOiAqLworI2RlZmluZSBMVHJpcAlyOQorI2RlZmluZSBQRlMJcjgKKyNkZWZpbmUgcE1vcmUJcDYKKworLyogRm9yIEdISSByb3VuZHM6ICovCisjZGVmaW5lIFQJcjkKKyNkZWZpbmUgVQlyMTAKKyNkZWZpbmUgVglyMTEKKworI2RlZmluZSBDT01QVVRFKGEsIGIsIHMsIE0sIFIpCQkJXAorewkJCQkJCVwKKwkubWlpIDsJCQkJCVwKKwlsZDQgVFJvdW5kID0gW1RQdHJdLCA0IDsJCVwKKwlkZXAueiBZID0gWiwgMzIsIDMyIDs7CQkJXAorCXNocnAgWiA9IFosIFksIDY0IC0gcyA7CQkJXAorfSA7OwkJCQkJCVwKK3sJCQkJCQlcCisJLm1taSA7CQkJCQlcCisJYWRkIGEgPSBaLCBiIDsJCQkJXAorCW1vdiBSID0gTSA7CQkJCVwKKwlub3AgMHgwIDsJCQkJXAorfSA7OworCisjZGVmaW5lIExPT1AoYSwgYiwgcywgTSwgUiwgbGFiZWwpCQlcCit7CS5taWkgOwkJCQkJXAorCWxkNCBUUm91bmQgPSBbVFB0cl0sIDQgOwkJXAorCWRlcC56IFkgPSBaLCAzMiwgMzIgOzsJCQlcCisJc2hycCBaID0gWiwgWSwgNjQgLSBzIDsJCQlcCit9IDs7CQkJCQkJXAorewkubWliIDsJCQkJCVwKKwlhZGQgYSA9IFosIGIgOwkJCQlcCisJbW92IFIgPSBNIDsJCQkJXAorCWJyLmN0b3Auc3B0ay5tYW55IGxhYmVsIDsJCVwKK30gOzsKKworLy8gRyhCLCBDLCBEKSA9IChCICYgRCkgfCAoQyAmIH5EKQorCisjZGVmaW5lIEcoYSwgYiwgYywgZCwgTSkJCQlcCit7CS5tbWkgOwkJCQkJXAorCWFkZCBaID0gTSwgVFJvdW5kIDsJCQlcCisJYW5kIFkgPSBiLCBkIDsJCQkJXAorCWFuZGNtIFggPSBjLCBkIDsJCQlcCit9IDs7CQkJCQkJXAorewkubWlpIDsJCQkJCVwKKwlhZGQgWiA9IFosIGEgOwkJCQlcCisJb3IgWSA9IFksIFggOzsJCQkJXAorCWFkZCBaID0gWiwgWSA7CQkJCVwKK30gOzsKKworLy8gSChCLCBDLCBEKSA9IEIgXiBDIF4gRAorCisjZGVmaW5lIEgoYSwgYiwgYywgZCwgTSkJCQlcCit7CS5tbWkgOwkJCQkJXAorCWFkZCBaID0gTSwgVFJvdW5kIDsJCQlcCisJeG9yIFkgPSBiLCBjIDsJCQkJXAorCW5vcCAweDAgOwkJCQlcCit9IDs7CQkJCQkJXAorewkubWlpIDsJCQkJCVwKKwlhZGQgWiA9IFosIGEgOwkJCQlcCisJeG9yIFkgPSBZLCBkIDs7CQkJCVwKKwlhZGQgWiA9IFosIFkgOwkJCQlcCit9IDs7CisKKy8vIEkoQiwgQywgRCkgPSBDIF4gKEIgfCB+RCkKKy8vCisvLyBIb3dldmVyLCBzaW5jZSB3ZSBoYXZlIGFuIGFuZGNtIG9wZXJhdG9yLCB3ZSB1c2UgdGhlIGZhY3QgdGhhdAorLy8KKy8vIFkgXiBaID09IH5ZIF4gfloKKy8vCisvLyB0byByZXdyaXRlIHRoZSBleHByZXNzaW9uIGFzCisvLworLy8gSShCLCBDLCBEKSA9IH5DIF4gKH5CICYgRCkKKworI2RlZmluZSBJKGEsIGIsIGMsIGQsIE0pCQkJXAorewkubW1pIDsJCQkJCVwKKwlhZGQgWiA9IE0sIFRSb3VuZCA7CQkJXAorCWFuZGNtIFkgPSBkLCBiIDsJCQlcCisJYW5kY20gWCA9IC0xLCBjIDsJCQlcCit9IDs7CQkJCQkJXAorewkubWlpIDsJCQkJCVwKKwlhZGQgWiA9IFosIGEgOwkJCQlcCisJeG9yIFkgPSBZLCBYIDs7CQkJCVwKKwlhZGQgWiA9IFosIFkgOwkJCQlcCit9IDs7CisKKyNkZWZpbmUgR0c0KGxhYmVsKQkJCQlcCisJRyhBLCBCLCBDLCBELCBNMCkJCQlcCisJQ09NUFVURShBLCBCLCA1LCBNMCwgUm90YXRlTTApCQlcCisJRyhELCBBLCBCLCBDLCBNMSkJCQlcCisJQ09NUFVURShELCBBLCA5LCBNMSwgUm90YXRlTTEpCQlcCisJRyhDLCBELCBBLCBCLCBNMikJCQlcCisJQ09NUFVURShDLCBELCAxNCwgTTIsIFJvdGF0ZU0yKQkJXAorCUcoQiwgQywgRCwgQSwgTTMpCQkJXAorCUxPT1AoQiwgQywgMjAsIE0zLCBSb3RhdGVNMywgbGFiZWwpCisKKyNkZWZpbmUgSEg0KGxhYmVsKQkJCQlcCisJSChBLCBCLCBDLCBELCBNMCkJCQlcCisJQ09NUFVURShBLCBCLCA0LCBNMCwgUm90YXRlTTApCQlcCisJSChELCBBLCBCLCBDLCBNMSkJCQlcCisJQ09NUFVURShELCBBLCAxMSwgTTEsIFJvdGF0ZU0xKQkJXAorCUgoQywgRCwgQSwgQiwgTTIpCQkJXAorCUNPTVBVVEUoQywgRCwgMTYsIE0yLCBSb3RhdGVNMikJCVwKKwlIKEIsIEMsIEQsIEEsIE0zKQkJCVwKKwlMT09QKEIsIEMsIDIzLCBNMywgUm90YXRlTTMsIGxhYmVsKQorCisjZGVmaW5lIElJNChsYWJlbCkJCQkJXAorCUkoQSwgQiwgQywgRCwgTTApCQkJXAorCUNPTVBVVEUoQSwgQiwgNiwgTTAsIFJvdGF0ZU0wKQkJXAorCUkoRCwgQSwgQiwgQywgTTEpCQkJXAorCUNPTVBVVEUoRCwgQSwgMTAsIE0xLCBSb3RhdGVNMSkJCVwKKwlJKEMsIEQsIEEsIEIsIE0yKQkJCVwKKwlDT01QVVRFKEMsIEQsIDE1LCBNMiwgUm90YXRlTTIpCQlcCisJSShCLCBDLCBELCBBLCBNMykJCQlcCisJTE9PUChCLCBDLCAyMSwgTTMsIFJvdGF0ZU0zLCBsYWJlbCkKKworI2RlZmluZSBGRkxPQUQoYSwgYiwgYywgZCwgTSwgTiwgcykJCVwKK3sJLm1paSA7CQkJCQlcCisocE1vcmUpIGxkNCBOID0gW0RQdHJdLCA0IDsJCQlcCisJYWRkIFogPSBNLCBUUm91bmQgOwkJCVwKKwlhbmQgWSA9IGMsIGIgOwkJCQlcCit9CQkJCQkJXAorewkubW1pIDsJCQkJCVwKKwlhbmRjbSBYID0gZCwgYiA7OwkJCVwKKwlhZGQgWiA9IFosIGEgOwkJCQlcCisJb3IgWSA9IFksIFggOwkJCQlcCit9IDs7CQkJCQkJXAorewkubWlpIDsJCQkJCVwKKwlsZDQgVFJvdW5kID0gW1RQdHJdLCA0IDsJCVwKKwlhZGQgWiA9IFosIFkgOzsJCQkJXAorCWRlcC56IFkgPSBaLCAzMiwgMzIgOwkJCVwKK30gOzsJCQkJCQlcCit7CS5taWkgOwkJCQkJXAorCW5vcCAweDAgOwkJCQlcCisJc2hycCBaID0gWiwgWSwgNjQgLSBzIDs7CQlcCisJYWRkIGEgPSBaLCBiIDsJCQkJXAorfSA7OworCisjZGVmaW5lIEZGTE9PUChhLCBiLCBjLCBkLCBNLCBOLCBzLCBkZXN0KQlcCit7CS5taWkgOwkJCQkJXAorKHBNb3JlKQlsZDQgTiA9IFtEUHRyXSwgNCA7CQkJXAorCWFkZCBaID0gTSwgVFJvdW5kIDsJCQlcCisJYW5kIFkgPSBjLCBiIDsJCQkJXAorfQkJCQkJCVwKK3sJLm1taSA7CQkJCQlcCisJYW5kY20gWCA9IGQsIGIgOzsJCQlcCisJYWRkIFogPSBaLCBhIDsJCQkJXAorCW9yIFkgPSBZLCBYIDsJCQkJXAorfSA7OwkJCQkJCVwKK3sJLm1paSA7CQkJCQlcCisJbGQ0IFRSb3VuZCA9IFtUUHRyXSwgNCA7CQlcCisJYWRkIFogPSBaLCBZIDs7CQkJCVwKKwlkZXAueiBZID0gWiwgMzIsIDMyIDsJCQlcCit9IDs7CQkJCQkJXAorewkubWlpIDsJCQkJCVwKKwlub3AgMHgwIDsJCQkJXAorCXNocnAgWiA9IFosIFksIDY0IC0gcyA7OwkJXAorCWFkZCBhID0gWiwgYiA7CQkJCVwKK30JCQkJCQlcCit7CS5taWIgOwkJCQkJXAorCWNtcC5uZSBwTW9yZSwgcDAgPSAwLCBMVHJpcCA7CQlcCisJYWRkIExUcmlwID0gLTEsIExUcmlwIDsJCQlcCisJYnIuY3RvcC5kcHRrLm1hbnkgZGVzdCA7CQlcCit9IDs7CisKKwkudHlwZSBtZDVfZGlnZXN0X2Jsb2NrMCwgQGZ1bmN0aW9uCisJLmFsaWduIDMyCisKKwkucHJvYyBtZDVfZGlnZXN0X2Jsb2NrMAorCS5wcm9sb2d1ZQorbWQ1X2RpZ2VzdF9ibG9jazA6CisJLmFsdHJwIFFVSUNLX1JUTgorCS5ib2R5Cit7CS5tbWkKKwlhbGxvYyBQRlMgPSBhci5wZnMsIF9OSU5QVVRTLCBfTkxPQ0FMUywgX05PVVRQVVQsIF9OUk9UQVRFCisJbW92IExUcmlwID0gMgorCW1vdiBhci5sYyA9IDMKK30gOzsKK3sJLm1paQorCWNtcC5lcSBwTW9yZSwgcDAgPSByMCwgcjAKKwltb3YgYXIuZWMgPSAwCisJbm9wIDB4MAorfSA7OworCisubWQ1X0ZGX3JvdW5kMDoKKwlGRkxPQUQoQSwgQiwgQywgRCwgTTEyLCBSb3RhdGVNMCwgNykKKwlGRkxPQUQoRCwgQSwgQiwgQywgTTEzLCBSb3RhdGVNMSwgMTIpCisJRkZMT0FEKEMsIEQsIEEsIEIsIE0xNCwgUm90YXRlTTIsIDE3KQorCUZGTE9PUChCLCBDLCBELCBBLCBNMTUsIFJvdGF0ZU0zLCAyMiwgLm1kNV9GRl9yb3VuZDApCisJLy8KKwkvLyAhISEgRmFsbCB0aHJvdWdoIHRvIG1kNV9kaWdlc3RfR0hJCisJLy8KKwkuZW5kcCBtZDVfZGlnZXN0X2Jsb2NrMAorCisJLnR5cGUgbWQ1X2RpZ2VzdF9HSEksIEBmdW5jdGlvbgorCS5hbGlnbiAzMgorCisJLnByb2MgbWQ1X2RpZ2VzdF9HSEkKKwkucHJvbG9ndWUKKwkucmVnc3RrIF9OSU5QVVRTLCBfTkxPQ0FMUywgX05PVVRQVVQsIF9OUk9UQVRFCittZDVfZGlnZXN0X0dISToKKwkuYWx0cnAgUVVJQ0tfUlROCisJLmJvZHkKKy8vCisvLyBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIHNodWZmbGVzIHRoZSBibG9jayBjb3Vuc3RhbnRzIHJvdW5kIGZvciB0aGUKKy8vIG5leHQgcm91bmQ6CisvLworLy8gMCAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMSAxMiAxMyAxNCAxNQorLy8gMSA2IDExIDAgNSAxMCAxNCA0IDkgMTQgMyA4IDEzIDIgNyAxMgorLy8KK3sJLm1taQorCW1vdiBaID0gTTAKKwltb3YgWSA9IE0xNQorCW1vdiBhci5sYyA9IDMKK30KK3sJLm1taQorCW1vdiBYID0gTTIKKwltb3YgVyA9IE05CisJbW92IFYgPSBNNAorfSA7OworCit7CS5tbWkKKwltb3YgTTAgPSBNMQorCW1vdiBNMTUgPSBNMTIKKwltb3YgYXIuZWMgPSAxCit9Cit7CS5tbWkKKwltb3YgTTIgPSBNMTEKKwltb3YgTTkgPSBNMTQKKwltb3YgTTQgPSBNNQorfSA7OworCit7CS5tbWkKKwltb3YgTTEgPSBNNgorCW1vdiBNMTIgPSBNMTMKKwltb3YgVSA9IE0zCit9Cit7CS5tbWkKKwltb3YgTTExID0gTTgKKwltb3YgTTE0ID0gTTcKKwltb3YgTTUgPSBNMTAKK30gOzsKKworewkubW1pCisJbW92IE02ID0gWQorCW1vdiBNMTMgPSBYCisJbW92IE0zID0gWgorfQorewkubW1pCisJbW92IE04ID0gVworCW1vdiBNNyA9IFYKKwltb3YgTTEwID0gVQorfSA7OworCisubWQ1X0dHX3JvdW5kOgorCUdHNCgubWQ1X0dHX3JvdW5kKQorCisvLyBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIHNodWZmbGVzIHRoZSBibG9jayBjb25zdGFudHMgcm91bmQgZm9yIHRoZQorLy8gbmV4dCByb3VuZDoKKy8vCisvLyAxIDYgMTEgMCA1IDEwIDE0IDQgOSAxNCAzIDggMTMgMiA3IDEyCisvLyA1IDggMTEgMTQgMSA0IDcgMTAgMTMgMCAzIDYgOSAxMiAxNSAyCisKK3sJLm1taQorCW1vdiBaID0gTTAKKwltb3YgWSA9IE0xCisJbW92IGFyLmxjID0gMworfQorewkubW1pCisJbW92IFggPSBNMworCW1vdiBXID0gTTUKKwltb3YgViA9IE02Cit9IDs7CisKK3sJLm1taQorCW1vdiBNMCA9IE00CisJbW92IE0xID0gTTExCisJbW92IGFyLmVjID0gMQorfQorewkubW1pCisJbW92IE0zID0gTTkKKwltb3YgVSA9IE04CisJbW92IFQgPSBNMTMKK30gOzsKKworewkubW1pCisJbW92IE00ID0gWgorCW1vdiBNMTEgPSBZCisJbW92IE01ID0gTTcKK30KK3sJLm1taQorCW1vdiBNNiA9IE0xNAorCW1vdiBNOCA9IE0xMgorCW1vdiBNMTMgPSBNMTUKK30gOzsKKworewkubW1pCisJbW92IE03ID0gVworCW1vdiBNMTQgPSBWCisJbm9wIDB4MAorfQorewkubW1pCisJbW92IE05ID0gWAorCW1vdiBNMTIgPSBVCisJbW92IE0xNSA9IFQKK30gOzsKKworLm1kNV9ISF9yb3VuZDoKKwlISDQoLm1kNV9ISF9yb3VuZCkKKworLy8gVGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBzaHVmZmxlcyB0aGUgYmxvY2sgY29uc3RhbnRzIHJvdW5kIGZvciB0aGUKKy8vIG5leHQgcm91bmQ6CisvLworLy8gNSA4IDExIDE0IDEgNCA3IDEwIDEzIDAgMyA2IDkgMTIgMTUgMgorLy8gMCA3IDE0IDUgMTIgMyAxMCAxIDggMTUgNiAxMyA0IDExIDIgOQorCit7CS5tbWkKKwltb3YgWiA9IE0wCisJbW92IFkgPSBNMTUKKwltb3YgYXIubGMgPSAzCit9Cit7CS5tbWkKKwltb3YgWCA9IE0xMAorCW1vdiBXID0gTTEKKwltb3YgViA9IE00Cit9IDs7CisKK3sJLm1taQorCW1vdiBNMCA9IE05CisJbW92IE0xNSA9IE0xMgorCW1vdiBhci5lYyA9IDEKK30KK3sJLm1taQorCW1vdiBNMTAgPSBNMTEKKwltb3YgTTEgPSBNNgorCW1vdiBNNCA9IE0xMworfSA7OworCit7CS5tbWkKKwltb3YgTTkgPSBNMTQKKwltb3YgTTEyID0gTTUKKwltb3YgVSA9IE0zCit9Cit7CS5tbWkKKwltb3YgTTExID0gTTgKKwltb3YgTTYgPSBNNworCW1vdiBNMTMgPSBNMgorfSA7OworCit7CS5tbWkKKwltb3YgTTE0ID0gWQorCW1vdiBNNSA9IFgKKwltb3YgTTMgPSBaCit9Cit7CS5tbWkKKwltb3YgTTggPSBXCisJbW92IE03ID0gVgorCW1vdiBNMiA9IFUKK30gOzsKKworLm1kNV9JSV9yb3VuZDoKKwlJSTQoLm1kNV9JSV9yb3VuZCkKKworewkubWliCisJbm9wIDB4MAorCW5vcCAweDAKKwlici5yZXQuc3B0ay5tYW55IFFVSUNLX1JUTgorfSA7OworCisJLmVuZHAgbWQ1X2RpZ2VzdF9HSEkKKworI2RlZmluZSBGRkxPQURVKGEsIGIsIGMsIGQsIE0sIFAsIE4sIHMsIG9mZnNldCkJXAorewkubWlpIDsJCQkJCVwKKyhwTW9yZSkgbGQ0IE4gPSBbRFB0cl0sIDQgOwkJCVwKKwlhZGQgWiA9IE0sIFRSb3VuZCA7CQkJXAorCWFuZCBZID0gYywgYiA7CQkJCVwKK30JCQkJCQlcCit7CS5tbWkgOwkJCQkJXAorCWFuZGNtIFggPSBkLCBiIDs7CQkJXAorCWFkZCBaID0gWiwgYSA7CQkJCVwKKwlvciBZID0gWSwgWCA7CQkJCVwKK30gOzsJCQkJCQlcCit7CS5taWkgOwkJCQkJXAorCWxkNCBUUm91bmQgPSBbVFB0cl0sIDQgOwkJXAorCUdFVExXKFcsIFAsIG9mZnNldCkgOwkJCVwKKwlhZGQgWiA9IFosIFkgOwkJCQlcCit9IDs7CQkJCQkJXAorewkubWlpIDsJCQkJCVwKKwlvciBXID0gVywgRFRtcCA7CQkJXAorCWRlcC56IFkgPSBaLCAzMiwgMzIgOzsJCQlcCisJc2hycCBaID0gWiwgWSwgNjQgLSBzIDsJCQlcCit9IDs7CQkJCQkJXAorewkubWlpIDsJCQkJCVwKKwlhZGQgYSA9IFosIGIgOwkJCQlcCisJR0VUUlcoRFRtcCwgUCwgb2Zmc2V0KSA7CQlcCisJbW92IFAgPSBXIDsJCQkJXAorfSA7OworCisjZGVmaW5lIEZGTE9PUFUoYSwgYiwgYywgZCwgTSwgUCwgTiwgcywgb2Zmc2V0KQkJXAorewkubWlpIDsJCQkJCQlcCisocE1vcmUpIGxkNCBOID0gW0RQdHJdLCA0IDsJCQkJXAorCWFkZCBaID0gTSwgVFJvdW5kIDsJCQkJXAorCWFuZCBZID0gYywgYiA7CQkJCQlcCit9CQkJCQkJCVwKK3sJLm1taSA7CQkJCQkJXAorCWFuZGNtIFggPSBkLCBiIDs7CQkJCVwKKwlhZGQgWiA9IFosIGEgOwkJCQkJXAorCW9yIFkgPSBZLCBYIDsJCQkJCVwKK30gOzsJCQkJCQkJXAorewkubWlpIDsJCQkJCQlcCisJbGQ0IFRSb3VuZCA9IFtUUHRyXSwgNCA7CQkJXAorKHBNb3JlKSBHRVRMVyhXLCBQLCBvZmZzZXQpIAk7CQkJXAorCWFkZCBaID0gWiwgWSA7CQkJCQlcCit9IDs7CQkJCQkJCVwKK3sJLm1paSA7CQkJCQkJXAorKHBNb3JlKSBvciBXID0gVywgRFRtcCA7CQkJCVwKKwlkZXAueiBZID0gWiwgMzIsIDMyIDs7CQkJCVwKKwlzaHJwIFogPSBaLCBZLCA2NCAtIHMgOwkJCQlcCit9IDs7CQkJCQkJCVwKK3sJLm1paSA7CQkJCQkJXAorCWFkZCBhID0gWiwgYiA7CQkJCQlcCisocE1vcmUpIEdFVFJXKERUbXAsIFAsIG9mZnNldCkgCTsJCQlcCisocE1vcmUpIG1vdiBQID0gVyA7CQkJCQlcCit9CQkJCQkJCVwKK3sJLm1pYiA7CQkJCQkJXAorCWNtcC5uZSBwTW9yZSwgcDAgPSAwLCBMVHJpcCA7CQkJXAorCWFkZCBMVHJpcCA9IC0xLCBMVHJpcCA7CQkJCVwKKwlici5jdG9wLnNwdGsubWFueSAubWQ1X0ZGX3JvdW5kIyNvZmZzZXQgOwlcCit9IDs7CisKKyNkZWZpbmUgTUQ1RkJMT0NLKG9mZnNldCkJCQkJCQlcCisJLnR5cGUgbWQ1X2RpZ2VzdF9ibG9jayMjb2Zmc2V0LCBAZnVuY3Rpb24gOwkJCVwKKwkJCQkJCQkJCVwKKwkuYWxpZ24gMzIgOwkJCQkJCQlcCisJLnByb2MgbWQ1X2RpZ2VzdF9ibG9jayMjb2Zmc2V0IDsJCQkJXAorCS5wcm9sb2d1ZSA7CQkJCQkJCVwKKwkuYWx0cnAgUVVJQ0tfUlROIDsJCQkJCQlcCisJLmJvZHkgOwkJCQkJCQkJXAorbWQ1X2RpZ2VzdF9ibG9jayMjb2Zmc2V0OgkJCQkJCVwKK3sJLm1taSA7CQkJCQkJCQlcCisJYWxsb2MgUEZTID0gYXIucGZzLCBfTklOUFVUUywgX05MT0NBTFMsIF9OT1VUUFVULCBfTlJPVEFURSA7CVwKKwltb3YgTFRyaXAgPSAyIDsJCQkJCQkJXAorCW1vdiBhci5sYyA9IDMgOwkJCQkJCQlcCit9IDs7CQkJCQkJCQkJXAorewkubWlpIDsJCQkJCQkJCVwKKwljbXAuZXEgcE1vcmUsIHAwID0gcjAsIHIwIDsJCQkJCVwKKwltb3YgYXIuZWMgPSAwIDsJCQkJCQkJXAorCW5vcCAweDAgOwkJCQkJCQlcCit9IDs7CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorCS5wcmVkLnJlbCAibXV0ZXgiLCBwTG9hZCwgcFNraXAgOwkJCQlcCisubWQ1X0ZGX3JvdW5kIyNvZmZzZXQ6CQkJCQkJCVwKKwlGRkxPQURVKEEsIEIsIEMsIEQsIE0xMiwgTTEzLCBSb3RhdGVNMCwgNywgb2Zmc2V0KQkJXAorCUZGTE9BRFUoRCwgQSwgQiwgQywgTTEzLCBNMTQsIFJvdGF0ZU0xLCAxMiwgb2Zmc2V0KQkJXAorCUZGTE9BRFUoQywgRCwgQSwgQiwgTTE0LCBNMTUsIFJvdGF0ZU0yLCAxNywgb2Zmc2V0KQkJXAorCUZGTE9PUFUoQiwgQywgRCwgQSwgTTE1LCBSb3RhdGVNMCwgUm90YXRlTTMsIDIyLCBvZmZzZXQpCVwKKwkJCQkJCQkJCVwKK3sJLm1pYiA7CQkJCQkJCQlcCisJbm9wIDB4MCA7CQkJCQkJCVwKKwlub3AgMHgwIDsJCQkJCQkJXAorCWJyLmNvbmQuc3B0ay5tYW55IG1kNV9kaWdlc3RfR0hJIDsJCQkJXAorfSA7OwkJCQkJCQkJCVwKKwkuZW5kcCBtZDVfZGlnZXN0X2Jsb2NrIyNvZmZzZXQKKworTUQ1RkJMT0NLKDEpCitNRDVGQkxPQ0soMikKK01ENUZCTE9DSygzKQorCisJLmFsaWduIDY0CisJLnR5cGUgbWQ1X2NvbnN0YW50cywgQG9iamVjdAorbWQ1X2NvbnN0YW50czoKKy5tZDVfdGJsX2RhdGFfb3JkZXI6CQkJLy8gVG8gZW5zdXJlIGxpdHRsZS1lbmRpYW4gZGF0YQorCQkJCQkvLyBvcmRlciwgY29kZSBhcyBieXRlcy4KKwlkYXRhMSAweDc4LCAweGE0LCAweDZhLCAweGQ3CS8vICAgICAwCisJZGF0YTEgMHg1NiwgMHhiNywgMHhjNywgMHhlOAkvLyAgICAgMQorCWRhdGExIDB4ZGIsIDB4NzAsIDB4MjAsIDB4MjQJLy8gICAgIDIKKwlkYXRhMSAweGVlLCAweGNlLCAweGJkLCAweGMxCS8vICAgICAzCisJZGF0YTEgMHhhZiwgMHgwZiwgMHg3YywgMHhmNQkvLyAgICAgNAorCWRhdGExIDB4MmEsIDB4YzYsIDB4ODcsIDB4NDcJLy8gICAgIDUKKwlkYXRhMSAweDEzLCAweDQ2LCAweDMwLCAweGE4CS8vICAgICA2CisJZGF0YTEgMHgwMSwgMHg5NSwgMHg0NiwgMHhmZAkvLyAgICAgNworCWRhdGExIDB4ZDgsIDB4OTgsIDB4ODAsIDB4NjkJLy8gICAgIDgKKwlkYXRhMSAweGFmLCAweGY3LCAweDQ0LCAweDhiCS8vICAgICA5CisJZGF0YTEgMHhiMSwgMHg1YiwgMHhmZiwgMHhmZgkvLyAgICAxMAorCWRhdGExIDB4YmUsIDB4ZDcsIDB4NWMsIDB4ODkJLy8gICAgMTEKKwlkYXRhMSAweDIyLCAweDExLCAweDkwLCAweDZiCS8vICAgIDEyCisJZGF0YTEgMHg5MywgMHg3MSwgMHg5OCwgMHhmZAkvLyAgICAxMworCWRhdGExIDB4OGUsIDB4NDMsIDB4NzksIDB4YTYJLy8gICAgMTQKKwlkYXRhMSAweDIxLCAweDA4LCAweGI0LCAweDQ5CS8vICAgIDE1CisJZGF0YTEgMHg2MiwgMHgyNSwgMHgxZSwgMHhmNgkvLyAgICAxNgorCWRhdGExIDB4NDAsIDB4YjMsIDB4NDAsIDB4YzAJLy8gICAgMTcKKwlkYXRhMSAweDUxLCAweDVhLCAweDVlLCAweDI2CS8vICAgIDE4CisJZGF0YTEgMHhhYSwgMHhjNywgMHhiNiwgMHhlOQkvLyAgICAxOQorCWRhdGExIDB4NWQsIDB4MTAsIDB4MmYsIDB4ZDYJLy8gICAgMjAKKwlkYXRhMSAweDUzLCAweDE0LCAweDQ0LCAweDAyCS8vICAgIDIxCisJZGF0YTEgMHg4MSwgMHhlNiwgMHhhMSwgMHhkOAkvLyAgICAyMgorCWRhdGExIDB4YzgsIDB4ZmIsIDB4ZDMsIDB4ZTcJLy8gICAgMjMKKwlkYXRhMSAweGU2LCAweGNkLCAweGUxLCAweDIxCS8vICAgIDI0CisJZGF0YTEgMHhkNiwgMHgwNywgMHgzNywgMHhjMwkvLyAgICAyNQorCWRhdGExIDB4ODcsIDB4MGQsIDB4ZDUsIDB4ZjQJLy8gICAgMjYKKwlkYXRhMSAweGVkLCAweDE0LCAweDVhLCAweDQ1CS8vICAgIDI3CisJZGF0YTEgMHgwNSwgMHhlOSwgMHhlMywgMHhhOQkvLyAgICAyOAorCWRhdGExIDB4ZjgsIDB4YTMsIDB4ZWYsIDB4ZmMJLy8gICAgMjkKKwlkYXRhMSAweGQ5LCAweDAyLCAweDZmLCAweDY3CS8vICAgIDMwCisJZGF0YTEgMHg4YSwgMHg0YywgMHgyYSwgMHg4ZAkvLyAgICAzMQorCWRhdGExIDB4NDIsIDB4MzksIDB4ZmEsIDB4ZmYJLy8gICAgMzIKKwlkYXRhMSAweDgxLCAweGY2LCAweDcxLCAweDg3CS8vICAgIDMzCisJZGF0YTEgMHgyMiwgMHg2MSwgMHg5ZCwgMHg2ZAkvLyAgICAzNAorCWRhdGExIDB4MGMsIDB4MzgsIDB4ZTUsIDB4ZmQJLy8gICAgMzUKKwlkYXRhMSAweDQ0LCAweGVhLCAweGJlLCAweGE0CS8vICAgIDM2CisJZGF0YTEgMHhhOSwgMHhjZiwgMHhkZSwgMHg0YgkvLyAgICAzNworCWRhdGExIDB4NjAsIDB4NGIsIDB4YmIsIDB4ZjYJLy8gICAgMzgKKwlkYXRhMSAweDcwLCAweGJjLCAweGJmLCAweGJlCS8vICAgIDM5CisJZGF0YTEgMHhjNiwgMHg3ZSwgMHg5YiwgMHgyOAkvLyAgICA0MAorCWRhdGExIDB4ZmEsIDB4MjcsIDB4YTEsIDB4ZWEJLy8gICAgNDEKKwlkYXRhMSAweDg1LCAweDMwLCAweGVmLCAweGQ0CS8vICAgIDQyCisJZGF0YTEgMHgwNSwgMHgxZCwgMHg4OCwgMHgwNAkvLyAgICA0MworCWRhdGExIDB4MzksIDB4ZDAsIDB4ZDQsIDB4ZDkJLy8gICAgNDQKKwlkYXRhMSAweGU1LCAweDk5LCAweGRiLCAweGU2CS8vICAgIDQ1CisJZGF0YTEgMHhmOCwgMHg3YywgMHhhMiwgMHgxZgkvLyAgICA0NgorCWRhdGExIDB4NjUsIDB4NTYsIDB4YWMsIDB4YzQJLy8gICAgNDcKKwlkYXRhMSAweDQ0LCAweDIyLCAweDI5LCAweGY0CS8vICAgIDQ4CisJZGF0YTEgMHg5NywgMHhmZiwgMHgyYSwgMHg0MwkvLyAgICA0OQorCWRhdGExIDB4YTcsIDB4MjMsIDB4OTQsIDB4YWIJLy8gICAgNTAKKwlkYXRhMSAweDM5LCAweGEwLCAweDkzLCAweGZjCS8vICAgIDUxCisJZGF0YTEgMHhjMywgMHg1OSwgMHg1YiwgMHg2NQkvLyAgICA1MgorCWRhdGExIDB4OTIsIDB4Y2MsIDB4MGMsIDB4OGYJLy8gICAgNTMKKwlkYXRhMSAweDdkLCAweGY0LCAweGVmLCAweGZmCS8vICAgIDU0CisJZGF0YTEgMHhkMSwgMHg1ZCwgMHg4NCwgMHg4NQkvLyAgICA1NQorCWRhdGExIDB4NGYsIDB4N2UsIDB4YTgsIDB4NmYJLy8gICAgNTYKKwlkYXRhMSAweGUwLCAweGU2LCAweDJjLCAweGZlCS8vICAgIDU3CisJZGF0YTEgMHgxNCwgMHg0MywgMHgwMSwgMHhhMwkvLyAgICA1OAorCWRhdGExIDB4YTEsIDB4MTEsIDB4MDgsIDB4NGUJLy8gICAgNTkKKwlkYXRhMSAweDgyLCAweDdlLCAweDUzLCAweGY3CS8vICAgIDYwCisJZGF0YTEgMHgzNSwgMHhmMiwgMHgzYSwgMHhiZAkvLyAgICA2MQorCWRhdGExIDB4YmIsIDB4ZDIsIDB4ZDcsIDB4MmEJLy8gICAgNjIKKwlkYXRhMSAweDkxLCAweGQzLCAweDg2LCAweGViCS8vICAgIDYzCisuc2l6ZQltZDVfY29uc3RhbnRzIyw2NCo0CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L2FzbS9tZDUteDg2XzY0LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNS9hc20vbWQ1LXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njc4ODU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNS9hc20vbWQ1LXg4Nl82NC5wbApAQCAtMCwwICsxLDM2OSBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjCisjIE1ENSBvcHRpbWl6ZWQgZm9yIEFNRDY0LgorIworIyBBdXRob3I6IE1hcmMgQmV2YW5kIDxiZXZhbmRfbSAoYXQpIGVwaXRhLmZyPgorIyBMaWNlbmNlOiBJIGhlcmVieSBkaXNjbGFpbSB0aGUgY29weXJpZ2h0IG9uIHRoaXMgY29kZSBhbmQgcGxhY2UgaXQKKyMgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisKK3VzZSBzdHJpY3Q7CisKK215ICRjb2RlOworCisjIHJvdW5kMV9zdGVwKCkgZG9lczoKKyMgICBkc3QgPSB4ICsgKChkc3QgKyBGKHgseSx6KSArIFhba10gKyBUX2kpIDw8PCBzKQorIyAgICVyMTBkID0gWFtrX25leHRdCisjICAgJXIxMWQgPSB6JyAoY29weSBvZiB6IGZvciB0aGUgbmV4dCBzdGVwKQorIyBFYWNoIHJvdW5kMV9zdGVwKCkgdGFrZXMgYWJvdXQgNS4zIGNsb2NrcyAoOSBpbnN0cnVjdGlvbnMsIDEuNyBJUEMpCitzdWIgcm91bmQxX3N0ZXAKK3sKKyAgICBteSAoJHBvcywgJGRzdCwgJHgsICR5LCAkeiwgJGtfbmV4dCwgJFRfaSwgJHMpID0gQF87CisgICAgJGNvZGUgLj0gIiBtb3YJMCo0KCVyc2kpLAklcjEwZAkJLyogKE5FWFQgU1RFUCkgWFswXSAqL1xuIiBpZiAoJHBvcyA9PSAtMSk7CisgICAgJGNvZGUgLj0gIiBtb3YJJWVkeCwJCSVyMTFkCQkvKiAoTkVYVCBTVEVQKSB6JyA9ICVlZHggKi9cbiIgaWYgKCRwb3MgPT0gLTEpOworICAgICRjb2RlIC49IDw8RU9GOworCXhvcgkkeSwJCSVyMTFkCQkvKiB5IF4gLi4uICovCisJbGVhCSRUX2koJGRzdCwlcjEwZCksJGRzdAkJLyogQ29uc3QgKyBkc3QgKyAuLi4gKi8KKwlhbmQJJHgsCQklcjExZAkJLyogeCAmIC4uLiAqLworCXhvcgkkeiwJCSVyMTFkCQkvKiB6IF4gLi4uICovCisJbW92CSRrX25leHQqNCglcnNpKSwlcjEwZAkJLyogKE5FWFQgU1RFUCkgWFska19uZXh0XSAqLworCWFkZAklcjExZCwJCSRkc3QJCS8qIGRzdCArPSAuLi4gKi8KKwlyb2wJXCQkcywJCSRkc3QJCS8qIGRzdCA8PDwgcyAqLworCW1vdgkkeSwJCSVyMTFkCQkvKiAoTkVYVCBTVEVQKSB6JyA9ICR5ICovCisJYWRkCSR4LAkJJGRzdAkJLyogZHN0ICs9IHggKi8KK0VPRgorfQorCisjIHJvdW5kMl9zdGVwKCkgZG9lczoKKyMgICBkc3QgPSB4ICsgKChkc3QgKyBHKHgseSx6KSArIFhba10gKyBUX2kpIDw8PCBzKQorIyAgICVyMTBkID0gWFtrX25leHRdCisjICAgJXIxMWQgPSB6JyAoY29weSBvZiB6IGZvciB0aGUgbmV4dCBzdGVwKQorIyAgICVyMTJkID0geicgKGNvcHkgb2YgeiBmb3IgdGhlIG5leHQgc3RlcCkKKyMgRWFjaCByb3VuZDJfc3RlcCgpIHRha2VzIGFib3V0IDUuNCBjbG9ja3MgKDExIGluc3RydWN0aW9ucywgMi4wIElQQykKK3N1YiByb3VuZDJfc3RlcAoreworICAgIG15ICgkcG9zLCAkZHN0LCAkeCwgJHksICR6LCAka19uZXh0LCAkVF9pLCAkcykgPSBAXzsKKyAgICAkY29kZSAuPSAiIG1vdgkxKjQoJXJzaSksCSVyMTBkCQkvKiAoTkVYVCBTVEVQKSBYWzFdICovXG4iIGlmICgkcG9zID09IC0xKTsKKyAgICAkY29kZSAuPSAiIG1vdgklZWR4LAkJJXIxMWQJCS8qIChORVhUIFNURVApIHonID0gJWVkeCAqL1xuIiBpZiAoJHBvcyA9PSAtMSk7CisgICAgJGNvZGUgLj0gIiBtb3YJJWVkeCwJCSVyMTJkCQkvKiAoTkVYVCBTVEVQKSB6JyA9ICVlZHggKi9cbiIgaWYgKCRwb3MgPT0gLTEpOworICAgICRjb2RlIC49IDw8RU9GOworCW5vdAklcjExZAkJCQkvKiBub3QgeiAqLworCWxlYQkkVF9pKCRkc3QsJXIxMGQpLCRkc3QJCS8qIENvbnN0ICsgZHN0ICsgLi4uICovCisJYW5kCSR4LAkJJXIxMmQJCS8qIHggJiB6ICovCisJYW5kCSR5LAkJJXIxMWQJCS8qIHkgJiAobm90IHopICovCisJbW92CSRrX25leHQqNCglcnNpKSwlcjEwZAkJLyogKE5FWFQgU1RFUCkgWFska19uZXh0XSAqLworCW9yCSVyMTFkLAkJJXIxMmQJCS8qICh5ICYgKG5vdCB6KSkgfCAoeCAmIHopICovCisJbW92CSR5LAkJJXIxMWQJCS8qIChORVhUIFNURVApIHonID0gJHkgKi8KKwlhZGQJJXIxMmQsCQkkZHN0CQkvKiBkc3QgKz0gLi4uICovCisJbW92CSR5LAkJJXIxMmQJCS8qIChORVhUIFNURVApIHonID0gJHkgKi8KKwlyb2wJXCQkcywJCSRkc3QJCS8qIGRzdCA8PDwgcyAqLworCWFkZAkkeCwJCSRkc3QJCS8qIGRzdCArPSB4ICovCitFT0YKK30KKworIyByb3VuZDNfc3RlcCgpIGRvZXM6CisjICAgZHN0ID0geCArICgoZHN0ICsgSCh4LHkseikgKyBYW2tdICsgVF9pKSA8PDwgcykKKyMgICAlcjEwZCA9IFhba19uZXh0XQorIyAgICVyMTFkID0geScgKGNvcHkgb2YgeSBmb3IgdGhlIG5leHQgc3RlcCkKKyMgRWFjaCByb3VuZDNfc3RlcCgpIHRha2VzIGFib3V0IDQuMiBjbG9ja3MgKDggaW5zdHJ1Y3Rpb25zLCAxLjkgSVBDKQorc3ViIHJvdW5kM19zdGVwCit7CisgICAgbXkgKCRwb3MsICRkc3QsICR4LCAkeSwgJHosICRrX25leHQsICRUX2ksICRzKSA9IEBfOworICAgICRjb2RlIC49ICIgbW92CTUqNCglcnNpKSwJJXIxMGQJCS8qIChORVhUIFNURVApIFhbNV0gKi9cbiIgaWYgKCRwb3MgPT0gLTEpOworICAgICRjb2RlIC49ICIgbW92CSVlY3gsCQklcjExZAkJLyogKE5FWFQgU1RFUCkgeScgPSAlZWN4ICovXG4iIGlmICgkcG9zID09IC0xKTsKKyAgICAkY29kZSAuPSA8PEVPRjsKKwlsZWEJJFRfaSgkZHN0LCVyMTBkKSwkZHN0CQkvKiBDb25zdCArIGRzdCArIC4uLiAqLworCW1vdgkka19uZXh0KjQoJXJzaSksJXIxMGQJCS8qIChORVhUIFNURVApIFhbJGtfbmV4dF0gKi8KKwl4b3IJJHosCQklcjExZAkJLyogeiBeIC4uLiAqLworCXhvcgkkeCwJCSVyMTFkCQkvKiB4IF4gLi4uICovCisJYWRkCSVyMTFkLAkJJGRzdAkJLyogZHN0ICs9IC4uLiAqLworCXJvbAlcJCRzLAkJJGRzdAkJLyogZHN0IDw8PCBzICovCisJbW92CSR4LAkJJXIxMWQJCS8qIChORVhUIFNURVApIHknID0gJHggKi8KKwlhZGQJJHgsCQkkZHN0CQkvKiBkc3QgKz0geCAqLworRU9GCit9CisKKyMgcm91bmQ0X3N0ZXAoKSBkb2VzOgorIyAgIGRzdCA9IHggKyAoKGRzdCArIEkoeCx5LHopICsgWFtrXSArIFRfaSkgPDw8IHMpCisjICAgJXIxMGQgPSBYW2tfbmV4dF0KKyMgICAlcjExZCA9IG5vdCB6JyAoY29weSBvZiBub3QgeiBmb3IgdGhlIG5leHQgc3RlcCkKKyMgRWFjaCByb3VuZDRfc3RlcCgpIHRha2VzIGFib3V0IDUuMiBjbG9ja3MgKDkgaW5zdHJ1Y3Rpb25zLCAxLjcgSVBDKQorc3ViIHJvdW5kNF9zdGVwCit7CisgICAgbXkgKCRwb3MsICRkc3QsICR4LCAkeSwgJHosICRrX25leHQsICRUX2ksICRzKSA9IEBfOworICAgICRjb2RlIC49ICIgbW92CTAqNCglcnNpKSwJJXIxMGQJCS8qIChORVhUIFNURVApIFhbMF0gKi9cbiIgaWYgKCRwb3MgPT0gLTEpOworICAgICRjb2RlIC49ICIgbW92CVwkMHhmZmZmZmZmZiwJJXIxMWRcbiIgaWYgKCRwb3MgPT0gLTEpOworICAgICRjb2RlIC49ICIgeG9yCSVlZHgsCQklcjExZAkJLyogKE5FWFQgU1RFUCkgbm90IHonID0gbm90ICVlZHgqL1xuIgorICAgIGlmICgkcG9zID09IC0xKTsKKyAgICAkY29kZSAuPSA8PEVPRjsKKwlsZWEJJFRfaSgkZHN0LCVyMTBkKSwkZHN0CQkvKiBDb25zdCArIGRzdCArIC4uLiAqLworCW9yCSR4LAkJJXIxMWQJCS8qIHggfCAuLi4gKi8KKwl4b3IJJHksCQklcjExZAkJLyogeSBeIC4uLiAqLworCWFkZAklcjExZCwJCSRkc3QJCS8qIGRzdCArPSAuLi4gKi8KKwltb3YJJGtfbmV4dCo0KCVyc2kpLCVyMTBkCQkvKiAoTkVYVCBTVEVQKSBYWyRrX25leHRdICovCisJbW92CVwkMHhmZmZmZmZmZiwJJXIxMWQKKwlyb2wJXCQkcywJCSRkc3QJCS8qIGRzdCA8PDwgcyAqLworCXhvcgkkeSwJCSVyMTFkCQkvKiAoTkVYVCBTVEVQKSBub3QgeicgPSBub3QgJHkgKi8KKwlhZGQJJHgsCQkkZHN0CQkvKiBkc3QgKz0geCAqLworRU9GCit9CisKK215ICRmbGF2b3VyID0gc2hpZnQ7CitteSAkb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCitteSAkd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyBteSAkZGlyPSQxOyBteSAkeGxhdGU7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK25vIHdhcm5pbmdzIHF3KHVuaW5pdGlhbGl6ZWQpOworb3BlbiBTVERPVVQsInwgJF5YICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKworJGNvZGUgLj0gPDxFT0Y7CisudGV4dAorLmFsaWduIDE2CisKKy5nbG9ibCBtZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIKKy50eXBlIG1kNV9ibG9ja19hc21fZGF0YV9vcmRlcixcQGZ1bmN0aW9uLDMKK21kNV9ibG9ja19hc21fZGF0YV9vcmRlcjoKKwlwdXNoCSVyYnAKKwlwdXNoCSVyYngKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKy5McHJvbG9ndWU6CisKKwkjIHJkaSA9IGFyZyAjMSAoY3R4LCBNRDVfQ1RYIHBvaW50ZXIpCisJIyByc2kgPSBhcmcgIzIgKHB0ciwgZGF0YSBwb2ludGVyKQorCSMgcmR4ID0gYXJnICMzIChuYnIsIG51bWJlciBvZiAxNi13b3JkIGJsb2NrcyB0byBwcm9jZXNzKQorCW1vdgklcmRpLAkJJXJicAkjIHJicCA9IGN0eAorCXNobAlcJDYsCQklcmR4CSMgcmR4ID0gbmJyIGluIGJ5dGVzCisJbGVhCSglcnNpLCVyZHgpLAklcmRpCSMgcmRpID0gZW5kCisJbW92CTAqNCglcmJwKSwJJWVheAkjIGVheCA9IGN0eC0+QQorCW1vdgkxKjQoJXJicCksCSVlYngJIyBlYnggPSBjdHgtPkIKKwltb3YJMio0KCVyYnApLAklZWN4CSMgZWN4ID0gY3R4LT5DCisJbW92CTMqNCglcmJwKSwJJWVkeAkjIGVkeCA9IGN0eC0+RAorCSMgZW5kIGlzICdyZGknCisJIyBwdHIgaXMgJ3JzaScKKwkjIEEgaXMgJ2VheCcKKwkjIEIgaXMgJ2VieCcKKwkjIEMgaXMgJ2VjeCcKKwkjIEQgaXMgJ2VkeCcKKworCWNtcAklcmRpLAkJJXJzaQkJIyBjbXAgZW5kIHdpdGggcHRyCisJamUJLkxlbmQJCQkJIyBqbXAgaWYgcHRyID09IGVuZAorCisJIyBCRUdJTiBvZiBsb29wIG92ZXIgMTYtd29yZCBibG9ja3MKKy5MbG9vcDoJIyBzYXZlIG9sZCB2YWx1ZXMgb2YgQSwgQiwgQywgRAorCW1vdgklZWF4LAkJJXI4ZAorCW1vdgklZWJ4LAkJJXI5ZAorCW1vdgklZWN4LAkJJXIxNGQKKwltb3YJJWVkeCwJCSVyMTVkCitFT0YKK3JvdW5kMV9zdGVwKC0xLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzEnLCcweGQ3NmFhNDc4JywgJzcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywgJzInLCcweGU4YzdiNzU2JywnMTInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzMnLCcweDI0MjA3MGRiJywnMTcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzQnLCcweGMxYmRjZWVlJywnMjInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzUnLCcweGY1N2MwZmFmJywgJzcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywgJzYnLCcweDQ3ODdjNjJhJywnMTInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzcnLCcweGE4MzA0NjEzJywnMTcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzgnLCcweGZkNDY5NTAxJywnMjInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzknLCcweDY5ODA5OGQ4JywgJzcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywnMTAnLCcweDhiNDRmN2FmJywnMTInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywnMTEnLCcweGZmZmY1YmIxJywnMTcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywnMTInLCcweDg5NWNkN2JlJywnMjInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywnMTMnLCcweDZiOTAxMTIyJywgJzcnKTsKK3JvdW5kMV9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywnMTQnLCcweGZkOTg3MTkzJywnMTInKTsKK3JvdW5kMV9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywnMTUnLCcweGE2Nzk0MzhlJywnMTcnKTsKK3JvdW5kMV9zdGVwKCAxLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzAnLCcweDQ5YjQwODIxJywnMjInKTsKKworcm91bmQyX3N0ZXAoLTEsJyVlYXgnLCclZWJ4JywnJWVjeCcsJyVlZHgnLCAnNicsJzB4ZjYxZTI1NjInLCAnNScpOworcm91bmQyX3N0ZXAoIDAsJyVlZHgnLCclZWF4JywnJWVieCcsJyVlY3gnLCcxMScsJzB4YzA0MGIzNDAnLCAnOScpOworcm91bmQyX3N0ZXAoIDAsJyVlY3gnLCclZWR4JywnJWVheCcsJyVlYngnLCAnMCcsJzB4MjY1ZTVhNTEnLCcxNCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYngnLCclZWN4JywnJWVkeCcsJyVlYXgnLCAnNScsJzB4ZTliNmM3YWEnLCcyMCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYXgnLCclZWJ4JywnJWVjeCcsJyVlZHgnLCcxMCcsJzB4ZDYyZjEwNWQnLCAnNScpOworcm91bmQyX3N0ZXAoIDAsJyVlZHgnLCclZWF4JywnJWVieCcsJyVlY3gnLCcxNScsICcweDI0NDE0NTMnLCAnOScpOworcm91bmQyX3N0ZXAoIDAsJyVlY3gnLCclZWR4JywnJWVheCcsJyVlYngnLCAnNCcsJzB4ZDhhMWU2ODEnLCcxNCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYngnLCclZWN4JywnJWVkeCcsJyVlYXgnLCAnOScsJzB4ZTdkM2ZiYzgnLCcyMCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYXgnLCclZWJ4JywnJWVjeCcsJyVlZHgnLCcxNCcsJzB4MjFlMWNkZTYnLCAnNScpOworcm91bmQyX3N0ZXAoIDAsJyVlZHgnLCclZWF4JywnJWVieCcsJyVlY3gnLCAnMycsJzB4YzMzNzA3ZDYnLCAnOScpOworcm91bmQyX3N0ZXAoIDAsJyVlY3gnLCclZWR4JywnJWVheCcsJyVlYngnLCAnOCcsJzB4ZjRkNTBkODcnLCcxNCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYngnLCclZWN4JywnJWVkeCcsJyVlYXgnLCcxMycsJzB4NDU1YTE0ZWQnLCcyMCcpOworcm91bmQyX3N0ZXAoIDAsJyVlYXgnLCclZWJ4JywnJWVjeCcsJyVlZHgnLCAnMicsJzB4YTllM2U5MDUnLCAnNScpOworcm91bmQyX3N0ZXAoIDAsJyVlZHgnLCclZWF4JywnJWVieCcsJyVlY3gnLCAnNycsJzB4ZmNlZmEzZjgnLCAnOScpOworcm91bmQyX3N0ZXAoIDAsJyVlY3gnLCclZWR4JywnJWVheCcsJyVlYngnLCcxMicsJzB4Njc2ZjAyZDknLCcxNCcpOworcm91bmQyX3N0ZXAoIDEsJyVlYngnLCclZWN4JywnJWVkeCcsJyVlYXgnLCAnMCcsJzB4OGQyYTRjOGEnLCcyMCcpOworCityb3VuZDNfc3RlcCgtMSwnJWVheCcsJyVlYngnLCclZWN4JywnJWVkeCcsICc4JywnMHhmZmZhMzk0MicsICc0Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVkeCcsJyVlYXgnLCclZWJ4JywnJWVjeCcsJzExJywnMHg4NzcxZjY4MScsJzExJyk7Cityb3VuZDNfc3RlcCggMCwnJWVjeCcsJyVlZHgnLCclZWF4JywnJWVieCcsJzE0JywnMHg2ZDlkNjEyMicsJzE2Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVieCcsJyVlY3gnLCclZWR4JywnJWVheCcsICcxJywnMHhmZGU1MzgwYycsJzIzJyk7Cityb3VuZDNfc3RlcCggMCwnJWVheCcsJyVlYngnLCclZWN4JywnJWVkeCcsICc0JywnMHhhNGJlZWE0NCcsICc0Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVkeCcsJyVlYXgnLCclZWJ4JywnJWVjeCcsICc3JywnMHg0YmRlY2ZhOScsJzExJyk7Cityb3VuZDNfc3RlcCggMCwnJWVjeCcsJyVlZHgnLCclZWF4JywnJWVieCcsJzEwJywnMHhmNmJiNGI2MCcsJzE2Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVieCcsJyVlY3gnLCclZWR4JywnJWVheCcsJzEzJywnMHhiZWJmYmM3MCcsJzIzJyk7Cityb3VuZDNfc3RlcCggMCwnJWVheCcsJyVlYngnLCclZWN4JywnJWVkeCcsICcwJywnMHgyODliN2VjNicsICc0Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVkeCcsJyVlYXgnLCclZWJ4JywnJWVjeCcsICczJywnMHhlYWExMjdmYScsJzExJyk7Cityb3VuZDNfc3RlcCggMCwnJWVjeCcsJyVlZHgnLCclZWF4JywnJWVieCcsICc2JywnMHhkNGVmMzA4NScsJzE2Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVieCcsJyVlY3gnLCclZWR4JywnJWVheCcsICc5JywgJzB4NDg4MWQwNScsJzIzJyk7Cityb3VuZDNfc3RlcCggMCwnJWVheCcsJyVlYngnLCclZWN4JywnJWVkeCcsJzEyJywnMHhkOWQ0ZDAzOScsICc0Jyk7Cityb3VuZDNfc3RlcCggMCwnJWVkeCcsJyVlYXgnLCclZWJ4JywnJWVjeCcsJzE1JywnMHhlNmRiOTllNScsJzExJyk7Cityb3VuZDNfc3RlcCggMCwnJWVjeCcsJyVlZHgnLCclZWF4JywnJWVieCcsICcyJywnMHgxZmEyN2NmOCcsJzE2Jyk7Cityb3VuZDNfc3RlcCggMSwnJWVieCcsJyVlY3gnLCclZWR4JywnJWVheCcsICcwJywnMHhjNGFjNTY2NScsJzIzJyk7CisKK3JvdW5kNF9zdGVwKC0xLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzcnLCcweGY0MjkyMjQ0JywgJzYnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywnMTQnLCcweDQzMmFmZjk3JywnMTAnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzUnLCcweGFiOTQyM2E3JywnMTUnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywnMTInLCcweGZjOTNhMDM5JywnMjEnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywgJzMnLCcweDY1NWI1OWMzJywgJzYnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywnMTAnLCcweDhmMGNjYzkyJywnMTAnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzEnLCcweGZmZWZmNDdkJywnMTUnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzgnLCcweDg1ODQ1ZGQxJywnMjEnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywnMTUnLCcweDZmYTg3ZTRmJywgJzYnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywgJzYnLCcweGZlMmNlNmUwJywnMTAnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywnMTMnLCcweGEzMDE0MzE0JywnMTUnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzQnLCcweDRlMDgxMWExJywnMjEnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWF4JywnJWVieCcsJyVlY3gnLCclZWR4JywnMTEnLCcweGY3NTM3ZTgyJywgJzYnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWR4JywnJWVheCcsJyVlYngnLCclZWN4JywgJzInLCcweGJkM2FmMjM1JywnMTAnKTsKK3JvdW5kNF9zdGVwKCAwLCclZWN4JywnJWVkeCcsJyVlYXgnLCclZWJ4JywgJzknLCcweDJhZDdkMmJiJywnMTUnKTsKK3JvdW5kNF9zdGVwKCAxLCclZWJ4JywnJWVjeCcsJyVlZHgnLCclZWF4JywgJzAnLCcweGViODZkMzkxJywnMjEnKTsKKyRjb2RlIC49IDw8RU9GOworCSMgYWRkIG9sZCB2YWx1ZXMgb2YgQSwgQiwgQywgRAorCWFkZAklcjhkLAklZWF4CisJYWRkCSVyOWQsCSVlYngKKwlhZGQJJXIxNGQsCSVlY3gKKwlhZGQJJXIxNWQsCSVlZHgKKworCSMgbG9vcCBjb250cm9sCisJYWRkCVwkNjQsCQklcnNpCQkjIHB0ciArPSA2NAorCWNtcAklcmRpLAkJJXJzaQkJIyBjbXAgZW5kIHdpdGggcHRyCisJamIJLkxsb29wCQkJCSMgam1wIGlmIHB0ciA8IGVuZAorCSMgRU5EIG9mIGxvb3Agb3ZlciAxNi13b3JkIGJsb2NrcworCisuTGVuZDoKKwltb3YJJWVheCwJCTAqNCglcmJwKQkjIGN0eC0+QSA9IEEKKwltb3YJJWVieCwJCTEqNCglcmJwKQkjIGN0eC0+QiA9IEIKKwltb3YJJWVjeCwJCTIqNCglcmJwKQkjIGN0eC0+QyA9IEMKKwltb3YJJWVkeCwJCTMqNCglcmJwKQkjIGN0eC0+RCA9IEQKKworCW1vdgkoJXJzcCksJXIxNQorCW1vdgk4KCVyc3ApLCVyMTQKKwltb3YJMTYoJXJzcCksJXIxMgorCW1vdgkyNCglcnNwKSwlcmJ4CisJbW92CTMyKCVyc3ApLCVyYnAKKwlhZGQJXCQ0MCwlcnNwCisuTGVwaWxvZ3VlOgorCXJldAorLnNpemUgbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyLC4tbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCitFT0YKKworIyBFWENFUFRJT05fRElTUE9TSVRJT04gaGFuZGxlciAoRVhDRVBUSU9OX1JFQ09SRCAqcmVjLFVMT05HNjQgZnJhbWUsCisjCQlDT05URVhUICpjb250ZXh0LERJU1BBVENIRVJfQ09OVEVYVCAqZGlzcCkKK2lmICgkd2luNjQpIHsKK215ICRyZWM9IiVyY3giOworbXkgJGZyYW1lPSIlcmR4IjsKK215ICRjb250ZXh0PSIlcjgiOworbXkgJGRpc3A9IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JX19pbXBfUnRsVmlydHVhbFVud2luZAorLnR5cGUJc2VfaGFuZGxlcixcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwlsZWEJLkxwcm9sb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8Lkxwcm9sb2d1ZQorCWpiCS5MaW5fcHJvbG9ndWUKKworCW1vdgkxNTIoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJzcAorCisJbGVhCS5MZXBpbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPj0uTGVwaWxvZ3VlCisJamFlCS5MaW5fcHJvbG9ndWUKKworCWxlYQk0MCglcmF4KSwlcmF4CisKKwltb3YJLTgoJXJheCksJXJicAorCW1vdgktMTYoJXJheCksJXJieAorCW1vdgktMjQoJXJheCksJXIxMgorCW1vdgktMzIoJXJheCksJXIxNAorCW1vdgktNDAoJXJheCksJXIxNQorCW1vdgklcmJ4LDE0NCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJieAorCW1vdgklcmJwLDE2MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJicAorCW1vdgklcjEyLDIxNigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxMgorCW1vdgklcjE0LDIzMigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNAorCW1vdgklcjE1LDI0MCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlIxNQorCisuTGluX3Byb2xvZ3VlOgorCW1vdgk4KCVyYXgpLCVyZGkKKwltb3YJMTYoJXJheCksJXJzaQorCW1vdgklcmF4LDE1MigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzcAorCW1vdgklcnNpLDE2OCgkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJzaQorCW1vdgklcmRpLDE3NigkY29udGV4dCkJIyByZXN0b3JlIGNvbnRleHQtPlJkaQorCisJbW92CTQwKCRkaXNwKSwlcmRpCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwltb3YJJGNvbnRleHQsJXJzaQkJIyBjb250ZXh0CisJbW92CVwkMTU0LCVlY3gJCSMgc2l6ZW9mKENPTlRFWFQpCisJLmxvbmcJMHhhNTQ4ZjNmYwkJIyBjbGQ7IHJlcCBtb3ZzcQorCisJbW92CSRkaXNwLCVyc2kKKwl4b3IJJXJjeCwlcmN4CQkjIGFyZzEsIFVOV19GTEFHX05IQU5ETEVSCisJbW92CTgoJXJzaSksJXJkeAkJIyBhcmcyLCBkaXNwLT5JbWFnZUJhc2UKKwltb3YJMCglcnNpKSwlcjgJCSMgYXJnMywgZGlzcC0+Q29udHJvbFBjCisJbW92CTE2KCVyc2kpLCVyOQkJIyBhcmc0LCBkaXNwLT5GdW5jdGlvbkVudHJ5CisJbW92CTQwKCVyc2kpLCVyMTAJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCWxlYQk1NiglcnNpKSwlcjExCQkjICZkaXNwLT5IYW5kbGVyRGF0YQorCWxlYQkyNCglcnNpKSwlcjEyCQkjICZkaXNwLT5Fc3RhYmxpc2hlckZyYW1lCisJbW92CSVyMTAsMzIoJXJzcCkJCSMgYXJnNQorCW1vdgklcjExLDQwKCVyc3ApCQkjIGFyZzYKKwltb3YJJXIxMiw0OCglcnNwKQkJIyBhcmc3CisJbW92CSVyY3gsNTYoJXJzcCkJCSMgYXJnOCwgKE5VTEwpCisJY2FsbAkqX19pbXBfUnRsVmlydHVhbFVud2luZCglcmlwKQorCisJbW92CVwkMSwlZWF4CQkjIEV4Y2VwdGlvbkNvbnRpbnVlU2VhcmNoCisJYWRkCVwkNjQsJXJzcAorCXBvcGZxCisJcG9wCSVyMTUKKwlwb3AJJXIxNAorCXBvcAklcjEzCisJcG9wCSVyMTIKKwlwb3AJJXJicAorCXBvcAklcmJ4CisJcG9wCSVyZGkKKwlwb3AJJXJzaQorCXJldAorLnNpemUJc2VfaGFuZGxlciwuLXNlX2hhbmRsZXIKKworLnNlY3Rpb24JLnBkYXRhCisuYWxpZ24JNAorCS5ydmEJLkxTRUhfYmVnaW5fbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisJLnJ2YQkuTFNFSF9lbmRfbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisJLnJ2YQkuTFNFSF9pbmZvX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcgorCisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvX21kNV9ibG9ja19hc21fZGF0YV9vcmRlcjoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCitfX18KK30KKworcHJpbnQgJGNvZGU7CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvbWQ1LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzczM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L21kNS5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiBjcnlwdG8vbWQ1L21kNS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKKyNkZWZpbmUgQlVGU0laRQkxMDI0KjE2CisKK3ZvaWQgZG9fZnAoRklMRSAqZik7Cit2b2lkIHB0KHVuc2lnbmVkIGNoYXIgKm1kKTsKKyNpZiAhZGVmaW5lZChfT1NEX1BPU0lYKSAmJiAhZGVmaW5lZChfX0RKR1BQX18pCitpbnQgcmVhZChpbnQsIHZvaWQgKiwgdW5zaWduZWQgaW50KTsKKyNlbmRpZgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCWludCBpLGVycj0wOworCUZJTEUgKklOOworCisJaWYgKGFyZ2MgPT0gMSkKKwkJeworCQlkb19mcChzdGRpbik7CisJCX0KKwllbHNlCisJCXsKKwkJZm9yIChpPTE7IGk8YXJnYzsgaSsrKQorCQkJeworCQkJSU49Zm9wZW4oYXJndltpXSwiciIpOworCQkJaWYgKElOID09IE5VTEwpCisJCQkJeworCQkJCXBlcnJvcihhcmd2W2ldKTsKKwkJCQllcnIrKzsKKwkJCQljb250aW51ZTsKKwkJCQl9CisJCQlwcmludGYoIk1ENSglcyk9ICIsYXJndltpXSk7CisJCQlkb19mcChJTik7CisJCQlmY2xvc2UoSU4pOworCQkJfQorCQl9CisJZXhpdChlcnIpOworCX0KKwordm9pZCBkb19mcChGSUxFICpmKQorCXsKKwlNRDVfQ1RYIGM7CisJdW5zaWduZWQgY2hhciBtZFtNRDVfRElHRVNUX0xFTkdUSF07CisJaW50IGZkOworCWludCBpOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFXTsKKworCWZkPWZpbGVubyhmKTsKKwlNRDVfSW5pdCgmYyk7CisJZm9yICg7OykKKwkJeworCQlpPXJlYWQoZmQsYnVmLEJVRlNJWkUpOworCQlpZiAoaSA8PSAwKSBicmVhazsKKwkJTUQ1X1VwZGF0ZSgmYyxidWYsKHVuc2lnbmVkIGxvbmcpaSk7CisJCX0KKwlNRDVfRmluYWwoJihtZFswXSksJmMpOworCXB0KG1kKTsKKwl9CisKK3ZvaWQgcHQodW5zaWduZWQgY2hhciAqbWQpCisJeworCWludCBpOworCisJZm9yIChpPTA7IGk8TUQ1X0RJR0VTVF9MRU5HVEg7IGkrKykKKwkJcHJpbnRmKCIlMDJ4IixtZFtpXSk7CisJcHJpbnRmKCJcbiIpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21kNS9tZDUuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvbWQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiZjg0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvbWQ1LmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qIGNyeXB0by9tZDUvbWQ1LmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfTUQ1X0gKKyNkZWZpbmUgSEVBREVSX01ENV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX05PX01ENQorI2Vycm9yIE1ENSBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisvKgorICogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqICEgTUQ1X0xPTkcgaGFzIHRvIGJlIGF0IGxlYXN0IDMyIGJpdHMgd2lkZS4gSWYgaXQncyB3aWRlciwgdGhlbiAhCisgKiAhIE1ENV9MT05HX0xPRzIgaGFzIHRvIGJlIGRlZmluZWQgYWxvbmcuCQkJICAgIQorICogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqLworCisjaWYgZGVmaW5lZChfX0xQMzJfXykKKyNkZWZpbmUgTUQ1X0xPTkcgdW5zaWduZWQgbG9uZworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19DUkFZKSB8fCBkZWZpbmVkKF9fSUxQNjRfXykKKyNkZWZpbmUgTUQ1X0xPTkcgdW5zaWduZWQgbG9uZworI2RlZmluZSBNRDVfTE9OR19MT0cyIDMKKy8qCisgKiBfQ1JBWSBub3RlLiBJIGNvdWxkIGRlY2xhcmUgc2hvcnQsIGJ1dCBJIGhhdmUgbm8gaWRlYSB3aGF0IGltcGFjdAorICogZG9lcyBpdCBoYXZlIG9uIHBlcmZvcm1hbmNlIG9uIG5vbmUtVDNFIG1hY2hpbmVzLiBJIGNvdWxkIGRlY2xhcmUKKyAqIGludCwgYnV0IGF0IGxlYXN0IG9uIEM5MCBzaXplb2YoaW50KSBjYW4gYmUgY2hvc2VuIGF0IGNvbXBpbGUgdGltZS4KKyAqIFNvIEkndmUgY2hvc2VuIGxvbmcuLi4KKyAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgKi8KKyNlbHNlCisjZGVmaW5lIE1ENV9MT05HIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNkZWZpbmUgTUQ1X0NCTE9DSwk2NAorI2RlZmluZSBNRDVfTEJMT0NLCShNRDVfQ0JMT0NLLzQpCisjZGVmaW5lIE1ENV9ESUdFU1RfTEVOR1RIIDE2CisKK3R5cGVkZWYgc3RydWN0IE1ENXN0YXRlX3N0CisJeworCU1ENV9MT05HIEEsQixDLEQ7CisJTUQ1X0xPTkcgTmwsTmg7CisJTUQ1X0xPTkcgZGF0YVtNRDVfTEJMT0NLXTsKKwl1bnNpZ25lZCBpbnQgbnVtOworCX0gTUQ1X0NUWDsKKworaW50IE1ENV9Jbml0KE1ENV9DVFggKmMpOworaW50IE1ENV9VcGRhdGUoTUQ1X0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgTUQ1X0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBNRDVfQ1RYICpjKTsKK3Vuc2lnbmVkIGNoYXIgKk1ENShjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwgdW5zaWduZWQgY2hhciAqbWQpOwordm9pZCBNRDVfVHJhbnNmb3JtKE1ENV9DVFggKmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIpOworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21kNS9tZDVfZGdzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNS9tZDVfZGdzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWNlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L21kNV9kZ3N0LmMKQEAgLTAsMCArMSwxODQgQEAKKy8qIGNyeXB0by9tZDUvbWQ1X2Rnc3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJtZDVfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KKworY29uc3QgY2hhciBNRDVfdmVyc2lvbltdPSJNRDUiIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworLyogSW1wbGVtZW50ZWQgZnJvbSBSRkMxMzIxIFRoZSBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtCisgKi8KKworI2RlZmluZSBJTklUX0RBVEFfQSAodW5zaWduZWQgbG9uZykweDY3NDUyMzAxTAorI2RlZmluZSBJTklUX0RBVEFfQiAodW5zaWduZWQgbG9uZykweGVmY2RhYjg5TAorI2RlZmluZSBJTklUX0RBVEFfQyAodW5zaWduZWQgbG9uZykweDk4YmFkY2ZlTAorI2RlZmluZSBJTklUX0RBVEFfRCAodW5zaWduZWQgbG9uZykweDEwMzI1NDc2TAorCitpbnQgTUQ1X0luaXQoTUQ1X0NUWCAqYykKKwl7CisJbWVtc2V0IChjLDAsc2l6ZW9mKCpjKSk7CisJYy0+QT1JTklUX0RBVEFfQTsKKwljLT5CPUlOSVRfREFUQV9COworCWMtPkM9SU5JVF9EQVRBX0M7CisJYy0+RD1JTklUX0RBVEFfRDsKKwlyZXR1cm4gMTsKKwl9CisKKyNpZm5kZWYgbWQ1X2Jsb2NrX2RhdGFfb3JkZXIKKyNpZmRlZiBYCisjdW5kZWYgWAorI2VuZGlmCit2b2lkIG1kNV9ibG9ja19kYXRhX29yZGVyIChNRDVfQ1RYICpjLCBjb25zdCB2b2lkICpkYXRhXywgc2l6ZV90IG51bSkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YT1kYXRhXzsKKwlyZWdpc3RlciB1bnNpZ25lZCBNRDMyX1JFR19UIEEsQixDLEQsbDsKKyNpZm5kZWYgTUQzMl9YQVJSQVkKKwkvKiBTZWUgY29tbWVudCBpbiBjcnlwdG8vc2hhL3NoYV9sb2NsLmggZm9yIGRldGFpbHMuICovCisJdW5zaWduZWQgTUQzMl9SRUdfVAlYWDAsIFhYMSwgWFgyLCBYWDMsIFhYNCwgWFg1LCBYWDYsIFhYNywKKwkJCQlYWDgsIFhYOSxYWDEwLFhYMTEsWFgxMixYWDEzLFhYMTQsWFgxNTsKKyMgZGVmaW5lIFgoaSkJWFgjI2kKKyNlbHNlCisJTUQ1X0xPTkcgWFhbTUQ1X0xCTE9DS107CisjIGRlZmluZSBYKGkpCVhYW2ldCisjZW5kaWYKKworCUE9Yy0+QTsKKwlCPWMtPkI7CisJQz1jLT5DOworCUQ9Yy0+RDsKKworCWZvciAoO251bS0tOykKKwkJeworCUhPU1RfYzJsKGRhdGEsbCk7IFgoIDApPWw7CQlIT1NUX2MybChkYXRhLGwpOyBYKCAxKT1sOworCS8qIFJvdW5kIDAgKi8KKwlSMChBLEIsQyxELFgoIDApLCA3LDB4ZDc2YWE0NzhMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggMik9bDsKKwlSMChELEEsQixDLFgoIDEpLDEyLDB4ZThjN2I3NTZMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggMyk9bDsKKwlSMChDLEQsQSxCLFgoIDIpLDE3LDB4MjQyMDcwZGJMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggNCk9bDsKKwlSMChCLEMsRCxBLFgoIDMpLDIyLDB4YzFiZGNlZWVMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggNSk9bDsKKwlSMChBLEIsQyxELFgoIDQpLCA3LDB4ZjU3YzBmYWZMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggNik9bDsKKwlSMChELEEsQixDLFgoIDUpLDEyLDB4NDc4N2M2MmFMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggNyk9bDsKKwlSMChDLEQsQSxCLFgoIDYpLDE3LDB4YTgzMDQ2MTNMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggOCk9bDsKKwlSMChCLEMsRCxBLFgoIDcpLDIyLDB4ZmQ0Njk1MDFMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggOSk9bDsKKwlSMChBLEIsQyxELFgoIDgpLCA3LDB4Njk4MDk4ZDhMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxMCk9bDsKKwlSMChELEEsQixDLFgoIDkpLDEyLDB4OGI0NGY3YWZMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxMSk9bDsKKwlSMChDLEQsQSxCLFgoMTApLDE3LDB4ZmZmZjViYjFMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxMik9bDsKKwlSMChCLEMsRCxBLFgoMTEpLDIyLDB4ODk1Y2Q3YmVMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxMyk9bDsKKwlSMChBLEIsQyxELFgoMTIpLCA3LDB4NmI5MDExMjJMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxNCk9bDsKKwlSMChELEEsQixDLFgoMTMpLDEyLDB4ZmQ5ODcxOTNMKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxNSk9bDsKKwlSMChDLEQsQSxCLFgoMTQpLDE3LDB4YTY3OTQzOGVMKTsKKwlSMChCLEMsRCxBLFgoMTUpLDIyLDB4NDliNDA4MjFMKTsKKwkvKiBSb3VuZCAxICovCisJUjEoQSxCLEMsRCxYKCAxKSwgNSwweGY2MWUyNTYyTCk7CisJUjEoRCxBLEIsQyxYKCA2KSwgOSwweGMwNDBiMzQwTCk7CisJUjEoQyxELEEsQixYKDExKSwxNCwweDI2NWU1YTUxTCk7CisJUjEoQixDLEQsQSxYKCAwKSwyMCwweGU5YjZjN2FhTCk7CisJUjEoQSxCLEMsRCxYKCA1KSwgNSwweGQ2MmYxMDVkTCk7CisJUjEoRCxBLEIsQyxYKDEwKSwgOSwweDAyNDQxNDUzTCk7CisJUjEoQyxELEEsQixYKDE1KSwxNCwweGQ4YTFlNjgxTCk7CisJUjEoQixDLEQsQSxYKCA0KSwyMCwweGU3ZDNmYmM4TCk7CisJUjEoQSxCLEMsRCxYKCA5KSwgNSwweDIxZTFjZGU2TCk7CisJUjEoRCxBLEIsQyxYKDE0KSwgOSwweGMzMzcwN2Q2TCk7CisJUjEoQyxELEEsQixYKCAzKSwxNCwweGY0ZDUwZDg3TCk7CisJUjEoQixDLEQsQSxYKCA4KSwyMCwweDQ1NWExNGVkTCk7CisJUjEoQSxCLEMsRCxYKDEzKSwgNSwweGE5ZTNlOTA1TCk7CisJUjEoRCxBLEIsQyxYKCAyKSwgOSwweGZjZWZhM2Y4TCk7CisJUjEoQyxELEEsQixYKCA3KSwxNCwweDY3NmYwMmQ5TCk7CisJUjEoQixDLEQsQSxYKDEyKSwyMCwweDhkMmE0YzhhTCk7CisJLyogUm91bmQgMiAqLworCVIyKEEsQixDLEQsWCggNSksIDQsMHhmZmZhMzk0MkwpOworCVIyKEQsQSxCLEMsWCggOCksMTEsMHg4NzcxZjY4MUwpOworCVIyKEMsRCxBLEIsWCgxMSksMTYsMHg2ZDlkNjEyMkwpOworCVIyKEIsQyxELEEsWCgxNCksMjMsMHhmZGU1MzgwY0wpOworCVIyKEEsQixDLEQsWCggMSksIDQsMHhhNGJlZWE0NEwpOworCVIyKEQsQSxCLEMsWCggNCksMTEsMHg0YmRlY2ZhOUwpOworCVIyKEMsRCxBLEIsWCggNyksMTYsMHhmNmJiNGI2MEwpOworCVIyKEIsQyxELEEsWCgxMCksMjMsMHhiZWJmYmM3MEwpOworCVIyKEEsQixDLEQsWCgxMyksIDQsMHgyODliN2VjNkwpOworCVIyKEQsQSxCLEMsWCggMCksMTEsMHhlYWExMjdmYUwpOworCVIyKEMsRCxBLEIsWCggMyksMTYsMHhkNGVmMzA4NUwpOworCVIyKEIsQyxELEEsWCggNiksMjMsMHgwNDg4MWQwNUwpOworCVIyKEEsQixDLEQsWCggOSksIDQsMHhkOWQ0ZDAzOUwpOworCVIyKEQsQSxCLEMsWCgxMiksMTEsMHhlNmRiOTllNUwpOworCVIyKEMsRCxBLEIsWCgxNSksMTYsMHgxZmEyN2NmOEwpOworCVIyKEIsQyxELEEsWCggMiksMjMsMHhjNGFjNTY2NUwpOworCS8qIFJvdW5kIDMgKi8KKwlSMyhBLEIsQyxELFgoIDApLCA2LDB4ZjQyOTIyNDRMKTsKKwlSMyhELEEsQixDLFgoIDcpLDEwLDB4NDMyYWZmOTdMKTsKKwlSMyhDLEQsQSxCLFgoMTQpLDE1LDB4YWI5NDIzYTdMKTsKKwlSMyhCLEMsRCxBLFgoIDUpLDIxLDB4ZmM5M2EwMzlMKTsKKwlSMyhBLEIsQyxELFgoMTIpLCA2LDB4NjU1YjU5YzNMKTsKKwlSMyhELEEsQixDLFgoIDMpLDEwLDB4OGYwY2NjOTJMKTsKKwlSMyhDLEQsQSxCLFgoMTApLDE1LDB4ZmZlZmY0N2RMKTsKKwlSMyhCLEMsRCxBLFgoIDEpLDIxLDB4ODU4NDVkZDFMKTsKKwlSMyhBLEIsQyxELFgoIDgpLCA2LDB4NmZhODdlNGZMKTsKKwlSMyhELEEsQixDLFgoMTUpLDEwLDB4ZmUyY2U2ZTBMKTsKKwlSMyhDLEQsQSxCLFgoIDYpLDE1LDB4YTMwMTQzMTRMKTsKKwlSMyhCLEMsRCxBLFgoMTMpLDIxLDB4NGUwODExYTFMKTsKKwlSMyhBLEIsQyxELFgoIDQpLCA2LDB4Zjc1MzdlODJMKTsKKwlSMyhELEEsQixDLFgoMTEpLDEwLDB4YmQzYWYyMzVMKTsKKwlSMyhDLEQsQSxCLFgoIDIpLDE1LDB4MmFkN2QyYmJMKTsKKwlSMyhCLEMsRCxBLFgoIDkpLDIxLDB4ZWI4NmQzOTFMKTsKKworCUEgPSBjLT5BICs9IEE7CisJQiA9IGMtPkIgKz0gQjsKKwlDID0gYy0+QyArPSBDOworCUQgPSBjLT5EICs9IEQ7CisJCX0KKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvbWQ1X2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvbWQ1X2xvY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhkNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNS9tZDVfbG9jbC5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiBjcnlwdG8vbWQ1L21kNV9sb2NsLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorCisjaWZuZGVmIE1ENV9MT05HX0xPRzIKKyNkZWZpbmUgTUQ1X0xPTkdfTE9HMiAyIC8qIGRlZmF1bHQgdG8gMzIgYml0cyAqLworI2VuZGlmCisKKyNpZmRlZiBNRDVfQVNNCisjIGlmIGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19JTlRFTF9fKSB8fCBcCisgICAgIGRlZmluZWQoX194ODZfNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9BTUQ2NCkgfHwgZGVmaW5lZChfTV9YNjQpCisjICBkZWZpbmUgbWQ1X2Jsb2NrX2RhdGFfb3JkZXIgbWQ1X2Jsb2NrX2FzbV9kYXRhX29yZGVyCisjIGVsaWYgZGVmaW5lZChfX2lhNjQpIHx8IGRlZmluZWQoX19pYTY0X18pIHx8IGRlZmluZWQoX01fSUE2NCkKKyMgIGRlZmluZSBtZDVfYmxvY2tfZGF0YV9vcmRlciBtZDVfYmxvY2tfYXNtX2RhdGFfb3JkZXIKKyMgZW5kaWYKKyNlbmRpZgorCit2b2lkIG1kNV9ibG9ja19kYXRhX29yZGVyIChNRDVfQ1RYICpjLCBjb25zdCB2b2lkICpwLHNpemVfdCBudW0pOworCisjZGVmaW5lIERBVEFfT1JERVJfSVNfTElUVExFX0VORElBTgorCisjZGVmaW5lIEhBU0hfTE9ORwkJTUQ1X0xPTkcKKyNkZWZpbmUgSEFTSF9DVFgJCU1ENV9DVFgKKyNkZWZpbmUgSEFTSF9DQkxPQ0sJCU1ENV9DQkxPQ0sKKyNkZWZpbmUgSEFTSF9VUERBVEUJCU1ENV9VcGRhdGUKKyNkZWZpbmUgSEFTSF9UUkFOU0ZPUk0JCU1ENV9UcmFuc2Zvcm0KKyNkZWZpbmUgSEFTSF9GSU5BTAkJTUQ1X0ZpbmFsCisjZGVmaW5lCUhBU0hfTUFLRV9TVFJJTkcoYyxzKQlkbyB7CVwKKwl1bnNpZ25lZCBsb25nIGxsOwkJXAorCWxsPShjKS0+QTsgSE9TVF9sMmMobGwsKHMpKTsJXAorCWxsPShjKS0+QjsgSE9TVF9sMmMobGwsKHMpKTsJXAorCWxsPShjKS0+QzsgSE9TVF9sMmMobGwsKHMpKTsJXAorCWxsPShjKS0+RDsgSE9TVF9sMmMobGwsKHMpKTsJXAorCX0gd2hpbGUgKDApCisjZGVmaW5lCUhBU0hfQkxPQ0tfREFUQV9PUkRFUgltZDVfYmxvY2tfZGF0YV9vcmRlcgorCisjaW5jbHVkZSAibWQzMl9jb21tb24uaCIKKworLyoKKyNkZWZpbmUJRih4LHkseikJKCgoeCkgJiAoeSkpICB8ICAoKH4oeCkpICYgKHopKSkKKyNkZWZpbmUJRyh4LHkseikJKCgoeCkgJiAoeikpICB8ICAoKHkpICYgKH4oeikpKSkKKyovCisKKy8qIEFzIHBvaW50ZWQgb3V0IGJ5IFdlaSBEYWkgPHdlaWRhaUBlc2tpbW8uY29tPiwgdGhlIGFib3ZlIGNhbiBiZQorICogc2ltcGxpZmllZCB0byB0aGUgY29kZSBiZWxvdy4gIFdlaSBhdHRyaWJ1dGVzIHRoZXNlIG9wdGltaXphdGlvbnMKKyAqIHRvIFBldGVyIEd1dG1hbm4ncyBTSFMgY29kZSwgYW5kIGhlIGF0dHJpYnV0ZXMgaXQgdG8gUmljaCBTY2hyb2VwcGVsLgorICovCisjZGVmaW5lCUYoYixjLGQpCSgoKChjKSBeIChkKSkgJiAoYikpIF4gKGQpKQorI2RlZmluZQlHKGIsYyxkKQkoKCgoYikgXiAoYykpICYgKGQpKSBeIChjKSkKKyNkZWZpbmUJSChiLGMsZCkJKChiKSBeIChjKSBeIChkKSkKKyNkZWZpbmUJSShiLGMsZCkJKCgofihkKSkgfCAoYikpIF4gKGMpKQorCisjZGVmaW5lIFIwKGEsYixjLGQsayxzLHQpIHsgXAorCWErPSgoaykrKHQpK0YoKGIpLChjKSwoZCkpKTsgXAorCWE9Uk9UQVRFKGEscyk7IFwKKwlhKz1iOyB9O1wKKworI2RlZmluZSBSMShhLGIsYyxkLGsscyx0KSB7IFwKKwlhKz0oKGspKyh0KStHKChiKSwoYyksKGQpKSk7IFwKKwlhPVJPVEFURShhLHMpOyBcCisJYSs9YjsgfTsKKworI2RlZmluZSBSMihhLGIsYyxkLGsscyx0KSB7IFwKKwlhKz0oKGspKyh0KStIKChiKSwoYyksKGQpKSk7IFwKKwlhPVJPVEFURShhLHMpOyBcCisJYSs9YjsgfTsKKworI2RlZmluZSBSMyhhLGIsYyxkLGsscyx0KSB7IFwKKwlhKz0oKGspKyh0KStJKChiKSwoYyksKGQpKSk7IFwKKwlhPVJPVEFURShhLHMpOyBcCisJYSs9YjsgfTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvbWQ1X29uZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNS9tZDVfb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmZWU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvbWQ1X29uZS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIGNyeXB0by9tZDUvbWQ1X29uZS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKworI2lmZGVmIENIQVJTRVRfRUJDRElDCisjaW5jbHVkZSA8b3BlbnNzbC9lYmNkaWMuaD4KKyNlbmRpZgorCit1bnNpZ25lZCBjaGFyICpNRDUoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sIHVuc2lnbmVkIGNoYXIgKm1kKQorCXsKKwlNRDVfQ1RYIGM7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbVtNRDVfRElHRVNUX0xFTkdUSF07CisKKwlpZiAobWQgPT0gTlVMTCkgbWQ9bTsKKwlpZiAoIU1ENV9Jbml0KCZjKSkKKwkJcmV0dXJuIE5VTEw7CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJTUQ1X1VwZGF0ZSgmYyxkLG4pOworI2Vsc2UKKwl7CisJCWNoYXIgdGVtcFsxMDI0XTsKKwkJdW5zaWduZWQgbG9uZyBjaHVuazsKKworCQl3aGlsZSAobiA+IDApCisJCXsKKwkJCWNodW5rID0gKG4gPiBzaXplb2YodGVtcCkpID8gc2l6ZW9mKHRlbXApIDogbjsKKwkJCWViY2RpYzJhc2NpaSh0ZW1wLCBkLCBjaHVuayk7CisJCQlNRDVfVXBkYXRlKCZjLHRlbXAsY2h1bmspOworCQkJbiAtPSBjaHVuazsKKwkJCWQgKz0gY2h1bms7CisJCX0KKwl9CisjZW5kaWYKKwlNRDVfRmluYWwobWQsJmMpOworCU9QRU5TU0xfY2xlYW5zZSgmYyxzaXplb2YoYykpOyAvKiBzZWN1cml0eSBjb25zaWRlcmF0aW9uICovCisJcmV0dXJuKG1kKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZDUvbWQ1cy5jcHAgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L21kNXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzQzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L21kNXMuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8vCisvLyBnZXR0c2MuaW5sCisvLworLy8gZ2l2ZXMgYWNjZXNzIHRvIHRoZSBQZW50aXVtJ3MgKHNlY3JldCkgY3ljbGUgY291bnRlcgorLy8KKy8vIFRoaXMgc29mdHdhcmUgd2FzIHdyaXR0ZW4gYnkgTGVvbmFyZCBKYW5rZSAoamFua2VAdW5peGcudWJjLmNhKQorLy8gaW4gMTk5Ni03IGFuZCBpcyBlbnRlcmVkLCBieSBoaW0sIGludG8gdGhlIHB1YmxpYyBkb21haW4uCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQordm9pZCBHZXRUU0ModW5zaWduZWQgbG9uZyYpOworI3ByYWdtYSBhdXggR2V0VFNDID0gMHgwZiAweDMxICJtb3YgW2VkaV0sIGVheCIgcGFybSBbZWRpXSBtb2RpZnkgW2VkeCBlYXhdOworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKK2lubGluZQordm9pZCBHZXRUU0ModW5zaWduZWQgbG9uZyYgdHNjKQoreworICBhc20gdm9sYXRpbGUoIi5ieXRlIDE1LCA0OVxuXHQiCisJICAgICAgIDogIj1lYXgiICh0c2MpCisJICAgICAgIDoKKwkgICAgICAgOiAiJWVkeCIsICIlZWF4Iik7Cit9CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQoraW5saW5lCit2b2lkIEdldFRTQyh1bnNpZ25lZCBsb25nJiB0c2MpCit7CisgIHVuc2lnbmVkIGxvbmcgYTsKKyAgX19hc20gX2VtaXQgMGZoCisgIF9fYXNtIF9lbWl0IDMxaAorICBfX2FzbSBtb3YgYSwgZWF4OworICB0c2M9YTsKK30KKyNlbmRpZiAgICAgIAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorCitleHRlcm4gIkMiIHsKK3ZvaWQgbWQ1X2Jsb2NrX3g4NihNRDVfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcixpbnQgbnVtKTsKK30KKwordm9pZCBtYWluKGludCBhcmdjLGNoYXIgKmFyZ3ZbXSkKKwl7CisJdW5zaWduZWQgY2hhciBidWZmZXJbNjQqMjU2XTsKKwlNRDVfQ1RYIGN0eDsKKwl1bnNpZ25lZCBsb25nIHMxLHMyLGUxLGUyOworCXVuc2lnbmVkIGNoYXIga1sxNl07CisJdW5zaWduZWQgbG9uZyBkYXRhWzJdOworCXVuc2lnbmVkIGNoYXIgaXZbOF07CisJaW50IGksbnVtPTAsbnVtbTsKKwlpbnQgaj0wOworCisJaWYgKGFyZ2MgPj0gMikKKwkJbnVtPWF0b2koYXJndlsxXSk7CisKKwlpZiAobnVtID09IDApIG51bT0xNjsKKwlpZiAobnVtID4gMjUwKSBudW09MTY7CisJbnVtbT1udW0rMjsKKwludW0qPTY0OworCW51bW0qPTY0OworCisJZm9yIChqPTA7IGo8NjsgaisrKQorCQl7CisJCWZvciAoaT0wOyBpPDEwOyBpKyspIC8qKi8KKwkJCXsKKwkJCW1kNV9ibG9ja194ODYoJmN0eCxidWZmZXIsbnVtbSk7CisJCQlHZXRUU0MoczEpOworCQkJbWQ1X2Jsb2NrX3g4NigmY3R4LGJ1ZmZlcixudW1tKTsKKwkJCUdldFRTQyhlMSk7CisJCQlHZXRUU0MoczIpOworCQkJbWQ1X2Jsb2NrX3g4NigmY3R4LGJ1ZmZlcixudW0pOworCQkJR2V0VFNDKGUyKTsKKwkJCW1kNV9ibG9ja194ODYoJmN0eCxidWZmZXIsbnVtKTsKKwkJCX0KKwkJcHJpbnRmKCJtZDUgKCVkIGJ5dGVzKSAlZCAlZCAoJS4yZilcbiIsbnVtLAorCQkJZTEtczEsZTItczIsKGRvdWJsZSkoKGUxLXMxKS0oZTItczIpKS8yKTsKKwkJfQorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21kNS9tZDV0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWQ1L21kNXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM3MTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL21kNS9tZDV0ZXN0LmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGNyeXB0by9tZDUvbWQ1dGVzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiLi4vZV9vcy5oIgorCisjaWZkZWYgT1BFTlNTTF9OT19NRDUKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcHJpbnRmKCJObyBNRDUgc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKK3N0YXRpYyBjaGFyICp0ZXN0W109eworCSIiLAorCSJhIiwKKwkiYWJjIiwKKwkibWVzc2FnZSBkaWdlc3QiLAorCSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCisJIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IiwKKwkiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiLAorCU5VTEwsCisJfTsKKworc3RhdGljIGNoYXIgKnJldFtdPXsKKwkiZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UiLAorCSIwY2MxNzViOWMwZjFiNmE4MzFjMzk5ZTI2OTc3MjY2MSIsCisJIjkwMDE1MDk4M2NkMjRmYjBkNjk2M2Y3ZDI4ZTE3ZjcyIiwKKwkiZjk2YjY5N2Q3Y2I3OTM4ZDUyNWEyZjMxYWFmMTYxZDAiLAorCSJjM2ZjZDNkNzYxOTJlNDAwN2RmYjQ5NmNjYTY3ZTEzYiIsCisJImQxNzRhYjk4ZDI3N2Q5ZjVhNTYxMWMyYzlmNDE5ZDlmIiwKKwkiNTdlZGY0YTIyYmUzYzk1NWFjNDlkYTJlMjEwN2I2N2EiLAorCX07CisKK3N0YXRpYyBjaGFyICpwdCh1bnNpZ25lZCBjaGFyICptZCk7CitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorCXsKKwlpbnQgaSxlcnI9MDsKKwljaGFyICoqUCwqKlI7CisJY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyIG1kW01ENV9ESUdFU1RfTEVOR1RIXTsKKworCVA9dGVzdDsKKwlSPXJldDsKKwlpPTE7CisJd2hpbGUgKCpQICE9IE5VTEwpCisJCXsKKwkJRVZQX0RpZ2VzdCgmKFBbMF1bMF0pLHN0cmxlbigoY2hhciAqKSpQKSxtZCxOVUxMLEVWUF9tZDUoKSwgTlVMTCk7CisJCXA9cHQobWQpOworCQlpZiAoc3RyY21wKHAsKGNoYXIgKikqUikgIT0gMCkKKwkJCXsKKwkJCXByaW50ZigiZXJyb3IgY2FsY3VsYXRpbmcgTUQ1IG9uICclcydcbiIsKlApOworCQkJcHJpbnRmKCJnb3QgJXMgaW5zdGVhZCBvZiAlc1xuIixwLCpSKTsKKwkJCWVycisrOworCQkJfQorCQllbHNlCisJCQlwcmludGYoInRlc3QgJWQgb2tcbiIsaSk7CisJCWkrKzsKKwkJUisrOworCQlQKys7CisJCX0KKworI2lmZGVmIE9QRU5TU0xfU1lTX05FVFdBUkUKKyAgICBpZiAoZXJyKSBwcmludGYoIkVSUk9SOiAlZFxuIiwgZXJyKTsKKyNlbmRpZgorCUVYSVQoZXJyKTsKKwlyZXR1cm4oMCk7CisJfQorCitzdGF0aWMgY2hhciAqcHQodW5zaWduZWQgY2hhciAqbWQpCisJeworCWludCBpOworCXN0YXRpYyBjaGFyIGJ1Zls4MF07CisKKwlmb3IgKGk9MDsgaTxNRDVfRElHRVNUX0xFTkdUSDsgaSsrKQorCQlzcHJpbnRmKCYoYnVmW2kqMl0pLCIlMDJ4IixtZFtpXSk7CisJcmV0dXJuKGJ1Zik7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbWRjMi9tZGMyLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vbWRjMi9tZGMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3NzhhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZGMyL21kYzIuaApAQCAtMCwwICsxLDk1IEBACisvKiBjcnlwdG8vbWRjMi9tZGMyLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfTURDMl9ICisjZGVmaW5lIEhFQURFUl9NREMyX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX05PX01EQzIKKyNlcnJvciBNREMyIGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNkZWZpbmUgTURDMl9CTE9DSyAgICAgICAgICAgICAgOAorI2RlZmluZSBNREMyX0RJR0VTVF9MRU5HVEggICAgICAxNgorIAordHlwZWRlZiBzdHJ1Y3QgbWRjMl9jdHhfc3QKKwl7CisJdW5zaWduZWQgaW50IG51bTsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbTURDMl9CTE9DS107CisJREVTX2NibG9jayBoLGhoOworCWludCBwYWRfdHlwZTsgLyogZWl0aGVyIDEgb3IgMiwgZGVmYXVsdCAxICovCisJfSBNREMyX0NUWDsKKworCitpbnQgTURDMl9Jbml0KE1EQzJfQ1RYICpjKTsKK2ludCBNREMyX1VwZGF0ZShNREMyX0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgTURDMl9GaW5hbCh1bnNpZ25lZCBjaGFyICptZCwgTURDMl9DVFggKmMpOwordW5zaWduZWQgY2hhciAqTURDMihjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwKKwl1bnNpZ25lZCBjaGFyICptZCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21kYzIvbWRjMl9vbmUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZGMyL21kYzJfb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2NDdmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZGMyL21kYzJfb25lLmMKQEAgLTAsMCArMSw3NiBAQAorLyogY3J5cHRvL21kYzIvbWRjMl9vbmUuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvbWRjMi5oPgorCit1bnNpZ25lZCBjaGFyICpNREMyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIHNpemVfdCBuLCB1bnNpZ25lZCBjaGFyICptZCkKKwl7CisJTURDMl9DVFggYzsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtW01EQzJfRElHRVNUX0xFTkdUSF07CisKKwlpZiAobWQgPT0gTlVMTCkgbWQ9bTsKKwlpZiAoIU1EQzJfSW5pdCgmYykpCisJCXJldHVybiBOVUxMOworCU1EQzJfVXBkYXRlKCZjLGQsbik7CisgICAgICAgIE1EQzJfRmluYWwobWQsJmMpOworCU9QRU5TU0xfY2xlYW5zZSgmYyxzaXplb2YoYykpOyAvKiBzZWN1cml0eSBjb25zaWRlcmF0aW9uICovCisJcmV0dXJuKG1kKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZGMyL21kYzJkZ3N0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWRjMi9tZGMyZGdzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYTQwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWRjMi9tZGMyZGdzdC5jCkBAIC0wLDAgKzEsMTk5IEBACisvKiBjcnlwdG8vbWRjMi9tZGMyZGdzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZGMyLmg+CisKKyN1bmRlZiBjMmwKKyNkZWZpbmUgYzJsKGMsbCkJKGwgPSgoREVTX0xPTkcpKCooKGMpKyspKSkgICAgLCBcCisJCQkgbHw9KChERVNfTE9ORykoKigoYykrKykpKTw8IDhMLCBcCisJCQkgbHw9KChERVNfTE9ORykoKigoYykrKykpKTw8MTZMLCBcCisJCQkgbHw9KChERVNfTE9ORykoKigoYykrKykpKTw8MjRMKQorCisjdW5kZWYgbDJjCisjZGVmaW5lIGwyYyhsLGMpCSgqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKSAgICAgKSYweGZmKSwgXAorCQkJKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PiA4TCkmMHhmZiksIFwKKwkJCSooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4xNkwpJjB4ZmYpLCBcCisJCQkqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MjRMKSYweGZmKSkKKworc3RhdGljIHZvaWQgbWRjMl9ib2R5KE1EQzJfQ1RYICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGxlbik7CitpbnQgTURDMl9Jbml0KE1EQzJfQ1RYICpjKQorCXsKKwljLT5udW09MDsKKwljLT5wYWRfdHlwZT0xOworCW1lbXNldCgmKGMtPmhbMF0pLDB4NTIsTURDMl9CTE9DSyk7CisJbWVtc2V0KCYoYy0+aGhbMF0pLDB4MjUsTURDMl9CTE9DSyk7CisJcmV0dXJuIDE7CisJfQorCitpbnQgTURDMl9VcGRhdGUoTURDMl9DVFggKmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgbGVuKQorCXsKKwlzaXplX3QgaSxqOworCisJaT1jLT5udW07CisJaWYgKGkgIT0gMCkKKwkJeworCQlpZiAoaStsZW4gPCBNREMyX0JMT0NLKQorCQkJeworCQkJLyogcGFydGlhbCBibG9jayAqLworCQkJbWVtY3B5KCYoYy0+ZGF0YVtpXSksaW4sbGVuKTsKKwkJCWMtPm51bSs9KGludClsZW47CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJLyogZmlsbGVkIG9uZSAqLworCQkJaj1NREMyX0JMT0NLLWk7CisJCQltZW1jcHkoJihjLT5kYXRhW2ldKSxpbixqKTsKKwkJCWxlbi09ajsKKwkJCWluKz1qOworCQkJYy0+bnVtPTA7CisJCQltZGMyX2JvZHkoYywmKGMtPmRhdGFbMF0pLE1EQzJfQkxPQ0spOworCQkJfQorCQl9CisJaT1sZW4mfigoc2l6ZV90KU1EQzJfQkxPQ0stMSk7CisJaWYgKGkgPiAwKSBtZGMyX2JvZHkoYyxpbixpKTsKKwlqPWxlbi1pOworCWlmIChqID4gMCkKKwkJeworCQltZW1jcHkoJihjLT5kYXRhWzBdKSwmKGluW2ldKSxqKTsKKwkJYy0+bnVtPShpbnQpajsKKwkJfQorCXJldHVybiAxOworCX0KKworc3RhdGljIHZvaWQgbWRjMl9ib2R5KE1EQzJfQ1RYICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGxlbikKKwl7CisJcmVnaXN0ZXIgREVTX0xPTkcgdGluMCx0aW4xOworCXJlZ2lzdGVyIERFU19MT05HIHR0aW4wLHR0aW4xOworCURFU19MT05HIGRbMl0sZGRbMl07CisJREVTX2tleV9zY2hlZHVsZSBrOworCXVuc2lnbmVkIGNoYXIgKnA7CisJc2l6ZV90IGk7CisKKwlmb3IgKGk9MDsgaTxsZW47IGkrPTgpCisJCXsKKwkJYzJsKGluLHRpbjApOyBkWzBdPWRkWzBdPXRpbjA7CisJCWMybChpbix0aW4xKTsgZFsxXT1kZFsxXT10aW4xOworCQljLT5oWzBdPShjLT5oWzBdJjB4OWYpfDB4NDA7CisJCWMtPmhoWzBdPShjLT5oaFswXSYweDlmKXwweDIwOworCisJCURFU19zZXRfb2RkX3Bhcml0eSgmYy0+aCk7CisJCURFU19zZXRfa2V5X3VuY2hlY2tlZCgmYy0+aCwmayk7CisJCURFU19lbmNyeXB0MShkLCZrLDEpOworCisJCURFU19zZXRfb2RkX3Bhcml0eSgmYy0+aGgpOworCQlERVNfc2V0X2tleV91bmNoZWNrZWQoJmMtPmhoLCZrKTsKKwkJREVTX2VuY3J5cHQxKGRkLCZrLDEpOworCisJCXR0aW4wPXRpbjBeZGRbMF07CisJCXR0aW4xPXRpbjFeZGRbMV07CisJCXRpbjBePWRbMF07CisJCXRpbjFePWRbMV07CisKKwkJcD1jLT5oOworCQlsMmModGluMCxwKTsKKwkJbDJjKHR0aW4xLHApOworCQlwPWMtPmhoOworCQlsMmModHRpbjAscCk7CisJCWwyYyh0aW4xLHApOworCQl9CisJfQorCitpbnQgTURDMl9GaW5hbCh1bnNpZ25lZCBjaGFyICptZCwgTURDMl9DVFggKmMpCisJeworCXVuc2lnbmVkIGludCBpOworCWludCBqOworCisJaT1jLT5udW07CisJaj1jLT5wYWRfdHlwZTsKKwlpZiAoKGkgPiAwKSB8fCAoaiA9PSAyKSkKKwkJeworCQlpZiAoaiA9PSAyKQorCQkJYy0+ZGF0YVtpKytdPTB4ODA7CisJCW1lbXNldCgmKGMtPmRhdGFbaV0pLDAsTURDMl9CTE9DSy1pKTsKKwkJbWRjMl9ib2R5KGMsYy0+ZGF0YSxNREMyX0JMT0NLKTsKKwkJfQorCW1lbWNweShtZCwoY2hhciAqKWMtPmgsTURDMl9CTE9DSyk7CisJbWVtY3B5KCYobWRbTURDMl9CTE9DS10pLChjaGFyICopYy0+aGgsTURDMl9CTE9DSyk7CisJcmV0dXJuIDE7CisJfQorCisjdW5kZWYgVEVTVAorCisjaWZkZWYgVEVTVAorbWFpbigpCisJeworCXVuc2lnbmVkIGNoYXIgbWRbTURDMl9ESUdFU1RfTEVOR1RIXTsKKwlpbnQgaTsKKwlNREMyX0NUWCBjOworCXN0YXRpYyBjaGFyICp0ZXh0PSJOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCAiOworCisJTURDMl9Jbml0KCZjKTsKKwlNREMyX1VwZGF0ZSgmYyx0ZXh0LHN0cmxlbih0ZXh0KSk7CisJTURDMl9GaW5hbCgmKG1kWzBdKSwmYyk7CisKKwlmb3IgKGk9MDsgaTxNREMyX0RJR0VTVF9MRU5HVEg7IGkrKykKKwkJcHJpbnRmKCIlMDJYIixtZFtpXSk7CisJcHJpbnRmKCJcbiIpOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbWRjMi9tZGMydGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL21kYzIvbWRjMnRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTdiMzFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL21kYzIvbWRjMnRlc3QuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogY3J5cHRvL21kYzIvbWRjMnRlc3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIi4uL2Vfb3MuaCIKKworI2lmIGRlZmluZWQoT1BFTlNTTF9OT19ERVMpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fTURDMikKKyNkZWZpbmUgT1BFTlNTTF9OT19NREMyCisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfTk9fTURDMgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwcmludGYoIk5vIE1EQzIgc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWRjMi5oPgorCisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKyNpbmNsdWRlIDxvcGVuc3NsL2ViY2RpYy5oPgorI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZDFbMTZdPXsKKwkweDQyLDB4RTUsMHgwQywweEQyLDB4MjQsMHhCQSwweENFLDB4QkEsCisJMHg3NiwweDBCLDB4REQsMHgyQiwweEQ0LDB4MDksMHgyOCwweDFBCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFkMlsxNl09eworCTB4MkUsMHg0NiwweDc5LDB4QjUsMHhBRCwweEQ5LDB4Q0EsMHg3NSwKKwkweDM1LDB4RDgsMHg3QSwweEZFLDB4QUIsMHgzMywweEJFLDB4RTIKKwl9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorCXsKKwlpbnQgcmV0PTA7CisJdW5zaWduZWQgY2hhciBtZFtNREMyX0RJR0VTVF9MRU5HVEhdOworCWludCBpOworCUVWUF9NRF9DVFggYzsKKwlzdGF0aWMgY2hhciAqdGV4dD0iTm93IGlzIHRoZSB0aW1lIGZvciBhbGwgIjsKKworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJZWJjZGljMmFzY2lpKHRleHQsdGV4dCxzdHJsZW4odGV4dCkpOworI2VuZGlmCisKKwlFVlBfTURfQ1RYX2luaXQoJmMpOworCUVWUF9EaWdlc3RJbml0X2V4KCZjLEVWUF9tZGMyKCksIE5VTEwpOworCUVWUF9EaWdlc3RVcGRhdGUoJmMsKHVuc2lnbmVkIGNoYXIgKil0ZXh0LHN0cmxlbih0ZXh0KSk7CisJRVZQX0RpZ2VzdEZpbmFsX2V4KCZjLCYobWRbMF0pLE5VTEwpOworCisJaWYgKG1lbWNtcChtZCxwYWQxLE1EQzJfRElHRVNUX0xFTkdUSCkgIT0gMCkKKwkJeworCQlmb3IgKGk9MDsgaTxNREMyX0RJR0VTVF9MRU5HVEg7IGkrKykKKwkJCXByaW50ZigiJTAyWCIsbWRbaV0pOworCQlwcmludGYoIiA8LSBnZW5lcmF0ZWRcbiIpOworCQlmb3IgKGk9MDsgaTxNREMyX0RJR0VTVF9MRU5HVEg7IGkrKykKKwkJCXByaW50ZigiJTAyWCIscGFkMVtpXSk7CisJCXByaW50ZigiIDwtIGNvcnJlY3RcbiIpOworCQlyZXQ9MTsKKwkJfQorCWVsc2UKKwkJcHJpbnRmKCJwYWQxIC0gb2tcbiIpOworCisJRVZQX0RpZ2VzdEluaXRfZXgoJmMsRVZQX21kYzIoKSwgTlVMTCk7CisJLyogRklYTUU6IHVzZSBhIGN0bCBmdW5jdGlvbj8gKi8KKwkoKE1EQzJfQ1RYICopYy5tZF9kYXRhKS0+cGFkX3R5cGU9MjsKKwlFVlBfRGlnZXN0VXBkYXRlKCZjLCh1bnNpZ25lZCBjaGFyICopdGV4dCxzdHJsZW4odGV4dCkpOworCUVWUF9EaWdlc3RGaW5hbF9leCgmYywmKG1kWzBdKSxOVUxMKTsKKworCWlmIChtZW1jbXAobWQscGFkMixNREMyX0RJR0VTVF9MRU5HVEgpICE9IDApCisJCXsKKwkJZm9yIChpPTA7IGk8TURDMl9ESUdFU1RfTEVOR1RIOyBpKyspCisJCQlwcmludGYoIiUwMlgiLG1kW2ldKTsKKwkJcHJpbnRmKCIgPC0gZ2VuZXJhdGVkXG4iKTsKKwkJZm9yIChpPTA7IGk8TURDMl9ESUdFU1RfTEVOR1RIOyBpKyspCisJCQlwcmludGYoIiUwMlgiLHBhZDJbaV0pOworCQlwcmludGYoIiA8LSBjb3JyZWN0XG4iKTsKKwkJcmV0PTE7CisJCX0KKwllbHNlCisJCXByaW50ZigicGFkMiAtIG9rXG4iKTsKKworCUVWUF9NRF9DVFhfY2xlYW51cCgmYyk7CisjaWZkZWYgT1BFTlNTTF9TWVNfTkVUV0FSRQorICAgIGlmIChyZXQpIHByaW50ZigiRVJST1I6ICVkXG4iLCByZXQpOworI2VuZGlmCisJRVhJVChyZXQpOworCXJldHVybihyZXQpOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21lbS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODBkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWVtLmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qIGNyeXB0by9tZW0uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKworc3RhdGljIGludCBhbGxvd19jdXN0b21pemUgPSAxOyAgICAgIC8qIHdlIHByb3ZpZGUgZmxleGlibGUgZnVuY3Rpb25zIGZvciAqLworc3RhdGljIGludCBhbGxvd19jdXN0b21pemVfZGVidWcgPSAxOy8qIGV4Y2hhbmdpbmcgbWVtb3J5LXJlbGF0ZWQgZnVuY3Rpb25zIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcnVuLXRpbWUsIGJ1dCB0aGlzIG11c3QgYmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlZm9yZSBhbnkgYmxvY2tzIGFyZSBhY3R1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbG9jYXRlZDsgb3Igd2UnbGwgcnVuIGludG8gaHVnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHByb2JsZW1zIHdoZW4gbWFsbG9jL2ZyZWUgcGFpcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkb24ndCBtYXRjaCBldGMuICovCisKKworCisvKiB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIG1heSBiZSBjaGFuZ2VkIGFzIGxvbmcgYXMgJ2FsbG93X2N1c3RvbWl6ZScgaXMgc2V0ICovCisKK3N0YXRpYyB2b2lkICooKm1hbGxvY19mdW5jKShzaXplX3QpICAgICAgICAgPSBtYWxsb2M7CitzdGF0aWMgdm9pZCAqZGVmYXVsdF9tYWxsb2NfZXgoc2l6ZV90IG51bSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisJeyByZXR1cm4gbWFsbG9jX2Z1bmMobnVtKTsgfQorc3RhdGljIHZvaWQgKigqbWFsbG9jX2V4X2Z1bmMpKHNpemVfdCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisgICAgICAgID0gZGVmYXVsdF9tYWxsb2NfZXg7CisKK3N0YXRpYyB2b2lkICooKnJlYWxsb2NfZnVuYykodm9pZCAqLCBzaXplX3QpPSByZWFsbG9jOworc3RhdGljIHZvaWQgKmRlZmF1bHRfcmVhbGxvY19leCh2b2lkICpzdHIsIHNpemVfdCBudW0sCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQorCXsgcmV0dXJuIHJlYWxsb2NfZnVuYyhzdHIsbnVtKTsgfQorc3RhdGljIHZvaWQgKigqcmVhbGxvY19leF9mdW5jKSh2b2lkICosIHNpemVfdCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisgICAgICAgID0gZGVmYXVsdF9yZWFsbG9jX2V4OworCitzdGF0aWMgdm9pZCAoKmZyZWVfZnVuYykodm9pZCAqKSAgICAgICAgICAgID0gZnJlZTsKKworc3RhdGljIHZvaWQgKigqbWFsbG9jX2xvY2tlZF9mdW5jKShzaXplX3QpICA9IG1hbGxvYzsKK3N0YXRpYyB2b2lkICpkZWZhdWx0X21hbGxvY19sb2NrZWRfZXgoc2l6ZV90IG51bSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisJeyByZXR1cm4gbWFsbG9jX2xvY2tlZF9mdW5jKG51bSk7IH0KK3N0YXRpYyB2b2lkICooKm1hbGxvY19sb2NrZWRfZXhfZnVuYykoc2l6ZV90LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKyAgICAgICAgPSBkZWZhdWx0X21hbGxvY19sb2NrZWRfZXg7CisKK3N0YXRpYyB2b2lkICgqZnJlZV9sb2NrZWRfZnVuYykodm9pZCAqKSAgICAgPSBmcmVlOworCisKKworLyogbWF5IGJlIGNoYW5nZWQgYXMgbG9uZyBhcyAnYWxsb3dfY3VzdG9taXplX2RlYnVnJyBpcyBzZXQgKi8KKy8qIFhYWCB1c2UgY29ycmVjdCBmdW5jdGlvbiBwb2ludGVyIHR5cGVzICovCisjaWZkZWYgQ1JZUFRPX01ERUJVRworLyogdXNlIGRlZmF1bHQgZnVuY3Rpb25zIGZyb20gbWVtX2RiZy5jICovCitzdGF0aWMgdm9pZCAoKm1hbGxvY19kZWJ1Z19mdW5jKSh2b2lkICosaW50LGNvbnN0IGNoYXIgKixpbnQsaW50KQorCT0gQ1JZUFRPX2RiZ19tYWxsb2M7CitzdGF0aWMgdm9pZCAoKnJlYWxsb2NfZGVidWdfZnVuYykodm9pZCAqLHZvaWQgKixpbnQsY29uc3QgY2hhciAqLGludCxpbnQpCisJPSBDUllQVE9fZGJnX3JlYWxsb2M7CitzdGF0aWMgdm9pZCAoKmZyZWVfZGVidWdfZnVuYykodm9pZCAqLGludCkgPSBDUllQVE9fZGJnX2ZyZWU7CitzdGF0aWMgdm9pZCAoKnNldF9kZWJ1Z19vcHRpb25zX2Z1bmMpKGxvbmcpID0gQ1JZUFRPX2RiZ19zZXRfb3B0aW9uczsKK3N0YXRpYyBsb25nICgqZ2V0X2RlYnVnX29wdGlvbnNfZnVuYykodm9pZCkgPSBDUllQVE9fZGJnX2dldF9vcHRpb25zOworI2Vsc2UKKy8qIGFwcGxpY2F0aW9ucyBjYW4gdXNlIENSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpIHRvIHNlbGVjdCBhYm92ZSBjYXNlCisgKiBhdCBydW4tdGltZSAqLworc3RhdGljIHZvaWQgKCptYWxsb2NfZGVidWdfZnVuYykodm9pZCAqLGludCxjb25zdCBjaGFyICosaW50LGludCkgPSBOVUxMOworc3RhdGljIHZvaWQgKCpyZWFsbG9jX2RlYnVnX2Z1bmMpKHZvaWQgKix2b2lkICosaW50LGNvbnN0IGNoYXIgKixpbnQsaW50KQorCT0gTlVMTDsKK3N0YXRpYyB2b2lkICgqZnJlZV9kZWJ1Z19mdW5jKSh2b2lkICosaW50KSA9IE5VTEw7CitzdGF0aWMgdm9pZCAoKnNldF9kZWJ1Z19vcHRpb25zX2Z1bmMpKGxvbmcpID0gTlVMTDsKK3N0YXRpYyBsb25nICgqZ2V0X2RlYnVnX29wdGlvbnNfZnVuYykodm9pZCkgPSBOVUxMOworI2VuZGlmCisKKworaW50IENSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyh2b2lkICooKm0pKHNpemVfdCksIHZvaWQgKigqcikodm9pZCAqLCBzaXplX3QpLAorCXZvaWQgKCpmKSh2b2lkICopKQorCXsKKwlpZiAoIWFsbG93X2N1c3RvbWl6ZSkKKwkJcmV0dXJuIDA7CisJaWYgKChtID09IDApIHx8IChyID09IDApIHx8IChmID09IDApKQorCQlyZXR1cm4gMDsKKwltYWxsb2NfZnVuYz1tOyBtYWxsb2NfZXhfZnVuYz1kZWZhdWx0X21hbGxvY19leDsKKwlyZWFsbG9jX2Z1bmM9cjsgcmVhbGxvY19leF9mdW5jPWRlZmF1bHRfcmVhbGxvY19leDsKKwlmcmVlX2Z1bmM9ZjsKKwltYWxsb2NfbG9ja2VkX2Z1bmM9bTsgbWFsbG9jX2xvY2tlZF9leF9mdW5jPWRlZmF1bHRfbWFsbG9jX2xvY2tlZF9leDsKKwlmcmVlX2xvY2tlZF9mdW5jPWY7CisJcmV0dXJuIDE7CisJfQorCitpbnQgQ1JZUFRPX3NldF9tZW1fZXhfZnVuY3Rpb25zKAorICAgICAgICB2b2lkICooKm0pKHNpemVfdCxjb25zdCBjaGFyICosaW50KSwKKyAgICAgICAgdm9pZCAqKCpyKSh2b2lkICosIHNpemVfdCxjb25zdCBjaGFyICosaW50KSwKKwl2b2lkICgqZikodm9pZCAqKSkKKwl7CisJaWYgKCFhbGxvd19jdXN0b21pemUpCisJCXJldHVybiAwOworCWlmICgobSA9PSAwKSB8fCAociA9PSAwKSB8fCAoZiA9PSAwKSkKKwkJcmV0dXJuIDA7CisJbWFsbG9jX2Z1bmM9MDsgbWFsbG9jX2V4X2Z1bmM9bTsKKwlyZWFsbG9jX2Z1bmM9MDsgcmVhbGxvY19leF9mdW5jPXI7CisJZnJlZV9mdW5jPWY7CisJbWFsbG9jX2xvY2tlZF9mdW5jPTA7IG1hbGxvY19sb2NrZWRfZXhfZnVuYz1tOworCWZyZWVfbG9ja2VkX2Z1bmM9ZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBDUllQVE9fc2V0X2xvY2tlZF9tZW1fZnVuY3Rpb25zKHZvaWQgKigqbSkoc2l6ZV90KSwgdm9pZCAoKmYpKHZvaWQgKikpCisJeworCWlmICghYWxsb3dfY3VzdG9taXplKQorCQlyZXR1cm4gMDsKKwlpZiAoKG0gPT0gTlVMTCkgfHwgKGYgPT0gTlVMTCkpCisJCXJldHVybiAwOworCW1hbGxvY19sb2NrZWRfZnVuYz1tOyBtYWxsb2NfbG9ja2VkX2V4X2Z1bmM9ZGVmYXVsdF9tYWxsb2NfbG9ja2VkX2V4OworCWZyZWVfbG9ja2VkX2Z1bmM9ZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBDUllQVE9fc2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zKAorICAgICAgICB2b2lkICooKm0pKHNpemVfdCxjb25zdCBjaGFyICosaW50KSwKKyAgICAgICAgdm9pZCAoKmYpKHZvaWQgKikpCisJeworCWlmICghYWxsb3dfY3VzdG9taXplKQorCQlyZXR1cm4gMDsKKwlpZiAoKG0gPT0gTlVMTCkgfHwgKGYgPT0gTlVMTCkpCisJCXJldHVybiAwOworCW1hbGxvY19sb2NrZWRfZnVuYz0wOyBtYWxsb2NfbG9ja2VkX2V4X2Z1bmM9bTsKKwlmcmVlX2Z1bmM9ZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnModm9pZCAoKm0pKHZvaWQgKixpbnQsY29uc3QgY2hhciAqLGludCxpbnQpLAorCQkJCSAgIHZvaWQgKCpyKSh2b2lkICosdm9pZCAqLGludCxjb25zdCBjaGFyICosaW50LGludCksCisJCQkJICAgdm9pZCAoKmYpKHZvaWQgKixpbnQpLAorCQkJCSAgIHZvaWQgKCpzbykobG9uZyksCisJCQkJICAgbG9uZyAoKmdvKSh2b2lkKSkKKwl7CisJaWYgKCFhbGxvd19jdXN0b21pemVfZGVidWcpCisJCXJldHVybiAwOworCW1hbGxvY19kZWJ1Z19mdW5jPW07CisJcmVhbGxvY19kZWJ1Z19mdW5jPXI7CisJZnJlZV9kZWJ1Z19mdW5jPWY7CisJc2V0X2RlYnVnX29wdGlvbnNfZnVuYz1zbzsKKwlnZXRfZGVidWdfb3B0aW9uc19mdW5jPWdvOworCXJldHVybiAxOworCX0KKworCit2b2lkIENSWVBUT19nZXRfbWVtX2Z1bmN0aW9ucyh2b2lkICooKiptKShzaXplX3QpLCB2b2lkICooKipyKSh2b2lkICosIHNpemVfdCksCisJdm9pZCAoKipmKSh2b2lkICopKQorCXsKKwlpZiAobSAhPSBOVUxMKSAqbSA9IChtYWxsb2NfZXhfZnVuYyA9PSBkZWZhdWx0X21hbGxvY19leCkgPyAKKwkgICAgICAgICAgICAgICAgICAgICBtYWxsb2NfZnVuYyA6IDA7CisJaWYgKHIgIT0gTlVMTCkgKnIgPSAocmVhbGxvY19leF9mdW5jID09IGRlZmF1bHRfcmVhbGxvY19leCkgPyAKKwkgICAgICAgICAgICAgICAgICAgICByZWFsbG9jX2Z1bmMgOiAwOworCWlmIChmICE9IE5VTEwpICpmPWZyZWVfZnVuYzsKKwl9CisKK3ZvaWQgQ1JZUFRPX2dldF9tZW1fZXhfZnVuY3Rpb25zKAorICAgICAgICB2b2lkICooKiptKShzaXplX3QsY29uc3QgY2hhciAqLGludCksCisgICAgICAgIHZvaWQgKigqKnIpKHZvaWQgKiwgc2l6ZV90LGNvbnN0IGNoYXIgKixpbnQpLAorCXZvaWQgKCoqZikodm9pZCAqKSkKKwl7CisJaWYgKG0gIT0gTlVMTCkgKm0gPSAobWFsbG9jX2V4X2Z1bmMgIT0gZGVmYXVsdF9tYWxsb2NfZXgpID8KKwkgICAgICAgICAgICAgICAgICAgIG1hbGxvY19leF9mdW5jIDogMDsKKwlpZiAociAhPSBOVUxMKSAqciA9IChyZWFsbG9jX2V4X2Z1bmMgIT0gZGVmYXVsdF9yZWFsbG9jX2V4KSA/CisJICAgICAgICAgICAgICAgICAgICByZWFsbG9jX2V4X2Z1bmMgOiAwOworCWlmIChmICE9IE5VTEwpICpmPWZyZWVfZnVuYzsKKwl9CisKK3ZvaWQgQ1JZUFRPX2dldF9sb2NrZWRfbWVtX2Z1bmN0aW9ucyh2b2lkICooKiptKShzaXplX3QpLCB2b2lkICgqKmYpKHZvaWQgKikpCisJeworCWlmIChtICE9IE5VTEwpICptID0gKG1hbGxvY19sb2NrZWRfZXhfZnVuYyA9PSBkZWZhdWx0X21hbGxvY19sb2NrZWRfZXgpID8gCisJICAgICAgICAgICAgICAgICAgICAgbWFsbG9jX2xvY2tlZF9mdW5jIDogMDsKKwlpZiAoZiAhPSBOVUxMKSAqZj1mcmVlX2xvY2tlZF9mdW5jOworCX0KKwordm9pZCBDUllQVE9fZ2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zKAorICAgICAgICB2b2lkICooKiptKShzaXplX3QsY29uc3QgY2hhciAqLGludCksCisgICAgICAgIHZvaWQgKCoqZikodm9pZCAqKSkKKwl7CisJaWYgKG0gIT0gTlVMTCkgKm0gPSAobWFsbG9jX2xvY2tlZF9leF9mdW5jICE9IGRlZmF1bHRfbWFsbG9jX2xvY2tlZF9leCkgPworCSAgICAgICAgICAgICAgICAgICAgbWFsbG9jX2xvY2tlZF9leF9mdW5jIDogMDsKKwlpZiAoZiAhPSBOVUxMKSAqZj1mcmVlX2xvY2tlZF9mdW5jOworCX0KKwordm9pZCBDUllQVE9fZ2V0X21lbV9kZWJ1Z19mdW5jdGlvbnModm9pZCAoKiptKSh2b2lkICosaW50LGNvbnN0IGNoYXIgKixpbnQsaW50KSwKKwkJCQkgICAgdm9pZCAoKipyKSh2b2lkICosdm9pZCAqLGludCxjb25zdCBjaGFyICosaW50LGludCksCisJCQkJICAgIHZvaWQgKCoqZikodm9pZCAqLGludCksCisJCQkJICAgIHZvaWQgKCoqc28pKGxvbmcpLAorCQkJCSAgICBsb25nICgqKmdvKSh2b2lkKSkKKwl7CisJaWYgKG0gIT0gTlVMTCkgKm09bWFsbG9jX2RlYnVnX2Z1bmM7CisJaWYgKHIgIT0gTlVMTCkgKnI9cmVhbGxvY19kZWJ1Z19mdW5jOworCWlmIChmICE9IE5VTEwpICpmPWZyZWVfZGVidWdfZnVuYzsKKwlpZiAoc28gIT0gTlVMTCkgKnNvPXNldF9kZWJ1Z19vcHRpb25zX2Z1bmM7CisJaWYgKGdvICE9IE5VTEwpICpnbz1nZXRfZGVidWdfb3B0aW9uc19mdW5jOworCX0KKworCit2b2lkICpDUllQVE9fbWFsbG9jX2xvY2tlZChpbnQgbnVtLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKwl7CisJdm9pZCAqcmV0ID0gTlVMTDsKKworCWlmIChudW0gPD0gMCkgcmV0dXJuIE5VTEw7CisKKwlhbGxvd19jdXN0b21pemUgPSAwOworCWlmIChtYWxsb2NfZGVidWdfZnVuYyAhPSBOVUxMKQorCQl7CisJCWFsbG93X2N1c3RvbWl6ZV9kZWJ1ZyA9IDA7CisJCW1hbGxvY19kZWJ1Z19mdW5jKE5VTEwsIG51bSwgZmlsZSwgbGluZSwgMCk7CisJCX0KKwlyZXQgPSBtYWxsb2NfbG9ja2VkX2V4X2Z1bmMobnVtLGZpbGUsbGluZSk7CisjaWZkZWYgTEVWSVRURV9ERUJVR19NRU0KKwlmcHJpbnRmKHN0ZGVyciwgIkxFVklUVEVfREVCVUdfTUVNOiAgICAgICAgID4gMHglcCAoJWQpXG4iLCByZXQsIG51bSk7CisjZW5kaWYKKwlpZiAobWFsbG9jX2RlYnVnX2Z1bmMgIT0gTlVMTCkKKwkJbWFsbG9jX2RlYnVnX2Z1bmMocmV0LCBudW0sIGZpbGUsIGxpbmUsIDEpOworCisjaWZuZGVmIE9QRU5TU0xfQ1BVSURfT0JKCisgICAgICAgIC8qIENyZWF0ZSBhIGRlcGVuZGVuY3kgb24gdGhlIHZhbHVlIG9mICdjbGVhbnNlX2N0cicgc28gb3VyIG1lbW9yeQorICAgICAgICAgKiBzYW5pdGlzYXRpb24gZnVuY3Rpb24gY2FuJ3QgYmUgb3B0aW1pc2VkIG91dC4gTkI6IFdlIG9ubHkgZG8KKyAgICAgICAgICogdGhpcyBmb3IgPjJLYiBzbyB0aGUgb3ZlcmhlYWQgZG9lc24ndCBib3RoZXIgdXMuICovCisgICAgICAgIGlmKHJldCAmJiAobnVtID4gMjA0OCkpCisJewlleHRlcm4gdW5zaWduZWQgY2hhciBjbGVhbnNlX2N0cjsKKwkJKCh1bnNpZ25lZCBjaGFyICopcmV0KVswXSA9IGNsZWFuc2VfY3RyOworCX0KKyNlbmRpZgorCisJcmV0dXJuIHJldDsKKwl9CisKK3ZvaWQgQ1JZUFRPX2ZyZWVfbG9ja2VkKHZvaWQgKnN0cikKKwl7CisJaWYgKGZyZWVfZGVidWdfZnVuYyAhPSBOVUxMKQorCQlmcmVlX2RlYnVnX2Z1bmMoc3RyLCAwKTsKKyNpZmRlZiBMRVZJVFRFX0RFQlVHX01FTQorCWZwcmludGYoc3RkZXJyLCAiTEVWSVRURV9ERUJVR19NRU06ICAgICAgICAgPCAweCVwXG4iLCBzdHIpOworI2VuZGlmCisJZnJlZV9sb2NrZWRfZnVuYyhzdHIpOworCWlmIChmcmVlX2RlYnVnX2Z1bmMgIT0gTlVMTCkKKwkJZnJlZV9kZWJ1Z19mdW5jKE5VTEwsIDEpOworCX0KKwordm9pZCAqQ1JZUFRPX21hbGxvYyhpbnQgbnVtLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKwl7CisJdm9pZCAqcmV0ID0gTlVMTDsKKworCWlmIChudW0gPD0gMCkgcmV0dXJuIE5VTEw7CisKKwlhbGxvd19jdXN0b21pemUgPSAwOworCWlmIChtYWxsb2NfZGVidWdfZnVuYyAhPSBOVUxMKQorCQl7CisJCWFsbG93X2N1c3RvbWl6ZV9kZWJ1ZyA9IDA7CisJCW1hbGxvY19kZWJ1Z19mdW5jKE5VTEwsIG51bSwgZmlsZSwgbGluZSwgMCk7CisJCX0KKwlyZXQgPSBtYWxsb2NfZXhfZnVuYyhudW0sZmlsZSxsaW5lKTsKKyNpZmRlZiBMRVZJVFRFX0RFQlVHX01FTQorCWZwcmludGYoc3RkZXJyLCAiTEVWSVRURV9ERUJVR19NRU06ICAgICAgICAgPiAweCVwICglZClcbiIsIHJldCwgbnVtKTsKKyNlbmRpZgorCWlmIChtYWxsb2NfZGVidWdfZnVuYyAhPSBOVUxMKQorCQltYWxsb2NfZGVidWdfZnVuYyhyZXQsIG51bSwgZmlsZSwgbGluZSwgMSk7CisKKyNpZm5kZWYgT1BFTlNTTF9DUFVJRF9PQkoKKyAgICAgICAgLyogQ3JlYXRlIGEgZGVwZW5kZW5jeSBvbiB0aGUgdmFsdWUgb2YgJ2NsZWFuc2VfY3RyJyBzbyBvdXIgbWVtb3J5CisgICAgICAgICAqIHNhbml0aXNhdGlvbiBmdW5jdGlvbiBjYW4ndCBiZSBvcHRpbWlzZWQgb3V0LiBOQjogV2Ugb25seSBkbworICAgICAgICAgKiB0aGlzIGZvciA+MktiIHNvIHRoZSBvdmVyaGVhZCBkb2Vzbid0IGJvdGhlciB1cy4gKi8KKyAgICAgICAgaWYocmV0ICYmIChudW0gPiAyMDQ4KSkKKwl7CWV4dGVybiB1bnNpZ25lZCBjaGFyIGNsZWFuc2VfY3RyOworICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciAqKXJldClbMF0gPSBjbGVhbnNlX2N0cjsKKwl9CisjZW5kaWYKKworCXJldHVybiByZXQ7CisJfQorY2hhciAqQ1JZUFRPX3N0cmR1cChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQorCXsKKwljaGFyICpyZXQgPSBDUllQVE9fbWFsbG9jKHN0cmxlbihzdHIpKzEsIGZpbGUsIGxpbmUpOworCisJc3RyY3B5KHJldCwgc3RyKTsKKwlyZXR1cm4gcmV0OworCX0KKwordm9pZCAqQ1JZUFRPX3JlYWxsb2Modm9pZCAqc3RyLCBpbnQgbnVtLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKwl7CisJdm9pZCAqcmV0ID0gTlVMTDsKKworCWlmIChzdHIgPT0gTlVMTCkKKwkJcmV0dXJuIENSWVBUT19tYWxsb2MobnVtLCBmaWxlLCBsaW5lKTsKKworCWlmIChudW0gPD0gMCkgcmV0dXJuIE5VTEw7CisKKwlpZiAocmVhbGxvY19kZWJ1Z19mdW5jICE9IE5VTEwpCisJCXJlYWxsb2NfZGVidWdfZnVuYyhzdHIsIE5VTEwsIG51bSwgZmlsZSwgbGluZSwgMCk7CisJcmV0ID0gcmVhbGxvY19leF9mdW5jKHN0cixudW0sZmlsZSxsaW5lKTsKKyNpZmRlZiBMRVZJVFRFX0RFQlVHX01FTQorCWZwcmludGYoc3RkZXJyLCAiTEVWSVRURV9ERUJVR19NRU06ICAgICAgICAgfCAweCVwIC0+IDB4JXAgKCVkKVxuIiwgc3RyLCByZXQsIG51bSk7CisjZW5kaWYKKwlpZiAocmVhbGxvY19kZWJ1Z19mdW5jICE9IE5VTEwpCisJCXJlYWxsb2NfZGVidWdfZnVuYyhzdHIsIHJldCwgbnVtLCBmaWxlLCBsaW5lLCAxKTsKKworCXJldHVybiByZXQ7CisJfQorCit2b2lkICpDUllQVE9fcmVhbGxvY19jbGVhbih2b2lkICpzdHIsIGludCBvbGRfbGVuLCBpbnQgbnVtLCBjb25zdCBjaGFyICpmaWxlLAorCQkJICAgaW50IGxpbmUpCisJeworCXZvaWQgKnJldCA9IE5VTEw7CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBDUllQVE9fbWFsbG9jKG51bSwgZmlsZSwgbGluZSk7CisKKwlpZiAobnVtIDw9IDApIHJldHVybiBOVUxMOworCisJaWYgKHJlYWxsb2NfZGVidWdfZnVuYyAhPSBOVUxMKQorCQlyZWFsbG9jX2RlYnVnX2Z1bmMoc3RyLCBOVUxMLCBudW0sIGZpbGUsIGxpbmUsIDApOworCXJldD1tYWxsb2NfZXhfZnVuYyhudW0sZmlsZSxsaW5lKTsKKwlpZihyZXQpCisJCXsKKwkJbWVtY3B5KHJldCxzdHIsb2xkX2xlbik7CisJCU9QRU5TU0xfY2xlYW5zZShzdHIsb2xkX2xlbik7CisJCWZyZWVfZnVuYyhzdHIpOworCQl9CisjaWZkZWYgTEVWSVRURV9ERUJVR19NRU0KKwlmcHJpbnRmKHN0ZGVyciwKKwkJIkxFVklUVEVfREVCVUdfTUVNOiAgICAgICAgIHwgMHglcCAtPiAweCVwICglZClcbiIsCisJCXN0ciwgcmV0LCBudW0pOworI2VuZGlmCisJaWYgKHJlYWxsb2NfZGVidWdfZnVuYyAhPSBOVUxMKQorCQlyZWFsbG9jX2RlYnVnX2Z1bmMoc3RyLCByZXQsIG51bSwgZmlsZSwgbGluZSwgMSk7CisKKwlyZXR1cm4gcmV0OworCX0KKwordm9pZCBDUllQVE9fZnJlZSh2b2lkICpzdHIpCisJeworCWlmIChmcmVlX2RlYnVnX2Z1bmMgIT0gTlVMTCkKKwkJZnJlZV9kZWJ1Z19mdW5jKHN0ciwgMCk7CisjaWZkZWYgTEVWSVRURV9ERUJVR19NRU0KKwlmcHJpbnRmKHN0ZGVyciwgIkxFVklUVEVfREVCVUdfTUVNOiAgICAgICAgIDwgMHglcFxuIiwgc3RyKTsKKyNlbmRpZgorCWZyZWVfZnVuYyhzdHIpOworCWlmIChmcmVlX2RlYnVnX2Z1bmMgIT0gTlVMTCkKKwkJZnJlZV9kZWJ1Z19mdW5jKE5VTEwsIDEpOworCX0KKwordm9pZCAqQ1JZUFRPX3JlbWFsbG9jKHZvaWQgKmEsIGludCBudW0sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQorCXsKKwlpZiAoYSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYSk7CisJYT0oY2hhciAqKU9QRU5TU0xfbWFsbG9jKG51bSk7CisJcmV0dXJuKGEpOworCX0KKwordm9pZCBDUllQVE9fc2V0X21lbV9kZWJ1Z19vcHRpb25zKGxvbmcgYml0cykKKwl7CisJaWYgKHNldF9kZWJ1Z19vcHRpb25zX2Z1bmMgIT0gTlVMTCkKKwkJc2V0X2RlYnVnX29wdGlvbnNfZnVuYyhiaXRzKTsKKwl9CisKK2xvbmcgQ1JZUFRPX2dldF9tZW1fZGVidWdfb3B0aW9ucyh2b2lkKQorCXsKKwlpZiAoZ2V0X2RlYnVnX29wdGlvbnNfZnVuYyAhPSBOVUxMKQorCQlyZXR1cm4gZ2V0X2RlYnVnX29wdGlvbnNfZnVuYygpOworCXJldHVybiAwOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tZW1fY2xyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWVtX2Nsci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZDFmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbWVtX2Nsci5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIGNyeXB0by9tZW1fY2xyLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIChnZW9mZkBnZW9mZnRob3JwZS5uZXQpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAyLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCit1bnNpZ25lZCBjaGFyIGNsZWFuc2VfY3RyID0gMDsKKwordm9pZCBPUEVOU1NMX2NsZWFuc2Uodm9pZCAqcHRyLCBzaXplX3QgbGVuKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwID0gcHRyOworCXNpemVfdCBsb29wID0gbGVuLCBjdHIgPSBjbGVhbnNlX2N0cjsKKwl3aGlsZShsb29wLS0pCisJCXsKKwkJKihwKyspID0gKHVuc2lnbmVkIGNoYXIpY3RyOworCQljdHIgKz0gKDE3ICsgKChzaXplX3QpcCAmIDB4RikpOworCQl9CisJcD1tZW1jaHIocHRyLCAodW5zaWduZWQgY2hhciljdHIsIGxlbik7CisJaWYocCkKKwkJY3RyICs9ICg2MyArIChzaXplX3QpcCk7CisJY2xlYW5zZV9jdHIgPSAodW5zaWduZWQgY2hhciljdHI7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21lbV9kYmcuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZW1fZGJnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM3OTMzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tZW1fZGJnLmMKQEAgLTAsMCArMSw4NzQgQEAKKy8qIGNyeXB0by9tZW1fZGJnLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CQorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorCitzdGF0aWMgaW50IG1oX21vZGU9Q1JZUFRPX01FTV9DSEVDS19PRkY7CisvKiBUaGUgc3RhdGUgY2hhbmdlcyB0byBDUllQVE9fTUVNX0NIRUNLX09OIHwgQ1JZUFRPX01FTV9DSEVDS19FTkFCTEUKKyAqIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGFza3MgZm9yIGl0ICh1c3VhbGx5IGFmdGVyIGxpYnJhcnkgaW5pdGlhbGlzYXRpb24KKyAqIGZvciB3aGljaCBubyBib29rLWtlZXBpbmcgaXMgZGVzaXJlZCkuCisgKgorICogU3RhdGUgQ1JZUFRPX01FTV9DSEVDS19PTiBleGlzdHMgb25seSB0ZW1wb3JhcmlseSB3aGVuIHRoZSBsaWJyYXJ5CisgKiB0aGlua3MgdGhhdCBjZXJ0YWluIGFsbG9jYXRpb25zIHNob3VsZCBub3QgYmUgY2hlY2tlZCAoZS5nLiB0aGUgZGF0YQorICogc3RydWN0dXJlcyB1c2VkIGZvciBtZW1vcnkgY2hlY2tpbmcpLiAgSXQgaXMgbm90IHN1aXRhYmxlIGFzIGFuIGluaXRpYWwKKyAqIHN0YXRlOiB0aGUgbGlicmFyeSB3aWxsIHVuZXhwZWN0ZWRseSBlbmFibGUgbWVtb3J5IGNoZWNraW5nIHdoZW4gaXQKKyAqIGV4ZWN1dGVzIG9uZSBvZiB0aG9zZSBzZWN0aW9ucyB0aGF0IHdhbnQgdG8gZGlzYWJsZSBjaGVja2luZworICogdGVtcG9yYXJpbHkuCisgKgorICogU3RhdGUgQ1JZUFRPX01FTV9DSEVDS19FTkFCTEUgd2l0aG91dCAuLi5fT04gbWFrZXMgbm8gc2Vuc2Ugd2hhdHNvZXZlci4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBvcmRlciA9IDA7IC8qIG51bWJlciBvZiBtZW1vcnkgcmVxdWVzdHMgKi8KKworREVDTEFSRV9MSEFTSF9PRihNRU0pOworc3RhdGljIExIQVNIX09GKE1FTSkgKm1oPU5VTEw7IC8qIGhhc2gtdGFibGUgb2YgbWVtb3J5IHJlcXVlc3RzCisJCQkJKiAoYWRkcmVzcyBhcyBrZXkpOyBhY2Nlc3MgcmVxdWlyZXMKKwkJCQkqIE1BTExPQzIgbG9jayAqLworCisKK3R5cGVkZWYgc3RydWN0IGFwcF9tZW1faW5mb19zdAorLyogRm9yIGFwcGxpY2F0aW9uLWRlZmluZWQgaW5mb3JtYXRpb24gKHN0YXRpYyBDLXN0cmluZyBgaW5mbycpCisgKiB0byBiZSBkaXNwbGF5ZWQgaW4gbWVtb3J5IGxlYWsgbGlzdC4KKyAqIEVhY2ggdGhyZWFkIGhhcyBpdHMgb3duIHN0YWNrLiAgRm9yIGFwcGxpY2F0aW9ucywgdGhlcmUgaXMKKyAqICAgQ1JZUFRPX3B1c2hfaW5mbygiLi4uIikgICAgIHRvIHB1c2ggYW4gZW50cnksCisgKiAgIENSWVBUT19wb3BfaW5mbygpICAgICAgICAgICB0byBwb3AgYW4gZW50cnksCisgKiAgIENSWVBUT19yZW1vdmVfYWxsX2luZm8oKSAgICB0byBwb3AgYWxsIGVudHJpZXMuCisgKi8KKwl7CisJQ1JZUFRPX1RIUkVBRElEIHRocmVhZGlkOworCWNvbnN0IGNoYXIgKmZpbGU7CisJaW50IGxpbmU7CisJY29uc3QgY2hhciAqaW5mbzsKKwlzdHJ1Y3QgYXBwX21lbV9pbmZvX3N0ICpuZXh0OyAvKiB0YWlsIG9mIHRocmVhZCdzIHN0YWNrICovCisJaW50IHJlZmVyZW5jZXM7CisJfSBBUFBfSU5GTzsKKworc3RhdGljIHZvaWQgYXBwX2luZm9fZnJlZShBUFBfSU5GTyAqKTsKKworREVDTEFSRV9MSEFTSF9PRihBUFBfSU5GTyk7CitzdGF0aWMgTEhBU0hfT0YoQVBQX0lORk8pICphbWloPU5VTEw7IC8qIGhhc2gtdGFibGUgd2l0aCB0aG9zZQorCQkJCSAgICAgICAqIGFwcF9tZW1faW5mb19zdCdzIHRoYXQgYXJlIGF0CisJCQkJICAgICAgICogdGhlIHRvcCBvZiB0aGVpciB0aHJlYWQncworCQkJCSAgICAgICAqIHN0YWNrICh3aXRoIGB0aHJlYWQnIGFzIGtleSk7CisJCQkJICAgICAgICogYWNjZXNzIHJlcXVpcmVzIE1BTExPQzIKKwkJCQkgICAgICAgKiBsb2NrICovCisKK3R5cGVkZWYgc3RydWN0IG1lbV9zdAorLyogbWVtb3J5LWJsb2NrIGRlc2NyaXB0aW9uICovCisJeworCXZvaWQgKmFkZHI7CisJaW50IG51bTsKKwljb25zdCBjaGFyICpmaWxlOworCWludCBsaW5lOworCUNSWVBUT19USFJFQURJRCB0aHJlYWRpZDsKKwl1bnNpZ25lZCBsb25nIG9yZGVyOworCXRpbWVfdCB0aW1lOworCUFQUF9JTkZPICphcHBfaW5mbzsKKwl9IE1FTTsKKworc3RhdGljIGxvbmcgb3B0aW9ucyA9ICAgICAgICAgICAgIC8qIGV4dHJhIGluZm9ybWF0aW9uIHRvIGJlIHJlY29yZGVkICovCisjaWYgZGVmaW5lZChDUllQVE9fTURFQlVHX1RJTUUpIHx8IGRlZmluZWQoQ1JZUFRPX01ERUJVR19BTEwpCisJVl9DUllQVE9fTURFQlVHX1RJTUUgfAorI2VuZGlmCisjaWYgZGVmaW5lZChDUllQVE9fTURFQlVHX1RIUkVBRCkgfHwgZGVmaW5lZChDUllQVE9fTURFQlVHX0FMTCkKKwlWX0NSWVBUT19NREVCVUdfVEhSRUFEIHwKKyNlbmRpZgorCTA7CisKKworc3RhdGljIHVuc2lnbmVkIGludCBudW1fZGlzYWJsZSA9IDA7IC8qIG51bV9kaXNhYmxlID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgICBpZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtaF9tb2RlID09IENSWVBUT19NRU1fQ0hFQ0tfT04gKHcvbyAuLi5fRU5BQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBWYWxpZCBpZmYgbnVtX2Rpc2FibGUgPiAwLiAgQ1JZUFRPX0xPQ0tfTUFMTE9DMiBpcyBsb2NrZWQgZXhhY3RseSBpbiB0aGlzCisgKiBjYXNlIChieSB0aGUgdGhyZWFkIG5hbWVkIGluIGRpc2FibGluZ190aHJlYWQpLgorICovCitzdGF0aWMgQ1JZUFRPX1RIUkVBRElEIGRpc2FibGluZ190aHJlYWRpZDsKKworc3RhdGljIHZvaWQgYXBwX2luZm9fZnJlZShBUFBfSU5GTyAqaW5mKQorCXsKKwlpZiAoLS0oaW5mLT5yZWZlcmVuY2VzKSA8PSAwKQorCQl7CisJCWlmIChpbmYtPm5leHQgIT0gTlVMTCkKKwkJCXsKKwkJCWFwcF9pbmZvX2ZyZWUoaW5mLT5uZXh0KTsKKwkJCX0KKwkJT1BFTlNTTF9mcmVlKGluZik7CisJCX0KKwl9CisKK2ludCBDUllQVE9fbWVtX2N0cmwoaW50IG1vZGUpCisJeworCWludCByZXQ9bWhfbW9kZTsKKworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfTUFMTE9DKTsKKwlzd2l0Y2ggKG1vZGUpCisJCXsKKwkvKiBmb3IgYXBwbGljYXRpb25zIChub3QgdG8gYmUgY2FsbGVkIHdoaWxlIG11bHRpcGxlIHRocmVhZHMKKwkgKiB1c2UgdGhlIGxpYnJhcnkpOiAqLworCWNhc2UgQ1JZUFRPX01FTV9DSEVDS19PTjogLyogYWthIE1lbUNoZWNrX3N0YXJ0KCkgKi8KKwkJbWhfbW9kZSA9IENSWVBUT19NRU1fQ0hFQ0tfT058Q1JZUFRPX01FTV9DSEVDS19FTkFCTEU7CisJCW51bV9kaXNhYmxlID0gMDsKKwkJYnJlYWs7CisJY2FzZSBDUllQVE9fTUVNX0NIRUNLX09GRjogLyogYWthIE1lbUNoZWNrX3N0b3AoKSAqLworCQltaF9tb2RlID0gMDsKKwkJbnVtX2Rpc2FibGUgPSAwOyAvKiBzaG91bGQgYmUgdHJ1ZSAqYmVmb3JlKiBNZW1DaGVja19zdG9wIGlzIHVzZWQsCisJCSAgICAgICAgICAgICAgICAgICAgb3IgdGhlcmUnbGwgYmUgYSBsb3Qgb2YgY29uZnVzaW9uICovCisJCWJyZWFrOworCisJLyogc3dpdGNoIG9mZiB0ZW1wb3JhcmlseSAoZm9yIGxpYnJhcnktaW50ZXJuYWwgdXNlKTogKi8KKwljYXNlIENSWVBUT19NRU1fQ0hFQ0tfRElTQUJMRTogLyogYWthIE1lbUNoZWNrX29mZigpICovCisJCWlmIChtaF9tb2RlICYgQ1JZUFRPX01FTV9DSEVDS19PTikKKwkJCXsKKwkJCUNSWVBUT19USFJFQURJRCBjdXI7CisJCQlDUllQVE9fVEhSRUFESURfY3VycmVudCgmY3VyKTsKKwkJCWlmICghbnVtX2Rpc2FibGUgfHwgQ1JZUFRPX1RIUkVBRElEX2NtcCgmZGlzYWJsaW5nX3RocmVhZGlkLCAmY3VyKSkgLyogb3RoZXJ3aXNlIHdlIGFscmVhZHkgaGF2ZSB0aGUgTUFMTE9DMiBsb2NrICovCisJCQkJeworCQkJCS8qIExvbmctdGltZSBsb2NrIENSWVBUT19MT0NLX01BTExPQzIgbXVzdCBub3QgYmUgY2xhaW1lZCB3aGlsZQorCQkJCSAqIHdlJ3JlIGhvbGRpbmcgQ1JZUFRPX0xPQ0tfTUFMTE9DLCBvciB3ZSdsbCBkZWFkbG9jayBpZgorCQkJCSAqIHNvbWVib2R5IGVsc2UgaG9sZHMgQ1JZUFRPX0xPQ0tfTUFMTE9DMiAoYW5kIGNhbm5vdCByZWxlYXNlCisJCQkJICogaXQgYmVjYXVzZSB3ZSBibG9jayBlbnRyeSB0byB0aGlzIGZ1bmN0aW9uKS4KKwkJCQkgKiBHaXZlIHRoZW0gYSBjaGFuY2UsIGZpcnN0LCBhbmQgdGhlbiBjbGFpbSB0aGUgbG9ja3MgaW4KKwkJCQkgKiBhcHByb3ByaWF0ZSBvcmRlciAobG9uZy10aW1lIGxvY2sgZmlyc3QpLgorCQkJCSAqLworCQkJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19NQUxMT0MpOworCQkJCS8qIE5vdGUgdGhhdCBhZnRlciB3ZSBoYXZlIHdhaXRlZCBmb3IgQ1JZUFRPX0xPQ0tfTUFMTE9DMgorCQkJCSAqIGFuZCBDUllQVE9fTE9DS19NQUxMT0MsIHdlJ2xsIHN0aWxsIGJlIGluIHRoZSByaWdodAorCQkJCSAqICJjYXNlIiBhbmQgImlmIiBicmFuY2ggYmVjYXVzZSBNZW1DaGVja19zdGFydCBhbmQKKwkJCQkgKiBNZW1DaGVja19zdG9wIG1heSBuZXZlciBiZSB1c2VkIHdoaWxlIHRoZXJlIGFyZSBtdWx0aXBsZQorCQkJCSAqIE9wZW5TU0wgdGhyZWFkcy4gKi8KKwkJCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX01BTExPQzIpOworCQkJCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfTUFMTE9DKTsKKwkJCQltaF9tb2RlICY9IH5DUllQVE9fTUVNX0NIRUNLX0VOQUJMRTsKKwkJCQlDUllQVE9fVEhSRUFESURfY3B5KCZkaXNhYmxpbmdfdGhyZWFkaWQsICZjdXIpOworCQkJCX0KKwkJCW51bV9kaXNhYmxlKys7CisJCQl9CisJCWJyZWFrOworCWNhc2UgQ1JZUFRPX01FTV9DSEVDS19FTkFCTEU6IC8qIGFrYSBNZW1DaGVja19vbigpICovCisJCWlmIChtaF9tb2RlICYgQ1JZUFRPX01FTV9DSEVDS19PTikKKwkJCXsKKwkJCWlmIChudW1fZGlzYWJsZSkgLyogYWx3YXlzIHRydWUsIG9yIHNvbWV0aGluZyBpcyBnb2luZyB3cm9uZyAqLworCQkJCXsKKwkJCQludW1fZGlzYWJsZS0tOworCQkJCWlmIChudW1fZGlzYWJsZSA9PSAwKQorCQkJCQl7CisJCQkJCW1oX21vZGV8PUNSWVBUT19NRU1fQ0hFQ0tfRU5BQkxFOworCQkJCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfTUFMTE9DMik7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfTUFMTE9DKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBDUllQVE9faXNfbWVtX2NoZWNrX29uKHZvaWQpCisJeworCWludCByZXQgPSAwOworCisJaWYgKG1oX21vZGUgJiBDUllQVE9fTUVNX0NIRUNLX09OKQorCQl7CisJCUNSWVBUT19USFJFQURJRCBjdXI7CisJCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZjdXIpOworCQlDUllQVE9fcl9sb2NrKENSWVBUT19MT0NLX01BTExPQyk7CisKKwkJcmV0ID0gKG1oX21vZGUgJiBDUllQVE9fTUVNX0NIRUNLX0VOQUJMRSkKKwkJICAgICAgICB8fCBDUllQVE9fVEhSRUFESURfY21wKCZkaXNhYmxpbmdfdGhyZWFkaWQsICZjdXIpOworCisJCUNSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19NQUxMT0MpOworCQl9CisJcmV0dXJuKHJldCk7CisJfQkKKworCit2b2lkIENSWVBUT19kYmdfc2V0X29wdGlvbnMobG9uZyBiaXRzKQorCXsKKwlvcHRpb25zID0gYml0czsKKwl9CisKK2xvbmcgQ1JZUFRPX2RiZ19nZXRfb3B0aW9ucyh2b2lkKQorCXsKKwlyZXR1cm4gb3B0aW9uczsKKwl9CisKK3N0YXRpYyBpbnQgbWVtX2NtcChjb25zdCBNRU0gKmEsIGNvbnN0IE1FTSAqYikKKwl7CisjaWZkZWYgX1dJTjY0CisJY29uc3QgY2hhciAqYXA9KGNvbnN0IGNoYXIgKilhLT5hZGRyLAorCQkgICAqYnA9KGNvbnN0IGNoYXIgKiliLT5hZGRyOworCWlmIChhcD09YnApCXJldHVybiAwOworCWVsc2UgaWYgKGFwPmJwKQlyZXR1cm4gMTsKKwllbHNlCQlyZXR1cm4gLTE7CisjZWxzZQorCXJldHVybiAoY29uc3QgY2hhciAqKWEtPmFkZHIgLSAoY29uc3QgY2hhciAqKWItPmFkZHI7CisjZW5kaWYKKwl9CitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0NPTVBfRk4obWVtLCBNRU0pCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1lbV9oYXNoKGNvbnN0IE1FTSAqYSkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlyZXQ9KHVuc2lnbmVkIGxvbmcpYS0+YWRkcjsKKworCXJldD1yZXQqMTc4NTErKHJldD4+MTQpKjcrKHJldD4+NCkqMjUxOworCXJldHVybihyZXQpOworCX0KK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfSEFTSF9GTihtZW0sIE1FTSkKKworLyogc3RhdGljIGludCBhcHBfaW5mb19jbXAoQVBQX0lORk8gKmEsIEFQUF9JTkZPICpiKSAqLworc3RhdGljIGludCBhcHBfaW5mb19jbXAoY29uc3Qgdm9pZCAqYV92b2lkLCBjb25zdCB2b2lkICpiX3ZvaWQpCisJeworCXJldHVybiBDUllQVE9fVEhSRUFESURfY21wKCYoKGNvbnN0IEFQUF9JTkZPICopYV92b2lkKS0+dGhyZWFkaWQsCisJCQkJJigoY29uc3QgQVBQX0lORk8gKiliX3ZvaWQpLT50aHJlYWRpZCk7CisJfQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9DT01QX0ZOKGFwcF9pbmZvLCBBUFBfSU5GTykKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYXBwX2luZm9faGFzaChjb25zdCBBUFBfSU5GTyAqYSkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlyZXQgPSBDUllQVE9fVEhSRUFESURfaGFzaCgmYS0+dGhyZWFkaWQpOworCS8qIFRoaXMgaXMgbGVmdCBpbiBhcyBhICJ3aG8gYW0gSSB0byBxdWVzdGlvbiBsZWdhY3k/IiBtZWFzdXJlICovCisJcmV0PXJldCoxNzg1MSsocmV0Pj4xNCkqNysocmV0Pj40KSoyNTE7CisJcmV0dXJuKHJldCk7CisJfQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9IQVNIX0ZOKGFwcF9pbmZvLCBBUFBfSU5GTykKKworc3RhdGljIEFQUF9JTkZPICpwb3BfaW5mbyh2b2lkKQorCXsKKwlBUFBfSU5GTyB0bXA7CisJQVBQX0lORk8gKnJldCA9IE5VTEw7CisKKwlpZiAoYW1paCAhPSBOVUxMKQorCQl7CisJCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZ0bXAudGhyZWFkaWQpOworCQlpZiAoKHJldD1saF9BUFBfSU5GT19kZWxldGUoYW1paCwmdG1wKSkgIT0gTlVMTCkKKwkJCXsKKwkJCUFQUF9JTkZPICpuZXh0PXJldC0+bmV4dDsKKworCQkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCQl7CisJCQkJbmV4dC0+cmVmZXJlbmNlcysrOworCQkJCSh2b2lkKWxoX0FQUF9JTkZPX2luc2VydChhbWloLG5leHQpOworCQkJCX0KKyNpZmRlZiBMRVZJVFRFX0RFQlVHX01FTQorCQkJaWYgKENSWVBUT19USFJFQURJRF9jbXAoJnJldC0+dGhyZWFkaWQsICZ0bXAudGhyZWFkaWQpKQorCQkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgInBvcF9pbmZvKCk6IGRlbGV0ZWQgaW5mbyBoYXMgb3RoZXIgdGhyZWFkIElEICglbHUpIHRoYW4gdGhlIGN1cnJlbnQgdGhyZWFkICglbHUpISEhIVxuIiwKKwkJCQkJQ1JZUFRPX1RIUkVBRElEX2hhc2goJnJldC0+dGhyZWFkaWQpLAorCQkJCQlDUllQVE9fVEhSRUFESURfaGFzaCgmdG1wLnRocmVhZGlkKSk7CisJCQkJYWJvcnQoKTsKKwkJCQl9CisjZW5kaWYKKwkJCWlmICgtLShyZXQtPnJlZmVyZW5jZXMpIDw9IDApCisJCQkJeworCQkJCXJldC0+bmV4dCA9IE5VTEw7CisJCQkJaWYgKG5leHQgIT0gTlVMTCkKKwkJCQkJbmV4dC0+cmVmZXJlbmNlcy0tOworCQkJCU9QRU5TU0xfZnJlZShyZXQpOworCQkJCX0KKwkJCX0KKwkJfQorCXJldHVybihyZXQpOworCX0KKworaW50IENSWVBUT19wdXNoX2luZm9fKGNvbnN0IGNoYXIgKmluZm8sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQorCXsKKwlBUFBfSU5GTyAqYW1pLCAqYW1pbTsKKwlpbnQgcmV0PTA7CisKKwlpZiAoaXNfTWVtQ2hlY2tfb24oKSkKKwkJeworCQlNZW1DaGVja19vZmYoKTsgLyogb2J0YWluIE1BTExPQzIgbG9jayAqLworCisJCWlmICgoYW1pID0gKEFQUF9JTkZPICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFQUF9JTkZPKSkpID09IE5VTEwpCisJCQl7CisJCQlyZXQ9MDsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoYW1paCA9PSBOVUxMKQorCQkJeworCQkJaWYgKChhbWloPWxoX0FQUF9JTkZPX25ldygpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlPUEVOU1NMX2ZyZWUoYW1pKTsKKwkJCQlyZXQ9MDsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisKKwkJQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoJmFtaS0+dGhyZWFkaWQpOworCQlhbWktPmZpbGU9ZmlsZTsKKwkJYW1pLT5saW5lPWxpbmU7CisJCWFtaS0+aW5mbz1pbmZvOworCQlhbWktPnJlZmVyZW5jZXM9MTsKKwkJYW1pLT5uZXh0PU5VTEw7CisKKwkJaWYgKChhbWltPWxoX0FQUF9JTkZPX2luc2VydChhbWloLGFtaSkpICE9IE5VTEwpCisJCQl7CisjaWZkZWYgTEVWSVRURV9ERUJVR19NRU0KKwkJCWlmIChDUllQVE9fVEhSRUFESURfY21wKCZhbWktPnRocmVhZGlkLCAmYW1pbS0+dGhyZWFkaWQpKQorCQkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkNSWVBUT19wdXNoX2luZm8oKTogcHJldmlvdXMgaW5mbyBoYXMgb3RoZXIgdGhyZWFkIElEICglbHUpIHRoYW4gdGhlIGN1cnJlbnQgdGhyZWFkICglbHUpISEhIVxuIiwKKwkJCQkJQ1JZUFRPX1RIUkVBRElEX2hhc2goJmFtaW0tPnRocmVhZGlkKSwKKwkJCQkJQ1JZUFRPX1RIUkVBRElEX2hhc2goJmFtaS0+dGhyZWFkaWQpKTsKKwkJCQlhYm9ydCgpOworCQkJCX0KKyNlbmRpZgorCQkJYW1pLT5uZXh0PWFtaW07CisJCQl9CisgZXJyOgorCQlNZW1DaGVja19vbigpOyAvKiByZWxlYXNlIE1BTExPQzIgbG9jayAqLworCQl9CisKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBDUllQVE9fcG9wX2luZm8odm9pZCkKKwl7CisJaW50IHJldD0wOworCisJaWYgKGlzX01lbUNoZWNrX29uKCkpIC8qIF9tdXN0XyBiZSB0cnVlLCBvciBzb21ldGhpbmcgd2VudCBzZXZlcmVseSB3cm9uZyAqLworCQl7CisJCU1lbUNoZWNrX29mZigpOyAvKiBvYnRhaW4gTUFMTE9DMiBsb2NrICovCisKKwkJcmV0PShwb3BfaW5mbygpICE9IE5VTEwpOworCisJCU1lbUNoZWNrX29uKCk7IC8qIHJlbGVhc2UgTUFMTE9DMiBsb2NrICovCisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBDUllQVE9fcmVtb3ZlX2FsbF9pbmZvKHZvaWQpCisJeworCWludCByZXQ9MDsKKworCWlmIChpc19NZW1DaGVja19vbigpKSAvKiBfbXVzdF8gYmUgdHJ1ZSAqLworCQl7CisJCU1lbUNoZWNrX29mZigpOyAvKiBvYnRhaW4gTUFMTE9DMiBsb2NrICovCisKKwkJd2hpbGUocG9wX2luZm8oKSAhPSBOVUxMKQorCQkJcmV0Kys7CisKKwkJTWVtQ2hlY2tfb24oKTsgLyogcmVsZWFzZSBNQUxMT0MyIGxvY2sgKi8KKwkJfQorCXJldHVybihyZXQpOworCX0KKworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBicmVha19vcmRlcl9udW09MDsKK3ZvaWQgQ1JZUFRPX2RiZ19tYWxsb2Modm9pZCAqYWRkciwgaW50IG51bSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsCisJaW50IGJlZm9yZV9wKQorCXsKKwlNRU0gKm0sKm1tOworCUFQUF9JTkZPIHRtcCwqYW1pbTsKKworCXN3aXRjaChiZWZvcmVfcCAmIDEyNykKKwkJeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAoYWRkciA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzX01lbUNoZWNrX29uKCkpCisJCQl7CisJCQlNZW1DaGVja19vZmYoKTsgLyogbWFrZSBzdXJlIHdlIGhvbGQgTUFMTE9DMiBsb2NrICovCisJCQlpZiAoKG09KE1FTSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihNRU0pKSkgPT0gTlVMTCkKKwkJCQl7CisJCQkJT1BFTlNTTF9mcmVlKGFkZHIpOworCQkJCU1lbUNoZWNrX29uKCk7IC8qIHJlbGVhc2UgTUFMTE9DMiBsb2NrCisJCQkJICAgICAgICAgICAgICAgICogaWYgbnVtX2Rpc2FibGVkIGRyb3BzIHRvIDAgKi8KKwkJCQlyZXR1cm47CisJCQkJfQorCQkJaWYgKG1oID09IE5VTEwpCisJCQkJeworCQkJCWlmICgobWg9bGhfTUVNX25ldygpKSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCU9QRU5TU0xfZnJlZShhZGRyKTsKKwkJCQkJT1BFTlNTTF9mcmVlKG0pOworCQkJCQlhZGRyPU5VTEw7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJfQorCisJCQltLT5hZGRyPWFkZHI7CisJCQltLT5maWxlPWZpbGU7CisJCQltLT5saW5lPWxpbmU7CisJCQltLT5udW09bnVtOworCQkJaWYgKG9wdGlvbnMgJiBWX0NSWVBUT19NREVCVUdfVEhSRUFEKQorCQkJCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZtLT50aHJlYWRpZCk7CisJCQllbHNlCisJCQkJbWVtc2V0KCZtLT50aHJlYWRpZCwgMCwgc2l6ZW9mKG0tPnRocmVhZGlkKSk7CisKKwkJCWlmIChvcmRlciA9PSBicmVha19vcmRlcl9udW0pCisJCQkJeworCQkJCS8qIEJSRUFLIEhFUkUgKi8KKwkJCQltLT5vcmRlcj1vcmRlcjsKKwkJCQl9CisJCQltLT5vcmRlcj1vcmRlcisrOworI2lmZGVmIExFVklUVEVfREVCVUdfTUVNCisJCQlmcHJpbnRmKHN0ZGVyciwgIkxFVklUVEVfREVCVUdfTUVNOiBbJTVsZF0gJWMgMHglcCAoJWQpXG4iLAorCQkJCW0tPm9yZGVyLAorCQkJCShiZWZvcmVfcCAmIDEyOCkgPyAnKicgOiAnKycsCisJCQkJbS0+YWRkciwgbS0+bnVtKTsKKyNlbmRpZgorCQkJaWYgKG9wdGlvbnMgJiBWX0NSWVBUT19NREVCVUdfVElNRSkKKwkJCQltLT50aW1lPXRpbWUoTlVMTCk7CisJCQllbHNlCisJCQkJbS0+dGltZT0wOworCisJCQlDUllQVE9fVEhSRUFESURfY3VycmVudCgmdG1wLnRocmVhZGlkKTsKKwkJCW0tPmFwcF9pbmZvPU5VTEw7CisJCQlpZiAoYW1paCAhPSBOVUxMCisJCQkgICAgJiYgKGFtaW09bGhfQVBQX0lORk9fcmV0cmlldmUoYW1paCwmdG1wKSkgIT0gTlVMTCkKKwkJCQl7CisJCQkJbS0+YXBwX2luZm8gPSBhbWltOworCQkJCWFtaW0tPnJlZmVyZW5jZXMrKzsKKwkJCQl9CisKKwkJCWlmICgobW09bGhfTUVNX2luc2VydChtaCwgbSkpICE9IE5VTEwpCisJCQkJeworCQkJCS8qIE5vdCBnb29kLCBidXQgZG9uJ3Qgc3dlYXQgaXQgKi8KKwkJCQlpZiAobW0tPmFwcF9pbmZvICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJbW0tPmFwcF9pbmZvLT5yZWZlcmVuY2VzLS07CisJCQkJCX0KKwkJCQlPUEVOU1NMX2ZyZWUobW0pOworCQkJCX0KKwkJZXJyOgorCQkJTWVtQ2hlY2tfb24oKTsgLyogcmVsZWFzZSBNQUxMT0MyIGxvY2sKKwkJCSAgICAgICAgICAgICAgICAqIGlmIG51bV9kaXNhYmxlZCBkcm9wcyB0byAwICovCisJCQl9CisJCWJyZWFrOworCQl9CisJcmV0dXJuOworCX0KKwordm9pZCBDUllQVE9fZGJnX2ZyZWUodm9pZCAqYWRkciwgaW50IGJlZm9yZV9wKQorCXsKKwlNRU0gbSwqbXA7CisKKwlzd2l0Y2goYmVmb3JlX3ApCisJCXsKKwljYXNlIDA6CisJCWlmIChhZGRyID09IE5VTEwpCisJCQlicmVhazsKKworCQlpZiAoaXNfTWVtQ2hlY2tfb24oKSAmJiAobWggIT0gTlVMTCkpCisJCQl7CisJCQlNZW1DaGVja19vZmYoKTsgLyogbWFrZSBzdXJlIHdlIGhvbGQgTUFMTE9DMiBsb2NrICovCisKKwkJCW0uYWRkcj1hZGRyOworCQkJbXA9bGhfTUVNX2RlbGV0ZShtaCwmbSk7CisJCQlpZiAobXAgIT0gTlVMTCkKKwkJCQl7CisjaWZkZWYgTEVWSVRURV9ERUJVR19NRU0KKwkJCWZwcmludGYoc3RkZXJyLCAiTEVWSVRURV9ERUJVR19NRU06IFslNWxkXSAtIDB4JXAgKCVkKVxuIiwKKwkJCQltcC0+b3JkZXIsIG1wLT5hZGRyLCBtcC0+bnVtKTsKKyNlbmRpZgorCQkJCWlmIChtcC0+YXBwX2luZm8gIT0gTlVMTCkKKwkJCQkJYXBwX2luZm9fZnJlZShtcC0+YXBwX2luZm8pOworCQkJCU9QRU5TU0xfZnJlZShtcCk7CisJCQkJfQorCisJCQlNZW1DaGVja19vbigpOyAvKiByZWxlYXNlIE1BTExPQzIgbG9jaworCQkJICAgICAgICAgICAgICAgICogaWYgbnVtX2Rpc2FibGVkIGRyb3BzIHRvIDAgKi8KKwkJCX0KKwkJYnJlYWs7CisJY2FzZSAxOgorCQlicmVhazsKKwkJfQorCX0KKwordm9pZCBDUllQVE9fZGJnX3JlYWxsb2Modm9pZCAqYWRkcjEsIHZvaWQgKmFkZHIyLCBpbnQgbnVtLAorCWNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgYmVmb3JlX3ApCisJeworCU1FTSBtLCptcDsKKworI2lmZGVmIExFVklUVEVfREVCVUdfTUVNCisJZnByaW50ZihzdGRlcnIsICJMRVZJVFRFX0RFQlVHX01FTTogLS0+IENSWVBUT19kYmdfbWFsbG9jKGFkZHIxID0gJXAsIGFkZHIyID0gJXAsIG51bSA9ICVkLCBmaWxlID0gXCIlc1wiLCBsaW5lID0gJWQsIGJlZm9yZV9wID0gJWQpXG4iLAorCQlhZGRyMSwgYWRkcjIsIG51bSwgZmlsZSwgbGluZSwgYmVmb3JlX3ApOworI2VuZGlmCisKKwlzd2l0Y2goYmVmb3JlX3ApCisJCXsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKGFkZHIyID09IE5VTEwpCisJCQlicmVhazsKKworCQlpZiAoYWRkcjEgPT0gTlVMTCkKKwkJCXsKKwkJCUNSWVBUT19kYmdfbWFsbG9jKGFkZHIyLCBudW0sIGZpbGUsIGxpbmUsIDEyOCB8IGJlZm9yZV9wKTsKKwkJCWJyZWFrOworCQkJfQorCisJCWlmIChpc19NZW1DaGVja19vbigpKQorCQkJeworCQkJTWVtQ2hlY2tfb2ZmKCk7IC8qIG1ha2Ugc3VyZSB3ZSBob2xkIE1BTExPQzIgbG9jayAqLworCisJCQltLmFkZHI9YWRkcjE7CisJCQltcD1saF9NRU1fZGVsZXRlKG1oLCZtKTsKKwkJCWlmIChtcCAhPSBOVUxMKQorCQkJCXsKKyNpZmRlZiBMRVZJVFRFX0RFQlVHX01FTQorCQkJCWZwcmludGYoc3RkZXJyLCAiTEVWSVRURV9ERUJVR19NRU06IFslNWxkXSAqIDB4JXAgKCVkKSAtPiAweCVwICglZClcbiIsCisJCQkJCW1wLT5vcmRlciwKKwkJCQkJbXAtPmFkZHIsIG1wLT5udW0sCisJCQkJCWFkZHIyLCBudW0pOworI2VuZGlmCisJCQkJbXAtPmFkZHI9YWRkcjI7CisJCQkJbXAtPm51bT1udW07CisJCQkJKHZvaWQpbGhfTUVNX2luc2VydChtaCxtcCk7CisJCQkJfQorCisJCQlNZW1DaGVja19vbigpOyAvKiByZWxlYXNlIE1BTExPQzIgbG9jaworCQkJICAgICAgICAgICAgICAgICogaWYgbnVtX2Rpc2FibGVkIGRyb3BzIHRvIDAgKi8KKwkJCX0KKwkJYnJlYWs7CisJCX0KKwlyZXR1cm47CisJfQorCisKK3R5cGVkZWYgc3RydWN0IG1lbV9sZWFrX3N0CisJeworCUJJTyAqYmlvOworCWludCBjaHVua3M7CisJbG9uZyBieXRlczsKKwl9IE1FTV9MRUFLOworCitzdGF0aWMgdm9pZCBwcmludF9sZWFrX2RvYWxsX2FyZyhjb25zdCBNRU0gKm0sIE1FTV9MRUFLICpsKQorCXsKKwljaGFyIGJ1ZlsxMDI0XTsKKwljaGFyICpidWZwID0gYnVmOworCUFQUF9JTkZPICphbWlwOworCWludCBhbWlfY250OworCXN0cnVjdCB0bSAqbGNsID0gTlVMTDsKKwlDUllQVE9fVEhSRUFESUQgdGk7CisKKyNkZWZpbmUgQlVGX1JFTUFJTiAoc2l6ZW9mIGJ1ZiAtIChzaXplX3QpKGJ1ZnAgLSBidWYpKQorCisJaWYobS0+YWRkciA9PSAoY2hhciAqKWwtPmJpbykKKwkgICAgcmV0dXJuOworCisJaWYgKG9wdGlvbnMgJiBWX0NSWVBUT19NREVCVUdfVElNRSkKKwkJeworCQlsY2wgPSBsb2NhbHRpbWUoJm0tPnRpbWUpOworCQorCQlCSU9fc25wcmludGYoYnVmcCwgQlVGX1JFTUFJTiwgIlslMDJkOiUwMmQ6JTAyZF0gIiwKKwkJCWxjbC0+dG1faG91cixsY2wtPnRtX21pbixsY2wtPnRtX3NlYyk7CisJCWJ1ZnAgKz0gc3RybGVuKGJ1ZnApOworCQl9CisKKwlCSU9fc25wcmludGYoYnVmcCwgQlVGX1JFTUFJTiwgIiU1bHUgZmlsZT0lcywgbGluZT0lZCwgIiwKKwkJbS0+b3JkZXIsbS0+ZmlsZSxtLT5saW5lKTsKKwlidWZwICs9IHN0cmxlbihidWZwKTsKKworCWlmIChvcHRpb25zICYgVl9DUllQVE9fTURFQlVHX1RIUkVBRCkKKwkJeworCQlCSU9fc25wcmludGYoYnVmcCwgQlVGX1JFTUFJTiwgInRocmVhZD0lbHUsICIsCisJCQlDUllQVE9fVEhSRUFESURfaGFzaCgmbS0+dGhyZWFkaWQpKTsKKwkJYnVmcCArPSBzdHJsZW4oYnVmcCk7CisJCX0KKworCUJJT19zbnByaW50ZihidWZwLCBCVUZfUkVNQUlOLCAibnVtYmVyPSVkLCBhZGRyZXNzPSUwOGxYXG4iLAorCQltLT5udW0sKHVuc2lnbmVkIGxvbmcpbS0+YWRkcik7CisJYnVmcCArPSBzdHJsZW4oYnVmcCk7CisKKwlCSU9fcHV0cyhsLT5iaW8sYnVmKTsKKwkKKwlsLT5jaHVua3MrKzsKKwlsLT5ieXRlcys9bS0+bnVtOworCisJYW1pcD1tLT5hcHBfaW5mbzsKKwlhbWlfY250PTA7CisJaWYgKCFhbWlwKQorCQlyZXR1cm47CisJQ1JZUFRPX1RIUkVBRElEX2NweSgmdGksICZhbWlwLT50aHJlYWRpZCk7CisKKwlkbworCQl7CisJCWludCBidWZfbGVuOworCQlpbnQgaW5mb19sZW47CisKKwkJYW1pX2NudCsrOworCQltZW1zZXQoYnVmLCc+JyxhbWlfY250KTsKKwkJQklPX3NucHJpbnRmKGJ1ZiArIGFtaV9jbnQsIHNpemVvZiBidWYgLSBhbWlfY250LAorCQkJIiB0aHJlYWQ9JWx1LCBmaWxlPSVzLCBsaW5lPSVkLCBpbmZvPVwiIiwKKwkJCUNSWVBUT19USFJFQURJRF9oYXNoKCZhbWlwLT50aHJlYWRpZCksIGFtaXAtPmZpbGUsCisJCQlhbWlwLT5saW5lKTsKKwkJYnVmX2xlbj1zdHJsZW4oYnVmKTsKKwkJaW5mb19sZW49c3RybGVuKGFtaXAtPmluZm8pOworCQlpZiAoMTI4IC0gYnVmX2xlbiAtIDMgPCBpbmZvX2xlbikKKwkJCXsKKwkJCW1lbWNweShidWYgKyBidWZfbGVuLCBhbWlwLT5pbmZvLCAxMjggLSBidWZfbGVuIC0gMyk7CisJCQlidWZfbGVuID0gMTI4IC0gMzsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQlVGX3N0cmxjcHkoYnVmICsgYnVmX2xlbiwgYW1pcC0+aW5mbywKKwkJCQkgICAgc2l6ZW9mIGJ1ZiAtIGJ1Zl9sZW4pOworCQkJYnVmX2xlbiA9IHN0cmxlbihidWYpOworCQkJfQorCQlCSU9fc25wcmludGYoYnVmICsgYnVmX2xlbiwgc2l6ZW9mIGJ1ZiAtIGJ1Zl9sZW4sICJcIlxuIik7CisJCQorCQlCSU9fcHV0cyhsLT5iaW8sYnVmKTsKKworCQlhbWlwID0gYW1pcC0+bmV4dDsKKwkJfQorCXdoaWxlKGFtaXAgJiYgIUNSWVBUT19USFJFQURJRF9jbXAoJmFtaXAtPnRocmVhZGlkLCAmdGkpKTsKKworI2lmZGVmIExFVklUVEVfREVCVUdfTUVNCisJaWYgKGFtaXApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsICJUaHJlYWQgc3dpdGNoIGRldGVjdGVkIGluIGJhY2t0cmFjZSEhISFcbiIpOworCQlhYm9ydCgpOworCQl9CisjZW5kaWYKKwl9CisKK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfRE9BTExfQVJHX0ZOKHByaW50X2xlYWssIGNvbnN0IE1FTSwgTUVNX0xFQUspCisKK3ZvaWQgQ1JZUFRPX21lbV9sZWFrcyhCSU8gKmIpCisJeworCU1FTV9MRUFLIG1sOworCisJaWYgKG1oID09IE5VTEwgJiYgYW1paCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlNZW1DaGVja19vZmYoKTsgLyogb2J0YWluIE1BTExPQzIgbG9jayAqLworCisJbWwuYmlvPWI7CisJbWwuYnl0ZXM9MDsKKwltbC5jaHVua3M9MDsKKwlpZiAobWggIT0gTlVMTCkKKwkJbGhfTUVNX2RvYWxsX2FyZyhtaCwgTEhBU0hfRE9BTExfQVJHX0ZOKHByaW50X2xlYWspLCBNRU1fTEVBSywKKwkJCQkgJm1sKTsKKwlpZiAobWwuY2h1bmtzICE9IDApCisJCXsKKwkJQklPX3ByaW50ZihiLCIlbGQgYnl0ZXMgbGVha2VkIGluICVkIGNodW5rc1xuIiwKKwkJCSAgIG1sLmJ5dGVzLG1sLmNodW5rcyk7CisjaWZkZWYgQ1JZUFRPX01ERUJVR19BQk9SVAorCQlhYm9ydCgpOworI2VuZGlmCisJCX0KKwllbHNlCisJCXsKKwkJLyogTWFrZSBzdXJlIHRoYXQsIGlmIHdlIGZvdW5kIG5vIGxlYWtzLCBtZW1vcnktbGVhayBkZWJ1Z2dpbmcgaXRzZWxmCisJCSAqIGRvZXMgbm90IGludHJvZHVjZSBtZW1vcnkgbGVha3MgKHdoaWNoIG1pZ2h0IGlycml0YXRlCisJCSAqIGV4dGVybmFsIGRlYnVnZ2luZyB0b29scykuCisJCSAqIChXaGVuIHNvbWVvbmUgZW5hYmxlcyBsZWFrIGNoZWNraW5nLCBidXQgZG9lcyBub3QgY2FsbAorCQkgKiB0aGlzIGZ1bmN0aW9uLCB3ZSBkZWNsYXJlIGl0IHRvIGJlIHRoZWlyIGZhdWx0LikKKwkJICoKKwkJICogWFhYICAgIFRoaXMgc2hvdWxkIGJlIGluIENSWVBUT19tZW1fbGVha3NfY2IsCisJCSAqIGFuZCBDUllQVE9fbWVtX2xlYWtzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieQorCQkgKiB1c2luZyBDUllQVE9fbWVtX2xlYWtzX2NiLgorCQkgKiAoQWxzbyB0aGVyZSBzaG91bGQgYmUgYSB2YXJpYW50IG9mIGxoX2RvYWxsX2FyZworCQkgKiB0aGF0IHRha2VzIGEgZnVuY3Rpb24gcG9pbnRlciBpbnN0ZWFkIG9mIGEgdm9pZCAqOworCQkgKiB0aGlzIHdvdWxkIG9idmlhdGUgdGhlIHVnbHkgYW5kIGlsbGVnYWwKKwkJICogdm9pZF9mbl90b19jaGFyIGtsdWRnZSBpbiBDUllQVE9fbWVtX2xlYWtzX2NiLgorCQkgKiBPdGhlcndpc2UgdGhlIGNvZGUgcG9saWNlIHdpbGwgY29tZSBhbmQgZ2V0IHVzLikKKwkJICovCisJCWludCBvbGRfbWhfbW9kZTsKKworCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX01BTExPQyk7CisKKwkJLyogYXZvaWQgZGVhZGxvY2sgd2hlbiBsaF9mcmVlKCkgdXNlcyBDUllQVE9fZGJnX2ZyZWUoKSwKKwkJICogd2hpY2ggdXNlcyBDUllQVE9faXNfbWVtX2NoZWNrX29uICovCisJCW9sZF9taF9tb2RlID0gbWhfbW9kZTsKKwkJbWhfbW9kZSA9IENSWVBUT19NRU1fQ0hFQ0tfT0ZGOworCisJCWlmIChtaCAhPSBOVUxMKQorCQkJeworCQkJbGhfTUVNX2ZyZWUobWgpOworCQkJbWggPSBOVUxMOworCQkJfQorCQlpZiAoYW1paCAhPSBOVUxMKQorCQkJeworCQkJaWYgKGxoX0FQUF9JTkZPX251bV9pdGVtcyhhbWloKSA9PSAwKSAKKwkJCQl7CisJCQkJbGhfQVBQX0lORk9fZnJlZShhbWloKTsKKwkJCQlhbWloID0gTlVMTDsKKwkJCQl9CisJCQl9CisKKwkJbWhfbW9kZSA9IG9sZF9taF9tb2RlOworCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfTUFMTE9DKTsKKwkJfQorCU1lbUNoZWNrX29uKCk7IC8qIHJlbGVhc2UgTUFMTE9DMiBsb2NrICovCisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCit2b2lkIENSWVBUT19tZW1fbGVha3NfZnAoRklMRSAqZnApCisJeworCUJJTyAqYjsKKworCWlmIChtaCA9PSBOVUxMKSByZXR1cm47CisJLyogTmVlZCB0byB0dXJuIG9mZiBtZW1vcnkgY2hlY2tpbmcgd2hlbiBhbGxvY2F0ZWQgQklPcyAuLi4gZXNwZWNpYWxseQorCSAqIGFzIHdlJ3JlIGNyZWF0aW5nIHRoZW0gYXQgYSB0aW1lIHdoZW4gd2UncmUgdHJ5aW5nIHRvIGNoZWNrIHdlJ3ZlIG5vdAorCSAqIGxlZnQgYW55dGhpbmcgdW4tZnJlZSgpJ2QhISAqLworCU1lbUNoZWNrX29mZigpOworCWIgPSBCSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJTWVtQ2hlY2tfb24oKTsKKwlpZighYikgcmV0dXJuOworCUJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisJQ1JZUFRPX21lbV9sZWFrcyhiKTsKKwlCSU9fZnJlZShiKTsKKwl9CisjZW5kaWYKKworCisKKy8qIEZJWE1FOiBXZSByZWFsbHkgZG9uJ3QgYWxsb3cgbXVjaCB0byB0aGUgY2FsbGJhY2suICBGb3IgZXhhbXBsZSwgaXQgaGFzCisgICBubyBjaGFuY2Ugb2YgcmVhY2hpbmcgdGhlIGluZm8gc3RhY2sgZm9yIHRoZSBpdGVtIGl0IHByb2Nlc3Nlcy4gIFNob3VsZAorICAgaXQgcmVhbGx5IGJlIHRoaXMgd2F5PyAgLS0gUmljaGFyZCBMZXZpdHRlICovCisvKiBOQjogVGhlIHByb3RvdHlwZXMgaGF2ZSBiZWVuIHR5cGVkZWYnZCB0byBDUllQVE9fTUVNX0xFQUtfQ0IgaW5zaWRlIGNyeXB0by5oCisgKiBJZiB0aGlzIGNvZGUgaXMgcmVzdHJ1Y3R1cmVkLCByZW1vdmUgdGhlIGNhbGxiYWNrIHR5cGUgaWYgaXQgaXMgbm8gbG9uZ2VyCisgKiBuZWVkZWQuIC0tIEdlb2ZmIFRob3JwZSAqLworCisvKiBDYW4ndCBwYXNzIENSWVBUT19NRU1fTEVBS19DQiBkaXJlY3RseSB0byBsaF9NRU1fZG9hbGxfYXJnIGJlY2F1c2UgaXQKKyAqIGlzIGEgZnVuY3Rpb24gcG9pbnRlciBhbmQgY29udmVyc2lvbiB0byB2b2lkICogaXMgcHJvaGliaXRlZC4gSW5zdGVhZAorICogcGFzcyBpdHMgYWRkcmVzcworICovCisKK3R5cGVkZWYgQ1JZUFRPX01FTV9MRUFLX0NCICpQQ1JZUFRPX01FTV9MRUFLX0NCOworCitzdGF0aWMgdm9pZCBjYl9sZWFrX2RvYWxsX2FyZyhjb25zdCBNRU0gKm0sIFBDUllQVE9fTUVNX0xFQUtfQ0IgKmNiKQorCXsKKwkoKmNiKShtLT5vcmRlcixtLT5maWxlLG0tPmxpbmUsbS0+bnVtLG0tPmFkZHIpOworCX0KKworc3RhdGljIElNUExFTUVOVF9MSEFTSF9ET0FMTF9BUkdfRk4oY2JfbGVhaywgY29uc3QgTUVNLCBQQ1JZUFRPX01FTV9MRUFLX0NCKQorCit2b2lkIENSWVBUT19tZW1fbGVha3NfY2IoQ1JZUFRPX01FTV9MRUFLX0NCICpjYikKKwl7CisJaWYgKG1oID09IE5VTEwpIHJldHVybjsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX01BTExPQzIpOworCWxoX01FTV9kb2FsbF9hcmcobWgsIExIQVNIX0RPQUxMX0FSR19GTihjYl9sZWFrKSwgUENSWVBUT19NRU1fTEVBS19DQiwKKwkJCSAmY2IpOworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19NQUxMT0MyKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbW9kZXMvY2JjMTI4LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbW9kZXMvY2JjMTI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4YmQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tb2Rlcy9jYmMxMjguYwpAQCAtMCwwICsxLDIwNiBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2luY2x1ZGUgIm1vZGVzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZm5kZWYgTU9ERVNfREVCVUcKKyMgaWZuZGVmIE5ERUJVRworIyAgZGVmaW5lIE5ERUJVRworIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNkZWZpbmUgU1RSSUNUX0FMSUdOTUVOVCAxCisjaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IFwKKyAgICBkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IFwKKyAgICBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQoX01fWDY0KSB8fCBcCisgICAgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX3MzOTB4X18pCisjICB1bmRlZiBTVFJJQ1RfQUxJR05NRU5UCisjICBkZWZpbmUgU1RSSUNUX0FMSUdOTUVOVCAwCisjZW5kaWYKKwordm9pZCBDUllQVE9fY2JjMTI4X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGJsb2NrMTI4X2YgYmxvY2spCit7CisJc2l6ZV90IG47CisJY29uc3QgdW5zaWduZWQgY2hhciAqaXYgPSBpdmVjOworCisJYXNzZXJ0KGluICYmIG91dCAmJiBrZXkgJiYgaXZlYyk7CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVCkKKwlpZiAoU1RSSUNUX0FMSUdOTUVOVCAmJgorCSAgICAoKHNpemVfdClpbnwoc2l6ZV90KW91dHwoc2l6ZV90KWl2ZWMpJXNpemVvZihzaXplX3QpICE9IDApIHsKKwkJd2hpbGUgKGxlbj49MTYpIHsKKwkJCWZvcihuPTA7IG48MTY7ICsrbikKKwkJCQlvdXRbbl0gPSBpbltuXSBeIGl2W25dOworCQkJKCpibG9jaykob3V0LCBvdXQsIGtleSk7CisJCQlpdiA9IG91dDsKKwkJCWxlbiAtPSAxNjsKKwkJCWluICArPSAxNjsKKwkJCW91dCArPSAxNjsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlIChsZW4+PTE2KSB7CisJCQlmb3Iobj0wOyBuPDE2OyBuKz1zaXplb2Yoc2l6ZV90KSkKKwkJCQkqKHNpemVfdCopKG91dCtuKSA9CisJCQkJKihzaXplX3QqKShpbituKSBeICooc2l6ZV90KikoaXYrbik7CisJCQkoKmJsb2NrKShvdXQsIG91dCwga2V5KTsKKwkJCWl2ID0gb3V0OworCQkJbGVuIC09IDE2OworCQkJaW4gICs9IDE2OworCQkJb3V0ICs9IDE2OworCQl9CisJfQorI2VuZGlmCisJd2hpbGUgKGxlbikgeworCQlmb3Iobj0wOyBuPDE2ICYmIG48bGVuOyArK24pCisJCQlvdXRbbl0gPSBpbltuXSBeIGl2W25dOworCQlmb3IoOyBuPDE2OyArK24pCisJCQlvdXRbbl0gPSBpdltuXTsKKwkJKCpibG9jaykob3V0LCBvdXQsIGtleSk7CisJCWl2ID0gb3V0OworCQlpZiAobGVuPD0xNikgYnJlYWs7CisJCWxlbiAtPSAxNjsKKwkJaW4gICs9IDE2OworCQlvdXQgKz0gMTY7CisJfQorCW1lbWNweShpdmVjLGl2LDE2KTsKK30KKwordm9pZCBDUllQVE9fY2JjMTI4X2RlY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGJsb2NrMTI4X2YgYmxvY2spCit7CisJc2l6ZV90IG47CisJdW5pb24geyBzaXplX3QgYWxpZ247IHVuc2lnbmVkIGNoYXIgY1sxNl07IH0gdG1wOworCisJYXNzZXJ0KGluICYmIG91dCAmJiBrZXkgJiYgaXZlYyk7CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVCkKKwlpZiAoaW4gIT0gb3V0KSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKml2ID0gaXZlYzsKKworCQlpZiAoU1RSSUNUX0FMSUdOTUVOVCAmJgorCQkgICAgKChzaXplX3QpaW58KHNpemVfdClvdXR8KHNpemVfdClpdmVjKSVzaXplb2Yoc2l6ZV90KSAhPSAwKSB7CisJCQl3aGlsZSAobGVuPj0xNikgeworCQkJCSgqYmxvY2spKGluLCBvdXQsIGtleSk7CisJCQkJZm9yKG49MDsgbjwxNjsgKytuKQorCQkJCQlvdXRbbl0gXj0gaXZbbl07CisJCQkJaXYgPSBpbjsKKwkJCQlsZW4gLT0gMTY7CisJCQkJaW4gICs9IDE2OworCQkJCW91dCArPSAxNjsKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXdoaWxlIChsZW4+PTE2KSB7CisJCQkJKCpibG9jaykoaW4sIG91dCwga2V5KTsKKwkJCQlmb3Iobj0wOyBuPDE2OyBuKz1zaXplb2Yoc2l6ZV90KSkKKwkJCQkJKihzaXplX3QgKikob3V0K24pIF49ICooc2l6ZV90ICopKGl2K24pOworCQkJCWl2ID0gaW47CisJCQkJbGVuIC09IDE2OworCQkJCWluICArPSAxNjsKKwkJCQlvdXQgKz0gMTY7CisJCQl9CisJCX0KKwkJbWVtY3B5KGl2ZWMsaXYsMTYpOworCX0gZWxzZSB7CisJCWlmIChTVFJJQ1RfQUxJR05NRU5UICYmCisJCSAgICAoKHNpemVfdClpbnwoc2l6ZV90KW91dHwoc2l6ZV90KWl2ZWMpJXNpemVvZihzaXplX3QpICE9IDApIHsKKwkJCXVuc2lnbmVkIGNoYXIgYzsKKwkJCXdoaWxlIChsZW4+PTE2KSB7CisJCQkJKCpibG9jaykoaW4sIHRtcC5jLCBrZXkpOworCQkJCWZvcihuPTA7IG48MTY7ICsrbikgeworCQkJCQljID0gaW5bbl07CisJCQkJCW91dFtuXSA9IHRtcC5jW25dIF4gaXZlY1tuXTsKKwkJCQkJaXZlY1tuXSA9IGM7CisJCQkJfQorCQkJCWxlbiAtPSAxNjsKKwkJCQlpbiAgKz0gMTY7CisJCQkJb3V0ICs9IDE2OworCQkJfQorCQl9CisJCWVsc2UgeworCQkJc2l6ZV90IGM7CisJCQl3aGlsZSAobGVuPj0xNikgeworCQkJCSgqYmxvY2spKGluLCB0bXAuYywga2V5KTsKKwkJCQlmb3Iobj0wOyBuPDE2OyBuKz1zaXplb2Yoc2l6ZV90KSkgeworCQkJCQljID0gKihzaXplX3QgKikoaW4rbik7CisJCQkJCSooc2l6ZV90ICopKG91dCtuKSA9CisJCQkJCSooc2l6ZV90ICopKHRtcC5jK24pIF4gKihzaXplX3QgKikoaXZlYytuKTsKKwkJCQkJKihzaXplX3QgKikoaXZlYytuKSA9IGM7CisJCQkJfQorCQkJCWxlbiAtPSAxNjsKKwkJCQlpbiAgKz0gMTY7CisJCQkJb3V0ICs9IDE2OworCQkJfQorCQl9CisJfQorI2VuZGlmCisJd2hpbGUgKGxlbikgeworCQl1bnNpZ25lZCBjaGFyIGM7CisJCSgqYmxvY2spKGluLCB0bXAuYywga2V5KTsKKwkJZm9yKG49MDsgbjwxNiAmJiBuPGxlbjsgKytuKSB7CisJCQljID0gaW5bbl07CisJCQlvdXRbbl0gPSB0bXAuY1tuXSBeIGl2ZWNbbl07CisJCQlpdmVjW25dID0gYzsKKwkJfQorCQlpZiAobGVuPD0xNikgeworCQkJZm9yICg7IG48MTY7ICsrbikKKwkJCQlpdmVjW25dID0gaW5bbl07CisJCQlicmVhazsKKwkJfQorCQlsZW4gLT0gMTY7CisJCWluICArPSAxNjsKKwkJb3V0ICs9IDE2OworCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9tb2Rlcy9jZmIxMjguYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tb2Rlcy9jZmIxMjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTkzOGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL21vZGVzL2NmYjEyOC5jCkBAIC0wLDAgKzEsMjQ5IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqLworCisjaW5jbHVkZSAibW9kZXMuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmbmRlZiBNT0RFU19ERUJVRworIyBpZm5kZWYgTkRFQlVHCisjICBkZWZpbmUgTkRFQlVHCisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBTVFJJQ1RfQUxJR05NRU5UCisjaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IFwKKyAgICBkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IFwKKyAgICBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX01fQU1ENjQpIHx8IGRlZmluZWQoX01fWDY0KSB8fCBcCisgICAgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX3MzOTB4X18pCisjICB1bmRlZiBTVFJJQ1RfQUxJR05NRU5UCisjZW5kaWYKKworLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgZW5jcnlwdGVkIGFzIHRob3VnaCAxMjhiaXQgY2ZiIG1vZGUgaXMgYmVpbmcKKyAqIHVzZWQuICBUaGUgZXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gdG8gcmVjb3JkIGhvdyBtdWNoIG9mIHRoZQorICogMTI4Yml0IGJsb2NrIHdlIGhhdmUgdXNlZCBpcyBjb250YWluZWQgaW4gKm51bTsKKyAqLwordm9pZCBDUllQVE9fY2ZiMTI4X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGludCAqbnVtLAorCQkJaW50IGVuYywgYmxvY2sxMjhfZiBibG9jaykKK3sKKyAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICBzaXplX3QgbCA9IDA7CisKKyAgICBhc3NlcnQoaW4gJiYgb3V0ICYmIGtleSAmJiBpdmVjICYmIG51bSk7CisKKyAgICBuID0gKm51bTsKKworICAgIGlmIChlbmMpIHsKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVCkKKwlpZiAoMTYlc2l6ZW9mKHNpemVfdCkgPT0gMCkgZG8gewkvKiBhbHdheXMgdHJ1ZSBhY3R1YWxseSAqLworCQl3aGlsZSAobiAmJiBsZW4pIHsKKwkJCSoob3V0KyspID0gaXZlY1tuXSBePSAqKGluKyspOworCQkJLS1sZW47CisJCQluID0gKG4rMSkgJSAxNjsKKwkJfQorI2lmIGRlZmluZWQoU1RSSUNUX0FMSUdOTUVOVCkKKwkJaWYgKCgoc2l6ZV90KWlufChzaXplX3Qpb3V0fChzaXplX3QpaXZlYyklc2l6ZW9mKHNpemVfdCkgIT0gMCkKKwkJCWJyZWFrOworI2VuZGlmCisJCXdoaWxlIChsZW4+PTE2KSB7CisJCQkoKmJsb2NrKShpdmVjLCBpdmVjLCBrZXkpOworCQkJZm9yICg7IG48MTY7IG4rPXNpemVvZihzaXplX3QpKSB7CisJCQkJKihzaXplX3QqKShvdXQrbikgPQorCQkJCSooc2l6ZV90KikoaXZlYytuKSBePSAqKHNpemVfdCopKGluK24pOworCQkJfQorCQkJbGVuIC09IDE2OworCQkJb3V0ICs9IDE2OworCQkJaW4gICs9IDE2OworCQkJbiA9IDA7CisJCX0KKwkJaWYgKGxlbikgeworCQkJKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKwkJCXdoaWxlIChsZW4tLSkgeworCQkJCW91dFtuXSA9IGl2ZWNbbl0gXj0gaW5bbl07CisJCQkJKytuOworCQkJfQorCQl9CisJCSpudW0gPSBuOworCQlyZXR1cm47CisJfSB3aGlsZSAoMCk7CisJLyogdGhlIHJlc3Qgd291bGQgYmUgY29tbW9ubHkgZWxpbWluYXRlZCBieSB4ODYqIGNvbXBpbGVyICovCisjZW5kaWYKKwl3aGlsZSAobDxsZW4pIHsKKwkJaWYgKG4gPT0gMCkgeworCQkJKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKwkJfQorCQlvdXRbbF0gPSBpdmVjW25dIF49IGluW2xdOworCQkrK2w7CisJCW4gPSAobisxKSAlIDE2OworCX0KKwkqbnVtID0gbjsKKyAgICB9IGVsc2UgeworI2lmICFkZWZpbmVkKE9QRU5TU0xfU01BTExfRk9PVFBSSU5UKQorCWlmICgxNiVzaXplb2Yoc2l6ZV90KSA9PSAwKSBkbyB7CS8qIGFsd2F5cyB0cnVlIGFjdHVhbGx5ICovCisJCXdoaWxlIChuICYmIGxlbikgeworCQkJdW5zaWduZWQgY2hhciBjOworCQkJKihvdXQrKykgPSBpdmVjW25dIF4gKGMgPSAqKGluKyspKTsgaXZlY1tuXSA9IGM7CisJCQktLWxlbjsKKwkJCW4gPSAobisxKSAlIDE2OworIAkJfQorI2lmIGRlZmluZWQoU1RSSUNUX0FMSUdOTUVOVCkKKwkJaWYgKCgoc2l6ZV90KWlufChzaXplX3Qpb3V0fChzaXplX3QpaXZlYyklc2l6ZW9mKHNpemVfdCkgIT0gMCkKKwkJCWJyZWFrOworI2VuZGlmCisJCXdoaWxlIChsZW4+PTE2KSB7CisJCQkoKmJsb2NrKShpdmVjLCBpdmVjLCBrZXkpOworCQkJZm9yICg7IG48MTY7IG4rPXNpemVvZihzaXplX3QpKSB7CisJCQkJc2l6ZV90IHQgPSAqKHNpemVfdCopKGluK24pOworCQkJCSooc2l6ZV90Kikob3V0K24pID0gKihzaXplX3QqKShpdmVjK24pIF4gdDsKKwkJCQkqKHNpemVfdCopKGl2ZWMrbikgPSB0OworCQkJfQorCQkJbGVuIC09IDE2OworCQkJb3V0ICs9IDE2OworCQkJaW4gICs9IDE2OworCQkJbiA9IDA7CisJCX0KKwkJaWYgKGxlbikgeworCQkJKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKwkJCXdoaWxlIChsZW4tLSkgeworCQkJCXVuc2lnbmVkIGNoYXIgYzsKKwkJCQlvdXRbbl0gPSBpdmVjW25dIF4gKGMgPSBpbltuXSk7IGl2ZWNbbl0gPSBjOworCQkJCSsrbjsKKwkJCX0KKyAJCX0KKwkJKm51bSA9IG47CisJCXJldHVybjsKKwl9IHdoaWxlICgwKTsKKwkvKiB0aGUgcmVzdCB3b3VsZCBiZSBjb21tb25seSBlbGltaW5hdGVkIGJ5IHg4NiogY29tcGlsZXIgKi8KKyNlbmRpZgorCXdoaWxlIChsPGxlbikgeworCQl1bnNpZ25lZCBjaGFyIGM7CisJCWlmIChuID09IDApIHsKKwkJCSgqYmxvY2spKGl2ZWMsIGl2ZWMsIGtleSk7CisJCX0KKwkJb3V0W2xdID0gaXZlY1tuXSBeIChjID0gaW5bbF0pOyBpdmVjW25dID0gYzsKKwkJKytsOworCQluID0gKG4rMSkgJSAxNjsKKwl9CisJKm51bT1uOworICAgIH0KK30KKworLyogVGhpcyBleHBlY3RzIGEgc2luZ2xlIGJsb2NrIG9mIHNpemUgbmJpdHMgZm9yIGJvdGggaW4gYW5kIG91dC4gTm90ZSB0aGF0CisgICBpdCBjb3JydXB0cyBhbnkgZXh0cmEgYml0cyBpbiB0aGUgbGFzdCBieXRlIG9mIG91dCAqLworc3RhdGljIHZvaWQgY2Zicl9lbmNyeXB0X2Jsb2NrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCSAgICBpbnQgbmJpdHMsY29uc3Qgdm9pZCAqa2V5LAorCQkJICAgIHVuc2lnbmVkIGNoYXIgaXZlY1sxNl0saW50IGVuYywKKwkJCSAgICBibG9jazEyOF9mIGJsb2NrKQoreworICAgIGludCBuLHJlbSxudW07CisgICAgdW5zaWduZWQgY2hhciBvdmVjWzE2KjIgKyAxXTsgIC8qICsxIGJlY2F1c2Ugd2UgZGVyZXJlZmVuY2UgKGJ1dCBkb24ndCB1c2UpIG9uZSBieXRlIG9mZiB0aGUgZW5kICovCisKKyAgICBpZiAobmJpdHM8PTAgfHwgbmJpdHM+MTI4KSByZXR1cm47CisKKwkvKiBmaWxsIGluIHRoZSBmaXJzdCBoYWxmIG9mIHRoZSBuZXcgSVYgd2l0aCB0aGUgY3VycmVudCBJViAqLworCW1lbWNweShvdmVjLGl2ZWMsMTYpOworCS8qIGNvbnN0cnVjdCB0aGUgbmV3IElWICovCisJKCpibG9jaykoaXZlYyxpdmVjLGtleSk7CisJbnVtID0gKG5iaXRzKzcpLzg7CisJaWYgKGVuYykJLyogZW5jcnlwdCB0aGUgaW5wdXQgKi8KKwkgICAgZm9yKG49MCA7IG4gPCBudW0gOyArK24pCisJCW91dFtuXSA9IChvdmVjWzE2K25dID0gaW5bbl0gXiBpdmVjW25dKTsKKwllbHNlCQkvKiBkZWNyeXB0IHRoZSBpbnB1dCAqLworCSAgICBmb3Iobj0wIDsgbiA8IG51bSA7ICsrbikKKwkJb3V0W25dID0gKG92ZWNbMTYrbl0gPSBpbltuXSkgXiBpdmVjW25dOworCS8qIHNoaWZ0IG92ZWMgbGVmdC4uLiAqLworCXJlbSA9IG5iaXRzJTg7CisJbnVtID0gbmJpdHMvODsKKwlpZihyZW09PTApCisJICAgIG1lbWNweShpdmVjLG92ZWMrbnVtLDE2KTsKKwllbHNlCisJICAgIGZvcihuPTAgOyBuIDwgMTYgOyArK24pCisJCWl2ZWNbbl0gPSBvdmVjW24rbnVtXTw8cmVtIHwgb3ZlY1tuK251bSsxXT4+KDgtcmVtKTsKKworICAgIC8qIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2xlYW5zZSBvdmVjLCBzaW5jZSB0aGUgSVYgaXMgbm90IHNlY3JldCAqLworfQorCisvKiBOLkIuIFRoaXMgZXhwZWN0cyB0aGUgaW5wdXQgdG8gYmUgcGFja2VkLCBNUyBiaXQgZmlyc3QgKi8KK3ZvaWQgQ1JZUFRPX2NmYjEyOF8xX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJIAlzaXplX3QgYml0cywgY29uc3Qgdm9pZCAqa2V5LAorCQkJdW5zaWduZWQgY2hhciBpdmVjWzE2XSwgaW50ICpudW0sCisJCQlpbnQgZW5jLCBibG9jazEyOF9mIGJsb2NrKQoreworICAgIHNpemVfdCBuOworICAgIHVuc2lnbmVkIGNoYXIgY1sxXSxkWzFdOworCisgICAgYXNzZXJ0KGluICYmIG91dCAmJiBrZXkgJiYgaXZlYyAmJiBudW0pOworICAgIGFzc2VydCgqbnVtID09IDApOworCisgICAgZm9yKG49MCA7IG48Yml0cyA7ICsrbikKKwl7CisJY1swXT0oaW5bbi84XSYoMSA8PCAoNy1uJTgpKSkgPyAweDgwIDogMDsKKwljZmJyX2VuY3J5cHRfYmxvY2soYyxkLDEsa2V5LGl2ZWMsZW5jLGJsb2NrKTsKKwlvdXRbbi84XT0ob3V0W24vOF0mfigxIDw8ICh1bnNpZ25lZCBpbnQpKDctbiU4KSkpIHwKKwkJICgoZFswXSYweDgwKSA+PiAodW5zaWduZWQgaW50KShuJTgpKTsKKwl9Cit9CisKK3ZvaWQgQ1JZUFRPX2NmYjEyOF84X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW5ndGgsIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGludCAqbnVtLAorCQkJaW50IGVuYywgYmxvY2sxMjhfZiBibG9jaykKK3sKKyAgICBzaXplX3QgbjsKKworICAgIGFzc2VydChpbiAmJiBvdXQgJiYga2V5ICYmIGl2ZWMgJiYgbnVtKTsKKyAgICBhc3NlcnQoKm51bSA9PSAwKTsKKworICAgIGZvcihuPTAgOyBuPGxlbmd0aCA7ICsrbikKKwljZmJyX2VuY3J5cHRfYmxvY2soJmluW25dLCZvdXRbbl0sOCxrZXksaXZlYyxlbmMsYmxvY2spOworfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vbW9kZXMvY3RyMTI4LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vbW9kZXMvY3RyMTI4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyMDM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9tb2Rlcy9jdHIxMjguYwpAQCAtMCwwICsxLDE4NCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKi8KKworI2luY2x1ZGUgIm1vZGVzLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZm5kZWYgTU9ERVNfREVCVUcKKyMgaWZuZGVmIE5ERUJVRworIyAgZGVmaW5lIE5ERUJVRworIyBlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHUzMjsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1ODsKKworI2RlZmluZSBTVFJJQ1RfQUxJR05NRU5UCisjaWYgZGVmaW5lZChfX2kzODYpCXx8IGRlZmluZWQoX19pMzg2X18pCXx8IFwKKyAgICBkZWZpbmVkKF9feDg2XzY0KQl8fCBkZWZpbmVkKF9feDg2XzY0X18pCXx8IFwKKyAgICBkZWZpbmVkKF9NX0lYODYpCXx8IGRlZmluZWQoX01fQU1ENjQpCXx8IGRlZmluZWQoX01fWDY0KSB8fCBcCisgICAgZGVmaW5lZChfX3MzOTBfXykJfHwgZGVmaW5lZChfX3MzOTB4X18pCisjICB1bmRlZiBTVFJJQ1RfQUxJR05NRU5UCisjZW5kaWYKKworLyogTk9URTogdGhlIElWL2NvdW50ZXIgQ1RSIG1vZGUgaXMgYmlnLWVuZGlhbi4gIFRoZSBjb2RlIGl0c2VsZgorICogaXMgZW5kaWFuLW5ldXRyYWwuICovCisKKy8qIGluY3JlbWVudCBjb3VudGVyICgxMjgtYml0IGludCkgYnkgMSAqLworc3RhdGljIHZvaWQgY3RyMTI4X2luYyh1bnNpZ25lZCBjaGFyICpjb3VudGVyKSB7CisJdTMyIG49MTY7CisJdTggIGM7CisKKwlkbyB7CisJCS0tbjsKKwkJYyA9IGNvdW50ZXJbbl07CisJCSsrYzsKKwkJY291bnRlcltuXSA9IGM7CisJCWlmIChjKSByZXR1cm47CisJfSB3aGlsZSAobik7Cit9CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVCkKK3N0YXRpYyB2b2lkIGN0cjEyOF9pbmNfYWxpZ25lZCh1bnNpZ25lZCBjaGFyICpjb3VudGVyKSB7CisJc2l6ZV90ICpkYXRhLGMsbjsKKwljb25zdCB1bmlvbiB7IGxvbmcgb25lOyBjaGFyIGxpdHRsZTsgfSBpc19lbmRpYW4gPSB7MX07CisKKwlpZiAoaXNfZW5kaWFuLmxpdHRsZSkgeworCQljdHIxMjhfaW5jKGNvdW50ZXIpOworCQlyZXR1cm47CisJfQorCisJZGF0YSA9IChzaXplX3QgKiljb3VudGVyOworCW4gPSAxNi9zaXplb2Yoc2l6ZV90KTsKKwlkbyB7CisJCS0tbjsKKwkJYyA9IGRhdGFbbl07CisJCSsrYzsKKwkJZGF0YVtuXSA9IGM7CisJCWlmIChjKSByZXR1cm47CisJfSB3aGlsZSAobik7Cit9CisjZW5kaWYKKworLyogVGhlIGlucHV0IGVuY3J5cHRlZCBhcyB0aG91Z2ggMTI4Yml0IGNvdW50ZXIgbW9kZSBpcyBiZWluZworICogdXNlZC4gIFRoZSBleHRyYSBzdGF0ZSBpbmZvcm1hdGlvbiB0byByZWNvcmQgaG93IG11Y2ggb2YgdGhlCisgKiAxMjhiaXQgYmxvY2sgd2UgaGF2ZSB1c2VkIGlzIGNvbnRhaW5lZCBpbiAqbnVtLCBhbmQgdGhlCisgKiBlbmNyeXB0ZWQgY291bnRlciBpcyBrZXB0IGluIGVjb3VudF9idWYuICBCb3RoICpudW0gYW5kCisgKiBlY291bnRfYnVmIG11c3QgYmUgaW5pdGlhbGlzZWQgd2l0aCB6ZXJvcyBiZWZvcmUgdGhlIGZpcnN0CisgKiBjYWxsIHRvIENSWVBUT19jdHIxMjhfZW5jcnlwdCgpLgorICoKKyAqIFRoaXMgYWxnb3JpdGhtIGFzc3VtZXMgdGhhdCB0aGUgY291bnRlciBpcyBpbiB0aGUgeCBsb3dlciBiaXRzCisgKiBvZiB0aGUgSVYgKGl2ZWMpLCBhbmQgdGhhdCB0aGUgYXBwbGljYXRpb24gaGFzIGZ1bGwgY29udHJvbCBvdmVyCisgKiBvdmVyZmxvdyBhbmQgdGhlIHJlc3Qgb2YgdGhlIElWLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB0YWtlcyBOTworICogcmVzcG9uc2FiaWxpdHkgZm9yIGNoZWNraW5nIHRoYXQgdGhlIGNvdW50ZXIgZG9lc24ndCBvdmVyZmxvdworICogaW50byB0aGUgcmVzdCBvZiB0aGUgSVYgd2hlbiBpbmNyZW1lbnRlZC4KKyAqLwordm9pZCBDUllQVE9fY3RyMTI4X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIHVuc2lnbmVkIGNoYXIgZWNvdW50X2J1ZlsxNl0sCisJCQl1bnNpZ25lZCBpbnQgKm51bSwgYmxvY2sxMjhfZiBibG9jaykKK3sKKwl1bnNpZ25lZCBpbnQgbjsKKwlzaXplX3QgbD0wOworCisJYXNzZXJ0KGluICYmIG91dCAmJiBrZXkgJiYgZWNvdW50X2J1ZiAmJiBudW0pOworCWFzc2VydCgqbnVtIDwgMTYpOworCisJbiA9ICpudW07CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVCkKKwlpZiAoMTYlc2l6ZW9mKHNpemVfdCkgPT0gMCkgZG8geyAvKiBhbHdheXMgdHJ1ZSBhY3R1YWxseSAqLworCQl3aGlsZSAobiAmJiBsZW4pIHsKKwkJCSoob3V0KyspID0gKihpbisrKSBeIGVjb3VudF9idWZbbl07CisJCQktLWxlbjsKKwkJCW4gPSAobisxKSAlIDE2OworCQl9CisKKyNpZiBkZWZpbmVkKFNUUklDVF9BTElHTk1FTlQpCisJCWlmICgoKHNpemVfdClpbnwoc2l6ZV90KW91dHwoc2l6ZV90KWl2ZWMpJXNpemVvZihzaXplX3QpICE9IDApCisJCQlicmVhazsKKyNlbmRpZgorCQl3aGlsZSAobGVuPj0xNikgeworCQkJKCpibG9jaykoaXZlYywgZWNvdW50X2J1Ziwga2V5KTsKKwkJCWN0cjEyOF9pbmNfYWxpZ25lZChpdmVjKTsKKwkJCWZvciAoOyBuPDE2OyBuKz1zaXplb2Yoc2l6ZV90KSkKKwkJCQkqKHNpemVfdCAqKShvdXQrbikgPQorCQkJCSooc2l6ZV90ICopKGluK24pIF4gKihzaXplX3QgKikoZWNvdW50X2J1ZituKTsKKwkJCWxlbiAtPSAxNjsKKwkJCW91dCArPSAxNjsKKwkJCWluICArPSAxNjsKKwkJCW4gPSAwOworCQl9CisJCWlmIChsZW4pIHsKKwkJCSgqYmxvY2spKGl2ZWMsIGVjb3VudF9idWYsIGtleSk7CisgCQkJY3RyMTI4X2luY19hbGlnbmVkKGl2ZWMpOworCQkJd2hpbGUgKGxlbi0tKSB7CisJCQkJb3V0W25dID0gaW5bbl0gXiBlY291bnRfYnVmW25dOworCQkJCSsrbjsKKwkJCX0KKwkJfQorCQkqbnVtID0gbjsKKwkJcmV0dXJuOworCX0gd2hpbGUoMCk7CisJLyogdGhlIHJlc3Qgd291bGQgYmUgY29tbW9ubHkgZWxpbWluYXRlZCBieSB4ODYqIGNvbXBpbGVyICovCisjZW5kaWYKKwl3aGlsZSAobDxsZW4pIHsKKwkJaWYgKG49PTApIHsKKwkJCSgqYmxvY2spKGl2ZWMsIGVjb3VudF9idWYsIGtleSk7CisgCQkJY3RyMTI4X2luYyhpdmVjKTsKKwkJfQorCQlvdXRbbF0gPSBpbltsXSBeIGVjb3VudF9idWZbbl07CisJCSsrbDsKKwkJbiA9IChuKzEpICUgMTY7CisJfQorCisJKm51bT1uOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL21vZGVzL29mYjEyOC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL21vZGVzL29mYjEyOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzJlMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vbW9kZXMvb2ZiMTI4LmMKQEAgLTAsMCArMSwxMjggQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpbmNsdWRlICJtb2Rlcy5oIgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZuZGVmIE1PREVTX0RFQlVHCisjIGlmbmRlZiBOREVCVUcKKyMgIGRlZmluZSBOREVCVUcKKyMgZW5kaWYKKyNlbmRpZgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIFNUUklDVF9BTElHTk1FTlQKKyNpZiBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgXAorICAgIGRlZmluZWQoX194ODZfNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgXAorICAgIGRlZmluZWQoX01fSVg4NikgfHwgZGVmaW5lZChfTV9BTUQ2NCkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IFwKKyAgICBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9fczM5MHhfXykKKyMgIHVuZGVmIFNUUklDVF9BTElHTk1FTlQKKyNlbmRpZgorCisvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBlbmNyeXB0ZWQgYXMgdGhvdWdoIDEyOGJpdCBvZmIgbW9kZSBpcyBiZWluZworICogdXNlZC4gIFRoZSBleHRyYSBzdGF0ZSBpbmZvcm1hdGlvbiB0byByZWNvcmQgaG93IG11Y2ggb2YgdGhlCisgKiAxMjhiaXQgYmxvY2sgd2UgaGF2ZSB1c2VkIGlzIGNvbnRhaW5lZCBpbiAqbnVtOworICovCit2b2lkIENSWVBUT19vZmIxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqa2V5LAorCQkJdW5zaWduZWQgY2hhciBpdmVjWzE2XSwgaW50ICpudW0sCisJCQlibG9jazEyOF9mIGJsb2NrKQoreworCXVuc2lnbmVkIGludCBuOworCXNpemVfdCBsPTA7CisKKwlhc3NlcnQoaW4gJiYgb3V0ICYmIGtleSAmJiBpdmVjICYmIG51bSk7CisKKwluID0gKm51bTsKKworI2lmICFkZWZpbmVkKE9QRU5TU0xfU01BTExfRk9PVFBSSU5UKQorCWlmICgxNiVzaXplb2Yoc2l6ZV90KSA9PSAwKSBkbyB7IC8qIGFsd2F5cyB0cnVlIGFjdHVhbGx5ICovCisJCXdoaWxlIChuICYmIGxlbikgeworCQkJKihvdXQrKykgPSAqKGluKyspIF4gaXZlY1tuXTsKKwkJCS0tbGVuOworCQkJbiA9IChuKzEpICUgMTY7CisJCX0KKyNpZiBkZWZpbmVkKFNUUklDVF9BTElHTk1FTlQpCisJCWlmICgoKHNpemVfdClpbnwoc2l6ZV90KW91dHwoc2l6ZV90KWl2ZWMpJXNpemVvZihzaXplX3QpICE9IDApCisJCQlicmVhazsKKyNlbmRpZgorCQl3aGlsZSAobGVuPj0xNikgeworCQkJKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKwkJCWZvciAoOyBuPDE2OyBuKz1zaXplb2Yoc2l6ZV90KSkKKwkJCQkqKHNpemVfdCopKG91dCtuKSA9CisJCQkJKihzaXplX3QqKShpbituKSBeICooc2l6ZV90KikoaXZlYytuKTsKKwkJCWxlbiAtPSAxNjsKKwkJCW91dCArPSAxNjsKKwkJCWluICArPSAxNjsKKwkJCW4gPSAwOworCQl9CisJCWlmIChsZW4pIHsKKwkJCSgqYmxvY2spKGl2ZWMsIGl2ZWMsIGtleSk7CisJCQl3aGlsZSAobGVuLS0pIHsKKwkJCQlvdXRbbl0gPSBpbltuXSBeIGl2ZWNbbl07CisJCQkJKytuOworCQkJfQorCQl9CisJCSpudW0gPSBuOworCQlyZXR1cm47CisJfSB3aGlsZSgwKTsKKwkvKiB0aGUgcmVzdCB3b3VsZCBiZSBjb21tb25seSBlbGltaW5hdGVkIGJ5IHg4NiogY29tcGlsZXIgKi8KKyNlbmRpZgorCXdoaWxlIChsPGxlbikgeworCQlpZiAobj09MCkgeworCQkJKCpibG9jaykoaXZlYywgaXZlYywga2V5KTsKKwkJfQorCQlvdXRbbF0gPSBpbltsXSBeIGl2ZWNbbl07CisJCSsrbDsKKwkJbiA9IChuKzEpICUgMTY7CisJfQorCisJKm51bT1uOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29fZGlyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb19kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjg5MWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29fZGlyLmMKQEAgLTAsMCArMSw4MyBAQAorLyogY3J5cHRvL29fZGlyLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxlX29zLmg+CisKKy8qIFRoZSByb3V0aW5lcyByZWFsbHkgY29tZSBmcm9tIHRoZSBMZXZpdHRlIFByb2dyYW1taW5nLCBzbyB0byBtYWtlCisgICBsaWZlIHNpbXBsZSwgbGV0J3MganVzdCB1c2UgdGhlIHJhdyBmaWxlcyBhbmQgaGFjayB0aGUgc3ltYm9scyB0bworICAgZml0IG91ciBuYW1lc3BhY2UuICAqLworI2RlZmluZSBMUF9ESVJfQ1RYIE9QRU5TU0xfRElSX0NUWAorI2RlZmluZSBMUF9kaXJfY29udGV4dF9zdCBPUEVOU1NMX2Rpcl9jb250ZXh0X3N0CisjZGVmaW5lIExQX2ZpbmRfZmlsZSBPUEVOU1NMX0RJUl9yZWFkCisjZGVmaW5lIExQX2ZpbmRfZmlsZV9lbmQgT1BFTlNTTF9ESVJfZW5kCisKKyNpbmNsdWRlICJvX2Rpci5oIgorCisjZGVmaW5lIExQRElSX0gKKyNpZiBkZWZpbmVkIE9QRU5TU0xfU1lTX1VOSVggfHwgZGVmaW5lZCBESkdQUAorI2luY2x1ZGUgIkxQZGlyX3VuaXguYyIKKyNlbGlmIGRlZmluZWQgT1BFTlNTTF9TWVNfVk1TCisjaW5jbHVkZSAiTFBkaXJfdm1zLmMiCisjZWxpZiBkZWZpbmVkIE9QRU5TU0xfU1lTX1dJTjMyCisjaW5jbHVkZSAiTFBkaXJfd2luMzIuYyIKKyNlbGlmIGRlZmluZWQgT1BFTlNTTF9TWVNfV0lOQ0UKKyNpbmNsdWRlICJMUGRpcl93aW5jZS5jIgorI2Vsc2UKKyNpbmNsdWRlICJMUGRpcl9ueWkuYyIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29fZGlyLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vb19kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjcyNWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29fZGlyLmgKQEAgLTAsMCArMSw1MyBAQAorLyogY3J5cHRvL29fZGlyLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIENvcGllZCBmcm9tIFJpY2hhcmQgTGV2aXR0ZSdzIChyaWNoYXJkQGxldml0dGUub3JnKSBMUCBsaWJyYXJ5LiAgQWxsCisgKiBzeW1ib2wgbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQsIHdpdGggcGVybWlzc2lvbiBmcm9tIHRoZSBhdXRob3IuCisgKi8KKworLyogJExQOiBMUGxpYi9zb3VyY2UvTFBkaXIuaCx2IDEuMSAyMDA0LzA2LzE0IDA4OjU2OjA0IF9jdnNfbGV2aXR0ZSBFeHAgJCAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCwgUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKworI2lmbmRlZiBPX0RJUl9ICisjZGVmaW5lIE9fRElSX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisgIHR5cGVkZWYgc3RydWN0IE9QRU5TU0xfZGlyX2NvbnRleHRfc3QgT1BFTlNTTF9ESVJfQ1RYOworCisgIC8qIHJldHVybnMgTlVMTCBvbiBlcnJvciBvciBlbmQtb2YtZGlyZWN0b3J5LgorICAgICBJZiBpdCBpcyBlbmQtb2YtZGlyZWN0b3J5LCBlcnJubyB3aWxsIGJlIHplcm8gKi8KKyAgY29uc3QgY2hhciAqT1BFTlNTTF9ESVJfcmVhZChPUEVOU1NMX0RJUl9DVFggKipjdHgsIGNvbnN0IGNoYXIgKmRpcmVjdG9yeSk7CisgIC8qIHJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG9uIGVycm9yICovCisgIGludCBPUEVOU1NMX0RJUl9lbmQoT1BFTlNTTF9ESVJfQ1RYICoqY3R4KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExQRElSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vX2Rpcl90ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb19kaXJfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNzVlY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb19kaXJfdGVzdC5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qIGNyeXB0by9vX2Rpci5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBDb3BpZWQgZnJvbSBSaWNoYXJkIExldml0dGUncyAocmljaGFyZEBsZXZpdHRlLm9yZykgTFAgbGlicmFyeS4gIEFsbAorICogc3ltYm9sIG5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkLCB3aXRoIHBlcm1pc3Npb24gZnJvbSB0aGUgYXV0aG9yLgorICovCisKKy8qICRMUDogTFBsaWIvdGVzdC90ZXN0X2Rpci5jLHYgMS4xIDIwMDQvMDYvMTYgMjI6NTk6NDcgX2N2c19sZXZpdHRlIEV4cCAkICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCBSaWNoYXJkIExldml0dGUgPHJpY2hhcmRAbGV2aXR0ZS5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlICJlX29zMi5oIgorI2luY2x1ZGUgIm9fZGlyLmgiCisKKyNpZiBkZWZpbmVkIE9QRU5TU0xfU1lTX1VOSVggfHwgZGVmaW5lZCBPUEVOU1NMX1NZU19XSU4zMiB8fCBkZWZpbmVkIE9QRU5TU0xfU1lTX1dJTkNFCisjZGVmaW5lIENVUlJESVIgIi4iCisjZWxpZiBkZWZpbmVkIE9QRU5TU0xfU1lTX1ZNUworI2RlZmluZSBDVVJSRElSICJTWVMkRElTSzpbXSIKKyNlbHNlCisjZXJyb3IgIk5vIHN1cHBvcnRlZCBwbGF0Zm9ybSBkZWZpbmVkISIKKyNlbmRpZgorCitpbnQgbWFpbigpCit7CisgIE9QRU5TU0xfRElSX0NUWCAqY3R4ID0gTlVMTDsKKyAgY29uc3QgY2hhciAqcmVzdWx0OworCisgIHdoaWxlKChyZXN1bHQgPSBPUEVOU1NMX0RJUl9yZWFkKCZjdHgsIENVUlJESVIpKSAhPSBOVUxMKQorICAgIHsKKyAgICAgIHByaW50ZigiJXNcbiIsIHJlc3VsdCk7CisgICAgfQorCisgIGlmIChlcnJubykKKyAgICB7CisgICAgICBwZXJyb3IoInRlc3RfZGlyIik7CisgICAgICBleGl0KDEpOworICAgIH0KKworICBpZiAoIU9QRU5TU0xfRElSX2VuZCgmY3R4KSkKKyAgICB7CisgICAgICBwZXJyb3IoInRlc3RfZGlyIik7CisgICAgICBleGl0KDIpOworICAgIH0KKyAgZXhpdCgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vX3N0ci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL29fc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxMDRhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vX3N0ci5jCkBAIC0wLDAgKzEsMTExIEBACisvKiBjcnlwdG8vb19zdHIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAzLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVfb3MuaD4KKyNpbmNsdWRlICJvX3N0ci5oIgorCisjaWYgIWRlZmluZWQoT1BFTlNTTF9JTVBMRU1FTlRTX3N0cm5jYXNlY21wKSAmJiBcCisgICAgIWRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX1dJTjMyKSAmJiBcCisgICAgIWRlZmluZWQoTkVUV0FSRV9DTElCKQorIyBpbmNsdWRlIDxzdHJpbmdzLmg+CisjZW5kaWYKKworaW50IE9QRU5TU0xfc3RybmNhc2VjbXAoY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwgc2l6ZV90IG4pCisJeworI2lmIGRlZmluZWQoT1BFTlNTTF9JTVBMRU1FTlRTX3N0cm5jYXNlY21wKQorCXdoaWxlICgqc3RyMSAmJiAqc3RyMiAmJiBuKQorCQl7CisJCWludCByZXMgPSB0b3VwcGVyKCpzdHIxKSAtIHRvdXBwZXIoKnN0cjIpOworCQlpZiAocmVzKSByZXR1cm4gcmVzIDwgMCA/IC0xIDogMTsKKwkJc3RyMSsrOworCQlzdHIyKys7CisJCW4tLTsKKwkJfQorCWlmIChuID09IDApCisJCXJldHVybiAwOworCWlmICgqc3RyMSkKKwkJcmV0dXJuIDE7CisJaWYgKCpzdHIyKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7CisjZWxzZQorCS8qIFJlY3Vyc2lvbiBoYXphcmQgd2FybmluZyEgV2hlbmV2ZXIgc3RybmNhc2VjbXAgaXMgI2RlZmluZWQgYXMKKwkgKiBPUEVOU1NMX3N0cm5jYXNlY21wLCBPUEVOU1NMX0lNUExFTUVOVFNfc3RybmNhc2VjbXAgbXVzdCBiZQorCSAqIGRlZmluZWQgYXMgd2VsbC4gKi8KKwlyZXR1cm4gc3RybmNhc2VjbXAoc3RyMSwgc3RyMiwgbik7CisjZW5kaWYKKwl9CitpbnQgT1BFTlNTTF9zdHJjYXNlY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpCisJeworI2lmIGRlZmluZWQoT1BFTlNTTF9JTVBMRU1FTlRTX3N0cm5jYXNlY21wKQorCXJldHVybiBPUEVOU1NMX3N0cm5jYXNlY21wKHN0cjEsIHN0cjIsIChzaXplX3QpLTEpOworI2Vsc2UKKwlyZXR1cm4gc3RyY2FzZWNtcChzdHIxLCBzdHIyKTsKKyNlbmRpZgorCX0KKworaW50IE9QRU5TU0xfbWVtY21wKGNvbnN0IHZvaWQgKnYxLGNvbnN0IHZvaWQgKnYyLHNpemVfdCBuKQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpjMT12MSwqYzI9djI7CisJaW50IHJldD0wOworCisJd2hpbGUobiAmJiAocmV0PSpjMS0qYzIpPT0wKSBuLS0sYzErKyxjMisrOworCisJcmV0dXJuIHJldDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb19zdHIuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9vX3N0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzk4NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb19zdHIuaApAQCAtMCwwICsxLDY4IEBACisvKiBjcnlwdG8vb19zdHIuaCAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAzLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX09fU1RSX0gKKyNkZWZpbmUgSEVBREVSX09fU1RSX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgkJLyogdG8gZ2V0IHNpemVfdCAqLworCitpbnQgT1BFTlNTTF9zdHJjYXNlY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpOworaW50IE9QRU5TU0xfc3RybmNhc2VjbXAoY29uc3QgY2hhciAqc3RyMSwgY29uc3QgY2hhciAqc3RyMiwgc2l6ZV90IG4pOworaW50IE9QRU5TU0xfbWVtY21wKGNvbnN0IHZvaWQgKnAxLGNvbnN0IHZvaWQgKnAyLHNpemVfdCBuKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb190aW1lLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb190aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjYmRkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vX3RpbWUuYwpAQCAtMCwwICsxLDM2NiBAQAorLyogY3J5cHRvL29fdGltZS5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA4LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAib190aW1lLmgiCisKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKyMgaW5jbHVkZSA8bGliZHRkZWYuaD4KKyMgaW5jbHVkZSA8bGliJHJvdXRpbmVzLmg+CisjIGluY2x1ZGUgPGxubWRlZi5oPgorIyBpbmNsdWRlIDxzdGFybGV0Lmg+CisjIGluY2x1ZGUgPGRlc2NyaXAuaD4KKyMgaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworc3RydWN0IHRtICpPUEVOU1NMX2dtdGltZShjb25zdCB0aW1lX3QgKnRpbWVyLCBzdHJ1Y3QgdG0gKnJlc3VsdCkKKwl7CisJc3RydWN0IHRtICp0cyA9IE5VTEw7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfVEhSRUFEUykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX09TMikgJiYgKCFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChnbXRpbWVfcikpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01BQ09TWCkgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfU1VOT1MpCisJLyogc2hvdWxkIHJldHVybiAmZGF0YSwgYnV0IGRvZXNuJ3Qgb24gc29tZSBzeXN0ZW1zLAorCSAgIHNvIHdlIGRvbid0IGV2ZW4gbG9vayBhdCB0aGUgcmV0dXJuIHZhbHVlICovCisJZ210aW1lX3IodGltZXIscmVzdWx0KTsKKwl0cyA9IHJlc3VsdDsKKyNlbGlmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykKKwl0cyA9IGdtdGltZSh0aW1lcik7CisJaWYgKHRzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtY3B5KHJlc3VsdCwgdHMsIHNpemVvZihzdHJ1Y3QgdG0pKTsKKwl0cyA9IHJlc3VsdDsKKyNlbmRpZgorI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCWlmICh0cyA9PSBOVUxMKQorCQl7CisJCXN0YXRpYyAkREVTQ1JJUFRPUih0YWJuYW0sIkxOTSREQ0xfTE9HSUNBTCIpOworCQlzdGF0aWMgJERFU0NSSVBUT1IobG9nbmFtLCJTWVMkVElNRVpPTkVfRElGRkVSRU5USUFMIik7CisJCWNoYXIgbG9ndmFsdWVbMjU2XTsKKwkJdW5zaWduZWQgaW50IHJlc2xlbiA9IDA7CisJCXN0cnVjdCB7CisJCQlzaG9ydCBidWZsZW47CisJCQlzaG9ydCBjb2RlOworCQkJdm9pZCAqYnVmYWRkcjsKKwkJCXVuc2lnbmVkIGludCAqcmVzbGVuOworCQl9IGl0ZW1saXN0W10gPSB7CisJCQl7IDAsIExOTSRfU1RSSU5HLCAwLCAwIH0sCisJCQl7IDAsIDAsIDAsIDAgfSwKKwkJfTsKKwkJaW50IHN0YXR1czsKKwkJdGltZV90IHQ7CisKKwkJLyogR2V0IHRoZSB2YWx1ZSBmb3IgU1lTJFRJTUVaT05FX0RJRkZFUkVOVElBTCAqLworCQlpdGVtbGlzdFswXS5idWZsZW4gPSBzaXplb2YobG9ndmFsdWUpOworCQlpdGVtbGlzdFswXS5idWZhZGRyID0gbG9ndmFsdWU7CisJCWl0ZW1saXN0WzBdLnJlc2xlbiA9ICZyZXNsZW47CisJCXN0YXR1cyA9IHN5cyR0cm5sbm0oMCwgJnRhYm5hbSwgJmxvZ25hbSwgMCwgaXRlbWxpc3QpOworCQlpZiAoIShzdGF0dXMgJiAxKSkKKwkJCXJldHVybiBOVUxMOworCQlsb2d2YWx1ZVtyZXNsZW5dID0gJ1wwJzsKKworCQl0ID0gKnRpbWVyOworCisvKiBUaGUgZm9sbG93aW5nIGlzIGV4dHJhY3RlZCBmcm9tIHRoZSBERUMgQyBoZWFkZXIgdGltZS5oICovCisvKgorKiogIEJlZ2lubmluZyBpbiBPcGVuVk1TIFZlcnNpb24gNy4wIG1rdGltZSwgdGltZSwgY3RpbWUsIHN0cmZ0aW1lCisqKiAgaGF2ZSB0d28gaW1wbGVtZW50YXRpb25zLiAgT25lIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkCisqKiAgZm9yIGNvbXBhdGliaWxpdHkgYW5kIGRlYWxzIHdpdGggdGltZSBpbiB0ZXJtcyBvZiBsb2NhbCB0aW1lLAorKiogIHRoZSBvdGhlciBfX3V0Y18qIGRlYWxzIHdpdGggdGltZSBpbiB0ZXJtcyBvZiBVVEMuCisqLworLyogV2UgdXNlIHRoZSBzYW1lIGNvbmRpdGlvbnMgYXMgaW4gc2FpZCB0aW1lLmggdG8gY2hlY2sgaWYgd2Ugc2hvdWxkCisgICBhc3N1bWUgdGhhdCB0IGNvbnRhaW5zIGxvY2FsIHRpbWUgKGFuZCBzaG91bGQgdGhlcmVmb3JlIGJlIGFkanVzdGVkKQorICAgb3IgVVRDIChhbmQgc2hvdWxkIHRoZXJlZm9yZSBiZSBsZWZ0IHVudG91Y2hlZCkuICovCisjaWYgX19DUlRMX1ZFUiA8IDcwMDAwMDAwIHx8IGRlZmluZWQgX1ZNU19WNl9TT1VSQ0UKKwkJLyogR2V0IHRoZSBudW1lcmljYWwgdmFsdWUgb2YgdGhlIGVxdWl2YWxlbmNlIHN0cmluZyAqLworCQlzdGF0dXMgPSBhdG9pKGxvZ3ZhbHVlKTsKKworCQkvKiBhbmQgdXNlIGl0IHRvIG1vdmUgdGltZSB0byBHTVQgKi8KKwkJdCAtPSBzdGF0dXM7CisjZW5kaWYKKworCQkvKiB0aGVuIGNvbnZlcnQgdGhlIHJlc3VsdCB0byB0aGUgdGltZSBzdHJ1Y3R1cmUgKi8KKworCQkvKiBTaW5jZSB0aGVyZSB3YXMgbm8gZ210aW1lX3IoKSB0byBkbyB0aGlzIHN0dWZmIGZvciB1cywKKwkJICAgd2UgaGF2ZSB0byBkbyBpdCB0aGUgaGFyZCB3YXkuICovCisJCXsKKwkJLyogVGhlIFZNUyBlcG9jaCBpcyB0aGUgYXN0cm9ub21pY2FsIFNtaXRoc29uaWFuIGRhdGUsCisJCSAgIGlmIEkgcmVtZW1iZXIgY29ycmVjdGx5LCB3aGljaCBpcyBOb3ZlbWJlciAxNywgMTg1OC4KKwkJICAgRnVydGhlcm1vcmUsIHRpbWUgaXMgbWVhc3VyZSBpbiB0aGVudGhzIG9mIG1pY3Jvc2Vjb25kcworCQkgICBhbmQgc3RvcmVkIGluIHF1YWR3b3JkcyAoNjQgYml0IGludGVnZXJzKS4gIHVuaXhfZXBvY2gKKwkJICAgYmVsb3cgaXMgSmFudWFyeSAxc3QgMTk3MCBleHByZXNzZWQgYXMgYSBWTVMgdGltZS4gIFRoZQorCQkgICBmb2xsb3dpbmcgY29kZSB3YXMgdXNlZCB0byBnZXQgdGhpcyBudW1iZXI6CisKKwkJICAgI2luY2x1ZGUgPHN0ZGlvLmg+CisJCSAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKwkJICAgI2luY2x1ZGUgPGxpYiRyb3V0aW5lcy5oPgorCQkgICAjaW5jbHVkZSA8c3RhcmxldC5oPgorCisJCSAgIG1haW4oKQorCQkgICB7CisJCSAgICAgdW5zaWduZWQgbG9uZyBzeXN0aW1lWzJdOworCQkgICAgIHVuc2lnbmVkIHNob3J0IGVwb2NoX3ZhbHVlc1s3XSA9CisJCSAgICAgICB7IDE5NzAsIDEsIDEsIDAsIDAsIDAsIDAgfTsKKworCQkgICAgIGxpYiRjdnRfdmVjdGltKGVwb2NoX3ZhbHVlcywgc3lzdGltZSk7CisKKwkJICAgICBwcmludGYoIiV1ICV1Iiwgc3lzdGltZVswXSwgc3lzdGltZVsxXSk7CisJCSAgIH0KKwkJKi8KKwkJdW5zaWduZWQgbG9uZyB1bml4X2Vwb2NoWzJdID0geyAxMjczNzA4NTQ0LCA4MTY0NzExIH07CisJCXVuc2lnbmVkIGxvbmcgZGVsdGF0aW1lWzJdOworCQl1bnNpZ25lZCBsb25nIHN5c3RpbWVbMl07CisJCXN0cnVjdCB2bXNfdmVjdGltZQorCQkJeworCQkJc2hvcnQgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsCisJCQkJY2VudGlfc2Vjb25kOworCQkJfSB0aW1lX3ZhbHVlczsKKwkJbG9uZyBvcGVyYXRpb247CisKKwkJLyogVHVybiB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgSmFudWFyeSAxc3QgMTk3MCB0bworCQkgICBhbiBpbnRlcm5hbCBkZWx0YSB0aW1lLgorCQkgICBOb3RlIHRoYXQgbGliJGN2dF90b19pbnRlcm5hbF90aW1lKCkgd2lsbCBhc3N1bWUKKwkJICAgdGhhdCB0IGlzIHNpZ25lZCwgYW5kIHdpbGwgdGhlcmVmb3JlIGJyZWFrIG9uIDMyLWJpdAorCQkgICBzeXN0ZW1zIHNvbWUgdGltZSBpbiAyMDM4LgorCQkqLworCQlvcGVyYXRpb24gPSBMSUIkS19ERUxUQV9TRUNPTkRTOworCQlzdGF0dXMgPSBsaWIkY3Z0X3RvX2ludGVybmFsX3RpbWUoJm9wZXJhdGlvbiwKKwkJCSZ0LCBkZWx0YXRpbWUpOworCisJCS8qIEFkZCB0aGUgZGVsdGEgdGltZSB3aXRoIHRoZSBVbml4IGVwb2NoIGFuZCB3ZSBoYXZlCisJCSAgIHRoZSBjdXJyZW50IFVUQyB0aW1lIGluIGludGVybmFsIGZvcm1hdCAqLworCQlzdGF0dXMgPSBsaWIkYWRkX3RpbWVzKHVuaXhfZXBvY2gsIGRlbHRhdGltZSwgc3lzdGltZSk7CisKKwkJLyogVHVybiB0aGUgaW50ZXJuYWwgdGltZSBpbnRvIGEgdGltZSB2ZWN0b3IgKi8KKwkJc3RhdHVzID0gc3lzJG51bXRpbSgmdGltZV92YWx1ZXMsIHN5c3RpbWUpOworCisJCS8qIEZpbGwgaW4gdGhlIHN0cnVjdCB0bSB3aXRoIHRoZSByZXN1bHQgKi8KKwkJcmVzdWx0LT50bV9zZWMgPSB0aW1lX3ZhbHVlcy5zZWNvbmQ7CisJCXJlc3VsdC0+dG1fbWluID0gdGltZV92YWx1ZXMubWludXRlOworCQlyZXN1bHQtPnRtX2hvdXIgPSB0aW1lX3ZhbHVlcy5ob3VyOworCQlyZXN1bHQtPnRtX21kYXkgPSB0aW1lX3ZhbHVlcy5kYXk7CisJCXJlc3VsdC0+dG1fbW9uID0gdGltZV92YWx1ZXMubW9udGggLSAxOworCQlyZXN1bHQtPnRtX3llYXIgPSB0aW1lX3ZhbHVlcy55ZWFyIC0gMTkwMDsKKworCQlvcGVyYXRpb24gPSBMSUIkS19EQVlfT0ZfV0VFSzsKKwkJc3RhdHVzID0gbGliJGN2dF9mcm9tX2ludGVybmFsX3RpbWUoJm9wZXJhdGlvbiwKKwkJCSZyZXN1bHQtPnRtX3dkYXksIHN5c3RpbWUpOworCQlyZXN1bHQtPnRtX3dkYXkgJT0gNzsKKworCQlvcGVyYXRpb24gPSBMSUIkS19EQVlfT0ZfWUVBUjsKKwkJc3RhdHVzID0gbGliJGN2dF9mcm9tX2ludGVybmFsX3RpbWUoJm9wZXJhdGlvbiwKKwkJCSZyZXN1bHQtPnRtX3lkYXksIHN5c3RpbWUpOworCQlyZXN1bHQtPnRtX3lkYXktLTsKKworCQlyZXN1bHQtPnRtX2lzZHN0ID0gMDsgLyogVGhlcmUncyBubyB3YXkgdG8ga25vdy4uLiAqLworCisJCXRzID0gcmVzdWx0OworCQl9CisJCX0KKyNlbmRpZgorCXJldHVybiB0czsKKwl9CisKKy8qIFRha2UgYSB0bSBzdHJ1Y3R1cmUgYW5kIGFkZCBhbiBvZmZzZXQgdG8gaXQuIFRoaXMgYXZvaWRzIGFueSBPUyBpc3N1ZXMKKyAqIHdpdGggcmVzdHJpY3RlZCBkYXRlIHR5cGVzIGFuZCBvdmVyZmxvd3Mgd2hpY2ggY2F1c2UgdGhlIHllYXIgMjAzOAorICogcHJvYmxlbS4KKyAqLworCisjZGVmaW5lIFNFQ1NfUEVSX0RBWSAoMjQgKiA2MCAqIDYwKQorCitzdGF0aWMgbG9uZyBkYXRlX3RvX2p1bGlhbihpbnQgeSwgaW50IG0sIGludCBkKTsKK3N0YXRpYyB2b2lkIGp1bGlhbl90b19kYXRlKGxvbmcgamQsIGludCAqeSwgaW50ICptLCBpbnQgKmQpOworCitpbnQgT1BFTlNTTF9nbXRpbWVfYWRqKHN0cnVjdCB0bSAqdG0sIGludCBvZmZfZGF5LCBsb25nIG9mZnNldF9zZWMpCisJeworCWludCBvZmZzZXRfaG1zLCBvZmZzZXRfZGF5OworCWxvbmcgdGltZV9qZDsKKwlpbnQgdGltZV95ZWFyLCB0aW1lX21vbnRoLCB0aW1lX2RheTsKKwkvKiBzcGxpdCBvZmZzZXQgaW50byBkYXlzIGFuZCBkYXkgc2Vjb25kcyAqLworCW9mZnNldF9kYXkgPSBvZmZzZXRfc2VjIC8gU0VDU19QRVJfREFZOworCS8qIEF2b2lkIHNpZ24gaXNzdWVzIHdpdGggJSBvcGVyYXRvciAqLworCW9mZnNldF9obXMgID0gb2Zmc2V0X3NlYyAtIChvZmZzZXRfZGF5ICogU0VDU19QRVJfREFZKTsKKwlvZmZzZXRfZGF5ICs9IG9mZl9kYXk7CisJLyogQWRkIGN1cnJlbnQgdGltZSBzZWNvbmRzIHRvIG9mZnNldCAqLworCW9mZnNldF9obXMgKz0gdG0tPnRtX2hvdXIgKiAzNjAwICsgdG0tPnRtX21pbiAqIDYwICsgdG0tPnRtX3NlYzsKKwkvKiBBZGp1c3QgZGF5IHNlY29uZHMgaWYgb3ZlcmZsb3cgKi8KKwlpZiAob2Zmc2V0X2htcyA+PSBTRUNTX1BFUl9EQVkpCisJCXsKKwkJb2Zmc2V0X2RheSsrOworCQlvZmZzZXRfaG1zIC09IFNFQ1NfUEVSX0RBWTsKKwkJfQorCWVsc2UgaWYgKG9mZnNldF9obXMgPCAwKQorCQl7CisJCW9mZnNldF9kYXktLTsKKwkJb2Zmc2V0X2htcyArPSBTRUNTX1BFUl9EQVk7CisJCX0KKworCS8qIENvbnZlcnQgZGF0ZSBvZiB0aW1lIHN0cnVjdHVyZSBpbnRvIGEgSnVsaWFuIGRheSBudW1iZXIuCisJICovCisKKwl0aW1lX3llYXIgPSB0bS0+dG1feWVhciArIDE5MDA7CisJdGltZV9tb250aCA9IHRtLT50bV9tb24gKyAxOworCXRpbWVfZGF5ID0gdG0tPnRtX21kYXk7CisKKwl0aW1lX2pkID0gZGF0ZV90b19qdWxpYW4odGltZV95ZWFyLCB0aW1lX21vbnRoLCB0aW1lX2RheSk7CisKKwkvKiBXb3JrIG91dCBKdWxpYW4gZGF5IG9mIG5ldyBkYXRlICovCisJdGltZV9qZCArPSBvZmZzZXRfZGF5OworCisJaWYgKHRpbWVfamQgPCAwKQorCQlyZXR1cm4gMDsKKworCS8qIENvbnZlcnQgSnVsaWFuIGRheSBiYWNrIHRvIGRhdGUgKi8KKworCWp1bGlhbl90b19kYXRlKHRpbWVfamQsICZ0aW1lX3llYXIsICZ0aW1lX21vbnRoLCAmdGltZV9kYXkpOworCisJaWYgKHRpbWVfeWVhciA8IDE5MDAgfHwgdGltZV95ZWFyID4gOTk5OSkKKwkJcmV0dXJuIDA7CisKKwkvKiBVcGRhdGUgdG0gc3RydWN0dXJlICovCisKKwl0bS0+dG1feWVhciA9IHRpbWVfeWVhciAtIDE5MDA7CisJdG0tPnRtX21vbiA9IHRpbWVfbW9udGggLSAxOworCXRtLT50bV9tZGF5ID0gdGltZV9kYXk7CisKKwl0bS0+dG1faG91ciA9IG9mZnNldF9obXMgLyAzNjAwOworCXRtLT50bV9taW4gPSAob2Zmc2V0X2htcyAvIDYwKSAlIDYwOworCXRtLT50bV9zZWMgPSBvZmZzZXRfaG1zICUgNjA7CisKKwlyZXR1cm4gMTsKKwkJCit9CisKKy8qIENvbnZlcnQgZGF0ZSB0byBhbmQgZnJvbSBqdWxpYW4gZGF5CisgKiBVc2VzIEZsaWVnZWwgJiBWYW4gRmxhbmRlcm4gYWxnb3JpdGhtCisgKi8KK3N0YXRpYyBsb25nIGRhdGVfdG9fanVsaWFuKGludCB5LCBpbnQgbSwgaW50IGQpCit7CisJcmV0dXJuICgxNDYxICogKHkgKyA0ODAwICsgKG0gLSAxNCkgLyAxMikpIC8gNCArCisJCSgzNjcgKiAobSAtIDIgLSAxMiAqICgobSAtIDE0KSAvIDEyKSkpIC8gMTIgLQorCQkoMyAqICgoeSArIDQ5MDAgKyAobSAtIDE0KSAvIDEyKSAvIDEwMCkpIC8gNCArCisJCWQgLSAzMjA3NTsKK30KKworc3RhdGljIHZvaWQganVsaWFuX3RvX2RhdGUobG9uZyBqZCwgaW50ICp5LCBpbnQgKm0sIGludCAqZCkKKwl7CisJbG9uZyAgTCA9IGpkICsgNjg1Njk7CisJbG9uZyAgbiA9ICg0ICogTCkgLyAxNDYwOTc7CisJbG9uZyAgaSwgajsKKworCUwgPSBMIC0gKDE0NjA5NyAqIG4gKyAzKSAvIDQ7CisJaSA9ICg0MDAwICogKEwgKyAxKSkgLyAxNDYxMDAxOworCUwgPSBMIC0gKDE0NjEgKiBpKSAvIDQgKyAzMTsKKwlqID0gKDgwICogTCkgLyAyNDQ3OworCSpkID0gTCAtICgyNDQ3ICogaikgLyA4MDsKKwlMID0gaiAvIDExOworCSptID0gaiArIDIgLSAoMTIgKiBMKTsKKwkqeSA9IDEwMCAqIChuIC0gNDkpICsgaSArIEw7CisJfQorCisjaWZkZWYgT1BFTlNTTF9USU1FX1RFU1QKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIFRpbWUgY2hlY2tpbmcgdGVzdCBjb2RlLiBDaGVjayB0aW1lcyBhcmUgaWRlbnRpY2FsIGZvciBhIHdpZGUgcmFuZ2Ugb2YKKyAqIG9mZnNldHMuIFRoaXMgc2hvdWxkIGJlIHJ1biBvbiBhIG1hY2hpbmUgd2l0aCA2NCBiaXQgdGltZV90IG9yIGl0IHdpbGwKKyAqIHRyaWdnZXIgdGhlIHZlcnkgZXJyb3JzIHRoZSByb3V0aW5lcyBmaXguCisgKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlsb25nIG9mZnNldDsKKwlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDEwMDAwMDA7IG9mZnNldCsrKQorCQl7CisJCWNoZWNrX3RpbWUob2Zmc2V0KTsKKwkJY2hlY2tfdGltZSgtb2Zmc2V0KTsKKwkJY2hlY2tfdGltZShvZmZzZXQgKiAxMDAwKTsKKwkJY2hlY2tfdGltZSgtb2Zmc2V0ICogMTAwMCk7CisJCX0KKwl9CisKK2ludCBjaGVja190aW1lKGxvbmcgb2Zmc2V0KQorCXsKKwlzdHJ1Y3QgdG0gdG0xLCB0bTI7CisJdGltZV90IHQxLCB0MjsKKwl0aW1lKCZ0MSk7CisJdDIgPSB0MSArIG9mZnNldDsKKwlPUEVOU1NMX2dtdGltZSgmdDIsICZ0bTIpOworCU9QRU5TU0xfZ210aW1lKCZ0MSwgJnRtMSk7CisJT1BFTlNTTF9nbXRpbWVfYWRqKCZ0bTEsIDAsIG9mZnNldCk7CisJaWYgKCh0bTEudG1feWVhciA9PSB0bTIudG1feWVhcikgJiYKKwkgICAgKHRtMS50bV9tb24gPT0gdG0yLnRtX21vbikgJiYKKwkgICAgKHRtMS50bV9tZGF5ID09IHRtMi50bV9tZGF5KSAmJgorCSAgICAodG0xLnRtX2hvdXIgPT0gdG0yLnRtX2hvdXIpICYmCisJICAgICh0bTEudG1fbWluID09IHRtMi50bV9taW4pICYmCisJICAgICh0bTEudG1fc2VjID09IHRtMi50bV9zZWMpKQorCQlyZXR1cm4gMTsKKwlmcHJpbnRmKHN0ZGVyciwgIlRJTUUgRVJST1IhIVxuIik7CisJZnByaW50ZihzdGRlcnIsICJUaW1lMTogJWQvJWQvJWQsICVkOiUwMmQ6JTAyZFxuIiwKKwkJCXRtMi50bV9tZGF5LCB0bTIudG1fbW9uICsgMSwgdG0yLnRtX3llYXIgKyAxOTAwLAorCQkJdG0yLnRtX2hvdXIsIHRtMi50bV9taW4sIHRtMi50bV9zZWMpOworCWZwcmludGYoc3RkZXJyLCAiVGltZTI6ICVkLyVkLyVkLCAlZDolMDJkOiUwMmRcbiIsCisJCQl0bTEudG1fbWRheSwgdG0xLnRtX21vbiArIDEsIHRtMS50bV95ZWFyICsgMTkwMCwKKwkJCXRtMS50bV9ob3VyLCB0bTEudG1fbWluLCB0bTEudG1fc2VjKTsKKwlyZXR1cm4gMDsKKwl9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29fdGltZS5oIGIvbGliL29wZW5zc2wvY3J5cHRvL29fdGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTFkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb190aW1lLmgKQEAgLTAsMCArMSw2NyBAQAorLyogY3J5cHRvL29fdGltZS5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfT19USU1FX0gKKyNkZWZpbmUgSEVBREVSX09fVElNRV9ICisKKyNpbmNsdWRlIDx0aW1lLmg+CisKK3N0cnVjdCB0bSAqT1BFTlNTTF9nbXRpbWUoY29uc3QgdGltZV90ICp0aW1lciwgc3RydWN0IHRtICpyZXN1bHQpOworaW50IE9QRU5TU0xfZ210aW1lX2FkaihzdHJ1Y3QgdG0gKnRtLCBpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vX25hbWVzLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vX25hbWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzODBhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29fbmFtZXMuYwpAQCAtMCwwICsxLDM3MiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NhZmVzdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworLyogTGF0ZXIgdmVyc2lvbnMgb2YgREVDIEMgaGFzIHN0YXJ0ZWQgdG8gYWRkIGxua2FnZSBpbmZvcm1hdGlvbiB0byBjZXJ0YWluCisgKiBmdW5jdGlvbnMsIHdoaWNoIG1ha2VzIGl0IHRyaWNreSB0byB1c2UgdGhlbSBhcyB2YWx1ZXMgdG8gcmVndWxhciBmdW5jdGlvbgorICogcG9pbnRlcnMuICBPbmUgd2F5IGlzIHRvIGRlZmluZSBhIG1hY3JvIHRoYXQgdGFrZXMgY2FyZSBvZiBjYXN0aW5nIHRoZW0KKyAqIGNvcnJlY3RseS4KKyAqLworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNU19ERUNDCisjIGRlZmluZSBPUEVOU1NMX3N0cmNtcCAoaW50ICgqKShjb25zdCBjaGFyICosY29uc3QgY2hhciAqKSlzdHJjbXAKKyNlbHNlCisjIGRlZmluZSBPUEVOU1NMX3N0cmNtcCBzdHJjbXAKKyNlbmRpZgorCisvKiBJIHVzZSB0aGUgZXhfZGF0YSBzdHVmZiB0byBtYW5hZ2UgdGhlIGlkZW50aWZpZXJzIGZvciB0aGUgb2JqX25hbWVfdHlwZXMKKyAqIHRoYXQgYXBwbGljYXRpb25zIG1heSBkZWZpbmUuICBJIG9ubHkgcmVhbGx5IHVzZSB0aGUgZnJlZSBmdW5jdGlvbiBmaWVsZC4KKyAqLworREVDTEFSRV9MSEFTSF9PRihPQkpfTkFNRSk7CitzdGF0aWMgTEhBU0hfT0YoT0JKX05BTUUpICpuYW1lc19saD1OVUxMOworc3RhdGljIGludCBuYW1lc190eXBlX251bT1PQkpfTkFNRV9UWVBFX05VTTsKKwordHlwZWRlZiBzdHJ1Y3QgbmFtZV9mdW5jc19zdAorCXsKKwl1bnNpZ25lZCBsb25nICgqaGFzaF9mdW5jKShjb25zdCBjaGFyICpuYW1lKTsKKwlpbnQgKCpjbXBfZnVuYykoY29uc3QgY2hhciAqYSxjb25zdCBjaGFyICpiKTsKKwl2b2lkICgqZnJlZV9mdW5jKShjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKTsKKwl9IE5BTUVfRlVOQ1M7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoTkFNRV9GVU5DUykKK0lNUExFTUVOVF9TVEFDS19PRihOQU1FX0ZVTkNTKQorCitzdGF0aWMgU1RBQ0tfT0YoTkFNRV9GVU5DUykgKm5hbWVfZnVuY3Nfc3RhY2s7CisKKy8qIFRoZSBMSEFTSCBjYWxsYmFja3Mgbm93IHVzZSB0aGUgcmF3ICJ2b2lkICoiIHByb3RvdHlwZXMgYW5kIGRvIHBlci12YXJpYWJsZQorICogY2FzdGluZyBpbiB0aGUgZnVuY3Rpb25zLiBUaGlzIHByZXZlbnRzIGZ1bmN0aW9uIHBvaW50ZXIgY2FzdGluZyB3aXRob3V0IHRoZQorICogbmVlZCBmb3IgbWFjcm8tZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb25zLiAqLworCisvKiBzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfbmFtZV9oYXNoKE9CSl9OQU1FICphKTsgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9uYW1lX2hhc2goY29uc3Qgdm9pZCAqYV92b2lkKTsKKy8qIHN0YXRpYyBpbnQgb2JqX25hbWVfY21wKE9CSl9OQU1FICphLE9CSl9OQU1FICpiKTsgKi8KK3N0YXRpYyBpbnQgb2JqX25hbWVfY21wKGNvbnN0IHZvaWQgKmFfdm9pZCxjb25zdCB2b2lkICpiX3ZvaWQpOworCitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0hBU0hfRk4ob2JqX25hbWUsIE9CSl9OQU1FKQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9DT01QX0ZOKG9ial9uYW1lLCBPQkpfTkFNRSkKKworaW50IE9CSl9OQU1FX2luaXQodm9pZCkKKwl7CisJaWYgKG5hbWVzX2xoICE9IE5VTEwpIHJldHVybigxKTsKKwlNZW1DaGVja19vZmYoKTsKKwluYW1lc19saD1saF9PQkpfTkFNRV9uZXcoKTsKKwlNZW1DaGVja19vbigpOworCXJldHVybihuYW1lc19saCAhPSBOVUxMKTsKKwl9CisKK2ludCBPQkpfTkFNRV9uZXdfaW5kZXgodW5zaWduZWQgbG9uZyAoKmhhc2hfZnVuYykoY29uc3QgY2hhciAqKSwKKwlpbnQgKCpjbXBfZnVuYykoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopLAorCXZvaWQgKCpmcmVlX2Z1bmMpKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKQorCXsKKwlpbnQgcmV0OworCWludCBpOworCU5BTUVfRlVOQ1MgKm5hbWVfZnVuY3M7CisKKwlpZiAobmFtZV9mdW5jc19zdGFjayA9PSBOVUxMKQorCQl7CisJCU1lbUNoZWNrX29mZigpOworCQluYW1lX2Z1bmNzX3N0YWNrPXNrX05BTUVfRlVOQ1NfbmV3X251bGwoKTsKKwkJTWVtQ2hlY2tfb24oKTsKKwkJfQorCWlmICgobmFtZV9mdW5jc19zdGFjayA9PSBOVUxMKSkKKwkJeworCQkvKiBFUlJPUiAqLworCQlyZXR1cm4oMCk7CisJCX0KKwlyZXQ9bmFtZXNfdHlwZV9udW07CisJbmFtZXNfdHlwZV9udW0rKzsKKwlmb3IgKGk9c2tfTkFNRV9GVU5DU19udW0obmFtZV9mdW5jc19zdGFjayk7IGk8bmFtZXNfdHlwZV9udW07IGkrKykKKwkJeworCQlNZW1DaGVja19vZmYoKTsKKwkJbmFtZV9mdW5jcyA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihOQU1FX0ZVTkNTKSk7CisJCU1lbUNoZWNrX29uKCk7CisJCWlmICghbmFtZV9mdW5jcykKKwkJCXsKKwkJCU9CSmVycihPQkpfRl9PQkpfTkFNRV9ORVdfSU5ERVgsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKDApOworCQkJfQorCQluYW1lX2Z1bmNzLT5oYXNoX2Z1bmMgPSBsaF9zdHJoYXNoOworCQluYW1lX2Z1bmNzLT5jbXBfZnVuYyA9IE9QRU5TU0xfc3RyY21wOworCQluYW1lX2Z1bmNzLT5mcmVlX2Z1bmMgPSAwOyAvKiBOVUxMIGlzIG9mdGVuIGRlY2xhcmVkIHRvCisJCQkJCQkqICgodm9pZCAqKTApLCB3aGljaCBhY2NvcmRpbmcKKwkJCQkJCSogdG8gQ29tcGFxIEMgaXMgbm90IHJlYWxseQorCQkJCQkJKiBjb21wYXRpYmxlIHdpdGggYSBmdW5jdGlvbgorCQkJCQkJKiBwb2ludGVyLgktLSBSaWNoYXJkIExldml0dGUqLworCQlNZW1DaGVja19vZmYoKTsKKwkJc2tfTkFNRV9GVU5DU19wdXNoKG5hbWVfZnVuY3Nfc3RhY2ssbmFtZV9mdW5jcyk7CisJCU1lbUNoZWNrX29uKCk7CisJCX0KKwluYW1lX2Z1bmNzID0gc2tfTkFNRV9GVU5DU192YWx1ZShuYW1lX2Z1bmNzX3N0YWNrLCByZXQpOworCWlmIChoYXNoX2Z1bmMgIT0gTlVMTCkKKwkJbmFtZV9mdW5jcy0+aGFzaF9mdW5jID0gaGFzaF9mdW5jOworCWlmIChjbXBfZnVuYyAhPSBOVUxMKQorCQluYW1lX2Z1bmNzLT5jbXBfZnVuYyA9IGNtcF9mdW5jOworCWlmIChmcmVlX2Z1bmMgIT0gTlVMTCkKKwkJbmFtZV9mdW5jcy0+ZnJlZV9mdW5jID0gZnJlZV9mdW5jOworCXJldHVybihyZXQpOworCX0KKworLyogc3RhdGljIGludCBvYmpfbmFtZV9jbXAoT0JKX05BTUUgKmEsIE9CSl9OQU1FICpiKSAqLworc3RhdGljIGludCBvYmpfbmFtZV9jbXAoY29uc3Qgdm9pZCAqYV92b2lkLCBjb25zdCB2b2lkICpiX3ZvaWQpCisJeworCWludCByZXQ7CisJY29uc3QgT0JKX05BTUUgKmEgPSAoY29uc3QgT0JKX05BTUUgKilhX3ZvaWQ7CisJY29uc3QgT0JKX05BTUUgKmIgPSAoY29uc3QgT0JKX05BTUUgKiliX3ZvaWQ7CisKKwlyZXQ9YS0+dHlwZS1iLT50eXBlOworCWlmIChyZXQgPT0gMCkKKwkJeworCQlpZiAoKG5hbWVfZnVuY3Nfc3RhY2sgIT0gTlVMTCkKKwkJCSYmIChza19OQU1FX0ZVTkNTX251bShuYW1lX2Z1bmNzX3N0YWNrKSA+IGEtPnR5cGUpKQorCQkJeworCQkJcmV0PXNrX05BTUVfRlVOQ1NfdmFsdWUobmFtZV9mdW5jc19zdGFjaywKKwkJCQlhLT50eXBlKS0+Y21wX2Z1bmMoYS0+bmFtZSxiLT5uYW1lKTsKKwkJCX0KKwkJZWxzZQorCQkJcmV0PXN0cmNtcChhLT5uYW1lLGItPm5hbWUpOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCisvKiBzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmpfbmFtZV9oYXNoKE9CSl9OQU1FICphKSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX25hbWVfaGFzaChjb25zdCB2b2lkICphX3ZvaWQpCisJeworCXVuc2lnbmVkIGxvbmcgcmV0OworCWNvbnN0IE9CSl9OQU1FICphID0gKGNvbnN0IE9CSl9OQU1FICopYV92b2lkOworCisJaWYgKChuYW1lX2Z1bmNzX3N0YWNrICE9IE5VTEwpICYmIChza19OQU1FX0ZVTkNTX251bShuYW1lX2Z1bmNzX3N0YWNrKSA+IGEtPnR5cGUpKQorCQl7CisJCXJldD1za19OQU1FX0ZVTkNTX3ZhbHVlKG5hbWVfZnVuY3Nfc3RhY2ssCisJCQlhLT50eXBlKS0+aGFzaF9mdW5jKGEtPm5hbWUpOworCQl9CisJZWxzZQorCQl7CisJCXJldD1saF9zdHJoYXNoKGEtPm5hbWUpOworCQl9CisJcmV0Xj1hLT50eXBlOworCXJldHVybihyZXQpOworCX0KKworY29uc3QgY2hhciAqT0JKX05BTUVfZ2V0KGNvbnN0IGNoYXIgKm5hbWUsIGludCB0eXBlKQorCXsKKwlPQkpfTkFNRSBvbiwqcmV0OworCWludCBudW09MCxhbGlhczsKKworCWlmIChuYW1lID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlpZiAoKG5hbWVzX2xoID09IE5VTEwpICYmICFPQkpfTkFNRV9pbml0KCkpIHJldHVybihOVUxMKTsKKworCWFsaWFzPXR5cGUmT0JKX05BTUVfQUxJQVM7CisJdHlwZSY9IH5PQkpfTkFNRV9BTElBUzsKKworCW9uLm5hbWU9bmFtZTsKKwlvbi50eXBlPXR5cGU7CisKKwlmb3IgKDs7KQorCXsKKwkJcmV0PWxoX09CSl9OQU1FX3JldHJpZXZlKG5hbWVzX2xoLCZvbik7CisJCWlmIChyZXQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCQlpZiAoKHJldC0+YWxpYXMpICYmICFhbGlhcykKKwkJCXsKKwkJCWlmICgrK251bSA+IDEwKSByZXR1cm4oTlVMTCk7CisJCQlvbi5uYW1lPXJldC0+ZGF0YTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJcmV0dXJuKHJldC0+ZGF0YSk7CisJCQl9CisJCX0KKwl9CisKK2ludCBPQkpfTkFNRV9hZGQoY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmRhdGEpCisJeworCU9CSl9OQU1FICpvbnAsKnJldDsKKwlpbnQgYWxpYXM7CisKKwlpZiAoKG5hbWVzX2xoID09IE5VTEwpICYmICFPQkpfTkFNRV9pbml0KCkpIHJldHVybigwKTsKKworCWFsaWFzPXR5cGUmT0JKX05BTUVfQUxJQVM7CisJdHlwZSY9IH5PQkpfTkFNRV9BTElBUzsKKworCW9ucD0oT0JKX05BTUUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoT0JKX05BTUUpKTsKKwlpZiAob25wID09IE5VTEwpCisJCXsKKwkJLyogRVJST1IgKi8KKwkJcmV0dXJuKDApOworCQl9CisKKwlvbnAtPm5hbWU9bmFtZTsKKwlvbnAtPmFsaWFzPWFsaWFzOworCW9ucC0+dHlwZT10eXBlOworCW9ucC0+ZGF0YT1kYXRhOworCisJcmV0PWxoX09CSl9OQU1FX2luc2VydChuYW1lc19saCxvbnApOworCWlmIChyZXQgIT0gTlVMTCkKKwkJeworCQkvKiBmcmVlIHRoaW5ncyAqLworCQlpZiAoKG5hbWVfZnVuY3Nfc3RhY2sgIT0gTlVMTCkgJiYgKHNrX05BTUVfRlVOQ1NfbnVtKG5hbWVfZnVuY3Nfc3RhY2spID4gcmV0LT50eXBlKSkKKwkJCXsKKwkJCS8qIFhYWDogSSdtIG5vdCBzdXJlIEkgdW5kZXJzdGFuZCB3aHkgdGhlIGZyZWUKKwkJCSAqIGZ1bmN0aW9uIHNob3VsZCBnZXQgdGhyZWUgYXJndW1lbnRzLi4uCisJCQkgKiAtLSBSaWNoYXJkIExldml0dGUKKwkJCSAqLworCQkJc2tfTkFNRV9GVU5DU192YWx1ZShuYW1lX2Z1bmNzX3N0YWNrLAorCQkJCXJldC0+dHlwZSktPmZyZWVfZnVuYyhyZXQtPm5hbWUscmV0LT50eXBlLHJldC0+ZGF0YSk7CisJCQl9CisJCU9QRU5TU0xfZnJlZShyZXQpOworCQl9CisJZWxzZQorCQl7CisJCWlmIChsaF9PQkpfTkFNRV9lcnJvcihuYW1lc19saCkpCisJCQl7CisJCQkvKiBFUlJPUiAqLworCQkJcmV0dXJuKDApOworCQkJfQorCQl9CisJcmV0dXJuKDEpOworCX0KKworaW50IE9CSl9OQU1FX3JlbW92ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgdHlwZSkKKwl7CisJT0JKX05BTUUgb24sKnJldDsKKworCWlmIChuYW1lc19saCA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwl0eXBlJj0gfk9CSl9OQU1FX0FMSUFTOworCW9uLm5hbWU9bmFtZTsKKwlvbi50eXBlPXR5cGU7CisJcmV0PWxoX09CSl9OQU1FX2RlbGV0ZShuYW1lc19saCwmb24pOworCWlmIChyZXQgIT0gTlVMTCkKKwkJeworCQkvKiBmcmVlIHRoaW5ncyAqLworCQlpZiAoKG5hbWVfZnVuY3Nfc3RhY2sgIT0gTlVMTCkgJiYgKHNrX05BTUVfRlVOQ1NfbnVtKG5hbWVfZnVuY3Nfc3RhY2spID4gcmV0LT50eXBlKSkKKwkJCXsKKwkJCS8qIFhYWDogSSdtIG5vdCBzdXJlIEkgdW5kZXJzdGFuZCB3aHkgdGhlIGZyZWUKKwkJCSAqIGZ1bmN0aW9uIHNob3VsZCBnZXQgdGhyZWUgYXJndW1lbnRzLi4uCisJCQkgKiAtLSBSaWNoYXJkIExldml0dGUKKwkJCSAqLworCQkJc2tfTkFNRV9GVU5DU192YWx1ZShuYW1lX2Z1bmNzX3N0YWNrLAorCQkJCXJldC0+dHlwZSktPmZyZWVfZnVuYyhyZXQtPm5hbWUscmV0LT50eXBlLHJldC0+ZGF0YSk7CisJCQl9CisJCU9QRU5TU0xfZnJlZShyZXQpOworCQlyZXR1cm4oMSk7CisJCX0KKwllbHNlCisJCXJldHVybigwKTsKKwl9CisKK3N0cnVjdCBkb2FsbAorCXsKKwlpbnQgdHlwZTsKKwl2b2lkICgqZm4pKGNvbnN0IE9CSl9OQU1FICosdm9pZCAqYXJnKTsKKwl2b2lkICphcmc7CisJfTsKKworc3RhdGljIHZvaWQgZG9fYWxsX2ZuX2RvYWxsX2FyZyhjb25zdCBPQkpfTkFNRSAqbmFtZSxzdHJ1Y3QgZG9hbGwgKmQpCisJeworCWlmKG5hbWUtPnR5cGUgPT0gZC0+dHlwZSkKKwkJZC0+Zm4obmFtZSxkLT5hcmcpOworCX0KKworc3RhdGljIElNUExFTUVOVF9MSEFTSF9ET0FMTF9BUkdfRk4oZG9fYWxsX2ZuLCBjb25zdCBPQkpfTkFNRSwgc3RydWN0IGRvYWxsKQorCit2b2lkIE9CSl9OQU1FX2RvX2FsbChpbnQgdHlwZSx2b2lkICgqZm4pKGNvbnN0IE9CSl9OQU1FICosdm9pZCAqYXJnKSx2b2lkICphcmcpCisJeworCXN0cnVjdCBkb2FsbCBkOworCisJZC50eXBlPXR5cGU7CisJZC5mbj1mbjsKKwlkLmFyZz1hcmc7CisKKwlsaF9PQkpfTkFNRV9kb2FsbF9hcmcobmFtZXNfbGgsIExIQVNIX0RPQUxMX0FSR19GTihkb19hbGxfZm4pLAorCQkJICAgICAgc3RydWN0IGRvYWxsLCAmZCk7CisJfQorCitzdHJ1Y3QgZG9hbGxfc29ydGVkCisJeworCWludCB0eXBlOworCWludCBuOworCWNvbnN0IE9CSl9OQU1FICoqbmFtZXM7CisJfTsKKworc3RhdGljIHZvaWQgZG9fYWxsX3NvcnRlZF9mbihjb25zdCBPQkpfTkFNRSAqbmFtZSx2b2lkICpkXykKKwl7CisJc3RydWN0IGRvYWxsX3NvcnRlZCAqZD1kXzsKKworCWlmKG5hbWUtPnR5cGUgIT0gZC0+dHlwZSkKKwkJcmV0dXJuOworCisJZC0+bmFtZXNbZC0+bisrXT1uYW1lOworCX0KKworc3RhdGljIGludCBkb19hbGxfc29ydGVkX2NtcChjb25zdCB2b2lkICpuMV8sY29uc3Qgdm9pZCAqbjJfKQorCXsKKwljb25zdCBPQkpfTkFNRSAqIGNvbnN0ICpuMT1uMV87CisJY29uc3QgT0JKX05BTUUgKiBjb25zdCAqbjI9bjJfOworCisJcmV0dXJuIHN0cmNtcCgoKm4xKS0+bmFtZSwoKm4yKS0+bmFtZSk7CisJfQorCit2b2lkIE9CSl9OQU1FX2RvX2FsbF9zb3J0ZWQoaW50IHR5cGUsdm9pZCAoKmZuKShjb25zdCBPQkpfTkFNRSAqLHZvaWQgKmFyZyksCisJCQkJdm9pZCAqYXJnKQorCXsKKwlzdHJ1Y3QgZG9hbGxfc29ydGVkIGQ7CisJaW50IG47CisKKwlkLnR5cGU9dHlwZTsKKwlkLm5hbWVzPU9QRU5TU0xfbWFsbG9jKGxoX09CSl9OQU1FX251bV9pdGVtcyhuYW1lc19saCkqc2l6ZW9mICpkLm5hbWVzKTsKKwlkLm49MDsKKwlPQkpfTkFNRV9kb19hbGwodHlwZSxkb19hbGxfc29ydGVkX2ZuLCZkKTsKKworCXFzb3J0KCh2b2lkICopZC5uYW1lcyxkLm4sc2l6ZW9mICpkLm5hbWVzLGRvX2FsbF9zb3J0ZWRfY21wKTsKKworCWZvcihuPTAgOyBuIDwgZC5uIDsgKytuKQorCQlmbihkLm5hbWVzW25dLGFyZyk7CisKKwlPUEVOU1NMX2ZyZWUoKHZvaWQgKilkLm5hbWVzKTsKKwl9CisKK3N0YXRpYyBpbnQgZnJlZV90eXBlOworCitzdGF0aWMgdm9pZCBuYW1lc19saF9mcmVlX2RvYWxsKE9CSl9OQU1FICpvbnApCisJeworCWlmIChvbnAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGZyZWVfdHlwZSA8IDAgfHwgZnJlZV90eXBlID09IG9ucC0+dHlwZSkKKwkJT0JKX05BTUVfcmVtb3ZlKG9ucC0+bmFtZSxvbnAtPnR5cGUpOworCX0KKworc3RhdGljIElNUExFTUVOVF9MSEFTSF9ET0FMTF9GTihuYW1lc19saF9mcmVlLCBPQkpfTkFNRSkKKworc3RhdGljIHZvaWQgbmFtZV9mdW5jc19mcmVlKE5BTUVfRlVOQ1MgKnB0cikKKwl7CisJT1BFTlNTTF9mcmVlKHB0cik7CisJfQorCit2b2lkIE9CSl9OQU1FX2NsZWFudXAoaW50IHR5cGUpCisJeworCXVuc2lnbmVkIGxvbmcgZG93bl9sb2FkOworCisJaWYgKG5hbWVzX2xoID09IE5VTEwpIHJldHVybjsKKworCWZyZWVfdHlwZT10eXBlOworCWRvd25fbG9hZD1saF9PQkpfTkFNRV9kb3duX2xvYWQobmFtZXNfbGgpOworCWxoX09CSl9OQU1FX2Rvd25fbG9hZChuYW1lc19saCk9MDsKKworCWxoX09CSl9OQU1FX2RvYWxsKG5hbWVzX2xoLExIQVNIX0RPQUxMX0ZOKG5hbWVzX2xoX2ZyZWUpKTsKKwlpZiAodHlwZSA8IDApCisJCXsKKwkJbGhfT0JKX05BTUVfZnJlZShuYW1lc19saCk7CisJCXNrX05BTUVfRlVOQ1NfcG9wX2ZyZWUobmFtZV9mdW5jc19zdGFjayxuYW1lX2Z1bmNzX2ZyZWUpOworCQluYW1lc19saD1OVUxMOworCQluYW1lX2Z1bmNzX3N0YWNrID0gTlVMTDsKKwkJfQorCWVsc2UKKwkJbGhfT0JKX05BTUVfZG93bl9sb2FkKG5hbWVzX2xoKT1kb3duX2xvYWQ7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfZGF0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfZGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzNDJiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ial9kYXQuYwpAQCAtMCwwICsxLDgxMCBAQAorLyogY3J5cHRvL29iamVjdHMvb2JqX2RhdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisvKiBvYmpfZGF0LmggaXMgZ2VuZXJhdGVkIGZyb20gb2JqZWN0cy5oIGJ5IG9ial9kYXQucGwgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19PQkpFQ1QKKyNpbmNsdWRlICJvYmpfZGF0LmgiCisjZWxzZQorLyogWW91IHdpbGwgaGF2ZSB0byBsb2FkIGFsbCB0aGUgb2JqZWN0cyBuZWVkZWQgbWFudWFsbHkgaW4gdGhlIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIE5VTV9OSUQgMAorI2RlZmluZSBOVU1fU04gMAorI2RlZmluZSBOVU1fTE4gMAorI2RlZmluZSBOVU1fT0JKIDAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGx2YWx1ZXNbMV07CitzdGF0aWMgY29uc3QgQVNOMV9PQkpFQ1QgbmlkX29ianNbMV07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNuX29ianNbMV07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxuX29ianNbMV07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG9ial9vYmpzWzFdOworI2VuZGlmCisKK0RFQ0xBUkVfT0JKX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IEFTTjFfT0JKRUNUICosIHVuc2lnbmVkIGludCwgc24pOworREVDTEFSRV9PQkpfQlNFQVJDSF9DTVBfRk4oY29uc3QgQVNOMV9PQkpFQ1QgKiwgdW5zaWduZWQgaW50LCBsbik7CitERUNMQVJFX09CSl9CU0VBUkNIX0NNUF9GTihjb25zdCBBU04xX09CSkVDVCAqLCB1bnNpZ25lZCBpbnQsIG9iaik7CisKKyNkZWZpbmUgQURERURfREFUQQkwCisjZGVmaW5lIEFEREVEX1NOQU1FCTEKKyNkZWZpbmUgQURERURfTE5BTUUJMgorI2RlZmluZSBBRERFRF9OSUQJMworCit0eXBlZGVmIHN0cnVjdCBhZGRlZF9vYmpfc3QKKwl7CisJaW50IHR5cGU7CisJQVNOMV9PQkpFQ1QgKm9iajsKKwl9IEFEREVEX09CSjsKK0RFQ0xBUkVfTEhBU0hfT0YoQURERURfT0JKKTsKKworc3RhdGljIGludCBuZXdfbmlkPU5VTV9OSUQ7CitzdGF0aWMgTEhBU0hfT0YoQURERURfT0JKKSAqYWRkZWQ9TlVMTDsKKworc3RhdGljIGludCBzbl9jbXAoY29uc3QgQVNOMV9PQkpFQ1QgKiBjb25zdCAqYSwgY29uc3QgdW5zaWduZWQgaW50ICpiKQorCXsgcmV0dXJuKHN0cmNtcCgoKmEpLT5zbixuaWRfb2Jqc1sqYl0uc24pKTsgfQorCitJTVBMRU1FTlRfT0JKX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IEFTTjFfT0JKRUNUICosIHVuc2lnbmVkIGludCwgc24pOworCitzdGF0aWMgaW50IGxuX2NtcChjb25zdCBBU04xX09CSkVDVCAqIGNvbnN0ICphLCBjb25zdCB1bnNpZ25lZCBpbnQgKmIpCisJeyByZXR1cm4oc3RyY21wKCgqYSktPmxuLG5pZF9vYmpzWypiXS5sbikpOyB9CisKK0lNUExFTUVOVF9PQkpfQlNFQVJDSF9DTVBfRk4oY29uc3QgQVNOMV9PQkpFQ1QgKiwgdW5zaWduZWQgaW50LCBsbik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFkZGVkX29ial9oYXNoKGNvbnN0IEFEREVEX09CSiAqY2EpCisJeworCWNvbnN0IEFTTjFfT0JKRUNUICphOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgcmV0PTA7CisJdW5zaWduZWQgY2hhciAqcDsKKworCWE9Y2EtPm9iajsKKwlzd2l0Y2ggKGNhLT50eXBlKQorCQl7CisJY2FzZSBBRERFRF9EQVRBOgorCQlyZXQ9YS0+bGVuZ3RoPDwyMEw7CisJCXA9KHVuc2lnbmVkIGNoYXIgKilhLT5kYXRhOworCQlmb3IgKGk9MDsgaTxhLT5sZW5ndGg7IGkrKykKKwkJCXJldF49cFtpXTw8KChpKjMpJTI0KTsKKwkJYnJlYWs7CisJY2FzZSBBRERFRF9TTkFNRToKKwkJcmV0PWxoX3N0cmhhc2goYS0+c24pOworCQlicmVhazsKKwljYXNlIEFEREVEX0xOQU1FOgorCQlyZXQ9bGhfc3RyaGFzaChhLT5sbik7CisJCWJyZWFrOworCWNhc2UgQURERURfTklEOgorCQlyZXQ9YS0+bmlkOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBhYm9ydCgpOyAqLworCQlyZXR1cm4gMDsKKwkJfQorCXJldCY9MHgzZmZmZmZmZkw7CisJcmV0fD1jYS0+dHlwZTw8MzBMOworCXJldHVybihyZXQpOworCX0KK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfSEFTSF9GTihhZGRlZF9vYmosIEFEREVEX09CSikKKworc3RhdGljIGludCBhZGRlZF9vYmpfY21wKGNvbnN0IEFEREVEX09CSiAqY2EsIGNvbnN0IEFEREVEX09CSiAqY2IpCisJeworCUFTTjFfT0JKRUNUICphLCpiOworCWludCBpOworCisJaT1jYS0+dHlwZS1jYi0+dHlwZTsKKwlpZiAoaSkgcmV0dXJuKGkpOworCWE9Y2EtPm9iajsKKwliPWNiLT5vYmo7CisJc3dpdGNoIChjYS0+dHlwZSkKKwkJeworCWNhc2UgQURERURfREFUQToKKwkJaT0oYS0+bGVuZ3RoIC0gYi0+bGVuZ3RoKTsKKwkJaWYgKGkpIHJldHVybihpKTsKKwkJcmV0dXJuKG1lbWNtcChhLT5kYXRhLGItPmRhdGEsKHNpemVfdClhLT5sZW5ndGgpKTsKKwljYXNlIEFEREVEX1NOQU1FOgorCQlpZiAoYS0+c24gPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwkJZWxzZSBpZiAoYi0+c24gPT0gTlVMTCkgcmV0dXJuKDEpOworCQllbHNlIHJldHVybihzdHJjbXAoYS0+c24sYi0+c24pKTsKKwljYXNlIEFEREVEX0xOQU1FOgorCQlpZiAoYS0+bG4gPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwkJZWxzZSBpZiAoYi0+bG4gPT0gTlVMTCkgcmV0dXJuKDEpOworCQllbHNlIHJldHVybihzdHJjbXAoYS0+bG4sYi0+bG4pKTsKKwljYXNlIEFEREVEX05JRDoKKwkJcmV0dXJuKGEtPm5pZC1iLT5uaWQpOworCWRlZmF1bHQ6CisJCS8qIGFib3J0KCk7ICovCisJCXJldHVybiAwOworCQl9CisJfQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9DT01QX0ZOKGFkZGVkX29iaiwgQURERURfT0JKKQorCitzdGF0aWMgaW50IGluaXRfYWRkZWQodm9pZCkKKwl7CisJaWYgKGFkZGVkICE9IE5VTEwpIHJldHVybigxKTsKKwlhZGRlZD1saF9BRERFRF9PQkpfbmV3KCk7CisJcmV0dXJuKGFkZGVkICE9IE5VTEwpOworCX0KKworc3RhdGljIHZvaWQgY2xlYW51cDFfZG9hbGwoQURERURfT0JKICphKQorCXsKKwlhLT5vYmotPm5pZD0wOworCWEtPm9iai0+ZmxhZ3N8PUFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQ3wKKwkgICAgICAgICAgICAgICAgQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX1NUUklOR1N8CisJCQlBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfREFUQTsKKwl9CisKK3N0YXRpYyB2b2lkIGNsZWFudXAyX2RvYWxsKEFEREVEX09CSiAqYSkKKwl7IGEtPm9iai0+bmlkKys7IH0KKworc3RhdGljIHZvaWQgY2xlYW51cDNfZG9hbGwoQURERURfT0JKICphKQorCXsKKwlpZiAoLS1hLT5vYmotPm5pZCA9PSAwKQorCQlBU04xX09CSkVDVF9mcmVlKGEtPm9iaik7CisJT1BFTlNTTF9mcmVlKGEpOworCX0KKworc3RhdGljIElNUExFTUVOVF9MSEFTSF9ET0FMTF9GTihjbGVhbnVwMSwgQURERURfT0JKKQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9ET0FMTF9GTihjbGVhbnVwMiwgQURERURfT0JKKQorc3RhdGljIElNUExFTUVOVF9MSEFTSF9ET0FMTF9GTihjbGVhbnVwMywgQURERURfT0JKKQorCisvKiBUaGUgcHVycG9zZSBvZiBvYmpfY2xlYW51cF9kZWZlciBpcyB0byBhdm9pZCBFVlBfY2xlYW51cCgpIGF0dGVtcHRpbmcKKyAqIHRvIHVzZSBmcmVlZCB1cCBPSURzLiBJZiBuZWNjZXNzYXJ5IHRoZSBhY3R1YWwgZnJlZWluZyB1cCBvZiBPSURzIGlzCisgKiBkZWxheWVkLgorICovCisKK2ludCBvYmpfY2xlYW51cF9kZWZlciA9IDA7CisKK3ZvaWQgY2hlY2tfZGVmZXIoaW50IG5pZCkKKwl7CisJaWYgKCFvYmpfY2xlYW51cF9kZWZlciAmJiBuaWQgPj0gTlVNX05JRCkKKwkJCW9ial9jbGVhbnVwX2RlZmVyID0gMTsKKwl9CisKK3ZvaWQgT0JKX2NsZWFudXAodm9pZCkKKwl7CisJaWYgKG9ial9jbGVhbnVwX2RlZmVyKQorCQl7CisJCW9ial9jbGVhbnVwX2RlZmVyID0gMjsKKwkJcmV0dXJuIDsKKwkJfQorCWlmIChhZGRlZCA9PSBOVUxMKSByZXR1cm47CisJbGhfQURERURfT0JKX2Rvd25fbG9hZChhZGRlZCkgPSAwOworCWxoX0FEREVEX09CSl9kb2FsbChhZGRlZCxMSEFTSF9ET0FMTF9GTihjbGVhbnVwMSkpOyAvKiB6ZXJvIGNvdW50ZXJzICovCisJbGhfQURERURfT0JKX2RvYWxsKGFkZGVkLExIQVNIX0RPQUxMX0ZOKGNsZWFudXAyKSk7IC8qIHNldCBjb3VudGVycyAqLworCWxoX0FEREVEX09CSl9kb2FsbChhZGRlZCxMSEFTSF9ET0FMTF9GTihjbGVhbnVwMykpOyAvKiBmcmVlIG9iamVjdHMgKi8KKwlsaF9BRERFRF9PQkpfZnJlZShhZGRlZCk7CisJYWRkZWQ9TlVMTDsKKwl9CisKK2ludCBPQkpfbmV3X25pZChpbnQgbnVtKQorCXsKKwlpbnQgaTsKKworCWk9bmV3X25pZDsKKwluZXdfbmlkKz1udW07CisJcmV0dXJuKGkpOworCX0KKworaW50IE9CSl9hZGRfb2JqZWN0KGNvbnN0IEFTTjFfT0JKRUNUICpvYmopCisJeworCUFTTjFfT0JKRUNUICpvOworCUFEREVEX09CSiAqYW9bNF09e05VTEwsTlVMTCxOVUxMLE5VTEx9LCphb3A7CisJaW50IGk7CisKKwlpZiAoYWRkZWQgPT0gTlVMTCkKKwkJaWYgKCFpbml0X2FkZGVkKCkpIHJldHVybigwKTsKKwlpZiAoKG89T0JKX2R1cChvYmopKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoIShhb1tBRERFRF9OSURdPShBRERFRF9PQkogKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQURERURfT0JKKSkpKSBnb3RvIGVycjI7CisJaWYgKChvLT5sZW5ndGggIT0gMCkgJiYgKG9iai0+ZGF0YSAhPSBOVUxMKSkKKwkJaWYgKCEoYW9bQURERURfREFUQV09KEFEREVEX09CSiAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihBRERFRF9PQkopKSkpIGdvdG8gZXJyMjsKKwlpZiAoby0+c24gIT0gTlVMTCkKKwkJaWYgKCEoYW9bQURERURfU05BTUVdPShBRERFRF9PQkogKilPUEVOU1NMX21hbGxvYyhzaXplb2YoQURERURfT0JKKSkpKSBnb3RvIGVycjI7CisJaWYgKG8tPmxuICE9IE5VTEwpCisJCWlmICghKGFvW0FEREVEX0xOQU1FXT0oQURERURfT0JKICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEFEREVEX09CSikpKSkgZ290byBlcnIyOworCisJZm9yIChpPUFEREVEX0RBVEE7IGk8PUFEREVEX05JRDsgaSsrKQorCQl7CisJCWlmIChhb1tpXSAhPSBOVUxMKQorCQkJeworCQkJYW9baV0tPnR5cGU9aTsKKwkJCWFvW2ldLT5vYmo9bzsKKwkJCWFvcD1saF9BRERFRF9PQkpfaW5zZXJ0KGFkZGVkLGFvW2ldKTsKKwkJCS8qIG1lbW9yeSBsZWFrLCBidWl0IHNob3VsZCBub3Qgbm9ybWFsbHkgbWF0dGVyICovCisJCQlpZiAoYW9wICE9IE5VTEwpCisJCQkJT1BFTlNTTF9mcmVlKGFvcCk7CisJCQl9CisJCX0KKwlvLT5mbGFncyY9IH4oQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDfEFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQ19TVFJJTkdTfAorCQkJQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX0RBVEEpOworCisJcmV0dXJuKG8tPm5pZCk7CitlcnIyOgorCU9CSmVycihPQkpfRl9PQkpfQUREX09CSkVDVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CitlcnI6CisJZm9yIChpPUFEREVEX0RBVEE7IGk8PUFEREVEX05JRDsgaSsrKQorCQlpZiAoYW9baV0gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGFvW2ldKTsKKwlpZiAobyAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUobyk7CisJcmV0dXJuKE5JRF91bmRlZik7CisJfQorCitBU04xX09CSkVDVCAqT0JKX25pZDJvYmooaW50IG4pCisJeworCUFEREVEX09CSiBhZCwqYWRwOworCUFTTjFfT0JKRUNUIG9iOworCisJaWYgKChuID49IDApICYmIChuIDwgTlVNX05JRCkpCisJCXsKKwkJaWYgKChuICE9IE5JRF91bmRlZikgJiYgKG5pZF9vYmpzW25dLm5pZCA9PSBOSURfdW5kZWYpKQorCQkJeworCQkJT0JKZXJyKE9CSl9GX09CSl9OSUQyT0JKLE9CSl9SX1VOS05PV05fTklEKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJcmV0dXJuKChBU04xX09CSkVDVCAqKSYobmlkX29ianNbbl0pKTsKKwkJfQorCWVsc2UgaWYgKGFkZGVkID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKwllbHNlCisJCXsKKwkJYWQudHlwZT1BRERFRF9OSUQ7CisJCWFkLm9iaj0gJm9iOworCQlvYi5uaWQ9bjsKKwkJYWRwPWxoX0FEREVEX09CSl9yZXRyaWV2ZShhZGRlZCwmYWQpOworCQlpZiAoYWRwICE9IE5VTEwpCisJCQlyZXR1cm4oYWRwLT5vYmopOworCQllbHNlCisJCQl7CisJCQlPQkplcnIoT0JKX0ZfT0JKX05JRDJPQkosT0JKX1JfVU5LTk9XTl9OSUQpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQl9CisJfQorCitjb25zdCBjaGFyICpPQkpfbmlkMnNuKGludCBuKQorCXsKKwlBRERFRF9PQkogYWQsKmFkcDsKKwlBU04xX09CSkVDVCBvYjsKKworCWlmICgobiA+PSAwKSAmJiAobiA8IE5VTV9OSUQpKQorCQl7CisJCWlmICgobiAhPSBOSURfdW5kZWYpICYmIChuaWRfb2Jqc1tuXS5uaWQgPT0gTklEX3VuZGVmKSkKKwkJCXsKKwkJCU9CSmVycihPQkpfRl9PQkpfTklEMlNOLE9CSl9SX1VOS05PV05fTklEKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJcmV0dXJuKG5pZF9vYmpzW25dLnNuKTsKKwkJfQorCWVsc2UgaWYgKGFkZGVkID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKwllbHNlCisJCXsKKwkJYWQudHlwZT1BRERFRF9OSUQ7CisJCWFkLm9iaj0gJm9iOworCQlvYi5uaWQ9bjsKKwkJYWRwPWxoX0FEREVEX09CSl9yZXRyaWV2ZShhZGRlZCwmYWQpOworCQlpZiAoYWRwICE9IE5VTEwpCisJCQlyZXR1cm4oYWRwLT5vYmotPnNuKTsKKwkJZWxzZQorCQkJeworCQkJT0JKZXJyKE9CSl9GX09CSl9OSUQyU04sT0JKX1JfVU5LTk9XTl9OSUQpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQl9CisJfQorCitjb25zdCBjaGFyICpPQkpfbmlkMmxuKGludCBuKQorCXsKKwlBRERFRF9PQkogYWQsKmFkcDsKKwlBU04xX09CSkVDVCBvYjsKKworCWlmICgobiA+PSAwKSAmJiAobiA8IE5VTV9OSUQpKQorCQl7CisJCWlmICgobiAhPSBOSURfdW5kZWYpICYmIChuaWRfb2Jqc1tuXS5uaWQgPT0gTklEX3VuZGVmKSkKKwkJCXsKKwkJCU9CSmVycihPQkpfRl9PQkpfTklEMkxOLE9CSl9SX1VOS05PV05fTklEKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJcmV0dXJuKG5pZF9vYmpzW25dLmxuKTsKKwkJfQorCWVsc2UgaWYgKGFkZGVkID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKwllbHNlCisJCXsKKwkJYWQudHlwZT1BRERFRF9OSUQ7CisJCWFkLm9iaj0gJm9iOworCQlvYi5uaWQ9bjsKKwkJYWRwPWxoX0FEREVEX09CSl9yZXRyaWV2ZShhZGRlZCwmYWQpOworCQlpZiAoYWRwICE9IE5VTEwpCisJCQlyZXR1cm4oYWRwLT5vYmotPmxuKTsKKwkJZWxzZQorCQkJeworCQkJT0JKZXJyKE9CSl9GX09CSl9OSUQyTE4sT0JKX1JfVU5LTk9XTl9OSUQpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQl9CisJfQorCitzdGF0aWMgaW50IG9ial9jbXAoY29uc3QgQVNOMV9PQkpFQ1QgKiBjb25zdCAqYXAsIGNvbnN0IHVuc2lnbmVkIGludCAqYnApCisJeworCWludCBqOworCWNvbnN0IEFTTjFfT0JKRUNUICphPSAqYXA7CisJY29uc3QgQVNOMV9PQkpFQ1QgKmI9ICZuaWRfb2Jqc1sqYnBdOworCisJaj0oYS0+bGVuZ3RoIC0gYi0+bGVuZ3RoKTsKKyAgICAgICAgaWYgKGopIHJldHVybihqKTsKKwlyZXR1cm4obWVtY21wKGEtPmRhdGEsYi0+ZGF0YSxhLT5sZW5ndGgpKTsKKwl9CisKK0lNUExFTUVOVF9PQkpfQlNFQVJDSF9DTVBfRk4oY29uc3QgQVNOMV9PQkpFQ1QgKiwgdW5zaWduZWQgaW50LCBvYmopOworCitpbnQgT0JKX29iajJuaWQoY29uc3QgQVNOMV9PQkpFQ1QgKmEpCisJeworCWNvbnN0IHVuc2lnbmVkIGludCAqb3A7CisJQURERURfT0JKIGFkLCphZHA7CisKKwlpZiAoYSA9PSBOVUxMKQorCQlyZXR1cm4oTklEX3VuZGVmKTsKKwlpZiAoYS0+bmlkICE9IDApCisJCXJldHVybihhLT5uaWQpOworCisJaWYgKGFkZGVkICE9IE5VTEwpCisJCXsKKwkJYWQudHlwZT1BRERFRF9EQVRBOworCQlhZC5vYmo9KEFTTjFfT0JKRUNUICopYTsgLyogWFhYOiB1Z2x5IGJ1dCBoYXJtbGVzcyAqLworCQlhZHA9bGhfQURERURfT0JKX3JldHJpZXZlKGFkZGVkLCZhZCk7CisJCWlmIChhZHAgIT0gTlVMTCkgcmV0dXJuIChhZHAtPm9iai0+bmlkKTsKKwkJfQorCW9wPU9CSl9ic2VhcmNoX29iaigmYSwgb2JqX29ianMsIE5VTV9PQkopOworCWlmIChvcCA9PSBOVUxMKQorCQlyZXR1cm4oTklEX3VuZGVmKTsKKwlyZXR1cm4obmlkX29ianNbKm9wXS5uaWQpOworCX0KKworLyogQ29udmVydCBhbiBvYmplY3QgbmFtZSBpbnRvIGFuIEFTTjFfT0JKRUNUCisgKiBpZiAibm9uYW1lIiBpcyBub3Qgc2V0IHRoZW4gc2VhcmNoIGZvciBzaG9ydCBhbmQgbG9uZyBuYW1lcyBmaXJzdC4KKyAqIFRoaXMgd2lsbCBjb252ZXJ0IHRoZSAiZG90dGVkIiBmb3JtIGludG8gYW4gb2JqZWN0OiB1bmxpa2UgT0JKX3R4dDJuaWQKKyAqIGl0IGNhbiBiZSB1c2VkIHdpdGggYW55IG9iamVjdHMsIG5vdCBqdXN0IHJlZ2lzdGVyZWQgb25lcy4KKyAqLworCitBU04xX09CSkVDVCAqT0JKX3R4dDJvYmooY29uc3QgY2hhciAqcywgaW50IG5vX25hbWUpCisJeworCWludCBuaWQgPSBOSURfdW5kZWY7CisJQVNOMV9PQkpFQ1QgKm9wPU5VTEw7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY3A7CisJaW50IGksIGo7CisKKwlpZighbm9fbmFtZSkgeworCQlpZiggKChuaWQgPSBPQkpfc24ybmlkKHMpKSAhPSBOSURfdW5kZWYpIHx8CisJCQkoKG5pZCA9IE9CSl9sbjJuaWQocykpICE9IE5JRF91bmRlZikgKSAKKwkJCQkJcmV0dXJuIE9CSl9uaWQyb2JqKG5pZCk7CisJfQorCisJLyogV29yayBvdXQgc2l6ZSBvZiBjb250ZW50IG9jdGV0cyAqLworCWk9YTJkX0FTTjFfT0JKRUNUKE5VTEwsMCxzLC0xKTsKKwlpZiAoaSA8PSAwKSB7CisJCS8qIERvbid0IGNsZWFyIHRoZSBlcnJvciAqLworCQkvKkVSUl9jbGVhcl9lcnJvcigpOyovCisJCXJldHVybiBOVUxMOworCX0KKwkvKiBXb3JrIG91dCB0b3RhbCBzaXplICovCisJaiA9IEFTTjFfb2JqZWN0X3NpemUoMCxpLFZfQVNOMV9PQkpFQ1QpOworCisJaWYoKGJ1Zj0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGopKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworCXAgPSBidWY7CisJLyogV3JpdGUgb3V0IHRhZytsZW5ndGggKi8KKwlBU04xX3B1dF9vYmplY3QoJnAsMCxpLFZfQVNOMV9PQkpFQ1QsVl9BU04xX1VOSVZFUlNBTCk7CisJLyogV3JpdGUgb3V0IGNvbnRlbnRzICovCisJYTJkX0FTTjFfT0JKRUNUKHAsaSxzLC0xKTsKKworCWNwPWJ1ZjsKKwlvcD1kMmlfQVNOMV9PQkpFQ1QoTlVMTCwmY3Asaik7CisJT1BFTlNTTF9mcmVlKGJ1Zik7CisJcmV0dXJuIG9wOworCX0KKworaW50IE9CSl9vYmoydHh0KGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGNvbnN0IEFTTjFfT0JKRUNUICphLCBpbnQgbm9fbmFtZSkKK3sKKwlpbnQgaSxuPTAsbGVuLG5pZCwgZmlyc3QsIHVzZV9ibjsKKwlCSUdOVU0gKmJsOworCXVuc2lnbmVkIGxvbmcgbDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCWNoYXIgdGJ1ZltERUNJTUFMX1NJWkUoaSkrREVDSU1BTF9TSVpFKGwpKzJdOworCisJaWYgKChhID09IE5VTEwpIHx8IChhLT5kYXRhID09IE5VTEwpKSB7CisJCWJ1ZlswXT0nXDAnOworCQlyZXR1cm4oMCk7CisJfQorCisKKwlpZiAoIW5vX25hbWUgJiYgKG5pZD1PQkpfb2JqMm5pZChhKSkgIT0gTklEX3VuZGVmKQorCQl7CisJCWNvbnN0IGNoYXIgKnM7CisJCXM9T0JKX25pZDJsbihuaWQpOworCQlpZiAocyA9PSBOVUxMKQorCQkJcz1PQkpfbmlkMnNuKG5pZCk7CisJCWlmIChzKQorCQkJeworCQkJaWYgKGJ1ZikKKwkJCQlCVUZfc3RybGNweShidWYscyxidWZfbGVuKTsKKwkJCW49c3RybGVuKHMpOworCQkJcmV0dXJuIG47CisJCQl9CisJCX0KKworCisJbGVuPWEtPmxlbmd0aDsKKwlwPWEtPmRhdGE7CisKKwlmaXJzdCA9IDE7CisJYmwgPSBOVUxMOworCisJd2hpbGUgKGxlbiA+IDApCisJCXsKKwkJbD0wOworCQl1c2VfYm4gPSAwOworCQlmb3IgKDs7KQorCQkJeworCQkJdW5zaWduZWQgY2hhciBjID0gKnArKzsKKwkJCWxlbi0tOworCQkJaWYgKChsZW4gPT0gMCkgJiYgKGMgJiAweDgwKSkKKwkJCQlnb3RvIGVycjsKKwkJCWlmICh1c2VfYm4pCisJCQkJeworCQkJCWlmICghQk5fYWRkX3dvcmQoYmwsIGMgJiAweDdmKSkKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCWwgfD0gYyAgJiAweDdmOworCQkJaWYgKCEoYyAmIDB4ODApKQorCQkJCWJyZWFrOworCQkJaWYgKCF1c2VfYm4gJiYgKGwgPiAoVUxPTkdfTUFYID4+IDdMKSkpCisJCQkJeworCQkJCWlmICghYmwgJiYgIShibCA9IEJOX25ldygpKSkKKwkJCQkJZ290byBlcnI7CisJCQkJaWYgKCFCTl9zZXRfd29yZChibCwgbCkpCisJCQkJCWdvdG8gZXJyOworCQkJCXVzZV9ibiA9IDE7CisJCQkJfQorCQkJaWYgKHVzZV9ibikKKwkJCQl7CisJCQkJaWYgKCFCTl9sc2hpZnQoYmwsIGJsLCA3KSkKKwkJCQkJZ290byBlcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCWw8PD03TDsKKwkJCX0KKworCQlpZiAoZmlyc3QpCisJCQl7CisJCQlmaXJzdCA9IDA7CisJCQlpZiAobCA+PSA4MCkKKwkJCQl7CisJCQkJaSA9IDI7CisJCQkJaWYgKHVzZV9ibikKKwkJCQkJeworCQkJCQlpZiAoIUJOX3N1Yl93b3JkKGJsLCA4MCkpCisJCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJbCAtPSA4MDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWk9KGludCkobC80MCk7CisJCQkJbC09KGxvbmcpKGkqNDApOworCQkJCX0KKwkJCWlmIChidWYgJiYgKGJ1Zl9sZW4gPiAwKSkKKwkJCQl7CisJCQkJKmJ1ZisrID0gaSArICcwJzsKKwkJCQlidWZfbGVuLS07CisJCQkJfQorCQkJbisrOworCQkJfQorCisJCWlmICh1c2VfYm4pCisJCQl7CisJCQljaGFyICpibmRlYzsKKwkJCWJuZGVjID0gQk5fYm4yZGVjKGJsKTsKKwkJCWlmICghYm5kZWMpCisJCQkJZ290byBlcnI7CisJCQlpID0gc3RybGVuKGJuZGVjKTsKKwkJCWlmIChidWYpCisJCQkJeworCQkJCWlmIChidWZfbGVuID4gMCkKKwkJCQkJeworCQkJCQkqYnVmKysgPSAnLic7CisJCQkJCWJ1Zl9sZW4tLTsKKwkJCQkJfQorCQkJCUJVRl9zdHJsY3B5KGJ1ZixibmRlYyxidWZfbGVuKTsKKwkJCQlpZiAoaSA+IGJ1Zl9sZW4pCisJCQkJCXsKKwkJCQkJYnVmICs9IGJ1Zl9sZW47CisJCQkJCWJ1Zl9sZW4gPSAwOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWJ1Zis9aTsKKwkJCQkJYnVmX2xlbi09aTsKKwkJCQkJfQorCQkJCX0KKwkJCW4rKzsKKwkJCW4gKz0gaTsKKwkJCU9QRU5TU0xfZnJlZShibmRlYyk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUJJT19zbnByaW50Zih0YnVmLHNpemVvZiB0YnVmLCIuJWx1IixsKTsKKwkJCWk9c3RybGVuKHRidWYpOworCQkJaWYgKGJ1ZiAmJiAoYnVmX2xlbiA+IDApKQorCQkJCXsKKwkJCQlCVUZfc3RybGNweShidWYsdGJ1ZixidWZfbGVuKTsKKwkJCQlpZiAoaSA+IGJ1Zl9sZW4pCisJCQkJCXsKKwkJCQkJYnVmICs9IGJ1Zl9sZW47CisJCQkJCWJ1Zl9sZW4gPSAwOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWJ1Zis9aTsKKwkJCQkJYnVmX2xlbi09aTsKKwkJCQkJfQorCQkJCX0KKwkJCW4rPWk7CisJCQlsPTA7CisJCQl9CisJCX0KKworCWlmIChibCkKKwkJQk5fZnJlZShibCk7CisJcmV0dXJuIG47CisKKwllcnI6CisJaWYgKGJsKQorCQlCTl9mcmVlKGJsKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBPQkpfdHh0Mm5pZChjb25zdCBjaGFyICpzKQoreworCUFTTjFfT0JKRUNUICpvYmo7CisJaW50IG5pZDsKKwlvYmogPSBPQkpfdHh0Mm9iaihzLCAwKTsKKwluaWQgPSBPQkpfb2JqMm5pZChvYmopOworCUFTTjFfT0JKRUNUX2ZyZWUob2JqKTsKKwlyZXR1cm4gbmlkOworfQorCitpbnQgT0JKX2xuMm5pZChjb25zdCBjaGFyICpzKQorCXsKKwlBU04xX09CSkVDVCBvOworCWNvbnN0IEFTTjFfT0JKRUNUICpvbz0gJm87CisJQURERURfT0JKIGFkLCphZHA7CisJY29uc3QgdW5zaWduZWQgaW50ICpvcDsKKworCW8ubG49czsKKwlpZiAoYWRkZWQgIT0gTlVMTCkKKwkJeworCQlhZC50eXBlPUFEREVEX0xOQU1FOworCQlhZC5vYmo9ICZvOworCQlhZHA9bGhfQURERURfT0JKX3JldHJpZXZlKGFkZGVkLCZhZCk7CisJCWlmIChhZHAgIT0gTlVMTCkgcmV0dXJuIChhZHAtPm9iai0+bmlkKTsKKwkJfQorCW9wPU9CSl9ic2VhcmNoX2xuKCZvbywgbG5fb2JqcywgTlVNX0xOKTsKKwlpZiAob3AgPT0gTlVMTCkgcmV0dXJuKE5JRF91bmRlZik7CisJcmV0dXJuKG5pZF9vYmpzWypvcF0ubmlkKTsKKwl9CisKK2ludCBPQkpfc24ybmlkKGNvbnN0IGNoYXIgKnMpCisJeworCUFTTjFfT0JKRUNUIG87CisJY29uc3QgQVNOMV9PQkpFQ1QgKm9vPSAmbzsKKwlBRERFRF9PQkogYWQsKmFkcDsKKwljb25zdCB1bnNpZ25lZCBpbnQgKm9wOworCisJby5zbj1zOworCWlmIChhZGRlZCAhPSBOVUxMKQorCQl7CisJCWFkLnR5cGU9QURERURfU05BTUU7CisJCWFkLm9iaj0gJm87CisJCWFkcD1saF9BRERFRF9PQkpfcmV0cmlldmUoYWRkZWQsJmFkKTsKKwkJaWYgKGFkcCAhPSBOVUxMKSByZXR1cm4gKGFkcC0+b2JqLT5uaWQpOworCQl9CisJb3A9T0JKX2JzZWFyY2hfc24oJm9vLCBzbl9vYmpzLCBOVU1fU04pOworCWlmIChvcCA9PSBOVUxMKSByZXR1cm4oTklEX3VuZGVmKTsKKwlyZXR1cm4obmlkX29ianNbKm9wXS5uaWQpOworCX0KKworY29uc3Qgdm9pZCAqT0JKX2JzZWFyY2hfKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqYmFzZSwgaW50IG51bSwgaW50IHNpemUsCisJCQkgaW50ICgqY21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpCisJeworCXJldHVybiBPQkpfYnNlYXJjaF9leF8oa2V5LCBiYXNlLCBudW0sIHNpemUsIGNtcCwgMCk7CisJfQorCitjb25zdCB2b2lkICpPQkpfYnNlYXJjaF9leF8oY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICpiYXNlXywgaW50IG51bSwKKwkJCSAgICBpbnQgc2l6ZSwKKwkJCSAgICBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSwKKwkJCSAgICBpbnQgZmxhZ3MpCisJeworCWNvbnN0IGNoYXIgKmJhc2U9YmFzZV87CisJaW50IGwsaCxpPTAsYz0wOworCWNvbnN0IGNoYXIgKnAgPSBOVUxMOworCisJaWYgKG51bSA9PSAwKSByZXR1cm4oTlVMTCk7CisJbD0wOworCWg9bnVtOworCXdoaWxlIChsIDwgaCkKKwkJeworCQlpPShsK2gpLzI7CisJCXA9ICYoYmFzZVtpKnNpemVdKTsKKwkJYz0oKmNtcCkoa2V5LHApOworCQlpZiAoYyA8IDApCisJCQloPWk7CisJCWVsc2UgaWYgKGMgPiAwKQorCQkJbD1pKzE7CisJCWVsc2UKKwkJCWJyZWFrOworCQl9CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKy8qIFRISVMgSVMgQSBLTFVER0UgLSBCZWNhdXNlIHRoZSAqX29iaiBpcyBzb3J0ZWQgaW4gQVNDSUkgb3JkZXIsIGFuZAorICogSSBkb24ndCBoYXZlIHBlcmwgKHlldCksIHdlIHJldmVydCB0byBhICpMSU5FQVIqIHNlYXJjaAorICogd2hlbiB0aGUgb2JqZWN0IHdhc24ndCBmb3VuZCBpbiB0aGUgYmluYXJ5IHNlYXJjaC4KKyAqLworCWlmIChjICE9IDApCisJCXsKKwkJZm9yIChpPTA7IGk8bnVtOyArK2kpCisJCQl7CisJCQlwPSAmKGJhc2VbaSpzaXplXSk7CisJCQljID0gKCpjbXApKGtleSxwKTsKKwkJCWlmIChjID09IDAgfHwgKGMgPCAwICYmIChmbGFncyAmIE9CSl9CU0VBUkNIX1ZBTFVFX09OX05PTUFUQ0gpKSkKKwkJCQlyZXR1cm4gcDsKKwkJCX0KKwkJfQorI2VuZGlmCisJaWYgKGMgIT0gMCAmJiAhKGZsYWdzICYgT0JKX0JTRUFSQ0hfVkFMVUVfT05fTk9NQVRDSCkpCisJCXAgPSBOVUxMOworCWVsc2UgaWYgKGMgPT0gMCAmJiAoZmxhZ3MgJiBPQkpfQlNFQVJDSF9GSVJTVF9WQUxVRV9PTl9NQVRDSCkpCisJCXsKKwkJd2hpbGUoaSA+IDAgJiYgKCpjbXApKGtleSwmKGJhc2VbKGktMSkqc2l6ZV0pKSA9PSAwKQorCQkJaS0tOworCQlwID0gJihiYXNlW2kqc2l6ZV0pOworCQl9CisJcmV0dXJuKHApOworCX0KKworaW50IE9CSl9jcmVhdGVfb2JqZWN0cyhCSU8gKmluKQorCXsKKwlNU19TVEFUSUMgY2hhciBidWZbNTEyXTsKKwlpbnQgaSxudW09MDsKKwljaGFyICpvLCpzLCpsPU5VTEw7CisKKwlmb3IgKDs7KQorCQl7CisJCXM9bz1OVUxMOworCQlpPUJJT19nZXRzKGluLGJ1Ziw1MTIpOworCQlpZiAoaSA8PSAwKSByZXR1cm4obnVtKTsKKwkJYnVmW2ktMV09J1wwJzsKKwkJaWYgKCFpc2FsbnVtKCh1bnNpZ25lZCBjaGFyKWJ1ZlswXSkpIHJldHVybihudW0pOworCQlvPXM9YnVmOworCQl3aGlsZSAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqcykgfHwgKCpzID09ICcuJykpCisJCQlzKys7CisJCWlmICgqcyAhPSAnXDAnKQorCQkJeworCQkJKihzKyspPSdcMCc7CisJCQl3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcykpCisJCQkJcysrOworCQkJaWYgKCpzID09ICdcMCcpCisJCQkJcz1OVUxMOworCQkJZWxzZQorCQkJCXsKKwkJCQlsPXM7CisJCQkJd2hpbGUgKCgqbCAhPSAnXDAnKSAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikqbCkpCisJCQkJCWwrKzsKKwkJCQlpZiAoKmwgIT0gJ1wwJykKKwkJCQkJeworCQkJCQkqKGwrKyk9J1wwJzsKKwkJCQkJd2hpbGUgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmwpKQorCQkJCQkJbCsrOworCQkJCQlpZiAoKmwgPT0gJ1wwJykgbD1OVUxMOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQlsPU5VTEw7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQlzPU5VTEw7CisJCWlmICgobyA9PSBOVUxMKSB8fCAoKm8gPT0gJ1wwJykpIHJldHVybihudW0pOworCQlpZiAoIU9CSl9jcmVhdGUobyxzLGwpKSByZXR1cm4obnVtKTsKKwkJbnVtKys7CisJCX0KKwkvKiByZXR1cm4obnVtKTsgKi8KKwl9CisKK2ludCBPQkpfY3JlYXRlKGNvbnN0IGNoYXIgKm9pZCwgY29uc3QgY2hhciAqc24sIGNvbnN0IGNoYXIgKmxuKQorCXsKKwlpbnQgb2s9MDsKKwlBU04xX09CSkVDVCAqb3A9TlVMTDsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJaW50IGk7CisKKwlpPWEyZF9BU04xX09CSkVDVChOVUxMLDAsb2lkLC0xKTsKKwlpZiAoaSA8PSAwKSByZXR1cm4oMCk7CisKKwlpZiAoKGJ1Zj0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGkpKSA9PSBOVUxMKQorCQl7CisJCU9CSmVycihPQkpfRl9PQkpfQ1JFQVRFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJaT1hMmRfQVNOMV9PQkpFQ1QoYnVmLGksb2lkLC0xKTsKKwlpZiAoaSA9PSAwKQorCQlnb3RvIGVycjsKKwlvcD0oQVNOMV9PQkpFQ1QgKilBU04xX09CSkVDVF9jcmVhdGUoT0JKX25ld19uaWQoMSksYnVmLGksc24sbG4pOworCWlmIChvcCA9PSBOVUxMKSAKKwkJZ290byBlcnI7CisJb2s9T0JKX2FkZF9vYmplY3Qob3ApOworZXJyOgorCUFTTjFfT0JKRUNUX2ZyZWUob3ApOworCU9QRU5TU0xfZnJlZShidWYpOworCXJldHVybihvayk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfZGF0LmggYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfZGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0OWJlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ial9kYXQuaApAQCAtMCwwICsxLDQ5NzYgQEAKKy8qIGNyeXB0by9vYmplY3RzL29ial9kYXQuaCAqLworCisvKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEZST00gb2JqZWN0cy5oIGJ5IG9ial9kYXQucGwgdmlhIHRoZQorICogZm9sbG93aW5nIGNvbW1hbmQ6CisgKiBwZXJsIG9ial9kYXQucGwgb2JqX21hYy5oIG9ial9kYXQuaAorICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2RlZmluZSBOVU1fTklEIDg5MworI2RlZmluZSBOVU1fU04gODg2CisjZGVmaW5lIE5VTV9MTiA4ODYKKyNkZWZpbmUgTlVNX09CSiA4NDAKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbHZhbHVlc1s1ODI0XT17CisweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbICAwXSBPQkpfdW5kZWYgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELCAgICAgICAgICAgICAgIC8qIFsgIDFdIE9CSl9yc2Fkc2kgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsICAgICAgICAgIC8qIFsgIDddIE9CSl9wa2NzICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAyLDB4MDIsICAgICAvKiBbIDE0XSBPQkpfbWQyICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAyLDB4MDUsICAgICAvKiBbIDIyXSBPQkpfbWQ1ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAzLDB4MDQsICAgICAvKiBbIDMwXSBPQkpfcmM0ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDEsMHgwMSwvKiBbIDM4XSBPQkpfcnNhRW5jcnlwdGlvbiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDAxLDB4MDIsLyogWyA0N10gT0JKX21kMldpdGhSU0FFbmNyeXB0aW9uICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDEsMHgwNCwvKiBbIDU2XSBPQkpfbWQ1V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDAxLC8qIFsgNjVdIE9CSl9wYmVXaXRoTUQyQW5kREVTX0NCQyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA1LDB4MDMsLyogWyA3NF0gT0JKX3BiZVdpdGhNRDVBbmRERVNfQ0JDICovCisweDU1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbIDgzXSBPQkpfWDUwMCAqLworMHg1NSwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWyA4NF0gT0JKX1g1MDkgKi8KKzB4NTUsMHgwNCwweDAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsgODZdIE9CSl9jb21tb25OYW1lICovCisweDU1LDB4MDQsMHgwNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbIDg5XSBPQkpfY291bnRyeU5hbWUgKi8KKzB4NTUsMHgwNCwweDA3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsgOTJdIE9CSl9sb2NhbGl0eU5hbWUgKi8KKzB4NTUsMHgwNCwweDA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsgOTVdIE9CSl9zdGF0ZU9yUHJvdmluY2VOYW1lICovCisweDU1LDB4MDQsMHgwQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbIDk4XSBPQkpfb3JnYW5pemF0aW9uTmFtZSAqLworMHg1NSwweDA0LDB4MEIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzEwMV0gT0JKX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUgKi8KKzB4NTUsMHgwOCwweDAxLDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsxMDRdIE9CSl9yc2EgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywgICAgIC8qIFsxMDhdIE9CSl9wa2NzNyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA3LDB4MDEsLyogWzExNl0gT0JKX3BrY3M3X2RhdGEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDAyLC8qIFsxMjVdIE9CSl9wa2NzN19zaWduZWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDAzLC8qIFsxMzRdIE9CSl9wa2NzN19lbnZlbG9wZWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDA0LC8qIFsxNDNdIE9CSl9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDA1LC8qIFsxNTJdIE9CSl9wa2NzN19kaWdlc3QgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNywweDA2LC8qIFsxNjFdIE9CSl9wa2NzN19lbmNyeXB0ZWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMywgICAgIC8qIFsxNzBdIE9CSl9wa2NzMyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDAzLDB4MDEsLyogWzE3OF0gT0JKX2RoS2V5QWdyZWVtZW50ICovCisweDJCLDB4MEUsMHgwMywweDAyLDB4MDYsICAgICAgICAgICAgICAgICAgICAvKiBbMTg3XSBPQkpfZGVzX2VjYiAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDA5LCAgICAgICAgICAgICAgICAgICAgLyogWzE5Ml0gT0JKX2Rlc19jZmI2NCAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDA3LCAgICAgICAgICAgICAgICAgICAgLyogWzE5N10gT0JKX2Rlc19jYmMgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgxMSwgICAgICAgICAgICAgICAgICAgIC8qIFsyMDJdIE9CSl9kZXNfZWRlX2VjYiAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODEsMHgzQywweDA3LDB4MDEsMHgwMSwweDAyLC8qIFsyMDddIE9CSl9pZGVhX2NiYyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMywweDAyLCAgICAgLyogWzIxOF0gT0JKX3JjMl9jYmMgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgxMiwgICAgICAgICAgICAgICAgICAgIC8qIFsyMjZdIE9CSl9zaGEgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgwRiwgICAgICAgICAgICAgICAgICAgIC8qIFsyMzFdIE9CSl9zaGFXaXRoUlNBRW5jcnlwdGlvbiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMywweDA3LCAgICAgLyogWzIzNl0gT0JKX2Rlc19lZGUzX2NiYyAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDA4LCAgICAgICAgICAgICAgICAgICAgLyogWzI0NF0gT0JKX2Rlc19vZmI2NCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LCAgICAgLyogWzI0OV0gT0JKX3BrY3M5ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwMSwvKiBbMjU3XSBPQkpfcGtjczlfZW1haWxBZGRyZXNzICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwMiwvKiBbMjY2XSBPQkpfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MDMsLyogWzI3NV0gT0JKX3BrY3M5X2NvbnRlbnRUeXBlICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwNCwvKiBbMjg0XSBPQkpfcGtjczlfbWVzc2FnZURpZ2VzdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MDUsLyogWzI5M10gT0JKX3BrY3M5X3NpZ25pbmdUaW1lICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwNiwvKiBbMzAyXSBPQkpfcGtjczlfY291bnRlcnNpZ25hdHVyZSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MDcsLyogWzMxMV0gT0JKX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgwOCwvKiBbMzIwXSBPQkpfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MDksLyogWzMyOV0gT0JKX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLCAgICAgICAgICAvKiBbMzM4XSBPQkpfbmV0c2NhcGUgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg4NiwweEY4LDB4NDIsMHgwMSwgICAgIC8qIFszNDVdIE9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDg2LDB4RjgsMHg0MiwweDAyLCAgICAgLyogWzM1M10gT0JKX25ldHNjYXBlX2RhdGFfdHlwZSAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDFBLCAgICAgICAgICAgICAgICAgICAgLyogWzM2MV0gT0JKX3NoYTEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDA1LC8qIFszNjZdIE9CSl9zaGExV2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgwRCwgICAgICAgICAgICAgICAgICAgIC8qIFszNzVdIE9CSl9kc2FXaXRoU0hBICovCisweDJCLDB4MEUsMHgwMywweDAyLDB4MEMsICAgICAgICAgICAgICAgICAgICAvKiBbMzgwXSBPQkpfZHNhXzIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDBCLC8qIFszODVdIE9CSl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDBDLC8qIFszOTRdIE9CSl9pZF9wYmtkZjIgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsMHgxQiwgICAgICAgICAgICAgICAgICAgIC8qIFs0MDNdIE9CSl9kc2FXaXRoU0hBMV8yICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwMSwvKiBbNDA4XSBPQkpfbmV0c2NhcGVfY2VydF90eXBlICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwMiwvKiBbNDE3XSBPQkpfbmV0c2NhcGVfYmFzZV91cmwgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg4NiwweEY4LDB4NDIsMHgwMSwweDAzLC8qIFs0MjZdIE9CSl9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybCAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDg2LDB4RjgsMHg0MiwweDAxLDB4MDQsLyogWzQzNV0gT0JKX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwNywvKiBbNDQ0XSBPQkpfbmV0c2NhcGVfcmVuZXdhbF91cmwgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg4NiwweEY4LDB4NDIsMHgwMSwweDA4LC8qIFs0NTNdIE9CSl9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwQywvKiBbNDYyXSBPQkpfbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4ODYsMHhGOCwweDQyLDB4MDEsMHgwRCwvKiBbNDcxXSBPQkpfbmV0c2NhcGVfY29tbWVudCAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDg2LDB4RjgsMHg0MiwweDAyLDB4MDUsLyogWzQ4MF0gT0JKX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UgKi8KKzB4NTUsMHgxRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0ODldIE9CSl9pZF9jZSAqLworMHg1NSwweDFELDB4MEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ5MV0gT0JKX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIgKi8KKzB4NTUsMHgxRCwweDBGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0OTRdIE9CSl9rZXlfdXNhZ2UgKi8KKzB4NTUsMHgxRCwweDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0OTddIE9CSl9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QgKi8KKzB4NTUsMHgxRCwweDExLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MDBdIE9CSl9zdWJqZWN0X2FsdF9uYW1lICovCisweDU1LDB4MUQsMHgxMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTAzXSBPQkpfaXNzdWVyX2FsdF9uYW1lICovCisweDU1LDB4MUQsMHgxMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTA2XSBPQkpfYmFzaWNfY29uc3RyYWludHMgKi8KKzB4NTUsMHgxRCwweDE0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MDldIE9CSl9jcmxfbnVtYmVyICovCisweDU1LDB4MUQsMHgyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTEyXSBPQkpfY2VydGlmaWNhdGVfcG9saWNpZXMgKi8KKzB4NTUsMHgxRCwweDIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MTVdIE9CSl9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDQsMHgwMSwweDk3LDB4NTUsMHgwMSwweDAyLC8qIFs1MThdIE9CSl9iZl9jYmMgKi8KKzB4NTUsMHgwOCwweDAzLDB4NjUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MjddIE9CSl9tZGMyICovCisweDU1LDB4MDgsMHgwMywweDY0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTMxXSBPQkpfbWRjMldpdGhSU0EgKi8KKzB4NTUsMHgwNCwweDJBLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MzVdIE9CSl9naXZlbk5hbWUgKi8KKzB4NTUsMHgwNCwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MzhdIE9CSl9zdXJuYW1lICovCisweDU1LDB4MDQsMHgyQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTQxXSBPQkpfaW5pdGlhbHMgKi8KKzB4NTUsMHgxRCwweDFGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NDRdIE9CSl9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cyAqLworMHgyQiwweDBFLDB4MDMsMHgwMiwweDAzLCAgICAgICAgICAgICAgICAgICAgLyogWzU0N10gT0JKX21kNVdpdGhSU0EgKi8KKzB4NTUsMHgwNCwweDA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NTJdIE9CSl9zZXJpYWxOdW1iZXIgKi8KKzB4NTUsMHgwNCwweDBDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NTVdIE9CSl90aXRsZSAqLworMHg1NSwweDA0LDB4MEQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU1OF0gT0JKX2Rlc2NyaXB0aW9uICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjYsMHg3RCwweDA3LDB4NDIsMHgwQSwvKiBbNTYxXSBPQkpfY2FzdDVfY2JjICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjYsMHg3RCwweDA3LDB4NDIsMHgwQywvKiBbNTcwXSBPQkpfcGJlV2l0aE1ENUFuZENhc3Q1X0NCQyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDM4LDB4MDQsMHgwMywgICAgICAgICAgLyogWzU3OV0gT0JKX2RzYVdpdGhTSEExICovCisweDJCLDB4MEUsMHgwMywweDAyLDB4MUQsICAgICAgICAgICAgICAgICAgICAvKiBbNTg2XSBPQkpfc2hhMVdpdGhSU0EgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzOCwweDA0LDB4MDEsICAgICAgICAgIC8qIFs1OTFdIE9CSl9kc2EgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDIsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFs1OThdIE9CSl9yaXBlbWQxNjAgKi8KKzB4MkIsMHgyNCwweDAzLDB4MDMsMHgwMSwweDAyLCAgICAgICAgICAgICAgIC8qIFs2MDNdIE9CSl9yaXBlbWQxNjBXaXRoUlNBICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAzLDB4MDgsICAgICAvKiBbNjA5XSBPQkpfcmM1X2NiYyAqLworMHgyOSwweDAxLDB4MDEsMHg4NSwweDFBLDB4MDEsICAgICAgICAgICAgICAgLyogWzYxN10gT0JKX3JsZV9jb21wcmVzc2lvbiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMywweDA4LC8qIFs2MjNdIE9CSl96bGliX2NvbXByZXNzaW9uICovCisweDU1LDB4MUQsMHgyNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNjM0XSBPQkpfZXh0X2tleV91c2FnZSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsICAgICAgICAgICAgICAgLyogWzYzN10gT0JKX2lkX3BraXggKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsICAgICAgICAgIC8qIFs2NDNdIE9CSl9pZF9rcCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMywweDAxLCAgICAgLyogWzY1MF0gT0JKX3NlcnZlcl9hdXRoICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAzLDB4MDIsICAgICAvKiBbNjU4XSBPQkpfY2xpZW50X2F1dGggKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwMywgICAgIC8qIFs2NjZdIE9CSl9jb2RlX3NpZ24gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwNCwgICAgIC8qIFs2NzRdIE9CSl9lbWFpbF9wcm90ZWN0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAzLDB4MDgsICAgICAvKiBbNjgyXSBPQkpfdGltZV9zdGFtcCAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODIsMHgzNywweDAyLDB4MDEsMHgxNSwvKiBbNjkwXSBPQkpfbXNfY29kZV9pbmQgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDQsMHgwMSwweDgyLDB4MzcsMHgwMiwweDAxLDB4MTYsLyogWzcwMF0gT0JKX21zX2NvZGVfY29tICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MEEsMHgwMywweDAxLC8qIFs3MTBdIE9CSl9tc19jdGxfc2lnbiAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODIsMHgzNywweDBBLDB4MDMsMHgwMywvKiBbNzIwXSBPQkpfbXNfc2djICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MEEsMHgwMywweDA0LC8qIFs3MzBdIE9CSl9tc19lZnMgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg4NiwweEY4LDB4NDIsMHgwNCwweDAxLC8qIFs3NDBdIE9CSl9uc19zZ2MgKi8KKzB4NTUsMHgxRCwweDFCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs3NDldIE9CSl9kZWx0YV9jcmwgKi8KKzB4NTUsMHgxRCwweDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs3NTJdIE9CSl9jcmxfcmVhc29uICovCisweDU1LDB4MUQsMHgxOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNzU1XSBPQkpfaW52YWxpZGl0eV9kYXRlICovCisweDJCLDB4NjUsMHgwMSwweDA0LDB4MDEsICAgICAgICAgICAgICAgICAgICAvKiBbNzU4XSBPQkpfc3huZXQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDEsLyogWzc2M10gT0JKX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDNCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDBDLDB4MDEsMHgwMiwvKiBbNzczXSBPQkpfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDMsLyogWzc4M10gT0JKX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDQsLyogWzc5M10gT0JKX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDUsLyogWzgwM10gT0JKX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDAxLDB4MDYsLyogWzgxM10gT0JKX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDBDLDB4MEEsMHgwMSwweDAxLC8qIFs4MjNdIE9CSl9rZXlCYWcgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDBBLDB4MDEsMHgwMiwvKiBbODM0XSBPQkpfcGtjczhTaHJvdWRlZEtleUJhZyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDBDLDB4MEEsMHgwMSwweDAzLC8qIFs4NDVdIE9CSl9jZXJ0QmFnICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MEMsMHgwQSwweDAxLDB4MDQsLyogWzg1Nl0gT0JKX2NybEJhZyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDBDLDB4MEEsMHgwMSwweDA1LC8qIFs4NjddIE9CSl9zZWNyZXRCYWcgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwQywweDBBLDB4MDEsMHgwNiwvKiBbODc4XSBPQkpfc2FmZUNvbnRlbnRzQmFnICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxNCwvKiBbODg5XSBPQkpfZnJpZW5kbHlOYW1lICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxNSwvKiBbODk4XSBPQkpfbG9jYWxLZXlJRCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTYsMHgwMSwvKiBbOTA3XSBPQkpfeDUwOUNlcnRpZmljYXRlICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxNiwweDAyLC8qIFs5MTddIE9CSl9zZHNpQ2VydGlmaWNhdGUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDE3LDB4MDEsLyogWzkyN10gT0JKX3g1MDlDcmwgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDBELC8qIFs5MzddIE9CSl9wYmVzMiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA1LDB4MEUsLyogWzk0Nl0gT0JKX3BibWFjMSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDA3LCAgICAgLyogWzk1NV0gT0JKX2htYWNXaXRoU0hBMSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMiwweDAxLCAgICAgLyogWzk2M10gT0JKX2lkX3F0X2NwcyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMiwweDAyLCAgICAgLyogWzk3MV0gT0JKX2lkX3F0X3Vub3RpY2UgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDBGLC8qIFs5NzldIE9CSl9TTUlNRUNhcGFiaWxpdGllcyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA1LDB4MDQsLyogWzk4OF0gT0JKX3BiZVdpdGhNRDJBbmRSQzJfQ0JDICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDUsMHgwNiwvKiBbOTk3XSBPQkpfcGJlV2l0aE1ENUFuZFJDMl9DQkMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwweDBBLC8qIFsxMDA2XSBPQkpfcGJlV2l0aFNIQTFBbmRERVNfQ0JDICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MDIsMHgwMSwweDBFLC8qIFsxMDE1XSBPQkpfbXNfZXh0X3JlcSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MEUsLyogWzEwMjVdIE9CSl9leHRfcmVxICovCisweDU1LDB4MDQsMHgyOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMTAzNF0gT0JKX25hbWUgKi8KKzB4NTUsMHgwNCwweDJFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsxMDM3XSBPQkpfZG5RdWFsaWZpZXIgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsICAgICAgICAgIC8qIFsxMDQwXSBPQkpfaWRfcGUgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsICAgICAgICAgIC8qIFsxMDQ3XSBPQkpfaWRfYWQgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwMSwgICAgIC8qIFsxMDU0XSBPQkpfaW5mb19hY2Nlc3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsMHgwMSwgICAgIC8qIFsxMDYyXSBPQkpfYWRfT0NTUCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgzMCwweDAyLCAgICAgLyogWzEwNzBdIE9CSl9hZF9jYV9pc3N1ZXJzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAzLDB4MDksICAgICAvKiBbMTA3OF0gT0JKX09DU1Bfc2lnbiAqLworMHgyOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzEwODZdIE9CSl9pc28gKi8KKzB4MkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsxMDg3XSBPQkpfbWVtYmVyX2JvZHkgKi8KKzB4MkEsMHg4NiwweDQ4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsxMDg4XSBPQkpfSVNPX1VTICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4MzgsICAgICAgICAgICAgICAgICAgICAvKiBbMTA5MV0gT0JKX1g5XzU3ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4MzgsMHgwNCwgICAgICAgICAgICAgICAvKiBbMTA5Nl0gT0JKX1g5Y20gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwgICAgIC8qIFsxMTAyXSBPQkpfcGtjczEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwNSwgICAgIC8qIFsxMTEwXSBPQkpfcGtjczUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLC8qIFsxMTE4XSBPQkpfU01JTUUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsLyogWzExMjddIE9CSl9pZF9zbWltZV9tb2QgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDEsLyogWzExMzddIE9CSl9pZF9zbWltZV9jdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwvKiBbMTE0N10gT0JKX2lkX3NtaW1lX2FhICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAzLC8qIFsxMTU3XSBPQkpfaWRfc21pbWVfYWxnICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDA0LC8qIFsxMTY3XSBPQkpfaWRfc21pbWVfY2QgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDUsLyogWzExNzddIE9CSl9pZF9zbWltZV9zcHEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDYsLyogWzExODddIE9CSl9pZF9zbWltZV9jdGkgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwMSwvKiBbMTE5N10gT0JKX2lkX3NtaW1lX21vZF9jbXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwMiwvKiBbMTIwOF0gT0JKX2lkX3NtaW1lX21vZF9lc3MgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwMywvKiBbMTIxOV0gT0JKX2lkX3NtaW1lX21vZF9vaWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwNCwvKiBbMTIzMF0gT0JKX2lkX3NtaW1lX21vZF9tc2dfdjMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwNSwvKiBbMTI0MV0gT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV84OCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMCwweDA2LC8qIFsxMjUyXSBPQkpfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzk3ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAwLDB4MDcsLyogWzEyNjNdIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfODggKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDAsMHgwOCwvKiBbMTI3NF0gT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV85NyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMSwweDAxLC8qIFsxMjg1XSBPQkpfaWRfc21pbWVfY3RfcmVjZWlwdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMSwweDAyLC8qIFsxMjk2XSBPQkpfaWRfc21pbWVfY3RfYXV0aERhdGEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDEsMHgwMywvKiBbMTMwN10gT0JKX2lkX3NtaW1lX2N0X3B1Ymxpc2hDZXJ0ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDQsLyogWzEzMThdIE9CSl9pZF9zbWltZV9jdF9UU1RJbmZvICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDUsLyogWzEzMjldIE9CSl9pZF9zbWltZV9jdF9URFRJbmZvICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDYsLyogWzEzNDBdIE9CSl9pZF9zbWltZV9jdF9jb250ZW50SW5mbyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMSwweDA3LC8qIFsxMzUxXSBPQkpfaWRfc21pbWVfY3RfRFZDU1JlcXVlc3REYXRhICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDgsLyogWzEzNjJdIE9CSl9pZF9zbWltZV9jdF9EVkNTUmVzcG9uc2VEYXRhICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MDEsLyogWzEzNzNdIE9CSl9pZF9zbWltZV9hYV9yZWNlaXB0UmVxdWVzdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDAyLC8qIFsxMzg0XSBPQkpfaWRfc21pbWVfYWFfc2VjdXJpdHlMYWJlbCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDAzLC8qIFsxMzk1XSBPQkpfaWRfc21pbWVfYWFfbWxFeHBhbmRIaXN0b3J5ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MDQsLyogWzE0MDZdIE9CSl9pZF9zbWltZV9hYV9jb250ZW50SGludCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDA1LC8qIFsxNDE3XSBPQkpfaWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MDYsLyogWzE0MjhdIE9CSl9pZF9zbWltZV9hYV9lbmNhcENvbnRlbnRUeXBlICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MDcsLyogWzE0MzldIE9CSl9pZF9zbWltZV9hYV9jb250ZW50SWRlbnRpZmllciAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDA4LC8qIFsxNDUwXSBPQkpfaWRfc21pbWVfYWFfbWFjVmFsdWUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwOSwvKiBbMTQ2MV0gT0JKX2lkX3NtaW1lX2FhX2VxdWl2YWxlbnRMYWJlbHMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwQSwvKiBbMTQ3Ml0gT0JKX2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwQiwvKiBbMTQ4M10gT0JKX2lkX3NtaW1lX2FhX2VuY3J5cEtleVByZWYgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwQywvKiBbMTQ5NF0gT0JKX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDBELC8qIFsxNTA1XSBPQkpfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgwRSwvKiBbMTUxNl0gT0JKX2lkX3NtaW1lX2FhX3RpbWVTdGFtcFRva2VuICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MEYsLyogWzE1MjddIE9CSl9pZF9zbWltZV9hYV9ldHNfc2lnUG9saWN5SWQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxMCwvKiBbMTUzOF0gT0JKX2lkX3NtaW1lX2FhX2V0c19jb21taXRtZW50VHlwZSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDExLC8qIFsxNTQ5XSBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ25lckxvY2F0aW9uICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MTIsLyogWzE1NjBdIE9CSl9pZF9zbWltZV9hYV9ldHNfc2lnbmVyQXR0ciAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDEzLC8qIFsxNTcxXSBPQkpfaWRfc21pbWVfYWFfZXRzX290aGVyU2lnQ2VydCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDE0LC8qIFsxNTgyXSBPQkpfaWRfc21pbWVfYWFfZXRzX2NvbnRlbnRUaW1lc3RhbXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxNSwvKiBbMTU5M10gT0JKX2lkX3NtaW1lX2FhX2V0c19DZXJ0aWZpY2F0ZVJlZnMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxNiwvKiBbMTYwNF0gT0JKX2lkX3NtaW1lX2FhX2V0c19SZXZvY2F0aW9uUmVmcyAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDE3LC8qIFsxNjE1XSBPQkpfaWRfc21pbWVfYWFfZXRzX2NlcnRWYWx1ZXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxOCwvKiBbMTYyNl0gT0JKX2lkX3NtaW1lX2FhX2V0c19yZXZvY2F0aW9uVmFsdWVzICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MTksLyogWzE2MzddIE9CSl9pZF9zbWltZV9hYV9ldHNfZXNjVGltZVN0YW1wICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAyLDB4MUEsLyogWzE2NDhdIE9CSl9pZF9zbWltZV9hYV9ldHNfY2VydENSTFRpbWVzdGFtcCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMiwweDFCLC8qIFsxNjU5XSBPQkpfaWRfc21pbWVfYWFfZXRzX2FyY2hpdmVUaW1lU3RhbXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxQywvKiBbMTY3MF0gT0JKX2lkX3NtaW1lX2FhX3NpZ25hdHVyZVR5cGUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDIsMHgxRCwvKiBbMTY4MV0gT0JKX2lkX3NtaW1lX2FhX2R2Y3NfZHZjICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAzLDB4MDEsLyogWzE2OTJdIE9CSl9pZF9zbWltZV9hbGdfRVNESHdpdGgzREVTICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAzLDB4MDIsLyogWzE3MDNdIE9CSl9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDMsMHgwMywvKiBbMTcxNF0gT0JKX2lkX3NtaW1lX2FsZ18zREVTd3JhcCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMywweDA0LC8qIFsxNzI1XSBPQkpfaWRfc21pbWVfYWxnX1JDMndyYXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDMsMHgwNSwvKiBbMTczNl0gT0JKX2lkX3NtaW1lX2FsZ19FU0RIICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAzLDB4MDYsLyogWzE3NDddIE9CSl9pZF9zbWltZV9hbGdfQ01TM0RFU3dyYXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDMsMHgwNywvKiBbMTc1OF0gT0JKX2lkX3NtaW1lX2FsZ19DTVNSQzJ3cmFwICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDA0LDB4MDEsLyogWzE3NjldIE9CSl9pZF9zbWltZV9jZF9sZGFwICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDA1LDB4MDEsLyogWzE3ODBdIE9CSl9pZF9zbWltZV9zcHFfZXRzX3NxdF91cmkgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDUsMHgwMiwvKiBbMTc5MV0gT0JKX2lkX3NtaW1lX3NwcV9ldHNfc3F0X3Vub3RpY2UgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDYsMHgwMSwvKiBbMTgwMl0gT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZk9yaWdpbiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwNiwweDAyLC8qIFsxODEzXSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mUmVjZWlwdCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwNiwweDAzLC8qIFsxODI0XSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mRGVsaXZlcnkgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDYsMHgwNCwvKiBbMTgzNV0gT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZlNlbmRlciAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwNiwweDA1LC8qIFsxODQ2XSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQXBwcm92YWwgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwOSwweDEwLDB4MDYsMHgwNiwvKiBbMTg1N10gT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkNyZWF0aW9uICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAyLDB4MDQsICAgICAvKiBbMTg2OF0gT0JKX21kNCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMCwgICAgICAgICAgLyogWzE4NzZdIE9CSl9pZF9wa2l4X21vZCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMiwgICAgICAgICAgLyogWzE4ODNdIE9CSl9pZF9xdCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwgICAgICAgICAgLyogWzE4OTBdIE9CSl9pZF9pdCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNSwgICAgICAgICAgLyogWzE4OTddIE9CSl9pZF9wa2lwICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA2LCAgICAgICAgICAvKiBbMTkwNF0gT0JKX2lkX2FsZyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywgICAgICAgICAgLyogWzE5MTFdIE9CSl9pZF9jbWMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDgsICAgICAgICAgIC8qIFsxOTE4XSBPQkpfaWRfb24gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDksICAgICAgICAgIC8qIFsxOTI1XSBPQkpfaWRfcGRhICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLCAgICAgICAgICAvKiBbMTkzMl0gT0JKX2lkX2FjYSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwQiwgICAgICAgICAgLyogWzE5MzldIE9CSl9pZF9xY3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MEMsICAgICAgICAgIC8qIFsxOTQ2XSBPQkpfaWRfY2N0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDEsICAgICAvKiBbMTk1M10gT0JKX2lkX3BraXgxX2V4cGxpY2l0Xzg4ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDIsICAgICAvKiBbMTk2MV0gT0JKX2lkX3BraXgxX2ltcGxpY2l0Xzg4ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDMsICAgICAvKiBbMTk2OV0gT0JKX2lkX3BraXgxX2V4cGxpY2l0XzkzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDQsICAgICAvKiBbMTk3N10gT0JKX2lkX3BraXgxX2ltcGxpY2l0XzkzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDUsICAgICAvKiBbMTk4NV0gT0JKX2lkX21vZF9jcm1mICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDYsICAgICAvKiBbMTk5M10gT0JKX2lkX21vZF9jbWMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgwNywgICAgIC8qIFsyMDAxXSBPQkpfaWRfbW9kX2tlYV9wcm9maWxlXzg4ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MDgsICAgICAvKiBbMjAwOV0gT0JKX2lkX21vZF9rZWFfcHJvZmlsZV85MyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMCwweDA5LCAgICAgLyogWzIwMTddIE9CSl9pZF9tb2RfY21wICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MEEsICAgICAvKiBbMjAyNV0gT0JKX2lkX21vZF9xdWFsaWZpZWRfY2VydF84OCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMCwweDBCLCAgICAgLyogWzIwMzNdIE9CSl9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfOTMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgwQywgICAgIC8qIFsyMDQxXSBPQkpfaWRfbW9kX2F0dHJpYnV0ZV9jZXJ0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAwLDB4MEQsICAgICAvKiBbMjA0OV0gT0JKX2lkX21vZF90aW1lc3RhbXBfcHJvdG9jb2wgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgwRSwgICAgIC8qIFsyMDU3XSBPQkpfaWRfbW9kX29jc3AgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgwRiwgICAgIC8qIFsyMDY1XSBPQkpfaWRfbW9kX2R2Y3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDAsMHgxMCwgICAgIC8qIFsyMDczXSBPQkpfaWRfbW9kX2NtcDIwMDAgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwMiwgICAgIC8qIFsyMDgxXSBPQkpfYmlvbWV0cmljSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMSwweDAzLCAgICAgLyogWzIwODldIE9CSl9xY1N0YXRlbWVudHMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwNCwgICAgIC8qIFsyMDk3XSBPQkpfYWNfYXVkaXRFbnRpdHkgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwNSwgICAgIC8qIFsyMTA1XSBPQkpfYWNfdGFyZ2V0aW5nICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAxLDB4MDYsICAgICAvKiBbMjExM10gT0JKX2FhQ29udHJvbHMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwNywgICAgIC8qIFsyMTIxXSBPQkpfc2JncF9pcEFkZHJCbG9jayAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwMSwweDA4LCAgICAgLyogWzIxMjldIE9CSl9zYmdwX2F1dG9ub21vdXNTeXNOdW0gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwOSwgICAgIC8qIFsyMTM3XSBPQkpfc2JncF9yb3V0ZXJJZGVudGlmaWVyICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAyLDB4MDMsICAgICAvKiBbMjE0NV0gT0JKX3RleHROb3RpY2UgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwNSwgICAgIC8qIFsyMTUzXSBPQkpfaXBzZWNFbmRTeXN0ZW0gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwNiwgICAgIC8qIFsyMTYxXSBPQkpfaXBzZWNUdW5uZWwgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDMsMHgwNywgICAgIC8qIFsyMTY5XSBPQkpfaXBzZWNVc2VyICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAzLDB4MEEsICAgICAvKiBbMjE3N10gT0JKX2R2Y3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDQsMHgwMSwgICAgIC8qIFsyMTg1XSBPQkpfaWRfaXRfY2FQcm90RW5jQ2VydCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDAyLCAgICAgLyogWzIxOTNdIE9CSl9pZF9pdF9zaWduS2V5UGFpclR5cGVzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MDMsICAgICAvKiBbMjIwMV0gT0JKX2lkX2l0X2VuY0tleVBhaXJUeXBlcyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDA0LCAgICAgLyogWzIyMDldIE9CSl9pZF9pdF9wcmVmZXJyZWRTeW1tQWxnICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MDUsICAgICAvKiBbMjIxN10gT0JKX2lkX2l0X2NhS2V5VXBkYXRlSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDA2LCAgICAgLyogWzIyMjVdIE9CSl9pZF9pdF9jdXJyZW50Q1JMICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MDcsICAgICAvKiBbMjIzM10gT0JKX2lkX2l0X3Vuc3VwcG9ydGVkT0lEcyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDA4LCAgICAgLyogWzIyNDFdIE9CSl9pZF9pdF9zdWJzY3JpcHRpb25SZXF1ZXN0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MDksICAgICAvKiBbMjI0OV0gT0JKX2lkX2l0X3N1YnNjcmlwdGlvblJlc3BvbnNlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MEEsICAgICAvKiBbMjI1N10gT0JKX2lkX2l0X2tleVBhaXJQYXJhbVJlcSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDBCLCAgICAgLyogWzIyNjVdIE9CSl9pZF9pdF9rZXlQYWlyUGFyYW1SZXAgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDQsMHgwQywgICAgIC8qIFsyMjczXSBPQkpfaWRfaXRfcmV2UGFzc3BocmFzZSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDBELCAgICAgLyogWzIyODFdIE9CSl9pZF9pdF9pbXBsaWNpdENvbmZpcm0gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDQsMHgwRSwgICAgIC8qIFsyMjg5XSBPQkpfaWRfaXRfY29uZmlybVdhaXRUaW1lICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA0LDB4MEYsICAgICAvKiBbMjI5N10gT0JKX2lkX2l0X29yaWdQS0lNZXNzYWdlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDEsICAgICAvKiBbMjMwNV0gT0JKX2lkX3JlZ0N0cmwgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDUsMHgwMiwgICAgIC8qIFsyMzEzXSBPQkpfaWRfcmVnSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNSwweDAxLDB4MDEsLyogWzIzMjFdIE9CSl9pZF9yZWdDdHJsX3JlZ1Rva2VuICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDEsMHgwMiwvKiBbMjMzMF0gT0JKX2lkX3JlZ0N0cmxfYXV0aGVudGljYXRvciAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNSwweDAxLDB4MDMsLyogWzIzMzldIE9CSl9pZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNSwweDAxLDB4MDQsLyogWzIzNDhdIE9CSl9pZF9yZWdDdHJsX3BraUFyY2hpdmVPcHRpb25zICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDEsMHgwNSwvKiBbMjM1N10gT0JKX2lkX3JlZ0N0cmxfb2xkQ2VydElEICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDEsMHgwNiwvKiBbMjM2Nl0gT0JKX2lkX3JlZ0N0cmxfcHJvdG9jb2xFbmNyS2V5ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDIsMHgwMSwvKiBbMjM3NV0gT0JKX2lkX3JlZ0luZm9fdXRmOFBhaXJzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA1LDB4MDIsMHgwMiwvKiBbMjM4NF0gT0JKX2lkX3JlZ0luZm9fY2VydFJlcSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNiwweDAxLCAgICAgLyogWzIzOTNdIE9CSl9pZF9hbGdfZGVzNDAgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDYsMHgwMiwgICAgIC8qIFsyNDAxXSBPQkpfaWRfYWxnX25vU2lnbmF0dXJlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA2LDB4MDMsICAgICAvKiBbMjQwOV0gT0JKX2lkX2FsZ19kaF9zaWdfaG1hY19zaGExICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA2LDB4MDQsICAgICAvKiBbMjQxN10gT0JKX2lkX2FsZ19kaF9wb3AgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgwMSwgICAgIC8qIFsyNDI1XSBPQkpfaWRfY21jX3N0YXR1c0luZm8gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgwMiwgICAgIC8qIFsyNDMzXSBPQkpfaWRfY21jX2lkZW50aWZpY2F0aW9uICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MDMsICAgICAvKiBbMjQ0MV0gT0JKX2lkX2NtY19pZGVudGl0eVByb29mICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MDQsICAgICAvKiBbMjQ0OV0gT0JKX2lkX2NtY19kYXRhUmV0dXJuICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MDUsICAgICAvKiBbMjQ1N10gT0JKX2lkX2NtY190cmFuc2FjdGlvbklkICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MDYsICAgICAvKiBbMjQ2NV0gT0JKX2lkX2NtY19zZW5kZXJOb25jZSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywweDA3LCAgICAgLyogWzI0NzNdIE9CSl9pZF9jbWNfcmVjaXBpZW50Tm9uY2UgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgwOCwgICAgIC8qIFsyNDgxXSBPQkpfaWRfY21jX2FkZEV4dGVuc2lvbnMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgwOSwgICAgIC8qIFsyNDg5XSBPQkpfaWRfY21jX2VuY3J5cHRlZFBPUCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywweDBBLCAgICAgLyogWzI0OTddIE9CSl9pZF9jbWNfZGVjcnlwdGVkUE9QICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MEIsICAgICAvKiBbMjUwNV0gT0JKX2lkX2NtY19scmFQT1BXaXRuZXNzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MEYsICAgICAvKiBbMjUxM10gT0JKX2lkX2NtY19nZXRDZXJ0ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MTAsICAgICAvKiBbMjUyMV0gT0JKX2lkX2NtY19nZXRDUkwgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgxMSwgICAgIC8qIFsyNTI5XSBPQkpfaWRfY21jX3Jldm9rZVJlcXVlc3QgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgxMiwgICAgIC8qIFsyNTM3XSBPQkpfaWRfY21jX3JlZ0luZm8gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDcsMHgxMywgICAgIC8qIFsyNTQ1XSBPQkpfaWRfY21jX3Jlc3BvbnNlSW5mbyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywweDE1LCAgICAgLyogWzI1NTNdIE9CSl9pZF9jbWNfcXVlcnlQZW5kaW5nICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MTYsICAgICAvKiBbMjU2MV0gT0JKX2lkX2NtY19wb3BMaW5rUmFuZG9tICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA3LDB4MTcsICAgICAvKiBbMjU2OV0gT0JKX2lkX2NtY19wb3BMaW5rV2l0bmVzcyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNywweDE4LCAgICAgLyogWzI1NzddIE9CSl9pZF9jbWNfY29uZmlybUNlcnRBY2NlcHRhbmNlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA4LDB4MDEsICAgICAvKiBbMjU4NV0gT0JKX2lkX29uX3BlcnNvbmFsRGF0YSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwOSwweDAxLCAgICAgLyogWzI1OTNdIE9CSl9pZF9wZGFfZGF0ZU9mQmlydGggKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDksMHgwMiwgICAgIC8qIFsyNjAxXSBPQkpfaWRfcGRhX3BsYWNlT2ZCaXJ0aCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwOSwweDAzLCAgICAgLyogWzI2MDldIE9CSl9pZF9wZGFfZ2VuZGVyICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDA5LDB4MDQsICAgICAvKiBbMjYxN10gT0JKX2lkX3BkYV9jb3VudHJ5T2ZDaXRpemVuc2hpcCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwOSwweDA1LCAgICAgLyogWzI2MjVdIE9CSl9pZF9wZGFfY291bnRyeU9mUmVzaWRlbmNlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLDB4MDEsICAgICAvKiBbMjYzM10gT0JKX2lkX2FjYV9hdXRoZW50aWNhdGlvbkluZm8gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MEEsMHgwMiwgICAgIC8qIFsyNjQxXSBPQkpfaWRfYWNhX2FjY2Vzc0lkZW50aXR5ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLDB4MDMsICAgICAvKiBbMjY0OV0gT0JKX2lkX2FjYV9jaGFyZ2luZ0lkZW50aXR5ICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLDB4MDQsICAgICAvKiBbMjY1N10gT0JKX2lkX2FjYV9ncm91cCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwQSwweDA1LCAgICAgLyogWzI2NjVdIE9CSl9pZF9hY2Ffcm9sZSAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwQiwweDAxLCAgICAgLyogWzI2NzNdIE9CSl9pZF9xY3NfcGtpeFFDU3ludGF4X3YxICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBDLDB4MDEsICAgICAvKiBbMjY4MV0gT0JKX2lkX2NjdF9jcnMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MEMsMHgwMiwgICAgIC8qIFsyNjg5XSBPQkpfaWRfY2N0X1BLSURhdGEgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MEMsMHgwMywgICAgIC8qIFsyNjk3XSBPQkpfaWRfY2N0X1BLSVJlc3BvbnNlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDMsICAgICAvKiBbMjcwNV0gT0JKX2FkX3RpbWVTdGFtcGluZyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgzMCwweDA0LCAgICAgLyogWzI3MTNdIE9CSl9hZF9kdmNzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwMSwvKiBbMjcyMV0gT0JKX2lkX3BraXhfT0NTUF9iYXNpYyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgzMCwweDAxLDB4MDIsLyogWzI3MzBdIE9CSl9pZF9wa2l4X09DU1BfTm9uY2UgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsMHgwMSwweDAzLC8qIFsyNzM5XSBPQkpfaWRfcGtpeF9PQ1NQX0NybElEICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwNCwvKiBbMjc0OF0gT0JKX2lkX3BraXhfT0NTUF9hY2NlcHRhYmxlUmVzcG9uc2VzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwNSwvKiBbMjc1N10gT0JKX2lkX3BraXhfT0NTUF9ub0NoZWNrICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwNiwvKiBbMjc2Nl0gT0JKX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwNywvKiBbMjc3NV0gT0JKX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvciAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgzMCwweDAxLDB4MDgsLyogWzI3ODRdIE9CSl9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsMHgwMSwweDA5LC8qIFsyNzkzXSBPQkpfaWRfcGtpeF9PQ1NQX3ZhbGlkICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwQSwvKiBbMjgwMl0gT0JKX2lkX3BraXhfT0NTUF9wYXRoICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDMwLDB4MDEsMHgwQiwvKiBbMjgxMV0gT0JKX2lkX3BraXhfT0NTUF90cnVzdFJvb3QgKi8KKzB4MkIsMHgwRSwweDAzLDB4MDIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODIwXSBPQkpfYWxnb3JpdGhtICovCisweDJCLDB4MEUsMHgwMywweDAyLDB4MEIsICAgICAgICAgICAgICAgICAgICAvKiBbMjgyNF0gT0JKX3JzYVNpZ25hdHVyZSAqLworMHg1NSwweDA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI4MjldIE9CSl9YNTAwYWxnb3JpdGhtcyAqLworMHgyQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI4MzFdIE9CSl9vcmcgKi8KKzB4MkIsMHgwNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODMyXSBPQkpfZG9kICovCisweDJCLDB4MDYsMHgwMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjgzNF0gT0JKX2lhbmEgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODM3XSBPQkpfRGlyZWN0b3J5ICovCisweDJCLDB4MDYsMHgwMSwweDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjg0MV0gT0JKX01hbmFnZW1lbnQgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODQ1XSBPQkpfRXhwZXJpbWVudGFsICovCisweDJCLDB4MDYsMHgwMSwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjg0OV0gT0JKX1ByaXZhdGUgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODUzXSBPQkpfU2VjdXJpdHkgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODU3XSBPQkpfU05NUHYyICovCisweDJCLDB4MDYsMHgwMSwweDA3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjg2MV0gT0JKX01haWwgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDQsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFsyODY1XSBPQkpfRW50ZXJwcmlzZXMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDQsMHgwMSwweDhCLDB4M0EsMHg4MiwweDU4LC8qIFsyODcwXSBPQkpfZGNPYmplY3QgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MTksLyogWzI4NzldIE9CSl9kb21haW5Db21wb25lbnQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MEQsLyogWzI4ODldIE9CSl9Eb21haW4gKi8KKzB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyODk5XSBPQkpfam9pbnRfaXNvX2NjaXR0ICovCisweDU1LDB4MDEsMHgwNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjkwMF0gT0JKX3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcyAqLworMHg1NSwweDAxLDB4MDUsMHgzNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI5MDNdIE9CSl9jbGVhcmFuY2UgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDAzLC8qIFsyOTA3XSBPQkpfbWQ0V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwQSwgICAgIC8qIFsyOTE2XSBPQkpfYWNfcHJveHlpbmcgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MDEsMHgwQiwgICAgIC8qIFsyOTI0XSBPQkpfc2luZm9fYWNjZXNzICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDBBLDB4MDYsICAgICAvKiBbMjkzMl0gT0JKX2lkX2FjYV9lbmNBdHRycyAqLworMHg1NSwweDA0LDB4NDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI5NDBdIE9CSl9yb2xlICovCisweDU1LDB4MUQsMHgyNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjk0M10gT0JKX3BvbGljeV9jb25zdHJhaW50cyAqLworMHg1NSwweDFELDB4MzcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzI5NDZdIE9CSl90YXJnZXRfaW5mb3JtYXRpb24gKi8KKzB4NTUsMHgxRCwweDM4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFsyOTQ5XSBPQkpfbm9fcmV2X2F2YWlsICovCisweDAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMjk1Ml0gT0JKX2NjaXR0ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsICAgICAgICAgICAgICAgICAgICAvKiBbMjk1M10gT0JKX2Fuc2lfWDlfNjIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAxLDB4MDEsICAgICAgICAgIC8qIFsyOTU4XSBPQkpfWDlfNjJfcHJpbWVfZmllbGQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAxLDB4MDIsICAgICAgICAgIC8qIFsyOTY1XSBPQkpfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMiwweDAxLCAgICAgICAgICAvKiBbMjk3Ml0gT0JKX1g5XzYyX2lkX2VjUHVibGljS2V5ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAxLDB4MDEsICAgICAvKiBbMjk3OV0gT0JKX1g5XzYyX3ByaW1lMTkydjEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDEsMHgwMiwgICAgIC8qIFsyOTg3XSBPQkpfWDlfNjJfcHJpbWUxOTJ2MiAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMSwweDAzLCAgICAgLyogWzI5OTVdIE9CSl9YOV82Ml9wcmltZTE5MnYzICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAxLDB4MDQsICAgICAvKiBbMzAwM10gT0JKX1g5XzYyX3ByaW1lMjM5djEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDEsMHgwNSwgICAgIC8qIFszMDExXSBPQkpfWDlfNjJfcHJpbWUyMzl2MiAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMSwweDA2LCAgICAgLyogWzMwMTldIE9CSl9YOV82Ml9wcmltZTIzOXYzICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAxLDB4MDcsICAgICAvKiBbMzAyN10gT0JKX1g5XzYyX3ByaW1lMjU2djEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDA0LDB4MDEsICAgICAgICAgIC8qIFszMDM1XSBPQkpfZWNkc2Ffd2l0aF9TSEExICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MTEsMHgwMSwvKiBbMzA0Ml0gT0JKX21zX2NzcF9uYW1lICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgwMSwvKiBbMzA1MV0gT0JKX2Flc18xMjhfZWNiICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgwMiwvKiBbMzA2MF0gT0JKX2Flc18xMjhfY2JjICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgwMywvKiBbMzA2OV0gT0JKX2Flc18xMjhfb2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgwNCwvKiBbMzA3OF0gT0JKX2Flc18xMjhfY2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgxNSwvKiBbMzA4N10gT0JKX2Flc18xOTJfZWNiICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgxNiwvKiBbMzA5Nl0gT0JKX2Flc18xOTJfY2JjICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgxNywvKiBbMzEwNV0gT0JKX2Flc18xOTJfb2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgxOCwvKiBbMzExNF0gT0JKX2Flc18xOTJfY2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyOSwvKiBbMzEyM10gT0JKX2Flc18yNTZfZWNiICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyQSwvKiBbMzEzMl0gT0JKX2Flc18yNTZfY2JjICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyQiwvKiBbMzE0MV0gT0JKX2Flc18yNTZfb2ZiMTI4ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDEsMHgyQywvKiBbMzE1MF0gT0JKX2Flc18yNTZfY2ZiMTI4ICovCisweDU1LDB4MUQsMHgxNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzE1OV0gT0JKX2hvbGRfaW5zdHJ1Y3Rpb25fY29kZSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDM4LDB4MDIsMHgwMSwgICAgICAgICAgLyogWzMxNjJdIE9CSl9ob2xkX2luc3RydWN0aW9uX25vbmUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzOCwweDAyLDB4MDIsICAgICAgICAgIC8qIFszMTY5XSBPQkpfaG9sZF9pbnN0cnVjdGlvbl9jYWxsX2lzc3VlciAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDM4LDB4MDIsMHgwMywgICAgICAgICAgLyogWzMxNzZdIE9CSl9ob2xkX2luc3RydWN0aW9uX3JlamVjdCAqLworMHgwOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzMxODNdIE9CSl9kYXRhICovCisweDA5LDB4OTIsMHgyNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzE4NF0gT0JKX3BzcyAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywgICAgICAgICAgLyogWzMxODddIE9CSl91Y2wgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwgICAgIC8qIFszMTk0XSBPQkpfcGlsb3QgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLC8qIFszMjAyXSBPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMywvKiBbMzIxMV0gT0JKX3BpbG90QXR0cmlidXRlU3ludGF4ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwNCwvKiBbMzIyMF0gT0JKX3BpbG90T2JqZWN0Q2xhc3MgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDBBLC8qIFszMjI5XSBPQkpfcGlsb3RHcm91cHMgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAzLDB4MDQsLyogWzMyMzhdIE9CSl9pQTVTdHJpbmdTeW50YXggKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAzLDB4MDUsLyogWzMyNDhdIE9CSl9jYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwNCwweDAzLC8qIFszMjU4XSBPQkpfcGlsb3RPYmplY3QgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MDQsLyogWzMyNjhdIE9CSl9waWxvdFBlcnNvbiAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgwNSwvKiBbMzI3OF0gT0JKX2FjY291bnQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MDYsLyogWzMyODhdIE9CSl9kb2N1bWVudCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgwNywvKiBbMzI5OF0gT0JKX3Jvb20gKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MDksLyogWzMzMDhdIE9CSl9kb2N1bWVudFNlcmllcyAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgwRSwvKiBbMzMxOF0gT0JKX3JGQzgyMmxvY2FsUGFydCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgwRiwvKiBbMzMyOF0gT0JKX2ROU0RvbWFpbiAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgxMSwvKiBbMzMzOF0gT0JKX2RvbWFpblJlbGF0ZWRPYmplY3QgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MTIsLyogWzMzNDhdIE9CSl9mcmllbmRseUNvdW50cnkgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MTMsLyogWzMzNThdIE9CSl9zaW1wbGVTZWN1cml0eU9iamVjdCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDQsMHgxNCwvKiBbMzM2OF0gT0JKX3BpbG90T3JnYW5pemF0aW9uICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwNCwweDE1LC8qIFszMzc4XSBPQkpfcGlsb3REU0EgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDA0LDB4MTYsLyogWzMzODhdIE9CSl9xdWFsaXR5TGFiZWxsZWREYXRhICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDAxLC8qIFszMzk4XSBPQkpfdXNlcklkICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDAyLC8qIFszNDA4XSBPQkpfdGV4dEVuY29kZWRPUkFkZHJlc3MgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MDMsLyogWzM0MThdIE9CSl9yZmM4MjJNYWlsYm94ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDA0LC8qIFszNDI4XSBPQkpfaW5mbyAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgwNSwvKiBbMzQzOF0gT0JKX2Zhdm91cml0ZURyaW5rICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDA2LC8qIFszNDQ4XSBPQkpfcm9vbU51bWJlciAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgwNywvKiBbMzQ1OF0gT0JKX3Bob3RvICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDA4LC8qIFszNDY4XSBPQkpfdXNlckNsYXNzICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDA5LC8qIFszNDc4XSBPQkpfaG9zdCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgwQSwvKiBbMzQ4OF0gT0JKX21hbmFnZXIgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MEIsLyogWzM0OThdIE9CSl9kb2N1bWVudElkZW50aWZpZXIgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MEMsLyogWzM1MDhdIE9CSl9kb2N1bWVudFRpdGxlICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDBELC8qIFszNTE4XSBPQkpfZG9jdW1lbnRWZXJzaW9uICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDBFLC8qIFszNTI4XSBPQkpfZG9jdW1lbnRBdXRob3IgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MEYsLyogWzM1MzhdIE9CSl9kb2N1bWVudExvY2F0aW9uICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDE0LC8qIFszNTQ4XSBPQkpfaG9tZVRlbGVwaG9uZU51bWJlciAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxNSwvKiBbMzU1OF0gT0JKX3NlY3JldGFyeSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxNiwvKiBbMzU2OF0gT0JKX290aGVyTWFpbGJveCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxNywvKiBbMzU3OF0gT0JKX2xhc3RNb2RpZmllZFRpbWUgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MTgsLyogWzM1ODhdIE9CSl9sYXN0TW9kaWZpZWRCeSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxQSwvKiBbMzU5OF0gT0JKX2FSZWNvcmQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MUIsLyogWzM2MDhdIE9CSl9waWxvdEF0dHJpYnV0ZVR5cGUyNyAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgxQywvKiBbMzYxOF0gT0JKX21YUmVjb3JkICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDFELC8qIFszNjI4XSBPQkpfblNSZWNvcmQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MUUsLyogWzM2MzhdIE9CSl9zT0FSZWNvcmQgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MUYsLyogWzM2NDhdIE9CSl9jTkFNRVJlY29yZCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyNSwvKiBbMzY1OF0gT0JKX2Fzc29jaWF0ZWREb21haW4gKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MjYsLyogWzM2NjhdIE9CSl9hc3NvY2lhdGVkTmFtZSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyNywvKiBbMzY3OF0gT0JKX2hvbWVQb3N0YWxBZGRyZXNzICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDI4LC8qIFszNjg4XSBPQkpfcGVyc29uYWxUaXRsZSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyOSwvKiBbMzY5OF0gT0JKX21vYmlsZVRlbGVwaG9uZU51bWJlciAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyQSwvKiBbMzcwOF0gT0JKX3BhZ2VyVGVsZXBob25lTnVtYmVyICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDJCLC8qIFszNzE4XSBPQkpfZnJpZW5kbHlDb3VudHJ5TmFtZSAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgyRCwvKiBbMzcyOF0gT0JKX29yZ2FuaXphdGlvbmFsU3RhdHVzICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDJFLC8qIFszNzM4XSBPQkpfamFuZXRNYWlsYm94ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDJGLC8qIFszNzQ4XSBPQkpfbWFpbFByZWZlcmVuY2VPcHRpb24gKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MzAsLyogWzM3NThdIE9CSl9idWlsZGluZ05hbWUgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MzEsLyogWzM3NjhdIE9CSl9kU0FRdWFsaXR5ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDMyLC8qIFszNzc4XSBPQkpfc2luZ2xlTGV2ZWxRdWFsaXR5ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDMzLC8qIFszNzg4XSBPQkpfc3VidHJlZU1pbmltdW1RdWFsaXR5ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDM0LC8qIFszNzk4XSBPQkpfc3VidHJlZU1heGltdW1RdWFsaXR5ICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDM1LC8qIFszODA4XSBPQkpfcGVyc29uYWxTaWduYXR1cmUgKi8KKzB4MDksMHg5MiwweDI2LDB4ODksMHg5MywweEYyLDB4MkMsMHg2NCwweDAxLDB4MzYsLyogWzM4MThdIE9CSl9kSVRSZWRpcmVjdCAqLworMHgwOSwweDkyLDB4MjYsMHg4OSwweDkzLDB4RjIsMHgyQywweDY0LDB4MDEsMHgzNywvKiBbMzgyOF0gT0JKX2F1ZGlvICovCisweDA5LDB4OTIsMHgyNiwweDg5LDB4OTMsMHhGMiwweDJDLDB4NjQsMHgwMSwweDM4LC8qIFszODM4XSBPQkpfZG9jdW1lbnRQdWJsaXNoZXIgKi8KKzB4NTUsMHgwNCwweDJELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszODQ4XSBPQkpfeDUwMFVuaXF1ZUlkZW50aWZpZXIgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDcsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFszODUxXSBPQkpfbWltZV9taHMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDcsMHgwMSwweDAxLCAgICAgICAgICAgICAgIC8qIFszODU2XSBPQkpfbWltZV9taHNfaGVhZGluZ3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDcsMHgwMSwweDAyLCAgICAgICAgICAgICAgIC8qIFszODYyXSBPQkpfbWltZV9taHNfYm9kaWVzICovCisweDJCLDB4MDYsMHgwMSwweDA3LDB4MDEsMHgwMSwweDAxLCAgICAgICAgICAvKiBbMzg2OF0gT0JKX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDcsMHgwMSwweDAxLDB4MDIsICAgICAgICAgIC8qIFszODc1XSBPQkpfaWRfaGV4X211bHRpcGFydF9tZXNzYWdlICovCisweDU1LDB4MDQsMHgyQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzg4Ml0gT0JKX2dlbmVyYXRpb25RdWFsaWZpZXIgKi8KKzB4NTUsMHgwNCwweDQxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszODg1XSBPQkpfcHNldWRvbnltICovCisweDY3LDB4MkEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzg4OF0gT0JKX2lkX3NldCAqLworMHg2NywweDJBLDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM4OTBdIE9CSl9zZXRfY3R5cGUgKi8KKzB4NjcsMHgyQSwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszODkzXSBPQkpfc2V0X21zZ0V4dCAqLworMHg2NywweDJBLDB4MDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM4OTZdIE9CSl9zZXRfYXR0ciAqLworMHg2NywweDJBLDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM4OTldIE9CSl9zZXRfcG9saWN5ICovCisweDY3LDB4MkEsMHgwNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkwMl0gT0JKX3NldF9jZXJ0RXh0ICovCisweDY3LDB4MkEsMHgwOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkwNV0gT0JKX3NldF9icmFuZCAqLworMHg2NywweDJBLDB4MDAsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5MDhdIE9CSl9zZXRjdF9QQU5EYXRhICovCisweDY3LDB4MkEsMHgwMCwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkxMl0gT0JKX3NldGN0X1BBTlRva2VuICovCisweDY3LDB4MkEsMHgwMCwweDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkxNl0gT0JKX3NldGN0X1BBTk9ubHkgKi8KKzB4NjcsMHgyQSwweDAwLDB4MDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszOTIwXSBPQkpfc2V0Y3RfT0lEYXRhICovCisweDY3LDB4MkEsMHgwMCwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkyNF0gT0JKX3NldGN0X1BJICovCisweDY3LDB4MkEsMHgwMCwweDA1LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzkyOF0gT0JKX3NldGN0X1BJRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgwNiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5MzJdIE9CSl9zZXRjdF9QSURhdGFVbnNpZ25lZCAqLworMHg2NywweDJBLDB4MDAsMHgwNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5MzZdIE9CSl9zZXRjdF9IT0RJbnB1dCAqLworMHg2NywweDJBLDB4MDAsMHgwOCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NDBdIE9CSl9zZXRjdF9BdXRoUmVzQmFnZ2FnZSAqLworMHg2NywweDJBLDB4MDAsMHgwOSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NDRdIE9CSl9zZXRjdF9BdXRoUmV2UmVxQmFnZ2FnZSAqLworMHg2NywweDJBLDB4MDAsMHgwQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NDhdIE9CSl9zZXRjdF9BdXRoUmV2UmVzQmFnZ2FnZSAqLworMHg2NywweDJBLDB4MDAsMHgwQiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NTJdIE9CSl9zZXRjdF9DYXBUb2tlblNlcSAqLworMHg2NywweDJBLDB4MDAsMHgwQywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NTZdIE9CSl9zZXRjdF9QSW5pdFJlc0RhdGEgKi8KKzB4NjcsMHgyQSwweDAwLDB4MEQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszOTYwXSBPQkpfc2V0Y3RfUElfVEJTICovCisweDY3LDB4MkEsMHgwMCwweDBFLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk2NF0gT0JKX3NldGN0X1BSZXNEYXRhICovCisweDY3LDB4MkEsMHgwMCwweDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk2OF0gT0JKX3NldGN0X0F1dGhSZXFUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MTEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszOTcyXSBPQkpfc2V0Y3RfQXV0aFJlc1RCUyAqLworMHg2NywweDJBLDB4MDAsMHgxMiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5NzZdIE9CSl9zZXRjdF9BdXRoUmVzVEJTWCAqLworMHg2NywweDJBLDB4MDAsMHgxMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzM5ODBdIE9CSl9zZXRjdF9BdXRoVG9rZW5UQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFszOTg0XSBPQkpfc2V0Y3RfQ2FwVG9rZW5EYXRhICovCisweDY3LDB4MkEsMHgwMCwweDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk4OF0gT0JKX3NldGN0X0NhcFRva2VuVEJTICovCisweDY3LDB4MkEsMHgwMCwweDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk5Ml0gT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnICovCisweDY3LDB4MkEsMHgwMCwweDE3LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbMzk5Nl0gT0JKX3NldGN0X0F1dGhSZXZSZXFUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MTgsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDAwXSBPQkpfc2V0Y3RfQXV0aFJldlJlc0RhdGEgKi8KKzB4NjcsMHgyQSwweDAwLDB4MTksICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDA0XSBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCUyAqLworMHg2NywweDJBLDB4MDAsMHgxQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwMDhdIE9CSl9zZXRjdF9DYXBSZXFUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MUIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDEyXSBPQkpfc2V0Y3RfQ2FwUmVxVEJTWCAqLworMHg2NywweDJBLDB4MDAsMHgxQywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwMTZdIE9CSl9zZXRjdF9DYXBSZXNEYXRhICovCisweDY3LDB4MkEsMHgwMCwweDFELCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDAyMF0gT0JKX3NldGN0X0NhcFJldlJlcVRCUyAqLworMHg2NywweDJBLDB4MDAsMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwMjRdIE9CSl9zZXRjdF9DYXBSZXZSZXFUQlNYICovCisweDY3LDB4MkEsMHgwMCwweDFGLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDAyOF0gT0JKX3NldGN0X0NhcFJldlJlc0RhdGEgKi8KKzB4NjcsMHgyQSwweDAwLDB4MjAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDMyXSBPQkpfc2V0Y3RfQ3JlZFJlcVRCUyAqLworMHg2NywweDJBLDB4MDAsMHgyMSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwMzZdIE9CSl9zZXRjdF9DcmVkUmVxVEJTWCAqLworMHg2NywweDJBLDB4MDAsMHgyMiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNDBdIE9CSl9zZXRjdF9DcmVkUmVzRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgyMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNDRdIE9CSl9zZXRjdF9DcmVkUmV2UmVxVEJTICovCisweDY3LDB4MkEsMHgwMCwweDI0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDA0OF0gT0JKX3NldGN0X0NyZWRSZXZSZXFUQlNYICovCisweDY3LDB4MkEsMHgwMCwweDI1LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDA1Ml0gT0JKX3NldGN0X0NyZWRSZXZSZXNEYXRhICovCisweDY3LDB4MkEsMHgwMCwweDI2LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDA1Nl0gT0JKX3NldGN0X1BDZXJ0UmVxRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgyNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNjBdIE9CSl9zZXRjdF9QQ2VydFJlc1RCUyAqLworMHg2NywweDJBLDB4MDAsMHgyOCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNjRdIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgyOSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNjhdIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVzRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgyQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwNzJdIE9CSl9zZXRjdF9DYXJkQ0luaXRSZXNUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MkIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDc2XSBPQkpfc2V0Y3RfTWVBcUNJbml0UmVzVEJTICovCisweDY3LDB4MkEsMHgwMCwweDJDLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDA4MF0gT0JKX3NldGN0X1JlZ0Zvcm1SZXNUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4MkQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDg0XSBPQkpfc2V0Y3RfQ2VydFJlcURhdGEgKi8KKzB4NjcsMHgyQSwweDAwLDB4MkUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MDg4XSBPQkpfc2V0Y3RfQ2VydFJlcVRCUyAqLworMHg2NywweDJBLDB4MDAsMHgyRiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwOTJdIE9CSl9zZXRjdF9DZXJ0UmVzRGF0YSAqLworMHg2NywweDJBLDB4MDAsMHgzMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQwOTZdIE9CSl9zZXRjdF9DZXJ0SW5xUmVxVEJTICovCisweDY3LDB4MkEsMHgwMCwweDMxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDEwMF0gT0JKX3NldGN0X0Vycm9yVEJTICovCisweDY3LDB4MkEsMHgwMCwweDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDEwNF0gT0JKX3NldGN0X1BJRHVhbFNpZ25lZFRCRSAqLworMHg2NywweDJBLDB4MDAsMHgzMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxMDhdIE9CSl9zZXRjdF9QSVVuc2lnbmVkVEJFICovCisweDY3LDB4MkEsMHgwMCwweDM0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDExMl0gT0JKX3NldGN0X0F1dGhSZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4MzUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTE2XSBPQkpfc2V0Y3RfQXV0aFJlc1RCRSAqLworMHg2NywweDJBLDB4MDAsMHgzNiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxMjBdIE9CSl9zZXRjdF9BdXRoUmVzVEJFWCAqLworMHg2NywweDJBLDB4MDAsMHgzNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxMjRdIE9CSl9zZXRjdF9BdXRoVG9rZW5UQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4MzgsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTI4XSBPQkpfc2V0Y3RfQ2FwVG9rZW5UQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4MzksICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTMyXSBPQkpfc2V0Y3RfQ2FwVG9rZW5UQkVYICovCisweDY3LDB4MkEsMHgwMCwweDNBLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDEzNl0gT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnVEJFICovCisweDY3LDB4MkEsMHgwMCwweDNCLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE0MF0gT0JKX3NldGN0X0F1dGhSZXZSZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4M0MsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTQ0XSBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCRSAqLworMHg2NywweDJBLDB4MDAsMHgzRCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxNDhdIE9CSl9zZXRjdF9BdXRoUmV2UmVzVEJFQiAqLworMHg2NywweDJBLDB4MDAsMHgzRSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxNTJdIE9CSl9zZXRjdF9DYXBSZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4M0YsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTU2XSBPQkpfc2V0Y3RfQ2FwUmVxVEJFWCAqLworMHg2NywweDJBLDB4MDAsMHg0MCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxNjBdIE9CSl9zZXRjdF9DYXBSZXNUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4NDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTY0XSBPQkpfc2V0Y3RfQ2FwUmV2UmVxVEJFICovCisweDY3LDB4MkEsMHgwMCwweDQyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE2OF0gT0JKX3NldGN0X0NhcFJldlJlcVRCRVggKi8KKzB4NjcsMHgyQSwweDAwLDB4NDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTcyXSBPQkpfc2V0Y3RfQ2FwUmV2UmVzVEJFICovCisweDY3LDB4MkEsMHgwMCwweDQ0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE3Nl0gT0JKX3NldGN0X0NyZWRSZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4NDUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTgwXSBPQkpfc2V0Y3RfQ3JlZFJlcVRCRVggKi8KKzB4NjcsMHgyQSwweDAwLDB4NDYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MTg0XSBPQkpfc2V0Y3RfQ3JlZFJlc1RCRSAqLworMHg2NywweDJBLDB4MDAsMHg0NywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQxODhdIE9CSl9zZXRjdF9DcmVkUmV2UmVxVEJFICovCisweDY3LDB4MkEsMHgwMCwweDQ4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE5Ml0gT0JKX3NldGN0X0NyZWRSZXZSZXFUQkVYICovCisweDY3LDB4MkEsMHgwMCwweDQ5LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDE5Nl0gT0JKX3NldGN0X0NyZWRSZXZSZXNUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4NEEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjAwXSBPQkpfc2V0Y3RfQmF0Y2hBZG1pblJlcVRCRSAqLworMHg2NywweDJBLDB4MDAsMHg0QiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyMDRdIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVzVEJFICovCisweDY3LDB4MkEsMHgwMCwweDRDLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDIwOF0gT0JKX3NldGN0X1JlZ0Zvcm1SZXFUQkUgKi8KKzB4NjcsMHgyQSwweDAwLDB4NEQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjEyXSBPQkpfc2V0Y3RfQ2VydFJlcVRCRSAqLworMHg2NywweDJBLDB4MDAsMHg0RSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyMTZdIE9CSl9zZXRjdF9DZXJ0UmVxVEJFWCAqLworMHg2NywweDJBLDB4MDAsMHg0RiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyMjBdIE9CSl9zZXRjdF9DZXJ0UmVzVEJFICovCisweDY3LDB4MkEsMHgwMCwweDUwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDIyNF0gT0JKX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUyAqLworMHg2NywweDJBLDB4MDAsMHg1MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyMjhdIE9CSl9zZXRjdF9DUkxOb3RpZmljYXRpb25SZXNUQlMgKi8KKzB4NjcsMHgyQSwweDAwLDB4NTIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjMyXSBPQkpfc2V0Y3RfQkNJRGlzdHJpYnV0aW9uVEJTICovCisweDY3LDB4MkEsMHgwMSwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDIzNl0gT0JKX3NldGV4dF9nZW5DcnlwdCAqLworMHg2NywweDJBLDB4MDEsMHgwMywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyNDBdIE9CSl9zZXRleHRfbWlBdXRoICovCisweDY3LDB4MkEsMHgwMSwweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI0NF0gT0JKX3NldGV4dF9waW5TZWN1cmUgKi8KKzB4NjcsMHgyQSwweDAxLDB4MDUsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjQ4XSBPQkpfc2V0ZXh0X3BpbkFueSAqLworMHg2NywweDJBLDB4MDEsMHgwNywgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyNTJdIE9CSl9zZXRleHRfdHJhY2syICovCisweDY3LDB4MkEsMHgwMSwweDA4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI1Nl0gT0JKX3NldGV4dF9jdiAqLworMHg2NywweDJBLDB4MDUsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQyNjBdIE9CSl9zZXRfcG9saWN5X3Jvb3QgKi8KKzB4NjcsMHgyQSwweDA3LDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjY0XSBPQkpfc2V0Q2V4dF9oYXNoZWRSb290ICovCisweDY3LDB4MkEsMHgwNywweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI2OF0gT0JKX3NldENleHRfY2VydFR5cGUgKi8KKzB4NjcsMHgyQSwweDA3LDB4MDIsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjcyXSBPQkpfc2V0Q2V4dF9tZXJjaERhdGEgKi8KKzB4NjcsMHgyQSwweDA3LDB4MDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0Mjc2XSBPQkpfc2V0Q2V4dF9jQ2VydFJlcXVpcmVkICovCisweDY3LDB4MkEsMHgwNywweDA0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI4MF0gT0JKX3NldENleHRfdHVubmVsaW5nICovCisweDY3LDB4MkEsMHgwNywweDA1LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI4NF0gT0JKX3NldENleHRfc2V0RXh0ICovCisweDY3LDB4MkEsMHgwNywweDA2LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI4OF0gT0JKX3NldENleHRfc2V0UXVhbGYgKi8KKzB4NjcsMHgyQSwweDA3LDB4MDcsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MjkyXSBPQkpfc2V0Q2V4dF9QR1dZY2FwYWJpbGl0aWVzICovCisweDY3LDB4MkEsMHgwNywweDA4LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDI5Nl0gT0JKX3NldENleHRfVG9rZW5JZGVudGlmaWVyICovCisweDY3LDB4MkEsMHgwNywweDA5LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDMwMF0gT0JKX3NldENleHRfVHJhY2syRGF0YSAqLworMHg2NywweDJBLDB4MDcsMHgwQSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQzMDRdIE9CSl9zZXRDZXh0X1Rva2VuVHlwZSAqLworMHg2NywweDJBLDB4MDcsMHgwQiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQzMDhdIE9CSl9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcyAqLworMHg2NywweDJBLDB4MDMsMHgwMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQzMTJdIE9CSl9zZXRBdHRyX0NlcnQgKi8KKzB4NjcsMHgyQSwweDAzLDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0MzE2XSBPQkpfc2V0QXR0cl9QR1dZY2FwICovCisweDY3LDB4MkEsMHgwMywweDAyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDMyMF0gT0JKX3NldEF0dHJfVG9rZW5UeXBlICovCisweDY3LDB4MkEsMHgwMywweDAzLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDMyNF0gT0JKX3NldEF0dHJfSXNzQ2FwICovCisweDY3LDB4MkEsMHgwMywweDAwLDB4MDAsICAgICAgICAgICAgICAgICAgICAvKiBbNDMyOF0gT0JKX3NldF9yb290S2V5VGh1bWIgKi8KKzB4NjcsMHgyQSwweDAzLDB4MDAsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFs0MzMzXSBPQkpfc2V0X2FkZFBvbGljeSAqLworMHg2NywweDJBLDB4MDMsMHgwMiwweDAxLCAgICAgICAgICAgICAgICAgICAgLyogWzQzMzhdIE9CSl9zZXRBdHRyX1Rva2VuX0VNViAqLworMHg2NywweDJBLDB4MDMsMHgwMiwweDAyLCAgICAgICAgICAgICAgICAgICAgLyogWzQzNDNdIE9CSl9zZXRBdHRyX1Rva2VuX0IwUHJpbWUgKi8KKzB4NjcsMHgyQSwweDAzLDB4MDMsMHgwMywgICAgICAgICAgICAgICAgICAgIC8qIFs0MzQ4XSBPQkpfc2V0QXR0cl9Jc3NDYXBfQ1ZNICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDQsICAgICAgICAgICAgICAgICAgICAvKiBbNDM1M10gT0JKX3NldEF0dHJfSXNzQ2FwX1QyICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDUsICAgICAgICAgICAgICAgICAgICAvKiBbNDM1OF0gT0JKX3NldEF0dHJfSXNzQ2FwX1NpZyAqLworMHg2NywweDJBLDB4MDMsMHgwMywweDAzLDB4MDEsICAgICAgICAgICAgICAgLyogWzQzNjNdIE9CSl9zZXRBdHRyX0dlbkNyeXB0Z3JtICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDQsMHgwMSwgICAgICAgICAgICAgICAvKiBbNDM2OV0gT0JKX3NldEF0dHJfVDJFbmMgKi8KKzB4NjcsMHgyQSwweDAzLDB4MDMsMHgwNCwweDAyLCAgICAgICAgICAgICAgIC8qIFs0Mzc1XSBPQkpfc2V0QXR0cl9UMmNsZWFydHh0ICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDUsMHgwMSwgICAgICAgICAgICAgICAvKiBbNDM4MV0gT0JKX3NldEF0dHJfVG9rSUNDc2lnICovCisweDY3LDB4MkEsMHgwMywweDAzLDB4MDUsMHgwMiwgICAgICAgICAgICAgICAvKiBbNDM4N10gT0JKX3NldEF0dHJfU2VjRGV2U2lnICovCisweDY3LDB4MkEsMHgwOCwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDM5M10gT0JKX3NldF9icmFuZF9JQVRBX0FUQSAqLworMHg2NywweDJBLDB4MDgsMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQzOTddIE9CSl9zZXRfYnJhbmRfRGluZXJzICovCisweDY3LDB4MkEsMHgwOCwweDIyLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDQwMV0gT0JKX3NldF9icmFuZF9BbWVyaWNhbkV4cHJlc3MgKi8KKzB4NjcsMHgyQSwweDA4LDB4MjMsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0NDA1XSBPQkpfc2V0X2JyYW5kX0pDQiAqLworMHg2NywweDJBLDB4MDgsMHgwNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ0MDldIE9CSl9zZXRfYnJhbmRfVmlzYSAqLworMHg2NywweDJBLDB4MDgsMHgwNSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ0MTNdIE9CSl9zZXRfYnJhbmRfTWFzdGVyQ2FyZCAqLworMHg2NywweDJBLDB4MDgsMHhBRSwweDdCLCAgICAgICAgICAgICAgICAgICAgLyogWzQ0MTddIE9CSl9zZXRfYnJhbmRfTm92dXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDMsMHgwQSwgICAgIC8qIFs0NDIyXSBPQkpfZGVzX2NkbWYgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDA2LC8qIFs0NDMwXSBPQkpfcnNhT0FFUEVuY3J5cHRpb25TRVQgKi8KKzB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0NDM5XSBPQkpfaXR1X3QgKi8KKzB4NTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0NDQwXSBPQkpfam9pbnRfaXNvX2l0dV90ICovCisweDY3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDQ0MV0gT0JKX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucyAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODIsMHgzNywweDE0LDB4MDIsMHgwMiwvKiBbNDQ0Ml0gT0JKX21zX3NtYXJ0Y2FyZF9sb2dpbiAqLworMHgyQiwweDA2LDB4MDEsMHgwNCwweDAxLDB4ODIsMHgzNywweDE0LDB4MDIsMHgwMywvKiBbNDQ1Ml0gT0JKX21zX3VwbiAqLworMHg1NSwweDA0LDB4MDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ0NjJdIE9CSl9zdHJlZXRBZGRyZXNzICovCisweDU1LDB4MDQsMHgxMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDQ2NV0gT0JKX3Bvc3RhbENvZGUgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MTUsICAgICAgICAgIC8qIFs0NDY4XSBPQkpfaWRfcHBsICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDAxLDB4MEUsICAgICAvKiBbNDQ3NV0gT0JKX3Byb3h5Q2VydEluZm8gKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MTUsMHgwMCwgICAgIC8qIFs0NDgzXSBPQkpfaWRfcHBsX2FueUxhbmd1YWdlICovCisweDJCLDB4MDYsMHgwMSwweDA1LDB4MDUsMHgwNywweDE1LDB4MDEsICAgICAvKiBbNDQ5MV0gT0JKX2lkX3BwbF9pbmhlcml0QWxsICovCisweDU1LDB4MUQsMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDQ5OV0gT0JKX25hbWVfY29uc3RyYWludHMgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MTUsMHgwMiwgICAgIC8qIFs0NTAyXSBPQkpfSW5kZXBlbmRlbnQgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBCLC8qIFs0NTEwXSBPQkpfc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBDLC8qIFs0NTE5XSBPQkpfc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBELC8qIFs0NTI4XSBPQkpfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNywweDBELDB4MDEsMHgwMSwweDBFLC8qIFs0NTM3XSBPQkpfc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24gKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMiwweDAxLC8qIFs0NTQ2XSBPQkpfc2hhMjU2ICovCisweDYwLDB4ODYsMHg0OCwweDAxLDB4NjUsMHgwMywweDA0LDB4MDIsMHgwMiwvKiBbNDU1NV0gT0JKX3NoYTM4NCAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAyLDB4MDMsLyogWzQ1NjRdIE9CSl9zaGE1MTIgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMiwweDA0LC8qIFs0NTczXSBPQkpfc2hhMjI0ICovCisweDJCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDU4Ml0gT0JKX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uICovCisweDJCLDB4ODEsMHgwNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNDU4M10gT0JKX2NlcnRpY29tX2FyYyAqLworMHg2NywweDJCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzQ1ODZdIE9CSl93YXAgKi8KKzB4NjcsMHgyQiwweDAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0NTg4XSBPQkpfd2FwX3dzZyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDEsMHgwMiwweDAzLCAgICAgLyogWzQ1OTFdIE9CSl9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAxLDB4MDIsMHgwMywweDAxLC8qIFs0NTk5XSBPQkpfWDlfNjJfb25CYXNpcyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDEsMHgwMiwweDAzLDB4MDIsLyogWzQ2MDhdIE9CSl9YOV82Ml90cEJhc2lzICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMSwweDAyLDB4MDMsMHgwMywvKiBbNDYxN10gT0JKX1g5XzYyX3BwQmFzaXMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwMSwgICAgIC8qIFs0NjI2XSBPQkpfWDlfNjJfYzJwbmIxNjN2MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDAyLCAgICAgLyogWzQ2MzRdIE9CSl9YOV82Ml9jMnBuYjE2M3YyICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MDMsICAgICAvKiBbNDY0Ml0gT0JKX1g5XzYyX2MycG5iMTYzdjMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwNCwgICAgIC8qIFs0NjUwXSBPQkpfWDlfNjJfYzJwbmIxNzZ2MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDA1LCAgICAgLyogWzQ2NThdIE9CSl9YOV82Ml9jMnRuYjE5MXYxICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MDYsICAgICAvKiBbNDY2Nl0gT0JKX1g5XzYyX2MydG5iMTkxdjIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwNywgICAgIC8qIFs0Njc0XSBPQkpfWDlfNjJfYzJ0bmIxOTF2MyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDA4LCAgICAgLyogWzQ2ODJdIE9CSl9YOV82Ml9jMm9uYjE5MXY0ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MDksICAgICAvKiBbNDY5MF0gT0JKX1g5XzYyX2Myb25iMTkxdjUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwQSwgICAgIC8qIFs0Njk4XSBPQkpfWDlfNjJfYzJwbmIyMDh3MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDBCLCAgICAgLyogWzQ3MDZdIE9CSl9YOV82Ml9jMnRuYjIzOXYxICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MEMsICAgICAvKiBbNDcxNF0gT0JKX1g5XzYyX2MydG5iMjM5djIgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgwRCwgICAgIC8qIFs0NzIyXSBPQkpfWDlfNjJfYzJ0bmIyMzl2MyAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDBFLCAgICAgLyogWzQ3MzBdIE9CSl9YOV82Ml9jMm9uYjIzOXY0ICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MEYsICAgICAvKiBbNDczOF0gT0JKX1g5XzYyX2Myb25iMjM5djUgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgxMCwgICAgIC8qIFs0NzQ2XSBPQkpfWDlfNjJfYzJwbmIyNzJ3MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDExLCAgICAgLyogWzQ3NTRdIE9CSl9YOV82Ml9jMnBuYjMwNHcxICovCisweDJBLDB4ODYsMHg0OCwweENFLDB4M0QsMHgwMywweDAwLDB4MTIsICAgICAvKiBbNDc2Ml0gT0JKX1g5XzYyX2MydG5iMzU5djEgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDAzLDB4MDAsMHgxMywgICAgIC8qIFs0NzcwXSBPQkpfWDlfNjJfYzJwbmIzNjh3MSAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDMsMHgwMCwweDE0LCAgICAgLyogWzQ3NzhdIE9CSl9YOV82Ml9jMnRuYjQzMXIxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MDYsICAgICAgICAgICAgICAgICAgICAvKiBbNDc4Nl0gT0JKX3NlY3AxMTJyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDA3LCAgICAgICAgICAgICAgICAgICAgLyogWzQ3OTFdIE9CSl9zZWNwMTEycjIgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgxQywgICAgICAgICAgICAgICAgICAgIC8qIFs0Nzk2XSBPQkpfc2VjcDEyOHIxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MUQsICAgICAgICAgICAgICAgICAgICAvKiBbNDgwMV0gT0JKX3NlY3AxMjhyMiAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDA5LCAgICAgICAgICAgICAgICAgICAgLyogWzQ4MDZdIE9CSl9zZWNwMTYwazEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgwOCwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODExXSBPQkpfc2VjcDE2MHIxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MUUsICAgICAgICAgICAgICAgICAgICAvKiBbNDgxNl0gT0JKX3NlY3AxNjByMiAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDFGLCAgICAgICAgICAgICAgICAgICAgLyogWzQ4MjFdIE9CSl9zZWNwMTkyazEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgyMCwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODI2XSBPQkpfc2VjcDIyNGsxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MjEsICAgICAgICAgICAgICAgICAgICAvKiBbNDgzMV0gT0JKX3NlY3AyMjRyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDBBLCAgICAgICAgICAgICAgICAgICAgLyogWzQ4MzZdIE9CSl9zZWNwMjU2azEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgyMiwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODQxXSBPQkpfc2VjcDM4NHIxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MjMsICAgICAgICAgICAgICAgICAgICAvKiBbNDg0Nl0gT0JKX3NlY3A1MjFyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDA0LCAgICAgICAgICAgICAgICAgICAgLyogWzQ4NTFdIE9CSl9zZWN0MTEzcjEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgwNSwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODU2XSBPQkpfc2VjdDExM3IyICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MTYsICAgICAgICAgICAgICAgICAgICAvKiBbNDg2MV0gT0JKX3NlY3QxMzFyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDE3LCAgICAgICAgICAgICAgICAgICAgLyogWzQ4NjZdIE9CSl9zZWN0MTMxcjIgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgwMSwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODcxXSBPQkpfc2VjdDE2M2sxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MDIsICAgICAgICAgICAgICAgICAgICAvKiBbNDg3Nl0gT0JKX3NlY3QxNjNyMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDBGLCAgICAgICAgICAgICAgICAgICAgLyogWzQ4ODFdIE9CSl9zZWN0MTYzcjIgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgxOCwgICAgICAgICAgICAgICAgICAgIC8qIFs0ODg2XSBPQkpfc2VjdDE5M3IxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MTksICAgICAgICAgICAgICAgICAgICAvKiBbNDg5MV0gT0JKX3NlY3QxOTNyMiAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDFBLCAgICAgICAgICAgICAgICAgICAgLyogWzQ4OTZdIE9CSl9zZWN0MjMzazEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgxQiwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTAxXSBPQkpfc2VjdDIzM3IxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MDMsICAgICAgICAgICAgICAgICAgICAvKiBbNDkwNl0gT0JKX3NlY3QyMzlrMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDEwLCAgICAgICAgICAgICAgICAgICAgLyogWzQ5MTFdIE9CSl9zZWN0MjgzazEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgxMSwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTE2XSBPQkpfc2VjdDI4M3IxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MjQsICAgICAgICAgICAgICAgICAgICAvKiBbNDkyMV0gT0JKX3NlY3Q0MDlrMSAqLworMHgyQiwweDgxLDB4MDQsMHgwMCwweDI1LCAgICAgICAgICAgICAgICAgICAgLyogWzQ5MjZdIE9CSl9zZWN0NDA5cjEgKi8KKzB4MkIsMHg4MSwweDA0LDB4MDAsMHgyNiwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTMxXSBPQkpfc2VjdDU3MWsxICovCisweDJCLDB4ODEsMHgwNCwweDAwLDB4MjcsICAgICAgICAgICAgICAgICAgICAvKiBbNDkzNl0gT0JKX3NlY3Q1NzFyMSAqLworMHg2NywweDJCLDB4MDEsMHgwNCwweDAxLCAgICAgICAgICAgICAgICAgICAgLyogWzQ5NDFdIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxICovCisweDY3LDB4MkIsMHgwMSwweDA0LDB4MDMsICAgICAgICAgICAgICAgICAgICAvKiBbNDk0Nl0gT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczMgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwNCwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTUxXSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzNCAqLworMHg2NywweDJCLDB4MDEsMHgwNCwweDA1LCAgICAgICAgICAgICAgICAgICAgLyogWzQ5NTZdIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM1ICovCisweDY3LDB4MkIsMHgwMSwweDA0LDB4MDYsICAgICAgICAgICAgICAgICAgICAvKiBbNDk2MV0gT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczYgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwNywgICAgICAgICAgICAgICAgICAgIC8qIFs0OTY2XSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzNyAqLworMHg2NywweDJCLDB4MDEsMHgwNCwweDA4LCAgICAgICAgICAgICAgICAgICAgLyogWzQ5NzFdIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM4ICovCisweDY3LDB4MkIsMHgwMSwweDA0LDB4MDksICAgICAgICAgICAgICAgICAgICAvKiBbNDk3Nl0gT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczkgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwQSwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTgxXSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTAgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwQiwgICAgICAgICAgICAgICAgICAgIC8qIFs0OTg2XSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTEgKi8KKzB4NjcsMHgyQiwweDAxLDB4MDQsMHgwQywgICAgICAgICAgICAgICAgICAgIC8qIFs0OTkxXSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTIgKi8KKzB4NTUsMHgxRCwweDIwLDB4MDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs0OTk2XSBPQkpfYW55X3BvbGljeSAqLworMHg1NSwweDFELDB4MjEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzUwMDBdIE9CSl9wb2xpY3lfbWFwcGluZ3MgKi8KKzB4NTUsMHgxRCwweDM2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MDAzXSBPQkpfaW5oaWJpdF9hbnlfcG9saWN5ICovCisweDJBLDB4ODMsMHgwOCwweDhDLDB4OUEsMHg0QiwweDNELDB4MDEsMHgwMSwweDAxLDB4MDIsLyogWzUwMDZdIE9CSl9jYW1lbGxpYV8xMjhfY2JjICovCisweDJBLDB4ODMsMHgwOCwweDhDLDB4OUEsMHg0QiwweDNELDB4MDEsMHgwMSwweDAxLDB4MDMsLyogWzUwMTddIE9CSl9jYW1lbGxpYV8xOTJfY2JjICovCisweDJBLDB4ODMsMHgwOCwweDhDLDB4OUEsMHg0QiwweDNELDB4MDEsMHgwMSwweDAxLDB4MDQsLyogWzUwMjhdIE9CSl9jYW1lbGxpYV8yNTZfY2JjICovCisweDAzLDB4QTIsMHgzMSwweDA1LDB4MDMsMHgwMSwweDA5LDB4MDEsICAgICAvKiBbNTAzOV0gT0JKX2NhbWVsbGlhXzEyOF9lY2IgKi8KKzB4MDMsMHhBMiwweDMxLDB4MDUsMHgwMywweDAxLDB4MDksMHgxNSwgICAgIC8qIFs1MDQ3XSBPQkpfY2FtZWxsaWFfMTkyX2VjYiAqLworMHgwMywweEEyLDB4MzEsMHgwNSwweDAzLDB4MDEsMHgwOSwweDI5LCAgICAgLyogWzUwNTVdIE9CSl9jYW1lbGxpYV8yNTZfZWNiICovCisweDAzLDB4QTIsMHgzMSwweDA1LDB4MDMsMHgwMSwweDA5LDB4MDQsICAgICAvKiBbNTA2M10gT0JKX2NhbWVsbGlhXzEyOF9jZmIxMjggKi8KKzB4MDMsMHhBMiwweDMxLDB4MDUsMHgwMywweDAxLDB4MDksMHgxOCwgICAgIC8qIFs1MDcxXSBPQkpfY2FtZWxsaWFfMTkyX2NmYjEyOCAqLworMHgwMywweEEyLDB4MzEsMHgwNSwweDAzLDB4MDEsMHgwOSwweDJDLCAgICAgLyogWzUwNzldIE9CSl9jYW1lbGxpYV8yNTZfY2ZiMTI4ICovCisweDAzLDB4QTIsMHgzMSwweDA1LDB4MDMsMHgwMSwweDA5LDB4MDMsICAgICAvKiBbNTA4N10gT0JKX2NhbWVsbGlhXzEyOF9vZmIxMjggKi8KKzB4MDMsMHhBMiwweDMxLDB4MDUsMHgwMywweDAxLDB4MDksMHgxNywgICAgIC8qIFs1MDk1XSBPQkpfY2FtZWxsaWFfMTkyX29mYjEyOCAqLworMHgwMywweEEyLDB4MzEsMHgwNSwweDAzLDB4MDEsMHgwOSwweDJCLCAgICAgLyogWzUxMDNdIE9CSl9jYW1lbGxpYV8yNTZfb2ZiMTI4ICovCisweDU1LDB4MUQsMHgwOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTExMV0gT0JKX3N1YmplY3RfZGlyZWN0b3J5X2F0dHJpYnV0ZXMgKi8KKzB4NTUsMHgxRCwweDFDLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MTE0XSBPQkpfaXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQgKi8KKzB4NTUsMHgxRCwweDFELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1MTE3XSBPQkpfY2VydGlmaWNhdGVfaXNzdWVyICovCisweDJBLDB4ODMsMHgxQSwweDhDLDB4OUEsMHg0NCwgICAgICAgICAgICAgICAvKiBbNTEyMF0gT0JKX2tpc2EgKi8KKzB4MkEsMHg4MywweDFBLDB4OEMsMHg5QSwweDQ0LDB4MDEsMHgwMywgICAgIC8qIFs1MTI2XSBPQkpfc2VlZF9lY2IgKi8KKzB4MkEsMHg4MywweDFBLDB4OEMsMHg5QSwweDQ0LDB4MDEsMHgwNCwgICAgIC8qIFs1MTM0XSBPQkpfc2VlZF9jYmMgKi8KKzB4MkEsMHg4MywweDFBLDB4OEMsMHg5QSwweDQ0LDB4MDEsMHgwNiwgICAgIC8qIFs1MTQyXSBPQkpfc2VlZF9vZmIxMjggKi8KKzB4MkEsMHg4MywweDFBLDB4OEMsMHg5QSwweDQ0LDB4MDEsMHgwNSwgICAgIC8qIFs1MTUwXSBPQkpfc2VlZF9jZmIxMjggKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA4LDB4MDEsMHgwMSwgICAgIC8qIFs1MTU4XSBPQkpfaG1hY19tZDUgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA4LDB4MDEsMHgwMiwgICAgIC8qIFs1MTY2XSBPQkpfaG1hY19zaGExICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjYsMHg3RCwweDA3LDB4NDIsMHgwRCwvKiBbNTE3NF0gT0JKX2lkX1Bhc3N3b3JkQmFzZWRNQUMgKi8KKzB4MkEsMHg4NiwweDQ4LDB4ODYsMHhGNiwweDdELDB4MDcsMHg0MiwweDFFLC8qIFs1MTgzXSBPQkpfaWRfREhCYXNlZE1hYyAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwNCwweDEwLCAgICAgLyogWzUxOTJdIE9CSl9pZF9pdF9zdXBwTGFuZ1RhZ3MgKi8KKzB4MkIsMHgwNiwweDAxLDB4MDUsMHgwNSwweDA3LDB4MzAsMHgwNSwgICAgIC8qIFs1MjAwXSBPQkpfY2FSZXBvc2l0b3J5ICovCisweDJBLDB4ODYsMHg0OCwweDg2LDB4RjcsMHgwRCwweDAxLDB4MDksMHgxMCwweDAxLDB4MDksLyogWzUyMDhdIE9CSl9pZF9zbWltZV9jdF9jb21wcmVzc2VkRGF0YSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMSwweDA5LDB4MTAsMHgwMSwweDFCLC8qIFs1MjE5XSBPQkpfaWRfY3RfYXNjaWlUZXh0V2l0aENSTEYgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDA1LC8qIFs1MjMwXSBPQkpfaWRfYWVzMTI4X3dyYXAgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDE5LC8qIFs1MjM5XSBPQkpfaWRfYWVzMTkyX3dyYXAgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMSwweDJELC8qIFs1MjQ4XSBPQkpfaWRfYWVzMjU2X3dyYXAgKi8KKzB4MkEsMHg4NiwweDQ4LDB4Q0UsMHgzRCwweDA0LDB4MDIsICAgICAgICAgIC8qIFs1MjU3XSBPQkpfZWNkc2Ffd2l0aF9SZWNvbW1lbmRlZCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywgICAgICAgICAgLyogWzUyNjRdIE9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywweDAxLCAgICAgLyogWzUyNzFdIE9CSl9lY2RzYV93aXRoX1NIQTIyNCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywweDAyLCAgICAgLyogWzUyNzldIE9CSl9lY2RzYV93aXRoX1NIQTI1NiAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywweDAzLCAgICAgLyogWzUyODddIE9CSl9lY2RzYV93aXRoX1NIQTM4NCAqLworMHgyQSwweDg2LDB4NDgsMHhDRSwweDNELDB4MDQsMHgwMywweDA0LCAgICAgLyogWzUyOTVdIE9CSl9lY2RzYV93aXRoX1NIQTUxMiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDA2LCAgICAgLyogWzUzMDNdIE9CSl9obWFjV2l0aE1ENSAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDA4LCAgICAgLyogWzUzMTFdIE9CSl9obWFjV2l0aFNIQTIyNCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDA5LCAgICAgLyogWzUzMTldIE9CSl9obWFjV2l0aFNIQTI1NiAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDBBLCAgICAgLyogWzUzMjddIE9CSl9obWFjV2l0aFNIQTM4NCAqLworMHgyQSwweDg2LDB4NDgsMHg4NiwweEY3LDB4MEQsMHgwMiwweDBCLCAgICAgLyogWzUzMzVdIE9CSl9obWFjV2l0aFNIQTUxMiAqLworMHg2MCwweDg2LDB4NDgsMHgwMSwweDY1LDB4MDMsMHgwNCwweDAzLDB4MDEsLyogWzUzNDNdIE9CSl9kc2Ffd2l0aF9TSEEyMjQgKi8KKzB4NjAsMHg4NiwweDQ4LDB4MDEsMHg2NSwweDAzLDB4MDQsMHgwMywweDAyLC8qIFs1MzUyXSBPQkpfZHNhX3dpdGhfU0hBMjU2ICovCisweDI4LDB4Q0YsMHgwNiwweDAzLDB4MDAsMHgzNywgICAgICAgICAgICAgICAvKiBbNTM2MV0gT0JKX3doaXJscG9vbCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLCAgICAgICAgICAgICAgICAgICAgLyogWzUzNjddIE9CSl9jcnlwdG9wcm8gKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwOSwgICAgICAgICAgICAgICAgICAgIC8qIFs1MzcyXSBPQkpfY3J5cHRvY29tICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgwMywgICAgICAgICAgICAgICAvKiBbNTM3N10gT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgwNCwgICAgICAgICAgICAgICAvKiBbNTM4M10gT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MDksICAgICAgICAgICAgICAgLyogWzUzODldIE9CSl9pZF9Hb3N0UjM0MTFfOTQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDBBLCAgICAgICAgICAgICAgIC8qIFs1Mzk1XSBPQkpfaWRfSE1BQ0dvc3RSMzQxMV85NCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MTMsICAgICAgICAgICAgICAgLyogWzU0MDFdIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMSAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MTQsICAgICAgICAgICAgICAgLyogWzU0MDddIE9CSl9pZF9Hb3N0UjM0MTBfOTQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDE1LCAgICAgICAgICAgICAgIC8qIFs1NDEzXSBPQkpfaWRfR29zdDI4MTQ3Xzg5ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNiwgICAgICAgICAgICAgICAvKiBbNTQxOV0gT0JKX2lkX0dvc3QyODE0N184OV9NQUMgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDE3LCAgICAgICAgICAgICAgIC8qIFs1NDI1XSBPQkpfaWRfR29zdFIzNDExXzk0X3ByZiAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4NjIsICAgICAgICAgICAgICAgLyogWzU0MzFdIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMURIICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHg2MywgICAgICAgICAgICAgICAvKiBbNTQzN10gT0JKX2lkX0dvc3RSMzQxMF85NERIICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgwRSwweDAxLCAgICAgICAgICAvKiBbNTQ0M10gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZyAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MEUsMHgwMCwgICAgICAgICAgLyogWzU0NTBdIE9CSl9pZF9Hb3N0MjgxNDdfODlfTm9uZV9LZXlNZXNoaW5nICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRSwweDAwLCAgICAgICAgICAvKiBbNTQ1N10gT0JKX2lkX0dvc3RSMzQxMV85NF9UZXN0UGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDFFLDB4MDEsICAgICAgICAgIC8qIFs1NDY0XSBPQkpfaWRfR29zdFIzNDExXzk0X0NyeXB0b1Byb1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDAwLCAgICAgICAgICAvKiBbNTQ3MV0gT0JKX2lkX0dvc3QyODE0N184OV9UZXN0UGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDFGLDB4MDEsICAgICAgICAgIC8qIFs1NDc4XSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19BX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDAyLCAgICAgICAgICAvKiBbNTQ4NV0gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MUYsMHgwMywgICAgICAgICAgLyogWzU0OTJdIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0NfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDFGLDB4MDQsICAgICAgICAgIC8qIFs1NDk5XSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19EX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDA1LCAgICAgICAgICAvKiBbNTUwNl0gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8xX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDA2LCAgICAgICAgICAvKiBbNTUxM10gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8wX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxRiwweDA3LCAgICAgICAgICAvKiBbNTUyMF0gT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fUklDXzFfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDIwLDB4MDAsICAgICAgICAgIC8qIFs1NTI3XSBPQkpfaWRfR29zdFIzNDEwXzk0X1Rlc3RQYXJhbVNldCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MjAsMHgwMiwgICAgICAgICAgLyogWzU1MzRdIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0FfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDIwLDB4MDMsICAgICAgICAgIC8qIFs1NTQxXSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19CX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMCwweDA0LCAgICAgICAgICAvKiBbNTU0OF0gT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MjAsMHgwNSwgICAgICAgICAgLyogWzU1NTVdIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0RfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDIxLDB4MDEsICAgICAgICAgIC8qIFs1NTYyXSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMSwweDAyLCAgICAgICAgICAvKiBbNTU2OV0gT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldCAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDAyLDB4MjEsMHgwMywgICAgICAgICAgLyogWzU1NzZdIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaENfUGFyYW1TZXQgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwMiwweDIzLDB4MDAsICAgICAgICAgIC8qIFs1NTgzXSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfVGVzdFBhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMywweDAxLCAgICAgICAgICAvKiBbNTU5MF0gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19BX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMywweDAyLCAgICAgICAgICAvKiBbNTU5N10gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19CX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyMywweDAzLCAgICAgICAgICAvKiBbNTYwNF0gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19DX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyNCwweDAwLCAgICAgICAgICAvKiBbNTYxMV0gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgyNCwweDAxLCAgICAgICAgICAvKiBbNTYxOF0gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hCX1BhcmFtU2V0ICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNCwweDAxLCAgICAgICAgICAvKiBbNTYyNV0gT0JKX2lkX0dvc3RSMzQxMF85NF9hICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNCwweDAyLCAgICAgICAgICAvKiBbNTYzMl0gT0JKX2lkX0dvc3RSMzQxMF85NF9hQmlzICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNCwweDAzLCAgICAgICAgICAvKiBbNTYzOV0gT0JKX2lkX0dvc3RSMzQxMF85NF9iICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDIsMHgxNCwweDA0LCAgICAgICAgICAvKiBbNTY0Nl0gT0JKX2lkX0dvc3RSMzQxMF85NF9iQmlzICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDksMHgwMSwweDA2LDB4MDEsICAgICAvKiBbNTY1M10gT0JKX2lkX0dvc3QyODE0N184OV9jYyAqLworMHgyQSwweDg1LDB4MDMsMHgwMiwweDA5LDB4MDEsMHgwNSwweDAzLCAgICAgLyogWzU2NjFdIE9CSl9pZF9Hb3N0UjM0MTBfOTRfY2MgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwOSwweDAxLDB4MDUsMHgwNCwgICAgIC8qIFs1NjY5XSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfY2MgKi8KKzB4MkEsMHg4NSwweDAzLDB4MDIsMHgwOSwweDAxLDB4MDMsMHgwMywgICAgIC8qIFs1Njc3XSBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0X2NjICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDksMHgwMSwweDAzLDB4MDQsICAgICAvKiBbNTY4NV0gT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxX2NjICovCisweDJBLDB4ODUsMHgwMywweDAyLDB4MDksMHgwMSwweDA4LDB4MDEsICAgICAvKiBbNTY5M10gT0JKX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjICovCisweDJCLDB4MDYsMHgwMSwweDA0LDB4MDEsMHg4MiwweDM3LDB4MTEsMHgwMiwvKiBbNTcwMV0gT0JKX0xvY2FsS2V5U2V0ICovCisweDU1LDB4MUQsMHgyRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTcxMF0gT0JKX2ZyZXNoZXN0X2NybCAqLworMHgyQiwweDA2LDB4MDEsMHgwNSwweDA1LDB4MDcsMHgwOCwweDAzLCAgICAgLyogWzU3MTNdIE9CSl9pZF9vbl9wZXJtYW5lbnRJZGVudGlmaWVyICovCisweDU1LDB4MDQsMHgwRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTcyMV0gT0JKX3NlYXJjaEd1aWRlICovCisweDU1LDB4MDQsMHgwRiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTcyNF0gT0JKX2J1c2luZXNzQ2F0ZWdvcnkgKi8KKzB4NTUsMHgwNCwweDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NzI3XSBPQkpfcG9zdGFsQWRkcmVzcyAqLworMHg1NSwweDA0LDB4MTIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3MzBdIE9CSl9wb3N0T2ZmaWNlQm94ICovCisweDU1LDB4MDQsMHgxMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTczM10gT0JKX3BoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lICovCisweDU1LDB4MDQsMHgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTczNl0gT0JKX3RlbGVwaG9uZU51bWJlciAqLworMHg1NSwweDA0LDB4MTUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3MzldIE9CSl90ZWxleE51bWJlciAqLworMHg1NSwweDA0LDB4MTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NDJdIE9CSl90ZWxldGV4VGVybWluYWxJZGVudGlmaWVyICovCisweDU1LDB4MDQsMHgxNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc0NV0gT0JKX2ZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciAqLworMHg1NSwweDA0LDB4MTgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NDhdIE9CSl94MTIxQWRkcmVzcyAqLworMHg1NSwweDA0LDB4MTksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NTFdIE9CSl9pbnRlcm5hdGlvbmFsaVNETk51bWJlciAqLworMHg1NSwweDA0LDB4MUEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NTRdIE9CSl9yZWdpc3RlcmVkQWRkcmVzcyAqLworMHg1NSwweDA0LDB4MUIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NTddIE9CSl9kZXN0aW5hdGlvbkluZGljYXRvciAqLworMHg1NSwweDA0LDB4MUMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NjBdIE9CSl9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZCAqLworMHg1NSwweDA0LDB4MUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NjNdIE9CSl9wcmVzZW50YXRpb25BZGRyZXNzICovCisweDU1LDB4MDQsMHgxRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc2Nl0gT0JKX3N1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCAqLworMHg1NSwweDA0LDB4MUYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3NjldIE9CSl9tZW1iZXIgKi8KKzB4NTUsMHgwNCwweDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NzcyXSBPQkpfb3duZXIgKi8KKzB4NTUsMHgwNCwweDIxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1Nzc1XSBPQkpfcm9sZU9jY3VwYW50ICovCisweDU1LDB4MDQsMHgyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc3OF0gT0JKX3NlZUFsc28gKi8KKzB4NTUsMHgwNCwweDIzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1NzgxXSBPQkpfdXNlclBhc3N3b3JkICovCisweDU1LDB4MDQsMHgyNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc4NF0gT0JKX3VzZXJDZXJ0aWZpY2F0ZSAqLworMHg1NSwweDA0LDB4MjUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU3ODddIE9CSl9jQUNlcnRpZmljYXRlICovCisweDU1LDB4MDQsMHgyNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc5MF0gT0JKX2F1dGhvcml0eVJldm9jYXRpb25MaXN0ICovCisweDU1LDB4MDQsMHgyNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTc5M10gT0JKX2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QgKi8KKzB4NTUsMHgwNCwweDI4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1Nzk2XSBPQkpfY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIgKi8KKzB4NTUsMHgwNCwweDJGLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1Nzk5XSBPQkpfZW5oYW5jZWRTZWFyY2hHdWlkZSAqLworMHg1NSwweDA0LDB4MzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU4MDJdIE9CSl9wcm90b2NvbEluZm9ybWF0aW9uICovCisweDU1LDB4MDQsMHgzMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTgwNV0gT0JKX2Rpc3Rpbmd1aXNoZWROYW1lICovCisweDU1LDB4MDQsMHgzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTgwOF0gT0JKX3VuaXF1ZU1lbWJlciAqLworMHg1NSwweDA0LDB4MzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU4MTFdIE9CSl9ob3VzZUlkZW50aWZpZXIgKi8KKzB4NTUsMHgwNCwweDM0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFs1ODE0XSBPQkpfc3VwcG9ydGVkQWxnb3JpdGhtcyAqLworMHg1NSwweDA0LDB4MzUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWzU4MTddIE9CSl9kZWx0YVJldm9jYXRpb25MaXN0ICovCisweDU1LDB4MDQsMHgzNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBbNTgyMF0gT0JKX2RtZE5hbWUgKi8KK307CisKK3N0YXRpYyBjb25zdCBBU04xX09CSkVDVCBuaWRfb2Jqc1tOVU1fTklEXT17Cit7IlVOREVGIiwidW5kZWZpbmVkIixOSURfdW5kZWYsMSwmKGx2YWx1ZXNbMF0pLDB9LAoreyJyc2Fkc2kiLCJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiIsTklEX3JzYWRzaSw2LCYobHZhbHVlc1sxXSksMH0sCit7InBrY3MiLCJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBQS0NTIixOSURfcGtjcyw3LCYobHZhbHVlc1s3XSksMH0sCit7Ik1EMiIsIm1kMiIsTklEX21kMiw4LCYobHZhbHVlc1sxNF0pLDB9LAoreyJNRDUiLCJtZDUiLE5JRF9tZDUsOCwmKGx2YWx1ZXNbMjJdKSwwfSwKK3siUkM0IiwicmM0IixOSURfcmM0LDgsJihsdmFsdWVzWzMwXSksMH0sCit7InJzYUVuY3J5cHRpb24iLCJyc2FFbmNyeXB0aW9uIixOSURfcnNhRW5jcnlwdGlvbiw5LCYobHZhbHVlc1szOF0pLDB9LAoreyJSU0EtTUQyIiwibWQyV2l0aFJTQUVuY3J5cHRpb24iLE5JRF9tZDJXaXRoUlNBRW5jcnlwdGlvbiw5LAorCSYobHZhbHVlc1s0N10pLDB9LAoreyJSU0EtTUQ1IiwibWQ1V2l0aFJTQUVuY3J5cHRpb24iLE5JRF9tZDVXaXRoUlNBRW5jcnlwdGlvbiw5LAorCSYobHZhbHVlc1s1Nl0pLDB9LAoreyJQQkUtTUQyLURFUyIsInBiZVdpdGhNRDJBbmRERVMtQ0JDIixOSURfcGJlV2l0aE1EMkFuZERFU19DQkMsOSwKKwkmKGx2YWx1ZXNbNjVdKSwwfSwKK3siUEJFLU1ENS1ERVMiLCJwYmVXaXRoTUQ1QW5kREVTLUNCQyIsTklEX3BiZVdpdGhNRDVBbmRERVNfQ0JDLDksCisJJihsdmFsdWVzWzc0XSksMH0sCit7Ilg1MDAiLCJkaXJlY3Rvcnkgc2VydmljZXMgKFguNTAwKSIsTklEX1g1MDAsMSwmKGx2YWx1ZXNbODNdKSwwfSwKK3siWDUwOSIsIlg1MDkiLE5JRF9YNTA5LDIsJihsdmFsdWVzWzg0XSksMH0sCit7IkNOIiwiY29tbW9uTmFtZSIsTklEX2NvbW1vbk5hbWUsMywmKGx2YWx1ZXNbODZdKSwwfSwKK3siQyIsImNvdW50cnlOYW1lIixOSURfY291bnRyeU5hbWUsMywmKGx2YWx1ZXNbODldKSwwfSwKK3siTCIsImxvY2FsaXR5TmFtZSIsTklEX2xvY2FsaXR5TmFtZSwzLCYobHZhbHVlc1s5Ml0pLDB9LAoreyJTVCIsInN0YXRlT3JQcm92aW5jZU5hbWUiLE5JRF9zdGF0ZU9yUHJvdmluY2VOYW1lLDMsJihsdmFsdWVzWzk1XSksMH0sCit7Ik8iLCJvcmdhbml6YXRpb25OYW1lIixOSURfb3JnYW5pemF0aW9uTmFtZSwzLCYobHZhbHVlc1s5OF0pLDB9LAoreyJPVSIsIm9yZ2FuaXphdGlvbmFsVW5pdE5hbWUiLE5JRF9vcmdhbml6YXRpb25hbFVuaXROYW1lLDMsCisJJihsdmFsdWVzWzEwMV0pLDB9LAoreyJSU0EiLCJyc2EiLE5JRF9yc2EsNCwmKGx2YWx1ZXNbMTA0XSksMH0sCit7InBrY3M3IiwicGtjczciLE5JRF9wa2NzNyw4LCYobHZhbHVlc1sxMDhdKSwwfSwKK3sicGtjczctZGF0YSIsInBrY3M3LWRhdGEiLE5JRF9wa2NzN19kYXRhLDksJihsdmFsdWVzWzExNl0pLDB9LAoreyJwa2NzNy1zaWduZWREYXRhIiwicGtjczctc2lnbmVkRGF0YSIsTklEX3BrY3M3X3NpZ25lZCw5LAorCSYobHZhbHVlc1sxMjVdKSwwfSwKK3sicGtjczctZW52ZWxvcGVkRGF0YSIsInBrY3M3LWVudmVsb3BlZERhdGEiLE5JRF9wa2NzN19lbnZlbG9wZWQsOSwKKwkmKGx2YWx1ZXNbMTM0XSksMH0sCit7InBrY3M3LXNpZ25lZEFuZEVudmVsb3BlZERhdGEiLCJwa2NzNy1zaWduZWRBbmRFbnZlbG9wZWREYXRhIiwKKwlOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkLDksJihsdmFsdWVzWzE0M10pLDB9LAoreyJwa2NzNy1kaWdlc3REYXRhIiwicGtjczctZGlnZXN0RGF0YSIsTklEX3BrY3M3X2RpZ2VzdCw5LAorCSYobHZhbHVlc1sxNTJdKSwwfSwKK3sicGtjczctZW5jcnlwdGVkRGF0YSIsInBrY3M3LWVuY3J5cHRlZERhdGEiLE5JRF9wa2NzN19lbmNyeXB0ZWQsOSwKKwkmKGx2YWx1ZXNbMTYxXSksMH0sCit7InBrY3MzIiwicGtjczMiLE5JRF9wa2NzMyw4LCYobHZhbHVlc1sxNzBdKSwwfSwKK3siZGhLZXlBZ3JlZW1lbnQiLCJkaEtleUFncmVlbWVudCIsTklEX2RoS2V5QWdyZWVtZW50LDksCisJJihsdmFsdWVzWzE3OF0pLDB9LAoreyJERVMtRUNCIiwiZGVzLWVjYiIsTklEX2Rlc19lY2IsNSwmKGx2YWx1ZXNbMTg3XSksMH0sCit7IkRFUy1DRkIiLCJkZXMtY2ZiIixOSURfZGVzX2NmYjY0LDUsJihsdmFsdWVzWzE5Ml0pLDB9LAoreyJERVMtQ0JDIiwiZGVzLWNiYyIsTklEX2Rlc19jYmMsNSwmKGx2YWx1ZXNbMTk3XSksMH0sCit7IkRFUy1FREUiLCJkZXMtZWRlIixOSURfZGVzX2VkZV9lY2IsNSwmKGx2YWx1ZXNbMjAyXSksMH0sCit7IkRFUy1FREUzIiwiZGVzLWVkZTMiLE5JRF9kZXNfZWRlM19lY2IsMCxOVUxMLDB9LAoreyJJREVBLUNCQyIsImlkZWEtY2JjIixOSURfaWRlYV9jYmMsMTEsJihsdmFsdWVzWzIwN10pLDB9LAoreyJJREVBLUNGQiIsImlkZWEtY2ZiIixOSURfaWRlYV9jZmI2NCwwLE5VTEwsMH0sCit7IklERUEtRUNCIiwiaWRlYS1lY2IiLE5JRF9pZGVhX2VjYiwwLE5VTEwsMH0sCit7IlJDMi1DQkMiLCJyYzItY2JjIixOSURfcmMyX2NiYyw4LCYobHZhbHVlc1syMThdKSwwfSwKK3siUkMyLUVDQiIsInJjMi1lY2IiLE5JRF9yYzJfZWNiLDAsTlVMTCwwfSwKK3siUkMyLUNGQiIsInJjMi1jZmIiLE5JRF9yYzJfY2ZiNjQsMCxOVUxMLDB9LAoreyJSQzItT0ZCIiwicmMyLW9mYiIsTklEX3JjMl9vZmI2NCwwLE5VTEwsMH0sCit7IlNIQSIsInNoYSIsTklEX3NoYSw1LCYobHZhbHVlc1syMjZdKSwwfSwKK3siUlNBLVNIQSIsInNoYVdpdGhSU0FFbmNyeXB0aW9uIixOSURfc2hhV2l0aFJTQUVuY3J5cHRpb24sNSwKKwkmKGx2YWx1ZXNbMjMxXSksMH0sCit7IkRFUy1FREUtQ0JDIiwiZGVzLWVkZS1jYmMiLE5JRF9kZXNfZWRlX2NiYywwLE5VTEwsMH0sCit7IkRFUy1FREUzLUNCQyIsImRlcy1lZGUzLWNiYyIsTklEX2Rlc19lZGUzX2NiYyw4LCYobHZhbHVlc1syMzZdKSwwfSwKK3siREVTLU9GQiIsImRlcy1vZmIiLE5JRF9kZXNfb2ZiNjQsNSwmKGx2YWx1ZXNbMjQ0XSksMH0sCit7IklERUEtT0ZCIiwiaWRlYS1vZmIiLE5JRF9pZGVhX29mYjY0LDAsTlVMTCwwfSwKK3sicGtjczkiLCJwa2NzOSIsTklEX3BrY3M5LDgsJihsdmFsdWVzWzI0OV0pLDB9LAoreyJlbWFpbEFkZHJlc3MiLCJlbWFpbEFkZHJlc3MiLE5JRF9wa2NzOV9lbWFpbEFkZHJlc3MsOSwKKwkmKGx2YWx1ZXNbMjU3XSksMH0sCit7InVuc3RydWN0dXJlZE5hbWUiLCJ1bnN0cnVjdHVyZWROYW1lIixOSURfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZSw5LAorCSYobHZhbHVlc1syNjZdKSwwfSwKK3siY29udGVudFR5cGUiLCJjb250ZW50VHlwZSIsTklEX3BrY3M5X2NvbnRlbnRUeXBlLDksJihsdmFsdWVzWzI3NV0pLDB9LAoreyJtZXNzYWdlRGlnZXN0IiwibWVzc2FnZURpZ2VzdCIsTklEX3BrY3M5X21lc3NhZ2VEaWdlc3QsOSwKKwkmKGx2YWx1ZXNbMjg0XSksMH0sCit7InNpZ25pbmdUaW1lIiwic2lnbmluZ1RpbWUiLE5JRF9wa2NzOV9zaWduaW5nVGltZSw5LCYobHZhbHVlc1syOTNdKSwwfSwKK3siY291bnRlcnNpZ25hdHVyZSIsImNvdW50ZXJzaWduYXR1cmUiLE5JRF9wa2NzOV9jb3VudGVyc2lnbmF0dXJlLDksCisJJihsdmFsdWVzWzMwMl0pLDB9LAoreyJjaGFsbGVuZ2VQYXNzd29yZCIsImNoYWxsZW5nZVBhc3N3b3JkIixOSURfcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQsCisJOSwmKGx2YWx1ZXNbMzExXSksMH0sCit7InVuc3RydWN0dXJlZEFkZHJlc3MiLCJ1bnN0cnVjdHVyZWRBZGRyZXNzIiwKKwlOSURfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcyw5LCYobHZhbHVlc1szMjBdKSwwfSwKK3siZXh0ZW5kZWRDZXJ0aWZpY2F0ZUF0dHJpYnV0ZXMiLCJleHRlbmRlZENlcnRpZmljYXRlQXR0cmlidXRlcyIsCisJTklEX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzLDksJihsdmFsdWVzWzMyOV0pLDB9LAoreyJOZXRzY2FwZSIsIk5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnAuIixOSURfbmV0c2NhcGUsNywKKwkmKGx2YWx1ZXNbMzM4XSksMH0sCit7Im5zQ2VydEV4dCIsIk5ldHNjYXBlIENlcnRpZmljYXRlIEV4dGVuc2lvbiIsCisJTklEX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDgsJihsdmFsdWVzWzM0NV0pLDB9LAoreyJuc0RhdGFUeXBlIiwiTmV0c2NhcGUgRGF0YSBUeXBlIixOSURfbmV0c2NhcGVfZGF0YV90eXBlLDgsCisJJihsdmFsdWVzWzM1M10pLDB9LAoreyJERVMtRURFLUNGQiIsImRlcy1lZGUtY2ZiIixOSURfZGVzX2VkZV9jZmI2NCwwLE5VTEwsMH0sCit7IkRFUy1FREUzLUNGQiIsImRlcy1lZGUzLWNmYiIsTklEX2Rlc19lZGUzX2NmYjY0LDAsTlVMTCwwfSwKK3siREVTLUVERS1PRkIiLCJkZXMtZWRlLW9mYiIsTklEX2Rlc19lZGVfb2ZiNjQsMCxOVUxMLDB9LAoreyJERVMtRURFMy1PRkIiLCJkZXMtZWRlMy1vZmIiLE5JRF9kZXNfZWRlM19vZmI2NCwwLE5VTEwsMH0sCit7IlNIQTEiLCJzaGExIixOSURfc2hhMSw1LCYobHZhbHVlc1szNjFdKSwwfSwKK3siUlNBLVNIQTEiLCJzaGExV2l0aFJTQUVuY3J5cHRpb24iLE5JRF9zaGExV2l0aFJTQUVuY3J5cHRpb24sOSwKKwkmKGx2YWx1ZXNbMzY2XSksMH0sCit7IkRTQS1TSEEiLCJkc2FXaXRoU0hBIixOSURfZHNhV2l0aFNIQSw1LCYobHZhbHVlc1szNzVdKSwwfSwKK3siRFNBLW9sZCIsImRzYUVuY3J5cHRpb24tb2xkIixOSURfZHNhXzIsNSwmKGx2YWx1ZXNbMzgwXSksMH0sCit7IlBCRS1TSEExLVJDMi02NCIsInBiZVdpdGhTSEExQW5kUkMyLUNCQyIsTklEX3BiZVdpdGhTSEExQW5kUkMyX0NCQywKKwk5LCYobHZhbHVlc1szODVdKSwwfSwKK3siUEJLREYyIiwiUEJLREYyIixOSURfaWRfcGJrZGYyLDksJihsdmFsdWVzWzM5NF0pLDB9LAoreyJEU0EtU0hBMS1vbGQiLCJkc2FXaXRoU0hBMS1vbGQiLE5JRF9kc2FXaXRoU0hBMV8yLDUsJihsdmFsdWVzWzQwM10pLDB9LAoreyJuc0NlcnRUeXBlIiwiTmV0c2NhcGUgQ2VydCBUeXBlIixOSURfbmV0c2NhcGVfY2VydF90eXBlLDksCisJJihsdmFsdWVzWzQwOF0pLDB9LAoreyJuc0Jhc2VVcmwiLCJOZXRzY2FwZSBCYXNlIFVybCIsTklEX25ldHNjYXBlX2Jhc2VfdXJsLDksCisJJihsdmFsdWVzWzQxN10pLDB9LAoreyJuc1Jldm9jYXRpb25VcmwiLCJOZXRzY2FwZSBSZXZvY2F0aW9uIFVybCIsCisJTklEX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsLDksJihsdmFsdWVzWzQyNl0pLDB9LAoreyJuc0NhUmV2b2NhdGlvblVybCIsIk5ldHNjYXBlIENBIFJldm9jYXRpb24gVXJsIiwKKwlOSURfbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwsOSwmKGx2YWx1ZXNbNDM1XSksMH0sCit7Im5zUmVuZXdhbFVybCIsIk5ldHNjYXBlIFJlbmV3YWwgVXJsIixOSURfbmV0c2NhcGVfcmVuZXdhbF91cmwsOSwKKwkmKGx2YWx1ZXNbNDQ0XSksMH0sCit7Im5zQ2FQb2xpY3lVcmwiLCJOZXRzY2FwZSBDQSBQb2xpY3kgVXJsIixOSURfbmV0c2NhcGVfY2FfcG9saWN5X3VybCwKKwk5LCYobHZhbHVlc1s0NTNdKSwwfSwKK3sibnNTc2xTZXJ2ZXJOYW1lIiwiTmV0c2NhcGUgU1NMIFNlcnZlciBOYW1lIiwKKwlOSURfbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lLDksJihsdmFsdWVzWzQ2Ml0pLDB9LAoreyJuc0NvbW1lbnQiLCJOZXRzY2FwZSBDb21tZW50IixOSURfbmV0c2NhcGVfY29tbWVudCw5LCYobHZhbHVlc1s0NzFdKSwwfSwKK3sibnNDZXJ0U2VxdWVuY2UiLCJOZXRzY2FwZSBDZXJ0aWZpY2F0ZSBTZXF1ZW5jZSIsCisJTklEX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UsOSwmKGx2YWx1ZXNbNDgwXSksMH0sCit7IkRFU1gtQ0JDIiwiZGVzeC1jYmMiLE5JRF9kZXN4X2NiYywwLE5VTEwsMH0sCit7ImlkLWNlIiwiaWQtY2UiLE5JRF9pZF9jZSwyLCYobHZhbHVlc1s0ODldKSwwfSwKK3sic3ViamVjdEtleUlkZW50aWZpZXIiLCJYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllciIsCisJTklEX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIsMywmKGx2YWx1ZXNbNDkxXSksMH0sCit7ImtleVVzYWdlIiwiWDUwOXYzIEtleSBVc2FnZSIsTklEX2tleV91c2FnZSwzLCYobHZhbHVlc1s0OTRdKSwwfSwKK3sicHJpdmF0ZUtleVVzYWdlUGVyaW9kIiwiWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZCIsCisJTklEX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZCwzLCYobHZhbHVlc1s0OTddKSwwfSwKK3sic3ViamVjdEFsdE5hbWUiLCJYNTA5djMgU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lIiwKKwlOSURfc3ViamVjdF9hbHRfbmFtZSwzLCYobHZhbHVlc1s1MDBdKSwwfSwKK3siaXNzdWVyQWx0TmFtZSIsIlg1MDl2MyBJc3N1ZXIgQWx0ZXJuYXRpdmUgTmFtZSIsTklEX2lzc3Vlcl9hbHRfbmFtZSwKKwkzLCYobHZhbHVlc1s1MDNdKSwwfSwKK3siYmFzaWNDb25zdHJhaW50cyIsIlg1MDl2MyBCYXNpYyBDb25zdHJhaW50cyIsTklEX2Jhc2ljX2NvbnN0cmFpbnRzLAorCTMsJihsdmFsdWVzWzUwNl0pLDB9LAoreyJjcmxOdW1iZXIiLCJYNTA5djMgQ1JMIE51bWJlciIsTklEX2NybF9udW1iZXIsMywmKGx2YWx1ZXNbNTA5XSksMH0sCit7ImNlcnRpZmljYXRlUG9saWNpZXMiLCJYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXMiLAorCU5JRF9jZXJ0aWZpY2F0ZV9wb2xpY2llcywzLCYobHZhbHVlc1s1MTJdKSwwfSwKK3siYXV0aG9yaXR5S2V5SWRlbnRpZmllciIsIlg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXIiLAorCU5JRF9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIsMywmKGx2YWx1ZXNbNTE1XSksMH0sCit7IkJGLUNCQyIsImJmLWNiYyIsTklEX2JmX2NiYyw5LCYobHZhbHVlc1s1MThdKSwwfSwKK3siQkYtRUNCIiwiYmYtZWNiIixOSURfYmZfZWNiLDAsTlVMTCwwfSwKK3siQkYtQ0ZCIiwiYmYtY2ZiIixOSURfYmZfY2ZiNjQsMCxOVUxMLDB9LAoreyJCRi1PRkIiLCJiZi1vZmIiLE5JRF9iZl9vZmI2NCwwLE5VTEwsMH0sCit7Ik1EQzIiLCJtZGMyIixOSURfbWRjMiw0LCYobHZhbHVlc1s1MjddKSwwfSwKK3siUlNBLU1EQzIiLCJtZGMyV2l0aFJTQSIsTklEX21kYzJXaXRoUlNBLDQsJihsdmFsdWVzWzUzMV0pLDB9LAoreyJSQzQtNDAiLCJyYzQtNDAiLE5JRF9yYzRfNDAsMCxOVUxMLDB9LAoreyJSQzItNDAtQ0JDIiwicmMyLTQwLWNiYyIsTklEX3JjMl80MF9jYmMsMCxOVUxMLDB9LAoreyJHTiIsImdpdmVuTmFtZSIsTklEX2dpdmVuTmFtZSwzLCYobHZhbHVlc1s1MzVdKSwwfSwKK3siU04iLCJzdXJuYW1lIixOSURfc3VybmFtZSwzLCYobHZhbHVlc1s1MzhdKSwwfSwKK3siaW5pdGlhbHMiLCJpbml0aWFscyIsTklEX2luaXRpYWxzLDMsJihsdmFsdWVzWzU0MV0pLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAoreyJjcmxEaXN0cmlidXRpb25Qb2ludHMiLCJYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHMiLAorCU5JRF9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cywzLCYobHZhbHVlc1s1NDRdKSwwfSwKK3siUlNBLU5QLU1ENSIsIm1kNVdpdGhSU0EiLE5JRF9tZDVXaXRoUlNBLDUsJihsdmFsdWVzWzU0N10pLDB9LAoreyJzZXJpYWxOdW1iZXIiLCJzZXJpYWxOdW1iZXIiLE5JRF9zZXJpYWxOdW1iZXIsMywmKGx2YWx1ZXNbNTUyXSksMH0sCit7InRpdGxlIiwidGl0bGUiLE5JRF90aXRsZSwzLCYobHZhbHVlc1s1NTVdKSwwfSwKK3siZGVzY3JpcHRpb24iLCJkZXNjcmlwdGlvbiIsTklEX2Rlc2NyaXB0aW9uLDMsJihsdmFsdWVzWzU1OF0pLDB9LAoreyJDQVNUNS1DQkMiLCJjYXN0NS1jYmMiLE5JRF9jYXN0NV9jYmMsOSwmKGx2YWx1ZXNbNTYxXSksMH0sCit7IkNBU1Q1LUVDQiIsImNhc3Q1LWVjYiIsTklEX2Nhc3Q1X2VjYiwwLE5VTEwsMH0sCit7IkNBU1Q1LUNGQiIsImNhc3Q1LWNmYiIsTklEX2Nhc3Q1X2NmYjY0LDAsTlVMTCwwfSwKK3siQ0FTVDUtT0ZCIiwiY2FzdDUtb2ZiIixOSURfY2FzdDVfb2ZiNjQsMCxOVUxMLDB9LAoreyJwYmVXaXRoTUQ1QW5kQ2FzdDVDQkMiLCJwYmVXaXRoTUQ1QW5kQ2FzdDVDQkMiLAorCU5JRF9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDLDksJihsdmFsdWVzWzU3MF0pLDB9LAoreyJEU0EtU0hBMSIsImRzYVdpdGhTSEExIixOSURfZHNhV2l0aFNIQTEsNywmKGx2YWx1ZXNbNTc5XSksMH0sCit7Ik1ENS1TSEExIiwibWQ1LXNoYTEiLE5JRF9tZDVfc2hhMSwwLE5VTEwsMH0sCit7IlJTQS1TSEExLTIiLCJzaGExV2l0aFJTQSIsTklEX3NoYTFXaXRoUlNBLDUsJihsdmFsdWVzWzU4Nl0pLDB9LAoreyJEU0EiLCJkc2FFbmNyeXB0aW9uIixOSURfZHNhLDcsJihsdmFsdWVzWzU5MV0pLDB9LAoreyJSSVBFTUQxNjAiLCJyaXBlbWQxNjAiLE5JRF9yaXBlbWQxNjAsNSwmKGx2YWx1ZXNbNTk4XSksMH0sCit7TlVMTCxOVUxMLE5JRF91bmRlZiwwLE5VTEwsMH0sCit7IlJTQS1SSVBFTUQxNjAiLCJyaXBlbWQxNjBXaXRoUlNBIixOSURfcmlwZW1kMTYwV2l0aFJTQSw2LAorCSYobHZhbHVlc1s2MDNdKSwwfSwKK3siUkM1LUNCQyIsInJjNS1jYmMiLE5JRF9yYzVfY2JjLDgsJihsdmFsdWVzWzYwOV0pLDB9LAoreyJSQzUtRUNCIiwicmM1LWVjYiIsTklEX3JjNV9lY2IsMCxOVUxMLDB9LAoreyJSQzUtQ0ZCIiwicmM1LWNmYiIsTklEX3JjNV9jZmI2NCwwLE5VTEwsMH0sCit7IlJDNS1PRkIiLCJyYzUtb2ZiIixOSURfcmM1X29mYjY0LDAsTlVMTCwwfSwKK3siUkxFIiwicnVuIGxlbmd0aCBjb21wcmVzc2lvbiIsTklEX3JsZV9jb21wcmVzc2lvbiw2LCYobHZhbHVlc1s2MTddKSwwfSwKK3siWkxJQiIsInpsaWIgY29tcHJlc3Npb24iLE5JRF96bGliX2NvbXByZXNzaW9uLDExLCYobHZhbHVlc1s2MjNdKSwwfSwKK3siZXh0ZW5kZWRLZXlVc2FnZSIsIlg1MDl2MyBFeHRlbmRlZCBLZXkgVXNhZ2UiLE5JRF9leHRfa2V5X3VzYWdlLDMsCisJJihsdmFsdWVzWzYzNF0pLDB9LAoreyJQS0lYIiwiUEtJWCIsTklEX2lkX3BraXgsNiwmKGx2YWx1ZXNbNjM3XSksMH0sCit7ImlkLWtwIiwiaWQta3AiLE5JRF9pZF9rcCw3LCYobHZhbHVlc1s2NDNdKSwwfSwKK3sic2VydmVyQXV0aCIsIlRMUyBXZWIgU2VydmVyIEF1dGhlbnRpY2F0aW9uIixOSURfc2VydmVyX2F1dGgsOCwKKwkmKGx2YWx1ZXNbNjUwXSksMH0sCit7ImNsaWVudEF1dGgiLCJUTFMgV2ViIENsaWVudCBBdXRoZW50aWNhdGlvbiIsTklEX2NsaWVudF9hdXRoLDgsCisJJihsdmFsdWVzWzY1OF0pLDB9LAoreyJjb2RlU2lnbmluZyIsIkNvZGUgU2lnbmluZyIsTklEX2NvZGVfc2lnbiw4LCYobHZhbHVlc1s2NjZdKSwwfSwKK3siZW1haWxQcm90ZWN0aW9uIiwiRS1tYWlsIFByb3RlY3Rpb24iLE5JRF9lbWFpbF9wcm90ZWN0LDgsCisJJihsdmFsdWVzWzY3NF0pLDB9LAoreyJ0aW1lU3RhbXBpbmciLCJUaW1lIFN0YW1waW5nIixOSURfdGltZV9zdGFtcCw4LCYobHZhbHVlc1s2ODJdKSwwfSwKK3sibXNDb2RlSW5kIiwiTWljcm9zb2Z0IEluZGl2aWR1YWwgQ29kZSBTaWduaW5nIixOSURfbXNfY29kZV9pbmQsMTAsCisJJihsdmFsdWVzWzY5MF0pLDB9LAoreyJtc0NvZGVDb20iLCJNaWNyb3NvZnQgQ29tbWVyY2lhbCBDb2RlIFNpZ25pbmciLE5JRF9tc19jb2RlX2NvbSwxMCwKKwkmKGx2YWx1ZXNbNzAwXSksMH0sCit7Im1zQ1RMU2lnbiIsIk1pY3Jvc29mdCBUcnVzdCBMaXN0IFNpZ25pbmciLE5JRF9tc19jdGxfc2lnbiwxMCwKKwkmKGx2YWx1ZXNbNzEwXSksMH0sCit7Im1zU0dDIiwiTWljcm9zb2Z0IFNlcnZlciBHYXRlZCBDcnlwdG8iLE5JRF9tc19zZ2MsMTAsJihsdmFsdWVzWzcyMF0pLDB9LAoreyJtc0VGUyIsIk1pY3Jvc29mdCBFbmNyeXB0ZWQgRmlsZSBTeXN0ZW0iLE5JRF9tc19lZnMsMTAsCisJJihsdmFsdWVzWzczMF0pLDB9LAoreyJuc1NHQyIsIk5ldHNjYXBlIFNlcnZlciBHYXRlZCBDcnlwdG8iLE5JRF9uc19zZ2MsOSwmKGx2YWx1ZXNbNzQwXSksMH0sCit7ImRlbHRhQ1JMIiwiWDUwOXYzIERlbHRhIENSTCBJbmRpY2F0b3IiLE5JRF9kZWx0YV9jcmwsMywKKwkmKGx2YWx1ZXNbNzQ5XSksMH0sCit7IkNSTFJlYXNvbiIsIlg1MDl2MyBDUkwgUmVhc29uIENvZGUiLE5JRF9jcmxfcmVhc29uLDMsJihsdmFsdWVzWzc1Ml0pLDB9LAoreyJpbnZhbGlkaXR5RGF0ZSIsIkludmFsaWRpdHkgRGF0ZSIsTklEX2ludmFsaWRpdHlfZGF0ZSwzLAorCSYobHZhbHVlc1s3NTVdKSwwfSwKK3siU1hOZXRJRCIsIlN0cm9uZyBFeHRyYW5ldCBJRCIsTklEX3N4bmV0LDUsJihsdmFsdWVzWzc1OF0pLDB9LAoreyJQQkUtU0hBMS1SQzQtMTI4IiwicGJlV2l0aFNIQTFBbmQxMjhCaXRSQzQiLAorCU5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQsMTAsJihsdmFsdWVzWzc2M10pLDB9LAoreyJQQkUtU0hBMS1SQzQtNDAiLCJwYmVXaXRoU0hBMUFuZDQwQml0UkM0IiwKKwlOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQsMTAsJihsdmFsdWVzWzc3M10pLDB9LAoreyJQQkUtU0hBMS0zREVTIiwicGJlV2l0aFNIQTFBbmQzLUtleVRyaXBsZURFUy1DQkMiLAorCU5JRF9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDLDEwLCYobHZhbHVlc1s3ODNdKSwwfSwKK3siUEJFLVNIQTEtMkRFUyIsInBiZVdpdGhTSEExQW5kMi1LZXlUcmlwbGVERVMtQ0JDIiwKKwlOSURfcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQywxMCwmKGx2YWx1ZXNbNzkzXSksMH0sCit7IlBCRS1TSEExLVJDMi0xMjgiLCJwYmVXaXRoU0hBMUFuZDEyOEJpdFJDMi1DQkMiLAorCU5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDLDEwLCYobHZhbHVlc1s4MDNdKSwwfSwKK3siUEJFLVNIQTEtUkMyLTQwIiwicGJlV2l0aFNIQTFBbmQ0MEJpdFJDMi1DQkMiLAorCU5JRF9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMsMTAsJihsdmFsdWVzWzgxM10pLDB9LAoreyJrZXlCYWciLCJrZXlCYWciLE5JRF9rZXlCYWcsMTEsJihsdmFsdWVzWzgyM10pLDB9LAoreyJwa2NzOFNocm91ZGVkS2V5QmFnIiwicGtjczhTaHJvdWRlZEtleUJhZyIsTklEX3BrY3M4U2hyb3VkZWRLZXlCYWcsCisJMTEsJihsdmFsdWVzWzgzNF0pLDB9LAoreyJjZXJ0QmFnIiwiY2VydEJhZyIsTklEX2NlcnRCYWcsMTEsJihsdmFsdWVzWzg0NV0pLDB9LAoreyJjcmxCYWciLCJjcmxCYWciLE5JRF9jcmxCYWcsMTEsJihsdmFsdWVzWzg1Nl0pLDB9LAoreyJzZWNyZXRCYWciLCJzZWNyZXRCYWciLE5JRF9zZWNyZXRCYWcsMTEsJihsdmFsdWVzWzg2N10pLDB9LAoreyJzYWZlQ29udGVudHNCYWciLCJzYWZlQ29udGVudHNCYWciLE5JRF9zYWZlQ29udGVudHNCYWcsMTEsCisJJihsdmFsdWVzWzg3OF0pLDB9LAoreyJmcmllbmRseU5hbWUiLCJmcmllbmRseU5hbWUiLE5JRF9mcmllbmRseU5hbWUsOSwmKGx2YWx1ZXNbODg5XSksMH0sCit7ImxvY2FsS2V5SUQiLCJsb2NhbEtleUlEIixOSURfbG9jYWxLZXlJRCw5LCYobHZhbHVlc1s4OThdKSwwfSwKK3sieDUwOUNlcnRpZmljYXRlIiwieDUwOUNlcnRpZmljYXRlIixOSURfeDUwOUNlcnRpZmljYXRlLDEwLAorCSYobHZhbHVlc1s5MDddKSwwfSwKK3sic2RzaUNlcnRpZmljYXRlIiwic2RzaUNlcnRpZmljYXRlIixOSURfc2RzaUNlcnRpZmljYXRlLDEwLAorCSYobHZhbHVlc1s5MTddKSwwfSwKK3sieDUwOUNybCIsIng1MDlDcmwiLE5JRF94NTA5Q3JsLDEwLCYobHZhbHVlc1s5MjddKSwwfSwKK3siUEJFUzIiLCJQQkVTMiIsTklEX3BiZXMyLDksJihsdmFsdWVzWzkzN10pLDB9LAoreyJQQk1BQzEiLCJQQk1BQzEiLE5JRF9wYm1hYzEsOSwmKGx2YWx1ZXNbOTQ2XSksMH0sCit7ImhtYWNXaXRoU0hBMSIsImhtYWNXaXRoU0hBMSIsTklEX2htYWNXaXRoU0hBMSw4LCYobHZhbHVlc1s5NTVdKSwwfSwKK3siaWQtcXQtY3BzIiwiUG9saWN5IFF1YWxpZmllciBDUFMiLE5JRF9pZF9xdF9jcHMsOCwmKGx2YWx1ZXNbOTYzXSksMH0sCit7ImlkLXF0LXVub3RpY2UiLCJQb2xpY3kgUXVhbGlmaWVyIFVzZXIgTm90aWNlIixOSURfaWRfcXRfdW5vdGljZSw4LAorCSYobHZhbHVlc1s5NzFdKSwwfSwKK3siUkMyLTY0LUNCQyIsInJjMi02NC1jYmMiLE5JRF9yYzJfNjRfY2JjLDAsTlVMTCwwfSwKK3siU01JTUUtQ0FQUyIsIlMvTUlNRSBDYXBhYmlsaXRpZXMiLE5JRF9TTUlNRUNhcGFiaWxpdGllcyw5LAorCSYobHZhbHVlc1s5NzldKSwwfSwKK3siUEJFLU1EMi1SQzItNjQiLCJwYmVXaXRoTUQyQW5kUkMyLUNCQyIsTklEX3BiZVdpdGhNRDJBbmRSQzJfQ0JDLDksCisJJihsdmFsdWVzWzk4OF0pLDB9LAoreyJQQkUtTUQ1LVJDMi02NCIsInBiZVdpdGhNRDVBbmRSQzItQ0JDIixOSURfcGJlV2l0aE1ENUFuZFJDMl9DQkMsOSwKKwkmKGx2YWx1ZXNbOTk3XSksMH0sCit7IlBCRS1TSEExLURFUyIsInBiZVdpdGhTSEExQW5kREVTLUNCQyIsTklEX3BiZVdpdGhTSEExQW5kREVTX0NCQyw5LAorCSYobHZhbHVlc1sxMDA2XSksMH0sCit7Im1zRXh0UmVxIiwiTWljcm9zb2Z0IEV4dGVuc2lvbiBSZXF1ZXN0IixOSURfbXNfZXh0X3JlcSwxMCwKKwkmKGx2YWx1ZXNbMTAxNV0pLDB9LAoreyJleHRSZXEiLCJFeHRlbnNpb24gUmVxdWVzdCIsTklEX2V4dF9yZXEsOSwmKGx2YWx1ZXNbMTAyNV0pLDB9LAoreyJuYW1lIiwibmFtZSIsTklEX25hbWUsMywmKGx2YWx1ZXNbMTAzNF0pLDB9LAoreyJkblF1YWxpZmllciIsImRuUXVhbGlmaWVyIixOSURfZG5RdWFsaWZpZXIsMywmKGx2YWx1ZXNbMTAzN10pLDB9LAoreyJpZC1wZSIsImlkLXBlIixOSURfaWRfcGUsNywmKGx2YWx1ZXNbMTA0MF0pLDB9LAoreyJpZC1hZCIsImlkLWFkIixOSURfaWRfYWQsNywmKGx2YWx1ZXNbMTA0N10pLDB9LAoreyJhdXRob3JpdHlJbmZvQWNjZXNzIiwiQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzcyIsTklEX2luZm9fYWNjZXNzLAorCTgsJihsdmFsdWVzWzEwNTRdKSwwfSwKK3siT0NTUCIsIk9DU1AiLE5JRF9hZF9PQ1NQLDgsJihsdmFsdWVzWzEwNjJdKSwwfSwKK3siY2FJc3N1ZXJzIiwiQ0EgSXNzdWVycyIsTklEX2FkX2NhX2lzc3VlcnMsOCwmKGx2YWx1ZXNbMTA3MF0pLDB9LAoreyJPQ1NQU2lnbmluZyIsIk9DU1AgU2lnbmluZyIsTklEX09DU1Bfc2lnbiw4LCYobHZhbHVlc1sxMDc4XSksMH0sCit7IklTTyIsImlzbyIsTklEX2lzbywxLCYobHZhbHVlc1sxMDg2XSksMH0sCit7Im1lbWJlci1ib2R5IiwiSVNPIE1lbWJlciBCb2R5IixOSURfbWVtYmVyX2JvZHksMSwmKGx2YWx1ZXNbMTA4N10pLDB9LAoreyJJU08tVVMiLCJJU08gVVMgTWVtYmVyIEJvZHkiLE5JRF9JU09fVVMsMywmKGx2YWx1ZXNbMTA4OF0pLDB9LAoreyJYOS01NyIsIlg5LjU3IixOSURfWDlfNTcsNSwmKGx2YWx1ZXNbMTA5MV0pLDB9LAoreyJYOWNtIiwiWDkuNTcgQ00gPyIsTklEX1g5Y20sNiwmKGx2YWx1ZXNbMTA5Nl0pLDB9LAoreyJwa2NzMSIsInBrY3MxIixOSURfcGtjczEsOCwmKGx2YWx1ZXNbMTEwMl0pLDB9LAoreyJwa2NzNSIsInBrY3M1IixOSURfcGtjczUsOCwmKGx2YWx1ZXNbMTExMF0pLDB9LAoreyJTTUlNRSIsIlMvTUlNRSIsTklEX1NNSU1FLDksJihsdmFsdWVzWzExMThdKSwwfSwKK3siaWQtc21pbWUtbW9kIiwiaWQtc21pbWUtbW9kIixOSURfaWRfc21pbWVfbW9kLDEwLCYobHZhbHVlc1sxMTI3XSksMH0sCit7ImlkLXNtaW1lLWN0IiwiaWQtc21pbWUtY3QiLE5JRF9pZF9zbWltZV9jdCwxMCwmKGx2YWx1ZXNbMTEzN10pLDB9LAoreyJpZC1zbWltZS1hYSIsImlkLXNtaW1lLWFhIixOSURfaWRfc21pbWVfYWEsMTAsJihsdmFsdWVzWzExNDddKSwwfSwKK3siaWQtc21pbWUtYWxnIiwiaWQtc21pbWUtYWxnIixOSURfaWRfc21pbWVfYWxnLDEwLCYobHZhbHVlc1sxMTU3XSksMH0sCit7ImlkLXNtaW1lLWNkIiwiaWQtc21pbWUtY2QiLE5JRF9pZF9zbWltZV9jZCwxMCwmKGx2YWx1ZXNbMTE2N10pLDB9LAoreyJpZC1zbWltZS1zcHEiLCJpZC1zbWltZS1zcHEiLE5JRF9pZF9zbWltZV9zcHEsMTAsJihsdmFsdWVzWzExNzddKSwwfSwKK3siaWQtc21pbWUtY3RpIiwiaWQtc21pbWUtY3RpIixOSURfaWRfc21pbWVfY3RpLDEwLCYobHZhbHVlc1sxMTg3XSksMH0sCit7ImlkLXNtaW1lLW1vZC1jbXMiLCJpZC1zbWltZS1tb2QtY21zIixOSURfaWRfc21pbWVfbW9kX2NtcywxMSwKKwkmKGx2YWx1ZXNbMTE5N10pLDB9LAoreyJpZC1zbWltZS1tb2QtZXNzIiwiaWQtc21pbWUtbW9kLWVzcyIsTklEX2lkX3NtaW1lX21vZF9lc3MsMTEsCisJJihsdmFsdWVzWzEyMDhdKSwwfSwKK3siaWQtc21pbWUtbW9kLW9pZCIsImlkLXNtaW1lLW1vZC1vaWQiLE5JRF9pZF9zbWltZV9tb2Rfb2lkLDExLAorCSYobHZhbHVlc1sxMjE5XSksMH0sCit7ImlkLXNtaW1lLW1vZC1tc2ctdjMiLCJpZC1zbWltZS1tb2QtbXNnLXYzIixOSURfaWRfc21pbWVfbW9kX21zZ192MywKKwkxMSwmKGx2YWx1ZXNbMTIzMF0pLDB9LAoreyJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtODgiLCJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtODgiLAorCU5JRF9pZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfODgsMTEsJihsdmFsdWVzWzEyNDFdKSwwfSwKK3siaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTk3IiwiaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTk3IiwKKwlOSURfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzk3LDExLCYobHZhbHVlc1sxMjUyXSksMH0sCit7ImlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS04OCIsImlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS04OCIsCisJTklEX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV84OCwxMSwmKGx2YWx1ZXNbMTI2M10pLDB9LAoreyJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktOTciLCJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktOTciLAorCU5JRF9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfOTcsMTEsJihsdmFsdWVzWzEyNzRdKSwwfSwKK3siaWQtc21pbWUtY3QtcmVjZWlwdCIsImlkLXNtaW1lLWN0LXJlY2VpcHQiLE5JRF9pZF9zbWltZV9jdF9yZWNlaXB0LAorCTExLCYobHZhbHVlc1sxMjg1XSksMH0sCit7ImlkLXNtaW1lLWN0LWF1dGhEYXRhIiwiaWQtc21pbWUtY3QtYXV0aERhdGEiLAorCU5JRF9pZF9zbWltZV9jdF9hdXRoRGF0YSwxMSwmKGx2YWx1ZXNbMTI5Nl0pLDB9LAoreyJpZC1zbWltZS1jdC1wdWJsaXNoQ2VydCIsImlkLXNtaW1lLWN0LXB1Ymxpc2hDZXJ0IiwKKwlOSURfaWRfc21pbWVfY3RfcHVibGlzaENlcnQsMTEsJihsdmFsdWVzWzEzMDddKSwwfSwKK3siaWQtc21pbWUtY3QtVFNUSW5mbyIsImlkLXNtaW1lLWN0LVRTVEluZm8iLE5JRF9pZF9zbWltZV9jdF9UU1RJbmZvLAorCTExLCYobHZhbHVlc1sxMzE4XSksMH0sCit7ImlkLXNtaW1lLWN0LVREVEluZm8iLCJpZC1zbWltZS1jdC1URFRJbmZvIixOSURfaWRfc21pbWVfY3RfVERUSW5mbywKKwkxMSwmKGx2YWx1ZXNbMTMyOV0pLDB9LAoreyJpZC1zbWltZS1jdC1jb250ZW50SW5mbyIsImlkLXNtaW1lLWN0LWNvbnRlbnRJbmZvIiwKKwlOSURfaWRfc21pbWVfY3RfY29udGVudEluZm8sMTEsJihsdmFsdWVzWzEzNDBdKSwwfSwKK3siaWQtc21pbWUtY3QtRFZDU1JlcXVlc3REYXRhIiwiaWQtc21pbWUtY3QtRFZDU1JlcXVlc3REYXRhIiwKKwlOSURfaWRfc21pbWVfY3RfRFZDU1JlcXVlc3REYXRhLDExLCYobHZhbHVlc1sxMzUxXSksMH0sCit7ImlkLXNtaW1lLWN0LURWQ1NSZXNwb25zZURhdGEiLCJpZC1zbWltZS1jdC1EVkNTUmVzcG9uc2VEYXRhIiwKKwlOSURfaWRfc21pbWVfY3RfRFZDU1Jlc3BvbnNlRGF0YSwxMSwmKGx2YWx1ZXNbMTM2Ml0pLDB9LAoreyJpZC1zbWltZS1hYS1yZWNlaXB0UmVxdWVzdCIsImlkLXNtaW1lLWFhLXJlY2VpcHRSZXF1ZXN0IiwKKwlOSURfaWRfc21pbWVfYWFfcmVjZWlwdFJlcXVlc3QsMTEsJihsdmFsdWVzWzEzNzNdKSwwfSwKK3siaWQtc21pbWUtYWEtc2VjdXJpdHlMYWJlbCIsImlkLXNtaW1lLWFhLXNlY3VyaXR5TGFiZWwiLAorCU5JRF9pZF9zbWltZV9hYV9zZWN1cml0eUxhYmVsLDExLCYobHZhbHVlc1sxMzg0XSksMH0sCit7ImlkLXNtaW1lLWFhLW1sRXhwYW5kSGlzdG9yeSIsImlkLXNtaW1lLWFhLW1sRXhwYW5kSGlzdG9yeSIsCisJTklEX2lkX3NtaW1lX2FhX21sRXhwYW5kSGlzdG9yeSwxMSwmKGx2YWx1ZXNbMTM5NV0pLDB9LAoreyJpZC1zbWltZS1hYS1jb250ZW50SGludCIsImlkLXNtaW1lLWFhLWNvbnRlbnRIaW50IiwKKwlOSURfaWRfc21pbWVfYWFfY29udGVudEhpbnQsMTEsJihsdmFsdWVzWzE0MDZdKSwwfSwKK3siaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0IiwiaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0IiwKKwlOSURfaWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0LDExLCYobHZhbHVlc1sxNDE3XSksMH0sCit7ImlkLXNtaW1lLWFhLWVuY2FwQ29udGVudFR5cGUiLCJpZC1zbWltZS1hYS1lbmNhcENvbnRlbnRUeXBlIiwKKwlOSURfaWRfc21pbWVfYWFfZW5jYXBDb250ZW50VHlwZSwxMSwmKGx2YWx1ZXNbMTQyOF0pLDB9LAoreyJpZC1zbWltZS1hYS1jb250ZW50SWRlbnRpZmllciIsImlkLXNtaW1lLWFhLWNvbnRlbnRJZGVudGlmaWVyIiwKKwlOSURfaWRfc21pbWVfYWFfY29udGVudElkZW50aWZpZXIsMTEsJihsdmFsdWVzWzE0MzldKSwwfSwKK3siaWQtc21pbWUtYWEtbWFjVmFsdWUiLCJpZC1zbWltZS1hYS1tYWNWYWx1ZSIsCisJTklEX2lkX3NtaW1lX2FhX21hY1ZhbHVlLDExLCYobHZhbHVlc1sxNDUwXSksMH0sCit7ImlkLXNtaW1lLWFhLWVxdWl2YWxlbnRMYWJlbHMiLCJpZC1zbWltZS1hYS1lcXVpdmFsZW50TGFiZWxzIiwKKwlOSURfaWRfc21pbWVfYWFfZXF1aXZhbGVudExhYmVscywxMSwmKGx2YWx1ZXNbMTQ2MV0pLDB9LAoreyJpZC1zbWltZS1hYS1jb250ZW50UmVmZXJlbmNlIiwiaWQtc21pbWUtYWEtY29udGVudFJlZmVyZW5jZSIsCisJTklEX2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UsMTEsJihsdmFsdWVzWzE0NzJdKSwwfSwKK3siaWQtc21pbWUtYWEtZW5jcnlwS2V5UHJlZiIsImlkLXNtaW1lLWFhLWVuY3J5cEtleVByZWYiLAorCU5JRF9pZF9zbWltZV9hYV9lbmNyeXBLZXlQcmVmLDExLCYobHZhbHVlc1sxNDgzXSksMH0sCit7ImlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZSIsImlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZSIsCisJTklEX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZSwxMSwmKGx2YWx1ZXNbMTQ5NF0pLDB9LAoreyJpZC1zbWltZS1hYS1zbWltZUVuY3J5cHRDZXJ0cyIsImlkLXNtaW1lLWFhLXNtaW1lRW5jcnlwdENlcnRzIiwKKwlOSURfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMsMTEsJihsdmFsdWVzWzE1MDVdKSwwfSwKK3siaWQtc21pbWUtYWEtdGltZVN0YW1wVG9rZW4iLCJpZC1zbWltZS1hYS10aW1lU3RhbXBUb2tlbiIsCisJTklEX2lkX3NtaW1lX2FhX3RpbWVTdGFtcFRva2VuLDExLCYobHZhbHVlc1sxNTE2XSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1zaWdQb2xpY3lJZCIsImlkLXNtaW1lLWFhLWV0cy1zaWdQb2xpY3lJZCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19zaWdQb2xpY3lJZCwxMSwmKGx2YWx1ZXNbMTUyN10pLDB9LAoreyJpZC1zbWltZS1hYS1ldHMtY29tbWl0bWVudFR5cGUiLCJpZC1zbWltZS1hYS1ldHMtY29tbWl0bWVudFR5cGUiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfY29tbWl0bWVudFR5cGUsMTEsJihsdmFsdWVzWzE1MzhdKSwwfSwKK3siaWQtc21pbWUtYWEtZXRzLXNpZ25lckxvY2F0aW9uIiwiaWQtc21pbWUtYWEtZXRzLXNpZ25lckxvY2F0aW9uIiwKKwlOSURfaWRfc21pbWVfYWFfZXRzX3NpZ25lckxvY2F0aW9uLDExLCYobHZhbHVlc1sxNTQ5XSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1zaWduZXJBdHRyIiwiaWQtc21pbWUtYWEtZXRzLXNpZ25lckF0dHIiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfc2lnbmVyQXR0ciwxMSwmKGx2YWx1ZXNbMTU2MF0pLDB9LAoreyJpZC1zbWltZS1hYS1ldHMtb3RoZXJTaWdDZXJ0IiwiaWQtc21pbWUtYWEtZXRzLW90aGVyU2lnQ2VydCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19vdGhlclNpZ0NlcnQsMTEsJihsdmFsdWVzWzE1NzFdKSwwfSwKK3siaWQtc21pbWUtYWEtZXRzLWNvbnRlbnRUaW1lc3RhbXAiLAorCSJpZC1zbWltZS1hYS1ldHMtY29udGVudFRpbWVzdGFtcCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19jb250ZW50VGltZXN0YW1wLDExLCYobHZhbHVlc1sxNTgyXSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1DZXJ0aWZpY2F0ZVJlZnMiLCJpZC1zbWltZS1hYS1ldHMtQ2VydGlmaWNhdGVSZWZzIiwKKwlOSURfaWRfc21pbWVfYWFfZXRzX0NlcnRpZmljYXRlUmVmcywxMSwmKGx2YWx1ZXNbMTU5M10pLDB9LAoreyJpZC1zbWltZS1hYS1ldHMtUmV2b2NhdGlvblJlZnMiLCJpZC1zbWltZS1hYS1ldHMtUmV2b2NhdGlvblJlZnMiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfUmV2b2NhdGlvblJlZnMsMTEsJihsdmFsdWVzWzE2MDRdKSwwfSwKK3siaWQtc21pbWUtYWEtZXRzLWNlcnRWYWx1ZXMiLCJpZC1zbWltZS1hYS1ldHMtY2VydFZhbHVlcyIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19jZXJ0VmFsdWVzLDExLCYobHZhbHVlc1sxNjE1XSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1yZXZvY2F0aW9uVmFsdWVzIiwKKwkiaWQtc21pbWUtYWEtZXRzLXJldm9jYXRpb25WYWx1ZXMiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcywxMSwmKGx2YWx1ZXNbMTYyNl0pLDB9LAoreyJpZC1zbWltZS1hYS1ldHMtZXNjVGltZVN0YW1wIiwiaWQtc21pbWUtYWEtZXRzLWVzY1RpbWVTdGFtcCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19lc2NUaW1lU3RhbXAsMTEsJihsdmFsdWVzWzE2MzddKSwwfSwKK3siaWQtc21pbWUtYWEtZXRzLWNlcnRDUkxUaW1lc3RhbXAiLAorCSJpZC1zbWltZS1hYS1ldHMtY2VydENSTFRpbWVzdGFtcCIsCisJTklEX2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wLDExLCYobHZhbHVlc1sxNjQ4XSksMH0sCit7ImlkLXNtaW1lLWFhLWV0cy1hcmNoaXZlVGltZVN0YW1wIiwKKwkiaWQtc21pbWUtYWEtZXRzLWFyY2hpdmVUaW1lU3RhbXAiLAorCU5JRF9pZF9zbWltZV9hYV9ldHNfYXJjaGl2ZVRpbWVTdGFtcCwxMSwmKGx2YWx1ZXNbMTY1OV0pLDB9LAoreyJpZC1zbWltZS1hYS1zaWduYXR1cmVUeXBlIiwiaWQtc21pbWUtYWEtc2lnbmF0dXJlVHlwZSIsCisJTklEX2lkX3NtaW1lX2FhX3NpZ25hdHVyZVR5cGUsMTEsJihsdmFsdWVzWzE2NzBdKSwwfSwKK3siaWQtc21pbWUtYWEtZHZjcy1kdmMiLCJpZC1zbWltZS1hYS1kdmNzLWR2YyIsCisJTklEX2lkX3NtaW1lX2FhX2R2Y3NfZHZjLDExLCYobHZhbHVlc1sxNjgxXSksMH0sCit7ImlkLXNtaW1lLWFsZy1FU0RId2l0aDNERVMiLCJpZC1zbWltZS1hbGctRVNESHdpdGgzREVTIiwKKwlOSURfaWRfc21pbWVfYWxnX0VTREh3aXRoM0RFUywxMSwmKGx2YWx1ZXNbMTY5Ml0pLDB9LAoreyJpZC1zbWltZS1hbGctRVNESHdpdGhSQzIiLCJpZC1zbWltZS1hbGctRVNESHdpdGhSQzIiLAorCU5JRF9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIsMTEsJihsdmFsdWVzWzE3MDNdKSwwfSwKK3siaWQtc21pbWUtYWxnLTNERVN3cmFwIiwiaWQtc21pbWUtYWxnLTNERVN3cmFwIiwKKwlOSURfaWRfc21pbWVfYWxnXzNERVN3cmFwLDExLCYobHZhbHVlc1sxNzE0XSksMH0sCit7ImlkLXNtaW1lLWFsZy1SQzJ3cmFwIiwiaWQtc21pbWUtYWxnLVJDMndyYXAiLAorCU5JRF9pZF9zbWltZV9hbGdfUkMyd3JhcCwxMSwmKGx2YWx1ZXNbMTcyNV0pLDB9LAoreyJpZC1zbWltZS1hbGctRVNESCIsImlkLXNtaW1lLWFsZy1FU0RIIixOSURfaWRfc21pbWVfYWxnX0VTREgsMTEsCisJJihsdmFsdWVzWzE3MzZdKSwwfSwKK3siaWQtc21pbWUtYWxnLUNNUzNERVN3cmFwIiwiaWQtc21pbWUtYWxnLUNNUzNERVN3cmFwIiwKKwlOSURfaWRfc21pbWVfYWxnX0NNUzNERVN3cmFwLDExLCYobHZhbHVlc1sxNzQ3XSksMH0sCit7ImlkLXNtaW1lLWFsZy1DTVNSQzJ3cmFwIiwiaWQtc21pbWUtYWxnLUNNU1JDMndyYXAiLAorCU5JRF9pZF9zbWltZV9hbGdfQ01TUkMyd3JhcCwxMSwmKGx2YWx1ZXNbMTc1OF0pLDB9LAoreyJpZC1zbWltZS1jZC1sZGFwIiwiaWQtc21pbWUtY2QtbGRhcCIsTklEX2lkX3NtaW1lX2NkX2xkYXAsMTEsCisJJihsdmFsdWVzWzE3NjldKSwwfSwKK3siaWQtc21pbWUtc3BxLWV0cy1zcXQtdXJpIiwiaWQtc21pbWUtc3BxLWV0cy1zcXQtdXJpIiwKKwlOSURfaWRfc21pbWVfc3BxX2V0c19zcXRfdXJpLDExLCYobHZhbHVlc1sxNzgwXSksMH0sCit7ImlkLXNtaW1lLXNwcS1ldHMtc3F0LXVub3RpY2UiLCJpZC1zbWltZS1zcHEtZXRzLXNxdC11bm90aWNlIiwKKwlOSURfaWRfc21pbWVfc3BxX2V0c19zcXRfdW5vdGljZSwxMSwmKGx2YWx1ZXNbMTc5MV0pLDB9LAoreyJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZPcmlnaW4iLCJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZPcmlnaW4iLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZPcmlnaW4sMTEsJihsdmFsdWVzWzE4MDJdKSwwfSwKK3siaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mUmVjZWlwdCIsImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZlJlY2VpcHQiLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZSZWNlaXB0LDExLCYobHZhbHVlc1sxODEzXSksMH0sCit7ImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkRlbGl2ZXJ5IiwKKwkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mRGVsaXZlcnkiLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZEZWxpdmVyeSwxMSwmKGx2YWx1ZXNbMTgyNF0pLDB9LAoreyJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZTZW5kZXIiLCJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZTZW5kZXIiLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZTZW5kZXIsMTEsJihsdmFsdWVzWzE4MzVdKSwwfSwKK3siaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQXBwcm92YWwiLAorCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZBcHByb3ZhbCIsCisJTklEX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkFwcHJvdmFsLDExLCYobHZhbHVlc1sxODQ2XSksMH0sCit7ImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkNyZWF0aW9uIiwKKwkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQ3JlYXRpb24iLAorCU5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZDcmVhdGlvbiwxMSwmKGx2YWx1ZXNbMTg1N10pLDB9LAoreyJNRDQiLCJtZDQiLE5JRF9tZDQsOCwmKGx2YWx1ZXNbMTg2OF0pLDB9LAoreyJpZC1wa2l4LW1vZCIsImlkLXBraXgtbW9kIixOSURfaWRfcGtpeF9tb2QsNywmKGx2YWx1ZXNbMTg3Nl0pLDB9LAoreyJpZC1xdCIsImlkLXF0IixOSURfaWRfcXQsNywmKGx2YWx1ZXNbMTg4M10pLDB9LAoreyJpZC1pdCIsImlkLWl0IixOSURfaWRfaXQsNywmKGx2YWx1ZXNbMTg5MF0pLDB9LAoreyJpZC1wa2lwIiwiaWQtcGtpcCIsTklEX2lkX3BraXAsNywmKGx2YWx1ZXNbMTg5N10pLDB9LAoreyJpZC1hbGciLCJpZC1hbGciLE5JRF9pZF9hbGcsNywmKGx2YWx1ZXNbMTkwNF0pLDB9LAoreyJpZC1jbWMiLCJpZC1jbWMiLE5JRF9pZF9jbWMsNywmKGx2YWx1ZXNbMTkxMV0pLDB9LAoreyJpZC1vbiIsImlkLW9uIixOSURfaWRfb24sNywmKGx2YWx1ZXNbMTkxOF0pLDB9LAoreyJpZC1wZGEiLCJpZC1wZGEiLE5JRF9pZF9wZGEsNywmKGx2YWx1ZXNbMTkyNV0pLDB9LAoreyJpZC1hY2EiLCJpZC1hY2EiLE5JRF9pZF9hY2EsNywmKGx2YWx1ZXNbMTkzMl0pLDB9LAoreyJpZC1xY3MiLCJpZC1xY3MiLE5JRF9pZF9xY3MsNywmKGx2YWx1ZXNbMTkzOV0pLDB9LAoreyJpZC1jY3QiLCJpZC1jY3QiLE5JRF9pZF9jY3QsNywmKGx2YWx1ZXNbMTk0Nl0pLDB9LAoreyJpZC1wa2l4MS1leHBsaWNpdC04OCIsImlkLXBraXgxLWV4cGxpY2l0LTg4IiwKKwlOSURfaWRfcGtpeDFfZXhwbGljaXRfODgsOCwmKGx2YWx1ZXNbMTk1M10pLDB9LAoreyJpZC1wa2l4MS1pbXBsaWNpdC04OCIsImlkLXBraXgxLWltcGxpY2l0LTg4IiwKKwlOSURfaWRfcGtpeDFfaW1wbGljaXRfODgsOCwmKGx2YWx1ZXNbMTk2MV0pLDB9LAoreyJpZC1wa2l4MS1leHBsaWNpdC05MyIsImlkLXBraXgxLWV4cGxpY2l0LTkzIiwKKwlOSURfaWRfcGtpeDFfZXhwbGljaXRfOTMsOCwmKGx2YWx1ZXNbMTk2OV0pLDB9LAoreyJpZC1wa2l4MS1pbXBsaWNpdC05MyIsImlkLXBraXgxLWltcGxpY2l0LTkzIiwKKwlOSURfaWRfcGtpeDFfaW1wbGljaXRfOTMsOCwmKGx2YWx1ZXNbMTk3N10pLDB9LAoreyJpZC1tb2QtY3JtZiIsImlkLW1vZC1jcm1mIixOSURfaWRfbW9kX2NybWYsOCwmKGx2YWx1ZXNbMTk4NV0pLDB9LAoreyJpZC1tb2QtY21jIiwiaWQtbW9kLWNtYyIsTklEX2lkX21vZF9jbWMsOCwmKGx2YWx1ZXNbMTk5M10pLDB9LAoreyJpZC1tb2Qta2VhLXByb2ZpbGUtODgiLCJpZC1tb2Qta2VhLXByb2ZpbGUtODgiLAorCU5JRF9pZF9tb2Rfa2VhX3Byb2ZpbGVfODgsOCwmKGx2YWx1ZXNbMjAwMV0pLDB9LAoreyJpZC1tb2Qta2VhLXByb2ZpbGUtOTMiLCJpZC1tb2Qta2VhLXByb2ZpbGUtOTMiLAorCU5JRF9pZF9tb2Rfa2VhX3Byb2ZpbGVfOTMsOCwmKGx2YWx1ZXNbMjAwOV0pLDB9LAoreyJpZC1tb2QtY21wIiwiaWQtbW9kLWNtcCIsTklEX2lkX21vZF9jbXAsOCwmKGx2YWx1ZXNbMjAxN10pLDB9LAoreyJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtODgiLCJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtODgiLAorCU5JRF9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfODgsOCwmKGx2YWx1ZXNbMjAyNV0pLDB9LAoreyJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtOTMiLCJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtOTMiLAorCU5JRF9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfOTMsOCwmKGx2YWx1ZXNbMjAzM10pLDB9LAoreyJpZC1tb2QtYXR0cmlidXRlLWNlcnQiLCJpZC1tb2QtYXR0cmlidXRlLWNlcnQiLAorCU5JRF9pZF9tb2RfYXR0cmlidXRlX2NlcnQsOCwmKGx2YWx1ZXNbMjA0MV0pLDB9LAoreyJpZC1tb2QtdGltZXN0YW1wLXByb3RvY29sIiwiaWQtbW9kLXRpbWVzdGFtcC1wcm90b2NvbCIsCisJTklEX2lkX21vZF90aW1lc3RhbXBfcHJvdG9jb2wsOCwmKGx2YWx1ZXNbMjA0OV0pLDB9LAoreyJpZC1tb2Qtb2NzcCIsImlkLW1vZC1vY3NwIixOSURfaWRfbW9kX29jc3AsOCwmKGx2YWx1ZXNbMjA1N10pLDB9LAoreyJpZC1tb2QtZHZjcyIsImlkLW1vZC1kdmNzIixOSURfaWRfbW9kX2R2Y3MsOCwmKGx2YWx1ZXNbMjA2NV0pLDB9LAoreyJpZC1tb2QtY21wMjAwMCIsImlkLW1vZC1jbXAyMDAwIixOSURfaWRfbW9kX2NtcDIwMDAsOCwKKwkmKGx2YWx1ZXNbMjA3M10pLDB9LAoreyJiaW9tZXRyaWNJbmZvIiwiQmlvbWV0cmljIEluZm8iLE5JRF9iaW9tZXRyaWNJbmZvLDgsJihsdmFsdWVzWzIwODFdKSwwfSwKK3sicWNTdGF0ZW1lbnRzIiwicWNTdGF0ZW1lbnRzIixOSURfcWNTdGF0ZW1lbnRzLDgsJihsdmFsdWVzWzIwODldKSwwfSwKK3siYWMtYXVkaXRFbnRpdHkiLCJhYy1hdWRpdEVudGl0eSIsTklEX2FjX2F1ZGl0RW50aXR5LDgsCisJJihsdmFsdWVzWzIwOTddKSwwfSwKK3siYWMtdGFyZ2V0aW5nIiwiYWMtdGFyZ2V0aW5nIixOSURfYWNfdGFyZ2V0aW5nLDgsJihsdmFsdWVzWzIxMDVdKSwwfSwKK3siYWFDb250cm9scyIsImFhQ29udHJvbHMiLE5JRF9hYUNvbnRyb2xzLDgsJihsdmFsdWVzWzIxMTNdKSwwfSwKK3sic2JncC1pcEFkZHJCbG9jayIsInNiZ3AtaXBBZGRyQmxvY2siLE5JRF9zYmdwX2lwQWRkckJsb2NrLDgsCisJJihsdmFsdWVzWzIxMjFdKSwwfSwKK3sic2JncC1hdXRvbm9tb3VzU3lzTnVtIiwic2JncC1hdXRvbm9tb3VzU3lzTnVtIiwKKwlOSURfc2JncF9hdXRvbm9tb3VzU3lzTnVtLDgsJihsdmFsdWVzWzIxMjldKSwwfSwKK3sic2JncC1yb3V0ZXJJZGVudGlmaWVyIiwic2JncC1yb3V0ZXJJZGVudGlmaWVyIiwKKwlOSURfc2JncF9yb3V0ZXJJZGVudGlmaWVyLDgsJihsdmFsdWVzWzIxMzddKSwwfSwKK3sidGV4dE5vdGljZSIsInRleHROb3RpY2UiLE5JRF90ZXh0Tm90aWNlLDgsJihsdmFsdWVzWzIxNDVdKSwwfSwKK3siaXBzZWNFbmRTeXN0ZW0iLCJJUFNlYyBFbmQgU3lzdGVtIixOSURfaXBzZWNFbmRTeXN0ZW0sOCwKKwkmKGx2YWx1ZXNbMjE1M10pLDB9LAoreyJpcHNlY1R1bm5lbCIsIklQU2VjIFR1bm5lbCIsTklEX2lwc2VjVHVubmVsLDgsJihsdmFsdWVzWzIxNjFdKSwwfSwKK3siaXBzZWNVc2VyIiwiSVBTZWMgVXNlciIsTklEX2lwc2VjVXNlciw4LCYobHZhbHVlc1syMTY5XSksMH0sCit7IkRWQ1MiLCJkdmNzIixOSURfZHZjcyw4LCYobHZhbHVlc1syMTc3XSksMH0sCit7ImlkLWl0LWNhUHJvdEVuY0NlcnQiLCJpZC1pdC1jYVByb3RFbmNDZXJ0IixOSURfaWRfaXRfY2FQcm90RW5jQ2VydCwKKwk4LCYobHZhbHVlc1syMTg1XSksMH0sCit7ImlkLWl0LXNpZ25LZXlQYWlyVHlwZXMiLCJpZC1pdC1zaWduS2V5UGFpclR5cGVzIiwKKwlOSURfaWRfaXRfc2lnbktleVBhaXJUeXBlcyw4LCYobHZhbHVlc1syMTkzXSksMH0sCit7ImlkLWl0LWVuY0tleVBhaXJUeXBlcyIsImlkLWl0LWVuY0tleVBhaXJUeXBlcyIsCisJTklEX2lkX2l0X2VuY0tleVBhaXJUeXBlcyw4LCYobHZhbHVlc1syMjAxXSksMH0sCit7ImlkLWl0LXByZWZlcnJlZFN5bW1BbGciLCJpZC1pdC1wcmVmZXJyZWRTeW1tQWxnIiwKKwlOSURfaWRfaXRfcHJlZmVycmVkU3ltbUFsZyw4LCYobHZhbHVlc1syMjA5XSksMH0sCit7ImlkLWl0LWNhS2V5VXBkYXRlSW5mbyIsImlkLWl0LWNhS2V5VXBkYXRlSW5mbyIsCisJTklEX2lkX2l0X2NhS2V5VXBkYXRlSW5mbyw4LCYobHZhbHVlc1syMjE3XSksMH0sCit7ImlkLWl0LWN1cnJlbnRDUkwiLCJpZC1pdC1jdXJyZW50Q1JMIixOSURfaWRfaXRfY3VycmVudENSTCw4LAorCSYobHZhbHVlc1syMjI1XSksMH0sCit7ImlkLWl0LXVuc3VwcG9ydGVkT0lEcyIsImlkLWl0LXVuc3VwcG9ydGVkT0lEcyIsCisJTklEX2lkX2l0X3Vuc3VwcG9ydGVkT0lEcyw4LCYobHZhbHVlc1syMjMzXSksMH0sCit7ImlkLWl0LXN1YnNjcmlwdGlvblJlcXVlc3QiLCJpZC1pdC1zdWJzY3JpcHRpb25SZXF1ZXN0IiwKKwlOSURfaWRfaXRfc3Vic2NyaXB0aW9uUmVxdWVzdCw4LCYobHZhbHVlc1syMjQxXSksMH0sCit7ImlkLWl0LXN1YnNjcmlwdGlvblJlc3BvbnNlIiwiaWQtaXQtc3Vic2NyaXB0aW9uUmVzcG9uc2UiLAorCU5JRF9pZF9pdF9zdWJzY3JpcHRpb25SZXNwb25zZSw4LCYobHZhbHVlc1syMjQ5XSksMH0sCit7ImlkLWl0LWtleVBhaXJQYXJhbVJlcSIsImlkLWl0LWtleVBhaXJQYXJhbVJlcSIsCisJTklEX2lkX2l0X2tleVBhaXJQYXJhbVJlcSw4LCYobHZhbHVlc1syMjU3XSksMH0sCit7ImlkLWl0LWtleVBhaXJQYXJhbVJlcCIsImlkLWl0LWtleVBhaXJQYXJhbVJlcCIsCisJTklEX2lkX2l0X2tleVBhaXJQYXJhbVJlcCw4LCYobHZhbHVlc1syMjY1XSksMH0sCit7ImlkLWl0LXJldlBhc3NwaHJhc2UiLCJpZC1pdC1yZXZQYXNzcGhyYXNlIixOSURfaWRfaXRfcmV2UGFzc3BocmFzZSwKKwk4LCYobHZhbHVlc1syMjczXSksMH0sCit7ImlkLWl0LWltcGxpY2l0Q29uZmlybSIsImlkLWl0LWltcGxpY2l0Q29uZmlybSIsCisJTklEX2lkX2l0X2ltcGxpY2l0Q29uZmlybSw4LCYobHZhbHVlc1syMjgxXSksMH0sCit7ImlkLWl0LWNvbmZpcm1XYWl0VGltZSIsImlkLWl0LWNvbmZpcm1XYWl0VGltZSIsCisJTklEX2lkX2l0X2NvbmZpcm1XYWl0VGltZSw4LCYobHZhbHVlc1syMjg5XSksMH0sCit7ImlkLWl0LW9yaWdQS0lNZXNzYWdlIiwiaWQtaXQtb3JpZ1BLSU1lc3NhZ2UiLAorCU5JRF9pZF9pdF9vcmlnUEtJTWVzc2FnZSw4LCYobHZhbHVlc1syMjk3XSksMH0sCit7ImlkLXJlZ0N0cmwiLCJpZC1yZWdDdHJsIixOSURfaWRfcmVnQ3RybCw4LCYobHZhbHVlc1syMzA1XSksMH0sCit7ImlkLXJlZ0luZm8iLCJpZC1yZWdJbmZvIixOSURfaWRfcmVnSW5mbyw4LCYobHZhbHVlc1syMzEzXSksMH0sCit7ImlkLXJlZ0N0cmwtcmVnVG9rZW4iLCJpZC1yZWdDdHJsLXJlZ1Rva2VuIixOSURfaWRfcmVnQ3RybF9yZWdUb2tlbiwKKwk5LCYobHZhbHVlc1syMzIxXSksMH0sCit7ImlkLXJlZ0N0cmwtYXV0aGVudGljYXRvciIsImlkLXJlZ0N0cmwtYXV0aGVudGljYXRvciIsCisJTklEX2lkX3JlZ0N0cmxfYXV0aGVudGljYXRvciw5LCYobHZhbHVlc1syMzMwXSksMH0sCit7ImlkLXJlZ0N0cmwtcGtpUHVibGljYXRpb25JbmZvIiwiaWQtcmVnQ3RybC1wa2lQdWJsaWNhdGlvbkluZm8iLAorCU5JRF9pZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbyw5LCYobHZhbHVlc1syMzM5XSksMH0sCit7ImlkLXJlZ0N0cmwtcGtpQXJjaGl2ZU9wdGlvbnMiLCJpZC1yZWdDdHJsLXBraUFyY2hpdmVPcHRpb25zIiwKKwlOSURfaWRfcmVnQ3RybF9wa2lBcmNoaXZlT3B0aW9ucyw5LCYobHZhbHVlc1syMzQ4XSksMH0sCit7ImlkLXJlZ0N0cmwtb2xkQ2VydElEIiwiaWQtcmVnQ3RybC1vbGRDZXJ0SUQiLAorCU5JRF9pZF9yZWdDdHJsX29sZENlcnRJRCw5LCYobHZhbHVlc1syMzU3XSksMH0sCit7ImlkLXJlZ0N0cmwtcHJvdG9jb2xFbmNyS2V5IiwiaWQtcmVnQ3RybC1wcm90b2NvbEVuY3JLZXkiLAorCU5JRF9pZF9yZWdDdHJsX3Byb3RvY29sRW5jcktleSw5LCYobHZhbHVlc1syMzY2XSksMH0sCit7ImlkLXJlZ0luZm8tdXRmOFBhaXJzIiwiaWQtcmVnSW5mby11dGY4UGFpcnMiLAorCU5JRF9pZF9yZWdJbmZvX3V0ZjhQYWlycyw5LCYobHZhbHVlc1syMzc1XSksMH0sCit7ImlkLXJlZ0luZm8tY2VydFJlcSIsImlkLXJlZ0luZm8tY2VydFJlcSIsTklEX2lkX3JlZ0luZm9fY2VydFJlcSw5LAorCSYobHZhbHVlc1syMzg0XSksMH0sCit7ImlkLWFsZy1kZXM0MCIsImlkLWFsZy1kZXM0MCIsTklEX2lkX2FsZ19kZXM0MCw4LCYobHZhbHVlc1syMzkzXSksMH0sCit7ImlkLWFsZy1ub1NpZ25hdHVyZSIsImlkLWFsZy1ub1NpZ25hdHVyZSIsTklEX2lkX2FsZ19ub1NpZ25hdHVyZSw4LAorCSYobHZhbHVlc1syNDAxXSksMH0sCit7ImlkLWFsZy1kaC1zaWctaG1hYy1zaGExIiwiaWQtYWxnLWRoLXNpZy1obWFjLXNoYTEiLAorCU5JRF9pZF9hbGdfZGhfc2lnX2htYWNfc2hhMSw4LCYobHZhbHVlc1syNDA5XSksMH0sCit7ImlkLWFsZy1kaC1wb3AiLCJpZC1hbGctZGgtcG9wIixOSURfaWRfYWxnX2RoX3BvcCw4LCYobHZhbHVlc1syNDE3XSksMH0sCit7ImlkLWNtYy1zdGF0dXNJbmZvIiwiaWQtY21jLXN0YXR1c0luZm8iLE5JRF9pZF9jbWNfc3RhdHVzSW5mbyw4LAorCSYobHZhbHVlc1syNDI1XSksMH0sCit7ImlkLWNtYy1pZGVudGlmaWNhdGlvbiIsImlkLWNtYy1pZGVudGlmaWNhdGlvbiIsCisJTklEX2lkX2NtY19pZGVudGlmaWNhdGlvbiw4LCYobHZhbHVlc1syNDMzXSksMH0sCit7ImlkLWNtYy1pZGVudGl0eVByb29mIiwiaWQtY21jLWlkZW50aXR5UHJvb2YiLAorCU5JRF9pZF9jbWNfaWRlbnRpdHlQcm9vZiw4LCYobHZhbHVlc1syNDQxXSksMH0sCit7ImlkLWNtYy1kYXRhUmV0dXJuIiwiaWQtY21jLWRhdGFSZXR1cm4iLE5JRF9pZF9jbWNfZGF0YVJldHVybiw4LAorCSYobHZhbHVlc1syNDQ5XSksMH0sCit7ImlkLWNtYy10cmFuc2FjdGlvbklkIiwiaWQtY21jLXRyYW5zYWN0aW9uSWQiLAorCU5JRF9pZF9jbWNfdHJhbnNhY3Rpb25JZCw4LCYobHZhbHVlc1syNDU3XSksMH0sCit7ImlkLWNtYy1zZW5kZXJOb25jZSIsImlkLWNtYy1zZW5kZXJOb25jZSIsTklEX2lkX2NtY19zZW5kZXJOb25jZSw4LAorCSYobHZhbHVlc1syNDY1XSksMH0sCit7ImlkLWNtYy1yZWNpcGllbnROb25jZSIsImlkLWNtYy1yZWNpcGllbnROb25jZSIsCisJTklEX2lkX2NtY19yZWNpcGllbnROb25jZSw4LCYobHZhbHVlc1syNDczXSksMH0sCit7ImlkLWNtYy1hZGRFeHRlbnNpb25zIiwiaWQtY21jLWFkZEV4dGVuc2lvbnMiLAorCU5JRF9pZF9jbWNfYWRkRXh0ZW5zaW9ucyw4LCYobHZhbHVlc1syNDgxXSksMH0sCit7ImlkLWNtYy1lbmNyeXB0ZWRQT1AiLCJpZC1jbWMtZW5jcnlwdGVkUE9QIixOSURfaWRfY21jX2VuY3J5cHRlZFBPUCwKKwk4LCYobHZhbHVlc1syNDg5XSksMH0sCit7ImlkLWNtYy1kZWNyeXB0ZWRQT1AiLCJpZC1jbWMtZGVjcnlwdGVkUE9QIixOSURfaWRfY21jX2RlY3J5cHRlZFBPUCwKKwk4LCYobHZhbHVlc1syNDk3XSksMH0sCit7ImlkLWNtYy1scmFQT1BXaXRuZXNzIiwiaWQtY21jLWxyYVBPUFdpdG5lc3MiLAorCU5JRF9pZF9jbWNfbHJhUE9QV2l0bmVzcyw4LCYobHZhbHVlc1syNTA1XSksMH0sCit7ImlkLWNtYy1nZXRDZXJ0IiwiaWQtY21jLWdldENlcnQiLE5JRF9pZF9jbWNfZ2V0Q2VydCw4LAorCSYobHZhbHVlc1syNTEzXSksMH0sCit7ImlkLWNtYy1nZXRDUkwiLCJpZC1jbWMtZ2V0Q1JMIixOSURfaWRfY21jX2dldENSTCw4LCYobHZhbHVlc1syNTIxXSksMH0sCit7ImlkLWNtYy1yZXZva2VSZXF1ZXN0IiwiaWQtY21jLXJldm9rZVJlcXVlc3QiLAorCU5JRF9pZF9jbWNfcmV2b2tlUmVxdWVzdCw4LCYobHZhbHVlc1syNTI5XSksMH0sCit7ImlkLWNtYy1yZWdJbmZvIiwiaWQtY21jLXJlZ0luZm8iLE5JRF9pZF9jbWNfcmVnSW5mbyw4LAorCSYobHZhbHVlc1syNTM3XSksMH0sCit7ImlkLWNtYy1yZXNwb25zZUluZm8iLCJpZC1jbWMtcmVzcG9uc2VJbmZvIixOSURfaWRfY21jX3Jlc3BvbnNlSW5mbywKKwk4LCYobHZhbHVlc1syNTQ1XSksMH0sCit7ImlkLWNtYy1xdWVyeVBlbmRpbmciLCJpZC1jbWMtcXVlcnlQZW5kaW5nIixOSURfaWRfY21jX3F1ZXJ5UGVuZGluZywKKwk4LCYobHZhbHVlc1syNTUzXSksMH0sCit7ImlkLWNtYy1wb3BMaW5rUmFuZG9tIiwiaWQtY21jLXBvcExpbmtSYW5kb20iLAorCU5JRF9pZF9jbWNfcG9wTGlua1JhbmRvbSw4LCYobHZhbHVlc1syNTYxXSksMH0sCit7ImlkLWNtYy1wb3BMaW5rV2l0bmVzcyIsImlkLWNtYy1wb3BMaW5rV2l0bmVzcyIsCisJTklEX2lkX2NtY19wb3BMaW5rV2l0bmVzcyw4LCYobHZhbHVlc1syNTY5XSksMH0sCit7ImlkLWNtYy1jb25maXJtQ2VydEFjY2VwdGFuY2UiLCJpZC1jbWMtY29uZmlybUNlcnRBY2NlcHRhbmNlIiwKKwlOSURfaWRfY21jX2NvbmZpcm1DZXJ0QWNjZXB0YW5jZSw4LCYobHZhbHVlc1syNTc3XSksMH0sCit7ImlkLW9uLXBlcnNvbmFsRGF0YSIsImlkLW9uLXBlcnNvbmFsRGF0YSIsTklEX2lkX29uX3BlcnNvbmFsRGF0YSw4LAorCSYobHZhbHVlc1syNTg1XSksMH0sCit7ImlkLXBkYS1kYXRlT2ZCaXJ0aCIsImlkLXBkYS1kYXRlT2ZCaXJ0aCIsTklEX2lkX3BkYV9kYXRlT2ZCaXJ0aCw4LAorCSYobHZhbHVlc1syNTkzXSksMH0sCit7ImlkLXBkYS1wbGFjZU9mQmlydGgiLCJpZC1wZGEtcGxhY2VPZkJpcnRoIixOSURfaWRfcGRhX3BsYWNlT2ZCaXJ0aCwKKwk4LCYobHZhbHVlc1syNjAxXSksMH0sCit7TlVMTCxOVUxMLE5JRF91bmRlZiwwLE5VTEwsMH0sCit7ImlkLXBkYS1nZW5kZXIiLCJpZC1wZGEtZ2VuZGVyIixOSURfaWRfcGRhX2dlbmRlciw4LCYobHZhbHVlc1syNjA5XSksMH0sCit7ImlkLXBkYS1jb3VudHJ5T2ZDaXRpemVuc2hpcCIsImlkLXBkYS1jb3VudHJ5T2ZDaXRpemVuc2hpcCIsCisJTklEX2lkX3BkYV9jb3VudHJ5T2ZDaXRpemVuc2hpcCw4LCYobHZhbHVlc1syNjE3XSksMH0sCit7ImlkLXBkYS1jb3VudHJ5T2ZSZXNpZGVuY2UiLCJpZC1wZGEtY291bnRyeU9mUmVzaWRlbmNlIiwKKwlOSURfaWRfcGRhX2NvdW50cnlPZlJlc2lkZW5jZSw4LCYobHZhbHVlc1syNjI1XSksMH0sCit7ImlkLWFjYS1hdXRoZW50aWNhdGlvbkluZm8iLCJpZC1hY2EtYXV0aGVudGljYXRpb25JbmZvIiwKKwlOSURfaWRfYWNhX2F1dGhlbnRpY2F0aW9uSW5mbyw4LCYobHZhbHVlc1syNjMzXSksMH0sCit7ImlkLWFjYS1hY2Nlc3NJZGVudGl0eSIsImlkLWFjYS1hY2Nlc3NJZGVudGl0eSIsCisJTklEX2lkX2FjYV9hY2Nlc3NJZGVudGl0eSw4LCYobHZhbHVlc1syNjQxXSksMH0sCit7ImlkLWFjYS1jaGFyZ2luZ0lkZW50aXR5IiwiaWQtYWNhLWNoYXJnaW5nSWRlbnRpdHkiLAorCU5JRF9pZF9hY2FfY2hhcmdpbmdJZGVudGl0eSw4LCYobHZhbHVlc1syNjQ5XSksMH0sCit7ImlkLWFjYS1ncm91cCIsImlkLWFjYS1ncm91cCIsTklEX2lkX2FjYV9ncm91cCw4LCYobHZhbHVlc1syNjU3XSksMH0sCit7ImlkLWFjYS1yb2xlIiwiaWQtYWNhLXJvbGUiLE5JRF9pZF9hY2Ffcm9sZSw4LCYobHZhbHVlc1syNjY1XSksMH0sCit7ImlkLXFjcy1wa2l4UUNTeW50YXgtdjEiLCJpZC1xY3MtcGtpeFFDU3ludGF4LXYxIiwKKwlOSURfaWRfcWNzX3BraXhRQ1N5bnRheF92MSw4LCYobHZhbHVlc1syNjczXSksMH0sCit7ImlkLWNjdC1jcnMiLCJpZC1jY3QtY3JzIixOSURfaWRfY2N0X2Nycyw4LCYobHZhbHVlc1syNjgxXSksMH0sCit7ImlkLWNjdC1QS0lEYXRhIiwiaWQtY2N0LVBLSURhdGEiLE5JRF9pZF9jY3RfUEtJRGF0YSw4LAorCSYobHZhbHVlc1syNjg5XSksMH0sCit7ImlkLWNjdC1QS0lSZXNwb25zZSIsImlkLWNjdC1QS0lSZXNwb25zZSIsTklEX2lkX2NjdF9QS0lSZXNwb25zZSw4LAorCSYobHZhbHVlc1syNjk3XSksMH0sCit7ImFkX3RpbWVzdGFtcGluZyIsIkFEIFRpbWUgU3RhbXBpbmciLE5JRF9hZF90aW1lU3RhbXBpbmcsOCwKKwkmKGx2YWx1ZXNbMjcwNV0pLDB9LAoreyJBRF9EVkNTIiwiYWQgZHZjcyIsTklEX2FkX2R2Y3MsOCwmKGx2YWx1ZXNbMjcxM10pLDB9LAoreyJiYXNpY09DU1BSZXNwb25zZSIsIkJhc2ljIE9DU1AgUmVzcG9uc2UiLE5JRF9pZF9wa2l4X09DU1BfYmFzaWMsOSwKKwkmKGx2YWx1ZXNbMjcyMV0pLDB9LAoreyJOb25jZSIsIk9DU1AgTm9uY2UiLE5JRF9pZF9wa2l4X09DU1BfTm9uY2UsOSwmKGx2YWx1ZXNbMjczMF0pLDB9LAoreyJDcmxJRCIsIk9DU1AgQ1JMIElEIixOSURfaWRfcGtpeF9PQ1NQX0NybElELDksJihsdmFsdWVzWzI3MzldKSwwfSwKK3siYWNjZXB0YWJsZVJlc3BvbnNlcyIsIkFjY2VwdGFibGUgT0NTUCBSZXNwb25zZXMiLAorCU5JRF9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcyw5LCYobHZhbHVlc1syNzQ4XSksMH0sCit7Im5vQ2hlY2siLCJPQ1NQIE5vIENoZWNrIixOSURfaWRfcGtpeF9PQ1NQX25vQ2hlY2ssOSwmKGx2YWx1ZXNbMjc1N10pLDB9LAoreyJhcmNoaXZlQ3V0b2ZmIiwiT0NTUCBBcmNoaXZlIEN1dG9mZiIsTklEX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmLAorCTksJihsdmFsdWVzWzI3NjZdKSwwfSwKK3sic2VydmljZUxvY2F0b3IiLCJPQ1NQIFNlcnZpY2UgTG9jYXRvciIsCisJTklEX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvciw5LCYobHZhbHVlc1syNzc1XSksMH0sCit7ImV4dGVuZGVkU3RhdHVzIiwiRXh0ZW5kZWQgT0NTUCBTdGF0dXMiLAorCU5JRF9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMsOSwmKGx2YWx1ZXNbMjc4NF0pLDB9LAoreyJ2YWxpZCIsInZhbGlkIixOSURfaWRfcGtpeF9PQ1NQX3ZhbGlkLDksJihsdmFsdWVzWzI3OTNdKSwwfSwKK3sicGF0aCIsInBhdGgiLE5JRF9pZF9wa2l4X09DU1BfcGF0aCw5LCYobHZhbHVlc1syODAyXSksMH0sCit7InRydXN0Um9vdCIsIlRydXN0IFJvb3QiLE5JRF9pZF9wa2l4X09DU1BfdHJ1c3RSb290LDksCisJJihsdmFsdWVzWzI4MTFdKSwwfSwKK3siYWxnb3JpdGhtIiwiYWxnb3JpdGhtIixOSURfYWxnb3JpdGhtLDQsJihsdmFsdWVzWzI4MjBdKSwwfSwKK3sicnNhU2lnbmF0dXJlIiwicnNhU2lnbmF0dXJlIixOSURfcnNhU2lnbmF0dXJlLDUsJihsdmFsdWVzWzI4MjRdKSwwfSwKK3siWDUwMGFsZ29yaXRobXMiLCJkaXJlY3Rvcnkgc2VydmljZXMgLSBhbGdvcml0aG1zIiwKKwlOSURfWDUwMGFsZ29yaXRobXMsMiwmKGx2YWx1ZXNbMjgyOV0pLDB9LAoreyJPUkciLCJvcmciLE5JRF9vcmcsMSwmKGx2YWx1ZXNbMjgzMV0pLDB9LAoreyJET0QiLCJkb2QiLE5JRF9kb2QsMiwmKGx2YWx1ZXNbMjgzMl0pLDB9LAoreyJJQU5BIiwiaWFuYSIsTklEX2lhbmEsMywmKGx2YWx1ZXNbMjgzNF0pLDB9LAoreyJkaXJlY3RvcnkiLCJEaXJlY3RvcnkiLE5JRF9EaXJlY3RvcnksNCwmKGx2YWx1ZXNbMjgzN10pLDB9LAoreyJtZ210IiwiTWFuYWdlbWVudCIsTklEX01hbmFnZW1lbnQsNCwmKGx2YWx1ZXNbMjg0MV0pLDB9LAoreyJleHBlcmltZW50YWwiLCJFeHBlcmltZW50YWwiLE5JRF9FeHBlcmltZW50YWwsNCwmKGx2YWx1ZXNbMjg0NV0pLDB9LAoreyJwcml2YXRlIiwiUHJpdmF0ZSIsTklEX1ByaXZhdGUsNCwmKGx2YWx1ZXNbMjg0OV0pLDB9LAoreyJzZWN1cml0eSIsIlNlY3VyaXR5IixOSURfU2VjdXJpdHksNCwmKGx2YWx1ZXNbMjg1M10pLDB9LAoreyJzbm1wdjIiLCJTTk1QdjIiLE5JRF9TTk1QdjIsNCwmKGx2YWx1ZXNbMjg1N10pLDB9LAoreyJNYWlsIiwiTWFpbCIsTklEX01haWwsNCwmKGx2YWx1ZXNbMjg2MV0pLDB9LAoreyJlbnRlcnByaXNlcyIsIkVudGVycHJpc2VzIixOSURfRW50ZXJwcmlzZXMsNSwmKGx2YWx1ZXNbMjg2NV0pLDB9LAoreyJkY29iamVjdCIsImRjT2JqZWN0IixOSURfZGNPYmplY3QsOSwmKGx2YWx1ZXNbMjg3MF0pLDB9LAoreyJEQyIsImRvbWFpbkNvbXBvbmVudCIsTklEX2RvbWFpbkNvbXBvbmVudCwxMCwmKGx2YWx1ZXNbMjg3OV0pLDB9LAoreyJkb21haW4iLCJEb21haW4iLE5JRF9Eb21haW4sMTAsJihsdmFsdWVzWzI4ODldKSwwfSwKK3siTlVMTCIsIk5VTEwiLE5JRF9qb2ludF9pc29fY2NpdHQsMSwmKGx2YWx1ZXNbMjg5OV0pLDB9LAoreyJzZWxlY3RlZC1hdHRyaWJ1dGUtdHlwZXMiLCJTZWxlY3RlZCBBdHRyaWJ1dGUgVHlwZXMiLAorCU5JRF9zZWxlY3RlZF9hdHRyaWJ1dGVfdHlwZXMsMywmKGx2YWx1ZXNbMjkwMF0pLDB9LAoreyJjbGVhcmFuY2UiLCJjbGVhcmFuY2UiLE5JRF9jbGVhcmFuY2UsNCwmKGx2YWx1ZXNbMjkwM10pLDB9LAoreyJSU0EtTUQ0IiwibWQ0V2l0aFJTQUVuY3J5cHRpb24iLE5JRF9tZDRXaXRoUlNBRW5jcnlwdGlvbiw5LAorCSYobHZhbHVlc1syOTA3XSksMH0sCit7ImFjLXByb3h5aW5nIiwiYWMtcHJveHlpbmciLE5JRF9hY19wcm94eWluZyw4LCYobHZhbHVlc1syOTE2XSksMH0sCit7InN1YmplY3RJbmZvQWNjZXNzIiwiU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MiLE5JRF9zaW5mb19hY2Nlc3MsOCwKKwkmKGx2YWx1ZXNbMjkyNF0pLDB9LAoreyJpZC1hY2EtZW5jQXR0cnMiLCJpZC1hY2EtZW5jQXR0cnMiLE5JRF9pZF9hY2FfZW5jQXR0cnMsOCwKKwkmKGx2YWx1ZXNbMjkzMl0pLDB9LAoreyJyb2xlIiwicm9sZSIsTklEX3JvbGUsMywmKGx2YWx1ZXNbMjk0MF0pLDB9LAoreyJwb2xpY3lDb25zdHJhaW50cyIsIlg1MDl2MyBQb2xpY3kgQ29uc3RyYWludHMiLAorCU5JRF9wb2xpY3lfY29uc3RyYWludHMsMywmKGx2YWx1ZXNbMjk0M10pLDB9LAoreyJ0YXJnZXRJbmZvcm1hdGlvbiIsIlg1MDl2MyBBQyBUYXJnZXRpbmciLE5JRF90YXJnZXRfaW5mb3JtYXRpb24sMywKKwkmKGx2YWx1ZXNbMjk0Nl0pLDB9LAoreyJub1JldkF2YWlsIiwiWDUwOXYzIE5vIFJldm9jYXRpb24gQXZhaWxhYmxlIixOSURfbm9fcmV2X2F2YWlsLDMsCisJJihsdmFsdWVzWzI5NDldKSwwfSwKK3siTlVMTCIsIk5VTEwiLE5JRF9jY2l0dCwxLCYobHZhbHVlc1syOTUyXSksMH0sCit7ImFuc2ktWDktNjIiLCJBTlNJIFg5LjYyIixOSURfYW5zaV9YOV82Miw1LCYobHZhbHVlc1syOTUzXSksMH0sCit7InByaW1lLWZpZWxkIiwicHJpbWUtZmllbGQiLE5JRF9YOV82Ml9wcmltZV9maWVsZCw3LCYobHZhbHVlc1syOTU4XSksMH0sCit7ImNoYXJhY3RlcmlzdGljLXR3by1maWVsZCIsImNoYXJhY3RlcmlzdGljLXR3by1maWVsZCIsCisJTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCw3LCYobHZhbHVlc1syOTY1XSksMH0sCit7ImlkLWVjUHVibGljS2V5IiwiaWQtZWNQdWJsaWNLZXkiLE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleSw3LAorCSYobHZhbHVlc1syOTcyXSksMH0sCit7InByaW1lMTkydjEiLCJwcmltZTE5MnYxIixOSURfWDlfNjJfcHJpbWUxOTJ2MSw4LCYobHZhbHVlc1syOTc5XSksMH0sCit7InByaW1lMTkydjIiLCJwcmltZTE5MnYyIixOSURfWDlfNjJfcHJpbWUxOTJ2Miw4LCYobHZhbHVlc1syOTg3XSksMH0sCit7InByaW1lMTkydjMiLCJwcmltZTE5MnYzIixOSURfWDlfNjJfcHJpbWUxOTJ2Myw4LCYobHZhbHVlc1syOTk1XSksMH0sCit7InByaW1lMjM5djEiLCJwcmltZTIzOXYxIixOSURfWDlfNjJfcHJpbWUyMzl2MSw4LCYobHZhbHVlc1szMDAzXSksMH0sCit7InByaW1lMjM5djIiLCJwcmltZTIzOXYyIixOSURfWDlfNjJfcHJpbWUyMzl2Miw4LCYobHZhbHVlc1szMDExXSksMH0sCit7InByaW1lMjM5djMiLCJwcmltZTIzOXYzIixOSURfWDlfNjJfcHJpbWUyMzl2Myw4LCYobHZhbHVlc1szMDE5XSksMH0sCit7InByaW1lMjU2djEiLCJwcmltZTI1NnYxIixOSURfWDlfNjJfcHJpbWUyNTZ2MSw4LCYobHZhbHVlc1szMDI3XSksMH0sCit7ImVjZHNhLXdpdGgtU0hBMSIsImVjZHNhLXdpdGgtU0hBMSIsTklEX2VjZHNhX3dpdGhfU0hBMSw3LAorCSYobHZhbHVlc1szMDM1XSksMH0sCit7IkNTUE5hbWUiLCJNaWNyb3NvZnQgQ1NQIE5hbWUiLE5JRF9tc19jc3BfbmFtZSw5LCYobHZhbHVlc1szMDQyXSksMH0sCit7IkFFUy0xMjgtRUNCIiwiYWVzLTEyOC1lY2IiLE5JRF9hZXNfMTI4X2VjYiw5LCYobHZhbHVlc1szMDUxXSksMH0sCit7IkFFUy0xMjgtQ0JDIiwiYWVzLTEyOC1jYmMiLE5JRF9hZXNfMTI4X2NiYyw5LCYobHZhbHVlc1szMDYwXSksMH0sCit7IkFFUy0xMjgtT0ZCIiwiYWVzLTEyOC1vZmIiLE5JRF9hZXNfMTI4X29mYjEyOCw5LCYobHZhbHVlc1szMDY5XSksMH0sCit7IkFFUy0xMjgtQ0ZCIiwiYWVzLTEyOC1jZmIiLE5JRF9hZXNfMTI4X2NmYjEyOCw5LCYobHZhbHVlc1szMDc4XSksMH0sCit7IkFFUy0xOTItRUNCIiwiYWVzLTE5Mi1lY2IiLE5JRF9hZXNfMTkyX2VjYiw5LCYobHZhbHVlc1szMDg3XSksMH0sCit7IkFFUy0xOTItQ0JDIiwiYWVzLTE5Mi1jYmMiLE5JRF9hZXNfMTkyX2NiYyw5LCYobHZhbHVlc1szMDk2XSksMH0sCit7IkFFUy0xOTItT0ZCIiwiYWVzLTE5Mi1vZmIiLE5JRF9hZXNfMTkyX29mYjEyOCw5LCYobHZhbHVlc1szMTA1XSksMH0sCit7IkFFUy0xOTItQ0ZCIiwiYWVzLTE5Mi1jZmIiLE5JRF9hZXNfMTkyX2NmYjEyOCw5LCYobHZhbHVlc1szMTE0XSksMH0sCit7IkFFUy0yNTYtRUNCIiwiYWVzLTI1Ni1lY2IiLE5JRF9hZXNfMjU2X2VjYiw5LCYobHZhbHVlc1szMTIzXSksMH0sCit7IkFFUy0yNTYtQ0JDIiwiYWVzLTI1Ni1jYmMiLE5JRF9hZXNfMjU2X2NiYyw5LCYobHZhbHVlc1szMTMyXSksMH0sCit7IkFFUy0yNTYtT0ZCIiwiYWVzLTI1Ni1vZmIiLE5JRF9hZXNfMjU2X29mYjEyOCw5LCYobHZhbHVlc1szMTQxXSksMH0sCit7IkFFUy0yNTYtQ0ZCIiwiYWVzLTI1Ni1jZmIiLE5JRF9hZXNfMjU2X2NmYjEyOCw5LCYobHZhbHVlc1szMTUwXSksMH0sCit7ImhvbGRJbnN0cnVjdGlvbkNvZGUiLCJIb2xkIEluc3RydWN0aW9uIENvZGUiLAorCU5JRF9ob2xkX2luc3RydWN0aW9uX2NvZGUsMywmKGx2YWx1ZXNbMzE1OV0pLDB9LAoreyJob2xkSW5zdHJ1Y3Rpb25Ob25lIiwiSG9sZCBJbnN0cnVjdGlvbiBOb25lIiwKKwlOSURfaG9sZF9pbnN0cnVjdGlvbl9ub25lLDcsJihsdmFsdWVzWzMxNjJdKSwwfSwKK3siaG9sZEluc3RydWN0aW9uQ2FsbElzc3VlciIsIkhvbGQgSW5zdHJ1Y3Rpb24gQ2FsbCBJc3N1ZXIiLAorCU5JRF9ob2xkX2luc3RydWN0aW9uX2NhbGxfaXNzdWVyLDcsJihsdmFsdWVzWzMxNjldKSwwfSwKK3siaG9sZEluc3RydWN0aW9uUmVqZWN0IiwiSG9sZCBJbnN0cnVjdGlvbiBSZWplY3QiLAorCU5JRF9ob2xkX2luc3RydWN0aW9uX3JlamVjdCw3LCYobHZhbHVlc1szMTc2XSksMH0sCit7ImRhdGEiLCJkYXRhIixOSURfZGF0YSwxLCYobHZhbHVlc1szMTgzXSksMH0sCit7InBzcyIsInBzcyIsTklEX3BzcywzLCYobHZhbHVlc1szMTg0XSksMH0sCit7InVjbCIsInVjbCIsTklEX3VjbCw3LCYobHZhbHVlc1szMTg3XSksMH0sCit7InBpbG90IiwicGlsb3QiLE5JRF9waWxvdCw4LCYobHZhbHVlc1szMTk0XSksMH0sCit7InBpbG90QXR0cmlidXRlVHlwZSIsInBpbG90QXR0cmlidXRlVHlwZSIsTklEX3BpbG90QXR0cmlidXRlVHlwZSw5LAorCSYobHZhbHVlc1szMjAyXSksMH0sCit7InBpbG90QXR0cmlidXRlU3ludGF4IiwicGlsb3RBdHRyaWJ1dGVTeW50YXgiLAorCU5JRF9waWxvdEF0dHJpYnV0ZVN5bnRheCw5LCYobHZhbHVlc1szMjExXSksMH0sCit7InBpbG90T2JqZWN0Q2xhc3MiLCJwaWxvdE9iamVjdENsYXNzIixOSURfcGlsb3RPYmplY3RDbGFzcyw5LAorCSYobHZhbHVlc1szMjIwXSksMH0sCit7InBpbG90R3JvdXBzIiwicGlsb3RHcm91cHMiLE5JRF9waWxvdEdyb3Vwcyw5LCYobHZhbHVlc1szMjI5XSksMH0sCit7ImlBNVN0cmluZ1N5bnRheCIsImlBNVN0cmluZ1N5bnRheCIsTklEX2lBNVN0cmluZ1N5bnRheCwxMCwKKwkmKGx2YWx1ZXNbMzIzOF0pLDB9LAoreyJjYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4IiwiY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheCIsCisJTklEX2Nhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgsMTAsJihsdmFsdWVzWzMyNDhdKSwwfSwKK3sicGlsb3RPYmplY3QiLCJwaWxvdE9iamVjdCIsTklEX3BpbG90T2JqZWN0LDEwLCYobHZhbHVlc1szMjU4XSksMH0sCit7InBpbG90UGVyc29uIiwicGlsb3RQZXJzb24iLE5JRF9waWxvdFBlcnNvbiwxMCwmKGx2YWx1ZXNbMzI2OF0pLDB9LAoreyJhY2NvdW50IiwiYWNjb3VudCIsTklEX2FjY291bnQsMTAsJihsdmFsdWVzWzMyNzhdKSwwfSwKK3siZG9jdW1lbnQiLCJkb2N1bWVudCIsTklEX2RvY3VtZW50LDEwLCYobHZhbHVlc1szMjg4XSksMH0sCit7InJvb20iLCJyb29tIixOSURfcm9vbSwxMCwmKGx2YWx1ZXNbMzI5OF0pLDB9LAoreyJkb2N1bWVudFNlcmllcyIsImRvY3VtZW50U2VyaWVzIixOSURfZG9jdW1lbnRTZXJpZXMsMTAsCisJJihsdmFsdWVzWzMzMDhdKSwwfSwKK3sickZDODIybG9jYWxQYXJ0IiwickZDODIybG9jYWxQYXJ0IixOSURfckZDODIybG9jYWxQYXJ0LDEwLAorCSYobHZhbHVlc1szMzE4XSksMH0sCit7ImROU0RvbWFpbiIsImROU0RvbWFpbiIsTklEX2ROU0RvbWFpbiwxMCwmKGx2YWx1ZXNbMzMyOF0pLDB9LAoreyJkb21haW5SZWxhdGVkT2JqZWN0IiwiZG9tYWluUmVsYXRlZE9iamVjdCIsTklEX2RvbWFpblJlbGF0ZWRPYmplY3QsCisJMTAsJihsdmFsdWVzWzMzMzhdKSwwfSwKK3siZnJpZW5kbHlDb3VudHJ5IiwiZnJpZW5kbHlDb3VudHJ5IixOSURfZnJpZW5kbHlDb3VudHJ5LDEwLAorCSYobHZhbHVlc1szMzQ4XSksMH0sCit7InNpbXBsZVNlY3VyaXR5T2JqZWN0Iiwic2ltcGxlU2VjdXJpdHlPYmplY3QiLAorCU5JRF9zaW1wbGVTZWN1cml0eU9iamVjdCwxMCwmKGx2YWx1ZXNbMzM1OF0pLDB9LAoreyJwaWxvdE9yZ2FuaXphdGlvbiIsInBpbG90T3JnYW5pemF0aW9uIixOSURfcGlsb3RPcmdhbml6YXRpb24sMTAsCisJJihsdmFsdWVzWzMzNjhdKSwwfSwKK3sicGlsb3REU0EiLCJwaWxvdERTQSIsTklEX3BpbG90RFNBLDEwLCYobHZhbHVlc1szMzc4XSksMH0sCit7InF1YWxpdHlMYWJlbGxlZERhdGEiLCJxdWFsaXR5TGFiZWxsZWREYXRhIixOSURfcXVhbGl0eUxhYmVsbGVkRGF0YSwKKwkxMCwmKGx2YWx1ZXNbMzM4OF0pLDB9LAoreyJVSUQiLCJ1c2VySWQiLE5JRF91c2VySWQsMTAsJihsdmFsdWVzWzMzOThdKSwwfSwKK3sidGV4dEVuY29kZWRPUkFkZHJlc3MiLCJ0ZXh0RW5jb2RlZE9SQWRkcmVzcyIsCisJTklEX3RleHRFbmNvZGVkT1JBZGRyZXNzLDEwLCYobHZhbHVlc1szNDA4XSksMH0sCit7Im1haWwiLCJyZmM4MjJNYWlsYm94IixOSURfcmZjODIyTWFpbGJveCwxMCwmKGx2YWx1ZXNbMzQxOF0pLDB9LAoreyJpbmZvIiwiaW5mbyIsTklEX2luZm8sMTAsJihsdmFsdWVzWzM0MjhdKSwwfSwKK3siZmF2b3VyaXRlRHJpbmsiLCJmYXZvdXJpdGVEcmluayIsTklEX2Zhdm91cml0ZURyaW5rLDEwLAorCSYobHZhbHVlc1szNDM4XSksMH0sCit7InJvb21OdW1iZXIiLCJyb29tTnVtYmVyIixOSURfcm9vbU51bWJlciwxMCwmKGx2YWx1ZXNbMzQ0OF0pLDB9LAoreyJwaG90byIsInBob3RvIixOSURfcGhvdG8sMTAsJihsdmFsdWVzWzM0NThdKSwwfSwKK3sidXNlckNsYXNzIiwidXNlckNsYXNzIixOSURfdXNlckNsYXNzLDEwLCYobHZhbHVlc1szNDY4XSksMH0sCit7Imhvc3QiLCJob3N0IixOSURfaG9zdCwxMCwmKGx2YWx1ZXNbMzQ3OF0pLDB9LAoreyJtYW5hZ2VyIiwibWFuYWdlciIsTklEX21hbmFnZXIsMTAsJihsdmFsdWVzWzM0ODhdKSwwfSwKK3siZG9jdW1lbnRJZGVudGlmaWVyIiwiZG9jdW1lbnRJZGVudGlmaWVyIixOSURfZG9jdW1lbnRJZGVudGlmaWVyLDEwLAorCSYobHZhbHVlc1szNDk4XSksMH0sCit7ImRvY3VtZW50VGl0bGUiLCJkb2N1bWVudFRpdGxlIixOSURfZG9jdW1lbnRUaXRsZSwxMCwmKGx2YWx1ZXNbMzUwOF0pLDB9LAoreyJkb2N1bWVudFZlcnNpb24iLCJkb2N1bWVudFZlcnNpb24iLE5JRF9kb2N1bWVudFZlcnNpb24sMTAsCisJJihsdmFsdWVzWzM1MThdKSwwfSwKK3siZG9jdW1lbnRBdXRob3IiLCJkb2N1bWVudEF1dGhvciIsTklEX2RvY3VtZW50QXV0aG9yLDEwLAorCSYobHZhbHVlc1szNTI4XSksMH0sCit7ImRvY3VtZW50TG9jYXRpb24iLCJkb2N1bWVudExvY2F0aW9uIixOSURfZG9jdW1lbnRMb2NhdGlvbiwxMCwKKwkmKGx2YWx1ZXNbMzUzOF0pLDB9LAoreyJob21lVGVsZXBob25lTnVtYmVyIiwiaG9tZVRlbGVwaG9uZU51bWJlciIsTklEX2hvbWVUZWxlcGhvbmVOdW1iZXIsCisJMTAsJihsdmFsdWVzWzM1NDhdKSwwfSwKK3sic2VjcmV0YXJ5Iiwic2VjcmV0YXJ5IixOSURfc2VjcmV0YXJ5LDEwLCYobHZhbHVlc1szNTU4XSksMH0sCit7Im90aGVyTWFpbGJveCIsIm90aGVyTWFpbGJveCIsTklEX290aGVyTWFpbGJveCwxMCwmKGx2YWx1ZXNbMzU2OF0pLDB9LAoreyJsYXN0TW9kaWZpZWRUaW1lIiwibGFzdE1vZGlmaWVkVGltZSIsTklEX2xhc3RNb2RpZmllZFRpbWUsMTAsCisJJihsdmFsdWVzWzM1NzhdKSwwfSwKK3sibGFzdE1vZGlmaWVkQnkiLCJsYXN0TW9kaWZpZWRCeSIsTklEX2xhc3RNb2RpZmllZEJ5LDEwLAorCSYobHZhbHVlc1szNTg4XSksMH0sCit7ImFSZWNvcmQiLCJhUmVjb3JkIixOSURfYVJlY29yZCwxMCwmKGx2YWx1ZXNbMzU5OF0pLDB9LAoreyJwaWxvdEF0dHJpYnV0ZVR5cGUyNyIsInBpbG90QXR0cmlidXRlVHlwZTI3IiwKKwlOSURfcGlsb3RBdHRyaWJ1dGVUeXBlMjcsMTAsJihsdmFsdWVzWzM2MDhdKSwwfSwKK3sibVhSZWNvcmQiLCJtWFJlY29yZCIsTklEX21YUmVjb3JkLDEwLCYobHZhbHVlc1szNjE4XSksMH0sCit7Im5TUmVjb3JkIiwiblNSZWNvcmQiLE5JRF9uU1JlY29yZCwxMCwmKGx2YWx1ZXNbMzYyOF0pLDB9LAoreyJzT0FSZWNvcmQiLCJzT0FSZWNvcmQiLE5JRF9zT0FSZWNvcmQsMTAsJihsdmFsdWVzWzM2MzhdKSwwfSwKK3siY05BTUVSZWNvcmQiLCJjTkFNRVJlY29yZCIsTklEX2NOQU1FUmVjb3JkLDEwLCYobHZhbHVlc1szNjQ4XSksMH0sCit7ImFzc29jaWF0ZWREb21haW4iLCJhc3NvY2lhdGVkRG9tYWluIixOSURfYXNzb2NpYXRlZERvbWFpbiwxMCwKKwkmKGx2YWx1ZXNbMzY1OF0pLDB9LAoreyJhc3NvY2lhdGVkTmFtZSIsImFzc29jaWF0ZWROYW1lIixOSURfYXNzb2NpYXRlZE5hbWUsMTAsCisJJihsdmFsdWVzWzM2NjhdKSwwfSwKK3siaG9tZVBvc3RhbEFkZHJlc3MiLCJob21lUG9zdGFsQWRkcmVzcyIsTklEX2hvbWVQb3N0YWxBZGRyZXNzLDEwLAorCSYobHZhbHVlc1szNjc4XSksMH0sCit7InBlcnNvbmFsVGl0bGUiLCJwZXJzb25hbFRpdGxlIixOSURfcGVyc29uYWxUaXRsZSwxMCwmKGx2YWx1ZXNbMzY4OF0pLDB9LAoreyJtb2JpbGVUZWxlcGhvbmVOdW1iZXIiLCJtb2JpbGVUZWxlcGhvbmVOdW1iZXIiLAorCU5JRF9tb2JpbGVUZWxlcGhvbmVOdW1iZXIsMTAsJihsdmFsdWVzWzM2OThdKSwwfSwKK3sicGFnZXJUZWxlcGhvbmVOdW1iZXIiLCJwYWdlclRlbGVwaG9uZU51bWJlciIsCisJTklEX3BhZ2VyVGVsZXBob25lTnVtYmVyLDEwLCYobHZhbHVlc1szNzA4XSksMH0sCit7ImZyaWVuZGx5Q291bnRyeU5hbWUiLCJmcmllbmRseUNvdW50cnlOYW1lIixOSURfZnJpZW5kbHlDb3VudHJ5TmFtZSwKKwkxMCwmKGx2YWx1ZXNbMzcxOF0pLDB9LAoreyJvcmdhbml6YXRpb25hbFN0YXR1cyIsIm9yZ2FuaXphdGlvbmFsU3RhdHVzIiwKKwlOSURfb3JnYW5pemF0aW9uYWxTdGF0dXMsMTAsJihsdmFsdWVzWzM3MjhdKSwwfSwKK3siamFuZXRNYWlsYm94IiwiamFuZXRNYWlsYm94IixOSURfamFuZXRNYWlsYm94LDEwLCYobHZhbHVlc1szNzM4XSksMH0sCit7Im1haWxQcmVmZXJlbmNlT3B0aW9uIiwibWFpbFByZWZlcmVuY2VPcHRpb24iLAorCU5JRF9tYWlsUHJlZmVyZW5jZU9wdGlvbiwxMCwmKGx2YWx1ZXNbMzc0OF0pLDB9LAoreyJidWlsZGluZ05hbWUiLCJidWlsZGluZ05hbWUiLE5JRF9idWlsZGluZ05hbWUsMTAsJihsdmFsdWVzWzM3NThdKSwwfSwKK3siZFNBUXVhbGl0eSIsImRTQVF1YWxpdHkiLE5JRF9kU0FRdWFsaXR5LDEwLCYobHZhbHVlc1szNzY4XSksMH0sCit7InNpbmdsZUxldmVsUXVhbGl0eSIsInNpbmdsZUxldmVsUXVhbGl0eSIsTklEX3NpbmdsZUxldmVsUXVhbGl0eSwxMCwKKwkmKGx2YWx1ZXNbMzc3OF0pLDB9LAoreyJzdWJ0cmVlTWluaW11bVF1YWxpdHkiLCJzdWJ0cmVlTWluaW11bVF1YWxpdHkiLAorCU5JRF9zdWJ0cmVlTWluaW11bVF1YWxpdHksMTAsJihsdmFsdWVzWzM3ODhdKSwwfSwKK3sic3VidHJlZU1heGltdW1RdWFsaXR5Iiwic3VidHJlZU1heGltdW1RdWFsaXR5IiwKKwlOSURfc3VidHJlZU1heGltdW1RdWFsaXR5LDEwLCYobHZhbHVlc1szNzk4XSksMH0sCit7InBlcnNvbmFsU2lnbmF0dXJlIiwicGVyc29uYWxTaWduYXR1cmUiLE5JRF9wZXJzb25hbFNpZ25hdHVyZSwxMCwKKwkmKGx2YWx1ZXNbMzgwOF0pLDB9LAoreyJkSVRSZWRpcmVjdCIsImRJVFJlZGlyZWN0IixOSURfZElUUmVkaXJlY3QsMTAsJihsdmFsdWVzWzM4MThdKSwwfSwKK3siYXVkaW8iLCJhdWRpbyIsTklEX2F1ZGlvLDEwLCYobHZhbHVlc1szODI4XSksMH0sCit7ImRvY3VtZW50UHVibGlzaGVyIiwiZG9jdW1lbnRQdWJsaXNoZXIiLE5JRF9kb2N1bWVudFB1Ymxpc2hlciwxMCwKKwkmKGx2YWx1ZXNbMzgzOF0pLDB9LAoreyJ4NTAwVW5pcXVlSWRlbnRpZmllciIsIng1MDBVbmlxdWVJZGVudGlmaWVyIiwKKwlOSURfeDUwMFVuaXF1ZUlkZW50aWZpZXIsMywmKGx2YWx1ZXNbMzg0OF0pLDB9LAoreyJtaW1lLW1ocyIsIk1JTUUgTUhTIixOSURfbWltZV9taHMsNSwmKGx2YWx1ZXNbMzg1MV0pLDB9LAoreyJtaW1lLW1ocy1oZWFkaW5ncyIsIm1pbWUtbWhzLWhlYWRpbmdzIixOSURfbWltZV9taHNfaGVhZGluZ3MsNiwKKwkmKGx2YWx1ZXNbMzg1Nl0pLDB9LAoreyJtaW1lLW1ocy1ib2RpZXMiLCJtaW1lLW1ocy1ib2RpZXMiLE5JRF9taW1lX21oc19ib2RpZXMsNiwKKwkmKGx2YWx1ZXNbMzg2Ml0pLDB9LAoreyJpZC1oZXgtcGFydGlhbC1tZXNzYWdlIiwiaWQtaGV4LXBhcnRpYWwtbWVzc2FnZSIsCisJTklEX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UsNywmKGx2YWx1ZXNbMzg2OF0pLDB9LAoreyJpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UiLCJpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UiLAorCU5JRF9pZF9oZXhfbXVsdGlwYXJ0X21lc3NhZ2UsNywmKGx2YWx1ZXNbMzg3NV0pLDB9LAoreyJnZW5lcmF0aW9uUXVhbGlmaWVyIiwiZ2VuZXJhdGlvblF1YWxpZmllciIsTklEX2dlbmVyYXRpb25RdWFsaWZpZXIsCisJMywmKGx2YWx1ZXNbMzg4Ml0pLDB9LAoreyJwc2V1ZG9ueW0iLCJwc2V1ZG9ueW0iLE5JRF9wc2V1ZG9ueW0sMywmKGx2YWx1ZXNbMzg4NV0pLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAoreyJpZC1zZXQiLCJTZWN1cmUgRWxlY3Ryb25pYyBUcmFuc2FjdGlvbnMiLE5JRF9pZF9zZXQsMiwKKwkmKGx2YWx1ZXNbMzg4OF0pLDB9LAoreyJzZXQtY3R5cGUiLCJjb250ZW50IHR5cGVzIixOSURfc2V0X2N0eXBlLDMsJihsdmFsdWVzWzM4OTBdKSwwfSwKK3sic2V0LW1zZ0V4dCIsIm1lc3NhZ2UgZXh0ZW5zaW9ucyIsTklEX3NldF9tc2dFeHQsMywmKGx2YWx1ZXNbMzg5M10pLDB9LAoreyJzZXQtYXR0ciIsInNldC1hdHRyIixOSURfc2V0X2F0dHIsMywmKGx2YWx1ZXNbMzg5Nl0pLDB9LAoreyJzZXQtcG9saWN5Iiwic2V0LXBvbGljeSIsTklEX3NldF9wb2xpY3ksMywmKGx2YWx1ZXNbMzg5OV0pLDB9LAoreyJzZXQtY2VydEV4dCIsImNlcnRpZmljYXRlIGV4dGVuc2lvbnMiLE5JRF9zZXRfY2VydEV4dCwzLAorCSYobHZhbHVlc1szOTAyXSksMH0sCit7InNldC1icmFuZCIsInNldC1icmFuZCIsTklEX3NldF9icmFuZCwzLCYobHZhbHVlc1szOTA1XSksMH0sCit7InNldGN0LVBBTkRhdGEiLCJzZXRjdC1QQU5EYXRhIixOSURfc2V0Y3RfUEFORGF0YSw0LCYobHZhbHVlc1szOTA4XSksMH0sCit7InNldGN0LVBBTlRva2VuIiwic2V0Y3QtUEFOVG9rZW4iLE5JRF9zZXRjdF9QQU5Ub2tlbiw0LAorCSYobHZhbHVlc1szOTEyXSksMH0sCit7InNldGN0LVBBTk9ubHkiLCJzZXRjdC1QQU5Pbmx5IixOSURfc2V0Y3RfUEFOT25seSw0LCYobHZhbHVlc1szOTE2XSksMH0sCit7InNldGN0LU9JRGF0YSIsInNldGN0LU9JRGF0YSIsTklEX3NldGN0X09JRGF0YSw0LCYobHZhbHVlc1szOTIwXSksMH0sCit7InNldGN0LVBJIiwic2V0Y3QtUEkiLE5JRF9zZXRjdF9QSSw0LCYobHZhbHVlc1szOTI0XSksMH0sCit7InNldGN0LVBJRGF0YSIsInNldGN0LVBJRGF0YSIsTklEX3NldGN0X1BJRGF0YSw0LCYobHZhbHVlc1szOTI4XSksMH0sCit7InNldGN0LVBJRGF0YVVuc2lnbmVkIiwic2V0Y3QtUElEYXRhVW5zaWduZWQiLAorCU5JRF9zZXRjdF9QSURhdGFVbnNpZ25lZCw0LCYobHZhbHVlc1szOTMyXSksMH0sCit7InNldGN0LUhPRElucHV0Iiwic2V0Y3QtSE9ESW5wdXQiLE5JRF9zZXRjdF9IT0RJbnB1dCw0LAorCSYobHZhbHVlc1szOTM2XSksMH0sCit7InNldGN0LUF1dGhSZXNCYWdnYWdlIiwic2V0Y3QtQXV0aFJlc0JhZ2dhZ2UiLAorCU5JRF9zZXRjdF9BdXRoUmVzQmFnZ2FnZSw0LCYobHZhbHVlc1szOTQwXSksMH0sCit7InNldGN0LUF1dGhSZXZSZXFCYWdnYWdlIiwic2V0Y3QtQXV0aFJldlJlcUJhZ2dhZ2UiLAorCU5JRF9zZXRjdF9BdXRoUmV2UmVxQmFnZ2FnZSw0LCYobHZhbHVlc1szOTQ0XSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNCYWdnYWdlIiwic2V0Y3QtQXV0aFJldlJlc0JhZ2dhZ2UiLAorCU5JRF9zZXRjdF9BdXRoUmV2UmVzQmFnZ2FnZSw0LCYobHZhbHVlc1szOTQ4XSksMH0sCit7InNldGN0LUNhcFRva2VuU2VxIiwic2V0Y3QtQ2FwVG9rZW5TZXEiLE5JRF9zZXRjdF9DYXBUb2tlblNlcSw0LAorCSYobHZhbHVlc1szOTUyXSksMH0sCit7InNldGN0LVBJbml0UmVzRGF0YSIsInNldGN0LVBJbml0UmVzRGF0YSIsTklEX3NldGN0X1BJbml0UmVzRGF0YSw0LAorCSYobHZhbHVlc1szOTU2XSksMH0sCit7InNldGN0LVBJLVRCUyIsInNldGN0LVBJLVRCUyIsTklEX3NldGN0X1BJX1RCUyw0LCYobHZhbHVlc1szOTYwXSksMH0sCit7InNldGN0LVBSZXNEYXRhIiwic2V0Y3QtUFJlc0RhdGEiLE5JRF9zZXRjdF9QUmVzRGF0YSw0LAorCSYobHZhbHVlc1szOTY0XSksMH0sCit7InNldGN0LUF1dGhSZXFUQlMiLCJzZXRjdC1BdXRoUmVxVEJTIixOSURfc2V0Y3RfQXV0aFJlcVRCUyw0LAorCSYobHZhbHVlc1szOTY4XSksMH0sCit7InNldGN0LUF1dGhSZXNUQlMiLCJzZXRjdC1BdXRoUmVzVEJTIixOSURfc2V0Y3RfQXV0aFJlc1RCUyw0LAorCSYobHZhbHVlc1szOTcyXSksMH0sCit7InNldGN0LUF1dGhSZXNUQlNYIiwic2V0Y3QtQXV0aFJlc1RCU1giLE5JRF9zZXRjdF9BdXRoUmVzVEJTWCw0LAorCSYobHZhbHVlc1szOTc2XSksMH0sCit7InNldGN0LUF1dGhUb2tlblRCUyIsInNldGN0LUF1dGhUb2tlblRCUyIsTklEX3NldGN0X0F1dGhUb2tlblRCUyw0LAorCSYobHZhbHVlc1szOTgwXSksMH0sCit7InNldGN0LUNhcFRva2VuRGF0YSIsInNldGN0LUNhcFRva2VuRGF0YSIsTklEX3NldGN0X0NhcFRva2VuRGF0YSw0LAorCSYobHZhbHVlc1szOTg0XSksMH0sCit7InNldGN0LUNhcFRva2VuVEJTIiwic2V0Y3QtQ2FwVG9rZW5UQlMiLE5JRF9zZXRjdF9DYXBUb2tlblRCUyw0LAorCSYobHZhbHVlc1szOTg4XSksMH0sCit7InNldGN0LUFjcUNhcmRDb2RlTXNnIiwic2V0Y3QtQWNxQ2FyZENvZGVNc2ciLAorCU5JRF9zZXRjdF9BY3FDYXJkQ29kZU1zZyw0LCYobHZhbHVlc1szOTkyXSksMH0sCit7InNldGN0LUF1dGhSZXZSZXFUQlMiLCJzZXRjdC1BdXRoUmV2UmVxVEJTIixOSURfc2V0Y3RfQXV0aFJldlJlcVRCUywKKwk0LCYobHZhbHVlc1szOTk2XSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNEYXRhIiwic2V0Y3QtQXV0aFJldlJlc0RhdGEiLAorCU5JRF9zZXRjdF9BdXRoUmV2UmVzRGF0YSw0LCYobHZhbHVlc1s0MDAwXSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNUQlMiLCJzZXRjdC1BdXRoUmV2UmVzVEJTIixOSURfc2V0Y3RfQXV0aFJldlJlc1RCUywKKwk0LCYobHZhbHVlc1s0MDA0XSksMH0sCit7InNldGN0LUNhcFJlcVRCUyIsInNldGN0LUNhcFJlcVRCUyIsTklEX3NldGN0X0NhcFJlcVRCUyw0LAorCSYobHZhbHVlc1s0MDA4XSksMH0sCit7InNldGN0LUNhcFJlcVRCU1giLCJzZXRjdC1DYXBSZXFUQlNYIixOSURfc2V0Y3RfQ2FwUmVxVEJTWCw0LAorCSYobHZhbHVlc1s0MDEyXSksMH0sCit7InNldGN0LUNhcFJlc0RhdGEiLCJzZXRjdC1DYXBSZXNEYXRhIixOSURfc2V0Y3RfQ2FwUmVzRGF0YSw0LAorCSYobHZhbHVlc1s0MDE2XSksMH0sCit7InNldGN0LUNhcFJldlJlcVRCUyIsInNldGN0LUNhcFJldlJlcVRCUyIsTklEX3NldGN0X0NhcFJldlJlcVRCUyw0LAorCSYobHZhbHVlc1s0MDIwXSksMH0sCit7InNldGN0LUNhcFJldlJlcVRCU1giLCJzZXRjdC1DYXBSZXZSZXFUQlNYIixOSURfc2V0Y3RfQ2FwUmV2UmVxVEJTWCwKKwk0LCYobHZhbHVlc1s0MDI0XSksMH0sCit7InNldGN0LUNhcFJldlJlc0RhdGEiLCJzZXRjdC1DYXBSZXZSZXNEYXRhIixOSURfc2V0Y3RfQ2FwUmV2UmVzRGF0YSwKKwk0LCYobHZhbHVlc1s0MDI4XSksMH0sCit7InNldGN0LUNyZWRSZXFUQlMiLCJzZXRjdC1DcmVkUmVxVEJTIixOSURfc2V0Y3RfQ3JlZFJlcVRCUyw0LAorCSYobHZhbHVlc1s0MDMyXSksMH0sCit7InNldGN0LUNyZWRSZXFUQlNYIiwic2V0Y3QtQ3JlZFJlcVRCU1giLE5JRF9zZXRjdF9DcmVkUmVxVEJTWCw0LAorCSYobHZhbHVlc1s0MDM2XSksMH0sCit7InNldGN0LUNyZWRSZXNEYXRhIiwic2V0Y3QtQ3JlZFJlc0RhdGEiLE5JRF9zZXRjdF9DcmVkUmVzRGF0YSw0LAorCSYobHZhbHVlc1s0MDQwXSksMH0sCit7InNldGN0LUNyZWRSZXZSZXFUQlMiLCJzZXRjdC1DcmVkUmV2UmVxVEJTIixOSURfc2V0Y3RfQ3JlZFJldlJlcVRCUywKKwk0LCYobHZhbHVlc1s0MDQ0XSksMH0sCit7InNldGN0LUNyZWRSZXZSZXFUQlNYIiwic2V0Y3QtQ3JlZFJldlJlcVRCU1giLAorCU5JRF9zZXRjdF9DcmVkUmV2UmVxVEJTWCw0LCYobHZhbHVlc1s0MDQ4XSksMH0sCit7InNldGN0LUNyZWRSZXZSZXNEYXRhIiwic2V0Y3QtQ3JlZFJldlJlc0RhdGEiLAorCU5JRF9zZXRjdF9DcmVkUmV2UmVzRGF0YSw0LCYobHZhbHVlc1s0MDUyXSksMH0sCit7InNldGN0LVBDZXJ0UmVxRGF0YSIsInNldGN0LVBDZXJ0UmVxRGF0YSIsTklEX3NldGN0X1BDZXJ0UmVxRGF0YSw0LAorCSYobHZhbHVlc1s0MDU2XSksMH0sCit7InNldGN0LVBDZXJ0UmVzVEJTIiwic2V0Y3QtUENlcnRSZXNUQlMiLE5JRF9zZXRjdF9QQ2VydFJlc1RCUyw0LAorCSYobHZhbHVlc1s0MDYwXSksMH0sCit7InNldGN0LUJhdGNoQWRtaW5SZXFEYXRhIiwic2V0Y3QtQmF0Y2hBZG1pblJlcURhdGEiLAorCU5JRF9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YSw0LCYobHZhbHVlc1s0MDY0XSksMH0sCit7InNldGN0LUJhdGNoQWRtaW5SZXNEYXRhIiwic2V0Y3QtQmF0Y2hBZG1pblJlc0RhdGEiLAorCU5JRF9zZXRjdF9CYXRjaEFkbWluUmVzRGF0YSw0LCYobHZhbHVlc1s0MDY4XSksMH0sCit7InNldGN0LUNhcmRDSW5pdFJlc1RCUyIsInNldGN0LUNhcmRDSW5pdFJlc1RCUyIsCisJTklEX3NldGN0X0NhcmRDSW5pdFJlc1RCUyw0LCYobHZhbHVlc1s0MDcyXSksMH0sCit7InNldGN0LU1lQXFDSW5pdFJlc1RCUyIsInNldGN0LU1lQXFDSW5pdFJlc1RCUyIsCisJTklEX3NldGN0X01lQXFDSW5pdFJlc1RCUyw0LCYobHZhbHVlc1s0MDc2XSksMH0sCit7InNldGN0LVJlZ0Zvcm1SZXNUQlMiLCJzZXRjdC1SZWdGb3JtUmVzVEJTIixOSURfc2V0Y3RfUmVnRm9ybVJlc1RCUywKKwk0LCYobHZhbHVlc1s0MDgwXSksMH0sCit7InNldGN0LUNlcnRSZXFEYXRhIiwic2V0Y3QtQ2VydFJlcURhdGEiLE5JRF9zZXRjdF9DZXJ0UmVxRGF0YSw0LAorCSYobHZhbHVlc1s0MDg0XSksMH0sCit7InNldGN0LUNlcnRSZXFUQlMiLCJzZXRjdC1DZXJ0UmVxVEJTIixOSURfc2V0Y3RfQ2VydFJlcVRCUyw0LAorCSYobHZhbHVlc1s0MDg4XSksMH0sCit7InNldGN0LUNlcnRSZXNEYXRhIiwic2V0Y3QtQ2VydFJlc0RhdGEiLE5JRF9zZXRjdF9DZXJ0UmVzRGF0YSw0LAorCSYobHZhbHVlc1s0MDkyXSksMH0sCit7InNldGN0LUNlcnRJbnFSZXFUQlMiLCJzZXRjdC1DZXJ0SW5xUmVxVEJTIixOSURfc2V0Y3RfQ2VydElucVJlcVRCUywKKwk0LCYobHZhbHVlc1s0MDk2XSksMH0sCit7InNldGN0LUVycm9yVEJTIiwic2V0Y3QtRXJyb3JUQlMiLE5JRF9zZXRjdF9FcnJvclRCUyw0LAorCSYobHZhbHVlc1s0MTAwXSksMH0sCit7InNldGN0LVBJRHVhbFNpZ25lZFRCRSIsInNldGN0LVBJRHVhbFNpZ25lZFRCRSIsCisJTklEX3NldGN0X1BJRHVhbFNpZ25lZFRCRSw0LCYobHZhbHVlc1s0MTA0XSksMH0sCit7InNldGN0LVBJVW5zaWduZWRUQkUiLCJzZXRjdC1QSVVuc2lnbmVkVEJFIixOSURfc2V0Y3RfUElVbnNpZ25lZFRCRSwKKwk0LCYobHZhbHVlc1s0MTA4XSksMH0sCit7InNldGN0LUF1dGhSZXFUQkUiLCJzZXRjdC1BdXRoUmVxVEJFIixOSURfc2V0Y3RfQXV0aFJlcVRCRSw0LAorCSYobHZhbHVlc1s0MTEyXSksMH0sCit7InNldGN0LUF1dGhSZXNUQkUiLCJzZXRjdC1BdXRoUmVzVEJFIixOSURfc2V0Y3RfQXV0aFJlc1RCRSw0LAorCSYobHZhbHVlc1s0MTE2XSksMH0sCit7InNldGN0LUF1dGhSZXNUQkVYIiwic2V0Y3QtQXV0aFJlc1RCRVgiLE5JRF9zZXRjdF9BdXRoUmVzVEJFWCw0LAorCSYobHZhbHVlc1s0MTIwXSksMH0sCit7InNldGN0LUF1dGhUb2tlblRCRSIsInNldGN0LUF1dGhUb2tlblRCRSIsTklEX3NldGN0X0F1dGhUb2tlblRCRSw0LAorCSYobHZhbHVlc1s0MTI0XSksMH0sCit7InNldGN0LUNhcFRva2VuVEJFIiwic2V0Y3QtQ2FwVG9rZW5UQkUiLE5JRF9zZXRjdF9DYXBUb2tlblRCRSw0LAorCSYobHZhbHVlc1s0MTI4XSksMH0sCit7InNldGN0LUNhcFRva2VuVEJFWCIsInNldGN0LUNhcFRva2VuVEJFWCIsTklEX3NldGN0X0NhcFRva2VuVEJFWCw0LAorCSYobHZhbHVlc1s0MTMyXSksMH0sCit7InNldGN0LUFjcUNhcmRDb2RlTXNnVEJFIiwic2V0Y3QtQWNxQ2FyZENvZGVNc2dUQkUiLAorCU5JRF9zZXRjdF9BY3FDYXJkQ29kZU1zZ1RCRSw0LCYobHZhbHVlc1s0MTM2XSksMH0sCit7InNldGN0LUF1dGhSZXZSZXFUQkUiLCJzZXRjdC1BdXRoUmV2UmVxVEJFIixOSURfc2V0Y3RfQXV0aFJldlJlcVRCRSwKKwk0LCYobHZhbHVlc1s0MTQwXSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNUQkUiLCJzZXRjdC1BdXRoUmV2UmVzVEJFIixOSURfc2V0Y3RfQXV0aFJldlJlc1RCRSwKKwk0LCYobHZhbHVlc1s0MTQ0XSksMH0sCit7InNldGN0LUF1dGhSZXZSZXNUQkVCIiwic2V0Y3QtQXV0aFJldlJlc1RCRUIiLAorCU5JRF9zZXRjdF9BdXRoUmV2UmVzVEJFQiw0LCYobHZhbHVlc1s0MTQ4XSksMH0sCit7InNldGN0LUNhcFJlcVRCRSIsInNldGN0LUNhcFJlcVRCRSIsTklEX3NldGN0X0NhcFJlcVRCRSw0LAorCSYobHZhbHVlc1s0MTUyXSksMH0sCit7InNldGN0LUNhcFJlcVRCRVgiLCJzZXRjdC1DYXBSZXFUQkVYIixOSURfc2V0Y3RfQ2FwUmVxVEJFWCw0LAorCSYobHZhbHVlc1s0MTU2XSksMH0sCit7InNldGN0LUNhcFJlc1RCRSIsInNldGN0LUNhcFJlc1RCRSIsTklEX3NldGN0X0NhcFJlc1RCRSw0LAorCSYobHZhbHVlc1s0MTYwXSksMH0sCit7InNldGN0LUNhcFJldlJlcVRCRSIsInNldGN0LUNhcFJldlJlcVRCRSIsTklEX3NldGN0X0NhcFJldlJlcVRCRSw0LAorCSYobHZhbHVlc1s0MTY0XSksMH0sCit7InNldGN0LUNhcFJldlJlcVRCRVgiLCJzZXRjdC1DYXBSZXZSZXFUQkVYIixOSURfc2V0Y3RfQ2FwUmV2UmVxVEJFWCwKKwk0LCYobHZhbHVlc1s0MTY4XSksMH0sCit7InNldGN0LUNhcFJldlJlc1RCRSIsInNldGN0LUNhcFJldlJlc1RCRSIsTklEX3NldGN0X0NhcFJldlJlc1RCRSw0LAorCSYobHZhbHVlc1s0MTcyXSksMH0sCit7InNldGN0LUNyZWRSZXFUQkUiLCJzZXRjdC1DcmVkUmVxVEJFIixOSURfc2V0Y3RfQ3JlZFJlcVRCRSw0LAorCSYobHZhbHVlc1s0MTc2XSksMH0sCit7InNldGN0LUNyZWRSZXFUQkVYIiwic2V0Y3QtQ3JlZFJlcVRCRVgiLE5JRF9zZXRjdF9DcmVkUmVxVEJFWCw0LAorCSYobHZhbHVlc1s0MTgwXSksMH0sCit7InNldGN0LUNyZWRSZXNUQkUiLCJzZXRjdC1DcmVkUmVzVEJFIixOSURfc2V0Y3RfQ3JlZFJlc1RCRSw0LAorCSYobHZhbHVlc1s0MTg0XSksMH0sCit7InNldGN0LUNyZWRSZXZSZXFUQkUiLCJzZXRjdC1DcmVkUmV2UmVxVEJFIixOSURfc2V0Y3RfQ3JlZFJldlJlcVRCRSwKKwk0LCYobHZhbHVlc1s0MTg4XSksMH0sCit7InNldGN0LUNyZWRSZXZSZXFUQkVYIiwic2V0Y3QtQ3JlZFJldlJlcVRCRVgiLAorCU5JRF9zZXRjdF9DcmVkUmV2UmVxVEJFWCw0LCYobHZhbHVlc1s0MTkyXSksMH0sCit7InNldGN0LUNyZWRSZXZSZXNUQkUiLCJzZXRjdC1DcmVkUmV2UmVzVEJFIixOSURfc2V0Y3RfQ3JlZFJldlJlc1RCRSwKKwk0LCYobHZhbHVlc1s0MTk2XSksMH0sCit7InNldGN0LUJhdGNoQWRtaW5SZXFUQkUiLCJzZXRjdC1CYXRjaEFkbWluUmVxVEJFIiwKKwlOSURfc2V0Y3RfQmF0Y2hBZG1pblJlcVRCRSw0LCYobHZhbHVlc1s0MjAwXSksMH0sCit7InNldGN0LUJhdGNoQWRtaW5SZXNUQkUiLCJzZXRjdC1CYXRjaEFkbWluUmVzVEJFIiwKKwlOSURfc2V0Y3RfQmF0Y2hBZG1pblJlc1RCRSw0LCYobHZhbHVlc1s0MjA0XSksMH0sCit7InNldGN0LVJlZ0Zvcm1SZXFUQkUiLCJzZXRjdC1SZWdGb3JtUmVxVEJFIixOSURfc2V0Y3RfUmVnRm9ybVJlcVRCRSwKKwk0LCYobHZhbHVlc1s0MjA4XSksMH0sCit7InNldGN0LUNlcnRSZXFUQkUiLCJzZXRjdC1DZXJ0UmVxVEJFIixOSURfc2V0Y3RfQ2VydFJlcVRCRSw0LAorCSYobHZhbHVlc1s0MjEyXSksMH0sCit7InNldGN0LUNlcnRSZXFUQkVYIiwic2V0Y3QtQ2VydFJlcVRCRVgiLE5JRF9zZXRjdF9DZXJ0UmVxVEJFWCw0LAorCSYobHZhbHVlc1s0MjE2XSksMH0sCit7InNldGN0LUNlcnRSZXNUQkUiLCJzZXRjdC1DZXJ0UmVzVEJFIixOSURfc2V0Y3RfQ2VydFJlc1RCRSw0LAorCSYobHZhbHVlc1s0MjIwXSksMH0sCit7InNldGN0LUNSTE5vdGlmaWNhdGlvblRCUyIsInNldGN0LUNSTE5vdGlmaWNhdGlvblRCUyIsCisJTklEX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUyw0LCYobHZhbHVlc1s0MjI0XSksMH0sCit7InNldGN0LUNSTE5vdGlmaWNhdGlvblJlc1RCUyIsInNldGN0LUNSTE5vdGlmaWNhdGlvblJlc1RCUyIsCisJTklEX3NldGN0X0NSTE5vdGlmaWNhdGlvblJlc1RCUyw0LCYobHZhbHVlc1s0MjI4XSksMH0sCit7InNldGN0LUJDSURpc3RyaWJ1dGlvblRCUyIsInNldGN0LUJDSURpc3RyaWJ1dGlvblRCUyIsCisJTklEX3NldGN0X0JDSURpc3RyaWJ1dGlvblRCUyw0LCYobHZhbHVlc1s0MjMyXSksMH0sCit7InNldGV4dC1nZW5DcnlwdCIsImdlbmVyaWMgY3J5cHRvZ3JhbSIsTklEX3NldGV4dF9nZW5DcnlwdCw0LAorCSYobHZhbHVlc1s0MjM2XSksMH0sCit7InNldGV4dC1taUF1dGgiLCJtZXJjaGFudCBpbml0aWF0ZWQgYXV0aCIsTklEX3NldGV4dF9taUF1dGgsNCwKKwkmKGx2YWx1ZXNbNDI0MF0pLDB9LAoreyJzZXRleHQtcGluU2VjdXJlIiwic2V0ZXh0LXBpblNlY3VyZSIsTklEX3NldGV4dF9waW5TZWN1cmUsNCwKKwkmKGx2YWx1ZXNbNDI0NF0pLDB9LAoreyJzZXRleHQtcGluQW55Iiwic2V0ZXh0LXBpbkFueSIsTklEX3NldGV4dF9waW5BbnksNCwmKGx2YWx1ZXNbNDI0OF0pLDB9LAoreyJzZXRleHQtdHJhY2syIiwic2V0ZXh0LXRyYWNrMiIsTklEX3NldGV4dF90cmFjazIsNCwmKGx2YWx1ZXNbNDI1Ml0pLDB9LAoreyJzZXRleHQtY3YiLCJhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbiIsTklEX3NldGV4dF9jdiw0LAorCSYobHZhbHVlc1s0MjU2XSksMH0sCit7InNldC1wb2xpY3ktcm9vdCIsInNldC1wb2xpY3ktcm9vdCIsTklEX3NldF9wb2xpY3lfcm9vdCw0LAorCSYobHZhbHVlc1s0MjYwXSksMH0sCit7InNldENleHQtaGFzaGVkUm9vdCIsInNldENleHQtaGFzaGVkUm9vdCIsTklEX3NldENleHRfaGFzaGVkUm9vdCw0LAorCSYobHZhbHVlc1s0MjY0XSksMH0sCit7InNldENleHQtY2VydFR5cGUiLCJzZXRDZXh0LWNlcnRUeXBlIixOSURfc2V0Q2V4dF9jZXJ0VHlwZSw0LAorCSYobHZhbHVlc1s0MjY4XSksMH0sCit7InNldENleHQtbWVyY2hEYXRhIiwic2V0Q2V4dC1tZXJjaERhdGEiLE5JRF9zZXRDZXh0X21lcmNoRGF0YSw0LAorCSYobHZhbHVlc1s0MjcyXSksMH0sCit7InNldENleHQtY0NlcnRSZXF1aXJlZCIsInNldENleHQtY0NlcnRSZXF1aXJlZCIsCisJTklEX3NldENleHRfY0NlcnRSZXF1aXJlZCw0LCYobHZhbHVlc1s0Mjc2XSksMH0sCit7InNldENleHQtdHVubmVsaW5nIiwic2V0Q2V4dC10dW5uZWxpbmciLE5JRF9zZXRDZXh0X3R1bm5lbGluZyw0LAorCSYobHZhbHVlc1s0MjgwXSksMH0sCit7InNldENleHQtc2V0RXh0Iiwic2V0Q2V4dC1zZXRFeHQiLE5JRF9zZXRDZXh0X3NldEV4dCw0LAorCSYobHZhbHVlc1s0Mjg0XSksMH0sCit7InNldENleHQtc2V0UXVhbGYiLCJzZXRDZXh0LXNldFF1YWxmIixOSURfc2V0Q2V4dF9zZXRRdWFsZiw0LAorCSYobHZhbHVlc1s0Mjg4XSksMH0sCit7InNldENleHQtUEdXWWNhcGFiaWxpdGllcyIsInNldENleHQtUEdXWWNhcGFiaWxpdGllcyIsCisJTklEX3NldENleHRfUEdXWWNhcGFiaWxpdGllcyw0LCYobHZhbHVlc1s0MjkyXSksMH0sCit7InNldENleHQtVG9rZW5JZGVudGlmaWVyIiwic2V0Q2V4dC1Ub2tlbklkZW50aWZpZXIiLAorCU5JRF9zZXRDZXh0X1Rva2VuSWRlbnRpZmllciw0LCYobHZhbHVlc1s0Mjk2XSksMH0sCit7InNldENleHQtVHJhY2syRGF0YSIsInNldENleHQtVHJhY2syRGF0YSIsTklEX3NldENleHRfVHJhY2syRGF0YSw0LAorCSYobHZhbHVlc1s0MzAwXSksMH0sCit7InNldENleHQtVG9rZW5UeXBlIiwic2V0Q2V4dC1Ub2tlblR5cGUiLE5JRF9zZXRDZXh0X1Rva2VuVHlwZSw0LAorCSYobHZhbHVlc1s0MzA0XSksMH0sCit7InNldENleHQtSXNzdWVyQ2FwYWJpbGl0aWVzIiwic2V0Q2V4dC1Jc3N1ZXJDYXBhYmlsaXRpZXMiLAorCU5JRF9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcyw0LCYobHZhbHVlc1s0MzA4XSksMH0sCit7InNldEF0dHItQ2VydCIsInNldEF0dHItQ2VydCIsTklEX3NldEF0dHJfQ2VydCw0LCYobHZhbHVlc1s0MzEyXSksMH0sCit7InNldEF0dHItUEdXWWNhcCIsInBheW1lbnQgZ2F0ZXdheSBjYXBhYmlsaXRpZXMiLE5JRF9zZXRBdHRyX1BHV1ljYXAsCisJNCwmKGx2YWx1ZXNbNDMxNl0pLDB9LAoreyJzZXRBdHRyLVRva2VuVHlwZSIsInNldEF0dHItVG9rZW5UeXBlIixOSURfc2V0QXR0cl9Ub2tlblR5cGUsNCwKKwkmKGx2YWx1ZXNbNDMyMF0pLDB9LAoreyJzZXRBdHRyLUlzc0NhcCIsImlzc3VlciBjYXBhYmlsaXRpZXMiLE5JRF9zZXRBdHRyX0lzc0NhcCw0LAorCSYobHZhbHVlc1s0MzI0XSksMH0sCit7InNldC1yb290S2V5VGh1bWIiLCJzZXQtcm9vdEtleVRodW1iIixOSURfc2V0X3Jvb3RLZXlUaHVtYiw1LAorCSYobHZhbHVlc1s0MzI4XSksMH0sCit7InNldC1hZGRQb2xpY3kiLCJzZXQtYWRkUG9saWN5IixOSURfc2V0X2FkZFBvbGljeSw1LCYobHZhbHVlc1s0MzMzXSksMH0sCit7InNldEF0dHItVG9rZW4tRU1WIiwic2V0QXR0ci1Ub2tlbi1FTVYiLE5JRF9zZXRBdHRyX1Rva2VuX0VNViw1LAorCSYobHZhbHVlc1s0MzM4XSksMH0sCit7InNldEF0dHItVG9rZW4tQjBQcmltZSIsInNldEF0dHItVG9rZW4tQjBQcmltZSIsCisJTklEX3NldEF0dHJfVG9rZW5fQjBQcmltZSw1LCYobHZhbHVlc1s0MzQzXSksMH0sCit7InNldEF0dHItSXNzQ2FwLUNWTSIsInNldEF0dHItSXNzQ2FwLUNWTSIsTklEX3NldEF0dHJfSXNzQ2FwX0NWTSw1LAorCSYobHZhbHVlc1s0MzQ4XSksMH0sCit7InNldEF0dHItSXNzQ2FwLVQyIiwic2V0QXR0ci1Jc3NDYXAtVDIiLE5JRF9zZXRBdHRyX0lzc0NhcF9UMiw1LAorCSYobHZhbHVlc1s0MzUzXSksMH0sCit7InNldEF0dHItSXNzQ2FwLVNpZyIsInNldEF0dHItSXNzQ2FwLVNpZyIsTklEX3NldEF0dHJfSXNzQ2FwX1NpZyw1LAorCSYobHZhbHVlc1s0MzU4XSksMH0sCit7InNldEF0dHItR2VuQ3J5cHRncm0iLCJnZW5lcmF0ZSBjcnlwdG9ncmFtIixOSURfc2V0QXR0cl9HZW5DcnlwdGdybSwKKwk2LCYobHZhbHVlc1s0MzYzXSksMH0sCit7InNldEF0dHItVDJFbmMiLCJlbmNyeXB0ZWQgdHJhY2sgMiIsTklEX3NldEF0dHJfVDJFbmMsNiwKKwkmKGx2YWx1ZXNbNDM2OV0pLDB9LAoreyJzZXRBdHRyLVQyY2xlYXJ0eHQiLCJjbGVhcnRleHQgdHJhY2sgMiIsTklEX3NldEF0dHJfVDJjbGVhcnR4dCw2LAorCSYobHZhbHVlc1s0Mzc1XSksMH0sCit7InNldEF0dHItVG9rSUNDc2lnIiwiSUNDIG9yIHRva2VuIHNpZ25hdHVyZSIsTklEX3NldEF0dHJfVG9rSUNDc2lnLDYsCisJJihsdmFsdWVzWzQzODFdKSwwfSwKK3sic2V0QXR0ci1TZWNEZXZTaWciLCJzZWN1cmUgZGV2aWNlIHNpZ25hdHVyZSIsTklEX3NldEF0dHJfU2VjRGV2U2lnLAorCTYsJihsdmFsdWVzWzQzODddKSwwfSwKK3sic2V0LWJyYW5kLUlBVEEtQVRBIiwic2V0LWJyYW5kLUlBVEEtQVRBIixOSURfc2V0X2JyYW5kX0lBVEFfQVRBLDQsCisJJihsdmFsdWVzWzQzOTNdKSwwfSwKK3sic2V0LWJyYW5kLURpbmVycyIsInNldC1icmFuZC1EaW5lcnMiLE5JRF9zZXRfYnJhbmRfRGluZXJzLDQsCisJJihsdmFsdWVzWzQzOTddKSwwfSwKK3sic2V0LWJyYW5kLUFtZXJpY2FuRXhwcmVzcyIsInNldC1icmFuZC1BbWVyaWNhbkV4cHJlc3MiLAorCU5JRF9zZXRfYnJhbmRfQW1lcmljYW5FeHByZXNzLDQsJihsdmFsdWVzWzQ0MDFdKSwwfSwKK3sic2V0LWJyYW5kLUpDQiIsInNldC1icmFuZC1KQ0IiLE5JRF9zZXRfYnJhbmRfSkNCLDQsJihsdmFsdWVzWzQ0MDVdKSwwfSwKK3sic2V0LWJyYW5kLVZpc2EiLCJzZXQtYnJhbmQtVmlzYSIsTklEX3NldF9icmFuZF9WaXNhLDQsCisJJihsdmFsdWVzWzQ0MDldKSwwfSwKK3sic2V0LWJyYW5kLU1hc3RlckNhcmQiLCJzZXQtYnJhbmQtTWFzdGVyQ2FyZCIsCisJTklEX3NldF9icmFuZF9NYXN0ZXJDYXJkLDQsJihsdmFsdWVzWzQ0MTNdKSwwfSwKK3sic2V0LWJyYW5kLU5vdnVzIiwic2V0LWJyYW5kLU5vdnVzIixOSURfc2V0X2JyYW5kX05vdnVzLDUsCisJJihsdmFsdWVzWzQ0MTddKSwwfSwKK3siREVTLUNETUYiLCJkZXMtY2RtZiIsTklEX2Rlc19jZG1mLDgsJihsdmFsdWVzWzQ0MjJdKSwwfSwKK3sicnNhT0FFUEVuY3J5cHRpb25TRVQiLCJyc2FPQUVQRW5jcnlwdGlvblNFVCIsCisJTklEX3JzYU9BRVBFbmNyeXB0aW9uU0VULDksJihsdmFsdWVzWzQ0MzBdKSwwfSwKK3siSVRVLVQiLCJpdHUtdCIsTklEX2l0dV90LDEsJihsdmFsdWVzWzQ0MzldKSwwfSwKK3siSk9JTlQtSVNPLUlUVS1UIiwiam9pbnQtaXNvLWl0dS10IixOSURfam9pbnRfaXNvX2l0dV90LDEsCisJJihsdmFsdWVzWzQ0NDBdKSwwfSwKK3siaW50ZXJuYXRpb25hbC1vcmdhbml6YXRpb25zIiwiSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb25zIiwKKwlOSURfaW50ZXJuYXRpb25hbF9vcmdhbml6YXRpb25zLDEsJihsdmFsdWVzWzQ0NDFdKSwwfSwKK3sibXNTbWFydGNhcmRMb2dpbiIsIk1pY3Jvc29mdCBTbWFydGNhcmRsb2dpbiIsTklEX21zX3NtYXJ0Y2FyZF9sb2dpbiwKKwkxMCwmKGx2YWx1ZXNbNDQ0Ml0pLDB9LAoreyJtc1VQTiIsIk1pY3Jvc29mdCBVbml2ZXJzYWwgUHJpbmNpcGFsIE5hbWUiLE5JRF9tc191cG4sMTAsCisJJihsdmFsdWVzWzQ0NTJdKSwwfSwKK3siQUVTLTEyOC1DRkIxIiwiYWVzLTEyOC1jZmIxIixOSURfYWVzXzEyOF9jZmIxLDAsTlVMTCwwfSwKK3siQUVTLTE5Mi1DRkIxIiwiYWVzLTE5Mi1jZmIxIixOSURfYWVzXzE5Ml9jZmIxLDAsTlVMTCwwfSwKK3siQUVTLTI1Ni1DRkIxIiwiYWVzLTI1Ni1jZmIxIixOSURfYWVzXzI1Nl9jZmIxLDAsTlVMTCwwfSwKK3siQUVTLTEyOC1DRkI4IiwiYWVzLTEyOC1jZmI4IixOSURfYWVzXzEyOF9jZmI4LDAsTlVMTCwwfSwKK3siQUVTLTE5Mi1DRkI4IiwiYWVzLTE5Mi1jZmI4IixOSURfYWVzXzE5Ml9jZmI4LDAsTlVMTCwwfSwKK3siQUVTLTI1Ni1DRkI4IiwiYWVzLTI1Ni1jZmI4IixOSURfYWVzXzI1Nl9jZmI4LDAsTlVMTCwwfSwKK3siREVTLUNGQjEiLCJkZXMtY2ZiMSIsTklEX2Rlc19jZmIxLDAsTlVMTCwwfSwKK3siREVTLUNGQjgiLCJkZXMtY2ZiOCIsTklEX2Rlc19jZmI4LDAsTlVMTCwwfSwKK3siREVTLUVERTMtQ0ZCMSIsImRlcy1lZGUzLWNmYjEiLE5JRF9kZXNfZWRlM19jZmIxLDAsTlVMTCwwfSwKK3siREVTLUVERTMtQ0ZCOCIsImRlcy1lZGUzLWNmYjgiLE5JRF9kZXNfZWRlM19jZmI4LDAsTlVMTCwwfSwKK3sic3RyZWV0Iiwic3RyZWV0QWRkcmVzcyIsTklEX3N0cmVldEFkZHJlc3MsMywmKGx2YWx1ZXNbNDQ2Ml0pLDB9LAoreyJwb3N0YWxDb2RlIiwicG9zdGFsQ29kZSIsTklEX3Bvc3RhbENvZGUsMywmKGx2YWx1ZXNbNDQ2NV0pLDB9LAoreyJpZC1wcGwiLCJpZC1wcGwiLE5JRF9pZF9wcGwsNywmKGx2YWx1ZXNbNDQ2OF0pLDB9LAoreyJwcm94eUNlcnRJbmZvIiwiUHJveHkgQ2VydGlmaWNhdGUgSW5mb3JtYXRpb24iLE5JRF9wcm94eUNlcnRJbmZvLDgsCisJJihsdmFsdWVzWzQ0NzVdKSwwfSwKK3siaWQtcHBsLWFueUxhbmd1YWdlIiwiQW55IGxhbmd1YWdlIixOSURfaWRfcHBsX2FueUxhbmd1YWdlLDgsCisJJihsdmFsdWVzWzQ0ODNdKSwwfSwKK3siaWQtcHBsLWluaGVyaXRBbGwiLCJJbmhlcml0IGFsbCIsTklEX2lkX3BwbF9pbmhlcml0QWxsLDgsCisJJihsdmFsdWVzWzQ0OTFdKSwwfSwKK3sibmFtZUNvbnN0cmFpbnRzIiwiWDUwOXYzIE5hbWUgQ29uc3RyYWludHMiLE5JRF9uYW1lX2NvbnN0cmFpbnRzLDMsCisJJihsdmFsdWVzWzQ0OTldKSwwfSwKK3siaWQtcHBsLWluZGVwZW5kZW50IiwiSW5kZXBlbmRlbnQiLE5JRF9JbmRlcGVuZGVudCw4LCYobHZhbHVlc1s0NTAyXSksMH0sCit7IlJTQS1TSEEyNTYiLCJzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbiIsTklEX3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uLDksCisJJihsdmFsdWVzWzQ1MTBdKSwwfSwKK3siUlNBLVNIQTM4NCIsInNoYTM4NFdpdGhSU0FFbmNyeXB0aW9uIixOSURfc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24sOSwKKwkmKGx2YWx1ZXNbNDUxOV0pLDB9LAoreyJSU0EtU0hBNTEyIiwic2hhNTEyV2l0aFJTQUVuY3J5cHRpb24iLE5JRF9zaGE1MTJXaXRoUlNBRW5jcnlwdGlvbiw5LAorCSYobHZhbHVlc1s0NTI4XSksMH0sCit7IlJTQS1TSEEyMjQiLCJzaGEyMjRXaXRoUlNBRW5jcnlwdGlvbiIsTklEX3NoYTIyNFdpdGhSU0FFbmNyeXB0aW9uLDksCisJJihsdmFsdWVzWzQ1MzddKSwwfSwKK3siU0hBMjU2Iiwic2hhMjU2IixOSURfc2hhMjU2LDksJihsdmFsdWVzWzQ1NDZdKSwwfSwKK3siU0hBMzg0Iiwic2hhMzg0IixOSURfc2hhMzg0LDksJihsdmFsdWVzWzQ1NTVdKSwwfSwKK3siU0hBNTEyIiwic2hhNTEyIixOSURfc2hhNTEyLDksJihsdmFsdWVzWzQ1NjRdKSwwfSwKK3siU0hBMjI0Iiwic2hhMjI0IixOSURfc2hhMjI0LDksJihsdmFsdWVzWzQ1NzNdKSwwfSwKK3siaWRlbnRpZmllZC1vcmdhbml6YXRpb24iLCJpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiIsCisJTklEX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uLDEsJihsdmFsdWVzWzQ1ODJdKSwwfSwKK3siY2VydGljb20tYXJjIiwiY2VydGljb20tYXJjIixOSURfY2VydGljb21fYXJjLDMsJihsdmFsdWVzWzQ1ODNdKSwwfSwKK3sid2FwIiwid2FwIixOSURfd2FwLDIsJihsdmFsdWVzWzQ1ODZdKSwwfSwKK3sid2FwLXdzZyIsIndhcC13c2ciLE5JRF93YXBfd3NnLDMsJihsdmFsdWVzWzQ1ODhdKSwwfSwKK3siaWQtY2hhcmFjdGVyaXN0aWMtdHdvLWJhc2lzIiwiaWQtY2hhcmFjdGVyaXN0aWMtdHdvLWJhc2lzIiwKKwlOSURfWDlfNjJfaWRfY2hhcmFjdGVyaXN0aWNfdHdvX2Jhc2lzLDgsJihsdmFsdWVzWzQ1OTFdKSwwfSwKK3sib25CYXNpcyIsIm9uQmFzaXMiLE5JRF9YOV82Ml9vbkJhc2lzLDksJihsdmFsdWVzWzQ1OTldKSwwfSwKK3sidHBCYXNpcyIsInRwQmFzaXMiLE5JRF9YOV82Ml90cEJhc2lzLDksJihsdmFsdWVzWzQ2MDhdKSwwfSwKK3sicHBCYXNpcyIsInBwQmFzaXMiLE5JRF9YOV82Ml9wcEJhc2lzLDksJihsdmFsdWVzWzQ2MTddKSwwfSwKK3siYzJwbmIxNjN2MSIsImMycG5iMTYzdjEiLE5JRF9YOV82Ml9jMnBuYjE2M3YxLDgsJihsdmFsdWVzWzQ2MjZdKSwwfSwKK3siYzJwbmIxNjN2MiIsImMycG5iMTYzdjIiLE5JRF9YOV82Ml9jMnBuYjE2M3YyLDgsJihsdmFsdWVzWzQ2MzRdKSwwfSwKK3siYzJwbmIxNjN2MyIsImMycG5iMTYzdjMiLE5JRF9YOV82Ml9jMnBuYjE2M3YzLDgsJihsdmFsdWVzWzQ2NDJdKSwwfSwKK3siYzJwbmIxNzZ2MSIsImMycG5iMTc2djEiLE5JRF9YOV82Ml9jMnBuYjE3NnYxLDgsJihsdmFsdWVzWzQ2NTBdKSwwfSwKK3siYzJ0bmIxOTF2MSIsImMydG5iMTkxdjEiLE5JRF9YOV82Ml9jMnRuYjE5MXYxLDgsJihsdmFsdWVzWzQ2NThdKSwwfSwKK3siYzJ0bmIxOTF2MiIsImMydG5iMTkxdjIiLE5JRF9YOV82Ml9jMnRuYjE5MXYyLDgsJihsdmFsdWVzWzQ2NjZdKSwwfSwKK3siYzJ0bmIxOTF2MyIsImMydG5iMTkxdjMiLE5JRF9YOV82Ml9jMnRuYjE5MXYzLDgsJihsdmFsdWVzWzQ2NzRdKSwwfSwKK3siYzJvbmIxOTF2NCIsImMyb25iMTkxdjQiLE5JRF9YOV82Ml9jMm9uYjE5MXY0LDgsJihsdmFsdWVzWzQ2ODJdKSwwfSwKK3siYzJvbmIxOTF2NSIsImMyb25iMTkxdjUiLE5JRF9YOV82Ml9jMm9uYjE5MXY1LDgsJihsdmFsdWVzWzQ2OTBdKSwwfSwKK3siYzJwbmIyMDh3MSIsImMycG5iMjA4dzEiLE5JRF9YOV82Ml9jMnBuYjIwOHcxLDgsJihsdmFsdWVzWzQ2OThdKSwwfSwKK3siYzJ0bmIyMzl2MSIsImMydG5iMjM5djEiLE5JRF9YOV82Ml9jMnRuYjIzOXYxLDgsJihsdmFsdWVzWzQ3MDZdKSwwfSwKK3siYzJ0bmIyMzl2MiIsImMydG5iMjM5djIiLE5JRF9YOV82Ml9jMnRuYjIzOXYyLDgsJihsdmFsdWVzWzQ3MTRdKSwwfSwKK3siYzJ0bmIyMzl2MyIsImMydG5iMjM5djMiLE5JRF9YOV82Ml9jMnRuYjIzOXYzLDgsJihsdmFsdWVzWzQ3MjJdKSwwfSwKK3siYzJvbmIyMzl2NCIsImMyb25iMjM5djQiLE5JRF9YOV82Ml9jMm9uYjIzOXY0LDgsJihsdmFsdWVzWzQ3MzBdKSwwfSwKK3siYzJvbmIyMzl2NSIsImMyb25iMjM5djUiLE5JRF9YOV82Ml9jMm9uYjIzOXY1LDgsJihsdmFsdWVzWzQ3MzhdKSwwfSwKK3siYzJwbmIyNzJ3MSIsImMycG5iMjcydzEiLE5JRF9YOV82Ml9jMnBuYjI3MncxLDgsJihsdmFsdWVzWzQ3NDZdKSwwfSwKK3siYzJwbmIzMDR3MSIsImMycG5iMzA0dzEiLE5JRF9YOV82Ml9jMnBuYjMwNHcxLDgsJihsdmFsdWVzWzQ3NTRdKSwwfSwKK3siYzJ0bmIzNTl2MSIsImMydG5iMzU5djEiLE5JRF9YOV82Ml9jMnRuYjM1OXYxLDgsJihsdmFsdWVzWzQ3NjJdKSwwfSwKK3siYzJwbmIzNjh3MSIsImMycG5iMzY4dzEiLE5JRF9YOV82Ml9jMnBuYjM2OHcxLDgsJihsdmFsdWVzWzQ3NzBdKSwwfSwKK3siYzJ0bmI0MzFyMSIsImMydG5iNDMxcjEiLE5JRF9YOV82Ml9jMnRuYjQzMXIxLDgsJihsdmFsdWVzWzQ3NzhdKSwwfSwKK3sic2VjcDExMnIxIiwic2VjcDExMnIxIixOSURfc2VjcDExMnIxLDUsJihsdmFsdWVzWzQ3ODZdKSwwfSwKK3sic2VjcDExMnIyIiwic2VjcDExMnIyIixOSURfc2VjcDExMnIyLDUsJihsdmFsdWVzWzQ3OTFdKSwwfSwKK3sic2VjcDEyOHIxIiwic2VjcDEyOHIxIixOSURfc2VjcDEyOHIxLDUsJihsdmFsdWVzWzQ3OTZdKSwwfSwKK3sic2VjcDEyOHIyIiwic2VjcDEyOHIyIixOSURfc2VjcDEyOHIyLDUsJihsdmFsdWVzWzQ4MDFdKSwwfSwKK3sic2VjcDE2MGsxIiwic2VjcDE2MGsxIixOSURfc2VjcDE2MGsxLDUsJihsdmFsdWVzWzQ4MDZdKSwwfSwKK3sic2VjcDE2MHIxIiwic2VjcDE2MHIxIixOSURfc2VjcDE2MHIxLDUsJihsdmFsdWVzWzQ4MTFdKSwwfSwKK3sic2VjcDE2MHIyIiwic2VjcDE2MHIyIixOSURfc2VjcDE2MHIyLDUsJihsdmFsdWVzWzQ4MTZdKSwwfSwKK3sic2VjcDE5MmsxIiwic2VjcDE5MmsxIixOSURfc2VjcDE5MmsxLDUsJihsdmFsdWVzWzQ4MjFdKSwwfSwKK3sic2VjcDIyNGsxIiwic2VjcDIyNGsxIixOSURfc2VjcDIyNGsxLDUsJihsdmFsdWVzWzQ4MjZdKSwwfSwKK3sic2VjcDIyNHIxIiwic2VjcDIyNHIxIixOSURfc2VjcDIyNHIxLDUsJihsdmFsdWVzWzQ4MzFdKSwwfSwKK3sic2VjcDI1NmsxIiwic2VjcDI1NmsxIixOSURfc2VjcDI1NmsxLDUsJihsdmFsdWVzWzQ4MzZdKSwwfSwKK3sic2VjcDM4NHIxIiwic2VjcDM4NHIxIixOSURfc2VjcDM4NHIxLDUsJihsdmFsdWVzWzQ4NDFdKSwwfSwKK3sic2VjcDUyMXIxIiwic2VjcDUyMXIxIixOSURfc2VjcDUyMXIxLDUsJihsdmFsdWVzWzQ4NDZdKSwwfSwKK3sic2VjdDExM3IxIiwic2VjdDExM3IxIixOSURfc2VjdDExM3IxLDUsJihsdmFsdWVzWzQ4NTFdKSwwfSwKK3sic2VjdDExM3IyIiwic2VjdDExM3IyIixOSURfc2VjdDExM3IyLDUsJihsdmFsdWVzWzQ4NTZdKSwwfSwKK3sic2VjdDEzMXIxIiwic2VjdDEzMXIxIixOSURfc2VjdDEzMXIxLDUsJihsdmFsdWVzWzQ4NjFdKSwwfSwKK3sic2VjdDEzMXIyIiwic2VjdDEzMXIyIixOSURfc2VjdDEzMXIyLDUsJihsdmFsdWVzWzQ4NjZdKSwwfSwKK3sic2VjdDE2M2sxIiwic2VjdDE2M2sxIixOSURfc2VjdDE2M2sxLDUsJihsdmFsdWVzWzQ4NzFdKSwwfSwKK3sic2VjdDE2M3IxIiwic2VjdDE2M3IxIixOSURfc2VjdDE2M3IxLDUsJihsdmFsdWVzWzQ4NzZdKSwwfSwKK3sic2VjdDE2M3IyIiwic2VjdDE2M3IyIixOSURfc2VjdDE2M3IyLDUsJihsdmFsdWVzWzQ4ODFdKSwwfSwKK3sic2VjdDE5M3IxIiwic2VjdDE5M3IxIixOSURfc2VjdDE5M3IxLDUsJihsdmFsdWVzWzQ4ODZdKSwwfSwKK3sic2VjdDE5M3IyIiwic2VjdDE5M3IyIixOSURfc2VjdDE5M3IyLDUsJihsdmFsdWVzWzQ4OTFdKSwwfSwKK3sic2VjdDIzM2sxIiwic2VjdDIzM2sxIixOSURfc2VjdDIzM2sxLDUsJihsdmFsdWVzWzQ4OTZdKSwwfSwKK3sic2VjdDIzM3IxIiwic2VjdDIzM3IxIixOSURfc2VjdDIzM3IxLDUsJihsdmFsdWVzWzQ5MDFdKSwwfSwKK3sic2VjdDIzOWsxIiwic2VjdDIzOWsxIixOSURfc2VjdDIzOWsxLDUsJihsdmFsdWVzWzQ5MDZdKSwwfSwKK3sic2VjdDI4M2sxIiwic2VjdDI4M2sxIixOSURfc2VjdDI4M2sxLDUsJihsdmFsdWVzWzQ5MTFdKSwwfSwKK3sic2VjdDI4M3IxIiwic2VjdDI4M3IxIixOSURfc2VjdDI4M3IxLDUsJihsdmFsdWVzWzQ5MTZdKSwwfSwKK3sic2VjdDQwOWsxIiwic2VjdDQwOWsxIixOSURfc2VjdDQwOWsxLDUsJihsdmFsdWVzWzQ5MjFdKSwwfSwKK3sic2VjdDQwOXIxIiwic2VjdDQwOXIxIixOSURfc2VjdDQwOXIxLDUsJihsdmFsdWVzWzQ5MjZdKSwwfSwKK3sic2VjdDU3MWsxIiwic2VjdDU3MWsxIixOSURfc2VjdDU3MWsxLDUsJihsdmFsdWVzWzQ5MzFdKSwwfSwKK3sic2VjdDU3MXIxIiwic2VjdDU3MXIxIixOSURfc2VjdDU3MXIxLDUsJihsdmFsdWVzWzQ5MzZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMSIsIndhcC13c2ctaWRtLWVjaWQtd3RsczEiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMxLDUsJihsdmFsdWVzWzQ5NDFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMyIsIndhcC13c2ctaWRtLWVjaWQtd3RsczMiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMzLDUsJihsdmFsdWVzWzQ5NDZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzNCIsIndhcC13c2ctaWRtLWVjaWQtd3RsczQiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM0LDUsJihsdmFsdWVzWzQ5NTFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzNSIsIndhcC13c2ctaWRtLWVjaWQtd3RsczUiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM1LDUsJihsdmFsdWVzWzQ5NTZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzNiIsIndhcC13c2ctaWRtLWVjaWQtd3RsczYiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM2LDUsJihsdmFsdWVzWzQ5NjFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzNyIsIndhcC13c2ctaWRtLWVjaWQtd3RsczciLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM3LDUsJihsdmFsdWVzWzQ5NjZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzOCIsIndhcC13c2ctaWRtLWVjaWQtd3RsczgiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM4LDUsJihsdmFsdWVzWzQ5NzFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzOSIsIndhcC13c2ctaWRtLWVjaWQtd3RsczkiLAorCU5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM5LDUsJihsdmFsdWVzWzQ5NzZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMTAiLCJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMCIsCisJTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczEwLDUsJihsdmFsdWVzWzQ5ODFdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMTEiLCJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMSIsCisJTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczExLDUsJihsdmFsdWVzWzQ5ODZdKSwwfSwKK3sid2FwLXdzZy1pZG0tZWNpZC13dGxzMTIiLCJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMiIsCisJTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczEyLDUsJihsdmFsdWVzWzQ5OTFdKSwwfSwKK3siYW55UG9saWN5IiwiWDUwOXYzIEFueSBQb2xpY3kiLE5JRF9hbnlfcG9saWN5LDQsJihsdmFsdWVzWzQ5OTZdKSwwfSwKK3sicG9saWN5TWFwcGluZ3MiLCJYNTA5djMgUG9saWN5IE1hcHBpbmdzIixOSURfcG9saWN5X21hcHBpbmdzLDMsCisJJihsdmFsdWVzWzUwMDBdKSwwfSwKK3siaW5oaWJpdEFueVBvbGljeSIsIlg1MDl2MyBJbmhpYml0IEFueSBQb2xpY3kiLAorCU5JRF9pbmhpYml0X2FueV9wb2xpY3ksMywmKGx2YWx1ZXNbNTAwM10pLDB9LAoreyJPYWtsZXktRUMyTi0zIiwiaXBzZWMzIixOSURfaXBzZWMzLDAsTlVMTCwwfSwKK3siT2FrbGV5LUVDMk4tNCIsImlwc2VjNCIsTklEX2lwc2VjNCwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTEyOC1DQkMiLCJjYW1lbGxpYS0xMjgtY2JjIixOSURfY2FtZWxsaWFfMTI4X2NiYywxMSwKKwkmKGx2YWx1ZXNbNTAwNl0pLDB9LAoreyJDQU1FTExJQS0xOTItQ0JDIiwiY2FtZWxsaWEtMTkyLWNiYyIsTklEX2NhbWVsbGlhXzE5Ml9jYmMsMTEsCisJJihsdmFsdWVzWzUwMTddKSwwfSwKK3siQ0FNRUxMSUEtMjU2LUNCQyIsImNhbWVsbGlhLTI1Ni1jYmMiLE5JRF9jYW1lbGxpYV8yNTZfY2JjLDExLAorCSYobHZhbHVlc1s1MDI4XSksMH0sCit7IkNBTUVMTElBLTEyOC1FQ0IiLCJjYW1lbGxpYS0xMjgtZWNiIixOSURfY2FtZWxsaWFfMTI4X2VjYiw4LAorCSYobHZhbHVlc1s1MDM5XSksMH0sCit7IkNBTUVMTElBLTE5Mi1FQ0IiLCJjYW1lbGxpYS0xOTItZWNiIixOSURfY2FtZWxsaWFfMTkyX2VjYiw4LAorCSYobHZhbHVlc1s1MDQ3XSksMH0sCit7IkNBTUVMTElBLTI1Ni1FQ0IiLCJjYW1lbGxpYS0yNTYtZWNiIixOSURfY2FtZWxsaWFfMjU2X2VjYiw4LAorCSYobHZhbHVlc1s1MDU1XSksMH0sCit7IkNBTUVMTElBLTEyOC1DRkIiLCJjYW1lbGxpYS0xMjgtY2ZiIixOSURfY2FtZWxsaWFfMTI4X2NmYjEyOCw4LAorCSYobHZhbHVlc1s1MDYzXSksMH0sCit7IkNBTUVMTElBLTE5Mi1DRkIiLCJjYW1lbGxpYS0xOTItY2ZiIixOSURfY2FtZWxsaWFfMTkyX2NmYjEyOCw4LAorCSYobHZhbHVlc1s1MDcxXSksMH0sCit7IkNBTUVMTElBLTI1Ni1DRkIiLCJjYW1lbGxpYS0yNTYtY2ZiIixOSURfY2FtZWxsaWFfMjU2X2NmYjEyOCw4LAorCSYobHZhbHVlc1s1MDc5XSksMH0sCit7IkNBTUVMTElBLTEyOC1DRkIxIiwiY2FtZWxsaWEtMTI4LWNmYjEiLE5JRF9jYW1lbGxpYV8xMjhfY2ZiMSwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTE5Mi1DRkIxIiwiY2FtZWxsaWEtMTkyLWNmYjEiLE5JRF9jYW1lbGxpYV8xOTJfY2ZiMSwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTI1Ni1DRkIxIiwiY2FtZWxsaWEtMjU2LWNmYjEiLE5JRF9jYW1lbGxpYV8yNTZfY2ZiMSwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTEyOC1DRkI4IiwiY2FtZWxsaWEtMTI4LWNmYjgiLE5JRF9jYW1lbGxpYV8xMjhfY2ZiOCwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTE5Mi1DRkI4IiwiY2FtZWxsaWEtMTkyLWNmYjgiLE5JRF9jYW1lbGxpYV8xOTJfY2ZiOCwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTI1Ni1DRkI4IiwiY2FtZWxsaWEtMjU2LWNmYjgiLE5JRF9jYW1lbGxpYV8yNTZfY2ZiOCwwLE5VTEwsMH0sCit7IkNBTUVMTElBLTEyOC1PRkIiLCJjYW1lbGxpYS0xMjgtb2ZiIixOSURfY2FtZWxsaWFfMTI4X29mYjEyOCw4LAorCSYobHZhbHVlc1s1MDg3XSksMH0sCit7IkNBTUVMTElBLTE5Mi1PRkIiLCJjYW1lbGxpYS0xOTItb2ZiIixOSURfY2FtZWxsaWFfMTkyX29mYjEyOCw4LAorCSYobHZhbHVlc1s1MDk1XSksMH0sCit7IkNBTUVMTElBLTI1Ni1PRkIiLCJjYW1lbGxpYS0yNTYtb2ZiIixOSURfY2FtZWxsaWFfMjU2X29mYjEyOCw4LAorCSYobHZhbHVlc1s1MTAzXSksMH0sCit7InN1YmplY3REaXJlY3RvcnlBdHRyaWJ1dGVzIiwiWDUwOXYzIFN1YmplY3QgRGlyZWN0b3J5IEF0dHJpYnV0ZXMiLAorCU5JRF9zdWJqZWN0X2RpcmVjdG9yeV9hdHRyaWJ1dGVzLDMsJihsdmFsdWVzWzUxMTFdKSwwfSwKK3siaXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50IiwiWDUwOXYzIElzc3VpbmcgRGlzdHJ1YnV0aW9uIFBvaW50IiwKKwlOSURfaXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQsMywmKGx2YWx1ZXNbNTExNF0pLDB9LAoreyJjZXJ0aWZpY2F0ZUlzc3VlciIsIlg1MDl2MyBDZXJ0aWZpY2F0ZSBJc3N1ZXIiLAorCU5JRF9jZXJ0aWZpY2F0ZV9pc3N1ZXIsMywmKGx2YWx1ZXNbNTExN10pLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAoreyJLSVNBIiwia2lzYSIsTklEX2tpc2EsNiwmKGx2YWx1ZXNbNTEyMF0pLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAore05VTEwsTlVMTCxOSURfdW5kZWYsMCxOVUxMLDB9LAoreyJTRUVELUVDQiIsInNlZWQtZWNiIixOSURfc2VlZF9lY2IsOCwmKGx2YWx1ZXNbNTEyNl0pLDB9LAoreyJTRUVELUNCQyIsInNlZWQtY2JjIixOSURfc2VlZF9jYmMsOCwmKGx2YWx1ZXNbNTEzNF0pLDB9LAoreyJTRUVELU9GQiIsInNlZWQtb2ZiIixOSURfc2VlZF9vZmIxMjgsOCwmKGx2YWx1ZXNbNTE0Ml0pLDB9LAoreyJTRUVELUNGQiIsInNlZWQtY2ZiIixOSURfc2VlZF9jZmIxMjgsOCwmKGx2YWx1ZXNbNTE1MF0pLDB9LAoreyJITUFDLU1ENSIsImhtYWMtbWQ1IixOSURfaG1hY19tZDUsOCwmKGx2YWx1ZXNbNTE1OF0pLDB9LAoreyJITUFDLVNIQTEiLCJobWFjLXNoYTEiLE5JRF9obWFjX3NoYTEsOCwmKGx2YWx1ZXNbNTE2Nl0pLDB9LAoreyJpZC1QYXNzd29yZEJhc2VkTUFDIiwicGFzc3dvcmQgYmFzZWQgTUFDIixOSURfaWRfUGFzc3dvcmRCYXNlZE1BQyw5LAorCSYobHZhbHVlc1s1MTc0XSksMH0sCit7ImlkLURIQmFzZWRNYWMiLCJEaWZmaWUtSGVsbG1hbiBiYXNlZCBNQUMiLE5JRF9pZF9ESEJhc2VkTWFjLDksCisJJihsdmFsdWVzWzUxODNdKSwwfSwKK3siaWQtaXQtc3VwcExhbmdUYWdzIiwiaWQtaXQtc3VwcExhbmdUYWdzIixOSURfaWRfaXRfc3VwcExhbmdUYWdzLDgsCisJJihsdmFsdWVzWzUxOTJdKSwwfSwKK3siY2FSZXBvc2l0b3J5IiwiQ0EgUmVwb3NpdG9yeSIsTklEX2NhUmVwb3NpdG9yeSw4LCYobHZhbHVlc1s1MjAwXSksMH0sCit7ImlkLXNtaW1lLWN0LWNvbXByZXNzZWREYXRhIiwiaWQtc21pbWUtY3QtY29tcHJlc3NlZERhdGEiLAorCU5JRF9pZF9zbWltZV9jdF9jb21wcmVzc2VkRGF0YSwxMSwmKGx2YWx1ZXNbNTIwOF0pLDB9LAoreyJpZC1jdC1hc2NpaVRleHRXaXRoQ1JMRiIsImlkLWN0LWFzY2lpVGV4dFdpdGhDUkxGIiwKKwlOSURfaWRfY3RfYXNjaWlUZXh0V2l0aENSTEYsMTEsJihsdmFsdWVzWzUyMTldKSwwfSwKK3siaWQtYWVzMTI4LXdyYXAiLCJpZC1hZXMxMjgtd3JhcCIsTklEX2lkX2FlczEyOF93cmFwLDksCisJJihsdmFsdWVzWzUyMzBdKSwwfSwKK3siaWQtYWVzMTkyLXdyYXAiLCJpZC1hZXMxOTItd3JhcCIsTklEX2lkX2FlczE5Ml93cmFwLDksCisJJihsdmFsdWVzWzUyMzldKSwwfSwKK3siaWQtYWVzMjU2LXdyYXAiLCJpZC1hZXMyNTYtd3JhcCIsTklEX2lkX2FlczI1Nl93cmFwLDksCisJJihsdmFsdWVzWzUyNDhdKSwwfSwKK3siZWNkc2Etd2l0aC1SZWNvbW1lbmRlZCIsImVjZHNhLXdpdGgtUmVjb21tZW5kZWQiLAorCU5JRF9lY2RzYV93aXRoX1JlY29tbWVuZGVkLDcsJihsdmFsdWVzWzUyNTddKSwwfSwKK3siZWNkc2Etd2l0aC1TcGVjaWZpZWQiLCJlY2RzYS13aXRoLVNwZWNpZmllZCIsCisJTklEX2VjZHNhX3dpdGhfU3BlY2lmaWVkLDcsJihsdmFsdWVzWzUyNjRdKSwwfSwKK3siZWNkc2Etd2l0aC1TSEEyMjQiLCJlY2RzYS13aXRoLVNIQTIyNCIsTklEX2VjZHNhX3dpdGhfU0hBMjI0LDgsCisJJihsdmFsdWVzWzUyNzFdKSwwfSwKK3siZWNkc2Etd2l0aC1TSEEyNTYiLCJlY2RzYS13aXRoLVNIQTI1NiIsTklEX2VjZHNhX3dpdGhfU0hBMjU2LDgsCisJJihsdmFsdWVzWzUyNzldKSwwfSwKK3siZWNkc2Etd2l0aC1TSEEzODQiLCJlY2RzYS13aXRoLVNIQTM4NCIsTklEX2VjZHNhX3dpdGhfU0hBMzg0LDgsCisJJihsdmFsdWVzWzUyODddKSwwfSwKK3siZWNkc2Etd2l0aC1TSEE1MTIiLCJlY2RzYS13aXRoLVNIQTUxMiIsTklEX2VjZHNhX3dpdGhfU0hBNTEyLDgsCisJJihsdmFsdWVzWzUyOTVdKSwwfSwKK3siaG1hY1dpdGhNRDUiLCJobWFjV2l0aE1ENSIsTklEX2htYWNXaXRoTUQ1LDgsJihsdmFsdWVzWzUzMDNdKSwwfSwKK3siaG1hY1dpdGhTSEEyMjQiLCJobWFjV2l0aFNIQTIyNCIsTklEX2htYWNXaXRoU0hBMjI0LDgsCisJJihsdmFsdWVzWzUzMTFdKSwwfSwKK3siaG1hY1dpdGhTSEEyNTYiLCJobWFjV2l0aFNIQTI1NiIsTklEX2htYWNXaXRoU0hBMjU2LDgsCisJJihsdmFsdWVzWzUzMTldKSwwfSwKK3siaG1hY1dpdGhTSEEzODQiLCJobWFjV2l0aFNIQTM4NCIsTklEX2htYWNXaXRoU0hBMzg0LDgsCisJJihsdmFsdWVzWzUzMjddKSwwfSwKK3siaG1hY1dpdGhTSEE1MTIiLCJobWFjV2l0aFNIQTUxMiIsTklEX2htYWNXaXRoU0hBNTEyLDgsCisJJihsdmFsdWVzWzUzMzVdKSwwfSwKK3siZHNhX3dpdGhfU0hBMjI0IiwiZHNhX3dpdGhfU0hBMjI0IixOSURfZHNhX3dpdGhfU0hBMjI0LDksCisJJihsdmFsdWVzWzUzNDNdKSwwfSwKK3siZHNhX3dpdGhfU0hBMjU2IiwiZHNhX3dpdGhfU0hBMjU2IixOSURfZHNhX3dpdGhfU0hBMjU2LDksCisJJihsdmFsdWVzWzUzNTJdKSwwfSwKK3sid2hpcmxwb29sIiwid2hpcmxwb29sIixOSURfd2hpcmxwb29sLDYsJihsdmFsdWVzWzUzNjFdKSwwfSwKK3siY3J5cHRvcHJvIiwiY3J5cHRvcHJvIixOSURfY3J5cHRvcHJvLDUsJihsdmFsdWVzWzUzNjddKSwwfSwKK3siY3J5cHRvY29tIiwiY3J5cHRvY29tIixOSURfY3J5cHRvY29tLDUsJihsdmFsdWVzWzUzNzJdKSwwfSwKK3siaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTIwMDEiLAorCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMSIsCisJTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxLDYsJihsdmFsdWVzWzUzNzddKSwwfSwKK3siaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTk0IiwKKwkiR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTk0IiwKKwlOSURfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0LDYsJihsdmFsdWVzWzUzODNdKSwwfSwKK3sibWRfZ29zdDk0IiwiR09TVCBSIDM0LjExLTk0IixOSURfaWRfR29zdFIzNDExXzk0LDYsJihsdmFsdWVzWzUzODldKSwwfSwKK3siaWQtSE1BQ0dvc3RSMzQxMS05NCIsIkhNQUMgR09TVCAzNC4xMS05NCIsTklEX2lkX0hNQUNHb3N0UjM0MTFfOTQsNiwKKwkmKGx2YWx1ZXNbNTM5NV0pLDB9LAoreyJnb3N0MjAwMSIsIkdPU1QgUiAzNC4xMC0yMDAxIixOSURfaWRfR29zdFIzNDEwXzIwMDEsNiwKKwkmKGx2YWx1ZXNbNTQwMV0pLDB9LAoreyJnb3N0OTQiLCJHT1NUIFIgMzQuMTAtOTQiLE5JRF9pZF9Hb3N0UjM0MTBfOTQsNiwmKGx2YWx1ZXNbNTQwN10pLDB9LAoreyJnb3N0ODkiLCJHT1NUIDI4MTQ3LTg5IixOSURfaWRfR29zdDI4MTQ3Xzg5LDYsJihsdmFsdWVzWzU0MTNdKSwwfSwKK3siZ29zdDg5LWNudCIsImdvc3Q4OS1jbnQiLE5JRF9nb3N0ODlfY250LDAsTlVMTCwwfSwKK3siZ29zdC1tYWMiLCJHT1NUIDI4MTQ3LTg5IE1BQyIsTklEX2lkX0dvc3QyODE0N184OV9NQUMsNiwKKwkmKGx2YWx1ZXNbNTQxOV0pLDB9LAoreyJwcmYtZ29zdHIzNDExLTk0IiwiR09TVCBSIDM0LjExLTk0IFBSRiIsTklEX2lkX0dvc3RSMzQxMV85NF9wcmYsNiwKKwkmKGx2YWx1ZXNbNTQyNV0pLDB9LAoreyJpZC1Hb3N0UjM0MTAtMjAwMURIIiwiR09TVCBSIDM0LjEwLTIwMDEgREgiLE5JRF9pZF9Hb3N0UjM0MTBfMjAwMURILAorCTYsJihsdmFsdWVzWzU0MzFdKSwwfSwKK3siaWQtR29zdFIzNDEwLTk0REgiLCJHT1NUIFIgMzQuMTAtOTQgREgiLE5JRF9pZF9Hb3N0UjM0MTBfOTRESCw2LAorCSYobHZhbHVlc1s1NDM3XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tS2V5TWVzaGluZyIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tS2V5TWVzaGluZyIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZyw3LCYobHZhbHVlc1s1NDQzXSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1Ob25lLUtleU1lc2hpbmciLCJpZC1Hb3N0MjgxNDctODktTm9uZS1LZXlNZXNoaW5nIiwKKwlOSURfaWRfR29zdDI4MTQ3Xzg5X05vbmVfS2V5TWVzaGluZyw3LCYobHZhbHVlc1s1NDUwXSksMH0sCit7ImlkLUdvc3RSMzQxMS05NC1UZXN0UGFyYW1TZXQiLCJpZC1Hb3N0UjM0MTEtOTQtVGVzdFBhcmFtU2V0IiwKKwlOSURfaWRfR29zdFIzNDExXzk0X1Rlc3RQYXJhbVNldCw3LCYobHZhbHVlc1s1NDU3XSksMH0sCit7ImlkLUdvc3RSMzQxMS05NC1DcnlwdG9Qcm9QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMS05NC1DcnlwdG9Qcm9QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldCw3LCYobHZhbHVlc1s1NDY0XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1UZXN0UGFyYW1TZXQiLCJpZC1Hb3N0MjgxNDctODktVGVzdFBhcmFtU2V0IiwKKwlOSURfaWRfR29zdDI4MTQ3Xzg5X1Rlc3RQYXJhbVNldCw3LCYobHZhbHVlc1s1NDcxXSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQS1QYXJhbVNldCIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQS1QYXJhbVNldCIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NDc4XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NDg1XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQ19QYXJhbVNldCw3LCYobHZhbHVlc1s1NDkyXSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tRC1QYXJhbVNldCIsCisJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tRC1QYXJhbVNldCIsCisJTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fRF9QYXJhbVNldCw3LCYobHZhbHVlc1s1NDk5XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0xLVBhcmFtU2V0IiwKKwkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTEtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTA2XSksCisJMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0wLVBhcmFtU2V0IiwKKwkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTAtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMF9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTEzXSksCisJMH0sCit7ImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tUklDLTEtUGFyYW1TZXQiLAorCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLVJJQy0xLVBhcmFtU2V0IiwKKwlOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19SSUNfMV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTIwXSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1UZXN0UGFyYW1TZXQiLCJpZC1Hb3N0UjM0MTAtOTQtVGVzdFBhcmFtU2V0IiwKKwlOSURfaWRfR29zdFIzNDEwXzk0X1Rlc3RQYXJhbVNldCw3LCYobHZhbHVlc1s1NTI3XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQS1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQS1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTM0XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQi1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQi1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTQxXSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQy1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQy1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldCw3LCYobHZhbHVlc1s1NTQ4XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tRC1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tRC1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fRF9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTU1XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQS1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQS1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTYyXSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTY5XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQy1QYXJhbVNldCIsCisJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQy1QYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQ19QYXJhbVNldCw3LCYobHZhbHVlc1s1NTc2XSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLVRlc3RQYXJhbVNldCIsImlkLUdvc3RSMzQxMC0yMDAxLVRlc3RQYXJhbVNldCIsCisJTklEX2lkX0dvc3RSMzQxMF8yMDAxX1Rlc3RQYXJhbVNldCw3LCYobHZhbHVlc1s1NTgzXSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1BLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUEtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTkwXSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1CLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUItUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NTk3XSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1DLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUMtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQ19QYXJhbVNldCw3LCYobHZhbHVlc1s1NjA0XSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hBLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldCw3LCYobHZhbHVlc1s1NjExXSksMH0sCisJCit7ImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hCLVBhcmFtU2V0IiwKKwkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEItUGFyYW1TZXQiLAorCU5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldCw3LCYobHZhbHVlc1s1NjE4XSksMH0sCisJCit7ImlkLUdvc3RSMzQxMC05NC1hIiwiaWQtR29zdFIzNDEwLTk0LWEiLE5JRF9pZF9Hb3N0UjM0MTBfOTRfYSw3LAorCSYobHZhbHVlc1s1NjI1XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1hQmlzIiwiaWQtR29zdFIzNDEwLTk0LWFCaXMiLAorCU5JRF9pZF9Hb3N0UjM0MTBfOTRfYUJpcyw3LCYobHZhbHVlc1s1NjMyXSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1iIiwiaWQtR29zdFIzNDEwLTk0LWIiLE5JRF9pZF9Hb3N0UjM0MTBfOTRfYiw3LAorCSYobHZhbHVlc1s1NjM5XSksMH0sCit7ImlkLUdvc3RSMzQxMC05NC1iQmlzIiwiaWQtR29zdFIzNDEwLTk0LWJCaXMiLAorCU5JRF9pZF9Hb3N0UjM0MTBfOTRfYkJpcyw3LCYobHZhbHVlc1s1NjQ2XSksMH0sCit7ImlkLUdvc3QyODE0Ny04OS1jYyIsIkdPU1QgMjgxNDctODkgQ3J5cHRvY29tIFBhcmFtU2V0IiwKKwlOSURfaWRfR29zdDI4MTQ3Xzg5X2NjLDgsJihsdmFsdWVzWzU2NTNdKSwwfSwKK3siZ29zdDk0Y2MiLCJHT1NUIDM0LjEwLTk0IENyeXB0b2NvbSIsTklEX2lkX0dvc3RSMzQxMF85NF9jYyw4LAorCSYobHZhbHVlc1s1NjYxXSksMH0sCit7Imdvc3QyMDAxY2MiLCJHT1NUIDM0LjEwLTIwMDEgQ3J5cHRvY29tIixOSURfaWRfR29zdFIzNDEwXzIwMDFfY2MsOCwKKwkmKGx2YWx1ZXNbNTY2OV0pLDB9LAoreyJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtOTQtY2MiLAorCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtOTQgQ3J5cHRvY29tIiwKKwlOSURfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0X2NjLDgsJihsdmFsdWVzWzU2NzddKSwwfSwKK3siaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTIwMDEtY2MiLAorCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMSBDcnlwdG9jb20iLAorCU5JRF9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYyw4LCYobHZhbHVlc1s1Njg1XSksMH0sCit7ImlkLUdvc3RSMzQxMC0yMDAxLVBhcmFtU2V0LWNjIiwKKwkiR09TVCBSIDM0MTAtMjAwMSBQYXJhbWV0ZXIgU2V0IENyeXB0b2NvbSIsCisJTklEX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjLDgsJihsdmFsdWVzWzU2OTNdKSwwfSwKK3siSE1BQyIsImhtYWMiLE5JRF9obWFjLDAsTlVMTCwwfSwKK3siTG9jYWxLZXlTZXQiLCJNaWNyb3NvZnQgTG9jYWwgS2V5IHNldCIsTklEX0xvY2FsS2V5U2V0LDksCisJJihsdmFsdWVzWzU3MDFdKSwwfSwKK3siZnJlc2hlc3RDUkwiLCJYNTA5djMgRnJlc2hlc3QgQ1JMIixOSURfZnJlc2hlc3RfY3JsLDMsCisJJihsdmFsdWVzWzU3MTBdKSwwfSwKK3siaWQtb24tcGVybWFuZW50SWRlbnRpZmllciIsIlBlcm1hbmVudCBJZGVudGlmaWVyIiwKKwlOSURfaWRfb25fcGVybWFuZW50SWRlbnRpZmllciw4LCYobHZhbHVlc1s1NzEzXSksMH0sCit7InNlYXJjaEd1aWRlIiwic2VhcmNoR3VpZGUiLE5JRF9zZWFyY2hHdWlkZSwzLCYobHZhbHVlc1s1NzIxXSksMH0sCit7ImJ1c2luZXNzQ2F0ZWdvcnkiLCJidXNpbmVzc0NhdGVnb3J5IixOSURfYnVzaW5lc3NDYXRlZ29yeSwzLAorCSYobHZhbHVlc1s1NzI0XSksMH0sCit7InBvc3RhbEFkZHJlc3MiLCJwb3N0YWxBZGRyZXNzIixOSURfcG9zdGFsQWRkcmVzcywzLCYobHZhbHVlc1s1NzI3XSksMH0sCit7InBvc3RPZmZpY2VCb3giLCJwb3N0T2ZmaWNlQm94IixOSURfcG9zdE9mZmljZUJveCwzLCYobHZhbHVlc1s1NzMwXSksMH0sCit7InBoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lIiwicGh5c2ljYWxEZWxpdmVyeU9mZmljZU5hbWUiLAorCU5JRF9waHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZSwzLCYobHZhbHVlc1s1NzMzXSksMH0sCit7InRlbGVwaG9uZU51bWJlciIsInRlbGVwaG9uZU51bWJlciIsTklEX3RlbGVwaG9uZU51bWJlciwzLAorCSYobHZhbHVlc1s1NzM2XSksMH0sCit7InRlbGV4TnVtYmVyIiwidGVsZXhOdW1iZXIiLE5JRF90ZWxleE51bWJlciwzLCYobHZhbHVlc1s1NzM5XSksMH0sCit7InRlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIiLCJ0ZWxldGV4VGVybWluYWxJZGVudGlmaWVyIiwKKwlOSURfdGVsZXRleFRlcm1pbmFsSWRlbnRpZmllciwzLCYobHZhbHVlc1s1NzQyXSksMH0sCit7ImZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciIsImZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciIsCisJTklEX2ZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciwzLCYobHZhbHVlc1s1NzQ1XSksMH0sCit7IngxMjFBZGRyZXNzIiwieDEyMUFkZHJlc3MiLE5JRF94MTIxQWRkcmVzcywzLCYobHZhbHVlc1s1NzQ4XSksMH0sCit7ImludGVybmF0aW9uYWxpU0ROTnVtYmVyIiwiaW50ZXJuYXRpb25hbGlTRE5OdW1iZXIiLAorCU5JRF9pbnRlcm5hdGlvbmFsaVNETk51bWJlciwzLCYobHZhbHVlc1s1NzUxXSksMH0sCit7InJlZ2lzdGVyZWRBZGRyZXNzIiwicmVnaXN0ZXJlZEFkZHJlc3MiLE5JRF9yZWdpc3RlcmVkQWRkcmVzcywzLAorCSYobHZhbHVlc1s1NzU0XSksMH0sCit7ImRlc3RpbmF0aW9uSW5kaWNhdG9yIiwiZGVzdGluYXRpb25JbmRpY2F0b3IiLAorCU5JRF9kZXN0aW5hdGlvbkluZGljYXRvciwzLCYobHZhbHVlc1s1NzU3XSksMH0sCit7InByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kIiwicHJlZmVycmVkRGVsaXZlcnlNZXRob2QiLAorCU5JRF9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZCwzLCYobHZhbHVlc1s1NzYwXSksMH0sCit7InByZXNlbnRhdGlvbkFkZHJlc3MiLCJwcmVzZW50YXRpb25BZGRyZXNzIixOSURfcHJlc2VudGF0aW9uQWRkcmVzcywKKwkzLCYobHZhbHVlc1s1NzYzXSksMH0sCit7InN1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCIsInN1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCIsCisJTklEX3N1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCwzLCYobHZhbHVlc1s1NzY2XSksMH0sCit7Im1lbWJlciIsIm1lbWJlciIsTklEX21lbWJlciwzLCYobHZhbHVlc1s1NzY5XSksMH0sCit7Im93bmVyIiwib3duZXIiLE5JRF9vd25lciwzLCYobHZhbHVlc1s1NzcyXSksMH0sCit7InJvbGVPY2N1cGFudCIsInJvbGVPY2N1cGFudCIsTklEX3JvbGVPY2N1cGFudCwzLCYobHZhbHVlc1s1Nzc1XSksMH0sCit7InNlZUFsc28iLCJzZWVBbHNvIixOSURfc2VlQWxzbywzLCYobHZhbHVlc1s1Nzc4XSksMH0sCit7InVzZXJQYXNzd29yZCIsInVzZXJQYXNzd29yZCIsTklEX3VzZXJQYXNzd29yZCwzLCYobHZhbHVlc1s1NzgxXSksMH0sCit7InVzZXJDZXJ0aWZpY2F0ZSIsInVzZXJDZXJ0aWZpY2F0ZSIsTklEX3VzZXJDZXJ0aWZpY2F0ZSwzLAorCSYobHZhbHVlc1s1Nzg0XSksMH0sCit7ImNBQ2VydGlmaWNhdGUiLCJjQUNlcnRpZmljYXRlIixOSURfY0FDZXJ0aWZpY2F0ZSwzLCYobHZhbHVlc1s1Nzg3XSksMH0sCit7ImF1dGhvcml0eVJldm9jYXRpb25MaXN0IiwiYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QiLAorCU5JRF9hdXRob3JpdHlSZXZvY2F0aW9uTGlzdCwzLCYobHZhbHVlc1s1NzkwXSksMH0sCit7ImNlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QiLCJjZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0IiwKKwlOSURfY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCwzLCYobHZhbHVlc1s1NzkzXSksMH0sCit7ImNyb3NzQ2VydGlmaWNhdGVQYWlyIiwiY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIiLAorCU5JRF9jcm9zc0NlcnRpZmljYXRlUGFpciwzLCYobHZhbHVlc1s1Nzk2XSksMH0sCit7ImVuaGFuY2VkU2VhcmNoR3VpZGUiLCJlbmhhbmNlZFNlYXJjaEd1aWRlIixOSURfZW5oYW5jZWRTZWFyY2hHdWlkZSwKKwkzLCYobHZhbHVlc1s1Nzk5XSksMH0sCit7InByb3RvY29sSW5mb3JtYXRpb24iLCJwcm90b2NvbEluZm9ybWF0aW9uIixOSURfcHJvdG9jb2xJbmZvcm1hdGlvbiwKKwkzLCYobHZhbHVlc1s1ODAyXSksMH0sCit7ImRpc3Rpbmd1aXNoZWROYW1lIiwiZGlzdGluZ3Vpc2hlZE5hbWUiLE5JRF9kaXN0aW5ndWlzaGVkTmFtZSwzLAorCSYobHZhbHVlc1s1ODA1XSksMH0sCit7InVuaXF1ZU1lbWJlciIsInVuaXF1ZU1lbWJlciIsTklEX3VuaXF1ZU1lbWJlciwzLCYobHZhbHVlc1s1ODA4XSksMH0sCit7ImhvdXNlSWRlbnRpZmllciIsImhvdXNlSWRlbnRpZmllciIsTklEX2hvdXNlSWRlbnRpZmllciwzLAorCSYobHZhbHVlc1s1ODExXSksMH0sCit7InN1cHBvcnRlZEFsZ29yaXRobXMiLCJzdXBwb3J0ZWRBbGdvcml0aG1zIixOSURfc3VwcG9ydGVkQWxnb3JpdGhtcywKKwkzLCYobHZhbHVlc1s1ODE0XSksMH0sCit7ImRlbHRhUmV2b2NhdGlvbkxpc3QiLCJkZWx0YVJldm9jYXRpb25MaXN0IixOSURfZGVsdGFSZXZvY2F0aW9uTGlzdCwKKwkzLCYobHZhbHVlc1s1ODE3XSksMH0sCit7ImRtZE5hbWUiLCJkbWROYW1lIixOSURfZG1kTmFtZSwzLCYobHZhbHVlc1s1ODIwXSksMH0sCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNuX29ianNbTlVNX1NOXT17CiszNjQsCS8qICJBRF9EVkNTIiAqLworNDE5LAkvKiAiQUVTLTEyOC1DQkMiICovCis0MjEsCS8qICJBRVMtMTI4LUNGQiIgKi8KKzY1MCwJLyogIkFFUy0xMjgtQ0ZCMSIgKi8KKzY1MywJLyogIkFFUy0xMjgtQ0ZCOCIgKi8KKzQxOCwJLyogIkFFUy0xMjgtRUNCIiAqLworNDIwLAkvKiAiQUVTLTEyOC1PRkIiICovCis0MjMsCS8qICJBRVMtMTkyLUNCQyIgKi8KKzQyNSwJLyogIkFFUy0xOTItQ0ZCIiAqLworNjUxLAkvKiAiQUVTLTE5Mi1DRkIxIiAqLworNjU0LAkvKiAiQUVTLTE5Mi1DRkI4IiAqLworNDIyLAkvKiAiQUVTLTE5Mi1FQ0IiICovCis0MjQsCS8qICJBRVMtMTkyLU9GQiIgKi8KKzQyNywJLyogIkFFUy0yNTYtQ0JDIiAqLworNDI5LAkvKiAiQUVTLTI1Ni1DRkIiICovCis2NTIsCS8qICJBRVMtMjU2LUNGQjEiICovCis2NTUsCS8qICJBRVMtMjU2LUNGQjgiICovCis0MjYsCS8qICJBRVMtMjU2LUVDQiIgKi8KKzQyOCwJLyogIkFFUy0yNTYtT0ZCIiAqLworOTEsCS8qICJCRi1DQkMiICovCis5MywJLyogIkJGLUNGQiIgKi8KKzkyLAkvKiAiQkYtRUNCIiAqLworOTQsCS8qICJCRi1PRkIiICovCisxNCwJLyogIkMiICovCis3NTEsCS8qICJDQU1FTExJQS0xMjgtQ0JDIiAqLworNzU3LAkvKiAiQ0FNRUxMSUEtMTI4LUNGQiIgKi8KKzc2MCwJLyogIkNBTUVMTElBLTEyOC1DRkIxIiAqLworNzYzLAkvKiAiQ0FNRUxMSUEtMTI4LUNGQjgiICovCis3NTQsCS8qICJDQU1FTExJQS0xMjgtRUNCIiAqLworNzY2LAkvKiAiQ0FNRUxMSUEtMTI4LU9GQiIgKi8KKzc1MiwJLyogIkNBTUVMTElBLTE5Mi1DQkMiICovCis3NTgsCS8qICJDQU1FTExJQS0xOTItQ0ZCIiAqLworNzYxLAkvKiAiQ0FNRUxMSUEtMTkyLUNGQjEiICovCis3NjQsCS8qICJDQU1FTExJQS0xOTItQ0ZCOCIgKi8KKzc1NSwJLyogIkNBTUVMTElBLTE5Mi1FQ0IiICovCis3NjcsCS8qICJDQU1FTExJQS0xOTItT0ZCIiAqLworNzUzLAkvKiAiQ0FNRUxMSUEtMjU2LUNCQyIgKi8KKzc1OSwJLyogIkNBTUVMTElBLTI1Ni1DRkIiICovCis3NjIsCS8qICJDQU1FTExJQS0yNTYtQ0ZCMSIgKi8KKzc2NSwJLyogIkNBTUVMTElBLTI1Ni1DRkI4IiAqLworNzU2LAkvKiAiQ0FNRUxMSUEtMjU2LUVDQiIgKi8KKzc2OCwJLyogIkNBTUVMTElBLTI1Ni1PRkIiICovCisxMDgsCS8qICJDQVNUNS1DQkMiICovCisxMTAsCS8qICJDQVNUNS1DRkIiICovCisxMDksCS8qICJDQVNUNS1FQ0IiICovCisxMTEsCS8qICJDQVNUNS1PRkIiICovCisxMywJLyogIkNOIiAqLworMTQxLAkvKiAiQ1JMUmVhc29uIiAqLworNDE3LAkvKiAiQ1NQTmFtZSIgKi8KKzM2NywJLyogIkNybElEIiAqLworMzkxLAkvKiAiREMiICovCiszMSwJLyogIkRFUy1DQkMiICovCis2NDMsCS8qICJERVMtQ0RNRiIgKi8KKzMwLAkvKiAiREVTLUNGQiIgKi8KKzY1NiwJLyogIkRFUy1DRkIxIiAqLworNjU3LAkvKiAiREVTLUNGQjgiICovCisyOSwJLyogIkRFUy1FQ0IiICovCiszMiwJLyogIkRFUy1FREUiICovCis0MywJLyogIkRFUy1FREUtQ0JDIiAqLworNjAsCS8qICJERVMtRURFLUNGQiIgKi8KKzYyLAkvKiAiREVTLUVERS1PRkIiICovCiszMywJLyogIkRFUy1FREUzIiAqLworNDQsCS8qICJERVMtRURFMy1DQkMiICovCis2MSwJLyogIkRFUy1FREUzLUNGQiIgKi8KKzY1OCwJLyogIkRFUy1FREUzLUNGQjEiICovCis2NTksCS8qICJERVMtRURFMy1DRkI4IiAqLworNjMsCS8qICJERVMtRURFMy1PRkIiICovCis0NSwJLyogIkRFUy1PRkIiICovCis4MCwJLyogIkRFU1gtQ0JDIiAqLworMzgwLAkvKiAiRE9EIiAqLworMTE2LAkvKiAiRFNBIiAqLworNjYsCS8qICJEU0EtU0hBIiAqLworMTEzLAkvKiAiRFNBLVNIQTEiICovCis3MCwJLyogIkRTQS1TSEExLW9sZCIgKi8KKzY3LAkvKiAiRFNBLW9sZCIgKi8KKzI5NywJLyogIkRWQ1MiICovCis5OSwJLyogIkdOIiAqLworODU1LAkvKiAiSE1BQyIgKi8KKzc4MCwJLyogIkhNQUMtTUQ1IiAqLworNzgxLAkvKiAiSE1BQy1TSEExIiAqLworMzgxLAkvKiAiSUFOQSIgKi8KKzM0LAkvKiAiSURFQS1DQkMiICovCiszNSwJLyogIklERUEtQ0ZCIiAqLworMzYsCS8qICJJREVBLUVDQiIgKi8KKzQ2LAkvKiAiSURFQS1PRkIiICovCisxODEsCS8qICJJU08iICovCisxODMsCS8qICJJU08tVVMiICovCis2NDUsCS8qICJJVFUtVCIgKi8KKzY0NiwJLyogIkpPSU5ULUlTTy1JVFUtVCIgKi8KKzc3MywJLyogIktJU0EiICovCisxNSwJLyogIkwiICovCis4NTYsCS8qICJMb2NhbEtleVNldCIgKi8KKyAzLAkvKiAiTUQyIiAqLworMjU3LAkvKiAiTUQ0IiAqLworIDQsCS8qICJNRDUiICovCisxMTQsCS8qICJNRDUtU0hBMSIgKi8KKzk1LAkvKiAiTURDMiIgKi8KKzM4OCwJLyogIk1haWwiICovCiszOTMsCS8qICJOVUxMIiAqLworNDA0LAkvKiAiTlVMTCIgKi8KKzU3LAkvKiAiTmV0c2NhcGUiICovCiszNjYsCS8qICJOb25jZSIgKi8KKzE3LAkvKiAiTyIgKi8KKzE3OCwJLyogIk9DU1AiICovCisxODAsCS8qICJPQ1NQU2lnbmluZyIgKi8KKzM3OSwJLyogIk9SRyIgKi8KKzE4LAkvKiAiT1UiICovCis3NDksCS8qICJPYWtsZXktRUMyTi0zIiAqLworNzUwLAkvKiAiT2FrbGV5LUVDMk4tNCIgKi8KKyA5LAkvKiAiUEJFLU1EMi1ERVMiICovCisxNjgsCS8qICJQQkUtTUQyLVJDMi02NCIgKi8KKzEwLAkvKiAiUEJFLU1ENS1ERVMiICovCisxNjksCS8qICJQQkUtTUQ1LVJDMi02NCIgKi8KKzE0NywJLyogIlBCRS1TSEExLTJERVMiICovCisxNDYsCS8qICJQQkUtU0hBMS0zREVTIiAqLworMTcwLAkvKiAiUEJFLVNIQTEtREVTIiAqLworMTQ4LAkvKiAiUEJFLVNIQTEtUkMyLTEyOCIgKi8KKzE0OSwJLyogIlBCRS1TSEExLVJDMi00MCIgKi8KKzY4LAkvKiAiUEJFLVNIQTEtUkMyLTY0IiAqLworMTQ0LAkvKiAiUEJFLVNIQTEtUkM0LTEyOCIgKi8KKzE0NSwJLyogIlBCRS1TSEExLVJDNC00MCIgKi8KKzE2MSwJLyogIlBCRVMyIiAqLworNjksCS8qICJQQktERjIiICovCisxNjIsCS8qICJQQk1BQzEiICovCisxMjcsCS8qICJQS0lYIiAqLworOTgsCS8qICJSQzItNDAtQ0JDIiAqLworMTY2LAkvKiAiUkMyLTY0LUNCQyIgKi8KKzM3LAkvKiAiUkMyLUNCQyIgKi8KKzM5LAkvKiAiUkMyLUNGQiIgKi8KKzM4LAkvKiAiUkMyLUVDQiIgKi8KKzQwLAkvKiAiUkMyLU9GQiIgKi8KKyA1LAkvKiAiUkM0IiAqLworOTcsCS8qICJSQzQtNDAiICovCisxMjAsCS8qICJSQzUtQ0JDIiAqLworMTIyLAkvKiAiUkM1LUNGQiIgKi8KKzEyMSwJLyogIlJDNS1FQ0IiICovCisxMjMsCS8qICJSQzUtT0ZCIiAqLworMTE3LAkvKiAiUklQRU1EMTYwIiAqLworMTI0LAkvKiAiUkxFIiAqLworMTksCS8qICJSU0EiICovCisgNywJLyogIlJTQS1NRDIiICovCiszOTYsCS8qICJSU0EtTUQ0IiAqLworIDgsCS8qICJSU0EtTUQ1IiAqLworOTYsCS8qICJSU0EtTURDMiIgKi8KKzEwNCwJLyogIlJTQS1OUC1NRDUiICovCisxMTksCS8qICJSU0EtUklQRU1EMTYwIiAqLworNDIsCS8qICJSU0EtU0hBIiAqLworNjUsCS8qICJSU0EtU0hBMSIgKi8KKzExNSwJLyogIlJTQS1TSEExLTIiICovCis2NzEsCS8qICJSU0EtU0hBMjI0IiAqLworNjY4LAkvKiAiUlNBLVNIQTI1NiIgKi8KKzY2OSwJLyogIlJTQS1TSEEzODQiICovCis2NzAsCS8qICJSU0EtU0hBNTEyIiAqLworNzc3LAkvKiAiU0VFRC1DQkMiICovCis3NzksCS8qICJTRUVELUNGQiIgKi8KKzc3NiwJLyogIlNFRUQtRUNCIiAqLworNzc4LAkvKiAiU0VFRC1PRkIiICovCis0MSwJLyogIlNIQSIgKi8KKzY0LAkvKiAiU0hBMSIgKi8KKzY3NSwJLyogIlNIQTIyNCIgKi8KKzY3MiwJLyogIlNIQTI1NiIgKi8KKzY3MywJLyogIlNIQTM4NCIgKi8KKzY3NCwJLyogIlNIQTUxMiIgKi8KKzE4OCwJLyogIlNNSU1FIiAqLworMTY3LAkvKiAiU01JTUUtQ0FQUyIgKi8KKzEwMCwJLyogIlNOIiAqLworMTYsCS8qICJTVCIgKi8KKzE0MywJLyogIlNYTmV0SUQiICovCis0NTgsCS8qICJVSUQiICovCisgMCwJLyogIlVOREVGIiAqLworMTEsCS8qICJYNTAwIiAqLworMzc4LAkvKiAiWDUwMGFsZ29yaXRobXMiICovCisxMiwJLyogIlg1MDkiICovCisxODQsCS8qICJYOS01NyIgKi8KKzE4NSwJLyogIlg5Y20iICovCisxMjUsCS8qICJaTElCIiAqLworNDc4LAkvKiAiYVJlY29yZCIgKi8KKzI4OSwJLyogImFhQ29udHJvbHMiICovCisyODcsCS8qICJhYy1hdWRpdEVudGl0eSIgKi8KKzM5NywJLyogImFjLXByb3h5aW5nIiAqLworMjg4LAkvKiAiYWMtdGFyZ2V0aW5nIiAqLworMzY4LAkvKiAiYWNjZXB0YWJsZVJlc3BvbnNlcyIgKi8KKzQ0NiwJLyogImFjY291bnQiICovCiszNjMsCS8qICJhZF90aW1lc3RhbXBpbmciICovCiszNzYsCS8qICJhbGdvcml0aG0iICovCis0MDUsCS8qICJhbnNpLVg5LTYyIiAqLworNzQ2LAkvKiAiYW55UG9saWN5IiAqLworMzcwLAkvKiAiYXJjaGl2ZUN1dG9mZiIgKi8KKzQ4NCwJLyogImFzc29jaWF0ZWREb21haW4iICovCis0ODUsCS8qICJhc3NvY2lhdGVkTmFtZSIgKi8KKzUwMSwJLyogImF1ZGlvIiAqLworMTc3LAkvKiAiYXV0aG9yaXR5SW5mb0FjY2VzcyIgKi8KKzkwLAkvKiAiYXV0aG9yaXR5S2V5SWRlbnRpZmllciIgKi8KKzg4MiwJLyogImF1dGhvcml0eVJldm9jYXRpb25MaXN0IiAqLworODcsCS8qICJiYXNpY0NvbnN0cmFpbnRzIiAqLworMzY1LAkvKiAiYmFzaWNPQ1NQUmVzcG9uc2UiICovCisyODUsCS8qICJiaW9tZXRyaWNJbmZvIiAqLworNDk0LAkvKiAiYnVpbGRpbmdOYW1lIiAqLworODYwLAkvKiAiYnVzaW5lc3NDYXRlZ29yeSIgKi8KKzY5MSwJLyogImMyb25iMTkxdjQiICovCis2OTIsCS8qICJjMm9uYjE5MXY1IiAqLworNjk3LAkvKiAiYzJvbmIyMzl2NCIgKi8KKzY5OCwJLyogImMyb25iMjM5djUiICovCis2ODQsCS8qICJjMnBuYjE2M3YxIiAqLworNjg1LAkvKiAiYzJwbmIxNjN2MiIgKi8KKzY4NiwJLyogImMycG5iMTYzdjMiICovCis2ODcsCS8qICJjMnBuYjE3NnYxIiAqLworNjkzLAkvKiAiYzJwbmIyMDh3MSIgKi8KKzY5OSwJLyogImMycG5iMjcydzEiICovCis3MDAsCS8qICJjMnBuYjMwNHcxIiAqLworNzAyLAkvKiAiYzJwbmIzNjh3MSIgKi8KKzY4OCwJLyogImMydG5iMTkxdjEiICovCis2ODksCS8qICJjMnRuYjE5MXYyIiAqLworNjkwLAkvKiAiYzJ0bmIxOTF2MyIgKi8KKzY5NCwJLyogImMydG5iMjM5djEiICovCis2OTUsCS8qICJjMnRuYjIzOXYyIiAqLworNjk2LAkvKiAiYzJ0bmIyMzl2MyIgKi8KKzcwMSwJLyogImMydG5iMzU5djEiICovCis3MDMsCS8qICJjMnRuYjQzMXIxIiAqLworODgxLAkvKiAiY0FDZXJ0aWZpY2F0ZSIgKi8KKzQ4MywJLyogImNOQU1FUmVjb3JkIiAqLworMTc5LAkvKiAiY2FJc3N1ZXJzIiAqLworNzg1LAkvKiAiY2FSZXBvc2l0b3J5IiAqLworNDQzLAkvKiAiY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheCIgKi8KKzE1MiwJLyogImNlcnRCYWciICovCis2NzcsCS8qICJjZXJ0aWNvbS1hcmMiICovCis3NzEsCS8qICJjZXJ0aWZpY2F0ZUlzc3VlciIgKi8KKzg5LAkvKiAiY2VydGlmaWNhdGVQb2xpY2llcyIgKi8KKzg4MywJLyogImNlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QiICovCis1NCwJLyogImNoYWxsZW5nZVBhc3N3b3JkIiAqLworNDA3LAkvKiAiY2hhcmFjdGVyaXN0aWMtdHdvLWZpZWxkIiAqLworMzk1LAkvKiAiY2xlYXJhbmNlIiAqLworMTMwLAkvKiAiY2xpZW50QXV0aCIgKi8KKzEzMSwJLyogImNvZGVTaWduaW5nIiAqLworNTAsCS8qICJjb250ZW50VHlwZSIgKi8KKzUzLAkvKiAiY291bnRlcnNpZ25hdHVyZSIgKi8KKzE1MywJLyogImNybEJhZyIgKi8KKzEwMywJLyogImNybERpc3RyaWJ1dGlvblBvaW50cyIgKi8KKzg4LAkvKiAiY3JsTnVtYmVyIiAqLworODg0LAkvKiAiY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIiICovCis4MDYsCS8qICJjcnlwdG9jb20iICovCis4MDUsCS8qICJjcnlwdG9wcm8iICovCis1MDAsCS8qICJkSVRSZWRpcmVjdCIgKi8KKzQ1MSwJLyogImROU0RvbWFpbiIgKi8KKzQ5NSwJLyogImRTQVF1YWxpdHkiICovCis0MzQsCS8qICJkYXRhIiAqLworMzkwLAkvKiAiZGNvYmplY3QiICovCisxNDAsCS8qICJkZWx0YUNSTCIgKi8KKzg5MSwJLyogImRlbHRhUmV2b2NhdGlvbkxpc3QiICovCisxMDcsCS8qICJkZXNjcmlwdGlvbiIgKi8KKzg3MSwJLyogImRlc3RpbmF0aW9uSW5kaWNhdG9yIiAqLworMjgsCS8qICJkaEtleUFncmVlbWVudCIgKi8KKzM4MiwJLyogImRpcmVjdG9yeSIgKi8KKzg4NywJLyogImRpc3Rpbmd1aXNoZWROYW1lIiAqLworODkyLAkvKiAiZG1kTmFtZSIgKi8KKzE3NCwJLyogImRuUXVhbGlmaWVyIiAqLworNDQ3LAkvKiAiZG9jdW1lbnQiICovCis0NzEsCS8qICJkb2N1bWVudEF1dGhvciIgKi8KKzQ2OCwJLyogImRvY3VtZW50SWRlbnRpZmllciIgKi8KKzQ3MiwJLyogImRvY3VtZW50TG9jYXRpb24iICovCis1MDIsCS8qICJkb2N1bWVudFB1Ymxpc2hlciIgKi8KKzQ0OSwJLyogImRvY3VtZW50U2VyaWVzIiAqLworNDY5LAkvKiAiZG9jdW1lbnRUaXRsZSIgKi8KKzQ3MCwJLyogImRvY3VtZW50VmVyc2lvbiIgKi8KKzM5MiwJLyogImRvbWFpbiIgKi8KKzQ1MiwJLyogImRvbWFpblJlbGF0ZWRPYmplY3QiICovCis4MDIsCS8qICJkc2Ffd2l0aF9TSEEyMjQiICovCis4MDMsCS8qICJkc2Ffd2l0aF9TSEEyNTYiICovCis3OTEsCS8qICJlY2RzYS13aXRoLVJlY29tbWVuZGVkIiAqLworNDE2LAkvKiAiZWNkc2Etd2l0aC1TSEExIiAqLworNzkzLAkvKiAiZWNkc2Etd2l0aC1TSEEyMjQiICovCis3OTQsCS8qICJlY2RzYS13aXRoLVNIQTI1NiIgKi8KKzc5NSwJLyogImVjZHNhLXdpdGgtU0hBMzg0IiAqLworNzk2LAkvKiAiZWNkc2Etd2l0aC1TSEE1MTIiICovCis3OTIsCS8qICJlY2RzYS13aXRoLVNwZWNpZmllZCIgKi8KKzQ4LAkvKiAiZW1haWxBZGRyZXNzIiAqLworMTMyLAkvKiAiZW1haWxQcm90ZWN0aW9uIiAqLworODg1LAkvKiAiZW5oYW5jZWRTZWFyY2hHdWlkZSIgKi8KKzM4OSwJLyogImVudGVycHJpc2VzIiAqLworMzg0LAkvKiAiZXhwZXJpbWVudGFsIiAqLworMTcyLAkvKiAiZXh0UmVxIiAqLworNTYsCS8qICJleHRlbmRlZENlcnRpZmljYXRlQXR0cmlidXRlcyIgKi8KKzEyNiwJLyogImV4dGVuZGVkS2V5VXNhZ2UiICovCiszNzIsCS8qICJleHRlbmRlZFN0YXR1cyIgKi8KKzg2NywJLyogImZhY3NpbWlsZVRlbGVwaG9uZU51bWJlciIgKi8KKzQ2MiwJLyogImZhdm91cml0ZURyaW5rIiAqLworODU3LAkvKiAiZnJlc2hlc3RDUkwiICovCis0NTMsCS8qICJmcmllbmRseUNvdW50cnkiICovCis0OTAsCS8qICJmcmllbmRseUNvdW50cnlOYW1lIiAqLworMTU2LAkvKiAiZnJpZW5kbHlOYW1lIiAqLworNTA5LAkvKiAiZ2VuZXJhdGlvblF1YWxpZmllciIgKi8KKzgxNSwJLyogImdvc3QtbWFjIiAqLworODExLAkvKiAiZ29zdDIwMDEiICovCis4NTEsCS8qICJnb3N0MjAwMWNjIiAqLworODEzLAkvKiAiZ29zdDg5IiAqLworODE0LAkvKiAiZ29zdDg5LWNudCIgKi8KKzgxMiwJLyogImdvc3Q5NCIgKi8KKzg1MCwJLyogImdvc3Q5NGNjIiAqLworNzk3LAkvKiAiaG1hY1dpdGhNRDUiICovCisxNjMsCS8qICJobWFjV2l0aFNIQTEiICovCis3OTgsCS8qICJobWFjV2l0aFNIQTIyNCIgKi8KKzc5OSwJLyogImhtYWNXaXRoU0hBMjU2IiAqLworODAwLAkvKiAiaG1hY1dpdGhTSEEzODQiICovCis4MDEsCS8qICJobWFjV2l0aFNIQTUxMiIgKi8KKzQzMiwJLyogImhvbGRJbnN0cnVjdGlvbkNhbGxJc3N1ZXIiICovCis0MzAsCS8qICJob2xkSW5zdHJ1Y3Rpb25Db2RlIiAqLworNDMxLAkvKiAiaG9sZEluc3RydWN0aW9uTm9uZSIgKi8KKzQzMywJLyogImhvbGRJbnN0cnVjdGlvblJlamVjdCIgKi8KKzQ4NiwJLyogImhvbWVQb3N0YWxBZGRyZXNzIiAqLworNDczLAkvKiAiaG9tZVRlbGVwaG9uZU51bWJlciIgKi8KKzQ2NiwJLyogImhvc3QiICovCis4ODksCS8qICJob3VzZUlkZW50aWZpZXIiICovCis0NDIsCS8qICJpQTVTdHJpbmdTeW50YXgiICovCis3ODMsCS8qICJpZC1ESEJhc2VkTWFjIiAqLworODI0LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1BLVBhcmFtU2V0IiAqLworODI1LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1CLVBhcmFtU2V0IiAqLworODI2LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1DLVBhcmFtU2V0IiAqLworODI3LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1ELVBhcmFtU2V0IiAqLworODE5LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1LZXlNZXNoaW5nIiAqLworODI5LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTAtUGFyYW1TZXQiICovCis4MjgsCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLU9zY2FyLTEtMS1QYXJhbVNldCIgKi8KKzgzMCwJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tUklDLTEtUGFyYW1TZXQiICovCis4MjAsCS8qICJpZC1Hb3N0MjgxNDctODktTm9uZS1LZXlNZXNoaW5nIiAqLworODIzLAkvKiAiaWQtR29zdDI4MTQ3LTg5LVRlc3RQYXJhbVNldCIgKi8KKzg0OSwJLyogImlkLUdvc3QyODE0Ny04OS1jYyIgKi8KKzg0MCwJLyogImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1BLVBhcmFtU2V0IiAqLworODQxLAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUItUGFyYW1TZXQiICovCis4NDIsCS8qICJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIgKi8KKzg0MywJLyogImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hBLVBhcmFtU2V0IiAqLworODQ0LAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEItUGFyYW1TZXQiICovCis4NTQsCS8qICJpZC1Hb3N0UjM0MTAtMjAwMS1QYXJhbVNldC1jYyIgKi8KKzgzOSwJLyogImlkLUdvc3RSMzQxMC0yMDAxLVRlc3RQYXJhbVNldCIgKi8KKzgxNywJLyogImlkLUdvc3RSMzQxMC0yMDAxREgiICovCis4MzIsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUEtUGFyYW1TZXQiICovCis4MzMsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUItUGFyYW1TZXQiICovCis4MzQsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUMtUGFyYW1TZXQiICovCis4MzUsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUQtUGFyYW1TZXQiICovCis4MzYsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiICovCis4MzcsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEItUGFyYW1TZXQiICovCis4MzgsCS8qICJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEMtUGFyYW1TZXQiICovCis4MzEsCS8qICJpZC1Hb3N0UjM0MTAtOTQtVGVzdFBhcmFtU2V0IiAqLworODQ1LAkvKiAiaWQtR29zdFIzNDEwLTk0LWEiICovCis4NDYsCS8qICJpZC1Hb3N0UjM0MTAtOTQtYUJpcyIgKi8KKzg0NywJLyogImlkLUdvc3RSMzQxMC05NC1iIiAqLworODQ4LAkvKiAiaWQtR29zdFIzNDEwLTk0LWJCaXMiICovCis4MTgsCS8qICJpZC1Hb3N0UjM0MTAtOTRESCIgKi8KKzgyMiwJLyogImlkLUdvc3RSMzQxMS05NC1DcnlwdG9Qcm9QYXJhbVNldCIgKi8KKzgyMSwJLyogImlkLUdvc3RSMzQxMS05NC1UZXN0UGFyYW1TZXQiICovCis4MDcsCS8qICJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtMjAwMSIgKi8KKzg1MywJLyogImlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC0yMDAxLWNjIiAqLworODA4LAkvKiAiaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTk0IiAqLworODUyLAkvKiAiaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTk0LWNjIiAqLworODEwLAkvKiAiaWQtSE1BQ0dvc3RSMzQxMS05NCIgKi8KKzc4MiwJLyogImlkLVBhc3N3b3JkQmFzZWRNQUMiICovCisyNjYsCS8qICJpZC1hY2EiICovCiszNTUsCS8qICJpZC1hY2EtYWNjZXNzSWRlbnRpdHkiICovCiszNTQsCS8qICJpZC1hY2EtYXV0aGVudGljYXRpb25JbmZvIiAqLworMzU2LAkvKiAiaWQtYWNhLWNoYXJnaW5nSWRlbnRpdHkiICovCiszOTksCS8qICJpZC1hY2EtZW5jQXR0cnMiICovCiszNTcsCS8qICJpZC1hY2EtZ3JvdXAiICovCiszNTgsCS8qICJpZC1hY2Etcm9sZSIgKi8KKzE3NiwJLyogImlkLWFkIiAqLworNzg4LAkvKiAiaWQtYWVzMTI4LXdyYXAiICovCis3ODksCS8qICJpZC1hZXMxOTItd3JhcCIgKi8KKzc5MCwJLyogImlkLWFlczI1Ni13cmFwIiAqLworMjYyLAkvKiAiaWQtYWxnIiAqLworMzIzLAkvKiAiaWQtYWxnLWRlczQwIiAqLworMzI2LAkvKiAiaWQtYWxnLWRoLXBvcCIgKi8KKzMyNSwJLyogImlkLWFsZy1kaC1zaWctaG1hYy1zaGExIiAqLworMzI0LAkvKiAiaWQtYWxnLW5vU2lnbmF0dXJlIiAqLworMjY4LAkvKiAiaWQtY2N0IiAqLworMzYxLAkvKiAiaWQtY2N0LVBLSURhdGEiICovCiszNjIsCS8qICJpZC1jY3QtUEtJUmVzcG9uc2UiICovCiszNjAsCS8qICJpZC1jY3QtY3JzIiAqLworODEsCS8qICJpZC1jZSIgKi8KKzY4MCwJLyogImlkLWNoYXJhY3RlcmlzdGljLXR3by1iYXNpcyIgKi8KKzI2MywJLyogImlkLWNtYyIgKi8KKzMzNCwJLyogImlkLWNtYy1hZGRFeHRlbnNpb25zIiAqLworMzQ2LAkvKiAiaWQtY21jLWNvbmZpcm1DZXJ0QWNjZXB0YW5jZSIgKi8KKzMzMCwJLyogImlkLWNtYy1kYXRhUmV0dXJuIiAqLworMzM2LAkvKiAiaWQtY21jLWRlY3J5cHRlZFBPUCIgKi8KKzMzNSwJLyogImlkLWNtYy1lbmNyeXB0ZWRQT1AiICovCiszMzksCS8qICJpZC1jbWMtZ2V0Q1JMIiAqLworMzM4LAkvKiAiaWQtY21jLWdldENlcnQiICovCiszMjgsCS8qICJpZC1jbWMtaWRlbnRpZmljYXRpb24iICovCiszMjksCS8qICJpZC1jbWMtaWRlbnRpdHlQcm9vZiIgKi8KKzMzNywJLyogImlkLWNtYy1scmFQT1BXaXRuZXNzIiAqLworMzQ0LAkvKiAiaWQtY21jLXBvcExpbmtSYW5kb20iICovCiszNDUsCS8qICJpZC1jbWMtcG9wTGlua1dpdG5lc3MiICovCiszNDMsCS8qICJpZC1jbWMtcXVlcnlQZW5kaW5nIiAqLworMzMzLAkvKiAiaWQtY21jLXJlY2lwaWVudE5vbmNlIiAqLworMzQxLAkvKiAiaWQtY21jLXJlZ0luZm8iICovCiszNDIsCS8qICJpZC1jbWMtcmVzcG9uc2VJbmZvIiAqLworMzQwLAkvKiAiaWQtY21jLXJldm9rZVJlcXVlc3QiICovCiszMzIsCS8qICJpZC1jbWMtc2VuZGVyTm9uY2UiICovCiszMjcsCS8qICJpZC1jbWMtc3RhdHVzSW5mbyIgKi8KKzMzMSwJLyogImlkLWNtYy10cmFuc2FjdGlvbklkIiAqLworNzg3LAkvKiAiaWQtY3QtYXNjaWlUZXh0V2l0aENSTEYiICovCis0MDgsCS8qICJpZC1lY1B1YmxpY0tleSIgKi8KKzUwOCwJLyogImlkLWhleC1tdWx0aXBhcnQtbWVzc2FnZSIgKi8KKzUwNywJLyogImlkLWhleC1wYXJ0aWFsLW1lc3NhZ2UiICovCisyNjAsCS8qICJpZC1pdCIgKi8KKzMwMiwJLyogImlkLWl0LWNhS2V5VXBkYXRlSW5mbyIgKi8KKzI5OCwJLyogImlkLWl0LWNhUHJvdEVuY0NlcnQiICovCiszMTEsCS8qICJpZC1pdC1jb25maXJtV2FpdFRpbWUiICovCiszMDMsCS8qICJpZC1pdC1jdXJyZW50Q1JMIiAqLworMzAwLAkvKiAiaWQtaXQtZW5jS2V5UGFpclR5cGVzIiAqLworMzEwLAkvKiAiaWQtaXQtaW1wbGljaXRDb25maXJtIiAqLworMzA4LAkvKiAiaWQtaXQta2V5UGFpclBhcmFtUmVwIiAqLworMzA3LAkvKiAiaWQtaXQta2V5UGFpclBhcmFtUmVxIiAqLworMzEyLAkvKiAiaWQtaXQtb3JpZ1BLSU1lc3NhZ2UiICovCiszMDEsCS8qICJpZC1pdC1wcmVmZXJyZWRTeW1tQWxnIiAqLworMzA5LAkvKiAiaWQtaXQtcmV2UGFzc3BocmFzZSIgKi8KKzI5OSwJLyogImlkLWl0LXNpZ25LZXlQYWlyVHlwZXMiICovCiszMDUsCS8qICJpZC1pdC1zdWJzY3JpcHRpb25SZXF1ZXN0IiAqLworMzA2LAkvKiAiaWQtaXQtc3Vic2NyaXB0aW9uUmVzcG9uc2UiICovCis3ODQsCS8qICJpZC1pdC1zdXBwTGFuZ1RhZ3MiICovCiszMDQsCS8qICJpZC1pdC11bnN1cHBvcnRlZE9JRHMiICovCisxMjgsCS8qICJpZC1rcCIgKi8KKzI4MCwJLyogImlkLW1vZC1hdHRyaWJ1dGUtY2VydCIgKi8KKzI3NCwJLyogImlkLW1vZC1jbWMiICovCisyNzcsCS8qICJpZC1tb2QtY21wIiAqLworMjg0LAkvKiAiaWQtbW9kLWNtcDIwMDAiICovCisyNzMsCS8qICJpZC1tb2QtY3JtZiIgKi8KKzI4MywJLyogImlkLW1vZC1kdmNzIiAqLworMjc1LAkvKiAiaWQtbW9kLWtlYS1wcm9maWxlLTg4IiAqLworMjc2LAkvKiAiaWQtbW9kLWtlYS1wcm9maWxlLTkzIiAqLworMjgyLAkvKiAiaWQtbW9kLW9jc3AiICovCisyNzgsCS8qICJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtODgiICovCisyNzksCS8qICJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtOTMiICovCisyODEsCS8qICJpZC1tb2QtdGltZXN0YW1wLXByb3RvY29sIiAqLworMjY0LAkvKiAiaWQtb24iICovCis4NTgsCS8qICJpZC1vbi1wZXJtYW5lbnRJZGVudGlmaWVyIiAqLworMzQ3LAkvKiAiaWQtb24tcGVyc29uYWxEYXRhIiAqLworMjY1LAkvKiAiaWQtcGRhIiAqLworMzUyLAkvKiAiaWQtcGRhLWNvdW50cnlPZkNpdGl6ZW5zaGlwIiAqLworMzUzLAkvKiAiaWQtcGRhLWNvdW50cnlPZlJlc2lkZW5jZSIgKi8KKzM0OCwJLyogImlkLXBkYS1kYXRlT2ZCaXJ0aCIgKi8KKzM1MSwJLyogImlkLXBkYS1nZW5kZXIiICovCiszNDksCS8qICJpZC1wZGEtcGxhY2VPZkJpcnRoIiAqLworMTc1LAkvKiAiaWQtcGUiICovCisyNjEsCS8qICJpZC1wa2lwIiAqLworMjU4LAkvKiAiaWQtcGtpeC1tb2QiICovCisyNjksCS8qICJpZC1wa2l4MS1leHBsaWNpdC04OCIgKi8KKzI3MSwJLyogImlkLXBraXgxLWV4cGxpY2l0LTkzIiAqLworMjcwLAkvKiAiaWQtcGtpeDEtaW1wbGljaXQtODgiICovCisyNzIsCS8qICJpZC1wa2l4MS1pbXBsaWNpdC05MyIgKi8KKzY2MiwJLyogImlkLXBwbCIgKi8KKzY2NCwJLyogImlkLXBwbC1hbnlMYW5ndWFnZSIgKi8KKzY2NywJLyogImlkLXBwbC1pbmRlcGVuZGVudCIgKi8KKzY2NSwJLyogImlkLXBwbC1pbmhlcml0QWxsIiAqLworMjY3LAkvKiAiaWQtcWNzIiAqLworMzU5LAkvKiAiaWQtcWNzLXBraXhRQ1N5bnRheC12MSIgKi8KKzI1OSwJLyogImlkLXF0IiAqLworMTY0LAkvKiAiaWQtcXQtY3BzIiAqLworMTY1LAkvKiAiaWQtcXQtdW5vdGljZSIgKi8KKzMxMywJLyogImlkLXJlZ0N0cmwiICovCiszMTYsCS8qICJpZC1yZWdDdHJsLWF1dGhlbnRpY2F0b3IiICovCiszMTksCS8qICJpZC1yZWdDdHJsLW9sZENlcnRJRCIgKi8KKzMxOCwJLyogImlkLXJlZ0N0cmwtcGtpQXJjaGl2ZU9wdGlvbnMiICovCiszMTcsCS8qICJpZC1yZWdDdHJsLXBraVB1YmxpY2F0aW9uSW5mbyIgKi8KKzMyMCwJLyogImlkLXJlZ0N0cmwtcHJvdG9jb2xFbmNyS2V5IiAqLworMzE1LAkvKiAiaWQtcmVnQ3RybC1yZWdUb2tlbiIgKi8KKzMxNCwJLyogImlkLXJlZ0luZm8iICovCiszMjIsCS8qICJpZC1yZWdJbmZvLWNlcnRSZXEiICovCiszMjEsCS8qICJpZC1yZWdJbmZvLXV0ZjhQYWlycyIgKi8KKzUxMiwJLyogImlkLXNldCIgKi8KKzE5MSwJLyogImlkLXNtaW1lLWFhIiAqLworMjE1LAkvKiAiaWQtc21pbWUtYWEtY29udGVudEhpbnQiICovCisyMTgsCS8qICJpZC1zbWltZS1hYS1jb250ZW50SWRlbnRpZmllciIgKi8KKzIyMSwJLyogImlkLXNtaW1lLWFhLWNvbnRlbnRSZWZlcmVuY2UiICovCisyNDAsCS8qICJpZC1zbWltZS1hYS1kdmNzLWR2YyIgKi8KKzIxNywJLyogImlkLXNtaW1lLWFhLWVuY2FwQ29udGVudFR5cGUiICovCisyMjIsCS8qICJpZC1zbWltZS1hYS1lbmNyeXBLZXlQcmVmIiAqLworMjIwLAkvKiAiaWQtc21pbWUtYWEtZXF1aXZhbGVudExhYmVscyIgKi8KKzIzMiwJLyogImlkLXNtaW1lLWFhLWV0cy1DZXJ0aWZpY2F0ZVJlZnMiICovCisyMzMsCS8qICJpZC1zbWltZS1hYS1ldHMtUmV2b2NhdGlvblJlZnMiICovCisyMzgsCS8qICJpZC1zbWltZS1hYS1ldHMtYXJjaGl2ZVRpbWVTdGFtcCIgKi8KKzIzNywJLyogImlkLXNtaW1lLWFhLWV0cy1jZXJ0Q1JMVGltZXN0YW1wIiAqLworMjM0LAkvKiAiaWQtc21pbWUtYWEtZXRzLWNlcnRWYWx1ZXMiICovCisyMjcsCS8qICJpZC1zbWltZS1hYS1ldHMtY29tbWl0bWVudFR5cGUiICovCisyMzEsCS8qICJpZC1zbWltZS1hYS1ldHMtY29udGVudFRpbWVzdGFtcCIgKi8KKzIzNiwJLyogImlkLXNtaW1lLWFhLWV0cy1lc2NUaW1lU3RhbXAiICovCisyMzAsCS8qICJpZC1zbWltZS1hYS1ldHMtb3RoZXJTaWdDZXJ0IiAqLworMjM1LAkvKiAiaWQtc21pbWUtYWEtZXRzLXJldm9jYXRpb25WYWx1ZXMiICovCisyMjYsCS8qICJpZC1zbWltZS1hYS1ldHMtc2lnUG9saWN5SWQiICovCisyMjksCS8qICJpZC1zbWltZS1hYS1ldHMtc2lnbmVyQXR0ciIgKi8KKzIyOCwJLyogImlkLXNtaW1lLWFhLWV0cy1zaWduZXJMb2NhdGlvbiIgKi8KKzIxOSwJLyogImlkLXNtaW1lLWFhLW1hY1ZhbHVlIiAqLworMjE0LAkvKiAiaWQtc21pbWUtYWEtbWxFeHBhbmRIaXN0b3J5IiAqLworMjE2LAkvKiAiaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0IiAqLworMjEyLAkvKiAiaWQtc21pbWUtYWEtcmVjZWlwdFJlcXVlc3QiICovCisyMTMsCS8qICJpZC1zbWltZS1hYS1zZWN1cml0eUxhYmVsIiAqLworMjM5LAkvKiAiaWQtc21pbWUtYWEtc2lnbmF0dXJlVHlwZSIgKi8KKzIyMywJLyogImlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZSIgKi8KKzIyNCwJLyogImlkLXNtaW1lLWFhLXNtaW1lRW5jcnlwdENlcnRzIiAqLworMjI1LAkvKiAiaWQtc21pbWUtYWEtdGltZVN0YW1wVG9rZW4iICovCisxOTIsCS8qICJpZC1zbWltZS1hbGciICovCisyNDMsCS8qICJpZC1zbWltZS1hbGctM0RFU3dyYXAiICovCisyNDYsCS8qICJpZC1zbWltZS1hbGctQ01TM0RFU3dyYXAiICovCisyNDcsCS8qICJpZC1zbWltZS1hbGctQ01TUkMyd3JhcCIgKi8KKzI0NSwJLyogImlkLXNtaW1lLWFsZy1FU0RIIiAqLworMjQxLAkvKiAiaWQtc21pbWUtYWxnLUVTREh3aXRoM0RFUyIgKi8KKzI0MiwJLyogImlkLXNtaW1lLWFsZy1FU0RId2l0aFJDMiIgKi8KKzI0NCwJLyogImlkLXNtaW1lLWFsZy1SQzJ3cmFwIiAqLworMTkzLAkvKiAiaWQtc21pbWUtY2QiICovCisyNDgsCS8qICJpZC1zbWltZS1jZC1sZGFwIiAqLworMTkwLAkvKiAiaWQtc21pbWUtY3QiICovCisyMTAsCS8qICJpZC1zbWltZS1jdC1EVkNTUmVxdWVzdERhdGEiICovCisyMTEsCS8qICJpZC1zbWltZS1jdC1EVkNTUmVzcG9uc2VEYXRhIiAqLworMjA4LAkvKiAiaWQtc21pbWUtY3QtVERUSW5mbyIgKi8KKzIwNywJLyogImlkLXNtaW1lLWN0LVRTVEluZm8iICovCisyMDUsCS8qICJpZC1zbWltZS1jdC1hdXRoRGF0YSIgKi8KKzc4NiwJLyogImlkLXNtaW1lLWN0LWNvbXByZXNzZWREYXRhIiAqLworMjA5LAkvKiAiaWQtc21pbWUtY3QtY29udGVudEluZm8iICovCisyMDYsCS8qICJpZC1zbWltZS1jdC1wdWJsaXNoQ2VydCIgKi8KKzIwNCwJLyogImlkLXNtaW1lLWN0LXJlY2VpcHQiICovCisxOTUsCS8qICJpZC1zbWltZS1jdGkiICovCisyNTUsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZBcHByb3ZhbCIgKi8KKzI1NiwJLyogImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkNyZWF0aW9uIiAqLworMjUzLAkvKiAiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mRGVsaXZlcnkiICovCisyNTEsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZPcmlnaW4iICovCisyNTIsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZSZWNlaXB0IiAqLworMjU0LAkvKiAiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mU2VuZGVyIiAqLworMTg5LAkvKiAiaWQtc21pbWUtbW9kIiAqLworMTk2LAkvKiAiaWQtc21pbWUtbW9kLWNtcyIgKi8KKzE5NywJLyogImlkLXNtaW1lLW1vZC1lc3MiICovCisyMDIsCS8qICJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktODgiICovCisyMDMsCS8qICJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktOTciICovCisyMDAsCS8qICJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtODgiICovCisyMDEsCS8qICJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtOTciICovCisxOTksCS8qICJpZC1zbWltZS1tb2QtbXNnLXYzIiAqLworMTk4LAkvKiAiaWQtc21pbWUtbW9kLW9pZCIgKi8KKzE5NCwJLyogImlkLXNtaW1lLXNwcSIgKi8KKzI1MCwJLyogImlkLXNtaW1lLXNwcS1ldHMtc3F0LXVub3RpY2UiICovCisyNDksCS8qICJpZC1zbWltZS1zcHEtZXRzLXNxdC11cmkiICovCis2NzYsCS8qICJpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiIgKi8KKzQ2MSwJLyogImluZm8iICovCis3NDgsCS8qICJpbmhpYml0QW55UG9saWN5IiAqLworMTAxLAkvKiAiaW5pdGlhbHMiICovCis2NDcsCS8qICJpbnRlcm5hdGlvbmFsLW9yZ2FuaXphdGlvbnMiICovCis4NjksCS8qICJpbnRlcm5hdGlvbmFsaVNETk51bWJlciIgKi8KKzE0MiwJLyogImludmFsaWRpdHlEYXRlIiAqLworMjk0LAkvKiAiaXBzZWNFbmRTeXN0ZW0iICovCisyOTUsCS8qICJpcHNlY1R1bm5lbCIgKi8KKzI5NiwJLyogImlwc2VjVXNlciIgKi8KKzg2LAkvKiAiaXNzdWVyQWx0TmFtZSIgKi8KKzc3MCwJLyogImlzc3VpbmdEaXN0cmlidXRpb25Qb2ludCIgKi8KKzQ5MiwJLyogImphbmV0TWFpbGJveCIgKi8KKzE1MCwJLyogImtleUJhZyIgKi8KKzgzLAkvKiAia2V5VXNhZ2UiICovCis0NzcsCS8qICJsYXN0TW9kaWZpZWRCeSIgKi8KKzQ3NiwJLyogImxhc3RNb2RpZmllZFRpbWUiICovCisxNTcsCS8qICJsb2NhbEtleUlEIiAqLworNDgwLAkvKiAibVhSZWNvcmQiICovCis0NjAsCS8qICJtYWlsIiAqLworNDkzLAkvKiAibWFpbFByZWZlcmVuY2VPcHRpb24iICovCis0NjcsCS8qICJtYW5hZ2VyIiAqLworODA5LAkvKiAibWRfZ29zdDk0IiAqLworODc1LAkvKiAibWVtYmVyIiAqLworMTgyLAkvKiAibWVtYmVyLWJvZHkiICovCis1MSwJLyogIm1lc3NhZ2VEaWdlc3QiICovCiszODMsCS8qICJtZ210IiAqLworNTA0LAkvKiAibWltZS1taHMiICovCis1MDYsCS8qICJtaW1lLW1ocy1ib2RpZXMiICovCis1MDUsCS8qICJtaW1lLW1ocy1oZWFkaW5ncyIgKi8KKzQ4OCwJLyogIm1vYmlsZVRlbGVwaG9uZU51bWJlciIgKi8KKzEzNiwJLyogIm1zQ1RMU2lnbiIgKi8KKzEzNSwJLyogIm1zQ29kZUNvbSIgKi8KKzEzNCwJLyogIm1zQ29kZUluZCIgKi8KKzEzOCwJLyogIm1zRUZTIiAqLworMTcxLAkvKiAibXNFeHRSZXEiICovCisxMzcsCS8qICJtc1NHQyIgKi8KKzY0OCwJLyogIm1zU21hcnRjYXJkTG9naW4iICovCis2NDksCS8qICJtc1VQTiIgKi8KKzQ4MSwJLyogIm5TUmVjb3JkIiAqLworMTczLAkvKiAibmFtZSIgKi8KKzY2NiwJLyogIm5hbWVDb25zdHJhaW50cyIgKi8KKzM2OSwJLyogIm5vQ2hlY2siICovCis0MDMsCS8qICJub1JldkF2YWlsIiAqLworNzIsCS8qICJuc0Jhc2VVcmwiICovCis3NiwJLyogIm5zQ2FQb2xpY3lVcmwiICovCis3NCwJLyogIm5zQ2FSZXZvY2F0aW9uVXJsIiAqLworNTgsCS8qICJuc0NlcnRFeHQiICovCis3OSwJLyogIm5zQ2VydFNlcXVlbmNlIiAqLworNzEsCS8qICJuc0NlcnRUeXBlIiAqLworNzgsCS8qICJuc0NvbW1lbnQiICovCis1OSwJLyogIm5zRGF0YVR5cGUiICovCis3NSwJLyogIm5zUmVuZXdhbFVybCIgKi8KKzczLAkvKiAibnNSZXZvY2F0aW9uVXJsIiAqLworMTM5LAkvKiAibnNTR0MiICovCis3NywJLyogIm5zU3NsU2VydmVyTmFtZSIgKi8KKzY4MSwJLyogIm9uQmFzaXMiICovCis0OTEsCS8qICJvcmdhbml6YXRpb25hbFN0YXR1cyIgKi8KKzQ3NSwJLyogIm90aGVyTWFpbGJveCIgKi8KKzg3NiwJLyogIm93bmVyIiAqLworNDg5LAkvKiAicGFnZXJUZWxlcGhvbmVOdW1iZXIiICovCiszNzQsCS8qICJwYXRoIiAqLworMTEyLAkvKiAicGJlV2l0aE1ENUFuZENhc3Q1Q0JDIiAqLworNDk5LAkvKiAicGVyc29uYWxTaWduYXR1cmUiICovCis0ODcsCS8qICJwZXJzb25hbFRpdGxlIiAqLworNDY0LAkvKiAicGhvdG8iICovCis4NjMsCS8qICJwaHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZSIgKi8KKzQzNywJLyogInBpbG90IiAqLworNDM5LAkvKiAicGlsb3RBdHRyaWJ1dGVTeW50YXgiICovCis0MzgsCS8qICJwaWxvdEF0dHJpYnV0ZVR5cGUiICovCis0NzksCS8qICJwaWxvdEF0dHJpYnV0ZVR5cGUyNyIgKi8KKzQ1NiwJLyogInBpbG90RFNBIiAqLworNDQxLAkvKiAicGlsb3RHcm91cHMiICovCis0NDQsCS8qICJwaWxvdE9iamVjdCIgKi8KKzQ0MCwJLyogInBpbG90T2JqZWN0Q2xhc3MiICovCis0NTUsCS8qICJwaWxvdE9yZ2FuaXphdGlvbiIgKi8KKzQ0NSwJLyogInBpbG90UGVyc29uIiAqLworIDIsCS8qICJwa2NzIiAqLworMTg2LAkvKiAicGtjczEiICovCisyNywJLyogInBrY3MzIiAqLworMTg3LAkvKiAicGtjczUiICovCisyMCwJLyogInBrY3M3IiAqLworMjEsCS8qICJwa2NzNy1kYXRhIiAqLworMjUsCS8qICJwa2NzNy1kaWdlc3REYXRhIiAqLworMjYsCS8qICJwa2NzNy1lbmNyeXB0ZWREYXRhIiAqLworMjMsCS8qICJwa2NzNy1lbnZlbG9wZWREYXRhIiAqLworMjQsCS8qICJwa2NzNy1zaWduZWRBbmRFbnZlbG9wZWREYXRhIiAqLworMjIsCS8qICJwa2NzNy1zaWduZWREYXRhIiAqLworMTUxLAkvKiAicGtjczhTaHJvdWRlZEtleUJhZyIgKi8KKzQ3LAkvKiAicGtjczkiICovCis0MDEsCS8qICJwb2xpY3lDb25zdHJhaW50cyIgKi8KKzc0NywJLyogInBvbGljeU1hcHBpbmdzIiAqLworODYyLAkvKiAicG9zdE9mZmljZUJveCIgKi8KKzg2MSwJLyogInBvc3RhbEFkZHJlc3MiICovCis2NjEsCS8qICJwb3N0YWxDb2RlIiAqLworNjgzLAkvKiAicHBCYXNpcyIgKi8KKzg3MiwJLyogInByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kIiAqLworODczLAkvKiAicHJlc2VudGF0aW9uQWRkcmVzcyIgKi8KKzgxNiwJLyogInByZi1nb3N0cjM0MTEtOTQiICovCis0MDYsCS8qICJwcmltZS1maWVsZCIgKi8KKzQwOSwJLyogInByaW1lMTkydjEiICovCis0MTAsCS8qICJwcmltZTE5MnYyIiAqLworNDExLAkvKiAicHJpbWUxOTJ2MyIgKi8KKzQxMiwJLyogInByaW1lMjM5djEiICovCis0MTMsCS8qICJwcmltZTIzOXYyIiAqLworNDE0LAkvKiAicHJpbWUyMzl2MyIgKi8KKzQxNSwJLyogInByaW1lMjU2djEiICovCiszODUsCS8qICJwcml2YXRlIiAqLworODQsCS8qICJwcml2YXRlS2V5VXNhZ2VQZXJpb2QiICovCis4ODYsCS8qICJwcm90b2NvbEluZm9ybWF0aW9uIiAqLworNjYzLAkvKiAicHJveHlDZXJ0SW5mbyIgKi8KKzUxMCwJLyogInBzZXVkb255bSIgKi8KKzQzNSwJLyogInBzcyIgKi8KKzI4NiwJLyogInFjU3RhdGVtZW50cyIgKi8KKzQ1NywJLyogInF1YWxpdHlMYWJlbGxlZERhdGEiICovCis0NTAsCS8qICJyRkM4MjJsb2NhbFBhcnQiICovCis4NzAsCS8qICJyZWdpc3RlcmVkQWRkcmVzcyIgKi8KKzQwMCwJLyogInJvbGUiICovCis4NzcsCS8qICJyb2xlT2NjdXBhbnQiICovCis0NDgsCS8qICJyb29tIiAqLworNDYzLAkvKiAicm9vbU51bWJlciIgKi8KKyA2LAkvKiAicnNhRW5jcnlwdGlvbiIgKi8KKzY0NCwJLyogInJzYU9BRVBFbmNyeXB0aW9uU0VUIiAqLworMzc3LAkvKiAicnNhU2lnbmF0dXJlIiAqLworIDEsCS8qICJyc2Fkc2kiICovCis0ODIsCS8qICJzT0FSZWNvcmQiICovCisxNTUsCS8qICJzYWZlQ29udGVudHNCYWciICovCisyOTEsCS8qICJzYmdwLWF1dG9ub21vdXNTeXNOdW0iICovCisyOTAsCS8qICJzYmdwLWlwQWRkckJsb2NrIiAqLworMjkyLAkvKiAic2JncC1yb3V0ZXJJZGVudGlmaWVyIiAqLworMTU5LAkvKiAic2RzaUNlcnRpZmljYXRlIiAqLworODU5LAkvKiAic2VhcmNoR3VpZGUiICovCis3MDQsCS8qICJzZWNwMTEycjEiICovCis3MDUsCS8qICJzZWNwMTEycjIiICovCis3MDYsCS8qICJzZWNwMTI4cjEiICovCis3MDcsCS8qICJzZWNwMTI4cjIiICovCis3MDgsCS8qICJzZWNwMTYwazEiICovCis3MDksCS8qICJzZWNwMTYwcjEiICovCis3MTAsCS8qICJzZWNwMTYwcjIiICovCis3MTEsCS8qICJzZWNwMTkyazEiICovCis3MTIsCS8qICJzZWNwMjI0azEiICovCis3MTMsCS8qICJzZWNwMjI0cjEiICovCis3MTQsCS8qICJzZWNwMjU2azEiICovCis3MTUsCS8qICJzZWNwMzg0cjEiICovCis3MTYsCS8qICJzZWNwNTIxcjEiICovCisxNTQsCS8qICJzZWNyZXRCYWciICovCis0NzQsCS8qICJzZWNyZXRhcnkiICovCis3MTcsCS8qICJzZWN0MTEzcjEiICovCis3MTgsCS8qICJzZWN0MTEzcjIiICovCis3MTksCS8qICJzZWN0MTMxcjEiICovCis3MjAsCS8qICJzZWN0MTMxcjIiICovCis3MjEsCS8qICJzZWN0MTYzazEiICovCis3MjIsCS8qICJzZWN0MTYzcjEiICovCis3MjMsCS8qICJzZWN0MTYzcjIiICovCis3MjQsCS8qICJzZWN0MTkzcjEiICovCis3MjUsCS8qICJzZWN0MTkzcjIiICovCis3MjYsCS8qICJzZWN0MjMzazEiICovCis3MjcsCS8qICJzZWN0MjMzcjEiICovCis3MjgsCS8qICJzZWN0MjM5azEiICovCis3MjksCS8qICJzZWN0MjgzazEiICovCis3MzAsCS8qICJzZWN0MjgzcjEiICovCis3MzEsCS8qICJzZWN0NDA5azEiICovCis3MzIsCS8qICJzZWN0NDA5cjEiICovCis3MzMsCS8qICJzZWN0NTcxazEiICovCis3MzQsCS8qICJzZWN0NTcxcjEiICovCiszODYsCS8qICJzZWN1cml0eSIgKi8KKzg3OCwJLyogInNlZUFsc28iICovCiszOTQsCS8qICJzZWxlY3RlZC1hdHRyaWJ1dGUtdHlwZXMiICovCisxMDUsCS8qICJzZXJpYWxOdW1iZXIiICovCisxMjksCS8qICJzZXJ2ZXJBdXRoIiAqLworMzcxLAkvKiAic2VydmljZUxvY2F0b3IiICovCis2MjUsCS8qICJzZXQtYWRkUG9saWN5IiAqLworNTE1LAkvKiAic2V0LWF0dHIiICovCis1MTgsCS8qICJzZXQtYnJhbmQiICovCis2MzgsCS8qICJzZXQtYnJhbmQtQW1lcmljYW5FeHByZXNzIiAqLworNjM3LAkvKiAic2V0LWJyYW5kLURpbmVycyIgKi8KKzYzNiwJLyogInNldC1icmFuZC1JQVRBLUFUQSIgKi8KKzYzOSwJLyogInNldC1icmFuZC1KQ0IiICovCis2NDEsCS8qICJzZXQtYnJhbmQtTWFzdGVyQ2FyZCIgKi8KKzY0MiwJLyogInNldC1icmFuZC1Ob3Z1cyIgKi8KKzY0MCwJLyogInNldC1icmFuZC1WaXNhIiAqLworNTE3LAkvKiAic2V0LWNlcnRFeHQiICovCis1MTMsCS8qICJzZXQtY3R5cGUiICovCis1MTQsCS8qICJzZXQtbXNnRXh0IiAqLworNTE2LAkvKiAic2V0LXBvbGljeSIgKi8KKzYwNywJLyogInNldC1wb2xpY3ktcm9vdCIgKi8KKzYyNCwJLyogInNldC1yb290S2V5VGh1bWIiICovCis2MjAsCS8qICJzZXRBdHRyLUNlcnQiICovCis2MzEsCS8qICJzZXRBdHRyLUdlbkNyeXB0Z3JtIiAqLworNjIzLAkvKiAic2V0QXR0ci1Jc3NDYXAiICovCis2MjgsCS8qICJzZXRBdHRyLUlzc0NhcC1DVk0iICovCis2MzAsCS8qICJzZXRBdHRyLUlzc0NhcC1TaWciICovCis2MjksCS8qICJzZXRBdHRyLUlzc0NhcC1UMiIgKi8KKzYyMSwJLyogInNldEF0dHItUEdXWWNhcCIgKi8KKzYzNSwJLyogInNldEF0dHItU2VjRGV2U2lnIiAqLworNjMyLAkvKiAic2V0QXR0ci1UMkVuYyIgKi8KKzYzMywJLyogInNldEF0dHItVDJjbGVhcnR4dCIgKi8KKzYzNCwJLyogInNldEF0dHItVG9rSUNDc2lnIiAqLworNjI3LAkvKiAic2V0QXR0ci1Ub2tlbi1CMFByaW1lIiAqLworNjI2LAkvKiAic2V0QXR0ci1Ub2tlbi1FTVYiICovCis2MjIsCS8qICJzZXRBdHRyLVRva2VuVHlwZSIgKi8KKzYxOSwJLyogInNldENleHQtSXNzdWVyQ2FwYWJpbGl0aWVzIiAqLworNjE1LAkvKiAic2V0Q2V4dC1QR1dZY2FwYWJpbGl0aWVzIiAqLworNjE2LAkvKiAic2V0Q2V4dC1Ub2tlbklkZW50aWZpZXIiICovCis2MTgsCS8qICJzZXRDZXh0LVRva2VuVHlwZSIgKi8KKzYxNywJLyogInNldENleHQtVHJhY2syRGF0YSIgKi8KKzYxMSwJLyogInNldENleHQtY0NlcnRSZXF1aXJlZCIgKi8KKzYwOSwJLyogInNldENleHQtY2VydFR5cGUiICovCis2MDgsCS8qICJzZXRDZXh0LWhhc2hlZFJvb3QiICovCis2MTAsCS8qICJzZXRDZXh0LW1lcmNoRGF0YSIgKi8KKzYxMywJLyogInNldENleHQtc2V0RXh0IiAqLworNjE0LAkvKiAic2V0Q2V4dC1zZXRRdWFsZiIgKi8KKzYxMiwJLyogInNldENleHQtdHVubmVsaW5nIiAqLworNTQwLAkvKiAic2V0Y3QtQWNxQ2FyZENvZGVNc2ciICovCis1NzYsCS8qICJzZXRjdC1BY3FDYXJkQ29kZU1zZ1RCRSIgKi8KKzU3MCwJLyogInNldGN0LUF1dGhSZXFUQkUiICovCis1MzQsCS8qICJzZXRjdC1BdXRoUmVxVEJTIiAqLworNTI3LAkvKiAic2V0Y3QtQXV0aFJlc0JhZ2dhZ2UiICovCis1NzEsCS8qICJzZXRjdC1BdXRoUmVzVEJFIiAqLworNTcyLAkvKiAic2V0Y3QtQXV0aFJlc1RCRVgiICovCis1MzUsCS8qICJzZXRjdC1BdXRoUmVzVEJTIiAqLworNTM2LAkvKiAic2V0Y3QtQXV0aFJlc1RCU1giICovCis1MjgsCS8qICJzZXRjdC1BdXRoUmV2UmVxQmFnZ2FnZSIgKi8KKzU3NywJLyogInNldGN0LUF1dGhSZXZSZXFUQkUiICovCis1NDEsCS8qICJzZXRjdC1BdXRoUmV2UmVxVEJTIiAqLworNTI5LAkvKiAic2V0Y3QtQXV0aFJldlJlc0JhZ2dhZ2UiICovCis1NDIsCS8qICJzZXRjdC1BdXRoUmV2UmVzRGF0YSIgKi8KKzU3OCwJLyogInNldGN0LUF1dGhSZXZSZXNUQkUiICovCis1NzksCS8qICJzZXRjdC1BdXRoUmV2UmVzVEJFQiIgKi8KKzU0MywJLyogInNldGN0LUF1dGhSZXZSZXNUQlMiICovCis1NzMsCS8qICJzZXRjdC1BdXRoVG9rZW5UQkUiICovCis1MzcsCS8qICJzZXRjdC1BdXRoVG9rZW5UQlMiICovCis2MDAsCS8qICJzZXRjdC1CQ0lEaXN0cmlidXRpb25UQlMiICovCis1NTgsCS8qICJzZXRjdC1CYXRjaEFkbWluUmVxRGF0YSIgKi8KKzU5MiwJLyogInNldGN0LUJhdGNoQWRtaW5SZXFUQkUiICovCis1NTksCS8qICJzZXRjdC1CYXRjaEFkbWluUmVzRGF0YSIgKi8KKzU5MywJLyogInNldGN0LUJhdGNoQWRtaW5SZXNUQkUiICovCis1OTksCS8qICJzZXRjdC1DUkxOb3RpZmljYXRpb25SZXNUQlMiICovCis1OTgsCS8qICJzZXRjdC1DUkxOb3RpZmljYXRpb25UQlMiICovCis1ODAsCS8qICJzZXRjdC1DYXBSZXFUQkUiICovCis1ODEsCS8qICJzZXRjdC1DYXBSZXFUQkVYIiAqLworNTQ0LAkvKiAic2V0Y3QtQ2FwUmVxVEJTIiAqLworNTQ1LAkvKiAic2V0Y3QtQ2FwUmVxVEJTWCIgKi8KKzU0NiwJLyogInNldGN0LUNhcFJlc0RhdGEiICovCis1ODIsCS8qICJzZXRjdC1DYXBSZXNUQkUiICovCis1ODMsCS8qICJzZXRjdC1DYXBSZXZSZXFUQkUiICovCis1ODQsCS8qICJzZXRjdC1DYXBSZXZSZXFUQkVYIiAqLworNTQ3LAkvKiAic2V0Y3QtQ2FwUmV2UmVxVEJTIiAqLworNTQ4LAkvKiAic2V0Y3QtQ2FwUmV2UmVxVEJTWCIgKi8KKzU0OSwJLyogInNldGN0LUNhcFJldlJlc0RhdGEiICovCis1ODUsCS8qICJzZXRjdC1DYXBSZXZSZXNUQkUiICovCis1MzgsCS8qICJzZXRjdC1DYXBUb2tlbkRhdGEiICovCis1MzAsCS8qICJzZXRjdC1DYXBUb2tlblNlcSIgKi8KKzU3NCwJLyogInNldGN0LUNhcFRva2VuVEJFIiAqLworNTc1LAkvKiAic2V0Y3QtQ2FwVG9rZW5UQkVYIiAqLworNTM5LAkvKiAic2V0Y3QtQ2FwVG9rZW5UQlMiICovCis1NjAsCS8qICJzZXRjdC1DYXJkQ0luaXRSZXNUQlMiICovCis1NjYsCS8qICJzZXRjdC1DZXJ0SW5xUmVxVEJTIiAqLworNTYzLAkvKiAic2V0Y3QtQ2VydFJlcURhdGEiICovCis1OTUsCS8qICJzZXRjdC1DZXJ0UmVxVEJFIiAqLworNTk2LAkvKiAic2V0Y3QtQ2VydFJlcVRCRVgiICovCis1NjQsCS8qICJzZXRjdC1DZXJ0UmVxVEJTIiAqLworNTY1LAkvKiAic2V0Y3QtQ2VydFJlc0RhdGEiICovCis1OTcsCS8qICJzZXRjdC1DZXJ0UmVzVEJFIiAqLworNTg2LAkvKiAic2V0Y3QtQ3JlZFJlcVRCRSIgKi8KKzU4NywJLyogInNldGN0LUNyZWRSZXFUQkVYIiAqLworNTUwLAkvKiAic2V0Y3QtQ3JlZFJlcVRCUyIgKi8KKzU1MSwJLyogInNldGN0LUNyZWRSZXFUQlNYIiAqLworNTUyLAkvKiAic2V0Y3QtQ3JlZFJlc0RhdGEiICovCis1ODgsCS8qICJzZXRjdC1DcmVkUmVzVEJFIiAqLworNTg5LAkvKiAic2V0Y3QtQ3JlZFJldlJlcVRCRSIgKi8KKzU5MCwJLyogInNldGN0LUNyZWRSZXZSZXFUQkVYIiAqLworNTUzLAkvKiAic2V0Y3QtQ3JlZFJldlJlcVRCUyIgKi8KKzU1NCwJLyogInNldGN0LUNyZWRSZXZSZXFUQlNYIiAqLworNTU1LAkvKiAic2V0Y3QtQ3JlZFJldlJlc0RhdGEiICovCis1OTEsCS8qICJzZXRjdC1DcmVkUmV2UmVzVEJFIiAqLworNTY3LAkvKiAic2V0Y3QtRXJyb3JUQlMiICovCis1MjYsCS8qICJzZXRjdC1IT0RJbnB1dCIgKi8KKzU2MSwJLyogInNldGN0LU1lQXFDSW5pdFJlc1RCUyIgKi8KKzUyMiwJLyogInNldGN0LU9JRGF0YSIgKi8KKzUxOSwJLyogInNldGN0LVBBTkRhdGEiICovCis1MjEsCS8qICJzZXRjdC1QQU5Pbmx5IiAqLworNTIwLAkvKiAic2V0Y3QtUEFOVG9rZW4iICovCis1NTYsCS8qICJzZXRjdC1QQ2VydFJlcURhdGEiICovCis1NTcsCS8qICJzZXRjdC1QQ2VydFJlc1RCUyIgKi8KKzUyMywJLyogInNldGN0LVBJIiAqLworNTMyLAkvKiAic2V0Y3QtUEktVEJTIiAqLworNTI0LAkvKiAic2V0Y3QtUElEYXRhIiAqLworNTI1LAkvKiAic2V0Y3QtUElEYXRhVW5zaWduZWQiICovCis1NjgsCS8qICJzZXRjdC1QSUR1YWxTaWduZWRUQkUiICovCis1NjksCS8qICJzZXRjdC1QSVVuc2lnbmVkVEJFIiAqLworNTMxLAkvKiAic2V0Y3QtUEluaXRSZXNEYXRhIiAqLworNTMzLAkvKiAic2V0Y3QtUFJlc0RhdGEiICovCis1OTQsCS8qICJzZXRjdC1SZWdGb3JtUmVxVEJFIiAqLworNTYyLAkvKiAic2V0Y3QtUmVnRm9ybVJlc1RCUyIgKi8KKzYwNiwJLyogInNldGV4dC1jdiIgKi8KKzYwMSwJLyogInNldGV4dC1nZW5DcnlwdCIgKi8KKzYwMiwJLyogInNldGV4dC1taUF1dGgiICovCis2MDQsCS8qICJzZXRleHQtcGluQW55IiAqLworNjAzLAkvKiAic2V0ZXh0LXBpblNlY3VyZSIgKi8KKzYwNSwJLyogInNldGV4dC10cmFjazIiICovCis1MiwJLyogInNpZ25pbmdUaW1lIiAqLworNDU0LAkvKiAic2ltcGxlU2VjdXJpdHlPYmplY3QiICovCis0OTYsCS8qICJzaW5nbGVMZXZlbFF1YWxpdHkiICovCiszODcsCS8qICJzbm1wdjIiICovCis2NjAsCS8qICJzdHJlZXQiICovCis4NSwJLyogInN1YmplY3RBbHROYW1lIiAqLworNzY5LAkvKiAic3ViamVjdERpcmVjdG9yeUF0dHJpYnV0ZXMiICovCiszOTgsCS8qICJzdWJqZWN0SW5mb0FjY2VzcyIgKi8KKzgyLAkvKiAic3ViamVjdEtleUlkZW50aWZpZXIiICovCis0OTgsCS8qICJzdWJ0cmVlTWF4aW11bVF1YWxpdHkiICovCis0OTcsCS8qICJzdWJ0cmVlTWluaW11bVF1YWxpdHkiICovCis4OTAsCS8qICJzdXBwb3J0ZWRBbGdvcml0aG1zIiAqLworODc0LAkvKiAic3VwcG9ydGVkQXBwbGljYXRpb25Db250ZXh0IiAqLworNDAyLAkvKiAidGFyZ2V0SW5mb3JtYXRpb24iICovCis4NjQsCS8qICJ0ZWxlcGhvbmVOdW1iZXIiICovCis4NjYsCS8qICJ0ZWxldGV4VGVybWluYWxJZGVudGlmaWVyIiAqLworODY1LAkvKiAidGVsZXhOdW1iZXIiICovCis0NTksCS8qICJ0ZXh0RW5jb2RlZE9SQWRkcmVzcyIgKi8KKzI5MywJLyogInRleHROb3RpY2UiICovCisxMzMsCS8qICJ0aW1lU3RhbXBpbmciICovCisxMDYsCS8qICJ0aXRsZSIgKi8KKzY4MiwJLyogInRwQmFzaXMiICovCiszNzUsCS8qICJ0cnVzdFJvb3QiICovCis0MzYsCS8qICJ1Y2wiICovCis4ODgsCS8qICJ1bmlxdWVNZW1iZXIiICovCis1NSwJLyogInVuc3RydWN0dXJlZEFkZHJlc3MiICovCis0OSwJLyogInVuc3RydWN0dXJlZE5hbWUiICovCis4ODAsCS8qICJ1c2VyQ2VydGlmaWNhdGUiICovCis0NjUsCS8qICJ1c2VyQ2xhc3MiICovCis4NzksCS8qICJ1c2VyUGFzc3dvcmQiICovCiszNzMsCS8qICJ2YWxpZCIgKi8KKzY3OCwJLyogIndhcCIgKi8KKzY3OSwJLyogIndhcC13c2ciICovCis3MzUsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxIiAqLworNzQzLAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzMTAiICovCis3NDQsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMSIgKi8KKzc0NSwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczEyIiAqLworNzM2LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzMyIgKi8KKzczNywJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczQiICovCis3MzgsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM1IiAqLworNzM5LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzNiIgKi8KKzc0MCwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczciICovCis3NDEsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM4IiAqLworNzQyLAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzOSIgKi8KKzgwNCwJLyogIndoaXJscG9vbCIgKi8KKzg2OCwJLyogIngxMjFBZGRyZXNzIiAqLworNTAzLAkvKiAieDUwMFVuaXF1ZUlkZW50aWZpZXIiICovCisxNTgsCS8qICJ4NTA5Q2VydGlmaWNhdGUiICovCisxNjAsCS8qICJ4NTA5Q3JsIiAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsbl9vYmpzW05VTV9MTl09eworMzYzLAkvKiAiQUQgVGltZSBTdGFtcGluZyIgKi8KKzQwNSwJLyogIkFOU0kgWDkuNjIiICovCiszNjgsCS8qICJBY2NlcHRhYmxlIE9DU1AgUmVzcG9uc2VzIiAqLworNjY0LAkvKiAiQW55IGxhbmd1YWdlIiAqLworMTc3LAkvKiAiQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzcyIgKi8KKzM2NSwJLyogIkJhc2ljIE9DU1AgUmVzcG9uc2UiICovCisyODUsCS8qICJCaW9tZXRyaWMgSW5mbyIgKi8KKzE3OSwJLyogIkNBIElzc3VlcnMiICovCis3ODUsCS8qICJDQSBSZXBvc2l0b3J5IiAqLworMTMxLAkvKiAiQ29kZSBTaWduaW5nIiAqLworNzgzLAkvKiAiRGlmZmllLUhlbGxtYW4gYmFzZWQgTUFDIiAqLworMzgyLAkvKiAiRGlyZWN0b3J5IiAqLworMzkyLAkvKiAiRG9tYWluIiAqLworMTMyLAkvKiAiRS1tYWlsIFByb3RlY3Rpb24iICovCiszODksCS8qICJFbnRlcnByaXNlcyIgKi8KKzM4NCwJLyogIkV4cGVyaW1lbnRhbCIgKi8KKzM3MiwJLyogIkV4dGVuZGVkIE9DU1AgU3RhdHVzIiAqLworMTcyLAkvKiAiRXh0ZW5zaW9uIFJlcXVlc3QiICovCis4MTMsCS8qICJHT1NUIDI4MTQ3LTg5IiAqLworODQ5LAkvKiAiR09TVCAyODE0Ny04OSBDcnlwdG9jb20gUGFyYW1TZXQiICovCis4MTUsCS8qICJHT1NUIDI4MTQ3LTg5IE1BQyIgKi8KKzg1MSwJLyogIkdPU1QgMzQuMTAtMjAwMSBDcnlwdG9jb20iICovCis4NTAsCS8qICJHT1NUIDM0LjEwLTk0IENyeXB0b2NvbSIgKi8KKzgxMSwJLyogIkdPU1QgUiAzNC4xMC0yMDAxIiAqLworODE3LAkvKiAiR09TVCBSIDM0LjEwLTIwMDEgREgiICovCis4MTIsCS8qICJHT1NUIFIgMzQuMTAtOTQiICovCis4MTgsCS8qICJHT1NUIFIgMzQuMTAtOTQgREgiICovCis4MDksCS8qICJHT1NUIFIgMzQuMTEtOTQiICovCis4MTYsCS8qICJHT1NUIFIgMzQuMTEtOTQgUFJGIiAqLworODA3LAkvKiAiR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTIwMDEiICovCis4NTMsCS8qICJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMSBDcnlwdG9jb20iICovCis4MDgsCS8qICJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtOTQiICovCis4NTIsCS8qICJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtOTQgQ3J5cHRvY29tIiAqLworODU0LAkvKiAiR09TVCBSIDM0MTAtMjAwMSBQYXJhbWV0ZXIgU2V0IENyeXB0b2NvbSIgKi8KKzgxMCwJLyogIkhNQUMgR09TVCAzNC4xMS05NCIgKi8KKzQzMiwJLyogIkhvbGQgSW5zdHJ1Y3Rpb24gQ2FsbCBJc3N1ZXIiICovCis0MzAsCS8qICJIb2xkIEluc3RydWN0aW9uIENvZGUiICovCis0MzEsCS8qICJIb2xkIEluc3RydWN0aW9uIE5vbmUiICovCis0MzMsCS8qICJIb2xkIEluc3RydWN0aW9uIFJlamVjdCIgKi8KKzYzNCwJLyogIklDQyBvciB0b2tlbiBzaWduYXR1cmUiICovCisyOTQsCS8qICJJUFNlYyBFbmQgU3lzdGVtIiAqLworMjk1LAkvKiAiSVBTZWMgVHVubmVsIiAqLworMjk2LAkvKiAiSVBTZWMgVXNlciIgKi8KKzE4MiwJLyogIklTTyBNZW1iZXIgQm9keSIgKi8KKzE4MywJLyogIklTTyBVUyBNZW1iZXIgQm9keSIgKi8KKzY2NywJLyogIkluZGVwZW5kZW50IiAqLworNjY1LAkvKiAiSW5oZXJpdCBhbGwiICovCis2NDcsCS8qICJJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbnMiICovCisxNDIsCS8qICJJbnZhbGlkaXR5IERhdGUiICovCis1MDQsCS8qICJNSU1FIE1IUyIgKi8KKzM4OCwJLyogIk1haWwiICovCiszODMsCS8qICJNYW5hZ2VtZW50IiAqLworNDE3LAkvKiAiTWljcm9zb2Z0IENTUCBOYW1lIiAqLworMTM1LAkvKiAiTWljcm9zb2Z0IENvbW1lcmNpYWwgQ29kZSBTaWduaW5nIiAqLworMTM4LAkvKiAiTWljcm9zb2Z0IEVuY3J5cHRlZCBGaWxlIFN5c3RlbSIgKi8KKzE3MSwJLyogIk1pY3Jvc29mdCBFeHRlbnNpb24gUmVxdWVzdCIgKi8KKzEzNCwJLyogIk1pY3Jvc29mdCBJbmRpdmlkdWFsIENvZGUgU2lnbmluZyIgKi8KKzg1NiwJLyogIk1pY3Jvc29mdCBMb2NhbCBLZXkgc2V0IiAqLworMTM3LAkvKiAiTWljcm9zb2Z0IFNlcnZlciBHYXRlZCBDcnlwdG8iICovCis2NDgsCS8qICJNaWNyb3NvZnQgU21hcnRjYXJkbG9naW4iICovCisxMzYsCS8qICJNaWNyb3NvZnQgVHJ1c3QgTGlzdCBTaWduaW5nIiAqLworNjQ5LAkvKiAiTWljcm9zb2Z0IFVuaXZlcnNhbCBQcmluY2lwYWwgTmFtZSIgKi8KKzM5MywJLyogIk5VTEwiICovCis0MDQsCS8qICJOVUxMIiAqLworNzIsCS8qICJOZXRzY2FwZSBCYXNlIFVybCIgKi8KKzc2LAkvKiAiTmV0c2NhcGUgQ0EgUG9saWN5IFVybCIgKi8KKzc0LAkvKiAiTmV0c2NhcGUgQ0EgUmV2b2NhdGlvbiBVcmwiICovCis3MSwJLyogIk5ldHNjYXBlIENlcnQgVHlwZSIgKi8KKzU4LAkvKiAiTmV0c2NhcGUgQ2VydGlmaWNhdGUgRXh0ZW5zaW9uIiAqLworNzksCS8qICJOZXRzY2FwZSBDZXJ0aWZpY2F0ZSBTZXF1ZW5jZSIgKi8KKzc4LAkvKiAiTmV0c2NhcGUgQ29tbWVudCIgKi8KKzU3LAkvKiAiTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycC4iICovCis1OSwJLyogIk5ldHNjYXBlIERhdGEgVHlwZSIgKi8KKzc1LAkvKiAiTmV0c2NhcGUgUmVuZXdhbCBVcmwiICovCis3MywJLyogIk5ldHNjYXBlIFJldm9jYXRpb24gVXJsIiAqLworNzcsCS8qICJOZXRzY2FwZSBTU0wgU2VydmVyIE5hbWUiICovCisxMzksCS8qICJOZXRzY2FwZSBTZXJ2ZXIgR2F0ZWQgQ3J5cHRvIiAqLworMTc4LAkvKiAiT0NTUCIgKi8KKzM3MCwJLyogIk9DU1AgQXJjaGl2ZSBDdXRvZmYiICovCiszNjcsCS8qICJPQ1NQIENSTCBJRCIgKi8KKzM2OSwJLyogIk9DU1AgTm8gQ2hlY2siICovCiszNjYsCS8qICJPQ1NQIE5vbmNlIiAqLworMzcxLAkvKiAiT0NTUCBTZXJ2aWNlIExvY2F0b3IiICovCisxODAsCS8qICJPQ1NQIFNpZ25pbmciICovCisxNjEsCS8qICJQQkVTMiIgKi8KKzY5LAkvKiAiUEJLREYyIiAqLworMTYyLAkvKiAiUEJNQUMxIiAqLworMTI3LAkvKiAiUEtJWCIgKi8KKzg1OCwJLyogIlBlcm1hbmVudCBJZGVudGlmaWVyIiAqLworMTY0LAkvKiAiUG9saWN5IFF1YWxpZmllciBDUFMiICovCisxNjUsCS8qICJQb2xpY3kgUXVhbGlmaWVyIFVzZXIgTm90aWNlIiAqLworMzg1LAkvKiAiUHJpdmF0ZSIgKi8KKzY2MywJLyogIlByb3h5IENlcnRpZmljYXRlIEluZm9ybWF0aW9uIiAqLworIDEsCS8qICJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiIgKi8KKyAyLAkvKiAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gUEtDUyIgKi8KKzE4OCwJLyogIlMvTUlNRSIgKi8KKzE2NywJLyogIlMvTUlNRSBDYXBhYmlsaXRpZXMiICovCiszODcsCS8qICJTTk1QdjIiICovCis1MTIsCS8qICJTZWN1cmUgRWxlY3Ryb25pYyBUcmFuc2FjdGlvbnMiICovCiszODYsCS8qICJTZWN1cml0eSIgKi8KKzM5NCwJLyogIlNlbGVjdGVkIEF0dHJpYnV0ZSBUeXBlcyIgKi8KKzE0MywJLyogIlN0cm9uZyBFeHRyYW5ldCBJRCIgKi8KKzM5OCwJLyogIlN1YmplY3QgSW5mb3JtYXRpb24gQWNjZXNzIiAqLworMTMwLAkvKiAiVExTIFdlYiBDbGllbnQgQXV0aGVudGljYXRpb24iICovCisxMjksCS8qICJUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiIgKi8KKzEzMywJLyogIlRpbWUgU3RhbXBpbmciICovCiszNzUsCS8qICJUcnVzdCBSb290IiAqLworMTIsCS8qICJYNTA5IiAqLworNDAyLAkvKiAiWDUwOXYzIEFDIFRhcmdldGluZyIgKi8KKzc0NiwJLyogIlg1MDl2MyBBbnkgUG9saWN5IiAqLworOTAsCS8qICJYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyIiAqLworODcsCS8qICJYNTA5djMgQmFzaWMgQ29uc3RyYWludHMiICovCisxMDMsCS8qICJYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHMiICovCis4OCwJLyogIlg1MDl2MyBDUkwgTnVtYmVyIiAqLworMTQxLAkvKiAiWDUwOXYzIENSTCBSZWFzb24gQ29kZSIgKi8KKzc3MSwJLyogIlg1MDl2MyBDZXJ0aWZpY2F0ZSBJc3N1ZXIiICovCis4OSwJLyogIlg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llcyIgKi8KKzE0MCwJLyogIlg1MDl2MyBEZWx0YSBDUkwgSW5kaWNhdG9yIiAqLworMTI2LAkvKiAiWDUwOXYzIEV4dGVuZGVkIEtleSBVc2FnZSIgKi8KKzg1NywJLyogIlg1MDl2MyBGcmVzaGVzdCBDUkwiICovCis3NDgsCS8qICJYNTA5djMgSW5oaWJpdCBBbnkgUG9saWN5IiAqLworODYsCS8qICJYNTA5djMgSXNzdWVyIEFsdGVybmF0aXZlIE5hbWUiICovCis3NzAsCS8qICJYNTA5djMgSXNzdWluZyBEaXN0cnVidXRpb24gUG9pbnQiICovCis4MywJLyogIlg1MDl2MyBLZXkgVXNhZ2UiICovCis2NjYsCS8qICJYNTA5djMgTmFtZSBDb25zdHJhaW50cyIgKi8KKzQwMywJLyogIlg1MDl2MyBObyBSZXZvY2F0aW9uIEF2YWlsYWJsZSIgKi8KKzQwMSwJLyogIlg1MDl2MyBQb2xpY3kgQ29uc3RyYWludHMiICovCis3NDcsCS8qICJYNTA5djMgUG9saWN5IE1hcHBpbmdzIiAqLworODQsCS8qICJYNTA5djMgUHJpdmF0ZSBLZXkgVXNhZ2UgUGVyaW9kIiAqLworODUsCS8qICJYNTA5djMgU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lIiAqLworNzY5LAkvKiAiWDUwOXYzIFN1YmplY3QgRGlyZWN0b3J5IEF0dHJpYnV0ZXMiICovCis4MiwJLyogIlg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyIiAqLworMTg0LAkvKiAiWDkuNTciICovCisxODUsCS8qICJYOS41NyBDTSA/IiAqLworNDc4LAkvKiAiYVJlY29yZCIgKi8KKzI4OSwJLyogImFhQ29udHJvbHMiICovCisyODcsCS8qICJhYy1hdWRpdEVudGl0eSIgKi8KKzM5NywJLyogImFjLXByb3h5aW5nIiAqLworMjg4LAkvKiAiYWMtdGFyZ2V0aW5nIiAqLworNDQ2LAkvKiAiYWNjb3VudCIgKi8KKzM2NCwJLyogImFkIGR2Y3MiICovCis2MDYsCS8qICJhZGRpdGlvbmFsIHZlcmlmaWNhdGlvbiIgKi8KKzQxOSwJLyogImFlcy0xMjgtY2JjIiAqLworNDIxLAkvKiAiYWVzLTEyOC1jZmIiICovCis2NTAsCS8qICJhZXMtMTI4LWNmYjEiICovCis2NTMsCS8qICJhZXMtMTI4LWNmYjgiICovCis0MTgsCS8qICJhZXMtMTI4LWVjYiIgKi8KKzQyMCwJLyogImFlcy0xMjgtb2ZiIiAqLworNDIzLAkvKiAiYWVzLTE5Mi1jYmMiICovCis0MjUsCS8qICJhZXMtMTkyLWNmYiIgKi8KKzY1MSwJLyogImFlcy0xOTItY2ZiMSIgKi8KKzY1NCwJLyogImFlcy0xOTItY2ZiOCIgKi8KKzQyMiwJLyogImFlcy0xOTItZWNiIiAqLworNDI0LAkvKiAiYWVzLTE5Mi1vZmIiICovCis0MjcsCS8qICJhZXMtMjU2LWNiYyIgKi8KKzQyOSwJLyogImFlcy0yNTYtY2ZiIiAqLworNjUyLAkvKiAiYWVzLTI1Ni1jZmIxIiAqLworNjU1LAkvKiAiYWVzLTI1Ni1jZmI4IiAqLworNDI2LAkvKiAiYWVzLTI1Ni1lY2IiICovCis0MjgsCS8qICJhZXMtMjU2LW9mYiIgKi8KKzM3NiwJLyogImFsZ29yaXRobSIgKi8KKzQ4NCwJLyogImFzc29jaWF0ZWREb21haW4iICovCis0ODUsCS8qICJhc3NvY2lhdGVkTmFtZSIgKi8KKzUwMSwJLyogImF1ZGlvIiAqLworODgyLAkvKiAiYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QiICovCis5MSwJLyogImJmLWNiYyIgKi8KKzkzLAkvKiAiYmYtY2ZiIiAqLworOTIsCS8qICJiZi1lY2IiICovCis5NCwJLyogImJmLW9mYiIgKi8KKzQ5NCwJLyogImJ1aWxkaW5nTmFtZSIgKi8KKzg2MCwJLyogImJ1c2luZXNzQ2F0ZWdvcnkiICovCis2OTEsCS8qICJjMm9uYjE5MXY0IiAqLworNjkyLAkvKiAiYzJvbmIxOTF2NSIgKi8KKzY5NywJLyogImMyb25iMjM5djQiICovCis2OTgsCS8qICJjMm9uYjIzOXY1IiAqLworNjg0LAkvKiAiYzJwbmIxNjN2MSIgKi8KKzY4NSwJLyogImMycG5iMTYzdjIiICovCis2ODYsCS8qICJjMnBuYjE2M3YzIiAqLworNjg3LAkvKiAiYzJwbmIxNzZ2MSIgKi8KKzY5MywJLyogImMycG5iMjA4dzEiICovCis2OTksCS8qICJjMnBuYjI3MncxIiAqLworNzAwLAkvKiAiYzJwbmIzMDR3MSIgKi8KKzcwMiwJLyogImMycG5iMzY4dzEiICovCis2ODgsCS8qICJjMnRuYjE5MXYxIiAqLworNjg5LAkvKiAiYzJ0bmIxOTF2MiIgKi8KKzY5MCwJLyogImMydG5iMTkxdjMiICovCis2OTQsCS8qICJjMnRuYjIzOXYxIiAqLworNjk1LAkvKiAiYzJ0bmIyMzl2MiIgKi8KKzY5NiwJLyogImMydG5iMjM5djMiICovCis3MDEsCS8qICJjMnRuYjM1OXYxIiAqLworNzAzLAkvKiAiYzJ0bmI0MzFyMSIgKi8KKzg4MSwJLyogImNBQ2VydGlmaWNhdGUiICovCis0ODMsCS8qICJjTkFNRVJlY29yZCIgKi8KKzc1MSwJLyogImNhbWVsbGlhLTEyOC1jYmMiICovCis3NTcsCS8qICJjYW1lbGxpYS0xMjgtY2ZiIiAqLworNzYwLAkvKiAiY2FtZWxsaWEtMTI4LWNmYjEiICovCis3NjMsCS8qICJjYW1lbGxpYS0xMjgtY2ZiOCIgKi8KKzc1NCwJLyogImNhbWVsbGlhLTEyOC1lY2IiICovCis3NjYsCS8qICJjYW1lbGxpYS0xMjgtb2ZiIiAqLworNzUyLAkvKiAiY2FtZWxsaWEtMTkyLWNiYyIgKi8KKzc1OCwJLyogImNhbWVsbGlhLTE5Mi1jZmIiICovCis3NjEsCS8qICJjYW1lbGxpYS0xOTItY2ZiMSIgKi8KKzc2NCwJLyogImNhbWVsbGlhLTE5Mi1jZmI4IiAqLworNzU1LAkvKiAiY2FtZWxsaWEtMTkyLWVjYiIgKi8KKzc2NywJLyogImNhbWVsbGlhLTE5Mi1vZmIiICovCis3NTMsCS8qICJjYW1lbGxpYS0yNTYtY2JjIiAqLworNzU5LAkvKiAiY2FtZWxsaWEtMjU2LWNmYiIgKi8KKzc2MiwJLyogImNhbWVsbGlhLTI1Ni1jZmIxIiAqLworNzY1LAkvKiAiY2FtZWxsaWEtMjU2LWNmYjgiICovCis3NTYsCS8qICJjYW1lbGxpYS0yNTYtZWNiIiAqLworNzY4LAkvKiAiY2FtZWxsaWEtMjU2LW9mYiIgKi8KKzQ0MywJLyogImNhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgiICovCisxMDgsCS8qICJjYXN0NS1jYmMiICovCisxMTAsCS8qICJjYXN0NS1jZmIiICovCisxMDksCS8qICJjYXN0NS1lY2IiICovCisxMTEsCS8qICJjYXN0NS1vZmIiICovCisxNTIsCS8qICJjZXJ0QmFnIiAqLworNjc3LAkvKiAiY2VydGljb20tYXJjIiAqLworNTE3LAkvKiAiY2VydGlmaWNhdGUgZXh0ZW5zaW9ucyIgKi8KKzg4MywJLyogImNlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QiICovCis1NCwJLyogImNoYWxsZW5nZVBhc3N3b3JkIiAqLworNDA3LAkvKiAiY2hhcmFjdGVyaXN0aWMtdHdvLWZpZWxkIiAqLworMzk1LAkvKiAiY2xlYXJhbmNlIiAqLworNjMzLAkvKiAiY2xlYXJ0ZXh0IHRyYWNrIDIiICovCisxMywJLyogImNvbW1vbk5hbWUiICovCis1MTMsCS8qICJjb250ZW50IHR5cGVzIiAqLworNTAsCS8qICJjb250ZW50VHlwZSIgKi8KKzUzLAkvKiAiY291bnRlcnNpZ25hdHVyZSIgKi8KKzE0LAkvKiAiY291bnRyeU5hbWUiICovCisxNTMsCS8qICJjcmxCYWciICovCis4ODQsCS8qICJjcm9zc0NlcnRpZmljYXRlUGFpciIgKi8KKzgwNiwJLyogImNyeXB0b2NvbSIgKi8KKzgwNSwJLyogImNyeXB0b3BybyIgKi8KKzUwMCwJLyogImRJVFJlZGlyZWN0IiAqLworNDUxLAkvKiAiZE5TRG9tYWluIiAqLworNDk1LAkvKiAiZFNBUXVhbGl0eSIgKi8KKzQzNCwJLyogImRhdGEiICovCiszOTAsCS8qICJkY09iamVjdCIgKi8KKzg5MSwJLyogImRlbHRhUmV2b2NhdGlvbkxpc3QiICovCiszMSwJLyogImRlcy1jYmMiICovCis2NDMsCS8qICJkZXMtY2RtZiIgKi8KKzMwLAkvKiAiZGVzLWNmYiIgKi8KKzY1NiwJLyogImRlcy1jZmIxIiAqLworNjU3LAkvKiAiZGVzLWNmYjgiICovCisyOSwJLyogImRlcy1lY2IiICovCiszMiwJLyogImRlcy1lZGUiICovCis0MywJLyogImRlcy1lZGUtY2JjIiAqLworNjAsCS8qICJkZXMtZWRlLWNmYiIgKi8KKzYyLAkvKiAiZGVzLWVkZS1vZmIiICovCiszMywJLyogImRlcy1lZGUzIiAqLworNDQsCS8qICJkZXMtZWRlMy1jYmMiICovCis2MSwJLyogImRlcy1lZGUzLWNmYiIgKi8KKzY1OCwJLyogImRlcy1lZGUzLWNmYjEiICovCis2NTksCS8qICJkZXMtZWRlMy1jZmI4IiAqLworNjMsCS8qICJkZXMtZWRlMy1vZmIiICovCis0NSwJLyogImRlcy1vZmIiICovCisxMDcsCS8qICJkZXNjcmlwdGlvbiIgKi8KKzg3MSwJLyogImRlc3RpbmF0aW9uSW5kaWNhdG9yIiAqLworODAsCS8qICJkZXN4LWNiYyIgKi8KKzI4LAkvKiAiZGhLZXlBZ3JlZW1lbnQiICovCisxMSwJLyogImRpcmVjdG9yeSBzZXJ2aWNlcyAoWC41MDApIiAqLworMzc4LAkvKiAiZGlyZWN0b3J5IHNlcnZpY2VzIC0gYWxnb3JpdGhtcyIgKi8KKzg4NywJLyogImRpc3Rpbmd1aXNoZWROYW1lIiAqLworODkyLAkvKiAiZG1kTmFtZSIgKi8KKzE3NCwJLyogImRuUXVhbGlmaWVyIiAqLworNDQ3LAkvKiAiZG9jdW1lbnQiICovCis0NzEsCS8qICJkb2N1bWVudEF1dGhvciIgKi8KKzQ2OCwJLyogImRvY3VtZW50SWRlbnRpZmllciIgKi8KKzQ3MiwJLyogImRvY3VtZW50TG9jYXRpb24iICovCis1MDIsCS8qICJkb2N1bWVudFB1Ymxpc2hlciIgKi8KKzQ0OSwJLyogImRvY3VtZW50U2VyaWVzIiAqLworNDY5LAkvKiAiZG9jdW1lbnRUaXRsZSIgKi8KKzQ3MCwJLyogImRvY3VtZW50VmVyc2lvbiIgKi8KKzM4MCwJLyogImRvZCIgKi8KKzM5MSwJLyogImRvbWFpbkNvbXBvbmVudCIgKi8KKzQ1MiwJLyogImRvbWFpblJlbGF0ZWRPYmplY3QiICovCisxMTYsCS8qICJkc2FFbmNyeXB0aW9uIiAqLworNjcsCS8qICJkc2FFbmNyeXB0aW9uLW9sZCIgKi8KKzY2LAkvKiAiZHNhV2l0aFNIQSIgKi8KKzExMywJLyogImRzYVdpdGhTSEExIiAqLworNzAsCS8qICJkc2FXaXRoU0hBMS1vbGQiICovCis4MDIsCS8qICJkc2Ffd2l0aF9TSEEyMjQiICovCis4MDMsCS8qICJkc2Ffd2l0aF9TSEEyNTYiICovCisyOTcsCS8qICJkdmNzIiAqLworNzkxLAkvKiAiZWNkc2Etd2l0aC1SZWNvbW1lbmRlZCIgKi8KKzQxNiwJLyogImVjZHNhLXdpdGgtU0hBMSIgKi8KKzc5MywJLyogImVjZHNhLXdpdGgtU0hBMjI0IiAqLworNzk0LAkvKiAiZWNkc2Etd2l0aC1TSEEyNTYiICovCis3OTUsCS8qICJlY2RzYS13aXRoLVNIQTM4NCIgKi8KKzc5NiwJLyogImVjZHNhLXdpdGgtU0hBNTEyIiAqLworNzkyLAkvKiAiZWNkc2Etd2l0aC1TcGVjaWZpZWQiICovCis0OCwJLyogImVtYWlsQWRkcmVzcyIgKi8KKzYzMiwJLyogImVuY3J5cHRlZCB0cmFjayAyIiAqLworODg1LAkvKiAiZW5oYW5jZWRTZWFyY2hHdWlkZSIgKi8KKzU2LAkvKiAiZXh0ZW5kZWRDZXJ0aWZpY2F0ZUF0dHJpYnV0ZXMiICovCis4NjcsCS8qICJmYWNzaW1pbGVUZWxlcGhvbmVOdW1iZXIiICovCis0NjIsCS8qICJmYXZvdXJpdGVEcmluayIgKi8KKzQ1MywJLyogImZyaWVuZGx5Q291bnRyeSIgKi8KKzQ5MCwJLyogImZyaWVuZGx5Q291bnRyeU5hbWUiICovCisxNTYsCS8qICJmcmllbmRseU5hbWUiICovCis2MzEsCS8qICJnZW5lcmF0ZSBjcnlwdG9ncmFtIiAqLworNTA5LAkvKiAiZ2VuZXJhdGlvblF1YWxpZmllciIgKi8KKzYwMSwJLyogImdlbmVyaWMgY3J5cHRvZ3JhbSIgKi8KKzk5LAkvKiAiZ2l2ZW5OYW1lIiAqLworODE0LAkvKiAiZ29zdDg5LWNudCIgKi8KKzg1NSwJLyogImhtYWMiICovCis3ODAsCS8qICJobWFjLW1kNSIgKi8KKzc4MSwJLyogImhtYWMtc2hhMSIgKi8KKzc5NywJLyogImhtYWNXaXRoTUQ1IiAqLworMTYzLAkvKiAiaG1hY1dpdGhTSEExIiAqLworNzk4LAkvKiAiaG1hY1dpdGhTSEEyMjQiICovCis3OTksCS8qICJobWFjV2l0aFNIQTI1NiIgKi8KKzgwMCwJLyogImhtYWNXaXRoU0hBMzg0IiAqLworODAxLAkvKiAiaG1hY1dpdGhTSEE1MTIiICovCis0ODYsCS8qICJob21lUG9zdGFsQWRkcmVzcyIgKi8KKzQ3MywJLyogImhvbWVUZWxlcGhvbmVOdW1iZXIiICovCis0NjYsCS8qICJob3N0IiAqLworODg5LAkvKiAiaG91c2VJZGVudGlmaWVyIiAqLworNDQyLAkvKiAiaUE1U3RyaW5nU3ludGF4IiAqLworMzgxLAkvKiAiaWFuYSIgKi8KKzgyNCwJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQS1QYXJhbVNldCIgKi8KKzgyNSwJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIgKi8KKzgyNiwJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIgKi8KKzgyNywJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tRC1QYXJhbVNldCIgKi8KKzgxOSwJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tS2V5TWVzaGluZyIgKi8KKzgyOSwJLyogImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0wLVBhcmFtU2V0IiAqLworODI4LAkvKiAiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTEtUGFyYW1TZXQiICovCis4MzAsCS8qICJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLVJJQy0xLVBhcmFtU2V0IiAqLworODIwLAkvKiAiaWQtR29zdDI4MTQ3LTg5LU5vbmUtS2V5TWVzaGluZyIgKi8KKzgyMywJLyogImlkLUdvc3QyODE0Ny04OS1UZXN0UGFyYW1TZXQiICovCis4NDAsCS8qICJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQS1QYXJhbVNldCIgKi8KKzg0MSwJLyogImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1CLVBhcmFtU2V0IiAqLworODQyLAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUMtUGFyYW1TZXQiICovCis4NDMsCS8qICJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tWGNoQS1QYXJhbVNldCIgKi8KKzg0NCwJLyogImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hCLVBhcmFtU2V0IiAqLworODM5LAkvKiAiaWQtR29zdFIzNDEwLTIwMDEtVGVzdFBhcmFtU2V0IiAqLworODMyLAkvKiAiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1BLVBhcmFtU2V0IiAqLworODMzLAkvKiAiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1CLVBhcmFtU2V0IiAqLworODM0LAkvKiAiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1DLVBhcmFtU2V0IiAqLworODM1LAkvKiAiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1ELVBhcmFtU2V0IiAqLworODM2LAkvKiAiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1YY2hBLVBhcmFtU2V0IiAqLworODM3LAkvKiAiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1YY2hCLVBhcmFtU2V0IiAqLworODM4LAkvKiAiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1YY2hDLVBhcmFtU2V0IiAqLworODMxLAkvKiAiaWQtR29zdFIzNDEwLTk0LVRlc3RQYXJhbVNldCIgKi8KKzg0NSwJLyogImlkLUdvc3RSMzQxMC05NC1hIiAqLworODQ2LAkvKiAiaWQtR29zdFIzNDEwLTk0LWFCaXMiICovCis4NDcsCS8qICJpZC1Hb3N0UjM0MTAtOTQtYiIgKi8KKzg0OCwJLyogImlkLUdvc3RSMzQxMC05NC1iQmlzIiAqLworODIyLAkvKiAiaWQtR29zdFIzNDExLTk0LUNyeXB0b1Byb1BhcmFtU2V0IiAqLworODIxLAkvKiAiaWQtR29zdFIzNDExLTk0LVRlc3RQYXJhbVNldCIgKi8KKzI2NiwJLyogImlkLWFjYSIgKi8KKzM1NSwJLyogImlkLWFjYS1hY2Nlc3NJZGVudGl0eSIgKi8KKzM1NCwJLyogImlkLWFjYS1hdXRoZW50aWNhdGlvbkluZm8iICovCiszNTYsCS8qICJpZC1hY2EtY2hhcmdpbmdJZGVudGl0eSIgKi8KKzM5OSwJLyogImlkLWFjYS1lbmNBdHRycyIgKi8KKzM1NywJLyogImlkLWFjYS1ncm91cCIgKi8KKzM1OCwJLyogImlkLWFjYS1yb2xlIiAqLworMTc2LAkvKiAiaWQtYWQiICovCis3ODgsCS8qICJpZC1hZXMxMjgtd3JhcCIgKi8KKzc4OSwJLyogImlkLWFlczE5Mi13cmFwIiAqLworNzkwLAkvKiAiaWQtYWVzMjU2LXdyYXAiICovCisyNjIsCS8qICJpZC1hbGciICovCiszMjMsCS8qICJpZC1hbGctZGVzNDAiICovCiszMjYsCS8qICJpZC1hbGctZGgtcG9wIiAqLworMzI1LAkvKiAiaWQtYWxnLWRoLXNpZy1obWFjLXNoYTEiICovCiszMjQsCS8qICJpZC1hbGctbm9TaWduYXR1cmUiICovCisyNjgsCS8qICJpZC1jY3QiICovCiszNjEsCS8qICJpZC1jY3QtUEtJRGF0YSIgKi8KKzM2MiwJLyogImlkLWNjdC1QS0lSZXNwb25zZSIgKi8KKzM2MCwJLyogImlkLWNjdC1jcnMiICovCis4MSwJLyogImlkLWNlIiAqLworNjgwLAkvKiAiaWQtY2hhcmFjdGVyaXN0aWMtdHdvLWJhc2lzIiAqLworMjYzLAkvKiAiaWQtY21jIiAqLworMzM0LAkvKiAiaWQtY21jLWFkZEV4dGVuc2lvbnMiICovCiszNDYsCS8qICJpZC1jbWMtY29uZmlybUNlcnRBY2NlcHRhbmNlIiAqLworMzMwLAkvKiAiaWQtY21jLWRhdGFSZXR1cm4iICovCiszMzYsCS8qICJpZC1jbWMtZGVjcnlwdGVkUE9QIiAqLworMzM1LAkvKiAiaWQtY21jLWVuY3J5cHRlZFBPUCIgKi8KKzMzOSwJLyogImlkLWNtYy1nZXRDUkwiICovCiszMzgsCS8qICJpZC1jbWMtZ2V0Q2VydCIgKi8KKzMyOCwJLyogImlkLWNtYy1pZGVudGlmaWNhdGlvbiIgKi8KKzMyOSwJLyogImlkLWNtYy1pZGVudGl0eVByb29mIiAqLworMzM3LAkvKiAiaWQtY21jLWxyYVBPUFdpdG5lc3MiICovCiszNDQsCS8qICJpZC1jbWMtcG9wTGlua1JhbmRvbSIgKi8KKzM0NSwJLyogImlkLWNtYy1wb3BMaW5rV2l0bmVzcyIgKi8KKzM0MywJLyogImlkLWNtYy1xdWVyeVBlbmRpbmciICovCiszMzMsCS8qICJpZC1jbWMtcmVjaXBpZW50Tm9uY2UiICovCiszNDEsCS8qICJpZC1jbWMtcmVnSW5mbyIgKi8KKzM0MiwJLyogImlkLWNtYy1yZXNwb25zZUluZm8iICovCiszNDAsCS8qICJpZC1jbWMtcmV2b2tlUmVxdWVzdCIgKi8KKzMzMiwJLyogImlkLWNtYy1zZW5kZXJOb25jZSIgKi8KKzMyNywJLyogImlkLWNtYy1zdGF0dXNJbmZvIiAqLworMzMxLAkvKiAiaWQtY21jLXRyYW5zYWN0aW9uSWQiICovCis3ODcsCS8qICJpZC1jdC1hc2NpaVRleHRXaXRoQ1JMRiIgKi8KKzQwOCwJLyogImlkLWVjUHVibGljS2V5IiAqLworNTA4LAkvKiAiaWQtaGV4LW11bHRpcGFydC1tZXNzYWdlIiAqLworNTA3LAkvKiAiaWQtaGV4LXBhcnRpYWwtbWVzc2FnZSIgKi8KKzI2MCwJLyogImlkLWl0IiAqLworMzAyLAkvKiAiaWQtaXQtY2FLZXlVcGRhdGVJbmZvIiAqLworMjk4LAkvKiAiaWQtaXQtY2FQcm90RW5jQ2VydCIgKi8KKzMxMSwJLyogImlkLWl0LWNvbmZpcm1XYWl0VGltZSIgKi8KKzMwMywJLyogImlkLWl0LWN1cnJlbnRDUkwiICovCiszMDAsCS8qICJpZC1pdC1lbmNLZXlQYWlyVHlwZXMiICovCiszMTAsCS8qICJpZC1pdC1pbXBsaWNpdENvbmZpcm0iICovCiszMDgsCS8qICJpZC1pdC1rZXlQYWlyUGFyYW1SZXAiICovCiszMDcsCS8qICJpZC1pdC1rZXlQYWlyUGFyYW1SZXEiICovCiszMTIsCS8qICJpZC1pdC1vcmlnUEtJTWVzc2FnZSIgKi8KKzMwMSwJLyogImlkLWl0LXByZWZlcnJlZFN5bW1BbGciICovCiszMDksCS8qICJpZC1pdC1yZXZQYXNzcGhyYXNlIiAqLworMjk5LAkvKiAiaWQtaXQtc2lnbktleVBhaXJUeXBlcyIgKi8KKzMwNSwJLyogImlkLWl0LXN1YnNjcmlwdGlvblJlcXVlc3QiICovCiszMDYsCS8qICJpZC1pdC1zdWJzY3JpcHRpb25SZXNwb25zZSIgKi8KKzc4NCwJLyogImlkLWl0LXN1cHBMYW5nVGFncyIgKi8KKzMwNCwJLyogImlkLWl0LXVuc3VwcG9ydGVkT0lEcyIgKi8KKzEyOCwJLyogImlkLWtwIiAqLworMjgwLAkvKiAiaWQtbW9kLWF0dHJpYnV0ZS1jZXJ0IiAqLworMjc0LAkvKiAiaWQtbW9kLWNtYyIgKi8KKzI3NywJLyogImlkLW1vZC1jbXAiICovCisyODQsCS8qICJpZC1tb2QtY21wMjAwMCIgKi8KKzI3MywJLyogImlkLW1vZC1jcm1mIiAqLworMjgzLAkvKiAiaWQtbW9kLWR2Y3MiICovCisyNzUsCS8qICJpZC1tb2Qta2VhLXByb2ZpbGUtODgiICovCisyNzYsCS8qICJpZC1tb2Qta2VhLXByb2ZpbGUtOTMiICovCisyODIsCS8qICJpZC1tb2Qtb2NzcCIgKi8KKzI3OCwJLyogImlkLW1vZC1xdWFsaWZpZWQtY2VydC04OCIgKi8KKzI3OSwJLyogImlkLW1vZC1xdWFsaWZpZWQtY2VydC05MyIgKi8KKzI4MSwJLyogImlkLW1vZC10aW1lc3RhbXAtcHJvdG9jb2wiICovCisyNjQsCS8qICJpZC1vbiIgKi8KKzM0NywJLyogImlkLW9uLXBlcnNvbmFsRGF0YSIgKi8KKzI2NSwJLyogImlkLXBkYSIgKi8KKzM1MiwJLyogImlkLXBkYS1jb3VudHJ5T2ZDaXRpemVuc2hpcCIgKi8KKzM1MywJLyogImlkLXBkYS1jb3VudHJ5T2ZSZXNpZGVuY2UiICovCiszNDgsCS8qICJpZC1wZGEtZGF0ZU9mQmlydGgiICovCiszNTEsCS8qICJpZC1wZGEtZ2VuZGVyIiAqLworMzQ5LAkvKiAiaWQtcGRhLXBsYWNlT2ZCaXJ0aCIgKi8KKzE3NSwJLyogImlkLXBlIiAqLworMjYxLAkvKiAiaWQtcGtpcCIgKi8KKzI1OCwJLyogImlkLXBraXgtbW9kIiAqLworMjY5LAkvKiAiaWQtcGtpeDEtZXhwbGljaXQtODgiICovCisyNzEsCS8qICJpZC1wa2l4MS1leHBsaWNpdC05MyIgKi8KKzI3MCwJLyogImlkLXBraXgxLWltcGxpY2l0LTg4IiAqLworMjcyLAkvKiAiaWQtcGtpeDEtaW1wbGljaXQtOTMiICovCis2NjIsCS8qICJpZC1wcGwiICovCisyNjcsCS8qICJpZC1xY3MiICovCiszNTksCS8qICJpZC1xY3MtcGtpeFFDU3ludGF4LXYxIiAqLworMjU5LAkvKiAiaWQtcXQiICovCiszMTMsCS8qICJpZC1yZWdDdHJsIiAqLworMzE2LAkvKiAiaWQtcmVnQ3RybC1hdXRoZW50aWNhdG9yIiAqLworMzE5LAkvKiAiaWQtcmVnQ3RybC1vbGRDZXJ0SUQiICovCiszMTgsCS8qICJpZC1yZWdDdHJsLXBraUFyY2hpdmVPcHRpb25zIiAqLworMzE3LAkvKiAiaWQtcmVnQ3RybC1wa2lQdWJsaWNhdGlvbkluZm8iICovCiszMjAsCS8qICJpZC1yZWdDdHJsLXByb3RvY29sRW5jcktleSIgKi8KKzMxNSwJLyogImlkLXJlZ0N0cmwtcmVnVG9rZW4iICovCiszMTQsCS8qICJpZC1yZWdJbmZvIiAqLworMzIyLAkvKiAiaWQtcmVnSW5mby1jZXJ0UmVxIiAqLworMzIxLAkvKiAiaWQtcmVnSW5mby11dGY4UGFpcnMiICovCisxOTEsCS8qICJpZC1zbWltZS1hYSIgKi8KKzIxNSwJLyogImlkLXNtaW1lLWFhLWNvbnRlbnRIaW50IiAqLworMjE4LAkvKiAiaWQtc21pbWUtYWEtY29udGVudElkZW50aWZpZXIiICovCisyMjEsCS8qICJpZC1zbWltZS1hYS1jb250ZW50UmVmZXJlbmNlIiAqLworMjQwLAkvKiAiaWQtc21pbWUtYWEtZHZjcy1kdmMiICovCisyMTcsCS8qICJpZC1zbWltZS1hYS1lbmNhcENvbnRlbnRUeXBlIiAqLworMjIyLAkvKiAiaWQtc21pbWUtYWEtZW5jcnlwS2V5UHJlZiIgKi8KKzIyMCwJLyogImlkLXNtaW1lLWFhLWVxdWl2YWxlbnRMYWJlbHMiICovCisyMzIsCS8qICJpZC1zbWltZS1hYS1ldHMtQ2VydGlmaWNhdGVSZWZzIiAqLworMjMzLAkvKiAiaWQtc21pbWUtYWEtZXRzLVJldm9jYXRpb25SZWZzIiAqLworMjM4LAkvKiAiaWQtc21pbWUtYWEtZXRzLWFyY2hpdmVUaW1lU3RhbXAiICovCisyMzcsCS8qICJpZC1zbWltZS1hYS1ldHMtY2VydENSTFRpbWVzdGFtcCIgKi8KKzIzNCwJLyogImlkLXNtaW1lLWFhLWV0cy1jZXJ0VmFsdWVzIiAqLworMjI3LAkvKiAiaWQtc21pbWUtYWEtZXRzLWNvbW1pdG1lbnRUeXBlIiAqLworMjMxLAkvKiAiaWQtc21pbWUtYWEtZXRzLWNvbnRlbnRUaW1lc3RhbXAiICovCisyMzYsCS8qICJpZC1zbWltZS1hYS1ldHMtZXNjVGltZVN0YW1wIiAqLworMjMwLAkvKiAiaWQtc21pbWUtYWEtZXRzLW90aGVyU2lnQ2VydCIgKi8KKzIzNSwJLyogImlkLXNtaW1lLWFhLWV0cy1yZXZvY2F0aW9uVmFsdWVzIiAqLworMjI2LAkvKiAiaWQtc21pbWUtYWEtZXRzLXNpZ1BvbGljeUlkIiAqLworMjI5LAkvKiAiaWQtc21pbWUtYWEtZXRzLXNpZ25lckF0dHIiICovCisyMjgsCS8qICJpZC1zbWltZS1hYS1ldHMtc2lnbmVyTG9jYXRpb24iICovCisyMTksCS8qICJpZC1zbWltZS1hYS1tYWNWYWx1ZSIgKi8KKzIxNCwJLyogImlkLXNtaW1lLWFhLW1sRXhwYW5kSGlzdG9yeSIgKi8KKzIxNiwJLyogImlkLXNtaW1lLWFhLW1zZ1NpZ0RpZ2VzdCIgKi8KKzIxMiwJLyogImlkLXNtaW1lLWFhLXJlY2VpcHRSZXF1ZXN0IiAqLworMjEzLAkvKiAiaWQtc21pbWUtYWEtc2VjdXJpdHlMYWJlbCIgKi8KKzIzOSwJLyogImlkLXNtaW1lLWFhLXNpZ25hdHVyZVR5cGUiICovCisyMjMsCS8qICJpZC1zbWltZS1hYS1zaWduaW5nQ2VydGlmaWNhdGUiICovCisyMjQsCS8qICJpZC1zbWltZS1hYS1zbWltZUVuY3J5cHRDZXJ0cyIgKi8KKzIyNSwJLyogImlkLXNtaW1lLWFhLXRpbWVTdGFtcFRva2VuIiAqLworMTkyLAkvKiAiaWQtc21pbWUtYWxnIiAqLworMjQzLAkvKiAiaWQtc21pbWUtYWxnLTNERVN3cmFwIiAqLworMjQ2LAkvKiAiaWQtc21pbWUtYWxnLUNNUzNERVN3cmFwIiAqLworMjQ3LAkvKiAiaWQtc21pbWUtYWxnLUNNU1JDMndyYXAiICovCisyNDUsCS8qICJpZC1zbWltZS1hbGctRVNESCIgKi8KKzI0MSwJLyogImlkLXNtaW1lLWFsZy1FU0RId2l0aDNERVMiICovCisyNDIsCS8qICJpZC1zbWltZS1hbGctRVNESHdpdGhSQzIiICovCisyNDQsCS8qICJpZC1zbWltZS1hbGctUkMyd3JhcCIgKi8KKzE5MywJLyogImlkLXNtaW1lLWNkIiAqLworMjQ4LAkvKiAiaWQtc21pbWUtY2QtbGRhcCIgKi8KKzE5MCwJLyogImlkLXNtaW1lLWN0IiAqLworMjEwLAkvKiAiaWQtc21pbWUtY3QtRFZDU1JlcXVlc3REYXRhIiAqLworMjExLAkvKiAiaWQtc21pbWUtY3QtRFZDU1Jlc3BvbnNlRGF0YSIgKi8KKzIwOCwJLyogImlkLXNtaW1lLWN0LVREVEluZm8iICovCisyMDcsCS8qICJpZC1zbWltZS1jdC1UU1RJbmZvIiAqLworMjA1LAkvKiAiaWQtc21pbWUtY3QtYXV0aERhdGEiICovCis3ODYsCS8qICJpZC1zbWltZS1jdC1jb21wcmVzc2VkRGF0YSIgKi8KKzIwOSwJLyogImlkLXNtaW1lLWN0LWNvbnRlbnRJbmZvIiAqLworMjA2LAkvKiAiaWQtc21pbWUtY3QtcHVibGlzaENlcnQiICovCisyMDQsCS8qICJpZC1zbWltZS1jdC1yZWNlaXB0IiAqLworMTk1LAkvKiAiaWQtc21pbWUtY3RpIiAqLworMjU1LAkvKiAiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQXBwcm92YWwiICovCisyNTYsCS8qICJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZDcmVhdGlvbiIgKi8KKzI1MywJLyogImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkRlbGl2ZXJ5IiAqLworMjUxLAkvKiAiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mT3JpZ2luIiAqLworMjUyLAkvKiAiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mUmVjZWlwdCIgKi8KKzI1NCwJLyogImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZlNlbmRlciIgKi8KKzE4OSwJLyogImlkLXNtaW1lLW1vZCIgKi8KKzE5NiwJLyogImlkLXNtaW1lLW1vZC1jbXMiICovCisxOTcsCS8qICJpZC1zbWltZS1tb2QtZXNzIiAqLworMjAyLAkvKiAiaWQtc21pbWUtbW9kLWV0cy1lU2lnUG9saWN5LTg4IiAqLworMjAzLAkvKiAiaWQtc21pbWUtbW9kLWV0cy1lU2lnUG9saWN5LTk3IiAqLworMjAwLAkvKiAiaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTg4IiAqLworMjAxLAkvKiAiaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTk3IiAqLworMTk5LAkvKiAiaWQtc21pbWUtbW9kLW1zZy12MyIgKi8KKzE5OCwJLyogImlkLXNtaW1lLW1vZC1vaWQiICovCisxOTQsCS8qICJpZC1zbWltZS1zcHEiICovCisyNTAsCS8qICJpZC1zbWltZS1zcHEtZXRzLXNxdC11bm90aWNlIiAqLworMjQ5LAkvKiAiaWQtc21pbWUtc3BxLWV0cy1zcXQtdXJpIiAqLworMzQsCS8qICJpZGVhLWNiYyIgKi8KKzM1LAkvKiAiaWRlYS1jZmIiICovCiszNiwJLyogImlkZWEtZWNiIiAqLworNDYsCS8qICJpZGVhLW9mYiIgKi8KKzY3NiwJLyogImlkZW50aWZpZWQtb3JnYW5pemF0aW9uIiAqLworNDYxLAkvKiAiaW5mbyIgKi8KKzEwMSwJLyogImluaXRpYWxzIiAqLworODY5LAkvKiAiaW50ZXJuYXRpb25hbGlTRE5OdW1iZXIiICovCis3NDksCS8qICJpcHNlYzMiICovCis3NTAsCS8qICJpcHNlYzQiICovCisxODEsCS8qICJpc28iICovCis2MjMsCS8qICJpc3N1ZXIgY2FwYWJpbGl0aWVzIiAqLworNjQ1LAkvKiAiaXR1LXQiICovCis0OTIsCS8qICJqYW5ldE1haWxib3giICovCis2NDYsCS8qICJqb2ludC1pc28taXR1LXQiICovCisxNTAsCS8qICJrZXlCYWciICovCis3NzMsCS8qICJraXNhIiAqLworNDc3LAkvKiAibGFzdE1vZGlmaWVkQnkiICovCis0NzYsCS8qICJsYXN0TW9kaWZpZWRUaW1lIiAqLworMTU3LAkvKiAibG9jYWxLZXlJRCIgKi8KKzE1LAkvKiAibG9jYWxpdHlOYW1lIiAqLworNDgwLAkvKiAibVhSZWNvcmQiICovCis0OTMsCS8qICJtYWlsUHJlZmVyZW5jZU9wdGlvbiIgKi8KKzQ2NywJLyogIm1hbmFnZXIiICovCisgMywJLyogIm1kMiIgKi8KKyA3LAkvKiAibWQyV2l0aFJTQUVuY3J5cHRpb24iICovCisyNTcsCS8qICJtZDQiICovCiszOTYsCS8qICJtZDRXaXRoUlNBRW5jcnlwdGlvbiIgKi8KKyA0LAkvKiAibWQ1IiAqLworMTE0LAkvKiAibWQ1LXNoYTEiICovCisxMDQsCS8qICJtZDVXaXRoUlNBIiAqLworIDgsCS8qICJtZDVXaXRoUlNBRW5jcnlwdGlvbiIgKi8KKzk1LAkvKiAibWRjMiIgKi8KKzk2LAkvKiAibWRjMldpdGhSU0EiICovCis4NzUsCS8qICJtZW1iZXIiICovCis2MDIsCS8qICJtZXJjaGFudCBpbml0aWF0ZWQgYXV0aCIgKi8KKzUxNCwJLyogIm1lc3NhZ2UgZXh0ZW5zaW9ucyIgKi8KKzUxLAkvKiAibWVzc2FnZURpZ2VzdCIgKi8KKzUwNiwJLyogIm1pbWUtbWhzLWJvZGllcyIgKi8KKzUwNSwJLyogIm1pbWUtbWhzLWhlYWRpbmdzIiAqLworNDg4LAkvKiAibW9iaWxlVGVsZXBob25lTnVtYmVyIiAqLworNDgxLAkvKiAiblNSZWNvcmQiICovCisxNzMsCS8qICJuYW1lIiAqLworNjgxLAkvKiAib25CYXNpcyIgKi8KKzM3OSwJLyogIm9yZyIgKi8KKzE3LAkvKiAib3JnYW5pemF0aW9uTmFtZSIgKi8KKzQ5MSwJLyogIm9yZ2FuaXphdGlvbmFsU3RhdHVzIiAqLworMTgsCS8qICJvcmdhbml6YXRpb25hbFVuaXROYW1lIiAqLworNDc1LAkvKiAib3RoZXJNYWlsYm94IiAqLworODc2LAkvKiAib3duZXIiICovCis0ODksCS8qICJwYWdlclRlbGVwaG9uZU51bWJlciIgKi8KKzc4MiwJLyogInBhc3N3b3JkIGJhc2VkIE1BQyIgKi8KKzM3NCwJLyogInBhdGgiICovCis2MjEsCS8qICJwYXltZW50IGdhdGV3YXkgY2FwYWJpbGl0aWVzIiAqLworIDksCS8qICJwYmVXaXRoTUQyQW5kREVTLUNCQyIgKi8KKzE2OCwJLyogInBiZVdpdGhNRDJBbmRSQzItQ0JDIiAqLworMTEyLAkvKiAicGJlV2l0aE1ENUFuZENhc3Q1Q0JDIiAqLworMTAsCS8qICJwYmVXaXRoTUQ1QW5kREVTLUNCQyIgKi8KKzE2OSwJLyogInBiZVdpdGhNRDVBbmRSQzItQ0JDIiAqLworMTQ4LAkvKiAicGJlV2l0aFNIQTFBbmQxMjhCaXRSQzItQ0JDIiAqLworMTQ0LAkvKiAicGJlV2l0aFNIQTFBbmQxMjhCaXRSQzQiICovCisxNDcsCS8qICJwYmVXaXRoU0hBMUFuZDItS2V5VHJpcGxlREVTLUNCQyIgKi8KKzE0NiwJLyogInBiZVdpdGhTSEExQW5kMy1LZXlUcmlwbGVERVMtQ0JDIiAqLworMTQ5LAkvKiAicGJlV2l0aFNIQTFBbmQ0MEJpdFJDMi1DQkMiICovCisxNDUsCS8qICJwYmVXaXRoU0hBMUFuZDQwQml0UkM0IiAqLworMTcwLAkvKiAicGJlV2l0aFNIQTFBbmRERVMtQ0JDIiAqLworNjgsCS8qICJwYmVXaXRoU0hBMUFuZFJDMi1DQkMiICovCis0OTksCS8qICJwZXJzb25hbFNpZ25hdHVyZSIgKi8KKzQ4NywJLyogInBlcnNvbmFsVGl0bGUiICovCis0NjQsCS8qICJwaG90byIgKi8KKzg2MywJLyogInBoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lIiAqLworNDM3LAkvKiAicGlsb3QiICovCis0MzksCS8qICJwaWxvdEF0dHJpYnV0ZVN5bnRheCIgKi8KKzQzOCwJLyogInBpbG90QXR0cmlidXRlVHlwZSIgKi8KKzQ3OSwJLyogInBpbG90QXR0cmlidXRlVHlwZTI3IiAqLworNDU2LAkvKiAicGlsb3REU0EiICovCis0NDEsCS8qICJwaWxvdEdyb3VwcyIgKi8KKzQ0NCwJLyogInBpbG90T2JqZWN0IiAqLworNDQwLAkvKiAicGlsb3RPYmplY3RDbGFzcyIgKi8KKzQ1NSwJLyogInBpbG90T3JnYW5pemF0aW9uIiAqLworNDQ1LAkvKiAicGlsb3RQZXJzb24iICovCisxODYsCS8qICJwa2NzMSIgKi8KKzI3LAkvKiAicGtjczMiICovCisxODcsCS8qICJwa2NzNSIgKi8KKzIwLAkvKiAicGtjczciICovCisyMSwJLyogInBrY3M3LWRhdGEiICovCisyNSwJLyogInBrY3M3LWRpZ2VzdERhdGEiICovCisyNiwJLyogInBrY3M3LWVuY3J5cHRlZERhdGEiICovCisyMywJLyogInBrY3M3LWVudmVsb3BlZERhdGEiICovCisyNCwJLyogInBrY3M3LXNpZ25lZEFuZEVudmVsb3BlZERhdGEiICovCisyMiwJLyogInBrY3M3LXNpZ25lZERhdGEiICovCisxNTEsCS8qICJwa2NzOFNocm91ZGVkS2V5QmFnIiAqLworNDcsCS8qICJwa2NzOSIgKi8KKzg2MiwJLyogInBvc3RPZmZpY2VCb3giICovCis4NjEsCS8qICJwb3N0YWxBZGRyZXNzIiAqLworNjYxLAkvKiAicG9zdGFsQ29kZSIgKi8KKzY4MywJLyogInBwQmFzaXMiICovCis4NzIsCS8qICJwcmVmZXJyZWREZWxpdmVyeU1ldGhvZCIgKi8KKzg3MywJLyogInByZXNlbnRhdGlvbkFkZHJlc3MiICovCis0MDYsCS8qICJwcmltZS1maWVsZCIgKi8KKzQwOSwJLyogInByaW1lMTkydjEiICovCis0MTAsCS8qICJwcmltZTE5MnYyIiAqLworNDExLAkvKiAicHJpbWUxOTJ2MyIgKi8KKzQxMiwJLyogInByaW1lMjM5djEiICovCis0MTMsCS8qICJwcmltZTIzOXYyIiAqLworNDE0LAkvKiAicHJpbWUyMzl2MyIgKi8KKzQxNSwJLyogInByaW1lMjU2djEiICovCis4ODYsCS8qICJwcm90b2NvbEluZm9ybWF0aW9uIiAqLworNTEwLAkvKiAicHNldWRvbnltIiAqLworNDM1LAkvKiAicHNzIiAqLworMjg2LAkvKiAicWNTdGF0ZW1lbnRzIiAqLworNDU3LAkvKiAicXVhbGl0eUxhYmVsbGVkRGF0YSIgKi8KKzQ1MCwJLyogInJGQzgyMmxvY2FsUGFydCIgKi8KKzk4LAkvKiAicmMyLTQwLWNiYyIgKi8KKzE2NiwJLyogInJjMi02NC1jYmMiICovCiszNywJLyogInJjMi1jYmMiICovCiszOSwJLyogInJjMi1jZmIiICovCiszOCwJLyogInJjMi1lY2IiICovCis0MCwJLyogInJjMi1vZmIiICovCisgNSwJLyogInJjNCIgKi8KKzk3LAkvKiAicmM0LTQwIiAqLworMTIwLAkvKiAicmM1LWNiYyIgKi8KKzEyMiwJLyogInJjNS1jZmIiICovCisxMjEsCS8qICJyYzUtZWNiIiAqLworMTIzLAkvKiAicmM1LW9mYiIgKi8KKzg3MCwJLyogInJlZ2lzdGVyZWRBZGRyZXNzIiAqLworNDYwLAkvKiAicmZjODIyTWFpbGJveCIgKi8KKzExNywJLyogInJpcGVtZDE2MCIgKi8KKzExOSwJLyogInJpcGVtZDE2MFdpdGhSU0EiICovCis0MDAsCS8qICJyb2xlIiAqLworODc3LAkvKiAicm9sZU9jY3VwYW50IiAqLworNDQ4LAkvKiAicm9vbSIgKi8KKzQ2MywJLyogInJvb21OdW1iZXIiICovCisxOSwJLyogInJzYSIgKi8KKyA2LAkvKiAicnNhRW5jcnlwdGlvbiIgKi8KKzY0NCwJLyogInJzYU9BRVBFbmNyeXB0aW9uU0VUIiAqLworMzc3LAkvKiAicnNhU2lnbmF0dXJlIiAqLworMTI0LAkvKiAicnVuIGxlbmd0aCBjb21wcmVzc2lvbiIgKi8KKzQ4MiwJLyogInNPQVJlY29yZCIgKi8KKzE1NSwJLyogInNhZmVDb250ZW50c0JhZyIgKi8KKzI5MSwJLyogInNiZ3AtYXV0b25vbW91c1N5c051bSIgKi8KKzI5MCwJLyogInNiZ3AtaXBBZGRyQmxvY2siICovCisyOTIsCS8qICJzYmdwLXJvdXRlcklkZW50aWZpZXIiICovCisxNTksCS8qICJzZHNpQ2VydGlmaWNhdGUiICovCis4NTksCS8qICJzZWFyY2hHdWlkZSIgKi8KKzcwNCwJLyogInNlY3AxMTJyMSIgKi8KKzcwNSwJLyogInNlY3AxMTJyMiIgKi8KKzcwNiwJLyogInNlY3AxMjhyMSIgKi8KKzcwNywJLyogInNlY3AxMjhyMiIgKi8KKzcwOCwJLyogInNlY3AxNjBrMSIgKi8KKzcwOSwJLyogInNlY3AxNjByMSIgKi8KKzcxMCwJLyogInNlY3AxNjByMiIgKi8KKzcxMSwJLyogInNlY3AxOTJrMSIgKi8KKzcxMiwJLyogInNlY3AyMjRrMSIgKi8KKzcxMywJLyogInNlY3AyMjRyMSIgKi8KKzcxNCwJLyogInNlY3AyNTZrMSIgKi8KKzcxNSwJLyogInNlY3AzODRyMSIgKi8KKzcxNiwJLyogInNlY3A1MjFyMSIgKi8KKzE1NCwJLyogInNlY3JldEJhZyIgKi8KKzQ3NCwJLyogInNlY3JldGFyeSIgKi8KKzcxNywJLyogInNlY3QxMTNyMSIgKi8KKzcxOCwJLyogInNlY3QxMTNyMiIgKi8KKzcxOSwJLyogInNlY3QxMzFyMSIgKi8KKzcyMCwJLyogInNlY3QxMzFyMiIgKi8KKzcyMSwJLyogInNlY3QxNjNrMSIgKi8KKzcyMiwJLyogInNlY3QxNjNyMSIgKi8KKzcyMywJLyogInNlY3QxNjNyMiIgKi8KKzcyNCwJLyogInNlY3QxOTNyMSIgKi8KKzcyNSwJLyogInNlY3QxOTNyMiIgKi8KKzcyNiwJLyogInNlY3QyMzNrMSIgKi8KKzcyNywJLyogInNlY3QyMzNyMSIgKi8KKzcyOCwJLyogInNlY3QyMzlrMSIgKi8KKzcyOSwJLyogInNlY3QyODNrMSIgKi8KKzczMCwJLyogInNlY3QyODNyMSIgKi8KKzczMSwJLyogInNlY3Q0MDlrMSIgKi8KKzczMiwJLyogInNlY3Q0MDlyMSIgKi8KKzczMywJLyogInNlY3Q1NzFrMSIgKi8KKzczNCwJLyogInNlY3Q1NzFyMSIgKi8KKzYzNSwJLyogInNlY3VyZSBkZXZpY2Ugc2lnbmF0dXJlIiAqLworODc4LAkvKiAic2VlQWxzbyIgKi8KKzc3NywJLyogInNlZWQtY2JjIiAqLworNzc5LAkvKiAic2VlZC1jZmIiICovCis3NzYsCS8qICJzZWVkLWVjYiIgKi8KKzc3OCwJLyogInNlZWQtb2ZiIiAqLworMTA1LAkvKiAic2VyaWFsTnVtYmVyIiAqLworNjI1LAkvKiAic2V0LWFkZFBvbGljeSIgKi8KKzUxNSwJLyogInNldC1hdHRyIiAqLworNTE4LAkvKiAic2V0LWJyYW5kIiAqLworNjM4LAkvKiAic2V0LWJyYW5kLUFtZXJpY2FuRXhwcmVzcyIgKi8KKzYzNywJLyogInNldC1icmFuZC1EaW5lcnMiICovCis2MzYsCS8qICJzZXQtYnJhbmQtSUFUQS1BVEEiICovCis2MzksCS8qICJzZXQtYnJhbmQtSkNCIiAqLworNjQxLAkvKiAic2V0LWJyYW5kLU1hc3RlckNhcmQiICovCis2NDIsCS8qICJzZXQtYnJhbmQtTm92dXMiICovCis2NDAsCS8qICJzZXQtYnJhbmQtVmlzYSIgKi8KKzUxNiwJLyogInNldC1wb2xpY3kiICovCis2MDcsCS8qICJzZXQtcG9saWN5LXJvb3QiICovCis2MjQsCS8qICJzZXQtcm9vdEtleVRodW1iIiAqLworNjIwLAkvKiAic2V0QXR0ci1DZXJ0IiAqLworNjI4LAkvKiAic2V0QXR0ci1Jc3NDYXAtQ1ZNIiAqLworNjMwLAkvKiAic2V0QXR0ci1Jc3NDYXAtU2lnIiAqLworNjI5LAkvKiAic2V0QXR0ci1Jc3NDYXAtVDIiICovCis2MjcsCS8qICJzZXRBdHRyLVRva2VuLUIwUHJpbWUiICovCis2MjYsCS8qICJzZXRBdHRyLVRva2VuLUVNViIgKi8KKzYyMiwJLyogInNldEF0dHItVG9rZW5UeXBlIiAqLworNjE5LAkvKiAic2V0Q2V4dC1Jc3N1ZXJDYXBhYmlsaXRpZXMiICovCis2MTUsCS8qICJzZXRDZXh0LVBHV1ljYXBhYmlsaXRpZXMiICovCis2MTYsCS8qICJzZXRDZXh0LVRva2VuSWRlbnRpZmllciIgKi8KKzYxOCwJLyogInNldENleHQtVG9rZW5UeXBlIiAqLworNjE3LAkvKiAic2V0Q2V4dC1UcmFjazJEYXRhIiAqLworNjExLAkvKiAic2V0Q2V4dC1jQ2VydFJlcXVpcmVkIiAqLworNjA5LAkvKiAic2V0Q2V4dC1jZXJ0VHlwZSIgKi8KKzYwOCwJLyogInNldENleHQtaGFzaGVkUm9vdCIgKi8KKzYxMCwJLyogInNldENleHQtbWVyY2hEYXRhIiAqLworNjEzLAkvKiAic2V0Q2V4dC1zZXRFeHQiICovCis2MTQsCS8qICJzZXRDZXh0LXNldFF1YWxmIiAqLworNjEyLAkvKiAic2V0Q2V4dC10dW5uZWxpbmciICovCis1NDAsCS8qICJzZXRjdC1BY3FDYXJkQ29kZU1zZyIgKi8KKzU3NiwJLyogInNldGN0LUFjcUNhcmRDb2RlTXNnVEJFIiAqLworNTcwLAkvKiAic2V0Y3QtQXV0aFJlcVRCRSIgKi8KKzUzNCwJLyogInNldGN0LUF1dGhSZXFUQlMiICovCis1MjcsCS8qICJzZXRjdC1BdXRoUmVzQmFnZ2FnZSIgKi8KKzU3MSwJLyogInNldGN0LUF1dGhSZXNUQkUiICovCis1NzIsCS8qICJzZXRjdC1BdXRoUmVzVEJFWCIgKi8KKzUzNSwJLyogInNldGN0LUF1dGhSZXNUQlMiICovCis1MzYsCS8qICJzZXRjdC1BdXRoUmVzVEJTWCIgKi8KKzUyOCwJLyogInNldGN0LUF1dGhSZXZSZXFCYWdnYWdlIiAqLworNTc3LAkvKiAic2V0Y3QtQXV0aFJldlJlcVRCRSIgKi8KKzU0MSwJLyogInNldGN0LUF1dGhSZXZSZXFUQlMiICovCis1MjksCS8qICJzZXRjdC1BdXRoUmV2UmVzQmFnZ2FnZSIgKi8KKzU0MiwJLyogInNldGN0LUF1dGhSZXZSZXNEYXRhIiAqLworNTc4LAkvKiAic2V0Y3QtQXV0aFJldlJlc1RCRSIgKi8KKzU3OSwJLyogInNldGN0LUF1dGhSZXZSZXNUQkVCIiAqLworNTQzLAkvKiAic2V0Y3QtQXV0aFJldlJlc1RCUyIgKi8KKzU3MywJLyogInNldGN0LUF1dGhUb2tlblRCRSIgKi8KKzUzNywJLyogInNldGN0LUF1dGhUb2tlblRCUyIgKi8KKzYwMCwJLyogInNldGN0LUJDSURpc3RyaWJ1dGlvblRCUyIgKi8KKzU1OCwJLyogInNldGN0LUJhdGNoQWRtaW5SZXFEYXRhIiAqLworNTkyLAkvKiAic2V0Y3QtQmF0Y2hBZG1pblJlcVRCRSIgKi8KKzU1OSwJLyogInNldGN0LUJhdGNoQWRtaW5SZXNEYXRhIiAqLworNTkzLAkvKiAic2V0Y3QtQmF0Y2hBZG1pblJlc1RCRSIgKi8KKzU5OSwJLyogInNldGN0LUNSTE5vdGlmaWNhdGlvblJlc1RCUyIgKi8KKzU5OCwJLyogInNldGN0LUNSTE5vdGlmaWNhdGlvblRCUyIgKi8KKzU4MCwJLyogInNldGN0LUNhcFJlcVRCRSIgKi8KKzU4MSwJLyogInNldGN0LUNhcFJlcVRCRVgiICovCis1NDQsCS8qICJzZXRjdC1DYXBSZXFUQlMiICovCis1NDUsCS8qICJzZXRjdC1DYXBSZXFUQlNYIiAqLworNTQ2LAkvKiAic2V0Y3QtQ2FwUmVzRGF0YSIgKi8KKzU4MiwJLyogInNldGN0LUNhcFJlc1RCRSIgKi8KKzU4MywJLyogInNldGN0LUNhcFJldlJlcVRCRSIgKi8KKzU4NCwJLyogInNldGN0LUNhcFJldlJlcVRCRVgiICovCis1NDcsCS8qICJzZXRjdC1DYXBSZXZSZXFUQlMiICovCis1NDgsCS8qICJzZXRjdC1DYXBSZXZSZXFUQlNYIiAqLworNTQ5LAkvKiAic2V0Y3QtQ2FwUmV2UmVzRGF0YSIgKi8KKzU4NSwJLyogInNldGN0LUNhcFJldlJlc1RCRSIgKi8KKzUzOCwJLyogInNldGN0LUNhcFRva2VuRGF0YSIgKi8KKzUzMCwJLyogInNldGN0LUNhcFRva2VuU2VxIiAqLworNTc0LAkvKiAic2V0Y3QtQ2FwVG9rZW5UQkUiICovCis1NzUsCS8qICJzZXRjdC1DYXBUb2tlblRCRVgiICovCis1MzksCS8qICJzZXRjdC1DYXBUb2tlblRCUyIgKi8KKzU2MCwJLyogInNldGN0LUNhcmRDSW5pdFJlc1RCUyIgKi8KKzU2NiwJLyogInNldGN0LUNlcnRJbnFSZXFUQlMiICovCis1NjMsCS8qICJzZXRjdC1DZXJ0UmVxRGF0YSIgKi8KKzU5NSwJLyogInNldGN0LUNlcnRSZXFUQkUiICovCis1OTYsCS8qICJzZXRjdC1DZXJ0UmVxVEJFWCIgKi8KKzU2NCwJLyogInNldGN0LUNlcnRSZXFUQlMiICovCis1NjUsCS8qICJzZXRjdC1DZXJ0UmVzRGF0YSIgKi8KKzU5NywJLyogInNldGN0LUNlcnRSZXNUQkUiICovCis1ODYsCS8qICJzZXRjdC1DcmVkUmVxVEJFIiAqLworNTg3LAkvKiAic2V0Y3QtQ3JlZFJlcVRCRVgiICovCis1NTAsCS8qICJzZXRjdC1DcmVkUmVxVEJTIiAqLworNTUxLAkvKiAic2V0Y3QtQ3JlZFJlcVRCU1giICovCis1NTIsCS8qICJzZXRjdC1DcmVkUmVzRGF0YSIgKi8KKzU4OCwJLyogInNldGN0LUNyZWRSZXNUQkUiICovCis1ODksCS8qICJzZXRjdC1DcmVkUmV2UmVxVEJFIiAqLworNTkwLAkvKiAic2V0Y3QtQ3JlZFJldlJlcVRCRVgiICovCis1NTMsCS8qICJzZXRjdC1DcmVkUmV2UmVxVEJTIiAqLworNTU0LAkvKiAic2V0Y3QtQ3JlZFJldlJlcVRCU1giICovCis1NTUsCS8qICJzZXRjdC1DcmVkUmV2UmVzRGF0YSIgKi8KKzU5MSwJLyogInNldGN0LUNyZWRSZXZSZXNUQkUiICovCis1NjcsCS8qICJzZXRjdC1FcnJvclRCUyIgKi8KKzUyNiwJLyogInNldGN0LUhPRElucHV0IiAqLworNTYxLAkvKiAic2V0Y3QtTWVBcUNJbml0UmVzVEJTIiAqLworNTIyLAkvKiAic2V0Y3QtT0lEYXRhIiAqLworNTE5LAkvKiAic2V0Y3QtUEFORGF0YSIgKi8KKzUyMSwJLyogInNldGN0LVBBTk9ubHkiICovCis1MjAsCS8qICJzZXRjdC1QQU5Ub2tlbiIgKi8KKzU1NiwJLyogInNldGN0LVBDZXJ0UmVxRGF0YSIgKi8KKzU1NywJLyogInNldGN0LVBDZXJ0UmVzVEJTIiAqLworNTIzLAkvKiAic2V0Y3QtUEkiICovCis1MzIsCS8qICJzZXRjdC1QSS1UQlMiICovCis1MjQsCS8qICJzZXRjdC1QSURhdGEiICovCis1MjUsCS8qICJzZXRjdC1QSURhdGFVbnNpZ25lZCIgKi8KKzU2OCwJLyogInNldGN0LVBJRHVhbFNpZ25lZFRCRSIgKi8KKzU2OSwJLyogInNldGN0LVBJVW5zaWduZWRUQkUiICovCis1MzEsCS8qICJzZXRjdC1QSW5pdFJlc0RhdGEiICovCis1MzMsCS8qICJzZXRjdC1QUmVzRGF0YSIgKi8KKzU5NCwJLyogInNldGN0LVJlZ0Zvcm1SZXFUQkUiICovCis1NjIsCS8qICJzZXRjdC1SZWdGb3JtUmVzVEJTIiAqLworNjA0LAkvKiAic2V0ZXh0LXBpbkFueSIgKi8KKzYwMywJLyogInNldGV4dC1waW5TZWN1cmUiICovCis2MDUsCS8qICJzZXRleHQtdHJhY2syIiAqLworNDEsCS8qICJzaGEiICovCis2NCwJLyogInNoYTEiICovCisxMTUsCS8qICJzaGExV2l0aFJTQSIgKi8KKzY1LAkvKiAic2hhMVdpdGhSU0FFbmNyeXB0aW9uIiAqLworNjc1LAkvKiAic2hhMjI0IiAqLworNjcxLAkvKiAic2hhMjI0V2l0aFJTQUVuY3J5cHRpb24iICovCis2NzIsCS8qICJzaGEyNTYiICovCis2NjgsCS8qICJzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbiIgKi8KKzY3MywJLyogInNoYTM4NCIgKi8KKzY2OSwJLyogInNoYTM4NFdpdGhSU0FFbmNyeXB0aW9uIiAqLworNjc0LAkvKiAic2hhNTEyIiAqLworNjcwLAkvKiAic2hhNTEyV2l0aFJTQUVuY3J5cHRpb24iICovCis0MiwJLyogInNoYVdpdGhSU0FFbmNyeXB0aW9uIiAqLworNTIsCS8qICJzaWduaW5nVGltZSIgKi8KKzQ1NCwJLyogInNpbXBsZVNlY3VyaXR5T2JqZWN0IiAqLworNDk2LAkvKiAic2luZ2xlTGV2ZWxRdWFsaXR5IiAqLworMTYsCS8qICJzdGF0ZU9yUHJvdmluY2VOYW1lIiAqLworNjYwLAkvKiAic3RyZWV0QWRkcmVzcyIgKi8KKzQ5OCwJLyogInN1YnRyZWVNYXhpbXVtUXVhbGl0eSIgKi8KKzQ5NywJLyogInN1YnRyZWVNaW5pbXVtUXVhbGl0eSIgKi8KKzg5MCwJLyogInN1cHBvcnRlZEFsZ29yaXRobXMiICovCis4NzQsCS8qICJzdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQiICovCisxMDAsCS8qICJzdXJuYW1lIiAqLworODY0LAkvKiAidGVsZXBob25lTnVtYmVyIiAqLworODY2LAkvKiAidGVsZXRleFRlcm1pbmFsSWRlbnRpZmllciIgKi8KKzg2NSwJLyogInRlbGV4TnVtYmVyIiAqLworNDU5LAkvKiAidGV4dEVuY29kZWRPUkFkZHJlc3MiICovCisyOTMsCS8qICJ0ZXh0Tm90aWNlIiAqLworMTA2LAkvKiAidGl0bGUiICovCis2ODIsCS8qICJ0cEJhc2lzIiAqLworNDM2LAkvKiAidWNsIiAqLworIDAsCS8qICJ1bmRlZmluZWQiICovCis4ODgsCS8qICJ1bmlxdWVNZW1iZXIiICovCis1NSwJLyogInVuc3RydWN0dXJlZEFkZHJlc3MiICovCis0OSwJLyogInVuc3RydWN0dXJlZE5hbWUiICovCis4ODAsCS8qICJ1c2VyQ2VydGlmaWNhdGUiICovCis0NjUsCS8qICJ1c2VyQ2xhc3MiICovCis0NTgsCS8qICJ1c2VySWQiICovCis4NzksCS8qICJ1c2VyUGFzc3dvcmQiICovCiszNzMsCS8qICJ2YWxpZCIgKi8KKzY3OCwJLyogIndhcCIgKi8KKzY3OSwJLyogIndhcC13c2ciICovCis3MzUsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxIiAqLworNzQzLAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzMTAiICovCis3NDQsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMSIgKi8KKzc0NSwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczEyIiAqLworNzM2LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzMyIgKi8KKzczNywJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczQiICovCis3MzgsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM1IiAqLworNzM5LAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzNiIgKi8KKzc0MCwJLyogIndhcC13c2ctaWRtLWVjaWQtd3RsczciICovCis3NDEsCS8qICJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM4IiAqLworNzQyLAkvKiAid2FwLXdzZy1pZG0tZWNpZC13dGxzOSIgKi8KKzgwNCwJLyogIndoaXJscG9vbCIgKi8KKzg2OCwJLyogIngxMjFBZGRyZXNzIiAqLworNTAzLAkvKiAieDUwMFVuaXF1ZUlkZW50aWZpZXIiICovCisxNTgsCS8qICJ4NTA5Q2VydGlmaWNhdGUiICovCisxNjAsCS8qICJ4NTA5Q3JsIiAqLworMTI1LAkvKiAiemxpYiBjb21wcmVzc2lvbiIgKi8KK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgb2JqX29ianNbTlVNX09CSl09eworIDAsCS8qIE9CSl91bmRlZiAgICAgICAgICAgICAgICAgICAgICAgIDAgKi8KKzM5MywJLyogT0JKX2pvaW50X2lzb19jY2l0dCAgICAgICAgICAgICAgT0JKX2pvaW50X2lzb19pdHVfdCAqLworNDA0LAkvKiBPQkpfY2NpdHQgICAgICAgICAgICAgICAgICAgICAgICBPQkpfaXR1X3QgKi8KKzY0NSwJLyogT0JKX2l0dV90ICAgICAgICAgICAgICAgICAgICAgICAgMCAqLworNDM0LAkvKiBPQkpfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAwIDkgKi8KKzE4MSwJLyogT0JKX2lzbyAgICAgICAgICAgICAgICAgICAgICAgICAgMSAqLworMTgyLAkvKiBPQkpfbWVtYmVyX2JvZHkgICAgICAgICAgICAgICAgICAxIDIgKi8KKzM3OSwJLyogT0JKX29yZyAgICAgICAgICAgICAgICAgICAgICAgICAgMSAzICovCis2NzYsCS8qIE9CSl9pZGVudGlmaWVkX29yZ2FuaXphdGlvbiAgICAgIDEgMyAqLworNjQ2LAkvKiBPQkpfam9pbnRfaXNvX2l0dV90ICAgICAgICAgICAgICAyICovCisxMSwJLyogT0JKX1g1MDAgICAgICAgICAgICAgICAgICAgICAgICAgMiA1ICovCis2NDcsCS8qIE9CSl9pbnRlcm5hdGlvbmFsX29yZ2FuaXphdGlvbnMgIDIgMjMgKi8KKzM4MCwJLyogT0JKX2RvZCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgKi8KKzEyLAkvKiBPQkpfWDUwOSAgICAgICAgICAgICAgICAgICAgICAgICAyIDUgNCAqLworMzc4LAkvKiBPQkpfWDUwMGFsZ29yaXRobXMgICAgICAgICAgICAgICAyIDUgOCAqLworODEsCS8qIE9CSl9pZF9jZSAgICAgICAgICAgICAgICAgICAgICAgIDIgNSAyOSAqLworNTEyLAkvKiBPQkpfaWRfc2V0ICAgICAgICAgICAgICAgICAgICAgICAyIDIzIDQyICovCis2NzgsCS8qIE9CSl93YXAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgMjMgNDMgKi8KKzQzNSwJLyogT0JKX3BzcyAgICAgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgKi8KKzE4MywJLyogT0JKX0lTT19VUyAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAqLworMzgxLAkvKiBPQkpfaWFuYSAgICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxICovCis2NzcsCS8qIE9CSl9jZXJ0aWNvbV9hcmMgICAgICAgICAgICAgICAgIDEgMyAxMzIgKi8KKzM5NCwJLyogT0JKX3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcyAgICAgMiA1IDEgNSAqLworMTMsCS8qIE9CSl9jb21tb25OYW1lICAgICAgICAgICAgICAgICAgIDIgNSA0IDMgKi8KKzEwMCwJLyogT0JKX3N1cm5hbWUgICAgICAgICAgICAgICAgICAgICAgMiA1IDQgNCAqLworMTA1LAkvKiBPQkpfc2VyaWFsTnVtYmVyICAgICAgICAgICAgICAgICAyIDUgNCA1ICovCisxNCwJLyogT0JKX2NvdW50cnlOYW1lICAgICAgICAgICAgICAgICAgMiA1IDQgNiAqLworMTUsCS8qIE9CSl9sb2NhbGl0eU5hbWUgICAgICAgICAgICAgICAgIDIgNSA0IDcgKi8KKzE2LAkvKiBPQkpfc3RhdGVPclByb3ZpbmNlTmFtZSAgICAgICAgICAyIDUgNCA4ICovCis2NjAsCS8qIE9CSl9zdHJlZXRBZGRyZXNzICAgICAgICAgICAgICAgIDIgNSA0IDkgKi8KKzE3LAkvKiBPQkpfb3JnYW5pemF0aW9uTmFtZSAgICAgICAgICAgICAyIDUgNCAxMCAqLworMTgsCS8qIE9CSl9vcmdhbml6YXRpb25hbFVuaXROYW1lICAgICAgIDIgNSA0IDExICovCisxMDYsCS8qIE9CSl90aXRsZSAgICAgICAgICAgICAgICAgICAgICAgIDIgNSA0IDEyICovCisxMDcsCS8qIE9CSl9kZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgIDIgNSA0IDEzICovCis4NTksCS8qIE9CSl9zZWFyY2hHdWlkZSAgICAgICAgICAgICAgICAgIDIgNSA0IDE0ICovCis4NjAsCS8qIE9CSl9idXNpbmVzc0NhdGVnb3J5ICAgICAgICAgICAgIDIgNSA0IDE1ICovCis4NjEsCS8qIE9CSl9wb3N0YWxBZGRyZXNzICAgICAgICAgICAgICAgIDIgNSA0IDE2ICovCis2NjEsCS8qIE9CSl9wb3N0YWxDb2RlICAgICAgICAgICAgICAgICAgIDIgNSA0IDE3ICovCis4NjIsCS8qIE9CSl9wb3N0T2ZmaWNlQm94ICAgICAgICAgICAgICAgIDIgNSA0IDE4ICovCis4NjMsCS8qIE9CSl9waHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZSAgIDIgNSA0IDE5ICovCis4NjQsCS8qIE9CSl90ZWxlcGhvbmVOdW1iZXIgICAgICAgICAgICAgIDIgNSA0IDIwICovCis4NjUsCS8qIE9CSl90ZWxleE51bWJlciAgICAgICAgICAgICAgICAgIDIgNSA0IDIxICovCis4NjYsCS8qIE9CSl90ZWxldGV4VGVybWluYWxJZGVudGlmaWVyICAgIDIgNSA0IDIyICovCis4NjcsCS8qIE9CSl9mYWNzaW1pbGVUZWxlcGhvbmVOdW1iZXIgICAgIDIgNSA0IDIzICovCis4NjgsCS8qIE9CSl94MTIxQWRkcmVzcyAgICAgICAgICAgICAgICAgIDIgNSA0IDI0ICovCis4NjksCS8qIE9CSl9pbnRlcm5hdGlvbmFsaVNETk51bWJlciAgICAgIDIgNSA0IDI1ICovCis4NzAsCS8qIE9CSl9yZWdpc3RlcmVkQWRkcmVzcyAgICAgICAgICAgIDIgNSA0IDI2ICovCis4NzEsCS8qIE9CSl9kZXN0aW5hdGlvbkluZGljYXRvciAgICAgICAgIDIgNSA0IDI3ICovCis4NzIsCS8qIE9CSl9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZCAgICAgIDIgNSA0IDI4ICovCis4NzMsCS8qIE9CSl9wcmVzZW50YXRpb25BZGRyZXNzICAgICAgICAgIDIgNSA0IDI5ICovCis4NzQsCS8qIE9CSl9zdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQgIDIgNSA0IDMwICovCis4NzUsCS8qIE9CSl9tZW1iZXIgICAgICAgICAgICAgICAgICAgICAgIDIgNSA0IDMxICovCis4NzYsCS8qIE9CSl9vd25lciAgICAgICAgICAgICAgICAgICAgICAgIDIgNSA0IDMyICovCis4NzcsCS8qIE9CSl9yb2xlT2NjdXBhbnQgICAgICAgICAgICAgICAgIDIgNSA0IDMzICovCis4NzgsCS8qIE9CSl9zZWVBbHNvICAgICAgICAgICAgICAgICAgICAgIDIgNSA0IDM0ICovCis4NzksCS8qIE9CSl91c2VyUGFzc3dvcmQgICAgICAgICAgICAgICAgIDIgNSA0IDM1ICovCis4ODAsCS8qIE9CSl91c2VyQ2VydGlmaWNhdGUgICAgICAgICAgICAgIDIgNSA0IDM2ICovCis4ODEsCS8qIE9CSl9jQUNlcnRpZmljYXRlICAgICAgICAgICAgICAgIDIgNSA0IDM3ICovCis4ODIsCS8qIE9CSl9hdXRob3JpdHlSZXZvY2F0aW9uTGlzdCAgICAgIDIgNSA0IDM4ICovCis4ODMsCS8qIE9CSl9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0ICAgIDIgNSA0IDM5ICovCis4ODQsCS8qIE9CSl9jcm9zc0NlcnRpZmljYXRlUGFpciAgICAgICAgIDIgNSA0IDQwICovCisxNzMsCS8qIE9CSl9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgIDIgNSA0IDQxICovCis5OSwJLyogT0JKX2dpdmVuTmFtZSAgICAgICAgICAgICAgICAgICAgMiA1IDQgNDIgKi8KKzEwMSwJLyogT0JKX2luaXRpYWxzICAgICAgICAgICAgICAgICAgICAgMiA1IDQgNDMgKi8KKzUwOSwJLyogT0JKX2dlbmVyYXRpb25RdWFsaWZpZXIgICAgICAgICAgMiA1IDQgNDQgKi8KKzUwMywJLyogT0JKX3g1MDBVbmlxdWVJZGVudGlmaWVyICAgICAgICAgMiA1IDQgNDUgKi8KKzE3NCwJLyogT0JKX2RuUXVhbGlmaWVyICAgICAgICAgICAgICAgICAgMiA1IDQgNDYgKi8KKzg4NSwJLyogT0JKX2VuaGFuY2VkU2VhcmNoR3VpZGUgICAgICAgICAgMiA1IDQgNDcgKi8KKzg4NiwJLyogT0JKX3Byb3RvY29sSW5mb3JtYXRpb24gICAgICAgICAgMiA1IDQgNDggKi8KKzg4NywJLyogT0JKX2Rpc3Rpbmd1aXNoZWROYW1lICAgICAgICAgICAgMiA1IDQgNDkgKi8KKzg4OCwJLyogT0JKX3VuaXF1ZU1lbWJlciAgICAgICAgICAgICAgICAgMiA1IDQgNTAgKi8KKzg4OSwJLyogT0JKX2hvdXNlSWRlbnRpZmllciAgICAgICAgICAgICAgMiA1IDQgNTEgKi8KKzg5MCwJLyogT0JKX3N1cHBvcnRlZEFsZ29yaXRobXMgICAgICAgICAgMiA1IDQgNTIgKi8KKzg5MSwJLyogT0JKX2RlbHRhUmV2b2NhdGlvbkxpc3QgICAgICAgICAgMiA1IDQgNTMgKi8KKzg5MiwJLyogT0JKX2RtZE5hbWUgICAgICAgICAgICAgICAgICAgICAgMiA1IDQgNTQgKi8KKzUxMCwJLyogT0JKX3BzZXVkb255bSAgICAgICAgICAgICAgICAgICAgMiA1IDQgNjUgKi8KKzQwMCwJLyogT0JKX3JvbGUgICAgICAgICAgICAgICAgICAgICAgICAgMiA1IDQgNzIgKi8KKzc2OSwJLyogT0JKX3N1YmplY3RfZGlyZWN0b3J5X2F0dHJpYnV0ZXMgMiA1IDI5IDkgKi8KKzgyLAkvKiBPQkpfc3ViamVjdF9rZXlfaWRlbnRpZmllciAgICAgICAyIDUgMjkgMTQgKi8KKzgzLAkvKiBPQkpfa2V5X3VzYWdlICAgICAgICAgICAgICAgICAgICAyIDUgMjkgMTUgKi8KKzg0LAkvKiBPQkpfcHJpdmF0ZV9rZXlfdXNhZ2VfcGVyaW9kICAgICAyIDUgMjkgMTYgKi8KKzg1LAkvKiBPQkpfc3ViamVjdF9hbHRfbmFtZSAgICAgICAgICAgICAyIDUgMjkgMTcgKi8KKzg2LAkvKiBPQkpfaXNzdWVyX2FsdF9uYW1lICAgICAgICAgICAgICAyIDUgMjkgMTggKi8KKzg3LAkvKiBPQkpfYmFzaWNfY29uc3RyYWludHMgICAgICAgICAgICAyIDUgMjkgMTkgKi8KKzg4LAkvKiBPQkpfY3JsX251bWJlciAgICAgICAgICAgICAgICAgICAyIDUgMjkgMjAgKi8KKzE0MSwJLyogT0JKX2NybF9yZWFzb24gICAgICAgICAgICAgICAgICAgMiA1IDI5IDIxICovCis0MzAsCS8qIE9CSl9ob2xkX2luc3RydWN0aW9uX2NvZGUgICAgICAgIDIgNSAyOSAyMyAqLworMTQyLAkvKiBPQkpfaW52YWxpZGl0eV9kYXRlICAgICAgICAgICAgICAyIDUgMjkgMjQgKi8KKzE0MCwJLyogT0JKX2RlbHRhX2NybCAgICAgICAgICAgICAgICAgICAgMiA1IDI5IDI3ICovCis3NzAsCS8qIE9CSl9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludCAgIDIgNSAyOSAyOCAqLworNzcxLAkvKiBPQkpfY2VydGlmaWNhdGVfaXNzdWVyICAgICAgICAgICAyIDUgMjkgMjkgKi8KKzY2NiwJLyogT0JKX25hbWVfY29uc3RyYWludHMgICAgICAgICAgICAgMiA1IDI5IDMwICovCisxMDMsCS8qIE9CSl9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cyAgICAgIDIgNSAyOSAzMSAqLworODksCS8qIE9CSl9jZXJ0aWZpY2F0ZV9wb2xpY2llcyAgICAgICAgIDIgNSAyOSAzMiAqLworNzQ3LAkvKiBPQkpfcG9saWN5X21hcHBpbmdzICAgICAgICAgICAgICAyIDUgMjkgMzMgKi8KKzkwLAkvKiBPQkpfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyICAgICAyIDUgMjkgMzUgKi8KKzQwMSwJLyogT0JKX3BvbGljeV9jb25zdHJhaW50cyAgICAgICAgICAgMiA1IDI5IDM2ICovCisxMjYsCS8qIE9CSl9leHRfa2V5X3VzYWdlICAgICAgICAgICAgICAgIDIgNSAyOSAzNyAqLworODU3LAkvKiBPQkpfZnJlc2hlc3RfY3JsICAgICAgICAgICAgICAgICAyIDUgMjkgNDYgKi8KKzc0OCwJLyogT0JKX2luaGliaXRfYW55X3BvbGljeSAgICAgICAgICAgMiA1IDI5IDU0ICovCis0MDIsCS8qIE9CSl90YXJnZXRfaW5mb3JtYXRpb24gICAgICAgICAgIDIgNSAyOSA1NSAqLworNDAzLAkvKiBPQkpfbm9fcmV2X2F2YWlsICAgICAgICAgICAgICAgICAyIDUgMjkgNTYgKi8KKzUxMywJLyogT0JKX3NldF9jdHlwZSAgICAgICAgICAgICAgICAgICAgMiAyMyA0MiAwICovCis1MTQsCS8qIE9CSl9zZXRfbXNnRXh0ICAgICAgICAgICAgICAgICAgIDIgMjMgNDIgMSAqLworNTE1LAkvKiBPQkpfc2V0X2F0dHIgICAgICAgICAgICAgICAgICAgICAyIDIzIDQyIDMgKi8KKzUxNiwJLyogT0JKX3NldF9wb2xpY3kgICAgICAgICAgICAgICAgICAgMiAyMyA0MiA1ICovCis1MTcsCS8qIE9CSl9zZXRfY2VydEV4dCAgICAgICAgICAgICAgICAgIDIgMjMgNDIgNyAqLworNTE4LAkvKiBPQkpfc2V0X2JyYW5kICAgICAgICAgICAgICAgICAgICAyIDIzIDQyIDggKi8KKzY3OSwJLyogT0JKX3dhcF93c2cgICAgICAgICAgICAgICAgICAgICAgMiAyMyA0MyAxICovCiszODIsCS8qIE9CSl9EaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgMSAqLworMzgzLAkvKiBPQkpfTWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDIgKi8KKzM4NCwJLyogT0JKX0V4cGVyaW1lbnRhbCAgICAgICAgICAgICAgICAgMSAzIDYgMSAzICovCiszODUsCS8qIE9CSl9Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAqLworMzg2LAkvKiBPQkpfU2VjdXJpdHkgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgKi8KKzM4NywJLyogT0JKX1NOTVB2MiAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA2ICovCiszODgsCS8qIE9CSl9NYWlsICAgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNyAqLworMzc2LAkvKiBPQkpfYWxnb3JpdGhtICAgICAgICAgICAgICAgICAgICAxIDMgMTQgMyAyICovCiszOTUsCS8qIE9CSl9jbGVhcmFuY2UgICAgICAgICAgICAgICAgICAgIDIgNSAxIDUgNTUgKi8KKzE5LAkvKiBPQkpfcnNhICAgICAgICAgICAgICAgICAgICAgICAgICAyIDUgOCAxIDEgKi8KKzk2LAkvKiBPQkpfbWRjMldpdGhSU0EgICAgICAgICAgICAgICAgICAyIDUgOCAzIDEwMCAqLworOTUsCS8qIE9CSl9tZGMyICAgICAgICAgICAgICAgICAgICAgICAgIDIgNSA4IDMgMTAxICovCis3NDYsCS8qIE9CSl9hbnlfcG9saWN5ICAgICAgICAgICAgICAgICAgIDIgNSAyOSAzMiAwICovCis1MTksCS8qIE9CSl9zZXRjdF9QQU5EYXRhICAgICAgICAgICAgICAgIDIgMjMgNDIgMCAwICovCis1MjAsCS8qIE9CSl9zZXRjdF9QQU5Ub2tlbiAgICAgICAgICAgICAgIDIgMjMgNDIgMCAxICovCis1MjEsCS8qIE9CSl9zZXRjdF9QQU5Pbmx5ICAgICAgICAgICAgICAgIDIgMjMgNDIgMCAyICovCis1MjIsCS8qIE9CSl9zZXRjdF9PSURhdGEgICAgICAgICAgICAgICAgIDIgMjMgNDIgMCAzICovCis1MjMsCS8qIE9CSl9zZXRjdF9QSSAgICAgICAgICAgICAgICAgICAgIDIgMjMgNDIgMCA0ICovCis1MjQsCS8qIE9CSl9zZXRjdF9QSURhdGEgICAgICAgICAgICAgICAgIDIgMjMgNDIgMCA1ICovCis1MjUsCS8qIE9CSl9zZXRjdF9QSURhdGFVbnNpZ25lZCAgICAgICAgIDIgMjMgNDIgMCA2ICovCis1MjYsCS8qIE9CSl9zZXRjdF9IT0RJbnB1dCAgICAgICAgICAgICAgIDIgMjMgNDIgMCA3ICovCis1MjcsCS8qIE9CSl9zZXRjdF9BdXRoUmVzQmFnZ2FnZSAgICAgICAgIDIgMjMgNDIgMCA4ICovCis1MjgsCS8qIE9CSl9zZXRjdF9BdXRoUmV2UmVxQmFnZ2FnZSAgICAgIDIgMjMgNDIgMCA5ICovCis1MjksCS8qIE9CSl9zZXRjdF9BdXRoUmV2UmVzQmFnZ2FnZSAgICAgIDIgMjMgNDIgMCAxMCAqLworNTMwLAkvKiBPQkpfc2V0Y3RfQ2FwVG9rZW5TZXEgICAgICAgICAgICAyIDIzIDQyIDAgMTEgKi8KKzUzMSwJLyogT0JKX3NldGN0X1BJbml0UmVzRGF0YSAgICAgICAgICAgMiAyMyA0MiAwIDEyICovCis1MzIsCS8qIE9CSl9zZXRjdF9QSV9UQlMgICAgICAgICAgICAgICAgIDIgMjMgNDIgMCAxMyAqLworNTMzLAkvKiBPQkpfc2V0Y3RfUFJlc0RhdGEgICAgICAgICAgICAgICAyIDIzIDQyIDAgMTQgKi8KKzUzNCwJLyogT0JKX3NldGN0X0F1dGhSZXFUQlMgICAgICAgICAgICAgMiAyMyA0MiAwIDE2ICovCis1MzUsCS8qIE9CSl9zZXRjdF9BdXRoUmVzVEJTICAgICAgICAgICAgIDIgMjMgNDIgMCAxNyAqLworNTM2LAkvKiBPQkpfc2V0Y3RfQXV0aFJlc1RCU1ggICAgICAgICAgICAyIDIzIDQyIDAgMTggKi8KKzUzNywJLyogT0JKX3NldGN0X0F1dGhUb2tlblRCUyAgICAgICAgICAgMiAyMyA0MiAwIDE5ICovCis1MzgsCS8qIE9CSl9zZXRjdF9DYXBUb2tlbkRhdGEgICAgICAgICAgIDIgMjMgNDIgMCAyMCAqLworNTM5LAkvKiBPQkpfc2V0Y3RfQ2FwVG9rZW5UQlMgICAgICAgICAgICAyIDIzIDQyIDAgMjEgKi8KKzU0MCwJLyogT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnICAgICAgICAgMiAyMyA0MiAwIDIyICovCis1NDEsCS8qIE9CSl9zZXRjdF9BdXRoUmV2UmVxVEJTICAgICAgICAgIDIgMjMgNDIgMCAyMyAqLworNTQyLAkvKiBPQkpfc2V0Y3RfQXV0aFJldlJlc0RhdGEgICAgICAgICAyIDIzIDQyIDAgMjQgKi8KKzU0MywJLyogT0JKX3NldGN0X0F1dGhSZXZSZXNUQlMgICAgICAgICAgMiAyMyA0MiAwIDI1ICovCis1NDQsCS8qIE9CSl9zZXRjdF9DYXBSZXFUQlMgICAgICAgICAgICAgIDIgMjMgNDIgMCAyNiAqLworNTQ1LAkvKiBPQkpfc2V0Y3RfQ2FwUmVxVEJTWCAgICAgICAgICAgICAyIDIzIDQyIDAgMjcgKi8KKzU0NiwJLyogT0JKX3NldGN0X0NhcFJlc0RhdGEgICAgICAgICAgICAgMiAyMyA0MiAwIDI4ICovCis1NDcsCS8qIE9CSl9zZXRjdF9DYXBSZXZSZXFUQlMgICAgICAgICAgIDIgMjMgNDIgMCAyOSAqLworNTQ4LAkvKiBPQkpfc2V0Y3RfQ2FwUmV2UmVxVEJTWCAgICAgICAgICAyIDIzIDQyIDAgMzAgKi8KKzU0OSwJLyogT0JKX3NldGN0X0NhcFJldlJlc0RhdGEgICAgICAgICAgMiAyMyA0MiAwIDMxICovCis1NTAsCS8qIE9CSl9zZXRjdF9DcmVkUmVxVEJTICAgICAgICAgICAgIDIgMjMgNDIgMCAzMiAqLworNTUxLAkvKiBPQkpfc2V0Y3RfQ3JlZFJlcVRCU1ggICAgICAgICAgICAyIDIzIDQyIDAgMzMgKi8KKzU1MiwJLyogT0JKX3NldGN0X0NyZWRSZXNEYXRhICAgICAgICAgICAgMiAyMyA0MiAwIDM0ICovCis1NTMsCS8qIE9CSl9zZXRjdF9DcmVkUmV2UmVxVEJTICAgICAgICAgIDIgMjMgNDIgMCAzNSAqLworNTU0LAkvKiBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCU1ggICAgICAgICAyIDIzIDQyIDAgMzYgKi8KKzU1NSwJLyogT0JKX3NldGN0X0NyZWRSZXZSZXNEYXRhICAgICAgICAgMiAyMyA0MiAwIDM3ICovCis1NTYsCS8qIE9CSl9zZXRjdF9QQ2VydFJlcURhdGEgICAgICAgICAgIDIgMjMgNDIgMCAzOCAqLworNTU3LAkvKiBPQkpfc2V0Y3RfUENlcnRSZXNUQlMgICAgICAgICAgICAyIDIzIDQyIDAgMzkgKi8KKzU1OCwJLyogT0JKX3NldGN0X0JhdGNoQWRtaW5SZXFEYXRhICAgICAgMiAyMyA0MiAwIDQwICovCis1NTksCS8qIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVzRGF0YSAgICAgIDIgMjMgNDIgMCA0MSAqLworNTYwLAkvKiBPQkpfc2V0Y3RfQ2FyZENJbml0UmVzVEJTICAgICAgICAyIDIzIDQyIDAgNDIgKi8KKzU2MSwJLyogT0JKX3NldGN0X01lQXFDSW5pdFJlc1RCUyAgICAgICAgMiAyMyA0MiAwIDQzICovCis1NjIsCS8qIE9CSl9zZXRjdF9SZWdGb3JtUmVzVEJTICAgICAgICAgIDIgMjMgNDIgMCA0NCAqLworNTYzLAkvKiBPQkpfc2V0Y3RfQ2VydFJlcURhdGEgICAgICAgICAgICAyIDIzIDQyIDAgNDUgKi8KKzU2NCwJLyogT0JKX3NldGN0X0NlcnRSZXFUQlMgICAgICAgICAgICAgMiAyMyA0MiAwIDQ2ICovCis1NjUsCS8qIE9CSl9zZXRjdF9DZXJ0UmVzRGF0YSAgICAgICAgICAgIDIgMjMgNDIgMCA0NyAqLworNTY2LAkvKiBPQkpfc2V0Y3RfQ2VydElucVJlcVRCUyAgICAgICAgICAyIDIzIDQyIDAgNDggKi8KKzU2NywJLyogT0JKX3NldGN0X0Vycm9yVEJTICAgICAgICAgICAgICAgMiAyMyA0MiAwIDQ5ICovCis1NjgsCS8qIE9CSl9zZXRjdF9QSUR1YWxTaWduZWRUQkUgICAgICAgIDIgMjMgNDIgMCA1MCAqLworNTY5LAkvKiBPQkpfc2V0Y3RfUElVbnNpZ25lZFRCRSAgICAgICAgICAyIDIzIDQyIDAgNTEgKi8KKzU3MCwJLyogT0JKX3NldGN0X0F1dGhSZXFUQkUgICAgICAgICAgICAgMiAyMyA0MiAwIDUyICovCis1NzEsCS8qIE9CSl9zZXRjdF9BdXRoUmVzVEJFICAgICAgICAgICAgIDIgMjMgNDIgMCA1MyAqLworNTcyLAkvKiBPQkpfc2V0Y3RfQXV0aFJlc1RCRVggICAgICAgICAgICAyIDIzIDQyIDAgNTQgKi8KKzU3MywJLyogT0JKX3NldGN0X0F1dGhUb2tlblRCRSAgICAgICAgICAgMiAyMyA0MiAwIDU1ICovCis1NzQsCS8qIE9CSl9zZXRjdF9DYXBUb2tlblRCRSAgICAgICAgICAgIDIgMjMgNDIgMCA1NiAqLworNTc1LAkvKiBPQkpfc2V0Y3RfQ2FwVG9rZW5UQkVYICAgICAgICAgICAyIDIzIDQyIDAgNTcgKi8KKzU3NiwJLyogT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnVEJFICAgICAgMiAyMyA0MiAwIDU4ICovCis1NzcsCS8qIE9CSl9zZXRjdF9BdXRoUmV2UmVxVEJFICAgICAgICAgIDIgMjMgNDIgMCA1OSAqLworNTc4LAkvKiBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCRSAgICAgICAgICAyIDIzIDQyIDAgNjAgKi8KKzU3OSwJLyogT0JKX3NldGN0X0F1dGhSZXZSZXNUQkVCICAgICAgICAgMiAyMyA0MiAwIDYxICovCis1ODAsCS8qIE9CSl9zZXRjdF9DYXBSZXFUQkUgICAgICAgICAgICAgIDIgMjMgNDIgMCA2MiAqLworNTgxLAkvKiBPQkpfc2V0Y3RfQ2FwUmVxVEJFWCAgICAgICAgICAgICAyIDIzIDQyIDAgNjMgKi8KKzU4MiwJLyogT0JKX3NldGN0X0NhcFJlc1RCRSAgICAgICAgICAgICAgMiAyMyA0MiAwIDY0ICovCis1ODMsCS8qIE9CSl9zZXRjdF9DYXBSZXZSZXFUQkUgICAgICAgICAgIDIgMjMgNDIgMCA2NSAqLworNTg0LAkvKiBPQkpfc2V0Y3RfQ2FwUmV2UmVxVEJFWCAgICAgICAgICAyIDIzIDQyIDAgNjYgKi8KKzU4NSwJLyogT0JKX3NldGN0X0NhcFJldlJlc1RCRSAgICAgICAgICAgMiAyMyA0MiAwIDY3ICovCis1ODYsCS8qIE9CSl9zZXRjdF9DcmVkUmVxVEJFICAgICAgICAgICAgIDIgMjMgNDIgMCA2OCAqLworNTg3LAkvKiBPQkpfc2V0Y3RfQ3JlZFJlcVRCRVggICAgICAgICAgICAyIDIzIDQyIDAgNjkgKi8KKzU4OCwJLyogT0JKX3NldGN0X0NyZWRSZXNUQkUgICAgICAgICAgICAgMiAyMyA0MiAwIDcwICovCis1ODksCS8qIE9CSl9zZXRjdF9DcmVkUmV2UmVxVEJFICAgICAgICAgIDIgMjMgNDIgMCA3MSAqLworNTkwLAkvKiBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCRVggICAgICAgICAyIDIzIDQyIDAgNzIgKi8KKzU5MSwJLyogT0JKX3NldGN0X0NyZWRSZXZSZXNUQkUgICAgICAgICAgMiAyMyA0MiAwIDczICovCis1OTIsCS8qIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVxVEJFICAgICAgIDIgMjMgNDIgMCA3NCAqLworNTkzLAkvKiBPQkpfc2V0Y3RfQmF0Y2hBZG1pblJlc1RCRSAgICAgICAyIDIzIDQyIDAgNzUgKi8KKzU5NCwJLyogT0JKX3NldGN0X1JlZ0Zvcm1SZXFUQkUgICAgICAgICAgMiAyMyA0MiAwIDc2ICovCis1OTUsCS8qIE9CSl9zZXRjdF9DZXJ0UmVxVEJFICAgICAgICAgICAgIDIgMjMgNDIgMCA3NyAqLworNTk2LAkvKiBPQkpfc2V0Y3RfQ2VydFJlcVRCRVggICAgICAgICAgICAyIDIzIDQyIDAgNzggKi8KKzU5NywJLyogT0JKX3NldGN0X0NlcnRSZXNUQkUgICAgICAgICAgICAgMiAyMyA0MiAwIDc5ICovCis1OTgsCS8qIE9CSl9zZXRjdF9DUkxOb3RpZmljYXRpb25UQlMgICAgIDIgMjMgNDIgMCA4MCAqLworNTk5LAkvKiBPQkpfc2V0Y3RfQ1JMTm90aWZpY2F0aW9uUmVzVEJTICAyIDIzIDQyIDAgODEgKi8KKzYwMCwJLyogT0JKX3NldGN0X0JDSURpc3RyaWJ1dGlvblRCUyAgICAgMiAyMyA0MiAwIDgyICovCis2MDEsCS8qIE9CSl9zZXRleHRfZ2VuQ3J5cHQgICAgICAgICAgICAgIDIgMjMgNDIgMSAxICovCis2MDIsCS8qIE9CSl9zZXRleHRfbWlBdXRoICAgICAgICAgICAgICAgIDIgMjMgNDIgMSAzICovCis2MDMsCS8qIE9CSl9zZXRleHRfcGluU2VjdXJlICAgICAgICAgICAgIDIgMjMgNDIgMSA0ICovCis2MDQsCS8qIE9CSl9zZXRleHRfcGluQW55ICAgICAgICAgICAgICAgIDIgMjMgNDIgMSA1ICovCis2MDUsCS8qIE9CSl9zZXRleHRfdHJhY2syICAgICAgICAgICAgICAgIDIgMjMgNDIgMSA3ICovCis2MDYsCS8qIE9CSl9zZXRleHRfY3YgICAgICAgICAgICAgICAgICAgIDIgMjMgNDIgMSA4ICovCis2MjAsCS8qIE9CSl9zZXRBdHRyX0NlcnQgICAgICAgICAgICAgICAgIDIgMjMgNDIgMyAwICovCis2MjEsCS8qIE9CSl9zZXRBdHRyX1BHV1ljYXAgICAgICAgICAgICAgIDIgMjMgNDIgMyAxICovCis2MjIsCS8qIE9CSl9zZXRBdHRyX1Rva2VuVHlwZSAgICAgICAgICAgIDIgMjMgNDIgMyAyICovCis2MjMsCS8qIE9CSl9zZXRBdHRyX0lzc0NhcCAgICAgICAgICAgICAgIDIgMjMgNDIgMyAzICovCis2MDcsCS8qIE9CSl9zZXRfcG9saWN5X3Jvb3QgICAgICAgICAgICAgIDIgMjMgNDIgNSAwICovCis2MDgsCS8qIE9CSl9zZXRDZXh0X2hhc2hlZFJvb3QgICAgICAgICAgIDIgMjMgNDIgNyAwICovCis2MDksCS8qIE9CSl9zZXRDZXh0X2NlcnRUeXBlICAgICAgICAgICAgIDIgMjMgNDIgNyAxICovCis2MTAsCS8qIE9CSl9zZXRDZXh0X21lcmNoRGF0YSAgICAgICAgICAgIDIgMjMgNDIgNyAyICovCis2MTEsCS8qIE9CSl9zZXRDZXh0X2NDZXJ0UmVxdWlyZWQgICAgICAgIDIgMjMgNDIgNyAzICovCis2MTIsCS8qIE9CSl9zZXRDZXh0X3R1bm5lbGluZyAgICAgICAgICAgIDIgMjMgNDIgNyA0ICovCis2MTMsCS8qIE9CSl9zZXRDZXh0X3NldEV4dCAgICAgICAgICAgICAgIDIgMjMgNDIgNyA1ICovCis2MTQsCS8qIE9CSl9zZXRDZXh0X3NldFF1YWxmICAgICAgICAgICAgIDIgMjMgNDIgNyA2ICovCis2MTUsCS8qIE9CSl9zZXRDZXh0X1BHV1ljYXBhYmlsaXRpZXMgICAgIDIgMjMgNDIgNyA3ICovCis2MTYsCS8qIE9CSl9zZXRDZXh0X1Rva2VuSWRlbnRpZmllciAgICAgIDIgMjMgNDIgNyA4ICovCis2MTcsCS8qIE9CSl9zZXRDZXh0X1RyYWNrMkRhdGEgICAgICAgICAgIDIgMjMgNDIgNyA5ICovCis2MTgsCS8qIE9CSl9zZXRDZXh0X1Rva2VuVHlwZSAgICAgICAgICAgIDIgMjMgNDIgNyAxMCAqLworNjE5LAkvKiBPQkpfc2V0Q2V4dF9Jc3N1ZXJDYXBhYmlsaXRpZXMgICAyIDIzIDQyIDcgMTEgKi8KKzYzNiwJLyogT0JKX3NldF9icmFuZF9JQVRBX0FUQSAgICAgICAgICAgMiAyMyA0MiA4IDEgKi8KKzY0MCwJLyogT0JKX3NldF9icmFuZF9WaXNhICAgICAgICAgICAgICAgMiAyMyA0MiA4IDQgKi8KKzY0MSwJLyogT0JKX3NldF9icmFuZF9NYXN0ZXJDYXJkICAgICAgICAgMiAyMyA0MiA4IDUgKi8KKzYzNywJLyogT0JKX3NldF9icmFuZF9EaW5lcnMgICAgICAgICAgICAgMiAyMyA0MiA4IDMwICovCis2MzgsCS8qIE9CSl9zZXRfYnJhbmRfQW1lcmljYW5FeHByZXNzICAgIDIgMjMgNDIgOCAzNCAqLworNjM5LAkvKiBPQkpfc2V0X2JyYW5kX0pDQiAgICAgICAgICAgICAgICAyIDIzIDQyIDggMzUgKi8KKzgwNSwJLyogT0JKX2NyeXB0b3BybyAgICAgICAgICAgICAgICAgICAgMSAyIDY0MyAyIDIgKi8KKzgwNiwJLyogT0JKX2NyeXB0b2NvbSAgICAgICAgICAgICAgICAgICAgMSAyIDY0MyAyIDkgKi8KKzE4NCwJLyogT0JKX1g5XzU3ICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMDA0MCAqLworNDA1LAkvKiBPQkpfYW5zaV9YOV82MiAgICAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1ICovCiszODksCS8qIE9CSl9FbnRlcnByaXNlcyAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAxICovCis1MDQsCS8qIE9CSl9taW1lX21ocyAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNyAxICovCisxMDQsCS8qIE9CSl9tZDVXaXRoUlNBICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgMyAqLworMjksCS8qIE9CSl9kZXNfZWNiICAgICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgNiAqLworMzEsCS8qIE9CSl9kZXNfY2JjICAgICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgNyAqLworNDUsCS8qIE9CSl9kZXNfb2ZiNjQgICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgOCAqLworMzAsCS8qIE9CSl9kZXNfY2ZiNjQgICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgOSAqLworMzc3LAkvKiBPQkpfcnNhU2lnbmF0dXJlICAgICAgICAgICAgICAgICAxIDMgMTQgMyAyIDExICovCis2NywJLyogT0JKX2RzYV8yICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiAxMiAqLworNjYsCS8qIE9CSl9kc2FXaXRoU0hBICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgMTMgKi8KKzQyLAkvKiBPQkpfc2hhV2l0aFJTQUVuY3J5cHRpb24gICAgICAgICAxIDMgMTQgMyAyIDE1ICovCiszMiwJLyogT0JKX2Rlc19lZGVfZWNiICAgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiAxNyAqLworNDEsCS8qIE9CSl9zaGEgICAgICAgICAgICAgICAgICAgICAgICAgIDEgMyAxNCAzIDIgMTggKi8KKzY0LAkvKiBPQkpfc2hhMSAgICAgICAgICAgICAgICAgICAgICAgICAxIDMgMTQgMyAyIDI2ICovCis3MCwJLyogT0JKX2RzYVdpdGhTSEExXzIgICAgICAgICAgICAgICAgMSAzIDE0IDMgMiAyNyAqLworMTE1LAkvKiBPQkpfc2hhMVdpdGhSU0EgICAgICAgICAgICAgICAgICAxIDMgMTQgMyAyIDI5ICovCisxMTcsCS8qIE9CSl9yaXBlbWQxNjAgICAgICAgICAgICAgICAgICAgIDEgMyAzNiAzIDIgMSAqLworMTQzLAkvKiBPQkpfc3huZXQgICAgICAgICAgICAgICAgICAgICAgICAxIDMgMTAxIDEgNCAxICovCis3MjEsCS8qIE9CSl9zZWN0MTYzazEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAxICovCis3MjIsCS8qIE9CSl9zZWN0MTYzcjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAyICovCis3MjgsCS8qIE9CSl9zZWN0MjM5azEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAzICovCis3MTcsCS8qIE9CSl9zZWN0MTEzcjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCA0ICovCis3MTgsCS8qIE9CSl9zZWN0MTEzcjIgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCA1ICovCis3MDQsCS8qIE9CSl9zZWNwMTEycjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCA2ICovCis3MDUsCS8qIE9CSl9zZWNwMTEycjIgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCA3ICovCis3MDksCS8qIE9CSl9zZWNwMTYwcjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCA4ICovCis3MDgsCS8qIE9CSl9zZWNwMTYwazEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCA5ICovCis3MTQsCS8qIE9CSl9zZWNwMjU2azEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAxMCAqLworNzIzLAkvKiBPQkpfc2VjdDE2M3IyICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMTUgKi8KKzcyOSwJLyogT0JKX3NlY3QyODNrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDE2ICovCis3MzAsCS8qIE9CSl9zZWN0MjgzcjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAxNyAqLworNzE5LAkvKiBPQkpfc2VjdDEzMXIxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMjIgKi8KKzcyMCwJLyogT0JKX3NlY3QxMzFyMiAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDIzICovCis3MjQsCS8qIE9CSl9zZWN0MTkzcjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAyNCAqLworNzI1LAkvKiBPQkpfc2VjdDE5M3IyICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMjUgKi8KKzcyNiwJLyogT0JKX3NlY3QyMzNrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDI2ICovCis3MjcsCS8qIE9CSl9zZWN0MjMzcjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAyNyAqLworNzA2LAkvKiBPQkpfc2VjcDEyOHIxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMjggKi8KKzcwNywJLyogT0JKX3NlY3AxMjhyMiAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDI5ICovCis3MTAsCS8qIE9CSl9zZWNwMTYwcjIgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAzMCAqLworNzExLAkvKiBPQkpfc2VjcDE5MmsxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMzEgKi8KKzcxMiwJLyogT0JKX3NlY3AyMjRrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDMyICovCis3MTMsCS8qIE9CSl9zZWNwMjI0cjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAzMyAqLworNzE1LAkvKiBPQkpfc2VjcDM4NHIxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMzQgKi8KKzcxNiwJLyogT0JKX3NlY3A1MjFyMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDM1ICovCis3MzEsCS8qIE9CSl9zZWN0NDA5azEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAzNiAqLworNzMyLAkvKiBPQkpfc2VjdDQwOXIxICAgICAgICAgICAgICAgICAgICAxIDMgMTMyIDAgMzcgKi8KKzczMywJLyogT0JKX3NlY3Q1NzFrMSAgICAgICAgICAgICAgICAgICAgMSAzIDEzMiAwIDM4ICovCis3MzQsCS8qIE9CSl9zZWN0NTcxcjEgICAgICAgICAgICAgICAgICAgIDEgMyAxMzIgMCAzOSAqLworNjI0LAkvKiBPQkpfc2V0X3Jvb3RLZXlUaHVtYiAgICAgICAgICAgICAyIDIzIDQyIDMgMCAwICovCis2MjUsCS8qIE9CSl9zZXRfYWRkUG9saWN5ICAgICAgICAgICAgICAgIDIgMjMgNDIgMyAwIDEgKi8KKzYyNiwJLyogT0JKX3NldEF0dHJfVG9rZW5fRU1WICAgICAgICAgICAgMiAyMyA0MiAzIDIgMSAqLworNjI3LAkvKiBPQkpfc2V0QXR0cl9Ub2tlbl9CMFByaW1lICAgICAgICAyIDIzIDQyIDMgMiAyICovCis2MjgsCS8qIE9CSl9zZXRBdHRyX0lzc0NhcF9DVk0gICAgICAgICAgIDIgMjMgNDIgMyAzIDMgKi8KKzYyOSwJLyogT0JKX3NldEF0dHJfSXNzQ2FwX1QyICAgICAgICAgICAgMiAyMyA0MiAzIDMgNCAqLworNjMwLAkvKiBPQkpfc2V0QXR0cl9Jc3NDYXBfU2lnICAgICAgICAgICAyIDIzIDQyIDMgMyA1ICovCis2NDIsCS8qIE9CSl9zZXRfYnJhbmRfTm92dXMgICAgICAgICAgICAgIDIgMjMgNDIgOCA2MDExICovCis3MzUsCS8qIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxICAgICAgIDIgMjMgNDMgMSA0IDEgKi8KKzczNiwJLyogT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczMgICAgICAgMiAyMyA0MyAxIDQgMyAqLworNzM3LAkvKiBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzNCAgICAgICAyIDIzIDQzIDEgNCA0ICovCis3MzgsCS8qIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM1ICAgICAgIDIgMjMgNDMgMSA0IDUgKi8KKzczOSwJLyogT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczYgICAgICAgMiAyMyA0MyAxIDQgNiAqLworNzQwLAkvKiBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzNyAgICAgICAyIDIzIDQzIDEgNCA3ICovCis3NDEsCS8qIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM4ICAgICAgIDIgMjMgNDMgMSA0IDggKi8KKzc0MiwJLyogT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczkgICAgICAgMiAyMyA0MyAxIDQgOSAqLworNzQzLAkvKiBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTAgICAgICAyIDIzIDQzIDEgNCAxMCAqLworNzQ0LAkvKiBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTEgICAgICAyIDIzIDQzIDEgNCAxMSAqLworNzQ1LAkvKiBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTIgICAgICAyIDIzIDQzIDEgNCAxMiAqLworODA0LAkvKiBPQkpfd2hpcmxwb29sICAgICAgICAgICAgICAgICAgICAxIDAgMTAxMTggMyAwIDU1ICovCisxMjQsCS8qIE9CSl9ybGVfY29tcHJlc3Npb24gICAgICAgICAgICAgIDEgMSAxIDEgNjY2IDEgKi8KKzc3MywJLyogT0JKX2tpc2EgICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDQxMCAyMDAwMDQgKi8KKzgwNywJLyogT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxIDEgMiA2NDMgMiAyIDMgKi8KKzgwOCwJLyogT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NCAxIDIgNjQzIDIgMiA0ICovCis4MDksCS8qIE9CSl9pZF9Hb3N0UjM0MTFfOTQgICAgICAgICAgICAgIDEgMiA2NDMgMiAyIDkgKi8KKzgxMCwJLyogT0JKX2lkX0hNQUNHb3N0UjM0MTFfOTQgICAgICAgICAgMSAyIDY0MyAyIDIgMTAgKi8KKzgxMSwJLyogT0JKX2lkX0dvc3RSMzQxMF8yMDAxICAgICAgICAgICAgMSAyIDY0MyAyIDIgMTkgKi8KKzgxMiwJLyogT0JKX2lkX0dvc3RSMzQxMF85NCAgICAgICAgICAgICAgMSAyIDY0MyAyIDIgMjAgKi8KKzgxMywJLyogT0JKX2lkX0dvc3QyODE0N184OSAgICAgICAgICAgICAgMSAyIDY0MyAyIDIgMjEgKi8KKzgxNSwJLyogT0JKX2lkX0dvc3QyODE0N184OV9NQUMgICAgICAgICAgMSAyIDY0MyAyIDIgMjIgKi8KKzgxNiwJLyogT0JKX2lkX0dvc3RSMzQxMV85NF9wcmYgICAgICAgICAgMSAyIDY0MyAyIDIgMjMgKi8KKzgxNywJLyogT0JKX2lkX0dvc3RSMzQxMF8yMDAxREggICAgICAgICAgMSAyIDY0MyAyIDIgOTggKi8KKzgxOCwJLyogT0JKX2lkX0dvc3RSMzQxMF85NERIICAgICAgICAgICAgMSAyIDY0MyAyIDIgOTkgKi8KKyAxLAkvKiBPQkpfcnNhZHNpICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAqLworMTg1LAkvKiBPQkpfWDljbSAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQwIDQgKi8KKzEyNywJLyogT0JKX2lkX3BraXggICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAqLworNTA1LAkvKiBPQkpfbWltZV9taHNfaGVhZGluZ3MgICAgICAgICAgICAxIDMgNiAxIDcgMSAxICovCis1MDYsCS8qIE9CSl9taW1lX21oc19ib2RpZXMgICAgICAgICAgICAgIDEgMyA2IDEgNyAxIDIgKi8KKzExOSwJLyogT0JKX3JpcGVtZDE2MFdpdGhSU0EgICAgICAgICAgICAgMSAzIDM2IDMgMyAxIDIgKi8KKzYzMSwJLyogT0JKX3NldEF0dHJfR2VuQ3J5cHRncm0gICAgICAgICAgMiAyMyA0MiAzIDMgMyAxICovCis2MzIsCS8qIE9CSl9zZXRBdHRyX1QyRW5jICAgICAgICAgICAgICAgIDIgMjMgNDIgMyAzIDQgMSAqLworNjMzLAkvKiBPQkpfc2V0QXR0cl9UMmNsZWFydHh0ICAgICAgICAgICAyIDIzIDQyIDMgMyA0IDIgKi8KKzYzNCwJLyogT0JKX3NldEF0dHJfVG9rSUNDc2lnICAgICAgICAgICAgMiAyMyA0MiAzIDMgNSAxICovCis2MzUsCS8qIE9CSl9zZXRBdHRyX1NlY0RldlNpZyAgICAgICAgICAgIDIgMjMgNDIgMyAzIDUgMiAqLworNDM2LAkvKiBPQkpfdWNsICAgICAgICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAqLworODIwLAkvKiBPQkpfaWRfR29zdDI4MTQ3Xzg5X05vbmVfS2V5TWVzaGluZyAxIDIgNjQzIDIgMiAxNCAwICovCis4MTksCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0tleU1lc2hpbmcgMSAyIDY0MyAyIDIgMTQgMSAqLworODQ1LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X2EgICAgICAgICAgICAxIDIgNjQzIDIgMiAyMCAxICovCis4NDYsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfOTRfYUJpcyAgICAgICAgIDEgMiA2NDMgMiAyIDIwIDIgKi8KKzg0NywJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9iICAgICAgICAgICAgMSAyIDY0MyAyIDIgMjAgMyAqLworODQ4LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X2JCaXMgICAgICAgICAxIDIgNjQzIDIgMiAyMCA0ICovCis4MjEsCS8qIE9CSl9pZF9Hb3N0UjM0MTFfOTRfVGVzdFBhcmFtU2V0IDEgMiA2NDMgMiAyIDMwIDAgKi8KKzgyMiwJLyogT0JKX2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMCAxICovCis4MjMsCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfVGVzdFBhcmFtU2V0IDEgMiA2NDMgMiAyIDMxIDAgKi8KKzgyNCwJLyogT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMSAxICovCis4MjUsCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0JfUGFyYW1TZXQgMSAyIDY0MyAyIDIgMzEgMiAqLworODI2LAkvKiBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19DX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMxIDMgKi8KKzgyNywJLyogT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fRF9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMSA0ICovCis4MjgsCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMSA1ICovCis4MjksCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMF9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMSA2ICovCis4MzAsCS8qIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX1JJQ18xX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMxIDcgKi8KKzgzMSwJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9UZXN0UGFyYW1TZXQgMSAyIDY0MyAyIDIgMzIgMCAqLworODMyLAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19BX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMyIDIgKi8KKzgzMywJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQl9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMiAzICovCis4MzQsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0NfUGFyYW1TZXQgMSAyIDY0MyAyIDIgMzIgNCAqLworODM1LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19EX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMyIDUgKi8KKzgzNiwJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzMyAxICovCis4MzcsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQgMSAyIDY0MyAyIDIgMzMgMiAqLworODM4LAkvKiBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hDX1BhcmFtU2V0IDEgMiA2NDMgMiAyIDMzIDMgKi8KKzgzOSwJLyogT0JKX2lkX0dvc3RSMzQxMF8yMDAxX1Rlc3RQYXJhbVNldCAxIDIgNjQzIDIgMiAzNSAwICovCis4NDAsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzNSAxICovCis4NDEsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQl9QYXJhbVNldCAxIDIgNjQzIDIgMiAzNSAyICovCis4NDIsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQ19QYXJhbVNldCAxIDIgNjQzIDIgMiAzNSAzICovCis4NDMsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldCAxIDIgNjQzIDIgMiAzNiAwICovCis4NDQsCS8qIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldCAxIDIgNjQzIDIgMiAzNiAxICovCisgMiwJLyogT0JKX3BrY3MgICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSAqLworNDMxLAkvKiBPQkpfaG9sZF9pbnN0cnVjdGlvbl9ub25lICAgICAgICAxIDIgODQwIDEwMDQwIDIgMSAqLworNDMyLAkvKiBPQkpfaG9sZF9pbnN0cnVjdGlvbl9jYWxsX2lzc3VlciAxIDIgODQwIDEwMDQwIDIgMiAqLworNDMzLAkvKiBPQkpfaG9sZF9pbnN0cnVjdGlvbl9yZWplY3QgICAgICAxIDIgODQwIDEwMDQwIDIgMyAqLworMTE2LAkvKiBPQkpfZHNhICAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQwIDQgMSAqLworMTEzLAkvKiBPQkpfZHNhV2l0aFNIQTEgICAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQwIDQgMyAqLworNDA2LAkvKiBPQkpfWDlfNjJfcHJpbWVfZmllbGQgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDEgMSAqLworNDA3LAkvKiBPQkpfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkIDEgMiA4NDAgMTAwNDUgMSAyICovCis0MDgsCS8qIE9CSl9YOV82Ml9pZF9lY1B1YmxpY0tleSAgICAgICAgIDEgMiA4NDAgMTAwNDUgMiAxICovCis0MTYsCS8qIE9CSl9lY2RzYV93aXRoX1NIQTEgICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgNCAxICovCis3OTEsCS8qIE9CSl9lY2RzYV93aXRoX1JlY29tbWVuZGVkICAgICAgIDEgMiA4NDAgMTAwNDUgNCAyICovCis3OTIsCS8qIE9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCAgICAgICAgIDEgMiA4NDAgMTAwNDUgNCAzICovCisyNTgsCS8qIE9CSl9pZF9wa2l4X21vZCAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMCAqLworMTc1LAkvKiBPQkpfaWRfcGUgICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEgKi8KKzI1OSwJLyogT0JKX2lkX3F0ICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyICovCisxMjgsCS8qIE9CSl9pZF9rcCAgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMyAqLworMjYwLAkvKiBPQkpfaWRfaXQgICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDQgKi8KKzI2MSwJLyogT0JKX2lkX3BraXAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA1ICovCisyNjIsCS8qIE9CSl9pZF9hbGcgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNiAqLworMjYzLAkvKiBPQkpfaWRfY21jICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgKi8KKzI2NCwJLyogT0JKX2lkX29uICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA4ICovCisyNjUsCS8qIE9CSl9pZF9wZGEgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOSAqLworMjY2LAkvKiBPQkpfaWRfYWNhICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEwICovCisyNjcsCS8qIE9CSl9pZF9xY3MgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMTEgKi8KKzI2OCwJLyogT0JKX2lkX2NjdCAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxMiAqLworNjYyLAkvKiBPQkpfaWRfcHBsICAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDIxICovCisxNzYsCS8qIE9CSl9pZF9hZCAgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggKi8KKzUwNywJLyogT0JKX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UgICAgICAgMSAzIDYgMSA3IDEgMSAxICovCis1MDgsCS8qIE9CSl9pZF9oZXhfbXVsdGlwYXJ0X21lc3NhZ2UgICAgIDEgMyA2IDEgNyAxIDEgMiAqLworNTcsCS8qIE9CSl9uZXRzY2FwZSAgICAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTEzNzMwICovCis3NTQsCS8qIE9CSl9jYW1lbGxpYV8xMjhfZWNiICAgICAgICAgICAgIDAgMyA0NDAxIDUgMyAxIDkgMSAqLworNzY2LAkvKiBPQkpfY2FtZWxsaWFfMTI4X29mYjEyOCAgICAgICAgICAwIDMgNDQwMSA1IDMgMSA5IDMgKi8KKzc1NywJLyogT0JKX2NhbWVsbGlhXzEyOF9jZmIxMjggICAgICAgICAgMCAzIDQ0MDEgNSAzIDEgOSA0ICovCis3NTUsCS8qIE9CSl9jYW1lbGxpYV8xOTJfZWNiICAgICAgICAgICAgIDAgMyA0NDAxIDUgMyAxIDkgMjEgKi8KKzc2NywJLyogT0JKX2NhbWVsbGlhXzE5Ml9vZmIxMjggICAgICAgICAgMCAzIDQ0MDEgNSAzIDEgOSAyMyAqLworNzU4LAkvKiBPQkpfY2FtZWxsaWFfMTkyX2NmYjEyOCAgICAgICAgICAwIDMgNDQwMSA1IDMgMSA5IDI0ICovCis3NTYsCS8qIE9CSl9jYW1lbGxpYV8yNTZfZWNiICAgICAgICAgICAgIDAgMyA0NDAxIDUgMyAxIDkgNDEgKi8KKzc2OCwJLyogT0JKX2NhbWVsbGlhXzI1Nl9vZmIxMjggICAgICAgICAgMCAzIDQ0MDEgNSAzIDEgOSA0MyAqLworNzU5LAkvKiBPQkpfY2FtZWxsaWFfMjU2X2NmYjEyOCAgICAgICAgICAwIDMgNDQwMSA1IDMgMSA5IDQ0ICovCis0MzcsCS8qIE9CSl9waWxvdCAgICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAqLworNzc2LAkvKiBPQkpfc2VlZF9lY2IgICAgICAgICAgICAgICAgICAgICAxIDIgNDEwIDIwMDAwNCAxIDMgKi8KKzc3NywJLyogT0JKX3NlZWRfY2JjICAgICAgICAgICAgICAgICAgICAgMSAyIDQxMCAyMDAwMDQgMSA0ICovCis3NzksCS8qIE9CSl9zZWVkX2NmYjEyOCAgICAgICAgICAgICAgICAgIDEgMiA0MTAgMjAwMDA0IDEgNSAqLworNzc4LAkvKiBPQkpfc2VlZF9vZmIxMjggICAgICAgICAgICAgICAgICAxIDIgNDEwIDIwMDAwNCAxIDYgKi8KKzg1MiwJLyogT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYyAxIDIgNjQzIDIgOSAxIDMgMyAqLworODUzLAkvKiBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDFfY2MgMSAyIDY0MyAyIDkgMSAzIDQgKi8KKzg1MCwJLyogT0JKX2lkX0dvc3RSMzQxMF85NF9jYyAgICAgICAgICAgMSAyIDY0MyAyIDkgMSA1IDMgKi8KKzg1MSwJLyogT0JKX2lkX0dvc3RSMzQxMF8yMDAxX2NjICAgICAgICAgMSAyIDY0MyAyIDkgMSA1IDQgKi8KKzg0OSwJLyogT0JKX2lkX0dvc3QyODE0N184OV9jYyAgICAgICAgICAgMSAyIDY0MyAyIDkgMSA2IDEgKi8KKzg1NCwJLyogT0JKX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjIDEgMiA2NDMgMiA5IDEgOCAxICovCisxODYsCS8qIE9CSl9wa2NzMSAgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMSAqLworMjcsCS8qIE9CSl9wa2NzMyAgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMyAqLworMTg3LAkvKiBPQkpfcGtjczUgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDUgKi8KKzIwLAkvKiBPQkpfcGtjczcgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDcgKi8KKzQ3LAkvKiBPQkpfcGtjczkgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgKi8KKyAzLAkvKiBPQkpfbWQyICAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAyIDIgKi8KKzI1NywJLyogT0JKX21kNCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMiA0ICovCisgNCwJLyogT0JKX21kNSAgICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMiA1ICovCis3OTcsCS8qIE9CSl9obWFjV2l0aE1ENSAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDIgNiAqLworMTYzLAkvKiBPQkpfaG1hY1dpdGhTSEExICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAyIDcgKi8KKzc5OCwJLyogT0JKX2htYWNXaXRoU0hBMjI0ICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMiA4ICovCis3OTksCS8qIE9CSl9obWFjV2l0aFNIQTI1NiAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDIgOSAqLworODAwLAkvKiBPQkpfaG1hY1dpdGhTSEEzODQgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAyIDEwICovCis4MDEsCS8qIE9CSl9obWFjV2l0aFNIQTUxMiAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDIgMTEgKi8KKzM3LAkvKiBPQkpfcmMyX2NiYyAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAzIDIgKi8KKyA1LAkvKiBPQkpfcmM0ICAgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAzIDQgKi8KKzQ0LAkvKiBPQkpfZGVzX2VkZTNfY2JjICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAzIDcgKi8KKzEyMCwJLyogT0JKX3JjNV9jYmMgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMyA4ICovCis2NDMsCS8qIE9CSl9kZXNfY2RtZiAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDMgMTAgKi8KKzY4MCwJLyogT0JKX1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcyAxIDIgODQwIDEwMDQ1IDEgMiAzICovCis2ODQsCS8qIE9CSl9YOV82Ml9jMnBuYjE2M3YxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDEgKi8KKzY4NSwJLyogT0JKX1g5XzYyX2MycG5iMTYzdjIgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDAgMiAqLworNjg2LAkvKiBPQkpfWDlfNjJfYzJwbmIxNjN2MyAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMCAzICovCis2ODcsCS8qIE9CSl9YOV82Ml9jMnBuYjE3NnYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDQgKi8KKzY4OCwJLyogT0JKX1g5XzYyX2MydG5iMTkxdjEgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDAgNSAqLworNjg5LAkvKiBPQkpfWDlfNjJfYzJ0bmIxOTF2MiAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMCA2ICovCis2OTAsCS8qIE9CSl9YOV82Ml9jMnRuYjE5MXYzICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDcgKi8KKzY5MSwJLyogT0JKX1g5XzYyX2Myb25iMTkxdjQgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDAgOCAqLworNjkyLAkvKiBPQkpfWDlfNjJfYzJvbmIxOTF2NSAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMCA5ICovCis2OTMsCS8qIE9CSl9YOV82Ml9jMnBuYjIwOHcxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDEwICovCis2OTQsCS8qIE9CSl9YOV82Ml9jMnRuYjIzOXYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDExICovCis2OTUsCS8qIE9CSl9YOV82Ml9jMnRuYjIzOXYyICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDEyICovCis2OTYsCS8qIE9CSl9YOV82Ml9jMnRuYjIzOXYzICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDEzICovCis2OTcsCS8qIE9CSl9YOV82Ml9jMm9uYjIzOXY0ICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE0ICovCis2OTgsCS8qIE9CSl9YOV82Ml9jMm9uYjIzOXY1ICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE1ICovCis2OTksCS8qIE9CSl9YOV82Ml9jMnBuYjI3MncxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE2ICovCis3MDAsCS8qIE9CSl9YOV82Ml9jMnBuYjMwNHcxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE3ICovCis3MDEsCS8qIE9CSl9YOV82Ml9jMnRuYjM1OXYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE4ICovCis3MDIsCS8qIE9CSl9YOV82Ml9jMnBuYjM2OHcxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDE5ICovCis3MDMsCS8qIE9CSl9YOV82Ml9jMnRuYjQzMXIxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAwIDIwICovCis0MDksCS8qIE9CSl9YOV82Ml9wcmltZTE5MnYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAxIDEgKi8KKzQxMCwJLyogT0JKX1g5XzYyX3ByaW1lMTkydjIgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDEgMiAqLworNDExLAkvKiBPQkpfWDlfNjJfcHJpbWUxOTJ2MyAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMSAzICovCis0MTIsCS8qIE9CSl9YOV82Ml9wcmltZTIzOXYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAxIDQgKi8KKzQxMywJLyogT0JKX1g5XzYyX3ByaW1lMjM5djIgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAzIDEgNSAqLworNDE0LAkvKiBPQkpfWDlfNjJfcHJpbWUyMzl2MyAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDMgMSA2ICovCis0MTUsCS8qIE9CSl9YOV82Ml9wcmltZTI1NnYxICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMyAxIDcgKi8KKzc5MywJLyogT0JKX2VjZHNhX3dpdGhfU0hBMjI0ICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSA0IDMgMSAqLworNzk0LAkvKiBPQkpfZWNkc2Ffd2l0aF9TSEEyNTYgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDQgMyAyICovCis3OTUsCS8qIE9CSl9lY2RzYV93aXRoX1NIQTM4NCAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgNCAzIDMgKi8KKzc5NiwJLyogT0JKX2VjZHNhX3dpdGhfU0hBNTEyICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSA0IDMgNCAqLworMjY5LAkvKiBPQkpfaWRfcGtpeDFfZXhwbGljaXRfODggICAgICAgICAxIDMgNiAxIDUgNSA3IDAgMSAqLworMjcwLAkvKiBPQkpfaWRfcGtpeDFfaW1wbGljaXRfODggICAgICAgICAxIDMgNiAxIDUgNSA3IDAgMiAqLworMjcxLAkvKiBPQkpfaWRfcGtpeDFfZXhwbGljaXRfOTMgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgMyAqLworMjcyLAkvKiBPQkpfaWRfcGtpeDFfaW1wbGljaXRfOTMgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgNCAqLworMjczLAkvKiBPQkpfaWRfbW9kX2NybWYgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgNSAqLworMjc0LAkvKiBPQkpfaWRfbW9kX2NtYyAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgNiAqLworMjc1LAkvKiBPQkpfaWRfbW9kX2tlYV9wcm9maWxlXzg4ICAgICAgICAxIDMgNiAxIDUgNSA3IDAgNyAqLworMjc2LAkvKiBPQkpfaWRfbW9kX2tlYV9wcm9maWxlXzkzICAgICAgICAxIDMgNiAxIDUgNSA3IDAgOCAqLworMjc3LAkvKiBPQkpfaWRfbW9kX2NtcCAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgOSAqLworMjc4LAkvKiBPQkpfaWRfbW9kX3F1YWxpZmllZF9jZXJ0Xzg4ICAgICAxIDMgNiAxIDUgNSA3IDAgMTAgKi8KKzI3OSwJLyogT0JKX2lkX21vZF9xdWFsaWZpZWRfY2VydF85MyAgICAgMSAzIDYgMSA1IDUgNyAwIDExICovCisyODAsCS8qIE9CSl9pZF9tb2RfYXR0cmlidXRlX2NlcnQgICAgICAgIDEgMyA2IDEgNSA1IDcgMCAxMiAqLworMjgxLAkvKiBPQkpfaWRfbW9kX3RpbWVzdGFtcF9wcm90b2NvbCAgICAxIDMgNiAxIDUgNSA3IDAgMTMgKi8KKzI4MiwJLyogT0JKX2lkX21vZF9vY3NwICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAwIDE0ICovCisyODMsCS8qIE9CSl9pZF9tb2RfZHZjcyAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMCAxNSAqLworMjg0LAkvKiBPQkpfaWRfbW9kX2NtcDIwMDAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDAgMTYgKi8KKzE3NywJLyogT0JKX2luZm9fYWNjZXNzICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDEgKi8KKzI4NSwJLyogT0JKX2Jpb21ldHJpY0luZm8gICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDIgKi8KKzI4NiwJLyogT0JKX3FjU3RhdGVtZW50cyAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDMgKi8KKzI4NywJLyogT0JKX2FjX2F1ZGl0RW50aXR5ICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDQgKi8KKzI4OCwJLyogT0JKX2FjX3RhcmdldGluZyAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDUgKi8KKzI4OSwJLyogT0JKX2FhQ29udHJvbHMgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDYgKi8KKzI5MCwJLyogT0JKX3NiZ3BfaXBBZGRyQmxvY2sgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDcgKi8KKzI5MSwJLyogT0JKX3NiZ3BfYXV0b25vbW91c1N5c051bSAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDggKi8KKzI5MiwJLyogT0JKX3NiZ3Bfcm91dGVySWRlbnRpZmllciAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDkgKi8KKzM5NywJLyogT0JKX2FjX3Byb3h5aW5nICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxIDEwICovCiszOTgsCS8qIE9CSl9zaW5mb19hY2Nlc3MgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMSAxMSAqLworNjYzLAkvKiBPQkpfcHJveHlDZXJ0SW5mbyAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEgMTQgKi8KKzE2NCwJLyogT0JKX2lkX3F0X2NwcyAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyIDEgKi8KKzE2NSwJLyogT0JKX2lkX3F0X3Vub3RpY2UgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyIDIgKi8KKzI5MywJLyogT0JKX3RleHROb3RpY2UgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyIDMgKi8KKzEyOSwJLyogT0JKX3NlcnZlcl9hdXRoICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDEgKi8KKzEzMCwJLyogT0JKX2NsaWVudF9hdXRoICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDIgKi8KKzEzMSwJLyogT0JKX2NvZGVfc2lnbiAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDMgKi8KKzEzMiwJLyogT0JKX2VtYWlsX3Byb3RlY3QgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDQgKi8KKzI5NCwJLyogT0JKX2lwc2VjRW5kU3lzdGVtICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDUgKi8KKzI5NSwJLyogT0JKX2lwc2VjVHVubmVsICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDYgKi8KKzI5NiwJLyogT0JKX2lwc2VjVXNlciAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDcgKi8KKzEzMywJLyogT0JKX3RpbWVfc3RhbXAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDggKi8KKzE4MCwJLyogT0JKX09DU1Bfc2lnbiAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDkgKi8KKzI5NywJLyogT0JKX2R2Y3MgICAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAzIDEwICovCisyOTgsCS8qIE9CSl9pZF9pdF9jYVByb3RFbmNDZXJ0ICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNCAxICovCisyOTksCS8qIE9CSl9pZF9pdF9zaWduS2V5UGFpclR5cGVzICAgICAgIDEgMyA2IDEgNSA1IDcgNCAyICovCiszMDAsCS8qIE9CSl9pZF9pdF9lbmNLZXlQYWlyVHlwZXMgICAgICAgIDEgMyA2IDEgNSA1IDcgNCAzICovCiszMDEsCS8qIE9CSl9pZF9pdF9wcmVmZXJyZWRTeW1tQWxnICAgICAgIDEgMyA2IDEgNSA1IDcgNCA0ICovCiszMDIsCS8qIE9CSl9pZF9pdF9jYUtleVVwZGF0ZUluZm8gICAgICAgIDEgMyA2IDEgNSA1IDcgNCA1ICovCiszMDMsCS8qIE9CSl9pZF9pdF9jdXJyZW50Q1JMICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNCA2ICovCiszMDQsCS8qIE9CSl9pZF9pdF91bnN1cHBvcnRlZE9JRHMgICAgICAgIDEgMyA2IDEgNSA1IDcgNCA3ICovCiszMDUsCS8qIE9CSl9pZF9pdF9zdWJzY3JpcHRpb25SZXF1ZXN0ICAgIDEgMyA2IDEgNSA1IDcgNCA4ICovCiszMDYsCS8qIE9CSl9pZF9pdF9zdWJzY3JpcHRpb25SZXNwb25zZSAgIDEgMyA2IDEgNSA1IDcgNCA5ICovCiszMDcsCS8qIE9CSl9pZF9pdF9rZXlQYWlyUGFyYW1SZXEgICAgICAgIDEgMyA2IDEgNSA1IDcgNCAxMCAqLworMzA4LAkvKiBPQkpfaWRfaXRfa2V5UGFpclBhcmFtUmVwICAgICAgICAxIDMgNiAxIDUgNSA3IDQgMTEgKi8KKzMwOSwJLyogT0JKX2lkX2l0X3JldlBhc3NwaHJhc2UgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0IDEyICovCiszMTAsCS8qIE9CSl9pZF9pdF9pbXBsaWNpdENvbmZpcm0gICAgICAgIDEgMyA2IDEgNSA1IDcgNCAxMyAqLworMzExLAkvKiBPQkpfaWRfaXRfY29uZmlybVdhaXRUaW1lICAgICAgICAxIDMgNiAxIDUgNSA3IDQgMTQgKi8KKzMxMiwJLyogT0JKX2lkX2l0X29yaWdQS0lNZXNzYWdlICAgICAgICAgMSAzIDYgMSA1IDUgNyA0IDE1ICovCis3ODQsCS8qIE9CSl9pZF9pdF9zdXBwTGFuZ1RhZ3MgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNCAxNiAqLworMzEzLAkvKiBPQkpfaWRfcmVnQ3RybCAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDUgMSAqLworMzE0LAkvKiBPQkpfaWRfcmVnSW5mbyAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDUgMiAqLworMzIzLAkvKiBPQkpfaWRfYWxnX2RlczQwICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDYgMSAqLworMzI0LAkvKiBPQkpfaWRfYWxnX25vU2lnbmF0dXJlICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDYgMiAqLworMzI1LAkvKiBPQkpfaWRfYWxnX2RoX3NpZ19obWFjX3NoYTEgICAgICAxIDMgNiAxIDUgNSA3IDYgMyAqLworMzI2LAkvKiBPQkpfaWRfYWxnX2RoX3BvcCAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDYgNCAqLworMzI3LAkvKiBPQkpfaWRfY21jX3N0YXR1c0luZm8gICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMSAqLworMzI4LAkvKiBPQkpfaWRfY21jX2lkZW50aWZpY2F0aW9uICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMiAqLworMzI5LAkvKiBPQkpfaWRfY21jX2lkZW50aXR5UHJvb2YgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMyAqLworMzMwLAkvKiBPQkpfaWRfY21jX2RhdGFSZXR1cm4gICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgNCAqLworMzMxLAkvKiBPQkpfaWRfY21jX3RyYW5zYWN0aW9uSWQgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgNSAqLworMzMyLAkvKiBPQkpfaWRfY21jX3NlbmRlck5vbmNlICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgNiAqLworMzMzLAkvKiBPQkpfaWRfY21jX3JlY2lwaWVudE5vbmNlICAgICAgICAxIDMgNiAxIDUgNSA3IDcgNyAqLworMzM0LAkvKiBPQkpfaWRfY21jX2FkZEV4dGVuc2lvbnMgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgOCAqLworMzM1LAkvKiBPQkpfaWRfY21jX2VuY3J5cHRlZFBPUCAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgOSAqLworMzM2LAkvKiBPQkpfaWRfY21jX2RlY3J5cHRlZFBPUCAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMTAgKi8KKzMzNywJLyogT0JKX2lkX2NtY19scmFQT1BXaXRuZXNzICAgICAgICAgMSAzIDYgMSA1IDUgNyA3IDExICovCiszMzgsCS8qIE9CSl9pZF9jbWNfZ2V0Q2VydCAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNyAxNSAqLworMzM5LAkvKiBPQkpfaWRfY21jX2dldENSTCAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMTYgKi8KKzM0MCwJLyogT0JKX2lkX2NtY19yZXZva2VSZXF1ZXN0ICAgICAgICAgMSAzIDYgMSA1IDUgNyA3IDE3ICovCiszNDEsCS8qIE9CSl9pZF9jbWNfcmVnSW5mbyAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNyAxOCAqLworMzQyLAkvKiBPQkpfaWRfY21jX3Jlc3BvbnNlSW5mbyAgICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMTkgKi8KKzM0MywJLyogT0JKX2lkX2NtY19xdWVyeVBlbmRpbmcgICAgICAgICAgMSAzIDYgMSA1IDUgNyA3IDIxICovCiszNDQsCS8qIE9CSl9pZF9jbWNfcG9wTGlua1JhbmRvbSAgICAgICAgIDEgMyA2IDEgNSA1IDcgNyAyMiAqLworMzQ1LAkvKiBPQkpfaWRfY21jX3BvcExpbmtXaXRuZXNzICAgICAgICAxIDMgNiAxIDUgNSA3IDcgMjMgKi8KKzM0NiwJLyogT0JKX2lkX2NtY19jb25maXJtQ2VydEFjY2VwdGFuY2UgMSAzIDYgMSA1IDUgNyA3IDI0ICovCiszNDcsCS8qIE9CSl9pZF9vbl9wZXJzb25hbERhdGEgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOCAxICovCis4NTgsCS8qIE9CSl9pZF9vbl9wZXJtYW5lbnRJZGVudGlmaWVyICAgIDEgMyA2IDEgNSA1IDcgOCAzICovCiszNDgsCS8qIE9CSl9pZF9wZGFfZGF0ZU9mQmlydGggICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOSAxICovCiszNDksCS8qIE9CSl9pZF9wZGFfcGxhY2VPZkJpcnRoICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOSAyICovCiszNTEsCS8qIE9CSl9pZF9wZGFfZ2VuZGVyICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgOSAzICovCiszNTIsCS8qIE9CSl9pZF9wZGFfY291bnRyeU9mQ2l0aXplbnNoaXAgIDEgMyA2IDEgNSA1IDcgOSA0ICovCiszNTMsCS8qIE9CSl9pZF9wZGFfY291bnRyeU9mUmVzaWRlbmNlICAgIDEgMyA2IDEgNSA1IDcgOSA1ICovCiszNTQsCS8qIE9CSl9pZF9hY2FfYXV0aGVudGljYXRpb25JbmZvICAgIDEgMyA2IDEgNSA1IDcgMTAgMSAqLworMzU1LAkvKiBPQkpfaWRfYWNhX2FjY2Vzc0lkZW50aXR5ICAgICAgICAxIDMgNiAxIDUgNSA3IDEwIDIgKi8KKzM1NiwJLyogT0JKX2lkX2FjYV9jaGFyZ2luZ0lkZW50aXR5ICAgICAgMSAzIDYgMSA1IDUgNyAxMCAzICovCiszNTcsCS8qIE9CSl9pZF9hY2FfZ3JvdXAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMTAgNCAqLworMzU4LAkvKiBPQkpfaWRfYWNhX3JvbGUgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEwIDUgKi8KKzM5OSwJLyogT0JKX2lkX2FjYV9lbmNBdHRycyAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxMCA2ICovCiszNTksCS8qIE9CSl9pZF9xY3NfcGtpeFFDU3ludGF4X3YxICAgICAgIDEgMyA2IDEgNSA1IDcgMTEgMSAqLworMzYwLAkvKiBPQkpfaWRfY2N0X2NycyAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDEyIDEgKi8KKzM2MSwJLyogT0JKX2lkX2NjdF9QS0lEYXRhICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAxMiAyICovCiszNjIsCS8qIE9CSl9pZF9jY3RfUEtJUmVzcG9uc2UgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMTIgMyAqLworNjY0LAkvKiBPQkpfaWRfcHBsX2FueUxhbmd1YWdlICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDIxIDAgKi8KKzY2NSwJLyogT0JKX2lkX3BwbF9pbmhlcml0QWxsICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyAyMSAxICovCis2NjcsCS8qIE9CSl9JbmRlcGVuZGVudCAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgMjEgMiAqLworMTc4LAkvKiBPQkpfYWRfT0NTUCAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDQ4IDEgKi8KKzE3OSwJLyogT0JKX2FkX2NhX2lzc3VlcnMgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0OCAyICovCiszNjMsCS8qIE9CSl9hZF90aW1lU3RhbXBpbmcgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggMyAqLworMzY0LAkvKiBPQkpfYWRfZHZjcyAgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDUgNSA3IDQ4IDQgKi8KKzc4NSwJLyogT0JKX2NhUmVwb3NpdG9yeSAgICAgICAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0OCA1ICovCis3ODAsCS8qIE9CSl9obWFjX21kNSAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDggMSAxICovCis3ODEsCS8qIE9CSl9obWFjX3NoYTEgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNSA1IDggMSAyICovCis1OCwJLyogT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSAqLworNTksCS8qIE9CSl9uZXRzY2FwZV9kYXRhX3R5cGUgICAgICAgICAgIDIgMTYgODQwIDEgMTEzNzMwIDIgKi8KKzQzOCwJLyogT0JKX3BpbG90QXR0cmlidXRlVHlwZSAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgKi8KKzQzOSwJLyogT0JKX3BpbG90QXR0cmlidXRlU3ludGF4ICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDMgKi8KKzQ0MCwJLyogT0JKX3BpbG90T2JqZWN0Q2xhc3MgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDQgKi8KKzQ0MSwJLyogT0JKX3BpbG90R3JvdXBzICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEwICovCisxMDgsCS8qIE9CSl9jYXN0NV9jYmMgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTMzIDcgNjYgMTAgKi8KKzExMiwJLyogT0JKX3BiZVdpdGhNRDVBbmRDYXN0NV9DQkMgICAgICAgMSAyIDg0MCAxMTM1MzMgNyA2NiAxMiAqLworNzgyLAkvKiBPQkpfaWRfUGFzc3dvcmRCYXNlZE1BQyAgICAgICAgICAxIDIgODQwIDExMzUzMyA3IDY2IDEzICovCis3ODMsCS8qIE9CSl9pZF9ESEJhc2VkTWFjICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTMzIDcgNjYgMzAgKi8KKyA2LAkvKiBPQkpfcnNhRW5jcnlwdGlvbiAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgMSAqLworIDcsCS8qIE9CSl9tZDJXaXRoUlNBRW5jcnlwdGlvbiAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMSAyICovCiszOTYsCS8qIE9CSl9tZDRXaXRoUlNBRW5jcnlwdGlvbiAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMSAzICovCisgOCwJLyogT0JKX21kNVdpdGhSU0FFbmNyeXB0aW9uICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSAxIDQgKi8KKzY1LAkvKiBPQkpfc2hhMVdpdGhSU0FFbmNyeXB0aW9uICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgNSAqLworNjQ0LAkvKiBPQkpfcnNhT0FFUEVuY3J5cHRpb25TRVQgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDEgNiAqLworNjY4LAkvKiBPQkpfc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24gICAgICAxIDIgODQwIDExMzU0OSAxIDEgMTEgKi8KKzY2OSwJLyogT0JKX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uICAgICAgMSAyIDg0MCAxMTM1NDkgMSAxIDEyICovCis2NzAsCS8qIE9CSl9zaGE1MTJXaXRoUlNBRW5jcnlwdGlvbiAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMSAxMyAqLworNjcxLAkvKiBPQkpfc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24gICAgICAxIDIgODQwIDExMzU0OSAxIDEgMTQgKi8KKzI4LAkvKiBPQkpfZGhLZXlBZ3JlZW1lbnQgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDMgMSAqLworIDksCS8qIE9CSl9wYmVXaXRoTUQyQW5kREVTX0NCQyAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNSAxICovCisxMCwJLyogT0JKX3BiZVdpdGhNRDVBbmRERVNfQ0JDICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA1IDMgKi8KKzE2OCwJLyogT0JKX3BiZVdpdGhNRDJBbmRSQzJfQ0JDICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA1IDQgKi8KKzE2OSwJLyogT0JKX3BiZVdpdGhNRDVBbmRSQzJfQ0JDICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA1IDYgKi8KKzE3MCwJLyogT0JKX3BiZVdpdGhTSEExQW5kREVTX0NCQyAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA1IDEwICovCis2OCwJLyogT0JKX3BiZVdpdGhTSEExQW5kUkMyX0NCQyAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA1IDExICovCis2OSwJLyogT0JKX2lkX3Bia2RmMiAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA1IDEyICovCisxNjEsCS8qIE9CSl9wYmVzMiAgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNSAxMyAqLworMTYyLAkvKiBPQkpfcGJtYWMxICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDUgMTQgKi8KKzIxLAkvKiBPQkpfcGtjczdfZGF0YSAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDcgMSAqLworMjIsCS8qIE9CSl9wa2NzN19zaWduZWQgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNyAyICovCisyMywJLyogT0JKX3BrY3M3X2VudmVsb3BlZCAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA3IDMgKi8KKzI0LAkvKiBPQkpfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkICAgICAxIDIgODQwIDExMzU0OSAxIDcgNCAqLworMjUsCS8qIE9CSl9wa2NzN19kaWdlc3QgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgNyA1ICovCisyNiwJLyogT0JKX3BrY3M3X2VuY3J5cHRlZCAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA3IDYgKi8KKzQ4LAkvKiBPQkpfcGtjczlfZW1haWxBZGRyZXNzICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMSAqLworNDksCS8qIE9CSl9wa2NzOV91bnN0cnVjdHVyZWROYW1lICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAyICovCis1MCwJLyogT0JKX3BrY3M5X2NvbnRlbnRUeXBlICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDMgKi8KKzUxLAkvKiBPQkpfcGtjczlfbWVzc2FnZURpZ2VzdCAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgNCAqLworNTIsCS8qIE9CSl9wa2NzOV9zaWduaW5nVGltZSAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSA1ICovCis1MywJLyogT0JKX3BrY3M5X2NvdW50ZXJzaWduYXR1cmUgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDYgKi8KKzU0LAkvKiBPQkpfcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQgICAgICAxIDIgODQwIDExMzU0OSAxIDkgNyAqLworNTUsCS8qIE9CSl9wa2NzOV91bnN0cnVjdHVyZWRBZGRyZXNzICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSA4ICovCis1NiwJLyogT0JKX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDkgKi8KKzE3MiwJLyogT0JKX2V4dF9yZXEgICAgICAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE0ICovCisxNjcsCS8qIE9CSl9TTUlNRUNhcGFiaWxpdGllcyAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNSAqLworMTg4LAkvKiBPQkpfU01JTUUgICAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgKi8KKzE1NiwJLyogT0JKX2ZyaWVuZGx5TmFtZSAgICAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDIwICovCisxNTcsCS8qIE9CSl9sb2NhbEtleUlEICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAyMSAqLworNjgxLAkvKiBPQkpfWDlfNjJfb25CYXNpcyAgICAgICAgICAgICAgICAxIDIgODQwIDEwMDQ1IDEgMiAzIDEgKi8KKzY4MiwJLyogT0JKX1g5XzYyX3RwQmFzaXMgICAgICAgICAgICAgICAgMSAyIDg0MCAxMDA0NSAxIDIgMyAyICovCis2ODMsCS8qIE9CSl9YOV82Ml9wcEJhc2lzICAgICAgICAgICAgICAgIDEgMiA4NDAgMTAwNDUgMSAyIDMgMyAqLworNDE3LAkvKiBPQkpfbXNfY3NwX25hbWUgICAgICAgICAgICAgICAgICAxIDMgNiAxIDQgMSAzMTEgMTcgMSAqLworODU2LAkvKiBPQkpfTG9jYWxLZXlTZXQgICAgICAgICAgICAgICAgICAxIDMgNiAxIDQgMSAzMTEgMTcgMiAqLworMzkwLAkvKiBPQkpfZGNPYmplY3QgICAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDQgMSAxNDY2IDM0NCAqLworOTEsCS8qIE9CSl9iZl9jYmMgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAxIDMwMjkgMSAyICovCiszMTUsCS8qIE9CSl9pZF9yZWdDdHJsX3JlZ1Rva2VuICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNSAxIDEgKi8KKzMxNiwJLyogT0JKX2lkX3JlZ0N0cmxfYXV0aGVudGljYXRvciAgICAgMSAzIDYgMSA1IDUgNyA1IDEgMiAqLworMzE3LAkvKiBPQkpfaWRfcmVnQ3RybF9wa2lQdWJsaWNhdGlvbkluZm8gMSAzIDYgMSA1IDUgNyA1IDEgMyAqLworMzE4LAkvKiBPQkpfaWRfcmVnQ3RybF9wa2lBcmNoaXZlT3B0aW9ucyAxIDMgNiAxIDUgNSA3IDUgMSA0ICovCiszMTksCS8qIE9CSl9pZF9yZWdDdHJsX29sZENlcnRJRCAgICAgICAgIDEgMyA2IDEgNSA1IDcgNSAxIDUgKi8KKzMyMCwJLyogT0JKX2lkX3JlZ0N0cmxfcHJvdG9jb2xFbmNyS2V5ICAgMSAzIDYgMSA1IDUgNyA1IDEgNiAqLworMzIxLAkvKiBPQkpfaWRfcmVnSW5mb191dGY4UGFpcnMgICAgICAgICAxIDMgNiAxIDUgNSA3IDUgMiAxICovCiszMjIsCS8qIE9CSl9pZF9yZWdJbmZvX2NlcnRSZXEgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNSAyIDIgKi8KKzM2NSwJLyogT0JKX2lkX3BraXhfT0NTUF9iYXNpYyAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0OCAxIDEgKi8KKzM2NiwJLyogT0JKX2lkX3BraXhfT0NTUF9Ob25jZSAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0OCAxIDIgKi8KKzM2NywJLyogT0JKX2lkX3BraXhfT0NTUF9DcmxJRCAgICAgICAgICAgMSAzIDYgMSA1IDUgNyA0OCAxIDMgKi8KKzM2OCwJLyogT0JKX2lkX3BraXhfT0NTUF9hY2NlcHRhYmxlUmVzcG9uc2VzIDEgMyA2IDEgNSA1IDcgNDggMSA0ICovCiszNjksCS8qIE9CSl9pZF9wa2l4X09DU1Bfbm9DaGVjayAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggMSA1ICovCiszNzAsCS8qIE9CSl9pZF9wa2l4X09DU1BfYXJjaGl2ZUN1dG9mZiAgIDEgMyA2IDEgNSA1IDcgNDggMSA2ICovCiszNzEsCS8qIE9CSl9pZF9wa2l4X09DU1Bfc2VydmljZUxvY2F0b3IgIDEgMyA2IDEgNSA1IDcgNDggMSA3ICovCiszNzIsCS8qIE9CSl9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMgIDEgMyA2IDEgNSA1IDcgNDggMSA4ICovCiszNzMsCS8qIE9CSl9pZF9wa2l4X09DU1BfdmFsaWQgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggMSA5ICovCiszNzQsCS8qIE9CSl9pZF9wa2l4X09DU1BfcGF0aCAgICAgICAgICAgIDEgMyA2IDEgNSA1IDcgNDggMSAxMCAqLworMzc1LAkvKiBPQkpfaWRfcGtpeF9PQ1NQX3RydXN0Um9vdCAgICAgICAxIDMgNiAxIDUgNSA3IDQ4IDEgMTEgKi8KKzQxOCwJLyogT0JKX2Flc18xMjhfZWNiICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgMSAqLworNDE5LAkvKiBPQkpfYWVzXzEyOF9jYmMgICAgICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMSAyICovCis0MjAsCS8qIE9CSl9hZXNfMTI4X29mYjEyOCAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDMgKi8KKzQyMSwJLyogT0JKX2Flc18xMjhfY2ZiMTI4ICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDEgNCAqLworNzg4LAkvKiBPQkpfaWRfYWVzMTI4X3dyYXAgICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMSA1ICovCis0MjIsCS8qIE9CSl9hZXNfMTkyX2VjYiAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDIxICovCis0MjMsCS8qIE9CSl9hZXNfMTkyX2NiYyAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDIyICovCis0MjQsCS8qIE9CSl9hZXNfMTkyX29mYjEyOCAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDIzICovCis0MjUsCS8qIE9CSl9hZXNfMTkyX2NmYjEyOCAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDI0ICovCis3ODksCS8qIE9CSl9pZF9hZXMxOTJfd3JhcCAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDI1ICovCis0MjYsCS8qIE9CSl9hZXNfMjU2X2VjYiAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDQxICovCis0MjcsCS8qIE9CSl9hZXNfMjU2X2NiYyAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDQyICovCis0MjgsCS8qIE9CSl9hZXNfMjU2X29mYjEyOCAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDQzICovCis0MjksCS8qIE9CSl9hZXNfMjU2X2NmYjEyOCAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDQ0ICovCis3OTAsCS8qIE9CSl9pZF9hZXMyNTZfd3JhcCAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAxIDQ1ICovCis2NzIsCS8qIE9CSl9zaGEyNTYgICAgICAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAyIDEgKi8KKzY3MywJLyogT0JKX3NoYTM4NCAgICAgICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDIgMiAqLworNjc0LAkvKiBPQkpfc2hhNTEyICAgICAgICAgICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMiAzICovCis2NzUsCS8qIE9CSl9zaGEyMjQgICAgICAgICAgICAgICAgICAgICAgIDIgMTYgODQwIDEgMTAxIDMgNCAyIDQgKi8KKzgwMiwJLyogT0JKX2RzYV93aXRoX1NIQTIyNCAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMDEgMyA0IDMgMSAqLworODAzLAkvKiBPQkpfZHNhX3dpdGhfU0hBMjU2ICAgICAgICAgICAgICAyIDE2IDg0MCAxIDEwMSAzIDQgMyAyICovCis3MSwJLyogT0JKX25ldHNjYXBlX2NlcnRfdHlwZSAgICAgICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSAxICovCis3MiwJLyogT0JKX25ldHNjYXBlX2Jhc2VfdXJsICAgICAgICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSAyICovCis3MywJLyogT0JKX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSAzICovCis3NCwJLyogT0JKX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsICAgMiAxNiA4NDAgMSAxMTM3MzAgMSA0ICovCis3NSwJLyogT0JKX25ldHNjYXBlX3JlbmV3YWxfdXJsICAgICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSA3ICovCis3NiwJLyogT0JKX25ldHNjYXBlX2NhX3BvbGljeV91cmwgICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSA4ICovCis3NywJLyogT0JKX25ldHNjYXBlX3NzbF9zZXJ2ZXJfbmFtZSAgICAgMiAxNiA4NDAgMSAxMTM3MzAgMSAxMiAqLworNzgsCS8qIE9CSl9uZXRzY2FwZV9jb21tZW50ICAgICAgICAgICAgIDIgMTYgODQwIDEgMTEzNzMwIDEgMTMgKi8KKzc5LAkvKiBPQkpfbmV0c2NhcGVfY2VydF9zZXF1ZW5jZSAgICAgICAyIDE2IDg0MCAxIDExMzczMCAyIDUgKi8KKzEzOSwJLyogT0JKX25zX3NnYyAgICAgICAgICAgICAgICAgICAgICAgMiAxNiA4NDAgMSAxMTM3MzAgNCAxICovCis0NTgsCS8qIE9CSl91c2VySWQgICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDEgKi8KKzQ1OSwJLyogT0JKX3RleHRFbmNvZGVkT1JBZGRyZXNzICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgMiAqLworNDYwLAkvKiBPQkpfcmZjODIyTWFpbGJveCAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgMSAzICovCis0NjEsCS8qIE9CSl9pbmZvICAgICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQgKi8KKzQ2MiwJLyogT0JKX2Zhdm91cml0ZURyaW5rICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgNSAqLworNDYzLAkvKiBPQkpfcm9vbU51bWJlciAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgMSA2ICovCis0NjQsCS8qIE9CSl9waG90byAgICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDcgKi8KKzQ2NSwJLyogT0JKX3VzZXJDbGFzcyAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDEgOCAqLworNDY2LAkvKiBPQkpfaG9zdCAgICAgICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgMSA5ICovCis0NjcsCS8qIE9CSl9tYW5hZ2VyICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDEwICovCis0NjgsCS8qIE9CSl9kb2N1bWVudElkZW50aWZpZXIgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDExICovCis0NjksCS8qIE9CSl9kb2N1bWVudFRpdGxlICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDEyICovCis0NzAsCS8qIE9CSl9kb2N1bWVudFZlcnNpb24gICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDEzICovCis0NzEsCS8qIE9CSl9kb2N1bWVudEF1dGhvciAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDE0ICovCis0NzIsCS8qIE9CSl9kb2N1bWVudExvY2F0aW9uICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDE1ICovCis0NzMsCS8qIE9CSl9ob21lVGVsZXBob25lTnVtYmVyICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDIwICovCis0NzQsCS8qIE9CSl9zZWNyZXRhcnkgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDIxICovCis0NzUsCS8qIE9CSl9vdGhlck1haWxib3ggICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDIyICovCis0NzYsCS8qIE9CSl9sYXN0TW9kaWZpZWRUaW1lICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDIzICovCis0NzcsCS8qIE9CSl9sYXN0TW9kaWZpZWRCeSAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDI0ICovCiszOTEsCS8qIE9CSl9kb21haW5Db21wb25lbnQgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDI1ICovCis0NzgsCS8qIE9CSl9hUmVjb3JkICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDI2ICovCis0NzksCS8qIE9CSl9waWxvdEF0dHJpYnV0ZVR5cGUyNyAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDI3ICovCis0ODAsCS8qIE9CSl9tWFJlY29yZCAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDI4ICovCis0ODEsCS8qIE9CSl9uU1JlY29yZCAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDI5ICovCis0ODIsCS8qIE9CSl9zT0FSZWNvcmQgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDMwICovCis0ODMsCS8qIE9CSl9jTkFNRVJlY29yZCAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDMxICovCis0ODQsCS8qIE9CSl9hc3NvY2lhdGVkRG9tYWluICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDM3ICovCis0ODUsCS8qIE9CSl9hc3NvY2lhdGVkTmFtZSAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDM4ICovCis0ODYsCS8qIE9CSl9ob21lUG9zdGFsQWRkcmVzcyAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDM5ICovCis0ODcsCS8qIE9CSl9wZXJzb25hbFRpdGxlICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQwICovCis0ODgsCS8qIE9CSl9tb2JpbGVUZWxlcGhvbmVOdW1iZXIgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQxICovCis0ODksCS8qIE9CSl9wYWdlclRlbGVwaG9uZU51bWJlciAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQyICovCis0OTAsCS8qIE9CSl9mcmllbmRseUNvdW50cnlOYW1lICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQzICovCis0OTEsCS8qIE9CSl9vcmdhbml6YXRpb25hbFN0YXR1cyAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQ1ICovCis0OTIsCS8qIE9CSl9qYW5ldE1haWxib3ggICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQ2ICovCis0OTMsCS8qIE9CSl9tYWlsUHJlZmVyZW5jZU9wdGlvbiAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQ3ICovCis0OTQsCS8qIE9CSl9idWlsZGluZ05hbWUgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQ4ICovCis0OTUsCS8qIE9CSl9kU0FRdWFsaXR5ICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDQ5ICovCis0OTYsCS8qIE9CSl9zaW5nbGVMZXZlbFF1YWxpdHkgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDUwICovCis0OTcsCS8qIE9CSl9zdWJ0cmVlTWluaW11bVF1YWxpdHkgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDUxICovCis0OTgsCS8qIE9CSl9zdWJ0cmVlTWF4aW11bVF1YWxpdHkgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDUyICovCis0OTksCS8qIE9CSl9wZXJzb25hbFNpZ25hdHVyZSAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDUzICovCis1MDAsCS8qIE9CSl9kSVRSZWRpcmVjdCAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDU0ICovCis1MDEsCS8qIE9CSl9hdWRpbyAgICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDU1ICovCis1MDIsCS8qIE9CSl9kb2N1bWVudFB1Ymxpc2hlciAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAxIDU2ICovCis0NDIsCS8qIE9CSl9pQTVTdHJpbmdTeW50YXggICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCAzIDQgKi8KKzQ0MywJLyogT0JKX2Nhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXggICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDMgNSAqLworNDQ0LAkvKiBPQkpfcGlsb3RPYmplY3QgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAzICovCis0NDUsCS8qIE9CSl9waWxvdFBlcnNvbiAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDQgKi8KKzQ0NiwJLyogT0JKX2FjY291bnQgICAgICAgICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDQgNSAqLworNDQ3LAkvKiBPQkpfZG9jdW1lbnQgICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCA2ICovCis0NDgsCS8qIE9CSl9yb29tICAgICAgICAgICAgICAgICAgICAgICAgIDAgOSAyMzQyIDE5MjAwMzAwIDEwMCA0IDcgKi8KKzQ0OSwJLyogT0JKX2RvY3VtZW50U2VyaWVzICAgICAgICAgICAgICAgMCA5IDIzNDIgMTkyMDAzMDAgMTAwIDQgOSAqLworMzkyLAkvKiBPQkpfRG9tYWluICAgICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAxMyAqLworNDUwLAkvKiBPQkpfckZDODIybG9jYWxQYXJ0ICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAxNCAqLworNDUxLAkvKiBPQkpfZE5TRG9tYWluICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAxNSAqLworNDUyLAkvKiBPQkpfZG9tYWluUmVsYXRlZE9iamVjdCAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAxNyAqLworNDUzLAkvKiBPQkpfZnJpZW5kbHlDb3VudHJ5ICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAxOCAqLworNDU0LAkvKiBPQkpfc2ltcGxlU2VjdXJpdHlPYmplY3QgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAxOSAqLworNDU1LAkvKiBPQkpfcGlsb3RPcmdhbml6YXRpb24gICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAyMCAqLworNDU2LAkvKiBPQkpfcGlsb3REU0EgICAgICAgICAgICAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAyMSAqLworNDU3LAkvKiBPQkpfcXVhbGl0eUxhYmVsbGVkRGF0YSAgICAgICAgICAwIDkgMjM0MiAxOTIwMDMwMCAxMDAgNCAyMiAqLworMTg5LAkvKiBPQkpfaWRfc21pbWVfbW9kICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMCAqLworMTkwLAkvKiBPQkpfaWRfc21pbWVfY3QgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMSAqLworMTkxLAkvKiBPQkpfaWRfc21pbWVfYWEgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAqLworMTkyLAkvKiBPQkpfaWRfc21pbWVfYWxnICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMyAqLworMTkzLAkvKiBPQkpfaWRfc21pbWVfY2QgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgNCAqLworMTk0LAkvKiBPQkpfaWRfc21pbWVfc3BxICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgNSAqLworMTk1LAkvKiBPQkpfaWRfc21pbWVfY3RpICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgNiAqLworMTU4LAkvKiBPQkpfeDUwOUNlcnRpZmljYXRlICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMjIgMSAqLworMTU5LAkvKiBPQkpfc2RzaUNlcnRpZmljYXRlICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMjIgMiAqLworMTYwLAkvKiBPQkpfeDUwOUNybCAgICAgICAgICAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMjMgMSAqLworMTQ0LAkvKiBPQkpfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0ICAgICAxIDIgODQwIDExMzU0OSAxIDEyIDEgMSAqLworMTQ1LAkvKiBPQkpfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQgICAgICAxIDIgODQwIDExMzU0OSAxIDEyIDEgMiAqLworMTQ2LAkvKiBPQkpfcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQyAxIDIgODQwIDExMzU0OSAxIDEyIDEgMyAqLworMTQ3LAkvKiBPQkpfcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQyAxIDIgODQwIDExMzU0OSAxIDEyIDEgNCAqLworMTQ4LAkvKiBPQkpfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQyAxIDIgODQwIDExMzU0OSAxIDEyIDEgNSAqLworMTQ5LAkvKiBPQkpfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDICAxIDIgODQwIDExMzU0OSAxIDEyIDEgNiAqLworMTcxLAkvKiBPQkpfbXNfZXh0X3JlcSAgICAgICAgICAgICAgICAgICAxIDMgNiAxIDQgMSAzMTEgMiAxIDE0ICovCisxMzQsCS8qIE9CSl9tc19jb2RlX2luZCAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAxIDMxMSAyIDEgMjEgKi8KKzEzNSwJLyogT0JKX21zX2NvZGVfY29tICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMzExIDIgMSAyMiAqLworMTM2LAkvKiBPQkpfbXNfY3RsX3NpZ24gICAgICAgICAgICAgICAgICAxIDMgNiAxIDQgMSAzMTEgMTAgMyAxICovCisxMzcsCS8qIE9CSl9tc19zZ2MgICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAxIDMxMSAxMCAzIDMgKi8KKzEzOCwJLyogT0JKX21zX2VmcyAgICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMzExIDEwIDMgNCAqLworNjQ4LAkvKiBPQkpfbXNfc21hcnRjYXJkX2xvZ2luICAgICAgICAgICAxIDMgNiAxIDQgMSAzMTEgMjAgMiAyICovCis2NDksCS8qIE9CSl9tc191cG4gICAgICAgICAgICAgICAgICAgICAgIDEgMyA2IDEgNCAxIDMxMSAyMCAyIDMgKi8KKzc1MSwJLyogT0JKX2NhbWVsbGlhXzEyOF9jYmMgICAgICAgICAgICAgMSAyIDM5MiAyMDAwMTEgNjEgMSAxIDEgMiAqLworNzUyLAkvKiBPQkpfY2FtZWxsaWFfMTkyX2NiYyAgICAgICAgICAgICAxIDIgMzkyIDIwMDAxMSA2MSAxIDEgMSAzICovCis3NTMsCS8qIE9CSl9jYW1lbGxpYV8yNTZfY2JjICAgICAgICAgICAgIDEgMiAzOTIgMjAwMDExIDYxIDEgMSAxIDQgKi8KKzE5NiwJLyogT0JKX2lkX3NtaW1lX21vZF9jbXMgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDAgMSAqLworMTk3LAkvKiBPQkpfaWRfc21pbWVfbW9kX2VzcyAgICAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMCAyICovCisxOTgsCS8qIE9CSl9pZF9zbWltZV9tb2Rfb2lkICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAwIDMgKi8KKzE5OSwJLyogT0JKX2lkX3NtaW1lX21vZF9tc2dfdjMgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDAgNCAqLworMjAwLAkvKiBPQkpfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzg4IDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAwIDUgKi8KKzIwMSwJLyogT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV85NyAxIDIgODQwIDExMzU0OSAxIDkgMTYgMCA2ICovCisyMDIsCS8qIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfODggMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDAgNyAqLworMjAzLAkvKiBPQkpfaWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzk3IDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAwIDggKi8KKzIwNCwJLyogT0JKX2lkX3NtaW1lX2N0X3JlY2VpcHQgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDEgMSAqLworMjA1LAkvKiBPQkpfaWRfc21pbWVfY3RfYXV0aERhdGEgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMSAyICovCisyMDYsCS8qIE9CSl9pZF9zbWltZV9jdF9wdWJsaXNoQ2VydCAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAxIDMgKi8KKzIwNywJLyogT0JKX2lkX3NtaW1lX2N0X1RTVEluZm8gICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDEgNCAqLworMjA4LAkvKiBPQkpfaWRfc21pbWVfY3RfVERUSW5mbyAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMSA1ICovCisyMDksCS8qIE9CSl9pZF9zbWltZV9jdF9jb250ZW50SW5mbyAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAxIDYgKi8KKzIxMCwJLyogT0JKX2lkX3NtaW1lX2N0X0RWQ1NSZXF1ZXN0RGF0YSAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDEgNyAqLworMjExLAkvKiBPQkpfaWRfc21pbWVfY3RfRFZDU1Jlc3BvbnNlRGF0YSAxIDIgODQwIDExMzU0OSAxIDkgMTYgMSA4ICovCis3ODYsCS8qIE9CSl9pZF9zbWltZV9jdF9jb21wcmVzc2VkRGF0YSAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAxIDkgKi8KKzc4NywJLyogT0JKX2lkX2N0X2FzY2lpVGV4dFdpdGhDUkxGICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDEgMjcgKi8KKzIxMiwJLyogT0JKX2lkX3NtaW1lX2FhX3JlY2VpcHRSZXF1ZXN0ICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMSAqLworMjEzLAkvKiBPQkpfaWRfc21pbWVfYWFfc2VjdXJpdHlMYWJlbCAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyICovCisyMTQsCS8qIE9CSl9pZF9zbWltZV9hYV9tbEV4cGFuZEhpc3RvcnkgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDMgKi8KKzIxNSwJLyogT0JKX2lkX3NtaW1lX2FhX2NvbnRlbnRIaW50ICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgNCAqLworMjE2LAkvKiBPQkpfaWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0ICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiA1ICovCisyMTcsCS8qIE9CSl9pZF9zbWltZV9hYV9lbmNhcENvbnRlbnRUeXBlIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDYgKi8KKzIxOCwJLyogT0JKX2lkX3NtaW1lX2FhX2NvbnRlbnRJZGVudGlmaWVyIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDcgKi8KKzIxOSwJLyogT0JKX2lkX3NtaW1lX2FhX21hY1ZhbHVlICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgOCAqLworMjIwLAkvKiBPQkpfaWRfc21pbWVfYWFfZXF1aXZhbGVudExhYmVscyAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiA5ICovCisyMjEsCS8qIE9CSl9pZF9zbWltZV9hYV9jb250ZW50UmVmZXJlbmNlIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDEwICovCisyMjIsCS8qIE9CSl9pZF9zbWltZV9hYV9lbmNyeXBLZXlQcmVmICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDExICovCisyMjMsCS8qIE9CSl9pZF9zbWltZV9hYV9zaWduaW5nQ2VydGlmaWNhdGUgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMTIgKi8KKzIyNCwJLyogT0JKX2lkX3NtaW1lX2FhX3NtaW1lRW5jcnlwdENlcnRzIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDEzICovCisyMjUsCS8qIE9CSl9pZF9zbWltZV9hYV90aW1lU3RhbXBUb2tlbiAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDE0ICovCisyMjYsCS8qIE9CSl9pZF9zbWltZV9hYV9ldHNfc2lnUG9saWN5SWQgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDE1ICovCisyMjcsCS8qIE9CSl9pZF9zbWltZV9hYV9ldHNfY29tbWl0bWVudFR5cGUgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMTYgKi8KKzIyOCwJLyogT0JKX2lkX3NtaW1lX2FhX2V0c19zaWduZXJMb2NhdGlvbiAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAxNyAqLworMjI5LAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ25lckF0dHIgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAxOCAqLworMjMwLAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX290aGVyU2lnQ2VydCAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAxOSAqLworMjMxLAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX2NvbnRlbnRUaW1lc3RhbXAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMjAgKi8KKzIzMiwJLyogT0JKX2lkX3NtaW1lX2FhX2V0c19DZXJ0aWZpY2F0ZVJlZnMgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMjEgKi8KKzIzMywJLyogT0JKX2lkX3NtaW1lX2FhX2V0c19SZXZvY2F0aW9uUmVmcyAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyMiAqLworMjM0LAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX2NlcnRWYWx1ZXMgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyMyAqLworMjM1LAkvKiBPQkpfaWRfc21pbWVfYWFfZXRzX3Jldm9jYXRpb25WYWx1ZXMgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMjQgKi8KKzIzNiwJLyogT0JKX2lkX3NtaW1lX2FhX2V0c19lc2NUaW1lU3RhbXAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDIgMjUgKi8KKzIzNywJLyogT0JKX2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAyIDI2ICovCisyMzgsCS8qIE9CSl9pZF9zbWltZV9hYV9ldHNfYXJjaGl2ZVRpbWVTdGFtcCAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyNyAqLworMjM5LAkvKiBPQkpfaWRfc21pbWVfYWFfc2lnbmF0dXJlVHlwZSAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyOCAqLworMjQwLAkvKiBPQkpfaWRfc21pbWVfYWFfZHZjc19kdmMgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMiAyOSAqLworMjQxLAkvKiBPQkpfaWRfc21pbWVfYWxnX0VTREh3aXRoM0RFUyAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMyAxICovCisyNDIsCS8qIE9CSl9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAzIDIgKi8KKzI0MywJLyogT0JKX2lkX3NtaW1lX2FsZ18zREVTd3JhcCAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDMgMyAqLworMjQ0LAkvKiBPQkpfaWRfc21pbWVfYWxnX1JDMndyYXAgICAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMyA0ICovCisyNDUsCS8qIE9CSl9pZF9zbWltZV9hbGdfRVNESCAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAzIDUgKi8KKzI0NiwJLyogT0JKX2lkX3NtaW1lX2FsZ19DTVMzREVTd3JhcCAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDMgNiAqLworMjQ3LAkvKiBPQkpfaWRfc21pbWVfYWxnX0NNU1JDMndyYXAgICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgMyA3ICovCisxMjUsCS8qIE9CSl96bGliX2NvbXByZXNzaW9uICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiAzIDggKi8KKzI0OCwJLyogT0JKX2lkX3NtaW1lX2NkX2xkYXAgICAgICAgICAgICAgMSAyIDg0MCAxMTM1NDkgMSA5IDE2IDQgMSAqLworMjQ5LAkvKiBPQkpfaWRfc21pbWVfc3BxX2V0c19zcXRfdXJpICAgICAxIDIgODQwIDExMzU0OSAxIDkgMTYgNSAxICovCisyNTAsCS8qIE9CSl9pZF9zbWltZV9zcHFfZXRzX3NxdF91bm90aWNlIDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiA1IDIgKi8KKzI1MSwJLyogT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZk9yaWdpbiAxIDIgODQwIDExMzU0OSAxIDkgMTYgNiAxICovCisyNTIsCS8qIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZSZWNlaXB0IDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiA2IDIgKi8KKzI1MywJLyogT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkRlbGl2ZXJ5IDEgMiA4NDAgMTEzNTQ5IDEgOSAxNiA2IDMgKi8KKzI1NCwJLyogT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZlNlbmRlciAxIDIgODQwIDExMzU0OSAxIDkgMTYgNiA0ICovCisyNTUsCS8qIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZBcHByb3ZhbCAxIDIgODQwIDExMzU0OSAxIDkgMTYgNiA1ICovCisyNTYsCS8qIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZDcmVhdGlvbiAxIDIgODQwIDExMzU0OSAxIDkgMTYgNiA2ICovCisxNTAsCS8qIE9CSl9rZXlCYWcgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMTAgMSAxICovCisxNTEsCS8qIE9CSl9wa2NzOFNocm91ZGVkS2V5QmFnICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMTAgMSAyICovCisxNTIsCS8qIE9CSl9jZXJ0QmFnICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMTAgMSAzICovCisxNTMsCS8qIE9CSl9jcmxCYWcgICAgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMTAgMSA0ICovCisxNTQsCS8qIE9CSl9zZWNyZXRCYWcgICAgICAgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMTAgMSA1ICovCisxNTUsCS8qIE9CSl9zYWZlQ29udGVudHNCYWcgICAgICAgICAgICAgIDEgMiA4NDAgMTEzNTQ5IDEgMTIgMTAgMSA2ICovCiszNCwJLyogT0JKX2lkZWFfY2JjICAgICAgICAgICAgICAgICAgICAgMSAzIDYgMSA0IDEgMTg4IDcgMSAxIDIgKi8KK307CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ial9kYXQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfZGF0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2N2Y3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfZGF0LnBsCkBAIC0wLDAgKzEsMzA3IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworIyBmaXhlcyBidWcgaW4gZmxvYXRpbmcgcG9pbnQgZW11bGF0aW9uIG9uIHNwYXJjNjQgd2hlbgorIyB0aGlzIHNjcmlwdCBwcm9kdWNlcyBvZmYtYnktb25lIG91dHB1dCBvbiBzcGFyYzY0Cit1c2UgaW50ZWdlcjsKKworc3ViIG9ial9jbXAKKwl7CisJbG9jYWwoQGEsQGIsJF8sJHIpOworCisJJEE9JG9ial9sZW57JG9ianskbmlkeyRhfX19OworCSRCPSRvYmpfbGVueyRvYmp7JG5pZHskYn19fTsKKworCSRyPSgkQS0kQik7CisJcmV0dXJuKCRyKSBpZiAkciAhPSAwOworCisJJEE9JG9ial9kZXJ7JG9ianskbmlkeyRhfX19OworCSRCPSRvYmpfZGVyeyRvYmp7JG5pZHskYn19fTsKKworCXJldHVybigkQSBjbXAgJEIpOworCX0KKworc3ViIGV4cGFuZF9vYmoKKwl7CisJbG9jYWwoKnYpPUBfOworCWxvY2FsKCRrLCRkKTsKKwlsb2NhbCgkaSk7CisKKwlkbwl7CisJCSRpPTA7CisJCWZvcmVhY2ggJGsgKGtleXMgJXYpCisJCQl7CisJCQlpZiAoKCR2eyRrfSA9fiBzLyhPQkpfW14sXSspLC8kdnskMX0sLykpCisJCQkJeyAkaSsrOyB9CisJCQl9CisJCX0gd2hpbGUoJGkpOworCWZvcmVhY2ggJGsgKGtleXMgJXYpCisJCXsKKwkJQGE9c3BsaXQoLywvLCR2eyRrfSk7CisJCSRvYmpueyRrfT0kI2ErMTsKKwkJfQorCXJldHVybiglb2Jqbik7CisJfQorCitvcGVuIChJTiwiJEFSR1ZbMF0iKSB8fCBkaWUgIkNhbid0IG9wZW4gaW5wdXQgZmlsZSAkQVJHVlswXSI7CitvcGVuIChPVVQsIj4kQVJHVlsxXSIpIHx8IGRpZSAiQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAkQVJHVlsxXSI7CisKK3doaWxlICg8SU4+KQorCXsKKwluZXh0IHVubGVzcyAvXlwjZGVmaW5lXHMrKFxTKylccysoLiopJC87CisJJHY9JDE7CisJJGQ9JDI7CisJJGQgPX4gcy9eXCIvLzsKKwkkZCA9fiBzL1wiJC8vOworCWlmICgkdiA9fiAvXlNOXyguKikkLykKKwkJeworCQlpZihkZWZpbmVkICRzbmFtZXN7JGR9KQorCQkJeworCQkJcHJpbnQgIldBUk5JTkc6IER1cGxpY2F0ZSBzaG9ydCBuYW1lIFwiJGRcIlxuIjsKKwkJCX0KKwkJZWxzZSAKKwkJCXsgJHNuYW1lc3skZH0gPSAiWCI7IH0KKwkJJHNueyQxfT0kZDsKKwkJfQorCWVsc2lmICgkdiA9fiAvXkxOXyguKikkLykKKwkJeworCQlpZihkZWZpbmVkICRsbmFtZXN7JGR9KQorCQkJeworCQkJcHJpbnQgIldBUk5JTkc6IER1cGxpY2F0ZSBsb25nIG5hbWUgXCIkZFwiXG4iOworCQkJfQorCQllbHNlIAorCQkJeyAkbG5hbWVzeyRkfSA9ICJYIjsgfQorCQkkbG57JDF9PSRkOworCQl9CisJZWxzaWYgKCR2ID1+IC9eTklEXyguKikkLykKKwkJeyAkbmlkeyRkfT0kMTsgfQorCWVsc2lmICgkdiA9fiAvXk9CSl8oLiopJC8pCisJCXsKKwkJJG9ianskMX09JHY7CisJCSRvYmpkeyR2fT0kZDsKKwkJfQorCX0KK2Nsb3NlIElOOworCislb2I9JmV4cGFuZF9vYmooKm9iamQpOworCitAYT1zb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAlbmlkOworJG49JGFbJCNhXSsxOworCitAbHZhbHVlcz0oKTsKKyRsdmFsdWVzPTA7CisKK2ZvciAoJGk9MDsgJGk8JG47ICRpKyspCisJeworCWlmICghZGVmaW5lZCgkbmlkeyRpfSkpCisJCXsKKwkJcHVzaChAb3V0LCJ7TlVMTCxOVUxMLE5JRF91bmRlZiwwLE5VTEwsMH0sXG4iKTsKKwkJfQorCWVsc2UKKwkJeworCQkkc249ZGVmaW5lZCgkc257JG5pZHskaX19KT8iJHNueyRuaWR7JGl9fSI6Ik5VTEwiOworCQkkbG49ZGVmaW5lZCgkbG57JG5pZHskaX19KT8iJGxueyRuaWR7JGl9fSI6Ik5VTEwiOworCisJCWlmICgkc24gZXEgIk5VTEwiKSB7CisJCQkkc249JGxuOworCQkJJHNueyRuaWR7JGl9fSA9ICRsbjsKKwkJfQorCisJCWlmICgkbG4gZXEgIk5VTEwiKSB7CisJCQkkbG49JHNuOworCQkJJGxueyRuaWR7JGl9fSA9ICRzbjsKKwkJfQorCQkJCisJCSRvdXQgPSJ7IjsKKwkJJG91dC49IlwiJHNuXCIiOworCQkkb3V0Lj0iLCIuIlwiJGxuXCIiOworCQkkb3V0Lj0iLE5JRF8kbmlkeyRpfSwiOworCQlpZiAoZGVmaW5lZCgkb2JqeyRuaWR7JGl9fSkpCisJCQl7CisJCQkkdj0kb2JqZHskb2JqeyRuaWR7JGl9fX07CisJCQkkdiA9fiBzL0wvL2c7CisJCQkkdiA9fiBzLywvIC9nOworCQkJJHI9JmRlcl9pdCgkdik7CisJCQkkej0iIjsKKwkJCSRsZW5ndGg9MDsKKwkJCWZvcmVhY2ggKHVucGFjaygiQyoiLCRyKSkKKwkJCQl7CisJCQkJJHouPXNwcmludGYoIjB4JTAyWCwiLCRfKTsKKwkJCQkkbGVuZ3RoKys7CisJCQkJfQorCQkJJG9ial9kZXJ7JG9ianskbmlkeyRpfX19PSR6OworCQkJJG9ial9sZW57JG9ianskbmlkeyRpfX19PSRsZW5ndGg7CisKKwkJCXB1c2goQGx2YWx1ZXMsc3ByaW50ZigiJS00NXMvKiBbJTNkXSAlcyAqL1xuIiwKKwkJCQkkeiwkbHZhbHVlcywkb2JqeyRuaWR7JGl9fSkpOworCQkJJG91dC49IiRsZW5ndGgsJihsdmFsdWVzWyRsdmFsdWVzXSksMCI7CisJCQkkbHZhbHVlcys9JGxlbmd0aDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJJG91dC49IjAsTlVMTCwwIjsKKwkJCX0KKwkJJG91dC49In0sXG4iOworCQlwdXNoKEBvdXQsJG91dCk7CisJCX0KKwl9CisKK0BhPWdyZXAoZGVmaW5lZCgkc257JG5pZHskX319KSwwIC4uICRuKTsKK2ZvcmVhY2ggKHNvcnQgeyAkc257JG5pZHskYX19IGNtcCAkc257JG5pZHskYn19IH0gQGEpCisJeworCXB1c2goQHNuLHNwcmludGYoIiUyZCxcdC8qIFwiJHNueyRuaWR7JF99fVwiICovXG4iLCRfKSk7CisJfQorCitAYT1ncmVwKGRlZmluZWQoJGxueyRuaWR7JF99fSksMCAuLiAkbik7Citmb3JlYWNoIChzb3J0IHsgJGxueyRuaWR7JGF9fSBjbXAgJGxueyRuaWR7JGJ9fSB9IEBhKQorCXsKKwlwdXNoKEBsbixzcHJpbnRmKCIlMmQsXHQvKiBcIiRsbnskbmlkeyRffX1cIiAqL1xuIiwkXykpOworCX0KKworQGE9Z3JlcChkZWZpbmVkKCRvYmp7JG5pZHskX319KSwwIC4uICRuKTsKK2ZvcmVhY2ggKHNvcnQgb2JqX2NtcCBAYSkKKwl7CisJJG09JG9ianskbmlkeyRffX07CisJJHY9JG9iamR7JG19OworCSR2ID1+IHMvTC8vZzsKKwkkdiA9fiBzLywvIC9nOworCXB1c2goQG9iLHNwcmludGYoIiUyZCxcdC8qICUtMzJzICVzICovXG4iLCRfLCRtLCR2KSk7CisJfQorCitwcmludCBPVVQgPDwnRU9GJzsKKy8qIGNyeXB0by9vYmplY3RzL29ial9kYXQuaCAqLworCisvKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEZST00gb2JqZWN0cy5oIGJ5IG9ial9kYXQucGwgdmlhIHRoZQorICogZm9sbG93aW5nIGNvbW1hbmQ6CisgKiBwZXJsIG9ial9kYXQucGwgb2JqX21hYy5oIG9ial9kYXQuaAorICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworRU9GCisKK3ByaW50ZiBPVVQgIiNkZWZpbmUgTlVNX05JRCAlZFxuIiwkbjsKK3ByaW50ZiBPVVQgIiNkZWZpbmUgTlVNX1NOICVkXG4iLCQjc24rMTsKK3ByaW50ZiBPVVQgIiNkZWZpbmUgTlVNX0xOICVkXG4iLCQjbG4rMTsKK3ByaW50ZiBPVVQgIiNkZWZpbmUgTlVNX09CSiAlZFxuXG4iLCQjb2IrMTsKKworcHJpbnRmIE9VVCAic3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbHZhbHVlc1slZF09e1xuIiwkbHZhbHVlcysxOworcHJpbnQgT1VUIEBsdmFsdWVzOworcHJpbnQgT1VUICJ9O1xuXG4iOworCitwcmludGYgT1VUICJzdGF0aWMgY29uc3QgQVNOMV9PQkpFQ1QgbmlkX29ianNbTlVNX05JRF09e1xuIjsKK2ZvcmVhY2ggKEBvdXQpCisJeworCWlmIChsZW5ndGgoJF8pID4gNzUpCisJCXsKKwkJJG91dD0iIjsKKwkJZm9yZWFjaCAoc3BsaXQoLywvKSkKKwkJCXsKKwkJCSR0PSRvdXQuJF8uIiwiOworCQkJaWYgKGxlbmd0aCgkdCkgPiA3MCkKKwkJCQl7CisJCQkJcHJpbnQgT1VUICIkb3V0XG4iOworCQkJCSR0PSJcdCRfLCI7CisJCQkJfQorCQkJJG91dD0kdDsKKwkJCX0KKwkJY2hvcCAkb3V0OworCQlwcmludCBPVVQgIiRvdXQiOworCQl9CisJZWxzZQorCQl7IHByaW50IE9VVCAkXzsgfQorCX0KK3ByaW50ICBPVVQgIn07XG5cbiI7CisKK3ByaW50ZiBPVVQgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc25fb2Jqc1tOVU1fU05dPXtcbiI7CitwcmludCAgT1VUIEBzbjsKK3ByaW50ICBPVVQgIn07XG5cbiI7CisKK3ByaW50ZiBPVVQgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbG5fb2Jqc1tOVU1fTE5dPXtcbiI7CitwcmludCAgT1VUIEBsbjsKK3ByaW50ICBPVVQgIn07XG5cbiI7CisKK3ByaW50ZiBPVVQgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgb2JqX29ianNbTlVNX09CSl09e1xuIjsKK3ByaW50ICBPVVQgQG9iOworcHJpbnQgIE9VVCAifTtcblxuIjsKKworY2xvc2UgT1VUOworCitzdWIgZGVyX2l0CisJeworCWxvY2FsKCR2KT1AXzsKKwlsb2NhbChAYSwkaSwkcmV0LEByKTsKKworCUBhPXNwbGl0KC9ccysvLCR2KTsKKwkkcmV0Lj1wYWNrKCJDKiIsJGFbMF0qNDArJGFbMV0pOworCXNoaWZ0IEBhOworCXNoaWZ0IEBhOworCWZvcmVhY2ggKEBhKQorCQl7CisJCUByPSgpOworCQkkdD0wOworCQl3aGlsZSAoJF8gPj0gMTI4KQorCQkJeworCQkJJHg9JF8lMTI4OworCQkJJF8vPTEyODsKKwkJCXB1c2goQHIsKCgoJHQrKyk/MHg4MDowKXwkeCkpOworCQkJfQorCQlwdXNoKEByLCgoKCR0KyspPzB4ODA6MCl8JF8pKTsKKwkJJHJldC49cGFjaygiQyoiLHJldmVyc2UoQHIpKTsKKwkJfQorCXJldHVybigkcmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfZXJyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3YTAzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ial9lcnIuYwpAQCAtMCwwICsxLDEwMiBAQAorLyogY3J5cHRvL29iamVjdHMvb2JqX2Vyci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogTk9URTogdGhpcyBmaWxlIHdhcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgbWtlcnIucGwgc2NyaXB0OiBhbnkgY2hhbmdlcworICogbWFkZSB0byBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBuZXh0IHVwZGF0ZXMgdGhpcyBmaWxlLAorICogb25seSByZWFzb24gc3RyaW5ncyB3aWxsIGJlIHByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfT0JKLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfT0JKLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIE9CSl9zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKE9CSl9GX09CSl9BRERfT0JKRUNUKSwJIk9CSl9hZGRfb2JqZWN0In0sCit7RVJSX0ZVTkMoT0JKX0ZfT0JKX0NSRUFURSksCSJPQkpfY3JlYXRlIn0sCit7RVJSX0ZVTkMoT0JKX0ZfT0JKX0RVUCksCSJPQkpfZHVwIn0sCit7RVJSX0ZVTkMoT0JKX0ZfT0JKX05BTUVfTkVXX0lOREVYKSwJIk9CSl9OQU1FX25ld19pbmRleCJ9LAore0VSUl9GVU5DKE9CSl9GX09CSl9OSUQyTE4pLAkiT0JKX25pZDJsbiJ9LAore0VSUl9GVU5DKE9CSl9GX09CSl9OSUQyT0JKKSwJIk9CSl9uaWQyb2JqIn0sCit7RVJSX0ZVTkMoT0JKX0ZfT0JKX05JRDJTTiksCSJPQkpfbmlkMnNuIn0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgT0JKX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oT0JKX1JfTUFMTE9DX0ZBSUxVUkUpICAgICAgICAsIm1hbGxvYyBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihPQkpfUl9VTktOT1dOX05JRCkgICAgICAgICAgICwidW5rbm93biBuaWQifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfT0JKX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKE9CSl9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxPQkpfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxPQkpfc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfbGliLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNlOWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ial9saWIuYwpAQCAtMCwwICsxLDEyOSBAQAorLyogY3J5cHRvL29iamVjdHMvb2JqX2xpYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisKK0FTTjFfT0JKRUNUICpPQkpfZHVwKGNvbnN0IEFTTjFfT0JKRUNUICpvKQorCXsKKwlBU04xX09CSkVDVCAqcjsKKwlpbnQgaTsKKwljaGFyICpsbj1OVUxMLCpzbj1OVUxMOworCXVuc2lnbmVkIGNoYXIgKmRhdGE9TlVMTDsKKworCWlmIChvID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlpZiAoIShvLT5mbGFncyAmIEFTTjFfT0JKRUNUX0ZMQUdfRFlOQU1JQykpCisJCXJldHVybigoQVNOMV9PQkpFQ1QgKilvKTsgLyogWFhYOiB1Z2ghIFdoeT8gV2hhdCBraW5kIG9mCisJCQkJCSAgICAgZHVwbGljYXRpb24gaXMgdGhpcz8/PyAqLworCisJcj1BU04xX09CSkVDVF9uZXcoKTsKKwlpZiAociA9PSBOVUxMKQorCQl7CisJCU9CSmVycihPQkpfRl9PQkpfRFVQLEVSUl9SX0FTTjFfTElCKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJZGF0YT1PUEVOU1NMX21hbGxvYyhvLT5sZW5ndGgpOworCWlmIChkYXRhID09IE5VTEwpCisJCWdvdG8gZXJyOworCWlmIChvLT5kYXRhICE9IE5VTEwpCisJCW1lbWNweShkYXRhLG8tPmRhdGEsby0+bGVuZ3RoKTsKKwkvKiBvbmNlIGRhdGEgYXR0YWNoZWQgdG8gb2JqZWN0IGl0IHJlbWFpbnMgY29uc3QgKi8KKwlyLT5kYXRhID0gZGF0YTsKKwlyLT5sZW5ndGg9by0+bGVuZ3RoOworCXItPm5pZD1vLT5uaWQ7CisJci0+bG49ci0+c249TlVMTDsKKwlpZiAoby0+bG4gIT0gTlVMTCkKKwkJeworCQlpPXN0cmxlbihvLT5sbikrMTsKKwkJbG49T1BFTlNTTF9tYWxsb2MoaSk7CisJCWlmIChsbiA9PSBOVUxMKSBnb3RvIGVycjsKKwkJbWVtY3B5KGxuLG8tPmxuLGkpOworCQlyLT5sbj1sbjsKKwkJfQorCisJaWYgKG8tPnNuICE9IE5VTEwpCisJCXsKKwkJaT1zdHJsZW4oby0+c24pKzE7CisJCXNuPU9QRU5TU0xfbWFsbG9jKGkpOworCQlpZiAoc24gPT0gTlVMTCkgZ290byBlcnI7CisJCW1lbWNweShzbixvLT5zbixpKTsKKwkJci0+c249c247CisJCX0KKwlyLT5mbGFncz1vLT5mbGFnc3woQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDfAorCQlBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfU1RSSU5HU3xBU04xX09CSkVDVF9GTEFHX0RZTkFNSUNfREFUQSk7CisJcmV0dXJuKHIpOworZXJyOgorCU9CSmVycihPQkpfRl9PQkpfRFVQLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlpZiAobG4gIT0gTlVMTCkJCU9QRU5TU0xfZnJlZShsbik7CisJaWYgKHNuICE9IE5VTEwpCQlPUEVOU1NMX2ZyZWUoc24pOworCWlmIChkYXRhICE9IE5VTEwpCU9QRU5TU0xfZnJlZShkYXRhKTsKKwlpZiAociAhPSBOVUxMKQkJT1BFTlNTTF9mcmVlKHIpOworCXJldHVybihOVUxMKTsKKwl9CisKK2ludCBPQkpfY21wKGNvbnN0IEFTTjFfT0JKRUNUICphLCBjb25zdCBBU04xX09CSkVDVCAqYikKKwl7CisJaW50IHJldDsKKworCXJldD0oYS0+bGVuZ3RoLWItPmxlbmd0aCk7CisJaWYgKHJldCkgcmV0dXJuKHJldCk7CisJcmV0dXJuKG1lbWNtcChhLT5kYXRhLGItPmRhdGEsYS0+bGVuZ3RoKSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqX21hYy5oIGIvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqX21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MmYxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfbWFjLmgKQEAgLTAsMCArMSwzOTE0IEBACisvKiBjcnlwdG8vb2JqZWN0cy9vYmpfbWFjLmggKi8KKworLyogVEhJUyBGSUxFIElTIEdFTkVSQVRFRCBGUk9NIG9iamVjdHMudHh0IGJ5IG9iamVjdHMucGwgdmlhIHRoZQorICogZm9sbG93aW5nIGNvbW1hbmQ6CisgKiBwZXJsIG9iamVjdHMucGwgb2JqZWN0cy50eHQgb2JqX21hYy5udW0gb2JqX21hYy5oCisgKi8KKworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjZGVmaW5lIFNOX3VuZGVmCQkJIlVOREVGIgorI2RlZmluZSBMTl91bmRlZgkJCSJ1bmRlZmluZWQiCisjZGVmaW5lIE5JRF91bmRlZgkJCTAKKyNkZWZpbmUgT0JKX3VuZGVmCQkJMEwKKworI2RlZmluZSBTTl9pdHVfdAkJIklUVS1UIgorI2RlZmluZSBMTl9pdHVfdAkJIml0dS10IgorI2RlZmluZSBOSURfaXR1X3QJCTY0NQorI2RlZmluZSBPQkpfaXR1X3QJCTBMCisKKyNkZWZpbmUgTklEX2NjaXR0CQk0MDQKKyNkZWZpbmUgT0JKX2NjaXR0CQlPQkpfaXR1X3QKKworI2RlZmluZSBTTl9pc28JCSJJU08iCisjZGVmaW5lIExOX2lzbwkJImlzbyIKKyNkZWZpbmUgTklEX2lzbwkJMTgxCisjZGVmaW5lIE9CSl9pc28JCTFMCisKKyNkZWZpbmUgU05fam9pbnRfaXNvX2l0dV90CQkiSk9JTlQtSVNPLUlUVS1UIgorI2RlZmluZSBMTl9qb2ludF9pc29faXR1X3QJCSJqb2ludC1pc28taXR1LXQiCisjZGVmaW5lIE5JRF9qb2ludF9pc29faXR1X3QJCTY0NgorI2RlZmluZSBPQkpfam9pbnRfaXNvX2l0dV90CQkyTAorCisjZGVmaW5lIE5JRF9qb2ludF9pc29fY2NpdHQJCTM5MworI2RlZmluZSBPQkpfam9pbnRfaXNvX2NjaXR0CQlPQkpfam9pbnRfaXNvX2l0dV90CisKKyNkZWZpbmUgU05fbWVtYmVyX2JvZHkJCSJtZW1iZXItYm9keSIKKyNkZWZpbmUgTE5fbWVtYmVyX2JvZHkJCSJJU08gTWVtYmVyIEJvZHkiCisjZGVmaW5lIE5JRF9tZW1iZXJfYm9keQkJMTgyCisjZGVmaW5lIE9CSl9tZW1iZXJfYm9keQkJT0JKX2lzbywyTAorCisjZGVmaW5lIFNOX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uCQkiaWRlbnRpZmllZC1vcmdhbml6YXRpb24iCisjZGVmaW5lIE5JRF9pZGVudGlmaWVkX29yZ2FuaXphdGlvbgkJNjc2CisjZGVmaW5lIE9CSl9pZGVudGlmaWVkX29yZ2FuaXphdGlvbgkJT0JKX2lzbywzTAorCisjZGVmaW5lIFNOX2htYWNfbWQ1CQkiSE1BQy1NRDUiCisjZGVmaW5lIExOX2htYWNfbWQ1CQkiaG1hYy1tZDUiCisjZGVmaW5lIE5JRF9obWFjX21kNQkJNzgwCisjZGVmaW5lIE9CSl9obWFjX21kNQkJT0JKX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uLDZMLDFMLDVMLDVMLDhMLDFMLDFMCisKKyNkZWZpbmUgU05faG1hY19zaGExCQkiSE1BQy1TSEExIgorI2RlZmluZSBMTl9obWFjX3NoYTEJCSJobWFjLXNoYTEiCisjZGVmaW5lIE5JRF9obWFjX3NoYTEJCTc4MQorI2RlZmluZSBPQkpfaG1hY19zaGExCQlPQkpfaWRlbnRpZmllZF9vcmdhbml6YXRpb24sNkwsMUwsNUwsNUwsOEwsMUwsMkwKKworI2RlZmluZSBTTl9jZXJ0aWNvbV9hcmMJCSJjZXJ0aWNvbS1hcmMiCisjZGVmaW5lIE5JRF9jZXJ0aWNvbV9hcmMJCTY3NworI2RlZmluZSBPQkpfY2VydGljb21fYXJjCQlPQkpfaWRlbnRpZmllZF9vcmdhbml6YXRpb24sMTMyTAorCisjZGVmaW5lIFNOX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucwkJImludGVybmF0aW9uYWwtb3JnYW5pemF0aW9ucyIKKyNkZWZpbmUgTE5faW50ZXJuYXRpb25hbF9vcmdhbml6YXRpb25zCQkiSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb25zIgorI2RlZmluZSBOSURfaW50ZXJuYXRpb25hbF9vcmdhbml6YXRpb25zCQk2NDcKKyNkZWZpbmUgT0JKX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucwkJT0JKX2pvaW50X2lzb19pdHVfdCwyM0wKKworI2RlZmluZSBTTl93YXAJCSJ3YXAiCisjZGVmaW5lIE5JRF93YXAJCTY3OAorI2RlZmluZSBPQkpfd2FwCQlPQkpfaW50ZXJuYXRpb25hbF9vcmdhbml6YXRpb25zLDQzTAorCisjZGVmaW5lIFNOX3dhcF93c2cJCSJ3YXAtd3NnIgorI2RlZmluZSBOSURfd2FwX3dzZwkJNjc5CisjZGVmaW5lIE9CSl93YXBfd3NnCQlPQkpfd2FwLDFMCisKKyNkZWZpbmUgU05fc2VsZWN0ZWRfYXR0cmlidXRlX3R5cGVzCQkic2VsZWN0ZWQtYXR0cmlidXRlLXR5cGVzIgorI2RlZmluZSBMTl9zZWxlY3RlZF9hdHRyaWJ1dGVfdHlwZXMJCSJTZWxlY3RlZCBBdHRyaWJ1dGUgVHlwZXMiCisjZGVmaW5lIE5JRF9zZWxlY3RlZF9hdHRyaWJ1dGVfdHlwZXMJCTM5NAorI2RlZmluZSBPQkpfc2VsZWN0ZWRfYXR0cmlidXRlX3R5cGVzCQlPQkpfam9pbnRfaXNvX2l0dV90LDVMLDFMLDVMCisKKyNkZWZpbmUgU05fY2xlYXJhbmNlCQkiY2xlYXJhbmNlIgorI2RlZmluZSBOSURfY2xlYXJhbmNlCQkzOTUKKyNkZWZpbmUgT0JKX2NsZWFyYW5jZQkJT0JKX3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcyw1NUwKKworI2RlZmluZSBTTl9JU09fVVMJCSJJU08tVVMiCisjZGVmaW5lIExOX0lTT19VUwkJIklTTyBVUyBNZW1iZXIgQm9keSIKKyNkZWZpbmUgTklEX0lTT19VUwkJMTgzCisjZGVmaW5lIE9CSl9JU09fVVMJCU9CSl9tZW1iZXJfYm9keSw4NDBMCisKKyNkZWZpbmUgU05fWDlfNTcJCSJYOS01NyIKKyNkZWZpbmUgTE5fWDlfNTcJCSJYOS41NyIKKyNkZWZpbmUgTklEX1g5XzU3CQkxODQKKyNkZWZpbmUgT0JKX1g5XzU3CQlPQkpfSVNPX1VTLDEwMDQwTAorCisjZGVmaW5lIFNOX1g5Y20JCSJYOWNtIgorI2RlZmluZSBMTl9YOWNtCQkiWDkuNTcgQ00gPyIKKyNkZWZpbmUgTklEX1g5Y20JCTE4NQorI2RlZmluZSBPQkpfWDljbQkJT0JKX1g5XzU3LDRMCisKKyNkZWZpbmUgU05fZHNhCQkiRFNBIgorI2RlZmluZSBMTl9kc2EJCSJkc2FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfZHNhCQkxMTYKKyNkZWZpbmUgT0JKX2RzYQkJT0JKX1g5Y20sMUwKKworI2RlZmluZSBTTl9kc2FXaXRoU0hBMQkJIkRTQS1TSEExIgorI2RlZmluZSBMTl9kc2FXaXRoU0hBMQkJImRzYVdpdGhTSEExIgorI2RlZmluZSBOSURfZHNhV2l0aFNIQTEJCTExMworI2RlZmluZSBPQkpfZHNhV2l0aFNIQTEJCU9CSl9YOWNtLDNMCisKKyNkZWZpbmUgU05fYW5zaV9YOV82MgkJImFuc2ktWDktNjIiCisjZGVmaW5lIExOX2Fuc2lfWDlfNjIJCSJBTlNJIFg5LjYyIgorI2RlZmluZSBOSURfYW5zaV9YOV82MgkJNDA1CisjZGVmaW5lIE9CSl9hbnNpX1g5XzYyCQlPQkpfSVNPX1VTLDEwMDQ1TAorCisjZGVmaW5lIE9CSl9YOV82Ml9pZF9maWVsZFR5cGUJCU9CSl9hbnNpX1g5XzYyLDFMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWVfZmllbGQJCSJwcmltZS1maWVsZCIKKyNkZWZpbmUgTklEX1g5XzYyX3ByaW1lX2ZpZWxkCQk0MDYKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lX2ZpZWxkCQlPQkpfWDlfNjJfaWRfZmllbGRUeXBlLDFMCisKKyNkZWZpbmUgU05fWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkCQkiY2hhcmFjdGVyaXN0aWMtdHdvLWZpZWxkIgorI2RlZmluZSBOSURfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkCQk0MDcKKyNkZWZpbmUgT0JKX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZAkJT0JKX1g5XzYyX2lkX2ZpZWxkVHlwZSwyTAorCisjZGVmaW5lIFNOX1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcwkJImlkLWNoYXJhY3RlcmlzdGljLXR3by1iYXNpcyIKKyNkZWZpbmUgTklEX1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcwkJNjgwCisjZGVmaW5lIE9CSl9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMJCU9CSl9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQsM0wKKworI2RlZmluZSBTTl9YOV82Ml9vbkJhc2lzCQkib25CYXNpcyIKKyNkZWZpbmUgTklEX1g5XzYyX29uQmFzaXMJCTY4MQorI2RlZmluZSBPQkpfWDlfNjJfb25CYXNpcwkJT0JKX1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcywxTAorCisjZGVmaW5lIFNOX1g5XzYyX3RwQmFzaXMJCSJ0cEJhc2lzIgorI2RlZmluZSBOSURfWDlfNjJfdHBCYXNpcwkJNjgyCisjZGVmaW5lIE9CSl9YOV82Ml90cEJhc2lzCQlPQkpfWDlfNjJfaWRfY2hhcmFjdGVyaXN0aWNfdHdvX2Jhc2lzLDJMCisKKyNkZWZpbmUgU05fWDlfNjJfcHBCYXNpcwkJInBwQmFzaXMiCisjZGVmaW5lIE5JRF9YOV82Ml9wcEJhc2lzCQk2ODMKKyNkZWZpbmUgT0JKX1g5XzYyX3BwQmFzaXMJCU9CSl9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMsM0wKKworI2RlZmluZSBPQkpfWDlfNjJfaWRfcHVibGljS2V5VHlwZQkJT0JKX2Fuc2lfWDlfNjIsMkwKKworI2RlZmluZSBTTl9YOV82Ml9pZF9lY1B1YmxpY0tleQkJImlkLWVjUHVibGljS2V5IgorI2RlZmluZSBOSURfWDlfNjJfaWRfZWNQdWJsaWNLZXkJCTQwOAorI2RlZmluZSBPQkpfWDlfNjJfaWRfZWNQdWJsaWNLZXkJCU9CSl9YOV82Ml9pZF9wdWJsaWNLZXlUeXBlLDFMCisKKyNkZWZpbmUgT0JKX1g5XzYyX2VsbGlwdGljQ3VydmUJCU9CSl9hbnNpX1g5XzYyLDNMCisKKyNkZWZpbmUgT0JKX1g5XzYyX2NfVHdvQ3VydmUJCU9CSl9YOV82Ml9lbGxpcHRpY0N1cnZlLDBMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJwbmIxNjN2MQkJImMycG5iMTYzdjEiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnBuYjE2M3YxCQk2ODQKKyNkZWZpbmUgT0JKX1g5XzYyX2MycG5iMTYzdjEJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDFMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJwbmIxNjN2MgkJImMycG5iMTYzdjIiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnBuYjE2M3YyCQk2ODUKKyNkZWZpbmUgT0JKX1g5XzYyX2MycG5iMTYzdjIJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDJMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJwbmIxNjN2MwkJImMycG5iMTYzdjMiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnBuYjE2M3YzCQk2ODYKKyNkZWZpbmUgT0JKX1g5XzYyX2MycG5iMTYzdjMJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDNMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJwbmIxNzZ2MQkJImMycG5iMTc2djEiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnBuYjE3NnYxCQk2ODcKKyNkZWZpbmUgT0JKX1g5XzYyX2MycG5iMTc2djEJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDRMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJ0bmIxOTF2MQkJImMydG5iMTkxdjEiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnRuYjE5MXYxCQk2ODgKKyNkZWZpbmUgT0JKX1g5XzYyX2MydG5iMTkxdjEJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDVMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJ0bmIxOTF2MgkJImMydG5iMTkxdjIiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnRuYjE5MXYyCQk2ODkKKyNkZWZpbmUgT0JKX1g5XzYyX2MydG5iMTkxdjIJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDZMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJ0bmIxOTF2MwkJImMydG5iMTkxdjMiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnRuYjE5MXYzCQk2OTAKKyNkZWZpbmUgT0JKX1g5XzYyX2MydG5iMTkxdjMJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDdMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJvbmIxOTF2NAkJImMyb25iMTkxdjQiCisjZGVmaW5lIE5JRF9YOV82Ml9jMm9uYjE5MXY0CQk2OTEKKyNkZWZpbmUgT0JKX1g5XzYyX2Myb25iMTkxdjQJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDhMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJvbmIxOTF2NQkJImMyb25iMTkxdjUiCisjZGVmaW5lIE5JRF9YOV82Ml9jMm9uYjE5MXY1CQk2OTIKKyNkZWZpbmUgT0JKX1g5XzYyX2Myb25iMTkxdjUJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDlMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJwbmIyMDh3MQkJImMycG5iMjA4dzEiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnBuYjIwOHcxCQk2OTMKKyNkZWZpbmUgT0JKX1g5XzYyX2MycG5iMjA4dzEJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDEwTAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMjM5djEJCSJjMnRuYjIzOXYxIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIyMzl2MQkJNjk0CisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjIzOXYxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxMUwKKworI2RlZmluZSBTTl9YOV82Ml9jMnRuYjIzOXYyCQkiYzJ0bmIyMzl2MiIKKyNkZWZpbmUgTklEX1g5XzYyX2MydG5iMjM5djIJCTY5NQorI2RlZmluZSBPQkpfWDlfNjJfYzJ0bmIyMzl2MgkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMTJMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJ0bmIyMzl2MwkJImMydG5iMjM5djMiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnRuYjIzOXYzCQk2OTYKKyNkZWZpbmUgT0JKX1g5XzYyX2MydG5iMjM5djMJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDEzTAorCisjZGVmaW5lIFNOX1g5XzYyX2Myb25iMjM5djQJCSJjMm9uYjIzOXY0IgorI2RlZmluZSBOSURfWDlfNjJfYzJvbmIyMzl2NAkJNjk3CisjZGVmaW5lIE9CSl9YOV82Ml9jMm9uYjIzOXY0CQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxNEwKKworI2RlZmluZSBTTl9YOV82Ml9jMm9uYjIzOXY1CQkiYzJvbmIyMzl2NSIKKyNkZWZpbmUgTklEX1g5XzYyX2Myb25iMjM5djUJCTY5OAorI2RlZmluZSBPQkpfWDlfNjJfYzJvbmIyMzl2NQkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMTVMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJwbmIyNzJ3MQkJImMycG5iMjcydzEiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnBuYjI3MncxCQk2OTkKKyNkZWZpbmUgT0JKX1g5XzYyX2MycG5iMjcydzEJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDE2TAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMzA0dzEJCSJjMnBuYjMwNHcxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIzMDR3MQkJNzAwCisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjMwNHcxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxN0wKKworI2RlZmluZSBTTl9YOV82Ml9jMnRuYjM1OXYxCQkiYzJ0bmIzNTl2MSIKKyNkZWZpbmUgTklEX1g5XzYyX2MydG5iMzU5djEJCTcwMQorI2RlZmluZSBPQkpfWDlfNjJfYzJ0bmIzNTl2MQkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMThMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJwbmIzNjh3MQkJImMycG5iMzY4dzEiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnBuYjM2OHcxCQk3MDIKKyNkZWZpbmUgT0JKX1g5XzYyX2MycG5iMzY4dzEJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDE5TAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iNDMxcjEJCSJjMnRuYjQzMXIxIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmI0MzFyMQkJNzAzCisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjQzMXIxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwyMEwKKworI2RlZmluZSBPQkpfWDlfNjJfcHJpbWVDdXJ2ZQkJT0JKX1g5XzYyX2VsbGlwdGljQ3VydmUsMUwKKworI2RlZmluZSBTTl9YOV82Ml9wcmltZTE5MnYxCQkicHJpbWUxOTJ2MSIKKyNkZWZpbmUgTklEX1g5XzYyX3ByaW1lMTkydjEJCTQwOQorI2RlZmluZSBPQkpfWDlfNjJfcHJpbWUxOTJ2MQkJT0JKX1g5XzYyX3ByaW1lQ3VydmUsMUwKKworI2RlZmluZSBTTl9YOV82Ml9wcmltZTE5MnYyCQkicHJpbWUxOTJ2MiIKKyNkZWZpbmUgTklEX1g5XzYyX3ByaW1lMTkydjIJCTQxMAorI2RlZmluZSBPQkpfWDlfNjJfcHJpbWUxOTJ2MgkJT0JKX1g5XzYyX3ByaW1lQ3VydmUsMkwKKworI2RlZmluZSBTTl9YOV82Ml9wcmltZTE5MnYzCQkicHJpbWUxOTJ2MyIKKyNkZWZpbmUgTklEX1g5XzYyX3ByaW1lMTkydjMJCTQxMQorI2RlZmluZSBPQkpfWDlfNjJfcHJpbWUxOTJ2MwkJT0JKX1g5XzYyX3ByaW1lQ3VydmUsM0wKKworI2RlZmluZSBTTl9YOV82Ml9wcmltZTIzOXYxCQkicHJpbWUyMzl2MSIKKyNkZWZpbmUgTklEX1g5XzYyX3ByaW1lMjM5djEJCTQxMgorI2RlZmluZSBPQkpfWDlfNjJfcHJpbWUyMzl2MQkJT0JKX1g5XzYyX3ByaW1lQ3VydmUsNEwKKworI2RlZmluZSBTTl9YOV82Ml9wcmltZTIzOXYyCQkicHJpbWUyMzl2MiIKKyNkZWZpbmUgTklEX1g5XzYyX3ByaW1lMjM5djIJCTQxMworI2RlZmluZSBPQkpfWDlfNjJfcHJpbWUyMzl2MgkJT0JKX1g5XzYyX3ByaW1lQ3VydmUsNUwKKworI2RlZmluZSBTTl9YOV82Ml9wcmltZTIzOXYzCQkicHJpbWUyMzl2MyIKKyNkZWZpbmUgTklEX1g5XzYyX3ByaW1lMjM5djMJCTQxNAorI2RlZmluZSBPQkpfWDlfNjJfcHJpbWUyMzl2MwkJT0JKX1g5XzYyX3ByaW1lQ3VydmUsNkwKKworI2RlZmluZSBTTl9YOV82Ml9wcmltZTI1NnYxCQkicHJpbWUyNTZ2MSIKKyNkZWZpbmUgTklEX1g5XzYyX3ByaW1lMjU2djEJCTQxNQorI2RlZmluZSBPQkpfWDlfNjJfcHJpbWUyNTZ2MQkJT0JKX1g5XzYyX3ByaW1lQ3VydmUsN0wKKworI2RlZmluZSBPQkpfWDlfNjJfaWRfZWNTaWdUeXBlCQlPQkpfYW5zaV9YOV82Miw0TAorCisjZGVmaW5lIFNOX2VjZHNhX3dpdGhfU0hBMQkJImVjZHNhLXdpdGgtU0hBMSIKKyNkZWZpbmUgTklEX2VjZHNhX3dpdGhfU0hBMQkJNDE2CisjZGVmaW5lIE9CSl9lY2RzYV93aXRoX1NIQTEJCU9CSl9YOV82Ml9pZF9lY1NpZ1R5cGUsMUwKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1JlY29tbWVuZGVkCQkiZWNkc2Etd2l0aC1SZWNvbW1lbmRlZCIKKyNkZWZpbmUgTklEX2VjZHNhX3dpdGhfUmVjb21tZW5kZWQJCTc5MQorI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9SZWNvbW1lbmRlZAkJT0JKX1g5XzYyX2lkX2VjU2lnVHlwZSwyTAorCisjZGVmaW5lIFNOX2VjZHNhX3dpdGhfU3BlY2lmaWVkCQkiZWNkc2Etd2l0aC1TcGVjaWZpZWQiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1NwZWNpZmllZAkJNzkyCisjZGVmaW5lIE9CSl9lY2RzYV93aXRoX1NwZWNpZmllZAkJT0JKX1g5XzYyX2lkX2VjU2lnVHlwZSwzTAorCisjZGVmaW5lIFNOX2VjZHNhX3dpdGhfU0hBMjI0CQkiZWNkc2Etd2l0aC1TSEEyMjQiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1NIQTIyNAkJNzkzCisjZGVmaW5lIE9CSl9lY2RzYV93aXRoX1NIQTIyNAkJT0JKX2VjZHNhX3dpdGhfU3BlY2lmaWVkLDFMCisKKyNkZWZpbmUgU05fZWNkc2Ffd2l0aF9TSEEyNTYJCSJlY2RzYS13aXRoLVNIQTI1NiIKKyNkZWZpbmUgTklEX2VjZHNhX3dpdGhfU0hBMjU2CQk3OTQKKyNkZWZpbmUgT0JKX2VjZHNhX3dpdGhfU0hBMjU2CQlPQkpfZWNkc2Ffd2l0aF9TcGVjaWZpZWQsMkwKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NIQTM4NAkJImVjZHNhLXdpdGgtU0hBMzg0IgorI2RlZmluZSBOSURfZWNkc2Ffd2l0aF9TSEEzODQJCTc5NQorI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TSEEzODQJCU9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCwzTAorCisjZGVmaW5lIFNOX2VjZHNhX3dpdGhfU0hBNTEyCQkiZWNkc2Etd2l0aC1TSEE1MTIiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1NIQTUxMgkJNzk2CisjZGVmaW5lIE9CSl9lY2RzYV93aXRoX1NIQTUxMgkJT0JKX2VjZHNhX3dpdGhfU3BlY2lmaWVkLDRMCisKKyNkZWZpbmUgT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZQkJT0JKX2NlcnRpY29tX2FyYywwTAorCisjZGVmaW5lIFNOX3NlY3AxMTJyMQkJInNlY3AxMTJyMSIKKyNkZWZpbmUgTklEX3NlY3AxMTJyMQkJNzA0CisjZGVmaW5lIE9CSl9zZWNwMTEycjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsNkwKKworI2RlZmluZSBTTl9zZWNwMTEycjIJCSJzZWNwMTEycjIiCisjZGVmaW5lIE5JRF9zZWNwMTEycjIJCTcwNQorI2RlZmluZSBPQkpfc2VjcDExMnIyCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDdMCisKKyNkZWZpbmUgU05fc2VjcDEyOHIxCQkic2VjcDEyOHIxIgorI2RlZmluZSBOSURfc2VjcDEyOHIxCQk3MDYKKyNkZWZpbmUgT0JKX3NlY3AxMjhyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyOEwKKworI2RlZmluZSBTTl9zZWNwMTI4cjIJCSJzZWNwMTI4cjIiCisjZGVmaW5lIE5JRF9zZWNwMTI4cjIJCTcwNworI2RlZmluZSBPQkpfc2VjcDEyOHIyCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDI5TAorCisjZGVmaW5lIFNOX3NlY3AxNjBrMQkJInNlY3AxNjBrMSIKKyNkZWZpbmUgTklEX3NlY3AxNjBrMQkJNzA4CisjZGVmaW5lIE9CSl9zZWNwMTYwazEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsOUwKKworI2RlZmluZSBTTl9zZWNwMTYwcjEJCSJzZWNwMTYwcjEiCisjZGVmaW5lIE5JRF9zZWNwMTYwcjEJCTcwOQorI2RlZmluZSBPQkpfc2VjcDE2MHIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDhMCisKKyNkZWZpbmUgU05fc2VjcDE2MHIyCQkic2VjcDE2MHIyIgorI2RlZmluZSBOSURfc2VjcDE2MHIyCQk3MTAKKyNkZWZpbmUgT0JKX3NlY3AxNjByMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzMEwKKworI2RlZmluZSBTTl9zZWNwMTkyazEJCSJzZWNwMTkyazEiCisjZGVmaW5lIE5JRF9zZWNwMTkyazEJCTcxMQorI2RlZmluZSBPQkpfc2VjcDE5MmsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDMxTAorCisjZGVmaW5lIFNOX3NlY3AyMjRrMQkJInNlY3AyMjRrMSIKKyNkZWZpbmUgTklEX3NlY3AyMjRrMQkJNzEyCisjZGVmaW5lIE9CSl9zZWNwMjI0azEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzJMCisKKyNkZWZpbmUgU05fc2VjcDIyNHIxCQkic2VjcDIyNHIxIgorI2RlZmluZSBOSURfc2VjcDIyNHIxCQk3MTMKKyNkZWZpbmUgT0JKX3NlY3AyMjRyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzM0wKKworI2RlZmluZSBTTl9zZWNwMjU2azEJCSJzZWNwMjU2azEiCisjZGVmaW5lIE5JRF9zZWNwMjU2azEJCTcxNAorI2RlZmluZSBPQkpfc2VjcDI1NmsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDEwTAorCisjZGVmaW5lIFNOX3NlY3AzODRyMQkJInNlY3AzODRyMSIKKyNkZWZpbmUgTklEX3NlY3AzODRyMQkJNzE1CisjZGVmaW5lIE9CSl9zZWNwMzg0cjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzRMCisKKyNkZWZpbmUgU05fc2VjcDUyMXIxCQkic2VjcDUyMXIxIgorI2RlZmluZSBOSURfc2VjcDUyMXIxCQk3MTYKKyNkZWZpbmUgT0JKX3NlY3A1MjFyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzNUwKKworI2RlZmluZSBTTl9zZWN0MTEzcjEJCSJzZWN0MTEzcjEiCisjZGVmaW5lIE5JRF9zZWN0MTEzcjEJCTcxNworI2RlZmluZSBPQkpfc2VjdDExM3IxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDRMCisKKyNkZWZpbmUgU05fc2VjdDExM3IyCQkic2VjdDExM3IyIgorI2RlZmluZSBOSURfc2VjdDExM3IyCQk3MTgKKyNkZWZpbmUgT0JKX3NlY3QxMTNyMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSw1TAorCisjZGVmaW5lIFNOX3NlY3QxMzFyMQkJInNlY3QxMzFyMSIKKyNkZWZpbmUgTklEX3NlY3QxMzFyMQkJNzE5CisjZGVmaW5lIE9CSl9zZWN0MTMxcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjJMCisKKyNkZWZpbmUgU05fc2VjdDEzMXIyCQkic2VjdDEzMXIyIgorI2RlZmluZSBOSURfc2VjdDEzMXIyCQk3MjAKKyNkZWZpbmUgT0JKX3NlY3QxMzFyMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyM0wKKworI2RlZmluZSBTTl9zZWN0MTYzazEJCSJzZWN0MTYzazEiCisjZGVmaW5lIE5JRF9zZWN0MTYzazEJCTcyMQorI2RlZmluZSBPQkpfc2VjdDE2M2sxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDFMCisKKyNkZWZpbmUgU05fc2VjdDE2M3IxCQkic2VjdDE2M3IxIgorI2RlZmluZSBOSURfc2VjdDE2M3IxCQk3MjIKKyNkZWZpbmUgT0JKX3NlY3QxNjNyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyTAorCisjZGVmaW5lIFNOX3NlY3QxNjNyMgkJInNlY3QxNjNyMiIKKyNkZWZpbmUgTklEX3NlY3QxNjNyMgkJNzIzCisjZGVmaW5lIE9CSl9zZWN0MTYzcjIJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMTVMCisKKyNkZWZpbmUgU05fc2VjdDE5M3IxCQkic2VjdDE5M3IxIgorI2RlZmluZSBOSURfc2VjdDE5M3IxCQk3MjQKKyNkZWZpbmUgT0JKX3NlY3QxOTNyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyNEwKKworI2RlZmluZSBTTl9zZWN0MTkzcjIJCSJzZWN0MTkzcjIiCisjZGVmaW5lIE5JRF9zZWN0MTkzcjIJCTcyNQorI2RlZmluZSBPQkpfc2VjdDE5M3IyCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDI1TAorCisjZGVmaW5lIFNOX3NlY3QyMzNrMQkJInNlY3QyMzNrMSIKKyNkZWZpbmUgTklEX3NlY3QyMzNrMQkJNzI2CisjZGVmaW5lIE9CSl9zZWN0MjMzazEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjZMCisKKyNkZWZpbmUgU05fc2VjdDIzM3IxCQkic2VjdDIzM3IxIgorI2RlZmluZSBOSURfc2VjdDIzM3IxCQk3MjcKKyNkZWZpbmUgT0JKX3NlY3QyMzNyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyN0wKKworI2RlZmluZSBTTl9zZWN0MjM5azEJCSJzZWN0MjM5azEiCisjZGVmaW5lIE5JRF9zZWN0MjM5azEJCTcyOAorI2RlZmluZSBPQkpfc2VjdDIzOWsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDNMCisKKyNkZWZpbmUgU05fc2VjdDI4M2sxCQkic2VjdDI4M2sxIgorI2RlZmluZSBOSURfc2VjdDI4M2sxCQk3MjkKKyNkZWZpbmUgT0JKX3NlY3QyODNrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwxNkwKKworI2RlZmluZSBTTl9zZWN0MjgzcjEJCSJzZWN0MjgzcjEiCisjZGVmaW5lIE5JRF9zZWN0MjgzcjEJCTczMAorI2RlZmluZSBPQkpfc2VjdDI4M3IxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDE3TAorCisjZGVmaW5lIFNOX3NlY3Q0MDlrMQkJInNlY3Q0MDlrMSIKKyNkZWZpbmUgTklEX3NlY3Q0MDlrMQkJNzMxCisjZGVmaW5lIE9CSl9zZWN0NDA5azEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzZMCisKKyNkZWZpbmUgU05fc2VjdDQwOXIxCQkic2VjdDQwOXIxIgorI2RlZmluZSBOSURfc2VjdDQwOXIxCQk3MzIKKyNkZWZpbmUgT0JKX3NlY3Q0MDlyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzN0wKKworI2RlZmluZSBTTl9zZWN0NTcxazEJCSJzZWN0NTcxazEiCisjZGVmaW5lIE5JRF9zZWN0NTcxazEJCTczMworI2RlZmluZSBPQkpfc2VjdDU3MWsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDM4TAorCisjZGVmaW5lIFNOX3NlY3Q1NzFyMQkJInNlY3Q1NzFyMSIKKyNkZWZpbmUgTklEX3NlY3Q1NzFyMQkJNzM0CisjZGVmaW5lIE9CSl9zZWN0NTcxcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzlMCisKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWQJCU9CSl93YXBfd3NnLDRMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzMQkJIndhcC13c2ctaWRtLWVjaWQtd3RsczEiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMxCQk3MzUKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczEJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDFMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzMwkJIndhcC13c2ctaWRtLWVjaWQtd3RsczMiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMzCQk3MzYKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczMJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDNMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzNAkJIndhcC13c2ctaWRtLWVjaWQtd3RsczQiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM0CQk3MzcKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczQJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDRMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzNQkJIndhcC13c2ctaWRtLWVjaWQtd3RsczUiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM1CQk3MzgKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczUJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDVMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzNgkJIndhcC13c2ctaWRtLWVjaWQtd3RsczYiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM2CQk3MzkKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczYJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDZMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzNwkJIndhcC13c2ctaWRtLWVjaWQtd3RsczciCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM3CQk3NDAKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczcJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDdMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzOAkJIndhcC13c2ctaWRtLWVjaWQtd3RsczgiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM4CQk3NDEKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczgJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDhMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzOQkJIndhcC13c2ctaWRtLWVjaWQtd3RsczkiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHM5CQk3NDIKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczkJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDlMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzMTAJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMCIKKyNkZWZpbmUgTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczEwCQk3NDMKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczEwCQlPQkpfd2FwX3dzZ19pZG1fZWNpZCwxMEwKKworI2RlZmluZSBTTl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMQkJIndhcC13c2ctaWRtLWVjaWQtd3RsczExIgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTEJCTc0NAorI2RlZmluZSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTEJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDExTAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczEyCQkid2FwLXdzZy1pZG0tZWNpZC13dGxzMTIiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMgkJNzQ1CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMgkJT0JKX3dhcF93c2dfaWRtX2VjaWQsMTJMCisKKyNkZWZpbmUgU05fY2FzdDVfY2JjCQkiQ0FTVDUtQ0JDIgorI2RlZmluZSBMTl9jYXN0NV9jYmMJCSJjYXN0NS1jYmMiCisjZGVmaW5lIE5JRF9jYXN0NV9jYmMJCTEwOAorI2RlZmluZSBPQkpfY2FzdDVfY2JjCQlPQkpfSVNPX1VTLDExMzUzM0wsN0wsNjZMLDEwTAorCisjZGVmaW5lIFNOX2Nhc3Q1X2VjYgkJIkNBU1Q1LUVDQiIKKyNkZWZpbmUgTE5fY2FzdDVfZWNiCQkiY2FzdDUtZWNiIgorI2RlZmluZSBOSURfY2FzdDVfZWNiCQkxMDkKKworI2RlZmluZSBTTl9jYXN0NV9jZmI2NAkJIkNBU1Q1LUNGQiIKKyNkZWZpbmUgTE5fY2FzdDVfY2ZiNjQJCSJjYXN0NS1jZmIiCisjZGVmaW5lIE5JRF9jYXN0NV9jZmI2NAkJMTEwCisKKyNkZWZpbmUgU05fY2FzdDVfb2ZiNjQJCSJDQVNUNS1PRkIiCisjZGVmaW5lIExOX2Nhc3Q1X29mYjY0CQkiY2FzdDUtb2ZiIgorI2RlZmluZSBOSURfY2FzdDVfb2ZiNjQJCTExMQorCisjZGVmaW5lIExOX3BiZVdpdGhNRDVBbmRDYXN0NV9DQkMJCSJwYmVXaXRoTUQ1QW5kQ2FzdDVDQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDCQkxMTIKKyNkZWZpbmUgT0JKX3BiZVdpdGhNRDVBbmRDYXN0NV9DQkMJCU9CSl9JU09fVVMsMTEzNTMzTCw3TCw2NkwsMTJMCisKKyNkZWZpbmUgU05faWRfUGFzc3dvcmRCYXNlZE1BQwkJImlkLVBhc3N3b3JkQmFzZWRNQUMiCisjZGVmaW5lIExOX2lkX1Bhc3N3b3JkQmFzZWRNQUMJCSJwYXNzd29yZCBiYXNlZCBNQUMiCisjZGVmaW5lIE5JRF9pZF9QYXNzd29yZEJhc2VkTUFDCQk3ODIKKyNkZWZpbmUgT0JKX2lkX1Bhc3N3b3JkQmFzZWRNQUMJCU9CSl9JU09fVVMsMTEzNTMzTCw3TCw2NkwsMTNMCisKKyNkZWZpbmUgU05faWRfREhCYXNlZE1hYwkJImlkLURIQmFzZWRNYWMiCisjZGVmaW5lIExOX2lkX0RIQmFzZWRNYWMJCSJEaWZmaWUtSGVsbG1hbiBiYXNlZCBNQUMiCisjZGVmaW5lIE5JRF9pZF9ESEJhc2VkTWFjCQk3ODMKKyNkZWZpbmUgT0JKX2lkX0RIQmFzZWRNYWMJCU9CSl9JU09fVVMsMTEzNTMzTCw3TCw2NkwsMzBMCisKKyNkZWZpbmUgU05fcnNhZHNpCQkicnNhZHNpIgorI2RlZmluZSBMTl9yc2Fkc2kJCSJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiIKKyNkZWZpbmUgTklEX3JzYWRzaQkJMQorI2RlZmluZSBPQkpfcnNhZHNpCQlPQkpfSVNPX1VTLDExMzU0OUwKKworI2RlZmluZSBTTl9wa2NzCQkicGtjcyIKKyNkZWZpbmUgTE5fcGtjcwkJIlJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIFBLQ1MiCisjZGVmaW5lIE5JRF9wa2NzCQkyCisjZGVmaW5lIE9CSl9wa2NzCQlPQkpfcnNhZHNpLDFMCisKKyNkZWZpbmUgU05fcGtjczEJCSJwa2NzMSIKKyNkZWZpbmUgTklEX3BrY3MxCQkxODYKKyNkZWZpbmUgT0JKX3BrY3MxCQlPQkpfcGtjcywxTAorCisjZGVmaW5lIExOX3JzYUVuY3J5cHRpb24JCSJyc2FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfcnNhRW5jcnlwdGlvbgkJNgorI2RlZmluZSBPQkpfcnNhRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDFMCisKKyNkZWZpbmUgU05fbWQyV2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtTUQyIgorI2RlZmluZSBMTl9tZDJXaXRoUlNBRW5jcnlwdGlvbgkJIm1kMldpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfbWQyV2l0aFJTQUVuY3J5cHRpb24JCTcKKyNkZWZpbmUgT0JKX21kMldpdGhSU0FFbmNyeXB0aW9uCQlPQkpfcGtjczEsMkwKKworI2RlZmluZSBTTl9tZDRXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1NRDQiCisjZGVmaW5lIExOX21kNFdpdGhSU0FFbmNyeXB0aW9uCQkibWQ0V2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9tZDRXaXRoUlNBRW5jcnlwdGlvbgkJMzk2CisjZGVmaW5lIE9CSl9tZDRXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDNMCisKKyNkZWZpbmUgU05fbWQ1V2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtTUQ1IgorI2RlZmluZSBMTl9tZDVXaXRoUlNBRW5jcnlwdGlvbgkJIm1kNVdpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfbWQ1V2l0aFJTQUVuY3J5cHRpb24JCTgKKyNkZWZpbmUgT0JKX21kNVdpdGhSU0FFbmNyeXB0aW9uCQlPQkpfcGtjczEsNEwKKworI2RlZmluZSBTTl9zaGExV2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtU0hBMSIKKyNkZWZpbmUgTE5fc2hhMVdpdGhSU0FFbmNyeXB0aW9uCQkic2hhMVdpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfc2hhMVdpdGhSU0FFbmNyeXB0aW9uCQk2NQorI2RlZmluZSBPQkpfc2hhMVdpdGhSU0FFbmNyeXB0aW9uCQlPQkpfcGtjczEsNUwKKworI2RlZmluZSBTTl9zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1TSEEyNTYiCisjZGVmaW5lIExOX3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uCQkic2hhMjU2V2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgkJNjY4CisjZGVmaW5lIE9CSl9zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDExTAorCisjZGVmaW5lIFNOX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLVNIQTM4NCIKKyNkZWZpbmUgTE5fc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24JCSJzaGEzODRXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCQk2NjkKKyNkZWZpbmUgT0JKX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCQlPQkpfcGtjczEsMTJMCisKKyNkZWZpbmUgU05fc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtU0hBNTEyIgorI2RlZmluZSBMTl9zaGE1MTJXaXRoUlNBRW5jcnlwdGlvbgkJInNoYTUxMldpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24JCTY3MAorI2RlZmluZSBPQkpfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24JCU9CSl9wa2NzMSwxM0wKKworI2RlZmluZSBTTl9zaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1TSEEyMjQiCisjZGVmaW5lIExOX3NoYTIyNFdpdGhSU0FFbmNyeXB0aW9uCQkic2hhMjI0V2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgkJNjcxCisjZGVmaW5lIE9CSl9zaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDE0TAorCisjZGVmaW5lIFNOX3BrY3MzCQkicGtjczMiCisjZGVmaW5lIE5JRF9wa2NzMwkJMjcKKyNkZWZpbmUgT0JKX3BrY3MzCQlPQkpfcGtjcywzTAorCisjZGVmaW5lIExOX2RoS2V5QWdyZWVtZW50CQkiZGhLZXlBZ3JlZW1lbnQiCisjZGVmaW5lIE5JRF9kaEtleUFncmVlbWVudAkJMjgKKyNkZWZpbmUgT0JKX2RoS2V5QWdyZWVtZW50CQlPQkpfcGtjczMsMUwKKworI2RlZmluZSBTTl9wa2NzNQkJInBrY3M1IgorI2RlZmluZSBOSURfcGtjczUJCTE4NworI2RlZmluZSBPQkpfcGtjczUJCU9CSl9wa2NzLDVMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1EMkFuZERFU19DQkMJCSJQQkUtTUQyLURFUyIKKyNkZWZpbmUgTE5fcGJlV2l0aE1EMkFuZERFU19DQkMJCSJwYmVXaXRoTUQyQW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDJBbmRERVNfQ0JDCQk5CisjZGVmaW5lIE9CSl9wYmVXaXRoTUQyQW5kREVTX0NCQwkJT0JKX3BrY3M1LDFMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1ENUFuZERFU19DQkMJCSJQQkUtTUQ1LURFUyIKKyNkZWZpbmUgTE5fcGJlV2l0aE1ENUFuZERFU19DQkMJCSJwYmVXaXRoTUQ1QW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDVBbmRERVNfQ0JDCQkxMAorI2RlZmluZSBPQkpfcGJlV2l0aE1ENUFuZERFU19DQkMJCU9CSl9wa2NzNSwzTAorCisjZGVmaW5lIFNOX3BiZVdpdGhNRDJBbmRSQzJfQ0JDCQkiUEJFLU1EMi1SQzItNjQiCisjZGVmaW5lIExOX3BiZVdpdGhNRDJBbmRSQzJfQ0JDCQkicGJlV2l0aE1EMkFuZFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQyQW5kUkMyX0NCQwkJMTY4CisjZGVmaW5lIE9CSl9wYmVXaXRoTUQyQW5kUkMyX0NCQwkJT0JKX3BrY3M1LDRMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1ENUFuZFJDMl9DQkMJCSJQQkUtTUQ1LVJDMi02NCIKKyNkZWZpbmUgTE5fcGJlV2l0aE1ENUFuZFJDMl9DQkMJCSJwYmVXaXRoTUQ1QW5kUkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDVBbmRSQzJfQ0JDCQkxNjkKKyNkZWZpbmUgT0JKX3BiZVdpdGhNRDVBbmRSQzJfQ0JDCQlPQkpfcGtjczUsNkwKKworI2RlZmluZSBTTl9wYmVXaXRoU0hBMUFuZERFU19DQkMJCSJQQkUtU0hBMS1ERVMiCisjZGVmaW5lIExOX3BiZVdpdGhTSEExQW5kREVTX0NCQwkJInBiZVdpdGhTSEExQW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhTSEExQW5kREVTX0NCQwkJMTcwCisjZGVmaW5lIE9CSl9wYmVXaXRoU0hBMUFuZERFU19DQkMJCU9CSl9wa2NzNSwxMEwKKworI2RlZmluZSBTTl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMJCSJQQkUtU0hBMS1SQzItNjQiCisjZGVmaW5lIExOX3BiZVdpdGhTSEExQW5kUkMyX0NCQwkJInBiZVdpdGhTSEExQW5kUkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhTSEExQW5kUkMyX0NCQwkJNjgKKyNkZWZpbmUgT0JKX3BiZVdpdGhTSEExQW5kUkMyX0NCQwkJT0JKX3BrY3M1LDExTAorCisjZGVmaW5lIExOX2lkX3Bia2RmMgkJIlBCS0RGMiIKKyNkZWZpbmUgTklEX2lkX3Bia2RmMgkJNjkKKyNkZWZpbmUgT0JKX2lkX3Bia2RmMgkJT0JKX3BrY3M1LDEyTAorCisjZGVmaW5lIExOX3BiZXMyCQkiUEJFUzIiCisjZGVmaW5lIE5JRF9wYmVzMgkJMTYxCisjZGVmaW5lIE9CSl9wYmVzMgkJT0JKX3BrY3M1LDEzTAorCisjZGVmaW5lIExOX3BibWFjMQkJIlBCTUFDMSIKKyNkZWZpbmUgTklEX3BibWFjMQkJMTYyCisjZGVmaW5lIE9CSl9wYm1hYzEJCU9CSl9wa2NzNSwxNEwKKworI2RlZmluZSBTTl9wa2NzNwkJInBrY3M3IgorI2RlZmluZSBOSURfcGtjczcJCTIwCisjZGVmaW5lIE9CSl9wa2NzNwkJT0JKX3BrY3MsN0wKKworI2RlZmluZSBMTl9wa2NzN19kYXRhCQkicGtjczctZGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X2RhdGEJCTIxCisjZGVmaW5lIE9CSl9wa2NzN19kYXRhCQlPQkpfcGtjczcsMUwKKworI2RlZmluZSBMTl9wa2NzN19zaWduZWQJCSJwa2NzNy1zaWduZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfc2lnbmVkCQkyMgorI2RlZmluZSBPQkpfcGtjczdfc2lnbmVkCQlPQkpfcGtjczcsMkwKKworI2RlZmluZSBMTl9wa2NzN19lbnZlbG9wZWQJCSJwa2NzNy1lbnZlbG9wZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfZW52ZWxvcGVkCQkyMworI2RlZmluZSBPQkpfcGtjczdfZW52ZWxvcGVkCQlPQkpfcGtjczcsM0wKKworI2RlZmluZSBMTl9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQJCSJwa2NzNy1zaWduZWRBbmRFbnZlbG9wZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkCQkyNAorI2RlZmluZSBPQkpfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkCQlPQkpfcGtjczcsNEwKKworI2RlZmluZSBMTl9wa2NzN19kaWdlc3QJCSJwa2NzNy1kaWdlc3REYXRhIgorI2RlZmluZSBOSURfcGtjczdfZGlnZXN0CQkyNQorI2RlZmluZSBPQkpfcGtjczdfZGlnZXN0CQlPQkpfcGtjczcsNUwKKworI2RlZmluZSBMTl9wa2NzN19lbmNyeXB0ZWQJCSJwa2NzNy1lbmNyeXB0ZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfZW5jcnlwdGVkCQkyNgorI2RlZmluZSBPQkpfcGtjczdfZW5jcnlwdGVkCQlPQkpfcGtjczcsNkwKKworI2RlZmluZSBTTl9wa2NzOQkJInBrY3M5IgorI2RlZmluZSBOSURfcGtjczkJCTQ3CisjZGVmaW5lIE9CSl9wa2NzOQkJT0JKX3BrY3MsOUwKKworI2RlZmluZSBMTl9wa2NzOV9lbWFpbEFkZHJlc3MJCSJlbWFpbEFkZHJlc3MiCisjZGVmaW5lIE5JRF9wa2NzOV9lbWFpbEFkZHJlc3MJCTQ4CisjZGVmaW5lIE9CSl9wa2NzOV9lbWFpbEFkZHJlc3MJCU9CSl9wa2NzOSwxTAorCisjZGVmaW5lIExOX3BrY3M5X3Vuc3RydWN0dXJlZE5hbWUJCSJ1bnN0cnVjdHVyZWROYW1lIgorI2RlZmluZSBOSURfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZQkJNDkKKyNkZWZpbmUgT0JKX3BrY3M5X3Vuc3RydWN0dXJlZE5hbWUJCU9CSl9wa2NzOSwyTAorCisjZGVmaW5lIExOX3BrY3M5X2NvbnRlbnRUeXBlCQkiY29udGVudFR5cGUiCisjZGVmaW5lIE5JRF9wa2NzOV9jb250ZW50VHlwZQkJNTAKKyNkZWZpbmUgT0JKX3BrY3M5X2NvbnRlbnRUeXBlCQlPQkpfcGtjczksM0wKKworI2RlZmluZSBMTl9wa2NzOV9tZXNzYWdlRGlnZXN0CQkibWVzc2FnZURpZ2VzdCIKKyNkZWZpbmUgTklEX3BrY3M5X21lc3NhZ2VEaWdlc3QJCTUxCisjZGVmaW5lIE9CSl9wa2NzOV9tZXNzYWdlRGlnZXN0CQlPQkpfcGtjczksNEwKKworI2RlZmluZSBMTl9wa2NzOV9zaWduaW5nVGltZQkJInNpZ25pbmdUaW1lIgorI2RlZmluZSBOSURfcGtjczlfc2lnbmluZ1RpbWUJCTUyCisjZGVmaW5lIE9CSl9wa2NzOV9zaWduaW5nVGltZQkJT0JKX3BrY3M5LDVMCisKKyNkZWZpbmUgTE5fcGtjczlfY291bnRlcnNpZ25hdHVyZQkJImNvdW50ZXJzaWduYXR1cmUiCisjZGVmaW5lIE5JRF9wa2NzOV9jb3VudGVyc2lnbmF0dXJlCQk1MworI2RlZmluZSBPQkpfcGtjczlfY291bnRlcnNpZ25hdHVyZQkJT0JKX3BrY3M5LDZMCisKKyNkZWZpbmUgTE5fcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQJCSJjaGFsbGVuZ2VQYXNzd29yZCIKKyNkZWZpbmUgTklEX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkCQk1NAorI2RlZmluZSBPQkpfcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQJCU9CSl9wa2NzOSw3TAorCisjZGVmaW5lIExOX3BrY3M5X3Vuc3RydWN0dXJlZEFkZHJlc3MJCSJ1bnN0cnVjdHVyZWRBZGRyZXNzIgorI2RlZmluZSBOSURfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcwkJNTUKKyNkZWZpbmUgT0JKX3BrY3M5X3Vuc3RydWN0dXJlZEFkZHJlc3MJCU9CSl9wa2NzOSw4TAorCisjZGVmaW5lIExOX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzCQkiZXh0ZW5kZWRDZXJ0aWZpY2F0ZUF0dHJpYnV0ZXMiCisjZGVmaW5lIE5JRF9wa2NzOV9leHRDZXJ0QXR0cmlidXRlcwkJNTYKKyNkZWZpbmUgT0JKX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzCQlPQkpfcGtjczksOUwKKworI2RlZmluZSBTTl9leHRfcmVxCQkiZXh0UmVxIgorI2RlZmluZSBMTl9leHRfcmVxCQkiRXh0ZW5zaW9uIFJlcXVlc3QiCisjZGVmaW5lIE5JRF9leHRfcmVxCQkxNzIKKyNkZWZpbmUgT0JKX2V4dF9yZXEJCU9CSl9wa2NzOSwxNEwKKworI2RlZmluZSBTTl9TTUlNRUNhcGFiaWxpdGllcwkJIlNNSU1FLUNBUFMiCisjZGVmaW5lIExOX1NNSU1FQ2FwYWJpbGl0aWVzCQkiUy9NSU1FIENhcGFiaWxpdGllcyIKKyNkZWZpbmUgTklEX1NNSU1FQ2FwYWJpbGl0aWVzCQkxNjcKKyNkZWZpbmUgT0JKX1NNSU1FQ2FwYWJpbGl0aWVzCQlPQkpfcGtjczksMTVMCisKKyNkZWZpbmUgU05fU01JTUUJCSJTTUlNRSIKKyNkZWZpbmUgTE5fU01JTUUJCSJTL01JTUUiCisjZGVmaW5lIE5JRF9TTUlNRQkJMTg4CisjZGVmaW5lIE9CSl9TTUlNRQkJT0JKX3BrY3M5LDE2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZAkJImlkLXNtaW1lLW1vZCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZAkJMTg5CisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2QJCU9CSl9TTUlNRSwwTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0CQkiaWQtc21pbWUtY3QiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdAkJMTkwCisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdAkJT0JKX1NNSU1FLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWEJCSJpZC1zbWltZS1hYSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhCQkxOTEKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhCQlPQkpfU01JTUUsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hbGcJCSJpZC1zbWltZS1hbGciCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGcJCTE5MgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWxnCQlPQkpfU01JTUUsM0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9jZAkJImlkLXNtaW1lLWNkIgorI2RlZmluZSBOSURfaWRfc21pbWVfY2QJCTE5MworI2RlZmluZSBPQkpfaWRfc21pbWVfY2QJCU9CSl9TTUlNRSw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX3NwcQkJImlkLXNtaW1lLXNwcSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX3NwcQkJMTk0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9zcHEJCU9CSl9TTUlNRSw1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0aQkJImlkLXNtaW1lLWN0aSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0aQkJMTk1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdGkJCU9CSl9TTUlNRSw2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9jbXMJCSJpZC1zbWltZS1tb2QtY21zIgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX2NtcwkJMTk2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfY21zCQlPQkpfaWRfc21pbWVfbW9kLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfbW9kX2VzcwkJImlkLXNtaW1lLW1vZC1lc3MiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9tb2RfZXNzCQkxOTcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX21vZF9lc3MJCU9CSl9pZF9zbWltZV9tb2QsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9tb2Rfb2lkCQkiaWQtc21pbWUtbW9kLW9pZCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZF9vaWQJCTE5OAorI2RlZmluZSBPQkpfaWRfc21pbWVfbW9kX29pZAkJT0JKX2lkX3NtaW1lX21vZCwzTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9tc2dfdjMJCSJpZC1zbWltZS1tb2QtbXNnLXYzIgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX21zZ192MwkJMTk5CisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfbXNnX3YzCQlPQkpfaWRfc21pbWVfbW9kLDRMCisKKyNkZWZpbmUgU05faWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzg4CQkiaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTg4IgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzg4CQkyMDAKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV84OAkJT0JKX2lkX3NtaW1lX21vZCw1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV85NwkJImlkLXNtaW1lLW1vZC1ldHMtZVNpZ25hdHVyZS05NyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV85NwkJMjAxCisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfOTcJCU9CSl9pZF9zbWltZV9tb2QsNkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfODgJCSJpZC1zbWltZS1tb2QtZXRzLWVTaWdQb2xpY3ktODgiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfODgJCTIwMgorI2RlZmluZSBPQkpfaWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzg4CQlPQkpfaWRfc21pbWVfbW9kLDdMCisKKyNkZWZpbmUgU05faWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzk3CQkiaWQtc21pbWUtbW9kLWV0cy1lU2lnUG9saWN5LTk3IgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzk3CQkyMDMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV85NwkJT0JKX2lkX3NtaW1lX21vZCw4TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X3JlY2VpcHQJCSJpZC1zbWltZS1jdC1yZWNlaXB0IgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfcmVjZWlwdAkJMjA0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9yZWNlaXB0CQlPQkpfaWRfc21pbWVfY3QsMUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9hdXRoRGF0YQkJImlkLXNtaW1lLWN0LWF1dGhEYXRhIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfYXV0aERhdGEJCTIwNQorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfYXV0aERhdGEJCU9CSl9pZF9zbWltZV9jdCwyTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X3B1Ymxpc2hDZXJ0CQkiaWQtc21pbWUtY3QtcHVibGlzaENlcnQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdF9wdWJsaXNoQ2VydAkJMjA2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9wdWJsaXNoQ2VydAkJT0JKX2lkX3NtaW1lX2N0LDNMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RfVFNUSW5mbwkJImlkLXNtaW1lLWN0LVRTVEluZm8iCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdF9UU1RJbmZvCQkyMDcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0X1RTVEluZm8JCU9CSl9pZF9zbWltZV9jdCw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X1REVEluZm8JCSJpZC1zbWltZS1jdC1URFRJbmZvIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfVERUSW5mbwkJMjA4CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9URFRJbmZvCQlPQkpfaWRfc21pbWVfY3QsNUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9jb250ZW50SW5mbwkJImlkLXNtaW1lLWN0LWNvbnRlbnRJbmZvIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfY29udGVudEluZm8JCTIwOQorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfY29udGVudEluZm8JCU9CSl9pZF9zbWltZV9jdCw2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X0RWQ1NSZXF1ZXN0RGF0YQkJImlkLXNtaW1lLWN0LURWQ1NSZXF1ZXN0RGF0YSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0X0RWQ1NSZXF1ZXN0RGF0YQkJMjEwCisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9EVkNTUmVxdWVzdERhdGEJCU9CSl9pZF9zbWltZV9jdCw3TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X0RWQ1NSZXNwb25zZURhdGEJCSJpZC1zbWltZS1jdC1EVkNTUmVzcG9uc2VEYXRhIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfRFZDU1Jlc3BvbnNlRGF0YQkJMjExCisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9EVkNTUmVzcG9uc2VEYXRhCQlPQkpfaWRfc21pbWVfY3QsOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9jb21wcmVzc2VkRGF0YQkJImlkLXNtaW1lLWN0LWNvbXByZXNzZWREYXRhIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfY29tcHJlc3NlZERhdGEJCTc4NgorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfY29tcHJlc3NlZERhdGEJCU9CSl9pZF9zbWltZV9jdCw5TAorCisjZGVmaW5lIFNOX2lkX2N0X2FzY2lpVGV4dFdpdGhDUkxGCQkiaWQtY3QtYXNjaWlUZXh0V2l0aENSTEYiCisjZGVmaW5lIE5JRF9pZF9jdF9hc2NpaVRleHRXaXRoQ1JMRgkJNzg3CisjZGVmaW5lIE9CSl9pZF9jdF9hc2NpaVRleHRXaXRoQ1JMRgkJT0JKX2lkX3NtaW1lX2N0LDI3TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX3JlY2VpcHRSZXF1ZXN0CQkiaWQtc21pbWUtYWEtcmVjZWlwdFJlcXVlc3QiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9yZWNlaXB0UmVxdWVzdAkJMjEyCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9yZWNlaXB0UmVxdWVzdAkJT0JKX2lkX3NtaW1lX2FhLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfc2VjdXJpdHlMYWJlbAkJImlkLXNtaW1lLWFhLXNlY3VyaXR5TGFiZWwiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9zZWN1cml0eUxhYmVsCQkyMTMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX3NlY3VyaXR5TGFiZWwJCU9CSl9pZF9zbWltZV9hYSwyTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX21sRXhwYW5kSGlzdG9yeQkJImlkLXNtaW1lLWFhLW1sRXhwYW5kSGlzdG9yeSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX21sRXhwYW5kSGlzdG9yeQkJMjE0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9tbEV4cGFuZEhpc3RvcnkJCU9CSl9pZF9zbWltZV9hYSwzTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2NvbnRlbnRIaW50CQkiaWQtc21pbWUtYWEtY29udGVudEhpbnQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9jb250ZW50SGludAkJMjE1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9jb250ZW50SGludAkJT0JKX2lkX3NtaW1lX2FhLDRMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0CQkiaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0IgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0CQkyMTYKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX21zZ1NpZ0RpZ2VzdAkJT0JKX2lkX3NtaW1lX2FhLDVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZW5jYXBDb250ZW50VHlwZQkJImlkLXNtaW1lLWFhLWVuY2FwQ29udGVudFR5cGUiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9lbmNhcENvbnRlbnRUeXBlCQkyMTcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2VuY2FwQ29udGVudFR5cGUJCU9CSl9pZF9zbWltZV9hYSw2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2NvbnRlbnRJZGVudGlmaWVyCQkiaWQtc21pbWUtYWEtY29udGVudElkZW50aWZpZXIiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9jb250ZW50SWRlbnRpZmllcgkJMjE4CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9jb250ZW50SWRlbnRpZmllcgkJT0JKX2lkX3NtaW1lX2FhLDdMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfbWFjVmFsdWUJCSJpZC1zbWltZS1hYS1tYWNWYWx1ZSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX21hY1ZhbHVlCQkyMTkKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX21hY1ZhbHVlCQlPQkpfaWRfc21pbWVfYWEsOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9lcXVpdmFsZW50TGFiZWxzCQkiaWQtc21pbWUtYWEtZXF1aXZhbGVudExhYmVscyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2VxdWl2YWxlbnRMYWJlbHMJCTIyMAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXF1aXZhbGVudExhYmVscwkJT0JKX2lkX3NtaW1lX2FhLDlMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfY29udGVudFJlZmVyZW5jZQkJImlkLXNtaW1lLWFhLWNvbnRlbnRSZWZlcmVuY2UiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9jb250ZW50UmVmZXJlbmNlCQkyMjEKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UJCU9CSl9pZF9zbWltZV9hYSwxMEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9lbmNyeXBLZXlQcmVmCQkiaWQtc21pbWUtYWEtZW5jcnlwS2V5UHJlZiIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2VuY3J5cEtleVByZWYJCTIyMgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZW5jcnlwS2V5UHJlZgkJT0JKX2lkX3NtaW1lX2FhLDExTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZQkJImlkLXNtaW1lLWFhLXNpZ25pbmdDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX3NpZ25pbmdDZXJ0aWZpY2F0ZQkJMjIzCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9zaWduaW5nQ2VydGlmaWNhdGUJCU9CSl9pZF9zbWltZV9hYSwxMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9zbWltZUVuY3J5cHRDZXJ0cwkJImlkLXNtaW1lLWFhLXNtaW1lRW5jcnlwdENlcnRzIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMJCTIyNAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMJCU9CSl9pZF9zbWltZV9hYSwxM0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV90aW1lU3RhbXBUb2tlbgkJImlkLXNtaW1lLWFhLXRpbWVTdGFtcFRva2VuIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfdGltZVN0YW1wVG9rZW4JCTIyNQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfdGltZVN0YW1wVG9rZW4JCU9CSl9pZF9zbWltZV9hYSwxNEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfc2lnUG9saWN5SWQJCSJpZC1zbWltZS1hYS1ldHMtc2lnUG9saWN5SWQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfc2lnUG9saWN5SWQJCTIyNgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ1BvbGljeUlkCQlPQkpfaWRfc21pbWVfYWEsMTVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX2NvbW1pdG1lbnRUeXBlCQkiaWQtc21pbWUtYWEtZXRzLWNvbW1pdG1lbnRUeXBlIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX2NvbW1pdG1lbnRUeXBlCQkyMjcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19jb21taXRtZW50VHlwZQkJT0JKX2lkX3NtaW1lX2FhLDE2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19zaWduZXJMb2NhdGlvbgkJImlkLXNtaW1lLWFhLWV0cy1zaWduZXJMb2NhdGlvbiIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19zaWduZXJMb2NhdGlvbgkJMjI4CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfc2lnbmVyTG9jYXRpb24JCU9CSl9pZF9zbWltZV9hYSwxN0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfc2lnbmVyQXR0cgkJImlkLXNtaW1lLWFhLWV0cy1zaWduZXJBdHRyIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX3NpZ25lckF0dHIJCTIyOQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ25lckF0dHIJCU9CSl9pZF9zbWltZV9hYSwxOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfb3RoZXJTaWdDZXJ0CQkiaWQtc21pbWUtYWEtZXRzLW90aGVyU2lnQ2VydCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19vdGhlclNpZ0NlcnQJCTIzMAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX290aGVyU2lnQ2VydAkJT0JKX2lkX3NtaW1lX2FhLDE5TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19jb250ZW50VGltZXN0YW1wCQkiaWQtc21pbWUtYWEtZXRzLWNvbnRlbnRUaW1lc3RhbXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfY29udGVudFRpbWVzdGFtcAkJMjMxCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfY29udGVudFRpbWVzdGFtcAkJT0JKX2lkX3NtaW1lX2FhLDIwTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19DZXJ0aWZpY2F0ZVJlZnMJCSJpZC1zbWltZS1hYS1ldHMtQ2VydGlmaWNhdGVSZWZzIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX0NlcnRpZmljYXRlUmVmcwkJMjMyCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfQ2VydGlmaWNhdGVSZWZzCQlPQkpfaWRfc21pbWVfYWEsMjFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX1Jldm9jYXRpb25SZWZzCQkiaWQtc21pbWUtYWEtZXRzLVJldm9jYXRpb25SZWZzIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX1Jldm9jYXRpb25SZWZzCQkyMzMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19SZXZvY2F0aW9uUmVmcwkJT0JKX2lkX3NtaW1lX2FhLDIyTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19jZXJ0VmFsdWVzCQkiaWQtc21pbWUtYWEtZXRzLWNlcnRWYWx1ZXMiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfY2VydFZhbHVlcwkJMjM0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfY2VydFZhbHVlcwkJT0JKX2lkX3NtaW1lX2FhLDIzTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19yZXZvY2F0aW9uVmFsdWVzCQkiaWQtc21pbWUtYWEtZXRzLXJldm9jYXRpb25WYWx1ZXMiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcwkJMjM1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcwkJT0JKX2lkX3NtaW1lX2FhLDI0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19lc2NUaW1lU3RhbXAJCSJpZC1zbWltZS1hYS1ldHMtZXNjVGltZVN0YW1wIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX2VzY1RpbWVTdGFtcAkJMjM2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfZXNjVGltZVN0YW1wCQlPQkpfaWRfc21pbWVfYWEsMjVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX2NlcnRDUkxUaW1lc3RhbXAJCSJpZC1zbWltZS1hYS1ldHMtY2VydENSTFRpbWVzdGFtcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wCQkyMzcKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wCQlPQkpfaWRfc21pbWVfYWEsMjZMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX2FyY2hpdmVUaW1lU3RhbXAJCSJpZC1zbWltZS1hYS1ldHMtYXJjaGl2ZVRpbWVTdGFtcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19hcmNoaXZlVGltZVN0YW1wCQkyMzgKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19hcmNoaXZlVGltZVN0YW1wCQlPQkpfaWRfc21pbWVfYWEsMjdMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfc2lnbmF0dXJlVHlwZQkJImlkLXNtaW1lLWFhLXNpZ25hdHVyZVR5cGUiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9zaWduYXR1cmVUeXBlCQkyMzkKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX3NpZ25hdHVyZVR5cGUJCU9CSl9pZF9zbWltZV9hYSwyOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9kdmNzX2R2YwkJImlkLXNtaW1lLWFhLWR2Y3MtZHZjIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZHZjc19kdmMJCTI0MAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZHZjc19kdmMJCU9CSl9pZF9zbWltZV9hYSwyOUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hbGdfRVNESHdpdGgzREVTCQkiaWQtc21pbWUtYWxnLUVTREh3aXRoM0RFUyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19FU0RId2l0aDNERVMJCTI0MQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWxnX0VTREh3aXRoM0RFUwkJT0JKX2lkX3NtaW1lX2FsZywxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FsZ19FU0RId2l0aFJDMgkJImlkLXNtaW1lLWFsZy1FU0RId2l0aFJDMiIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19FU0RId2l0aFJDMgkJMjQyCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIJCU9CSl9pZF9zbWltZV9hbGcsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hbGdfM0RFU3dyYXAJCSJpZC1zbWltZS1hbGctM0RFU3dyYXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGdfM0RFU3dyYXAJCTI0MworI2RlZmluZSBPQkpfaWRfc21pbWVfYWxnXzNERVN3cmFwCQlPQkpfaWRfc21pbWVfYWxnLDNMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnX1JDMndyYXAJCSJpZC1zbWltZS1hbGctUkMyd3JhcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19SQzJ3cmFwCQkyNDQKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZ19SQzJ3cmFwCQlPQkpfaWRfc21pbWVfYWxnLDRMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnX0VTREgJCSJpZC1zbWltZS1hbGctRVNESCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19FU0RICQkyNDUKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZ19FU0RICQlPQkpfaWRfc21pbWVfYWxnLDVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnX0NNUzNERVN3cmFwCQkiaWQtc21pbWUtYWxnLUNNUzNERVN3cmFwIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWxnX0NNUzNERVN3cmFwCQkyNDYKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZ19DTVMzREVTd3JhcAkJT0JKX2lkX3NtaW1lX2FsZyw2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FsZ19DTVNSQzJ3cmFwCQkiaWQtc21pbWUtYWxnLUNNU1JDMndyYXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGdfQ01TUkMyd3JhcAkJMjQ3CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hbGdfQ01TUkMyd3JhcAkJT0JKX2lkX3NtaW1lX2FsZyw3TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2NkX2xkYXAJCSJpZC1zbWltZS1jZC1sZGFwIgorI2RlZmluZSBOSURfaWRfc21pbWVfY2RfbGRhcAkJMjQ4CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jZF9sZGFwCQlPQkpfaWRfc21pbWVfY2QsMUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9zcHFfZXRzX3NxdF91cmkJCSJpZC1zbWltZS1zcHEtZXRzLXNxdC11cmkiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9zcHFfZXRzX3NxdF91cmkJCTI0OQorI2RlZmluZSBPQkpfaWRfc21pbWVfc3BxX2V0c19zcXRfdXJpCQlPQkpfaWRfc21pbWVfc3BxLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfc3BxX2V0c19zcXRfdW5vdGljZQkJImlkLXNtaW1lLXNwcS1ldHMtc3F0LXVub3RpY2UiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9zcHFfZXRzX3NxdF91bm90aWNlCQkyNTAKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX3NwcV9ldHNfc3F0X3Vub3RpY2UJCU9CSl9pZF9zbWltZV9zcHEsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZPcmlnaW4JCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZPcmlnaW4iCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZPcmlnaW4JCTI1MQorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mT3JpZ2luCQlPQkpfaWRfc21pbWVfY3RpLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mUmVjZWlwdAkJImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZlJlY2VpcHQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZSZWNlaXB0CQkyNTIKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZlJlY2VpcHQJCU9CSl9pZF9zbWltZV9jdGksMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZEZWxpdmVyeQkJImlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkRlbGl2ZXJ5IgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mRGVsaXZlcnkJCTI1MworI2RlZmluZSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mRGVsaXZlcnkJCU9CSl9pZF9zbWltZV9jdGksM0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZTZW5kZXIJCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZTZW5kZXIiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZTZW5kZXIJCTI1NAorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mU2VuZGVyCQlPQkpfaWRfc21pbWVfY3RpLDRMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQXBwcm92YWwJCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZBcHByb3ZhbCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkFwcHJvdmFsCQkyNTUKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkFwcHJvdmFsCQlPQkpfaWRfc21pbWVfY3RpLDVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQ3JlYXRpb24JCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZDcmVhdGlvbiIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkNyZWF0aW9uCQkyNTYKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkNyZWF0aW9uCQlPQkpfaWRfc21pbWVfY3RpLDZMCisKKyNkZWZpbmUgTE5fZnJpZW5kbHlOYW1lCQkiZnJpZW5kbHlOYW1lIgorI2RlZmluZSBOSURfZnJpZW5kbHlOYW1lCQkxNTYKKyNkZWZpbmUgT0JKX2ZyaWVuZGx5TmFtZQkJT0JKX3BrY3M5LDIwTAorCisjZGVmaW5lIExOX2xvY2FsS2V5SUQJCSJsb2NhbEtleUlEIgorI2RlZmluZSBOSURfbG9jYWxLZXlJRAkJMTU3CisjZGVmaW5lIE9CSl9sb2NhbEtleUlECQlPQkpfcGtjczksMjFMCisKKyNkZWZpbmUgU05fbXNfY3NwX25hbWUJCSJDU1BOYW1lIgorI2RlZmluZSBMTl9tc19jc3BfbmFtZQkJIk1pY3Jvc29mdCBDU1AgTmFtZSIKKyNkZWZpbmUgTklEX21zX2NzcF9uYW1lCQk0MTcKKyNkZWZpbmUgT0JKX21zX2NzcF9uYW1lCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDE3TCwxTAorCisjZGVmaW5lIFNOX0xvY2FsS2V5U2V0CQkiTG9jYWxLZXlTZXQiCisjZGVmaW5lIExOX0xvY2FsS2V5U2V0CQkiTWljcm9zb2Z0IExvY2FsIEtleSBzZXQiCisjZGVmaW5lIE5JRF9Mb2NhbEtleVNldAkJODU2CisjZGVmaW5lIE9CSl9Mb2NhbEtleVNldAkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwxN0wsMkwKKworI2RlZmluZSBPQkpfY2VydFR5cGVzCQlPQkpfcGtjczksMjJMCisKKyNkZWZpbmUgTE5feDUwOUNlcnRpZmljYXRlCQkieDUwOUNlcnRpZmljYXRlIgorI2RlZmluZSBOSURfeDUwOUNlcnRpZmljYXRlCQkxNTgKKyNkZWZpbmUgT0JKX3g1MDlDZXJ0aWZpY2F0ZQkJT0JKX2NlcnRUeXBlcywxTAorCisjZGVmaW5lIExOX3Nkc2lDZXJ0aWZpY2F0ZQkJInNkc2lDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUgTklEX3Nkc2lDZXJ0aWZpY2F0ZQkJMTU5CisjZGVmaW5lIE9CSl9zZHNpQ2VydGlmaWNhdGUJCU9CSl9jZXJ0VHlwZXMsMkwKKworI2RlZmluZSBPQkpfY3JsVHlwZXMJCU9CSl9wa2NzOSwyM0wKKworI2RlZmluZSBMTl94NTA5Q3JsCQkieDUwOUNybCIKKyNkZWZpbmUgTklEX3g1MDlDcmwJCTE2MAorI2RlZmluZSBPQkpfeDUwOUNybAkJT0JKX2NybFR5cGVzLDFMCisKKyNkZWZpbmUgT0JKX3BrY3MxMgkJT0JKX3BrY3MsMTJMCisKKyNkZWZpbmUgT0JKX3BrY3MxMl9wYmVpZHMJCU9CSl9wa2NzMTIsMUwKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJCSJQQkUtU0hBMS1SQzQtMTI4IgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJCSJwYmVXaXRoU0hBMUFuZDEyOEJpdFJDNCIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDNAkJMTQ0CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJCU9CSl9wa2NzMTJfcGJlaWRzLDFMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQJCSJQQkUtU0hBMS1SQzQtNDAiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDQwQml0UkM0CQkicGJlV2l0aFNIQTFBbmQ0MEJpdFJDNCIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkM0CQkxNDUKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDQwQml0UkM0CQlPQkpfcGtjczEyX3BiZWlkcywyTAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMJCSJQQkUtU0hBMS0zREVTIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCQkicGJlV2l0aFNIQTFBbmQzLUtleVRyaXBsZURFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCQkxNDYKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMJCU9CSl9wa2NzMTJfcGJlaWRzLDNMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQwkJIlBCRS1TSEExLTJERVMiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJCSJwYmVXaXRoU0hBMUFuZDItS2V5VHJpcGxlREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJCTE0NworI2RlZmluZSBPQkpfcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQwkJT0JKX3BrY3MxMl9wYmVpZHMsNEwKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDCQkiUEJFLVNIQTEtUkMyLTEyOCIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwkJInBiZVdpdGhTSEExQW5kMTI4Qml0UkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMJCTE0OAorI2RlZmluZSBPQkpfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwkJT0JKX3BrY3MxMl9wYmVpZHMsNUwKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJCSJQQkUtU0hBMS1SQzItNDAiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQwkJInBiZVdpdGhTSEExQW5kNDBCaXRSQzItQ0JDIgorI2RlZmluZSBOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDCQkxNDkKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQwkJT0JKX3BrY3MxMl9wYmVpZHMsNkwKKworI2RlZmluZSBPQkpfcGtjczEyX1ZlcnNpb24xCQlPQkpfcGtjczEyLDEwTAorCisjZGVmaW5lIE9CSl9wa2NzMTJfQmFnSWRzCQlPQkpfcGtjczEyX1ZlcnNpb24xLDFMCisKKyNkZWZpbmUgTE5fa2V5QmFnCQkia2V5QmFnIgorI2RlZmluZSBOSURfa2V5QmFnCQkxNTAKKyNkZWZpbmUgT0JKX2tleUJhZwkJT0JKX3BrY3MxMl9CYWdJZHMsMUwKKworI2RlZmluZSBMTl9wa2NzOFNocm91ZGVkS2V5QmFnCQkicGtjczhTaHJvdWRlZEtleUJhZyIKKyNkZWZpbmUgTklEX3BrY3M4U2hyb3VkZWRLZXlCYWcJCTE1MQorI2RlZmluZSBPQkpfcGtjczhTaHJvdWRlZEtleUJhZwkJT0JKX3BrY3MxMl9CYWdJZHMsMkwKKworI2RlZmluZSBMTl9jZXJ0QmFnCQkiY2VydEJhZyIKKyNkZWZpbmUgTklEX2NlcnRCYWcJCTE1MgorI2RlZmluZSBPQkpfY2VydEJhZwkJT0JKX3BrY3MxMl9CYWdJZHMsM0wKKworI2RlZmluZSBMTl9jcmxCYWcJCSJjcmxCYWciCisjZGVmaW5lIE5JRF9jcmxCYWcJCTE1MworI2RlZmluZSBPQkpfY3JsQmFnCQlPQkpfcGtjczEyX0JhZ0lkcyw0TAorCisjZGVmaW5lIExOX3NlY3JldEJhZwkJInNlY3JldEJhZyIKKyNkZWZpbmUgTklEX3NlY3JldEJhZwkJMTU0CisjZGVmaW5lIE9CSl9zZWNyZXRCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDVMCisKKyNkZWZpbmUgTE5fc2FmZUNvbnRlbnRzQmFnCQkic2FmZUNvbnRlbnRzQmFnIgorI2RlZmluZSBOSURfc2FmZUNvbnRlbnRzQmFnCQkxNTUKKyNkZWZpbmUgT0JKX3NhZmVDb250ZW50c0JhZwkJT0JKX3BrY3MxMl9CYWdJZHMsNkwKKworI2RlZmluZSBTTl9tZDIJCSJNRDIiCisjZGVmaW5lIExOX21kMgkJIm1kMiIKKyNkZWZpbmUgTklEX21kMgkJMworI2RlZmluZSBPQkpfbWQyCQlPQkpfcnNhZHNpLDJMLDJMCisKKyNkZWZpbmUgU05fbWQ0CQkiTUQ0IgorI2RlZmluZSBMTl9tZDQJCSJtZDQiCisjZGVmaW5lIE5JRF9tZDQJCTI1NworI2RlZmluZSBPQkpfbWQ0CQlPQkpfcnNhZHNpLDJMLDRMCisKKyNkZWZpbmUgU05fbWQ1CQkiTUQ1IgorI2RlZmluZSBMTl9tZDUJCSJtZDUiCisjZGVmaW5lIE5JRF9tZDUJCTQKKyNkZWZpbmUgT0JKX21kNQkJT0JKX3JzYWRzaSwyTCw1TAorCisjZGVmaW5lIFNOX21kNV9zaGExCQkiTUQ1LVNIQTEiCisjZGVmaW5lIExOX21kNV9zaGExCQkibWQ1LXNoYTEiCisjZGVmaW5lIE5JRF9tZDVfc2hhMQkJMTE0CisKKyNkZWZpbmUgTE5faG1hY1dpdGhNRDUJCSJobWFjV2l0aE1ENSIKKyNkZWZpbmUgTklEX2htYWNXaXRoTUQ1CQk3OTcKKyNkZWZpbmUgT0JKX2htYWNXaXRoTUQ1CQlPQkpfcnNhZHNpLDJMLDZMCisKKyNkZWZpbmUgTE5faG1hY1dpdGhTSEExCQkiaG1hY1dpdGhTSEExIgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEExCQkxNjMKKyNkZWZpbmUgT0JKX2htYWNXaXRoU0hBMQkJT0JKX3JzYWRzaSwyTCw3TAorCisjZGVmaW5lIExOX2htYWNXaXRoU0hBMjI0CQkiaG1hY1dpdGhTSEEyMjQiCisjZGVmaW5lIE5JRF9obWFjV2l0aFNIQTIyNAkJNzk4CisjZGVmaW5lIE9CSl9obWFjV2l0aFNIQTIyNAkJT0JKX3JzYWRzaSwyTCw4TAorCisjZGVmaW5lIExOX2htYWNXaXRoU0hBMjU2CQkiaG1hY1dpdGhTSEEyNTYiCisjZGVmaW5lIE5JRF9obWFjV2l0aFNIQTI1NgkJNzk5CisjZGVmaW5lIE9CSl9obWFjV2l0aFNIQTI1NgkJT0JKX3JzYWRzaSwyTCw5TAorCisjZGVmaW5lIExOX2htYWNXaXRoU0hBMzg0CQkiaG1hY1dpdGhTSEEzODQiCisjZGVmaW5lIE5JRF9obWFjV2l0aFNIQTM4NAkJODAwCisjZGVmaW5lIE9CSl9obWFjV2l0aFNIQTM4NAkJT0JKX3JzYWRzaSwyTCwxMEwKKworI2RlZmluZSBMTl9obWFjV2l0aFNIQTUxMgkJImhtYWNXaXRoU0hBNTEyIgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEE1MTIJCTgwMQorI2RlZmluZSBPQkpfaG1hY1dpdGhTSEE1MTIJCU9CSl9yc2Fkc2ksMkwsMTFMCisKKyNkZWZpbmUgU05fcmMyX2NiYwkJIlJDMi1DQkMiCisjZGVmaW5lIExOX3JjMl9jYmMJCSJyYzItY2JjIgorI2RlZmluZSBOSURfcmMyX2NiYwkJMzcKKyNkZWZpbmUgT0JKX3JjMl9jYmMJCU9CSl9yc2Fkc2ksM0wsMkwKKworI2RlZmluZSBTTl9yYzJfZWNiCQkiUkMyLUVDQiIKKyNkZWZpbmUgTE5fcmMyX2VjYgkJInJjMi1lY2IiCisjZGVmaW5lIE5JRF9yYzJfZWNiCQkzOAorCisjZGVmaW5lIFNOX3JjMl9jZmI2NAkJIlJDMi1DRkIiCisjZGVmaW5lIExOX3JjMl9jZmI2NAkJInJjMi1jZmIiCisjZGVmaW5lIE5JRF9yYzJfY2ZiNjQJCTM5CisKKyNkZWZpbmUgU05fcmMyX29mYjY0CQkiUkMyLU9GQiIKKyNkZWZpbmUgTE5fcmMyX29mYjY0CQkicmMyLW9mYiIKKyNkZWZpbmUgTklEX3JjMl9vZmI2NAkJNDAKKworI2RlZmluZSBTTl9yYzJfNDBfY2JjCQkiUkMyLTQwLUNCQyIKKyNkZWZpbmUgTE5fcmMyXzQwX2NiYwkJInJjMi00MC1jYmMiCisjZGVmaW5lIE5JRF9yYzJfNDBfY2JjCQk5OAorCisjZGVmaW5lIFNOX3JjMl82NF9jYmMJCSJSQzItNjQtQ0JDIgorI2RlZmluZSBMTl9yYzJfNjRfY2JjCQkicmMyLTY0LWNiYyIKKyNkZWZpbmUgTklEX3JjMl82NF9jYmMJCTE2NgorCisjZGVmaW5lIFNOX3JjNAkJIlJDNCIKKyNkZWZpbmUgTE5fcmM0CQkicmM0IgorI2RlZmluZSBOSURfcmM0CQk1CisjZGVmaW5lIE9CSl9yYzQJCU9CSl9yc2Fkc2ksM0wsNEwKKworI2RlZmluZSBTTl9yYzRfNDAJCSJSQzQtNDAiCisjZGVmaW5lIExOX3JjNF80MAkJInJjNC00MCIKKyNkZWZpbmUgTklEX3JjNF80MAkJOTcKKworI2RlZmluZSBTTl9kZXNfZWRlM19jYmMJCSJERVMtRURFMy1DQkMiCisjZGVmaW5lIExOX2Rlc19lZGUzX2NiYwkJImRlcy1lZGUzLWNiYyIKKyNkZWZpbmUgTklEX2Rlc19lZGUzX2NiYwkJNDQKKyNkZWZpbmUgT0JKX2Rlc19lZGUzX2NiYwkJT0JKX3JzYWRzaSwzTCw3TAorCisjZGVmaW5lIFNOX3JjNV9jYmMJCSJSQzUtQ0JDIgorI2RlZmluZSBMTl9yYzVfY2JjCQkicmM1LWNiYyIKKyNkZWZpbmUgTklEX3JjNV9jYmMJCTEyMAorI2RlZmluZSBPQkpfcmM1X2NiYwkJT0JKX3JzYWRzaSwzTCw4TAorCisjZGVmaW5lIFNOX3JjNV9lY2IJCSJSQzUtRUNCIgorI2RlZmluZSBMTl9yYzVfZWNiCQkicmM1LWVjYiIKKyNkZWZpbmUgTklEX3JjNV9lY2IJCTEyMQorCisjZGVmaW5lIFNOX3JjNV9jZmI2NAkJIlJDNS1DRkIiCisjZGVmaW5lIExOX3JjNV9jZmI2NAkJInJjNS1jZmIiCisjZGVmaW5lIE5JRF9yYzVfY2ZiNjQJCTEyMgorCisjZGVmaW5lIFNOX3JjNV9vZmI2NAkJIlJDNS1PRkIiCisjZGVmaW5lIExOX3JjNV9vZmI2NAkJInJjNS1vZmIiCisjZGVmaW5lIE5JRF9yYzVfb2ZiNjQJCTEyMworCisjZGVmaW5lIFNOX21zX2V4dF9yZXEJCSJtc0V4dFJlcSIKKyNkZWZpbmUgTE5fbXNfZXh0X3JlcQkJIk1pY3Jvc29mdCBFeHRlbnNpb24gUmVxdWVzdCIKKyNkZWZpbmUgTklEX21zX2V4dF9yZXEJCTE3MQorI2RlZmluZSBPQkpfbXNfZXh0X3JlcQkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwyTCwxTCwxNEwKKworI2RlZmluZSBTTl9tc19jb2RlX2luZAkJIm1zQ29kZUluZCIKKyNkZWZpbmUgTE5fbXNfY29kZV9pbmQJCSJNaWNyb3NvZnQgSW5kaXZpZHVhbCBDb2RlIFNpZ25pbmciCisjZGVmaW5lIE5JRF9tc19jb2RlX2luZAkJMTM0CisjZGVmaW5lIE9CSl9tc19jb2RlX2luZAkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwyTCwxTCwyMUwKKworI2RlZmluZSBTTl9tc19jb2RlX2NvbQkJIm1zQ29kZUNvbSIKKyNkZWZpbmUgTE5fbXNfY29kZV9jb20JCSJNaWNyb3NvZnQgQ29tbWVyY2lhbCBDb2RlIFNpZ25pbmciCisjZGVmaW5lIE5JRF9tc19jb2RlX2NvbQkJMTM1CisjZGVmaW5lIE9CSl9tc19jb2RlX2NvbQkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwyTCwxTCwyMkwKKworI2RlZmluZSBTTl9tc19jdGxfc2lnbgkJIm1zQ1RMU2lnbiIKKyNkZWZpbmUgTE5fbXNfY3RsX3NpZ24JCSJNaWNyb3NvZnQgVHJ1c3QgTGlzdCBTaWduaW5nIgorI2RlZmluZSBOSURfbXNfY3RsX3NpZ24JCTEzNgorI2RlZmluZSBPQkpfbXNfY3RsX3NpZ24JCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMTBMLDNMLDFMCisKKyNkZWZpbmUgU05fbXNfc2djCQkibXNTR0MiCisjZGVmaW5lIExOX21zX3NnYwkJIk1pY3Jvc29mdCBTZXJ2ZXIgR2F0ZWQgQ3J5cHRvIgorI2RlZmluZSBOSURfbXNfc2djCQkxMzcKKyNkZWZpbmUgT0JKX21zX3NnYwkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwxMEwsM0wsM0wKKworI2RlZmluZSBTTl9tc19lZnMJCSJtc0VGUyIKKyNkZWZpbmUgTE5fbXNfZWZzCQkiTWljcm9zb2Z0IEVuY3J5cHRlZCBGaWxlIFN5c3RlbSIKKyNkZWZpbmUgTklEX21zX2VmcwkJMTM4CisjZGVmaW5lIE9CSl9tc19lZnMJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMTBMLDNMLDRMCisKKyNkZWZpbmUgU05fbXNfc21hcnRjYXJkX2xvZ2luCQkibXNTbWFydGNhcmRMb2dpbiIKKyNkZWZpbmUgTE5fbXNfc21hcnRjYXJkX2xvZ2luCQkiTWljcm9zb2Z0IFNtYXJ0Y2FyZGxvZ2luIgorI2RlZmluZSBOSURfbXNfc21hcnRjYXJkX2xvZ2luCQk2NDgKKyNkZWZpbmUgT0JKX21zX3NtYXJ0Y2FyZF9sb2dpbgkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwyMEwsMkwsMkwKKworI2RlZmluZSBTTl9tc191cG4JCSJtc1VQTiIKKyNkZWZpbmUgTE5fbXNfdXBuCQkiTWljcm9zb2Z0IFVuaXZlcnNhbCBQcmluY2lwYWwgTmFtZSIKKyNkZWZpbmUgTklEX21zX3VwbgkJNjQ5CisjZGVmaW5lIE9CSl9tc191cG4JCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMjBMLDJMLDNMCisKKyNkZWZpbmUgU05faWRlYV9jYmMJCSJJREVBLUNCQyIKKyNkZWZpbmUgTE5faWRlYV9jYmMJCSJpZGVhLWNiYyIKKyNkZWZpbmUgTklEX2lkZWFfY2JjCQkzNAorI2RlZmluZSBPQkpfaWRlYV9jYmMJCTFMLDNMLDZMLDFMLDRMLDFMLDE4OEwsN0wsMUwsMUwsMkwKKworI2RlZmluZSBTTl9pZGVhX2VjYgkJIklERUEtRUNCIgorI2RlZmluZSBMTl9pZGVhX2VjYgkJImlkZWEtZWNiIgorI2RlZmluZSBOSURfaWRlYV9lY2IJCTM2CisKKyNkZWZpbmUgU05faWRlYV9jZmI2NAkJIklERUEtQ0ZCIgorI2RlZmluZSBMTl9pZGVhX2NmYjY0CQkiaWRlYS1jZmIiCisjZGVmaW5lIE5JRF9pZGVhX2NmYjY0CQkzNQorCisjZGVmaW5lIFNOX2lkZWFfb2ZiNjQJCSJJREVBLU9GQiIKKyNkZWZpbmUgTE5faWRlYV9vZmI2NAkJImlkZWEtb2ZiIgorI2RlZmluZSBOSURfaWRlYV9vZmI2NAkJNDYKKworI2RlZmluZSBTTl9iZl9jYmMJCSJCRi1DQkMiCisjZGVmaW5lIExOX2JmX2NiYwkJImJmLWNiYyIKKyNkZWZpbmUgTklEX2JmX2NiYwkJOTEKKyNkZWZpbmUgT0JKX2JmX2NiYwkJMUwsM0wsNkwsMUwsNEwsMUwsMzAyOUwsMUwsMkwKKworI2RlZmluZSBTTl9iZl9lY2IJCSJCRi1FQ0IiCisjZGVmaW5lIExOX2JmX2VjYgkJImJmLWVjYiIKKyNkZWZpbmUgTklEX2JmX2VjYgkJOTIKKworI2RlZmluZSBTTl9iZl9jZmI2NAkJIkJGLUNGQiIKKyNkZWZpbmUgTE5fYmZfY2ZiNjQJCSJiZi1jZmIiCisjZGVmaW5lIE5JRF9iZl9jZmI2NAkJOTMKKworI2RlZmluZSBTTl9iZl9vZmI2NAkJIkJGLU9GQiIKKyNkZWZpbmUgTE5fYmZfb2ZiNjQJCSJiZi1vZmIiCisjZGVmaW5lIE5JRF9iZl9vZmI2NAkJOTQKKworI2RlZmluZSBTTl9pZF9wa2l4CQkiUEtJWCIKKyNkZWZpbmUgTklEX2lkX3BraXgJCTEyNworI2RlZmluZSBPQkpfaWRfcGtpeAkJMUwsM0wsNkwsMUwsNUwsNUwsN0wKKworI2RlZmluZSBTTl9pZF9wa2l4X21vZAkJImlkLXBraXgtbW9kIgorI2RlZmluZSBOSURfaWRfcGtpeF9tb2QJCTI1OAorI2RlZmluZSBPQkpfaWRfcGtpeF9tb2QJCU9CSl9pZF9wa2l4LDBMCisKKyNkZWZpbmUgU05faWRfcGUJCSJpZC1wZSIKKyNkZWZpbmUgTklEX2lkX3BlCQkxNzUKKyNkZWZpbmUgT0JKX2lkX3BlCQlPQkpfaWRfcGtpeCwxTAorCisjZGVmaW5lIFNOX2lkX3F0CQkiaWQtcXQiCisjZGVmaW5lIE5JRF9pZF9xdAkJMjU5CisjZGVmaW5lIE9CSl9pZF9xdAkJT0JKX2lkX3BraXgsMkwKKworI2RlZmluZSBTTl9pZF9rcAkJImlkLWtwIgorI2RlZmluZSBOSURfaWRfa3AJCTEyOAorI2RlZmluZSBPQkpfaWRfa3AJCU9CSl9pZF9wa2l4LDNMCisKKyNkZWZpbmUgU05faWRfaXQJCSJpZC1pdCIKKyNkZWZpbmUgTklEX2lkX2l0CQkyNjAKKyNkZWZpbmUgT0JKX2lkX2l0CQlPQkpfaWRfcGtpeCw0TAorCisjZGVmaW5lIFNOX2lkX3BraXAJCSJpZC1wa2lwIgorI2RlZmluZSBOSURfaWRfcGtpcAkJMjYxCisjZGVmaW5lIE9CSl9pZF9wa2lwCQlPQkpfaWRfcGtpeCw1TAorCisjZGVmaW5lIFNOX2lkX2FsZwkJImlkLWFsZyIKKyNkZWZpbmUgTklEX2lkX2FsZwkJMjYyCisjZGVmaW5lIE9CSl9pZF9hbGcJCU9CSl9pZF9wa2l4LDZMCisKKyNkZWZpbmUgU05faWRfY21jCQkiaWQtY21jIgorI2RlZmluZSBOSURfaWRfY21jCQkyNjMKKyNkZWZpbmUgT0JKX2lkX2NtYwkJT0JKX2lkX3BraXgsN0wKKworI2RlZmluZSBTTl9pZF9vbgkJImlkLW9uIgorI2RlZmluZSBOSURfaWRfb24JCTI2NAorI2RlZmluZSBPQkpfaWRfb24JCU9CSl9pZF9wa2l4LDhMCisKKyNkZWZpbmUgU05faWRfcGRhCQkiaWQtcGRhIgorI2RlZmluZSBOSURfaWRfcGRhCQkyNjUKKyNkZWZpbmUgT0JKX2lkX3BkYQkJT0JKX2lkX3BraXgsOUwKKworI2RlZmluZSBTTl9pZF9hY2EJCSJpZC1hY2EiCisjZGVmaW5lIE5JRF9pZF9hY2EJCTI2NgorI2RlZmluZSBPQkpfaWRfYWNhCQlPQkpfaWRfcGtpeCwxMEwKKworI2RlZmluZSBTTl9pZF9xY3MJCSJpZC1xY3MiCisjZGVmaW5lIE5JRF9pZF9xY3MJCTI2NworI2RlZmluZSBPQkpfaWRfcWNzCQlPQkpfaWRfcGtpeCwxMUwKKworI2RlZmluZSBTTl9pZF9jY3QJCSJpZC1jY3QiCisjZGVmaW5lIE5JRF9pZF9jY3QJCTI2OAorI2RlZmluZSBPQkpfaWRfY2N0CQlPQkpfaWRfcGtpeCwxMkwKKworI2RlZmluZSBTTl9pZF9wcGwJCSJpZC1wcGwiCisjZGVmaW5lIE5JRF9pZF9wcGwJCTY2MgorI2RlZmluZSBPQkpfaWRfcHBsCQlPQkpfaWRfcGtpeCwyMUwKKworI2RlZmluZSBTTl9pZF9hZAkJImlkLWFkIgorI2RlZmluZSBOSURfaWRfYWQJCTE3NgorI2RlZmluZSBPQkpfaWRfYWQJCU9CSl9pZF9wa2l4LDQ4TAorCisjZGVmaW5lIFNOX2lkX3BraXgxX2V4cGxpY2l0Xzg4CQkiaWQtcGtpeDEtZXhwbGljaXQtODgiCisjZGVmaW5lIE5JRF9pZF9wa2l4MV9leHBsaWNpdF84OAkJMjY5CisjZGVmaW5lIE9CSl9pZF9wa2l4MV9leHBsaWNpdF84OAkJT0JKX2lkX3BraXhfbW9kLDFMCisKKyNkZWZpbmUgU05faWRfcGtpeDFfaW1wbGljaXRfODgJCSJpZC1wa2l4MS1pbXBsaWNpdC04OCIKKyNkZWZpbmUgTklEX2lkX3BraXgxX2ltcGxpY2l0Xzg4CQkyNzAKKyNkZWZpbmUgT0JKX2lkX3BraXgxX2ltcGxpY2l0Xzg4CQlPQkpfaWRfcGtpeF9tb2QsMkwKKworI2RlZmluZSBTTl9pZF9wa2l4MV9leHBsaWNpdF85MwkJImlkLXBraXgxLWV4cGxpY2l0LTkzIgorI2RlZmluZSBOSURfaWRfcGtpeDFfZXhwbGljaXRfOTMJCTI3MQorI2RlZmluZSBPQkpfaWRfcGtpeDFfZXhwbGljaXRfOTMJCU9CSl9pZF9wa2l4X21vZCwzTAorCisjZGVmaW5lIFNOX2lkX3BraXgxX2ltcGxpY2l0XzkzCQkiaWQtcGtpeDEtaW1wbGljaXQtOTMiCisjZGVmaW5lIE5JRF9pZF9wa2l4MV9pbXBsaWNpdF85MwkJMjcyCisjZGVmaW5lIE9CSl9pZF9wa2l4MV9pbXBsaWNpdF85MwkJT0JKX2lkX3BraXhfbW9kLDRMCisKKyNkZWZpbmUgU05faWRfbW9kX2NybWYJCSJpZC1tb2QtY3JtZiIKKyNkZWZpbmUgTklEX2lkX21vZF9jcm1mCQkyNzMKKyNkZWZpbmUgT0JKX2lkX21vZF9jcm1mCQlPQkpfaWRfcGtpeF9tb2QsNUwKKworI2RlZmluZSBTTl9pZF9tb2RfY21jCQkiaWQtbW9kLWNtYyIKKyNkZWZpbmUgTklEX2lkX21vZF9jbWMJCTI3NAorI2RlZmluZSBPQkpfaWRfbW9kX2NtYwkJT0JKX2lkX3BraXhfbW9kLDZMCisKKyNkZWZpbmUgU05faWRfbW9kX2tlYV9wcm9maWxlXzg4CQkiaWQtbW9kLWtlYS1wcm9maWxlLTg4IgorI2RlZmluZSBOSURfaWRfbW9kX2tlYV9wcm9maWxlXzg4CQkyNzUKKyNkZWZpbmUgT0JKX2lkX21vZF9rZWFfcHJvZmlsZV84OAkJT0JKX2lkX3BraXhfbW9kLDdMCisKKyNkZWZpbmUgU05faWRfbW9kX2tlYV9wcm9maWxlXzkzCQkiaWQtbW9kLWtlYS1wcm9maWxlLTkzIgorI2RlZmluZSBOSURfaWRfbW9kX2tlYV9wcm9maWxlXzkzCQkyNzYKKyNkZWZpbmUgT0JKX2lkX21vZF9rZWFfcHJvZmlsZV85MwkJT0JKX2lkX3BraXhfbW9kLDhMCisKKyNkZWZpbmUgU05faWRfbW9kX2NtcAkJImlkLW1vZC1jbXAiCisjZGVmaW5lIE5JRF9pZF9tb2RfY21wCQkyNzcKKyNkZWZpbmUgT0JKX2lkX21vZF9jbXAJCU9CSl9pZF9wa2l4X21vZCw5TAorCisjZGVmaW5lIFNOX2lkX21vZF9xdWFsaWZpZWRfY2VydF84OAkJImlkLW1vZC1xdWFsaWZpZWQtY2VydC04OCIKKyNkZWZpbmUgTklEX2lkX21vZF9xdWFsaWZpZWRfY2VydF84OAkJMjc4CisjZGVmaW5lIE9CSl9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfODgJCU9CSl9pZF9wa2l4X21vZCwxMEwKKworI2RlZmluZSBTTl9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfOTMJCSJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtOTMiCisjZGVmaW5lIE5JRF9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfOTMJCTI3OQorI2RlZmluZSBPQkpfaWRfbW9kX3F1YWxpZmllZF9jZXJ0XzkzCQlPQkpfaWRfcGtpeF9tb2QsMTFMCisKKyNkZWZpbmUgU05faWRfbW9kX2F0dHJpYnV0ZV9jZXJ0CQkiaWQtbW9kLWF0dHJpYnV0ZS1jZXJ0IgorI2RlZmluZSBOSURfaWRfbW9kX2F0dHJpYnV0ZV9jZXJ0CQkyODAKKyNkZWZpbmUgT0JKX2lkX21vZF9hdHRyaWJ1dGVfY2VydAkJT0JKX2lkX3BraXhfbW9kLDEyTAorCisjZGVmaW5lIFNOX2lkX21vZF90aW1lc3RhbXBfcHJvdG9jb2wJCSJpZC1tb2QtdGltZXN0YW1wLXByb3RvY29sIgorI2RlZmluZSBOSURfaWRfbW9kX3RpbWVzdGFtcF9wcm90b2NvbAkJMjgxCisjZGVmaW5lIE9CSl9pZF9tb2RfdGltZXN0YW1wX3Byb3RvY29sCQlPQkpfaWRfcGtpeF9tb2QsMTNMCisKKyNkZWZpbmUgU05faWRfbW9kX29jc3AJCSJpZC1tb2Qtb2NzcCIKKyNkZWZpbmUgTklEX2lkX21vZF9vY3NwCQkyODIKKyNkZWZpbmUgT0JKX2lkX21vZF9vY3NwCQlPQkpfaWRfcGtpeF9tb2QsMTRMCisKKyNkZWZpbmUgU05faWRfbW9kX2R2Y3MJCSJpZC1tb2QtZHZjcyIKKyNkZWZpbmUgTklEX2lkX21vZF9kdmNzCQkyODMKKyNkZWZpbmUgT0JKX2lkX21vZF9kdmNzCQlPQkpfaWRfcGtpeF9tb2QsMTVMCisKKyNkZWZpbmUgU05faWRfbW9kX2NtcDIwMDAJCSJpZC1tb2QtY21wMjAwMCIKKyNkZWZpbmUgTklEX2lkX21vZF9jbXAyMDAwCQkyODQKKyNkZWZpbmUgT0JKX2lkX21vZF9jbXAyMDAwCQlPQkpfaWRfcGtpeF9tb2QsMTZMCisKKyNkZWZpbmUgU05faW5mb19hY2Nlc3MJCSJhdXRob3JpdHlJbmZvQWNjZXNzIgorI2RlZmluZSBMTl9pbmZvX2FjY2VzcwkJIkF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3MiCisjZGVmaW5lIE5JRF9pbmZvX2FjY2VzcwkJMTc3CisjZGVmaW5lIE9CSl9pbmZvX2FjY2VzcwkJT0JKX2lkX3BlLDFMCisKKyNkZWZpbmUgU05fYmlvbWV0cmljSW5mbwkJImJpb21ldHJpY0luZm8iCisjZGVmaW5lIExOX2Jpb21ldHJpY0luZm8JCSJCaW9tZXRyaWMgSW5mbyIKKyNkZWZpbmUgTklEX2Jpb21ldHJpY0luZm8JCTI4NQorI2RlZmluZSBPQkpfYmlvbWV0cmljSW5mbwkJT0JKX2lkX3BlLDJMCisKKyNkZWZpbmUgU05fcWNTdGF0ZW1lbnRzCQkicWNTdGF0ZW1lbnRzIgorI2RlZmluZSBOSURfcWNTdGF0ZW1lbnRzCQkyODYKKyNkZWZpbmUgT0JKX3FjU3RhdGVtZW50cwkJT0JKX2lkX3BlLDNMCisKKyNkZWZpbmUgU05fYWNfYXVkaXRFbnRpdHkJCSJhYy1hdWRpdEVudGl0eSIKKyNkZWZpbmUgTklEX2FjX2F1ZGl0RW50aXR5CQkyODcKKyNkZWZpbmUgT0JKX2FjX2F1ZGl0RW50aXR5CQlPQkpfaWRfcGUsNEwKKworI2RlZmluZSBTTl9hY190YXJnZXRpbmcJCSJhYy10YXJnZXRpbmciCisjZGVmaW5lIE5JRF9hY190YXJnZXRpbmcJCTI4OAorI2RlZmluZSBPQkpfYWNfdGFyZ2V0aW5nCQlPQkpfaWRfcGUsNUwKKworI2RlZmluZSBTTl9hYUNvbnRyb2xzCQkiYWFDb250cm9scyIKKyNkZWZpbmUgTklEX2FhQ29udHJvbHMJCTI4OQorI2RlZmluZSBPQkpfYWFDb250cm9scwkJT0JKX2lkX3BlLDZMCisKKyNkZWZpbmUgU05fc2JncF9pcEFkZHJCbG9jawkJInNiZ3AtaXBBZGRyQmxvY2siCisjZGVmaW5lIE5JRF9zYmdwX2lwQWRkckJsb2NrCQkyOTAKKyNkZWZpbmUgT0JKX3NiZ3BfaXBBZGRyQmxvY2sJCU9CSl9pZF9wZSw3TAorCisjZGVmaW5lIFNOX3NiZ3BfYXV0b25vbW91c1N5c051bQkJInNiZ3AtYXV0b25vbW91c1N5c051bSIKKyNkZWZpbmUgTklEX3NiZ3BfYXV0b25vbW91c1N5c051bQkJMjkxCisjZGVmaW5lIE9CSl9zYmdwX2F1dG9ub21vdXNTeXNOdW0JCU9CSl9pZF9wZSw4TAorCisjZGVmaW5lIFNOX3NiZ3Bfcm91dGVySWRlbnRpZmllcgkJInNiZ3Atcm91dGVySWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3NiZ3Bfcm91dGVySWRlbnRpZmllcgkJMjkyCisjZGVmaW5lIE9CSl9zYmdwX3JvdXRlcklkZW50aWZpZXIJCU9CSl9pZF9wZSw5TAorCisjZGVmaW5lIFNOX2FjX3Byb3h5aW5nCQkiYWMtcHJveHlpbmciCisjZGVmaW5lIE5JRF9hY19wcm94eWluZwkJMzk3CisjZGVmaW5lIE9CSl9hY19wcm94eWluZwkJT0JKX2lkX3BlLDEwTAorCisjZGVmaW5lIFNOX3NpbmZvX2FjY2VzcwkJInN1YmplY3RJbmZvQWNjZXNzIgorI2RlZmluZSBMTl9zaW5mb19hY2Nlc3MJCSJTdWJqZWN0IEluZm9ybWF0aW9uIEFjY2VzcyIKKyNkZWZpbmUgTklEX3NpbmZvX2FjY2VzcwkJMzk4CisjZGVmaW5lIE9CSl9zaW5mb19hY2Nlc3MJCU9CSl9pZF9wZSwxMUwKKworI2RlZmluZSBTTl9wcm94eUNlcnRJbmZvCQkicHJveHlDZXJ0SW5mbyIKKyNkZWZpbmUgTE5fcHJveHlDZXJ0SW5mbwkJIlByb3h5IENlcnRpZmljYXRlIEluZm9ybWF0aW9uIgorI2RlZmluZSBOSURfcHJveHlDZXJ0SW5mbwkJNjYzCisjZGVmaW5lIE9CSl9wcm94eUNlcnRJbmZvCQlPQkpfaWRfcGUsMTRMCisKKyNkZWZpbmUgU05faWRfcXRfY3BzCQkiaWQtcXQtY3BzIgorI2RlZmluZSBMTl9pZF9xdF9jcHMJCSJQb2xpY3kgUXVhbGlmaWVyIENQUyIKKyNkZWZpbmUgTklEX2lkX3F0X2NwcwkJMTY0CisjZGVmaW5lIE9CSl9pZF9xdF9jcHMJCU9CSl9pZF9xdCwxTAorCisjZGVmaW5lIFNOX2lkX3F0X3Vub3RpY2UJCSJpZC1xdC11bm90aWNlIgorI2RlZmluZSBMTl9pZF9xdF91bm90aWNlCQkiUG9saWN5IFF1YWxpZmllciBVc2VyIE5vdGljZSIKKyNkZWZpbmUgTklEX2lkX3F0X3Vub3RpY2UJCTE2NQorI2RlZmluZSBPQkpfaWRfcXRfdW5vdGljZQkJT0JKX2lkX3F0LDJMCisKKyNkZWZpbmUgU05fdGV4dE5vdGljZQkJInRleHROb3RpY2UiCisjZGVmaW5lIE5JRF90ZXh0Tm90aWNlCQkyOTMKKyNkZWZpbmUgT0JKX3RleHROb3RpY2UJCU9CSl9pZF9xdCwzTAorCisjZGVmaW5lIFNOX3NlcnZlcl9hdXRoCQkic2VydmVyQXV0aCIKKyNkZWZpbmUgTE5fc2VydmVyX2F1dGgJCSJUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiIKKyNkZWZpbmUgTklEX3NlcnZlcl9hdXRoCQkxMjkKKyNkZWZpbmUgT0JKX3NlcnZlcl9hdXRoCQlPQkpfaWRfa3AsMUwKKworI2RlZmluZSBTTl9jbGllbnRfYXV0aAkJImNsaWVudEF1dGgiCisjZGVmaW5lIExOX2NsaWVudF9hdXRoCQkiVExTIFdlYiBDbGllbnQgQXV0aGVudGljYXRpb24iCisjZGVmaW5lIE5JRF9jbGllbnRfYXV0aAkJMTMwCisjZGVmaW5lIE9CSl9jbGllbnRfYXV0aAkJT0JKX2lkX2twLDJMCisKKyNkZWZpbmUgU05fY29kZV9zaWduCQkiY29kZVNpZ25pbmciCisjZGVmaW5lIExOX2NvZGVfc2lnbgkJIkNvZGUgU2lnbmluZyIKKyNkZWZpbmUgTklEX2NvZGVfc2lnbgkJMTMxCisjZGVmaW5lIE9CSl9jb2RlX3NpZ24JCU9CSl9pZF9rcCwzTAorCisjZGVmaW5lIFNOX2VtYWlsX3Byb3RlY3QJCSJlbWFpbFByb3RlY3Rpb24iCisjZGVmaW5lIExOX2VtYWlsX3Byb3RlY3QJCSJFLW1haWwgUHJvdGVjdGlvbiIKKyNkZWZpbmUgTklEX2VtYWlsX3Byb3RlY3QJCTEzMgorI2RlZmluZSBPQkpfZW1haWxfcHJvdGVjdAkJT0JKX2lkX2twLDRMCisKKyNkZWZpbmUgU05faXBzZWNFbmRTeXN0ZW0JCSJpcHNlY0VuZFN5c3RlbSIKKyNkZWZpbmUgTE5faXBzZWNFbmRTeXN0ZW0JCSJJUFNlYyBFbmQgU3lzdGVtIgorI2RlZmluZSBOSURfaXBzZWNFbmRTeXN0ZW0JCTI5NAorI2RlZmluZSBPQkpfaXBzZWNFbmRTeXN0ZW0JCU9CSl9pZF9rcCw1TAorCisjZGVmaW5lIFNOX2lwc2VjVHVubmVsCQkiaXBzZWNUdW5uZWwiCisjZGVmaW5lIExOX2lwc2VjVHVubmVsCQkiSVBTZWMgVHVubmVsIgorI2RlZmluZSBOSURfaXBzZWNUdW5uZWwJCTI5NQorI2RlZmluZSBPQkpfaXBzZWNUdW5uZWwJCU9CSl9pZF9rcCw2TAorCisjZGVmaW5lIFNOX2lwc2VjVXNlcgkJImlwc2VjVXNlciIKKyNkZWZpbmUgTE5faXBzZWNVc2VyCQkiSVBTZWMgVXNlciIKKyNkZWZpbmUgTklEX2lwc2VjVXNlcgkJMjk2CisjZGVmaW5lIE9CSl9pcHNlY1VzZXIJCU9CSl9pZF9rcCw3TAorCisjZGVmaW5lIFNOX3RpbWVfc3RhbXAJCSJ0aW1lU3RhbXBpbmciCisjZGVmaW5lIExOX3RpbWVfc3RhbXAJCSJUaW1lIFN0YW1waW5nIgorI2RlZmluZSBOSURfdGltZV9zdGFtcAkJMTMzCisjZGVmaW5lIE9CSl90aW1lX3N0YW1wCQlPQkpfaWRfa3AsOEwKKworI2RlZmluZSBTTl9PQ1NQX3NpZ24JCSJPQ1NQU2lnbmluZyIKKyNkZWZpbmUgTE5fT0NTUF9zaWduCQkiT0NTUCBTaWduaW5nIgorI2RlZmluZSBOSURfT0NTUF9zaWduCQkxODAKKyNkZWZpbmUgT0JKX09DU1Bfc2lnbgkJT0JKX2lkX2twLDlMCisKKyNkZWZpbmUgU05fZHZjcwkJIkRWQ1MiCisjZGVmaW5lIExOX2R2Y3MJCSJkdmNzIgorI2RlZmluZSBOSURfZHZjcwkJMjk3CisjZGVmaW5lIE9CSl9kdmNzCQlPQkpfaWRfa3AsMTBMCisKKyNkZWZpbmUgU05faWRfaXRfY2FQcm90RW5jQ2VydAkJImlkLWl0LWNhUHJvdEVuY0NlcnQiCisjZGVmaW5lIE5JRF9pZF9pdF9jYVByb3RFbmNDZXJ0CQkyOTgKKyNkZWZpbmUgT0JKX2lkX2l0X2NhUHJvdEVuY0NlcnQJCU9CSl9pZF9pdCwxTAorCisjZGVmaW5lIFNOX2lkX2l0X3NpZ25LZXlQYWlyVHlwZXMJCSJpZC1pdC1zaWduS2V5UGFpclR5cGVzIgorI2RlZmluZSBOSURfaWRfaXRfc2lnbktleVBhaXJUeXBlcwkJMjk5CisjZGVmaW5lIE9CSl9pZF9pdF9zaWduS2V5UGFpclR5cGVzCQlPQkpfaWRfaXQsMkwKKworI2RlZmluZSBTTl9pZF9pdF9lbmNLZXlQYWlyVHlwZXMJCSJpZC1pdC1lbmNLZXlQYWlyVHlwZXMiCisjZGVmaW5lIE5JRF9pZF9pdF9lbmNLZXlQYWlyVHlwZXMJCTMwMAorI2RlZmluZSBPQkpfaWRfaXRfZW5jS2V5UGFpclR5cGVzCQlPQkpfaWRfaXQsM0wKKworI2RlZmluZSBTTl9pZF9pdF9wcmVmZXJyZWRTeW1tQWxnCQkiaWQtaXQtcHJlZmVycmVkU3ltbUFsZyIKKyNkZWZpbmUgTklEX2lkX2l0X3ByZWZlcnJlZFN5bW1BbGcJCTMwMQorI2RlZmluZSBPQkpfaWRfaXRfcHJlZmVycmVkU3ltbUFsZwkJT0JKX2lkX2l0LDRMCisKKyNkZWZpbmUgU05faWRfaXRfY2FLZXlVcGRhdGVJbmZvCQkiaWQtaXQtY2FLZXlVcGRhdGVJbmZvIgorI2RlZmluZSBOSURfaWRfaXRfY2FLZXlVcGRhdGVJbmZvCQkzMDIKKyNkZWZpbmUgT0JKX2lkX2l0X2NhS2V5VXBkYXRlSW5mbwkJT0JKX2lkX2l0LDVMCisKKyNkZWZpbmUgU05faWRfaXRfY3VycmVudENSTAkJImlkLWl0LWN1cnJlbnRDUkwiCisjZGVmaW5lIE5JRF9pZF9pdF9jdXJyZW50Q1JMCQkzMDMKKyNkZWZpbmUgT0JKX2lkX2l0X2N1cnJlbnRDUkwJCU9CSl9pZF9pdCw2TAorCisjZGVmaW5lIFNOX2lkX2l0X3Vuc3VwcG9ydGVkT0lEcwkJImlkLWl0LXVuc3VwcG9ydGVkT0lEcyIKKyNkZWZpbmUgTklEX2lkX2l0X3Vuc3VwcG9ydGVkT0lEcwkJMzA0CisjZGVmaW5lIE9CSl9pZF9pdF91bnN1cHBvcnRlZE9JRHMJCU9CSl9pZF9pdCw3TAorCisjZGVmaW5lIFNOX2lkX2l0X3N1YnNjcmlwdGlvblJlcXVlc3QJCSJpZC1pdC1zdWJzY3JpcHRpb25SZXF1ZXN0IgorI2RlZmluZSBOSURfaWRfaXRfc3Vic2NyaXB0aW9uUmVxdWVzdAkJMzA1CisjZGVmaW5lIE9CSl9pZF9pdF9zdWJzY3JpcHRpb25SZXF1ZXN0CQlPQkpfaWRfaXQsOEwKKworI2RlZmluZSBTTl9pZF9pdF9zdWJzY3JpcHRpb25SZXNwb25zZQkJImlkLWl0LXN1YnNjcmlwdGlvblJlc3BvbnNlIgorI2RlZmluZSBOSURfaWRfaXRfc3Vic2NyaXB0aW9uUmVzcG9uc2UJCTMwNgorI2RlZmluZSBPQkpfaWRfaXRfc3Vic2NyaXB0aW9uUmVzcG9uc2UJCU9CSl9pZF9pdCw5TAorCisjZGVmaW5lIFNOX2lkX2l0X2tleVBhaXJQYXJhbVJlcQkJImlkLWl0LWtleVBhaXJQYXJhbVJlcSIKKyNkZWZpbmUgTklEX2lkX2l0X2tleVBhaXJQYXJhbVJlcQkJMzA3CisjZGVmaW5lIE9CSl9pZF9pdF9rZXlQYWlyUGFyYW1SZXEJCU9CSl9pZF9pdCwxMEwKKworI2RlZmluZSBTTl9pZF9pdF9rZXlQYWlyUGFyYW1SZXAJCSJpZC1pdC1rZXlQYWlyUGFyYW1SZXAiCisjZGVmaW5lIE5JRF9pZF9pdF9rZXlQYWlyUGFyYW1SZXAJCTMwOAorI2RlZmluZSBPQkpfaWRfaXRfa2V5UGFpclBhcmFtUmVwCQlPQkpfaWRfaXQsMTFMCisKKyNkZWZpbmUgU05faWRfaXRfcmV2UGFzc3BocmFzZQkJImlkLWl0LXJldlBhc3NwaHJhc2UiCisjZGVmaW5lIE5JRF9pZF9pdF9yZXZQYXNzcGhyYXNlCQkzMDkKKyNkZWZpbmUgT0JKX2lkX2l0X3JldlBhc3NwaHJhc2UJCU9CSl9pZF9pdCwxMkwKKworI2RlZmluZSBTTl9pZF9pdF9pbXBsaWNpdENvbmZpcm0JCSJpZC1pdC1pbXBsaWNpdENvbmZpcm0iCisjZGVmaW5lIE5JRF9pZF9pdF9pbXBsaWNpdENvbmZpcm0JCTMxMAorI2RlZmluZSBPQkpfaWRfaXRfaW1wbGljaXRDb25maXJtCQlPQkpfaWRfaXQsMTNMCisKKyNkZWZpbmUgU05faWRfaXRfY29uZmlybVdhaXRUaW1lCQkiaWQtaXQtY29uZmlybVdhaXRUaW1lIgorI2RlZmluZSBOSURfaWRfaXRfY29uZmlybVdhaXRUaW1lCQkzMTEKKyNkZWZpbmUgT0JKX2lkX2l0X2NvbmZpcm1XYWl0VGltZQkJT0JKX2lkX2l0LDE0TAorCisjZGVmaW5lIFNOX2lkX2l0X29yaWdQS0lNZXNzYWdlCQkiaWQtaXQtb3JpZ1BLSU1lc3NhZ2UiCisjZGVmaW5lIE5JRF9pZF9pdF9vcmlnUEtJTWVzc2FnZQkJMzEyCisjZGVmaW5lIE9CSl9pZF9pdF9vcmlnUEtJTWVzc2FnZQkJT0JKX2lkX2l0LDE1TAorCisjZGVmaW5lIFNOX2lkX2l0X3N1cHBMYW5nVGFncwkJImlkLWl0LXN1cHBMYW5nVGFncyIKKyNkZWZpbmUgTklEX2lkX2l0X3N1cHBMYW5nVGFncwkJNzg0CisjZGVmaW5lIE9CSl9pZF9pdF9zdXBwTGFuZ1RhZ3MJCU9CSl9pZF9pdCwxNkwKKworI2RlZmluZSBTTl9pZF9yZWdDdHJsCQkiaWQtcmVnQ3RybCIKKyNkZWZpbmUgTklEX2lkX3JlZ0N0cmwJCTMxMworI2RlZmluZSBPQkpfaWRfcmVnQ3RybAkJT0JKX2lkX3BraXAsMUwKKworI2RlZmluZSBTTl9pZF9yZWdJbmZvCQkiaWQtcmVnSW5mbyIKKyNkZWZpbmUgTklEX2lkX3JlZ0luZm8JCTMxNAorI2RlZmluZSBPQkpfaWRfcmVnSW5mbwkJT0JKX2lkX3BraXAsMkwKKworI2RlZmluZSBTTl9pZF9yZWdDdHJsX3JlZ1Rva2VuCQkiaWQtcmVnQ3RybC1yZWdUb2tlbiIKKyNkZWZpbmUgTklEX2lkX3JlZ0N0cmxfcmVnVG9rZW4JCTMxNQorI2RlZmluZSBPQkpfaWRfcmVnQ3RybF9yZWdUb2tlbgkJT0JKX2lkX3JlZ0N0cmwsMUwKKworI2RlZmluZSBTTl9pZF9yZWdDdHJsX2F1dGhlbnRpY2F0b3IJCSJpZC1yZWdDdHJsLWF1dGhlbnRpY2F0b3IiCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsX2F1dGhlbnRpY2F0b3IJCTMxNgorI2RlZmluZSBPQkpfaWRfcmVnQ3RybF9hdXRoZW50aWNhdG9yCQlPQkpfaWRfcmVnQ3RybCwyTAorCisjZGVmaW5lIFNOX2lkX3JlZ0N0cmxfcGtpUHVibGljYXRpb25JbmZvCQkiaWQtcmVnQ3RybC1wa2lQdWJsaWNhdGlvbkluZm8iCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbwkJMzE3CisjZGVmaW5lIE9CSl9pZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbwkJT0JKX2lkX3JlZ0N0cmwsM0wKKworI2RlZmluZSBTTl9pZF9yZWdDdHJsX3BraUFyY2hpdmVPcHRpb25zCQkiaWQtcmVnQ3RybC1wa2lBcmNoaXZlT3B0aW9ucyIKKyNkZWZpbmUgTklEX2lkX3JlZ0N0cmxfcGtpQXJjaGl2ZU9wdGlvbnMJCTMxOAorI2RlZmluZSBPQkpfaWRfcmVnQ3RybF9wa2lBcmNoaXZlT3B0aW9ucwkJT0JKX2lkX3JlZ0N0cmwsNEwKKworI2RlZmluZSBTTl9pZF9yZWdDdHJsX29sZENlcnRJRAkJImlkLXJlZ0N0cmwtb2xkQ2VydElEIgorI2RlZmluZSBOSURfaWRfcmVnQ3RybF9vbGRDZXJ0SUQJCTMxOQorI2RlZmluZSBPQkpfaWRfcmVnQ3RybF9vbGRDZXJ0SUQJCU9CSl9pZF9yZWdDdHJsLDVMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9wcm90b2NvbEVuY3JLZXkJCSJpZC1yZWdDdHJsLXByb3RvY29sRW5jcktleSIKKyNkZWZpbmUgTklEX2lkX3JlZ0N0cmxfcHJvdG9jb2xFbmNyS2V5CQkzMjAKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfcHJvdG9jb2xFbmNyS2V5CQlPQkpfaWRfcmVnQ3RybCw2TAorCisjZGVmaW5lIFNOX2lkX3JlZ0luZm9fdXRmOFBhaXJzCQkiaWQtcmVnSW5mby11dGY4UGFpcnMiCisjZGVmaW5lIE5JRF9pZF9yZWdJbmZvX3V0ZjhQYWlycwkJMzIxCisjZGVmaW5lIE9CSl9pZF9yZWdJbmZvX3V0ZjhQYWlycwkJT0JKX2lkX3JlZ0luZm8sMUwKKworI2RlZmluZSBTTl9pZF9yZWdJbmZvX2NlcnRSZXEJCSJpZC1yZWdJbmZvLWNlcnRSZXEiCisjZGVmaW5lIE5JRF9pZF9yZWdJbmZvX2NlcnRSZXEJCTMyMgorI2RlZmluZSBPQkpfaWRfcmVnSW5mb19jZXJ0UmVxCQlPQkpfaWRfcmVnSW5mbywyTAorCisjZGVmaW5lIFNOX2lkX2FsZ19kZXM0MAkJImlkLWFsZy1kZXM0MCIKKyNkZWZpbmUgTklEX2lkX2FsZ19kZXM0MAkJMzIzCisjZGVmaW5lIE9CSl9pZF9hbGdfZGVzNDAJCU9CSl9pZF9hbGcsMUwKKworI2RlZmluZSBTTl9pZF9hbGdfbm9TaWduYXR1cmUJCSJpZC1hbGctbm9TaWduYXR1cmUiCisjZGVmaW5lIE5JRF9pZF9hbGdfbm9TaWduYXR1cmUJCTMyNAorI2RlZmluZSBPQkpfaWRfYWxnX25vU2lnbmF0dXJlCQlPQkpfaWRfYWxnLDJMCisKKyNkZWZpbmUgU05faWRfYWxnX2RoX3NpZ19obWFjX3NoYTEJCSJpZC1hbGctZGgtc2lnLWhtYWMtc2hhMSIKKyNkZWZpbmUgTklEX2lkX2FsZ19kaF9zaWdfaG1hY19zaGExCQkzMjUKKyNkZWZpbmUgT0JKX2lkX2FsZ19kaF9zaWdfaG1hY19zaGExCQlPQkpfaWRfYWxnLDNMCisKKyNkZWZpbmUgU05faWRfYWxnX2RoX3BvcAkJImlkLWFsZy1kaC1wb3AiCisjZGVmaW5lIE5JRF9pZF9hbGdfZGhfcG9wCQkzMjYKKyNkZWZpbmUgT0JKX2lkX2FsZ19kaF9wb3AJCU9CSl9pZF9hbGcsNEwKKworI2RlZmluZSBTTl9pZF9jbWNfc3RhdHVzSW5mbwkJImlkLWNtYy1zdGF0dXNJbmZvIgorI2RlZmluZSBOSURfaWRfY21jX3N0YXR1c0luZm8JCTMyNworI2RlZmluZSBPQkpfaWRfY21jX3N0YXR1c0luZm8JCU9CSl9pZF9jbWMsMUwKKworI2RlZmluZSBTTl9pZF9jbWNfaWRlbnRpZmljYXRpb24JCSJpZC1jbWMtaWRlbnRpZmljYXRpb24iCisjZGVmaW5lIE5JRF9pZF9jbWNfaWRlbnRpZmljYXRpb24JCTMyOAorI2RlZmluZSBPQkpfaWRfY21jX2lkZW50aWZpY2F0aW9uCQlPQkpfaWRfY21jLDJMCisKKyNkZWZpbmUgU05faWRfY21jX2lkZW50aXR5UHJvb2YJCSJpZC1jbWMtaWRlbnRpdHlQcm9vZiIKKyNkZWZpbmUgTklEX2lkX2NtY19pZGVudGl0eVByb29mCQkzMjkKKyNkZWZpbmUgT0JKX2lkX2NtY19pZGVudGl0eVByb29mCQlPQkpfaWRfY21jLDNMCisKKyNkZWZpbmUgU05faWRfY21jX2RhdGFSZXR1cm4JCSJpZC1jbWMtZGF0YVJldHVybiIKKyNkZWZpbmUgTklEX2lkX2NtY19kYXRhUmV0dXJuCQkzMzAKKyNkZWZpbmUgT0JKX2lkX2NtY19kYXRhUmV0dXJuCQlPQkpfaWRfY21jLDRMCisKKyNkZWZpbmUgU05faWRfY21jX3RyYW5zYWN0aW9uSWQJCSJpZC1jbWMtdHJhbnNhY3Rpb25JZCIKKyNkZWZpbmUgTklEX2lkX2NtY190cmFuc2FjdGlvbklkCQkzMzEKKyNkZWZpbmUgT0JKX2lkX2NtY190cmFuc2FjdGlvbklkCQlPQkpfaWRfY21jLDVMCisKKyNkZWZpbmUgU05faWRfY21jX3NlbmRlck5vbmNlCQkiaWQtY21jLXNlbmRlck5vbmNlIgorI2RlZmluZSBOSURfaWRfY21jX3NlbmRlck5vbmNlCQkzMzIKKyNkZWZpbmUgT0JKX2lkX2NtY19zZW5kZXJOb25jZQkJT0JKX2lkX2NtYyw2TAorCisjZGVmaW5lIFNOX2lkX2NtY19yZWNpcGllbnROb25jZQkJImlkLWNtYy1yZWNpcGllbnROb25jZSIKKyNkZWZpbmUgTklEX2lkX2NtY19yZWNpcGllbnROb25jZQkJMzMzCisjZGVmaW5lIE9CSl9pZF9jbWNfcmVjaXBpZW50Tm9uY2UJCU9CSl9pZF9jbWMsN0wKKworI2RlZmluZSBTTl9pZF9jbWNfYWRkRXh0ZW5zaW9ucwkJImlkLWNtYy1hZGRFeHRlbnNpb25zIgorI2RlZmluZSBOSURfaWRfY21jX2FkZEV4dGVuc2lvbnMJCTMzNAorI2RlZmluZSBPQkpfaWRfY21jX2FkZEV4dGVuc2lvbnMJCU9CSl9pZF9jbWMsOEwKKworI2RlZmluZSBTTl9pZF9jbWNfZW5jcnlwdGVkUE9QCQkiaWQtY21jLWVuY3J5cHRlZFBPUCIKKyNkZWZpbmUgTklEX2lkX2NtY19lbmNyeXB0ZWRQT1AJCTMzNQorI2RlZmluZSBPQkpfaWRfY21jX2VuY3J5cHRlZFBPUAkJT0JKX2lkX2NtYyw5TAorCisjZGVmaW5lIFNOX2lkX2NtY19kZWNyeXB0ZWRQT1AJCSJpZC1jbWMtZGVjcnlwdGVkUE9QIgorI2RlZmluZSBOSURfaWRfY21jX2RlY3J5cHRlZFBPUAkJMzM2CisjZGVmaW5lIE9CSl9pZF9jbWNfZGVjcnlwdGVkUE9QCQlPQkpfaWRfY21jLDEwTAorCisjZGVmaW5lIFNOX2lkX2NtY19scmFQT1BXaXRuZXNzCQkiaWQtY21jLWxyYVBPUFdpdG5lc3MiCisjZGVmaW5lIE5JRF9pZF9jbWNfbHJhUE9QV2l0bmVzcwkJMzM3CisjZGVmaW5lIE9CSl9pZF9jbWNfbHJhUE9QV2l0bmVzcwkJT0JKX2lkX2NtYywxMUwKKworI2RlZmluZSBTTl9pZF9jbWNfZ2V0Q2VydAkJImlkLWNtYy1nZXRDZXJ0IgorI2RlZmluZSBOSURfaWRfY21jX2dldENlcnQJCTMzOAorI2RlZmluZSBPQkpfaWRfY21jX2dldENlcnQJCU9CSl9pZF9jbWMsMTVMCisKKyNkZWZpbmUgU05faWRfY21jX2dldENSTAkJImlkLWNtYy1nZXRDUkwiCisjZGVmaW5lIE5JRF9pZF9jbWNfZ2V0Q1JMCQkzMzkKKyNkZWZpbmUgT0JKX2lkX2NtY19nZXRDUkwJCU9CSl9pZF9jbWMsMTZMCisKKyNkZWZpbmUgU05faWRfY21jX3Jldm9rZVJlcXVlc3QJCSJpZC1jbWMtcmV2b2tlUmVxdWVzdCIKKyNkZWZpbmUgTklEX2lkX2NtY19yZXZva2VSZXF1ZXN0CQkzNDAKKyNkZWZpbmUgT0JKX2lkX2NtY19yZXZva2VSZXF1ZXN0CQlPQkpfaWRfY21jLDE3TAorCisjZGVmaW5lIFNOX2lkX2NtY19yZWdJbmZvCQkiaWQtY21jLXJlZ0luZm8iCisjZGVmaW5lIE5JRF9pZF9jbWNfcmVnSW5mbwkJMzQxCisjZGVmaW5lIE9CSl9pZF9jbWNfcmVnSW5mbwkJT0JKX2lkX2NtYywxOEwKKworI2RlZmluZSBTTl9pZF9jbWNfcmVzcG9uc2VJbmZvCQkiaWQtY21jLXJlc3BvbnNlSW5mbyIKKyNkZWZpbmUgTklEX2lkX2NtY19yZXNwb25zZUluZm8JCTM0MgorI2RlZmluZSBPQkpfaWRfY21jX3Jlc3BvbnNlSW5mbwkJT0JKX2lkX2NtYywxOUwKKworI2RlZmluZSBTTl9pZF9jbWNfcXVlcnlQZW5kaW5nCQkiaWQtY21jLXF1ZXJ5UGVuZGluZyIKKyNkZWZpbmUgTklEX2lkX2NtY19xdWVyeVBlbmRpbmcJCTM0MworI2RlZmluZSBPQkpfaWRfY21jX3F1ZXJ5UGVuZGluZwkJT0JKX2lkX2NtYywyMUwKKworI2RlZmluZSBTTl9pZF9jbWNfcG9wTGlua1JhbmRvbQkJImlkLWNtYy1wb3BMaW5rUmFuZG9tIgorI2RlZmluZSBOSURfaWRfY21jX3BvcExpbmtSYW5kb20JCTM0NAorI2RlZmluZSBPQkpfaWRfY21jX3BvcExpbmtSYW5kb20JCU9CSl9pZF9jbWMsMjJMCisKKyNkZWZpbmUgU05faWRfY21jX3BvcExpbmtXaXRuZXNzCQkiaWQtY21jLXBvcExpbmtXaXRuZXNzIgorI2RlZmluZSBOSURfaWRfY21jX3BvcExpbmtXaXRuZXNzCQkzNDUKKyNkZWZpbmUgT0JKX2lkX2NtY19wb3BMaW5rV2l0bmVzcwkJT0JKX2lkX2NtYywyM0wKKworI2RlZmluZSBTTl9pZF9jbWNfY29uZmlybUNlcnRBY2NlcHRhbmNlCQkiaWQtY21jLWNvbmZpcm1DZXJ0QWNjZXB0YW5jZSIKKyNkZWZpbmUgTklEX2lkX2NtY19jb25maXJtQ2VydEFjY2VwdGFuY2UJCTM0NgorI2RlZmluZSBPQkpfaWRfY21jX2NvbmZpcm1DZXJ0QWNjZXB0YW5jZQkJT0JKX2lkX2NtYywyNEwKKworI2RlZmluZSBTTl9pZF9vbl9wZXJzb25hbERhdGEJCSJpZC1vbi1wZXJzb25hbERhdGEiCisjZGVmaW5lIE5JRF9pZF9vbl9wZXJzb25hbERhdGEJCTM0NworI2RlZmluZSBPQkpfaWRfb25fcGVyc29uYWxEYXRhCQlPQkpfaWRfb24sMUwKKworI2RlZmluZSBTTl9pZF9vbl9wZXJtYW5lbnRJZGVudGlmaWVyCQkiaWQtb24tcGVybWFuZW50SWRlbnRpZmllciIKKyNkZWZpbmUgTE5faWRfb25fcGVybWFuZW50SWRlbnRpZmllcgkJIlBlcm1hbmVudCBJZGVudGlmaWVyIgorI2RlZmluZSBOSURfaWRfb25fcGVybWFuZW50SWRlbnRpZmllcgkJODU4CisjZGVmaW5lIE9CSl9pZF9vbl9wZXJtYW5lbnRJZGVudGlmaWVyCQlPQkpfaWRfb24sM0wKKworI2RlZmluZSBTTl9pZF9wZGFfZGF0ZU9mQmlydGgJCSJpZC1wZGEtZGF0ZU9mQmlydGgiCisjZGVmaW5lIE5JRF9pZF9wZGFfZGF0ZU9mQmlydGgJCTM0OAorI2RlZmluZSBPQkpfaWRfcGRhX2RhdGVPZkJpcnRoCQlPQkpfaWRfcGRhLDFMCisKKyNkZWZpbmUgU05faWRfcGRhX3BsYWNlT2ZCaXJ0aAkJImlkLXBkYS1wbGFjZU9mQmlydGgiCisjZGVmaW5lIE5JRF9pZF9wZGFfcGxhY2VPZkJpcnRoCQkzNDkKKyNkZWZpbmUgT0JKX2lkX3BkYV9wbGFjZU9mQmlydGgJCU9CSl9pZF9wZGEsMkwKKworI2RlZmluZSBTTl9pZF9wZGFfZ2VuZGVyCQkiaWQtcGRhLWdlbmRlciIKKyNkZWZpbmUgTklEX2lkX3BkYV9nZW5kZXIJCTM1MQorI2RlZmluZSBPQkpfaWRfcGRhX2dlbmRlcgkJT0JKX2lkX3BkYSwzTAorCisjZGVmaW5lIFNOX2lkX3BkYV9jb3VudHJ5T2ZDaXRpemVuc2hpcAkJImlkLXBkYS1jb3VudHJ5T2ZDaXRpemVuc2hpcCIKKyNkZWZpbmUgTklEX2lkX3BkYV9jb3VudHJ5T2ZDaXRpemVuc2hpcAkJMzUyCisjZGVmaW5lIE9CSl9pZF9wZGFfY291bnRyeU9mQ2l0aXplbnNoaXAJCU9CSl9pZF9wZGEsNEwKKworI2RlZmluZSBTTl9pZF9wZGFfY291bnRyeU9mUmVzaWRlbmNlCQkiaWQtcGRhLWNvdW50cnlPZlJlc2lkZW5jZSIKKyNkZWZpbmUgTklEX2lkX3BkYV9jb3VudHJ5T2ZSZXNpZGVuY2UJCTM1MworI2RlZmluZSBPQkpfaWRfcGRhX2NvdW50cnlPZlJlc2lkZW5jZQkJT0JKX2lkX3BkYSw1TAorCisjZGVmaW5lIFNOX2lkX2FjYV9hdXRoZW50aWNhdGlvbkluZm8JCSJpZC1hY2EtYXV0aGVudGljYXRpb25JbmZvIgorI2RlZmluZSBOSURfaWRfYWNhX2F1dGhlbnRpY2F0aW9uSW5mbwkJMzU0CisjZGVmaW5lIE9CSl9pZF9hY2FfYXV0aGVudGljYXRpb25JbmZvCQlPQkpfaWRfYWNhLDFMCisKKyNkZWZpbmUgU05faWRfYWNhX2FjY2Vzc0lkZW50aXR5CQkiaWQtYWNhLWFjY2Vzc0lkZW50aXR5IgorI2RlZmluZSBOSURfaWRfYWNhX2FjY2Vzc0lkZW50aXR5CQkzNTUKKyNkZWZpbmUgT0JKX2lkX2FjYV9hY2Nlc3NJZGVudGl0eQkJT0JKX2lkX2FjYSwyTAorCisjZGVmaW5lIFNOX2lkX2FjYV9jaGFyZ2luZ0lkZW50aXR5CQkiaWQtYWNhLWNoYXJnaW5nSWRlbnRpdHkiCisjZGVmaW5lIE5JRF9pZF9hY2FfY2hhcmdpbmdJZGVudGl0eQkJMzU2CisjZGVmaW5lIE9CSl9pZF9hY2FfY2hhcmdpbmdJZGVudGl0eQkJT0JKX2lkX2FjYSwzTAorCisjZGVmaW5lIFNOX2lkX2FjYV9ncm91cAkJImlkLWFjYS1ncm91cCIKKyNkZWZpbmUgTklEX2lkX2FjYV9ncm91cAkJMzU3CisjZGVmaW5lIE9CSl9pZF9hY2FfZ3JvdXAJCU9CSl9pZF9hY2EsNEwKKworI2RlZmluZSBTTl9pZF9hY2Ffcm9sZQkJImlkLWFjYS1yb2xlIgorI2RlZmluZSBOSURfaWRfYWNhX3JvbGUJCTM1OAorI2RlZmluZSBPQkpfaWRfYWNhX3JvbGUJCU9CSl9pZF9hY2EsNUwKKworI2RlZmluZSBTTl9pZF9hY2FfZW5jQXR0cnMJCSJpZC1hY2EtZW5jQXR0cnMiCisjZGVmaW5lIE5JRF9pZF9hY2FfZW5jQXR0cnMJCTM5OQorI2RlZmluZSBPQkpfaWRfYWNhX2VuY0F0dHJzCQlPQkpfaWRfYWNhLDZMCisKKyNkZWZpbmUgU05faWRfcWNzX3BraXhRQ1N5bnRheF92MQkJImlkLXFjcy1wa2l4UUNTeW50YXgtdjEiCisjZGVmaW5lIE5JRF9pZF9xY3NfcGtpeFFDU3ludGF4X3YxCQkzNTkKKyNkZWZpbmUgT0JKX2lkX3Fjc19wa2l4UUNTeW50YXhfdjEJCU9CSl9pZF9xY3MsMUwKKworI2RlZmluZSBTTl9pZF9jY3RfY3JzCQkiaWQtY2N0LWNycyIKKyNkZWZpbmUgTklEX2lkX2NjdF9jcnMJCTM2MAorI2RlZmluZSBPQkpfaWRfY2N0X2NycwkJT0JKX2lkX2NjdCwxTAorCisjZGVmaW5lIFNOX2lkX2NjdF9QS0lEYXRhCQkiaWQtY2N0LVBLSURhdGEiCisjZGVmaW5lIE5JRF9pZF9jY3RfUEtJRGF0YQkJMzYxCisjZGVmaW5lIE9CSl9pZF9jY3RfUEtJRGF0YQkJT0JKX2lkX2NjdCwyTAorCisjZGVmaW5lIFNOX2lkX2NjdF9QS0lSZXNwb25zZQkJImlkLWNjdC1QS0lSZXNwb25zZSIKKyNkZWZpbmUgTklEX2lkX2NjdF9QS0lSZXNwb25zZQkJMzYyCisjZGVmaW5lIE9CSl9pZF9jY3RfUEtJUmVzcG9uc2UJCU9CSl9pZF9jY3QsM0wKKworI2RlZmluZSBTTl9pZF9wcGxfYW55TGFuZ3VhZ2UJCSJpZC1wcGwtYW55TGFuZ3VhZ2UiCisjZGVmaW5lIExOX2lkX3BwbF9hbnlMYW5ndWFnZQkJIkFueSBsYW5ndWFnZSIKKyNkZWZpbmUgTklEX2lkX3BwbF9hbnlMYW5ndWFnZQkJNjY0CisjZGVmaW5lIE9CSl9pZF9wcGxfYW55TGFuZ3VhZ2UJCU9CSl9pZF9wcGwsMEwKKworI2RlZmluZSBTTl9pZF9wcGxfaW5oZXJpdEFsbAkJImlkLXBwbC1pbmhlcml0QWxsIgorI2RlZmluZSBMTl9pZF9wcGxfaW5oZXJpdEFsbAkJIkluaGVyaXQgYWxsIgorI2RlZmluZSBOSURfaWRfcHBsX2luaGVyaXRBbGwJCTY2NQorI2RlZmluZSBPQkpfaWRfcHBsX2luaGVyaXRBbGwJCU9CSl9pZF9wcGwsMUwKKworI2RlZmluZSBTTl9JbmRlcGVuZGVudAkJImlkLXBwbC1pbmRlcGVuZGVudCIKKyNkZWZpbmUgTE5fSW5kZXBlbmRlbnQJCSJJbmRlcGVuZGVudCIKKyNkZWZpbmUgTklEX0luZGVwZW5kZW50CQk2NjcKKyNkZWZpbmUgT0JKX0luZGVwZW5kZW50CQlPQkpfaWRfcHBsLDJMCisKKyNkZWZpbmUgU05fYWRfT0NTUAkJIk9DU1AiCisjZGVmaW5lIExOX2FkX09DU1AJCSJPQ1NQIgorI2RlZmluZSBOSURfYWRfT0NTUAkJMTc4CisjZGVmaW5lIE9CSl9hZF9PQ1NQCQlPQkpfaWRfYWQsMUwKKworI2RlZmluZSBTTl9hZF9jYV9pc3N1ZXJzCQkiY2FJc3N1ZXJzIgorI2RlZmluZSBMTl9hZF9jYV9pc3N1ZXJzCQkiQ0EgSXNzdWVycyIKKyNkZWZpbmUgTklEX2FkX2NhX2lzc3VlcnMJCTE3OQorI2RlZmluZSBPQkpfYWRfY2FfaXNzdWVycwkJT0JKX2lkX2FkLDJMCisKKyNkZWZpbmUgU05fYWRfdGltZVN0YW1waW5nCQkiYWRfdGltZXN0YW1waW5nIgorI2RlZmluZSBMTl9hZF90aW1lU3RhbXBpbmcJCSJBRCBUaW1lIFN0YW1waW5nIgorI2RlZmluZSBOSURfYWRfdGltZVN0YW1waW5nCQkzNjMKKyNkZWZpbmUgT0JKX2FkX3RpbWVTdGFtcGluZwkJT0JKX2lkX2FkLDNMCisKKyNkZWZpbmUgU05fYWRfZHZjcwkJIkFEX0RWQ1MiCisjZGVmaW5lIExOX2FkX2R2Y3MJCSJhZCBkdmNzIgorI2RlZmluZSBOSURfYWRfZHZjcwkJMzY0CisjZGVmaW5lIE9CSl9hZF9kdmNzCQlPQkpfaWRfYWQsNEwKKworI2RlZmluZSBTTl9jYVJlcG9zaXRvcnkJCSJjYVJlcG9zaXRvcnkiCisjZGVmaW5lIExOX2NhUmVwb3NpdG9yeQkJIkNBIFJlcG9zaXRvcnkiCisjZGVmaW5lIE5JRF9jYVJlcG9zaXRvcnkJCTc4NQorI2RlZmluZSBPQkpfY2FSZXBvc2l0b3J5CQlPQkpfaWRfYWQsNUwKKworI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQCQlPQkpfYWRfT0NTUAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9iYXNpYwkJImJhc2ljT0NTUFJlc3BvbnNlIgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfYmFzaWMJCSJCYXNpYyBPQ1NQIFJlc3BvbnNlIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX2Jhc2ljCQkzNjUKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9iYXNpYwkJT0JKX2lkX3BraXhfT0NTUCwxTAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9Ob25jZQkJIk5vbmNlIgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfTm9uY2UJCSJPQ1NQIE5vbmNlIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX05vbmNlCQkzNjYKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9Ob25jZQkJT0JKX2lkX3BraXhfT0NTUCwyTAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9DcmxJRAkJIkNybElEIgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfQ3JsSUQJCSJPQ1NQIENSTCBJRCIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9DcmxJRAkJMzY3CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfQ3JsSUQJCU9CSl9pZF9wa2l4X09DU1AsM0wKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcwkJImFjY2VwdGFibGVSZXNwb25zZXMiCisjZGVmaW5lIExOX2lkX3BraXhfT0NTUF9hY2NlcHRhYmxlUmVzcG9uc2VzCQkiQWNjZXB0YWJsZSBPQ1NQIFJlc3BvbnNlcyIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9hY2NlcHRhYmxlUmVzcG9uc2VzCQkzNjgKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9hY2NlcHRhYmxlUmVzcG9uc2VzCQlPQkpfaWRfcGtpeF9PQ1NQLDRMCisKKyNkZWZpbmUgU05faWRfcGtpeF9PQ1NQX25vQ2hlY2sJCSJub0NoZWNrIgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1Bfbm9DaGVjawkJIk9DU1AgTm8gQ2hlY2siCisjZGVmaW5lIE5JRF9pZF9wa2l4X09DU1Bfbm9DaGVjawkJMzY5CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1Bfbm9DaGVjawkJT0JKX2lkX3BraXhfT0NTUCw1TAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmCQkiYXJjaGl2ZUN1dG9mZiIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX2FyY2hpdmVDdXRvZmYJCSJPQ1NQIEFyY2hpdmUgQ3V0b2ZmIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX2FyY2hpdmVDdXRvZmYJCTM3MAorI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQX2FyY2hpdmVDdXRvZmYJCU9CSl9pZF9wa2l4X09DU1AsNkwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1Bfc2VydmljZUxvY2F0b3IJCSJzZXJ2aWNlTG9jYXRvciIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX3NlcnZpY2VMb2NhdG9yCQkiT0NTUCBTZXJ2aWNlIExvY2F0b3IiCisjZGVmaW5lIE5JRF9pZF9wa2l4X09DU1Bfc2VydmljZUxvY2F0b3IJCTM3MQorI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQX3NlcnZpY2VMb2NhdG9yCQlPQkpfaWRfcGtpeF9PQ1NQLDdMCisKKyNkZWZpbmUgU05faWRfcGtpeF9PQ1NQX2V4dGVuZGVkU3RhdHVzCQkiZXh0ZW5kZWRTdGF0dXMiCisjZGVmaW5lIExOX2lkX3BraXhfT0NTUF9leHRlbmRlZFN0YXR1cwkJIkV4dGVuZGVkIE9DU1AgU3RhdHVzIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX2V4dGVuZGVkU3RhdHVzCQkzNzIKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9leHRlbmRlZFN0YXR1cwkJT0JKX2lkX3BraXhfT0NTUCw4TAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF92YWxpZAkJInZhbGlkIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX3ZhbGlkCQkzNzMKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF92YWxpZAkJT0JKX2lkX3BraXhfT0NTUCw5TAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9wYXRoCQkicGF0aCIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9wYXRoCQkzNzQKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9wYXRoCQlPQkpfaWRfcGtpeF9PQ1NQLDEwTAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF90cnVzdFJvb3QJCSJ0cnVzdFJvb3QiCisjZGVmaW5lIExOX2lkX3BraXhfT0NTUF90cnVzdFJvb3QJCSJUcnVzdCBSb290IgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX3RydXN0Um9vdAkJMzc1CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfdHJ1c3RSb290CQlPQkpfaWRfcGtpeF9PQ1NQLDExTAorCisjZGVmaW5lIFNOX2FsZ29yaXRobQkJImFsZ29yaXRobSIKKyNkZWZpbmUgTE5fYWxnb3JpdGhtCQkiYWxnb3JpdGhtIgorI2RlZmluZSBOSURfYWxnb3JpdGhtCQkzNzYKKyNkZWZpbmUgT0JKX2FsZ29yaXRobQkJMUwsM0wsMTRMLDNMLDJMCisKKyNkZWZpbmUgU05fbWQ1V2l0aFJTQQkJIlJTQS1OUC1NRDUiCisjZGVmaW5lIExOX21kNVdpdGhSU0EJCSJtZDVXaXRoUlNBIgorI2RlZmluZSBOSURfbWQ1V2l0aFJTQQkJMTA0CisjZGVmaW5lIE9CSl9tZDVXaXRoUlNBCQlPQkpfYWxnb3JpdGhtLDNMCisKKyNkZWZpbmUgU05fZGVzX2VjYgkJIkRFUy1FQ0IiCisjZGVmaW5lIExOX2Rlc19lY2IJCSJkZXMtZWNiIgorI2RlZmluZSBOSURfZGVzX2VjYgkJMjkKKyNkZWZpbmUgT0JKX2Rlc19lY2IJCU9CSl9hbGdvcml0aG0sNkwKKworI2RlZmluZSBTTl9kZXNfY2JjCQkiREVTLUNCQyIKKyNkZWZpbmUgTE5fZGVzX2NiYwkJImRlcy1jYmMiCisjZGVmaW5lIE5JRF9kZXNfY2JjCQkzMQorI2RlZmluZSBPQkpfZGVzX2NiYwkJT0JKX2FsZ29yaXRobSw3TAorCisjZGVmaW5lIFNOX2Rlc19vZmI2NAkJIkRFUy1PRkIiCisjZGVmaW5lIExOX2Rlc19vZmI2NAkJImRlcy1vZmIiCisjZGVmaW5lIE5JRF9kZXNfb2ZiNjQJCTQ1CisjZGVmaW5lIE9CSl9kZXNfb2ZiNjQJCU9CSl9hbGdvcml0aG0sOEwKKworI2RlZmluZSBTTl9kZXNfY2ZiNjQJCSJERVMtQ0ZCIgorI2RlZmluZSBMTl9kZXNfY2ZiNjQJCSJkZXMtY2ZiIgorI2RlZmluZSBOSURfZGVzX2NmYjY0CQkzMAorI2RlZmluZSBPQkpfZGVzX2NmYjY0CQlPQkpfYWxnb3JpdGhtLDlMCisKKyNkZWZpbmUgU05fcnNhU2lnbmF0dXJlCQkicnNhU2lnbmF0dXJlIgorI2RlZmluZSBOSURfcnNhU2lnbmF0dXJlCQkzNzcKKyNkZWZpbmUgT0JKX3JzYVNpZ25hdHVyZQkJT0JKX2FsZ29yaXRobSwxMUwKKworI2RlZmluZSBTTl9kc2FfMgkJIkRTQS1vbGQiCisjZGVmaW5lIExOX2RzYV8yCQkiZHNhRW5jcnlwdGlvbi1vbGQiCisjZGVmaW5lIE5JRF9kc2FfMgkJNjcKKyNkZWZpbmUgT0JKX2RzYV8yCQlPQkpfYWxnb3JpdGhtLDEyTAorCisjZGVmaW5lIFNOX2RzYVdpdGhTSEEJCSJEU0EtU0hBIgorI2RlZmluZSBMTl9kc2FXaXRoU0hBCQkiZHNhV2l0aFNIQSIKKyNkZWZpbmUgTklEX2RzYVdpdGhTSEEJCTY2CisjZGVmaW5lIE9CSl9kc2FXaXRoU0hBCQlPQkpfYWxnb3JpdGhtLDEzTAorCisjZGVmaW5lIFNOX3NoYVdpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLVNIQSIKKyNkZWZpbmUgTE5fc2hhV2l0aFJTQUVuY3J5cHRpb24JCSJzaGFXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3NoYVdpdGhSU0FFbmNyeXB0aW9uCQk0MgorI2RlZmluZSBPQkpfc2hhV2l0aFJTQUVuY3J5cHRpb24JCU9CSl9hbGdvcml0aG0sMTVMCisKKyNkZWZpbmUgU05fZGVzX2VkZV9lY2IJCSJERVMtRURFIgorI2RlZmluZSBMTl9kZXNfZWRlX2VjYgkJImRlcy1lZGUiCisjZGVmaW5lIE5JRF9kZXNfZWRlX2VjYgkJMzIKKyNkZWZpbmUgT0JKX2Rlc19lZGVfZWNiCQlPQkpfYWxnb3JpdGhtLDE3TAorCisjZGVmaW5lIFNOX2Rlc19lZGUzX2VjYgkJIkRFUy1FREUzIgorI2RlZmluZSBMTl9kZXNfZWRlM19lY2IJCSJkZXMtZWRlMyIKKyNkZWZpbmUgTklEX2Rlc19lZGUzX2VjYgkJMzMKKworI2RlZmluZSBTTl9kZXNfZWRlX2NiYwkJIkRFUy1FREUtQ0JDIgorI2RlZmluZSBMTl9kZXNfZWRlX2NiYwkJImRlcy1lZGUtY2JjIgorI2RlZmluZSBOSURfZGVzX2VkZV9jYmMJCTQzCisKKyNkZWZpbmUgU05fZGVzX2VkZV9jZmI2NAkJIkRFUy1FREUtQ0ZCIgorI2RlZmluZSBMTl9kZXNfZWRlX2NmYjY0CQkiZGVzLWVkZS1jZmIiCisjZGVmaW5lIE5JRF9kZXNfZWRlX2NmYjY0CQk2MAorCisjZGVmaW5lIFNOX2Rlc19lZGUzX2NmYjY0CQkiREVTLUVERTMtQ0ZCIgorI2RlZmluZSBMTl9kZXNfZWRlM19jZmI2NAkJImRlcy1lZGUzLWNmYiIKKyNkZWZpbmUgTklEX2Rlc19lZGUzX2NmYjY0CQk2MQorCisjZGVmaW5lIFNOX2Rlc19lZGVfb2ZiNjQJCSJERVMtRURFLU9GQiIKKyNkZWZpbmUgTE5fZGVzX2VkZV9vZmI2NAkJImRlcy1lZGUtb2ZiIgorI2RlZmluZSBOSURfZGVzX2VkZV9vZmI2NAkJNjIKKworI2RlZmluZSBTTl9kZXNfZWRlM19vZmI2NAkJIkRFUy1FREUzLU9GQiIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfb2ZiNjQJCSJkZXMtZWRlMy1vZmIiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19vZmI2NAkJNjMKKworI2RlZmluZSBTTl9kZXN4X2NiYwkJIkRFU1gtQ0JDIgorI2RlZmluZSBMTl9kZXN4X2NiYwkJImRlc3gtY2JjIgorI2RlZmluZSBOSURfZGVzeF9jYmMJCTgwCisKKyNkZWZpbmUgU05fc2hhCQkiU0hBIgorI2RlZmluZSBMTl9zaGEJCSJzaGEiCisjZGVmaW5lIE5JRF9zaGEJCTQxCisjZGVmaW5lIE9CSl9zaGEJCU9CSl9hbGdvcml0aG0sMThMCisKKyNkZWZpbmUgU05fc2hhMQkJIlNIQTEiCisjZGVmaW5lIExOX3NoYTEJCSJzaGExIgorI2RlZmluZSBOSURfc2hhMQkJNjQKKyNkZWZpbmUgT0JKX3NoYTEJCU9CSl9hbGdvcml0aG0sMjZMCisKKyNkZWZpbmUgU05fZHNhV2l0aFNIQTFfMgkJIkRTQS1TSEExLW9sZCIKKyNkZWZpbmUgTE5fZHNhV2l0aFNIQTFfMgkJImRzYVdpdGhTSEExLW9sZCIKKyNkZWZpbmUgTklEX2RzYVdpdGhTSEExXzIJCTcwCisjZGVmaW5lIE9CSl9kc2FXaXRoU0hBMV8yCQlPQkpfYWxnb3JpdGhtLDI3TAorCisjZGVmaW5lIFNOX3NoYTFXaXRoUlNBCQkiUlNBLVNIQTEtMiIKKyNkZWZpbmUgTE5fc2hhMVdpdGhSU0EJCSJzaGExV2l0aFJTQSIKKyNkZWZpbmUgTklEX3NoYTFXaXRoUlNBCQkxMTUKKyNkZWZpbmUgT0JKX3NoYTFXaXRoUlNBCQlPQkpfYWxnb3JpdGhtLDI5TAorCisjZGVmaW5lIFNOX3JpcGVtZDE2MAkJIlJJUEVNRDE2MCIKKyNkZWZpbmUgTE5fcmlwZW1kMTYwCQkicmlwZW1kMTYwIgorI2RlZmluZSBOSURfcmlwZW1kMTYwCQkxMTcKKyNkZWZpbmUgT0JKX3JpcGVtZDE2MAkJMUwsM0wsMzZMLDNMLDJMLDFMCisKKyNkZWZpbmUgU05fcmlwZW1kMTYwV2l0aFJTQQkJIlJTQS1SSVBFTUQxNjAiCisjZGVmaW5lIExOX3JpcGVtZDE2MFdpdGhSU0EJCSJyaXBlbWQxNjBXaXRoUlNBIgorI2RlZmluZSBOSURfcmlwZW1kMTYwV2l0aFJTQQkJMTE5CisjZGVmaW5lIE9CSl9yaXBlbWQxNjBXaXRoUlNBCQkxTCwzTCwzNkwsM0wsM0wsMUwsMkwKKworI2RlZmluZSBTTl9zeG5ldAkJIlNYTmV0SUQiCisjZGVmaW5lIExOX3N4bmV0CQkiU3Ryb25nIEV4dHJhbmV0IElEIgorI2RlZmluZSBOSURfc3huZXQJCTE0MworI2RlZmluZSBPQkpfc3huZXQJCTFMLDNMLDEwMUwsMUwsNEwsMUwKKworI2RlZmluZSBTTl9YNTAwCQkiWDUwMCIKKyNkZWZpbmUgTE5fWDUwMAkJImRpcmVjdG9yeSBzZXJ2aWNlcyAoWC41MDApIgorI2RlZmluZSBOSURfWDUwMAkJMTEKKyNkZWZpbmUgT0JKX1g1MDAJCTJMLDVMCisKKyNkZWZpbmUgU05fWDUwOQkJIlg1MDkiCisjZGVmaW5lIE5JRF9YNTA5CQkxMgorI2RlZmluZSBPQkpfWDUwOQkJT0JKX1g1MDAsNEwKKworI2RlZmluZSBTTl9jb21tb25OYW1lCQkiQ04iCisjZGVmaW5lIExOX2NvbW1vbk5hbWUJCSJjb21tb25OYW1lIgorI2RlZmluZSBOSURfY29tbW9uTmFtZQkJMTMKKyNkZWZpbmUgT0JKX2NvbW1vbk5hbWUJCU9CSl9YNTA5LDNMCisKKyNkZWZpbmUgU05fc3VybmFtZQkJIlNOIgorI2RlZmluZSBMTl9zdXJuYW1lCQkic3VybmFtZSIKKyNkZWZpbmUgTklEX3N1cm5hbWUJCTEwMAorI2RlZmluZSBPQkpfc3VybmFtZQkJT0JKX1g1MDksNEwKKworI2RlZmluZSBMTl9zZXJpYWxOdW1iZXIJCSJzZXJpYWxOdW1iZXIiCisjZGVmaW5lIE5JRF9zZXJpYWxOdW1iZXIJCTEwNQorI2RlZmluZSBPQkpfc2VyaWFsTnVtYmVyCQlPQkpfWDUwOSw1TAorCisjZGVmaW5lIFNOX2NvdW50cnlOYW1lCQkiQyIKKyNkZWZpbmUgTE5fY291bnRyeU5hbWUJCSJjb3VudHJ5TmFtZSIKKyNkZWZpbmUgTklEX2NvdW50cnlOYW1lCQkxNAorI2RlZmluZSBPQkpfY291bnRyeU5hbWUJCU9CSl9YNTA5LDZMCisKKyNkZWZpbmUgU05fbG9jYWxpdHlOYW1lCQkiTCIKKyNkZWZpbmUgTE5fbG9jYWxpdHlOYW1lCQkibG9jYWxpdHlOYW1lIgorI2RlZmluZSBOSURfbG9jYWxpdHlOYW1lCQkxNQorI2RlZmluZSBPQkpfbG9jYWxpdHlOYW1lCQlPQkpfWDUwOSw3TAorCisjZGVmaW5lIFNOX3N0YXRlT3JQcm92aW5jZU5hbWUJCSJTVCIKKyNkZWZpbmUgTE5fc3RhdGVPclByb3ZpbmNlTmFtZQkJInN0YXRlT3JQcm92aW5jZU5hbWUiCisjZGVmaW5lIE5JRF9zdGF0ZU9yUHJvdmluY2VOYW1lCQkxNgorI2RlZmluZSBPQkpfc3RhdGVPclByb3ZpbmNlTmFtZQkJT0JKX1g1MDksOEwKKworI2RlZmluZSBTTl9zdHJlZXRBZGRyZXNzCQkic3RyZWV0IgorI2RlZmluZSBMTl9zdHJlZXRBZGRyZXNzCQkic3RyZWV0QWRkcmVzcyIKKyNkZWZpbmUgTklEX3N0cmVldEFkZHJlc3MJCTY2MAorI2RlZmluZSBPQkpfc3RyZWV0QWRkcmVzcwkJT0JKX1g1MDksOUwKKworI2RlZmluZSBTTl9vcmdhbml6YXRpb25OYW1lCQkiTyIKKyNkZWZpbmUgTE5fb3JnYW5pemF0aW9uTmFtZQkJIm9yZ2FuaXphdGlvbk5hbWUiCisjZGVmaW5lIE5JRF9vcmdhbml6YXRpb25OYW1lCQkxNworI2RlZmluZSBPQkpfb3JnYW5pemF0aW9uTmFtZQkJT0JKX1g1MDksMTBMCisKKyNkZWZpbmUgU05fb3JnYW5pemF0aW9uYWxVbml0TmFtZQkJIk9VIgorI2RlZmluZSBMTl9vcmdhbml6YXRpb25hbFVuaXROYW1lCQkib3JnYW5pemF0aW9uYWxVbml0TmFtZSIKKyNkZWZpbmUgTklEX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJCTE4CisjZGVmaW5lIE9CSl9vcmdhbml6YXRpb25hbFVuaXROYW1lCQlPQkpfWDUwOSwxMUwKKworI2RlZmluZSBTTl90aXRsZQkJInRpdGxlIgorI2RlZmluZSBMTl90aXRsZQkJInRpdGxlIgorI2RlZmluZSBOSURfdGl0bGUJCTEwNgorI2RlZmluZSBPQkpfdGl0bGUJCU9CSl9YNTA5LDEyTAorCisjZGVmaW5lIExOX2Rlc2NyaXB0aW9uCQkiZGVzY3JpcHRpb24iCisjZGVmaW5lIE5JRF9kZXNjcmlwdGlvbgkJMTA3CisjZGVmaW5lIE9CSl9kZXNjcmlwdGlvbgkJT0JKX1g1MDksMTNMCisKKyNkZWZpbmUgTE5fc2VhcmNoR3VpZGUJCSJzZWFyY2hHdWlkZSIKKyNkZWZpbmUgTklEX3NlYXJjaEd1aWRlCQk4NTkKKyNkZWZpbmUgT0JKX3NlYXJjaEd1aWRlCQlPQkpfWDUwOSwxNEwKKworI2RlZmluZSBMTl9idXNpbmVzc0NhdGVnb3J5CQkiYnVzaW5lc3NDYXRlZ29yeSIKKyNkZWZpbmUgTklEX2J1c2luZXNzQ2F0ZWdvcnkJCTg2MAorI2RlZmluZSBPQkpfYnVzaW5lc3NDYXRlZ29yeQkJT0JKX1g1MDksMTVMCisKKyNkZWZpbmUgTE5fcG9zdGFsQWRkcmVzcwkJInBvc3RhbEFkZHJlc3MiCisjZGVmaW5lIE5JRF9wb3N0YWxBZGRyZXNzCQk4NjEKKyNkZWZpbmUgT0JKX3Bvc3RhbEFkZHJlc3MJCU9CSl9YNTA5LDE2TAorCisjZGVmaW5lIExOX3Bvc3RhbENvZGUJCSJwb3N0YWxDb2RlIgorI2RlZmluZSBOSURfcG9zdGFsQ29kZQkJNjYxCisjZGVmaW5lIE9CSl9wb3N0YWxDb2RlCQlPQkpfWDUwOSwxN0wKKworI2RlZmluZSBMTl9wb3N0T2ZmaWNlQm94CQkicG9zdE9mZmljZUJveCIKKyNkZWZpbmUgTklEX3Bvc3RPZmZpY2VCb3gJCTg2MgorI2RlZmluZSBPQkpfcG9zdE9mZmljZUJveAkJT0JKX1g1MDksMThMCisKKyNkZWZpbmUgTE5fcGh5c2ljYWxEZWxpdmVyeU9mZmljZU5hbWUJCSJwaHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZSIKKyNkZWZpbmUgTklEX3BoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lCQk4NjMKKyNkZWZpbmUgT0JKX3BoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lCQlPQkpfWDUwOSwxOUwKKworI2RlZmluZSBMTl90ZWxlcGhvbmVOdW1iZXIJCSJ0ZWxlcGhvbmVOdW1iZXIiCisjZGVmaW5lIE5JRF90ZWxlcGhvbmVOdW1iZXIJCTg2NAorI2RlZmluZSBPQkpfdGVsZXBob25lTnVtYmVyCQlPQkpfWDUwOSwyMEwKKworI2RlZmluZSBMTl90ZWxleE51bWJlcgkJInRlbGV4TnVtYmVyIgorI2RlZmluZSBOSURfdGVsZXhOdW1iZXIJCTg2NQorI2RlZmluZSBPQkpfdGVsZXhOdW1iZXIJCU9CSl9YNTA5LDIxTAorCisjZGVmaW5lIExOX3RlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIJCSJ0ZWxldGV4VGVybWluYWxJZGVudGlmaWVyIgorI2RlZmluZSBOSURfdGVsZXRleFRlcm1pbmFsSWRlbnRpZmllcgkJODY2CisjZGVmaW5lIE9CSl90ZWxldGV4VGVybWluYWxJZGVudGlmaWVyCQlPQkpfWDUwOSwyMkwKKworI2RlZmluZSBMTl9mYWNzaW1pbGVUZWxlcGhvbmVOdW1iZXIJCSJmYWNzaW1pbGVUZWxlcGhvbmVOdW1iZXIiCisjZGVmaW5lIE5JRF9mYWNzaW1pbGVUZWxlcGhvbmVOdW1iZXIJCTg2NworI2RlZmluZSBPQkpfZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyCQlPQkpfWDUwOSwyM0wKKworI2RlZmluZSBMTl94MTIxQWRkcmVzcwkJIngxMjFBZGRyZXNzIgorI2RlZmluZSBOSURfeDEyMUFkZHJlc3MJCTg2OAorI2RlZmluZSBPQkpfeDEyMUFkZHJlc3MJCU9CSl9YNTA5LDI0TAorCisjZGVmaW5lIExOX2ludGVybmF0aW9uYWxpU0ROTnVtYmVyCQkiaW50ZXJuYXRpb25hbGlTRE5OdW1iZXIiCisjZGVmaW5lIE5JRF9pbnRlcm5hdGlvbmFsaVNETk51bWJlcgkJODY5CisjZGVmaW5lIE9CSl9pbnRlcm5hdGlvbmFsaVNETk51bWJlcgkJT0JKX1g1MDksMjVMCisKKyNkZWZpbmUgTE5fcmVnaXN0ZXJlZEFkZHJlc3MJCSJyZWdpc3RlcmVkQWRkcmVzcyIKKyNkZWZpbmUgTklEX3JlZ2lzdGVyZWRBZGRyZXNzCQk4NzAKKyNkZWZpbmUgT0JKX3JlZ2lzdGVyZWRBZGRyZXNzCQlPQkpfWDUwOSwyNkwKKworI2RlZmluZSBMTl9kZXN0aW5hdGlvbkluZGljYXRvcgkJImRlc3RpbmF0aW9uSW5kaWNhdG9yIgorI2RlZmluZSBOSURfZGVzdGluYXRpb25JbmRpY2F0b3IJCTg3MQorI2RlZmluZSBPQkpfZGVzdGluYXRpb25JbmRpY2F0b3IJCU9CSl9YNTA5LDI3TAorCisjZGVmaW5lIExOX3ByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kCQkicHJlZmVycmVkRGVsaXZlcnlNZXRob2QiCisjZGVmaW5lIE5JRF9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZAkJODcyCisjZGVmaW5lIE9CSl9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZAkJT0JKX1g1MDksMjhMCisKKyNkZWZpbmUgTE5fcHJlc2VudGF0aW9uQWRkcmVzcwkJInByZXNlbnRhdGlvbkFkZHJlc3MiCisjZGVmaW5lIE5JRF9wcmVzZW50YXRpb25BZGRyZXNzCQk4NzMKKyNkZWZpbmUgT0JKX3ByZXNlbnRhdGlvbkFkZHJlc3MJCU9CSl9YNTA5LDI5TAorCisjZGVmaW5lIExOX3N1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dAkJInN1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dCIKKyNkZWZpbmUgTklEX3N1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dAkJODc0CisjZGVmaW5lIE9CSl9zdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQJCU9CSl9YNTA5LDMwTAorCisjZGVmaW5lIFNOX21lbWJlcgkJIm1lbWJlciIKKyNkZWZpbmUgTklEX21lbWJlcgkJODc1CisjZGVmaW5lIE9CSl9tZW1iZXIJCU9CSl9YNTA5LDMxTAorCisjZGVmaW5lIFNOX293bmVyCQkib3duZXIiCisjZGVmaW5lIE5JRF9vd25lcgkJODc2CisjZGVmaW5lIE9CSl9vd25lcgkJT0JKX1g1MDksMzJMCisKKyNkZWZpbmUgTE5fcm9sZU9jY3VwYW50CQkicm9sZU9jY3VwYW50IgorI2RlZmluZSBOSURfcm9sZU9jY3VwYW50CQk4NzcKKyNkZWZpbmUgT0JKX3JvbGVPY2N1cGFudAkJT0JKX1g1MDksMzNMCisKKyNkZWZpbmUgU05fc2VlQWxzbwkJInNlZUFsc28iCisjZGVmaW5lIE5JRF9zZWVBbHNvCQk4NzgKKyNkZWZpbmUgT0JKX3NlZUFsc28JCU9CSl9YNTA5LDM0TAorCisjZGVmaW5lIExOX3VzZXJQYXNzd29yZAkJInVzZXJQYXNzd29yZCIKKyNkZWZpbmUgTklEX3VzZXJQYXNzd29yZAkJODc5CisjZGVmaW5lIE9CSl91c2VyUGFzc3dvcmQJCU9CSl9YNTA5LDM1TAorCisjZGVmaW5lIExOX3VzZXJDZXJ0aWZpY2F0ZQkJInVzZXJDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUgTklEX3VzZXJDZXJ0aWZpY2F0ZQkJODgwCisjZGVmaW5lIE9CSl91c2VyQ2VydGlmaWNhdGUJCU9CSl9YNTA5LDM2TAorCisjZGVmaW5lIExOX2NBQ2VydGlmaWNhdGUJCSJjQUNlcnRpZmljYXRlIgorI2RlZmluZSBOSURfY0FDZXJ0aWZpY2F0ZQkJODgxCisjZGVmaW5lIE9CSl9jQUNlcnRpZmljYXRlCQlPQkpfWDUwOSwzN0wKKworI2RlZmluZSBMTl9hdXRob3JpdHlSZXZvY2F0aW9uTGlzdAkJImF1dGhvcml0eVJldm9jYXRpb25MaXN0IgorI2RlZmluZSBOSURfYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QJCTg4MgorI2RlZmluZSBPQkpfYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QJCU9CSl9YNTA5LDM4TAorCisjZGVmaW5lIExOX2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QJCSJjZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0IgorI2RlZmluZSBOSURfY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdAkJODgzCisjZGVmaW5lIE9CSl9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0CQlPQkpfWDUwOSwzOUwKKworI2RlZmluZSBMTl9jcm9zc0NlcnRpZmljYXRlUGFpcgkJImNyb3NzQ2VydGlmaWNhdGVQYWlyIgorI2RlZmluZSBOSURfY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIJCTg4NAorI2RlZmluZSBPQkpfY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIJCU9CSl9YNTA5LDQwTAorCisjZGVmaW5lIFNOX25hbWUJCSJuYW1lIgorI2RlZmluZSBMTl9uYW1lCQkibmFtZSIKKyNkZWZpbmUgTklEX25hbWUJCTE3MworI2RlZmluZSBPQkpfbmFtZQkJT0JKX1g1MDksNDFMCisKKyNkZWZpbmUgU05fZ2l2ZW5OYW1lCQkiR04iCisjZGVmaW5lIExOX2dpdmVuTmFtZQkJImdpdmVuTmFtZSIKKyNkZWZpbmUgTklEX2dpdmVuTmFtZQkJOTkKKyNkZWZpbmUgT0JKX2dpdmVuTmFtZQkJT0JKX1g1MDksNDJMCisKKyNkZWZpbmUgU05faW5pdGlhbHMJCSJpbml0aWFscyIKKyNkZWZpbmUgTE5faW5pdGlhbHMJCSJpbml0aWFscyIKKyNkZWZpbmUgTklEX2luaXRpYWxzCQkxMDEKKyNkZWZpbmUgT0JKX2luaXRpYWxzCQlPQkpfWDUwOSw0M0wKKworI2RlZmluZSBMTl9nZW5lcmF0aW9uUXVhbGlmaWVyCQkiZ2VuZXJhdGlvblF1YWxpZmllciIKKyNkZWZpbmUgTklEX2dlbmVyYXRpb25RdWFsaWZpZXIJCTUwOQorI2RlZmluZSBPQkpfZ2VuZXJhdGlvblF1YWxpZmllcgkJT0JKX1g1MDksNDRMCisKKyNkZWZpbmUgTE5feDUwMFVuaXF1ZUlkZW50aWZpZXIJCSJ4NTAwVW5pcXVlSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3g1MDBVbmlxdWVJZGVudGlmaWVyCQk1MDMKKyNkZWZpbmUgT0JKX3g1MDBVbmlxdWVJZGVudGlmaWVyCQlPQkpfWDUwOSw0NUwKKworI2RlZmluZSBTTl9kblF1YWxpZmllcgkJImRuUXVhbGlmaWVyIgorI2RlZmluZSBMTl9kblF1YWxpZmllcgkJImRuUXVhbGlmaWVyIgorI2RlZmluZSBOSURfZG5RdWFsaWZpZXIJCTE3NAorI2RlZmluZSBPQkpfZG5RdWFsaWZpZXIJCU9CSl9YNTA5LDQ2TAorCisjZGVmaW5lIExOX2VuaGFuY2VkU2VhcmNoR3VpZGUJCSJlbmhhbmNlZFNlYXJjaEd1aWRlIgorI2RlZmluZSBOSURfZW5oYW5jZWRTZWFyY2hHdWlkZQkJODg1CisjZGVmaW5lIE9CSl9lbmhhbmNlZFNlYXJjaEd1aWRlCQlPQkpfWDUwOSw0N0wKKworI2RlZmluZSBMTl9wcm90b2NvbEluZm9ybWF0aW9uCQkicHJvdG9jb2xJbmZvcm1hdGlvbiIKKyNkZWZpbmUgTklEX3Byb3RvY29sSW5mb3JtYXRpb24JCTg4NgorI2RlZmluZSBPQkpfcHJvdG9jb2xJbmZvcm1hdGlvbgkJT0JKX1g1MDksNDhMCisKKyNkZWZpbmUgTE5fZGlzdGluZ3Vpc2hlZE5hbWUJCSJkaXN0aW5ndWlzaGVkTmFtZSIKKyNkZWZpbmUgTklEX2Rpc3Rpbmd1aXNoZWROYW1lCQk4ODcKKyNkZWZpbmUgT0JKX2Rpc3Rpbmd1aXNoZWROYW1lCQlPQkpfWDUwOSw0OUwKKworI2RlZmluZSBMTl91bmlxdWVNZW1iZXIJCSJ1bmlxdWVNZW1iZXIiCisjZGVmaW5lIE5JRF91bmlxdWVNZW1iZXIJCTg4OAorI2RlZmluZSBPQkpfdW5pcXVlTWVtYmVyCQlPQkpfWDUwOSw1MEwKKworI2RlZmluZSBMTl9ob3VzZUlkZW50aWZpZXIJCSJob3VzZUlkZW50aWZpZXIiCisjZGVmaW5lIE5JRF9ob3VzZUlkZW50aWZpZXIJCTg4OQorI2RlZmluZSBPQkpfaG91c2VJZGVudGlmaWVyCQlPQkpfWDUwOSw1MUwKKworI2RlZmluZSBMTl9zdXBwb3J0ZWRBbGdvcml0aG1zCQkic3VwcG9ydGVkQWxnb3JpdGhtcyIKKyNkZWZpbmUgTklEX3N1cHBvcnRlZEFsZ29yaXRobXMJCTg5MAorI2RlZmluZSBPQkpfc3VwcG9ydGVkQWxnb3JpdGhtcwkJT0JKX1g1MDksNTJMCisKKyNkZWZpbmUgTE5fZGVsdGFSZXZvY2F0aW9uTGlzdAkJImRlbHRhUmV2b2NhdGlvbkxpc3QiCisjZGVmaW5lIE5JRF9kZWx0YVJldm9jYXRpb25MaXN0CQk4OTEKKyNkZWZpbmUgT0JKX2RlbHRhUmV2b2NhdGlvbkxpc3QJCU9CSl9YNTA5LDUzTAorCisjZGVmaW5lIFNOX2RtZE5hbWUJCSJkbWROYW1lIgorI2RlZmluZSBOSURfZG1kTmFtZQkJODkyCisjZGVmaW5lIE9CSl9kbWROYW1lCQlPQkpfWDUwOSw1NEwKKworI2RlZmluZSBMTl9wc2V1ZG9ueW0JCSJwc2V1ZG9ueW0iCisjZGVmaW5lIE5JRF9wc2V1ZG9ueW0JCTUxMAorI2RlZmluZSBPQkpfcHNldWRvbnltCQlPQkpfWDUwOSw2NUwKKworI2RlZmluZSBTTl9yb2xlCQkicm9sZSIKKyNkZWZpbmUgTE5fcm9sZQkJInJvbGUiCisjZGVmaW5lIE5JRF9yb2xlCQk0MDAKKyNkZWZpbmUgT0JKX3JvbGUJCU9CSl9YNTA5LDcyTAorCisjZGVmaW5lIFNOX1g1MDBhbGdvcml0aG1zCQkiWDUwMGFsZ29yaXRobXMiCisjZGVmaW5lIExOX1g1MDBhbGdvcml0aG1zCQkiZGlyZWN0b3J5IHNlcnZpY2VzIC0gYWxnb3JpdGhtcyIKKyNkZWZpbmUgTklEX1g1MDBhbGdvcml0aG1zCQkzNzgKKyNkZWZpbmUgT0JKX1g1MDBhbGdvcml0aG1zCQlPQkpfWDUwMCw4TAorCisjZGVmaW5lIFNOX3JzYQkJIlJTQSIKKyNkZWZpbmUgTE5fcnNhCQkicnNhIgorI2RlZmluZSBOSURfcnNhCQkxOQorI2RlZmluZSBPQkpfcnNhCQlPQkpfWDUwMGFsZ29yaXRobXMsMUwsMUwKKworI2RlZmluZSBTTl9tZGMyV2l0aFJTQQkJIlJTQS1NREMyIgorI2RlZmluZSBMTl9tZGMyV2l0aFJTQQkJIm1kYzJXaXRoUlNBIgorI2RlZmluZSBOSURfbWRjMldpdGhSU0EJCTk2CisjZGVmaW5lIE9CSl9tZGMyV2l0aFJTQQkJT0JKX1g1MDBhbGdvcml0aG1zLDNMLDEwMEwKKworI2RlZmluZSBTTl9tZGMyCQkiTURDMiIKKyNkZWZpbmUgTE5fbWRjMgkJIm1kYzIiCisjZGVmaW5lIE5JRF9tZGMyCQk5NQorI2RlZmluZSBPQkpfbWRjMgkJT0JKX1g1MDBhbGdvcml0aG1zLDNMLDEwMUwKKworI2RlZmluZSBTTl9pZF9jZQkJImlkLWNlIgorI2RlZmluZSBOSURfaWRfY2UJCTgxCisjZGVmaW5lIE9CSl9pZF9jZQkJT0JKX1g1MDAsMjlMCisKKyNkZWZpbmUgU05fc3ViamVjdF9kaXJlY3RvcnlfYXR0cmlidXRlcwkJInN1YmplY3REaXJlY3RvcnlBdHRyaWJ1dGVzIgorI2RlZmluZSBMTl9zdWJqZWN0X2RpcmVjdG9yeV9hdHRyaWJ1dGVzCQkiWDUwOXYzIFN1YmplY3QgRGlyZWN0b3J5IEF0dHJpYnV0ZXMiCisjZGVmaW5lIE5JRF9zdWJqZWN0X2RpcmVjdG9yeV9hdHRyaWJ1dGVzCQk3NjkKKyNkZWZpbmUgT0JKX3N1YmplY3RfZGlyZWN0b3J5X2F0dHJpYnV0ZXMJCU9CSl9pZF9jZSw5TAorCisjZGVmaW5lIFNOX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJCSJzdWJqZWN0S2V5SWRlbnRpZmllciIKKyNkZWZpbmUgTE5fc3ViamVjdF9rZXlfaWRlbnRpZmllcgkJIlg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyIgorI2RlZmluZSBOSURfc3ViamVjdF9rZXlfaWRlbnRpZmllcgkJODIKKyNkZWZpbmUgT0JKX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJCU9CSl9pZF9jZSwxNEwKKworI2RlZmluZSBTTl9rZXlfdXNhZ2UJCSJrZXlVc2FnZSIKKyNkZWZpbmUgTE5fa2V5X3VzYWdlCQkiWDUwOXYzIEtleSBVc2FnZSIKKyNkZWZpbmUgTklEX2tleV91c2FnZQkJODMKKyNkZWZpbmUgT0JKX2tleV91c2FnZQkJT0JKX2lkX2NlLDE1TAorCisjZGVmaW5lIFNOX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAkJInByaXZhdGVLZXlVc2FnZVBlcmlvZCIKKyNkZWZpbmUgTE5fcHJpdmF0ZV9rZXlfdXNhZ2VfcGVyaW9kCQkiWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZCIKKyNkZWZpbmUgTklEX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAkJODQKKyNkZWZpbmUgT0JKX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAkJT0JKX2lkX2NlLDE2TAorCisjZGVmaW5lIFNOX3N1YmplY3RfYWx0X25hbWUJCSJzdWJqZWN0QWx0TmFtZSIKKyNkZWZpbmUgTE5fc3ViamVjdF9hbHRfbmFtZQkJIlg1MDl2MyBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWUiCisjZGVmaW5lIE5JRF9zdWJqZWN0X2FsdF9uYW1lCQk4NQorI2RlZmluZSBPQkpfc3ViamVjdF9hbHRfbmFtZQkJT0JKX2lkX2NlLDE3TAorCisjZGVmaW5lIFNOX2lzc3Vlcl9hbHRfbmFtZQkJImlzc3VlckFsdE5hbWUiCisjZGVmaW5lIExOX2lzc3Vlcl9hbHRfbmFtZQkJIlg1MDl2MyBJc3N1ZXIgQWx0ZXJuYXRpdmUgTmFtZSIKKyNkZWZpbmUgTklEX2lzc3Vlcl9hbHRfbmFtZQkJODYKKyNkZWZpbmUgT0JKX2lzc3Vlcl9hbHRfbmFtZQkJT0JKX2lkX2NlLDE4TAorCisjZGVmaW5lIFNOX2Jhc2ljX2NvbnN0cmFpbnRzCQkiYmFzaWNDb25zdHJhaW50cyIKKyNkZWZpbmUgTE5fYmFzaWNfY29uc3RyYWludHMJCSJYNTA5djMgQmFzaWMgQ29uc3RyYWludHMiCisjZGVmaW5lIE5JRF9iYXNpY19jb25zdHJhaW50cwkJODcKKyNkZWZpbmUgT0JKX2Jhc2ljX2NvbnN0cmFpbnRzCQlPQkpfaWRfY2UsMTlMCisKKyNkZWZpbmUgU05fY3JsX251bWJlcgkJImNybE51bWJlciIKKyNkZWZpbmUgTE5fY3JsX251bWJlcgkJIlg1MDl2MyBDUkwgTnVtYmVyIgorI2RlZmluZSBOSURfY3JsX251bWJlcgkJODgKKyNkZWZpbmUgT0JKX2NybF9udW1iZXIJCU9CSl9pZF9jZSwyMEwKKworI2RlZmluZSBTTl9jcmxfcmVhc29uCQkiQ1JMUmVhc29uIgorI2RlZmluZSBMTl9jcmxfcmVhc29uCQkiWDUwOXYzIENSTCBSZWFzb24gQ29kZSIKKyNkZWZpbmUgTklEX2NybF9yZWFzb24JCTE0MQorI2RlZmluZSBPQkpfY3JsX3JlYXNvbgkJT0JKX2lkX2NlLDIxTAorCisjZGVmaW5lIFNOX2ludmFsaWRpdHlfZGF0ZQkJImludmFsaWRpdHlEYXRlIgorI2RlZmluZSBMTl9pbnZhbGlkaXR5X2RhdGUJCSJJbnZhbGlkaXR5IERhdGUiCisjZGVmaW5lIE5JRF9pbnZhbGlkaXR5X2RhdGUJCTE0MgorI2RlZmluZSBPQkpfaW52YWxpZGl0eV9kYXRlCQlPQkpfaWRfY2UsMjRMCisKKyNkZWZpbmUgU05fZGVsdGFfY3JsCQkiZGVsdGFDUkwiCisjZGVmaW5lIExOX2RlbHRhX2NybAkJIlg1MDl2MyBEZWx0YSBDUkwgSW5kaWNhdG9yIgorI2RlZmluZSBOSURfZGVsdGFfY3JsCQkxNDAKKyNkZWZpbmUgT0JKX2RlbHRhX2NybAkJT0JKX2lkX2NlLDI3TAorCisjZGVmaW5lIFNOX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50CQkiaXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50IgorI2RlZmluZSBMTl9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludAkJIlg1MDl2MyBJc3N1aW5nIERpc3RydWJ1dGlvbiBQb2ludCIKKyNkZWZpbmUgTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50CQk3NzAKKyNkZWZpbmUgT0JKX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50CQlPQkpfaWRfY2UsMjhMCisKKyNkZWZpbmUgU05fY2VydGlmaWNhdGVfaXNzdWVyCQkiY2VydGlmaWNhdGVJc3N1ZXIiCisjZGVmaW5lIExOX2NlcnRpZmljYXRlX2lzc3VlcgkJIlg1MDl2MyBDZXJ0aWZpY2F0ZSBJc3N1ZXIiCisjZGVmaW5lIE5JRF9jZXJ0aWZpY2F0ZV9pc3N1ZXIJCTc3MQorI2RlZmluZSBPQkpfY2VydGlmaWNhdGVfaXNzdWVyCQlPQkpfaWRfY2UsMjlMCisKKyNkZWZpbmUgU05fbmFtZV9jb25zdHJhaW50cwkJIm5hbWVDb25zdHJhaW50cyIKKyNkZWZpbmUgTE5fbmFtZV9jb25zdHJhaW50cwkJIlg1MDl2MyBOYW1lIENvbnN0cmFpbnRzIgorI2RlZmluZSBOSURfbmFtZV9jb25zdHJhaW50cwkJNjY2CisjZGVmaW5lIE9CSl9uYW1lX2NvbnN0cmFpbnRzCQlPQkpfaWRfY2UsMzBMCisKKyNkZWZpbmUgU05fY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMJCSJjcmxEaXN0cmlidXRpb25Qb2ludHMiCisjZGVmaW5lIExOX2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQkiWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzIgorI2RlZmluZSBOSURfY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMJCTEwMworI2RlZmluZSBPQkpfY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMJCU9CSl9pZF9jZSwzMUwKKworI2RlZmluZSBTTl9jZXJ0aWZpY2F0ZV9wb2xpY2llcwkJImNlcnRpZmljYXRlUG9saWNpZXMiCisjZGVmaW5lIExOX2NlcnRpZmljYXRlX3BvbGljaWVzCQkiWDUwOXYzIENlcnRpZmljYXRlIFBvbGljaWVzIgorI2RlZmluZSBOSURfY2VydGlmaWNhdGVfcG9saWNpZXMJCTg5CisjZGVmaW5lIE9CSl9jZXJ0aWZpY2F0ZV9wb2xpY2llcwkJT0JKX2lkX2NlLDMyTAorCisjZGVmaW5lIFNOX2FueV9wb2xpY3kJCSJhbnlQb2xpY3kiCisjZGVmaW5lIExOX2FueV9wb2xpY3kJCSJYNTA5djMgQW55IFBvbGljeSIKKyNkZWZpbmUgTklEX2FueV9wb2xpY3kJCTc0NgorI2RlZmluZSBPQkpfYW55X3BvbGljeQkJT0JKX2NlcnRpZmljYXRlX3BvbGljaWVzLDBMCisKKyNkZWZpbmUgU05fcG9saWN5X21hcHBpbmdzCQkicG9saWN5TWFwcGluZ3MiCisjZGVmaW5lIExOX3BvbGljeV9tYXBwaW5ncwkJIlg1MDl2MyBQb2xpY3kgTWFwcGluZ3MiCisjZGVmaW5lIE5JRF9wb2xpY3lfbWFwcGluZ3MJCTc0NworI2RlZmluZSBPQkpfcG9saWN5X21hcHBpbmdzCQlPQkpfaWRfY2UsMzNMCisKKyNkZWZpbmUgU05fYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyCQkiYXV0aG9yaXR5S2V5SWRlbnRpZmllciIKKyNkZWZpbmUgTE5fYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyCQkiWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkJOTAKKyNkZWZpbmUgT0JKX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkJT0JKX2lkX2NlLDM1TAorCisjZGVmaW5lIFNOX3BvbGljeV9jb25zdHJhaW50cwkJInBvbGljeUNvbnN0cmFpbnRzIgorI2RlZmluZSBMTl9wb2xpY3lfY29uc3RyYWludHMJCSJYNTA5djMgUG9saWN5IENvbnN0cmFpbnRzIgorI2RlZmluZSBOSURfcG9saWN5X2NvbnN0cmFpbnRzCQk0MDEKKyNkZWZpbmUgT0JKX3BvbGljeV9jb25zdHJhaW50cwkJT0JKX2lkX2NlLDM2TAorCisjZGVmaW5lIFNOX2V4dF9rZXlfdXNhZ2UJCSJleHRlbmRlZEtleVVzYWdlIgorI2RlZmluZSBMTl9leHRfa2V5X3VzYWdlCQkiWDUwOXYzIEV4dGVuZGVkIEtleSBVc2FnZSIKKyNkZWZpbmUgTklEX2V4dF9rZXlfdXNhZ2UJCTEyNgorI2RlZmluZSBPQkpfZXh0X2tleV91c2FnZQkJT0JKX2lkX2NlLDM3TAorCisjZGVmaW5lIFNOX2ZyZXNoZXN0X2NybAkJImZyZXNoZXN0Q1JMIgorI2RlZmluZSBMTl9mcmVzaGVzdF9jcmwJCSJYNTA5djMgRnJlc2hlc3QgQ1JMIgorI2RlZmluZSBOSURfZnJlc2hlc3RfY3JsCQk4NTcKKyNkZWZpbmUgT0JKX2ZyZXNoZXN0X2NybAkJT0JKX2lkX2NlLDQ2TAorCisjZGVmaW5lIFNOX2luaGliaXRfYW55X3BvbGljeQkJImluaGliaXRBbnlQb2xpY3kiCisjZGVmaW5lIExOX2luaGliaXRfYW55X3BvbGljeQkJIlg1MDl2MyBJbmhpYml0IEFueSBQb2xpY3kiCisjZGVmaW5lIE5JRF9pbmhpYml0X2FueV9wb2xpY3kJCTc0OAorI2RlZmluZSBPQkpfaW5oaWJpdF9hbnlfcG9saWN5CQlPQkpfaWRfY2UsNTRMCisKKyNkZWZpbmUgU05fdGFyZ2V0X2luZm9ybWF0aW9uCQkidGFyZ2V0SW5mb3JtYXRpb24iCisjZGVmaW5lIExOX3RhcmdldF9pbmZvcm1hdGlvbgkJIlg1MDl2MyBBQyBUYXJnZXRpbmciCisjZGVmaW5lIE5JRF90YXJnZXRfaW5mb3JtYXRpb24JCTQwMgorI2RlZmluZSBPQkpfdGFyZ2V0X2luZm9ybWF0aW9uCQlPQkpfaWRfY2UsNTVMCisKKyNkZWZpbmUgU05fbm9fcmV2X2F2YWlsCQkibm9SZXZBdmFpbCIKKyNkZWZpbmUgTE5fbm9fcmV2X2F2YWlsCQkiWDUwOXYzIE5vIFJldm9jYXRpb24gQXZhaWxhYmxlIgorI2RlZmluZSBOSURfbm9fcmV2X2F2YWlsCQk0MDMKKyNkZWZpbmUgT0JKX25vX3Jldl9hdmFpbAkJT0JKX2lkX2NlLDU2TAorCisjZGVmaW5lIFNOX25ldHNjYXBlCQkiTmV0c2NhcGUiCisjZGVmaW5lIExOX25ldHNjYXBlCQkiTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycC4iCisjZGVmaW5lIE5JRF9uZXRzY2FwZQkJNTcKKyNkZWZpbmUgT0JKX25ldHNjYXBlCQkyTCwxNkwsODQwTCwxTCwxMTM3MzBMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2VydF9leHRlbnNpb24JCSJuc0NlcnRFeHQiCisjZGVmaW5lIExOX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uCQkiTmV0c2NhcGUgQ2VydGlmaWNhdGUgRXh0ZW5zaW9uIgorI2RlZmluZSBOSURfbmV0c2NhcGVfY2VydF9leHRlbnNpb24JCTU4CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbgkJT0JKX25ldHNjYXBlLDFMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfZGF0YV90eXBlCQkibnNEYXRhVHlwZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfZGF0YV90eXBlCQkiTmV0c2NhcGUgRGF0YSBUeXBlIgorI2RlZmluZSBOSURfbmV0c2NhcGVfZGF0YV90eXBlCQk1OQorI2RlZmluZSBPQkpfbmV0c2NhcGVfZGF0YV90eXBlCQlPQkpfbmV0c2NhcGUsMkwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jZXJ0X3R5cGUJCSJuc0NlcnRUeXBlIgorI2RlZmluZSBMTl9uZXRzY2FwZV9jZXJ0X3R5cGUJCSJOZXRzY2FwZSBDZXJ0IFR5cGUiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jZXJ0X3R5cGUJCTcxCisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jZXJ0X3R5cGUJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiwxTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2Jhc2VfdXJsCQkibnNCYXNlVXJsIgorI2RlZmluZSBMTl9uZXRzY2FwZV9iYXNlX3VybAkJIk5ldHNjYXBlIEJhc2UgVXJsIgorI2RlZmluZSBOSURfbmV0c2NhcGVfYmFzZV91cmwJCTcyCisjZGVmaW5lIE9CSl9uZXRzY2FwZV9iYXNlX3VybAkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDJMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfcmV2b2NhdGlvbl91cmwJCSJuc1Jldm9jYXRpb25VcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsCQkiTmV0c2NhcGUgUmV2b2NhdGlvbiBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybAkJNzMKKyNkZWZpbmUgT0JKX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sM0wKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybAkJIm5zQ2FSZXZvY2F0aW9uVXJsIgorI2RlZmluZSBMTl9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybAkJIk5ldHNjYXBlIENBIFJldm9jYXRpb24gVXJsIgorI2RlZmluZSBOSURfbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwJCTc0CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybAkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDRMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfcmVuZXdhbF91cmwJCSJuc1JlbmV3YWxVcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX3JlbmV3YWxfdXJsCQkiTmV0c2NhcGUgUmVuZXdhbCBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9yZW5ld2FsX3VybAkJNzUKKyNkZWZpbmUgT0JKX25ldHNjYXBlX3JlbmV3YWxfdXJsCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sN0wKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsCQkibnNDYVBvbGljeVVybCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2FfcG9saWN5X3VybAkJIk5ldHNjYXBlIENBIFBvbGljeSBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsCQk3NgorI2RlZmluZSBPQkpfbmV0c2NhcGVfY2FfcG9saWN5X3VybAkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDhMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCQkibnNTc2xTZXJ2ZXJOYW1lIgorI2RlZmluZSBMTl9uZXRzY2FwZV9zc2xfc2VydmVyX25hbWUJCSJOZXRzY2FwZSBTU0wgU2VydmVyIE5hbWUiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9zc2xfc2VydmVyX25hbWUJCTc3CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9zc2xfc2VydmVyX25hbWUJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiwxMkwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jb21tZW50CQkibnNDb21tZW50IgorI2RlZmluZSBMTl9uZXRzY2FwZV9jb21tZW50CQkiTmV0c2NhcGUgQ29tbWVudCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NvbW1lbnQJCTc4CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jb21tZW50CQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sMTNMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2VydF9zZXF1ZW5jZQkJIm5zQ2VydFNlcXVlbmNlIgorI2RlZmluZSBMTl9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlCQkiTmV0c2NhcGUgQ2VydGlmaWNhdGUgU2VxdWVuY2UiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlCQk3OQorI2RlZmluZSBPQkpfbmV0c2NhcGVfY2VydF9zZXF1ZW5jZQkJT0JKX25ldHNjYXBlX2RhdGFfdHlwZSw1TAorCisjZGVmaW5lIFNOX25zX3NnYwkJIm5zU0dDIgorI2RlZmluZSBMTl9uc19zZ2MJCSJOZXRzY2FwZSBTZXJ2ZXIgR2F0ZWQgQ3J5cHRvIgorI2RlZmluZSBOSURfbnNfc2djCQkxMzkKKyNkZWZpbmUgT0JKX25zX3NnYwkJT0JKX25ldHNjYXBlLDRMLDFMCisKKyNkZWZpbmUgU05fb3JnCQkiT1JHIgorI2RlZmluZSBMTl9vcmcJCSJvcmciCisjZGVmaW5lIE5JRF9vcmcJCTM3OQorI2RlZmluZSBPQkpfb3JnCQlPQkpfaXNvLDNMCisKKyNkZWZpbmUgU05fZG9kCQkiRE9EIgorI2RlZmluZSBMTl9kb2QJCSJkb2QiCisjZGVmaW5lIE5JRF9kb2QJCTM4MAorI2RlZmluZSBPQkpfZG9kCQlPQkpfb3JnLDZMCisKKyNkZWZpbmUgU05faWFuYQkJIklBTkEiCisjZGVmaW5lIExOX2lhbmEJCSJpYW5hIgorI2RlZmluZSBOSURfaWFuYQkJMzgxCisjZGVmaW5lIE9CSl9pYW5hCQlPQkpfZG9kLDFMCisKKyNkZWZpbmUgT0JKX2ludGVybmV0CQlPQkpfaWFuYQorCisjZGVmaW5lIFNOX0RpcmVjdG9yeQkJImRpcmVjdG9yeSIKKyNkZWZpbmUgTE5fRGlyZWN0b3J5CQkiRGlyZWN0b3J5IgorI2RlZmluZSBOSURfRGlyZWN0b3J5CQkzODIKKyNkZWZpbmUgT0JKX0RpcmVjdG9yeQkJT0JKX2ludGVybmV0LDFMCisKKyNkZWZpbmUgU05fTWFuYWdlbWVudAkJIm1nbXQiCisjZGVmaW5lIExOX01hbmFnZW1lbnQJCSJNYW5hZ2VtZW50IgorI2RlZmluZSBOSURfTWFuYWdlbWVudAkJMzgzCisjZGVmaW5lIE9CSl9NYW5hZ2VtZW50CQlPQkpfaW50ZXJuZXQsMkwKKworI2RlZmluZSBTTl9FeHBlcmltZW50YWwJCSJleHBlcmltZW50YWwiCisjZGVmaW5lIExOX0V4cGVyaW1lbnRhbAkJIkV4cGVyaW1lbnRhbCIKKyNkZWZpbmUgTklEX0V4cGVyaW1lbnRhbAkJMzg0CisjZGVmaW5lIE9CSl9FeHBlcmltZW50YWwJCU9CSl9pbnRlcm5ldCwzTAorCisjZGVmaW5lIFNOX1ByaXZhdGUJCSJwcml2YXRlIgorI2RlZmluZSBMTl9Qcml2YXRlCQkiUHJpdmF0ZSIKKyNkZWZpbmUgTklEX1ByaXZhdGUJCTM4NQorI2RlZmluZSBPQkpfUHJpdmF0ZQkJT0JKX2ludGVybmV0LDRMCisKKyNkZWZpbmUgU05fU2VjdXJpdHkJCSJzZWN1cml0eSIKKyNkZWZpbmUgTE5fU2VjdXJpdHkJCSJTZWN1cml0eSIKKyNkZWZpbmUgTklEX1NlY3VyaXR5CQkzODYKKyNkZWZpbmUgT0JKX1NlY3VyaXR5CQlPQkpfaW50ZXJuZXQsNUwKKworI2RlZmluZSBTTl9TTk1QdjIJCSJzbm1wdjIiCisjZGVmaW5lIExOX1NOTVB2MgkJIlNOTVB2MiIKKyNkZWZpbmUgTklEX1NOTVB2MgkJMzg3CisjZGVmaW5lIE9CSl9TTk1QdjIJCU9CSl9pbnRlcm5ldCw2TAorCisjZGVmaW5lIExOX01haWwJCSJNYWlsIgorI2RlZmluZSBOSURfTWFpbAkJMzg4CisjZGVmaW5lIE9CSl9NYWlsCQlPQkpfaW50ZXJuZXQsN0wKKworI2RlZmluZSBTTl9FbnRlcnByaXNlcwkJImVudGVycHJpc2VzIgorI2RlZmluZSBMTl9FbnRlcnByaXNlcwkJIkVudGVycHJpc2VzIgorI2RlZmluZSBOSURfRW50ZXJwcmlzZXMJCTM4OQorI2RlZmluZSBPQkpfRW50ZXJwcmlzZXMJCU9CSl9Qcml2YXRlLDFMCisKKyNkZWZpbmUgU05fZGNPYmplY3QJCSJkY29iamVjdCIKKyNkZWZpbmUgTE5fZGNPYmplY3QJCSJkY09iamVjdCIKKyNkZWZpbmUgTklEX2RjT2JqZWN0CQkzOTAKKyNkZWZpbmUgT0JKX2RjT2JqZWN0CQlPQkpfRW50ZXJwcmlzZXMsMTQ2NkwsMzQ0TAorCisjZGVmaW5lIFNOX21pbWVfbWhzCQkibWltZS1taHMiCisjZGVmaW5lIExOX21pbWVfbWhzCQkiTUlNRSBNSFMiCisjZGVmaW5lIE5JRF9taW1lX21ocwkJNTA0CisjZGVmaW5lIE9CSl9taW1lX21ocwkJT0JKX01haWwsMUwKKworI2RlZmluZSBTTl9taW1lX21oc19oZWFkaW5ncwkJIm1pbWUtbWhzLWhlYWRpbmdzIgorI2RlZmluZSBMTl9taW1lX21oc19oZWFkaW5ncwkJIm1pbWUtbWhzLWhlYWRpbmdzIgorI2RlZmluZSBOSURfbWltZV9taHNfaGVhZGluZ3MJCTUwNQorI2RlZmluZSBPQkpfbWltZV9taHNfaGVhZGluZ3MJCU9CSl9taW1lX21ocywxTAorCisjZGVmaW5lIFNOX21pbWVfbWhzX2JvZGllcwkJIm1pbWUtbWhzLWJvZGllcyIKKyNkZWZpbmUgTE5fbWltZV9taHNfYm9kaWVzCQkibWltZS1taHMtYm9kaWVzIgorI2RlZmluZSBOSURfbWltZV9taHNfYm9kaWVzCQk1MDYKKyNkZWZpbmUgT0JKX21pbWVfbWhzX2JvZGllcwkJT0JKX21pbWVfbWhzLDJMCisKKyNkZWZpbmUgU05faWRfaGV4X3BhcnRpYWxfbWVzc2FnZQkJImlkLWhleC1wYXJ0aWFsLW1lc3NhZ2UiCisjZGVmaW5lIExOX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UJCSJpZC1oZXgtcGFydGlhbC1tZXNzYWdlIgorI2RlZmluZSBOSURfaWRfaGV4X3BhcnRpYWxfbWVzc2FnZQkJNTA3CisjZGVmaW5lIE9CSl9pZF9oZXhfcGFydGlhbF9tZXNzYWdlCQlPQkpfbWltZV9taHNfaGVhZGluZ3MsMUwKKworI2RlZmluZSBTTl9pZF9oZXhfbXVsdGlwYXJ0X21lc3NhZ2UJCSJpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UiCisjZGVmaW5lIExOX2lkX2hleF9tdWx0aXBhcnRfbWVzc2FnZQkJImlkLWhleC1tdWx0aXBhcnQtbWVzc2FnZSIKKyNkZWZpbmUgTklEX2lkX2hleF9tdWx0aXBhcnRfbWVzc2FnZQkJNTA4CisjZGVmaW5lIE9CSl9pZF9oZXhfbXVsdGlwYXJ0X21lc3NhZ2UJCU9CSl9taW1lX21oc19oZWFkaW5ncywyTAorCisjZGVmaW5lIFNOX3JsZV9jb21wcmVzc2lvbgkJIlJMRSIKKyNkZWZpbmUgTE5fcmxlX2NvbXByZXNzaW9uCQkicnVuIGxlbmd0aCBjb21wcmVzc2lvbiIKKyNkZWZpbmUgTklEX3JsZV9jb21wcmVzc2lvbgkJMTI0CisjZGVmaW5lIE9CSl9ybGVfY29tcHJlc3Npb24JCTFMLDFMLDFMLDFMLDY2NkwsMUwKKworI2RlZmluZSBTTl96bGliX2NvbXByZXNzaW9uCQkiWkxJQiIKKyNkZWZpbmUgTE5femxpYl9jb21wcmVzc2lvbgkJInpsaWIgY29tcHJlc3Npb24iCisjZGVmaW5lIE5JRF96bGliX2NvbXByZXNzaW9uCQkxMjUKKyNkZWZpbmUgT0JKX3psaWJfY29tcHJlc3Npb24JCU9CSl9pZF9zbWltZV9hbGcsOEwKKworI2RlZmluZSBPQkpfY3NvcgkJMkwsMTZMLDg0MEwsMUwsMTAxTCwzTAorCisjZGVmaW5lIE9CSl9uaXN0QWxnb3JpdGhtcwkJT0JKX2Nzb3IsNEwKKworI2RlZmluZSBPQkpfYWVzCQlPQkpfbmlzdEFsZ29yaXRobXMsMUwKKworI2RlZmluZSBTTl9hZXNfMTI4X2VjYgkJIkFFUy0xMjgtRUNCIgorI2RlZmluZSBMTl9hZXNfMTI4X2VjYgkJImFlcy0xMjgtZWNiIgorI2RlZmluZSBOSURfYWVzXzEyOF9lY2IJCTQxOAorI2RlZmluZSBPQkpfYWVzXzEyOF9lY2IJCU9CSl9hZXMsMUwKKworI2RlZmluZSBTTl9hZXNfMTI4X2NiYwkJIkFFUy0xMjgtQ0JDIgorI2RlZmluZSBMTl9hZXNfMTI4X2NiYwkJImFlcy0xMjgtY2JjIgorI2RlZmluZSBOSURfYWVzXzEyOF9jYmMJCTQxOQorI2RlZmluZSBPQkpfYWVzXzEyOF9jYmMJCU9CSl9hZXMsMkwKKworI2RlZmluZSBTTl9hZXNfMTI4X29mYjEyOAkJIkFFUy0xMjgtT0ZCIgorI2RlZmluZSBMTl9hZXNfMTI4X29mYjEyOAkJImFlcy0xMjgtb2ZiIgorI2RlZmluZSBOSURfYWVzXzEyOF9vZmIxMjgJCTQyMAorI2RlZmluZSBPQkpfYWVzXzEyOF9vZmIxMjgJCU9CSl9hZXMsM0wKKworI2RlZmluZSBTTl9hZXNfMTI4X2NmYjEyOAkJIkFFUy0xMjgtQ0ZCIgorI2RlZmluZSBMTl9hZXNfMTI4X2NmYjEyOAkJImFlcy0xMjgtY2ZiIgorI2RlZmluZSBOSURfYWVzXzEyOF9jZmIxMjgJCTQyMQorI2RlZmluZSBPQkpfYWVzXzEyOF9jZmIxMjgJCU9CSl9hZXMsNEwKKworI2RlZmluZSBTTl9hZXNfMTkyX2VjYgkJIkFFUy0xOTItRUNCIgorI2RlZmluZSBMTl9hZXNfMTkyX2VjYgkJImFlcy0xOTItZWNiIgorI2RlZmluZSBOSURfYWVzXzE5Ml9lY2IJCTQyMgorI2RlZmluZSBPQkpfYWVzXzE5Ml9lY2IJCU9CSl9hZXMsMjFMCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9jYmMJCSJBRVMtMTkyLUNCQyIKKyNkZWZpbmUgTE5fYWVzXzE5Ml9jYmMJCSJhZXMtMTkyLWNiYyIKKyNkZWZpbmUgTklEX2Flc18xOTJfY2JjCQk0MjMKKyNkZWZpbmUgT0JKX2Flc18xOTJfY2JjCQlPQkpfYWVzLDIyTAorCisjZGVmaW5lIFNOX2Flc18xOTJfb2ZiMTI4CQkiQUVTLTE5Mi1PRkIiCisjZGVmaW5lIExOX2Flc18xOTJfb2ZiMTI4CQkiYWVzLTE5Mi1vZmIiCisjZGVmaW5lIE5JRF9hZXNfMTkyX29mYjEyOAkJNDI0CisjZGVmaW5lIE9CSl9hZXNfMTkyX29mYjEyOAkJT0JKX2FlcywyM0wKKworI2RlZmluZSBTTl9hZXNfMTkyX2NmYjEyOAkJIkFFUy0xOTItQ0ZCIgorI2RlZmluZSBMTl9hZXNfMTkyX2NmYjEyOAkJImFlcy0xOTItY2ZiIgorI2RlZmluZSBOSURfYWVzXzE5Ml9jZmIxMjgJCTQyNQorI2RlZmluZSBPQkpfYWVzXzE5Ml9jZmIxMjgJCU9CSl9hZXMsMjRMCisKKyNkZWZpbmUgU05fYWVzXzI1Nl9lY2IJCSJBRVMtMjU2LUVDQiIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9lY2IJCSJhZXMtMjU2LWVjYiIKKyNkZWZpbmUgTklEX2Flc18yNTZfZWNiCQk0MjYKKyNkZWZpbmUgT0JKX2Flc18yNTZfZWNiCQlPQkpfYWVzLDQxTAorCisjZGVmaW5lIFNOX2Flc18yNTZfY2JjCQkiQUVTLTI1Ni1DQkMiCisjZGVmaW5lIExOX2Flc18yNTZfY2JjCQkiYWVzLTI1Ni1jYmMiCisjZGVmaW5lIE5JRF9hZXNfMjU2X2NiYwkJNDI3CisjZGVmaW5lIE9CSl9hZXNfMjU2X2NiYwkJT0JKX2Flcyw0MkwKKworI2RlZmluZSBTTl9hZXNfMjU2X29mYjEyOAkJIkFFUy0yNTYtT0ZCIgorI2RlZmluZSBMTl9hZXNfMjU2X29mYjEyOAkJImFlcy0yNTYtb2ZiIgorI2RlZmluZSBOSURfYWVzXzI1Nl9vZmIxMjgJCTQyOAorI2RlZmluZSBPQkpfYWVzXzI1Nl9vZmIxMjgJCU9CSl9hZXMsNDNMCisKKyNkZWZpbmUgU05fYWVzXzI1Nl9jZmIxMjgJCSJBRVMtMjU2LUNGQiIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9jZmIxMjgJCSJhZXMtMjU2LWNmYiIKKyNkZWZpbmUgTklEX2Flc18yNTZfY2ZiMTI4CQk0MjkKKyNkZWZpbmUgT0JKX2Flc18yNTZfY2ZiMTI4CQlPQkpfYWVzLDQ0TAorCisjZGVmaW5lIFNOX2Flc18xMjhfY2ZiMQkJIkFFUy0xMjgtQ0ZCMSIKKyNkZWZpbmUgTE5fYWVzXzEyOF9jZmIxCQkiYWVzLTEyOC1jZmIxIgorI2RlZmluZSBOSURfYWVzXzEyOF9jZmIxCQk2NTAKKworI2RlZmluZSBTTl9hZXNfMTkyX2NmYjEJCSJBRVMtMTkyLUNGQjEiCisjZGVmaW5lIExOX2Flc18xOTJfY2ZiMQkJImFlcy0xOTItY2ZiMSIKKyNkZWZpbmUgTklEX2Flc18xOTJfY2ZiMQkJNjUxCisKKyNkZWZpbmUgU05fYWVzXzI1Nl9jZmIxCQkiQUVTLTI1Ni1DRkIxIgorI2RlZmluZSBMTl9hZXNfMjU2X2NmYjEJCSJhZXMtMjU2LWNmYjEiCisjZGVmaW5lIE5JRF9hZXNfMjU2X2NmYjEJCTY1MgorCisjZGVmaW5lIFNOX2Flc18xMjhfY2ZiOAkJIkFFUy0xMjgtQ0ZCOCIKKyNkZWZpbmUgTE5fYWVzXzEyOF9jZmI4CQkiYWVzLTEyOC1jZmI4IgorI2RlZmluZSBOSURfYWVzXzEyOF9jZmI4CQk2NTMKKworI2RlZmluZSBTTl9hZXNfMTkyX2NmYjgJCSJBRVMtMTkyLUNGQjgiCisjZGVmaW5lIExOX2Flc18xOTJfY2ZiOAkJImFlcy0xOTItY2ZiOCIKKyNkZWZpbmUgTklEX2Flc18xOTJfY2ZiOAkJNjU0CisKKyNkZWZpbmUgU05fYWVzXzI1Nl9jZmI4CQkiQUVTLTI1Ni1DRkI4IgorI2RlZmluZSBMTl9hZXNfMjU2X2NmYjgJCSJhZXMtMjU2LWNmYjgiCisjZGVmaW5lIE5JRF9hZXNfMjU2X2NmYjgJCTY1NQorCisjZGVmaW5lIFNOX2Rlc19jZmIxCQkiREVTLUNGQjEiCisjZGVmaW5lIExOX2Rlc19jZmIxCQkiZGVzLWNmYjEiCisjZGVmaW5lIE5JRF9kZXNfY2ZiMQkJNjU2CisKKyNkZWZpbmUgU05fZGVzX2NmYjgJCSJERVMtQ0ZCOCIKKyNkZWZpbmUgTE5fZGVzX2NmYjgJCSJkZXMtY2ZiOCIKKyNkZWZpbmUgTklEX2Rlc19jZmI4CQk2NTcKKworI2RlZmluZSBTTl9kZXNfZWRlM19jZmIxCQkiREVTLUVERTMtQ0ZCMSIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfY2ZiMQkJImRlcy1lZGUzLWNmYjEiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19jZmIxCQk2NTgKKworI2RlZmluZSBTTl9kZXNfZWRlM19jZmI4CQkiREVTLUVERTMtQ0ZCOCIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfY2ZiOAkJImRlcy1lZGUzLWNmYjgiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19jZmI4CQk2NTkKKworI2RlZmluZSBTTl9pZF9hZXMxMjhfd3JhcAkJImlkLWFlczEyOC13cmFwIgorI2RlZmluZSBOSURfaWRfYWVzMTI4X3dyYXAJCTc4OAorI2RlZmluZSBPQkpfaWRfYWVzMTI4X3dyYXAJCU9CSl9hZXMsNUwKKworI2RlZmluZSBTTl9pZF9hZXMxOTJfd3JhcAkJImlkLWFlczE5Mi13cmFwIgorI2RlZmluZSBOSURfaWRfYWVzMTkyX3dyYXAJCTc4OQorI2RlZmluZSBPQkpfaWRfYWVzMTkyX3dyYXAJCU9CSl9hZXMsMjVMCisKKyNkZWZpbmUgU05faWRfYWVzMjU2X3dyYXAJCSJpZC1hZXMyNTYtd3JhcCIKKyNkZWZpbmUgTklEX2lkX2FlczI1Nl93cmFwCQk3OTAKKyNkZWZpbmUgT0JKX2lkX2FlczI1Nl93cmFwCQlPQkpfYWVzLDQ1TAorCisjZGVmaW5lIE9CSl9uaXN0X2hhc2hhbGdzCQlPQkpfbmlzdEFsZ29yaXRobXMsMkwKKworI2RlZmluZSBTTl9zaGEyNTYJCSJTSEEyNTYiCisjZGVmaW5lIExOX3NoYTI1NgkJInNoYTI1NiIKKyNkZWZpbmUgTklEX3NoYTI1NgkJNjcyCisjZGVmaW5lIE9CSl9zaGEyNTYJCU9CSl9uaXN0X2hhc2hhbGdzLDFMCisKKyNkZWZpbmUgU05fc2hhMzg0CQkiU0hBMzg0IgorI2RlZmluZSBMTl9zaGEzODQJCSJzaGEzODQiCisjZGVmaW5lIE5JRF9zaGEzODQJCTY3MworI2RlZmluZSBPQkpfc2hhMzg0CQlPQkpfbmlzdF9oYXNoYWxncywyTAorCisjZGVmaW5lIFNOX3NoYTUxMgkJIlNIQTUxMiIKKyNkZWZpbmUgTE5fc2hhNTEyCQkic2hhNTEyIgorI2RlZmluZSBOSURfc2hhNTEyCQk2NzQKKyNkZWZpbmUgT0JKX3NoYTUxMgkJT0JKX25pc3RfaGFzaGFsZ3MsM0wKKworI2RlZmluZSBTTl9zaGEyMjQJCSJTSEEyMjQiCisjZGVmaW5lIExOX3NoYTIyNAkJInNoYTIyNCIKKyNkZWZpbmUgTklEX3NoYTIyNAkJNjc1CisjZGVmaW5lIE9CSl9zaGEyMjQJCU9CSl9uaXN0X2hhc2hhbGdzLDRMCisKKyNkZWZpbmUgT0JKX2RzYV93aXRoX3NoYTIJCU9CSl9uaXN0QWxnb3JpdGhtcywzTAorCisjZGVmaW5lIFNOX2RzYV93aXRoX1NIQTIyNAkJImRzYV93aXRoX1NIQTIyNCIKKyNkZWZpbmUgTklEX2RzYV93aXRoX1NIQTIyNAkJODAyCisjZGVmaW5lIE9CSl9kc2Ffd2l0aF9TSEEyMjQJCU9CSl9kc2Ffd2l0aF9zaGEyLDFMCisKKyNkZWZpbmUgU05fZHNhX3dpdGhfU0hBMjU2CQkiZHNhX3dpdGhfU0hBMjU2IgorI2RlZmluZSBOSURfZHNhX3dpdGhfU0hBMjU2CQk4MDMKKyNkZWZpbmUgT0JKX2RzYV93aXRoX1NIQTI1NgkJT0JKX2RzYV93aXRoX3NoYTIsMkwKKworI2RlZmluZSBTTl9ob2xkX2luc3RydWN0aW9uX2NvZGUJCSJob2xkSW5zdHJ1Y3Rpb25Db2RlIgorI2RlZmluZSBMTl9ob2xkX2luc3RydWN0aW9uX2NvZGUJCSJIb2xkIEluc3RydWN0aW9uIENvZGUiCisjZGVmaW5lIE5JRF9ob2xkX2luc3RydWN0aW9uX2NvZGUJCTQzMAorI2RlZmluZSBPQkpfaG9sZF9pbnN0cnVjdGlvbl9jb2RlCQlPQkpfaWRfY2UsMjNMCisKKyNkZWZpbmUgT0JKX2hvbGRJbnN0cnVjdGlvbgkJT0JKX1g5XzU3LDJMCisKKyNkZWZpbmUgU05faG9sZF9pbnN0cnVjdGlvbl9ub25lCQkiaG9sZEluc3RydWN0aW9uTm9uZSIKKyNkZWZpbmUgTE5faG9sZF9pbnN0cnVjdGlvbl9ub25lCQkiSG9sZCBJbnN0cnVjdGlvbiBOb25lIgorI2RlZmluZSBOSURfaG9sZF9pbnN0cnVjdGlvbl9ub25lCQk0MzEKKyNkZWZpbmUgT0JKX2hvbGRfaW5zdHJ1Y3Rpb25fbm9uZQkJT0JKX2hvbGRJbnN0cnVjdGlvbiwxTAorCisjZGVmaW5lIFNOX2hvbGRfaW5zdHJ1Y3Rpb25fY2FsbF9pc3N1ZXIJCSJob2xkSW5zdHJ1Y3Rpb25DYWxsSXNzdWVyIgorI2RlZmluZSBMTl9ob2xkX2luc3RydWN0aW9uX2NhbGxfaXNzdWVyCQkiSG9sZCBJbnN0cnVjdGlvbiBDYWxsIElzc3VlciIKKyNkZWZpbmUgTklEX2hvbGRfaW5zdHJ1Y3Rpb25fY2FsbF9pc3N1ZXIJCTQzMgorI2RlZmluZSBPQkpfaG9sZF9pbnN0cnVjdGlvbl9jYWxsX2lzc3VlcgkJT0JKX2hvbGRJbnN0cnVjdGlvbiwyTAorCisjZGVmaW5lIFNOX2hvbGRfaW5zdHJ1Y3Rpb25fcmVqZWN0CQkiaG9sZEluc3RydWN0aW9uUmVqZWN0IgorI2RlZmluZSBMTl9ob2xkX2luc3RydWN0aW9uX3JlamVjdAkJIkhvbGQgSW5zdHJ1Y3Rpb24gUmVqZWN0IgorI2RlZmluZSBOSURfaG9sZF9pbnN0cnVjdGlvbl9yZWplY3QJCTQzMworI2RlZmluZSBPQkpfaG9sZF9pbnN0cnVjdGlvbl9yZWplY3QJCU9CSl9ob2xkSW5zdHJ1Y3Rpb24sM0wKKworI2RlZmluZSBTTl9kYXRhCQkiZGF0YSIKKyNkZWZpbmUgTklEX2RhdGEJCTQzNAorI2RlZmluZSBPQkpfZGF0YQkJT0JKX2l0dV90LDlMCisKKyNkZWZpbmUgU05fcHNzCQkicHNzIgorI2RlZmluZSBOSURfcHNzCQk0MzUKKyNkZWZpbmUgT0JKX3BzcwkJT0JKX2RhdGEsMjM0MkwKKworI2RlZmluZSBTTl91Y2wJCSJ1Y2wiCisjZGVmaW5lIE5JRF91Y2wJCTQzNgorI2RlZmluZSBPQkpfdWNsCQlPQkpfcHNzLDE5MjAwMzAwTAorCisjZGVmaW5lIFNOX3BpbG90CQkicGlsb3QiCisjZGVmaW5lIE5JRF9waWxvdAkJNDM3CisjZGVmaW5lIE9CSl9waWxvdAkJT0JKX3VjbCwxMDBMCisKKyNkZWZpbmUgTE5fcGlsb3RBdHRyaWJ1dGVUeXBlCQkicGlsb3RBdHRyaWJ1dGVUeXBlIgorI2RlZmluZSBOSURfcGlsb3RBdHRyaWJ1dGVUeXBlCQk0MzgKKyNkZWZpbmUgT0JKX3BpbG90QXR0cmlidXRlVHlwZQkJT0JKX3BpbG90LDFMCisKKyNkZWZpbmUgTE5fcGlsb3RBdHRyaWJ1dGVTeW50YXgJCSJwaWxvdEF0dHJpYnV0ZVN5bnRheCIKKyNkZWZpbmUgTklEX3BpbG90QXR0cmlidXRlU3ludGF4CQk0MzkKKyNkZWZpbmUgT0JKX3BpbG90QXR0cmlidXRlU3ludGF4CQlPQkpfcGlsb3QsM0wKKworI2RlZmluZSBMTl9waWxvdE9iamVjdENsYXNzCQkicGlsb3RPYmplY3RDbGFzcyIKKyNkZWZpbmUgTklEX3BpbG90T2JqZWN0Q2xhc3MJCTQ0MAorI2RlZmluZSBPQkpfcGlsb3RPYmplY3RDbGFzcwkJT0JKX3BpbG90LDRMCisKKyNkZWZpbmUgTE5fcGlsb3RHcm91cHMJCSJwaWxvdEdyb3VwcyIKKyNkZWZpbmUgTklEX3BpbG90R3JvdXBzCQk0NDEKKyNkZWZpbmUgT0JKX3BpbG90R3JvdXBzCQlPQkpfcGlsb3QsMTBMCisKKyNkZWZpbmUgTE5faUE1U3RyaW5nU3ludGF4CQkiaUE1U3RyaW5nU3ludGF4IgorI2RlZmluZSBOSURfaUE1U3RyaW5nU3ludGF4CQk0NDIKKyNkZWZpbmUgT0JKX2lBNVN0cmluZ1N5bnRheAkJT0JKX3BpbG90QXR0cmlidXRlU3ludGF4LDRMCisKKyNkZWZpbmUgTE5fY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheAkJImNhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgiCisjZGVmaW5lIE5JRF9jYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4CQk0NDMKKyNkZWZpbmUgT0JKX2Nhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgJCU9CSl9waWxvdEF0dHJpYnV0ZVN5bnRheCw1TAorCisjZGVmaW5lIExOX3BpbG90T2JqZWN0CQkicGlsb3RPYmplY3QiCisjZGVmaW5lIE5JRF9waWxvdE9iamVjdAkJNDQ0CisjZGVmaW5lIE9CSl9waWxvdE9iamVjdAkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsM0wKKworI2RlZmluZSBMTl9waWxvdFBlcnNvbgkJInBpbG90UGVyc29uIgorI2RlZmluZSBOSURfcGlsb3RQZXJzb24JCTQ0NQorI2RlZmluZSBPQkpfcGlsb3RQZXJzb24JCU9CSl9waWxvdE9iamVjdENsYXNzLDRMCisKKyNkZWZpbmUgU05fYWNjb3VudAkJImFjY291bnQiCisjZGVmaW5lIE5JRF9hY2NvdW50CQk0NDYKKyNkZWZpbmUgT0JKX2FjY291bnQJCU9CSl9waWxvdE9iamVjdENsYXNzLDVMCisKKyNkZWZpbmUgU05fZG9jdW1lbnQJCSJkb2N1bWVudCIKKyNkZWZpbmUgTklEX2RvY3VtZW50CQk0NDcKKyNkZWZpbmUgT0JKX2RvY3VtZW50CQlPQkpfcGlsb3RPYmplY3RDbGFzcyw2TAorCisjZGVmaW5lIFNOX3Jvb20JCSJyb29tIgorI2RlZmluZSBOSURfcm9vbQkJNDQ4CisjZGVmaW5lIE9CSl9yb29tCQlPQkpfcGlsb3RPYmplY3RDbGFzcyw3TAorCisjZGVmaW5lIExOX2RvY3VtZW50U2VyaWVzCQkiZG9jdW1lbnRTZXJpZXMiCisjZGVmaW5lIE5JRF9kb2N1bWVudFNlcmllcwkJNDQ5CisjZGVmaW5lIE9CSl9kb2N1bWVudFNlcmllcwkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsOUwKKworI2RlZmluZSBTTl9Eb21haW4JCSJkb21haW4iCisjZGVmaW5lIExOX0RvbWFpbgkJIkRvbWFpbiIKKyNkZWZpbmUgTklEX0RvbWFpbgkJMzkyCisjZGVmaW5lIE9CSl9Eb21haW4JCU9CSl9waWxvdE9iamVjdENsYXNzLDEzTAorCisjZGVmaW5lIExOX3JGQzgyMmxvY2FsUGFydAkJInJGQzgyMmxvY2FsUGFydCIKKyNkZWZpbmUgTklEX3JGQzgyMmxvY2FsUGFydAkJNDUwCisjZGVmaW5lIE9CSl9yRkM4MjJsb2NhbFBhcnQJCU9CSl9waWxvdE9iamVjdENsYXNzLDE0TAorCisjZGVmaW5lIExOX2ROU0RvbWFpbgkJImROU0RvbWFpbiIKKyNkZWZpbmUgTklEX2ROU0RvbWFpbgkJNDUxCisjZGVmaW5lIE9CSl9kTlNEb21haW4JCU9CSl9waWxvdE9iamVjdENsYXNzLDE1TAorCisjZGVmaW5lIExOX2RvbWFpblJlbGF0ZWRPYmplY3QJCSJkb21haW5SZWxhdGVkT2JqZWN0IgorI2RlZmluZSBOSURfZG9tYWluUmVsYXRlZE9iamVjdAkJNDUyCisjZGVmaW5lIE9CSl9kb21haW5SZWxhdGVkT2JqZWN0CQlPQkpfcGlsb3RPYmplY3RDbGFzcywxN0wKKworI2RlZmluZSBMTl9mcmllbmRseUNvdW50cnkJCSJmcmllbmRseUNvdW50cnkiCisjZGVmaW5lIE5JRF9mcmllbmRseUNvdW50cnkJCTQ1MworI2RlZmluZSBPQkpfZnJpZW5kbHlDb3VudHJ5CQlPQkpfcGlsb3RPYmplY3RDbGFzcywxOEwKKworI2RlZmluZSBMTl9zaW1wbGVTZWN1cml0eU9iamVjdAkJInNpbXBsZVNlY3VyaXR5T2JqZWN0IgorI2RlZmluZSBOSURfc2ltcGxlU2VjdXJpdHlPYmplY3QJCTQ1NAorI2RlZmluZSBPQkpfc2ltcGxlU2VjdXJpdHlPYmplY3QJCU9CSl9waWxvdE9iamVjdENsYXNzLDE5TAorCisjZGVmaW5lIExOX3BpbG90T3JnYW5pemF0aW9uCQkicGlsb3RPcmdhbml6YXRpb24iCisjZGVmaW5lIE5JRF9waWxvdE9yZ2FuaXphdGlvbgkJNDU1CisjZGVmaW5lIE9CSl9waWxvdE9yZ2FuaXphdGlvbgkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsMjBMCisKKyNkZWZpbmUgTE5fcGlsb3REU0EJCSJwaWxvdERTQSIKKyNkZWZpbmUgTklEX3BpbG90RFNBCQk0NTYKKyNkZWZpbmUgT0JKX3BpbG90RFNBCQlPQkpfcGlsb3RPYmplY3RDbGFzcywyMUwKKworI2RlZmluZSBMTl9xdWFsaXR5TGFiZWxsZWREYXRhCQkicXVhbGl0eUxhYmVsbGVkRGF0YSIKKyNkZWZpbmUgTklEX3F1YWxpdHlMYWJlbGxlZERhdGEJCTQ1NworI2RlZmluZSBPQkpfcXVhbGl0eUxhYmVsbGVkRGF0YQkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsMjJMCisKKyNkZWZpbmUgU05fdXNlcklkCQkiVUlEIgorI2RlZmluZSBMTl91c2VySWQJCSJ1c2VySWQiCisjZGVmaW5lIE5JRF91c2VySWQJCTQ1OAorI2RlZmluZSBPQkpfdXNlcklkCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDFMCisKKyNkZWZpbmUgTE5fdGV4dEVuY29kZWRPUkFkZHJlc3MJCSJ0ZXh0RW5jb2RlZE9SQWRkcmVzcyIKKyNkZWZpbmUgTklEX3RleHRFbmNvZGVkT1JBZGRyZXNzCQk0NTkKKyNkZWZpbmUgT0JKX3RleHRFbmNvZGVkT1JBZGRyZXNzCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDJMCisKKyNkZWZpbmUgU05fcmZjODIyTWFpbGJveAkJIm1haWwiCisjZGVmaW5lIExOX3JmYzgyMk1haWxib3gJCSJyZmM4MjJNYWlsYm94IgorI2RlZmluZSBOSURfcmZjODIyTWFpbGJveAkJNDYwCisjZGVmaW5lIE9CSl9yZmM4MjJNYWlsYm94CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDNMCisKKyNkZWZpbmUgU05faW5mbwkJImluZm8iCisjZGVmaW5lIE5JRF9pbmZvCQk0NjEKKyNkZWZpbmUgT0JKX2luZm8JCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNEwKKworI2RlZmluZSBMTl9mYXZvdXJpdGVEcmluawkJImZhdm91cml0ZURyaW5rIgorI2RlZmluZSBOSURfZmF2b3VyaXRlRHJpbmsJCTQ2MgorI2RlZmluZSBPQkpfZmF2b3VyaXRlRHJpbmsJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNUwKKworI2RlZmluZSBMTl9yb29tTnVtYmVyCQkicm9vbU51bWJlciIKKyNkZWZpbmUgTklEX3Jvb21OdW1iZXIJCTQ2MworI2RlZmluZSBPQkpfcm9vbU51bWJlcgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw2TAorCisjZGVmaW5lIFNOX3Bob3RvCQkicGhvdG8iCisjZGVmaW5lIE5JRF9waG90bwkJNDY0CisjZGVmaW5lIE9CSl9waG90bwkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw3TAorCisjZGVmaW5lIExOX3VzZXJDbGFzcwkJInVzZXJDbGFzcyIKKyNkZWZpbmUgTklEX3VzZXJDbGFzcwkJNDY1CisjZGVmaW5lIE9CSl91c2VyQ2xhc3MJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsOEwKKworI2RlZmluZSBTTl9ob3N0CQkiaG9zdCIKKyNkZWZpbmUgTklEX2hvc3QJCTQ2NgorI2RlZmluZSBPQkpfaG9zdAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw5TAorCisjZGVmaW5lIFNOX21hbmFnZXIJCSJtYW5hZ2VyIgorI2RlZmluZSBOSURfbWFuYWdlcgkJNDY3CisjZGVmaW5lIE9CSl9tYW5hZ2VyCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDEwTAorCisjZGVmaW5lIExOX2RvY3VtZW50SWRlbnRpZmllcgkJImRvY3VtZW50SWRlbnRpZmllciIKKyNkZWZpbmUgTklEX2RvY3VtZW50SWRlbnRpZmllcgkJNDY4CisjZGVmaW5lIE9CSl9kb2N1bWVudElkZW50aWZpZXIJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTFMCisKKyNkZWZpbmUgTE5fZG9jdW1lbnRUaXRsZQkJImRvY3VtZW50VGl0bGUiCisjZGVmaW5lIE5JRF9kb2N1bWVudFRpdGxlCQk0NjkKKyNkZWZpbmUgT0JKX2RvY3VtZW50VGl0bGUJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTJMCisKKyNkZWZpbmUgTE5fZG9jdW1lbnRWZXJzaW9uCQkiZG9jdW1lbnRWZXJzaW9uIgorI2RlZmluZSBOSURfZG9jdW1lbnRWZXJzaW9uCQk0NzAKKyNkZWZpbmUgT0JKX2RvY3VtZW50VmVyc2lvbgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwxM0wKKworI2RlZmluZSBMTl9kb2N1bWVudEF1dGhvcgkJImRvY3VtZW50QXV0aG9yIgorI2RlZmluZSBOSURfZG9jdW1lbnRBdXRob3IJCTQ3MQorI2RlZmluZSBPQkpfZG9jdW1lbnRBdXRob3IJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTRMCisKKyNkZWZpbmUgTE5fZG9jdW1lbnRMb2NhdGlvbgkJImRvY3VtZW50TG9jYXRpb24iCisjZGVmaW5lIE5JRF9kb2N1bWVudExvY2F0aW9uCQk0NzIKKyNkZWZpbmUgT0JKX2RvY3VtZW50TG9jYXRpb24JCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTVMCisKKyNkZWZpbmUgTE5faG9tZVRlbGVwaG9uZU51bWJlcgkJImhvbWVUZWxlcGhvbmVOdW1iZXIiCisjZGVmaW5lIE5JRF9ob21lVGVsZXBob25lTnVtYmVyCQk0NzMKKyNkZWZpbmUgT0JKX2hvbWVUZWxlcGhvbmVOdW1iZXIJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjBMCisKKyNkZWZpbmUgU05fc2VjcmV0YXJ5CQkic2VjcmV0YXJ5IgorI2RlZmluZSBOSURfc2VjcmV0YXJ5CQk0NzQKKyNkZWZpbmUgT0JKX3NlY3JldGFyeQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyMUwKKworI2RlZmluZSBMTl9vdGhlck1haWxib3gJCSJvdGhlck1haWxib3giCisjZGVmaW5lIE5JRF9vdGhlck1haWxib3gJCTQ3NQorI2RlZmluZSBPQkpfb3RoZXJNYWlsYm94CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDIyTAorCisjZGVmaW5lIExOX2xhc3RNb2RpZmllZFRpbWUJCSJsYXN0TW9kaWZpZWRUaW1lIgorI2RlZmluZSBOSURfbGFzdE1vZGlmaWVkVGltZQkJNDc2CisjZGVmaW5lIE9CSl9sYXN0TW9kaWZpZWRUaW1lCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDIzTAorCisjZGVmaW5lIExOX2xhc3RNb2RpZmllZEJ5CQkibGFzdE1vZGlmaWVkQnkiCisjZGVmaW5lIE5JRF9sYXN0TW9kaWZpZWRCeQkJNDc3CisjZGVmaW5lIE9CSl9sYXN0TW9kaWZpZWRCeQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyNEwKKworI2RlZmluZSBTTl9kb21haW5Db21wb25lbnQJCSJEQyIKKyNkZWZpbmUgTE5fZG9tYWluQ29tcG9uZW50CQkiZG9tYWluQ29tcG9uZW50IgorI2RlZmluZSBOSURfZG9tYWluQ29tcG9uZW50CQkzOTEKKyNkZWZpbmUgT0JKX2RvbWFpbkNvbXBvbmVudAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyNUwKKworI2RlZmluZSBMTl9hUmVjb3JkCQkiYVJlY29yZCIKKyNkZWZpbmUgTklEX2FSZWNvcmQJCTQ3OAorI2RlZmluZSBPQkpfYVJlY29yZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyNkwKKworI2RlZmluZSBMTl9waWxvdEF0dHJpYnV0ZVR5cGUyNwkJInBpbG90QXR0cmlidXRlVHlwZTI3IgorI2RlZmluZSBOSURfcGlsb3RBdHRyaWJ1dGVUeXBlMjcJCTQ3OQorI2RlZmluZSBPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlMjcJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjdMCisKKyNkZWZpbmUgTE5fbVhSZWNvcmQJCSJtWFJlY29yZCIKKyNkZWZpbmUgTklEX21YUmVjb3JkCQk0ODAKKyNkZWZpbmUgT0JKX21YUmVjb3JkCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDI4TAorCisjZGVmaW5lIExOX25TUmVjb3JkCQkiblNSZWNvcmQiCisjZGVmaW5lIE5JRF9uU1JlY29yZAkJNDgxCisjZGVmaW5lIE9CSl9uU1JlY29yZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyOUwKKworI2RlZmluZSBMTl9zT0FSZWNvcmQJCSJzT0FSZWNvcmQiCisjZGVmaW5lIE5JRF9zT0FSZWNvcmQJCTQ4MgorI2RlZmluZSBPQkpfc09BUmVjb3JkCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDMwTAorCisjZGVmaW5lIExOX2NOQU1FUmVjb3JkCQkiY05BTUVSZWNvcmQiCisjZGVmaW5lIE5JRF9jTkFNRVJlY29yZAkJNDgzCisjZGVmaW5lIE9CSl9jTkFNRVJlY29yZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwzMUwKKworI2RlZmluZSBMTl9hc3NvY2lhdGVkRG9tYWluCQkiYXNzb2NpYXRlZERvbWFpbiIKKyNkZWZpbmUgTklEX2Fzc29jaWF0ZWREb21haW4JCTQ4NAorI2RlZmluZSBPQkpfYXNzb2NpYXRlZERvbWFpbgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwzN0wKKworI2RlZmluZSBMTl9hc3NvY2lhdGVkTmFtZQkJImFzc29jaWF0ZWROYW1lIgorI2RlZmluZSBOSURfYXNzb2NpYXRlZE5hbWUJCTQ4NQorI2RlZmluZSBPQkpfYXNzb2NpYXRlZE5hbWUJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMzhMCisKKyNkZWZpbmUgTE5faG9tZVBvc3RhbEFkZHJlc3MJCSJob21lUG9zdGFsQWRkcmVzcyIKKyNkZWZpbmUgTklEX2hvbWVQb3N0YWxBZGRyZXNzCQk0ODYKKyNkZWZpbmUgT0JKX2hvbWVQb3N0YWxBZGRyZXNzCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDM5TAorCisjZGVmaW5lIExOX3BlcnNvbmFsVGl0bGUJCSJwZXJzb25hbFRpdGxlIgorI2RlZmluZSBOSURfcGVyc29uYWxUaXRsZQkJNDg3CisjZGVmaW5lIE9CSl9wZXJzb25hbFRpdGxlCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQwTAorCisjZGVmaW5lIExOX21vYmlsZVRlbGVwaG9uZU51bWJlcgkJIm1vYmlsZVRlbGVwaG9uZU51bWJlciIKKyNkZWZpbmUgTklEX21vYmlsZVRlbGVwaG9uZU51bWJlcgkJNDg4CisjZGVmaW5lIE9CSl9tb2JpbGVUZWxlcGhvbmVOdW1iZXIJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNDFMCisKKyNkZWZpbmUgTE5fcGFnZXJUZWxlcGhvbmVOdW1iZXIJCSJwYWdlclRlbGVwaG9uZU51bWJlciIKKyNkZWZpbmUgTklEX3BhZ2VyVGVsZXBob25lTnVtYmVyCQk0ODkKKyNkZWZpbmUgT0JKX3BhZ2VyVGVsZXBob25lTnVtYmVyCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQyTAorCisjZGVmaW5lIExOX2ZyaWVuZGx5Q291bnRyeU5hbWUJCSJmcmllbmRseUNvdW50cnlOYW1lIgorI2RlZmluZSBOSURfZnJpZW5kbHlDb3VudHJ5TmFtZQkJNDkwCisjZGVmaW5lIE9CSl9mcmllbmRseUNvdW50cnlOYW1lCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQzTAorCisjZGVmaW5lIExOX29yZ2FuaXphdGlvbmFsU3RhdHVzCQkib3JnYW5pemF0aW9uYWxTdGF0dXMiCisjZGVmaW5lIE5JRF9vcmdhbml6YXRpb25hbFN0YXR1cwkJNDkxCisjZGVmaW5lIE9CSl9vcmdhbml6YXRpb25hbFN0YXR1cwkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0NUwKKworI2RlZmluZSBMTl9qYW5ldE1haWxib3gJCSJqYW5ldE1haWxib3giCisjZGVmaW5lIE5JRF9qYW5ldE1haWxib3gJCTQ5MgorI2RlZmluZSBPQkpfamFuZXRNYWlsYm94CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQ2TAorCisjZGVmaW5lIExOX21haWxQcmVmZXJlbmNlT3B0aW9uCQkibWFpbFByZWZlcmVuY2VPcHRpb24iCisjZGVmaW5lIE5JRF9tYWlsUHJlZmVyZW5jZU9wdGlvbgkJNDkzCisjZGVmaW5lIE9CSl9tYWlsUHJlZmVyZW5jZU9wdGlvbgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0N0wKKworI2RlZmluZSBMTl9idWlsZGluZ05hbWUJCSJidWlsZGluZ05hbWUiCisjZGVmaW5lIE5JRF9idWlsZGluZ05hbWUJCTQ5NAorI2RlZmluZSBPQkpfYnVpbGRpbmdOYW1lCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQ4TAorCisjZGVmaW5lIExOX2RTQVF1YWxpdHkJCSJkU0FRdWFsaXR5IgorI2RlZmluZSBOSURfZFNBUXVhbGl0eQkJNDk1CisjZGVmaW5lIE9CSl9kU0FRdWFsaXR5CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQ5TAorCisjZGVmaW5lIExOX3NpbmdsZUxldmVsUXVhbGl0eQkJInNpbmdsZUxldmVsUXVhbGl0eSIKKyNkZWZpbmUgTklEX3NpbmdsZUxldmVsUXVhbGl0eQkJNDk2CisjZGVmaW5lIE9CSl9zaW5nbGVMZXZlbFF1YWxpdHkJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNTBMCisKKyNkZWZpbmUgTE5fc3VidHJlZU1pbmltdW1RdWFsaXR5CQkic3VidHJlZU1pbmltdW1RdWFsaXR5IgorI2RlZmluZSBOSURfc3VidHJlZU1pbmltdW1RdWFsaXR5CQk0OTcKKyNkZWZpbmUgT0JKX3N1YnRyZWVNaW5pbXVtUXVhbGl0eQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw1MUwKKworI2RlZmluZSBMTl9zdWJ0cmVlTWF4aW11bVF1YWxpdHkJCSJzdWJ0cmVlTWF4aW11bVF1YWxpdHkiCisjZGVmaW5lIE5JRF9zdWJ0cmVlTWF4aW11bVF1YWxpdHkJCTQ5OAorI2RlZmluZSBPQkpfc3VidHJlZU1heGltdW1RdWFsaXR5CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDUyTAorCisjZGVmaW5lIExOX3BlcnNvbmFsU2lnbmF0dXJlCQkicGVyc29uYWxTaWduYXR1cmUiCisjZGVmaW5lIE5JRF9wZXJzb25hbFNpZ25hdHVyZQkJNDk5CisjZGVmaW5lIE9CSl9wZXJzb25hbFNpZ25hdHVyZQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw1M0wKKworI2RlZmluZSBMTl9kSVRSZWRpcmVjdAkJImRJVFJlZGlyZWN0IgorI2RlZmluZSBOSURfZElUUmVkaXJlY3QJCTUwMAorI2RlZmluZSBPQkpfZElUUmVkaXJlY3QJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNTRMCisKKyNkZWZpbmUgU05fYXVkaW8JCSJhdWRpbyIKKyNkZWZpbmUgTklEX2F1ZGlvCQk1MDEKKyNkZWZpbmUgT0JKX2F1ZGlvCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDU1TAorCisjZGVmaW5lIExOX2RvY3VtZW50UHVibGlzaGVyCQkiZG9jdW1lbnRQdWJsaXNoZXIiCisjZGVmaW5lIE5JRF9kb2N1bWVudFB1Ymxpc2hlcgkJNTAyCisjZGVmaW5lIE9CSl9kb2N1bWVudFB1Ymxpc2hlcgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw1NkwKKworI2RlZmluZSBTTl9pZF9zZXQJCSJpZC1zZXQiCisjZGVmaW5lIExOX2lkX3NldAkJIlNlY3VyZSBFbGVjdHJvbmljIFRyYW5zYWN0aW9ucyIKKyNkZWZpbmUgTklEX2lkX3NldAkJNTEyCisjZGVmaW5lIE9CSl9pZF9zZXQJCU9CSl9pbnRlcm5hdGlvbmFsX29yZ2FuaXphdGlvbnMsNDJMCisKKyNkZWZpbmUgU05fc2V0X2N0eXBlCQkic2V0LWN0eXBlIgorI2RlZmluZSBMTl9zZXRfY3R5cGUJCSJjb250ZW50IHR5cGVzIgorI2RlZmluZSBOSURfc2V0X2N0eXBlCQk1MTMKKyNkZWZpbmUgT0JKX3NldF9jdHlwZQkJT0JKX2lkX3NldCwwTAorCisjZGVmaW5lIFNOX3NldF9tc2dFeHQJCSJzZXQtbXNnRXh0IgorI2RlZmluZSBMTl9zZXRfbXNnRXh0CQkibWVzc2FnZSBleHRlbnNpb25zIgorI2RlZmluZSBOSURfc2V0X21zZ0V4dAkJNTE0CisjZGVmaW5lIE9CSl9zZXRfbXNnRXh0CQlPQkpfaWRfc2V0LDFMCisKKyNkZWZpbmUgU05fc2V0X2F0dHIJCSJzZXQtYXR0ciIKKyNkZWZpbmUgTklEX3NldF9hdHRyCQk1MTUKKyNkZWZpbmUgT0JKX3NldF9hdHRyCQlPQkpfaWRfc2V0LDNMCisKKyNkZWZpbmUgU05fc2V0X3BvbGljeQkJInNldC1wb2xpY3kiCisjZGVmaW5lIE5JRF9zZXRfcG9saWN5CQk1MTYKKyNkZWZpbmUgT0JKX3NldF9wb2xpY3kJCU9CSl9pZF9zZXQsNUwKKworI2RlZmluZSBTTl9zZXRfY2VydEV4dAkJInNldC1jZXJ0RXh0IgorI2RlZmluZSBMTl9zZXRfY2VydEV4dAkJImNlcnRpZmljYXRlIGV4dGVuc2lvbnMiCisjZGVmaW5lIE5JRF9zZXRfY2VydEV4dAkJNTE3CisjZGVmaW5lIE9CSl9zZXRfY2VydEV4dAkJT0JKX2lkX3NldCw3TAorCisjZGVmaW5lIFNOX3NldF9icmFuZAkJInNldC1icmFuZCIKKyNkZWZpbmUgTklEX3NldF9icmFuZAkJNTE4CisjZGVmaW5lIE9CSl9zZXRfYnJhbmQJCU9CSl9pZF9zZXQsOEwKKworI2RlZmluZSBTTl9zZXRjdF9QQU5EYXRhCQkic2V0Y3QtUEFORGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BBTkRhdGEJCTUxOQorI2RlZmluZSBPQkpfc2V0Y3RfUEFORGF0YQkJT0JKX3NldF9jdHlwZSwwTAorCisjZGVmaW5lIFNOX3NldGN0X1BBTlRva2VuCQkic2V0Y3QtUEFOVG9rZW4iCisjZGVmaW5lIE5JRF9zZXRjdF9QQU5Ub2tlbgkJNTIwCisjZGVmaW5lIE9CSl9zZXRjdF9QQU5Ub2tlbgkJT0JKX3NldF9jdHlwZSwxTAorCisjZGVmaW5lIFNOX3NldGN0X1BBTk9ubHkJCSJzZXRjdC1QQU5Pbmx5IgorI2RlZmluZSBOSURfc2V0Y3RfUEFOT25seQkJNTIxCisjZGVmaW5lIE9CSl9zZXRjdF9QQU5Pbmx5CQlPQkpfc2V0X2N0eXBlLDJMCisKKyNkZWZpbmUgU05fc2V0Y3RfT0lEYXRhCQkic2V0Y3QtT0lEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfT0lEYXRhCQk1MjIKKyNkZWZpbmUgT0JKX3NldGN0X09JRGF0YQkJT0JKX3NldF9jdHlwZSwzTAorCisjZGVmaW5lIFNOX3NldGN0X1BJCQkic2V0Y3QtUEkiCisjZGVmaW5lIE5JRF9zZXRjdF9QSQkJNTIzCisjZGVmaW5lIE9CSl9zZXRjdF9QSQkJT0JKX3NldF9jdHlwZSw0TAorCisjZGVmaW5lIFNOX3NldGN0X1BJRGF0YQkJInNldGN0LVBJRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BJRGF0YQkJNTI0CisjZGVmaW5lIE9CSl9zZXRjdF9QSURhdGEJCU9CSl9zZXRfY3R5cGUsNUwKKworI2RlZmluZSBTTl9zZXRjdF9QSURhdGFVbnNpZ25lZAkJInNldGN0LVBJRGF0YVVuc2lnbmVkIgorI2RlZmluZSBOSURfc2V0Y3RfUElEYXRhVW5zaWduZWQJCTUyNQorI2RlZmluZSBPQkpfc2V0Y3RfUElEYXRhVW5zaWduZWQJCU9CSl9zZXRfY3R5cGUsNkwKKworI2RlZmluZSBTTl9zZXRjdF9IT0RJbnB1dAkJInNldGN0LUhPRElucHV0IgorI2RlZmluZSBOSURfc2V0Y3RfSE9ESW5wdXQJCTUyNgorI2RlZmluZSBPQkpfc2V0Y3RfSE9ESW5wdXQJCU9CSl9zZXRfY3R5cGUsN0wKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmVzQmFnZ2FnZQkJInNldGN0LUF1dGhSZXNCYWdnYWdlIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJlc0JhZ2dhZ2UJCTUyNworI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJlc0JhZ2dhZ2UJCU9CSl9zZXRfY3R5cGUsOEwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVxQmFnZ2FnZQkJInNldGN0LUF1dGhSZXZSZXFCYWdnYWdlIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlcUJhZ2dhZ2UJCTUyOAorI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlcUJhZ2dhZ2UJCU9CSl9zZXRfY3R5cGUsOUwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVzQmFnZ2FnZQkJInNldGN0LUF1dGhSZXZSZXNCYWdnYWdlIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlc0JhZ2dhZ2UJCTUyOQorI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlc0JhZ2dhZ2UJCU9CSl9zZXRfY3R5cGUsMTBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwVG9rZW5TZXEJCSJzZXRjdC1DYXBUb2tlblNlcSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFRva2VuU2VxCQk1MzAKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFRva2VuU2VxCQlPQkpfc2V0X2N0eXBlLDExTAorCisjZGVmaW5lIFNOX3NldGN0X1BJbml0UmVzRGF0YQkJInNldGN0LVBJbml0UmVzRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BJbml0UmVzRGF0YQkJNTMxCisjZGVmaW5lIE9CSl9zZXRjdF9QSW5pdFJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsMTJMCisKKyNkZWZpbmUgU05fc2V0Y3RfUElfVEJTCQkic2V0Y3QtUEktVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfUElfVEJTCQk1MzIKKyNkZWZpbmUgT0JKX3NldGN0X1BJX1RCUwkJT0JKX3NldF9jdHlwZSwxM0wKKworI2RlZmluZSBTTl9zZXRjdF9QUmVzRGF0YQkJInNldGN0LVBSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfUFJlc0RhdGEJCTUzMworI2RlZmluZSBPQkpfc2V0Y3RfUFJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsMTRMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlcVRCUwkJInNldGN0LUF1dGhSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVxVEJTCQk1MzQKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXFUQlMJCU9CSl9zZXRfY3R5cGUsMTZMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc1RCUwkJInNldGN0LUF1dGhSZXNUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVzVEJTCQk1MzUKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNUQlMJCU9CSl9zZXRfY3R5cGUsMTdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc1RCU1gJCSJzZXRjdC1BdXRoUmVzVEJTWCIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXNUQlNYCQk1MzYKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNUQlNYCQlPQkpfc2V0X2N0eXBlLDE4TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhUb2tlblRCUwkJInNldGN0LUF1dGhUb2tlblRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhUb2tlblRCUwkJNTM3CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoVG9rZW5UQlMJCU9CSl9zZXRfY3R5cGUsMTlMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwVG9rZW5EYXRhCQkic2V0Y3QtQ2FwVG9rZW5EYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwVG9rZW5EYXRhCQk1MzgKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFRva2VuRGF0YQkJT0JKX3NldF9jdHlwZSwyMEwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBUb2tlblRCUwkJInNldGN0LUNhcFRva2VuVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwVG9rZW5UQlMJCTUzOQorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwVG9rZW5UQlMJCU9CSl9zZXRfY3R5cGUsMjFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQWNxQ2FyZENvZGVNc2cJCSJzZXRjdC1BY3FDYXJkQ29kZU1zZyIKKyNkZWZpbmUgTklEX3NldGN0X0FjcUNhcmRDb2RlTXNnCQk1NDAKKyNkZWZpbmUgT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnCQlPQkpfc2V0X2N0eXBlLDIyTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXFUQlMJCSJzZXRjdC1BdXRoUmV2UmVxVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlcVRCUwkJNTQxCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVxVEJTCQlPQkpfc2V0X2N0eXBlLDIzTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXNEYXRhCQkic2V0Y3QtQXV0aFJldlJlc0RhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmV2UmVzRGF0YQkJNTQyCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVzRGF0YQkJT0JKX3NldF9jdHlwZSwyNEwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVzVEJTCQkic2V0Y3QtQXV0aFJldlJlc1RCUyIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXZSZXNUQlMJCTU0MworI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCUwkJT0JKX3NldF9jdHlwZSwyNUwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXFUQlMJCSJzZXRjdC1DYXBSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXFUQlMJCTU0NAorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmVxVEJTCQlPQkpfc2V0X2N0eXBlLDI2TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJlcVRCU1gJCSJzZXRjdC1DYXBSZXFUQlNYIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmVxVEJTWAkJNTQ1CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXFUQlNYCQlPQkpfc2V0X2N0eXBlLDI3TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJlc0RhdGEJCSJzZXRjdC1DYXBSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmVzRGF0YQkJNTQ2CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDI4TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJldlJlcVRCUwkJInNldGN0LUNhcFJldlJlcVRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJldlJlcVRCUwkJNTQ3CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXZSZXFUQlMJCU9CSl9zZXRfY3R5cGUsMjlMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmV2UmVxVEJTWAkJInNldGN0LUNhcFJldlJlcVRCU1giCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXZSZXFUQlNYCQk1NDgKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJldlJlcVRCU1gJCU9CSl9zZXRfY3R5cGUsMzBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmV2UmVzRGF0YQkJInNldGN0LUNhcFJldlJlc0RhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXZSZXNEYXRhCQk1NDkKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJldlJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsMzFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJlcVRCUwkJInNldGN0LUNyZWRSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmVxVEJTCQk1NTAKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXFUQlMJCU9CSl9zZXRfY3R5cGUsMzJMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJlcVRCU1gJCSJzZXRjdC1DcmVkUmVxVEJTWCIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXFUQlNYCQk1NTEKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXFUQlNYCQlPQkpfc2V0X2N0eXBlLDMzTAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXNEYXRhCQkic2V0Y3QtQ3JlZFJlc0RhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmVzRGF0YQkJNTUyCisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmVzRGF0YQkJT0JKX3NldF9jdHlwZSwzNEwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmV2UmVxVEJTCQkic2V0Y3QtQ3JlZFJldlJlcVRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXZSZXFUQlMJCTU1MworI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCUwkJT0JKX3NldF9jdHlwZSwzNUwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmV2UmVxVEJTWAkJInNldGN0LUNyZWRSZXZSZXFUQlNYIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJldlJlcVRCU1gJCTU1NAorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCU1gJCU9CSl9zZXRfY3R5cGUsMzZMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJldlJlc0RhdGEJCSJzZXRjdC1DcmVkUmV2UmVzRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXZSZXNEYXRhCQk1NTUKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXZSZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDM3TAorCisjZGVmaW5lIFNOX3NldGN0X1BDZXJ0UmVxRGF0YQkJInNldGN0LVBDZXJ0UmVxRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BDZXJ0UmVxRGF0YQkJNTU2CisjZGVmaW5lIE9CSl9zZXRjdF9QQ2VydFJlcURhdGEJCU9CSl9zZXRfY3R5cGUsMzhMCisKKyNkZWZpbmUgU05fc2V0Y3RfUENlcnRSZXNUQlMJCSJzZXRjdC1QQ2VydFJlc1RCUyIKKyNkZWZpbmUgTklEX3NldGN0X1BDZXJ0UmVzVEJTCQk1NTcKKyNkZWZpbmUgT0JKX3NldGN0X1BDZXJ0UmVzVEJTCQlPQkpfc2V0X2N0eXBlLDM5TAorCisjZGVmaW5lIFNOX3NldGN0X0JhdGNoQWRtaW5SZXFEYXRhCQkic2V0Y3QtQmF0Y2hBZG1pblJlcURhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YQkJNTU4CisjZGVmaW5lIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YQkJT0JKX3NldF9jdHlwZSw0MEwKKworI2RlZmluZSBTTl9zZXRjdF9CYXRjaEFkbWluUmVzRGF0YQkJInNldGN0LUJhdGNoQWRtaW5SZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQmF0Y2hBZG1pblJlc0RhdGEJCTU1OQorI2RlZmluZSBPQkpfc2V0Y3RfQmF0Y2hBZG1pblJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsNDFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FyZENJbml0UmVzVEJTCQkic2V0Y3QtQ2FyZENJbml0UmVzVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FyZENJbml0UmVzVEJTCQk1NjAKKyNkZWZpbmUgT0JKX3NldGN0X0NhcmRDSW5pdFJlc1RCUwkJT0JKX3NldF9jdHlwZSw0MkwKKworI2RlZmluZSBTTl9zZXRjdF9NZUFxQ0luaXRSZXNUQlMJCSJzZXRjdC1NZUFxQ0luaXRSZXNUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9NZUFxQ0luaXRSZXNUQlMJCTU2MQorI2RlZmluZSBPQkpfc2V0Y3RfTWVBcUNJbml0UmVzVEJTCQlPQkpfc2V0X2N0eXBlLDQzTAorCisjZGVmaW5lIFNOX3NldGN0X1JlZ0Zvcm1SZXNUQlMJCSJzZXRjdC1SZWdGb3JtUmVzVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfUmVnRm9ybVJlc1RCUwkJNTYyCisjZGVmaW5lIE9CSl9zZXRjdF9SZWdGb3JtUmVzVEJTCQlPQkpfc2V0X2N0eXBlLDQ0TAorCisjZGVmaW5lIFNOX3NldGN0X0NlcnRSZXFEYXRhCQkic2V0Y3QtQ2VydFJlcURhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9DZXJ0UmVxRGF0YQkJNTYzCisjZGVmaW5lIE9CSl9zZXRjdF9DZXJ0UmVxRGF0YQkJT0JKX3NldF9jdHlwZSw0NUwKKworI2RlZmluZSBTTl9zZXRjdF9DZXJ0UmVxVEJTCQkic2V0Y3QtQ2VydFJlcVRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NlcnRSZXFUQlMJCTU2NAorI2RlZmluZSBPQkpfc2V0Y3RfQ2VydFJlcVRCUwkJT0JKX3NldF9jdHlwZSw0NkwKKworI2RlZmluZSBTTl9zZXRjdF9DZXJ0UmVzRGF0YQkJInNldGN0LUNlcnRSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ2VydFJlc0RhdGEJCTU2NQorI2RlZmluZSBPQkpfc2V0Y3RfQ2VydFJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsNDdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2VydElucVJlcVRCUwkJInNldGN0LUNlcnRJbnFSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DZXJ0SW5xUmVxVEJTCQk1NjYKKyNkZWZpbmUgT0JKX3NldGN0X0NlcnRJbnFSZXFUQlMJCU9CSl9zZXRfY3R5cGUsNDhMCisKKyNkZWZpbmUgU05fc2V0Y3RfRXJyb3JUQlMJCSJzZXRjdC1FcnJvclRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0Vycm9yVEJTCQk1NjcKKyNkZWZpbmUgT0JKX3NldGN0X0Vycm9yVEJTCQlPQkpfc2V0X2N0eXBlLDQ5TAorCisjZGVmaW5lIFNOX3NldGN0X1BJRHVhbFNpZ25lZFRCRQkJInNldGN0LVBJRHVhbFNpZ25lZFRCRSIKKyNkZWZpbmUgTklEX3NldGN0X1BJRHVhbFNpZ25lZFRCRQkJNTY4CisjZGVmaW5lIE9CSl9zZXRjdF9QSUR1YWxTaWduZWRUQkUJCU9CSl9zZXRfY3R5cGUsNTBMCisKKyNkZWZpbmUgU05fc2V0Y3RfUElVbnNpZ25lZFRCRQkJInNldGN0LVBJVW5zaWduZWRUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9QSVVuc2lnbmVkVEJFCQk1NjkKKyNkZWZpbmUgT0JKX3NldGN0X1BJVW5zaWduZWRUQkUJCU9CSl9zZXRfY3R5cGUsNTFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlcVRCRQkJInNldGN0LUF1dGhSZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVxVEJFCQk1NzAKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXFUQkUJCU9CSl9zZXRfY3R5cGUsNTJMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc1RCRQkJInNldGN0LUF1dGhSZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVzVEJFCQk1NzEKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNUQkUJCU9CSl9zZXRfY3R5cGUsNTNMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc1RCRVgJCSJzZXRjdC1BdXRoUmVzVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXNUQkVYCQk1NzIKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNUQkVYCQlPQkpfc2V0X2N0eXBlLDU0TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhUb2tlblRCRQkJInNldGN0LUF1dGhUb2tlblRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhUb2tlblRCRQkJNTczCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoVG9rZW5UQkUJCU9CSl9zZXRfY3R5cGUsNTVMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwVG9rZW5UQkUJCSJzZXRjdC1DYXBUb2tlblRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFRva2VuVEJFCQk1NzQKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFRva2VuVEJFCQlPQkpfc2V0X2N0eXBlLDU2TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFRva2VuVEJFWAkJInNldGN0LUNhcFRva2VuVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFRva2VuVEJFWAkJNTc1CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBUb2tlblRCRVgJCU9CSl9zZXRfY3R5cGUsNTdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQWNxQ2FyZENvZGVNc2dUQkUJCSJzZXRjdC1BY3FDYXJkQ29kZU1zZ1RCRSIKKyNkZWZpbmUgTklEX3NldGN0X0FjcUNhcmRDb2RlTXNnVEJFCQk1NzYKKyNkZWZpbmUgT0JKX3NldGN0X0FjcUNhcmRDb2RlTXNnVEJFCQlPQkpfc2V0X2N0eXBlLDU4TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXFUQkUJCSJzZXRjdC1BdXRoUmV2UmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlcVRCRQkJNTc3CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVxVEJFCQlPQkpfc2V0X2N0eXBlLDU5TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXNUQkUJCSJzZXRjdC1BdXRoUmV2UmVzVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlc1RCRQkJNTc4CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVzVEJFCQlPQkpfc2V0X2N0eXBlLDYwTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXZSZXNUQkVCCQkic2V0Y3QtQXV0aFJldlJlc1RCRUIiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmV2UmVzVEJFQgkJNTc5CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmV2UmVzVEJFQgkJT0JKX3NldF9jdHlwZSw2MUwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXFUQkUJCSJzZXRjdC1DYXBSZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXFUQkUJCTU4MAorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmVxVEJFCQlPQkpfc2V0X2N0eXBlLDYyTAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJlcVRCRVgJCSJzZXRjdC1DYXBSZXFUQkVYIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmVxVEJFWAkJNTgxCisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXFUQkVYCQlPQkpfc2V0X2N0eXBlLDYzTAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJlc1RCRQkJInNldGN0LUNhcFJlc1RCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJlc1RCRQkJNTgyCisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXNUQkUJCU9CSl9zZXRfY3R5cGUsNjRMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmV2UmVxVEJFCQkic2V0Y3QtQ2FwUmV2UmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmV2UmVxVEJFCQk1ODMKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJldlJlcVRCRQkJT0JKX3NldF9jdHlwZSw2NUwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXZSZXFUQkVYCQkic2V0Y3QtQ2FwUmV2UmVxVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJldlJlcVRCRVgJCTU4NAorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmV2UmVxVEJFWAkJT0JKX3NldF9jdHlwZSw2NkwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXZSZXNUQkUJCSJzZXRjdC1DYXBSZXZSZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXZSZXNUQkUJCTU4NQorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmV2UmVzVEJFCQlPQkpfc2V0X2N0eXBlLDY3TAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXFUQkUJCSJzZXRjdC1DcmVkUmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJlcVRCRQkJNTg2CisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmVxVEJFCQlPQkpfc2V0X2N0eXBlLDY4TAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXFUQkVYCQkic2V0Y3QtQ3JlZFJlcVRCRVgiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmVxVEJFWAkJNTg3CisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmVxVEJFWAkJT0JKX3NldF9jdHlwZSw2OUwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmVzVEJFCQkic2V0Y3QtQ3JlZFJlc1RCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXNUQkUJCTU4OAorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJlc1RCRQkJT0JKX3NldF9jdHlwZSw3MEwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmV2UmVxVEJFCQkic2V0Y3QtQ3JlZFJldlJlcVRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXZSZXFUQkUJCTU4OQorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCRQkJT0JKX3NldF9jdHlwZSw3MUwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmV2UmVxVEJFWAkJInNldGN0LUNyZWRSZXZSZXFUQkVYIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJldlJlcVRCRVgJCTU5MAorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJldlJlcVRCRVgJCU9CSl9zZXRfY3R5cGUsNzJMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJldlJlc1RCRQkJInNldGN0LUNyZWRSZXZSZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmV2UmVzVEJFCQk1OTEKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXZSZXNUQkUJCU9CSl9zZXRfY3R5cGUsNzNMCisKKyNkZWZpbmUgU05fc2V0Y3RfQmF0Y2hBZG1pblJlcVRCRQkJInNldGN0LUJhdGNoQWRtaW5SZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9CYXRjaEFkbWluUmVxVEJFCQk1OTIKKyNkZWZpbmUgT0JKX3NldGN0X0JhdGNoQWRtaW5SZXFUQkUJCU9CSl9zZXRfY3R5cGUsNzRMCisKKyNkZWZpbmUgU05fc2V0Y3RfQmF0Y2hBZG1pblJlc1RCRQkJInNldGN0LUJhdGNoQWRtaW5SZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9CYXRjaEFkbWluUmVzVEJFCQk1OTMKKyNkZWZpbmUgT0JKX3NldGN0X0JhdGNoQWRtaW5SZXNUQkUJCU9CSl9zZXRfY3R5cGUsNzVMCisKKyNkZWZpbmUgU05fc2V0Y3RfUmVnRm9ybVJlcVRCRQkJInNldGN0LVJlZ0Zvcm1SZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9SZWdGb3JtUmVxVEJFCQk1OTQKKyNkZWZpbmUgT0JKX3NldGN0X1JlZ0Zvcm1SZXFUQkUJCU9CSl9zZXRfY3R5cGUsNzZMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2VydFJlcVRCRQkJInNldGN0LUNlcnRSZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DZXJ0UmVxVEJFCQk1OTUKKyNkZWZpbmUgT0JKX3NldGN0X0NlcnRSZXFUQkUJCU9CSl9zZXRfY3R5cGUsNzdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2VydFJlcVRCRVgJCSJzZXRjdC1DZXJ0UmVxVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0NlcnRSZXFUQkVYCQk1OTYKKyNkZWZpbmUgT0JKX3NldGN0X0NlcnRSZXFUQkVYCQlPQkpfc2V0X2N0eXBlLDc4TAorCisjZGVmaW5lIFNOX3NldGN0X0NlcnRSZXNUQkUJCSJzZXRjdC1DZXJ0UmVzVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ2VydFJlc1RCRQkJNTk3CisjZGVmaW5lIE9CSl9zZXRjdF9DZXJ0UmVzVEJFCQlPQkpfc2V0X2N0eXBlLDc5TAorCisjZGVmaW5lIFNOX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUwkJInNldGN0LUNSTE5vdGlmaWNhdGlvblRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NSTE5vdGlmaWNhdGlvblRCUwkJNTk4CisjZGVmaW5lIE9CSl9zZXRjdF9DUkxOb3RpZmljYXRpb25UQlMJCU9CSl9zZXRfY3R5cGUsODBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ1JMTm90aWZpY2F0aW9uUmVzVEJTCQkic2V0Y3QtQ1JMTm90aWZpY2F0aW9uUmVzVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ1JMTm90aWZpY2F0aW9uUmVzVEJTCQk1OTkKKyNkZWZpbmUgT0JKX3NldGN0X0NSTE5vdGlmaWNhdGlvblJlc1RCUwkJT0JKX3NldF9jdHlwZSw4MUwKKworI2RlZmluZSBTTl9zZXRjdF9CQ0lEaXN0cmlidXRpb25UQlMJCSJzZXRjdC1CQ0lEaXN0cmlidXRpb25UQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9CQ0lEaXN0cmlidXRpb25UQlMJCTYwMAorI2RlZmluZSBPQkpfc2V0Y3RfQkNJRGlzdHJpYnV0aW9uVEJTCQlPQkpfc2V0X2N0eXBlLDgyTAorCisjZGVmaW5lIFNOX3NldGV4dF9nZW5DcnlwdAkJInNldGV4dC1nZW5DcnlwdCIKKyNkZWZpbmUgTE5fc2V0ZXh0X2dlbkNyeXB0CQkiZ2VuZXJpYyBjcnlwdG9ncmFtIgorI2RlZmluZSBOSURfc2V0ZXh0X2dlbkNyeXB0CQk2MDEKKyNkZWZpbmUgT0JKX3NldGV4dF9nZW5DcnlwdAkJT0JKX3NldF9tc2dFeHQsMUwKKworI2RlZmluZSBTTl9zZXRleHRfbWlBdXRoCQkic2V0ZXh0LW1pQXV0aCIKKyNkZWZpbmUgTE5fc2V0ZXh0X21pQXV0aAkJIm1lcmNoYW50IGluaXRpYXRlZCBhdXRoIgorI2RlZmluZSBOSURfc2V0ZXh0X21pQXV0aAkJNjAyCisjZGVmaW5lIE9CSl9zZXRleHRfbWlBdXRoCQlPQkpfc2V0X21zZ0V4dCwzTAorCisjZGVmaW5lIFNOX3NldGV4dF9waW5TZWN1cmUJCSJzZXRleHQtcGluU2VjdXJlIgorI2RlZmluZSBOSURfc2V0ZXh0X3BpblNlY3VyZQkJNjAzCisjZGVmaW5lIE9CSl9zZXRleHRfcGluU2VjdXJlCQlPQkpfc2V0X21zZ0V4dCw0TAorCisjZGVmaW5lIFNOX3NldGV4dF9waW5BbnkJCSJzZXRleHQtcGluQW55IgorI2RlZmluZSBOSURfc2V0ZXh0X3BpbkFueQkJNjA0CisjZGVmaW5lIE9CSl9zZXRleHRfcGluQW55CQlPQkpfc2V0X21zZ0V4dCw1TAorCisjZGVmaW5lIFNOX3NldGV4dF90cmFjazIJCSJzZXRleHQtdHJhY2syIgorI2RlZmluZSBOSURfc2V0ZXh0X3RyYWNrMgkJNjA1CisjZGVmaW5lIE9CSl9zZXRleHRfdHJhY2syCQlPQkpfc2V0X21zZ0V4dCw3TAorCisjZGVmaW5lIFNOX3NldGV4dF9jdgkJInNldGV4dC1jdiIKKyNkZWZpbmUgTE5fc2V0ZXh0X2N2CQkiYWRkaXRpb25hbCB2ZXJpZmljYXRpb24iCisjZGVmaW5lIE5JRF9zZXRleHRfY3YJCTYwNgorI2RlZmluZSBPQkpfc2V0ZXh0X2N2CQlPQkpfc2V0X21zZ0V4dCw4TAorCisjZGVmaW5lIFNOX3NldF9wb2xpY3lfcm9vdAkJInNldC1wb2xpY3ktcm9vdCIKKyNkZWZpbmUgTklEX3NldF9wb2xpY3lfcm9vdAkJNjA3CisjZGVmaW5lIE9CSl9zZXRfcG9saWN5X3Jvb3QJCU9CSl9zZXRfcG9saWN5LDBMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9oYXNoZWRSb290CQkic2V0Q2V4dC1oYXNoZWRSb290IgorI2RlZmluZSBOSURfc2V0Q2V4dF9oYXNoZWRSb290CQk2MDgKKyNkZWZpbmUgT0JKX3NldENleHRfaGFzaGVkUm9vdAkJT0JKX3NldF9jZXJ0RXh0LDBMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9jZXJ0VHlwZQkJInNldENleHQtY2VydFR5cGUiCisjZGVmaW5lIE5JRF9zZXRDZXh0X2NlcnRUeXBlCQk2MDkKKyNkZWZpbmUgT0JKX3NldENleHRfY2VydFR5cGUJCU9CSl9zZXRfY2VydEV4dCwxTAorCisjZGVmaW5lIFNOX3NldENleHRfbWVyY2hEYXRhCQkic2V0Q2V4dC1tZXJjaERhdGEiCisjZGVmaW5lIE5JRF9zZXRDZXh0X21lcmNoRGF0YQkJNjEwCisjZGVmaW5lIE9CSl9zZXRDZXh0X21lcmNoRGF0YQkJT0JKX3NldF9jZXJ0RXh0LDJMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9jQ2VydFJlcXVpcmVkCQkic2V0Q2V4dC1jQ2VydFJlcXVpcmVkIgorI2RlZmluZSBOSURfc2V0Q2V4dF9jQ2VydFJlcXVpcmVkCQk2MTEKKyNkZWZpbmUgT0JKX3NldENleHRfY0NlcnRSZXF1aXJlZAkJT0JKX3NldF9jZXJ0RXh0LDNMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF90dW5uZWxpbmcJCSJzZXRDZXh0LXR1bm5lbGluZyIKKyNkZWZpbmUgTklEX3NldENleHRfdHVubmVsaW5nCQk2MTIKKyNkZWZpbmUgT0JKX3NldENleHRfdHVubmVsaW5nCQlPQkpfc2V0X2NlcnRFeHQsNEwKKworI2RlZmluZSBTTl9zZXRDZXh0X3NldEV4dAkJInNldENleHQtc2V0RXh0IgorI2RlZmluZSBOSURfc2V0Q2V4dF9zZXRFeHQJCTYxMworI2RlZmluZSBPQkpfc2V0Q2V4dF9zZXRFeHQJCU9CSl9zZXRfY2VydEV4dCw1TAorCisjZGVmaW5lIFNOX3NldENleHRfc2V0UXVhbGYJCSJzZXRDZXh0LXNldFF1YWxmIgorI2RlZmluZSBOSURfc2V0Q2V4dF9zZXRRdWFsZgkJNjE0CisjZGVmaW5lIE9CSl9zZXRDZXh0X3NldFF1YWxmCQlPQkpfc2V0X2NlcnRFeHQsNkwKKworI2RlZmluZSBTTl9zZXRDZXh0X1BHV1ljYXBhYmlsaXRpZXMJCSJzZXRDZXh0LVBHV1ljYXBhYmlsaXRpZXMiCisjZGVmaW5lIE5JRF9zZXRDZXh0X1BHV1ljYXBhYmlsaXRpZXMJCTYxNQorI2RlZmluZSBPQkpfc2V0Q2V4dF9QR1dZY2FwYWJpbGl0aWVzCQlPQkpfc2V0X2NlcnRFeHQsN0wKKworI2RlZmluZSBTTl9zZXRDZXh0X1Rva2VuSWRlbnRpZmllcgkJInNldENleHQtVG9rZW5JZGVudGlmaWVyIgorI2RlZmluZSBOSURfc2V0Q2V4dF9Ub2tlbklkZW50aWZpZXIJCTYxNgorI2RlZmluZSBPQkpfc2V0Q2V4dF9Ub2tlbklkZW50aWZpZXIJCU9CSl9zZXRfY2VydEV4dCw4TAorCisjZGVmaW5lIFNOX3NldENleHRfVHJhY2syRGF0YQkJInNldENleHQtVHJhY2syRGF0YSIKKyNkZWZpbmUgTklEX3NldENleHRfVHJhY2syRGF0YQkJNjE3CisjZGVmaW5lIE9CSl9zZXRDZXh0X1RyYWNrMkRhdGEJCU9CSl9zZXRfY2VydEV4dCw5TAorCisjZGVmaW5lIFNOX3NldENleHRfVG9rZW5UeXBlCQkic2V0Q2V4dC1Ub2tlblR5cGUiCisjZGVmaW5lIE5JRF9zZXRDZXh0X1Rva2VuVHlwZQkJNjE4CisjZGVmaW5lIE9CSl9zZXRDZXh0X1Rva2VuVHlwZQkJT0JKX3NldF9jZXJ0RXh0LDEwTAorCisjZGVmaW5lIFNOX3NldENleHRfSXNzdWVyQ2FwYWJpbGl0aWVzCQkic2V0Q2V4dC1Jc3N1ZXJDYXBhYmlsaXRpZXMiCisjZGVmaW5lIE5JRF9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcwkJNjE5CisjZGVmaW5lIE9CSl9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcwkJT0JKX3NldF9jZXJ0RXh0LDExTAorCisjZGVmaW5lIFNOX3NldEF0dHJfQ2VydAkJInNldEF0dHItQ2VydCIKKyNkZWZpbmUgTklEX3NldEF0dHJfQ2VydAkJNjIwCisjZGVmaW5lIE9CSl9zZXRBdHRyX0NlcnQJCU9CSl9zZXRfYXR0ciwwTAorCisjZGVmaW5lIFNOX3NldEF0dHJfUEdXWWNhcAkJInNldEF0dHItUEdXWWNhcCIKKyNkZWZpbmUgTE5fc2V0QXR0cl9QR1dZY2FwCQkicGF5bWVudCBnYXRld2F5IGNhcGFiaWxpdGllcyIKKyNkZWZpbmUgTklEX3NldEF0dHJfUEdXWWNhcAkJNjIxCisjZGVmaW5lIE9CSl9zZXRBdHRyX1BHV1ljYXAJCU9CSl9zZXRfYXR0ciwxTAorCisjZGVmaW5lIFNOX3NldEF0dHJfVG9rZW5UeXBlCQkic2V0QXR0ci1Ub2tlblR5cGUiCisjZGVmaW5lIE5JRF9zZXRBdHRyX1Rva2VuVHlwZQkJNjIyCisjZGVmaW5lIE9CSl9zZXRBdHRyX1Rva2VuVHlwZQkJT0JKX3NldF9hdHRyLDJMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9Jc3NDYXAJCSJzZXRBdHRyLUlzc0NhcCIKKyNkZWZpbmUgTE5fc2V0QXR0cl9Jc3NDYXAJCSJpc3N1ZXIgY2FwYWJpbGl0aWVzIgorI2RlZmluZSBOSURfc2V0QXR0cl9Jc3NDYXAJCTYyMworI2RlZmluZSBPQkpfc2V0QXR0cl9Jc3NDYXAJCU9CSl9zZXRfYXR0ciwzTAorCisjZGVmaW5lIFNOX3NldF9yb290S2V5VGh1bWIJCSJzZXQtcm9vdEtleVRodW1iIgorI2RlZmluZSBOSURfc2V0X3Jvb3RLZXlUaHVtYgkJNjI0CisjZGVmaW5lIE9CSl9zZXRfcm9vdEtleVRodW1iCQlPQkpfc2V0QXR0cl9DZXJ0LDBMCisKKyNkZWZpbmUgU05fc2V0X2FkZFBvbGljeQkJInNldC1hZGRQb2xpY3kiCisjZGVmaW5lIE5JRF9zZXRfYWRkUG9saWN5CQk2MjUKKyNkZWZpbmUgT0JKX3NldF9hZGRQb2xpY3kJCU9CSl9zZXRBdHRyX0NlcnQsMUwKKworI2RlZmluZSBTTl9zZXRBdHRyX1Rva2VuX0VNVgkJInNldEF0dHItVG9rZW4tRU1WIgorI2RlZmluZSBOSURfc2V0QXR0cl9Ub2tlbl9FTVYJCTYyNgorI2RlZmluZSBPQkpfc2V0QXR0cl9Ub2tlbl9FTVYJCU9CSl9zZXRBdHRyX1Rva2VuVHlwZSwxTAorCisjZGVmaW5lIFNOX3NldEF0dHJfVG9rZW5fQjBQcmltZQkJInNldEF0dHItVG9rZW4tQjBQcmltZSIKKyNkZWZpbmUgTklEX3NldEF0dHJfVG9rZW5fQjBQcmltZQkJNjI3CisjZGVmaW5lIE9CSl9zZXRBdHRyX1Rva2VuX0IwUHJpbWUJCU9CSl9zZXRBdHRyX1Rva2VuVHlwZSwyTAorCisjZGVmaW5lIFNOX3NldEF0dHJfSXNzQ2FwX0NWTQkJInNldEF0dHItSXNzQ2FwLUNWTSIKKyNkZWZpbmUgTklEX3NldEF0dHJfSXNzQ2FwX0NWTQkJNjI4CisjZGVmaW5lIE9CSl9zZXRBdHRyX0lzc0NhcF9DVk0JCU9CSl9zZXRBdHRyX0lzc0NhcCwzTAorCisjZGVmaW5lIFNOX3NldEF0dHJfSXNzQ2FwX1QyCQkic2V0QXR0ci1Jc3NDYXAtVDIiCisjZGVmaW5lIE5JRF9zZXRBdHRyX0lzc0NhcF9UMgkJNjI5CisjZGVmaW5lIE9CSl9zZXRBdHRyX0lzc0NhcF9UMgkJT0JKX3NldEF0dHJfSXNzQ2FwLDRMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9Jc3NDYXBfU2lnCQkic2V0QXR0ci1Jc3NDYXAtU2lnIgorI2RlZmluZSBOSURfc2V0QXR0cl9Jc3NDYXBfU2lnCQk2MzAKKyNkZWZpbmUgT0JKX3NldEF0dHJfSXNzQ2FwX1NpZwkJT0JKX3NldEF0dHJfSXNzQ2FwLDVMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9HZW5DcnlwdGdybQkJInNldEF0dHItR2VuQ3J5cHRncm0iCisjZGVmaW5lIExOX3NldEF0dHJfR2VuQ3J5cHRncm0JCSJnZW5lcmF0ZSBjcnlwdG9ncmFtIgorI2RlZmluZSBOSURfc2V0QXR0cl9HZW5DcnlwdGdybQkJNjMxCisjZGVmaW5lIE9CSl9zZXRBdHRyX0dlbkNyeXB0Z3JtCQlPQkpfc2V0QXR0cl9Jc3NDYXBfQ1ZNLDFMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9UMkVuYwkJInNldEF0dHItVDJFbmMiCisjZGVmaW5lIExOX3NldEF0dHJfVDJFbmMJCSJlbmNyeXB0ZWQgdHJhY2sgMiIKKyNkZWZpbmUgTklEX3NldEF0dHJfVDJFbmMJCTYzMgorI2RlZmluZSBPQkpfc2V0QXR0cl9UMkVuYwkJT0JKX3NldEF0dHJfSXNzQ2FwX1QyLDFMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9UMmNsZWFydHh0CQkic2V0QXR0ci1UMmNsZWFydHh0IgorI2RlZmluZSBMTl9zZXRBdHRyX1QyY2xlYXJ0eHQJCSJjbGVhcnRleHQgdHJhY2sgMiIKKyNkZWZpbmUgTklEX3NldEF0dHJfVDJjbGVhcnR4dAkJNjMzCisjZGVmaW5lIE9CSl9zZXRBdHRyX1QyY2xlYXJ0eHQJCU9CSl9zZXRBdHRyX0lzc0NhcF9UMiwyTAorCisjZGVmaW5lIFNOX3NldEF0dHJfVG9rSUNDc2lnCQkic2V0QXR0ci1Ub2tJQ0NzaWciCisjZGVmaW5lIExOX3NldEF0dHJfVG9rSUNDc2lnCQkiSUNDIG9yIHRva2VuIHNpZ25hdHVyZSIKKyNkZWZpbmUgTklEX3NldEF0dHJfVG9rSUNDc2lnCQk2MzQKKyNkZWZpbmUgT0JKX3NldEF0dHJfVG9rSUNDc2lnCQlPQkpfc2V0QXR0cl9Jc3NDYXBfU2lnLDFMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9TZWNEZXZTaWcJCSJzZXRBdHRyLVNlY0RldlNpZyIKKyNkZWZpbmUgTE5fc2V0QXR0cl9TZWNEZXZTaWcJCSJzZWN1cmUgZGV2aWNlIHNpZ25hdHVyZSIKKyNkZWZpbmUgTklEX3NldEF0dHJfU2VjRGV2U2lnCQk2MzUKKyNkZWZpbmUgT0JKX3NldEF0dHJfU2VjRGV2U2lnCQlPQkpfc2V0QXR0cl9Jc3NDYXBfU2lnLDJMCisKKyNkZWZpbmUgU05fc2V0X2JyYW5kX0lBVEFfQVRBCQkic2V0LWJyYW5kLUlBVEEtQVRBIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX0lBVEFfQVRBCQk2MzYKKyNkZWZpbmUgT0JKX3NldF9icmFuZF9JQVRBX0FUQQkJT0JKX3NldF9icmFuZCwxTAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9EaW5lcnMJCSJzZXQtYnJhbmQtRGluZXJzIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX0RpbmVycwkJNjM3CisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfRGluZXJzCQlPQkpfc2V0X2JyYW5kLDMwTAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9BbWVyaWNhbkV4cHJlc3MJCSJzZXQtYnJhbmQtQW1lcmljYW5FeHByZXNzIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX0FtZXJpY2FuRXhwcmVzcwkJNjM4CisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfQW1lcmljYW5FeHByZXNzCQlPQkpfc2V0X2JyYW5kLDM0TAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9KQ0IJCSJzZXQtYnJhbmQtSkNCIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX0pDQgkJNjM5CisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfSkNCCQlPQkpfc2V0X2JyYW5kLDM1TAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9WaXNhCQkic2V0LWJyYW5kLVZpc2EiCisjZGVmaW5lIE5JRF9zZXRfYnJhbmRfVmlzYQkJNjQwCisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfVmlzYQkJT0JKX3NldF9icmFuZCw0TAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9NYXN0ZXJDYXJkCQkic2V0LWJyYW5kLU1hc3RlckNhcmQiCisjZGVmaW5lIE5JRF9zZXRfYnJhbmRfTWFzdGVyQ2FyZAkJNjQxCisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfTWFzdGVyQ2FyZAkJT0JKX3NldF9icmFuZCw1TAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9Ob3Z1cwkJInNldC1icmFuZC1Ob3Z1cyIKKyNkZWZpbmUgTklEX3NldF9icmFuZF9Ob3Z1cwkJNjQyCisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfTm92dXMJCU9CSl9zZXRfYnJhbmQsNjAxMUwKKworI2RlZmluZSBTTl9kZXNfY2RtZgkJIkRFUy1DRE1GIgorI2RlZmluZSBMTl9kZXNfY2RtZgkJImRlcy1jZG1mIgorI2RlZmluZSBOSURfZGVzX2NkbWYJCTY0MworI2RlZmluZSBPQkpfZGVzX2NkbWYJCU9CSl9yc2Fkc2ksM0wsMTBMCisKKyNkZWZpbmUgU05fcnNhT0FFUEVuY3J5cHRpb25TRVQJCSJyc2FPQUVQRW5jcnlwdGlvblNFVCIKKyNkZWZpbmUgTklEX3JzYU9BRVBFbmNyeXB0aW9uU0VUCQk2NDQKKyNkZWZpbmUgT0JKX3JzYU9BRVBFbmNyeXB0aW9uU0VUCQlPQkpfcnNhZHNpLDFMLDFMLDZMCisKKyNkZWZpbmUgU05faXBzZWMzCQkiT2FrbGV5LUVDMk4tMyIKKyNkZWZpbmUgTE5faXBzZWMzCQkiaXBzZWMzIgorI2RlZmluZSBOSURfaXBzZWMzCQk3NDkKKworI2RlZmluZSBTTl9pcHNlYzQJCSJPYWtsZXktRUMyTi00IgorI2RlZmluZSBMTl9pcHNlYzQJCSJpcHNlYzQiCisjZGVmaW5lIE5JRF9pcHNlYzQJCTc1MAorCisjZGVmaW5lIFNOX3doaXJscG9vbAkJIndoaXJscG9vbCIKKyNkZWZpbmUgTklEX3doaXJscG9vbAkJODA0CisjZGVmaW5lIE9CSl93aGlybHBvb2wJCU9CSl9pc28sMEwsMTAxMThMLDNMLDBMLDU1TAorCisjZGVmaW5lIFNOX2NyeXB0b3BybwkJImNyeXB0b3BybyIKKyNkZWZpbmUgTklEX2NyeXB0b3BybwkJODA1CisjZGVmaW5lIE9CSl9jcnlwdG9wcm8JCU9CSl9tZW1iZXJfYm9keSw2NDNMLDJMLDJMCisKKyNkZWZpbmUgU05fY3J5cHRvY29tCQkiY3J5cHRvY29tIgorI2RlZmluZSBOSURfY3J5cHRvY29tCQk4MDYKKyNkZWZpbmUgT0JKX2NyeXB0b2NvbQkJT0JKX21lbWJlcl9ib2R5LDY0M0wsMkwsOUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMQkJImlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC0yMDAxIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMQkJIkdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC0yMDAxIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDEJCTgwNworI2RlZmluZSBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDEJCU9CSl9jcnlwdG9wcm8sM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTQJCSJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtOTQiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NAkJIkdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC05NCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NAkJODA4CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTQJCU9CSl9jcnlwdG9wcm8sNEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTQJCSJtZF9nb3N0OTQiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMV85NAkJIkdPU1QgUiAzNC4xMS05NCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NAkJODA5CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTQJCU9CSl9jcnlwdG9wcm8sOUwKKworI2RlZmluZSBTTl9pZF9ITUFDR29zdFIzNDExXzk0CQkiaWQtSE1BQ0dvc3RSMzQxMS05NCIKKyNkZWZpbmUgTE5faWRfSE1BQ0dvc3RSMzQxMV85NAkJIkhNQUMgR09TVCAzNC4xMS05NCIKKyNkZWZpbmUgTklEX2lkX0hNQUNHb3N0UjM0MTFfOTQJCTgxMAorI2RlZmluZSBPQkpfaWRfSE1BQ0dvc3RSMzQxMV85NAkJT0JKX2NyeXB0b3BybywxMEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMQkJImdvc3QyMDAxIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfMjAwMQkJIkdPU1QgUiAzNC4xMC0yMDAxIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDEJCTgxMQorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDEJCU9CSl9jcnlwdG9wcm8sMTlMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0CQkiZ29zdDk0IgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfOTQJCSJHT1NUIFIgMzQuMTAtOTQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTQJCTgxMgorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0CQlPQkpfY3J5cHRvcHJvLDIwTAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OQkJImdvc3Q4OSIKKyNkZWZpbmUgTE5faWRfR29zdDI4MTQ3Xzg5CQkiR09TVCAyODE0Ny04OSIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OQkJODEzCisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODkJCU9CSl9jcnlwdG9wcm8sMjFMCisKKyNkZWZpbmUgU05fZ29zdDg5X2NudAkJImdvc3Q4OS1jbnQiCisjZGVmaW5lIE5JRF9nb3N0ODlfY250CQk4MTQKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfTUFDCQkiZ29zdC1tYWMiCisjZGVmaW5lIExOX2lkX0dvc3QyODE0N184OV9NQUMJCSJHT1NUIDI4MTQ3LTg5IE1BQyIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9NQUMJCTgxNQorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X01BQwkJT0JKX2NyeXB0b3BybywyMkwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfcHJmCQkicHJmLWdvc3RyMzQxMS05NCIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDExXzk0X3ByZgkJIkdPU1QgUiAzNC4xMS05NCBQUkYiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTFfOTRfcHJmCQk4MTYKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF9wcmYJCU9CSl9jcnlwdG9wcm8sMjNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFESAkJImlkLUdvc3RSMzQxMC0yMDAxREgiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMF8yMDAxREgJCSJHT1NUIFIgMzQuMTAtMjAwMSBESCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF8yMDAxREgJCTgxNworI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFESAkJT0JKX2NyeXB0b3Bybyw5OEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRESAkJImlkLUdvc3RSMzQxMC05NERIIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfOTRESAkJIkdPU1QgUiAzNC4xMC05NCBESCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NERICQk4MTgKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NERICQlPQkpfY3J5cHRvcHJvLDk5TAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZwkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tS2V5TWVzaGluZyIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZwkJODE5CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0tleU1lc2hpbmcJCU9CSl9jcnlwdG9wcm8sMTRMLDFMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X05vbmVfS2V5TWVzaGluZwkJImlkLUdvc3QyODE0Ny04OS1Ob25lLUtleU1lc2hpbmciCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfTm9uZV9LZXlNZXNoaW5nCQk4MjAKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9Ob25lX0tleU1lc2hpbmcJCU9CSl9jcnlwdG9wcm8sMTRMLDBMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0X1Rlc3RQYXJhbVNldAkJImlkLUdvc3RSMzQxMS05NC1UZXN0UGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTFfOTRfVGVzdFBhcmFtU2V0CQk4MjEKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF9UZXN0UGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzBMLDBMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0X0NyeXB0b1Byb1BhcmFtU2V0CQkiaWQtR29zdFIzNDExLTk0LUNyeXB0b1Byb1BhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDExXzk0X0NyeXB0b1Byb1BhcmFtU2V0CQk4MjIKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMEwsMUwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfVGVzdFBhcmFtU2V0CQkiaWQtR29zdDI4MTQ3LTg5LVRlc3RQYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9UZXN0UGFyYW1TZXQJCTgyMworI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X1Rlc3RQYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMUwsMEwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0FfUGFyYW1TZXQJCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0FfUGFyYW1TZXQJCTgyNAorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19BX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMxTCwxTAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJODI1CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDJMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19DX1BhcmFtU2V0CQkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1DLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19DX1BhcmFtU2V0CQk4MjYKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMUwsM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0RfUGFyYW1TZXQJCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUQtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0RfUGFyYW1TZXQJCTgyNworI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19EX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMxTCw0TAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8xX1BhcmFtU2V0CQkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldAkJODI4CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMUwsNUwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMF9QYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0wLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19Pc2Nhcl8xXzBfUGFyYW1TZXQJCTgyOQorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19Pc2Nhcl8xXzBfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDZMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19SSUNfMV9QYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tUklDLTEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX1JJQ18xX1BhcmFtU2V0CQk4MzAKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fUklDXzFfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDdMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X1Rlc3RQYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1UZXN0UGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfVGVzdFBhcmFtU2V0CQk4MzEKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9UZXN0UGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzJMLDBMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19BX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1BLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19BX1BhcmFtU2V0CQk4MzIKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMkwsMkwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUItUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCTgzMworI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19CX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMyTCwzTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQy1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJODM0CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzJMLDRMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19EX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1ELVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19EX1BhcmFtU2V0CQk4MzUKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fRF9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMkwsNUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEFfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEFfUGFyYW1TZXQJCTgzNgorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMzTCwxTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldAkJODM3CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzNMLDJMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hDX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1YY2hDLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hDX1BhcmFtU2V0CQk4MzgKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQ19QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzM0wsM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMV9UZXN0UGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtMjAwMS1UZXN0UGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9UZXN0UGFyYW1TZXQJCTgzOQorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfVGVzdFBhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDM1TCwwTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19BX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJODQwCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzNUwsMUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1CLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCTg0MQorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzVMLDJMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19DX1BhcmFtU2V0CQk4NDIKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19DX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDM1TCwzTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldAkJODQzCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzNkwsMEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hCLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCTg0NAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzZMLDFMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2EJCSJpZC1Hb3N0UjM0MTAtOTQtYSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9hCQk4NDUKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9hCQlPQkpfaWRfR29zdFIzNDEwXzk0LDFMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2FCaXMJCSJpZC1Hb3N0UjM0MTAtOTQtYUJpcyIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9hQmlzCQk4NDYKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9hQmlzCQlPQkpfaWRfR29zdFIzNDEwXzk0LDJMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2IJCSJpZC1Hb3N0UjM0MTAtOTQtYiIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9iCQk4NDcKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9iCQlPQkpfaWRfR29zdFIzNDEwXzk0LDNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2JCaXMJCSJpZC1Hb3N0UjM0MTAtOTQtYkJpcyIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9iQmlzCQk4NDgKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9iQmlzCQlPQkpfaWRfR29zdFIzNDEwXzk0LDRMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X2NjCQkiaWQtR29zdDI4MTQ3LTg5LWNjIgorI2RlZmluZSBMTl9pZF9Hb3N0MjgxNDdfODlfY2MJCSJHT1NUIDI4MTQ3LTg5IENyeXB0b2NvbSBQYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9jYwkJODQ5CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfY2MJCU9CSl9jcnlwdG9jb20sMUwsNkwsMUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRfY2MJCSJnb3N0OTRjYyIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDEwXzk0X2NjCQkiR09TVCAzNC4xMC05NCBDcnlwdG9jb20iCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfY2MJCTg1MAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0X2NjCQlPQkpfY3J5cHRvY29tLDFMLDVMLDNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfY2MJCSJnb3N0MjAwMWNjIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfMjAwMV9jYwkJIkdPU1QgMzQuMTAtMjAwMSBDcnlwdG9jb20iCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9jYwkJODUxCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9jYwkJT0JKX2NyeXB0b2NvbSwxTCw1TCw0TAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYwkJImlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC05NC1jYyIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0X2NjCQkiR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTk0IENyeXB0b2NvbSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYwkJODUyCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTRfY2MJCU9CSl9jcnlwdG9jb20sMUwsM0wsM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYwkJImlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC0yMDAxLWNjIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYwkJIkdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC0yMDAxIENyeXB0b2NvbSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxX2NjCQk4NTMKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxX2NjCQlPQkpfY3J5cHRvY29tLDFMLDNMLDRMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfUGFyYW1TZXRfY2MJCSJpZC1Hb3N0UjM0MTAtMjAwMS1QYXJhbVNldC1jYyIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDEwXzIwMDFfUGFyYW1TZXRfY2MJCSJHT1NUIFIgMzQxMC0yMDAxIFBhcmFtZXRlciBTZXQgQ3J5cHRvY29tIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfUGFyYW1TZXRfY2MJCTg1NAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfUGFyYW1TZXRfY2MJCU9CSl9jcnlwdG9jb20sMUwsOEwsMUwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xMjhfY2JjCQkiQ0FNRUxMSUEtMTI4LUNCQyIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTI4X2NiYwkJImNhbWVsbGlhLTEyOC1jYmMiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfY2JjCQk3NTEKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzEyOF9jYmMJCTFMLDJMLDM5MkwsMjAwMDExTCw2MUwsMUwsMUwsMUwsMkwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xOTJfY2JjCQkiQ0FNRUxMSUEtMTkyLUNCQyIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX2NiYwkJImNhbWVsbGlhLTE5Mi1jYmMiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xOTJfY2JjCQk3NTIKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzE5Ml9jYmMJCTFMLDJMLDM5MkwsMjAwMDExTCw2MUwsMUwsMUwsMUwsM0wKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfY2JjCQkiQ0FNRUxMSUEtMjU2LUNCQyIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMjU2X2NiYwkJImNhbWVsbGlhLTI1Ni1jYmMiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8yNTZfY2JjCQk3NTMKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzI1Nl9jYmMJCTFMLDJMLDM5MkwsMjAwMDExTCw2MUwsMUwsMUwsMUwsNEwKKworI2RlZmluZSBPQkpfbnR0X2RzCQkwTCwzTCw0NDAxTCw1TAorCisjZGVmaW5lIE9CSl9jYW1lbGxpYQkJT0JKX250dF9kcywzTCwxTCw5TAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzEyOF9lY2IJCSJDQU1FTExJQS0xMjgtRUNCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xMjhfZWNiCQkiY2FtZWxsaWEtMTI4LWVjYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzEyOF9lY2IJCTc1NAorI2RlZmluZSBPQkpfY2FtZWxsaWFfMTI4X2VjYgkJT0JKX2NhbWVsbGlhLDFMCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTI4X29mYjEyOAkJIkNBTUVMTElBLTEyOC1PRkIiCisjZGVmaW5lIExOX2NhbWVsbGlhXzEyOF9vZmIxMjgJCSJjYW1lbGxpYS0xMjgtb2ZiIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMTI4X29mYjEyOAkJNzY2CisjZGVmaW5lIE9CSl9jYW1lbGxpYV8xMjhfb2ZiMTI4CQlPQkpfY2FtZWxsaWEsM0wKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xMjhfY2ZiMTI4CQkiQ0FNRUxMSUEtMTI4LUNGQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTI4X2NmYjEyOAkJImNhbWVsbGlhLTEyOC1jZmIiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfY2ZiMTI4CQk3NTcKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzEyOF9jZmIxMjgJCU9CSl9jYW1lbGxpYSw0TAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzE5Ml9lY2IJCSJDQU1FTExJQS0xOTItRUNCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xOTJfZWNiCQkiY2FtZWxsaWEtMTkyLWVjYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9lY2IJCTc1NQorI2RlZmluZSBPQkpfY2FtZWxsaWFfMTkyX2VjYgkJT0JKX2NhbWVsbGlhLDIxTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzE5Ml9vZmIxMjgJCSJDQU1FTExJQS0xOTItT0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xOTJfb2ZiMTI4CQkiY2FtZWxsaWEtMTkyLW9mYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9vZmIxMjgJCTc2NworI2RlZmluZSBPQkpfY2FtZWxsaWFfMTkyX29mYjEyOAkJT0JKX2NhbWVsbGlhLDIzTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzE5Ml9jZmIxMjgJCSJDQU1FTExJQS0xOTItQ0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xOTJfY2ZiMTI4CQkiY2FtZWxsaWEtMTkyLWNmYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9jZmIxMjgJCTc1OAorI2RlZmluZSBPQkpfY2FtZWxsaWFfMTkyX2NmYjEyOAkJT0JKX2NhbWVsbGlhLDI0TAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzI1Nl9lY2IJCSJDQU1FTExJQS0yNTYtRUNCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfZWNiCQkiY2FtZWxsaWEtMjU2LWVjYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzI1Nl9lY2IJCTc1NgorI2RlZmluZSBPQkpfY2FtZWxsaWFfMjU2X2VjYgkJT0JKX2NhbWVsbGlhLDQxTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzI1Nl9vZmIxMjgJCSJDQU1FTExJQS0yNTYtT0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfb2ZiMTI4CQkiY2FtZWxsaWEtMjU2LW9mYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzI1Nl9vZmIxMjgJCTc2OAorI2RlZmluZSBPQkpfY2FtZWxsaWFfMjU2X29mYjEyOAkJT0JKX2NhbWVsbGlhLDQzTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzI1Nl9jZmIxMjgJCSJDQU1FTExJQS0yNTYtQ0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfY2ZiMTI4CQkiY2FtZWxsaWEtMjU2LWNmYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzI1Nl9jZmIxMjgJCTc1OQorI2RlZmluZSBPQkpfY2FtZWxsaWFfMjU2X2NmYjEyOAkJT0JKX2NhbWVsbGlhLDQ0TAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzEyOF9jZmIxCQkiQ0FNRUxMSUEtMTI4LUNGQjEiCisjZGVmaW5lIExOX2NhbWVsbGlhXzEyOF9jZmIxCQkiY2FtZWxsaWEtMTI4LWNmYjEiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfY2ZiMQkJNzYwCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTkyX2NmYjEJCSJDQU1FTExJQS0xOTItQ0ZCMSIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX2NmYjEJCSJjYW1lbGxpYS0xOTItY2ZiMSIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9jZmIxCQk3NjEKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfY2ZiMQkJIkNBTUVMTElBLTI1Ni1DRkIxIgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfY2ZiMQkJImNhbWVsbGlhLTI1Ni1jZmIxIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMjU2X2NmYjEJCTc2MgorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzEyOF9jZmI4CQkiQ0FNRUxMSUEtMTI4LUNGQjgiCisjZGVmaW5lIExOX2NhbWVsbGlhXzEyOF9jZmI4CQkiY2FtZWxsaWEtMTI4LWNmYjgiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfY2ZiOAkJNzYzCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTkyX2NmYjgJCSJDQU1FTExJQS0xOTItQ0ZCOCIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX2NmYjgJCSJjYW1lbGxpYS0xOTItY2ZiOCIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzE5Ml9jZmI4CQk3NjQKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfY2ZiOAkJIkNBTUVMTElBLTI1Ni1DRkI4IgorI2RlZmluZSBMTl9jYW1lbGxpYV8yNTZfY2ZiOAkJImNhbWVsbGlhLTI1Ni1jZmI4IgorI2RlZmluZSBOSURfY2FtZWxsaWFfMjU2X2NmYjgJCTc2NQorCisjZGVmaW5lIFNOX2tpc2EJCSJLSVNBIgorI2RlZmluZSBMTl9raXNhCQkia2lzYSIKKyNkZWZpbmUgTklEX2tpc2EJCTc3MworI2RlZmluZSBPQkpfa2lzYQkJT0JKX21lbWJlcl9ib2R5LDQxMEwsMjAwMDA0TAorCisjZGVmaW5lIFNOX3NlZWRfZWNiCQkiU0VFRC1FQ0IiCisjZGVmaW5lIExOX3NlZWRfZWNiCQkic2VlZC1lY2IiCisjZGVmaW5lIE5JRF9zZWVkX2VjYgkJNzc2CisjZGVmaW5lIE9CSl9zZWVkX2VjYgkJT0JKX2tpc2EsMUwsM0wKKworI2RlZmluZSBTTl9zZWVkX2NiYwkJIlNFRUQtQ0JDIgorI2RlZmluZSBMTl9zZWVkX2NiYwkJInNlZWQtY2JjIgorI2RlZmluZSBOSURfc2VlZF9jYmMJCTc3NworI2RlZmluZSBPQkpfc2VlZF9jYmMJCU9CSl9raXNhLDFMLDRMCisKKyNkZWZpbmUgU05fc2VlZF9jZmIxMjgJCSJTRUVELUNGQiIKKyNkZWZpbmUgTE5fc2VlZF9jZmIxMjgJCSJzZWVkLWNmYiIKKyNkZWZpbmUgTklEX3NlZWRfY2ZiMTI4CQk3NzkKKyNkZWZpbmUgT0JKX3NlZWRfY2ZiMTI4CQlPQkpfa2lzYSwxTCw1TAorCisjZGVmaW5lIFNOX3NlZWRfb2ZiMTI4CQkiU0VFRC1PRkIiCisjZGVmaW5lIExOX3NlZWRfb2ZiMTI4CQkic2VlZC1vZmIiCisjZGVmaW5lIE5JRF9zZWVkX29mYjEyOAkJNzc4CisjZGVmaW5lIE9CSl9zZWVkX29mYjEyOAkJT0JKX2tpc2EsMUwsNkwKKworI2RlZmluZSBTTl9obWFjCQkiSE1BQyIKKyNkZWZpbmUgTE5faG1hYwkJImhtYWMiCisjZGVmaW5lIE5JRF9obWFjCQk4NTUKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqX21hYy5udW0gYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfbWFjLm51bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzUwYWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqX21hYy5udW0KQEAgLTAsMCArMSw4OTIgQEAKK3VuZGVmCQkwCityc2Fkc2kJCTEKK3BrY3MJCTIKK21kMgkJMworbWQ1CQk0CityYzQJCTUKK3JzYUVuY3J5cHRpb24JCTYKK21kMldpdGhSU0FFbmNyeXB0aW9uCQk3CittZDVXaXRoUlNBRW5jcnlwdGlvbgkJOAorcGJlV2l0aE1EMkFuZERFU19DQkMJCTkKK3BiZVdpdGhNRDVBbmRERVNfQ0JDCQkxMAorWDUwMAkJMTEKK1g1MDkJCTEyCitjb21tb25OYW1lCQkxMworY291bnRyeU5hbWUJCTE0Citsb2NhbGl0eU5hbWUJCTE1CitzdGF0ZU9yUHJvdmluY2VOYW1lCQkxNgorb3JnYW5pemF0aW9uTmFtZQkJMTcKK29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJCTE4Cityc2EJCTE5Citwa2NzNwkJMjAKK3BrY3M3X2RhdGEJCTIxCitwa2NzN19zaWduZWQJCTIyCitwa2NzN19lbnZlbG9wZWQJCTIzCitwa2NzN19zaWduZWRBbmRFbnZlbG9wZWQJCTI0Citwa2NzN19kaWdlc3QJCTI1Citwa2NzN19lbmNyeXB0ZWQJCTI2Citwa2NzMwkJMjcKK2RoS2V5QWdyZWVtZW50CQkyOAorZGVzX2VjYgkJMjkKK2Rlc19jZmI2NAkJMzAKK2Rlc19jYmMJCTMxCitkZXNfZWRlX2VjYgkJMzIKK2Rlc19lZGUzX2VjYgkJMzMKK2lkZWFfY2JjCQkzNAoraWRlYV9jZmI2NAkJMzUKK2lkZWFfZWNiCQkzNgorcmMyX2NiYwkJMzcKK3JjMl9lY2IJCTM4CityYzJfY2ZiNjQJCTM5CityYzJfb2ZiNjQJCTQwCitzaGEJCTQxCitzaGFXaXRoUlNBRW5jcnlwdGlvbgkJNDIKK2Rlc19lZGVfY2JjCQk0MworZGVzX2VkZTNfY2JjCQk0NAorZGVzX29mYjY0CQk0NQoraWRlYV9vZmI2NAkJNDYKK3BrY3M5CQk0NworcGtjczlfZW1haWxBZGRyZXNzCQk0OAorcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZQkJNDkKK3BrY3M5X2NvbnRlbnRUeXBlCQk1MAorcGtjczlfbWVzc2FnZURpZ2VzdAkJNTEKK3BrY3M5X3NpZ25pbmdUaW1lCQk1MgorcGtjczlfY291bnRlcnNpZ25hdHVyZQkJNTMKK3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkCQk1NAorcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcwkJNTUKK3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzCQk1NgorbmV0c2NhcGUJCTU3CituZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbgkJNTgKK25ldHNjYXBlX2RhdGFfdHlwZQkJNTkKK2Rlc19lZGVfY2ZiNjQJCTYwCitkZXNfZWRlM19jZmI2NAkJNjEKK2Rlc19lZGVfb2ZiNjQJCTYyCitkZXNfZWRlM19vZmI2NAkJNjMKK3NoYTEJCTY0CitzaGExV2l0aFJTQUVuY3J5cHRpb24JCTY1Citkc2FXaXRoU0hBCQk2NgorZHNhXzIJCTY3CitwYmVXaXRoU0hBMUFuZFJDMl9DQkMJCTY4CitpZF9wYmtkZjIJCTY5Citkc2FXaXRoU0hBMV8yCQk3MAorbmV0c2NhcGVfY2VydF90eXBlCQk3MQorbmV0c2NhcGVfYmFzZV91cmwJCTcyCituZXRzY2FwZV9yZXZvY2F0aW9uX3VybAkJNzMKK25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsCQk3NAorbmV0c2NhcGVfcmVuZXdhbF91cmwJCTc1CituZXRzY2FwZV9jYV9wb2xpY3lfdXJsCQk3NgorbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCQk3NworbmV0c2NhcGVfY29tbWVudAkJNzgKK25ldHNjYXBlX2NlcnRfc2VxdWVuY2UJCTc5CitkZXN4X2NiYwkJODAKK2lkX2NlCQk4MQorc3ViamVjdF9rZXlfaWRlbnRpZmllcgkJODIKK2tleV91c2FnZQkJODMKK3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAkJODQKK3N1YmplY3RfYWx0X25hbWUJCTg1Citpc3N1ZXJfYWx0X25hbWUJCTg2CitiYXNpY19jb25zdHJhaW50cwkJODcKK2NybF9udW1iZXIJCTg4CitjZXJ0aWZpY2F0ZV9wb2xpY2llcwkJODkKK2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkJOTAKK2JmX2NiYwkJOTEKK2JmX2VjYgkJOTIKK2JmX2NmYjY0CQk5MworYmZfb2ZiNjQJCTk0CittZGMyCQk5NQorbWRjMldpdGhSU0EJCTk2CityYzRfNDAJCTk3CityYzJfNDBfY2JjCQk5OAorZ2l2ZW5OYW1lCQk5OQorc3VybmFtZQkJMTAwCitpbml0aWFscwkJMTAxCit1bmlxdWVJZGVudGlmaWVyCQkxMDIKK2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQkxMDMKK21kNVdpdGhSU0EJCTEwNAorc2VyaWFsTnVtYmVyCQkxMDUKK3RpdGxlCQkxMDYKK2Rlc2NyaXB0aW9uCQkxMDcKK2Nhc3Q1X2NiYwkJMTA4CitjYXN0NV9lY2IJCTEwOQorY2FzdDVfY2ZiNjQJCTExMAorY2FzdDVfb2ZiNjQJCTExMQorcGJlV2l0aE1ENUFuZENhc3Q1X0NCQwkJMTEyCitkc2FXaXRoU0hBMQkJMTEzCittZDVfc2hhMQkJMTE0CitzaGExV2l0aFJTQQkJMTE1Citkc2EJCTExNgorcmlwZW1kMTYwCQkxMTcKK3JpcGVtZDE2MFdpdGhSU0EJCTExOQorcmM1X2NiYwkJMTIwCityYzVfZWNiCQkxMjEKK3JjNV9jZmI2NAkJMTIyCityYzVfb2ZiNjQJCTEyMworcmxlX2NvbXByZXNzaW9uCQkxMjQKK3psaWJfY29tcHJlc3Npb24JCTEyNQorZXh0X2tleV91c2FnZQkJMTI2CitpZF9wa2l4CQkxMjcKK2lkX2twCQkxMjgKK3NlcnZlcl9hdXRoCQkxMjkKK2NsaWVudF9hdXRoCQkxMzAKK2NvZGVfc2lnbgkJMTMxCitlbWFpbF9wcm90ZWN0CQkxMzIKK3RpbWVfc3RhbXAJCTEzMworbXNfY29kZV9pbmQJCTEzNAorbXNfY29kZV9jb20JCTEzNQorbXNfY3RsX3NpZ24JCTEzNgorbXNfc2djCQkxMzcKK21zX2VmcwkJMTM4Cituc19zZ2MJCTEzOQorZGVsdGFfY3JsCQkxNDAKK2NybF9yZWFzb24JCTE0MQoraW52YWxpZGl0eV9kYXRlCQkxNDIKK3N4bmV0CQkxNDMKK3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDNAkJMTQ0CitwYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkJMTQ1CitwYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCQkxNDYKK3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJCTE0NworcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwkJMTQ4CitwYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJCTE0OQora2V5QmFnCQkxNTAKK3BrY3M4U2hyb3VkZWRLZXlCYWcJCTE1MQorY2VydEJhZwkJMTUyCitjcmxCYWcJCTE1Mworc2VjcmV0QmFnCQkxNTQKK3NhZmVDb250ZW50c0JhZwkJMTU1CitmcmllbmRseU5hbWUJCTE1NgorbG9jYWxLZXlJRAkJMTU3Cit4NTA5Q2VydGlmaWNhdGUJCTE1OAorc2RzaUNlcnRpZmljYXRlCQkxNTkKK3g1MDlDcmwJCTE2MAorcGJlczIJCTE2MQorcGJtYWMxCQkxNjIKK2htYWNXaXRoU0hBMQkJMTYzCitpZF9xdF9jcHMJCTE2NAoraWRfcXRfdW5vdGljZQkJMTY1CityYzJfNjRfY2JjCQkxNjYKK1NNSU1FQ2FwYWJpbGl0aWVzCQkxNjcKK3BiZVdpdGhNRDJBbmRSQzJfQ0JDCQkxNjgKK3BiZVdpdGhNRDVBbmRSQzJfQ0JDCQkxNjkKK3BiZVdpdGhTSEExQW5kREVTX0NCQwkJMTcwCittc19leHRfcmVxCQkxNzEKK2V4dF9yZXEJCTE3MgorbmFtZQkJMTczCitkblF1YWxpZmllcgkJMTc0CitpZF9wZQkJMTc1CitpZF9hZAkJMTc2CitpbmZvX2FjY2VzcwkJMTc3CithZF9PQ1NQCQkxNzgKK2FkX2NhX2lzc3VlcnMJCTE3OQorT0NTUF9zaWduCQkxODAKK2lzbwkJMTgxCittZW1iZXJfYm9keQkJMTgyCitJU09fVVMJCTE4MworWDlfNTcJCTE4NAorWDljbQkJMTg1Citwa2NzMQkJMTg2Citwa2NzNQkJMTg3CitTTUlNRQkJMTg4CitpZF9zbWltZV9tb2QJCTE4OQoraWRfc21pbWVfY3QJCTE5MAoraWRfc21pbWVfYWEJCTE5MQoraWRfc21pbWVfYWxnCQkxOTIKK2lkX3NtaW1lX2NkCQkxOTMKK2lkX3NtaW1lX3NwcQkJMTk0CitpZF9zbWltZV9jdGkJCTE5NQoraWRfc21pbWVfbW9kX2NtcwkJMTk2CitpZF9zbWltZV9tb2RfZXNzCQkxOTcKK2lkX3NtaW1lX21vZF9vaWQJCTE5OAoraWRfc21pbWVfbW9kX21zZ192MwkJMTk5CitpZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfODgJCTIwMAoraWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzk3CQkyMDEKK2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV84OAkJMjAyCitpZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfOTcJCTIwMworaWRfc21pbWVfY3RfcmVjZWlwdAkJMjA0CitpZF9zbWltZV9jdF9hdXRoRGF0YQkJMjA1CitpZF9zbWltZV9jdF9wdWJsaXNoQ2VydAkJMjA2CitpZF9zbWltZV9jdF9UU1RJbmZvCQkyMDcKK2lkX3NtaW1lX2N0X1REVEluZm8JCTIwOAoraWRfc21pbWVfY3RfY29udGVudEluZm8JCTIwOQoraWRfc21pbWVfY3RfRFZDU1JlcXVlc3REYXRhCQkyMTAKK2lkX3NtaW1lX2N0X0RWQ1NSZXNwb25zZURhdGEJCTIxMQoraWRfc21pbWVfYWFfcmVjZWlwdFJlcXVlc3QJCTIxMgoraWRfc21pbWVfYWFfc2VjdXJpdHlMYWJlbAkJMjEzCitpZF9zbWltZV9hYV9tbEV4cGFuZEhpc3RvcnkJCTIxNAoraWRfc21pbWVfYWFfY29udGVudEhpbnQJCTIxNQoraWRfc21pbWVfYWFfbXNnU2lnRGlnZXN0CQkyMTYKK2lkX3NtaW1lX2FhX2VuY2FwQ29udGVudFR5cGUJCTIxNworaWRfc21pbWVfYWFfY29udGVudElkZW50aWZpZXIJCTIxOAoraWRfc21pbWVfYWFfbWFjVmFsdWUJCTIxOQoraWRfc21pbWVfYWFfZXF1aXZhbGVudExhYmVscwkJMjIwCitpZF9zbWltZV9hYV9jb250ZW50UmVmZXJlbmNlCQkyMjEKK2lkX3NtaW1lX2FhX2VuY3J5cEtleVByZWYJCTIyMgoraWRfc21pbWVfYWFfc2lnbmluZ0NlcnRpZmljYXRlCQkyMjMKK2lkX3NtaW1lX2FhX3NtaW1lRW5jcnlwdENlcnRzCQkyMjQKK2lkX3NtaW1lX2FhX3RpbWVTdGFtcFRva2VuCQkyMjUKK2lkX3NtaW1lX2FhX2V0c19zaWdQb2xpY3lJZAkJMjI2CitpZF9zbWltZV9hYV9ldHNfY29tbWl0bWVudFR5cGUJCTIyNworaWRfc21pbWVfYWFfZXRzX3NpZ25lckxvY2F0aW9uCQkyMjgKK2lkX3NtaW1lX2FhX2V0c19zaWduZXJBdHRyCQkyMjkKK2lkX3NtaW1lX2FhX2V0c19vdGhlclNpZ0NlcnQJCTIzMAoraWRfc21pbWVfYWFfZXRzX2NvbnRlbnRUaW1lc3RhbXAJCTIzMQoraWRfc21pbWVfYWFfZXRzX0NlcnRpZmljYXRlUmVmcwkJMjMyCitpZF9zbWltZV9hYV9ldHNfUmV2b2NhdGlvblJlZnMJCTIzMworaWRfc21pbWVfYWFfZXRzX2NlcnRWYWx1ZXMJCTIzNAoraWRfc21pbWVfYWFfZXRzX3Jldm9jYXRpb25WYWx1ZXMJCTIzNQoraWRfc21pbWVfYWFfZXRzX2VzY1RpbWVTdGFtcAkJMjM2CitpZF9zbWltZV9hYV9ldHNfY2VydENSTFRpbWVzdGFtcAkJMjM3CitpZF9zbWltZV9hYV9ldHNfYXJjaGl2ZVRpbWVTdGFtcAkJMjM4CitpZF9zbWltZV9hYV9zaWduYXR1cmVUeXBlCQkyMzkKK2lkX3NtaW1lX2FhX2R2Y3NfZHZjCQkyNDAKK2lkX3NtaW1lX2FsZ19FU0RId2l0aDNERVMJCTI0MQoraWRfc21pbWVfYWxnX0VTREh3aXRoUkMyCQkyNDIKK2lkX3NtaW1lX2FsZ18zREVTd3JhcAkJMjQzCitpZF9zbWltZV9hbGdfUkMyd3JhcAkJMjQ0CitpZF9zbWltZV9hbGdfRVNESAkJMjQ1CitpZF9zbWltZV9hbGdfQ01TM0RFU3dyYXAJCTI0NgoraWRfc21pbWVfYWxnX0NNU1JDMndyYXAJCTI0NworaWRfc21pbWVfY2RfbGRhcAkJMjQ4CitpZF9zbWltZV9zcHFfZXRzX3NxdF91cmkJCTI0OQoraWRfc21pbWVfc3BxX2V0c19zcXRfdW5vdGljZQkJMjUwCitpZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZPcmlnaW4JCTI1MQoraWRfc21pbWVfY3RpX2V0c19wcm9vZk9mUmVjZWlwdAkJMjUyCitpZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZEZWxpdmVyeQkJMjUzCitpZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZTZW5kZXIJCTI1NAoraWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQXBwcm92YWwJCTI1NQoraWRfc21pbWVfY3RpX2V0c19wcm9vZk9mQ3JlYXRpb24JCTI1NgorbWQ0CQkyNTcKK2lkX3BraXhfbW9kCQkyNTgKK2lkX3F0CQkyNTkKK2lkX2l0CQkyNjAKK2lkX3BraXAJCTI2MQoraWRfYWxnCQkyNjIKK2lkX2NtYwkJMjYzCitpZF9vbgkJMjY0CitpZF9wZGEJCTI2NQoraWRfYWNhCQkyNjYKK2lkX3FjcwkJMjY3CitpZF9jY3QJCTI2OAoraWRfcGtpeDFfZXhwbGljaXRfODgJCTI2OQoraWRfcGtpeDFfaW1wbGljaXRfODgJCTI3MAoraWRfcGtpeDFfZXhwbGljaXRfOTMJCTI3MQoraWRfcGtpeDFfaW1wbGljaXRfOTMJCTI3MgoraWRfbW9kX2NybWYJCTI3MworaWRfbW9kX2NtYwkJMjc0CitpZF9tb2Rfa2VhX3Byb2ZpbGVfODgJCTI3NQoraWRfbW9kX2tlYV9wcm9maWxlXzkzCQkyNzYKK2lkX21vZF9jbXAJCTI3NworaWRfbW9kX3F1YWxpZmllZF9jZXJ0Xzg4CQkyNzgKK2lkX21vZF9xdWFsaWZpZWRfY2VydF85MwkJMjc5CitpZF9tb2RfYXR0cmlidXRlX2NlcnQJCTI4MAoraWRfbW9kX3RpbWVzdGFtcF9wcm90b2NvbAkJMjgxCitpZF9tb2Rfb2NzcAkJMjgyCitpZF9tb2RfZHZjcwkJMjgzCitpZF9tb2RfY21wMjAwMAkJMjg0CitiaW9tZXRyaWNJbmZvCQkyODUKK3FjU3RhdGVtZW50cwkJMjg2CithY19hdWRpdEVudGl0eQkJMjg3CithY190YXJnZXRpbmcJCTI4OAorYWFDb250cm9scwkJMjg5CitzYmdwX2lwQWRkckJsb2NrCQkyOTAKK3NiZ3BfYXV0b25vbW91c1N5c051bQkJMjkxCitzYmdwX3JvdXRlcklkZW50aWZpZXIJCTI5MgordGV4dE5vdGljZQkJMjkzCitpcHNlY0VuZFN5c3RlbQkJMjk0CitpcHNlY1R1bm5lbAkJMjk1CitpcHNlY1VzZXIJCTI5NgorZHZjcwkJMjk3CitpZF9pdF9jYVByb3RFbmNDZXJ0CQkyOTgKK2lkX2l0X3NpZ25LZXlQYWlyVHlwZXMJCTI5OQoraWRfaXRfZW5jS2V5UGFpclR5cGVzCQkzMDAKK2lkX2l0X3ByZWZlcnJlZFN5bW1BbGcJCTMwMQoraWRfaXRfY2FLZXlVcGRhdGVJbmZvCQkzMDIKK2lkX2l0X2N1cnJlbnRDUkwJCTMwMworaWRfaXRfdW5zdXBwb3J0ZWRPSURzCQkzMDQKK2lkX2l0X3N1YnNjcmlwdGlvblJlcXVlc3QJCTMwNQoraWRfaXRfc3Vic2NyaXB0aW9uUmVzcG9uc2UJCTMwNgoraWRfaXRfa2V5UGFpclBhcmFtUmVxCQkzMDcKK2lkX2l0X2tleVBhaXJQYXJhbVJlcAkJMzA4CitpZF9pdF9yZXZQYXNzcGhyYXNlCQkzMDkKK2lkX2l0X2ltcGxpY2l0Q29uZmlybQkJMzEwCitpZF9pdF9jb25maXJtV2FpdFRpbWUJCTMxMQoraWRfaXRfb3JpZ1BLSU1lc3NhZ2UJCTMxMgoraWRfcmVnQ3RybAkJMzEzCitpZF9yZWdJbmZvCQkzMTQKK2lkX3JlZ0N0cmxfcmVnVG9rZW4JCTMxNQoraWRfcmVnQ3RybF9hdXRoZW50aWNhdG9yCQkzMTYKK2lkX3JlZ0N0cmxfcGtpUHVibGljYXRpb25JbmZvCQkzMTcKK2lkX3JlZ0N0cmxfcGtpQXJjaGl2ZU9wdGlvbnMJCTMxOAoraWRfcmVnQ3RybF9vbGRDZXJ0SUQJCTMxOQoraWRfcmVnQ3RybF9wcm90b2NvbEVuY3JLZXkJCTMyMAoraWRfcmVnSW5mb191dGY4UGFpcnMJCTMyMQoraWRfcmVnSW5mb19jZXJ0UmVxCQkzMjIKK2lkX2FsZ19kZXM0MAkJMzIzCitpZF9hbGdfbm9TaWduYXR1cmUJCTMyNAoraWRfYWxnX2RoX3NpZ19obWFjX3NoYTEJCTMyNQoraWRfYWxnX2RoX3BvcAkJMzI2CitpZF9jbWNfc3RhdHVzSW5mbwkJMzI3CitpZF9jbWNfaWRlbnRpZmljYXRpb24JCTMyOAoraWRfY21jX2lkZW50aXR5UHJvb2YJCTMyOQoraWRfY21jX2RhdGFSZXR1cm4JCTMzMAoraWRfY21jX3RyYW5zYWN0aW9uSWQJCTMzMQoraWRfY21jX3NlbmRlck5vbmNlCQkzMzIKK2lkX2NtY19yZWNpcGllbnROb25jZQkJMzMzCitpZF9jbWNfYWRkRXh0ZW5zaW9ucwkJMzM0CitpZF9jbWNfZW5jcnlwdGVkUE9QCQkzMzUKK2lkX2NtY19kZWNyeXB0ZWRQT1AJCTMzNgoraWRfY21jX2xyYVBPUFdpdG5lc3MJCTMzNworaWRfY21jX2dldENlcnQJCTMzOAoraWRfY21jX2dldENSTAkJMzM5CitpZF9jbWNfcmV2b2tlUmVxdWVzdAkJMzQwCitpZF9jbWNfcmVnSW5mbwkJMzQxCitpZF9jbWNfcmVzcG9uc2VJbmZvCQkzNDIKK2lkX2NtY19xdWVyeVBlbmRpbmcJCTM0MworaWRfY21jX3BvcExpbmtSYW5kb20JCTM0NAoraWRfY21jX3BvcExpbmtXaXRuZXNzCQkzNDUKK2lkX2NtY19jb25maXJtQ2VydEFjY2VwdGFuY2UJCTM0NgoraWRfb25fcGVyc29uYWxEYXRhCQkzNDcKK2lkX3BkYV9kYXRlT2ZCaXJ0aAkJMzQ4CitpZF9wZGFfcGxhY2VPZkJpcnRoCQkzNDkKK2lkX3BkYV9wc2V1ZG9ueW0JCTM1MAoraWRfcGRhX2dlbmRlcgkJMzUxCitpZF9wZGFfY291bnRyeU9mQ2l0aXplbnNoaXAJCTM1MgoraWRfcGRhX2NvdW50cnlPZlJlc2lkZW5jZQkJMzUzCitpZF9hY2FfYXV0aGVudGljYXRpb25JbmZvCQkzNTQKK2lkX2FjYV9hY2Nlc3NJZGVudGl0eQkJMzU1CitpZF9hY2FfY2hhcmdpbmdJZGVudGl0eQkJMzU2CitpZF9hY2FfZ3JvdXAJCTM1NworaWRfYWNhX3JvbGUJCTM1OAoraWRfcWNzX3BraXhRQ1N5bnRheF92MQkJMzU5CitpZF9jY3RfY3JzCQkzNjAKK2lkX2NjdF9QS0lEYXRhCQkzNjEKK2lkX2NjdF9QS0lSZXNwb25zZQkJMzYyCithZF90aW1lU3RhbXBpbmcJCTM2MworYWRfZHZjcwkJMzY0CitpZF9wa2l4X09DU1BfYmFzaWMJCTM2NQoraWRfcGtpeF9PQ1NQX05vbmNlCQkzNjYKK2lkX3BraXhfT0NTUF9DcmxJRAkJMzY3CitpZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcwkJMzY4CitpZF9wa2l4X09DU1Bfbm9DaGVjawkJMzY5CitpZF9wa2l4X09DU1BfYXJjaGl2ZUN1dG9mZgkJMzcwCitpZF9wa2l4X09DU1Bfc2VydmljZUxvY2F0b3IJCTM3MQoraWRfcGtpeF9PQ1NQX2V4dGVuZGVkU3RhdHVzCQkzNzIKK2lkX3BraXhfT0NTUF92YWxpZAkJMzczCitpZF9wa2l4X09DU1BfcGF0aAkJMzc0CitpZF9wa2l4X09DU1BfdHJ1c3RSb290CQkzNzUKK2FsZ29yaXRobQkJMzc2Cityc2FTaWduYXR1cmUJCTM3NworWDUwMGFsZ29yaXRobXMJCTM3OAorb3JnCQkzNzkKK2RvZAkJMzgwCitpYW5hCQkzODEKK0RpcmVjdG9yeQkJMzgyCitNYW5hZ2VtZW50CQkzODMKK0V4cGVyaW1lbnRhbAkJMzg0CitQcml2YXRlCQkzODUKK1NlY3VyaXR5CQkzODYKK1NOTVB2MgkJMzg3CitNYWlsCQkzODgKK0VudGVycHJpc2VzCQkzODkKK2RjT2JqZWN0CQkzOTAKK2RvbWFpbkNvbXBvbmVudAkJMzkxCitEb21haW4JCTM5Mgoram9pbnRfaXNvX2NjaXR0CQkzOTMKK3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcwkJMzk0CitjbGVhcmFuY2UJCTM5NQorbWQ0V2l0aFJTQUVuY3J5cHRpb24JCTM5NgorYWNfcHJveHlpbmcJCTM5Nworc2luZm9fYWNjZXNzCQkzOTgKK2lkX2FjYV9lbmNBdHRycwkJMzk5Cityb2xlCQk0MDAKK3BvbGljeV9jb25zdHJhaW50cwkJNDAxCit0YXJnZXRfaW5mb3JtYXRpb24JCTQwMgorbm9fcmV2X2F2YWlsCQk0MDMKK2NjaXR0CQk0MDQKK2Fuc2lfWDlfNjIJCTQwNQorWDlfNjJfcHJpbWVfZmllbGQJCTQwNgorWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkCQk0MDcKK1g5XzYyX2lkX2VjUHVibGljS2V5CQk0MDgKK1g5XzYyX3ByaW1lMTkydjEJCTQwOQorWDlfNjJfcHJpbWUxOTJ2MgkJNDEwCitYOV82Ml9wcmltZTE5MnYzCQk0MTEKK1g5XzYyX3ByaW1lMjM5djEJCTQxMgorWDlfNjJfcHJpbWUyMzl2MgkJNDEzCitYOV82Ml9wcmltZTIzOXYzCQk0MTQKK1g5XzYyX3ByaW1lMjU2djEJCTQxNQorZWNkc2Ffd2l0aF9TSEExCQk0MTYKK21zX2NzcF9uYW1lCQk0MTcKK2Flc18xMjhfZWNiCQk0MTgKK2Flc18xMjhfY2JjCQk0MTkKK2Flc18xMjhfb2ZiMTI4CQk0MjAKK2Flc18xMjhfY2ZiMTI4CQk0MjEKK2Flc18xOTJfZWNiCQk0MjIKK2Flc18xOTJfY2JjCQk0MjMKK2Flc18xOTJfb2ZiMTI4CQk0MjQKK2Flc18xOTJfY2ZiMTI4CQk0MjUKK2Flc18yNTZfZWNiCQk0MjYKK2Flc18yNTZfY2JjCQk0MjcKK2Flc18yNTZfb2ZiMTI4CQk0MjgKK2Flc18yNTZfY2ZiMTI4CQk0MjkKK2hvbGRfaW5zdHJ1Y3Rpb25fY29kZQkJNDMwCitob2xkX2luc3RydWN0aW9uX25vbmUJCTQzMQoraG9sZF9pbnN0cnVjdGlvbl9jYWxsX2lzc3VlcgkJNDMyCitob2xkX2luc3RydWN0aW9uX3JlamVjdAkJNDMzCitkYXRhCQk0MzQKK3BzcwkJNDM1Cit1Y2wJCTQzNgorcGlsb3QJCTQzNworcGlsb3RBdHRyaWJ1dGVUeXBlCQk0MzgKK3BpbG90QXR0cmlidXRlU3ludGF4CQk0MzkKK3BpbG90T2JqZWN0Q2xhc3MJCTQ0MAorcGlsb3RHcm91cHMJCTQ0MQoraUE1U3RyaW5nU3ludGF4CQk0NDIKK2Nhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgJCTQ0MworcGlsb3RPYmplY3QJCTQ0NAorcGlsb3RQZXJzb24JCTQ0NQorYWNjb3VudAkJNDQ2Citkb2N1bWVudAkJNDQ3Cityb29tCQk0NDgKK2RvY3VtZW50U2VyaWVzCQk0NDkKK3JGQzgyMmxvY2FsUGFydAkJNDUwCitkTlNEb21haW4JCTQ1MQorZG9tYWluUmVsYXRlZE9iamVjdAkJNDUyCitmcmllbmRseUNvdW50cnkJCTQ1Mworc2ltcGxlU2VjdXJpdHlPYmplY3QJCTQ1NAorcGlsb3RPcmdhbml6YXRpb24JCTQ1NQorcGlsb3REU0EJCTQ1NgorcXVhbGl0eUxhYmVsbGVkRGF0YQkJNDU3Cit1c2VySWQJCTQ1OAordGV4dEVuY29kZWRPUkFkZHJlc3MJCTQ1OQorcmZjODIyTWFpbGJveAkJNDYwCitpbmZvCQk0NjEKK2Zhdm91cml0ZURyaW5rCQk0NjIKK3Jvb21OdW1iZXIJCTQ2MworcGhvdG8JCTQ2NAordXNlckNsYXNzCQk0NjUKK2hvc3QJCTQ2NgorbWFuYWdlcgkJNDY3Citkb2N1bWVudElkZW50aWZpZXIJCTQ2OAorZG9jdW1lbnRUaXRsZQkJNDY5Citkb2N1bWVudFZlcnNpb24JCTQ3MAorZG9jdW1lbnRBdXRob3IJCTQ3MQorZG9jdW1lbnRMb2NhdGlvbgkJNDcyCitob21lVGVsZXBob25lTnVtYmVyCQk0NzMKK3NlY3JldGFyeQkJNDc0CitvdGhlck1haWxib3gJCTQ3NQorbGFzdE1vZGlmaWVkVGltZQkJNDc2CitsYXN0TW9kaWZpZWRCeQkJNDc3CithUmVjb3JkCQk0NzgKK3BpbG90QXR0cmlidXRlVHlwZTI3CQk0NzkKK21YUmVjb3JkCQk0ODAKK25TUmVjb3JkCQk0ODEKK3NPQVJlY29yZAkJNDgyCitjTkFNRVJlY29yZAkJNDgzCithc3NvY2lhdGVkRG9tYWluCQk0ODQKK2Fzc29jaWF0ZWROYW1lCQk0ODUKK2hvbWVQb3N0YWxBZGRyZXNzCQk0ODYKK3BlcnNvbmFsVGl0bGUJCTQ4NworbW9iaWxlVGVsZXBob25lTnVtYmVyCQk0ODgKK3BhZ2VyVGVsZXBob25lTnVtYmVyCQk0ODkKK2ZyaWVuZGx5Q291bnRyeU5hbWUJCTQ5MAorb3JnYW5pemF0aW9uYWxTdGF0dXMJCTQ5MQoramFuZXRNYWlsYm94CQk0OTIKK21haWxQcmVmZXJlbmNlT3B0aW9uCQk0OTMKK2J1aWxkaW5nTmFtZQkJNDk0CitkU0FRdWFsaXR5CQk0OTUKK3NpbmdsZUxldmVsUXVhbGl0eQkJNDk2CitzdWJ0cmVlTWluaW11bVF1YWxpdHkJCTQ5Nworc3VidHJlZU1heGltdW1RdWFsaXR5CQk0OTgKK3BlcnNvbmFsU2lnbmF0dXJlCQk0OTkKK2RJVFJlZGlyZWN0CQk1MDAKK2F1ZGlvCQk1MDEKK2RvY3VtZW50UHVibGlzaGVyCQk1MDIKK3g1MDBVbmlxdWVJZGVudGlmaWVyCQk1MDMKK21pbWVfbWhzCQk1MDQKK21pbWVfbWhzX2hlYWRpbmdzCQk1MDUKK21pbWVfbWhzX2JvZGllcwkJNTA2CitpZF9oZXhfcGFydGlhbF9tZXNzYWdlCQk1MDcKK2lkX2hleF9tdWx0aXBhcnRfbWVzc2FnZQkJNTA4CitnZW5lcmF0aW9uUXVhbGlmaWVyCQk1MDkKK3BzZXVkb255bQkJNTEwCitJbnRlcm5hdGlvbmFsUkEJCTUxMQoraWRfc2V0CQk1MTIKK3NldF9jdHlwZQkJNTEzCitzZXRfbXNnRXh0CQk1MTQKK3NldF9hdHRyCQk1MTUKK3NldF9wb2xpY3kJCTUxNgorc2V0X2NlcnRFeHQJCTUxNworc2V0X2JyYW5kCQk1MTgKK3NldGN0X1BBTkRhdGEJCTUxOQorc2V0Y3RfUEFOVG9rZW4JCTUyMAorc2V0Y3RfUEFOT25seQkJNTIxCitzZXRjdF9PSURhdGEJCTUyMgorc2V0Y3RfUEkJCTUyMworc2V0Y3RfUElEYXRhCQk1MjQKK3NldGN0X1BJRGF0YVVuc2lnbmVkCQk1MjUKK3NldGN0X0hPRElucHV0CQk1MjYKK3NldGN0X0F1dGhSZXNCYWdnYWdlCQk1MjcKK3NldGN0X0F1dGhSZXZSZXFCYWdnYWdlCQk1MjgKK3NldGN0X0F1dGhSZXZSZXNCYWdnYWdlCQk1MjkKK3NldGN0X0NhcFRva2VuU2VxCQk1MzAKK3NldGN0X1BJbml0UmVzRGF0YQkJNTMxCitzZXRjdF9QSV9UQlMJCTUzMgorc2V0Y3RfUFJlc0RhdGEJCTUzMworc2V0Y3RfQXV0aFJlcVRCUwkJNTM0CitzZXRjdF9BdXRoUmVzVEJTCQk1MzUKK3NldGN0X0F1dGhSZXNUQlNYCQk1MzYKK3NldGN0X0F1dGhUb2tlblRCUwkJNTM3CitzZXRjdF9DYXBUb2tlbkRhdGEJCTUzOAorc2V0Y3RfQ2FwVG9rZW5UQlMJCTUzOQorc2V0Y3RfQWNxQ2FyZENvZGVNc2cJCTU0MAorc2V0Y3RfQXV0aFJldlJlcVRCUwkJNTQxCitzZXRjdF9BdXRoUmV2UmVzRGF0YQkJNTQyCitzZXRjdF9BdXRoUmV2UmVzVEJTCQk1NDMKK3NldGN0X0NhcFJlcVRCUwkJNTQ0CitzZXRjdF9DYXBSZXFUQlNYCQk1NDUKK3NldGN0X0NhcFJlc0RhdGEJCTU0Ngorc2V0Y3RfQ2FwUmV2UmVxVEJTCQk1NDcKK3NldGN0X0NhcFJldlJlcVRCU1gJCTU0OAorc2V0Y3RfQ2FwUmV2UmVzRGF0YQkJNTQ5CitzZXRjdF9DcmVkUmVxVEJTCQk1NTAKK3NldGN0X0NyZWRSZXFUQlNYCQk1NTEKK3NldGN0X0NyZWRSZXNEYXRhCQk1NTIKK3NldGN0X0NyZWRSZXZSZXFUQlMJCTU1Mworc2V0Y3RfQ3JlZFJldlJlcVRCU1gJCTU1NAorc2V0Y3RfQ3JlZFJldlJlc0RhdGEJCTU1NQorc2V0Y3RfUENlcnRSZXFEYXRhCQk1NTYKK3NldGN0X1BDZXJ0UmVzVEJTCQk1NTcKK3NldGN0X0JhdGNoQWRtaW5SZXFEYXRhCQk1NTgKK3NldGN0X0JhdGNoQWRtaW5SZXNEYXRhCQk1NTkKK3NldGN0X0NhcmRDSW5pdFJlc1RCUwkJNTYwCitzZXRjdF9NZUFxQ0luaXRSZXNUQlMJCTU2MQorc2V0Y3RfUmVnRm9ybVJlc1RCUwkJNTYyCitzZXRjdF9DZXJ0UmVxRGF0YQkJNTYzCitzZXRjdF9DZXJ0UmVxVEJTCQk1NjQKK3NldGN0X0NlcnRSZXNEYXRhCQk1NjUKK3NldGN0X0NlcnRJbnFSZXFUQlMJCTU2Ngorc2V0Y3RfRXJyb3JUQlMJCTU2Nworc2V0Y3RfUElEdWFsU2lnbmVkVEJFCQk1NjgKK3NldGN0X1BJVW5zaWduZWRUQkUJCTU2OQorc2V0Y3RfQXV0aFJlcVRCRQkJNTcwCitzZXRjdF9BdXRoUmVzVEJFCQk1NzEKK3NldGN0X0F1dGhSZXNUQkVYCQk1NzIKK3NldGN0X0F1dGhUb2tlblRCRQkJNTczCitzZXRjdF9DYXBUb2tlblRCRQkJNTc0CitzZXRjdF9DYXBUb2tlblRCRVgJCTU3NQorc2V0Y3RfQWNxQ2FyZENvZGVNc2dUQkUJCTU3Ngorc2V0Y3RfQXV0aFJldlJlcVRCRQkJNTc3CitzZXRjdF9BdXRoUmV2UmVzVEJFCQk1NzgKK3NldGN0X0F1dGhSZXZSZXNUQkVCCQk1NzkKK3NldGN0X0NhcFJlcVRCRQkJNTgwCitzZXRjdF9DYXBSZXFUQkVYCQk1ODEKK3NldGN0X0NhcFJlc1RCRQkJNTgyCitzZXRjdF9DYXBSZXZSZXFUQkUJCTU4Mworc2V0Y3RfQ2FwUmV2UmVxVEJFWAkJNTg0CitzZXRjdF9DYXBSZXZSZXNUQkUJCTU4NQorc2V0Y3RfQ3JlZFJlcVRCRQkJNTg2CitzZXRjdF9DcmVkUmVxVEJFWAkJNTg3CitzZXRjdF9DcmVkUmVzVEJFCQk1ODgKK3NldGN0X0NyZWRSZXZSZXFUQkUJCTU4OQorc2V0Y3RfQ3JlZFJldlJlcVRCRVgJCTU5MAorc2V0Y3RfQ3JlZFJldlJlc1RCRQkJNTkxCitzZXRjdF9CYXRjaEFkbWluUmVxVEJFCQk1OTIKK3NldGN0X0JhdGNoQWRtaW5SZXNUQkUJCTU5Mworc2V0Y3RfUmVnRm9ybVJlcVRCRQkJNTk0CitzZXRjdF9DZXJ0UmVxVEJFCQk1OTUKK3NldGN0X0NlcnRSZXFUQkVYCQk1OTYKK3NldGN0X0NlcnRSZXNUQkUJCTU5Nworc2V0Y3RfQ1JMTm90aWZpY2F0aW9uVEJTCQk1OTgKK3NldGN0X0NSTE5vdGlmaWNhdGlvblJlc1RCUwkJNTk5CitzZXRjdF9CQ0lEaXN0cmlidXRpb25UQlMJCTYwMAorc2V0ZXh0X2dlbkNyeXB0CQk2MDEKK3NldGV4dF9taUF1dGgJCTYwMgorc2V0ZXh0X3BpblNlY3VyZQkJNjAzCitzZXRleHRfcGluQW55CQk2MDQKK3NldGV4dF90cmFjazIJCTYwNQorc2V0ZXh0X2N2CQk2MDYKK3NldF9wb2xpY3lfcm9vdAkJNjA3CitzZXRDZXh0X2hhc2hlZFJvb3QJCTYwOAorc2V0Q2V4dF9jZXJ0VHlwZQkJNjA5CitzZXRDZXh0X21lcmNoRGF0YQkJNjEwCitzZXRDZXh0X2NDZXJ0UmVxdWlyZWQJCTYxMQorc2V0Q2V4dF90dW5uZWxpbmcJCTYxMgorc2V0Q2V4dF9zZXRFeHQJCTYxMworc2V0Q2V4dF9zZXRRdWFsZgkJNjE0CitzZXRDZXh0X1BHV1ljYXBhYmlsaXRpZXMJCTYxNQorc2V0Q2V4dF9Ub2tlbklkZW50aWZpZXIJCTYxNgorc2V0Q2V4dF9UcmFjazJEYXRhCQk2MTcKK3NldENleHRfVG9rZW5UeXBlCQk2MTgKK3NldENleHRfSXNzdWVyQ2FwYWJpbGl0aWVzCQk2MTkKK3NldEF0dHJfQ2VydAkJNjIwCitzZXRBdHRyX1BHV1ljYXAJCTYyMQorc2V0QXR0cl9Ub2tlblR5cGUJCTYyMgorc2V0QXR0cl9Jc3NDYXAJCTYyMworc2V0X3Jvb3RLZXlUaHVtYgkJNjI0CitzZXRfYWRkUG9saWN5CQk2MjUKK3NldEF0dHJfVG9rZW5fRU1WCQk2MjYKK3NldEF0dHJfVG9rZW5fQjBQcmltZQkJNjI3CitzZXRBdHRyX0lzc0NhcF9DVk0JCTYyOAorc2V0QXR0cl9Jc3NDYXBfVDIJCTYyOQorc2V0QXR0cl9Jc3NDYXBfU2lnCQk2MzAKK3NldEF0dHJfR2VuQ3J5cHRncm0JCTYzMQorc2V0QXR0cl9UMkVuYwkJNjMyCitzZXRBdHRyX1QyY2xlYXJ0eHQJCTYzMworc2V0QXR0cl9Ub2tJQ0NzaWcJCTYzNAorc2V0QXR0cl9TZWNEZXZTaWcJCTYzNQorc2V0X2JyYW5kX0lBVEFfQVRBCQk2MzYKK3NldF9icmFuZF9EaW5lcnMJCTYzNworc2V0X2JyYW5kX0FtZXJpY2FuRXhwcmVzcwkJNjM4CitzZXRfYnJhbmRfSkNCCQk2MzkKK3NldF9icmFuZF9WaXNhCQk2NDAKK3NldF9icmFuZF9NYXN0ZXJDYXJkCQk2NDEKK3NldF9icmFuZF9Ob3Z1cwkJNjQyCitkZXNfY2RtZgkJNjQzCityc2FPQUVQRW5jcnlwdGlvblNFVAkJNjQ0CitpdHVfdAkJNjQ1Citqb2ludF9pc29faXR1X3QJCTY0NgoraW50ZXJuYXRpb25hbF9vcmdhbml6YXRpb25zCQk2NDcKK21zX3NtYXJ0Y2FyZF9sb2dpbgkJNjQ4Cittc191cG4JCTY0OQorYWVzXzEyOF9jZmIxCQk2NTAKK2Flc18xOTJfY2ZiMQkJNjUxCithZXNfMjU2X2NmYjEJCTY1MgorYWVzXzEyOF9jZmI4CQk2NTMKK2Flc18xOTJfY2ZiOAkJNjU0CithZXNfMjU2X2NmYjgJCTY1NQorZGVzX2NmYjEJCTY1NgorZGVzX2NmYjgJCTY1NworZGVzX2VkZTNfY2ZiMQkJNjU4CitkZXNfZWRlM19jZmI4CQk2NTkKK3N0cmVldEFkZHJlc3MJCTY2MAorcG9zdGFsQ29kZQkJNjYxCitpZF9wcGwJCTY2MgorcHJveHlDZXJ0SW5mbwkJNjYzCitpZF9wcGxfYW55TGFuZ3VhZ2UJCTY2NAoraWRfcHBsX2luaGVyaXRBbGwJCTY2NQorbmFtZV9jb25zdHJhaW50cwkJNjY2CitJbmRlcGVuZGVudAkJNjY3CitzaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgkJNjY4CitzaGEzODRXaXRoUlNBRW5jcnlwdGlvbgkJNjY5CitzaGE1MTJXaXRoUlNBRW5jcnlwdGlvbgkJNjcwCitzaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgkJNjcxCitzaGEyNTYJCTY3Mgorc2hhMzg0CQk2NzMKK3NoYTUxMgkJNjc0CitzaGEyMjQJCTY3NQoraWRlbnRpZmllZF9vcmdhbml6YXRpb24JCTY3NgorY2VydGljb21fYXJjCQk2NzcKK3dhcAkJNjc4Cit3YXBfd3NnCQk2NzkKK1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcwkJNjgwCitYOV82Ml9vbkJhc2lzCQk2ODEKK1g5XzYyX3RwQmFzaXMJCTY4MgorWDlfNjJfcHBCYXNpcwkJNjgzCitYOV82Ml9jMnBuYjE2M3YxCQk2ODQKK1g5XzYyX2MycG5iMTYzdjIJCTY4NQorWDlfNjJfYzJwbmIxNjN2MwkJNjg2CitYOV82Ml9jMnBuYjE3NnYxCQk2ODcKK1g5XzYyX2MydG5iMTkxdjEJCTY4OAorWDlfNjJfYzJ0bmIxOTF2MgkJNjg5CitYOV82Ml9jMnRuYjE5MXYzCQk2OTAKK1g5XzYyX2Myb25iMTkxdjQJCTY5MQorWDlfNjJfYzJvbmIxOTF2NQkJNjkyCitYOV82Ml9jMnBuYjIwOHcxCQk2OTMKK1g5XzYyX2MydG5iMjM5djEJCTY5NAorWDlfNjJfYzJ0bmIyMzl2MgkJNjk1CitYOV82Ml9jMnRuYjIzOXYzCQk2OTYKK1g5XzYyX2Myb25iMjM5djQJCTY5NworWDlfNjJfYzJvbmIyMzl2NQkJNjk4CitYOV82Ml9jMnBuYjI3MncxCQk2OTkKK1g5XzYyX2MycG5iMzA0dzEJCTcwMAorWDlfNjJfYzJ0bmIzNTl2MQkJNzAxCitYOV82Ml9jMnBuYjM2OHcxCQk3MDIKK1g5XzYyX2MydG5iNDMxcjEJCTcwMworc2VjcDExMnIxCQk3MDQKK3NlY3AxMTJyMgkJNzA1CitzZWNwMTI4cjEJCTcwNgorc2VjcDEyOHIyCQk3MDcKK3NlY3AxNjBrMQkJNzA4CitzZWNwMTYwcjEJCTcwOQorc2VjcDE2MHIyCQk3MTAKK3NlY3AxOTJrMQkJNzExCitzZWNwMjI0azEJCTcxMgorc2VjcDIyNHIxCQk3MTMKK3NlY3AyNTZrMQkJNzE0CitzZWNwMzg0cjEJCTcxNQorc2VjcDUyMXIxCQk3MTYKK3NlY3QxMTNyMQkJNzE3CitzZWN0MTEzcjIJCTcxOAorc2VjdDEzMXIxCQk3MTkKK3NlY3QxMzFyMgkJNzIwCitzZWN0MTYzazEJCTcyMQorc2VjdDE2M3IxCQk3MjIKK3NlY3QxNjNyMgkJNzIzCitzZWN0MTkzcjEJCTcyNAorc2VjdDE5M3IyCQk3MjUKK3NlY3QyMzNrMQkJNzI2CitzZWN0MjMzcjEJCTcyNworc2VjdDIzOWsxCQk3MjgKK3NlY3QyODNrMQkJNzI5CitzZWN0MjgzcjEJCTczMAorc2VjdDQwOWsxCQk3MzEKK3NlY3Q0MDlyMQkJNzMyCitzZWN0NTcxazEJCTczMworc2VjdDU3MXIxCQk3MzQKK3dhcF93c2dfaWRtX2VjaWRfd3RsczEJCTczNQord2FwX3dzZ19pZG1fZWNpZF93dGxzMwkJNzM2Cit3YXBfd3NnX2lkbV9lY2lkX3d0bHM0CQk3MzcKK3dhcF93c2dfaWRtX2VjaWRfd3RsczUJCTczOAord2FwX3dzZ19pZG1fZWNpZF93dGxzNgkJNzM5Cit3YXBfd3NnX2lkbV9lY2lkX3d0bHM3CQk3NDAKK3dhcF93c2dfaWRtX2VjaWRfd3RsczgJCTc0MQord2FwX3dzZ19pZG1fZWNpZF93dGxzOQkJNzQyCit3YXBfd3NnX2lkbV9lY2lkX3d0bHMxMAkJNzQzCit3YXBfd3NnX2lkbV9lY2lkX3d0bHMxMQkJNzQ0Cit3YXBfd3NnX2lkbV9lY2lkX3d0bHMxMgkJNzQ1CithbnlfcG9saWN5CQk3NDYKK3BvbGljeV9tYXBwaW5ncwkJNzQ3CitpbmhpYml0X2FueV9wb2xpY3kJCTc0OAoraXBzZWMzCQk3NDkKK2lwc2VjNAkJNzUwCitjYW1lbGxpYV8xMjhfY2JjCQk3NTEKK2NhbWVsbGlhXzE5Ml9jYmMJCTc1MgorY2FtZWxsaWFfMjU2X2NiYwkJNzUzCitjYW1lbGxpYV8xMjhfZWNiCQk3NTQKK2NhbWVsbGlhXzE5Ml9lY2IJCTc1NQorY2FtZWxsaWFfMjU2X2VjYgkJNzU2CitjYW1lbGxpYV8xMjhfY2ZiMTI4CQk3NTcKK2NhbWVsbGlhXzE5Ml9jZmIxMjgJCTc1OAorY2FtZWxsaWFfMjU2X2NmYjEyOAkJNzU5CitjYW1lbGxpYV8xMjhfY2ZiMQkJNzYwCitjYW1lbGxpYV8xOTJfY2ZiMQkJNzYxCitjYW1lbGxpYV8yNTZfY2ZiMQkJNzYyCitjYW1lbGxpYV8xMjhfY2ZiOAkJNzYzCitjYW1lbGxpYV8xOTJfY2ZiOAkJNzY0CitjYW1lbGxpYV8yNTZfY2ZiOAkJNzY1CitjYW1lbGxpYV8xMjhfb2ZiMTI4CQk3NjYKK2NhbWVsbGlhXzE5Ml9vZmIxMjgJCTc2NworY2FtZWxsaWFfMjU2X29mYjEyOAkJNzY4CitzdWJqZWN0X2RpcmVjdG9yeV9hdHRyaWJ1dGVzCQk3NjkKK2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50CQk3NzAKK2NlcnRpZmljYXRlX2lzc3VlcgkJNzcxCitrb3JlYQkJNzcyCitraXNhCQk3NzMKK2tmdGMJCTc3NAorbnBraV9hbGcJCTc3NQorc2VlZF9lY2IJCTc3Ngorc2VlZF9jYmMJCTc3Nworc2VlZF9vZmIxMjgJCTc3OAorc2VlZF9jZmIxMjgJCTc3OQoraG1hY19tZDUJCTc4MAoraG1hY19zaGExCQk3ODEKK2lkX1Bhc3N3b3JkQmFzZWRNQUMJCTc4MgoraWRfREhCYXNlZE1hYwkJNzgzCitpZF9pdF9zdXBwTGFuZ1RhZ3MJCTc4NAorY2FSZXBvc2l0b3J5CQk3ODUKK2lkX3NtaW1lX2N0X2NvbXByZXNzZWREYXRhCQk3ODYKK2lkX2N0X2FzY2lpVGV4dFdpdGhDUkxGCQk3ODcKK2lkX2FlczEyOF93cmFwCQk3ODgKK2lkX2FlczE5Ml93cmFwCQk3ODkKK2lkX2FlczI1Nl93cmFwCQk3OTAKK2VjZHNhX3dpdGhfUmVjb21tZW5kZWQJCTc5MQorZWNkc2Ffd2l0aF9TcGVjaWZpZWQJCTc5MgorZWNkc2Ffd2l0aF9TSEEyMjQJCTc5MworZWNkc2Ffd2l0aF9TSEEyNTYJCTc5NAorZWNkc2Ffd2l0aF9TSEEzODQJCTc5NQorZWNkc2Ffd2l0aF9TSEE1MTIJCTc5NgoraG1hY1dpdGhNRDUJCTc5NworaG1hY1dpdGhTSEEyMjQJCTc5OAoraG1hY1dpdGhTSEEyNTYJCTc5OQoraG1hY1dpdGhTSEEzODQJCTgwMAoraG1hY1dpdGhTSEE1MTIJCTgwMQorZHNhX3dpdGhfU0hBMjI0CQk4MDIKK2RzYV93aXRoX1NIQTI1NgkJODAzCit3aGlybHBvb2wJCTgwNAorY3J5cHRvcHJvCQk4MDUKK2NyeXB0b2NvbQkJODA2CitpZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMQkJODA3CitpZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTQJCTgwOAoraWRfR29zdFIzNDExXzk0CQk4MDkKK2lkX0hNQUNHb3N0UjM0MTFfOTQJCTgxMAoraWRfR29zdFIzNDEwXzIwMDEJCTgxMQoraWRfR29zdFIzNDEwXzk0CQk4MTIKK2lkX0dvc3QyODE0N184OQkJODEzCitnb3N0ODlfY250CQk4MTQKK2lkX0dvc3QyODE0N184OV9NQUMJCTgxNQoraWRfR29zdFIzNDExXzk0X3ByZgkJODE2CitpZF9Hb3N0UjM0MTBfMjAwMURICQk4MTcKK2lkX0dvc3RSMzQxMF85NERICQk4MTgKK2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fS2V5TWVzaGluZwkJODE5CitpZF9Hb3N0MjgxNDdfODlfTm9uZV9LZXlNZXNoaW5nCQk4MjAKK2lkX0dvc3RSMzQxMV85NF9UZXN0UGFyYW1TZXQJCTgyMQoraWRfR29zdFIzNDExXzk0X0NyeXB0b1Byb1BhcmFtU2V0CQk4MjIKK2lkX0dvc3QyODE0N184OV9UZXN0UGFyYW1TZXQJCTgyMworaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19BX1BhcmFtU2V0CQk4MjQKK2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJODI1CitpZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCTgyNgoraWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19EX1BhcmFtU2V0CQk4MjcKK2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8xX1BhcmFtU2V0CQk4MjgKK2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8wX1BhcmFtU2V0CQk4MjkKK2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fUklDXzFfUGFyYW1TZXQJCTgzMAoraWRfR29zdFIzNDEwXzk0X1Rlc3RQYXJhbVNldAkJODMxCitpZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0FfUGFyYW1TZXQJCTgzMgoraWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19CX1BhcmFtU2V0CQk4MzMKK2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJODM0CitpZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0RfUGFyYW1TZXQJCTgzNQoraWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0CQk4MzYKK2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQl9QYXJhbVNldAkJODM3CitpZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaENfUGFyYW1TZXQJCTgzOAoraWRfR29zdFIzNDEwXzIwMDFfVGVzdFBhcmFtU2V0CQk4MzkKK2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19BX1BhcmFtU2V0CQk4NDAKK2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19CX1BhcmFtU2V0CQk4NDEKK2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19DX1BhcmFtU2V0CQk4NDIKK2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0CQk4NDMKK2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hCX1BhcmFtU2V0CQk4NDQKK2lkX0dvc3RSMzQxMF85NF9hCQk4NDUKK2lkX0dvc3RSMzQxMF85NF9hQmlzCQk4NDYKK2lkX0dvc3RSMzQxMF85NF9iCQk4NDcKK2lkX0dvc3RSMzQxMF85NF9iQmlzCQk4NDgKK2lkX0dvc3QyODE0N184OV9jYwkJODQ5CitpZF9Hb3N0UjM0MTBfOTRfY2MJCTg1MAoraWRfR29zdFIzNDEwXzIwMDFfY2MJCTg1MQoraWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0X2NjCQk4NTIKK2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxX2NjCQk4NTMKK2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjCQk4NTQKK2htYWMJCTg1NQorTG9jYWxLZXlTZXQJCTg1NgorZnJlc2hlc3RfY3JsCQk4NTcKK2lkX29uX3Blcm1hbmVudElkZW50aWZpZXIJCTg1OAorc2VhcmNoR3VpZGUJCTg1OQorYnVzaW5lc3NDYXRlZ29yeQkJODYwCitwb3N0YWxBZGRyZXNzCQk4NjEKK3Bvc3RPZmZpY2VCb3gJCTg2MgorcGh5c2ljYWxEZWxpdmVyeU9mZmljZU5hbWUJCTg2MwordGVsZXBob25lTnVtYmVyCQk4NjQKK3RlbGV4TnVtYmVyCQk4NjUKK3RlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIJCTg2NgorZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyCQk4NjcKK3gxMjFBZGRyZXNzCQk4NjgKK2ludGVybmF0aW9uYWxpU0ROTnVtYmVyCQk4NjkKK3JlZ2lzdGVyZWRBZGRyZXNzCQk4NzAKK2Rlc3RpbmF0aW9uSW5kaWNhdG9yCQk4NzEKK3ByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kCQk4NzIKK3ByZXNlbnRhdGlvbkFkZHJlc3MJCTg3Mworc3VwcG9ydGVkQXBwbGljYXRpb25Db250ZXh0CQk4NzQKK21lbWJlcgkJODc1Citvd25lcgkJODc2Cityb2xlT2NjdXBhbnQJCTg3Nworc2VlQWxzbwkJODc4Cit1c2VyUGFzc3dvcmQJCTg3OQordXNlckNlcnRpZmljYXRlCQk4ODAKK2NBQ2VydGlmaWNhdGUJCTg4MQorYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QJCTg4MgorY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdAkJODgzCitjcm9zc0NlcnRpZmljYXRlUGFpcgkJODg0CitlbmhhbmNlZFNlYXJjaEd1aWRlCQk4ODUKK3Byb3RvY29sSW5mb3JtYXRpb24JCTg4NgorZGlzdGluZ3Vpc2hlZE5hbWUJCTg4NwordW5pcXVlTWVtYmVyCQk4ODgKK2hvdXNlSWRlbnRpZmllcgkJODg5CitzdXBwb3J0ZWRBbGdvcml0aG1zCQk4OTAKK2RlbHRhUmV2b2NhdGlvbkxpc3QJCTg5MQorZG1kTmFtZQkJODkyCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfeHJlZi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqX3hyZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTJlY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqX3hyZWYuYwpAQCAtMCwwICsxLDIzMSBAQAorLyogY3J5cHRvL29iamVjdHMvb2JqX3hyZWYuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgIm9ial94cmVmLmgiCisKK0RFQ0xBUkVfU1RBQ0tfT0YobmlkX3RyaXBsZSkKK1NUQUNLX09GKG5pZF90cmlwbGUpICpzaWdfYXBwLCAqc2lneF9hcHA7CisKK3N0YXRpYyBpbnQgc2lnX2NtcChjb25zdCBuaWRfdHJpcGxlICphLCBjb25zdCBuaWRfdHJpcGxlICpiKQorCXsKKwlyZXR1cm4gYS0+c2lnbl9pZCAtIGItPnNpZ25faWQ7CisJfQorCitERUNMQVJFX09CSl9CU0VBUkNIX0NNUF9GTihuaWRfdHJpcGxlLCBuaWRfdHJpcGxlLCBzaWcpOworSU1QTEVNRU5UX09CSl9CU0VBUkNIX0NNUF9GTihuaWRfdHJpcGxlLCBuaWRfdHJpcGxlLCBzaWcpOworCitzdGF0aWMgaW50IHNpZ19za19jbXAoY29uc3QgbmlkX3RyaXBsZSAqIGNvbnN0ICphLCBjb25zdCBuaWRfdHJpcGxlICogY29uc3QgKmIpCisJeworCXJldHVybiAoKmEpLT5zaWduX2lkIC0gKCpiKS0+c2lnbl9pZDsKKwl9CisKK0RFQ0xBUkVfT0JKX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IG5pZF90cmlwbGUgKiwgY29uc3QgbmlkX3RyaXBsZSAqLCBzaWd4KTsKKworc3RhdGljIGludCBzaWd4X2NtcChjb25zdCBuaWRfdHJpcGxlICogY29uc3QgKmEsIGNvbnN0IG5pZF90cmlwbGUgKiBjb25zdCAqYikKKwl7CisJaW50IHJldDsKKwlyZXQgPSAoKmEpLT5oYXNoX2lkIC0gKCpiKS0+aGFzaF9pZDsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiAoKmEpLT5wa2V5X2lkIC0gKCpiKS0+cGtleV9pZDsKKwl9CisKK0lNUExFTUVOVF9PQkpfQlNFQVJDSF9DTVBfRk4oY29uc3QgbmlkX3RyaXBsZSAqLCBjb25zdCBuaWRfdHJpcGxlICosIHNpZ3gpOworCitpbnQgT0JKX2ZpbmRfc2lnaWRfYWxncyhpbnQgc2lnbmlkLCBpbnQgKnBkaWdfbmlkLCBpbnQgKnBwa2V5X25pZCkKKwl7CisJbmlkX3RyaXBsZSB0bXA7CisJY29uc3QgbmlkX3RyaXBsZSAqcnYgPSBOVUxMOworCXRtcC5zaWduX2lkID0gc2lnbmlkOworCisJaWYgKHNpZ19hcHApCisJCXsKKwkJaW50IGlkeCA9IHNrX25pZF90cmlwbGVfZmluZChzaWdfYXBwLCAmdG1wKTsKKwkJaWYgKGlkeCA+PSAwKQorCQkJcnYgPSBza19uaWRfdHJpcGxlX3ZhbHVlKHNpZ19hcHAsIGlkeCk7CisJCX0KKworI2lmbmRlZiBPQkpfWFJFRl9URVNUMgorCWlmIChydiA9PSBOVUxMKQorCQl7CisJCXJ2ID0gT0JKX2JzZWFyY2hfc2lnKCZ0bXAsIHNpZ29pZF9zcnQsCisJCQkJIHNpemVvZihzaWdvaWRfc3J0KSAvIHNpemVvZihuaWRfdHJpcGxlKSk7CisJCX0KKyNlbmRpZgorCWlmIChydiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkqcGRpZ19uaWQgPSBydi0+aGFzaF9pZDsKKwkqcHBrZXlfbmlkID0gcnYtPnBrZXlfaWQ7CisJcmV0dXJuIDE7CisJfQorCitpbnQgT0JKX2ZpbmRfc2lnaWRfYnlfYWxncyhpbnQgKnBzaWduaWQsIGludCBkaWdfbmlkLCBpbnQgcGtleV9uaWQpCisJeworCW5pZF90cmlwbGUgdG1wOworCWNvbnN0IG5pZF90cmlwbGUgKnQ9JnRtcDsKKwljb25zdCBuaWRfdHJpcGxlICoqcnYgPSBOVUxMOworCisJdG1wLmhhc2hfaWQgPSBkaWdfbmlkOworCXRtcC5wa2V5X2lkID0gcGtleV9uaWQ7CisKKwlpZiAoc2lneF9hcHApCisJCXsKKwkJaW50IGlkeCA9IHNrX25pZF90cmlwbGVfZmluZChzaWd4X2FwcCwgJnRtcCk7CisJCWlmIChpZHggPj0gMCkKKwkJCXsKKwkJCXQgPSBza19uaWRfdHJpcGxlX3ZhbHVlKHNpZ3hfYXBwLCBpZHgpOworCQkJcnYgPSAmdDsKKwkJCX0KKwkJfQorCisjaWZuZGVmIE9CSl9YUkVGX1RFU1QyCisJaWYgKHJ2ID09IE5VTEwpCisJCXsKKwkJcnYgPSBPQkpfYnNlYXJjaF9zaWd4KCZ0LCBzaWdvaWRfc3J0X3hyZWYsCisJCQkJIHNpemVvZihzaWdvaWRfc3J0X3hyZWYpIC8gc2l6ZW9mKG5pZF90cmlwbGUgKikKKwkJCQkgKTsKKwkJfQorI2VuZGlmCisJaWYgKHJ2ID09IE5VTEwpCisJCXJldHVybiAwOworCSpwc2lnbmlkID0gKCpydiktPnNpZ25faWQ7CisJcmV0dXJuIDE7CisJfQorCitpbnQgT0JKX2FkZF9zaWdpZChpbnQgc2lnbmlkLCBpbnQgZGlnX2lkLCBpbnQgcGtleV9pZCkKKwl7CisJbmlkX3RyaXBsZSAqbnRyOworCWlmICghc2lnX2FwcCkKKwkJc2lnX2FwcCA9IHNrX25pZF90cmlwbGVfbmV3KHNpZ19za19jbXApOworCWlmICghc2lnX2FwcCkKKwkJcmV0dXJuIDA7CisJaWYgKCFzaWd4X2FwcCkKKwkJc2lneF9hcHAgPSBza19uaWRfdHJpcGxlX25ldyhzaWd4X2NtcCk7CisJaWYgKCFzaWd4X2FwcCkKKwkJcmV0dXJuIDA7CisJbnRyID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKGludCkgKiAzKTsKKwlpZiAoIW50cikKKwkJcmV0dXJuIDA7CisJbnRyLT5zaWduX2lkID0gc2lnbmlkOworCW50ci0+aGFzaF9pZCA9IGRpZ19pZDsKKwludHItPnBrZXlfaWQgPSBwa2V5X2lkOworCisJaWYgKCFza19uaWRfdHJpcGxlX3B1c2goc2lnX2FwcCwgbnRyKSkKKwkJeworCQlPUEVOU1NMX2ZyZWUobnRyKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmICghc2tfbmlkX3RyaXBsZV9wdXNoKHNpZ3hfYXBwLCBudHIpKQorCQlyZXR1cm4gMDsKKworCXNrX25pZF90cmlwbGVfc29ydChzaWdfYXBwKTsKKwlza19uaWRfdHJpcGxlX3NvcnQoc2lneF9hcHApOworCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgdm9pZCBzaWRfZnJlZShuaWRfdHJpcGxlICp0dCkKKwl7CisJT1BFTlNTTF9mcmVlKHR0KTsKKwl9CisKK3ZvaWQgT0JKX3NpZ2lkX2ZyZWUodm9pZCkKKwl7CisJaWYgKHNpZ19hcHApCisJCXsKKwkJc2tfbmlkX3RyaXBsZV9wb3BfZnJlZShzaWdfYXBwLCBzaWRfZnJlZSk7CisJCXNpZ19hcHAgPSBOVUxMOworCQl9CisJaWYgKHNpZ3hfYXBwKQorCQl7CisJCXNrX25pZF90cmlwbGVfZnJlZShzaWd4X2FwcCk7CisJCXNpZ3hfYXBwID0gTlVMTDsKKwkJfQorCX0KKwkJCisjaWZkZWYgT0JKX1hSRUZfVEVTVAorCittYWluKCkKKwl7CisJaW50IG4xLCBuMiwgbjM7CisKKwlpbnQgaSwgcnY7CisjaWZkZWYgT0JKX1hSRUZfVEVTVDIKKwlmb3IgKGkgPSAwOyBpIDwJc2l6ZW9mKHNpZ29pZF9zcnQpIC8gc2l6ZW9mKG5pZF90cmlwbGUpOyBpKyspCisJCXsKKwkJT0JKX2FkZF9zaWdpZChzaWdvaWRfc3J0W2ldWzBdLCBzaWdvaWRfc3J0W2ldWzFdLAorCQkJCXNpZ29pZF9zcnRbaV1bMl0pOworCQl9CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPAlzaXplb2Yoc2lnb2lkX3NydCkgLyBzaXplb2YobmlkX3RyaXBsZSk7IGkrKykKKwkJeworCQluMSA9IHNpZ29pZF9zcnRbaV1bMF07CisJCXJ2ID0gT0JKX2ZpbmRfc2lnaWRfYWxncyhuMSwgJm4yLCAmbjMpOworCQlwcmludGYoIkZvcndhcmQ6ICVkLCAlcyAlcyAlc1xuIiwgcnYsCisJCQlPQkpfbmlkMmxuKG4xKSwgT0JKX25pZDJsbihuMiksIE9CSl9uaWQybG4objMpKTsKKwkJbjE9MDsKKwkJcnYgPSBPQkpfZmluZF9zaWdpZF9ieV9hbGdzKCZuMSwgbjIsIG4zKTsKKwkJcHJpbnRmKCJSZXZlcnNlOiAlZCwgJXMgJXMgJXNcbiIsIHJ2LAorCQkJT0JKX25pZDJsbihuMSksIE9CSl9uaWQybG4objIpLCBPQkpfbmlkMmxuKG4zKSk7CisJCX0KKwl9CisJCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ial94cmVmLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfeHJlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjliOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmpfeHJlZi5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIEFVVE9HRU5FUkFURUQgQlkgb2JqeHJlZi5wbCwgRE8gTk9UIEVESVQgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJaW50IHNpZ25faWQ7CisJaW50IGhhc2hfaWQ7CisJaW50IHBrZXlfaWQ7CisJfSBuaWRfdHJpcGxlOworCitzdGF0aWMgY29uc3QgbmlkX3RyaXBsZSBzaWdvaWRfc3J0W10gPQorCXsKKwl7TklEX21kMldpdGhSU0FFbmNyeXB0aW9uLCBOSURfbWQyLCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9tZDVXaXRoUlNBRW5jcnlwdGlvbiwgTklEX21kNSwgTklEX3JzYUVuY3J5cHRpb259LAorCXtOSURfc2hhV2l0aFJTQUVuY3J5cHRpb24sIE5JRF9zaGEsIE5JRF9yc2FFbmNyeXB0aW9ufSwKKwl7TklEX3NoYTFXaXRoUlNBRW5jcnlwdGlvbiwgTklEX3NoYTEsIE5JRF9yc2FFbmNyeXB0aW9ufSwKKwl7TklEX2RzYVdpdGhTSEEsIE5JRF9zaGEsIE5JRF9kc2F9LAorCXtOSURfZHNhV2l0aFNIQTFfMiwgTklEX3NoYTEsIE5JRF9kc2FfMn0sCisJe05JRF9tZGMyV2l0aFJTQSwgTklEX21kYzIsIE5JRF9yc2FFbmNyeXB0aW9ufSwKKwl7TklEX21kNVdpdGhSU0EsIE5JRF9tZDUsIE5JRF9yc2F9LAorCXtOSURfZHNhV2l0aFNIQTEsIE5JRF9zaGExLCBOSURfZHNhfSwKKwl7TklEX3NoYTFXaXRoUlNBLCBOSURfc2hhMSwgTklEX3JzYX0sCisJe05JRF9yaXBlbWQxNjBXaXRoUlNBLCBOSURfcmlwZW1kMTYwLCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9tZDRXaXRoUlNBRW5jcnlwdGlvbiwgTklEX21kNCwgTklEX3JzYUVuY3J5cHRpb259LAorCXtOSURfZWNkc2Ffd2l0aF9TSEExLCBOSURfc2hhMSwgTklEX1g5XzYyX2lkX2VjUHVibGljS2V5fSwKKwl7TklEX3NoYTI1NldpdGhSU0FFbmNyeXB0aW9uLCBOSURfc2hhMjU2LCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9zaGEzODRXaXRoUlNBRW5jcnlwdGlvbiwgTklEX3NoYTM4NCwgTklEX3JzYUVuY3J5cHRpb259LAorCXtOSURfc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24sIE5JRF9zaGE1MTIsIE5JRF9yc2FFbmNyeXB0aW9ufSwKKwl7TklEX3NoYTIyNFdpdGhSU0FFbmNyeXB0aW9uLCBOSURfc2hhMjI0LCBOSURfcnNhRW5jcnlwdGlvbn0sCisJe05JRF9lY2RzYV93aXRoX1JlY29tbWVuZGVkLCBOSURfdW5kZWYsIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleX0sCisJe05JRF9lY2RzYV93aXRoX1NwZWNpZmllZCwgTklEX3VuZGVmLCBOSURfWDlfNjJfaWRfZWNQdWJsaWNLZXl9LAorCXtOSURfZWNkc2Ffd2l0aF9TSEEyMjQsIE5JRF9zaGEyMjQsIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleX0sCisJe05JRF9lY2RzYV93aXRoX1NIQTI1NiwgTklEX3NoYTI1NiwgTklEX1g5XzYyX2lkX2VjUHVibGljS2V5fSwKKwl7TklEX2VjZHNhX3dpdGhfU0hBMzg0LCBOSURfc2hhMzg0LCBOSURfWDlfNjJfaWRfZWNQdWJsaWNLZXl9LAorCXtOSURfZWNkc2Ffd2l0aF9TSEE1MTIsIE5JRF9zaGE1MTIsIE5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleX0sCisJe05JRF9kc2Ffd2l0aF9TSEEyMjQsIE5JRF9zaGEyMjQsIE5JRF9kc2F9LAorCXtOSURfZHNhX3dpdGhfU0hBMjU2LCBOSURfc2hhMjU2LCBOSURfZHNhfSwKKwl7TklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxLCBOSURfaWRfR29zdFIzNDExXzk0LCBOSURfaWRfR29zdFIzNDEwXzIwMDF9LAorCXtOSURfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0LCBOSURfaWRfR29zdFIzNDExXzk0LCBOSURfaWRfR29zdFIzNDEwXzk0fSwKKwl7TklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYywgTklEX2lkX0dvc3RSMzQxMV85NCwgTklEX2lkX0dvc3RSMzQxMF85NF9jY30sCisJe05JRF9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYywgTklEX2lkX0dvc3RSMzQxMV85NCwgTklEX2lkX0dvc3RSMzQxMF8yMDAxX2NjfSwKKwl9OworCitzdGF0aWMgY29uc3QgbmlkX3RyaXBsZSAqIGNvbnN0IHNpZ29pZF9zcnRfeHJlZltdID0KKwl7CisJJnNpZ29pZF9zcnRbMTddLAorCSZzaWdvaWRfc3J0WzE4XSwKKwkmc2lnb2lkX3NydFswXSwKKwkmc2lnb2lkX3NydFsxXSwKKwkmc2lnb2lkX3NydFs3XSwKKwkmc2lnb2lkX3NydFsyXSwKKwkmc2lnb2lkX3NydFs0XSwKKwkmc2lnb2lkX3NydFszXSwKKwkmc2lnb2lkX3NydFs5XSwKKwkmc2lnb2lkX3NydFs1XSwKKwkmc2lnb2lkX3NydFs4XSwKKwkmc2lnb2lkX3NydFsxMl0sCisJJnNpZ29pZF9zcnRbNl0sCisJJnNpZ29pZF9zcnRbMTBdLAorCSZzaWdvaWRfc3J0WzExXSwKKwkmc2lnb2lkX3NydFsxM10sCisJJnNpZ29pZF9zcnRbMjRdLAorCSZzaWdvaWRfc3J0WzIwXSwKKwkmc2lnb2lkX3NydFsxNF0sCisJJnNpZ29pZF9zcnRbMjFdLAorCSZzaWdvaWRfc3J0WzE1XSwKKwkmc2lnb2lkX3NydFsyMl0sCisJJnNpZ29pZF9zcnRbMTZdLAorCSZzaWdvaWRfc3J0WzIzXSwKKwkmc2lnb2lkX3NydFsxOV0sCisJJnNpZ29pZF9zcnRbMjVdLAorCSZzaWdvaWRfc3J0WzI2XSwKKwkmc2lnb2lkX3NydFsyN10sCisJJnNpZ29pZF9zcnRbMjhdLAorCX07CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ial94cmVmLnR4dCBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ial94cmVmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDViM2QzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqX3hyZWYudHh0CkBAIC0wLDAgKzEsNDIgQEAKKyMgT0lEIGNyb3NzIHJlZmVyZW5jZSB0YWJsZS4KKyMgTGlua3Mgc2lnbmF0dXJlcyBPSURzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHVibGljIGtleSBhbGdvcml0aG1zCisjIGFuZCBkaWdlc3RzLgorCittZDJXaXRoUlNBRW5jcnlwdGlvbgltZDIJcnNhRW5jcnlwdGlvbgorbWQ1V2l0aFJTQUVuY3J5cHRpb24JbWQ1CXJzYUVuY3J5cHRpb24KK3NoYVdpdGhSU0FFbmNyeXB0aW9uCXNoYQlyc2FFbmNyeXB0aW9uCitzaGExV2l0aFJTQUVuY3J5cHRpb24Jc2hhMQlyc2FFbmNyeXB0aW9uCittZDRXaXRoUlNBRW5jcnlwdGlvbgltZDQJcnNhRW5jcnlwdGlvbgorc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24gc2hhMjU2CXJzYUVuY3J5cHRpb24KK3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCXNoYTM4NAlyc2FFbmNyeXB0aW9uCitzaGE1MTJXaXRoUlNBRW5jcnlwdGlvbglzaGE1MTIJcnNhRW5jcnlwdGlvbgorc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24Jc2hhMjI0CXJzYUVuY3J5cHRpb24KK21kYzJXaXRoUlNBCQltZGMyCXJzYUVuY3J5cHRpb24KK3JpcGVtZDE2MFdpdGhSU0EJcmlwZW1kMTYwIHJzYUVuY3J5cHRpb24KKworIyBBbHRlcm5hdGl2ZSBkZXByZWNhdGVkIE9JRHMuIEJ5IHVzaW5nIHRoZSBvbGRlciAicnNhIiBPSUQgdGhpcworIyB0eXBlIHdpbGwgYmUgcmVjb2duaXplZCBieSBub3Qgbm9ybWFsbHkgdXNlZC4KKworbWQ1V2l0aFJTQQkJbWQ1CXJzYQorc2hhMVdpdGhSU0EJCXNoYTEJcnNhCisKK2RzYVdpdGhTSEEJCXNoYQlkc2EKK2RzYVdpdGhTSEExCQlzaGExCWRzYQorCitkc2FXaXRoU0hBMV8yCQlzaGExCWRzYV8yCisKK2VjZHNhX3dpdGhfU0hBMQkJc2hhMQlYOV82Ml9pZF9lY1B1YmxpY0tleQorZWNkc2Ffd2l0aF9TSEEyMjQJc2hhMjI0CVg5XzYyX2lkX2VjUHVibGljS2V5CitlY2RzYV93aXRoX1NIQTI1NglzaGEyNTYJWDlfNjJfaWRfZWNQdWJsaWNLZXkKK2VjZHNhX3dpdGhfU0hBMzg0CXNoYTM4NAlYOV82Ml9pZF9lY1B1YmxpY0tleQorZWNkc2Ffd2l0aF9TSEE1MTIJc2hhNTEyCVg5XzYyX2lkX2VjUHVibGljS2V5CitlY2RzYV93aXRoX1JlY29tbWVuZGVkCXVuZGVmCVg5XzYyX2lkX2VjUHVibGljS2V5CitlY2RzYV93aXRoX1NwZWNpZmllZAl1bmRlZglYOV82Ml9pZF9lY1B1YmxpY0tleQorCitkc2Ffd2l0aF9TSEEyMjQJCXNoYTIyNAlkc2EKK2RzYV93aXRoX1NIQTI1NgkJc2hhMjU2CWRzYQorCitpZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMQlpZF9Hb3N0UjM0MTFfOTQgaWRfR29zdFIzNDEwXzIwMDEKK2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NAlpZF9Hb3N0UjM0MTFfOTQgaWRfR29zdFIzNDEwXzk0CitpZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTRfY2MJaWRfR29zdFIzNDExXzk0IGlkX0dvc3RSMzQxMF85NF9jYworaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDFfY2MJaWRfR29zdFIzNDExXzk0IGlkX0dvc3RSMzQxMF8yMDAxX2NjCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmplY3RzLlJFQURNRSBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29iamVjdHMuUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzQ1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmplY3RzLlJFQURNRQpAQCAtMCwwICsxLDQ0IEBACitvYmplY3RzLnR4dCBzeW50YXgKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBjb3ZlciBhbGwgdGhlIG5hbWluZyBoYWNrcyB0aGF0IHdlcmUgcHJldmlvdXNseSBpbiBvYmplY3RzLmggbmVlZGVkIHNvbWUKK2tpbmQgb2YgaGFja3MgaW4gb2JqZWN0cy50eHQuCisKK1RoZSBiYXNpYyBzeW50YXggZm9yIGFkZGluZyBhbiBvYmplY3QgaXMgYXMgZm9sbG93czoKKworCTEgMiAzIDQJCTogc2hvcnROYW1lCTogTG9uZyBOYW1lCisKKwkJSWYgdGhlIGxvbmcgbmFtZSBkb2Vzbid0IGNvbnRhaW4gc3BhY2VzLCBvciBubyBzaG9ydCBuYW1lCisJCWV4aXN0cywgdGhlIGxvbmcgbmFtZSBpcyB1c2VkIGFzIGJhc2lzIGZvciB0aGUgYmFzZSBuYW1lCisJCWluIEMuICBPdGhlcndpc2UsIHRoZSBzaG9ydCBuYW1lIGlzIHVzZWQuCisKKwkJVGhlIGJhc2UgbmFtZSAobGV0J3MgY2FsbCBpdCAnYmFzZScpIHdpbGwgdGhlbiBiZSB1c2VkIHRvCisJCWNyZWF0ZSB0aGUgQyBtYWNyb3MgU05fYmFzZSwgTE5fYmFzZSwgTklEX2Jhc2UgYW5kIE9CSl9iYXNlLgorCisJCU5vdGUgdGhhdCBpZiB0aGUgYmFzZSBuYW1lIGNvbnRhaW5zIHNwYWNlcywgZGFzaGVzIG9yIHBlcmlvZHMsCisJCXRob3NlIHdpbGwgYmUgY29udmVydGUgdG8gdW5kZXJzY29yZS4KKworVGhlbiB0aGVyZSBhcmUgc29tZSBleHRyYSBjb21tYW5kczoKKworCSFBbGlhcyBmb28gMSAyIDMgNAorCisJCVRoaXMganV0cyBtYWtlcyBhIG5hbWUgZm9vIGZvciBhbiBPSUQuICBUaGUgQyBtYWNybworCQlPQkpfZm9vIHdpbGwgYmUgY3JlYXRlZCBhcyBhIHJlc3VsdC4KKworCSFDbmFtZSBmb28KKworCQlUaGlzIG1ha2VzIHN1cmUgdGhhdCB0aGUgbmFtZSBmb28gd2lsbCBiZSB1c2VkIGFzIGJhc2UgbmFtZQorCQlpbiBDLgorCisJIW1vZHVsZSBmb28KKwkxIDIgMyA0CQk6IHNob3J0TmFtZQk6IExvbmcgTmFtZQorCSFnbG9iYWwKKworCQlUaGUgIW1vZHVsZSBjb21tYW5kIHdhcyBtZWFudCB0byBkZWZpbmUgYSBraW5kIG9mIG1vZHVsYXJpdHkuCisJCVdoYXQgaXQgZG9lcyBpcyB0byBtYWtlIHN1cmUgdGhlIG1vZHVsZSBuYW1lIGlzIHByZXBlbmRlZAorCQl0byB0aGUgYmFzZSBuYW1lLiAgIWdsb2JhbCB0dXJucyB0aGlzIG9mZi4gIFRoaXMgY29uc3RydWN0aW9uCisJCWlzIG5vdCByZWN1cnNpdmUuCisKK0xpbmVzIHN0YXJ0aW5nIHdpdGggIyBhcmUgdHJlYXRlZCBhcyBjb21tZW50cywgYXMgd2VsbCBhcyBhbnkgbGluZSBzdGFydGluZword2l0aCAhIGFuZCBub3QgbWF0Y2hpbmcgdGhlIGNvbW1hbmRzIGFib3ZlLgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmplY3RzLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmplY3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwZWU1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29iamVjdHMuaApAQCAtMCwwICsxLDExMzggQEAKKy8qIGNyeXB0by9vYmplY3RzL29iamVjdHMuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9PQkpFQ1RTX0gKKyNkZWZpbmUgSEVBREVSX09CSkVDVFNfSAorCisjZGVmaW5lIFVTRV9PQkpfTUFDCisKKyNpZmRlZiBVU0VfT0JKX01BQworI2luY2x1ZGUgPG9wZW5zc2wvb2JqX21hYy5oPgorI2Vsc2UKKyNkZWZpbmUgU05fdW5kZWYJCQkiVU5ERUYiCisjZGVmaW5lIExOX3VuZGVmCQkJInVuZGVmaW5lZCIKKyNkZWZpbmUgTklEX3VuZGVmCQkJMAorI2RlZmluZSBPQkpfdW5kZWYJCQkwTAorCisjZGVmaW5lIFNOX0FsZ29yaXRobQkJCSJBbGdvcml0aG0iCisjZGVmaW5lIExOX2FsZ29yaXRobQkJCSJhbGdvcml0aG0iCisjZGVmaW5lIE5JRF9hbGdvcml0aG0JCQkzOAorI2RlZmluZSBPQkpfYWxnb3JpdGhtCQkJMUwsM0wsMTRMLDNMLDJMCisKKyNkZWZpbmUgTE5fcnNhZHNpCQkJInJzYWRzaSIKKyNkZWZpbmUgTklEX3JzYWRzaQkJCTEKKyNkZWZpbmUgT0JKX3JzYWRzaQkJCTFMLDJMLDg0MEwsMTEzNTQ5TAorCisjZGVmaW5lIExOX3BrY3MJCQkJInBrY3MiCisjZGVmaW5lIE5JRF9wa2NzCQkJMgorI2RlZmluZSBPQkpfcGtjcwkJCU9CSl9yc2Fkc2ksMUwKKworI2RlZmluZSBTTl9tZDIJCQkJIk1EMiIKKyNkZWZpbmUgTE5fbWQyCQkJCSJtZDIiCisjZGVmaW5lIE5JRF9tZDIJCQkJMworI2RlZmluZSBPQkpfbWQyCQkJCU9CSl9yc2Fkc2ksMkwsMkwKKworI2RlZmluZSBTTl9tZDUJCQkJIk1ENSIKKyNkZWZpbmUgTE5fbWQ1CQkJCSJtZDUiCisjZGVmaW5lIE5JRF9tZDUJCQkJNAorI2RlZmluZSBPQkpfbWQ1CQkJCU9CSl9yc2Fkc2ksMkwsNUwKKworI2RlZmluZSBTTl9yYzQJCQkJIlJDNCIKKyNkZWZpbmUgTE5fcmM0CQkJCSJyYzQiCisjZGVmaW5lIE5JRF9yYzQJCQkJNQorI2RlZmluZSBPQkpfcmM0CQkJCU9CSl9yc2Fkc2ksM0wsNEwKKworI2RlZmluZSBMTl9yc2FFbmNyeXB0aW9uCQkicnNhRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3JzYUVuY3J5cHRpb24JCTYKKyNkZWZpbmUgT0JKX3JzYUVuY3J5cHRpb24JCU9CSl9wa2NzLDFMLDFMCisKKyNkZWZpbmUgU05fbWQyV2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtTUQyIgorI2RlZmluZSBMTl9tZDJXaXRoUlNBRW5jcnlwdGlvbgkJIm1kMldpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfbWQyV2l0aFJTQUVuY3J5cHRpb24JNworI2RlZmluZSBPQkpfbWQyV2l0aFJTQUVuY3J5cHRpb24JT0JKX3BrY3MsMUwsMkwKKworI2RlZmluZSBTTl9tZDVXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1NRDUiCisjZGVmaW5lIExOX21kNVdpdGhSU0FFbmNyeXB0aW9uCQkibWQ1V2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9tZDVXaXRoUlNBRW5jcnlwdGlvbgk4CisjZGVmaW5lIE9CSl9tZDVXaXRoUlNBRW5jcnlwdGlvbglPQkpfcGtjcywxTCw0TAorCisjZGVmaW5lIFNOX3BiZVdpdGhNRDJBbmRERVNfQ0JDCQkiUEJFLU1EMi1ERVMiCisjZGVmaW5lIExOX3BiZVdpdGhNRDJBbmRERVNfQ0JDCQkicGJlV2l0aE1EMkFuZERFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQyQW5kREVTX0NCQwk5CisjZGVmaW5lIE9CSl9wYmVXaXRoTUQyQW5kREVTX0NCQwlPQkpfcGtjcyw1TCwxTAorCisjZGVmaW5lIFNOX3BiZVdpdGhNRDVBbmRERVNfQ0JDCQkiUEJFLU1ENS1ERVMiCisjZGVmaW5lIExOX3BiZVdpdGhNRDVBbmRERVNfQ0JDCQkicGJlV2l0aE1ENUFuZERFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQ1QW5kREVTX0NCQwkxMAorI2RlZmluZSBPQkpfcGJlV2l0aE1ENUFuZERFU19DQkMJT0JKX3BrY3MsNUwsM0wKKworI2RlZmluZSBMTl9YNTAwCQkJCSJYNTAwIgorI2RlZmluZSBOSURfWDUwMAkJCTExCisjZGVmaW5lIE9CSl9YNTAwCQkJMkwsNUwKKworI2RlZmluZSBMTl9YNTA5CQkJCSJYNTA5IgorI2RlZmluZSBOSURfWDUwOQkJCTEyCisjZGVmaW5lIE9CSl9YNTA5CQkJT0JKX1g1MDAsNEwKKworI2RlZmluZSBTTl9jb21tb25OYW1lCQkJIkNOIgorI2RlZmluZSBMTl9jb21tb25OYW1lCQkJImNvbW1vbk5hbWUiCisjZGVmaW5lIE5JRF9jb21tb25OYW1lCQkJMTMKKyNkZWZpbmUgT0JKX2NvbW1vbk5hbWUJCQlPQkpfWDUwOSwzTAorCisjZGVmaW5lIFNOX2NvdW50cnlOYW1lCQkJIkMiCisjZGVmaW5lIExOX2NvdW50cnlOYW1lCQkJImNvdW50cnlOYW1lIgorI2RlZmluZSBOSURfY291bnRyeU5hbWUJCQkxNAorI2RlZmluZSBPQkpfY291bnRyeU5hbWUJCQlPQkpfWDUwOSw2TAorCisjZGVmaW5lIFNOX2xvY2FsaXR5TmFtZQkJCSJMIgorI2RlZmluZSBMTl9sb2NhbGl0eU5hbWUJCQkibG9jYWxpdHlOYW1lIgorI2RlZmluZSBOSURfbG9jYWxpdHlOYW1lCQkxNQorI2RlZmluZSBPQkpfbG9jYWxpdHlOYW1lCQlPQkpfWDUwOSw3TAorCisvKiBQb3N0YWwgQWRkcmVzcz8gUEEgKi8KKworLyogc2hvdWxkIGJlICJTVCIgKHJmYzEzMjcpIGJ1dCBNUyB1c2VzICdTJyAqLworI2RlZmluZSBTTl9zdGF0ZU9yUHJvdmluY2VOYW1lCQkiU1QiCisjZGVmaW5lIExOX3N0YXRlT3JQcm92aW5jZU5hbWUJCSJzdGF0ZU9yUHJvdmluY2VOYW1lIgorI2RlZmluZSBOSURfc3RhdGVPclByb3ZpbmNlTmFtZQkJMTYKKyNkZWZpbmUgT0JKX3N0YXRlT3JQcm92aW5jZU5hbWUJCU9CSl9YNTA5LDhMCisKKyNkZWZpbmUgU05fb3JnYW5pemF0aW9uTmFtZQkJIk8iCisjZGVmaW5lIExOX29yZ2FuaXphdGlvbk5hbWUJCSJvcmdhbml6YXRpb25OYW1lIgorI2RlZmluZSBOSURfb3JnYW5pemF0aW9uTmFtZQkJMTcKKyNkZWZpbmUgT0JKX29yZ2FuaXphdGlvbk5hbWUJCU9CSl9YNTA5LDEwTAorCisjZGVmaW5lIFNOX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJIk9VIgorI2RlZmluZSBMTl9vcmdhbml6YXRpb25hbFVuaXROYW1lCSJvcmdhbml6YXRpb25hbFVuaXROYW1lIgorI2RlZmluZSBOSURfb3JnYW5pemF0aW9uYWxVbml0TmFtZQkxOAorI2RlZmluZSBPQkpfb3JnYW5pemF0aW9uYWxVbml0TmFtZQlPQkpfWDUwOSwxMUwKKworI2RlZmluZSBTTl9yc2EJCQkJIlJTQSIKKyNkZWZpbmUgTE5fcnNhCQkJCSJyc2EiCisjZGVmaW5lIE5JRF9yc2EJCQkJMTkKKyNkZWZpbmUgT0JKX3JzYQkJCQlPQkpfWDUwMCw4TCwxTCwxTAorCisjZGVmaW5lIExOX3BrY3M3CQkJInBrY3M3IgorI2RlZmluZSBOSURfcGtjczcJCQkyMAorI2RlZmluZSBPQkpfcGtjczcJCQlPQkpfcGtjcyw3TAorCisjZGVmaW5lIExOX3BrY3M3X2RhdGEJCQkicGtjczctZGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X2RhdGEJCQkyMQorI2RlZmluZSBPQkpfcGtjczdfZGF0YQkJCU9CSl9wa2NzNywxTAorCisjZGVmaW5lIExOX3BrY3M3X3NpZ25lZAkJCSJwa2NzNy1zaWduZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfc2lnbmVkCQkyMgorI2RlZmluZSBPQkpfcGtjczdfc2lnbmVkCQlPQkpfcGtjczcsMkwKKworI2RlZmluZSBMTl9wa2NzN19lbnZlbG9wZWQJCSJwa2NzNy1lbnZlbG9wZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfZW52ZWxvcGVkCQkyMworI2RlZmluZSBPQkpfcGtjczdfZW52ZWxvcGVkCQlPQkpfcGtjczcsM0wKKworI2RlZmluZSBMTl9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQJInBrY3M3LXNpZ25lZEFuZEVudmVsb3BlZERhdGEiCisjZGVmaW5lIE5JRF9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQJMjQKKyNkZWZpbmUgT0JKX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZAlPQkpfcGtjczcsNEwKKworI2RlZmluZSBMTl9wa2NzN19kaWdlc3QJCQkicGtjczctZGlnZXN0RGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X2RpZ2VzdAkJMjUKKyNkZWZpbmUgT0JKX3BrY3M3X2RpZ2VzdAkJT0JKX3BrY3M3LDVMCisKKyNkZWZpbmUgTE5fcGtjczdfZW5jcnlwdGVkCQkicGtjczctZW5jcnlwdGVkRGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X2VuY3J5cHRlZAkJMjYKKyNkZWZpbmUgT0JKX3BrY3M3X2VuY3J5cHRlZAkJT0JKX3BrY3M3LDZMCisKKyNkZWZpbmUgTE5fcGtjczMJCQkicGtjczMiCisjZGVmaW5lIE5JRF9wa2NzMwkJCTI3CisjZGVmaW5lIE9CSl9wa2NzMwkJCU9CSl9wa2NzLDNMCisKKyNkZWZpbmUgTE5fZGhLZXlBZ3JlZW1lbnQJCSJkaEtleUFncmVlbWVudCIKKyNkZWZpbmUgTklEX2RoS2V5QWdyZWVtZW50CQkyOAorI2RlZmluZSBPQkpfZGhLZXlBZ3JlZW1lbnQJCU9CSl9wa2NzMywxTAorCisjZGVmaW5lIFNOX2Rlc19lY2IJCQkiREVTLUVDQiIKKyNkZWZpbmUgTE5fZGVzX2VjYgkJCSJkZXMtZWNiIgorI2RlZmluZSBOSURfZGVzX2VjYgkJCTI5CisjZGVmaW5lIE9CSl9kZXNfZWNiCQkJT0JKX2FsZ29yaXRobSw2TAorCisjZGVmaW5lIFNOX2Rlc19jZmI2NAkJCSJERVMtQ0ZCIgorI2RlZmluZSBMTl9kZXNfY2ZiNjQJCQkiZGVzLWNmYiIKKyNkZWZpbmUgTklEX2Rlc19jZmI2NAkJCTMwCisvKiBJViArIG51bSAqLworI2RlZmluZSBPQkpfZGVzX2NmYjY0CQkJT0JKX2FsZ29yaXRobSw5TAorCisjZGVmaW5lIFNOX2Rlc19jYmMJCQkiREVTLUNCQyIKKyNkZWZpbmUgTE5fZGVzX2NiYwkJCSJkZXMtY2JjIgorI2RlZmluZSBOSURfZGVzX2NiYwkJCTMxCisvKiBJViAqLworI2RlZmluZSBPQkpfZGVzX2NiYwkJCU9CSl9hbGdvcml0aG0sN0wKKworI2RlZmluZSBTTl9kZXNfZWRlCQkJIkRFUy1FREUiCisjZGVmaW5lIExOX2Rlc19lZGUJCQkiZGVzLWVkZSIKKyNkZWZpbmUgTklEX2Rlc19lZGUJCQkzMgorLyogPz8gKi8KKyNkZWZpbmUgT0JKX2Rlc19lZGUJCQlPQkpfYWxnb3JpdGhtLDE3TAorCisjZGVmaW5lIFNOX2Rlc19lZGUzCQkJIkRFUy1FREUzIgorI2RlZmluZSBMTl9kZXNfZWRlMwkJCSJkZXMtZWRlMyIKKyNkZWZpbmUgTklEX2Rlc19lZGUzCQkJMzMKKworI2RlZmluZSBTTl9pZGVhX2NiYwkJCSJJREVBLUNCQyIKKyNkZWZpbmUgTE5faWRlYV9jYmMJCQkiaWRlYS1jYmMiCisjZGVmaW5lIE5JRF9pZGVhX2NiYwkJCTM0CisjZGVmaW5lIE9CSl9pZGVhX2NiYwkJCTFMLDNMLDZMLDFMLDRMLDFMLDE4OEwsN0wsMUwsMUwsMkwKKworI2RlZmluZSBTTl9pZGVhX2NmYjY0CQkJIklERUEtQ0ZCIgorI2RlZmluZSBMTl9pZGVhX2NmYjY0CQkJImlkZWEtY2ZiIgorI2RlZmluZSBOSURfaWRlYV9jZmI2NAkJCTM1CisKKyNkZWZpbmUgU05faWRlYV9lY2IJCQkiSURFQS1FQ0IiCisjZGVmaW5lIExOX2lkZWFfZWNiCQkJImlkZWEtZWNiIgorI2RlZmluZSBOSURfaWRlYV9lY2IJCQkzNgorCisjZGVmaW5lIFNOX3JjMl9jYmMJCQkiUkMyLUNCQyIKKyNkZWZpbmUgTE5fcmMyX2NiYwkJCSJyYzItY2JjIgorI2RlZmluZSBOSURfcmMyX2NiYwkJCTM3CisjZGVmaW5lIE9CSl9yYzJfY2JjCQkJT0JKX3JzYWRzaSwzTCwyTAorCisjZGVmaW5lIFNOX3JjMl9lY2IJCQkiUkMyLUVDQiIKKyNkZWZpbmUgTE5fcmMyX2VjYgkJCSJyYzItZWNiIgorI2RlZmluZSBOSURfcmMyX2VjYgkJCTM4CisKKyNkZWZpbmUgU05fcmMyX2NmYjY0CQkJIlJDMi1DRkIiCisjZGVmaW5lIExOX3JjMl9jZmI2NAkJCSJyYzItY2ZiIgorI2RlZmluZSBOSURfcmMyX2NmYjY0CQkJMzkKKworI2RlZmluZSBTTl9yYzJfb2ZiNjQJCQkiUkMyLU9GQiIKKyNkZWZpbmUgTE5fcmMyX29mYjY0CQkJInJjMi1vZmIiCisjZGVmaW5lIE5JRF9yYzJfb2ZiNjQJCQk0MAorCisjZGVmaW5lIFNOX3NoYQkJCQkiU0hBIgorI2RlZmluZSBMTl9zaGEJCQkJInNoYSIKKyNkZWZpbmUgTklEX3NoYQkJCQk0MQorI2RlZmluZSBPQkpfc2hhCQkJCU9CSl9hbGdvcml0aG0sMThMCisKKyNkZWZpbmUgU05fc2hhV2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtU0hBIgorI2RlZmluZSBMTl9zaGFXaXRoUlNBRW5jcnlwdGlvbgkJInNoYVdpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfc2hhV2l0aFJTQUVuY3J5cHRpb24JNDIKKyNkZWZpbmUgT0JKX3NoYVdpdGhSU0FFbmNyeXB0aW9uCU9CSl9hbGdvcml0aG0sMTVMCisKKyNkZWZpbmUgU05fZGVzX2VkZV9jYmMJCQkiREVTLUVERS1DQkMiCisjZGVmaW5lIExOX2Rlc19lZGVfY2JjCQkJImRlcy1lZGUtY2JjIgorI2RlZmluZSBOSURfZGVzX2VkZV9jYmMJCQk0MworCisjZGVmaW5lIFNOX2Rlc19lZGUzX2NiYwkJCSJERVMtRURFMy1DQkMiCisjZGVmaW5lIExOX2Rlc19lZGUzX2NiYwkJCSJkZXMtZWRlMy1jYmMiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19jYmMJCTQ0CisjZGVmaW5lIE9CSl9kZXNfZWRlM19jYmMJCU9CSl9yc2Fkc2ksM0wsN0wKKworI2RlZmluZSBTTl9kZXNfb2ZiNjQJCQkiREVTLU9GQiIKKyNkZWZpbmUgTE5fZGVzX29mYjY0CQkJImRlcy1vZmIiCisjZGVmaW5lIE5JRF9kZXNfb2ZiNjQJCQk0NQorI2RlZmluZSBPQkpfZGVzX29mYjY0CQkJT0JKX2FsZ29yaXRobSw4TAorCisjZGVmaW5lIFNOX2lkZWFfb2ZiNjQJCQkiSURFQS1PRkIiCisjZGVmaW5lIExOX2lkZWFfb2ZiNjQJCQkiaWRlYS1vZmIiCisjZGVmaW5lIE5JRF9pZGVhX29mYjY0CQkJNDYKKworI2RlZmluZSBMTl9wa2NzOQkJCSJwa2NzOSIKKyNkZWZpbmUgTklEX3BrY3M5CQkJNDcKKyNkZWZpbmUgT0JKX3BrY3M5CQkJT0JKX3BrY3MsOUwKKworI2RlZmluZSBTTl9wa2NzOV9lbWFpbEFkZHJlc3MJCSJFbWFpbCIKKyNkZWZpbmUgTE5fcGtjczlfZW1haWxBZGRyZXNzCQkiZW1haWxBZGRyZXNzIgorI2RlZmluZSBOSURfcGtjczlfZW1haWxBZGRyZXNzCQk0OAorI2RlZmluZSBPQkpfcGtjczlfZW1haWxBZGRyZXNzCQlPQkpfcGtjczksMUwKKworI2RlZmluZSBMTl9wa2NzOV91bnN0cnVjdHVyZWROYW1lCSJ1bnN0cnVjdHVyZWROYW1lIgorI2RlZmluZSBOSURfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZQk0OQorI2RlZmluZSBPQkpfcGtjczlfdW5zdHJ1Y3R1cmVkTmFtZQlPQkpfcGtjczksMkwKKworI2RlZmluZSBMTl9wa2NzOV9jb250ZW50VHlwZQkJImNvbnRlbnRUeXBlIgorI2RlZmluZSBOSURfcGtjczlfY29udGVudFR5cGUJCTUwCisjZGVmaW5lIE9CSl9wa2NzOV9jb250ZW50VHlwZQkJT0JKX3BrY3M5LDNMCisKKyNkZWZpbmUgTE5fcGtjczlfbWVzc2FnZURpZ2VzdAkJIm1lc3NhZ2VEaWdlc3QiCisjZGVmaW5lIE5JRF9wa2NzOV9tZXNzYWdlRGlnZXN0CQk1MQorI2RlZmluZSBPQkpfcGtjczlfbWVzc2FnZURpZ2VzdAkJT0JKX3BrY3M5LDRMCisKKyNkZWZpbmUgTE5fcGtjczlfc2lnbmluZ1RpbWUJCSJzaWduaW5nVGltZSIKKyNkZWZpbmUgTklEX3BrY3M5X3NpZ25pbmdUaW1lCQk1MgorI2RlZmluZSBPQkpfcGtjczlfc2lnbmluZ1RpbWUJCU9CSl9wa2NzOSw1TAorCisjZGVmaW5lIExOX3BrY3M5X2NvdW50ZXJzaWduYXR1cmUJImNvdW50ZXJzaWduYXR1cmUiCisjZGVmaW5lIE5JRF9wa2NzOV9jb3VudGVyc2lnbmF0dXJlCTUzCisjZGVmaW5lIE9CSl9wa2NzOV9jb3VudGVyc2lnbmF0dXJlCU9CSl9wa2NzOSw2TAorCisjZGVmaW5lIExOX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkCSJjaGFsbGVuZ2VQYXNzd29yZCIKKyNkZWZpbmUgTklEX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkCTU0CisjZGVmaW5lIE9CSl9wa2NzOV9jaGFsbGVuZ2VQYXNzd29yZAlPQkpfcGtjczksN0wKKworI2RlZmluZSBMTl9wa2NzOV91bnN0cnVjdHVyZWRBZGRyZXNzCSJ1bnN0cnVjdHVyZWRBZGRyZXNzIgorI2RlZmluZSBOSURfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcwk1NQorI2RlZmluZSBPQkpfcGtjczlfdW5zdHJ1Y3R1cmVkQWRkcmVzcwlPQkpfcGtjczksOEwKKworI2RlZmluZSBMTl9wa2NzOV9leHRDZXJ0QXR0cmlidXRlcwkiZXh0ZW5kZWRDZXJ0aWZpY2F0ZUF0dHJpYnV0ZXMiCisjZGVmaW5lIE5JRF9wa2NzOV9leHRDZXJ0QXR0cmlidXRlcwk1NgorI2RlZmluZSBPQkpfcGtjczlfZXh0Q2VydEF0dHJpYnV0ZXMJT0JKX3BrY3M5LDlMCisKKyNkZWZpbmUgU05fbmV0c2NhcGUJCQkiTmV0c2NhcGUiCisjZGVmaW5lIExOX25ldHNjYXBlCQkJIk5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnAuIgorI2RlZmluZSBOSURfbmV0c2NhcGUJCQk1NworI2RlZmluZSBPQkpfbmV0c2NhcGUJCQkyTCwxNkwsODQwTCwxTCwxMTM3MzBMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2VydF9leHRlbnNpb24JIm5zQ2VydEV4dCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2VydF9leHRlbnNpb24JIk5ldHNjYXBlIENlcnRpZmljYXRlIEV4dGVuc2lvbiIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uCTU4CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbglPQkpfbmV0c2NhcGUsMUwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9kYXRhX3R5cGUJCSJuc0RhdGFUeXBlIgorI2RlZmluZSBMTl9uZXRzY2FwZV9kYXRhX3R5cGUJCSJOZXRzY2FwZSBEYXRhIFR5cGUiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9kYXRhX3R5cGUJCTU5CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9kYXRhX3R5cGUJCU9CSl9uZXRzY2FwZSwyTAorCisjZGVmaW5lIFNOX2Rlc19lZGVfY2ZiNjQJCSJERVMtRURFLUNGQiIKKyNkZWZpbmUgTE5fZGVzX2VkZV9jZmI2NAkJImRlcy1lZGUtY2ZiIgorI2RlZmluZSBOSURfZGVzX2VkZV9jZmI2NAkJNjAKKworI2RlZmluZSBTTl9kZXNfZWRlM19jZmI2NAkJIkRFUy1FREUzLUNGQiIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfY2ZiNjQJCSJkZXMtZWRlMy1jZmIiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19jZmI2NAkJNjEKKworI2RlZmluZSBTTl9kZXNfZWRlX29mYjY0CQkiREVTLUVERS1PRkIiCisjZGVmaW5lIExOX2Rlc19lZGVfb2ZiNjQJCSJkZXMtZWRlLW9mYiIKKyNkZWZpbmUgTklEX2Rlc19lZGVfb2ZiNjQJCTYyCisKKyNkZWZpbmUgU05fZGVzX2VkZTNfb2ZiNjQJCSJERVMtRURFMy1PRkIiCisjZGVmaW5lIExOX2Rlc19lZGUzX29mYjY0CQkiZGVzLWVkZTMtb2ZiIgorI2RlZmluZSBOSURfZGVzX2VkZTNfb2ZiNjQJCTYzCisKKy8qIEknbSBub3Qgc3VyZSBhYm91dCB0aGUgb2JqZWN0IElEICovCisjZGVmaW5lIFNOX3NoYTEJCQkJIlNIQTEiCisjZGVmaW5lIExOX3NoYTEJCQkJInNoYTEiCisjZGVmaW5lIE5JRF9zaGExCQkJNjQKKyNkZWZpbmUgT0JKX3NoYTEJCQlPQkpfYWxnb3JpdGhtLDI2TAorLyogMjggSnVuIDE5OTYgLSBlYXkgKi8KKy8qICNkZWZpbmUgT0JKX3NoYTEJCQkxTCwzTCwxNEwsMkwsMjZMLDA1TCA8LSB3cm9uZyAqLworCisjZGVmaW5lIFNOX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgkiUlNBLVNIQTEiCisjZGVmaW5lIExOX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgkic2hhMVdpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfc2hhMVdpdGhSU0FFbmNyeXB0aW9uCTY1CisjZGVmaW5lIE9CSl9zaGExV2l0aFJTQUVuY3J5cHRpb24JT0JKX3BrY3MsMUwsNUwKKworI2RlZmluZSBTTl9kc2FXaXRoU0hBCQkJIkRTQS1TSEEiCisjZGVmaW5lIExOX2RzYVdpdGhTSEEJCQkiZHNhV2l0aFNIQSIKKyNkZWZpbmUgTklEX2RzYVdpdGhTSEEJCQk2NgorI2RlZmluZSBPQkpfZHNhV2l0aFNIQQkJCU9CSl9hbGdvcml0aG0sMTNMCisKKyNkZWZpbmUgU05fZHNhXzIJCQkiRFNBLW9sZCIKKyNkZWZpbmUgTE5fZHNhXzIJCQkiZHNhRW5jcnlwdGlvbi1vbGQiCisjZGVmaW5lIE5JRF9kc2FfMgkJCTY3CisjZGVmaW5lIE9CSl9kc2FfMgkJCU9CSl9hbGdvcml0aG0sMTJMCisKKy8qIHByb3Bvc2VkIGJ5IG1pY3Jvc29mdCB0byBSU0EgKi8KKyNkZWZpbmUgU05fcGJlV2l0aFNIQTFBbmRSQzJfQ0JDCSJQQkUtU0hBMS1SQzItNjQiCisjZGVmaW5lIExOX3BiZVdpdGhTSEExQW5kUkMyX0NCQwkicGJlV2l0aFNIQTFBbmRSQzItQ0JDIgorI2RlZmluZSBOSURfcGJlV2l0aFNIQTFBbmRSQzJfQ0JDCTY4CisjZGVmaW5lIE9CSl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMJT0JKX3BrY3MsNUwsMTFMIAorCisvKiBwcm9wb3NlZCBieSBtaWNyb3NvZnQgdG8gUlNBIGFzIHBiZVdpdGhTSEExQW5kUkM0OiBpdCBpcyBub3cKKyAqIGRlZmluZWQgZXhwbGljaXRseSBpbiBQS0NTIzUgdjIuMCBhcyBpZC1QQktERjIgd2hpY2ggaXMgc29tZXRoaW5nCisgKiBjb21wbGV0ZWx5IGRpZmZlcmVudC4KKyAqLworI2RlZmluZSBMTl9pZF9wYmtkZjIJCQkiUEJLREYyIgorI2RlZmluZSBOSURfaWRfcGJrZGYyCQkJNjkKKyNkZWZpbmUgT0JKX2lkX3Bia2RmMgkJCU9CSl9wa2NzLDVMLDEyTCAKKworI2RlZmluZSBTTl9kc2FXaXRoU0hBMV8yCQkiRFNBLVNIQTEtb2xkIgorI2RlZmluZSBMTl9kc2FXaXRoU0hBMV8yCQkiZHNhV2l0aFNIQTEtb2xkIgorI2RlZmluZSBOSURfZHNhV2l0aFNIQTFfMgkJNzAKKy8qIEdvdCB0aGlzIG9uZSBmcm9tICdzZG43MDZyMjAucGRmJyB3aGljaCBpcyBhY3R1YWxseSBhbiBOU0EgZG9jdW1lbnQgOi0pICovCisjZGVmaW5lIE9CSl9kc2FXaXRoU0hBMV8yCQlPQkpfYWxnb3JpdGhtLDI3TAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NlcnRfdHlwZQkJIm5zQ2VydFR5cGUiCisjZGVmaW5lIExOX25ldHNjYXBlX2NlcnRfdHlwZQkJIk5ldHNjYXBlIENlcnQgVHlwZSIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NlcnRfdHlwZQkJNzEKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NlcnRfdHlwZQkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDFMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfYmFzZV91cmwJCSJuc0Jhc2VVcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX2Jhc2VfdXJsCQkiTmV0c2NhcGUgQmFzZSBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9iYXNlX3VybAkJNzIKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2Jhc2VfdXJsCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sMkwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybAkibnNSZXZvY2F0aW9uVXJsIgorI2RlZmluZSBMTl9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybAkiTmV0c2NhcGUgUmV2b2NhdGlvbiBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybAk3MworI2RlZmluZSBPQkpfbmV0c2NhcGVfcmV2b2NhdGlvbl91cmwJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDNMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwJIm5zQ2FSZXZvY2F0aW9uVXJsIgorI2RlZmluZSBMTl9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybAkiTmV0c2NhcGUgQ0EgUmV2b2NhdGlvbiBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybAk3NAorI2RlZmluZSBPQkpfbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDRMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfcmVuZXdhbF91cmwJCSJuc1JlbmV3YWxVcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX3JlbmV3YWxfdXJsCQkiTmV0c2NhcGUgUmVuZXdhbCBVcmwiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9yZW5ld2FsX3VybAk3NQorI2RlZmluZSBPQkpfbmV0c2NhcGVfcmVuZXdhbF91cmwJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDdMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2FfcG9saWN5X3VybAkibnNDYVBvbGljeVVybCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2FfcG9saWN5X3VybAkiTmV0c2NhcGUgQ0EgUG9saWN5IFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NhX3BvbGljeV91cmwJNzYKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NhX3BvbGljeV91cmwJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDhMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCSJuc1NzbFNlcnZlck5hbWUiCisjZGVmaW5lIExOX25ldHNjYXBlX3NzbF9zZXJ2ZXJfbmFtZQkiTmV0c2NhcGUgU1NMIFNlcnZlciBOYW1lIgorI2RlZmluZSBOSURfbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCTc3CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9zc2xfc2VydmVyX25hbWUJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDEyTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NvbW1lbnQJCSJuc0NvbW1lbnQiCisjZGVmaW5lIExOX25ldHNjYXBlX2NvbW1lbnQJCSJOZXRzY2FwZSBDb21tZW50IgorI2RlZmluZSBOSURfbmV0c2NhcGVfY29tbWVudAkJNzgKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NvbW1lbnQJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiwxM0wKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlCSJuc0NlcnRTZXF1ZW5jZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2VydF9zZXF1ZW5jZQkiTmV0c2NhcGUgQ2VydGlmaWNhdGUgU2VxdWVuY2UiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlCTc5CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlCU9CSl9uZXRzY2FwZV9kYXRhX3R5cGUsNUwKKworI2RlZmluZSBTTl9kZXN4X2NiYwkJCSJERVNYLUNCQyIKKyNkZWZpbmUgTE5fZGVzeF9jYmMJCQkiZGVzeC1jYmMiCisjZGVmaW5lIE5JRF9kZXN4X2NiYwkJCTgwCisKKyNkZWZpbmUgU05faWRfY2UJCQkiaWQtY2UiCisjZGVmaW5lIE5JRF9pZF9jZQkJCTgxCisjZGVmaW5lIE9CSl9pZF9jZQkJCTJMLDVMLDI5TAorCisjZGVmaW5lIFNOX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJInN1YmplY3RLZXlJZGVudGlmaWVyIgorI2RlZmluZSBMTl9zdWJqZWN0X2tleV9pZGVudGlmaWVyCSJYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJODIKKyNkZWZpbmUgT0JKX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJT0JKX2lkX2NlLDE0TAorCisjZGVmaW5lIFNOX2tleV91c2FnZQkJCSJrZXlVc2FnZSIKKyNkZWZpbmUgTE5fa2V5X3VzYWdlCQkJIlg1MDl2MyBLZXkgVXNhZ2UiCisjZGVmaW5lIE5JRF9rZXlfdXNhZ2UJCQk4MworI2RlZmluZSBPQkpfa2V5X3VzYWdlCQkJT0JKX2lkX2NlLDE1TAorCisjZGVmaW5lIFNOX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAkicHJpdmF0ZUtleVVzYWdlUGVyaW9kIgorI2RlZmluZSBMTl9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QJIlg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2QiCisjZGVmaW5lIE5JRF9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QJODQKKyNkZWZpbmUgT0JKX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAlPQkpfaWRfY2UsMTZMCisKKyNkZWZpbmUgU05fc3ViamVjdF9hbHRfbmFtZQkJInN1YmplY3RBbHROYW1lIgorI2RlZmluZSBMTl9zdWJqZWN0X2FsdF9uYW1lCQkiWDUwOXYzIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZSIKKyNkZWZpbmUgTklEX3N1YmplY3RfYWx0X25hbWUJCTg1CisjZGVmaW5lIE9CSl9zdWJqZWN0X2FsdF9uYW1lCQlPQkpfaWRfY2UsMTdMCisKKyNkZWZpbmUgU05faXNzdWVyX2FsdF9uYW1lCQkiaXNzdWVyQWx0TmFtZSIKKyNkZWZpbmUgTE5faXNzdWVyX2FsdF9uYW1lCQkiWDUwOXYzIElzc3VlciBBbHRlcm5hdGl2ZSBOYW1lIgorI2RlZmluZSBOSURfaXNzdWVyX2FsdF9uYW1lCQk4NgorI2RlZmluZSBPQkpfaXNzdWVyX2FsdF9uYW1lCQlPQkpfaWRfY2UsMThMCisKKyNkZWZpbmUgU05fYmFzaWNfY29uc3RyYWludHMJCSJiYXNpY0NvbnN0cmFpbnRzIgorI2RlZmluZSBMTl9iYXNpY19jb25zdHJhaW50cwkJIlg1MDl2MyBCYXNpYyBDb25zdHJhaW50cyIKKyNkZWZpbmUgTklEX2Jhc2ljX2NvbnN0cmFpbnRzCQk4NworI2RlZmluZSBPQkpfYmFzaWNfY29uc3RyYWludHMJCU9CSl9pZF9jZSwxOUwKKworI2RlZmluZSBTTl9jcmxfbnVtYmVyCQkJImNybE51bWJlciIKKyNkZWZpbmUgTE5fY3JsX251bWJlcgkJCSJYNTA5djMgQ1JMIE51bWJlciIKKyNkZWZpbmUgTklEX2NybF9udW1iZXIJCQk4OAorI2RlZmluZSBPQkpfY3JsX251bWJlcgkJCU9CSl9pZF9jZSwyMEwKKworI2RlZmluZSBTTl9jZXJ0aWZpY2F0ZV9wb2xpY2llcwkJImNlcnRpZmljYXRlUG9saWNpZXMiCisjZGVmaW5lIExOX2NlcnRpZmljYXRlX3BvbGljaWVzCQkiWDUwOXYzIENlcnRpZmljYXRlIFBvbGljaWVzIgorI2RlZmluZSBOSURfY2VydGlmaWNhdGVfcG9saWNpZXMJODkKKyNkZWZpbmUgT0JKX2NlcnRpZmljYXRlX3BvbGljaWVzCU9CSl9pZF9jZSwzMkwKKworI2RlZmluZSBTTl9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIJImF1dGhvcml0eUtleUlkZW50aWZpZXIiCisjZGVmaW5lIExOX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkiWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgk5MAorI2RlZmluZSBPQkpfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyCU9CSl9pZF9jZSwzNUwKKworI2RlZmluZSBTTl9iZl9jYmMJCQkiQkYtQ0JDIgorI2RlZmluZSBMTl9iZl9jYmMJCQkiYmYtY2JjIgorI2RlZmluZSBOSURfYmZfY2JjCQkJOTEKKyNkZWZpbmUgT0JKX2JmX2NiYwkJCTFMLDNMLDZMLDFMLDRMLDFMLDMwMjlMLDFMLDJMCisKKyNkZWZpbmUgU05fYmZfZWNiCQkJIkJGLUVDQiIKKyNkZWZpbmUgTE5fYmZfZWNiCQkJImJmLWVjYiIKKyNkZWZpbmUgTklEX2JmX2VjYgkJCTkyCisKKyNkZWZpbmUgU05fYmZfY2ZiNjQJCQkiQkYtQ0ZCIgorI2RlZmluZSBMTl9iZl9jZmI2NAkJCSJiZi1jZmIiCisjZGVmaW5lIE5JRF9iZl9jZmI2NAkJCTkzCisKKyNkZWZpbmUgU05fYmZfb2ZiNjQJCQkiQkYtT0ZCIgorI2RlZmluZSBMTl9iZl9vZmI2NAkJCSJiZi1vZmIiCisjZGVmaW5lIE5JRF9iZl9vZmI2NAkJCTk0CisKKyNkZWZpbmUgU05fbWRjMgkJCQkiTURDMiIKKyNkZWZpbmUgTE5fbWRjMgkJCQkibWRjMiIKKyNkZWZpbmUgTklEX21kYzIJCQk5NQorI2RlZmluZSBPQkpfbWRjMgkJCTJMLDVMLDhMLDNMLDEwMUwKKy8qIEFuIGFsdGVybmF0aXZlPwkJCTFMLDNMLDE0TCwzTCwyTCwxOUwgKi8KKworI2RlZmluZSBTTl9tZGMyV2l0aFJTQQkJCSJSU0EtTURDMiIKKyNkZWZpbmUgTE5fbWRjMldpdGhSU0EJCQkibWRjMndpdGhSU0EiCisjZGVmaW5lIE5JRF9tZGMyV2l0aFJTQQkJCTk2CisjZGVmaW5lIE9CSl9tZGMyV2l0aFJTQQkJCTJMLDVMLDhMLDNMLDEwMEwKKworI2RlZmluZSBTTl9yYzRfNDAJCQkiUkM0LTQwIgorI2RlZmluZSBMTl9yYzRfNDAJCQkicmM0LTQwIgorI2RlZmluZSBOSURfcmM0XzQwCQkJOTcKKworI2RlZmluZSBTTl9yYzJfNDBfY2JjCQkJIlJDMi00MC1DQkMiCisjZGVmaW5lIExOX3JjMl80MF9jYmMJCQkicmMyLTQwLWNiYyIKKyNkZWZpbmUgTklEX3JjMl80MF9jYmMJCQk5OAorCisjZGVmaW5lIFNOX2dpdmVuTmFtZQkJCSJHIgorI2RlZmluZSBMTl9naXZlbk5hbWUJCQkiZ2l2ZW5OYW1lIgorI2RlZmluZSBOSURfZ2l2ZW5OYW1lCQkJOTkKKyNkZWZpbmUgT0JKX2dpdmVuTmFtZQkJCU9CSl9YNTA5LDQyTAorCisjZGVmaW5lIFNOX3N1cm5hbWUJCQkiUyIKKyNkZWZpbmUgTE5fc3VybmFtZQkJCSJzdXJuYW1lIgorI2RlZmluZSBOSURfc3VybmFtZQkJCTEwMAorI2RlZmluZSBPQkpfc3VybmFtZQkJCU9CSl9YNTA5LDRMCisKKyNkZWZpbmUgU05faW5pdGlhbHMJCQkiSSIKKyNkZWZpbmUgTE5faW5pdGlhbHMJCQkiaW5pdGlhbHMiCisjZGVmaW5lIE5JRF9pbml0aWFscwkJCTEwMQorI2RlZmluZSBPQkpfaW5pdGlhbHMJCQlPQkpfWDUwOSw0M0wKKworI2RlZmluZSBTTl91bmlxdWVJZGVudGlmaWVyCQkiVUlEIgorI2RlZmluZSBMTl91bmlxdWVJZGVudGlmaWVyCQkidW5pcXVlSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3VuaXF1ZUlkZW50aWZpZXIJCTEwMgorI2RlZmluZSBPQkpfdW5pcXVlSWRlbnRpZmllcgkJT0JKX1g1MDksNDVMCisKKyNkZWZpbmUgU05fY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMJImNybERpc3RyaWJ1dGlvblBvaW50cyIKKyNkZWZpbmUgTE5fY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMJIlg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50cyIKKyNkZWZpbmUgTklEX2NybF9kaXN0cmlidXRpb25fcG9pbnRzCTEwMworI2RlZmluZSBPQkpfY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMJT0JKX2lkX2NlLDMxTAorCisjZGVmaW5lIFNOX21kNVdpdGhSU0EJCQkiUlNBLU5QLU1ENSIKKyNkZWZpbmUgTE5fbWQ1V2l0aFJTQQkJCSJtZDVXaXRoUlNBIgorI2RlZmluZSBOSURfbWQ1V2l0aFJTQQkJCTEwNAorI2RlZmluZSBPQkpfbWQ1V2l0aFJTQQkJCU9CSl9hbGdvcml0aG0sM0wKKworI2RlZmluZSBTTl9zZXJpYWxOdW1iZXIJCQkiU04iCisjZGVmaW5lIExOX3NlcmlhbE51bWJlcgkJCSJzZXJpYWxOdW1iZXIiCisjZGVmaW5lIE5JRF9zZXJpYWxOdW1iZXIJCTEwNQorI2RlZmluZSBPQkpfc2VyaWFsTnVtYmVyCQlPQkpfWDUwOSw1TAorCisjZGVmaW5lIFNOX3RpdGxlCQkJIlQiCisjZGVmaW5lIExOX3RpdGxlCQkJInRpdGxlIgorI2RlZmluZSBOSURfdGl0bGUJCQkxMDYKKyNkZWZpbmUgT0JKX3RpdGxlCQkJT0JKX1g1MDksMTJMCisKKyNkZWZpbmUgU05fZGVzY3JpcHRpb24JCQkiRCIKKyNkZWZpbmUgTE5fZGVzY3JpcHRpb24JCQkiZGVzY3JpcHRpb24iCisjZGVmaW5lIE5JRF9kZXNjcmlwdGlvbgkJCTEwNworI2RlZmluZSBPQkpfZGVzY3JpcHRpb24JCQlPQkpfWDUwOSwxM0wKKworLyogQ0FTVDUgaXMgQ0FTVC0xMjgsIEknbSBqdXN0IHN0aWNraW5nIHdpdGggdGhlIGRvY3VtZW50YXRpb24gKi8KKyNkZWZpbmUgU05fY2FzdDVfY2JjCQkJIkNBU1Q1LUNCQyIKKyNkZWZpbmUgTE5fY2FzdDVfY2JjCQkJImNhc3Q1LWNiYyIKKyNkZWZpbmUgTklEX2Nhc3Q1X2NiYwkJCTEwOAorI2RlZmluZSBPQkpfY2FzdDVfY2JjCQkJMUwsMkwsODQwTCwxMTM1MzNMLDdMLDY2TCwxMEwKKworI2RlZmluZSBTTl9jYXN0NV9lY2IJCQkiQ0FTVDUtRUNCIgorI2RlZmluZSBMTl9jYXN0NV9lY2IJCQkiY2FzdDUtZWNiIgorI2RlZmluZSBOSURfY2FzdDVfZWNiCQkJMTA5CisKKyNkZWZpbmUgU05fY2FzdDVfY2ZiNjQJCQkiQ0FTVDUtQ0ZCIgorI2RlZmluZSBMTl9jYXN0NV9jZmI2NAkJCSJjYXN0NS1jZmIiCisjZGVmaW5lIE5JRF9jYXN0NV9jZmI2NAkJCTExMAorCisjZGVmaW5lIFNOX2Nhc3Q1X29mYjY0CQkJIkNBU1Q1LU9GQiIKKyNkZWZpbmUgTE5fY2FzdDVfb2ZiNjQJCQkiY2FzdDUtb2ZiIgorI2RlZmluZSBOSURfY2FzdDVfb2ZiNjQJCQkxMTEKKworI2RlZmluZSBMTl9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDCSJwYmVXaXRoTUQ1QW5kQ2FzdDVDQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDCTExMgorI2RlZmluZSBPQkpfcGJlV2l0aE1ENUFuZENhc3Q1X0NCQwkxTCwyTCw4NDBMLDExMzUzM0wsN0wsNjZMLDEyTAorCisvKiBUaGlzIGlzIG9uZSBzdW4gd2lsbCBzb29uIGJlIHVzaW5nIDotKAorICogaWQtZHNhLXdpdGgtc2hhMSBJRCAgOjo9IHsKKyAqICAgaXNvKDEpIG1lbWJlci1ib2R5KDIpIHVzKDg0MCkgeDktNTcgKDEwMDQwKSB4OWNtKDQpIDMgfQorICovCisjZGVmaW5lIFNOX2RzYVdpdGhTSEExCQkJIkRTQS1TSEExIgorI2RlZmluZSBMTl9kc2FXaXRoU0hBMQkJCSJkc2FXaXRoU0hBMSIKKyNkZWZpbmUgTklEX2RzYVdpdGhTSEExCQkJMTEzCisjZGVmaW5lIE9CSl9kc2FXaXRoU0hBMQkJCTFMLDJMLDg0MEwsMTAwNDBMLDRMLDNMCisKKyNkZWZpbmUgTklEX21kNV9zaGExCQkJMTE0CisjZGVmaW5lIFNOX21kNV9zaGExCQkJIk1ENS1TSEExIgorI2RlZmluZSBMTl9tZDVfc2hhMQkJCSJtZDUtc2hhMSIKKworI2RlZmluZSBTTl9zaGExV2l0aFJTQQkJCSJSU0EtU0hBMS0yIgorI2RlZmluZSBMTl9zaGExV2l0aFJTQQkJCSJzaGExV2l0aFJTQSIKKyNkZWZpbmUgTklEX3NoYTFXaXRoUlNBCQkJMTE1CisjZGVmaW5lIE9CSl9zaGExV2l0aFJTQQkJCU9CSl9hbGdvcml0aG0sMjlMCisKKyNkZWZpbmUgU05fZHNhCQkJCSJEU0EiCisjZGVmaW5lIExOX2RzYQkJCQkiZHNhRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX2RzYQkJCQkxMTYKKyNkZWZpbmUgT0JKX2RzYQkJCQkxTCwyTCw4NDBMLDEwMDQwTCw0TCwxTAorCisjZGVmaW5lIFNOX3JpcGVtZDE2MAkJCSJSSVBFTUQxNjAiCisjZGVmaW5lIExOX3JpcGVtZDE2MAkJCSJyaXBlbWQxNjAiCisjZGVmaW5lIE5JRF9yaXBlbWQxNjAJCQkxMTcKKyNkZWZpbmUgT0JKX3JpcGVtZDE2MAkJCTFMLDNMLDM2TCwzTCwyTCwxTAorCisvKiBUaGUgbmFtZSBzaG91bGQgYWN0dWFsbHkgYmUgcnNhU2lnbmF0dXJlV2l0aHJpcGVtZDE2MCwgYnV0IEknbSBnb2luZworICogdG8gY29udGludWUgdXNpbmcgdGhlIGNvbnZlbnRpb24gSSdtIHVzaW5nIHdpdGggdGhlIG90aGVyIGNpcGhlcnMgKi8KKyNkZWZpbmUgU05fcmlwZW1kMTYwV2l0aFJTQQkJIlJTQS1SSVBFTUQxNjAiCisjZGVmaW5lIExOX3JpcGVtZDE2MFdpdGhSU0EJCSJyaXBlbWQxNjBXaXRoUlNBIgorI2RlZmluZSBOSURfcmlwZW1kMTYwV2l0aFJTQQkJMTE5CisjZGVmaW5lIE9CSl9yaXBlbWQxNjBXaXRoUlNBCQkxTCwzTCwzNkwsM0wsM0wsMUwsMkwKKworLyogVGFrZW4gZnJvbSByZmMyMDQwCisgKiAgUkM1X0NCQ19QYXJhbWV0ZXJzIDo6PSBTRVFVRU5DRSB7CisgKgl2ZXJzaW9uICAgICAgICAgICBJTlRFR0VSICh2MV8wKDE2KSksCisgKglyb3VuZHMgICAgICAgICAgICBJTlRFR0VSICg4Li4xMjcpLAorICoJYmxvY2tTaXplSW5CaXRzICAgSU5URUdFUiAoNjQsIDEyOCksCisgKglpdiAgICAgICAgICAgICAgICBPQ1RFVCBTVFJJTkcgT1BUSU9OQUwKKyAqCX0KKyAqLworI2RlZmluZSBTTl9yYzVfY2JjCQkJIlJDNS1DQkMiCisjZGVmaW5lIExOX3JjNV9jYmMJCQkicmM1LWNiYyIKKyNkZWZpbmUgTklEX3JjNV9jYmMJCQkxMjAKKyNkZWZpbmUgT0JKX3JjNV9jYmMJCQlPQkpfcnNhZHNpLDNMLDhMCisKKyNkZWZpbmUgU05fcmM1X2VjYgkJCSJSQzUtRUNCIgorI2RlZmluZSBMTl9yYzVfZWNiCQkJInJjNS1lY2IiCisjZGVmaW5lIE5JRF9yYzVfZWNiCQkJMTIxCisKKyNkZWZpbmUgU05fcmM1X2NmYjY0CQkJIlJDNS1DRkIiCisjZGVmaW5lIExOX3JjNV9jZmI2NAkJCSJyYzUtY2ZiIgorI2RlZmluZSBOSURfcmM1X2NmYjY0CQkJMTIyCisKKyNkZWZpbmUgU05fcmM1X29mYjY0CQkJIlJDNS1PRkIiCisjZGVmaW5lIExOX3JjNV9vZmI2NAkJCSJyYzUtb2ZiIgorI2RlZmluZSBOSURfcmM1X29mYjY0CQkJMTIzCisKKyNkZWZpbmUgU05fcmxlX2NvbXByZXNzaW9uCQkiUkxFIgorI2RlZmluZSBMTl9ybGVfY29tcHJlc3Npb24JCSJydW4gbGVuZ3RoIGNvbXByZXNzaW9uIgorI2RlZmluZSBOSURfcmxlX2NvbXByZXNzaW9uCQkxMjQKKyNkZWZpbmUgT0JKX3JsZV9jb21wcmVzc2lvbgkJMUwsMUwsMUwsMUwsNjY2TCwxTAorCisjZGVmaW5lIFNOX3psaWJfY29tcHJlc3Npb24JCSJaTElCIgorI2RlZmluZSBMTl96bGliX2NvbXByZXNzaW9uCQkiemxpYiBjb21wcmVzc2lvbiIKKyNkZWZpbmUgTklEX3psaWJfY29tcHJlc3Npb24JCTEyNQorI2RlZmluZSBPQkpfemxpYl9jb21wcmVzc2lvbgkJMUwsMUwsMUwsMUwsNjY2TCwyTAorCisjZGVmaW5lIFNOX2V4dF9rZXlfdXNhZ2UJCSJleHRlbmRlZEtleVVzYWdlIgorI2RlZmluZSBMTl9leHRfa2V5X3VzYWdlCQkiWDUwOXYzIEV4dGVuZGVkIEtleSBVc2FnZSIKKyNkZWZpbmUgTklEX2V4dF9rZXlfdXNhZ2UJCTEyNgorI2RlZmluZSBPQkpfZXh0X2tleV91c2FnZQkJT0JKX2lkX2NlLDM3CisKKyNkZWZpbmUgU05faWRfcGtpeAkJCSJQS0lYIgorI2RlZmluZSBOSURfaWRfcGtpeAkJCTEyNworI2RlZmluZSBPQkpfaWRfcGtpeAkJCTFMLDNMLDZMLDFMLDVMLDVMLDdMCisKKyNkZWZpbmUgU05faWRfa3AJCQkiaWQta3AiCisjZGVmaW5lIE5JRF9pZF9rcAkJCTEyOAorI2RlZmluZSBPQkpfaWRfa3AJCQlPQkpfaWRfcGtpeCwzTAorCisvKiBQS0lYIGV4dGVuZGVkIGtleSB1c2FnZSBPSURzICovCisKKyNkZWZpbmUgU05fc2VydmVyX2F1dGgJCQkic2VydmVyQXV0aCIKKyNkZWZpbmUgTE5fc2VydmVyX2F1dGgJCQkiVExTIFdlYiBTZXJ2ZXIgQXV0aGVudGljYXRpb24iCisjZGVmaW5lIE5JRF9zZXJ2ZXJfYXV0aAkJCTEyOQorI2RlZmluZSBPQkpfc2VydmVyX2F1dGgJCQlPQkpfaWRfa3AsMUwKKworI2RlZmluZSBTTl9jbGllbnRfYXV0aAkJCSJjbGllbnRBdXRoIgorI2RlZmluZSBMTl9jbGllbnRfYXV0aAkJCSJUTFMgV2ViIENsaWVudCBBdXRoZW50aWNhdGlvbiIKKyNkZWZpbmUgTklEX2NsaWVudF9hdXRoCQkJMTMwCisjZGVmaW5lIE9CSl9jbGllbnRfYXV0aAkJCU9CSl9pZF9rcCwyTAorCisjZGVmaW5lIFNOX2NvZGVfc2lnbgkJCSJjb2RlU2lnbmluZyIKKyNkZWZpbmUgTE5fY29kZV9zaWduCQkJIkNvZGUgU2lnbmluZyIKKyNkZWZpbmUgTklEX2NvZGVfc2lnbgkJCTEzMQorI2RlZmluZSBPQkpfY29kZV9zaWduCQkJT0JKX2lkX2twLDNMCisKKyNkZWZpbmUgU05fZW1haWxfcHJvdGVjdAkJImVtYWlsUHJvdGVjdGlvbiIKKyNkZWZpbmUgTE5fZW1haWxfcHJvdGVjdAkJIkUtbWFpbCBQcm90ZWN0aW9uIgorI2RlZmluZSBOSURfZW1haWxfcHJvdGVjdAkJMTMyCisjZGVmaW5lIE9CSl9lbWFpbF9wcm90ZWN0CQlPQkpfaWRfa3AsNEwKKworI2RlZmluZSBTTl90aW1lX3N0YW1wCQkJInRpbWVTdGFtcGluZyIKKyNkZWZpbmUgTE5fdGltZV9zdGFtcAkJCSJUaW1lIFN0YW1waW5nIgorI2RlZmluZSBOSURfdGltZV9zdGFtcAkJCTEzMworI2RlZmluZSBPQkpfdGltZV9zdGFtcAkJCU9CSl9pZF9rcCw4TAorCisvKiBBZGRpdGlvbmFsIGV4dGVuZGVkIGtleSB1c2FnZSBPSURzOiBNaWNyb3NvZnQgKi8KKworI2RlZmluZSBTTl9tc19jb2RlX2luZAkJCSJtc0NvZGVJbmQiCisjZGVmaW5lIExOX21zX2NvZGVfaW5kCQkJIk1pY3Jvc29mdCBJbmRpdmlkdWFsIENvZGUgU2lnbmluZyIKKyNkZWZpbmUgTklEX21zX2NvZGVfaW5kCQkJMTM0CisjZGVmaW5lIE9CSl9tc19jb2RlX2luZAkJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMjFMCisKKyNkZWZpbmUgU05fbXNfY29kZV9jb20JCQkibXNDb2RlQ29tIgorI2RlZmluZSBMTl9tc19jb2RlX2NvbQkJCSJNaWNyb3NvZnQgQ29tbWVyY2lhbCBDb2RlIFNpZ25pbmciCisjZGVmaW5lIE5JRF9tc19jb2RlX2NvbQkJCTEzNQorI2RlZmluZSBPQkpfbXNfY29kZV9jb20JCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDJMLDFMLDIyTAorCisjZGVmaW5lIFNOX21zX2N0bF9zaWduCQkJIm1zQ1RMU2lnbiIKKyNkZWZpbmUgTE5fbXNfY3RsX3NpZ24JCQkiTWljcm9zb2Z0IFRydXN0IExpc3QgU2lnbmluZyIKKyNkZWZpbmUgTklEX21zX2N0bF9zaWduCQkJMTM2CisjZGVmaW5lIE9CSl9tc19jdGxfc2lnbgkJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMTBMLDNMLDFMCisKKyNkZWZpbmUgU05fbXNfc2djCQkJIm1zU0dDIgorI2RlZmluZSBMTl9tc19zZ2MJCQkiTWljcm9zb2Z0IFNlcnZlciBHYXRlZCBDcnlwdG8iCisjZGVmaW5lIE5JRF9tc19zZ2MJCQkxMzcKKyNkZWZpbmUgT0JKX21zX3NnYwkJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMTBMLDNMLDNMCisKKyNkZWZpbmUgU05fbXNfZWZzCQkJIm1zRUZTIgorI2RlZmluZSBMTl9tc19lZnMJCQkiTWljcm9zb2Z0IEVuY3J5cHRlZCBGaWxlIFN5c3RlbSIKKyNkZWZpbmUgTklEX21zX2VmcwkJCTEzOAorI2RlZmluZSBPQkpfbXNfZWZzCQkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwxMEwsM0wsNEwKKworLyogQWRkaXRpb25hbCB1c2FnZTogTmV0c2NhcGUgKi8KKworI2RlZmluZSBTTl9uc19zZ2MJCQkibnNTR0MiCisjZGVmaW5lIExOX25zX3NnYwkJCSJOZXRzY2FwZSBTZXJ2ZXIgR2F0ZWQgQ3J5cHRvIgorI2RlZmluZSBOSURfbnNfc2djCQkJMTM5CisjZGVmaW5lIE9CSl9uc19zZ2MJCQlPQkpfbmV0c2NhcGUsNEwsMUwKKworI2RlZmluZSBTTl9kZWx0YV9jcmwJCQkiZGVsdGFDUkwiCisjZGVmaW5lIExOX2RlbHRhX2NybAkJCSJYNTA5djMgRGVsdGEgQ1JMIEluZGljYXRvciIKKyNkZWZpbmUgTklEX2RlbHRhX2NybAkJCTE0MAorI2RlZmluZSBPQkpfZGVsdGFfY3JsCQkJT0JKX2lkX2NlLDI3TAorCisjZGVmaW5lIFNOX2NybF9yZWFzb24JCQkiQ1JMUmVhc29uIgorI2RlZmluZSBMTl9jcmxfcmVhc29uCQkJIkNSTCBSZWFzb24gQ29kZSIKKyNkZWZpbmUgTklEX2NybF9yZWFzb24JCQkxNDEKKyNkZWZpbmUgT0JKX2NybF9yZWFzb24JCQlPQkpfaWRfY2UsMjFMCisKKyNkZWZpbmUgU05faW52YWxpZGl0eV9kYXRlCQkiaW52YWxpZGl0eURhdGUiCisjZGVmaW5lIExOX2ludmFsaWRpdHlfZGF0ZQkJIkludmFsaWRpdHkgRGF0ZSIKKyNkZWZpbmUgTklEX2ludmFsaWRpdHlfZGF0ZQkJMTQyCisjZGVmaW5lIE9CSl9pbnZhbGlkaXR5X2RhdGUJCU9CSl9pZF9jZSwyNEwKKworI2RlZmluZSBTTl9zeG5ldAkJCSJTWE5ldElEIgorI2RlZmluZSBMTl9zeG5ldAkJCSJTdHJvbmcgRXh0cmFuZXQgSUQiCisjZGVmaW5lIE5JRF9zeG5ldAkJCTE0MworI2RlZmluZSBPQkpfc3huZXQJCQkxTCwzTCwxMDFMLDFMLDRMLDFMCisKKy8qIFBLQ1MxMiBhbmQgcmVsYXRlZCBPQkpFQ1QgSURFTlRJRklFUlMgKi8KKworI2RlZmluZSBPQkpfcGtjczEyCQkJT0JKX3BrY3MsMTJMCisjZGVmaW5lIE9CSl9wa2NzMTJfcGJlaWRzCQlPQkpfcGtjczEyLCAxCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CSJQQkUtU0hBMS1SQzQtMTI4IgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJInBiZVdpdGhTSEExQW5kMTI4Qml0UkM0IgorI2RlZmluZSBOSURfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CTE0NAorI2RlZmluZSBPQkpfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CU9CSl9wa2NzMTJfcGJlaWRzLCAxTAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDQwQml0UkM0CSJQQkUtU0hBMS1SQzQtNDAiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDQwQml0UkM0CSJwYmVXaXRoU0hBMUFuZDQwQml0UkM0IgorI2RlZmluZSBOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQJMTQ1CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAlPQkpfcGtjczEyX3BiZWlkcywgMkwKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCSJQQkUtU0hBMS0zREVTIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCSJwYmVXaXRoU0hBMUFuZDMtS2V5VHJpcGxlREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMJMTQ2CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCU9CSl9wa2NzMTJfcGJlaWRzLCAzTAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJIlBCRS1TSEExLTJERVMiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJInBiZVdpdGhTSEExQW5kMi1LZXlUcmlwbGVERVMtQ0JDIgorI2RlZmluZSBOSURfcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQwkxNDcKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJT0JKX3BrY3MxMl9wYmVpZHMsIDRMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwkJIlBCRS1TSEExLVJDMi0xMjgiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMJCSJwYmVXaXRoU0hBMUFuZDEyOEJpdFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDCTE0OAorI2RlZmluZSBPQkpfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwlPQkpfcGtjczEyX3BiZWlkcywgNUwKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJIlBCRS1TSEExLVJDMi00MCIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDCSJwYmVXaXRoU0hBMUFuZDQwQml0UkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQwkxNDkKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQwlPQkpfcGtjczEyX3BiZWlkcywgNkwKKworI2RlZmluZSBPQkpfcGtjczEyX1ZlcnNpb24xCU9CSl9wa2NzMTIsIDEwTAorCisjZGVmaW5lIE9CSl9wa2NzMTJfQmFnSWRzCU9CSl9wa2NzMTJfVmVyc2lvbjEsIDFMCisKKyNkZWZpbmUgTE5fa2V5QmFnCQkia2V5QmFnIgorI2RlZmluZSBOSURfa2V5QmFnCQkxNTAKKyNkZWZpbmUgT0JKX2tleUJhZwkJT0JKX3BrY3MxMl9CYWdJZHMsIDFMCisKKyNkZWZpbmUgTE5fcGtjczhTaHJvdWRlZEtleUJhZwkicGtjczhTaHJvdWRlZEtleUJhZyIKKyNkZWZpbmUgTklEX3BrY3M4U2hyb3VkZWRLZXlCYWcJMTUxCisjZGVmaW5lIE9CSl9wa2NzOFNocm91ZGVkS2V5QmFnCU9CSl9wa2NzMTJfQmFnSWRzLCAyTAorCisjZGVmaW5lIExOX2NlcnRCYWcJCSJjZXJ0QmFnIgorI2RlZmluZSBOSURfY2VydEJhZwkJMTUyCisjZGVmaW5lIE9CSl9jZXJ0QmFnCQlPQkpfcGtjczEyX0JhZ0lkcywgM0wKKworI2RlZmluZSBMTl9jcmxCYWcJCSJjcmxCYWciCisjZGVmaW5lIE5JRF9jcmxCYWcJCTE1MworI2RlZmluZSBPQkpfY3JsQmFnCQlPQkpfcGtjczEyX0JhZ0lkcywgNEwKKworI2RlZmluZSBMTl9zZWNyZXRCYWcJCSJzZWNyZXRCYWciCisjZGVmaW5lIE5JRF9zZWNyZXRCYWcJCTE1NAorI2RlZmluZSBPQkpfc2VjcmV0QmFnCQlPQkpfcGtjczEyX0JhZ0lkcywgNUwKKworI2RlZmluZSBMTl9zYWZlQ29udGVudHNCYWcJInNhZmVDb250ZW50c0JhZyIKKyNkZWZpbmUgTklEX3NhZmVDb250ZW50c0JhZwkxNTUKKyNkZWZpbmUgT0JKX3NhZmVDb250ZW50c0JhZwlPQkpfcGtjczEyX0JhZ0lkcywgNkwKKworI2RlZmluZSBMTl9mcmllbmRseU5hbWUJCSJmcmllbmRseU5hbWUiCisjZGVmaW5lCU5JRF9mcmllbmRseU5hbWUJMTU2CisjZGVmaW5lIE9CSl9mcmllbmRseU5hbWUJT0JKX3BrY3M5LCAyMEwKKworI2RlZmluZSBMTl9sb2NhbEtleUlECQkibG9jYWxLZXlJRCIKKyNkZWZpbmUJTklEX2xvY2FsS2V5SUQJCTE1NworI2RlZmluZSBPQkpfbG9jYWxLZXlJRAkJT0JKX3BrY3M5LCAyMUwKKworI2RlZmluZSBPQkpfY2VydFR5cGVzCQlPQkpfcGtjczksIDIyTAorCisjZGVmaW5lIExOX3g1MDlDZXJ0aWZpY2F0ZQkieDUwOUNlcnRpZmljYXRlIgorI2RlZmluZQlOSURfeDUwOUNlcnRpZmljYXRlCTE1OAorI2RlZmluZSBPQkpfeDUwOUNlcnRpZmljYXRlCU9CSl9jZXJ0VHlwZXMsIDFMCisKKyNkZWZpbmUgTE5fc2RzaUNlcnRpZmljYXRlCSJzZHNpQ2VydGlmaWNhdGUiCisjZGVmaW5lCU5JRF9zZHNpQ2VydGlmaWNhdGUJMTU5CisjZGVmaW5lIE9CSl9zZHNpQ2VydGlmaWNhdGUJT0JKX2NlcnRUeXBlcywgMkwKKworI2RlZmluZSBPQkpfY3JsVHlwZXMJCU9CSl9wa2NzOSwgMjNMCisKKyNkZWZpbmUgTE5feDUwOUNybAkJIng1MDlDcmwiCisjZGVmaW5lCU5JRF94NTA5Q3JsCQkxNjAKKyNkZWZpbmUgT0JKX3g1MDlDcmwJCU9CSl9jcmxUeXBlcywgMUwKKworLyogUEtDUyM1IHYyIE9JRHMgKi8KKworI2RlZmluZSBMTl9wYmVzMgkJIlBCRVMyIgorI2RlZmluZSBOSURfcGJlczIJCTE2MQorI2RlZmluZSBPQkpfcGJlczIJCU9CSl9wa2NzLDVMLDEzTAorCisjZGVmaW5lIExOX3BibWFjMQkJIlBCTUFDMSIKKyNkZWZpbmUgTklEX3BibWFjMQkJMTYyCisjZGVmaW5lIE9CSl9wYm1hYzEJCU9CSl9wa2NzLDVMLDE0TAorCisjZGVmaW5lIExOX2htYWNXaXRoU0hBMQkJImhtYWNXaXRoU0hBMSIKKyNkZWZpbmUgTklEX2htYWNXaXRoU0hBMQkxNjMKKyNkZWZpbmUgT0JKX2htYWNXaXRoU0hBMQlPQkpfcnNhZHNpLDJMLDdMCisKKy8qIFBvbGljeSBRdWFsaWZpZXIgSWRzICovCisKKyNkZWZpbmUgTE5faWRfcXRfY3BzCQkiUG9saWN5IFF1YWxpZmllciBDUFMiCisjZGVmaW5lIFNOX2lkX3F0X2NwcwkJImlkLXF0LWNwcyIKKyNkZWZpbmUgTklEX2lkX3F0X2NwcwkJMTY0CisjZGVmaW5lIE9CSl9pZF9xdF9jcHMJCU9CSl9pZF9wa2l4LDJMLDFMCisKKyNkZWZpbmUgTE5faWRfcXRfdW5vdGljZQkiUG9saWN5IFF1YWxpZmllciBVc2VyIE5vdGljZSIKKyNkZWZpbmUgU05faWRfcXRfdW5vdGljZQkiaWQtcXQtdW5vdGljZSIKKyNkZWZpbmUgTklEX2lkX3F0X3Vub3RpY2UJMTY1CisjZGVmaW5lIE9CSl9pZF9xdF91bm90aWNlCU9CSl9pZF9wa2l4LDJMLDJMCisKKyNkZWZpbmUgU05fcmMyXzY0X2NiYwkJCSJSQzItNjQtQ0JDIgorI2RlZmluZSBMTl9yYzJfNjRfY2JjCQkJInJjMi02NC1jYmMiCisjZGVmaW5lIE5JRF9yYzJfNjRfY2JjCQkJMTY2CisKKyNkZWZpbmUgU05fU01JTUVDYXBhYmlsaXRpZXMJCSJTTUlNRS1DQVBTIgorI2RlZmluZSBMTl9TTUlNRUNhcGFiaWxpdGllcwkJIlMvTUlNRSBDYXBhYmlsaXRpZXMiCisjZGVmaW5lIE5JRF9TTUlNRUNhcGFiaWxpdGllcwkJMTY3CisjZGVmaW5lIE9CSl9TTUlNRUNhcGFiaWxpdGllcwkJT0JKX3BrY3M5LDE1TAorCisjZGVmaW5lIFNOX3BiZVdpdGhNRDJBbmRSQzJfQ0JDCQkiUEJFLU1EMi1SQzItNjQiCisjZGVmaW5lIExOX3BiZVdpdGhNRDJBbmRSQzJfQ0JDCQkicGJlV2l0aE1EMkFuZFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQyQW5kUkMyX0NCQwkxNjgKKyNkZWZpbmUgT0JKX3BiZVdpdGhNRDJBbmRSQzJfQ0JDCU9CSl9wa2NzLDVMLDRMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1ENUFuZFJDMl9DQkMJCSJQQkUtTUQ1LVJDMi02NCIKKyNkZWZpbmUgTE5fcGJlV2l0aE1ENUFuZFJDMl9DQkMJCSJwYmVXaXRoTUQ1QW5kUkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDVBbmRSQzJfQ0JDCTE2OQorI2RlZmluZSBPQkpfcGJlV2l0aE1ENUFuZFJDMl9DQkMJT0JKX3BrY3MsNUwsNkwKKworI2RlZmluZSBTTl9wYmVXaXRoU0hBMUFuZERFU19DQkMJIlBCRS1TSEExLURFUyIKKyNkZWZpbmUgTE5fcGJlV2l0aFNIQTFBbmRERVNfQ0JDCSJwYmVXaXRoU0hBMUFuZERFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoU0hBMUFuZERFU19DQkMJMTcwCisjZGVmaW5lIE9CSl9wYmVXaXRoU0hBMUFuZERFU19DQkMJT0JKX3BrY3MsNUwsMTBMCisKKy8qIEV4dGVuc2lvbiByZXF1ZXN0IE9JRHMgKi8KKworI2RlZmluZSBMTl9tc19leHRfcmVxCQkJIk1pY3Jvc29mdCBFeHRlbnNpb24gUmVxdWVzdCIKKyNkZWZpbmUgU05fbXNfZXh0X3JlcQkJCSJtc0V4dFJlcSIKKyNkZWZpbmUgTklEX21zX2V4dF9yZXEJCQkxNzEKKyNkZWZpbmUgT0JKX21zX2V4dF9yZXEJCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDJMLDFMLDE0TAorCisjZGVmaW5lIExOX2V4dF9yZXEJCQkiRXh0ZW5zaW9uIFJlcXVlc3QiCisjZGVmaW5lIFNOX2V4dF9yZXEJCQkiZXh0UmVxIgorI2RlZmluZSBOSURfZXh0X3JlcQkJCTE3MgorI2RlZmluZSBPQkpfZXh0X3JlcQkJCU9CSl9wa2NzOSwxNEwKKworI2RlZmluZSBTTl9uYW1lCQkJCSJuYW1lIgorI2RlZmluZSBMTl9uYW1lCQkJCSJuYW1lIgorI2RlZmluZSBOSURfbmFtZQkJCTE3MworI2RlZmluZSBPQkpfbmFtZQkJCU9CSl9YNTA5LDQxTAorCisjZGVmaW5lIFNOX2RuUXVhbGlmaWVyCQkJImRuUXVhbGlmaWVyIgorI2RlZmluZSBMTl9kblF1YWxpZmllcgkJCSJkblF1YWxpZmllciIKKyNkZWZpbmUgTklEX2RuUXVhbGlmaWVyCQkJMTc0CisjZGVmaW5lIE9CSl9kblF1YWxpZmllcgkJCU9CSl9YNTA5LDQ2TAorCisjZGVmaW5lIFNOX2lkX3BlCQkJImlkLXBlIgorI2RlZmluZSBOSURfaWRfcGUJCQkxNzUKKyNkZWZpbmUgT0JKX2lkX3BlCQkJT0JKX2lkX3BraXgsMUwKKworI2RlZmluZSBTTl9pZF9hZAkJCSJpZC1hZCIKKyNkZWZpbmUgTklEX2lkX2FkCQkJMTc2CisjZGVmaW5lIE9CSl9pZF9hZAkJCU9CSl9pZF9wa2l4LDQ4TAorCisjZGVmaW5lIFNOX2luZm9fYWNjZXNzCQkJImF1dGhvcml0eUluZm9BY2Nlc3MiCisjZGVmaW5lIExOX2luZm9fYWNjZXNzCQkJIkF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3MiCisjZGVmaW5lIE5JRF9pbmZvX2FjY2VzcwkJCTE3NworI2RlZmluZSBPQkpfaW5mb19hY2Nlc3MJCQlPQkpfaWRfcGUsMUwKKworI2RlZmluZSBTTl9hZF9PQ1NQCQkJIk9DU1AiCisjZGVmaW5lIExOX2FkX09DU1AJCQkiT0NTUCIKKyNkZWZpbmUgTklEX2FkX09DU1AJCQkxNzgKKyNkZWZpbmUgT0JKX2FkX09DU1AJCQlPQkpfaWRfYWQsMUwKKworI2RlZmluZSBTTl9hZF9jYV9pc3N1ZXJzCQkiY2FJc3N1ZXJzIgorI2RlZmluZSBMTl9hZF9jYV9pc3N1ZXJzCQkiQ0EgSXNzdWVycyIKKyNkZWZpbmUgTklEX2FkX2NhX2lzc3VlcnMJCTE3OQorI2RlZmluZSBPQkpfYWRfY2FfaXNzdWVycwkJT0JKX2lkX2FkLDJMCisKKyNkZWZpbmUgU05fT0NTUF9zaWduCQkJIk9DU1BTaWduaW5nIgorI2RlZmluZSBMTl9PQ1NQX3NpZ24JCQkiT0NTUCBTaWduaW5nIgorI2RlZmluZSBOSURfT0NTUF9zaWduCQkJMTgwCisjZGVmaW5lIE9CSl9PQ1NQX3NpZ24JCQlPQkpfaWRfa3AsOUwKKyNlbmRpZiAvKiBVU0VfT0JKX01BQyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2RlZmluZQlPQkpfTkFNRV9UWVBFX1VOREVGCQkweDAwCisjZGVmaW5lCU9CSl9OQU1FX1RZUEVfTURfTUVUSAkJMHgwMQorI2RlZmluZQlPQkpfTkFNRV9UWVBFX0NJUEhFUl9NRVRICTB4MDIKKyNkZWZpbmUJT0JKX05BTUVfVFlQRV9QS0VZX01FVEgJCTB4MDMKKyNkZWZpbmUJT0JKX05BTUVfVFlQRV9DT01QX01FVEgJCTB4MDQKKyNkZWZpbmUJT0JKX05BTUVfVFlQRV9OVU0JCTB4MDUKKworI2RlZmluZQlPQkpfTkFNRV9BTElBUwkJCTB4ODAwMAorCisjZGVmaW5lIE9CSl9CU0VBUkNIX1ZBTFVFX09OX05PTUFUQ0gJCTB4MDEKKyNkZWZpbmUgT0JKX0JTRUFSQ0hfRklSU1RfVkFMVUVfT05fTUFUQ0gJMHgwMgorCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IG9ial9uYW1lX3N0CisJeworCWludCB0eXBlOworCWludCBhbGlhczsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmRhdGE7CisJfSBPQkpfTkFNRTsKKworI2RlZmluZQkJT0JKX2NyZWF0ZV9hbmRfYWRkX29iamVjdChhLGIsYykgT0JKX2NyZWF0ZShhLGIsYykKKworCitpbnQgT0JKX05BTUVfaW5pdCh2b2lkKTsKK2ludCBPQkpfTkFNRV9uZXdfaW5kZXgodW5zaWduZWQgbG9uZyAoKmhhc2hfZnVuYykoY29uc3QgY2hhciAqKSwKKwkJICAgICAgIGludCAoKmNtcF9mdW5jKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCisJCSAgICAgICB2b2lkICgqZnJlZV9mdW5jKShjb25zdCBjaGFyICosIGludCwgY29uc3QgY2hhciAqKSk7Citjb25zdCBjaGFyICpPQkpfTkFNRV9nZXQoY29uc3QgY2hhciAqbmFtZSxpbnQgdHlwZSk7CitpbnQgT0JKX05BTUVfYWRkKGNvbnN0IGNoYXIgKm5hbWUsaW50IHR5cGUsY29uc3QgY2hhciAqZGF0YSk7CitpbnQgT0JKX05BTUVfcmVtb3ZlKGNvbnN0IGNoYXIgKm5hbWUsaW50IHR5cGUpOwordm9pZCBPQkpfTkFNRV9jbGVhbnVwKGludCB0eXBlKTsgLyogLTEgZm9yIGV2ZXJ5dGhpbmcgKi8KK3ZvaWQgT0JKX05BTUVfZG9fYWxsKGludCB0eXBlLHZvaWQgKCpmbikoY29uc3QgT0JKX05BTUUgKix2b2lkICphcmcpLAorCQkgICAgIHZvaWQgKmFyZyk7Cit2b2lkIE9CSl9OQU1FX2RvX2FsbF9zb3J0ZWQoaW50IHR5cGUsdm9pZCAoKmZuKShjb25zdCBPQkpfTkFNRSAqLHZvaWQgKmFyZyksCisJCQkgICAgdm9pZCAqYXJnKTsKKworQVNOMV9PQkpFQ1QgKglPQkpfZHVwKGNvbnN0IEFTTjFfT0JKRUNUICpvKTsKK0FTTjFfT0JKRUNUICoJT0JKX25pZDJvYmooaW50IG4pOworY29uc3QgY2hhciAqCU9CSl9uaWQybG4oaW50IG4pOworY29uc3QgY2hhciAqCU9CSl9uaWQyc24oaW50IG4pOworaW50CQlPQkpfb2JqMm5pZChjb25zdCBBU04xX09CSkVDVCAqbyk7CitBU04xX09CSkVDVCAqCU9CSl90eHQyb2JqKGNvbnN0IGNoYXIgKnMsIGludCBub19uYW1lKTsKK2ludAlPQkpfb2JqMnR4dChjaGFyICpidWYsIGludCBidWZfbGVuLCBjb25zdCBBU04xX09CSkVDVCAqYSwgaW50IG5vX25hbWUpOworaW50CQlPQkpfdHh0Mm5pZChjb25zdCBjaGFyICpzKTsKK2ludAkJT0JKX2xuMm5pZChjb25zdCBjaGFyICpzKTsKK2ludAkJT0JKX3NuMm5pZChjb25zdCBjaGFyICpzKTsKK2ludAkJT0JKX2NtcChjb25zdCBBU04xX09CSkVDVCAqYSxjb25zdCBBU04xX09CSkVDVCAqYik7Citjb25zdCB2b2lkICoJT0JKX2JzZWFyY2hfKGNvbnN0IHZvaWQgKmtleSxjb25zdCB2b2lkICpiYXNlLGludCBudW0saW50IHNpemUsCisJCQkgICAgIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK2NvbnN0IHZvaWQgKglPQkpfYnNlYXJjaF9leF8oY29uc3Qgdm9pZCAqa2V5LGNvbnN0IHZvaWQgKmJhc2UsaW50IG51bSwKKwkJCQlpbnQgc2l6ZSwKKwkJCQlpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSwKKwkJCQlpbnQgZmxhZ3MpOworCisjZGVmaW5lIF9ERUNMQVJFX09CSl9CU0VBUkNIX0NNUF9GTihzY29wZSwgdHlwZTEsIHR5cGUyLCBubSkJXAorICBzdGF0aWMgaW50IG5tIyNfY21wX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsgXAorICBzdGF0aWMgaW50IG5tIyNfY21wKHR5cGUxIGNvbnN0ICosIHR5cGUyIGNvbnN0ICopOyBcCisgIHNjb3BlIHR5cGUyICogT0JKX2JzZWFyY2hfIyNubSh0eXBlMSAqa2V5LCB0eXBlMiBjb25zdCAqYmFzZSwgaW50IG51bSkKKworI2RlZmluZSBERUNMQVJFX09CSl9CU0VBUkNIX0NNUF9GTih0eXBlMSwgdHlwZTIsIGNtcCkJXAorICBfREVDTEFSRV9PQkpfQlNFQVJDSF9DTVBfRk4oc3RhdGljLCB0eXBlMSwgdHlwZTIsIGNtcCkKKyNkZWZpbmUgREVDTEFSRV9PQkpfQlNFQVJDSF9HTE9CQUxfQ01QX0ZOKHR5cGUxLCB0eXBlMiwgbm0pCVwKKyAgdHlwZTIgKiBPQkpfYnNlYXJjaF8jI25tKHR5cGUxICprZXksIHR5cGUyIGNvbnN0ICpiYXNlLCBpbnQgbnVtKQorCisvKgorICogVW5zb2x2ZWQgcHJvYmxlbTogaWYgYSB0eXBlIGlzIGFjdHVhbGx5IGEgcG9pbnRlciB0eXBlLCBsaWtlCisgKiBuaWRfdHJpcGxlIGlzLCB0aGVuIGl0cyBpbXBvc3NpYmxlIHRvIGdldCBhIGNvbnN0IHdoZXJlIHlvdSBuZWVkCisgKiBpdC4gQ29uc2lkZXI6CisgKgorICogdHlwZWRlZiBpbnQgbmlkX3RyaXBsZVszXTsKKyAqIGNvbnN0IHZvaWQgKmFfOworICogY29uc3QgbmlkX3RyaXBsZSBjb25zdCAqYSA9IGFfOworICoKKyAqIFRoZSBhc3NpZ25lbWVudCBkaXNjYXJkcyBhIGNvbnN0IGJlY2F1c2Ugd2hhdCB5b3UgcmVhbGx5IHdhbnQgaXM6CisgKgorICogY29uc3QgaW50IGNvbnN0ICogY29uc3QgKmEgPSBhXzsKKyAqCisgKiBCdXQgaWYgeW91IGRvIHRoYXQsIHlvdSBsb3NlIHRoZSBmYWN0IHRoYXQgYSBpcyBhbiBhcnJheSBvZiAzIGludHMsCisgKiB3aGljaCBicmVha3MgY29tcGFyaXNvbiBmdW5jdGlvbnMuCisgKgorICogVGh1cyB3ZSBlbmQgdXAgaGF2aW5nIHRvIGNhc3QsIHNhZGx5LCBvciB1bnBhY2sgdGhlCisgKiBkZWNsYXJhdGlvbnMuIE9yLCBhcyBJIGZpbmFsbHkgZGlkIGluIHRoaXMgY2FzZSwgZGVsY2FyZSBuaWRfdHJpcGxlCisgKiB0byBiZSBhIHN0cnVjdCwgd2hpY2ggaXQgc2hvdWxkIGhhdmUgYmVlbiBpbiB0aGUgZmlyc3QgcGxhY2UuCisgKgorICogQmVuLCBBdWd1c3QgMjAwOC4KKyAqCisgKiBBbHNvLCBzdHJpY3RseSBzcGVha2luZyBub3QgYWxsIHR5cGVzIG5lZWQgYmUgY29uc3QsIGJ1dCBoYW5kbGluZworICogdGhlIG5vbi1jb25zdG5lc3MgbWVhbnMgYSBsb3Qgb2YgY29tcGxpY2F0aW9uLCBhbmQgaW4gcHJhY3RpY2UKKyAqIGNvbXBhcmlzb24gcm91dGluZXMgZG8gYWx3YXlzIG5vdCB0b3VjaCB0aGVpciBhcmd1bWVudHMuCisgKi8KKworI2RlZmluZSBJTVBMRU1FTlRfT0JKX0JTRUFSQ0hfQ01QX0ZOKHR5cGUxLCB0eXBlMiwgbm0pCVwKKyAgc3RhdGljIGludCBubSMjX2NtcF9CU0VBUkNIX0NNUF9GTihjb25zdCB2b2lkICphXywgY29uc3Qgdm9pZCAqYl8pCVwKKyAgICAgIHsgXAorICAgICAgdHlwZTEgY29uc3QgKmEgPSBhXzsgXAorICAgICAgdHlwZTIgY29uc3QgKmIgPSBiXzsgXAorICAgICAgcmV0dXJuIG5tIyNfY21wKGEsYik7IFwKKyAgICAgIH0gXAorICBzdGF0aWMgdHlwZTIgKk9CSl9ic2VhcmNoXyMjbm0odHlwZTEgKmtleSwgdHlwZTIgY29uc3QgKmJhc2UsIGludCBudW0pIFwKKyAgICAgIHsgXAorICAgICAgcmV0dXJuICh0eXBlMiAqKU9CSl9ic2VhcmNoXyhrZXksIGJhc2UsIG51bSwgc2l6ZW9mKHR5cGUyKSwgXAorCQkJCQlubSMjX2NtcF9CU0VBUkNIX0NNUF9GTik7IFwKKyAgICAgIH0gXAorICAgICAgZXh0ZXJuIHZvaWQgZHVtbXlfcHJvdG90eXBlKHZvaWQpCisKKyNkZWZpbmUgSU1QTEVNRU5UX09CSl9CU0VBUkNIX0dMT0JBTF9DTVBfRk4odHlwZTEsIHR5cGUyLCBubSkJXAorICBzdGF0aWMgaW50IG5tIyNfY21wX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykJXAorICAgICAgeyBcCisgICAgICB0eXBlMSBjb25zdCAqYSA9IGFfOyBcCisgICAgICB0eXBlMiBjb25zdCAqYiA9IGJfOyBcCisgICAgICByZXR1cm4gbm0jI19jbXAoYSxiKTsgXAorICAgICAgfSBcCisgIHR5cGUyICpPQkpfYnNlYXJjaF8jI25tKHR5cGUxICprZXksIHR5cGUyIGNvbnN0ICpiYXNlLCBpbnQgbnVtKSBcCisgICAgICB7IFwKKyAgICAgIHJldHVybiAodHlwZTIgKilPQkpfYnNlYXJjaF8oa2V5LCBiYXNlLCBudW0sIHNpemVvZih0eXBlMiksIFwKKwkJCQkJbm0jI19jbXBfQlNFQVJDSF9DTVBfRk4pOyBcCisgICAgICB9IFwKKyAgICAgIGV4dGVybiB2b2lkIGR1bW15X3Byb3RvdHlwZSh2b2lkKQorCisjZGVmaW5lIE9CSl9ic2VhcmNoKHR5cGUxLGtleSx0eXBlMixiYXNlLG51bSxjbXApCQkJICAgICAgIFwKKyAgKCh0eXBlMiAqKU9CSl9ic2VhcmNoXyhDSEVDS0VEX1BUUl9PRih0eXBlMSxrZXkpLENIRUNLRURfUFRSX09GKHR5cGUyLGJhc2UpLCBcCisJCQkgbnVtLHNpemVvZih0eXBlMiksCQkJCVwKKwkJCSAoKHZvaWQpQ0hFQ0tFRF9QVFJfT0YodHlwZTEsY21wIyNfdHlwZV8xKSwJXAorCQkJICAodm9pZClDSEVDS0VEX1BUUl9PRih0eXBlMixjbXAjI190eXBlXzIpLAlcCisJCQkgIGNtcCMjX0JTRUFSQ0hfQ01QX0ZOKSkpCisKKyNkZWZpbmUgT0JKX2JzZWFyY2hfZXgodHlwZTEsa2V5LHR5cGUyLGJhc2UsbnVtLGNtcCxmbGFncykJCQlcCisgICgodHlwZTIgKilPQkpfYnNlYXJjaF9leF8oQ0hFQ0tFRF9QVFJfT0YodHlwZTEsa2V5KSxDSEVDS0VEX1BUUl9PRih0eXBlMixiYXNlKSwgXAorCQkJIG51bSxzaXplb2YodHlwZTIpLAkJCQlcCisJCQkgKCh2b2lkKUNIRUNLRURfUFRSX09GKHR5cGUxLGNtcCMjX3R5cGVfMSksCVwKKwkJCSAgKHZvaWQpdHlwZV8yPUNIRUNLRURfUFRSX09GKHR5cGUyLGNtcCMjX3R5cGVfMiksIFwKKwkJCSAgY21wIyNfQlNFQVJDSF9DTVBfRk4pKSxmbGFncykKKworaW50CQlPQkpfbmV3X25pZChpbnQgbnVtKTsKK2ludAkJT0JKX2FkZF9vYmplY3QoY29uc3QgQVNOMV9PQkpFQ1QgKm9iaik7CitpbnQJCU9CSl9jcmVhdGUoY29uc3QgY2hhciAqb2lkLGNvbnN0IGNoYXIgKnNuLGNvbnN0IGNoYXIgKmxuKTsKK3ZvaWQJCU9CSl9jbGVhbnVwKHZvaWQgKTsKK2ludAkJT0JKX2NyZWF0ZV9vYmplY3RzKEJJTyAqaW4pOworCitpbnQgT0JKX2ZpbmRfc2lnaWRfYWxncyhpbnQgc2lnbmlkLCBpbnQgKnBkaWdfbmlkLCBpbnQgKnBwa2V5X25pZCk7CitpbnQgT0JKX2ZpbmRfc2lnaWRfYnlfYWxncyhpbnQgKnBzaWduaWQsIGludCBkaWdfbmlkLCBpbnQgcGtleV9uaWQpOworaW50IE9CSl9hZGRfc2lnaWQoaW50IHNpZ25pZCwgaW50IGRpZ19pZCwgaW50IHBrZXlfaWQpOwordm9pZCBPQkpfc2lnaWRfZnJlZSh2b2lkKTsKKworZXh0ZXJuIGludCBvYmpfY2xlYW51cF9kZWZlcjsKK3ZvaWQgY2hlY2tfZGVmZXIoaW50IG5pZCk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfT0JKX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgT0JKIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIE9CSl9GX09CSl9BRERfT0JKRUNUCQkJCSAxMDUKKyNkZWZpbmUgT0JKX0ZfT0JKX0NSRUFURQkJCQkgMTAwCisjZGVmaW5lIE9CSl9GX09CSl9EVVAJCQkJCSAxMDEKKyNkZWZpbmUgT0JKX0ZfT0JKX05BTUVfTkVXX0lOREVYCQkJIDEwNgorI2RlZmluZSBPQkpfRl9PQkpfTklEMkxOCQkJCSAxMDIKKyNkZWZpbmUgT0JKX0ZfT0JKX05JRDJPQkoJCQkJIDEwMworI2RlZmluZSBPQkpfRl9PQkpfTklEMlNOCQkJCSAxMDQKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBPQkpfUl9NQUxMT0NfRkFJTFVSRQkJCQkgMTAwCisjZGVmaW5lIE9CSl9SX1VOS05PV05fTklECQkJCSAxMDEKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29iamVjdHMucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmplY3RzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzAwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2JqZWN0cy9vYmplY3RzLnBsCkBAIC0wLDAgKzEsMjMyIEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworb3BlbiAoTlVNSU4sIiRBUkdWWzFdIikgfHwgZGllICJDYW4ndCBvcGVuIG51bWJlciBmaWxlICRBUkdWWzFdIjsKKyRtYXhfbmlkPTA7Ciskbz0wOword2hpbGUoPE5VTUlOPikKKwl7CisJY2hvcDsKKwkkbysrOworCXMvIy4qJC8vOworCW5leHQgaWYgL15ccyokLzsKKwkkXyA9ICdYJy4kXzsKKwkoJENuYW1lLCRteW51bSkgPSBzcGxpdDsKKwkkQ25hbWUgPX4gcy9eWC8vOworCWlmIChkZWZpbmVkKCRuaWRueyRteW51bX0pKQorCQl7IGRpZSAiJEFSR1ZbMV06JG86VGhlcmUncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIE5JRCAiLCRteW51bSwiIG9uIGxpbmUgIiwkb3JkZXJ7JG15bnVtfSwiXG4iOyB9CisJaWYgKGRlZmluZWQoJG5pZHskQ25hbWV9KSkKKwkJeyBkaWUgIiRBUkdWWzFdOiRvOlRoZXJlJ3MgYWxyZWFkeSBhbiBvYmplY3Qgd2l0aCBuYW1lICIsJENuYW1lLCIgb24gbGluZSAiLCRvcmRlcnskbmlkeyRDbmFtZX19LCJcbiI7IH0KKwkkbmlkeyRDbmFtZX0gPSAkbXludW07CisJJG5pZG57JG15bnVtfSA9ICRDbmFtZTsKKwkkb3JkZXJ7JG15bnVtfSA9ICRvOworCSRtYXhfbmlkID0gJG15bnVtIGlmICRteW51bSA+ICRtYXhfbmlkOworCX0KK2Nsb3NlIE5VTUlOOworCitvcGVuIChJTiwiJEFSR1ZbMF0iKSB8fCBkaWUgIkNhbid0IG9wZW4gaW5wdXQgZmlsZSAkQVJHVlswXSI7CiskQ25hbWU9IiI7Ciskbz0wOword2hpbGUgKDxJTj4pCisJeworCWNob3A7CisJJG8rKzsKKyAgICAgICAgaWYgKC9eIW1vZHVsZVxzKyguKikkLykKKwkJeworCQkkbW9kdWxlID0gJDEuIi0iOworCQkkbW9kdWxlID1+IHMvXC4vXy9nOworCQkkbW9kdWxlID1+IHMvLS9fL2c7CisJCX0KKyAgICAgICAgaWYgKC9eIWdsb2JhbCQvKQorCQl7ICRtb2R1bGUgPSAiIjsgfQorCWlmICgvXiFDbmFtZVxzKyguKikkLykKKwkJeyAkQ25hbWUgPSAkMTsgfQorCWlmICgvXiFBbGlhc1xzKyguKz8pXHMrKC4qKSQvKQorCQl7CisJCSRDbmFtZSA9ICRtb2R1bGUuJDE7CisJCSRteW9pZCA9ICQyOworCQkkbXlvaWQgPSAmcHJvY2Vzc19vaWQoJG15b2lkKTsKKwkJJENuYW1lID1+IHMvLS9fL2c7CisJCSRvcmRlcm57JG99ID0gJENuYW1lOworCQkkb3JkZXJ7JENuYW1lfSA9ICRvOworCQkkb2JqeyRDbmFtZX0gPSAkbXlvaWQ7CisJCSRfID0gIiI7CisJCSRDbmFtZSA9ICIiOworCQl9CisJcy8hLiokLy87CisJcy8jLiokLy87CisJbmV4dCBpZiAvXlxzKiQvOworCSgkbXlvaWQsJG15c24sJG15bG4pID0gc3BsaXQgJzonOworCSRteXNuID1+IHMvXlxzKi8vOworCSRteXNuID1+IHMvXHMqJC8vOworCSRteWxuID1+IHMvXlxzKi8vOworCSRteWxuID1+IHMvXHMqJC8vOworCSRteW9pZCA9fiBzL15ccyovLzsKKwkkbXlvaWQgPX4gcy9ccyokLy87CisJaWYgKCRteW9pZCBuZSAiIikKKwkJeworCQkkbXlvaWQgPSAmcHJvY2Vzc19vaWQoJG15b2lkKTsKKwkJfQorCisJaWYgKCRDbmFtZSBlcSAiIiAmJiAhKCRteWxuID1+IC8gLykpCisJCXsKKwkJJENuYW1lID0gJG15bG47CisJCSRDbmFtZSA9fiBzL1wuL18vZzsKKwkJJENuYW1lID1+IHMvLS9fL2c7CisJCWlmICgkQ25hbWUgbmUgIiIgJiYgZGVmaW5lZCgkbG57JG1vZHVsZS4kQ25hbWV9KSkKKwkJCXsgZGllICJvYmplY3RzLnR4dDokbzpUaGVyZSdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggbG9uZyBuYW1lICIsJGxueyRtb2R1bGUuJENuYW1lfSwiIG9uIGxpbmUgIiwkb3JkZXJ7JG1vZHVsZS4kQ25hbWV9LCJcbiI7IH0KKwkJfQorCWlmICgkQ25hbWUgZXEgIiIpCisJCXsKKwkJJENuYW1lID0gJG15c247CisJCSRDbmFtZSA9fiBzLy0vXy9nOworCQlpZiAoJENuYW1lIG5lICIiICYmIGRlZmluZWQoJHNueyRtb2R1bGUuJENuYW1lfSkpCisJCQl7IGRpZSAib2JqZWN0cy50eHQ6JG86VGhlcmUncyBhbHJlYWR5IGFuIG9iamVjdCB3aXRoIHNob3J0IG5hbWUgIiwkc257JG1vZHVsZS4kQ25hbWV9LCIgb24gbGluZSAiLCRvcmRlcnskbW9kdWxlLiRDbmFtZX0sIlxuIjsgfQorCQl9CisJaWYgKCRDbmFtZSBlcSAiIikKKwkJeworCQkkQ25hbWUgPSAkbXlsbjsKKwkJJENuYW1lID1+IHMvLS9fL2c7CisJCSRDbmFtZSA9fiBzL1wuL18vZzsKKwkJJENuYW1lID1+IHMvIC9fL2c7CisJCWlmICgkQ25hbWUgbmUgIiIgJiYgZGVmaW5lZCgkbG57JG1vZHVsZS4kQ25hbWV9KSkKKwkJCXsgZGllICJvYmplY3RzLnR4dDokbzpUaGVyZSdzIGFscmVhZHkgYW4gb2JqZWN0IHdpdGggbG9uZyBuYW1lICIsJGxueyRtb2R1bGUuJENuYW1lfSwiIG9uIGxpbmUgIiwkb3JkZXJ7JG1vZHVsZS4kQ25hbWV9LCJcbiI7IH0KKwkJfQorCSRDbmFtZSA9fiBzL1wuL18vZzsKKwkkQ25hbWUgPX4gcy8tL18vZzsKKwkkQ25hbWUgPSAkbW9kdWxlLiRDbmFtZTsKKwkkb3JkZXJueyRvfSA9ICRDbmFtZTsKKwkkb3JkZXJ7JENuYW1lfSA9ICRvOworCSRzbnskQ25hbWV9ID0gJG15c247CisJJGxueyRDbmFtZX0gPSAkbXlsbjsKKwkkb2JqeyRDbmFtZX0gPSAkbXlvaWQ7CisJaWYgKCFkZWZpbmVkKCRuaWR7JENuYW1lfSkpCisJCXsKKwkJJG1heF9uaWQrKzsKKwkJJG5pZHskQ25hbWV9ID0gJG1heF9uaWQ7CisJCSRuaWRueyRtYXhfbmlkfSA9ICRDbmFtZTsKK3ByaW50IFNUREVSUiAiQWRkZWQgT0lEICRDbmFtZVxuIjsKKwkJfQorCSRDbmFtZT0iIjsKKwl9CitjbG9zZSBJTjsKKworb3BlbiAoTlVNT1VULCI+JEFSR1ZbMV0iKSB8fCBkaWUgIkNhbid0IG9wZW4gb3V0cHV0IGZpbGUgJEFSR1ZbMV0iOworZm9yZWFjaCAoc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJW5pZG4pCisJeworCXByaW50IE5VTU9VVCAkbmlkbnskX30sIlx0XHQiLCRfLCJcbiI7CisJfQorY2xvc2UgTlVNT1VUOworCitvcGVuIChPVVQsIj4kQVJHVlsyXSIpIHx8IGRpZSAiQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSAkQVJHVlsyXSI7CitwcmludCBPVVQgPDwnRU9GJzsKKy8qIGNyeXB0by9vYmplY3RzL29ial9tYWMuaCAqLworCisvKiBUSElTIEZJTEUgSVMgR0VORVJBVEVEIEZST00gb2JqZWN0cy50eHQgYnkgb2JqZWN0cy5wbCB2aWEgdGhlCisgKiBmb2xsb3dpbmcgY29tbWFuZDoKKyAqIHBlcmwgb2JqZWN0cy5wbCBvYmplY3RzLnR4dCBvYmpfbWFjLm51bSBvYmpfbWFjLmgKKyAqLworCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNkZWZpbmUgU05fdW5kZWYJCQkiVU5ERUYiCisjZGVmaW5lIExOX3VuZGVmCQkJInVuZGVmaW5lZCIKKyNkZWZpbmUgTklEX3VuZGVmCQkJMAorI2RlZmluZSBPQkpfdW5kZWYJCQkwTAorCitFT0YKKworZm9yZWFjaCAoc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJW9yZGVybikKKwl7CisJJENuYW1lPSRvcmRlcm57JF99OworCXByaW50IE9VVCAiI2RlZmluZSBTTl8iLCRDbmFtZSwiXHRcdFwiIiwkc257JENuYW1lfSwiXCJcbiIgaWYgJHNueyRDbmFtZX0gbmUgIiI7CisJcHJpbnQgT1VUICIjZGVmaW5lIExOXyIsJENuYW1lLCJcdFx0XCIiLCRsbnskQ25hbWV9LCJcIlxuIiBpZiAkbG57JENuYW1lfSBuZSAiIjsKKwlwcmludCBPVVQgIiNkZWZpbmUgTklEXyIsJENuYW1lLCJcdFx0IiwkbmlkeyRDbmFtZX0sIlxuIiBpZiAkbmlkeyRDbmFtZX0gbmUgIiI7CisJcHJpbnQgT1VUICIjZGVmaW5lIE9CSl8iLCRDbmFtZSwiXHRcdCIsJG9ianskQ25hbWV9LCJcbiIgaWYgJG9ianskQ25hbWV9IG5lICIiOworCXByaW50IE9VVCAiXG4iOworCX0KKworY2xvc2UgT1VUOworCitzdWIgcHJvY2Vzc19vaWQKKwl7CisJbG9jYWwoJG9pZCk9QF87CisJbG9jYWwoQGEsJG9pZF9wcmVmKTsKKworCUBhID0gc3BsaXQoL1xzKy8sJG15b2lkKTsKKwkkcHJlZl9vaWQgPSAiIjsKKwkkcHJlZl9zZXAgPSAiIjsKKwlpZiAoISgkYVswXSA9fiAvXlswLTldKyQvKSkKKwkJeworCQkkYVswXSA9fiBzLy0vXy9nOworCQlpZiAoIWRlZmluZWQoJG9ianskYVswXX0pKQorCQkJeyBkaWUgIiRBUkdWWzBdOiRvOlVuZGVmaW5lZCBpZGVudGlmaWVyICIsJGFbMF0sIlxuIjsgfQorCQkkcHJlZl9vaWQgPSAiT0JKXyIgLiAkYVswXTsKKwkJJHByZWZfc2VwID0gIiwiOworCQlzaGlmdCBAYTsKKwkJfQorCSRvaWRzID0gam9pbignTCwnLEBhKSAuICJMIjsKKwlpZiAoJG9pZHMgbmUgIkwiKQorCQl7CisJCSRvaWRzID0gJHByZWZfb2lkIC4gJHByZWZfc2VwIC4gJG9pZHM7CisJCX0KKwllbHNlCisJCXsKKwkJJG9pZHMgPSAkcHJlZl9vaWQ7CisJCX0KKwlyZXR1cm4oJG9pZHMpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29iamVjdHMudHh0IGIvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqZWN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxZmU2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29iamVjdHMudHh0CkBAIC0wLDAgKzEsMTI1OSBAQAorIyBDQ0lUVCB3YXMgcmVuYW1lZCB0byBJVFUtVCBxdWl0ZSBzb21lIHRpbWUgYWdvCiswCQkJOiBJVFUtVAkJCTogaXR1LXQKKyFBbGlhcyBjY2l0dCBpdHUtdAorCisxCQkJOiBJU08JCQk6IGlzbworCisyCQkJOiBKT0lOVC1JU08tSVRVLVQJOiBqb2ludC1pc28taXR1LXQKKyFBbGlhcyBqb2ludC1pc28tY2NpdHQgam9pbnQtaXNvLWl0dS10CisKK2lzbyAyCQkJOiBtZW1iZXItYm9keQkJOiBJU08gTWVtYmVyIEJvZHkKKworaXNvIDMJCQk6IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uCisKKyMgSE1BQyBPSURzCitpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiA2IDEgNSA1IDggMSAxCTogSE1BQy1NRDUJOiBobWFjLW1kNQoraWRlbnRpZmllZC1vcmdhbml6YXRpb24gNiAxIDUgNSA4IDEgMgk6IEhNQUMtU0hBMQk6IGhtYWMtc2hhMQorCitpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAxMzIJOiBjZXJ0aWNvbS1hcmMKKworam9pbnQtaXNvLWl0dS10IDIzCTogaW50ZXJuYXRpb25hbC1vcmdhbml6YXRpb25zCTogSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb25zCisKK2ludGVybmF0aW9uYWwtb3JnYW5pemF0aW9ucyA0Mwk6IHdhcAord2FwIDEJCQk6IHdhcC13c2cKKworam9pbnQtaXNvLWl0dS10IDUgMSA1CTogc2VsZWN0ZWQtYXR0cmlidXRlLXR5cGVzCTogU2VsZWN0ZWQgQXR0cmlidXRlIFR5cGVzCisKK3NlbGVjdGVkLWF0dHJpYnV0ZS10eXBlcyA1NQk6IGNsZWFyYW5jZQorCittZW1iZXItYm9keSA4NDAJCTogSVNPLVVTCQk6IElTTyBVUyBNZW1iZXIgQm9keQorSVNPLVVTIDEwMDQwCQk6IFg5LTU3CQkJOiBYOS41NworWDktNTcgNAkJCTogWDljbQkJCTogWDkuNTcgQ00gPworCishQ25hbWUgZHNhCitYOWNtIDEJCQk6IERTQQkJCTogZHNhRW5jcnlwdGlvbgorWDljbSAzCQkJOiBEU0EtU0hBMQkJOiBkc2FXaXRoU0hBMQorCisKK0lTTy1VUyAxMDA0NQkJOiBhbnNpLVg5LTYyCQk6IEFOU0kgWDkuNjIKKyFtb2R1bGUgWDktNjIKKyFBbGlhcyBpZC1maWVsZFR5cGUgYW5zaS1YOS02MiAxCitYOS02Ml9pZC1maWVsZFR5cGUgMQkJOiBwcmltZS1maWVsZAorWDktNjJfaWQtZmllbGRUeXBlIDIJCTogY2hhcmFjdGVyaXN0aWMtdHdvLWZpZWxkCitYOS02Ml9jaGFyYWN0ZXJpc3RpYy10d28tZmllbGQgMyA6IGlkLWNoYXJhY3RlcmlzdGljLXR3by1iYXNpcworWDktNjJfaWQtY2hhcmFjdGVyaXN0aWMtdHdvLWJhc2lzIDEgOiBvbkJhc2lzCitYOS02Ml9pZC1jaGFyYWN0ZXJpc3RpYy10d28tYmFzaXMgMiA6IHRwQmFzaXMKK1g5LTYyX2lkLWNoYXJhY3RlcmlzdGljLXR3by1iYXNpcyAzIDogcHBCYXNpcworIUFsaWFzIGlkLXB1YmxpY0tleVR5cGUgYW5zaS1YOS02MiAyCitYOS02Ml9pZC1wdWJsaWNLZXlUeXBlIDEJOiBpZC1lY1B1YmxpY0tleQorIUFsaWFzIGVsbGlwdGljQ3VydmUgYW5zaS1YOS02MiAzCishQWxpYXMgYy1Ud29DdXJ2ZSBYOS02Ml9lbGxpcHRpY0N1cnZlIDAKK1g5LTYyX2MtVHdvQ3VydmUgMQkJOiBjMnBuYjE2M3YxCitYOS02Ml9jLVR3b0N1cnZlIDIJCTogYzJwbmIxNjN2MgorWDktNjJfYy1Ud29DdXJ2ZSAzCQk6IGMycG5iMTYzdjMKK1g5LTYyX2MtVHdvQ3VydmUgNAkJOiBjMnBuYjE3NnYxCitYOS02Ml9jLVR3b0N1cnZlIDUJCTogYzJ0bmIxOTF2MQorWDktNjJfYy1Ud29DdXJ2ZSA2CQk6IGMydG5iMTkxdjIKK1g5LTYyX2MtVHdvQ3VydmUgNwkJOiBjMnRuYjE5MXYzCitYOS02Ml9jLVR3b0N1cnZlIDgJCTogYzJvbmIxOTF2NAorWDktNjJfYy1Ud29DdXJ2ZSA5CQk6IGMyb25iMTkxdjUKK1g5LTYyX2MtVHdvQ3VydmUgMTAJCTogYzJwbmIyMDh3MQorWDktNjJfYy1Ud29DdXJ2ZSAxMQkJOiBjMnRuYjIzOXYxCitYOS02Ml9jLVR3b0N1cnZlIDEyCQk6IGMydG5iMjM5djIKK1g5LTYyX2MtVHdvQ3VydmUgMTMJCTogYzJ0bmIyMzl2MworWDktNjJfYy1Ud29DdXJ2ZSAxNAkJOiBjMm9uYjIzOXY0CitYOS02Ml9jLVR3b0N1cnZlIDE1CQk6IGMyb25iMjM5djUKK1g5LTYyX2MtVHdvQ3VydmUgMTYJCTogYzJwbmIyNzJ3MQorWDktNjJfYy1Ud29DdXJ2ZSAxNwkJOiBjMnBuYjMwNHcxCitYOS02Ml9jLVR3b0N1cnZlIDE4CQk6IGMydG5iMzU5djEKK1g5LTYyX2MtVHdvQ3VydmUgMTkJCTogYzJwbmIzNjh3MQorWDktNjJfYy1Ud29DdXJ2ZSAyMAkJOiBjMnRuYjQzMXIxCishQWxpYXMgcHJpbWVDdXJ2ZSBYOS02Ml9lbGxpcHRpY0N1cnZlIDEKK1g5LTYyX3ByaW1lQ3VydmUgMQkgCTogcHJpbWUxOTJ2MQorWDktNjJfcHJpbWVDdXJ2ZSAyCSAJOiBwcmltZTE5MnYyCitYOS02Ml9wcmltZUN1cnZlIDMJIAk6IHByaW1lMTkydjMKK1g5LTYyX3ByaW1lQ3VydmUgNAkgCTogcHJpbWUyMzl2MQorWDktNjJfcHJpbWVDdXJ2ZSA1CSAJOiBwcmltZTIzOXYyCitYOS02Ml9wcmltZUN1cnZlIDYJIAk6IHByaW1lMjM5djMKK1g5LTYyX3ByaW1lQ3VydmUgNwkgCTogcHJpbWUyNTZ2MQorIUFsaWFzIGlkLWVjU2lnVHlwZSBhbnNpLVg5LTYyIDQKKyFnbG9iYWwKK1g5LTYyX2lkLWVjU2lnVHlwZSAxCQk6IGVjZHNhLXdpdGgtU0hBMQorWDktNjJfaWQtZWNTaWdUeXBlIDIJCTogZWNkc2Etd2l0aC1SZWNvbW1lbmRlZAorWDktNjJfaWQtZWNTaWdUeXBlIDMJCTogZWNkc2Etd2l0aC1TcGVjaWZpZWQKK2VjZHNhLXdpdGgtU3BlY2lmaWVkIDEJCTogZWNkc2Etd2l0aC1TSEEyMjQKK2VjZHNhLXdpdGgtU3BlY2lmaWVkIDIJCTogZWNkc2Etd2l0aC1TSEEyNTYKK2VjZHNhLXdpdGgtU3BlY2lmaWVkIDMJCTogZWNkc2Etd2l0aC1TSEEzODQKK2VjZHNhLXdpdGgtU3BlY2lmaWVkIDQJCTogZWNkc2Etd2l0aC1TSEE1MTIKKworIyBTRUNHIGN1cnZlIE9JRHMgZnJvbSAiU0VDIDI6IFJlY29tbWVuZGVkIEVsbGlwdGljIEN1cnZlIERvbWFpbiBQYXJhbWV0ZXJzIgorIyAoaHR0cDovL3d3dy5zZWNnLm9yZy8pCishQWxpYXMgc2VjZ19lbGxpcHRpY0N1cnZlIGNlcnRpY29tLWFyYyAwCisjIFNFQ0cgcHJpbWUgY3VydmVzIE9JRHMKK3NlY2ctZWxsaXB0aWNDdXJ2ZSA2CQk6IHNlY3AxMTJyMQorc2VjZy1lbGxpcHRpY0N1cnZlIDcJCTogc2VjcDExMnIyCitzZWNnLWVsbGlwdGljQ3VydmUgMjgJCTogc2VjcDEyOHIxCitzZWNnLWVsbGlwdGljQ3VydmUgMjkJCTogc2VjcDEyOHIyCitzZWNnLWVsbGlwdGljQ3VydmUgOQkJOiBzZWNwMTYwazEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSA4CQk6IHNlY3AxNjByMQorc2VjZy1lbGxpcHRpY0N1cnZlIDMwCQk6IHNlY3AxNjByMgorc2VjZy1lbGxpcHRpY0N1cnZlIDMxCQk6IHNlY3AxOTJrMQorIyBOT1RFOiB0aGUgY3VydmUgc2VjcDE5MnIxIGlzIHRoZSBzYW1lIGFzIHByaW1lMTkydjEgZGVmaW5lZCBhYm92ZQorIyAgICAgICBhbmQgaXMgdGhlcmVmb3JlIG9taXR0ZWQKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzMgkJOiBzZWNwMjI0azEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzMwkJOiBzZWNwMjI0cjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAxMAkJOiBzZWNwMjU2azEKKyMgTk9URTogdGhlIGN1cnZlIHNlY3AyNTZyMSBpcyB0aGUgc2FtZSBhcyBwcmltZTI1NnYxIGRlZmluZWQgYWJvdmUKKyMgICAgICAgYW5kIGlzIHRoZXJlZm9yZSBvbWl0dGVkCitzZWNnLWVsbGlwdGljQ3VydmUgMzQJCTogc2VjcDM4NHIxCitzZWNnLWVsbGlwdGljQ3VydmUgMzUJCTogc2VjcDUyMXIxCisjIFNFQ0cgY2hhcmFjdGVyaXN0aWMgdHdvIGN1cnZlcyBPSURzCitzZWNnLWVsbGlwdGljQ3VydmUgNAkJOiBzZWN0MTEzcjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSA1CQk6IHNlY3QxMTNyMgorc2VjZy1lbGxpcHRpY0N1cnZlIDIyCQk6IHNlY3QxMzFyMQorc2VjZy1lbGxpcHRpY0N1cnZlIDIzCQk6IHNlY3QxMzFyMgorc2VjZy1lbGxpcHRpY0N1cnZlIDEJCTogc2VjdDE2M2sxCitzZWNnLWVsbGlwdGljQ3VydmUgMgkJOiBzZWN0MTYzcjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAxNQkJOiBzZWN0MTYzcjIKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAyNAkJOiBzZWN0MTkzcjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAyNQkJOiBzZWN0MTkzcjIKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAyNgkJOiBzZWN0MjMzazEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAyNwkJOiBzZWN0MjMzcjEKK3NlY2ctZWxsaXB0aWNDdXJ2ZSAzCQk6IHNlY3QyMzlrMQorc2VjZy1lbGxpcHRpY0N1cnZlIDE2CQk6IHNlY3QyODNrMQorc2VjZy1lbGxpcHRpY0N1cnZlIDE3CQk6IHNlY3QyODNyMQorc2VjZy1lbGxpcHRpY0N1cnZlIDM2CQk6IHNlY3Q0MDlrMQorc2VjZy1lbGxpcHRpY0N1cnZlIDM3CQk6IHNlY3Q0MDlyMQorc2VjZy1lbGxpcHRpY0N1cnZlIDM4CQk6IHNlY3Q1NzFrMQorc2VjZy1lbGxpcHRpY0N1cnZlIDM5CQk6IHNlY3Q1NzFyMQorCisjIFdBUC9UTFMgY3VydmUgT0lEcyAoaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvKQorIUFsaWFzIHdhcC13c2ctaWRtLWVjaWQgd2FwLXdzZyA0Cit3YXAtd3NnLWlkbS1lY2lkIDEJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHMxCit3YXAtd3NnLWlkbS1lY2lkIDMJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHMzCit3YXAtd3NnLWlkbS1lY2lkIDQJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHM0Cit3YXAtd3NnLWlkbS1lY2lkIDUJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHM1Cit3YXAtd3NnLWlkbS1lY2lkIDYJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHM2Cit3YXAtd3NnLWlkbS1lY2lkIDcJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHM3Cit3YXAtd3NnLWlkbS1lY2lkIDgJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHM4Cit3YXAtd3NnLWlkbS1lY2lkIDkJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHM5Cit3YXAtd3NnLWlkbS1lY2lkIDEwCTogd2FwLXdzZy1pZG0tZWNpZC13dGxzMTAKK3dhcC13c2ctaWRtLWVjaWQgMTEJOiB3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMQord2FwLXdzZy1pZG0tZWNpZCAxMgk6IHdhcC13c2ctaWRtLWVjaWQtd3RsczEyCisKKworSVNPLVVTIDExMzUzMyA3IDY2IDEwCTogQ0FTVDUtQ0JDCQk6IGNhc3Q1LWNiYworCQkJOiBDQVNUNS1FQ0IJCTogY2FzdDUtZWNiCishQ25hbWUgY2FzdDUtY2ZiNjQKKwkJCTogQ0FTVDUtQ0ZCCQk6IGNhc3Q1LWNmYgorIUNuYW1lIGNhc3Q1LW9mYjY0CisJCQk6IENBU1Q1LU9GQgkJOiBjYXN0NS1vZmIKKyFDbmFtZSBwYmVXaXRoTUQ1QW5kQ2FzdDUtQ0JDCitJU08tVVMgMTEzNTMzIDcgNjYgMTIJOgkJCTogcGJlV2l0aE1ENUFuZENhc3Q1Q0JDCisKKyMgTWFjcyBmb3IgQ01QIGFuZCBDUk1GCitJU08tVVMgMTEzNTMzIDcgNjYgMTMJOiBpZC1QYXNzd29yZEJhc2VkTUFDCTogcGFzc3dvcmQgYmFzZWQgTUFDCitJU08tVVMgMTEzNTMzIDcgNjYgMzAJOiBpZC1ESEJhc2VkTWFjCQk6IERpZmZpZS1IZWxsbWFuIGJhc2VkIE1BQworCitJU08tVVMgMTEzNTQ5CQk6IHJzYWRzaQkJOiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLgorCityc2Fkc2kgMQkJOiBwa2NzCQkJOiBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBQS0NTCisKK3BrY3MgMQkJCTogcGtjczEKK3BrY3MxIDEJCQk6CQkJOiByc2FFbmNyeXB0aW9uCitwa2NzMSAyCQkJOiBSU0EtTUQyCQk6IG1kMldpdGhSU0FFbmNyeXB0aW9uCitwa2NzMSAzCQkJOiBSU0EtTUQ0CQk6IG1kNFdpdGhSU0FFbmNyeXB0aW9uCitwa2NzMSA0CQkJOiBSU0EtTUQ1CQk6IG1kNVdpdGhSU0FFbmNyeXB0aW9uCitwa2NzMSA1CQkJOiBSU0EtU0hBMQkJOiBzaGExV2l0aFJTQUVuY3J5cHRpb24KKyMgQWNjb3JkaW5nIHRvIFBLQ1MgIzEgdmVyc2lvbiAyLjEKK3BrY3MxIDExCQk6IFJTQS1TSEEyNTYJCTogc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24KK3BrY3MxIDEyCQk6IFJTQS1TSEEzODQJCTogc2hhMzg0V2l0aFJTQUVuY3J5cHRpb24KK3BrY3MxIDEzCQk6IFJTQS1TSEE1MTIJCTogc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24KK3BrY3MxIDE0CQk6IFJTQS1TSEEyMjQJCTogc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24KKworcGtjcyAzCQkJOiBwa2NzMworcGtjczMgMQkJCToJCQk6IGRoS2V5QWdyZWVtZW50CisKK3BrY3MgNQkJCTogcGtjczUKK3BrY3M1IDEJCQk6IFBCRS1NRDItREVTCQk6IHBiZVdpdGhNRDJBbmRERVMtQ0JDCitwa2NzNSAzCQkJOiBQQkUtTUQ1LURFUwkJOiBwYmVXaXRoTUQ1QW5kREVTLUNCQworcGtjczUgNAkJCTogUEJFLU1EMi1SQzItNjQJOiBwYmVXaXRoTUQyQW5kUkMyLUNCQworcGtjczUgNgkJCTogUEJFLU1ENS1SQzItNjQJOiBwYmVXaXRoTUQ1QW5kUkMyLUNCQworcGtjczUgMTAJCTogUEJFLVNIQTEtREVTCQk6IHBiZVdpdGhTSEExQW5kREVTLUNCQworcGtjczUgMTEJCTogUEJFLVNIQTEtUkMyLTY0CTogcGJlV2l0aFNIQTFBbmRSQzItQ0JDCishQ25hbWUgaWRfcGJrZGYyCitwa2NzNSAxMgkJOgkJCTogUEJLREYyCishQ25hbWUgcGJlczIKK3BrY3M1IDEzCQk6CQkJOiBQQkVTMgorIUNuYW1lIHBibWFjMQorcGtjczUgMTQJCToJCQk6IFBCTUFDMQorCitwa2NzIDcJCQk6IHBrY3M3Citwa2NzNyAxCQkJOgkJCTogcGtjczctZGF0YQorIUNuYW1lIHBrY3M3LXNpZ25lZAorcGtjczcgMgkJCToJCQk6IHBrY3M3LXNpZ25lZERhdGEKKyFDbmFtZSBwa2NzNy1lbnZlbG9wZWQKK3BrY3M3IDMJCQk6CQkJOiBwa2NzNy1lbnZlbG9wZWREYXRhCishQ25hbWUgcGtjczctc2lnbmVkQW5kRW52ZWxvcGVkCitwa2NzNyA0CQkJOgkJCTogcGtjczctc2lnbmVkQW5kRW52ZWxvcGVkRGF0YQorIUNuYW1lIHBrY3M3LWRpZ2VzdAorcGtjczcgNQkJCToJCQk6IHBrY3M3LWRpZ2VzdERhdGEKKyFDbmFtZSBwa2NzNy1lbmNyeXB0ZWQKK3BrY3M3IDYJCQk6CQkJOiBwa2NzNy1lbmNyeXB0ZWREYXRhCisKK3BrY3MgOQkJCTogcGtjczkKKyFtb2R1bGUgcGtjczkKK3BrY3M5IDEJCQk6IAkJCTogZW1haWxBZGRyZXNzCitwa2NzOSAyCQkJOgkJCTogdW5zdHJ1Y3R1cmVkTmFtZQorcGtjczkgMwkJCToJCQk6IGNvbnRlbnRUeXBlCitwa2NzOSA0CQkJOgkJCTogbWVzc2FnZURpZ2VzdAorcGtjczkgNQkJCToJCQk6IHNpZ25pbmdUaW1lCitwa2NzOSA2CQkJOgkJCTogY291bnRlcnNpZ25hdHVyZQorcGtjczkgNwkJCToJCQk6IGNoYWxsZW5nZVBhc3N3b3JkCitwa2NzOSA4CQkJOgkJCTogdW5zdHJ1Y3R1cmVkQWRkcmVzcworIUNuYW1lIGV4dENlcnRBdHRyaWJ1dGVzCitwa2NzOSA5CQkJOgkJCTogZXh0ZW5kZWRDZXJ0aWZpY2F0ZUF0dHJpYnV0ZXMKKyFnbG9iYWwKKworIUNuYW1lIGV4dC1yZXEKK3BrY3M5IDE0CQk6IGV4dFJlcQkJOiBFeHRlbnNpb24gUmVxdWVzdAorCishQ25hbWUgU01JTUVDYXBhYmlsaXRpZXMKK3BrY3M5IDE1CQk6IFNNSU1FLUNBUFMJCTogUy9NSU1FIENhcGFiaWxpdGllcworCisjIFMvTUlNRQorIUNuYW1lIFNNSU1FCitwa2NzOSAxNgkJOiBTTUlNRQkJCTogUy9NSU1FCitTTUlNRSAwCQkJOiBpZC1zbWltZS1tb2QKK1NNSU1FIDEJCQk6IGlkLXNtaW1lLWN0CitTTUlNRSAyCQkJOiBpZC1zbWltZS1hYQorU01JTUUgMwkJCTogaWQtc21pbWUtYWxnCitTTUlNRSA0CQkJOiBpZC1zbWltZS1jZAorU01JTUUgNQkJCTogaWQtc21pbWUtc3BxCitTTUlNRSA2CQkJOiBpZC1zbWltZS1jdGkKKworIyBTL01JTUUgTW9kdWxlcworaWQtc21pbWUtbW9kIDEJCTogaWQtc21pbWUtbW9kLWNtcworaWQtc21pbWUtbW9kIDIJCTogaWQtc21pbWUtbW9kLWVzcworaWQtc21pbWUtbW9kIDMJCTogaWQtc21pbWUtbW9kLW9pZAoraWQtc21pbWUtbW9kIDQJCTogaWQtc21pbWUtbW9kLW1zZy12MworaWQtc21pbWUtbW9kIDUJCTogaWQtc21pbWUtbW9kLWV0cy1lU2lnbmF0dXJlLTg4CitpZC1zbWltZS1tb2QgNgkJOiBpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtOTcKK2lkLXNtaW1lLW1vZCA3CQk6IGlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS04OAoraWQtc21pbWUtbW9kIDgJCTogaWQtc21pbWUtbW9kLWV0cy1lU2lnUG9saWN5LTk3CisKKyMgUy9NSU1FIENvbnRlbnQgVHlwZXMKK2lkLXNtaW1lLWN0IDEJCTogaWQtc21pbWUtY3QtcmVjZWlwdAoraWQtc21pbWUtY3QgMgkJOiBpZC1zbWltZS1jdC1hdXRoRGF0YQoraWQtc21pbWUtY3QgMwkJOiBpZC1zbWltZS1jdC1wdWJsaXNoQ2VydAoraWQtc21pbWUtY3QgNAkJOiBpZC1zbWltZS1jdC1UU1RJbmZvCitpZC1zbWltZS1jdCA1CQk6IGlkLXNtaW1lLWN0LVREVEluZm8KK2lkLXNtaW1lLWN0IDYJCTogaWQtc21pbWUtY3QtY29udGVudEluZm8KK2lkLXNtaW1lLWN0IDcJCTogaWQtc21pbWUtY3QtRFZDU1JlcXVlc3REYXRhCitpZC1zbWltZS1jdCA4CQk6IGlkLXNtaW1lLWN0LURWQ1NSZXNwb25zZURhdGEKK2lkLXNtaW1lLWN0IDkJCTogaWQtc21pbWUtY3QtY29tcHJlc3NlZERhdGEKK2lkLXNtaW1lLWN0IDI3CQk6IGlkLWN0LWFzY2lpVGV4dFdpdGhDUkxGCisKKyMgUy9NSU1FIEF0dHJpYnV0ZXMKK2lkLXNtaW1lLWFhIDEJCTogaWQtc21pbWUtYWEtcmVjZWlwdFJlcXVlc3QKK2lkLXNtaW1lLWFhIDIJCTogaWQtc21pbWUtYWEtc2VjdXJpdHlMYWJlbAoraWQtc21pbWUtYWEgMwkJOiBpZC1zbWltZS1hYS1tbEV4cGFuZEhpc3RvcnkKK2lkLXNtaW1lLWFhIDQJCTogaWQtc21pbWUtYWEtY29udGVudEhpbnQKK2lkLXNtaW1lLWFhIDUJCTogaWQtc21pbWUtYWEtbXNnU2lnRGlnZXN0CisjIG9ic29sZXRlCitpZC1zbWltZS1hYSA2CQk6IGlkLXNtaW1lLWFhLWVuY2FwQ29udGVudFR5cGUKK2lkLXNtaW1lLWFhIDcJCTogaWQtc21pbWUtYWEtY29udGVudElkZW50aWZpZXIKKyMgb2Jzb2xldGUKK2lkLXNtaW1lLWFhIDgJCTogaWQtc21pbWUtYWEtbWFjVmFsdWUKK2lkLXNtaW1lLWFhIDkJCTogaWQtc21pbWUtYWEtZXF1aXZhbGVudExhYmVscworaWQtc21pbWUtYWEgMTAJCTogaWQtc21pbWUtYWEtY29udGVudFJlZmVyZW5jZQoraWQtc21pbWUtYWEgMTEJCTogaWQtc21pbWUtYWEtZW5jcnlwS2V5UHJlZgoraWQtc21pbWUtYWEgMTIJCTogaWQtc21pbWUtYWEtc2lnbmluZ0NlcnRpZmljYXRlCitpZC1zbWltZS1hYSAxMwkJOiBpZC1zbWltZS1hYS1zbWltZUVuY3J5cHRDZXJ0cworaWQtc21pbWUtYWEgMTQJCTogaWQtc21pbWUtYWEtdGltZVN0YW1wVG9rZW4KK2lkLXNtaW1lLWFhIDE1CQk6IGlkLXNtaW1lLWFhLWV0cy1zaWdQb2xpY3lJZAoraWQtc21pbWUtYWEgMTYJCTogaWQtc21pbWUtYWEtZXRzLWNvbW1pdG1lbnRUeXBlCitpZC1zbWltZS1hYSAxNwkJOiBpZC1zbWltZS1hYS1ldHMtc2lnbmVyTG9jYXRpb24KK2lkLXNtaW1lLWFhIDE4CQk6IGlkLXNtaW1lLWFhLWV0cy1zaWduZXJBdHRyCitpZC1zbWltZS1hYSAxOQkJOiBpZC1zbWltZS1hYS1ldHMtb3RoZXJTaWdDZXJ0CitpZC1zbWltZS1hYSAyMAkJOiBpZC1zbWltZS1hYS1ldHMtY29udGVudFRpbWVzdGFtcAoraWQtc21pbWUtYWEgMjEJCTogaWQtc21pbWUtYWEtZXRzLUNlcnRpZmljYXRlUmVmcworaWQtc21pbWUtYWEgMjIJCTogaWQtc21pbWUtYWEtZXRzLVJldm9jYXRpb25SZWZzCitpZC1zbWltZS1hYSAyMwkJOiBpZC1zbWltZS1hYS1ldHMtY2VydFZhbHVlcworaWQtc21pbWUtYWEgMjQJCTogaWQtc21pbWUtYWEtZXRzLXJldm9jYXRpb25WYWx1ZXMKK2lkLXNtaW1lLWFhIDI1CQk6IGlkLXNtaW1lLWFhLWV0cy1lc2NUaW1lU3RhbXAKK2lkLXNtaW1lLWFhIDI2CQk6IGlkLXNtaW1lLWFhLWV0cy1jZXJ0Q1JMVGltZXN0YW1wCitpZC1zbWltZS1hYSAyNwkJOiBpZC1zbWltZS1hYS1ldHMtYXJjaGl2ZVRpbWVTdGFtcAoraWQtc21pbWUtYWEgMjgJCTogaWQtc21pbWUtYWEtc2lnbmF0dXJlVHlwZQoraWQtc21pbWUtYWEgMjkJCTogaWQtc21pbWUtYWEtZHZjcy1kdmMKKworIyBTL01JTUUgQWxnb3JpdGhtIElkZW50aWZpZXJzCisjIG9ic29sZXRlCitpZC1zbWltZS1hbGcgMQkJOiBpZC1zbWltZS1hbGctRVNESHdpdGgzREVTCisjIG9ic29sZXRlCitpZC1zbWltZS1hbGcgMgkJOiBpZC1zbWltZS1hbGctRVNESHdpdGhSQzIKKyMgb2Jzb2xldGUKK2lkLXNtaW1lLWFsZyAzCQk6IGlkLXNtaW1lLWFsZy0zREVTd3JhcAorIyBvYnNvbGV0ZQoraWQtc21pbWUtYWxnIDQJCTogaWQtc21pbWUtYWxnLVJDMndyYXAKK2lkLXNtaW1lLWFsZyA1CQk6IGlkLXNtaW1lLWFsZy1FU0RICitpZC1zbWltZS1hbGcgNgkJOiBpZC1zbWltZS1hbGctQ01TM0RFU3dyYXAKK2lkLXNtaW1lLWFsZyA3CQk6IGlkLXNtaW1lLWFsZy1DTVNSQzJ3cmFwCisKKyMgUy9NSU1FIENlcnRpZmljYXRlIERpc3RyaWJ1dGlvbgoraWQtc21pbWUtY2QgMQkJOiBpZC1zbWltZS1jZC1sZGFwCisKKyMgUy9NSU1FIFNpZ25hdHVyZSBQb2xpY3kgUXVhbGlmaWVyCitpZC1zbWltZS1zcHEgMQkJOiBpZC1zbWltZS1zcHEtZXRzLXNxdC11cmkKK2lkLXNtaW1lLXNwcSAyCQk6IGlkLXNtaW1lLXNwcS1ldHMtc3F0LXVub3RpY2UKKworIyBTL01JTUUgQ29tbWl0bWVudCBUeXBlIElkZW50aWZpZXIKK2lkLXNtaW1lLWN0aSAxCQk6IGlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZk9yaWdpbgoraWQtc21pbWUtY3RpIDIJCTogaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mUmVjZWlwdAoraWQtc21pbWUtY3RpIDMJCTogaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mRGVsaXZlcnkKK2lkLXNtaW1lLWN0aSA0CQk6IGlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZlNlbmRlcgoraWQtc21pbWUtY3RpIDUJCTogaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQXBwcm92YWwKK2lkLXNtaW1lLWN0aSA2CQk6IGlkLXNtaW1lLWN0aS1ldHMtcHJvb2ZPZkNyZWF0aW9uCisKK3BrY3M5IDIwCQk6CQkJOiBmcmllbmRseU5hbWUKK3BrY3M5IDIxCQk6CQkJOiBsb2NhbEtleUlECishQ25hbWUgbXMtY3NwLW5hbWUKKzEgMyA2IDEgNCAxIDMxMSAxNyAxCTogQ1NQTmFtZQkJOiBNaWNyb3NvZnQgQ1NQIE5hbWUKKzEgMyA2IDEgNCAxIDMxMSAxNyAyCTogTG9jYWxLZXlTZXQJCTogTWljcm9zb2Z0IExvY2FsIEtleSBzZXQKKyFBbGlhcyBjZXJ0VHlwZXMgcGtjczkgMjIKK2NlcnRUeXBlcyAxCQk6CQkJOiB4NTA5Q2VydGlmaWNhdGUKK2NlcnRUeXBlcyAyCQk6CQkJOiBzZHNpQ2VydGlmaWNhdGUKKyFBbGlhcyBjcmxUeXBlcyBwa2NzOSAyMworY3JsVHlwZXMgMQkJOgkJCTogeDUwOUNybAorCishQWxpYXMgcGtjczEyIHBrY3MgMTIKKyFBbGlhcyBwa2NzMTItcGJlaWRzIHBrY3MxMiAxCisKKyFDbmFtZSBwYmUtV2l0aFNIQTFBbmQxMjhCaXRSQzQKK3BrY3MxMi1wYmVpZHMgMQkJOiBQQkUtU0hBMS1SQzQtMTI4CTogcGJlV2l0aFNIQTFBbmQxMjhCaXRSQzQKKyFDbmFtZSBwYmUtV2l0aFNIQTFBbmQ0MEJpdFJDNAorcGtjczEyLXBiZWlkcyAyCQk6IFBCRS1TSEExLVJDNC00MAk6IHBiZVdpdGhTSEExQW5kNDBCaXRSQzQKKyFDbmFtZSBwYmUtV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVMtQ0JDCitwa2NzMTItcGJlaWRzIDMJCTogUEJFLVNIQTEtM0RFUwkJOiBwYmVXaXRoU0hBMUFuZDMtS2V5VHJpcGxlREVTLUNCQworIUNuYW1lIHBiZS1XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFUy1DQkMKK3BrY3MxMi1wYmVpZHMgNAkJOiBQQkUtU0hBMS0yREVTCQk6IHBiZVdpdGhTSEExQW5kMi1LZXlUcmlwbGVERVMtQ0JDCishQ25hbWUgcGJlLVdpdGhTSEExQW5kMTI4Qml0UkMyLUNCQworcGtjczEyLXBiZWlkcyA1CQk6IFBCRS1TSEExLVJDMi0xMjgJOiBwYmVXaXRoU0hBMUFuZDEyOEJpdFJDMi1DQkMKKyFDbmFtZSBwYmUtV2l0aFNIQTFBbmQ0MEJpdFJDMi1DQkMKK3BrY3MxMi1wYmVpZHMgNgkJOiBQQkUtU0hBMS1SQzItNDAJOiBwYmVXaXRoU0hBMUFuZDQwQml0UkMyLUNCQworCishQWxpYXMgcGtjczEyLVZlcnNpb24xIHBrY3MxMiAxMAorIUFsaWFzIHBrY3MxMi1CYWdJZHMgcGtjczEyLVZlcnNpb24xIDEKK3BrY3MxMi1CYWdJZHMgMQkJOgkJCToga2V5QmFnCitwa2NzMTItQmFnSWRzIDIJCToJCQk6IHBrY3M4U2hyb3VkZWRLZXlCYWcKK3BrY3MxMi1CYWdJZHMgMwkJOgkJCTogY2VydEJhZworcGtjczEyLUJhZ0lkcyA0CQk6CQkJOiBjcmxCYWcKK3BrY3MxMi1CYWdJZHMgNQkJOgkJCTogc2VjcmV0QmFnCitwa2NzMTItQmFnSWRzIDYJCToJCQk6IHNhZmVDb250ZW50c0JhZworCityc2Fkc2kgMiAyCQk6IE1EMgkJCTogbWQyCityc2Fkc2kgMiA0CQk6IE1ENAkJCTogbWQ0Cityc2Fkc2kgMiA1CQk6IE1ENQkJCTogbWQ1CisJCQk6IE1ENS1TSEExCQk6IG1kNS1zaGExCityc2Fkc2kgMiA2CQk6CQkJOiBobWFjV2l0aE1ENQorcnNhZHNpIDIgNwkJOgkJCTogaG1hY1dpdGhTSEExCisKKyMgRnJvbSBSRkM0MjMxCityc2Fkc2kgMiA4CQk6CQkJOiBobWFjV2l0aFNIQTIyNAorcnNhZHNpIDIgOQkJOgkJCTogaG1hY1dpdGhTSEEyNTYKK3JzYWRzaSAyIDEwCQk6CQkJOiBobWFjV2l0aFNIQTM4NAorcnNhZHNpIDIgMTEJCToJCQk6IGhtYWNXaXRoU0hBNTEyCisKK3JzYWRzaSAzIDIJCTogUkMyLUNCQwkJOiByYzItY2JjCisJCQk6IFJDMi1FQ0IJCTogcmMyLWVjYgorIUNuYW1lIHJjMi1jZmI2NAorCQkJOiBSQzItQ0ZCCQk6IHJjMi1jZmIKKyFDbmFtZSByYzItb2ZiNjQKKwkJCTogUkMyLU9GQgkJOiByYzItb2ZiCisJCQk6IFJDMi00MC1DQkMJCTogcmMyLTQwLWNiYworCQkJOiBSQzItNjQtQ0JDCQk6IHJjMi02NC1jYmMKK3JzYWRzaSAzIDQJCTogUkM0CQkJOiByYzQKKwkJCTogUkM0LTQwCQk6IHJjNC00MAorcnNhZHNpIDMgNwkJOiBERVMtRURFMy1DQkMJCTogZGVzLWVkZTMtY2JjCityc2Fkc2kgMyA4CQk6IFJDNS1DQkMJCTogcmM1LWNiYworCQkJOiBSQzUtRUNCCQk6IHJjNS1lY2IKKyFDbmFtZSByYzUtY2ZiNjQKKwkJCTogUkM1LUNGQgkJOiByYzUtY2ZiCishQ25hbWUgcmM1LW9mYjY0CisJCQk6IFJDNS1PRkIJCTogcmM1LW9mYgorCishQ25hbWUgbXMtZXh0LXJlcQorMSAzIDYgMSA0IDEgMzExIDIgMSAxNAk6IG1zRXh0UmVxCQk6IE1pY3Jvc29mdCBFeHRlbnNpb24gUmVxdWVzdAorIUNuYW1lIG1zLWNvZGUtaW5kCisxIDMgNiAxIDQgMSAzMTEgMiAxIDIxCTogbXNDb2RlSW5kCQk6IE1pY3Jvc29mdCBJbmRpdmlkdWFsIENvZGUgU2lnbmluZworIUNuYW1lIG1zLWNvZGUtY29tCisxIDMgNiAxIDQgMSAzMTEgMiAxIDIyCTogbXNDb2RlQ29tCQk6IE1pY3Jvc29mdCBDb21tZXJjaWFsIENvZGUgU2lnbmluZworIUNuYW1lIG1zLWN0bC1zaWduCisxIDMgNiAxIDQgMSAzMTEgMTAgMyAxCTogbXNDVExTaWduCQk6IE1pY3Jvc29mdCBUcnVzdCBMaXN0IFNpZ25pbmcKKyFDbmFtZSBtcy1zZ2MKKzEgMyA2IDEgNCAxIDMxMSAxMCAzIDMJOiBtc1NHQwkJCTogTWljcm9zb2Z0IFNlcnZlciBHYXRlZCBDcnlwdG8KKyFDbmFtZSBtcy1lZnMKKzEgMyA2IDEgNCAxIDMxMSAxMCAzIDQJOiBtc0VGUwkJCTogTWljcm9zb2Z0IEVuY3J5cHRlZCBGaWxlIFN5c3RlbQorIUNuYW1lIG1zLXNtYXJ0Y2FyZC1sb2dpbgorMSAzIDYgMSA0IDEgMzExIDIwIDIgMgk6IG1zU21hcnRjYXJkTG9naW4JOiBNaWNyb3NvZnQgU21hcnRjYXJkbG9naW4KKyFDbmFtZSBtcy11cG4KKzEgMyA2IDEgNCAxIDMxMSAyMCAyIDMJOiBtc1VQTgkJCTogTWljcm9zb2Z0IFVuaXZlcnNhbCBQcmluY2lwYWwgTmFtZQorCisxIDMgNiAxIDQgMSAxODggNyAxIDEgMgk6IElERUEtQ0JDCQk6IGlkZWEtY2JjCisJCQk6IElERUEtRUNCCQk6IGlkZWEtZWNiCishQ25hbWUgaWRlYS1jZmI2NAorCQkJOiBJREVBLUNGQgkJOiBpZGVhLWNmYgorIUNuYW1lIGlkZWEtb2ZiNjQKKwkJCTogSURFQS1PRkIJCTogaWRlYS1vZmIKKworMSAzIDYgMSA0IDEgMzAyOSAxIDIJOiBCRi1DQkMJCTogYmYtY2JjCisJCQk6IEJGLUVDQgkJOiBiZi1lY2IKKyFDbmFtZSBiZi1jZmI2NAorCQkJOiBCRi1DRkIJCTogYmYtY2ZiCishQ25hbWUgYmYtb2ZiNjQKKwkJCTogQkYtT0ZCCQk6IGJmLW9mYgorCishQ25hbWUgaWQtcGtpeAorMSAzIDYgMSA1IDUgNwkJOiBQS0lYCisKKyMgUEtJWCBBcmNzCitpZC1wa2l4IDAJCTogaWQtcGtpeC1tb2QKK2lkLXBraXggMQkJOiBpZC1wZQoraWQtcGtpeCAyCQk6IGlkLXF0CitpZC1wa2l4IDMJCTogaWQta3AKK2lkLXBraXggNAkJOiBpZC1pdAoraWQtcGtpeCA1CQk6IGlkLXBraXAKK2lkLXBraXggNgkJOiBpZC1hbGcKK2lkLXBraXggNwkJOiBpZC1jbWMKK2lkLXBraXggOAkJOiBpZC1vbgoraWQtcGtpeCA5CQk6IGlkLXBkYQoraWQtcGtpeCAxMAkJOiBpZC1hY2EKK2lkLXBraXggMTEJCTogaWQtcWNzCitpZC1wa2l4IDEyCQk6IGlkLWNjdAoraWQtcGtpeCAyMQkJOiBpZC1wcGwKK2lkLXBraXggNDgJCTogaWQtYWQKKworIyBQS0lYIE1vZHVsZXMKK2lkLXBraXgtbW9kIDEJCTogaWQtcGtpeDEtZXhwbGljaXQtODgKK2lkLXBraXgtbW9kIDIJCTogaWQtcGtpeDEtaW1wbGljaXQtODgKK2lkLXBraXgtbW9kIDMJCTogaWQtcGtpeDEtZXhwbGljaXQtOTMKK2lkLXBraXgtbW9kIDQJCTogaWQtcGtpeDEtaW1wbGljaXQtOTMKK2lkLXBraXgtbW9kIDUJCTogaWQtbW9kLWNybWYKK2lkLXBraXgtbW9kIDYJCTogaWQtbW9kLWNtYworaWQtcGtpeC1tb2QgNwkJOiBpZC1tb2Qta2VhLXByb2ZpbGUtODgKK2lkLXBraXgtbW9kIDgJCTogaWQtbW9kLWtlYS1wcm9maWxlLTkzCitpZC1wa2l4LW1vZCA5CQk6IGlkLW1vZC1jbXAKK2lkLXBraXgtbW9kIDEwCQk6IGlkLW1vZC1xdWFsaWZpZWQtY2VydC04OAoraWQtcGtpeC1tb2QgMTEJCTogaWQtbW9kLXF1YWxpZmllZC1jZXJ0LTkzCitpZC1wa2l4LW1vZCAxMgkJOiBpZC1tb2QtYXR0cmlidXRlLWNlcnQKK2lkLXBraXgtbW9kIDEzCQk6IGlkLW1vZC10aW1lc3RhbXAtcHJvdG9jb2wKK2lkLXBraXgtbW9kIDE0CQk6IGlkLW1vZC1vY3NwCitpZC1wa2l4LW1vZCAxNQkJOiBpZC1tb2QtZHZjcworaWQtcGtpeC1tb2QgMTYJCTogaWQtbW9kLWNtcDIwMDAKKworIyBQS0lYIFByaXZhdGUgRXh0ZW5zaW9ucworIUNuYW1lIGluZm8tYWNjZXNzCitpZC1wZSAxCQkJOiBhdXRob3JpdHlJbmZvQWNjZXNzCTogQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzcworaWQtcGUgMgkJCTogYmlvbWV0cmljSW5mbwkJOiBCaW9tZXRyaWMgSW5mbworaWQtcGUgMwkJCTogcWNTdGF0ZW1lbnRzCitpZC1wZSA0CQkJOiBhYy1hdWRpdEVudGl0eQoraWQtcGUgNQkJCTogYWMtdGFyZ2V0aW5nCitpZC1wZSA2CQkJOiBhYUNvbnRyb2xzCitpZC1wZSA3CQkJOiBzYmdwLWlwQWRkckJsb2NrCitpZC1wZSA4CQkJOiBzYmdwLWF1dG9ub21vdXNTeXNOdW0KK2lkLXBlIDkJCQk6IHNiZ3Atcm91dGVySWRlbnRpZmllcgoraWQtcGUgMTAJCTogYWMtcHJveHlpbmcKKyFDbmFtZSBzaW5mby1hY2Nlc3MKK2lkLXBlIDExCQk6IHN1YmplY3RJbmZvQWNjZXNzCTogU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MKK2lkLXBlIDE0CQk6IHByb3h5Q2VydEluZm8JCTogUHJveHkgQ2VydGlmaWNhdGUgSW5mb3JtYXRpb24KKworIyBQS0lYIHBvbGljeVF1YWxpZmllcnMgZm9yIEludGVybmV0IHBvbGljeSBxdWFsaWZpZXJzCitpZC1xdCAxCQkJOiBpZC1xdC1jcHMJCTogUG9saWN5IFF1YWxpZmllciBDUFMKK2lkLXF0IDIJCQk6IGlkLXF0LXVub3RpY2UJCTogUG9saWN5IFF1YWxpZmllciBVc2VyIE5vdGljZQoraWQtcXQgMwkJCTogdGV4dE5vdGljZQorCisjIFBLSVgga2V5IHB1cnBvc2UgaWRlbnRpZmllcnMKKyFDbmFtZSBzZXJ2ZXItYXV0aAoraWQta3AgMQkJCTogc2VydmVyQXV0aAkJOiBUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbgorIUNuYW1lIGNsaWVudC1hdXRoCitpZC1rcCAyCQkJOiBjbGllbnRBdXRoCQk6IFRMUyBXZWIgQ2xpZW50IEF1dGhlbnRpY2F0aW9uCishQ25hbWUgY29kZS1zaWduCitpZC1rcCAzCQkJOiBjb2RlU2lnbmluZwkJOiBDb2RlIFNpZ25pbmcKKyFDbmFtZSBlbWFpbC1wcm90ZWN0CitpZC1rcCA0CQkJOiBlbWFpbFByb3RlY3Rpb24JOiBFLW1haWwgUHJvdGVjdGlvbgoraWQta3AgNQkJCTogaXBzZWNFbmRTeXN0ZW0JOiBJUFNlYyBFbmQgU3lzdGVtCitpZC1rcCA2CQkJOiBpcHNlY1R1bm5lbAkJOiBJUFNlYyBUdW5uZWwKK2lkLWtwIDcJCQk6IGlwc2VjVXNlcgkJOiBJUFNlYyBVc2VyCishQ25hbWUgdGltZS1zdGFtcAoraWQta3AgOAkJCTogdGltZVN0YW1waW5nCQk6IFRpbWUgU3RhbXBpbmcKKyMgRnJvbSBPQ1NQIHNwZWMgUkZDMjU2MAorIUNuYW1lIE9DU1Atc2lnbgoraWQta3AgOQkJCTogT0NTUFNpZ25pbmcJCTogT0NTUCBTaWduaW5nCitpZC1rcCAxMAkJOiBEVkNTCQkJOiBkdmNzCisKKyMgQ01QIGluZm9ybWF0aW9uIHR5cGVzCitpZC1pdCAxCQkJOiBpZC1pdC1jYVByb3RFbmNDZXJ0CitpZC1pdCAyCQkJOiBpZC1pdC1zaWduS2V5UGFpclR5cGVzCitpZC1pdCAzCQkJOiBpZC1pdC1lbmNLZXlQYWlyVHlwZXMKK2lkLWl0IDQJCQk6IGlkLWl0LXByZWZlcnJlZFN5bW1BbGcKK2lkLWl0IDUJCQk6IGlkLWl0LWNhS2V5VXBkYXRlSW5mbworaWQtaXQgNgkJCTogaWQtaXQtY3VycmVudENSTAoraWQtaXQgNwkJCTogaWQtaXQtdW5zdXBwb3J0ZWRPSURzCisjIG9ic29sZXRlCitpZC1pdCA4CQkJOiBpZC1pdC1zdWJzY3JpcHRpb25SZXF1ZXN0CisjIG9ic29sZXRlCitpZC1pdCA5CQkJOiBpZC1pdC1zdWJzY3JpcHRpb25SZXNwb25zZQoraWQtaXQgMTAJCTogaWQtaXQta2V5UGFpclBhcmFtUmVxCitpZC1pdCAxMQkJOiBpZC1pdC1rZXlQYWlyUGFyYW1SZXAKK2lkLWl0IDEyCQk6IGlkLWl0LXJldlBhc3NwaHJhc2UKK2lkLWl0IDEzCQk6IGlkLWl0LWltcGxpY2l0Q29uZmlybQoraWQtaXQgMTQJCTogaWQtaXQtY29uZmlybVdhaXRUaW1lCitpZC1pdCAxNQkJOiBpZC1pdC1vcmlnUEtJTWVzc2FnZQoraWQtaXQgMTYJCTogaWQtaXQtc3VwcExhbmdUYWdzCisKKyMgQ1JNRiByZWdpc3RyYXRpb24KK2lkLXBraXAgMQkJOiBpZC1yZWdDdHJsCitpZC1wa2lwIDIJCTogaWQtcmVnSW5mbworCisjIENSTUYgcmVnaXN0cmF0aW9uIGNvbnRyb2xzCitpZC1yZWdDdHJsIDEJCTogaWQtcmVnQ3RybC1yZWdUb2tlbgoraWQtcmVnQ3RybCAyCQk6IGlkLXJlZ0N0cmwtYXV0aGVudGljYXRvcgoraWQtcmVnQ3RybCAzCQk6IGlkLXJlZ0N0cmwtcGtpUHVibGljYXRpb25JbmZvCitpZC1yZWdDdHJsIDQJCTogaWQtcmVnQ3RybC1wa2lBcmNoaXZlT3B0aW9ucworaWQtcmVnQ3RybCA1CQk6IGlkLXJlZ0N0cmwtb2xkQ2VydElECitpZC1yZWdDdHJsIDYJCTogaWQtcmVnQ3RybC1wcm90b2NvbEVuY3JLZXkKKworIyBDUk1GIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbgoraWQtcmVnSW5mbyAxCQk6IGlkLXJlZ0luZm8tdXRmOFBhaXJzCitpZC1yZWdJbmZvIDIJCTogaWQtcmVnSW5mby1jZXJ0UmVxCisKKyMgYWxnb3JpdGhtcworaWQtYWxnIDEJCTogaWQtYWxnLWRlczQwCitpZC1hbGcgMgkJOiBpZC1hbGctbm9TaWduYXR1cmUKK2lkLWFsZyAzCQk6IGlkLWFsZy1kaC1zaWctaG1hYy1zaGExCitpZC1hbGcgNAkJOiBpZC1hbGctZGgtcG9wCisKKyMgQ01DIGNvbnRyb2xzCitpZC1jbWMgMQkJOiBpZC1jbWMtc3RhdHVzSW5mbworaWQtY21jIDIJCTogaWQtY21jLWlkZW50aWZpY2F0aW9uCitpZC1jbWMgMwkJOiBpZC1jbWMtaWRlbnRpdHlQcm9vZgoraWQtY21jIDQJCTogaWQtY21jLWRhdGFSZXR1cm4KK2lkLWNtYyA1CQk6IGlkLWNtYy10cmFuc2FjdGlvbklkCitpZC1jbWMgNgkJOiBpZC1jbWMtc2VuZGVyTm9uY2UKK2lkLWNtYyA3CQk6IGlkLWNtYy1yZWNpcGllbnROb25jZQoraWQtY21jIDgJCTogaWQtY21jLWFkZEV4dGVuc2lvbnMKK2lkLWNtYyA5CQk6IGlkLWNtYy1lbmNyeXB0ZWRQT1AKK2lkLWNtYyAxMAkJOiBpZC1jbWMtZGVjcnlwdGVkUE9QCitpZC1jbWMgMTEJCTogaWQtY21jLWxyYVBPUFdpdG5lc3MKK2lkLWNtYyAxNQkJOiBpZC1jbWMtZ2V0Q2VydAoraWQtY21jIDE2CQk6IGlkLWNtYy1nZXRDUkwKK2lkLWNtYyAxNwkJOiBpZC1jbWMtcmV2b2tlUmVxdWVzdAoraWQtY21jIDE4CQk6IGlkLWNtYy1yZWdJbmZvCitpZC1jbWMgMTkJCTogaWQtY21jLXJlc3BvbnNlSW5mbworaWQtY21jIDIxCQk6IGlkLWNtYy1xdWVyeVBlbmRpbmcKK2lkLWNtYyAyMgkJOiBpZC1jbWMtcG9wTGlua1JhbmRvbQoraWQtY21jIDIzCQk6IGlkLWNtYy1wb3BMaW5rV2l0bmVzcworaWQtY21jIDI0CQk6IGlkLWNtYy1jb25maXJtQ2VydEFjY2VwdGFuY2UgCisKKyMgb3RoZXIgbmFtZXMKK2lkLW9uIDEJCQk6IGlkLW9uLXBlcnNvbmFsRGF0YQoraWQtb24gMwkJCTogaWQtb24tcGVybWFuZW50SWRlbnRpZmllciA6IFBlcm1hbmVudCBJZGVudGlmaWVyCisKKyMgcGVyc29uYWwgZGF0YSBhdHRyaWJ1dGVzCitpZC1wZGEgMQkJOiBpZC1wZGEtZGF0ZU9mQmlydGgKK2lkLXBkYSAyCQk6IGlkLXBkYS1wbGFjZU9mQmlydGgKK2lkLXBkYSAzCQk6IGlkLXBkYS1nZW5kZXIKK2lkLXBkYSA0CQk6IGlkLXBkYS1jb3VudHJ5T2ZDaXRpemVuc2hpcAoraWQtcGRhIDUJCTogaWQtcGRhLWNvdW50cnlPZlJlc2lkZW5jZQorCisjIGF0dHJpYnV0ZSBjZXJ0aWZpY2F0ZSBhdHRyaWJ1dGVzCitpZC1hY2EgMQkJOiBpZC1hY2EtYXV0aGVudGljYXRpb25JbmZvCitpZC1hY2EgMgkJOiBpZC1hY2EtYWNjZXNzSWRlbnRpdHkKK2lkLWFjYSAzCQk6IGlkLWFjYS1jaGFyZ2luZ0lkZW50aXR5CitpZC1hY2EgNAkJOiBpZC1hY2EtZ3JvdXAKKyMgYXR0ZW50aW9uIDogdGhlIGZvbGxvd2luZyBzZWVtcyB0byBiZSBvYnNvbGV0ZSwgcmVwbGFjZSBieSAncm9sZScKK2lkLWFjYSA1CQk6IGlkLWFjYS1yb2xlCitpZC1hY2EgNgkJOiBpZC1hY2EtZW5jQXR0cnMKKworIyBxdWFsaWZpZWQgY2VydGlmaWNhdGUgc3RhdGVtZW50cworaWQtcWNzIDEJCTogaWQtcWNzLXBraXhRQ1N5bnRheC12MQorCisjIENNQyBjb250ZW50IHR5cGVzCitpZC1jY3QgMQkJOiBpZC1jY3QtY3JzCitpZC1jY3QgMgkJOiBpZC1jY3QtUEtJRGF0YQoraWQtY2N0IDMJCTogaWQtY2N0LVBLSVJlc3BvbnNlCisKKyMgUHJlZGVmaW5lZCBQcm94eSBDZXJ0aWZpY2F0ZSBwb2xpY3kgbGFuZ3VhZ2VzCitpZC1wcGwgMAkJOiBpZC1wcGwtYW55TGFuZ3VhZ2UJOiBBbnkgbGFuZ3VhZ2UKK2lkLXBwbCAxCQk6IGlkLXBwbC1pbmhlcml0QWxsCTogSW5oZXJpdCBhbGwKK2lkLXBwbCAyCQk6IGlkLXBwbC1pbmRlcGVuZGVudAk6IEluZGVwZW5kZW50CisKKyMgYWNjZXNzIGRlc2NyaXB0b3JzIGZvciBhdXRob3JpdHkgaW5mbyBhY2Nlc3MgZXh0ZW5zaW9uCishQ25hbWUgYWQtT0NTUAoraWQtYWQgMQkJCTogT0NTUAkJCTogT0NTUAorIUNuYW1lIGFkLWNhLWlzc3VlcnMKK2lkLWFkIDIJCQk6IGNhSXNzdWVycwkJOiBDQSBJc3N1ZXJzCishQ25hbWUgYWQtdGltZVN0YW1waW5nCitpZC1hZCAzCQkJOiBhZF90aW1lc3RhbXBpbmcJOiBBRCBUaW1lIFN0YW1waW5nCishQ25hbWUgYWQtZHZjcworaWQtYWQgNAkJCTogQURfRFZDUwkJOiBhZCBkdmNzCitpZC1hZCA1CQkJOiBjYVJlcG9zaXRvcnkJCTogQ0EgUmVwb3NpdG9yeQorCisKKyFBbGlhcyBpZC1wa2l4LU9DU1AgYWQtT0NTUAorIW1vZHVsZSBpZC1wa2l4LU9DU1AKKyFDbmFtZSBiYXNpYworaWQtcGtpeC1PQ1NQIDEJCTogYmFzaWNPQ1NQUmVzcG9uc2UJOiBCYXNpYyBPQ1NQIFJlc3BvbnNlCitpZC1wa2l4LU9DU1AgMgkJOiBOb25jZQkJCTogT0NTUCBOb25jZQoraWQtcGtpeC1PQ1NQIDMJCTogQ3JsSUQJCQk6IE9DU1AgQ1JMIElECitpZC1wa2l4LU9DU1AgNAkJOiBhY2NlcHRhYmxlUmVzcG9uc2VzCTogQWNjZXB0YWJsZSBPQ1NQIFJlc3BvbnNlcworaWQtcGtpeC1PQ1NQIDUJCTogbm9DaGVjawkJOiBPQ1NQIE5vIENoZWNrCitpZC1wa2l4LU9DU1AgNgkJOiBhcmNoaXZlQ3V0b2ZmCQk6IE9DU1AgQXJjaGl2ZSBDdXRvZmYKK2lkLXBraXgtT0NTUCA3CQk6IHNlcnZpY2VMb2NhdG9yCTogT0NTUCBTZXJ2aWNlIExvY2F0b3IKK2lkLXBraXgtT0NTUCA4CQk6IGV4dGVuZGVkU3RhdHVzCTogRXh0ZW5kZWQgT0NTUCBTdGF0dXMKK2lkLXBraXgtT0NTUCA5CQk6IHZhbGlkCitpZC1wa2l4LU9DU1AgMTAJCTogcGF0aAoraWQtcGtpeC1PQ1NQIDExCQk6IHRydXN0Um9vdAkJOiBUcnVzdCBSb290CishZ2xvYmFsCisKKzEgMyAxNCAzIDIJCTogYWxnb3JpdGhtCQk6IGFsZ29yaXRobQorYWxnb3JpdGhtIDMJCTogUlNBLU5QLU1ENQkJOiBtZDVXaXRoUlNBCithbGdvcml0aG0gNgkJOiBERVMtRUNCCQk6IGRlcy1lY2IKK2FsZ29yaXRobSA3CQk6IERFUy1DQkMJCTogZGVzLWNiYworIUNuYW1lIGRlcy1vZmI2NAorYWxnb3JpdGhtIDgJCTogREVTLU9GQgkJOiBkZXMtb2ZiCishQ25hbWUgZGVzLWNmYjY0CithbGdvcml0aG0gOQkJOiBERVMtQ0ZCCQk6IGRlcy1jZmIKK2FsZ29yaXRobSAxMQkJOiByc2FTaWduYXR1cmUKKyFDbmFtZSBkc2EtMgorYWxnb3JpdGhtIDEyCQk6IERTQS1vbGQJCTogZHNhRW5jcnlwdGlvbi1vbGQKK2FsZ29yaXRobSAxMwkJOiBEU0EtU0hBCQk6IGRzYVdpdGhTSEEKK2FsZ29yaXRobSAxNQkJOiBSU0EtU0hBCQk6IHNoYVdpdGhSU0FFbmNyeXB0aW9uCishQ25hbWUgZGVzLWVkZS1lY2IKK2FsZ29yaXRobSAxNwkJOiBERVMtRURFCQk6IGRlcy1lZGUKKyFDbmFtZSBkZXMtZWRlMy1lY2IKKwkJCTogREVTLUVERTMJCTogZGVzLWVkZTMKKwkJCTogREVTLUVERS1DQkMJCTogZGVzLWVkZS1jYmMKKyFDbmFtZSBkZXMtZWRlLWNmYjY0CisJCQk6IERFUy1FREUtQ0ZCCQk6IGRlcy1lZGUtY2ZiCishQ25hbWUgZGVzLWVkZTMtY2ZiNjQKKwkJCTogREVTLUVERTMtQ0ZCCQk6IGRlcy1lZGUzLWNmYgorIUNuYW1lIGRlcy1lZGUtb2ZiNjQKKwkJCTogREVTLUVERS1PRkIJCTogZGVzLWVkZS1vZmIKKyFDbmFtZSBkZXMtZWRlMy1vZmI2NAorCQkJOiBERVMtRURFMy1PRkIJCTogZGVzLWVkZTMtb2ZiCisJCQk6IERFU1gtQ0JDCQk6IGRlc3gtY2JjCithbGdvcml0aG0gMTgJCTogU0hBCQkJOiBzaGEKK2FsZ29yaXRobSAyNgkJOiBTSEExCQkJOiBzaGExCishQ25hbWUgZHNhV2l0aFNIQTEtMgorYWxnb3JpdGhtIDI3CQk6IERTQS1TSEExLW9sZAkJOiBkc2FXaXRoU0hBMS1vbGQKK2FsZ29yaXRobSAyOQkJOiBSU0EtU0hBMS0yCQk6IHNoYTFXaXRoUlNBCisKKzEgMyAzNiAzIDIgMQkJOiBSSVBFTUQxNjAJCTogcmlwZW1kMTYwCisxIDMgMzYgMyAzIDEgMgkJOiBSU0EtUklQRU1EMTYwCQk6IHJpcGVtZDE2MFdpdGhSU0EKKworIUNuYW1lIHN4bmV0CisxIDMgMTAxIDEgNCAxCQk6IFNYTmV0SUQJCTogU3Ryb25nIEV4dHJhbmV0IElECisKKzIgNQkJCTogWDUwMAkJCTogZGlyZWN0b3J5IHNlcnZpY2VzIChYLjUwMCkKKworWDUwMCA0CQkJOiBYNTA5CitYNTA5IDMJCQk6IENOCQkJOiBjb21tb25OYW1lCitYNTA5IDQJCQk6IFNOCQkJOiBzdXJuYW1lCitYNTA5IDUJCQk6IAkJCTogc2VyaWFsTnVtYmVyCitYNTA5IDYJCQk6IEMJCQk6IGNvdW50cnlOYW1lCitYNTA5IDcJCQk6IEwJCQk6IGxvY2FsaXR5TmFtZQorWDUwOSA4CQkJOiBTVAkJCTogc3RhdGVPclByb3ZpbmNlTmFtZQorWDUwOSA5CQkJOiBzdHJlZXQJCTogc3RyZWV0QWRkcmVzcworWDUwOSAxMAkJCTogTwkJCTogb3JnYW5pemF0aW9uTmFtZQorWDUwOSAxMQkJCTogT1UJCQk6IG9yZ2FuaXphdGlvbmFsVW5pdE5hbWUKK1g1MDkgMTIJCQk6IHRpdGxlCQkJOiB0aXRsZQorWDUwOSAxMwkJCTogCQkJOiBkZXNjcmlwdGlvbgorWDUwOSAxNAkJCTogCQkJOiBzZWFyY2hHdWlkZQorWDUwOSAxNQkJCTogCQkJOiBidXNpbmVzc0NhdGVnb3J5CitYNTA5IDE2CQkJOiAJCQk6IHBvc3RhbEFkZHJlc3MKK1g1MDkgMTcJCQk6IAkJCTogcG9zdGFsQ29kZQorWDUwOSAxOAkJCTogCQkJOiBwb3N0T2ZmaWNlQm94CitYNTA5IDE5CQkJOiAJCQk6IHBoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lCitYNTA5IDIwCQkJOiAJCQk6IHRlbGVwaG9uZU51bWJlcgorWDUwOSAyMQkJCTogCQkJOiB0ZWxleE51bWJlcgorWDUwOSAyMgkJCTogCQkJOiB0ZWxldGV4VGVybWluYWxJZGVudGlmaWVyCitYNTA5IDIzCQkJOiAJCQk6IGZhY3NpbWlsZVRlbGVwaG9uZU51bWJlcgorWDUwOSAyNAkJCTogCQkJOiB4MTIxQWRkcmVzcworWDUwOSAyNQkJCTogCQkJOiBpbnRlcm5hdGlvbmFsaVNETk51bWJlcgorWDUwOSAyNgkJCTogCQkJOiByZWdpc3RlcmVkQWRkcmVzcworWDUwOSAyNwkJCTogCQkJOiBkZXN0aW5hdGlvbkluZGljYXRvcgorWDUwOSAyOAkJCTogCQkJOiBwcmVmZXJyZWREZWxpdmVyeU1ldGhvZAorWDUwOSAyOQkJCTogCQkJOiBwcmVzZW50YXRpb25BZGRyZXNzCitYNTA5IDMwCQkJOiAJCQk6IHN1cHBvcnRlZEFwcGxpY2F0aW9uQ29udGV4dAorWDUwOSAzMQkJCTogbWVtYmVyCQk6CitYNTA5IDMyCQkJOiBvd25lcgkJCToKK1g1MDkgMzMJCQk6IAkJCTogcm9sZU9jY3VwYW50CitYNTA5IDM0CQkJOiBzZWVBbHNvCQk6CitYNTA5IDM1CQkJOiAJCQk6IHVzZXJQYXNzd29yZAorWDUwOSAzNgkJCTogCQkJOiB1c2VyQ2VydGlmaWNhdGUKK1g1MDkgMzcJCQk6IAkJCTogY0FDZXJ0aWZpY2F0ZQorWDUwOSAzOAkJCTogCQkJOiBhdXRob3JpdHlSZXZvY2F0aW9uTGlzdAorWDUwOSAzOQkJCTogCQkJOiBjZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0CitYNTA5IDQwCQkJOiAJCQk6IGNyb3NzQ2VydGlmaWNhdGVQYWlyCitYNTA5IDQxCQkJOiBuYW1lCQkJOiBuYW1lCitYNTA5IDQyCQkJOiBHTgkJCTogZ2l2ZW5OYW1lCitYNTA5IDQzCQkJOiBpbml0aWFscwkJOiBpbml0aWFscworWDUwOSA0NAkJCTogCQkJOiBnZW5lcmF0aW9uUXVhbGlmaWVyCitYNTA5IDQ1CQkJOiAJCQk6IHg1MDBVbmlxdWVJZGVudGlmaWVyCitYNTA5IDQ2CQkJOiBkblF1YWxpZmllcgkJOiBkblF1YWxpZmllcgorWDUwOSA0NwkJCTogCQkJOiBlbmhhbmNlZFNlYXJjaEd1aWRlCitYNTA5IDQ4CQkJOiAJCQk6IHByb3RvY29sSW5mb3JtYXRpb24KK1g1MDkgNDkJCQk6IAkJCTogZGlzdGluZ3Vpc2hlZE5hbWUKK1g1MDkgNTAJCQk6IAkJCTogdW5pcXVlTWVtYmVyCitYNTA5IDUxCQkJOiAJCQk6IGhvdXNlSWRlbnRpZmllcgorWDUwOSA1MgkJCTogCQkJOiBzdXBwb3J0ZWRBbGdvcml0aG1zCitYNTA5IDUzCQkJOiAJCQk6IGRlbHRhUmV2b2NhdGlvbkxpc3QKK1g1MDkgNTQJCQk6IGRtZE5hbWUJCToKK1g1MDkgNjUJCQk6CQkJOiBwc2V1ZG9ueW0KK1g1MDkgNzIJCQk6IHJvbGUJCQk6IHJvbGUKKworWDUwMCA4CQkJOiBYNTAwYWxnb3JpdGhtcwk6IGRpcmVjdG9yeSBzZXJ2aWNlcyAtIGFsZ29yaXRobXMKK1g1MDBhbGdvcml0aG1zIDEgMQk6IFJTQQkJCTogcnNhCitYNTAwYWxnb3JpdGhtcyAzIDEwMAk6IFJTQS1NREMyCQk6IG1kYzJXaXRoUlNBCitYNTAwYWxnb3JpdGhtcyAzIDEwMQk6IE1EQzIJCQk6IG1kYzIKKworWDUwMCAyOQkJCTogaWQtY2UKKyFDbmFtZSBzdWJqZWN0LWRpcmVjdG9yeS1hdHRyaWJ1dGVzCitpZC1jZSA5CQkJOiBzdWJqZWN0RGlyZWN0b3J5QXR0cmlidXRlcyA6IFg1MDl2MyBTdWJqZWN0IERpcmVjdG9yeSBBdHRyaWJ1dGVzCishQ25hbWUgc3ViamVjdC1rZXktaWRlbnRpZmllcgoraWQtY2UgMTQJCTogc3ViamVjdEtleUlkZW50aWZpZXIJOiBYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllcgorIUNuYW1lIGtleS11c2FnZQoraWQtY2UgMTUJCToga2V5VXNhZ2UJCTogWDUwOXYzIEtleSBVc2FnZQorIUNuYW1lIHByaXZhdGUta2V5LXVzYWdlLXBlcmlvZAoraWQtY2UgMTYJCTogcHJpdmF0ZUtleVVzYWdlUGVyaW9kCTogWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZAorIUNuYW1lIHN1YmplY3QtYWx0LW5hbWUKK2lkLWNlIDE3CQk6IHN1YmplY3RBbHROYW1lCTogWDUwOXYzIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZQorIUNuYW1lIGlzc3Vlci1hbHQtbmFtZQoraWQtY2UgMTgJCTogaXNzdWVyQWx0TmFtZQkJOiBYNTA5djMgSXNzdWVyIEFsdGVybmF0aXZlIE5hbWUKKyFDbmFtZSBiYXNpYy1jb25zdHJhaW50cworaWQtY2UgMTkJCTogYmFzaWNDb25zdHJhaW50cwk6IFg1MDl2MyBCYXNpYyBDb25zdHJhaW50cworIUNuYW1lIGNybC1udW1iZXIKK2lkLWNlIDIwCQk6IGNybE51bWJlcgkJOiBYNTA5djMgQ1JMIE51bWJlcgorIUNuYW1lIGNybC1yZWFzb24KK2lkLWNlIDIxCQk6IENSTFJlYXNvbgkJOiBYNTA5djMgQ1JMIFJlYXNvbiBDb2RlCishQ25hbWUgaW52YWxpZGl0eS1kYXRlCitpZC1jZSAyNAkJOiBpbnZhbGlkaXR5RGF0ZQk6IEludmFsaWRpdHkgRGF0ZQorIUNuYW1lIGRlbHRhLWNybAoraWQtY2UgMjcJCTogZGVsdGFDUkwJCTogWDUwOXYzIERlbHRhIENSTCBJbmRpY2F0b3IKKyFDbmFtZSBpc3N1aW5nLWRpc3RyaWJ1dGlvbi1wb2ludAoraWQtY2UgMjgJCTogaXNzdWluZ0Rpc3RyaWJ1dGlvblBvaW50IDogWDUwOXYzIElzc3VpbmcgRGlzdHJ1YnV0aW9uIFBvaW50CishQ25hbWUgY2VydGlmaWNhdGUtaXNzdWVyCitpZC1jZSAyOQkJOiBjZXJ0aWZpY2F0ZUlzc3Vlcgk6IFg1MDl2MyBDZXJ0aWZpY2F0ZSBJc3N1ZXIKKyFDbmFtZSBuYW1lLWNvbnN0cmFpbnRzCitpZC1jZSAzMAkJOiBuYW1lQ29uc3RyYWludHMJOiBYNTA5djMgTmFtZSBDb25zdHJhaW50cworIUNuYW1lIGNybC1kaXN0cmlidXRpb24tcG9pbnRzCitpZC1jZSAzMQkJOiBjcmxEaXN0cmlidXRpb25Qb2ludHMJOiBYNTA5djMgQ1JMIERpc3RyaWJ1dGlvbiBQb2ludHMKKyFDbmFtZSBjZXJ0aWZpY2F0ZS1wb2xpY2llcworaWQtY2UgMzIJCTogY2VydGlmaWNhdGVQb2xpY2llcwk6IFg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llcworIUNuYW1lIGFueS1wb2xpY3kKK2NlcnRpZmljYXRlLXBvbGljaWVzIDAJOiBhbnlQb2xpY3kJCTogWDUwOXYzIEFueSBQb2xpY3kKKyFDbmFtZSBwb2xpY3ktbWFwcGluZ3MKK2lkLWNlIDMzCQk6IHBvbGljeU1hcHBpbmdzCTogWDUwOXYzIFBvbGljeSBNYXBwaW5ncworIUNuYW1lIGF1dGhvcml0eS1rZXktaWRlbnRpZmllcgoraWQtY2UgMzUJCTogYXV0aG9yaXR5S2V5SWRlbnRpZmllciA6IFg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXIKKyFDbmFtZSBwb2xpY3ktY29uc3RyYWludHMKK2lkLWNlIDM2CQk6IHBvbGljeUNvbnN0cmFpbnRzCTogWDUwOXYzIFBvbGljeSBDb25zdHJhaW50cworIUNuYW1lIGV4dC1rZXktdXNhZ2UKK2lkLWNlIDM3CQk6IGV4dGVuZGVkS2V5VXNhZ2UJOiBYNTA5djMgRXh0ZW5kZWQgS2V5IFVzYWdlCishQ25hbWUgZnJlc2hlc3QtY3JsCitpZC1jZSA0NgkJOiBmcmVzaGVzdENSTAkJOiBYNTA5djMgRnJlc2hlc3QgQ1JMCishQ25hbWUgaW5oaWJpdC1hbnktcG9saWN5CitpZC1jZSA1NAkJOiBpbmhpYml0QW55UG9saWN5CTogWDUwOXYzIEluaGliaXQgQW55IFBvbGljeQorIUNuYW1lIHRhcmdldC1pbmZvcm1hdGlvbgoraWQtY2UgNTUJCTogdGFyZ2V0SW5mb3JtYXRpb24JOiBYNTA5djMgQUMgVGFyZ2V0aW5nCishQ25hbWUgbm8tcmV2LWF2YWlsCitpZC1jZSA1NgkJOiBub1JldkF2YWlsCQk6IFg1MDl2MyBObyBSZXZvY2F0aW9uIEF2YWlsYWJsZQorCishQ25hbWUgbmV0c2NhcGUKKzIgMTYgODQwIDEgMTEzNzMwCTogTmV0c2NhcGUJCTogTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycC4KKyFDbmFtZSBuZXRzY2FwZS1jZXJ0LWV4dGVuc2lvbgorbmV0c2NhcGUgMQkJOiBuc0NlcnRFeHQJCTogTmV0c2NhcGUgQ2VydGlmaWNhdGUgRXh0ZW5zaW9uCishQ25hbWUgbmV0c2NhcGUtZGF0YS10eXBlCituZXRzY2FwZSAyCQk6IG5zRGF0YVR5cGUJCTogTmV0c2NhcGUgRGF0YSBUeXBlCishQ25hbWUgbmV0c2NhcGUtY2VydC10eXBlCituZXRzY2FwZS1jZXJ0LWV4dGVuc2lvbiAxIDogbnNDZXJ0VHlwZQkJOiBOZXRzY2FwZSBDZXJ0IFR5cGUKKyFDbmFtZSBuZXRzY2FwZS1iYXNlLXVybAorbmV0c2NhcGUtY2VydC1leHRlbnNpb24gMiA6IG5zQmFzZVVybAkJOiBOZXRzY2FwZSBCYXNlIFVybAorIUNuYW1lIG5ldHNjYXBlLXJldm9jYXRpb24tdXJsCituZXRzY2FwZS1jZXJ0LWV4dGVuc2lvbiAzIDogbnNSZXZvY2F0aW9uVXJsCTogTmV0c2NhcGUgUmV2b2NhdGlvbiBVcmwKKyFDbmFtZSBuZXRzY2FwZS1jYS1yZXZvY2F0aW9uLXVybAorbmV0c2NhcGUtY2VydC1leHRlbnNpb24gNCA6IG5zQ2FSZXZvY2F0aW9uVXJsCTogTmV0c2NhcGUgQ0EgUmV2b2NhdGlvbiBVcmwKKyFDbmFtZSBuZXRzY2FwZS1yZW5ld2FsLXVybAorbmV0c2NhcGUtY2VydC1leHRlbnNpb24gNyA6IG5zUmVuZXdhbFVybAk6IE5ldHNjYXBlIFJlbmV3YWwgVXJsCishQ25hbWUgbmV0c2NhcGUtY2EtcG9saWN5LXVybAorbmV0c2NhcGUtY2VydC1leHRlbnNpb24gOCA6IG5zQ2FQb2xpY3lVcmwJOiBOZXRzY2FwZSBDQSBQb2xpY3kgVXJsCishQ25hbWUgbmV0c2NhcGUtc3NsLXNlcnZlci1uYW1lCituZXRzY2FwZS1jZXJ0LWV4dGVuc2lvbiAxMiA6IG5zU3NsU2VydmVyTmFtZQk6IE5ldHNjYXBlIFNTTCBTZXJ2ZXIgTmFtZQorIUNuYW1lIG5ldHNjYXBlLWNvbW1lbnQKK25ldHNjYXBlLWNlcnQtZXh0ZW5zaW9uIDEzIDogbnNDb21tZW50CQk6IE5ldHNjYXBlIENvbW1lbnQKKyFDbmFtZSBuZXRzY2FwZS1jZXJ0LXNlcXVlbmNlCituZXRzY2FwZS1kYXRhLXR5cGUgNQk6IG5zQ2VydFNlcXVlbmNlCTogTmV0c2NhcGUgQ2VydGlmaWNhdGUgU2VxdWVuY2UKKyFDbmFtZSBucy1zZ2MKK25ldHNjYXBlIDQgMQkJOiBuc1NHQwkJCTogTmV0c2NhcGUgU2VydmVyIEdhdGVkIENyeXB0bworCisjIGlzbygxKQoraXNvIDMJCQk6IE9SRwkJCTogb3JnCitvcmcgNgkJCTogRE9ECQkJOiBkb2QKK2RvZCAxCQkJOiBJQU5BCQkJOiBpYW5hCishQWxpYXMgaW50ZXJuZXQgaWFuYQorCitpbnRlcm5ldCAxCQk6IGRpcmVjdG9yeQkJOiBEaXJlY3RvcnkKK2ludGVybmV0IDIJCTogbWdtdAkJCTogTWFuYWdlbWVudAoraW50ZXJuZXQgMwkJOiBleHBlcmltZW50YWwJCTogRXhwZXJpbWVudGFsCitpbnRlcm5ldCA0CQk6IHByaXZhdGUJCTogUHJpdmF0ZQoraW50ZXJuZXQgNQkJOiBzZWN1cml0eQkJOiBTZWN1cml0eQoraW50ZXJuZXQgNgkJOiBzbm1wdjIJCTogU05NUHYyCisjIERvY3VtZW50cyByZWZlciB0byAiaW50ZXJuZXQgNyIgYXMgIm1haWwiLiBUaGlzIGhvd2V2ZXIgbGVhZHMgdG8gYW1iaWd1aXRpZXMKKyMgd2l0aCBSRkMyNzk4LCBTZWN0aW9uIDkuMS4zLCB3aGVyZSAibWFpbCIgaXMgZGVmaW5lZCBhcyB0aGUgc2hvcnQgbmFtZSBmb3IKKyMgcmZjODIyTWFpbGJveC4gVGhlIHNob3J0IG5hbWUgaXMgdGhlcmVmb3JlIGhlcmUgbGVmdCBvdXQgZm9yIGEgcmVhc29uLgorIyBTdWJjbGFzc2VzIG9mICJtYWlsIiwgZS5nLiAiTUlNRSBNSFMiIGRvbid0IGNvbnNpdHV0ZSBhIHByb2JsZW0sIGFzCisjIHJlZmVyZW5jZXMgYXJlIHJlYWxpemVkIHZpYSBsb25nIG5hbWUgIk1haWwiICh3aXRoIGNhcGl0YWwgTSkuCitpbnRlcm5ldCA3CQk6CQkJOiBNYWlsCisKK1ByaXZhdGUgMQkJOiBlbnRlcnByaXNlcwkJOiBFbnRlcnByaXNlcworCisjIFJGQyAyMjQ3CitFbnRlcnByaXNlcyAxNDY2IDM0NAk6IGRjb2JqZWN0CQk6IGRjT2JqZWN0CisKKyMgUkZDIDE0OTUKK01haWwgMQkJCTogbWltZS1taHMJCTogTUlNRSBNSFMKK21pbWUtbWhzIDEJCTogbWltZS1taHMtaGVhZGluZ3MJOiBtaW1lLW1ocy1oZWFkaW5ncworbWltZS1taHMgMgkJOiBtaW1lLW1ocy1ib2RpZXMJOiBtaW1lLW1ocy1ib2RpZXMKK21pbWUtbWhzLWhlYWRpbmdzIDEJOiBpZC1oZXgtcGFydGlhbC1tZXNzYWdlIDogaWQtaGV4LXBhcnRpYWwtbWVzc2FnZQorbWltZS1taHMtaGVhZGluZ3MgMgk6IGlkLWhleC1tdWx0aXBhcnQtbWVzc2FnZSA6IGlkLWhleC1tdWx0aXBhcnQtbWVzc2FnZQorCisjIFdoYXQgdGhlIGhlbGwgYXJlIHRoZXNlIE9JRHMsIHJlYWxseT8KKyFDbmFtZSBybGUtY29tcHJlc3Npb24KKzEgMSAxIDEgNjY2IDEJCTogUkxFCQkJOiBydW4gbGVuZ3RoIGNvbXByZXNzaW9uCishQ25hbWUgemxpYi1jb21wcmVzc2lvbgoraWQtc21pbWUtYWxnIDgJCTogWkxJQgkJCTogemxpYiBjb21wcmVzc2lvbgorCisjIEFFUyBha2EgUmlqbmRhZWwKKworIUFsaWFzIGNzb3IgMiAxNiA4NDAgMSAxMDEgMworIUFsaWFzIG5pc3RBbGdvcml0aG1zIGNzb3IgNAorIUFsaWFzIGFlcyBuaXN0QWxnb3JpdGhtcyAxCisKK2FlcyAxCQkJOiBBRVMtMTI4LUVDQgkJOiBhZXMtMTI4LWVjYgorYWVzIDIJCQk6IEFFUy0xMjgtQ0JDCQk6IGFlcy0xMjgtY2JjCishQ25hbWUgYWVzLTEyOC1vZmIxMjgKK2FlcyAzCQkJOiBBRVMtMTI4LU9GQgkJOiBhZXMtMTI4LW9mYgorIUNuYW1lIGFlcy0xMjgtY2ZiMTI4CithZXMgNAkJCTogQUVTLTEyOC1DRkIJCTogYWVzLTEyOC1jZmIKKworYWVzIDIxCQkJOiBBRVMtMTkyLUVDQgkJOiBhZXMtMTkyLWVjYgorYWVzIDIyCQkJOiBBRVMtMTkyLUNCQwkJOiBhZXMtMTkyLWNiYworIUNuYW1lIGFlcy0xOTItb2ZiMTI4CithZXMgMjMJCQk6IEFFUy0xOTItT0ZCCQk6IGFlcy0xOTItb2ZiCishQ25hbWUgYWVzLTE5Mi1jZmIxMjgKK2FlcyAyNAkJCTogQUVTLTE5Mi1DRkIJCTogYWVzLTE5Mi1jZmIKKworYWVzIDQxCQkJOiBBRVMtMjU2LUVDQgkJOiBhZXMtMjU2LWVjYgorYWVzIDQyCQkJOiBBRVMtMjU2LUNCQwkJOiBhZXMtMjU2LWNiYworIUNuYW1lIGFlcy0yNTYtb2ZiMTI4CithZXMgNDMJCQk6IEFFUy0yNTYtT0ZCCQk6IGFlcy0yNTYtb2ZiCishQ25hbWUgYWVzLTI1Ni1jZmIxMjgKK2FlcyA0NAkJCTogQUVTLTI1Ni1DRkIJCTogYWVzLTI1Ni1jZmIKKworIyBUaGVyZSBhcmUgbm8gT0lEcyBmb3IgdGhlc2UgbW9kZXMuLi4KKworCQkJOiBBRVMtMTI4LUNGQjEJCTogYWVzLTEyOC1jZmIxCisJCQk6IEFFUy0xOTItQ0ZCMQkJOiBhZXMtMTkyLWNmYjEKKwkJCTogQUVTLTI1Ni1DRkIxCQk6IGFlcy0yNTYtY2ZiMQorCQkJOiBBRVMtMTI4LUNGQjgJCTogYWVzLTEyOC1jZmI4CisJCQk6IEFFUy0xOTItQ0ZCOAkJOiBhZXMtMTkyLWNmYjgKKwkJCTogQUVTLTI1Ni1DRkI4CQk6IGFlcy0yNTYtY2ZiOAorCQkJOiBERVMtQ0ZCMQkJOiBkZXMtY2ZiMQorCQkJOiBERVMtQ0ZCOAkJOiBkZXMtY2ZiOAorCQkJOiBERVMtRURFMy1DRkIxCQk6IGRlcy1lZGUzLWNmYjEKKwkJCTogREVTLUVERTMtQ0ZCOAkJOiBkZXMtZWRlMy1jZmI4CisKK2FlcyA1CQkJOiBpZC1hZXMxMjgtd3JhcCAKK2FlcyAyNQkJCTogaWQtYWVzMTkyLXdyYXAgCithZXMgNDUJCQk6IGlkLWFlczI1Ni13cmFwIAorCisjIE9JRHMgZm9yIFNIQTIyNCwgU0hBMjU2LCBTSEEzODUgYW5kIFNIQTUxMiwgYWNjb3JkaW5nIHRvIHg5Ljg0LgorIUFsaWFzIG5pc3RfaGFzaGFsZ3MgbmlzdEFsZ29yaXRobXMgMgorbmlzdF9oYXNoYWxncyAxCQk6IFNIQTI1NgkJOiBzaGEyNTYKK25pc3RfaGFzaGFsZ3MgMgkJOiBTSEEzODQJCTogc2hhMzg0CituaXN0X2hhc2hhbGdzIDMJCTogU0hBNTEyCQk6IHNoYTUxMgorbmlzdF9oYXNoYWxncyA0CQk6IFNIQTIyNAkJOiBzaGEyMjQKKworIyBPSURzIGZvciBkc2Etd2l0aC1zaGEyMjQgYW5kIGRzYS13aXRoLXNoYTI1NgorIUFsaWFzIGRzYV93aXRoX3NoYTIgbmlzdEFsZ29yaXRobXMgMworZHNhX3dpdGhfc2hhMiAxCQk6IGRzYV93aXRoX1NIQTIyNAorZHNhX3dpdGhfc2hhMiAyCQk6IGRzYV93aXRoX1NIQTI1NgorCisjIEhvbGQgaW5zdHJ1Y3Rpb24gQ1JMIGVudHJ5IGV4dGVuc2lvbgorIUNuYW1lIGhvbGQtaW5zdHJ1Y3Rpb24tY29kZQoraWQtY2UgMjMJCTogaG9sZEluc3RydWN0aW9uQ29kZQk6IEhvbGQgSW5zdHJ1Y3Rpb24gQ29kZQorIUFsaWFzIGhvbGRJbnN0cnVjdGlvbglYOS01NyAyCishQ25hbWUgaG9sZC1pbnN0cnVjdGlvbi1ub25lCitob2xkSW5zdHJ1Y3Rpb24gMQk6IGhvbGRJbnN0cnVjdGlvbk5vbmUJOiBIb2xkIEluc3RydWN0aW9uIE5vbmUKKyFDbmFtZSBob2xkLWluc3RydWN0aW9uLWNhbGwtaXNzdWVyCitob2xkSW5zdHJ1Y3Rpb24gMgk6IGhvbGRJbnN0cnVjdGlvbkNhbGxJc3N1ZXIgOiBIb2xkIEluc3RydWN0aW9uIENhbGwgSXNzdWVyCishQ25hbWUgaG9sZC1pbnN0cnVjdGlvbi1yZWplY3QKK2hvbGRJbnN0cnVjdGlvbiAzCTogaG9sZEluc3RydWN0aW9uUmVqZWN0CTogSG9sZCBJbnN0cnVjdGlvbiBSZWplY3QKKworIyBPSUQncyBmcm9tIElUVS1ULiAgTW9zdCBvZiB0aGlzIGlzIGRlZmluZWQgaW4gUkZDIDEyNzQuICBBIGNvdXBsZSBvZgorIyB0aGVtIGFyZSBhbHNvIG1lbnRpb25lZCBpbiBSRkMgMjI0NworaXR1LXQgOQkJCTogZGF0YQorZGF0YSAyMzQyCQk6IHBzcworcHNzIDE5MjAwMzAwCQk6IHVjbAordWNsIDEwMAkJCTogcGlsb3QKK3BpbG90IDEJCQk6CQkJOiBwaWxvdEF0dHJpYnV0ZVR5cGUKK3BpbG90IDMJCQk6CQkJOiBwaWxvdEF0dHJpYnV0ZVN5bnRheAorcGlsb3QgNAkJCToJCQk6IHBpbG90T2JqZWN0Q2xhc3MKK3BpbG90IDEwCQk6CQkJOiBwaWxvdEdyb3VwcworcGlsb3RBdHRyaWJ1dGVTeW50YXggNAk6CQkJOiBpQTVTdHJpbmdTeW50YXgKK3BpbG90QXR0cmlidXRlU3ludGF4IDUJOgkJCTogY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheAorcGlsb3RPYmplY3RDbGFzcyAzCToJCQk6IHBpbG90T2JqZWN0CitwaWxvdE9iamVjdENsYXNzIDQJOgkJCTogcGlsb3RQZXJzb24KK3BpbG90T2JqZWN0Q2xhc3MgNQk6IGFjY291bnQKK3BpbG90T2JqZWN0Q2xhc3MgNgk6IGRvY3VtZW50CitwaWxvdE9iamVjdENsYXNzIDcJOiByb29tCitwaWxvdE9iamVjdENsYXNzIDkJOgkJCTogZG9jdW1lbnRTZXJpZXMKK3BpbG90T2JqZWN0Q2xhc3MgMTMJOiBkb21haW4JCTogRG9tYWluCitwaWxvdE9iamVjdENsYXNzIDE0CToJCQk6IHJGQzgyMmxvY2FsUGFydAorcGlsb3RPYmplY3RDbGFzcyAxNQk6CQkJOiBkTlNEb21haW4KK3BpbG90T2JqZWN0Q2xhc3MgMTcJOgkJCTogZG9tYWluUmVsYXRlZE9iamVjdAorcGlsb3RPYmplY3RDbGFzcyAxOAk6CQkJOiBmcmllbmRseUNvdW50cnkKK3BpbG90T2JqZWN0Q2xhc3MgMTkJOgkJCTogc2ltcGxlU2VjdXJpdHlPYmplY3QKK3BpbG90T2JqZWN0Q2xhc3MgMjAJOgkJCTogcGlsb3RPcmdhbml6YXRpb24KK3BpbG90T2JqZWN0Q2xhc3MgMjEJOgkJCTogcGlsb3REU0EKK3BpbG90T2JqZWN0Q2xhc3MgMjIJOgkJCTogcXVhbGl0eUxhYmVsbGVkRGF0YQorcGlsb3RBdHRyaWJ1dGVUeXBlIDEJOiBVSUQJCQk6IHVzZXJJZAorcGlsb3RBdHRyaWJ1dGVUeXBlIDIJOgkJCTogdGV4dEVuY29kZWRPUkFkZHJlc3MKK3BpbG90QXR0cmlidXRlVHlwZSAzCTogbWFpbAkJCTogcmZjODIyTWFpbGJveAorcGlsb3RBdHRyaWJ1dGVUeXBlIDQJOiBpbmZvCitwaWxvdEF0dHJpYnV0ZVR5cGUgNQk6CQkJOiBmYXZvdXJpdGVEcmluaworcGlsb3RBdHRyaWJ1dGVUeXBlIDYJOgkJCTogcm9vbU51bWJlcgorcGlsb3RBdHRyaWJ1dGVUeXBlIDcJOiBwaG90bworcGlsb3RBdHRyaWJ1dGVUeXBlIDgJOgkJCTogdXNlckNsYXNzCitwaWxvdEF0dHJpYnV0ZVR5cGUgOQk6IGhvc3QKK3BpbG90QXR0cmlidXRlVHlwZSAxMAk6IG1hbmFnZXIKK3BpbG90QXR0cmlidXRlVHlwZSAxMQk6CQkJOiBkb2N1bWVudElkZW50aWZpZXIKK3BpbG90QXR0cmlidXRlVHlwZSAxMgk6CQkJOiBkb2N1bWVudFRpdGxlCitwaWxvdEF0dHJpYnV0ZVR5cGUgMTMJOgkJCTogZG9jdW1lbnRWZXJzaW9uCitwaWxvdEF0dHJpYnV0ZVR5cGUgMTQJOgkJCTogZG9jdW1lbnRBdXRob3IKK3BpbG90QXR0cmlidXRlVHlwZSAxNQk6CQkJOiBkb2N1bWVudExvY2F0aW9uCitwaWxvdEF0dHJpYnV0ZVR5cGUgMjAJOgkJCTogaG9tZVRlbGVwaG9uZU51bWJlcgorcGlsb3RBdHRyaWJ1dGVUeXBlIDIxCTogc2VjcmV0YXJ5CitwaWxvdEF0dHJpYnV0ZVR5cGUgMjIJOgkJCTogb3RoZXJNYWlsYm94CitwaWxvdEF0dHJpYnV0ZVR5cGUgMjMJOgkJCTogbGFzdE1vZGlmaWVkVGltZQorcGlsb3RBdHRyaWJ1dGVUeXBlIDI0CToJCQk6IGxhc3RNb2RpZmllZEJ5CitwaWxvdEF0dHJpYnV0ZVR5cGUgMjUJOiBEQwkJCTogZG9tYWluQ29tcG9uZW50CitwaWxvdEF0dHJpYnV0ZVR5cGUgMjYJOgkJCTogYVJlY29yZAorcGlsb3RBdHRyaWJ1dGVUeXBlIDI3CToJCQk6IHBpbG90QXR0cmlidXRlVHlwZTI3CitwaWxvdEF0dHJpYnV0ZVR5cGUgMjgJOgkJCTogbVhSZWNvcmQKK3BpbG90QXR0cmlidXRlVHlwZSAyOQk6CQkJOiBuU1JlY29yZAorcGlsb3RBdHRyaWJ1dGVUeXBlIDMwCToJCQk6IHNPQVJlY29yZAorcGlsb3RBdHRyaWJ1dGVUeXBlIDMxCToJCQk6IGNOQU1FUmVjb3JkCitwaWxvdEF0dHJpYnV0ZVR5cGUgMzcJOgkJCTogYXNzb2NpYXRlZERvbWFpbgorcGlsb3RBdHRyaWJ1dGVUeXBlIDM4CToJCQk6IGFzc29jaWF0ZWROYW1lCitwaWxvdEF0dHJpYnV0ZVR5cGUgMzkJOgkJCTogaG9tZVBvc3RhbEFkZHJlc3MKK3BpbG90QXR0cmlidXRlVHlwZSA0MAk6CQkJOiBwZXJzb25hbFRpdGxlCitwaWxvdEF0dHJpYnV0ZVR5cGUgNDEJOgkJCTogbW9iaWxlVGVsZXBob25lTnVtYmVyCitwaWxvdEF0dHJpYnV0ZVR5cGUgNDIJOgkJCTogcGFnZXJUZWxlcGhvbmVOdW1iZXIKK3BpbG90QXR0cmlidXRlVHlwZSA0Mwk6CQkJOiBmcmllbmRseUNvdW50cnlOYW1lCisjIFRoZSBmb2xsb3dpbmcgY2xhc2hlcyB3aXRoIDIuNS40LjQ1LCBzbyBjb21tZW50ZWQgYXdheQorI3BpbG90QXR0cmlidXRlVHlwZSA0NAk6IHVpZAkJCTogdW5pcXVlSWRlbnRpZmllcgorcGlsb3RBdHRyaWJ1dGVUeXBlIDQ1CToJCQk6IG9yZ2FuaXphdGlvbmFsU3RhdHVzCitwaWxvdEF0dHJpYnV0ZVR5cGUgNDYJOgkJCTogamFuZXRNYWlsYm94CitwaWxvdEF0dHJpYnV0ZVR5cGUgNDcJOgkJCTogbWFpbFByZWZlcmVuY2VPcHRpb24KK3BpbG90QXR0cmlidXRlVHlwZSA0OAk6CQkJOiBidWlsZGluZ05hbWUKK3BpbG90QXR0cmlidXRlVHlwZSA0OQk6CQkJOiBkU0FRdWFsaXR5CitwaWxvdEF0dHJpYnV0ZVR5cGUgNTAJOgkJCTogc2luZ2xlTGV2ZWxRdWFsaXR5CitwaWxvdEF0dHJpYnV0ZVR5cGUgNTEJOgkJCTogc3VidHJlZU1pbmltdW1RdWFsaXR5CitwaWxvdEF0dHJpYnV0ZVR5cGUgNTIJOgkJCTogc3VidHJlZU1heGltdW1RdWFsaXR5CitwaWxvdEF0dHJpYnV0ZVR5cGUgNTMJOgkJCTogcGVyc29uYWxTaWduYXR1cmUKK3BpbG90QXR0cmlidXRlVHlwZSA1NAk6CQkJOiBkSVRSZWRpcmVjdAorcGlsb3RBdHRyaWJ1dGVUeXBlIDU1CTogYXVkaW8KK3BpbG90QXR0cmlidXRlVHlwZSA1Ngk6CQkJOiBkb2N1bWVudFB1Ymxpc2hlcgorCitpbnRlcm5hdGlvbmFsLW9yZ2FuaXphdGlvbnMgNDIJOiBpZC1zZXQJOiBTZWN1cmUgRWxlY3Ryb25pYyBUcmFuc2FjdGlvbnMKKworaWQtc2V0IDAJCTogc2V0LWN0eXBlCQk6IGNvbnRlbnQgdHlwZXMKK2lkLXNldCAxCQk6IHNldC1tc2dFeHQJCTogbWVzc2FnZSBleHRlbnNpb25zCitpZC1zZXQgMwkJOiBzZXQtYXR0cgoraWQtc2V0IDUJCTogc2V0LXBvbGljeQoraWQtc2V0IDcJCTogc2V0LWNlcnRFeHQJCTogY2VydGlmaWNhdGUgZXh0ZW5zaW9ucworaWQtc2V0IDgJCTogc2V0LWJyYW5kCisKK3NldC1jdHlwZSAwCQk6IHNldGN0LVBBTkRhdGEKK3NldC1jdHlwZSAxCQk6IHNldGN0LVBBTlRva2VuCitzZXQtY3R5cGUgMgkJOiBzZXRjdC1QQU5Pbmx5CitzZXQtY3R5cGUgMwkJOiBzZXRjdC1PSURhdGEKK3NldC1jdHlwZSA0CQk6IHNldGN0LVBJCitzZXQtY3R5cGUgNQkJOiBzZXRjdC1QSURhdGEKK3NldC1jdHlwZSA2CQk6IHNldGN0LVBJRGF0YVVuc2lnbmVkCitzZXQtY3R5cGUgNwkJOiBzZXRjdC1IT0RJbnB1dAorc2V0LWN0eXBlIDgJCTogc2V0Y3QtQXV0aFJlc0JhZ2dhZ2UKK3NldC1jdHlwZSA5CQk6IHNldGN0LUF1dGhSZXZSZXFCYWdnYWdlCitzZXQtY3R5cGUgMTAJCTogc2V0Y3QtQXV0aFJldlJlc0JhZ2dhZ2UKK3NldC1jdHlwZSAxMQkJOiBzZXRjdC1DYXBUb2tlblNlcQorc2V0LWN0eXBlIDEyCQk6IHNldGN0LVBJbml0UmVzRGF0YQorc2V0LWN0eXBlIDEzCQk6IHNldGN0LVBJLVRCUworc2V0LWN0eXBlIDE0CQk6IHNldGN0LVBSZXNEYXRhCitzZXQtY3R5cGUgMTYJCTogc2V0Y3QtQXV0aFJlcVRCUworc2V0LWN0eXBlIDE3CQk6IHNldGN0LUF1dGhSZXNUQlMKK3NldC1jdHlwZSAxOAkJOiBzZXRjdC1BdXRoUmVzVEJTWAorc2V0LWN0eXBlIDE5CQk6IHNldGN0LUF1dGhUb2tlblRCUworc2V0LWN0eXBlIDIwCQk6IHNldGN0LUNhcFRva2VuRGF0YQorc2V0LWN0eXBlIDIxCQk6IHNldGN0LUNhcFRva2VuVEJTCitzZXQtY3R5cGUgMjIJCTogc2V0Y3QtQWNxQ2FyZENvZGVNc2cKK3NldC1jdHlwZSAyMwkJOiBzZXRjdC1BdXRoUmV2UmVxVEJTCitzZXQtY3R5cGUgMjQJCTogc2V0Y3QtQXV0aFJldlJlc0RhdGEKK3NldC1jdHlwZSAyNQkJOiBzZXRjdC1BdXRoUmV2UmVzVEJTCitzZXQtY3R5cGUgMjYJCTogc2V0Y3QtQ2FwUmVxVEJTCitzZXQtY3R5cGUgMjcJCTogc2V0Y3QtQ2FwUmVxVEJTWAorc2V0LWN0eXBlIDI4CQk6IHNldGN0LUNhcFJlc0RhdGEKK3NldC1jdHlwZSAyOQkJOiBzZXRjdC1DYXBSZXZSZXFUQlMKK3NldC1jdHlwZSAzMAkJOiBzZXRjdC1DYXBSZXZSZXFUQlNYCitzZXQtY3R5cGUgMzEJCTogc2V0Y3QtQ2FwUmV2UmVzRGF0YQorc2V0LWN0eXBlIDMyCQk6IHNldGN0LUNyZWRSZXFUQlMKK3NldC1jdHlwZSAzMwkJOiBzZXRjdC1DcmVkUmVxVEJTWAorc2V0LWN0eXBlIDM0CQk6IHNldGN0LUNyZWRSZXNEYXRhCitzZXQtY3R5cGUgMzUJCTogc2V0Y3QtQ3JlZFJldlJlcVRCUworc2V0LWN0eXBlIDM2CQk6IHNldGN0LUNyZWRSZXZSZXFUQlNYCitzZXQtY3R5cGUgMzcJCTogc2V0Y3QtQ3JlZFJldlJlc0RhdGEKK3NldC1jdHlwZSAzOAkJOiBzZXRjdC1QQ2VydFJlcURhdGEKK3NldC1jdHlwZSAzOQkJOiBzZXRjdC1QQ2VydFJlc1RCUworc2V0LWN0eXBlIDQwCQk6IHNldGN0LUJhdGNoQWRtaW5SZXFEYXRhCitzZXQtY3R5cGUgNDEJCTogc2V0Y3QtQmF0Y2hBZG1pblJlc0RhdGEKK3NldC1jdHlwZSA0MgkJOiBzZXRjdC1DYXJkQ0luaXRSZXNUQlMKK3NldC1jdHlwZSA0MwkJOiBzZXRjdC1NZUFxQ0luaXRSZXNUQlMKK3NldC1jdHlwZSA0NAkJOiBzZXRjdC1SZWdGb3JtUmVzVEJTCitzZXQtY3R5cGUgNDUJCTogc2V0Y3QtQ2VydFJlcURhdGEKK3NldC1jdHlwZSA0NgkJOiBzZXRjdC1DZXJ0UmVxVEJTCitzZXQtY3R5cGUgNDcJCTogc2V0Y3QtQ2VydFJlc0RhdGEKK3NldC1jdHlwZSA0OAkJOiBzZXRjdC1DZXJ0SW5xUmVxVEJTCitzZXQtY3R5cGUgNDkJCTogc2V0Y3QtRXJyb3JUQlMKK3NldC1jdHlwZSA1MAkJOiBzZXRjdC1QSUR1YWxTaWduZWRUQkUKK3NldC1jdHlwZSA1MQkJOiBzZXRjdC1QSVVuc2lnbmVkVEJFCitzZXQtY3R5cGUgNTIJCTogc2V0Y3QtQXV0aFJlcVRCRQorc2V0LWN0eXBlIDUzCQk6IHNldGN0LUF1dGhSZXNUQkUKK3NldC1jdHlwZSA1NAkJOiBzZXRjdC1BdXRoUmVzVEJFWAorc2V0LWN0eXBlIDU1CQk6IHNldGN0LUF1dGhUb2tlblRCRQorc2V0LWN0eXBlIDU2CQk6IHNldGN0LUNhcFRva2VuVEJFCitzZXQtY3R5cGUgNTcJCTogc2V0Y3QtQ2FwVG9rZW5UQkVYCitzZXQtY3R5cGUgNTgJCTogc2V0Y3QtQWNxQ2FyZENvZGVNc2dUQkUKK3NldC1jdHlwZSA1OQkJOiBzZXRjdC1BdXRoUmV2UmVxVEJFCitzZXQtY3R5cGUgNjAJCTogc2V0Y3QtQXV0aFJldlJlc1RCRQorc2V0LWN0eXBlIDYxCQk6IHNldGN0LUF1dGhSZXZSZXNUQkVCCitzZXQtY3R5cGUgNjIJCTogc2V0Y3QtQ2FwUmVxVEJFCitzZXQtY3R5cGUgNjMJCTogc2V0Y3QtQ2FwUmVxVEJFWAorc2V0LWN0eXBlIDY0CQk6IHNldGN0LUNhcFJlc1RCRQorc2V0LWN0eXBlIDY1CQk6IHNldGN0LUNhcFJldlJlcVRCRQorc2V0LWN0eXBlIDY2CQk6IHNldGN0LUNhcFJldlJlcVRCRVgKK3NldC1jdHlwZSA2NwkJOiBzZXRjdC1DYXBSZXZSZXNUQkUKK3NldC1jdHlwZSA2OAkJOiBzZXRjdC1DcmVkUmVxVEJFCitzZXQtY3R5cGUgNjkJCTogc2V0Y3QtQ3JlZFJlcVRCRVgKK3NldC1jdHlwZSA3MAkJOiBzZXRjdC1DcmVkUmVzVEJFCitzZXQtY3R5cGUgNzEJCTogc2V0Y3QtQ3JlZFJldlJlcVRCRQorc2V0LWN0eXBlIDcyCQk6IHNldGN0LUNyZWRSZXZSZXFUQkVYCitzZXQtY3R5cGUgNzMJCTogc2V0Y3QtQ3JlZFJldlJlc1RCRQorc2V0LWN0eXBlIDc0CQk6IHNldGN0LUJhdGNoQWRtaW5SZXFUQkUKK3NldC1jdHlwZSA3NQkJOiBzZXRjdC1CYXRjaEFkbWluUmVzVEJFCitzZXQtY3R5cGUgNzYJCTogc2V0Y3QtUmVnRm9ybVJlcVRCRQorc2V0LWN0eXBlIDc3CQk6IHNldGN0LUNlcnRSZXFUQkUKK3NldC1jdHlwZSA3OAkJOiBzZXRjdC1DZXJ0UmVxVEJFWAorc2V0LWN0eXBlIDc5CQk6IHNldGN0LUNlcnRSZXNUQkUKK3NldC1jdHlwZSA4MAkJOiBzZXRjdC1DUkxOb3RpZmljYXRpb25UQlMKK3NldC1jdHlwZSA4MQkJOiBzZXRjdC1DUkxOb3RpZmljYXRpb25SZXNUQlMKK3NldC1jdHlwZSA4MgkJOiBzZXRjdC1CQ0lEaXN0cmlidXRpb25UQlMKKworc2V0LW1zZ0V4dCAxCQk6IHNldGV4dC1nZW5DcnlwdAk6IGdlbmVyaWMgY3J5cHRvZ3JhbQorc2V0LW1zZ0V4dCAzCQk6IHNldGV4dC1taUF1dGgJCTogbWVyY2hhbnQgaW5pdGlhdGVkIGF1dGgKK3NldC1tc2dFeHQgNAkJOiBzZXRleHQtcGluU2VjdXJlCitzZXQtbXNnRXh0IDUJCTogc2V0ZXh0LXBpbkFueQorc2V0LW1zZ0V4dCA3CQk6IHNldGV4dC10cmFjazIKK3NldC1tc2dFeHQgOAkJOiBzZXRleHQtY3YJCTogYWRkaXRpb25hbCB2ZXJpZmljYXRpb24KKworc2V0LXBvbGljeSAwCQk6IHNldC1wb2xpY3ktcm9vdAorCitzZXQtY2VydEV4dCAwCQk6IHNldENleHQtaGFzaGVkUm9vdAorc2V0LWNlcnRFeHQgMQkJOiBzZXRDZXh0LWNlcnRUeXBlCitzZXQtY2VydEV4dCAyCQk6IHNldENleHQtbWVyY2hEYXRhCitzZXQtY2VydEV4dCAzCQk6IHNldENleHQtY0NlcnRSZXF1aXJlZAorc2V0LWNlcnRFeHQgNAkJOiBzZXRDZXh0LXR1bm5lbGluZworc2V0LWNlcnRFeHQgNQkJOiBzZXRDZXh0LXNldEV4dAorc2V0LWNlcnRFeHQgNgkJOiBzZXRDZXh0LXNldFF1YWxmCitzZXQtY2VydEV4dCA3CQk6IHNldENleHQtUEdXWWNhcGFiaWxpdGllcworc2V0LWNlcnRFeHQgOAkJOiBzZXRDZXh0LVRva2VuSWRlbnRpZmllcgorc2V0LWNlcnRFeHQgOQkJOiBzZXRDZXh0LVRyYWNrMkRhdGEKK3NldC1jZXJ0RXh0IDEwCQk6IHNldENleHQtVG9rZW5UeXBlCitzZXQtY2VydEV4dCAxMQkJOiBzZXRDZXh0LUlzc3VlckNhcGFiaWxpdGllcworCitzZXQtYXR0ciAwCQk6IHNldEF0dHItQ2VydAorc2V0LWF0dHIgMQkJOiBzZXRBdHRyLVBHV1ljYXAJOiBwYXltZW50IGdhdGV3YXkgY2FwYWJpbGl0aWVzCitzZXQtYXR0ciAyCQk6IHNldEF0dHItVG9rZW5UeXBlCitzZXQtYXR0ciAzCQk6IHNldEF0dHItSXNzQ2FwCTogaXNzdWVyIGNhcGFiaWxpdGllcworCitzZXRBdHRyLUNlcnQgMAkJOiBzZXQtcm9vdEtleVRodW1iCitzZXRBdHRyLUNlcnQgMQkJOiBzZXQtYWRkUG9saWN5CisKK3NldEF0dHItVG9rZW5UeXBlIDEJOiBzZXRBdHRyLVRva2VuLUVNVgorc2V0QXR0ci1Ub2tlblR5cGUgMgk6IHNldEF0dHItVG9rZW4tQjBQcmltZQorCitzZXRBdHRyLUlzc0NhcCAzCTogc2V0QXR0ci1Jc3NDYXAtQ1ZNCitzZXRBdHRyLUlzc0NhcCA0CTogc2V0QXR0ci1Jc3NDYXAtVDIKK3NldEF0dHItSXNzQ2FwIDUJOiBzZXRBdHRyLUlzc0NhcC1TaWcKKworc2V0QXR0ci1Jc3NDYXAtQ1ZNIDEJOiBzZXRBdHRyLUdlbkNyeXB0Z3JtCTogZ2VuZXJhdGUgY3J5cHRvZ3JhbQorc2V0QXR0ci1Jc3NDYXAtVDIgMQk6IHNldEF0dHItVDJFbmMJCTogZW5jcnlwdGVkIHRyYWNrIDIKK3NldEF0dHItSXNzQ2FwLVQyIDIJOiBzZXRBdHRyLVQyY2xlYXJ0eHQJOiBjbGVhcnRleHQgdHJhY2sgMgorCitzZXRBdHRyLUlzc0NhcC1TaWcgMQk6IHNldEF0dHItVG9rSUNDc2lnCTogSUNDIG9yIHRva2VuIHNpZ25hdHVyZQorc2V0QXR0ci1Jc3NDYXAtU2lnIDIJOiBzZXRBdHRyLVNlY0RldlNpZwk6IHNlY3VyZSBkZXZpY2Ugc2lnbmF0dXJlCisKK3NldC1icmFuZCAxCQk6IHNldC1icmFuZC1JQVRBLUFUQQorc2V0LWJyYW5kIDMwCQk6IHNldC1icmFuZC1EaW5lcnMKK3NldC1icmFuZCAzNAkJOiBzZXQtYnJhbmQtQW1lcmljYW5FeHByZXNzCitzZXQtYnJhbmQgMzUJCTogc2V0LWJyYW5kLUpDQgorc2V0LWJyYW5kIDQJCTogc2V0LWJyYW5kLVZpc2EKK3NldC1icmFuZCA1CQk6IHNldC1icmFuZC1NYXN0ZXJDYXJkCitzZXQtYnJhbmQgNjAxMQkJOiBzZXQtYnJhbmQtTm92dXMKKworcnNhZHNpIDMgMTAJCTogREVTLUNETUYJCTogZGVzLWNkbWYKK3JzYWRzaSAxIDEgNgkJOiByc2FPQUVQRW5jcnlwdGlvblNFVAorCisJCQk6IE9ha2xleS1FQzJOLTMJCTogaXBzZWMzCisJCQk6IE9ha2xleS1FQzJOLTQJCTogaXBzZWM0CisKK2lzbyAwIDEwMTE4IDMgMCA1NQk6IHdoaXJscG9vbAorCisjIEdPU1QgT0lEcworCittZW1iZXItYm9keSA2NDMgMiAyCTogY3J5cHRvcHJvCittZW1iZXItYm9keSA2NDMgMiA5CTogY3J5cHRvY29tCisKK2NyeXB0b3BybyAzCQk6IGlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC0yMDAxIDogR09TVCBSIDM0LjExLTk0IHdpdGggR09TVCBSIDM0LjEwLTIwMDEKK2NyeXB0b3BybyA0CQk6IGlkLUdvc3RSMzQxMS05NC13aXRoLUdvc3RSMzQxMC05NCA6IEdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC05NAorIUNuYW1lIGlkLUdvc3RSMzQxMS05NAorY3J5cHRvcHJvIDkJCTogbWRfZ29zdDk0CQk6IEdPU1QgUiAzNC4xMS05NAorY3J5cHRvcHJvIDEwCQk6IGlkLUhNQUNHb3N0UjM0MTEtOTQJOiBITUFDIEdPU1QgMzQuMTEtOTQKKyFDbmFtZSBpZC1Hb3N0UjM0MTAtMjAwMQorY3J5cHRvcHJvIDE5CQk6IGdvc3QyMDAxCTogR09TVCBSIDM0LjEwLTIwMDEKKyFDbmFtZSBpZC1Hb3N0UjM0MTAtOTQKK2NyeXB0b3BybyAyMAkJOiBnb3N0OTQJOiBHT1NUIFIgMzQuMTAtOTQKKyFDbmFtZSBpZC1Hb3N0MjgxNDctODkKK2NyeXB0b3BybyAyMQkJOiBnb3N0ODkgCQk6IEdPU1QgMjgxNDctODkKKwkJCTogZ29zdDg5LWNudAorIUNuYW1lIGlkLUdvc3QyODE0Ny04OS1NQUMKK2NyeXB0b3BybyAyMgkJOiBnb3N0LW1hYwk6IEdPU1QgMjgxNDctODkgTUFDCishQ25hbWUgaWQtR29zdFIzNDExLTk0LXByZgorY3J5cHRvcHJvIDIzCQk6IHByZi1nb3N0cjM0MTEtOTQJOiBHT1NUIFIgMzQuMTEtOTQgUFJGCitjcnlwdG9wcm8gOTgJCTogaWQtR29zdFIzNDEwLTIwMDFESAk6IEdPU1QgUiAzNC4xMC0yMDAxIERICitjcnlwdG9wcm8gOTkJCTogaWQtR29zdFIzNDEwLTk0REgJOiBHT1NUIFIgMzQuMTAtOTQgREgKKworY3J5cHRvcHJvIDE0IDEJCTogaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1LZXlNZXNoaW5nCitjcnlwdG9wcm8gMTQgMAkJOiBpZC1Hb3N0MjgxNDctODktTm9uZS1LZXlNZXNoaW5nCisKKyMgR09TVCBwYXJhbWV0ZXIgc2V0IE9JRHMKKworY3J5cHRvcHJvIDMwIDAJCTogaWQtR29zdFIzNDExLTk0LVRlc3RQYXJhbVNldAorY3J5cHRvcHJvIDMwIDEJCTogaWQtR29zdFIzNDExLTk0LUNyeXB0b1Byb1BhcmFtU2V0CisKK2NyeXB0b3BybyAzMSAwCQk6IGlkLUdvc3QyODE0Ny04OS1UZXN0UGFyYW1TZXQKK2NyeXB0b3BybyAzMSAxCQk6IGlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQS1QYXJhbVNldAorY3J5cHRvcHJvIDMxIDIJCTogaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1CLVBhcmFtU2V0CitjcnlwdG9wcm8gMzEgMwkJOiBpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUMtUGFyYW1TZXQKK2NyeXB0b3BybyAzMSA0CQk6IGlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tRC1QYXJhbVNldAorY3J5cHRvcHJvIDMxIDUJCTogaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1Pc2Nhci0xLTEtUGFyYW1TZXQKK2NyeXB0b3BybyAzMSA2CQk6IGlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0wLVBhcmFtU2V0CitjcnlwdG9wcm8gMzEgNwkJOiBpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLVJJQy0xLVBhcmFtU2V0CisKK2NyeXB0b3BybyAzMiAwCQk6IGlkLUdvc3RSMzQxMC05NC1UZXN0UGFyYW1TZXQKK2NyeXB0b3BybyAzMiAyCQk6IGlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQS1QYXJhbVNldAorY3J5cHRvcHJvIDMyIDMJCTogaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1CLVBhcmFtU2V0CitjcnlwdG9wcm8gMzIgNAkJOiBpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUMtUGFyYW1TZXQKK2NyeXB0b3BybyAzMiA1CQk6IGlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tRC1QYXJhbVNldAorCitjcnlwdG9wcm8gMzMgMQkJOiBpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEEtUGFyYW1TZXQKK2NyeXB0b3BybyAzMyAyCQk6IGlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldAorY3J5cHRvcHJvIDMzIDMJCTogaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1YY2hDLVBhcmFtU2V0CisKK2NyeXB0b3BybyAzNSAwCQk6IGlkLUdvc3RSMzQxMC0yMDAxLVRlc3RQYXJhbVNldAorY3J5cHRvcHJvIDM1IDEJCTogaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUEtUGFyYW1TZXQKK2NyeXB0b3BybyAzNSAyCQk6IGlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1CLVBhcmFtU2V0CitjcnlwdG9wcm8gMzUgMwkJOiBpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQy1QYXJhbVNldAorCitjcnlwdG9wcm8gMzYgMAkJOiBpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tWGNoQS1QYXJhbVNldAorY3J5cHRvcHJvIDM2IDEJCTogaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLVhjaEItUGFyYW1TZXQKKworaWQtR29zdFIzNDEwLTk0IDEJOiBpZC1Hb3N0UjM0MTAtOTQtYQoraWQtR29zdFIzNDEwLTk0IDIJOiBpZC1Hb3N0UjM0MTAtOTQtYUJpcworaWQtR29zdFIzNDEwLTk0IDMJOiBpZC1Hb3N0UjM0MTAtOTQtYgoraWQtR29zdFIzNDEwLTk0IDQJOiBpZC1Hb3N0UjM0MTAtOTQtYkJpcworCisjIENyeXB0b2NvbSBMVEQgR09TVCBPSURzCisKK2NyeXB0b2NvbSAxIDYgMQkJOiBpZC1Hb3N0MjgxNDctODktY2MJOiBHT1NUIDI4MTQ3LTg5IENyeXB0b2NvbSBQYXJhbVNldAorIUNuYW1lIGlkLUdvc3RSMzQxMC05NC1jYworY3J5cHRvY29tIDEgNSAzCQk6IGdvc3Q5NGNjCTogR09TVCAzNC4xMC05NCBDcnlwdG9jb20KKyFDbmFtZSBpZC1Hb3N0UjM0MTAtMjAwMS1jYworY3J5cHRvY29tIDEgNSA0CQk6IGdvc3QyMDAxY2MJOiBHT1NUIDM0LjEwLTIwMDEgQ3J5cHRvY29tCisKK2NyeXB0b2NvbSAxIDMgMwkJOiBpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtOTQtY2MgOiBHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtOTQgQ3J5cHRvY29tCitjcnlwdG9jb20gMSAzIDQJCTogaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTIwMDEtY2MgOiBHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMSBDcnlwdG9jb20KKworY3J5cHRvY29tIDEgOCAxCQk6IGlkLUdvc3RSMzQxMC0yMDAxLVBhcmFtU2V0LWNjIDogR09TVCBSIDM0MTAtMjAwMSBQYXJhbWV0ZXIgU2V0IENyeXB0b2NvbQorCisjIERlZmluaXRpb25zIGZvciBDYW1lbGxpYSBjaXBoZXIgLSBDQkMgTU9ERQorCisxIDIgMzkyIDIwMDAxMSA2MSAxIDEgMSAyIDogQ0FNRUxMSUEtMTI4LUNCQwkJOiBjYW1lbGxpYS0xMjgtY2JjCisxIDIgMzkyIDIwMDAxMSA2MSAxIDEgMSAzIDogQ0FNRUxMSUEtMTkyLUNCQwkJOiBjYW1lbGxpYS0xOTItY2JjCisxIDIgMzkyIDIwMDAxMSA2MSAxIDEgMSA0IDogQ0FNRUxMSUEtMjU2LUNCQwkJOiBjYW1lbGxpYS0yNTYtY2JjCisKKyMgRGVmaW5pdGlvbnMgZm9yIENhbWVsbGlhIGNpcGhlciAtIEVDQiwgQ0ZCLCBPRkIgTU9ERQorCishQWxpYXMgbnR0LWRzIDAgMyA0NDAxIDUKKyFBbGlhcyBjYW1lbGxpYSBudHQtZHMgMyAxIDkgCisKK2NhbWVsbGlhIDEJCTogQ0FNRUxMSUEtMTI4LUVDQgkJOiBjYW1lbGxpYS0xMjgtZWNiCishQ25hbWUgY2FtZWxsaWEtMTI4LW9mYjEyOAorY2FtZWxsaWEgMwkJOiBDQU1FTExJQS0xMjgtT0ZCCQk6IGNhbWVsbGlhLTEyOC1vZmIKKyFDbmFtZSBjYW1lbGxpYS0xMjgtY2ZiMTI4CitjYW1lbGxpYSA0CQk6IENBTUVMTElBLTEyOC1DRkIJCTogY2FtZWxsaWEtMTI4LWNmYgorCitjYW1lbGxpYSAyMQkJOiBDQU1FTExJQS0xOTItRUNCCQk6IGNhbWVsbGlhLTE5Mi1lY2IKKyFDbmFtZSBjYW1lbGxpYS0xOTItb2ZiMTI4CitjYW1lbGxpYSAyMwkJOiBDQU1FTExJQS0xOTItT0ZCCQk6IGNhbWVsbGlhLTE5Mi1vZmIKKyFDbmFtZSBjYW1lbGxpYS0xOTItY2ZiMTI4CitjYW1lbGxpYSAyNAkJOiBDQU1FTExJQS0xOTItQ0ZCCQk6IGNhbWVsbGlhLTE5Mi1jZmIKKworY2FtZWxsaWEgNDEJCTogQ0FNRUxMSUEtMjU2LUVDQgkJOiBjYW1lbGxpYS0yNTYtZWNiCishQ25hbWUgY2FtZWxsaWEtMjU2LW9mYjEyOAorY2FtZWxsaWEgNDMJCTogQ0FNRUxMSUEtMjU2LU9GQgkJOiBjYW1lbGxpYS0yNTYtb2ZiCishQ25hbWUgY2FtZWxsaWEtMjU2LWNmYjEyOAorY2FtZWxsaWEgNDQJCTogQ0FNRUxMSUEtMjU2LUNGQgkJOiBjYW1lbGxpYS0yNTYtY2ZiCisKKyMgVGhlcmUgYXJlIG5vIE9JRHMgZm9yIHRoZXNlIG1vZGVzLi4uCisKKwkJCTogQ0FNRUxMSUEtMTI4LUNGQjEJCTogY2FtZWxsaWEtMTI4LWNmYjEKKwkJCTogQ0FNRUxMSUEtMTkyLUNGQjEJCTogY2FtZWxsaWEtMTkyLWNmYjEKKwkJCTogQ0FNRUxMSUEtMjU2LUNGQjEJCTogY2FtZWxsaWEtMjU2LWNmYjEKKwkJCTogQ0FNRUxMSUEtMTI4LUNGQjgJCTogY2FtZWxsaWEtMTI4LWNmYjgKKwkJCTogQ0FNRUxMSUEtMTkyLUNGQjgJCTogY2FtZWxsaWEtMTkyLWNmYjgKKwkJCTogQ0FNRUxMSUEtMjU2LUNGQjgJCTogY2FtZWxsaWEtMjU2LWNmYjgKKworIyBEZWZpbml0aW9ucyBmb3IgU0VFRCBjaXBoZXIgLSBFQ0IsIENCQywgT0ZCIG1vZGUKKworbWVtYmVyLWJvZHkgNDEwIDIwMDAwNCAgOiBLSVNBICAgICAgICAgIDoga2lzYQora2lzYSAxIDMgICAgICAgICAgICAgICAgOiBTRUVELUVDQiAgICAgIDogc2VlZC1lY2IKK2tpc2EgMSA0ICAgICAgICAgICAgICAgIDogU0VFRC1DQkMgICAgICA6IHNlZWQtY2JjCishQ25hbWUgc2VlZC1jZmIxMjgKK2tpc2EgMSA1ICAgICAgICAgICAgICAgIDogU0VFRC1DRkIgICAgICA6IHNlZWQtY2ZiCishQ25hbWUgc2VlZC1vZmIxMjgKK2tpc2EgMSA2ICAgICAgICAgICAgICAgIDogU0VFRC1PRkIgICAgICA6IHNlZWQtb2ZiCisKKyMgVGhlcmUgaXMgbm8gT0lEIHRoYXQganVzdCBkZW5vdGVzICJITUFDIiBvZGRseSBlbm91Z2guLi4KKworCQkJOiBITUFDCQkJCTogaG1hYwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29iamVjdHMvb2JqeHJlZi5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ianhyZWYucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxZDNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vYmplY3RzL29ianhyZWYucGwKQEAgLTAsMCArMSwxMDcgQEAKKyMhL3Vzci9sb2NhbC9iaW4vcGVybAorCit1c2Ugc3RyaWN0OworCitteSAleHJlZl90Ymw7CitteSAlb2lkX3RibDsKKworbXkgKCRtYWNfZmlsZSwgJHhyZWZfZmlsZSkgPSBAQVJHVjsKKworb3BlbihJTiwgJG1hY19maWxlKSB8fCBkaWUgIkNhbid0IG9wZW4gJG1hY19maWxlIjsKKworIyBSZWFkIGluIE9JRCBuaWQgdmFsdWVzIGZvciBhIGxvb2t1cCB0YWJsZS4KKword2hpbGUgKDxJTj4pCisJeworCWNob21wOworCW15ICgkbmFtZSwgJG51bSkgPSAvXihcUyspXHMrKFxTKykkLzsKKwkkb2lkX3RibHskbmFtZX0gPSAkbnVtOworCX0KK2Nsb3NlIElOOworCitvcGVuKElOLCAkeHJlZl9maWxlKSB8fCBkaWUgIkNhbid0IG9wZW4gJHhyZWZfZmlsZSI7CisKK215ICRsbiA9IDE7CisKK3doaWxlICg8SU4+KQorCXsKKwljaG9tcDsKKwlzLyMuKiQvLzsKKwluZXh0IGlmICgvXlxTKiQvKTsKKwlteSAoJHhyLCAkcDEsICRwMikgPSAvXihcUyspXHMrKFxTKylccysoXFMrKS87CisJY2hlY2tfb2lkKCR4cik7CisJY2hlY2tfb2lkKCRwMSk7CisJY2hlY2tfb2lkKCRwMik7CisJJHhyZWZfdGJseyR4cn0gPSBbJHAxLCAkcDIsICRsbl07CisJfQorCitteSBAeHJrZXlzID0ga2V5cyAleHJlZl90Ymw7CisKK215IEBzcnQxID0gc29ydCB7ICRvaWRfdGJseyRhfSA8PT4gJG9pZF90Ymx7JGJ9fSBAeHJrZXlzOworCitmb3IobXkgJGkgPSAwOyAkaSA8PSAkI3NydDE7ICRpKyspCisJeworCSR4cmVmX3RibHskc3J0MVskaV19WzJdID0gJGk7CisJfQorCitteSBAc3J0MiA9IHNvcnQKKwl7CisJbXkkYXAxID0gJG9pZF90Ymx7JHhyZWZfdGJseyRhfVswXX07CisJbXkkYnAxID0gJG9pZF90Ymx7JHhyZWZfdGJseyRifVswXX07CisJcmV0dXJuICRhcDEgLSAkYnAxIGlmICgkYXAxICE9ICRicDEpOworCW15JGFwMiA9ICRvaWRfdGJseyR4cmVmX3RibHskYX1bMV19OworCW15JGJwMiA9ICRvaWRfdGJseyR4cmVmX3RibHskYn1bMV19OworCisJcmV0dXJuICRhcDIgLSAkYnAyOworCX0gQHhya2V5czsKKworbXkgJHBuYW1lID0gJDA7CisKKyRwbmFtZSA9fiBzfF4uW14vXS98fDsKKworcHJpbnQgPDxFT0Y7CisvKiBBVVRPR0VORVJBVEVEIEJZICRwbmFtZSwgRE8gTk9UIEVESVQgKi8KKwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJaW50IHNpZ25faWQ7CisJaW50IGhhc2hfaWQ7CisJaW50IHBrZXlfaWQ7CisJfSBuaWRfdHJpcGxlOworCitzdGF0aWMgY29uc3QgbmlkX3RyaXBsZSBzaWdvaWRfc3J0W10gPQorCXsKK0VPRgorCitmb3JlYWNoIChAc3J0MSkKKwl7CisJbXkgJHhyID0gJF87CisJbXkgKCRwMSwgJHAyKSA9IEB7JHhyZWZfdGJseyRffX07CisJcHJpbnQgIlx0e05JRF8keHIsIE5JRF8kcDEsIE5JRF8kcDJ9LFxuIjsKKwl9CisKK3ByaW50ICJcdH07IjsKK3ByaW50IDw8RU9GOworCisKK3N0YXRpYyBjb25zdCBuaWRfdHJpcGxlICogY29uc3Qgc2lnb2lkX3NydF94cmVmW10gPQorCXsKK0VPRgorCitmb3JlYWNoIChAc3J0MikKKwl7CisJbXkgJHggPSAkeHJlZl90Ymx7JF99WzJdOworCXByaW50ICJcdFwmc2lnb2lkX3NydFxbJHhcXSxcbiI7CisJfQorCitwcmludCAiXHR9O1xuXG4iOworCitzdWIgY2hlY2tfb2lkCisJeworCW15ICgkY2hrKSA9IEBfOworCWlmICghZXhpc3RzICRvaWRfdGJseyRjaGt9KQorCQl7CisJCWRpZSAiTm90IEZvdW5kIFwiJGNoa1wiXG4iOworCQl9CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlNDU3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vY3NwL29jc3AuaApAQCAtMCwwICsxLDYyMyBAQAorLyogb2NzcC5oICovCisvKiBXcml0dGVuIGJ5IFRvbSBUaXRjaGVuZXIgPFRvbV9UaXRjaGVuZXJAZ3Jvb3ZlLm5ldD4gZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LiAqLworCisvKiBIaXN0b3J5OgorICAgVGhpcyBmaWxlIHdhcyB0cmFuc2ZlcmVkIHRvIFJpY2hhcmQgTGV2aXR0ZSBmcm9tIENlcnRDbyBieSBLYXRoeQorICAgV2VpbmhvbGQgaW4gbWlkLXNwcmluZyAyMDAwIHRvIGJlIGluY2x1ZGVkIGluIE9wZW5TU0wgb3IgcmVsZWFzZWQKKyAgIGFzIGEgcGF0Y2gga2l0LiAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfT0NTUF9ICisjZGVmaW5lIEhFQURFUl9PQ1NQX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2FmZXN0YWNrLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFZhcmlvdXMgZmxhZ3MgYW5kIHZhbHVlcyAqLworCisjZGVmaW5lIE9DU1BfREVGQVVMVF9OT05DRV9MRU5HVEgJMTYKKworI2RlZmluZSBPQ1NQX05PQ0VSVFMJCQkweDEKKyNkZWZpbmUgT0NTUF9OT0lOVEVSTgkJCTB4MgorI2RlZmluZSBPQ1NQX05PU0lHUwkJCTB4NAorI2RlZmluZSBPQ1NQX05PQ0hBSU4JCQkweDgKKyNkZWZpbmUgT0NTUF9OT1ZFUklGWQkJCTB4MTAKKyNkZWZpbmUgT0NTUF9OT0VYUExJQ0lUCQkJMHgyMAorI2RlZmluZSBPQ1NQX05PQ0FTSUdOCQkJMHg0MAorI2RlZmluZSBPQ1NQX05PREVMRUdBVEVECQkweDgwCisjZGVmaW5lIE9DU1BfTk9DSEVDS1MJCQkweDEwMAorI2RlZmluZSBPQ1NQX1RSVVNUT1RIRVIJCQkweDIwMAorI2RlZmluZSBPQ1NQX1JFU1BJRF9LRVkJCQkweDQwMAorI2RlZmluZSBPQ1NQX05PVElNRQkJCTB4ODAwCisKKy8qICAgQ2VydElEIDo6PSBTRVFVRU5DRSB7CisgKiAgICAgICBoYXNoQWxnb3JpdGhtICAgICAgICAgICAgQWxnb3JpdGhtSWRlbnRpZmllciwKKyAqICAgICAgIGlzc3Vlck5hbWVIYXNoICAgICBPQ1RFVCBTVFJJTkcsIC0tIEhhc2ggb2YgSXNzdWVyJ3MgRE4KKyAqICAgICAgIGlzc3VlcktleUhhc2ggICAgICBPQ1RFVCBTVFJJTkcsIC0tIEhhc2ggb2YgSXNzdWVycyBwdWJsaWMga2V5IChleGNsdWRpbmcgdGhlIHRhZyAmIGxlbmd0aCBmaWVsZHMpCisgKiAgICAgICBzZXJpYWxOdW1iZXIgICAgICAgQ2VydGlmaWNhdGVTZXJpYWxOdW1iZXIgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX2NlcnRfaWRfc3QKKwl7CisJWDUwOV9BTEdPUiAqaGFzaEFsZ29yaXRobTsKKwlBU04xX09DVEVUX1NUUklORyAqaXNzdWVyTmFtZUhhc2g7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmlzc3VlcktleUhhc2g7CisJQVNOMV9JTlRFR0VSICpzZXJpYWxOdW1iZXI7CisJfSBPQ1NQX0NFUlRJRDsKKworREVDTEFSRV9TVEFDS19PRihPQ1NQX0NFUlRJRCkKKworLyogICBSZXF1ZXN0IDo6PSAgICAgU0VRVUVOQ0UgeworICogICAgICAgcmVxQ2VydCAgICAgICAgICAgICAgICAgICAgQ2VydElELAorICogICAgICAgc2luZ2xlUmVxdWVzdEV4dGVuc2lvbnMgICAgWzBdIEVYUExJQ0lUIEV4dGVuc2lvbnMgT1BUSU9OQUwgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX29uZV9yZXF1ZXN0X3N0CisJeworCU9DU1BfQ0VSVElEICpyZXFDZXJ0OworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqc2luZ2xlUmVxdWVzdEV4dGVuc2lvbnM7CisJfSBPQ1NQX09ORVJFUTsKKworREVDTEFSRV9TVEFDS19PRihPQ1NQX09ORVJFUSkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoT0NTUF9PTkVSRVEpCisKKworLyogICBUQlNSZXF1ZXN0ICAgICAgOjo9ICAgICBTRVFVRU5DRSB7CisgKiAgICAgICB2ZXJzaW9uICAgICAgICAgICAgIFswXSBFWFBMSUNJVCBWZXJzaW9uIERFRkFVTFQgdjEsCisgKiAgICAgICByZXF1ZXN0b3JOYW1lICAgICAgIFsxXSBFWFBMSUNJVCBHZW5lcmFsTmFtZSBPUFRJT05BTCwKKyAqICAgICAgIHJlcXVlc3RMaXN0ICAgICAgICAgICAgIFNFUVVFTkNFIE9GIFJlcXVlc3QsCisgKiAgICAgICByZXF1ZXN0RXh0ZW5zaW9ucyAgIFsyXSBFWFBMSUNJVCBFeHRlbnNpb25zIE9QVElPTkFMIH0KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9yZXFfaW5mb19zdAorCXsKKwlBU04xX0lOVEVHRVIgKnZlcnNpb247CisJR0VORVJBTF9OQU1FICpyZXF1ZXN0b3JOYW1lOworCVNUQUNLX09GKE9DU1BfT05FUkVRKSAqcmVxdWVzdExpc3Q7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpyZXF1ZXN0RXh0ZW5zaW9uczsKKwl9IE9DU1BfUkVRSU5GTzsKKworLyogICBTaWduYXR1cmUgICAgICAgOjo9ICAgICBTRVFVRU5DRSB7CisgKiAgICAgICBzaWduYXR1cmVBbGdvcml0aG0gICBBbGdvcml0aG1JZGVudGlmaWVyLAorICogICAgICAgc2lnbmF0dXJlICAgICAgICAgICAgQklUIFNUUklORywKKyAqICAgICAgIGNlcnRzICAgICAgICAgICAgICAgIFswXSBFWFBMSUNJVCBTRVFVRU5DRSBPRiBDZXJ0aWZpY2F0ZSBPUFRJT05BTCB9CisgKi8KK3R5cGVkZWYgc3RydWN0IG9jc3Bfc2lnbmF0dXJlX3N0CisJeworCVg1MDlfQUxHT1IgKnNpZ25hdHVyZUFsZ29yaXRobTsKKwlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZTsKKwlTVEFDS19PRihYNTA5KSAqY2VydHM7CisJfSBPQ1NQX1NJR05BVFVSRTsKKworLyogICBPQ1NQUmVxdWVzdCAgICAgOjo9ICAgICBTRVFVRU5DRSB7CisgKiAgICAgICB0YnNSZXF1ZXN0ICAgICAgICAgICAgICAgICAgVEJTUmVxdWVzdCwKKyAqICAgICAgIG9wdGlvbmFsU2lnbmF0dXJlICAgWzBdICAgICBFWFBMSUNJVCBTaWduYXR1cmUgT1BUSU9OQUwgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX3JlcXVlc3Rfc3QKKwl7CisJT0NTUF9SRVFJTkZPICp0YnNSZXF1ZXN0OworCU9DU1BfU0lHTkFUVVJFICpvcHRpb25hbFNpZ25hdHVyZTsgLyogT1BUSU9OQUwgKi8KKwl9IE9DU1BfUkVRVUVTVDsKKworLyogICBPQ1NQUmVzcG9uc2VTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworICogICAgICAgc3VjY2Vzc2Z1bCAgICAgICAgICAgICgwKSwgICAgICAtLVJlc3BvbnNlIGhhcyB2YWxpZCBjb25maXJtYXRpb25zCisgKiAgICAgICBtYWxmb3JtZWRSZXF1ZXN0ICAgICAgKDEpLCAgICAgIC0tSWxsZWdhbCBjb25maXJtYXRpb24gcmVxdWVzdAorICogICAgICAgaW50ZXJuYWxFcnJvciAgICAgICAgICgyKSwgICAgICAtLUludGVybmFsIGVycm9yIGluIGlzc3VlcgorICogICAgICAgdHJ5TGF0ZXIgICAgICAgICAgICAgICgzKSwgICAgICAtLVRyeSBhZ2FpbiBsYXRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSg0KSBpcyBub3QgdXNlZAorICogICAgICAgc2lnUmVxdWlyZWQgICAgICAgICAgICg1KSwgICAgICAtLU11c3Qgc2lnbiB0aGUgcmVxdWVzdAorICogICAgICAgdW5hdXRob3JpemVkICAgICAgICAgICg2KSAgICAgICAtLVJlcXVlc3QgdW5hdXRob3JpemVkCisgKiAgIH0KKyAqLworI2RlZmluZSBPQ1NQX1JFU1BPTlNFX1NUQVRVU19TVUNDRVNTRlVMICAgICAgICAgIDAKKyNkZWZpbmUgT0NTUF9SRVNQT05TRV9TVEFUVVNfTUFMRk9STUVEUkVRVUVTVCAgICAgMQorI2RlZmluZSBPQ1NQX1JFU1BPTlNFX1NUQVRVU19JTlRFUk5BTEVSUk9SICAgICAgICAyCisjZGVmaW5lIE9DU1BfUkVTUE9OU0VfU1RBVFVTX1RSWUxBVEVSICAgICAgICAgICAgIDMKKyNkZWZpbmUgT0NTUF9SRVNQT05TRV9TVEFUVVNfU0lHUkVRVUlSRUQgICAgICAgICAgNQorI2RlZmluZSBPQ1NQX1JFU1BPTlNFX1NUQVRVU19VTkFVVEhPUklaRUQgICAgICAgICA2CisKKy8qICAgUmVzcG9uc2VCeXRlcyA6Oj0gICAgICAgU0VRVUVOQ0UgeworICogICAgICAgcmVzcG9uc2VUeXBlICAgT0JKRUNUIElERU5USUZJRVIsCisgKiAgICAgICByZXNwb25zZSAgICAgICBPQ1RFVCBTVFJJTkcgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX3Jlc3BfYnl0ZXNfc3QKKwl7CisJQVNOMV9PQkpFQ1QgKnJlc3BvbnNlVHlwZTsKKwlBU04xX09DVEVUX1NUUklORyAqcmVzcG9uc2U7CisJfSBPQ1NQX1JFU1BCWVRFUzsKKworLyogICBPQ1NQUmVzcG9uc2UgOjo9IFNFUVVFTkNFIHsKKyAqICAgICAgcmVzcG9uc2VTdGF0dXMgICAgICAgICBPQ1NQUmVzcG9uc2VTdGF0dXMsCisgKiAgICAgIHJlc3BvbnNlQnl0ZXMgICAgICAgICAgWzBdIEVYUExJQ0lUIFJlc3BvbnNlQnl0ZXMgT1BUSU9OQUwgfQorICovCitzdHJ1Y3Qgb2NzcF9yZXNwb25zZV9zdAorCXsKKwlBU04xX0VOVU1FUkFURUQgKnJlc3BvbnNlU3RhdHVzOworCU9DU1BfUkVTUEJZVEVTICAqcmVzcG9uc2VCeXRlczsKKwl9OworCisvKiAgIFJlc3BvbmRlcklEIDo6PSBDSE9JQ0UgeworICogICAgICBieU5hbWUgICBbMV0gTmFtZSwKKyAqICAgICAgYnlLZXkgICAgWzJdIEtleUhhc2ggfQorICovCisjZGVmaW5lIFZfT0NTUF9SRVNQSURfTkFNRSAwCisjZGVmaW5lIFZfT0NTUF9SRVNQSURfS0VZICAxCitzdHJ1Y3Qgb2NzcF9yZXNwb25kZXJfaWRfc3QKKwl7CisJaW50IHR5cGU7CisJdW5pb24gICB7CisJCVg1MDlfTkFNRSogYnlOYW1lOworICAgICAgICAJQVNOMV9PQ1RFVF9TVFJJTkcgKmJ5S2V5OworCQl9IHZhbHVlOworCX07CisKK0RFQ0xBUkVfU1RBQ0tfT0YoT0NTUF9SRVNQSUQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfUkVTUElEKQorCisvKiAgIEtleUhhc2ggOjo9IE9DVEVUIFNUUklORyAtLVNIQS0xIGhhc2ggb2YgcmVzcG9uZGVyJ3MgcHVibGljIGtleQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0oZXhjbHVkaW5nIHRoZSB0YWcgYW5kIGxlbmd0aCBmaWVsZHMpCisgKi8KKworLyogICBSZXZva2VkSW5mbyA6Oj0gU0VRVUVOQ0UgeworICogICAgICAgcmV2b2NhdGlvblRpbWUgICAgICAgICAgICAgIEdlbmVyYWxpemVkVGltZSwKKyAqICAgICAgIHJldm9jYXRpb25SZWFzb24gICAgWzBdICAgICBFWFBMSUNJVCBDUkxSZWFzb24gT1BUSU9OQUwgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX3Jldm9rZWRfaW5mb19zdAorCXsKKwlBU04xX0dFTkVSQUxJWkVEVElNRSAqcmV2b2NhdGlvblRpbWU7CisJQVNOMV9FTlVNRVJBVEVEICpyZXZvY2F0aW9uUmVhc29uOworCX0gT0NTUF9SRVZPS0VESU5GTzsKKworLyogICBDZXJ0U3RhdHVzIDo6PSBDSE9JQ0UgeworICogICAgICAgZ29vZCAgICAgICAgICAgICAgICBbMF0gICAgIElNUExJQ0lUIE5VTEwsCisgKiAgICAgICByZXZva2VkICAgICAgICAgICAgIFsxXSAgICAgSU1QTElDSVQgUmV2b2tlZEluZm8sCisgKiAgICAgICB1bmtub3duICAgICAgICAgICAgIFsyXSAgICAgSU1QTElDSVQgVW5rbm93bkluZm8gfQorICovCisjZGVmaW5lIFZfT0NTUF9DRVJUU1RBVFVTX0dPT0QgICAgMAorI2RlZmluZSBWX09DU1BfQ0VSVFNUQVRVU19SRVZPS0VEIDEKKyNkZWZpbmUgVl9PQ1NQX0NFUlRTVEFUVVNfVU5LTk9XTiAyCit0eXBlZGVmIHN0cnVjdCBvY3NwX2NlcnRfc3RhdHVzX3N0CisJeworCWludCB0eXBlOworCXVuaW9uCXsKKwkJQVNOMV9OVUxMICpnb29kOworCQlPQ1NQX1JFVk9LRURJTkZPICpyZXZva2VkOworCQlBU04xX05VTEwgKnVua25vd247CisJCX0gdmFsdWU7CisJfSBPQ1NQX0NFUlRTVEFUVVM7CisKKy8qICAgU2luZ2xlUmVzcG9uc2UgOjo9IFNFUVVFTkNFIHsKKyAqICAgICAgY2VydElEICAgICAgICAgICAgICAgICAgICAgICBDZXJ0SUQsCisgKiAgICAgIGNlcnRTdGF0dXMgICAgICAgICAgICAgICAgICAgQ2VydFN0YXR1cywKKyAqICAgICAgdGhpc1VwZGF0ZSAgICAgICAgICAgICAgICAgICBHZW5lcmFsaXplZFRpbWUsCisgKiAgICAgIG5leHRVcGRhdGUgICAgICAgICAgIFswXSAgICAgRVhQTElDSVQgR2VuZXJhbGl6ZWRUaW1lIE9QVElPTkFMLAorICogICAgICBzaW5nbGVFeHRlbnNpb25zICAgICBbMV0gICAgIEVYUExJQ0lUIEV4dGVuc2lvbnMgT1BUSU9OQUwgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX3NpbmdsZV9yZXNwb25zZV9zdAorCXsKKwlPQ1NQX0NFUlRJRCAqY2VydElkOworCU9DU1BfQ0VSVFNUQVRVUyAqY2VydFN0YXR1czsKKwlBU04xX0dFTkVSQUxJWkVEVElNRSAqdGhpc1VwZGF0ZTsKKwlBU04xX0dFTkVSQUxJWkVEVElNRSAqbmV4dFVwZGF0ZTsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKnNpbmdsZUV4dGVuc2lvbnM7CisJfSBPQ1NQX1NJTkdMRVJFU1A7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoT0NTUF9TSU5HTEVSRVNQKQorREVDTEFSRV9BU04xX1NFVF9PRihPQ1NQX1NJTkdMRVJFU1ApCisKKy8qICAgUmVzcG9uc2VEYXRhIDo6PSBTRVFVRU5DRSB7CisgKiAgICAgIHZlcnNpb24gICAgICAgICAgICAgIFswXSBFWFBMSUNJVCBWZXJzaW9uIERFRkFVTFQgdjEsCisgKiAgICAgIHJlc3BvbmRlcklEICAgICAgICAgICAgICBSZXNwb25kZXJJRCwKKyAqICAgICAgcHJvZHVjZWRBdCAgICAgICAgICAgICAgIEdlbmVyYWxpemVkVGltZSwKKyAqICAgICAgcmVzcG9uc2VzICAgICAgICAgICAgICAgIFNFUVVFTkNFIE9GIFNpbmdsZVJlc3BvbnNlLAorICogICAgICByZXNwb25zZUV4dGVuc2lvbnMgICBbMV0gRVhQTElDSVQgRXh0ZW5zaW9ucyBPUFRJT05BTCB9CisgKi8KK3R5cGVkZWYgc3RydWN0IG9jc3BfcmVzcG9uc2VfZGF0YV9zdAorCXsKKwlBU04xX0lOVEVHRVIgKnZlcnNpb247CisJT0NTUF9SRVNQSUQgICpyZXNwb25kZXJJZDsKKwlBU04xX0dFTkVSQUxJWkVEVElNRSAqcHJvZHVjZWRBdDsKKwlTVEFDS19PRihPQ1NQX1NJTkdMRVJFU1ApICpyZXNwb25zZXM7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpyZXNwb25zZUV4dGVuc2lvbnM7CisJfSBPQ1NQX1JFU1BEQVRBOworCisvKiAgIEJhc2ljT0NTUFJlc3BvbnNlICAgICAgIDo6PSBTRVFVRU5DRSB7CisgKiAgICAgIHRic1Jlc3BvbnNlRGF0YSAgICAgIFJlc3BvbnNlRGF0YSwKKyAqICAgICAgc2lnbmF0dXJlQWxnb3JpdGhtICAgQWxnb3JpdGhtSWRlbnRpZmllciwKKyAqICAgICAgc2lnbmF0dXJlICAgICAgICAgICAgQklUIFNUUklORywKKyAqICAgICAgY2VydHMgICAgICAgICAgICAgICAgWzBdIEVYUExJQ0lUIFNFUVVFTkNFIE9GIENlcnRpZmljYXRlIE9QVElPTkFMIH0KKyAqLworICAvKiBOb3RlIDE6CisgICAgIFRoZSB2YWx1ZSBmb3IgInNpZ25hdHVyZSIgaXMgc3BlY2lmaWVkIGluIHRoZSBPQ1NQIHJmYzI1NjAgYXMgZm9sbG93czoKKyAgICAgIlRoZSB2YWx1ZSBmb3IgdGhlIHNpZ25hdHVyZSBTSEFMTCBiZSBjb21wdXRlZCBvbiB0aGUgaGFzaCBvZiB0aGUgREVSCisgICAgIGVuY29kaW5nIFJlc3BvbnNlRGF0YS4iICBUaGlzIG1lYW5zIHRoYXQgeW91IG11c3QgaGFzaCB0aGUgREVSLWVuY29kZWQKKyAgICAgdGJzUmVzcG9uc2VEYXRhLCBhbmQgdGhlbiBydW4gaXQgdGhyb3VnaCBhIGNyeXB0by1zaWduaW5nIGZ1bmN0aW9uLCB3aGljaAorICAgICB3aWxsIChhdCBsZWFzdCB3L1JTQSkgZG8gYSBoYXNoLSduJy1wcml2YXRlLWVuY3J5cHQgb3BlcmF0aW9uLiAgVGhpcyBzZWVtcworICAgICBhIGJpdCBvZGQsIGJ1dCB0aGF0J3MgdGhlIHNwZWMuICBBbHNvIG5vdGUgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGRvIG5vdAorICAgICBsZWF2ZSBhbnl3aGVyZSB0byBpbmRlcGVuZGVudGx5IHNwZWNpZnkgdGhlIGFsZ29yaXRobSB1c2VkIGZvciB0aGUgaW5pdGlhbAorICAgICBoYXNoLiBTbywgd2UgbG9vayBhdCB0aGUgc2lnbmF0dXJlLXNwZWNpZmljYXRpb24gYWxnb3JpdGhtLCBhbmQgdHJ5IHRvIGRvCisgICAgIHNvbWV0aGluZyBpbnRlbGxpZ2VudC4JLS0gS2F0aHkgV2VpbmhvbGQsIENlcnRDbyAqLworICAvKiBOb3RlIDI6CisgICAgIEl0IHNlZW1zIHRoYXQgdGhlIG1lbnRpb25lZCBwYXNzYWdlIGZyb20gUkZDIDI1NjAgKHNlY3Rpb24gNC4yLjEpIGlzIG9wZW4KKyAgICAgZm9yIGludGVycHJldGF0aW9uLiAgSSd2ZSBkb25lIHRlc3RzIGFnYWluc3QgYW5vdGhlciByZXNwb25kZXIsIGFuZCBmb3VuZAorICAgICB0aGF0IGl0IGRvZXNuJ3QgZG8gdGhlIGRvdWJsZSBoYXNoaW5nIHRoYXQgdGhlIFJGQyBzZWVtcyB0byBzYXkgb25lCisgICAgIHNob3VsZC4gIFRoZXJlZm9yZSwgYWxsIHJlbGV2YW50IGZ1bmN0aW9ucyB0YWtlIGEgZmxhZyBzYXlpbmcgd2hpY2gKKyAgICAgdmFyaWFudCBzaG91bGQgYmUgdXNlZC4JLS0gUmljaGFyZCBMZXZpdHRlLCBPcGVuU1NMIHRlYW0gYW5kIENlbG9Db20gKi8KK3R5cGVkZWYgc3RydWN0IG9jc3BfYmFzaWNfcmVzcG9uc2Vfc3QKKwl7CisJT0NTUF9SRVNQREFUQSAqdGJzUmVzcG9uc2VEYXRhOworCVg1MDlfQUxHT1IgKnNpZ25hdHVyZUFsZ29yaXRobTsKKwlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZTsKKwlTVEFDS19PRihYNTA5KSAqY2VydHM7CisJfSBPQ1NQX0JBU0lDUkVTUDsKKworLyoKKyAqICAgQ1JMUmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKyAqICAgICAgICB1bnNwZWNpZmllZCAgICAgICAgICAgICAoMCksCisgKiAgICAgICAga2V5Q29tcHJvbWlzZSAgICAgICAgICAgKDEpLAorICogICAgICAgIGNBQ29tcHJvbWlzZSAgICAgICAgICAgICgyKSwKKyAqICAgICAgICBhZmZpbGlhdGlvbkNoYW5nZWQgICAgICAoMyksCisgKiAgICAgICAgc3VwZXJzZWRlZCAgICAgICAgICAgICAgKDQpLAorICogICAgICAgIGNlc3NhdGlvbk9mT3BlcmF0aW9uICAgICg1KSwKKyAqICAgICAgICBjZXJ0aWZpY2F0ZUhvbGQgICAgICAgICAoNiksCisgKiAgICAgICAgcmVtb3ZlRnJvbUNSTCAgICAgICAgICAgKDgpIH0KKyAqLworI2RlZmluZSBPQ1NQX1JFVk9LRURfU1RBVFVTX05PU1RBVFVTICAgICAgICAgICAgICAgLTEKKyNkZWZpbmUgT0NTUF9SRVZPS0VEX1NUQVRVU19VTlNQRUNJRklFRCAgICAgICAgICAgICAwCisjZGVmaW5lIE9DU1BfUkVWT0tFRF9TVEFUVVNfS0VZQ09NUFJPTUlTRSAgICAgICAgICAgMQorI2RlZmluZSBPQ1NQX1JFVk9LRURfU1RBVFVTX0NBQ09NUFJPTUlTRSAgICAgICAgICAgIDIKKyNkZWZpbmUgT0NTUF9SRVZPS0VEX1NUQVRVU19BRkZJTElBVElPTkNIQU5HRUQgICAgICAzCisjZGVmaW5lIE9DU1BfUkVWT0tFRF9TVEFUVVNfU1VQRVJTRURFRCAgICAgICAgICAgICAgNAorI2RlZmluZSBPQ1NQX1JFVk9LRURfU1RBVFVTX0NFU1NBVElPTk9GT1BFUkFUSU9OICAgIDUKKyNkZWZpbmUgT0NTUF9SRVZPS0VEX1NUQVRVU19DRVJUSUZJQ0FURUhPTEQgICAgICAgICA2CisjZGVmaW5lIE9DU1BfUkVWT0tFRF9TVEFUVVNfUkVNT1ZFRlJPTUNSTCAgICAgICAgICAgOAorCisvKiBDcmxJRCA6Oj0gU0VRVUVOQ0UgeworICogICAgIGNybFVybCAgICAgICAgICAgICAgIFswXSAgICAgRVhQTElDSVQgSUE1U3RyaW5nIE9QVElPTkFMLAorICogICAgIGNybE51bSAgICAgICAgICAgICAgIFsxXSAgICAgRVhQTElDSVQgSU5URUdFUiBPUFRJT05BTCwKKyAqICAgICBjcmxUaW1lICAgICAgICAgICAgICBbMl0gICAgIEVYUExJQ0lUIEdlbmVyYWxpemVkVGltZSBPUFRJT05BTCB9CisgKi8KK3R5cGVkZWYgc3RydWN0IG9jc3BfY3JsX2lkX3N0CisgICAgICAgIHsKKwlBU04xX0lBNVNUUklORyAqY3JsVXJsOworCUFTTjFfSU5URUdFUiAqY3JsTnVtOworCUFTTjFfR0VORVJBTElaRURUSU1FICpjcmxUaW1lOworICAgICAgICB9IE9DU1BfQ1JMSUQ7CisKKy8qIFNlcnZpY2VMb2NhdG9yIDo6PSBTRVFVRU5DRSB7CisgKiAgICAgIGlzc3VlciAgICBOYW1lLAorICogICAgICBsb2NhdG9yICAgQXV0aG9yaXR5SW5mb0FjY2Vzc1N5bnRheCBPUFRJT05BTCB9CisgKi8KK3R5cGVkZWYgc3RydWN0IG9jc3Bfc2VydmljZV9sb2NhdG9yX3N0CisgICAgICAgIHsKKwlYNTA5X05BTUUqIGlzc3VlcjsKKwlTVEFDS19PRihBQ0NFU1NfREVTQ1JJUFRJT04pICpsb2NhdG9yOworICAgICAgICB9IE9DU1BfU0VSVklDRUxPQzsKKyAKKyNkZWZpbmUgUEVNX1NUUklOR19PQ1NQX1JFUVVFU1QJIk9DU1AgUkVRVUVTVCIKKyNkZWZpbmUgUEVNX1NUUklOR19PQ1NQX1JFU1BPTlNFICJPQ1NQIFJFU1BPTlNFIgorCisjZGVmaW5lIGQyaV9PQ1NQX1JFUVVFU1RfYmlvKGJwLHApIEFTTjFfZDJpX2Jpb19vZihPQ1NQX1JFUVVFU1QsT0NTUF9SRVFVRVNUX25ldyxkMmlfT0NTUF9SRVFVRVNULGJwLHApCisKKyNkZWZpbmUgZDJpX09DU1BfUkVTUE9OU0VfYmlvKGJwLHApIEFTTjFfZDJpX2Jpb19vZihPQ1NQX1JFU1BPTlNFLE9DU1BfUkVTUE9OU0VfbmV3LGQyaV9PQ1NQX1JFU1BPTlNFLGJwLHApCisKKyNkZWZpbmUJUEVNX3JlYWRfYmlvX09DU1BfUkVRVUVTVChicCx4LGNiKSAoT0NTUF9SRVFVRVNUICopUEVNX0FTTjFfcmVhZF9iaW8oIFwKKyAgICAgKGNoYXIgKigqKSgpKWQyaV9PQ1NQX1JFUVVFU1QsUEVNX1NUUklOR19PQ1NQX1JFUVVFU1QsYnAsKGNoYXIgKiopeCxjYixOVUxMKQorCisjZGVmaW5lCVBFTV9yZWFkX2Jpb19PQ1NQX1JFU1BPTlNFKGJwLHgsY2IpKE9DU1BfUkVTUE9OU0UgKilQRU1fQVNOMV9yZWFkX2JpbyhcCisgICAgIChjaGFyICooKikoKSlkMmlfT0NTUF9SRVNQT05TRSxQRU1fU1RSSU5HX09DU1BfUkVTUE9OU0UsYnAsKGNoYXIgKiopeCxjYixOVUxMKQorCisjZGVmaW5lIFBFTV93cml0ZV9iaW9fT0NTUF9SRVFVRVNUKGJwLG8pIFwKKyAgICBQRU1fQVNOMV93cml0ZV9iaW8oKGludCAoKikoKSlpMmRfT0NTUF9SRVFVRVNULFBFTV9TVFJJTkdfT0NTUF9SRVFVRVNULFwKKwkJCWJwLChjaGFyICopbywgTlVMTCxOVUxMLDAsTlVMTCxOVUxMKQorCisjZGVmaW5lIFBFTV93cml0ZV9iaW9fT0NTUF9SRVNQT05TRShicCxvKSBcCisgICAgUEVNX0FTTjFfd3JpdGVfYmlvKChpbnQgKCopKCkpaTJkX09DU1BfUkVTUE9OU0UsUEVNX1NUUklOR19PQ1NQX1JFU1BPTlNFLFwKKwkJCWJwLChjaGFyICopbywgTlVMTCxOVUxMLDAsTlVMTCxOVUxMKQorCisjZGVmaW5lIGkyZF9PQ1NQX1JFU1BPTlNFX2JpbyhicCxvKSBBU04xX2kyZF9iaW9fb2YoT0NTUF9SRVNQT05TRSxpMmRfT0NTUF9SRVNQT05TRSxicCxvKQorCisjZGVmaW5lIGkyZF9PQ1NQX1JFUVVFU1RfYmlvKGJwLG8pIEFTTjFfaTJkX2Jpb19vZihPQ1NQX1JFUVVFU1QsaTJkX09DU1BfUkVRVUVTVCxicCxvKQorCisjZGVmaW5lIE9DU1BfUkVRVUVTVF9zaWduKG8scGtleSxtZCkgXAorCUFTTjFfaXRlbV9zaWduKEFTTjFfSVRFTV9ycHRyKE9DU1BfUkVRSU5GTyksXAorCQlvLT5vcHRpb25hbFNpZ25hdHVyZS0+c2lnbmF0dXJlQWxnb3JpdGhtLE5VTEwsXAorCSAgICAgICAgby0+b3B0aW9uYWxTaWduYXR1cmUtPnNpZ25hdHVyZSxvLT50YnNSZXF1ZXN0LHBrZXksbWQpCisKKyNkZWZpbmUgT0NTUF9CQVNJQ1JFU1Bfc2lnbihvLHBrZXksbWQsZCkgXAorCUFTTjFfaXRlbV9zaWduKEFTTjFfSVRFTV9ycHRyKE9DU1BfUkVTUERBVEEpLG8tPnNpZ25hdHVyZUFsZ29yaXRobSxOVUxMLFwKKwkJby0+c2lnbmF0dXJlLG8tPnRic1Jlc3BvbnNlRGF0YSxwa2V5LG1kKQorCisjZGVmaW5lIE9DU1BfUkVRVUVTVF92ZXJpZnkoYSxyKSBBU04xX2l0ZW1fdmVyaWZ5KEFTTjFfSVRFTV9ycHRyKE9DU1BfUkVRSU5GTyksXAorICAgICAgICBhLT5vcHRpb25hbFNpZ25hdHVyZS0+c2lnbmF0dXJlQWxnb3JpdGhtLFwKKwlhLT5vcHRpb25hbFNpZ25hdHVyZS0+c2lnbmF0dXJlLGEtPnRic1JlcXVlc3QscikKKworI2RlZmluZSBPQ1NQX0JBU0lDUkVTUF92ZXJpZnkoYSxyLGQpIEFTTjFfaXRlbV92ZXJpZnkoQVNOMV9JVEVNX3JwdHIoT0NTUF9SRVNQREFUQSksXAorCWEtPnNpZ25hdHVyZUFsZ29yaXRobSxhLT5zaWduYXR1cmUsYS0+dGJzUmVzcG9uc2VEYXRhLHIpCisKKyNkZWZpbmUgQVNOMV9CSVRfU1RSSU5HX2RpZ2VzdChkYXRhLHR5cGUsbWQsbGVuKSBcCisJQVNOMV9pdGVtX2RpZ2VzdChBU04xX0lURU1fcnB0cihBU04xX0JJVF9TVFJJTkcpLHR5cGUsZGF0YSxtZCxsZW4pCisKKyNkZWZpbmUgT0NTUF9DRVJUU1RBVFVTX2R1cChjcylcCisgICAgICAgICAgICAgICAgKE9DU1BfQ0VSVFNUQVRVUyopQVNOMV9kdXAoKGludCgqKSgpKWkyZF9PQ1NQX0NFUlRTVEFUVVMsXAorCQkoY2hhciAqKCopKCkpZDJpX09DU1BfQ0VSVFNUQVRVUywoY2hhciAqKShjcykpCisKK09DU1BfQ0VSVElEICpPQ1NQX0NFUlRJRF9kdXAoT0NTUF9DRVJUSUQgKmlkKTsKKworT0NTUF9SRVNQT05TRSAqT0NTUF9zZW5kcmVxX2JpbyhCSU8gKmIsIGNoYXIgKnBhdGgsIE9DU1BfUkVRVUVTVCAqcmVxKTsKK09DU1BfUkVRX0NUWCAqT0NTUF9zZW5kcmVxX25ldyhCSU8gKmlvLCBjaGFyICpwYXRoLCBPQ1NQX1JFUVVFU1QgKnJlcSwKKwkJCQkJCQkJaW50IG1heGxpbmUpOworaW50IE9DU1Bfc2VuZHJlcV9uYmlvKE9DU1BfUkVTUE9OU0UgKipwcmVzcCwgT0NTUF9SRVFfQ1RYICpyY3R4KTsKK3ZvaWQgT0NTUF9SRVFfQ1RYX2ZyZWUoT0NTUF9SRVFfQ1RYICpyY3R4KTsKK2ludCBPQ1NQX1JFUV9DVFhfc2V0MV9yZXEoT0NTUF9SRVFfQ1RYICpyY3R4LCBPQ1NQX1JFUVVFU1QgKnJlcSk7CitpbnQgT0NTUF9SRVFfQ1RYX2FkZDFfaGVhZGVyKE9DU1BfUkVRX0NUWCAqcmN0eCwKKwkJY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpOworCitPQ1NQX0NFUlRJRCAqT0NTUF9jZXJ0X3RvX2lkKGNvbnN0IEVWUF9NRCAqZGdzdCwgWDUwOSAqc3ViamVjdCwgWDUwOSAqaXNzdWVyKTsKKworT0NTUF9DRVJUSUQgKk9DU1BfY2VydF9pZF9uZXcoY29uc3QgRVZQX01EICpkZ3N0LCAKKwkJCSAgICAgIFg1MDlfTkFNRSAqaXNzdWVyTmFtZSwgCisJCQkgICAgICBBU04xX0JJVF9TVFJJTkcqIGlzc3VlcktleSwgCisJCQkgICAgICBBU04xX0lOVEVHRVIgKnNlcmlhbE51bWJlcik7CisKK09DU1BfT05FUkVRICpPQ1NQX3JlcXVlc3RfYWRkMF9pZChPQ1NQX1JFUVVFU1QgKnJlcSwgT0NTUF9DRVJUSUQgKmNpZCk7CisKK2ludCBPQ1NQX3JlcXVlc3RfYWRkMV9ub25jZShPQ1NQX1JFUVVFU1QgKnJlcSwgdW5zaWduZWQgY2hhciAqdmFsLCBpbnQgbGVuKTsKK2ludCBPQ1NQX2Jhc2ljX2FkZDFfbm9uY2UoT0NTUF9CQVNJQ1JFU1AgKnJlc3AsIHVuc2lnbmVkIGNoYXIgKnZhbCwgaW50IGxlbik7CitpbnQgT0NTUF9jaGVja19ub25jZShPQ1NQX1JFUVVFU1QgKnJlcSwgT0NTUF9CQVNJQ1JFU1AgKmJzKTsKK2ludCBPQ1NQX2NvcHlfbm9uY2UoT0NTUF9CQVNJQ1JFU1AgKnJlc3AsIE9DU1BfUkVRVUVTVCAqcmVxKTsKKworaW50IE9DU1BfcmVxdWVzdF9zZXQxX25hbWUoT0NTUF9SRVFVRVNUICpyZXEsIFg1MDlfTkFNRSAqbm0pOworaW50IE9DU1BfcmVxdWVzdF9hZGQxX2NlcnQoT0NTUF9SRVFVRVNUICpyZXEsIFg1MDkgKmNlcnQpOworCitpbnQgT0NTUF9yZXF1ZXN0X3NpZ24oT0NTUF9SRVFVRVNUICAgKnJlcSwKKwkJICAgICAgWDUwOSAgICAgICAgICAgKnNpZ25lciwKKwkJICAgICAgRVZQX1BLRVkgICAgICAgKmtleSwKKwkJICAgICAgY29uc3QgRVZQX01EICAgKmRnc3QsCisJCSAgICAgIFNUQUNLX09GKFg1MDkpICpjZXJ0cywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK2ludCBPQ1NQX3Jlc3BvbnNlX3N0YXR1cyhPQ1NQX1JFU1BPTlNFICpyZXNwKTsKK09DU1BfQkFTSUNSRVNQICpPQ1NQX3Jlc3BvbnNlX2dldDFfYmFzaWMoT0NTUF9SRVNQT05TRSAqcmVzcCk7CisKK2ludCBPQ1NQX3Jlc3BfY291bnQoT0NTUF9CQVNJQ1JFU1AgKmJzKTsKK09DU1BfU0lOR0xFUkVTUCAqT0NTUF9yZXNwX2dldDAoT0NTUF9CQVNJQ1JFU1AgKmJzLCBpbnQgaWR4KTsKK2ludCBPQ1NQX3Jlc3BfZmluZChPQ1NQX0JBU0lDUkVTUCAqYnMsIE9DU1BfQ0VSVElEICppZCwgaW50IGxhc3QpOworaW50IE9DU1Bfc2luZ2xlX2dldDBfc3RhdHVzKE9DU1BfU0lOR0xFUkVTUCAqc2luZ2xlLCBpbnQgKnJlYXNvbiwKKwkJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqKnJldnRpbWUsCisJCQkJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKip0aGlzdXBkLAorCQkJCUFTTjFfR0VORVJBTElaRURUSU1FICoqbmV4dHVwZCk7CitpbnQgT0NTUF9yZXNwX2ZpbmRfc3RhdHVzKE9DU1BfQkFTSUNSRVNQICpicywgT0NTUF9DRVJUSUQgKmlkLCBpbnQgKnN0YXR1cywKKwkJCQlpbnQgKnJlYXNvbiwKKwkJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqKnJldnRpbWUsCisJCQkJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKip0aGlzdXBkLAorCQkJCUFTTjFfR0VORVJBTElaRURUSU1FICoqbmV4dHVwZCk7CitpbnQgT0NTUF9jaGVja192YWxpZGl0eShBU04xX0dFTkVSQUxJWkVEVElNRSAqdGhpc3VwZCwKKwkJCUFTTjFfR0VORVJBTElaRURUSU1FICpuZXh0dXBkLAorCQkJbG9uZyBzZWMsIGxvbmcgbWF4c2VjKTsKKworaW50IE9DU1BfcmVxdWVzdF92ZXJpZnkoT0NTUF9SRVFVRVNUICpyZXEsIFNUQUNLX09GKFg1MDkpICpjZXJ0cywgWDUwOV9TVE9SRSAqc3RvcmUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitpbnQgT0NTUF9wYXJzZV91cmwoY2hhciAqdXJsLCBjaGFyICoqcGhvc3QsIGNoYXIgKipwcG9ydCwgY2hhciAqKnBwYXRoLCBpbnQgKnBzc2wpOworCitpbnQgT0NTUF9pZF9pc3N1ZXJfY21wKE9DU1BfQ0VSVElEICphLCBPQ1NQX0NFUlRJRCAqYik7CitpbnQgT0NTUF9pZF9jbXAoT0NTUF9DRVJUSUQgKmEsIE9DU1BfQ0VSVElEICpiKTsKKworaW50IE9DU1BfcmVxdWVzdF9vbmVyZXFfY291bnQoT0NTUF9SRVFVRVNUICpyZXEpOworT0NTUF9PTkVSRVEgKk9DU1BfcmVxdWVzdF9vbmVyZXFfZ2V0MChPQ1NQX1JFUVVFU1QgKnJlcSwgaW50IGkpOworT0NTUF9DRVJUSUQgKk9DU1Bfb25lcmVxX2dldDBfaWQoT0NTUF9PTkVSRVEgKm9uZSk7CitpbnQgT0NTUF9pZF9nZXQwX2luZm8oQVNOMV9PQ1RFVF9TVFJJTkcgKipwaU5hbWVIYXNoLCBBU04xX09CSkVDVCAqKnBtZCwKKwkJCUFTTjFfT0NURVRfU1RSSU5HICoqcGlrZXlIYXNoLAorCQkJQVNOMV9JTlRFR0VSICoqcHNlcmlhbCwgT0NTUF9DRVJUSUQgKmNpZCk7CitpbnQgT0NTUF9yZXF1ZXN0X2lzX3NpZ25lZChPQ1NQX1JFUVVFU1QgKnJlcSk7CitPQ1NQX1JFU1BPTlNFICpPQ1NQX3Jlc3BvbnNlX2NyZWF0ZShpbnQgc3RhdHVzLCBPQ1NQX0JBU0lDUkVTUCAqYnMpOworT0NTUF9TSU5HTEVSRVNQICpPQ1NQX2Jhc2ljX2FkZDFfc3RhdHVzKE9DU1BfQkFTSUNSRVNQICpyc3AsCisJCQkJCQlPQ1NQX0NFUlRJRCAqY2lkLAorCQkJCQkJaW50IHN0YXR1cywgaW50IHJlYXNvbiwKKwkJCQkJCUFTTjFfVElNRSAqcmV2dGltZSwKKwkJCQkJQVNOMV9USU1FICp0aGlzdXBkLCBBU04xX1RJTUUgKm5leHR1cGQpOworaW50IE9DU1BfYmFzaWNfYWRkMV9jZXJ0KE9DU1BfQkFTSUNSRVNQICpyZXNwLCBYNTA5ICpjZXJ0KTsKK2ludCBPQ1NQX2Jhc2ljX3NpZ24oT0NTUF9CQVNJQ1JFU1AgKmJyc3AsIAorCQkJWDUwOSAqc2lnbmVyLCBFVlBfUEtFWSAqa2V5LCBjb25zdCBFVlBfTUQgKmRnc3QsCisJCQlTVEFDS19PRihYNTA5KSAqY2VydHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitYNTA5X0VYVEVOU0lPTiAqT0NTUF9jcmxJRF9uZXcoY2hhciAqdXJsLCBsb25nICpuLCBjaGFyICp0aW0pOworCitYNTA5X0VYVEVOU0lPTiAqT0NTUF9hY2NlcHRfcmVzcG9uc2VzX25ldyhjaGFyICoqb2lkcyk7CisKK1g1MDlfRVhURU5TSU9OICpPQ1NQX2FyY2hpdmVfY3V0b2ZmX25ldyhjaGFyKiB0aW0pOworCitYNTA5X0VYVEVOU0lPTiAqT0NTUF91cmxfc3ZjbG9jX25ldyhYNTA5X05BTUUqIGlzc3VlciwgY2hhciAqKnVybHMpOworCitpbnQgT0NTUF9SRVFVRVNUX2dldF9leHRfY291bnQoT0NTUF9SRVFVRVNUICp4KTsKK2ludCBPQ1NQX1JFUVVFU1RfZ2V0X2V4dF9ieV9OSUQoT0NTUF9SRVFVRVNUICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcyk7CitpbnQgT0NTUF9SRVFVRVNUX2dldF9leHRfYnlfT0JKKE9DU1BfUkVRVUVTVCAqeCwgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGxhc3Rwb3MpOworaW50IE9DU1BfUkVRVUVTVF9nZXRfZXh0X2J5X2NyaXRpY2FsKE9DU1BfUkVRVUVTVCAqeCwgaW50IGNyaXQsIGludCBsYXN0cG9zKTsKK1g1MDlfRVhURU5TSU9OICpPQ1NQX1JFUVVFU1RfZ2V0X2V4dChPQ1NQX1JFUVVFU1QgKngsIGludCBsb2MpOworWDUwOV9FWFRFTlNJT04gKk9DU1BfUkVRVUVTVF9kZWxldGVfZXh0KE9DU1BfUkVRVUVTVCAqeCwgaW50IGxvYyk7Cit2b2lkICpPQ1NQX1JFUVVFU1RfZ2V0MV9leHRfZDJpKE9DU1BfUkVRVUVTVCAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CitpbnQgT0NTUF9SRVFVRVNUX2FkZDFfZXh0X2kyZChPQ1NQX1JFUVVFU1QgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBPQ1NQX1JFUVVFU1RfYWRkX2V4dChPQ1NQX1JFUVVFU1QgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7CisKK2ludCBPQ1NQX09ORVJFUV9nZXRfZXh0X2NvdW50KE9DU1BfT05FUkVRICp4KTsKK2ludCBPQ1NQX09ORVJFUV9nZXRfZXh0X2J5X05JRChPQ1NQX09ORVJFUSAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50IE9DU1BfT05FUkVRX2dldF9leHRfYnlfT0JKKE9DU1BfT05FUkVRICp4LCBBU04xX09CSkVDVCAqb2JqLCBpbnQgbGFzdHBvcyk7CitpbnQgT0NTUF9PTkVSRVFfZ2V0X2V4dF9ieV9jcml0aWNhbChPQ1NQX09ORVJFUSAqeCwgaW50IGNyaXQsIGludCBsYXN0cG9zKTsKK1g1MDlfRVhURU5TSU9OICpPQ1NQX09ORVJFUV9nZXRfZXh0KE9DU1BfT05FUkVRICp4LCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpPQ1NQX09ORVJFUV9kZWxldGVfZXh0KE9DU1BfT05FUkVRICp4LCBpbnQgbG9jKTsKK3ZvaWQgKk9DU1BfT05FUkVRX2dldDFfZXh0X2QyaShPQ1NQX09ORVJFUSAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CitpbnQgT0NTUF9PTkVSRVFfYWRkMV9leHRfaTJkKE9DU1BfT05FUkVRICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CitpbnQgT0NTUF9PTkVSRVFfYWRkX2V4dChPQ1NQX09ORVJFUSAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKTsKKworaW50IE9DU1BfQkFTSUNSRVNQX2dldF9leHRfY291bnQoT0NTUF9CQVNJQ1JFU1AgKngpOworaW50IE9DU1BfQkFTSUNSRVNQX2dldF9leHRfYnlfTklEKE9DU1BfQkFTSUNSRVNQICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcyk7CitpbnQgT0NTUF9CQVNJQ1JFU1BfZ2V0X2V4dF9ieV9PQkooT0NTUF9CQVNJQ1JFU1AgKngsIEFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zKTsKK2ludCBPQ1NQX0JBU0lDUkVTUF9nZXRfZXh0X2J5X2NyaXRpY2FsKE9DU1BfQkFTSUNSRVNQICp4LCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpOworWDUwOV9FWFRFTlNJT04gKk9DU1BfQkFTSUNSRVNQX2dldF9leHQoT0NTUF9CQVNJQ1JFU1AgKngsIGludCBsb2MpOworWDUwOV9FWFRFTlNJT04gKk9DU1BfQkFTSUNSRVNQX2RlbGV0ZV9leHQoT0NTUF9CQVNJQ1JFU1AgKngsIGludCBsb2MpOwordm9pZCAqT0NTUF9CQVNJQ1JFU1BfZ2V0MV9leHRfZDJpKE9DU1BfQkFTSUNSRVNQICp4LCBpbnQgbmlkLCBpbnQgKmNyaXQsIGludCAqaWR4KTsKK2ludCBPQ1NQX0JBU0lDUkVTUF9hZGQxX2V4dF9pMmQoT0NTUF9CQVNJQ1JFU1AgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBPQ1NQX0JBU0lDUkVTUF9hZGRfZXh0KE9DU1BfQkFTSUNSRVNQICp4LCBYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBsb2MpOworCitpbnQgT0NTUF9TSU5HTEVSRVNQX2dldF9leHRfY291bnQoT0NTUF9TSU5HTEVSRVNQICp4KTsKK2ludCBPQ1NQX1NJTkdMRVJFU1BfZ2V0X2V4dF9ieV9OSUQoT0NTUF9TSU5HTEVSRVNQICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcyk7CitpbnQgT0NTUF9TSU5HTEVSRVNQX2dldF9leHRfYnlfT0JKKE9DU1BfU0lOR0xFUkVTUCAqeCwgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGxhc3Rwb3MpOworaW50IE9DU1BfU0lOR0xFUkVTUF9nZXRfZXh0X2J5X2NyaXRpY2FsKE9DU1BfU0lOR0xFUkVTUCAqeCwgaW50IGNyaXQsIGludCBsYXN0cG9zKTsKK1g1MDlfRVhURU5TSU9OICpPQ1NQX1NJTkdMRVJFU1BfZ2V0X2V4dChPQ1NQX1NJTkdMRVJFU1AgKngsIGludCBsb2MpOworWDUwOV9FWFRFTlNJT04gKk9DU1BfU0lOR0xFUkVTUF9kZWxldGVfZXh0KE9DU1BfU0lOR0xFUkVTUCAqeCwgaW50IGxvYyk7Cit2b2lkICpPQ1NQX1NJTkdMRVJFU1BfZ2V0MV9leHRfZDJpKE9DU1BfU0lOR0xFUkVTUCAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CitpbnQgT0NTUF9TSU5HTEVSRVNQX2FkZDFfZXh0X2kyZChPQ1NQX1NJTkdMRVJFU1AgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBPQ1NQX1NJTkdMRVJFU1BfYWRkX2V4dChPQ1NQX1NJTkdMRVJFU1AgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9TSU5HTEVSRVNQKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX0NFUlRTVEFUVVMpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfUkVWT0tFRElORk8pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfQkFTSUNSRVNQKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX1JFU1BEQVRBKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX1JFU1BJRCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVNQT05TRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVNQQllURVMpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfT05FUkVRKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX0NFUlRJRCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVFVRVNUKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX1NJR05BVFVSRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVFJTkZPKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX0NSTElEKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX1NFUlZJQ0VMT0MpCisKK2NvbnN0IGNoYXIgKk9DU1BfcmVzcG9uc2Vfc3RhdHVzX3N0cihsb25nIHMpOworY29uc3QgY2hhciAqT0NTUF9jZXJ0X3N0YXR1c19zdHIobG9uZyBzKTsKK2NvbnN0IGNoYXIgKk9DU1BfY3JsX3JlYXNvbl9zdHIobG9uZyBzKTsKKworaW50IE9DU1BfUkVRVUVTVF9wcmludChCSU8gKmJwLCBPQ1NQX1JFUVVFU1QqIGEsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50IE9DU1BfUkVTUE9OU0VfcHJpbnQoQklPICpicCwgT0NTUF9SRVNQT05TRSogbywgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK2ludCBPQ1NQX2Jhc2ljX3ZlcmlmeShPQ1NQX0JBU0lDUkVTUCAqYnMsIFNUQUNLX09GKFg1MDkpICpjZXJ0cywKKwkJCQlYNTA5X1NUT1JFICpzdCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfT0NTUF9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIE9DU1AgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgT0NTUF9GX0FTTjFfU1RSSU5HX0VOQ09ERQkJCSAxMDAKKyNkZWZpbmUgT0NTUF9GX0QySV9PQ1NQX05PTkNFCQkJCSAxMDIKKyNkZWZpbmUgT0NTUF9GX09DU1BfQkFTSUNfQUREMV9TVEFUVVMJCQkgMTAzCisjZGVmaW5lIE9DU1BfRl9PQ1NQX0JBU0lDX1NJR04JCQkJIDEwNAorI2RlZmluZSBPQ1NQX0ZfT0NTUF9CQVNJQ19WRVJJRlkJCQkgMTA1CisjZGVmaW5lIE9DU1BfRl9PQ1NQX0NFUlRfSURfTkVXCQkJCSAxMDEKKyNkZWZpbmUgT0NTUF9GX09DU1BfQ0hFQ0tfREVMRUdBVEVECQkJIDEwNgorI2RlZmluZSBPQ1NQX0ZfT0NTUF9DSEVDS19JRFMJCQkJIDEwNworI2RlZmluZSBPQ1NQX0ZfT0NTUF9DSEVDS19JU1NVRVIJCQkgMTA4CisjZGVmaW5lIE9DU1BfRl9PQ1NQX0NIRUNLX1ZBTElESVRZCQkJIDExNQorI2RlZmluZSBPQ1NQX0ZfT0NTUF9NQVRDSF9JU1NVRVJJRAkJCSAxMDkKKyNkZWZpbmUgT0NTUF9GX09DU1BfUEFSU0VfVVJMCQkJCSAxMTQKKyNkZWZpbmUgT0NTUF9GX09DU1BfUkVRVUVTVF9TSUdOCQkJIDExMAorI2RlZmluZSBPQ1NQX0ZfT0NTUF9SRVFVRVNUX1ZFUklGWQkJCSAxMTYKKyNkZWZpbmUgT0NTUF9GX09DU1BfUkVTUE9OU0VfR0VUMV9CQVNJQwkJCSAxMTEKKyNkZWZpbmUgT0NTUF9GX09DU1BfU0VORFJFUV9CSU8JCQkJIDExMgorI2RlZmluZSBPQ1NQX0ZfT0NTUF9TRU5EUkVRX05CSU8JCQkgMTE3CisjZGVmaW5lIE9DU1BfRl9QQVJTRV9IVFRQX0xJTkUxCQkJCSAxMTgKKyNkZWZpbmUgT0NTUF9GX1JFUVVFU1RfVkVSSUZZCQkJCSAxMTMKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBPQ1NQX1JfQkFEX0RBVEEJCQkJCSAxMDAKKyNkZWZpbmUgT0NTUF9SX0NFUlRJRklDQVRFX1ZFUklGWV9FUlJPUgkJCSAxMDEKKyNkZWZpbmUgT0NTUF9SX0RJR0VTVF9FUlIJCQkJIDEwMgorI2RlZmluZSBPQ1NQX1JfRVJST1JfSU5fTkVYVFVQREFURV9GSUVMRAkJIDEyMgorI2RlZmluZSBPQ1NQX1JfRVJST1JfSU5fVEhJU1VQREFURV9GSUVMRAkJIDEyMworI2RlZmluZSBPQ1NQX1JfRVJST1JfUEFSU0lOR19VUkwJCQkgMTIxCisjZGVmaW5lIE9DU1BfUl9NSVNTSU5HX09DU1BTSUdOSU5HX1VTQUdFCQkgMTAzCisjZGVmaW5lIE9DU1BfUl9ORVhUVVBEQVRFX0JFRk9SRV9USElTVVBEQVRFCQkgMTI0CisjZGVmaW5lIE9DU1BfUl9OT1RfQkFTSUNfUkVTUE9OU0UJCQkgMTA0CisjZGVmaW5lIE9DU1BfUl9OT19DRVJUSUZJQ0FURVNfSU5fQ0hBSU4JCQkgMTA1CisjZGVmaW5lIE9DU1BfUl9OT19DT05URU5UCQkJCSAxMDYKKyNkZWZpbmUgT0NTUF9SX05PX1BVQkxJQ19LRVkJCQkJIDEwNworI2RlZmluZSBPQ1NQX1JfTk9fUkVTUE9OU0VfREFUQQkJCQkgMTA4CisjZGVmaW5lIE9DU1BfUl9OT19SRVZPS0VEX1RJTUUJCQkJIDEwOQorI2RlZmluZSBPQ1NQX1JfUFJJVkFURV9LRVlfRE9FU19OT1RfTUFUQ0hfQ0VSVElGSUNBVEUJIDExMAorI2RlZmluZSBPQ1NQX1JfUkVRVUVTVF9OT1RfU0lHTkVECQkJIDEyOAorI2RlZmluZSBPQ1NQX1JfUkVTUE9OU0VfQ09OVEFJTlNfTk9fUkVWT0NBVElPTl9EQVRBCSAxMTEKKyNkZWZpbmUgT0NTUF9SX1JPT1RfQ0FfTk9UX1RSVVNURUQJCQkgMTEyCisjZGVmaW5lIE9DU1BfUl9TRVJWRVJfUkVBRF9FUlJPUgkJCSAxMTMKKyNkZWZpbmUgT0NTUF9SX1NFUlZFUl9SRVNQT05TRV9FUlJPUgkJCSAxMTQKKyNkZWZpbmUgT0NTUF9SX1NFUlZFUl9SRVNQT05TRV9QQVJTRV9FUlJPUgkJIDExNQorI2RlZmluZSBPQ1NQX1JfU0VSVkVSX1dSSVRFX0VSUk9SCQkJIDExNgorI2RlZmluZSBPQ1NQX1JfU0lHTkFUVVJFX0ZBSUxVUkUJCQkgMTE3CisjZGVmaW5lIE9DU1BfUl9TSUdORVJfQ0VSVElGSUNBVEVfTk9UX0ZPVU5ECQkgMTE4CisjZGVmaW5lIE9DU1BfUl9TVEFUVVNfRVhQSVJFRAkJCQkgMTI1CisjZGVmaW5lIE9DU1BfUl9TVEFUVVNfTk9UX1lFVF9WQUxJRAkJCSAxMjYKKyNkZWZpbmUgT0NTUF9SX1NUQVRVU19UT09fT0xECQkJCSAxMjcKKyNkZWZpbmUgT0NTUF9SX1VOS05PV05fTUVTU0FHRV9ESUdFU1QJCQkgMTE5CisjZGVmaW5lIE9DU1BfUl9VTktOT1dOX05JRAkJCQkgMTIwCisjZGVmaW5lIE9DU1BfUl9VTlNVUFBPUlRFRF9SRVFVRVNUT1JOQU1FX1RZUEUJCSAxMjkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vY3NwL29jc3BfYXNuLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2Fzbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTg5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2Fzbi5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiBvY3NwX2Fzbi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29jc3AuaD4KKworQVNOMV9TRVFVRU5DRShPQ1NQX1NJR05BVFVSRSkgPSB7CisJQVNOMV9TSU1QTEUoT0NTUF9TSUdOQVRVUkUsIHNpZ25hdHVyZUFsZ29yaXRobSwgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoT0NTUF9TSUdOQVRVUkUsIHNpZ25hdHVyZSwgQVNOMV9CSVRfU1RSSU5HKSwKKwlBU04xX0VYUF9TRVFVRU5DRV9PRl9PUFQoT0NTUF9TSUdOQVRVUkUsIGNlcnRzLCBYNTA5LCAwKQorfSBBU04xX1NFUVVFTkNFX0VORChPQ1NQX1NJR05BVFVSRSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKE9DU1BfU0lHTkFUVVJFKQorCitBU04xX1NFUVVFTkNFKE9DU1BfQ0VSVElEKSA9IHsKKwlBU04xX1NJTVBMRShPQ1NQX0NFUlRJRCwgaGFzaEFsZ29yaXRobSwgWDUwOV9BTEdPUiksCisJQVNOMV9TSU1QTEUoT0NTUF9DRVJUSUQsIGlzc3Vlck5hbWVIYXNoLCBBU04xX09DVEVUX1NUUklORyksCisJQVNOMV9TSU1QTEUoT0NTUF9DRVJUSUQsIGlzc3VlcktleUhhc2gsIEFTTjFfT0NURVRfU1RSSU5HKSwKKwlBU04xX1NJTVBMRShPQ1NQX0NFUlRJRCwgc2VyaWFsTnVtYmVyLCBBU04xX0lOVEVHRVIpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE9DU1BfQ0VSVElEKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoT0NTUF9DRVJUSUQpCisKK0FTTjFfU0VRVUVOQ0UoT0NTUF9PTkVSRVEpID0geworCUFTTjFfU0lNUExFKE9DU1BfT05FUkVRLCByZXFDZXJ0LCBPQ1NQX0NFUlRJRCksCisJQVNOMV9FWFBfU0VRVUVOQ0VfT0ZfT1BUKE9DU1BfT05FUkVRLCBzaW5nbGVSZXF1ZXN0RXh0ZW5zaW9ucywgWDUwOV9FWFRFTlNJT04sIDApCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE9DU1BfT05FUkVRKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoT0NTUF9PTkVSRVEpCisKK0FTTjFfU0VRVUVOQ0UoT0NTUF9SRVFJTkZPKSA9IHsKKwlBU04xX0VYUF9PUFQoT0NTUF9SRVFJTkZPLCB2ZXJzaW9uLCBBU04xX0lOVEVHRVIsIDApLAorCUFTTjFfRVhQX09QVChPQ1NQX1JFUUlORk8sIHJlcXVlc3Rvck5hbWUsIEdFTkVSQUxfTkFNRSwgMSksCisJQVNOMV9TRVFVRU5DRV9PRihPQ1NQX1JFUUlORk8sIHJlcXVlc3RMaXN0LCBPQ1NQX09ORVJFUSksCisJQVNOMV9FWFBfU0VRVUVOQ0VfT0ZfT1BUKE9DU1BfUkVRSU5GTywgcmVxdWVzdEV4dGVuc2lvbnMsIFg1MDlfRVhURU5TSU9OLCAyKQorfSBBU04xX1NFUVVFTkNFX0VORChPQ1NQX1JFUUlORk8pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhPQ1NQX1JFUUlORk8pCisKK0FTTjFfU0VRVUVOQ0UoT0NTUF9SRVFVRVNUKSA9IHsKKwlBU04xX1NJTVBMRShPQ1NQX1JFUVVFU1QsIHRic1JlcXVlc3QsIE9DU1BfUkVRSU5GTyksCisJQVNOMV9FWFBfT1BUKE9DU1BfUkVRVUVTVCwgb3B0aW9uYWxTaWduYXR1cmUsIE9DU1BfU0lHTkFUVVJFLCAwKQorfSBBU04xX1NFUVVFTkNFX0VORChPQ1NQX1JFUVVFU1QpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhPQ1NQX1JFUVVFU1QpCisKKy8qIE9DU1BfUkVTUE9OU0UgdGVtcGxhdGVzICovCisKK0FTTjFfU0VRVUVOQ0UoT0NTUF9SRVNQQllURVMpID0geworCSAgICBBU04xX1NJTVBMRShPQ1NQX1JFU1BCWVRFUywgcmVzcG9uc2VUeXBlLCBBU04xX09CSkVDVCksCisJICAgIEFTTjFfU0lNUExFKE9DU1BfUkVTUEJZVEVTLCByZXNwb25zZSwgQVNOMV9PQ1RFVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE9DU1BfUkVTUEJZVEVTKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVNQQllURVMpCisKK0FTTjFfU0VRVUVOQ0UoT0NTUF9SRVNQT05TRSkgPSB7CisJQVNOMV9TSU1QTEUoT0NTUF9SRVNQT05TRSwgcmVzcG9uc2VTdGF0dXMsIEFTTjFfRU5VTUVSQVRFRCksCisJQVNOMV9FWFBfT1BUKE9DU1BfUkVTUE9OU0UsIHJlc3BvbnNlQnl0ZXMsIE9DU1BfUkVTUEJZVEVTLCAwKQorfSBBU04xX1NFUVVFTkNFX0VORChPQ1NQX1JFU1BPTlNFKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVNQT05TRSkKKworQVNOMV9DSE9JQ0UoT0NTUF9SRVNQSUQpID0geworCSAgIEFTTjFfRVhQKE9DU1BfUkVTUElELCB2YWx1ZS5ieU5hbWUsIFg1MDlfTkFNRSwgMSksCisJICAgQVNOMV9FWFAoT0NTUF9SRVNQSUQsIHZhbHVlLmJ5S2V5LCBBU04xX09DVEVUX1NUUklORywgMikKK30gQVNOMV9DSE9JQ0VfRU5EKE9DU1BfUkVTUElEKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVNQSUQpCisKK0FTTjFfU0VRVUVOQ0UoT0NTUF9SRVZPS0VESU5GTykgPSB7CisJQVNOMV9TSU1QTEUoT0NTUF9SRVZPS0VESU5GTywgcmV2b2NhdGlvblRpbWUsIEFTTjFfR0VORVJBTElaRURUSU1FKSwKKyAgCUFTTjFfRVhQX09QVChPQ1NQX1JFVk9LRURJTkZPLCByZXZvY2F0aW9uUmVhc29uLCBBU04xX0VOVU1FUkFURUQsIDApCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE9DU1BfUkVWT0tFRElORk8pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhPQ1NQX1JFVk9LRURJTkZPKQorCitBU04xX0NIT0lDRShPQ1NQX0NFUlRTVEFUVVMpID0geworCUFTTjFfSU1QKE9DU1BfQ0VSVFNUQVRVUywgdmFsdWUuZ29vZCwgQVNOMV9OVUxMLCAwKSwKKwlBU04xX0lNUChPQ1NQX0NFUlRTVEFUVVMsIHZhbHVlLnJldm9rZWQsIE9DU1BfUkVWT0tFRElORk8sIDEpLAorCUFTTjFfSU1QKE9DU1BfQ0VSVFNUQVRVUywgdmFsdWUudW5rbm93biwgQVNOMV9OVUxMLCAyKQorfSBBU04xX0NIT0lDRV9FTkQoT0NTUF9DRVJUU1RBVFVTKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoT0NTUF9DRVJUU1RBVFVTKQorCitBU04xX1NFUVVFTkNFKE9DU1BfU0lOR0xFUkVTUCkgPSB7CisJICAgQVNOMV9TSU1QTEUoT0NTUF9TSU5HTEVSRVNQLCBjZXJ0SWQsIE9DU1BfQ0VSVElEKSwKKwkgICBBU04xX1NJTVBMRShPQ1NQX1NJTkdMRVJFU1AsIGNlcnRTdGF0dXMsIE9DU1BfQ0VSVFNUQVRVUyksCisJICAgQVNOMV9TSU1QTEUoT0NTUF9TSU5HTEVSRVNQLCB0aGlzVXBkYXRlLCBBU04xX0dFTkVSQUxJWkVEVElNRSksCisJICAgQVNOMV9FWFBfT1BUKE9DU1BfU0lOR0xFUkVTUCwgbmV4dFVwZGF0ZSwgQVNOMV9HRU5FUkFMSVpFRFRJTUUsIDApLAorCSAgIEFTTjFfRVhQX1NFUVVFTkNFX09GX09QVChPQ1NQX1NJTkdMRVJFU1AsIHNpbmdsZUV4dGVuc2lvbnMsIFg1MDlfRVhURU5TSU9OLCAxKQorfSBBU04xX1NFUVVFTkNFX0VORChPQ1NQX1NJTkdMRVJFU1ApCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhPQ1NQX1NJTkdMRVJFU1ApCisKK0FTTjFfU0VRVUVOQ0UoT0NTUF9SRVNQREFUQSkgPSB7CisJICAgQVNOMV9FWFBfT1BUKE9DU1BfUkVTUERBVEEsIHZlcnNpb24sIEFTTjFfSU5URUdFUiwgMCksCisJICAgQVNOMV9TSU1QTEUoT0NTUF9SRVNQREFUQSwgcmVzcG9uZGVySWQsIE9DU1BfUkVTUElEKSwKKwkgICBBU04xX1NJTVBMRShPQ1NQX1JFU1BEQVRBLCBwcm9kdWNlZEF0LCBBU04xX0dFTkVSQUxJWkVEVElNRSksCisJICAgQVNOMV9TRVFVRU5DRV9PRihPQ1NQX1JFU1BEQVRBLCByZXNwb25zZXMsIE9DU1BfU0lOR0xFUkVTUCksCisJICAgQVNOMV9FWFBfU0VRVUVOQ0VfT0ZfT1BUKE9DU1BfUkVTUERBVEEsIHJlc3BvbnNlRXh0ZW5zaW9ucywgWDUwOV9FWFRFTlNJT04sIDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE9DU1BfUkVTUERBVEEpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhPQ1NQX1JFU1BEQVRBKQorCitBU04xX1NFUVVFTkNFKE9DU1BfQkFTSUNSRVNQKSA9IHsKKwkgICBBU04xX1NJTVBMRShPQ1NQX0JBU0lDUkVTUCwgdGJzUmVzcG9uc2VEYXRhLCBPQ1NQX1JFU1BEQVRBKSwKKwkgICBBU04xX1NJTVBMRShPQ1NQX0JBU0lDUkVTUCwgc2lnbmF0dXJlQWxnb3JpdGhtLCBYNTA5X0FMR09SKSwKKwkgICBBU04xX1NJTVBMRShPQ1NQX0JBU0lDUkVTUCwgc2lnbmF0dXJlLCBBU04xX0JJVF9TVFJJTkcpLAorCSAgIEFTTjFfRVhQX1NFUVVFTkNFX09GX09QVChPQ1NQX0JBU0lDUkVTUCwgY2VydHMsIFg1MDksIDApCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE9DU1BfQkFTSUNSRVNQKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoT0NTUF9CQVNJQ1JFU1ApCisKK0FTTjFfU0VRVUVOQ0UoT0NTUF9DUkxJRCkgPSB7CisJICAgQVNOMV9FWFBfT1BUKE9DU1BfQ1JMSUQsIGNybFVybCwgQVNOMV9JQTVTVFJJTkcsIDApLAorCSAgIEFTTjFfRVhQX09QVChPQ1NQX0NSTElELCBjcmxOdW0sIEFTTjFfSU5URUdFUiwgMSksCisJICAgQVNOMV9FWFBfT1BUKE9DU1BfQ1JMSUQsIGNybFRpbWUsIEFTTjFfR0VORVJBTElaRURUSU1FLCAyKQorfSBBU04xX1NFUVVFTkNFX0VORChPQ1NQX0NSTElEKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoT0NTUF9DUkxJRCkKKworQVNOMV9TRVFVRU5DRShPQ1NQX1NFUlZJQ0VMT0MpID0geworCUFTTjFfU0lNUExFKE9DU1BfU0VSVklDRUxPQywgaXNzdWVyLCBYNTA5X05BTUUpLAorCUFTTjFfU0VRVUVOQ0VfT0ZfT1BUKE9DU1BfU0VSVklDRUxPQywgbG9jYXRvciwgQUNDRVNTX0RFU0NSSVBUSU9OKQorfSBBU04xX1NFUVVFTkNFX0VORChPQ1NQX1NFUlZJQ0VMT0MpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhPQ1NQX1NFUlZJQ0VMT0MpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2NsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2NsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxNGQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vY3NwL29jc3BfY2wuYwpAQCAtMCwwICsxLDM3MSBAQAorLyogb2NzcF9jbC5jICovCisvKiBXcml0dGVuIGJ5IFRvbSBUaXRjaGVuZXIgPFRvbV9UaXRjaGVuZXJAZ3Jvb3ZlLm5ldD4gZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LiAqLworCisvKiBIaXN0b3J5OgorICAgVGhpcyBmaWxlIHdhcyB0cmFuc2ZlcmVkIHRvIFJpY2hhcmQgTGV2aXR0ZSBmcm9tIENlcnRDbyBieSBLYXRoeQorICAgV2VpbmhvbGQgaW4gbWlkLXNwcmluZyAyMDAwIHRvIGJlIGluY2x1ZGVkIGluIE9wZW5TU0wgb3IgcmVsZWFzZWQKKyAgIGFzIGEgcGF0Y2gga2l0LiAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGNyeXB0bGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2NzcC5oPgorCisvKiBVdGlsaXR5IGZ1bmN0aW9ucyByZWxhdGVkIHRvIHNlbmRpbmcgT0NTUCByZXF1ZXN0cyBhbmQgZXh0cmFjdGluZworICogcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcmVzcG9uc2UuCisgKi8KKworLyogQWRkIGFuIE9DU1BfQ0VSVElEIHRvIGFuIE9DU1AgcmVxdWVzdC4gUmV0dXJuIG5ldyBPQ1NQX09ORVJFUSAKKyAqIHBvaW50ZXI6IHVzZWZ1bCBpZiB3ZSB3YW50IHRvIGFkZCBleHRlbnNpb25zLgorICovCisKK09DU1BfT05FUkVRICpPQ1NQX3JlcXVlc3RfYWRkMF9pZChPQ1NQX1JFUVVFU1QgKnJlcSwgT0NTUF9DRVJUSUQgKmNpZCkKKyAgICAgICAgeworCU9DU1BfT05FUkVRICpvbmUgPSBOVUxMOworCisJaWYgKCEob25lID0gT0NTUF9PTkVSRVFfbmV3KCkpKSBnb3RvIGVycjsKKwlpZiAob25lLT5yZXFDZXJ0KSBPQ1NQX0NFUlRJRF9mcmVlKG9uZS0+cmVxQ2VydCk7CisJb25lLT5yZXFDZXJ0ID0gY2lkOworCWlmIChyZXEgJiYKKwkJIXNrX09DU1BfT05FUkVRX3B1c2gocmVxLT50YnNSZXF1ZXN0LT5yZXF1ZXN0TGlzdCwgb25lKSkKKwkJCQlnb3RvIGVycjsKKwlyZXR1cm4gb25lOworZXJyOgorCU9DU1BfT05FUkVRX2ZyZWUob25lKTsKKwlyZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisvKiBTZXQgcmVxdWVzdG9yTmFtZSBmcm9tIGFuIFg1MDlfTkFNRSBzdHJ1Y3R1cmUgKi8KKworaW50IE9DU1BfcmVxdWVzdF9zZXQxX25hbWUoT0NTUF9SRVFVRVNUICpyZXEsIFg1MDlfTkFNRSAqbm0pCisJeworCUdFTkVSQUxfTkFNRSAqZ2VuOworCWdlbiA9IEdFTkVSQUxfTkFNRV9uZXcoKTsKKwlpZiAoZ2VuID09IE5VTEwpCisJCXJldHVybiAwOworCWlmICghWDUwOV9OQU1FX3NldCgmZ2VuLT5kLmRpcmVjdG9yeU5hbWUsIG5tKSkKKwkJeworCQlHRU5FUkFMX05BTUVfZnJlZShnZW4pOworCQlyZXR1cm4gMDsKKwkJfQorCWdlbi0+dHlwZSA9IEdFTl9ESVJOQU1FOworCWlmIChyZXEtPnRic1JlcXVlc3QtPnJlcXVlc3Rvck5hbWUpCisJCUdFTkVSQUxfTkFNRV9mcmVlKHJlcS0+dGJzUmVxdWVzdC0+cmVxdWVzdG9yTmFtZSk7CisJcmVxLT50YnNSZXF1ZXN0LT5yZXF1ZXN0b3JOYW1lID0gZ2VuOworCXJldHVybiAxOworCX0KKwkKKworLyogQWRkIGEgY2VydGlmaWNhdGUgdG8gYW4gT0NTUCByZXF1ZXN0ICovCisKK2ludCBPQ1NQX3JlcXVlc3RfYWRkMV9jZXJ0KE9DU1BfUkVRVUVTVCAqcmVxLCBYNTA5ICpjZXJ0KQorCXsKKwlPQ1NQX1NJR05BVFVSRSAqc2lnOworCWlmICghcmVxLT5vcHRpb25hbFNpZ25hdHVyZSkKKwkJcmVxLT5vcHRpb25hbFNpZ25hdHVyZSA9IE9DU1BfU0lHTkFUVVJFX25ldygpOworCXNpZyA9IHJlcS0+b3B0aW9uYWxTaWduYXR1cmU7CisJaWYgKCFzaWcpIHJldHVybiAwOworCWlmICghY2VydCkgcmV0dXJuIDE7CisJaWYgKCFzaWctPmNlcnRzICYmICEoc2lnLT5jZXJ0cyA9IHNrX1g1MDlfbmV3X251bGwoKSkpCisJCXJldHVybiAwOworCisJaWYoIXNrX1g1MDlfcHVzaChzaWctPmNlcnRzLCBjZXJ0KSkgcmV0dXJuIDA7CisJQ1JZUFRPX2FkZCgmY2VydC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfWDUwOSk7CisJcmV0dXJuIDE7CisJfQorCisvKiBTaWduIGFuIE9DU1AgcmVxdWVzdCBzZXQgdGhlIHJlcXVlc3Rvck5hbWUgdG8gdGhlIHN1YmplYworICogbmFtZSBvZiBhbiBvcHRpb25hbCBzaWduZXJzIGNlcnRpZmljYXRlIGFuZCBpbmNsdWRlIG9uZQorICogb3IgbW9yZSBvcHRpb25hbCBjZXJ0aWZpY2F0ZXMgaW4gdGhlIHJlcXVlc3QuIEJlaGF2ZXMKKyAqIGxpa2UgUEtDUzdfc2lnbigpLgorICovCisKK2ludCBPQ1NQX3JlcXVlc3Rfc2lnbihPQ1NQX1JFUVVFU1QgICAqcmVxLAorCQkgICAgICBYNTA5ICAgICAgICAgICAqc2lnbmVyLAorCQkgICAgICBFVlBfUEtFWSAgICAgICAqa2V5LAorCQkgICAgICBjb25zdCBFVlBfTUQgICAqZGdzdCwKKwkJICAgICAgU1RBQ0tfT0YoWDUwOSkgKmNlcnRzLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQorICAgICAgICB7CisJaW50IGk7CisJT0NTUF9TSUdOQVRVUkUgKnNpZzsKKwlYNTA5ICp4OworCisJaWYgKCFPQ1NQX3JlcXVlc3Rfc2V0MV9uYW1lKHJlcSwgWDUwOV9nZXRfc3ViamVjdF9uYW1lKHNpZ25lcikpKQorCQkJZ290byBlcnI7CisKKwlpZiAoIShyZXEtPm9wdGlvbmFsU2lnbmF0dXJlID0gc2lnID0gT0NTUF9TSUdOQVRVUkVfbmV3KCkpKSBnb3RvIGVycjsKKwlpZiAoa2V5KQorCQl7CisJCWlmICghWDUwOV9jaGVja19wcml2YXRlX2tleShzaWduZXIsIGtleSkpCisJCQl7CisJCQlPQ1NQZXJyKE9DU1BfRl9PQ1NQX1JFUVVFU1RfU0lHTiwgT0NTUF9SX1BSSVZBVEVfS0VZX0RPRVNfTk9UX01BVENIX0NFUlRJRklDQVRFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoIU9DU1BfUkVRVUVTVF9zaWduKHJlcSwga2V5LCBkZ3N0KSkgZ290byBlcnI7CisJCX0KKworCWlmICghKGZsYWdzICYgT0NTUF9OT0NFUlRTKSkKKwkJeworCQlpZighT0NTUF9yZXF1ZXN0X2FkZDFfY2VydChyZXEsIHNpZ25lcikpIGdvdG8gZXJyOworCQlmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9udW0oY2VydHMpOyBpKyspCisJCQl7CisJCQl4ID0gc2tfWDUwOV92YWx1ZShjZXJ0cywgaSk7CisJCQlpZiAoIU9DU1BfcmVxdWVzdF9hZGQxX2NlcnQocmVxLCB4KSkgZ290byBlcnI7CisJCQl9CisJCX0KKworCXJldHVybiAxOworZXJyOgorCU9DU1BfU0lHTkFUVVJFX2ZyZWUocmVxLT5vcHRpb25hbFNpZ25hdHVyZSk7CisJcmVxLT5vcHRpb25hbFNpZ25hdHVyZSA9IE5VTEw7CisJcmV0dXJuIDA7CisJfQorCisvKiBHZXQgcmVzcG9uc2Ugc3RhdHVzICovCisKK2ludCBPQ1NQX3Jlc3BvbnNlX3N0YXR1cyhPQ1NQX1JFU1BPTlNFICpyZXNwKQorCXsKKwlyZXR1cm4gQVNOMV9FTlVNRVJBVEVEX2dldChyZXNwLT5yZXNwb25zZVN0YXR1cyk7CisJfQorCisvKiBFeHRyYWN0IGJhc2ljIHJlc3BvbnNlIGZyb20gT0NTUF9SRVNQT05TRSBvciBOVUxMIGlmCisgKiBubyBiYXNpYyByZXNwb25zZSBwcmVzZW50LgorICovCisgCisKK09DU1BfQkFTSUNSRVNQICpPQ1NQX3Jlc3BvbnNlX2dldDFfYmFzaWMoT0NTUF9SRVNQT05TRSAqcmVzcCkKKwl7CisJT0NTUF9SRVNQQllURVMgKnJiOworCXJiID0gcmVzcC0+cmVzcG9uc2VCeXRlczsKKwlpZiAoIXJiKQorCQl7CisJCU9DU1BlcnIoT0NTUF9GX09DU1BfUkVTUE9OU0VfR0VUMV9CQVNJQywgT0NTUF9SX05PX1JFU1BPTlNFX0RBVEEpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmIChPQkpfb2JqMm5pZChyYi0+cmVzcG9uc2VUeXBlKSAhPSBOSURfaWRfcGtpeF9PQ1NQX2Jhc2ljKQorCQl7CisJCU9DU1BlcnIoT0NTUF9GX09DU1BfUkVTUE9OU0VfR0VUMV9CQVNJQywgT0NTUF9SX05PVF9CQVNJQ19SRVNQT05TRSk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXR1cm4gQVNOMV9pdGVtX3VucGFjayhyYi0+cmVzcG9uc2UsIEFTTjFfSVRFTV9ycHRyKE9DU1BfQkFTSUNSRVNQKSk7CisJfQorCisvKiBSZXR1cm4gbnVtYmVyIG9mIE9DU1BfU0lOR0xFUkVTUCByZXBvbnNlcyBwcmVzZW50IGluCisgKiBhIGJhc2ljIHJlc3BvbnNlLgorICovCisKK2ludCBPQ1NQX3Jlc3BfY291bnQoT0NTUF9CQVNJQ1JFU1AgKmJzKQorCXsKKwlpZiAoIWJzKSByZXR1cm4gLTE7CisJcmV0dXJuIHNrX09DU1BfU0lOR0xFUkVTUF9udW0oYnMtPnRic1Jlc3BvbnNlRGF0YS0+cmVzcG9uc2VzKTsKKwl9CisKKy8qIEV4dHJhY3QgYW4gT0NTUF9TSU5HTEVSRVNQIHJlc3BvbnNlIHdpdGggYSBnaXZlbiBpbmRleCAqLworCitPQ1NQX1NJTkdMRVJFU1AgKk9DU1BfcmVzcF9nZXQwKE9DU1BfQkFTSUNSRVNQICpicywgaW50IGlkeCkKKwl7CisJaWYgKCFicykgcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNrX09DU1BfU0lOR0xFUkVTUF92YWx1ZShicy0+dGJzUmVzcG9uc2VEYXRhLT5yZXNwb25zZXMsIGlkeCk7CisJfQorCisvKiBMb29rIHNpbmdsZSByZXNwb25zZSBtYXRjaGluZyBhIGdpdmVuIGNlcnRpZmljYXRlIElEICovCisKK2ludCBPQ1NQX3Jlc3BfZmluZChPQ1NQX0JBU0lDUkVTUCAqYnMsIE9DU1BfQ0VSVElEICppZCwgaW50IGxhc3QpCisJeworCWludCBpOworCVNUQUNLX09GKE9DU1BfU0lOR0xFUkVTUCkgKnNyZXNwOworCU9DU1BfU0lOR0xFUkVTUCAqc2luZ2xlOworCWlmICghYnMpIHJldHVybiAtMTsKKwlpZiAobGFzdCA8IDApIGxhc3QgPSAwOworCWVsc2UgbGFzdCsrOworCXNyZXNwID0gYnMtPnRic1Jlc3BvbnNlRGF0YS0+cmVzcG9uc2VzOworCWZvciAoaSA9IGxhc3Q7IGkgPCBza19PQ1NQX1NJTkdMRVJFU1BfbnVtKHNyZXNwKTsgaSsrKQorCQl7CisJCXNpbmdsZSA9IHNrX09DU1BfU0lOR0xFUkVTUF92YWx1ZShzcmVzcCwgaSk7CisJCWlmICghT0NTUF9pZF9jbXAoaWQsIHNpbmdsZS0+Y2VydElkKSkgcmV0dXJuIGk7CisJCX0KKwlyZXR1cm4gLTE7CisJfQorCisvKiBFeHRyYWN0IHN0YXR1cyBpbmZvcm1hdGlvbiBmcm9tIGFuIE9DU1BfU0lOR0xFUkVTUCBzdHJ1Y3R1cmUuCisgKiBOb3RlOiB0aGUgcmV2dGltZSBhbmQgcmVhc29uIHZhbHVlcyBhcmUgb25seSBzZXQgaWYgdGhlIAorICogY2VydGlmaWNhdGUgc3RhdHVzIGlzIHJldm9rZWQuIFJldHVybnMgbnVtZXJpY2FsIHZhbHVlIG9mCisgKiBzdGF0dXMuCisgKi8KKworaW50IE9DU1Bfc2luZ2xlX2dldDBfc3RhdHVzKE9DU1BfU0lOR0xFUkVTUCAqc2luZ2xlLCBpbnQgKnJlYXNvbiwKKwkJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqKnJldnRpbWUsCisJCQkJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKip0aGlzdXBkLAorCQkJCUFTTjFfR0VORVJBTElaRURUSU1FICoqbmV4dHVwZCkKKwl7CisJaW50IHJldDsKKwlPQ1NQX0NFUlRTVEFUVVMgKmNzdDsKKwlpZighc2luZ2xlKSByZXR1cm4gLTE7CisJY3N0ID0gc2luZ2xlLT5jZXJ0U3RhdHVzOworCXJldCA9IGNzdC0+dHlwZTsKKwlpZiAocmV0ID09IFZfT0NTUF9DRVJUU1RBVFVTX1JFVk9LRUQpCisJCXsKKwkJT0NTUF9SRVZPS0VESU5GTyAqcmV2ID0gY3N0LT52YWx1ZS5yZXZva2VkOworCQlpZiAocmV2dGltZSkgKnJldnRpbWUgPSByZXYtPnJldm9jYXRpb25UaW1lOworCQlpZiAocmVhc29uKSAKKwkJCXsKKwkJCWlmKHJldi0+cmV2b2NhdGlvblJlYXNvbikKKwkJCQkqcmVhc29uID0gQVNOMV9FTlVNRVJBVEVEX2dldChyZXYtPnJldm9jYXRpb25SZWFzb24pOworCQkJZWxzZSAqcmVhc29uID0gLTE7CisJCQl9CisJCX0KKwlpZih0aGlzdXBkKSAqdGhpc3VwZCA9IHNpbmdsZS0+dGhpc1VwZGF0ZTsKKwlpZihuZXh0dXBkKSAqbmV4dHVwZCA9IHNpbmdsZS0+bmV4dFVwZGF0ZTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogVGhpcyBmdW5jdGlvbiBjb21iaW5lcyB0aGUgcHJldmlvdXMgb25lczogbG9vayB1cCBhIGNlcnRpZmljYXRlIElEIGFuZAorICogaWYgZm91bmQgZXh0cmFjdCBzdGF0dXMgaW5mb3JtYXRpb24uIFJldHVybiAwIGlzIHN1Y2Nlc3NmdWwuCisgKi8KKworaW50IE9DU1BfcmVzcF9maW5kX3N0YXR1cyhPQ1NQX0JBU0lDUkVTUCAqYnMsIE9DU1BfQ0VSVElEICppZCwgaW50ICpzdGF0dXMsCisJCQkJaW50ICpyZWFzb24sCisJCQkJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKipyZXZ0aW1lLAorCQkJCUFTTjFfR0VORVJBTElaRURUSU1FICoqdGhpc3VwZCwKKwkJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqKm5leHR1cGQpCisJeworCWludCBpOworCU9DU1BfU0lOR0xFUkVTUCAqc2luZ2xlOworCWkgPSBPQ1NQX3Jlc3BfZmluZChicywgaWQsIC0xKTsKKwkvKiBNYXliZSBjaGVjayBmb3IgbXVsdGlwbGUgcmVzcG9uc2VzIGFuZCBnaXZlIGFuIGVycm9yPyAqLworCWlmKGkgPCAwKSByZXR1cm4gMDsKKwlzaW5nbGUgPSBPQ1NQX3Jlc3BfZ2V0MChicywgaSk7CisJaSA9IE9DU1Bfc2luZ2xlX2dldDBfc3RhdHVzKHNpbmdsZSwgcmVhc29uLCByZXZ0aW1lLCB0aGlzdXBkLCBuZXh0dXBkKTsKKwlpZihzdGF0dXMpICpzdGF0dXMgPSBpOworCXJldHVybiAxOworCX0KKworLyogQ2hlY2sgdmFsaWRpdHkgb2YgdGhpc1VwZGF0ZSBhbmQgbmV4dFVwZGF0ZSBmaWVsZHMuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHJlcXVlc3Qgd2lsbAorICogdGFrZSBhIGZldyBzZWNvbmRzIHRvIHByb2Nlc3MgYW5kL29yIHRoZSB0aW1lIHdvbnQgYmUgdG90YWxseSBhY2N1cmF0ZS4gVGhlcmVmb3JlIHRvIGF2b2lkCisgKiByZWplY3Rpbmcgb3RoZXJ3aXNlIHZhbGlkIHRpbWUgd2UgYWxsb3cgdGhlIHRpbWVzIHRvIGJlIHdpdGhpbiAnbnNlYycgb2YgdGhlIGN1cnJlbnQgdGltZS4KKyAqIEFsc28gdG8gYXZvaWQgYWNjZXB0aW5nIHZlcnkgb2xkIHJlc3BvbnNlcyB3aXRob3V0IGEgbmV4dFVwZGF0ZSBmaWVsZCBhbiBvcHRpb25hbCBtYXhhZ2UKKyAqIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIG1heGltdW0gYWdlIHRoZSB0aGlzVXBkYXRlIGZpZWxkIGNhbiBiZS4KKyAqLworCitpbnQgT0NTUF9jaGVja192YWxpZGl0eShBU04xX0dFTkVSQUxJWkVEVElNRSAqdGhpc3VwZCwgQVNOMV9HRU5FUkFMSVpFRFRJTUUgKm5leHR1cGQsIGxvbmcgbnNlYywgbG9uZyBtYXhzZWMpCisJeworCWludCByZXQgPSAxOworCXRpbWVfdCB0X25vdywgdF90bXA7CisJdGltZSgmdF9ub3cpOworCS8qIENoZWNrIHRoaXNVcGRhdGUgaXMgdmFsaWQgYW5kIG5vdCBtb3JlIHRoYW4gbnNlYyBpbiB0aGUgZnV0dXJlICovCisJaWYgKCFBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjayh0aGlzdXBkKSkKKwkJeworCQlPQ1NQZXJyKE9DU1BfRl9PQ1NQX0NIRUNLX1ZBTElESVRZLCBPQ1NQX1JfRVJST1JfSU5fVEhJU1VQREFURV9GSUVMRCk7CisJCXJldCA9IDA7CisJCX0KKwllbHNlIAorCQl7CisJCQl0X3RtcCA9IHRfbm93ICsgbnNlYzsKKwkJCWlmIChYNTA5X2NtcF90aW1lKHRoaXN1cGQsICZ0X3RtcCkgPiAwKQorCQkJeworCQkJT0NTUGVycihPQ1NQX0ZfT0NTUF9DSEVDS19WQUxJRElUWSwgT0NTUF9SX1NUQVRVU19OT1RfWUVUX1ZBTElEKTsKKwkJCXJldCA9IDA7CisJCQl9CisKKwkJLyogSWYgbWF4c2VjIHNwZWNpZmllZCBjaGVjayB0aGlzVXBkYXRlIGlzIG5vdCBtb3JlIHRoYW4gbWF4c2VjIGluIHRoZSBwYXN0ICovCisJCWlmIChtYXhzZWMgPj0gMCkKKwkJCXsKKwkJCXRfdG1wID0gdF9ub3cgLSBtYXhzZWM7CisJCQlpZiAoWDUwOV9jbXBfdGltZSh0aGlzdXBkLCAmdF90bXApIDwgMCkKKwkJCQl7CisJCQkJT0NTUGVycihPQ1NQX0ZfT0NTUF9DSEVDS19WQUxJRElUWSwgT0NTUF9SX1NUQVRVU19UT09fT0xEKTsKKwkJCQlyZXQgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQkKKworCWlmICghbmV4dHVwZCkgcmV0dXJuIHJldDsKKworCS8qIENoZWNrIG5leHRVcGRhdGUgaXMgdmFsaWQgYW5kIG5vdCBtb3JlIHRoYW4gbnNlYyBpbiB0aGUgcGFzdCAqLworCWlmICghQVNOMV9HRU5FUkFMSVpFRFRJTUVfY2hlY2sobmV4dHVwZCkpCisJCXsKKwkJT0NTUGVycihPQ1NQX0ZfT0NTUF9DSEVDS19WQUxJRElUWSwgT0NTUF9SX0VSUk9SX0lOX05FWFRVUERBVEVfRklFTEQpOworCQlyZXQgPSAwOworCQl9CisJZWxzZSAKKwkJeworCQl0X3RtcCA9IHRfbm93IC0gbnNlYzsKKwkJaWYgKFg1MDlfY21wX3RpbWUobmV4dHVwZCwgJnRfdG1wKSA8IDApCisJCQl7CisJCQlPQ1NQZXJyKE9DU1BfRl9PQ1NQX0NIRUNLX1ZBTElESVRZLCBPQ1NQX1JfU1RBVFVTX0VYUElSRUQpOworCQkJcmV0ID0gMDsKKwkJCX0KKwkJfQorCisJLyogQWxzbyBkb24ndCBhbGxvdyBuZXh0VXBkYXRlIHRvIHByZWNlZGUgdGhpc1VwZGF0ZSAqLworCWlmIChBU04xX1NUUklOR19jbXAobmV4dHVwZCwgdGhpc3VwZCkgPCAwKQorCQl7CisJCU9DU1BlcnIoT0NTUF9GX09DU1BfQ0hFQ0tfVkFMSURJVFksIE9DU1BfUl9ORVhUVVBEQVRFX0JFRk9SRV9USElTVVBEQVRFKTsKKwkJcmV0ID0gMDsKKwkJfQorCisJcmV0dXJuIHJldDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2VkY2VhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9lcnIuYwpAQCAtMCwwICsxLDE0MiBAQAorLyogY3J5cHRvL29jc3Avb2NzcF9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29jc3AuaD4KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworI2RlZmluZSBFUlJfRlVOQyhmdW5jKSBFUlJfUEFDSyhFUlJfTElCX09DU1AsZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9PQ1NQLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIE9DU1Bfc3RyX2Z1bmN0c1tdPQorCXsKK3tFUlJfRlVOQyhPQ1NQX0ZfQVNOMV9TVFJJTkdfRU5DT0RFKSwJIkFTTjFfU1RSSU5HX2VuY29kZSJ9LAore0VSUl9GVU5DKE9DU1BfRl9EMklfT0NTUF9OT05DRSksCSJEMklfT0NTUF9OT05DRSJ9LAore0VSUl9GVU5DKE9DU1BfRl9PQ1NQX0JBU0lDX0FERDFfU1RBVFVTKSwJIk9DU1BfYmFzaWNfYWRkMV9zdGF0dXMifSwKK3tFUlJfRlVOQyhPQ1NQX0ZfT0NTUF9CQVNJQ19TSUdOKSwJIk9DU1BfYmFzaWNfc2lnbiJ9LAore0VSUl9GVU5DKE9DU1BfRl9PQ1NQX0JBU0lDX1ZFUklGWSksCSJPQ1NQX2Jhc2ljX3ZlcmlmeSJ9LAore0VSUl9GVU5DKE9DU1BfRl9PQ1NQX0NFUlRfSURfTkVXKSwJIk9DU1BfY2VydF9pZF9uZXcifSwKK3tFUlJfRlVOQyhPQ1NQX0ZfT0NTUF9DSEVDS19ERUxFR0FURUQpLAkiT0NTUF9DSEVDS19ERUxFR0FURUQifSwKK3tFUlJfRlVOQyhPQ1NQX0ZfT0NTUF9DSEVDS19JRFMpLAkiT0NTUF9DSEVDS19JRFMifSwKK3tFUlJfRlVOQyhPQ1NQX0ZfT0NTUF9DSEVDS19JU1NVRVIpLAkiT0NTUF9DSEVDS19JU1NVRVIifSwKK3tFUlJfRlVOQyhPQ1NQX0ZfT0NTUF9DSEVDS19WQUxJRElUWSksCSJPQ1NQX2NoZWNrX3ZhbGlkaXR5In0sCit7RVJSX0ZVTkMoT0NTUF9GX09DU1BfTUFUQ0hfSVNTVUVSSUQpLAkiT0NTUF9NQVRDSF9JU1NVRVJJRCJ9LAore0VSUl9GVU5DKE9DU1BfRl9PQ1NQX1BBUlNFX1VSTCksCSJPQ1NQX3BhcnNlX3VybCJ9LAore0VSUl9GVU5DKE9DU1BfRl9PQ1NQX1JFUVVFU1RfU0lHTiksCSJPQ1NQX3JlcXVlc3Rfc2lnbiJ9LAore0VSUl9GVU5DKE9DU1BfRl9PQ1NQX1JFUVVFU1RfVkVSSUZZKSwJIk9DU1BfcmVxdWVzdF92ZXJpZnkifSwKK3tFUlJfRlVOQyhPQ1NQX0ZfT0NTUF9SRVNQT05TRV9HRVQxX0JBU0lDKSwJIk9DU1BfcmVzcG9uc2VfZ2V0MV9iYXNpYyJ9LAore0VSUl9GVU5DKE9DU1BfRl9PQ1NQX1NFTkRSRVFfQklPKSwJIk9DU1Bfc2VuZHJlcV9iaW8ifSwKK3tFUlJfRlVOQyhPQ1NQX0ZfT0NTUF9TRU5EUkVRX05CSU8pLAkiT0NTUF9zZW5kcmVxX25iaW8ifSwKK3tFUlJfRlVOQyhPQ1NQX0ZfUEFSU0VfSFRUUF9MSU5FMSksCSJQQVJTRV9IVFRQX0xJTkUxIn0sCit7RVJSX0ZVTkMoT0NTUF9GX1JFUVVFU1RfVkVSSUZZKSwJIlJFUVVFU1RfVkVSSUZZIn0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgT0NTUF9zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKE9DU1BfUl9CQURfREFUQSkgICAgICAgICAgICAgLCJiYWQgZGF0YSJ9LAore0VSUl9SRUFTT04oT0NTUF9SX0NFUlRJRklDQVRFX1ZFUklGWV9FUlJPUiksImNlcnRpZmljYXRlIHZlcmlmeSBlcnJvciJ9LAore0VSUl9SRUFTT04oT0NTUF9SX0RJR0VTVF9FUlIpICAgICAgICAgICAsImRpZ2VzdCBlcnIifSwKK3tFUlJfUkVBU09OKE9DU1BfUl9FUlJPUl9JTl9ORVhUVVBEQVRFX0ZJRUxEKSwiZXJyb3IgaW4gbmV4dHVwZGF0ZSBmaWVsZCJ9LAore0VSUl9SRUFTT04oT0NTUF9SX0VSUk9SX0lOX1RISVNVUERBVEVfRklFTEQpLCJlcnJvciBpbiB0aGlzdXBkYXRlIGZpZWxkIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfRVJST1JfUEFSU0lOR19VUkwpICAgICwiZXJyb3IgcGFyc2luZyB1cmwifSwKK3tFUlJfUkVBU09OKE9DU1BfUl9NSVNTSU5HX09DU1BTSUdOSU5HX1VTQUdFKSwibWlzc2luZyBvY3Nwc2lnbmluZyB1c2FnZSJ9LAore0VSUl9SRUFTT04oT0NTUF9SX05FWFRVUERBVEVfQkVGT1JFX1RISVNVUERBVEUpLCJuZXh0dXBkYXRlIGJlZm9yZSB0aGlzdXBkYXRlIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfTk9UX0JBU0lDX1JFU1BPTlNFKSAgICwibm90IGJhc2ljIHJlc3BvbnNlIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfTk9fQ0VSVElGSUNBVEVTX0lOX0NIQUlOKSwibm8gY2VydGlmaWNhdGVzIGluIGNoYWluIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfTk9fQ09OVEVOVCkgICAgICAgICAgICwibm8gY29udGVudCJ9LAore0VSUl9SRUFTT04oT0NTUF9SX05PX1BVQkxJQ19LRVkpICAgICAgICAsIm5vIHB1YmxpYyBrZXkifSwKK3tFUlJfUkVBU09OKE9DU1BfUl9OT19SRVNQT05TRV9EQVRBKSAgICAgLCJubyByZXNwb25zZSBkYXRhIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfTk9fUkVWT0tFRF9USU1FKSAgICAgICwibm8gcmV2b2tlZCB0aW1lIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfUFJJVkFURV9LRVlfRE9FU19OT1RfTUFUQ0hfQ0VSVElGSUNBVEUpLCJwcml2YXRlIGtleSBkb2VzIG5vdCBtYXRjaCBjZXJ0aWZpY2F0ZSJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1JFUVVFU1RfTk9UX1NJR05FRCkgICAsInJlcXVlc3Qgbm90IHNpZ25lZCJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1JFU1BPTlNFX0NPTlRBSU5TX05PX1JFVk9DQVRJT05fREFUQSksInJlc3BvbnNlIGNvbnRhaW5zIG5vIHJldm9jYXRpb24gZGF0YSJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1JPT1RfQ0FfTk9UX1RSVVNURUQpICAsInJvb3QgY2Egbm90IHRydXN0ZWQifSwKK3tFUlJfUkVBU09OKE9DU1BfUl9TRVJWRVJfUkVBRF9FUlJPUikgICAgLCJzZXJ2ZXIgcmVhZCBlcnJvciJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1NFUlZFUl9SRVNQT05TRV9FUlJPUiksInNlcnZlciByZXNwb25zZSBlcnJvciJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1NFUlZFUl9SRVNQT05TRV9QQVJTRV9FUlJPUiksInNlcnZlciByZXNwb25zZSBwYXJzZSBlcnJvciJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1NFUlZFUl9XUklURV9FUlJPUikgICAsInNlcnZlciB3cml0ZSBlcnJvciJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1NJR05BVFVSRV9GQUlMVVJFKSAgICAsInNpZ25hdHVyZSBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfU0lHTkVSX0NFUlRJRklDQVRFX05PVF9GT1VORCksInNpZ25lciBjZXJ0aWZpY2F0ZSBub3QgZm91bmQifSwKK3tFUlJfUkVBU09OKE9DU1BfUl9TVEFUVVNfRVhQSVJFRCkgICAgICAgLCJzdGF0dXMgZXhwaXJlZCJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1NUQVRVU19OT1RfWUVUX1ZBTElEKSAsInN0YXR1cyBub3QgeWV0IHZhbGlkIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfU1RBVFVTX1RPT19PTEQpICAgICAgICwic3RhdHVzIHRvbyBvbGQifSwKK3tFUlJfUkVBU09OKE9DU1BfUl9VTktOT1dOX01FU1NBR0VfRElHRVNUKSwidW5rbm93biBtZXNzYWdlIGRpZ2VzdCJ9LAore0VSUl9SRUFTT04oT0NTUF9SX1VOS05PV05fTklEKSAgICAgICAgICAsInVua25vd24gbmlkIn0sCit7RVJSX1JFQVNPTihPQ1NQX1JfVU5TVVBQT1JURURfUkVRVUVTVE9STkFNRV9UWVBFKSwidW5zdXBwb3J0ZWQgcmVxdWVzdG9ybmFtZSB0eXBlIn0sCit7MCxOVUxMfQorCX07CisKKyNlbmRpZgorCit2b2lkIEVSUl9sb2FkX09DU1Bfc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworCWlmIChFUlJfZnVuY19lcnJvcl9zdHJpbmcoT0NTUF9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxPQ1NQX3N0cl9mdW5jdHMpOworCQlFUlJfbG9hZF9zdHJpbmdzKDAsT0NTUF9zdHJfcmVhc29ucyk7CisJCX0KKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9vY3NwL29jc3BfZXh0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2V4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODg0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2V4dC5jCkBAIC0wLDAgKzEsNTE4IEBACisvKiBvY3NwX2V4dC5jICovCisvKiBXcml0dGVuIGJ5IFRvbSBUaXRjaGVuZXIgPFRvbV9UaXRjaGVuZXJAZ3Jvb3ZlLm5ldD4gZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LiAqLworCisvKiBIaXN0b3J5OgorICAgVGhpcyBmaWxlIHdhcyB0cmFuc2ZlcmVkIHRvIFJpY2hhcmQgTGV2aXR0ZSBmcm9tIENlcnRDbyBieSBLYXRoeQorICAgV2VpbmhvbGQgaW4gbWlkLXNwcmluZyAyMDAwIHRvIGJlIGluY2x1ZGVkIGluIE9wZW5TU0wgb3IgcmVsZWFzZWQKKyAgIGFzIGEgcGF0Y2gga2l0LiAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3J5cHRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29jc3AuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisvKiBTdGFuZGFyZCB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgZXh0ZW5zaW9ucyAqLworCisvKiBPQ1NQIHJlcXVlc3QgZXh0ZW5zaW9ucyAqLworCitpbnQgT0NTUF9SRVFVRVNUX2dldF9leHRfY291bnQoT0NTUF9SRVFVRVNUICp4KQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfY291bnQoeC0+dGJzUmVxdWVzdC0+cmVxdWVzdEV4dGVuc2lvbnMpKTsKKwl9CisKK2ludCBPQ1NQX1JFUVVFU1RfZ2V0X2V4dF9ieV9OSUQoT0NTUF9SRVFVRVNUICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X05JRCh4LT50YnNSZXF1ZXN0LT5yZXF1ZXN0RXh0ZW5zaW9ucyxuaWQsbGFzdHBvcykpOworCX0KKworaW50IE9DU1BfUkVRVUVTVF9nZXRfZXh0X2J5X09CSihPQ1NQX1JFUVVFU1QgKngsIEFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfYnlfT0JKKHgtPnRic1JlcXVlc3QtPnJlcXVlc3RFeHRlbnNpb25zLG9iaixsYXN0cG9zKSk7CisJfQorCitpbnQgT0NTUF9SRVFVRVNUX2dldF9leHRfYnlfY3JpdGljYWwoT0NTUF9SRVFVRVNUICp4LCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9ieV9jcml0aWNhbCh4LT50YnNSZXF1ZXN0LT5yZXF1ZXN0RXh0ZW5zaW9ucyxjcml0LGxhc3Rwb3MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpPQ1NQX1JFUVVFU1RfZ2V0X2V4dChPQ1NQX1JFUVVFU1QgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dCh4LT50YnNSZXF1ZXN0LT5yZXF1ZXN0RXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpPQ1NQX1JFUVVFU1RfZGVsZXRlX2V4dChPQ1NQX1JFUVVFU1QgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZGVsZXRlX2V4dCh4LT50YnNSZXF1ZXN0LT5yZXF1ZXN0RXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK3ZvaWQgKk9DU1BfUkVRVUVTVF9nZXQxX2V4dF9kMmkoT0NTUF9SRVFVRVNUICp4LCBpbnQgbmlkLCBpbnQgKmNyaXQsIGludCAqaWR4KQorCXsKKwlyZXR1cm4gWDUwOVYzX2dldF9kMmkoeC0+dGJzUmVxdWVzdC0+cmVxdWVzdEV4dGVuc2lvbnMsIG5pZCwgY3JpdCwgaWR4KTsKKwl9CisKK2ludCBPQ1NQX1JFUVVFU1RfYWRkMV9leHRfaTJkKE9DU1BfUkVRVUVTVCAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCXJldHVybiBYNTA5VjNfYWRkMV9pMmQoJngtPnRic1JlcXVlc3QtPnJlcXVlc3RFeHRlbnNpb25zLCBuaWQsIHZhbHVlLCBjcml0LCBmbGFncyk7CisJfQorCitpbnQgT0NTUF9SRVFVRVNUX2FkZF9leHQoT0NTUF9SRVFVRVNUICp4LCBYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfYWRkX2V4dCgmKHgtPnRic1JlcXVlc3QtPnJlcXVlc3RFeHRlbnNpb25zKSxleCxsb2MpICE9IE5VTEwpOworCX0KKworLyogU2luZ2xlIGV4dGVuc2lvbnMgKi8KKworaW50IE9DU1BfT05FUkVRX2dldF9leHRfY291bnQoT0NTUF9PTkVSRVEgKngpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9jb3VudCh4LT5zaW5nbGVSZXF1ZXN0RXh0ZW5zaW9ucykpOworCX0KKworaW50IE9DU1BfT05FUkVRX2dldF9leHRfYnlfTklEKE9DU1BfT05FUkVRICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X05JRCh4LT5zaW5nbGVSZXF1ZXN0RXh0ZW5zaW9ucyxuaWQsbGFzdHBvcykpOworCX0KKworaW50IE9DU1BfT05FUkVRX2dldF9leHRfYnlfT0JKKE9DU1BfT05FUkVRICp4LCBBU04xX09CSkVDVCAqb2JqLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X09CSih4LT5zaW5nbGVSZXF1ZXN0RXh0ZW5zaW9ucyxvYmosbGFzdHBvcykpOworCX0KKworaW50IE9DU1BfT05FUkVRX2dldF9leHRfYnlfY3JpdGljYWwoT0NTUF9PTkVSRVEgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X2NyaXRpY2FsKHgtPnNpbmdsZVJlcXVlc3RFeHRlbnNpb25zLGNyaXQsbGFzdHBvcykpOworCX0KKworWDUwOV9FWFRFTlNJT04gKk9DU1BfT05FUkVRX2dldF9leHQoT0NTUF9PTkVSRVEgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dCh4LT5zaW5nbGVSZXF1ZXN0RXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpPQ1NQX09ORVJFUV9kZWxldGVfZXh0KE9DU1BfT05FUkVRICp4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2RlbGV0ZV9leHQoeC0+c2luZ2xlUmVxdWVzdEV4dGVuc2lvbnMsbG9jKSk7CisJfQorCit2b2lkICpPQ1NQX09ORVJFUV9nZXQxX2V4dF9kMmkoT0NTUF9PTkVSRVEgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpCisJeworCXJldHVybiBYNTA5VjNfZ2V0X2QyaSh4LT5zaW5nbGVSZXF1ZXN0RXh0ZW5zaW9ucywgbmlkLCBjcml0LCBpZHgpOworCX0KKworaW50IE9DU1BfT05FUkVRX2FkZDFfZXh0X2kyZChPQ1NQX09ORVJFUSAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCXJldHVybiBYNTA5VjNfYWRkMV9pMmQoJngtPnNpbmdsZVJlcXVlc3RFeHRlbnNpb25zLCBuaWQsIHZhbHVlLCBjcml0LCBmbGFncyk7CisJfQorCitpbnQgT0NTUF9PTkVSRVFfYWRkX2V4dChPQ1NQX09ORVJFUSAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2FkZF9leHQoJih4LT5zaW5nbGVSZXF1ZXN0RXh0ZW5zaW9ucyksZXgsbG9jKSAhPSBOVUxMKTsKKwl9CisKKy8qIE9DU1AgQmFzaWMgcmVzcG9uc2UgKi8KKworaW50IE9DU1BfQkFTSUNSRVNQX2dldF9leHRfY291bnQoT0NTUF9CQVNJQ1JFU1AgKngpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9jb3VudCh4LT50YnNSZXNwb25zZURhdGEtPnJlc3BvbnNlRXh0ZW5zaW9ucykpOworCX0KKworaW50IE9DU1BfQkFTSUNSRVNQX2dldF9leHRfYnlfTklEKE9DU1BfQkFTSUNSRVNQICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X05JRCh4LT50YnNSZXNwb25zZURhdGEtPnJlc3BvbnNlRXh0ZW5zaW9ucyxuaWQsbGFzdHBvcykpOworCX0KKworaW50IE9DU1BfQkFTSUNSRVNQX2dldF9leHRfYnlfT0JKKE9DU1BfQkFTSUNSRVNQICp4LCBBU04xX09CSkVDVCAqb2JqLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X09CSih4LT50YnNSZXNwb25zZURhdGEtPnJlc3BvbnNlRXh0ZW5zaW9ucyxvYmosbGFzdHBvcykpOworCX0KKworaW50IE9DU1BfQkFTSUNSRVNQX2dldF9leHRfYnlfY3JpdGljYWwoT0NTUF9CQVNJQ1JFU1AgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X2NyaXRpY2FsKHgtPnRic1Jlc3BvbnNlRGF0YS0+cmVzcG9uc2VFeHRlbnNpb25zLGNyaXQsbGFzdHBvcykpOworCX0KKworWDUwOV9FWFRFTlNJT04gKk9DU1BfQkFTSUNSRVNQX2dldF9leHQoT0NTUF9CQVNJQ1JFU1AgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dCh4LT50YnNSZXNwb25zZURhdGEtPnJlc3BvbnNlRXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpPQ1NQX0JBU0lDUkVTUF9kZWxldGVfZXh0KE9DU1BfQkFTSUNSRVNQICp4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2RlbGV0ZV9leHQoeC0+dGJzUmVzcG9uc2VEYXRhLT5yZXNwb25zZUV4dGVuc2lvbnMsbG9jKSk7CisJfQorCit2b2lkICpPQ1NQX0JBU0lDUkVTUF9nZXQxX2V4dF9kMmkoT0NTUF9CQVNJQ1JFU1AgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpCisJeworCXJldHVybiBYNTA5VjNfZ2V0X2QyaSh4LT50YnNSZXNwb25zZURhdGEtPnJlc3BvbnNlRXh0ZW5zaW9ucywgbmlkLCBjcml0LCBpZHgpOworCX0KKworaW50IE9DU1BfQkFTSUNSRVNQX2FkZDFfZXh0X2kyZChPQ1NQX0JBU0lDUkVTUCAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCXJldHVybiBYNTA5VjNfYWRkMV9pMmQoJngtPnRic1Jlc3BvbnNlRGF0YS0+cmVzcG9uc2VFeHRlbnNpb25zLCBuaWQsIHZhbHVlLCBjcml0LCBmbGFncyk7CisJfQorCitpbnQgT0NTUF9CQVNJQ1JFU1BfYWRkX2V4dChPQ1NQX0JBU0lDUkVTUCAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2FkZF9leHQoJih4LT50YnNSZXNwb25zZURhdGEtPnJlc3BvbnNlRXh0ZW5zaW9ucyksZXgsbG9jKSAhPSBOVUxMKTsKKwl9CisKKy8qIE9DU1Agc2luZ2xlIHJlc3BvbnNlIGV4dGVuc2lvbnMgKi8KKworaW50IE9DU1BfU0lOR0xFUkVTUF9nZXRfZXh0X2NvdW50KE9DU1BfU0lOR0xFUkVTUCAqeCkKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2NvdW50KHgtPnNpbmdsZUV4dGVuc2lvbnMpKTsKKwl9CisKK2ludCBPQ1NQX1NJTkdMRVJFU1BfZ2V0X2V4dF9ieV9OSUQoT0NTUF9TSU5HTEVSRVNQICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X05JRCh4LT5zaW5nbGVFeHRlbnNpb25zLG5pZCxsYXN0cG9zKSk7CisJfQorCitpbnQgT0NTUF9TSU5HTEVSRVNQX2dldF9leHRfYnlfT0JKKE9DU1BfU0lOR0xFUkVTUCAqeCwgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGxhc3Rwb3MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9ieV9PQkooeC0+c2luZ2xlRXh0ZW5zaW9ucyxvYmosbGFzdHBvcykpOworCX0KKworaW50IE9DU1BfU0lOR0xFUkVTUF9nZXRfZXh0X2J5X2NyaXRpY2FsKE9DU1BfU0lOR0xFUkVTUCAqeCwgaW50IGNyaXQsIGludCBsYXN0cG9zKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfYnlfY3JpdGljYWwoeC0+c2luZ2xlRXh0ZW5zaW9ucyxjcml0LGxhc3Rwb3MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpPQ1NQX1NJTkdMRVJFU1BfZ2V0X2V4dChPQ1NQX1NJTkdMRVJFU1AgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dCh4LT5zaW5nbGVFeHRlbnNpb25zLGxvYykpOworCX0KKworWDUwOV9FWFRFTlNJT04gKk9DU1BfU0lOR0xFUkVTUF9kZWxldGVfZXh0KE9DU1BfU0lOR0xFUkVTUCAqeCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19kZWxldGVfZXh0KHgtPnNpbmdsZUV4dGVuc2lvbnMsbG9jKSk7CisJfQorCit2b2lkICpPQ1NQX1NJTkdMRVJFU1BfZ2V0MV9leHRfZDJpKE9DU1BfU0lOR0xFUkVTUCAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCkKKwl7CisJcmV0dXJuIFg1MDlWM19nZXRfZDJpKHgtPnNpbmdsZUV4dGVuc2lvbnMsIG5pZCwgY3JpdCwgaWR4KTsKKwl9CisKK2ludCBPQ1NQX1NJTkdMRVJFU1BfYWRkMV9leHRfaTJkKE9DU1BfU0lOR0xFUkVTUCAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCXJldHVybiBYNTA5VjNfYWRkMV9pMmQoJngtPnNpbmdsZUV4dGVuc2lvbnMsIG5pZCwgdmFsdWUsIGNyaXQsIGZsYWdzKTsKKwl9CisKK2ludCBPQ1NQX1NJTkdMRVJFU1BfYWRkX2V4dChPQ1NQX1NJTkdMRVJFU1AgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19hZGRfZXh0KCYoeC0+c2luZ2xlRXh0ZW5zaW9ucyksZXgsbG9jKSAhPSBOVUxMKTsKKwl9CisKKy8qIGFsc28gQ1JMIEVudHJ5IEV4dGVuc2lvbnMgKi8KKyNpZiAwCitBU04xX1NUUklORyAqQVNOMV9TVFJJTkdfZW5jb2RlKEFTTjFfU1RSSU5HICpzLCBpMmRfb2Zfdm9pZCAqaTJkLAorCQkJCXZvaWQgKmRhdGEsIFNUQUNLX09GKEFTTjFfT0JKRUNUKSAqc2spCisgICAgICAgIHsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpwLCAqYiA9IE5VTEw7CisKKwlpZiAoZGF0YSkKKwkgICAgICAgIHsKKwkJaWYgKChpPWkyZChkYXRhLE5VTEwpKSA8PSAwKSBnb3RvIGVycjsKKwkJaWYgKCEoYj1wPU9QRU5TU0xfbWFsbG9jKCh1bnNpZ25lZCBpbnQpaSkpKQorCQkJZ290byBlcnI7CisJICAgICAgICBpZiAoaTJkKGRhdGEsICZwKSA8PSAwKSBnb3RvIGVycjsKKwkJfQorCWVsc2UgaWYgKHNrKQorCSAgICAgICAgeworCQlpZiAoKGk9aTJkX0FTTjFfU0VUX09GX0FTTjFfT0JKRUNUKHNrLE5VTEwsCisJCQkJCQkgICAoSTJEX09GKEFTTjFfT0JKRUNUKSlpMmQsCisJCQkJCQkgICBWX0FTTjFfU0VRVUVOQ0UsCisJCQkJCQkgICBWX0FTTjFfVU5JVkVSU0FMLAorCQkJCQkJICAgSVNfU0VRVUVOQ0UpKTw9MCkgZ290byBlcnI7CisJCWlmICghKGI9cD1PUEVOU1NMX21hbGxvYygodW5zaWduZWQgaW50KWkpKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoaTJkX0FTTjFfU0VUX09GX0FTTjFfT0JKRUNUKHNrLCZwLChJMkRfT0YoQVNOMV9PQkpFQ1QpKWkyZCwKKwkJCQkJCVZfQVNOMV9TRVFVRU5DRSwKKwkJCQkJCVZfQVNOMV9VTklWRVJTQUwsCisJCQkJCQlJU19TRVFVRU5DRSk8PTApIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCU9DU1BlcnIoT0NTUF9GX0FTTjFfU1RSSU5HX0VOQ09ERSxPQ1NQX1JfQkFEX0RBVEEpOworCQlnb3RvIGVycjsKKwkJfQorCWlmICghcyAmJiAhKHMgPSBBU04xX1NUUklOR19uZXcoKSkpIGdvdG8gZXJyOworCWlmICghKEFTTjFfU1RSSU5HX3NldChzLCBiLCBpKSkpIGdvdG8gZXJyOworCU9QRU5TU0xfZnJlZShiKTsKKwlyZXR1cm4gczsKK2VycjoKKwlpZiAoYikgT1BFTlNTTF9mcmVlKGIpOworCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgorCisvKiBOb25jZSBoYW5kbGluZyBmdW5jdGlvbnMgKi8KKworLyogQWRkIGEgbm9uY2UgdG8gYW4gZXh0ZW5zaW9uIHN0YWNrLiBBIG5vbmNlIGNhbiBiZSBzcGVjaWZpY2VkIG9yIGlmIE5VTEwKKyAqIGEgcmFuZG9tIG5vbmNlIHdpbGwgYmUgZ2VuZXJhdGVkLgorICogTm90ZTogT3BlblNTTCAwLjkuN2QgYW5kIGxhdGVyIGNyZWF0ZSBhbiBPQ1RFVCBTVFJJTkcgY29udGFpbmluZyB0aGUgCisgKiBub25jZSwgcHJldmlvdXMgdmVyc2lvbnMgdXNlZCB0aGUgcmF3IG5vbmNlLgorICovCisKK3N0YXRpYyBpbnQgb2NzcF9hZGQxX25vbmNlKFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKmV4dHMsIHVuc2lnbmVkIGNoYXIgKnZhbCwgaW50IGxlbikKKwl7CisJdW5zaWduZWQgY2hhciAqdG1wdmFsOworCUFTTjFfT0NURVRfU1RSSU5HIG9zOworCWludCByZXQgPSAwOworCWlmIChsZW4gPD0gMCkgbGVuID0gT0NTUF9ERUZBVUxUX05PTkNFX0xFTkdUSDsKKwkvKiBDcmVhdGUgdGhlIE9DVEVUIFNUUklORyBtYW51YWxseSBieSB3cml0aW5nIG91dCB0aGUgaGVhZGVyIGFuZAorCSAqIGFwcGVuZGluZyB0aGUgY29udGVudCBvY3RldHMuIFRoaXMgYXZvaWRzIGFuIGV4dHJhIG1lbW9yeSBhbGxvY2F0aW9uCisJICogb3BlcmF0aW9uIGluIHNvbWUgY2FzZXMuIEFwcGxpY2F0aW9ucyBzaG91bGQgKk5PVCogZG8gdGhpcyBiZWNhdXNlCisgICAgICAgICAqIGl0IHJlbGllcyBvbiBsaWJyYXJ5IGludGVybmFscy4KKwkgKi8KKwlvcy5sZW5ndGggPSBBU04xX29iamVjdF9zaXplKDAsIGxlbiwgVl9BU04xX09DVEVUX1NUUklORyk7CisJb3MuZGF0YSA9IE9QRU5TU0xfbWFsbG9jKG9zLmxlbmd0aCk7CisJaWYgKG9zLmRhdGEgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJdG1wdmFsID0gb3MuZGF0YTsKKwlBU04xX3B1dF9vYmplY3QoJnRtcHZhbCwgMCwgbGVuLCBWX0FTTjFfT0NURVRfU1RSSU5HLCBWX0FTTjFfVU5JVkVSU0FMKTsKKwlpZiAodmFsKQorCQltZW1jcHkodG1wdmFsLCB2YWwsIGxlbik7CisJZWxzZQorCQlSQU5EX3BzZXVkb19ieXRlcyh0bXB2YWwsIGxlbik7CisJaWYoIVg1MDlWM19hZGQxX2kyZChleHRzLCBOSURfaWRfcGtpeF9PQ1NQX05vbmNlLAorCQkJJm9zLCAwLCBYNTA5VjNfQUREX1JFUExBQ0UpKQorCQkJCWdvdG8gZXJyOworCXJldCA9IDE7CisJZXJyOgorCWlmIChvcy5kYXRhKQorCQlPUEVOU1NMX2ZyZWUob3MuZGF0YSk7CisJcmV0dXJuIHJldDsKKwl9CisKKworLyogQWRkIG5vbmNlIHRvIGFuIE9DU1AgcmVxdWVzdCAqLworCitpbnQgT0NTUF9yZXF1ZXN0X2FkZDFfbm9uY2UoT0NTUF9SRVFVRVNUICpyZXEsIHVuc2lnbmVkIGNoYXIgKnZhbCwgaW50IGxlbikKKwl7CisJcmV0dXJuIG9jc3BfYWRkMV9ub25jZSgmcmVxLT50YnNSZXF1ZXN0LT5yZXF1ZXN0RXh0ZW5zaW9ucywgdmFsLCBsZW4pOworCX0KKworLyogU2FtZSBhcyBhYm92ZSBidXQgZm9yIGEgcmVzcG9uc2UgKi8KKworaW50IE9DU1BfYmFzaWNfYWRkMV9ub25jZShPQ1NQX0JBU0lDUkVTUCAqcmVzcCwgdW5zaWduZWQgY2hhciAqdmFsLCBpbnQgbGVuKQorCXsKKwlyZXR1cm4gb2NzcF9hZGQxX25vbmNlKCZyZXNwLT50YnNSZXNwb25zZURhdGEtPnJlc3BvbnNlRXh0ZW5zaW9ucywgdmFsLCBsZW4pOworCX0KKworLyogQ2hlY2sgbm9uY2UgdmFsaWRpdHkgaW4gYSByZXF1ZXN0IGFuZCByZXNwb25zZS4KKyAqIFJldHVybiB2YWx1ZSByZWZsZWN0cyByZXN1bHQ6CisgKiAgMTogbm9uY2VzIHByZXNlbnQgYW5kIGVxdWFsLgorICogIDI6IG5vbmNlcyBib3RoIGFic2VudC4KKyAqICAzOiBub25jZSBwcmVzZW50IGluIHJlc3BvbnNlIG9ubHkuCisgKiAgMDogbm9uY2VzIGJvdGggcHJlc2VudCBhbmQgbm90IGVxdWFsLgorICogLTE6IG5vbmNlIGluIHJlcXVlc3Qgb25seS4KKyAqCisgKiAgRm9yIG1vc3QgcmVzcG9uZGVycyBjbGllbnRzIGNhbiBjaGVjayByZXR1cm4gPiAwLgorICogIElmIHJlc3BvbmRlciBkb2Vzbid0IGhhbmRsZSBub25jZXMgcmV0dXJuICE9IDAgbWF5IGJlCisgKiAgbmVjZXNzYXJ5LiByZXR1cm4gPT0gMCBpcyBhbHdheXMgYW4gZXJyb3IuCisgKi8KKworaW50IE9DU1BfY2hlY2tfbm9uY2UoT0NTUF9SRVFVRVNUICpyZXEsIE9DU1BfQkFTSUNSRVNQICpicykKKwl7CisJLyoKKwkgKiBTaW5jZSB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mCisJICogdGhlIG5vbmNlIGFuZCBjb21wYXJpbmcgaXRzIHZhbHVlIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlCisJICogdGhlIFg1MDlWMyByb3V0aW5lczogdGhpcyB3YXkgd2UgY2FuIGF2b2lkIHRoZW0gYWxsb2NhdGluZyBhbgorCSAqIEFTTjFfT0NURVRfU1RSSU5HIHN0cnVjdHVyZSBmb3IgdGhlIHZhbHVlIHdoaWNoIHdvdWxkIGJlCisJICogZnJlZWQgaW1tZWRpYXRlbHkgYW55d2F5LgorCSAqLworCisJaW50IHJlcV9pZHgsIHJlc3BfaWR4OworCVg1MDlfRVhURU5TSU9OICpyZXFfZXh0LCAqcmVzcF9leHQ7CisJcmVxX2lkeCA9IE9DU1BfUkVRVUVTVF9nZXRfZXh0X2J5X05JRChyZXEsIE5JRF9pZF9wa2l4X09DU1BfTm9uY2UsIC0xKTsKKwlyZXNwX2lkeCA9IE9DU1BfQkFTSUNSRVNQX2dldF9leHRfYnlfTklEKGJzLCBOSURfaWRfcGtpeF9PQ1NQX05vbmNlLCAtMSk7CisJLyogQ2hlY2sgYm90aCBhYnNlbnQgKi8KKwlpZigocmVxX2lkeCA8IDApICYmIChyZXNwX2lkeCA8IDApKQorCQlyZXR1cm4gMjsKKwkvKiBDaGVjayBpbiByZXF1ZXN0IG9ubHkgKi8KKwlpZigocmVxX2lkeCA+PSAwKSAmJiAocmVzcF9pZHggPCAwKSkKKwkJcmV0dXJuIC0xOworCS8qIENoZWNrIGluIHJlc3BvbnNlIGJ1dCBub3QgcmVxdWVzdCAqLworCWlmKChyZXFfaWR4IDwgMCkgJiYgKHJlc3BfaWR4ID49IDApKQorCQlyZXR1cm4gMzsKKwkvKiBPdGhlcndpc2Ugbm9uY2UgaW4gcmVxdWVzdCBhbmQgcmVzcG9uc2Ugc28gcmV0cmlldmUgdGhlIGV4dGVuc2lvbnMgKi8KKwlyZXFfZXh0ID0gT0NTUF9SRVFVRVNUX2dldF9leHQocmVxLCByZXFfaWR4KTsKKwlyZXNwX2V4dCA9IE9DU1BfQkFTSUNSRVNQX2dldF9leHQoYnMsIHJlc3BfaWR4KTsKKwlpZihBU04xX09DVEVUX1NUUklOR19jbXAocmVxX2V4dC0+dmFsdWUsIHJlc3BfZXh0LT52YWx1ZSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworCX0KKworLyogQ29weSB0aGUgbm9uY2UgdmFsdWUgKGlmIGFueSkgZnJvbSBhbiBPQ1NQIHJlcXVlc3QgdG8gCisgKiBhIHJlc3BvbnNlLgorICovCisKK2ludCBPQ1NQX2NvcHlfbm9uY2UoT0NTUF9CQVNJQ1JFU1AgKnJlc3AsIE9DU1BfUkVRVUVTVCAqcmVxKQorCXsKKwlYNTA5X0VYVEVOU0lPTiAqcmVxX2V4dDsKKwlpbnQgcmVxX2lkeDsKKwkvKiBDaGVjayBmb3Igbm9uY2UgaW4gcmVxdWVzdCAqLworCXJlcV9pZHggPSBPQ1NQX1JFUVVFU1RfZ2V0X2V4dF9ieV9OSUQocmVxLCBOSURfaWRfcGtpeF9PQ1NQX05vbmNlLCAtMSk7CisJLyogSWYgbm8gbm9uY2UgdGhhdCdzIE9LICovCisJaWYgKHJlcV9pZHggPCAwKSByZXR1cm4gMjsKKwlyZXFfZXh0ID0gT0NTUF9SRVFVRVNUX2dldF9leHQocmVxLCByZXFfaWR4KTsKKwlyZXR1cm4gT0NTUF9CQVNJQ1JFU1BfYWRkX2V4dChyZXNwLCByZXFfZXh0LCAtMSk7CisJfQorCitYNTA5X0VYVEVOU0lPTiAqT0NTUF9jcmxJRF9uZXcoY2hhciAqdXJsLCBsb25nICpuLCBjaGFyICp0aW0pCisgICAgICAgIHsKKwlYNTA5X0VYVEVOU0lPTiAqeCA9IE5VTEw7CisJT0NTUF9DUkxJRCAqY2lkID0gTlVMTDsKKwkKKwlpZiAoIShjaWQgPSBPQ1NQX0NSTElEX25ldygpKSkgZ290byBlcnI7CisJaWYgKHVybCkKKwkgICAgICAgIHsKKwkJaWYgKCEoY2lkLT5jcmxVcmwgPSBBU04xX0lBNVNUUklOR19uZXcoKSkpIGdvdG8gZXJyOworCQlpZiAoIShBU04xX1NUUklOR19zZXQoY2lkLT5jcmxVcmwsIHVybCwgLTEpKSkgZ290byBlcnI7CisJCX0KKwlpZiAobikKKwkgICAgICAgIHsKKwkJaWYgKCEoY2lkLT5jcmxOdW0gPSBBU04xX0lOVEVHRVJfbmV3KCkpKSBnb3RvIGVycjsKKwkJaWYgKCEoQVNOMV9JTlRFR0VSX3NldChjaWQtPmNybE51bSwgKm4pKSkgZ290byBlcnI7CisJCX0KKwlpZiAodGltKQorCSAgICAgICAgeworCQlpZiAoIShjaWQtPmNybFRpbWUgPSBBU04xX0dFTkVSQUxJWkVEVElNRV9uZXcoKSkpIGdvdG8gZXJyOworCQlpZiAoIShBU04xX0dFTkVSQUxJWkVEVElNRV9zZXRfc3RyaW5nKGNpZC0+Y3JsVGltZSwgdGltKSkpIAorCQkgICAgICAgIGdvdG8gZXJyOworCQl9CisJeCA9IFg1MDlWM19FWFRfaTJkKE5JRF9pZF9wa2l4X09DU1BfQ3JsSUQsIDAsIGNpZCk7CitlcnI6CisJaWYgKGNpZCkgT0NTUF9DUkxJRF9mcmVlKGNpZCk7CisJcmV0dXJuIHg7CisJfQorCisvKiAgIEFjY2VwdGFibGVSZXNwb25zZXMgOjo9IFNFUVVFTkNFIE9GIE9CSkVDVCBJREVOVElGSUVSICovCitYNTA5X0VYVEVOU0lPTiAqT0NTUF9hY2NlcHRfcmVzcG9uc2VzX25ldyhjaGFyICoqb2lkcykKKyAgICAgICAgeworCWludCBuaWQ7CisJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICpzayA9IE5VTEw7CisJQVNOMV9PQkpFQ1QgKm8gPSBOVUxMOworICAgICAgICBYNTA5X0VYVEVOU0lPTiAqeCA9IE5VTEw7CisKKwlpZiAoIShzayA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCkpKSBnb3RvIGVycjsKKwl3aGlsZSAob2lkcyAmJiAqb2lkcykKKwkgICAgICAgIHsKKwkJaWYgKChuaWQ9T0JKX3R4dDJuaWQoKm9pZHMpKSE9TklEX3VuZGVmJiYobz1PQkpfbmlkMm9iaihuaWQpKSkgCisJCSAgICAgICAgc2tfQVNOMV9PQkpFQ1RfcHVzaChzaywgbyk7CisJCW9pZHMrKzsKKwkJfQorCXggPSBYNTA5VjNfRVhUX2kyZChOSURfaWRfcGtpeF9PQ1NQX2FjY2VwdGFibGVSZXNwb25zZXMsIDAsIHNrKTsKK2VycjoKKwlpZiAoc2spIHNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKHNrLCBBU04xX09CSkVDVF9mcmVlKTsKKwlyZXR1cm4geDsKKyAgICAgICAgfQorCisvKiAgQXJjaGl2ZUN1dG9mZiA6Oj0gR2VuZXJhbGl6ZWRUaW1lICovCitYNTA5X0VYVEVOU0lPTiAqT0NTUF9hcmNoaXZlX2N1dG9mZl9uZXcoY2hhciogdGltKQorICAgICAgICB7CisJWDUwOV9FWFRFTlNJT04gKng9TlVMTDsKKwlBU04xX0dFTkVSQUxJWkVEVElNRSAqZ3QgPSBOVUxMOworCisJaWYgKCEoZ3QgPSBBU04xX0dFTkVSQUxJWkVEVElNRV9uZXcoKSkpIGdvdG8gZXJyOworCWlmICghKEFTTjFfR0VORVJBTElaRURUSU1FX3NldF9zdHJpbmcoZ3QsIHRpbSkpKSBnb3RvIGVycjsKKwl4ID0gWDUwOVYzX0VYVF9pMmQoTklEX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmLCAwLCBndCk7CitlcnI6CisJaWYgKGd0KSBBU04xX0dFTkVSQUxJWkVEVElNRV9mcmVlKGd0KTsKKwlyZXR1cm4geDsKKwl9CisKKy8qIHBlciBBQ0NFU1NfREVTQ1JJUFRJT04gcGFyYW1ldGVyIGFyZSBvaWRzLCBvZiB3aGljaCB0aGVyZSBhcmUgY3VycmVudGx5CisgKiB0d28tLU5JRF9hZF9vY3NwLCBOSURfaWRfYWRfY2FJc3N1ZXJzLS1hbmQgR2VuZXJhbE5hbWUgdmFsdWUuICBUaGlzCisgKiBtZXRob2QgZm9yY2VzIE5JRF9hZF9vY3NwIGFuZCB1bmlmb3JtUmVzb3VyY2VMb2NhdG9yIFs2XSBJQTVTdHJpbmcuCisgKi8KK1g1MDlfRVhURU5TSU9OICpPQ1NQX3VybF9zdmNsb2NfbmV3KFg1MDlfTkFNRSogaXNzdWVyLCBjaGFyICoqdXJscykKKyAgICAgICAgeworCVg1MDlfRVhURU5TSU9OICp4ID0gTlVMTDsKKwlBU04xX0lBNVNUUklORyAqaWE1ID0gTlVMTDsKKwlPQ1NQX1NFUlZJQ0VMT0MgKnNsb2MgPSBOVUxMOworCUFDQ0VTU19ERVNDUklQVElPTiAqYWQgPSBOVUxMOworCQorCWlmICghKHNsb2MgPSBPQ1NQX1NFUlZJQ0VMT0NfbmV3KCkpKSBnb3RvIGVycjsKKwlpZiAoIShzbG9jLT5pc3N1ZXIgPSBYNTA5X05BTUVfZHVwKGlzc3VlcikpKSBnb3RvIGVycjsKKwlpZiAodXJscyAmJiAqdXJscyAmJiAhKHNsb2MtPmxvY2F0b3IgPSBza19BQ0NFU1NfREVTQ1JJUFRJT05fbmV3X251bGwoKSkpIGdvdG8gZXJyOworCXdoaWxlICh1cmxzICYmICp1cmxzKQorCSAgICAgICAgeworCQlpZiAoIShhZCA9IEFDQ0VTU19ERVNDUklQVElPTl9uZXcoKSkpIGdvdG8gZXJyOworCQlpZiAoIShhZC0+bWV0aG9kPU9CSl9uaWQyb2JqKE5JRF9hZF9PQ1NQKSkpIGdvdG8gZXJyOworCQlpZiAoIShhZC0+bG9jYXRpb24gPSBHRU5FUkFMX05BTUVfbmV3KCkpKSBnb3RvIGVycjsKKwkgICAgICAgIGlmICghKGlhNSA9IEFTTjFfSUE1U1RSSU5HX25ldygpKSkgZ290byBlcnI7CisJCWlmICghQVNOMV9TVFJJTkdfc2V0KChBU04xX1NUUklORyopaWE1LCAqdXJscywgLTEpKSBnb3RvIGVycjsKKwkJYWQtPmxvY2F0aW9uLT50eXBlID0gR0VOX1VSSTsKKwkJYWQtPmxvY2F0aW9uLT5kLmlhNSA9IGlhNTsKKwkJaWYgKCFza19BQ0NFU1NfREVTQ1JJUFRJT05fcHVzaChzbG9jLT5sb2NhdG9yLCBhZCkpIGdvdG8gZXJyOworCQl1cmxzKys7CisJCX0KKwl4ID0gWDUwOVYzX0VYVF9pMmQoTklEX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvciwgMCwgc2xvYyk7CitlcnI6CisJaWYgKHNsb2MpIE9DU1BfU0VSVklDRUxPQ19mcmVlKHNsb2MpOworCXJldHVybiB4OworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9odC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9odC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYmJmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX2h0LmMKQEAgLTAsMCArMSw0OTggQEAKKy8qIG9jc3BfaHQuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJlX29zLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vY3NwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2lmZGVmIE9QRU5TU0xfU1lTX1NVTk9TCisjZGVmaW5lIHN0cnRvdWwgKHVuc2lnbmVkIGxvbmcpc3RydG9sCisjZW5kaWYgLyogT1BFTlNTTF9TWVNfU1VOT1MgKi8KKworLyogU3RhdGVmdWwgT0NTUCByZXF1ZXN0IGNvZGUsIHN1cHBvcnRpbmcgbm9uLWJsb2NraW5nIEkvTyAqLworCisvKiBPcGFxdWUgT0NTUCByZXF1ZXN0IHN0YXR1cyBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IG9jc3BfcmVxX2N0eF9zdCB7CisJaW50IHN0YXRlOwkJLyogQ3VycmVudCBJL08gc3RhdGUgKi8KKwl1bnNpZ25lZCBjaGFyICppb2J1ZjsJLyogTGluZSBidWZmZXIgKi8KKwlpbnQgaW9idWZsZW47CQkvKiBMaW5lIGJ1ZmZlciBsZW5ndGggKi8KKwlCSU8gKmlvOwkJLyogQklPIHRvIHBlcmZvcm0gSS9PIHdpdGggKi8KKwlCSU8gKm1lbTsJCS8qIE1lbW9yeSBCSU8gcmVzcG9uc2UgaXMgYnVpbHQgaW50byAqLworCXVuc2lnbmVkIGxvbmcgYXNuMV9sZW47CS8qIEFTTjEgbGVuZ3RoIG9mIHJlc3BvbnNlICovCisJfTsKKworI2RlZmluZSBPQ1NQX01BWF9SRVFVRVNUX0xFTkdUSAkoMTAwICogMTAyNCkKKyNkZWZpbmUgT0NTUF9NQVhfTElORV9MRU4JNDA5NjsKKworLyogT0NTUCBzdGF0ZXMgKi8KKworLyogSWYgc2V0IG5vIHJlYWRpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCAqLworI2RlZmluZSBPSFNfTk9SRUFECQkweDEwMDAKKy8qIEVycm9yIGNvbmRpdGlvbiAqLworI2RlZmluZSBPSFNfRVJST1IJCSgwIHwgT0hTX05PUkVBRCkKKy8qIEZpcnN0IGxpbmUgYmVpbmcgcmVhZCAqLworI2RlZmluZSBPSFNfRklSU1RMSU5FCQkxCisvKiBNSU1FIGhlYWRlcnMgYmVpbmcgcmVhZCAqLworI2RlZmluZSBPSFNfSEVBREVSUwkJMgorLyogT0NTUCBpbml0aWFsIGhlYWRlciAodGFnICsgbGVuZ3RoKSBiZWluZyByZWFkICovCisjZGVmaW5lIE9IU19BU04xX0hFQURFUgkJMworLyogT0NTUCBjb250ZW50IG9jdGV0cyBiZWluZyByZWFkICovCisjZGVmaW5lIE9IU19BU04xX0NPTlRFTlQJNAorLyogUmVxdWVzdCBiZWluZyBzZW50ICovCisjZGVmaW5lIE9IU19BU04xX1dSSVRFCQkoNiB8IE9IU19OT1JFQUQpCisvKiBSZXF1ZXN0IGJlaW5nIGZsdXNoZWQgKi8KKyNkZWZpbmUgT0hTX0FTTjFfRkxVU0gJCSg3IHwgT0hTX05PUkVBRCkKKy8qIENvbXBsZXRlZCAqLworI2RlZmluZSBPSFNfRE9ORQkJKDggfCBPSFNfTk9SRUFEKQorCisKK3N0YXRpYyBpbnQgcGFyc2VfaHR0cF9saW5lMShjaGFyICpsaW5lKTsKKwordm9pZCBPQ1NQX1JFUV9DVFhfZnJlZShPQ1NQX1JFUV9DVFggKnJjdHgpCisJeworCWlmIChyY3R4LT5tZW0pCisJCUJJT19mcmVlKHJjdHgtPm1lbSk7CisJaWYgKHJjdHgtPmlvYnVmKQorCQlPUEVOU1NMX2ZyZWUocmN0eC0+aW9idWYpOworCU9QRU5TU0xfZnJlZShyY3R4KTsKKwl9CisKK2ludCBPQ1NQX1JFUV9DVFhfc2V0MV9yZXEoT0NTUF9SRVFfQ1RYICpyY3R4LCBPQ1NQX1JFUVVFU1QgKnJlcSkKKwl7CisJc3RhdGljIGNvbnN0IGNoYXIgcmVxX2hkcltdID0KKwkiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3NwLXJlcXVlc3RcclxuIgorCSJDb250ZW50LUxlbmd0aDogJWRcclxuXHJcbiI7CisgICAgICAgIGlmIChCSU9fcHJpbnRmKHJjdHgtPm1lbSwgcmVxX2hkciwgaTJkX09DU1BfUkVRVUVTVChyZXEsIE5VTEwpKSA8PSAwKQorCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKGkyZF9PQ1NQX1JFUVVFU1RfYmlvKHJjdHgtPm1lbSwgcmVxKSA8PSAwKQorCQlyZXR1cm4gMDsKKwlyY3R4LT5zdGF0ZSA9IE9IU19BU04xX1dSSVRFOworCXJjdHgtPmFzbjFfbGVuID0gQklPX2dldF9tZW1fZGF0YShyY3R4LT5tZW0sIE5VTEwpOworCXJldHVybiAxOworCX0KKworaW50IE9DU1BfUkVRX0NUWF9hZGQxX2hlYWRlcihPQ1NQX1JFUV9DVFggKnJjdHgsCisJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQorCXsKKwlpZiAoIW5hbWUpCisJCXJldHVybiAwOworCWlmIChCSU9fcHV0cyhyY3R4LT5tZW0sIG5hbWUpIDw9IDApCisJCXJldHVybiAwOworCWlmICh2YWx1ZSkKKwkJeworCQlpZiAoQklPX3dyaXRlKHJjdHgtPm1lbSwgIjogIiwgMikgIT0gMikKKwkJCXJldHVybiAwOworCQlpZiAoQklPX3B1dHMocmN0eC0+bWVtLCB2YWx1ZSkgPD0gMCkKKwkJCXJldHVybiAwOworCQl9CisJaWYgKEJJT193cml0ZShyY3R4LT5tZW0sICJcclxuIiwgMikgIT0gMikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CisJfQorCitPQ1NQX1JFUV9DVFggKk9DU1Bfc2VuZHJlcV9uZXcoQklPICppbywgY2hhciAqcGF0aCwgT0NTUF9SRVFVRVNUICpyZXEsCisJCQkJCQkJCWludCBtYXhsaW5lKQorCXsKKwlzdGF0aWMgY29uc3QgY2hhciBwb3N0X2hkcltdID0gIlBPU1QgJXMgSFRUUC8xLjBcclxuIjsKKworCU9DU1BfUkVRX0NUWCAqcmN0eDsKKwlyY3R4ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKE9DU1BfUkVRX0NUWCkpOworCXJjdHgtPnN0YXRlID0gT0hTX0VSUk9SOworCXJjdHgtPm1lbSA9IEJJT19uZXcoQklPX3NfbWVtKCkpOworCXJjdHgtPmlvID0gaW87CisJcmN0eC0+YXNuMV9sZW4gPSAwOworCWlmIChtYXhsaW5lID4gMCkKKwkJcmN0eC0+aW9idWZsZW4gPSBtYXhsaW5lOworCWVsc2UKKwkJcmN0eC0+aW9idWZsZW4gPSBPQ1NQX01BWF9MSU5FX0xFTjsKKwlyY3R4LT5pb2J1ZiA9IE9QRU5TU0xfbWFsbG9jKHJjdHgtPmlvYnVmbGVuKTsKKwlpZiAoIXJjdHgtPmlvYnVmKQorCQlyZXR1cm4gMDsKKwlpZiAoIXBhdGgpCisJCXBhdGggPSAiLyI7CisKKyAgICAgICAgaWYgKEJJT19wcmludGYocmN0eC0+bWVtLCBwb3N0X2hkciwgcGF0aCkgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocmVxICYmICFPQ1NQX1JFUV9DVFhfc2V0MV9yZXEocmN0eCwgcmVxKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcmN0eDsKKwl9CisKKy8qIFBhcnNlIHRoZSBIVFRQIHJlc3BvbnNlLiBUaGlzIHdpbGwgbG9vayBsaWtlIHRoaXM6CisgKiAiSFRUUC8xLjAgMjAwIE9LIi4gV2UgbmVlZCB0byBvYnRhaW4gdGhlIG51bWVyaWMgY29kZSBhbmQKKyAqIChvcHRpb25hbCkgaW5mb3JtYXRpb25hbCBtZXNzYWdlLgorICovCisKK3N0YXRpYyBpbnQgcGFyc2VfaHR0cF9saW5lMShjaGFyICpsaW5lKQorCXsKKwlpbnQgcmV0Y29kZTsKKwljaGFyICpwLCAqcSwgKnI7CisJLyogU2tpcCB0byBmaXJzdCB3aGl0ZSBzcGFjZSAocGFzc2VkIHByb3RvY29sIGluZm8pICovCisKKwlmb3IocCA9IGxpbmU7ICpwICYmICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpwKTsgcCsrKQorCQljb250aW51ZTsKKwlpZighKnApCisJCXsKKwkJT0NTUGVycihPQ1NQX0ZfUEFSU0VfSFRUUF9MSU5FMSwKKwkJCQkJT0NTUF9SX1NFUlZFUl9SRVNQT05TRV9QQVJTRV9FUlJPUik7CisJCXJldHVybiAwOworCQl9CisKKwkvKiBTa2lwIHBhc3Qgd2hpdGUgc3BhY2UgdG8gc3RhcnQgb2YgcmVzcG9uc2UgY29kZSAqLworCXdoaWxlKCpwICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnApKQorCQlwKys7CisKKwlpZighKnApCisJCXsKKwkJT0NTUGVycihPQ1NQX0ZfUEFSU0VfSFRUUF9MSU5FMSwKKwkJCQkJT0NTUF9SX1NFUlZFUl9SRVNQT05TRV9QQVJTRV9FUlJPUik7CisJCXJldHVybiAwOworCQl9CisKKwkvKiBGaW5kIGVuZCBvZiByZXNwb25zZSBjb2RlOiBmaXJzdCB3aGl0ZXNwYWNlIGFmdGVyIHN0YXJ0IG9mIGNvZGUgKi8KKwlmb3IocSA9IHA7ICpxICYmICFpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpxKTsgcSsrKQorCQljb250aW51ZTsKKworCWlmKCEqcSkKKwkJeworCQlPQ1NQZXJyKE9DU1BfRl9QQVJTRV9IVFRQX0xJTkUxLAorCQkJCQlPQ1NQX1JfU0VSVkVSX1JFU1BPTlNFX1BBUlNFX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCS8qIFNldCBlbmQgb2YgcmVzcG9uc2UgY29kZSBhbmQgc3RhcnQgb2YgbWVzc2FnZSAqLyAKKwkqcSsrID0gMDsKKworCS8qIEF0dGVtcHQgdG8gcGFyc2UgbnVtZXJpYyBjb2RlICovCisJcmV0Y29kZSA9IHN0cnRvdWwocCwgJnIsIDEwKTsKKworCWlmKCpyKQorCQlyZXR1cm4gMDsKKworCS8qIFNraXAgb3ZlciBhbnkgbGVhZGluZyB3aGl0ZSBzcGFjZSBpbiBtZXNzYWdlICovCisJd2hpbGUoKnEgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcSkpCisJCXErKzsKKworCWlmKCpxKQorCQl7CisJCS8qIEZpbmFsbHkgemFwIGFueSB0cmFpbGluZyB3aGl0ZSBzcGFjZSBpbiBtZXNzYWdlIChpbmNsdWRlCisJCSAqIENSTEYpICovCisKKwkJLyogV2Uga25vdyBxIGhhcyBhIG5vbiB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXIgc28gdGhpcyBpcyBPSyAqLworCQlmb3IociA9IHEgKyBzdHJsZW4ocSkgLSAxOyBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpyKTsgci0tKQorCQkJKnIgPSAwOworCQl9CisJaWYocmV0Y29kZSAhPSAyMDApCisJCXsKKwkJT0NTUGVycihPQ1NQX0ZfUEFSU0VfSFRUUF9MSU5FMSwgT0NTUF9SX1NFUlZFUl9SRVNQT05TRV9FUlJPUik7CisJCWlmKCEqcSkKKwkJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAiQ29kZT0iLCBwKTsKKwkJZWxzZQorCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJDb2RlPSIsIHAsICIsUmVhc29uPSIsIHEpOworCQlyZXR1cm4gMDsKKwkJfQorCisKKwlyZXR1cm4gMTsKKworCX0KKworaW50IE9DU1Bfc2VuZHJlcV9uYmlvKE9DU1BfUkVTUE9OU0UgKipwcmVzcCwgT0NTUF9SRVFfQ1RYICpyY3R4KQorCXsKKwlpbnQgaSwgbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCW5leHRfaW86CisJaWYgKCEocmN0eC0+c3RhdGUgJiBPSFNfTk9SRUFEKSkKKwkJeworCQluID0gQklPX3JlYWQocmN0eC0+aW8sIHJjdHgtPmlvYnVmLCByY3R4LT5pb2J1Zmxlbik7CisKKwkJaWYgKG4gPD0gMCkKKwkJCXsKKwkJCWlmIChCSU9fc2hvdWxkX3JldHJ5KHJjdHgtPmlvKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkvKiBXcml0ZSBkYXRhIHRvIG1lbW9yeSBCSU8gKi8KKworCQlpZiAoQklPX3dyaXRlKHJjdHgtPm1lbSwgcmN0eC0+aW9idWYsIG4pICE9IG4pCisJCQlyZXR1cm4gMDsKKwkJfQorCisJc3dpdGNoKHJjdHgtPnN0YXRlKQorCQl7CisKKwkJY2FzZSBPSFNfQVNOMV9XUklURToKKwkJbiA9IEJJT19nZXRfbWVtX2RhdGEocmN0eC0+bWVtLCAmcCk7CisKKwkJaSA9IEJJT193cml0ZShyY3R4LT5pbywKKwkJCXAgKyAobiAtIHJjdHgtPmFzbjFfbGVuKSwgcmN0eC0+YXNuMV9sZW4pOworCisJCWlmIChpIDw9IDApCisJCQl7CisJCQlpZiAoQklPX3Nob3VsZF9yZXRyeShyY3R4LT5pbykpCisJCQkJcmV0dXJuIC0xOworCQkJcmN0eC0+c3RhdGUgPSBPSFNfRVJST1I7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQlyY3R4LT5hc24xX2xlbiAtPSBpOworCisJCWlmIChyY3R4LT5hc24xX2xlbiA+IDApCisJCQlnb3RvIG5leHRfaW87CisKKwkJcmN0eC0+c3RhdGUgPSBPSFNfQVNOMV9GTFVTSDsKKworCQkodm9pZClCSU9fcmVzZXQocmN0eC0+bWVtKTsKKworCQljYXNlIE9IU19BU04xX0ZMVVNIOgorCisJCWkgPSBCSU9fZmx1c2gocmN0eC0+aW8pOworCisJCWlmIChpID4gMCkKKwkJCXsKKwkJCXJjdHgtPnN0YXRlID0gT0hTX0ZJUlNUTElORTsKKwkJCWdvdG8gbmV4dF9pbzsKKwkJCX0KKworCQlpZiAoQklPX3Nob3VsZF9yZXRyeShyY3R4LT5pbykpCisJCQlyZXR1cm4gLTE7CisKKwkJcmN0eC0+c3RhdGUgPSBPSFNfRVJST1I7CisJCXJldHVybiAwOworCisJCWNhc2UgT0hTX0VSUk9SOgorCQlyZXR1cm4gMDsKKworCQljYXNlIE9IU19GSVJTVExJTkU6CisJCWNhc2UgT0hTX0hFQURFUlM6CisKKwkJLyogQXR0ZW1wdCB0byByZWFkIGEgbGluZSBpbiAqLworCisJCW5leHRfbGluZToKKwkJLyogRHVlIHRvICYlXiokIiBtZW1vcnkgQklPIGJlaGF2aW91ciB3aXRoIEJJT19nZXRzIHdlCisJCSAqIGhhdmUgdG8gY2hlY2sgdGhlcmUncyBhIGNvbXBsZXRlIGxpbmUgaW4gdGhlcmUgYmVmb3JlCisJCSAqIGNhbGxpbmcgQklPX2dldHMgb3Igd2UnbGwganVzdCBnZXQgYSBwYXJ0aWFsIHJlYWQuCisJCSAqLworCQluID0gQklPX2dldF9tZW1fZGF0YShyY3R4LT5tZW0sICZwKTsKKwkJaWYgKChuIDw9IDApIHx8ICFtZW1jaHIocCwgJ1xuJywgbikpCisJCQl7CisJCQlpZiAobiA+PSByY3R4LT5pb2J1ZmxlbikKKwkJCQl7CisJCQkJcmN0eC0+c3RhdGUgPSBPSFNfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJZ290byBuZXh0X2lvOworCQkJfQorCQluID0gQklPX2dldHMocmN0eC0+bWVtLCAoY2hhciAqKXJjdHgtPmlvYnVmLCByY3R4LT5pb2J1Zmxlbik7CisKKwkJaWYgKG4gPD0gMCkKKwkJCXsKKwkJCWlmIChCSU9fc2hvdWxkX3JldHJ5KHJjdHgtPm1lbSkpCisJCQkJZ290byBuZXh0X2lvOworCQkJcmN0eC0+c3RhdGUgPSBPSFNfRVJST1I7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkvKiBEb24ndCBhbGxvdyBleGNlc3NpdmUgbGluZXMgKi8KKwkJaWYgKG4gPT0gcmN0eC0+aW9idWZsZW4pCisJCQl7CisJCQlyY3R4LT5zdGF0ZSA9IE9IU19FUlJPUjsKKwkJCXJldHVybiAwOworCQkJfQorCisJCS8qIEZpcnN0IGxpbmUgKi8KKwkJaWYgKHJjdHgtPnN0YXRlID09IE9IU19GSVJTVExJTkUpCisJCQl7CisJCQlpZiAocGFyc2VfaHR0cF9saW5lMSgoY2hhciAqKXJjdHgtPmlvYnVmKSkKKwkJCQl7CisJCQkJcmN0eC0+c3RhdGUgPSBPSFNfSEVBREVSUzsKKwkJCQlnb3RvIG5leHRfbGluZTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCXJjdHgtPnN0YXRlID0gT0hTX0VSUk9SOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJLyogTG9vayBmb3IgYmxhbmsgbGluZTogZW5kIG9mIGhlYWRlcnMgKi8KKwkJCWZvciAocCA9IHJjdHgtPmlvYnVmOyAqcDsgcCsrKQorCQkJCXsKKwkJCQlpZiAoKCpwICE9ICdccicpICYmICgqcCAhPSAnXG4nKSkKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJaWYgKCpwKQorCQkJCWdvdG8gbmV4dF9saW5lOworCisJCQlyY3R4LT5zdGF0ZSA9IE9IU19BU04xX0hFQURFUjsKKworCQkJfQorIAorCQkvKiBGYWxsIHRocnUgKi8KKworCisJCWNhc2UgT0hTX0FTTjFfSEVBREVSOgorCQkvKiBOb3cgcmVhZGluZyBBU04xIGhlYWRlcjogY2FuIHJlYWQgYXQgbGVhc3QgNiBieXRlcyB3aGljaAorCQkgKiBpcyBtb3JlIHRoYW4gZW5vdWdoIGZvciBhbnkgdmFsaWQgQVNOMSBTRVFVRU5DRSBoZWFkZXIKKwkJICovCisJCW4gPSBCSU9fZ2V0X21lbV9kYXRhKHJjdHgtPm1lbSwgJnApOworCQlpZiAobiA8IDYpCisJCQlnb3RvIG5leHRfaW87CisKKwkJLyogQ2hlY2sgaXQgaXMgYW4gQVNOMSBTRVFVRU5DRSAqLworCQlpZiAoKnArKyAhPSAoVl9BU04xX1NFUVVFTkNFfFZfQVNOMV9DT05TVFJVQ1RFRCkpCisJCQl7CisJCQlyY3R4LT5zdGF0ZSA9IE9IU19FUlJPUjsKKwkJCXJldHVybiAwOworCQkJfQorCisJCS8qIENoZWNrIG91dCBsZW5ndGggZmllbGQgKi8KKwkJaWYgKCpwICYgMHg4MCkKKwkJCXsKKwkJCW4gPSAqcCAmIDB4N0Y7CisJCQkvKiBOb3QgTkRFRiBvciBleGNlc3NpdmUgbGVuZ3RoICovCisJCQlpZiAoIW4gfHwgKG4gPiA0KSkKKwkJCQl7CisJCQkJcmN0eC0+c3RhdGUgPSBPSFNfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJcCsrOworCQkJcmN0eC0+YXNuMV9sZW4gPSAwOworCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJCQl7CisJCQkJcmN0eC0+YXNuMV9sZW4gPDw9IDg7CisJCQkJcmN0eC0+YXNuMV9sZW4gfD0gKnArKzsKKwkJCQl9CisKKwkJCWlmIChyY3R4LT5hc24xX2xlbiA+IE9DU1BfTUFYX1JFUVVFU1RfTEVOR1RIKQorCQkJCXsKKwkJCQlyY3R4LT5zdGF0ZSA9IE9IU19FUlJPUjsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisKKwkJCXJjdHgtPmFzbjFfbGVuICs9IG4gKyAyOworCQkJfQorCQllbHNlCisJCQlyY3R4LT5hc24xX2xlbiA9ICpwICsgMjsKKworCQlyY3R4LT5zdGF0ZSA9IE9IU19BU04xX0NPTlRFTlQ7CisKKwkJLyogRmFsbCB0aHJ1ICovCisJCQorCQljYXNlIE9IU19BU04xX0NPTlRFTlQ6CisJCW4gPSBCSU9fZ2V0X21lbV9kYXRhKHJjdHgtPm1lbSwgJnApOworCQlpZiAobiA8IChpbnQpcmN0eC0+YXNuMV9sZW4pCisJCQlnb3RvIG5leHRfaW87CisKKworCQkqcHJlc3AgPSBkMmlfT0NTUF9SRVNQT05TRShOVUxMLCAmcCwgcmN0eC0+YXNuMV9sZW4pOworCQlpZiAoKnByZXNwKQorCQkJeworCQkJcmN0eC0+c3RhdGUgPSBPSFNfRE9ORTsKKwkJCXJldHVybiAxOworCQkJfQorCisJCXJjdHgtPnN0YXRlID0gT0hTX0VSUk9SOworCQlyZXR1cm4gMDsKKworCQlicmVhazsKKworCQljYXNlIE9IU19ET05FOgorCQlyZXR1cm4gMTsKKworCQl9CisKKworCisJcmV0dXJuIDA7CisKKworCX0KKworLyogQmxvY2tpbmcgT0NTUCByZXF1ZXN0IGhhbmRsZXI6IG5vdyBhIHNwZWNpYWwgY2FzZSBvZiBub24tYmxvY2tpbmcgSS9PICovCisKK09DU1BfUkVTUE9OU0UgKk9DU1Bfc2VuZHJlcV9iaW8oQklPICpiLCBjaGFyICpwYXRoLCBPQ1NQX1JFUVVFU1QgKnJlcSkKKwl7CisJT0NTUF9SRVNQT05TRSAqcmVzcCA9IE5VTEw7CisJT0NTUF9SRVFfQ1RYICpjdHg7CisJaW50IHJ2OworCisJY3R4ID0gT0NTUF9zZW5kcmVxX25ldyhiLCBwYXRoLCByZXEsIC0xKTsKKworCWRvCisJCXsKKwkJcnYgPSBPQ1NQX3NlbmRyZXFfbmJpbygmcmVzcCwgY3R4KTsKKwkJfSB3aGlsZSAoKHJ2ID09IC0xKSAmJiBCSU9fc2hvdWxkX3JldHJ5KGIpKTsKKworCU9DU1BfUkVRX0NUWF9mcmVlKGN0eCk7CisKKwlpZiAocnYpCisJCXJldHVybiByZXNwOworCisJcmV0dXJuIE5VTEw7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vY3NwL29jc3BfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5MDVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9vY3NwL29jc3BfbGliLmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qIG9jc3BfbGliLmMgKi8KKy8qIFdyaXR0ZW4gYnkgVG9tIFRpdGNoZW5lciA8VG9tX1RpdGNoZW5lckBncm9vdmUubmV0PiBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuICovCisKKy8qIEhpc3Rvcnk6CisgICBUaGlzIGZpbGUgd2FzIHRyYW5zZmVyZWQgdG8gUmljaGFyZCBMZXZpdHRlIGZyb20gQ2VydENvIGJ5IEthdGh5CisgICBXZWluaG9sZCBpbiBtaWQtc3ByaW5nIDIwMDAgdG8gYmUgaW5jbHVkZWQgaW4gT3BlblNTTCBvciByZWxlYXNlZAorICAgYXMgYSBwYXRjaCBraXQuICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjcnlwdGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29jc3AuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisKKy8qIENvbnZlcnQgYSBjZXJ0aWZpY2F0ZSBhbmQgaXRzIGlzc3VlciB0byBhbiBPQ1NQX0NFUlRJRCAqLworCitPQ1NQX0NFUlRJRCAqT0NTUF9jZXJ0X3RvX2lkKGNvbnN0IEVWUF9NRCAqZGdzdCwgWDUwOSAqc3ViamVjdCwgWDUwOSAqaXNzdWVyKQoreworCVg1MDlfTkFNRSAqaW5hbWU7CisJQVNOMV9JTlRFR0VSICpzZXJpYWw7CisJQVNOMV9CSVRfU1RSSU5HICppa2V5OworI2lmbmRlZiBPUEVOU1NMX05PX1NIQTEKKwlpZighZGdzdCkgZGdzdCA9IEVWUF9zaGExKCk7CisjZW5kaWYKKwlpZiAoc3ViamVjdCkKKwkJeworCQlpbmFtZSA9IFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHN1YmplY3QpOworCQlzZXJpYWwgPSBYNTA5X2dldF9zZXJpYWxOdW1iZXIoc3ViamVjdCk7CisJCX0KKwllbHNlCisJCXsKKwkJaW5hbWUgPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoaXNzdWVyKTsKKwkJc2VyaWFsID0gTlVMTDsKKwkJfQorCWlrZXkgPSBYNTA5X2dldDBfcHVia2V5X2JpdHN0cihpc3N1ZXIpOworCXJldHVybiBPQ1NQX2NlcnRfaWRfbmV3KGRnc3QsIGluYW1lLCBpa2V5LCBzZXJpYWwpOworfQorCisKK09DU1BfQ0VSVElEICpPQ1NQX2NlcnRfaWRfbmV3KGNvbnN0IEVWUF9NRCAqZGdzdCwgCisJCQkgICAgICBYNTA5X05BTUUgKmlzc3Vlck5hbWUsIAorCQkJICAgICAgQVNOMV9CSVRfU1RSSU5HKiBpc3N1ZXJLZXksIAorCQkJICAgICAgQVNOMV9JTlRFR0VSICpzZXJpYWxOdW1iZXIpCisgICAgICAgIHsKKwlpbnQgbmlkOworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKwlYNTA5X0FMR09SICphbGc7CisJT0NTUF9DRVJUSUQgKmNpZCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBtZFtFVlBfTUFYX01EX1NJWkVdOworCisJaWYgKCEoY2lkID0gT0NTUF9DRVJUSURfbmV3KCkpKSBnb3RvIGVycjsKKworCWFsZyA9IGNpZC0+aGFzaEFsZ29yaXRobTsKKwlpZiAoYWxnLT5hbGdvcml0aG0gIT0gTlVMTCkgQVNOMV9PQkpFQ1RfZnJlZShhbGctPmFsZ29yaXRobSk7CisJaWYgKChuaWQgPSBFVlBfTURfdHlwZShkZ3N0KSkgPT0gTklEX3VuZGVmKQorCSAgICAgICAgeworCQlPQ1NQZXJyKE9DU1BfRl9PQ1NQX0NFUlRfSURfTkVXLE9DU1BfUl9VTktOT1dOX05JRCk7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCEoYWxnLT5hbGdvcml0aG09T0JKX25pZDJvYmoobmlkKSkpIGdvdG8gZXJyOworCWlmICgoYWxnLT5wYXJhbWV0ZXI9QVNOMV9UWVBFX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlhbGctPnBhcmFtZXRlci0+dHlwZT1WX0FTTjFfTlVMTDsKKworCWlmICghWDUwOV9OQU1FX2RpZ2VzdChpc3N1ZXJOYW1lLCBkZ3N0LCBtZCwgJmkpKSBnb3RvIGRpZ2VycjsKKwlpZiAoIShBU04xX09DVEVUX1NUUklOR19zZXQoY2lkLT5pc3N1ZXJOYW1lSGFzaCwgbWQsIGkpKSkgZ290byBlcnI7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGlzc3VlcktleSBoYXNoLCBleGNsdWRpbmcgdGFnIGFuZCBsZW5ndGggKi8KKwlFVlBfRGlnZXN0KGlzc3VlcktleS0+ZGF0YSwgaXNzdWVyS2V5LT5sZW5ndGgsIG1kLCAmaSwgZGdzdCwgTlVMTCk7CisKKwlpZiAoIShBU04xX09DVEVUX1NUUklOR19zZXQoY2lkLT5pc3N1ZXJLZXlIYXNoLCBtZCwgaSkpKSBnb3RvIGVycjsKKworCWlmIChzZXJpYWxOdW1iZXIpCisJCXsKKwkJQVNOMV9JTlRFR0VSX2ZyZWUoY2lkLT5zZXJpYWxOdW1iZXIpOworCQlpZiAoIShjaWQtPnNlcmlhbE51bWJlciA9IEFTTjFfSU5URUdFUl9kdXAoc2VyaWFsTnVtYmVyKSkpIGdvdG8gZXJyOworCQl9CisJcmV0dXJuIGNpZDsKK2RpZ2VycjoKKwlPQ1NQZXJyKE9DU1BfRl9PQ1NQX0NFUlRfSURfTkVXLE9DU1BfUl9ESUdFU1RfRVJSKTsKK2VycjoKKwlpZiAoY2lkKSBPQ1NQX0NFUlRJRF9mcmVlKGNpZCk7CisJcmV0dXJuIE5VTEw7CisJfQorCitpbnQgT0NTUF9pZF9pc3N1ZXJfY21wKE9DU1BfQ0VSVElEICphLCBPQ1NQX0NFUlRJRCAqYikKKwl7CisJaW50IHJldDsKKwlyZXQgPSBPQkpfY21wKGEtPmhhc2hBbGdvcml0aG0tPmFsZ29yaXRobSwgYi0+aGFzaEFsZ29yaXRobS0+YWxnb3JpdGhtKTsKKwlpZiAocmV0KSByZXR1cm4gcmV0OworCXJldCA9IEFTTjFfT0NURVRfU1RSSU5HX2NtcChhLT5pc3N1ZXJOYW1lSGFzaCwgYi0+aXNzdWVyTmFtZUhhc2gpOworCWlmIChyZXQpIHJldHVybiByZXQ7CisJcmV0dXJuIEFTTjFfT0NURVRfU1RSSU5HX2NtcChhLT5pc3N1ZXJLZXlIYXNoLCBiLT5pc3N1ZXJLZXlIYXNoKTsKKwl9CisKK2ludCBPQ1NQX2lkX2NtcChPQ1NQX0NFUlRJRCAqYSwgT0NTUF9DRVJUSUQgKmIpCisJeworCWludCByZXQ7CisJcmV0ID0gT0NTUF9pZF9pc3N1ZXJfY21wKGEsIGIpOworCWlmIChyZXQpIHJldHVybiByZXQ7CisJcmV0dXJuIEFTTjFfSU5URUdFUl9jbXAoYS0+c2VyaWFsTnVtYmVyLCBiLT5zZXJpYWxOdW1iZXIpOworCX0KKworCisvKiBQYXJzZSBhIFVSTCBhbmQgc3BsaXQgaXQgdXAgaW50byBob3N0LCBwb3J0IGFuZCBwYXRoIGNvbXBvbmVudHMgYW5kIHdoZXRoZXIKKyAqIGl0IGlzIFNTTC4KKyAqLworCitpbnQgT0NTUF9wYXJzZV91cmwoY2hhciAqdXJsLCBjaGFyICoqcGhvc3QsIGNoYXIgKipwcG9ydCwgY2hhciAqKnBwYXRoLCBpbnQgKnBzc2wpCisJeworCWNoYXIgKnAsICpidWY7CisKKwljaGFyICpob3N0LCAqcG9ydDsKKworCS8qIGR1cCB0aGUgYnVmZmVyIHNpbmNlIHdlIGFyZSBnb2luZyB0byBtZXNzIHdpdGggaXQgKi8KKwlidWYgPSBCVUZfc3RyZHVwKHVybCk7CisJaWYgKCFidWYpIGdvdG8gbWVtX2VycjsKKworCSpwaG9zdCA9IE5VTEw7CisJKnBwb3J0ID0gTlVMTDsKKwkqcHBhdGggPSBOVUxMOworCisJLyogQ2hlY2sgZm9yIGluaXRpYWwgY29sb24gKi8KKwlwID0gc3RyY2hyKGJ1ZiwgJzonKTsKKworCWlmICghcCkgZ290byBwYXJzZV9lcnI7CisKKwkqKHArKykgPSAnXDAnOworCisJaWYgKCFzdHJjbXAoYnVmLCAiaHR0cCIpKQorCQl7CisJCSpwc3NsID0gMDsKKwkJcG9ydCA9ICI4MCI7CisJCX0KKwllbHNlIGlmICghc3RyY21wKGJ1ZiwgImh0dHBzIikpCisJCXsKKwkJKnBzc2wgPSAxOworCQlwb3J0ID0gIjQ0MyI7CisJCX0KKwllbHNlCisJCWdvdG8gcGFyc2VfZXJyOworCisJLyogQ2hlY2sgZm9yIGRvdWJsZSBzbGFzaCAqLworCWlmICgocFswXSAhPSAnLycpIHx8IChwWzFdICE9ICcvJykpCisJCWdvdG8gcGFyc2VfZXJyOworCisJcCArPSAyOworCisJaG9zdCA9IHA7CisKKwkvKiBDaGVjayBmb3IgdHJhaWxpbmcgcGFydCBvZiBwYXRoICovCisKKwlwID0gc3RyY2hyKHAsICcvJyk7CisKKwlpZiAoIXApIAorCQkqcHBhdGggPSBCVUZfc3RyZHVwKCIvIik7CisJZWxzZQorCQl7CisJCSpwcGF0aCA9IEJVRl9zdHJkdXAocCk7CisJCS8qIFNldCBzdGFydCBvZiBwYXRoIHRvIDAgc28gaG9zdG5hbWUgaXMgdmFsaWQgKi8KKwkJKnAgPSAnXDAnOworCQl9CisKKwlpZiAoISpwcGF0aCkgZ290byBtZW1fZXJyOworCisJLyogTG9vayBmb3Igb3B0aW9uYWwgJzonIGZvciBwb3J0IG51bWJlciAqLworCWlmICgocCA9IHN0cmNocihob3N0LCAnOicpKSkKKwkJeworCQkqcCA9IDA7CisJCXBvcnQgPSBwICsgMTsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBOb3QgZm91bmQ6IHNldCBkZWZhdWx0IHBvcnQgKi8KKwkJaWYgKCpwc3NsKSBwb3J0ID0gIjQ0MyI7CisJCWVsc2UgcG9ydCA9ICI4MCI7CisJCX0KKworCSpwcG9ydCA9IEJVRl9zdHJkdXAocG9ydCk7CisJaWYgKCEqcHBvcnQpIGdvdG8gbWVtX2VycjsKKworCSpwaG9zdCA9IEJVRl9zdHJkdXAoaG9zdCk7CisKKwlpZiAoISpwaG9zdCkgZ290byBtZW1fZXJyOworCisJT1BFTlNTTF9mcmVlKGJ1Zik7CisKKwlyZXR1cm4gMTsKKworCW1lbV9lcnI6CisJT0NTUGVycihPQ1NQX0ZfT0NTUF9QQVJTRV9VUkwsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlnb3RvIGVycjsKKworCXBhcnNlX2VycjoKKwlPQ1NQZXJyKE9DU1BfRl9PQ1NQX1BBUlNFX1VSTCwgT0NTUF9SX0VSUk9SX1BBUlNJTkdfVVJMKTsKKworCisJZXJyOgorCWlmIChidWYpIE9QRU5TU0xfZnJlZShidWYpOworCWlmICgqcHBhdGgpIE9QRU5TU0xfZnJlZSgqcHBhdGgpOworCWlmICgqcHBvcnQpIE9QRU5TU0xfZnJlZSgqcHBvcnQpOworCWlmICgqcGhvc3QpIE9QRU5TU0xfZnJlZSgqcGhvc3QpOworCXJldHVybiAwOworCisJfQorCitJTVBMRU1FTlRfQVNOMV9EVVBfRlVOQ1RJT04oT0NTUF9DRVJUSUQpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX3Bybi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9wcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjk1YzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9wcm4uYwpAQCAtMCwwICsxLDI5MiBAQAorLyogb2NzcF9wcm4uYyAqLworLyogV3JpdHRlbiBieSBUb20gVGl0Y2hlbmVyIDxUb21fVGl0Y2hlbmVyQGdyb292ZS5uZXQ+IGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdC4gKi8KKworLyogSGlzdG9yeToKKyAgIFRoaXMgZmlsZSB3YXMgb3JpZ2luYWxseSBwYXJ0IG9mIG9jc3AuYyBhbmQgd2FzIHRyYW5zZmVyZWQgdG8gUmljaGFyZAorICAgTGV2aXR0ZSBmcm9tIENlcnRDbyBieSBLYXRoeSBXZWluaG9sZCBpbiBtaWQtc3ByaW5nIDIwMDAgdG8gYmUgaW5jbHVkZWQKKyAgIGluIE9wZW5TU0wgb3IgcmVsZWFzZWQgYXMgYSBwYXRjaCBraXQuICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2NzcC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKK3N0YXRpYyBpbnQgb2NzcF9jZXJ0aWRfcHJpbnQoQklPICpicCwgT0NTUF9DRVJUSUQqIGEsIGludCBpbmRlbnQpCisgICAgICAgIHsKKwlCSU9fcHJpbnRmKGJwLCAiJSpzQ2VydGlmaWNhdGUgSUQ6XG4iLCBpbmRlbnQsICIiKTsKKwlpbmRlbnQgKz0gMjsKKwlCSU9fcHJpbnRmKGJwLCAiJSpzSGFzaCBBbGdvcml0aG06ICIsIGluZGVudCwgIiIpOworCWkyYV9BU04xX09CSkVDVChicCwgYS0+aGFzaEFsZ29yaXRobS0+YWxnb3JpdGhtKTsKKwlCSU9fcHJpbnRmKGJwLCAiXG4lKnNJc3N1ZXIgTmFtZSBIYXNoOiAiLCBpbmRlbnQsICIiKTsKKwlpMmFfQVNOMV9TVFJJTkcoYnAsIGEtPmlzc3Vlck5hbWVIYXNoLCBWX0FTTjFfT0NURVRfU1RSSU5HKTsKKwlCSU9fcHJpbnRmKGJwLCAiXG4lKnNJc3N1ZXIgS2V5IEhhc2g6ICIsIGluZGVudCwgIiIpOworCWkyYV9BU04xX1NUUklORyhicCwgYS0+aXNzdWVyS2V5SGFzaCwgVl9BU04xX09DVEVUX1NUUklORyk7CisJQklPX3ByaW50ZihicCwgIlxuJSpzU2VyaWFsIE51bWJlcjogIiwgaW5kZW50LCAiIik7CisJaTJhX0FTTjFfSU5URUdFUihicCwgYS0+c2VyaWFsTnVtYmVyKTsKKwlCSU9fcHJpbnRmKGJwLCAiXG4iKTsKKwlyZXR1cm4gMTsKKwl9CisKK3R5cGVkZWYgc3RydWN0CisJeworCWxvbmcgdDsKKwljb25zdCBjaGFyICptOworCX0gT0NTUF9UQkxTVFI7CisKK3N0YXRpYyBjb25zdCBjaGFyICp0YWJsZTJzdHJpbmcobG9uZyBzLCBjb25zdCBPQ1NQX1RCTFNUUiAqdHMsIGludCBsZW4pCit7CisJY29uc3QgT0NTUF9UQkxTVFIgKnA7CisJZm9yIChwPXRzOyBwIDwgdHMgKyBsZW47IHArKykKKwkgICAgICAgIGlmIChwLT50ID09IHMpCisJCSAgICAgICAgIHJldHVybiBwLT5tOworCXJldHVybiAiKFVOS05PV04pIjsKK30KKworY29uc3QgY2hhciAqT0NTUF9yZXNwb25zZV9zdGF0dXNfc3RyKGxvbmcgcykKKyAgICAgICAgeworCXN0YXRpYyBjb25zdCBPQ1NQX1RCTFNUUiByc3RhdF90YmxbXSA9IHsKKwkgICAgICAgIHsgT0NTUF9SRVNQT05TRV9TVEFUVVNfU1VDQ0VTU0ZVTCwgInN1Y2Nlc3NmdWwiIH0sCisJICAgICAgICB7IE9DU1BfUkVTUE9OU0VfU1RBVFVTX01BTEZPUk1FRFJFUVVFU1QsICJtYWxmb3JtZWRyZXF1ZXN0IiB9LAorCSAgICAgICAgeyBPQ1NQX1JFU1BPTlNFX1NUQVRVU19JTlRFUk5BTEVSUk9SLCAiaW50ZXJuYWxlcnJvciIgfSwKKwkgICAgICAgIHsgT0NTUF9SRVNQT05TRV9TVEFUVVNfVFJZTEFURVIsICJ0cnlsYXRlciIgfSwKKwkgICAgICAgIHsgT0NTUF9SRVNQT05TRV9TVEFUVVNfU0lHUkVRVUlSRUQsICJzaWdyZXF1aXJlZCIgfSwKKwkgICAgICAgIHsgT0NTUF9SRVNQT05TRV9TVEFUVVNfVU5BVVRIT1JJWkVELCAidW5hdXRob3JpemVkIiB9IH07CisJcmV0dXJuIHRhYmxlMnN0cmluZyhzLCByc3RhdF90YmwsIDYpOworCX0gCisKK2NvbnN0IGNoYXIgKk9DU1BfY2VydF9zdGF0dXNfc3RyKGxvbmcgcykKKyAgICAgICAgeworCXN0YXRpYyBjb25zdCBPQ1NQX1RCTFNUUiBjc3RhdF90YmxbXSA9IHsKKwkgICAgICAgIHsgVl9PQ1NQX0NFUlRTVEFUVVNfR09PRCwgImdvb2QiIH0sCisJICAgICAgICB7IFZfT0NTUF9DRVJUU1RBVFVTX1JFVk9LRUQsICJyZXZva2VkIiB9LAorCSAgICAgICAgeyBWX09DU1BfQ0VSVFNUQVRVU19VTktOT1dOLCAidW5rbm93biIgfSB9OworCXJldHVybiB0YWJsZTJzdHJpbmcocywgY3N0YXRfdGJsLCAzKTsKKwl9IAorCitjb25zdCBjaGFyICpPQ1NQX2NybF9yZWFzb25fc3RyKGxvbmcgcykKKyAgICAgICAgeworCXN0YXRpYyBjb25zdCBPQ1NQX1RCTFNUUiByZWFzb25fdGJsW10gPSB7CisJICB7IE9DU1BfUkVWT0tFRF9TVEFUVVNfVU5TUEVDSUZJRUQsICJ1bnNwZWNpZmllZCIgfSwKKyAgICAgICAgICB7IE9DU1BfUkVWT0tFRF9TVEFUVVNfS0VZQ09NUFJPTUlTRSwgImtleUNvbXByb21pc2UiIH0sCisgICAgICAgICAgeyBPQ1NQX1JFVk9LRURfU1RBVFVTX0NBQ09NUFJPTUlTRSwgImNBQ29tcHJvbWlzZSIgfSwKKyAgICAgICAgICB7IE9DU1BfUkVWT0tFRF9TVEFUVVNfQUZGSUxJQVRJT05DSEFOR0VELCAiYWZmaWxpYXRpb25DaGFuZ2VkIiB9LAorICAgICAgICAgIHsgT0NTUF9SRVZPS0VEX1NUQVRVU19TVVBFUlNFREVELCAic3VwZXJzZWRlZCIgfSwKKyAgICAgICAgICB7IE9DU1BfUkVWT0tFRF9TVEFUVVNfQ0VTU0FUSU9OT0ZPUEVSQVRJT04sICJjZXNzYXRpb25PZk9wZXJhdGlvbiIgfSwKKyAgICAgICAgICB7IE9DU1BfUkVWT0tFRF9TVEFUVVNfQ0VSVElGSUNBVEVIT0xELCAiY2VydGlmaWNhdGVIb2xkIiB9LAorICAgICAgICAgIHsgT0NTUF9SRVZPS0VEX1NUQVRVU19SRU1PVkVGUk9NQ1JMLCAicmVtb3ZlRnJvbUNSTCIgfSB9OworCXJldHVybiB0YWJsZTJzdHJpbmcocywgcmVhc29uX3RibCwgOCk7CisJfSAKKworaW50IE9DU1BfUkVRVUVTVF9wcmludChCSU8gKmJwLCBPQ1NQX1JFUVVFU1QqIG8sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisgICAgICAgIHsKKwlpbnQgaTsKKwlsb25nIGw7CisJT0NTUF9DRVJUSUQqIGNpZCA9IE5VTEw7CisJT0NTUF9PTkVSRVEgKm9uZSA9IE5VTEw7CisJT0NTUF9SRVFJTkZPICppbmYgPSBvLT50YnNSZXF1ZXN0OworCU9DU1BfU0lHTkFUVVJFICpzaWcgPSBvLT5vcHRpb25hbFNpZ25hdHVyZTsKKworCWlmIChCSU9fd3JpdGUoYnAsIk9DU1AgUmVxdWVzdCBEYXRhOlxuIiwxOSkgPD0gMCkgZ290byBlcnI7CisJbD1BU04xX0lOVEVHRVJfZ2V0KGluZi0+dmVyc2lvbik7CisJaWYgKEJJT19wcmludGYoYnAsIiAgICBWZXJzaW9uOiAlbHUgKDB4JWx4KSIsbCsxLGwpIDw9IDApIGdvdG8gZXJyOworCWlmIChpbmYtPnJlcXVlc3Rvck5hbWUgIT0gTlVMTCkKKwkgICAgICAgIHsKKwkJaWYgKEJJT193cml0ZShicCwiXG4gICAgUmVxdWVzdG9yIE5hbWU6ICIsMjEpIDw9IDApIAorCQkgICAgICAgIGdvdG8gZXJyOworCQlHRU5FUkFMX05BTUVfcHJpbnQoYnAsIGluZi0+cmVxdWVzdG9yTmFtZSk7CisJCX0KKwlpZiAoQklPX3dyaXRlKGJwLCJcbiAgICBSZXF1ZXN0b3IgTGlzdDpcbiIsMjEpIDw9IDApIGdvdG8gZXJyOworCWZvciAoaSA9IDA7IGkgPCBza19PQ1NQX09ORVJFUV9udW0oaW5mLT5yZXF1ZXN0TGlzdCk7IGkrKykKKwkgICAgICAgIHsKKwkJb25lID0gc2tfT0NTUF9PTkVSRVFfdmFsdWUoaW5mLT5yZXF1ZXN0TGlzdCwgaSk7CisJCWNpZCA9IG9uZS0+cmVxQ2VydDsKKwkJb2NzcF9jZXJ0aWRfcHJpbnQoYnAsIGNpZCwgOCk7CisJCWlmICghWDUwOVYzX2V4dGVuc2lvbnNfcHJpbnQoYnAsCisJCQkJCSJSZXF1ZXN0IFNpbmdsZSBFeHRlbnNpb25zIiwKKwkJCQkJb25lLT5zaW5nbGVSZXF1ZXN0RXh0ZW5zaW9ucywgZmxhZ3MsIDgpKQorCQkJCQkJCWdvdG8gZXJyOworCQl9CisJaWYgKCFYNTA5VjNfZXh0ZW5zaW9uc19wcmludChicCwgIlJlcXVlc3QgRXh0ZW5zaW9ucyIsCisJCQlpbmYtPnJlcXVlc3RFeHRlbnNpb25zLCBmbGFncywgNCkpCisJCQkJCQkJZ290byBlcnI7CisJaWYgKHNpZykKKwkgICAgICAgIHsKKwkJWDUwOV9zaWduYXR1cmVfcHJpbnQoYnAsIHNpZy0+c2lnbmF0dXJlQWxnb3JpdGhtLCBzaWctPnNpZ25hdHVyZSk7CisJCWZvciAoaT0wOyBpPHNrX1g1MDlfbnVtKHNpZy0+Y2VydHMpOyBpKyspCisJCQl7CisJCQlYNTA5X3ByaW50KGJwLCBza19YNTA5X3ZhbHVlKHNpZy0+Y2VydHMsaSkpOworCQkJUEVNX3dyaXRlX2Jpb19YNTA5KGJwLHNrX1g1MDlfdmFsdWUoc2lnLT5jZXJ0cyxpKSk7CisJCQl9CisJCX0KKwlyZXR1cm4gMTsKK2VycjoKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBPQ1NQX1JFU1BPTlNFX3ByaW50KEJJTyAqYnAsIE9DU1BfUkVTUE9OU0UqIG8sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisgICAgICAgIHsKKwlpbnQgaSwgcmV0ID0gMDsKKwlsb25nIGw7CisJdW5zaWduZWQgY2hhciAqcDsKKwlPQ1NQX0NFUlRJRCAqY2lkID0gTlVMTDsKKwlPQ1NQX0JBU0lDUkVTUCAqYnIgPSBOVUxMOworCU9DU1BfUkVTUElEICpyaWQgPSBOVUxMOworCU9DU1BfUkVTUERBVEEgICpyZCA9IE5VTEw7CisJT0NTUF9DRVJUU1RBVFVTICpjc3QgPSBOVUxMOworCU9DU1BfUkVWT0tFRElORk8gKnJldiA9IE5VTEw7CisJT0NTUF9TSU5HTEVSRVNQICpzaW5nbGUgPSBOVUxMOworCU9DU1BfUkVTUEJZVEVTICpyYiA9IG8tPnJlc3BvbnNlQnl0ZXM7CisKKwlpZiAoQklPX3B1dHMoYnAsIk9DU1AgUmVzcG9uc2UgRGF0YTpcbiIpIDw9IDApIGdvdG8gZXJyOworCWw9QVNOMV9FTlVNRVJBVEVEX2dldChvLT5yZXNwb25zZVN0YXR1cyk7CisJaWYgKEJJT19wcmludGYoYnAsIiAgICBPQ1NQIFJlc3BvbnNlIFN0YXR1czogJXMgKDB4JWx4KVxuIiwKKwkJICAgICAgIE9DU1BfcmVzcG9uc2Vfc3RhdHVzX3N0cihsKSwgbCkgPD0gMCkgZ290byBlcnI7CisJaWYgKHJiID09IE5VTEwpIHJldHVybiAxOworICAgICAgICBpZiAoQklPX3B1dHMoYnAsIiAgICBSZXNwb25zZSBUeXBlOiAiKSA8PSAwKQorCSAgICAgICAgZ290byBlcnI7CisJaWYoaTJhX0FTTjFfT0JKRUNUKGJwLCByYi0+cmVzcG9uc2VUeXBlKSA8PSAwKQorCSAgICAgICAgZ290byBlcnI7CisJaWYgKE9CSl9vYmoybmlkKHJiLT5yZXNwb25zZVR5cGUpICE9IE5JRF9pZF9wa2l4X09DU1BfYmFzaWMpIAorCSAgICAgICAgeworCQlCSU9fcHV0cyhicCwiICh1bmtub3duIHJlc3BvbnNlIHR5cGUpXG4iKTsKKwkJcmV0dXJuIDE7CisJCX0KKworCXAgPSBBU04xX1NUUklOR19kYXRhKHJiLT5yZXNwb25zZSk7CisJaSA9IEFTTjFfU1RSSU5HX2xlbmd0aChyYi0+cmVzcG9uc2UpOworCWlmICghKGJyID0gT0NTUF9yZXNwb25zZV9nZXQxX2Jhc2ljKG8pKSkgZ290byBlcnI7CisJcmQgPSBici0+dGJzUmVzcG9uc2VEYXRhOworCWw9QVNOMV9JTlRFR0VSX2dldChyZC0+dmVyc2lvbik7CisJaWYgKEJJT19wcmludGYoYnAsIlxuICAgIFZlcnNpb246ICVsdSAoMHglbHgpXG4iLAorCQkgICAgICAgbCsxLGwpIDw9IDApIGdvdG8gZXJyOworCWlmIChCSU9fcHV0cyhicCwiICAgIFJlc3BvbmRlciBJZDogIikgPD0gMCkgZ290byBlcnI7CisKKwlyaWQgPSAgcmQtPnJlc3BvbmRlcklkOworCXN3aXRjaCAocmlkLT50eXBlKQorCQl7CisJCWNhc2UgVl9PQ1NQX1JFU1BJRF9OQU1FOgorCQkgICAgICAgIFg1MDlfTkFNRV9wcmludF9leChicCwgcmlkLT52YWx1ZS5ieU5hbWUsIDAsIFhOX0ZMQUdfT05FTElORSk7CisJCSAgICAgICAgYnJlYWs7CisJCWNhc2UgVl9PQ1NQX1JFU1BJRF9LRVk6CisJCSAgICAgICAgaTJhX0FTTjFfU1RSSU5HKGJwLCByaWQtPnZhbHVlLmJ5S2V5LCBWX0FTTjFfT0NURVRfU1RSSU5HKTsKKwkJICAgICAgICBicmVhazsKKwkJfQorCisJaWYgKEJJT19wcmludGYoYnAsIlxuICAgIFByb2R1Y2VkIEF0OiAiKTw9MCkgZ290byBlcnI7CisJaWYgKCFBU04xX0dFTkVSQUxJWkVEVElNRV9wcmludChicCwgcmQtPnByb2R1Y2VkQXQpKSBnb3RvIGVycjsKKwlpZiAoQklPX3ByaW50ZihicCwiXG4gICAgUmVzcG9uc2VzOlxuIikgPD0gMCkgZ290byBlcnI7CisJZm9yIChpID0gMDsgaSA8IHNrX09DU1BfU0lOR0xFUkVTUF9udW0ocmQtPnJlc3BvbnNlcyk7IGkrKykKKwkgICAgICAgIHsKKwkJaWYgKCEgc2tfT0NTUF9TSU5HTEVSRVNQX3ZhbHVlKHJkLT5yZXNwb25zZXMsIGkpKSBjb250aW51ZTsKKwkJc2luZ2xlID0gc2tfT0NTUF9TSU5HTEVSRVNQX3ZhbHVlKHJkLT5yZXNwb25zZXMsIGkpOworCQljaWQgPSBzaW5nbGUtPmNlcnRJZDsKKwkJaWYob2NzcF9jZXJ0aWRfcHJpbnQoYnAsIGNpZCwgNCkgPD0gMCkgZ290byBlcnI7CisJCWNzdCA9IHNpbmdsZS0+Y2VydFN0YXR1czsKKwkJaWYgKEJJT19wcmludGYoYnAsIiAgICBDZXJ0IFN0YXR1czogJXMiLAorCQkJICAgICAgIE9DU1BfY2VydF9zdGF0dXNfc3RyKGNzdC0+dHlwZSkpIDw9IDApCisJCSAgICAgICAgZ290byBlcnI7CisJCWlmIChjc3QtPnR5cGUgPT0gVl9PQ1NQX0NFUlRTVEFUVVNfUkVWT0tFRCkKKwkJICAgICAgICB7CisJCSAgICAgICAgcmV2ID0gY3N0LT52YWx1ZS5yZXZva2VkOworCQkJaWYgKEJJT19wcmludGYoYnAsICJcbiAgICBSZXZvY2F0aW9uIFRpbWU6ICIpIDw9IDApIAorCQkJICAgICAgICBnb3RvIGVycjsKKwkJCWlmICghQVNOMV9HRU5FUkFMSVpFRFRJTUVfcHJpbnQoYnAsIAorCQkJCQkJCXJldi0+cmV2b2NhdGlvblRpbWUpKSAKKwkJCQlnb3RvIGVycjsKKwkJCWlmIChyZXYtPnJldm9jYXRpb25SZWFzb24pIAorCQkJICAgICAgICB7CisJCQkJbD1BU04xX0VOVU1FUkFURURfZ2V0KHJldi0+cmV2b2NhdGlvblJlYXNvbik7CisJCQkJaWYgKEJJT19wcmludGYoYnAsIAorCQkJCQkgIlxuICAgIFJldm9jYXRpb24gUmVhc29uOiAlcyAoMHglbHgpIiwKKwkJCQkJICAgICAgIE9DU1BfY3JsX3JlYXNvbl9zdHIobCksIGwpIDw9IDApCisJCQkJICAgICAgICBnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWlmIChCSU9fcHJpbnRmKGJwLCJcbiAgICBUaGlzIFVwZGF0ZTogIikgPD0gMCkgZ290byBlcnI7CisJCWlmICghQVNOMV9HRU5FUkFMSVpFRFRJTUVfcHJpbnQoYnAsIHNpbmdsZS0+dGhpc1VwZGF0ZSkpIAorCQkJZ290byBlcnI7CisJCWlmIChzaW5nbGUtPm5leHRVcGRhdGUpCisJCSAgICAgICAgeworCQkJaWYgKEJJT19wcmludGYoYnAsIlxuICAgIE5leHQgVXBkYXRlOiAiKSA8PSAwKWdvdG8gZXJyOworCQkJaWYgKCFBU04xX0dFTkVSQUxJWkVEVElNRV9wcmludChicCxzaW5nbGUtPm5leHRVcGRhdGUpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlcnI7CisJCWlmICghWDUwOVYzX2V4dGVuc2lvbnNfcHJpbnQoYnAsCisJCQkJCSJSZXNwb25zZSBTaW5nbGUgRXh0ZW5zaW9ucyIsCisJCQkJCXNpbmdsZS0+c2luZ2xlRXh0ZW5zaW9ucywgZmxhZ3MsIDgpKQorCQkJCQkJCWdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCJcbiIsMSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZiAoIVg1MDlWM19leHRlbnNpb25zX3ByaW50KGJwLCAiUmVzcG9uc2UgRXh0ZW5zaW9ucyIsCisJCQkJCXJkLT5yZXNwb25zZUV4dGVuc2lvbnMsIGZsYWdzLCA0KSkKKwkJCQkJCQlnb3RvIGVycjsKKwlpZihYNTA5X3NpZ25hdHVyZV9wcmludChicCwgYnItPnNpZ25hdHVyZUFsZ29yaXRobSwgYnItPnNpZ25hdHVyZSkgPD0gMCkKKwkJCQkJCQlnb3RvIGVycjsKKworCWZvciAoaT0wOyBpPHNrX1g1MDlfbnVtKGJyLT5jZXJ0cyk7IGkrKykKKwkJeworCQlYNTA5X3ByaW50KGJwLCBza19YNTA5X3ZhbHVlKGJyLT5jZXJ0cyxpKSk7CisJCVBFTV93cml0ZV9iaW9fWDUwOShicCxza19YNTA5X3ZhbHVlKGJyLT5jZXJ0cyxpKSk7CisJCX0KKworCXJldCA9IDE7CitlcnI6CisJT0NTUF9CQVNJQ1JFU1BfZnJlZShicik7CisJcmV0dXJuIHJldDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX3Nydi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9zcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzYwNmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF9zcnYuYwpAQCAtMCwwICsxLDI2NCBAQAorLyogb2NzcF9zcnYuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjcnlwdGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29jc3AuaD4KKworLyogVXRpbGl0eSBmdW5jdGlvbnMgcmVsYXRlZCB0byBzZW5kaW5nIE9DU1AgcmVzcG9uc2VzIGFuZCBleHRyYWN0aW5nCisgKiByZWxldmFudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXF1ZXN0LgorICovCisKK2ludCBPQ1NQX3JlcXVlc3Rfb25lcmVxX2NvdW50KE9DU1BfUkVRVUVTVCAqcmVxKQorCXsKKwlyZXR1cm4gc2tfT0NTUF9PTkVSRVFfbnVtKHJlcS0+dGJzUmVxdWVzdC0+cmVxdWVzdExpc3QpOworCX0KKworT0NTUF9PTkVSRVEgKk9DU1BfcmVxdWVzdF9vbmVyZXFfZ2V0MChPQ1NQX1JFUVVFU1QgKnJlcSwgaW50IGkpCisJeworCXJldHVybiBza19PQ1NQX09ORVJFUV92YWx1ZShyZXEtPnRic1JlcXVlc3QtPnJlcXVlc3RMaXN0LCBpKTsKKwl9CisKK09DU1BfQ0VSVElEICpPQ1NQX29uZXJlcV9nZXQwX2lkKE9DU1BfT05FUkVRICpvbmUpCisJeworCXJldHVybiBvbmUtPnJlcUNlcnQ7CisJfQorCitpbnQgT0NTUF9pZF9nZXQwX2luZm8oQVNOMV9PQ1RFVF9TVFJJTkcgKipwaU5hbWVIYXNoLCBBU04xX09CSkVDVCAqKnBtZCwKKwkJCUFTTjFfT0NURVRfU1RSSU5HICoqcGlrZXlIYXNoLAorCQkJQVNOMV9JTlRFR0VSICoqcHNlcmlhbCwgT0NTUF9DRVJUSUQgKmNpZCkKKwl7CisJaWYgKCFjaWQpIHJldHVybiAwOworCWlmIChwbWQpICpwbWQgPSBjaWQtPmhhc2hBbGdvcml0aG0tPmFsZ29yaXRobTsKKwlpZihwaU5hbWVIYXNoKSAqcGlOYW1lSGFzaCA9IGNpZC0+aXNzdWVyTmFtZUhhc2g7CisJaWYgKHBpa2V5SGFzaCkgKnBpa2V5SGFzaCA9IGNpZC0+aXNzdWVyS2V5SGFzaDsKKwlpZiAocHNlcmlhbCkgKnBzZXJpYWwgPSBjaWQtPnNlcmlhbE51bWJlcjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBPQ1NQX3JlcXVlc3RfaXNfc2lnbmVkKE9DU1BfUkVRVUVTVCAqcmVxKQorCXsKKwlpZihyZXEtPm9wdGlvbmFsU2lnbmF0dXJlKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKKy8qIENyZWF0ZSBhbiBPQ1NQIHJlc3BvbnNlIGFuZCBlbmNvZGUgYW4gb3B0aW9uYWwgYmFzaWMgcmVzcG9uc2UgKi8KK09DU1BfUkVTUE9OU0UgKk9DU1BfcmVzcG9uc2VfY3JlYXRlKGludCBzdGF0dXMsIE9DU1BfQkFTSUNSRVNQICpicykKKyAgICAgICAgeworICAgICAgICBPQ1NQX1JFU1BPTlNFICpyc3AgPSBOVUxMOworCisJaWYgKCEocnNwID0gT0NTUF9SRVNQT05TRV9uZXcoKSkpIGdvdG8gZXJyOworCWlmICghKEFTTjFfRU5VTUVSQVRFRF9zZXQocnNwLT5yZXNwb25zZVN0YXR1cywgc3RhdHVzKSkpIGdvdG8gZXJyOworCWlmICghYnMpIHJldHVybiByc3A7CisJaWYgKCEocnNwLT5yZXNwb25zZUJ5dGVzID0gT0NTUF9SRVNQQllURVNfbmV3KCkpKSBnb3RvIGVycjsKKwlyc3AtPnJlc3BvbnNlQnl0ZXMtPnJlc3BvbnNlVHlwZSA9IE9CSl9uaWQyb2JqKE5JRF9pZF9wa2l4X09DU1BfYmFzaWMpOworCWlmICghQVNOMV9pdGVtX3BhY2soYnMsIEFTTjFfSVRFTV9ycHRyKE9DU1BfQkFTSUNSRVNQKSwgJnJzcC0+cmVzcG9uc2VCeXRlcy0+cmVzcG9uc2UpKQorCQkJCWdvdG8gZXJyOworCXJldHVybiByc3A7CitlcnI6CisJaWYgKHJzcCkgT0NTUF9SRVNQT05TRV9mcmVlKHJzcCk7CisJcmV0dXJuIE5VTEw7CisJfQorCisKK09DU1BfU0lOR0xFUkVTUCAqT0NTUF9iYXNpY19hZGQxX3N0YXR1cyhPQ1NQX0JBU0lDUkVTUCAqcnNwLAorCQkJCQkJT0NTUF9DRVJUSUQgKmNpZCwKKwkJCQkJCWludCBzdGF0dXMsIGludCByZWFzb24sCisJCQkJCQlBU04xX1RJTUUgKnJldnRpbWUsCisJCQkJCUFTTjFfVElNRSAqdGhpc3VwZCwgQVNOMV9USU1FICpuZXh0dXBkKQorCXsKKwlPQ1NQX1NJTkdMRVJFU1AgKnNpbmdsZSA9IE5VTEw7CisJT0NTUF9DRVJUU1RBVFVTICpjczsKKwlPQ1NQX1JFVk9LRURJTkZPICpyaTsKKworCWlmKCFyc3AtPnRic1Jlc3BvbnNlRGF0YS0+cmVzcG9uc2VzICYmCisJICAgICEocnNwLT50YnNSZXNwb25zZURhdGEtPnJlc3BvbnNlcyA9IHNrX09DU1BfU0lOR0xFUkVTUF9uZXdfbnVsbCgpKSkKKwkJZ290byBlcnI7CisKKwlpZiAoIShzaW5nbGUgPSBPQ1NQX1NJTkdMRVJFU1BfbmV3KCkpKQorCQlnb3RvIGVycjsKKworCisKKwlpZiAoIUFTTjFfVElNRV90b19nZW5lcmFsaXplZHRpbWUodGhpc3VwZCwgJnNpbmdsZS0+dGhpc1VwZGF0ZSkpCisJCWdvdG8gZXJyOworCWlmIChuZXh0dXBkICYmCisJCSFBU04xX1RJTUVfdG9fZ2VuZXJhbGl6ZWR0aW1lKG5leHR1cGQsICZzaW5nbGUtPm5leHRVcGRhdGUpKQorCQlnb3RvIGVycjsKKworCU9DU1BfQ0VSVElEX2ZyZWUoc2luZ2xlLT5jZXJ0SWQpOworCisJaWYoIShzaW5nbGUtPmNlcnRJZCA9IE9DU1BfQ0VSVElEX2R1cChjaWQpKSkKKwkJZ290byBlcnI7CisKKwljcyA9IHNpbmdsZS0+Y2VydFN0YXR1czsKKwlzd2l0Y2goY3MtPnR5cGUgPSBzdGF0dXMpCisJCXsKKwljYXNlIFZfT0NTUF9DRVJUU1RBVFVTX1JFVk9LRUQ6CisJCWlmICghcmV2dGltZSkKKwkJICAgICAgICB7CisJCSAgICAgICAgT0NTUGVycihPQ1NQX0ZfT0NTUF9CQVNJQ19BREQxX1NUQVRVUyxPQ1NQX1JfTk9fUkVWT0tFRF9USU1FKTsKKwkJCWdvdG8gZXJyOworCQkgICAgICAgIH0KKwkJaWYgKCEoY3MtPnZhbHVlLnJldm9rZWQgPSByaSA9IE9DU1BfUkVWT0tFRElORk9fbmV3KCkpKSBnb3RvIGVycjsKKwkJaWYgKCFBU04xX1RJTUVfdG9fZ2VuZXJhbGl6ZWR0aW1lKHJldnRpbWUsICZyaS0+cmV2b2NhdGlvblRpbWUpKQorCQkJZ290byBlcnI7CQorCQlpZiAocmVhc29uICE9IE9DU1BfUkVWT0tFRF9TVEFUVVNfTk9TVEFUVVMpCisJCSAgICAgICAgeworCQkJaWYgKCEocmktPnJldm9jYXRpb25SZWFzb24gPSBBU04xX0VOVU1FUkFURURfbmV3KCkpKSAKKwkJCSAgICAgICAgZ290byBlcnI7CisJCQlpZiAoIShBU04xX0VOVU1FUkFURURfc2V0KHJpLT5yZXZvY2F0aW9uUmVhc29uLCAKKwkJCQkJCSAgcmVhc29uKSkpCisJCQkgICAgICAgIGdvdG8gZXJyOwkKKwkJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZfT0NTUF9DRVJUU1RBVFVTX0dPT0Q6CisJCWNzLT52YWx1ZS5nb29kID0gQVNOMV9OVUxMX25ldygpOworCQlicmVhazsKKworCWNhc2UgVl9PQ1NQX0NFUlRTVEFUVVNfVU5LTk9XTjoKKwkJY3MtPnZhbHVlLnVua25vd24gPSBBU04xX05VTExfbmV3KCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZ290byBlcnI7CisKKwkJfQorCWlmICghKHNrX09DU1BfU0lOR0xFUkVTUF9wdXNoKHJzcC0+dGJzUmVzcG9uc2VEYXRhLT5yZXNwb25zZXMsIHNpbmdsZSkpKQorCQlnb3RvIGVycjsKKwlyZXR1cm4gc2luZ2xlOworZXJyOgorCU9DU1BfU0lOR0xFUkVTUF9mcmVlKHNpbmdsZSk7CisJcmV0dXJuIE5VTEw7CisJfQorCisvKiBBZGQgYSBjZXJ0aWZpY2F0ZSB0byBhbiBPQ1NQIHJlcXVlc3QgKi8KKworaW50IE9DU1BfYmFzaWNfYWRkMV9jZXJ0KE9DU1BfQkFTSUNSRVNQICpyZXNwLCBYNTA5ICpjZXJ0KQorCXsKKwlpZiAoIXJlc3AtPmNlcnRzICYmICEocmVzcC0+Y2VydHMgPSBza19YNTA5X25ld19udWxsKCkpKQorCQlyZXR1cm4gMDsKKworCWlmKCFza19YNTA5X3B1c2gocmVzcC0+Y2VydHMsIGNlcnQpKSByZXR1cm4gMDsKKwlDUllQVE9fYWRkKCZjZXJ0LT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19YNTA5KTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBPQ1NQX2Jhc2ljX3NpZ24oT0NTUF9CQVNJQ1JFU1AgKmJyc3AsIAorCQkJWDUwOSAqc2lnbmVyLCBFVlBfUEtFWSAqa2V5LCBjb25zdCBFVlBfTUQgKmRnc3QsCisJCQlTVEFDS19PRihYNTA5KSAqY2VydHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisgICAgICAgIHsKKwlpbnQgaTsKKwlPQ1NQX1JFU1BJRCAqcmlkOworCisJaWYgKCFYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KHNpZ25lciwga2V5KSkKKwkJeworCQlPQ1NQZXJyKE9DU1BfRl9PQ1NQX0JBU0lDX1NJR04sIE9DU1BfUl9QUklWQVRFX0tFWV9ET0VTX05PVF9NQVRDSF9DRVJUSUZJQ0FURSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZighKGZsYWdzICYgT0NTUF9OT0NFUlRTKSkKKwkJeworCQlpZighT0NTUF9iYXNpY19hZGQxX2NlcnQoYnJzcCwgc2lnbmVyKSkKKwkJCWdvdG8gZXJyOworCQlmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9udW0oY2VydHMpOyBpKyspCisJCQl7CisJCQlYNTA5ICp0bXBjZXJ0ID0gc2tfWDUwOV92YWx1ZShjZXJ0cywgaSk7CisJCQlpZighT0NTUF9iYXNpY19hZGQxX2NlcnQoYnJzcCwgdG1wY2VydCkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCXJpZCA9IGJyc3AtPnRic1Jlc3BvbnNlRGF0YS0+cmVzcG9uZGVySWQ7CisJaWYgKGZsYWdzICYgT0NTUF9SRVNQSURfS0VZKQorCQl7CisJCXVuc2lnbmVkIGNoYXIgbWRbU0hBX0RJR0VTVF9MRU5HVEhdOworCQlYNTA5X3B1YmtleV9kaWdlc3Qoc2lnbmVyLCBFVlBfc2hhMSgpLCBtZCwgTlVMTCk7CisJCWlmICghKHJpZC0+dmFsdWUuYnlLZXkgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKSkpCisJCQlnb3RvIGVycjsKKwkJaWYgKCEoQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KHJpZC0+dmFsdWUuYnlLZXksIG1kLCBTSEFfRElHRVNUX0xFTkdUSCkpKQorCQkJCWdvdG8gZXJyOworCQlyaWQtPnR5cGUgPSBWX09DU1BfUkVTUElEX0tFWTsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIVg1MDlfTkFNRV9zZXQoJnJpZC0+dmFsdWUuYnlOYW1lLAorCQkJCQlYNTA5X2dldF9zdWJqZWN0X25hbWUoc2lnbmVyKSkpCisJCQkJZ290byBlcnI7CisJCXJpZC0+dHlwZSA9IFZfT0NTUF9SRVNQSURfTkFNRTsKKwkJfQorCisJaWYgKCEoZmxhZ3MgJiBPQ1NQX05PVElNRSkgJiYKKwkJIVg1MDlfZ210aW1lX2FkaihicnNwLT50YnNSZXNwb25zZURhdGEtPnByb2R1Y2VkQXQsIDApKQorCQlnb3RvIGVycjsKKworCS8qIFJpZ2h0IG5vdywgSSB0aGluayB0aGF0IG5vdCBkb2luZyBkb3VibGUgaGFzaGluZyBpcyB0aGUgcmlnaHQKKwkgICB0aGluZy4JLS0gUmljaGFyZCBMZXZpdHRlICovCisKKwlpZiAoIU9DU1BfQkFTSUNSRVNQX3NpZ24oYnJzcCwga2V5LCBkZ3N0LCAwKSkgZ290byBlcnI7CisKKwlyZXR1cm4gMTsKK2VycjoKKwlyZXR1cm4gMDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb2NzcC9vY3NwX3ZmeS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF92ZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTVkNjdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29jc3Avb2NzcF92ZnkuYwpAQCAtMCwwICsxLDQ0NiBAQAorLyogb2NzcF92ZnkuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vY3NwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIGludCBvY3NwX2ZpbmRfc2lnbmVyKFg1MDkgKipwc2lnbmVyLCBPQ1NQX0JBU0lDUkVTUCAqYnMsIFNUQUNLX09GKFg1MDkpICpjZXJ0cywKKwkJCQlYNTA5X1NUT1JFICpzdCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitzdGF0aWMgWDUwOSAqb2NzcF9maW5kX3NpZ25lcl9zayhTVEFDS19PRihYNTA5KSAqY2VydHMsIE9DU1BfUkVTUElEICppZCk7CitzdGF0aWMgaW50IG9jc3BfY2hlY2tfaXNzdWVyKE9DU1BfQkFTSUNSRVNQICpicywgU1RBQ0tfT0YoWDUwOSkgKmNoYWluLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3N0YXRpYyBpbnQgb2NzcF9jaGVja19pZHMoU1RBQ0tfT0YoT0NTUF9TSU5HTEVSRVNQKSAqc3Jlc3AsIE9DU1BfQ0VSVElEICoqcmV0KTsKK3N0YXRpYyBpbnQgb2NzcF9tYXRjaF9pc3N1ZXJpZChYNTA5ICpjZXJ0LCBPQ1NQX0NFUlRJRCAqY2lkLCBTVEFDS19PRihPQ1NQX1NJTkdMRVJFU1ApICpzcmVzcCk7CitzdGF0aWMgaW50IG9jc3BfY2hlY2tfZGVsZWdhdGVkKFg1MDkgKngsIGludCBmbGFncyk7CitzdGF0aWMgaW50IG9jc3BfcmVxX2ZpbmRfc2lnbmVyKFg1MDkgKipwc2lnbmVyLCBPQ1NQX1JFUVVFU1QgKnJlcSwgWDUwOV9OQU1FICpubSwgU1RBQ0tfT0YoWDUwOSkgKmNlcnRzLAorCQkJCVg1MDlfU1RPUkUgKnN0LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworLyogVmVyaWZ5IGEgYmFzaWMgcmVzcG9uc2UgbWVzc2FnZSAqLworCitpbnQgT0NTUF9iYXNpY192ZXJpZnkoT0NTUF9CQVNJQ1JFU1AgKmJzLCBTVEFDS19PRihYNTA5KSAqY2VydHMsCisJCQkJWDUwOV9TVE9SRSAqc3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCVg1MDkgKnNpZ25lciwgKng7CisJU1RBQ0tfT0YoWDUwOSkgKmNoYWluID0gTlVMTDsKKwlYNTA5X1NUT1JFX0NUWCBjdHg7CisJaW50IGksIHJldCA9IDA7CisJcmV0ID0gb2NzcF9maW5kX3NpZ25lcigmc2lnbmVyLCBicywgY2VydHMsIHN0LCBmbGFncyk7CisJaWYgKCFyZXQpCisJCXsKKwkJT0NTUGVycihPQ1NQX0ZfT0NTUF9CQVNJQ19WRVJJRlksIE9DU1BfUl9TSUdORVJfQ0VSVElGSUNBVEVfTk9UX0ZPVU5EKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAoKHJldCA9PSAyKSAmJiAoZmxhZ3MgJiBPQ1NQX1RSVVNUT1RIRVIpKQorCQlmbGFncyB8PSBPQ1NQX05PVkVSSUZZOworCWlmICghKGZsYWdzICYgT0NTUF9OT1NJR1MpKQorCQl7CisJCUVWUF9QS0VZICpza2V5OworCQlza2V5ID0gWDUwOV9nZXRfcHVia2V5KHNpZ25lcik7CisJCXJldCA9IE9DU1BfQkFTSUNSRVNQX3ZlcmlmeShicywgc2tleSwgMCk7CisJCUVWUF9QS0VZX2ZyZWUoc2tleSk7CisJCWlmKHJldCA8PSAwKQorCQkJeworCQkJT0NTUGVycihPQ1NQX0ZfT0NTUF9CQVNJQ19WRVJJRlksIE9DU1BfUl9TSUdOQVRVUkVfRkFJTFVSRSk7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCWlmICghKGZsYWdzICYgT0NTUF9OT1ZFUklGWSkpCisJCXsKKwkJaW50IGluaXRfcmVzOworCQlpZihmbGFncyAmIE9DU1BfTk9DSEFJTikKKwkJCWluaXRfcmVzID0gWDUwOV9TVE9SRV9DVFhfaW5pdCgmY3R4LCBzdCwgc2lnbmVyLCBOVUxMKTsKKwkJZWxzZQorCQkJaW5pdF9yZXMgPSBYNTA5X1NUT1JFX0NUWF9pbml0KCZjdHgsIHN0LCBzaWduZXIsIGJzLT5jZXJ0cyk7CisJCWlmKCFpbml0X3JlcykKKwkJCXsKKwkJCU9DU1BlcnIoT0NTUF9GX09DU1BfQkFTSUNfVkVSSUZZLEVSUl9SX1g1MDlfTElCKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCVg1MDlfU1RPUkVfQ1RYX3NldF9wdXJwb3NlKCZjdHgsIFg1MDlfUFVSUE9TRV9PQ1NQX0hFTFBFUik7CisJCXJldCA9IFg1MDlfdmVyaWZ5X2NlcnQoJmN0eCk7CisJCWNoYWluID0gWDUwOV9TVE9SRV9DVFhfZ2V0MV9jaGFpbigmY3R4KTsKKwkJWDUwOV9TVE9SRV9DVFhfY2xlYW51cCgmY3R4KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDw9IDApCisJCQl7CisJCQlpID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKCZjdHgpOwkKKwkJCU9DU1BlcnIoT0NTUF9GX09DU1BfQkFTSUNfVkVSSUZZLE9DU1BfUl9DRVJUSUZJQ0FURV9WRVJJRllfRVJST1IpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJWZXJpZnkgZXJyb3I6IiwKKwkJCQkJWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgCX0KKwkJaWYoZmxhZ3MgJiBPQ1NQX05PQ0hFQ0tTKQorCQkJeworCQkJcmV0ID0gMTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSB2YWxpZCBjZXJ0aWZpY2F0ZSBjaGFpbgorCQkgKiBuZWVkIHRvIHZlcmlmeSBpdCBhZ2FpbnN0IHRoZSBPQ1NQIGlzc3VlciBjcml0ZXJpYS4KKwkJICovCisJCXJldCA9IG9jc3BfY2hlY2tfaXNzdWVyKGJzLCBjaGFpbiwgZmxhZ3MpOworCisJCS8qIElmIGZhdGFsIGVycm9yIG9yIHZhbGlkIG1hdGNoIHRoZW4gZmluaXNoICovCisJCWlmIChyZXQgIT0gMCkgZ290byBlbmQ7CisKKwkJLyogRWFzeSBjYXNlOiBleHBsaWNpdGx5IHRydXN0ZWQuIEdldCByb290IENBIGFuZAorCQkgKiBjaGVjayBmb3IgZXhwbGljaXQgdHJ1c3QKKwkJICovCisJCWlmKGZsYWdzICYgT0NTUF9OT0VYUExJQ0lUKSBnb3RvIGVuZDsKKworCQl4ID0gc2tfWDUwOV92YWx1ZShjaGFpbiwgc2tfWDUwOV9udW0oY2hhaW4pIC0gMSk7CisJCWlmKFg1MDlfY2hlY2tfdHJ1c3QoeCwgTklEX09DU1Bfc2lnbiwgMCkgIT0gWDUwOV9UUlVTVF9UUlVTVEVEKQorCQkJeworCQkJT0NTUGVycihPQ1NQX0ZfT0NTUF9CQVNJQ19WRVJJRlksT0NTUF9SX1JPT1RfQ0FfTk9UX1RSVVNURUQpOworCQkJZ290byBlbmQ7CisJCQl9CisJCXJldCA9IDE7CisJCX0KKworCisKKwllbmQ6CisJaWYoY2hhaW4pIHNrX1g1MDlfcG9wX2ZyZWUoY2hhaW4sIFg1MDlfZnJlZSk7CisJcmV0dXJuIHJldDsKKwl9CisKKworc3RhdGljIGludCBvY3NwX2ZpbmRfc2lnbmVyKFg1MDkgKipwc2lnbmVyLCBPQ1NQX0JBU0lDUkVTUCAqYnMsIFNUQUNLX09GKFg1MDkpICpjZXJ0cywKKwkJCQlYNTA5X1NUT1JFICpzdCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJWDUwOSAqc2lnbmVyOworCU9DU1BfUkVTUElEICpyaWQgPSBicy0+dGJzUmVzcG9uc2VEYXRhLT5yZXNwb25kZXJJZDsKKwlpZiAoKHNpZ25lciA9IG9jc3BfZmluZF9zaWduZXJfc2soY2VydHMsIHJpZCkpKQorCQl7CisJCSpwc2lnbmVyID0gc2lnbmVyOworCQlyZXR1cm4gMjsKKwkJfQorCWlmKCEoZmxhZ3MgJiBPQ1NQX05PSU5URVJOKSAmJgorCSAgICAoc2lnbmVyID0gb2NzcF9maW5kX3NpZ25lcl9zayhicy0+Y2VydHMsIHJpZCkpKQorCQl7CisJCSpwc2lnbmVyID0gc2lnbmVyOworCQlyZXR1cm4gMTsKKwkJfQorCS8qIE1heWJlIGxvb2t1cCBmcm9tIHN0b3JlIGlmIGJ5IHN1YmplY3QgbmFtZSAqLworCisJKnBzaWduZXIgPSBOVUxMOworCXJldHVybiAwOworCX0KKworCitzdGF0aWMgWDUwOSAqb2NzcF9maW5kX3NpZ25lcl9zayhTVEFDS19PRihYNTA5KSAqY2VydHMsIE9DU1BfUkVTUElEICppZCkKKwl7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciB0bXBoYXNoW1NIQV9ESUdFU1RfTEVOR1RIXSwgKmtleWhhc2g7CisJWDUwOSAqeDsKKworCS8qIEVhc3kgaWYgbG9va3VwIGJ5IG5hbWUgKi8KKwlpZiAoaWQtPnR5cGUgPT0gVl9PQ1NQX1JFU1BJRF9OQU1FKQorCQlyZXR1cm4gWDUwOV9maW5kX2J5X3N1YmplY3QoY2VydHMsIGlkLT52YWx1ZS5ieU5hbWUpOworCisJLyogTG9va3VwIGJ5IGtleSBoYXNoICovCisKKwkvKiBJZiBrZXkgaGFzaCBpc24ndCBTSEExIGxlbmd0aCB0aGVuIGZvcmdldCBpdCAqLworCWlmIChpZC0+dmFsdWUuYnlLZXktPmxlbmd0aCAhPSBTSEFfRElHRVNUX0xFTkdUSCkgcmV0dXJuIE5VTEw7CisJa2V5aGFzaCA9IGlkLT52YWx1ZS5ieUtleS0+ZGF0YTsKKwkvKiBDYWxjdWxhdGUgaGFzaCBvZiBlYWNoIGtleSBhbmQgY29tcGFyZSAqLworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X251bShjZXJ0cyk7IGkrKykKKwkJeworCQl4ID0gc2tfWDUwOV92YWx1ZShjZXJ0cywgaSk7CisJCVg1MDlfcHVia2V5X2RpZ2VzdCh4LCBFVlBfc2hhMSgpLCB0bXBoYXNoLCBOVUxMKTsKKwkJaWYoIW1lbWNtcChrZXloYXNoLCB0bXBoYXNoLCBTSEFfRElHRVNUX0xFTkdUSCkpCisJCQlyZXR1cm4geDsKKwkJfQorCXJldHVybiBOVUxMOworCX0KKworCitzdGF0aWMgaW50IG9jc3BfY2hlY2tfaXNzdWVyKE9DU1BfQkFTSUNSRVNQICpicywgU1RBQ0tfT0YoWDUwOSkgKmNoYWluLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlTVEFDS19PRihPQ1NQX1NJTkdMRVJFU1ApICpzcmVzcDsKKwlYNTA5ICpzaWduZXIsICpzY2E7CisJT0NTUF9DRVJUSUQgKmNhaWQgPSBOVUxMOworCWludCBpOworCXNyZXNwID0gYnMtPnRic1Jlc3BvbnNlRGF0YS0+cmVzcG9uc2VzOworCisJaWYgKHNrX1g1MDlfbnVtKGNoYWluKSA8PSAwKQorCQl7CisJCU9DU1BlcnIoT0NTUF9GX09DU1BfQ0hFQ0tfSVNTVUVSLCBPQ1NQX1JfTk9fQ0VSVElGSUNBVEVTX0lOX0NIQUlOKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwkvKiBTZWUgaWYgdGhlIGlzc3VlciBJRHMgbWF0Y2guICovCisJaSA9IG9jc3BfY2hlY2tfaWRzKHNyZXNwLCAmY2FpZCk7CisKKwkvKiBJZiBJRCBtaXNtYXRjaCBvciBvdGhlciBlcnJvciB0aGVuIHJldHVybiAqLworCWlmIChpIDw9IDApIHJldHVybiBpOworCisJc2lnbmVyID0gc2tfWDUwOV92YWx1ZShjaGFpbiwgMCk7CisJLyogQ2hlY2sgdG8gc2VlIGlmIE9DU1AgcmVzcG9uZGVyIENBIG1hdGNoZXMgcmVxdWVzdCBDQSAqLworCWlmIChza19YNTA5X251bShjaGFpbikgPiAxKQorCQl7CisJCXNjYSA9IHNrX1g1MDlfdmFsdWUoY2hhaW4sIDEpOworCQlpID0gb2NzcF9tYXRjaF9pc3N1ZXJpZChzY2EsIGNhaWQsIHNyZXNwKTsKKwkJaWYgKGkgPCAwKSByZXR1cm4gaTsKKwkJaWYgKGkpCisJCQl7CisJCQkvKiBXZSBoYXZlIGEgbWF0Y2gsIGlmIGV4dGVuc2lvbnMgT0sgdGhlbiBzdWNjZXNzICovCisJCQlpZiAob2NzcF9jaGVja19kZWxlZ2F0ZWQoc2lnbmVyLCBmbGFncykpIHJldHVybiAxOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCS8qIE90aGVyd2lzZSBjaGVjayBpZiBPQ1NQIHJlcXVlc3Qgc2lnbmVkIGRpcmVjdGx5IGJ5IHJlcXVlc3QgQ0EgKi8KKwlyZXR1cm4gb2NzcF9tYXRjaF9pc3N1ZXJpZChzaWduZXIsIGNhaWQsIHNyZXNwKTsKKwl9CisKKworLyogQ2hlY2sgdGhlIGlzc3VlciBjZXJ0aWZpY2F0ZSBJRHMgZm9yIGVxdWFsaXR5LiBJZiB0aGVyZSBpcyBhIG1pc21hdGNoIHdpdGggdGhlIHNhbWUKKyAqIGFsZ29yaXRobSB0aGVuIHRoZXJlJ3Mgbm8gcG9pbnQgdHJ5aW5nIHRvIG1hdGNoIGFueSBjZXJ0aWZpY2F0ZXMgYWdhaW5zdCB0aGUgaXNzdWVyLgorICogSWYgdGhlIGlzc3VlciBJRHMgYWxsIG1hdGNoIHRoZW4gd2UganVzdCBuZWVkIHRvIGNoZWNrIGVxdWFsaXR5IGFnYWluc3Qgb25lIG9mIHRoZW0uCisgKi8KKwkKK3N0YXRpYyBpbnQgb2NzcF9jaGVja19pZHMoU1RBQ0tfT0YoT0NTUF9TSU5HTEVSRVNQKSAqc3Jlc3AsIE9DU1BfQ0VSVElEICoqcmV0KQorCXsKKwlPQ1NQX0NFUlRJRCAqdG1waWQsICpjaWQ7CisJaW50IGksIGlkY291bnQ7CisKKwlpZGNvdW50ID0gc2tfT0NTUF9TSU5HTEVSRVNQX251bShzcmVzcCk7CisJaWYgKGlkY291bnQgPD0gMCkKKwkJeworCQlPQ1NQZXJyKE9DU1BfRl9PQ1NQX0NIRUNLX0lEUywgT0NTUF9SX1JFU1BPTlNFX0NPTlRBSU5TX05PX1JFVk9DQVRJT05fREFUQSk7CisJCXJldHVybiAtMTsKKwkJfQorCisJY2lkID0gc2tfT0NTUF9TSU5HTEVSRVNQX3ZhbHVlKHNyZXNwLCAwKS0+Y2VydElkOworCisJKnJldCA9IE5VTEw7CisKKwlmb3IgKGkgPSAxOyBpIDwgaWRjb3VudDsgaSsrKQorCQl7CisJCXRtcGlkID0gc2tfT0NTUF9TSU5HTEVSRVNQX3ZhbHVlKHNyZXNwLCBpKS0+Y2VydElkOworCQkvKiBDaGVjayB0byBzZWUgaWYgSURzIG1hdGNoICovCisJCWlmIChPQ1NQX2lkX2lzc3Vlcl9jbXAoY2lkLCB0bXBpZCkpCisJCQl7CisJCQkvKiBJZiBhbGdvcml0bSBtaXNtYXRjaCBsZXQgY2FsbGVyIGRlYWwgd2l0aCBpdCAqLworCQkJaWYgKE9CSl9jbXAodG1waWQtPmhhc2hBbGdvcml0aG0tPmFsZ29yaXRobSwKKwkJCQkJY2lkLT5oYXNoQWxnb3JpdGhtLT5hbGdvcml0aG0pKQorCQkJCQlyZXR1cm4gMjsKKwkJCS8qIEVsc2UgbWlzbWF0Y2ggKi8KKwkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkvKiBBbGwgSURzIG1hdGNoOiBvbmx5IG5lZWQgdG8gY2hlY2sgb25lIElEICovCisJKnJldCA9IGNpZDsKKwlyZXR1cm4gMTsKKwl9CisKKworc3RhdGljIGludCBvY3NwX21hdGNoX2lzc3VlcmlkKFg1MDkgKmNlcnQsIE9DU1BfQ0VSVElEICpjaWQsCisJCQlTVEFDS19PRihPQ1NQX1NJTkdMRVJFU1ApICpzcmVzcCkKKwl7CisJLyogSWYgb25seSBvbmUgSUQgdG8gbWF0Y2ggdGhlbiBkbyBpdCAqLworCWlmKGNpZCkKKwkJeworCQljb25zdCBFVlBfTUQgKmRnc3Q7CisJCVg1MDlfTkFNRSAqaW5hbWU7CisJCWludCBtZGxlbjsKKwkJdW5zaWduZWQgY2hhciBtZFtFVlBfTUFYX01EX1NJWkVdOworCQlpZiAoIShkZ3N0ID0gRVZQX2dldF9kaWdlc3RieW9iaihjaWQtPmhhc2hBbGdvcml0aG0tPmFsZ29yaXRobSkpKQorCQkJeworCQkJT0NTUGVycihPQ1NQX0ZfT0NTUF9NQVRDSF9JU1NVRVJJRCwgT0NTUF9SX1VOS05PV05fTUVTU0FHRV9ESUdFU1QpOworCQkJcmV0dXJuIC0xOworCQkJfQorCisJCW1kbGVuID0gRVZQX01EX3NpemUoZGdzdCk7CisJCWlmIChtZGxlbiA8IDApCisJCSAgICByZXR1cm4gLTE7CisJCWlmICgoY2lkLT5pc3N1ZXJOYW1lSGFzaC0+bGVuZ3RoICE9IG1kbGVuKSB8fAorCQkgICAoY2lkLT5pc3N1ZXJLZXlIYXNoLT5sZW5ndGggIT0gbWRsZW4pKQorCQkJcmV0dXJuIDA7CisJCWluYW1lID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKGNlcnQpOworCQlpZiAoIVg1MDlfTkFNRV9kaWdlc3QoaW5hbWUsIGRnc3QsIG1kLCBOVUxMKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKG1lbWNtcChtZCwgY2lkLT5pc3N1ZXJOYW1lSGFzaC0+ZGF0YSwgbWRsZW4pKQorCQkJcmV0dXJuIDA7CisJCVg1MDlfcHVia2V5X2RpZ2VzdChjZXJ0LCBkZ3N0LCBtZCwgTlVMTCk7CisJCWlmIChtZW1jbXAobWQsIGNpZC0+aXNzdWVyS2V5SGFzaC0+ZGF0YSwgbWRsZW4pKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIDE7CisKKwkJfQorCWVsc2UKKwkJeworCQkvKiBXZSBoYXZlIHRvIG1hdGNoIHRoZSB3aG9sZSBsb3QgKi8KKwkJaW50IGksIHJldDsKKwkJT0NTUF9DRVJUSUQgKnRtcGlkOworCQlmb3IgKGkgPSAwOyBpIDwgc2tfT0NTUF9TSU5HTEVSRVNQX251bShzcmVzcCk7IGkrKykKKwkJCXsKKwkJCXRtcGlkID0gc2tfT0NTUF9TSU5HTEVSRVNQX3ZhbHVlKHNyZXNwLCBpKS0+Y2VydElkOworCQkJcmV0ID0gb2NzcF9tYXRjaF9pc3N1ZXJpZChjZXJ0LCB0bXBpZCwgTlVMTCk7CisJCQlpZiAocmV0IDw9IDApIHJldHVybiByZXQ7CisJCQl9CisJCXJldHVybiAxOworCQl9CisJCQkKKwl9CisKK3N0YXRpYyBpbnQgb2NzcF9jaGVja19kZWxlZ2F0ZWQoWDUwOSAqeCwgaW50IGZsYWdzKQorCXsKKwlYNTA5X2NoZWNrX3B1cnBvc2UoeCwgLTEsIDApOworCWlmICgoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfWEtVU0FHRSkgJiYKKwkgICAgKHgtPmV4X3hrdXNhZ2UgJiBYS1VfT0NTUF9TSUdOKSkKKwkJcmV0dXJuIDE7CisJT0NTUGVycihPQ1NQX0ZfT0NTUF9DSEVDS19ERUxFR0FURUQsIE9DU1BfUl9NSVNTSU5HX09DU1BTSUdOSU5HX1VTQUdFKTsKKwlyZXR1cm4gMDsKKwl9CisKKy8qIFZlcmlmeSBhbiBPQ1NQIHJlcXVlc3QuIFRoaXMgaXMgZm9ydHVuYXRlbHkgbXVjaCBlYXNpZXIgdGhhbiBPQ1NQCisgKiByZXNwb25zZSB2ZXJpZnkuIEp1c3QgZmluZCB0aGUgc2lnbmVycyBjZXJ0aWZpY2F0ZSBhbmQgdmVyaWZ5IGl0CisgKiBhZ2FpbnN0IGEgZ2l2ZW4gdHJ1c3QgdmFsdWUuCisgKi8KKworaW50IE9DU1BfcmVxdWVzdF92ZXJpZnkoT0NTUF9SRVFVRVNUICpyZXEsIFNUQUNLX09GKFg1MDkpICpjZXJ0cywgWDUwOV9TVE9SRSAqc3RvcmUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisgICAgICAgIHsKKwlYNTA5ICpzaWduZXI7CisJWDUwOV9OQU1FICpubTsKKwlHRU5FUkFMX05BTUUgKmdlbjsKKwlpbnQgcmV0OworCVg1MDlfU1RPUkVfQ1RYIGN0eDsKKwlpZiAoIXJlcS0+b3B0aW9uYWxTaWduYXR1cmUpIAorCQl7CisJCU9DU1BlcnIoT0NTUF9GX09DU1BfUkVRVUVTVF9WRVJJRlksIE9DU1BfUl9SRVFVRVNUX05PVF9TSUdORUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWdlbiA9IHJlcS0+dGJzUmVxdWVzdC0+cmVxdWVzdG9yTmFtZTsKKwlpZiAoIWdlbiB8fCBnZW4tPnR5cGUgIT0gR0VOX0RJUk5BTUUpCisJCXsKKwkJT0NTUGVycihPQ1NQX0ZfT0NTUF9SRVFVRVNUX1ZFUklGWSwgT0NTUF9SX1VOU1VQUE9SVEVEX1JFUVVFU1RPUk5BTUVfVFlQRSk7CisJCXJldHVybiAwOworCQl9CisJbm0gPSBnZW4tPmQuZGlyZWN0b3J5TmFtZTsKKwlyZXQgPSBvY3NwX3JlcV9maW5kX3NpZ25lcigmc2lnbmVyLCByZXEsIG5tLCBjZXJ0cywgc3RvcmUsIGZsYWdzKTsKKwlpZiAocmV0IDw9IDApCisJCXsKKwkJT0NTUGVycihPQ1NQX0ZfT0NTUF9SRVFVRVNUX1ZFUklGWSwgT0NTUF9SX1NJR05FUl9DRVJUSUZJQ0FURV9OT1RfRk9VTkQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmICgocmV0ID09IDIpICYmIChmbGFncyAmIE9DU1BfVFJVU1RPVEhFUikpCisJCWZsYWdzIHw9IE9DU1BfTk9WRVJJRlk7CisJaWYgKCEoZmxhZ3MgJiBPQ1NQX05PU0lHUykpCisJCXsKKwkJRVZQX1BLRVkgKnNrZXk7CisJCXNrZXkgPSBYNTA5X2dldF9wdWJrZXkoc2lnbmVyKTsKKwkJcmV0ID0gT0NTUF9SRVFVRVNUX3ZlcmlmeShyZXEsIHNrZXkpOworCQlFVlBfUEtFWV9mcmVlKHNrZXkpOworCQlpZihyZXQgPD0gMCkKKwkJCXsKKwkJCU9DU1BlcnIoT0NTUF9GX09DU1BfUkVRVUVTVF9WRVJJRlksIE9DU1BfUl9TSUdOQVRVUkVfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCWlmICghKGZsYWdzICYgT0NTUF9OT1ZFUklGWSkpCisJCXsKKwkJaW50IGluaXRfcmVzOworCQlpZihmbGFncyAmIE9DU1BfTk9DSEFJTikKKwkJCWluaXRfcmVzID0gWDUwOV9TVE9SRV9DVFhfaW5pdCgmY3R4LCBzdG9yZSwgc2lnbmVyLCBOVUxMKTsKKwkJZWxzZQorCQkJaW5pdF9yZXMgPSBYNTA5X1NUT1JFX0NUWF9pbml0KCZjdHgsIHN0b3JlLCBzaWduZXIsCisJCQkJCXJlcS0+b3B0aW9uYWxTaWduYXR1cmUtPmNlcnRzKTsKKwkJaWYoIWluaXRfcmVzKQorCQkJeworCQkJT0NTUGVycihPQ1NQX0ZfT0NTUF9SRVFVRVNUX1ZFUklGWSxFUlJfUl9YNTA5X0xJQik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQlYNTA5X1NUT1JFX0NUWF9zZXRfcHVycG9zZSgmY3R4LCBYNTA5X1BVUlBPU0VfT0NTUF9IRUxQRVIpOworCQlYNTA5X1NUT1JFX0NUWF9zZXRfdHJ1c3QoJmN0eCwgWDUwOV9UUlVTVF9PQ1NQX1JFUVVFU1QpOworCQlyZXQgPSBYNTA5X3ZlcmlmeV9jZXJ0KCZjdHgpOworCQlYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZjdHgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPD0gMCkKKwkJCXsKKwkJCXJldCA9IFg1MDlfU1RPUkVfQ1RYX2dldF9lcnJvcigmY3R4KTsJCisJCQlPQ1NQZXJyKE9DU1BfRl9PQ1NQX1JFUVVFU1RfVkVSSUZZLE9DU1BfUl9DRVJUSUZJQ0FURV9WRVJJRllfRVJST1IpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJWZXJpZnkgZXJyb3I6IiwKKwkJCQkJWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcocmV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAJfQorCQl9CisJcmV0dXJuIDE7CisgICAgICAgIH0KKworc3RhdGljIGludCBvY3NwX3JlcV9maW5kX3NpZ25lcihYNTA5ICoqcHNpZ25lciwgT0NTUF9SRVFVRVNUICpyZXEsIFg1MDlfTkFNRSAqbm0sIFNUQUNLX09GKFg1MDkpICpjZXJ0cywKKwkJCQlYNTA5X1NUT1JFICpzdCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJWDUwOSAqc2lnbmVyOworCWlmKCEoZmxhZ3MgJiBPQ1NQX05PSU5URVJOKSkKKwkJeworCQlzaWduZXIgPSBYNTA5X2ZpbmRfYnlfc3ViamVjdChyZXEtPm9wdGlvbmFsU2lnbmF0dXJlLT5jZXJ0cywgbm0pOworCQkqcHNpZ25lciA9IHNpZ25lcjsKKwkJcmV0dXJuIDE7CisJCX0KKworCXNpZ25lciA9IFg1MDlfZmluZF9ieV9zdWJqZWN0KGNlcnRzLCBubSk7CisJaWYgKHNpZ25lcikKKwkJeworCQkqcHNpZ25lciA9IHNpZ25lcjsKKwkJcmV0dXJuIDI7CisJCX0KKwlyZXR1cm4gMDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb3BlbnNzbGNvbmYuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9vcGVuc3NsY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWM2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb3BlbnNzbGNvbmYuaApAQCAtMCwwICsxLDI1MCBAQAorLyogb3BlbnNzbGNvbmYuaCAqLworLyogV0FSTklORzogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBvcGVuc3NsY29uZi5oLmluIGJ5IENvbmZpZ3VyZS4gKi8KKworLyogT3BlblNTTCB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogKi8KKyNpZm5kZWYgT1BFTlNTTF9ET0lOR19NQUtFREVQRU5ECisKKworI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ0FTVAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fR01QCisjIGRlZmluZSBPUEVOU1NMX05PX0dNUAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorIyBkZWZpbmUgT1BFTlNTTF9OT19JREVBCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19KUEFLRQorIyBkZWZpbmUgT1BFTlNTTF9OT19KUEFLRQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorIyBkZWZpbmUgT1BFTlNTTF9OT19LUkI1CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDIKKyMgZGVmaW5lIE9QRU5TU0xfTk9fTUQyCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fUkM1CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CisjIGRlZmluZSBPUEVOU1NMX05PX1JGQzM3NzkKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKKyMgZGVmaW5lIE9QRU5TU0xfTk9fU0VFRAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBMAorIyBkZWZpbmUgT1BFTlNTTF9OT19TSEEwCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TVE9SRQorIyBkZWZpbmUgT1BFTlNTTF9OT19TVE9SRQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fV0hSTFBPT0wKKyMgZGVmaW5lIE9QRU5TU0xfTk9fV0hSTFBPT0wKKyNlbmRpZgorCisjZW5kaWYgLyogT1BFTlNTTF9ET0lOR19NQUtFREVQRU5EICovCisKKyNpZm5kZWYgT1BFTlNTTF9USFJFQURTCisjIGRlZmluZSBPUEVOU1NMX1RIUkVBRFMKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RZTkFNSUNfRU5HSU5FCisjIGRlZmluZSBPUEVOU1NMX05PX0RZTkFNSUNfRU5HSU5FCisjZW5kaWYKKworLyogVGhlIE9QRU5TU0xfTk9fKiBtYWNyb3MgYXJlIGFsc28gZGVmaW5lZCBhcyBOT18qIGlmIHRoZSBhcHBsaWNhdGlvbgorICAgYXNrcyBmb3IgaXQuICBUaGlzIGlzIGEgdHJhbnNpZW50IGZlYXR1cmUgdGhhdCBpcyBwcm92aWRlZCBmb3IgdGhvc2UKKyAgIHdobyBoYXZlbid0IGhhZCB0aGUgdGltZSB0byBkbyB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBpbiB0aGVpcgorICAgYXBwbGljYXRpb25zLiAgKi8KKyNpZmRlZiBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19DQVNUKSAmJiAhZGVmaW5lZChOT19DQVNUKQorIyAgZGVmaW5lIE5PX0NBU1QKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0dNUCkgJiYgIWRlZmluZWQoTk9fR01QKQorIyAgZGVmaW5lIE5PX0dNUAorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fSURFQSkgJiYgIWRlZmluZWQoTk9fSURFQSkKKyMgIGRlZmluZSBOT19JREVBCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19KUEFLRSkgJiYgIWRlZmluZWQoTk9fSlBBS0UpCisjICBkZWZpbmUgTk9fSlBBS0UKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0tSQjUpICYmICFkZWZpbmVkKE5PX0tSQjUpCisjICBkZWZpbmUgTk9fS1JCNQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fTUQyKSAmJiAhZGVmaW5lZChOT19NRDIpCisjICBkZWZpbmUgTk9fTUQyCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19SQzUpICYmICFkZWZpbmVkKE5PX1JDNSkKKyMgIGRlZmluZSBOT19SQzUKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1JGQzM3NzkpICYmICFkZWZpbmVkKE5PX1JGQzM3NzkpCisjICBkZWZpbmUgTk9fUkZDMzc3OQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fU0VFRCkgJiYgIWRlZmluZWQoTk9fU0VFRCkKKyMgIGRlZmluZSBOT19TRUVECisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19TSEEwKSAmJiAhZGVmaW5lZChOT19TSEEwKQorIyAgZGVmaW5lIE5PX1NIQTAKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1NUT1JFKSAmJiAhZGVmaW5lZChOT19TVE9SRSkKKyMgIGRlZmluZSBOT19TVE9SRQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fV0hSTFBPT0wpICYmICFkZWZpbmVkKE5PX1dIUkxQT09MKQorIyAgZGVmaW5lIE5PX1dIUkxQT09MCisjIGVuZGlmCisjZW5kaWYKKworLyogY3J5cHRvL29wZW5zc2xjb25mLmguaW4gKi8KKworLyogR2VuZXJhdGUgODAzODYgY29kZT8gKi8KKyN1bmRlZiBJMzg2X09OTFkKKworI2lmICEoZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoX19WTVMpKSAvKiBWTVMgdXNlcyBsb2dpY2FsIG5hbWVzIGluc3RlYWQgKi8KKyNpZiBkZWZpbmVkKEhFQURFUl9DUllQVExJQl9IKSAmJiAhZGVmaW5lZChPUEVOU1NMRElSKQorI2RlZmluZSBFTkdJTkVTRElSICIvdXNyL2xvY2FsL3NzbC9saWIvZW5naW5lcyIKKyNkZWZpbmUgT1BFTlNTTERJUiAiL3Vzci9sb2NhbC9zc2wiCisjZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgT1BFTlNTTF9VTklTVEQKKyNkZWZpbmUgT1BFTlNTTF9VTklTVEQgPHVuaXN0ZC5oPgorCisjdW5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKyNpZiBkZWZpbmVkKEhFQURFUl9JREVBX0gpICYmICFkZWZpbmVkKElERUFfSU5UKQorI2RlZmluZSBJREVBX0lOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfTUQyX0gpICYmICFkZWZpbmVkKE1EMl9JTlQpCisjZGVmaW5lIE1EMl9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDMl9IKSAmJiAhZGVmaW5lZChSQzJfSU5UKQorLyogSSBuZWVkIHRvIHB1dCBpbiBhIG1vZCBmb3IgdGhlIGFscGhhIC0gZWF5ICovCisjZGVmaW5lIFJDMl9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDNF9IKQorI2lmICFkZWZpbmVkKFJDNF9JTlQpCisvKiB1c2luZyBpbnQgdHlwZXMgbWFrZSB0aGUgc3RydWN0dXJlIGxhcmdlciBidXQgbWFrZSB0aGUgY29kZSBmYXN0ZXIKKyAqIG9uIG1vc3QgYm94ZXMgSSBoYXZlIHRlc3RlZCAtIHVwIHRvICUyMCBmYXN0ZXIuICovCisvKgorICogSSBkb24ndCBrbm93IHdoYXQgZG9lcyAibW9zdCIgbWVhbiwgYnV0IGRlY2xhcmluZyAiaW50IiBpcyBhIG11c3Qgb246CisgKiAtIEludGVsIFA2IGJlY2F1c2UgcGFydGlhbCByZWdpc3RlciBzdGFsbHMgYXJlIHZlcnkgZXhwZW5zaXZlOworICogLSBlbGRlciBBbHBoYSBiZWNhdXNlIGl0IGxhY2tzIGJ5dGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnM7CisgKi8KKyNkZWZpbmUgUkM0X0lOVCB1bnNpZ25lZCBjaGFyCisjZW5kaWYKKyNpZiAhZGVmaW5lZChSQzRfQ0hVTkspCisvKgorICogVGhpcyBlbmFibGVzIGNvZGUgaGFuZGxpbmcgZGF0YSBhbGlnbmVkIGF0IG5hdHVyYWwgQ1BVIHdvcmQKKyAqIGJvdW5kYXJ5LiBTZWUgY3J5cHRvL3JjNC9yYzRfZW5jLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAqLworI2RlZmluZSBSQzRfQ0hVTksgdW5zaWduZWQgbG9uZworI2VuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkKEhFQURFUl9ORVdfREVTX0gpIHx8IGRlZmluZWQoSEVBREVSX0RFU19IKSkgJiYgIWRlZmluZWQoREVTX0xPTkcpCisvKiBJZiB0aGlzIGlzIHNldCB0byAndW5zaWduZWQgaW50JyBvbiBhIERFQyBBbHBoYSwgdGhpcyBnaXZlcyBhYm91dCBhCisgKiAlMjAgc3BlZWQgdXAgKGxvbmdzIGFyZSA4IGJ5dGVzLCBpbnQncyBhcmUgNCkuICovCisjaWZuZGVmIERFU19MT05HCisjZGVmaW5lIERFU19MT05HIHVuc2lnbmVkIGludAorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX0JOX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfQk5fSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9CTl9ICisjZGVmaW5lIEJOX0xMT05HCisKKy8qIFNob3VsZCB3ZSBkZWZpbmUgQk5fRElWMlcgaGVyZT8gKi8KKworLyogT25seSBvbmUgZm9yIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGRlZmluZWQgKi8KKyN1bmRlZiBTSVhUWV9GT1VSX0JJVF9MT05HCisjdW5kZWYgU0lYVFlfRk9VUl9CSVQKKyNkZWZpbmUgVEhJUlRZX1RXT19CSVQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfUkM0X0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9SQzRfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX1JDNF9MT0NMX0gKKy8qIGlmIHRoaXMgaXMgZGVmaW5lZCBkYXRhW2ldIGlzIHVzZWQgaW5zdGVhZCBvZiAqZGF0YSwgdGhpcyBpcyBhICUyMAorICogc3BlZWR1cCBvbiB4ODYgKi8KKyN1bmRlZiBSQzRfSU5ERVgKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfQkZfTE9DTF9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX0JGX0xPQ0xfSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9CRl9MT0NMX0gKKyNkZWZpbmUgQkZfUFRSCisjZW5kaWYgLyogSEVBREVSX0JGX0xPQ0xfSCAqLworCisjaWYgZGVmaW5lZChIRUFERVJfREVTX0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9ERVNfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX0RFU19MT0NMX0gKKyNpZm5kZWYgREVTX0RFRkFVTFRfT1BUSU9OUworLyogdGhlIGZvbGxvd2luZyBpcyB0d2Vha2VkIGZyb20gYSBjb25maWcgc2NyaXB0LCB0aGF0IGlzIHdoeSBpdCBpcyBhCisgKiBwcm90ZWN0ZWQgdW5kZWYvZGVmaW5lICovCisjaWZuZGVmIERFU19QVFIKKyN1bmRlZiBERVNfUFRSCisjZW5kaWYKKworLyogVGhpcyBoZWxwcyBDIGNvbXBpbGVyIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGNvZGUgZm9yIG11bHRpcGxlIGZ1bmN0aW9uYWwKKyAqIHVuaXRzLiAgSXQgcmVkdWNlcyByZWdpc3RlciBkZXBlbmRhbmNpZXMgYXQgdGhlIGV4cGVuc2Ugb2YgMiBtb3JlCisgKiByZWdpc3RlcnMgKi8KKyNpZm5kZWYgREVTX1JJU0MxCisjdW5kZWYgREVTX1JJU0MxCisjZW5kaWYKKworI2lmbmRlZiBERVNfUklTQzIKKyN1bmRlZiBERVNfUklTQzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERVNfUklTQzEpICYmIGRlZmluZWQoREVTX1JJU0MyKQorWU9VIFNIT1VMRCBOT1QgSEFWRSBCT1RIIERFU19SSVNDMSBBTkQgREVTX1JJU0MyIERFRklORUQhISEhIQorI2VuZGlmCisKKy8qIFVucm9sbCB0aGUgaW5uZXIgbG9vcCwgdGhpcyBzb21ldGltZXMgaGVscHMsIHNvbWV0aW1lcyBoaW5kZXJzLgorICogVmVyeSBtdWN5IENQVSBkZXBlbmRhbnQgKi8KKyNpZm5kZWYgREVTX1VOUk9MTAorI2RlZmluZSBERVNfVU5ST0xMCisjZW5kaWYKKworLyogVGhlc2UgZGVmYXVsdCB2YWx1ZXMgd2VyZSBzdXBwbGllZCBieQorICogUGV0ZXIgR3V0bWFuIDxwZ3V0MDAxQGNzLmF1Y2tsYW5kLmFjLm56PgorICogVGhleSBhcmUgb25seSB1c2VkIGlmIG5vdGhpbmcgZWxzZSBoYXMgYmVlbiBkZWZpbmVkICovCisjaWYgIWRlZmluZWQoREVTX1BUUikgJiYgIWRlZmluZWQoREVTX1JJU0MxKSAmJiAhZGVmaW5lZChERVNfUklTQzIpICYmICFkZWZpbmVkKERFU19VTlJPTEwpCisvKiBTcGVjaWFsIGRlZmluZXMgd2hpY2ggY2hhbmdlIHRoZSB3YXkgdGhlIGNvZGUgaXMgYnVpbHQgZGVwZW5kaW5nIG9uIHRoZQorICAgQ1BVIGFuZCBPUy4gIEZvciBTR0kgbWFjaGluZXMgeW91IGNhbiB1c2UgX01JUFNfU1pMT05HICgzMiBvciA2NCkgdG8gZmluZAorICAgZXZlbiBuZXdlciBNSVBTIENQVSdzLCBidXQgYXQgdGhlIG1vbWVudCBvbmUgc2l6ZSBmaXRzIGFsbCBmb3IKKyAgIG9wdGltaXphdGlvbiBvcHRpb25zLiAgT2xkZXIgU3BhcmMncyB3b3JrIGJldHRlciB3aXRoIG9ubHkgVU5ST0xMLCBidXQKKyAgIHRoZXJlJ3Mgbm8gd2F5IHRvIHRlbGwgYXQgY29tcGlsZSB0aW1lIHdoYXQgaXQgaXMgeW91J3JlIHJ1bm5pbmcgb24gKi8KKyAKKyNpZiBkZWZpbmVkKCBzdW4gKQkJLyogTmV3ZXIgU3BhcmMncyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzEKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKCBfX3VsdHJpeCApCS8qIE9sZGVyIE1JUFMgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MyCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZCggX19vc2YxX18gKQkvKiBBbHBoYSAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzIKKyNlbGlmIGRlZmluZWQgKCBfQUlYICkJCS8qIFJTNjAwMCAqLworICAvKiBVbmtub3duICovCisjZWxpZiBkZWZpbmVkKCBfX2hwdXggKQkJLyogSFAtUEEgKi8KKyAgLyogVW5rbm93biAqLworI2VsaWYgZGVmaW5lZCggX19hdXggKQkJLyogNjhLICovCisgIC8qIFVua25vd24gKi8KKyNlbGlmIGRlZmluZWQoIF9fZGd1eCApCQkvKiA4OEsgKGJ1dCBQNiBpbiBsYXRlc3QgYm94ZXMpICovCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZCggX19zZ2kgKQkJLyogTmV3ZXIgTUlQUyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzIKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2X18pCS8qIHg4NiBib3hlcywgc2hvdWxkIGJlIGdjYyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzEKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZW5kaWYgLyogU3lzdGVtcy1zcGVjaWZpYyBzcGVlZCBkZWZpbmVzICovCisjZW5kaWYKKworI2VuZGlmIC8qIERFU19ERUZBVUxUX09QVElPTlMgKi8KKyNlbmRpZiAvKiBIRUFERVJfREVTX0xPQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29wZW5zc2xjb25mLmguaW4gYi9saWIvb3BlbnNzbC9jcnlwdG8vb3BlbnNzbGNvbmYuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2UzNzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29wZW5zc2xjb25mLmguaW4KQEAgLTAsMCArMSwxNTQgQEAKKy8qIGNyeXB0by9vcGVuc3NsY29uZi5oLmluICovCisKKy8qIEdlbmVyYXRlIDgwMzg2IGNvZGU/ICovCisjdW5kZWYgSTM4Nl9PTkxZCisKKyNpZiAhKGRlZmluZWQoVk1TKSB8fCBkZWZpbmVkKF9fVk1TKSkgLyogVk1TIHVzZXMgbG9naWNhbCBuYW1lcyBpbnN0ZWFkICovCisjaWYgZGVmaW5lZChIRUFERVJfQ1JZUFRMSUJfSCkgJiYgIWRlZmluZWQoT1BFTlNTTERJUikKKyNkZWZpbmUgRU5HSU5FU0RJUiAiL3Vzci9sb2NhbC9saWIvZW5naW5lcyIKKyNkZWZpbmUgT1BFTlNTTERJUiAiL3Vzci9sb2NhbC9zc2wiCisjZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgT1BFTlNTTF9VTklTVEQKKyNkZWZpbmUgT1BFTlNTTF9VTklTVEQgPHVuaXN0ZC5oPgorCisjdW5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKyNpZiBkZWZpbmVkKEhFQURFUl9JREVBX0gpICYmICFkZWZpbmVkKElERUFfSU5UKQorI2RlZmluZSBJREVBX0lOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfTUQyX0gpICYmICFkZWZpbmVkKE1EMl9JTlQpCisjZGVmaW5lIE1EMl9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDMl9IKSAmJiAhZGVmaW5lZChSQzJfSU5UKQorLyogSSBuZWVkIHRvIHB1dCBpbiBhIG1vZCBmb3IgdGhlIGFscGhhIC0gZWF5ICovCisjZGVmaW5lIFJDMl9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDNF9IKQorI2lmICFkZWZpbmVkKFJDNF9JTlQpCisvKiB1c2luZyBpbnQgdHlwZXMgbWFrZSB0aGUgc3RydWN0dXJlIGxhcmdlciBidXQgbWFrZSB0aGUgY29kZSBmYXN0ZXIKKyAqIG9uIG1vc3QgYm94ZXMgSSBoYXZlIHRlc3RlZCAtIHVwIHRvICUyMCBmYXN0ZXIuICovCisvKgorICogSSBkb24ndCBrbm93IHdoYXQgZG9lcyAibW9zdCIgbWVhbiwgYnV0IGRlY2xhcmluZyAiaW50IiBpcyBhIG11c3Qgb246CisgKiAtIEludGVsIFA2IGJlY2F1c2UgcGFydGlhbCByZWdpc3RlciBzdGFsbHMgYXJlIHZlcnkgZXhwZW5zaXZlOworICogLSBlbGRlciBBbHBoYSBiZWNhdXNlIGl0IGxhY2tzIGJ5dGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnM7CisgKi8KKyNkZWZpbmUgUkM0X0lOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorI2lmICFkZWZpbmVkKFJDNF9DSFVOSykKKy8qCisgKiBUaGlzIGVuYWJsZXMgY29kZSBoYW5kbGluZyBkYXRhIGFsaWduZWQgYXQgbmF0dXJhbCBDUFUgd29yZAorICogYm91bmRhcnkuIFNlZSBjcnlwdG8vcmM0L3JjNF9lbmMuYyBmb3IgZnVydGhlciBkZXRhaWxzLgorICovCisjdW5kZWYgUkM0X0NIVU5LCisjZW5kaWYKKyNlbmRpZgorCisjaWYgKGRlZmluZWQoSEVBREVSX05FV19ERVNfSCkgfHwgZGVmaW5lZChIRUFERVJfREVTX0gpKSAmJiAhZGVmaW5lZChERVNfTE9ORykKKy8qIElmIHRoaXMgaXMgc2V0IHRvICd1bnNpZ25lZCBpbnQnIG9uIGEgREVDIEFscGhhLCB0aGlzIGdpdmVzIGFib3V0IGEKKyAqICUyMCBzcGVlZCB1cCAobG9uZ3MgYXJlIDggYnl0ZXMsIGludCdzIGFyZSA0KS4gKi8KKyNpZm5kZWYgREVTX0xPTkcKKyNkZWZpbmUgREVTX0xPTkcgdW5zaWduZWQgbG9uZworI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX0JOX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfQk5fSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9CTl9ICisjdW5kZWYgQk5fTExPTkcKKworLyogU2hvdWxkIHdlIGRlZmluZSBCTl9ESVYyVyBoZXJlPyAqLworCisvKiBPbmx5IG9uZSBmb3IgdGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZGVmaW5lZCAqLworI3VuZGVmIFNJWFRZX0ZPVVJfQklUX0xPTkcKKyN1bmRlZiBTSVhUWV9GT1VSX0JJVAorI2RlZmluZSBUSElSVFlfVFdPX0JJVAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9SQzRfTE9DTF9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX1JDNF9MT0NMX0gpCisjZGVmaW5lIENPTkZJR19IRUFERVJfUkM0X0xPQ0xfSAorLyogaWYgdGhpcyBpcyBkZWZpbmVkIGRhdGFbaV0gaXMgdXNlZCBpbnN0ZWFkIG9mICpkYXRhLCB0aGlzIGlzIGEgJTIwCisgKiBzcGVlZHVwIG9uIHg4NiAqLworI3VuZGVmIFJDNF9JTkRFWAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEhFQURFUl9CRl9MT0NMX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfQkZfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX0JGX0xPQ0xfSAorI3VuZGVmIEJGX1BUUgorI2VuZGlmIC8qIEhFQURFUl9CRl9MT0NMX0ggKi8KKworI2lmIGRlZmluZWQoSEVBREVSX0RFU19MT0NMX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfREVTX0xPQ0xfSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9ERVNfTE9DTF9ICisjaWZuZGVmIERFU19ERUZBVUxUX09QVElPTlMKKy8qIHRoZSBmb2xsb3dpbmcgaXMgdHdlYWtlZCBmcm9tIGEgY29uZmlnIHNjcmlwdCwgdGhhdCBpcyB3aHkgaXQgaXMgYQorICogcHJvdGVjdGVkIHVuZGVmL2RlZmluZSAqLworI2lmbmRlZiBERVNfUFRSCisjdW5kZWYgREVTX1BUUgorI2VuZGlmCisKKy8qIFRoaXMgaGVscHMgQyBjb21waWxlciBnZW5lcmF0ZSB0aGUgY29ycmVjdCBjb2RlIGZvciBtdWx0aXBsZSBmdW5jdGlvbmFsCisgKiB1bml0cy4gIEl0IHJlZHVjZXMgcmVnaXN0ZXIgZGVwZW5kYW5jaWVzIGF0IHRoZSBleHBlbnNlIG9mIDIgbW9yZQorICogcmVnaXN0ZXJzICovCisjaWZuZGVmIERFU19SSVNDMQorI3VuZGVmIERFU19SSVNDMQorI2VuZGlmCisKKyNpZm5kZWYgREVTX1JJU0MyCisjdW5kZWYgREVTX1JJU0MyCisjZW5kaWYKKworI2lmIGRlZmluZWQoREVTX1JJU0MxKSAmJiBkZWZpbmVkKERFU19SSVNDMikKK1lPVSBTSE9VTEQgTk9UIEhBVkUgQk9USCBERVNfUklTQzEgQU5EIERFU19SSVNDMiBERUZJTkVEISEhISEKKyNlbmRpZgorCisvKiBVbnJvbGwgdGhlIGlubmVyIGxvb3AsIHRoaXMgc29tZXRpbWVzIGhlbHBzLCBzb21ldGltZXMgaGluZGVycy4KKyAqIFZlcnkgbXVjeSBDUFUgZGVwZW5kYW50ICovCisjaWZuZGVmIERFU19VTlJPTEwKKyN1bmRlZiBERVNfVU5ST0xMCisjZW5kaWYKKworLyogVGhlc2UgZGVmYXVsdCB2YWx1ZXMgd2VyZSBzdXBwbGllZCBieQorICogUGV0ZXIgR3V0bWFuIDxwZ3V0MDAxQGNzLmF1Y2tsYW5kLmFjLm56PgorICogVGhleSBhcmUgb25seSB1c2VkIGlmIG5vdGhpbmcgZWxzZSBoYXMgYmVlbiBkZWZpbmVkICovCisjaWYgIWRlZmluZWQoREVTX1BUUikgJiYgIWRlZmluZWQoREVTX1JJU0MxKSAmJiAhZGVmaW5lZChERVNfUklTQzIpICYmICFkZWZpbmVkKERFU19VTlJPTEwpCisvKiBTcGVjaWFsIGRlZmluZXMgd2hpY2ggY2hhbmdlIHRoZSB3YXkgdGhlIGNvZGUgaXMgYnVpbHQgZGVwZW5kaW5nIG9uIHRoZQorICAgQ1BVIGFuZCBPUy4gIEZvciBTR0kgbWFjaGluZXMgeW91IGNhbiB1c2UgX01JUFNfU1pMT05HICgzMiBvciA2NCkgdG8gZmluZAorICAgZXZlbiBuZXdlciBNSVBTIENQVSdzLCBidXQgYXQgdGhlIG1vbWVudCBvbmUgc2l6ZSBmaXRzIGFsbCBmb3IKKyAgIG9wdGltaXphdGlvbiBvcHRpb25zLiAgT2xkZXIgU3BhcmMncyB3b3JrIGJldHRlciB3aXRoIG9ubHkgVU5ST0xMLCBidXQKKyAgIHRoZXJlJ3Mgbm8gd2F5IHRvIHRlbGwgYXQgY29tcGlsZSB0aW1lIHdoYXQgaXQgaXMgeW91J3JlIHJ1bm5pbmcgb24gKi8KKyAKKyNpZiBkZWZpbmVkKCBzdW4gKQkJLyogTmV3ZXIgU3BhcmMncyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzEKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKCBfX3VsdHJpeCApCS8qIE9sZGVyIE1JUFMgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MyCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZCggX19vc2YxX18gKQkvKiBBbHBoYSAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzIKKyNlbGlmIGRlZmluZWQgKCBfQUlYICkJCS8qIFJTNjAwMCAqLworICAvKiBVbmtub3duICovCisjZWxpZiBkZWZpbmVkKCBfX2hwdXggKQkJLyogSFAtUEEgKi8KKyAgLyogVW5rbm93biAqLworI2VsaWYgZGVmaW5lZCggX19hdXggKQkJLyogNjhLICovCisgIC8qIFVua25vd24gKi8KKyNlbGlmIGRlZmluZWQoIF9fZGd1eCApCQkvKiA4OEsgKGJ1dCBQNiBpbiBsYXRlc3QgYm94ZXMpICovCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZCggX19zZ2kgKQkJLyogTmV3ZXIgTUlQUyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzIKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2X18pCS8qIHg4NiBib3hlcywgc2hvdWxkIGJlIGdjYyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzEKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZW5kaWYgLyogU3lzdGVtcy1zcGVjaWZpYyBzcGVlZCBkZWZpbmVzICovCisjZW5kaWYKKworI2VuZGlmIC8qIERFU19ERUZBVUxUX09QVElPTlMgKi8KKyNlbmRpZiAvKiBIRUFERVJfREVTX0xPQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL29wZW5zc2x2LmggYi9saWIvb3BlbnNzbC9jcnlwdG8vb3BlbnNzbHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmIxMTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL29wZW5zc2x2LmgKQEAgLTAsMCArMSw4OSBAQAorI2lmbmRlZiBIRUFERVJfT1BFTlNTTFZfSAorI2RlZmluZSBIRUFERVJfT1BFTlNTTFZfSAorCisvKiBOdW1lcmljIHJlbGVhc2UgdmVyc2lvbiBpZGVudGlmaWVyOgorICogTU5ORkZQUFM6IG1ham9yIG1pbm9yIGZpeCBwYXRjaCBzdGF0dXMKKyAqIFRoZSBzdGF0dXMgbmliYmxlIGhhcyBvbmUgb2YgdGhlIHZhbHVlcyAwIGZvciBkZXZlbG9wbWVudCwgMSB0byBlIGZvciBiZXRhcworICogMSB0byAxNCwgYW5kIGYgZm9yIHJlbGVhc2UuICBUaGUgcGF0Y2ggbGV2ZWwgaXMgZXhhY3RseSB0aGF0LgorICogRm9yIGV4YW1wbGU6CisgKiAwLjkuMy1kZXYJICAweDAwOTAzMDAwCisgKiAwLjkuMy1iZXRhMQkgIDB4MDA5MDMwMDEKKyAqIDAuOS4zLWJldGEyLWRldiAweDAwOTAzMDAyCisgKiAwLjkuMy1iZXRhMiAgICAweDAwOTAzMDAyIChzYW1lIGFzIC4uLmJldGEyLWRldikKKyAqIDAuOS4zCSAgMHgwMDkwMzAwZgorICogMC45LjNhCSAgMHgwMDkwMzAxZgorICogMC45LjQgCSAgMHgwMDkwNDAwZgorICogMS4yLjN6CSAgMHgxMDIwMzFhZgorICoKKyAqIEZvciBjb250aW51aXR5IHJlYXNvbnMgKGJlY2F1c2UgMC45LjUgaXMgYWxyZWFkeSBvdXQsIGFuZCBpcyBjb2RlZAorICogMHgwMDkwNTEwMCksIGJldHdlZW4gMC45LjUgYW5kIDAuOS42IHRoZSBjb2Rpbmcgb2YgdGhlIHBhdGNoIGxldmVsCisgKiBwYXJ0IGlzIHNsaWdodGx5IGRpZmZlcmVudCwgYnkgc2V0dGluZyB0aGUgaGlnaGVzdCBiaXQuICBUaGlzIG1lYW5zCisgKiB0aGF0IDAuOS41YSBsb29rcyBsaWtlIHRoaXM6IDB4MDA5MDU4MWYuICBBdCAwLjkuNiwgd2UgY2FuIHN0YXJ0CisgKiB3aXRoIDB4MDA5MDYwMFMuLi4KKyAqCisgKiAoUHJpb3IgdG8gMC45LjMtZGV2IGEgZGlmZmVyZW50IHNjaGVtZSB3YXMgdXNlZDogMC45LjJiIGlzIDB4MDkyMi4pCisgKiAoUHJpb3IgdG8gMC45LjVhIGJldGExLCBhIGRpZmZlcmVudCBzY2hlbWUgd2FzIHVzZWQ6IE1NTk5GRlJCQiBmb3IKKyAqICBtYWpvciBtaW5vciBmaXggZmluYWwgcGF0Y2gvYmV0YSkKKyAqLworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSCTB4MTAwMDAwMWZMCisjaWZkZWYgT1BFTlNTTF9GSVBTCisjZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9URVhUCSJPcGVuU1NMIDEuMC4wYS1maXBzIDEgSnVuIDIwMTAiCisjZWxzZQorI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fVEVYVAkiT3BlblNTTCAxLjAuMGEgMSBKdW4gMjAxMCIKKyNlbmRpZgorI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fUFRFWFQJIiBwYXJ0IG9mICIgT1BFTlNTTF9WRVJTSU9OX1RFWFQKKworCisvKiBUaGUgbWFjcm9zIGJlbG93IGFyZSB0byBiZSB1c2VkIGZvciBzaGFyZWQgbGlicmFyeSAoLnNvLCAuZGxsLCAuLi4pCisgKiB2ZXJzaW9uaW5nLiAgVGhhdCBraW5kIG9mIHZlcnNpb25pbmcgd29ya3MgYSBiaXQgZGlmZmVyZW50bHkgYmV0d2VlbgorICogb3BlcmF0aW5nIHN5c3RlbXMuICBUaGUgbW9zdCB1c3VhbCBzY2hlbWUgaXMgdG8gc2V0IGEgbWFqb3IgYW5kIGEgbWlub3IKKyAqIG51bWJlciwgYW5kIGhhdmUgdGhlIHJ1bnRpbWUgbG9hZGVyIGNoZWNrIHRoYXQgdGhlIG1ham9yIG51bWJlciBpcyBlcXVhbAorICogdG8gd2hhdCBpdCB3YXMgYXQgYXBwbGljYXRpb24gbGluayB0aW1lLCB3aGlsZSB0aGUgbWlub3IgbnVtYmVyIGhhcyB0bworICogYmUgZ3JlYXRlciBvciBlcXVhbCB0byB3aGF0IGl0IHdhcyBhdCBhcHBsaWNhdGlvbiBsaW5rIHRpbWUuICBXaXRoIHRoaXMKKyAqIHNjaGVtZSwgdGhlIHZlcnNpb24gbnVtYmVyIGlzIHVzdWFsbHkgcGFydCBvZiB0aGUgZmlsZSBuYW1lLCBsaWtlIHRoaXM6CisgKgorICoJbGliY3J5cHRvLnNvLjAuOQorICoKKyAqIFNvbWUgdW5peGVuIGFsc28gbWFrZSBhIHNvZnRsaW5rIHdpdGggdGhlIG1ham9yIHZlcnNvbiBudW1iZXIgb25seToKKyAqCisgKglsaWJjcnlwdG8uc28uMAorICoKKyAqIE9uIFRydTY0IGFuZCBJUklYIDYueCBpdCB3b3JrcyBhIGxpdHRsZSBiaXQgZGlmZmVyZW50bHkuICBUaGVyZSwgdGhlCisgKiBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIGlzIHN0b3JlZCBpbiB0aGUgZmlsZSwgYW5kIGlzIGFjdHVhbGx5IGEgc2VyaWVzCisgKiBvZiB2ZXJzaW9ucywgc2VwYXJhdGVkIGJ5IGNvbG9ucy4gIFRoZSByaWdodG1vc3QgdmVyc2lvbiBwcmVzZW50IGluIHRoZQorICogbGlicmFyeSB3aGVuIGxpbmtpbmcgYW4gYXBwbGljYXRpb24gaXMgc3RvcmVkIGluIHRoZSBhcHBsaWNhdGlvbiB0byBiZQorICogbWF0Y2hlZCBhdCBydW4gdGltZS4gIFdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHJ1biwgYSBjaGVjayBpcyBkb25lIHRvCisgKiBzZWUgaWYgdGhlIGxpYnJhcnkgdmVyc2lvbiBzdG9yZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG1hdGNoZXMgYW55IG9mIHRoZQorICogdmVyc2lvbnMgaW4gdGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBsaWJyYXJ5IGl0c2VsZi4KKyAqIFRoaXMgdmVyc2lvbiBzdHJpbmcgY2FuIGJlIGNvbnN0cnVjdGVkIGluIGFueSB3YXksIGRlcGVuZGluZyBvbiB3aGF0CisgKiBraW5kIG9mIG1hdGNoaW5nIGlzIGRlc2lyZWQuICBIb3dldmVyLCB0byBpbXBsZW1lbnQgdGhlIHNhbWUgc2NoZW1lIGFzCisgKiB0aGUgb25lIHVzZWQgaW4gdGhlIG90aGVyIHVuaXhlbiwgYWxsIGNvbXBhdGlibGUgdmVyc2lvbnMsIGZyb20gbG93ZXN0CisgKiB0byBoaWdoZXN0LCBzaG91bGQgYmUgcGFydCBvZiB0aGUgc3RyaW5nLiAgQ29uc2VjdXRpdmUgYnVpbGRzIHdvdWxkCisgKiBnaXZlIHRoZSBmb2xsb3dpbmcgdmVyc2lvbnMgc3RyaW5nczoKKyAqCisgKgkzLjAKKyAqCTMuMDozLjEKKyAqCTMuMDozLjE6My4yCisgKgk0LjAKKyAqCTQuMDo0LjEKKyAqCisgKiBOb3RpY2UgaG93IHZlcnNpb24gNCBpcyBjb21wbGV0ZWx5IGluY29tcGF0aWJsZSB3aXRoIHZlcnNpb24sIGFuZAorICogdGhlcmVmb3JlIGdpdmUgdGhlIGJyZWFjaCB5b3UgY2FuIHNlZS4KKyAqCisgKiBUaGVyZSBtYXkgYmUgb3RoZXIgc2NoZW1lcyBhcyB3ZWxsIHRoYXQgSSBoYXZlbid0IHlldCBkaXNjb3ZlcmVkLgorICoKKyAqIFNvLCBoZXJlJ3MgdGhlIHdheSBpdCB3b3JrcyBoZXJlOiBmaXJzdCBvZiBhbGwsIHRoZSBsaWJyYXJ5IHZlcnNpb24KKyAqIG51bWJlciBkb2Vzbid0IG5lZWQgYXQgYWxsIHRvIG1hdGNoIHRoZSBvdmVyYWxsIE9wZW5TU0wgdmVyc2lvbi4KKyAqIEhvd2V2ZXIsIGl0J3MgbmljZSBhbmQgbW9yZSB1bmRlcnN0YW5kYWJsZSBpZiBpdCBhY3R1YWxseSBkb2VzLgorICogVGhlIGN1cnJlbnQgbGlicmFyeSB2ZXJzaW9uIGlzIHN0b3JlZCBpbiB0aGUgbWFjcm8gU0hMSUJfVkVSU0lPTl9OVU1CRVIsCisgKiB3aGljaCBpcyBqdXN0IGEgcGllY2Ugb2YgdGV4dCBpbiB0aGUgZm9ybWF0ICJNLm0uZSIgKE1ham9yLCBtaW5vciwgZWRpdCkuCisgKiBGb3IgdGhlIHNha2Ugb2YgVHJ1NjQsIElSSVgsIGFuZCBhbnkgb3RoZXIgT1MgdGhhdCBiZWhhdmVzIGluIHNpbWlsYXIgd2F5cywKKyAqIHdlIG5lZWQgdG8ga2VlcCBhIGhpc3Rvcnkgb2YgdmVyc2lvbiBudW1iZXJzLCB3aGljaCBpcyBkb25lIGluIHRoZQorICogbWFjcm8gU0hMSUJfVkVSU0lPTl9ISVNUT1JZLiAgVGhlIG51bWJlcnMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMgYW5kCisgKiBzaG91bGQgb25seSBrZWVwIHRoZSB2ZXJzaW9ucyB0aGF0IGFyZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50LgorICovCisjZGVmaW5lIFNITElCX1ZFUlNJT05fSElTVE9SWSAiIgorI2RlZmluZSBTSExJQl9WRVJTSU9OX05VTUJFUiAiMS4wLjAiCisKKworI2VuZGlmIC8qIEhFQURFUl9PUEVOU1NMVl9IICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vb3NzbF90eXAuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9vc3NsX3R5cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYmQ3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vb3NzbF90eXAuaApAQCAtMCwwICsxLDIwMCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX09QRU5TU0xfVFlQRVNfSAorI2RlZmluZSBIRUFERVJfT1BFTlNTTF9UWVBFU19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisKKyNpZmRlZiBOT19BU04xX1RZUEVERUZTCisjZGVmaW5lIEFTTjFfSU5URUdFUgkJQVNOMV9TVFJJTkcKKyNkZWZpbmUgQVNOMV9FTlVNRVJBVEVECQlBU04xX1NUUklORworI2RlZmluZSBBU04xX0JJVF9TVFJJTkcJCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfT0NURVRfU1RSSU5HCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfUFJJTlRBQkxFU1RSSU5HCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfVDYxU1RSSU5HCQlBU04xX1NUUklORworI2RlZmluZSBBU04xX0lBNVNUUklORwkJQVNOMV9TVFJJTkcKKyNkZWZpbmUgQVNOMV9VVENUSU1FCQlBU04xX1NUUklORworI2RlZmluZSBBU04xX0dFTkVSQUxJWkVEVElNRQlBU04xX1NUUklORworI2RlZmluZSBBU04xX1RJTUUJCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfR0VORVJBTFNUUklORwlBU04xX1NUUklORworI2RlZmluZSBBU04xX1VOSVZFUlNBTFNUUklORwlBU04xX1NUUklORworI2RlZmluZSBBU04xX0JNUFNUUklORwkJQVNOMV9TVFJJTkcKKyNkZWZpbmUgQVNOMV9WSVNJQkxFU1RSSU5HCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfVVRGOFNUUklORwkJQVNOMV9TVFJJTkcKKyNkZWZpbmUgQVNOMV9CT09MRUFOCQlpbnQKKyNkZWZpbmUgQVNOMV9OVUxMCQlpbnQKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0lOVEVHRVI7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0VOVU1FUkFURUQ7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0JJVF9TVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX09DVEVUX1NUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfUFJJTlRBQkxFU1RSSU5HOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9UNjFTVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0lBNVNUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfR0VORVJBTFNUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfVU5JVkVSU0FMU1RSSU5HOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9CTVBTVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX1VUQ1RJTUU7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX1RJTUU7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0dFTkVSQUxJWkVEVElNRTsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfVklTSUJMRVNUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfVVRGOFNUUklORzsKK3R5cGVkZWYgaW50IEFTTjFfQk9PTEVBTjsKK3R5cGVkZWYgaW50IEFTTjFfTlVMTDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBhc24xX3BjdHhfc3QgQVNOMV9QQ1RYOworCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzIKKyN1bmRlZiBYNTA5X05BTUUKKyN1bmRlZiBYNTA5X0VYVEVOU0lPTlMKKyN1bmRlZiBYNTA5X0NFUlRfUEFJUgorI3VuZGVmIFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMCisjdW5kZWYgT0NTUF9SRVFVRVNUCisjdW5kZWYgT0NTUF9SRVNQT05TRQorI2VuZGlmCisKKyNpZmRlZiBCSUdOVU0KKyN1bmRlZiBCSUdOVU0KKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgYmlnbnVtX3N0IEJJR05VTTsKK3R5cGVkZWYgc3RydWN0IGJpZ251bV9jdHggQk5fQ1RYOwordHlwZWRlZiBzdHJ1Y3QgYm5fYmxpbmRpbmdfc3QgQk5fQkxJTkRJTkc7Cit0eXBlZGVmIHN0cnVjdCBibl9tb250X2N0eF9zdCBCTl9NT05UX0NUWDsKK3R5cGVkZWYgc3RydWN0IGJuX3JlY3BfY3R4X3N0IEJOX1JFQ1BfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgYm5fZ2VuY2Jfc3QgQk5fR0VOQ0I7CisKK3R5cGVkZWYgc3RydWN0IGJ1Zl9tZW1fc3QgQlVGX01FTTsKKwordHlwZWRlZiBzdHJ1Y3QgZXZwX2NpcGhlcl9zdCBFVlBfQ0lQSEVSOwordHlwZWRlZiBzdHJ1Y3QgZXZwX2NpcGhlcl9jdHhfc3QgRVZQX0NJUEhFUl9DVFg7Cit0eXBlZGVmIHN0cnVjdCBlbnZfbWRfc3QgRVZQX01EOwordHlwZWRlZiBzdHJ1Y3QgZW52X21kX2N0eF9zdCBFVlBfTURfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgZXZwX3BrZXlfc3QgRVZQX1BLRVk7CisKK3R5cGVkZWYgc3RydWN0IGV2cF9wa2V5X2FzbjFfbWV0aG9kX3N0IEVWUF9QS0VZX0FTTjFfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBldnBfcGtleV9tZXRob2Rfc3QgRVZQX1BLRVlfTUVUSE9EOwordHlwZWRlZiBzdHJ1Y3QgZXZwX3BrZXlfY3R4X3N0IEVWUF9QS0VZX0NUWDsKKwordHlwZWRlZiBzdHJ1Y3QgZGhfc3QgREg7Cit0eXBlZGVmIHN0cnVjdCBkaF9tZXRob2QgREhfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBkc2Ffc3QgRFNBOwordHlwZWRlZiBzdHJ1Y3QgZHNhX21ldGhvZCBEU0FfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCByc2Ffc3QgUlNBOwordHlwZWRlZiBzdHJ1Y3QgcnNhX21ldGhfc3QgUlNBX01FVEhPRDsKKwordHlwZWRlZiBzdHJ1Y3QgcmFuZF9tZXRoX3N0IFJBTkRfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBlY2RoX21ldGhvZCBFQ0RIX01FVEhPRDsKK3R5cGVkZWYgc3RydWN0IGVjZHNhX21ldGhvZCBFQ0RTQV9NRVRIT0Q7CisKK3R5cGVkZWYgc3RydWN0IHg1MDlfc3QgWDUwOTsKK3R5cGVkZWYgc3RydWN0IFg1MDlfYWxnb3Jfc3QgWDUwOV9BTEdPUjsKK3R5cGVkZWYgc3RydWN0IFg1MDlfY3JsX3N0IFg1MDlfQ1JMOwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9jcmxfbWV0aG9kX3N0IFg1MDlfQ1JMX01FVEhPRDsKK3R5cGVkZWYgc3RydWN0IHg1MDlfcmV2b2tlZF9zdCBYNTA5X1JFVk9LRUQ7Cit0eXBlZGVmIHN0cnVjdCBYNTA5X25hbWVfc3QgWDUwOV9OQU1FOwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9wdWJrZXlfc3QgWDUwOV9QVUJLRVk7Cit0eXBlZGVmIHN0cnVjdCB4NTA5X3N0b3JlX3N0IFg1MDlfU1RPUkU7Cit0eXBlZGVmIHN0cnVjdCB4NTA5X3N0b3JlX2N0eF9zdCBYNTA5X1NUT1JFX0NUWDsKKwordHlwZWRlZiBzdHJ1Y3QgcGtjczhfcHJpdl9rZXlfaW5mb19zdCBQS0NTOF9QUklWX0tFWV9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB2M19leHRfY3R4IFg1MDlWM19DVFg7Cit0eXBlZGVmIHN0cnVjdCBjb25mX3N0IENPTkY7CisKK3R5cGVkZWYgc3RydWN0IHN0b3JlX3N0IFNUT1JFOwordHlwZWRlZiBzdHJ1Y3Qgc3RvcmVfbWV0aG9kX3N0IFNUT1JFX01FVEhPRDsKKwordHlwZWRlZiBzdHJ1Y3QgdWlfc3QgVUk7Cit0eXBlZGVmIHN0cnVjdCB1aV9tZXRob2Rfc3QgVUlfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBzdF9FUlJfRk5TIEVSUl9GTlM7CisKK3R5cGVkZWYgc3RydWN0IGVuZ2luZV9zdCBFTkdJTkU7Cit0eXBlZGVmIHN0cnVjdCBzc2xfc3QgU1NMOwordHlwZWRlZiBzdHJ1Y3Qgc3NsX2N0eF9zdCBTU0xfQ1RYOworCit0eXBlZGVmIHN0cnVjdCBYNTA5X1BPTElDWV9OT0RFX3N0IFg1MDlfUE9MSUNZX05PREU7Cit0eXBlZGVmIHN0cnVjdCBYNTA5X1BPTElDWV9MRVZFTF9zdCBYNTA5X1BPTElDWV9MRVZFTDsKK3R5cGVkZWYgc3RydWN0IFg1MDlfUE9MSUNZX1RSRUVfc3QgWDUwOV9QT0xJQ1lfVFJFRTsKK3R5cGVkZWYgc3RydWN0IFg1MDlfUE9MSUNZX0NBQ0hFX3N0IFg1MDlfUE9MSUNZX0NBQ0hFOworCit0eXBlZGVmIHN0cnVjdCBBVVRIT1JJVFlfS0VZSURfc3QgQVVUSE9SSVRZX0tFWUlEOwordHlwZWRlZiBzdHJ1Y3QgRElTVF9QT0lOVF9zdCBESVNUX1BPSU5UOwordHlwZWRlZiBzdHJ1Y3QgSVNTVUlOR19ESVNUX1BPSU5UX3N0IElTU1VJTkdfRElTVF9QT0lOVDsKK3R5cGVkZWYgc3RydWN0IE5BTUVfQ09OU1RSQUlOVFNfc3QgTkFNRV9DT05TVFJBSU5UUzsKKworICAvKiBJZiBwbGFjZWQgaW4gcGtjczEyLmgsIHdlIGVuZCB1cCB3aXRoIGEgY2lyY3VsYXIgZGVwZW5jeSB3aXRoIHBrY3M3LmggKi8KKyNkZWZpbmUgREVDTEFSRV9QS0NTMTJfU1RBQ0tfT0YodHlwZSkgLyogTm90aGluZyAqLworI2RlZmluZSBJTVBMRU1FTlRfUEtDUzEyX1NUQUNLX09GKHR5cGUpIC8qIE5vdGhpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRvX2V4X2RhdGFfc3QgQ1JZUFRPX0VYX0RBVEE7CisvKiBDYWxsYmFjayB0eXBlcyBmb3IgY3J5cHRvLmggKi8KK3R5cGVkZWYgaW50IENSWVBUT19FWF9uZXcodm9pZCAqcGFyZW50LCB2b2lkICpwdHIsIENSWVBUT19FWF9EQVRBICphZCwKKwkJCQkJaW50IGlkeCwgbG9uZyBhcmdsLCB2b2lkICphcmdwKTsKK3R5cGVkZWYgdm9pZCBDUllQVE9fRVhfZnJlZSh2b2lkICpwYXJlbnQsIHZvaWQgKnB0ciwgQ1JZUFRPX0VYX0RBVEEgKmFkLAorCQkJCQlpbnQgaWR4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApOwordHlwZWRlZiBpbnQgQ1JZUFRPX0VYX2R1cChDUllQVE9fRVhfREFUQSAqdG8sIENSWVBUT19FWF9EQVRBICpmcm9tLCB2b2lkICpmcm9tX2QsIAorCQkJCQlpbnQgaWR4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApOworCit0eXBlZGVmIHN0cnVjdCBvY3NwX3JlcV9jdHhfc3QgT0NTUF9SRVFfQ1RYOwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9yZXNwb25zZV9zdCBPQ1NQX1JFU1BPTlNFOwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9yZXNwb25kZXJfaWRfc3QgT0NTUF9SRVNQSUQ7CisKKyNlbmRpZiAvKiBkZWYgSEVBREVSX09QRU5TU0xfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9tZXNzYWdlIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9tZXNzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YmY5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL21lc3NhZ2UKQEAgLTAsMCArMSwxNiBAQAorLS0tLS1CRUdJTiBQUklWQUNZLUVOSEFOQ0VEIE1FU1NBR0UtLS0tLQorUHJvYy1UeXBlOiA0LEVOQ1JZUFRFRAorUHJvYy1UeXBlOiA0LE1JQy1PTkxZCitQcm9jLVR5cGU6IDQsTUlDLUNMRUFSCitDb250ZW50LURvbWFpbjogUkZDODIyCitERUstSW5mbzogREVTLUNCQywwMTIzNDU2Nzg5YWJjZGVmCitPcmlnaW5hdG9yLUNlcnRpZmljYXRlCisgeHh4eAorSXNzdWVyLUNlcnRpZmljYXRlCisgeHh4eAorTUlDLUluZm86IFJTQS1NRDUsUlNBLAorIHh4eHgKKworCistLS0tLUVORCBQUklWQUNZLUVOSEFOQ0VEIE1FU1NBR0UtLS0tLQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbS5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZhYmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW0uaApAQCAtMCwwICsxLDY0MSBAQAorLyogY3J5cHRvL3BlbS9wZW0uaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9QRU1fSAorI2RlZmluZSBIRUFERVJfUEVNX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU1RBQ0sKKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtMi5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFBFTV9CVUZTSVpFCQkxMDI0CisKKyNkZWZpbmUgUEVNX09CSl9VTkRFRgkJMAorI2RlZmluZSBQRU1fT0JKX1g1MDkJCTEKKyNkZWZpbmUgUEVNX09CSl9YNTA5X1JFUQkyCisjZGVmaW5lIFBFTV9PQkpfQ1JMCQkzCisjZGVmaW5lIFBFTV9PQkpfU1NMX1NFU1NJT04JNAorI2RlZmluZSBQRU1fT0JKX1BSSVZfS0VZCTEwCisjZGVmaW5lIFBFTV9PQkpfUFJJVl9SU0EJMTEKKyNkZWZpbmUgUEVNX09CSl9QUklWX0RTQQkxMgorI2RlZmluZSBQRU1fT0JKX1BSSVZfREgJCTEzCisjZGVmaW5lIFBFTV9PQkpfUFVCX1JTQQkJMTQKKyNkZWZpbmUgUEVNX09CSl9QVUJfRFNBCQkxNQorI2RlZmluZSBQRU1fT0JKX1BVQl9ESAkJMTYKKyNkZWZpbmUgUEVNX09CSl9ESFBBUkFNUwkxNworI2RlZmluZSBQRU1fT0JKX0RTQVBBUkFNUwkxOAorI2RlZmluZSBQRU1fT0JKX1BSSVZfUlNBX1BVQkxJQwkxOQorI2RlZmluZSBQRU1fT0JKX1BSSVZfRUNEU0EJMjAKKyNkZWZpbmUgUEVNX09CSl9QVUJfRUNEU0EJMjEKKyNkZWZpbmUgUEVNX09CSl9FQ1BBUkFNRVRFUlMJMjIKKworI2RlZmluZSBQRU1fRVJST1IJCTMwCisjZGVmaW5lIFBFTV9ERUtfREVTX0NCQyAgICAgICAgIDQwCisjZGVmaW5lIFBFTV9ERUtfSURFQV9DQkMgICAgICAgIDQ1CisjZGVmaW5lIFBFTV9ERUtfREVTX0VERSAgICAgICAgIDUwCisjZGVmaW5lIFBFTV9ERUtfREVTX0VDQiAgICAgICAgIDYwCisjZGVmaW5lIFBFTV9ERUtfUlNBICAgICAgICAgICAgIDcwCisjZGVmaW5lIFBFTV9ERUtfUlNBX01EMiAgICAgICAgIDgwCisjZGVmaW5lIFBFTV9ERUtfUlNBX01ENSAgICAgICAgIDkwCisKKyNkZWZpbmUgUEVNX01EX01EMgkJTklEX21kMgorI2RlZmluZSBQRU1fTURfTUQ1CQlOSURfbWQ1CisjZGVmaW5lIFBFTV9NRF9TSEEJCU5JRF9zaGEKKyNkZWZpbmUgUEVNX01EX01EMl9SU0EJCU5JRF9tZDJXaXRoUlNBRW5jcnlwdGlvbgorI2RlZmluZSBQRU1fTURfTUQ1X1JTQQkJTklEX21kNVdpdGhSU0FFbmNyeXB0aW9uCisjZGVmaW5lIFBFTV9NRF9TSEFfUlNBCQlOSURfc2hhMVdpdGhSU0FFbmNyeXB0aW9uCisKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5X09MRAkiWDUwOSBDRVJUSUZJQ0FURSIKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5CQkiQ0VSVElGSUNBVEUiCisjZGVmaW5lIFBFTV9TVFJJTkdfWDUwOV9QQUlSCSJDRVJUSUZJQ0FURSBQQUlSIgorI2RlZmluZSBQRU1fU1RSSU5HX1g1MDlfVFJVU1RFRAkiVFJVU1RFRCBDRVJUSUZJQ0FURSIKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5X1JFUV9PTEQJIk5FVyBDRVJUSUZJQ0FURSBSRVFVRVNUIgorI2RlZmluZSBQRU1fU1RSSU5HX1g1MDlfUkVRCSJDRVJUSUZJQ0FURSBSRVFVRVNUIgorI2RlZmluZSBQRU1fU1RSSU5HX1g1MDlfQ1JMCSJYNTA5IENSTCIKKyNkZWZpbmUgUEVNX1NUUklOR19FVlBfUEtFWQkiQU5ZIFBSSVZBVEUgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX1BVQkxJQwkiUFVCTElDIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19SU0EJCSJSU0EgUFJJVkFURSBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfUlNBX1BVQkxJQwkiUlNBIFBVQkxJQyBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfRFNBCQkiRFNBIFBSSVZBVEUgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX0RTQV9QVUJMSUMJIkRTQSBQVUJMSUMgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX1BLQ1M3CSJQS0NTNyIKKyNkZWZpbmUgUEVNX1NUUklOR19QS0NTN19TSUdORUQJIlBLQ1MgIzcgU0lHTkVEIERBVEEiCisjZGVmaW5lIFBFTV9TVFJJTkdfUEtDUzgJIkVOQ1JZUFRFRCBQUklWQVRFIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19QS0NTOElORgkiUFJJVkFURSBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfREhQQVJBTVMJIkRIIFBBUkFNRVRFUlMiCisjZGVmaW5lIFBFTV9TVFJJTkdfU1NMX1NFU1NJT04JIlNTTCBTRVNTSU9OIFBBUkFNRVRFUlMiCisjZGVmaW5lIFBFTV9TVFJJTkdfRFNBUEFSQU1TCSJEU0EgUEFSQU1FVEVSUyIKKyNkZWZpbmUgUEVNX1NUUklOR19FQ0RTQV9QVUJMSUMgIkVDRFNBIFBVQkxJQyBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfRUNQQVJBTUVURVJTICJFQyBQQVJBTUVURVJTIgorI2RlZmluZSBQRU1fU1RSSU5HX0VDUFJJVkFURUtFWQkiRUMgUFJJVkFURSBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfUEFSQU1FVEVSUwkiUEFSQU1FVEVSUyIKKyNkZWZpbmUgUEVNX1NUUklOR19DTVMJCSJDTVMiCisKKyAgLyogTm90ZSB0aGF0IHRoaXMgc3RydWN0dXJlIGlzIGluaXRpYWxpc2VkIGJ5IFBFTV9TZWFsSW5pdCBhbmQgY2xlYW5lZCB1cAorICAgICBieSBQRU1fU2VhbEZpbmFsIChhdCBsZWFzdCBmb3Igbm93KSAqLwordHlwZWRlZiBzdHJ1Y3QgUEVNX0VuY29kZV9TZWFsX3N0CisJeworCUVWUF9FTkNPREVfQ1RYIGVuY29kZTsKKwlFVlBfTURfQ1RYIG1kOworCUVWUF9DSVBIRVJfQ1RYIGNpcGhlcjsKKwl9IFBFTV9FTkNPREVfU0VBTF9DVFg7CisKKy8qIGVuY190eXBlIGlzIG9uZSBvZmYgKi8KKyNkZWZpbmUgUEVNX1RZUEVfRU5DUllQVEVEICAgICAgMTAKKyNkZWZpbmUgUEVNX1RZUEVfTUlDX09OTFkgICAgICAgMjAKKyNkZWZpbmUgUEVNX1RZUEVfTUlDX0NMRUFSICAgICAgMzAKKyNkZWZpbmUgUEVNX1RZUEVfQ0xFQVIJCTQwCisKK3R5cGVkZWYgc3RydWN0IHBlbV9yZWNpcF9zdAorCXsKKwljaGFyICpuYW1lOworCVg1MDlfTkFNRSAqZG47CisKKwlpbnQgY2lwaGVyOworCWludCBrZXlfZW5jOworCS8qCWNoYXIgaXZbOF07IHVudXNlZCBhbmQgd3Jvbmcgc2l6ZSAqLworCX0gUEVNX1VTRVI7CisKK3R5cGVkZWYgc3RydWN0IHBlbV9jdHhfc3QKKwl7CisJaW50IHR5cGU7CQkvKiB3aGF0IHR5cGUgb2Ygb2JqZWN0ICovCisKKwlzdHJ1Y3QJeworCQlpbnQgdmVyc2lvbjsJCisJCWludCBtb2RlOwkJCisJCX0gcHJvY190eXBlOworCisJY2hhciAqZG9tYWluOworCisJc3RydWN0CXsKKwkJaW50IGNpcGhlcjsKKwkvKiB1bnVzZWQsIGFuZCB3cm9uZyBzaXplCisJICAgdW5zaWduZWQgY2hhciBpdls4XTsgKi8KKwkJfSBERUtfaW5mbzsKKwkJCisJUEVNX1VTRVIgKm9yaWdpbmF0b3I7CisKKwlpbnQgbnVtX3JlY2lwaWVudDsKKwlQRU1fVVNFUiAqKnJlY2lwaWVudDsKKworCS8qIFhYWChiZW4pOiBkb24jdCB0aGluayB0aGlzIGlzIHVzZWQhIAorCQlTVEFDSyAqeDUwOV9jaGFpbjsJLyAqIGNlcnRpZmljYXRlIGNoYWluICovCisJRVZQX01EICptZDsJCS8qIHNpZ25hdHVyZSB0eXBlICovCisKKwlpbnQgbWRfZW5jOwkJLyogaXMgdGhlIG1kIGVuY3J5cHRlZCBvciBub3Q/ICovCisJaW50IG1kX2xlbjsJCS8qIGxlbmd0aCBvZiBtZF9kYXRhICovCisJY2hhciAqbWRfZGF0YTsJCS8qIG1lc3NhZ2UgZGlnZXN0LCBjb3VsZCBiZSBwa2V5IGVuY3J5cHRlZCAqLworCisJRVZQX0NJUEhFUiAqZGVjOwkvKiBkYXRlIGVuY3J5cHRpb24gY2lwaGVyICovCisJaW50IGtleV9sZW47CQkvKiBrZXkgbGVuZ3RoICovCisJdW5zaWduZWQgY2hhciAqa2V5OwkvKiBrZXkgKi8KKwkvKiB1bnVzZWQsIGFuZCB3cm9uZyBzaXplCisJICAgdW5zaWduZWQgY2hhciBpdls4XTsgKi8KKworCQorCWludCAgZGF0YV9lbmM7CQkvKiBpcyB0aGUgZGF0YSBlbmNyeXB0ZWQgKi8KKwlpbnQgZGF0YV9sZW47CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl9IFBFTV9DVFg7CisKKy8qIFRoZXNlIG1hY3JvcyBtYWtlIHRoZSBQRU1fcmVhZC9QRU1fd3JpdGUgZnVuY3Rpb25zIGVhc2llciB0byBtYWludGFpbiBhbmQKKyAqIHdyaXRlLiBOb3cgdGhleSBhcmUgYWxsIGltcGxlbWVudGVkIHdpdGggZWl0aGVyOgorICogSU1QTEVNRU5UX1BFTV9ydyguLi4pIG9yIElNUExFTUVOVF9QRU1fcndfY2IoLi4uKQorICovCisKKyNpZmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fcmVhZF9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIC8qKi8KKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIC8qKi8KKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9mcF9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIC8qKi8KKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIC8qKi8KKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9mcF9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIC8qKi8KKworI2Vsc2UKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3JlYWRfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCit0eXBlICpQRU1fcmVhZF8jI25hbWUoRklMRSAqZnAsIHR5cGUgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KVwKK3sgXAorcmV0dXJuIFBFTV9BU04xX3JlYWQoKGQyaV9vZl92b2lkICopZDJpXyMjYXNuMSwgc3RyLGZwLCh2b2lkICoqKXgsY2IsdSk7IFwKK30gCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK2ludCBQRU1fd3JpdGVfIyNuYW1lKEZJTEUgKmZwLCB0eXBlICp4KSBcCit7IFwKK3JldHVybiBQRU1fQVNOMV93cml0ZSgoaTJkX29mX3ZvaWQgKilpMmRfIyNhc24xLHN0cixmcCx4LE5VTEwsTlVMTCwwLE5VTEwsTlVMTCk7IFwKK30KKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2ZwX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAoraW50IFBFTV93cml0ZV8jI25hbWUoRklMRSAqZnAsIGNvbnN0IHR5cGUgKngpIFwKK3sgXAorcmV0dXJuIFBFTV9BU04xX3dyaXRlKChpMmRfb2Zfdm9pZCAqKWkyZF8jI2FzbjEsc3RyLGZwLCh2b2lkICopeCxOVUxMLE5VTEwsMCxOVUxMLE5VTEwpOyBcCit9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9mcChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK2ludCBQRU1fd3JpdGVfIyNuYW1lKEZJTEUgKmZwLCB0eXBlICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsIFwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCBcCisJCSAgdm9pZCAqdSkgXAorCXsgXAorCXJldHVybiBQRU1fQVNOMV93cml0ZSgoaTJkX29mX3ZvaWQgKilpMmRfIyNhc24xLHN0cixmcCx4LGVuYyxrc3RyLGtsZW4sY2IsdSk7IFwKKwl9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9mcF9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK2ludCBQRU1fd3JpdGVfIyNuYW1lKEZJTEUgKmZwLCB0eXBlICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsIFwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCBcCisJCSAgdm9pZCAqdSkgXAorCXsgXAorCXJldHVybiBQRU1fQVNOMV93cml0ZSgoaTJkX29mX3ZvaWQgKilpMmRfIyNhc24xLHN0cixmcCx4LGVuYyxrc3RyLGtsZW4sY2IsdSk7IFwKKwl9CisKKyNlbmRpZgorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fcmVhZF9iaW8obmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCit0eXBlICpQRU1fcmVhZF9iaW9fIyNuYW1lKEJJTyAqYnAsIHR5cGUgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KVwKK3sgXAorcmV0dXJuIFBFTV9BU04xX3JlYWRfYmlvKChkMmlfb2Zfdm9pZCAqKWQyaV8jI2FzbjEsIHN0cixicCwodm9pZCAqKil4LGNiLHUpOyBcCit9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9iaW8obmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCitpbnQgUEVNX3dyaXRlX2Jpb18jI25hbWUoQklPICpicCwgdHlwZSAqeCkgXAoreyBcCityZXR1cm4gUEVNX0FTTjFfd3JpdGVfYmlvKChpMmRfb2Zfdm9pZCAqKWkyZF8jI2FzbjEsc3RyLGJwLHgsTlVMTCxOVUxMLDAsTlVMTCxOVUxMKTsgXAorfQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfYmlvX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAoraW50IFBFTV93cml0ZV9iaW9fIyNuYW1lKEJJTyAqYnAsIGNvbnN0IHR5cGUgKngpIFwKK3sgXAorcmV0dXJuIFBFTV9BU04xX3dyaXRlX2JpbygoaTJkX29mX3ZvaWQgKilpMmRfIyNhc24xLHN0cixicCwodm9pZCAqKXgsTlVMTCxOVUxMLDAsTlVMTCxOVUxMKTsgXAorfQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY2JfYmlvKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAoraW50IFBFTV93cml0ZV9iaW9fIyNuYW1lKEJJTyAqYnAsIHR5cGUgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgXAorCSAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpIFwKKwl7IFwKKwlyZXR1cm4gUEVNX0FTTjFfd3JpdGVfYmlvKChpMmRfb2Zfdm9pZCAqKWkyZF8jI2FzbjEsc3RyLGJwLHgsZW5jLGtzdHIsa2xlbixjYix1KTsgXAorCX0KKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2Jpb19jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK2ludCBQRU1fd3JpdGVfYmlvXyMjbmFtZShCSU8gKmJwLCB0eXBlICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsIFwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KSBcCisJeyBcCisJcmV0dXJuIFBFTV9BU04xX3dyaXRlX2JpbygoaTJkX29mX3ZvaWQgKilpMmRfIyNhc24xLHN0cixicCwodm9pZCAqKXgsZW5jLGtzdHIsa2xlbixjYix1KTsgXAorCX0KKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfYmlvKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfYmlvX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfZnBfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NiKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfY2JfYmlvKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfY2JfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfY2JfYmlvX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fd3JpdGVfY2JfZnBfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3JlYWQobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV9yZWFkX2JpbyhuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3JlYWRfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3J3KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fcmVhZChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3J3X2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fcmVhZChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3J3X2NiKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fcmVhZChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2NiKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkKKworLyogVGhlc2UgYXJlIHRoZSBzYW1lIGV4Y2VwdCB0aGV5IGFyZSBmb3IgdGhlIGRlY2xhcmF0aW9ucyAqLworCisjaWYgZGVmaW5lZChPUEVOU1NMX05PX0ZQX0FQSSkKKworI2RlZmluZSBERUNMQVJFX1BFTV9yZWFkX2ZwKG5hbWUsIHR5cGUpIC8qKi8KKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfZnAobmFtZSwgdHlwZSkgLyoqLworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9jYl9mcChuYW1lLCB0eXBlKSAvKiovCisKKyNlbHNlCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fcmVhZF9mcChuYW1lLCB0eXBlKSBcCisJdHlwZSAqUEVNX3JlYWRfIyNuYW1lKEZJTEUgKmZwLCB0eXBlICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfZnAobmFtZSwgdHlwZSkgXAorCWludCBQRU1fd3JpdGVfIyNuYW1lKEZJTEUgKmZwLCB0eXBlICp4KTsKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9mcF9jb25zdChuYW1lLCB0eXBlKSBcCisJaW50IFBFTV93cml0ZV8jI25hbWUoRklMRSAqZnAsIGNvbnN0IHR5cGUgKngpOworCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2NiX2ZwKG5hbWUsIHR5cGUpIFwKKwlpbnQgUEVNX3dyaXRlXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLCBcCisJICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCisjZGVmaW5lIERFQ0xBUkVfUEVNX3JlYWRfYmlvKG5hbWUsIHR5cGUpIFwKKwl0eXBlICpQRU1fcmVhZF9iaW9fIyNuYW1lKEJJTyAqYnAsIHR5cGUgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9iaW8obmFtZSwgdHlwZSkgXAorCWludCBQRU1fd3JpdGVfYmlvXyMjbmFtZShCSU8gKmJwLCB0eXBlICp4KTsKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9iaW9fY29uc3QobmFtZSwgdHlwZSkgXAorCWludCBQRU1fd3JpdGVfYmlvXyMjbmFtZShCSU8gKmJwLCBjb25zdCB0eXBlICp4KTsKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9jYl9iaW8obmFtZSwgdHlwZSkgXAorCWludCBQRU1fd3JpdGVfYmlvXyMjbmFtZShCSU8gKmJwLCB0eXBlICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsIFwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworI2Vsc2UKKworI2RlZmluZSBERUNMQVJFX1BFTV9yZWFkX2JpbyhuYW1lLCB0eXBlKSAvKiovCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2JpbyhuYW1lLCB0eXBlKSAvKiovCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2Jpb19jb25zdChuYW1lLCB0eXBlKSAvKiovCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2NiX2JpbyhuYW1lLCB0eXBlKSAvKiovCisKKyNlbmRpZgorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZV9iaW8obmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlX2ZwKG5hbWUsIHR5cGUpIAorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2NvbnN0KG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZV9iaW9fY29uc3QobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlX2ZwX2NvbnN0KG5hbWUsIHR5cGUpCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfY2IobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlX2NiX2JpbyhuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGVfY2JfZnAobmFtZSwgdHlwZSkgCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fcmVhZChuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fcmVhZF9iaW8obmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3JlYWRfZnAobmFtZSwgdHlwZSkKKworI2RlZmluZSBERUNMQVJFX1BFTV9ydyhuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fcmVhZChuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGUobmFtZSwgdHlwZSkKKworI2RlZmluZSBERUNMQVJFX1BFTV9yd19jb25zdChuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fcmVhZChuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGVfY29uc3QobmFtZSwgdHlwZSkKKworI2RlZmluZSBERUNMQVJFX1BFTV9yd19jYihuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fcmVhZChuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGVfY2IobmFtZSwgdHlwZSkKKworI2lmIDEKKy8qICJ1c2VyZGF0YSI6IG5ldyB3aXRoIE9wZW5TU0wgMC45LjQgKi8KK3R5cGVkZWYgaW50IHBlbV9wYXNzd29yZF9jYihjaGFyICpidWYsIGludCBzaXplLCBpbnQgcndmbGFnLCB2b2lkICp1c2VyZGF0YSk7CisjZWxzZQorLyogT3BlblNTTCAwLjkuMywgMC45LjNhICovCit0eXBlZGVmIGludCBwZW1fcGFzc3dvcmRfY2IoY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZyk7CisjZW5kaWYKKworaW50CVBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPKGNoYXIgKmhlYWRlciwgRVZQX0NJUEhFUl9JTkZPICpjaXBoZXIpOworaW50CVBFTV9kb19oZWFkZXIgKEVWUF9DSVBIRVJfSU5GTyAqY2lwaGVyLCB1bnNpZ25lZCBjaGFyICpkYXRhLGxvbmcgKmxlbiwKKwlwZW1fcGFzc3dvcmRfY2IgKmNhbGxiYWNrLHZvaWQgKnUpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCitpbnQJUEVNX3JlYWRfYmlvKEJJTyAqYnAsIGNoYXIgKipuYW1lLCBjaGFyICoqaGVhZGVyLAorCQl1bnNpZ25lZCBjaGFyICoqZGF0YSxsb25nICpsZW4pOworaW50CVBFTV93cml0ZV9iaW8oQklPICpicCxjb25zdCBjaGFyICpuYW1lLGNoYXIgKmhkcix1bnNpZ25lZCBjaGFyICpkYXRhLAorCQlsb25nIGxlbik7CitpbnQgUEVNX2J5dGVzX3JlYWRfYmlvKHVuc2lnbmVkIGNoYXIgKipwZGF0YSwgbG9uZyAqcGxlbiwgY2hhciAqKnBubSwgY29uc3QgY2hhciAqbmFtZSwgQklPICpicCwKKwkgICAgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOwordm9pZCAqCVBFTV9BU04xX3JlYWRfYmlvKGQyaV9vZl92b2lkICpkMmksIGNvbnN0IGNoYXIgKm5hbWUsIEJJTyAqYnAsCisJCQkgIHZvaWQgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK2ludAlQRU1fQVNOMV93cml0ZV9iaW8oaTJkX29mX3ZvaWQgKmkyZCxjb25zdCBjaGFyICpuYW1lLEJJTyAqYnAsIHZvaWQgKngsCisJCQkgICBjb25zdCBFVlBfQ0lQSEVSICplbmMsdW5zaWduZWQgY2hhciAqa3N0cixpbnQga2xlbiwKKwkJCSAgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCitTVEFDS19PRihYNTA5X0lORk8pICoJUEVNX1g1MDlfSU5GT19yZWFkX2JpbyhCSU8gKmJwLCBTVEFDS19PRihYNTA5X0lORk8pICpzaywgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitpbnQJUEVNX1g1MDlfSU5GT193cml0ZV9iaW8oQklPICpicCxYNTA5X0lORk8gKnhpLCBFVlBfQ0lQSEVSICplbmMsCisJCXVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNkLCB2b2lkICp1KTsKKyNlbmRpZgorCitpbnQJUEVNX3JlYWQoRklMRSAqZnAsIGNoYXIgKipuYW1lLCBjaGFyICoqaGVhZGVyLAorCQl1bnNpZ25lZCBjaGFyICoqZGF0YSxsb25nICpsZW4pOworaW50CVBFTV93cml0ZShGSUxFICpmcCxjaGFyICpuYW1lLGNoYXIgKmhkcix1bnNpZ25lZCBjaGFyICpkYXRhLGxvbmcgbGVuKTsKK3ZvaWQgKiAgUEVNX0FTTjFfcmVhZChkMmlfb2Zfdm9pZCAqZDJpLCBjb25zdCBjaGFyICpuYW1lLCBGSUxFICpmcCwgdm9pZCAqKngsCisJCSAgICAgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworaW50CVBFTV9BU04xX3dyaXRlKGkyZF9vZl92b2lkICppMmQsY29uc3QgY2hhciAqbmFtZSxGSUxFICpmcCwKKwkJICAgICAgIHZvaWQgKngsY29uc3QgRVZQX0NJUEhFUiAqZW5jLHVuc2lnbmVkIGNoYXIgKmtzdHIsCisJCSAgICAgICBpbnQga2xlbixwZW1fcGFzc3dvcmRfY2IgKmNhbGxiYWNrLCB2b2lkICp1KTsKK1NUQUNLX09GKFg1MDlfSU5GTykgKglQRU1fWDUwOV9JTkZPX3JlYWQoRklMRSAqZnAsIFNUQUNLX09GKFg1MDlfSU5GTykgKnNrLAorCXBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCitpbnQJUEVNX1NlYWxJbml0KFBFTV9FTkNPREVfU0VBTF9DVFggKmN0eCwgRVZQX0NJUEhFUiAqdHlwZSwKKwkJRVZQX01EICptZF90eXBlLCB1bnNpZ25lZCBjaGFyICoqZWssIGludCAqZWtsLAorCQl1bnNpZ25lZCBjaGFyICppdiwgRVZQX1BLRVkgKipwdWJrLCBpbnQgbnB1YmspOwordm9pZAlQRU1fU2VhbFVwZGF0ZShQRU1fRU5DT0RFX1NFQUxfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsLAorCQl1bnNpZ25lZCBjaGFyICppbiwgaW50IGlubCk7CitpbnQJUEVNX1NlYWxGaW5hbChQRU1fRU5DT0RFX1NFQUxfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZyxpbnQgKnNpZ2wsCisJCXVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsLCBFVlBfUEtFWSAqcHJpdik7CisKK3ZvaWQgICAgUEVNX1NpZ25Jbml0KEVWUF9NRF9DVFggKmN0eCwgRVZQX01EICp0eXBlKTsKK3ZvaWQgICAgUEVNX1NpZ25VcGRhdGUoRVZQX01EX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKmQsdW5zaWduZWQgaW50IGNudCk7CitpbnQJUEVNX1NpZ25GaW5hbChFVlBfTURfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZ3JldCwKKwkJdW5zaWduZWQgaW50ICpzaWdsZW4sIEVWUF9QS0VZICpwa2V5KTsKKworaW50CVBFTV9kZWZfY2FsbGJhY2soY2hhciAqYnVmLCBpbnQgbnVtLCBpbnQgdywgdm9pZCAqa2V5KTsKK3ZvaWQJUEVNX3Byb2NfdHlwZShjaGFyICpidWYsIGludCB0eXBlKTsKK3ZvaWQJUEVNX2Rla19pbmZvKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqdHlwZSwgaW50IGxlbiwgY2hhciAqc3RyKTsKKworCisjaW5jbHVkZSA8b3BlbnNzbC9zeW1oYWNrcy5oPgorCitERUNMQVJFX1BFTV9ydyhYNTA5LCBYNTA5KQorCitERUNMQVJFX1BFTV9ydyhYNTA5X0FVWCwgWDUwOSkKKworREVDTEFSRV9QRU1fcncoWDUwOV9DRVJUX1BBSVIsIFg1MDlfQ0VSVF9QQUlSKQorCitERUNMQVJFX1BFTV9ydyhYNTA5X1JFUSwgWDUwOV9SRVEpCitERUNMQVJFX1BFTV93cml0ZShYNTA5X1JFUV9ORVcsIFg1MDlfUkVRKQorCitERUNMQVJFX1BFTV9ydyhYNTA5X0NSTCwgWDUwOV9DUkwpCisKK0RFQ0xBUkVfUEVNX3J3KFBLQ1M3LCBQS0NTNykKKworREVDTEFSRV9QRU1fcncoTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSwgTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSkKKworREVDTEFSRV9QRU1fcncoUEtDUzgsIFg1MDlfU0lHKQorCitERUNMQVJFX1BFTV9ydyhQS0NTOF9QUklWX0tFWV9JTkZPLCBQS0NTOF9QUklWX0tFWV9JTkZPKQorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisKK0RFQ0xBUkVfUEVNX3J3X2NiKFJTQVByaXZhdGVLZXksIFJTQSkKKworREVDTEFSRV9QRU1fcndfY29uc3QoUlNBUHVibGljS2V5LCBSU0EpCitERUNMQVJFX1BFTV9ydyhSU0FfUFVCS0VZLCBSU0EpCisKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisKK0RFQ0xBUkVfUEVNX3J3X2NiKERTQVByaXZhdGVLZXksIERTQSkKKworREVDTEFSRV9QRU1fcncoRFNBX1BVQktFWSwgRFNBKQorCitERUNMQVJFX1BFTV9yd19jb25zdChEU0FwYXJhbXMsIERTQSkKKworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworREVDTEFSRV9QRU1fcndfY29uc3QoRUNQS1BhcmFtZXRlcnMsIEVDX0dST1VQKQorREVDTEFSRV9QRU1fcndfY2IoRUNQcml2YXRlS2V5LCBFQ19LRVkpCitERUNMQVJFX1BFTV9ydyhFQ19QVUJLRVksIEVDX0tFWSkKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKworREVDTEFSRV9QRU1fcndfY29uc3QoREhwYXJhbXMsIERIKQorCisjZW5kaWYKKworREVDTEFSRV9QRU1fcndfY2IoUHJpdmF0ZUtleSwgRVZQX1BLRVkpCisKK0RFQ0xBUkVfUEVNX3J3KFBVQktFWSwgRVZQX1BLRVkpCisKK2ludCBQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdmF0ZUtleV9uaWQoQklPICpicCwgRVZQX1BLRVkgKngsIGludCBuaWQsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworaW50IFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5KEJJTyAqLCBFVlBfUEtFWSAqLCBjb25zdCBFVlBfQ0lQSEVSICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBpbnQsIHBlbV9wYXNzd29yZF9jYiAqLCB2b2lkICopOworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfbmlkX2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqeCwgaW50IG5pZCwKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitFVlBfUEtFWSAqZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8oQklPICpicCwgRVZQX1BLRVkgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfbmlkX2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqeCwgaW50IG5pZCwKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitpbnQgUEVNX3dyaXRlX1BLQ1M4UHJpdmF0ZUtleV9uaWQoRklMRSAqZnAsIEVWUF9QS0VZICp4LCBpbnQgbmlkLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworRVZQX1BLRVkgKmQyaV9QS0NTOFByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisKK2ludCBQRU1fd3JpdGVfUEtDUzhQcml2YXRlS2V5KEZJTEUgKmZwLEVWUF9QS0VZICp4LGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKwkJCSAgICAgIGNoYXIgKmtzdHIsaW50IGtsZW4sIHBlbV9wYXNzd29yZF9jYiAqY2QsIHZvaWQgKnUpOworCitFVlBfUEtFWSAqUEVNX3JlYWRfYmlvX1BhcmFtZXRlcnMoQklPICpicCwgRVZQX1BLRVkgKip4KTsKK2ludCBQRU1fd3JpdGVfYmlvX1BhcmFtZXRlcnMoQklPICpicCwgRVZQX1BLRVkgKngpOworCisKK0VWUF9QS0VZICpiMmlfUHJpdmF0ZUtleShjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuZ3RoKTsKK0VWUF9QS0VZICpiMmlfUHVibGljS2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW5ndGgpOworRVZQX1BLRVkgKmIyaV9Qcml2YXRlS2V5X2JpbyhCSU8gKmluKTsKK0VWUF9QS0VZICpiMmlfUHVibGljS2V5X2JpbyhCSU8gKmluKTsKK2ludCBpMmJfUHJpdmF0ZUtleV9iaW8oQklPICpvdXQsIEVWUF9QS0VZICpwayk7CitpbnQgaTJiX1B1YmxpY0tleV9iaW8oQklPICpvdXQsIEVWUF9QS0VZICpwayk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUkM0CitFVlBfUEtFWSAqYjJpX1BWS19iaW8oQklPICppbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitpbnQgaTJiX1BWS19iaW8oQklPICpvdXQsIEVWUF9QS0VZICpwaywgaW50IGVuY2xldmVsLAorCQlwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKyNlbmRpZgorCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfUEVNX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgUEVNIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFBFTV9GX0IySV9EU1MJCQkJCSAxMjcKKyNkZWZpbmUgUEVNX0ZfQjJJX1BWS19CSU8JCQkJIDEyOAorI2RlZmluZSBQRU1fRl9CMklfUlNBCQkJCQkgMTI5CisjZGVmaW5lIFBFTV9GX0NIRUNLX0JJVExFTl9EU0EJCQkJIDEzMAorI2RlZmluZSBQRU1fRl9DSEVDS19CSVRMRU5fUlNBCQkJCSAxMzEKKyNkZWZpbmUgUEVNX0ZfRDJJX1BLQ1M4UFJJVkFURUtFWV9CSU8JCQkgMTIwCisjZGVmaW5lIFBFTV9GX0QySV9QS0NTOFBSSVZBVEVLRVlfRlAJCQkgMTIxCisjZGVmaW5lIFBFTV9GX0RPX0IySQkJCQkJIDEzMgorI2RlZmluZSBQRU1fRl9ET19CMklfQklPCQkJCSAxMzMKKyNkZWZpbmUgUEVNX0ZfRE9fQkxPQl9IRUFERVIJCQkJIDEzNAorI2RlZmluZSBQRU1fRl9ET19QSzhQS0VZCQkJCSAxMjYKKyNkZWZpbmUgUEVNX0ZfRE9fUEs4UEtFWV9GUAkJCQkgMTI1CisjZGVmaW5lIFBFTV9GX0RPX1BWS19CT0RZCQkJCSAxMzUKKyNkZWZpbmUgUEVNX0ZfRE9fUFZLX0hFQURFUgkJCQkgMTM2CisjZGVmaW5lIFBFTV9GX0kyQl9QVksJCQkJCSAxMzcKKyNkZWZpbmUgUEVNX0ZfSTJCX1BWS19CSU8JCQkJIDEzOAorI2RlZmluZSBQRU1fRl9MT0FEX0lWCQkJCQkgMTAxCisjZGVmaW5lIFBFTV9GX1BFTV9BU04xX1JFQUQJCQkJIDEwMgorI2RlZmluZSBQRU1fRl9QRU1fQVNOMV9SRUFEX0JJTwkJCQkgMTAzCisjZGVmaW5lIFBFTV9GX1BFTV9BU04xX1dSSVRFCQkJCSAxMDQKKyNkZWZpbmUgUEVNX0ZfUEVNX0FTTjFfV1JJVEVfQklPCQkJIDEwNQorI2RlZmluZSBQRU1fRl9QRU1fREVGX0NBTExCQUNLCQkJCSAxMDAKKyNkZWZpbmUgUEVNX0ZfUEVNX0RPX0hFQURFUgkJCQkgMTA2CisjZGVmaW5lIFBFTV9GX1BFTV9GX1BFTV9XUklURV9QS0NTOFBSSVZBVEVLRVkJCSAxMTgKKyNkZWZpbmUgUEVNX0ZfUEVNX0dFVF9FVlBfQ0lQSEVSX0lORk8JCQkgMTA3CisjZGVmaW5lIFBFTV9GX1BFTV9QSzhQS0VZCQkJCSAxMTkKKyNkZWZpbmUgUEVNX0ZfUEVNX1JFQUQJCQkJCSAxMDgKKyNkZWZpbmUgUEVNX0ZfUEVNX1JFQURfQklPCQkJCSAxMDkKKyNkZWZpbmUgUEVNX0ZfUEVNX1JFQURfQklPX1BBUkFNRVRFUlMJCQkgMTQwCisjZGVmaW5lIFBFTV9GX1BFTV9SRUFEX0JJT19QUklWQVRFS0VZCQkJIDEyMworI2RlZmluZSBQRU1fRl9QRU1fUkVBRF9QUklWQVRFS0VZCQkJIDEyNAorI2RlZmluZSBQRU1fRl9QRU1fU0VBTEZJTkFMCQkJCSAxMTAKKyNkZWZpbmUgUEVNX0ZfUEVNX1NFQUxJTklUCQkJCSAxMTEKKyNkZWZpbmUgUEVNX0ZfUEVNX1NJR05GSU5BTAkJCQkgMTEyCisjZGVmaW5lIFBFTV9GX1BFTV9XUklURQkJCQkJIDExMworI2RlZmluZSBQRU1fRl9QRU1fV1JJVEVfQklPCQkJCSAxMTQKKyNkZWZpbmUgUEVNX0ZfUEVNX1dSSVRFX1BSSVZBVEVLRVkJCQkgMTM5CisjZGVmaW5lIFBFTV9GX1BFTV9YNTA5X0lORk9fUkVBRAkJCSAxMTUKKyNkZWZpbmUgUEVNX0ZfUEVNX1g1MDlfSU5GT19SRUFEX0JJTwkJCSAxMTYKKyNkZWZpbmUgUEVNX0ZfUEVNX1g1MDlfSU5GT19XUklURV9CSU8JCQkgMTE3CisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgUEVNX1JfQkFEX0JBU0U2NF9ERUNPREUJCQkJIDEwMAorI2RlZmluZSBQRU1fUl9CQURfREVDUllQVAkJCQkgMTAxCisjZGVmaW5lIFBFTV9SX0JBRF9FTkRfTElORQkJCQkgMTAyCisjZGVmaW5lIFBFTV9SX0JBRF9JVl9DSEFSUwkJCQkgMTAzCisjZGVmaW5lIFBFTV9SX0JBRF9NQUdJQ19OVU1CRVIJCQkJIDExNgorI2RlZmluZSBQRU1fUl9CQURfUEFTU1dPUkRfUkVBRAkJCQkgMTA0CisjZGVmaW5lIFBFTV9SX0JBRF9WRVJTSU9OX05VTUJFUgkJCSAxMTcKKyNkZWZpbmUgUEVNX1JfQklPX1dSSVRFX0ZBSUxVUkUJCQkJIDExOAorI2RlZmluZSBQRU1fUl9DSVBIRVJfSVNfTlVMTAkJCQkgMTI3CisjZGVmaW5lIFBFTV9SX0VSUk9SX0NPTlZFUlRJTkdfUFJJVkFURV9LRVkJCSAxMTUKKyNkZWZpbmUgUEVNX1JfRVhQRUNUSU5HX1BSSVZBVEVfS0VZX0JMT0IJCSAxMTkKKyNkZWZpbmUgUEVNX1JfRVhQRUNUSU5HX1BVQkxJQ19LRVlfQkxPQgkJCSAxMjAKKyNkZWZpbmUgUEVNX1JfSU5DT05TSVNURU5UX0hFQURFUgkJCSAxMjEKKyNkZWZpbmUgUEVNX1JfS0VZQkxPQl9IRUFERVJfUEFSU0VfRVJST1IJCSAxMjIKKyNkZWZpbmUgUEVNX1JfS0VZQkxPQl9UT09fU0hPUlQJCQkJIDEyMworI2RlZmluZSBQRU1fUl9OT1RfREVLX0lORk8JCQkJIDEwNQorI2RlZmluZSBQRU1fUl9OT1RfRU5DUllQVEVECQkJCSAxMDYKKyNkZWZpbmUgUEVNX1JfTk9UX1BST0NfVFlQRQkJCQkgMTA3CisjZGVmaW5lIFBFTV9SX05PX1NUQVJUX0xJTkUJCQkJIDEwOAorI2RlZmluZSBQRU1fUl9QUk9CTEVNU19HRVRUSU5HX1BBU1NXT1JECQkJIDEwOQorI2RlZmluZSBQRU1fUl9QVUJMSUNfS0VZX05PX1JTQQkJCQkgMTEwCisjZGVmaW5lIFBFTV9SX1BWS19EQVRBX1RPT19TSE9SVAkJCSAxMjQKKyNkZWZpbmUgUEVNX1JfUFZLX1RPT19TSE9SVAkJCQkgMTI1CisjZGVmaW5lIFBFTV9SX1JFQURfS0VZCQkJCQkgMTExCisjZGVmaW5lIFBFTV9SX1NIT1JUX0hFQURFUgkJCQkgMTEyCisjZGVmaW5lIFBFTV9SX1VOU1VQUE9SVEVEX0NJUEhFUgkJCSAxMTMKKyNkZWZpbmUgUEVNX1JfVU5TVVBQT1JURURfRU5DUllQVElPTgkJCSAxMTQKKyNkZWZpbmUgUEVNX1JfVU5TVVBQT1JURURfS0VZX0NPTVBPTkVOVFMJCSAxMjYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtMi5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW0yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxNzkwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtMi5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyoKKyAqIFRoaXMgaGVhZGVyIG9ubHkgZXhpc3RzIHRvIGJyZWFrIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBiZXR3ZWVuIHBlbSBhbmQgZXJyCisgKiBCZW4gMzAgSmFuIDE5OTkuCisgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIEhFQURFUl9QRU1fSAordm9pZCBFUlJfbG9hZF9QRU1fc3RyaW5ncyh2b2lkKTsKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fYWxsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV9hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdhNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fYWxsLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qIGNyeXB0by9wZW0vcGVtX2FsbC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzNy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitzdGF0aWMgUlNBICpwa2V5X2dldF9yc2EoRVZQX1BLRVkgKmtleSwgUlNBICoqcnNhKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorc3RhdGljIERTQSAqcGtleV9nZXRfZHNhKEVWUF9QS0VZICprZXksIERTQSAqKmRzYSk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0VDCitzdGF0aWMgRUNfS0VZICpwa2V5X2dldF9lY2tleShFVlBfUEtFWSAqa2V5LCBFQ19LRVkgKiplY2tleSk7CisjZW5kaWYKKworSU1QTEVNRU5UX1BFTV9ydyhYNTA5X1JFUSwgWDUwOV9SRVEsIFBFTV9TVFJJTkdfWDUwOV9SRVEsIFg1MDlfUkVRKQorCitJTVBMRU1FTlRfUEVNX3dyaXRlKFg1MDlfUkVRX05FVywgWDUwOV9SRVEsIFBFTV9TVFJJTkdfWDUwOV9SRVFfT0xELCBYNTA5X1JFUSkKKworSU1QTEVNRU5UX1BFTV9ydyhYNTA5X0NSTCwgWDUwOV9DUkwsIFBFTV9TVFJJTkdfWDUwOV9DUkwsIFg1MDlfQ1JMKQorCitJTVBMRU1FTlRfUEVNX3J3KFBLQ1M3LCBQS0NTNywgUEVNX1NUUklOR19QS0NTNywgUEtDUzcpCisKK0lNUExFTUVOVF9QRU1fcncoTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSwgTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSwKKwkJCQkJUEVNX1NUUklOR19YNTA5LCBORVRTQ0FQRV9DRVJUX1NFUVVFTkNFKQorCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKworLyogV2UgdHJlYXQgUlNBIG9yIERTQSBwcml2YXRlIGtleXMgYXMgYSBzcGVjaWFsIGNhc2UuCisgKgorICogRm9yIHByaXZhdGUga2V5cyB3ZSByZWFkIGluIGFuIEVWUF9QS0VZIHN0cnVjdHVyZSB3aXRoCisgKiBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleSgpIGFuZCBleHRyYWN0IHRoZSByZWxldmFudCBwcml2YXRlCisgKiBrZXk6IHRoaXMgbWVhbnMgY2FuIGhhbmRsZSAidHJhZGl0aW9uYWwiIGFuZCBQS0NTIzggZm9ybWF0cworICogdHJhbnNwYXJlbnRseS4KKyAqLworCitzdGF0aWMgUlNBICpwa2V5X2dldF9yc2EoRVZQX1BLRVkgKmtleSwgUlNBICoqcnNhKQoreworCVJTQSAqcnRtcDsKKwlpZigha2V5KSByZXR1cm4gTlVMTDsKKwlydG1wID0gRVZQX1BLRVlfZ2V0MV9SU0Eoa2V5KTsKKwlFVlBfUEtFWV9mcmVlKGtleSk7CisJaWYoIXJ0bXApIHJldHVybiBOVUxMOworCWlmKHJzYSkgeworCQlSU0FfZnJlZSgqcnNhKTsKKwkJKnJzYSA9IHJ0bXA7CisJfQorCXJldHVybiBydG1wOworfQorCitSU0EgKlBFTV9yZWFkX2Jpb19SU0FQcml2YXRlS2V5KEJJTyAqYnAsIFJTQSAqKnJzYSwgcGVtX3Bhc3N3b3JkX2NiICpjYiwKKwkJCQkJCQkJdm9pZCAqdSkKK3sKKwlFVlBfUEtFWSAqcGt0bXA7CisJcGt0bXAgPSBQRU1fcmVhZF9iaW9fUHJpdmF0ZUtleShicCwgTlVMTCwgY2IsIHUpOworCXJldHVybiBwa2V5X2dldF9yc2EocGt0bXAsIHJzYSk7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKworUlNBICpQRU1fcmVhZF9SU0FQcml2YXRlS2V5KEZJTEUgKmZwLCBSU0EgKipyc2EsIHBlbV9wYXNzd29yZF9jYiAqY2IsCisJCQkJCQkJCXZvaWQgKnUpCit7CisJRVZQX1BLRVkgKnBrdG1wOworCXBrdG1wID0gUEVNX3JlYWRfUHJpdmF0ZUtleShmcCwgTlVMTCwgY2IsIHUpOworCXJldHVybiBwa2V5X2dldF9yc2EocGt0bXAsIHJzYSk7Cit9CisKKyNlbmRpZgorCitJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2NvbnN0KFJTQVByaXZhdGVLZXksIFJTQSwgUEVNX1NUUklOR19SU0EsIFJTQVByaXZhdGVLZXkpCitJTVBMRU1FTlRfUEVNX3J3X2NvbnN0KFJTQVB1YmxpY0tleSwgUlNBLCBQRU1fU1RSSU5HX1JTQV9QVUJMSUMsIFJTQVB1YmxpY0tleSkKK0lNUExFTUVOVF9QRU1fcncoUlNBX1BVQktFWSwgUlNBLCBQRU1fU1RSSU5HX1BVQkxJQywgUlNBX1BVQktFWSkKKworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKworc3RhdGljIERTQSAqcGtleV9nZXRfZHNhKEVWUF9QS0VZICprZXksIERTQSAqKmRzYSkKK3sKKwlEU0EgKmR0bXA7CisJaWYoIWtleSkgcmV0dXJuIE5VTEw7CisJZHRtcCA9IEVWUF9QS0VZX2dldDFfRFNBKGtleSk7CisJRVZQX1BLRVlfZnJlZShrZXkpOworCWlmKCFkdG1wKSByZXR1cm4gTlVMTDsKKwlpZihkc2EpIHsKKwkJRFNBX2ZyZWUoKmRzYSk7CisJCSpkc2EgPSBkdG1wOworCX0KKwlyZXR1cm4gZHRtcDsKK30KKworRFNBICpQRU1fcmVhZF9iaW9fRFNBUHJpdmF0ZUtleShCSU8gKmJwLCBEU0EgKipkc2EsIHBlbV9wYXNzd29yZF9jYiAqY2IsCisJCQkJCQkJCXZvaWQgKnUpCit7CisJRVZQX1BLRVkgKnBrdG1wOworCXBrdG1wID0gUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkoYnAsIE5VTEwsIGNiLCB1KTsKKwlyZXR1cm4gcGtleV9nZXRfZHNhKHBrdG1wLCBkc2EpOwkvKiB3aWxsIGZyZWUgcGt0bXAgKi8KK30KKworSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9jb25zdChEU0FQcml2YXRlS2V5LCBEU0EsIFBFTV9TVFJJTkdfRFNBLCBEU0FQcml2YXRlS2V5KQorSU1QTEVNRU5UX1BFTV9ydyhEU0FfUFVCS0VZLCBEU0EsIFBFTV9TVFJJTkdfUFVCTElDLCBEU0FfUFVCS0VZKQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisKK0RTQSAqUEVNX3JlYWRfRFNBUHJpdmF0ZUtleShGSUxFICpmcCwgRFNBICoqZHNhLCBwZW1fcGFzc3dvcmRfY2IgKmNiLAorCQkJCQkJCQl2b2lkICp1KQoreworCUVWUF9QS0VZICpwa3RtcDsKKwlwa3RtcCA9IFBFTV9yZWFkX1ByaXZhdGVLZXkoZnAsIE5VTEwsIGNiLCB1KTsKKwlyZXR1cm4gcGtleV9nZXRfZHNhKHBrdG1wLCBkc2EpOwkvKiB3aWxsIGZyZWUgcGt0bXAgKi8KK30KKworI2VuZGlmCisKK0lNUExFTUVOVF9QRU1fcndfY29uc3QoRFNBcGFyYW1zLCBEU0EsIFBFTV9TVFJJTkdfRFNBUEFSQU1TLCBEU0FwYXJhbXMpCisKKyNlbmRpZgorCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworc3RhdGljIEVDX0tFWSAqcGtleV9nZXRfZWNrZXkoRVZQX1BLRVkgKmtleSwgRUNfS0VZICoqZWNrZXkpCit7CisJRUNfS0VZICpkdG1wOworCWlmKCFrZXkpIHJldHVybiBOVUxMOworCWR0bXAgPSBFVlBfUEtFWV9nZXQxX0VDX0tFWShrZXkpOworCUVWUF9QS0VZX2ZyZWUoa2V5KTsKKwlpZighZHRtcCkgcmV0dXJuIE5VTEw7CisJaWYoZWNrZXkpIAorCXsKKyAJCUVDX0tFWV9mcmVlKCplY2tleSk7CisJCSplY2tleSA9IGR0bXA7CisJfQorCXJldHVybiBkdG1wOworfQorCitFQ19LRVkgKlBFTV9yZWFkX2Jpb19FQ1ByaXZhdGVLZXkoQklPICpicCwgRUNfS0VZICoqa2V5LCBwZW1fcGFzc3dvcmRfY2IgKmNiLAorCQkJCQkJCXZvaWQgKnUpCit7CisJRVZQX1BLRVkgKnBrdG1wOworCXBrdG1wID0gUEVNX3JlYWRfYmlvX1ByaXZhdGVLZXkoYnAsIE5VTEwsIGNiLCB1KTsKKwlyZXR1cm4gcGtleV9nZXRfZWNrZXkocGt0bXAsIGtleSk7CS8qIHdpbGwgZnJlZSBwa3RtcCAqLworfQorCitJTVBMRU1FTlRfUEVNX3J3X2NvbnN0KEVDUEtQYXJhbWV0ZXJzLCBFQ19HUk9VUCwgUEVNX1NUUklOR19FQ1BBUkFNRVRFUlMsIEVDUEtQYXJhbWV0ZXJzKQorCitJTVBMRU1FTlRfUEVNX3dyaXRlX2NiKEVDUHJpdmF0ZUtleSwgRUNfS0VZLCBQRU1fU1RSSU5HX0VDUFJJVkFURUtFWSwgRUNQcml2YXRlS2V5KQorCitJTVBMRU1FTlRfUEVNX3J3KEVDX1BVQktFWSwgRUNfS0VZLCBQRU1fU1RSSU5HX1BVQkxJQywgRUNfUFVCS0VZKQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisgCitFQ19LRVkgKlBFTV9yZWFkX0VDUHJpdmF0ZUtleShGSUxFICpmcCwgRUNfS0VZICoqZWNrZXksIHBlbV9wYXNzd29yZF9jYiAqY2IsCisgCQkJCQkJCQl2b2lkICp1KQoreworCUVWUF9QS0VZICpwa3RtcDsKKwlwa3RtcCA9IFBFTV9yZWFkX1ByaXZhdGVLZXkoZnAsIE5VTEwsIGNiLCB1KTsKKwlyZXR1cm4gcGtleV9nZXRfZWNrZXkocGt0bXAsIGVja2V5KTsJLyogd2lsbCBmcmVlIHBrdG1wICovCit9CisKKyNlbmRpZgorCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisKK0lNUExFTUVOVF9QRU1fcndfY29uc3QoREhwYXJhbXMsIERILCBQRU1fU1RSSU5HX0RIUEFSQU1TLCBESHBhcmFtcykKKworI2VuZGlmCisKK0lNUExFTUVOVF9QRU1fcncoUFVCS0VZLCBFVlBfUEtFWSwgUEVNX1NUUklOR19QVUJMSUMsIFBVQktFWSkKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NGFlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX2Vyci5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiBjcnlwdG8vcGVtL3BlbV9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfUEVNLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfUEVNLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFBFTV9zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKFBFTV9GX0IySV9EU1MpLAkiQjJJX0RTUyJ9LAore0VSUl9GVU5DKFBFTV9GX0IySV9QVktfQklPKSwJImIyaV9QVktfYmlvIn0sCit7RVJSX0ZVTkMoUEVNX0ZfQjJJX1JTQSksCSJCMklfUlNBIn0sCit7RVJSX0ZVTkMoUEVNX0ZfQ0hFQ0tfQklUTEVOX0RTQSksCSJDSEVDS19CSVRMRU5fRFNBIn0sCit7RVJSX0ZVTkMoUEVNX0ZfQ0hFQ0tfQklUTEVOX1JTQSksCSJDSEVDS19CSVRMRU5fUlNBIn0sCit7RVJSX0ZVTkMoUEVNX0ZfRDJJX1BLQ1M4UFJJVkFURUtFWV9CSU8pLAkiZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8ifSwKK3tFUlJfRlVOQyhQRU1fRl9EMklfUEtDUzhQUklWQVRFS0VZX0ZQKSwJImQyaV9QS0NTOFByaXZhdGVLZXlfZnAifSwKK3tFUlJfRlVOQyhQRU1fRl9ET19CMkkpLAkiRE9fQjJJIn0sCit7RVJSX0ZVTkMoUEVNX0ZfRE9fQjJJX0JJTyksCSJET19CMklfQklPIn0sCit7RVJSX0ZVTkMoUEVNX0ZfRE9fQkxPQl9IRUFERVIpLAkiRE9fQkxPQl9IRUFERVIifSwKK3tFUlJfRlVOQyhQRU1fRl9ET19QSzhQS0VZKSwJIkRPX1BLOFBLRVkifSwKK3tFUlJfRlVOQyhQRU1fRl9ET19QSzhQS0VZX0ZQKSwJIkRPX1BLOFBLRVlfRlAifSwKK3tFUlJfRlVOQyhQRU1fRl9ET19QVktfQk9EWSksCSJET19QVktfQk9EWSJ9LAore0VSUl9GVU5DKFBFTV9GX0RPX1BWS19IRUFERVIpLAkiRE9fUFZLX0hFQURFUiJ9LAore0VSUl9GVU5DKFBFTV9GX0kyQl9QVkspLAkiSTJCX1BWSyJ9LAore0VSUl9GVU5DKFBFTV9GX0kyQl9QVktfQklPKSwJImkyYl9QVktfYmlvIn0sCit7RVJSX0ZVTkMoUEVNX0ZfTE9BRF9JViksCSJMT0FEX0lWIn0sCit7RVJSX0ZVTkMoUEVNX0ZfUEVNX0FTTjFfUkVBRCksCSJQRU1fQVNOMV9yZWFkIn0sCit7RVJSX0ZVTkMoUEVNX0ZfUEVNX0FTTjFfUkVBRF9CSU8pLAkiUEVNX0FTTjFfcmVhZF9iaW8ifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fQVNOMV9XUklURSksCSJQRU1fQVNOMV93cml0ZSJ9LAore0VSUl9GVU5DKFBFTV9GX1BFTV9BU04xX1dSSVRFX0JJTyksCSJQRU1fQVNOMV93cml0ZV9iaW8ifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fREVGX0NBTExCQUNLKSwJIlBFTV9kZWZfY2FsbGJhY2sifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fRE9fSEVBREVSKSwJIlBFTV9kb19oZWFkZXIifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fRl9QRU1fV1JJVEVfUEtDUzhQUklWQVRFS0VZKSwJIlBFTV9GX1BFTV9XUklURV9QS0NTOFBSSVZBVEVLRVkifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fR0VUX0VWUF9DSVBIRVJfSU5GTyksCSJQRU1fZ2V0X0VWUF9DSVBIRVJfSU5GTyJ9LAore0VSUl9GVU5DKFBFTV9GX1BFTV9QSzhQS0VZKSwJIlBFTV9QSzhQS0VZIn0sCit7RVJSX0ZVTkMoUEVNX0ZfUEVNX1JFQUQpLAkiUEVNX3JlYWQifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fUkVBRF9CSU8pLAkiUEVNX3JlYWRfYmlvIn0sCit7RVJSX0ZVTkMoUEVNX0ZfUEVNX1JFQURfQklPX1BBUkFNRVRFUlMpLAkiUEVNX3JlYWRfYmlvX1BhcmFtZXRlcnMifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fUkVBRF9CSU9fUFJJVkFURUtFWSksCSJQRU1fUkVBRF9CSU9fUFJJVkFURUtFWSJ9LAore0VSUl9GVU5DKFBFTV9GX1BFTV9SRUFEX1BSSVZBVEVLRVkpLAkiUEVNX1JFQURfUFJJVkFURUtFWSJ9LAore0VSUl9GVU5DKFBFTV9GX1BFTV9TRUFMRklOQUwpLAkiUEVNX1NlYWxGaW5hbCJ9LAore0VSUl9GVU5DKFBFTV9GX1BFTV9TRUFMSU5JVCksCSJQRU1fU2VhbEluaXQifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fU0lHTkZJTkFMKSwJIlBFTV9TaWduRmluYWwifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fV1JJVEUpLAkiUEVNX3dyaXRlIn0sCit7RVJSX0ZVTkMoUEVNX0ZfUEVNX1dSSVRFX0JJTyksCSJQRU1fd3JpdGVfYmlvIn0sCit7RVJSX0ZVTkMoUEVNX0ZfUEVNX1dSSVRFX1BSSVZBVEVLRVkpLAkiUEVNX1dSSVRFX1BSSVZBVEVLRVkifSwKK3tFUlJfRlVOQyhQRU1fRl9QRU1fWDUwOV9JTkZPX1JFQUQpLAkiUEVNX1g1MDlfSU5GT19yZWFkIn0sCit7RVJSX0ZVTkMoUEVNX0ZfUEVNX1g1MDlfSU5GT19SRUFEX0JJTyksCSJQRU1fWDUwOV9JTkZPX3JlYWRfYmlvIn0sCit7RVJSX0ZVTkMoUEVNX0ZfUEVNX1g1MDlfSU5GT19XUklURV9CSU8pLAkiUEVNX1g1MDlfSU5GT193cml0ZV9iaW8ifSwKK3swLE5VTEx9CisJfTsKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBQRU1fc3RyX3JlYXNvbnNbXT0KKwl7Cit7RVJSX1JFQVNPTihQRU1fUl9CQURfQkFTRTY0X0RFQ09ERSkgICAgICwiYmFkIGJhc2U2NCBkZWNvZGUifSwKK3tFUlJfUkVBU09OKFBFTV9SX0JBRF9ERUNSWVBUKSAgICAgICAgICAgLCJiYWQgZGVjcnlwdCJ9LAore0VSUl9SRUFTT04oUEVNX1JfQkFEX0VORF9MSU5FKSAgICAgICAgICAsImJhZCBlbmQgbGluZSJ9LAore0VSUl9SRUFTT04oUEVNX1JfQkFEX0lWX0NIQVJTKSAgICAgICAgICAsImJhZCBpdiBjaGFycyJ9LAore0VSUl9SRUFTT04oUEVNX1JfQkFEX01BR0lDX05VTUJFUikgICAgICAsImJhZCBtYWdpYyBudW1iZXIifSwKK3tFUlJfUkVBU09OKFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKSAgICAgLCJiYWQgcGFzc3dvcmQgcmVhZCJ9LAore0VSUl9SRUFTT04oUEVNX1JfQkFEX1ZFUlNJT05fTlVNQkVSKSAgICAsImJhZCB2ZXJzaW9uIG51bWJlciJ9LAore0VSUl9SRUFTT04oUEVNX1JfQklPX1dSSVRFX0ZBSUxVUkUpICAgICAsImJpbyB3cml0ZSBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihQRU1fUl9DSVBIRVJfSVNfTlVMTCkgICAgICAgICwiY2lwaGVyIGlzIG51bGwifSwKK3tFUlJfUkVBU09OKFBFTV9SX0VSUk9SX0NPTlZFUlRJTkdfUFJJVkFURV9LRVkpLCJlcnJvciBjb252ZXJ0aW5nIHByaXZhdGUga2V5In0sCit7RVJSX1JFQVNPTihQRU1fUl9FWFBFQ1RJTkdfUFJJVkFURV9LRVlfQkxPQiksImV4cGVjdGluZyBwcml2YXRlIGtleSBibG9iIn0sCit7RVJSX1JFQVNPTihQRU1fUl9FWFBFQ1RJTkdfUFVCTElDX0tFWV9CTE9CKSwiZXhwZWN0aW5nIHB1YmxpYyBrZXkgYmxvYiJ9LAore0VSUl9SRUFTT04oUEVNX1JfSU5DT05TSVNURU5UX0hFQURFUikgICAsImluY29uc2lzdGVudCBoZWFkZXIifSwKK3tFUlJfUkVBU09OKFBFTV9SX0tFWUJMT0JfSEVBREVSX1BBUlNFX0VSUk9SKSwia2V5YmxvYiBoZWFkZXIgcGFyc2UgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBFTV9SX0tFWUJMT0JfVE9PX1NIT1JUKSAgICAgLCJrZXlibG9iIHRvbyBzaG9ydCJ9LAore0VSUl9SRUFTT04oUEVNX1JfTk9UX0RFS19JTkZPKSAgICAgICAgICAsIm5vdCBkZWsgaW5mbyJ9LAore0VSUl9SRUFTT04oUEVNX1JfTk9UX0VOQ1JZUFRFRCkgICAgICAgICAsIm5vdCBlbmNyeXB0ZWQifSwKK3tFUlJfUkVBU09OKFBFTV9SX05PVF9QUk9DX1RZUEUpICAgICAgICAgLCJub3QgcHJvYyB0eXBlIn0sCit7RVJSX1JFQVNPTihQRU1fUl9OT19TVEFSVF9MSU5FKSAgICAgICAgICwibm8gc3RhcnQgbGluZSJ9LAore0VSUl9SRUFTT04oUEVNX1JfUFJPQkxFTVNfR0VUVElOR19QQVNTV09SRCksInByb2JsZW1zIGdldHRpbmcgcGFzc3dvcmQifSwKK3tFUlJfUkVBU09OKFBFTV9SX1BVQkxJQ19LRVlfTk9fUlNBKSAgICAgLCJwdWJsaWMga2V5IG5vIHJzYSJ9LAore0VSUl9SRUFTT04oUEVNX1JfUFZLX0RBVEFfVE9PX1NIT1JUKSAgICAsInB2ayBkYXRhIHRvbyBzaG9ydCJ9LAore0VSUl9SRUFTT04oUEVNX1JfUFZLX1RPT19TSE9SVCkgICAgICAgICAsInB2ayB0b28gc2hvcnQifSwKK3tFUlJfUkVBU09OKFBFTV9SX1JFQURfS0VZKSAgICAgICAgICAgICAgLCJyZWFkIGtleSJ9LAore0VSUl9SRUFTT04oUEVNX1JfU0hPUlRfSEVBREVSKSAgICAgICAgICAsInNob3J0IGhlYWRlciJ9LAore0VSUl9SRUFTT04oUEVNX1JfVU5TVVBQT1JURURfQ0lQSEVSKSAgICAsInVuc3VwcG9ydGVkIGNpcGhlciJ9LAore0VSUl9SRUFTT04oUEVNX1JfVU5TVVBQT1JURURfRU5DUllQVElPTiksInVuc3VwcG9ydGVkIGVuY3J5cHRpb24ifSwKK3tFUlJfUkVBU09OKFBFTV9SX1VOU1VQUE9SVEVEX0tFWV9DT01QT05FTlRTKSwidW5zdXBwb3J0ZWQga2V5IGNvbXBvbmVudHMifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfUEVNX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKFBFTV9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxQRU1fc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxQRU1fc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV9pbmZvLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV9pbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyYmU1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX2luZm8uYwpAQCAtMCwwICsxLDQwNSBAQAorLyogY3J5cHRvL3BlbS9wZW1faW5mby5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorU1RBQ0tfT0YoWDUwOV9JTkZPKSAqUEVNX1g1MDlfSU5GT19yZWFkKEZJTEUgKmZwLCBTVEFDS19PRihYNTA5X0lORk8pICpzaywgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJUEVNZXJyKFBFTV9GX1BFTV9YNTA5X0lORk9fUkVBRCxFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisJCX0KKyAgICAgICAgQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKKyAgICAgICAgcmV0PVBFTV9YNTA5X0lORk9fcmVhZF9iaW8oYixzayxjYix1KTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybihyZXQpOworCX0KKyNlbmRpZgorCitTVEFDS19PRihYNTA5X0lORk8pICpQRU1fWDUwOV9JTkZPX3JlYWRfYmlvKEJJTyAqYnAsIFNUQUNLX09GKFg1MDlfSU5GTykgKnNrLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKwlYNTA5X0lORk8gKnhpPU5VTEw7CisJY2hhciAqbmFtZT1OVUxMLCpoZWFkZXI9TlVMTDsKKwl2b2lkICpwcDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhPU5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlsb25nIGxlbixlcnJvcj0wOworCWludCBvaz0wOworCVNUQUNLX09GKFg1MDlfSU5GTykgKnJldD1OVUxMOworCXVuc2lnbmVkIGludCBpLHJhdyxwdHlwZTsKKwlkMmlfb2Zfdm9pZCAqZDJpID0gMDsKKworCWlmIChzayA9PSBOVUxMKQorCQl7CisJCWlmICgocmV0PXNrX1g1MDlfSU5GT19uZXdfbnVsbCgpKSA9PSBOVUxMKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX1BFTV9YNTA5X0lORk9fUkVBRF9CSU8sRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXJldD1zazsKKworCWlmICgoeGk9WDUwOV9JTkZPX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlmb3IgKDs7KQorCQl7CisJCXJhdz0wOworCQlwdHlwZSA9IDA7CisJCWk9UEVNX3JlYWRfYmlvKGJwLCZuYW1lLCZoZWFkZXIsJmRhdGEsJmxlbik7CisJCWlmIChpID09IDApCisJCQl7CisJCQllcnJvcj1FUlJfR0VUX1JFQVNPTihFUlJfcGVla19sYXN0X2Vycm9yKCkpOworCQkJaWYgKGVycm9yID09IFBFTV9SX05PX1NUQVJUX0xJTkUpCisJCQkJeworCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCWJyZWFrOworCQkJCX0KKwkJCWdvdG8gZXJyOworCQkJfQorc3RhcnQ6CisJCWlmICgJKHN0cmNtcChuYW1lLFBFTV9TVFJJTkdfWDUwOSkgPT0gMCkgfHwKKwkJCShzdHJjbXAobmFtZSxQRU1fU1RSSU5HX1g1MDlfT0xEKSA9PSAwKSkKKwkJCXsKKwkJCWQyaT0oRDJJX09GKHZvaWQpKWQyaV9YNTA5OworCQkJaWYgKHhpLT54NTA5ICE9IE5VTEwpCisJCQkJeworCQkJCWlmICghc2tfWDUwOV9JTkZPX3B1c2gocmV0LHhpKSkgZ290byBlcnI7CisJCQkJaWYgKCh4aT1YNTA5X0lORk9fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWdvdG8gc3RhcnQ7CisJCQkJfQorCQkJcHA9Jih4aS0+eDUwOSk7CisJCQl9CisJCWVsc2UgaWYgKChzdHJjbXAobmFtZSxQRU1fU1RSSU5HX1g1MDlfVFJVU1RFRCkgPT0gMCkpCisJCQl7CisJCQlkMmk9KEQySV9PRih2b2lkKSlkMmlfWDUwOV9BVVg7CisJCQlpZiAoeGktPng1MDkgIT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKCFza19YNTA5X0lORk9fcHVzaChyZXQseGkpKSBnb3RvIGVycjsKKwkJCQlpZiAoKHhpPVg1MDlfSU5GT19uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJCQkJZ290byBzdGFydDsKKwkJCQl9CisJCQlwcD0mKHhpLT54NTA5KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKG5hbWUsUEVNX1NUUklOR19YNTA5X0NSTCkgPT0gMCkKKwkJCXsKKwkJCWQyaT0oRDJJX09GKHZvaWQpKWQyaV9YNTA5X0NSTDsKKwkJCWlmICh4aS0+Y3JsICE9IE5VTEwpCisJCQkJeworCQkJCWlmICghc2tfWDUwOV9JTkZPX3B1c2gocmV0LHhpKSkgZ290byBlcnI7CisJCQkJaWYgKCh4aT1YNTA5X0lORk9fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWdvdG8gc3RhcnQ7CisJCQkJfQorCQkJcHA9Jih4aS0+Y3JsKTsKKwkJCX0KKwkJZWxzZQorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQkJaWYgKHN0cmNtcChuYW1lLFBFTV9TVFJJTkdfUlNBKSA9PSAwKQorCQkJeworCQkJaWYgKHhpLT54X3BrZXkgIT0gTlVMTCkgCisJCQkJeworCQkJCWlmICghc2tfWDUwOV9JTkZPX3B1c2gocmV0LHhpKSkgZ290byBlcnI7CisJCQkJaWYgKCh4aT1YNTA5X0lORk9fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWdvdG8gc3RhcnQ7CisJCQkJfQorCisJCQl4aS0+ZW5jX2RhdGE9TlVMTDsKKwkJCXhpLT5lbmNfbGVuPTA7CisKKwkJCXhpLT54X3BrZXk9WDUwOV9QS0VZX25ldygpOworCQkJcHR5cGU9RVZQX1BLRVlfUlNBOworCQkJcHA9JnhpLT54X3BrZXktPmRlY19wa2V5OworCQkJaWYgKChpbnQpc3RybGVuKGhlYWRlcikgPiAxMCkgLyogYXNzdW1lIGVuY3J5cHRlZCAqLworCQkJCXJhdz0xOworCQkJfQorCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkJCWlmIChzdHJjbXAobmFtZSxQRU1fU1RSSU5HX0RTQSkgPT0gMCkKKwkJCXsKKwkJCWQyaT0oRDJJX09GKHZvaWQpKWQyaV9EU0FQcml2YXRlS2V5OworCQkJaWYgKHhpLT54X3BrZXkgIT0gTlVMTCkgCisJCQkJeworCQkJCWlmICghc2tfWDUwOV9JTkZPX3B1c2gocmV0LHhpKSkgZ290byBlcnI7CisJCQkJaWYgKCh4aT1YNTA5X0lORk9fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCQkJCWdvdG8gc3RhcnQ7CisJCQkJfQorCisJCQl4aS0+ZW5jX2RhdGE9TlVMTDsKKwkJCXhpLT5lbmNfbGVuPTA7CisKKwkJCXhpLT54X3BrZXk9WDUwOV9QS0VZX25ldygpOworCQkJcHR5cGUgPSBFVlBfUEtFWV9EU0E7CisJCQlwcD0meGktPnhfcGtleS0+ZGVjX3BrZXk7CisJCQlpZiAoKGludClzdHJsZW4oaGVhZGVyKSA+IDEwKSAvKiBhc3N1bWUgZW5jcnlwdGVkICovCisJCQkJcmF3PTE7CisJCQl9CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisgCQkJaWYgKHN0cmNtcChuYW1lLFBFTV9TVFJJTkdfRUNQUklWQVRFS0VZKSA9PSAwKQorIAkJCXsKKyAJCQkJZDJpPShEMklfT0Yodm9pZCkpZDJpX0VDUHJpdmF0ZUtleTsKKyAJCQkJaWYgKHhpLT54X3BrZXkgIT0gTlVMTCkgCisgCQkJCXsKKyAJCQkJCWlmICghc2tfWDUwOV9JTkZPX3B1c2gocmV0LHhpKSkgZ290byBlcnI7CisgCQkJCQlpZiAoKHhpPVg1MDlfSU5GT19uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisgCQkJCQkJZ290byBzdGFydDsKKyAJCQkJfQorIAorIAkJCXhpLT5lbmNfZGF0YT1OVUxMOworIAkJCXhpLT5lbmNfbGVuPTA7CisgCisgCQkJeGktPnhfcGtleT1YNTA5X1BLRVlfbmV3KCk7CisJCQlwdHlwZSA9IEVWUF9QS0VZX0VDOworIAkJCXBwPSZ4aS0+eF9wa2V5LT5kZWNfcGtleTsKKyAJCQlpZiAoKGludClzdHJsZW4oaGVhZGVyKSA+IDEwKSAvKiBhc3N1bWUgZW5jcnlwdGVkICovCisgCQkJCXJhdz0xOworCQkJfQorCQllbHNlCisjZW5kaWYKKwkJCXsKKwkJCWQyaT1OVUxMOworCQkJcHA9TlVMTDsKKwkJCX0KKworCQlpZiAoZDJpICE9IE5VTEwpCisJCQl7CisJCQlpZiAoIXJhdykKKwkJCQl7CisJCQkJRVZQX0NJUEhFUl9JTkZPIGNpcGhlcjsKKworCQkJCWlmICghUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8oaGVhZGVyLCZjaXBoZXIpKQorCQkJCQlnb3RvIGVycjsKKwkJCQlpZiAoIVBFTV9kb19oZWFkZXIoJmNpcGhlcixkYXRhLCZsZW4sY2IsdSkpCisJCQkJCWdvdG8gZXJyOworCQkJCXA9ZGF0YTsKKwkJCQlpZiAocHR5cGUpCisJCQkJCXsKKwkJCQkJaWYgKCFkMmlfUHJpdmF0ZUtleShwdHlwZSwgcHAsICZwLCBsZW4pKQorCQkJCQkJeworCQkJCQkJUEVNZXJyKFBFTV9GX1BFTV9YNTA5X0lORk9fUkVBRF9CSU8sRVJSX1JfQVNOMV9MSUIpOworCQkJCQkJZ290byBlcnI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlIGlmIChkMmkocHAsJnAsbGVuKSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCVBFTWVycihQRU1fRl9QRU1fWDUwOV9JTkZPX1JFQURfQklPLEVSUl9SX0FTTjFfTElCKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlCisJCQkJeyAvKiBlbmNyeXB0ZWQgUlNBIGRhdGEgKi8KKwkJCQlpZiAoIVBFTV9nZXRfRVZQX0NJUEhFUl9JTkZPKGhlYWRlciwKKwkJCQkJJnhpLT5lbmNfY2lwaGVyKSkgZ290byBlcnI7CisJCQkJeGktPmVuY19kYXRhPShjaGFyICopZGF0YTsKKwkJCQl4aS0+ZW5jX2xlbj0oaW50KWxlbjsKKwkJCQlkYXRhPU5VTEw7CisJCQkJfQorCQkJfQorCQllbHNlCXsKKwkJCS8qIHVua25vd24gKi8KKwkJCX0KKwkJaWYgKG5hbWUgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKG5hbWUpOworCQlpZiAoaGVhZGVyICE9IE5VTEwpIE9QRU5TU0xfZnJlZShoZWFkZXIpOworCQlpZiAoZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoZGF0YSk7CisJCW5hbWU9TlVMTDsKKwkJaGVhZGVyPU5VTEw7CisJCWRhdGE9TlVMTDsKKwkJfQorCisJLyogaWYgdGhlIGxhc3Qgb25lIGhhc24ndCBiZWVuIHB1c2hlZCB5ZXQgYW5kIHRoZXJlIGlzIGFueXRoaW5nCisJICogaW4gaXQgdGhlbiBhZGQgaXQgdG8gdGhlIHN0YWNrIC4uLiAKKwkgKi8KKwlpZiAoKHhpLT54NTA5ICE9IE5VTEwpIHx8ICh4aS0+Y3JsICE9IE5VTEwpIHx8CisJCSh4aS0+eF9wa2V5ICE9IE5VTEwpIHx8ICh4aS0+ZW5jX2RhdGEgIT0gTlVMTCkpCisJCXsKKwkJaWYgKCFza19YNTA5X0lORk9fcHVzaChyZXQseGkpKSBnb3RvIGVycjsKKwkJeGk9TlVMTDsKKwkJfQorCW9rPTE7CitlcnI6CisJaWYgKHhpICE9IE5VTEwpIFg1MDlfSU5GT19mcmVlKHhpKTsKKwlpZiAoIW9rKQorCQl7CisJCWZvciAoaT0wOyAoKGludClpKTxza19YNTA5X0lORk9fbnVtKHJldCk7IGkrKykKKwkJCXsKKwkJCXhpPXNrX1g1MDlfSU5GT192YWx1ZShyZXQsaSk7CisJCQlYNTA5X0lORk9fZnJlZSh4aSk7CisJCQl9CisJCWlmIChyZXQgIT0gc2spIHNrX1g1MDlfSU5GT19mcmVlKHJldCk7CisJCXJldD1OVUxMOworCQl9CisJCQorCWlmIChuYW1lICE9IE5VTEwpIE9QRU5TU0xfZnJlZShuYW1lKTsKKwlpZiAoaGVhZGVyICE9IE5VTEwpIE9QRU5TU0xfZnJlZShoZWFkZXIpOworCWlmIChkYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShkYXRhKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKworLyogQSBUSkggYWRkaXRpb24gKi8KK2ludCBQRU1fWDUwOV9JTkZPX3dyaXRlX2JpbyhCSU8gKmJwLCBYNTA5X0lORk8gKnhpLCBFVlBfQ0lQSEVSICplbmMsCisJICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisJRVZQX0NJUEhFUl9DVFggY3R4OworCWludCBpLHJldD0wOworCXVuc2lnbmVkIGNoYXIgKmRhdGE9TlVMTDsKKwljb25zdCBjaGFyICpvYmpzdHI9TlVMTDsKKwljaGFyIGJ1ZltQRU1fQlVGU0laRV07CisJdW5zaWduZWQgY2hhciAqaXY9TlVMTDsKKwkKKwlpZiAoZW5jICE9IE5VTEwpCisJCXsKKwkJb2Jqc3RyPU9CSl9uaWQyc24oRVZQX0NJUEhFUl9uaWQoZW5jKSk7CisJCWlmIChvYmpzdHIgPT0gTlVMTCkKKwkJCXsKKwkJCVBFTWVycihQRU1fRl9QRU1fWDUwOV9JTkZPX1dSSVRFX0JJTyxQRU1fUl9VTlNVUFBPUlRFRF9DSVBIRVIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCS8qIG5vdyBmb3IgdGhlIGZ1biBwYXJ0IC4uLiBpZiB3ZSBoYXZlIGEgcHJpdmF0ZSBrZXkgdGhlbiAKKwkgKiB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gaGFuZGxlIGEgbm90LXlldC1kZWNyeXB0ZWQga2V5CisJICogYmVpbmcgd3JpdHRlbiBvdXQgY29ycmVjdGx5IC4uLiBpZiBpdCBpcyBkZWNyeXB0ZWQgb3IKKwkgKiBpdCBpcyBub24tZW5jcnlwdGVkIHRoZW4gd2UgdXNlIHRoZSBiYXNlIGNvZGUKKwkgKi8KKwlpZiAoeGktPnhfcGtleSE9TlVMTCkKKwkJeworCQlpZiAoICh4aS0+ZW5jX2RhdGEhPU5VTEwpICYmICh4aS0+ZW5jX2xlbj4wKSApCisJCQl7CisJCQlpZiAoZW5jID09IE5VTEwpCisJCQkJeworCQkJCVBFTWVycihQRU1fRl9QRU1fWDUwOV9JTkZPX1dSSVRFX0JJTyxQRU1fUl9DSVBIRVJfSVNfTlVMTCk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiBjb3B5IGZyb20gd2VpcmRvIG5hbWVzIGludG8gbW9yZSBub3JtYWwgdGhpbmdzICovCisJCQlpdj14aS0+ZW5jX2NpcGhlci5pdjsKKwkJCWRhdGE9KHVuc2lnbmVkIGNoYXIgKil4aS0+ZW5jX2RhdGE7CisJCQlpPXhpLT5lbmNfbGVuOworCisJCQkvKiB3ZSB0YWtlIHRoZSBlbmNyeXB0aW9uIGRhdGEgZnJvbSB0aGUKKwkJCSAqIGludGVybmFsIHN0dWZmIHJhdGhlciB0aGFuIHdoYXQgdGhlCisJCQkgKiB1c2VyIGhhcyBwYXNzZWQgdXMgLi4uIGFzIHdlIGhhdmUgdG8gCisJCQkgKiBtYXRjaCBleGFjdGx5IGZvciBzb21lIHN0cmFuZ2UgcmVhc29uCisJCQkgKi8KKwkJCW9ianN0cj1PQkpfbmlkMnNuKAorCQkJCUVWUF9DSVBIRVJfbmlkKHhpLT5lbmNfY2lwaGVyLmNpcGhlcikpOworCQkJaWYgKG9ianN0ciA9PSBOVUxMKQorCQkJCXsKKwkJCQlQRU1lcnIoUEVNX0ZfUEVNX1g1MDlfSU5GT19XUklURV9CSU8sUEVNX1JfVU5TVVBQT1JURURfQ0lQSEVSKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCS8qIGNyZWF0ZSB0aGUgcmlnaHQgbWFnaWMgaGVhZGVyIHN0dWZmICovCisJCQlPUEVOU1NMX2Fzc2VydChzdHJsZW4ob2Jqc3RyKSsyMysyKmVuYy0+aXZfbGVuKzEzIDw9IHNpemVvZiBidWYpOworCQkJYnVmWzBdPSdcMCc7CisJCQlQRU1fcHJvY190eXBlKGJ1ZixQRU1fVFlQRV9FTkNSWVBURUQpOworCQkJUEVNX2Rla19pbmZvKGJ1ZixvYmpzdHIsZW5jLT5pdl9sZW4sKGNoYXIgKilpdik7CisKKwkJCS8qIHVzZSB0aGUgbm9ybWFsIGNvZGUgdG8gd3JpdGUgdGhpbmdzIG91dCAqLworCQkJaT1QRU1fd3JpdGVfYmlvKGJwLFBFTV9TVFJJTkdfUlNBLGJ1ZixkYXRhLGkpOworCQkJaWYgKGkgPD0gMCkgZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCS8qIEFkZCBEU0EvREggKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkJCS8qIG5vcm1hbCBvcHRpb25hbGx5IGVuY3J5cHRlZCBzdHVmZiAqLworCQkJaWYgKFBFTV93cml0ZV9iaW9fUlNBUHJpdmF0ZUtleShicCwKKwkJCQl4aS0+eF9wa2V5LT5kZWNfcGtleS0+cGtleS5yc2EsCisJCQkJZW5jLGtzdHIsa2xlbixjYix1KTw9MCkKKwkJCQlnb3RvIGVycjsKKyNlbmRpZgorCQkJfQorCQl9CisKKwkvKiBpZiB3ZSBoYXZlIGEgY2VydGlmaWNhdGUgdGhlbiB3cml0ZSBpdCBvdXQgbm93ICovCisJaWYgKCh4aS0+eDUwOSAhPSBOVUxMKSAmJiAoUEVNX3dyaXRlX2Jpb19YNTA5KGJwLHhpLT54NTA5KSA8PSAwKSkKKwkJZ290byBlcnI7CisKKwkvKiB3ZSBhcmUgaWdub3JpbmcgYW55dGhpbmcgZWxzZSB0aGF0IGlzIGxvYWRlZCBpbnRvIHRoZSBYNTA5X0lORk8KKwkgKiBzdHJ1Y3R1cmUgZm9yIHRoZSBtb21lbnQgLi4uIGFzIEkgZG9uJ3QgbmVlZCBpdCBzbyBJJ20gbm90CisJICogY29kaW5nIGl0IGhlcmUgYW5kIEVyaWMgY2FuIGRvIGl0IHdoZW4gdGhpcyBtYWtlcyBpdCBpbnRvIHRoZQorCSAqIGJhc2UgbGlicmFyeSAtLXRqaAorCSAqLworCisJcmV0PTE7CisKK2VycjoKKwlPUEVOU1NMX2NsZWFuc2UoKGNoYXIgKikmY3R4LHNpemVvZihjdHgpKTsKKwlPUEVOU1NMX2NsZWFuc2UoYnVmLFBFTV9CVUZTSVpFKTsKKwlyZXR1cm4ocmV0KTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV9saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTQ4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV9saWIuYwpAQCAtMCwwICsxLDg1NCBAQAorLyogY3J5cHRvL3BlbS9wZW1fbGliLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczEyLmg+CisjaW5jbHVkZSAiYXNuMV9sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fREVTCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKworY29uc3QgY2hhciBQRU1fdmVyc2lvbltdPSJQRU0iIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworI2RlZmluZSBNSU5fTEVOR1RICTQKKworc3RhdGljIGludCBsb2FkX2l2KGNoYXIgKipmcm9tcCx1bnNpZ25lZCBjaGFyICp0bywgaW50IG51bSk7CitzdGF0aWMgaW50IGNoZWNrX3BlbShjb25zdCBjaGFyICpubSwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgcGVtX2NoZWNrX3N1ZmZpeChjb25zdCBjaGFyICpwZW1fc3RyLCBjb25zdCBjaGFyICpzdWZmaXgpOworCitpbnQgUEVNX2RlZl9jYWxsYmFjayhjaGFyICpidWYsIGludCBudW0sIGludCB3LCB2b2lkICprZXkpCisJeworI2lmZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisJLyogV2Ugc2hvdWxkIG5vdCBldmVyIGNhbGwgdGhlIGRlZmF1bHQgY2FsbGJhY2sgcm91dGluZSBmcm9tCisJICogd2luZG93cy4gKi8KKwlQRU1lcnIoUEVNX0ZfUEVNX0RFRl9DQUxMQkFDSyxFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCXJldHVybigtMSk7CisjZWxzZQorCWludCBpLGo7CisJY29uc3QgY2hhciAqcHJvbXB0OworCWlmKGtleSkgeworCQlpPXN0cmxlbihrZXkpOworCQlpPShpID4gbnVtKT9udW06aTsKKwkJbWVtY3B5KGJ1ZixrZXksaSk7CisJCXJldHVybihpKTsKKwl9CisKKwlwcm9tcHQ9RVZQX2dldF9wd19wcm9tcHQoKTsKKwlpZiAocHJvbXB0ID09IE5VTEwpCisJCXByb21wdD0iRW50ZXIgUEVNIHBhc3MgcGhyYXNlOiI7CisKKwlmb3IgKDs7KQorCQl7CisJCWk9RVZQX3JlYWRfcHdfc3RyaW5nX21pbihidWYsTUlOX0xFTkdUSCxudW0scHJvbXB0LHcpOworCQlpZiAoaSAhPSAwKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX1BFTV9ERUZfQ0FMTEJBQ0ssUEVNX1JfUFJPQkxFTVNfR0VUVElOR19QQVNTV09SRCk7CisJCQltZW1zZXQoYnVmLDAsKHVuc2lnbmVkIGludCludW0pOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJaj1zdHJsZW4oYnVmKTsKKwkJaWYgKGogPCBNSU5fTEVOR1RIKQorCQkJeworCQkJZnByaW50ZihzdGRlcnIsInBocmFzZSBpcyB0b28gc2hvcnQsIG5lZWRzIHRvIGJlIGF0IGxlYXN0ICVkIGNoYXJzXG4iLE1JTl9MRU5HVEgpOworCQkJfQorCQllbHNlCisJCQlicmVhazsKKwkJfQorCXJldHVybihqKTsKKyNlbmRpZgorCX0KKwordm9pZCBQRU1fcHJvY190eXBlKGNoYXIgKmJ1ZiwgaW50IHR5cGUpCisJeworCWNvbnN0IGNoYXIgKnN0cjsKKworCWlmICh0eXBlID09IFBFTV9UWVBFX0VOQ1JZUFRFRCkKKwkJc3RyPSJFTkNSWVBURUQiOworCWVsc2UgaWYgKHR5cGUgPT0gUEVNX1RZUEVfTUlDX0NMRUFSKQorCQlzdHI9Ik1JQy1DTEVBUiI7CisJZWxzZSBpZiAodHlwZSA9PSBQRU1fVFlQRV9NSUNfT05MWSkKKwkJc3RyPSJNSUMtT05MWSI7CisJZWxzZQorCQlzdHI9IkJBRC1UWVBFIjsKKwkJCisJQlVGX3N0cmxjYXQoYnVmLCJQcm9jLVR5cGU6IDQsIixQRU1fQlVGU0laRSk7CisJQlVGX3N0cmxjYXQoYnVmLHN0cixQRU1fQlVGU0laRSk7CisJQlVGX3N0cmxjYXQoYnVmLCJcbiIsUEVNX0JVRlNJWkUpOworCX0KKwordm9pZCBQRU1fZGVrX2luZm8oY2hhciAqYnVmLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbGVuLCBjaGFyICpzdHIpCisJeworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hcFsxN109IjAxMjM0NTY3ODlBQkNERUYiOworCWxvbmcgaTsKKwlpbnQgajsKKworCUJVRl9zdHJsY2F0KGJ1ZiwiREVLLUluZm86ICIsUEVNX0JVRlNJWkUpOworCUJVRl9zdHJsY2F0KGJ1Zix0eXBlLFBFTV9CVUZTSVpFKTsKKwlCVUZfc3RybGNhdChidWYsIiwiLFBFTV9CVUZTSVpFKTsKKwlqPXN0cmxlbihidWYpOworCWlmIChqICsgKGxlbiAqIDIpICsgMSA+IFBFTV9CVUZTSVpFKQorICAgICAgICAJcmV0dXJuOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKQorCQl7CisJCWJ1ZltqK2kqMl0gID1tYXBbKHN0cltpXT4+NCkmMHgwZl07CisJCWJ1ZltqK2kqMisxXT1tYXBbKHN0cltpXSAgICkmMHgwZl07CisJCX0KKwlidWZbaitpKjJdPSdcbic7CisJYnVmW2oraSoyKzFdPSdcMCc7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCit2b2lkICpQRU1fQVNOMV9yZWFkKGQyaV9vZl92b2lkICpkMmksIGNvbnN0IGNoYXIgKm5hbWUsIEZJTEUgKmZwLCB2b2lkICoqeCwKKwkJICAgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCisJeworICAgICAgICBCSU8gKmI7CisgICAgICAgIHZvaWQgKnJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCVBFTWVycihQRU1fRl9QRU1fQVNOMV9SRUFELEVSUl9SX0JVRl9MSUIpOworICAgICAgICAgICAgICAgIHJldHVybigwKTsKKwkJfQorICAgICAgICBCSU9fc2V0X2ZwKGIsZnAsQklPX05PQ0xPU0UpOworICAgICAgICByZXQ9UEVNX0FTTjFfcmVhZF9iaW8oZDJpLG5hbWUsYix4LGNiLHUpOworICAgICAgICBCSU9fZnJlZShiKTsKKyAgICAgICAgcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY2hlY2tfcGVtKGNvbnN0IGNoYXIgKm5tLCBjb25zdCBjaGFyICpuYW1lKQoreworCS8qIE5vcm1hbCBtYXRjaGluZyBubSBhbmQgbmFtZSAqLworCWlmICghc3RyY21wKG5tLG5hbWUpKSByZXR1cm4gMTsKKworCS8qIE1ha2UgUEVNX1NUUklOR19FVlBfUEtFWSBtYXRjaCBhbnkgcHJpdmF0ZSBrZXkgKi8KKworCWlmKCFzdHJjbXAobmFtZSxQRU1fU1RSSU5HX0VWUF9QS0VZKSkKKwkJeworCQlpbnQgc2xlbjsKKwkJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCQlpZighc3RyY21wKG5tLFBFTV9TVFJJTkdfUEtDUzgpKQorCQkJcmV0dXJuIDE7CisJCWlmKCFzdHJjbXAobm0sUEVNX1NUUklOR19QS0NTOElORikpCisJCQlyZXR1cm4gMTsKKwkJc2xlbiA9IHBlbV9jaGVja19zdWZmaXgobm0sICJQUklWQVRFIEtFWSIpOyAKKwkJaWYgKHNsZW4gPiAwKQorCQkJeworCQkJLyogTkI6IEVOR0lORSBpbXBsZW1lbnRhdGlvbnMgd29udCBjb250YWluCisJCQkgKiBhIGRlcHJlY2F0ZWQgb2xkIHByaXZhdGUga2V5IGRlY29kZSBmdW5jdGlvbgorCQkJICogc28gZG9uJ3QgbG9vayBmb3IgdGhlbS4KKwkJCSAqLworCQkJYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmRfc3RyKE5VTEwsIG5tLCBzbGVuKTsKKwkJCWlmIChhbWV0aCAmJiBhbWV0aC0+b2xkX3ByaXZfZGVjb2RlKQorCQkJCXJldHVybiAxOworCQkJfQorCQlyZXR1cm4gMDsKKwkJfQorCisJaWYoIXN0cmNtcChuYW1lLFBFTV9TVFJJTkdfUEFSQU1FVEVSUykpCisJCXsKKwkJaW50IHNsZW47CisJCWNvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aDsKKwkJc2xlbiA9IHBlbV9jaGVja19zdWZmaXgobm0sICJQQVJBTUVURVJTIik7IAorCQlpZiAoc2xlbiA+IDApCisJCQl7CisJCQlFTkdJTkUgKmU7CisJCQlhbWV0aCA9IEVWUF9QS0VZX2FzbjFfZmluZF9zdHIoJmUsIG5tLCBzbGVuKTsKKwkJCWlmIChhbWV0aCkKKwkJCQl7CisJCQkJaW50IHI7CisJCQkJaWYgKGFtZXRoLT5wYXJhbV9kZWNvZGUpCisJCQkJCXIgPSAxOworCQkJCWVsc2UKKwkJCQkJciA9IDA7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCQkJaWYgKGUpCisJCQkJCUVOR0lORV9maW5pc2goZSk7CisjZW5kaWYKKwkJCQlyZXR1cm4gcjsKKwkJCQl9CisJCQl9CisJCXJldHVybiAwOworCQl9CisKKwkvKiBQZXJtaXQgb2xkZXIgc3RyaW5ncyAqLworCisJaWYoIXN0cmNtcChubSxQRU1fU1RSSU5HX1g1MDlfT0xEKSAmJgorCQkhc3RyY21wKG5hbWUsUEVNX1NUUklOR19YNTA5KSkgcmV0dXJuIDE7CisKKwlpZighc3RyY21wKG5tLFBFTV9TVFJJTkdfWDUwOV9SRVFfT0xEKSAmJgorCQkhc3RyY21wKG5hbWUsUEVNX1NUUklOR19YNTA5X1JFUSkpIHJldHVybiAxOworCisJLyogQWxsb3cgbm9ybWFsIGNlcnRzIHRvIGJlIHJlYWQgYXMgdHJ1c3RlZCBjZXJ0cyAqLworCWlmKCFzdHJjbXAobm0sUEVNX1NUUklOR19YNTA5KSAmJgorCQkhc3RyY21wKG5hbWUsUEVNX1NUUklOR19YNTA5X1RSVVNURUQpKSByZXR1cm4gMTsKKworCWlmKCFzdHJjbXAobm0sUEVNX1NUUklOR19YNTA5X09MRCkgJiYKKwkJIXN0cmNtcChuYW1lLFBFTV9TVFJJTkdfWDUwOV9UUlVTVEVEKSkgcmV0dXJuIDE7CisKKwkvKiBTb21lIENBcyB1c2UgUEtDUyM3IHdpdGggQ0VSVElGSUNBVEUgaGVhZGVycyAqLworCWlmKCFzdHJjbXAobm0sIFBFTV9TVFJJTkdfWDUwOSkgJiYKKwkJIXN0cmNtcChuYW1lLCBQRU1fU1RSSU5HX1BLQ1M3KSkgcmV0dXJuIDE7CisKKwlpZighc3RyY21wKG5tLCBQRU1fU1RSSU5HX1BLQ1M3X1NJR05FRCkgJiYKKwkJIXN0cmNtcChuYW1lLCBQRU1fU1RSSU5HX1BLQ1M3KSkgcmV0dXJuIDE7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKwlpZighc3RyY21wKG5tLCBQRU1fU1RSSU5HX1g1MDkpICYmCisJCSFzdHJjbXAobmFtZSwgUEVNX1NUUklOR19DTVMpKSByZXR1cm4gMTsKKwkvKiBBbGxvdyBDTVMgdG8gYmUgcmVhZCBmcm9tIFBLQ1MjNyBoZWFkZXJzICovCisJaWYoIXN0cmNtcChubSwgUEVNX1NUUklOR19QS0NTNykgJiYKKwkJIXN0cmNtcChuYW1lLCBQRU1fU1RSSU5HX0NNUykpIHJldHVybiAxOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworaW50IFBFTV9ieXRlc19yZWFkX2Jpbyh1bnNpZ25lZCBjaGFyICoqcGRhdGEsIGxvbmcgKnBsZW4sIGNoYXIgKipwbm0sIGNvbnN0IGNoYXIgKm5hbWUsIEJJTyAqYnAsCisJICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKwlFVlBfQ0lQSEVSX0lORk8gY2lwaGVyOworCWNoYXIgKm5tPU5VTEwsKmhlYWRlcj1OVUxMOworCXVuc2lnbmVkIGNoYXIgKmRhdGE9TlVMTDsKKwlsb25nIGxlbjsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoOzspCisJCXsKKwkJaWYgKCFQRU1fcmVhZF9iaW8oYnAsJm5tLCZoZWFkZXIsJmRhdGEsJmxlbikpIHsKKwkJCWlmKEVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2Vycm9yKCkpID09CisJCQkJUEVNX1JfTk9fU1RBUlRfTElORSkKKwkJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIkV4cGVjdGluZzogIiwgbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZihjaGVja19wZW0obm0sIG5hbWUpKSBicmVhazsKKwkJT1BFTlNTTF9mcmVlKG5tKTsKKwkJT1BFTlNTTF9mcmVlKGhlYWRlcik7CisJCU9QRU5TU0xfZnJlZShkYXRhKTsKKwkJfQorCWlmICghUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8oaGVhZGVyLCZjaXBoZXIpKSBnb3RvIGVycjsKKwlpZiAoIVBFTV9kb19oZWFkZXIoJmNpcGhlcixkYXRhLCZsZW4sY2IsdSkpIGdvdG8gZXJyOworCisJKnBkYXRhID0gZGF0YTsKKwkqcGxlbiA9IGxlbjsKKworCWlmIChwbm0pCisJCSpwbm0gPSBubTsKKworCXJldCA9IDE7CisKK2VycjoKKwlpZiAoIXJldCB8fCAhcG5tKSBPUEVOU1NMX2ZyZWUobm0pOworCU9QRU5TU0xfZnJlZShoZWFkZXIpOworCWlmICghcmV0KSBPUEVOU1NMX2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBQRU1fQVNOMV93cml0ZShpMmRfb2Zfdm9pZCAqaTJkLCBjb25zdCBjaGFyICpuYW1lLCBGSUxFICpmcCwKKwkJICAgdm9pZCAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLCB1bnNpZ25lZCBjaGFyICprc3RyLAorCQkgICBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjYWxsYmFjaywgdm9pZCAqdSkKKyAgICAgICAgeworICAgICAgICBCSU8gKmI7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlQRU1lcnIoUEVNX0ZfUEVNX0FTTjFfV1JJVEUsRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworCQl9CisgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1QRU1fQVNOMV93cml0ZV9iaW8oaTJkLG5hbWUsYix4LGVuYyxrc3RyLGtsZW4sY2FsbGJhY2ssdSk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK2ludCBQRU1fQVNOMV93cml0ZV9iaW8oaTJkX29mX3ZvaWQgKmkyZCwgY29uc3QgY2hhciAqbmFtZSwgQklPICpicCwKKwkJICAgICAgIHZvaWQgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgdW5zaWduZWQgY2hhciAqa3N0ciwKKwkJICAgICAgIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNhbGxiYWNrLCB2b2lkICp1KQorCXsKKwlFVlBfQ0lQSEVSX0NUWCBjdHg7CisJaW50IGRzaXplPTAsaSxqLHJldD0wOworCXVuc2lnbmVkIGNoYXIgKnAsKmRhdGE9TlVMTDsKKwljb25zdCBjaGFyICpvYmpzdHI9TlVMTDsKKwljaGFyIGJ1ZltQRU1fQlVGU0laRV07CisJdW5zaWduZWQgY2hhciBrZXlbRVZQX01BWF9LRVlfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyIGl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKKwkKKwlpZiAoZW5jICE9IE5VTEwpCisJCXsKKwkJb2Jqc3RyPU9CSl9uaWQyc24oRVZQX0NJUEhFUl9uaWQoZW5jKSk7CisJCWlmIChvYmpzdHIgPT0gTlVMTCkKKwkJCXsKKwkJCVBFTWVycihQRU1fRl9QRU1fQVNOMV9XUklURV9CSU8sUEVNX1JfVU5TVVBQT1JURURfQ0lQSEVSKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAoKGRzaXplPWkyZCh4LE5VTEwpKSA8IDApCisJCXsKKwkJUEVNZXJyKFBFTV9GX1BFTV9BU04xX1dSSVRFX0JJTyxFUlJfUl9BU04xX0xJQik7CisJCWRzaXplPTA7CisJCWdvdG8gZXJyOworCQl9CisJLyogZHppc2UgKyA4IGJ5dGVzIGFyZSBuZWVkZWQgKi8KKwkvKiBhY3R1YWxseSBpdCBuZWVkcyB0aGUgY2lwaGVyIGJsb2NrIHNpemUgZXh0cmEuLi4gKi8KKwlkYXRhPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKHVuc2lnbmVkIGludClkc2l6ZSsyMCk7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJeworCQlQRU1lcnIoUEVNX0ZfUEVNX0FTTjFfV1JJVEVfQklPLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlwPWRhdGE7CisJaT1pMmQoeCwmcCk7CisKKwlpZiAoZW5jICE9IE5VTEwpCisJCXsKKwkJaWYgKGtzdHIgPT0gTlVMTCkKKwkJCXsKKwkJCWlmIChjYWxsYmFjayA9PSBOVUxMKQorCQkJCWtsZW49UEVNX2RlZl9jYWxsYmFjayhidWYsUEVNX0JVRlNJWkUsMSx1KTsKKwkJCWVsc2UKKwkJCQlrbGVuPSgqY2FsbGJhY2spKGJ1ZixQRU1fQlVGU0laRSwxLHUpOworCQkJaWYgKGtsZW4gPD0gMCkKKwkJCQl7CisJCQkJUEVNZXJyKFBFTV9GX1BFTV9BU04xX1dSSVRFX0JJTyxQRU1fUl9SRUFEX0tFWSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCQkvKiBDb252ZXJ0IHRoZSBwYXNzIHBocmFzZSBmcm9tIEVCQ0RJQyAqLworCQkJZWJjZGljMmFzY2lpKGJ1ZiwgYnVmLCBrbGVuKTsKKyNlbmRpZgorCQkJa3N0cj0odW5zaWduZWQgY2hhciAqKWJ1ZjsKKwkJCX0KKwkJUkFORF9hZGQoZGF0YSxpLDApOy8qIHB1dCBpbiB0aGUgUlNBIGtleS4gKi8KKwkJT1BFTlNTTF9hc3NlcnQoZW5jLT5pdl9sZW4gPD0gKGludClzaXplb2YoaXYpKTsKKwkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKGl2LGVuYy0+aXZfbGVuKSA8IDApIC8qIEdlbmVyYXRlIGEgc2FsdCAqLworCQkJZ290byBlcnI7CisJCS8qIFRoZSAnaXYnIGlzIHVzZWQgYXMgdGhlIGl2IGFuZCBhcyBhIHNhbHQuICBJdCBpcworCQkgKiBOT1QgdGFrZW4gZnJvbSB0aGUgQnl0ZXNUb0tleSBmdW5jdGlvbiAqLworCQlFVlBfQnl0ZXNUb0tleShlbmMsRVZQX21kNSgpLGl2LGtzdHIsa2xlbiwxLGtleSxOVUxMKTsKKworCQlpZiAoa3N0ciA9PSAodW5zaWduZWQgY2hhciAqKWJ1ZikgT1BFTlNTTF9jbGVhbnNlKGJ1ZixQRU1fQlVGU0laRSk7CisKKwkJT1BFTlNTTF9hc3NlcnQoc3RybGVuKG9ianN0cikrMjMrMiplbmMtPml2X2xlbisxMyA8PSBzaXplb2YgYnVmKTsKKworCQlidWZbMF09J1wwJzsKKwkJUEVNX3Byb2NfdHlwZShidWYsUEVNX1RZUEVfRU5DUllQVEVEKTsKKwkJUEVNX2Rla19pbmZvKGJ1ZixvYmpzdHIsZW5jLT5pdl9sZW4sKGNoYXIgKilpdik7CisJCS8qIGs9c3RybGVuKGJ1Zik7ICovCisKKwkJRVZQX0NJUEhFUl9DVFhfaW5pdCgmY3R4KTsKKwkJRVZQX0VuY3J5cHRJbml0X2V4KCZjdHgsZW5jLE5VTEwsa2V5LGl2KTsKKwkJRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCxkYXRhLCZqLGRhdGEsaSk7CisJCUVWUF9FbmNyeXB0RmluYWxfZXgoJmN0eCwmKGRhdGFbal0pLCZpKTsKKwkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKwkJaSs9ajsKKwkJcmV0PTE7CisJCX0KKwllbHNlCisJCXsKKwkJcmV0PTE7CisJCWJ1ZlswXT0nXDAnOworCQl9CisJaT1QRU1fd3JpdGVfYmlvKGJwLG5hbWUsYnVmLGRhdGEsaSk7CisJaWYgKGkgPD0gMCkgcmV0PTA7CitlcnI6CisJT1BFTlNTTF9jbGVhbnNlKGtleSxzaXplb2Yoa2V5KSk7CisJT1BFTlNTTF9jbGVhbnNlKGl2LHNpemVvZihpdikpOworCU9QRU5TU0xfY2xlYW5zZSgoY2hhciAqKSZjdHgsc2l6ZW9mKGN0eCkpOworCU9QRU5TU0xfY2xlYW5zZShidWYsUEVNX0JVRlNJWkUpOworCWlmIChkYXRhICE9IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9jbGVhbnNlKGRhdGEsKHVuc2lnbmVkIGludClkc2l6ZSk7CisJCU9QRU5TU0xfZnJlZShkYXRhKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworaW50IFBFTV9kb19oZWFkZXIoRVZQX0NJUEhFUl9JTkZPICpjaXBoZXIsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGxvbmcgKnBsZW4sCisJICAgICBwZW1fcGFzc3dvcmRfY2IgKmNhbGxiYWNrLHZvaWQgKnUpCisJeworCWludCBpLGosbyxrbGVuOworCWxvbmcgbGVuOworCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwl1bnNpZ25lZCBjaGFyIGtleVtFVlBfTUFYX0tFWV9MRU5HVEhdOworCWNoYXIgYnVmW1BFTV9CVUZTSVpFXTsKKworCWxlbj0gKnBsZW47CisKKwlpZiAoY2lwaGVyLT5jaXBoZXIgPT0gTlVMTCkgcmV0dXJuKDEpOworCWlmIChjYWxsYmFjayA9PSBOVUxMKQorCQlrbGVuPVBFTV9kZWZfY2FsbGJhY2soYnVmLFBFTV9CVUZTSVpFLDAsdSk7CisJZWxzZQorCQlrbGVuPWNhbGxiYWNrKGJ1ZixQRU1fQlVGU0laRSwwLHUpOworCWlmIChrbGVuIDw9IDApCisJCXsKKwkJUEVNZXJyKFBFTV9GX1BFTV9ET19IRUFERVIsUEVNX1JfQkFEX1BBU1NXT1JEX1JFQUQpOworCQlyZXR1cm4oMCk7CisJCX0KKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworCS8qIENvbnZlcnQgdGhlIHBhc3MgcGhyYXNlIGZyb20gRUJDRElDICovCisJZWJjZGljMmFzY2lpKGJ1ZiwgYnVmLCBrbGVuKTsKKyNlbmRpZgorCisJRVZQX0J5dGVzVG9LZXkoY2lwaGVyLT5jaXBoZXIsRVZQX21kNSgpLCYoY2lwaGVyLT5pdlswXSksCisJCSh1bnNpZ25lZCBjaGFyICopYnVmLGtsZW4sMSxrZXksTlVMTCk7CisKKwlqPShpbnQpbGVuOworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisJRVZQX0RlY3J5cHRJbml0X2V4KCZjdHgsY2lwaGVyLT5jaXBoZXIsTlVMTCwga2V5LCYoY2lwaGVyLT5pdlswXSkpOworCUVWUF9EZWNyeXB0VXBkYXRlKCZjdHgsZGF0YSwmaSxkYXRhLGopOworCW89RVZQX0RlY3J5cHRGaW5hbF9leCgmY3R4LCYoZGF0YVtpXSksJmopOworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisJT1BFTlNTTF9jbGVhbnNlKChjaGFyICopYnVmLHNpemVvZihidWYpKTsKKwlPUEVOU1NMX2NsZWFuc2UoKGNoYXIgKilrZXksc2l6ZW9mKGtleSkpOworCWorPWk7CisJaWYgKCFvKQorCQl7CisJCVBFTWVycihQRU1fRl9QRU1fRE9fSEVBREVSLFBFTV9SX0JBRF9ERUNSWVBUKTsKKwkJcmV0dXJuKDApOworCQl9CisJKnBsZW49ajsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgUEVNX2dldF9FVlBfQ0lQSEVSX0lORk8oY2hhciAqaGVhZGVyLCBFVlBfQ0lQSEVSX0lORk8gKmNpcGhlcikKKwl7CisJaW50IG87CisJY29uc3QgRVZQX0NJUEhFUiAqZW5jPU5VTEw7CisJY2hhciAqcCxjOworCWNoYXIgKipoZWFkZXJfcHAgPSAmaGVhZGVyOworCisJY2lwaGVyLT5jaXBoZXI9TlVMTDsKKwlpZiAoKGhlYWRlciA9PSBOVUxMKSB8fCAoKmhlYWRlciA9PSAnXDAnKSB8fCAoKmhlYWRlciA9PSAnXG4nKSkKKwkJcmV0dXJuKDEpOworCWlmIChzdHJuY21wKGhlYWRlciwiUHJvYy1UeXBlOiAiLDExKSAhPSAwKQorCQl7IFBFTWVycihQRU1fRl9QRU1fR0VUX0VWUF9DSVBIRVJfSU5GTyxQRU1fUl9OT1RfUFJPQ19UWVBFKTsgcmV0dXJuKDApOyB9CisJaGVhZGVyKz0xMTsKKwlpZiAoKmhlYWRlciAhPSAnNCcpIHJldHVybigwKTsgaGVhZGVyKys7CisJaWYgKCpoZWFkZXIgIT0gJywnKSByZXR1cm4oMCk7IGhlYWRlcisrOworCWlmIChzdHJuY21wKGhlYWRlciwiRU5DUllQVEVEIiw5KSAhPSAwKQorCQl7IFBFTWVycihQRU1fRl9QRU1fR0VUX0VWUF9DSVBIRVJfSU5GTyxQRU1fUl9OT1RfRU5DUllQVEVEKTsgcmV0dXJuKDApOyB9CisJZm9yICg7ICgqaGVhZGVyICE9ICdcbicpICYmICgqaGVhZGVyICE9ICdcMCcpOyBoZWFkZXIrKykKKwkJOworCWlmICgqaGVhZGVyID09ICdcMCcpCisJCXsgUEVNZXJyKFBFTV9GX1BFTV9HRVRfRVZQX0NJUEhFUl9JTkZPLFBFTV9SX1NIT1JUX0hFQURFUik7IHJldHVybigwKTsgfQorCWhlYWRlcisrOworCWlmIChzdHJuY21wKGhlYWRlciwiREVLLUluZm86ICIsMTApICE9IDApCisJCXsgUEVNZXJyKFBFTV9GX1BFTV9HRVRfRVZQX0NJUEhFUl9JTkZPLFBFTV9SX05PVF9ERUtfSU5GTyk7IHJldHVybigwKTsgfQorCWhlYWRlcis9MTA7CisKKwlwPWhlYWRlcjsKKwlmb3IgKDs7KQorCQl7CisJCWM9ICpoZWFkZXI7CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCWlmICghKAkoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKSB8fCAoYyA9PSAnLScpIHx8CisJCQkoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSkpCisJCQlicmVhazsKKyNlbHNlCisJCWlmICghKAlpc3VwcGVyKGMpIHx8IChjID09ICctJykgfHwKKwkJCWlzZGlnaXQoYykpKQorCQkJYnJlYWs7CisjZW5kaWYKKwkJaGVhZGVyKys7CisJCX0KKwkqaGVhZGVyPSdcMCc7CisJbz1PQkpfc24ybmlkKHApOworCWNpcGhlci0+Y2lwaGVyPWVuYz1FVlBfZ2V0X2NpcGhlcmJ5bmFtZShwKTsKKwkqaGVhZGVyPWM7CisJaGVhZGVyKys7CisKKwlpZiAoZW5jID09IE5VTEwpCisJCXsKKwkJUEVNZXJyKFBFTV9GX1BFTV9HRVRfRVZQX0NJUEhFUl9JTkZPLFBFTV9SX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT04pOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoIWxvYWRfaXYoaGVhZGVyX3BwLCYoY2lwaGVyLT5pdlswXSksZW5jLT5pdl9sZW4pKQorCQlyZXR1cm4oMCk7CisKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IGxvYWRfaXYoY2hhciAqKmZyb21wLCB1bnNpZ25lZCBjaGFyICp0bywgaW50IG51bSkKKwl7CisJaW50IHYsaTsKKwljaGFyICpmcm9tOworCisJZnJvbT0gKmZyb21wOworCWZvciAoaT0wOyBpPG51bTsgaSsrKSB0b1tpXT0wOworCW51bSo9MjsKKwlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJeworCQlpZiAoKCpmcm9tID49ICcwJykgJiYgKCpmcm9tIDw9ICc5JykpCisJCQl2PSAqZnJvbS0nMCc7CisJCWVsc2UgaWYgKCgqZnJvbSA+PSAnQScpICYmICgqZnJvbSA8PSAnRicpKQorCQkJdj0gKmZyb20tJ0EnKzEwOworCQllbHNlIGlmICgoKmZyb20gPj0gJ2EnKSAmJiAoKmZyb20gPD0gJ2YnKSkKKwkJCXY9ICpmcm9tLSdhJysxMDsKKwkJZWxzZQorCQkJeworCQkJUEVNZXJyKFBFTV9GX0xPQURfSVYsUEVNX1JfQkFEX0lWX0NIQVJTKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKwkJZnJvbSsrOworCQl0b1tpLzJdfD12PDwobG9uZykoKCEoaSYxKSkqNCk7CisJCX0KKworCSpmcm9tcD1mcm9tOworCXJldHVybigxKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBQRU1fd3JpdGUoRklMRSAqZnAsIGNoYXIgKm5hbWUsIGNoYXIgKmhlYWRlciwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkgICAgIGxvbmcgbGVuKQorICAgICAgICB7CisgICAgICAgIEJJTyAqYjsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCVBFTWVycihQRU1fRl9QRU1fV1JJVEUsRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworCQl9CisgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1QRU1fd3JpdGVfYmlvKGIsIG5hbWUsIGhlYWRlciwgZGF0YSxsZW4pOworICAgICAgICBCSU9fZnJlZShiKTsKKyAgICAgICAgcmV0dXJuKHJldCk7CisgICAgICAgIH0KKyNlbmRpZgorCitpbnQgUEVNX3dyaXRlX2JpbyhCSU8gKmJwLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyICpoZWFkZXIsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJICAgICBsb25nIGxlbikKKwl7CisJaW50IG5sZW4sbixpLGosb3V0bDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBOVUxMOworCUVWUF9FTkNPREVfQ1RYIGN0eDsKKwlpbnQgcmVhc29uPUVSUl9SX0JVRl9MSUI7CisJCisJRVZQX0VuY29kZUluaXQoJmN0eCk7CisJbmxlbj1zdHJsZW4obmFtZSk7CisKKwlpZiAoCShCSU9fd3JpdGUoYnAsIi0tLS0tQkVHSU4gIiwxMSkgIT0gMTEpIHx8CisJCShCSU9fd3JpdGUoYnAsbmFtZSxubGVuKSAhPSBubGVuKSB8fAorCQkoQklPX3dyaXRlKGJwLCItLS0tLVxuIiw2KSAhPSA2KSkKKwkJZ290byBlcnI7CisJCQorCWk9c3RybGVuKGhlYWRlcik7CisJaWYgKGkgPiAwKQorCQl7CisJCWlmICgJKEJJT193cml0ZShicCxoZWFkZXIsaSkgIT0gaSkgfHwKKwkJCShCSU9fd3JpdGUoYnAsIlxuIiwxKSAhPSAxKSkKKwkJCWdvdG8gZXJyOworCQl9CisKKwlidWYgPSBPUEVOU1NMX21hbGxvYyhQRU1fQlVGU0laRSo4KTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXsKKwkJcmVhc29uPUVSUl9SX01BTExPQ19GQUlMVVJFOworCQlnb3RvIGVycjsKKwkJfQorCisJaT1qPTA7CisJd2hpbGUgKGxlbiA+IDApCisJCXsKKwkJbj0oaW50KSgobGVuPihQRU1fQlVGU0laRSo1KSk/KFBFTV9CVUZTSVpFKjUpOmxlbik7CisJCUVWUF9FbmNvZGVVcGRhdGUoJmN0eCxidWYsJm91dGwsJihkYXRhW2pdKSxuKTsKKwkJaWYgKChvdXRsKSAmJiAoQklPX3dyaXRlKGJwLChjaGFyICopYnVmLG91dGwpICE9IG91dGwpKQorCQkJZ290byBlcnI7CisJCWkrPW91dGw7CisJCWxlbi09bjsKKwkJais9bjsKKwkJfQorCUVWUF9FbmNvZGVGaW5hbCgmY3R4LGJ1Ziwmb3V0bCk7CisJaWYgKChvdXRsID4gMCkgJiYgKEJJT193cml0ZShicCwoY2hhciAqKWJ1ZixvdXRsKSAhPSBvdXRsKSkgZ290byBlcnI7CisJT1BFTlNTTF9jbGVhbnNlKGJ1ZiwgUEVNX0JVRlNJWkUqOCk7CisJT1BFTlNTTF9mcmVlKGJ1Zik7CisJYnVmID0gTlVMTDsKKwlpZiAoCShCSU9fd3JpdGUoYnAsIi0tLS0tRU5EICIsOSkgIT0gOSkgfHwKKwkJKEJJT193cml0ZShicCxuYW1lLG5sZW4pICE9IG5sZW4pIHx8CisJCShCSU9fd3JpdGUoYnAsIi0tLS0tXG4iLDYpICE9IDYpKQorCQlnb3RvIGVycjsKKwlyZXR1cm4oaStvdXRsKTsKK2VycjoKKwlpZiAoYnVmKSB7CisJCU9QRU5TU0xfY2xlYW5zZShidWYsIFBFTV9CVUZTSVpFKjgpOworCQlPUEVOU1NMX2ZyZWUoYnVmKTsKKwl9CisJUEVNZXJyKFBFTV9GX1BFTV9XUklURV9CSU8scmVhc29uKTsKKwlyZXR1cm4oMCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgUEVNX3JlYWQoRklMRSAqZnAsIGNoYXIgKipuYW1lLCBjaGFyICoqaGVhZGVyLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkgICAgIGxvbmcgKmxlbikKKyAgICAgICAgeworICAgICAgICBCSU8gKmI7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKChiPUJJT19uZXcoQklPX3NfZmlsZSgpKSkgPT0gTlVMTCkKKwkJeworCQlQRU1lcnIoUEVNX0ZfUEVNX1JFQUQsRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworCQl9CisgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1QRU1fcmVhZF9iaW8oYiwgbmFtZSwgaGVhZGVyLCBkYXRhLGxlbik7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKyAgICAgICAgfQorI2VuZGlmCisKK2ludCBQRU1fcmVhZF9iaW8oQklPICpicCwgY2hhciAqKm5hbWUsIGNoYXIgKipoZWFkZXIsIHVuc2lnbmVkIGNoYXIgKipkYXRhLAorCSAgICAgbG9uZyAqbGVuKQorCXsKKwlFVlBfRU5DT0RFX0NUWCBjdHg7CisJaW50IGVuZD0wLGksayxibD0wLGhsPTAsbm9oZWFkPTA7CisJY2hhciBidWZbMjU2XTsKKwlCVUZfTUVNICpuYW1lQjsKKwlCVUZfTUVNICpoZWFkZXJCOworCUJVRl9NRU0gKmRhdGFCLCp0bXBCOworCQorCW5hbWVCPUJVRl9NRU1fbmV3KCk7CisJaGVhZGVyQj1CVUZfTUVNX25ldygpOworCWRhdGFCPUJVRl9NRU1fbmV3KCk7CisJaWYgKChuYW1lQiA9PSBOVUxMKSB8fCAoaGVhZGVyQiA9PSBOVUxMKSB8fCAoZGF0YUIgPT0gTlVMTCkpCisJCXsKKwkJQlVGX01FTV9mcmVlKG5hbWVCKTsKKwkJQlVGX01FTV9mcmVlKGhlYWRlckIpOworCQlCVUZfTUVNX2ZyZWUoZGF0YUIpOworCQlQRU1lcnIoUEVNX0ZfUEVNX1JFQURfQklPLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlidWZbMjU0XT0nXDAnOworCWZvciAoOzspCisJCXsKKwkJaT1CSU9fZ2V0cyhicCxidWYsMjU0KTsKKworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX1BFTV9SRUFEX0JJTyxQRU1fUl9OT19TVEFSVF9MSU5FKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCXdoaWxlICgoaSA+PSAwKSAmJiAoYnVmW2ldIDw9ICcgJykpIGktLTsKKwkJYnVmWysraV09J1xuJzsgYnVmWysraV09J1wwJzsKKworCQlpZiAoc3RybmNtcChidWYsIi0tLS0tQkVHSU4gIiwxMSkgPT0gMCkKKwkJCXsKKwkJCWk9c3RybGVuKCYoYnVmWzExXSkpOworCisJCQlpZiAoc3RybmNtcCgmKGJ1ZlsxMStpLTZdKSwiLS0tLS1cbiIsNikgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghQlVGX01FTV9ncm93KG5hbWVCLGkrOSkpCisJCQkJeworCQkJCVBFTWVycihQRU1fRl9QRU1fUkVBRF9CSU8sRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCW1lbWNweShuYW1lQi0+ZGF0YSwmKGJ1ZlsxMV0pLGktNik7CisJCQluYW1lQi0+ZGF0YVtpLTZdPSdcMCc7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCWhsPTA7CisJaWYgKCFCVUZfTUVNX2dyb3coaGVhZGVyQiwyNTYpKQorCQl7IFBFTWVycihQRU1fRl9QRU1fUkVBRF9CSU8sRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyBnb3RvIGVycjsgfQorCWhlYWRlckItPmRhdGFbMF09J1wwJzsKKwlmb3IgKDs7KQorCQl7CisJCWk9QklPX2dldHMoYnAsYnVmLDI1NCk7CisJCWlmIChpIDw9IDApIGJyZWFrOworCisJCXdoaWxlICgoaSA+PSAwKSAmJiAoYnVmW2ldIDw9ICcgJykpIGktLTsKKwkJYnVmWysraV09J1xuJzsgYnVmWysraV09J1wwJzsKKworCQlpZiAoYnVmWzBdID09ICdcbicpIGJyZWFrOworCQlpZiAoIUJVRl9NRU1fZ3JvdyhoZWFkZXJCLGhsK2krOSkpCisJCQl7IFBFTWVycihQRU1fRl9QRU1fUkVBRF9CSU8sRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOyBnb3RvIGVycjsgfQorCQlpZiAoc3RybmNtcChidWYsIi0tLS0tRU5EICIsOSkgPT0gMCkKKwkJCXsKKwkJCW5vaGVhZD0xOworCQkJYnJlYWs7CisJCQl9CisJCW1lbWNweSgmKGhlYWRlckItPmRhdGFbaGxdKSxidWYsaSk7CisJCWhlYWRlckItPmRhdGFbaGwraV09J1wwJzsKKwkJaGwrPWk7CisJCX0KKworCWJsPTA7CisJaWYgKCFCVUZfTUVNX2dyb3coZGF0YUIsMTAyNCkpCisJCXsgUEVNZXJyKFBFTV9GX1BFTV9SRUFEX0JJTyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7IGdvdG8gZXJyOyB9CisJZGF0YUItPmRhdGFbMF09J1wwJzsKKwlpZiAoIW5vaGVhZCkKKwkJeworCQlmb3IgKDs7KQorCQkJeworCQkJaT1CSU9fZ2V0cyhicCxidWYsMjU0KTsKKwkJCWlmIChpIDw9IDApIGJyZWFrOworCisJCQl3aGlsZSAoKGkgPj0gMCkgJiYgKGJ1ZltpXSA8PSAnICcpKSBpLS07CisJCQlidWZbKytpXT0nXG4nOyBidWZbKytpXT0nXDAnOworCisJCQlpZiAoaSAhPSA2NSkgZW5kPTE7CisJCQlpZiAoc3RybmNtcChidWYsIi0tLS0tRU5EICIsOSkgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChpID4gNjUpIGJyZWFrOworCQkJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oZGF0YUIsaStibCs5KSkKKwkJCQl7CisJCQkJUEVNZXJyKFBFTV9GX1BFTV9SRUFEX0JJTyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJbWVtY3B5KCYoZGF0YUItPmRhdGFbYmxdKSxidWYsaSk7CisJCQlkYXRhQi0+ZGF0YVtibCtpXT0nXDAnOworCQkJYmwrPWk7CisJCQlpZiAoZW5kKQorCQkJCXsKKwkJCQlidWZbMF09J1wwJzsKKwkJCQlpPUJJT19nZXRzKGJwLGJ1ZiwyNTQpOworCQkJCWlmIChpIDw9IDApIGJyZWFrOworCisJCQkJd2hpbGUgKChpID49IDApICYmIChidWZbaV0gPD0gJyAnKSkgaS0tOworCQkJCWJ1ZlsrK2ldPSdcbic7IGJ1ZlsrK2ldPSdcMCc7CisKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJdG1wQj1oZWFkZXJCOworCQloZWFkZXJCPWRhdGFCOworCQlkYXRhQj10bXBCOworCQlibD1obDsKKwkJfQorCWk9c3RybGVuKG5hbWVCLT5kYXRhKTsKKwlpZiAoCShzdHJuY21wKGJ1ZiwiLS0tLS1FTkQgIiw5KSAhPSAwKSB8fAorCQkoc3RybmNtcChuYW1lQi0+ZGF0YSwmKGJ1Zls5XSksaSkgIT0gMCkgfHwKKwkJKHN0cm5jbXAoJihidWZbOStpXSksIi0tLS0tXG4iLDYpICE9IDApKQorCQl7CisJCVBFTWVycihQRU1fRl9QRU1fUkVBRF9CSU8sUEVNX1JfQkFEX0VORF9MSU5FKTsKKwkJZ290byBlcnI7CisJCX0KKworCUVWUF9EZWNvZGVJbml0KCZjdHgpOworCWk9RVZQX0RlY29kZVVwZGF0ZSgmY3R4LAorCQkodW5zaWduZWQgY2hhciAqKWRhdGFCLT5kYXRhLCZibCwKKwkJKHVuc2lnbmVkIGNoYXIgKilkYXRhQi0+ZGF0YSxibCk7CisJaWYgKGkgPCAwKQorCQl7CisJCVBFTWVycihQRU1fRl9QRU1fUkVBRF9CSU8sUEVNX1JfQkFEX0JBU0U2NF9ERUNPREUpOworCQlnb3RvIGVycjsKKwkJfQorCWk9RVZQX0RlY29kZUZpbmFsKCZjdHgsKHVuc2lnbmVkIGNoYXIgKikmKGRhdGFCLT5kYXRhW2JsXSksJmspOworCWlmIChpIDwgMCkKKwkJeworCQlQRU1lcnIoUEVNX0ZfUEVNX1JFQURfQklPLFBFTV9SX0JBRF9CQVNFNjRfREVDT0RFKTsKKwkJZ290byBlcnI7CisJCX0KKwlibCs9azsKKworCWlmIChibCA9PSAwKSBnb3RvIGVycjsKKwkqbmFtZT1uYW1lQi0+ZGF0YTsKKwkqaGVhZGVyPWhlYWRlckItPmRhdGE7CisJKmRhdGE9KHVuc2lnbmVkIGNoYXIgKilkYXRhQi0+ZGF0YTsKKwkqbGVuPWJsOworCU9QRU5TU0xfZnJlZShuYW1lQik7CisJT1BFTlNTTF9mcmVlKGhlYWRlckIpOworCU9QRU5TU0xfZnJlZShkYXRhQik7CisJcmV0dXJuKDEpOworZXJyOgorCUJVRl9NRU1fZnJlZShuYW1lQik7CisJQlVGX01FTV9mcmVlKGhlYWRlckIpOworCUJVRl9NRU1fZnJlZShkYXRhQik7CisJcmV0dXJuKDApOworCX0KKworLyogQ2hlY2sgcGVtIHN0cmluZyBhbmQgcmV0dXJuIHByZWZpeCBsZW5ndGguCisgKiBJZiBmb3IgZXhhbXBsZSB0aGUgcGVtX3N0ciA9PSAiUlNBIFBSSVZBVEUgS0VZIiBhbmQgc3VmZml4ID0gIlBSSVZBVEUgS0VZIgorICogdGhlIHJldHVybiB2YWx1ZSBpcyAzIGZvciB0aGUgc3RyaW5nICJSU0EiLgorICovCisKK2ludCBwZW1fY2hlY2tfc3VmZml4KGNvbnN0IGNoYXIgKnBlbV9zdHIsIGNvbnN0IGNoYXIgKnN1ZmZpeCkKKwl7CisJaW50IHBlbV9sZW4gPSBzdHJsZW4ocGVtX3N0cik7CisJaW50IHN1ZmZpeF9sZW4gPSBzdHJsZW4oc3VmZml4KTsKKwljb25zdCBjaGFyICpwOworCWlmIChzdWZmaXhfbGVuICsgMSA+PSBwZW1fbGVuKQorCQlyZXR1cm4gMDsKKwlwID0gcGVtX3N0ciArIHBlbV9sZW4gLSBzdWZmaXhfbGVuOworCWlmIChzdHJjbXAocCwgc3VmZml4KSkKKwkJcmV0dXJuIDA7CisJcC0tOworCWlmICgqcCAhPSAnICcpCisJCXJldHVybiAwOworCXJldHVybiBwIC0gcGVtX3N0cjsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX290aC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fb3RoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzODY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX290aC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qIGNyeXB0by9wZW0vcGVtX290aC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKKy8qIEhhbmRsZSAnb3RoZXInIFBFTXM6IG5vdCBwcml2YXRlIGtleXMgKi8KKwordm9pZCAqUEVNX0FTTjFfcmVhZF9iaW8oZDJpX29mX3ZvaWQgKmQyaSwgY29uc3QgY2hhciAqbmFtZSwgQklPICpicCwgdm9pZCAqKngsCisJCQlwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwPU5VTEw7CisJdW5zaWduZWQgY2hhciAqZGF0YT1OVUxMOworCWxvbmcgbGVuOworCWNoYXIgKnJldD1OVUxMOworCisJaWYgKCFQRU1fYnl0ZXNfcmVhZF9iaW8oJmRhdGEsICZsZW4sIE5VTEwsIG5hbWUsIGJwLCBjYiwgdSkpCisJCXJldHVybiBOVUxMOworCXAgPSBkYXRhOworCXJldD1kMmkoeCwmcCxsZW4pOworCWlmIChyZXQgPT0gTlVMTCkKKwkJUEVNZXJyKFBFTV9GX1BFTV9BU04xX1JFQURfQklPLEVSUl9SX0FTTjFfTElCKTsKKwlPUEVOU1NMX2ZyZWUoZGF0YSk7CisJcmV0dXJuKHJldCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fcGs4LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV9wazguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVhYjhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fcGs4LmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qIGNyeXB0by9wZW0vcGVtX3BrZXkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisKK3N0YXRpYyBpbnQgZG9fcGs4cGtleShCSU8gKmJwLCBFVlBfUEtFWSAqeCwgaW50IGlzZGVyLAorCQkJCWludCBuaWQsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKwkJCQljaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQlwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK3N0YXRpYyBpbnQgZG9fcGs4cGtleV9mcChGSUxFICpicCwgRVZQX1BLRVkgKngsIGludCBpc2RlciwKKwkJCQlpbnQgbmlkLCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkJY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyB3cml0ZSBhIHByaXZhdGUga2V5IGluIFBLQ1MjOCBmb3JtYXQ6IGl0IGlzIGEgImRyb3AgaW4iCisgKiByZXBsYWNlbWVudCBmb3IgUEVNX3dyaXRlX2Jpb19Qcml2YXRlS2V5KCkgYW5kIGZyaWVuZHMuIEFzIHVzdWFsIGlmICdlbmMnCisgKiBpcyBOVUxMIHRoZW4gaXQgdXNlcyB0aGUgdW5lbmNyeXB0ZWQgcHJpdmF0ZSBrZXkgZm9ybS4gVGhlICduaWQnIHZlcnNpb25zCisgKiB1c2VzIFBLQ1MjNSB2MS41IFBCRSBhbGdvcml0aG1zIHdoZXJlYXMgdGhlIG90aGVycyB1c2UgUEtDUyM1IHYyLjAuCisgKi8KKworaW50IFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5X25pZChCSU8gKmJwLCBFVlBfUEtFWSAqeCwgaW50IG5pZCwKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKK3sKKwlyZXR1cm4gZG9fcGs4cGtleShicCwgeCwgMCwgbmlkLCBOVUxMLCBrc3RyLCBrbGVuLCBjYiwgdSk7Cit9CisKK2ludCBQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdmF0ZUtleShCSU8gKmJwLCBFVlBfUEtFWSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCXJldHVybiBkb19wazhwa2V5KGJwLCB4LCAwLCAtMSwgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7Cit9CisKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCXJldHVybiBkb19wazhwa2V5KGJwLCB4LCAxLCAtMSwgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7Cit9CisKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5X25pZF9iaW8oQklPICpicCwgRVZQX1BLRVkgKngsIGludCBuaWQsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJcmV0dXJuIGRvX3BrOHBrZXkoYnAsIHgsIDEsIG5pZCwgTlVMTCwga3N0ciwga2xlbiwgY2IsIHUpOworfQorCitzdGF0aWMgaW50IGRvX3BrOHBrZXkoQklPICpicCwgRVZQX1BLRVkgKngsIGludCBpc2RlciwgaW50IG5pZCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCVg1MDlfU0lHICpwODsKKwlQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZjsKKwljaGFyIGJ1ZltQRU1fQlVGU0laRV07CisJaW50IHJldDsKKwlpZighKHA4aW5mID0gRVZQX1BLRVkyUEtDUzgoeCkpKSB7CisJCVBFTWVycihQRU1fRl9ET19QSzhQS0VZLAorCQkJCQlQRU1fUl9FUlJPUl9DT05WRVJUSU5HX1BSSVZBVEVfS0VZKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmKGVuYyB8fCAobmlkICE9IC0xKSkgeworCQlpZigha3N0cikgeworCQkJaWYoIWNiKSBrbGVuID0gUEVNX2RlZl9jYWxsYmFjayhidWYsIFBFTV9CVUZTSVpFLCAxLCB1KTsKKwkJCWVsc2Uga2xlbiA9IGNiKGJ1ZiwgUEVNX0JVRlNJWkUsIDEsIHUpOworCQkJaWYoa2xlbiA8PSAwKSB7CisJCQkJUEVNZXJyKFBFTV9GX0RPX1BLOFBLRVksUEVNX1JfUkVBRF9LRVkpOworCQkJCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOGluZik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkJCisJCQlrc3RyID0gYnVmOworCQl9CisJCXA4ID0gUEtDUzhfZW5jcnlwdChuaWQsIGVuYywga3N0ciwga2xlbiwgTlVMTCwgMCwgMCwgcDhpbmYpOworCQlpZihrc3RyID09IGJ1ZikgT1BFTlNTTF9jbGVhbnNlKGJ1Ziwga2xlbik7CisJCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOGluZik7CisJCWlmKGlzZGVyKSByZXQgPSBpMmRfUEtDUzhfYmlvKGJwLCBwOCk7CisJCWVsc2UgcmV0ID0gUEVNX3dyaXRlX2Jpb19QS0NTOChicCwgcDgpOworCQlYNTA5X1NJR19mcmVlKHA4KTsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlpZihpc2RlcikgcmV0ID0gaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk9fYmlvKGJwLCBwOGluZik7CisJCWVsc2UgcmV0ID0gUEVNX3dyaXRlX2Jpb19QS0NTOF9QUklWX0tFWV9JTkZPKGJwLCBwOGluZik7CisJCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOGluZik7CisJCXJldHVybiByZXQ7CisJfQorfQorCitFVlBfUEtFWSAqZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8oQklPICpicCwgRVZQX1BLRVkgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mID0gTlVMTDsKKwlYNTA5X1NJRyAqcDggPSBOVUxMOworCWludCBrbGVuOworCUVWUF9QS0VZICpyZXQ7CisJY2hhciBwc2J1ZltQRU1fQlVGU0laRV07CisJcDggPSBkMmlfUEtDUzhfYmlvKGJwLCBOVUxMKTsKKwlpZighcDgpIHJldHVybiBOVUxMOworCWlmIChjYikga2xlbj1jYihwc2J1ZixQRU1fQlVGU0laRSwwLHUpOworCWVsc2Uga2xlbj1QRU1fZGVmX2NhbGxiYWNrKHBzYnVmLFBFTV9CVUZTSVpFLDAsdSk7CisJaWYgKGtsZW4gPD0gMCkgeworCQlQRU1lcnIoUEVNX0ZfRDJJX1BLQ1M4UFJJVkFURUtFWV9CSU8sIFBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJWDUwOV9TSUdfZnJlZShwOCk7CisJCXJldHVybiBOVUxMOwkKKwl9CisJcDhpbmYgPSBQS0NTOF9kZWNyeXB0KHA4LCBwc2J1Ziwga2xlbik7CisJWDUwOV9TSUdfZnJlZShwOCk7CisJaWYoIXA4aW5mKSByZXR1cm4gTlVMTDsKKwlyZXQgPSBFVlBfUEtDUzgyUEtFWShwOGluZik7CisJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwlpZighcmV0KSByZXR1cm4gTlVMTDsKKwlpZih4KSB7CisJCWlmKCp4KSBFVlBfUEtFWV9mcmVlKCp4KTsKKwkJKnggPSByZXQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJcmV0dXJuIGRvX3BrOHBrZXlfZnAoZnAsIHgsIDEsIC0xLCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKK30KKworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlfbmlkX2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqeCwgaW50IG5pZCwKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKK3sKKwlyZXR1cm4gZG9fcGs4cGtleV9mcChmcCwgeCwgMSwgbmlkLCBOVUxMLCBrc3RyLCBrbGVuLCBjYiwgdSk7Cit9CisKK2ludCBQRU1fd3JpdGVfUEtDUzhQcml2YXRlS2V5X25pZChGSUxFICpmcCwgRVZQX1BLRVkgKngsIGludCBuaWQsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCit7CisJcmV0dXJuIGRvX3BrOHBrZXlfZnAoZnAsIHgsIDAsIG5pZCwgTlVMTCwga3N0ciwga2xlbiwgY2IsIHUpOworfQorCitpbnQgUEVNX3dyaXRlX1BLQ1M4UHJpdmF0ZUtleShGSUxFICpmcCwgRVZQX1BLRVkgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKwkJCSAgICAgIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCXJldHVybiBkb19wazhwa2V5X2ZwKGZwLCB4LCAwLCAtMSwgZW5jLCBrc3RyLCBrbGVuLCBjYiwgdSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fcGs4cGtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKngsIGludCBpc2RlciwgaW50IG5pZCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCUJJTyAqYnA7CisJaW50IHJldDsKKwlpZighKGJwID0gQklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpKSkgeworCQlQRU1lcnIoUEVNX0ZfRE9fUEs4UEtFWV9GUCxFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oMCk7CisJfQorCXJldCA9IGRvX3BrOHBrZXkoYnAsIHgsIGlzZGVyLCBuaWQsIGVuYywga3N0ciwga2xlbiwgY2IsIHUpOworCUJJT19mcmVlKGJwKTsKKwlyZXR1cm4gcmV0OworfQorCitFVlBfUEtFWSAqZDJpX1BLQ1M4UHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQoreworCUJJTyAqYnA7CisJRVZQX1BLRVkgKnJldDsKKwlpZighKGJwID0gQklPX25ld19mcChmcCwgQklPX05PQ0xPU0UpKSkgeworCQlQRU1lcnIoUEVNX0ZfRDJJX1BLQ1M4UFJJVkFURUtFWV9GUCxFUlJfUl9CVUZfTElCKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKwl9CisJcmV0ID0gZDJpX1BLQ1M4UHJpdmF0ZUtleV9iaW8oYnAsIHgsIGNiLCB1KTsKKwlCSU9fZnJlZShicCk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmCisKK0lNUExFTUVOVF9QRU1fcncoUEtDUzgsIFg1MDlfU0lHLCBQRU1fU1RSSU5HX1BLQ1M4LCBYNTA5X1NJRykKK0lNUExFTUVOVF9QRU1fcncoUEtDUzhfUFJJVl9LRVlfSU5GTywgUEtDUzhfUFJJVl9LRVlfSU5GTywgUEVNX1NUUklOR19QS0NTOElORiwKKwkJCQkJCQkgUEtDUzhfUFJJVl9LRVlfSU5GTykKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX3BrZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX3BrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNmMjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fcGtleS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiBjcnlwdG8vcGVtL3BlbV9wa2V5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKyNpbmNsdWRlICJhc24xX2xvY2wuaCIKKworaW50IHBlbV9jaGVja19zdWZmaXgoY29uc3QgY2hhciAqcGVtX3N0ciwgY29uc3QgY2hhciAqc3VmZml4KTsKKworRVZQX1BLRVkgKlBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KEJJTyAqYnAsIEVWUF9QS0VZICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisJY2hhciAqbm09TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwPU5VTEw7CisJdW5zaWduZWQgY2hhciAqZGF0YT1OVUxMOworCWxvbmcgbGVuOworCWludCBzbGVuOworCUVWUF9QS0VZICpyZXQ9TlVMTDsKKworCWlmICghUEVNX2J5dGVzX3JlYWRfYmlvKCZkYXRhLCAmbGVuLCAmbm0sIFBFTV9TVFJJTkdfRVZQX1BLRVksIGJwLCBjYiwgdSkpCisJCXJldHVybiBOVUxMOworCXAgPSBkYXRhOworCisJaWYgKHN0cmNtcChubSxQRU1fU1RSSU5HX1BLQ1M4SU5GKSA9PSAwKSB7CisJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mOworCQlwOGluZj1kMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyhOVUxMLCAmcCwgbGVuKTsKKwkJaWYoIXA4aW5mKSBnb3RvIHA4ZXJyOworCQlyZXQgPSBFVlBfUEtDUzgyUEtFWShwOGluZik7CisJCWlmKHgpIHsKKwkJCWlmKCp4KSBFVlBfUEtFWV9mcmVlKChFVlBfUEtFWSAqKSp4KTsKKwkJCSp4ID0gcmV0OworCQl9CisJCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOGluZik7CisJfSBlbHNlIGlmIChzdHJjbXAobm0sUEVNX1NUUklOR19QS0NTOCkgPT0gMCkgeworCQlQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZjsKKwkJWDUwOV9TSUcgKnA4OworCQlpbnQga2xlbjsKKwkJY2hhciBwc2J1ZltQRU1fQlVGU0laRV07CisJCXA4ID0gZDJpX1g1MDlfU0lHKE5VTEwsICZwLCBsZW4pOworCQlpZighcDgpIGdvdG8gcDhlcnI7CisJCWlmIChjYikga2xlbj1jYihwc2J1ZixQRU1fQlVGU0laRSwwLHUpOworCQllbHNlIGtsZW49UEVNX2RlZl9jYWxsYmFjayhwc2J1ZixQRU1fQlVGU0laRSwwLHUpOworCQlpZiAoa2xlbiA8PSAwKSB7CisJCQlQRU1lcnIoUEVNX0ZfUEVNX1JFQURfQklPX1BSSVZBVEVLRVksCisJCQkJCVBFTV9SX0JBRF9QQVNTV09SRF9SRUFEKTsKKwkJCVg1MDlfU0lHX2ZyZWUocDgpOworCQkJZ290byBlcnI7CisJCX0KKwkJcDhpbmYgPSBQS0NTOF9kZWNyeXB0KHA4LCBwc2J1Ziwga2xlbik7CisJCVg1MDlfU0lHX2ZyZWUocDgpOworCQlpZighcDhpbmYpIGdvdG8gcDhlcnI7CisJCXJldCA9IEVWUF9QS0NTODJQS0VZKHA4aW5mKTsKKwkJaWYoeCkgeworCQkJaWYoKngpIEVWUF9QS0VZX2ZyZWUoKEVWUF9QS0VZICopKngpOworCQkJKnggPSByZXQ7CisJCX0KKwkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4aW5mKTsKKwl9IGVsc2UgaWYgKChzbGVuID0gcGVtX2NoZWNrX3N1ZmZpeChubSwgIlBSSVZBVEUgS0VZIikpID4gMCkKKwkJeworCQljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisJCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kX3N0cihOVUxMLCBubSwgc2xlbik7CisJCWlmICghYW1ldGggfHwgIWFtZXRoLT5vbGRfcHJpdl9kZWNvZGUpCisJCQlnb3RvIHA4ZXJyOworCQlyZXQ9ZDJpX1ByaXZhdGVLZXkoYW1ldGgtPnBrZXlfaWQseCwmcCxsZW4pOworCQl9CitwOGVycjoKKwlpZiAocmV0ID09IE5VTEwpCisJCVBFTWVycihQRU1fRl9QRU1fUkVBRF9CSU9fUFJJVkFURUtFWSxFUlJfUl9BU04xX0xJQik7CitlcnI6CisJT1BFTlNTTF9mcmVlKG5tKTsKKwlPUEVOU1NMX2NsZWFuc2UoZGF0YSwgbGVuKTsKKwlPUEVOU1NMX2ZyZWUoZGF0YSk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgUEVNX3dyaXRlX2Jpb19Qcml2YXRlS2V5KEJJTyAqYnAsIEVWUF9QS0VZICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKwljaGFyIHBlbV9zdHJbODBdOworCWlmICgheC0+YW1ldGggfHwgeC0+YW1ldGgtPnByaXZfZW5jb2RlKQorCQlyZXR1cm4gUEVNX3dyaXRlX2Jpb19QS0NTOFByaXZhdGVLZXkoYnAsIHgsIGVuYywKKwkJCQkJCQkoY2hhciAqKWtzdHIsIGtsZW4sCisJCQkJCQkJY2IsIHUpOworCisJQklPX3NucHJpbnRmKHBlbV9zdHIsIDgwLCAiJXMgUFJJVkFURSBLRVkiLCB4LT5hbWV0aC0+cGVtX3N0cik7CisJcmV0dXJuIFBFTV9BU04xX3dyaXRlX2JpbygoaTJkX29mX3ZvaWQgKilpMmRfUHJpdmF0ZUtleSwKKwkJCQlwZW1fc3RyLGJwLHgsZW5jLGtzdHIsa2xlbixjYix1KTsKKwl9CisKK0VWUF9QS0VZICpQRU1fcmVhZF9iaW9fUGFyYW1ldGVycyhCSU8gKmJwLCBFVlBfUEtFWSAqKngpCisJeworCWNoYXIgKm5tPU5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcD1OVUxMOworCXVuc2lnbmVkIGNoYXIgKmRhdGE9TlVMTDsKKwlsb25nIGxlbjsKKwlpbnQgc2xlbjsKKwlFVlBfUEtFWSAqcmV0PU5VTEw7CisKKwlpZiAoIVBFTV9ieXRlc19yZWFkX2JpbygmZGF0YSwgJmxlbiwgJm5tLCBQRU1fU1RSSU5HX1BBUkFNRVRFUlMsCisJCQkJCQkJCWJwLCAwLCBOVUxMKSkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IGRhdGE7CisKKwlpZiAoKHNsZW4gPSBwZW1fY2hlY2tfc3VmZml4KG5tLCAiUEFSQU1FVEVSUyIpKSA+IDApCisJCXsKKwkJcmV0ID0gRVZQX1BLRVlfbmV3KCk7CisJCWlmICghcmV0KQorCQkJZ290byBlcnI7CisJCWlmICghRVZQX1BLRVlfc2V0X3R5cGVfc3RyKHJldCwgbm0sIHNsZW4pCisJCQl8fCAhcmV0LT5hbWV0aC0+cGFyYW1fZGVjb2RlCisJCQl8fCAhcmV0LT5hbWV0aC0+cGFyYW1fZGVjb2RlKHJldCwgJnAsIGxlbikpCisJCQl7CisJCQlFVlBfUEtFWV9mcmVlKHJldCk7CisJCQlyZXQgPSBOVUxMOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmKHgpCisJCQl7CisJCQlpZigqeCkgRVZQX1BLRVlfZnJlZSgoRVZQX1BLRVkgKikqeCk7CisJCQkqeCA9IHJldDsKKwkJCX0KKwkJfQorZXJyOgorCWlmIChyZXQgPT0gTlVMTCkKKwkJUEVNZXJyKFBFTV9GX1BFTV9SRUFEX0JJT19QQVJBTUVURVJTLEVSUl9SX0FTTjFfTElCKTsKKwlPUEVOU1NMX2ZyZWUobm0pOworCU9QRU5TU0xfZnJlZShkYXRhKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBQRU1fd3JpdGVfYmlvX1BhcmFtZXRlcnMoQklPICpicCwgRVZQX1BLRVkgKngpCisJeworCWNoYXIgcGVtX3N0cls4MF07CisJaWYgKCF4LT5hbWV0aCB8fCAheC0+YW1ldGgtPnBhcmFtX2VuY29kZSkKKwkJcmV0dXJuIDA7CisKKwlCSU9fc25wcmludGYocGVtX3N0ciwgODAsICIlcyBQQVJBTUVURVJTIiwgeC0+YW1ldGgtPnBlbV9zdHIpOworCXJldHVybiBQRU1fQVNOMV93cml0ZV9iaW8oCisJCShpMmRfb2Zfdm9pZCAqKXgtPmFtZXRoLT5wYXJhbV9lbmNvZGUsCisJCQkJcGVtX3N0cixicCx4LE5VTEwsTlVMTCwwLDAsTlVMTCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitFVlBfUEtFWSAqUEVNX3JlYWRfUHJpdmF0ZUtleShGSUxFICpmcCwgRVZQX1BLRVkgKip4LCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKyAgICAgICAgQklPICpiOworICAgICAgICBFVlBfUEtFWSAqcmV0OworCisgICAgICAgIGlmICgoYj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpID09IE5VTEwpCisJCXsKKwkJUEVNZXJyKFBFTV9GX1BFTV9SRUFEX1BSSVZBVEVLRVksRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworCQl9CisgICAgICAgIEJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisgICAgICAgIHJldD1QRU1fcmVhZF9iaW9fUHJpdmF0ZUtleShiLHgsY2IsdSk7CisgICAgICAgIEJJT19mcmVlKGIpOworICAgICAgICByZXR1cm4ocmV0KTsKKwl9CisKK2ludCBQRU1fd3JpdGVfUHJpdmF0ZUtleShGSUxFICpmcCwgRVZQX1BLRVkgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCisJeworICAgICAgICBCSU8gKmI7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKChiPUJJT19uZXdfZnAoZnAsIEJJT19OT0NMT1NFKSkgPT0gTlVMTCkKKwkJeworCQlQRU1lcnIoUEVNX0ZfUEVNX1dSSVRFX1BSSVZBVEVLRVksRVJSX1JfQlVGX0xJQik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJCX0KKyAgICAgICAgcmV0PVBFTV93cml0ZV9iaW9fUHJpdmF0ZUtleShiLCB4LCBlbmMsIGtzdHIsIGtsZW4sIGNiLCB1KTsKKyAgICAgICAgQklPX2ZyZWUoYik7CisgICAgICAgIHJldHVybiByZXQ7CisJfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX3NlYWwuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX3NlYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY5MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fc2VhbC5jCkBAIC0wLDAgKzEsMTg5IEBACisvKiBjcnlwdG8vcGVtL3BlbV9zZWFsLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4JLyogZm9yIE9QRU5TU0xfTk9fUlNBICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCitpbnQgUEVNX1NlYWxJbml0KFBFTV9FTkNPREVfU0VBTF9DVFggKmN0eCwgRVZQX0NJUEhFUiAqdHlwZSwgRVZQX01EICptZF90eXBlLAorCSAgICAgdW5zaWduZWQgY2hhciAqKmVrLCBpbnQgKmVrbCwgdW5zaWduZWQgY2hhciAqaXYsIEVWUF9QS0VZICoqcHViaywKKwkgICAgIGludCBucHViaykKKwl7CisJdW5zaWduZWQgY2hhciBrZXlbRVZQX01BWF9LRVlfTEVOR1RIXTsKKwlpbnQgcmV0PSAtMTsKKwlpbnQgaSxqLG1heD0wOworCWNoYXIgKnM9TlVMTDsKKworCWZvciAoaT0wOyBpPG5wdWJrOyBpKyspCisJCXsKKwkJaWYgKHB1YmtbaV0tPnR5cGUgIT0gRVZQX1BLRVlfUlNBKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX1BFTV9TRUFMSU5JVCxQRU1fUl9QVUJMSUNfS0VZX05PX1JTQSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaj1SU0Ffc2l6ZShwdWJrW2ldLT5wa2V5LnJzYSk7CisJCWlmIChqID4gbWF4KSBtYXg9ajsKKwkJfQorCXM9KGNoYXIgKilPUEVOU1NMX21hbGxvYyhtYXgqMik7CisJaWYgKHMgPT0gTlVMTCkKKwkJeworCQlQRU1lcnIoUEVNX0ZfUEVNX1NFQUxJTklULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCUVWUF9FbmNvZGVJbml0KCZjdHgtPmVuY29kZSk7CisKKwlFVlBfTURfQ1RYX2luaXQoJmN0eC0+bWQpOworCUVWUF9TaWduSW5pdCgmY3R4LT5tZCxtZF90eXBlKTsKKworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eC0+Y2lwaGVyKTsKKwlyZXQ9RVZQX1NlYWxJbml0KCZjdHgtPmNpcGhlcix0eXBlLGVrLGVrbCxpdixwdWJrLG5wdWJrKTsKKwlpZiAocmV0IDw9IDApIGdvdG8gZXJyOworCisJLyogYmFzZTY0IGVuY29kZSB0aGUga2V5cyAqLworCWZvciAoaT0wOyBpPG5wdWJrOyBpKyspCisJCXsKKwkJaj1FVlBfRW5jb2RlQmxvY2soKHVuc2lnbmVkIGNoYXIgKilzLGVrW2ldLAorCQkJUlNBX3NpemUocHVia1tpXS0+cGtleS5yc2EpKTsKKwkJZWtsW2ldPWo7CisJCW1lbWNweShla1tpXSxzLGorMSk7CisJCX0KKworCXJldD1ucHViazsKK2VycjoKKwlpZiAocyAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocyk7CisJT1BFTlNTTF9jbGVhbnNlKGtleSxFVlBfTUFYX0tFWV9MRU5HVEgpOworCXJldHVybihyZXQpOworCX0KKwordm9pZCBQRU1fU2VhbFVwZGF0ZShQRU1fRU5DT0RFX1NFQUxfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50ICpvdXRsLAorCSAgICAgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmwpCisJeworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2MDBdOworCWludCBpLGo7CisKKwkqb3V0bD0wOworCUVWUF9TaWduVXBkYXRlKCZjdHgtPm1kLGluLGlubCk7CisJZm9yICg7OykKKwkJeworCQlpZiAoaW5sIDw9IDApIGJyZWFrOworCQlpZiAoaW5sID4gMTIwMCkKKwkJCWk9MTIwMDsKKwkJZWxzZQorCQkJaT1pbmw7CisJCUVWUF9FbmNyeXB0VXBkYXRlKCZjdHgtPmNpcGhlcixidWZmZXIsJmosaW4saSk7CisJCUVWUF9FbmNvZGVVcGRhdGUoJmN0eC0+ZW5jb2RlLG91dCwmaixidWZmZXIsaik7CisJCSpvdXRsKz1qOworCQlvdXQrPWo7CisJCWluKz1pOworCQlpbmwtPWk7CisJCX0KKwl9CisKK2ludCBQRU1fU2VhbEZpbmFsKFBFTV9FTkNPREVfU0VBTF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBpbnQgKnNpZ2wsCisJICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCwgRVZQX1BLRVkgKnByaXYpCisJeworCXVuc2lnbmVkIGNoYXIgKnM9TlVMTDsKKwlpbnQgcmV0PTAsajsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChwcml2LT50eXBlICE9IEVWUF9QS0VZX1JTQSkKKwkJeworCQlQRU1lcnIoUEVNX0ZfUEVNX1NFQUxGSU5BTCxQRU1fUl9QVUJMSUNfS0VZX05PX1JTQSk7CisJCWdvdG8gZXJyOworCQl9CisJaT1SU0Ffc2l6ZShwcml2LT5wa2V5LnJzYSk7CisJaWYgKGkgPCAxMDApIGk9MTAwOworCXM9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhpKjIpOworCWlmIChzID09IE5VTEwpCisJCXsKKwkJUEVNZXJyKFBFTV9GX1BFTV9TRUFMRklOQUwsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJRVZQX0VuY3J5cHRGaW5hbF9leCgmY3R4LT5jaXBoZXIscywoaW50ICopJmkpOworCUVWUF9FbmNvZGVVcGRhdGUoJmN0eC0+ZW5jb2RlLG91dCwmaixzLGkpOworCSpvdXRsPWo7CisJb3V0Kz1qOworCUVWUF9FbmNvZGVGaW5hbCgmY3R4LT5lbmNvZGUsb3V0LCZqKTsKKwkqb3V0bCs9ajsKKworCWlmICghRVZQX1NpZ25GaW5hbCgmY3R4LT5tZCxzLCZpLHByaXYpKSBnb3RvIGVycjsKKwkqc2lnbD1FVlBfRW5jb2RlQmxvY2soc2lnLHMsaSk7CisKKwlyZXQ9MTsKK2VycjoKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eC0+bWQpOworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eC0+Y2lwaGVyKTsKKwlpZiAocyAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocyk7CisJcmV0dXJuKHJldCk7CisJfQorI2Vsc2UgLyogIU9QRU5TU0xfTk9fUlNBICovCisKKyMgaWYgUEVEQU5USUMKK3N0YXRpYyB2b2lkICpkdW1teT0mZHVtbXk7CisjIGVuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fc2lnbi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1fc2lnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYjk4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV9zaWduLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIGNyeXB0by9wZW0vcGVtX3NpZ24uYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKwordm9pZCBQRU1fU2lnbkluaXQoRVZQX01EX0NUWCAqY3R4LCBFVlBfTUQgKnR5cGUpCisJeworCUVWUF9EaWdlc3RJbml0X2V4KGN0eCwgdHlwZSwgTlVMTCk7CisJfQorCit2b2lkIFBFTV9TaWduVXBkYXRlKEVWUF9NRF9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkgICAgIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJRVZQX0RpZ2VzdFVwZGF0ZShjdHgsZGF0YSxjb3VudCk7CisJfQorCitpbnQgUEVNX1NpZ25GaW5hbChFVlBfTURfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZ3JldCwgdW5zaWduZWQgaW50ICpzaWdsZW4sCisJICAgICBFVlBfUEtFWSAqcGtleSkKKwl7CisJdW5zaWduZWQgY2hhciAqbTsKKwlpbnQgaSxyZXQ9MDsKKwl1bnNpZ25lZCBpbnQgbV9sZW47CisKKwltPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoRVZQX1BLRVlfc2l6ZShwa2V5KSsyKTsKKwlpZiAobSA9PSBOVUxMKQorCQl7CisJCVBFTWVycihQRU1fRl9QRU1fU0lHTkZJTkFMLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChFVlBfU2lnbkZpbmFsKGN0eCxtLCZtX2xlbixwa2V5KSA8PSAwKSBnb3RvIGVycjsKKworCWk9RVZQX0VuY29kZUJsb2NrKHNpZ3JldCxtLG1fbGVuKTsKKwkqc2lnbGVuPWk7CisJcmV0PTE7CitlcnI6CisJLyogY3R4IGhhcyBiZWVuIHplcm9lZCBieSBFVlBfU2lnbkZpbmFsKCkgKi8KKwlpZiAobSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUobSk7CisJcmV0dXJuKHJldCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV94NTA5LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BlbV94NTA5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzMTA1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX3g1MDkuYwpAQCAtMCwwICsxLDY4IEBACisvKiBwZW1feDUwOS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M3Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKworSU1QTEVNRU5UX1BFTV9ydyhYNTA5LCBYNTA5LCBQRU1fU1RSSU5HX1g1MDksIFg1MDkpCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX3hhdXguYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZW0vcGVtX3hhdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjhmNzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wZW1feGF1eC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIHBlbV94YXV4LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAxLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCitJTVBMRU1FTlRfUEVNX3J3KFg1MDlfQVVYLCBYNTA5LCBQRU1fU1RSSU5HX1g1MDlfVFJVU1RFRCwgWDUwOV9BVVgpCitJTVBMRU1FTlRfUEVNX3J3KFg1MDlfQ0VSVF9QQUlSLCBYNTA5X0NFUlRfUEFJUiwgUEVNX1NUUklOR19YNTA5X1BBSVIsIFg1MDlfQ0VSVF9QQUlSKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wa2NzNy5saXMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3BrY3M3LmxpcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTkwYzVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wa2NzNy5saXMKQEAgLTAsMCArMSwyMiBAQAorMjEgICAgIDA6ZD0wIGhsPTIgbD0gIDAgY29uczogdW5pdjogU0VRVUVOQ0UgICAgICAgICAgCisgMDAgICAgIDI6ZD0wIGhsPTIgbD0gIDkgcHJpbTogdW5pdjogT0JKRUNUX0lERU5USUZJRVIgOnBrY3MtNy1zaWduZWREYXRhCisgMjEgICAgMTM6ZD0wIGhsPTIgbD0gIDAgY29uczogY29udDogMDAJCQkjIGV4cGxpY2l0IHRhZworICAyMSAgICAxNTpkPTAgaGw9MiBsPSAgMCBjb25zOiB1bml2OiBTRVFVRU5DRSAgICAgICAgICAKKyAgIDAwICAgIDE3OmQ9MCBobD0yIGw9ICAxIHByaW06IHVuaXY6IElOVEVHRVIgICAgICAgICAgIyB2ZXJzaW9uIAorICAgMjAgICAgMjA6ZD0wIGhsPTIgbD0gIDAgY29uczogdW5pdjogU0VUICAgICAgICAgICAgICAgCisgICAyMSAgICAyMjpkPTAgaGw9MiBsPSAgMCBjb25zOiB1bml2OiBTRVFVRU5DRSAgICAgICAgICAKKyAgICAwMCAgICAyNDpkPTAgaGw9MiBsPSAgOSBwcmltOiB1bml2OiBPQkpFQ1RfSURFTlRJRklFUiA6cGtjcy03LWRhdGEKKyAgICAwMCAgICAzNTpkPTAgaGw9MiBsPSAgMCBwcmltOiB1bml2OiBFT0MgICAgICAgICAgICAgICAKKyAgIDIxICAgIDM3OmQ9MCBobD0yIGw9ICAwIGNvbnM6IGNvbnQ6IDAwICAgICAgICAgICAgICAgIyBjZXJ0IHRhZworICAgIDIwICAgIDM5OmQ9MCBobD00IGw9NTQ1IGNvbnM6IHVuaXY6IFNFUVVFTkNFICAgICAgICAgIAorICAgIDIwICAgNTg4OmQ9MCBobD00IGw9NTI0IGNvbnM6IHVuaXY6IFNFUVVFTkNFICAgICAgICAgIAorICAgIDAwICAxMTE2OmQ9MCBobD0yIGw9ICAwIHByaW06IHVuaXY6IEVPQyAgICAgICAgICAgICAgIAorICAgMjEgIDExMTg6ZD0wIGhsPTIgbD0gIDAgY29uczogY29udDogMDEJCSMgY3JsIHRhZworICAgIDIwICAxMTIwOmQ9MCBobD00IGw9NjUzIGNvbnM6IHVuaXY6IFNFUVVFTkNFICAgICAgICAgIAorICAgIDIwICAxNzc3OmQ9MCBobD00IGw9Mjg1IGNvbnM6IHVuaXY6IFNFUVVFTkNFICAgICAgICAgIAorICAgIDAwICAyMDY2OmQ9MCBobD0yIGw9ICAwIHByaW06IHVuaXY6IEVPQyAgICAgICAgICAgICAgIAorICAgMjEgIDIwNjg6ZD0wIGhsPTIgbD0gIDAgY29uczogdW5pdjogU0VUICAgICAgICAgICAgICAjIHNpZ25lcnMgCisgICAgMDAgIDIwNzA6ZD0wIGhsPTIgbD0gIDAgcHJpbTogdW5pdjogRU9DICAgICAgICAgICAgICAgCisgIDAwICAyMDcyOmQ9MCBobD0yIGw9ICAwIHByaW06IHVuaXY6IEVPQyAgICAgICAgICAgICAgIAorIDAwICAyMDc0OmQ9MCBobD0yIGw9ICAwIHByaW06IHVuaXY6IEVPQyAgICAgICAgICAgICAgIAorMDAgIDIwNzY6ZD0wIGhsPTIgbD0gIDAgcHJpbTogdW5pdjogRU9DICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGVtL3B2a2ZtdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wdmtmbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTk4YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BlbS9wdmtmbXQuYwpAQCAtMCwwICsxLDk0MiBAQAorLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDUuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogU3VwcG9ydCBmb3IgUFZLIGZvcm1hdCBrZXlzIGFuZCByZWxhdGVkIHN0cnVjdHVyZXMgKHN1Y2ggYSBQVUJMSUNLRVlCTE9CCisgKiBhbmQgUFJJVkFURUtFWUJMT0IpLgorICovCisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fUlNBKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0RTQSkKKyNpbmNsdWRlIDxvcGVuc3NsL2RzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisKKy8qIFV0aWxpdHkgZnVuY3Rpb246IHJlYWQgYSBEV09SRCAoNCBieXRlIHVuc2lnbmVkIGludGVnZXIpIGluIGxpdHRsZSBlbmRpYW4KKyAqIGZvcm1hdAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9sZWR3b3JkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbikKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICppbjsKKwl1bnNpZ25lZCBpbnQgcmV0OworCXJldCA9ICpwKys7CisJcmV0IHw9ICgqcCsrIDw8IDgpOworCXJldCB8PSAoKnArKyA8PCAxNik7CisJcmV0IHw9ICgqcCsrIDw8IDI0KTsKKwkqaW4gPSBwOworCXJldHVybiByZXQ7CisJfQorCisvKiBSZWFkIGEgQklHTlVNIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LiBUaGUgZG9jcyBzYXkgdGhhdCB0aGlzIHNob3VsZCB0YWtlIHVwIAorICogYml0bGVuLzggYnl0ZXMuCisgKi8KKworc3RhdGljIGludCByZWFkX2xlYm4oY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCB1bnNpZ25lZCBpbnQgbmJ5dGUsIEJJR05VTSAqKnIpCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgY2hhciAqdG1wYnVmLCAqcTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlwID0gKmluICsgbmJ5dGUgLSAxOworCXRtcGJ1ZiA9IE9QRU5TU0xfbWFsbG9jKG5ieXRlKTsKKwlpZiAoIXRtcGJ1ZikKKwkJcmV0dXJuIDA7CisJcSA9IHRtcGJ1ZjsKKwlmb3IgKGkgPSAwOyBpIDwgbmJ5dGU7IGkrKykKKwkJKnErKyA9ICpwLS07CisJKnIgPSBCTl9iaW4yYm4odG1wYnVmLCBuYnl0ZSwgTlVMTCk7CisJT1BFTlNTTF9mcmVlKHRtcGJ1Zik7CisJaWYgKCpyKQorCQl7CisJCSppbiArPSBuYnl0ZTsKKwkJcmV0dXJuIDE7CisJCX0KKwllbHNlCisJCXJldHVybiAwOworCX0KKworCisvKiBDb252ZXJ0IHByaXZhdGUga2V5IGJsb2IgdG8gRVZQX1BLRVk6IFJTQSBhbmQgRFNBIGtleXMgc3VwcG9ydGVkICovCisKKyNkZWZpbmUgTVNfUFVCTElDS0VZQkxPQgkweDYKKyNkZWZpbmUgTVNfUFJJVkFURUtFWUJMT0IJMHg3CisjZGVmaW5lIE1TX1JTQTFNQUdJQwkJMHgzMTQxNTM1MkwKKyNkZWZpbmUgTVNfUlNBMk1BR0lDCQkweDMyNDE1MzUyTAorI2RlZmluZSBNU19EU1MxTUFHSUMJCTB4MzE1MzUzNDRMCisjZGVmaW5lIE1TX0RTUzJNQUdJQwkJMHgzMjUzNTM0NEwKKworI2RlZmluZSBNU19LRVlBTEdfUlNBX0tFWVgJMHhhNDAwCisjZGVmaW5lIE1TX0tFWUFMR19EU1NfU0lHTgkweDIyMDAKKworI2RlZmluZSBNU19LRVlUWVBFX0tFWVgJCTB4MQorI2RlZmluZSBNU19LRVlUWVBFX1NJR04JCTB4MgorCisvKiBUaGUgUFZLIGZpbGUgbWFnaWMgbnVtYmVyOiBzZWVtcyB0byBzcGVsbCBvdXQgImJvYnNmaWxlIiwgd2hvIGlzIEJvYj8gKi8KKyNkZWZpbmUgTVNfUFZLTUFHSUMJCTB4YjBiNWYxMWVMCisvKiBTYWx0IGxlbmd0aCBmb3IgUFZLIGZpbGVzICovCisjZGVmaW5lIFBWS19TQUxUTEVOCQkweDEwCisKK3N0YXRpYyBFVlBfUEtFWSAqYjJpX3JzYShjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkJCQl1bnNpZ25lZCBpbnQgYml0bGVuLCBpbnQgaXNwdWIpOworc3RhdGljIEVWUF9QS0VZICpiMmlfZHNzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQkJCXVuc2lnbmVkIGludCBiaXRsZW4sIGludCBpc3B1Yik7CisKK3N0YXRpYyBpbnQgZG9fYmxvYl9oZWFkZXIoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorCQkJCXVuc2lnbmVkIGludCAqcG1hZ2ljLCB1bnNpZ25lZCBpbnQgKnBiaXRsZW4sCisJCQkJaW50ICpwaXNkc3MsIGludCAqcGlzcHViKQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKmluOworCWlmIChsZW5ndGggPCAxNikKKwkJcmV0dXJuIDA7CisJLyogYlR5cGUgKi8KKwlpZiAoKnAgPT0gTVNfUFVCTElDS0VZQkxPQikKKwkJeworCQlpZiAoKnBpc3B1YiA9PSAwKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX0RPX0JMT0JfSEVBREVSLAorCQkJCQlQRU1fUl9FWFBFQ1RJTkdfUFJJVkFURV9LRVlfQkxPQik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJKnBpc3B1YiA9IDE7CisJCX0KKwllbHNlIGlmICgqcCA9PSBNU19QUklWQVRFS0VZQkxPQikKKwkJeworCQlpZiAoKnBpc3B1YiA9PSAxKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX0RPX0JMT0JfSEVBREVSLAorCQkJCQlQRU1fUl9FWFBFQ1RJTkdfUFVCTElDX0tFWV9CTE9CKTsKKwkJCXJldHVybiAwOworCQkJfQorCQkqcGlzcHViID0gMDsKKwkJfQorCWVsc2UKKwkJcmV0dXJuIDA7CisJcCsrOworCS8qIFZlcnNpb24gKi8KKwlpZiAoKnArKyAhPSAweDIpCisJCXsKKwkJUEVNZXJyKFBFTV9GX0RPX0JMT0JfSEVBREVSLCBQRU1fUl9CQURfVkVSU0lPTl9OVU1CRVIpOworCQlyZXR1cm4gMDsKKwkJfQorCS8qIElnbm9yZSByZXNlcnZlZCwgYWlLZXlBbGcgKi8KKwlwKz0gNjsKKwkqcG1hZ2ljID0gcmVhZF9sZWR3b3JkKCZwKTsKKwkqcGJpdGxlbiA9IHJlYWRfbGVkd29yZCgmcCk7CisJKnBpc2RzcyA9IDA7CisJc3dpdGNoICgqcG1hZ2ljKQorCQl7CisKKwkJY2FzZSBNU19EU1MxTUFHSUM6CisJCSpwaXNkc3MgPSAxOworCQljYXNlIE1TX1JTQTFNQUdJQzoKKwkJaWYgKCpwaXNwdWIgPT0gMCkKKwkJCXsKKwkJCVBFTWVycihQRU1fRl9ET19CTE9CX0hFQURFUiwKKwkJCQkJUEVNX1JfRVhQRUNUSU5HX1BSSVZBVEVfS0VZX0JMT0IpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTVNfRFNTMk1BR0lDOgorCQkqcGlzZHNzID0gMTsKKwkJY2FzZSBNU19SU0EyTUFHSUM6CisJCWlmICgqcGlzcHViID09IDEpCisJCQl7CisJCQlQRU1lcnIoUEVNX0ZfRE9fQkxPQl9IRUFERVIsCisJCQkJCVBFTV9SX0VYUEVDVElOR19QVUJMSUNfS0VZX0JMT0IpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCVBFTWVycihQRU1fRl9ET19CTE9CX0hFQURFUiwgUEVNX1JfQkFEX01BR0lDX05VTUJFUik7CisJCXJldHVybiAtMTsKKwkJfQorCSppbiA9IHA7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJsb2JfbGVuZ3RoKHVuc2lnbmVkIGJpdGxlbiwgaW50IGlzZHNzLCBpbnQgaXNwdWIpCisJeworCXVuc2lnbmVkIGludCBuYnl0ZSwgaG5ieXRlOworCW5ieXRlID0gKGJpdGxlbiArIDcpID4+IDM7CisJaG5ieXRlID0gKGJpdGxlbiArIDE1KSA+PiA0OworCWlmIChpc2RzcykKKwkJeworCisJCS8qIEV4cGVjdGVkIGxlbmd0aDogMjAgZm9yIHEgKyAzIGNvbXBvbmVudHMgYml0bGVuIGVhY2ggKyAyNAorCQkgKiBmb3Igc2VlZCBzdHJ1Y3R1cmUuCisJCSAqLworCQlpZiAoaXNwdWIpCisJCQlyZXR1cm4gIDQ0ICsgMyAqIG5ieXRlOworCQkvKiBFeHBlY3RlZCBsZW5ndGg6IDIwIGZvciBxLCBwcml2LCAyIGJpdGxlbiBjb21wb25lbnRzICsgMjQKKwkJICogZm9yIHNlZWQgc3RydWN0dXJlLgorCQkgKi8KKwkJZWxzZQorCQkJcmV0dXJuIDY0ICsgMiAqIG5ieXRlOworCQl9CisJZWxzZQorCQl7CisJCS8qIEV4cGVjdGVkIGxlbmd0aDogNCBmb3IgJ2UnICsgJ24nICovCisJCWlmIChpc3B1YikKKwkJCXJldHVybiA0ICsgbmJ5dGU7CisJCWVsc2UKKwkJLyogRXhwZWN0ZWQgbGVuZ3RoOiA0IGZvciAnZScgYW5kIDcgb3RoZXIgY29tcG9uZW50cy4KKwkJICogMiBjb21wb25lbnRzIGFyZSBiaXRsZW4gc2l6ZSwgNSBhcmUgYml0bGVuLzIKKwkJICovCisJCQlyZXR1cm4gNCArIDIqbmJ5dGUgKyA1KmhuYnl0ZTsKKwkJfQorCisJfQorCitzdGF0aWMgRVZQX1BLRVkgKmRvX2IyaShjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkJCQkJCWludCBpc3B1YikKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICppbjsKKwl1bnNpZ25lZCBpbnQgYml0bGVuLCBtYWdpYzsKKwlpbnQgaXNkc3M7CisJaWYgKGRvX2Jsb2JfaGVhZGVyKCZwLCBsZW5ndGgsICZtYWdpYywgJmJpdGxlbiwgJmlzZHNzLCAmaXNwdWIpIDw9IDApCisJCXsKKwkJUEVNZXJyKFBFTV9GX0RPX0IySSwgUEVNX1JfS0VZQkxPQl9IRUFERVJfUEFSU0VfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWxlbmd0aCAtPSAxNjsKKwlpZiAobGVuZ3RoIDwgYmxvYl9sZW5ndGgoYml0bGVuLCBpc2RzcywgaXNwdWIpKQorCQl7CisJCVBFTWVycihQRU1fRl9ET19CMkksIFBFTV9SX0tFWUJMT0JfVE9PX1NIT1JUKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZiAoaXNkc3MpCisJCXJldHVybiBiMmlfZHNzKCZwLCBsZW5ndGgsIGJpdGxlbiwgaXNwdWIpOworCWVsc2UKKwkJcmV0dXJuIGIyaV9yc2EoJnAsIGxlbmd0aCwgYml0bGVuLCBpc3B1Yik7CisJfQorCitzdGF0aWMgRVZQX1BLRVkgKmRvX2IyaV9iaW8oQklPICppbiwgaW50IGlzcHViKQorCXsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgaGRyX2J1ZlsxNl0sICpidWYgPSBOVUxMOworCXVuc2lnbmVkIGludCBiaXRsZW4sIG1hZ2ljLCBsZW5ndGg7CisJaW50IGlzZHNzOworCUVWUF9QS0VZICpyZXQgPSBOVUxMOworCWlmIChCSU9fcmVhZChpbiwgaGRyX2J1ZiwgMTYpICE9IDE2KQorCQl7CisJCVBFTWVycihQRU1fRl9ET19CMklfQklPLCBQRU1fUl9LRVlCTE9CX1RPT19TSE9SVCk7CisJCXJldHVybiBOVUxMOworCQl9CisJcCA9IGhkcl9idWY7CisJaWYgKGRvX2Jsb2JfaGVhZGVyKCZwLCAxNiwgJm1hZ2ljLCAmYml0bGVuLCAmaXNkc3MsICZpc3B1YikgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW5ndGggPSBibG9iX2xlbmd0aChiaXRsZW4sIGlzZHNzLCBpc3B1Yik7CisJYnVmID0gT1BFTlNTTF9tYWxsb2MobGVuZ3RoKTsKKwlpZiAoIWJ1ZikKKwkJeworCQlQRU1lcnIoUEVNX0ZfRE9fQjJJX0JJTywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCXAgPSBidWY7CisJaWYgKEJJT19yZWFkKGluLCBidWYsIGxlbmd0aCkgIT0gKGludClsZW5ndGgpCisJCXsKKwkJUEVNZXJyKFBFTV9GX0RPX0IySV9CSU8sIFBFTV9SX0tFWUJMT0JfVE9PX1NIT1JUKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChpc2RzcykKKwkJcmV0ID0gYjJpX2RzcygmcCwgbGVuZ3RoLCBiaXRsZW4sIGlzcHViKTsKKwllbHNlCisJCXJldCA9IGIyaV9yc2EoJnAsIGxlbmd0aCwgYml0bGVuLCBpc3B1Yik7CisKKwllcnI6CisJaWYgKGJ1ZikKKwkJT1BFTlNTTF9mcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBFVlBfUEtFWSAqYjJpX2Rzcyhjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkJCQl1bnNpZ25lZCBpbnQgYml0bGVuLCBpbnQgaXNwdWIpCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSAqaW47CisJRVZQX1BLRVkgKnJldCA9IE5VTEw7CisJRFNBICpkc2EgPSBOVUxMOworCUJOX0NUWCAqY3R4ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbmJ5dGU7CisJbmJ5dGUgPSAoYml0bGVuICsgNykgPj4gMzsKKworCWRzYSA9IERTQV9uZXcoKTsKKwlyZXQgPSBFVlBfUEtFWV9uZXcoKTsKKwlpZiAoIWRzYSB8fCAhcmV0KQorCQlnb3RvIG1lbWVycjsKKwlpZiAoIXJlYWRfbGVibigmcCwgbmJ5dGUsICZkc2EtPnApKQorCQlnb3RvIG1lbWVycjsKKwlpZiAoIXJlYWRfbGVibigmcCwgMjAsICZkc2EtPnEpKQorCQlnb3RvIG1lbWVycjsKKwlpZiAoIXJlYWRfbGVibigmcCwgbmJ5dGUsICZkc2EtPmcpKQorCQlnb3RvIG1lbWVycjsKKwlpZiAoaXNwdWIpCisJCXsKKwkJaWYgKCFyZWFkX2xlYm4oJnAsIG5ieXRlLCAmZHNhLT5wdWJfa2V5KSkKKwkJCWdvdG8gbWVtZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghcmVhZF9sZWJuKCZwLCAyMCwgJmRzYS0+cHJpdl9rZXkpKQorCQkJZ290byBtZW1lcnI7CisJCS8qIENhbGN1bGF0ZSBwdWJsaWMga2V5ICovCisJCWlmICghKGRzYS0+cHViX2tleSA9IEJOX25ldygpKSkKKwkJCWdvdG8gbWVtZXJyOworCQlpZiAoIShjdHggPSBCTl9DVFhfbmV3KCkpKQorCQkJZ290byBtZW1lcnI7CisJCQkKKwkJaWYgKCFCTl9tb2RfZXhwKGRzYS0+cHViX2tleSwgZHNhLT5nLAorCQkJCQkJIGRzYS0+cHJpdl9rZXksIGRzYS0+cCwgY3R4KSkKKwkJCQorCQkJZ290byBtZW1lcnI7CisJCUJOX0NUWF9mcmVlKGN0eCk7CisJCX0KKworCUVWUF9QS0VZX3NldDFfRFNBKHJldCwgZHNhKTsKKwlEU0FfZnJlZShkc2EpOworCSppbiA9IHA7CisJcmV0dXJuIHJldDsKKworCW1lbWVycjoKKwlQRU1lcnIoUEVNX0ZfQjJJX0RTUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCWlmIChkc2EpCisJCURTQV9mcmVlKGRzYSk7CisJaWYgKHJldCkKKwkJRVZQX1BLRVlfZnJlZShyZXQpOworCWlmIChjdHgpCisJCUJOX0NUWF9mcmVlKGN0eCk7CisJcmV0dXJuIE5VTEw7CisJfQorCitzdGF0aWMgRVZQX1BLRVkgKmIyaV9yc2EoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorCQkJCQkJdW5zaWduZWQgaW50IGJpdGxlbiwgaW50IGlzcHViKQorCQkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICppbjsKKwlFVlBfUEtFWSAqcmV0ID0gTlVMTDsKKwlSU0EgKnJzYSA9IE5VTEw7CisJdW5zaWduZWQgaW50IG5ieXRlLCBobmJ5dGU7CisJbmJ5dGUgPSAoYml0bGVuICsgNykgPj4gMzsKKwlobmJ5dGUgPSAoYml0bGVuICsgMTUpID4+IDQ7CisJcnNhID0gUlNBX25ldygpOworCXJldCA9IEVWUF9QS0VZX25ldygpOworCWlmICghcnNhIHx8ICFyZXQpCisJCWdvdG8gbWVtZXJyOworCXJzYS0+ZSA9IEJOX25ldygpOworCWlmICghcnNhLT5lKQorCQlnb3RvIG1lbWVycjsKKwlpZiAoIUJOX3NldF93b3JkKHJzYS0+ZSwgcmVhZF9sZWR3b3JkKCZwKSkpCisJCWdvdG8gbWVtZXJyOworCWlmICghcmVhZF9sZWJuKCZwLCBuYnl0ZSwgJnJzYS0+bikpCisJCWdvdG8gbWVtZXJyOworCWlmICghaXNwdWIpCisJCXsKKwkJaWYgKCFyZWFkX2xlYm4oJnAsIGhuYnl0ZSwgJnJzYS0+cCkpCisJCQlnb3RvIG1lbWVycjsKKwkJaWYgKCFyZWFkX2xlYm4oJnAsIGhuYnl0ZSwgJnJzYS0+cSkpCisJCQlnb3RvIG1lbWVycjsKKwkJaWYgKCFyZWFkX2xlYm4oJnAsIGhuYnl0ZSwgJnJzYS0+ZG1wMSkpCisJCQlnb3RvIG1lbWVycjsKKwkJaWYgKCFyZWFkX2xlYm4oJnAsIGhuYnl0ZSwgJnJzYS0+ZG1xMSkpCisJCQlnb3RvIG1lbWVycjsKKwkJaWYgKCFyZWFkX2xlYm4oJnAsIGhuYnl0ZSwgJnJzYS0+aXFtcCkpCisJCQlnb3RvIG1lbWVycjsKKwkJaWYgKCFyZWFkX2xlYm4oJnAsIG5ieXRlLCAmcnNhLT5kKSkKKwkJCWdvdG8gbWVtZXJyOworCQl9CisKKwlFVlBfUEtFWV9zZXQxX1JTQShyZXQsIHJzYSk7CisJUlNBX2ZyZWUocnNhKTsKKwkqaW4gPSBwOworCXJldHVybiByZXQ7CisJbWVtZXJyOgorCVBFTWVycihQRU1fRl9CMklfUlNBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJaWYgKHJzYSkKKwkJUlNBX2ZyZWUocnNhKTsKKwlpZiAocmV0KQorCQlFVlBfUEtFWV9mcmVlKHJldCk7CisJcmV0dXJuIE5VTEw7CisJfQorCitFVlBfUEtFWSAqYjJpX1ByaXZhdGVLZXkoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbmd0aCkKKwl7CisJcmV0dXJuIGRvX2IyaShpbiwgbGVuZ3RoLCAwKTsKKwl9CisKK0VWUF9QS0VZICpiMmlfUHVibGljS2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW5ndGgpCisJeworCXJldHVybiBkb19iMmkoaW4sIGxlbmd0aCwgMSk7CisJfQorCisKK0VWUF9QS0VZICpiMmlfUHJpdmF0ZUtleV9iaW8oQklPICppbikKKwl7CisJcmV0dXJuIGRvX2IyaV9iaW8oaW4sIDApOworCX0KKworRVZQX1BLRVkgKmIyaV9QdWJsaWNLZXlfYmlvKEJJTyAqaW4pCisJeworCXJldHVybiBkb19iMmlfYmlvKGluLCAxKTsKKwl9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2xlZHdvcmQodW5zaWduZWQgY2hhciAqKm91dCwgdW5zaWduZWQgaW50IGR3KQorCXsKKwl1bnNpZ25lZCBjaGFyICpwID0gKm91dDsKKwkqcCsrID0gZHcgJiAweGZmOworCSpwKysgPSAoZHc+PjgpICYgMHhmZjsKKwkqcCsrID0gKGR3Pj4xNikgJiAweGZmOworCSpwKysgPSAoZHc+PjI0KSAmIDB4ZmY7CisJKm91dCA9IHA7CisJfQorCitzdGF0aWMgdm9pZCB3cml0ZV9sZWJuKHVuc2lnbmVkIGNoYXIgKipvdXQsIGNvbnN0IEJJR05VTSAqYm4sIGludCBsZW4pCisJeworCWludCBuYiwgaTsKKwl1bnNpZ25lZCBjaGFyICpwID0gKm91dCwgKnEsIGM7CisJbmIgPSBCTl9udW1fYnl0ZXMoYm4pOworCUJOX2JuMmJpbihibiwgcCk7CisJcSA9IHAgKyBuYiAtIDE7CisJLyogSW4gcGxhY2UgYnl0ZSBvcmRlciByZXZlcnNhbCAqLworCWZvciAoaSA9IDA7IGkgPCBuYi8yOyBpKyspCisJCXsKKwkJYyA9ICpwOworCQkqcCsrID0gKnE7CisJCSpxLS0gPSBjOworCQl9CisJKm91dCArPSBuYjsKKwkvKiBQYWQgd2l0aCB6ZXJvZXMgaWYgd2UgaGF2ZSB0byAqLworCWlmIChsZW4gPiAwKQorCQl7CisJCWxlbiAtPSBuYjsKKwkJaWYgKGxlbiA+IDApCisJCQl7CisJCQltZW1zZXQoKm91dCwgMCwgbGVuKTsKKwkJCSpvdXQgKz0gbGVuOworCQkJfQorCQl9CisJfQorCisKK3N0YXRpYyBpbnQgY2hlY2tfYml0bGVuX3JzYShSU0EgKnJzYSwgaW50IGlzcHViLCB1bnNpZ25lZCBpbnQgKm1hZ2ljKTsKK3N0YXRpYyBpbnQgY2hlY2tfYml0bGVuX2RzYShEU0EgKmRzYSwgaW50IGlzcHViLCB1bnNpZ25lZCBpbnQgKm1hZ2ljKTsKKworc3RhdGljIHZvaWQgd3JpdGVfcnNhKHVuc2lnbmVkIGNoYXIgKipvdXQsIFJTQSAqcnNhLCBpbnQgaXNwdWIpOworc3RhdGljIHZvaWQgd3JpdGVfZHNhKHVuc2lnbmVkIGNoYXIgKipvdXQsIERTQSAqZHNhLCBpbnQgaXNwdWIpOworCQorc3RhdGljIGludCBkb19pMmIodW5zaWduZWQgY2hhciAqKm91dCwgRVZQX1BLRVkgKnBrLCBpbnQgaXNwdWIpCisJeworCXVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgaW50IGJpdGxlbiwgbWFnaWMgPSAwLCBrZXlhbGc7CisJaW50IG91dGxlbiwgbm9pbmMgPSAwOworCWlmIChway0+dHlwZSA9PSBFVlBfUEtFWV9EU0EpCisJCXsKKwkJYml0bGVuID0gY2hlY2tfYml0bGVuX2RzYShway0+cGtleS5kc2EsIGlzcHViLCAmbWFnaWMpOworCQlrZXlhbGcgPSBNU19LRVlBTEdfRFNTX1NJR047CisJCX0KKwllbHNlIGlmIChway0+dHlwZSA9PSBFVlBfUEtFWV9SU0EpCisJCXsKKwkJYml0bGVuID0gY2hlY2tfYml0bGVuX3JzYShway0+cGtleS5yc2EsIGlzcHViLCAmbWFnaWMpOworCQlrZXlhbGcgPSBNU19LRVlBTEdfUlNBX0tFWVg7CisJCX0KKwllbHNlCisJCXJldHVybiAtMTsKKwlpZiAoYml0bGVuID09IDApCisJCXJldHVybiAtMTsKKwlvdXRsZW4gPSAxNiArIGJsb2JfbGVuZ3RoKGJpdGxlbiwKKwkJCWtleWFsZyA9PSBNU19LRVlBTEdfRFNTX1NJR04gPyAxIDogMCwgaXNwdWIpOworCWlmIChvdXQgPT0gTlVMTCkKKwkJcmV0dXJuIG91dGxlbjsKKwlpZiAoKm91dCkKKwkJcCA9ICpvdXQ7CisJZWxzZQorCQl7CisJCXAgPSBPUEVOU1NMX21hbGxvYyhvdXRsZW4pOworCQlpZiAoIXApCisJCQlyZXR1cm4gLTE7CisJCSpvdXQgPSBwOworCQlub2luYyA9IDE7CisJCX0KKwlpZiAoaXNwdWIpCisJCSpwKysgPSBNU19QVUJMSUNLRVlCTE9COworCWVsc2UKKwkJKnArKyA9IE1TX1BSSVZBVEVLRVlCTE9COworCSpwKysgPSAweDI7CisJKnArKyA9IDA7CisJKnArKyA9IDA7CisJd3JpdGVfbGVkd29yZCgmcCwga2V5YWxnKTsKKwl3cml0ZV9sZWR3b3JkKCZwLCBtYWdpYyk7CisJd3JpdGVfbGVkd29yZCgmcCwgYml0bGVuKTsKKwlpZiAoa2V5YWxnID09IE1TX0tFWUFMR19EU1NfU0lHTikKKwkJd3JpdGVfZHNhKCZwLCBway0+cGtleS5kc2EsIGlzcHViKTsKKwllbHNlCisJCXdyaXRlX3JzYSgmcCwgcGstPnBrZXkucnNhLCBpc3B1Yik7CisJaWYgKCFub2luYykKKwkJKm91dCArPSBvdXRsZW47CisJcmV0dXJuIG91dGxlbjsKKwl9CisKK3N0YXRpYyBpbnQgZG9faTJiX2JpbyhCSU8gKm91dCwgRVZQX1BLRVkgKnBrLCBpbnQgaXNwdWIpCisJeworCXVuc2lnbmVkIGNoYXIgKnRtcCA9IE5VTEw7CisJaW50IG91dGxlbiwgd3JsZW47CisJb3V0bGVuID0gZG9faTJiKCZ0bXAsIHBrLCBpc3B1Yik7CisJaWYgKG91dGxlbiA8IDApCisJCXJldHVybiAtMTsKKwl3cmxlbiA9IEJJT193cml0ZShvdXQsIHRtcCwgb3V0bGVuKTsKKwlPUEVOU1NMX2ZyZWUodG1wKTsKKwlpZiAod3JsZW4gPT0gb3V0bGVuKQorCQlyZXR1cm4gb3V0bGVuOworCXJldHVybiAtMTsKKwl9CisKK3N0YXRpYyBpbnQgY2hlY2tfYml0bGVuX2RzYShEU0EgKmRzYSwgaW50IGlzcHViLCB1bnNpZ25lZCBpbnQgKnBtYWdpYykKKwl7CisJaW50IGJpdGxlbjsKKwliaXRsZW4gPSBCTl9udW1fYml0cyhkc2EtPnApOworCWlmICgoYml0bGVuICYgNykgfHwgKEJOX251bV9iaXRzKGRzYS0+cSkgIT0gMTYwKQorCQl8fCAoQk5fbnVtX2JpdHMoZHNhLT5nKSA+IGJpdGxlbikpCisJCWdvdG8gYmFka2V5OworCWlmIChpc3B1YikKKwkJeworCQlpZiAoQk5fbnVtX2JpdHMoZHNhLT5wdWJfa2V5KSA+IGJpdGxlbikKKwkJCWdvdG8gYmFka2V5OworCQkqcG1hZ2ljID0gTVNfRFNTMU1BR0lDOworCQl9CisJZWxzZQorCQl7CisJCWlmIChCTl9udW1fYml0cyhkc2EtPnByaXZfa2V5KSA+IDE2MCkKKwkJCWdvdG8gYmFka2V5OworCQkqcG1hZ2ljID0gTVNfRFNTMk1BR0lDOworCQl9CisJCisJcmV0dXJuIGJpdGxlbjsKKwliYWRrZXk6CisJUEVNZXJyKFBFTV9GX0NIRUNLX0JJVExFTl9EU0EsIFBFTV9SX1VOU1VQUE9SVEVEX0tFWV9DT01QT05FTlRTKTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgY2hlY2tfYml0bGVuX3JzYShSU0EgKnJzYSwgaW50IGlzcHViLCB1bnNpZ25lZCBpbnQgKnBtYWdpYykKKwl7CisJaW50IG5ieXRlLCBobmJ5dGUsIGJpdGxlbjsKKwlpZiAoQk5fbnVtX2JpdHMocnNhLT5lKSA+IDMyKQorCQlnb3RvIGJhZGtleTsKKwliaXRsZW4gPSBCTl9udW1fYml0cyhyc2EtPm4pOworCW5ieXRlID0gQk5fbnVtX2J5dGVzKHJzYS0+bik7CisJaG5ieXRlID0gKEJOX251bV9iaXRzKHJzYS0+bikgKyAxNSkgPj4gNDsKKwlpZiAoaXNwdWIpCisJCXsKKwkJKnBtYWdpYyA9IE1TX1JTQTFNQUdJQzsKKwkJcmV0dXJuIGJpdGxlbjsKKwkJfQorCWVsc2UKKwl7CisJCSpwbWFnaWMgPSBNU19SU0EyTUFHSUM7CisJCS8qIEZvciBwcml2YXRlIGtleSBlYWNoIGNvbXBvbmVudCBtdXN0IGZpdCB3aXRoaW4gbmJ5dGUgb3IKKwkJICogaG5ieXRlLgorCQkgKi8KKwkJaWYgKEJOX251bV9ieXRlcyhyc2EtPmQpID4gbmJ5dGUpCisJCQlnb3RvIGJhZGtleTsKKwkJaWYgKChCTl9udW1fYnl0ZXMocnNhLT5pcW1wKSA+IGhuYnl0ZSkKKwkJCXx8IChCTl9udW1fYnl0ZXMocnNhLT5wKSA+IGhuYnl0ZSkKKwkJCXx8IChCTl9udW1fYnl0ZXMocnNhLT5xKSA+IGhuYnl0ZSkKKwkJCXx8IChCTl9udW1fYnl0ZXMocnNhLT5kbXAxKSA+IGhuYnl0ZSkKKwkJCXx8IChCTl9udW1fYnl0ZXMocnNhLT5kbXExKSA+IGhuYnl0ZSkpCisJCQlnb3RvIGJhZGtleTsKKwl9CisJcmV0dXJuIGJpdGxlbjsKKwliYWRrZXk6CisJUEVNZXJyKFBFTV9GX0NIRUNLX0JJVExFTl9SU0EsIFBFTV9SX1VOU1VQUE9SVEVEX0tFWV9DT01QT05FTlRTKTsKKwlyZXR1cm4gMDsKKwl9CisKKworc3RhdGljIHZvaWQgd3JpdGVfcnNhKHVuc2lnbmVkIGNoYXIgKipvdXQsIFJTQSAqcnNhLCBpbnQgaXNwdWIpCisJeworCWludCBuYnl0ZSwgaG5ieXRlOworCW5ieXRlID0gQk5fbnVtX2J5dGVzKHJzYS0+bik7CisJaG5ieXRlID0gKEJOX251bV9iaXRzKHJzYS0+bikgKyAxNSkgPj4gNDsKKwl3cml0ZV9sZWJuKG91dCwgcnNhLT5lLCA0KTsKKwl3cml0ZV9sZWJuKG91dCwgcnNhLT5uLCAtMSk7CisJaWYgKGlzcHViKQorCQlyZXR1cm47CisJd3JpdGVfbGVibihvdXQsIHJzYS0+cCwgaG5ieXRlKTsKKwl3cml0ZV9sZWJuKG91dCwgcnNhLT5xLCBobmJ5dGUpOworCXdyaXRlX2xlYm4ob3V0LCByc2EtPmRtcDEsIGhuYnl0ZSk7CisJd3JpdGVfbGVibihvdXQsIHJzYS0+ZG1xMSwgaG5ieXRlKTsKKwl3cml0ZV9sZWJuKG91dCwgcnNhLT5pcW1wLCBobmJ5dGUpOworCXdyaXRlX2xlYm4ob3V0LCByc2EtPmQsIG5ieXRlKTsKKwl9CisKKwkKK3N0YXRpYyB2b2lkIHdyaXRlX2RzYSh1bnNpZ25lZCBjaGFyICoqb3V0LCBEU0EgKmRzYSwgaW50IGlzcHViKQorCXsKKwlpbnQgbmJ5dGU7CisJbmJ5dGUgPSBCTl9udW1fYnl0ZXMoZHNhLT5wKTsKKwl3cml0ZV9sZWJuKG91dCwgZHNhLT5wLCBuYnl0ZSk7CisJd3JpdGVfbGVibihvdXQsIGRzYS0+cSwgMjApOworCXdyaXRlX2xlYm4ob3V0LCBkc2EtPmcsIG5ieXRlKTsKKwlpZiAoaXNwdWIpCisJCXdyaXRlX2xlYm4ob3V0LCBkc2EtPnB1Yl9rZXksIG5ieXRlKTsKKwllbHNlCisJCXdyaXRlX2xlYm4ob3V0LCBkc2EtPnByaXZfa2V5LCAyMCk7CisJLyogU2V0ICJpbnZhbGlkIiBmb3Igc2VlZCBzdHJ1Y3R1cmUgdmFsdWVzICovCisJbWVtc2V0KCpvdXQsIDB4ZmYsIDI0KTsKKwkqb3V0ICs9IDI0OworCXJldHVybjsKKwl9CisJCisKK2ludCBpMmJfUHJpdmF0ZUtleV9iaW8oQklPICpvdXQsIEVWUF9QS0VZICpwaykKKwl7CisJcmV0dXJuIGRvX2kyYl9iaW8ob3V0LCBwaywgMCk7CisJfQorCitpbnQgaTJiX1B1YmxpY0tleV9iaW8oQklPICpvdXQsIEVWUF9QS0VZICpwaykKKwl7CisJcmV0dXJuIGRvX2kyYl9iaW8ob3V0LCBwaywgMSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM0CisKK3N0YXRpYyBpbnQgZG9fUFZLX2hlYWRlcihjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCWludCBza2lwX21hZ2ljLAorCSAgICAgICAJdW5zaWduZWQgaW50ICpwc2FsdGxlbiwgdW5zaWduZWQgaW50ICpwa2V5bGVuKQorCQkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICppbjsKKwl1bnNpZ25lZCBpbnQgcHZrX21hZ2ljLCBrZXl0eXBlLCBpc19lbmNyeXB0ZWQ7CisJaWYgKHNraXBfbWFnaWMpCisJCXsKKwkJaWYgKGxlbmd0aCA8IDIwKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX0RPX1BWS19IRUFERVIsIFBFTV9SX1BWS19UT09fU0hPUlQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWxlbmd0aCAtPSAyMDsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAobGVuZ3RoIDwgMjQpCisJCQl7CisJCQlQRU1lcnIoUEVNX0ZfRE9fUFZLX0hFQURFUiwgUEVNX1JfUFZLX1RPT19TSE9SVCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJbGVuZ3RoIC09IDI0OworCQlwdmtfbWFnaWMgPSByZWFkX2xlZHdvcmQoJnApOworCQlpZiAocHZrX21hZ2ljICE9IE1TX1BWS01BR0lDKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX0RPX1BWS19IRUFERVIsIFBFTV9SX0JBRF9NQUdJQ19OVU1CRVIpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkvKiBTa2lwIHJlc2VydmVkICovCisJcCArPSA0OworCWtleXR5cGUgPSByZWFkX2xlZHdvcmQoJnApOworCWlzX2VuY3J5cHRlZCA9IHJlYWRfbGVkd29yZCgmcCk7CisJKnBzYWx0bGVuID0gcmVhZF9sZWR3b3JkKCZwKTsKKwkqcGtleWxlbiA9IHJlYWRfbGVkd29yZCgmcCk7CisKKwlpZiAoaXNfZW5jcnlwdGVkICYmICEqcHNhbHRsZW4pCisJCXsKKwkJUEVNZXJyKFBFTV9GX0RPX1BWS19IRUFERVIsIFBFTV9SX0lOQ09OU0lTVEVOVF9IRUFERVIpOworCQlyZXR1cm4gMDsKKwkJfQorCisJKmluID0gcDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZGVyaXZlX3B2a19rZXkodW5zaWduZWQgY2hhciAqa2V5LCAKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIHVuc2lnbmVkIGludCBzYWx0bGVuLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcGFzcywgaW50IHBhc3NsZW4pCisJeworCUVWUF9NRF9DVFggbWN0eDsKKwlFVlBfTURfQ1RYX2luaXQoJm1jdHgpOworCUVWUF9EaWdlc3RJbml0X2V4KCZtY3R4LCBFVlBfc2hhMSgpLCBOVUxMKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZtY3R4LCBzYWx0LCBzYWx0bGVuKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZtY3R4LCBwYXNzLCBwYXNzbGVuKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgoJm1jdHgsIGtleSwgTlVMTCk7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZtY3R4KTsKKwlyZXR1cm4gMTsKKwl9CisJCisKK3N0YXRpYyBFVlBfUEtFWSAqZG9fUFZLX2JvZHkoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLAorCQl1bnNpZ25lZCBpbnQgc2FsdGxlbiwgdW5zaWduZWQgaW50IGtleWxlbiwKKwkJcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisJRVZQX1BLRVkgKnJldCA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICppbjsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisJdW5zaWduZWQgY2hhciAqZW5jdG1wID0gTlVMTCwgKnE7CisJaWYgKHNhbHRsZW4pCisJCXsKKwkJY2hhciBwc2J1ZltQRU1fQlVGU0laRV07CisJCXVuc2lnbmVkIGNoYXIga2V5YnVmWzIwXTsKKwkJRVZQX0NJUEhFUl9DVFggY2N0eDsKKwkJaW50IGVuY3RtcGxlbiwgaW5sZW47CisJCWlmIChjYikKKwkJCWlubGVuPWNiKHBzYnVmLFBFTV9CVUZTSVpFLDAsdSk7CisJCWVsc2UKKwkJCWlubGVuPVBFTV9kZWZfY2FsbGJhY2socHNidWYsUEVNX0JVRlNJWkUsMCx1KTsKKwkJaWYgKGlubGVuIDw9IDApCisJCQl7CisJCQlQRU1lcnIoUEVNX0ZfRE9fUFZLX0JPRFksUEVNX1JfQkFEX1BBU1NXT1JEX1JFQUQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCWVuY3RtcCA9IE9QRU5TU0xfbWFsbG9jKGtleWxlbiArIDgpOworCQlpZiAoIWVuY3RtcCkKKwkJCXsKKwkJCVBFTWVycihQRU1fRl9ET19QVktfQk9EWSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCWlmICghZGVyaXZlX3B2a19rZXkoa2V5YnVmLCBwLCBzYWx0bGVuLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopcHNidWYsIGlubGVuKSkKKwkJCXJldHVybiBOVUxMOworCQlwICs9IHNhbHRsZW47CisJCS8qIENvcHkgQkxPQkhFQURFUiBhY3Jvc3MsIGRlY3J5cHQgcmVzdCAqLworCQltZW1jcHkoZW5jdG1wLCBwLCA4KTsKKwkJcCArPSA4OworCQlpbmxlbiA9IGtleWxlbiAtIDg7CisJCXEgPSBlbmN0bXAgKyA4OworCQlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjY3R4KTsKKwkJRVZQX0RlY3J5cHRJbml0X2V4KCZjY3R4LCBFVlBfcmM0KCksIE5VTEwsIGtleWJ1ZiwgTlVMTCk7CisJCUVWUF9EZWNyeXB0VXBkYXRlKCZjY3R4LCBxLCAmZW5jdG1wbGVuLCBwLCBpbmxlbik7CisJCUVWUF9EZWNyeXB0RmluYWxfZXgoJmNjdHgsIHEgKyBlbmN0bXBsZW4sICZlbmN0bXBsZW4pOworCQltYWdpYyA9IHJlYWRfbGVkd29yZCgoY29uc3QgdW5zaWduZWQgY2hhciAqKikmcSk7CisJCWlmIChtYWdpYyAhPSBNU19SU0EyTUFHSUMgJiYgbWFnaWMgIT0gTVNfRFNTMk1BR0lDKQorCQkJeworCQkJcSA9IGVuY3RtcCArIDg7CisJCQltZW1zZXQoa2V5YnVmICsgNSwgMCwgMTEpOworCQkJRVZQX0RlY3J5cHRJbml0X2V4KCZjY3R4LCBFVlBfcmM0KCksIE5VTEwsIGtleWJ1ZiwKKwkJCQkJCQkJTlVMTCk7CisJCQlPUEVOU1NMX2NsZWFuc2Uoa2V5YnVmLCAyMCk7CisJCQlFVlBfRGVjcnlwdFVwZGF0ZSgmY2N0eCwgcSwgJmVuY3RtcGxlbiwgcCwgaW5sZW4pOworCQkJRVZQX0RlY3J5cHRGaW5hbF9leCgmY2N0eCwgcSArIGVuY3RtcGxlbiwKKwkJCQkJCQkJJmVuY3RtcGxlbik7CisJCQltYWdpYyA9IHJlYWRfbGVkd29yZCgoY29uc3QgdW5zaWduZWQgY2hhciAqKikmcSk7CisJCQlpZiAobWFnaWMgIT0gTVNfUlNBMk1BR0lDICYmIG1hZ2ljICE9IE1TX0RTUzJNQUdJQykKKwkJCQl7CisJCQkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY2N0eCk7CisJCQkJUEVNZXJyKFBFTV9GX0RPX1BWS19CT0RZLCBQRU1fUl9CQURfREVDUllQVCk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQlPUEVOU1NMX2NsZWFuc2Uoa2V5YnVmLCAyMCk7CisJCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmNjdHgpOworCQlwID0gZW5jdG1wOworCQl9CisKKwlyZXQgPSBiMmlfUHJpdmF0ZUtleSgmcCwga2V5bGVuKTsKKwllcnI6CisJaWYgKGVuY3RtcCAmJiBzYWx0bGVuKQorCQlPUEVOU1NMX2ZyZWUoZW5jdG1wKTsKKwlyZXR1cm4gcmV0OworCX0KKworCitFVlBfUEtFWSAqYjJpX1BWS19iaW8oQklPICppbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkKKwl7CisJdW5zaWduZWQgY2hhciBwdmtfaGRyWzI0XSwgKmJ1ZiA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgYnVmbGVuOworCUVWUF9QS0VZICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGludCBzYWx0bGVuLCBrZXlsZW47CisJaWYgKEJJT19yZWFkKGluLCBwdmtfaGRyLCAyNCkgIT0gMjQpCisJCXsKKwkJUEVNZXJyKFBFTV9GX0IySV9QVktfQklPLCBQRU1fUl9QVktfREFUQV9UT09fU0hPUlQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCXAgPSBwdmtfaGRyOworCisJaWYgKCFkb19QVktfaGVhZGVyKCZwLCAyNCwgMCwgJnNhbHRsZW4sICZrZXlsZW4pKQorCQlyZXR1cm4gMDsKKwlidWZsZW4gPSAoaW50KSBrZXlsZW4gKyBzYWx0bGVuOworCWJ1ZiA9IE9QRU5TU0xfbWFsbG9jKGJ1Zmxlbik7CisJaWYgKCFidWYpCisJCXsKKwkJUEVNZXJyKFBFTV9GX0IySV9QVktfQklPLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJcCA9IGJ1ZjsKKwlpZiAoQklPX3JlYWQoaW4sIGJ1ZiwgYnVmbGVuKSAhPSBidWZsZW4pCisJCXsKKwkJUEVNZXJyKFBFTV9GX0IySV9QVktfQklPLCBQRU1fUl9QVktfREFUQV9UT09fU0hPUlQpOworCQlnb3RvIGVycjsKKwkJfQorCXJldCA9IGRvX1BWS19ib2R5KCZwLCBzYWx0bGVuLCBrZXlsZW4sIGNiLCB1KTsKKworCWVycjoKKwlpZiAoYnVmKQorCQl7CisJCU9QRU5TU0xfY2xlYW5zZShidWYsIGJ1Zmxlbik7CisJCU9QRU5TU0xfZnJlZShidWYpOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKKwkKKwkKK3N0YXRpYyBpbnQgaTJiX1BWSyh1bnNpZ25lZCBjaGFyICoqb3V0LCBFVlBfUEtFWSpwaywgaW50IGVuY2xldmVsLAorCQlwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KQorCXsKKwlpbnQgb3V0bGVuID0gMjQsIG5vaW5jLCBwa2xlbjsKKwl1bnNpZ25lZCBjaGFyICpwLCAqc2FsdCA9IE5VTEw7CisJaWYgKGVuY2xldmVsKQorCQlvdXRsZW4gKz0gUFZLX1NBTFRMRU47CisJcGtsZW4gPSBkb19pMmIoTlVMTCwgcGssIDApOworCWlmIChwa2xlbiA8IDApCisJCXJldHVybiAtMTsKKwlvdXRsZW4gKz0gcGtsZW47CisJaWYgKCFvdXQpCisJCXJldHVybiBvdXRsZW47CisJaWYgKCpvdXQpCisJCXsKKwkJcCA9ICpvdXQ7CisJCW5vaW5jID0gMDsKKwkJfQorCWVsc2UKKwkJeworCQlwID0gT1BFTlNTTF9tYWxsb2Mob3V0bGVuKTsKKwkJaWYgKCFwKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX0kyQl9QVkssRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQkqb3V0ID0gcDsKKwkJbm9pbmMgPSAxOworCQl9CisKKwl3cml0ZV9sZWR3b3JkKCZwLCBNU19QVktNQUdJQyk7CisJd3JpdGVfbGVkd29yZCgmcCwgMCk7CisJaWYgKHBrLT50eXBlID09IEVWUF9QS0VZX0RTQSkKKwkJd3JpdGVfbGVkd29yZCgmcCwgTVNfS0VZVFlQRV9TSUdOKTsKKwllbHNlCisJCXdyaXRlX2xlZHdvcmQoJnAsIE1TX0tFWVRZUEVfS0VZWCk7CisJd3JpdGVfbGVkd29yZCgmcCwgZW5jbGV2ZWwgPyAxIDogMCk7CisJd3JpdGVfbGVkd29yZCgmcCwgZW5jbGV2ZWwgPyBQVktfU0FMVExFTjogMCk7CisJd3JpdGVfbGVkd29yZCgmcCwgcGtsZW4pOworCWlmIChlbmNsZXZlbCkKKwkJeworCQlpZiAoUkFORF9ieXRlcyhwLCBQVktfU0FMVExFTikgPD0gMCkKKwkJCWdvdG8gZXJyb3I7CisJCXNhbHQgPSBwOworCQlwICs9IFBWS19TQUxUTEVOOworCQl9CisJZG9faTJiKCZwLCBwaywgMCk7CisJaWYgKGVuY2xldmVsID09IDApCisJCXJldHVybiBvdXRsZW47CisJZWxzZQorCQl7CisJCWNoYXIgcHNidWZbUEVNX0JVRlNJWkVdOworCQl1bnNpZ25lZCBjaGFyIGtleWJ1ZlsyMF07CisJCUVWUF9DSVBIRVJfQ1RYIGNjdHg7CisJCWludCBlbmN0bXBsZW4sIGlubGVuOworCQlpZiAoY2IpCisJCQlpbmxlbj1jYihwc2J1ZixQRU1fQlVGU0laRSwxLHUpOworCQllbHNlCisJCQlpbmxlbj1QRU1fZGVmX2NhbGxiYWNrKHBzYnVmLFBFTV9CVUZTSVpFLDEsdSk7CisJCWlmIChpbmxlbiA8PSAwKQorCQkJeworCQkJUEVNZXJyKFBFTV9GX0kyQl9QVkssUEVNX1JfQkFEX1BBU1NXT1JEX1JFQUQpOworCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJaWYgKCFkZXJpdmVfcHZrX2tleShrZXlidWYsIHNhbHQsIFBWS19TQUxUTEVOLAorCQkJICAgICh1bnNpZ25lZCBjaGFyICopcHNidWYsIGlubGVuKSkKKwkJCWdvdG8gZXJyb3I7CisJCWlmIChlbmNsZXZlbCA9PSAxKQorCQkJbWVtc2V0KGtleWJ1ZiArIDUsIDAsIDExKTsKKwkJcCA9IHNhbHQgKyBQVktfU0FMVExFTiArIDg7CisJCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmNjdHgpOworCQlFVlBfRW5jcnlwdEluaXRfZXgoJmNjdHgsIEVWUF9yYzQoKSwgTlVMTCwga2V5YnVmLCBOVUxMKTsKKwkJT1BFTlNTTF9jbGVhbnNlKGtleWJ1ZiwgMjApOworCQlFVlBfRGVjcnlwdFVwZGF0ZSgmY2N0eCwgcCwgJmVuY3RtcGxlbiwgcCwgcGtsZW4gLSA4KTsKKwkJRVZQX0RlY3J5cHRGaW5hbF9leCgmY2N0eCwgcCArIGVuY3RtcGxlbiwgJmVuY3RtcGxlbik7CisJCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmNjdHgpOworCQl9CisJcmV0dXJuIG91dGxlbjsKKworCWVycm9yOgorCXJldHVybiAtMTsKKwl9CisKK2ludCBpMmJfUFZLX2JpbyhCSU8gKm91dCwgRVZQX1BLRVkgKnBrLCBpbnQgZW5jbGV2ZWwsCisJCXBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpCisJeworCXVuc2lnbmVkIGNoYXIgKnRtcCA9IE5VTEw7CisJaW50IG91dGxlbiwgd3JsZW47CisJb3V0bGVuID0gaTJiX1BWSygmdG1wLCBwaywgZW5jbGV2ZWwsIGNiLCB1KTsKKwlpZiAob3V0bGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCXdybGVuID0gQklPX3dyaXRlKG91dCwgdG1wLCBvdXRsZW4pOworCU9QRU5TU0xfZnJlZSh0bXApOworCWlmICh3cmxlbiA9PSBvdXRsZW4pCisJCXsKKwkJUEVNZXJyKFBFTV9GX0kyQl9QVktfQklPLCBQRU1fUl9CSU9fV1JJVEVfRkFJTFVSRSk7CisJCXJldHVybiBvdXRsZW47CisJCX0KKwlyZXR1cm4gLTE7CisJfQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS9jYmMucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS9jYmMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzZGM5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZXJsYXNtL2NiYy5wbApAQCAtMCwwICsxLDM1MSBAQAorIyEvdXNyL2xvY2FsL2Jpbi9wZXJsCisKKyMgdm9pZCBkZXNfbmNiY19lbmNyeXB0KGlucHV0LCBvdXRwdXQsIGxlbmd0aCwgc2NoZWR1bGUsIGl2ZWMsIGVuYykKKyMgZGVzX2NibG9jayAoKmlucHV0KTsKKyMgZGVzX2NibG9jayAoKm91dHB1dCk7CisjIGxvbmcgbGVuZ3RoOworIyBkZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlOworIyBkZXNfY2Jsb2NrICgqaXZlYyk7CisjIGludCBlbmM7CisjCisjIGNhbGxzIAorIyBkZXNfZW5jcnlwdCgoREVTX0xPTkcgKil0aW4sc2NoZWR1bGUsREVTX0VOQ1JZUFQpOworIworCisjJmNiYygiZGVzX25jYmNfZW5jcnlwdCIsImRlc19lbmNyeXB0IiwwKTsKKyMmY2JjKCJCRl9jYmNfZW5jcnlwdCIsIkJGX2VuY3J5cHQiLCJCRl9lbmNyeXB0IiwKKyMJMSw0LDUsMyw1LC0xKTsKKyMmY2JjKCJkZXNfbmNiY19lbmNyeXB0IiwiZGVzX2VuY3J5cHQiLCJkZXNfZW5jcnlwdCIsCisjCTAsNCw1LDMsNSwtMSk7CisjJmNiYygiZGVzX2VkZTNfY2JjX2VuY3J5cHQiLCJkZXNfZW5jcnlwdDMiLCJkZXNfZGVjcnlwdDMiLAorIwkwLDYsNywzLDQsNSk7CisjCisjIFdoZW4gZG9pbmcgYSBjaXBoZXIgdGhhdCBuZWVkcyBiaWdlbmRpYW4gb3JkZXIsCisjIGZvciBlbmNyeXB0LCB0aGUgaXYgaXMga2VwdCBpbiBiaWdlbmRpYW4gZm9ybSwKKyMgd2hpbGUgZm9yIGRlY3J5cHQsIGl0IGlzIGtlcHQgaW4gbGl0dGxlIGVuZGlhbi4KK3N1YiBjYmMKKwl7CisJbG9jYWwoJG5hbWUsJGVuY19mdW5jLCRkZWNfZnVuYywkc3dhcCwkaXZfb2ZmLCRlbmNfb2ZmLCRwMSwkcDIsJHAzKT1AXzsKKwkjIG5hbWUgaXMgdGhlIGZ1bmN0aW9uIG5hbWUKKwkjIGVuY19mdW5jIGFuZCBkZWNfZnVuYyBhbmQgdGhlIGZ1bmN0aW9ucyB0byBjYWxsIGZvciBlbmNyeXB0L2RlY3J5cHQKKwkjIHN3YXAgaXMgdHJ1ZSBpZiBieXRlIG9yZGVyIG5lZWRzIHRvIGJlIHJldmVyc2VkCisJIyBpdl9vZmYgaXMgcGFyYW1ldGVyIG51bWJlciBmb3IgdGhlIGl2IAorCSMgZW5jX29mZiBpcyBwYXJhbWV0ZXIgbnVtYmVyIGZvciB0aGUgZW5jcnlwdC9kZWNyeXB0IGZsYWcKKwkjIHAxLHAyLHAzIGFyZSB0aGUgb2Zmc2V0cyBmb3IgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgdG8gdGhlCisJIyB1bmRlcmx5aW5nIGNhbGxzLgorCisJJmZ1bmN0aW9uX2JlZ2luX0IoJG5hbWUsIiIpOworCSZjb21tZW50KCIiKTsKKworCSRpbj0iZXNpIjsKKwkkb3V0PSJlZGkiOworCSRjb3VudD0iZWJwIjsKKworCSZwdXNoKCJlYnAiKTsKKwkmcHVzaCgiZWJ4Iik7CisJJnB1c2goImVzaSIpOworCSZwdXNoKCJlZGkiKTsKKworCSRkYXRhX29mZj00OworCSRkYXRhX29mZis9NCBpZiAoJHAxID4gMCk7CisJJGRhdGFfb2ZmKz00IGlmICgkcDIgPiAwKTsKKwkkZGF0YV9vZmYrPTQgaWYgKCRwMyA+IDApOworCisJJm1vdigkY291bnQsCSZ3cGFyYW0oMikpOwkjIGxlbmd0aAorCisJJmNvbW1lbnQoImdldHRpbmcgaXYgcHRyIGZyb20gcGFyYW1ldGVyICRpdl9vZmYiKTsKKwkmbW92KCJlYngiLAkmd3BhcmFtKCRpdl9vZmYpKTsJIyBHZXQgaXYgcHRyCisKKwkmbW92KCRpbiwJJkRXUCgwLCJlYngiLCIiLDApKTsjCWl2WzBdCisJJm1vdigkb3V0LAkmRFdQKDQsImVieCIsIiIsMCkpOyMJaXZbMV0KKworCSZwdXNoKCRvdXQpOworCSZwdXNoKCRpbik7CisJJnB1c2goJG91dCk7CSMgdXNlZCBpbiBkZWNyeXB0IGZvciBpdlsxXQorCSZwdXNoKCRpbik7CSMgdXNlZCBpbiBkZWNyeXB0IGZvciBpdlswXQorCisJJm1vdigiZWJ4IiwJImVzcCIpOwkJIyBUaGlzIGlzIHRoZSBhZGRyZXNzIG9mIHRpblsyXQorCisJJm1vdigkaW4sCSZ3cGFyYW0oMCkpOwkjIGluCisJJm1vdigkb3V0LAkmd3BhcmFtKDEpKTsJIyBvdXQKKworCSMgV2UgaGF2ZSBsb2FkZWQgdGhlbSBhbGwsIGhvdyBsZXRzIHB1c2ggdGhpbmdzCisJJmNvbW1lbnQoImdldHRpbmcgZW5jcnlwdCBmbGFnIGZyb20gcGFyYW1ldGVyICRlbmNfb2ZmIik7CisJJm1vdigiZWN4IiwJJndwYXJhbSgkZW5jX29mZikpOwkjIEdldCBlbmMgZmxhZworCWlmICgkcDMgPiAwKQorCQl7CisJCSZjb21tZW50KCJnZXQgYW5kIHB1c2ggcGFyYW1ldGVyICRwMyIpOworCQlpZiAoJGVuY19vZmYgIT0gJHAzKQorCQkJeyAmbW92KCJlYXgiLAkmd3BhcmFtKCRwMykpOyAmcHVzaCgiZWF4Iik7IH0KKwkJZWxzZQl7ICZwdXNoKCJlY3giKTsgfQorCQl9CisJaWYgKCRwMiA+IDApCisJCXsKKwkJJmNvbW1lbnQoImdldCBhbmQgcHVzaCBwYXJhbWV0ZXIgJHAyIik7CisJCWlmICgkZW5jX29mZiAhPSAkcDIpCisJCQl7ICZtb3YoImVheCIsCSZ3cGFyYW0oJHAyKSk7ICZwdXNoKCJlYXgiKTsgfQorCQllbHNlCXsgJnB1c2goImVjeCIpOyB9CisJCX0KKwlpZiAoJHAxID4gMCkKKwkJeworCQkmY29tbWVudCgiZ2V0IGFuZCBwdXNoIHBhcmFtZXRlciAkcDEiKTsKKwkJaWYgKCRlbmNfb2ZmICE9ICRwMSkKKwkJCXsgJm1vdigiZWF4IiwJJndwYXJhbSgkcDEpKTsgJnB1c2goImVheCIpOyB9CisJCWVsc2UJeyAmcHVzaCgiZWN4Iik7IH0KKwkJfQorCSZwdXNoKCJlYngiKTsJCSMgcHVzaCBkYXRhL2l2CisKKwkmY21wKCJlY3giLDApOworCSZqeigmbGFiZWwoImRlY3J5cHQiKSk7CisKKwkmYW5kKCRjb3VudCwweGZmZmZmZmY4KTsKKwkmbW92KCJlYXgiLAkmRFdQKCRkYXRhX29mZiwiZXNwIiwiIiwwKSk7CSMgbG9hZCBpdlswXQorCSZtb3YoImVieCIsCSZEV1AoJGRhdGFfb2ZmKzQsImVzcCIsIiIsMCkpOwkjIGxvYWQgaXZbMV0KKworCSZqeigmbGFiZWwoImVuY3J5cHRfZmluaXNoIikpOworCisJIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisJJnNldF9sYWJlbCgiZW5jcnlwdF9sb29wIik7CisJIyBlbmNyeXB0IHN0YXJ0IAorCSMgImVheCIgYW5kICJlYngiIGhvbGQgaXYgKG9yIHRoZSBsYXN0IGNpcGhlciB0ZXh0KQorCisJJm1vdigiZWN4IiwJJkRXUCgwLCRpbiwiIiwwKSk7CSMgbG9hZCBmaXJzdCA0IGJ5dGVzCisJJm1vdigiZWR4IiwJJkRXUCg0LCRpbiwiIiwwKSk7CSMgc2Vjb25kIDQgYnl0ZXMKKworCSZ4b3IoImVheCIsCSJlY3giKTsKKwkmeG9yKCJlYngiLAkiZWR4Iik7CisKKwkmYnN3YXAoImVheCIpCWlmICRzd2FwOworCSZic3dhcCgiZWJ4IikJaWYgJHN3YXA7CisKKwkmbW92KCZEV1AoJGRhdGFfb2ZmLCJlc3AiLCIiLDApLAkiZWF4Iik7CSMgcHV0IGluIGFycmF5IGZvciBjYWxsCisJJm1vdigmRFdQKCRkYXRhX29mZis0LCJlc3AiLCIiLDApLAkiZWJ4Iik7CSMKKworCSZjYWxsKCRlbmNfZnVuYyk7CisKKwkmbW92KCJlYXgiLAkmRFdQKCRkYXRhX29mZiwiZXNwIiwiIiwwKSk7CisJJm1vdigiZWJ4IiwJJkRXUCgkZGF0YV9vZmYrNCwiZXNwIiwiIiwwKSk7CisKKwkmYnN3YXAoImVheCIpCWlmICRzd2FwOworCSZic3dhcCgiZWJ4IikJaWYgJHN3YXA7CisKKwkmbW92KCZEV1AoMCwkb3V0LCIiLDApLCJlYXgiKTsKKwkmbW92KCZEV1AoNCwkb3V0LCIiLDApLCJlYngiKTsKKworCSMgZWF4IGFuZCBlYnggYXJlIHRoZSBuZXh0IGl2LgorCisJJmFkZCgkaW4sCTgpOworCSZhZGQoJG91dCwJOCk7CisKKwkmc3ViKCRjb3VudCwJOCk7CisJJmpueigmbGFiZWwoImVuY3J5cHRfbG9vcCIpKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzMKKwkmc2V0X2xhYmVsKCJlbmNyeXB0X2ZpbmlzaCIpOworCSZtb3YoJGNvdW50LAkmd3BhcmFtKDIpKTsJIyBsZW5ndGgKKwkmYW5kKCRjb3VudCwJNyk7CisJJmp6KCZsYWJlbCgiZmluaXNoIikpOworCSZjYWxsKCZsYWJlbCgiUElDX3BvaW50IikpOworJnNldF9sYWJlbCgiUElDX3BvaW50Iik7CisJJmJsaW5kcG9wKCJlZHgiKTsKKwkmbGVhKCJlY3giLCZEV1AoJmxhYmVsKCJjYmNfZW5jX2ptcF90YWJsZSIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpLCJlZHgiKSk7CisJJm1vdigkY291bnQsJkRXUCgwLCJlY3giLCRjb3VudCw0KSkKKwkmYWRkKCRjb3VudCwiZWR4Iik7CisJJnhvcigiZWN4IiwiZWN4Iik7CisJJnhvcigiZWR4IiwiZWR4Iik7CisJIyZtb3YoJGNvdW50LCZEV1AoJmxhYmVsKCJjYmNfZW5jX2ptcF90YWJsZSIpLCIiLCRjb3VudCw0KSk7CisJJmptcF9wdHIoJGNvdW50KTsKKworJnNldF9sYWJlbCgiZWo3Iik7CisJJnhvcigiZWR4IiwJCSJlZHgiKSBpZiAkcHBybzsgIyBwcHJvIGZyaWVuZGx5CisJJm1vdmIoJkhCKCJlZHgiKSwJJkJQKDYsJGluLCIiLDApKTsKKwkmc2hsKCJlZHgiLDgpOworJnNldF9sYWJlbCgiZWo2Iik7CisJJm1vdmIoJkhCKCJlZHgiKSwJJkJQKDUsJGluLCIiLDApKTsKKyZzZXRfbGFiZWwoImVqNSIpOworCSZtb3ZiKCZMQigiZWR4IiksCSZCUCg0LCRpbiwiIiwwKSk7Cismc2V0X2xhYmVsKCJlajQiKTsKKwkmbW92KCJlY3giLAkJJkRXUCgwLCRpbiwiIiwwKSk7CisJJmptcCgmbGFiZWwoImVqZW5kIikpOworJnNldF9sYWJlbCgiZWozIik7CisJJm1vdmIoJkhCKCJlY3giKSwJJkJQKDIsJGluLCIiLDApKTsKKwkmeG9yKCJlY3giLAkJImVjeCIpIGlmICRwcHJvOyAjIHBwcm8gZnJpZW5kbHkKKwkmc2hsKCJlY3giLDgpOworJnNldF9sYWJlbCgiZWoyIik7CisJJm1vdmIoJkhCKCJlY3giKSwJJkJQKDEsJGluLCIiLDApKTsKKyZzZXRfbGFiZWwoImVqMSIpOworCSZtb3ZiKCZMQigiZWN4IiksCSZCUCgwLCRpbiwiIiwwKSk7Cismc2V0X2xhYmVsKCJlamVuZCIpOworCisJJnhvcigiZWF4IiwJImVjeCIpOworCSZ4b3IoImVieCIsCSJlZHgiKTsKKworCSZic3dhcCgiZWF4IikJaWYgJHN3YXA7CisJJmJzd2FwKCJlYngiKQlpZiAkc3dhcDsKKworCSZtb3YoJkRXUCgkZGF0YV9vZmYsImVzcCIsIiIsMCksCSJlYXgiKTsJIyBwdXQgaW4gYXJyYXkgZm9yIGNhbGwKKwkmbW92KCZEV1AoJGRhdGFfb2ZmKzQsImVzcCIsIiIsMCksCSJlYngiKTsJIworCisJJmNhbGwoJGVuY19mdW5jKTsKKworCSZtb3YoImVheCIsCSZEV1AoJGRhdGFfb2ZmLCJlc3AiLCIiLDApKTsKKwkmbW92KCJlYngiLAkmRFdQKCRkYXRhX29mZis0LCJlc3AiLCIiLDApKTsKKworCSZic3dhcCgiZWF4IikJaWYgJHN3YXA7CisJJmJzd2FwKCJlYngiKQlpZiAkc3dhcDsKKworCSZtb3YoJkRXUCgwLCRvdXQsIiIsMCksImVheCIpOworCSZtb3YoJkRXUCg0LCRvdXQsIiIsMCksImVieCIpOworCisJJmptcCgmbGFiZWwoImZpbmlzaCIpKTsKKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisJJnNldF9sYWJlbCgiZGVjcnlwdCIsMSk7CisJIyBkZWNyeXB0IHN0YXJ0IAorCSZhbmQoJGNvdW50LDB4ZmZmZmZmZjgpOworCSMgVGhlIG5leHQgMiBpbnN0cnVjdGlvbnMgYXJlIG9ubHkgZm9yIGlmIHRoZSBqeiBpcyB0YWtlbgorCSZtb3YoImVheCIsCSZEV1AoJGRhdGFfb2ZmKzgsImVzcCIsIiIsMCkpOwkjIGdldCBpdlswXQorCSZtb3YoImVieCIsCSZEV1AoJGRhdGFfb2ZmKzEyLCJlc3AiLCIiLDApKTsJIyBnZXQgaXZbMV0KKwkmanooJmxhYmVsKCJkZWNyeXB0X2ZpbmlzaCIpKTsKKworCSZzZXRfbGFiZWwoImRlY3J5cHRfbG9vcCIpOworCSZtb3YoImVheCIsCSZEV1AoMCwkaW4sIiIsMCkpOwkjIGxvYWQgZmlyc3QgNCBieXRlcworCSZtb3YoImVieCIsCSZEV1AoNCwkaW4sIiIsMCkpOwkjIHNlY29uZCA0IGJ5dGVzCisKKwkmYnN3YXAoImVheCIpCWlmICRzd2FwOworCSZic3dhcCgiZWJ4IikJaWYgJHN3YXA7CisKKwkmbW92KCZEV1AoJGRhdGFfb2ZmLCJlc3AiLCIiLDApLAkiZWF4Iik7CSMgcHV0IGJhY2sKKwkmbW92KCZEV1AoJGRhdGFfb2ZmKzQsImVzcCIsIiIsMCksCSJlYngiKTsJIworCisJJmNhbGwoJGRlY19mdW5jKTsKKworCSZtb3YoImVheCIsCSZEV1AoJGRhdGFfb2ZmLCJlc3AiLCIiLDApKTsJIyBnZXQgcmV0dXJuCisJJm1vdigiZWJ4IiwJJkRXUCgkZGF0YV9vZmYrNCwiZXNwIiwiIiwwKSk7CSMKKworCSZic3dhcCgiZWF4IikJaWYgJHN3YXA7CisJJmJzd2FwKCJlYngiKQlpZiAkc3dhcDsKKworCSZtb3YoImVjeCIsCSZEV1AoJGRhdGFfb2ZmKzgsImVzcCIsIiIsMCkpOwkjIGdldCBpdlswXQorCSZtb3YoImVkeCIsCSZEV1AoJGRhdGFfb2ZmKzEyLCJlc3AiLCIiLDApKTsJIyBnZXQgaXZbMV0KKworCSZ4b3IoImVjeCIsCSJlYXgiKTsKKwkmeG9yKCJlZHgiLAkiZWJ4Iik7CisKKwkmbW92KCJlYXgiLAkmRFdQKDAsJGluLCIiLDApKTsJIyBnZXQgb2xkIGNpcGhlciB0ZXh0LAorCSZtb3YoImVieCIsCSZEV1AoNCwkaW4sIiIsMCkpOwkjIG5leHQgaXYgYWN0dWFsbHkKKworCSZtb3YoJkRXUCgwLCRvdXQsIiIsMCksImVjeCIpOworCSZtb3YoJkRXUCg0LCRvdXQsIiIsMCksImVkeCIpOworCisJJm1vdigmRFdQKCRkYXRhX29mZis4LCJlc3AiLCIiLDApLAkiZWF4Iik7CSMgc2F2ZSBpdgorCSZtb3YoJkRXUCgkZGF0YV9vZmYrMTIsImVzcCIsIiIsMCksCSJlYngiKTsJIworCisJJmFkZCgkaW4sCTgpOworCSZhZGQoJG91dCwJOCk7CisKKwkmc3ViKCRjb3VudCwJOCk7CisJJmpueigmbGFiZWwoImRlY3J5cHRfbG9vcCIpKTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5ESVQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzCisJJnNldF9sYWJlbCgiZGVjcnlwdF9maW5pc2giKTsKKwkmbW92KCRjb3VudCwJJndwYXJhbSgyKSk7CSMgbGVuZ3RoCisJJmFuZCgkY291bnQsCTcpOworCSZqeigmbGFiZWwoImZpbmlzaCIpKTsKKworCSZtb3YoImVheCIsCSZEV1AoMCwkaW4sIiIsMCkpOwkjIGxvYWQgZmlyc3QgNCBieXRlcworCSZtb3YoImVieCIsCSZEV1AoNCwkaW4sIiIsMCkpOwkjIHNlY29uZCA0IGJ5dGVzCisKKwkmYnN3YXAoImVheCIpCWlmICRzd2FwOworCSZic3dhcCgiZWJ4IikJaWYgJHN3YXA7CisKKwkmbW92KCZEV1AoJGRhdGFfb2ZmLCJlc3AiLCIiLDApLAkiZWF4Iik7CSMgcHV0IGJhY2sKKwkmbW92KCZEV1AoJGRhdGFfb2ZmKzQsImVzcCIsIiIsMCksCSJlYngiKTsJIworCisJJmNhbGwoJGRlY19mdW5jKTsKKworCSZtb3YoImVheCIsCSZEV1AoJGRhdGFfb2ZmLCJlc3AiLCIiLDApKTsJIyBnZXQgcmV0dXJuCisJJm1vdigiZWJ4IiwJJkRXUCgkZGF0YV9vZmYrNCwiZXNwIiwiIiwwKSk7CSMKKworCSZic3dhcCgiZWF4IikJaWYgJHN3YXA7CisJJmJzd2FwKCJlYngiKQlpZiAkc3dhcDsKKworCSZtb3YoImVjeCIsCSZEV1AoJGRhdGFfb2ZmKzgsImVzcCIsIiIsMCkpOwkjIGdldCBpdlswXQorCSZtb3YoImVkeCIsCSZEV1AoJGRhdGFfb2ZmKzEyLCJlc3AiLCIiLDApKTsJIyBnZXQgaXZbMV0KKworCSZ4b3IoImVjeCIsCSJlYXgiKTsKKwkmeG9yKCJlZHgiLAkiZWJ4Iik7CisKKwkjIHRoaXMgaXMgZm9yIHdoZW4gd2UgZXhpdAorCSZtb3YoImVheCIsCSZEV1AoMCwkaW4sIiIsMCkpOwkjIGdldCBvbGQgY2lwaGVyIHRleHQsCisJJm1vdigiZWJ4IiwJJkRXUCg0LCRpbiwiIiwwKSk7CSMgbmV4dCBpdiBhY3R1YWxseQorCismc2V0X2xhYmVsKCJkajciKTsKKwkmcm90cigiZWR4IiwJMTYpOworCSZtb3ZiKCZCUCg2LCRvdXQsIiIsMCksCSZMQigiZWR4IikpOworCSZzaHIoImVkeCIsMTYpOworJnNldF9sYWJlbCgiZGo2Iik7CisJJm1vdmIoJkJQKDUsJG91dCwiIiwwKSwJJkhCKCJlZHgiKSk7Cismc2V0X2xhYmVsKCJkajUiKTsKKwkmbW92YigmQlAoNCwkb3V0LCIiLDApLAkmTEIoImVkeCIpKTsKKyZzZXRfbGFiZWwoImRqNCIpOworCSZtb3YoJkRXUCgwLCRvdXQsIiIsMCksCSJlY3giKTsKKwkmam1wKCZsYWJlbCgiZGplbmQiKSk7Cismc2V0X2xhYmVsKCJkajMiKTsKKwkmcm90cigiZWN4IiwJMTYpOworCSZtb3ZiKCZCUCgyLCRvdXQsIiIsMCksCSZMQigiZWN4IikpOworCSZzaGwoImVjeCIsMTYpOworJnNldF9sYWJlbCgiZGoyIik7CisJJm1vdmIoJkJQKDEsJGluLCIiLDApLAkmSEIoImVjeCIpKTsKKyZzZXRfbGFiZWwoImRqMSIpOworCSZtb3ZiKCZCUCgwLCRpbiwiIiwwKSwJJkxCKCJlY3giKSk7Cismc2V0X2xhYmVsKCJkamVuZCIpOworCisJIyBmaW5hbCBpdiBpcyBzdGlsbCBpbiBlYXg6ZWJ4CisJJmptcCgmbGFiZWwoImZpbmlzaCIpKTsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZJTklTSCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzMKKwkmc2V0X2xhYmVsKCJmaW5pc2giLDEpOworCSZtb3YoImVjeCIsCSZ3cGFyYW0oJGl2X29mZikpOwkjIEdldCBpdiBwdHIKKworCSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwkkdG90YWw9MTYrNDsKKwkkdG90YWwrPTQgaWYgKCRwMSA+IDApOworCSR0b3RhbCs9NCBpZiAoJHAyID4gMCk7CisJJHRvdGFsKz00IGlmICgkcDMgPiAwKTsKKwkmYWRkKCJlc3AiLCR0b3RhbCk7CisKKwkmbW92KCZEV1AoMCwiZWN4IiwiIiwwKSwJImVheCIpOwkjIHNhdmUgaXYKKwkmbW92KCZEV1AoNCwiZWN4IiwiIiwwKSwJImVieCIpOwkjIHNhdmUgaXYKKworCSZmdW5jdGlvbl9lbmRfQSgkbmFtZSk7CisKKwkmYWxpZ24oNjQpOworCSZzZXRfbGFiZWwoImNiY19lbmNfam1wX3RhYmxlIik7CisJJmRhdGFfd29yZCgiMCIpOworCSZkYXRhX3dvcmQoJmxhYmVsKCJlajEiKS4iLSIuJmxhYmVsKCJQSUNfcG9pbnQiKSk7CisJJmRhdGFfd29yZCgmbGFiZWwoImVqMiIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkmZGF0YV93b3JkKCZsYWJlbCgiZWozIikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSZkYXRhX3dvcmQoJmxhYmVsKCJlajQiKS4iLSIuJmxhYmVsKCJQSUNfcG9pbnQiKSk7CisJJmRhdGFfd29yZCgmbGFiZWwoImVqNSIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkmZGF0YV93b3JkKCZsYWJlbCgiZWo2IikuIi0iLiZsYWJlbCgiUElDX3BvaW50IikpOworCSZkYXRhX3dvcmQoJmxhYmVsKCJlajciKS4iLSIuJmxhYmVsKCJQSUNfcG9pbnQiKSk7CisJIyBub3QgdXNlZAorCSMmc2V0X2xhYmVsKCJjYmNfZGVjX2ptcF90YWJsZSIsMSk7CisJIyZkYXRhX3dvcmQoIjAiKTsKKwkjJmRhdGFfd29yZCgmbGFiZWwoImRqMSIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkjJmRhdGFfd29yZCgmbGFiZWwoImRqMiIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkjJmRhdGFfd29yZCgmbGFiZWwoImRqMyIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkjJmRhdGFfd29yZCgmbGFiZWwoImRqNCIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkjJmRhdGFfd29yZCgmbGFiZWwoImRqNSIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkjJmRhdGFfd29yZCgmbGFiZWwoImRqNiIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkjJmRhdGFfd29yZCgmbGFiZWwoImRqNyIpLiItIi4mbGFiZWwoIlBJQ19wb2ludCIpKTsKKwkmYWxpZ24oNjQpOworCisJJmZ1bmN0aW9uX2VuZF9CKCRuYW1lKTsKKwkKKwl9CisKKzE7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS9wcGMteGxhdGUucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS9wcGMteGxhdGUucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3OTY3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZXJsYXNtL3BwYy14bGF0ZS5wbApAQCAtMCwwICsxLDE1MiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIFBvd2VyUEMgYXNzZW1ibGVyIGRpc3RpbGxlciBieSA8YXBwcm8+LgorCitteSAkZmxhdm91ciA9IHNoaWZ0OworbXkgJG91dHB1dCA9IHNoaWZ0Oworb3BlbiBTVERPVVQsIj4kb3V0cHV0IiB8fCBkaWUgImNhbid0IG9wZW4gJG91dHB1dDogJCEiOworCitteSAlR0xPQkFMUzsKK215ICRkb3RpbmxvY2FsbGFiZWxzPSgkZmxhdm91cj1+L2xpbnV4Lyk/MTowOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGRpcmVjdGl2ZXMgd2hpY2ggbmVlZCBzcGVjaWFsIHRyZWF0bWVudCBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitteSAkZ2xvYmwgPSBzdWIgeworICAgIG15ICRqdW5rID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkZ2xvYmFsID0gXCRHTE9CQUxTeyRuYW1lfTsKKyAgICBteSAkcmV0OworCisgICAgJG5hbWUgPX4gc3xeW1wuXF9dfHw7CisgCisgICAgU1dJVENIOiBmb3IgKCRmbGF2b3VyKSB7CisJL2FpeC8JCSYmIGRvIHsgJG5hbWUgPSAiLiRuYW1lIjsKKwkJCQlsYXN0OworCQkJICAgICAgfTsKKwkvb3N4LwkJJiYgZG8geyAkbmFtZSA9ICJfJG5hbWUiOworCQkJCWxhc3Q7CisJCQkgICAgICB9OworCS9saW51eC4qMzIvCSYmIGRvIHsJJHJldCAuPSAiLmdsb2JsCSRuYW1lXG4iOworCQkJCSRyZXQgLj0gIi50eXBlCSRuYW1lLFxAZnVuY3Rpb24iOworCQkJCWxhc3Q7CisJCQkgICAgICB9OworCS9saW51eC4qNjQvCSYmIGRvIHsJJHJldCAuPSAiLmdsb2JsCS4kbmFtZVxuIjsKKwkJCQkkcmV0IC49ICIudHlwZQkuJG5hbWUsXEBmdW5jdGlvblxuIjsKKwkJCQkkcmV0IC49ICIuc2VjdGlvbglcIi5vcGRcIixcImF3XCJcbiI7CisJCQkJJHJldCAuPSAiLmdsb2JsCSRuYW1lXG4iOworCQkJCSRyZXQgLj0gIi5hbGlnbgkzXG4iOworCQkJCSRyZXQgLj0gIiRuYW1lOlxuIjsKKwkJCQkkcmV0IC49ICIucXVhZAkuJG5hbWUsLlRPQy5cQHRvY2Jhc2UsMFxuIjsKKwkJCQkkcmV0IC49ICIuc2l6ZQkkbmFtZSwyNFxuIjsKKwkJCQkkcmV0IC49ICIucHJldmlvdXNcbiI7CisKKwkJCQkkbmFtZSA9ICIuJG5hbWUiOworCQkJCWxhc3Q7CisJCQkgICAgICB9OworICAgIH0KKworICAgICRyZXQgPSAiLmdsb2JsCSRuYW1lIiBpZiAoISRyZXQpOworICAgICQkZ2xvYmFsID0gJG5hbWU7CisgICAgJHJldDsKK307CitteSAkdGV4dCA9IHN1YiB7CisgICAgKCRmbGF2b3VyID1+IC9haXgvKSA/ICIuY3NlY3QiIDogIi50ZXh0IjsKK307CitteSAkbWFjaGluZSA9IHN1YiB7CisgICAgbXkgJGp1bmsgPSBzaGlmdDsKKyAgICBteSAkYXJjaCA9IHNoaWZ0OworICAgIGlmICgkZmxhdm91ciA9fiAvb3N4LykKKyAgICB7CSRhcmNoID1+IHMvXCIvL2c7CisJJGFyY2ggPSAoJGZsYXZvdXI9fi82NC8pID8gInBwYzk3MC02NCIgOiAicHBjOTcwIiBpZiAoJGFyY2ggZXEgImFueSIpOworICAgIH0KKyAgICAiLm1hY2hpbmUJJGFyY2giOworfTsKK215ICRhc2NpeiA9IHN1YiB7CisgICAgc2hpZnQ7CisgICAgbXkgJGxpbmUgPSBqb2luKCIsIixAXyk7CisgICAgaWYgKCRsaW5lID1+IC9eIiguKikiJC8pCisgICAgewkiLmJ5dGUJIiAuIGpvaW4oIiwiLHVucGFjaygiQyoiLCQxKSwwKSAuICJcbi5hbGlnbgkyIjsJfQorICAgIGVsc2UKKyAgICB7CSIiOwl9Cit9OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHNpbXBsaWZpZWQgbW5lbW9uaWNzIG5vdCBoYW5kbGVkIGJ5IGF0IGxlYXN0IG9uZSBhc3NlbWJsZXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK215ICRjbXBsdyA9IHN1YiB7CisgICAgbXkgJGYgPSBzaGlmdDsKKyAgICBteSAkY3IgPSAwOyAkY3IgPSBzaGlmdCBpZiAoJCNfPjEpOworICAgICMgU29tZSBvdXQtb2YtZGF0ZSAzMi1iaXQgR05VIGFzc2VtYmxlciBqdXN0IGNhbid0IGhhbmRsZSBjbXBsdy4uLgorICAgICgkZmxhdm91ciA9fiAvbGludXguKjMyLykgPworCSIJLmxvbmcJIi5zcHJpbnRmICIweCV4IiwzMTw8MjZ8JGNyPDwyM3wkX1swXTw8MTZ8JF9bMV08PDExfDY0IDoKKwkiCWNtcGx3CSIuam9pbignLCcsJGNyLEBfKTsKK307CitteSAkYmRueiA9IHN1YiB7CisgICAgbXkgJGYgPSBzaGlmdDsKKyAgICBteSAkYm8gPSAkZj1+L1tcK1wtXS8gPyAxNis5IDogMTY7CSMgb3B0aW9uYWwgInRvIGJlIHRha2VuIiBoaW50CisgICAgIgliYwkkYm8sMCwiLnNoaWZ0OworfSBpZiAoJGZsYXZvdXIhfi9saW51eC8pOworbXkgJGJsdGxyID0gc3ViIHsKKyAgICBteSAkZiA9IHNoaWZ0OworICAgIG15ICRibyA9ICRmPX4vXC0vID8gMTIrMiA6IDEyOwkjIG9wdGlvbmFsICJub3QgdG8gYmUgdGFrZW4iIGhpbnQKKyAgICAoJGZsYXZvdXIgPX4gL2xpbnV4LykgPwkJIyBHTlUgYXMgZG9lc24ndCBhbGxvdyBtb3N0IHJlY2VudCBoaW50cworCSIJLmxvbmcJIi5zcHJpbnRmICIweCV4IiwxOTw8MjZ8JGJvPDwyMXwxNjw8MSA6CisJIgliY2xyCSRibywwIjsKK307CitteSAkYm5lbHIgPSBzdWIgeworICAgIG15ICRmID0gc2hpZnQ7CisgICAgbXkgJGJvID0gJGY9fi9cLS8gPyA0KzIgOiA0OwkjIG9wdGlvbmFsICJub3QgdG8gYmUgdGFrZW4iIGhpbnQKKyAgICAoJGZsYXZvdXIgPX4gL2xpbnV4LykgPwkJIyBHTlUgYXMgZG9lc24ndCBhbGxvdyBtb3N0IHJlY2VudCBoaW50cworCSIJLmxvbmcJIi5zcHJpbnRmICIweCV4IiwxOTw8MjZ8JGJvPDwyMXwyPDwxNnwxNjw8MSA6CisJIgliY2xyCSRibywyIjsKK307CitteSAkYmVxbHIgPSBzdWIgeworICAgIG15ICRmID0gc2hpZnQ7CisgICAgbXkgJGJvID0gJGY9fi8tLyA/IDEyKzIgOiAxMjsJIyBvcHRpb25hbCAibm90IHRvIGJlIHRha2VuIiBoaW50CisgICAgKCRmbGF2b3VyID1+IC9saW51eC8pID8JCSMgR05VIGFzIGRvZXNuJ3QgYWxsb3cgbW9zdCByZWNlbnQgaGludHMKKwkiCS5sb25nCSIuc3ByaW50ZiAiMHglWCIsMTk8PDI2fCRibzw8MjF8Mjw8MTZ8MTY8PDEgOgorCSIJYmNscgkkYm8sMiI7Cit9OworIyBHTlUgYXNzZW1ibGVyIGNhbid0IGhhbmRsZSBleHRyZGkgckEsclMsMTYsNDgsIG9yIHdoZW4gc3VtIG9mIGxhc3QgdHdvCisjIGFyZ3VtZW50cyBpcyA2NCwgd2l0aCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UiIGVycm9yLgorbXkgJGV4dHJkaSA9IHN1YiB7CisgICAgbXkgKCRmLCRyYSwkcnMsJG4sJGIpID0gQF87CisgICAgJGIgPSAoJGIrJG4pJjYzOyAkbiA9IDY0LSRuOworICAgICIJcmxkaWNsCSRyYSwkcnMsJGIsJG4iOworfTsKKword2hpbGUoJGxpbmU9PD4pIHsKKworICAgICRsaW5lID1+IHN8WyMhO10uKiR8fDsJIyBnZXQgcmlkIG9mIGFzbS1zdHlsZSBjb21tZW50cy4uLgorICAgICRsaW5lID1+IHN8L1wqLipcKi98fDsJIyAuLi4gYW5kIEMtc3R5bGUgY29tbWVudHMuLi4KKyAgICAkbGluZSA9fiBzfF5ccyt8fDsJCSMgLi4uIGFuZCBza2lwIHdoaXRlIHNwYWNlcyBpbiBiZWdpbm5pbmcuLi4KKyAgICAkbGluZSA9fiBzfFxzKyR8fDsJCSMgLi4uIGFuZCBhdCB0aGUgZW5kCisKKyAgICB7CisJJGxpbmUgPX4gc3xcYlwuTChcdyspfEwkMXxnOwkjIGNvbW1vbiBkZW5vbWluYXRvciBmb3IgTG9jYWxsYWJlbAorCSRsaW5lID1+IHN8XGJMKFx3Kyl8XC5MJDF8ZwlpZiAoJGRvdGlubG9jYWxsYWJlbHMpOworICAgIH0KKworICAgIHsKKwkkbGluZSA9fiBzfCheW1wuXHddKylcOlxzKnx8OworCW15ICRsYWJlbCA9ICQxOworCXByaW50ZiAiJXM6IiwoJEdMT0JBTFN7JGxhYmVsfSBvciAkbGFiZWwpIGlmICgkbGFiZWwpOworICAgIH0KKworICAgIHsKKwkkbGluZSA9fiBzfF5ccyooXC4/KShcdyspKFtcLlwrXC1dPylccyp8fDsKKwlteSAkYyA9ICQxOyAkYyA9ICJcdCIgaWYgKCRjIGVxICIiKTsKKwlteSAkbW5lbW9uaWMgPSAkMjsKKwlteSAkZiA9ICQzOworCW15ICRvcGNvZGUgPSBldmFsKCJcJCRtbmVtb25pYyIpOworCSRsaW5lID1+IHN8XGJjP1tyZl0oWzAtOV0rKVxifCQxfGcgaWYgKCRjIG5lICIuIiBhbmQgJGZsYXZvdXIgIX4gL29zeC8pOworCWlmIChyZWYoJG9wY29kZSkgZXEgJ0NPREUnKSB7ICRsaW5lID0gJiRvcGNvZGUoJGYsc3BsaXQoJywnLCRsaW5lKSk7IH0KKwllbHNpZiAoJG1uZW1vbmljKSAgICAgICAgICAgeyAkbGluZSA9ICRjLiRtbmVtb25pYy4kZi4iXHQiLiRsaW5lOyB9CisgICAgfQorCisgICAgcHJpbnQgJGxpbmUgaWYgKCRsaW5lKTsKKyAgICBwcmludCAiXG4iOworfQorCitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS9yZWFkbWUgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS9yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyYmJlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZXJsYXNtL3JlYWRtZQpAQCAtMCwwICsxLDEyNCBAQAorVGhlIHBlcmwgc2NyaXB0cyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgbXkgJ2hhY2snIHRvIGdlbmVyYXRlCittdWx0aXBsZSBkaWZmZXJlbnQgYXNzZW1ibGVyIGZvcm1hdHMgdmlhIHRoZSBvbmUgb3JpZ2lvbmFsIHNjcmlwdC4KKworVGhlIHdheSB0byB1c2UgdGhpcyBsaWJyYXJ5IGlzIHRvIHN0YXJ0IHdpdGggYWRkaW5nIHRoZSBwYXRoIHRvIHRoaXMgZGlyZWN0b3J5CithbmQgdGhlbiBpbmNsdWRlIGl0LgorCitwdXNoKEBJTkMsInBlcmxhc20iLCIuLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCitUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgc2V0dXAgdGhlIGZpbGUgYW5kIHR5cGUgb2YgYXNzZW1iZXIKKworJmFzbV9pbml0KCRBUkdWWzBdLCQwKTsKKworVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSAndHlwZScuICBDdXJyZW50bHkKKydjcHAnLCAnc29sJywgJ2Eub3V0JywgJ2VsZicgb3IgJ3dpbjMyJy4KK0FyZ3VtZW50IDIgaXMgdGhlIGZpbGUgbmFtZS4KKworVGhlIHJlY2lwcm9jYWwgZnVuY3Rpb24gaXMKKyZhc21fZmluaXNoKCkgd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBhdCB0aGUgZW5kLgorCitUaGVyZSBhcmUgMiBtYWluICdwYWNrYWdlcycuIHg4Nm1zLnBsLCB3aGljaCBpcyB0aGUgbWljcm9zb2Z0IGFzc2VtYmxlciwKK2FuZCB4ODZ1bml4LnBsIHdoaWNoIGlzIHRoZSB1bml4IChnYXMpIHZlcnNpb24uCisKK0Z1bmN0aW9ucyBvZiBpbnRlcmVzdCBhcmU6CismZXh0ZXJuYWxfbGFiZWwoImRlc19TUHRyYW5zIik7CWRlY2xhcmUgYW5kIGV4dGVybmFsIHZhcmlhYmxlCismTEIocmVnKTsJCQlMb3cgYnl0ZSBmb3IgYSByZWdpc3RlcgorJkhCKHJlZyk7CQkJSGlnaCBieXRlIGZvciBhIHJlZ2lzdGVyCismQlAob2ZmLGJhc2UsaW5kZXgsc2NhbGUpCUJ5dGUgcG9pbnRlciBhZGRyZXNzaW5nCismRFdQKG9mZixiYXNlLGluZGV4LHNjYWxlKQlXb3JkIHBvaW50ZXIgYWRkcmVzc2luZworJnN0YWNrX3B1c2gobnVtKQkJQmFzaWNhbGx5IGEgJ3N1YiBlc3AsIG51bSo0JyB3aXRoIGV4dHJhCismc3RhY2tfcG9wKG51bSkJCQlpbnZlcnNlIG9mIHN0YWNrX3B1c2gKKyZmdW5jdGlvbl9iZWdpbihuYW1lLGV4dHJhKQlTdGFydCBhIGZ1bmN0aW9uIHdpdGggcHVzaGluZyBvZgorCQkJCWVkaSwgZXNpLCBlYnggYW5kIGVicC4gIGV4dHJhIGlzIGV4dHJhIHdpbjMyCisJCQkJZXh0ZXJuYWwgaW5mbyB0aGF0IG1heSBiZSByZXF1aXJlZC4KKyZmdW5jdGlvbl9iZWdpbl9CKG5hbWUsZXh0cmEpCVNhbWUgYXMgbm9ybWEgZnVuY3Rpb25fYmVnaW4gYnV0IG5vIHB1c2hpbmcuCismZnVuY3Rpb25fZW5kKG5hbWUpCQlDYWxsIGF0IGVuZCBvZiBmdW5jdGlvbi4KKyZmdW5jdGlvbl9lbmRfQShuYW1lKQkJU3RhbmRhcmQgcG9wIGFuZCByZXQsIGZvciB1c2UgaW5zaWRlIGZ1bmN0aW9ucworJmZ1bmN0aW9uX2VuZF9CKG5hbWUpCQlDYWxsIGF0IGVuZCBidXQgd2l0aCBwb3Bpbmcgb3IgJ3JldCcuCismc3d0bXAobnVtKQkJCUFkZHJlc3Mgb24gc3RhY2sgdGVtcCB3b3JkLgorJndwYXJhbShudW0pCQkJUGFyYW1ldGVyIG51bWJlciBudW0sIHRoYXQgd2FzIHB1c2gKKwkJCQlpbiBDIGNvbnZlbnRpb24uICBUaGlzIGFsbCB3b3JrcyBvdmVyIHB1c2hlcworCQkJCWFuZCBwb3BzLgorJmNvbW1lbnQoImhlbGxvIHRoZXJlIikJCVB1dCBpbiBhIGNvbW1lbnQuCismbGFiZWwoImxvb3AiKQkJCVJlZmVyIHRvIGEgbGFiZWwsIG5vcm1hbGx5IGEgam1wIHRhcmdldC4KKyZzZXRfbGFiZWwoImxvb3AiKQkJU2V0IGEgbGFiZWwgYXQgdGhpcyBwb2ludC4KKyZkYXRhX3dvcmQod29yZCkJCVB1dCBpbiBhIHdvcmQgb2YgZGF0YS4KKworU28gaG93IGRvZXMgdGhpcyBhbGwgaG9sZCB0b2dldGhlcj8gIEdpdmVuCisKK2ludCBjYWxjKGludCBsZW4sIGludCAqZGF0YSkKKwl7CisJaW50IGksaj0wOworCisJZm9yIChpPTA7IGk8bGVuOyBpKyspCisJCXsKKwkJais9b3RoZXIoZGF0YVtpXSk7CisJCX0KKwl9CisKK1NvIGEgdmVyeSBzaW1wbGUgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGNvdWxkIGJlIGNvZGVkIGFzCisKKwlwdXNoKEBJTkMsInBlcmxhc20iLCIuLi8uLi9wZXJsYXNtIik7CisJcmVxdWlyZSAieDg2YXNtLnBsIjsKKwkKKwkmYXNtX2luaXQoJEFSR1ZbMF0sImNhY2wucGwiKTsKKworCSZleHRlcm5hbF9sYWJlbCgib3RoZXIiKTsKKworCSR0bXAxPQkiZWF4IjsKKwkkaj0JImVkaSI7CisJJGRhdGE9CSJlc2kiOworCSRpPQkiZWJwIjsKKworCSZjb21tZW50KCJhIHNpbXBsZSBmdW5jdGlvbiIpOworCSZmdW5jdGlvbl9iZWdpbigiY2FsYyIpOworCSZtb3YoCSRkYXRhLAkJJndwYXJhbSgxKSk7ICMgZGF0YQorCSZ4b3IoCSRqLAkJJGopOworCSZ4b3IoCSRpLAkJJGkpOworCisJJnNldF9sYWJlbCgibG9vcCIpOworCSZjbXAoCSRpLAkJJndwYXJhbSgwKSk7CisJJmpnZSgJJmxhYmVsKCJlbmQiKSk7CisKKwkmbW92KAkkdG1wMSwJCSZEV1AoMCwkZGF0YSwkaSw0KSk7CisJJnB1c2goCSR0bXAxKTsKKwkmY2FsbCgJIm90aGVyIik7CisJJmFkZCgJJGosCQkiZWF4Iik7CisJJnBvcCgJJHRtcDEpOworCSZpbmMoCSRpKTsKKwkmam1wKAkmbGFiZWwoImxvb3AiKSk7CisKKwkmc2V0X2xhYmVsKCJlbmQiKTsKKwkmbW92KAkiZWF4IiwJCSRqKTsKKworCSZmdW5jdGlvbl9lbmQoImNhbGMiKTsKKworCSZhc21fZmluaXNoKCk7CisKK1RoZSBhYm92ZSBleGFtcGxlIGlzIHZlcnkgdmVyeSB1bm9wdGltaXNlZCBidXQgZ2l2ZXMgYW4gaWRlYSBvZiBob3cKK3RoaW5ncyB3b3JrLgorCitUaGVyZSBpcyBhbHNvIGEgY2JjIG1vZGUgZnVuY3Rpb24gZ2VuZXJhdG9yIGluIGNiYy5wbAorCismY2JjKAkkbmFtZSwKKwkkZW5jcnlwdF9mdW5jdGlvbl9uYW1lLAorCSRkZWNyeXB0X2Z1bmN0aW9uX25hbWUsCisJJHRydWVfaWZfYnl0ZV9zd2FwX25lZWRlZCwKKwkkcGFyYW1ldGVyX251bWJlcl9mb3JfaXYsCisJJHBhcmFtZXRlcl9udW1iZXJfZm9yX2VuY3J5cHRfZmxhZywKKwkkZmlyc3RfcGFyYW1ldGVyX3RvX3Bhc3MsCisJJHNlY29uZF9wYXJhbWV0ZXJfdG9fcGFzcywKKwkkdGhpcmRfcGFyYW1ldGVyX3RvX3Bhc3MpOworCitTbyBmb3IgZXhhbXBsZSwgZ2l2ZW4KK3ZvaWQgQkZfZW5jcnlwdChCRl9MT05HICpkYXRhLEJGX0tFWSAqa2V5KTsKK3ZvaWQgQkZfZGVjcnlwdChCRl9MT05HICpkYXRhLEJGX0tFWSAqa2V5KTsKK3ZvaWQgQkZfY2JjX2VuY3J5cHQodW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwgbG9uZyBsZW5ndGgsCisgICAgICAgIEJGX0tFWSAqa3MsIHVuc2lnbmVkIGNoYXIgKml2LCBpbnQgZW5jKTsKKworJmNiYygiQkZfY2JjX2VuY3J5cHQiLCJCRl9lbmNyeXB0IiwiQkZfZW5jcnlwdCIsMSw0LDUsMywtMSwtMSk7CisKKyZjYmMoImRlc19uY2JjX2VuY3J5cHQiLCJkZXNfZW5jcnlwdCIsImRlc19lbmNyeXB0IiwwLDQsNSwzLDUsLTEpOworJmNiYygiZGVzX2VkZTNfY2JjX2VuY3J5cHQiLCJkZXNfZW5jcnlwdDMiLCJkZXNfZGVjcnlwdDMiLDAsNiw3LDMsNCw1KTsKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3Blcmxhc20veDg2XzY0LXhsYXRlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDY3M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS94ODZfNjQteGxhdGUucGwKQEAgLTAsMCArMSw5MTMgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBBc2NldGljIHg4Nl82NCBBVCZUIHRvIE1BU00vTkFTTSBhc3NlbWJsZXIgdHJhbnNsYXRvciBieSA8YXBwcm8+LgorIworIyBXaHkgQVQmVCB0byBNQVNNIGFuZCBub3QgdmljZSB2ZXJzYT8gU2V2ZXJhbCByZWFzb25zLiBCZWNhdXNlIEFUJlQKKyMgZm9ybWF0IGlzIHdheSBlYXNpZXIgdG8gcGFyc2UuIEJlY2F1c2UgaXQncyBzaW1wbGVyIHRvICJnZWFyIiBmcm9tCisjIFVuaXggQUJJIHRvIFdpbmRvd3Mgb25lIFtzZWUgY3Jvc3MtcmVmZXJlbmNlICJjYXJkIiBhdCB0aGUgZW5kIG9mCisjIGZpbGVdLiBCZWNhdXNlIExpbnV4IHRhcmdldHMgd2VyZSBhdmFpbGFibGUgZmlyc3QuLi4KKyMKKyMgSW4gYWRkaXRpb24gdGhlIHNjcmlwdCBhbHNvICJkaXN0aWxscyIgY29kZSBzdWl0YWJsZSBmb3IgR05VCisjIGFzc2VtYmxlciwgc28gdGhhdCBpdCBjYW4gYmUgY29tcGlsZWQgd2l0aCBtb3JlIHJpZ2lkIGFzc2VtYmxlcnMsCisjIHN1Y2ggYXMgU29sYXJpcyAvdXNyL2Njcy9iaW4vYXMuCisjCisjIFRoaXMgdHJhbnNsYXRvciBpcyBub3QgZGVzaWduZWQgdG8gY29udmVydCAqYXJiaXRyYXJ5KiBhc3NlbWJsZXIKKyMgY29kZSBmcm9tIEFUJlQgZm9ybWF0IHRvIE1BU00gb25lLiBJdCdzIGRlc2lnbmVkIHRvIGNvbnZlcnQganVzdAorIyBlbm91Z2ggdG8gcHJvdmlkZSBmb3IgZHVhbC1BQkkgT3BlblNTTCBtb2R1bGVzIGRldmVsb3BtZW50Li4uCisjIFRoZXJlICphcmUqIGxpbWl0YXRpb25zIGFuZCB5b3UgbWlnaHQgaGF2ZSB0byBtb2RpZnkgeW91ciBhc3NlbWJsZXIKKyMgY29kZSBvciB0aGlzIHNjcmlwdCB0byBhY2hpZXZlIHRoZSBkZXNpcmVkIHJlc3VsdC4uLgorIworIyBDdXJyZW50bHkgcmVjb2duaXplZCBsaW1pdGF0aW9uczoKKyMKKyMgLSBjYW4ndCB1c2UgbXVsdGlwbGUgb3BzIHBlciBsaW5lOworIworIyBEdWFsLUFCSSBzdHlsaW5nIHJ1bGVzLgorIworIyAxLiBBZGhlcmUgdG8gVW5peCByZWdpc3RlciBhbmQgc3RhY2sgbGF5b3V0IFtzZWUgY3Jvc3MtcmVmZXJlbmNlCisjICAgIEFCSSAiY2FyZCIgYXQgdGhlIGVuZCBmb3IgZXhwbGFuYXRpb25dLgorIyAyLiBGb3JnZXQgYWJvdXQgInJlZCB6b25lLCIgc3RpY2sgdG8gbW9yZSB0cmFkaXRpb25hbCBibGVuZGVkCisjICAgIHN0YWNrIGZyYW1lIGFsbG9jYXRpb24uIElmIHZvbGF0aWxlIHN0b3JhZ2UgaXMgYWN0dWFsbHkgcmVxdWlyZWQKKyMgICAgdGhhdCBpcy4gSWYgbm90LCBqdXN0IGxlYXZlIHRoZSBzdGFjayBhcyBpcy4KKyMgMy4gRnVuY3Rpb25zIHRhZ2dlZCB3aXRoICIudHlwZSBuYW1lLEBmdW5jdGlvbiIgZ2V0IGNyYWZ0ZWQgd2l0aAorIyAgICB1bmlmaWVkIFdpbjY0IHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBhdXRvbWF0aWNhbGx5LiBJZiB5b3Ugd2FudAorIyAgICB0byB0YWtlIGNhcmUgb2YgQUJJIGRpZmZlcmVuY2VzIHlvdXJzZWxmLCB0YWcgZnVuY3Rpb25zIGFzCisjICAgICIudHlwZSBuYW1lLEBhYmktb21uaXBvdGVudCIgaW5zdGVhZC4KKyMgNC4gVG8gb3B0aW1pemUgdGhlIFdpbjY0IHByb2xvZ3VlIHlvdSBjYW4gc3BlY2lmeSBudW1iZXIgb2YgaW5wdXQKKyMgICAgYXJndW1lbnRzIGFzICIudHlwZSBuYW1lLEBmdW5jdGlvbixOLiIgS2VlcCBpbiBtaW5kIHRoYXQgaWYgTiBpcworIyAgICBsYXJnZXIgdGhhbiA2LCB0aGVuIHlvdSAqaGF2ZSB0byogd3JpdGUgImFiaS1vbW5pcG90ZW50IiBjb2RlLAorIyAgICBiZWNhdXNlID42IGNhc2VzIGNhbid0IGJlIGFkZHJlc3NlZCB3aXRoIHVuaWZpZWQgcHJvbG9ndWUuCisjIDUuIE5hbWUgbG9jYWwgbGFiZWxzIGFzIC5MKiwgZG8gKm5vdCogdXNlIGR5bmFtaWMgbGFiZWxzIHN1Y2ggYXMgMToKKyMgICAgKHNvcnJ5IGFib3V0IGxhdHRlcikuCisjIDYuIERvbid0IHVzZSBbb3IgaGFuZC1jb2RlIHdpdGggLmJ5dGVdICJyZXAgcmV0LiIgInJldCIgbW5lbW9uaWMgaXMKKyMgICAgcmVxdWlyZWQgdG8gaWRlbnRpZnkgdGhlIHNwb3RzLCB3aGVyZSB0byBpbmplY3QgV2luNjQgZXBpbG9ndWUhCisjICAgIEJ1dCBvbiB0aGUgcHJvcywgaXQncyB0aGVuIHByZWZpeGVkIHdpdGggcmVwIGF1dG9tYXRpY2FsbHk6LSkKKyMgNy4gU3RpY2sgdG8gZXhwbGljaXQgaXAtcmVsYXRpdmUgYWRkcmVzc2luZy4gSWYgeW91IGhhdmUgdG8gdXNlCisjICAgIEdPVFBDUkVMIGFkZHJlc3NpbmcsIHN0aWNrIHRvIG1vdiBzeW1ib2xAR09UUENSRUwoJXJpcCksJXI/Py4KKyMgICAgQm90aCBhcmUgcmVjb2duaXplZCBhbmQgdHJhbnNsYXRlZCB0byBwcm9wZXIgV2luNjQgYWRkcmVzc2luZworIyAgICBtb2Rlcy4gVG8gc3VwcG9ydCBsZWdhY3kgY29kZSBhIHN5bnRoZXRpYyBkaXJlY3RpdmUsIC5waWNtZXVwLAorIyAgICBpcyBpbXBsZW1lbnRlZC4gSXQgcHV0cyBhZGRyZXNzIG9mIHRoZSAqbmV4dCogaW5zdHJ1Y3Rpb24gaW50bworIyAgICB0YXJnZXQgcmVnaXN0ZXIsIGUuZy46CisjCisjCQkucGljbWV1cAklcmF4CisjCQlsZWEJCS5MYWJlbC0uKCVyYXgpLCVyYXgKKyMKKyMgOC4gSW4gb3JkZXIgdG8gcHJvdmlkZSBmb3Igc3RydWN0dXJlZCBleGNlcHRpb24gaGFuZGxpbmcgdW5pZmllZAorIyAgICBXaW42NCBwcm9sb2d1ZSBjb3BpZXMgJXJzcCB2YWx1ZSB0byAlcmF4LiBGb3IgZnVydGhlciBkZXRhaWxzCisjICAgIHNlZSBTRUggcGFyYWdyYXBoIGF0IHRoZSBlbmQuCisjIDkuIC5pbml0IHNlZ21lbnQgaXMgYWxsb3dlZCB0byBjb250YWluIGNhbGxzIHRvIGZ1bmN0aW9ucyBvbmx5LgorIyBhLiBJZiBmdW5jdGlvbiBhY2NlcHRzIG1vcmUgdGhhbiA0IGFyZ3VtZW50cyAqYW5kKiA+NHRoIGFyZ3VtZW50CisjICAgIGlzIGRlY2xhcmVkIGFzIG5vbiA2NC1iaXQgdmFsdWUsIGRvIGNsZWFyIGl0cyB1cHBlciBwYXJ0LgorDAorbXkgJGZsYXZvdXIgPSBzaGlmdDsKK215ICRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKK3sgbXkgKCRzdGRkZXYsJHN0ZGlubyxAanVuayk9c3RhdChTVERPVVQpOworICBteSAoJG91dGRldiwkb3V0aW5vLEBqdW5rKT1zdGF0KCRvdXRwdXQpOworCisgICAgb3BlbiBTVERPVVQsIj4kb3V0cHV0IiB8fCBkaWUgImNhbid0IG9wZW4gJG91dHB1dDogJCEiCisJaWYgKCRzdGRkZXYhPSRvdXRkZXYgfHwgJHN0ZGlubyE9JG91dGlubyk7Cit9CisKK215ICRnYXM9MTsJJGdhcz0wIGlmICgkb3V0cHV0ID1+IC9cLmFzbSQvKTsKK215ICRlbGY9MTsJJGVsZj0wIGlmICghJGdhcyk7CitteSAkd2luNjQ9MDsKK215ICRwcmVmaXg9IiI7CitteSAkZGVjb3I9Ii5MIjsKKworbXkgJG1hc21yZWY9OCArIDUwNzI3KjIqKi0zMjsJIyA4LjAwLjUwNzI3IHNoaXBwZWQgd2l0aCBWUzIwMDUKK215ICRtYXNtPTA7CitteSAkUFRSPSIgUFRSIjsKKworbXkgJG5hc21yZWY9Mi4wMzsKK215ICRuYXNtPTA7CisKK2lmICAgICgkZmxhdm91ciBlcSAibWluZ3c2NCIpCXsgJGdhcz0xOyAkZWxmPTA7ICR3aW42ND0xOworCQkJCSAgJHByZWZpeD1gZWNobyBfX1VTRVJfTEFCRUxfUFJFRklYX18gfCAkRU5We0NDfSAtRSAtUCAtYDsKKwkJCQkgIGNob21wKCRwcmVmaXgpOworCQkJCX0KK2Vsc2lmICgkZmxhdm91ciBlcSAibWFjb3N4IikJeyAkZ2FzPTE7ICRlbGY9MDsgJHByZWZpeD0iXyI7ICRkZWNvcj0iTFwkIjsgfQorZWxzaWYgKCRmbGF2b3VyIGVxICJtYXNtIikJeyAkZ2FzPTA7ICRlbGY9MDsgJG1hc209JG1hc21yZWY7ICR3aW42ND0xOyAkZGVjb3I9IlwkTFwkIjsgfQorZWxzaWYgKCRmbGF2b3VyIGVxICJuYXNtIikJeyAkZ2FzPTA7ICRlbGY9MDsgJG5hc209JG5hc21yZWY7ICR3aW42ND0xOyAkZGVjb3I9IlwkTFwkIjsgJFBUUj0iIjsgfQorZWxzaWYgKCEkZ2FzKQoreyAgIGlmICgkRU5We0FTTX0gPX4gbS9uYXNtLyAmJiBgbmFzbSAtdmAgPX4gbS92ZXJzaW9uIChbMC05XSspXC4oWzAtOV0rKS9pKQorICAgIHsJJG5hc20gPSAkMSArICQyKjAuMDE7ICRQVFI9IiI7ICB9CisgICAgZWxzaWYgKGBtbDY0IDI+JjFgID1+IG0vVmVyc2lvbiAoWzAtOV0rKVwuKFswLTldKykoXC4oWzAtOV0rKSk/LykKKyAgICB7CSRtYXNtID0gJDEgKyAkMioyKiotMTYgKyAkNCoyKiotMzI7ICAgfQorICAgIGRpZSAibm8gYXNzZW1ibGVyIGZvdW5kIG9uICVQQVRIIiBpZiAoISgkbmFzbSB8fCAkbWFzbSkpOworICAgICR3aW42ND0xOworICAgICRlbGY9MDsKKyAgICAkZGVjb3I9IlwkTFwkIjsKK30KKworbXkgJGN1cnJlbnRfc2VnbWVudDsKK215ICRjdXJyZW50X2Z1bmN0aW9uOworbXkgJWdsb2JhbHM7CisKK3sgcGFja2FnZSBvcGNvZGU7CSMgcGljayB1cCBvcGNvZGVzCisgICAgc3ViIHJlIHsKKwlteQkkc2VsZiA9IHNoaWZ0OwkjIHNpbmdsZSBpbnN0YW5jZSBpbiBlbm91Z2guLi4KKwlsb2NhbAkqbGluZSA9IHNoaWZ0OworCXVuZGVmCSRyZXQ7CisKKwlpZiAoJGxpbmUgPX4gL14oW2Etel1bYS16MC05XSopL2kpIHsKKwkgICAgJHNlbGYtPntvcH0gPSAkMTsKKwkgICAgJHJldCA9ICRzZWxmOworCSAgICAkbGluZSA9IHN1YnN0cigkbGluZSxAK1swXSk7ICRsaW5lID1+IHMvXlxzKy8vOworCisJICAgIHVuZGVmICRzZWxmLT57c3p9OworCSAgICBpZiAoJHNlbGYtPntvcH0gPX4gL14obW92eiliLiovKSB7CSMgbW92eiBpcyBwYWluLi4uCisJCSRzZWxmLT57b3B9ID0gJDE7CisJCSRzZWxmLT57c3p9ID0gImIiOworCSAgICB9IGVsc2lmICgkc2VsZi0+e29wfSA9fiAvY2FsbHxqbXAvKSB7CisJCSRzZWxmLT57c3p9ID0gIiI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC9ecC8gJiYgJCcgIX4gL14odXNofG9wKS8pIHsgIyBTU0VuCisJCSRzZWxmLT57c3p9ID0gIiI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC8oW2Etel17Myx9KShbcWx3Yl0pJC8pIHsKKwkJJHNlbGYtPntvcH0gPSAkMTsKKwkJJHNlbGYtPntzen0gPSAkMjsKKwkgICAgfQorCX0KKwkkcmV0OworICAgIH0KKyAgICBzdWIgc2l6ZSB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlteSAkc3ogICA9IHNoaWZ0OworCSRzZWxmLT57c3p9ID0gJHN6IGlmIChkZWZpbmVkKCRzeikgJiYgIWRlZmluZWQoJHNlbGYtPntzen0pKTsKKwkkc2VsZi0+e3N6fTsKKyAgICB9CisgICAgc3ViIG91dCB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKwlpZiAoJGdhcykgeworCSAgICBpZiAoJHNlbGYtPntvcH0gZXEgIm1vdnoiKSB7CSMgbW92eiBpcyBwYWluLi4uCisJCXNwcmludGYgIiVzJXMlcyIsJHNlbGYtPntvcH0sJHNlbGYtPntzen0sc2hpZnQ7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC9ec2V0LykgeyAKKwkJIiRzZWxmLT57b3B9IjsKKwkgICAgfSBlbHNpZiAoJHNlbGYtPntvcH0gZXEgInJldCIpIHsKKwkJbXkgJGVwaWxvZ3VlID0gIiI7CisJCWlmICgkd2luNjQgJiYgJGN1cnJlbnRfZnVuY3Rpb24tPnthYml9IGVxICJzdnI0IikgeworCQkgICAgJGVwaWxvZ3VlID0gIm1vdnEJOCglcnNwKSwlcmRpXG5cdCIgLgorCQkJCSJtb3ZxCTE2KCVyc3ApLCVyc2lcblx0IjsKKwkJfQorCSAgICAJJGVwaWxvZ3VlIC4gIi5ieXRlCTB4ZjMsMHhjMyI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9IGVxICJjYWxsIiAmJiAhJGVsZiAmJiAkY3VycmVudF9zZWdtZW50IGVxICIuaW5pdCIpIHsKKwkJIi5wMmFsaWduXHQzXG5cdC5xdWFkIjsKKwkgICAgfSBlbHNlIHsKKwkJIiRzZWxmLT57b3B9JHNlbGYtPntzen0iOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgJHNlbGYtPntvcH0gPX4gcy9ebW92ei9tb3Z6eC87CisJICAgIGlmICgkc2VsZi0+e29wfSBlcSAicmV0IikgeworCQkkc2VsZi0+e29wfSA9ICIiOworCQlpZiAoJHdpbjY0ICYmICRjdXJyZW50X2Z1bmN0aW9uLT57YWJpfSBlcSAic3ZyNCIpIHsKKwkJICAgICRzZWxmLT57b3B9ID0gIm1vdglyZGksUVdPUkQke1BUUn1bOCtyc3BdXHQ7V0lONjQgZXBpbG9ndWVcblx0Ii4KKwkJCQkgICJtb3YJcnNpLFFXT1JEJHtQVFJ9WzE2K3JzcF1cblx0IjsKKwkgICAgCX0KKwkJJHNlbGYtPntvcH0gLj0gIkRCXHQwRjNoLDBDM2hcdFx0O3JlcHJldCI7CisJICAgIH0gZWxzaWYgKCRzZWxmLT57b3B9ID1+IC9eKHBvcHxwdXNoKWYvKSB7CisJCSRzZWxmLT57b3B9IC49ICRzZWxmLT57c3p9OworCSAgICB9IGVsc2lmICgkc2VsZi0+e29wfSBlcSAiY2FsbCIgJiYgJGN1cnJlbnRfc2VnbWVudCBlcSAiLkNSVFwkWENVIikgeworCQkkc2VsZi0+e29wfSA9ICJBTElHTlx0OFxuXHREUSI7CisJICAgIH0gCisJICAgICRzZWxmLT57b3B9OworCX0KKyAgICB9CisgICAgc3ViIG1uZW1vbmljIHsKKwlteSAkc2VsZj1zaGlmdDsKKwlteSAkb3A9c2hpZnQ7CisJJHNlbGYtPntvcH09JG9wIGlmIChkZWZpbmVkKCRvcCkpOworCSRzZWxmLT57b3B9OworICAgIH0KK30KK3sgcGFja2FnZSBjb25zdDsJIyBwaWNrIHVwIGNvbnN0YW50cywgd2hpY2ggc3RhcnQgd2l0aCAkCisgICAgc3ViIHJlIHsKKwlteQkkc2VsZiA9IHNoaWZ0OwkjIHNpbmdsZSBpbnN0YW5jZSBpbiBlbm91Z2guLi4KKwlsb2NhbAkqbGluZSA9IHNoaWZ0OworCXVuZGVmCSRyZXQ7CisKKwlpZiAoJGxpbmUgPX4gL15cJChbXixdKykvKSB7CisJICAgICRzZWxmLT57dmFsdWV9ID0gJDE7CisJICAgICRyZXQgPSAkc2VsZjsKKwkgICAgJGxpbmUgPSBzdWJzdHIoJGxpbmUsQCtbMF0pOyAkbGluZSA9fiBzL15ccysvLzsKKwl9CisJJHJldDsKKyAgICB9CisgICAgc3ViIG91dCB7CisgICAgCW15ICRzZWxmID0gc2hpZnQ7CisKKwlpZiAoJGdhcykgeworCSAgICAjIFNvbGFyaXMgL3Vzci9jY3MvYmluL2FzIGNhbid0IGhhbmRsZSBtdWx0aXBsaWNhdGlvbnMKKwkgICAgIyBpbiAkc2VsZi0+e3ZhbHVlfQorCSAgICAkc2VsZi0+e3ZhbHVlfSA9fiBzLyg/PCFbXHdcJFwuXSkoMHg/WzAtOWEtZl0rKS9vY3QoJDEpL2VnaTsKKwkgICAgJHNlbGYtPnt2YWx1ZX0gPX4gcy8oWzAtOV0rXHMqW1wqXC9cJV1ccypbMC05XSspL2V2YWwoJDEpL2VnOworCSAgICBzcHJpbnRmICJcJCVzIiwkc2VsZi0+e3ZhbHVlfTsKKwl9IGVsc2UgeworCSAgICAkc2VsZi0+e3ZhbHVlfSA9fiBzLygwYlswLTFdKykvb2N0KCQxKS9laWc7CisJICAgICRzZWxmLT57dmFsdWV9ID1+IHMvMHgoWzAtOWEtZl0rKS8wJDFoL2lnIGlmICgkbWFzbSk7CisJICAgIHNwcmludGYgIiVzIiwkc2VsZi0+e3ZhbHVlfTsKKwl9CisgICAgfQorfQoreyBwYWNrYWdlIGVhOwkJIyBwaWNrIHVwIGVmZmVjdGl2ZSBhZGRyZXNzZXM6IGV4cHIoJXJlZywlcmVnLHNjYWxlKQorICAgIHN1YiByZSB7CisJbXkJJHNlbGYgPSBzaGlmdDsJIyBzaW5nbGUgaW5zdGFuY2UgaW4gZW5vdWdoLi4uCisJbG9jYWwJKmxpbmUgPSBzaGlmdDsKKwl1bmRlZgkkcmV0OworCisJIyBvcHRpb25hbCAqIC0tLXZ2di0tLSBhcHBlYXJzIGluIGluZGlyZWN0IGptcC9jYWxsCisJaWYgKCRsaW5lID1+IC9eKFwqPykoW15cKCxdKilcKChbJVx3LF0rKVwpLykgeworCSAgICAkc2VsZi0+e2FzdGVyaXNrfSA9ICQxOworCSAgICAkc2VsZi0+e2xhYmVsfSA9ICQyOworCSAgICAoJHNlbGYtPntiYXNlfSwkc2VsZi0+e2luZGV4fSwkc2VsZi0+e3NjYWxlfSk9c3BsaXQoLywvLCQzKTsKKwkgICAgJHNlbGYtPntzY2FsZX0gPSAxIGlmICghZGVmaW5lZCgkc2VsZi0+e3NjYWxlfSkpOworCSAgICAkcmV0ID0gJHNlbGY7CisJICAgICRsaW5lID0gc3Vic3RyKCRsaW5lLEArWzBdKTsgJGxpbmUgPX4gcy9eXHMrLy87CisKKwkgICAgaWYgKCR3aW42NCAmJiAkc2VsZi0+e2xhYmVsfSA9fiBzL1xAR09UUENSRUwvLykgeworCQlkaWUgaWYgKG9wY29kZS0+bW5lbW9uaWMoKSBuZSAibW92Iik7CisJCW9wY29kZS0+bW5lbW9uaWMoImxlYSIpOworCSAgICB9CisJICAgICRzZWxmLT57YmFzZX0gID1+IHMvXiUvLzsKKwkgICAgJHNlbGYtPntpbmRleH0gPX4gcy9eJS8vIGlmIChkZWZpbmVkKCRzZWxmLT57aW5kZXh9KSk7CisJfQorCSRyZXQ7CisgICAgfQorICAgIHN1YiBzaXplIHt9CisgICAgc3ViIG91dCB7CisgICAgCW15ICRzZWxmID0gc2hpZnQ7CisJbXkgJHN6ID0gc2hpZnQ7CisKKwkkc2VsZi0+e2xhYmVsfSA9fiBzLyhbX2Etel1bX2EtejAtOV0qKS8kZ2xvYmFsc3skMX0gb3IgJDEvZ2VpOworCSRzZWxmLT57bGFiZWx9ID1+IHMvXC5MLyRkZWNvci9nOworCisJIyBTaWxlbnRseSBjb252ZXJ0IGFsbCBFQXMgdG8gNjQtYml0LiBUaGlzIGlzIHJlcXVpcmVkIGZvcgorCSMgZWxkZXIgR05VIGFzc2VtYmxlciBhbmQgcmVzdWx0cyBpbiBtb3JlIGNvbXBhY3QgY29kZSwKKwkjICpidXQqIG1vc3QgaW1wb3J0YW50bHkgQUVTIG1vZHVsZSBkZXBlbmRzIG9uIHRoaXMgZmVhdHVyZSEKKwkkc2VsZi0+e2luZGV4fSA9fiBzL15bZXJdKC4/WzAtOXhwaV0pW2RdPyQvclwxLzsKKwkkc2VsZi0+e2Jhc2V9ICA9fiBzL15bZXJdKC4/WzAtOXhwaV0pW2RdPyQvclwxLzsKKworCWlmICgkZ2FzKSB7CisJICAgICMgU29sYXJpcyAvdXNyL2Njcy9iaW4vYXMgY2FuJ3QgaGFuZGxlIG11bHRpcGxpY2F0aW9ucworCSAgICAjIGluICRzZWxmLT57bGFiZWx9LCBuZXcgZ2FzIHJlcXVpcmVzIHNpZ24gZXh0ZW5zaW9uLi4uCisJICAgIHVzZSBpbnRlZ2VyOworCSAgICAkc2VsZi0+e2xhYmVsfSA9fiBzLyg/PCFbXHdcJFwuXSkoMHg/WzAtOWEtZl0rKS9vY3QoJDEpL2VnaTsKKwkgICAgJHNlbGYtPntsYWJlbH0gPX4gcy8oWzAtOV0rXHMqW1wqXC9cJV1ccypbMC05XSspL2V2YWwoJDEpL2VnOworCSAgICAkc2VsZi0+e2xhYmVsfSA9fiBzLyhbMC05XSspLyQxPDwzMj4+MzIvZWc7CisJICAgICRzZWxmLT57bGFiZWx9ID1+IHMvXl9fX2ltcF8vX19pbXBfXy8gICBpZiAoJGZsYXZvdXIgZXEgIm1pbmd3NjQiKTsKKworCSAgICBpZiAoZGVmaW5lZCgkc2VsZi0+e2luZGV4fSkpIHsKKwkJc3ByaW50ZiAiJXMlcyglJSVzLCUlJXMsJWQpIiwkc2VsZi0+e2FzdGVyaXNrfSwKKwkJCQkJJHNlbGYtPntsYWJlbH0sJHNlbGYtPntiYXNlfSwKKwkJCQkJJHNlbGYtPntpbmRleH0sJHNlbGYtPntzY2FsZX07CisJICAgIH0gZWxzZSB7CisJCXNwcmludGYgIiVzJXMoJSUlcykiLAkkc2VsZi0+e2FzdGVyaXNrfSwkc2VsZi0+e2xhYmVsfSwkc2VsZi0+e2Jhc2V9OworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgJXN6bWFwID0gKCBiPT4iQllURSRQVFIiLCB3PT4iV09SRCRQVFIiLCBsPT4iRFdPUkQkUFRSIiwgcT0+IlFXT1JEJFBUUiIgKTsKKworCSAgICAkc2VsZi0+e2xhYmVsfSA9fiBzL1wuL1wkL2c7CisJICAgICRzZWxmLT57bGFiZWx9ID1+IHMvKD88IVtcd1wkXC5dKTB4KFswLTlhLWZdKykvMCQxaC9pZzsKKwkgICAgJHNlbGYtPntsYWJlbH0gPSAiKCRzZWxmLT57bGFiZWx9KSIgaWYgKCRzZWxmLT57bGFiZWx9ID1+IC9bXCpcK1wtXC9dLyk7CisJICAgICRzej0icSIgaWYgKCRzZWxmLT57YXN0ZXJpc2t9KTsKKworCSAgICBpZiAoZGVmaW5lZCgkc2VsZi0+e2luZGV4fSkpIHsKKwkJc3ByaW50ZiAiJXNbJXMlcyolZCslc10iLCRzem1hcHskc3p9LAorCQkJCQkkc2VsZi0+e2xhYmVsfT8iJHNlbGYtPntsYWJlbH0rIjoiIiwKKwkJCQkJJHNlbGYtPntpbmRleH0sJHNlbGYtPntzY2FsZX0sCisJCQkJCSRzZWxmLT57YmFzZX07CisJICAgIH0gZWxzaWYgKCRzZWxmLT57YmFzZX0gZXEgInJpcCIpIHsKKwkJc3ByaW50ZiAiJXNbJXNdIiwkc3ptYXB7JHN6fSwkc2VsZi0+e2xhYmVsfTsKKwkgICAgfSBlbHNlIHsKKwkJc3ByaW50ZiAiJXNbJXMlc10iLCRzem1hcHskc3p9LAorCQkJCQkkc2VsZi0+e2xhYmVsfT8iJHNlbGYtPntsYWJlbH0rIjoiIiwKKwkJCQkJJHNlbGYtPntiYXNlfTsKKwkgICAgfQorCX0KKyAgICB9Cit9Cit7IHBhY2thZ2UgcmVnaXN0ZXI7CSMgcGljayB1cCByZWdpc3RlcnMsIHdoaWNoIHN0YXJ0IHdpdGggJS4KKyAgICBzdWIgcmUgeworCW15CSRjbGFzcyA9IHNoaWZ0OwkjIG11bGlwbGUgaW5zdGFuY2VzLi4uCisJbXkJJHNlbGYgPSB7fTsKKwlsb2NhbAkqbGluZSA9IHNoaWZ0OworCXVuZGVmCSRyZXQ7CisKKwkjIG9wdGlvbmFsICogLS0tdnZ2LS0tIGFwcGVhcnMgaW4gaW5kaXJlY3Qgam1wL2NhbGwKKwlpZiAoJGxpbmUgPX4gL14oXCo/KSUoXHcrKS8pIHsKKwkgICAgYmxlc3MgJHNlbGYsJGNsYXNzOworCSAgICAkc2VsZi0+e2FzdGVyaXNrfSA9ICQxOworCSAgICAkc2VsZi0+e3ZhbHVlfSA9ICQyOworCSAgICAkcmV0ID0gJHNlbGY7CisJICAgICRsaW5lID0gc3Vic3RyKCRsaW5lLEArWzBdKTsgJGxpbmUgPX4gcy9eXHMrLy87CisJfQorCSRyZXQ7CisgICAgfQorICAgIHN1YiBzaXplIHsKKwlteQkkc2VsZiA9IHNoaWZ0OworCXVuZGVmCSRyZXQ7CisKKwlpZiAgICAoJHNlbGYtPnt2YWx1ZX0gPX4gL15yW1xkXStiJC9pKQl7ICRyZXQ9ImIiOyB9CisJZWxzaWYgKCRzZWxmLT57dmFsdWV9ID1+IC9ecltcZF0rdyQvaSkJeyAkcmV0PSJ3IjsgfQorCWVsc2lmICgkc2VsZi0+e3ZhbHVlfSA9fiAvXnJbXGRdK2QkL2kpCXsgJHJldD0ibCI7IH0KKwllbHNpZiAoJHNlbGYtPnt2YWx1ZX0gPX4gL15yW1x3XSskL2kpCXsgJHJldD0icSI7IH0KKwllbHNpZiAoJHNlbGYtPnt2YWx1ZX0gPX4gL15bYS1kXVtobF0kL2kpeyAkcmV0PSJiIjsgfQorCWVsc2lmICgkc2VsZi0+e3ZhbHVlfSA9fiAvXltcd117Mn1sJC9pKQl7ICRyZXQ9ImIiOyB9CisJZWxzaWYgKCRzZWxmLT57dmFsdWV9ID1+IC9eW1x3XXsyfSQvaSkJeyAkcmV0PSJ3IjsgfQorCWVsc2lmICgkc2VsZi0+e3ZhbHVlfSA9fiAvXmVbYS16XXsyfSQvaSl7ICRyZXQ9ImwiOyB9CisKKwkkcmV0OworICAgIH0KKyAgICBzdWIgb3V0IHsKKyAgICAJbXkgJHNlbGYgPSBzaGlmdDsKKwlpZiAoJGdhcykJeyBzcHJpbnRmICIlcyUlJXMiLCRzZWxmLT57YXN0ZXJpc2t9LCRzZWxmLT57dmFsdWV9OyB9CisJZWxzZQkJeyAkc2VsZi0+e3ZhbHVlfTsgfQorICAgIH0KK30KK3sgcGFja2FnZSBsYWJlbDsJIyBwaWNrIHVwIGxhYmVscywgd2hpY2ggZW5kIHdpdGggOgorICAgIHN1YiByZSB7CisJbXkJJHNlbGYgPSBzaGlmdDsJIyBzaW5nbGUgaW5zdGFuY2UgaXMgZW5vdWdoLi4uCisJbG9jYWwJKmxpbmUgPSBzaGlmdDsKKwl1bmRlZgkkcmV0OworCisJaWYgKCRsaW5lID1+IC8oXltcLlx3XSspXDovKSB7CisJICAgICRzZWxmLT57dmFsdWV9ID0gJDE7CisJICAgICRyZXQgPSAkc2VsZjsKKwkgICAgJGxpbmUgPSBzdWJzdHIoJGxpbmUsQCtbMF0pOyAkbGluZSA9fiBzL15ccysvLzsKKworCSAgICAkc2VsZi0+e3ZhbHVlfSA9fiBzL15cLkwvJGRlY29yLzsKKwl9CisJJHJldDsKKyAgICB9CisgICAgc3ViIG91dCB7CisJbXkgJHNlbGYgPSBzaGlmdDsKKworCWlmICgkZ2FzKSB7CisJICAgIG15ICRmdW5jID0gKCRnbG9iYWxzeyRzZWxmLT57dmFsdWV9fSBvciAkc2VsZi0+e3ZhbHVlfSkgLiAiOiI7CisJICAgIGlmICgkd2luNjQJJiYKKwkJCSRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX0gZXEgJHNlbGYtPnt2YWx1ZX0gJiYKKwkJCSRjdXJyZW50X2Z1bmN0aW9uLT57YWJpfSBlcSAic3ZyNCIpIHsKKwkJJGZ1bmMgLj0gIlxuIjsKKwkJJGZ1bmMgLj0gIgltb3ZxCSVyZGksOCglcnNwKVxuIjsKKwkJJGZ1bmMgLj0gIgltb3ZxCSVyc2ksMTYoJXJzcClcbiI7CisJCSRmdW5jIC49ICIJbW92cQklcnNwLCVyYXhcbiI7CisJCSRmdW5jIC49ICIke2RlY29yfVNFSF9iZWdpbl8kY3VycmVudF9mdW5jdGlvbi0+e25hbWV9OlxuIjsKKwkJbXkgJG5hcmcgPSAkY3VycmVudF9mdW5jdGlvbi0+e25hcmd9OworCQkkbmFyZz02IGlmICghZGVmaW5lZCgkbmFyZykpOworCQkkZnVuYyAuPSAiCW1vdnEJJXJjeCwlcmRpXG4iIGlmICgkbmFyZz4wKTsKKwkJJGZ1bmMgLj0gIgltb3ZxCSVyZHgsJXJzaVxuIiBpZiAoJG5hcmc+MSk7CisJCSRmdW5jIC49ICIJbW92cQklcjgsJXJkeFxuIiAgaWYgKCRuYXJnPjIpOworCQkkZnVuYyAuPSAiCW1vdnEJJXI5LCVyY3hcbiIgIGlmICgkbmFyZz4zKTsKKwkJJGZ1bmMgLj0gIgltb3ZxCTQwKCVyc3ApLCVyOFxuIiBpZiAoJG5hcmc+NCk7CisJCSRmdW5jIC49ICIJbW92cQk0OCglcnNwKSwlcjlcbiIgaWYgKCRuYXJnPjUpOworCSAgICB9CisJICAgICRmdW5jOworCX0gZWxzaWYgKCRzZWxmLT57dmFsdWV9IG5lICIkY3VycmVudF9mdW5jdGlvbi0+e25hbWV9IikgeworCSAgICAkc2VsZi0+e3ZhbHVlfSAuPSAiOiIgaWYgKCRtYXNtICYmICRyZXQhfm0vXlwkLyk7CisJICAgICRzZWxmLT57dmFsdWV9IC4gIjoiOworCX0gZWxzaWYgKCR3aW42NCAmJiAkY3VycmVudF9mdW5jdGlvbi0+e2FiaX0gZXEgInN2cjQiKSB7CisJICAgIG15ICRmdW5jID0JIiRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX0iIC4KKwkJCSgkbmFzbSA/ICI6IiA6ICJcdFBST0MgJGN1cnJlbnRfZnVuY3Rpb24tPntzY29wZX0iKSAuCisJCQkiXG4iOworCSAgICAkZnVuYyAuPSAiCW1vdglRV09SRCR7UFRSfVs4K3JzcF0scmRpXHQ7V0lONjQgcHJvbG9ndWVcbiI7CisJICAgICRmdW5jIC49ICIJbW92CVFXT1JEJHtQVFJ9WzE2K3JzcF0scnNpXG4iOworCSAgICAkZnVuYyAuPSAiCW1vdglyYXgscnNwXG4iOworCSAgICAkZnVuYyAuPSAiJHtkZWNvcn1TRUhfYmVnaW5fJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfToiOworCSAgICAkZnVuYyAuPSAiOiIgaWYgKCRtYXNtKTsKKwkgICAgJGZ1bmMgLj0gIlxuIjsKKwkgICAgbXkgJG5hcmcgPSAkY3VycmVudF9mdW5jdGlvbi0+e25hcmd9OworCSAgICAkbmFyZz02IGlmICghZGVmaW5lZCgkbmFyZykpOworCSAgICAkZnVuYyAuPSAiCW1vdglyZGkscmN4XG4iIGlmICgkbmFyZz4wKTsKKwkgICAgJGZ1bmMgLj0gIgltb3YJcnNpLHJkeFxuIiBpZiAoJG5hcmc+MSk7CisJICAgICRmdW5jIC49ICIJbW92CXJkeCxyOFxuIiAgaWYgKCRuYXJnPjIpOworCSAgICAkZnVuYyAuPSAiCW1vdglyY3gscjlcbiIgIGlmICgkbmFyZz4zKTsKKwkgICAgJGZ1bmMgLj0gIgltb3YJcjgsUVdPUkQke1BUUn1bNDArcnNwXVxuIiBpZiAoJG5hcmc+NCk7CisJICAgICRmdW5jIC49ICIJbW92CXI5LFFXT1JEJHtQVFJ9WzQ4K3JzcF1cbiIgaWYgKCRuYXJnPjUpOworCSAgICAkZnVuYyAuPSAiXG4iOworCX0gZWxzZSB7CisJICAgIiRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX0iLgorCQkJKCRuYXNtID8gIjoiIDogIlx0UFJPQyAkY3VycmVudF9mdW5jdGlvbi0+e3Njb3BlfSIpOworCX0KKyAgICB9Cit9Cit7IHBhY2thZ2UgZXhwcjsJCSMgcGljayB1cCBleHByZXNzaW9pbnMKKyAgICBzdWIgcmUgeworCW15CSRzZWxmID0gc2hpZnQ7CSMgc2luZ2xlIGluc3RhbmNlIGlzIGVub3VnaC4uLgorCWxvY2FsCSpsaW5lID0gc2hpZnQ7CisJdW5kZWYJJHJldDsKKworCWlmICgkbGluZSA9fiAvKF5bXixdKykvKSB7CisJICAgICRzZWxmLT57dmFsdWV9ID0gJDE7CisJICAgICRyZXQgPSAkc2VsZjsKKwkgICAgJGxpbmUgPSBzdWJzdHIoJGxpbmUsQCtbMF0pOyAkbGluZSA9fiBzL15ccysvLzsKKworCSAgICAkc2VsZi0+e3ZhbHVlfSA9fiBzL1xAUExULy8gaWYgKCEkZWxmKTsKKwkgICAgJHNlbGYtPnt2YWx1ZX0gPX4gcy8oW19hLXpdW19hLXowLTldKikvJGdsb2JhbHN7JDF9IG9yICQxL2dlaTsKKwkgICAgJHNlbGYtPnt2YWx1ZX0gPX4gcy9cLkwvJGRlY29yL2c7CisJfQorCSRyZXQ7CisgICAgfQorICAgIHN1YiBvdXQgeworCW15ICRzZWxmID0gc2hpZnQ7CisJaWYgKCRuYXNtICYmIG9wY29kZS0+bW5lbW9uaWMoKT1+bS9eai8pIHsKKwkgICAgIk5FQVIgIi4kc2VsZi0+e3ZhbHVlfTsKKwl9IGVsc2UgeworCSAgICAkc2VsZi0+e3ZhbHVlfTsKKwl9CisgICAgfQorfQoreyBwYWNrYWdlIGRpcmVjdGl2ZTsJIyBwaWNrIHVwIGRpcmVjdGl2ZXMsIHdoaWNoIHN0YXJ0IHdpdGggLgorICAgIHN1YiByZSB7CisJbXkJJHNlbGYgPSBzaGlmdDsJIyBzaW5nbGUgaW5zdGFuY2UgaXMgZW5vdWdoLi4uCisJbG9jYWwJKmxpbmUgPSBzaGlmdDsKKwl1bmRlZgkkcmV0OworCW15CSRkaXI7CisJbXkJJW9wY29kZSA9CSMgbGVhIDJmLTFmKCVyaXApLCVkc3Q7IDE6IG5vcDsgMjoKKwkJKAkiJXJheCI9PjB4MDEwNThkNDgsCSIlcmN4Ij0+MHgwMTBkOGQ0OCwKKwkJCSIlcmR4Ij0+MHgwMTE1OGQ0OCwJIiVyYngiPT4weDAxMWQ4ZDQ4LAorCQkJIiVyc3AiPT4weDAxMjU4ZDQ4LAkiJXJicCI9PjB4MDEyZDhkNDgsCisJCQkiJXJzaSI9PjB4MDEzNThkNDgsCSIlcmRpIj0+MHgwMTNkOGQ0OCwKKwkJCSIlcjgiID0+MHgwMTA1OGQ0YywJIiVyOSIgPT4weDAxMGQ4ZDRjLAorCQkJIiVyMTAiPT4weDAxMTU4ZDRjLAkiJXIxMSI9PjB4MDExZDhkNGMsCisJCQkiJXIxMiI9PjB4MDEyNThkNGMsCSIlcjEzIj0+MHgwMTJkOGQ0YywKKwkJCSIlcjE0Ij0+MHgwMTM1OGQ0YywJIiVyMTUiPT4weDAxM2Q4ZDRjCSk7CisKKwlpZiAoJGxpbmUgPX4gL15ccyooXC5cdyspLykgeworCSAgICAkZGlyID0gJDE7CisJICAgICRyZXQgPSAkc2VsZjsKKwkgICAgdW5kZWYgJHNlbGYtPnt2YWx1ZX07CisJICAgICRsaW5lID0gc3Vic3RyKCRsaW5lLEArWzBdKTsgJGxpbmUgPX4gcy9eXHMrLy87CisKKwkgICAgU1dJVENIOiBmb3IgKCRkaXIpIHsKKwkJL1wucGljbWV1cC8gJiYgZG8geyBpZiAoJGxpbmUgPX4gLyglcltcd10rKS9pKSB7CisJCQkgICAgCQkkZGlyPSJcdC5sb25nIjsKKwkJCQkJJGxpbmU9c3ByaW50ZiAiMHgleCwweDkwMDAwMDAwIiwkb3Bjb2RleyQxfTsKKwkJCQkgICAgfQorCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkJL1wuZ2xvYmFsfFwuZ2xvYmx8XC5leHRlcm4vCisJCQkgICAgJiYgZG8geyAkZ2xvYmFsc3skbGluZX0gPSAkcHJlZml4IC4gJGxpbmU7CisJCQkJICAgICRsaW5lID0gJGdsb2JhbHN7JGxpbmV9IGlmICgkcHJlZml4KTsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJCS9cLnR5cGUvICAgICYmIGRvIHsgKCRzeW0sJHR5cGUsJG5hcmcpID0gc3BsaXQoJywnLCRsaW5lKTsKKwkJCQkgICAgaWYgKCR0eXBlIGVxICJcQGZ1bmN0aW9uIikgeworCQkJCQl1bmRlZiAkY3VycmVudF9mdW5jdGlvbjsKKwkJCQkJJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfSA9ICRzeW07CisJCQkJCSRjdXJyZW50X2Z1bmN0aW9uLT57YWJpfSAgPSAic3ZyNCI7CisJCQkJCSRjdXJyZW50X2Z1bmN0aW9uLT57bmFyZ30gPSAkbmFyZzsKKwkJCQkJJGN1cnJlbnRfZnVuY3Rpb24tPntzY29wZX0gPSBkZWZpbmVkKCRnbG9iYWxzeyRzeW19KT8iUFVCTElDIjoiUFJJVkFURSI7CisJCQkJICAgIH0gZWxzaWYgKCR0eXBlIGVxICJcQGFiaS1vbW5pcG90ZW50IikgeworCQkJCQl1bmRlZiAkY3VycmVudF9mdW5jdGlvbjsKKwkJCQkJJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfSA9ICRzeW07CisJCQkJCSRjdXJyZW50X2Z1bmN0aW9uLT57c2NvcGV9ID0gZGVmaW5lZCgkZ2xvYmFsc3skc3ltfSk/IlBVQkxJQyI6IlBSSVZBVEUiOworCQkJCSAgICB9CisJCQkJICAgICRsaW5lID1+IHMvXEBhYmlcLW9tbmlwb3RlbnQvXEBmdW5jdGlvbi87CisJCQkJICAgICRsaW5lID1+IHMvXEBmdW5jdGlvbi4qL1xAZnVuY3Rpb24vOworCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkJL1wuYXNjaXovICAgJiYgZG8geyBpZiAoJGxpbmUgPX4gL14iKC4qKSIkLykgeworCQkJCQkkZGlyICA9ICIuYnl0ZSI7CisJCQkJCSRsaW5lID0gam9pbigiLCIsdW5wYWNrKCJDKiIsJDEpLDApOworCQkJCSAgICB9CisJCQkJICAgIGxhc3Q7CisJCQkJICB9OworCQkvXC5ydmF8XC5sb25nfFwucXVhZC8KKwkJCSAgICAmJiBkbyB7ICRsaW5lID1+IHMvKFtfYS16XVtfYS16MC05XSopLyRnbG9iYWxzeyQxfSBvciAkMS9nZWk7CisJCQkJICAgICRsaW5lID1+IHMvXC5MLyRkZWNvci9nOworCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkgICAgfQorCisJICAgIGlmICgkZ2FzKSB7CisJCSRzZWxmLT57dmFsdWV9ID0gJGRpciAuICJcdCIgLiAkbGluZTsKKworCQlpZiAoJGRpciA9fiAvXC5leHRlcm4vKSB7CisJCSAgICAkc2VsZi0+e3ZhbHVlfSA9ICIiOyAjIHN3YWxsb3cgZXh0ZXJuCisJCX0gZWxzaWYgKCEkZWxmICYmICRkaXIgPX4gL1wudHlwZS8pIHsKKwkJICAgICRzZWxmLT57dmFsdWV9ID0gIiI7CisJCSAgICAkc2VsZi0+e3ZhbHVlfSA9ICIuZGVmXHQiIC4gKCRnbG9iYWxzeyQxfSBvciAkMSkgLiAiO1x0IiAuCisJCQkJKGRlZmluZWQoJGdsb2JhbHN7JDF9KT8iLnNjbCAyOyI6Ii5zY2wgMzsiKSAuCisJCQkJIlx0LnR5cGUgMzI7XHQuZW5kZWYiCisJCQkJaWYgKCR3aW42NCAmJiAkbGluZSA9fiAvKFteLF0rKSxcQGZ1bmN0aW9uLyk7CisJCX0gZWxzaWYgKCEkZWxmICYmICRkaXIgPX4gL1wuc2l6ZS8pIHsKKwkJICAgICRzZWxmLT57dmFsdWV9ID0gIiI7CisJCSAgICBpZiAoZGVmaW5lZCgkY3VycmVudF9mdW5jdGlvbikpIHsKKwkJCSRzZWxmLT57dmFsdWV9IC49ICIke2RlY29yfVNFSF9lbmRfJGN1cnJlbnRfZnVuY3Rpb24tPntuYW1lfToiCisJCQkJaWYgKCR3aW42NCAmJiAkY3VycmVudF9mdW5jdGlvbi0+e2FiaX0gZXEgInN2cjQiKTsKKwkJCXVuZGVmICRjdXJyZW50X2Z1bmN0aW9uOworCQkgICAgfQorCQl9IGVsc2lmICghJGVsZiAmJiAkZGlyID1+IC9cLmFsaWduLykgeworCQkgICAgJHNlbGYtPnt2YWx1ZX0gPSAiLnAyYWxpZ25cdCIgLiAobG9nKCRsaW5lKS9sb2coMikpOworCQl9IGVsc2lmICgkZGlyIGVxICIuc2VjdGlvbiIpIHsKKwkJICAgICRjdXJyZW50X3NlZ21lbnQ9JGxpbmU7CisJCSAgICBpZiAoISRlbGYgJiYgJGN1cnJlbnRfc2VnbWVudCBlcSAiLmluaXQiKSB7CisJCQlpZgkoJGZsYXZvdXIgZXEgIm1hY29zeCIpCXsgJHNlbGYtPnt2YWx1ZX0gPSAiLm1vZF9pbml0X2Z1bmMiOyB9CisJCQllbHNpZgkoJGZsYXZvdXIgZXEgIm1pbmd3NjQiKQl7ICRzZWxmLT57dmFsdWV9ID0gIi5zZWN0aW9uXHQuY3RvcnMiOyB9CisJCSAgICB9CisJCX0gZWxzaWYgKCRkaXIgPX4gL1wuKHRleHR8ZGF0YSkvKSB7CisJCSAgICAkY3VycmVudF9zZWdtZW50PSIuJDEiOworCQl9CisJCSRsaW5lID0gIiI7CisJCXJldHVybiAkc2VsZjsKKwkgICAgfQorCisJICAgICMgbm9uLWdhcyBjYXNlIG9yIG5hc20vbWFzbQorCSAgICBTV0lUQ0g6IGZvciAoJGRpcikgeworCQkvXC50ZXh0LyAgICAmJiBkbyB7IG15ICR2PXVuZGVmOworCQkJCSAgICBpZiAoJG5hc20pIHsKKwkJCQkJJHY9InNlY3Rpb24JLnRleHQgY29kZSBhbGlnbj02NFxuIjsKKwkJCQkgICAgfSBlbHNlIHsKKwkJCQkJJHY9IiRjdXJyZW50X3NlZ21lbnRcdEVORFNcbiIgaWYgKCRjdXJyZW50X3NlZ21lbnQpOworCQkJCQkkY3VycmVudF9zZWdtZW50ID0gIi50ZXh0XCQiOworCQkJCQkkdi49IiRjdXJyZW50X3NlZ21lbnRcdFNFR01FTlQgIjsKKwkJCQkJJHYuPSRtYXNtPj0kbWFzbXJlZiA/ICJBTElHTig2NCkiIDogIlBBR0UiOworCQkJCQkkdi49IiAnQ09ERSciOworCQkJCSAgICB9CisJCQkJICAgICRzZWxmLT57dmFsdWV9ID0gJHY7CisJCQkJICAgIGxhc3Q7CisJCQkJICB9OworCQkvXC5kYXRhLyAgICAmJiBkbyB7IG15ICR2PXVuZGVmOworCQkJCSAgICBpZiAoJG5hc20pIHsKKwkJCQkJJHY9InNlY3Rpb24JLmRhdGEgZGF0YSBhbGlnbj04XG4iOworCQkJCSAgICB9IGVsc2UgeworCQkJCQkkdj0iJGN1cnJlbnRfc2VnbWVudFx0RU5EU1xuIiBpZiAoJGN1cnJlbnRfc2VnbWVudCk7CisJCQkJCSRjdXJyZW50X3NlZ21lbnQgPSAiX0RBVEEiOworCQkJCQkkdi49IiRjdXJyZW50X3NlZ21lbnRcdFNFR01FTlQiOworCQkJCSAgICB9CisJCQkJICAgICRzZWxmLT57dmFsdWV9ID0gJHY7CisJCQkJICAgIGxhc3Q7CisJCQkJICB9OworCQkvXC5zZWN0aW9uLyAmJiBkbyB7IG15ICR2PXVuZGVmOworCQkJCSAgICAkbGluZSA9fiBzLyhbXixdKikuKi8kMS87CisJCQkJICAgICRsaW5lID0gIi5DUlRcJFhDVSIgaWYgKCRsaW5lIGVxICIuaW5pdCIpOworCQkJCSAgICBpZiAoJG5hc20pIHsKKwkJCQkJJHY9InNlY3Rpb24JJGxpbmUiOworCQkJCQlpZiAoJGxpbmU9fi9cLihbcHhdKWRhdGEvKSB7CisJCQkJCSAgICAkdi49IiByZGF0YSBhbGlnbj0iOworCQkJCQkgICAgJHYuPSQxIGVxICJwIj8gNCA6IDg7CisJCQkJCX0KKwkJCQkgICAgfSBlbHNlIHsKKwkJCQkJJHY9IiRjdXJyZW50X3NlZ21lbnRcdEVORFNcbiIgaWYgKCRjdXJyZW50X3NlZ21lbnQpOworCQkJCQkkdi49IiRsaW5lXHRTRUdNRU5UIjsKKwkJCQkJaWYgKCRsaW5lPX4vXC4oW3B4XSlkYXRhLykgeworCQkJCQkgICAgJHYuPSIgUkVBRE9OTFkiOworCQkJCQkgICAgJHYuPSIgQUxJR04oIi4oJDEgZXEgInAiID8gNCA6IDgpLiIpIiBpZiAoJG1hc20+PSRtYXNtcmVmKTsKKwkJCQkJfQorCQkJCSAgICB9CisJCQkJICAgICRjdXJyZW50X3NlZ21lbnQgPSAkbGluZTsKKwkJCQkgICAgJHNlbGYtPnt2YWx1ZX0gPSAkdjsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJCS9cLmV4dGVybi8gICYmIGRvIHsgJHNlbGYtPnt2YWx1ZX0gID0gIkVYVEVSTlx0Ii4kbGluZTsKKwkJCQkgICAgJHNlbGYtPnt2YWx1ZX0gLj0gIjpORUFSIiBpZiAoJG1hc20pOworCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkJL1wuZ2xvYmx8Lmdsb2JhbC8KKwkJCSAgICAmJiBkbyB7ICRzZWxmLT57dmFsdWV9ICA9ICRtYXNtPyJQVUJMSUMiOiJnbG9iYWwiOworCQkJCSAgICAkc2VsZi0+e3ZhbHVlfSAuPSAiXHQiLiRsaW5lOworCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkJL1wuc2l6ZS8gICAgJiYgZG8geyBpZiAoZGVmaW5lZCgkY3VycmVudF9mdW5jdGlvbikpIHsKKwkJCQkJdW5kZWYgJHNlbGYtPnt2YWx1ZX07CisJCQkJCWlmICgkY3VycmVudF9mdW5jdGlvbi0+e2FiaX0gZXEgInN2cjQiKSB7CisJCQkJCSAgICAkc2VsZi0+e3ZhbHVlfT0iJHtkZWNvcn1TRUhfZW5kXyRjdXJyZW50X2Z1bmN0aW9uLT57bmFtZX06IjsKKwkJCQkJICAgICRzZWxmLT57dmFsdWV9Lj0iOlxuIiBpZigkbWFzbSk7CisJCQkJCX0KKwkJCQkJJHNlbGYtPnt2YWx1ZX0uPSIkY3VycmVudF9mdW5jdGlvbi0+e25hbWV9XHRFTkRQIiBpZigkbWFzbSk7CisJCQkJCXVuZGVmICRjdXJyZW50X2Z1bmN0aW9uOworCQkJCSAgICB9CisJCQkJICAgIGxhc3Q7CisJCQkJICB9OworCQkvXC5hbGlnbi8gICAmJiBkbyB7ICRzZWxmLT57dmFsdWV9ID0gIkFMSUdOXHQiLiRsaW5lOyBsYXN0OyB9OworCQkvXC4odmFsdWV8bG9uZ3xydmF8cXVhZCkvCisJCQkgICAgJiYgZG8geyBteSAkc3ogID0gc3Vic3RyKCQxLDAsMSk7CisJCQkJICAgIG15IEBhcnIgPSBzcGxpdCgvLFxzKi8sJGxpbmUpOworCQkJCSAgICBteSAkbGFzdCA9IHBvcChAYXJyKTsKKwkJCQkgICAgbXkgJGNvbnYgPSBzdWIgIHsJbXkgJHZhcj1zaGlmdDsKKwkJCQkJCQkkdmFyPX5zL14oMGJbMC0xXSspL29jdCgkMSkvZWlnOworCQkJCQkJCSR2YXI9fnMvXjB4KFswLTlhLWZdKykvMCQxaC9pZyBpZiAoJG1hc20pOworCQkJCQkJCWlmICgkc3ogZXEgIkQiICYmICgkY3VycmVudF9zZWdtZW50PX4vLltweF1kYXRhLyB8fCAkZGlyIGVxICIucnZhIikpCisJCQkJCQkJeyAkdmFyPX5zLyhbX2EtelwkXEBdW19hLXowLTlcJFxAXSopLyRuYXNtPyIkMSB3cnQgLi5pbWFnZWJhc2UiOiJpbWFnZXJlbCAkMSIvZWdpOyB9CisJCQkJCQkJJHZhcjsKKwkJCQkJCSAgICB9OyAgCisKKwkJCQkgICAgJHN6ID1+IHRyL2J2bHJxL0JXRERRLzsKKwkJCQkgICAgJHNlbGYtPnt2YWx1ZX0gPSAiXHREJHN6XHQiOworCQkJCSAgICBmb3IgKEBhcnIpIHsgJHNlbGYtPnt2YWx1ZX0gLj0gJiRjb252KCRfKS4iLCI7IH0KKwkJCQkgICAgJHNlbGYtPnt2YWx1ZX0gLj0gJiRjb252KCRsYXN0KTsKKwkJCQkgICAgbGFzdDsKKwkJCQkgIH07CisJCS9cLmJ5dGUvICAgICYmIGRvIHsgbXkgQHN0cj1zcGxpdCgvLFxzKi8sJGxpbmUpOworCQkJCSAgICBtYXAocy8oMGJbMC0xXSspL29jdCgkMSkvZWlnLEBzdHIpOworCQkJCSAgICBtYXAocy8weChbMC05YS1mXSspLzAkMWgvaWcsQHN0cikgaWYgKCRtYXNtKTsJCisJCQkJICAgIHdoaWxlICgkI3N0cj4xNSkgeworCQkJCQkkc2VsZi0+e3ZhbHVlfS49IkRCXHQiCisJCQkJCQkuam9pbigiLCIsQHN0clswLi4xNV0pLiJcbiI7CisJCQkJCWZvcmVhY2ggKDAuLjE1KSB7IHNoaWZ0IEBzdHI7IH0KKwkJCQkgICAgfQorCQkJCSAgICAkc2VsZi0+e3ZhbHVlfS49IkRCXHQiCisJCQkJCQkuam9pbigiLCIsQHN0cikgaWYgKEBzdHIpOworCQkJCSAgICBsYXN0OworCQkJCSAgfTsKKwkgICAgfQorCSAgICAkbGluZSA9ICIiOworCX0KKworCSRyZXQ7CisgICAgfQorICAgIHN1YiBvdXQgeworCW15ICRzZWxmID0gc2hpZnQ7CisJJHNlbGYtPnt2YWx1ZX07CisgICAgfQorfQorCitpZiAoJG5hc20pIHsKKyAgICBwcmludCA8PF9fXzsKK2RlZmF1bHQJcmVsCitfX18KK30gZWxzaWYgKCRtYXNtKSB7CisgICAgcHJpbnQgPDxfX187CitPUFRJT04JRE9UTkFNRQorX19fCit9Cit3aGlsZSgkbGluZT08PikgeworCisgICAgY2hvbXAoJGxpbmUpOworCisgICAgJGxpbmUgPX4gc3xbIyFdLiokfHw7CSMgZ2V0IHJpZCBvZiBhc20tc3R5bGUgY29tbWVudHMuLi4KKyAgICAkbGluZSA9fiBzfC9cKi4qXCovfHw7CSMgLi4uIGFuZCBDLXN0eWxlIGNvbW1lbnRzLi4uCisgICAgJGxpbmUgPX4gc3xeXHMrfHw7CQkjIC4uLiBhbmQgc2tpcCB3aGl0ZSBzcGFjZXMgaW4gYmVnaW5uaW5nCisKKyAgICB1bmRlZiAkbGFiZWw7CisgICAgdW5kZWYgJG9wY29kZTsKKyAgICB1bmRlZiAkc3o7CisgICAgdW5kZWYgQGFyZ3M7CisKKyAgICBpZiAoJGxhYmVsPWxhYmVsLT5yZShcJGxpbmUpKQl7IHByaW50ICRsYWJlbC0+b3V0KCk7IH0KKworICAgIGlmIChkaXJlY3RpdmUtPnJlKFwkbGluZSkpIHsKKwlwcmludGYgIiVzIixkaXJlY3RpdmUtPm91dCgpOworICAgIH0gZWxzaWYgKCRvcGNvZGU9b3Bjb2RlLT5yZShcJGxpbmUpKSB7IEFSR1VNRU5UOiB3aGlsZSAoMSkgeworCW15ICRhcmc7CisKKwlpZiAoJGFyZz1yZWdpc3Rlci0+cmUoXCRsaW5lKSkJeyBvcGNvZGUtPnNpemUoJGFyZy0+c2l6ZSgpKTsgfQorCWVsc2lmICgkYXJnPWNvbnN0LT5yZShcJGxpbmUpKQl7IH0KKwllbHNpZiAoJGFyZz1lYS0+cmUoXCRsaW5lKSkJeyB9CisJZWxzaWYgKCRhcmc9ZXhwci0+cmUoXCRsaW5lKSkJeyB9CisJZWxzZQkJCQl7IGxhc3QgQVJHVU1FTlQ7IH0KKworCXB1c2ggQGFyZ3MsJGFyZzsKKworCWxhc3QgQVJHVU1FTlQgaWYgKCRsaW5lICF+IC9eLC8pOworCisJJGxpbmUgPX4gcy9eLFxzKi8vOworCX0gIyBBUkdVTUVOVDoKKworCSRzej1vcGNvZGUtPnNpemUoKTsKKworCWlmICgkI2FyZ3M+PTApIHsKKwkgICAgbXkgJGluc247CisJICAgIGlmICgkZ2FzKSB7CisJCSRpbnNuID0gJG9wY29kZS0+b3V0KCQjYXJncz49MT8kYXJnc1skI2FyZ3NdLT5zaXplKCk6JHN6KTsKKwkgICAgfSBlbHNlIHsKKwkJJGluc24gPSAkb3Bjb2RlLT5vdXQoKTsKKwkJJGluc24gLj0gJHN6IGlmIChtYXAoJF8tPm91dCgpID1+IC94P21tLyxAYXJncykpOworCQlAYXJncyA9IHJldmVyc2UoQGFyZ3MpOworCQl1bmRlZiAkc3ogaWYgKCRuYXNtICYmICRvcGNvZGUtPm1uZW1vbmljKCkgZXEgImxlYSIpOworCSAgICB9CisJICAgIHByaW50ZiAiXHQlc1x0JXMiLCRpbnNuLGpvaW4oIiwiLG1hcCgkXy0+b3V0KCRzeiksQGFyZ3MpKTsKKwl9IGVsc2UgeworCSAgICBwcmludGYgIlx0JXMiLCRvcGNvZGUtPm91dCgpOworCX0KKyAgICB9CisKKyAgICBwcmludCAkbGluZSwiXG4iOworfQorCitwcmludCAiXG4kY3VycmVudF9zZWdtZW50XHRFTkRTXG4iCWlmICgkY3VycmVudF9zZWdtZW50ICYmICRtYXNtKTsKK3ByaW50ICJFTkRcbiIJCQkJaWYgKCRtYXNtKTsKKworY2xvc2UgU1RET1VUOworCisMIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDcm9zcy1yZWZlcmVuY2UgeDg2XzY0IEFCSSAiY2FyZCIKKyMKKyMgCQlVbml4CQlXaW42NAorIyAlcmF4CQkqCQkqCisjICVyYngJCS0JCS0KKyMgJXJjeAkJIzQJCSMxCisjICVyZHgJCSMzCQkjMgorIyAlcnNpCQkjMgkJLQorIyAlcmRpCQkjMQkJLQorIyAlcmJwCQktCQktCisjICVyc3AJCS0JCS0KKyMgJXI4CQkjNQkJIzMKKyMgJXI5CQkjNgkJIzQKKyMgJXIxMAkJKgkJKgorIyAlcjExCQkqCQkqCisjICVyMTIJCS0JCS0KKyMgJXIxMwkJLQkJLQorIyAlcjE0CQktCQktCisjICVyMTUJCS0JCS0KKyMgCisjICgqKQl2b2xhdGlsZSByZWdpc3RlcgorIyAoLSkJcHJlc2VydmVkIGJ5IGNhbGxlZQorIyAoIykJTnRoIGFyZ3VtZW50LCB2b2xhdGlsZQorIworIyBJbiBVbml4IHRlcm1zIHRvcCBvZiBzdGFjayBpcyBhcmd1bWVudCB0cmFuc2ZlciBhcmVhIGZvciBhcmd1bWVudHMKKyMgd2hpY2ggY291bGQgbm90IGJlIGFjY29tb2RhdGVkIGluIHJlZ2lzdGVycy4gT3IgaW4gb3RoZXIgd29yZHMgN3RoCisjIFtpbnRlZ2VyXSBhcmd1bWVudCByZXNpZGVzIGF0IDgoJXJzcCkgdXBvbiBmdW5jdGlvbiBlbnRyeSBwb2ludC4KKyMgMTI4IGJ5dGVzIGFib3ZlICVyc3AgY29uc3RpdHV0ZSBhICJyZWQgem9uZSIgd2hpY2ggaXMgbm90IHRvdWNoZWQKKyMgYnkgc2lnbmFsIGhhbmRsZXJzIGFuZCBjYW4gYmUgdXNlZCBhcyB0ZW1wb3JhbCBzdG9yYWdlIHdpdGhvdXQKKyMgYWxsb2NhdGluZyBhIGZyYW1lLgorIworIyBJbiBXaW42NCB0ZXJtcyBOKjggYnl0ZXMgb24gdG9wIG9mIHN0YWNrIGlzIGFyZ3VtZW50IHRyYW5zZmVyIGFyZWEsCisjIHdoaWNoIGJlbG9uZ3MgdG8vY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IGNhbGxlZS4gTiBpcyB0aGUgbnVtYmVyIG9mCisjIGFyZ3VtZW50cyBwYXNzZWQgdG8gY2FsbGVlLCAqYnV0KiBub3QgbGVzcyB0aGFuIDQhIFRoaXMgbWVhbnMgdGhhdAorIyB1cG9uIGZ1bmN0aW9uIGVudHJ5IHBvaW50IDV0aCBhcmd1bWVudCByZXNpZGVzIGF0IDQwKCVyc3ApLCBhcyB3ZWxsCisjIGFzIHRoYXQgMzIgYnl0ZXMgZnJvbSA4KCVyc3ApIGNhbiBhbHdheXMgYmUgdXNlZCBhcyB0ZW1wb3JhbAorIyBzdG9yYWdlIFt3aXRob3V0IGFsbG9jYXRpbmcgYSBmcmFtZV0uIE9uZSBjYW4gYWN0dWFsbHkgYXJndWUgdGhhdAorIyBvbmUgY2FuIGFzc3VtZSBhICJyZWQgem9uZSIgYWJvdmUgc3RhY2sgcG9pbnRlciB1bmRlciBXaW42NCBhcyB3ZWxsLgorIyBQb2ludCBpcyB0aGF0IGF0IGFwcGFyZW50bHkgbm8gb2NjYXNpb24gV2luZG93cyBrZXJuZWwgd291bGQgYWx0ZXIKKyMgdGhlIGFyZWEgYWJvdmUgdXNlciBzdGFjayBwb2ludGVyIGluIHRydWUgYXN5bmNocm9ub3VzIG1hbm5lci4uLgorIworIyBBbGwgdGhlIGFib3ZlIG1lYW5zIHRoYXQgaWYgYXNzZW1ibGVyIHByb2dyYW1tZXIgYWRoZXJlcyB0byBVbml4CisjIHJlZ2lzdGVyIGFuZCBzdGFjayBsYXlvdXQsIGJ1dCBkaXNyZWdhcmRzIHRoZSAicmVkIHpvbmUiIGV4aXN0ZW5zZSwKKyMgaXQncyBwb3NzaWJsZSB0byB1c2UgZm9sbG93aW5nIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSB0byAiZ2VhciIgZnJvbQorIyBVbml4IHRvIFdpbjY0IEFCSSBpbiBsZWFmIGZ1bmN0aW9ucyB3aXRoIG5vdCBtb3JlIHRoYW4gNiBhcmd1bWVudHMuCisjCisjIG9tbmlwb3RlbnRfZnVuY3Rpb246CisjIGlmZGVmIFdJTjY0CisjCW1vdnEJJXJkaSw4KCVyc3ApCisjCW1vdnEJJXJzaSwxNiglcnNwKQorIwltb3ZxCSVyY3gsJXJkaQk7IGlmIDFzdCBhcmd1bWVudCBpcyBhY3R1YWxseSBwcmVzZW50CisjCW1vdnEJJXJkeCwlcnNpCTsgaWYgMm5kIGFyZ3VtZW50IGlzIGFjdHVhbGx5IC4uLgorIwltb3ZxCSVyOCwlcmR4CTsgaWYgM3JkIGFyZ3VtZW50IGlzIC4uLgorIwltb3ZxCSVyOSwlcmN4CTsgaWYgNHRoIGFyZ3VtZW50IC4uLgorIwltb3ZxCTQwKCVyc3ApLCVyOAk7IGlmIDV0aCAuLi4KKyMJbW92cQk0OCglcnNwKSwlcjkJOyBpZiA2dGggLi4uCisjIGVuZGlmCisjCS4uLgorIyBpZmRlZiBXSU42NAorIwltb3ZxCTgoJXJzcCksJXJkaQorIwltb3ZxCTE2KCVyc3ApLCVyc2kKKyMgZW5kaWYKKyMJcmV0CisjCisMIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBXaW42NCBTRUgsIFN0cnVjdHVyZWQgRXhjZXB0aW9uIEhhbmRsaW5nLgorIworIyBVbmxpa2Ugb24gVW5peCBzeXN0ZW1zKCopIGxhY2sgb2YgV2luNjQgc3RhY2sgdW53aW5kaW5nIGluZm9ybWF0aW9uCisjIGhhcyB1bmRlc2lyZWQgc2lkZS1lZmZlY3QgYXQgcnVuLXRpbWU6IGlmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW4KKyMgYXNzZW1ibGVyIHN1YnJvdXRpbmUgc3VjaCBhcyB0aG9zZSBpbiBxdWVzdGlvbiAoYmFzaWNhbGx5IHdlJ3JlCisjIHJlZmVycmluZyB0byBzZWdtZW50YXRpb24gdmlvbGF0aW9ucyBjYXVzZWQgYnkgbWFsZm9ybWVkIGlucHV0CisjIHBhcmFtZXRlcnMpLCB0aGUgYXBwbGljYXRpb24gaXMgYnJpc2tseSB0ZXJtaW5hdGVkIHdpdGhvdXQgaW52b2tpbmcKKyMgYW55IGV4Y2VwdGlvbiBoYW5kbGVycywgbW9zdCBub3RhYmx5IHdpdGhvdXQgZ2VuZXJhdGluZyBtZW1vcnkgZHVtcAorIyBvciBhbnkgdXNlciBub3RpZmljYXRpb24gd2hhdHNvZXZlci4gVGhpcyBwb3NlcyBhIHByb2JsZW0uIEl0J3MKKyMgcG9zc2libGUgdG8gYWRkcmVzcyBpdCBieSByZWdpc3RlcmluZyBjdXN0b20gbGFuZ3VhZ2Utc3BlY2lmaWMKKyMgaGFuZGxlciB0aGF0IHdvdWxkIHJlc3RvcmUgcHJvY2Vzc29yIGNvbnRleHQgdG8gdGhlIHN0YXRlIGF0CisjIHN1YnJvdXRpbmUgZW50cnkgcG9pbnQgYW5kIHJldHVybiAiZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkLCBrZWVwCisjIHVud2luZGluZyIgY29kZS4gV3JpdGluZyBzdWNoIGhhbmRsZXIgY2FuIGJlIGEgY2hhbGxlbmdlLi4uIEJ1dCBpdCdzCisjIGRvYWJsZSwgdGhvdWdoIHJlcXVpcmVzIGNlcnRhaW4gY29kaW5nIGNvbnZlbnRpb24uIENvbnNpZGVyIGZvbGxvd2luZworIyBzbmlwcGV0OgorIworIyAudHlwZQlmdW5jdGlvbixAZnVuY3Rpb24KKyMgZnVuY3Rpb246CisjCW1vdnEJJXJzcCwlcmF4CSMgY29weSByc3AgdG8gdm9sYXRpbGUgcmVnaXN0ZXIKKyMJcHVzaHEJJXIxNQkJIyBzYXZlIG5vbi12b2xhdGlsZSByZWdpc3RlcnMKKyMJcHVzaHEJJXJieAorIwlwdXNocQklcmJwCisjCW1vdnEJJXJzcCwlcjExCisjCXN1YnEJJXJkaSwlcjExCSMgcHJlcGFyZSBbdmFyaWFibGVdIHN0YWNrIGZyYW1lCisjCWFuZHEJJC02NCwlcjExCisjCW1vdnEJJXJheCwwKCVyMTEpCSMgY2hlY2sgZm9yIGV4Y2VwdGlvbnMKKyMJbW92cQklcjExLCVyc3AJIyBhbGxvY2F0ZSBbdmFyaWFibGVdIHN0YWNrIGZyYW1lCisjCW1vdnEJJXJheCwwKCVyc3ApCSMgc2F2ZSBvcmlnaW5hbCByc3AgdmFsdWUKKyMgbWFnaWNfcG9pbnQ6CisjCS4uLgorIwltb3ZxCTAoJXJzcCksJXJjeAkjIHB1bGwgb3JpZ2luYWwgcnNwIHZhbHVlCisjCW1vdnEJLTI0KCVyY3gpLCVyYnAJIyByZXN0b3JlIG5vbi12b2xhdGlsZSByZWdpc3RlcnMKKyMJbW92cQktMTYoJXJjeCksJXJieAorIwltb3ZxCS04KCVyY3gpLCVyMTUKKyMJbW92cQklcmN4LCVyc3AJIyByZXN0b3JlIG9yaWdpbmFsIHJzcAorIwlyZXQKKyMgLnNpemUgZnVuY3Rpb24sLi1mdW5jdGlvbgorIworIyBUaGUga2V5IGlzIHRoYXQgdXAgdG8gbWFnaWNfcG9pbnQgY29weSBvZiBvcmlnaW5hbCByc3AgdmFsdWUgcmVtYWlucworIyBpbiBjaG9zZW4gdm9sYXRpbGUgcmVnaXN0ZXIgYW5kIG5vIG5vbi12b2xhdGlsZSByZWdpc3RlciwgZXhjZXB0IGZvcgorIyByc3AsIGlzIG1vZGlmaWVkLiBXaGlsZSBwYXN0IG1hZ2ljX3BvaW50IHJzcCByZW1haW5zIGNvbnN0YW50IHRpbGwKKyMgdGhlIHZlcnkgZW5kIG9mIHRoZSBmdW5jdGlvbi4gSW4gdGhpcyBjYXNlIGN1c3RvbSBsYW5ndWFnZS1zcGVjaWZpYworIyBleGNlcHRpb24gaGFuZGxlciB3b3VsZCBsb29rIGxpa2UgdGhpczoKKyMKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCisjIHsJVUxPTkc2NCAqcnNwID0gKFVMT05HNjQgKiljb250ZXh0LT5SYXg7CisjCWlmIChjb250ZXh0LT5SaXAgPj0gbWFnaWNfcG9pbnQpCisjCXsgICByc3AgPSAoKFVMT05HNjQgKiopY29udGV4dC0+UnNwKVswXTsKKyMJICAgIGNvbnRleHQtPlJicCA9IHJzcFstM107CisjCSAgICBjb250ZXh0LT5SYnggPSByc3BbLTJdOworIwkgICAgY29udGV4dC0+UjE1ID0gcnNwWy0xXTsKKyMJfQorIwljb250ZXh0LT5Sc3AgPSAoVUxPTkc2NClyc3A7CisjCWNvbnRleHQtPlJkaSA9IHJzcFsxXTsKKyMJY29udGV4dC0+UnNpID0gcnNwWzJdOworIworIwltZW1jcHkgKGRpc3AtPkNvbnRleHRSZWNvcmQsY29udGV4dCxzaXplb2YoQ09OVEVYVCkpOworIwlSdGxWaXJ0dWFsVW53aW5kKFVOV19GTEFHX05IQU5ETEVSLGRpc3AtPkltYWdlQmFzZSwKKyMJCWRpcHMtPkNvbnRyb2xQYyxkaXNwLT5GdW5jdGlvbkVudHJ5LGRpc3AtPkNvbnRleHRSZWNvcmQsCisjCQkmZGlzcC0+SGFuZGxlckRhdGEsJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUsTlVMTCk7CisjCXJldHVybiBFeGNlcHRpb25Db250aW51ZVNlYXJjaDsKKyMgfQorIworIyBJdCdzIGFwcHJvcHJpYXRlIHRvIGltcGxlbWVudCB0aGlzIGhhbmRsZXIgaW4gYXNzZW1ibGVyLCBkaXJlY3RseSBpbgorIyBmdW5jdGlvbidzIG1vZHVsZS4gSW4gb3JkZXIgdG8gZG8gdGhhdCBvbmUgaGFzIHRvIGtub3cgbWVtYmVycycKKyMgb2Zmc2V0cyBpbiBDT05URVhUIGFuZCBESVNQQVRDSEVSX0NPTlRFWFQgc3RydWN0dXJlcyBhbmQgc29tZSBjb25zdGFudAorIyB2YWx1ZXMuIEhlcmUgdGhleSBhcmU6CisjCisjCUNPTlRFWFQuUmF4CQkJCTEyMAorIwlDT05URVhULlJjeAkJCQkxMjgKKyMJQ09OVEVYVC5SZHgJCQkJMTM2CisjCUNPTlRFWFQuUmJ4CQkJCTE0NAorIwlDT05URVhULlJzcAkJCQkxNTIKKyMJQ09OVEVYVC5SYnAJCQkJMTYwCisjCUNPTlRFWFQuUnNpCQkJCTE2OAorIwlDT05URVhULlJkaQkJCQkxNzYKKyMJQ09OVEVYVC5SOAkJCQkxODQKKyMJQ09OVEVYVC5SOQkJCQkxOTIKKyMJQ09OVEVYVC5SMTAJCQkJMjAwCisjCUNPTlRFWFQuUjExCQkJCTIwOAorIwlDT05URVhULlIxMgkJCQkyMTYKKyMJQ09OVEVYVC5SMTMJCQkJMjI0CisjCUNPTlRFWFQuUjE0CQkJCTIzMgorIwlDT05URVhULlIxNQkJCQkyNDAKKyMJQ09OVEVYVC5SaXAJCQkJMjQ4CisjCUNPTlRFWFQuWG1tNgkJCQk1MTIKKyMJc2l6ZW9mKENPTlRFWFQpCQkJCTEyMzIKKyMJRElTUEFUQ0hFUl9DT05URVhULkNvbnRyb2xQYwkJMAorIwlESVNQQVRDSEVSX0NPTlRFWFQuSW1hZ2VCYXNlCQk4CisjCURJU1BBVENIRVJfQ09OVEVYVC5GdW5jdGlvbkVudHJ5CTE2CisjCURJU1BBVENIRVJfQ09OVEVYVC5Fc3RhYmxpc2hlckZyYW1lCTI0CisjCURJU1BBVENIRVJfQ09OVEVYVC5UYXJnZXRJcAkJMzIKKyMJRElTUEFUQ0hFUl9DT05URVhULkNvbnRleHRSZWNvcmQJNDAKKyMJRElTUEFUQ0hFUl9DT05URVhULkxhbmd1YWdlSGFuZGxlcgk0OAorIwlESVNQQVRDSEVSX0NPTlRFWFQuSGFuZGxlckRhdGEJCTU2CisjCVVOV19GTEFHX05IQU5ETEVSCQkJMAorIwlFeGNlcHRpb25Db250aW51ZVNlYXJjaAkJCTEKKyMKKyMgSW4gb3JkZXIgdG8gdGllIHRoZSBoYW5kbGVyIHRvIHRoZSBmdW5jdGlvbiBvbmUgaGFzIHRvIGNvbXBvc2UKKyMgY291cGxlIG9mIHN0cnVjdHVyZXM6IG9uZSBmb3IgLnhkYXRhIHNlZ21lbnQgYW5kIG9uZSBmb3IgLnBkYXRhLgorIworIyBVTldJTkRfSU5GTyBzdHJ1Y3R1cmUgZm9yIC54ZGF0YSBzZWdtZW50IHdvdWxkIGJlCisjCisjIGZ1bmN0aW9uX3Vud2luZF9pbmZvOgorIwkuYnl0ZQk5LDAsMCwwCisjCS5ydmEJaGFuZGxlcgorIworIyBUaGlzIHN0cnVjdHVyZSBkZXNpZ25hdGVzIGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBhIGZ1bmN0aW9uIHdpdGgKKyMgemVyby1sZW5ndGggcHJvbG9ndWUsIG5vIHN0YWNrIGZyYW1lIG9yIGZyYW1lIHJlZ2lzdGVyLgorIworIyBUbyBmYWNpbGl0YXRlIGNvbXBvc2luZyBvZiAucGRhdGEgc3RydWN0dXJlcywgYXV0by1nZW5lcmF0ZWQgImdlYXIiCisjIHByb2xvZ3VlIGNvcGllcyByc3AgdmFsdWUgdG8gcmF4IGFuZCBkZW5vdGVzIG5leHQgaW5zdHJ1Y3Rpb24gd2l0aAorIyAuTFNFSF9iZWdpbl97ZnVuY3Rpb25fbmFtZX0gbGFiZWwuIFRoaXMgZXNzZW50aWFsbHkgZGVmaW5lcyB0aGUgU0VICisjIHN0eWxpbmcgcnVsZSBtZW50aW9uZWQgaW4gdGhlIGJlZ2lubmluZy4gUG9zaXRpb24gb2YgdGhpcyBsYWJlbCBpcworIyBjaG9zZW4gaW4gc3VjaCBtYW5uZXIgdGhhdCBwb3NzaWJsZSBleGNlcHRpb25zIHJhaXNlZCBpbiB0aGUgImdlYXIiCisjIHByb2xvZ3VlIHdvdWxkIGJlIGFjY291bnRlZCB0byBjYWxsZXIgYW5kIHVud291bmQgZnJvbSBsYXR0ZXIncyBmcmFtZS4KKyMgRW5kIG9mIGZ1bmN0aW9uIGlzIG1hcmtlZCB3aXRoIHJlc3BlY3RpdmUgLkxTRUhfZW5kX3tmdW5jdGlvbl9uYW1lfQorIyBsYWJlbC4gVG8gc3VtbWFyaXplLCAucGRhdGEgc2VnbWVudCB3b3VsZCBjb250YWluCisjCisjCS5ydmEJLkxTRUhfYmVnaW5fZnVuY3Rpb24KKyMJLnJ2YQkuTFNFSF9lbmRfZnVuY3Rpb24KKyMJLnJ2YQlmdW5jdGlvbl91bndpbmRfaW5mbworIworIyBSZWZlcmVuY2UgdG8gZnVuY3Rvbl91bndpbmRfaW5mbyBmcm9tIC54ZGF0YSBzZWdtZW50IGlzIHRoZSBhbmNob3IuCisjIEluIGNhc2UgeW91IHdvbmRlciB3aHkgcmVmZXJlbmNlcyBhcmUgMzItYml0IC5ydmFzIGFuZCBub3QgNjQtYml0CisjIC5xdWFkcy4gUmVmZXJlbmNlcyBwdXQgaW50byB0aGVzZSB0d28gc2VnbWVudHMgYXJlIHJlcXVpcmVkIHRvIGJlCisjICpyZWxhdGl2ZSogdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBiaW5hcnkgbW9kdWxlLCBhLmsuYS4KKyMgaW1hZ2UgYmFzZS4gTm8gV2luNjQgbW9kdWxlLCBiZSBpdCAuZXhlIG9yIC5kbGwsIGNhbiBiZSBsYXJnZXIgdGhhbgorIyAyR0IgYW5kIHRodXMgc3VjaCByZWxhdGl2ZSByZWZlcmVuY2VzIGNhbiBiZSBhbmQgYXJlIGFjY29tbW9kYXRlZCBpbgorIyAzMiBiaXRzLgorIworIyBIYXZpbmcgcmV2aWV3ZWQgdGhlIGV4YW1wbGUgZnVuY3Rpb24gY29kZSwgb25lIGNhbiBhcmd1ZSB0aGF0ICJtb3ZxCisjICVyc3AsJXJheCIgYWJvdmUgaXMgcmVkdW5kYW50LiBJdCBpcyBub3QhIEtlZXAgaW4gbWluZCB0aGF0IG9uIFVuaXgKKyMgcmF4IHdvdWxkIGNvbnRhaW4gYW4gdW5kZWZpbmVkIHZhbHVlLiBJZiB0aGlzICJvZmZlbmRzIiB5b3UsIHVzZQorIyBhbm90aGVyIHJlZ2lzdGVyIGFuZCByZWZyYWluIGZyb20gbW9kaWZ5aW5nIHJheCB0aWxsIG1hZ2ljX3BvaW50IGlzCisjIHJlYWNoZWQsIGkuZS4gYXMgaWYgaXQgd2FzIGEgbm9uLXZvbGF0aWxlIHJlZ2lzdGVyLiBJZiBtb3JlIHJlZ2lzdGVycworIyBhcmUgcmVxdWlyZWQgcHJpb3IgW3ZhcmlhYmxlXSBmcmFtZSBzZXR1cCBpcyBjb21wbGV0ZWQsIG5vdGUgdGhhdAorIyBub2JvZHkgc2F5cyB0aGF0IHlvdSBjYW4gaGF2ZSBvbmx5IG9uZSAibWFnaWMgcG9pbnQuIiBZb3UgY2FuCisjICJsaWJlcmF0ZSIgbm9uLXZvbGF0aWxlIHJlZ2lzdGVycyBieSBkZW5vdGluZyBsYXN0IHN0YWNrIG9mZi1sb2FkCisjIGluc3RydWN0aW9uIGFuZCByZWZsZWN0aW5nIGl0IGluIGZpbmVyIGdyYWRlIHVud2luZCBsb2dpYyBpbiBoYW5kbGVyLgorIyBBZnRlciBhbGwsIGlzbid0IGl0IHdoeSBpdCdzIGNhbGxlZCAqbGFuZ3VhZ2Utc3BlY2lmaWMqIGhhbmRsZXIuLi4KKyMKKyMgQXR0ZW50aXZlIHJlYWRlciBjYW4gbm90aWNlIHRoYXQgZXhjZXB0aW9ucyB3b3VsZCBiZSBtaXNoYW5kbGVkIGluCisjIGF1dG8tZ2VuZXJhdGVkICJnZWFyIiBlcGlsb2d1ZS4gV2VsbCwgZXhjZXB0aW9uIGVmZmVjdGl2ZWx5IGNhbid0CisjIG9jY3VyIHRoZXJlLCBiZWNhdXNlIGlmIG1lbW9yeSBhcmVhIHVzZWQgYnkgaXQgd2FzIHN1YmplY3QgdG8KKyMgc2VnbWVudGF0aW9uIHZpb2xhdGlvbiwgdGhlbiBpdCB3b3VsZCBiZSByYWlzZWQgdXBvbiBjYWxsIHRvIHRoZQorIyBmdW5jdGlvbiAoYW5kIGFzIGFscmVhZHkgbWVudGlvbmVkIGJlIGFjY291bnRlZCB0byBjYWxsZXIsIHdoaWNoIGlzCisjIG5vdCBhIHByb2JsZW0pLiBJZiB5b3UncmUgc3RpbGwgbm90IGNvbWZvcnRhYmxlLCB0aGVuIGRlZmluZSB0YWlsCisjICJtYWdpYyBwb2ludCIganVzdCBwcmlvciByZXQgaW5zdHJ1Y3Rpb24gYW5kIGhhdmUgaGFuZGxlciB0cmVhdCBpdC4uLgorIworIyAoKikJTm90ZSB0aGF0IHdlJ3JlIHRhbGtpbmcgYWJvdXQgcnVuLXRpbWUsIG5vdCBkZWJ1Zy10aW1lLiBMYWNrIG9mCisjCXVud2luZCBpbmZvcm1hdGlvbiBtYWtlcyBkZWJ1Z2dpbmcgaGFyZCBvbiBib3RoIFdpbmRvd3MgYW5kCisjCVVuaXguICJVbmxpa2UiIHJlZmVyZXMgdG8gdGhlIGZhY3QgdGhhdCBvbiBVbml4IHNpZ25hbCBoYW5kbGVyCisjCXdpbGwgYWx3YXlzIGJlIGludm9rZWQsIGNvcmUgZHVtcGVkIGFuZCBhcHByb3ByaWF0ZSBleGl0IGNvZGUKKyMJcmV0dXJuZWQgdG8gcGFyZW50IChmb3IgdXNlciBub3RpZmljYXRpb24pLgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3Blcmxhc20veDg2YXNtLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3Blcmxhc20veDg2YXNtLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDgwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS94ODZhc20ucGwKQEAgLTAsMCArMSwyMDcgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyByZXF1aXJlICd4ODZhc20ucGwnOworIyAmYXNtX2luaXQoPGZsYXZvcj4sImRlcy01ODYucGwiWywkaTM4Nm9ubHldKTsKKyMgJmZ1bmN0aW9uX2JlZ2luKCJmb28iKTsKKyMgLi4uCisjICZmdW5jdGlvbl9lbmQoImZvbyIpOworIyAmYXNtX2ZpbmlzaAorCiskb3V0PSgpOworJGkzODY9MDsKKworIyBBVVRPTE9BRCBpcyB0aGlzIGNvbnRleHQgaGFzIHF1aXRlIHVucGxlYXNhbnQgc2lkZSBlZmZlY3QsIG5hbWVseQorIyB0aGF0IHR5cG9zIGluIGZ1bmN0aW9uIGNhbGxzIGVmZmVjdGl2ZWx5IGdvIHRvIGFzc2VtYmxlciBvdXRwdXQsCisjIGJ1dCBvbiB0aGUgcHJvcyBzaWRlIHdlIGRvbid0IGhhdmUgdG8gaW1wbGVtZW50IG9uZSBzdWJyb3V0aW5lIHBlcgorIyBlYWNoIG9wY29kZS4uLgorc3ViIDo6QVVUT0xPQUQKK3sgbXkgJG9wY29kZSA9ICRBVVRPTE9BRDsKKworICAgIGRpZSAibW9yZSB0aGFuIDQgYXJndW1lbnRzIHBhc3NlZCB0byAkb3Bjb2RlIiBpZiAoJCNfPjMpOworCisgICAgJG9wY29kZSA9fiBzLy4qOjovLzsKKyAgICBpZiAgICAoJG9wY29kZSA9fiAvXnB1c2gvKSB7ICRzdGFjays9NDsgfQorICAgIGVsc2lmICgkb3Bjb2RlID1+IC9ecG9wLykgIHsgJHN0YWNrLT00OyB9CisKKyAgICAmZ2VuZXJpYygkb3Bjb2RlLEBfKSBvciBkaWUgInVuZGVmaW5lZCBzdWJyb3V0aW5lIFwmJEFVVE9MT0FEIjsKK30KKworc3ViIDo6ZW1pdAoreyBteSAkb3Bjb2RlPXNoaWZ0OworCisgICAgaWYgKCQjXz09LTEpICAgIHsgcHVzaChAb3V0LCJcdCRvcGNvZGVcbiIpOwkJCQl9CisgICAgZWxzZSAgICAgICAgICAgIHsgcHVzaChAb3V0LCJcdCRvcGNvZGVcdCIuam9pbignLCcsQF8pLiJcbiIpOwl9Cit9CisKK3N1YiA6OkxCCit7ICAgJF9bMF0gPX4gbS9eZT8oW2EtZF0peCQvbyBvciBkaWUgIiRfWzBdIGRvZXMgbm90IGhhdmUgYSAnbG93IGJ5dGUnIjsKKyAgJDEuImwiOworfQorc3ViIDo6SEIKK3sgICAkX1swXSA9fiBtL15lPyhbYS1kXSl4JC9vIG9yIGRpZSAiJF9bMF0gZG9lcyBub3QgaGF2ZSBhICdoaWdoIGJ5dGUnIjsKKyAgJDEuImgiOworfQorc3ViIDo6c3RhY2tfcHVzaHsgbXkgJG51bT0kX1swXSo0OyAkc3RhY2srPSRudW07ICZzdWIoImVzcCIsJG51bSk7CX0KK3N1YiA6OnN0YWNrX3BvcAl7IG15ICRudW09JF9bMF0qNDsgJHN0YWNrLT0kbnVtOyAmYWRkKCJlc3AiLCRudW0pOwl9CitzdWIgOjpibGluZHBvcAl7ICZwb3AoJF9bMF0pOyAkc3RhY2srPTQ7CQkJCX0KK3N1YiA6OndwYXJhbQl7ICZEV1AoJHN0YWNrKzQqJF9bMF0sImVzcCIpOwkJCQl9CitzdWIgOjpzd3RtcAl7ICZEV1AoNCokX1swXSwiZXNwIik7CQkJCQl9CisKK3N1YiA6OmJzd2FwCit7ICAgaWYgKCRpMzg2KQkjIGVtdWxhdGUgYnN3YXAgZm9yIGkzODYKKyAgICB7CSZjb21tZW50KCJic3dhcCBAXyIpOworCSZ4Y2hnKCZIQihAXyksJkxCKEBfKSk7CisJJnJvciAoQF8sMTYpOworCSZ4Y2hnKCZIQihAXyksJkxCKEBfKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CSZnZW5lcmljKCJic3dhcCIsQF8pOwl9Cit9CisjIFRoZXNlIGFyZSBtYWRlLXVwIG9wY29kZXMgaW50cm9kdWNlZCBvdmVyIHRoZSB5ZWFycyBlc3NlbnRpYWxseQorIyBieSBpZ25vcmFuY2UsIGp1c3QgYWxpYXMgdGhlbSB0byByZWFsIG9uZXMuLi4KK3N1YiA6Om1vdmIJeyAmbW92KEBfKTsJfQorc3ViIDo6eG9yYgl7ICZ4b3IoQF8pOwl9CitzdWIgOjpyb3RsCXsgJnJvbChAXyk7CX0KK3N1YiA6OnJvdHIJeyAmcm9yKEBfKTsJfQorc3ViIDo6ZXhjaAl7ICZ4Y2hnKEBfKTsJfQorc3ViIDo6aGFsdAl7ICZobHQ7CQl9CitzdWIgOjptb3Z6CXsgJm1vdnp4KEBfKTsJfQorc3ViIDo6cHVzaGYJeyAmcHVzaGZkOwl9CitzdWIgOjpwb3BmCXsgJnBvcGZkOwl9CisKKyMgMyBhcmd1bWVudCBpbnN0cnVjdGlvbnMKK3N1YiA6Om1vdnEKK3sgbXkoJHAxLCRwMiwkb3B0aW1pemUpPUBfOworCisgICAgaWYgKCRvcHRpbWl6ZSAmJiAkcDE9fi9ebW1bMC03XSQvICYmICRwMj1+L15tbVswLTddJC8pCisgICAgIyBtb3ZxIGJldHdlZW4gbW14IHJlZ2lzdGVycyBjYW4gc2luayBJbnRlbCBDUFVzCisgICAgewkmOjpwc2h1ZncoJHAxLCRwMiwweGU0KTsJCX0KKyAgICBlbHNlCisgICAgewkmOjpnZW5lcmljKCJtb3ZxIixAXyk7CQkJfQorfQorCisjIGxhYmVsIG1hbmFnZW1lbnQKKyRsYmRlY29yPSJMIjsJCSMgbG9jYWwgbGFiZWwgZGVjb3JhdGlvbiwgc2V0IGJ5IHBhY2thZ2UKKyRsYWJlbD0iMDAwIjsKKworc3ViIDo6aXNsYWJlbAkJIyBzZWUgaXMgYXJndW1lbnQgaXMgYSBrbm93biBsYWJlbAoreyBteSAkaTsKKyAgICBmb3JlYWNoICRpICh2YWx1ZXMgJWxhYmVsKSB7IHJldHVybiAkaSBpZiAoJGkgZXEgJF9bMF0pOyB9CisgICRsYWJlbHskX1swXX07CSMgY2FuIGJlIHVuZGVmCit9CisKK3N1YiA6OmxhYmVsCQkjIGluc3RhbnRpYXRlIGEgZnVuY3Rpb24tc2NvcGUgbGFiZWwKK3sgICBpZiAoIWRlZmluZWQoJGxhYmVseyRfWzBdfSkpCisgICAgewkkbGFiZWx7JF9bMF19PSIke2xiZGVjb3J9JHtsYWJlbH0ke19bMF19IjsgJGxhYmVsKys7ICAgfQorICAkbGFiZWx7JF9bMF19OworfQorCitzdWIgOjpMQUJFTAkJIyBpbnN0YW50aWF0ZSBhIGZpbGUtc2NvcGUgbGFiZWwKK3sgICAkbGFiZWx7JF9bMF19PSRfWzFdIGlmICghZGVmaW5lZCgkbGFiZWx7JF9bMF19KSk7CisgICRsYWJlbHskX1swXX07Cit9CisKK3N1YiA6OnN0YXRpY19sYWJlbAl7ICY6OkxBQkVMKCRfWzBdLCRsYmRlY29yLiRfWzBdKTsgfQorCitzdWIgOjpzZXRfbGFiZWxfQgl7IHB1c2goQG91dCwiQF86XG4iKTsgfQorc3ViIDo6c2V0X2xhYmVsCit7IG15ICRsYWJlbD0mOjpsYWJlbCgkX1swXSk7CisgICAgJjo6YWxpZ24oJF9bMV0pIGlmICgkX1sxXT4xKTsKKyAgICAmOjpzZXRfbGFiZWxfQigkbGFiZWwpOworICAkbGFiZWw7Cit9CisKK3N1YiA6OndpcGVfbGFiZWxzCSMgd2lwZXMgZnVuY3Rpb24tc2NvcGUgbGFiZWxzCit7ICAgZm9yZWFjaCAkaSAoa2V5cyAlbGFiZWwpCisgICAgewlkZWxldGUgJGxhYmVseyRpfSBpZiAoJGxhYmVseyRpfSA9fiAvXlxRJHtsYmRlY29yfVxFWzAtOV17M30vKTsJfQorfQorCisjIHN1YnJvdXRpbmUgbWFuYWdlbWVudAorc3ViIDo6ZnVuY3Rpb25fYmVnaW4KK3sgICAmZnVuY3Rpb25fYmVnaW5fQihAXyk7CisgICAgJHN0YWNrPTQ7CisgICAgJnB1c2goImVicCIpOworICAgICZwdXNoKCJlYngiKTsKKyAgICAmcHVzaCgiZXNpIik7CisgICAgJnB1c2goImVkaSIpOworfQorCitzdWIgOjpmdW5jdGlvbl9lbmQKK3sgICAmcG9wKCJlZGkiKTsKKyAgICAmcG9wKCJlc2kiKTsKKyAgICAmcG9wKCJlYngiKTsKKyAgICAmcG9wKCJlYnAiKTsKKyAgICAmcmV0KCk7CisgICAgJmZ1bmN0aW9uX2VuZF9CKEBfKTsKKyAgICAkc3RhY2s9MDsKKyAgICAmd2lwZV9sYWJlbHMoKTsKK30KKworc3ViIDo6ZnVuY3Rpb25fZW5kX0EKK3sgICAmcG9wKCJlZGkiKTsKKyAgICAmcG9wKCJlc2kiKTsKKyAgICAmcG9wKCJlYngiKTsKKyAgICAmcG9wKCJlYnAiKTsKKyAgICAmcmV0KCk7CisgICAgJHN0YWNrKz0xNjsJIyByZWFkanVzdCBlc3AgYXMgaWYgd2UgZGlkbid0IHBvcCBhbnl0aGluZworfQorCitzdWIgOjphc2NpegoreyBteSBAc3RyPXVucGFjaygiQyoiLHNoaWZ0KTsKKyAgICBwdXNoIEBzdHIsMDsKKyAgICB3aGlsZSAoJCNzdHI+MTUpIHsKKwkmZGF0YV9ieXRlKEBzdHJbMC4uMTVdKTsKKwlmb3JlYWNoICgwLi4xNSkgeyBzaGlmdCBAc3RyOyB9CisgICAgfQorICAgICZkYXRhX2J5dGUoQHN0cikgaWYgKEBzdHIpOworfQorCitzdWIgOjphc21fZmluaXNoCit7ICAgJmZpbGVfZW5kKCk7CisgICAgcHJpbnQgQG91dDsKK30KKworc3ViIDo6YXNtX2luaXQKK3sgbXkgKCR0eXBlLCRmbiwkY3B1KT1AXzsKKworICAgICRmaWxlbmFtZT0kZm47CisgICAgJGkzODY9JGNwdTsKKworICAgICRlbGY9JGNwcD0kY29mZj0kYW91dD0kbWFjb3N4PSR3aW4zMj0kbmV0d2FyZT0kbXdlcmtzPTA7CisgICAgaWYgICAgKCgkdHlwZSBlcSAiZWxmIikpCisgICAgewkkZWxmPTE7CQkJcmVxdWlyZSAieDg2Z2FzLnBsIjsJfQorICAgIGVsc2lmICgoJHR5cGUgZXEgImFcLm91dCIpKQorICAgIHsJJGFvdXQ9MTsJCXJlcXVpcmUgIng4Nmdhcy5wbCI7CX0KKyAgICBlbHNpZiAoKCR0eXBlIGVxICJjb2ZmIiBvciAkdHlwZSBlcSAiZ2Fzd2luIikpCisgICAgewkkY29mZj0xOwkJcmVxdWlyZSAieDg2Z2FzLnBsIjsJfQorICAgIGVsc2lmICgoJHR5cGUgZXEgIndpbjMybiIpKQorICAgIHsJJHdpbjMyPTE7CQlyZXF1aXJlICJ4ODZuYXNtLnBsIjsJfQorICAgIGVsc2lmICgoJHR5cGUgZXEgIm53LW5hc20iKSkKKyAgICB7CSRuZXR3YXJlPTE7CQlyZXF1aXJlICJ4ODZuYXNtLnBsIjsJfQorICAgICNlbHNpZiAoKCR0eXBlIGVxICJudy1td2FzbSIpKQorICAgICN7CSRuZXR3YXJlPTE7ICRtd2Vya3M9MTsJcmVxdWlyZSAieDg2bmFzbS5wbCI7CX0KKyAgICBlbHNpZiAoKCR0eXBlIGVxICJ3aW4zMiIpKQorICAgIHsJJHdpbjMyPTE7CQlyZXF1aXJlICJ4ODZtYXNtLnBsIjsJfQorICAgIGVsc2lmICgoJHR5cGUgZXEgIm1hY29zeCIpKQorICAgIHsJJGFvdXQ9MTsgJG1hY29zeD0xOwlyZXF1aXJlICJ4ODZnYXMucGwiOwl9CisgICAgZWxzZQorICAgIHsJcHJpbnQgU1RERVJSIDw8IkVPRiI7CitQaWNrIG9uZSB0YXJnZXQgdHlwZSBmcm9tCisJZWxmCS0gTGludXgsIEZyZWVCU0QsIFNvbGFyaXMgeDg2LCBldGMuCisJYS5vdXQJLSBESkdQUCwgZWxkZXIgT3BlbkJTRCwgZXRjLgorCWNvZmYJLSBHQVMvQ09GRiBzdWNoIGFzIFdpbjMyIHRhcmdldHMKKwl3aW4zMm4JLSBXaW5kb3dzIDk1L1dpbmRvd3MgTlQgTkFTTSBmb3JtYXQKKwludy1uYXNtIC0gTmV0V2FyZSBOQVNNIGZvcm1hdAorCW1hY29zeAktIE1hYyBPUyBYCitFT0YKKwlleGl0KDEpOworICAgIH0KKworICAgICRwaWM9MDsKKyAgICBmb3IgKEBBUkdWKSB7ICRwaWM9MSBpZiAoL1wtW2ZLXVBJQy9pKTsgfQorCisgICAgJGZpbGVuYW1lID1+IHMvXC5wbCQvLzsKKyAgICAmZmlsZSgkZmlsZW5hbWUpOworfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3Blcmxhc20veDg2Z2FzLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3Blcmxhc20veDg2Z2FzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYWI3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGVybGFzbS94ODZnYXMucGwKQEAgLTAsMCArMSwyNDcgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworcGFja2FnZSB4ODZnYXM7CisKKypvdXQ9XEA6Om91dDsKKworJDo6bGJkZWNvcj0kOjphb3V0PyJMIjoiLkwiOwkJIyBsb2NhbCBsYWJlbCBkZWNvcmF0aW9uCiskbm1kZWNvcj0oJDo6YW91dCBvciAkOjpjb2ZmKT8iXyI6IiI7CSMgZXh0ZXJuYWwgbmFtZSBkZWNvcmF0aW9uCisKKyRpbml0c2VnPSIiOworCiskYWxpZ249MTY7CiskYWxpZ249bG9nKCRhbGlnbikvbG9nKDIpIGlmICgkOjphb3V0KTsKKyRjb21fc3RhcnQ9IiMiIGlmICgkOjphb3V0IG9yICQ6OmNvZmYpOworCitzdWIgb3BzaXplKCkKK3sgbXkgJHJlZz1zaGlmdDsKKyAgICBpZiAgICAoJHJlZyA9fiBtL14lZS9vKQkJeyAibCI7IH0KKyAgICBlbHNpZiAoJHJlZyA9fiBtL14lW2EtZF1baGxdJC9vKQl7ICJiIjsgfQorICAgIGVsc2lmICgkcmVnID1+IG0vXiVbeG1dL28pCQl7IHVuZGVmOyB9CisgICAgZWxzZQkJCQl7ICJ3IjsgfQorfQorCisjIHN3YXAgYXJndW1lbnRzOworIyBleHBhbmQgb3Bjb2RlIHdpdGggc2l6ZSBzdWZmaXg7CisjIHByZWZpeCBudW1lcmljIGNvbnN0YW50cyB3aXRoICQ7CitzdWIgOjpnZW5lcmljCit7IG15KCRvcGNvZGUsQGFyZyk9QF87CisgIG15KCRzdWZmaXgsJGRzdCwkc3JjKTsKKworICAgIEBhcmc9cmV2ZXJzZShAYXJnKTsKKworICAgIGZvciAoQGFyZykKKyAgICB7CXMvXihcKj8pKGU/W2EtZHNpeHBobF17Mn0pJC8kMSUkMi9vOwkjIGdwIHJlZ2lzdGVycworCXMvXihbeHldP21tWzAtN10pJC8lJDEvbzsJCSMgeG1tL21teCByZWdpc3RlcnMKKwlzL14oXC0/WzAtOV0rKSQvXCQkMS9vOwkJCSMgY29uc3RhbnRzCisJcy9eKFwtPzB4WzAtOWEtZl0rKSQvXCQkMS9vOwkJIyBjb25zdGFudHMKKyAgICB9CisKKyAgICAkZHN0ID0gJGFyZ1skI2FyZ10JCWlmICgkI2FyZz49MCk7CisgICAgJHNyYyA9ICRhcmdbJCNhcmctMV0JaWYgKCQjYXJnPj0xKTsKKyAgICBpZiAgICAoJGRzdCA9fiBtL14lL28pCXsgJHN1ZmZpeD0mb3BzaXplKCRkc3QpOyB9CisgICAgZWxzaWYgKCRzcmMgPX4gbS9eJS9vKQl7ICRzdWZmaXg9Jm9wc2l6ZSgkc3JjKTsgfQorICAgIGVsc2UJCQl7ICRzdWZmaXg9ImwiOyAgICAgICAgICAgfQorICAgIHVuZGVmICRzdWZmaXggaWYgKCRkc3QgPX4gbS9eJVt4bV0vbyB8fCAkc3JjID1+IG0vXiVbeG1dL28pOworCisgICAgaWYgKCQjXz09MCkJCQkJeyAmOjplbWl0KCRvcGNvZGUpOwkJfQorICAgIGVsc2lmICgkb3Bjb2RlID1+IG0vXmovbyAmJiAkI189PTEpCXsgJjo6ZW1pdCgkb3Bjb2RlLEBhcmcpOwl9CisgICAgZWxzaWYgKCRvcGNvZGUgZXEgImNhbGwiICYmICQjXz09MSkJeyAmOjplbWl0KCRvcGNvZGUsQGFyZyk7CX0KKyAgICBlbHNpZiAoJG9wY29kZSA9fiBtL15zZXQvJiYgJCNfPT0xKQl7ICY6OmVtaXQoJG9wY29kZSxAYXJnKTsJfQorICAgIGVsc2UJCQkJeyAmOjplbWl0KCRvcGNvZGUuJHN1ZmZpeCxAYXJnKTt9CisKKyAgMTsKK30KKyMKKyMgb3Bjb2RlcyBub3QgY292ZXJlZCBieSA6OmdlbmVyaWMgYWJvdmUsIG1vc3RseSBpbmNvbnNpc3RlbnQgbmFtaW5ncy4uLgorIworc3ViIDo6bW92engJeyAmOjptb3Z6YihAXyk7CQkJfQorc3ViIDo6cHVzaGZkCXsgJjo6cHVzaGZsOwkJCX0KK3N1YiA6OnBvcGZkCXsgJjo6cG9wZmw7CQkJfQorc3ViIDo6Y3B1aWQJeyAmOjplbWl0KCIuYnl0ZVx0MHgwZiwweGEyIik7CX0KK3N1YiA6OnJkdHNjCXsgJjo6ZW1pdCgiLmJ5dGVcdDB4MGYsMHgzMSIpOwl9CisKK3N1YiA6OmNhbGwJeyAmOjplbWl0KCJjYWxsIiwoJjo6aXNsYWJlbCgkX1swXSkgb3IgIiRubWRlY29yJF9bMF0iKSk7IH0KK3N1YiA6OmNhbGxfcHRyCXsgJjo6Z2VuZXJpYygiY2FsbCIsIiokX1swXSIpOwl9CitzdWIgOjpqbXBfcHRyCXsgJjo6Z2VuZXJpYygiam1wIiwiKiRfWzBdIik7CX0KKworKjo6YnN3YXAgPSBzdWIJeyAmOjplbWl0KCJic3dhcCIsIiUkX1swXSIpOwl9IGlmICghJDo6aTM4Nik7CisKK3N1YiA6OkRXUAoreyBteSgkYWRkciwkcmVnMSwkcmVnMiwkaWR4KT1AXzsKKyAgbXkgJHJldD0iIjsKKworICAgICRhZGRyID1+IHMvXlxzKy8vOworICAgICMgcHJlcGVuZCBnbG9iYWwgcmVmZXJlbmNlcyB3aXRoIG9wdGlvbmFsIHVuZGVyc2NvcmUKKyAgICAkYWRkciA9fiBzL14oW15cK1wtMC05XVteXCtcLV0qKS8mOjppc2xhYmVsKCQxKSBvciAiJG5tZGVjb3IkMSIvaWdlOworCisgICAgJHJlZzEgPSAiJSRyZWcxIiBpZiAoJHJlZzEpOworICAgICRyZWcyID0gIiUkcmVnMiIgaWYgKCRyZWcyKTsKKworICAgICRyZXQgLj0gJGFkZHIgaWYgKCgkYWRkciBuZSAiIikgJiYgKCRhZGRyIG5lIDApKTsKKworICAgIGlmICgkcmVnMikKKyAgICB7CSRpZHghPSAwIG9yICRpZHg9MTsKKwkkcmV0IC49ICIoJHJlZzEsJHJlZzIsJGlkeCkiOworICAgIH0KKyAgICBlbHNpZiAoJHJlZzEpCisgICAgewkkcmV0IC49ICIoJHJlZzEpIjsJfQorCisgICRyZXQ7Cit9CitzdWIgOjpRV1AJeyAmOjpEV1AoQF8pOwl9CitzdWIgOjpCUAl7ICY6OkRXUChAXyk7CX0KK3N1YiA6OkJDCXsgQF87CQl9CitzdWIgOjpEV0MJeyBAXzsJCX0KKworc3ViIDo6ZmlsZQoreyAgIHB1c2goQG91dCwiLmZpbGVcdFwiJF9bMF0uc1wiXG4udGV4dFxuIik7CX0KKworc3ViIDo6ZnVuY3Rpb25fYmVnaW5fQgoreyBteSAkZnVuYz1zaGlmdDsKKyAgbXkgJGdsb2JhbD0oJGZ1bmMgIX4gL15fLyk7CisgIG15ICRiZWdpbj0iJHs6OmxiZGVjb3J9XyR7ZnVuY31fYmVnaW4iOworCisgICAgJjo6TEFCRUwoJGZ1bmMsJGdsb2JhbD8iJGJlZ2luIjoiJG5tZGVjb3IkZnVuYyIpOworICAgICRmdW5jPSRubWRlY29yLiRmdW5jOworCisgICAgcHVzaChAb3V0LCIuZ2xvYmxcdCRmdW5jXG4iKQlpZiAoJGdsb2JhbCk7CisgICAgaWYgKCQ6OmNvZmYpCisgICAgewlwdXNoKEBvdXQsIi5kZWZcdCRmdW5jO1x0LnNjbFx0Ii4oMy0kZ2xvYmFsKS4iO1x0LnR5cGVcdDMyO1x0LmVuZGVmXG4iKTsgfQorICAgIGVsc2lmICgoJDo6YW91dCBhbmQgISQ6OnBpYykgb3IgJDo6bWFjb3N4KQorICAgIHsgfQorICAgIGVsc2UKKyAgICB7CXB1c2goQG91dCwiLnR5cGUJJGZ1bmMsXEBmdW5jdGlvblxuIik7IH0KKyAgICBwdXNoKEBvdXQsIi5hbGlnblx0JGFsaWduXG4iKTsKKyAgICBwdXNoKEBvdXQsIiRmdW5jOlxuIik7CisgICAgcHVzaChAb3V0LCIkYmVnaW46XG4iKQkJaWYgKCRnbG9iYWwpOworICAgICQ6OnN0YWNrPTQ7Cit9CisKK3N1YiA6OmZ1bmN0aW9uX2VuZF9CCit7IG15ICRmdW5jPXNoaWZ0OworICAgIHB1c2goQG91dCwiLnNpemVcdCRubWRlY29yJGZ1bmMsLi0iLiY6OkxBQkVMKCRmdW5jKS4iXG4iKSBpZiAoJDo6ZWxmKTsKKyAgICAkOjpzdGFjaz0wOworICAgICY6OndpcGVfbGFiZWxzKCk7Cit9CisKK3N1YiA6OmNvbW1lbnQKKwl7CisJaWYgKCFkZWZpbmVkKCRjb21fc3RhcnQpIG9yICQ6OmVsZikKKwkJewkjIFJlZ2FyZGluZyAkOjplbGYgYWJvdmUuLi4KKwkJCSMgR05VIGFuZCBTVlI0IGFzJ2VzIHVzZSBkaWZmZXJlbnQgY29tbWVudCBkZWxpbWl0ZXJzLAorCQlwdXNoKEBvdXQsIlxuIik7CSMgc28gd2UganVzdCBza2lwIEVMRiBjb21tZW50cy4uLgorCQlyZXR1cm47CisJCX0KKwlmb3JlYWNoIChAXykKKwkJeworCQlpZiAoL15ccyokLykKKwkJCXsgcHVzaChAb3V0LCJcbiIpOyB9CisJCWVsc2UKKwkJCXsgcHVzaChAb3V0LCJcdCRjb21fc3RhcnQgJF8gJGNvbV9lbmRcbiIpOyB9CisJCX0KKwl9CisKK3N1YiA6OmV4dGVybmFsX2xhYmVsCit7ICAgZm9yZWFjaChAXykgeyAmOjpMQUJFTCgkXywkbm1kZWNvci4kXyk7IH0gICB9CisKK3N1YiA6OnB1YmxpY19sYWJlbAoreyAgIHB1c2goQG91dCwiLmdsb2JsXHQiLiY6OkxBQkVMKCRfWzBdLCRubWRlY29yLiRfWzBdKS4iXG4iKTsgICB9CisKK3N1YiA6OmZpbGVfZW5kCit7ICAgaWYgKGdyZXAgey9cYiR7bm1kZWNvcn1PUEVOU1NMX2lhMzJjYXBfUFxiL2l9IEBvdXQpIHsKKwlteSAkdG1wPSIuY29tbVx0JHtubWRlY29yfU9QRU5TU0xfaWEzMmNhcF9QLDQiOworCWlmICgkOjplbGYpCXsgcHVzaCAoQG91dCwiJHRtcCw0XG4iKTsgfQorCWVsc2UJCXsgcHVzaCAoQG91dCwiJHRtcFxuIik7IH0KKyAgICB9CisgICAgaWYgKCQ6Om1hY29zeCkKKyAgICB7CWlmICglbm9uX2xhenlfcHRyKQorICAgIAl7ICAgcHVzaChAb3V0LCIuc2VjdGlvbiBfX0lNUE9SVCxfX3BvaW50ZXJzLG5vbl9sYXp5X3N5bWJvbF9wb2ludGVyc1xuIik7CisJICAgIGZvcmVhY2ggJGkgKGtleXMgJW5vbl9sYXp5X3B0cikKKwkgICAgewlwdXNoKEBvdXQsIiRub25fbGF6eV9wdHJ7JGl9OlxuLmluZGlyZWN0X3N5bWJvbFx0JGlcbi5sb25nXHQwXG4iKTsgICB9CisJfQorICAgIH0KKyAgICBwdXNoKEBvdXQsJGluaXRzZWcpIGlmICgkaW5pdHNlZyk7Cit9CisKK3N1YiA6OmRhdGFfYnl0ZQl7ICAgcHVzaChAb3V0LCIuYnl0ZVx0Ii5qb2luKCcsJyxAXykuIlxuIik7ICAgfQorc3ViIDo6ZGF0YV93b3JkIHsgICBwdXNoKEBvdXQsIi5sb25nXHQiLmpvaW4oJywnLEBfKS4iXG4iKTsgICB9CisKK3N1YiA6OmFsaWduCit7IG15ICR2YWw9JF9bMF0sJHAyLCRpOworICAgIGlmICgkOjphb3V0KQorICAgIHsJZm9yICgkcDI9MDskdmFsIT0wOyR2YWw+Pj0xKSB7ICRwMisrOyB9CisJJHZhbD0kcDItMTsKKwkkdmFsLj0iLDB4OTAiOworICAgIH0KKyAgICBwdXNoKEBvdXQsIi5hbGlnblx0JHZhbFxuIik7Cit9CisKK3N1YiA6OnBpY21ldXAKK3sgbXkoJGRzdCwkc3ltLCRiYXNlLCRyZWZsYWJlbCk9QF87CisKKyAgICBpZiAoJDo6cGljICYmICgkOjplbGYgfHwgJDo6YW91dCkpCisgICAgewlpZiAoIWRlZmluZWQoJGJhc2UpKQorCXsgICAmOjpjYWxsKCY6OmxhYmVsKCJQSUNfbWVfdXAiKSk7CisJICAgICY6OnNldF9sYWJlbCgiUElDX21lX3VwIik7CisJICAgICY6OmJsaW5kcG9wKCRkc3QpOworCSAgICAkYmFzZT0kZHN0OworCSAgICAkcmVmbGFiZWw9Jjo6bGFiZWwoIlBJQ19tZV91cCIpOworCX0KKwlpZiAoJDo6bWFjb3N4KQorCXsgICBteSAkaW5kaXJlY3Q9Jjo6c3RhdGljX2xhYmVsKCIkbm1kZWNvciRzeW1cJG5vbl9sYXp5X3B0ciIpOworCSAgICAmOjptb3YoJGRzdCwmOjpEV1AoIiRpbmRpcmVjdC0kcmVmbGFiZWwiLCRiYXNlKSk7CisJICAgICRub25fbGF6eV9wdHJ7IiRubWRlY29yJHN5bSJ9PSRpbmRpcmVjdDsKKwl9CisJZWxzZQorCXsgICAmOjpsZWEoJGRzdCwmOjpEV1AoIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0kcmVmbGFiZWxdIiwKKwkJCSAgICAkYmFzZSkpOworCSAgICAmOjptb3YoJGRzdCwmOjpEV1AoIiRzeW1cQEdPVCIsJGRzdCkpOworCX0KKyAgICB9CisgICAgZWxzZQorICAgIHsJJjo6bGVhKCRkc3QsJjo6RFdQKCRzeW0pKTsJfQorfQorCitzdWIgOjppbml0c2VnCit7IG15ICRmPSRubWRlY29yLnNoaWZ0OworCisgICAgaWYgKCQ6OmVsZikKKyAgICB7CSRpbml0c2VnLj08PF9fXzsKKy5zZWN0aW9uCS5pbml0CisJY2FsbAkkZgorCWptcAkuTGluaXRhbGlnbgorLmFsaWduCSRhbGlnbgorLkxpbml0YWxpZ246CitfX18KKyAgICB9CisgICAgZWxzaWYgKCQ6OmNvZmYpCisgICAgeyAgICRpbml0c2VnLj08PF9fXzsJIyBhcHBsaWVzIHRvIGJvdGggQ3lnd2luIGFuZCBNaW5ndworLnNlY3Rpb24JLmN0b3JzCisubG9uZwkkZgorX19fCisgICAgfQorICAgIGVsc2lmICgkOjptYWNvc3gpCisgICAgewkkaW5pdHNlZy49PDxfX187CisubW9kX2luaXRfZnVuYworLmFsaWduIDIKKy5sb25nICAgJGYKK19fXworICAgIH0KKyAgICBlbHNpZiAoJDo6YW91dCkKKyAgICB7CW15ICRjdG9yPSIke25tZGVjb3J9X0dMT0JBTF9cJElcJCRmIjsKKwkkaW5pdHNlZy49Ii50ZXh0XG4iOworCSRpbml0c2VnLj0iLnR5cGUJJGN0b3IsXEBmdW5jdGlvblxuIiBpZiAoJDo6cGljKTsKKwkkaW5pdHNlZy49PDxfX187CSMgT3BlbkJTRCB3YXkuLi4KKy5nbG9ibAkkY3RvcgorLmFsaWduCTIKKyRjdG9yOgorCWptcAkkZgorX19fCisgICAgfQorfQorCitzdWIgOjpkYXRhc2VnCit7ICAgcHVzaChAb3V0LCIuZGF0YVxuIik7ICAgfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3Blcmxhc20veDg2bWFzbS5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZXJsYXNtL3g4Nm1hc20ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1MGU0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZXJsYXNtL3g4Nm1hc20ucGwKQEAgLTAsMCArMSwxODQgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworcGFja2FnZSB4ODZtYXNtOworCisqb3V0PVxAOjpvdXQ7CisKKyQ6OmxiZGVjb3I9IlwkTCI7CSMgbG9jYWwgbGFiZWwgZGVjb3JhdGlvbgorJG5tZGVjb3I9Il8iOwkJIyBleHRlcm5hbCBuYW1lIGRlY29yYXRpb24KKworJGluaXRzZWc9IiI7Ciskc2VnbWVudD0iIjsKKworc3ViIDo6Z2VuZXJpYworeyBteSAoJG9wY29kZSxAYXJnKT1AXzsKKworICAgICMgZml4IGhleGFkZWNpbWFsIGNvbnN0YW50cworICAgIGZvciAoQGFyZykgeyBzLzB4KFswLTlhLWZdKykvMCQxaC9vaTsgfQorCisgICAgaWYgKCRvcGNvZGUgIX4gL21vdnEvKQorICAgIHsJIyBmaXggeG1tIHJlZmVyZW5jZXMKKwkkYXJnWzBdID1+IHMvXGJbQS1aXStXT1JEXHMrUFRSL1hNTVdPUkQgUFRSL2kgaWYgKCRhcmdbMV09fi9cYnhtbVswLTddXGIvaSk7CisJJGFyZ1sxXSA9fiBzL1xiW0EtWl0rV09SRFxzK1BUUi9YTU1XT1JEIFBUUi9pIGlmICgkYXJnWzBdPX4vXGJ4bW1bMC03XVxiL2kpOworICAgIH0KKworICAgICY6OmVtaXQoJG9wY29kZSxAYXJnKTsKKyAgMTsKK30KKyMKKyMgb3Bjb2RlcyBub3QgY292ZXJlZCBieSA6OmdlbmVyaWMgYWJvdmUsIG1vc3RseSBpbmNvbnNpc3RlbnQgbmFtaW5ncy4uLgorIworc3ViIDo6Y2FsbAl7ICY6OmVtaXQoImNhbGwiLCgmOjppc2xhYmVsKCRfWzBdKSBvciAiJG5tZGVjb3IkX1swXSIpKTsgfQorc3ViIDo6Y2FsbF9wdHIJeyAmOjplbWl0KCJjYWxsIixAXyk7CX0KK3N1YiA6OmptcF9wdHIJeyAmOjplbWl0KCJqbXAiLEBfKTsJfQorCitzdWIgZ2V0X21lbQoreyBteSgkc2l6ZSwkYWRkciwkcmVnMSwkcmVnMiwkaWR4KT1AXzsKKyAgbXkoJHBvc3QsJHJldCk7CisKKyAgICAkcmV0IC49ICIkc2l6ZSBQVFIgIiBpZiAoJHNpemUgbmUgIiIpOworCisgICAgJGFkZHIgPX4gcy9eXHMrLy87CisgICAgIyBwcmVwZW5kIGdsb2JhbCByZWZlcmVuY2VzIHdpdGggb3B0aW9uYWwgdW5kZXJzY29yZQorICAgICRhZGRyID1+IHMvXihbXlwrXC0wLTldW15cK1wtXSopLyY6OmlzbGFiZWwoJDEpIG9yICIkbm1kZWNvciQxIi9pZ2U7CisgICAgIyBwdXQgYWRkcmVzcyBhcml0aG1ldGljIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzaXMKKyAgICAkYWRkcj0iKCRhZGRyKSIgaWYgKCRhZGRyID1+IC9eLitbXC1cK10uKyQvKTsKKworICAgIGlmICgoJGFkZHIgbmUgIiIpICYmICgkYWRkciBuZSAwKSkKKyAgICB7CWlmICgkYWRkciAhfiAvXi0vKQl7ICRyZXQgLj0gIiRhZGRyIjsgIH0KKwllbHNlCQkJeyAkcG9zdD0kYWRkcjsgICAgICB9CisgICAgfQorICAgICRyZXQgLj0gIlsiOworCisgICAgaWYgKCRyZWcyIG5lICIiKQorICAgIHsJJGlkeCE9MCBvciAkaWR4PTE7CisJJHJldCAuPSAiJHJlZzIqJGlkeCI7CisJJHJldCAuPSAiKyRyZWcxIiBpZiAoJHJlZzEgbmUgIiIpOworICAgIH0KKyAgICBlbHNlCisgICAgewkkcmV0IC49ICIkcmVnMSI7ICAgfQorCisgICAgJHJldCAuPSAiJHBvc3RdIjsKKyAgICAkcmV0ID1+IHMvXCtcXS9dLzsgIyBpbiBjYXNlICRhZGRyIHdhcyB0aGUgb25seSBhcmd1bWVudAorICAgICRyZXQgPX4gcy9cW1xzKlxdLy87CisKKyAgJHJldDsKK30KK3N1YiA6OkJQCXsgJmdldF9tZW0oIkJZVEUiLEBfKTsgIH0KK3N1YiA6OkRXUAl7ICZnZXRfbWVtKCJEV09SRCIsQF8pOyB9CitzdWIgOjpRV1AJeyAmZ2V0X21lbSgiUVdPUkQiLEBfKTsgfQorc3ViIDo6QkMJeyAiQF8iOyAgfQorc3ViIDo6RFdDCXsgIkBfIjsgfQorCitzdWIgOjpmaWxlCit7IG15ICR0bXA9PDxfX187CitUSVRMRQkkX1swXS5hc20KK0lGIFxAVmVyc2lvbiBMVCA4MDAKK0VDSE8gTUFTTSB2ZXJzaW9uIDguMDAgb3IgbGF0ZXIgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQuCitFTkRJRgorLjQ4NgorLk1PREVMCUZMQVQKK09QVElPTglET1ROQU1FCitJRiBcQFZlcnNpb24gTFQgODAwCisudGV4dFwkCVNFR01FTlQgUEFHRSAnQ09ERScKK0VMU0UKKy50ZXh0XCQJU0VHTUVOVCBBTElHTig2NCkgJ0NPREUnCitFTkRJRgorX19fCisgICAgcHVzaChAb3V0LCR0bXApOworICAgICRzZWdtZW50ID0gIi50ZXh0XCQiOworfQorCitzdWIgOjpmdW5jdGlvbl9iZWdpbl9CCit7IG15ICRmdW5jPXNoaWZ0OworICBteSAkZ2xvYmFsPSgkZnVuYyAhfiAvXl8vKTsKKyAgbXkgJGJlZ2luPSIkezo6bGJkZWNvcn1fJHtmdW5jfV9iZWdpbiI7CisKKyAgICAmOjpMQUJFTCgkZnVuYywkZ2xvYmFsPyIkYmVnaW4iOiIkbm1kZWNvciRmdW5jIik7CisgICAgJGZ1bmM9IkFMSUdOXHQxNlxuIi4kbm1kZWNvci4kZnVuYy4iXHRQUk9DIjsKKworICAgIGlmICgkZ2xvYmFsKSAgICB7ICRmdW5jLj0iIFBVQkxJQ1xuJHtiZWdpbn06OlxuIjsgfQorICAgIGVsc2UJICAgIHsgJGZ1bmMuPSIgUFJJVkFURVxuIjsgICAgICAgICAgICB9CisgICAgcHVzaChAb3V0LCRmdW5jKTsKKyAgICAkOjpzdGFjaz00OworfQorc3ViIDo6ZnVuY3Rpb25fZW5kX0IKK3sgbXkgJGZ1bmM9c2hpZnQ7CisKKyAgICBwdXNoKEBvdXQsIiRubWRlY29yJGZ1bmMgRU5EUFxuIik7CisgICAgJDo6c3RhY2s9MDsKKyAgICAmOjp3aXBlX2xhYmVscygpOworfQorCitzdWIgOjpmaWxlX2VuZAoreyBteSAkeG1taGVhZGVyPTw8X19fOworLjY4NgorLlhNTQorSUYgXEBWZXJzaW9uIExUIDgwMAorWE1NV09SRCBTVFJVQ1QgMTYKK0RRCTIgZHVwICg/KQorWE1NV09SRAlFTkRTCitFTkRJRgorX19fCisgICAgaWYgKGdyZXAgey9cYlt4XT9tbVswLTddXGIvaX0gQG91dCkgeworCWdyZXAge3MvXC5bMy03XTg2LyR4bW1oZWFkZXIvfSBAb3V0OworICAgIH0KKworICAgIHB1c2goQG91dCwiJHNlZ21lbnQJRU5EU1xuIik7CisKKyAgICBpZiAoZ3JlcCB7L1xiJHtubWRlY29yfU9QRU5TU0xfaWEzMmNhcF9QXGIvaX0gQG91dCkKKyAgICB7CW15ICRjb21tPTw8X19fOworLmJzcwlTRUdNRU5UICdCU1MnCitDT01NCSR7bm1kZWNvcn1PUEVOU1NMX2lhMzJjYXBfUDpEV09SRAorLmJzcwlFTkRTCitfX18KKwkjIGNvbW1lbnQgb3V0IE9QRU5TU0xfaWEzMmNhcF9QIGRlY2xhcmF0aW9ucworCWdyZXAge3MvKF5FWFRFUk5ccyske25tZGVjb3J9T1BFTlNTTF9pYTMyY2FwX1ApL1w7JDEvfSBAb3V0OworCXB1c2ggKEBvdXQsJGNvbW0pOworICAgIH0KKyAgICBwdXNoIChAb3V0LCRpbml0c2VnKSBpZiAoJGluaXRzZWcpOworICAgIHB1c2ggKEBvdXQsIkVORFxuIik7Cit9CisKK3N1YiA6OmNvbW1lbnQgeyAgIGZvcmVhY2ggKEBfKSB7IHB1c2goQG91dCwiXHQ7ICRfXG4iKTsgfSAgIH0KKworKjo6c2V0X2xhYmVsX0IgPSBzdWIKK3sgbXkgJGw9c2hpZnQ7IHB1c2goQG91dCwkbC4oJGw9fi9eXFEkezo6bGJkZWNvcn1cRVswLTldezN9Lz8iOlxuIjoiOjpcbiIpKTsgfTsKKworc3ViIDo6ZXh0ZXJuYWxfbGFiZWwKK3sgICBmb3JlYWNoKEBfKQorICAgIHsJcHVzaChAb3V0LCAiRVhURVJOXHQiLiY6OkxBQkVMKCRfLCRubWRlY29yLiRfKS4iOk5FQVJcbiIpOyAgIH0KK30KKworc3ViIDo6cHVibGljX2xhYmVsCit7ICAgcHVzaChAb3V0LCJQVUJMSUNcdCIuJjo6TEFCRUwoJF9bMF0sJG5tZGVjb3IuJF9bMF0pLiJcbiIpOyAgIH0KKworc3ViIDo6ZGF0YV9ieXRlCit7ICAgcHVzaChAb3V0LCgiREJcdCIpLmpvaW4oJywnLEBfKS4iXG4iKTsJfQorCitzdWIgOjpkYXRhX3dvcmQKK3sgICBwdXNoKEBvdXQsKCJERFx0Iikuam9pbignLCcsQF8pLiJcbiIpOwl9CisKK3N1YiA6OmFsaWduCit7ICAgcHVzaChAb3V0LCJBTElHTlx0JF9bMF1cbiIpOwl9CisKK3N1YiA6OnBpY21ldXAKK3sgbXkoJGRzdCwkc3ltKT1AXzsKKyAgICAmOjpsZWEoJGRzdCwmOjpEV1AoJHN5bSkpOworfQorCitzdWIgOjppbml0c2VnCit7IG15ICRmPSRubWRlY29yLnNoaWZ0OworCisgICAgJGluaXRzZWcuPTw8X19fOworLkNSVFwkWENVCVNFR01FTlQgRFdPUkQgUFVCTElDICdEQVRBJworRVhURVJOCSRmOk5FQVIKK0RECSRmCisuQ1JUXCRYQ1UJRU5EUworX19fCit9CisKK3N1YiA6OmRhdGFzZWcKK3sgICBwdXNoKEBvdXQsIiRzZWdtZW50XHRFTkRTXG5fREFUQVx0U0VHTUVOVFxuIik7ICRzZWdtZW50PSJfREFUQSI7ICAgfQorCisxOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3Blcmxhc20veDg2bmFzbS5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZXJsYXNtL3g4Nm5hc20ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyYmVkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wZXJsYXNtL3g4Nm5hc20ucGwKQEAgLTAsMCArMSwxNjYgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworcGFja2FnZSB4ODZuYXNtOworCisqb3V0PVxAOjpvdXQ7CisKKyQ6OmxiZGVjb3I9IkxcJCI7CQkjIGxvY2FsIGxhYmVsIGRlY29yYXRpb24KKyRubWRlY29yPSQ6Om5ldHdhcmU/IiI6Il8iOwkjIGV4dGVybmFsIG5hbWUgZGVjb3JhdGlvbgorJGRyZGVjb3I9JDo6bXdlcmtzPyIuIjoiIjsJIyBkaXJlY3RpdmUgZGVjb3JhdGlvbgorCiskaW5pdHNlZz0iIjsKKworc3ViIDo6Z2VuZXJpYworeyBteSAkb3Bjb2RlPXNoaWZ0OworICBteSAkdG1wOworCisgICAgaWYgKCEkOjptd2Vya3MpCisgICAgeyAgIGlmICAgICgkb3Bjb2RlID1+IG0vXmovbyAmJiAkI189PTApICMgb3B0aW1pemUganVtcHMKKwl7ICAgJF9bMF0gPSAiTkVBUiAkX1swXSI7ICAgCX0KKwllbHNpZiAoJG9wY29kZSBlcSAibGVhIiAmJiAkI189PTEpICAjIHdpcGUgc3RvcmFnZSBxdWFsaWZpZXIgZnJvbSBsZWEKKwl7ICAgJF9bMV0gPX4gcy9eW15cW10qXFsvXFsvbzsJfQorICAgIH0KKyAgICAmOjplbWl0KCRvcGNvZGUsQF8pOworICAxOworfQorIworIyBvcGNvZGVzIG5vdCBjb3ZlcmVkIGJ5IDo6Z2VuZXJpYyBhYm92ZSwgbW9zdGx5IGluY29uc2lzdGVudCBuYW1pbmdzLi4uCisjCitzdWIgOjpjYWxsCXsgJjo6ZW1pdCgiY2FsbCIsKCY6OmlzbGFiZWwoJF9bMF0pIG9yICIkbm1kZWNvciRfWzBdIikpOyB9CitzdWIgOjpjYWxsX3B0cgl7ICY6OmVtaXQoImNhbGwiLEBfKTsJfQorc3ViIDo6am1wX3B0cgl7ICY6OmVtaXQoImptcCIsQF8pOwl9CisKK3N1YiBnZXRfbWVtCit7IG15KCRzaXplLCRhZGRyLCRyZWcxLCRyZWcyLCRpZHgpPUBfOworICBteSgkcG9zdCwkcmV0KTsKKworICAgIGlmICgkc2l6ZSBuZSAiIikKKyAgICB7CSRyZXQgLj0gIiRzaXplIjsKKwkkcmV0IC49ICIgUFRSIiBpZiAoJDo6bXdlcmtzKTsKKwkkcmV0IC49ICIgIjsKKyAgICB9CisgICAgJHJldCAuPSAiWyI7CisKKyAgICAkYWRkciA9fiBzL15ccysvLzsKKyAgICAjIHByZXBlbmQgZ2xvYmFsIHJlZmVyZW5jZXMgd2l0aCBvcHRpb25hbCB1bmRlcnNjb3JlCisgICAgJGFkZHIgPX4gcy9eKFteXCtcLTAtOV1bXlwrXC1dKikvOjppc2xhYmVsKCQxKSBvciAiJG5tZGVjb3IkMSIvaWdlOworICAgICMgcHV0IGFkZHJlc3MgYXJpdGhtZXRpYyBleHByZXNzaW9uIGluIHBhcmVudGhlc2lzCisgICAgJGFkZHI9IigkYWRkcikiIGlmICgkYWRkciA9fiAvXi4rW1wtXCtdLiskLyk7CisKKyAgICBpZiAoKCRhZGRyIG5lICIiKSAmJiAoJGFkZHIgbmUgMCkpCisgICAgewlpZiAoJGFkZHIgIX4gL14tLykJeyAkcmV0IC49ICIkYWRkcisiOyB9CisJZWxzZQkJCXsgJHBvc3Q9JGFkZHI7ICAgICAgfQorICAgIH0KKworICAgIGlmICgkcmVnMiBuZSAiIikKKyAgICB7CSRpZHghPTAgb3IgJGlkeD0xOworCSRyZXQgLj0gIiRyZWcyKiRpZHgiOworCSRyZXQgLj0gIiskcmVnMSIgaWYgKCRyZWcxIG5lICIiKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsJJHJldCAuPSAiJHJlZzEiOyAgIH0KKworICAgICRyZXQgLj0gIiRwb3N0XSI7CisgICAgJHJldCA9fiBzL1wrXF0vXS87ICMgaW4gY2FzZSAkYWRkciB3YXMgdGhlIG9ubHkgYXJndW1lbnQKKworICAkcmV0OworfQorc3ViIDo6QlAJeyAmZ2V0X21lbSgiQllURSIsQF8pOyAgfQorc3ViIDo6RFdQCXsgJmdldF9tZW0oIkRXT1JEIixAXyk7IH0KK3N1YiA6OlFXUAl7ICZnZXRfbWVtKCIiLEBfKTsgICAgICB9CitzdWIgOjpCQwl7ICgoJDo6bXdlcmtzKT8iIjoiQllURSAiKS4iQF8iOyAgfQorc3ViIDo6RFdDCXsgKCgkOjptd2Vya3MpPyIiOiJEV09SRCAiKS4iQF8iOyB9CisKK3N1YiA6OmZpbGUKK3sgICBpZiAoJDo6bXdlcmtzKQl7IHB1c2goQG91dCwiLnNlY3Rpb25cdC50ZXh0LDY0XG4iKTsgfQorICAgIGVsc2UKKyAgICB7IG15ICR0bXA9PDxfX187CislaWZpZG4gX19PVVRQVVRfRk9STUFUX18sb2JqCitzZWN0aW9uCWNvZGUJdXNlMzIgY2xhc3M9Y29kZSBhbGlnbj02NAorJWVsaWZpZG4gX19PVVRQVVRfRk9STUFUX18sd2luMzIKK1wkXEBmZWF0LjAwIGVxdSAxCitzZWN0aW9uCS50ZXh0CWNvZGUgYWxpZ249NjQKKyVlbHNlCitzZWN0aW9uCS50ZXh0CWNvZGUKKyVlbmRpZgorX19fCisJcHVzaChAb3V0LCR0bXApOworICAgIH0KK30KKworc3ViIDo6ZnVuY3Rpb25fYmVnaW5fQgoreyBteSAkZnVuYz1zaGlmdDsKKyAgbXkgJGdsb2JhbD0oJGZ1bmMgIX4gL15fLyk7CisgIG15ICRiZWdpbj0iJHs6OmxiZGVjb3J9XyR7ZnVuY31fYmVnaW4iOworCisgICAgJGJlZ2luID1+IHMvXlxALy4vIGlmICgkOjptd2Vya3MpOwkjIHRoZSB0b3J0dXJlIG5ldmVyIHN0b3BzCisKKyAgICAmOjpMQUJFTCgkZnVuYywkZ2xvYmFsPyIkYmVnaW4iOiIkbm1kZWNvciRmdW5jIik7CisgICAgJGZ1bmM9JG5tZGVjb3IuJGZ1bmM7CisKKyAgICBwdXNoKEBvdXQsIiR7ZHJkZWNvcn1nbG9iYWwJJGZ1bmNcbiIpCWlmICgkZ2xvYmFsKTsKKyAgICBwdXNoKEBvdXQsIiR7ZHJkZWNvcn1hbGlnbgkxNlxuIik7CisgICAgcHVzaChAb3V0LCIkZnVuYzpcbiIpOworICAgIHB1c2goQG91dCwiJGJlZ2luOlxuIikJCQlpZiAoJGdsb2JhbCk7CisgICAgJDo6c3RhY2s9NDsKK30KKworc3ViIDo6ZnVuY3Rpb25fZW5kX0IKK3sgICAkOjpzdGFjaz0wOworICAgICY6OndpcGVfbGFiZWxzKCk7Cit9CisKK3N1YiA6OmZpbGVfZW5kCit7ICAgaWYgKGdyZXAgey9cYiR7bm1kZWNvcn1PUEVOU1NMX2lhMzJjYXBfUFxiL2l9IEBvdXQpCisgICAgewlteSAkY29tbT08PF9fXzsKKyR7ZHJkZWNvcn1zZWdtZW50CS5ic3MKKyR7ZHJkZWNvcn1jb21tb24JJHtubWRlY29yfU9QRU5TU0xfaWEzMmNhcF9QIDQKK19fXworCSMgY29tbWVudCBvdXQgT1BFTlNTTF9pYTMyY2FwX1AgZGVjbGFyYXRpb25zCisJZ3JlcCB7cy8oXmV4dGVyblxzKyR7bm1kZWNvcn1PUEVOU1NMX2lhMzJjYXBfUCkvXDskMS99IEBvdXQ7CisJcHVzaCAoQG91dCwkY29tbSkKKyAgICB9CisgICAgcHVzaCAoQG91dCwkaW5pdHNlZykgaWYgKCRpbml0c2VnKTsJCQorfQorCitzdWIgOjpjb21tZW50IHsgICBmb3JlYWNoIChAXykgeyBwdXNoKEBvdXQsIlx0OyAkX1xuIik7IH0gICB9CisKK3N1YiA6OmV4dGVybmFsX2xhYmVsCit7ICAgZm9yZWFjaChAXykKKyAgICB7CXB1c2goQG91dCwiJHtkcmRlY29yfWV4dGVyblx0Ii4mOjpMQUJFTCgkXywkbm1kZWNvci4kXykuIlxuIik7ICAgfQorfQorCitzdWIgOjpwdWJsaWNfbGFiZWwKK3sgICBwdXNoKEBvdXQsIiR7ZHJkZWNvcn1nbG9iYWxcdCIuJjo6TEFCRUwoJF9bMF0sJG5tZGVjb3IuJF9bMF0pLiJcbiIpOyAgfQorCitzdWIgOjpkYXRhX2J5dGUKK3sgICBwdXNoKEBvdXQsKCgkOjptd2Vya3MpPyIuYnl0ZVx0IjoiZGJcdCIpLmpvaW4oJywnLEBfKS4iXG4iKTsJfQorCitzdWIgOjpkYXRhX3dvcmQKK3sgICBwdXNoKEBvdXQsKCgkOjptd2Vya3MpPyIubG9uZ1x0IjoiZGRcdCIpLmpvaW4oJywnLEBfKS4iXG4iKTsJfQorCitzdWIgOjphbGlnbgoreyAgIHB1c2goQG91dCwiJHtkcmRlY29yfWFsaWduXHQkX1swXVxuIik7CX0KKworc3ViIDo6cGljbWV1cAoreyBteSgkZHN0LCRzeW0pPUBfOworICAgICY6OmxlYSgkZHN0LCY6OkRXUCgkc3ltKSk7Cit9CisKK3N1YiA6OmluaXRzZWcKK3sgbXkgJGY9JG5tZGVjb3Iuc2hpZnQ7CisgICAgaWYgKCQ6OndpbjMyKQorICAgIHsJJGluaXRzZWc9PDxfX187CitzZWdtZW50CS5DUlRcJFhDVSBkYXRhIGFsaWduPTQKK2V4dGVybgkkZgorZGQJJGYKK19fXworICAgIH0KK30KKworc3ViIDo6ZGF0YXNlZworeyAgIGlmICgkbXdlcmtzKQl7IHB1c2goQG91dCwiLnNlY3Rpb25cdC5kYXRhLDRcbiIpOyAgIH0KKyAgICBlbHNlCQl7IHB1c2goQG91dCwic2VjdGlvblx0LmRhdGEgYWxpZ249NFxuIik7IH0KK30KKworMTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2FkZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfYWRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdhYzVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2FkZC5jCkBAIC0wLDAgKzEsMjQwIEBACisvKiBwMTJfYWRkLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KKworLyogUGFjayBhbiBvYmplY3QgaW50byBhbiBPQ1RFVCBTVFJJTkcgYW5kIHR1cm4gaW50byBhIHNhZmViYWcgKi8KKworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9pdGVtX3BhY2tfc2FmZWJhZyh2b2lkICpvYmosIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBuaWQxLAorCSAgICAgaW50IG5pZDIpCit7CisJUEtDUzEyX0JBR1MgKmJhZzsKKwlQS0NTMTJfU0FGRUJBRyAqc2FmZWJhZzsKKwlpZiAoIShiYWcgPSBQS0NTMTJfQkFHU19uZXcoKSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9JVEVNX1BBQ0tfU0FGRUJBRywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYmFnLT50eXBlID0gT0JKX25pZDJvYmoobmlkMSk7CisJaWYgKCFBU04xX2l0ZW1fcGFjayhvYmosIGl0LCAmYmFnLT52YWx1ZS5vY3RldCkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9JVEVNX1BBQ0tfU0FGRUJBRywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCEoc2FmZWJhZyA9IFBLQ1MxMl9TQUZFQkFHX25ldygpKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX0lURU1fUEFDS19TQUZFQkFHLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzYWZlYmFnLT52YWx1ZS5iYWcgPSBiYWc7CisJc2FmZWJhZy0+dHlwZSA9IE9CSl9uaWQyb2JqKG5pZDIpOworCXJldHVybiBzYWZlYmFnOworfQorCisvKiBUdXJuIFBLQ1M4IG9iamVjdCBpbnRvIGEga2V5YmFnICovCisKK1BLQ1MxMl9TQUZFQkFHICpQS0NTMTJfTUFLRV9LRVlCQUcoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgpCit7CisJUEtDUzEyX1NBRkVCQUcgKmJhZzsKKwlpZiAoIShiYWcgPSBQS0NTMTJfU0FGRUJBR19uZXcoKSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9NQUtFX0tFWUJBRyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwliYWctPnR5cGUgPSBPQkpfbmlkMm9iaihOSURfa2V5QmFnKTsKKwliYWctPnZhbHVlLmtleWJhZyA9IHA4OworCXJldHVybiBiYWc7Cit9CisKKy8qIFR1cm4gUEtDUzggb2JqZWN0IGludG8gYSBzaHJvdWRlZCBrZXliYWcgKi8KKworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9NQUtFX1NIS0VZQkFHKGludCBwYmVfbmlkLCBjb25zdCBjaGFyICpwYXNzLAorCSAgICAgaW50IHBhc3NsZW4sIHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLCBpbnQgaXRlciwKKwkgICAgIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KQoreworCVBLQ1MxMl9TQUZFQkFHICpiYWc7CisJY29uc3QgRVZQX0NJUEhFUiAqcGJlX2NpcGg7CisKKwkvKiBTZXQgdXAgdGhlIHNhZmUgYmFnICovCisJaWYgKCEoYmFnID0gUEtDUzEyX1NBRkVCQUdfbmV3KCkpKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfTUFLRV9TSEtFWUJBRywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwliYWctPnR5cGUgPSBPQkpfbmlkMm9iaihOSURfcGtjczhTaHJvdWRlZEtleUJhZyk7CisKKwlwYmVfY2lwaCA9IEVWUF9nZXRfY2lwaGVyYnluaWQocGJlX25pZCk7CisKKwlpZiAocGJlX2NpcGgpCisJCXBiZV9uaWQgPSAtMTsKKworCWlmICghKGJhZy0+dmFsdWUuc2hrZXliYWcgPSAKKwkgIFBLQ1M4X2VuY3J5cHQocGJlX25pZCwgcGJlX2NpcGgsIHBhc3MsIHBhc3NsZW4sIHNhbHQsIHNhbHRsZW4sIGl0ZXIsCisJCQkJCQkJCQkgcDgpKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX01BS0VfU0hLRVlCQUcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGJhZzsKK30KKworLyogVHVybiBhIHN0YWNrIG9mIFNBRkVCQUdTIGludG8gYSBQS0NTIzcgZGF0YSBDb250ZW50aW5mbyAqLworUEtDUzcgKlBLQ1MxMl9wYWNrX3A3ZGF0YShTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKnNrKQoreworCVBLQ1M3ICpwNzsKKwlpZiAoIShwNyA9IFBLQ1M3X25ldygpKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1BBQ0tfUDdEQVRBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlwNy0+dHlwZSA9IE9CSl9uaWQyb2JqKE5JRF9wa2NzN19kYXRhKTsKKwlpZiAoIShwNy0+ZC5kYXRhID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcoKSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9QQUNLX1A3REFUQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJaWYgKCFBU04xX2l0ZW1fcGFjayhzaywgQVNOMV9JVEVNX3JwdHIoUEtDUzEyX1NBRkVCQUdTKSwgJnA3LT5kLmRhdGEpKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEFDS19QN0RBVEEsIFBLQ1MxMl9SX0NBTlRfUEFDS19TVFJVQ1RVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHA3OworfQorCisvKiBVbnBhY2sgU0FGRUJBR1MgZnJvbSBQS0NTIzcgZGF0YSBDb250ZW50SW5mbyAqLworU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpQS0NTMTJfdW5wYWNrX3A3ZGF0YShQS0NTNyAqcDcpCit7CisJaWYoIVBLQ1M3X3R5cGVfaXNfZGF0YShwNykpCisJCXsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9VTlBBQ0tfUDdEQVRBLFBLQ1MxMl9SX0NPTlRFTlRfVFlQRV9OT1RfREFUQSk7CisJCXJldHVybiBOVUxMOworCQl9CisJcmV0dXJuIEFTTjFfaXRlbV91bnBhY2socDctPmQuZGF0YSwgQVNOMV9JVEVNX3JwdHIoUEtDUzEyX1NBRkVCQUdTKSk7Cit9CisKKy8qIFR1cm4gYSBzdGFjayBvZiBTQUZFQkFHUyBpbnRvIGEgUEtDUyM3IGVuY3J5cHRlZCBkYXRhIENvbnRlbnRJbmZvICovCisKK1BLQ1M3ICpQS0NTMTJfcGFja19wN2VuY2RhdGEoaW50IHBiZV9uaWQsIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpdGVyLAorCQkJICAgICAgU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzKQoreworCVBLQ1M3ICpwNzsKKwlYNTA5X0FMR09SICpwYmU7CisJY29uc3QgRVZQX0NJUEhFUiAqcGJlX2NpcGg7CisJaWYgKCEocDcgPSBQS0NTN19uZXcoKSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9QQUNLX1A3RU5DREFUQSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYoIVBLQ1M3X3NldF90eXBlKHA3LCBOSURfcGtjczdfZW5jcnlwdGVkKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1BBQ0tfUDdFTkNEQVRBLAorCQkJCVBLQ1MxMl9SX0VSUk9SX1NFVFRJTkdfRU5DUllQVEVEX0RBVEFfVFlQRSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXBiZV9jaXBoID0gRVZQX2dldF9jaXBoZXJieW5pZChwYmVfbmlkKTsKKworCWlmIChwYmVfY2lwaCkKKwkJcGJlID0gUEtDUzVfcGJlMl9zZXQocGJlX2NpcGgsIGl0ZXIsIHNhbHQsIHNhbHRsZW4pOworCWVsc2UKKwkJcGJlID0gUEtDUzVfcGJlX3NldChwYmVfbmlkLCBpdGVyLCBzYWx0LCBzYWx0bGVuKTsKKworCWlmICghcGJlKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEFDS19QN0VOQ0RBVEEsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVg1MDlfQUxHT1JfZnJlZShwNy0+ZC5lbmNyeXB0ZWQtPmVuY19kYXRhLT5hbGdvcml0aG0pOworCXA3LT5kLmVuY3J5cHRlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobSA9IHBiZTsKKwlNX0FTTjFfT0NURVRfU1RSSU5HX2ZyZWUocDctPmQuZW5jcnlwdGVkLT5lbmNfZGF0YS0+ZW5jX2RhdGEpOworCWlmICghKHA3LT5kLmVuY3J5cHRlZC0+ZW5jX2RhdGEtPmVuY19kYXRhID0KKwlQS0NTMTJfaXRlbV9pMmRfZW5jcnlwdChwYmUsIEFTTjFfSVRFTV9ycHRyKFBLQ1MxMl9TQUZFQkFHUyksIHBhc3MsIHBhc3NsZW4sCisJCQkJIGJhZ3MsIDEpKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1BBQ0tfUDdFTkNEQVRBLCBQS0NTMTJfUl9FTkNSWVBUX0VSUk9SKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHA3OworfQorCitTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKlBLQ1MxMl91bnBhY2tfcDdlbmNkYXRhKFBLQ1M3ICpwNywgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4pCit7CisJaWYoIVBLQ1M3X3R5cGVfaXNfZW5jcnlwdGVkKHA3KSkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIFBLQ1MxMl9pdGVtX2RlY3J5cHRfZDJpKHA3LT5kLmVuY3J5cHRlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobSwKKwkJCSAgICAgICAgICAgQVNOMV9JVEVNX3JwdHIoUEtDUzEyX1NBRkVCQUdTKSwKKwkJCQkgICBwYXNzLCBwYXNzbGVuLAorCQkJICAgICAgICAgICBwNy0+ZC5lbmNyeXB0ZWQtPmVuY19kYXRhLT5lbmNfZGF0YSwgMSk7Cit9CisKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKlBLQ1MxMl9kZWNyeXB0X3NrZXkoUEtDUzEyX1NBRkVCQUcgKmJhZywgY29uc3QgY2hhciAqcGFzcywKKwkJCQkJCQkJaW50IHBhc3NsZW4pCit7CisJcmV0dXJuIFBLQ1M4X2RlY3J5cHQoYmFnLT52YWx1ZS5zaGtleWJhZywgcGFzcywgcGFzc2xlbik7Cit9CisKK2ludCBQS0NTMTJfcGFja19hdXRoc2FmZXMoUEtDUzEyICpwMTIsIFNUQUNLX09GKFBLQ1M3KSAqc2FmZXMpIAoreworCWlmKEFTTjFfaXRlbV9wYWNrKHNhZmVzLCBBU04xX0lURU1fcnB0cihQS0NTMTJfQVVUSFNBRkVTKSwKKwkJJnAxMi0+YXV0aHNhZmVzLT5kLmRhdGEpKSAKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitTVEFDS19PRihQS0NTNykgKlBLQ1MxMl91bnBhY2tfYXV0aHNhZmVzKFBLQ1MxMiAqcDEyKQoreworCWlmICghUEtDUzdfdHlwZV9pc19kYXRhKHAxMi0+YXV0aHNhZmVzKSkKKwkJeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1VOUEFDS19BVVRIU0FGRVMsUEtDUzEyX1JfQ09OVEVOVF9UWVBFX05PVF9EQVRBKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlyZXR1cm4gQVNOMV9pdGVtX3VucGFjayhwMTItPmF1dGhzYWZlcy0+ZC5kYXRhLCBBU04xX0lURU1fcnB0cihQS0NTMTJfQVVUSFNBRkVTKSk7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9hc24uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2Fzbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjc2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9hc24uYwpAQCAtMCwwICsxLDEyNSBAQAorLyogcDEyX2Fzbi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCisvKiBQS0NTIzEyIEFTTjEgbW9kdWxlICovCisKK0FTTjFfU0VRVUVOQ0UoUEtDUzEyKSA9IHsKKwlBU04xX1NJTVBMRShQS0NTMTIsIHZlcnNpb24sIEFTTjFfSU5URUdFUiksCisJQVNOMV9TSU1QTEUoUEtDUzEyLCBhdXRoc2FmZXMsIFBLQ1M3KSwKKwlBU04xX09QVChQS0NTMTIsIG1hYywgUEtDUzEyX01BQ19EQVRBKQorfSBBU04xX1NFUVVFTkNFX0VORChQS0NTMTIpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQS0NTMTIpCisKK0FTTjFfU0VRVUVOQ0UoUEtDUzEyX01BQ19EQVRBKSA9IHsKKwlBU04xX1NJTVBMRShQS0NTMTJfTUFDX0RBVEEsIGRpbmZvLCBYNTA5X1NJRyksCisJQVNOMV9TSU1QTEUoUEtDUzEyX01BQ19EQVRBLCBzYWx0LCBBU04xX09DVEVUX1NUUklORyksCisJQVNOMV9PUFQoUEtDUzEyX01BQ19EQVRBLCBpdGVyLCBBU04xX0lOVEVHRVIpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBLQ1MxMl9NQUNfREFUQSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBLQ1MxMl9NQUNfREFUQSkKKworQVNOMV9BREJfVEVNUExBVEUoYmFnX2RlZmF1bHQpID0gQVNOMV9FWFAoUEtDUzEyX0JBR1MsIHZhbHVlLm90aGVyLCBBU04xX0FOWSwgMCk7CisKK0FTTjFfQURCKFBLQ1MxMl9CQUdTKSA9IHsKKwlBREJfRU5UUlkoTklEX3g1MDlDZXJ0aWZpY2F0ZSwgQVNOMV9FWFAoUEtDUzEyX0JBR1MsIHZhbHVlLng1MDljZXJ0LCBBU04xX09DVEVUX1NUUklORywgMCkpLAorCUFEQl9FTlRSWShOSURfeDUwOUNybCwgQVNOMV9FWFAoUEtDUzEyX0JBR1MsIHZhbHVlLng1MDljcmwsIEFTTjFfT0NURVRfU1RSSU5HLCAwKSksCisJQURCX0VOVFJZKE5JRF9zZHNpQ2VydGlmaWNhdGUsIEFTTjFfRVhQKFBLQ1MxMl9CQUdTLCB2YWx1ZS5zZHNpY2VydCwgQVNOMV9JQTVTVFJJTkcsIDApKSwKK30gQVNOMV9BREJfRU5EKFBLQ1MxMl9CQUdTLCAwLCB0eXBlLCAwLCAmYmFnX2RlZmF1bHRfdHQsIE5VTEwpOworCitBU04xX1NFUVVFTkNFKFBLQ1MxMl9CQUdTKSA9IHsKKwlBU04xX1NJTVBMRShQS0NTMTJfQkFHUywgdHlwZSwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfQURCX09CSkVDVChQS0NTMTJfQkFHUyksCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBLQ1MxMl9CQUdTKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEtDUzEyX0JBR1MpCisKK0FTTjFfQURCX1RFTVBMQVRFKHNhZmViYWdfZGVmYXVsdCkgPSBBU04xX0VYUChQS0NTMTJfU0FGRUJBRywgdmFsdWUub3RoZXIsIEFTTjFfQU5ZLCAwKTsKKworQVNOMV9BREIoUEtDUzEyX1NBRkVCQUcpID0geworCUFEQl9FTlRSWShOSURfa2V5QmFnLCBBU04xX0VYUChQS0NTMTJfU0FGRUJBRywgdmFsdWUua2V5YmFnLCBQS0NTOF9QUklWX0tFWV9JTkZPLCAwKSksCisJQURCX0VOVFJZKE5JRF9wa2NzOFNocm91ZGVkS2V5QmFnLCBBU04xX0VYUChQS0NTMTJfU0FGRUJBRywgdmFsdWUuc2hrZXliYWcsIFg1MDlfU0lHLCAwKSksCisJQURCX0VOVFJZKE5JRF9zYWZlQ29udGVudHNCYWcsIEFTTjFfRVhQX1NFVF9PRihQS0NTMTJfU0FGRUJBRywgdmFsdWUuc2FmZXMsIFBLQ1MxMl9TQUZFQkFHLCAwKSksCisJQURCX0VOVFJZKE5JRF9jZXJ0QmFnLCBBU04xX0VYUChQS0NTMTJfU0FGRUJBRywgdmFsdWUuYmFnLCBQS0NTMTJfQkFHUywgMCkpLAorCUFEQl9FTlRSWShOSURfY3JsQmFnLCBBU04xX0VYUChQS0NTMTJfU0FGRUJBRywgdmFsdWUuYmFnLCBQS0NTMTJfQkFHUywgMCkpLAorCUFEQl9FTlRSWShOSURfc2VjcmV0QmFnLCBBU04xX0VYUChQS0NTMTJfU0FGRUJBRywgdmFsdWUuYmFnLCBQS0NTMTJfQkFHUywgMCkpCit9IEFTTjFfQURCX0VORChQS0NTMTJfU0FGRUJBRywgMCwgdHlwZSwgMCwgJnNhZmViYWdfZGVmYXVsdF90dCwgTlVMTCk7CisKK0FTTjFfU0VRVUVOQ0UoUEtDUzEyX1NBRkVCQUcpID0geworCUFTTjFfU0lNUExFKFBLQ1MxMl9TQUZFQkFHLCB0eXBlLCBBU04xX09CSkVDVCksCisJQVNOMV9BREJfT0JKRUNUKFBLQ1MxMl9TQUZFQkFHKSwKKwlBU04xX1NFVF9PRl9PUFQoUEtDUzEyX1NBRkVCQUcsIGF0dHJpYiwgWDUwOV9BVFRSSUJVVEUpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBLQ1MxMl9TQUZFQkFHKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEtDUzEyX1NBRkVCQUcpCisKKy8qIFNFUVVFTkNFIE9GIFNhZmVCYWcgKi8KK0FTTjFfSVRFTV9URU1QTEFURShQS0NTMTJfU0FGRUJBR1MpID0gCisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRiwgMCwgUEtDUzEyX1NBRkVCQUdTLCBQS0NTMTJfU0FGRUJBRykKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoUEtDUzEyX1NBRkVCQUdTKQorCisvKiBBdXRoc2FmZXM6IFNFUVVFTkNFIE9GIFBLQ1M3ICovCitBU04xX0lURU1fVEVNUExBVEUoUEtDUzEyX0FVVEhTQUZFUykgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBQS0NTMTJfQVVUSFNBRkVTLCBQS0NTNykKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoUEtDUzEyX0FVVEhTQUZFUykKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfYXR0ci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDljMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9hdHRyLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIHAxMl9hdHRyLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KKworLyogQWRkIGEgbG9jYWwga2V5aWQgdG8gYSBzYWZlYmFnICovCisKK2ludCBQS0NTMTJfYWRkX2xvY2Fsa2V5aWQoUEtDUzEyX1NBRkVCQUcgKmJhZywgdW5zaWduZWQgY2hhciAqbmFtZSwKKwkgICAgIGludCBuYW1lbGVuKQoreworCWlmIChYNTA5YXRfYWRkMV9hdHRyX2J5X05JRCgmYmFnLT5hdHRyaWIsIE5JRF9sb2NhbEtleUlELAorCQkJCVZfQVNOMV9PQ1RFVF9TVFJJTkcsIG5hbWUsIG5hbWVsZW4pKQorCQlyZXR1cm4gMTsKKwllbHNlIAorCQlyZXR1cm4gMDsKK30KKworLyogQWRkIGtleSB1c2FnZSB0byBQS0NTIzggc3RydWN0dXJlICovCisKK2ludCBQS0NTOF9hZGRfa2V5dXNhZ2UoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGludCB1c2FnZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHVzX3ZhbDsKKwl1c192YWwgPSAodW5zaWduZWQgY2hhcikgdXNhZ2U7CisJaWYgKFg1MDlhdF9hZGQxX2F0dHJfYnlfTklEKCZwOC0+YXR0cmlidXRlcywgTklEX2tleV91c2FnZSwKKwkJCQlWX0FTTjFfQklUX1NUUklORywgJnVzX3ZhbCwgMSkpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIEFkZCBhIGZyaWVuZGx5bmFtZSB0byBhIHNhZmViYWcgKi8KKworaW50IFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX2FzYyhQS0NTMTJfU0FGRUJBRyAqYmFnLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSBpbnQgbmFtZWxlbikKK3sKKwlpZiAoWDUwOWF0X2FkZDFfYXR0cl9ieV9OSUQoJmJhZy0+YXR0cmliLCBOSURfZnJpZW5kbHlOYW1lLAorCQkJCU1CU1RSSU5HX0FTQywgKHVuc2lnbmVkIGNoYXIgKiluYW1lLCBuYW1lbGVuKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworCitpbnQgUEtDUzEyX2FkZF9mcmllbmRseW5hbWVfdW5pKFBLQ1MxMl9TQUZFQkFHICpiYWcsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCWlmIChYNTA5YXRfYWRkMV9hdHRyX2J5X05JRCgmYmFnLT5hdHRyaWIsIE5JRF9mcmllbmRseU5hbWUsCisJCQkJTUJTVFJJTkdfQk1QLCBuYW1lLCBuYW1lbGVuKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworaW50IFBLQ1MxMl9hZGRfQ1NQTmFtZV9hc2MoUEtDUzEyX1NBRkVCQUcgKmJhZywgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgaW50IG5hbWVsZW4pCit7CisJaWYgKFg1MDlhdF9hZGQxX2F0dHJfYnlfTklEKCZiYWctPmF0dHJpYiwgTklEX21zX2NzcF9uYW1lLAorCQkJCU1CU1RSSU5HX0FTQywgKHVuc2lnbmVkIGNoYXIgKiluYW1lLCBuYW1lbGVuKSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworQVNOMV9UWVBFICpQS0NTMTJfZ2V0X2F0dHJfZ2VuKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqYXR0cnMsIGludCBhdHRyX25pZCkKK3sKKwlYNTA5X0FUVFJJQlVURSAqYXR0cmliOworCWludCBpOworCWlmICghYXR0cnMpIHJldHVybiBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X0FUVFJJQlVURV9udW0gKGF0dHJzKTsgaSsrKSB7CisJCWF0dHJpYiA9IHNrX1g1MDlfQVRUUklCVVRFX3ZhbHVlIChhdHRycywgaSk7CisJCWlmIChPQkpfb2JqMm5pZCAoYXR0cmliLT5vYmplY3QpID09IGF0dHJfbmlkKSB7CisJCQlpZiAoc2tfQVNOMV9UWVBFX251bSAoYXR0cmliLT52YWx1ZS5zZXQpKQorCQkJICAgIHJldHVybiBza19BU04xX1RZUEVfdmFsdWUoYXR0cmliLT52YWx1ZS5zZXQsIDApOworCQkJZWxzZSByZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworY2hhciAqUEtDUzEyX2dldF9mcmllbmRseW5hbWUoUEtDUzEyX1NBRkVCQUcgKmJhZykKK3sKKwlBU04xX1RZUEUgKmF0eXBlOworCWlmICghKGF0eXBlID0gUEtDUzEyX2dldF9hdHRyKGJhZywgTklEX2ZyaWVuZGx5TmFtZSkpKSByZXR1cm4gTlVMTDsKKwlpZiAoYXR5cGUtPnR5cGUgIT0gVl9BU04xX0JNUFNUUklORykgcmV0dXJuIE5VTEw7CisJcmV0dXJuIE9QRU5TU0xfdW5pMmFzYyhhdHlwZS0+dmFsdWUuYm1wc3RyaW5nLT5kYXRhLAorCQkJCSBhdHlwZS0+dmFsdWUuYm1wc3RyaW5nLT5sZW5ndGgpOworfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9jcnB0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9jcnB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxZDA3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2NycHQuYwpAQCAtMCwwICsxLDExMiBAQAorLyogcDEyX2NycHQuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCisvKiBQS0NTIzEyIFBCRSBhbGdvcml0aG1zIG5vdyBpbiBzdGF0aWMgdGFibGUgKi8KKwordm9pZCBQS0NTMTJfUEJFX2FkZCh2b2lkKQoreworfQorCitpbnQgUEtDUzEyX1BCRV9rZXlpdmdlbihFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJQVNOMV9UWVBFICpwYXJhbSwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBFVlBfTUQgKm1kLCBpbnQgZW5fZGUpCit7CisJUEJFUEFSQU0gKnBiZTsKKwlpbnQgc2FsdGxlbiwgaXRlciwgcmV0OworCXVuc2lnbmVkIGNoYXIgKnNhbHQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcGJ1ZjsKKwl1bnNpZ25lZCBjaGFyIGtleVtFVlBfTUFYX0tFWV9MRU5HVEhdLCBpdltFVlBfTUFYX0lWX0xFTkdUSF07CisKKwkvKiBFeHRyYWN0IHVzZWZ1bCBpbmZvIGZyb20gcGFyYW1ldGVyICovCisJaWYgKHBhcmFtID09IE5VTEwgfHwgcGFyYW0tPnR5cGUgIT0gVl9BU04xX1NFUVVFTkNFIHx8CisJICAgIHBhcmFtLT52YWx1ZS5zZXF1ZW5jZSA9PSBOVUxMKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEJFX0tFWUlWR0VOLFBLQ1MxMl9SX0RFQ09ERV9FUlJPUik7CisJCXJldHVybiAwOworCX0KKworCXBidWYgPSBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisJaWYgKCEocGJlID0gZDJpX1BCRVBBUkFNKE5VTEwsICZwYnVmLCBwYXJhbS0+dmFsdWUuc2VxdWVuY2UtPmxlbmd0aCkpKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEJFX0tFWUlWR0VOLFBLQ1MxMl9SX0RFQ09ERV9FUlJPUik7CisJCXJldHVybiAwOworCX0KKworCWlmICghcGJlLT5pdGVyKSBpdGVyID0gMTsKKwllbHNlIGl0ZXIgPSBBU04xX0lOVEVHRVJfZ2V0IChwYmUtPml0ZXIpOworCXNhbHQgPSBwYmUtPnNhbHQtPmRhdGE7CisJc2FsdGxlbiA9IHBiZS0+c2FsdC0+bGVuZ3RoOworCWlmICghUEtDUzEyX2tleV9nZW4gKHBhc3MsIHBhc3NsZW4sIHNhbHQsIHNhbHRsZW4sIFBLQ1MxMl9LRVlfSUQsCisJCQkgICAgIGl0ZXIsIEVWUF9DSVBIRVJfa2V5X2xlbmd0aChjaXBoZXIpLCBrZXksIG1kKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1BCRV9LRVlJVkdFTixQS0NTMTJfUl9LRVlfR0VOX0VSUk9SKTsKKwkJUEJFUEFSQU1fZnJlZShwYmUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFQS0NTMTJfa2V5X2dlbiAocGFzcywgcGFzc2xlbiwgc2FsdCwgc2FsdGxlbiwgUEtDUzEyX0lWX0lELAorCQkJCWl0ZXIsIEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNpcGhlciksIGl2LCBtZCkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9QQkVfS0VZSVZHRU4sUEtDUzEyX1JfSVZfR0VOX0VSUk9SKTsKKwkJUEJFUEFSQU1fZnJlZShwYmUpOworCQlyZXR1cm4gMDsKKwl9CisJUEJFUEFSQU1fZnJlZShwYmUpOworCXJldCA9IEVWUF9DaXBoZXJJbml0X2V4KGN0eCwgY2lwaGVyLCBOVUxMLCBrZXksIGl2LCBlbl9kZSk7CisJT1BFTlNTTF9jbGVhbnNlKGtleSwgRVZQX01BWF9LRVlfTEVOR1RIKTsKKwlPUEVOU1NMX2NsZWFuc2UoaXYsIEVWUF9NQVhfSVZfTEVOR1RIKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfY3J0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9jcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIxMzFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfY3J0LmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qIHAxMl9jcnQuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCisKK3N0YXRpYyBpbnQgcGtjczEyX2FkZF9iYWcoU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICoqcGJhZ3MsIFBLQ1MxMl9TQUZFQkFHICpiYWcpOworCitzdGF0aWMgaW50IGNvcHlfYmFnX2F0dHIoUEtDUzEyX1NBRkVCQUcgKmJhZywgRVZQX1BLRVkgKnBrZXksIGludCBuaWQpCisJeworCWludCBpZHg7CisJWDUwOV9BVFRSSUJVVEUgKmF0dHI7CisJaWR4ID0gRVZQX1BLRVlfZ2V0X2F0dHJfYnlfTklEKHBrZXksIG5pZCwgLTEpOworCWlmIChpZHggPCAwKQorCQlyZXR1cm4gMTsKKwlhdHRyID0gRVZQX1BLRVlfZ2V0X2F0dHIocGtleSwgaWR4KTsKKwlpZiAoIVg1MDlhdF9hZGQxX2F0dHIoJmJhZy0+YXR0cmliLCBhdHRyKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CisJfQorCitQS0NTMTIgKlBLQ1MxMl9jcmVhdGUoY2hhciAqcGFzcywgY2hhciAqbmFtZSwgRVZQX1BLRVkgKnBrZXksIFg1MDkgKmNlcnQsCisJICAgICBTVEFDS19PRihYNTA5KSAqY2EsIGludCBuaWRfa2V5LCBpbnQgbmlkX2NlcnQsIGludCBpdGVyLCBpbnQgbWFjX2l0ZXIsCisJICAgICBpbnQga2V5dHlwZSkKK3sKKwlQS0NTMTIgKnAxMiA9IE5VTEw7CisJU1RBQ0tfT0YoUEtDUzcpICpzYWZlcyA9IE5VTEw7CisJU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzID0gTlVMTDsKKwlQS0NTMTJfU0FGRUJBRyAqYmFnID0gTlVMTDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGtleWlkW0VWUF9NQVhfTURfU0laRV07CisJdW5zaWduZWQgaW50IGtleWlkbGVuID0gMDsKKworCS8qIFNldCBkZWZhdWx0cyAqLworCWlmICghbmlkX2NlcnQpCisJCW5pZF9jZXJ0ID0gTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQzsKKwlpZiAoIW5pZF9rZXkpCisJCW5pZF9rZXkgPSBOSURfcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQzsKKwlpZiAoIWl0ZXIpCisJCWl0ZXIgPSBQS0NTMTJfREVGQVVMVF9JVEVSOworCWlmICghbWFjX2l0ZXIpCisJCW1hY19pdGVyID0gMTsKKworCWlmKCFwa2V5ICYmICFjZXJ0ICYmICFjYSkKKwkJeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX0NSRUFURSxQS0NTMTJfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaWYgKHBrZXkgJiYgY2VydCkKKwkJeworCQlpZighWDUwOV9jaGVja19wcml2YXRlX2tleShjZXJ0LCBwa2V5KSkKKwkJCXJldHVybiBOVUxMOworCQlYNTA5X2RpZ2VzdChjZXJ0LCBFVlBfc2hhMSgpLCBrZXlpZCwgJmtleWlkbGVuKTsKKwkJfQorCisJaWYgKGNlcnQpCisJCXsKKwkJYmFnID0gUEtDUzEyX2FkZF9jZXJ0KCZiYWdzLCBjZXJ0KTsKKwkJaWYobmFtZSAmJiAhUEtDUzEyX2FkZF9mcmllbmRseW5hbWUoYmFnLCBuYW1lLCAtMSkpCisJCQlnb3RvIGVycjsKKwkJaWYoa2V5aWRsZW4gJiYgIVBLQ1MxMl9hZGRfbG9jYWxrZXlpZChiYWcsIGtleWlkLCBrZXlpZGxlbikpCisJCQlnb3RvIGVycjsKKwkJfQorCisJLyogQWRkIGFsbCBvdGhlciBjZXJ0aWZpY2F0ZXMgKi8KKwlmb3IoaSA9IDA7IGkgPCBza19YNTA5X251bShjYSk7IGkrKykKKwkJeworCQlpZiAoIVBLQ1MxMl9hZGRfY2VydCgmYmFncywgc2tfWDUwOV92YWx1ZShjYSwgaSkpKQorCQkJZ290byBlcnI7CisJCX0KKworCWlmIChiYWdzICYmICFQS0NTMTJfYWRkX3NhZmUoJnNhZmVzLCBiYWdzLCBuaWRfY2VydCwgaXRlciwgcGFzcykpCisJCQlnb3RvIGVycjsKKworCXNrX1BLQ1MxMl9TQUZFQkFHX3BvcF9mcmVlKGJhZ3MsIFBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCWJhZ3MgPSBOVUxMOworCisJaWYgKHBrZXkpCisJCXsKKwkJYmFnID0gUEtDUzEyX2FkZF9rZXkoJmJhZ3MsIHBrZXksIGtleXR5cGUsIGl0ZXIsIG5pZF9rZXksIHBhc3MpOworCisJCWlmICghYmFnKQorCQkJZ290byBlcnI7CisKKwkJaWYgKCFjb3B5X2JhZ19hdHRyKGJhZywgcGtleSwgTklEX21zX2NzcF9uYW1lKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoIWNvcHlfYmFnX2F0dHIoYmFnLCBwa2V5LCBOSURfTG9jYWxLZXlTZXQpKQorCQkJZ290byBlcnI7CisKKwkJaWYobmFtZSAmJiAhUEtDUzEyX2FkZF9mcmllbmRseW5hbWUoYmFnLCBuYW1lLCAtMSkpCisJCQlnb3RvIGVycjsKKwkJaWYoa2V5aWRsZW4gJiYgIVBLQ1MxMl9hZGRfbG9jYWxrZXlpZChiYWcsIGtleWlkLCBrZXlpZGxlbikpCisJCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKGJhZ3MgJiYgIVBLQ1MxMl9hZGRfc2FmZSgmc2FmZXMsIGJhZ3MsIC0xLCAwLCBOVUxMKSkKKwkJCWdvdG8gZXJyOworCisJc2tfUEtDUzEyX1NBRkVCQUdfcG9wX2ZyZWUoYmFncywgUEtDUzEyX1NBRkVCQUdfZnJlZSk7CisJYmFncyA9IE5VTEw7CisKKwlwMTIgPSBQS0NTMTJfYWRkX3NhZmVzKHNhZmVzLCAwKTsKKworCWlmICghcDEyKQorCQlnb3RvIGVycjsKKworCXNrX1BLQ1M3X3BvcF9mcmVlKHNhZmVzLCBQS0NTN19mcmVlKTsKKworCXNhZmVzID0gTlVMTDsKKworCWlmICgobWFjX2l0ZXIgIT0gLTEpICYmCisJCSFQS0NTMTJfc2V0X21hYyhwMTIsIHBhc3MsIC0xLCBOVUxMLCAwLCBtYWNfaXRlciwgTlVMTCkpCisJICAgIGdvdG8gZXJyOworCisJcmV0dXJuIHAxMjsKKworCWVycjoKKworCWlmIChwMTIpCisJCVBLQ1MxMl9mcmVlKHAxMik7CisJaWYgKHNhZmVzKQorCQlza19QS0NTN19wb3BfZnJlZShzYWZlcywgUEtDUzdfZnJlZSk7CisJaWYgKGJhZ3MpCisJCXNrX1BLQ1MxMl9TQUZFQkFHX3BvcF9mcmVlKGJhZ3MsIFBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCXJldHVybiBOVUxMOworCit9CisKK1BLQ1MxMl9TQUZFQkFHICpQS0NTMTJfYWRkX2NlcnQoU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICoqcGJhZ3MsIFg1MDkgKmNlcnQpCisJeworCVBLQ1MxMl9TQUZFQkFHICpiYWcgPSBOVUxMOworCWNoYXIgKm5hbWU7CisJaW50IG5hbWVsZW4gPSAtMTsKKwl1bnNpZ25lZCBjaGFyICprZXlpZDsKKwlpbnQga2V5aWRsZW4gPSAtMTsKKworCS8qIEFkZCB1c2VyIGNlcnRpZmljYXRlICovCisJaWYoIShiYWcgPSBQS0NTMTJfeDUwOTJjZXJ0YmFnKGNlcnQpKSkKKwkJZ290byBlcnI7CisKKwkvKiBVc2UgZnJpZW5kbHlOYW1lIGFuZCBsb2NhbEtleUlEIGluIGNlcnRpZmljYXRlLgorCSAqIChpZiBwcmVzZW50KQorCSAqLworCisJbmFtZSA9IChjaGFyICopWDUwOV9hbGlhc19nZXQwKGNlcnQsICZuYW1lbGVuKTsKKworCWlmKG5hbWUgJiYgIVBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lKGJhZywgbmFtZSwgbmFtZWxlbikpCisJCWdvdG8gZXJyOworCisJa2V5aWQgPSBYNTA5X2tleWlkX2dldDAoY2VydCwgJmtleWlkbGVuKTsKKworCWlmKGtleWlkICYmICFQS0NTMTJfYWRkX2xvY2Fsa2V5aWQoYmFnLCBrZXlpZCwga2V5aWRsZW4pKQorCQlnb3RvIGVycjsKKworCWlmICghcGtjczEyX2FkZF9iYWcocGJhZ3MsIGJhZykpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIGJhZzsKKworCWVycjoKKworCWlmIChiYWcpCisJCVBLQ1MxMl9TQUZFQkFHX2ZyZWUoYmFnKTsKKworCXJldHVybiBOVUxMOworCisJfQorCitQS0NTMTJfU0FGRUJBRyAqUEtDUzEyX2FkZF9rZXkoU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICoqcGJhZ3MsIEVWUF9QS0VZICprZXksCisJCQkJCQlpbnQga2V5X3VzYWdlLCBpbnQgaXRlciwKKwkJCQkJCWludCBuaWRfa2V5LCBjaGFyICpwYXNzKQorCXsKKworCVBLQ1MxMl9TQUZFQkFHICpiYWcgPSBOVUxMOworCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4ID0gTlVMTDsKKworCS8qIE1ha2UgYSBQS0NTIzggc3RydWN0dXJlICovCisJaWYoIShwOCA9IEVWUF9QS0VZMlBLQ1M4KGtleSkpKQorCQlnb3RvIGVycjsKKwlpZihrZXlfdXNhZ2UgJiYgIVBLQ1M4X2FkZF9rZXl1c2FnZShwOCwga2V5X3VzYWdlKSkKKwkJZ290byBlcnI7CisJaWYgKG5pZF9rZXkgIT0gLTEpCisJCXsKKwkJYmFnID0gUEtDUzEyX01BS0VfU0hLRVlCQUcobmlkX2tleSwgcGFzcywgLTEsIE5VTEwsIDAsIGl0ZXIsIHA4KTsKKwkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4KTsKKwkJfQorCWVsc2UKKwkJYmFnID0gUEtDUzEyX01BS0VfS0VZQkFHKHA4KTsKKworCWlmKCFiYWcpCisJCWdvdG8gZXJyOworCisJaWYgKCFwa2NzMTJfYWRkX2JhZyhwYmFncywgYmFnKSkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gYmFnOworCisJZXJyOgorCisJaWYgKGJhZykKKwkJUEtDUzEyX1NBRkVCQUdfZnJlZShiYWcpOworCisJcmV0dXJuIE5VTEw7CisKKwl9CisKK2ludCBQS0NTMTJfYWRkX3NhZmUoU1RBQ0tfT0YoUEtDUzcpICoqcHNhZmVzLCBTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKmJhZ3MsCisJCQkJCQlpbnQgbmlkX3NhZmUsIGludCBpdGVyLCBjaGFyICpwYXNzKQorCXsKKwlQS0NTNyAqcDcgPSBOVUxMOworCWludCBmcmVlX3NhZmVzID0gMDsKKworCWlmICghKnBzYWZlcykKKwkJeworCQkqcHNhZmVzID0gc2tfUEtDUzdfbmV3X251bGwoKTsKKwkJaWYgKCEqcHNhZmVzKQorCQkJcmV0dXJuIDA7CisJCWZyZWVfc2FmZXMgPSAxOworCQl9CisJZWxzZQorCQlmcmVlX3NhZmVzID0gMDsKKworCWlmIChuaWRfc2FmZSA9PSAwKQorCQluaWRfc2FmZSA9IE5JRF9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkM7CisKKwlpZiAobmlkX3NhZmUgPT0gLTEpCisJCXA3ID0gUEtDUzEyX3BhY2tfcDdkYXRhKGJhZ3MpOworCWVsc2UKKwkJcDcgPSBQS0NTMTJfcGFja19wN2VuY2RhdGEobmlkX3NhZmUsIHBhc3MsIC0xLCBOVUxMLCAwLAorCQkJCQkgIGl0ZXIsIGJhZ3MpOworCWlmICghcDcpCisJCWdvdG8gZXJyOworCisJaWYgKCFza19QS0NTN19wdXNoKCpwc2FmZXMsIHA3KSkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gMTsKKworCWVycjoKKwlpZiAoZnJlZV9zYWZlcykKKwkJeworCQlza19QS0NTN19mcmVlKCpwc2FmZXMpOworCQkqcHNhZmVzID0gTlVMTDsKKwkJfQorCisJaWYgKHA3KQorCQlQS0NTN19mcmVlKHA3KTsKKworCXJldHVybiAwOworCisJfQorCitzdGF0aWMgaW50IHBrY3MxMl9hZGRfYmFnKFNUQUNLX09GKFBLQ1MxMl9TQUZFQkFHKSAqKnBiYWdzLCBQS0NTMTJfU0FGRUJBRyAqYmFnKQorCXsKKwlpbnQgZnJlZV9iYWdzOworCWlmICghcGJhZ3MpCisJCXJldHVybiAxOworCWlmICghKnBiYWdzKQorCQl7CisJCSpwYmFncyA9IHNrX1BLQ1MxMl9TQUZFQkFHX25ld19udWxsKCk7CisJCWlmICghKnBiYWdzKQorCQkJcmV0dXJuIDA7CisJCWZyZWVfYmFncyA9IDE7CisJCX0KKwllbHNlIAorCQlmcmVlX2JhZ3MgPSAwOworCisJaWYgKCFza19QS0NTMTJfU0FGRUJBR19wdXNoKCpwYmFncywgYmFnKSkKKwkJeworCQlpZiAoZnJlZV9iYWdzKQorCQkJeworCQkJc2tfUEtDUzEyX1NBRkVCQUdfZnJlZSgqcGJhZ3MpOworCQkJKnBiYWdzID0gTlVMTDsKKwkJCX0KKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCisJfQorCQkKKworUEtDUzEyICpQS0NTMTJfYWRkX3NhZmVzKFNUQUNLX09GKFBLQ1M3KSAqc2FmZXMsIGludCBuaWRfcDcpCisJeworCVBLQ1MxMiAqcDEyOworCWlmIChuaWRfcDcgPD0gMCkKKwkJbmlkX3A3ID0gTklEX3BrY3M3X2RhdGE7CisJcDEyID0gUEtDUzEyX2luaXQobmlkX3A3KTsKKworCWlmICghcDEyKQorCQlyZXR1cm4gTlVMTDsKKworCWlmKCFQS0NTMTJfcGFja19hdXRoc2FmZXMocDEyLCBzYWZlcykpCisJCXsKKwkJUEtDUzEyX2ZyZWUocDEyKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldHVybiBwMTI7CisKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9kZWNyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9kZWNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3N2RiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2RlY3IuYwpAQCAtMCwwICsxLDE3NyBAQAorLyogcDEyX2RlY3IuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCisvKiBEZWZpbmUgdGhpcyB0byBkdW1wIGRlY3J5cHRlZCBvdXRwdXQgdG8gZmlsZXMgY2FsbGVkIERFUm5ubiAqLworLyojZGVmaW5lIERFQlVHX0RFQ1JZUFQqLworCisKKy8qIEVuY3J5cHQvRGVjcnlwdCBhIGJ1ZmZlciBiYXNlZCBvbiBwYXNzd29yZCBhbmQgYWxnb3IsIHJlc3VsdCBpbiBhCisgKiBPUEVOU1NMX21hbGxvYydlZCBidWZmZXIKKyAqLworCit1bnNpZ25lZCBjaGFyICogUEtDUzEyX3BiZV9jcnlwdChYNTA5X0FMR09SICphbGdvciwgY29uc3QgY2hhciAqcGFzcywKKwkgICAgIGludCBwYXNzbGVuLCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGlubGVuLCB1bnNpZ25lZCBjaGFyICoqZGF0YSwKKwkgICAgIGludCAqZGF0YWxlbiwgaW50IGVuX2RlKQoreworCXVuc2lnbmVkIGNoYXIgKm91dDsKKwlpbnQgb3V0bGVuLCBpOworCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisJLyogRGVjcnlwdCBkYXRhICovCisgICAgICAgIGlmICghRVZQX1BCRV9DaXBoZXJJbml0KGFsZ29yLT5hbGdvcml0aG0sIHBhc3MsIHBhc3NsZW4sCisJCQkJCSBhbGdvci0+cGFyYW1ldGVyLCAmY3R4LCBlbl9kZSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9QQkVfQ1JZUFQsUEtDUzEyX1JfUEtDUzEyX0FMR09SX0NJUEhFUklOSVRfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZighKG91dCA9IE9QRU5TU0xfbWFsbG9jKGlubGVuICsgRVZQX0NJUEhFUl9DVFhfYmxvY2tfc2l6ZSgmY3R4KSkpKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEJFX0NSWVBULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJfQorCisJRVZQX0NpcGhlclVwZGF0ZSgmY3R4LCBvdXQsICZpLCBpbiwgaW5sZW4pOworCW91dGxlbiA9IGk7CisJaWYoIUVWUF9DaXBoZXJGaW5hbF9leCgmY3R4LCBvdXQgKyBpLCAmaSkpIHsKKwkJT1BFTlNTTF9mcmVlKG91dCk7CisJCW91dCA9IE5VTEw7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEJFX0NSWVBULFBLQ1MxMl9SX1BLQ1MxMl9DSVBIRVJGSU5BTF9FUlJPUik7CisJCWdvdG8gZXJyOworCX0KKwlvdXRsZW4gKz0gaTsKKwlpZiAoZGF0YWxlbikgKmRhdGFsZW4gPSBvdXRsZW47CisJaWYgKGRhdGEpICpkYXRhID0gb3V0OworCWVycjoKKwlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworCXJldHVybiBvdXQ7CisKK30KKworLyogRGVjcnlwdCBhbiBPQ1RFVCBTVFJJTkcgYW5kIGRlY29kZSBBU04xIHN0cnVjdHVyZSAKKyAqIGlmIHpidWYgc2V0IHplcm8gYnVmZmVyIGFmdGVyIHVzZS4KKyAqLworCit2b2lkICogUEtDUzEyX2l0ZW1fZGVjcnlwdF9kMmkoWDUwOV9BTEdPUiAqYWxnb3IsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJICAgICBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwgQVNOMV9PQ1RFVF9TVFJJTkcgKm9jdCwgaW50IHpidWYpCit7CisJdW5zaWduZWQgY2hhciAqb3V0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJdm9pZCAqcmV0OworCWludCBvdXRsZW47CisKKwlpZiAoIVBLQ1MxMl9wYmVfY3J5cHQoYWxnb3IsIHBhc3MsIHBhc3NsZW4sIG9jdC0+ZGF0YSwgb2N0LT5sZW5ndGgsCisJCQkgICAgICAgJm91dCwgJm91dGxlbiwgMCkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9JVEVNX0RFQ1JZUFRfRDJJLFBLQ1MxMl9SX1BLQ1MxMl9QQkVfQ1JZUFRfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcCA9IG91dDsKKyNpZmRlZiBERUJVR19ERUNSWVBUCisJeworCQlGSUxFICpvcDsKKworCQljaGFyIGZuYW1lWzMwXTsKKwkJc3RhdGljIGludCBmbm0gPSAxOworCQlzcHJpbnRmKGZuYW1lLCAiREVSJWQiLCBmbm0rKyk7CisJCW9wID0gZm9wZW4oZm5hbWUsICJ3YiIpOworCQlmd3JpdGUgKHAsIDEsIG91dGxlbiwgb3ApOworCQlmY2xvc2Uob3ApOworCX0KKyNlbmRpZgorCXJldCA9IEFTTjFfaXRlbV9kMmkoTlVMTCwgJnAsIG91dGxlbiwgaXQpOworCWlmICh6YnVmKSBPUEVOU1NMX2NsZWFuc2Uob3V0LCBvdXRsZW4pOworCWlmKCFyZXQpIFBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfSVRFTV9ERUNSWVBUX0QySSxQS0NTMTJfUl9ERUNPREVfRVJST1IpOworCU9QRU5TU0xfZnJlZShvdXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIEVuY29kZSBBU04xIHN0cnVjdHVyZSBhbmQgZW5jcnlwdCwgcmV0dXJuIE9DVEVUIFNUUklORyAKKyAqIGlmIHpidWYgc2V0IHplcm8gZW5jb2RpbmcuCisgKi8KKworQVNOMV9PQ1RFVF9TVFJJTkcgKlBLQ1MxMl9pdGVtX2kyZF9lbmNyeXB0KFg1MDlfQUxHT1IgKmFsZ29yLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCSAgICAgICBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCQkgICAgICAgdm9pZCAqb2JqLCBpbnQgemJ1ZikKK3sKKwlBU04xX09DVEVUX1NUUklORyAqb2N0OworCXVuc2lnbmVkIGNoYXIgKmluID0gTlVMTDsKKwlpbnQgaW5sZW47CisJaWYgKCEob2N0ID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcgKCkpKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfSVRFTV9JMkRfRU5DUllQVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpbmxlbiA9IEFTTjFfaXRlbV9pMmQob2JqLCAmaW4sIGl0KTsKKwlpZiAoIWluKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfSVRFTV9JMkRfRU5DUllQVCxQS0NTMTJfUl9FTkNPREVfRVJST1IpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFQS0NTMTJfcGJlX2NyeXB0KGFsZ29yLCBwYXNzLCBwYXNzbGVuLCBpbiwgaW5sZW4sICZvY3QtPmRhdGEsCisJCQkJICZvY3QtPmxlbmd0aCwgMSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9JVEVNX0kyRF9FTkNSWVBULFBLQ1MxMl9SX0VOQ1JZUFRfRVJST1IpOworCQlPUEVOU1NMX2ZyZWUoaW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHpidWYpIE9QRU5TU0xfY2xlYW5zZShpbiwgaW5sZW4pOworCU9QRU5TU0xfZnJlZShpbik7CisJcmV0dXJuIG9jdDsKK30KKworSU1QTEVNRU5UX1BLQ1MxMl9TVEFDS19PRihQS0NTNykKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2luaXQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQ4NGIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfaW5pdC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qIHAxMl9pbml0LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KKworLyogSW5pdGlhbGlzZSBhIFBLQ1MxMiBzdHJ1Y3R1cmUgdG8gdGFrZSBkYXRhICovCisKK1BLQ1MxMiAqUEtDUzEyX2luaXQoaW50IG1vZGUpCit7CisJUEtDUzEyICpwa2NzMTI7CisJaWYgKCEocGtjczEyID0gUEtDUzEyX25ldygpKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX0lOSVQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJQVNOMV9JTlRFR0VSX3NldChwa2NzMTItPnZlcnNpb24sIDMpOworCXBrY3MxMi0+YXV0aHNhZmVzLT50eXBlID0gT0JKX25pZDJvYmoobW9kZSk7CisJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgTklEX3BrY3M3X2RhdGE6CisJCQlpZiAoIShwa2NzMTItPmF1dGhzYWZlcy0+ZC5kYXRhID0KKwkJCQkgTV9BU04xX09DVEVUX1NUUklOR19uZXcoKSkpIHsKKwkJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfSU5JVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfSU5JVCwKKwkJCQlQS0NTMTJfUl9VTlNVUFBPUlRFRF9QS0NTMTJfTU9ERSk7CisJCQlnb3RvIGVycjsKKwl9CisJCQorCXJldHVybiBwa2NzMTI7CitlcnI6CisJaWYgKHBrY3MxMiAhPSBOVUxMKSBQS0NTMTJfZnJlZShwa2NzMTIpOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfa2V5LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9rZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk3OTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfa2V5LmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qIHAxMl9rZXkuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworLyogVW5jb21tZW50IG91dCB0aGlzIGxpbmUgdG8gZ2V0IGRlYnVnZ2luZyBpbmZvIGFib3V0IGtleSBnZW5lcmF0aW9uICovCisvKiNkZWZpbmUgREVCVUdfS0VZR0VOKi8KKyNpZmRlZiBERUJVR19LRVlHRU4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorZXh0ZXJuIEJJTyAqYmlvX2VycjsKK3ZvaWQgaF9fZHVtcCAodW5zaWduZWQgY2hhciAqcCwgaW50IGxlbik7CisjZW5kaWYKKworLyogUEtDUzEyIGNvbXBhdGlibGUga2V5L0lWIGdlbmVyYXRpb24gKi8KKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKworaW50IFBLQ1MxMl9rZXlfZ2VuX2FzYyhjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwgdW5zaWduZWQgY2hhciAqc2FsdCwKKwkgICAgIGludCBzYWx0bGVuLCBpbnQgaWQsIGludCBpdGVyLCBpbnQgbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCSAgICAgY29uc3QgRVZQX01EICptZF90eXBlKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciAqdW5pcGFzczsKKwlpbnQgdW5pcGxlbjsKKworCWlmKCFwYXNzKSB7CisJCXVuaXBhc3MgPSBOVUxMOworCQl1bmlwbGVuID0gMDsKKwl9IGVsc2UgaWYgKCFPUEVOU1NMX2FzYzJ1bmkocGFzcywgcGFzc2xlbiwgJnVuaXBhc3MsICZ1bmlwbGVuKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX0tFWV9HRU5fQVNDLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldCA9IFBLQ1MxMl9rZXlfZ2VuX3VuaSh1bmlwYXNzLCB1bmlwbGVuLCBzYWx0LCBzYWx0bGVuLAorCQkJCQkJIGlkLCBpdGVyLCBuLCBvdXQsIG1kX3R5cGUpOworCWlmIChyZXQgPD0gMCkKKwkgICAgcmV0dXJuIDA7CisJaWYodW5pcGFzcykgeworCQlPUEVOU1NMX2NsZWFuc2UodW5pcGFzcywgdW5pcGxlbik7CS8qIENsZWFyIHBhc3N3b3JkIGZyb20gbWVtb3J5ICovCisJCU9QRU5TU0xfZnJlZSh1bmlwYXNzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IFBLQ1MxMl9rZXlfZ2VuX3VuaSh1bnNpZ25lZCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwgdW5zaWduZWQgY2hhciAqc2FsdCwKKwkgICAgIGludCBzYWx0bGVuLCBpbnQgaWQsIGludCBpdGVyLCBpbnQgbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCSAgICAgY29uc3QgRVZQX01EICptZF90eXBlKQoreworCXVuc2lnbmVkIGNoYXIgKkIsICpELCAqSSwgKnAsICpBaTsKKwlpbnQgU2xlbiwgUGxlbiwgSWxlbiwgSWpsZW47CisJaW50IGksIGosIHUsIHY7CisJQklHTlVNICpJaiwgKkJwbDE7CS8qIFRoZXNlIGhvbGQgSWogYW5kIEIgKyAxICovCisJRVZQX01EX0NUWCBjdHg7CisjaWZkZWYgIERFQlVHX0tFWUdFTgorCXVuc2lnbmVkIGNoYXIgKnRtcG91dCA9IG91dDsKKwlpbnQgdG1wbiA9IG47CisjZW5kaWYKKworI2lmIDAKKwlpZiAoIXBhc3MpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9LRVlfR0VOX1VOSSxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKyNpZmRlZiAgREVCVUdfS0VZR0VOCisJZnByaW50ZihzdGRlcnIsICJLRVlHRU4gREVCVUdcbiIpOworCWZwcmludGYoc3RkZXJyLCAiSUQgJWQsIElURVIgJWRcbiIsIGlkLCBpdGVyKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlBhc3N3b3JkIChsZW5ndGggJWQpOlxuIiwgcGFzc2xlbik7CisJaF9fZHVtcChwYXNzLCBwYXNzbGVuKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlNhbHQgKGxlbmd0aCAlZCk6XG4iLCBzYWx0bGVuKTsKKwloX19kdW1wKHNhbHQsIHNhbHRsZW4pOworI2VuZGlmCisJdiA9IEVWUF9NRF9ibG9ja19zaXplIChtZF90eXBlKTsKKwl1ID0gRVZQX01EX3NpemUgKG1kX3R5cGUpOworCWlmICh1IDwgMCkKKwkgICAgcmV0dXJuIDA7CisJRCA9IE9QRU5TU0xfbWFsbG9jICh2KTsKKwlBaSA9IE9QRU5TU0xfbWFsbG9jICh1KTsKKwlCID0gT1BFTlNTTF9tYWxsb2MgKHYgKyAxKTsKKwlTbGVuID0gdiAqICgoc2FsdGxlbit2LTEpL3YpOworCWlmKHBhc3NsZW4pIFBsZW4gPSB2ICogKChwYXNzbGVuK3YtMSkvdik7CisJZWxzZSBQbGVuID0gMDsKKwlJbGVuID0gU2xlbiArIFBsZW47CisJSSA9IE9QRU5TU0xfbWFsbG9jIChJbGVuKTsKKwlJaiA9IEJOX25ldygpOworCUJwbDEgPSBCTl9uZXcoKTsKKwlpZiAoIUQgfHwgIUFpIHx8ICFCIHx8ICFJIHx8ICFJaiB8fCAhQnBsMSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX0tFWV9HRU5fVU5JLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCB2OyBpKyspIERbaV0gPSBpZDsKKwlwID0gSTsKKwlmb3IgKGkgPSAwOyBpIDwgU2xlbjsgaSsrKSAqcCsrID0gc2FsdFtpICUgc2FsdGxlbl07CisJZm9yIChpID0gMDsgaSA8IFBsZW47IGkrKykgKnArKyA9IHBhc3NbaSAlIHBhc3NsZW5dOworCWZvciAoOzspIHsKKwkJRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgbWRfdHlwZSwgTlVMTCk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgRCwgdik7CisJCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgSSwgSWxlbik7CisJCUVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LCBBaSwgTlVMTCk7CisJCWZvciAoaiA9IDE7IGogPCBpdGVyOyBqKyspIHsKKwkJCUVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIG1kX3R5cGUsIE5VTEwpOworCQkJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBBaSwgdSk7CisJCQlFVlBfRGlnZXN0RmluYWxfZXgoJmN0eCwgQWksIE5VTEwpOworCQl9CisJCW1lbWNweSAob3V0LCBBaSwgbWluIChuLCB1KSk7CisJCWlmICh1ID49IG4pIHsKKwkJCU9QRU5TU0xfZnJlZSAoQWkpOworCQkJT1BFTlNTTF9mcmVlIChCKTsKKwkJCU9QRU5TU0xfZnJlZSAoRCk7CisJCQlPUEVOU1NMX2ZyZWUgKEkpOworCQkJQk5fZnJlZSAoSWopOworCQkJQk5fZnJlZSAoQnBsMSk7CisJCQlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisjaWZkZWYgREVCVUdfS0VZR0VOCisJCQlmcHJpbnRmKHN0ZGVyciwgIk91dHB1dCBLRVkgKGxlbmd0aCAlZClcbiIsIHRtcG4pOworCQkJaF9fZHVtcCh0bXBvdXQsIHRtcG4pOworI2VuZGlmCisJCQlyZXR1cm4gMTsJCisJCX0KKwkJbiAtPSB1OworCQlvdXQgKz0gdTsKKwkJZm9yIChqID0gMDsgaiA8IHY7IGorKykgQltqXSA9IEFpW2ogJSB1XTsKKwkJLyogV29yayBvdXQgQiArIDEgZmlyc3QgdGhlbiBjYW4gdXNlIEIgYXMgdG1wIHNwYWNlICovCisJCUJOX2JpbjJibiAoQiwgdiwgQnBsMSk7CisJCUJOX2FkZF93b3JkIChCcGwxLCAxKTsKKwkJZm9yIChqID0gMDsgaiA8IElsZW4gOyBqKz12KSB7CisJCQlCTl9iaW4yYm4gKEkgKyBqLCB2LCBJaik7CisJCQlCTl9hZGQgKElqLCBJaiwgQnBsMSk7CisJCQlCTl9ibjJiaW4gKElqLCBCKTsKKwkJCUlqbGVuID0gQk5fbnVtX2J5dGVzIChJaik7CisJCQkvKiBJZiBtb3JlIHRoYW4gMl4odio4KSAtIDEgY3V0IG9mZiBNU0IgKi8KKwkJCWlmIChJamxlbiA+IHYpIHsKKwkJCQlCTl9ibjJiaW4gKElqLCBCKTsKKwkJCQltZW1jcHkgKEkgKyBqLCBCICsgMSwgdik7CisjaWZuZGVmIFBLQ1MxMl9CUk9LRU5fS0VZR0VOCisJCQkvKiBJZiBsZXNzIHRoYW4gdiBieXRlcyBwYWQgd2l0aCB6ZXJvZXMgKi8KKwkJCX0gZWxzZSBpZiAoSWpsZW4gPCB2KSB7CisJCQkJbWVtc2V0KEkgKyBqLCAwLCB2IC0gSWpsZW4pOworCQkJCUJOX2JuMmJpbihJaiwgSSArIGogKyB2IC0gSWpsZW4pOyAKKyNlbmRpZgorCQkJfSBlbHNlIEJOX2JuMmJpbiAoSWosIEkgKyBqKTsKKwkJfQorCX0KK30KKyNpZmRlZiBERUJVR19LRVlHRU4KK3ZvaWQgaF9fZHVtcCAodW5zaWduZWQgY2hhciAqcCwgaW50IGxlbikKK3sKKwlmb3IgKDsgbGVuIC0tOyBwKyspIGZwcmludGYoc3RkZXJyLCAiJTAyWCIsICpwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9raXNzLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9raXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyY2MzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX2tpc3MuYwpAQCAtMCwwICsxLDMwMiBAQAorLyogcDEyX2tpc3MuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCisvKiBTaW1wbGlmaWVkIFBLQ1MjMTIgcm91dGluZXMgKi8KKworc3RhdGljIGludCBwYXJzZV9wazEyKCBQS0NTMTIgKnAxMiwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCUVWUF9QS0VZICoqcGtleSwgU1RBQ0tfT0YoWDUwOSkgKm9jZXJ0cyk7CisKK3N0YXRpYyBpbnQgcGFyc2VfYmFncyggU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzLCBjb25zdCBjaGFyICpwYXNzLAorCQkgICAgICAgaW50IHBhc3NsZW4sIEVWUF9QS0VZICoqcGtleSwgU1RBQ0tfT0YoWDUwOSkgKm9jZXJ0cyk7CisKK3N0YXRpYyBpbnQgcGFyc2VfYmFnKCBQS0NTMTJfU0FGRUJBRyAqYmFnLCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCUVWUF9QS0VZICoqcGtleSwgU1RBQ0tfT0YoWDUwOSkgKm9jZXJ0cyk7CisKKy8qIFBhcnNlIGFuZCBkZWNyeXB0IGEgUEtDUyMxMiBzdHJ1Y3R1cmUgcmV0dXJuaW5nIHVzZXIga2V5LCB1c2VyIGNlcnQKKyAqIGFuZCBvdGhlciAoQ0EpIGNlcnRzLiBOb3RlIGVpdGhlciBjYSBzaG91bGQgYmUgTlVMTCwgKmNhIHNob3VsZCBiZSBOVUxMLAorICogb3IgaXQgc2hvdWxkIHBvaW50IHRvIGEgdmFsaWQgU1RBQ0sgc3RydWN0dXJlLiBwa2V5IGFuZCBjZXJ0IGNhbiBiZQorICogcGFzc2VkIHVuaXRpYWxpc2VkLgorICovCisKK2ludCBQS0NTMTJfcGFyc2UoUEtDUzEyICpwMTIsIGNvbnN0IGNoYXIgKnBhc3MsIEVWUF9QS0VZICoqcGtleSwgWDUwOSAqKmNlcnQsCisJICAgICBTVEFDS19PRihYNTA5KSAqKmNhKQoreworCVNUQUNLX09GKFg1MDkpICpvY2VydHMgPSBOVUxMOworCVg1MDkgKnggPSBOVUxMOworCS8qIENoZWNrIGZvciBOVUxMIFBLQ1MxMiBzdHJ1Y3R1cmUgKi8KKworCWlmKCFwMTIpCisJCXsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9QQVJTRSxQS0NTMTJfUl9JTlZBTElEX05VTExfUEtDUzEyX1BPSU5URVIpOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYocGtleSkKKwkJKnBrZXkgPSBOVUxMOworCWlmKGNlcnQpCisJCSpjZXJ0ID0gTlVMTDsKKworCS8qIENoZWNrIHRoZSBtYWMgKi8KKworCS8qIElmIHBhc3N3b3JkIGlzIHplcm8gbGVuZ3RoIG9yIE5VTEwgdGhlbiB0cnkgdmVyaWZ5aW5nIGJvdGggY2FzZXMKKwkgKiB0byBkZXRlcm1pbmUgd2hpY2ggcGFzc3dvcmQgaXMgY29ycmVjdC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0CisJICogdW5kZXIgUEtDUyMxMiBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIG5vIHBhc3N3b3JkIGFuZCBhIHplcm8gbGVuZ3RoCisJICogcGFzc3dvcmQgYXJlIHR3byBkaWZmZXJlbnQgdGhpbmdzLi4uCisJICovCisKKwlpZighcGFzcyB8fCAhKnBhc3MpIHsKKwkJaWYoUEtDUzEyX3ZlcmlmeV9tYWMocDEyLCBOVUxMLCAwKSkgcGFzcyA9IE5VTEw7CisJCWVsc2UgaWYoUEtDUzEyX3ZlcmlmeV9tYWMocDEyLCAiIiwgMCkpIHBhc3MgPSAiIjsKKwkJZWxzZSB7CisJCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1BBUlNFLFBLQ1MxMl9SX01BQ19WRVJJRllfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSBpZiAoIVBLQ1MxMl92ZXJpZnlfbWFjKHAxMiwgcGFzcywgLTEpKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEFSU0UsUEtDUzEyX1JfTUFDX1ZFUklGWV9GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogQWxsb2NhdGUgc3RhY2sgZm9yIG90aGVyIGNlcnRpZmljYXRlcyAqLworCW9jZXJ0cyA9IHNrX1g1MDlfbmV3X251bGwoKTsKKworCWlmICghb2NlcnRzKQorCQl7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEFSU0UsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKCFwYXJzZV9wazEyIChwMTIsIHBhc3MsIC0xLCBwa2V5LCBvY2VydHMpKQorCQl7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfUEFSU0UsUEtDUzEyX1JfUEFSU0VfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJd2hpbGUgKCh4ID0gc2tfWDUwOV9wb3Aob2NlcnRzKSkpCisJCXsKKwkJaWYgKHBrZXkgJiYgKnBrZXkgJiYgY2VydCAmJiAhKmNlcnQpCisJCQl7CisJCQlpZiAoWDUwOV9jaGVja19wcml2YXRlX2tleSh4LCAqcGtleSkpCisJCQkJeworCQkJCSpjZXJ0ID0geDsKKwkJCQl4ID0gTlVMTDsKKwkJCQl9CisJCQl9CisKKwkJaWYgKGNhICYmIHgpCisJCQl7CisJCQlpZiAoISpjYSkKKwkJCQkqY2EgPSBza19YNTA5X25ld19udWxsKCk7CisJCQlpZiAoISpjYSkKKwkJCQlnb3RvIGVycjsKKwkJCWlmICghc2tfWDUwOV9wdXNoKCpjYSwgeCkpCisJCQkJZ290byBlcnI7CisJCQl4ID0gTlVMTDsKKwkJCX0KKwkJaWYgKHgpCisJCQlYNTA5X2ZyZWUoeCk7CisJCX0KKworCWlmIChvY2VydHMpCisJCXNrX1g1MDlfcG9wX2ZyZWUob2NlcnRzLCBYNTA5X2ZyZWUpOworCisJcmV0dXJuIDE7CisKKyBlcnI6CisKKwlpZiAocGtleSAmJiAqcGtleSkKKwkJRVZQX1BLRVlfZnJlZSgqcGtleSk7CisJaWYgKGNlcnQgJiYgKmNlcnQpCisJCVg1MDlfZnJlZSgqY2VydCk7CisJaWYgKHgpCisJCVg1MDlfZnJlZSgqY2VydCk7CisJaWYgKG9jZXJ0cykKKwkJc2tfWDUwOV9wb3BfZnJlZShvY2VydHMsIFg1MDlfZnJlZSk7CisJcmV0dXJuIDA7CisKK30KKworLyogUGFyc2UgdGhlIG91dGVyIFBLQ1MjMTIgc3RydWN0dXJlICovCisKK3N0YXRpYyBpbnQgcGFyc2VfcGsxMihQS0NTMTIgKnAxMiwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJICAgICBFVlBfUEtFWSAqKnBrZXksIFNUQUNLX09GKFg1MDkpICpvY2VydHMpCit7CisJU1RBQ0tfT0YoUEtDUzcpICphc2FmZXM7CisJU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzOworCWludCBpLCBiYWduaWQ7CisJUEtDUzcgKnA3OworCisJaWYgKCEoYXNhZmVzID0gUEtDUzEyX3VucGFja19hdXRoc2FmZXMgKHAxMikpKSByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfUEtDUzdfbnVtIChhc2FmZXMpOyBpKyspIHsKKwkJcDcgPSBza19QS0NTN192YWx1ZSAoYXNhZmVzLCBpKTsKKwkJYmFnbmlkID0gT0JKX29iajJuaWQgKHA3LT50eXBlKTsKKwkJaWYgKGJhZ25pZCA9PSBOSURfcGtjczdfZGF0YSkgeworCQkJYmFncyA9IFBLQ1MxMl91bnBhY2tfcDdkYXRhKHA3KTsKKwkJfSBlbHNlIGlmIChiYWduaWQgPT0gTklEX3BrY3M3X2VuY3J5cHRlZCkgeworCQkJYmFncyA9IFBLQ1MxMl91bnBhY2tfcDdlbmNkYXRhKHA3LCBwYXNzLCBwYXNzbGVuKTsKKwkJfSBlbHNlIGNvbnRpbnVlOworCQlpZiAoIWJhZ3MpIHsKKwkJCXNrX1BLQ1M3X3BvcF9mcmVlKGFzYWZlcywgUEtDUzdfZnJlZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCSAgICAJaWYgKCFwYXJzZV9iYWdzKGJhZ3MsIHBhc3MsIHBhc3NsZW4sIHBrZXksIG9jZXJ0cykpIHsKKwkJCXNrX1BLQ1MxMl9TQUZFQkFHX3BvcF9mcmVlKGJhZ3MsIFBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCQkJc2tfUEtDUzdfcG9wX2ZyZWUoYXNhZmVzLCBQS0NTN19mcmVlKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNrX1BLQ1MxMl9TQUZFQkFHX3BvcF9mcmVlKGJhZ3MsIFBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCX0KKwlza19QS0NTN19wb3BfZnJlZShhc2FmZXMsIFBLQ1M3X2ZyZWUpOworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgcGFyc2VfYmFncyhTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKmJhZ3MsIGNvbnN0IGNoYXIgKnBhc3MsCisJCSAgICAgIGludCBwYXNzbGVuLCBFVlBfUEtFWSAqKnBrZXksIFNUQUNLX09GKFg1MDkpICpvY2VydHMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNrX1BLQ1MxMl9TQUZFQkFHX251bShiYWdzKTsgaSsrKSB7CisJCWlmICghcGFyc2VfYmFnKHNrX1BLQ1MxMl9TQUZFQkFHX3ZhbHVlIChiYWdzLCBpKSwKKwkJCQkgcGFzcywgcGFzc2xlbiwgcGtleSwgb2NlcnRzKSkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9iYWcoUEtDUzEyX1NBRkVCQUcgKmJhZywgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCSAgICAgRVZQX1BLRVkgKipwa2V5LCBTVEFDS19PRihYNTA5KSAqb2NlcnRzKQoreworCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4OworCVg1MDkgKng1MDk7CisJQVNOMV9UWVBFICphdHRyaWI7CisJQVNOMV9CTVBTVFJJTkcgKmZuYW1lID0gTlVMTDsKKwlBU04xX09DVEVUX1NUUklORyAqbGtpZCA9IE5VTEw7CisKKwlpZiAoKGF0dHJpYiA9IFBLQ1MxMl9nZXRfYXR0ciAoYmFnLCBOSURfZnJpZW5kbHlOYW1lKSkpCisJCWZuYW1lID0gYXR0cmliLT52YWx1ZS5ibXBzdHJpbmc7CisKKwlpZiAoKGF0dHJpYiA9IFBLQ1MxMl9nZXRfYXR0ciAoYmFnLCBOSURfbG9jYWxLZXlJRCkpKQorCQlsa2lkID0gYXR0cmliLT52YWx1ZS5vY3RldF9zdHJpbmc7CisKKwlzd2l0Y2ggKE1fUEtDUzEyX2JhZ190eXBlKGJhZykpCisJeworCWNhc2UgTklEX2tleUJhZzoKKwkJaWYgKCFwa2V5IHx8ICpwa2V5KQorCQkJcmV0dXJuIDE7CQorCQlpZiAoISgqcGtleSA9IEVWUF9QS0NTODJQS0VZKGJhZy0+dmFsdWUua2V5YmFnKSkpCisJCQlyZXR1cm4gMDsKKwlicmVhazsKKworCWNhc2UgTklEX3BrY3M4U2hyb3VkZWRLZXlCYWc6CisJCWlmICghcGtleSB8fCAqcGtleSkKKwkJCXJldHVybiAxOwkKKwkJaWYgKCEocDggPSBQS0NTMTJfZGVjcnlwdF9za2V5KGJhZywgcGFzcywgcGFzc2xlbikpKQorCQkJCXJldHVybiAwOworCQkqcGtleSA9IEVWUF9QS0NTODJQS0VZKHA4KTsKKwkJUEtDUzhfUFJJVl9LRVlfSU5GT19mcmVlKHA4KTsKKwkJaWYgKCEoKnBrZXkpKSByZXR1cm4gMDsKKwlicmVhazsKKworCWNhc2UgTklEX2NlcnRCYWc6CisJCWlmIChNX1BLQ1MxMl9jZXJ0X2JhZ190eXBlKGJhZykgIT0gTklEX3g1MDlDZXJ0aWZpY2F0ZSApCisJCQlyZXR1cm4gMTsKKwkJaWYgKCEoeDUwOSA9IFBLQ1MxMl9jZXJ0YmFnMng1MDkoYmFnKSkpCisJCQlyZXR1cm4gMDsKKwkJaWYobGtpZCAmJiAhWDUwOV9rZXlpZF9zZXQxKHg1MDksIGxraWQtPmRhdGEsIGxraWQtPmxlbmd0aCkpCisJCQl7CisJCQlYNTA5X2ZyZWUoeDUwOSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJaWYoZm5hbWUpIHsKKwkJCWludCBsZW4sIHI7CisJCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQkJbGVuID0gQVNOMV9TVFJJTkdfdG9fVVRGOCgmZGF0YSwgZm5hbWUpOworCQkJaWYobGVuID4gMCkgeworCQkJCXIgPSBYNTA5X2FsaWFzX3NldDEoeDUwOSwgZGF0YSwgbGVuKTsKKwkJCQlPUEVOU1NMX2ZyZWUoZGF0YSk7CisJCQkJaWYgKCFyKQorCQkJCQl7CisJCQkJCVg1MDlfZnJlZSh4NTA5KTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmKCFza19YNTA5X3B1c2gob2NlcnRzLCB4NTA5KSkKKwkJCXsKKwkJCVg1MDlfZnJlZSh4NTA5KTsKKwkJCXJldHVybiAwOworCQkJfQorCisJYnJlYWs7CisKKwljYXNlIE5JRF9zYWZlQ29udGVudHNCYWc6CisJCXJldHVybiBwYXJzZV9iYWdzKGJhZy0+dmFsdWUuc2FmZXMsIHBhc3MsIHBhc3NsZW4sCisJCQkgCQlwa2V5LCBvY2VydHMpOworCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9tdXRsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9tdXRsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiNzQwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX211dGwuYwpAQCAtMCwwICsxLDE4NiBAQAorLyogcDEyX211dGwuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX0hNQUMKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzMTIuaD4KKworLyogR2VuZXJhdGUgYSBNQUMgKi8KK2ludCBQS0NTMTJfZ2VuX21hYyhQS0NTMTIgKnAxMiwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCSAgIHVuc2lnbmVkIGNoYXIgKm1hYywgdW5zaWduZWQgaW50ICptYWNsZW4pCit7CisJY29uc3QgRVZQX01EICptZF90eXBlOworCUhNQUNfQ1RYIGhtYWM7CisJdW5zaWduZWQgY2hhciBrZXlbRVZQX01BWF9NRF9TSVpFXSwgKnNhbHQ7CisJaW50IHNhbHRsZW4sIGl0ZXI7CisJaW50IG1kX3NpemU7CisKKwlpZiAoIVBLQ1M3X3R5cGVfaXNfZGF0YShwMTItPmF1dGhzYWZlcykpCisJCXsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9HRU5fTUFDLFBLQ1MxMl9SX0NPTlRFTlRfVFlQRV9OT1RfREFUQSk7CisJCXJldHVybiAwOworCQl9CisKKwlzYWx0ID0gcDEyLT5tYWMtPnNhbHQtPmRhdGE7CisJc2FsdGxlbiA9IHAxMi0+bWFjLT5zYWx0LT5sZW5ndGg7CisJaWYgKCFwMTItPm1hYy0+aXRlcikgaXRlciA9IDE7CisJZWxzZSBpdGVyID0gQVNOMV9JTlRFR0VSX2dldCAocDEyLT5tYWMtPml0ZXIpOworICAgIAlpZighKG1kX3R5cGUgPQorCQkgRVZQX2dldF9kaWdlc3RieW9iaiAocDEyLT5tYWMtPmRpbmZvLT5hbGdvci0+YWxnb3JpdGhtKSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9HRU5fTUFDLFBLQ1MxMl9SX1VOS05PV05fRElHRVNUX0FMR09SSVRITSk7CisJCXJldHVybiAwOworCX0KKwltZF9zaXplID0gRVZQX01EX3NpemUobWRfdHlwZSk7CisJaWYgKG1kX3NpemUgPCAwKQorCSAgICByZXR1cm4gMDsKKwlpZighUEtDUzEyX2tleV9nZW4gKHBhc3MsIHBhc3NsZW4sIHNhbHQsIHNhbHRsZW4sIFBLQ1MxMl9NQUNfSUQsIGl0ZXIsCisJCQkJIG1kX3NpemUsIGtleSwgbWRfdHlwZSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9HRU5fTUFDLFBLQ1MxMl9SX0tFWV9HRU5fRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisJSE1BQ19DVFhfaW5pdCgmaG1hYyk7CisJSE1BQ19Jbml0X2V4KCZobWFjLCBrZXksIG1kX3NpemUsIG1kX3R5cGUsIE5VTEwpOworICAgIAlITUFDX1VwZGF0ZSgmaG1hYywgcDEyLT5hdXRoc2FmZXMtPmQuZGF0YS0+ZGF0YSwKKwkJCQkJIHAxMi0+YXV0aHNhZmVzLT5kLmRhdGEtPmxlbmd0aCk7CisgICAgCUhNQUNfRmluYWwoJmhtYWMsIG1hYywgbWFjbGVuKTsKKyAgICAJSE1BQ19DVFhfY2xlYW51cCgmaG1hYyk7CisJcmV0dXJuIDE7Cit9CisKKy8qIFZlcmlmeSB0aGUgbWFjICovCitpbnQgUEtDUzEyX3ZlcmlmeV9tYWMoUEtDUzEyICpwMTIsIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuKQoreworCXVuc2lnbmVkIGNoYXIgbWFjW0VWUF9NQVhfTURfU0laRV07CisJdW5zaWduZWQgaW50IG1hY2xlbjsKKwlpZihwMTItPm1hYyA9PSBOVUxMKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfVkVSSUZZX01BQyxQS0NTMTJfUl9NQUNfQUJTRU5UKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghUEtDUzEyX2dlbl9tYWMgKHAxMiwgcGFzcywgcGFzc2xlbiwgbWFjLCAmbWFjbGVuKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1ZFUklGWV9NQUMsUEtDUzEyX1JfTUFDX0dFTkVSQVRJT05fRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKChtYWNsZW4gIT0gKHVuc2lnbmVkIGludClwMTItPm1hYy0+ZGluZm8tPmRpZ2VzdC0+bGVuZ3RoKQorCXx8IG1lbWNtcCAobWFjLCBwMTItPm1hYy0+ZGluZm8tPmRpZ2VzdC0+ZGF0YSwgbWFjbGVuKSkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIFNldCBhIG1hYyAqLworCitpbnQgUEtDUzEyX3NldF9tYWMoUEtDUzEyICpwMTIsIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCSAgICAgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpdGVyLCBjb25zdCBFVlBfTUQgKm1kX3R5cGUpCit7CisJdW5zaWduZWQgY2hhciBtYWNbRVZQX01BWF9NRF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgbWFjbGVuOworCisJaWYgKCFtZF90eXBlKSBtZF90eXBlID0gRVZQX3NoYTEoKTsKKwlpZiAoUEtDUzEyX3NldHVwX21hYyAocDEyLCBpdGVyLCBzYWx0LCBzYWx0bGVuLCBtZF90eXBlKSA9PQorCQkJCSAJUEtDUzEyX0VSUk9SKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfU0VUX01BQyxQS0NTMTJfUl9NQUNfU0VUVVBfRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFQS0NTMTJfZ2VuX21hYyAocDEyLCBwYXNzLCBwYXNzbGVuLCBtYWMsICZtYWNsZW4pKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfU0VUX01BQyxQS0NTMTJfUl9NQUNfR0VORVJBVElPTl9FUlJPUik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIShNX0FTTjFfT0NURVRfU1RSSU5HX3NldCAocDEyLT5tYWMtPmRpbmZvLT5kaWdlc3QsIG1hYywgbWFjbGVuKSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9TRVRfTUFDLFBLQ1MxMl9SX01BQ19TVFJJTkdfU0VUX0VSUk9SKTsKKwkJCQkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyogU2V0IHVwIGEgbWFjIHN0cnVjdHVyZSAqLworaW50IFBLQ1MxMl9zZXR1cF9tYWMoUEtDUzEyICpwMTIsIGludCBpdGVyLCB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbiwKKwkgICAgIGNvbnN0IEVWUF9NRCAqbWRfdHlwZSkKK3sKKwlpZiAoIShwMTItPm1hYyA9IFBLQ1MxMl9NQUNfREFUQV9uZXcoKSkpIHJldHVybiBQS0NTMTJfRVJST1I7CisJaWYgKGl0ZXIgPiAxKSB7CisJCWlmKCEocDEyLT5tYWMtPml0ZXIgPSBNX0FTTjFfSU5URUdFUl9uZXcoKSkpIHsKKwkJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfU0VUVVBfTUFDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIUFTTjFfSU5URUdFUl9zZXQocDEyLT5tYWMtPml0ZXIsIGl0ZXIpKSB7CisJCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1NFVFVQX01BQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKCFzYWx0bGVuKSBzYWx0bGVuID0gUEtDUzEyX1NBTFRfTEVOOworCXAxMi0+bWFjLT5zYWx0LT5sZW5ndGggPSBzYWx0bGVuOworCWlmICghKHAxMi0+bWFjLT5zYWx0LT5kYXRhID0gT1BFTlNTTF9tYWxsb2MgKHNhbHRsZW4pKSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzEyX1NFVFVQX01BQywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzYWx0KSB7CisJCWlmIChSQU5EX3BzZXVkb19ieXRlcyAocDEyLT5tYWMtPnNhbHQtPmRhdGEsIHNhbHRsZW4pIDwgMCkKKwkJCXJldHVybiAwOworCX0KKwllbHNlIG1lbWNweSAocDEyLT5tYWMtPnNhbHQtPmRhdGEsIHNhbHQsIHNhbHRsZW4pOworCXAxMi0+bWFjLT5kaW5mby0+YWxnb3ItPmFsZ29yaXRobSA9IE9CSl9uaWQyb2JqKEVWUF9NRF90eXBlKG1kX3R5cGUpKTsKKwlpZiAoIShwMTItPm1hYy0+ZGluZm8tPmFsZ29yLT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCkpKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfU0VUVVBfTUFDLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKwlwMTItPm1hYy0+ZGluZm8tPmFsZ29yLT5wYXJhbWV0ZXItPnR5cGUgPSBWX0FTTjFfTlVMTDsKKwkKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfbnBhcy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfbnBhcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNzEzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9ucGFzLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qIHAxMl9ucGFzLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCisvKiBQS0NTIzEyIHBhc3N3b3JkIGNoYW5nZSByb3V0aW5lICovCisKK3N0YXRpYyBpbnQgbmV3cGFzc19wMTIoUEtDUzEyICpwMTIsIGNoYXIgKm9sZHBhc3MsIGNoYXIgKm5ld3Bhc3MpOworc3RhdGljIGludCBuZXdwYXNzX2JhZ3MoU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzLCBjaGFyICpvbGRwYXNzLAorCQkJY2hhciAqbmV3cGFzcyk7CitzdGF0aWMgaW50IG5ld3Bhc3NfYmFnKFBLQ1MxMl9TQUZFQkFHICpiYWcsIGNoYXIgKm9sZHBhc3MsIGNoYXIgKm5ld3Bhc3MpOworc3RhdGljIGludCBhbGdfZ2V0KFg1MDlfQUxHT1IgKmFsZywgaW50ICpwbmlkLCBpbnQgKnBpdGVyLCBpbnQgKnBzYWx0bGVuKTsKKworLyogCisgKiBDaGFuZ2UgdGhlIHBhc3N3b3JkIG9uIGEgUEtDUyMxMiBzdHJ1Y3R1cmUuCisgKi8KKworaW50IFBLQ1MxMl9uZXdwYXNzKFBLQ1MxMiAqcDEyLCBjaGFyICpvbGRwYXNzLCBjaGFyICpuZXdwYXNzKQoreworCS8qIENoZWNrIGZvciBOVUxMIFBLQ1MxMiBzdHJ1Y3R1cmUgKi8KKworCWlmKCFwMTIpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9ORVdQQVNTLFBLQ1MxMl9SX0lOVkFMSURfTlVMTF9QS0NTMTJfUE9JTlRFUik7CisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIHRoZSBtYWMgKi8KKwkKKwlpZiAoIVBLQ1MxMl92ZXJpZnlfbWFjKHAxMiwgb2xkcGFzcywgLTEpKSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTMTJfTkVXUEFTUyxQS0NTMTJfUl9NQUNfVkVSSUZZX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIW5ld3Bhc3NfcDEyKHAxMiwgb2xkcGFzcywgbmV3cGFzcykpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1MxMl9ORVdQQVNTLFBLQ1MxMl9SX1BBUlNFX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKKy8qIFBhcnNlIHRoZSBvdXRlciBQS0NTIzEyIHN0cnVjdHVyZSAqLworCitzdGF0aWMgaW50IG5ld3Bhc3NfcDEyKFBLQ1MxMiAqcDEyLCBjaGFyICpvbGRwYXNzLCBjaGFyICpuZXdwYXNzKQoreworCVNUQUNLX09GKFBLQ1M3KSAqYXNhZmVzLCAqbmV3c2FmZXM7CisJU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzOworCWludCBpLCBiYWduaWQsIHBiZV9uaWQgPSAwLCBwYmVfaXRlciA9IDAsIHBiZV9zYWx0bGVuID0gMDsKKwlQS0NTNyAqcDcsICpwN25ldzsKKwlBU04xX09DVEVUX1NUUklORyAqcDEyX2RhdGFfdG1wID0gTlVMTCwgKm1hY25ldyA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBtYWNbRVZQX01BWF9NRF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgbWFjbGVuOworCisJaWYgKCEoYXNhZmVzID0gUEtDUzEyX3VucGFja19hdXRoc2FmZXMocDEyKSkpIHJldHVybiAwOworCWlmKCEobmV3c2FmZXMgPSBza19QS0NTN19uZXdfbnVsbCgpKSkgcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IHNrX1BLQ1M3X251bSAoYXNhZmVzKTsgaSsrKSB7CisJCXA3ID0gc2tfUEtDUzdfdmFsdWUoYXNhZmVzLCBpKTsKKwkJYmFnbmlkID0gT0JKX29iajJuaWQocDctPnR5cGUpOworCQlpZiAoYmFnbmlkID09IE5JRF9wa2NzN19kYXRhKSB7CisJCQliYWdzID0gUEtDUzEyX3VucGFja19wN2RhdGEocDcpOworCQl9IGVsc2UgaWYgKGJhZ25pZCA9PSBOSURfcGtjczdfZW5jcnlwdGVkKSB7CisJCQliYWdzID0gUEtDUzEyX3VucGFja19wN2VuY2RhdGEocDcsIG9sZHBhc3MsIC0xKTsKKwkJCWlmICghYWxnX2dldChwNy0+ZC5lbmNyeXB0ZWQtPmVuY19kYXRhLT5hbGdvcml0aG0sCisJCQkJJnBiZV9uaWQsICZwYmVfaXRlciwgJnBiZV9zYWx0bGVuKSkKKwkJCQl7CisJCQkJc2tfUEtDUzEyX1NBRkVCQUdfcG9wX2ZyZWUoYmFncywKKwkJCQkJCVBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCQkJCWJhZ3MgPSBOVUxMOworCQkJCX0KKwkJfSBlbHNlIGNvbnRpbnVlOworCQlpZiAoIWJhZ3MpIHsKKwkJCXNrX1BLQ1M3X3BvcF9mcmVlKGFzYWZlcywgUEtDUzdfZnJlZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCSAgICAJaWYgKCFuZXdwYXNzX2JhZ3MoYmFncywgb2xkcGFzcywgbmV3cGFzcykpIHsKKwkJCXNrX1BLQ1MxMl9TQUZFQkFHX3BvcF9mcmVlKGJhZ3MsIFBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCQkJc2tfUEtDUzdfcG9wX2ZyZWUoYXNhZmVzLCBQS0NTN19mcmVlKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIFJlcGFjayBiYWcgaW4gc2FtZSBmb3JtIHdpdGggbmV3IHBhc3N3b3JkICovCisJCWlmIChiYWduaWQgPT0gTklEX3BrY3M3X2RhdGEpIHA3bmV3ID0gUEtDUzEyX3BhY2tfcDdkYXRhKGJhZ3MpOworCQllbHNlIHA3bmV3ID0gUEtDUzEyX3BhY2tfcDdlbmNkYXRhKHBiZV9uaWQsIG5ld3Bhc3MsIC0xLCBOVUxMLAorCQkJCQkJIHBiZV9zYWx0bGVuLCBwYmVfaXRlciwgYmFncyk7CisJCXNrX1BLQ1MxMl9TQUZFQkFHX3BvcF9mcmVlKGJhZ3MsIFBLQ1MxMl9TQUZFQkFHX2ZyZWUpOworCQlpZighcDduZXcpIHsKKwkJCXNrX1BLQ1M3X3BvcF9mcmVlKGFzYWZlcywgUEtDUzdfZnJlZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlza19QS0NTN19wdXNoKG5ld3NhZmVzLCBwN25ldyk7CisJfQorCXNrX1BLQ1M3X3BvcF9mcmVlKGFzYWZlcywgUEtDUzdfZnJlZSk7CisKKwkvKiBSZXBhY2sgc2FmZTogc2F2ZSBvbGQgc2FmZSBpbiBjYXNlIG9mIGVycm9yICovCisKKwlwMTJfZGF0YV90bXAgPSBwMTItPmF1dGhzYWZlcy0+ZC5kYXRhOworCWlmKCEocDEyLT5hdXRoc2FmZXMtPmQuZGF0YSA9IEFTTjFfT0NURVRfU1RSSU5HX25ldygpKSkgZ290byBzYWZlcnI7CisJaWYoIVBLQ1MxMl9wYWNrX2F1dGhzYWZlcyhwMTIsIG5ld3NhZmVzKSkgZ290byBzYWZlcnI7CisKKwlpZighUEtDUzEyX2dlbl9tYWMocDEyLCBuZXdwYXNzLCAtMSwgbWFjLCAmbWFjbGVuKSkgZ290byBzYWZlcnI7CisJaWYoIShtYWNuZXcgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKSkpIGdvdG8gc2FmZXJyOworCWlmKCFBU04xX09DVEVUX1NUUklOR19zZXQobWFjbmV3LCBtYWMsIG1hY2xlbikpIGdvdG8gc2FmZXJyOworCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUocDEyLT5tYWMtPmRpbmZvLT5kaWdlc3QpOworCXAxMi0+bWFjLT5kaW5mby0+ZGlnZXN0ID0gbWFjbmV3OworCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUocDEyX2RhdGFfdG1wKTsKKworCXJldHVybiAxOworCisJc2FmZXJyOgorCS8qIFJlc3RvcmUgb2xkIHNhZmUgKi8KKwlBU04xX09DVEVUX1NUUklOR19mcmVlKHAxMi0+YXV0aHNhZmVzLT5kLmRhdGEpOworCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUobWFjbmV3KTsKKwlwMTItPmF1dGhzYWZlcy0+ZC5kYXRhID0gcDEyX2RhdGFfdG1wOworCXJldHVybiAwOworCit9CisKKworc3RhdGljIGludCBuZXdwYXNzX2JhZ3MoU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzLCBjaGFyICpvbGRwYXNzLAorCQkJY2hhciAqbmV3cGFzcykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfUEtDUzEyX1NBRkVCQUdfbnVtKGJhZ3MpOyBpKyspIHsKKwkJaWYgKCFuZXdwYXNzX2JhZyhza19QS0NTMTJfU0FGRUJBR192YWx1ZShiYWdzLCBpKSwKKwkJCQkgb2xkcGFzcywgbmV3cGFzcykpCisJCSAgICByZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIENoYW5nZSBwYXNzd29yZCBvZiBzYWZlYmFnOiBvbmx5IG5lZWRzIGhhbmRsZSBzaHJvdWRlZCBrZXliYWdzICovCisKK3N0YXRpYyBpbnQgbmV3cGFzc19iYWcoUEtDUzEyX1NBRkVCQUcgKmJhZywgY2hhciAqb2xkcGFzcywgY2hhciAqbmV3cGFzcykKK3sKKwlQS0NTOF9QUklWX0tFWV9JTkZPICpwODsKKwlYNTA5X1NJRyAqcDhuZXc7CisJaW50IHA4X25pZCwgcDhfc2FsdGxlbiwgcDhfaXRlcjsKKworCWlmKE1fUEtDUzEyX2JhZ190eXBlKGJhZykgIT0gTklEX3BrY3M4U2hyb3VkZWRLZXlCYWcpIHJldHVybiAxOworCisJaWYgKCEocDggPSBQS0NTOF9kZWNyeXB0KGJhZy0+dmFsdWUuc2hrZXliYWcsIG9sZHBhc3MsIC0xKSkpIHJldHVybiAwOworCWlmICghYWxnX2dldChiYWctPnZhbHVlLnNoa2V5YmFnLT5hbGdvciwgJnA4X25pZCwgJnA4X2l0ZXIsCisJCQkJCQkJJnA4X3NhbHRsZW4pKQorCQlyZXR1cm4gMDsKKwlpZighKHA4bmV3ID0gUEtDUzhfZW5jcnlwdChwOF9uaWQsIE5VTEwsIG5ld3Bhc3MsIC0xLCBOVUxMLCBwOF9zYWx0bGVuLAorCQkJCQkJICAgICBwOF9pdGVyLCBwOCkpKSByZXR1cm4gMDsKKwlYNTA5X1NJR19mcmVlKGJhZy0+dmFsdWUuc2hrZXliYWcpOworCWJhZy0+dmFsdWUuc2hrZXliYWcgPSBwOG5ldzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhbGdfZ2V0KFg1MDlfQUxHT1IgKmFsZywgaW50ICpwbmlkLCBpbnQgKnBpdGVyLCBpbnQgKnBzYWx0bGVuKQoreworICAgICAgICBQQkVQQVJBTSAqcGJlOworICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworCisgICAgICAgIHAgPSBhbGctPnBhcmFtZXRlci0+dmFsdWUuc2VxdWVuY2UtPmRhdGE7CisgICAgICAgIHBiZSA9IGQyaV9QQkVQQVJBTShOVUxMLCAmcCwgYWxnLT5wYXJhbWV0ZXItPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGgpOworCWlmICghcGJlKQorCQlyZXR1cm4gMDsKKyAgICAgICAgKnBuaWQgPSBPQkpfb2JqMm5pZChhbGctPmFsZ29yaXRobSk7CisJKnBpdGVyID0gQVNOMV9JTlRFR0VSX2dldChwYmUtPml0ZXIpOworCSpwc2FsdGxlbiA9IHBiZS0+c2FsdC0+bGVuZ3RoOworICAgICAgICBQQkVQQVJBTV9mcmVlKHBiZSk7CisgICAgICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfcDhkLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl9wOGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJhODFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfcDhkLmMKQEAgLTAsMCArMSw2OCBAQAorLyogcDEyX3A4ZC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczEyLmg+CisKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKlBLQ1M4X2RlY3J5cHQoWDUwOV9TSUcgKnA4LCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbikKK3sKKwlyZXR1cm4gUEtDUzEyX2l0ZW1fZGVjcnlwdF9kMmkocDgtPmFsZ29yLCBBU04xX0lURU1fcnB0cihQS0NTOF9QUklWX0tFWV9JTkZPKSwgcGFzcywKKwkJCQkJcGFzc2xlbiwgcDgtPmRpZ2VzdCwgMSk7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX3A4ZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfcDhlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMGE3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcDEyX3A4ZS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIHAxMl9wOGUuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCitYNTA5X1NJRyAqUEtDUzhfZW5jcnlwdChpbnQgcGJlX25pZCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorCQkJIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCQkJIHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLCBpbnQgaXRlciwKKwkJCQkJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKQoreworCVg1MDlfU0lHICpwOCA9IE5VTEw7CisJWDUwOV9BTEdPUiAqcGJlOworCisJaWYgKCEocDggPSBYNTA5X1NJR19uZXcoKSkpIHsKKwkJUEtDUzEyZXJyKFBLQ1MxMl9GX1BLQ1M4X0VOQ1JZUFQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYocGJlX25pZCA9PSAtMSkgcGJlID0gUEtDUzVfcGJlMl9zZXQoY2lwaGVyLCBpdGVyLCBzYWx0LCBzYWx0bGVuKTsKKwllbHNlIHBiZSA9IFBLQ1M1X3BiZV9zZXQocGJlX25pZCwgaXRlciwgc2FsdCwgc2FsdGxlbik7CisJaWYoIXBiZSkgeworCQlQS0NTMTJlcnIoUEtDUzEyX0ZfUEtDUzhfRU5DUllQVCwgRVJSX1JfQVNOMV9MSUIpOworCQlnb3RvIGVycjsKKwl9CisJWDUwOV9BTEdPUl9mcmVlKHA4LT5hbGdvcik7CisJcDgtPmFsZ29yID0gcGJlOworCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShwOC0+ZGlnZXN0KTsKKwlwOC0+ZGlnZXN0ID0gUEtDUzEyX2l0ZW1faTJkX2VuY3J5cHQocGJlLCBBU04xX0lURU1fcnB0cihQS0NTOF9QUklWX0tFWV9JTkZPKSwKKwkJCQkJcGFzcywgcGFzc2xlbiwgcDhpbmYsIDEpOworCWlmKCFwOC0+ZGlnZXN0KSB7CisJCVBLQ1MxMmVycihQS0NTMTJfRl9QS0NTOF9FTkNSWVBULCBQS0NTMTJfUl9FTkNSWVBUX0VSUk9SKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHA4OworCisJZXJyOgorCVg1MDlfU0lHX2ZyZWUocDgpOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfdXRsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3AxMl91dGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWM2ZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wMTJfdXRsLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qIHAxMl91dGwuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3MxMi5oPgorCisvKiBDaGVhcCBhbmQgbmFzdHkgVW5pY29kZSBzdHVmZiAqLworCit1bnNpZ25lZCBjaGFyICpPUEVOU1NMX2FzYzJ1bmkoY29uc3QgY2hhciAqYXNjLCBpbnQgYXNjbGVuLCB1bnNpZ25lZCBjaGFyICoqdW5pLCBpbnQgKnVuaWxlbikKK3sKKwlpbnQgdWxlbiwgaTsKKwl1bnNpZ25lZCBjaGFyICp1bml0bXA7CisJaWYgKGFzY2xlbiA9PSAtMSkgYXNjbGVuID0gc3RybGVuKGFzYyk7CisJdWxlbiA9IGFzY2xlbioyICArIDI7CisJaWYgKCEodW5pdG1wID0gT1BFTlNTTF9tYWxsb2ModWxlbikpKSByZXR1cm4gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgdWxlbiAtIDI7IGkrPTIpIHsKKwkJdW5pdG1wW2ldID0gMDsKKwkJdW5pdG1wW2kgKyAxXSA9IGFzY1tpPj4xXTsKKwl9CisJLyogTWFrZSByZXN1bHQgZG91YmxlIG51bGwgdGVybWluYXRlZCAqLworCXVuaXRtcFt1bGVuIC0gMl0gPSAwOworCXVuaXRtcFt1bGVuIC0gMV0gPSAwOworCWlmICh1bmlsZW4pICp1bmlsZW4gPSB1bGVuOworCWlmICh1bmkpICp1bmkgPSB1bml0bXA7CisJcmV0dXJuIHVuaXRtcDsKK30KKworY2hhciAqT1BFTlNTTF91bmkyYXNjKHVuc2lnbmVkIGNoYXIgKnVuaSwgaW50IHVuaWxlbikKK3sKKwlpbnQgYXNjbGVuLCBpOworCWNoYXIgKmFzY3RtcDsKKwlhc2NsZW4gPSB1bmlsZW4gLyAyOworCS8qIElmIG5vIHRlcm1pbmF0aW5nIHplcm8gYWxsb3cgZm9yIG9uZSAqLworCWlmICghdW5pbGVuIHx8IHVuaVt1bmlsZW4gLSAxXSkgYXNjbGVuKys7CisJdW5pKys7CisJaWYgKCEoYXNjdG1wID0gT1BFTlNTTF9tYWxsb2MoYXNjbGVuKSkpIHJldHVybiBOVUxMOworCWZvciAoaSA9IDA7IGkgPCB1bmlsZW47IGkrPTIpIGFzY3RtcFtpPj4xXSA9IHVuaVtpXTsKKwlhc2N0bXBbYXNjbGVuIC0gMV0gPSAwOworCXJldHVybiBhc2N0bXA7Cit9CisKK2ludCBpMmRfUEtDUzEyX2JpbyhCSU8gKmJwLCBQS0NTMTIgKnAxMikKK3sKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9iaW8oQVNOMV9JVEVNX3JwdHIoUEtDUzEyKSwgYnAsIHAxMik7Cit9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBpMmRfUEtDUzEyX2ZwKEZJTEUgKmZwLCBQS0NTMTIgKnAxMikKK3sKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9mcChBU04xX0lURU1fcnB0cihQS0NTMTIpLCBmcCwgcDEyKTsKK30KKyNlbmRpZgorCitQS0NTMTIgKmQyaV9QS0NTMTJfYmlvKEJJTyAqYnAsIFBLQ1MxMiAqKnAxMikKK3sKKwlyZXR1cm4gQVNOMV9pdGVtX2QyaV9iaW8oQVNOMV9JVEVNX3JwdHIoUEtDUzEyKSwgYnAsIHAxMik7Cit9CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitQS0NTMTIgKmQyaV9QS0NTMTJfZnAoRklMRSAqZnAsIFBLQ1MxMiAqKnAxMikKK3sKKyAgICAgICAgcmV0dXJuIEFTTjFfaXRlbV9kMmlfZnAoQVNOMV9JVEVNX3JwdHIoUEtDUzEyKSwgZnAsIHAxMik7Cit9CisjZW5kaWYKKworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl94NTA5MmNlcnRiYWcoWDUwOSAqeDUwOSkKK3sKKwlyZXR1cm4gUEtDUzEyX2l0ZW1fcGFja19zYWZlYmFnKHg1MDksIEFTTjFfSVRFTV9ycHRyKFg1MDkpLAorCQkJTklEX3g1MDlDZXJ0aWZpY2F0ZSwgTklEX2NlcnRCYWcpOworfQorCitQS0NTMTJfU0FGRUJBRyAqUEtDUzEyX3g1MDljcmwyY2VydGJhZyhYNTA5X0NSTCAqY3JsKQoreworCXJldHVybiBQS0NTMTJfaXRlbV9wYWNrX3NhZmViYWcoY3JsLCBBU04xX0lURU1fcnB0cihYNTA5X0NSTCksCisJCQlOSURfeDUwOUNybCwgTklEX2NybEJhZyk7Cit9CisKK1g1MDkgKlBLQ1MxMl9jZXJ0YmFnMng1MDkoUEtDUzEyX1NBRkVCQUcgKmJhZykKK3sKKwlpZihNX1BLQ1MxMl9iYWdfdHlwZShiYWcpICE9IE5JRF9jZXJ0QmFnKSByZXR1cm4gTlVMTDsKKwlpZihNX1BLQ1MxMl9jZXJ0X2JhZ190eXBlKGJhZykgIT0gTklEX3g1MDlDZXJ0aWZpY2F0ZSkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIEFTTjFfaXRlbV91bnBhY2soYmFnLT52YWx1ZS5iYWctPnZhbHVlLm9jdGV0LCBBU04xX0lURU1fcnB0cihYNTA5KSk7Cit9CisKK1g1MDlfQ1JMICpQS0NTMTJfY2VydGJhZzJ4NTA5Y3JsKFBLQ1MxMl9TQUZFQkFHICpiYWcpCit7CisJaWYoTV9QS0NTMTJfYmFnX3R5cGUoYmFnKSAhPSBOSURfY3JsQmFnKSByZXR1cm4gTlVMTDsKKwlpZihNX1BLQ1MxMl9jZXJ0X2JhZ190eXBlKGJhZykgIT0gTklEX3g1MDlDcmwpIHJldHVybiBOVUxMOworCXJldHVybiBBU04xX2l0ZW1fdW5wYWNrKGJhZy0+dmFsdWUuYmFnLT52YWx1ZS5vY3RldCwKKwkJCQkJCQlBU04xX0lURU1fcnB0cihYNTA5X0NSTCkpOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wazEyZXJyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3BrMTJlcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmRkZjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3MxMi9wazEyZXJyLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qIGNyeXB0by9wa2NzMTIvcGsxMmVyci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogTk9URTogdGhpcyBmaWxlIHdhcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgbWtlcnIucGwgc2NyaXB0OiBhbnkgY2hhbmdlcworICogbWFkZSB0byBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBuZXh0IHVwZGF0ZXMgdGhpcyBmaWxlLAorICogb25seSByZWFzb24gc3RyaW5ncyB3aWxsIGJlIHByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczEyLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9QS0NTMTIsZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9QS0NTMTIsMCxyZWFzb24pCisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgUEtDUzEyX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEFSU0VfQkFHKSwJIlBBUlNFX0JBRyJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BBUlNFX0JBR1MpLAkiUEFSU0VfQkFHUyJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9BRERfRlJJRU5ETFlOQU1FKSwJIlBLQ1MxMl9BRERfRlJJRU5ETFlOQU1FIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzEyX0FERF9GUklFTkRMWU5BTUVfQVNDKSwJIlBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX2FzYyJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9BRERfRlJJRU5ETFlOQU1FX1VOSSksCSJQS0NTMTJfYWRkX2ZyaWVuZGx5bmFtZV91bmkifSwKK3tFUlJfRlVOQyhQS0NTMTJfRl9QS0NTMTJfQUREX0xPQ0FMS0VZSUQpLAkiUEtDUzEyX2FkZF9sb2NhbGtleWlkIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzEyX0NSRUFURSksCSJQS0NTMTJfY3JlYXRlIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzEyX0dFTl9NQUMpLAkiUEtDUzEyX2dlbl9tYWMifSwKK3tFUlJfRlVOQyhQS0NTMTJfRl9QS0NTMTJfSU5JVCksCSJQS0NTMTJfaW5pdCJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9JVEVNX0RFQ1JZUFRfRDJJKSwJIlBLQ1MxMl9pdGVtX2RlY3J5cHRfZDJpIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzEyX0lURU1fSTJEX0VOQ1JZUFQpLAkiUEtDUzEyX2l0ZW1faTJkX2VuY3J5cHQifSwKK3tFUlJfRlVOQyhQS0NTMTJfRl9QS0NTMTJfSVRFTV9QQUNLX1NBRkVCQUcpLAkiUEtDUzEyX2l0ZW1fcGFja19zYWZlYmFnIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzEyX0tFWV9HRU5fQVNDKSwJIlBLQ1MxMl9rZXlfZ2VuX2FzYyJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9LRVlfR0VOX1VOSSksCSJQS0NTMTJfa2V5X2dlbl91bmkifSwKK3tFUlJfRlVOQyhQS0NTMTJfRl9QS0NTMTJfTUFLRV9LRVlCQUcpLAkiUEtDUzEyX01BS0VfS0VZQkFHIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzEyX01BS0VfU0hLRVlCQUcpLAkiUEtDUzEyX01BS0VfU0hLRVlCQUcifSwKK3tFUlJfRlVOQyhQS0NTMTJfRl9QS0NTMTJfTkVXUEFTUyksCSJQS0NTMTJfbmV3cGFzcyJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9QQUNLX1A3REFUQSksCSJQS0NTMTJfcGFja19wN2RhdGEifSwKK3tFUlJfRlVOQyhQS0NTMTJfRl9QS0NTMTJfUEFDS19QN0VOQ0RBVEEpLAkiUEtDUzEyX3BhY2tfcDdlbmNkYXRhIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzEyX1BBUlNFKSwJIlBLQ1MxMl9wYXJzZSJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9QQkVfQ1JZUFQpLAkiUEtDUzEyX3BiZV9jcnlwdCJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9QQkVfS0VZSVZHRU4pLAkiUEtDUzEyX1BCRV9rZXlpdmdlbiJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9TRVRVUF9NQUMpLAkiUEtDUzEyX3NldHVwX21hYyJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9TRVRfTUFDKSwJIlBLQ1MxMl9zZXRfbWFjIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzEyX1VOUEFDS19BVVRIU0FGRVMpLAkiUEtDUzEyX3VucGFja19hdXRoc2FmZXMifSwKK3tFUlJfRlVOQyhQS0NTMTJfRl9QS0NTMTJfVU5QQUNLX1A3REFUQSksCSJQS0NTMTJfdW5wYWNrX3A3ZGF0YSJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1MxMl9WRVJJRllfTUFDKSwJIlBLQ1MxMl92ZXJpZnlfbWFjIn0sCit7RVJSX0ZVTkMoUEtDUzEyX0ZfUEtDUzhfQUREX0tFWVVTQUdFKSwJIlBLQ1M4X2FkZF9rZXl1c2FnZSJ9LAore0VSUl9GVU5DKFBLQ1MxMl9GX1BLQ1M4X0VOQ1JZUFQpLAkiUEtDUzhfZW5jcnlwdCJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFBLQ1MxMl9zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX0NBTlRfUEFDS19TVFJVQ1RVUkUpLCJjYW50IHBhY2sgc3RydWN0dXJlIn0sCit7RVJSX1JFQVNPTihQS0NTMTJfUl9DT05URU5UX1RZUEVfTk9UX0RBVEEpLCJjb250ZW50IHR5cGUgbm90IGRhdGEifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX0RFQ09ERV9FUlJPUikgICAgICAgLCJkZWNvZGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX0VOQ09ERV9FUlJPUikgICAgICAgLCJlbmNvZGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX0VOQ1JZUFRfRVJST1IpICAgICAgLCJlbmNyeXB0IGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTMTJfUl9FUlJPUl9TRVRUSU5HX0VOQ1JZUFRFRF9EQVRBX1RZUEUpLCJlcnJvciBzZXR0aW5nIGVuY3J5cHRlZCBkYXRhIHR5cGUifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX0lOVkFMSURfTlVMTF9BUkdVTUVOVCksImludmFsaWQgbnVsbCBhcmd1bWVudCJ9LAore0VSUl9SRUFTT04oUEtDUzEyX1JfSU5WQUxJRF9OVUxMX1BLQ1MxMl9QT0lOVEVSKSwiaW52YWxpZCBudWxsIHBrY3MxMiBwb2ludGVyIn0sCit7RVJSX1JFQVNPTihQS0NTMTJfUl9JVl9HRU5fRVJST1IpICAgICAgICwiaXYgZ2VuIGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTMTJfUl9LRVlfR0VOX0VSUk9SKSAgICAgICwia2V5IGdlbiBlcnJvciJ9LAore0VSUl9SRUFTT04oUEtDUzEyX1JfTUFDX0FCU0VOVCkgICAgICAgICAsIm1hYyBhYnNlbnQifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX01BQ19HRU5FUkFUSU9OX0VSUk9SKSwibWFjIGdlbmVyYXRpb24gZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX01BQ19TRVRVUF9FUlJPUikgICAgLCJtYWMgc2V0dXAgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX01BQ19TVFJJTkdfU0VUX0VSUk9SKSwibWFjIHN0cmluZyBzZXQgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX01BQ19WRVJJRllfRVJST1IpICAgLCJtYWMgdmVyaWZ5IGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTMTJfUl9NQUNfVkVSSUZZX0ZBSUxVUkUpICwibWFjIHZlcmlmeSBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihQS0NTMTJfUl9QQVJTRV9FUlJPUikgICAgICAgICwicGFyc2UgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX1BLQ1MxMl9BTEdPUl9DSVBIRVJJTklUX0VSUk9SKSwicGtjczEyIGFsZ29yIGNpcGhlcmluaXQgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX1BLQ1MxMl9DSVBIRVJGSU5BTF9FUlJPUiksInBrY3MxMiBjaXBoZXJmaW5hbCBlcnJvciJ9LAore0VSUl9SRUFTT04oUEtDUzEyX1JfUEtDUzEyX1BCRV9DUllQVF9FUlJPUiksInBrY3MxMiBwYmUgY3J5cHQgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1MxMl9SX1VOS05PV05fRElHRVNUX0FMR09SSVRITSksInVua25vd24gZGlnZXN0IGFsZ29yaXRobSJ9LAore0VSUl9SRUFTT04oUEtDUzEyX1JfVU5TVVBQT1JURURfUEtDUzEyX01PREUpLCJ1bnN1cHBvcnRlZCBwa2NzMTIgbW9kZSJ9LAorezAsTlVMTH0KKwl9OworCisjZW5kaWYKKwordm9pZCBFUlJfbG9hZF9QS0NTMTJfc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworCWlmIChFUlJfZnVuY19lcnJvcl9zdHJpbmcoUEtDUzEyX3N0cl9mdW5jdHNbMF0uZXJyb3IpID09IE5VTEwpCisJCXsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLFBLQ1MxMl9zdHJfZnVuY3RzKTsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLFBLQ1MxMl9zdHJfcmVhc29ucyk7CisJCX0KKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzMTIvcGtjczEyLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3BrY3MxMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2ViOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczEyL3BrY3MxMi5oCkBAIC0wLDAgKzEsMzMxIEBACisvKiBwa2NzMTIuaCAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfUEtDUzEyX0gKKyNkZWZpbmUgSEVBREVSX1BLQ1MxMl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgUEtDUzEyX0tFWV9JRAkxCisjZGVmaW5lIFBLQ1MxMl9JVl9JRAkyCisjZGVmaW5lIFBLQ1MxMl9NQUNfSUQJMworCisvKiBEZWZhdWx0IGl0ZXJhdGlvbiBjb3VudCAqLworI2lmbmRlZiBQS0NTMTJfREVGQVVMVF9JVEVSCisjZGVmaW5lIFBLQ1MxMl9ERUZBVUxUX0lURVIJUEtDUzVfREVGQVVMVF9JVEVSCisjZW5kaWYKKworI2RlZmluZSBQS0NTMTJfTUFDX0tFWV9MRU5HVEggMjAKKworI2RlZmluZSBQS0NTMTJfU0FMVF9MRU4JOAorCisvKiBVbmNvbW1lbnQgb3V0IG5leHQgbGluZSBmb3IgdW5pY29kZSBwYXNzd29yZCBhbmQgbmFtZXMsIG90aGVyd2lzZSBBU0NJSSAqLworCisvKiNkZWZpbmUgUEJFX1VOSUNPREUqLworCisjaWZkZWYgUEJFX1VOSUNPREUKKyNkZWZpbmUgUEtDUzEyX2tleV9nZW4gUEtDUzEyX2tleV9nZW5fdW5pCisjZGVmaW5lIFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lIFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX3VuaQorI2Vsc2UKKyNkZWZpbmUgUEtDUzEyX2tleV9nZW4gUEtDUzEyX2tleV9nZW5fYXNjCisjZGVmaW5lIFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lIFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX2FzYworI2VuZGlmCisKKy8qIE1TIGtleSB1c2FnZSBjb25zdGFudHMgKi8KKworI2RlZmluZSBLRVlfRVgJMHgxMAorI2RlZmluZSBLRVlfU0lHIDB4ODAKKwordHlwZWRlZiBzdHJ1Y3QgeworWDUwOV9TSUcgKmRpbmZvOworQVNOMV9PQ1RFVF9TVFJJTkcgKnNhbHQ7CitBU04xX0lOVEVHRVIgKml0ZXI7CS8qIGRlZmF1bHRzIHRvIDEgKi8KK30gUEtDUzEyX01BQ19EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CitBU04xX0lOVEVHRVIgKnZlcnNpb247CitQS0NTMTJfTUFDX0RBVEEgKm1hYzsKK1BLQ1M3ICphdXRoc2FmZXM7Cit9IFBLQ1MxMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworQVNOMV9PQkpFQ1QgKnR5cGU7Cit1bmlvbiB7CisJc3RydWN0IHBrY3MxMl9iYWdfc3QgKmJhZzsgLyogc2VjcmV0LCBjcmwgYW5kIGNlcnRiYWcgKi8KKwlzdHJ1Y3QgcGtjczhfcHJpdl9rZXlfaW5mb19zdAkqa2V5YmFnOyAvKiBrZXliYWcgKi8KKwlYNTA5X1NJRyAqc2hrZXliYWc7IC8qIHNocm91ZGVkIGtleSBiYWcgKi8KKwlTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKnNhZmVzOworCUFTTjFfVFlQRSAqb3RoZXI7Cit9dmFsdWU7CitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKmF0dHJpYjsKK30gUEtDUzEyX1NBRkVCQUc7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpCitERUNMQVJFX0FTTjFfU0VUX09GKFBLQ1MxMl9TQUZFQkFHKQorREVDTEFSRV9QS0NTMTJfU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpCisKK3R5cGVkZWYgc3RydWN0IHBrY3MxMl9iYWdfc3QgeworQVNOMV9PQkpFQ1QgKnR5cGU7Cit1bmlvbiB7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKng1MDljZXJ0OworCUFTTjFfT0NURVRfU1RSSU5HICp4NTA5Y3JsOworCUFTTjFfT0NURVRfU1RSSU5HICpvY3RldDsKKwlBU04xX0lBNVNUUklORyAqc2RzaWNlcnQ7CisJQVNOMV9UWVBFICpvdGhlcjsgLyogU2VjcmV0IG9yIG90aGVyIGJhZyAqLworfXZhbHVlOworfSBQS0NTMTJfQkFHUzsKKworI2RlZmluZSBQS0NTMTJfRVJST1IJMAorI2RlZmluZSBQS0NTMTJfT0sJMQorCisvKiBDb21wYXRpYmlsaXR5IG1hY3JvcyAqLworCisjZGVmaW5lIE1fUEtDUzEyX3g1MDkyY2VydGJhZyBQS0NTMTJfeDUwOTJjZXJ0YmFnCisjZGVmaW5lIE1fUEtDUzEyX3g1MDljcmwyY2VydGJhZyBQS0NTMTJfeDUwOWNybDJjZXJ0YmFnCisKKyNkZWZpbmUgTV9QS0NTMTJfY2VydGJhZzJ4NTA5IFBLQ1MxMl9jZXJ0YmFnMng1MDkKKyNkZWZpbmUgTV9QS0NTMTJfY2VydGJhZzJ4NTA5Y3JsIFBLQ1MxMl9jZXJ0YmFnMng1MDljcmwgCisKKyNkZWZpbmUgTV9QS0NTMTJfdW5wYWNrX3A3ZGF0YSBQS0NTMTJfdW5wYWNrX3A3ZGF0YQorI2RlZmluZSBNX1BLQ1MxMl9wYWNrX2F1dGhzYWZlcyBQS0NTMTJfcGFja19hdXRoc2FmZXMKKyNkZWZpbmUgTV9QS0NTMTJfdW5wYWNrX2F1dGhzYWZlcyBQS0NTMTJfdW5wYWNrX2F1dGhzYWZlcworI2RlZmluZSBNX1BLQ1MxMl91bnBhY2tfcDdlbmNkYXRhIFBLQ1MxMl91bnBhY2tfcDdlbmNkYXRhCisKKyNkZWZpbmUgTV9QS0NTMTJfZGVjcnlwdF9za2V5IFBLQ1MxMl9kZWNyeXB0X3NrZXkKKyNkZWZpbmUgTV9QS0NTOF9kZWNyeXB0IFBLQ1M4X2RlY3J5cHQKKworI2RlZmluZSBNX1BLQ1MxMl9iYWdfdHlwZShiZykgT0JKX29iajJuaWQoKGJnKS0+dHlwZSkKKyNkZWZpbmUgTV9QS0NTMTJfY2VydF9iYWdfdHlwZShiZykgT0JKX29iajJuaWQoKGJnKS0+dmFsdWUuYmFnLT50eXBlKQorI2RlZmluZSBNX1BLQ1MxMl9jcmxfYmFnX3R5cGUgTV9QS0NTMTJfY2VydF9iYWdfdHlwZQorCisjZGVmaW5lIFBLQ1MxMl9nZXRfYXR0cihiYWcsIGF0dHJfbmlkKSBcCisJCQkgUEtDUzEyX2dldF9hdHRyX2dlbihiYWctPmF0dHJpYiwgYXR0cl9uaWQpCisKKyNkZWZpbmUgUEtDUzhfZ2V0X2F0dHIocDgsIGF0dHJfbmlkKSBcCisJCVBLQ1MxMl9nZXRfYXR0cl9nZW4ocDgtPmF0dHJpYnV0ZXMsIGF0dHJfbmlkKQorCisjZGVmaW5lIFBLQ1MxMl9tYWNfcHJlc2VudChwMTIpICgocDEyKS0+bWFjID8gMSA6IDApCisKKworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl94NTA5MmNlcnRiYWcoWDUwOSAqeDUwOSk7CitQS0NTMTJfU0FGRUJBRyAqUEtDUzEyX3g1MDljcmwyY2VydGJhZyhYNTA5X0NSTCAqY3JsKTsKK1g1MDkgKlBLQ1MxMl9jZXJ0YmFnMng1MDkoUEtDUzEyX1NBRkVCQUcgKmJhZyk7CitYNTA5X0NSTCAqUEtDUzEyX2NlcnRiYWcyeDUwOWNybChQS0NTMTJfU0FGRUJBRyAqYmFnKTsKKworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9pdGVtX3BhY2tfc2FmZWJhZyh2b2lkICpvYmosIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBuaWQxLAorCSAgICAgaW50IG5pZDIpOworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9NQUtFX0tFWUJBRyhQS0NTOF9QUklWX0tFWV9JTkZPICpwOCk7CitQS0NTOF9QUklWX0tFWV9JTkZPICpQS0NTOF9kZWNyeXB0KFg1MDlfU0lHICpwOCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4pOworUEtDUzhfUFJJVl9LRVlfSU5GTyAqUEtDUzEyX2RlY3J5cHRfc2tleShQS0NTMTJfU0FGRUJBRyAqYmFnLCBjb25zdCBjaGFyICpwYXNzLAorCQkJCQkJCQlpbnQgcGFzc2xlbik7CitYNTA5X1NJRyAqUEtDUzhfZW5jcnlwdChpbnQgcGJlX25pZCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCAKKwkJCWNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCQkJdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpdGVyLAorCQkJUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgpOworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9NQUtFX1NIS0VZQkFHKGludCBwYmVfbmlkLCBjb25zdCBjaGFyICpwYXNzLAorCQkJCSAgICAgaW50IHBhc3NsZW4sIHVuc2lnbmVkIGNoYXIgKnNhbHQsCisJCQkJICAgICBpbnQgc2FsdGxlbiwgaW50IGl0ZXIsCisJCQkJICAgICBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCk7CitQS0NTNyAqUEtDUzEyX3BhY2tfcDdkYXRhKFNUQUNLX09GKFBLQ1MxMl9TQUZFQkFHKSAqc2spOworU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpQS0NTMTJfdW5wYWNrX3A3ZGF0YShQS0NTNyAqcDcpOworUEtDUzcgKlBLQ1MxMl9wYWNrX3A3ZW5jZGF0YShpbnQgcGJlX25pZCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLCBpbnQgaXRlciwKKwkJCSAgICAgU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzKTsKK1NUQUNLX09GKFBLQ1MxMl9TQUZFQkFHKSAqUEtDUzEyX3VucGFja19wN2VuY2RhdGEoUEtDUzcgKnA3LCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbik7CisKK2ludCBQS0NTMTJfcGFja19hdXRoc2FmZXMoUEtDUzEyICpwMTIsIFNUQUNLX09GKFBLQ1M3KSAqc2FmZXMpOworU1RBQ0tfT0YoUEtDUzcpICpQS0NTMTJfdW5wYWNrX2F1dGhzYWZlcyhQS0NTMTIgKnAxMik7CisKK2ludCBQS0NTMTJfYWRkX2xvY2Fsa2V5aWQoUEtDUzEyX1NBRkVCQUcgKmJhZywgdW5zaWduZWQgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworaW50IFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX2FzYyhQS0NTMTJfU0FGRUJBRyAqYmFnLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCWludCBuYW1lbGVuKTsKK2ludCBQS0NTMTJfYWRkX0NTUE5hbWVfYXNjKFBLQ1MxMl9TQUZFQkFHICpiYWcsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJaW50IG5hbWVsZW4pOworaW50IFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX3VuaShQS0NTMTJfU0FGRUJBRyAqYmFnLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorCQkJCWludCBuYW1lbGVuKTsKK2ludCBQS0NTOF9hZGRfa2V5dXNhZ2UoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGludCB1c2FnZSk7CitBU04xX1RZUEUgKlBLQ1MxMl9nZXRfYXR0cl9nZW4oU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICphdHRycywgaW50IGF0dHJfbmlkKTsKK2NoYXIgKlBLQ1MxMl9nZXRfZnJpZW5kbHluYW1lKFBLQ1MxMl9TQUZFQkFHICpiYWcpOwordW5zaWduZWQgY2hhciAqUEtDUzEyX3BiZV9jcnlwdChYNTA5X0FMR09SICphbGdvciwgY29uc3QgY2hhciAqcGFzcywKKwkJCQlpbnQgcGFzc2xlbiwgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmxlbiwKKwkJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50ICpkYXRhbGVuLCBpbnQgZW5fZGUpOwordm9pZCAqIFBLQ1MxMl9pdGVtX2RlY3J5cHRfZDJpKFg1MDlfQUxHT1IgKmFsZ29yLCBjb25zdCBBU04xX0lURU0gKml0LAorCSAgICAgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sIEFTTjFfT0NURVRfU1RSSU5HICpvY3QsIGludCB6YnVmKTsKK0FTTjFfT0NURVRfU1RSSU5HICpQS0NTMTJfaXRlbV9pMmRfZW5jcnlwdChYNTA5X0FMR09SICphbGdvciwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkJICAgICAgIHZvaWQgKm9iaiwgaW50IHpidWYpOworUEtDUzEyICpQS0NTMTJfaW5pdChpbnQgbW9kZSk7CitpbnQgUEtDUzEyX2tleV9nZW5fYXNjKGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLCB1bnNpZ25lZCBjaGFyICpzYWx0LAorCQkgICAgICAgaW50IHNhbHRsZW4sIGludCBpZCwgaW50IGl0ZXIsIGludCBuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCBjb25zdCBFVlBfTUQgKm1kX3R5cGUpOworaW50IFBLQ1MxMl9rZXlfZ2VuX3VuaSh1bnNpZ25lZCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpZCwgaW50IGl0ZXIsIGludCBuLCB1bnNpZ25lZCBjaGFyICpvdXQsIGNvbnN0IEVWUF9NRCAqbWRfdHlwZSk7CitpbnQgUEtDUzEyX1BCRV9rZXlpdmdlbihFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCSBBU04xX1RZUEUgKnBhcmFtLCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIGNvbnN0IEVWUF9NRCAqbWRfdHlwZSwKKwkJCSBpbnQgZW5fZGUpOworaW50IFBLQ1MxMl9nZW5fbWFjKFBLQ1MxMiAqcDEyLCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCSB1bnNpZ25lZCBjaGFyICptYWMsIHVuc2lnbmVkIGludCAqbWFjbGVuKTsKK2ludCBQS0NTMTJfdmVyaWZ5X21hYyhQS0NTMTIgKnAxMiwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4pOworaW50IFBLQ1MxMl9zZXRfbWFjKFBLQ1MxMiAqcDEyLCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJICAgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpdGVyLAorCQkgICBjb25zdCBFVlBfTUQgKm1kX3R5cGUpOworaW50IFBLQ1MxMl9zZXR1cF9tYWMoUEtDUzEyICpwMTIsIGludCBpdGVyLCB1bnNpZ25lZCBjaGFyICpzYWx0LAorCQkJCQkgaW50IHNhbHRsZW4sIGNvbnN0IEVWUF9NRCAqbWRfdHlwZSk7Cit1bnNpZ25lZCBjaGFyICpPUEVOU1NMX2FzYzJ1bmkoY29uc3QgY2hhciAqYXNjLCBpbnQgYXNjbGVuLCB1bnNpZ25lZCBjaGFyICoqdW5pLCBpbnQgKnVuaWxlbik7CitjaGFyICpPUEVOU1NMX3VuaTJhc2ModW5zaWduZWQgY2hhciAqdW5pLCBpbnQgdW5pbGVuKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQS0NTMTIpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1MxMl9NQUNfREFUQSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzEyX1NBRkVCQUcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1MxMl9CQUdTKQorCitERUNMQVJFX0FTTjFfSVRFTShQS0NTMTJfU0FGRUJBR1MpCitERUNMQVJFX0FTTjFfSVRFTShQS0NTMTJfQVVUSFNBRkVTKQorCit2b2lkIFBLQ1MxMl9QQkVfYWRkKHZvaWQpOworaW50IFBLQ1MxMl9wYXJzZShQS0NTMTIgKnAxMiwgY29uc3QgY2hhciAqcGFzcywgRVZQX1BLRVkgKipwa2V5LCBYNTA5ICoqY2VydCwKKwkJIFNUQUNLX09GKFg1MDkpICoqY2EpOworUEtDUzEyICpQS0NTMTJfY3JlYXRlKGNoYXIgKnBhc3MsIGNoYXIgKm5hbWUsIEVWUF9QS0VZICpwa2V5LCBYNTA5ICpjZXJ0LAorCQkJIFNUQUNLX09GKFg1MDkpICpjYSwgaW50IG5pZF9rZXksIGludCBuaWRfY2VydCwgaW50IGl0ZXIsCisJCQkJCQkgaW50IG1hY19pdGVyLCBpbnQga2V5dHlwZSk7CisKK1BLQ1MxMl9TQUZFQkFHICpQS0NTMTJfYWRkX2NlcnQoU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICoqcGJhZ3MsIFg1MDkgKmNlcnQpOworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9hZGRfa2V5KFNUQUNLX09GKFBLQ1MxMl9TQUZFQkFHKSAqKnBiYWdzLCBFVlBfUEtFWSAqa2V5LAorCQkJCQkJaW50IGtleV91c2FnZSwgaW50IGl0ZXIsCisJCQkJCQlpbnQga2V5X25pZCwgY2hhciAqcGFzcyk7CitpbnQgUEtDUzEyX2FkZF9zYWZlKFNUQUNLX09GKFBLQ1M3KSAqKnBzYWZlcywgU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzLAorCQkJCQlpbnQgc2FmZV9uaWQsIGludCBpdGVyLCBjaGFyICpwYXNzKTsKK1BLQ1MxMiAqUEtDUzEyX2FkZF9zYWZlcyhTVEFDS19PRihQS0NTNykgKnNhZmVzLCBpbnQgcDdfbmlkKTsKKworaW50IGkyZF9QS0NTMTJfYmlvKEJJTyAqYnAsIFBLQ1MxMiAqcDEyKTsKK2ludCBpMmRfUEtDUzEyX2ZwKEZJTEUgKmZwLCBQS0NTMTIgKnAxMik7CitQS0NTMTIgKmQyaV9QS0NTMTJfYmlvKEJJTyAqYnAsIFBLQ1MxMiAqKnAxMik7CitQS0NTMTIgKmQyaV9QS0NTMTJfZnAoRklMRSAqZnAsIFBLQ1MxMiAqKnAxMik7CitpbnQgUEtDUzEyX25ld3Bhc3MoUEtDUzEyICpwMTIsIGNoYXIgKm9sZHBhc3MsIGNoYXIgKm5ld3Bhc3MpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1BLQ1MxMl9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIFBLQ1MxMiBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBQS0NTMTJfRl9QQVJTRV9CQUcJCQkJIDEyOQorI2RlZmluZSBQS0NTMTJfRl9QQVJTRV9CQUdTCQkJCSAxMDMKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0FERF9GUklFTkRMWU5BTUUJCSAxMDAKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0FERF9GUklFTkRMWU5BTUVfQVNDCQkgMTI3CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9BRERfRlJJRU5ETFlOQU1FX1VOSQkJIDEwMgorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfQUREX0xPQ0FMS0VZSUQJCQkgMTA0CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9DUkVBVEUJCQkJIDEwNQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfR0VOX01BQwkJCQkgMTA3CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9JTklUCQkJCSAxMDkKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0lURU1fREVDUllQVF9EMkkJCSAxMDYKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0lURU1fSTJEX0VOQ1JZUFQJCSAxMDgKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0lURU1fUEFDS19TQUZFQkFHCQkgMTE3CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9LRVlfR0VOX0FTQwkJCSAxMTAKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0tFWV9HRU5fVU5JCQkJIDExMQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfTUFLRV9LRVlCQUcJCQkgMTEyCisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9NQUtFX1NIS0VZQkFHCQkJIDExMworI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfTkVXUEFTUwkJCQkgMTI4CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9QQUNLX1A3REFUQQkJCSAxMTQKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX1BBQ0tfUDdFTkNEQVRBCQkJIDExNQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfUEFSU0UJCQkJIDExOAorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfUEJFX0NSWVBUCQkJIDExOQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfUEJFX0tFWUlWR0VOCQkJIDEyMAorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfU0VUVVBfTUFDCQkJIDEyMgorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfU0VUX01BQwkJCQkgMTIzCisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9VTlBBQ0tfQVVUSFNBRkVTCQkgMTMwCisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9VTlBBQ0tfUDdEQVRBCQkJIDEzMQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfVkVSSUZZX01BQwkJCSAxMjYKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzhfQUREX0tFWVVTQUdFCQkJIDEyNAorI2RlZmluZSBQS0NTMTJfRl9QS0NTOF9FTkNSWVBUCQkJCSAxMjUKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBQS0NTMTJfUl9DQU5UX1BBQ0tfU1RSVUNUVVJFCQkJIDEwMAorI2RlZmluZSBQS0NTMTJfUl9DT05URU5UX1RZUEVfTk9UX0RBVEEJCQkgMTIxCisjZGVmaW5lIFBLQ1MxMl9SX0RFQ09ERV9FUlJPUgkJCQkgMTAxCisjZGVmaW5lIFBLQ1MxMl9SX0VOQ09ERV9FUlJPUgkJCQkgMTAyCisjZGVmaW5lIFBLQ1MxMl9SX0VOQ1JZUFRfRVJST1IJCQkJIDEwMworI2RlZmluZSBQS0NTMTJfUl9FUlJPUl9TRVRUSU5HX0VOQ1JZUFRFRF9EQVRBX1RZUEUJIDEyMAorI2RlZmluZSBQS0NTMTJfUl9JTlZBTElEX05VTExfQVJHVU1FTlQJCQkgMTA0CisjZGVmaW5lIFBLQ1MxMl9SX0lOVkFMSURfTlVMTF9QS0NTMTJfUE9JTlRFUgkJIDEwNQorI2RlZmluZSBQS0NTMTJfUl9JVl9HRU5fRVJST1IJCQkJIDEwNgorI2RlZmluZSBQS0NTMTJfUl9LRVlfR0VOX0VSUk9SCQkJCSAxMDcKKyNkZWZpbmUgUEtDUzEyX1JfTUFDX0FCU0VOVAkJCQkgMTA4CisjZGVmaW5lIFBLQ1MxMl9SX01BQ19HRU5FUkFUSU9OX0VSUk9SCQkJIDEwOQorI2RlZmluZSBQS0NTMTJfUl9NQUNfU0VUVVBfRVJST1IJCQkgMTEwCisjZGVmaW5lIFBLQ1MxMl9SX01BQ19TVFJJTkdfU0VUX0VSUk9SCQkJIDExMQorI2RlZmluZSBQS0NTMTJfUl9NQUNfVkVSSUZZX0VSUk9SCQkJIDExMgorI2RlZmluZSBQS0NTMTJfUl9NQUNfVkVSSUZZX0ZBSUxVUkUJCQkgMTEzCisjZGVmaW5lIFBLQ1MxMl9SX1BBUlNFX0VSUk9SCQkJCSAxMTQKKyNkZWZpbmUgUEtDUzEyX1JfUEtDUzEyX0FMR09SX0NJUEhFUklOSVRfRVJST1IJCSAxMTUKKyNkZWZpbmUgUEtDUzEyX1JfUEtDUzEyX0NJUEhFUkZJTkFMX0VSUk9SCQkgMTE2CisjZGVmaW5lIFBLQ1MxMl9SX1BLQ1MxMl9QQkVfQ1JZUFRfRVJST1IJCQkgMTE3CisjZGVmaW5lIFBLQ1MxMl9SX1VOS05PV05fRElHRVNUX0FMR09SSVRITQkJIDExOAorI2RlZmluZSBQS0NTMTJfUl9VTlNVUFBPUlRFRF9QS0NTMTJfTU9ERQkJIDExOQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2Jpb19iZXIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9iaW9fYmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5NzNmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9iaW9fYmVyLmMKQEAgLTAsMCArMSw0NjYgQEAKKy8qIGNyeXB0by9ldnAvYmlvX2Jlci5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKK3N0YXRpYyBpbnQgYmVyX3dyaXRlKEJJTyAqaCxjaGFyICpidWYsaW50IG51bSk7CitzdGF0aWMgaW50IGJlcl9yZWFkKEJJTyAqaCxjaGFyICpidWYsaW50IHNpemUpOworLypzdGF0aWMgaW50IGJlcl9wdXRzKEJJTyAqaCxjaGFyICpzdHIpOyAqLworLypzdGF0aWMgaW50IGJlcl9nZXRzKEJJTyAqaCxjaGFyICpzdHIsaW50IHNpemUpOyAqLworc3RhdGljIGxvbmcgYmVyX2N0cmwoQklPICpoLGludCBjbWQsbG9uZyBhcmcxLGNoYXIgKmFyZzIpOworc3RhdGljIGludCBiZXJfbmV3KEJJTyAqaCk7CitzdGF0aWMgaW50IGJlcl9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgbG9uZyBiZXJfY2FsbGJhY2tfY3RybChCSU8gKmgsaW50IGNtZCx2b2lkICooKmZwKSgpKTsKKyNkZWZpbmUgQkVSX0JVRl9TSVpFCSgzMikKKworLyogVGhpcyBpcyB1c2VkIHRvIGhvbGQgdGhlIHN0YXRlIG9mIHRoZSBCRVIgb2JqZWN0cyBiZWluZyByZWFkLiAqLwordHlwZWRlZiBzdHJ1Y3QgYmVyX3N0cnVjdAorCXsKKwlpbnQgdGFnOworCWludCBjbGFzczsKKwlsb25nIGxlbmd0aDsKKwlpbnQgaW5mOworCWludCBudW1fbGVmdDsKKwlpbnQgZGVwdGg7CisJfSBCRVJfQ1RYOworCit0eXBlZGVmIHN0cnVjdCBiaW9fYmVyX3N0cnVjdAorCXsKKwlpbnQgdGFnOworCWludCBjbGFzczsKKwlsb25nIGxlbmd0aDsKKwlpbnQgaW5mOworCisJLyogbW9zdCBvZiB0aGUgZm9sbG93aW5nIGFyZSB1c2VkIHdoZW4gZG9pbmcgbm9uLWJsb2NraW5nIElPICovCisJLyogcmVhZGluZyAqLworCWxvbmcgbnVtX2xlZnQ7CS8qIG51bWJlciBvZiBieXRlcyBzdGlsbCB0byByZWFkL3dyaXRlIGluIGJsb2NrICovCisJaW50IGRlcHRoOwkvKiB1c2VkIHdpdGggaW5kZWZpbml0ZSBlbmNvZGluZy4gKi8KKwlpbnQgZmluaXNoZWQ7CS8qIE5vIG1vcmUgcmVhZCBkYXRhICovCisKKwkvKiB3cml0dGluZyAqLyAKKwljaGFyICp3X2FkZHI7CisJaW50IHdfb2Zmc2V0OworCWludCB3X2xlZnQ7CisKKwlpbnQgYnVmX2xlbjsKKwlpbnQgYnVmX29mZjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltCRVJfQlVGX1NJWkVdOworCX0gQklPX0JFUl9DVFg7CisKK3N0YXRpYyBCSU9fTUVUSE9EIG1ldGhvZHNfYmVyPQorCXsKKwlCSU9fVFlQRV9DSVBIRVIsImNpcGhlciIsCisJYmVyX3dyaXRlLAorCWJlcl9yZWFkLAorCU5VTEwsIC8qIGJlcl9wdXRzLCAqLworCU5VTEwsIC8qIGJlcl9nZXRzLCAqLworCWJlcl9jdHJsLAorCWJlcl9uZXcsCisJYmVyX2ZyZWUsCisJYmVyX2NhbGxiYWNrX2N0cmwsCisJfTsKKworQklPX01FVEhPRCAqQklPX2ZfYmVyKHZvaWQpCisJeworCXJldHVybigmbWV0aG9kc19iZXIpOworCX0KKworc3RhdGljIGludCBiZXJfbmV3KEJJTyAqYmkpCisJeworCUJJT19CRVJfQ1RYICpjdHg7CisKKwljdHg9KEJJT19CRVJfQ1RYICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJJT19CRVJfQ1RYKSk7CisJaWYgKGN0eCA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwltZW1zZXQoKGNoYXIgKiljdHgsMCxzaXplb2YoQklPX0JFUl9DVFgpKTsKKworCWJpLT5pbml0PTA7CisJYmktPnB0cj0oY2hhciAqKWN0eDsKKwliaS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IGJlcl9mcmVlKEJJTyAqYSkKKwl7CisJQklPX0JFUl9DVFggKmI7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCk7CisJYj0oQklPX0JFUl9DVFggKilhLT5wdHI7CisJT1BFTlNTTF9jbGVhbnNlKGEtPnB0cixzaXplb2YoQklPX0JFUl9DVFgpKTsKKwlPUEVOU1NMX2ZyZWUoYS0+cHRyKTsKKwlhLT5wdHI9TlVMTDsKKwlhLT5pbml0PTA7CisJYS0+ZmxhZ3M9MDsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgYmlvX2Jlcl9nZXRfaGVhZGVyKEJJTyAqYmlvLCBCSU9fQkVSX0NUWCAqY3R4KQorCXsKKwljaGFyIGJ1Zls2NF07CisJaW50IGksaixuOworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aAorCWludCB0YWc7CisJaW50IGNsYXNzOworCWxvbmcgbWF4OworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCisJLyogUGFjayB0aGUgYnVmZmVyIGRvd24gaWYgdGhlcmUgaXMgYSBob2xlIGF0IHRoZSBmcm9udCAqLworCWlmIChjdHgtPmJ1Zl9vZmYgIT0gMCkKKwkJeworCQlwPWN0eC0+YnVmOworCQlqPWN0eC0+YnVmX29mZjsKKwkJbj1jdHgtPmJ1Zl9sZW4tajsKKwkJZm9yIChpPTA7IGk8bjsgaSsrKQorCQkJeworCQkJcFswXT1wW2pdOworCQkJcCsrOworCQkJfQorCQljdHgtPmJ1Zl9sZW4tajsKKwkJY3R4LT5idWZfb2ZmPTA7CisJCX0KKworCS8qIElmIHRoZXJlIGlzIG1vcmUgcm9vbSwgcmVhZCBzb21lIG1vcmUgZGF0YSAqLworCWk9QkVSX0JVRl9TSVpFLWN0eC0+YnVmX2xlbjsKKwlpZiAoaSkKKwkJeworCQlpPUJJT19yZWFkKGJpby0+bmV4dF9iaW8sJihjdHgtPmJ1ZltjdHgtPmJ1Zl9sZW5dKSxpKTsKKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCQlyZXR1cm4oaSk7CisJCQl9CisJCWVsc2UKKwkJCWN0eC0+YnVmX2xlbis9aTsKKwkJfQorCisJbWF4PWN0eC0+YnVmX2xlbjsKKwlwPWN0eC0+YnVmOworCXJldD1BU04xX2dldF9vYmplY3QoJnAsJmxlbmd0aCwmdGFnLCZjbGFzcyxtYXgpOworCisJaWYgKHJldCAmIDB4ODApCisJCXsKKwkJaWYgKChjdHgtPmJ1Zl9sZW4gPCBCRVJfQlVGX1NJWkUpICYmCisJCQkoRVJSX0dFVF9SRUFTT04oRVJSX3BlZWtfZXJyb3IoKSkgPT0gQVNOMV9SX1RPT19MT05HKSkKKwkJCXsKKwkJCUVSUl9jbGVhcl9lcnJvcigpOyAvKiBjbGVhciB0aGUgZXJyb3IgKi8KKwkJCUJJT19zZXRfcmV0cnlfcmVhZChiKTsKKwkJCX0KKwkJcmV0dXJuKC0xKTsKKwkJfQorCisJLyogV2UgaGF2ZSBubyBlcnJvciwgd2UgaGF2ZSBhIGhlYWRlciwgc28gbWFrZSB1c2Ugb2YgaXQgKi8KKworCWlmICgoY3R4LT50YWcgID49IDApICYmIChjdHgtPnRhZyAhPSB0YWcpKQorCQl7CisJCUJJT2VycihCSU9fRl9CSU9fQkVSX0dFVF9IRUFERVIsQklPX1JfVEFHX01JU01BVENIKTsKKwkJc3ByaW50ZihidWYsInRhZz0lZCwgZ290ICVkIixjdHgtPnRhZyx0YWcpOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoMSxidWYpOworCQlyZXR1cm4oLTEpOworCQl9CisJaWYgKHJldCAmIDB4MDEpCisJaWYgKHJldCAmIFZfQVNOMV9DT05TVFJVQ1RFRCkKKwl9CisJCitzdGF0aWMgaW50IGJlcl9yZWFkKEJJTyAqYiwgY2hhciAqb3V0LCBpbnQgb3V0bCkKKwl7CisJaW50IHJldD0wLGksbjsKKwlCSU9fQkVSX0NUWCAqY3R4OworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCisJaWYgKG91dCA9PSBOVUxMKSByZXR1cm4oMCk7CisJY3R4PShCSU9fQkVSX0NUWCAqKWItPnB0cjsKKworCWlmICgoY3R4ID09IE5VTEwpIHx8IChiLT5uZXh0X2JpbyA9PSBOVUxMKSkgcmV0dXJuKDApOworCisJaWYgKGN0eC0+ZmluaXNoZWQpIHJldHVybigwKTsKKworYWdhaW46CisJLyogRmlyc3Qgc2VlIGlmIHdlIGFyZSBoYWxmIHdheSB0aHJvdWdoIHJlYWRpbmcgYSBibG9jayAqLworCWlmIChjdHgtPm51bV9sZWZ0ID4gMCkKKwkJeworCQlpZiAoY3R4LT5udW1fbGVmdCA8IG91dGwpCisJCQluPWN0eC0+bnVtX2xlZnQ7CisJCWVsc2UKKwkJCW49b3V0bDsKKwkJaT1CSU9fcmVhZChiLT5uZXh0X2JpbyxvdXQsbik7CisJCWlmIChpIDw9IDApCisJCQl7CisJCQlCSU9fY29weV9uZXh0X3JldHJ5KGIpOworCQkJcmV0dXJuKGkpOworCQkJfQorCQljdHgtPm51bV9sZWZ0LT1pOworCQlvdXRsLT1pOworCQlyZXQrPWk7CisJCWlmIChjdHgtPm51bV9sZWZ0IDw9IDApCisJCQl7CisJCQljdHgtPmRlcHRoLS07CisJCQlpZiAoY3R4LT5kZXB0aCA8PSAwKQorCQkJCWN0eC0+ZmluaXNoZWQ9MTsKKwkJCX0KKwkJaWYgKG91dGwgPD0gMCkKKwkJCXJldHVybihyZXQpOworCQllbHNlCisJCQlnb3RvIGFnYWluOworCQl9CisJZWxzZQkvKiB3ZSBuZWVkIHRvIHJlYWQgYW5vdGhlciBCRVIgaGVhZGVyICovCisJCXsKKwkJfQorCX0KKworc3RhdGljIGludCBiZXJfd3JpdGUoQklPICpiLCBjaGFyICppbiwgaW50IGlubCkKKwl7CisJaW50IHJldD0wLG4saTsKKwlCSU9fRU5DX0NUWCAqY3R4OworCisJY3R4PShCSU9fRU5DX0NUWCAqKWItPnB0cjsKKwlyZXQ9aW5sOworCisJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCW49Y3R4LT5idWZfbGVuLWN0eC0+YnVmX29mZjsKKwl3aGlsZSAobiA+IDApCisJCXsKKwkJaT1CSU9fd3JpdGUoYi0+bmV4dF9iaW8sJihjdHgtPmJ1ZltjdHgtPmJ1Zl9vZmZdKSxuKTsKKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCQlyZXR1cm4oaSk7CisJCQl9CisJCWN0eC0+YnVmX29mZis9aTsKKwkJbi09aTsKKwkJfQorCS8qIGF0IHRoaXMgcG9pbnQgYWxsIHBlbmRpbmcgZGF0YSBoYXMgYmVlbiB3cml0dGVuICovCisKKwlpZiAoKGluID09IE5VTEwpIHx8IChpbmwgPD0gMCkpIHJldHVybigwKTsKKworCWN0eC0+YnVmX29mZj0wOworCXdoaWxlIChpbmwgPiAwKQorCQl7CisJCW49KGlubCA+IEVOQ19CTE9DS19TSVpFKT9FTkNfQkxPQ0tfU0laRTppbmw7CisJCUVWUF9DaXBoZXJVcGRhdGUoJihjdHgtPmNpcGhlciksCisJCQkodW5zaWduZWQgY2hhciAqKWN0eC0+YnVmLCZjdHgtPmJ1Zl9sZW4sCisJCQkodW5zaWduZWQgY2hhciAqKWluLG4pOworCQlpbmwtPW47CisJCWluKz1uOworCisJCWN0eC0+YnVmX29mZj0wOworCQluPWN0eC0+YnVmX2xlbjsKKwkJd2hpbGUgKG4gPiAwKQorCQkJeworCQkJaT1CSU9fd3JpdGUoYi0+bmV4dF9iaW8sJihjdHgtPmJ1ZltjdHgtPmJ1Zl9vZmZdKSxuKTsKKwkJCWlmIChpIDw9IDApCisJCQkJeworCQkJCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJCQkJcmV0dXJuKGkpOworCQkJCX0KKwkJCW4tPWk7CisJCQljdHgtPmJ1Zl9vZmYrPWk7CisJCQl9CisJCWN0eC0+YnVmX2xlbj0wOworCQljdHgtPmJ1Zl9vZmY9MDsKKwkJfQorCUJJT19jb3B5X25leHRfcmV0cnkoYik7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgbG9uZyBiZXJfY3RybChCSU8gKmIsIGludCBjbWQsIGxvbmcgbnVtLCBjaGFyICpwdHIpCisJeworCUJJTyAqZGJpbzsKKwlCSU9fRU5DX0NUWCAqY3R4LCpkY3R4OworCWxvbmcgcmV0PTE7CisJaW50IGk7CisKKwljdHg9KEJJT19FTkNfQ1RYICopYi0+cHRyOworCisJc3dpdGNoIChjbWQpCisJCXsKKwljYXNlIEJJT19DVFJMX1JFU0VUOgorCQljdHgtPm9rPTE7CisJCWN0eC0+ZmluaXNoZWQ9MDsKKwkJRVZQX0NpcGhlckluaXRfZXgoJihjdHgtPmNpcGhlciksTlVMTCxOVUxMLE5VTEwsTlVMTCwKKwkJCWN0eC0+Y2lwaGVyLmJlcnJ5cHQpOworCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0VPRjoJLyogTW9yZSB0byByZWFkICovCisJCWlmIChjdHgtPmNvbnQgPD0gMCkKKwkJCXJldD0xOworCQllbHNlCisJCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1dQRU5ESU5HOgorCQlyZXQ9Y3R4LT5idWZfbGVuLWN0eC0+YnVmX29mZjsKKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9QRU5ESU5HOiAvKiBNb3JlIHRvIHJlYWQgaW4gYnVmZmVyICovCisJCXJldD1jdHgtPmJ1Zl9sZW4tY3R4LT5idWZfb2ZmOworCQlpZiAocmV0IDw9IDApCisJCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0ZMVVNIOgorCQkvKiBkbyBhIGZpbmFsIHdyaXRlICovCithZ2FpbjoKKwkJd2hpbGUgKGN0eC0+YnVmX2xlbiAhPSBjdHgtPmJ1Zl9vZmYpCisJCQl7CisJCQlpPWJlcl93cml0ZShiLE5VTEwsMCk7CisJCQlpZiAoaSA8IDApCisJCQkJeworCQkJCXJldD1pOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQlpZiAoIWN0eC0+ZmluaXNoZWQpCisJCQl7CisJCQljdHgtPmZpbmlzaGVkPTE7CisJCQljdHgtPmJ1Zl9vZmY9MDsKKwkJCXJldD1FVlBfQ2lwaGVyRmluYWxfZXgoJihjdHgtPmNpcGhlciksCisJCQkJKHVuc2lnbmVkIGNoYXIgKiljdHgtPmJ1ZiwKKwkJCQkmKGN0eC0+YnVmX2xlbikpOworCQkJY3R4LT5vaz0oaW50KXJldDsKKwkJCWlmIChyZXQgPD0gMCkgYnJlYWs7CisKKwkJCS8qIHB1c2ggb3V0IHRoZSBieXRlcyAqLworCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCisJCS8qIEZpbmFsbHkgZmx1c2ggdGhlIHVuZGVybHlpbmcgQklPICovCisJCXJldD1CSU9fY3RybChiLT5uZXh0X2JpbyxjbWQsbnVtLHB0cik7CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX0NJUEhFUl9TVEFUVVM6CisJCXJldD0obG9uZyljdHgtPm9rOworCQlicmVhazsKKwljYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6CisJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKwkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJYnJlYWs7CisKKwljYXNlIEJJT19DVFJMX0RVUDoKKwkJZGJpbz0oQklPICopcHRyOworCQlkY3R4PShCSU9fRU5DX0NUWCAqKWRiaW8tPnB0cjsKKwkJbWVtY3B5KCYoZGN0eC0+Y2lwaGVyKSwmKGN0eC0+Y2lwaGVyKSxzaXplb2YoY3R4LT5jaXBoZXIpKTsKKwkJZGJpby0+aW5pdD0xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2N0cmwoYi0+bmV4dF9iaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGxvbmcgYmVyX2NhbGxiYWNrX2N0cmwoQklPICpiLCBpbnQgY21kLCB2b2lkICooKmZwKSgpKQorCXsKKwlsb25nIHJldD0xOworCisJaWYgKGItPm5leHRfYmlvID09IE5VTEwpIHJldHVybigwKTsKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWRlZmF1bHQ6CisJCXJldD1CSU9fY2FsbGJhY2tfY3RybChiLT5uZXh0X2JpbyxjbWQsZnApOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworLyoKK3ZvaWQgQklPX3NldF9jaXBoZXJfY3R4KGIsYykKK0JJTyAqYjsKK0VWUF9DSVBIRVJfY3R4ICpjOworCXsKKwlpZiAoYiA9PSBOVUxMKSByZXR1cm47CisKKwlpZiAoKGItPmNhbGxiYWNrICE9IE5VTEwpICYmCisJCShiLT5jYWxsYmFjayhiLEJJT19DQl9DVFJMLChjaGFyICopYyxCSU9fQ1RSTF9TRVQsZSwwTCkgPD0gMCkpCisJCXJldHVybjsKKworCWItPmluaXQ9MTsKKwljdHg9KEJJT19FTkNfQ1RYICopYi0+cHRyOworCW1lbWNweShjdHgtPmNpcGhlcixjLHNpemVvZihFVlBfQ0lQSEVSX0NUWCkpOworCQorCWlmIChiLT5jYWxsYmFjayAhPSBOVUxMKQorCQliLT5jYWxsYmFjayhiLEJJT19DQl9DVFJMLChjaGFyICopYyxCSU9fQ1RSTF9TRVQsZSwxTCk7CisJfQorKi8KKwordm9pZCBCSU9fc2V0X2NpcGhlcihCSU8gKmIsIEVWUF9DSVBIRVIgKmMsIHVuc2lnbmVkIGNoYXIgKmssIHVuc2lnbmVkIGNoYXIgKmksCisJICAgICBpbnQgZSkKKwl7CisJQklPX0VOQ19DVFggKmN0eDsKKworCWlmIChiID09IE5VTEwpIHJldHVybjsKKworCWlmICgoYi0+Y2FsbGJhY2sgIT0gTlVMTCkgJiYKKwkJKGItPmNhbGxiYWNrKGIsQklPX0NCX0NUUkwsKGNoYXIgKiljLEJJT19DVFJMX1NFVCxlLDBMKSA8PSAwKSkKKwkJcmV0dXJuOworCisJYi0+aW5pdD0xOworCWN0eD0oQklPX0VOQ19DVFggKiliLT5wdHI7CisJRVZQX0NpcGhlckluaXRfZXgoJihjdHgtPmNpcGhlciksYyxOVUxMLGssaSxlKTsKKwkKKwlpZiAoYi0+Y2FsbGJhY2sgIT0gTlVMTCkKKwkJYi0+Y2FsbGJhY2soYixCSU9fQ0JfQ1RSTCwoY2hhciAqKWMsQklPX0NUUkxfU0VULGUsMUwpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2RlYy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTJlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvZGVjLmMKQEAgLTAsMCArMSwyNDggQEAKKy8qIGNyeXB0by9wa2NzNy92ZXJpZnkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKK2ludCB2ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KTsKKworQklPICpiaW9fZXJyPU5VTEw7CisKK2ludCBtYWluKGFyZ2MsYXJndikKK2ludCBhcmdjOworY2hhciAqYXJndltdOworCXsKKwljaGFyICprZXlmaWxlPU5VTEw7CisJQklPICppbjsKKwlFVlBfUEtFWSAqcGtleTsKKwlYNTA5ICp4NTA5OworCVBLQ1M3ICpwNzsKKwlQS0NTN19TSUdORVJfSU5GTyAqc2k7CisJWDUwOV9TVE9SRV9DVFggY2VydF9jdHg7CisJWDUwOV9TVE9SRSAqY2VydF9zdG9yZT1OVUxMOworCUJJTyAqZGF0YSwqZGV0YWNoZWQ9TlVMTCwqcDdiaW89TlVMTDsKKwljaGFyIGJ1ZlsxMDI0KjRdOworCXVuc2lnbmVkIGNoYXIgKnBwOworCWludCBpLHByaW50aXQ9MDsKKwlTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykgKnNrOworCisJT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKTsKKwliaW9fZXJyPUJJT19uZXdfZnAoc3RkZXJyLEJJT19OT0NMT1NFKTsKKworCWRhdGE9QklPX25ldyhCSU9fc19maWxlKCkpOworCXBwPU5VTEw7CisJd2hpbGUgKGFyZ2MgPiAxKQorCQl7CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQlpZiAoc3RyY21wKGFyZ3ZbMF0sIi1wIikgPT0gMCkKKwkJCXsKKwkJCXByaW50aXQ9MTsKKwkJCX0KKwkJZWxzZSBpZiAoKHN0cmNtcChhcmd2WzBdLCItayIpID09IDApICYmIChhcmdjID49IDIpKSB7CisJCQlrZXlmaWxlID0gYXJndlsxXTsKKwkJCWFyZ2MtPTE7CisJCQlhcmd2Kz0xOworCQl9IGVsc2UgaWYgKChzdHJjbXAoYXJndlswXSwiLWQiKSA9PSAwKSAmJiAoYXJnYyA+PSAyKSkKKwkJCXsKKwkJCWRldGFjaGVkPUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwkJCWlmICghQklPX3JlYWRfZmlsZW5hbWUoZGV0YWNoZWQsYXJndlsxXSkpCisJCQkJZ290byBlcnI7CisJCQlhcmdjLT0xOworCQkJYXJndis9MTsKKwkJCX0KKwkJZWxzZSBicmVhazsKKwkJfQorCisJIGlmICghQklPX3JlYWRfZmlsZW5hbWUoZGF0YSxhcmd2WzBdKSkgZ290byBlcnI7IAorCisJaWYoIWtleWZpbGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJObyBwcml2YXRlIGtleSBmaWxlIHNwZWNpZmllZFxuIik7CisJCWdvdG8gZXJyOworCX0KKworICAgICAgICBpZiAoKGluPUJJT19uZXdfZmlsZShrZXlmaWxlLCJyIikpID09IE5VTEwpIGdvdG8gZXJyOworICAgICAgICBpZiAoKHg1MDk9UEVNX3JlYWRfYmlvX1g1MDkoaW4sTlVMTCxOVUxMLE5VTEwpKSA9PSBOVUxMKSBnb3RvIGVycjsKKyAgICAgICAgQklPX3Jlc2V0KGluKTsKKyAgICAgICAgaWYgKChwa2V5PVBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGluLE5VTEwsTlVMTCxOVUxMKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisgICAgICAgIEJJT19mcmVlKGluKTsKKworCWlmIChwcCA9PSBOVUxMKQorCQlCSU9fc2V0X2ZwKGRhdGEsc3RkaW4sQklPX05PQ0xPU0UpOworCisKKwkvKiBMb2FkIHRoZSBQS0NTNyBvYmplY3QgZnJvbSBhIGZpbGUgKi8KKwlpZiAoKHA3PVBFTV9yZWFkX2Jpb19QS0NTNyhkYXRhLE5VTEwsTlVMTCxOVUxMKSkgPT0gTlVMTCkgZ290byBlcnI7CisKKworCisJLyogVGhpcyBzdHVmZiBpcyBiZWluZyBzZXR1cCBmb3IgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLgorCSAqIFdoZW4gdXNpbmcgU1NMLCBpdCBjb3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgCisJICogY2VydF9zdHJlPVNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoc3NsX2N0eCk7ICovCisJY2VydF9zdG9yZT1YNTA5X1NUT1JFX25ldygpOworCVg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoY2VydF9zdG9yZSk7CisJWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjZXJ0X3N0b3JlLE5VTEwsIi4uLy4uL2NlcnRzIik7CisJWDUwOV9TVE9SRV9zZXRfdmVyaWZ5X2NiX2Z1bmMoY2VydF9zdG9yZSx2ZXJpZnlfY2FsbGJhY2spOworCisJRVJSX2NsZWFyX2Vycm9yKCk7CisKKwkvKiBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIGRhdGEgKi8KKwkvKiBXZSBjYW5ub3Qgc3VwcG9ydCBkZXRhY2hlZCBlbmNyeXB0aW9uICovCisJcDdiaW89UEtDUzdfZGF0YURlY29kZShwNyxwa2V5LGRldGFjaGVkLHg1MDkpOworCisJaWYgKHA3YmlvID09IE5VTEwpCisJCXsKKwkJcHJpbnRmKCJwcm9ibGVtcyBkZWNvZGluZ1xuIik7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBXZSBub3cgaGF2ZSB0byAncmVhZCcgZnJvbSBwN2JpbyB0byBjYWxjdWxhdGUgZGlnZXN0cyBldGMuICovCisJZm9yICg7OykKKwkJeworCQlpPUJJT19yZWFkKHA3YmlvLGJ1ZixzaXplb2YoYnVmKSk7CisJCS8qIHByaW50IGl0PyAqLworCQlpZiAoaSA8PSAwKSBicmVhazsKKwkJZndyaXRlKGJ1ZiwxLCBpLCBzdGRvdXQpOworCQl9CisKKwkvKiBXZSBjYW4gbm93IHZlcmlmeSBzaWduYXR1cmVzICovCisJc2s9UEtDUzdfZ2V0X3NpZ25lcl9pbmZvKHA3KTsKKwlpZiAoc2sgPT0gTlVMTCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwgInRoZXJlIGFyZSBubyBzaWduYXR1cmVzIG9uIHRoaXMgZGF0YVxuIik7CisJCX0KKwllbHNlCisJCXsKKwkJLyogT2ssIGZpcnN0IHdlIG5lZWQgdG8sIGZvciBlYWNoIHN1YmplY3QgZW50cnksCisJCSAqIHNlZSBpZiB3ZSBjYW4gdmVyaWZ5ICovCisJCUVSUl9jbGVhcl9lcnJvcigpOworCQlmb3IgKGk9MDsgaTxza19QS0NTN19TSUdORVJfSU5GT19udW0oc2spOyBpKyspCisJCQl7CisJCQlzaT1za19QS0NTN19TSUdORVJfSU5GT192YWx1ZShzayxpKTsKKwkJCWk9UEtDUzdfZGF0YVZlcmlmeShjZXJ0X3N0b3JlLCZjZXJ0X2N0eCxwN2JpbyxwNyxzaSk7CisJCQlpZiAoaSA8PSAwKQorCQkJCWdvdG8gZXJyOworCQkJZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLCJTaWduYXR1cmUgdmVyaWZpZWRcbiIpOworCQkJfQorCQl9CisJWDUwOV9TVE9SRV9mcmVlKGNlcnRfc3RvcmUpOworCisJZXhpdCgwKTsKK2VycjoKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCUVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKwlleGl0KDEpOworCX0KKworLyogc2hvdWxkIGJlIFg1MDkgKiBidXQgd2UgY2FuIGp1c3QgaGF2ZSB0aGVtIGFzIGNoYXIgKi4gKi8KK2ludCB2ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwljaGFyIGJ1ZlsyNTZdOworCVg1MDkgKmVycl9jZXJ0OworCWludCBlcnIsZGVwdGg7CisKKwllcnJfY2VydD1YNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KGN0eCk7CisJZXJyPQlYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoY3R4KTsKKwlkZXB0aD0JWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKGN0eCk7CisKKwlYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoZXJyX2NlcnQpLGJ1ZiwyNTYpOworCUJJT19wcmludGYoYmlvX2VyciwiZGVwdGg9JWQgJXNcbiIsZGVwdGgsYnVmKTsKKwlpZiAoIW9rKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IGVycm9yOm51bT0lZDolc1xuIixlcnIsCisJCQlYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpKTsKKwkJaWYgKGRlcHRoIDwgNikKKwkJCXsKKwkJCW9rPTE7CisJCQlYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY3R4LFg1MDlfVl9PSyk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW9rPTA7CisJCQlYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY3R4LFg1MDlfVl9FUlJfQ0VSVF9DSEFJTl9UT09fTE9ORyk7CisJCQl9CisJCX0KKwlzd2l0Y2ggKGN0eC0+ZXJyb3IpCisJCXsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVDoKKwkJWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUoY3R4LT5jdXJyZW50X2NlcnQpLGJ1ZiwyNTYpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsImlzc3Vlcj0gJXNcbiIsYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfTk9UX1lFVF9WQUxJRDoKKwljYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVGT1JFX0ZJRUxEOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vdEJlZm9yZT0iKTsKKwkJQVNOMV9VVENUSU1FX3ByaW50KGJpb19lcnIsWDUwOV9nZXRfbm90QmVmb3JlKGN0eC0+Y3VycmVudF9jZXJ0KSk7CisJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQ6CisJY2FzZSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxEOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vdEFmdGVyPSIpOworCQlBU04xX1VUQ1RJTUVfcHJpbnQoYmlvX2VycixYNTA5X2dldF9ub3RBZnRlcihjdHgtPmN1cnJlbnRfY2VydCkpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuIik7CisJCWJyZWFrOworCQl9CisJQklPX3ByaW50ZihiaW9fZXJyLCJ2ZXJpZnkgcmV0dXJuOiVkXG4iLG9rKTsKKwlyZXR1cm4ob2spOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9kZXMucGVtIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2Rlcy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkMTY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9kZXMucGVtCkBAIC0wLDAgKzEsMTUgQEAKKworTUlBR0NTcUdTSWIzRFFFSEE2Q0FNSUFDQVFBeGdnSG1NSUh3QWdFQU1JR1pNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHCitBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERVJNQThHQTFVRUJ4TUlRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW0KK2RDQlFkSGtnVEhSa01TSXdJQVlEVlFRTEV4bEVSVTFQVGxOVVVrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRRAorRXhKRVJVMVBJRnBGVWs4Z1ZrRk1WVVVnUTBFQ0FnUitNQTBHQ1NxR1NJYjNEUUVCQVFVQUJFQzJ2WEkxeFFEVzZsVUhNM3pRCisvOXVCRUJPTzVBM1R0a3JrbEFYcTd2MDFnc0lDMjF0NTJxU2szNlJFWFkrc2xoTlowT1EzNDl0Z2tUc29FVEhGTG9Fd01JSHcKK0FnRUFNSUdaTUlHU01Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQk1LVVhWbFpXNXpiR0Z1WkRFUk1BOEdBMVVFQnhNSQorUW5KcGMySmhibVV4R2pBWUJnTlZCQW9URVVOeWVYQjBjMjltZENCUWRIa2dUSFJrTVNJd0lBWURWUVFMRXhsRVJVMVBUbE5VCitVa0ZVU1U5T0lFRk9SQ0JVUlZOVVNVNUhNUnN3R1FZRFZRUURFeEpFUlUxUElGcEZVazhnVmtGTVZVVWdRMEVDQWdSOU1BMEcKK0NTcUdTSWIzRFFFQkFRVUFCRUI4dWp4YmFieFhVWUpob3B1RG0zb0RxNEpOcVg2SW80cDNybytTaHFmSW5kc1hUWjF2NWEyTgorV3RMTENXbEhuL2hhYmpCd1ovRGdRZ2NLQVNiWjdReE5NSUFHQ1NxR1NJYjNEUUVIQVRBYUJnZ3Foa2lHOXcwREFqQU9BZ0lBCitvQVFJYnNMNXYxd1g5OEtnZ0FRb0FhSjRXSG02OGZYWTFXRTVPSWpmVkJJRHBPMUsraThkbUtoam5BanJqb3laOUJ3YzhyREwKK2xnUWc0Q1hiODA1aDV4bCtHZnZTd1VhSEpheXRlMW0ybWNPaHMzSjJZeXFiUStNRUlNSWlKUWNjbWhPM29ES20zNkNGdllSOAorNVBqcGNsVmNaeVgybmdid1BGTW5CQWd5MGNsT0FFNlVLQUFBQUFBQUFBQUFBQUE9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9kb2MgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZThiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvZG9jCkBAIC0wLDAgKzEsMjQgQEAKK2ludCBQS0NTN19zZXRfY29udGVudF90eXBlKFBLQ1M3ICpwNywgaW50IHR5cGUpOworQ2FsbCB0byBzZXQgdGhlIHR5cGUgb2YgUEtDUzcgb2JqZWN0IHdlIGFyZSB3b3JraW5nIG9uCisKK2ludCBQS0NTN19TSUdORVJfSU5GT19zZXQoUEtDUzdfU0lHTkVSX0lORk8gKnA3aSwgWDUwOSAqeDUwOSwgRVZQX1BLRVkgKnBrZXksCisJRVZQX01EICpkZ3N0KTsKK1VzZSB0aGlzIHRvIHNldHVwIGEgc2lnbmVyIGluZm8KK1RoZXJlIHdpbGwgYWxzbyBiZSBmdW5jdGlvbnMgdG8gYWRkIHNpZ25lZCBhbmQgdW5zaWduZWQgYXR0cmlidXRlcy4KKworaW50IFBLQ1M3X2FkZF9zaWduZXIoUEtDUzcgKnA3LCBQS0NTN19TSUdORVJfSU5GTyAqcDdpKTsKK0FkZCBhIHNpZ25lciBpbmZvIHRvIHRoZSBjb250ZW50LgorCitpbnQgUEtDUzdfYWRkX2NlcnRpZmljYWUoUEtDUzcgKnA3LCBYNTA5ICp4NTA5KTsKK2ludCBQS0NTN19hZGRfY3JsKFBLQ1M3ICpwNywgWDUwOV9DUkwgKng1MDkpOworCistLS0tCisKK3A3PVBLQ1M3X25ldygpOworUEtDUzdfc2V0X2NvbnRlbnRfdHlwZShwNyxOSURfcGtjczdfc2lnbmVkKTsKKworc2lnbmVyPVBLQ1M3X1NJTkdORVJfSU5GT19uZXcoKTsKK1BLQ1M3X1NJR05FUl9JTkZPX3NldChzaWduZXIseDUwOSxwa2V5LEVWUF9tZDUoKSk7CitQS0NTN19hZGRfc2lnbmVyKHB5LHNpZ25lcik7CisKK3dlIGFyZSBub3cgc2V0dXAuCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxN2Y4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9lbmMuYwpAQCAtMCwwICsxLDE3NCBAQAorLyogY3J5cHRvL3BrY3M3L2VuYy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworaW50IG1haW4oYXJnYyxhcmd2KQoraW50IGFyZ2M7CitjaGFyICphcmd2W107CisJeworCVg1MDkgKng1MDk7CisJUEtDUzcgKnA3OworCUJJTyAqaW47CisJQklPICpkYXRhLCpwN2JpbzsKKwljaGFyIGJ1ZlsxMDI0KjRdOworCWludCBpOworCWludCBub2RldGFjaD0xOworCWNoYXIgKmtleWZpbGUgPSBOVUxMOworCWNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcj1OVUxMOworCVNUQUNLX09GKFg1MDkpICpyZWNpcHM9TlVMTDsKKworCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisKKwlkYXRhPUJJT19uZXcoQklPX3NfZmlsZSgpKTsKKwl3aGlsZShhcmdjID4gMSkKKwkJeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sIi1uZCIpID09IDApCisJCQl7CisJCQlub2RldGFjaD0xOworCQkJYXJndisrOyBhcmdjLS07CisJCQl9CisJCWVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwiLWMiKSA9PSAwKSAmJiAoYXJnYyA+PSAyKSkgeworCQkJaWYoIShjaXBoZXIgPSBFVlBfZ2V0X2NpcGhlcmJ5bmFtZShhcmd2WzJdKSkpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gY2lwaGVyICVzXG4iLCBhcmd2WzJdKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWFyZ2MtPTI7CisJCQlhcmd2Kz0yOworCQl9IGVsc2UgaWYgKChzdHJjbXAoYXJndlsxXSwiLWsiKSA9PSAwKSAmJiAoYXJnYyA+PSAyKSkgeworCQkJa2V5ZmlsZSA9IGFyZ3ZbMl07CisJCQlhcmdjLT0yOworCQkJYXJndis9MjsKKwkJCWlmICghKGluPUJJT19uZXdfZmlsZShrZXlmaWxlLCJyIikpKSBnb3RvIGVycjsKKwkJCWlmICghKHg1MDk9UEVNX3JlYWRfYmlvX1g1MDkoaW4sTlVMTCxOVUxMLE5VTEwpKSkKKwkJCQlnb3RvIGVycjsKKwkJCWlmKCFyZWNpcHMpIHJlY2lwcyA9IHNrX1g1MDlfbmV3X251bGwoKTsKKwkJCXNrX1g1MDlfcHVzaChyZWNpcHMsIHg1MDkpOworCQkJQklPX2ZyZWUoaW4pOworCQl9IGVsc2UgYnJlYWs7CisJfQorCisJaWYoIXJlY2lwcykgeworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHJlY2lwaWVudHNcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIUJJT19yZWFkX2ZpbGVuYW1lKGRhdGEsYXJndlsxXSkpIGdvdG8gZXJyOworCisJcDc9UEtDUzdfbmV3KCk7CisjaWYgMAorCUJJT19yZXNldChpbik7CisJaWYgKChwa2V5PVBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGluLE5VTEwsTlVMTCkpID09IE5VTEwpIGdvdG8gZXJyOworCUJJT19mcmVlKGluKTsKKwlQS0NTN19zZXRfdHlwZShwNyxOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkKTsKKwkgCisJaWYgKFBLQ1M3X2FkZF9zaWduYXR1cmUocDcseDUwOSxwa2V5LEVWUF9zaGExKCkpID09IE5VTEwpIGdvdG8gZXJyOworCS8qIHdlIG1heSB3YW50IHRvIGFkZCBtb3JlICovCisJUEtDUzdfYWRkX2NlcnRpZmljYXRlKHA3LHg1MDkpOworI2Vsc2UKKwlQS0NTN19zZXRfdHlwZShwNyxOSURfcGtjczdfZW52ZWxvcGVkKTsKKyNlbmRpZgorCWlmKCFjaXBoZXIpCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKKwkJY2lwaGVyID0gRVZQX2Rlc19lZGUzX2NiYygpOworI2Vsc2UKKwkJZnByaW50ZihzdGRlcnIsICJObyBjaXBoZXIgc2VsZWN0ZWRcbiIpOworCQlnb3RvIGVycjsKKyNlbmRpZgorCX0KKworCWlmICghUEtDUzdfc2V0X2NpcGhlcihwNyxjaXBoZXIpKSBnb3RvIGVycjsKKwlmb3IoaSA9IDA7IGkgPCBza19YNTA5X251bShyZWNpcHMpOyBpKyspIHsKKwkJaWYgKCFQS0NTN19hZGRfcmVjaXBpZW50KHA3LHNrX1g1MDlfdmFsdWUocmVjaXBzLCBpKSkpIGdvdG8gZXJyOworCX0KKwlza19YNTA5X3BvcF9mcmVlKHJlY2lwcywgWDUwOV9mcmVlKTsKKworCS8qIFNldCB0aGUgY29udGVudCBvZiB0aGUgc2lnbmVkIHRvICdkYXRhJyAqLworCS8qIFBLQ1M3X2NvbnRlbnRfbmV3KHA3LE5JRF9wa2NzN19kYXRhKTsgbm90IHVzZWQgaW4gZW52ZWxvcGUgKi8KKworCS8qIGNvdWxkIGJlIHVzZWQsIGJ1dCBub3QgaW4gdGhpcyB2ZXJzaW9uIDotKQorCWlmICghbm9kZXRhY2gpIFBLQ1M3X3NldF9kZXRhY2hlZChwNywxKTsKKwkqLworCisJaWYgKChwN2Jpbz1QS0NTN19kYXRhSW5pdChwNyxOVUxMKSkgPT0gTlVMTCkgZ290byBlcnI7CisKKwlmb3IgKDs7KQorCQl7CisJCWk9QklPX3JlYWQoZGF0YSxidWYsc2l6ZW9mKGJ1ZikpOworCQlpZiAoaSA8PSAwKSBicmVhazsKKwkJQklPX3dyaXRlKHA3YmlvLGJ1ZixpKTsKKwkJfQorCUJJT19mbHVzaChwN2Jpbyk7CisKKwlpZiAoIVBLQ1M3X2RhdGFGaW5hbChwNyxwN2JpbykpIGdvdG8gZXJyOworCUJJT19mcmVlKHA3YmlvKTsKKworCVBFTV93cml0ZV9QS0NTNyhzdGRvdXQscDcpOworCVBLQ1M3X2ZyZWUocDcpOworCisJZXhpdCgwKTsKK2VycjoKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCUVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKwlleGl0KDEpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2VzMS5wZW0gYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvZXMxLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzExMmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2VzMS5wZW0KQEAgLTAsMCArMSw2NiBAQAorLS0tLS1CRUdJTiBQS0NTNy0tLS0tCitNSUFHQ1NxR1NJYjNEUUVIQTZDQU1JQUNBUUF4Z2dIbU1JSHdBZ0VBTUlHWk1JR1NNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUcKK0ExVUVDQk1LVVhWbFpXNXpiR0Z1WkRFUk1BOEdBMVVFQnhNSVFuSnBjMkpoYm1VeEdqQVlCZ05WQkFvVEVVTnllWEIwYzI5bQorZENCUWRIa2dUSFJrTVNJd0lBWURWUVFMRXhsRVJVMVBUbE5VVWtGVVNVOU9JRUZPUkNCVVJWTlVTVTVITVJzd0dRWURWUVFECitFeEpFUlUxUElGcEZVazhnVmtGTVZVVWdRMEVDQWdSdU1BMEdDU3FHU0liM0RRRUJBUVVBQkVEV2FrMHkvNVhaSmhRSmVDTG8KK0tFQ2NIWGtURWJqellrWU5ISWluYmlQbVJLNFFiTmZzOXoybUEzei9jMnlrUTRlQXFGUjJqeU5yVU1OLytJNVhFaXY2TUlIdworQWdFQU1JR1pNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUtVWFZsWlc1emJHRnVaREVSTUE4R0ExVUVCeE1JCitRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW1kQ0JRZEhrZ1RIUmtNU0l3SUFZRFZRUUxFeGxFUlUxUFRsTlUKK1VrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRREV4SkVSVTFQSUZwRlVrOGdWa0ZNVlVVZ1EwRUNBZ1I5TUEwRworQ1NxR1NJYjNEUUVCQVFVQUJFQVdnOStLZ3RDamM3N0pkajFWZTR3R2dIalZIYmJTWUVBMVpxS0ZEb2kxNXZTcjloZnBIbUM0Cit5Y1p6Y1JvMTZKa1Rmb2xlZmlIWnpteWpWejk0dlNONk1JQUdDU3FHU0liM0RRRUhBVEFhQmdncWhraUc5dzBEQWpBT0FnSUEKK29BUUk3WDRUazRtY2JWNmdnQVNCc0hsMW1DYUozUmhYV2xOUENnQ1JVNTNkN001eDZURFpSa3Z3ZHRkdlc5Nm0xbHVwVDAzRgorWHRvbmtCcWs3b01rSDdrR2ZzNS9SRVFPUGp4MFFFMkl4bWd0MVczc3p1bTgyRVp3QTdwWk5wcGNyYUs3Vy9vZHcvN2JZWk8rCitJSTNIUG1Sa2xFMk45cWl1MUxQYVBVc25Zb2drTzZTZW5ueWVMNXRaMzgydkJ3ZUwvOHBuRzBxc2JUMU9CYjY1ditsbG5zalQKK3BhMVQvcCtmSXgvaUpKR0U2SzlmWUZva0M2Z1hMUTZvelhSZE91NW9CREI4bVBDWVl2QXFLeWNpZE0vTXJHR1VrcEV0UzRmMAorbFMzMVB3UWk1WVRpbThJZzMvVE93VnBQWDMyaTQ2RlR1RUlFSU1Ia0QvT3ZwZndDQ3pYVUhISm5LbktVQVV2SXNTWTN2R0JzCis4ZXpwVURmQkJCajlMSER5MzJoWjJ0UWlsa0RlZlA1Vk0yTExkcldnYW1ZRWdmaXlJVFF2bjA4VWw1bFFPUXhiRktCaGVGcTUKK290Q0NONE1SK3c1ZXExMnhRdTZ5K2Y5ejAxNTlhZzJydTg3RDBsTHRVdFhYdENFTGJPMW5Va1Qyc0oway9pRHM5VE9YcjZDeAorZ28xWEtZaG84M2hsa1hZaUN0ZVZpemRBYmdWR05zTlJENHd0SWRhanNvckVUL0x1SkVDZ3AxMVllTDl3MWRsREIwSExFWmZpCitYQ3NVcGhINGpHYWdiYTNoRGVVU2libmpTaUpsTjB1a2Z1UXVyQkJiSTJVa0JBdWppRUF1YktQbjdDMUZaSlJTdzZDUFBYNXQKK0tFcG1jcVQxSk5rNkxPOEpzNi8xc0NtbUJoMVZHQ3kxK0V1VEk5SjFwN0RhZ2Y0blE4Y0hpdG9DUnBIdUtabEZIblp5djd0dworUm4vS09oSGFZUDJWekFoNDBnUUl2S01BQVdoOW9Gc0VFSU13SW9PbUx3TEg1d2YrOFFkYkRob0VDSDhId1p0OWExMmRCQWpMCityNGoyemx2dGZnUUl0N25tRU0zd3oxRUVDS2xjM0VJeTFpckNCQkNBS0lOY2VybUszQStqSTZJU04yUnpCRkEzZHNoL3h3TXUKK2w2MWFXTUJCWnpFei9TRjkyazZuMzVLWmhDQzBkNmZJVkMvMVdNdjBmbkN3UThvRUR5blNyZTIxNlZFRmlZS0JhUUxKZTVvLworbVRBeEM3SHQzZ29YbnVjK2kxRkl0T2tMcmdSSS93eXZUSUNFbjJXc05aaU1BRG5HYWVlMmJxUG5Vb3BvK1ZNR2V4SkV0Q1BrCitsMFpObERKR3F1UERrcFV3YUV0ZWNWWnpDTnlWUFl5eUY0Si9sOHJtR0RoRGRZVUlDOElLQkVnL2lwL0UwQnV1YkJMV1ZidisKK0hSbDRRcm5HcHlDeWVYUlhYSzYwM1FQM3NUMVpiYm0xdjVwSS9sb09oVkhpNzI0TG10WEhTeXA1cXY5TURjeEUxUG9YMTBMWQorZ0JSdGx3d0VTUGVDRjhiSzVqazR4SVFNaEs1Tk1IajFZMUtRV1RaOU5HSVRCTDRoalJxMnFwNFFrNUdJcEdnT1ZQb3BBdUNvCitUSXlQaWtwcUJSTnRMU1BSU3NEczZRUFVQeldCaDZKZ3h3UlFibG5ES0tVa3hVY25KaUQ0aTlRdEdhL1phYk1uNEt4dE5PQkwKKzVKU2gxbkprYUxYQ1pZMDcwMTMxV1dQQUJ5TGNkNVRpWHE4eDg0cG16VjVOTms0dGlNcG9YaEpOc3g4ZTRyc2tRUWxLZDZNRQorU0NlMmVZREhLY0tQWDNXSmJVemhySlNROTIvYVduSTJpVVk4V1Era1NOeWlaMlFVanl1VWc5WjY2Zy8wZDJTVGx2UE9CSFQvCit5NU9EUDJDd2JjV1g0UW1DYlVjOVRUNjZmUVJJclJWdXd2dE9mblV1ZXlHZ1loSjNIcEFKZlZhQi83a2FwNWJqN0ZpL2F6VzQKKzlKRGZkMWJDL1c5aDBLeWs3Uk8yZ3h2RTBoSUhjMjZtWkpIVG05TU5QNUQzMjhNbk0yTWRCRWpLalFCdGdycCtsRklpaTdNUAorbkdIRlRLVWtHNFdBSVpKQ2YvQ3NUK3A2L1NXMHFHNzFNZS9ZY1N3NVNUQjI0aithK0hnTVY4UlZJZVVsa1A0ejBJV1dyU29CCitHaDRkL1owRVVNQ1ZIcy9IWi9iV2dpeWh0SHB2dVZBemlkbThEODFwMUxKNUJRWDUvNWYvbStxNStmUy9ucEwyN2RURWJOcXMKK0xTQjZpajNNWkFpN0x3SFdwVG45elduRGFqQ01Fajl2bGFWN21jS3RISzVpQkVnODVhZ0ZpMWgzTXZpY3FMdG9GZTVoVnY5VAordEcwajZDUmtqa2l4UHppdmx0bHJmNDRLSHYxNGdMTTBYSnhDR3lxN3ZkM2w4UVlyMys5YXQwek5uWC95cVRpQm5zbkU1ZFVFCitTSWdyWXV6ODdNMmdpL0VSOVBjRG9UdE9OSDMrQ2tjcVZ5MDNxL1NqOGNWV0QvYjFLZ0VocW5OT2ZjOEFrOVBjdHlSL0l0Y1IKKzhNZTVYVm4xR0pLa1FKazRPMjlmeHZnTm9BUUlySUVTdlVXR3NoQUVRQnlYaUZvRlREVUJ5alRsZ2pjeTc3SDFsckgreTNQLword0FJbkpqSkF1dDlrQ055R0pWMFBBNGtkUEI1VVNXbHR1TzZ0OGdrNFBkMllCTWwwOXpxVVdrQUVVQ2pGcnRaM21hcGpjR1pJCit1UVRBU0tSNUxTalhvV3hUVDVnYWUvKzY0TWVyRi9vQ0VlTzNlaFJUcGpuUHJzaVJEbzByV0lRVGFqOStOcm84WjJ4dFdzdHcKK1JuZm9BSEl4VjFsRWFtUHdqc2NlQkVpMlNEOWhpaWZGZU81RUNpVm9hRTFGZFhVWGhVK2p3WUFNeDZqSFdPOWhNa1l6UzlwTQorWTNJeVdSNXlidE9qaVFna1VkdlJKUFVQR2Y1RFZWTVBueW1HWDI1YURoNVBZcElFU1Bic005YWtDcE9PVnVzY3l3Y1Vzd21VCitvN2RYdmxCNDhXV0NmZy9hbDNCUUtBWmJuNVpYdFdOd3BVWmtyRWRIc3J4QVZ2M3J4UmNka1QzWjFmelViSXVZa0xKTjIwMG8KK1dnUklKdm42Uk84S0VqNy9IT2cyc1l1dU04bnoxa1IwVFNnd1g3LzB5LzdKZmpCYTBKSWxQN283NXNOSnNjRThveW9JTXp1eQorRHZuNi9VOWczQkNEWG44M0EvcytrZTYwcW45Z0JGQzZOQWVMT2xYYWwxWVZXWWhNUU5PcUN5VWZBamlYQlRhd2F5c1FiMU1rCitZZ2VObEY4eHVFRmNVUVdJUCt2Tkc3Rko1SlBNYU1STDRZRW9hUTNzVkZoWU9FUkpSMWNTYis4eHQ0UUNZdEJLUWdSSVVPbUoKK0NIVzVvMWhYSldKaVRrWksycVdGY0VNelRJTlNqNUVwWUZ5U3I4YVZCamtSbkk3dnhlZ1JULytYWlpYb1llZFEzVU5zbkdJMworRGRrV2lpNVZ6WDBQTkY2QzYwcGZCRWlWcGF1c1l1WDdXamIzTGZtOGNCajdHZ042OWk2UG0yZ3h0b2JWY21wbzJuUzRENzE0CitlUHlobFg5bjhrSjZRQWNxV01SajIyc21EUHJIVkdOVGl6ZnpIQmg1ek5sbEs5Z0VTSml6SUxPV0kzMjdvZzNaV3ArcVVodDUKK2tOREpDek1LN1owOVVBeStoK3ZxMFZUUXVFbzNGZ0x6VmRxa0p1ampTTDROeDk3bFhnNTFBb3ZyRW4zbmQ0ZXZ5ZHdjaktMWAorMXdSSW83Mk5hZVd1VUVRK3J0MVNsQ3NPSjdrMWlvSlNxaHJQT2Z2d2NhRmNiNGJlVmV0MUpXaXk0eXZvd1RqTERHYlVqZTJzCit4anJsVnQ0QkpXSS91QTZqYlFzcnhTZTg5QURaQkFpNVlBbFI0cXN6ZUFRSVhEM1ZTQlZLYlJVRUNOVHR5dnc5dnZxWEJBaGIKK0laTm40SDRjeGdRSStYVzdHa2ZMK2VrRUNDQ0NnMnJlTXlHREJBaDFQWXFrZzNsdzNnUVFrTmxnZ0VQVStCSDhlaDdHbTduNworN0FRSWpDNUVXYmtpbDVjRUVLY3B1cXdUV3d3L1g4OUtuUUFnOFRjRUNKUG9tcUh2cmxaRkJCaVJTdUlpSHBtTitQYXVqWHB2CitxWlYyVmhqa0IyajA5R0VFQ09JZHY4QVZPSmdLQkFqbEhnSXFBRDlqWlFRSVhIYnM0NCt3b2djRUlHR3FUQUNSSnhyaE1jTUcKK1g4ZHJOamtzSVB0K3NueFRYVUJJa1RWcFpXb0FCQWg2dW5YUFR5SXI4UVFnQkY4eEtvWDI3TVdrN2lUTm1rU05aZ2daWGEyYQorRFdDR0hTWUxuZ2JTT0hJRUNEOVhtTzZWc3ZUZ0JBamZxQjcwQ0VXNFd3UUlWSUJrYkNvY3puVUVFSEIvekZYeS9zUjRPWUhlCitVZmJOUG5JRUVEV0JCL05UQ0xNR0UrbzhCZnl1amNBRUNGaWs3R1FubkY5VkJCQWhMWEV4UWVXQW9mWk5jNk50TjdxWkJDQzEKK2dWSVMzcnVUd0tsdG1jcmd4M2hlVDNNOFpKaENmV2ErNkt6Y2hubUt5Z1FRKzFOTDVzU3pSNG0vZmRycXhIRnlVQVFZQ1QyeAorUGFtUXIzd0szaDBseVpFUis0SDB6UE04NkFoRkJCQzNDa212TDJ2amZsTWZ1am56UEJWcEJCZ2U5ck1iSTUrMHE5RExyVGlUCis1RjNBSWdYTHBEOFBRV0FFQ0hrSFZvNlJvbVYzQkFnTWJpOEUyNzFVZUFRSXF0Uzh3bkkzWG5nRUNHM1RXbU9NYjMvaUJFaGEKK3krbXZDUzZJM24zSmZMOGUxQjVQNHFYOS9jekpSYUVSTHVLcEdOakxpTDRBK3p4TjBMWjBVSGQwcWZtSmp3T1R4QXgzaUpBQworbEdYWDRuQjlBVFlQVVQ1RVUrbzFZNHNFQ04wMXBQNnZXTklkQkRBc2lFMFRzOC85bHRKbHFYMkIzQW9PTTRxT3Q5RWFDalhmCitsQithRW1yaHRqVXd1WjZHcVM1S2U3UDZYbmFrVGs0RUNDTElNYXROZG9vdEFBQUFBQUFBQUFBQUFBPT0KKy0tLS0tRU5EIFBLQ1M3LS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9leGFtcGxlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvZXhhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTNkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvZXhhbXBsZS5jCkBAIC0wLDAgKzEsMzI5IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M3Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xX21hYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCitpbnQgYWRkX3NpZ25lZF90aW1lKFBLQ1M3X1NJR05FUl9JTkZPICpzaSkKKwl7CisJQVNOMV9VVENUSU1FICpzaWduX3RpbWU7CisKKwkvKiBUaGUgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGFtb3VudCB0byBhZGQvc3VidHJhY3QgZnJvbSB0aGUgY3VycmVudAorCSAqIHRpbWUgKGluIHNlY29uZHMpICovCisJc2lnbl90aW1lPVg1MDlfZ210aW1lX2FkaihOVUxMLDApOworCVBLQ1M3X2FkZF9zaWduZWRfYXR0cmlidXRlKHNpLE5JRF9wa2NzOV9zaWduaW5nVGltZSwKKwkJVl9BU04xX1VUQ1RJTUUsKGNoYXIgKilzaWduX3RpbWUpOworCXJldHVybigxKTsKKwl9CisKK0FTTjFfVVRDVElNRSAqZ2V0X3NpZ25lZF90aW1lKFBLQ1M3X1NJR05FUl9JTkZPICpzaSkKKwl7CisJQVNOMV9UWVBFICpzbzsKKworCXNvPVBLQ1M3X2dldF9zaWduZWRfYXR0cmlidXRlKHNpLE5JRF9wa2NzOV9zaWduaW5nVGltZSk7CisJaWYgKHNvLT50eXBlID09IFZfQVNOMV9VVENUSU1FKQorCSAgICByZXR1cm4gc28tPnZhbHVlLnV0Y3RpbWU7CisJcmV0dXJuIE5VTEw7CisJfQorCQorc3RhdGljIGludCBzaWduZWRfc3RyaW5nX25pZD0gLTE7CisKK3ZvaWQgYWRkX3NpZ25lZF9zdHJpbmcoUEtDUzdfU0lHTkVSX0lORk8gKnNpLCBjaGFyICpzdHIpCisJeworCUFTTjFfT0NURVRfU1RSSU5HICpvczsKKworCS8qIFRvIGEgYW4gb2JqZWN0IG9mIE9JRCAxLjIuMy40LjUsIHdoaWNoIGlzIGFuIG9jdGV0IHN0cmluZyAqLworCWlmIChzaWduZWRfc3RyaW5nX25pZCA9PSAtMSkKKwkJc2lnbmVkX3N0cmluZ19uaWQ9CisJCQlPQkpfY3JlYXRlKCIxLjIuMy40LjUiLCJPSURfZXhhbXBsZSIsIk91ciBleGFtcGxlIE9JRCIpOworCW9zPUFTTjFfT0NURVRfU1RSSU5HX25ldygpOworCUFTTjFfT0NURVRfU1RSSU5HX3NldChvcywodW5zaWduZWQgY2hhciopc3RyLHN0cmxlbihzdHIpKTsKKwkvKiBXaGVuIHdlIGFkZCwgd2UgZG8gbm90IGZyZWUgKi8KKwlQS0NTN19hZGRfc2lnbmVkX2F0dHJpYnV0ZShzaSxzaWduZWRfc3RyaW5nX25pZCwKKwkJVl9BU04xX09DVEVUX1NUUklORywoY2hhciAqKW9zKTsKKwl9CisKK2ludCBnZXRfc2lnbmVkX3N0cmluZyhQS0NTN19TSUdORVJfSU5GTyAqc2ksIGNoYXIgKmJ1ZiwgaW50IGxlbikKKwl7CisJQVNOMV9UWVBFICpzbzsKKwlBU04xX09DVEVUX1NUUklORyAqb3M7CisJaW50IGk7CisKKwlpZiAoc2lnbmVkX3N0cmluZ19uaWQgPT0gLTEpCisJCXNpZ25lZF9zdHJpbmdfbmlkPQorCQkJT0JKX2NyZWF0ZSgiMS4yLjMuNC41IiwiT0lEX2V4YW1wbGUiLCJPdXIgZXhhbXBsZSBPSUQiKTsKKwkvKiBUbyByZXRyaWV2ZSAqLworCXNvPVBLQ1M3X2dldF9zaWduZWRfYXR0cmlidXRlKHNpLHNpZ25lZF9zdHJpbmdfbmlkKTsKKwlpZiAoc28gIT0gTlVMTCkKKwkJeworCQlpZiAoc28tPnR5cGUgPT0gVl9BU04xX09DVEVUX1NUUklORykKKwkJCXsKKwkJCW9zPXNvLT52YWx1ZS5vY3RldF9zdHJpbmc7CisJCQlpPW9zLT5sZW5ndGg7CisJCQlpZiAoKGkrMSkgPiBsZW4pCisJCQkJaT1sZW4tMTsKKwkJCW1lbWNweShidWYsb3MtPmRhdGEsaSk7CisJCQlyZXR1cm4oaSk7CisJCQl9CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCitzdGF0aWMgaW50IHNpZ25lZF9zZXEyc3RyaW5nX25pZD0gLTE7CisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICovCitpbnQgYWRkX3NpZ25lZF9zZXEyc3RyaW5nKFBLQ1M3X1NJR05FUl9JTkZPICpzaSwgY2hhciAqc3RyMSwgY2hhciAqc3RyMikKKwl7CisJLyogVG8gYWRkIGFuIG9iamVjdCBvZiBPSUQgMS45Ljk5OSwgd2hpY2ggaXMgYSBzZXF1ZW5jZSBjb250YWluaW5nCisJICogMiBvY3RldCBzdHJpbmdzICovCisJdW5zaWduZWQgY2hhciAqcDsKKwlBU04xX09DVEVUX1NUUklORyAqb3MxLCpvczI7CisJQVNOMV9TVFJJTkcgKnNlcTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBpLHRvdGFsOworCisJaWYgKHNpZ25lZF9zZXEyc3RyaW5nX25pZCA9PSAtMSkKKwkJc2lnbmVkX3NlcTJzdHJpbmdfbmlkPQorCQkJT0JKX2NyZWF0ZSgiMS45Ljk5OTkiLCJPSURfZXhhbXBsZSIsIk91ciBleGFtcGxlIE9JRCIpOworCisJb3MxPUFTTjFfT0NURVRfU1RSSU5HX25ldygpOworCW9zMj1BU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwlBU04xX09DVEVUX1NUUklOR19zZXQob3MxLCh1bnNpZ25lZCBjaGFyKilzdHIxLHN0cmxlbihzdHIxKSk7CisJQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KG9zMiwodW5zaWduZWQgY2hhciopc3RyMSxzdHJsZW4oc3RyMSkpOworCWkgPWkyZF9BU04xX09DVEVUX1NUUklORyhvczEsTlVMTCk7CisJaSs9aTJkX0FTTjFfT0NURVRfU1RSSU5HKG9zMixOVUxMKTsKKwl0b3RhbD1BU04xX29iamVjdF9zaXplKDEsaSxWX0FTTjFfU0VRVUVOQ0UpOworCisJZGF0YT1tYWxsb2ModG90YWwpOworCXA9ZGF0YTsKKwlBU04xX3B1dF9vYmplY3QoJnAsMSxpLFZfQVNOMV9TRVFVRU5DRSxWX0FTTjFfVU5JVkVSU0FMKTsKKwlpMmRfQVNOMV9PQ1RFVF9TVFJJTkcob3MxLCZwKTsKKwlpMmRfQVNOMV9PQ1RFVF9TVFJJTkcob3MyLCZwKTsKKworCXNlcT1BU04xX1NUUklOR19uZXcoKTsKKwlBU04xX1NUUklOR19zZXQoc2VxLGRhdGEsdG90YWwpOworCWZyZWUoZGF0YSk7CisJQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvczEpOworCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MyKTsKKworCVBLQ1M3X2FkZF9zaWduZWRfYXR0cmlidXRlKHNpLHNpZ25lZF9zZXEyc3RyaW5nX25pZCwKKwkJVl9BU04xX1NFUVVFTkNFLChjaGFyICopc2VxKTsKKwlyZXR1cm4oMSk7CisJfQorCisvKiBGb3IgdGhpcyBjYXNlLCBJIHdpbGwgbWFsbG9jIHRoZSByZXR1cm4gc3RyaW5ncyAqLworaW50IGdldF9zaWduZWRfc2VxMnN0cmluZyhQS0NTN19TSUdORVJfSU5GTyAqc2ksIGNoYXIgKipzdHIxLCBjaGFyICoqc3RyMikKKwl7CisJQVNOMV9UWVBFICpzbzsKKworCWlmIChzaWduZWRfc2VxMnN0cmluZ19uaWQgPT0gLTEpCisJCXNpZ25lZF9zZXEyc3RyaW5nX25pZD0KKwkJCU9CSl9jcmVhdGUoIjEuOS45OTk5IiwiT0lEX2V4YW1wbGUiLCJPdXIgZXhhbXBsZSBPSUQiKTsKKwkvKiBUbyByZXRyaWV2ZSAqLworCXNvPVBLQ1M3X2dldF9zaWduZWRfYXR0cmlidXRlKHNpLHNpZ25lZF9zZXEyc3RyaW5nX25pZCk7CisJaWYgKHNvICYmIChzby0+dHlwZSA9PSBWX0FTTjFfU0VRVUVOQ0UpKQorCQl7CisJCUFTTjFfY29uc3RfQ1RYIGM7CisJCUFTTjFfU1RSSU5HICpzOworCQlsb25nIGxlbmd0aDsKKwkJQVNOMV9PQ1RFVF9TVFJJTkcgKm9zMSwqb3MyOworCisJCXM9c28tPnZhbHVlLnNlcXVlbmNlOworCQljLnA9QVNOMV9TVFJJTkdfZGF0YShzKTsKKwkJYy5tYXg9Yy5wK0FTTjFfU1RSSU5HX2xlbmd0aChzKTsKKwkJaWYgKCFhc24xX0dldFNlcXVlbmNlKCZjLCZsZW5ndGgpKSBnb3RvIGVycjsKKwkJLyogTGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcWVuY2UgKi8KKworCQljLnE9Yy5wOworCQlpZiAoKG9zMT1kMmlfQVNOMV9PQ1RFVF9TVFJJTkcoTlVMTCwmYy5wLGMuc2xlbikpID09IE5VTEwpIAorCQkJZ290byBlcnI7CisJCWMuc2xlbi09KGMucC1jLnEpOworCisJCWMucT1jLnA7CisJCWlmICgob3MyPWQyaV9BU04xX09DVEVUX1NUUklORyhOVUxMLCZjLnAsYy5zbGVuKSkgPT0gTlVMTCkgCisJCQlnb3RvIGVycjsKKwkJYy5zbGVuLT0oYy5wLWMucSk7CisKKwkJaWYgKCFhc24xX2NvbnN0X0ZpbmlzaCgmYykpIGdvdG8gZXJyOworCQkqc3RyMT1tYWxsb2Mob3MxLT5sZW5ndGgrMSk7CisJCSpzdHIyPW1hbGxvYyhvczItPmxlbmd0aCsxKTsKKwkJbWVtY3B5KCpzdHIxLG9zMS0+ZGF0YSxvczEtPmxlbmd0aCk7CisJCW1lbWNweSgqc3RyMixvczItPmRhdGEsb3MyLT5sZW5ndGgpOworCQkoKnN0cjEpW29zMS0+bGVuZ3RoXT0nXDAnOworCQkoKnN0cjIpW29zMi0+bGVuZ3RoXT0nXDAnOworCQlBU04xX09DVEVUX1NUUklOR19mcmVlKG9zMSk7CisJCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MyKTsKKwkJcmV0dXJuKDEpOworCQl9CitlcnI6CisJcmV0dXJuKDApOworCX0KKworCisvKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqIFRIRSBPVEhFUiBXQVkgVE8gRE8gVEhJTkdTCisgKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAqLworWDUwOV9BVFRSSUJVVEUgKmNyZWF0ZV90aW1lKHZvaWQpCisJeworCUFTTjFfVVRDVElNRSAqc2lnbl90aW1lOworCVg1MDlfQVRUUklCVVRFICpyZXQ7CisKKwkvKiBUaGUgbGFzdCBwYXJhbWV0ZXIgaXMgdGhlIGFtb3VudCB0byBhZGQvc3VidHJhY3QgZnJvbSB0aGUgY3VycmVudAorCSAqIHRpbWUgKGluIHNlY29uZHMpICovCisJc2lnbl90aW1lPVg1MDlfZ210aW1lX2FkaihOVUxMLDApOworCXJldD1YNTA5X0FUVFJJQlVURV9jcmVhdGUoTklEX3BrY3M5X3NpZ25pbmdUaW1lLAorCQlWX0FTTjFfVVRDVElNRSwoY2hhciAqKXNpZ25fdGltZSk7CisJcmV0dXJuKHJldCk7CisJfQorCitBU04xX1VUQ1RJTUUgKnNrX2dldF90aW1lKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2spCisJeworCUFTTjFfVFlQRSAqc287CisJUEtDUzdfU0lHTkVSX0lORk8gc2k7CisKKwlzaS5hdXRoX2F0dHI9c2s7CisJc289UEtDUzdfZ2V0X3NpZ25lZF9hdHRyaWJ1dGUoJnNpLE5JRF9wa2NzOV9zaWduaW5nVGltZSk7CisJaWYgKHNvLT50eXBlID09IFZfQVNOMV9VVENUSU1FKQorCSAgICByZXR1cm4gc28tPnZhbHVlLnV0Y3RpbWU7CisJcmV0dXJuIE5VTEw7CisJfQorCQorWDUwOV9BVFRSSUJVVEUgKmNyZWF0ZV9zdHJpbmcoY2hhciAqc3RyKQorCXsKKwlBU04xX09DVEVUX1NUUklORyAqb3M7CisJWDUwOV9BVFRSSUJVVEUgKnJldDsKKworCS8qIFRvIGEgYW4gb2JqZWN0IG9mIE9JRCAxLjIuMy40LjUsIHdoaWNoIGlzIGFuIG9jdGV0IHN0cmluZyAqLworCWlmIChzaWduZWRfc3RyaW5nX25pZCA9PSAtMSkKKwkJc2lnbmVkX3N0cmluZ19uaWQ9CisJCQlPQkpfY3JlYXRlKCIxLjIuMy40LjUiLCJPSURfZXhhbXBsZSIsIk91ciBleGFtcGxlIE9JRCIpOworCW9zPUFTTjFfT0NURVRfU1RSSU5HX25ldygpOworCUFTTjFfT0NURVRfU1RSSU5HX3NldChvcywodW5zaWduZWQgY2hhciopc3RyLHN0cmxlbihzdHIpKTsKKwkvKiBXaGVuIHdlIGFkZCwgd2UgZG8gbm90IGZyZWUgKi8KKwlyZXQ9WDUwOV9BVFRSSUJVVEVfY3JlYXRlKHNpZ25lZF9zdHJpbmdfbmlkLAorCQlWX0FTTjFfT0NURVRfU1RSSU5HLChjaGFyICopb3MpOworCXJldHVybihyZXQpOworCX0KKworaW50IHNrX2dldF9zdHJpbmcoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpzaywgY2hhciAqYnVmLCBpbnQgbGVuKQorCXsKKwlBU04xX1RZUEUgKnNvOworCUFTTjFfT0NURVRfU1RSSU5HICpvczsKKwlpbnQgaTsKKwlQS0NTN19TSUdORVJfSU5GTyBzaTsKKworCXNpLmF1dGhfYXR0cj1zazsKKworCWlmIChzaWduZWRfc3RyaW5nX25pZCA9PSAtMSkKKwkJc2lnbmVkX3N0cmluZ19uaWQ9CisJCQlPQkpfY3JlYXRlKCIxLjIuMy40LjUiLCJPSURfZXhhbXBsZSIsIk91ciBleGFtcGxlIE9JRCIpOworCS8qIFRvIHJldHJpZXZlICovCisJc289UEtDUzdfZ2V0X3NpZ25lZF9hdHRyaWJ1dGUoJnNpLHNpZ25lZF9zdHJpbmdfbmlkKTsKKwlpZiAoc28gIT0gTlVMTCkKKwkJeworCQlpZiAoc28tPnR5cGUgPT0gVl9BU04xX09DVEVUX1NUUklORykKKwkJCXsKKwkJCW9zPXNvLT52YWx1ZS5vY3RldF9zdHJpbmc7CisJCQlpPW9zLT5sZW5ndGg7CisJCQlpZiAoKGkrMSkgPiBsZW4pCisJCQkJaT1sZW4tMTsKKwkJCW1lbWNweShidWYsb3MtPmRhdGEsaSk7CisJCQlyZXR1cm4oaSk7CisJCQl9CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCitYNTA5X0FUVFJJQlVURSAqYWRkX3NlcTJzdHJpbmcoUEtDUzdfU0lHTkVSX0lORk8gKnNpLCBjaGFyICpzdHIxLCBjaGFyICpzdHIyKQorCXsKKwkvKiBUbyBhZGQgYW4gb2JqZWN0IG9mIE9JRCAxLjkuOTk5LCB3aGljaCBpcyBhIHNlcXVlbmNlIGNvbnRhaW5pbmcKKwkgKiAyIG9jdGV0IHN0cmluZ3MgKi8KKwl1bnNpZ25lZCBjaGFyICpwOworCUFTTjFfT0NURVRfU1RSSU5HICpvczEsKm9zMjsKKwlBU04xX1NUUklORyAqc2VxOworCVg1MDlfQVRUUklCVVRFICpyZXQ7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlpbnQgaSx0b3RhbDsKKworCWlmIChzaWduZWRfc2VxMnN0cmluZ19uaWQgPT0gLTEpCisJCXNpZ25lZF9zZXEyc3RyaW5nX25pZD0KKwkJCU9CSl9jcmVhdGUoIjEuOS45OTk5IiwiT0lEX2V4YW1wbGUiLCJPdXIgZXhhbXBsZSBPSUQiKTsKKworCW9zMT1BU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwlvczI9QVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCk7CisJQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KG9zMSwodW5zaWduZWQgY2hhciopc3RyMSxzdHJsZW4oc3RyMSkpOworCUFTTjFfT0NURVRfU1RSSU5HX3NldChvczIsKHVuc2lnbmVkIGNoYXIqKXN0cjEsc3RybGVuKHN0cjEpKTsKKwlpID1pMmRfQVNOMV9PQ1RFVF9TVFJJTkcob3MxLE5VTEwpOworCWkrPWkyZF9BU04xX09DVEVUX1NUUklORyhvczIsTlVMTCk7CisJdG90YWw9QVNOMV9vYmplY3Rfc2l6ZSgxLGksVl9BU04xX1NFUVVFTkNFKTsKKworCWRhdGE9bWFsbG9jKHRvdGFsKTsKKwlwPWRhdGE7CisJQVNOMV9wdXRfb2JqZWN0KCZwLDEsaSxWX0FTTjFfU0VRVUVOQ0UsVl9BU04xX1VOSVZFUlNBTCk7CisJaTJkX0FTTjFfT0NURVRfU1RSSU5HKG9zMSwmcCk7CisJaTJkX0FTTjFfT0NURVRfU1RSSU5HKG9zMiwmcCk7CisKKwlzZXE9QVNOMV9TVFJJTkdfbmV3KCk7CisJQVNOMV9TVFJJTkdfc2V0KHNlcSxkYXRhLHRvdGFsKTsKKwlmcmVlKGRhdGEpOworCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MxKTsKKwlBU04xX09DVEVUX1NUUklOR19mcmVlKG9zMik7CisKKwlyZXQ9WDUwOV9BVFRSSUJVVEVfY3JlYXRlKHNpZ25lZF9zZXEyc3RyaW5nX25pZCwKKwkJVl9BU04xX1NFUVVFTkNFLChjaGFyICopc2VxKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKy8qIEZvciB0aGlzIGNhc2UsIEkgd2lsbCBtYWxsb2MgdGhlIHJldHVybiBzdHJpbmdzICovCitpbnQgc2tfZ2V0X3NlcTJzdHJpbmcoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpzaywgY2hhciAqKnN0cjEsIGNoYXIgKipzdHIyKQorCXsKKwlBU04xX1RZUEUgKnNvOworCVBLQ1M3X1NJR05FUl9JTkZPIHNpOworCisJaWYgKHNpZ25lZF9zZXEyc3RyaW5nX25pZCA9PSAtMSkKKwkJc2lnbmVkX3NlcTJzdHJpbmdfbmlkPQorCQkJT0JKX2NyZWF0ZSgiMS45Ljk5OTkiLCJPSURfZXhhbXBsZSIsIk91ciBleGFtcGxlIE9JRCIpOworCisJc2kuYXV0aF9hdHRyPXNrOworCS8qIFRvIHJldHJpZXZlICovCisJc289UEtDUzdfZ2V0X3NpZ25lZF9hdHRyaWJ1dGUoJnNpLHNpZ25lZF9zZXEyc3RyaW5nX25pZCk7CisJaWYgKHNvLT50eXBlID09IFZfQVNOMV9TRVFVRU5DRSkKKwkJeworCQlBU04xX2NvbnN0X0NUWCBjOworCQlBU04xX1NUUklORyAqczsKKwkJbG9uZyBsZW5ndGg7CisJCUFTTjFfT0NURVRfU1RSSU5HICpvczEsKm9zMjsKKworCQlzPXNvLT52YWx1ZS5zZXF1ZW5jZTsKKwkJYy5wPUFTTjFfU1RSSU5HX2RhdGEocyk7CisJCWMubWF4PWMucCtBU04xX1NUUklOR19sZW5ndGgocyk7CisJCWlmICghYXNuMV9HZXRTZXF1ZW5jZSgmYywmbGVuZ3RoKSkgZ290byBlcnI7CisJCS8qIExlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXFlbmNlICovCisKKwkJYy5xPWMucDsKKwkJaWYgKChvczE9ZDJpX0FTTjFfT0NURVRfU1RSSU5HKE5VTEwsJmMucCxjLnNsZW4pKSA9PSBOVUxMKSAKKwkJCWdvdG8gZXJyOworCQljLnNsZW4tPShjLnAtYy5xKTsKKworCQljLnE9Yy5wOworCQlpZiAoKG9zMj1kMmlfQVNOMV9PQ1RFVF9TVFJJTkcoTlVMTCwmYy5wLGMuc2xlbikpID09IE5VTEwpIAorCQkJZ290byBlcnI7CisJCWMuc2xlbi09KGMucC1jLnEpOworCisJCWlmICghYXNuMV9jb25zdF9GaW5pc2goJmMpKSBnb3RvIGVycjsKKwkJKnN0cjE9bWFsbG9jKG9zMS0+bGVuZ3RoKzEpOworCQkqc3RyMj1tYWxsb2Mob3MyLT5sZW5ndGgrMSk7CisJCW1lbWNweSgqc3RyMSxvczEtPmRhdGEsb3MxLT5sZW5ndGgpOworCQltZW1jcHkoKnN0cjIsb3MyLT5kYXRhLG9zMi0+bGVuZ3RoKTsKKwkJKCpzdHIxKVtvczEtPmxlbmd0aF09J1wwJzsKKwkJKCpzdHIyKVtvczItPmxlbmd0aF09J1wwJzsKKwkJQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvczEpOworCQlBU04xX09DVEVUX1NUUklOR19mcmVlKG9zMik7CisJCXJldHVybigxKTsKKwkJfQorZXJyOgorCXJldHVybigwKTsKKwl9CisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2V4YW1wbGUuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9leGFtcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYxNjdkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9leGFtcGxlLmgKQEAgLTAsMCArMSw1NyBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCitpbnQgYWRkX3NpZ25lZF90aW1lKFBLQ1M3X1NJR05FUl9JTkZPICpzaSk7CitBU04xX1VUQ1RJTUUgKmdldF9zaWduZWRfdGltZShQS0NTN19TSUdORVJfSU5GTyAqc2kpOworaW50IGdldF9zaWduZWRfc2VxMnN0cmluZyhQS0NTN19TSUdORVJfSU5GTyAqc2ksIGNoYXIgKipzdHIxLCBjaGFyICoqc3RyMik7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvaW5mby5wZW0gYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvaW5mby5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5YmFmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9pbmZvLnBlbQpAQCAtMCwwICsxLDU3IEBACitpc3N1ZXIgOi9DPUFVL1NQPVF1ZWVuc2xhbmQvTD1CcmlzYmFuZS9PPUNyeXB0c29mdCBQdHkgTHRkL09VPURFTU9OU1RSQVRJT04gQU5EIFRFU1RJTkcvQ049REVNTyBaRVJPIFZBTFVFIENBCitzdWJqZWN0Oi9DPUFVL1NQPVF1ZWVuc2xhbmQvTD1CcmlzYmFuZS9PPUNyeXB0c29mdCBQdHkgTHRkL09VPVNNSU1FIDAwMy9DTj1JbmZvcm1hdGlvbi9FbWFpbD1pbmZvQGNyeXB0c29mdC5jb20KK3NlcmlhbCA6MDQ3RAorCitDZXJ0aWZpY2F0ZToKKyAgICBEYXRhOgorICAgICAgICBWZXJzaW9uOiAzICgweDIpCisgICAgICAgIFNlcmlhbCBOdW1iZXI6IDExNDkgKDB4NDdkKQorICAgICAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDV3aXRoUlNBRW5jcnlwdGlvbgorICAgICAgICBJc3N1ZXI6IEM9QVUsIFNQPVF1ZWVuc2xhbmQsIEw9QnJpc2JhbmUsIE89Q3J5cHRzb2Z0IFB0eSBMdGQsIE9VPURFTU9OU1RSQVRJT04gQU5EIFRFU1RJTkcsIENOPURFTU8gWkVSTyBWQUxVRSBDQQorICAgICAgICBWYWxpZGl0eQorICAgICAgICAgICAgTm90IEJlZm9yZTogTWF5IDEzIDA1OjQwOjU4IDE5OTggR01UCisgICAgICAgICAgICBOb3QgQWZ0ZXIgOiBNYXkgMTIgMDU6NDA6NTggMjAwMCBHTVQKKyAgICAgICAgU3ViamVjdDogQz1BVSwgU1A9UXVlZW5zbGFuZCwgTD1CcmlzYmFuZSwgTz1DcnlwdHNvZnQgUHR5IEx0ZCwgT1U9U01JTUUgMDAzLCBDTj1JbmZvcm1hdGlvbi9FbWFpbD1pbmZvQGNyeXB0c29mdC5jb20KKyAgICAgICAgU3ViamVjdCBQdWJsaWMgS2V5IEluZm86CisgICAgICAgICAgICBQdWJsaWMgS2V5IEFsZ29yaXRobTogcnNhRW5jcnlwdGlvbgorICAgICAgICAgICAgICAgIE1vZHVsdXM6CisgICAgICAgICAgICAgICAgICAgIDAwOmFkOmU3OjIzOjg5OmVlOjBkOjg3OmI3OjljOjMyOjQ0OjRiOjk1OjgxOgorICAgICAgICAgICAgICAgICAgICA3MzpkZDoyMjo4MDo0YjoyZDpjNTo2MDpiODpmZToxZToxODo2MzplZjpkYzoKKyAgICAgICAgICAgICAgICAgICAgODk6ODk6MjI6ZGY6OTU6M2M6N2E6ZGI6M2Q6OWE6MDY6YTg6MDg6ZDY6Mjk6CisgICAgICAgICAgICAgICAgICAgIGZkOmVmOjQxOjA5OjkxOmVkOmJjOmFkOjk4OmY5OmY2OjI4OjkwOjYyOjZmOgorICAgICAgICAgICAgICAgICAgICBlNzplNzowYzo0ZDowYgorICAgICAgICAgICAgICAgIEV4cG9uZW50OiA2NTUzNyAoMHgxMDAwMSkKKyAgICAgICAgWDUwOXYzIGV4dGVuc2lvbnM6CisgICAgICAgICAgICBOZXRzY2FwZSBDb21tZW50OiAKKyAgICAgICAgICAgICAgICBHZW5lcmF0ZWQgd2l0aCBTU0xlYXkKKyAgICBTaWduYXR1cmUgQWxnb3JpdGhtOiBtZDV3aXRoUlNBRW5jcnlwdGlvbgorICAgICAgICA1MjoxNTplYTo4ODpmNDpmMDpmOTowYjplZjpjZTpkNTpmODo4Mzo0MDo2MToxNjo1ZTo1NToKKyAgICAgICAgZjk6Y2U6MmQ6ZDE6OGI6MzE6NWM6MDM6YzY6MmQ6MTA6N2M6NjE6ZDU6NWM6MGE6NDI6OTc6CisgICAgICAgIGQxOmZkOjY1OmI2OmI2Ojg0OmE1OjM5OmVjOjQ2OmVjOmZjOmUwOjBkOmQ5OjIyOmRhOjFiOgorICAgICAgICA1MDo3NDphZDo5MjpjYjo0ZTo5MDplNTpmYTo3ZAorCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNURENDQWZhZ0F3SUJBZ0lDQkgwd0RRWUpLb1pJaHZjTkFRRUVCUUF3Z1pJeEN6QUpCZ05WQkFZVEFrRlYKK01STXdFUVlEVlFRSUV3cFJkV1ZsYm5Oc1lXNWtNUkV3RHdZRFZRUUhFd2hDY21selltRnVaVEVhTUJnR0ExVUUKK0NoTVJRM0o1Y0hSemIyWjBJRkIwZVNCTWRHUXhJakFnQmdOVkJBc1RHVVJGVFU5T1UxUlNRVlJKVDA0Z1FVNUUKK0lGUkZVMVJKVGtjeEd6QVpCZ05WQkFNVEVrUkZUVThnV2tWU1R5QldRVXhWUlNCRFFUQWVGdzA1T0RBMU1UTXcKK05UUXdOVGhhRncwd01EQTFNVEl3TlRRd05UaGFNSUdlTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUsKK1VYVmxaVzV6YkdGdVpERVJNQThHQTFVRUJ4TUlRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW0KK2RDQlFkSGtnVEhSa01SSXdFQVlEVlFRTEV3bFRUVWxOUlNBd01ETXhGREFTQmdOVkJBTVRDMGx1Wm05eWJXRjAKK2FXOXVNU0V3SHdZSktvWklodmNOQVFrQkZoSnBibVp2UUdOeWVYQjBjMjltZEM1amIyMHdYREFOQmdrcWhraUcKKzl3MEJBUUVGQUFOTEFEQklBa0VBcmVjamllNE5oN2VjTWtSTGxZRnozU0tBU3kzRllMaitIaGhqNzl5SmlTTGYKK2xUeDYyejJhQnFnSTFpbjk3MEVKa2UyOHJaajU5aWlRWW0vbjV3eE5Dd0lEQVFBQm95Z3dKakFrQmdsZ2hrZ0IKK2h2aENBUTBFRnhZVlIyVnVaWEpoZEdWa0lIZHBkR2dnVTFOTVpXRjVNQTBHQ1NxR1NJYjNEUUVCQkFVQUEwRUEKK1VoWHFpUFR3K1F2dnp0WDRnMEJoRmw1VitjNHQwWXN4WEFQR0xSQjhZZFZjQ2tLWDBmMWx0cmFFcFRuc1J1ejgKKzRBM1pJdG9iVUhTdGtzdE9rT1g2ZlE9PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorCistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlCT2dJQkFBSkJBSzNuSTRudURZZTNuREpFUzVXQmM5MGlnRXN0eFdDNC9oNFlZKy9jaVlraTM1VThldHM5CittZ2FvQ05ZcC9lOUJDWkh0dksyWStmWW9rR0p2NStjTVRRc0NBd0VBQVFKQkFJSHB2WHZxRWNPRW9EUlJIdUlHCitma2NCNGpQSGNyOUtFOVRweGFiSDZ4czliZU42T0pua2VQWEFId2F6NU1uVWdTbmJwT0txK2N3OG1pS2pYd2UvCit6VkVDSVFEVkx3bmNUMmxSbVhhckVZSHpiK3EvMHVhU3ZLaFdLS3Qza0phc0xOVHJBd0loQU5EVWMvZ2h1dDI5CitwM2pKWWp1cnpVS3VHNzc0LzVlTGpQTHN4UFBJWnpOWkFpQS8xMGhTcTQxVW5HcUhMRVVJUzltMi9FZUVaZTdiCitibTU2N2RmUlU5T25WUUlnRG84Uk9yWlhTY2hFR2Jhb2c1SjVyL0ZsZTgzdU84bDkzUjNHcVZ4S1haa0NJRmZrCitJUEQ1UElZUUF5eW9kM2h5S0t6YTdaUDRDR1k0b09mWmV0YmtTR0dHCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2luZm9rZXkucGVtIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L2luZm9rZXkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmFjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvaW5mb2tleS5wZW0KQEAgLTAsMCArMSw5IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlCT2dJQkFBSkJBSzNuSTRudURZZTNuREpFUzVXQmM5MGlnRXN0eFdDNC9oNFlZKy9jaVlraTM1VThldHM5CittZ2FvQ05ZcC9lOUJDWkh0dksyWStmWW9rR0p2NStjTVRRc0NBd0VBQVFKQkFJSHB2WHZxRWNPRW9EUlJIdUlHCitma2NCNGpQSGNyOUtFOVRweGFiSDZ4czliZU42T0pua2VQWEFId2F6NU1uVWdTbmJwT0txK2N3OG1pS2pYd2UvCit6VkVDSVFEVkx3bmNUMmxSbVhhckVZSHpiK3EvMHVhU3ZLaFdLS3Qza0phc0xOVHJBd0loQU5EVWMvZ2h1dDI5CitwM2pKWWp1cnpVS3VHNzc0LzVlTGpQTHN4UFBJWnpOWkFpQS8xMGhTcTQxVW5HcUhMRVVJUzltMi9FZUVaZTdiCitibTU2N2RmUlU5T25WUUlnRG84Uk9yWlhTY2hFR2Jhb2c1SjVyL0ZsZTgzdU84bDkzUjNHcVZ4S1haa0NJRmZrCitJUEQ1UElZUUF5eW9kM2h5S0t6YTdaUDRDR1k0b09mWmV0YmtTR0dHCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3A3L2ExIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3A3L2ExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2E5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcDcvYTEKQEAgLTAsMCArMSwyIEBACitqLARIPhJfFebhEF+tRPR6EQYPRe5MnAlWSrPf6KesEKSUHZRFM/vhWQjkeCUaX8BrCisz6ilETFNj8TgZJQz0TQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wNy9hMiBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wNy9hMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2Q4ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3A3L2EyCkBAIC0wLDAgKzEgQEAKK2t+QGGULE7iTQYVHc25vAkBPE8oIEtQl+mooKRLsj6t1xZVv29fvRABBEJxcm3OP9mgdD9094HPgelJZAUyiYoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcDcvY2VydC5wN2MgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcDcvY2VydC5wN2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3NWVjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wNy9jZXJ0LnA3YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcDcvc21pbWUucDdtIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3A3L3NtaW1lLnA3bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjZlNmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3A3L3NtaW1lLnA3bQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcDcvc21pbWUucDdzIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3A3L3NtaW1lLnA3cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjVkNGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3A3L3NtaW1lLnA3cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcGs3X2FzbjEuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWMyODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcGs3X2FzbjEuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogcGs3X2Fzbi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M3Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKy8qIFBLQ1MjNyBBU04xIG1vZHVsZSAqLworCisvKiBUaGlzIGlzIHRoZSBBTlkgREVGSU5FRCBCWSB0YWJsZSBmb3IgdGhlIHRvcCBsZXZlbCBQS0NTIzcgc3RydWN0dXJlICovCisKK0FTTjFfQURCX1RFTVBMQVRFKHA3ZGVmYXVsdCkgPSBBU04xX0VYUF9PUFQoUEtDUzcsIGQub3RoZXIsIEFTTjFfQU5ZLCAwKTsKKworQVNOMV9BREIoUEtDUzcpID0geworCUFEQl9FTlRSWShOSURfcGtjczdfZGF0YSwgQVNOMV9OREVGX0VYUF9PUFQoUEtDUzcsIGQuZGF0YSwgQVNOMV9PQ1RFVF9TVFJJTkdfTkRFRiwgMCkpLAorCUFEQl9FTlRSWShOSURfcGtjczdfc2lnbmVkLCBBU04xX05ERUZfRVhQX09QVChQS0NTNywgZC5zaWduLCBQS0NTN19TSUdORUQsIDApKSwKKwlBREJfRU5UUlkoTklEX3BrY3M3X2VudmVsb3BlZCwgQVNOMV9OREVGX0VYUF9PUFQoUEtDUzcsIGQuZW52ZWxvcGVkLCBQS0NTN19FTlZFTE9QRSwgMCkpLAorCUFEQl9FTlRSWShOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkLCBBU04xX05ERUZfRVhQX09QVChQS0NTNywgZC5zaWduZWRfYW5kX2VudmVsb3BlZCwgUEtDUzdfU0lHTl9FTlZFTE9QRSwgMCkpLAorCUFEQl9FTlRSWShOSURfcGtjczdfZGlnZXN0LCBBU04xX05ERUZfRVhQX09QVChQS0NTNywgZC5kaWdlc3QsIFBLQ1M3X0RJR0VTVCwgMCkpLAorCUFEQl9FTlRSWShOSURfcGtjczdfZW5jcnlwdGVkLCBBU04xX05ERUZfRVhQX09QVChQS0NTNywgZC5lbmNyeXB0ZWQsIFBLQ1M3X0VOQ1JZUFQsIDApKQorfSBBU04xX0FEQl9FTkQoUEtDUzcsIDAsIHR5cGUsIDAsICZwN2RlZmF1bHRfdHQsIE5VTEwpOworCisvKiBQS0NTIzcgc3RyZWFtaW5nIHN1cHBvcnQgKi8KK3N0YXRpYyBpbnQgcGs3X2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCUFTTjFfU1RSRUFNX0FSRyAqc2FyZyA9IGV4YXJnOworCVBLQ1M3ICoqcHA3ID0gKFBLQ1M3ICoqKXB2YWw7CisKKwlzd2l0Y2gob3BlcmF0aW9uKQorCQl7CisKKwkJY2FzZSBBU04xX09QX1NUUkVBTV9QUkU6CisJCWlmIChQS0NTN19zdHJlYW0oJnNhcmctPmJvdW5kYXJ5LCAqcHA3KSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCWNhc2UgQVNOMV9PUF9ERVRBQ0hFRF9QUkU6CisJCXNhcmctPm5kZWZfYmlvID0gUEtDUzdfZGF0YUluaXQoKnBwNywgc2FyZy0+b3V0KTsKKwkJaWYgKCFzYXJnLT5uZGVmX2JpbykKKwkJCXJldHVybiAwOworCQlicmVhazsKKworCQljYXNlIEFTTjFfT1BfU1RSRUFNX1BPU1Q6CisJCWNhc2UgQVNOMV9PUF9ERVRBQ0hFRF9QT1NUOgorCQlpZiAoUEtDUzdfZGF0YUZpbmFsKCpwcDcsIHNhcmctPm5kZWZfYmlvKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJCX0KKwlyZXR1cm4gMTsKK30KKworQVNOMV9OREVGX1NFUVVFTkNFX2NiKFBLQ1M3LCBwazdfY2IpID0geworCUFTTjFfU0lNUExFKFBLQ1M3LCB0eXBlLCBBU04xX09CSkVDVCksCisJQVNOMV9BREJfT0JKRUNUKFBLQ1M3KQorfUFTTjFfTkRFRl9TRVFVRU5DRV9FTkRfY2IoUEtDUzcsIFBLQ1M3KQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEtDUzcpCitJTVBMRU1FTlRfQVNOMV9OREVGX0ZVTkNUSU9OKFBLQ1M3KQorSU1QTEVNRU5UX0FTTjFfRFVQX0ZVTkNUSU9OKFBLQ1M3KQorCitBU04xX05ERUZfU0VRVUVOQ0UoUEtDUzdfU0lHTkVEKSA9IHsKKwlBU04xX1NJTVBMRShQS0NTN19TSUdORUQsIHZlcnNpb24sIEFTTjFfSU5URUdFUiksCisJQVNOMV9TRVRfT0YoUEtDUzdfU0lHTkVELCBtZF9hbGdzLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShQS0NTN19TSUdORUQsIGNvbnRlbnRzLCBQS0NTNyksCisJQVNOMV9JTVBfU0VRVUVOQ0VfT0ZfT1BUKFBLQ1M3X1NJR05FRCwgY2VydCwgWDUwOSwgMCksCisJQVNOMV9JTVBfU0VUX09GX09QVChQS0NTN19TSUdORUQsIGNybCwgWDUwOV9DUkwsIDEpLAorCUFTTjFfU0VUX09GKFBLQ1M3X1NJR05FRCwgc2lnbmVyX2luZm8sIFBLQ1M3X1NJR05FUl9JTkZPKQorfSBBU04xX05ERUZfU0VRVUVOQ0VfRU5EKFBLQ1M3X1NJR05FRCkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X1NJR05FRCkKKworLyogTWlub3IgdHdlYWsgdG8gb3BlcmF0aW9uOiBmcmVlIHVwIEVWUF9QS0VZICovCitzdGF0aWMgaW50IHNpX2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQkJCXZvaWQgKmV4YXJnKQoreworCWlmKG9wZXJhdGlvbiA9PSBBU04xX09QX0ZSRUVfUE9TVCkgeworCQlQS0NTN19TSUdORVJfSU5GTyAqc2kgPSAoUEtDUzdfU0lHTkVSX0lORk8gKikqcHZhbDsKKwkJRVZQX1BLRVlfZnJlZShzaS0+cGtleSk7CisJfQorCXJldHVybiAxOworfQorCitBU04xX1NFUVVFTkNFX2NiKFBLQ1M3X1NJR05FUl9JTkZPLCBzaV9jYikgPSB7CisJQVNOMV9TSU1QTEUoUEtDUzdfU0lHTkVSX0lORk8sIHZlcnNpb24sIEFTTjFfSU5URUdFUiksCisJQVNOMV9TSU1QTEUoUEtDUzdfU0lHTkVSX0lORk8sIGlzc3Vlcl9hbmRfc2VyaWFsLCBQS0NTN19JU1NVRVJfQU5EX1NFUklBTCksCisJQVNOMV9TSU1QTEUoUEtDUzdfU0lHTkVSX0lORk8sIGRpZ2VzdF9hbGcsIFg1MDlfQUxHT1IpLAorCS8qIE5CIHRoaXMgc2hvdWxkIGJlIGEgU0VUIE9GIGJ1dCB3ZSB1c2UgYSBTRVFVRU5DRSBPRiBzbyB0aGUKKwkgKiBvcmlnaW5hbCBvcmRlciAqIGlzIHJldGFpbmVkIHdoZW4gdGhlIHN0cnVjdHVyZSBpcyByZWVuY29kZWQuCisJICogU2luY2UgdGhlIGF0dHJpYnV0ZXMgYXJlIGltcGxpY2l0bHkgdGFnZ2VkIHRoaXMgd2lsbCBub3QgYWZmZWN0CisJICogdGhlIGVuY29kaW5nLgorCSAqLworCUFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChQS0NTN19TSUdORVJfSU5GTywgYXV0aF9hdHRyLCBYNTA5X0FUVFJJQlVURSwgMCksCisJQVNOMV9TSU1QTEUoUEtDUzdfU0lHTkVSX0lORk8sIGRpZ2VzdF9lbmNfYWxnLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShQS0NTN19TSUdORVJfSU5GTywgZW5jX2RpZ2VzdCwgQVNOMV9PQ1RFVF9TVFJJTkcpLAorCUFTTjFfSU1QX1NFVF9PRl9PUFQoUEtDUzdfU0lHTkVSX0lORk8sIHVuYXV0aF9hdHRyLCBYNTA5X0FUVFJJQlVURSwgMSkKK30gQVNOMV9TRVFVRU5DRV9FTkRfY2IoUEtDUzdfU0lHTkVSX0lORk8sIFBLQ1M3X1NJR05FUl9JTkZPKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEtDUzdfU0lHTkVSX0lORk8pCisKK0FTTjFfU0VRVUVOQ0UoUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwpID0geworCUFTTjFfU0lNUExFKFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMLCBpc3N1ZXIsIFg1MDlfTkFNRSksCisJQVNOMV9TSU1QTEUoUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwsIHNlcmlhbCwgQVNOMV9JTlRFR0VSKQorfSBBU04xX1NFUVVFTkNFX0VORChQS0NTN19JU1NVRVJfQU5EX1NFUklBTCkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMKQorCitBU04xX05ERUZfU0VRVUVOQ0UoUEtDUzdfRU5WRUxPUEUpID0geworCUFTTjFfU0lNUExFKFBLQ1M3X0VOVkVMT1BFLCB2ZXJzaW9uLCBBU04xX0lOVEVHRVIpLAorCUFTTjFfU0VUX09GKFBLQ1M3X0VOVkVMT1BFLCByZWNpcGllbnRpbmZvLCBQS0NTN19SRUNJUF9JTkZPKSwKKwlBU04xX1NJTVBMRShQS0NTN19FTlZFTE9QRSwgZW5jX2RhdGEsIFBLQ1M3X0VOQ19DT05URU5UKQorfSBBU04xX05ERUZfU0VRVUVOQ0VfRU5EKFBLQ1M3X0VOVkVMT1BFKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEtDUzdfRU5WRUxPUEUpCisKKy8qIE1pbm9yIHR3ZWFrIHRvIG9wZXJhdGlvbjogZnJlZSB1cCBYNTA5ICovCitzdGF0aWMgaW50IHJpX2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQkJCQl2b2lkICpleGFyZykKK3sKKwlpZihvcGVyYXRpb24gPT0gQVNOMV9PUF9GUkVFX1BPU1QpIHsKKwkJUEtDUzdfUkVDSVBfSU5GTyAqcmkgPSAoUEtDUzdfUkVDSVBfSU5GTyAqKSpwdmFsOworCQlYNTA5X2ZyZWUocmktPmNlcnQpOworCX0KKwlyZXR1cm4gMTsKK30KKworQVNOMV9TRVFVRU5DRV9jYihQS0NTN19SRUNJUF9JTkZPLCByaV9jYikgPSB7CisJQVNOMV9TSU1QTEUoUEtDUzdfUkVDSVBfSU5GTywgdmVyc2lvbiwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NJTVBMRShQS0NTN19SRUNJUF9JTkZPLCBpc3N1ZXJfYW5kX3NlcmlhbCwgUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwpLAorCUFTTjFfU0lNUExFKFBLQ1M3X1JFQ0lQX0lORk8sIGtleV9lbmNfYWxnb3IsIFg1MDlfQUxHT1IpLAorCUFTTjFfU0lNUExFKFBLQ1M3X1JFQ0lQX0lORk8sIGVuY19rZXksIEFTTjFfT0NURVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORF9jYihQS0NTN19SRUNJUF9JTkZPLCBQS0NTN19SRUNJUF9JTkZPKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEtDUzdfUkVDSVBfSU5GTykKKworQVNOMV9OREVGX1NFUVVFTkNFKFBLQ1M3X0VOQ19DT05URU5UKSA9IHsKKwlBU04xX1NJTVBMRShQS0NTN19FTkNfQ09OVEVOVCwgY29udGVudF90eXBlLCBBU04xX09CSkVDVCksCisJQVNOMV9TSU1QTEUoUEtDUzdfRU5DX0NPTlRFTlQsIGFsZ29yaXRobSwgWDUwOV9BTEdPUiksCisJQVNOMV9JTVBfT1BUKFBLQ1M3X0VOQ19DT05URU5ULCBlbmNfZGF0YSwgQVNOMV9PQ1RFVF9TVFJJTkdfTkRFRiwgMCkKK30gQVNOMV9OREVGX1NFUVVFTkNFX0VORChQS0NTN19FTkNfQ09OVEVOVCkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X0VOQ19DT05URU5UKQorCitBU04xX05ERUZfU0VRVUVOQ0UoUEtDUzdfU0lHTl9FTlZFTE9QRSkgPSB7CisJQVNOMV9TSU1QTEUoUEtDUzdfU0lHTl9FTlZFTE9QRSwgdmVyc2lvbiwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NFVF9PRihQS0NTN19TSUdOX0VOVkVMT1BFLCByZWNpcGllbnRpbmZvLCBQS0NTN19SRUNJUF9JTkZPKSwKKwlBU04xX1NFVF9PRihQS0NTN19TSUdOX0VOVkVMT1BFLCBtZF9hbGdzLCBYNTA5X0FMR09SKSwKKwlBU04xX1NJTVBMRShQS0NTN19TSUdOX0VOVkVMT1BFLCBlbmNfZGF0YSwgUEtDUzdfRU5DX0NPTlRFTlQpLAorCUFTTjFfSU1QX1NFVF9PRl9PUFQoUEtDUzdfU0lHTl9FTlZFTE9QRSwgY2VydCwgWDUwOSwgMCksCisJQVNOMV9JTVBfU0VUX09GX09QVChQS0NTN19TSUdOX0VOVkVMT1BFLCBjcmwsIFg1MDlfQ1JMLCAxKSwKKwlBU04xX1NFVF9PRihQS0NTN19TSUdOX0VOVkVMT1BFLCBzaWduZXJfaW5mbywgUEtDUzdfU0lHTkVSX0lORk8pCit9IEFTTjFfTkRFRl9TRVFVRU5DRV9FTkQoUEtDUzdfU0lHTl9FTlZFTE9QRSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X1NJR05fRU5WRUxPUEUpCisKK0FTTjFfTkRFRl9TRVFVRU5DRShQS0NTN19FTkNSWVBUKSA9IHsKKwlBU04xX1NJTVBMRShQS0NTN19FTkNSWVBULCB2ZXJzaW9uLCBBU04xX0lOVEVHRVIpLAorCUFTTjFfU0lNUExFKFBLQ1M3X0VOQ1JZUFQsIGVuY19kYXRhLCBQS0NTN19FTkNfQ09OVEVOVCkKK30gQVNOMV9OREVGX1NFUVVFTkNFX0VORChQS0NTN19FTkNSWVBUKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEtDUzdfRU5DUllQVCkKKworQVNOMV9OREVGX1NFUVVFTkNFKFBLQ1M3X0RJR0VTVCkgPSB7CisJQVNOMV9TSU1QTEUoUEtDUzdfRElHRVNULCB2ZXJzaW9uLCBBU04xX0lOVEVHRVIpLAorCUFTTjFfU0lNUExFKFBLQ1M3X0RJR0VTVCwgbWQsIFg1MDlfQUxHT1IpLAorCUFTTjFfU0lNUExFKFBLQ1M3X0RJR0VTVCwgY29udGVudHMsIFBLQ1M3KSwKKwlBU04xX1NJTVBMRShQS0NTN19ESUdFU1QsIGRpZ2VzdCwgQVNOMV9PQ1RFVF9TVFJJTkcpCit9IEFTTjFfTkRFRl9TRVFVRU5DRV9FTkQoUEtDUzdfRElHRVNUKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoUEtDUzdfRElHRVNUKQorCisvKiBTcGVjaWFscyBmb3IgYXV0aGVudGljYXRlZCBhdHRyaWJ1dGVzICovCisKKy8qIFdoZW4gc2lnbmluZyBhdHRyaWJ1dGVzIHdlIHdhbnQgdG8gcmVvcmRlciB0aGVtIHRvIG1hdGNoIHRoZSBzb3J0ZWQKKyAqIGVuY29kaW5nLgorICovCisKK0FTTjFfSVRFTV9URU1QTEFURShQS0NTN19BVFRSX1NJR04pID0gCisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19TRVRfT1JERVIsIDAsIFBLQ1M3X0FUVFJJQlVURVMsIFg1MDlfQVRUUklCVVRFKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChQS0NTN19BVFRSX1NJR04pCisKKy8qIFdoZW4gdmVyaWZ5aW5nIGF0dHJpYnV0ZXMgd2UgbmVlZCB0byB1c2UgdGhlIHJlY2VpdmVkIG9yZGVyLiBTbyAKKyAqIHdlIHVzZSBTRVFVRU5DRSBPRiBhbmQgdGFnIGl0IHRvIFNFVCBPRgorICovCisKK0FTTjFfSVRFTV9URU1QTEFURShQS0NTN19BVFRSX1ZFUklGWSkgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GIHwgQVNOMV9URkxHX0lNUFRBRyB8IEFTTjFfVEZMR19VTklWRVJTQUwsCisJCQkJVl9BU04xX1NFVCwgUEtDUzdfQVRUUklCVVRFUywgWDUwOV9BVFRSSUJVVEUpCitBU04xX0lURU1fVEVNUExBVEVfRU5EKFBLQ1M3X0FUVFJfVkVSSUZZKQorCitJTVBMRU1FTlRfQVNOMV9QUklOVF9GVU5DVElPTihQS0NTNykKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfYXR0ci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19hdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3ZGI1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfYXR0ci5jCkBAIC0wLDAgKzEsMTY1IEBACisvKiBwazdfYXR0ci5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wa2NzNy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKK2ludCBQS0NTN19hZGRfYXR0cmliX3NtaW1lY2FwKFBLQ1M3X1NJR05FUl9JTkZPICpzaSwgU1RBQ0tfT0YoWDUwOV9BTEdPUikgKmNhcCkKK3sKKwlBU04xX1NUUklORyAqc2VxOworCWlmKCEoc2VxID0gQVNOMV9TVFJJTkdfbmV3KCkpKSB7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfQUREX0FUVFJJQl9TTUlNRUNBUCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKwlzZXEtPmxlbmd0aCA9IEFTTjFfaXRlbV9pMmQoKEFTTjFfVkFMVUUgKiljYXAsJnNlcS0+ZGF0YSwKKwkJCQlBU04xX0lURU1fcnB0cihYNTA5X0FMR09SUykpOworICAgICAgICByZXR1cm4gUEtDUzdfYWRkX3NpZ25lZF9hdHRyaWJ1dGUoc2ksIE5JRF9TTUlNRUNhcGFiaWxpdGllcywKKwkJCQkJCQlWX0FTTjFfU0VRVUVOQ0UsIHNlcSk7Cit9CisKK1NUQUNLX09GKFg1MDlfQUxHT1IpICpQS0NTN19nZXRfc21pbWVjYXAoUEtDUzdfU0lHTkVSX0lORk8gKnNpKQorCXsKKwlBU04xX1RZUEUgKmNhcDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCisJY2FwID0gUEtDUzdfZ2V0X3NpZ25lZF9hdHRyaWJ1dGUoc2ksIE5JRF9TTUlNRUNhcGFiaWxpdGllcyk7CisJaWYgKCFjYXAgfHwgKGNhcC0+dHlwZSAhPSBWX0FTTjFfU0VRVUVOQ0UpKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gY2FwLT52YWx1ZS5zZXF1ZW5jZS0+ZGF0YTsKKwlyZXR1cm4gKFNUQUNLX09GKFg1MDlfQUxHT1IpICopCisJCUFTTjFfaXRlbV9kMmkoTlVMTCwgJnAsIGNhcC0+dmFsdWUuc2VxdWVuY2UtPmxlbmd0aCwKKwkJCQlBU04xX0lURU1fcnB0cihYNTA5X0FMR09SUykpOworCX0KKworLyogQmFzaWMgc21pbWUtY2FwYWJpbGl0aWVzIE9JRCBhbmQgb3B0aW9uYWwgaW50ZWdlciBhcmcgKi8KK2ludCBQS0NTN19zaW1wbGVfc21pbWVjYXAoU1RBQ0tfT0YoWDUwOV9BTEdPUikgKnNrLCBpbnQgbmlkLCBpbnQgYXJnKQoreworCVg1MDlfQUxHT1IgKmFsZzsKKworCWlmKCEoYWxnID0gWDUwOV9BTEdPUl9uZXcoKSkpIHsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TSU1QTEVfU01JTUVDQVAsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwl9CisJQVNOMV9PQkpFQ1RfZnJlZShhbGctPmFsZ29yaXRobSk7CisJYWxnLT5hbGdvcml0aG0gPSBPQkpfbmlkMm9iaiAobmlkKTsKKwlpZiAoYXJnID4gMCkgeworCQlBU04xX0lOVEVHRVIgKm5iaXQ7CisJCWlmKCEoYWxnLT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCkpKSB7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NJTVBMRV9TTUlNRUNBUCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZighKG5iaXQgPSBBU04xX0lOVEVHRVJfbmV3KCkpKSB7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NJTVBMRV9TTUlNRUNBUCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZighQVNOMV9JTlRFR0VSX3NldCAobmJpdCwgYXJnKSkgeworCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TSU1QTEVfU01JTUVDQVAsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYWxnLT5wYXJhbWV0ZXItPnZhbHVlLmludGVnZXIgPSBuYml0OworCQlhbGctPnBhcmFtZXRlci0+dHlwZSA9IFZfQVNOMV9JTlRFR0VSOworCX0KKwlza19YNTA5X0FMR09SX3B1c2ggKHNrLCBhbGcpOworCXJldHVybiAxOworfQorCitpbnQgUEtDUzdfYWRkX2F0dHJpYl9jb250ZW50X3R5cGUoUEtDUzdfU0lHTkVSX0lORk8gKnNpLCBBU04xX09CSkVDVCAqY29pZCkKKwl7CisJaWYgKFBLQ1M3X2dldF9zaWduZWRfYXR0cmlidXRlKHNpLCBOSURfcGtjczlfY29udGVudFR5cGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWNvaWQpCisJCWNvaWQgPSBPQkpfbmlkMm9iaihOSURfcGtjczdfZGF0YSk7CisJcmV0dXJuIFBLQ1M3X2FkZF9zaWduZWRfYXR0cmlidXRlKHNpLCBOSURfcGtjczlfY29udGVudFR5cGUsCisJCQkJVl9BU04xX09CSkVDVCwgY29pZCk7CisJfQorCitpbnQgUEtDUzdfYWRkMF9hdHRyaWJfc2lnbmluZ190aW1lKFBLQ1M3X1NJR05FUl9JTkZPICpzaSwgQVNOMV9USU1FICp0KQorCXsKKwlpZiAoIXQgJiYgISh0PVg1MDlfZ210aW1lX2FkaihOVUxMLDApKSkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0FERDBfQVRUUklCX1NJR05JTkdfVElNRSwKKwkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIFBLQ1M3X2FkZF9zaWduZWRfYXR0cmlidXRlKHNpLCBOSURfcGtjczlfc2lnbmluZ1RpbWUsCisJCQkJCQlWX0FTTjFfVVRDVElNRSwgdCk7CisJfQorCitpbnQgUEtDUzdfYWRkMV9hdHRyaWJfZGlnZXN0KFBLQ1M3X1NJR05FUl9JTkZPICpzaSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICptZCwgaW50IG1kbGVuKQorCXsKKwlBU04xX09DVEVUX1NUUklORyAqb3M7CisJb3MgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwlpZiAoIW9zKQorCQlyZXR1cm4gMDsKKwlpZiAoIUFTTjFfU1RSSU5HX3NldChvcywgbWQsIG1kbGVuKQorCQl8fCAhUEtDUzdfYWRkX3NpZ25lZF9hdHRyaWJ1dGUoc2ksIE5JRF9wa2NzOV9tZXNzYWdlRGlnZXN0LAorCQkJCQkJVl9BU04xX09DVEVUX1NUUklORywgb3MpKQorCQl7CisJCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfZGdzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19kZ3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlZGZhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfZGdzdC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIGNyeXB0by9wa2NzNy9wazdfZGdzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M3Lmg+CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfZG9pdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19kb2l0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxZGU4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfZG9pdC5jCkBAIC0wLDAgKzEsMTI1MSBAQAorLyogY3J5cHRvL3BrY3M3L3BrN19kb2l0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisKK3N0YXRpYyBpbnQgYWRkX2F0dHJpYnV0ZShTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKipzaywgaW50IG5pZCwgaW50IGF0cnR5cGUsCisJCQkgdm9pZCAqdmFsdWUpOworc3RhdGljIEFTTjFfVFlQRSAqZ2V0X2F0dHJpYnV0ZShTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKnNrLCBpbnQgbmlkKTsKKworc3RhdGljIGludCBQS0NTN190eXBlX2lzX290aGVyKFBLQ1M3KiBwNykKKwl7CisJaW50IGlzT3RoZXI9MTsKKwkKKwlpbnQgbmlkPU9CSl9vYmoybmlkKHA3LT50eXBlKTsKKworCXN3aXRjaCggbmlkICkKKwkJeworCWNhc2UgTklEX3BrY3M3X2RhdGE6CisJY2FzZSBOSURfcGtjczdfc2lnbmVkOgorCWNhc2UgTklEX3BrY3M3X2VudmVsb3BlZDoKKwljYXNlIE5JRF9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQ6CisJY2FzZSBOSURfcGtjczdfZGlnZXN0OgorCWNhc2UgTklEX3BrY3M3X2VuY3J5cHRlZDoKKwkJaXNPdGhlcj0wOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpc090aGVyPTE7CisJCX0KKworCXJldHVybiBpc090aGVyOworCisJfQorCitzdGF0aWMgQVNOMV9PQ1RFVF9TVFJJTkcgKlBLQ1M3X2dldF9vY3RldF9zdHJpbmcoUEtDUzcgKnA3KQorCXsKKwlpZiAoIFBLQ1M3X3R5cGVfaXNfZGF0YShwNykpCisJCXJldHVybiBwNy0+ZC5kYXRhOworCWlmICggUEtDUzdfdHlwZV9pc19vdGhlcihwNykgJiYgcDctPmQub3RoZXIKKwkJJiYgKHA3LT5kLm90aGVyLT50eXBlID09IFZfQVNOMV9PQ1RFVF9TVFJJTkcpKQorCQlyZXR1cm4gcDctPmQub3RoZXItPnZhbHVlLm9jdGV0X3N0cmluZzsKKwlyZXR1cm4gTlVMTDsKKwl9CisKK3N0YXRpYyBpbnQgUEtDUzdfYmlvX2FkZF9kaWdlc3QoQklPICoqcGJpbywgWDUwOV9BTEdPUiAqYWxnKQorCXsKKwlCSU8gKmJ0bXA7CisJY29uc3QgRVZQX01EICptZDsKKwlpZiAoKGJ0bXA9QklPX25ldyhCSU9fZl9tZCgpKSkgPT0gTlVMTCkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0JJT19BRERfRElHRVNULEVSUl9SX0JJT19MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCisJbWQ9RVZQX2dldF9kaWdlc3RieW9iaihhbGctPmFsZ29yaXRobSk7CisJaWYgKG1kID09IE5VTEwpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19CSU9fQUREX0RJR0VTVCxQS0NTN19SX1VOS05PV05fRElHRVNUX1RZUEUpOworCQlnb3RvIGVycjsKKwkJfQorCisJQklPX3NldF9tZChidG1wLG1kKTsKKwlpZiAoKnBiaW8gPT0gTlVMTCkKKwkJKnBiaW89YnRtcDsKKwllbHNlIGlmICghQklPX3B1c2goKnBiaW8sYnRtcCkpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19CSU9fQUREX0RJR0VTVCxFUlJfUl9CSU9fTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwlidG1wPU5VTEw7CisKKwlyZXR1cm4gMTsKKworCWVycjoKKwlpZiAoYnRtcCkKKwkJQklPX2ZyZWUoYnRtcCk7CisJcmV0dXJuIDA7CisKKwl9CisKK3N0YXRpYyBpbnQgcGtjczdfZW5jb2RlX3JpbmZvKFBLQ1M3X1JFQ0lQX0lORk8gKnJpLAorCQkJCQl1bnNpZ25lZCBjaGFyICprZXksIGludCBrZXlsZW4pCisJeworCUVWUF9QS0VZX0NUWCAqcGN0eCA9IE5VTEw7CisJRVZQX1BLRVkgKnBrZXkgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmVrID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlzaXplX3QgZWtsZW47CisKKwlwa2V5ID0gWDUwOV9nZXRfcHVia2V5KHJpLT5jZXJ0KTsKKworCWlmICghcGtleSkKKwkJcmV0dXJuIDA7CisKKwlwY3R4ID0gRVZQX1BLRVlfQ1RYX25ldyhwa2V5LCBOVUxMKTsKKwlpZiAoIXBjdHgpCisJCXJldHVybiAwOworCisJaWYgKEVWUF9QS0VZX2VuY3J5cHRfaW5pdChwY3R4KSA8PSAwKQorCQlnb3RvIGVycjsKKworCWlmIChFVlBfUEtFWV9DVFhfY3RybChwY3R4LCAtMSwgRVZQX1BLRVlfT1BfRU5DUllQVCwKKwkJCQlFVlBfUEtFWV9DVFJMX1BLQ1M3X0VOQ1JZUFQsIDAsIHJpKSA8PSAwKQorCQl7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfRU5DT0RFX1JJTkZPLCBQS0NTN19SX0NUUkxfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKEVWUF9QS0VZX2VuY3J5cHQocGN0eCwgTlVMTCwgJmVrbGVuLCBrZXksIGtleWxlbikgPD0gMCkKKwkJZ290byBlcnI7CisKKwllayA9IE9QRU5TU0xfbWFsbG9jKGVrbGVuKTsKKworCWlmIChlayA9PSBOVUxMKQorCQl7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfRU5DT0RFX1JJTkZPLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoRVZQX1BLRVlfZW5jcnlwdChwY3R4LCBlaywgJmVrbGVuLCBrZXksIGtleWxlbikgPD0gMCkKKwkJZ290byBlcnI7CisKKwlBU04xX1NUUklOR19zZXQwKHJpLT5lbmNfa2V5LCBlaywgZWtsZW4pOworCWVrID0gTlVMTDsKKworCXJldCA9IDE7CisKKwllcnI6CisJaWYgKHBrZXkpCisJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJaWYgKHBjdHgpCisJCUVWUF9QS0VZX0NUWF9mcmVlKHBjdHgpOworCWlmIChlaykKKwkJT1BFTlNTTF9mcmVlKGVrKTsKKwlyZXR1cm4gcmV0OworCisJfQorCisKK3N0YXRpYyBpbnQgcGtjczdfZGVjcnlwdF9yaW5mbyh1bnNpZ25lZCBjaGFyICoqcGVrLCBpbnQgKnBla2xlbiwKKwkJCSAgICAgICBQS0NTN19SRUNJUF9JTkZPICpyaSwgRVZQX1BLRVkgKnBrZXkpCisJeworCUVWUF9QS0VZX0NUWCAqcGN0eCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqZWsgPSBOVUxMOworCXNpemVfdCBla2xlbjsKKworCWludCByZXQgPSAwOworCisJcGN0eCA9IEVWUF9QS0VZX0NUWF9uZXcocGtleSwgTlVMTCk7CisJaWYgKCFwY3R4KQorCQlyZXR1cm4gMDsKKworCWlmIChFVlBfUEtFWV9kZWNyeXB0X2luaXQocGN0eCkgPD0gMCkKKwkJZ290byBlcnI7CisKKwlpZiAoRVZQX1BLRVlfQ1RYX2N0cmwocGN0eCwgLTEsIEVWUF9QS0VZX09QX0RFQ1JZUFQsCisJCQkJRVZQX1BLRVlfQ1RSTF9QS0NTN19ERUNSWVBULCAwLCByaSkgPD0gMCkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RFQ1JZUFRfUklORk8sIFBLQ1M3X1JfQ1RSTF9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoRVZQX1BLRVlfZGVjcnlwdChwY3R4LCBOVUxMLCAmZWtsZW4sCisJCQkJcmktPmVuY19rZXktPmRhdGEsIHJpLT5lbmNfa2V5LT5sZW5ndGgpIDw9IDApCisJCWdvdG8gZXJyOworCisJZWsgPSBPUEVOU1NMX21hbGxvYyhla2xlbik7CisKKwlpZiAoZWsgPT0gTlVMTCkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RFQ1JZUFRfUklORk8sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChFVlBfUEtFWV9kZWNyeXB0KHBjdHgsIGVrLCAmZWtsZW4sCisJCQkJcmktPmVuY19rZXktPmRhdGEsIHJpLT5lbmNfa2V5LT5sZW5ndGgpIDw9IDApCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19ERUNSWVBUX1JJTkZPLCBFUlJfUl9FVlBfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCXJldCA9IDE7CisKKwkqcGVrID0gZWs7CisJKnBla2xlbiA9IGVrbGVuOworCisJZXJyOgorCWlmIChwY3R4KQorCQlFVlBfUEtFWV9DVFhfZnJlZShwY3R4KTsKKwlpZiAoIXJldCAmJiBlaykKKwkJT1BFTlNTTF9mcmVlKGVrKTsKKworCXJldHVybiByZXQ7CisJfQorCitCSU8gKlBLQ1M3X2RhdGFJbml0KFBLQ1M3ICpwNywgQklPICpiaW8pCisJeworCWludCBpOworCUJJTyAqb3V0PU5VTEwsKmJ0bXA9TlVMTDsKKwlYNTA5X0FMR09SICp4YSA9IE5VTEw7CisJY29uc3QgRVZQX0NJUEhFUiAqZXZwX2NpcGhlcj1OVUxMOworCVNUQUNLX09GKFg1MDlfQUxHT1IpICptZF9zaz1OVUxMOworCVNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICpyc2s9TlVMTDsKKwlYNTA5X0FMR09SICp4YWxnPU5VTEw7CisJUEtDUzdfUkVDSVBfSU5GTyAqcmk9TlVMTDsKKwlBU04xX09DVEVUX1NUUklORyAqb3M9TlVMTDsKKworCWk9T0JKX29iajJuaWQocDctPnR5cGUpOworCXA3LT5zdGF0ZT1QS0NTN19TX0hFQURFUjsKKworCXN3aXRjaCAoaSkKKwkJeworCWNhc2UgTklEX3BrY3M3X3NpZ25lZDoKKwkJbWRfc2s9cDctPmQuc2lnbi0+bWRfYWxnczsKKwkJb3MgPSBQS0NTN19nZXRfb2N0ZXRfc3RyaW5nKHA3LT5kLnNpZ24tPmNvbnRlbnRzKTsKKwkJYnJlYWs7CisJY2FzZSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkOgorCQlyc2s9cDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPnJlY2lwaWVudGluZm87CisJCW1kX3NrPXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5tZF9hbGdzOworCQl4YWxnPXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5lbmNfZGF0YS0+YWxnb3JpdGhtOworCQlldnBfY2lwaGVyPXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5lbmNfZGF0YS0+Y2lwaGVyOworCQlpZiAoZXZwX2NpcGhlciA9PSBOVUxMKQorCQkJeworCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19EQVRBSU5JVCwKKwkJCQkJCVBLQ1M3X1JfQ0lQSEVSX05PVF9JTklUSUFMSVpFRCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBOSURfcGtjczdfZW52ZWxvcGVkOgorCQlyc2s9cDctPmQuZW52ZWxvcGVkLT5yZWNpcGllbnRpbmZvOworCQl4YWxnPXA3LT5kLmVudmVsb3BlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobTsKKwkJZXZwX2NpcGhlcj1wNy0+ZC5lbnZlbG9wZWQtPmVuY19kYXRhLT5jaXBoZXI7CisJCWlmIChldnBfY2lwaGVyID09IE5VTEwpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RBVEFJTklULAorCQkJCQkJUEtDUzdfUl9DSVBIRVJfTk9UX0lOSVRJQUxJWkVEKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlicmVhazsKKwljYXNlIE5JRF9wa2NzN19kaWdlc3Q6CisJCXhhID0gcDctPmQuZGlnZXN0LT5tZDsKKwkJb3MgPSBQS0NTN19nZXRfb2N0ZXRfc3RyaW5nKHA3LT5kLmRpZ2VzdC0+Y29udGVudHMpOworCQlicmVhazsKKwljYXNlIE5JRF9wa2NzN19kYXRhOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RBVEFJTklULFBLQ1M3X1JfVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFKTsKKwkgICAgICAgIGdvdG8gZXJyOworCQl9CisKKwlmb3IgKGk9MDsgaTxza19YNTA5X0FMR09SX251bShtZF9zayk7IGkrKykKKwkJaWYgKCFQS0NTN19iaW9fYWRkX2RpZ2VzdCgmb3V0LCBza19YNTA5X0FMR09SX3ZhbHVlKG1kX3NrLCBpKSkpCisJCQlnb3RvIGVycjsKKworCWlmICh4YSAmJiAhUEtDUzdfYmlvX2FkZF9kaWdlc3QoJm91dCwgeGEpKQorCQkJZ290byBlcnI7CisKKwlpZiAoZXZwX2NpcGhlciAhPSBOVUxMKQorCQl7CisJCXVuc2lnbmVkIGNoYXIga2V5W0VWUF9NQVhfS0VZX0xFTkdUSF07CisJCXVuc2lnbmVkIGNoYXIgaXZbRVZQX01BWF9JVl9MRU5HVEhdOworCQlpbnQga2V5bGVuLGl2bGVuOworCQlFVlBfQ0lQSEVSX0NUWCAqY3R4OworCisJCWlmICgoYnRtcD1CSU9fbmV3KEJJT19mX2NpcGhlcigpKSkgPT0gTlVMTCkKKwkJCXsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREFUQUlOSVQsRVJSX1JfQklPX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJQklPX2dldF9jaXBoZXJfY3R4KGJ0bXAsICZjdHgpOworCQlrZXlsZW49RVZQX0NJUEhFUl9rZXlfbGVuZ3RoKGV2cF9jaXBoZXIpOworCQlpdmxlbj1FVlBfQ0lQSEVSX2l2X2xlbmd0aChldnBfY2lwaGVyKTsKKwkJeGFsZy0+YWxnb3JpdGhtID0gT0JKX25pZDJvYmooRVZQX0NJUEhFUl90eXBlKGV2cF9jaXBoZXIpKTsKKwkJaWYgKGl2bGVuID4gMCkKKwkJCWlmIChSQU5EX3BzZXVkb19ieXRlcyhpdixpdmxlbikgPD0gMCkKKwkJCQlnb3RvIGVycjsKKwkJaWYgKEVWUF9DaXBoZXJJbml0X2V4KGN0eCwgZXZwX2NpcGhlciwgTlVMTCwgTlVMTCwgTlVMTCwgMSk8PTApCisJCQlnb3RvIGVycjsKKwkJaWYgKEVWUF9DSVBIRVJfQ1RYX3JhbmRfa2V5KGN0eCwga2V5KSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChFVlBfQ2lwaGVySW5pdF9leChjdHgsIE5VTEwsIE5VTEwsIGtleSwgaXYsIDEpIDw9IDApCisJCQlnb3RvIGVycjsKKworCQlpZiAoaXZsZW4gPiAwKSB7CisJCQlpZiAoeGFsZy0+cGFyYW1ldGVyID09IE5VTEwpIHsKKwkJCQl4YWxnLT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCk7CisJCQkJaWYgKHhhbGctPnBhcmFtZXRlciA9PSBOVUxMKQorCQkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWlmKEVWUF9DSVBIRVJfcGFyYW1fdG9fYXNuMShjdHgsIHhhbGctPnBhcmFtZXRlcikgPCAwKQorCQkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogTGV0cyBkbyB0aGUgcHViIGtleSBzdHVmZiA6LSkgKi8KKwkJZm9yIChpPTA7IGk8c2tfUEtDUzdfUkVDSVBfSU5GT19udW0ocnNrKTsgaSsrKQorCQkJeworCQkJcmk9c2tfUEtDUzdfUkVDSVBfSU5GT192YWx1ZShyc2ssaSk7CisJCQlpZiAocGtjczdfZW5jb2RlX3JpbmZvKHJpLCBrZXksIGtleWxlbikgPD0gMCkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJT1BFTlNTTF9jbGVhbnNlKGtleSwga2V5bGVuKTsKKworCQlpZiAob3V0ID09IE5VTEwpCisJCQlvdXQ9YnRtcDsKKwkJZWxzZQorCQkJQklPX3B1c2gob3V0LGJ0bXApOworCQlidG1wPU5VTEw7CisJCX0KKworCWlmIChiaW8gPT0gTlVMTCkKKwkJeworCQlpZiAoUEtDUzdfaXNfZGV0YWNoZWQocDcpKQorCQkJYmlvPUJJT19uZXcoQklPX3NfbnVsbCgpKTsKKwkJZWxzZSBpZiAob3MgJiYgb3MtPmxlbmd0aCA+IDApCisJCQliaW8gPSBCSU9fbmV3X21lbV9idWYob3MtPmRhdGEsIG9zLT5sZW5ndGgpOworCQlpZihiaW8gPT0gTlVMTCkKKwkJCXsKKwkJCWJpbz1CSU9fbmV3KEJJT19zX21lbSgpKTsKKwkJCWlmIChiaW8gPT0gTlVMTCkKKwkJCQlnb3RvIGVycjsKKwkJCUJJT19zZXRfbWVtX2VvZl9yZXR1cm4oYmlvLDApOworCQkJfQorCQl9CisJaWYgKG91dCkKKwkJQklPX3B1c2gob3V0LGJpbyk7CisJZWxzZQorCQlvdXQgPSBiaW87CisJYmlvPU5VTEw7CisJaWYgKDApCisJCXsKK2VycjoKKwkJaWYgKG91dCAhPSBOVUxMKQorCQkJQklPX2ZyZWVfYWxsKG91dCk7CisJCWlmIChidG1wICE9IE5VTEwpCisJCQlCSU9fZnJlZV9hbGwoYnRtcCk7CisJCW91dD1OVUxMOworCQl9CisJcmV0dXJuKG91dCk7CisJfQorCitzdGF0aWMgaW50IHBrY3M3X2NtcF9yaShQS0NTN19SRUNJUF9JTkZPICpyaSwgWDUwOSAqcGNlcnQpCisJeworCWludCByZXQ7CisJcmV0ID0gWDUwOV9OQU1FX2NtcChyaS0+aXNzdWVyX2FuZF9zZXJpYWwtPmlzc3VlciwKKwkJCQlwY2VydC0+Y2VydF9pbmZvLT5pc3N1ZXIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIE1fQVNOMV9JTlRFR0VSX2NtcChwY2VydC0+Y2VydF9pbmZvLT5zZXJpYWxOdW1iZXIsCisJCQkJCXJpLT5pc3N1ZXJfYW5kX3NlcmlhbC0+c2VyaWFsKTsKKwl9CisKKy8qIGludCAqLworQklPICpQS0NTN19kYXRhRGVjb2RlKFBLQ1M3ICpwNywgRVZQX1BLRVkgKnBrZXksIEJJTyAqaW5fYmlvLCBYNTA5ICpwY2VydCkKKwl7CisJaW50IGksajsKKwlCSU8gKm91dD1OVUxMLCpidG1wPU5VTEwsKmV0bXA9TlVMTCwqYmlvPU5VTEw7CisJWDUwOV9BTEdPUiAqeGE7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGFfYm9keT1OVUxMOworCWNvbnN0IEVWUF9NRCAqZXZwX21kOworCWNvbnN0IEVWUF9DSVBIRVIgKmV2cF9jaXBoZXI9TlVMTDsKKwlFVlBfQ0lQSEVSX0NUWCAqZXZwX2N0eD1OVUxMOworCVg1MDlfQUxHT1IgKmVuY19hbGc9TlVMTDsKKwlTVEFDS19PRihYNTA5X0FMR09SKSAqbWRfc2s9TlVMTDsKKwlTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKSAqcnNrPU5VTEw7CisJWDUwOV9BTEdPUiAqeGFsZz1OVUxMOworCVBLQ1M3X1JFQ0lQX0lORk8gKnJpPU5VTEw7CisKKwlpPU9CSl9vYmoybmlkKHA3LT50eXBlKTsKKwlwNy0+c3RhdGU9UEtDUzdfU19IRUFERVI7CisKKwlzd2l0Y2ggKGkpCisJCXsKKwljYXNlIE5JRF9wa2NzN19zaWduZWQ6CisJCWRhdGFfYm9keT1QS0NTN19nZXRfb2N0ZXRfc3RyaW5nKHA3LT5kLnNpZ24tPmNvbnRlbnRzKTsKKwkJbWRfc2s9cDctPmQuc2lnbi0+bWRfYWxnczsKKwkJYnJlYWs7CisJY2FzZSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkOgorCQlyc2s9cDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPnJlY2lwaWVudGluZm87CisJCW1kX3NrPXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5tZF9hbGdzOworCQlkYXRhX2JvZHk9cDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPmVuY19kYXRhLT5lbmNfZGF0YTsKKwkJZW5jX2FsZz1wNy0+ZC5zaWduZWRfYW5kX2VudmVsb3BlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobTsKKwkJZXZwX2NpcGhlcj1FVlBfZ2V0X2NpcGhlcmJ5b2JqKGVuY19hbGctPmFsZ29yaXRobSk7CisJCWlmIChldnBfY2lwaGVyID09IE5VTEwpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RBVEFERUNPREUsUEtDUzdfUl9VTlNVUFBPUlRFRF9DSVBIRVJfVFlQRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJeGFsZz1wNy0+ZC5zaWduZWRfYW5kX2VudmVsb3BlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobTsKKwkJYnJlYWs7CisJY2FzZSBOSURfcGtjczdfZW52ZWxvcGVkOgorCQlyc2s9cDctPmQuZW52ZWxvcGVkLT5yZWNpcGllbnRpbmZvOworCQllbmNfYWxnPXA3LT5kLmVudmVsb3BlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobTsKKwkJZGF0YV9ib2R5PXA3LT5kLmVudmVsb3BlZC0+ZW5jX2RhdGEtPmVuY19kYXRhOworCQlldnBfY2lwaGVyPUVWUF9nZXRfY2lwaGVyYnlvYmooZW5jX2FsZy0+YWxnb3JpdGhtKTsKKwkJaWYgKGV2cF9jaXBoZXIgPT0gTlVMTCkKKwkJCXsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREFUQURFQ09ERSxQS0NTN19SX1VOU1VQUE9SVEVEX0NJUEhFUl9UWVBFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl4YWxnPXA3LT5kLmVudmVsb3BlZC0+ZW5jX2RhdGEtPmFsZ29yaXRobTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19EQVRBREVDT0RFLFBLQ1M3X1JfVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFKTsKKwkgICAgICAgIGdvdG8gZXJyOworCQl9CisKKwkvKiBXZSB3aWxsIGJlIGNoZWNraW5nIHRoZSBzaWduYXR1cmUgKi8KKwlpZiAobWRfc2sgIT0gTlVMTCkKKwkJeworCQlmb3IgKGk9MDsgaTxza19YNTA5X0FMR09SX251bShtZF9zayk7IGkrKykKKwkJCXsKKwkJCXhhPXNrX1g1MDlfQUxHT1JfdmFsdWUobWRfc2ssaSk7CisJCQlpZiAoKGJ0bXA9QklPX25ldyhCSU9fZl9tZCgpKSkgPT0gTlVMTCkKKwkJCQl7CisJCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19EQVRBREVDT0RFLEVSUl9SX0JJT19MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJaj1PQkpfb2JqMm5pZCh4YS0+YWxnb3JpdGhtKTsKKwkJCWV2cF9tZD1FVlBfZ2V0X2RpZ2VzdGJ5bmlkKGopOworCQkJaWYgKGV2cF9tZCA9PSBOVUxMKQorCQkJCXsKKwkJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RBVEFERUNPREUsUEtDUzdfUl9VTktOT1dOX0RJR0VTVF9UWVBFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCUJJT19zZXRfbWQoYnRtcCxldnBfbWQpOworCQkJaWYgKG91dCA9PSBOVUxMKQorCQkJCW91dD1idG1wOworCQkJZWxzZQorCQkJCUJJT19wdXNoKG91dCxidG1wKTsKKwkJCWJ0bXA9TlVMTDsKKwkJCX0KKwkJfQorCisJaWYgKGV2cF9jaXBoZXIgIT0gTlVMTCkKKwkJeworI2lmIDAKKwkJdW5zaWduZWQgY2hhciBrZXlbRVZQX01BWF9LRVlfTEVOR1RIXTsKKwkJdW5zaWduZWQgY2hhciBpdltFVlBfTUFYX0lWX0xFTkdUSF07CisJCXVuc2lnbmVkIGNoYXIgKnA7CisJCWludCBrZXlsZW4saXZsZW47CisJCWludCBtYXg7CisJCVg1MDlfT0JKRUNUIHJldDsKKyNlbmRpZgorCQl1bnNpZ25lZCBjaGFyICplayA9IE5VTEw7CisJCWludCBla2xlbjsKKworCQlpZiAoKGV0bXA9QklPX25ldyhCSU9fZl9jaXBoZXIoKSkpID09IE5VTEwpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RBVEFERUNPREUsRVJSX1JfQklPX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBJdCB3YXMgZW5jcnlwdGVkLCB3ZSBuZWVkIHRvIGRlY3J5cHQgdGhlIHNlY3JldCBrZXkKKwkJICogd2l0aCB0aGUgcHJpdmF0ZSBrZXkgKi8KKworCQkvKiBGaW5kIHRoZSByZWNpcGllbnRJbmZvIHdoaWNoIG1hdGNoZXMgdGhlIHBhc3NlZCBjZXJ0aWZpY2F0ZQorCQkgKiAoaWYgYW55KQorCQkgKi8KKworCQlpZiAocGNlcnQpCisJCQl7CisJCQlmb3IgKGk9MDsgaTxza19QS0NTN19SRUNJUF9JTkZPX251bShyc2spOyBpKyspCisJCQkJeworCQkJCXJpPXNrX1BLQ1M3X1JFQ0lQX0lORk9fdmFsdWUocnNrLGkpOworCQkJCWlmICghcGtjczdfY21wX3JpKHJpLCBwY2VydCkpCisJCQkJCWJyZWFrOworCQkJCXJpPU5VTEw7CisJCQkJfQorCQkJaWYgKHJpID09IE5VTEwpCisJCQkJeworCQkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREFUQURFQ09ERSwKKwkJCQkgICAgICBQS0NTN19SX05PX1JFQ0lQSUVOVF9NQVRDSEVTX0NFUlRJRklDQVRFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisKKwkJLyogSWYgd2UgaGF2ZW4ndCBnb3QgYSBjZXJ0aWZpY2F0ZSB0cnkgZWFjaCByaSBpbiB0dXJuICovCisKKwkJaWYgKHBjZXJ0ID09IE5VTEwpCisJCQl7CisJCQlmb3IgKGk9MDsgaTxza19QS0NTN19SRUNJUF9JTkZPX251bShyc2spOyBpKyspCisJCQkJeworCQkJCXJpPXNrX1BLQ1M3X1JFQ0lQX0lORk9fdmFsdWUocnNrLGkpOworCQkJCWlmIChwa2NzN19kZWNyeXB0X3JpbmZvKCZlaywgJmVrbGVuLAorCQkJCQkJCXJpLCBwa2V5KSA+IDApCisJCQkJCWJyZWFrOworCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCXJpID0gTlVMTDsKKwkJCQl9CisJCQlpZiAocmkgPT0gTlVMTCkKKwkJCQl7CisJCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19EQVRBREVDT0RFLAorCQkJCSAgICAgIFBLQ1M3X1JfTk9fUkVDSVBJRU5UX01BVENIRVNfS0VZKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmIChwa2NzN19kZWNyeXB0X3JpbmZvKCZlaywgJmVrbGVuLCByaSwgcGtleSkgPD0gMCkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQlldnBfY3R4PU5VTEw7CisJCUJJT19nZXRfY2lwaGVyX2N0eChldG1wLCZldnBfY3R4KTsKKwkJaWYgKEVWUF9DaXBoZXJJbml0X2V4KGV2cF9jdHgsZXZwX2NpcGhlcixOVUxMLE5VTEwsTlVMTCwwKSA8PSAwKQorCQkJZ290byBlcnI7CisJCWlmIChFVlBfQ0lQSEVSX2FzbjFfdG9fcGFyYW0oZXZwX2N0eCxlbmNfYWxnLT5wYXJhbWV0ZXIpIDwgMCkKKwkJCWdvdG8gZXJyOworCisJCWlmIChla2xlbiAhPSBFVlBfQ0lQSEVSX0NUWF9rZXlfbGVuZ3RoKGV2cF9jdHgpKSB7CisJCQkvKiBTb21lIFMvTUlNRSBjbGllbnRzIGRvbid0IHVzZSB0aGUgc2FtZSBrZXkKKwkJCSAqIGFuZCBlZmZlY3RpdmUga2V5IGxlbmd0aC4gVGhlIGtleSBsZW5ndGggaXMKKwkJCSAqIGRldGVybWluZWQgYnkgdGhlIHNpemUgb2YgdGhlIGRlY3J5cHRlZCBSU0Ega2V5LgorCQkJICovCisJCQlpZighRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGgoZXZwX2N0eCwgZWtsZW4pKQorCQkJCXsKKwkJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RBVEFERUNPREUsCisJCQkJCVBLQ1M3X1JfREVDUllQVEVEX0tFWV9JU19XUk9OR19MRU5HVEgpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJfSAKKwkJaWYgKEVWUF9DaXBoZXJJbml0X2V4KGV2cF9jdHgsTlVMTCxOVUxMLGVrLE5VTEwsMCkgPD0gMCkKKwkJCWdvdG8gZXJyOworCisJCWlmIChlaykKKwkJCXsKKwkJCU9QRU5TU0xfY2xlYW5zZShlayxla2xlbik7CisJCQlPUEVOU1NMX2ZyZWUoZWspOworCQkJfQorCisJCWlmIChvdXQgPT0gTlVMTCkKKwkJCW91dD1ldG1wOworCQllbHNlCisJCQlCSU9fcHVzaChvdXQsZXRtcCk7CisJCWV0bXA9TlVMTDsKKwkJfQorCisjaWYgMQorCWlmIChQS0NTN19pc19kZXRhY2hlZChwNykgfHwgKGluX2JpbyAhPSBOVUxMKSkKKwkJeworCQliaW89aW5fYmlvOworCQl9CisJZWxzZSAKKwkJeworI2lmIDAKKwkJYmlvPUJJT19uZXcoQklPX3NfbWVtKCkpOworCQkvKiBXZSBuZWVkIHRvIHNldCB0aGlzIHNvIHRoYXQgd2hlbiB3ZSBoYXZlIHJlYWQgYWxsCisJCSAqIHRoZSBkYXRhLCB0aGUgZW5jcnlwdCBCSU8sIGlmIHByZXNlbnQsIHdpbGwgcmVhZAorCQkgKiBFT0YgYW5kIGVuY29kZSB0aGUgbGFzdCBmZXcgYnl0ZXMgKi8KKwkJQklPX3NldF9tZW1fZW9mX3JldHVybihiaW8sMCk7CisKKwkJaWYgKGRhdGFfYm9keS0+bGVuZ3RoID4gMCkKKwkJCUJJT193cml0ZShiaW8sKGNoYXIgKilkYXRhX2JvZHktPmRhdGEsZGF0YV9ib2R5LT5sZW5ndGgpOworI2Vsc2UKKwkJaWYgKGRhdGFfYm9keS0+bGVuZ3RoID4gMCkKKwkJICAgICAgYmlvID0gQklPX25ld19tZW1fYnVmKGRhdGFfYm9keS0+ZGF0YSxkYXRhX2JvZHktPmxlbmd0aCk7CisJCWVsc2UgeworCQkJYmlvPUJJT19uZXcoQklPX3NfbWVtKCkpOworCQkJQklPX3NldF9tZW1fZW9mX3JldHVybihiaW8sMCk7CisJCX0KKwkJaWYgKGJpbyA9PSBOVUxMKQorCQkJZ290byBlcnI7CisjZW5kaWYKKwkJfQorCUJJT19wdXNoKG91dCxiaW8pOworCWJpbz1OVUxMOworI2VuZGlmCisJaWYgKDApCisJCXsKK2VycjoKKwkJaWYgKG91dCAhPSBOVUxMKSBCSU9fZnJlZV9hbGwob3V0KTsKKwkJaWYgKGJ0bXAgIT0gTlVMTCkgQklPX2ZyZWVfYWxsKGJ0bXApOworCQlpZiAoZXRtcCAhPSBOVUxMKSBCSU9fZnJlZV9hbGwoZXRtcCk7CisJCWlmIChiaW8gIT0gTlVMTCkgQklPX2ZyZWVfYWxsKGJpbyk7CisJCW91dD1OVUxMOworCQl9CisJcmV0dXJuKG91dCk7CisJfQorCitzdGF0aWMgQklPICpQS0NTN19maW5kX2RpZ2VzdChFVlBfTURfQ1RYICoqcG1kLCBCSU8gKmJpbywgaW50IG5pZCkKKwl7CisJZm9yICg7OykKKwkJeworCQliaW89QklPX2ZpbmRfdHlwZShiaW8sQklPX1RZUEVfTUQpOworCQlpZiAoYmlvID09IE5VTEwpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0ZJTkRfRElHRVNULFBLQ1M3X1JfVU5BQkxFX1RPX0ZJTkRfTUVTU0FHRV9ESUdFU1QpOworCQkJcmV0dXJuIE5VTEw7CQorCQkJfQorCQlCSU9fZ2V0X21kX2N0eChiaW8scG1kKTsKKwkJaWYgKCpwbWQgPT0gTlVMTCkKKwkJCXsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfRklORF9ESUdFU1QsRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CQorCQlpZiAoRVZQX01EX0NUWF90eXBlKCpwbWQpID09IG5pZCkKKwkJCXJldHVybiBiaW87CisJCWJpbz1CSU9fbmV4dChiaW8pOworCQl9CisJcmV0dXJuIE5VTEw7CisJfQorCitzdGF0aWMgaW50IGRvX3BrY3M3X3NpZ25lZF9hdHRyaWIoUEtDUzdfU0lHTkVSX0lORk8gKnNpLCBFVlBfTURfQ1RYICptY3R4KQorCXsKKwl1bnNpZ25lZCBjaGFyIG1kX2RhdGFbRVZQX01BWF9NRF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgbWRfbGVuOworCisJLyogQWRkIHNpZ25pbmcgdGltZSBpZiBub3QgYWxyZWFkeSBwcmVzZW50ICovCisJaWYgKCFQS0NTN19nZXRfc2lnbmVkX2F0dHJpYnV0ZShzaSwgTklEX3BrY3M5X3NpZ25pbmdUaW1lKSkKKwkJeworCQlpZiAoIVBLQ1M3X2FkZDBfYXR0cmliX3NpZ25pbmdfdGltZShzaSwgTlVMTCkpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX0RPX1BLQ1M3X1NJR05FRF9BVFRSSUIsCisJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkvKiBBZGQgZGlnZXN0ICovCisJRVZQX0RpZ2VzdEZpbmFsX2V4KG1jdHgsIG1kX2RhdGEsJm1kX2xlbik7CisJaWYgKCFQS0NTN19hZGQxX2F0dHJpYl9kaWdlc3Qoc2ksIG1kX2RhdGEsIG1kX2xlbikpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9ET19QS0NTN19TSUdORURfQVRUUklCLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisKKwkvKiBOb3cgc2lnbiB0aGUgYXR0cmlidXRlcyAqLworCWlmICghUEtDUzdfU0lHTkVSX0lORk9fc2lnbihzaSkpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworCX0KKwkKKwkJCQkKK2ludCBQS0NTN19kYXRhRmluYWwoUEtDUzcgKnA3LCBCSU8gKmJpbykKKwl7CisJaW50IHJldD0wOworCWludCBpLGo7CisJQklPICpidG1wOworCVBLQ1M3X1NJR05FUl9JTkZPICpzaTsKKwlFVlBfTURfQ1RYICptZGMsY3R4X3RtcDsKKwlTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKnNrOworCVNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqc2lfc2s9TlVMTDsKKwlBU04xX09DVEVUX1NUUklORyAqb3M9TlVMTDsKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4X3RtcCk7CisJaT1PQkpfb2JqMm5pZChwNy0+dHlwZSk7CisJcDctPnN0YXRlPVBLQ1M3X1NfSEVBREVSOworCisJc3dpdGNoIChpKQorCQl7CisJY2FzZSBOSURfcGtjczdfZGF0YToKKwkJb3MgPSBwNy0+ZC5kYXRhOworCQlicmVhazsKKwljYXNlIE5JRF9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQ6CisJCS8qIFhYWFhYWFhYWFhYWFhYWFggKi8KKwkJc2lfc2s9cDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPnNpZ25lcl9pbmZvOworCQlvcyA9IHA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5lbmNfZGF0YS0+ZW5jX2RhdGE7CisJCWlmICghb3MpCisJCQl7CisJCQlvcz1NX0FTTjFfT0NURVRfU1RSSU5HX25ldygpOworCQkJaWYgKCFvcykKKwkJCQl7CisJCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19EQVRBRklOQUwsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5lbmNfZGF0YS0+ZW5jX2RhdGE9b3M7CisJCQl9CisJCWJyZWFrOworCWNhc2UgTklEX3BrY3M3X2VudmVsb3BlZDoKKwkJLyogWFhYWFhYWFhYWFhYWFhYWCAqLworCQlvcyA9IHA3LT5kLmVudmVsb3BlZC0+ZW5jX2RhdGEtPmVuY19kYXRhOworCQlpZiAoIW9zKQorCQkJeworCQkJb3M9TV9BU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwkJCWlmICghb3MpCisJCQkJeworCQkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREFUQUZJTkFMLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlwNy0+ZC5lbnZlbG9wZWQtPmVuY19kYXRhLT5lbmNfZGF0YT1vczsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBOSURfcGtjczdfc2lnbmVkOgorCQlzaV9zaz1wNy0+ZC5zaWduLT5zaWduZXJfaW5mbzsKKwkJb3M9UEtDUzdfZ2V0X29jdGV0X3N0cmluZyhwNy0+ZC5zaWduLT5jb250ZW50cyk7CisJCS8qIElmIGRldGFjaGVkIGRhdGEgdGhlbiB0aGUgY29udGVudCBpcyBleGNsdWRlZCAqLworCQlpZihQS0NTN190eXBlX2lzX2RhdGEocDctPmQuc2lnbi0+Y29udGVudHMpICYmIHA3LT5kZXRhY2hlZCkgeworCQkJTV9BU04xX09DVEVUX1NUUklOR19mcmVlKG9zKTsKKwkJCXA3LT5kLnNpZ24tPmNvbnRlbnRzLT5kLmRhdGEgPSBOVUxMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBOSURfcGtjczdfZGlnZXN0OgorCQlvcz1QS0NTN19nZXRfb2N0ZXRfc3RyaW5nKHA3LT5kLmRpZ2VzdC0+Y29udGVudHMpOworCQkvKiBJZiBkZXRhY2hlZCBkYXRhIHRoZW4gdGhlIGNvbnRlbnQgaXMgZXhjbHVkZWQgKi8KKwkJaWYoUEtDUzdfdHlwZV9pc19kYXRhKHA3LT5kLmRpZ2VzdC0+Y29udGVudHMpICYmIHA3LT5kZXRhY2hlZCkKKwkJCXsKKwkJCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvcyk7CisJCQlwNy0+ZC5kaWdlc3QtPmNvbnRlbnRzLT5kLmRhdGEgPSBOVUxMOworCQkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREFUQUZJTkFMLFBLQ1M3X1JfVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFKTsKKwkgICAgICAgIGdvdG8gZXJyOworCQl9CisKKwlpZiAoc2lfc2sgIT0gTlVMTCkKKwkJeworCQlmb3IgKGk9MDsgaTxza19QS0NTN19TSUdORVJfSU5GT19udW0oc2lfc2spOyBpKyspCisJCQl7CisJCQlzaT1za19QS0NTN19TSUdORVJfSU5GT192YWx1ZShzaV9zayxpKTsKKwkJCWlmIChzaS0+cGtleSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlqID0gT0JKX29iajJuaWQoc2ktPmRpZ2VzdF9hbGctPmFsZ29yaXRobSk7CisKKwkJCWJ0bXA9YmlvOworCisJCQlidG1wID0gUEtDUzdfZmluZF9kaWdlc3QoJm1kYywgYnRtcCwgaik7CisKKwkJCWlmIChidG1wID09IE5VTEwpCisJCQkJZ290byBlcnI7CisKKwkJCS8qIFdlIG5vdyBoYXZlIHRoZSBFVlBfTURfQ1RYLCBsZXRzIGRvIHRoZQorCQkJICogc2lnbmluZy4gKi8KKwkJCUVWUF9NRF9DVFhfY29weV9leCgmY3R4X3RtcCxtZGMpOworCisJCQlzaz1zaS0+YXV0aF9hdHRyOworCisJCQkvKiBJZiB0aGVyZSBhcmUgYXR0cmlidXRlcywgd2UgYWRkIHRoZSBkaWdlc3QKKwkJCSAqIGF0dHJpYnV0ZSBhbmQgb25seSBzaWduIHRoZSBhdHRyaWJ1dGVzICovCisJCQlpZiAoc2tfWDUwOV9BVFRSSUJVVEVfbnVtKHNrKSA+IDApCisJCQkJeworCQkJCWlmICghZG9fcGtjczdfc2lnbmVkX2F0dHJpYihzaSwgJmN0eF90bXApKQorCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCXVuc2lnbmVkIGNoYXIgKmFidWYgPSBOVUxMOworCQkJCXVuc2lnbmVkIGludCBhYnVmbGVuOworCQkJCWFidWZsZW4gPSBFVlBfUEtFWV9zaXplKHNpLT5wa2V5KTsKKwkJCQlhYnVmID0gT1BFTlNTTF9tYWxsb2MoYWJ1Zmxlbik7CisJCQkJaWYgKCFhYnVmKQorCQkJCQlnb3RvIGVycjsKKworCQkJCWlmICghRVZQX1NpZ25GaW5hbCgmY3R4X3RtcCwgYWJ1ZiwgJmFidWZsZW4sCisJCQkJCQkJc2ktPnBrZXkpKQorCQkJCQl7CisJCQkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREFUQUZJTkFMLAorCQkJCQkJCUVSUl9SX0VWUF9MSUIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCUFTTjFfU1RSSU5HX3NldDAoc2ktPmVuY19kaWdlc3QsIGFidWYsIGFidWZsZW4pOworCQkJCX0KKwkJCX0KKwkJfQorCWVsc2UgaWYgKGkgPT0gTklEX3BrY3M3X2RpZ2VzdCkKKwkJeworCQl1bnNpZ25lZCBjaGFyIG1kX2RhdGFbRVZQX01BWF9NRF9TSVpFXTsKKwkJdW5zaWduZWQgaW50IG1kX2xlbjsKKwkJaWYgKCFQS0NTN19maW5kX2RpZ2VzdCgmbWRjLCBiaW8sCisJCQkJT0JKX29iajJuaWQocDctPmQuZGlnZXN0LT5tZC0+YWxnb3JpdGhtKSkpCisJCQlnb3RvIGVycjsKKwkJRVZQX0RpZ2VzdEZpbmFsX2V4KG1kYyxtZF9kYXRhLCZtZF9sZW4pOworCQlNX0FTTjFfT0NURVRfU1RSSU5HX3NldChwNy0+ZC5kaWdlc3QtPmRpZ2VzdCwgbWRfZGF0YSwgbWRfbGVuKTsKKwkJfQorCisJaWYgKCFQS0NTN19pc19kZXRhY2hlZChwNykgJiYgIShvcy0+ZmxhZ3MgJiBBU04xX1NUUklOR19GTEFHX05ERUYpKQorCQl7CisJCWNoYXIgKmNvbnQ7CisJCWxvbmcgY29udGxlbjsKKwkJYnRtcD1CSU9fZmluZF90eXBlKGJpbyxCSU9fVFlQRV9NRU0pOworCQlpZiAoYnRtcCA9PSBOVUxMKQorCQkJeworCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19EQVRBRklOQUwsUEtDUzdfUl9VTkFCTEVfVE9fRklORF9NRU1fQklPKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQljb250bGVuID0gQklPX2dldF9tZW1fZGF0YShidG1wLCAmY29udCk7CisJCS8qIE1hcmsgdGhlIEJJTyByZWFkIG9ubHkgdGhlbiB3ZSBjYW4gdXNlIGl0cyBjb3B5IG9mIHRoZSBkYXRhCisJCSAqIGluc3RlYWQgb2YgbWFraW5nIGFuIGV4dHJhIGNvcHkuCisJCSAqLworCQlCSU9fc2V0X2ZsYWdzKGJ0bXAsIEJJT19GTEFHU19NRU1fUkRPTkxZKTsKKwkJQklPX3NldF9tZW1fZW9mX3JldHVybihidG1wLCAwKTsKKwkJQVNOMV9TVFJJTkdfc2V0MChvcywgKHVuc2lnbmVkIGNoYXIgKiljb250LCBjb250bGVuKTsKKwkJfQorCXJldD0xOworZXJyOgorCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4X3RtcCk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgUEtDUzdfU0lHTkVSX0lORk9fc2lnbihQS0NTN19TSUdORVJfSU5GTyAqc2kpCisJeworCUVWUF9NRF9DVFggbWN0eDsKKwlFVlBfUEtFWV9DVFggKnBjdHg7CisJdW5zaWduZWQgY2hhciAqYWJ1ZiA9IE5VTEw7CisJaW50IGFsZW47CisJc2l6ZV90IHNpZ2xlbjsKKwljb25zdCBFVlBfTUQgKm1kID0gTlVMTDsKKworCW1kID0gRVZQX2dldF9kaWdlc3RieW9iaihzaS0+ZGlnZXN0X2FsZy0+YWxnb3JpdGhtKTsKKwlpZiAobWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlFVlBfTURfQ1RYX2luaXQoJm1jdHgpOworCWlmIChFVlBfRGlnZXN0U2lnbkluaXQoJm1jdHgsICZwY3R4LCBtZCxOVUxMLCBzaS0+cGtleSkgPD0gMCkKKwkJZ290byBlcnI7CisKKwlpZiAoRVZQX1BLRVlfQ1RYX2N0cmwocGN0eCwgLTEsIEVWUF9QS0VZX09QX1NJR04sCisJCQkJRVZQX1BLRVlfQ1RSTF9QS0NTN19TSUdOLCAwLCBzaSkgPD0gMCkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NJR05FUl9JTkZPX1NJR04sIFBLQ1M3X1JfQ1RSTF9FUlJPUik7CisJCWdvdG8gZXJyOworCQl9CisKKwlhbGVuID0gQVNOMV9pdGVtX2kyZCgoQVNOMV9WQUxVRSAqKXNpLT5hdXRoX2F0dHIsJmFidWYsCisJCQkJQVNOMV9JVEVNX3JwdHIoUEtDUzdfQVRUUl9TSUdOKSk7CisJaWYoIWFidWYpCisJCWdvdG8gZXJyOworCWlmIChFVlBfRGlnZXN0U2lnblVwZGF0ZSgmbWN0eCxhYnVmLGFsZW4pIDw9IDApCisJCWdvdG8gZXJyOworCU9QRU5TU0xfZnJlZShhYnVmKTsKKwlpZiAoRVZQX0RpZ2VzdFNpZ25GaW5hbCgmbWN0eCwgTlVMTCwgJnNpZ2xlbikgPD0gMCkKKwkJZ290byBlcnI7CisJYWJ1ZiA9IE9QRU5TU0xfbWFsbG9jKHNpZ2xlbik7CisJaWYoIWFidWYpCisJCWdvdG8gZXJyOworCWlmIChFVlBfRGlnZXN0U2lnbkZpbmFsKCZtY3R4LCBhYnVmLCAmc2lnbGVuKSA8PSAwKQorCQlnb3RvIGVycjsKKworCWlmIChFVlBfUEtFWV9DVFhfY3RybChwY3R4LCAtMSwgRVZQX1BLRVlfT1BfU0lHTiwKKwkJCQlFVlBfUEtFWV9DVFJMX1BLQ1M3X1NJR04sIDEsIHNpKSA8PSAwKQorCQl7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfU0lHTkVSX0lORk9fU0lHTiwgUEtDUzdfUl9DVFJMX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKworCUVWUF9NRF9DVFhfY2xlYW51cCgmbWN0eCk7CisKKwlBU04xX1NUUklOR19zZXQwKHNpLT5lbmNfZGlnZXN0LCBhYnVmLCBzaWdsZW4pOworCisJcmV0dXJuIDE7CisKKwllcnI6CisJaWYgKGFidWYpCisJCU9QRU5TU0xfZnJlZShhYnVmKTsKKwlFVlBfTURfQ1RYX2NsZWFudXAoJm1jdHgpOworCXJldHVybiAwOworCisJfQorCitpbnQgUEtDUzdfZGF0YVZlcmlmeShYNTA5X1NUT1JFICpjZXJ0X3N0b3JlLCBYNTA5X1NUT1JFX0NUWCAqY3R4LCBCSU8gKmJpbywKKwkgICAgIFBLQ1M3ICpwNywgUEtDUzdfU0lHTkVSX0lORk8gKnNpKQorCXsKKwlQS0NTN19JU1NVRVJfQU5EX1NFUklBTCAqaWFzOworCWludCByZXQ9MCxpOworCVNUQUNLX09GKFg1MDkpICpjZXJ0OworCVg1MDkgKng1MDk7CisKKwlpZiAoUEtDUzdfdHlwZV9pc19zaWduZWQocDcpKQorCQl7CisJCWNlcnQ9cDctPmQuc2lnbi0+Y2VydDsKKwkJfQorCWVsc2UgaWYgKFBLQ1M3X3R5cGVfaXNfc2lnbmVkQW5kRW52ZWxvcGVkKHA3KSkKKwkJeworCQljZXJ0PXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5jZXJ0OworCQl9CisJZWxzZQorCQl7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREFUQVZFUklGWSxQS0NTN19SX1dST05HX1BLQ1M3X1RZUEUpOworCQlnb3RvIGVycjsKKwkJfQorCS8qIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYICovCisJaWFzPXNpLT5pc3N1ZXJfYW5kX3NlcmlhbDsKKworCXg1MDk9WDUwOV9maW5kX2J5X2lzc3Vlcl9hbmRfc2VyaWFsKGNlcnQsaWFzLT5pc3N1ZXIsaWFzLT5zZXJpYWwpOworCisJLyogd2VyZSB3ZSBhYmxlIHRvIGZpbmQgdGhlIGNlcnQgaW4gcGFzc2VkIHRvIHVzICovCisJaWYgKHg1MDkgPT0gTlVMTCkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RBVEFWRVJJRlksUEtDUzdfUl9VTkFCTEVfVE9fRklORF9DRVJUSUZJQ0FURSk7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBMZXRzIHZlcmlmeSAqLworCWlmKCFYNTA5X1NUT1JFX0NUWF9pbml0KGN0eCxjZXJ0X3N0b3JlLHg1MDksY2VydCkpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19EQVRBVkVSSUZZLEVSUl9SX1g1MDlfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKwlYNTA5X1NUT1JFX0NUWF9zZXRfcHVycG9zZShjdHgsIFg1MDlfUFVSUE9TRV9TTUlNRV9TSUdOKTsKKwlpPVg1MDlfdmVyaWZ5X2NlcnQoY3R4KTsKKwlpZiAoaSA8PSAwKSAKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RBVEFWRVJJRlksRVJSX1JfWDUwOV9MSUIpOworCQlYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKGN0eCk7CisJCWdvdG8gZXJyOworCQl9CisJWDUwOV9TVE9SRV9DVFhfY2xlYW51cChjdHgpOworCisJcmV0dXJuIFBLQ1M3X3NpZ25hdHVyZVZlcmlmeShiaW8sIHA3LCBzaSwgeDUwOSk7CisJZXJyOgorCXJldHVybiByZXQ7CisJfQorCitpbnQgUEtDUzdfc2lnbmF0dXJlVmVyaWZ5KEJJTyAqYmlvLCBQS0NTNyAqcDcsIFBLQ1M3X1NJR05FUl9JTkZPICpzaSwKKwkJCQkJCQkJWDUwOSAqeDUwOSkKKwl7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9zOworCUVWUF9NRF9DVFggbWRjX3RtcCwqbWRjOworCWludCByZXQ9MCxpOworCWludCBtZF90eXBlOworCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2s7CisJQklPICpidG1wOworCUVWUF9QS0VZICpwa2V5OworCisJRVZQX01EX0NUWF9pbml0KCZtZGNfdG1wKTsKKworCWlmICghUEtDUzdfdHlwZV9pc19zaWduZWQocDcpICYmIAorCQkJCSFQS0NTN190eXBlX2lzX3NpZ25lZEFuZEVudmVsb3BlZChwNykpIHsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TSUdOQVRVUkVWRVJJRlksCisJCQkJCQlQS0NTN19SX1dST05HX1BLQ1M3X1RZUEUpOworCQlnb3RvIGVycjsKKwl9CisKKwltZF90eXBlPU9CSl9vYmoybmlkKHNpLT5kaWdlc3RfYWxnLT5hbGdvcml0aG0pOworCisJYnRtcD1iaW87CisJZm9yICg7OykKKwkJeworCQlpZiAoKGJ0bXAgPT0gTlVMTCkgfHwKKwkJCSgoYnRtcD1CSU9fZmluZF90eXBlKGJ0bXAsQklPX1RZUEVfTUQpKSA9PSBOVUxMKSkKKwkJCXsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfU0lHTkFUVVJFVkVSSUZZLAorCQkJCQlQS0NTN19SX1VOQUJMRV9UT19GSU5EX01FU1NBR0VfRElHRVNUKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlCSU9fZ2V0X21kX2N0eChidG1wLCZtZGMpOworCQlpZiAobWRjID09IE5VTEwpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NJR05BVFVSRVZFUklGWSwKKwkJCQkJCQlFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKEVWUF9NRF9DVFhfdHlwZShtZGMpID09IG1kX3R5cGUpCisJCQlicmVhazsKKwkJLyogV29ya2Fyb3VuZCBmb3Igc29tZSBicm9rZW4gY2xpZW50cyB0aGF0IHB1dCB0aGUgc2lnbmF0dXJlCisJCSAqIE9JRCBpbnN0ZWFkIG9mIHRoZSBkaWdlc3QgT0lEIGluIGRpZ2VzdF9hbGctPmFsZ29yaXRobQorCQkgKi8KKwkJaWYgKEVWUF9NRF9wa2V5X3R5cGUoRVZQX01EX0NUWF9tZChtZGMpKSA9PSBtZF90eXBlKQorCQkJYnJlYWs7CisJCWJ0bXA9QklPX25leHQoYnRtcCk7CisJCX0KKworCS8qIG1kYyBpcyB0aGUgZGlnZXN0IGN0eCB0aGF0IHdlIHdhbnQsIHVubGVzcyB0aGVyZSBhcmUgYXR0cmlidXRlcywKKwkgKiBpbiB3aGljaCBjYXNlIHRoZSBkaWdlc3QgaXMgdGhlIHNpZ25lZCBhdHRyaWJ1dGVzICovCisJRVZQX01EX0NUWF9jb3B5X2V4KCZtZGNfdG1wLG1kYyk7CisKKwlzaz1zaS0+YXV0aF9hdHRyOworCWlmICgoc2sgIT0gTlVMTCkgJiYgKHNrX1g1MDlfQVRUUklCVVRFX251bShzaykgIT0gMCkpCisJCXsKKwkJdW5zaWduZWQgY2hhciBtZF9kYXRbRVZQX01BWF9NRF9TSVpFXSwgKmFidWYgPSBOVUxMOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtZF9sZW47CisJCWludCBhbGVuOworCQlBU04xX09DVEVUX1NUUklORyAqbWVzc2FnZV9kaWdlc3Q7CisKKwkJRVZQX0RpZ2VzdEZpbmFsX2V4KCZtZGNfdG1wLG1kX2RhdCwmbWRfbGVuKTsKKwkJbWVzc2FnZV9kaWdlc3Q9UEtDUzdfZGlnZXN0X2Zyb21fYXR0cmlidXRlcyhzayk7CisJCWlmICghbWVzc2FnZV9kaWdlc3QpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NJR05BVFVSRVZFUklGWSwKKwkJCQkJUEtDUzdfUl9VTkFCTEVfVE9fRklORF9NRVNTQUdFX0RJR0VTVCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKChtZXNzYWdlX2RpZ2VzdC0+bGVuZ3RoICE9IChpbnQpbWRfbGVuKSB8fAorCQkJKG1lbWNtcChtZXNzYWdlX2RpZ2VzdC0+ZGF0YSxtZF9kYXQsbWRfbGVuKSkpCisJCQl7CisjaWYgMAoreworaW50IGlpOworZm9yIChpaT0wOyBpaTxtZXNzYWdlX2RpZ2VzdC0+bGVuZ3RoOyBpaSsrKQorCXByaW50ZigiJTAyWCIsbWVzc2FnZV9kaWdlc3QtPmRhdGFbaWldKTsgcHJpbnRmKCIgc2VudFxuIik7Citmb3IgKGlpPTA7IGlpPG1kX2xlbjsgaWkrKykgcHJpbnRmKCIlMDJYIixtZF9kYXRbaWldKTsgcHJpbnRmKCIgY2FsY1xuIik7Cit9CisjZW5kaWYKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfU0lHTkFUVVJFVkVSSUZZLAorCQkJCQkJCVBLQ1M3X1JfRElHRVNUX0ZBSUxVUkUpOworCQkJcmV0PSAtMTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCUVWUF9WZXJpZnlJbml0X2V4KCZtZGNfdG1wLEVWUF9nZXRfZGlnZXN0YnluaWQobWRfdHlwZSksIE5VTEwpOworCisJCWFsZW4gPSBBU04xX2l0ZW1faTJkKChBU04xX1ZBTFVFICopc2ssICZhYnVmLAorCQkJCQkJQVNOMV9JVEVNX3JwdHIoUEtDUzdfQVRUUl9WRVJJRlkpKTsKKwkJaWYgKGFsZW4gPD0gMCkgCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NJR05BVFVSRVZFUklGWSxFUlJfUl9BU04xX0xJQik7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlFVlBfVmVyaWZ5VXBkYXRlKCZtZGNfdG1wLCBhYnVmLCBhbGVuKTsKKworCQlPUEVOU1NMX2ZyZWUoYWJ1Zik7CisJCX0KKworCW9zPXNpLT5lbmNfZGlnZXN0OworCXBrZXkgPSBYNTA5X2dldF9wdWJrZXkoeDUwOSk7CisJaWYgKCFwa2V5KQorCQl7CisJCXJldCA9IC0xOworCQlnb3RvIGVycjsKKwkJfQorCisJaT1FVlBfVmVyaWZ5RmluYWwoJm1kY190bXAsb3MtPmRhdGEsb3MtPmxlbmd0aCwgcGtleSk7CisJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlpZiAoaSA8PSAwKQorCQl7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfU0lHTkFUVVJFVkVSSUZZLAorCQkJCQkJUEtDUzdfUl9TSUdOQVRVUkVfRkFJTFVSRSk7CisJCXJldD0gLTE7CisJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQlyZXQ9MTsKK2VycjoKKwlFVlBfTURfQ1RYX2NsZWFudXAoJm1kY190bXApOworCXJldHVybihyZXQpOworCX0KKworUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwgKlBLQ1M3X2dldF9pc3N1ZXJfYW5kX3NlcmlhbChQS0NTNyAqcDcsIGludCBpZHgpCisJeworCVNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICpyc2s7CisJUEtDUzdfUkVDSVBfSU5GTyAqcmk7CisJaW50IGk7CisKKwlpPU9CSl9vYmoybmlkKHA3LT50eXBlKTsKKwlpZiAoaSAhPSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAocDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcnNrPXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5yZWNpcGllbnRpbmZvOworCWlmIChyc2sgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmk9c2tfUEtDUzdfUkVDSVBfSU5GT192YWx1ZShyc2ssMCk7CisJaWYgKHNrX1BLQ1M3X1JFQ0lQX0lORk9fbnVtKHJzaykgPD0gaWR4KSByZXR1cm4oTlVMTCk7CisJcmk9c2tfUEtDUzdfUkVDSVBfSU5GT192YWx1ZShyc2ssaWR4KTsKKwlyZXR1cm4ocmktPmlzc3Vlcl9hbmRfc2VyaWFsKTsKKwl9CisKK0FTTjFfVFlQRSAqUEtDUzdfZ2V0X3NpZ25lZF9hdHRyaWJ1dGUoUEtDUzdfU0lHTkVSX0lORk8gKnNpLCBpbnQgbmlkKQorCXsKKwlyZXR1cm4oZ2V0X2F0dHJpYnV0ZShzaS0+YXV0aF9hdHRyLG5pZCkpOworCX0KKworQVNOMV9UWVBFICpQS0NTN19nZXRfYXR0cmlidXRlKFBLQ1M3X1NJR05FUl9JTkZPICpzaSwgaW50IG5pZCkKKwl7CisJcmV0dXJuKGdldF9hdHRyaWJ1dGUoc2ktPnVuYXV0aF9hdHRyLG5pZCkpOworCX0KKworc3RhdGljIEFTTjFfVFlQRSAqZ2V0X2F0dHJpYnV0ZShTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKnNrLCBpbnQgbmlkKQorCXsKKwlpbnQgaTsKKwlYNTA5X0FUVFJJQlVURSAqeGE7CisJQVNOMV9PQkpFQ1QgKm87CisKKwlvPU9CSl9uaWQyb2JqKG5pZCk7CisJaWYgKCFvIHx8ICFzaykgcmV0dXJuKE5VTEwpOworCWZvciAoaT0wOyBpPHNrX1g1MDlfQVRUUklCVVRFX251bShzayk7IGkrKykKKwkJeworCQl4YT1za19YNTA5X0FUVFJJQlVURV92YWx1ZShzayxpKTsKKwkJaWYgKE9CSl9jbXAoeGEtPm9iamVjdCxvKSA9PSAwKQorCQkJeworCQkJaWYgKCF4YS0+c2luZ2xlICYmIHNrX0FTTjFfVFlQRV9udW0oeGEtPnZhbHVlLnNldCkpCisJCQkJcmV0dXJuKHNrX0FTTjFfVFlQRV92YWx1ZSh4YS0+dmFsdWUuc2V0LDApKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4oTlVMTCk7CisJCQl9CisJCX0KKwlyZXR1cm4oTlVMTCk7CisJfQorCitBU04xX09DVEVUX1NUUklORyAqUEtDUzdfZGlnZXN0X2Zyb21fYXR0cmlidXRlcyhTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKnNrKQoreworCUFTTjFfVFlQRSAqYXN0eXBlOworCWlmKCEoYXN0eXBlID0gZ2V0X2F0dHJpYnV0ZShzaywgTklEX3BrY3M5X21lc3NhZ2VEaWdlc3QpKSkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIGFzdHlwZS0+dmFsdWUub2N0ZXRfc3RyaW5nOworfQorCitpbnQgUEtDUzdfc2V0X3NpZ25lZF9hdHRyaWJ1dGVzKFBLQ1M3X1NJR05FUl9JTkZPICpwN3NpLAorCQkJCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2spCisJeworCWludCBpOworCisJaWYgKHA3c2ktPmF1dGhfYXR0ciAhPSBOVUxMKQorCQlza19YNTA5X0FUVFJJQlVURV9wb3BfZnJlZShwN3NpLT5hdXRoX2F0dHIsWDUwOV9BVFRSSUJVVEVfZnJlZSk7CisJcDdzaS0+YXV0aF9hdHRyPXNrX1g1MDlfQVRUUklCVVRFX2R1cChzayk7CisJaWYgKHA3c2ktPmF1dGhfYXR0ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlmb3IgKGk9MDsgaTxza19YNTA5X0FUVFJJQlVURV9udW0oc2spOyBpKyspCisJCXsKKwkJaWYgKChza19YNTA5X0FUVFJJQlVURV9zZXQocDdzaS0+YXV0aF9hdHRyLGksCisJCQlYNTA5X0FUVFJJQlVURV9kdXAoc2tfWDUwOV9BVFRSSUJVVEVfdmFsdWUoc2ssaSkpKSkKKwkJICAgID09IE5VTEwpCisJCQlyZXR1cm4oMCk7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCitpbnQgUEtDUzdfc2V0X2F0dHJpYnV0ZXMoUEtDUzdfU0lHTkVSX0lORk8gKnA3c2ksIFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2spCisJeworCWludCBpOworCisJaWYgKHA3c2ktPnVuYXV0aF9hdHRyICE9IE5VTEwpCisJCXNrX1g1MDlfQVRUUklCVVRFX3BvcF9mcmVlKHA3c2ktPnVuYXV0aF9hdHRyLAorCQkJCQkgICBYNTA5X0FUVFJJQlVURV9mcmVlKTsKKwlwN3NpLT51bmF1dGhfYXR0cj1za19YNTA5X0FUVFJJQlVURV9kdXAoc2spOworCWlmIChwN3NpLT51bmF1dGhfYXR0ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlmb3IgKGk9MDsgaTxza19YNTA5X0FUVFJJQlVURV9udW0oc2spOyBpKyspCisJCXsKKwkJaWYgKChza19YNTA5X0FUVFJJQlVURV9zZXQocDdzaS0+dW5hdXRoX2F0dHIsaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlfQVRUUklCVVRFX2R1cChza19YNTA5X0FUVFJJQlVURV92YWx1ZShzayxpKSkpKQorCQkgICAgPT0gTlVMTCkKKwkJCXJldHVybigwKTsKKwkJfQorCXJldHVybigxKTsKKwl9CisKK2ludCBQS0NTN19hZGRfc2lnbmVkX2F0dHJpYnV0ZShQS0NTN19TSUdORVJfSU5GTyAqcDdzaSwgaW50IG5pZCwgaW50IGF0cnR5cGUsCisJICAgICB2b2lkICp2YWx1ZSkKKwl7CisJcmV0dXJuKGFkZF9hdHRyaWJ1dGUoJihwN3NpLT5hdXRoX2F0dHIpLG5pZCxhdHJ0eXBlLHZhbHVlKSk7CisJfQorCitpbnQgUEtDUzdfYWRkX2F0dHJpYnV0ZShQS0NTN19TSUdORVJfSU5GTyAqcDdzaSwgaW50IG5pZCwgaW50IGF0cnR5cGUsCisJICAgICB2b2lkICp2YWx1ZSkKKwl7CisJcmV0dXJuKGFkZF9hdHRyaWJ1dGUoJihwN3NpLT51bmF1dGhfYXR0ciksbmlkLGF0cnR5cGUsdmFsdWUpKTsKKwl9CisKK3N0YXRpYyBpbnQgYWRkX2F0dHJpYnV0ZShTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKipzaywgaW50IG5pZCwgaW50IGF0cnR5cGUsCisJCQkgdm9pZCAqdmFsdWUpCisJeworCVg1MDlfQVRUUklCVVRFICphdHRyPU5VTEw7CisKKwlpZiAoKnNrID09IE5VTEwpCisJCXsKKwkJKnNrID0gc2tfWDUwOV9BVFRSSUJVVEVfbmV3X251bGwoKTsKKwkJaWYgKCpzayA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CQorbmV3X2F0dHJpYjoKKwkJaWYgKCEoYXR0cj1YNTA5X0FUVFJJQlVURV9jcmVhdGUobmlkLGF0cnR5cGUsdmFsdWUpKSkKKwkJCXJldHVybiAwOworCQlpZiAoIXNrX1g1MDlfQVRUUklCVVRFX3B1c2goKnNrLGF0dHIpKQorCQkJeworCQkJWDUwOV9BVFRSSUJVVEVfZnJlZShhdHRyKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWludCBpOworCisJCWZvciAoaT0wOyBpPHNrX1g1MDlfQVRUUklCVVRFX251bSgqc2spOyBpKyspCisJCQl7CisJCQlhdHRyPXNrX1g1MDlfQVRUUklCVVRFX3ZhbHVlKCpzayxpKTsKKwkJCWlmIChPQkpfb2JqMm5pZChhdHRyLT5vYmplY3QpID09IG5pZCkKKwkJCQl7CisJCQkJWDUwOV9BVFRSSUJVVEVfZnJlZShhdHRyKTsKKwkJCQlhdHRyPVg1MDlfQVRUUklCVVRFX2NyZWF0ZShuaWQsYXRydHlwZSx2YWx1ZSk7CisJCQkJaWYgKGF0dHIgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJaWYgKCFza19YNTA5X0FUVFJJQlVURV9zZXQoKnNrLGksYXR0cikpCisJCQkJCXsKKwkJCQkJWDUwOV9BVFRSSUJVVEVfZnJlZShhdHRyKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisJCWdvdG8gbmV3X2F0dHJpYjsKKwkJfQorZW5kOgorCXJldHVybigxKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfZW5jLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcGs3X2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYmIxODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcGs3X2VuYy5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIGNyeXB0by9wa2NzNy9wazdfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczcuaD4KKworUEtDUzdfaW5fYmlvKFBLQ1M3ICpwNyxCSU8gKmluKTsKK1BLQ1M3X291dF9iaW8oUEtDUzcgKnA3LEJJTyAqb3V0KTsKKworUEtDUzdfYWRkX3NpZ25lcihQS0NTNyAqcDcsWDUwOSAqY2VydCxFVlBfUEtFWSAqa2V5KTsKK1BLQ1M3X2NpcGhlcihQS0NTNyAqcDcsRVZQX0NJUEhFUiAqY2lwaGVyKTsKKworUEtDUzdfSW5pdChQS0NTNyAqcDcpOworUEtDUzdfVXBkYXRlKFBLQ1M3ICpwNyk7CitQS0NTN19GaW5pc2goUEtDUzcgKnA3KTsKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhMDk1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wazdfbGliLmMKQEAgLTAsMCArMSw2NjcgQEAKKy8qIGNyeXB0by9wa2NzNy9wazdfbGliLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlICJhc24xX2xvY2wuaCIKKworbG9uZyBQS0NTN19jdHJsKFBLQ1M3ICpwNywgaW50IGNtZCwgbG9uZyBsYXJnLCBjaGFyICpwYXJnKQorCXsKKwlpbnQgbmlkOworCWxvbmcgcmV0OworCisJbmlkPU9CSl9vYmoybmlkKHA3LT50eXBlKTsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBQS0NTN19PUF9TRVRfREVUQUNIRURfU0lHTkFUVVJFOgorCQlpZiAobmlkID09IE5JRF9wa2NzN19zaWduZWQpCisJCQl7CisJCQlyZXQ9cDctPmRldGFjaGVkPShpbnQpbGFyZzsKKwkJCWlmIChyZXQgJiYgUEtDUzdfdHlwZV9pc19kYXRhKHA3LT5kLnNpZ24tPmNvbnRlbnRzKSkKKwkJCQkJeworCQkJCQlBU04xX09DVEVUX1NUUklORyAqb3M7CisJCQkJCW9zPXA3LT5kLnNpZ24tPmNvbnRlbnRzLT5kLmRhdGE7CisJCQkJCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MpOworCQkJCQlwNy0+ZC5zaWduLT5jb250ZW50cy0+ZC5kYXRhID0gTlVMTDsKKwkJCQkJfQorCQkJfQorCQllbHNlCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0NUUkwsUEtDUzdfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9PTl9USElTX1RZUEUpOworCQkJcmV0PTA7CisJCQl9CisJCWJyZWFrOworCWNhc2UgUEtDUzdfT1BfR0VUX0RFVEFDSEVEX1NJR05BVFVSRToKKwkJaWYgKG5pZCA9PSBOSURfcGtjczdfc2lnbmVkKQorCQkJeworCQkJaWYoIXA3LT5kLnNpZ24gIHx8ICFwNy0+ZC5zaWduLT5jb250ZW50cy0+ZC5wdHIpCisJCQkJcmV0ID0gMTsKKwkJCWVsc2UgcmV0ID0gMDsKKwkJCQkKKwkJCXA3LT5kZXRhY2hlZCA9IHJldDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19DVFJMLFBLQ1M3X1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfT05fVEhJU19UWVBFKTsKKwkJCXJldD0wOworCQkJfQorCQkJCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfQ1RSTCxQS0NTN19SX1VOS05PV05fT1BFUkFUSU9OKTsKKwkJcmV0PTA7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBQS0NTN19jb250ZW50X25ldyhQS0NTNyAqcDcsIGludCB0eXBlKQorCXsKKwlQS0NTNyAqcmV0PU5VTEw7CisKKwlpZiAoKHJldD1QS0NTN19uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKCFQS0NTN19zZXRfdHlwZShyZXQsdHlwZSkpIGdvdG8gZXJyOworCWlmICghUEtDUzdfc2V0X2NvbnRlbnQocDcscmV0KSkgZ290byBlcnI7CisKKwlyZXR1cm4oMSk7CitlcnI6CisJaWYgKHJldCAhPSBOVUxMKSBQS0NTN19mcmVlKHJldCk7CisJcmV0dXJuKDApOworCX0KKworaW50IFBLQ1M3X3NldF9jb250ZW50KFBLQ1M3ICpwNywgUEtDUzcgKnA3X2RhdGEpCisJeworCWludCBpOworCisJaT1PQkpfb2JqMm5pZChwNy0+dHlwZSk7CisJc3dpdGNoIChpKQorCQl7CisJY2FzZSBOSURfcGtjczdfc2lnbmVkOgorCQlpZiAocDctPmQuc2lnbi0+Y29udGVudHMgIT0gTlVMTCkKKwkJCVBLQ1M3X2ZyZWUocDctPmQuc2lnbi0+Y29udGVudHMpOworCQlwNy0+ZC5zaWduLT5jb250ZW50cz1wN19kYXRhOworCQlicmVhazsKKwljYXNlIE5JRF9wa2NzN19kaWdlc3Q6CisJCWlmIChwNy0+ZC5kaWdlc3QtPmNvbnRlbnRzICE9IE5VTEwpCisJCQlQS0NTN19mcmVlKHA3LT5kLmRpZ2VzdC0+Y29udGVudHMpOworCQlwNy0+ZC5kaWdlc3QtPmNvbnRlbnRzPXA3X2RhdGE7CisJCWJyZWFrOworCWNhc2UgTklEX3BrY3M3X2RhdGE6CisJY2FzZSBOSURfcGtjczdfZW52ZWxvcGVkOgorCWNhc2UgTklEX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZDoKKwljYXNlIE5JRF9wa2NzN19lbmNyeXB0ZWQ6CisJZGVmYXVsdDoKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TRVRfQ09OVEVOVCxQS0NTN19SX1VOU1VQUE9SVEVEX0NPTlRFTlRfVFlQRSk7CisJCWdvdG8gZXJyOworCQl9CisJcmV0dXJuKDEpOworZXJyOgorCXJldHVybigwKTsKKwl9CisKK2ludCBQS0NTN19zZXRfdHlwZShQS0NTNyAqcDcsIGludCB0eXBlKQorCXsKKwlBU04xX09CSkVDVCAqb2JqOworCisJLypQS0NTN19jb250ZW50X2ZyZWUocDcpOyovCisJb2JqPU9CSl9uaWQyb2JqKHR5cGUpOyAvKiB3aWxsIG5vdCBmYWlsICovCisKKwlzd2l0Y2ggKHR5cGUpCisJCXsKKwljYXNlIE5JRF9wa2NzN19zaWduZWQ6CisJCXA3LT50eXBlPW9iajsKKwkJaWYgKChwNy0+ZC5zaWduPVBLQ1M3X1NJR05FRF9uZXcoKSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQlpZiAoIUFTTjFfSU5URUdFUl9zZXQocDctPmQuc2lnbi0+dmVyc2lvbiwxKSkKKwkJCXsKKwkJCVBLQ1M3X1NJR05FRF9mcmVlKHA3LT5kLnNpZ24pOworCQkJcDctPmQuc2lnbj1OVUxMOworCQkJZ290byBlcnI7CisJCQl9CisJCWJyZWFrOworCWNhc2UgTklEX3BrY3M3X2RhdGE6CisJCXA3LT50eXBlPW9iajsKKwkJaWYgKChwNy0+ZC5kYXRhPU1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJYnJlYWs7CisJY2FzZSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkOgorCQlwNy0+dHlwZT1vYmo7CisJCWlmICgocDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQ9UEtDUzdfU0lHTl9FTlZFTE9QRV9uZXcoKSkKKwkJCT09IE5VTEwpIGdvdG8gZXJyOworCQlBU04xX0lOVEVHRVJfc2V0KHA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT52ZXJzaW9uLDEpOworCQlpZiAoIUFTTjFfSU5URUdFUl9zZXQocDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPnZlcnNpb24sMSkpCisJCQlnb3RvIGVycjsKKwkJcDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPmVuY19kYXRhLT5jb250ZW50X3R5cGUKKwkJCQkJCT0gT0JKX25pZDJvYmooTklEX3BrY3M3X2RhdGEpOworCQlicmVhazsKKwljYXNlIE5JRF9wa2NzN19lbnZlbG9wZWQ6CisJCXA3LT50eXBlPW9iajsKKwkJaWYgKChwNy0+ZC5lbnZlbG9wZWQ9UEtDUzdfRU5WRUxPUEVfbmV3KCkpCisJCQk9PSBOVUxMKSBnb3RvIGVycjsKKwkJaWYgKCFBU04xX0lOVEVHRVJfc2V0KHA3LT5kLmVudmVsb3BlZC0+dmVyc2lvbiwwKSkKKwkJCWdvdG8gZXJyOworCQlwNy0+ZC5lbnZlbG9wZWQtPmVuY19kYXRhLT5jb250ZW50X3R5cGUKKwkJCQkJCT0gT0JKX25pZDJvYmooTklEX3BrY3M3X2RhdGEpOworCQlicmVhazsKKwljYXNlIE5JRF9wa2NzN19lbmNyeXB0ZWQ6CisJCXA3LT50eXBlPW9iajsKKwkJaWYgKChwNy0+ZC5lbmNyeXB0ZWQ9UEtDUzdfRU5DUllQVF9uZXcoKSkKKwkJCT09IE5VTEwpIGdvdG8gZXJyOworCQlpZiAoIUFTTjFfSU5URUdFUl9zZXQocDctPmQuZW5jcnlwdGVkLT52ZXJzaW9uLDApKQorCQkJZ290byBlcnI7CisJCXA3LT5kLmVuY3J5cHRlZC0+ZW5jX2RhdGEtPmNvbnRlbnRfdHlwZQorCQkJCQkJPSBPQkpfbmlkMm9iaihOSURfcGtjczdfZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBOSURfcGtjczdfZGlnZXN0OgorCQlwNy0+dHlwZT1vYmo7CisJCWlmICgocDctPmQuZGlnZXN0PVBLQ1M3X0RJR0VTVF9uZXcoKSkKKwkJCT09IE5VTEwpIGdvdG8gZXJyOworCQlpZiAoIUFTTjFfSU5URUdFUl9zZXQocDctPmQuZGlnZXN0LT52ZXJzaW9uLDApKQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfU0VUX1RZUEUsUEtDUzdfUl9VTlNVUFBPUlRFRF9DT05URU5UX1RZUEUpOworCQlnb3RvIGVycjsKKwkJfQorCXJldHVybigxKTsKK2VycjoKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgUEtDUzdfc2V0MF90eXBlX290aGVyKFBLQ1M3ICpwNywgaW50IHR5cGUsIEFTTjFfVFlQRSAqb3RoZXIpCisJeworCXA3LT50eXBlID0gT0JKX25pZDJvYmoodHlwZSk7CisJcDctPmQub3RoZXIgPSBvdGhlcjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBQS0NTN19hZGRfc2lnbmVyKFBLQ1M3ICpwNywgUEtDUzdfU0lHTkVSX0lORk8gKnBzaSkKKwl7CisJaW50IGksaixuaWQ7CisJWDUwOV9BTEdPUiAqYWxnOworCVNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqc2lnbmVyX3NrOworCVNUQUNLX09GKFg1MDlfQUxHT1IpICptZF9zazsKKworCWk9T0JKX29iajJuaWQocDctPnR5cGUpOworCXN3aXRjaCAoaSkKKwkJeworCWNhc2UgTklEX3BrY3M3X3NpZ25lZDoKKwkJc2lnbmVyX3NrPQlwNy0+ZC5zaWduLT5zaWduZXJfaW5mbzsKKwkJbWRfc2s9CQlwNy0+ZC5zaWduLT5tZF9hbGdzOworCQlicmVhazsKKwljYXNlIE5JRF9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQ6CisJCXNpZ25lcl9zaz0JcDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPnNpZ25lcl9pbmZvOworCQltZF9zaz0JCXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5tZF9hbGdzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0FERF9TSUdORVIsUEtDUzdfUl9XUk9OR19DT05URU5UX1RZUEUpOworCQlyZXR1cm4oMCk7CisJCX0KKworCW5pZD1PQkpfb2JqMm5pZChwc2ktPmRpZ2VzdF9hbGctPmFsZ29yaXRobSk7CisKKwkvKiBJZiB0aGUgZGlnZXN0IGlzIG5vdCBjdXJyZW50bHkgbGlzdGVkLCBhZGQgaXQgKi8KKwlqPTA7CisJZm9yIChpPTA7IGk8c2tfWDUwOV9BTEdPUl9udW0obWRfc2spOyBpKyspCisJCXsKKwkJYWxnPXNrX1g1MDlfQUxHT1JfdmFsdWUobWRfc2ssaSk7CisJCWlmIChPQkpfb2JqMm5pZChhbGctPmFsZ29yaXRobSkgPT0gbmlkKQorCQkJeworCQkJaj0xOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwlpZiAoIWopIC8qIHdlIG5lZWQgdG8gYWRkIGFub3RoZXIgYWxnb3JpdGhtICovCisJCXsKKwkJaWYoIShhbGc9WDUwOV9BTEdPUl9uZXcoKSkKKwkJCXx8ICEoYWxnLT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCkpKQorCQkJeworCQkJWDUwOV9BTEdPUl9mcmVlKGFsZyk7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0FERF9TSUdORVIsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKDApOworCQkJfQorCQlhbGctPmFsZ29yaXRobT1PQkpfbmlkMm9iaihuaWQpOworCQlhbGctPnBhcmFtZXRlci0+dHlwZSA9IFZfQVNOMV9OVUxMOworCQlpZiAoIXNrX1g1MDlfQUxHT1JfcHVzaChtZF9zayxhbGcpKQorCQkJeworCQkJWDUwOV9BTEdPUl9mcmVlKGFsZyk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJaWYgKCFza19QS0NTN19TSUdORVJfSU5GT19wdXNoKHNpZ25lcl9zayxwc2kpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgUEtDUzdfYWRkX2NlcnRpZmljYXRlKFBLQ1M3ICpwNywgWDUwOSAqeDUwOSkKKwl7CisJaW50IGk7CisJU1RBQ0tfT0YoWDUwOSkgKipzazsKKworCWk9T0JKX29iajJuaWQocDctPnR5cGUpOworCXN3aXRjaCAoaSkKKwkJeworCWNhc2UgTklEX3BrY3M3X3NpZ25lZDoKKwkJc2s9ICYocDctPmQuc2lnbi0+Y2VydCk7CisJCWJyZWFrOworCWNhc2UgTklEX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZDoKKwkJc2s9ICYocDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPmNlcnQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0FERF9DRVJUSUZJQ0FURSxQS0NTN19SX1dST05HX0NPTlRFTlRfVFlQRSk7CisJCXJldHVybigwKTsKKwkJfQorCisJaWYgKCpzayA9PSBOVUxMKQorCQkqc2s9c2tfWDUwOV9uZXdfbnVsbCgpOworCWlmICgqc2sgPT0gTlVMTCkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0FERF9DRVJUSUZJQ0FURSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT19hZGQoJng1MDktPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5KTsKKwlpZiAoIXNrX1g1MDlfcHVzaCgqc2sseDUwOSkpCisJCXsKKwkJWDUwOV9mcmVlKHg1MDkpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybigxKTsKKwl9CisKK2ludCBQS0NTN19hZGRfY3JsKFBLQ1M3ICpwNywgWDUwOV9DUkwgKmNybCkKKwl7CisJaW50IGk7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICoqc2s7CisKKwlpPU9CSl9vYmoybmlkKHA3LT50eXBlKTsKKwlzd2l0Y2ggKGkpCisJCXsKKwljYXNlIE5JRF9wa2NzN19zaWduZWQ6CisJCXNrPSAmKHA3LT5kLnNpZ24tPmNybCk7CisJCWJyZWFrOworCWNhc2UgTklEX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZDoKKwkJc2s9ICYocDctPmQuc2lnbmVkX2FuZF9lbnZlbG9wZWQtPmNybCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfQUREX0NSTCxQS0NTN19SX1dST05HX0NPTlRFTlRfVFlQRSk7CisJCXJldHVybigwKTsKKwkJfQorCisJaWYgKCpzayA9PSBOVUxMKQorCQkqc2s9c2tfWDUwOV9DUkxfbmV3X251bGwoKTsKKwlpZiAoKnNrID09IE5VTEwpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19BRERfQ1JMLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCUNSWVBUT19hZGQoJmNybC0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDlfQ1JMKTsKKwlpZiAoIXNrX1g1MDlfQ1JMX3B1c2goKnNrLGNybCkpCisJCXsKKwkJWDUwOV9DUkxfZnJlZShjcmwpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybigxKTsKKwl9CisKK2ludCBQS0NTN19TSUdORVJfSU5GT19zZXQoUEtDUzdfU0lHTkVSX0lORk8gKnA3aSwgWDUwOSAqeDUwOSwgRVZQX1BLRVkgKnBrZXksCisJICAgICBjb25zdCBFVlBfTUQgKmRnc3QpCisJeworCWludCByZXQ7CisKKwkvKiBXZSBub3cgbmVlZCB0byBhZGQgYW5vdGhlciBQS0NTN19TSUdORVJfSU5GTyBlbnRyeSAqLworCWlmICghQVNOMV9JTlRFR0VSX3NldChwN2ktPnZlcnNpb24sMSkpCisJCWdvdG8gZXJyOworCWlmICghWDUwOV9OQU1FX3NldCgmcDdpLT5pc3N1ZXJfYW5kX3NlcmlhbC0+aXNzdWVyLAorCQkJWDUwOV9nZXRfaXNzdWVyX25hbWUoeDUwOSkpKQorCQlnb3RvIGVycjsKKworCS8qIGJlY2F1c2UgQVNOMV9JTlRFR0VSX3NldCBpcyB1c2VkIHRvIHNldCBhICdsb25nJyB3ZSB3aWxsIGRvCisJICogdGhpbmdzIHRoZSB1Z2x5IHdheS4gKi8KKwlNX0FTTjFfSU5URUdFUl9mcmVlKHA3aS0+aXNzdWVyX2FuZF9zZXJpYWwtPnNlcmlhbCk7CisJaWYgKCEocDdpLT5pc3N1ZXJfYW5kX3NlcmlhbC0+c2VyaWFsPQorCQkJTV9BU04xX0lOVEVHRVJfZHVwKFg1MDlfZ2V0X3NlcmlhbE51bWJlcih4NTA5KSkpKQorCQlnb3RvIGVycjsKKworCS8qIGxldHMga2VlcCB0aGUgcGtleSBhcm91bmQgZm9yIGEgd2hpbGUgKi8KKwlDUllQVE9fYWRkKCZwa2V5LT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworCXA3aS0+cGtleT1wa2V5OworCisJLyogU2V0IHRoZSBhbGdvcml0aG1zICovCisKKwlYNTA5X0FMR09SX3NldDAocDdpLT5kaWdlc3RfYWxnLCBPQkpfbmlkMm9iaihFVlBfTURfdHlwZShkZ3N0KSksCisJCQkJVl9BU04xX05VTEwsIE5VTEwpOworCisJaWYgKHBrZXktPmFtZXRoICYmIHBrZXktPmFtZXRoLT5wa2V5X2N0cmwpCisJCXsKKwkJcmV0ID0gcGtleS0+YW1ldGgtPnBrZXlfY3RybChwa2V5LCBBU04xX1BLRVlfQ1RSTF9QS0NTN19TSUdOLAorCQkJCQkJMCwgcDdpKTsKKwkJaWYgKHJldCA+IDApCisJCQlyZXR1cm4gMTsKKwkJaWYgKHJldCAhPSAtMikKKwkJCXsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfU0lHTkVSX0lORk9fU0VULAorCQkJCQlQS0NTN19SX1NJR05JTkdfQ1RSTF9GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TSUdORVJfSU5GT19TRVQsCisJCQlQS0NTN19SX1NJR05JTkdfTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlfVFlQRSk7CitlcnI6CisJcmV0dXJuIDA7CisJfQorCitQS0NTN19TSUdORVJfSU5GTyAqUEtDUzdfYWRkX3NpZ25hdHVyZShQS0NTNyAqcDcsIFg1MDkgKng1MDksIEVWUF9QS0VZICpwa2V5LAorCSAgICAgY29uc3QgRVZQX01EICpkZ3N0KQorCXsKKwlQS0NTN19TSUdORVJfSU5GTyAqc2kgPSBOVUxMOworCisJaWYgKGRnc3QgPT0gTlVMTCkKKwkJeworCQlpbnQgZGVmX25pZDsKKwkJaWYgKEVWUF9QS0VZX2dldF9kZWZhdWx0X2RpZ2VzdF9uaWQocGtleSwgJmRlZl9uaWQpIDw9IDApCisJCQlnb3RvIGVycjsKKwkJZGdzdCA9IEVWUF9nZXRfZGlnZXN0YnluaWQoZGVmX25pZCk7CisJCWlmIChkZ3N0ID09IE5VTEwpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0FERF9TSUdOQVRVUkUsCisJCQkJCQlQS0NTN19SX05PX0RFRkFVTFRfRElHRVNUKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAoKHNpPVBLQ1M3X1NJR05FUl9JTkZPX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoIVBLQ1M3X1NJR05FUl9JTkZPX3NldChzaSx4NTA5LHBrZXksZGdzdCkpIGdvdG8gZXJyOworCWlmICghUEtDUzdfYWRkX3NpZ25lcihwNyxzaSkpIGdvdG8gZXJyOworCXJldHVybihzaSk7CitlcnI6CisJaWYgKHNpKQorCQlQS0NTN19TSUdORVJfSU5GT19mcmVlKHNpKTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitpbnQgUEtDUzdfc2V0X2RpZ2VzdChQS0NTNyAqcDcsIGNvbnN0IEVWUF9NRCAqbWQpCisJeworCWlmIChQS0NTN190eXBlX2lzX2RpZ2VzdChwNykpCisJCXsKKwkJaWYoIShwNy0+ZC5kaWdlc3QtPm1kLT5wYXJhbWV0ZXIgPSBBU04xX1RZUEVfbmV3KCkpKQorCQkJeworCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TRVRfRElHRVNULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlwNy0+ZC5kaWdlc3QtPm1kLT5wYXJhbWV0ZXItPnR5cGUgPSBWX0FTTjFfTlVMTDsKKwkJcDctPmQuZGlnZXN0LT5tZC0+YWxnb3JpdGhtID0gT0JKX25pZDJvYmooRVZQX01EX25pZChtZCkpOworCQlyZXR1cm4gMTsKKwkJfQorCQkKKwlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NFVF9ESUdFU1QsUEtDUzdfUl9XUk9OR19DT05URU5UX1RZUEUpOworCXJldHVybiAxOworCX0KKworU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICpQS0NTN19nZXRfc2lnbmVyX2luZm8oUEtDUzcgKnA3KQorCXsKKwlpZiAoUEtDUzdfdHlwZV9pc19zaWduZWQocDcpKQorCQl7CisJCXJldHVybihwNy0+ZC5zaWduLT5zaWduZXJfaW5mbyk7CisJCX0KKwllbHNlIGlmIChQS0NTN190eXBlX2lzX3NpZ25lZEFuZEVudmVsb3BlZChwNykpCisJCXsKKwkJcmV0dXJuKHA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5zaWduZXJfaW5mbyk7CisJCX0KKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKK3ZvaWQgUEtDUzdfU0lHTkVSX0lORk9fZ2V0MF9hbGdzKFBLQ1M3X1NJR05FUl9JTkZPICpzaSwgRVZQX1BLRVkgKipwaywKKwkJCQkJWDUwOV9BTEdPUiAqKnBkaWcsIFg1MDlfQUxHT1IgKipwc2lnKQorCXsKKwlpZiAocGspCisJCSpwayA9IHNpLT5wa2V5OworCWlmIChwZGlnKQorCQkqcGRpZyA9IHNpLT5kaWdlc3RfYWxnOworCWlmIChwc2lnKQorCQkqcHNpZyA9IHNpLT5kaWdlc3RfZW5jX2FsZzsKKwl9CisKK3ZvaWQgUEtDUzdfUkVDSVBfSU5GT19nZXQwX2FsZyhQS0NTN19SRUNJUF9JTkZPICpyaSwgWDUwOV9BTEdPUiAqKnBlbmMpCisJeworCWlmIChwZW5jKQorCQkqcGVuYyA9IHJpLT5rZXlfZW5jX2FsZ29yOworCX0KKworUEtDUzdfUkVDSVBfSU5GTyAqUEtDUzdfYWRkX3JlY2lwaWVudChQS0NTNyAqcDcsIFg1MDkgKng1MDkpCisJeworCVBLQ1M3X1JFQ0lQX0lORk8gKnJpOworCisJaWYgKChyaT1QS0NTN19SRUNJUF9JTkZPX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlpZiAoIVBLQ1M3X1JFQ0lQX0lORk9fc2V0KHJpLHg1MDkpKSBnb3RvIGVycjsKKwlpZiAoIVBLQ1M3X2FkZF9yZWNpcGllbnRfaW5mbyhwNyxyaSkpIGdvdG8gZXJyOworCXJldHVybiByaTsKK2VycjoKKwlpZiAocmkpCisJCVBLQ1M3X1JFQ0lQX0lORk9fZnJlZShyaSk7CisJcmV0dXJuIE5VTEw7CisJfQorCitpbnQgUEtDUzdfYWRkX3JlY2lwaWVudF9pbmZvKFBLQ1M3ICpwNywgUEtDUzdfUkVDSVBfSU5GTyAqcmkpCisJeworCWludCBpOworCVNUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pICpzazsKKworCWk9T0JKX29iajJuaWQocDctPnR5cGUpOworCXN3aXRjaCAoaSkKKwkJeworCWNhc2UgTklEX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZDoKKwkJc2s9CXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5yZWNpcGllbnRpbmZvOworCQlicmVhazsKKwljYXNlIE5JRF9wa2NzN19lbnZlbG9wZWQ6CisJCXNrPQlwNy0+ZC5lbnZlbG9wZWQtPnJlY2lwaWVudGluZm87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfQUREX1JFQ0lQSUVOVF9JTkZPLFBLQ1M3X1JfV1JPTkdfQ09OVEVOVF9UWVBFKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlpZiAoIXNrX1BLQ1M3X1JFQ0lQX0lORk9fcHVzaChzayxyaSkpCisJCXJldHVybiAwOworCXJldHVybigxKTsKKwl9CisKK2ludCBQS0NTN19SRUNJUF9JTkZPX3NldChQS0NTN19SRUNJUF9JTkZPICpwN2ksIFg1MDkgKng1MDkpCisJeworCWludCByZXQ7CisJRVZQX1BLRVkgKnBrZXkgPSBOVUxMOworCWlmICghQVNOMV9JTlRFR0VSX3NldChwN2ktPnZlcnNpb24sMCkpCisJCXJldHVybiAwOworCWlmICghWDUwOV9OQU1FX3NldCgmcDdpLT5pc3N1ZXJfYW5kX3NlcmlhbC0+aXNzdWVyLAorCQlYNTA5X2dldF9pc3N1ZXJfbmFtZSh4NTA5KSkpCisJCXJldHVybiAwOworCisJTV9BU04xX0lOVEVHRVJfZnJlZShwN2ktPmlzc3Vlcl9hbmRfc2VyaWFsLT5zZXJpYWwpOworCWlmICghKHA3aS0+aXNzdWVyX2FuZF9zZXJpYWwtPnNlcmlhbD0KKwkJTV9BU04xX0lOVEVHRVJfZHVwKFg1MDlfZ2V0X3NlcmlhbE51bWJlcih4NTA5KSkpKQorCQlyZXR1cm4gMDsKKworCXBrZXkgPSBYNTA5X2dldF9wdWJrZXkoeDUwOSk7CisKKwlpZiAoIXBrZXkgfHwgIXBrZXktPmFtZXRoIHx8ICFwa2V5LT5hbWV0aC0+cGtleV9jdHJsKQorCQl7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfUkVDSVBfSU5GT19TRVQsCisJCQlQS0NTN19SX0VOQ1JZUFRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlfVFlQRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlyZXQgPSBwa2V5LT5hbWV0aC0+cGtleV9jdHJsKHBrZXksIEFTTjFfUEtFWV9DVFJMX1BLQ1M3X0VOQ1JZUFQsCisJCQkJCQkwLCBwN2kpOworCWlmIChyZXQgPT0gLTIpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19SRUNJUF9JTkZPX1NFVCwKKwkJCVBLQ1M3X1JfRU5DUllQVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWV9UWVBFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAocmV0IDw9IDApCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19SRUNJUF9JTkZPX1NFVCwKKwkJCQlQS0NTN19SX0VOQ1JZUFRJT05fQ1RSTF9GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCUVWUF9QS0VZX2ZyZWUocGtleSk7CisKKwlDUllQVE9fYWRkKCZ4NTA5LT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfWDUwOSk7CisJcDdpLT5jZXJ0PXg1MDk7CisKKwlyZXR1cm4gMTsKKworCWVycjoKKwlpZiAocGtleSkKKwkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlyZXR1cm4gMDsKKwl9CisKK1g1MDkgKlBLQ1M3X2NlcnRfZnJvbV9zaWduZXJfaW5mbyhQS0NTNyAqcDcsIFBLQ1M3X1NJR05FUl9JTkZPICpzaSkKKwl7CisJaWYgKFBLQ1M3X3R5cGVfaXNfc2lnbmVkKHA3KSkKKwkJcmV0dXJuKFg1MDlfZmluZF9ieV9pc3N1ZXJfYW5kX3NlcmlhbChwNy0+ZC5zaWduLT5jZXJ0LAorCQkJc2ktPmlzc3Vlcl9hbmRfc2VyaWFsLT5pc3N1ZXIsCisJCQlzaS0+aXNzdWVyX2FuZF9zZXJpYWwtPnNlcmlhbCkpOworCWVsc2UKKwkJcmV0dXJuKE5VTEwpOworCX0KKworaW50IFBLQ1M3X3NldF9jaXBoZXIoUEtDUzcgKnA3LCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpCisJeworCWludCBpOworCUFTTjFfT0JKRUNUICpvYmp0bXA7CisJUEtDUzdfRU5DX0NPTlRFTlQgKmVjOworCisJaT1PQkpfb2JqMm5pZChwNy0+dHlwZSk7CisJc3dpdGNoIChpKQorCQl7CisJY2FzZSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkOgorCQllYz1wNy0+ZC5zaWduZWRfYW5kX2VudmVsb3BlZC0+ZW5jX2RhdGE7CisJCWJyZWFrOworCWNhc2UgTklEX3BrY3M3X2VudmVsb3BlZDoKKwkJZWM9cDctPmQuZW52ZWxvcGVkLT5lbmNfZGF0YTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TRVRfQ0lQSEVSLFBLQ1M3X1JfV1JPTkdfQ09OVEVOVF9UWVBFKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwkvKiBDaGVjayBjaXBoZXIgT0lEIGV4aXN0cyBhbmQgaGFzIGRhdGEgaW4gaXQqLworCWkgPSBFVlBfQ0lQSEVSX3R5cGUoY2lwaGVyKTsKKwlpZihpID09IE5JRF91bmRlZikgeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NFVF9DSVBIRVIsUEtDUzdfUl9DSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSKTsKKwkJcmV0dXJuKDApOworCX0KKwlvYmp0bXAgPSBPQkpfbmlkMm9iaihpKTsKKworCWVjLT5jaXBoZXIgPSBjaXBoZXI7CisJcmV0dXJuIDE7CisJfQorCitpbnQgUEtDUzdfc3RyZWFtKHVuc2lnbmVkIGNoYXIgKioqYm91bmRhcnksIFBLQ1M3ICpwNykKKwl7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKm9zID0gTlVMTDsKKworCXN3aXRjaCAoT0JKX29iajJuaWQocDctPnR5cGUpKQorCQl7CisJCWNhc2UgTklEX3BrY3M3X2RhdGE6CisJCW9zID0gcDctPmQuZGF0YTsKKwkJYnJlYWs7CisKKwkJY2FzZSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkOgorCQlvcyA9IHA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5lbmNfZGF0YS0+ZW5jX2RhdGE7CisJCWlmIChvcyA9PSBOVUxMKQorCQkJeworCQkJb3M9TV9BU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwkJCXA3LT5kLnNpZ25lZF9hbmRfZW52ZWxvcGVkLT5lbmNfZGF0YS0+ZW5jX2RhdGE9b3M7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTklEX3BrY3M3X2VudmVsb3BlZDoKKwkJb3MgPSBwNy0+ZC5lbnZlbG9wZWQtPmVuY19kYXRhLT5lbmNfZGF0YTsKKwkJaWYgKG9zID09IE5VTEwpCisJCQl7CisJCQlvcz1NX0FTTjFfT0NURVRfU1RSSU5HX25ldygpOworCQkJcDctPmQuZW52ZWxvcGVkLT5lbmNfZGF0YS0+ZW5jX2RhdGE9b3M7CisJCQl9CisJCWJyZWFrOworCisJCWNhc2UgTklEX3BrY3M3X3NpZ25lZDoKKwkJb3M9cDctPmQuc2lnbi0+Y29udGVudHMtPmQuZGF0YTsKKwkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJb3MgPSBOVUxMOworCQlicmVhazsKKwkJfQorCQorCWlmIChvcyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCW9zLT5mbGFncyB8PSBBU04xX1NUUklOR19GTEFHX05ERUY7CisJKmJvdW5kYXJ5ID0gJm9zLT5kYXRhOworCisJcmV0dXJuIDE7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19taW1lLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcGs3X21pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhmNzlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19taW1lLmMKQEAgLTAsMCArMSw5NyBAQAorLyogcGs3X21pbWUuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworLyogUEtDUyM3IHdyYXBwZXJzIHJvdW5kIGdlbmVyYWxpc2VkIHN0cmVhbSBhbmQgTUlNRSByb3V0aW5lcyAqLworCitpbnQgaTJkX1BLQ1M3X2Jpb19zdHJlYW0oQklPICpvdXQsIFBLQ1M3ICpwNywgQklPICppbiwgaW50IGZsYWdzKQorCXsKKwlyZXR1cm4gaTJkX0FTTjFfYmlvX3N0cmVhbShvdXQsIChBU04xX1ZBTFVFICopcDcsIGluLCBmbGFncywKKwkJCQkJQVNOMV9JVEVNX3JwdHIoUEtDUzcpKTsKKwl9CisKK2ludCBQRU1fd3JpdGVfYmlvX1BLQ1M3X3N0cmVhbShCSU8gKm91dCwgUEtDUzcgKnA3LCBCSU8gKmluLCBpbnQgZmxhZ3MpCisJeworCXJldHVybiBQRU1fd3JpdGVfYmlvX0FTTjFfc3RyZWFtKG91dCwgKEFTTjFfVkFMVUUgKikgcDcsIGluLCBmbGFncywKKwkJCQkJCSJQS0NTNyIsCisJCQkJCQlBU04xX0lURU1fcnB0cihQS0NTNykpOworCX0KKworaW50IFNNSU1FX3dyaXRlX1BLQ1M3KEJJTyAqYmlvLCBQS0NTNyAqcDcsIEJJTyAqZGF0YSwgaW50IGZsYWdzKQorCXsKKwlTVEFDS19PRihYNTA5X0FMR09SKSAqbWRhbGdzOworCWludCBjdHlwZV9uaWQgPSBPQkpfb2JqMm5pZChwNy0+dHlwZSk7CisJaWYgKGN0eXBlX25pZCA9PSBOSURfcGtjczdfc2lnbmVkKQorCQltZGFsZ3MgPSBwNy0+ZC5zaWduLT5tZF9hbGdzOworCWVsc2UKKwkJbWRhbGdzID0gTlVMTDsKKworCWZsYWdzIF49IFNNSU1FX09MRE1JTUU7CisKKworCXJldHVybiBTTUlNRV93cml0ZV9BU04xKGJpbywgKEFTTjFfVkFMVUUgKilwNywgZGF0YSwgZmxhZ3MsCisJCQkJCWN0eXBlX25pZCwgTklEX3VuZGVmLCBtZGFsZ3MsCisJCQkJCUFTTjFfSVRFTV9ycHRyKFBLQ1M3KSk7CQorCX0KKworUEtDUzcgKlNNSU1FX3JlYWRfUEtDUzcoQklPICpiaW8sIEJJTyAqKmJjb250KQorCXsKKwlyZXR1cm4gKFBLQ1M3ICopU01JTUVfcmVhZF9BU04xKGJpbywgYmNvbnQsIEFTTjFfSVRFTV9ycHRyKFBLQ1M3KSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19zbWltZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrN19zbWltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NzQyZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvcGs3X3NtaW1lLmMKQEAgLTAsMCArMSw1ODcgQEAKKy8qIHBrN19zbWltZS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBTaW1wbGUgUEtDUyM3IHByb2Nlc3NpbmcgZnVuY3Rpb25zICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIGludCBwa2NzN19jb3B5X2V4aXN0aW5nX2RpZ2VzdChQS0NTNyAqcDcsIFBLQ1M3X1NJR05FUl9JTkZPICpzaSk7CisKK1BLQ1M3ICpQS0NTN19zaWduKFg1MDkgKnNpZ25jZXJ0LCBFVlBfUEtFWSAqcGtleSwgU1RBQ0tfT0YoWDUwOSkgKmNlcnRzLAorCQkgIEJJTyAqZGF0YSwgaW50IGZsYWdzKQoreworCVBLQ1M3ICpwNzsKKwlpbnQgaTsKKworCWlmKCEocDcgPSBQS0NTN19uZXcoKSkpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TSUdOLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCWlmICghUEtDUzdfc2V0X3R5cGUocDcsIE5JRF9wa2NzN19zaWduZWQpKQorCQlnb3RvIGVycjsKKworCWlmICghUEtDUzdfY29udGVudF9uZXcocDcsIE5JRF9wa2NzN19kYXRhKSkKKwkJZ290byBlcnI7CisKKyAgICAJaWYgKHBrZXkgJiYgIVBLQ1M3X3NpZ25fYWRkX3NpZ25lcihwNywgc2lnbmNlcnQsIHBrZXksIE5VTEwsIGZsYWdzKSkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NJR04sUEtDUzdfUl9QS0NTN19BRERfU0lHTkVSX0VSUk9SKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmKCEoZmxhZ3MgJiBQS0NTN19OT0NFUlRTKSkKKwkJeworCQlmb3IoaSA9IDA7IGkgPCBza19YNTA5X251bShjZXJ0cyk7IGkrKykKKwkJCXsKKwkJCWlmICghUEtDUzdfYWRkX2NlcnRpZmljYXRlKHA3LCBza19YNTA5X3ZhbHVlKGNlcnRzLCBpKSkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCWlmKGZsYWdzICYgUEtDUzdfREVUQUNIRUQpCisJCVBLQ1M3X3NldF9kZXRhY2hlZChwNywgMSk7CisKKwlpZiAoZmxhZ3MgJiAoUEtDUzdfU1RSRUFNfFBLQ1M3X1BBUlRJQUwpKQorCQlyZXR1cm4gcDc7CisKKwlpZiAoUEtDUzdfZmluYWwocDcsIGRhdGEsIGZsYWdzKSkKKwkJcmV0dXJuIHA3OworCisJZXJyOgorCVBLQ1M3X2ZyZWUocDcpOworCXJldHVybiBOVUxMOworfQorCitpbnQgUEtDUzdfZmluYWwoUEtDUzcgKnA3LCBCSU8gKmRhdGEsIGludCBmbGFncykKKwl7CisJQklPICpwN2JpbzsKKwlpbnQgcmV0ID0gMDsKKwlpZiAoIShwN2JpbyA9IFBLQ1M3X2RhdGFJbml0KHA3LCBOVUxMKSkpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19GSU5BTCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisKKwlTTUlNRV9jcmxmX2NvcHkoZGF0YSwgcDdiaW8sIGZsYWdzKTsKKworCSh2b2lkKUJJT19mbHVzaChwN2Jpbyk7CisKKworICAgICAgICBpZiAoIVBLQ1M3X2RhdGFGaW5hbChwNyxwN2JpbykpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19GSU5BTCxQS0NTN19SX1BLQ1M3X0RBVEFTSUdOKTsKKwkJZ290byBlcnI7CisJCX0KKworCXJldCA9IDE7CisKKwllcnI6CisJQklPX2ZyZWVfYWxsKHA3YmlvKTsKKworCXJldHVybiByZXQ7CisKKwl9CisKKy8qIENoZWNrIHRvIHNlZSBpZiBhIGNpcGhlciBleGlzdHMgYW5kIGlmIHNvIGFkZCBTL01JTUUgY2FwYWJpbGl0aWVzICovCisKK3N0YXRpYyBpbnQgYWRkX2NpcGhlcl9zbWNhcChTVEFDS19PRihYNTA5X0FMR09SKSAqc2ssIGludCBuaWQsIGludCBhcmcpCisJeworCWlmIChFVlBfZ2V0X2NpcGhlcmJ5bmlkKG5pZCkpCisJCXJldHVybiBQS0NTN19zaW1wbGVfc21pbWVjYXAoc2ssIG5pZCwgYXJnKTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgYWRkX2RpZ2VzdF9zbWNhcChTVEFDS19PRihYNTA5X0FMR09SKSAqc2ssIGludCBuaWQsIGludCBhcmcpCisJeworCWlmIChFVlBfZ2V0X2RpZ2VzdGJ5bmlkKG5pZCkpCisJCXJldHVybiBQS0NTN19zaW1wbGVfc21pbWVjYXAoc2ssIG5pZCwgYXJnKTsKKwlyZXR1cm4gMTsKKwl9CisKK1BLQ1M3X1NJR05FUl9JTkZPICpQS0NTN19zaWduX2FkZF9zaWduZXIoUEtDUzcgKnA3LCBYNTA5ICpzaWduY2VydCwKKwkJCQkJRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQsCisJCQkJCWludCBmbGFncykKKwl7CisJUEtDUzdfU0lHTkVSX0lORk8gKnNpID0gTlVMTDsKKwlTVEFDS19PRihYNTA5X0FMR09SKSAqc21jYXAgPSBOVUxMOworCWlmKCFYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KHNpZ25jZXJ0LCBwa2V5KSkKKwkJeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1NJR05fQUREX1NJR05FUiwKKwkJCVBLQ1M3X1JfUFJJVkFURV9LRVlfRE9FU19OT1RfTUFUQ0hfQ0VSVElGSUNBVEUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCQl9CisKKyAgICAJaWYgKCEoc2kgPSBQS0NTN19hZGRfc2lnbmF0dXJlKHA3LHNpZ25jZXJ0LHBrZXksIG1kKSkpCisJCXsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TSUdOX0FERF9TSUdORVIsCisJCQkJUEtDUzdfUl9QS0NTN19BRERfU0lHTkFUVVJFX0VSUk9SKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCWlmKCEoZmxhZ3MgJiBQS0NTN19OT0NFUlRTKSkKKwkJeworCQlpZiAoIVBLQ1M3X2FkZF9jZXJ0aWZpY2F0ZShwNywgc2lnbmNlcnQpKQorCQkJZ290byBlcnI7CisJCX0KKworCWlmKCEoZmxhZ3MgJiBQS0NTN19OT0FUVFIpKQorCQl7CisJCWlmICghUEtDUzdfYWRkX2F0dHJpYl9jb250ZW50X3R5cGUoc2ksIE5VTEwpKQorCQkJZ290byBlcnI7CisJCS8qIEFkZCBTTUlNRUNhcGFiaWxpdGllcyAqLworCQlpZighKGZsYWdzICYgUEtDUzdfTk9TTUlNRUNBUCkpCisJCQl7CisJCQlpZighKHNtY2FwID0gc2tfWDUwOV9BTEdPUl9uZXdfbnVsbCgpKSkKKwkJCQl7CisJCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19TSUdOX0FERF9TSUdORVIsCisJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoIWFkZF9jaXBoZXJfc21jYXAoc21jYXAsIE5JRF9hZXNfMjU2X2NiYywgLTEpCisJCQl8fCAhYWRkX2RpZ2VzdF9zbWNhcChzbWNhcCwgTklEX2lkX0dvc3RSMzQxMV85NCwgLTEpCisJCQl8fCAhYWRkX2NpcGhlcl9zbWNhcChzbWNhcCwgTklEX2lkX0dvc3QyODE0N184OSwgLTEpCisJCQkJfHwgIWFkZF9jaXBoZXJfc21jYXAoc21jYXAsIE5JRF9hZXNfMTkyX2NiYywgLTEpCisJCQkJfHwgIWFkZF9jaXBoZXJfc21jYXAoc21jYXAsIE5JRF9hZXNfMTI4X2NiYywgLTEpCisJCQl8fCAhYWRkX2NpcGhlcl9zbWNhcChzbWNhcCwgTklEX2Rlc19lZGUzX2NiYywgLTEpCisJCQkJfHwgIWFkZF9jaXBoZXJfc21jYXAoc21jYXAsIE5JRF9yYzJfY2JjLCAxMjgpCisJCQkJfHwgIWFkZF9jaXBoZXJfc21jYXAoc21jYXAsIE5JRF9yYzJfY2JjLCA2NCkKKwkJCQl8fCAhYWRkX2NpcGhlcl9zbWNhcChzbWNhcCwgTklEX2Rlc19jYmMsIC0xKQorCQkJCXx8ICFhZGRfY2lwaGVyX3NtY2FwKHNtY2FwLCBOSURfcmMyX2NiYywgNDApCisJCQkJfHwgIVBLQ1M3X2FkZF9hdHRyaWJfc21pbWVjYXAgKHNpLCBzbWNhcCkpCisJCQkJZ290byBlcnI7CisJCQlza19YNTA5X0FMR09SX3BvcF9mcmVlKHNtY2FwLCBYNTA5X0FMR09SX2ZyZWUpOworCQkJc21jYXAgPSBOVUxMOworCQkJfQorCQlpZiAoZmxhZ3MgJiBQS0NTN19SRVVTRV9ESUdFU1QpCisJCQl7CisJCQlpZiAoIXBrY3M3X2NvcHlfZXhpc3RpbmdfZGlnZXN0KHA3LCBzaSkpCisJCQkJZ290byBlcnI7CisJCQlpZiAoIShmbGFncyAmIFBLQ1M3X1BBUlRJQUwpICYmCisJCQkJCSFQS0NTN19TSUdORVJfSU5GT19zaWduKHNpKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCXJldHVybiBzaTsKKwllcnI6CisJaWYgKHNtY2FwKQorCQlza19YNTA5X0FMR09SX3BvcF9mcmVlKHNtY2FwLCBYNTA5X0FMR09SX2ZyZWUpOworCXJldHVybiBOVUxMOworCX0KKworLyogU2VhcmNoIGZvciBhIGRpZ2VzdCBtYXRjaGluZyBTaWduZXJJbmZvIGRpZ2VzdCB0eXBlIGFuZCBpZiBmb3VuZAorICogY29weSBhY3Jvc3MuCisgKi8KKworc3RhdGljIGludCBwa2NzN19jb3B5X2V4aXN0aW5nX2RpZ2VzdChQS0NTNyAqcDcsIFBLQ1M3X1NJR05FUl9JTkZPICpzaSkKKwl7CisJaW50IGk7CisJU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICpzaW5mb3M7CisJUEtDUzdfU0lHTkVSX0lORk8gKnNpdG1wOworCUFTTjFfT0NURVRfU1RSSU5HICpvc2RpZyA9IE5VTEw7CisJc2luZm9zID0gUEtDUzdfZ2V0X3NpZ25lcl9pbmZvKHA3KTsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfUEtDUzdfU0lHTkVSX0lORk9fbnVtKHNpbmZvcyk7IGkrKykKKwkJeworCQlzaXRtcCA9IHNrX1BLQ1M3X1NJR05FUl9JTkZPX3ZhbHVlKHNpbmZvcywgaSk7CisJCWlmIChzaSA9PSBzaXRtcCkKKwkJCWJyZWFrOworCQlpZiAoc2tfWDUwOV9BVFRSSUJVVEVfbnVtKHNpdG1wLT5hdXRoX2F0dHIpIDw9IDApCisJCQljb250aW51ZTsKKwkJaWYgKCFPQkpfY21wKHNpLT5kaWdlc3RfYWxnLT5hbGdvcml0aG0sCisJCQkJc2l0bXAtPmRpZ2VzdF9hbGctPmFsZ29yaXRobSkpCisJCQl7CisJCQlvc2RpZyA9IFBLQ1M3X2RpZ2VzdF9mcm9tX2F0dHJpYnV0ZXMoc2l0bXAtPmF1dGhfYXR0cik7CisJCQlicmVhazsKKwkJCX0KKworCQl9CisKKwlpZiAob3NkaWcpCisJCXJldHVybiBQS0NTN19hZGQxX2F0dHJpYl9kaWdlc3Qoc2ksIG9zZGlnLT5kYXRhLCBvc2RpZy0+bGVuZ3RoKTsKKworCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfQ09QWV9FWElTVElOR19ESUdFU1QsCisJCQlQS0NTN19SX05PX01BVENISU5HX0RJR0VTVF9UWVBFX0ZPVU5EKTsKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBQS0NTN192ZXJpZnkoUEtDUzcgKnA3LCBTVEFDS19PRihYNTA5KSAqY2VydHMsIFg1MDlfU1RPUkUgKnN0b3JlLAorCQkJCQlCSU8gKmluZGF0YSwgQklPICpvdXQsIGludCBmbGFncykKK3sKKwlTVEFDS19PRihYNTA5KSAqc2lnbmVyczsKKwlYNTA5ICpzaWduZXI7CisJU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICpzaW5mb3M7CisJUEtDUzdfU0lHTkVSX0lORk8gKnNpOworCVg1MDlfU1RPUkVfQ1RYIGNlcnRfY3R4OworCWNoYXIgYnVmWzQwOTZdOworCWludCBpLCBqPTAsIGssIHJldCA9IDA7CisJQklPICpwN2JpbzsKKwlCSU8gKnRtcGluLCAqdG1wb3V0OworCisJaWYoIXA3KSB7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfVkVSSUZZLFBLQ1M3X1JfSU5WQUxJRF9OVUxMX1BPSU5URVIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZighUEtDUzdfdHlwZV9pc19zaWduZWQocDcpKSB7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfVkVSSUZZLFBLQ1M3X1JfV1JPTkdfQ09OVEVOVF9UWVBFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgZm9yIG5vIGRhdGEgYW5kIG5vIGNvbnRlbnQ6IG5vIGRhdGEgdG8gdmVyaWZ5IHNpZ25hdHVyZSAqLworCWlmKFBLQ1M3X2dldF9kZXRhY2hlZChwNykgJiYgIWluZGF0YSkgeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1ZFUklGWSxQS0NTN19SX05PX0NPTlRFTlQpOworCQlyZXR1cm4gMDsKKwl9CisjaWYgMAorCS8qIE5COiB0aGlzIHRlc3QgY29tbWVudGVkIG91dCBiZWNhdXNlIHNvbWUgdmVyc2lvbnMgb2YgTmV0c2NhcGUKKwkgKiBpbGxlZ2FsbHkgaW5jbHVkZSB6ZXJvIGxlbmd0aCBjb250ZW50IHdoZW4gc2lnbmluZyBkYXRhLgorCSAqLworCisJLyogQ2hlY2sgZm9yIGRhdGEgYW5kIGNvbnRlbnQ6IHR3byBzZXRzIG9mIGRhdGEgKi8KKwlpZighUEtDUzdfZ2V0X2RldGFjaGVkKHA3KSAmJiBpbmRhdGEpIHsKKwkJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1ZFUklGWSxQS0NTN19SX0NPTlRFTlRfQU5EX0RBVEFfUFJFU0VOVCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJc2luZm9zID0gUEtDUzdfZ2V0X3NpZ25lcl9pbmZvKHA3KTsKKworCWlmKCFzaW5mb3MgfHwgIXNrX1BLQ1M3X1NJR05FUl9JTkZPX251bShzaW5mb3MpKSB7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfVkVSSUZZLFBLQ1M3X1JfTk9fU0lHTkFUVVJFU19PTl9EQVRBKTsKKwkJcmV0dXJuIDA7CisJfQorCisKKwlzaWduZXJzID0gUEtDUzdfZ2V0MF9zaWduZXJzKHA3LCBjZXJ0cywgZmxhZ3MpOworCisJaWYoIXNpZ25lcnMpIHJldHVybiAwOworCisJLyogTm93IHZlcmlmeSB0aGUgY2VydGlmaWNhdGVzICovCisKKwlpZiAoIShmbGFncyAmIFBLQ1M3X05PVkVSSUZZKSkgZm9yIChrID0gMDsgayA8IHNrX1g1MDlfbnVtKHNpZ25lcnMpOyBrKyspIHsKKwkJc2lnbmVyID0gc2tfWDUwOV92YWx1ZSAoc2lnbmVycywgayk7CisJCWlmICghKGZsYWdzICYgUEtDUzdfTk9DSEFJTikpIHsKKwkJCWlmKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZjZXJ0X2N0eCwgc3RvcmUsIHNpZ25lciwKKwkJCQkJCQlwNy0+ZC5zaWduLT5jZXJ0KSkKKwkJCQl7CisJCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19WRVJJRlksRVJSX1JfWDUwOV9MSUIpOworCQkJCXNrX1g1MDlfZnJlZShzaWduZXJzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlYNTA5X1NUT1JFX0NUWF9zZXRfZGVmYXVsdCgmY2VydF9jdHgsICJzbWltZV9zaWduIik7CisJCX0gZWxzZSBpZighWDUwOV9TVE9SRV9DVFhfaW5pdCAoJmNlcnRfY3R4LCBzdG9yZSwgc2lnbmVyLCBOVUxMKSkgeworCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19WRVJJRlksRVJSX1JfWDUwOV9MSUIpOworCQkJc2tfWDUwOV9mcmVlKHNpZ25lcnMpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCEoZmxhZ3MgJiBQS0NTN19OT0NSTCkpCisJCQlYNTA5X1NUT1JFX0NUWF9zZXQwX2NybHMoJmNlcnRfY3R4LCBwNy0+ZC5zaWduLT5jcmwpOworCQlpID0gWDUwOV92ZXJpZnlfY2VydCgmY2VydF9jdHgpOworCQlpZiAoaSA8PSAwKSBqID0gWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKCZjZXJ0X2N0eCk7CisJCVg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJmNlcnRfY3R4KTsKKwkJaWYgKGkgPD0gMCkgeworCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19WRVJJRlksUEtDUzdfUl9DRVJUSUZJQ0FURV9WRVJJRllfRVJST1IpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJWZXJpZnkgZXJyb3I6IiwKKwkJCQkJIFg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGopKTsKKwkJCXNrX1g1MDlfZnJlZShzaWduZXJzKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIENoZWNrIGZvciByZXZvY2F0aW9uIHN0YXR1cyBoZXJlICovCisJfQorCisJLyogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOiBpZiB0aGUgY29udGVudCBpcyBhIG1lbW9yeSBCSU8gdGhlbgorCSAqIHN0b3JlIGl0cyBjb250ZW50cyBpbiBhIHRlbXBvcmFyeSByZWFkIG9ubHkgbWVtb3J5IEJJTy4gVGhpcworCSAqIGF2b2lkcyBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXJzIG9mIHNsb3cgY29waWVzIG9mIGRhdGEgd2hpY2ggd2lsbAorCSAqIG9jY3VyIHdoZW4gcmVhZGluZyBmcm9tIGEgcmVhZCB3cml0ZSBtZW1vcnkgQklPIHdoZW4gc2lnbmF0dXJlcworCSAqIGFyZSBjYWxjdWxhdGVkLgorCSAqLworCisJaWYgKGluZGF0YSAmJiAoQklPX21ldGhvZF90eXBlKGluZGF0YSkgPT0gQklPX1RZUEVfTUVNKSkKKwkJeworCQljaGFyICpwdHI7CisJCWxvbmcgbGVuOworCQlsZW4gPSBCSU9fZ2V0X21lbV9kYXRhKGluZGF0YSwgJnB0cik7CisJCXRtcGluID0gQklPX25ld19tZW1fYnVmKHB0ciwgbGVuKTsKKwkJaWYgKHRtcGluID09IE5VTEwpCisJCQl7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1ZFUklGWSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJdG1waW4gPSBpbmRhdGE7CisJCQorCisJaWYgKCEocDdiaW89UEtDUzdfZGF0YUluaXQocDcsdG1waW4pKSkKKwkJZ290byBlcnI7CisKKwlpZihmbGFncyAmIFBLQ1M3X1RFWFQpIHsKKwkJaWYoISh0bXBvdXQgPSBCSU9fbmV3KEJJT19zX21lbSgpKSkpIHsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfVkVSSUZZLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCUJJT19zZXRfbWVtX2VvZl9yZXR1cm4odG1wb3V0LCAwKTsKKwl9IGVsc2UgdG1wb3V0ID0gb3V0OworCisJLyogV2Ugbm93IGhhdmUgdG8gJ3JlYWQnIGZyb20gcDdiaW8gdG8gY2FsY3VsYXRlIGRpZ2VzdHMgZXRjLiAqLworCWZvciAoOzspCisJeworCQlpPUJJT19yZWFkKHA3YmlvLGJ1ZixzaXplb2YoYnVmKSk7CisJCWlmIChpIDw9IDApIGJyZWFrOworCQlpZiAodG1wb3V0KSBCSU9fd3JpdGUodG1wb3V0LCBidWYsIGkpOworCX0KKworCWlmKGZsYWdzICYgUEtDUzdfVEVYVCkgeworCQlpZighU01JTUVfdGV4dCh0bXBvdXQsIG91dCkpIHsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfVkVSSUZZLFBLQ1M3X1JfU01JTUVfVEVYVF9FUlJPUik7CisJCQlCSU9fZnJlZSh0bXBvdXQpOworCQkJZ290byBlcnI7CisJCX0KKwkJQklPX2ZyZWUodG1wb3V0KTsKKwl9CisKKwkvKiBOb3cgVmVyaWZ5IEFsbCBTaWduYXR1cmVzICovCisJaWYgKCEoZmxhZ3MgJiBQS0NTN19OT1NJR1MpKQorCSAgICBmb3IgKGk9MDsgaTxza19QS0NTN19TSUdORVJfSU5GT19udW0oc2luZm9zKTsgaSsrKQorCQl7CisJCXNpPXNrX1BLQ1M3X1NJR05FUl9JTkZPX3ZhbHVlKHNpbmZvcyxpKTsKKwkJc2lnbmVyID0gc2tfWDUwOV92YWx1ZSAoc2lnbmVycywgaSk7CisJCWo9UEtDUzdfc2lnbmF0dXJlVmVyaWZ5KHA3YmlvLHA3LHNpLCBzaWduZXIpOworCQlpZiAoaiA8PSAwKSB7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X1ZFUklGWSxQS0NTN19SX1NJR05BVFVSRV9GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJcmV0ID0gMTsKKworCWVycjoKKwkKKwlpZiAodG1waW4gPT0gaW5kYXRhKQorCQl7CisJCWlmIChpbmRhdGEpIEJJT19wb3AocDdiaW8pOworCQl9CisJQklPX2ZyZWVfYWxsKHA3YmlvKTsKKworCXNrX1g1MDlfZnJlZShzaWduZXJzKTsKKworCXJldHVybiByZXQ7Cit9CisKK1NUQUNLX09GKFg1MDkpICpQS0NTN19nZXQwX3NpZ25lcnMoUEtDUzcgKnA3LCBTVEFDS19PRihYNTA5KSAqY2VydHMsIGludCBmbGFncykKK3sKKwlTVEFDS19PRihYNTA5KSAqc2lnbmVyczsKKwlTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykgKnNpbmZvczsKKwlQS0NTN19TSUdORVJfSU5GTyAqc2k7CisJUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwgKmlhczsKKwlYNTA5ICpzaWduZXI7CisJaW50IGk7CisKKwlpZighcDcpIHsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19HRVQwX1NJR05FUlMsUEtDUzdfUl9JTlZBTElEX05VTExfUE9JTlRFUik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmKCFQS0NTN190eXBlX2lzX3NpZ25lZChwNykpIHsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19HRVQwX1NJR05FUlMsUEtDUzdfUl9XUk9OR19DT05URU5UX1RZUEUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBDb2xsZWN0IGFsbCB0aGUgc2lnbmVycyB0b2dldGhlciAqLworCisJc2luZm9zID0gUEtDUzdfZ2V0X3NpZ25lcl9pbmZvKHA3KTsKKworCWlmKHNrX1BLQ1M3X1NJR05FUl9JTkZPX251bShzaW5mb3MpIDw9IDApIHsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19HRVQwX1NJR05FUlMsUEtDUzdfUl9OT19TSUdORVJTKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYoIShzaWduZXJzID0gc2tfWDUwOV9uZXdfbnVsbCgpKSkgeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0dFVDBfU0lHTkVSUyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBza19QS0NTN19TSUdORVJfSU5GT19udW0oc2luZm9zKTsgaSsrKQorCXsKKwkgICAgc2kgPSBza19QS0NTN19TSUdORVJfSU5GT192YWx1ZShzaW5mb3MsIGkpOworCSAgICBpYXMgPSBzaS0+aXNzdWVyX2FuZF9zZXJpYWw7CisJICAgIHNpZ25lciA9IE5VTEw7CisJCS8qIElmIGFueSBjZXJ0aWZpY2F0ZXMgcGFzc2VkIHRoZXkgdGFrZSBwcmlvcml0eSAqLworCSAgICBpZiAoY2VydHMpIHNpZ25lciA9IFg1MDlfZmluZF9ieV9pc3N1ZXJfYW5kX3NlcmlhbCAoY2VydHMsCisJCQkJCSAJaWFzLT5pc3N1ZXIsIGlhcy0+c2VyaWFsKTsKKwkgICAgaWYgKCFzaWduZXIgJiYgIShmbGFncyAmIFBLQ1M3X05PSU5URVJOKQorCQkJJiYgcDctPmQuc2lnbi0+Y2VydCkgc2lnbmVyID0KKwkJICAgICAgICAgICAgICBYNTA5X2ZpbmRfYnlfaXNzdWVyX2FuZF9zZXJpYWwgKHA3LT5kLnNpZ24tPmNlcnQsCisJCQkJCSAgICAgIAlpYXMtPmlzc3VlciwgaWFzLT5zZXJpYWwpOworCSAgICBpZiAoIXNpZ25lcikgeworCQkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19HRVQwX1NJR05FUlMsUEtDUzdfUl9TSUdORVJfQ0VSVElGSUNBVEVfTk9UX0ZPVU5EKTsKKwkJCXNrX1g1MDlfZnJlZShzaWduZXJzKTsKKwkJCXJldHVybiAwOworCSAgICB9CisKKwkgICAgaWYgKCFza19YNTA5X3B1c2goc2lnbmVycywgc2lnbmVyKSkgeworCQlza19YNTA5X2ZyZWUoc2lnbmVycyk7CisJCXJldHVybiBOVUxMOworCSAgICB9CisJfQorCXJldHVybiBzaWduZXJzOworfQorCisKKy8qIEJ1aWxkIGEgY29tcGxldGUgUEtDUyM3IGVudmVsb3BlZCBkYXRhICovCisKK1BLQ1M3ICpQS0NTN19lbmNyeXB0KFNUQUNLX09GKFg1MDkpICpjZXJ0cywgQklPICppbiwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorCQkJCQkJCQlpbnQgZmxhZ3MpCit7CisJUEtDUzcgKnA3OworCUJJTyAqcDdiaW8gPSBOVUxMOworCWludCBpOworCVg1MDkgKng1MDk7CisJaWYoIShwNyA9IFBLQ1M3X25ldygpKSkgeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0VOQ1JZUFQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIVBLQ1M3X3NldF90eXBlKHA3LCBOSURfcGtjczdfZW52ZWxvcGVkKSkKKwkJZ290byBlcnI7CisJaWYgKCFQS0NTN19zZXRfY2lwaGVyKHA3LCBjaXBoZXIpKSB7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfRU5DUllQVCxQS0NTN19SX0VSUk9SX1NFVFRJTkdfQ0lQSEVSKTsKKwkJZ290byBlcnI7CisJfQorCisJZm9yKGkgPSAwOyBpIDwgc2tfWDUwOV9udW0oY2VydHMpOyBpKyspIHsKKwkJeDUwOSA9IHNrX1g1MDlfdmFsdWUoY2VydHMsIGkpOworCQlpZighUEtDUzdfYWRkX3JlY2lwaWVudChwNywgeDUwOSkpIHsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfRU5DUllQVCwKKwkJCQkJUEtDUzdfUl9FUlJPUl9BRERJTkdfUkVDSVBJRU5UKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJaWYgKGZsYWdzICYgUEtDUzdfU1RSRUFNKQorCQlyZXR1cm4gcDc7CisKKwlpZiAoUEtDUzdfZmluYWwocDcsIGluLCBmbGFncykpCisJCXJldHVybiBwNzsKKworCWVycjoKKworCUJJT19mcmVlX2FsbChwN2Jpbyk7CisJUEtDUzdfZnJlZShwNyk7CisJcmV0dXJuIE5VTEw7CisKK30KKworaW50IFBLQ1M3X2RlY3J5cHQoUEtDUzcgKnA3LCBFVlBfUEtFWSAqcGtleSwgWDUwOSAqY2VydCwgQklPICpkYXRhLCBpbnQgZmxhZ3MpCit7CisJQklPICp0bXBtZW07CisJaW50IHJldCwgaTsKKwljaGFyIGJ1Zls0MDk2XTsKKworCWlmKCFwNykgeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RFQ1JZUFQsUEtDUzdfUl9JTlZBTElEX05VTExfUE9JTlRFUik7CisJCXJldHVybiAwOworCX0KKworCWlmKCFQS0NTN190eXBlX2lzX2VudmVsb3BlZChwNykpIHsKKwkJUEtDUzdlcnIoUEtDUzdfRl9QS0NTN19ERUNSWVBULFBLQ1M3X1JfV1JPTkdfQ09OVEVOVF9UWVBFKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYoY2VydCAmJiAhWDUwOV9jaGVja19wcml2YXRlX2tleShjZXJ0LCBwa2V5KSkgeworCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RFQ1JZUFQsCisJCQkJUEtDUzdfUl9QUklWQVRFX0tFWV9ET0VTX05PVF9NQVRDSF9DRVJUSUZJQ0FURSk7CisJCXJldHVybiAwOworCX0KKworCWlmKCEodG1wbWVtID0gUEtDUzdfZGF0YURlY29kZShwNywgcGtleSwgTlVMTCwgY2VydCkpKSB7CisJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREVDUllQVCwgUEtDUzdfUl9ERUNSWVBUX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZsYWdzICYgUEtDUzdfVEVYVCkgeworCQlCSU8gKnRtcGJ1ZiwgKmJyZWFkOworCQkvKiBFbmNyeXB0IEJJT3MgY2FuJ3QgZG8gQklPX2dldHMoKSBzbyBhZGQgYSBidWZmZXIgQklPICovCisJCWlmKCEodG1wYnVmID0gQklPX25ldyhCSU9fZl9idWZmZXIoKSkpKSB7CisJCQlQS0NTN2VycihQS0NTN19GX1BLQ1M3X0RFQ1JZUFQsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCUJJT19mcmVlX2FsbCh0bXBtZW0pOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYoIShicmVhZCA9IEJJT19wdXNoKHRtcGJ1ZiwgdG1wbWVtKSkpIHsKKwkJCVBLQ1M3ZXJyKFBLQ1M3X0ZfUEtDUzdfREVDUllQVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJQklPX2ZyZWVfYWxsKHRtcGJ1Zik7CisJCQlCSU9fZnJlZV9hbGwodG1wbWVtKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldCA9IFNNSU1FX3RleHQoYnJlYWQsIGRhdGEpOworCQlCSU9fZnJlZV9hbGwoYnJlYWQpOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCWZvcig7OykgeworCQkJaSA9IEJJT19yZWFkKHRtcG1lbSwgYnVmLCBzaXplb2YoYnVmKSk7CisJCQlpZihpIDw9IDApIGJyZWFrOworCQkJQklPX3dyaXRlKGRhdGEsIGJ1ZiwgaSk7CisJCX0KKwkJQklPX2ZyZWVfYWxsKHRtcG1lbSk7CisJCXJldHVybiAxOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wa2NzNy5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrY3M3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkNDQzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wa2NzNy5oCkBAIC0wLDAgKzEsNDk5IEBACisvKiBjcnlwdG8vcGtjczcvcGtjczcuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9QS0NTN19ICisjZGVmaW5lIEhFQURFUl9QS0NTN19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvc3ltaGFja3MuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4zMgorLyogVW5kZXIgV2luMzIgdGhlcyBhcmUgZGVmaW5lZCBpbiB3aW5jcnlwdC5oICovCisjdW5kZWYgUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwKKyN1bmRlZiBQS0NTN19TSUdORVJfSU5GTworI2VuZGlmCisKKy8qCitFbmNyeXB0aW9uX0lECQlERVMtQ0JDCitEaWdlc3RfSUQJCU1ENQorRGlnZXN0X0VuY3J5cHRpb25fSUQJcnNhRW5jcnlwdGlvbgorS2V5X0VuY3J5cHRpb25fSUQJcnNhRW5jcnlwdGlvbgorKi8KKwordHlwZWRlZiBzdHJ1Y3QgcGtjczdfaXNzdWVyX2FuZF9zZXJpYWxfc3QKKwl7CisJWDUwOV9OQU1FICppc3N1ZXI7CisJQVNOMV9JTlRFR0VSICpzZXJpYWw7CisJfSBQS0NTN19JU1NVRVJfQU5EX1NFUklBTDsKKwordHlwZWRlZiBzdHJ1Y3QgcGtjczdfc2lnbmVyX2luZm9fc3QKKwl7CisJQVNOMV9JTlRFR0VSIAkJCSp2ZXJzaW9uOwkvKiB2ZXJzaW9uIDEgKi8KKwlQS0NTN19JU1NVRVJfQU5EX1NFUklBTAkJKmlzc3Vlcl9hbmRfc2VyaWFsOworCVg1MDlfQUxHT1IJCQkqZGlnZXN0X2FsZzsKKwlTVEFDS19PRihYNTA5X0FUVFJJQlVURSkJKmF1dGhfYXR0cjsJLyogWyAwIF0gKi8KKwlYNTA5X0FMR09SCQkJKmRpZ2VzdF9lbmNfYWxnOworCUFTTjFfT0NURVRfU1RSSU5HCQkqZW5jX2RpZ2VzdDsKKwlTVEFDS19PRihYNTA5X0FUVFJJQlVURSkJKnVuYXV0aF9hdHRyOwkvKiBbIDEgXSAqLworCisJLyogVGhlIHByaXZhdGUga2V5IHRvIHNpZ24gd2l0aCAqLworCUVWUF9QS0VZCQkJKnBrZXk7CisJfSBQS0NTN19TSUdORVJfSU5GTzsKKworREVDTEFSRV9TVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoUEtDUzdfU0lHTkVSX0lORk8pCisKK3R5cGVkZWYgc3RydWN0IHBrY3M3X3JlY2lwX2luZm9fc3QKKwl7CisJQVNOMV9JTlRFR0VSCQkJKnZlcnNpb247CS8qIHZlcnNpb24gMCAqLworCVBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMCQkqaXNzdWVyX2FuZF9zZXJpYWw7CisJWDUwOV9BTEdPUgkJCSprZXlfZW5jX2FsZ29yOworCUFTTjFfT0NURVRfU1RSSU5HCQkqZW5jX2tleTsKKwlYNTA5CQkJCSpjZXJ0OyAvKiBnZXQgdGhlIHB1Yi1rZXkgZnJvbSB0aGlzICovCisJfSBQS0NTN19SRUNJUF9JTkZPOworCitERUNMQVJFX1NUQUNLX09GKFBLQ1M3X1JFQ0lQX0lORk8pCitERUNMQVJFX0FTTjFfU0VUX09GKFBLQ1M3X1JFQ0lQX0lORk8pCisKK3R5cGVkZWYgc3RydWN0IHBrY3M3X3NpZ25lZF9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqdmVyc2lvbjsJLyogdmVyc2lvbiAxICovCisJU1RBQ0tfT0YoWDUwOV9BTEdPUikJCSptZF9hbGdzOwkvKiBtZCB1c2VkICovCisJU1RBQ0tfT0YoWDUwOSkJCQkqY2VydDsJCS8qIFsgMCBdICovCisJU1RBQ0tfT0YoWDUwOV9DUkwpCQkqY3JsOwkJLyogWyAxIF0gKi8KKwlTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykJKnNpZ25lcl9pbmZvOworCisJc3RydWN0IHBrY3M3X3N0CQkJKmNvbnRlbnRzOworCX0gUEtDUzdfU0lHTkVEOworLyogVGhlIGFib3ZlIHN0cnVjdHVyZSBpcyB2ZXJ5IHZlcnkgc2ltaWxhciB0byBQS0NTN19TSUdOX0VOVkVMT1BFLgorICogSG93IGFib3V0IG1lcmdpbmcgdGhlIHR3byAqLworCit0eXBlZGVmIHN0cnVjdCBwa2NzN19lbmNfY29udGVudF9zdAorCXsKKwlBU04xX09CSkVDVAkJCSpjb250ZW50X3R5cGU7CisJWDUwOV9BTEdPUgkJCSphbGdvcml0aG07CisJQVNOMV9PQ1RFVF9TVFJJTkcJCSplbmNfZGF0YTsJLyogWyAwIF0gKi8KKwljb25zdCBFVlBfQ0lQSEVSCQkqY2lwaGVyOworCX0gUEtDUzdfRU5DX0NPTlRFTlQ7CisKK3R5cGVkZWYgc3RydWN0IHBrY3M3X2VudmVsb3BlZF9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqdmVyc2lvbjsJLyogdmVyc2lvbiAwICovCisJU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykJKnJlY2lwaWVudGluZm87CisJUEtDUzdfRU5DX0NPTlRFTlQJCSplbmNfZGF0YTsKKwl9IFBLQ1M3X0VOVkVMT1BFOworCit0eXBlZGVmIHN0cnVjdCBwa2NzN19zaWduZWRhbmRlbnZlbG9wZWRfc3QKKwl7CisJQVNOMV9JTlRFR0VSCQkJKnZlcnNpb247CS8qIHZlcnNpb24gMSAqLworCVNUQUNLX09GKFg1MDlfQUxHT1IpCQkqbWRfYWxnczsJLyogbWQgdXNlZCAqLworCVNUQUNLX09GKFg1MDkpCQkJKmNlcnQ7CQkvKiBbIDAgXSAqLworCVNUQUNLX09GKFg1MDlfQ1JMKQkJKmNybDsJCS8qIFsgMSBdICovCisJU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pCSpzaWduZXJfaW5mbzsKKworCVBLQ1M3X0VOQ19DT05URU5UCQkqZW5jX2RhdGE7CisJU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykJKnJlY2lwaWVudGluZm87CisJfSBQS0NTN19TSUdOX0VOVkVMT1BFOworCit0eXBlZGVmIHN0cnVjdCBwa2NzN19kaWdlc3Rfc3QKKwl7CisJQVNOMV9JTlRFR0VSCQkJKnZlcnNpb247CS8qIHZlcnNpb24gMCAqLworCVg1MDlfQUxHT1IJCQkqbWQ7CQkvKiBtZCB1c2VkICovCisJc3RydWN0IHBrY3M3X3N0IAkJKmNvbnRlbnRzOworCUFTTjFfT0NURVRfU1RSSU5HCQkqZGlnZXN0OworCX0gUEtDUzdfRElHRVNUOworCit0eXBlZGVmIHN0cnVjdCBwa2NzN19lbmNyeXB0ZWRfc3QKKwl7CisJQVNOMV9JTlRFR0VSCQkJKnZlcnNpb247CS8qIHZlcnNpb24gMCAqLworCVBLQ1M3X0VOQ19DT05URU5UCQkqZW5jX2RhdGE7CisJfSBQS0NTN19FTkNSWVBUOworCit0eXBlZGVmIHN0cnVjdCBwa2NzN19zdAorCXsKKwkvKiBUaGUgZm9sbG93aW5nIGlzIG5vbiBOVUxMIGlmIGl0IGNvbnRhaW5zIEFTTjEgZW5jb2Rpbmcgb2YKKwkgKiB0aGlzIHN0cnVjdHVyZSAqLworCXVuc2lnbmVkIGNoYXIgKmFzbjE7CisJbG9uZyBsZW5ndGg7CisKKyNkZWZpbmUgUEtDUzdfU19IRUFERVIJMAorI2RlZmluZSBQS0NTN19TX0JPRFkJMQorI2RlZmluZSBQS0NTN19TX1RBSUwJMgorCWludCBzdGF0ZTsgLyogdXNlZCBkdXJpbmcgcHJvY2Vzc2luZyAqLworCisJaW50IGRldGFjaGVkOworCisJQVNOMV9PQkpFQ1QgKnR5cGU7CisJLyogY29udGVudCBhcyBkZWZpbmVkIGJ5IHRoZSB0eXBlICovCisJLyogYWxsIGVuY3J5cHRpb24vbWVzc2FnZSBkaWdlc3RzIGFyZSBhcHBsaWVkIHRvIHRoZSAnY29udGVudHMnLAorCSAqIGxlYXZpbmcgb3V0IHRoZSAndHlwZScgZmllbGQuICovCisJdW5pb24JeworCQljaGFyICpwdHI7CisKKwkJLyogTklEX3BrY3M3X2RhdGEgKi8KKwkJQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGE7CisKKwkJLyogTklEX3BrY3M3X3NpZ25lZCAqLworCQlQS0NTN19TSUdORUQgKnNpZ247CisKKwkJLyogTklEX3BrY3M3X2VudmVsb3BlZCAqLworCQlQS0NTN19FTlZFTE9QRSAqZW52ZWxvcGVkOworCisJCS8qIE5JRF9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQgKi8KKwkJUEtDUzdfU0lHTl9FTlZFTE9QRSAqc2lnbmVkX2FuZF9lbnZlbG9wZWQ7CisKKwkJLyogTklEX3BrY3M3X2RpZ2VzdCAqLworCQlQS0NTN19ESUdFU1QgKmRpZ2VzdDsKKworCQkvKiBOSURfcGtjczdfZW5jcnlwdGVkICovCisJCVBLQ1M3X0VOQ1JZUFQgKmVuY3J5cHRlZDsKKworCQkvKiBBbnl0aGluZyBlbHNlICovCisJCUFTTjFfVFlQRSAqb3RoZXI7CisJCX0gZDsKKwl9IFBLQ1M3OworCitERUNMQVJFX1NUQUNLX09GKFBLQ1M3KQorREVDTEFSRV9BU04xX1NFVF9PRihQS0NTNykKK0RFQ0xBUkVfUEtDUzEyX1NUQUNLX09GKFBLQ1M3KQorCisjZGVmaW5lIFBLQ1M3X09QX1NFVF9ERVRBQ0hFRF9TSUdOQVRVUkUJMQorI2RlZmluZSBQS0NTN19PUF9HRVRfREVUQUNIRURfU0lHTkFUVVJFCTIKKworI2RlZmluZSBQS0NTN19nZXRfc2lnbmVkX2F0dHJpYnV0ZXMoc2kpCSgoc2kpLT5hdXRoX2F0dHIpCisjZGVmaW5lIFBLQ1M3X2dldF9hdHRyaWJ1dGVzKHNpKQkoKHNpKS0+dW5hdXRoX2F0dHIpCisKKyNkZWZpbmUgUEtDUzdfdHlwZV9pc19zaWduZWQoYSkgKE9CSl9vYmoybmlkKChhKS0+dHlwZSkgPT0gTklEX3BrY3M3X3NpZ25lZCkKKyNkZWZpbmUgUEtDUzdfdHlwZV9pc19lbmNyeXB0ZWQoYSkgKE9CSl9vYmoybmlkKChhKS0+dHlwZSkgPT0gTklEX3BrY3M3X2VuY3J5cHRlZCkKKyNkZWZpbmUgUEtDUzdfdHlwZV9pc19lbnZlbG9wZWQoYSkgKE9CSl9vYmoybmlkKChhKS0+dHlwZSkgPT0gTklEX3BrY3M3X2VudmVsb3BlZCkKKyNkZWZpbmUgUEtDUzdfdHlwZV9pc19zaWduZWRBbmRFbnZlbG9wZWQoYSkgXAorCQkoT0JKX29iajJuaWQoKGEpLT50eXBlKSA9PSBOSURfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkKQorI2RlZmluZSBQS0NTN190eXBlX2lzX2RhdGEoYSkgICAoT0JKX29iajJuaWQoKGEpLT50eXBlKSA9PSBOSURfcGtjczdfZGF0YSkKKyNkZWZpbmUgUEtDUzdfdHlwZV9pc19kaWdlc3QoYSkgICAoT0JKX29iajJuaWQoKGEpLT50eXBlKSA9PSBOSURfcGtjczdfZGlnZXN0KQorI2RlZmluZSBQS0NTN190eXBlX2lzX2VuY3J5cHRlZChhKSBcCisJCShPQkpfb2JqMm5pZCgoYSktPnR5cGUpID09IE5JRF9wa2NzN19lbmNyeXB0ZWQpCisKKyNkZWZpbmUgUEtDUzdfdHlwZV9pc19kaWdlc3QoYSkgICAoT0JKX29iajJuaWQoKGEpLT50eXBlKSA9PSBOSURfcGtjczdfZGlnZXN0KQorCisjZGVmaW5lIFBLQ1M3X3NldF9kZXRhY2hlZChwLHYpIFwKKwkJUEtDUzdfY3RybChwLFBLQ1M3X09QX1NFVF9ERVRBQ0hFRF9TSUdOQVRVUkUsdixOVUxMKQorI2RlZmluZSBQS0NTN19nZXRfZGV0YWNoZWQocCkgXAorCQlQS0NTN19jdHJsKHAsUEtDUzdfT1BfR0VUX0RFVEFDSEVEX1NJR05BVFVSRSwwLE5VTEwpCisKKyNkZWZpbmUgUEtDUzdfaXNfZGV0YWNoZWQocDcpIChQS0NTN190eXBlX2lzX3NpZ25lZChwNykgJiYgUEtDUzdfZ2V0X2RldGFjaGVkKHA3KSkKKworLyogUy9NSU1FIHJlbGF0ZWQgZmxhZ3MgKi8KKworI2RlZmluZSBQS0NTN19URVhUCQkweDEKKyNkZWZpbmUgUEtDUzdfTk9DRVJUUwkJMHgyCisjZGVmaW5lIFBLQ1M3X05PU0lHUwkJMHg0CisjZGVmaW5lIFBLQ1M3X05PQ0hBSU4JCTB4OAorI2RlZmluZSBQS0NTN19OT0lOVEVSTgkJMHgxMAorI2RlZmluZSBQS0NTN19OT1ZFUklGWQkJMHgyMAorI2RlZmluZSBQS0NTN19ERVRBQ0hFRAkJMHg0MAorI2RlZmluZSBQS0NTN19CSU5BUlkJCTB4ODAKKyNkZWZpbmUgUEtDUzdfTk9BVFRSCQkweDEwMAorI2RlZmluZQlQS0NTN19OT1NNSU1FQ0FQCTB4MjAwCisjZGVmaW5lIFBLQ1M3X05PT0xETUlNRVRZUEUJMHg0MDAKKyNkZWZpbmUgUEtDUzdfQ1JMRkVPTAkJMHg4MDAKKyNkZWZpbmUgUEtDUzdfU1RSRUFNCQkweDEwMDAKKyNkZWZpbmUgUEtDUzdfTk9DUkwJCTB4MjAwMAorI2RlZmluZSBQS0NTN19QQVJUSUFMCQkweDQwMDAKKyNkZWZpbmUgUEtDUzdfUkVVU0VfRElHRVNUCTB4ODAwMAorCisvKiBGbGFnczogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlICovCisKKyNkZWZpbmUgU01JTUVfVEVYVAlQS0NTN19URVhUCisjZGVmaW5lIFNNSU1FX05PQ0VSVFMJUEtDUzdfTk9DRVJUUworI2RlZmluZSBTTUlNRV9OT1NJR1MJUEtDUzdfTk9TSUdTCisjZGVmaW5lIFNNSU1FX05PQ0hBSU4JUEtDUzdfTk9DSEFJTgorI2RlZmluZSBTTUlNRV9OT0lOVEVSTglQS0NTN19OT0lOVEVSTgorI2RlZmluZSBTTUlNRV9OT1ZFUklGWQlQS0NTN19OT1ZFUklGWQorI2RlZmluZSBTTUlNRV9ERVRBQ0hFRAlQS0NTN19ERVRBQ0hFRAorI2RlZmluZSBTTUlNRV9CSU5BUlkJUEtDUzdfQklOQVJZCisjZGVmaW5lIFNNSU1FX05PQVRUUglQS0NTN19OT0FUVFIKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQS0NTN19JU1NVRVJfQU5EX1NFUklBTCkKKworaW50IFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMX2RpZ2VzdChQS0NTN19JU1NVRVJfQU5EX1NFUklBTCAqZGF0YSxjb25zdCBFVlBfTUQgKnR5cGUsCisJdW5zaWduZWQgY2hhciAqbWQsdW5zaWduZWQgaW50ICpsZW4pOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorUEtDUzcgKmQyaV9QS0NTN19mcChGSUxFICpmcCxQS0NTNyAqKnA3KTsKK2ludCBpMmRfUEtDUzdfZnAoRklMRSAqZnAsUEtDUzcgKnA3KTsKKyNlbmRpZgorUEtDUzcgKlBLQ1M3X2R1cChQS0NTNyAqcDcpOworUEtDUzcgKmQyaV9QS0NTN19iaW8oQklPICpicCxQS0NTNyAqKnA3KTsKK2ludCBpMmRfUEtDUzdfYmlvKEJJTyAqYnAsUEtDUzcgKnA3KTsKK2ludCBpMmRfUEtDUzdfYmlvX3N0cmVhbShCSU8gKm91dCwgUEtDUzcgKnA3LCBCSU8gKmluLCBpbnQgZmxhZ3MpOworaW50IFBFTV93cml0ZV9iaW9fUEtDUzdfc3RyZWFtKEJJTyAqb3V0LCBQS0NTNyAqcDcsIEJJTyAqaW4sIGludCBmbGFncyk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzdfU0lHTkVSX0lORk8pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X1JFQ0lQX0lORk8pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X1NJR05FRCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzdfRU5DX0NPTlRFTlQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X0VOVkVMT1BFKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQS0NTN19TSUdOX0VOVkVMT1BFKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQS0NTN19ESUdFU1QpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X0VOQ1JZUFQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1M3KQorCitERUNMQVJFX0FTTjFfSVRFTShQS0NTN19BVFRSX1NJR04pCitERUNMQVJFX0FTTjFfSVRFTShQS0NTN19BVFRSX1ZFUklGWSkKKworREVDTEFSRV9BU04xX05ERUZfRlVOQ1RJT04oUEtDUzcpCitERUNMQVJFX0FTTjFfUFJJTlRfRlVOQ1RJT04oUEtDUzcpCisKK2xvbmcgUEtDUzdfY3RybChQS0NTNyAqcDcsIGludCBjbWQsIGxvbmcgbGFyZywgY2hhciAqcGFyZyk7CisKK2ludCBQS0NTN19zZXRfdHlwZShQS0NTNyAqcDcsIGludCB0eXBlKTsKK2ludCBQS0NTN19zZXQwX3R5cGVfb3RoZXIoUEtDUzcgKnA3LCBpbnQgdHlwZSwgQVNOMV9UWVBFICpvdGhlcik7CitpbnQgUEtDUzdfc2V0X2NvbnRlbnQoUEtDUzcgKnA3LCBQS0NTNyAqcDdfZGF0YSk7CitpbnQgUEtDUzdfU0lHTkVSX0lORk9fc2V0KFBLQ1M3X1NJR05FUl9JTkZPICpwN2ksIFg1MDkgKng1MDksIEVWUF9QS0VZICpwa2V5LAorCWNvbnN0IEVWUF9NRCAqZGdzdCk7CitpbnQgUEtDUzdfU0lHTkVSX0lORk9fc2lnbihQS0NTN19TSUdORVJfSU5GTyAqc2kpOworaW50IFBLQ1M3X2FkZF9zaWduZXIoUEtDUzcgKnA3LCBQS0NTN19TSUdORVJfSU5GTyAqcDdpKTsKK2ludCBQS0NTN19hZGRfY2VydGlmaWNhdGUoUEtDUzcgKnA3LCBYNTA5ICp4NTA5KTsKK2ludCBQS0NTN19hZGRfY3JsKFBLQ1M3ICpwNywgWDUwOV9DUkwgKng1MDkpOworaW50IFBLQ1M3X2NvbnRlbnRfbmV3KFBLQ1M3ICpwNywgaW50IG5pZCk7CitpbnQgUEtDUzdfZGF0YVZlcmlmeShYNTA5X1NUT1JFICpjZXJ0X3N0b3JlLCBYNTA5X1NUT1JFX0NUWCAqY3R4LAorCUJJTyAqYmlvLCBQS0NTNyAqcDcsIFBLQ1M3X1NJR05FUl9JTkZPICpzaSk7IAoraW50IFBLQ1M3X3NpZ25hdHVyZVZlcmlmeShCSU8gKmJpbywgUEtDUzcgKnA3LCBQS0NTN19TSUdORVJfSU5GTyAqc2ksCisJCQkJCQkJCVg1MDkgKng1MDkpOworCitCSU8gKlBLQ1M3X2RhdGFJbml0KFBLQ1M3ICpwNywgQklPICpiaW8pOworaW50IFBLQ1M3X2RhdGFGaW5hbChQS0NTNyAqcDcsIEJJTyAqYmlvKTsKK0JJTyAqUEtDUzdfZGF0YURlY29kZShQS0NTNyAqcDcsIEVWUF9QS0VZICpwa2V5LCBCSU8gKmluX2JpbywgWDUwOSAqcGNlcnQpOworCisKK1BLQ1M3X1NJR05FUl9JTkZPICpQS0NTN19hZGRfc2lnbmF0dXJlKFBLQ1M3ICpwNywgWDUwOSAqeDUwOSwKKwlFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICpkZ3N0KTsKK1g1MDkgKlBLQ1M3X2NlcnRfZnJvbV9zaWduZXJfaW5mbyhQS0NTNyAqcDcsIFBLQ1M3X1NJR05FUl9JTkZPICpzaSk7CitpbnQgUEtDUzdfc2V0X2RpZ2VzdChQS0NTNyAqcDcsIGNvbnN0IEVWUF9NRCAqbWQpOworU1RBQ0tfT0YoUEtDUzdfU0lHTkVSX0lORk8pICpQS0NTN19nZXRfc2lnbmVyX2luZm8oUEtDUzcgKnA3KTsKKworUEtDUzdfUkVDSVBfSU5GTyAqUEtDUzdfYWRkX3JlY2lwaWVudChQS0NTNyAqcDcsIFg1MDkgKng1MDkpOwordm9pZCBQS0NTN19TSUdORVJfSU5GT19nZXQwX2FsZ3MoUEtDUzdfU0lHTkVSX0lORk8gKnNpLCBFVlBfUEtFWSAqKnBrLAorCQkJCQlYNTA5X0FMR09SICoqcGRpZywgWDUwOV9BTEdPUiAqKnBzaWcpOwordm9pZCBQS0NTN19SRUNJUF9JTkZPX2dldDBfYWxnKFBLQ1M3X1JFQ0lQX0lORk8gKnJpLCBYNTA5X0FMR09SICoqcGVuYyk7CitpbnQgUEtDUzdfYWRkX3JlY2lwaWVudF9pbmZvKFBLQ1M3ICpwNywgUEtDUzdfUkVDSVBfSU5GTyAqcmkpOworaW50IFBLQ1M3X1JFQ0lQX0lORk9fc2V0KFBLQ1M3X1JFQ0lQX0lORk8gKnA3aSwgWDUwOSAqeDUwOSk7CitpbnQgUEtDUzdfc2V0X2NpcGhlcihQS0NTNyAqcDcsIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcik7CitpbnQgUEtDUzdfc3RyZWFtKHVuc2lnbmVkIGNoYXIgKioqYm91bmRhcnksIFBLQ1M3ICpwNyk7CisKK1BLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMICpQS0NTN19nZXRfaXNzdWVyX2FuZF9zZXJpYWwoUEtDUzcgKnA3LCBpbnQgaWR4KTsKK0FTTjFfT0NURVRfU1RSSU5HICpQS0NTN19kaWdlc3RfZnJvbV9hdHRyaWJ1dGVzKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2spOworaW50IFBLQ1M3X2FkZF9zaWduZWRfYXR0cmlidXRlKFBLQ1M3X1NJR05FUl9JTkZPICpwN3NpLGludCBuaWQsaW50IHR5cGUsCisJdm9pZCAqZGF0YSk7CitpbnQgUEtDUzdfYWRkX2F0dHJpYnV0ZSAoUEtDUzdfU0lHTkVSX0lORk8gKnA3c2ksIGludCBuaWQsIGludCBhdHJ0eXBlLAorCXZvaWQgKnZhbHVlKTsKK0FTTjFfVFlQRSAqUEtDUzdfZ2V0X2F0dHJpYnV0ZShQS0NTN19TSUdORVJfSU5GTyAqc2ksIGludCBuaWQpOworQVNOMV9UWVBFICpQS0NTN19nZXRfc2lnbmVkX2F0dHJpYnV0ZShQS0NTN19TSUdORVJfSU5GTyAqc2ksIGludCBuaWQpOworaW50IFBLQ1M3X3NldF9zaWduZWRfYXR0cmlidXRlcyhQS0NTN19TSUdORVJfSU5GTyAqcDdzaSwKKwkJCQlTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKnNrKTsKK2ludCBQS0NTN19zZXRfYXR0cmlidXRlcyhQS0NTN19TSUdORVJfSU5GTyAqcDdzaSxTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKnNrKTsKKworCitQS0NTNyAqUEtDUzdfc2lnbihYNTA5ICpzaWduY2VydCwgRVZQX1BLRVkgKnBrZXksIFNUQUNLX09GKFg1MDkpICpjZXJ0cywKKwkJCQkJCQlCSU8gKmRhdGEsIGludCBmbGFncyk7CisKK1BLQ1M3X1NJR05FUl9JTkZPICpQS0NTN19zaWduX2FkZF9zaWduZXIoUEtDUzcgKnA3LAorCQkJWDUwOSAqc2lnbmNlcnQsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kLAorCQkJaW50IGZsYWdzKTsKKworaW50IFBLQ1M3X2ZpbmFsKFBLQ1M3ICpwNywgQklPICpkYXRhLCBpbnQgZmxhZ3MpOworaW50IFBLQ1M3X3ZlcmlmeShQS0NTNyAqcDcsIFNUQUNLX09GKFg1MDkpICpjZXJ0cywgWDUwOV9TVE9SRSAqc3RvcmUsCisJCQkJCUJJTyAqaW5kYXRhLCBCSU8gKm91dCwgaW50IGZsYWdzKTsKK1NUQUNLX09GKFg1MDkpICpQS0NTN19nZXQwX3NpZ25lcnMoUEtDUzcgKnA3LCBTVEFDS19PRihYNTA5KSAqY2VydHMsIGludCBmbGFncyk7CitQS0NTNyAqUEtDUzdfZW5jcnlwdChTVEFDS19PRihYNTA5KSAqY2VydHMsIEJJTyAqaW4sIGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKKwkJCQkJCQkJaW50IGZsYWdzKTsKK2ludCBQS0NTN19kZWNyeXB0KFBLQ1M3ICpwNywgRVZQX1BLRVkgKnBrZXksIFg1MDkgKmNlcnQsIEJJTyAqZGF0YSwgaW50IGZsYWdzKTsKKworaW50IFBLQ1M3X2FkZF9hdHRyaWJfc21pbWVjYXAoUEtDUzdfU0lHTkVSX0lORk8gKnNpLAorCQkJICAgICAgU1RBQ0tfT0YoWDUwOV9BTEdPUikgKmNhcCk7CitTVEFDS19PRihYNTA5X0FMR09SKSAqUEtDUzdfZ2V0X3NtaW1lY2FwKFBLQ1M3X1NJR05FUl9JTkZPICpzaSk7CitpbnQgUEtDUzdfc2ltcGxlX3NtaW1lY2FwKFNUQUNLX09GKFg1MDlfQUxHT1IpICpzaywgaW50IG5pZCwgaW50IGFyZyk7CisKK2ludCBQS0NTN19hZGRfYXR0cmliX2NvbnRlbnRfdHlwZShQS0NTN19TSUdORVJfSU5GTyAqc2ksIEFTTjFfT0JKRUNUICpjb2lkKTsKK2ludCBQS0NTN19hZGQwX2F0dHJpYl9zaWduaW5nX3RpbWUoUEtDUzdfU0lHTkVSX0lORk8gKnNpLCBBU04xX1RJTUUgKnQpOworaW50IFBLQ1M3X2FkZDFfYXR0cmliX2RpZ2VzdChQS0NTN19TSUdORVJfSU5GTyAqc2ksCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqbWQsIGludCBtZGxlbik7CisKK2ludCBTTUlNRV93cml0ZV9QS0NTNyhCSU8gKmJpbywgUEtDUzcgKnA3LCBCSU8gKmRhdGEsIGludCBmbGFncyk7CitQS0NTNyAqU01JTUVfcmVhZF9QS0NTNyhCSU8gKmJpbywgQklPICoqYmNvbnQpOworCitCSU8gKkJJT19uZXdfUEtDUzcoQklPICpvdXQsIFBLQ1M3ICpwNyk7CisKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9QS0NTN19zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIFBLQ1M3IGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFBLQ1M3X0ZfQjY0X1JFQURfUEtDUzcJCQkJIDEyMAorI2RlZmluZSBQS0NTN19GX0I2NF9XUklURV9QS0NTNwkJCQkgMTIxCisjZGVmaW5lIFBLQ1M3X0ZfRE9fUEtDUzdfU0lHTkVEX0FUVFJJQgkJCSAxMzYKKyNkZWZpbmUgUEtDUzdfRl9JMkRfUEtDUzdfQklPX1NUUkVBTQkJCSAxNDAKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19BREQwX0FUVFJJQl9TSUdOSU5HX1RJTUUJCSAxMzUKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19BRERfQVRUUklCX1NNSU1FQ0FQCQkgMTE4CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfQUREX0NFUlRJRklDQVRFCQkJIDEwMAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0FERF9DUkwJCQkJIDEwMQorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0FERF9SRUNJUElFTlRfSU5GTwkJIDEwMgorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0FERF9TSUdOQVRVUkUJCQkgMTMxCisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfQUREX1NJR05FUgkJCSAxMDMKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19CSU9fQUREX0RJR0VTVAkJCSAxMjUKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19DT1BZX0VYSVNUSU5HX0RJR0VTVAkJIDEzOAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0NUUkwJCQkJIDEwNAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0RBVEFERUNPREUJCQkgMTEyCisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfREFUQUZJTkFMCQkJCSAxMjgKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19EQVRBSU5JVAkJCQkgMTA1CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfREFUQVNJR04JCQkJIDEwNgorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0RBVEFWRVJJRlkJCQkgMTA3CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfREVDUllQVAkJCQkgMTE0CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfREVDUllQVF9SSU5GTwkJCSAxMzMKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19FTkNPREVfUklORk8JCQkgMTMyCisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfRU5DUllQVAkJCQkgMTE1CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfRklOQUwJCQkJIDEzNAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0ZJTkRfRElHRVNUCQkJIDEyNworI2RlZmluZSBQS0NTN19GX1BLQ1M3X0dFVDBfU0lHTkVSUwkJCSAxMjQKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19SRUNJUF9JTkZPX1NFVAkJCSAxMzAKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19TRVRfQ0lQSEVSCQkJIDEwOAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X1NFVF9DT05URU5UCQkJIDEwOQorI2RlZmluZSBQS0NTN19GX1BLQ1M3X1NFVF9ESUdFU1QJCQkgMTI2CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfU0VUX1RZUEUJCQkJIDExMAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X1NJR04JCQkJIDExNgorI2RlZmluZSBQS0NTN19GX1BLQ1M3X1NJR05BVFVSRVZFUklGWQkJCSAxMTMKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19TSUdORVJfSU5GT19TRVQJCQkgMTI5CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfU0lHTkVSX0lORk9fU0lHTgkJCSAxMzkKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19TSUdOX0FERF9TSUdORVIJCQkgMTM3CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfU0lNUExFX1NNSU1FQ0FQCQkJIDExOQorI2RlZmluZSBQS0NTN19GX1BLQ1M3X1ZFUklGWQkJCQkgMTE3CisjZGVmaW5lIFBLQ1M3X0ZfU01JTUVfUkVBRF9QS0NTNwkJCSAxMjIKKyNkZWZpbmUgUEtDUzdfRl9TTUlNRV9URVhUCQkJCSAxMjMKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBQS0NTN19SX0NFUlRJRklDQVRFX1ZFUklGWV9FUlJPUgkJIDExNworI2RlZmluZSBQS0NTN19SX0NJUEhFUl9IQVNfTk9fT0JKRUNUX0lERU5USUZJRVIJCSAxNDQKKyNkZWZpbmUgUEtDUzdfUl9DSVBIRVJfTk9UX0lOSVRJQUxJWkVECQkJIDExNgorI2RlZmluZSBQS0NTN19SX0NPTlRFTlRfQU5EX0RBVEFfUFJFU0VOVAkJIDExOAorI2RlZmluZSBQS0NTN19SX0NUUkxfRVJST1IJCQkJIDE1MgorI2RlZmluZSBQS0NTN19SX0RFQ09ERV9FUlJPUgkJCQkgMTMwCisjZGVmaW5lIFBLQ1M3X1JfREVDUllQVEVEX0tFWV9JU19XUk9OR19MRU5HVEgJCSAxMDAKKyNkZWZpbmUgUEtDUzdfUl9ERUNSWVBUX0VSUk9SCQkJCSAxMTkKKyNkZWZpbmUgUEtDUzdfUl9ESUdFU1RfRkFJTFVSRQkJCQkgMTAxCisjZGVmaW5lIFBLQ1M3X1JfRU5DUllQVElPTl9DVFJMX0ZBSUxVUkUJCQkgMTQ5CisjZGVmaW5lIFBLQ1M3X1JfRU5DUllQVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWV9UWVBFIDE1MAorI2RlZmluZSBQS0NTN19SX0VSUk9SX0FERElOR19SRUNJUElFTlQJCQkgMTIwCisjZGVmaW5lIFBLQ1M3X1JfRVJST1JfU0VUVElOR19DSVBIRVIJCQkgMTIxCisjZGVmaW5lIFBLQ1M3X1JfSU5WQUxJRF9NSU1FX1RZUEUJCQkgMTMxCisjZGVmaW5lIFBLQ1M3X1JfSU5WQUxJRF9OVUxMX1BPSU5URVIJCQkgMTQzCisjZGVmaW5lIFBLQ1M3X1JfTUlNRV9OT19DT05URU5UX1RZUEUJCQkgMTMyCisjZGVmaW5lIFBLQ1M3X1JfTUlNRV9QQVJTRV9FUlJPUgkJCSAxMzMKKyNkZWZpbmUgUEtDUzdfUl9NSU1FX1NJR19QQVJTRV9FUlJPUgkJCSAxMzQKKyNkZWZpbmUgUEtDUzdfUl9NSVNTSU5HX0NFUklQRU5EX0lORk8JCQkgMTAzCisjZGVmaW5lIFBLQ1M3X1JfTk9fQ09OVEVOVAkJCQkgMTIyCisjZGVmaW5lIFBLQ1M3X1JfTk9fQ09OVEVOVF9UWVBFCQkJCSAxMzUKKyNkZWZpbmUgUEtDUzdfUl9OT19ERUZBVUxUX0RJR0VTVAkJCSAxNTEKKyNkZWZpbmUgUEtDUzdfUl9OT19NQVRDSElOR19ESUdFU1RfVFlQRV9GT1VORAkJIDE1NAorI2RlZmluZSBQS0NTN19SX05PX01VTFRJUEFSVF9CT0RZX0ZBSUxVUkUJCSAxMzYKKyNkZWZpbmUgUEtDUzdfUl9OT19NVUxUSVBBUlRfQk9VTkRBUlkJCQkgMTM3CisjZGVmaW5lIFBLQ1M3X1JfTk9fUkVDSVBJRU5UX01BVENIRVNfQ0VSVElGSUNBVEUJIDExNQorI2RlZmluZSBQS0NTN19SX05PX1JFQ0lQSUVOVF9NQVRDSEVTX0tFWQkJIDE0NgorI2RlZmluZSBQS0NTN19SX05PX1NJR05BVFVSRVNfT05fREFUQQkJCSAxMjMKKyNkZWZpbmUgUEtDUzdfUl9OT19TSUdORVJTCQkJCSAxNDIKKyNkZWZpbmUgUEtDUzdfUl9OT19TSUdfQ09OVEVOVF9UWVBFCQkJIDEzOAorI2RlZmluZSBQS0NTN19SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX09OX1RISVNfVFlQRQkgMTA0CisjZGVmaW5lIFBLQ1M3X1JfUEtDUzdfQUREX1NJR05BVFVSRV9FUlJPUgkJIDEyNAorI2RlZmluZSBQS0NTN19SX1BLQ1M3X0FERF9TSUdORVJfRVJST1IJCQkgMTUzCisjZGVmaW5lIFBLQ1M3X1JfUEtDUzdfREFUQUZJTkFMCQkJCSAxMjYKKyNkZWZpbmUgUEtDUzdfUl9QS0NTN19EQVRBRklOQUxfRVJST1IJCQkgMTI1CisjZGVmaW5lIFBLQ1M3X1JfUEtDUzdfREFUQVNJR04JCQkJIDE0NQorI2RlZmluZSBQS0NTN19SX1BLQ1M3X1BBUlNFX0VSUk9SCQkJIDEzOQorI2RlZmluZSBQS0NTN19SX1BLQ1M3X1NJR19QQVJTRV9FUlJPUgkJCSAxNDAKKyNkZWZpbmUgUEtDUzdfUl9QUklWQVRFX0tFWV9ET0VTX05PVF9NQVRDSF9DRVJUSUZJQ0FURQkgMTI3CisjZGVmaW5lIFBLQ1M3X1JfU0lHTkFUVVJFX0ZBSUxVUkUJCQkgMTA1CisjZGVmaW5lIFBLQ1M3X1JfU0lHTkVSX0NFUlRJRklDQVRFX05PVF9GT1VORAkJIDEyOAorI2RlZmluZSBQS0NTN19SX1NJR05JTkdfQ1RSTF9GQUlMVVJFCQkJIDE0NworI2RlZmluZSBQS0NTN19SX1NJR05JTkdfTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlfVFlQRQkgMTQ4CisjZGVmaW5lIFBLQ1M3X1JfU0lHX0lOVkFMSURfTUlNRV9UWVBFCQkJIDE0MQorI2RlZmluZSBQS0NTN19SX1NNSU1FX1RFWFRfRVJST1IJCQkgMTI5CisjZGVmaW5lIFBLQ1M3X1JfVU5BQkxFX1RPX0ZJTkRfQ0VSVElGSUNBVEUJCSAxMDYKKyNkZWZpbmUgUEtDUzdfUl9VTkFCTEVfVE9fRklORF9NRU1fQklPCQkJIDEwNworI2RlZmluZSBQS0NTN19SX1VOQUJMRV9UT19GSU5EX01FU1NBR0VfRElHRVNUCQkgMTA4CisjZGVmaW5lIFBLQ1M3X1JfVU5LTk9XTl9ESUdFU1RfVFlQRQkJCSAxMDkKKyNkZWZpbmUgUEtDUzdfUl9VTktOT1dOX09QRVJBVElPTgkJCSAxMTAKKyNkZWZpbmUgUEtDUzdfUl9VTlNVUFBPUlRFRF9DSVBIRVJfVFlQRQkJCSAxMTEKKyNkZWZpbmUgUEtDUzdfUl9VTlNVUFBPUlRFRF9DT05URU5UX1RZUEUJCSAxMTIKKyNkZWZpbmUgUEtDUzdfUl9XUk9OR19DT05URU5UX1RZUEUJCQkgMTEzCisjZGVmaW5lIFBLQ1M3X1JfV1JPTkdfUEtDUzdfVFlQRQkJCSAxMTQKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wa2NzN2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3BrY3M3ZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhZjMyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9wa2NzN2Vyci5jCkBAIC0wLDAgKzEsMTg3IEBACisvKiBjcnlwdG8vcGtjczcvcGtjczdlcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M3Lmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9QS0NTNyxmdW5jLDApCisjZGVmaW5lIEVSUl9SRUFTT04ocmVhc29uKSBFUlJfUEFDSyhFUlJfTElCX1BLQ1M3LDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFBLQ1M3X3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoUEtDUzdfRl9CNjRfUkVBRF9QS0NTNyksCSJCNjRfUkVBRF9QS0NTNyJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfQjY0X1dSSVRFX1BLQ1M3KSwJIkI2NF9XUklURV9QS0NTNyJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfRE9fUEtDUzdfU0lHTkVEX0FUVFJJQiksCSJET19QS0NTN19TSUdORURfQVRUUklCIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9JMkRfUEtDUzdfQklPX1NUUkVBTSksCSJpMmRfUEtDUzdfYmlvX3N0cmVhbSJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfQUREMF9BVFRSSUJfU0lHTklOR19USU1FKSwJIlBLQ1M3X2FkZDBfYXR0cmliX3NpZ25pbmdfdGltZSJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfQUREX0FUVFJJQl9TTUlNRUNBUCksCSJQS0NTN19hZGRfYXR0cmliX3NtaW1lY2FwIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19BRERfQ0VSVElGSUNBVEUpLAkiUEtDUzdfYWRkX2NlcnRpZmljYXRlIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19BRERfQ1JMKSwJIlBLQ1M3X2FkZF9jcmwifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X0FERF9SRUNJUElFTlRfSU5GTyksCSJQS0NTN19hZGRfcmVjaXBpZW50X2luZm8ifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X0FERF9TSUdOQVRVUkUpLAkiUEtDUzdfYWRkX3NpZ25hdHVyZSJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfQUREX1NJR05FUiksCSJQS0NTN19hZGRfc2lnbmVyIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19CSU9fQUREX0RJR0VTVCksCSJQS0NTN19CSU9fQUREX0RJR0VTVCJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfQ09QWV9FWElTVElOR19ESUdFU1QpLAkiUEtDUzdfQ09QWV9FWElTVElOR19ESUdFU1QifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X0NUUkwpLAkiUEtDUzdfY3RybCJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfREFUQURFQ09ERSksCSJQS0NTN19kYXRhRGVjb2RlIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19EQVRBRklOQUwpLAkiUEtDUzdfZGF0YUZpbmFsIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19EQVRBSU5JVCksCSJQS0NTN19kYXRhSW5pdCJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfREFUQVNJR04pLAkiUEtDUzdfREFUQVNJR04ifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X0RBVEFWRVJJRlkpLAkiUEtDUzdfZGF0YVZlcmlmeSJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfREVDUllQVCksCSJQS0NTN19kZWNyeXB0In0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19ERUNSWVBUX1JJTkZPKSwJIlBLQ1M3X0RFQ1JZUFRfUklORk8ifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X0VOQ09ERV9SSU5GTyksCSJQS0NTN19FTkNPREVfUklORk8ifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X0VOQ1JZUFQpLAkiUEtDUzdfZW5jcnlwdCJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfRklOQUwpLAkiUEtDUzdfZmluYWwifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X0ZJTkRfRElHRVNUKSwJIlBLQ1M3X0ZJTkRfRElHRVNUIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19HRVQwX1NJR05FUlMpLAkiUEtDUzdfZ2V0MF9zaWduZXJzIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19SRUNJUF9JTkZPX1NFVCksCSJQS0NTN19SRUNJUF9JTkZPX3NldCJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfU0VUX0NJUEhFUiksCSJQS0NTN19zZXRfY2lwaGVyIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19TRVRfQ09OVEVOVCksCSJQS0NTN19zZXRfY29udGVudCJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfU0VUX0RJR0VTVCksCSJQS0NTN19zZXRfZGlnZXN0In0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19TRVRfVFlQRSksCSJQS0NTN19zZXRfdHlwZSJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfUEtDUzdfU0lHTiksCSJQS0NTN19zaWduIn0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19TSUdOQVRVUkVWRVJJRlkpLAkiUEtDUzdfc2lnbmF0dXJlVmVyaWZ5In0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19TSUdORVJfSU5GT19TRVQpLAkiUEtDUzdfU0lHTkVSX0lORk9fc2V0In0sCit7RVJSX0ZVTkMoUEtDUzdfRl9QS0NTN19TSUdORVJfSU5GT19TSUdOKSwJIlBLQ1M3X1NJR05FUl9JTkZPX3NpZ24ifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X1NJR05fQUREX1NJR05FUiksCSJQS0NTN19zaWduX2FkZF9zaWduZXIifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X1NJTVBMRV9TTUlNRUNBUCksCSJQS0NTN19zaW1wbGVfc21pbWVjYXAifSwKK3tFUlJfRlVOQyhQS0NTN19GX1BLQ1M3X1ZFUklGWSksCSJQS0NTN192ZXJpZnkifSwKK3tFUlJfRlVOQyhQS0NTN19GX1NNSU1FX1JFQURfUEtDUzcpLAkiU01JTUVfcmVhZF9QS0NTNyJ9LAore0VSUl9GVU5DKFBLQ1M3X0ZfU01JTUVfVEVYVCksCSJTTUlNRV90ZXh0In0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgUEtDUzdfc3RyX3JlYXNvbnNbXT0KKwl7Cit7RVJSX1JFQVNPTihQS0NTN19SX0NFUlRJRklDQVRFX1ZFUklGWV9FUlJPUiksImNlcnRpZmljYXRlIHZlcmlmeSBlcnJvciJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9DSVBIRVJfSEFTX05PX09CSkVDVF9JREVOVElGSUVSKSwiY2lwaGVyIGhhcyBubyBvYmplY3QgaWRlbnRpZmllciJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9DSVBIRVJfTk9UX0lOSVRJQUxJWkVEKSwiY2lwaGVyIG5vdCBpbml0aWFsaXplZCJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9DT05URU5UX0FORF9EQVRBX1BSRVNFTlQpLCJjb250ZW50IGFuZCBkYXRhIHByZXNlbnQifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfQ1RSTF9FUlJPUikgICAgICAgICAgLCJjdHJsIGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX0RFQ09ERV9FUlJPUikgICAgICAgICwiZGVjb2RlIGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX0RFQ1JZUFRFRF9LRVlfSVNfV1JPTkdfTEVOR1RIKSwiZGVjcnlwdGVkIGtleSBpcyB3cm9uZyBsZW5ndGgifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfREVDUllQVF9FUlJPUikgICAgICAgLCJkZWNyeXB0IGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX0RJR0VTVF9GQUlMVVJFKSAgICAgICwiZGlnZXN0IGZhaWx1cmUifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfRU5DUllQVElPTl9DVFJMX0ZBSUxVUkUpLCJlbmNyeXB0aW9uIGN0cmwgZmFpbHVyZSJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9FTkNSWVBUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZX1RZUEUpLCJlbmNyeXB0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMga2V5IHR5cGUifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfRVJST1JfQURESU5HX1JFQ0lQSUVOVCksImVycm9yIGFkZGluZyByZWNpcGllbnQifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfRVJST1JfU0VUVElOR19DSVBIRVIpLCJlcnJvciBzZXR0aW5nIGNpcGhlciJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9JTlZBTElEX01JTUVfVFlQRSkgICAsImludmFsaWQgbWltZSB0eXBlIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX0lOVkFMSURfTlVMTF9QT0lOVEVSKSwiaW52YWxpZCBudWxsIHBvaW50ZXIifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfTUlNRV9OT19DT05URU5UX1RZUEUpLCJtaW1lIG5vIGNvbnRlbnQgdHlwZSJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9NSU1FX1BBUlNFX0VSUk9SKSAgICAsIm1pbWUgcGFyc2UgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfTUlNRV9TSUdfUEFSU0VfRVJST1IpLCJtaW1lIHNpZyBwYXJzZSBlcnJvciJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9NSVNTSU5HX0NFUklQRU5EX0lORk8pLCJtaXNzaW5nIGNlcmlwZW5kIGluZm8ifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfTk9fQ09OVEVOVCkgICAgICAgICAgLCJubyBjb250ZW50In0sCit7RVJSX1JFQVNPTihQS0NTN19SX05PX0NPTlRFTlRfVFlQRSkgICAgICwibm8gY29udGVudCB0eXBlIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX05PX0RFRkFVTFRfRElHRVNUKSAgICwibm8gZGVmYXVsdCBkaWdlc3QifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfTk9fTUFUQ0hJTkdfRElHRVNUX1RZUEVfRk9VTkQpLCJubyBtYXRjaGluZyBkaWdlc3QgdHlwZSBmb3VuZCJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9OT19NVUxUSVBBUlRfQk9EWV9GQUlMVVJFKSwibm8gbXVsdGlwYXJ0IGJvZHkgZmFpbHVyZSJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9OT19NVUxUSVBBUlRfQk9VTkRBUlkpLCJubyBtdWx0aXBhcnQgYm91bmRhcnkifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfTk9fUkVDSVBJRU5UX01BVENIRVNfQ0VSVElGSUNBVEUpLCJubyByZWNpcGllbnQgbWF0Y2hlcyBjZXJ0aWZpY2F0ZSJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9OT19SRUNJUElFTlRfTUFUQ0hFU19LRVkpLCJubyByZWNpcGllbnQgbWF0Y2hlcyBrZXkifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfTk9fU0lHTkFUVVJFU19PTl9EQVRBKSwibm8gc2lnbmF0dXJlcyBvbiBkYXRhIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX05PX1NJR05FUlMpICAgICAgICAgICwibm8gc2lnbmVycyJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9OT19TSUdfQ09OVEVOVF9UWVBFKSAsIm5vIHNpZyBjb250ZW50IHR5cGUifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfT05fVEhJU19UWVBFKSwib3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0eXBlIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1BLQ1M3X0FERF9TSUdOQVRVUkVfRVJST1IpLCJwa2NzNyBhZGQgc2lnbmF0dXJlIGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1BLQ1M3X0FERF9TSUdORVJfRVJST1IpLCJwa2NzNyBhZGQgc2lnbmVyIGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1BLQ1M3X0RBVEFGSU5BTCkgICAgICwicGtjczcgZGF0YWZpbmFsIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1BLQ1M3X0RBVEFGSU5BTF9FUlJPUiksInBrY3M3IGRhdGFmaW5hbCBlcnJvciJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9QS0NTN19EQVRBU0lHTikgICAgICAsInBrY3M3IGRhdGFzaWduIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1BLQ1M3X1BBUlNFX0VSUk9SKSAgICwicGtjczcgcGFyc2UgZXJyb3IifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfUEtDUzdfU0lHX1BBUlNFX0VSUk9SKSwicGtjczcgc2lnIHBhcnNlIGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1BSSVZBVEVfS0VZX0RPRVNfTk9UX01BVENIX0NFUlRJRklDQVRFKSwicHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggY2VydGlmaWNhdGUifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfU0lHTkFUVVJFX0ZBSUxVUkUpICAgLCJzaWduYXR1cmUgZmFpbHVyZSJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9TSUdORVJfQ0VSVElGSUNBVEVfTk9UX0ZPVU5EKSwic2lnbmVyIGNlcnRpZmljYXRlIG5vdCBmb3VuZCJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9TSUdOSU5HX0NUUkxfRkFJTFVSRSksInNpZ25pbmcgY3RybCBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1NJR05JTkdfTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlfVFlQRSksInNpZ25pbmcgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBrZXkgdHlwZSJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9TSUdfSU5WQUxJRF9NSU1FX1RZUEUpLCJzaWcgaW52YWxpZCBtaW1lIHR5cGUifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfU01JTUVfVEVYVF9FUlJPUikgICAgLCJzbWltZSB0ZXh0IGVycm9yIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1VOQUJMRV9UT19GSU5EX0NFUlRJRklDQVRFKSwidW5hYmxlIHRvIGZpbmQgY2VydGlmaWNhdGUifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfVU5BQkxFX1RPX0ZJTkRfTUVNX0JJTyksInVuYWJsZSB0byBmaW5kIG1lbSBiaW8ifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfVU5BQkxFX1RPX0ZJTkRfTUVTU0FHRV9ESUdFU1QpLCJ1bmFibGUgdG8gZmluZCBtZXNzYWdlIGRpZ2VzdCJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9VTktOT1dOX0RJR0VTVF9UWVBFKSAsInVua25vd24gZGlnZXN0IHR5cGUifSwKK3tFUlJfUkVBU09OKFBLQ1M3X1JfVU5LTk9XTl9PUEVSQVRJT04pICAgLCJ1bmtub3duIG9wZXJhdGlvbiJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9VTlNVUFBPUlRFRF9DSVBIRVJfVFlQRSksInVuc3VwcG9ydGVkIGNpcGhlciB0eXBlIn0sCit7RVJSX1JFQVNPTihQS0NTN19SX1VOU1VQUE9SVEVEX0NPTlRFTlRfVFlQRSksInVuc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9XUk9OR19DT05URU5UX1RZUEUpICAsIndyb25nIGNvbnRlbnQgdHlwZSJ9LAore0VSUl9SRUFTT04oUEtDUzdfUl9XUk9OR19QS0NTN19UWVBFKSAgICAsIndyb25nIHBrY3M3IHR5cGUifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfUEtDUzdfc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworCWlmIChFUlJfZnVuY19lcnJvcl9zdHJpbmcoUEtDUzdfc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsUEtDUzdfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxQS0NTN19zdHJfcmVhc29ucyk7CisJCX0KKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9zZXJ2ZXIucGVtIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3NlcnZlci5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwYWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9zZXJ2ZXIucGVtCkBAIC0wLDAgKzEsMjQgQEAKK2lzc3Vlcj0gL0M9QVUvU1Q9UXVlZW5zbGFuZC9PPUNyeXB0U29mdCBQdHkgTHRkL0NOPVRlc3QgQ0EgKDEwMjQgYml0KQorc3ViamVjdD0vQz1BVS9TVD1RdWVlbnNsYW5kL089Q3J5cHRTb2Z0IFB0eSBMdGQvQ049U2VydmVyIHRlc3QgY2VydCAoNTEyIGJpdCkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQjZUQ0NBVklDQVFBd0RRWUpLb1pJaHZjTkFRRUVCUUF3V3pFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVgorQkFnVENsRjFaV1Z1YzJ4aGJtUXhHakFZQmdOVkJBb1RFVU55ZVhCMFUyOW1kQ0JRZEhrZ1RIUmtNUnN3R1FZRAorVlFRREV4SlVaWE4wSUVOQklDZ3hNREkwSUdKcGRDa3dIaGNOT1Rjd05qQTVNVE0xTnpRMldoY05PVGd3TmpBNQorTVRNMU56UTJXakJqTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUtVWFZsWlc1emJHRnVaREVhTUJnRworQTFVRUNoTVJRM0o1Y0hSVGIyWjBJRkIwZVNCTWRHUXhJekFoQmdOVkJBTVRHbE5sY25abGNpQjBaWE4wSUdObAorY25RZ0tEVXhNaUJpYVhRcE1Gd3dEUVlKS29aSWh2Y05BUUVCQlFBRFN3QXdTQUpCQUorenc0UW5sZjhTTVZJUAorRmU5R0VjU3RnT1kyV3cvZGdOZGhqZUQ4Y2tVSk5QNVZaa1ZEVEdpWGF2Nm9vS1hmWDNqLzd0ZGt1RDhFeTIvLworS3Y3K3VlMENBd0VBQVRBTkJna3Foa2lHOXcwQkFRUUZBQU9CZ1FCNFRNUjJDdmFjS0U5d0FzdTlqeUNYOFlpVworbWdDTStZb1A2a3Q0WmtqMno1SVJmbTdXcnljS3NucG5PUit0R2VxQWprQ2VaNi8zNm85bDkxUnZQbk4xVkovaQoreFF2MmRmMEtGZU1yMDBJa0RkVE5BZElXcUZrU3NaVEFZMlFBZGdlbmI3TUIxam9lanF1WXpPMkRRSU83K3dwSAoraXJPYnBFU3hBWkx5U0NtUFBnPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUJQQUlCQUFKQkFKK3p3NFFubGY4U01WSVBGZTlHRWNTdGdPWTJXdy9kZ05kaGplRDhja1VKTlA1VlprVkQKK1RHaVhhdjZvb0tYZlgzai83dGRrdUQ4RXkyLy9LdjcrdWUwQ0F3RUFBUUpBTjZXMzF2REVQMkRqZHFoekNERHUKK09BNE5BQ3FvaUZxeWJsbzd5YzJ0TTRoNHhNYkMzWXg1VUtNTjlaa0N0WDBnenJ6NkR5RjQ3YmRLY1dCek5XQ2oKK2dRSWhBTkVvb2pWdDdocStTUTZNQ042RlRBeXNHZ1FmNTZRM1RZb0pNb1d2ZGlYVkFpRUF3M2UzcmMrVkpwT3oKK3JIdURvNmJncGpVQUFYTSt2M2ZjcHNmWlNOTzZWN2tDSVFDdGJWamFucFV3dlprTUk5YnkwMm9Vazl0YWtpM2IKK1B6UGZBZk5QWUFiQ0pRSWhBSlhOUURXeXF3bi9sR21SMTFjcVkyeTluWjErNXczeUhHYXRMcmNEblFIeEFpRUEKK3ZubEVHbzhLODV1K0t3SU9pbU00OFpHOG9UazdpRmRrcUxKUjF1dFQzYVU9CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3NpZ24uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9zaWduLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1OTg4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy9zaWduLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qIGNyeXB0by9wa2NzNy9zaWduLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCitpbnQgbWFpbihhcmdjLGFyZ3YpCitpbnQgYXJnYzsKK2NoYXIgKmFyZ3ZbXTsKKwl7CisJWDUwOSAqeDUwOTsKKwlFVlBfUEtFWSAqcGtleTsKKwlQS0NTNyAqcDc7CisJUEtDUzdfU0lHTkVSX0lORk8gKnNpOworCUJJTyAqaW47CisJQklPICpkYXRhLCpwN2JpbzsKKwljaGFyIGJ1ZlsxMDI0KjRdOworCWludCBpOworCWludCBub2RldGFjaD0wOworCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQyCisJRVZQX2FkZF9kaWdlc3QoRVZQX21kMigpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01ENQorCUVWUF9hZGRfZGlnZXN0KEVWUF9tZDUoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEExCisJRVZQX2FkZF9kaWdlc3QoRVZQX3NoYTEoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NREMyCisJRVZQX2FkZF9kaWdlc3QoRVZQX21kYzIoKSk7CisjZW5kaWYKKworCWRhdGE9QklPX25ldyhCSU9fc19maWxlKCkpOworYWdhaW46CisJaWYgKGFyZ2MgPiAxKQorCQl7CisJCWlmIChzdHJjbXAoYXJndlsxXSwiLW5kIikgPT0gMCkKKwkJCXsKKwkJCW5vZGV0YWNoPTE7CisJCQlhcmd2Kys7IGFyZ2MtLTsKKwkJCWdvdG8gYWdhaW47CisJCQl9CisJCWlmICghQklPX3JlYWRfZmlsZW5hbWUoZGF0YSxhcmd2WzFdKSkKKwkJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQlCSU9fc2V0X2ZwKGRhdGEsc3RkaW4sQklPX05PQ0xPU0UpOworCisJaWYgKChpbj1CSU9fbmV3X2ZpbGUoInNlcnZlci5wZW0iLCJyIikpID09IE5VTEwpIGdvdG8gZXJyOworCWlmICgoeDUwOT1QRU1fcmVhZF9iaW9fWDUwOShpbixOVUxMLE5VTEwsTlVMTCkpID09IE5VTEwpIGdvdG8gZXJyOworCUJJT19yZXNldChpbik7CisJaWYgKChwa2V5PVBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGluLE5VTEwsTlVMTCxOVUxMKSkgPT0gTlVMTCkgZ290byBlcnI7CisJQklPX2ZyZWUoaW4pOworCisJcDc9UEtDUzdfbmV3KCk7CisJUEtDUzdfc2V0X3R5cGUocDcsTklEX3BrY3M3X3NpZ25lZCk7CisJIAorCXNpPVBLQ1M3X2FkZF9zaWduYXR1cmUocDcseDUwOSxwa2V5LEVWUF9zaGExKCkpOworCWlmIChzaSA9PSBOVUxMKSBnb3RvIGVycjsKKworCS8qIElmIHlvdSBkbyB0aGlzIHRoZW4geW91IGdldCBzaWduaW5nIHRpbWUgYXV0b21hdGljYWxseSBhZGRlZCAqLworCVBLQ1M3X2FkZF9zaWduZWRfYXR0cmlidXRlKHNpLCBOSURfcGtjczlfY29udGVudFR5cGUsIFZfQVNOMV9PQkpFQ1QsCisJCQkJCQlPQkpfbmlkMm9iaihOSURfcGtjczdfZGF0YSkpOworCisJLyogd2UgbWF5IHdhbnQgdG8gYWRkIG1vcmUgKi8KKwlQS0NTN19hZGRfY2VydGlmaWNhdGUocDcseDUwOSk7CisKKwkvKiBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIHNpZ25lZCB0byAnZGF0YScgKi8KKwlQS0NTN19jb250ZW50X25ldyhwNyxOSURfcGtjczdfZGF0YSk7CisKKwlpZiAoIW5vZGV0YWNoKQorCQlQS0NTN19zZXRfZGV0YWNoZWQocDcsMSk7CisKKwlpZiAoKHA3YmlvPVBLQ1M3X2RhdGFJbml0KHA3LE5VTEwpKSA9PSBOVUxMKSBnb3RvIGVycjsKKworCWZvciAoOzspCisJCXsKKwkJaT1CSU9fcmVhZChkYXRhLGJ1ZixzaXplb2YoYnVmKSk7CisJCWlmIChpIDw9IDApIGJyZWFrOworCQlCSU9fd3JpdGUocDdiaW8sYnVmLGkpOworCQl9CisKKwlpZiAoIVBLQ1M3X2RhdGFGaW5hbChwNyxwN2JpbykpIGdvdG8gZXJyOworCUJJT19mcmVlKHA3YmlvKTsKKworCVBFTV93cml0ZV9QS0NTNyhzdGRvdXQscDcpOworCVBLQ1M3X2ZyZWUocDcpOworCisJZXhpdCgwKTsKK2VycjoKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCUVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKwlleGl0KDEpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvM2Rlcy5wZW0gYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC8zZGVzLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmI1MDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvM2Rlcy5wZW0KQEAgLTAsMCArMSwxNiBAQAorLS0tLS1CRUdJTiBQS0NTNy0tLS0tCitNSUFHQ1NxR1NJYjNEUUVIQTZDQU1JQUNBUUF4Z2dIbU1JSHdBZ0VBTUlHWk1JR1NNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUcKK0ExVUVDQk1LVVhWbFpXNXpiR0Z1WkRFUk1BOEdBMVVFQnhNSVFuSnBjMkpoYm1VeEdqQVlCZ05WQkFvVEVVTnllWEIwYzI5bQorZENCUWRIa2dUSFJrTVNJd0lBWURWUVFMRXhsRVJVMVBUbE5VVWtGVVNVOU9JRUZPUkNCVVJWTlVTVTVITVJzd0dRWURWUVFECitFeEpFUlUxUElGcEZVazhnVmtGTVZVVWdRMEVDQWdSK01BMEdDU3FHU0liM0RRRUJBUVVBQkVDMnZYSTF4UURXNmxVSE0zelEKKy85dUJFQk9PNUEzVHRrcmtsQVhxN3YwMWdzSUMyMXQ1MnFTazM2UkVYWStzbGhOWjBPUTM0OXRna1Rzb0VUSEZMb0V3TUlIdworQWdFQU1JR1pNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUtVWFZsWlc1emJHRnVaREVSTUE4R0ExVUVCeE1JCitRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW1kQ0JRZEhrZ1RIUmtNU0l3SUFZRFZRUUxFeGxFUlUxUFRsTlUKK1VrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRREV4SkVSVTFQSUZwRlVrOGdWa0ZNVlVVZ1EwRUNBZ1I5TUEwRworQ1NxR1NJYjNEUUVCQVFVQUJFQjh1anhiYWJ4WFVZSmhvcHVEbTNvRHE0Sk5xWDZJbzRwM3JvK1NocWZJbmRzWFRaMXY1YTJOCitXdExMQ1dsSG4vaGFiakJ3Wi9EZ1FnY0tBU2JaN1F4Tk1JQUdDU3FHU0liM0RRRUhBVEFhQmdncWhraUc5dzBEQWpBT0FnSUEKK29BUUlic0w1djF3WDk4S2dnQVFvQWFKNFdIbTY4ZlhZMVdFNU9JamZWQklEcE8xSytpOGRtS2hqbkFqcmpveVo5QndjOHJETAorbGdRZzRDWGI4MDVoNXhsK0dmdlN3VWFISmF5dGUxbTJtY09oczNKMll5cWJRK01FSU1JaUpRY2NtaE8zb0RLbTM2Q0Z2WVI4Cis1UGpwY2xWY1p5WDJuZ2J3UEZNbkJBZ3kwY2xPQUU2VUtBQUFBQUFBQUFBQUFBQT0KKy0tLS0tRU5EIFBLQ1M3LS0tLS0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvM2Rlc3MucGVtIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvM2Rlc3MucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZjAxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC8zZGVzcy5wZW0KQEAgLTAsMCArMSwzMiBAQAorLS0tLS1CRUdJTiBQS0NTNy0tLS0tCitNSUlHSGdZSktvWklodmNOQVFjQ29JSUdEekNDQmdzQ0FRRXhDekFKQmdVckRnTUNHZ1VBTUFzR0NTcUdTSWIzRFFFSEFhQ0MKK0JHc3dnZ0pUTUlJQi9hQURBZ0VDQWdJRWZqQU5CZ2txaGtpRzl3MEJBUVFGQURDQmtqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUgorQmdOVkJBZ1RDbEYxWldWdWMyeGhibVF4RVRBUEJnTlZCQWNUQ0VKeWFYTmlZVzVsTVJvd0dBWURWUVFLRXhGRGNubHdkSE52CitablFnVUhSNUlFeDBaREVpTUNBR0ExVUVDeE1aUkVWTlQwNVRWRkpCVkVsUFRpQkJUa1FnVkVWVFZFbE9SekViTUJrR0ExVUUKK0F4TVNSRVZOVHlCYVJWSlBJRlpCVEZWRklFTkJNQjRYRFRrNE1EVXhNekEyTWpZMU5sb1hEVEF3TURVeE1qQTJNalkxTmxvdworZ2FVeEN6QUpCZ05WQkFZVEFrRlZNUk13RVFZRFZRUUlFd3BSZFdWbGJuTnNZVzVrTVJFd0R3WURWUVFIRXdoQ2NtbHpZbUZ1CitaVEVhTUJnR0ExVUVDaE1SUTNKNWNIUnpiMlowSUZCMGVTQk1kR1F4RWpBUUJnTlZCQXNUQ1ZOTlNVMUZJREF3TXpFWk1CY0cKK0ExVUVBeE1RUVc1blpXeGhJSFpoYmlCTVpXVnVkREVqTUNFR0NTcUdTSWIzRFFFSkFSWVVZVzVuWld4aFFHTnllWEIwYzI5bQorZEM1amIyMHdYREFOQmdrcWhraUc5dzBCQVFFRkFBTkxBREJJQWtFQXVDMys3ZEFiMkxodU83Z3QyY1RNOHZzTmpoRzVKZkRoCitoWDFWbC93VkdiS0VFajBNQTZ2V0VvbHZlZlFseEIrRXp3Q3RSMFlaN2VFQy9ULzRKb0N5ZVFJREFRQUJveWd3SmpBa0JnbGcKK2hrZ0JodmhDQVEwRUZ4WVZSMlZ1WlhKaGRHVmtJSGRwZEdnZ1UxTk1aV0Y1TUEwR0NTcUdTSWIzRFFFQkJBVUFBMEVBVW5TUAoraWdzNlRNRklTVGp3OGNCdEpZYjk4Y3pnQVZrVkZqS3lKUXdZTUg4RmJEbkN5eDZOb2NNNTU1bnN5RHN0YXc4ZktSMTFLaGRzCitzeWQzaWtrcmhEQ0NBaEF3Z2dHNkFnRURNQTBHQ1NxR1NJYjNEUUVCQkFVQU1JR1NNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUcKK0ExVUVDQk1LVVhWbFpXNXpiR0Z1WkRFUk1BOEdBMVVFQnhNSVFuSnBjMkpoYm1VeEdqQVlCZ05WQkFvVEVVTnllWEIwYzI5bQorZENCUWRIa2dUSFJrTVNJd0lBWURWUVFMRXhsRVJVMVBUbE5VVWtGVVNVOU9JRUZPUkNCVVJWTlVTVTVITVJzd0dRWURWUVFECitFeEpFUlUxUElGcEZVazhnVmtGTVZVVWdRMEV3SGhjTk9UZ3dNekF6TURjME1UTXlXaGNOTURnd01qSTVNRGMwTVRNeVdqQ0IKK2tqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEVUQVBCZ05WQkFjVENFSnlhWE5pWVc1bAorTVJvd0dBWURWUVFLRXhGRGNubHdkSE52Wm5RZ1VIUjVJRXgwWkRFaU1DQUdBMVVFQ3hNWlJFVk5UMDVUVkZKQlZFbFBUaUJCCitUa1FnVkVWVFZFbE9SekViTUJrR0ExVUVBeE1TUkVWTlR5QmFSVkpQSUZaQlRGVkZJRU5CTUZ3d0RRWUpLb1pJaHZjTkFRRUIKK0JRQURTd0F3U0FKQkFMKzBFMmZMZWozRlNDd2UyQTJpUm5NdUMzejEycUhJcDZLeTF3bzJ6WmN4ZnQ3QUkrUmZrcldyU0d0ZgorbWZ6QkV1UHJMZGZ1bG5jQzVZMXBOY004UlRVQ0F3RUFBVEFOQmdrcWhraUc5dzBCQVFRRkFBTkJBR1NiTE1waEw2RjVwcDNzCis4bzBYeWg4NkZIRmRwVk93WXgwOUVMTGt1RzE3Vi9QOXBnSWMwRW8vZ0RNYk4rS1QzSWRnRUNmOFMvL3BDUkE2UnJOamNYSXgKK2dnRjdNSUlCZHdJQkFUQ0JtVENCa2pFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbEYxWldWdWMyeGhibVF4RVRBUAorQmdOVkJBY1RDRUp5YVhOaVlXNWxNUm93R0FZRFZRUUtFeEZEY25sd2RITnZablFnVUhSNUlFeDBaREVpTUNBR0ExVUVDeE1aCitSRVZOVDA1VFZGSkJWRWxQVGlCQlRrUWdWRVZUVkVsT1J6RWJNQmtHQTFVRUF4TVNSRVZOVHlCYVJWSlBJRlpCVEZWRklFTkIKK0FnSUVmakFKQmdVckRnTUNHZ1VBb0hvd0dBWUpLb1pJaHZjTkFRa0RNUXNHQ1NxR1NJYjNEUUVIQVRBYkJna3Foa2lHOXcwQgorQ1E4eERqQU1NQW9HQ0NxR1NJYjNEUU1ITUJ3R0NTcUdTSWIzRFFFSkJURVBGdzA1T0RBMU1UUXdNek01TXpkYU1DTUdDU3FHCitTSWIzRFFFSkJERVdCQlFzdE5NblNWMjZiYThQYXBRRURoTzIxeU5GcmpBTkJna3Foa2lHOXcwQkFRRUZBQVJBVzlYYjlZWHYKK0JmY05rdXRnRlg5R3I4aVhoQlZzTnRHRVZyanJwa1F3cEthN2pISThTakFsTGhrLzRSRndESGYrSVNCOU5wM1oxV0RXbkxjQQorOUNXUjZnPT0KKy0tLS0tRU5EIFBLQ1M3LS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L2MucGVtIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvYy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiNTVlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L2MucGVtCkBAIC0wLDAgKzEsNDggQEAKK2lzc3VlciA6L0M9QVUvU1A9UXVlZW5zbGFuZC9MPUJyaXNiYW5lL089Q3J5cHRzb2Z0IFB0eSBMdGQvT1U9REVNT05TVFJBVElPTiBBTkQgVEVTVElORy9DTj1ERU1PIFpFUk8gVkFMVUUgQ0EKK3N1YmplY3Q6L0M9QVUvU1A9UXVlZW5zbGFuZC9MPUJyaXNiYW5lL089Q3J5cHRzb2Z0IFB0eSBMdGQvT1U9U01JTUUgMDAzL0NOPUluZm9ybWF0aW9uL0VtYWlsPWluZm9AY3J5cHRzb2Z0LmNvbQorc2VyaWFsIDowNDdECisKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMTE0OSAoMHg0N2QpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNXdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1BVSwgU1A9UXVlZW5zbGFuZCwgTD1CcmlzYmFuZSwgTz1DcnlwdHNvZnQgUHR5IEx0ZCwgT1U9REVNT05TVFJBVElPTiBBTkQgVEVTVElORywgQ049REVNTyBaRVJPIFZBTFVFIENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXkgMTMgMDU6NDA6NTggMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE1heSAxMiAwNTo0MDo1OCAyMDAwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPUFVLCBTUD1RdWVlbnNsYW5kLCBMPUJyaXNiYW5lLCBPPUNyeXB0c29mdCBQdHkgTHRkLCBPVT1TTUlNRSAwMDMsIENOPUluZm9ybWF0aW9uL0VtYWlsPWluZm9AY3J5cHRzb2Z0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICAgICAgTW9kdWx1czoKKyAgICAgICAgICAgICAgICAgICAgMDA6YWQ6ZTc6MjM6ODk6ZWU6MGQ6ODc6Yjc6OWM6MzI6NDQ6NGI6OTU6ODE6CisgICAgICAgICAgICAgICAgICAgIDczOmRkOjIyOjgwOjRiOjJkOmM1OjYwOmI4OmZlOjFlOjE4OjYzOmVmOmRjOgorICAgICAgICAgICAgICAgICAgICA4OTo4OToyMjpkZjo5NTozYzo3YTpkYjozZDo5YTowNjphODowODpkNjoyOToKKyAgICAgICAgICAgICAgICAgICAgZmQ6ZWY6NDE6MDk6OTE6ZWQ6YmM6YWQ6OTg6Zjk6ZjY6Mjg6OTA6NjI6NmY6CisgICAgICAgICAgICAgICAgICAgIGU3OmU3OjBjOjRkOjBiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIEdlbmVyYXRlZCB3aXRoIFNTTGVheQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNXdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDUyOjE1OmVhOjg4OmY0OmYwOmY5OjBiOmVmOmNlOmQ1OmY4OjgzOjQwOjYxOjE2OjVlOjU1OgorICAgICAgICBmOTpjZToyZDpkMTo4YjozMTo1YzowMzpjNjoyZDoxMDo3Yzo2MTpkNTo1YzowYTo0Mjo5NzoKKyAgICAgICAgZDE6ZmQ6NjU6YjY6YjY6ODQ6YTU6Mzk6ZWM6NDY6ZWM6ZmM6ZTA6MGQ6ZDk6MjI6ZGE6MWI6CisgICAgICAgIDUwOjc0OmFkOjkyOmNiOjRlOjkwOmU1OmZhOjdkCisKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1REQ0NBZmFnQXdJQkFnSUNCSDB3RFFZSktvWklodmNOQVFFRUJRQXdnWkl4Q3pBSkJnTlZCQVlUQWtGVgorTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdVpURWFNQmdHQTFVRQorQ2hNUlEzSjVjSFJ6YjJaMElGQjBlU0JNZEdReElqQWdCZ05WQkFzVEdVUkZUVTlPVTFSU1FWUkpUMDRnUVU1RQorSUZSRlUxUkpUa2N4R3pBWkJnTlZCQU1URWtSRlRVOGdXa1ZTVHlCV1FVeFZSU0JEUVRBZUZ3MDVPREExTVRNdworTlRRd05UaGFGdzB3TURBMU1USXdOVFF3TlRoYU1JR2VNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNSworVVhWbFpXNXpiR0Z1WkRFUk1BOEdBMVVFQnhNSVFuSnBjMkpoYm1VeEdqQVlCZ05WQkFvVEVVTnllWEIwYzI5bQorZENCUWRIa2dUSFJrTVJJd0VBWURWUVFMRXdsVFRVbE5SU0F3TURNeEZEQVNCZ05WQkFNVEMwbHVabTl5YldGMAorYVc5dU1TRXdId1lKS29aSWh2Y05BUWtCRmhKcGJtWnZRR055ZVhCMGMyOW1kQzVqYjIwd1hEQU5CZ2txaGtpRworOXcwQkFRRUZBQU5MQURCSUFrRUFyZWNqaWU0Tmg3ZWNNa1JMbFlGejNTS0FTeTNGWUxqK0hoaGo3OXlKaVNMZgorbFR4NjJ6MmFCcWdJMWluOTcwRUprZTI4clpqNTlpaVFZbS9uNXd4TkN3SURBUUFCb3lnd0pqQWtCZ2xnaGtnQgoraHZoQ0FRMEVGeFlWUjJWdVpYSmhkR1ZrSUhkcGRHZ2dVMU5NWldGNU1BMEdDU3FHU0liM0RRRUJCQVVBQTBFQQorVWhYcWlQVHcrUXZ2enRYNGcwQmhGbDVWK2M0dDBZc3hYQVBHTFJCOFlkVmNDa0tYMGYxbHRyYUVwVG5zUnV6OAorNEEzWkl0b2JVSFN0a3N0T2tPWDZmUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L2ZmIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvZmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmMDEzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L2ZmCkBAIC0wLDAgKzEsMzIgQEAKKy0tLS0tQkVHSU4gUEtDUzctLS0tLQorTUlJR0hnWUpLb1pJaHZjTkFRY0NvSUlHRHpDQ0Jnc0NBUUV4Q3pBSkJnVXJEZ01DR2dVQU1Bc0dDU3FHU0liM0RRRUhBYUNDCitCR3N3Z2dKVE1JSUIvYUFEQWdFQ0FnSUVmakFOQmdrcWhraUc5dzBCQVFRRkFEQ0JrakVMTUFrR0ExVUVCaE1DUVZVeEV6QVIKK0JnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEVUQVBCZ05WQkFjVENFSnlhWE5pWVc1bE1Sb3dHQVlEVlFRS0V4RkRjbmx3ZEhOdgorWm5RZ1VIUjVJRXgwWkRFaU1DQUdBMVVFQ3hNWlJFVk5UMDVUVkZKQlZFbFBUaUJCVGtRZ1ZFVlRWRWxPUnpFYk1Ca0dBMVVFCitBeE1TUkVWTlR5QmFSVkpQSUZaQlRGVkZJRU5CTUI0WERUazRNRFV4TXpBMk1qWTFObG9YRFRBd01EVXhNakEyTWpZMU5sb3cKK2dhVXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdQorWlRFYU1CZ0dBMVVFQ2hNUlEzSjVjSFJ6YjJaMElGQjBlU0JNZEdReEVqQVFCZ05WQkFzVENWTk5TVTFGSURBd016RVpNQmNHCitBMVVFQXhNUVFXNW5aV3hoSUhaaGJpQk1aV1Z1ZERFak1DRUdDU3FHU0liM0RRRUpBUllVWVc1blpXeGhRR055ZVhCMGMyOW0KK2RDNWpiMjB3WERBTkJna3Foa2lHOXcwQkFRRUZBQU5MQURCSUFrRUF1QzMrN2RBYjJMaHVPN2d0MmNUTTh2c05qaEc1SmZEaAoraFgxVmwvd1ZHYktFRWowTUE2dldFb2x2ZWZRbHhCK0V6d0N0UjBZWjdlRUMvVC80Sm9DeWVRSURBUUFCb3lnd0pqQWtCZ2xnCitoa2dCaHZoQ0FRMEVGeFlWUjJWdVpYSmhkR1ZrSUhkcGRHZ2dVMU5NWldGNU1BMEdDU3FHU0liM0RRRUJCQVVBQTBFQVVuU1AKK2lnczZUTUZJU1RqdzhjQnRKWWI5OGN6Z0FWa1ZGakt5SlF3WU1IOEZiRG5DeXg2Tm9jTTU1NW5zeURzdGF3OGZLUjExS2hkcworc3lkM2lra3JoRENDQWhBd2dnRzZBZ0VETUEwR0NTcUdTSWIzRFFFQkJBVUFNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHCitBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERVJNQThHQTFVRUJ4TUlRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW0KK2RDQlFkSGtnVEhSa01TSXdJQVlEVlFRTEV4bEVSVTFQVGxOVVVrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRRAorRXhKRVJVMVBJRnBGVWs4Z1ZrRk1WVVVnUTBFd0hoY05PVGd3TXpBek1EYzBNVE15V2hjTk1EZ3dNakk1TURjME1UTXlXakNCCitrakVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WQkFnVENsRjFaV1Z1YzJ4aGJtUXhFVEFQQmdOVkJBY1RDRUp5YVhOaVlXNWwKK01Sb3dHQVlEVlFRS0V4RkRjbmx3ZEhOdlpuUWdVSFI1SUV4MFpERWlNQ0FHQTFVRUN4TVpSRVZOVDA1VFZGSkJWRWxQVGlCQgorVGtRZ1ZFVlRWRWxPUnpFYk1Ca0dBMVVFQXhNU1JFVk5UeUJhUlZKUElGWkJURlZGSUVOQk1Gd3dEUVlKS29aSWh2Y05BUUVCCitCUUFEU3dBd1NBSkJBTCswRTJmTGVqM0ZTQ3dlMkEyaVJuTXVDM3oxMnFISXA2S3kxd28yelpjeGZ0N0FJK1Jma3JXclNHdGYKK21mekJFdVByTGRmdWxuY0M1WTFwTmNNOFJUVUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRUUZBQU5CQUdTYkxNcGhMNkY1cHAzcworOG8wWHloODZGSEZkcFZPd1l4MDlFTExrdUcxN1YvUDlwZ0ljMEVvL2dETWJOK0tUM0lkZ0VDZjhTLy9wQ1JBNlJyTmpjWEl4CitnZ0Y3TUlJQmR3SUJBVENCbVRDQmtqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEVUQVAKK0JnTlZCQWNUQ0VKeWFYTmlZVzVsTVJvd0dBWURWUVFLRXhGRGNubHdkSE52Wm5RZ1VIUjVJRXgwWkRFaU1DQUdBMVVFQ3hNWgorUkVWTlQwNVRWRkpCVkVsUFRpQkJUa1FnVkVWVFZFbE9SekViTUJrR0ExVUVBeE1TUkVWTlR5QmFSVkpQSUZaQlRGVkZJRU5CCitBZ0lFZmpBSkJnVXJEZ01DR2dVQW9Ib3dHQVlKS29aSWh2Y05BUWtETVFzR0NTcUdTSWIzRFFFSEFUQWJCZ2txaGtpRzl3MEIKK0NROHhEakFNTUFvR0NDcUdTSWIzRFFNSE1Cd0dDU3FHU0liM0RRRUpCVEVQRncwNU9EQTFNVFF3TXpNNU16ZGFNQ01HQ1NxRworU0liM0RRRUpCREVXQkJRc3ROTW5TVjI2YmE4UGFwUUVEaE8yMXlORnJqQU5CZ2txaGtpRzl3MEJBUUVGQUFSQVc5WGI5WVh2CitCZmNOa3V0Z0ZYOUdyOGlYaEJWc050R0VWcmpycGtRd3BLYTdqSEk4U2pBbExoay80UkZ3REhmK0lTQjlOcDNaMVdEV25MY0EKKzlDV1I2Zz09CistLS0tLUVORCBQS0NTNy0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWUgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFmYWU2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L21zaWUtZQpAQCAtMCwwICsxLDIwIEBACisKK01JQUdDU3FHU0liM0RRRUhBNkNBTUlBQ0FRQXhnZ0hDTUlITUFnRUFNSFl3WWpFUk1BOEdBMVVFQnhNSVNXNTBaWEp1WlhReEZ6QVYKK0JnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVFF3TWdZRFZRUUxFeXRXWlhKcFUybG5iaUJEYkdGemN5QXhJRU5CSUMwZ1NXNWsKK2FYWnBaSFZoYkNCVGRXSnpZM0pwWW1WeUFoQmdRSmlDM3FmYkNiamRqNUlOWUxuS01BMEdDU3FHU0liM0RRRUJBUVVBQkVDTXp1OHkKK3dRL3FaYk84Y0FHTVJCRittUHJ1djMrRHZiOWFXTloyazhualVncUY2bWNkaFZCMk1rR2NzRzNtZW1SWEpCaXh2TVlXVmtVM3FLNFoKK1Z1S3NNSUh3QWdFQU1JR1pNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUtVWFZsWlc1emJHRnVaREVSTUE4R0ExVUUKK0J4TUlRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW1kQ0JRZEhrZ1RIUmtNU0l3SUFZRFZRUUxFeGxFUlUxUFRsTlUKK1VrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRREV4SkVSVTFQSUZwRlVrOGdWa0ZNVlVVZ1EwRUNBZ1J1TUEwR0NTcUcKK1NJYjNEUUVCQVFVQUJFQmNXd1lGSEpiSkdoaXp0dDdsenVlM0xjOUNINVdBYnlSKzJCWjN1ditKeFpmUnMxUHVhV1BPd1JhMFZnczMKK1l3U0pvUmZ4UWoyR2swd0ZxRzFxdDZkMU1JQUdDU3FHU0liM0RRRUhBVEFhQmdncWhraUc5dzBEQWpBT0FnSUFvQVFJOHZSbFAvTngKKzJpU2dnQVNDQVpoUjVzcnh5c3B5N0Rmb21SSjlmZjhlTUN0YU53RW9FeDdHMjVQWlJvbkM1N2hCdkdvU2NMdEVQVTNXcDlGRWJQTjcKK29KRVNlQytBcU1UeVRMTnk4YVFzeUM1czUzRTlVa29Jdmc2MmVrWVpCYlhacVhzcnh4NFBoaWlYM05IOEdWaDQycGhCMENoancwbksKK0haZVJEbXhHWTNDbWsrSitsMHVWS3hiTklmSklLT2d1TEJuaHFtbktIL1BybnpEdDU5MXUwVUx5MmFUTHFSbSs0LzFZYXQvUVBiNkoKK2VvS0d3TlBCYlM5b2dCZHJDTkNwOVpGZzNYYXIyQXRRSHp5VFFJZlllSDNTUlFVcEttUm01VTVvOXA1ZW1nRWRUK1pmSm0vSjR0U0gKK09tYmdBRnNiSFFha0E0TUJaNEo1cWZESmhPQTJnNWxXazFoSWV1NURuL0FhTFJaZDB5ejNvWTBJZW8vZXJQV3gvYkNxdEJ6WWJNZTkKK3FTRlRlZEtsYmM5RUdlM29wT1RkQlpWeks4S0gzdzN6c3k1bHV4S2RPVUc1OVlZYjVGMUlaaVdHaUR5dW8vSHVhY1grZ3JpdTVMZUQKK2JFek90Wm5rbytUWlh2V0lrbzMwZkQ3OWozVDRNUlJoV1hiZ2oySEt6YSs0dkowbXpjQy8xK0dQc0pqQUVBQS9KZ0lFRFU0dzYvREkKKy9IUUhoTEFPM0crOXhLRDdNdm1yemtvQUFBQUFBQUFBQUFBQQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L21zaWUtZS5wZW0gYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWUucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTVlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWUucGVtCkBAIC0wLDAgKzEsMjIgQEAKKy0tLS0tQkVHSU4gUEtDUzctLS0tLQorTUlBR0NTcUdTSWIzRFFFSEE2Q0FNSUlEa0FJQkFER0NBY0l3Z2N3Q0FRQXdkakJpTVJFd0R3WURWUVFIRXdoSgorYm5SbGNtNWxkREVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhOREF5QmdOVkJBc1RLMVpsY21sVAorYVdkdUlFTnNZWE56SURFZ1EwRWdMU0JKYm1ScGRtbGtkV0ZzSUZOMVluTmpjbWxpWlhJQ0VHQkFtSUxlcDlzSgordU4yUGtnMWd1Y293RFFZSktvWklodmNOQVFFQkJRQUVRSXpPN3pMQkQrcGxzN3h3QVl4RUVYNlkrdTYvZjRPOQordjFwWTFuYVR5ZU5TQ29YcVp4MkZVSFl5UVp5d2JlWjZaRmNrR0xHOHhoWldSVGVvcmhsVzRxd3dnZkFDQVFBdworZ1prd2daSXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSAorRXdoQ2NtbHpZbUZ1WlRFYU1CZ0dBMVVFQ2hNUlEzSjVjSFJ6YjJaMElGQjBlU0JNZEdReElqQWdCZ05WQkFzVAorR1VSRlRVOU9VMVJTUVZSSlQwNGdRVTVFSUZSRlUxUkpUa2N4R3pBWkJnTlZCQU1URWtSRlRVOGdXa1ZTVHlCVworUVV4VlJTQkRRUUlDQkc0d0RRWUpLb1pJaHZjTkFRRUJCUUFFUUZ4YkJnVWNsc2thR0xPMjN1WE81N2N0ejBJZgorbFlCdkpIN1lGbmU2LzRuRmw5R3pVKzVwWTg3QkZyUldDemRqQkltaEYvRkNQWWFUVEFXb2JXcTNwM1V3Z2dIRAorQmdrcWhraUc5dzBCQndFd0dnWUlLb1pJaHZjTkF3SXdEZ0lDQUtBRUNQTDBaVC96Y2Rva2dJSUJtRkhteXZISworeW5Mc04raVpFbjE5L3g0d0sxbzNBU2dUSHNiYms5bEdpY0xudUVHOGFoSnd1MFE5VGRhbjBVUnM4M3Vna1JKNAorTDRDb3hQSk1zM0x4cEN6SUxtem5jVDFTU2dpK0RyWjZSaGtGdGRtcGV5dkhIZytHS0pmYzBmd1pXSGphbUVIUQorS0dQRFNjb2RsNUVPYkVaamNLYVQ0bjZYUzVVckZzMGg4a2dvNkM0c0dlR3FhY29mOCt1Zk1PM24zVzdSUXZMWgorcE11cEdiN2ovVmhxMzlBOXZvbDZnb2JBMDhGdEwyaUFGMnNJMEtuMWtXRGRkcXZZQzFBZlBKTkFoOWg0ZmRKRgorQlNrcVpHYmxUbWoybmw2YUFSMVA1bDhtYjhuaTFJYzZadUFBV3hzZEJxUURnd0ZuZ25tcDhNbUU0RGFEbVZhVAorV0VoNjdrT2Y4Qm90RmwzVExQZWhqUWg2ajk2czliSDlzS3EwSE5oc3g3MnBJVk41MHFWdHowUVo3ZWlrNU4wRgorbFhNcndvZmZEZk96TG1XN0VwMDVRYm4xaGh2a1hVaG1KWWFJUEs2ajhlNXB4ZjZDdUs3a3Q0TnNUTTYxbWVTagorNU5sZTlZaVNqZlI4UHYyUGRQZ3hGR0ZaZHVDUFljck5yN2k4blNiTndML1g0WSt3bU1BUUFEOG1BZ1FOVGpEcgorOE1qOGRBZUVzQTdjYjczRW9Qc3krYXZPU2dBQUFBQT0KKy0tLS0tRU5EIFBLQ1M3LS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L21zaWUtZW5jLTAxIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvbXNpZS1lbmMtMDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5M2FiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L21zaWUtZW5jLTAxCkBAIC0wLDAgKzEsNjIgQEAKKworTUlBR0NTcUdTSWIzRFFFSEE2Q0FNSUFDQVFBeGdmTXdnZkFDQVFBd2daa3dnWkl4Q3pBSkJnTlZCQVlUQWtGVk1STXdFUVlECitWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdVpURWFNQmdHQTFVRUNoTVJRM0o1Y0hSemIyWjAKK0lGQjBlU0JNZEdReElqQWdCZ05WQkFzVEdVUkZUVTlPVTFSU1FWUkpUMDRnUVU1RUlGUkZVMVJKVGtjeEd6QVpCZ05WQkFNVAorRWtSRlRVOGdXa1ZTVHlCV1FVeFZSU0JEUVFJQ0JHNHdEUVlKS29aSWh2Y05BUUVCQlFBRVFLdk1hVzh4aDZvRi9YK0NKaXZ6CitJWlY3eUh4bHA0TzNOSFF0V0cwQThNT1pCK0N0S2xVNy82ZzVlL2E5RHUvVE9xeFJNcXRZUnA2M3BhMlEvbU00SVlNd2dBWUoKK0tvWklodmNOQVFjQk1Cb0dDQ3FHU0liM0RRTUNNQTRDQWdDZ0JBaWZ6NlJ2ek9QWWxLQ0FCSUd3eHRHQS9GTEJCUnMxd2JCUAorZ0RDYlNHMHlDd2pKTnNGZzg5L2s2eHVYbzhjNVlUd3N3OCtYbElWcTAzbmF2cGV3Nlh4eHpZMDkwckQyT0owdDZIQTZHcXJJCitwZDhXaVNoL0F0cW4weWZMRm1rTHFnSUFQUmZ6eFV4cVVvY3hMcFFzTElGcDJZTlVHRSt5cHMrVVptSWp3L1dIZmRxcmNXVG0KK1NUU3ZLdXkzVWtJSlpDa0dEQnBUdnFrNEJGYUhoNG9UWEVwZ3BOWStHS3hqZjlURE45R1FQcVFaUjdzZ1FraTR0Mmc0L1NhcQorS2w0RU1JU2dsdWs2c3dkTkQwdGlIWTd2NWQ2WVIyOWVQQ2wyL1NUSjk4ZUpwV2tFRUMyMkdOTnZPeTdydS9SdjJIZTRNZ1FnCitvcHRkN3NrOU1NZDl4aEpwcGc3Q2NIL3lEeC8vSHJ0Z3BPY1dtbjZWeHBnRUNGcW9uNHVYa1F0SUJJSDRQYU5jbEZuNy9oTHgKK1B3MlZtQkdhQzBTWUYzVTFqeU45NkVCeGRqcXk4QWE2QnlNWFlEVzVCY2ZxbmlENW1ZWGZ3K2I4MWxoMWt1dHhhUGFWNFlKOQorWmxSVVc3NTJON1ZIby9mRzAvZnVrb2U1VzlhOGtJaGdMcHlnbGxiL0dQNG9TRjR3TTZuMS9PZ1J6WmoySVdGaW9iS080ZC90CitNbmgrQytQb0VWQXVGWmN4UXdpOUdxdnNLNU9vSWpWd054MFhjVlNPbDFUVFlTOVN3Qzd1Z01CQ2FiNzNKaXJ1QzI0cEw3OFkKK00rTmFJcElRM09uNERva0pBMlpIdGpCalpJeEY0dEtBMTQ0UnZGTjZwQmQ2VFZFNVhNNktEL1ZoOWJqU211anRFQWZkUTNUZQorZHZLSnNiWnV1MHN0RXJidldjUnkxMUkzMjhsNTU3RUVDQUpUN2Q0NE9KM3JCQkJqNmJubng2ZERVMlNScXAyQ0VvUWFCQWhLCitSQnV5aE54a3lnUUlPWTkvTmh3cUFKQUVDT3ZYMFpkMERxZ29CQWpvYlBwTUhoVlYzZ1FRV0xVMnZFb1o1MUJ3enhkekNteE8KK3d3UUk0b0tmdWRhTnFvQUVTS3pCTkFxdjVrR3VtSE9sTUtzUmZyczdqWkNjU2FPdUVqOTdwWXgwOEZMRWdGMjNjYXYzOU1PUQorTlVFTTFkTlUrRVlzbEw0bzNSb1NIUmpVZ1BVKzJ0OWMwcHJTOUEvYlBBUklFT1A5NFB5bmFUTnh3SGkzVlRLN1N6dVFtZ3pBCis0bjk0MkU5am9TaXFzUVBsc0tBYjNzUFVhTEMzU3VVeFNqTkJnZnB2RDBibXJBLzVoK1dab1lYdklvZ0Zwd2prU21uRkJFaWUKKzBsaDVPdjFhUnJ2Q3c1L2ozUS9XLzRadE41VSthZVZCSk10QThuME14ZDVrUHhIYk5WaDRvR3ByWjZ3RWVnVjhodDN2b3laYQorbVo1Q3l4YzhmZk1Zbk0vSkpJNi9vRVlFVUVNeXlpUzVGbll5dnhLemZNdHluMmxaMnN0OW5aR05OZ01jOU42MnI1SGdOYmRECitGSHVSZEtLelYrOGtRZnVNYzNtT1BwSzF0OVRGWStRZ3J4aUI1cDZTN1Zvb0k5N1l0UDNQYmZrbnN6Q0VCRWg0UGRYWWJiYVIKKzNBYWNOM1E1a1lZbVdzcTNXVzZ4Z3JnMG1tRUdvc0d2d1NReEJCdWlYWnJ4U2NDYTRpdkVxMDVVWnd5U2hlUHZLZHVPdm5VRQorMnpETzZJWEZMWnhoVFpBRVNFbTkvRm92TGdHQWlKN2lNR21ZdnNJU0xKU2N3RzRuK3dyU2FRTlFYaXpzOU4zeWt5czU0d0JOCitkLytCUTRGN3BuY0hoRFEyRHl0NU1la0I4WThpTk9vY1VURkN1NTI0dlFSSWFXQ1htWFAzdlU3RDIxZHAwWG5BTXpSUUo1NjUKK0pWM2FIUm9ZN1hEYTRMZVBhN1BQOXl3eWFmT0U1eUNXN25kcXgzSisySmhURHZTRnNXOC9xM0gzaXllRmh5a3VKVlM2QkZESworNkNtS2JueXlqT2ZFMmlMR0ptVEZhOTA1VjJLclZEQ21sRXUveHlHTXM4MHlUeVpDK3lTek04M0ZNVnZMRVFtU3pjVE5VWlZwCitEZkExa05YYlhrUG91QlhYVDZnOHI4SkNSbGphS0tBQm1nUklsTWhlT0pRUlVVVTRjZ3ZoTXJlWFBheWhxNUFvNFZNU0NrQTUKK2hZUkNCY3ptNERpL01Nb2hGMFN4SXNkUlk2Z1k5Q1BuckJYQXNZNmgxUmJSN1R3MGlRWm1lWGk1MkRDaUJFajBieStTWU1BYQorOXowQ1JlSXpsOEpMTDZFVklGejhrRnhsa0dXanI0ZG5PemhoUE9xL21DcHAwV3hiYXZEZmRoRTg3TWRYSlpCbkx3b1Q2MlFHCis5NTVIbEFvRVFCT0dKYmNFU0NnZDVYU2lyWjlZM0FiQ2Z1S09xb01CdkVVR24rdy9wTWFxbkd2bnI1RlpodUJES3JoUlhxdHgKK1FzeEEvL2RyR1V4c3JaT3VTTC8wK2Zidm83bjJoMVo4Tnk4NmpPdlZaQVFJQWp3MmwxWWM1UkFFU05jOWkzSThwS0VPVlFmLworVUJjekowTlI5YVRFRjgwZFJnMmxwWHdEMGhvNE4wQXZTaVZiZ3hDN2NQWkhRd0lxdnE5TEhSVXMvNG4rVnUzU1ZZVTNjQXhvCitsVVRpQ0dVU2xBUklGK1RENTdTSTUrUkkrTU50bkQ5cnM0RTFtbDUxWW9IR1dGajNVUHJpRG1ZMEZLRXdJZ3F0TVhNWTNmWjkKK0txOGQ4M2JqRHp4d2JEWDdXd1I3S2JTZUpXVDQycEN6N2tNK0JFampQc09uWkh1dXNYVDN4MnJyc0JuWXRZc2J0OThtU0ZpUworS3pUdEZtWGZrT0JiQ1FkaXQxUDc2UW5ZSjFhWE1HczZ6UDZHeXBRVGFkSy96WVd2bG0zOFFrVnd1ZWFKMHdvRVNLVzJwcUtBCis3MGgyVU1ESE9ycGVwVTFsajBZTXptb3RESFNUVTNMOTA5VnZVTU5nOXVxZnJRNm1Ta2I5ajVUbDhvRjJvdE93NUV6QTFZZGEKK0tQbWdzdjYyUldMWWw4MHdYUVJRd0cwZS9tZ0c3NWpwOWxPaEpkVlhxY1liUXBTOXZpd1ZhVmt3SCs2OW11L2JRSTRnam9FcworVVlYNk83MVJlMnorY1loY205VXJLK0RYdVNGQlhRT0lsQUZ4S01XNEIwYXBkNmZVODRGc1pMTUVTT29yWEU1T0UwQTJCMmppCitKOFFJMEV4azRoVXZXck1OSmZVWndGeVM3RTA1eFY5T1J1WDF4bXNLcWtUNHRWUjVOcWxuNHZodkFZODYwVkJvbG96MENEa2QKKzhzZVNCRWplTWdSSTlGdnBZdWZsSWVIZzl1cmt3cDZOKzFmMERySkpoSlk5WlEwSFRRaHppSm1JZnZiRWpOcUNsN2hFQzI4KworRjhJNXR1VmlMZ2ZTd2NGRkN2blM2V0ZvTjRYNlFkRmRxTUNiQkVqZGxJMWMrSVFHQS9JdVRETUpZQ3VRL3YrOEJHNVplV1ZICitpY1BabVhmUmF0OWVGSzFkR0tBSmVmNitUZjlIUHVEalNwRHlmZnJpZnNwN0RjMzRsbW03R04xK09OM1pNdHdFVU5tNmVwYjgKKzFSS1dqb0k3aklLVVYvTTJwLzBlZUdTcXM0YjA2S0YvVlI2ZEJ3c0pWTDVEcG5Uc3AzTVY0ai9DQU9sUmRTUFo1Kyt0c0tiTQorYXBsaytjZXFRdHBFRnoxTVlUdFZWNCtybHJXYUJFQTFva0p5Tlo1L3ROT3dNN0IrWGZPWjB4dyt1eVZpOXY0YnlUWk0yUWRzCitKK2QzWUdZTEF1Z1RHSElTTHFRRWVyRDgvZ0dLKy9TTDA2YjJnTmVkWFBIdEJBaUJLWCtNZHkzd0ZRUUlxRTlnVmd2ckZOVUUKK0NLS29URm9NR3FuUEJBakRQZ0xDa2xOZnJ3UUkzRWsxdlNxNjh3OEVDQm9kdTJGT1pKVmtCQWd6d2pmU3IyTjlXUVFRVENvUQorS2tBYnJTOXRualhuMUkzK1p3UUlyUHgzZUlOby9ZVUVDSWVZV0NGc2t4bFlCQWlEVWR2Wlh3RDN2Z1FJa0V5WmJiWldiVVVFCitDSDQrb2RsMUlzazNCQmo2OGZrcUowZktKUldWTFd1Vy9PM1ZFNEJPUEt3RmxhSUVDRnNlVlRkRFVobzhCQWorY09LdlYyV0EKK2hnUWdhWHIrd3dxK0l0YmxHMFF4ejhJVlVYWDZQVjJtSWRId3o0U0NDdm5Dc2FJRUNKaEJZeGRmTEkvWEJDRHN3YW1QbjlNUgoreVhpMkhWUUJpbmVWK0d0V1ZrSW9aMmRDTEZCOW1RUk1vQVFJMG5VUjVhNUFPSm9FQ0ErQXVuS2xBbHg4QkFpNVJ0RmVGNGcxCitGUVFJei9pZSsxNkxsUWNFQ09tTnVWZzVEWGpNQkFqSDJua2ZwWFpnV3dRSVZkTHVPLytrdUhBRUNPLzVyRUhteUk5dkJCRDQKKzE2QlU0UmQzWWVyRFFuSHRyd09RQkNDa2hvMVh4SzVNYXo4S0xDTmkyMHd2Y0d0OHdzSVhsajJoNXE5SVRCcTdJZ1FRdktWWQorNE9mSjdiS2JJdFAyZHlsd1FnUVlQSUd4d2trYlJYTnJhT05Zdk4xOUc4VWRGMzVyRk91SUJBamYwc0t6LzYxOFpRUUl4T2JyCit4SmtSZTBzRUNJQytzc25qRWIyTkJCQkkrWE00T250VldHc1JWOVRkM3NGZ0JBaW5Hd0lyb284TzBnUVFNR0F3Z2M5UGFMYUcKK2dCQ2l3U1RyWVFRSVZIamZDUWdPdHlnRVVJb3JhRm9BTmZoWmdJU2hwT2QvUlJ4RlU0Lzd4WlI1dE1kR29Zei9nMHRoUjBsTQorK0hpODhGdEZENG1BaC9PYXQ0Umk4QjdidjA0YW9rak4yVUh6Nm5QYkhIalo4eklxcGJZVEN5MDQzR05aQkFoT3FqeUIySmJECitOd1FvUjIzWENZRDl4NkUyMENoSEpSWG1hSHd5TWRZWEtsNUNVeHlwbDdvaXMrc3kyRDdqRHVrUzN3UUlzVHl5UGdKaTBHc0EKK0FBQUFBQUFBQUFBQQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWVuYy0wMS5wZW0gYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWVuYy0wMS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiZjAwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L21zaWUtZW5jLTAxLnBlbQpAQCAtMCwwICsxLDY2IEBACistLS0tLUJFR0lOIFBLQ1M3LS0tLS0KK01JQUdDU3FHU0liM0RRRUhBNkNBTUlJTHlBSUJBREdCOHpDQjhBSUJBRENCbVRDQmtqRUxNQWtHQTFVRUJoTUMKK1FWVXhFekFSQmdOVkJBZ1RDbEYxWldWdWMyeGhibVF4RVRBUEJnTlZCQWNUQ0VKeWFYTmlZVzVsTVJvd0dBWUQKK1ZRUUtFeEZEY25sd2RITnZablFnVUhSNUlFeDBaREVpTUNBR0ExVUVDeE1aUkVWTlQwNVRWRkpCVkVsUFRpQkIKK1RrUWdWRVZUVkVsT1J6RWJNQmtHQTFVRUF4TVNSRVZOVHlCYVJWSlBJRlpCVEZWRklFTkJBZ0lFYmpBTkJna3EKK2hraUc5dzBCQVFFRkFBUkFxOHhwYnpHSHFnWDlmNEltSy9NaGxYdklmR1duZzdjMGRDMVliUUR3dzVrSDRLMHEKK1ZUdi9xRGw3OXIwTzc5TTZyRkV5cTFoR25yZWxyWkQrWXpnaGd6Q0NDc3NHQ1NxR1NJYjNEUUVIQVRBYUJnZ3EKK2hraUc5dzBEQWpBT0FnSUFvQVFJbjgra2I4emoySlNBZ2dxZ3h0R0EvRkxCQlJzMXdiQlBnRENiU0cweUN3akoKK05zRmc4OS9rNnh1WG84YzVZVHdzdzgrWGxJVnEwM25hdnBldzZYeHh6WTA5MHJEMk9KMHQ2SEE2R3FySXBkOFcKK2lTaC9BdHFuMHlmTEZta0xxZ0lBUFJmenhVeHFVb2N4THBRc0xJRnAyWU5VR0UreXBzK1VabUlqdy9XSGZkcXIKK2NXVG1TVFN2S3V5M1VrSUpaQ2tHREJwVHZxazRCRmFIaDRvVFhFcGdwTlkrR0t4amY5VEROOUdRUHFRWlI3c2cKK1FraTR0Mmc0L1NhcUtsNkVvSmJwT3JNSFRROUxZaDJPNytYZW1FZHZYandwZHYwa3lmZkhpYVZwQkJBdHRoalQKK2J6c3U2N3YwYjloM3VES2ltMTN1eVQwd3gzM0dFbW1tRHNKd2YvSVBILzhldTJDazV4YWFmcFhHbUZxb240dVgKK2tRdElQYU5jbEZuNy9oTHhQdzJWbUJHYUMwU1lGM1UxanlOOTZFQnhkanF5OEFhNkJ5TVhZRFc1QmNmcW5pRDUKK21ZWGZ3K2I4MWxoMWt1dHhhUGFWNFlKOVpsUlVXNzUyTjdWSG8vZkcwL2Z1a29lNVc5YThrSWhnTHB5Z2xsYi8KK0dQNG9TRjR3TTZuMS9PZ1J6WmoySVdGaW9iS080ZC90TW5oK0MrUG9FVkF1RlpjeFF3aTlHcXZzSzVPb0lqVncKK054MFhjVlNPbDFUVFlTOVN3Qzd1Z01CQ2FiNzNKaXJ1QzI0cEw3OFlNK05hSXBJUTNPbjREb2tKQTJaSHRqQmoKK1pJeEY0dEtBMTQ0UnZGTjZwQmQ2VFZFNVhNNktEL1ZoOWJqU211anRFQWZkUTNUZWR2S0pzYlp1dTBzdEVyYnYKK1djUnkxMUkzMjhsNTU3RUNVKzNlT0RpZDYyUHB1ZWZIcDBOVFpKR3FuWUlTaEJwS1JCdXloTnhreWptUGZ6WWMKK0tnQ1E2OWZSbDNRT3FDam9iUHBNSGhWVjNsaTFOcnhLR2VkUWNNOFhjd3BzVHNQaWdwKzUxbzJxZ0t6Qk5BcXYKKzVrR3VtSE9sTUtzUmZyczdqWkNjU2FPdUVqOTdwWXgwOEZMRWdGMjNjYXYzOU1PUU5VRU0xZE5VK0VZc2xMNG8KKzNSb1NIUmpVZ1BVKzJ0OWMwcHJTOUEvYlBCRGovZUQ4cDJremNjQjR0MVV5dTBzN2tKb013T0ovZU5oUFk2RW8KK3FyRUQ1YkNnRzk3RDFHaXd0MHJsTVVvelFZSDZidzlHNXF3UCtZZmxtYUdGN3lLSUJhY0k1RXBweFo3U1dIazYKKy9WcEd1OExEbitQZEQ5Yi9obTAzbFQ1cDVVRWt5MER5ZlF6RjNtUS9FZHMxV0hpZ2FtdG5yQVI2Qlh5RzNlK2oKK0pscVpua0xMRnp4OTh4aWN6OGtranIrZ1JrTXl5aVM1Rm5ZeXZ4S3pmTXR5bjJsWjJzdDluWkdOTmdNYzlONjIKK3I1SGdOYmRERkh1UmRLS3pWKzhrUWZ1TWMzbU9QcEsxdDlURlkrUWdyeGlCNXA2UzdWb29JOTdZdFAzUGJma24KK3N6Q0VlRDNWMkcyMmtkd0duRGQwT1pHR0psckt0MWx1c1lLNE5KcGhCcUxCcjhFa01RUWJvbDJhOFVuQW11SXIKK3hLdE9WR2NNa29Yajd5bmJqcjUxQk5zd3p1aUZ4UzJjWVUyUVNiMzhXaTh1QVlDSW51SXdhWmkrd2hJc2xKekEKK2JpZjdDdEpwQTFCZUxPejAzZktUS3puakFFMTMvNEZEZ1h1bWR3ZUVORFlQSzNreDZRSHhqeUkwNmh4Uk1VSzcKK25iaTlhV0NYbVhQM3ZVN0QyMWRwMFhuQU16UlFKNTY1SlYzYUhSb1k3WERhNExlUGE3UFA5eXd5YWZPRTV5Q1cKKzduZHF4M0orMkpoVER2U0ZzVzgvcTNIM2l5ZUZoeWt1SlZTNnl1Z3BpbTU4c296bnhOb2l4aVpreFd2ZE9WZGkKK3ExUXdwcFJMdjhjaGpMUE5NazhtUXZza3N6UE54VEZieXhFSmtzM0V6VkdWYVEzd05aRFYyMTVENkxnVjEwK28KK1BLL0NRa1pZMmlpZ0FacVV5RjQ0bEJGUlJUaHlDK0V5dDVjOXJLR3JrQ2poVXhJS1FEbUZoRUlGek9iZ09MOHcKK3lpRVhSTEVpeDFGanFCajBJK2VzRmNDeGpxSFZGdEh0UERTSkJtWjVlTG5ZTUtMMGJ5K1NZTUFhOXowQ1JlSXoKK2w4SkxMNkVWSUZ6OGtGeGxrR1dqcjRkbk96aGhQT3EvbUNwcDBXeGJhdkRmZGhFODdNZFhKWkJuTHdvVDYyUUcKKzk1NUhsQW9FUUJPR0piY29IZVYwb3EyZldOd0d3bjdpanFxREFieEZCcC9zUDZUR3FweHI1NitSV1liZ1F5cTQKK1VWNnJjVUxNUVAvM2F4bE1iSzJUcmtpLzlQbjI3Nk81OW9kV2ZEY3ZPb3pyMVdRQ1BEYVhWaHpsRU5jOWkzSTgKK3BLRU9WUWYvVUJjekowTlI5YVRFRjgwZFJnMmxwWHdEMGhvNE4wQXZTaVZiZ3hDN2NQWkhRd0lxdnE5TEhSVXMKKy80bitWdTNTVllVM2NBeG9sVVRpQ0dVU2xCZmt3K2UwaU9ma1NQakRiWncvYTdPQk5acGVkV0tCeGxoWTkxRDYKKzRnNW1OQlNoTUNJS3JURnpHTjMyZlNxdkhmTjI0dzg4Y0d3MSsxc0VleW0wbmlWaytOcVFzKzVEUHVNK3c2ZGsKK2U2NnhkUGZIYXV1d0dkaTFpeHUzM3laSVdKSXJOTzBXWmQrUTRGc0pCMkszVS92cENkZ25WcGN3YXpyTS9vYksKK2xCTnAwci9OaGErV2JmeENSWEM1NW9uVENxVzJwcUtBNzBoMlVNREhPcnBlcFUxbGowWU16bW90REhTVFUzTDkKKzA5VnZVTU5nOXVxZnJRNm1Ta2I5ajVUbDhvRjJvdE93NUV6QTFZZGFLUG1nc3Y2MlJXTFlsODB3WGNCdEh2NW8KK0J1K1k2ZlpUb1NYVlY2bkdHMEtVdmI0c0ZXbFpNQi91dlpydjIwQ09JSTZCTEZHRitqdTlVWHRzL25HSVhKdlYKK0t5dmcxN2toUVYwRGlKUUJjU2pGdUFkR3FYZW4xUE9CYkdTejZpdGNUazRUUURZSGFPSW54QWpRVEdUaUZTOWEKK3N3MGw5Um5BWEpMc1RUbkZYMDVHNWZYR2F3cXFSUGkxVkhrMnFXZmkrRzhCanpyUlVHaVdqUFFJT1IzeXg1SUUKK1NONHk5RnZwWXVmbEllSGc5dXJrd3A2TisxZjBEckpKaEpZOVpRMEhUUWh6aUptSWZ2YkVqTnFDbDdoRUMyOCsKK0Y4STV0dVZpTGdmU3djRkZDdm5TNldGb040WDZRZEZkcU1DYjNaU05YUGlFQmdQeUxrd3pDV0Fya1A3L3ZBUnUKK1dYbGxSNG5EMlpsMzBXcmZYaFN0WFJpZ0NYbit2azMvUno3ZzQwcVE4bjM2NG43S2V3M04rSlpwdXhqZGZqamQKKzJUTGMyYnA2bHZ6VkVwYU9nanVNZ3BSWDh6YW4vUjU0Wktxemh2VG9vWDlWSHAwSEN3bFV2a09tZE95bmN4WGkKK1A4SUE2VkYxSTlubjc2Mndwc3hxbVdUNXg2cEMya1FYUFV4aE8xVlhqNnVXdFpvMW9rSnlOWjUvdE5Pd003QisKK1hmT1oweHcrdXlWaTl2NGJ5VFpNMlFkc0orZDNZR1lMQXVnVEdISVNMcVFFZXJEOC9nR0srL1NMMDZiMmdOZWQKK1hQSHRnU2wvakhjdDhCV29UMkJXQytzVTFhS29URm9NR3FuUHd6NEN3cEpUWDYvY1NUVzlLcnJ6RHhvZHUyRk8KK1pKVmtNOEkzMHE5amZWbE1LaEFxUUJ1dEwyMmVOZWZVamY1bnJQeDNlSU5vL1lXSG1GZ2hiSk1aV0lOUjI5bGYKK0FQZStrRXlaYmJaV2JVVitQcUhaZFNMSk4vcngrU29uUjhvbEZaVXRhNWI4N2RVVGdFNDhyQVdWb2xzZVZUZEQKK1VobzgvbkRpcjFkbGdJWnBldjdEQ3I0aTF1VWJSREhQd2hWUmRmbzlYYVloMGZEUGhJSUsrY0t4b3BoQll4ZGYKK0xJL1g3TUdwajUvVEVjbDR0aDFVQVlwM2xmaHJWbFpDS0dkblFpeFFmWmtFVEtEU2RSSGxya0E0bWcrQXVuS2wKK0FseDh1VWJSWGhlSU5SWFArSjc3WG91VkIrbU51Vmc1RFhqTXg5cDVINlYyWUZ0VjB1NDcvNlM0Y08vNXJFSG0KK3lJOXYrTmVnVk9FWGQySHF3MEp4N2E4RGtLU0dqVmZFcmt4clB3b3NJMkxiVEM5d2EzekN3aGVXUGFIbXIwaE0KK0dyc2l2S1ZZNE9mSjdiS2JJdFAyZHlsd1FqeUJzY0pKRzBWemEyampXTHpkZlJ2RkhSZCtheFRyaU4vU3dyUC8KK3JYeGx4T2JyeEprUmUwdUF2ckxKNHhHOWpVajVjemc2ZTFWWWF4RlgxTjNld1dDbkd3SXJvbzhPMGpCZ01JSFAKK1QyaTJob0FRb3NFazYyRlVlTjhKQ0E2M0tJb3JhRm9BTmZoWmdJU2hwT2QvUlJ4RlU0Lzd4WlI1dE1kR29Zei8KK2cwdGhSMGxNK0hpODhGdEZENG1BaC9PYXQ0Umk4QjdidjA0YW9rak4yVUh6Nm5QYkhIalo4eklxcGJZVEN5MDQKKzNHTlpUcW84Z2RpV3d6ZEhiZGNKZ1AzSG9UYlFLRWNsRmVab2ZESXgxaGNxWGtKVEhLbVh1aUt6NnpMWVB1TU8KKzZSTGZzVHl5UGdKaTBHc0FBQUFBCistLS0tLUVORCBQS0NTNy0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWVuYy0wMiBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L21zaWUtZW5jLTAyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTcwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWVuYy0wMgpAQCAtMCwwICsxLDkwIEBACisKK01JQUdDU3FHU0liM0RRRUhBNkNBTUlBQ0FRQXhnZ0hDTUlITUFnRUFNSFl3WWpFUk1BOEdBMVVFQnhNSVNXNTBaWEp1WlhReEZ6QVYKK0JnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVFF3TWdZRFZRUUxFeXRXWlhKcFUybG5iaUJEYkdGemN5QXhJRU5CSUMwZ1NXNWsKK2FYWnBaSFZoYkNCVGRXSnpZM0pwWW1WeUFoQmdRSmlDM3FmYkNiamRqNUlOWUxuS01BMEdDU3FHU0liM0RRRUJBUVVBQkVBQ3I0dG4KK2tTenZvM2FJbEhmSkxHYmZva05DVjZGamREUDF2UWhMK2tkWE9OcWNGQ0VmOVJlRVRDdmFIc2xJci9XZXBjNWoyaGpac2VsemdxTG4KK3JNMVpNSUh3QWdFQU1JR1pNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUtVWFZsWlc1emJHRnVaREVSTUE4R0ExVUUKK0J4TUlRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW1kQ0JRZEhrZ1RIUmtNU0l3SUFZRFZRUUxFeGxFUlUxUFRsTlUKK1VrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRREV4SkVSVTFQSUZwRlVrOGdWa0ZNVlVVZ1EwRUNBZ1J1TUEwR0NTcUcKK1NJYjNEUUVCQVFVQUJFQmFuQnhLT3ZVb1JuM0RpRlk1NWxseTJUUHUyQ3YrZEkvR0xyelc2cXZuVU1aUFdHUEdhVWxQeVdMTVpyWEoKK3hHWFpVaVJKS1RCd0R1OTFmbm9kVUVLOU1JQUdDU3FHU0liM0RRRUhBVEFhQmdncWhraUc5dzBEQWpBT0FnSUFvQVFJbXhLWkVEV1AKK0V1T2dnQVNDQkFDQmkxYlgvcWMzZ2VxRnlmUnBYN0p5SW8vZzRDRHI2Mkdsd3Zhc3NBR2xJTzh6SjVaL1VESUlvb2VWNlFTNEQ0T1cKK1B5bUtkMFdYaHdjSkkweUJjSlRXRW94TkQyN0xNN0NXRkpwQTA3QW94VkNSSFRPUGdtNzk0TnluTGVjTlVPcVZURnlTNENSdUxoVkcKK1BBazBuRlpHL1JFMnlNdHg0ckFrU2lWZ09leEVTN3dxL3hXdW9EU1NtdVRNTlFPVGJLZmtFS3FkRkxrTS9kNjJnRDJ3bmFwaDd2S2sKK1BQSzgyd2RaUDhyRjNuVVVDNWM0YWhiTm9hOGcrNUIzdElGL0p6M1paSzN2R0xVMElXTytpN1c0NTFkbmExM01nbEREalhPZWlrTmwKK1hMc1FkQVZvMG5zamZHdStmNjZiZXNKb2pQenlzTkErSUVabDZnTldVZXRsOWxpbTRTcXJ4dWJVRXhkUzJybVhuWFhtRXVFVy9IQzcKK2RsVEFlWXE1Q2xxeDVpZDZzbGhDMkMyb2VnTXd3M1hIOXl4SHc2T3F6dlhZNnBWUEVTY0V0Qk1RTGdhS0ZRVCttMlNSdGJUVkZHN2MKK1FjblVPRHlWQjFJYnBRVEYxREhlZU9YMVcvSGZwV1p5bThkemt0aTZTQ3lldW1IbXFPNDA2eERpSU1WS3RIT3FNODZuRUh1QU1ac3IKK2NMeStleTZURUp2UjZTNE44UVJ6bmc4SkpEWkRUSlhRTjZxODRhRXVkc25PcncyS3lPVndQcEk2ZXk0cUJzSFVnUThrQUZ5NWxzUWEKK1dWNDVoNmV4Z1V3YkJjS0xnUFpHRmorT2REMlJLSnNUYjgzL1VxYkpTNVEvbEdYaHpCbG5hWXVjeUp4RXByUnhibnRtY25PRVBGSmUKKyt0UkRVd09UZDdxbEpsamRoSUpMK3VEY29vTDlBaGdvNkN3ZXA2dGR1ZWt2MmNTRW9oSmVURThEdnkzNFlSaE1iTHZuRk5kbW5wTnkKK3JOWkRZVlZ4eGFLb3lkMkFmQjhOUEZaaDFWZEFZZkkzUjFRQVEya1hFZWY1Tk5JZlZRZk16RDlha0puNFJQK0t2MzJRYXhtNEZybksKK3htd1J5R0pTaGF2SUJjMmF4K0YxcjErTlpYdVNCSG41dmZvUlR4T2swU1Q0ZFhzdzc0ZG5sWVVNUmFTdTRxcVVkTTlqc1hTeWVYNFoKK2dRZ2tSMmJrYVlPNmV6RmdlbkZJYTdRV1Z3OHJYWkFFWjVhaWJDeGJuWTFWRTQxUFlJdmhsTGRiRkpoSDlnWTIycytmRkF1d256eUEKK1NSakM0MEE5YUFFSXRSbGFQU3RXU0dpcWxMUmdOa0JCd2RwdjJsMllQQmQyUXpIeDZlazZYR3J2Ukp1QUMrTmg2MnJ0UUt3cE5INTQKK1lBT0hXNTVtYUJGVzJTUTNURitjWjZOYmJxaENtSFR5eVI3bWNTWWM5c1hTVkRXRWhZS1ExaXlVODcwemhIV1ZwdmdsWml6WmV0SkMKK1pGallleDNiMW5nVmRjZ2FyZ092cFBxOXVyQ0tLaTJtYmtxdi9FRnB6U1dHWGtLU3BmQ0cvWGZNbkVPdGtOckI4UzA2dm5rMkpjSkIKK09CcUpvdCt1dVNINWhPZzB2VHB4WDJEdU9OSlNpV1NXeWZSRS9sVGZKSkZYd2hvZDdTWGNsVXlYUGVTeWliY1NpYzJoVkF6RG13akQKKzMxanMvajJrMDJQSS9hZ1BocjNVUThjTWdjTkFpYW9DS2JOYVdmbjZCR2JDQWJUY2h4elVsbzJjU0ppTGxyWDJJRFptZlhiWG1aQ28KK20xc21XSUcrQklJRUFMaXVBeERiNmRXTEFZeVZCb045aFlJNEFpUGVaQVk5TXR2UTZBVjhvMi9FRm02UHZZR1h5M0hlaTU4MzBDSDAKK1BCZVg3S2RkNmZmMXkzM1RXL2w1cVNrSUwxVUxUR1I3b2tGZkplUEhEbXExZEZ0Ni9KT01wdGlROFdTdTdDc0pRdlo5VlRGWGVZRmMKK1pxQ1BQWmMxTnJQZWdOSzcwWmY5UXhXSWJEQWV2SjVLTEJmMWM2ajhwVTIvNkxudkRZNlZqYVR2WVNncjd2VFI4ZVZ6SDRSbTc3VzAKK2lPSHhnNVZjT0R2NmNHU1Z5dXZiWDhVQUdvOENtYjU4RVJEdEJESkJRWFZwV0tMTkF1REo5R1g4bjJ6TmtwalpMYlBTa2NtdWhxR2EKK0JKQkUvQmFDVGtVUVdsWTlkSWJSdEVueElVMW1mYlBQZHgxUHBhOERxR0RqU09zUWRLY0tZTk5adGF5RXcrK0VJcG1wZEJOc0twaEMKK2ZCOFVFSzJXa2s0WlZXK3F5R29pL3IwTUZzdk8xTm1TT09aMG8vankvWUhtb2VVUkhoUHk5N0FPM2VWVGtFQWE1Q2ZKRUp5Ym1vNTYKKzdDRHcvRndvR0FVQ2dzb3o3cmx4ek11ZHIvSWhISUgrQVBpbm5jeFhsSE8yZWN2SEQ5aThEYUhHQTh0VmlmZ3NVaHFRb1ppZVVMdXQKK2VGOTRPNVVBeE9rdjQxVVpzc1lUd040bllyTjFRa2VzWmwzQlg0T1JTNEVFMzAvUFEyM0FSZjNXWnB0WnJDSmV2R20yWll6R2VoOHgKK2cxN21DRGZpTE8rYmZmNHFQLzRtQzk2UHU0aWE2ajR0bzVCd0tJSlMvK0RDdW9EOFdlU0tGNHB1Z1hRa01VaUhkUW5OblZQOVNwMk8KKy80bHk1bU84SnpyUUM1OVYyYm5UTkJxUGhwbm84a2ZKdks1VHlwUFNWQytiVHplcm4zcko2VWNlQjNzcmNuOXp4S3g5R2ROeWRKUWoKK3lXanY4ZWMzbjNkMW51UXdoejVRMDUzTkJoSWp3b0dnM0dvN0xPNmk3OFpPbHBGN2Rjb0FPMTNOZkhMeU5qbnlIQ2FpV3RWUlRjdDkKK3JMZjV2TjAwdXJTbjhZSm5nSGsxZVRLSzhuSEdJY09nNllkWURPRDJuRTVYd1JpakttaWVHOFhhM2VLUnpmYkwwNkdyQlFFTmxlNkoKK21DMTMxYnAzY1JWeHBqcStvNlJBYkdvTW00eUlDc0w0ZVRhckNRcnN5SG1vUEhxcjkxVUhvOTFhdnl4VTdrbldtRWhYMjd5Ym1zcnMKKzhhZVp3UEhpeEwxNFRleWhydUNxUlZ2a2YxS3M3UCt6OE1QVWJvR05xUWUyV0xOOGt0Q0dFcjE1TzhNSlIvZW04NkcwM0pmbzRvYXcKKy9EVlVINVJ3TFQ2YWNlZE9HdXpNaC8ycjhCY21lbWhWUTgvY1d2VjRZSjB0T1c0aHp5VkhDNWhRZjhzWjNMenhYTEg2T2hucmJwcmgKK3h2cmRiYVNkQ2hXWkREUDBiQ0NieEVoa3d1QmtCZUtack1id1JUUCtUUFRQWUxWVEgvQ21LTHpLaC8xMTR0a0dreU8zaEhTNHFFeFUKK1YzOUYyU2o0bXlseCtoRDArMjBEOXBudHBOaTdodGNjR2xPbTZ5Tk02OWF0LzMra0xnSkp5b0lsYXhMY0NVWUhOTWlmRHQrVDNwL3QKKzVVNFhtRDUzdVVRNk04ZHZqL3VkcVBla05TVWZzZTE1eXJkOXBqT3Q1UGNKdXFXMjhxMHNGSGY5cEhJZ3ozWFpGTWU1UEQ3cHB3NnIKK1MrQzZJcjRQcllJRWdnUUE3WkRWdGlDbStCYnROTkIvVUptNzkvT1E1bXA1YlRJMGtQbURleWNhV1RhME9qcHVtK2MvZHBHL2lKT0IKK0RJQ2o3akhPWFNIVDdKbEd5WDZhU0ZKVWx0dWNBblp2d3poUERtZERhSURpS1NrODVHcWdkRFdWZkdvc1NDWDlQaC9UM1dwSXhud2YKK1dTRFJ0SUhrV1RqbHkrcGU0eXk1SzYvWElTeS9MNVpoL2ZoaUk1ZmpIamd6bWxpYnMycnU0blZ3NmhCaFV2bFNTZTJCRXM1ZDloL3kKK05IOFd5M3F2YjJEM2poN2hrZXBGdFpKR05USHA4WlVDN05zMkpJcFFZT2JzYXhkSTY1aTNtTU91N2ZSd0krMC80ZWpzV2hQNktDRWkKK0xnd3ZMZzBxTTgybWE2WUI3cUhBSGJvYWN6UlZFZmZEY0pVRzRhNXV5Y0IwRG9aRm4rdUVhRUZ5aWxpMjBoQ240aFZmc3FVUWsyUFQKKzhNbzF0U2w1ZTMweEkxWUpaclJnaUptOW5IUlg2Zkxpem5nUCtJTEpMUEhac1B2bFNWSWZZKy92L0ZSOGZlS09qYUdoeUdGNTFCQXgKK2FNMk5JUTRqTVA1L1grVTVnUXliaTBFNnU3cnJvRGhhSHNLbUNNZ1hxc3p3WFdDcGVkQS9zRWJlSHBpVEM1OVlsUFBTbElPTWM5dlAKK0tvL21RQ2ZXeS85aWNVYUlmS1FsZHZrbGxVeHhOa3F1NkFiSXBIVnNjYkFFelNQczV4YlFYVThFWk5OQ0Rpc0ZubnBZM25RM2VMbmwKK204OXNhVEp4UmI3TldIUk1sbVB2N3FnRDd1TUlxM3ZkT0dBN2k1d1Q5TWVvTklnSzEvRHNnSDMwczZSV2pKeTRZeXlMbVJUWFB6YmoKK2hiUVZwRW1pTVJiRWlkSXZVeDJPaktWeFZRSWNndExzYTJsdkhRNFhMMWNwTHI1R1Z0T2d5MGZNZzVPQ0RVVURzdmpnamdMUTNQMlUKK3AyblZZNUZNNi9RcFBjNURUTHV1Ujlla0kyL2M5Qml6MDlSdGNZRFVRSzJhamRvOGgxSXlLcUhGb0I3aDQ4T1h4WEtLWTk0RFkwVEcKK3g2UG9uQi9lcGo4b3JBdzRRS21tNU0wdlhZd0JPcVJ5bUNUSFRxT0pHT2JkTHgxZXVGRnlxZ3V6SEpPVTJnQUdaSTB6OUxnMXlSdUYKK3loZFBaeXVuaUljbXRMTnhSWjFkdVlIRXJjQXlYNTZxbmRtTFh0N1VWa0FUYWkvcklNdW9KTGZBc1VuVnVUVVM1cDd0Sk03NTRVWlQKKzdsVGNYdkRKZ09VTm5CUmFJY3hDM3B4dmJyWURKMmlGSjcyeGt4VVAycDc0Z3VjcWcyNVhuQ1ZtUXVMZzZ6RER4RjZDTHV3OWlzeHkKK1hnNHBrbmVNTi8vN2ZwcDhHWWw5bnlabTJ5cVlZTStqY3cwZmNWYzY0TCtYNHcvZ0wzSDJVTUdneElIU0pwN0hJRzdWS0h0WHJOeWoKK2RQWFhQVlVzTXNBQWltcU9yMExyMnNaV2lyZnVpdkxhUFRxaGJrdkc1UEY3SzNnVDgwQU9JY2QvNkVJSEJ5MmhaN3VrZmpIbWRQNEwKK3lRT2hUUWtsYUt6R0hJMG15cHEwdUZMV0pPVWxablZyTWlMUDF4cldrcEM4Um85ZW82bWZqalE0NXo4YWRDNDNhNDdrbHdURXp2b2QKKzNyTkVGSUdKSlVFakFOM21icWllN0l4b1NKa25CQkpLMEQ5bFpFUThsWldscTd2dU44SmRxUE02eGgxNTVqTVZzUHdqTEs2VHprajUKK0JwUkQ5VGdtM3U2SFBRU0NCQURna1dFTjc1TXU5VEdvc1hZMHhtMWs2SzZzUHY4TDk0OUNyTFdvNHIxSTJMQTA3MmJUR3ZRUDI4VnMKK2hVQTc2amdjVDFvY0MrKzlQb2t0SUsxMFlDcTV3K0ZmTUFRMDRLZUNYdUFkbWlZMmlBVDRTbGVhNjFQTUNNdGEzbVZHeUxVWkNMRW0KK1ArSTBVS1I1bWxPMGZHRWNqVTlqOFRtYmpacXhORnFsb0xzVTdvU2k3T3MwRXRZSGtkQVZyRXhVeU9jL1pEaWU2ZkJqZExUbUxkQ20KK2JFOUpOd2psYlh5cGRUWnVwR2dMTmhLR0RJc2tVQUFNd1pZYXlJNllmU0lNa05DZUFZVG5qT3VHWloxbXNDWEdYc2ZNQlIxc2ZVSWoKKzlVZUdqd0Q4Z3ErVVZWSFgvb2VvSC9tMGVKNXBwcWkzK25VbGdjOUR2cFlzQy9GZzBHMkt1WWI5QitWSithNEdNelFTUFJFb0Z0UXAKK0I5ZHRMa0JiN0hhL2hwR1dUSWRxelcwZUFvNWxseU44Rk52bDJGdTJJY0xhTm1XRk82OWdMalJLUW9wcDBkdkZPdXdBVkk2ZnZHRGoKK3AxV2lnb05iRlpsOE4raWlXbXpLT2pvRzJaTGJlejFjbFpDbXMvSlBKclhoRU1NT3hXcFZ6a1F5TjMzNlZXSG1HZ01jamFLQ0dTZUEKKzJubkVTSUd1aUNYTXJrSGxHZmFiWUlzS2NIRkNvMnQxM3VYeVpQZjB6U1BUa3VEMEVoOTJ3cUM5cHZBM2d2cnJDVWZvOU1uM2JzK2UKK0tXS21EbHBjczhtRG4wMzJvSWcrenJRaElkdU1xWFZuM2V2emVWTTNCNU1CT0dNdmc1MS9TWGc3UitNQy80NjNqdVFRRWI5SVZlL0kKK1lHbk8vL29XbTlsdy8zNzdBZi9xSCtGbk4wMm9iSncxRnZlc1FJczllNVJITlF5a0tiTyt2bVZKUWwxbmQ5RFpXckhETk83LzgwWXoKKzJoQ203VHdzNW5TUk4yaUZseVJhWUpIcjd5cHhrVTJyQ2FrMnI2dWE3WER3dTFxVTJSVDMrcVBqVDFSdXhRMm9UbEh5R2tLUE1aR0MKK1JjK0NTV3o1YWVlQ21IWlZ3ZGIzbkM4WXBmc3VqTWlZcXlnTGV1UTgycGpLdVI3RElLR21uZmNPTGR2NUYrRWsyV3l5MEQ5OGlTZ2sKKythb1FHWUxoTDlsbFUxM3BuMjF1UnNEWTV1R2NYaUl3MUlFVEZsVGRnRU5FdjhmdXRadUpzZWdycDdmbUZYeU5vTnlGTnl5cGVEck0KKzZacVI0dkt4RmpnM3RLS2VWcGt3L1c0RUFrbHpNeG1OaWF6R05EQkhzbllWM3J3UGxLYStIZWVFMll4bnNLd0dMQ05nUllVWFRhSmsKKzQ2MXZTMTYwejNkdmgvbUxmZFo3TVlDa21PM2JORTNFTFVEQXc3WVFrU3VvOXVqemRGS3RlOUxDMzRzamc5Zk9leDNUaEFnNVk1MG4KK3dZbTR6Qm1HTTd5RXFMOE82UWduTTZ0SURGUzlYcnlEYUxOemNHaE1XcU12aHpPNnNDL0FBMldmTGd3UzUxN0NwMDNJa0pRV3FHOXEKK3c1MitFK0dBdHBpb0pmY3pFaGx2OUJyaGp0dGR1Z1JTakpyRzhTWVZZRTR6RzNBdXI1ZU5Cb0dhQUxJT0hPdFB3OCtKb3ZRbUlXY0YKK29hSi9XUXVnbEZyV3RldzUxSUs2RjhSaUhBT0JWYXZaT3VaY083dFYrNWVuVmZyZU9kMHJYOFpPeTRoWW1IaG1GMWhPcnJXT24rRWUKK0UwU1lLb25YTjAxQk05eE1CSUlCU0xDdk5BcHBuR1BUVUdqd2JNSlJnMVZKMktNaUJXSDVvSnA4dHlmSUF4TXVXRmR0YUxZYlJTT0QKK1hiT0FzaFBWSzhKQVk4RFFEa3pxYUNUQWtMVGZTUkF0OXlZNlNiVXBNc1J2N3hhOG5NWk5KQkp6SlQ5Yi93TmpnaU9KZ2FHdUpNa1YKKzJnL0RYMmpmUDNQck1NL1Nibno3ZWRPUlhIajFQYTVYVFQ4bkc1TVMwRnVaZ3ZldmRxM28vZ1ZWQXorWkNLT0gzU2hNelp2ZnAwMWwKK1NYNWdhSlRmbG1VNmNkTnd0bjJ5WjZJU2NGN09yalVlQTlpRW9TVlI5ZFFjQSs0bEIzUkFHM0xNd2NueFhZMzVENytQTUp6SElaZEYKK2NTbnErbjAzQUNZMi9FL1QzMWlpalJIMjlydllIR0krbVAvaWVZczQ1aXE0ZlRXbzZpMUhvZmVXTGRQMGZYN3hXM1hPMC9oV1lGaXcKK0J4S3U2NndoQWJSaGFpYjNYSk52ZXRWczI1VG9ZWHlpRHBqRytjZDVyQ01laThzR1F3VEJqOVplaDBVUm9lTVcxaW5UUDBKdkNtTVUKK3JaZ0FBQUFBQUFBQUFBQUEKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvbXNpZS1lbmMtMDIucGVtIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvbXNpZS1lbmMtMDIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OWM1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLWVuYy0wMi5wZW0KQEAgLTAsMCArMSwxMDYgQEAKKy0tLS0tQkVHSU4gUEtDUzctLS0tLQorTUlBR0NTcUdTSWIzRFFFSEE2Q0FNSUlUUUFJQkFER0NBY0l3Z2N3Q0FRQXdkakJpTVJFd0R3WURWUVFIRXdoSgorYm5SbGNtNWxkREVYTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhOREF5QmdOVkJBc1RLMVpsY21sVAorYVdkdUlFTnNZWE56SURFZ1EwRWdMU0JKYm1ScGRtbGtkV0ZzSUZOMVluTmpjbWxpWlhJQ0VHQkFtSUxlcDlzSgordU4yUGtnMWd1Y293RFFZSktvWklodmNOQVFFQkJRQUVRQUt2aTJlUkxPK2pkb2lVZDhrc1p0K2lRMEpYb1dOMAorTS9XOUNFdjZSMWM0MnB3VUlSLzFGNFJNSzlvZXlVaXY5WjZsem1QYUdObXg2WE9Db3Vlc3pWa3dnZkFDQVFBdworZ1prd2daSXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSAorRXdoQ2NtbHpZbUZ1WlRFYU1CZ0dBMVVFQ2hNUlEzSjVjSFJ6YjJaMElGQjBlU0JNZEdReElqQWdCZ05WQkFzVAorR1VSRlRVOU9VMVJTUVZSSlQwNGdRVTVFSUZSRlUxUkpUa2N4R3pBWkJnTlZCQU1URWtSRlRVOGdXa1ZTVHlCVworUVV4VlJTQkRRUUlDQkc0d0RRWUpLb1pJaHZjTkFRRUJCUUFFUUZxY0hFbzY5U2hHZmNPSVZqbm1XWExaTSs3WQorSy81MGo4WXV2TmJxcStkUXhrOVlZOFpwU1UvSllzeG10Y25FWmRsU0pFa3BNSEFPNzNWK2VoMVFRcjB3Z2hGegorQmdrcWhraUc5dzBCQndFd0dnWUlLb1pJaHZjTkF3SXdEZ0lDQUtBRUNKc1NtUkExanhMamdJSVJTSUdMVnRmKworcHplQjZvWEo5R2xmc25JaWorRGdJT3ZyWWFYQzlxeXdBYVVnN3pNbmxuOVFNZ2lpaDVYcEJMZ1BnNVkvS1lwMworUlplSEJ3a2pUSUZ3bE5ZU2pFMFBic3N6c0pZVW1rRFRzQ2pGVUpFZE00K0NidjNnM0tjdDV3MVE2cFZNWEpMZworSkc0dUZVWThDVFNjVmtiOUVUYkl5M0hpc0NSS0pXQTU3RVJMdkNyL0ZhNmdOSkthNU13MUE1TnNwK1FRcXAwVQordVF6OTNyYUFQYkNkcW1IdThxUTg4cnpiQjFrL3lzWGVkUlFMbHpocUZzMmhyeUQ3a0hlMGdYOG5QZGxrcmU4WQordFRRaFk3Nkx0YmpuVjJkclhjeUNVTU9OYzU2S1EyVmN1eEIwQldqU2V5TjhhNzUvcnB0NndtaU0vUEt3MEQ0ZworUm1YcUExWlI2MlgyV0tiaEtxdkc1dFFURjFMYXVaZWRkZVlTNFJiOGNMdDJWTUI1aXJrS1dySG1KM3F5V0VMWQorTGFoNkF6RERkY2YzTEVmRG82ck85ZGpxbFU4Ukp3UzBFeEF1Qm9vVkJQNmJaSkcxdE5VVWJ0eEJ5ZFE0UEpVSAorVWh1bEJNWFVNZDU0NWZWYjhkK2xabktieDNPUzJMcElMSjY2WWVhbzdqVHJFT0lneFVxMGM2b3p6cWNRZTRBeAorbXl0d3ZMNTdMcE1RbTlIcExnM3hCSE9lRHdra05rTk1sZEEzcXJ6aG9TNTJ5YzZ2RFlySTVYQStranA3TGlvRword2RTQkR5UUFYTG1XeEJwWlhqbUhwN0dCVEJzRndvdUE5a1lXUDQ1MFBaRW9teE52emY5U3BzbExsRCtVWmVITQorR1dkcGk1ekluRVNtdEhGdWUyWnljNFE4VWw3NjFFTlRBNU4zdXFVbVdOMkVna3Y2NE55aWd2MENHQ2pvTEI2bgorcTEyNTZTL1p4SVNpRWw1TVR3Ty9MZmhoR0V4c3UrY1UxMmFlazNLczFrTmhWWEhGb3FqSjNZQjhIdzA4Vm1IVgorVjBCaDhqZEhWQUJEYVJjUjUvazAwaDlWQjh6TVAxcVFtZmhFLzRxL2ZaQnJHYmdXdWNyR2JCSElZbEtGcThnRgorelpySDRYV3ZYNDFsZTVJRWVmbTkraEZQRTZUUkpQaDFlekR2aDJlVmhReEZwSzdpcXBSMHoyT3hkTEo1ZmhtQgorQ0NSSFp1UnBnN3A3TVdCNmNVaHJ0QlpYRHl0ZGtBUm5scUpzTEZ1ZGpWVVRqVTlnaStHVXQxc1VtRWYyQmpiYQorejU4VUM3Q2ZQSUJKR01MalFEMW9BUWkxR1ZvOUsxWklhS3FVdEdBMlFFSEIybS9hWFpnOEYzWkRNZkhwNlRwYworYXU5RW00QUw0MkhyYXUxQXJDazBmbmhnQTRkYm5tWm9FVmJaSkRkTVg1eG5vMXR1cUVLWWRQTEpIdVp4Smh6MgoreGRKVU5ZU0ZncERXTEpUenZUT0VkWldtK0NWbUxObDYwa0prV05oN0hkdldlQlYxeUJxdUE2K2srcjI2c0lvcQorTGFadVNxLzhRV25OSllaZVFwS2w4SWI5ZDh5Y1E2MlEyc0h4TFRxK2VUWWx3a0U0R29taTM2NjVJZm1FNkRTOQorT25GZllPNDQwbEtKWkpiSjlFVCtWTjhra1ZmQ0doM3RKZHlWVEpjOTVMS0p0eEtKemFGVURNT2JDTVBmV096KworUGFUVFk4ajlxQStHdmRSRHh3eUJ3MENKcWdJcHMxcForZm9FWnNJQnROeUhITlNXalp4SW1JdVd0ZllnTm1aOQorZHRlWmtLaWJXeVpZZ2I2NHJnTVEyK25WaXdHTWxRYURmWVdDT0FJajNtUUdQVExiME9nRmZLTnZ4Qlp1ajcyQgorbDh0eDNvdWZOOUFoOUR3WGwreW5YZW4zOWN0OTAxdjVlYWtwQ0M5VkMweGtlNkpCWHlYanh3NXF0WFJiZXZ5VAoraktiWWtQRmtydXdyQ1VMMmZWVXhWM21CWEdhZ2p6MlhOVGF6M29EU3U5R1gvVU1WaUd3d0hyeWVTaXdYOVhPbworL0tWTnYraTU3dzJPbFkyazcyRW9LKzcwMGZIbGN4K0VadSsxdElqaDhZT1ZYRGc3K25Ca2xjcnIyMS9GQUJxUAorQXBtK2ZCRVE3UVF5UVVGMWFWaWl6UUxneWZSbC9KOXN6WktZMlMyejBwSEpyb2FobWdTUVJQd1dnazVGRUZwVworUFhTRzBiUko4U0ZOWm4yenozY2RUNld2QTZoZzQwanJFSFNuQ21EVFdiV3NoTVB2aENLWnFYUVRiQ3FZUW53ZgorRkJDdGxwSk9HVlZ2cXNocUl2NjlEQmJMenRUWmtqam1kS1A0OHYyQjVxSGxFUjRUOHZld0R0M2xVNUJBR3VRbgoreVJDY201cU9ldXdnOFB4Y0tCZ0ZBb0xLTSs2NWNjekxuYS95SVJ5Qi9nRDRwNTNNVjVSenRubkx4dy9ZdkEyaAoreGdQTFZZbjRMRklha0tHWW5sQzdyWGhmZUR1VkFNVHBMK05WR2JMR0U4RGVKMkt6ZFVKSHJHWmR3VitEa1V1QgorQk45UHowTnR3RVg5MW1hYldhd2lYcnhwdG1XTXhub2ZNWU5lNWdnMzRpenZtMzMrS2ovK0pndmVqN3VJbXVvKworTGFPUWNDaUNVdi9nd3JxQS9GbmtpaGVLYm9GMEpERkloM1VKeloxVC9VcWRqditKY3VaanZDYzYwQXVmVmRtNQorMHpRYWo0YVo2UEpIeWJ5dVU4cVQwbFF2bTA4M3E1OTZ5ZWxISGdkN0szSi9jOFNzZlJuVGNuU1VJOGxvNy9IbgorTjU5M2RaN2tNSWMrVU5PZHpRWVNJOEtCb054cU95enVvdS9HVHBhUmUzWEtBRHRkelh4eThqWTU4aHdtb2xyVgorVVUzTGZheTMrYnpkTkxxMHAvR0NaNEI1TlhreWl2Snh4aUhEb09tSFdBemc5cHhPVjhFWW95cG9uaHZGMnQzaQora2MzMnk5T2hxd1VCRFpYdWlaZ3RkOVc2ZDNFVmNhWTZ2cU9rUUd4cURKdU1pQXJDK0hrMnF3a0s3TWg1cUR4NgorcS9kVkI2UGRXcjhzVk81SjFwaElWOXU4bTVySzdQR25tY0R4NHNTOWVFM3NvYTdncWtWYjVIOVNyT3ovcy9ERAorMUc2Qmpha0h0bGl6ZkpMUWhoSzllVHZEQ1VmM3B2T2h0TnlYNk9LR3NQdzFWQitVY0MwK21uSG5UaHJzeklmOQorcS9BWEpucG9WVVBQM0ZyMWVHQ2RMVGx1SWM4bFJ3dVlVSC9MR2R5ODhWeXgram9aNjI2YTRjYjYzVzJrblFvVgorbVF3ejlHd2dtOFJJWk1MZ1pBWGltYXpHOEVVei9rejB6MkMxVXgvd3BpaTh5b2Y5ZGVMWkJwTWp0NFIwdUtoTQorVkZkL1Jka28rSnNwY2ZvUTlQdHRBL2FaN2FUWXU0YlhIQnBUcHVzalRPdldyZjkvcEM0Q1NjcUNKV3NTM0FsRworQnpUSW53N2ZrOTZmN2VWT0Y1ZytkN2xFT2pQSGI0LzduYWozcERVbEg3SHRlY3EzZmFZenJlVDNDYnFsdHZLdAorTEJSMy9hUnlJTTkxMlJUSHVUdys2YWNPcTB2Z3VpSytENjJDN1pEVnRpQ20rQmJ0Tk5CL1VKbTc5L09RNW1wNQorYlRJMGtQbURleWNhV1RhME9qcHVtK2MvZHBHL2lKT0JESUNqN2pIT1hTSFQ3SmxHeVg2YVNGSlVsdHVjQW5adgord3poUERtZERhSURpS1NrODVHcWdkRFdWZkdvc1NDWDlQaC9UM1dwSXhud2ZXU0RSdElIa1dUamx5K3BlNHl5NQorSzYvWElTeS9MNVpoL2ZoaUk1ZmpIamd6bWxpYnMycnU0blZ3NmhCaFV2bFNTZTJCRXM1ZDloL3lOSDhXeTNxdgorYjJEM2poN2hrZXBGdFpKR05USHA4WlVDN05zMkpJcFFZT2JzYXhkSTY1aTNtTU91N2ZSd0krMC80ZWpzV2hQNgorS0NFaUxnd3ZMZzBxTTgybWE2WUI3cUhBSGJvYWN6UlZFZmZEY0pVRzRhNXV5Y0IwRG9aRm4rdUVhRUZ5aWxpMgorMGhDbjRoVmZzcVVRazJQVDhNbzF0U2w1ZTMweEkxWUpaclJnaUptOW5IUlg2Zkxpem5nUCtJTEpMUEhac1B2bAorU1ZJZlkrL3YvRlI4ZmVLT2phR2h5R0Y1MUJBeGFNMk5JUTRqTVA1L1grVTVnUXliaTBFNnU3cnJvRGhhSHNLbQorQ01nWHFzendYV0NwZWRBL3NFYmVIcGlUQzU5WWxQUFNsSU9NYzl2UEtvL21RQ2ZXeS85aWNVYUlmS1FsZHZrbAorbFV4eE5rcXU2QWJJcEhWc2NiQUV6U1BzNXhiUVhVOEVaTk5DRGlzRm5ucFkzblEzZUxubG04OXNhVEp4UmI3TgorV0hSTWxtUHY3cWdEN3VNSXEzdmRPR0E3aTV3VDlNZW9OSWdLMS9Ec2dIMzBzNlJXakp5NFl5eUxtUlRYUHpiagoraGJRVnBFbWlNUmJFaWRJdlV4Mk9qS1Z4VlFJY2d0THNhMmx2SFE0WEwxY3BMcjVHVnRPZ3kwZk1nNU9DRFVVRAorc3ZqZ2pnTFEzUDJVcDJuVlk1Rk02L1FwUGM1RFRMdXVSOWVrSTIvYzlCaXowOVJ0Y1lEVVFLMmFqZG84aDFJeQorS3FIRm9CN2g0OE9YeFhLS1k5NERZMFRHeDZQb25CL2VwajhvckF3NFFLbW01TTB2WFl3Qk9xUnltQ1RIVHFPSgorR09iZEx4MWV1RkZ5cWd1ekhKT1UyZ0FHWkkwejlMZzF5UnVGeWhkUFp5dW5pSWNtdExOeFJaMWR1WUhFcmNBeQorWDU2cW5kbUxYdDdVVmtBVGFpL3JJTXVvSkxmQXNVblZ1VFVTNXA3dEpNNzU0VVpUN2xUY1h2REpnT1VObkJSYQorSWN4QzNweHZicllESjJpRko3MnhreFVQMnA3NGd1Y3FnMjVYbkNWbVF1TGc2ekREeEY2Q0x1dzlpc3h5WGc0cAora25lTU4vLzdmcHA4R1lsOW55Wm0yeXFZWU0ramN3MGZjVmM2NEwrWDR3L2dMM0gyVU1HZ3hJSFNKcDdISUc3VgorS0h0WHJOeWpkUFhYUFZVc01zQUFpbXFPcjBMcjJzWldpcmZ1aXZMYVBUcWhia3ZHNVBGN0szZ1Q4MEFPSWNkLworNkVJSEJ5MmhaN3VrZmpIbWRQNEx5UU9oVFFrbGFLekdISTBteXBxMHVGTFdKT1VsWm5Wck1pTFAxeHJXa3BDOAorUm85ZW82bWZqalE0NXo4YWRDNDNhNDdrbHdURXp2b2Qzck5FRklHSkpVRWpBTjNtYnFpZTdJeG9TSmtuQkJKSworMEQ5bFpFUThsWldscTd2dU44SmRxUE02eGgxNTVqTVZzUHdqTEs2VHprajVCcFJEOVRnbTN1NkhQZUNSWVEzdgora3k3MU1haXhkalRHYldUb3Jxdysvd3YzajBLc3Rhaml2VWpZc0RUdlp0TWE5QS9ieFd5RlFEdnFPQnhQV2h3TAorNzcwK2lTMGdyWFJnS3JuRDRWOHdCRFRncDRKZTRCMmFKamFJQlBoS1Y1cnJVOHdJeTFyZVpVYkl0UmtJc1NZLworNGpSUXBIbWFVN1I4WVJ5TlQyUHhPWnVObXJFMFdxV2d1eFR1aEtMczZ6UVMxZ2VSMEJXc1RGVEk1ejlrT0o3cAorOEdOMHRPWXQwS1pzVDBrM0NPVnRmS2wxTm02a2FBczJFb1lNaXlSUUFBekJsaHJJanBoOUlneVEwSjRCaE9lTQorNjRabG5XYXdKY1pleDh3RkhXeDlRaVAxUjRhUEFQeUNyNVJWVWRmK2g2Z2YrYlI0bm1tbXFMZjZkU1dCejBPKworbGl3TDhXRFFiWXE1aHYwSDVVbjVyZ1l6TkJJOUVTZ1cxQ2tIMTIwdVFGdnNkcitHa1paTWgyck5iUjRDam1XWAorSTN3VTIrWFlXN1lod3RvMlpZVTdyMkF1TkVwQ2ltblIyOFU2N0FCVWpwKzhZT09uVmFLQ2cxc1ZtWHczNktKYQorYk1vNk9nYlprdHQ3UFZ5VmtLYXo4azhtdGVFUXd3N0ZhbFhPUkRJM2ZmcFZZZVlhQXh5Tm9vSVpKNERhZWNSSQorZ2E2SUpjeXVRZVVaOXB0Z2l3cHdjVUtqYTNYZTVmSms5L1ROSTlPUzRQUVNIM2JDb0wybThEZUMrdXNKUitqMAoreWZkdXo1NHBZcVlPV2x5enlZT2ZUZmFnaUQ3T3RDRWgyNHlwZFdmZDYvTjVVemNIa3dFNFl5K0RuWDlKZUR0SAorNHdML2pyZU81QkFSdjBoVjc4aGdhYzcvK2hhYjJYRC9mdnNCLytvZjRXYzNUYWhzbkRVVzk2eEFpejE3bEVjMQorREtRcHM3NitaVWxDWFdkMzBObGFzY00wN3YvelJqUGFFS2J0UEN6bWRKRTNhSVdYSkZwZ2tldnZLbkdSVGFzSgorcVRhdnE1cnRjUEM3V3BUWkZQZjZvK05QVkc3RkRhaE9VZklhUW84eGtZSkZ6NEpKYlBscDU0S1lkbFhCMXZlYworTHhpbCt5Nk15SmlyS0F0NjVEemFtTXE1SHNNZ29hYWQ5dzR0Mi9rWDRTVFpiTExRUDN5SktDVDVxaEFaZ3VFdgorMldWVFhlbWZiVzVHd05qbTRaeGVJakRVZ1JNV1ZOMkFRMFMveCs2MW00bXg2Q3VudCtZVmZJMmczSVUzTEtsNAorT3N6cG1wSGk4ckVXT0RlMG9wNVdtVEQ5YmdRQ1NYTXpHWTJKck1ZME1FZXlkaFhldkErVXByNGQ1NFRaakdldworckFZc0kyQkZoUmROb21UanJXOUxYclRQZDIrSCtZdDkxbnN4Z0tTWTdkczBUY1F0UU1ERHRoQ1JLNmoyNlBOMAorVXExNzBzTGZpeU9EMTg1N0hkT0VDRGxqblNmQmliak1HWVl6dklTb3Z3N3BDQ2N6cTBnTVZMMWV2SU5vczNOdworYUV4YW95K0hNN3F3TDhBRFpaOHVEQkxuWHNLblRjaVFsQmFvYjJyRG5iNFQ0WUMybUtnbDl6TVNHVy8wR3VHTworMjEyNkJGS01tc2J4SmhWZ1RqTWJjQzZ2bDQwR2dab0FzZzRjNjAvRHo0bWk5Q1loWndXaG9uOVpDNkNVV3RhMQorN0RuVWdyb1h4R0ljQTRGVnE5azY1bHc3dTFYN2w2ZFYrdDQ1M1N0ZnhrN0xpRmlZZUdZWFdFNnV0WTZmNFI0VAorUkpncWlkYzNUVUV6M0V5d3J6UUthWnhqMDFCbzhHekNVWU5WU2RpaklnVmgrYUNhZkxjbnlBTVRMbGhYYldpMgorRzBVamcxMnpnTElUMVN2Q1FHUEEwQTVNNm1na3dKQzAzMGtRTGZjbU9rbTFLVExFYis4V3ZKekdUU1FTY3lVLworVy84RFk0SWppWUdocmlUSkZkb1B3MTlvM3o5ejZ6RFAwbTU4KzNuVGtWeDQ5VDJ1VjAwL0p4dVRFdEJibVlMMworcjNhdDZQNEZWUU0vbVFpamg5MG9UTTJiMzZkTlpVbCtZR2lVMzVabE9uSFRjTFo5c21laUVuQmV6cTQxSGdQWQoraEtFbFVmWFVIQVB1SlFkMFFCdHl6TUhKOFYyTitRKy9qekNjeHlHWFJYRXA2dnA5TndBbU52eFAwOTlZb28wUgorOXZhNzJCeGlQcGovNG5tTE9PWXF1SDAxcU9vdFI2SDNsaTNUOUgxKzhWdDF6dFA0Vm1CWXNBY1NydXVzSVFHMAorWVdvbTkxeVRiM3JWYk51VTZHRjhvZzZZeHZuSGVhd2pIb3ZMQmtNRXdZL1dYb2RGRWFIakZ0WXAwejlDYndwagorRksyWUFBQUFBQT09CistLS0tLUVORCBQS0NTNy0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLXMtYS1lIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvbXNpZS1zLWEtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDY3Nzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvbXNpZS1zLWEtZQpAQCAtMCwwICsxLDkxIEBACisKK01JQUdDU3FHU0liM0RRRUhBNkNBTUlBQ0FRQXhnZ0hDTUlITUFnRUFNSFl3WWpFUk1BOEdBMVVFQnhNSVNXNTBaWEp1WlhReEZ6QVYKK0JnTlZCQW9URGxabGNtbFRhV2R1TENCSmJtTXVNVFF3TWdZRFZRUUxFeXRXWlhKcFUybG5iaUJEYkdGemN5QXhJRU5CSUMwZ1NXNWsKK2FYWnBaSFZoYkNCVGRXSnpZM0pwWW1WeUFoQmdRSmlDM3FmYkNiamRqNUlOWUxuS01BMEdDU3FHU0liM0RRRUJBUVVBQkVDanNjYVMKK0cwVTI5OWZxaUVBZ1RxVEZRQnA4QWk2enpqbDU1N2NWYjNrNno0UVo3Q2JxQmpTWEFqTGJoNWU3UzVIZC9GckZjRG54bDFLYTA2aGEKK1ZIR1BNSUh3QWdFQU1JR1pNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUtVWFZsWlc1emJHRnVaREVSTUE4R0ExVUUKK0J4TUlRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW1kQ0JRZEhrZ1RIUmtNU0l3SUFZRFZRUUxFeGxFUlUxUFRsTlUKK1VrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRREV4SkVSVTFQSUZwRlVrOGdWa0ZNVlVVZ1EwRUNBZ1J1TUEwR0NTcUcKK1NJYjNEUUVCQVFVQUJFQ3N5SFhaMXhhaXYwVVFSdk9tVllzYUYzOEFMMlhYNzV3eGJDc3o1L3dPZzdnM1JQNGFpY1p4YVI0c0JvZzAKK2YyRzFvOW9tL2h1K0EwcklZRi9MNC9HVU1JQUdDU3FHU0liM0RRRUhBVEFhQmdncWhraUc5dzBEQWpBT0FnSUFvQVFJc296UXJud2oKK2NjMmdnQVNDQkFBUXovTFBvSmUvK2lZV2VUd1NlYno2UTlVZUtaelEyVVdtN0dMdEVNM3MzYzlTQ3ZwbWt3SVJkRWhMaldhQkpNeUkKK0RpTDd0MUkxdk1mOWluQjhMWGdBY0lFWWtwTlNjalM4RVJBOUViYjdpZU5LU0JnN3c3QjhBVEhGeExTbERBRHFSZ29ackIxQ3RmZ2YKK3hpbXAzRWd4VGduaHR5UWhaeFhXN2tCUXlGUnd1bXBsckpYT3A3YWxiUDdJb3Rock9LbmN3MzBJSlQxZndQeFdOTUl0STlqdVhGMFUKK0NiV1ZTalB6R0JvNCtYTlhNdlVPNk1wbE9RRXoveXdFUTlFOE9aQVFleDFadzlxcTVwcHNYQjJwTXNZVjVzTEpHaWt1a01ZS3F1aXoKKzNZSyt0TjZKOGFoTGNEVXMrVkd3cXZaaTE3Z3BCVGxiRVArWm1YSnBuTzYzdDF5VEVCMFY1QVpjUktXVU9oemxDQk01WVVhZ3FOb1kKK2Nwc21Tdk9LNmJZemtVS09yeldwRENBdEdaL0R2dWw1ZFRaWm14czJXcE0raXllSFhNeE8zaHV5OEsxYnJQVHF0MWYxc0hodXExakQKKzFlWGVkYUNqSWdVVzlxVjE4dk5BUUNvZi9ZYjZULzFmeHp0Zi9qRDdwUExRSis3TEprS0NBRUhHY2FpenBvS3FoWWN0dGFFaExxMUcKK08rT2hxZjd5RmVnTWRUSjN3d1AzMjR3NVpZU1U1ZkxvMlozNC9FZGY2RUd2WHlUSXFWZkFtRUJBTGQ2SkdWZE41R2xZWVR4ckwrZU8KK1A4MFo0YW80WUtveHdFbVJwNWJtUXNROEIyOVFoT0ZLbUM2ZWlHNUI5NnFMTXRwN1ptdTFnckROeFRkNk9YU2hXVndZQVJEMC9CMVAKK1N5MFBBZms5R2I0ZkFrTzlmWkpEUVlaN3MwbU01aU9QRWVTUjc4MjBUb2xPYitLZlJhYkxBOWQ3MTRqc2MyakV5a0tscFA2NkJoNGoKK2FDc3lxSjB1VVFjRThTbnpyS0FxR3dnV2lDR1FwaVRhK0hCaVA2ZVJsUkdPS1FqNVkwNnZjTng2SWphNGNHZTYreUNOOEhWOHRDWTAKK29rWks5OE5RQ2w1dDc5Ui9aQjJjM052QkpIKy9nM3VsVTQ4aWtUM3RWbUR4RTNtT1pvZlp5R0ZFTTk5UCtZQ01TY0xEeFRsM2h6R3kKKzBZa0k4VTg1NVA3cU9BYmNGZmgyVDVuK0xTRUx3TGhia3ltRWZaVDkxN0dXVGZteXBCV012SngwV0hlRGhLd1FZUGR6YktnV0VUbmMKK3llS2FzYUNXK29MZGhCd3JkNldzMnI0TUE4Y3dpWVhETGJ3WW1DeEpBOFZGKys4a3ViRjJISk9qU3lNQlMrUVQyUFNWLzBEOVVXb2kKK1ZmazdSNE92V0JKVnZxN25WK2xYUzBPNWlnakV4eGxteDFPYUJmZzcrQ3IvTWJLNHpWTnJLU0puODJObktLdDZMQzZSYVRtdkZZYXkKKzBzREZ4UTdYbytUaDZ0RE5LbUtXSnQ2S2VnZmpjK3FUV0pUS2Iza0wrVUk4dlMwelRMeTErTS9yWjRla29zL0ppUzVyWUljQXN3dmcKKzU4a0JncC8wcmM2dXBCZVdqQmFLNU8wYUxBZUJRZkx1bG8xYXhXWDA0T1NWS21ZZW9BbHR5UjZVTzlNRTNhY3VyUXlnN1RhMjR5cU8KK3doaS9QcklhRWlPN2RzV3ZGdHpzc2hWekJMaWMwMk5sQWtQa01VemxpUFluWkhXUWdsREFWeEw1SzJxaHZLMU9GQ2tRcElnQnNCRE0KKzZLWVJML21rQklJRUFMSWw5MjdySWthTjM3L0JRSWN4TGNTYTA1WWZDMEhsM214V0VTdDFBMEQ0bEEzN0E5UzhFYlltRGZBWWxNYzAKKzNIaFpHZFpFdGF3ZnBKRnlESHpOWmNlTldCY2g2bnhlTlpDWTRZRmRzYnp1R1MwUktwd05BOVMvY3pPSjRwOXltQkN4dWhHZXBJM1UKK1BLYkM4Qzc0OVd3dzEvd01kQW90MW4rSzdNL1BCR1I4aFdtYUg1U1M3VTN5TXdBQjFmcTJORGp4NHVyK1VtK01jbFNkTjAxTURYekcKK0VPK2VBbzFwZEFZODQ3OTIzNGw4ZEIyWVZBaFoxWmxKNEttYnFNS0pyR0pYblFVRVlTNi9jVERSanNVb2Nzb1c3dUdnMWNpMkdpSGEKK3FqbGtmcEJmaWUzU2RoRlcvSzhod0FIMEhBTHM1Nm9GTjY2d1VrUC9BYUpBUGZJVU5oUjZScEhLelo5ekNDNDJvQjJtTmF3UVJNbkYKK0VUQmwxcy9Td014TEtScDdqQWZLczROWnhTWTZJOXovMmRUcHpTM3RzSE1qeFZEdXhrb2x2Uk5XQklMRU1lTDFDQnZpcDJIaG1vVXcKKy9TejVORGd5emsxYVFMVjZEUU5KMlJaTE1aRFJDdFN3WlNCdTZsaGhTZ1RKR2F6UDArTmJxWFhDNWFRVHJxckZJY1d5RFh6K0FEbGUKK2tzenpZTS9nU2FRVENBTFR3ZkREYVU5RWszeFZnVytYQnRFeHRKM1UrMEFOM2wwajg2clVJZEl2cDZlV2R4V1FxdjlMdHBvb3JLTUQKK0tmVWM1UFlWMDlaMUpnc1Q0WDUxWnpxKzc0bDVkejd1ZElNN1VOYmRUcG1SbTlQRGozVFViR0N2TlI5aHFPRUdUTGJrdmIxWlIyNGEKK2g2dUdSbDJ6bkIyNUlwREFHUmhOUmI5aXMvcE8ydHZId0hURE1PanJndlpHL3BOdlhnU1V4ejBwUmpValhJY3FCZTJYMmdjUWZlYWwKK3I4Z1k3Nm84M1dFR0w2T0RyeVY5dlRRVkh0NTIraXpncFlvQlphVmxwZ3FiWmw1NGMrT0UwWnhmOVJ3WHdEYmNZdTVLdTVFME1QTDAKK3FVamMweTIrWTZFNFA1YkFXYVpHTUdUK09Sa3lWVXpjYVdtTS8rWGxPN1BFUjV3cldsQ0lNWkNYMUwvbnZpb1kwcTBDS3FBTG43REoKK1FVK3FlbmJ3cmI2dXdTN3VOWlk2Vjg2czBhRFlwVTd5UnlxeEM1U2J1eU5KYjAyZ2R4VUNncElzY0ZhTVVqTVZSbWw0TTRCSWpYL2IKK1UrSGdIb1ZNVW04U25OOWdSY1QyaXpQcmdPR1ZjTVRKamZlbnpvQ0tvQ1BvOVJqZ0dNY3RnQjREdkthbUVyTlU3T3JpbElmdW9xekUKK1BOU2VQOVNQdy96a0RtTnZNZWJNNDk5V2U5Q1Zuc0hVV3FGMDAvWkpXb3VhNzcrMGYxYkxTL3RtY2kxSkJ2SWNNby80U0p2Z0grS0YKK28wZ2lqUDlncUFQZDVpQ09ucG5KbEhVcVJJeW00MlNteUtFRHV6ZFN3WEtqQVI2ajd1WGRhMzlKeU1KcjhnR3pFc3UwallSa0FtajEKK1lkaXF3S1hVY0xNa2NqMUFLZVUvUHhUVVZ3MFlLc3Yvcm93clBZd3czeFFVV3FOaXZyWEI3R0NIRTNCenNZTmRIc216aWFHSVhRYkEKKytFQkhka3VLck04QmNDK2Z4aEYvbC9LVXhuZ3NEMUU3NUljVXY4ekZERitzazRDQllIcWtzOVM0SllsY3VidWl6cXNJTGJkR3pJTU4KK1o3dzM0azBYVCtzRWdnUUF5enI4TUhlSUpHc1QrQVluWnIwOFBlVGJ5cjAxSkVvVDdsUFlUNlB6WDRGNjNRS0tEbCttQitQd0xNelkKK0NYcnhaY1VtdWF5Ni9NVjh3L2Y1VDZ2UVhkb1N3NXB1V29kQll3VlJlWWgxSWFFTitqaVRhcG05WUJWbWNJc0pQTzZhYkhvd2tuU1YKK09XU3ZTVDBBdEFYNTdmRk9UY2ttK2ZhY2ZCSzlzOVQxbFVVZ0Y0NEJoNWU4ZjlxS3FmT1Y0NG5xZENPRXlVbTBEYW80OTdpZU40RWcKK1hCTE52T1pZOStpck1pWGpwMGxjeUZ2aHJKT2N6ZnlDcjlFaWlhaUgxVGZTektHS3NmMlc4NGlLbi9KSDZ4MmVPbzd4andKNDBCUUQKK2M2UzFjVU5FdXFCaFA2YnkwRmlvT1hZT0tWeWlmcHhrODRFYitGLzRDTmRUSlR2Q1B3c2llZ2Rmc1gvUTUzRHZLVnRYcDlZY2FtNUoKK1RtS1JIWEsvYk1IRjRPTnYzcC9PL2tuL0JxUngrZmJiUDJlTVg4WjFGL2x0SEtmcDZCKzA2SGxqVXdRTEJKczlYdENmcUg1WmdkejkKK2dhZDVXWkY1eWtGQXJtSERnZUZsZ2dndmJaN3o5dnFuak4vVEg2OFR4SnphdVlRNXZMSFE2d0dYaWs0LzR1cTcvVHFObWh4bFFFTTQKK3pWa3dzbjIwM2JVbUtMeXoreWwxekl0RHBuNXp5MXVYZkdvOTlyQmRVemRiZEU5TG1FRlBNYUZzYUhkNGE4b0RhVXJvRDdGZ0NiZUQKK0pKVmxkM2FjNkY4KzNRYkV4UHM0OE9yZ0Exa0kzL1V3WHI1MmxkamlZelRMZkFHUjlCanFORlR3NDVGVUh1TWY4VEVNNWhjSHg1NncKKzk1ZUtBcXJhRGsyOG85aytNMlVLcGNtcmRsV29XemRxVlZGZVdHcE04eDlZOU50MGxmLzRWVVFnclhqcVRrVUNRa0p5cVRlVGVHZ0gKK3JuM1FCazJYQWdweFpoYUpzM0luVzBCa0FsQm1LOTljTWluVWlKZUZ0NWE0cDV3UGVYclZ1aDZWOW03TXBsOWh6cG9nZysrRVpxYWgKK2Z6ek5uRGd4T1pmVzM0MkRYMDUyUGRnWG8wTm5raENrMDA1THZGdDZNMm1SbjBmTGdOVmZ5VVpab09wOGNPNVpXYmhYWGxyaHJnVXQKK2oyektQSzZROTRaajRrZFhIQkdwQWtyQjhaUTRFR0dPREUwRHF1c204V1BYekIrOTIzNklNSFBVN2xGYnlqQnJGTkk3TzRqZytxUkkKK0lwaSs3dFgwRnNpbHFFYm1qRytPUHdoWlhyZHFVcXlGK3JqS1F1U1JxN2xPZURCNGM2UzJkcTRPT255MDFpNUhDYmJ5YzlVdlNIUm0KK2hPaEdxVWx6SHlITG8zVzdqKzI2Vi9NaGtEWEorVHgrcWZ5bHY0cGJsaXdUdGVKSmorQ1p3emp2MjlxYjZseFlpKzM4QncxMEVSYXAKK204VUNSRkJlY1ZON3hYbGNJZnllQWw2NjZWaTdFQkpadjNFZEZOcngxbmxMd002NW5ZeWE3dWo2TDdJd0pXb3RJVXg4RTBYSDAvY1UKK3hTL2RHOGJ4ZjlMLzg2NTJoNWdxM0xJK3dUTkd1RVgwRE11ejdCR1FHK050Z2Ficlo2U3NLR3RoR2E3ZVVMVHB6ME1jV1RMUlUweS8KKy90a2NrcG01cERuWFNGYklNc2t3d2pFQ3o4MlVaQlNQcGlnZE4vUGpnNWQrMHlXdTdzM1ZKeHc0RU5XUFBwelorajdzT1htZHZuOVAKK08xdFFkNjBFTyszYXdBU0NCQUFaUXZXVjMveUo2RnhQdHRiUCtxZVVScEpvUEVaZnBOMlVZWm1kOEhxdFIwWWJhT1o2UmxuOW52cGQKK0s5ZnlsWGR3OXoyeGVDYmpEV1V0dEpCNFZxWnhHSk04ZUNUQzFWRFZ5QU9zUTVuN1NZNTVkTWtRYlUrbzRaLzRKNW04K3d6NTBCQkkKK0xmcnVMMWVaNi9DRjZDZHZ4VlJpSjEwc1hjMFRuMnNWTVhxa3c3QWRwMUdZb0NJOWM2VkZTRks3NCtuK3k3TFZGUTVIQm5iUXlLSmMKK2R2ZExPWHdaT1BhRkhDNVVOWFJtT3Bjd2RQcXlYVWUreElzT01ZYnpkbEFuSTllR0ROZVJEa3RVYS9SaDBDYlpDeGptSnpvWkVZT0UKK1pqc1labEVmcDFLYjYxdDh6NG0yOGhHTEVnODhUMUlobXhhMkhlVVdlczFScG1nSU9QKy8yTGIzc21qL2wvZnBTdTRnYWJGZ3lDQVYKK0g1SGRDWU1TY1V2OFNWdTU1K3RwZU84RUxvSEhRVVhWNHJyMDg0TzRidWR6aGdOU09QeUxHRGw1c2ZEVVhpeXVzUEN4UzRKVk8vS1kKKzZWMlFydGcvcTJ3dG1YcEVrWm5HVCtRaTNXRHp3dDRXODFhbHp0bllNUDE3b0dMbXhYNzFLVjlPRWlNWmpJNFdhYUd0K09PSU5MdFIKK3FlZmlvWjFOSTJMMXM1TTB0eWJ3VHN5VTlXRVJNKzNwVXdYSWZKVnNiTVpSbE5hTzJPb2djSGJhUjRVV3ZoT2orM0NURzFzVGhpWVEKK014TW5wMVJwcXgzbmh5enFMTzNUUnJrWXZ4bkEzY2RQQm45RWVxcGdCTWc3WDNoQ2lNVjNGbDVjai9XT01odEhZZ1k3QmdlQ1hvNDYKK0VGVlo0K1dyb0daNDZ4R2lSRGlJYmxvOGJ6TGQ3UUN4dnVrenh5M21VRGdzWlE4cGRzNE4yOHdlU1VoQms1TUFQYmZCcFJ2WFVWSngKK01oS3FYdWNRVTFNZDFxU0dMYnV1SVF1ejlwQUdwMUpGVXgvdkVrQ2dtNzRkYVNvVldDWnVCKzFaRTRmNDhjbHZyQmo1MXhNTmY4Q1AKK0VGRTd2eVN6VmI2WDJIMWk1WDNaK1kzRGRJY1d3NFkyRkNsZmNKazRNd3E4Q3EyR0FMR0ZFZ2U5WVNFRTlZbXl1VTZPRmVVMElDb24KK2lYQWdaNzJTTThmQndKUHJ1TEZiZHNOWUtXK29BZm1QaXNYU1dNY1ptZFNiZmswR1l2K3ZLdHUzZWVnU2JXdzFVc0NWdFpPaDlFNVoKK3VRODNsNTlDQnFPOXNWL1NGVTNXcnJKMHFOV3hybVh1OW5KbjVRZjVpQ1JvRkdZTkhZSGtJRzVGUzZOMDBHRURaeEdreG1ybzJkKysKK0FkajVMVkhjL2IxY1lXbXJ1eCtqRXFJOFpLOGN5VEIwWE1iQkEvSFlieDlOWGF6cjd6blA0L01sdjNwWlRvRWNZdCtsZ0xIQUFydFUKK0FkaHliaGJMSXdOTXEwZ3I2RXd0RGtsQmEzbnM0V3gvckpVOEg3TEdzNmdWOHVxZWFTa2V0ditueitzUWhmY3R4WjFyeCs1cXpYZnkKK0ZPUVZwTzIzS0RRdW5CaTFCbDlrNjFEaTRxOUpXY3lBREJYUEhYSnpwN21MOEZrN3pkdk1BRWZ1RUQxcGhkUm02R2dEWW9ZVXM0eVEKK0lyaFNqRmxXeWs3aFQ4NDc1eGszQkl2KytvYnZXU0F2LzMrcEY2QTZVMlJYRENoVm1uRzBKblBhOXdZWXRkekJtTGZaS0JqWCtEakQKK3lFTXN1aFBzQ3p1TjRSNnRCSUlCV0NWUkttS3dka2F0bXBzUUJnRHc0OHUwL0FyZmZsNS9EUmxTOWVlK1FmZkZlY1VpdERkQ0sra3QKK1g1TDJmR1lyTDVnNlNsdG5jTUllVjFwdHg0bnVTakMvTzk0NHExS1l0cXZRaVBGV0pxRVhJUk1OYmJZT0M0N3NqTHphMHRFRnJpbU4KK3d4Y3JXR1N6c3k1UjliZUZRMWFIUGNNckRXZkNvdmlOUmsycVB0eHVLSUM1UWsyWnVPbUpMakNpTHdVR0ViMC8xTXB6djNNcVFhN2QKK21SYXlYZzNEWldKUGFqeE5adjZlUzM1N0VsTXZ3R1FtcWFmYjJtbFFKd1dMc2c5bTlQRzd1cUVveXJxU2M2TWl1WStpY0xFRmliOWoKK09mUlFyeDcwclRTS1VmVHI0TXRQMGFaWkFlZmpDcnBWSXlUZWtoRkRPazBObXgwNTdlb25seUdnbUdwbDUvVW8rdDFKMVoxMVlhL2wKK2JOYmZtZWJSSVNKZVRWVzBJOEZoc2VBWk1JMUdTd3AvbHVkSnhTTFlPZ3lSa2grR1gxMzRNZXhObzdPOUYxU3hMQ2ZXYVNHOUZjM3MKKzVpZnkwNHVhOS90OFNHcllaUG0vbDNNa0FBQUFBQUFBQUFBQUFBPT0KKworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLXMtYS1lLnBlbSBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L21zaWUtcy1hLWUucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZGJkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9tc2llLXMtYS1lLnBlbQpAQCAtMCwwICsxLDEwNiBAQAorLS0tLS1CRUdJTiBQS0NTNy0tLS0tCitNSUFHQ1NxR1NJYjNEUUVIQTZDQU1JSVRVQUlCQURHQ0FjSXdnY3dDQVFBd2RqQmlNUkV3RHdZRFZRUUhFd2hKCitiblJsY201bGRERVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eE5EQXlCZ05WQkFzVEsxWmxjbWxUCithV2R1SUVOc1lYTnpJREVnUTBFZ0xTQkpibVJwZG1sa2RXRnNJRk4xWW5OamNtbGlaWElDRUdCQW1JTGVwOXNKCit1TjJQa2cxZ3Vjb3dEUVlKS29aSWh2Y05BUUVCQlFBRVFLT3h4cEliUlRiMzErcUlRQ0JPcE1WQUdud0NMclBPCitPWG5udHhWdmVUclBoQm5zSnVvR05KY0NNdHVIbDd0TGtkMzhXc1Z3T2ZHWFVwclRxRnBVY1k4d2dmQUNBUUF3CitnWmt3Z1pJeEN6QUpCZ05WQkFZVEFrRlZNUk13RVFZRFZRUUlFd3BSZFdWbGJuTnNZVzVrTVJFd0R3WURWUVFICitFd2hDY21selltRnVaVEVhTUJnR0ExVUVDaE1SUTNKNWNIUnpiMlowSUZCMGVTQk1kR1F4SWpBZ0JnTlZCQXNUCitHVVJGVFU5T1UxUlNRVlJKVDA0Z1FVNUVJRlJGVTFSSlRrY3hHekFaQmdOVkJBTVRFa1JGVFU4Z1drVlNUeUJXCitRVXhWUlNCRFFRSUNCRzR3RFFZSktvWklodmNOQVFFQkJRQUVRS3pJZGRuWEZxSy9SUkJHODZaVml4b1hmd0F2CitaZGZ2bkRGc0t6UG4vQTZEdURkRS9ocUp4bkZwSGl3R2lEUi9ZYldqMmliK0c3NERTc2hnWDh2ajhaUXdnaEdECitCZ2txaGtpRzl3MEJCd0V3R2dZSUtvWklodmNOQXdJd0RnSUNBS0FFQ0xLTTBLNThJM0hOZ0lJUldCRFA4cytnCitsNy82SmhaNVBCSjV2UHBEMVI0cG5ORFpSYWJzWXUwUXplemR6MUlLK21hVEFoRjBTRXVOWm9Fa3pJZ09JdnUzCitValc4eC8yS2NId3RlQUJ3Z1JpU2sxSnlOTHdSRUQwUnR2dUo0MHBJR0R2RHNId0JNY1hFdEtVTUFPcEdDaG1zCitIVUsxK0IvR0thbmNTREZPQ2VHM0pDRm5GZGJ1UUZESVZIQzZhbVdzbGM2bnRxVnMvc2lpMkdzNHFkekRmUWdsCitQVi9BL0ZZMHdpMGoyTzVjWFJRSnRaVktNL01ZR2pqNWMxY3k5UTdveW1VNUFUUC9MQVJEMFR3NWtCQjdIVm5ECisycXJtbW14Y0hha3l4aFhtd3NrYUtTNlF4Z3FxNkxQZGdyNjAzb254cUV0d05TejVVYkNxOW1MWHVDa0ZPVnNRCisvNW1aY21tYzdyZTNYSk1RSFJYa0JseEVwWlE2SE9VSUV6bGhScUNvMmhoeW15Wks4NHJwdGpPUlFvNnZOYWtNCitJQzBabjhPKzZYbDFObG1iR3paYWt6NkxKNGRjekU3ZUc3THdyVnVzOU9xM1YvV3dlRzZyV01QVjVkNTFvS01pCitCUmIycFhYeTgwQkFLaC85aHZwUC9WL0hPMS8rTVB1azh0QW43c3NtUW9JQVFjWnhxTE9tZ3FxRmh5MjFvU0V1CityVVk3NDZHcC92SVY2QXgxTW5mREEvZmJqRGxsaEpUbDh1alpuZmo4UjEvb1FhOWZKTWlwVjhDWVFFQXQzb2taCitWMDNrYVZoaFBHc3Y1NDQvelJuaHFqaGdxakhBU1pHbmx1WkN4RHdIYjFDRTRVcVlMcDZJYmtIM3Fvc3kybnRtCithN1dDc00zRk4zbzVkS0ZaWEJnQkVQVDhIVTlMTFE4QitUMFp2aDhDUTcxOWtrTkJobnV6U1l6bUk0OFI1Skh2Cit6YlJPaVU1djRwOUZwc3NEMTN2WGlPeHphTVRLUXFXay9yb0dIaU5vS3pLb25TNVJCd1R4S2ZPc29Db2JDQmFJCitJWkNtSk5yNGNHSS9wNUdWRVk0cENQbGpUcTl3M0hvaU5yaHdaN3I3SUkzd2RYeTBKalNpUmtyM3cxQUtYbTN2CisxSDlrSFp6YzI4RWtmNytEZTZWVGp5S1JQZTFXWVBFVGVZNW1oOW5JWVVRejMwLzVnSXhKd3NQRk9YZUhNYkxSCitpUWp4VHpuay91bzRCdHdWK0haUG1mNHRJUXZBdUZ1VEtZUjlsUDNYc1paTitiS2tGWXk4bkhSWWQ0T0VyQkJnCis5M05zcUJZUk9keko0cHF4b0piNmd0MkVIQ3QzcGF6YXZnd0R4ekNKaGNNdHZCaVlMRWtEeFVYNzd5UzVzWFljCitrNk5MSXdGTDVCUFk5SlgvUVAxUmFpSlYrVHRIZzY5WUVsVytydWRYNlZkTFE3bUtDTVRIR1diSFU1b0YrRHY0CitLdjh4c3JqTlUyc3BJbWZ6WTJjb3Ezb3NMcEZwT2E4VmhyTFN3TVhGRHRlajVPSHEwTTBxWXBZbTNvcDZCK056Cis2cE5ZbE1wdmVRdjVRank5TFROTXZMWDR6K3RuaDZTaXo4bUpMbXRnaHdDekMrRG55UUdDbi9TdHpxNmtGNWFNCitGb3JrN1Jvc0I0RkI4dTZXalZyRlpmVGc1SlVxWmg2Z0NXM0pIcFE3MHdUZHB5NnRES0R0TnJiaktvN0NHTDgrCitzaG9TSTd0MnhhOFczT3l5RlhNRXVKelRZMlVDUStReFRPV0k5aWRrZFpDQ1VNQlhFdmtyYXFHOHJVNFVLUkNrCitpQUd3RU16b3BoRXYrYVN5SmZkdTZ5SkdqZCsvd1VDSE1TM0VtdE9XSHd0QjVkNXNWaEVyZFFOQStKUU4rd1BVCit2QkcySmczd0dKVEhOTng0V1JuV1JMV3NINlNSY2d4OHpXWEhqVmdYSWVwOFhqV1FtT0dCWGJHODdoa3RFU3FjCitEUVBVdjNNemllS2ZjcGdRc2JvUm5xU04xRHltd3ZBdStQVnNNTmY4REhRS0xkWi9pdXpQendSa2ZJVnBtaCtVCitrdTFOOGpNQUFkWDZ0alE0OGVMcS9sSnZqSEpVblRkTlRBMTh4aER2bmdLTmFYUUdQT08vZHQrSmZIUWRtRlFJCitXZFdaU2VDcG02akNpYXhpVjUwRkJHRXV2M0V3MFk3RktITEtGdTdob05YSXRob2gycW81Wkg2UVg0bnQwbllSCitWdnl2SWNBQjlCd0M3T2VxQlRldXNGSkQvd0dpUUQzeUZEWVVla2FSeXMyZmN3Z3VOcUFkcGpXc0VFVEp4UkV3CitaZGJQMHNETVN5a2FlNHdIeXJPRFdjVW1PaVBjLzluVTZjMHQ3YkJ6SThWUTdzWktKYjBUVmdTQ3hESGk5UWdiCis0cWRoNFpxRk1QMHMrVFE0TXM1TldrQzFlZzBEU2RrV1N6R1EwUXJVc0dVZ2J1cFlZVW9FeVJtc3o5UGpXNmwxCit3dVdrRTY2cXhTSEZzZzE4L2dBNVhwTE04MkRQNEVta0V3Z0MwOEh3dzJsUFJKTjhWWUZ2bHdiUk1iU2QxUHRBCitEZDVkSS9PcTFDSFNMNmVubG5jVmtLci9TN2FhS0t5akF5bjFIT1QyRmRQV2RTWUxFK0YrZFdjNnZ1K0plWGMrCis3blNETzFEVzNVNlprWnZUdzQ5MDFHeGdyelVmWWFqaEJreTI1TDI5V1VkdUdvZXJoa1pkczV3ZHVTS1F3QmtZCitUVVcvWXJQNlR0cmJ4OEIwd3pEbzY0TDJSdjZUYjE0RWxNYzlLVVkxSTF5SEtnWHRsOW9IRUgzbXBhL0lHTytxCitQTjFoQmkramc2OGxmYjAwRlI3ZWR2b3M0S1dLQVdXbFphWUttMlplZUhQamhOR2NYL1VjRjhBMjNHTHVTcnVSCitORER5OUtsSTNOTXR2bU9oT0QrV3dGbW1SakJrL2prWk1sVk0zR2xwalAvbDVUdXp4RWVjSzFwUWlER1FsOVMvCis1NzRxR05LdEFpcWdDNSt3eVVGUHFucDI4SzIrcnNFdTdqV1dPbGZPck5HZzJLVk84a2Nxc1F1VW03c2pTVzlOCitvSGNWQW9LU0xIQldqRkl6RlVacGVET0FTSTEvMjFQaDRCNkZURkp2RXB6ZllFWEU5b3N6NjREaGxYREV5WTMzCitwODZBaXFBajZQVVk0QmpITFlBZUE3eW1waEt6Vk96cTRwU0g3cUtzeER6VW5qL1VqOFA4NUE1amJ6SG16T1BmCitWbnZRbFo3QjFGcWhkTlAyU1ZxTG11Ky90SDlXeTB2N1puSXRTUWJ5SERLUCtFaWI0Qi9paGFOSUlvei9ZS2dECiszZVlnanA2WnlaUjFLa1NNcHVOa3BzaWhBN3MzVXNGeW93RWVvKzdsM1d0L1NjakNhL0lCc3hMTHRJMkVaQUpvCis5V0hZcXNDbDFIQ3pKSEk5UUNubFB6OFUxRmNOR0NyTC82Nk1LejJNTU44VUZGcWpZcjYxd2V4Z2h4TndjN0dECitYUjdKczRtaGlGMEd3UGhBUjNaTGlxelBBWEF2bjhZUmY1ZnlsTVo0TEE5Uk8rU0hGTC9NeFF4ZnJKT0FnV0I2CitwTFBVdUNXSlhMbTdvczZyQ0MyM1JzeUREV2U4TitKTkYwL3J5enI4TUhlSUpHc1QrQVluWnIwOFBlVGJ5cjAxCitKRW9UN2xQWVQ2UHpYNEY2M1FLS0RsK21CK1B3TE16WUNYcnhaY1VtdWF5Ni9NVjh3L2Y1VDZ2UVhkb1N3NXB1CitXb2RCWXdWUmVZaDFJYUVOK2ppVGFwbTlZQlZtY0lzSlBPNmFiSG93a25TVk9XU3ZTVDBBdEFYNTdmRk9UY2ttCisrZmFjZkJLOXM5VDFsVVVnRjQ0Qmg1ZThmOXFLcWZPVjQ0bnFkQ09FeVVtMERhbzQ5N2llTjRFZ1hCTE52T1pZCis5K2lyTWlYanAwbGN5RnZockpPY3pmeUNyOUVpaWFpSDFUZlN6S0dLc2YyVzg0aUtuL0pINngyZU9vN3hqd0o0CiswQlFEYzZTMWNVTkV1cUJoUDZieTBGaW9PWFlPS1Z5aWZweGs4NEViK0YvNENOZFRKVHZDUHdzaWVnZGZzWC9RCis1M0R2S1Z0WHA5WWNhbTVKVG1LUkhYSy9iTUhGNE9OdjNwL08va24vQnFSeCtmYmJQMmVNWDhaMUYvbHRIS2ZwCis2QiswNkhsalV3UUxCSnM5WHRDZnFINVpnZHo5Z2FkNVdaRjV5a0ZBcm1IRGdlRmxnZ2d2Ylo3ejl2cW5qTi9UCitINjhUeEp6YXVZUTV2TEhRNndHWGlrNC80dXE3L1RxTm1oeGxRRU00elZrd3NuMjAzYlVtS0x5eit5bDF6SXRECitwbjV6eTF1WGZHbzk5ckJkVXpkYmRFOUxtRUZQTWFGc2FIZDRhOG9EYVVyb0Q3RmdDYmVESkpWbGQzYWM2RjgrCiszUWJFeFBzNDhPcmdBMWtJMy9Vd1hyNTJsZGppWXpUTGZBR1I5QmpxTkZUdzQ1RlVIdU1mOFRFTTVoY0h4NTZ3Cis5NWVLQXFyYURrMjhvOWsrTTJVS3BjbXJkbFdvV3pkcVZWRmVXR3BNOHg5WTlOdDBsZi80VlVRZ3JYanFUa1VDCitRa0p5cVRlVGVHZ0hybjNRQmsyWEFncHhaaGFKczNJblcwQmtBbEJtSzk5Y01pblVpSmVGdDVhNHA1d1BlWHJWCit1aDZWOW03TXBsOWh6cG9nZysrRVpxYWhmenpObkRneE9aZlczNDJEWDA1MlBkZ1hvME5ua2hDazAwNUx2RnQ2CitNMm1SbjBmTGdOVmZ5VVpab09wOGNPNVpXYmhYWGxyaHJnVXRqMnpLUEs2UTk0Wmo0a2RYSEJHcEFrckI4WlE0CitFR0dPREUwRHF1c204V1BYekIrOTIzNklNSFBVN2xGYnlqQnJGTkk3TzRqZytxUklJcGkrN3RYMEZzaWxxRWJtCitqRytPUHdoWlhyZHFVcXlGK3JqS1F1U1JxN2xPZURCNGM2UzJkcTRPT255MDFpNUhDYmJ5YzlVdlNIUm1oT2hHCitxVWx6SHlITG8zVzdqKzI2Vi9NaGtEWEorVHgrcWZ5bHY0cGJsaXdUdGVKSmorQ1p3emp2MjlxYjZseFlpKzM4CitCdzEwRVJhcG04VUNSRkJlY1ZON3hYbGNJZnllQWw2NjZWaTdFQkpadjNFZEZOcngxbmxMd002NW5ZeWE3dWo2CitMN0l3SldvdElVeDhFMFhIMC9jVXhTL2RHOGJ4ZjlMLzg2NTJoNWdxM0xJK3dUTkd1RVgwRE11ejdCR1FHK050CitnYWJyWjZTc0tHdGhHYTdlVUxUcHowTWNXVExSVTB5Ly90a2NrcG01cERuWFNGYklNc2t3d2pFQ3o4MlVaQlNQCitwaWdkTi9Qamc1ZCsweVd1N3MzVkp4dzRFTldQUHB6WitqN3NPWG1kdm45UE8xdFFkNjBFTyszYXdCbEM5WlhmCisvSW5vWEUrMjFzLzZwNVJHa21nOFJsK2szWlJobVozd2VxMUhSaHRvNW5wR1dmMmUrbDByMS9LVmQzRDNQYkY0CitKdU1OWlMyMGtIaFdwbkVZa3p4NEpNTFZVTlhJQTZ4RG1mdEpqbmwweVJCdFQ2amhuL2dubWJ6N0RQblFFRWd0CisrdTR2VjVucjhJWG9KMi9GVkdJblhTeGR6Uk9mYXhVeGVxVERzQjJuVVppZ0lqMXpwVVZJVXJ2ajZmN0xzdFVWCitEa2NHZHRESW9seDI5MHM1ZkJrNDlvVWNMbFExZEdZNmx6QjArckpkUjc3RWl3NHhodk4yVUNjajE0WU0xNUVPCitTMVJyOUdIUUp0a0xHT1luT2hrUmc0Um1PeGhtVVIrblVwdnJXM3pQaWJieUVZc1NEenhQVWlHYkZyWWQ1Ulo2Cit6VkdtYUFnNC83L1l0dmV5YVArWDkrbEs3aUJwc1dESUlCVWZrZDBKZ3hKeFMveEpXN25uNjJsNDd3UXVnY2RCCitSZFhpdXZUemc3aHU1M09HQTFJNC9Jc1lPWG14OE5SZUxLNnc4TEZMZ2xVNzhwanBYWkN1MkQrcmJDMlpla1NSCittY1pQNUNMZFlQUEMzaGJ6VnFYTzJkZ3cvWHVnWXViRmZ2VXBYMDRTSXhtTWpoWnBvYTM0NDRnMHUxR3A1K0toCituVTBqWXZXemt6UzNKdkJPekpUMVlSRXo3ZWxUQmNoOGxXeHN4bEdVMW83WTZpQndkdHBIaFJhK0U2UDdjSk1iCitXeE9HSmhBekV5ZW5WR21ySGVlSExPb3M3ZE5HdVJpL0djRGR4MDhHZjBSNnFtQUV5RHRmZUVLSXhYY1dYbHlQCis5WTR5RzBkaUJqc0dCNEplampvUVZWbmo1YXVnWm5qckVhSkVPSWh1V2p4dk10M3RBTEcrNlRQSExlWlFPQ3hsCitEeWwyemczYnpCNUpTRUdUa3dBOXQ4R2xHOWRSVW5FeUVxcGU1eEJUVXgzV3BJWXR1NjRoQzdQMmtBYW5Va1ZUCitIKzhTUUtDYnZoMXBLaFZZSm00SDdWa1RoL2p4eVcrc0dQblhFdzEvd0k4UVVUdS9KTE5WdnBmWWZXTGxmZG41CitqY04waHhiRGhqWVVLVjl3bVRnekNyd0tyWVlBc1lVU0I3MWhJUVQxaWJLNVRvNFY1VFFnS2llSmNDQm52Wkl6Cit4OEhBayt1NHNWdDJ3MWdwYjZnQitZK0t4ZEpZeHhtWjFKdCtUUVppLzY4cTI3ZDU2Qkp0YkRWU3dKVzFrNkgwCitUbG01RHplWG4wSUdvNzJ4WDlJVlRkYXVzblNvMWJHdVplNzJjbWZsQi9tSUpHZ1VaZzBkZ2VRZ2JrVkxvM1RRCitZUU5uRWFUR2F1alozNzRCMlBrdFVkejl2VnhoYWF1N0g2TVNvanhrcnh6Sk1IUmN4c0VEOGRodkgwMWRyT3Z2CitPYy9qOHlXL2VsbE9nUnhpMzZXQXNjQUN1MVFCMkhKdUZzc2pBMHlyU0N2b1RDME9TVUZyZWV6aGJIK3NsVHdmCitzc2F6cUJYeTZwNXBLUjYyLzZmUDZ4Q0Y5eTNGbld2SDdtck5kL0lVNUJXazdiY29OQzZjR0xVR1gyVHJVT0xpCityMGxaeklBTUZjOGRjbk9udVl2d1dUdk4yOHdBUis0UVBXbUYxR2JvYUFOaWhoU3pqSkFpdUZLTVdWYktUdUZQCit6anZuR1RjRWkvNzZodTlaSUMvL2Y2a1hvRHBUWkZjTUtGV2FjYlFtYzlyM0JoaTEzTUdZdDlrb0dOZjRPTVBJCitReXk2RSt3TE80M2hIcTBsVVNwaXNIWkdyWnFiRUFZQThPUEx0UHdLMzM1ZWZ3MFpVdlhudmtIM3hYbkZJclEzCitRaXZwTFYrUzlueG1LeStZT2twYlozRENIbGRhYmNlSjdrb3d2enZlT0t0U21MYXIwSWp4VmlhaEZ5RVREVzIyCitEZ3VPN0l5ODJ0TFJCYTRwamNNWEsxaGtzN011VWZXM2hVTldoejNES3cxbndxTDRqVVpOcWo3Y2JpaUF1VUpOCittYmpwaVM0d29pOEZCaEc5UDlUS2M3OXpLa0d1M1prV3NsNE53MlZpVDJvOFRXYitua3QrZXhKVEw4QmtKcW1uCisyOXBwVUNjRmk3SVBadlR4dTdxaEtNcTZrbk9qSXJtUG9uQ3hCWW0vWXpuMFVLOGU5SzAwaWxIMDYrRExUOUdtCitXUUhuNHdxNlZTTWszcElSUXpwTkRac2RPZTNxSjVjaG9KaHFaZWYxS1ByZFNkV2RkV0d2NVd6VzM1bm0wU0VpCitYazFWdENQQlliSGdHVENOUmtzS2Y1Ym5TY1VpMkRvTWtaSWZobDlkK0RIc1RhT3p2UmRVc1N3bjFta2h2UlhOCis3T1luOHRPTG12ZjdmRWhxMkdUNXY1ZHpKQUFBQUFBPQorLS0tLS1FTkQgUEtDUzctLS0tLQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvbmF2LXNtaW1lIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3QvbmF2LXNtaW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZTRiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9uYXYtc21pbWUKQEAgLTAsMCArMSwxNTcgQEAKK0Zyb20gYW5nZWxhQGMyLm5ldC5hdSBUaHUgTWF5IDE0IDEzOjMyOjI3IDE5OTgKK1gtVUlETDogODNjOTRkZDU1MGU1NDMyOWJmOTU3MWI3MjAzOGI4YzgKK1JldHVybi1QYXRoOiBhbmdlbGFAYzIubmV0LmF1CitSZWNlaXZlZDogZnJvbSBjcnlwdHNvZnQuY29tIChwbGF5LmNyeXB0c29mdC5jb20gWzIwMy41Ni40NC4zXSkgYnkgcGFuZG9yYS5jcnlwdHNvZnQuY29tICg4LjguMy84LjcuMykgd2l0aCBFU01UUCBpZCBOQUEyNzgzOCBmb3IgPHRqaEBjcnlwdHNvZnQuY29tPjsgVGh1LCAxNCBNYXkgMTk5OCAxMzozMjoyNiArMTAwMCAoRVNUKQorTWVzc2FnZS1JRDogPDM1NUE2Nzc5LjRCNjNFNjRDQGNyeXB0c29mdC5jb20+CitEYXRlOiBUaHUsIDE0IE1heSAxOTk4IDEzOjM5OjM3ICsxMDAwCitGcm9tOiBBbmdlbGEgdmFuIExlbnQgPGFuZ2VsYUBjMi5uZXQuYXU+CitYLU1haWxlcjogTW96aWxsYSA0LjAzIFtlbl0gKFdpbjk1OyBVKQorTUlNRS1WZXJzaW9uOiAxLjAKK1RvOiB0amhAY3J5cHRzb2Z0LmNvbQorU3ViamVjdDogc2lnbmVkCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9zaWduZWQ7IHByb3RvY29sPSJhcHBsaWNhdGlvbi94LXBrY3M3LXNpZ25hdHVyZSI7IG1pY2FsZz1zaGExOyBib3VuZGFyeT0iLS0tLS0tLS0tLS0tbXM5QTU4ODQ0Qzk1OTQ5RUNDNzhBMUM1NEMiCitDb250ZW50LUxlbmd0aDogMjYwNAorU3RhdHVzOiBPUgorCitUaGlzIGlzIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2lnbmVkIG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCisKKy0tLS0tLS0tLS0tLS0tbXM5QTU4ODQ0Qzk1OTQ5RUNDNzhBMUM1NEMKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitzaWduZWQgYm9keQorCistLS0tLS0tLS0tLS0tLW1zOUE1ODg0NEM5NTk0OUVDQzc4QTFDNTRDCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtcGtjczctc2lnbmF0dXJlOyBuYW1lPSJzbWltZS5wN3MiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJzbWltZS5wN3MiCitDb250ZW50LURlc2NyaXB0aW9uOiBTL01JTUUgQ3J5cHRvZ3JhcGhpYyBTaWduYXR1cmUKKworTUlJR0hnWUpLb1pJaHZjTkFRY0NvSUlHRHpDQ0Jnc0NBUUV4Q3pBSkJnVXJEZ01DR2dVQU1Bc0dDU3FHU0liM0RRRUhBYUNDCitCR3N3Z2dKVE1JSUIvYUFEQWdFQ0FnSUVmakFOQmdrcWhraUc5dzBCQVFRRkFEQ0JrakVMTUFrR0ExVUVCaE1DUVZVeEV6QVIKK0JnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEVUQVBCZ05WQkFjVENFSnlhWE5pWVc1bE1Sb3dHQVlEVlFRS0V4RkRjbmx3ZEhOdgorWm5RZ1VIUjVJRXgwWkRFaU1DQUdBMVVFQ3hNWlJFVk5UMDVUVkZKQlZFbFBUaUJCVGtRZ1ZFVlRWRWxPUnpFYk1Ca0dBMVVFCitBeE1TUkVWTlR5QmFSVkpQSUZaQlRGVkZJRU5CTUI0WERUazRNRFV4TXpBMk1qWTFObG9YRFRBd01EVXhNakEyTWpZMU5sb3cKK2dhVXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdQorWlRFYU1CZ0dBMVVFQ2hNUlEzSjVjSFJ6YjJaMElGQjBlU0JNZEdReEVqQVFCZ05WQkFzVENWTk5TVTFGSURBd016RVpNQmNHCitBMVVFQXhNUVFXNW5aV3hoSUhaaGJpQk1aV1Z1ZERFak1DRUdDU3FHU0liM0RRRUpBUllVWVc1blpXeGhRR055ZVhCMGMyOW0KK2RDNWpiMjB3WERBTkJna3Foa2lHOXcwQkFRRUZBQU5MQURCSUFrRUF1QzMrN2RBYjJMaHVPN2d0MmNUTTh2c05qaEc1SmZEaAoraFgxVmwvd1ZHYktFRWowTUE2dldFb2x2ZWZRbHhCK0V6d0N0UjBZWjdlRUMvVC80Sm9DeWVRSURBUUFCb3lnd0pqQWtCZ2xnCitoa2dCaHZoQ0FRMEVGeFlWUjJWdVpYSmhkR1ZrSUhkcGRHZ2dVMU5NWldGNU1BMEdDU3FHU0liM0RRRUJCQVVBQTBFQVVuU1AKK2lnczZUTUZJU1RqdzhjQnRKWWI5OGN6Z0FWa1ZGakt5SlF3WU1IOEZiRG5DeXg2Tm9jTTU1NW5zeURzdGF3OGZLUjExS2hkcworc3lkM2lra3JoRENDQWhBd2dnRzZBZ0VETUEwR0NTcUdTSWIzRFFFQkJBVUFNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHCitBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERVJNQThHQTFVRUJ4TUlRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW0KK2RDQlFkSGtnVEhSa01TSXdJQVlEVlFRTEV4bEVSVTFQVGxOVVVrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRRAorRXhKRVJVMVBJRnBGVWs4Z1ZrRk1WVVVnUTBFd0hoY05PVGd3TXpBek1EYzBNVE15V2hjTk1EZ3dNakk1TURjME1UTXlXakNCCitrakVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WQkFnVENsRjFaV1Z1YzJ4aGJtUXhFVEFQQmdOVkJBY1RDRUp5YVhOaVlXNWwKK01Sb3dHQVlEVlFRS0V4RkRjbmx3ZEhOdlpuUWdVSFI1SUV4MFpERWlNQ0FHQTFVRUN4TVpSRVZOVDA1VFZGSkJWRWxQVGlCQgorVGtRZ1ZFVlRWRWxPUnpFYk1Ca0dBMVVFQXhNU1JFVk5UeUJhUlZKUElGWkJURlZGSUVOQk1Gd3dEUVlKS29aSWh2Y05BUUVCCitCUUFEU3dBd1NBSkJBTCswRTJmTGVqM0ZTQ3dlMkEyaVJuTXVDM3oxMnFISXA2S3kxd28yelpjeGZ0N0FJK1Jma3JXclNHdGYKK21mekJFdVByTGRmdWxuY0M1WTFwTmNNOFJUVUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRUUZBQU5CQUdTYkxNcGhMNkY1cHAzcworOG8wWHloODZGSEZkcFZPd1l4MDlFTExrdUcxN1YvUDlwZ0ljMEVvL2dETWJOK0tUM0lkZ0VDZjhTLy9wQ1JBNlJyTmpjWEl4CitnZ0Y3TUlJQmR3SUJBVENCbVRDQmtqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEVUQVAKK0JnTlZCQWNUQ0VKeWFYTmlZVzVsTVJvd0dBWURWUVFLRXhGRGNubHdkSE52Wm5RZ1VIUjVJRXgwWkRFaU1DQUdBMVVFQ3hNWgorUkVWTlQwNVRWRkpCVkVsUFRpQkJUa1FnVkVWVFZFbE9SekViTUJrR0ExVUVBeE1TUkVWTlR5QmFSVkpQSUZaQlRGVkZJRU5CCitBZ0lFZmpBSkJnVXJEZ01DR2dVQW9Ib3dHQVlKS29aSWh2Y05BUWtETVFzR0NTcUdTSWIzRFFFSEFUQWJCZ2txaGtpRzl3MEIKK0NROHhEakFNTUFvR0NDcUdTSWIzRFFNSE1Cd0dDU3FHU0liM0RRRUpCVEVQRncwNU9EQTFNVFF3TXpNNU16ZGFNQ01HQ1NxRworU0liM0RRRUpCREVXQkJRc3ROTW5TVjI2YmE4UGFwUUVEaE8yMXlORnJqQU5CZ2txaGtpRzl3MEJBUUVGQUFSQVc5WGI5WVh2CitCZmNOa3V0Z0ZYOUdyOGlYaEJWc050R0VWcmpycGtRd3BLYTdqSEk4U2pBbExoay80UkZ3REhmK0lTQjlOcDNaMVdEV25MY0EKKzlDV1I2Zz09CistLS0tLS0tLS0tLS0tLW1zOUE1ODg0NEM5NTk0OUVDQzc4QTFDNTRDLS0KKworCitGcm9tIGFuZ2VsYUBjMi5uZXQuYXUgVGh1IE1heSAxNCAxMzozMzoxNiAxOTk4CitYLVVJREw6IDhmMDc2YzQ0ZmY3YzU5NjdmZDViMDBjNDU4OGE4NzMxCitSZXR1cm4tUGF0aDogYW5nZWxhQGMyLm5ldC5hdQorUmVjZWl2ZWQ6IGZyb20gY3J5cHRzb2Z0LmNvbSAocGxheS5jcnlwdHNvZnQuY29tIFsyMDMuNTYuNDQuM10pIGJ5IHBhbmRvcmEuY3J5cHRzb2Z0LmNvbSAoOC44LjMvOC43LjMpIHdpdGggRVNNVFAgaWQgTkFBMjc4NDcgZm9yIDx0amhAY3J5cHRzb2Z0LmNvbT47IFRodSwgMTQgTWF5IDE5OTggMTM6MzM6MTUgKzEwMDAgKEVTVCkKK01lc3NhZ2UtSUQ6IDwzNTVBNjdBQi4yQUYzODgwNkBjcnlwdHNvZnQuY29tPgorRGF0ZTogVGh1LCAxNCBNYXkgMTk5OCAxMzo0MDoyNyArMTAwMAorRnJvbTogQW5nZWxhIHZhbiBMZW50IDxhbmdlbGFAYzIubmV0LmF1PgorWC1NYWlsZXI6IE1vemlsbGEgNC4wMyBbZW5dIChXaW45NTsgVSkKK01JTUUtVmVyc2lvbjogMS4wCitUbzogdGpoQGNyeXB0c29mdC5jb20KK1N1YmplY3Q6IHNpZ25lZAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvc2lnbmVkOyBwcm90b2NvbD0iYXBwbGljYXRpb24veC1wa2NzNy1zaWduYXR1cmUiOyBtaWNhbGc9c2hhMTsgYm91bmRhcnk9Ii0tLS0tLS0tLS0tLW1zRDc4NjNCODRCRDYxRTAyQzQwN0YyRjVFIgorQ29udGVudC1MZW5ndGg6IDI2NzkKK1N0YXR1czogT1IKKworVGhpcyBpcyBhIGNyeXB0b2dyYXBoaWNhbGx5IHNpZ25lZCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorCistLS0tLS0tLS0tLS0tLW1zRDc4NjNCODRCRDYxRTAyQzQwN0YyRjVFCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworc2lnbmVkIGJvZHkgMgorCistLS0tLS0tLS0tLS0tLW1zRDc4NjNCODRCRDYxRTAyQzQwN0YyRjVFCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtcGtjczctc2lnbmF0dXJlOyBuYW1lPSJzbWltZS5wN3MiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJzbWltZS5wN3MiCitDb250ZW50LURlc2NyaXB0aW9uOiBTL01JTUUgQ3J5cHRvZ3JhcGhpYyBTaWduYXR1cmUKKworTUlJR1ZnWUpLb1pJaHZjTkFRY0NvSUlHUnpDQ0JrTUNBUUV4Q3pBSkJnVXJEZ01DR2dVQU1Bc0dDU3FHU0liM0RRRUhBYUNDCitCR3N3Z2dKVE1JSUIvYUFEQWdFQ0FnSUVmakFOQmdrcWhraUc5dzBCQVFRRkFEQ0JrakVMTUFrR0ExVUVCaE1DUVZVeEV6QVIKK0JnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEVUQVBCZ05WQkFjVENFSnlhWE5pWVc1bE1Sb3dHQVlEVlFRS0V4RkRjbmx3ZEhOdgorWm5RZ1VIUjVJRXgwWkRFaU1DQUdBMVVFQ3hNWlJFVk5UMDVUVkZKQlZFbFBUaUJCVGtRZ1ZFVlRWRWxPUnpFYk1Ca0dBMVVFCitBeE1TUkVWTlR5QmFSVkpQSUZaQlRGVkZJRU5CTUI0WERUazRNRFV4TXpBMk1qWTFObG9YRFRBd01EVXhNakEyTWpZMU5sb3cKK2dhVXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdQorWlRFYU1CZ0dBMVVFQ2hNUlEzSjVjSFJ6YjJaMElGQjBlU0JNZEdReEVqQVFCZ05WQkFzVENWTk5TVTFGSURBd016RVpNQmNHCitBMVVFQXhNUVFXNW5aV3hoSUhaaGJpQk1aV1Z1ZERFak1DRUdDU3FHU0liM0RRRUpBUllVWVc1blpXeGhRR055ZVhCMGMyOW0KK2RDNWpiMjB3WERBTkJna3Foa2lHOXcwQkFRRUZBQU5MQURCSUFrRUF1QzMrN2RBYjJMaHVPN2d0MmNUTTh2c05qaEc1SmZEaAoraFgxVmwvd1ZHYktFRWowTUE2dldFb2x2ZWZRbHhCK0V6d0N0UjBZWjdlRUMvVC80Sm9DeWVRSURBUUFCb3lnd0pqQWtCZ2xnCitoa2dCaHZoQ0FRMEVGeFlWUjJWdVpYSmhkR1ZrSUhkcGRHZ2dVMU5NWldGNU1BMEdDU3FHU0liM0RRRUJCQVVBQTBFQVVuU1AKK2lnczZUTUZJU1RqdzhjQnRKWWI5OGN6Z0FWa1ZGakt5SlF3WU1IOEZiRG5DeXg2Tm9jTTU1NW5zeURzdGF3OGZLUjExS2hkcworc3lkM2lra3JoRENDQWhBd2dnRzZBZ0VETUEwR0NTcUdTSWIzRFFFQkJBVUFNSUdTTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHCitBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERVJNQThHQTFVRUJ4TUlRbkpwYzJKaGJtVXhHakFZQmdOVkJBb1RFVU55ZVhCMGMyOW0KK2RDQlFkSGtnVEhSa01TSXdJQVlEVlFRTEV4bEVSVTFQVGxOVVVrRlVTVTlPSUVGT1JDQlVSVk5VU1U1SE1Sc3dHUVlEVlFRRAorRXhKRVJVMVBJRnBGVWs4Z1ZrRk1WVVVnUTBFd0hoY05PVGd3TXpBek1EYzBNVE15V2hjTk1EZ3dNakk1TURjME1UTXlXakNCCitrakVMTUFrR0ExVUVCaE1DUVZVeEV6QVJCZ05WQkFnVENsRjFaV1Z1YzJ4aGJtUXhFVEFQQmdOVkJBY1RDRUp5YVhOaVlXNWwKK01Sb3dHQVlEVlFRS0V4RkRjbmx3ZEhOdlpuUWdVSFI1SUV4MFpERWlNQ0FHQTFVRUN4TVpSRVZOVDA1VFZGSkJWRWxQVGlCQgorVGtRZ1ZFVlRWRWxPUnpFYk1Ca0dBMVVFQXhNU1JFVk5UeUJhUlZKUElGWkJURlZGSUVOQk1Gd3dEUVlKS29aSWh2Y05BUUVCCitCUUFEU3dBd1NBSkJBTCswRTJmTGVqM0ZTQ3dlMkEyaVJuTXVDM3oxMnFISXA2S3kxd28yelpjeGZ0N0FJK1Jma3JXclNHdGYKK21mekJFdVByTGRmdWxuY0M1WTFwTmNNOFJUVUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRUUZBQU5CQUdTYkxNcGhMNkY1cHAzcworOG8wWHloODZGSEZkcFZPd1l4MDlFTExrdUcxN1YvUDlwZ0ljMEVvL2dETWJOK0tUM0lkZ0VDZjhTLy9wQ1JBNlJyTmpjWEl4CitnZ0d6TUlJQnJ3SUJBVENCbVRDQmtqRUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xGMVpXVnVjMnhoYm1ReEVUQVAKK0JnTlZCQWNUQ0VKeWFYTmlZVzVsTVJvd0dBWURWUVFLRXhGRGNubHdkSE52Wm5RZ1VIUjVJRXgwWkRFaU1DQUdBMVVFQ3hNWgorUkVWTlQwNVRWRkpCVkVsUFRpQkJUa1FnVkVWVFZFbE9SekViTUJrR0ExVUVBeE1TUkVWTlR5QmFSVkpQSUZaQlRGVkZJRU5CCitBZ0lFZmpBSkJnVXJEZ01DR2dVQW9JR3hNQmdHQ1NxR1NJYjNEUUVKQXpFTEJna3Foa2lHOXcwQkJ3RXdIQVlKS29aSWh2Y04KK0FRa0ZNUThYRFRrNE1EVXhOREF6TkRBeU4xb3dJd1lKS29aSWh2Y05BUWtFTVJZRUZPS2NWOG1OWUpuTThySFFhamNTRXFKTgorcndkRE1GSUdDU3FHU0liM0RRRUpEekZGTUVNd0NnWUlLb1pJaHZjTkF3Y3dEZ1lJS29aSWh2Y05Bd0lDQWdDQU1BY0dCU3NPCitBd0lITUEwR0NDcUdTSWIzRFFNQ0FnRkFNQTBHQ0NxR1NJYjNEUU1DQWdFb01BMEdDU3FHU0liM0RRRUJBUVVBQkVBRFBFL04KK2NvSCt6VEZ1WDVZcG9sdXBUS3hLSzhlRWpjNDhUdUFEdU84YklISERFL2ZFWWFXdW5sd0R1VGxjRkpsMWlnMGlkZmZQQjFxQworWnA4U1NWVlkKKy0tLS0tLS0tLS0tLS0tbXNENzg2M0I4NEJENjFFMDJDNDA3RjJGNUUtLQorCisKK0Zyb20gYW5nZWxhQGMyLm5ldC5hdSBUaHUgTWF5IDE0IDE0OjA1OjMyIDE5OTgKK1gtVUlETDogYTdkNjI5YjRiOWFjYWNhZWU4YjM5MzcxYjg2MGEzMmEKK1JldHVybi1QYXRoOiBhbmdlbGFAYzIubmV0LmF1CitSZWNlaXZlZDogZnJvbSBjcnlwdHNvZnQuY29tIChwbGF5LmNyeXB0c29mdC5jb20gWzIwMy41Ni40NC4zXSkgYnkgcGFuZG9yYS5jcnlwdHNvZnQuY29tICg4LjguMy84LjcuMykgd2l0aCBFU01UUCBpZCBPQUEyODAzMyBmb3IgPHRqaEBjcnlwdHNvZnQuY29tPjsgVGh1LCAxNCBNYXkgMTk5OCAxNDowNTozMiArMTAwMCAoRVNUKQorTWVzc2FnZS1JRDogPDM1NUE2RjNCLkFDMzg1OTgxQGNyeXB0c29mdC5jb20+CitEYXRlOiBUaHUsIDE0IE1heSAxOTk4IDE0OjEyOjQzICsxMDAwCitGcm9tOiBBbmdlbGEgdmFuIExlbnQgPGFuZ2VsYUBjMi5uZXQuYXU+CitYLU1haWxlcjogTW96aWxsYSA0LjAzIFtlbl0gKFdpbjk1OyBVKQorTUlNRS1WZXJzaW9uOiAxLjAKK1RvOiB0amhAY3J5cHRzb2Z0LmNvbQorU3ViamVjdDogZW5jcnlwdGVkCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtcGtjczctbWltZTsgbmFtZT0ic21pbWUucDdtIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0ic21pbWUucDdtIgorQ29udGVudC1EZXNjcmlwdGlvbjogUy9NSU1FIEVuY3J5cHRlZCBNZXNzYWdlCitDb250ZW50LUxlbmd0aDogOTA1CitTdGF0dXM6IE9SCisKK01JQUdDU3FHU0liM0RRRUhBNkNBTUlBQ0FRQXhnZ0htTUlId0FnRUFNSUdaTUlHU01Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFRworQTFVRUNCTUtVWFZsWlc1emJHRnVaREVSTUE4R0ExVUVCeE1JUW5KcGMySmhibVV4R2pBWUJnTlZCQW9URVVOeWVYQjBjMjltCitkQ0JRZEhrZ1RIUmtNU0l3SUFZRFZRUUxFeGxFUlUxUFRsTlVVa0ZVU1U5T0lFRk9SQ0JVUlZOVVNVNUhNUnN3R1FZRFZRUUQKK0V4SkVSVTFQSUZwRlVrOGdWa0ZNVlVVZ1EwRUNBZ1IrTUEwR0NTcUdTSWIzRFFFQkFRVUFCRUE5Mk4yOVlrMzlSVVkydElWZAorZXhHVDJNRlgzSjZIOExCOGFEUkpqdzc4NDNBTGdKNXpYcE01K2Y4MFFrQVd3RU4yQTZQbDNWeGlDZUtMaTQzNXpYVnlNSUh3CitBZ0VBTUlHWk1JR1NNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNS1VYVmxaVzV6YkdGdVpERVJNQThHQTFVRUJ4TUkKK1FuSnBjMkpoYm1VeEdqQVlCZ05WQkFvVEVVTnllWEIwYzI5bWRDQlFkSGtnVEhSa01TSXdJQVlEVlFRTEV4bEVSVTFQVGxOVQorVWtGVVNVOU9JRUZPUkNCVVJWTlVTVTVITVJzd0dRWURWUVFERXhKRVJVMVBJRnBGVWs4Z1ZrRk1WVVVnUTBFQ0FnUnVNQTBHCitDU3FHU0liM0RRRUJBUVVBQkVDUjlJZnlIdHZuakZtWjhCMm9VQ0VzMXZ4TXNHMHUxa3hLRTRSTVBGeURxRENFQVJxN3pYTWcKK256U1VJN1dndjVVU1NLRHFjTFJKZVcranZZVVJ2L25KTUlBR0NTcUdTSWIzRFFFSEFUQWFCZ2dxaGtpRzl3MERBakFPQWdJQQorb0FRSXJMcXJpajJaTXBlZ2dBUW9pYnRuNnJlUlpXdVdrNUl2NUlBaGdpdHI4RVlFNHc0eVNRN0VNQjZtVGxCb0ZwY2NVTVdYCitCd1FnUW4xVW9XQ3ZZQWxoRHpVUmRidWk2NERjMHJTMnd0aitrRS9JblM2eTI1RUVFUGU0TlVLYUY4L1VsRStsbzNMdElMUUUKK0NMM3VWOGs3bTBpcUFBQUFBQUFBQUFBQUFBPT0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3Qvcy5wZW0gYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9zLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE5MjViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BrY3M3L3Qvcy5wZW0KQEAgLTAsMCArMSw1NyBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQk9nSUJBQUpCQUszbkk0bnVEWWUzbkRKRVM1V0JjOTBpZ0VzdHhXQzQvaDRZWSsvY2lZa2kzNVU4ZXRzOQorbWdhb0NOWXAvZTlCQ1pIdHZLMlkrZllva0dKdjUrY01UUXNDQXdFQUFRSkJBSUhwdlh2cUVjT0VvRFJSSHVJRworZmtjQjRqUEhjcjlLRTlUcHhhYkg2eHM5YmVONk9KbmtlUFhBSHdhejVNblVnU25icE9LcStjdzhtaUtqWHdlLworelZFQ0lRRFZMd25jVDJsUm1YYXJFWUh6YitxLzB1YVN2S2hXS0t0M2tKYXNMTlRyQXdJaEFORFVjL2dodXQyOQorcDNqSllqdXJ6VUt1Rzc3NC81ZUxqUExzeFBQSVp6TlpBaUEvMTBoU3E0MVVuR3FITEVVSVM5bTIvRWVFWmU3YgorYm01NjdkZlJVOU9uVlFJZ0RvOFJPclpYU2NoRUdiYW9nNUo1ci9GbGU4M3VPOGw5M1IzR3FWeEtYWmtDSUZmaworSVBENVBJWVFBeXlvZDNoeUtLemE3WlA0Q0dZNG9PZlpldGJrU0dHRworLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KK2lzc3VlciA6L0M9QVUvU1A9UXVlZW5zbGFuZC9MPUJyaXNiYW5lL089Q3J5cHRzb2Z0IFB0eSBMdGQvT1U9REVNT05TVFJBVElPTiBBTkQgVEVTVElORy9DTj1ERU1PIFpFUk8gVkFMVUUgQ0EKK3N1YmplY3Q6L0M9QVUvU1A9UXVlZW5zbGFuZC9MPUJyaXNiYW5lL089Q3J5cHRzb2Z0IFB0eSBMdGQvT1U9U01JTUUgMDAzL0NOPUluZm9ybWF0aW9uL0VtYWlsPWluZm9AY3J5cHRzb2Z0LmNvbQorc2VyaWFsIDowNDdECisKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMTE0OSAoMHg0N2QpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNXdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1BVSwgU1A9UXVlZW5zbGFuZCwgTD1CcmlzYmFuZSwgTz1DcnlwdHNvZnQgUHR5IEx0ZCwgT1U9REVNT05TVFJBVElPTiBBTkQgVEVTVElORywgQ049REVNTyBaRVJPIFZBTFVFIENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXkgMTMgMDU6NDA6NTggMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE1heSAxMiAwNTo0MDo1OCAyMDAwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPUFVLCBTUD1RdWVlbnNsYW5kLCBMPUJyaXNiYW5lLCBPPUNyeXB0c29mdCBQdHkgTHRkLCBPVT1TTUlNRSAwMDMsIENOPUluZm9ybWF0aW9uL0VtYWlsPWluZm9AY3J5cHRzb2Z0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICAgICAgTW9kdWx1czoKKyAgICAgICAgICAgICAgICAgICAgMDA6YWQ6ZTc6MjM6ODk6ZWU6MGQ6ODc6Yjc6OWM6MzI6NDQ6NGI6OTU6ODE6CisgICAgICAgICAgICAgICAgICAgIDczOmRkOjIyOjgwOjRiOjJkOmM1OjYwOmI4OmZlOjFlOjE4OjYzOmVmOmRjOgorICAgICAgICAgICAgICAgICAgICA4OTo4OToyMjpkZjo5NTozYzo3YTpkYjozZDo5YTowNjphODowODpkNjoyOToKKyAgICAgICAgICAgICAgICAgICAgZmQ6ZWY6NDE6MDk6OTE6ZWQ6YmM6YWQ6OTg6Zjk6ZjY6Mjg6OTA6NjI6NmY6CisgICAgICAgICAgICAgICAgICAgIGU3OmU3OjBjOjRkOjBiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIEdlbmVyYXRlZCB3aXRoIFNTTGVheQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNXdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDUyOjE1OmVhOjg4OmY0OmYwOmY5OjBiOmVmOmNlOmQ1OmY4OjgzOjQwOjYxOjE2OjVlOjU1OgorICAgICAgICBmOTpjZToyZDpkMTo4YjozMTo1YzowMzpjNjoyZDoxMDo3Yzo2MTpkNTo1YzowYTo0Mjo5NzoKKyAgICAgICAgZDE6ZmQ6NjU6YjY6YjY6ODQ6YTU6Mzk6ZWM6NDY6ZWM6ZmM6ZTA6MGQ6ZDk6MjI6ZGE6MWI6CisgICAgICAgIDUwOjc0OmFkOjkyOmNiOjRlOjkwOmU1OmZhOjdkCisKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1REQ0NBZmFnQXdJQkFnSUNCSDB3RFFZSktvWklodmNOQVFFRUJRQXdnWkl4Q3pBSkJnTlZCQVlUQWtGVgorTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdVpURWFNQmdHQTFVRQorQ2hNUlEzSjVjSFJ6YjJaMElGQjBlU0JNZEdReElqQWdCZ05WQkFzVEdVUkZUVTlPVTFSU1FWUkpUMDRnUVU1RQorSUZSRlUxUkpUa2N4R3pBWkJnTlZCQU1URWtSRlRVOGdXa1ZTVHlCV1FVeFZSU0JEUVRBZUZ3MDVPREExTVRNdworTlRRd05UaGFGdzB3TURBMU1USXdOVFF3TlRoYU1JR2VNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNSworVVhWbFpXNXpiR0Z1WkRFUk1BOEdBMVVFQnhNSVFuSnBjMkpoYm1VeEdqQVlCZ05WQkFvVEVVTnllWEIwYzI5bQorZENCUWRIa2dUSFJrTVJJd0VBWURWUVFMRXdsVFRVbE5SU0F3TURNeEZEQVNCZ05WQkFNVEMwbHVabTl5YldGMAorYVc5dU1TRXdId1lKS29aSWh2Y05BUWtCRmhKcGJtWnZRR055ZVhCMGMyOW1kQzVqYjIwd1hEQU5CZ2txaGtpRworOXcwQkFRRUZBQU5MQURCSUFrRUFyZWNqaWU0Tmg3ZWNNa1JMbFlGejNTS0FTeTNGWUxqK0hoaGo3OXlKaVNMZgorbFR4NjJ6MmFCcWdJMWluOTcwRUprZTI4clpqNTlpaVFZbS9uNXd4TkN3SURBUUFCb3lnd0pqQWtCZ2xnaGtnQgoraHZoQ0FRMEVGeFlWUjJWdVpYSmhkR1ZrSUhkcGRHZ2dVMU5NWldGNU1BMEdDU3FHU0liM0RRRUJCQVVBQTBFQQorVWhYcWlQVHcrUXZ2enRYNGcwQmhGbDVWK2M0dDBZc3hYQVBHTFJCOFlkVmNDa0tYMGYxbHRyYUVwVG5zUnV6OAorNEEzWkl0b2JVSFN0a3N0T2tPWDZmUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy90L3NlcnZlci5wZW0gYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9zZXJ2ZXIucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OWJhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdC9zZXJ2ZXIucGVtCkBAIC0wLDAgKzEsNTcgQEAKK2lzc3VlciA6L0M9QVUvU1A9UXVlZW5zbGFuZC9MPUJyaXNiYW5lL089Q3J5cHRzb2Z0IFB0eSBMdGQvT1U9REVNT05TVFJBVElPTiBBTkQgVEVTVElORy9DTj1ERU1PIFpFUk8gVkFMVUUgQ0EKK3N1YmplY3Q6L0M9QVUvU1A9UXVlZW5zbGFuZC9MPUJyaXNiYW5lL089Q3J5cHRzb2Z0IFB0eSBMdGQvT1U9U01JTUUgMDAzL0NOPUluZm9ybWF0aW9uL0VtYWlsPWluZm9AY3J5cHRzb2Z0LmNvbQorc2VyaWFsIDowNDdECisKK0NlcnRpZmljYXRlOgorICAgIERhdGE6CisgICAgICAgIFZlcnNpb246IDMgKDB4MikKKyAgICAgICAgU2VyaWFsIE51bWJlcjogMTE0OSAoMHg0N2QpCisgICAgICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNXdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIElzc3VlcjogQz1BVSwgU1A9UXVlZW5zbGFuZCwgTD1CcmlzYmFuZSwgTz1DcnlwdHNvZnQgUHR5IEx0ZCwgT1U9REVNT05TVFJBVElPTiBBTkQgVEVTVElORywgQ049REVNTyBaRVJPIFZBTFVFIENBCisgICAgICAgIFZhbGlkaXR5CisgICAgICAgICAgICBOb3QgQmVmb3JlOiBNYXkgMTMgMDU6NDA6NTggMTk5OCBHTVQKKyAgICAgICAgICAgIE5vdCBBZnRlciA6IE1heSAxMiAwNTo0MDo1OCAyMDAwIEdNVAorICAgICAgICBTdWJqZWN0OiBDPUFVLCBTUD1RdWVlbnNsYW5kLCBMPUJyaXNiYW5lLCBPPUNyeXB0c29mdCBQdHkgTHRkLCBPVT1TTUlNRSAwMDMsIENOPUluZm9ybWF0aW9uL0VtYWlsPWluZm9AY3J5cHRzb2Z0LmNvbQorICAgICAgICBTdWJqZWN0IFB1YmxpYyBLZXkgSW5mbzoKKyAgICAgICAgICAgIFB1YmxpYyBLZXkgQWxnb3JpdGhtOiByc2FFbmNyeXB0aW9uCisgICAgICAgICAgICAgICAgTW9kdWx1czoKKyAgICAgICAgICAgICAgICAgICAgMDA6YWQ6ZTc6MjM6ODk6ZWU6MGQ6ODc6Yjc6OWM6MzI6NDQ6NGI6OTU6ODE6CisgICAgICAgICAgICAgICAgICAgIDczOmRkOjIyOjgwOjRiOjJkOmM1OjYwOmI4OmZlOjFlOjE4OjYzOmVmOmRjOgorICAgICAgICAgICAgICAgICAgICA4OTo4OToyMjpkZjo5NTozYzo3YTpkYjozZDo5YTowNjphODowODpkNjoyOToKKyAgICAgICAgICAgICAgICAgICAgZmQ6ZWY6NDE6MDk6OTE6ZWQ6YmM6YWQ6OTg6Zjk6ZjY6Mjg6OTA6NjI6NmY6CisgICAgICAgICAgICAgICAgICAgIGU3OmU3OjBjOjRkOjBiCisgICAgICAgICAgICAgICAgRXhwb25lbnQ6IDY1NTM3ICgweDEwMDAxKQorICAgICAgICBYNTA5djMgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIE5ldHNjYXBlIENvbW1lbnQ6IAorICAgICAgICAgICAgICAgIEdlbmVyYXRlZCB3aXRoIFNTTGVheQorICAgIFNpZ25hdHVyZSBBbGdvcml0aG06IG1kNXdpdGhSU0FFbmNyeXB0aW9uCisgICAgICAgIDUyOjE1OmVhOjg4OmY0OmYwOmY5OjBiOmVmOmNlOmQ1OmY4OjgzOjQwOjYxOjE2OjVlOjU1OgorICAgICAgICBmOTpjZToyZDpkMTo4YjozMTo1YzowMzpjNjoyZDoxMDo3Yzo2MTpkNTo1YzowYTo0Mjo5NzoKKyAgICAgICAgZDE6ZmQ6NjU6YjY6YjY6ODQ6YTU6Mzk6ZWM6NDY6ZWM6ZmM6ZTA6MGQ6ZDk6MjI6ZGE6MWI6CisgICAgICAgIDUwOjc0OmFkOjkyOmNiOjRlOjkwOmU1OmZhOjdkCisKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1REQ0NBZmFnQXdJQkFnSUNCSDB3RFFZSktvWklodmNOQVFFRUJRQXdnWkl4Q3pBSkJnTlZCQVlUQWtGVgorTVJNd0VRWURWUVFJRXdwUmRXVmxibk5zWVc1a01SRXdEd1lEVlFRSEV3aENjbWx6WW1GdVpURWFNQmdHQTFVRQorQ2hNUlEzSjVjSFJ6YjJaMElGQjBlU0JNZEdReElqQWdCZ05WQkFzVEdVUkZUVTlPVTFSU1FWUkpUMDRnUVU1RQorSUZSRlUxUkpUa2N4R3pBWkJnTlZCQU1URWtSRlRVOGdXa1ZTVHlCV1FVeFZSU0JEUVRBZUZ3MDVPREExTVRNdworTlRRd05UaGFGdzB3TURBMU1USXdOVFF3TlRoYU1JR2VNUXN3Q1FZRFZRUUdFd0pCVlRFVE1CRUdBMVVFQ0JNSworVVhWbFpXNXpiR0Z1WkRFUk1BOEdBMVVFQnhNSVFuSnBjMkpoYm1VeEdqQVlCZ05WQkFvVEVVTnllWEIwYzI5bQorZENCUWRIa2dUSFJrTVJJd0VBWURWUVFMRXdsVFRVbE5SU0F3TURNeEZEQVNCZ05WQkFNVEMwbHVabTl5YldGMAorYVc5dU1TRXdId1lKS29aSWh2Y05BUWtCRmhKcGJtWnZRR055ZVhCMGMyOW1kQzVqYjIwd1hEQU5CZ2txaGtpRworOXcwQkFRRUZBQU5MQURCSUFrRUFyZWNqaWU0Tmg3ZWNNa1JMbFlGejNTS0FTeTNGWUxqK0hoaGo3OXlKaVNMZgorbFR4NjJ6MmFCcWdJMWluOTcwRUprZTI4clpqNTlpaVFZbS9uNXd4TkN3SURBUUFCb3lnd0pqQWtCZ2xnaGtnQgoraHZoQ0FRMEVGeFlWUjJWdVpYSmhkR1ZrSUhkcGRHZ2dVMU5NWldGNU1BMEdDU3FHU0liM0RRRUJCQVVBQTBFQQorVWhYcWlQVHcrUXZ2enRYNGcwQmhGbDVWK2M0dDBZc3hYQVBHTFJCOFlkVmNDa0tYMGYxbHRyYUVwVG5zUnV6OAorNEEzWkl0b2JVSFN0a3N0T2tPWDZmUT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUJPZ0lCQUFKQkFLM25JNG51RFllM25ESkVTNVdCYzkwaWdFc3R4V0M0L2g0WVkrL2NpWWtpMzVVOGV0czkKK21nYW9DTllwL2U5QkNaSHR2SzJZK2ZZb2tHSnY1K2NNVFFzQ0F3RUFBUUpCQUlIcHZYdnFFY09Fb0RSUkh1SUcKK2ZrY0I0alBIY3I5S0U5VHB4YWJINnhzOWJlTjZPSm5rZVBYQUh3YXo1TW5VZ1NuYnBPS3ErY3c4bWlLalh3ZS8KK3pWRUNJUURWTHduY1QybFJtWGFyRVlIemIrcS8wdWFTdktoV0tLdDNrSmFzTE5UckF3SWhBTkRVYy9naHV0MjkKK3AzakpZanVyelVLdUc3NzQvNWVMalBMc3hQUElaek5aQWlBLzEwaFNxNDFVbkdxSExFVUlTOW0yL0VlRVplN2IKK2JtNTY3ZGZSVTlPblZRSWdEbzhST3JaWFNjaEVHYmFvZzVKNXIvRmxlODN1TzhsOTNSM0dxVnhLWFprQ0lGZmsKK0lQRDVQSVlRQXl5b2QzaHlLS3phN1pQNENHWTRvT2ZaZXRia1NHR0cKKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdmVyaWZ5LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcGtjczcvdmVyaWZ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwZjI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wa2NzNy92ZXJpZnkuYwpAQCAtMCwwICsxLDI2MyBAQAorLyogY3J5cHRvL3BrY3M3L3ZlcmlmeS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlICJleGFtcGxlLmgiCisKK2ludCB2ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KTsKKworQklPICpiaW9fZXJyPU5VTEw7CitCSU8gKmJpb19vdXQ9TlVMTDsKKworaW50IG1haW4oYXJnYyxhcmd2KQoraW50IGFyZ2M7CitjaGFyICphcmd2W107CisJeworCVBLQ1M3ICpwNzsKKwlQS0NTN19TSUdORVJfSU5GTyAqc2k7CisJWDUwOV9TVE9SRV9DVFggY2VydF9jdHg7CisJWDUwOV9TVE9SRSAqY2VydF9zdG9yZT1OVUxMOworCUJJTyAqZGF0YSwqZGV0YWNoZWQ9TlVMTCwqcDdiaW89TlVMTDsKKwljaGFyIGJ1ZlsxMDI0KjRdOworCWNoYXIgKnBwOworCWludCBpLHByaW50aXQ9MDsKKwlTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykgKnNrOworCisJYmlvX2Vycj1CSU9fbmV3X2ZwKHN0ZGVycixCSU9fTk9DTE9TRSk7CisJYmlvX291dD1CSU9fbmV3X2ZwKHN0ZG91dCxCSU9fTk9DTE9TRSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fTUQyCisJRVZQX2FkZF9kaWdlc3QoRVZQX21kMigpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01ENQorCUVWUF9hZGRfZGlnZXN0KEVWUF9tZDUoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEExCisJRVZQX2FkZF9kaWdlc3QoRVZQX3NoYTEoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NREMyCisJRVZQX2FkZF9kaWdlc3QoRVZQX21kYzIoKSk7CisjZW5kaWYKKworCWRhdGE9QklPX25ldyhCSU9fc19maWxlKCkpOworCisJcHA9TlVMTDsKKwl3aGlsZSAoYXJnYyA+IDEpCisJCXsKKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCWlmIChzdHJjbXAoYXJndlswXSwiLXAiKSA9PSAwKQorCQkJeworCQkJcHJpbnRpdD0xOworCQkJfQorCQllbHNlIGlmICgoc3RyY21wKGFyZ3ZbMF0sIi1kIikgPT0gMCkgJiYgKGFyZ2MgPj0gMikpCisJCQl7CisJCQlkZXRhY2hlZD1CSU9fbmV3KEJJT19zX2ZpbGUoKSk7CisJCQlpZiAoIUJJT19yZWFkX2ZpbGVuYW1lKGRldGFjaGVkLGFyZ3ZbMV0pKQorCQkJCWdvdG8gZXJyOworCQkJYXJnYy0tOworCQkJYXJndisrOworCQkJfQorCQllbHNlCisJCQl7CisJCQlwcD1hcmd2WzBdOworCQkJaWYgKCFCSU9fcmVhZF9maWxlbmFtZShkYXRhLGFyZ3ZbMF0pKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAocHAgPT0gTlVMTCkKKwkJQklPX3NldF9mcChkYXRhLHN0ZGluLEJJT19OT0NMT1NFKTsKKworCisJLyogTG9hZCB0aGUgUEtDUzcgb2JqZWN0IGZyb20gYSBmaWxlICovCisJaWYgKChwNz1QRU1fcmVhZF9iaW9fUEtDUzcoZGF0YSxOVUxMLE5VTEwsTlVMTCkpID09IE5VTEwpIGdvdG8gZXJyOworCisJLyogVGhpcyBzdHVmZiBpcyBiZWluZyBzZXR1cCBmb3IgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLgorCSAqIFdoZW4gdXNpbmcgU1NMLCBpdCBjb3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgCisJICogY2VydF9zdHJlPVNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoc3NsX2N0eCk7ICovCisJY2VydF9zdG9yZT1YNTA5X1NUT1JFX25ldygpOworCVg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoY2VydF9zdG9yZSk7CisJWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjZXJ0X3N0b3JlLE5VTEwsIi4uLy4uL2NlcnRzIik7CisJWDUwOV9TVE9SRV9zZXRfdmVyaWZ5X2NiX2Z1bmMoY2VydF9zdG9yZSx2ZXJpZnlfY2FsbGJhY2spOworCisJRVJSX2NsZWFyX2Vycm9yKCk7CisKKwkvKiBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIGRhdGEgKi8KKwlpZiAoKFBLQ1M3X2dldF9kZXRhY2hlZChwNykgfHwgZGV0YWNoZWQpKQorCQl7CisJCWlmIChkZXRhY2hlZCA9PSBOVUxMKQorCQkJeworCQkJcHJpbnRmKCJubyBkYXRhIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlIG9uXG4iKTsKKwkJCWV4aXQoMSk7CisJCQl9CisJCWVsc2UKKwkJCXA3YmlvPVBLQ1M3X2RhdGFJbml0KHA3LGRldGFjaGVkKTsKKwkJfQorCWVsc2UKKwkJeworCQlwN2Jpbz1QS0NTN19kYXRhSW5pdChwNyxOVUxMKTsKKwkJfQorCisJLyogV2Ugbm93IGhhdmUgdG8gJ3JlYWQnIGZyb20gcDdiaW8gdG8gY2FsY3VsYXRlIGRpZ2VzdHMgZXRjLiAqLworCWZvciAoOzspCisJCXsKKwkJaT1CSU9fcmVhZChwN2JpbyxidWYsc2l6ZW9mKGJ1ZikpOworCQkvKiBwcmludCBpdD8gKi8KKwkJaWYgKGkgPD0gMCkgYnJlYWs7CisJCX0KKworCS8qIFdlIGNhbiBub3cgdmVyaWZ5IHNpZ25hdHVyZXMgKi8KKwlzaz1QS0NTN19nZXRfc2lnbmVyX2luZm8ocDcpOworCWlmIChzayA9PSBOVUxMKQorCQl7CisJCXByaW50ZigidGhlcmUgYXJlIG5vIHNpZ25hdHVyZXMgb24gdGhpcyBkYXRhXG4iKTsKKwkJZXhpdCgxKTsKKwkJfQorCisJLyogT2ssIGZpcnN0IHdlIG5lZWQgdG8sIGZvciBlYWNoIHN1YmplY3QgZW50cnksIHNlZSBpZiB3ZSBjYW4gdmVyaWZ5ICovCisJZm9yIChpPTA7IGk8c2tfUEtDUzdfU0lHTkVSX0lORk9fbnVtKHNrKTsgaSsrKQorCQl7CisJCUFTTjFfVVRDVElNRSAqdG07CisJCWNoYXIgKnN0cjEsKnN0cjI7CisJCWludCByYzsKKworCQlzaT1za19QS0NTN19TSUdORVJfSU5GT192YWx1ZShzayxpKTsKKwkJcmM9UEtDUzdfZGF0YVZlcmlmeShjZXJ0X3N0b3JlLCZjZXJ0X2N0eCxwN2JpbyxwNyxzaSk7CisJCWlmIChyYyA8PSAwKQorCQkJZ290byBlcnI7CisJCXByaW50Zigic2lnbmVyIGluZm9cbiIpOworCQlpZiAoKHRtPWdldF9zaWduZWRfdGltZShzaSkpICE9IE5VTEwpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19vdXQsIlNpZ25lZCB0aW1lOiIpOworCQkJQVNOMV9VVENUSU1FX3ByaW50KGJpb19vdXQsdG0pOworCQkJQVNOMV9VVENUSU1FX2ZyZWUodG0pOworCQkJQklPX3ByaW50ZihiaW9fb3V0LCJcbiIpOworCQkJfQorCQlpZiAoZ2V0X3NpZ25lZF9zZXEyc3RyaW5nKHNpLCZzdHIxLCZzdHIyKSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX291dCwiU3RyaW5nIDEgaXMgJXNcbiIsc3RyMSk7CisJCQlCSU9fcHJpbnRmKGJpb19vdXQsIlN0cmluZyAyIGlzICVzXG4iLHN0cjIpOworCQkJfQorCisJCX0KKworCVg1MDlfU1RPUkVfZnJlZShjZXJ0X3N0b3JlKTsKKworCXByaW50ZigiZG9uZVxuIik7CisJZXhpdCgwKTsKK2VycjoKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCUVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKwlleGl0KDEpOworCX0KKworLyogc2hvdWxkIGJlIFg1MDkgKiBidXQgd2UgY2FuIGp1c3QgaGF2ZSB0aGVtIGFzIGNoYXIgKi4gKi8KK2ludCB2ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwljaGFyIGJ1ZlsyNTZdOworCVg1MDkgKmVycl9jZXJ0OworCWludCBlcnIsZGVwdGg7CisKKwllcnJfY2VydD1YNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KGN0eCk7CisJZXJyPQlYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoY3R4KTsKKwlkZXB0aD0JWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKGN0eCk7CisKKwlYNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoZXJyX2NlcnQpLGJ1ZiwyNTYpOworCUJJT19wcmludGYoYmlvX2VyciwiZGVwdGg9JWQgJXNcbiIsZGVwdGgsYnVmKTsKKwlpZiAoIW9rKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwidmVyaWZ5IGVycm9yOm51bT0lZDolc1xuIixlcnIsCisJCQlYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhlcnIpKTsKKwkJaWYgKGRlcHRoIDwgNikKKwkJCXsKKwkJCW9rPTE7CisJCQlYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY3R4LFg1MDlfVl9PSyk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW9rPTA7CisJCQlYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoY3R4LFg1MDlfVl9FUlJfQ0VSVF9DSEFJTl9UT09fTE9ORyk7CisJCQl9CisJCX0KKwlzd2l0Y2ggKGN0eC0+ZXJyb3IpCisJCXsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVDoKKwkJWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfaXNzdWVyX25hbWUoY3R4LT5jdXJyZW50X2NlcnQpLGJ1ZiwyNTYpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsImlzc3Vlcj0gJXNcbiIsYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfTk9UX1lFVF9WQUxJRDoKKwljYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVGT1JFX0ZJRUxEOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vdEJlZm9yZT0iKTsKKwkJQVNOMV9VVENUSU1FX3ByaW50KGJpb19lcnIsWDUwOV9nZXRfbm90QmVmb3JlKGN0eC0+Y3VycmVudF9jZXJ0KSk7CisJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQ6CisJY2FzZSBYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxEOgorCQlCSU9fcHJpbnRmKGJpb19lcnIsIm5vdEFmdGVyPSIpOworCQlBU04xX1VUQ1RJTUVfcHJpbnQoYmlvX2VycixYNTA5X2dldF9ub3RBZnRlcihjdHgtPmN1cnJlbnRfY2VydCkpOworCQlCSU9fcHJpbnRmKGJpb19lcnIsIlxuIik7CisJCWJyZWFrOworCQl9CisJQklPX3ByaW50ZihiaW9fZXJyLCJ2ZXJpZnkgcmV0dXJuOiVkXG4iLG9rKTsKKwlyZXR1cm4ob2spOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9wcGNjcHVpZC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9wcGNjcHVpZC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjllMWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BwY2NwdWlkLnBsCkBAIC0wLDAgKzEsOTYgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworJGZsYXZvdXIgPSBzaGlmdDsKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKKyggJHhsYXRlPSIke2Rpcn1wcGMteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgorKCAkeGxhdGU9IiR7ZGlyfXBlcmxhc20vcHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgorZGllICJjYW4ndCBsb2NhdGUgcHBjLXhsYXRlLnBsIjsKKworb3BlbiBTVERPVVQsInwgJF5YICR4bGF0ZSAkZmxhdm91ciAiLnNoaWZ0IHx8IGRpZSAiY2FuJ3QgY2FsbCAkeGxhdGU6ICQhIjsKKworaWYgKCRmbGF2b3VyPX4vNjQvKSB7CisgICAgJENNUExJPSJjbXBsZGkiOworICAgICRTSFJMST0ic3JkaSI7CisgICAgJFNJR05YPSJleHRzdyI7Cit9IGVsc2UgeworICAgICRDTVBMST0iY21wbHdpIjsKKyAgICAkU0hSTEk9InNyd2kiOworICAgICRTSUdOWD0ibXIiOworfQorCiskY29kZT08PF9fXzsKKy5tYWNoaW5lCSJhbnkiCisudGV4dAorCisuZ2xvYmwJLk9QRU5TU0xfY3B1aWRfc2V0dXAKKy5hbGlnbgk0CisuT1BFTlNTTF9jcHVpZF9zZXR1cDoKKwlibHIKKworLmdsb2JsCS5PUEVOU1NMX3dpcGVfY3B1CisuYWxpZ24JNAorLk9QRU5TU0xfd2lwZV9jcHU6CisJeG9yCXIwLHIwLHIwCisJbXIJcjMscjEKKwl4b3IJcjQscjQscjQKKwl4b3IJcjUscjUscjUKKwl4b3IJcjYscjYscjYKKwl4b3IJcjcscjcscjcKKwl4b3IJcjgscjgscjgKKwl4b3IJcjkscjkscjkKKwl4b3IJcjEwLHIxMCxyMTAKKwl4b3IJcjExLHIxMSxyMTEKKwl4b3IJcjEyLHIxMixyMTIKKwlibHIKKworLmdsb2JsCS5PUEVOU1NMX2F0b21pY19hZGQKKy5hbGlnbgk0CisuT1BFTlNTTF9hdG9taWNfYWRkOgorTG9vcDoJbHdhcngJcjUsMCxyMworCWFkZAlyMCxyNCxyNQorCXN0d2N4LglyMCwwLHIzCisJYm5lLQlMb29wCisJJFNJR05YCXIzLHIwCisJYmxyCisKKy5nbG9ibAkuT1BFTlNTTF9yZHRzYworLmFsaWduCTQKKy5PUEVOU1NMX3JkdHNjOgorCW1mdGIJcjMKKwltZnRidQlyNAorCWJscgorCisuZ2xvYmwJLk9QRU5TU0xfY2xlYW5zZQorLmFsaWduCTQKKy5PUEVOU1NMX2NsZWFuc2U6CisJJENNUExJCXI0LDcKKwlsaQlyMCwwCisJYmdlCUxvdAorCSRDTVBMSQlyNCwwCisJYmVxbHItCitMaXR0bGU6CW10Y3RyCXI0CisJc3RiCXIwLDAocjMpCisJYWRkaQlyMyxyMywxCisJYmRuei0JXCQtOAorCWJscgorTG90OglhbmRpLglyNSxyMywzCisJYmVxCUxhbGlnbmVkCisJc3RiCXIwLDAocjMpCisJc3ViaQlyNCxyNCwxCisJYWRkaQlyMyxyMywxCisJYglMb3QKK0xhbGlnbmVkOgorCSRTSFJMSQlyNSxyNCwyCisJbXRjdHIJcjUKKwlzdHcJcjAsMChyMykKKwlhZGRpCXIzLHIzLDQKKwliZG56LQlcJC04CisJYW5kaS4JcjQscjQsMworCWJuZQlMaXR0bGUKKwlibHIKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BxdWV1ZS9wcV90ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcHF1ZXVlL3BxX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ5NmRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BxdWV1ZS9wcV90ZXN0LmMKQEAgLTAsMCArMSw5NSBAQAorLyogY3J5cHRvL3BxdWV1ZS9wcV90ZXN0LmMgKi8KKy8qIAorICogRFRMUyBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IE5hZ2VuZHJhIE1vZGFkdWd1CisgKiAobmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDA1LiAgCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAicHF1ZXVlLmgiCisKK2ludAorbWFpbih2b2lkKQorCXsKKwlwaXRlbSAqaXRlbTsKKwlwcXVldWUgcHE7CisKKwlwcSA9IHBxdWV1ZV9uZXcoKTsKKworCWl0ZW0gPSBwaXRlbV9uZXcoMywgTlVMTCk7CisJcHF1ZXVlX2luc2VydChwcSwgaXRlbSk7CisKKwlpdGVtID0gcGl0ZW1fbmV3KDEsIE5VTEwpOworCXBxdWV1ZV9pbnNlcnQocHEsIGl0ZW0pOworCisJaXRlbSA9IHBpdGVtX25ldygyLCBOVUxMKTsKKwlwcXVldWVfaW5zZXJ0KHBxLCBpdGVtKTsKKworCWl0ZW0gPSBwcXVldWVfZmluZChwcSwgMSk7CisJZnByaW50ZihzdGRlcnIsICJmb3VuZCAlbGRcbiIsIGl0ZW0tPnByaW9yaXR5KTsKKworCWl0ZW0gPSBwcXVldWVfZmluZChwcSwgMik7CisJZnByaW50ZihzdGRlcnIsICJmb3VuZCAlbGRcbiIsIGl0ZW0tPnByaW9yaXR5KTsKKworCWl0ZW0gPSBwcXVldWVfZmluZChwcSwgMyk7CisJZnByaW50ZihzdGRlcnIsICJmb3VuZCAlbGRcbiIsIGl0ZW0gPyBpdGVtLT5wcmlvcml0eTogMCk7CisKKwlwcXVldWVfcHJpbnQocHEpOworCisJZm9yKGl0ZW0gPSBwcXVldWVfcG9wKHBxKTsgaXRlbSAhPSBOVUxMOyBpdGVtID0gcHF1ZXVlX3BvcChwcSkpCisJCXBpdGVtX2ZyZWUoaXRlbSk7CisKKwlwcXVldWVfZnJlZShwcSk7CisJcmV0dXJuIDA7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3BxdWV1ZS9wcXVldWUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wcXVldWUvcHF1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhNmZiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9wcXVldWUvcHF1ZXVlLmMKQEAgLTAsMCArMSwyNTMgQEAKKy8qIGNyeXB0by9wcXVldWUvcHF1ZXVlLmMgKi8KKy8qIAorICogRFRMUyBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IE5hZ2VuZHJhIE1vZGFkdWd1CisgKiAobmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDA1LiAgCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSAicHF1ZXVlLmgiCisKK3R5cGVkZWYgc3RydWN0IF9wcXVldWUKKwl7CisJcGl0ZW0gKml0ZW1zOworCWludCBjb3VudDsKKwl9IHBxdWV1ZV9zOworCitwaXRlbSAqCitwaXRlbV9uZXcodW5zaWduZWQgY2hhciAqcHJpbzY0YmUsIHZvaWQgKmRhdGEpCisJeworCXBpdGVtICppdGVtID0gKHBpdGVtICopIE9QRU5TU0xfbWFsbG9jKHNpemVvZihwaXRlbSkpOworCWlmIChpdGVtID09IE5VTEwpIHJldHVybiBOVUxMOworCisJbWVtY3B5KGl0ZW0tPnByaW9yaXR5LHByaW82NGJlLHNpemVvZihpdGVtLT5wcmlvcml0eSkpOworCisJaXRlbS0+ZGF0YSA9IGRhdGE7CisJaXRlbS0+bmV4dCA9IE5VTEw7CisKKwlyZXR1cm4gaXRlbTsKKwl9CisKK3ZvaWQKK3BpdGVtX2ZyZWUocGl0ZW0gKml0ZW0pCisJeworCWlmIChpdGVtID09IE5VTEwpIHJldHVybjsKKworCU9QRU5TU0xfZnJlZShpdGVtKTsKKwl9CisKK3BxdWV1ZV9zICoKK3BxdWV1ZV9uZXcoKQorCXsKKwlwcXVldWVfcyAqcHEgPSAocHF1ZXVlX3MgKikgT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKHBxdWV1ZV9zKSk7CisJaWYgKHBxID09IE5VTEwpIHJldHVybiBOVUxMOworCisJbWVtc2V0KHBxLCAweDAwLCBzaXplb2YocHF1ZXVlX3MpKTsKKwlyZXR1cm4gcHE7CisJfQorCit2b2lkCitwcXVldWVfZnJlZShwcXVldWVfcyAqcHEpCisJeworCWlmIChwcSA9PSBOVUxMKSByZXR1cm47CisKKwlPUEVOU1NMX2ZyZWUocHEpOworCX0KKworcGl0ZW0gKgorcHF1ZXVlX2luc2VydChwcXVldWVfcyAqcHEsIHBpdGVtICppdGVtKQorCXsKKwlwaXRlbSAqY3VyciwgKm5leHQ7CisKKwlpZiAocHEtPml0ZW1zID09IE5VTEwpCisJCXsKKwkJcHEtPml0ZW1zID0gaXRlbTsKKwkJcmV0dXJuIGl0ZW07CisJCX0KKworCWZvcihjdXJyID0gTlVMTCwgbmV4dCA9IHBxLT5pdGVtczsgCisJCW5leHQgIT0gTlVMTDsKKwkJY3VyciA9IG5leHQsIG5leHQgPSBuZXh0LT5uZXh0KQorCQl7CisJCS8qIHdlIGNhbiBjb21wYXJlIDY0LWJpdCB2YWx1ZSBpbiBiaWctZW5kaWFuIGVuY29kaW5nCisJCSAqIHdpdGggbWVtY21wOi0pICovCisJCWludCBjbXAgPSBtZW1jbXAobmV4dC0+cHJpb3JpdHksIGl0ZW0tPnByaW9yaXR5LDgpOworCQlpZiAoY21wID4gMCkJCS8qIG5leHQgPiBpdGVtICovCisJCQl7CisJCQlpdGVtLT5uZXh0ID0gbmV4dDsKKworCQkJaWYgKGN1cnIgPT0gTlVMTCkgCisJCQkJcHEtPml0ZW1zID0gaXRlbTsKKwkJCWVsc2UgIAorCQkJCWN1cnItPm5leHQgPSBpdGVtOworCisJCQlyZXR1cm4gaXRlbTsKKwkJCX0KKwkJCisJCWVsc2UgaWYgKGNtcCA9PSAwKQkvKiBkdXBsaWNhdGVzIG5vdCBhbGxvd2VkICovCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJaXRlbS0+bmV4dCA9IE5VTEw7CisJY3Vyci0+bmV4dCA9IGl0ZW07CisKKwlyZXR1cm4gaXRlbTsKKwl9CisKK3BpdGVtICoKK3BxdWV1ZV9wZWVrKHBxdWV1ZV9zICpwcSkKKwl7CisJcmV0dXJuIHBxLT5pdGVtczsKKwl9CisKK3BpdGVtICoKK3BxdWV1ZV9wb3AocHF1ZXVlX3MgKnBxKQorCXsKKwlwaXRlbSAqaXRlbSA9IHBxLT5pdGVtczsKKworCWlmIChwcS0+aXRlbXMgIT0gTlVMTCkKKwkJcHEtPml0ZW1zID0gcHEtPml0ZW1zLT5uZXh0OworCisJcmV0dXJuIGl0ZW07CisJfQorCitwaXRlbSAqCitwcXVldWVfZmluZChwcXVldWVfcyAqcHEsIHVuc2lnbmVkIGNoYXIgKnByaW82NGJlKQorCXsKKwlwaXRlbSAqbmV4dCwgKnByZXYgPSBOVUxMOworCXBpdGVtICpmb3VuZCA9IE5VTEw7CisKKwlpZiAoIHBxLT5pdGVtcyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoIG5leHQgPSBwcS0+aXRlbXM7IG5leHQtPm5leHQgIT0gTlVMTDsgCisJCSAgcHJldiA9IG5leHQsIG5leHQgPSBuZXh0LT5uZXh0KQorCQl7CisJCWlmICggbWVtY21wKG5leHQtPnByaW9yaXR5LCBwcmlvNjRiZSw4KSA9PSAwKQorCQkJeworCQkJZm91bmQgPSBuZXh0OworCQkJYnJlYWs7CisJCQl9CisJCX0KKwkKKwkvKiBjaGVjayB0aGUgb25lIGxhc3Qgbm9kZSAqLworCWlmICggbWVtY21wKG5leHQtPnByaW9yaXR5LCBwcmlvNjRiZSw4KSA9PTApCisJCWZvdW5kID0gbmV4dDsKKworCWlmICggISBmb3VuZCkKKwkJcmV0dXJuIE5VTEw7CisKKyNpZiAwIC8qIGZpbmQgd29ya3MgaW4gcGVlayBtb2RlICovCisJaWYgKCBwcmV2ID09IE5VTEwpCisJCXBxLT5pdGVtcyA9IG5leHQtPm5leHQ7CisJZWxzZQorCQlwcmV2LT5uZXh0ID0gbmV4dC0+bmV4dDsKKyNlbmRpZgorCisJcmV0dXJuIGZvdW5kOworCX0KKwordm9pZAorcHF1ZXVlX3ByaW50KHBxdWV1ZV9zICpwcSkKKwl7CisJcGl0ZW0gKml0ZW0gPSBwcS0+aXRlbXM7CisKKwl3aGlsZShpdGVtICE9IE5VTEwpCisJCXsKKwkJcHJpbnRmKCJpdGVtXHQlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCWl0ZW0tPnByaW9yaXR5WzBdLGl0ZW0tPnByaW9yaXR5WzFdLAorCQkJaXRlbS0+cHJpb3JpdHlbMl0saXRlbS0+cHJpb3JpdHlbM10sCisJCQlpdGVtLT5wcmlvcml0eVs0XSxpdGVtLT5wcmlvcml0eVs1XSwKKwkJCWl0ZW0tPnByaW9yaXR5WzZdLGl0ZW0tPnByaW9yaXR5WzddKTsKKwkJaXRlbSA9IGl0ZW0tPm5leHQ7CisJCX0KKwl9CisKK3BpdGVtICoKK3BxdWV1ZV9pdGVyYXRvcihwcXVldWVfcyAqcHEpCisJeworCXJldHVybiBwcXVldWVfcGVlayhwcSk7CisJfQorCitwaXRlbSAqCitwcXVldWVfbmV4dChwaXRlbSAqKml0ZW0pCisJeworCXBpdGVtICpyZXQ7CisKKwlpZiAoIGl0ZW0gPT0gTlVMTCB8fCAqaXRlbSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCisJLyogKml0ZW0gIT0gTlVMTCAqLworCXJldCA9ICppdGVtOworCSppdGVtID0gKCppdGVtKS0+bmV4dDsKKworCXJldHVybiByZXQ7CisJfQorCitpbnQKK3BxdWV1ZV9zaXplKHBxdWV1ZV9zICpwcSkKK3sKKwlwaXRlbSAqaXRlbSA9IHBxLT5pdGVtczsKKwlpbnQgY291bnQgPSAwOworCQorCXdoaWxlKGl0ZW0gIT0gTlVMTCkKKwl7CisJCWNvdW50Kys7CisJCWl0ZW0gPSBpdGVtLT5uZXh0OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcHF1ZXVlL3BxdWV1ZS5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3BxdWV1ZS9wcXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZjOTAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3BxdWV1ZS9wcXVldWUuaApAQCAtMCwwICsxLDk0IEBACisvKiBjcnlwdG8vcHF1ZXVlL3BxdWV1ZS5oICovCisvKiAKKyAqIERUTFMgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBOYWdlbmRyYSBNb2RhZHVndQorICogKG5hZ2VuZHJhQGNzLnN0YW5mb3JkLmVkdSkgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QgMjAwNS4gIAorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfUFFVRVVFX0gKKyNkZWZpbmUgSEVBREVSX1BRVUVVRV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCit0eXBlZGVmIHN0cnVjdCBfcHF1ZXVlICpwcXVldWU7CisKK3R5cGVkZWYgc3RydWN0IF9waXRlbQorCXsKKwl1bnNpZ25lZCBjaGFyIHByaW9yaXR5WzhdOyAvKiA2NC1iaXQgdmFsdWUgaW4gYmlnLWVuZGlhbiBlbmNvZGluZyAqLworCXZvaWQgKmRhdGE7CisJc3RydWN0IF9waXRlbSAqbmV4dDsKKwl9IHBpdGVtOworCit0eXBlZGVmIHN0cnVjdCBfcGl0ZW0gKnBpdGVyYXRvcjsKKworcGl0ZW0gKnBpdGVtX25ldyh1bnNpZ25lZCBjaGFyICpwcmlvNjRiZSwgdm9pZCAqZGF0YSk7Cit2b2lkICAgcGl0ZW1fZnJlZShwaXRlbSAqaXRlbSk7CisKK3BxdWV1ZSBwcXVldWVfbmV3KHZvaWQpOwordm9pZCAgIHBxdWV1ZV9mcmVlKHBxdWV1ZSBwcSk7CisKK3BpdGVtICpwcXVldWVfaW5zZXJ0KHBxdWV1ZSBwcSwgcGl0ZW0gKml0ZW0pOworcGl0ZW0gKnBxdWV1ZV9wZWVrKHBxdWV1ZSBwcSk7CitwaXRlbSAqcHF1ZXVlX3BvcChwcXVldWUgcHEpOworcGl0ZW0gKnBxdWV1ZV9maW5kKHBxdWV1ZSBwcSwgdW5zaWduZWQgY2hhciAqcHJpbzY0YmUpOworcGl0ZW0gKnBxdWV1ZV9pdGVyYXRvcihwcXVldWUgcHEpOworcGl0ZW0gKnBxdWV1ZV9uZXh0KHBpdGVyYXRvciAqaXRlcik7CisKK3ZvaWQgICBwcXVldWVfcHJpbnQocHF1ZXVlIHBxKTsKK2ludCAgICBwcXVldWVfc2l6ZShwcXVldWUgcHEpOworCisjZW5kaWYgLyogISBIRUFERVJfUFFVRVVFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL21kX3JhbmQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL21kX3JhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODA4OGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvbWRfcmFuZC5jCkBAIC0wLDAgKzEsNTkwIEBACisvKiBjcnlwdG8vcmFuZC9tZF9yYW5kLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZkZWYgTURfUkFORF9ERUJVRworIyBpZm5kZWYgTkRFQlVHCisjICAgZGVmaW5lIE5ERUJVRworIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiZV9vcy5oIgorCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSAicmFuZF9sY2wuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworI2lmZGVmIEJOX0RFQlVHCisjIGRlZmluZSBQUkVESUNUCisjZW5kaWYKKworLyogI2RlZmluZSBQUkVESUNUCTEgKi8KKworI2RlZmluZSBTVEFURV9TSVpFCTEwMjMKK3N0YXRpYyBpbnQgc3RhdGVfbnVtPTAsc3RhdGVfaW5kZXg9MDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHN0YXRlW1NUQVRFX1NJWkUrTURfRElHRVNUX0xFTkdUSF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBtZFtNRF9ESUdFU1RfTEVOR1RIXTsKK3N0YXRpYyBsb25nIG1kX2NvdW50WzJdPXswLDB9Oworc3RhdGljIGRvdWJsZSBlbnRyb3B5PTA7CitzdGF0aWMgaW50IGluaXRpYWxpemVkPTA7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3J5cHRvX2xvY2tfcmFuZCA9IDA7IC8qIG1heSBiZSBzZXQgb25seSB3aGVuIGEgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBob2xkcyBDUllQVE9fTE9DS19SQU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAodG8gcHJldmVudCBkb3VibGUgbG9ja2luZykgKi8KKy8qIGFjY2VzcyB0byBsb2NraW5fdGhyZWFkIGlzIHN5bmNocm9uaXplZCBieSBDUllQVE9fTE9DS19SQU5EMiAqLworc3RhdGljIENSWVBUT19USFJFQURJRCBsb2NraW5nX3RocmVhZGlkOyAvKiB2YWxpZCBpZmYgY3J5cHRvX2xvY2tfcmFuZCBpcyBzZXQgKi8KKworCisjaWZkZWYgUFJFRElDVAoraW50IHJhbmRfcHJlZGljdGFibGU9MDsKKyNlbmRpZgorCitjb25zdCBjaGFyIFJBTkRfdmVyc2lvbltdPSJSQU5EIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKK3N0YXRpYyB2b2lkIHNzbGVheV9yYW5kX2NsZWFudXAodm9pZCk7CitzdGF0aWMgdm9pZCBzc2xlYXlfcmFuZF9zZWVkKGNvbnN0IHZvaWQgKmJ1ZiwgaW50IG51bSk7CitzdGF0aWMgdm9pZCBzc2xlYXlfcmFuZF9hZGQoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtLCBkb3VibGUgYWRkX2VudHJvcHkpOworc3RhdGljIGludCBzc2xlYXlfcmFuZF9ieXRlcyh1bnNpZ25lZCBjaGFyICpidWYsIGludCBudW0pOworc3RhdGljIGludCBzc2xlYXlfcmFuZF9wc2V1ZG9fYnl0ZXModW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtKTsKK3N0YXRpYyBpbnQgc3NsZWF5X3JhbmRfc3RhdHVzKHZvaWQpOworCitSQU5EX01FVEhPRCByYW5kX3NzbGVheV9tZXRoPXsKKwlzc2xlYXlfcmFuZF9zZWVkLAorCXNzbGVheV9yYW5kX2J5dGVzLAorCXNzbGVheV9yYW5kX2NsZWFudXAsCisJc3NsZWF5X3JhbmRfYWRkLAorCXNzbGVheV9yYW5kX3BzZXVkb19ieXRlcywKKwlzc2xlYXlfcmFuZF9zdGF0dXMKKwl9OyAKKworUkFORF9NRVRIT0QgKlJBTkRfU1NMZWF5KHZvaWQpCisJeworCXJldHVybigmcmFuZF9zc2xlYXlfbWV0aCk7CisJfQorCitzdGF0aWMgdm9pZCBzc2xlYXlfcmFuZF9jbGVhbnVwKHZvaWQpCisJeworCU9QRU5TU0xfY2xlYW5zZShzdGF0ZSxzaXplb2Yoc3RhdGUpKTsKKwlzdGF0ZV9udW09MDsKKwlzdGF0ZV9pbmRleD0wOworCU9QRU5TU0xfY2xlYW5zZShtZCxNRF9ESUdFU1RfTEVOR1RIKTsKKwltZF9jb3VudFswXT0wOworCW1kX2NvdW50WzFdPTA7CisJZW50cm9weT0wOworCWluaXRpYWxpemVkPTA7CisJfQorCitzdGF0aWMgdm9pZCBzc2xlYXlfcmFuZF9hZGQoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtLCBkb3VibGUgYWRkKQorCXsKKwlpbnQgaSxqLGssc3RfaWR4OworCWxvbmcgbWRfY1syXTsKKwl1bnNpZ25lZCBjaGFyIGxvY2FsX21kW01EX0RJR0VTVF9MRU5HVEhdOworCUVWUF9NRF9DVFggbTsKKwlpbnQgZG9fbm90X2xvY2s7CisKKwkvKgorCSAqIChCYXNlZCBvbiB0aGUgcmFuZCgzKSBtYW5wYWdlKQorCSAqCisJICogVGhlIGlucHV0IGlzIGNob3BwZWQgdXAgaW50byB1bml0cyBvZiAyMCBieXRlcyAob3IgbGVzcyBmb3IKKwkgKiB0aGUgbGFzdCBibG9jaykuICBFYWNoIG9mIHRoZXNlIGJsb2NrcyBpcyBydW4gdGhyb3VnaCB0aGUgaGFzaAorCSAqIGZ1bmN0aW9uIGFzIGZvbGxvd3M6ICBUaGUgZGF0YSBwYXNzZWQgdG8gdGhlIGhhc2ggZnVuY3Rpb24KKwkgKiBpcyB0aGUgY3VycmVudCAnbWQnLCB0aGUgc2FtZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgJ3N0YXRlJworCSAqICh0aGUgbG9jYXRpb24gZGV0ZXJtaW5lZCBieSBpbiBpbmNyZW1lbnRlZCBsb29waW5nIGluZGV4KSBhcworCSAqIHRoZSBjdXJyZW50ICdibG9jaycsIHRoZSBuZXcga2V5IGRhdGEgJ2Jsb2NrJywgYW5kICdjb3VudCcKKwkgKiAod2hpY2ggaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgZWFjaCB1c2UpLgorCSAqIFRoZSByZXN1bHQgb2YgdGhpcyBpcyBrZXB0IGluICdtZCcgYW5kIGFsc28geG9yZWQgaW50byB0aGUKKwkgKiAnc3RhdGUnIGF0IHRoZSBzYW1lIGxvY2F0aW9ucyB0aGF0IHdlcmUgdXNlZCBhcyBpbnB1dCBpbnRvIHRoZQorICAgICAgICAgKiBoYXNoIGZ1bmN0aW9uLgorCSAqLworCisJLyogY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBsb2NrICovCisJaWYgKGNyeXB0b19sb2NrX3JhbmQpCisJCXsKKwkJQ1JZUFRPX1RIUkVBRElEIGN1cjsKKwkJQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoJmN1cik7CisJCUNSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfUkFORDIpOworCQlkb19ub3RfbG9jayA9ICFDUllQVE9fVEhSRUFESURfY21wKCZsb2NraW5nX3RocmVhZGlkLCAmY3VyKTsKKwkJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX1JBTkQyKTsKKwkJfQorCWVsc2UKKwkJZG9fbm90X2xvY2sgPSAwOworCisJaWYgKCFkb19ub3RfbG9jaykgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19SQU5EKTsKKwlzdF9pZHg9c3RhdGVfaW5kZXg7CisKKwkvKiB1c2Ugb3VyIG93biBjb3BpZXMgb2YgdGhlIGNvdW50ZXJzIHNvIHRoYXQgZXZlbgorCSAqIGlmIGEgY29uY3VycmVudCB0aHJlYWQgc2VlZHMgd2l0aCBleGFjdGx5IHRoZQorCSAqIHNhbWUgZGF0YSBhbmQgdXNlcyB0aGUgc2FtZSBzdWJhcnJheSB0aGVyZSdzIF9zb21lXworCSAqIGRpZmZlcmVuY2UgKi8KKwltZF9jWzBdID0gbWRfY291bnRbMF07CisJbWRfY1sxXSA9IG1kX2NvdW50WzFdOworCisJbWVtY3B5KGxvY2FsX21kLCBtZCwgc2l6ZW9mIG1kKTsKKworCS8qIHN0YXRlX2luZGV4IDw9IHN0YXRlX251bSA8PSBTVEFURV9TSVpFICovCisJc3RhdGVfaW5kZXggKz0gbnVtOworCWlmIChzdGF0ZV9pbmRleCA+PSBTVEFURV9TSVpFKQorCQl7CisJCXN0YXRlX2luZGV4JT1TVEFURV9TSVpFOworCQlzdGF0ZV9udW09U1RBVEVfU0laRTsKKwkJfQorCWVsc2UgaWYgKHN0YXRlX251bSA8IFNUQVRFX1NJWkUpCQorCQl7CisJCWlmIChzdGF0ZV9pbmRleCA+IHN0YXRlX251bSkKKwkJCXN0YXRlX251bT1zdGF0ZV9pbmRleDsKKwkJfQorCS8qIHN0YXRlX2luZGV4IDw9IHN0YXRlX251bSA8PSBTVEFURV9TSVpFICovCisKKwkvKiBzdGF0ZVtzdF9pZHhdLCAuLi4sIHN0YXRlWyhzdF9pZHggKyBudW0gLSAxKSAlIFNUQVRFX1NJWkVdCisJICogYXJlIHdoYXQgd2Ugd2lsbCB1c2Ugbm93LCBidXQgb3RoZXIgdGhyZWFkcyBtYXkgdXNlIHRoZW0KKwkgKiBhcyB3ZWxsICovCisKKwltZF9jb3VudFsxXSArPSAobnVtIC8gTURfRElHRVNUX0xFTkdUSCkgKyAobnVtICUgTURfRElHRVNUX0xFTkdUSCA+IDApOworCisJaWYgKCFkb19ub3RfbG9jaykgQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JBTkQpOworCisJRVZQX01EX0NUWF9pbml0KCZtKTsKKwlmb3IgKGk9MDsgaTxudW07IGkrPU1EX0RJR0VTVF9MRU5HVEgpCisJCXsKKwkJaj0obnVtLWkpOworCQlqPShqID4gTURfRElHRVNUX0xFTkdUSCk/TURfRElHRVNUX0xFTkdUSDpqOworCisJCU1EX0luaXQoJm0pOworCQlNRF9VcGRhdGUoJm0sbG9jYWxfbWQsTURfRElHRVNUX0xFTkdUSCk7CisJCWs9KHN0X2lkeCtqKS1TVEFURV9TSVpFOworCQlpZiAoayA+IDApCisJCQl7CisJCQlNRF9VcGRhdGUoJm0sJihzdGF0ZVtzdF9pZHhdKSxqLWspOworCQkJTURfVXBkYXRlKCZtLCYoc3RhdGVbMF0pLGspOworCQkJfQorCQllbHNlCisJCQlNRF9VcGRhdGUoJm0sJihzdGF0ZVtzdF9pZHhdKSxqKTsKKworCQkvKiBETyBOT1QgUkVNT1ZFIFRIRSBGT0xMT1dJTkcgQ0FMTCBUTyBNRF9VcGRhdGUoKSEgKi8KKwkJTURfVXBkYXRlKCZtLGJ1ZixqKTsKKwkJLyogV2Uga25vdyB0aGF0IGxpbmUgbWF5IGNhdXNlIHByb2dyYW1zIHN1Y2ggYXMKKwkJICAgcHVyaWZ5IGFuZCB2YWxncmluZCB0byBjb21wbGFpbiBhYm91dCB1c2Ugb2YKKwkJICAgdW5pbml0aWFsaXplZCBkYXRhLiAgVGhlIHByb2JsZW0gaXMgbm90LCBpdCdzCisJCSAgIHdpdGggdGhlIGNhbGxlci4gIFJlbW92aW5nIHRoYXQgbGluZSB3aWxsIG1ha2UKKwkJICAgc3VyZSB5b3UgZ2V0IHJlYWxseSBiYWQgcmFuZG9tbmVzcyBhbmQgdGhlcmVieQorCQkgICBvdGhlciBwcm9ibGVtcyBzdWNoIGFzIHZlcnkgaW5zZWN1cmUga2V5cy4gKi8KKworCQlNRF9VcGRhdGUoJm0sKHVuc2lnbmVkIGNoYXIgKikmKG1kX2NbMF0pLHNpemVvZihtZF9jKSk7CisJCU1EX0ZpbmFsKCZtLGxvY2FsX21kKTsKKwkJbWRfY1sxXSsrOworCisJCWJ1Zj0oY29uc3QgY2hhciAqKWJ1ZiArIGo7CisKKwkJZm9yIChrPTA7IGs8ajsgaysrKQorCQkJeworCQkJLyogUGFyYWxsZWwgdGhyZWFkcyBtYXkgaW50ZXJmZXJlIHdpdGggdGhpcywKKwkJCSAqIGJ1dCBhbHdheXMgZWFjaCBieXRlIG9mIHRoZSBuZXcgc3RhdGUgaXMKKwkJCSAqIHRoZSBYT1Igb2Ygc29tZSBwcmV2aW91cyB2YWx1ZSBvZiBpdHMKKwkJCSAqIGFuZCBsb2NhbF9tZCAoaXRlcm1lZGlhdGUgdmFsdWVzIG1heSBiZSBsb3N0KS4KKwkJCSAqIEFsd2F5IHVzaW5nIGxvY2tpbmcgY291bGQgaHVydCBwZXJmb3JtYW5jZSBtb3JlCisJCQkgKiB0aGFuIG5lY2Vzc2FyeSBnaXZlbiB0aGF0IGNvbmZsaWN0cyBvY2N1ciBvbmx5CisJCQkgKiB3aGVuIHRoZSB0b3RhbCBzZWVkaW5nIGlzIGxvbmdlciB0aGFuIHRoZSByYW5kb20KKwkJCSAqIHN0YXRlLiAqLworCQkJc3RhdGVbc3RfaWR4KytdXj1sb2NhbF9tZFtrXTsKKwkJCWlmIChzdF9pZHggPj0gU1RBVEVfU0laRSkKKwkJCQlzdF9pZHg9MDsKKwkJCX0KKwkJfQorCUVWUF9NRF9DVFhfY2xlYW51cCgmbSk7CisKKwlpZiAoIWRvX25vdF9sb2NrKSBDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1JBTkQpOworCS8qIERvbid0IGp1c3QgY29weSBiYWNrIGxvY2FsX21kIGludG8gbWQgLS0gdGhpcyBjb3VsZCBtZWFuIHRoYXQKKwkgKiBvdGhlciB0aHJlYWQncyBzZWVkaW5nIHJlbWFpbnMgd2l0aG91dCBlZmZlY3QgKGV4Y2VwdCBmb3IKKwkgKiB0aGUgaW5jcmVtZW50ZWQgY291bnRlcikuICBCeSBYT1JpbmcgaXQgd2Uga2VlcCBhdCBsZWFzdCBhcworCSAqIG11Y2ggZW50cm9weSBhcyBmaXRzIGludG8gbWQuICovCisJZm9yIChrID0gMDsgayA8IChpbnQpc2l6ZW9mKG1kKTsgaysrKQorCQl7CisJCW1kW2tdIF49IGxvY2FsX21kW2tdOworCQl9CisJaWYgKGVudHJvcHkgPCBFTlRST1BZX05FRURFRCkgLyogc3RvcCBjb3VudGluZyB3aGVuIHdlIGhhdmUgZW5vdWdoICovCisJICAgIGVudHJvcHkgKz0gYWRkOworCWlmICghZG9fbm90X2xvY2spIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19SQU5EKTsKKwkKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1RIUkVBRFMpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKQorCWFzc2VydChtZF9jWzFdID09IG1kX2NvdW50WzFdKTsKKyNlbmRpZgorCX0KKworc3RhdGljIHZvaWQgc3NsZWF5X3JhbmRfc2VlZChjb25zdCB2b2lkICpidWYsIGludCBudW0pCisJeworCXNzbGVheV9yYW5kX2FkZChidWYsIG51bSwgKGRvdWJsZSludW0pOworCX0KKworc3RhdGljIGludCBzc2xlYXlfcmFuZF9ieXRlcyh1bnNpZ25lZCBjaGFyICpidWYsIGludCBudW0pCisJeworCXN0YXRpYyB2b2xhdGlsZSBpbnQgc3RpcnJlZF9wb29sID0gMDsKKwlpbnQgaSxqLGssc3RfbnVtLHN0X2lkeDsKKwlpbnQgbnVtX2NlaWw7CisJaW50IG9rOworCWxvbmcgbWRfY1syXTsKKwl1bnNpZ25lZCBjaGFyIGxvY2FsX21kW01EX0RJR0VTVF9MRU5HVEhdOworCUVWUF9NRF9DVFggbTsKKyNpZm5kZWYgR0VUUElEX0lTX01FQU5JTkdMRVNTCisJcGlkX3QgY3Vycl9waWQgPSBnZXRwaWQoKTsKKyNlbmRpZgorCWludCBkb19zdGlyX3Bvb2wgPSAwOworCisjaWZkZWYgUFJFRElDVAorCWlmIChyYW5kX3ByZWRpY3RhYmxlKQorCQl7CisJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHZhbD0wOworCisJCWZvciAoaT0wOyBpPG51bTsgaSsrKQorCQkJYnVmW2ldPXZhbCsrOworCQlyZXR1cm4oMSk7CisJCX0KKyNlbmRpZgorCisJaWYgKG51bSA8PSAwKQorCQlyZXR1cm4gMTsKKworCUVWUF9NRF9DVFhfaW5pdCgmbSk7CisJLyogcm91bmQgdXB3YXJkcyB0byBtdWx0aXBsZSBvZiBNRF9ESUdFU1RfTEVOR1RILzIgKi8KKwludW1fY2VpbCA9ICgxICsgKG51bS0xKS8oTURfRElHRVNUX0xFTkdUSC8yKSkgKiAoTURfRElHRVNUX0xFTkdUSC8yKTsKKworCS8qCisJICogKEJhc2VkIG9uIHRoZSByYW5kKDMpIG1hbnBhZ2U6KQorCSAqCisJICogRm9yIGVhY2ggZ3JvdXAgb2YgMTAgYnl0ZXMgKG9yIGxlc3MpLCB3ZSBkbyB0aGUgZm9sbG93aW5nOgorCSAqCisJICogSW5wdXQgaW50byB0aGUgaGFzaCBmdW5jdGlvbiB0aGUgbG9jYWwgJ21kJyAod2hpY2ggaXMgaW5pdGlhbGl6ZWQgZnJvbQorCSAqIHRoZSBnbG9iYWwgJ21kJyBiZWZvcmUgYW55IGJ5dGVzIGFyZSBnZW5lcmF0ZWQpLCB0aGUgYnl0ZXMgdGhhdCBhcmUgdG8KKwkgKiBiZSBvdmVyd3JpdHRlbiBieSB0aGUgcmFuZG9tIGJ5dGVzLCBhbmQgYnl0ZXMgZnJvbSB0aGUgJ3N0YXRlJworCSAqIChpbmNyZW1lbnRpbmcgbG9vcGluZyBpbmRleCkuIEZyb20gdGhpcyBkaWdlc3Qgb3V0cHV0ICh3aGljaCBpcyBrZXB0CisJICogaW4gJ21kJyksIHRoZSB0b3AgKHVwIHRvKSAxMCBieXRlcyBhcmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciBhbmQgdGhlCisJICogYm90dG9tIDEwIGJ5dGVzIGFyZSB4b3JlZCBpbnRvIHRoZSAnc3RhdGUnLgorCSAqIAorCSAqIEZpbmFsbHksIGFmdGVyIHdlIGhhdmUgZmluaXNoZWQgJ251bScgcmFuZG9tIGJ5dGVzIGZvciB0aGUKKwkgKiBjYWxsZXIsICdjb3VudCcgKHdoaWNoIGlzIGluY3JlbWVudGVkKSBhbmQgdGhlIGxvY2FsIGFuZCBnbG9iYWwgJ21kJworCSAqIGFyZSBmZWQgaW50byB0aGUgaGFzaCBmdW5jdGlvbiBhbmQgdGhlIHJlc3VsdHMgYXJlIGtlcHQgaW4gdGhlCisJICogZ2xvYmFsICdtZCcuCisJICovCisKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1JBTkQpOworCisJLyogcHJldmVudCBzc2xlYXlfcmFuZF9ieXRlcygpIGZyb20gdHJ5aW5nIHRvIG9idGFpbiB0aGUgbG9jayBhZ2FpbiAqLworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfUkFORDIpOworCUNSWVBUT19USFJFQURJRF9jdXJyZW50KCZsb2NraW5nX3RocmVhZGlkKTsKKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfUkFORDIpOworCWNyeXB0b19sb2NrX3JhbmQgPSAxOworCisJaWYgKCFpbml0aWFsaXplZCkKKwkJeworCQlSQU5EX3BvbGwoKTsKKwkJaW5pdGlhbGl6ZWQgPSAxOworCQl9CisJCisJaWYgKCFzdGlycmVkX3Bvb2wpCisJCWRvX3N0aXJfcG9vbCA9IDE7CisJCisJb2sgPSAoZW50cm9weSA+PSBFTlRST1BZX05FRURFRCk7CisJaWYgKCFvaykKKwkJeworCQkvKiBJZiB0aGUgUFJORyBzdGF0ZSBpcyBub3QgeWV0IHVucHJlZGljdGFibGUsIHRoZW4gc2VlaW5nCisJCSAqIHRoZSBQUk5HIG91dHB1dCBtYXkgaGVscCBhdHRhY2tlcnMgdG8gZGV0ZXJtaW5lIHRoZSBuZXcKKwkJICogc3RhdGU7IHRodXMgd2UgaGF2ZSB0byBkZWNyZWFzZSB0aGUgZW50cm9weSBlc3RpbWF0ZS4KKwkJICogT25jZSB3ZSd2ZSBoYWQgZW5vdWdoIGluaXRpYWwgc2VlZGluZyB3ZSBkb24ndCBib3RoZXIgdG8KKwkJICogYWRqdXN0IHRoZSBlbnRyb3B5IGNvdW50LCB0aG91Z2gsIGJlY2F1c2Ugd2UncmUgbm90IGFtYml0aW91cworCQkgKiB0byBwcm92aWRlICppbmZvcm1hdGlvbi10aGVvcmV0aWMqIHJhbmRvbW5lc3MuCisJCSAqCisJCSAqIE5PVEU6IFRoaXMgYXBwcm9hY2ggZmFpbHMgaWYgdGhlIHByb2dyYW0gZm9ya3MgYmVmb3JlCisJCSAqIHdlIGhhdmUgZW5vdWdoIGVudHJvcHkuIEVudHJvcHkgc2hvdWxkIGJlIGNvbGxlY3RlZAorCQkgKiBpbiBhIHNlcGFyYXRlIGlucHV0IHBvb2wgYW5kIGJlIHRyYW5zZmVycmVkIHRvIHRoZQorCQkgKiBvdXRwdXQgcG9vbCBvbmx5IHdoZW4gdGhlIGVudHJvcHkgbGltaXQgaGFzIGJlZW4gcmVhY2hlZC4KKwkJICovCisJCWVudHJvcHkgLT0gbnVtOworCQlpZiAoZW50cm9weSA8IDApCisJCQllbnRyb3B5ID0gMDsKKwkJfQorCisJaWYgKGRvX3N0aXJfcG9vbCkKKwkJeworCQkvKiBJbiB0aGUgb3V0cHV0IGZ1bmN0aW9uIG9ubHkgaGFsZiBvZiAnbWQnIHJlbWFpbnMgc2VjcmV0LAorCQkgKiBzbyB3ZSBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlIHJlcXVpcmVkIGVudHJvcHkgZ2V0cworCQkgKiAnZXZlbmx5IGRpc3RyaWJ1dGVkJyB0aHJvdWdoICdzdGF0ZScsIG91ciByYW5kb21uZXNzIHBvb2wuCisJCSAqIFRoZSBpbnB1dCBmdW5jdGlvbiAoc3NsZWF5X3JhbmRfYWRkKSBjaGFpbnMgYWxsIG9mICdtZCcsCisJCSAqIHdoaWNoIG1ha2VzIGl0IG1vcmUgc3VpdGFibGUgZm9yIHRoaXMgcHVycG9zZS4KKwkJICovCisKKwkJaW50IG4gPSBTVEFURV9TSVpFOyAvKiBzbyB0aGF0IHRoZSBjb21wbGV0ZSBwb29sIGdldHMgYWNjZXNzZWQgKi8KKwkJd2hpbGUgKG4gPiAwKQorCQkJeworI2lmIE1EX0RJR0VTVF9MRU5HVEggPiAyMAorIyBlcnJvciAiUGxlYXNlIGFkanVzdCBEVU1NWV9TRUVELiIKKyNlbmRpZgorI2RlZmluZSBEVU1NWV9TRUVEICIuLi4uLi4uLi4uLi4uLi4uLi4uLiIgLyogYXQgbGVhc3QgTURfRElHRVNUX0xFTkdUSCAqLworCQkJLyogTm90ZSB0aGF0IHRoZSBzZWVkIGRvZXMgbm90IG1hdHRlciwgaXQncyBqdXN0IHRoYXQKKwkJCSAqIHNzbGVheV9yYW5kX2FkZCBleHBlY3RzIHRvIGhhdmUgc29tZXRoaW5nIHRvIGhhc2guICovCisJCQlzc2xlYXlfcmFuZF9hZGQoRFVNTVlfU0VFRCwgTURfRElHRVNUX0xFTkdUSCwgMC4wKTsKKwkJCW4gLT0gTURfRElHRVNUX0xFTkdUSDsKKwkJCX0KKwkJaWYgKG9rKQorCQkJc3RpcnJlZF9wb29sID0gMTsKKwkJfQorCisJc3RfaWR4PXN0YXRlX2luZGV4OworCXN0X251bT1zdGF0ZV9udW07CisJbWRfY1swXSA9IG1kX2NvdW50WzBdOworCW1kX2NbMV0gPSBtZF9jb3VudFsxXTsKKwltZW1jcHkobG9jYWxfbWQsIG1kLCBzaXplb2YgbWQpOworCisJc3RhdGVfaW5kZXgrPW51bV9jZWlsOworCWlmIChzdGF0ZV9pbmRleCA+IHN0YXRlX251bSkKKwkJc3RhdGVfaW5kZXggJT0gc3RhdGVfbnVtOworCisJLyogc3RhdGVbc3RfaWR4XSwgLi4uLCBzdGF0ZVsoc3RfaWR4ICsgbnVtX2NlaWwgLSAxKSAlIHN0X251bV0KKwkgKiBhcmUgbm93IG91cnMgKGJ1dCBvdGhlciB0aHJlYWRzIG1heSB1c2UgdGhlbSB0b28pICovCisKKwltZF9jb3VudFswXSArPSAxOworCisJLyogYmVmb3JlIHVubG9ja2luZywgd2UgbXVzdCBjbGVhciAnY3J5cHRvX2xvY2tfcmFuZCcgKi8KKwljcnlwdG9fbG9ja19yYW5kID0gMDsKKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfUkFORCk7CisKKwl3aGlsZSAobnVtID4gMCkKKwkJeworCQkvKiBudW1fY2VpbCAtPSBNRF9ESUdFU1RfTEVOR1RILzIgKi8KKwkJaj0obnVtID49IE1EX0RJR0VTVF9MRU5HVEgvMik/TURfRElHRVNUX0xFTkdUSC8yOm51bTsKKwkJbnVtLT1qOworCQlNRF9Jbml0KCZtKTsKKyNpZm5kZWYgR0VUUElEX0lTX01FQU5JTkdMRVNTCisJCWlmIChjdXJyX3BpZCkgLyoganVzdCBpbiB0aGUgZmlyc3QgaXRlcmF0aW9uIHRvIHNhdmUgdGltZSAqLworCQkJeworCQkJTURfVXBkYXRlKCZtLCh1bnNpZ25lZCBjaGFyKikmY3Vycl9waWQsc2l6ZW9mIGN1cnJfcGlkKTsKKwkJCWN1cnJfcGlkID0gMDsKKwkJCX0KKyNlbmRpZgorCQlNRF9VcGRhdGUoJm0sbG9jYWxfbWQsTURfRElHRVNUX0xFTkdUSCk7CisJCU1EX1VwZGF0ZSgmbSwodW5zaWduZWQgY2hhciAqKSYobWRfY1swXSksc2l6ZW9mKG1kX2MpKTsKKworI2lmbmRlZiBQVVJJRlkgLyogcHVyaWZ5IGNvbXBsYWlucyAqLworCQkvKiBETyBOT1QgUkVNT1ZFIFRIRSBGT0xMT1dJTkcgQ0FMTCBUTyBNRF9VcGRhdGUoKSEgKi8KKwkJTURfVXBkYXRlKCZtLGJ1ZixqKTsKKwkJLyogV2Uga25vdyB0aGF0IGxpbmUgbWF5IGNhdXNlIHByb2dyYW1zIHN1Y2ggYXMKKwkJICAgcHVyaWZ5IGFuZCB2YWxncmluZCB0byBjb21wbGFpbiBhYm91dCB1c2Ugb2YKKwkJICAgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KKyNlbmRpZgorCisJCWs9KHN0X2lkeCtNRF9ESUdFU1RfTEVOR1RILzIpLXN0X251bTsKKwkJaWYgKGsgPiAwKQorCQkJeworCQkJTURfVXBkYXRlKCZtLCYoc3RhdGVbc3RfaWR4XSksTURfRElHRVNUX0xFTkdUSC8yLWspOworCQkJTURfVXBkYXRlKCZtLCYoc3RhdGVbMF0pLGspOworCQkJfQorCQllbHNlCisJCQlNRF9VcGRhdGUoJm0sJihzdGF0ZVtzdF9pZHhdKSxNRF9ESUdFU1RfTEVOR1RILzIpOworCQlNRF9GaW5hbCgmbSxsb2NhbF9tZCk7CisKKwkJZm9yIChpPTA7IGk8TURfRElHRVNUX0xFTkdUSC8yOyBpKyspCisJCQl7CisJCQlzdGF0ZVtzdF9pZHgrK11ePWxvY2FsX21kW2ldOyAvKiBtYXkgY29tcGV0ZSB3aXRoIG90aGVyIHRocmVhZHMgKi8KKwkJCWlmIChzdF9pZHggPj0gc3RfbnVtKQorCQkJCXN0X2lkeD0wOworCQkJaWYgKGkgPCBqKQorCQkJCSooYnVmKyspPWxvY2FsX21kW2krTURfRElHRVNUX0xFTkdUSC8yXTsKKwkJCX0KKwkJfQorCisJTURfSW5pdCgmbSk7CisJTURfVXBkYXRlKCZtLCh1bnNpZ25lZCBjaGFyICopJihtZF9jWzBdKSxzaXplb2YobWRfYykpOworCU1EX1VwZGF0ZSgmbSxsb2NhbF9tZCxNRF9ESUdFU1RfTEVOR1RIKTsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1JBTkQpOworCU1EX1VwZGF0ZSgmbSxtZCxNRF9ESUdFU1RfTEVOR1RIKTsKKwlNRF9GaW5hbCgmbSxtZCk7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JBTkQpOworCisJRVZQX01EX0NUWF9jbGVhbnVwKCZtKTsKKwlpZiAob2spCisJCXJldHVybigxKTsKKwllbHNlCisJCXsKKwkJUkFORGVycihSQU5EX0ZfU1NMRUFZX1JBTkRfQllURVMsUkFORF9SX1BSTkdfTk9UX1NFRURFRCk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgxLCAiWW91IG5lZWQgdG8gcmVhZCB0aGUgT3BlblNTTCBGQVEsICIKKwkJCSJodHRwOi8vd3d3Lm9wZW5zc2wub3JnL3N1cHBvcnQvZmFxLmh0bWwiKTsKKwkJcmV0dXJuKDApOworCQl9CisJfQorCisvKiBwc2V1ZG8tcmFuZG9tIGJ5dGVzIHRoYXQgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGJ1dCBub3QKKyAgIHVucHJlZGljdGFibGUgKi8KK3N0YXRpYyBpbnQgc3NsZWF5X3JhbmRfcHNldWRvX2J5dGVzKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG51bSkgCisJeworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBlcnI7CisKKwlyZXQgPSBSQU5EX2J5dGVzKGJ1ZiwgbnVtKTsKKwlpZiAocmV0ID09IDApCisJCXsKKwkJZXJyID0gRVJSX3BlZWtfZXJyb3IoKTsKKwkJaWYgKEVSUl9HRVRfTElCKGVycikgPT0gRVJSX0xJQl9SQU5EICYmCisJCSAgICBFUlJfR0VUX1JFQVNPTihlcnIpID09IFJBTkRfUl9QUk5HX05PVF9TRUVERUQpCisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJfQorCXJldHVybiAocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgc3NsZWF5X3JhbmRfc3RhdHVzKHZvaWQpCisJeworCUNSWVBUT19USFJFQURJRCBjdXI7CisJaW50IHJldDsKKwlpbnQgZG9fbm90X2xvY2s7CisKKwlDUllQVE9fVEhSRUFESURfY3VycmVudCgmY3VyKTsKKwkvKiBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGxvY2sKKwkgKiAoY291bGQgaGFwcGVuIGlmIGEgUkFORF9wb2xsKCkgaW1wbGVtZW50YXRpb24gY2FsbHMgUkFORF9zdGF0dXMoKSkgKi8KKwlpZiAoY3J5cHRvX2xvY2tfcmFuZCkKKwkJeworCQlDUllQVE9fcl9sb2NrKENSWVBUT19MT0NLX1JBTkQyKTsKKwkJZG9fbm90X2xvY2sgPSAhQ1JZUFRPX1RIUkVBRElEX2NtcCgmbG9ja2luZ190aHJlYWRpZCwgJmN1cik7CisJCUNSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19SQU5EMik7CisJCX0KKwllbHNlCisJCWRvX25vdF9sb2NrID0gMDsKKwkKKwlpZiAoIWRvX25vdF9sb2NrKQorCQl7CisJCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfUkFORCk7CisJCQorCQkvKiBwcmV2ZW50IHNzbGVheV9yYW5kX2J5dGVzKCkgZnJvbSB0cnlpbmcgdG8gb2J0YWluIHRoZSBsb2NrIGFnYWluICovCisJCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfUkFORDIpOworCQlDUllQVE9fVEhSRUFESURfY3B5KCZsb2NraW5nX3RocmVhZGlkLCAmY3VyKTsKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JBTkQyKTsKKwkJY3J5cHRvX2xvY2tfcmFuZCA9IDE7CisJCX0KKwkKKwlpZiAoIWluaXRpYWxpemVkKQorCQl7CisJCVJBTkRfcG9sbCgpOworCQlpbml0aWFsaXplZCA9IDE7CisJCX0KKworCXJldCA9IGVudHJvcHkgPj0gRU5UUk9QWV9ORUVERUQ7CisKKwlpZiAoIWRvX25vdF9sb2NrKQorCQl7CisJCS8qIGJlZm9yZSB1bmxvY2tpbmcsIHdlIG11c3QgY2xlYXIgJ2NyeXB0b19sb2NrX3JhbmQnICovCisJCWNyeXB0b19sb2NrX3JhbmQgPSAwOworCQkKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JBTkQpOworCQl9CisJCisJcmV0dXJuIHJldDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2YzAyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmQuaApAQCAtMCwwICsxLDE0MCBAQAorLyogY3J5cHRvL3JhbmQvcmFuZC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1JBTkRfSAorI2RlZmluZSBIRUFERVJfUkFORF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUEVOU1NMX0ZJUFMpCisjZGVmaW5lIEZJUFNfUkFORF9TSVpFX1Qgc2l6ZV90CisjZW5kaWYKKworLyogQWxyZWFkeSBkZWZpbmVkIGluIG9zc2xfdHlwLmggKi8KKy8qIHR5cGVkZWYgc3RydWN0IHJhbmRfbWV0aF9zdCBSQU5EX01FVEhPRDsgKi8KKworc3RydWN0IHJhbmRfbWV0aF9zdAorCXsKKwl2b2lkICgqc2VlZCkoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtKTsKKwlpbnQgKCpieXRlcykodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtKTsKKwl2b2lkICgqY2xlYW51cCkodm9pZCk7CisJdm9pZCAoKmFkZCkoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtLCBkb3VibGUgZW50cm9weSk7CisJaW50ICgqcHNldWRvcmFuZCkodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtKTsKKwlpbnQgKCpzdGF0dXMpKHZvaWQpOworCX07CisKKyNpZmRlZiBCTl9ERUJVRworZXh0ZXJuIGludCByYW5kX3ByZWRpY3RhYmxlOworI2VuZGlmCisKK2ludCBSQU5EX3NldF9yYW5kX21ldGhvZChjb25zdCBSQU5EX01FVEhPRCAqbWV0aCk7Citjb25zdCBSQU5EX01FVEhPRCAqUkFORF9nZXRfcmFuZF9tZXRob2Qodm9pZCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitpbnQgUkFORF9zZXRfcmFuZF9lbmdpbmUoRU5HSU5FICplbmdpbmUpOworI2VuZGlmCitSQU5EX01FVEhPRCAqUkFORF9TU0xlYXkodm9pZCk7Cit2b2lkIFJBTkRfY2xlYW51cCh2b2lkICk7CitpbnQgIFJBTkRfYnl0ZXModW5zaWduZWQgY2hhciAqYnVmLGludCBudW0pOworaW50ICBSQU5EX3BzZXVkb19ieXRlcyh1bnNpZ25lZCBjaGFyICpidWYsaW50IG51bSk7Cit2b2lkIFJBTkRfc2VlZChjb25zdCB2b2lkICpidWYsaW50IG51bSk7Cit2b2lkIFJBTkRfYWRkKGNvbnN0IHZvaWQgKmJ1ZixpbnQgbnVtLGRvdWJsZSBlbnRyb3B5KTsKK2ludCAgUkFORF9sb2FkX2ZpbGUoY29uc3QgY2hhciAqZmlsZSxsb25nIG1heF9ieXRlcyk7CitpbnQgIFJBTkRfd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlKTsKK2NvbnN0IGNoYXIgKlJBTkRfZmlsZV9uYW1lKGNoYXIgKmZpbGUsc2l6ZV90IG51bSk7CitpbnQgUkFORF9zdGF0dXModm9pZCk7CitpbnQgUkFORF9xdWVyeV9lZ2RfYnl0ZXMoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnl0ZXMpOworaW50IFJBTkRfZWdkKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IFJBTkRfZWdkX2J5dGVzKGNvbnN0IGNoYXIgKnBhdGgsaW50IGJ5dGVzKTsKK2ludCBSQU5EX3BvbGwodm9pZCk7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpCisKK3ZvaWQgUkFORF9zY3JlZW4odm9pZCk7CitpbnQgUkFORF9ldmVudChVSU5ULCBXUEFSQU0sIExQQVJBTSk7CisKKyNlbmRpZgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1JBTkRfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBSQU5EIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFJBTkRfRl9SQU5EX0dFVF9SQU5EX01FVEhPRAkJCSAxMDEKKyNkZWZpbmUgUkFORF9GX1NTTEVBWV9SQU5EX0JZVEVTCQkJIDEwMAorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIFJBTkRfUl9QUk5HX05PVF9TRUVERUQJCQkJIDEwMAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF9lZ2QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfZWdkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzYjkxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfZWdkLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qIGNyeXB0by9yYW5kL3JhbmRfZWdkLmMgKi8KKy8qIFdyaXR0ZW4gYnkgVWxmIE1vZWxsZXIgYW5kIEx1dHogSmFlbmlja2UgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QuICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorCisvKgorICogUXVlcnkgdGhlIEVHRCA8VVJMOiBodHRwOi8vd3d3LmxvdGhhci5jb20vdGVjaC9jcnlwdG8vPi4KKyAqCisgKiBUaGlzIG1vZHVsZSBzdXBwbGllcyB0aHJlZSByb3V0aW5lczoKKyAqCisgKiBSQU5EX3F1ZXJ5X2VnZF9ieXRlcyhwYXRoLCBidWYsIGJ5dGVzKQorICogICB3aWxsIGFjdHVhbGx5IHF1ZXJ5ICJieXRlcyIgYnl0ZXMgb2YgZW50cm9weSBmb3JtIHRoZSBlZ2Qtc29ja2V0IGxvY2F0ZWQKKyAqICAgYXQgcGF0aCBhbmQgd2lsbCB3cml0ZSB0aGVtIHRvIGJ1ZiAoaWYgc3VwcGxpZWQpIG9yIHdpbGwgZGlyZWN0bHkgZmVlZAorICogICBpdCB0byBSQU5EX3NlZWQoKSBpZiBidWY9PU5VTEwuCisgKiAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgbm90IGxpbWl0ZWQgYnkgdGhlIG1heGltdW0gY2h1bmsgc2l6ZSBvZiBFR0QsCisgKiAgIHdoaWNoIGlzIDI1NSBieXRlcy4gSWYgbW9yZSB0aGFuIDI1NSBieXRlcyBhcmUgd2FudGVkLCBzZXZlcmFsIGNodW5rcworICogICBvZiBlbnRyb3B5IGJ5dGVzIGFyZSByZXF1ZXN0ZWQuIFRoZSBjb25uZWN0aW9uIGlzIGxlZnQgb3BlbiB1bnRpbCB0aGUKKyAqICAgcXVlcnkgaXMgY29tcGV0ZWQuCisgKiAgIFJBTkRfcXVlcnlfZWdkX2J5dGVzKCkgcmV0dXJucyB3aXRoCisgKiAgICAgLTEgIGlmIGFuIGVycm9yIG9jY3VyZWQgZHVyaW5nIGNvbm5lY3Rpb24gb3IgY29tbXVuaWNhdGlvbi4KKyAqICAgICBudW0gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIEVHRCBzb2NrZXQuIFRoaXMgbnVtYmVyIGlzIGVpdGhlcgorICogICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCBvciBzbWFsbGVyLCBpZiB0aGUgRUdEIHBvb2wgaXMKKyAqICAgICAgICAgZHJhaW5lZCBhbmQgdGhlIGRhZW1vbiBzaWduYWxzIHRoYXQgdGhlIHBvb2wgaXMgZW1wdHkuCisgKiAgIFRoaXMgcm91dGluZSBkb2VzIG5vdCB0b3VjaCBhbnkgUkFORF9zdGF0dXMoKS4gVGhpcyBpcyBuZWNlc3NhcnksIHNpbmNlCisgKiAgIFBSTkcgZnVuY3Rpb25zIG1heSBjYWxsIGl0IGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAqCisgKiBSQU5EX2VnZF9ieXRlcyhwYXRoLCBieXRlcykgd2lsbCBxdWVyeSAiYnl0ZXMiIGJ5dGVzIGFuZCBoYXZlIHRoZW0KKyAqICAgdXNlZCB0byBzZWVkIHRoZSBQUk5HLgorICogICBSQU5EX2VnZF9ieXRlcygpIGlzIGEgd3JhcHBlciBmb3IgUkFORF9xdWVyeV9lZ2RfYnl0ZXMoKSB3aXRoIGJ1Zj1OVUxMLgorICogICBVbmxpa2UgUkFORF9xdWVyeV9lZ2RfYnl0ZXMoKSwgUkFORF9zdGF0dXMoKSBpcyB1c2VkIHRvIHRlc3QgdGhlCisgKiAgIHNlZWQgc3RhdHVzIHNvIHRoYXQgdGhlIHJldHVybiB2YWx1ZSBjYW4gcmVmbGVjdCB0aGUgc2VlZCBzdGF0ZToKKyAqICAgICAtMSAgaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgY29ubmVjdGlvbiBvciBjb21tdW5pY2F0aW9uIF9vcl8KKyAqICAgICAgICAgaWYgdGhlIFBSTkcgaGFzIHN0aWxsIG5vdCByZWNlaXZlZCB0aGUgcmVxdWlyZWQgc2VlZGluZy4KKyAqICAgICBudW0gdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIEVHRCBzb2NrZXQuIFRoaXMgbnVtYmVyIGlzIGVpdGhlcgorICogICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCBvciBzbWFsbGVyLCBpZiB0aGUgRUdEIHBvb2wgaXMKKyAqICAgICAgICAgZHJhaW5lZCBhbmQgdGhlIGRhZW1vbiBzaWduYWxzIHRoYXQgdGhlIHBvb2wgaXMgZW1wdHkuCisgKgorICogUkFORF9lZ2QocGF0aCkgd2lsbCBxdWVyeSAyNTUgYnl0ZXMgYW5kIHVzZSB0aGUgYnl0ZXMgcmV0cmVpdmVkIHRvIHNlZWQKKyAqICAgdGhlIFBSTkcuCisgKiAgIFJBTkRfZWdkKCkgaXMgYSB3cmFwcGVyIGZvciBSQU5EX2VnZF9ieXRlcygpIHdpdGggbnVtYnl0ZXM9MjU1LgorICovCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19WWFdPUktTKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfVk9TKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1MpCitpbnQgUkFORF9xdWVyeV9lZ2RfYnl0ZXMoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnl0ZXMpCisJeworCXJldHVybigtMSk7CisJfQoraW50IFJBTkRfZWdkKGNvbnN0IGNoYXIgKnBhdGgpCisJeworCXJldHVybigtMSk7CisJfQorCitpbnQgUkFORF9lZ2RfYnl0ZXMoY29uc3QgY2hhciAqcGF0aCxpbnQgYnl0ZXMpCisJeworCXJldHVybigtMSk7CisJfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaW5jbHVkZSBPUEVOU1NMX1VOSVNURAorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZm5kZWYgTk9fU1lTX1VOX0gKKyMgaWZkZWYgT1BFTlNTTF9TWVNfVlhXT1JLUworIyAgIGluY2x1ZGUgPHN0cmVhbXMvdW4uaD4KKyMgZWxzZQorIyAgIGluY2x1ZGUgPHN5cy91bi5oPgorIyBlbmRpZgorI2Vsc2UKK3N0cnVjdAlzb2NrYWRkcl91biB7CisJc2hvcnQJc3VuX2ZhbWlseTsJCS8qIEFGX1VOSVggKi8KKwljaGFyCXN1bl9wYXRoWzEwOF07CQkvKiBwYXRoIG5hbWUgKGdhZykgKi8KK307CisjZW5kaWYgLyogTk9fU1lTX1VOX0ggKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZuZGVmIG9mZnNldG9mCisjICBkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHNpemVfdCkgJigoVFlQRSAqKTApLT5NRU1CRVIpCisjZW5kaWYKKworaW50IFJBTkRfcXVlcnlfZWdkX2J5dGVzKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ5dGVzKQorCXsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gYWRkcjsKKwlpbnQgbGVuLCBudW0sIG51bWJ5dGVzOworCWludCBmZCA9IC0xOworCWludCBzdWNjZXNzOworCXVuc2lnbmVkIGNoYXIgZWdkYnVmWzJdLCB0ZW1wYnVmWzI1NV0sICpyZXRyaWV2ZWJ1ZjsKKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworCWlmIChzdHJsZW4ocGF0aCkgPj0gc2l6ZW9mKGFkZHIuc3VuX3BhdGgpKQorCQlyZXR1cm4gKC0xKTsKKwlCVUZfc3RybGNweShhZGRyLnN1bl9wYXRoLHBhdGgsc2l6ZW9mIGFkZHIuc3VuX3BhdGgpOworCWxlbiA9IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl91biwgc3VuX3BhdGgpICsgc3RybGVuKHBhdGgpOworCWZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKwlpZiAoZmQgPT0gLTEpIHJldHVybiAoLTEpOworCXN1Y2Nlc3MgPSAwOworCXdoaWxlICghc3VjY2VzcykKKwkgICAgeworCSAgICBpZiAoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBsZW4pID09IDApCisJICAgICAgIHN1Y2Nlc3MgPSAxOworCSAgICBlbHNlCisJCXsKKwkJc3dpdGNoIChlcnJubykKKwkJICAgIHsKKyNpZmRlZiBFSU5UUgorCQkgICAgY2FzZSBFSU5UUjoKKyNlbmRpZgorI2lmZGVmIEVBR0FJTgorCQkgICAgY2FzZSBFQUdBSU46CisjZW5kaWYKKyNpZmRlZiBFSU5QUk9HUkVTUworCQkgICAgY2FzZSBFSU5QUk9HUkVTUzoKKyNlbmRpZgorI2lmZGVmIEVBTFJFQURZCisJCSAgICBjYXNlIEVBTFJFQURZOgorI2VuZGlmCisJCQkvKiBObyBlcnJvciwgdHJ5IGFnYWluICovCisJCQlicmVhazsKKyNpZmRlZiBFSVNDT05OCisJCSAgICBjYXNlIEVJU0NPTk46CisJCQlzdWNjZXNzID0gMTsKKwkJCWJyZWFrOworI2VuZGlmCisJCSAgICBkZWZhdWx0OgorCQkJZ290byBlcnI7CS8qIGZhaWx1cmUgKi8KKwkJICAgIH0KKwkJfQorCSAgICB9CisKKwl3aGlsZShieXRlcyA+IDApCisJICAgIHsKKwkgICAgZWdkYnVmWzBdID0gMTsKKwkgICAgZWdkYnVmWzFdID0gYnl0ZXMgPCAyNTUgPyBieXRlcyA6IDI1NTsKKwkgICAgbnVtYnl0ZXMgPSAwOworCSAgICB3aGlsZSAobnVtYnl0ZXMgIT0gMikKKwkJeworCSAgICAgICAgbnVtID0gd3JpdGUoZmQsIGVnZGJ1ZiArIG51bWJ5dGVzLCAyIC0gbnVtYnl0ZXMpOworCSAgICAgICAgaWYgKG51bSA+PSAwKQorCQkgICAgbnVtYnl0ZXMgKz0gbnVtOworCSAgICAJZWxzZQorCQkgICAgeworCQkgICAgc3dpdGNoIChlcnJubykKKwkJICAgIAl7CisjaWZkZWYgRUlOVFIKKwkJICAgIAljYXNlIEVJTlRSOgorI2VuZGlmCisjaWZkZWYgRUFHQUlOCisJCSAgICAJY2FzZSBFQUdBSU46CisjZW5kaWYKKwkJCSAgICAvKiBObyBlcnJvciwgdHJ5IGFnYWluICovCisJCQkgICAgYnJlYWs7CisJCSAgICAJZGVmYXVsdDoKKwkJCSAgICByZXQgPSAtMTsKKwkJCSAgICBnb3RvIGVycjsJLyogZmFpbHVyZSAqLworCQkJfQorCQkgICAgfQorCQl9CisJICAgIG51bWJ5dGVzID0gMDsKKwkgICAgd2hpbGUgKG51bWJ5dGVzICE9IDEpCisJCXsKKwkgICAgICAgIG51bSA9IHJlYWQoZmQsIGVnZGJ1ZiwgMSk7CisJICAgICAgICBpZiAobnVtID09IDApCisJCQlnb3RvIGVycjsJLyogZGVzY3JpcHRvciBjbG9zZWQgKi8KKwkJZWxzZSBpZiAobnVtID4gMCkKKwkJICAgIG51bWJ5dGVzICs9IG51bTsKKwkgICAgCWVsc2UKKwkJICAgIHsKKwkJICAgIHN3aXRjaCAoZXJybm8pCisJCSAgICAJeworI2lmZGVmIEVJTlRSCisJCSAgICAJY2FzZSBFSU5UUjoKKyNlbmRpZgorI2lmZGVmIEVBR0FJTgorCQkgICAgCWNhc2UgRUFHQUlOOgorI2VuZGlmCisJCQkgICAgLyogTm8gZXJyb3IsIHRyeSBhZ2FpbiAqLworCQkJICAgIGJyZWFrOworCQkgICAgCWRlZmF1bHQ6CisJCQkgICAgcmV0ID0gLTE7CisJCQkgICAgZ290byBlcnI7CS8qIGZhaWx1cmUgKi8KKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICBpZihlZ2RidWZbMF0gPT0gMCkKKwkJZ290byBlcnI7CisJICAgIGlmIChidWYpCisJCXJldHJpZXZlYnVmID0gYnVmICsgcmV0OworCSAgICBlbHNlCisJCXJldHJpZXZlYnVmID0gdGVtcGJ1ZjsKKwkgICAgbnVtYnl0ZXMgPSAwOworCSAgICB3aGlsZSAobnVtYnl0ZXMgIT0gZWdkYnVmWzBdKQorCQl7CisJICAgICAgICBudW0gPSByZWFkKGZkLCByZXRyaWV2ZWJ1ZiArIG51bWJ5dGVzLCBlZ2RidWZbMF0gLSBudW1ieXRlcyk7CisJCWlmIChudW0gPT0gMCkKKwkJCWdvdG8gZXJyOwkvKiBkZXNjcmlwdG9yIGNsb3NlZCAqLworCSAgICAgICAgZWxzZSBpZiAobnVtID4gMCkKKwkJICAgIG51bWJ5dGVzICs9IG51bTsKKwkgICAgCWVsc2UKKwkJICAgIHsKKwkJICAgIHN3aXRjaCAoZXJybm8pCisJCSAgICAJeworI2lmZGVmIEVJTlRSCisJCSAgICAJY2FzZSBFSU5UUjoKKyNlbmRpZgorI2lmZGVmIEVBR0FJTgorCQkgICAgCWNhc2UgRUFHQUlOOgorI2VuZGlmCisJCQkgICAgLyogTm8gZXJyb3IsIHRyeSBhZ2FpbiAqLworCQkJICAgIGJyZWFrOworCQkgICAgCWRlZmF1bHQ6CisJCQkgICAgcmV0ID0gLTE7CisJCQkgICAgZ290byBlcnI7CS8qIGZhaWx1cmUgKi8KKwkJCX0KKwkJICAgIH0KKwkJfQorCSAgICByZXQgKz0gZWdkYnVmWzBdOworCSAgICBieXRlcyAtPSBlZ2RidWZbMF07CisJICAgIGlmICghYnVmKQorCQlSQU5EX3NlZWQodGVtcGJ1ZiwgZWdkYnVmWzBdKTsKKwkgICAgfQorIGVycjoKKwlpZiAoZmQgIT0gLTEpIGNsb3NlKGZkKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKworaW50IFJBTkRfZWdkX2J5dGVzKGNvbnN0IGNoYXIgKnBhdGgsIGludCBieXRlcykKKwl7CisJaW50IG51bSwgcmV0ID0gMDsKKworCW51bSA9IFJBTkRfcXVlcnlfZWdkX2J5dGVzKHBhdGgsIE5VTEwsIGJ5dGVzKTsKKwlpZiAobnVtIDwgMSkgZ290byBlcnI7CisJaWYgKFJBTkRfc3RhdHVzKCkgPT0gMSkKKwkgICAgcmV0ID0gbnVtOworIGVycjoKKwlyZXR1cm4ocmV0KTsKKwl9CisKKworaW50IFJBTkRfZWdkKGNvbnN0IGNoYXIgKnBhdGgpCisJeworCXJldHVybiAoUkFORF9lZ2RfYnl0ZXMocGF0aCwgMjU1KSk7CisJfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF9lcnIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjZGE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfZXJyLmMKQEAgLTAsMCArMSw5NiBAQAorLyogY3J5cHRvL3JhbmQvcmFuZF9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworI2RlZmluZSBFUlJfRlVOQyhmdW5jKSBFUlJfUEFDSyhFUlJfTElCX1JBTkQsZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9SQU5ELDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFJBTkRfc3RyX2Z1bmN0c1tdPQorCXsKK3tFUlJfRlVOQyhSQU5EX0ZfUkFORF9HRVRfUkFORF9NRVRIT0QpLAkiUkFORF9nZXRfcmFuZF9tZXRob2QifSwKK3tFUlJfRlVOQyhSQU5EX0ZfU1NMRUFZX1JBTkRfQllURVMpLAkiU1NMRUFZX1JBTkRfQllURVMifSwKK3swLE5VTEx9CisJfTsKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBSQU5EX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oUkFORF9SX1BSTkdfTk9UX1NFRURFRCkgICAgICAsIlBSTkcgbm90IHNlZWRlZCJ9LAorezAsTlVMTH0KKwl9OworCisjZW5kaWYKKwordm9pZCBFUlJfbG9hZF9SQU5EX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKFJBTkRfc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsUkFORF9zdHJfZnVuY3RzKTsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLFJBTkRfc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX2xjbC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF9sY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MThhOGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF9sY2wuaApAQCAtMCwwICsxLDE1OCBAQAorLyogY3J5cHRvL3JhbmQvcmFuZF9sY2wuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX1JBTkRfTENMX0gKKyNkZWZpbmUgSEVBREVSX1JBTkRfTENMX0gKKworI2RlZmluZSBFTlRST1BZX05FRURFRCAzMiAgLyogcmVxdWlyZSAyNTYgYml0cyA9IDMyIGJ5dGVzIG9mIHJhbmRvbW5lc3MgKi8KKworCisjaWYgIWRlZmluZWQoVVNFX01ENV9SQU5EKSAmJiAhZGVmaW5lZChVU0VfU0hBMV9SQU5EKSAmJiAhZGVmaW5lZChVU0VfTURDMl9SQU5EKSAmJiAhZGVmaW5lZChVU0VfTUQyX1JBTkQpCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEEpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0hBMSkKKyNkZWZpbmUgVVNFX1NIQTFfUkFORAorI2VsaWYgIWRlZmluZWQoT1BFTlNTTF9OT19NRDUpCisjZGVmaW5lIFVTRV9NRDVfUkFORAorI2VsaWYgIWRlZmluZWQoT1BFTlNTTF9OT19NREMyKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0RFUykKKyNkZWZpbmUgVVNFX01EQzJfUkFORAorI2VsaWYgIWRlZmluZWQoT1BFTlNTTF9OT19NRDIpCisjZGVmaW5lIFVTRV9NRDJfUkFORAorI2Vsc2UKKyNlcnJvciBObyBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gYXZhaWxhYmxlCisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNkZWZpbmUgTURfVXBkYXRlKGEsYixjKQlFVlBfRGlnZXN0VXBkYXRlKGEsYixjKQorI2RlZmluZQlNRF9GaW5hbChhLGIpCQlFVlBfRGlnZXN0RmluYWxfZXgoYSxiLE5VTEwpCisjaWYgZGVmaW5lZChVU0VfTUQ1X1JBTkQpCisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNkZWZpbmUgTURfRElHRVNUX0xFTkdUSAlNRDVfRElHRVNUX0xFTkdUSAorI2RlZmluZSBNRF9Jbml0KGEpCQlFVlBfRGlnZXN0SW5pdF9leChhLEVWUF9tZDUoKSwgTlVMTCkKKyNkZWZpbmUJTUQoYSxiLGMpCQlFVlBfRGlnZXN0KGEsYixjLE5VTEwsRVZQX21kNSgpLCBOVUxMKQorI2VsaWYgZGVmaW5lZChVU0VfU0hBMV9SQU5EKQorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisjZGVmaW5lIE1EX0RJR0VTVF9MRU5HVEgJU0hBX0RJR0VTVF9MRU5HVEgKKyNkZWZpbmUgTURfSW5pdChhKQkJRVZQX0RpZ2VzdEluaXRfZXgoYSxFVlBfc2hhMSgpLCBOVUxMKQorI2RlZmluZQlNRChhLGIsYykJCUVWUF9EaWdlc3QoYSxiLGMsTlVMTCxFVlBfc2hhMSgpLCBOVUxMKQorI2VsaWYgZGVmaW5lZChVU0VfTURDMl9SQU5EKQorI2luY2x1ZGUgPG9wZW5zc2wvbWRjMi5oPgorI2RlZmluZSBNRF9ESUdFU1RfTEVOR1RICU1EQzJfRElHRVNUX0xFTkdUSAorI2RlZmluZSBNRF9Jbml0KGEpCQlFVlBfRGlnZXN0SW5pdF9leChhLEVWUF9tZGMyKCksIE5VTEwpCisjZGVmaW5lCU1EKGEsYixjKQkJRVZQX0RpZ2VzdChhLGIsYyxOVUxMLEVWUF9tZGMyKCksIE5VTEwpCisjZWxpZiBkZWZpbmVkKFVTRV9NRDJfUkFORCkKKyNpbmNsdWRlIDxvcGVuc3NsL21kMi5oPgorI2RlZmluZSBNRF9ESUdFU1RfTEVOR1RICU1EMl9ESUdFU1RfTEVOR1RICisjZGVmaW5lIE1EX0luaXQoYSkJCUVWUF9EaWdlc3RJbml0X2V4KGEsRVZQX21kMigpLCBOVUxMKQorI2RlZmluZQlNRChhLGIsYykJCUVWUF9EaWdlc3QoYSxiLGMsTlVMTCxFVlBfbWQyKCksIE5VTEwpCisjZW5kaWYKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfbGliLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxM2UzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX2xpYi5jCkBAIC0wLDAgKzEsMTc2IEBACisvKiBjcnlwdG8vcmFuZC9yYW5kX2xpYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorLyogbm9uLU5VTEwgaWYgZGVmYXVsdF9SQU5EX21ldGggaXMgRU5HSU5FLXByb3ZpZGVkICovCitzdGF0aWMgRU5HSU5FICpmdW5jdF9yZWYgPU5VTEw7CisjZW5kaWYKK3N0YXRpYyBjb25zdCBSQU5EX01FVEhPRCAqZGVmYXVsdF9SQU5EX21ldGggPSBOVUxMOworCitpbnQgUkFORF9zZXRfcmFuZF9tZXRob2QoY29uc3QgUkFORF9NRVRIT0QgKm1ldGgpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmKGZ1bmN0X3JlZikKKwkJeworCQlFTkdJTkVfZmluaXNoKGZ1bmN0X3JlZik7CisJCWZ1bmN0X3JlZiA9IE5VTEw7CisJCX0KKyNlbmRpZgorCWRlZmF1bHRfUkFORF9tZXRoID0gbWV0aDsKKwlyZXR1cm4gMTsKKwl9CisKK2NvbnN0IFJBTkRfTUVUSE9EICpSQU5EX2dldF9yYW5kX21ldGhvZCh2b2lkKQorCXsKKwlpZiAoIWRlZmF1bHRfUkFORF9tZXRoKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCUVOR0lORSAqZSA9IEVOR0lORV9nZXRfZGVmYXVsdF9SQU5EKCk7CisJCWlmKGUpCisJCQl7CisJCQlkZWZhdWx0X1JBTkRfbWV0aCA9IEVOR0lORV9nZXRfUkFORChlKTsKKwkJCWlmKCFkZWZhdWx0X1JBTkRfbWV0aCkKKwkJCQl7CisJCQkJRU5HSU5FX2ZpbmlzaChlKTsKKwkJCQllID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCWlmKGUpCisJCQlmdW5jdF9yZWYgPSBlOworCQllbHNlCisjZW5kaWYKKwkJCWRlZmF1bHRfUkFORF9tZXRoID0gUkFORF9TU0xlYXkoKTsKKwkJfQorCXJldHVybiBkZWZhdWx0X1JBTkRfbWV0aDsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKK2ludCBSQU5EX3NldF9yYW5kX2VuZ2luZShFTkdJTkUgKmVuZ2luZSkKKwl7CisJY29uc3QgUkFORF9NRVRIT0QgKnRtcF9tZXRoID0gTlVMTDsKKwlpZihlbmdpbmUpCisJCXsKKwkJaWYoIUVOR0lORV9pbml0KGVuZ2luZSkpCisJCQlyZXR1cm4gMDsKKwkJdG1wX21ldGggPSBFTkdJTkVfZ2V0X1JBTkQoZW5naW5lKTsKKwkJaWYoIXRtcF9tZXRoKQorCQkJeworCQkJRU5HSU5FX2ZpbmlzaChlbmdpbmUpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkvKiBUaGlzIGZ1bmN0aW9uIHJlbGVhc2VzIGFueSBwcmlvciBFTkdJTkUgc28gY2FsbCBpdCBmaXJzdCAqLworCVJBTkRfc2V0X3JhbmRfbWV0aG9kKHRtcF9tZXRoKTsKKwlmdW5jdF9yZWYgPSBlbmdpbmU7CisJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKK3ZvaWQgUkFORF9jbGVhbnVwKHZvaWQpCisJeworCWNvbnN0IFJBTkRfTUVUSE9EICptZXRoID0gUkFORF9nZXRfcmFuZF9tZXRob2QoKTsKKwlpZiAobWV0aCAmJiBtZXRoLT5jbGVhbnVwKQorCQltZXRoLT5jbGVhbnVwKCk7CisJUkFORF9zZXRfcmFuZF9tZXRob2QoTlVMTCk7CisJfQorCit2b2lkIFJBTkRfc2VlZChjb25zdCB2b2lkICpidWYsIGludCBudW0pCisJeworCWNvbnN0IFJBTkRfTUVUSE9EICptZXRoID0gUkFORF9nZXRfcmFuZF9tZXRob2QoKTsKKwlpZiAobWV0aCAmJiBtZXRoLT5zZWVkKQorCQltZXRoLT5zZWVkKGJ1ZixudW0pOworCX0KKwordm9pZCBSQU5EX2FkZChjb25zdCB2b2lkICpidWYsIGludCBudW0sIGRvdWJsZSBlbnRyb3B5KQorCXsKKwljb25zdCBSQU5EX01FVEhPRCAqbWV0aCA9IFJBTkRfZ2V0X3JhbmRfbWV0aG9kKCk7CisJaWYgKG1ldGggJiYgbWV0aC0+YWRkKQorCQltZXRoLT5hZGQoYnVmLG51bSxlbnRyb3B5KTsKKwl9CisKK2ludCBSQU5EX2J5dGVzKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG51bSkKKwl7CisJY29uc3QgUkFORF9NRVRIT0QgKm1ldGggPSBSQU5EX2dldF9yYW5kX21ldGhvZCgpOworCWlmIChtZXRoICYmIG1ldGgtPmJ5dGVzKQorCQlyZXR1cm4gbWV0aC0+Ynl0ZXMoYnVmLG51bSk7CisJcmV0dXJuKC0xKTsKKwl9CisKK2ludCBSQU5EX3BzZXVkb19ieXRlcyh1bnNpZ25lZCBjaGFyICpidWYsIGludCBudW0pCisJeworCWNvbnN0IFJBTkRfTUVUSE9EICptZXRoID0gUkFORF9nZXRfcmFuZF9tZXRob2QoKTsKKwlpZiAobWV0aCAmJiBtZXRoLT5wc2V1ZG9yYW5kKQorCQlyZXR1cm4gbWV0aC0+cHNldWRvcmFuZChidWYsbnVtKTsKKwlyZXR1cm4oLTEpOworCX0KKworaW50IFJBTkRfc3RhdHVzKHZvaWQpCisJeworCWNvbnN0IFJBTkRfTUVUSE9EICptZXRoID0gUkFORF9nZXRfcmFuZF9tZXRob2QoKTsKKwlpZiAobWV0aCAmJiBtZXRoLT5zdGF0dXMpCisJCXJldHVybiBtZXRoLT5zdGF0dXMoKTsKKwlyZXR1cm4gMDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX253LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX253LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3N2ZmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfbncuYwpAQCAtMCwwICsxLDE4MyBAQAorLyogY3J5cHRvL3JhbmQvcmFuZF9udy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSAicmFuZF9sY2wuaCIKKworI2lmIGRlZmluZWQgKE9QRU5TU0xfU1lTX05FVFdBUkUpCisKKyNpZiBkZWZpbmVkKE5FVFdBUkVfTElCQykKKyNpbmNsdWRlIDxua3MvdGhyZWFkLmg+CisjZWxzZQorI2luY2x1ZGUgPG53dGhyZWFkLmg+CisjZW5kaWYKKworZXh0ZXJuIGludCBHZXRQcm9jZXNzU3dpdGNoQ291bnQodm9pZCk7CisjaWYgIWRlZmluZWQoTkVUV0FSRV9MSUJDKSB8fCAoQ1VSUkVOVF9OREtfVEhSRVNIT0xEIDwgNTA5MjIwMDAwKQorZXh0ZXJuIHZvaWQgKlJ1bm5pbmdQcm9jZXNzOyAvKiBkZWNsYXJlIGhlcmUgc2FtZSBhcyBmb3VuZCBpbiBuZXdlciBOREtzICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBHZXRTdXBlckhpZ2hSZXNvbHV0aW9uVGltZXIodm9pZCk7CisjZW5kaWYKKworICAgLyogdGhlIEZBUSBpbmRpY2F0ZXMgd2UgbmVlZCB0byBwcm92aWRlIGF0IGxlYXN0IDIwIGJ5dGVzICgxNjAgYml0cykgb2Ygc2VlZAorICAgKi8KK2ludCBSQU5EX3BvbGwodm9pZCkKK3sKKyAgIHVuc2lnbmVkIGxvbmcgbDsKKyAgIHVuc2lnbmVkIGxvbmcgdHNjOworICAgaW50IGk7IAorCisgICAgICAvKiBUaGVyZSBhcmUgc2V2ZXJhbCBvcHRpb25zIHRvIGdhdGhlciBtaXNjZWxsYW5lb3VzIGRhdGEKKyAgICAgICAqIGJ1dCBmb3Igbm93IHdlIHdpbGwgbG9vcCBjaGVja2luZyB0aGUgdGltZSBzdGFtcCBjb3VudGVyIChyZHRzYykgYW5kCisgICAgICAgKiB0aGUgU3VwZXJIaWdoUmVzb2x1dGlvblRpbWVyLiAgRWFjaCBpdGVyYXRpb24gd2lsbCBjb2xsZWN0IDggYnl0ZXMKKyAgICAgICAqIG9mIGRhdGEgYnV0IGl0IGlzIHRyZWF0ZWQgYXMgb25seSAxIGJ5dGUgb2YgZW50cm9weS4gIFRoZSBjYWxsIHRvCisgICAgICAgKiBUaHJlYWRTd2l0Y2hXaXRoRGVsYXkoKSB3aWxsIGludHJvZHVjZSBhZGRpdGlvbmFsIHZhcmlhYmlsaXR5IGludG8KKyAgICAgICAqIHRoZSBkYXRhIHJldHVybmVkIGJ5IHJkdHNjLgorICAgICAgICoKKyAgICAgICAqIEFwcGxpY2F0aW9ucyBjYW4gYWd1bWVudCB0aGUgc2VlZCBtYXRlcmlhbCBieSBhZGRpbmcgYWRkaXRpb25hbAorICAgICAgICogc3R1ZmYgd2l0aCBSQU5EX2FkZCgpIGFuZCBzaG91bGQgcHJvYmFibHkgZG8gc28uCisgICAgICAqLworICAgbCA9IEdldFByb2Nlc3NTd2l0Y2hDb3VudCgpOworICAgUkFORF9hZGQoJmwsc2l6ZW9mKGwpLDEpOworICAgCisgICAvKiBuZWVkIHRvIGNhc3QgdGhlIHZvaWQqIHRvIHVuc2lnbmVkIGxvbmcgaGVyZSAqLworICAgbCA9ICh1bnNpZ25lZCBsb25nKVJ1bm5pbmdQcm9jZXNzOworICAgUkFORF9hZGQoJmwsc2l6ZW9mKGwpLDEpOworCisgICBmb3IoIGk9MjsgaTxFTlRST1BZX05FRURFRDsgaSsrKQorICAgeworI2lmZGVmIF9fTVdFUktTX18KKyAgICAgIGFzbSAKKyAgICAgIHsKKyAgICAgICAgIHJkdHNjCisgICAgICAgICBtb3YgdHNjLCBlYXggICAgICAgIAorICAgICAgfQorI2Vsc2UKKyAgICAgIGFzbSB2b2xhdGlsZSgicmR0c2MiOiI9QSIgKHRzYykpOworI2VuZGlmCisKKyAgICAgIFJBTkRfYWRkKCZ0c2MsIHNpemVvZih0c2MpLCAxKTsKKworICAgICAgbCA9IEdldFN1cGVySGlnaFJlc29sdXRpb25UaW1lcigpOworICAgICAgUkFORF9hZGQoJmwsIHNpemVvZihsKSwgMCk7CisKKyMgaWYgZGVmaW5lZChORVRXQVJFX0xJQkMpCisgICAgICBOWFRocmVhZFlpZWxkKCk7CisjIGVsc2UgLyogTkVUV0FSRV9DTElCICovCisgICAgICBUaHJlYWRTd2l0Y2hXaXRoRGVsYXkoKTsKKyMgZW5kaWYKKyAgIH0KKworICAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZiAKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF9vczIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfb3MyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxZTc4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfb3MyLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qIGNyeXB0by9yYW5kL3JhbmRfb3MyLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlICJyYW5kX2xjbC5oIgorCisjaWZkZWYgT1BFTlNTTF9TWVNfT1MyCisKKyNkZWZpbmUgSU5DTF9ET1NQUk9DRVNTCisjZGVmaW5lIElOQ0xfRE9TUFJPRklMRQorI2RlZmluZSBJTkNMX0RPU01JU0MKKyNkZWZpbmUgSU5DTF9ET1NNT0RVTEVNR1IKKyNpbmNsdWRlIDxvczIuaD4KKworI2RlZmluZSAgIENNRF9LSV9SRENOVCAgICAoMHg2MykKKwordHlwZWRlZiBzdHJ1Y3QgX0NQVVVUSUwgeworICAgIFVMT05HIHVsVGltZUxvdzsgICAgICAgICAgICAvKiBMb3cgMzIgYml0cyBvZiB0aW1lIHN0YW1wICAgICAgKi8KKyAgICBVTE9ORyB1bFRpbWVIaWdoOyAgICAgICAgICAgLyogSGlnaCAzMiBiaXRzIG9mIHRpbWUgc3RhbXAgICAgICovCisgICAgVUxPTkcgdWxJZGxlTG93OyAgICAgICAgICAgIC8qIExvdyAzMiBiaXRzIG9mIGlkbGUgdGltZSAgICAgICAqLworICAgIFVMT05HIHVsSWRsZUhpZ2g7ICAgICAgICAgICAvKiBIaWdoIDMyIGJpdHMgb2YgaWRsZSB0aW1lICAgICAgKi8KKyAgICBVTE9ORyB1bEJ1c3lMb3c7ICAgICAgICAgICAgLyogTG93IDMyIGJpdHMgb2YgYnVzeSB0aW1lICAgICAgICovCisgICAgVUxPTkcgdWxCdXN5SGlnaDsgICAgICAgICAgIC8qIEhpZ2ggMzIgYml0cyBvZiBidXN5IHRpbWUgICAgICAqLworICAgIFVMT05HIHVsSW50ckxvdzsgICAgICAgICAgICAvKiBMb3cgMzIgYml0cyBvZiBpbnRlcnJ1cHQgdGltZSAgKi8KKyAgICBVTE9ORyB1bEludHJIaWdoOyAgICAgICAgICAgLyogSGlnaCAzMiBiaXRzIG9mIGludGVycnVwdCB0aW1lICovCit9IENQVVVUSUw7CisKKyNpZm5kZWYgX19LTElCQ19fCitBUElSRVQgQVBJRU5UUlkoKkRvc1BlcmZTeXNDYWxsKSAoVUxPTkcgdWxDb21tYW5kLCBVTE9ORyB1bFBhcm0xLCBVTE9ORyB1bFBhcm0yLCBVTE9ORyB1bFBhcm0zKSA9IE5VTEw7CitBUElSRVQgQVBJRU5UUlkoKkRvc1F1ZXJ5U3lzU3RhdGUpIChVTE9ORyBmdW5jLCBVTE9ORyBhcmcxLCBVTE9ORyBwaWQsIFVMT05HIF9yZXNfLCBQVk9JRCBidWYsIFVMT05HIGJ1ZnN6KSA9IE5VTEw7CisjZW5kaWYKK0hNT0RVTEUgaERvc2NhbGxzID0gMDsKKworaW50IFJBTkRfcG9sbCh2b2lkKQoreworICAgIGNoYXIgZmFpbGVkX21vZHVsZVsyMF07CisgICAgUVdPUkQgcXdUaW1lOworICAgIFVMT05HIFN5c1ZhcnNbUVNWX0ZPUkVHUk9VTkRfUFJPQ0VTU107CisKKyAgICBpZiAoaERvc2NhbGxzID09IDApIHsKKyAgICAgICAgVUxPTkcgcmMgPSBEb3NMb2FkTW9kdWxlKGZhaWxlZF9tb2R1bGUsIHNpemVvZihmYWlsZWRfbW9kdWxlKSwgIkRPU0NBTExTIiwgJmhEb3NjYWxscyk7CisKKyNpZm5kZWYgX19LTElCQ19fCisgICAgICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICAgICByYyA9IERvc1F1ZXJ5UHJvY0FkZHIoaERvc2NhbGxzLCA5NzYsIE5VTEwsIChQRk4gKikmRG9zUGVyZlN5c0NhbGwpOworCisgICAgICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgRG9zUGVyZlN5c0NhbGwgPSBOVUxMOworCisgICAgICAgICAgICByYyA9IERvc1F1ZXJ5UHJvY0FkZHIoaERvc2NhbGxzLCAzNjgsIE5VTEwsIChQRk4gKikmRG9zUXVlcnlTeXNTdGF0ZSk7CisKKyAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICBEb3NRdWVyeVN5c1N0YXRlID0gTlVMTDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgLyogU2FtcGxlIHRoZSBoaS1yZXMgdGltZXIsIHJ1bnMgYXQgYXJvdW5kIDEuMSBNSHogKi8KKyAgICBEb3NUbXJRdWVyeVRpbWUoJnF3VGltZSk7CisgICAgUkFORF9hZGQoJnF3VGltZSwgc2l6ZW9mKHF3VGltZSksIDIpOworCisgICAgLyogU2FtcGxlIGEgYnVuY2ggb2Ygc3lzdGVtIHZhcmlhYmxlcywgaW5jbHVkZXMgdmFyaW91cyBwcm9jZXNzICYgbWVtb3J5IHN0YXRpc3RpY3MgKi8KKyAgICBEb3NRdWVyeVN5c0luZm8oMSwgUVNWX0ZPUkVHUk9VTkRfUFJPQ0VTUywgU3lzVmFycywgc2l6ZW9mKFN5c1ZhcnMpKTsKKyAgICBSQU5EX2FkZChTeXNWYXJzLCBzaXplb2YoU3lzVmFycyksIDQpOworCisgICAgLyogSWYgYXZhaWxhYmxlLCBzYW1wbGUgQ1BVIHJlZ2lzdGVycyB0aGF0IGNvdW50IGF0IENQVSBNSHoKKyAgICAgKiBPbmx5IGZhaXJseSBuZXcgQ1BVcyAoUFBybyAmIEs2IG9ud2FyZHMpICYgT1MvMiB2ZXJzaW9ucyBzdXBwb3J0IHRoaXMKKyAgICAgKi8KKyAgICBpZiAoRG9zUGVyZlN5c0NhbGwpIHsKKyAgICAgICAgQ1BVVVRJTCB1dGlsOworCisgICAgICAgIGlmIChEb3NQZXJmU3lzQ2FsbChDTURfS0lfUkRDTlQsIChVTE9ORykmdXRpbCwgMCwgMCkgPT0gMCkgeworICAgICAgICAgICAgUkFORF9hZGQoJnV0aWwsIHNpemVvZih1dGlsKSwgMTApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworI2lmbmRlZiBfX0tMSUJDX18KKyAgICAgICAgICAgIERvc1BlcmZTeXNDYWxsID0gTlVMTDsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgLyogRG9zUXVlcnlTeXNTdGF0ZSgpIGdpdmVzIHVzIGEgaHVnZSBxdWFudGl0eSBvZiBwcm9jZXNzLCB0aHJlYWQsIG1lbW9yeSAmIGhhbmRsZSBzdGF0cyAqLworICAgIGlmIChEb3NRdWVyeVN5c1N0YXRlKSB7CisgICAgICAgIGNoYXIgKmJ1ZmZlciA9IE9QRU5TU0xfbWFsbG9jKDI1NiAqIDEwMjQpOworCisgICAgICAgIGlmIChEb3NRdWVyeVN5c1N0YXRlKDB4MUYsIDAsIDAsIDAsIGJ1ZmZlciwgMjU2ICogMTAyNCkgPT0gMCkgeworICAgICAgICAgICAgLyogRmlyc3QgNCBieXRlcyBpbiBidWZmZXIgaXMgYSBwb2ludGVyIHRvIHRoZSB0aHJlYWQgY291bnQKKyAgICAgICAgICAgICAqIHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCAxIGJ5dGUgb2YgZW50cm9weSBwZXIgdGhyZWFkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFJBTkRfYWRkKGJ1ZmZlciwgMjU2ICogMTAyNCwgKiooVUxPTkcgKiopYnVmZmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIE9QRU5TU0xfZnJlZShidWZmZXIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIE9QRU5TU0xfU1lTX09TMiAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF91bml4LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX3VuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWVhZDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF91bml4LmMKQEAgLTAsMCArMSwzOTEgQEAKKy8qIGNyeXB0by9yYW5kL3JhbmRfdW5peC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIFVTRV9TT0NLRVRTCisjaW5jbHVkZSAiZV9vcy5oIgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSAicmFuZF9sY2wuaCIKKworI2lmICEoZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19PUzIpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfVlhXT1JLUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSkKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0xJTlVYKSAvKiBzaG91bGQgYWN0dWFsbHkgYmUgYXZhaWxhYmxlIHZpcnR1YWxseSBldmVyeXdoZXJlICovCisjIGluY2x1ZGUgPHBvbGwuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmbmRlZiBGRF9TRVRTSVpFCisjIGRlZmluZSBGRF9TRVRTSVpFICg4KnNpemVvZihmZF9zZXQpKQorI2VuZGlmCisKKyNpZmRlZiBfX1ZPU19fCitpbnQgUkFORF9wb2xsKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBidWZbRU5UUk9QWV9ORUVERURdOworCXBpZF90IGN1cnJfcGlkOworCXVpZF90IGN1cnJfdWlkOworCXN0YXRpYyBpbnQgZmlyc3Q9MTsKKwlpbnQgaTsKKwlsb25nIHJuZCA9IDA7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXVuc2lnbmVkIHNlZWQ7CisKKy8qIFRoZSBWT1MgcmFuZG9tKCkgZnVuY3Rpb24gc3RhcnRzIGZyb20gYSBzdGF0aWMgc2VlZCBzbyBpdHMKKyAgIGluaXRpYWwgdmFsdWUgaXMgcHJlZGljdGFibGUuICBJZiByYW5kb20oKSByZXR1cm5zIHRoZQorICAgaW5pdGlhbCB2YWx1ZSwgcmVzZWVkIGl0IHdpdGggZHluYW1pYyBkYXRhLiAgVGhlIFZPUworICAgcmVhbC10aW1lIGNsb2NrIGhhcyBhIGdyYW51bGFyaXR5IG9mIDEgbnNlYyBzbyBpdCBzaG91bGQgYmUKKyAgIHJlYXNvbmFibHkgZGlmZmljdWx0IHRvIHByZWRpY3QgaXRzIGV4YWN0IHZhbHVlLiAgRG8gbm90CisgICBncmF0dWl0b3VzbHkgcmVzZWVkIHRoZSBQUk5HIGJlY2F1c2Ugb3RoZXIgY29kZSBpbiB0aGlzCisgICBwcm9jZXNzIG9yIHRocmVhZCBtYXkgYmUgdXNpbmcgaXQuICAqLworCisJaWYgKGZpcnN0KSB7CisJCWZpcnN0ID0gMDsKKwkJcm5kID0gcmFuZG9tICgpOworCQlpZiAocm5kID09IDE4MDQyODkzODMpIHsKKwkJCWNsb2NrX2dldHRpbWUgKENMT0NLX1JFQUxUSU1FLCAmdHMpOworCQkJY3Vycl9waWQgPSBnZXRwaWQoKTsKKwkJCWN1cnJfdWlkID0gZ2V0dWlkKCk7CisJCQlzZWVkID0gdHMudHZfc2VjIF4gdHMudHZfbnNlYyBeIGN1cnJfcGlkIF4gY3Vycl91aWQ7CisJCQlzcmFuZG9tIChzZWVkKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKTsgaSsrKSB7CisJCWlmIChpICUgNCA9PSAwKQorCQkJcm5kID0gcmFuZG9tKCk7CisJCWJ1ZltpXSA9IHJuZDsKKwkJcm5kID4+PSA4OworCX0KKwlSQU5EX2FkZChidWYsIHNpemVvZihidWYpLCBFTlRST1BZX05FRURFRCk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJcmV0dXJuIDE7Cit9CisjZWxpZiBkZWZpbmVkIF9fT3BlbkJTRF9fCitpbnQgUkFORF9wb2xsKHZvaWQpCit7CisJdV9pbnQzMl90IHJuZCA9IDAsIGk7CisJdW5zaWduZWQgY2hhciBidWZbRU5UUk9QWV9ORUVERURdOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihidWYpOyBpKyspIHsKKwkJaWYgKGkgJSA0ID09IDApCisJCQlybmQgPSBhcmM0cmFuZG9tKCk7CisJCWJ1ZltpXSA9IHJuZDsKKwkJcm5kID4+PSA4OworCX0KKwlSQU5EX2FkZChidWYsIHNpemVvZihidWYpLCBFTlRST1BZX05FRURFRCk7CisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJcmV0dXJuIDE7Cit9CisjZWxzZSAvKiAhZGVmaW5lZChfX09wZW5CU0RfXykgKi8KK2ludCBSQU5EX3BvbGwodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGw7CisJcGlkX3QgY3Vycl9waWQgPSBnZXRwaWQoKTsKKyNpZiBkZWZpbmVkKERFVlJBTkRPTSkgfHwgZGVmaW5lZChERVZSQU5ET01fRUdEKQorCXVuc2lnbmVkIGNoYXIgdG1wYnVmW0VOVFJPUFlfTkVFREVEXTsKKwlpbnQgbiA9IDA7CisjZW5kaWYKKyNpZmRlZiBERVZSQU5ET00KKwlzdGF0aWMgY29uc3QgY2hhciAqcmFuZG9tZmlsZXNbXSA9IHsgREVWUkFORE9NIH07CisJc3RydWN0IHN0YXQgcmFuZG9tc3RhdHNbc2l6ZW9mKHJhbmRvbWZpbGVzKS9zaXplb2YocmFuZG9tZmlsZXNbMF0pXTsKKwlpbnQgZmQ7CisJdW5zaWduZWQgaW50IGk7CisjZW5kaWYKKyNpZmRlZiBERVZSQU5ET01fRUdECisJc3RhdGljIGNvbnN0IGNoYXIgKmVnZHNvY2tldHNbXSA9IHsgREVWUkFORE9NX0VHRCwgTlVMTCB9OworCWNvbnN0IGNoYXIgKiplZ2Rzb2NrZXQgPSBOVUxMOworI2VuZGlmCisKKyNpZmRlZiBERVZSQU5ET00KKwltZW1zZXQocmFuZG9tc3RhdHMsMCxzaXplb2YocmFuZG9tc3RhdHMpKTsKKwkvKiBVc2UgYSByYW5kb20gZW50cm9weSBwb29sIGRldmljZS4gTGludXgsIEZyZWVCU0QgYW5kIE9wZW5CU0QKKwkgKiBoYXZlIHRoaXMuIFVzZSAvZGV2L3VyYW5kb20gaWYgeW91IGNhbiBhcyAvZGV2L3JhbmRvbSBtYXkgYmxvY2sKKwkgKiBpZiBpdCBydW5zIG91dCBvZiByYW5kb20gZW50cmllcy4gICovCisKKwlmb3IgKGkgPSAwOyAoaSA8IHNpemVvZihyYW5kb21maWxlcykvc2l6ZW9mKHJhbmRvbWZpbGVzWzBdKSkgJiYKKwkJCShuIDwgRU5UUk9QWV9ORUVERUQpOyBpKyspCisJCXsKKwkJaWYgKChmZCA9IG9wZW4ocmFuZG9tZmlsZXNbaV0sIE9fUkRPTkxZCisjaWZkZWYgT19OT05CTE9DSworCQkJfE9fTk9OQkxPQ0sKKyNlbmRpZgorI2lmZGVmIE9fQklOQVJZCisJCQl8T19CSU5BUlkKKyNlbmRpZgorI2lmZGVmIE9fTk9DVFRZIC8qIElmIGl0IGhhcHBlbnMgdG8gYmUgYSBUVFkgKGdvZCBmb3JiaWQpLCBkbyBub3QgbWFrZSBpdAorCQkgICBvdXIgY29udHJvbGxpbmcgdHR5ICovCisJCQl8T19OT0NUVFkKKyNlbmRpZgorCQkJKSkgPj0gMCkKKwkJCXsKKwkJCWludCB1c2VjID0gMTAqMTAwMDsgLyogc3BlbmQgMTBtcyBvbiBlYWNoIGZpbGUgKi8KKwkJCWludCByOworCQkJdW5zaWduZWQgaW50IGo7CisJCQlzdHJ1Y3Qgc3RhdCAqc3Q9JnJhbmRvbXN0YXRzW2ldOworCisJCQkvKiBBdm9pZCB1c2luZyBzYW1lIGlucHV0Li4uIFVzZWQgdG8gYmUgT19OT0ZPTExPVworCQkJICogYWJvdmUsIGJ1dCBpdCdzIG5vdCB1bml2ZXJzYWxseSBhcHByb3ByaWF0ZS4uLiAqLworCQkJaWYgKGZzdGF0KGZkLHN0KSAhPSAwKQl7IGNsb3NlKGZkKTsgY29udGludWU7IH0KKwkJCWZvciAoaj0wO2o8aTtqKyspCisJCQkJeworCQkJCWlmIChyYW5kb21zdGF0c1tqXS5zdF9pbm89PXN0LT5zdF9pbm8gJiYKKwkJCQkgICAgcmFuZG9tc3RhdHNbal0uc3RfZGV2PT1zdC0+c3RfZGV2KQorCQkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoajxpKQkJeyBjbG9zZShmZCk7IGNvbnRpbnVlOyB9CisKKwkJCWRvCisJCQkJeworCQkJCWludCB0cnlfcmVhZCA9IDA7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisJCQkJLyogc2VsZWN0KCkgaXMgYnJva2VuIGluIEJlT1MgUjUsIHNvIHdlIHNpbXBseQorCQkJCSAqICB0cnkgdG8gcmVhZCBzb21ldGhpbmcgYW5kIHNub296ZSBpZiB3ZSBjb3VsZG4ndCAqLworCQkJCXRyeV9yZWFkID0gMTsKKworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19MSU5VWCkKKwkJCQkvKiB1c2UgcG9sbCgpICovCisJCQkJc3RydWN0IHBvbGxmZCBwc2V0OworCQkJCQorCQkJCXBzZXQuZmQgPSBmZDsKKwkJCQlwc2V0LmV2ZW50cyA9IFBPTExJTjsKKwkJCQlwc2V0LnJldmVudHMgPSAwOworCisJCQkJaWYgKHBvbGwoJnBzZXQsIDEsIHVzZWMgLyAxMDAwKSA8IDApCisJCQkJCXVzZWMgPSAwOworCQkJCWVsc2UKKwkJCQkJdHJ5X3JlYWQgPSAocHNldC5yZXZlbnRzICYgUE9MTElOKSAhPSAwOworCisjZWxzZQorCQkJCS8qIHVzZSBzZWxlY3QoKSAqLworCQkJCWZkX3NldCBmc2V0OworCQkJCXN0cnVjdCB0aW1ldmFsIHQ7CisJCQkJCisJCQkJdC50dl9zZWMgPSAwOworCQkJCXQudHZfdXNlYyA9IHVzZWM7CisKKwkJCQlpZiAoRkRfU0VUU0laRSA+IDAgJiYgKHVuc2lnbmVkKWZkID49IEZEX1NFVFNJWkUpCisJCQkJCXsKKwkJCQkJLyogY2FuJ3QgdXNlIHNlbGVjdCwgc28ganVzdCB0cnkgdG8gcmVhZCBvbmNlIGFueXdheSAqLworCQkJCQl0cnlfcmVhZCA9IDE7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJRkRfWkVSTygmZnNldCk7CisJCQkJCUZEX1NFVChmZCwgJmZzZXQpOworCQkJCQkKKwkJCQkJaWYgKHNlbGVjdChmZCsxLCZmc2V0LE5VTEwsTlVMTCwmdCkgPj0gMCkKKwkJCQkJCXsKKwkJCQkJCXVzZWMgPSB0LnR2X3VzZWM7CisJCQkJCQlpZiAoRkRfSVNTRVQoZmQsICZmc2V0KSkKKwkJCQkJCQl0cnlfcmVhZCA9IDE7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXVzZWMgPSAwOworCQkJCQl9CisjZW5kaWYKKwkJCQkKKwkJCQlpZiAodHJ5X3JlYWQpCisJCQkJCXsKKwkJCQkJciA9IHJlYWQoZmQsKHVuc2lnbmVkIGNoYXIgKil0bXBidWYrbiwgRU5UUk9QWV9ORUVERUQtbik7CisJCQkJCWlmIChyID4gMCkKKwkJCQkJCW4gKz0gcjsKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisJCQkJCWlmIChyID09IDApCisJCQkJCQlzbm9vemUodC50dl91c2VjKTsKKyNlbmRpZgorCQkJCQl9CisJCQkJZWxzZQorCQkJCQlyID0gLTE7CisJCQkJCisJCQkJLyogU29tZSBVbml4ZW4gd2lsbCB1cGRhdGUgdCBpbiBzZWxlY3QoKSwgc29tZQorCQkJCSAgIHdvbid0LiAgRm9yIHRob3NlIHdobyB3b24ndCwgb3IgaWYgd2UKKwkJCQkgICBkaWRuJ3QgdXNlIHNlbGVjdCgpIGluIHRoZSBmaXJzdCBwbGFjZSwKKwkJCQkgICBnaXZlIHVwIGhlcmUsIG90aGVyd2lzZSwgd2Ugd2lsbCBkbworCQkJCSAgIHRoaXMgb25jZSBhZ2FpbiBmb3IgdGhlIHJlbWFpbmluZworCQkJCSAgIHRpbWUuICovCisJCQkJaWYgKHVzZWMgPT0gMTAqMTAwMCkKKwkJCQkJdXNlYyA9IDA7CisJCQkJfQorCQkJd2hpbGUgKChyID4gMCB8fAorCQkJICAgICAgIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pKSAmJiB1c2VjICE9IDAgJiYgbiA8IEVOVFJPUFlfTkVFREVEKTsKKworCQkJY2xvc2UoZmQpOworCQkJfQorCQl9CisjZW5kaWYgLyogZGVmaW5lZChERVZSQU5ET00pICovCisKKyNpZmRlZiBERVZSQU5ET01fRUdECisJLyogVXNlIGFuIEVHRCBzb2NrZXQgdG8gcmVhZCBlbnRyb3B5IGZyb20gYW4gRUdEIG9yIFBSTkdEIGVudHJvcHkKKwkgKiBjb2xsZWN0aW5nIGRhZW1vbi4gKi8KKworCWZvciAoZWdkc29ja2V0ID0gZWdkc29ja2V0czsgKmVnZHNvY2tldCAmJiBuIDwgRU5UUk9QWV9ORUVERUQ7IGVnZHNvY2tldCsrKQorCQl7CisJCWludCByOworCisJCXIgPSBSQU5EX3F1ZXJ5X2VnZF9ieXRlcygqZWdkc29ja2V0LCAodW5zaWduZWQgY2hhciAqKXRtcGJ1ZituLAorCQkJCQkgRU5UUk9QWV9ORUVERUQtbik7CisJCWlmIChyID4gMCkKKwkJCW4gKz0gcjsKKwkJfQorI2VuZGlmIC8qIGRlZmluZWQoREVWUkFORE9NX0VHRCkgKi8KKworI2lmIGRlZmluZWQoREVWUkFORE9NKSB8fCBkZWZpbmVkKERFVlJBTkRPTV9FR0QpCisJaWYgKG4gPiAwKQorCQl7CisJCVJBTkRfYWRkKHRtcGJ1ZixzaXplb2YgdG1wYnVmLChkb3VibGUpbik7CisJCU9QRU5TU0xfY2xlYW5zZSh0bXBidWYsbik7CisJCX0KKyNlbmRpZgorCisJLyogcHV0IGluIHNvbWUgZGVmYXVsdCByYW5kb20gZGF0YSwgd2UgbmVlZCBtb3JlIHRoYW4ganVzdCB0aGlzICovCisJbD1jdXJyX3BpZDsKKwlSQU5EX2FkZCgmbCxzaXplb2YobCksMC4wKTsKKwlsPWdldHVpZCgpOworCVJBTkRfYWRkKCZsLHNpemVvZihsKSwwLjApOworCisJbD10aW1lKE5VTEwpOworCVJBTkRfYWRkKCZsLHNpemVvZihsKSwwLjApOworCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TKQorCXsKKwlzeXN0ZW1faW5mbyBzeXNJbmZvOworCWdldF9zeXN0ZW1faW5mbygmc3lzSW5mbyk7CisJUkFORF9hZGQoJnN5c0luZm8sc2l6ZW9mKHN5c0luZm8pLDApOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChERVZSQU5ET00pIHx8IGRlZmluZWQoREVWUkFORE9NX0VHRCkKKwlyZXR1cm4gMTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIGRlZmluZWQoX19PcGVuQlNEX18pICovCisjZW5kaWYgLyogIShkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX09TMikgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19WWFdPUktTKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpKSAqLworCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZYV09SS1MpCitpbnQgUkFORF9wb2xsKHZvaWQpCisJeworCXJldHVybiAwOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZF92bXMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfdm1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2N2EzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfdm1zLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qIGNyeXB0by9yYW5kL3JhbmRfdm1zLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPiBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlICJyYW5kX2xjbC5oIgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpCisKKyNpbmNsdWRlIDxkZXNjcmlwLmg+CisjaW5jbHVkZSA8anBpZGVmLmg+CisjaW5jbHVkZSA8c3NkZWYuaD4KKyNpbmNsdWRlIDxzdGFybGV0Lmg+CisjaWZkZWYgX19ERUNDCisjIHByYWdtYSBtZXNzYWdlIGRpc2FibGUgRE9MTEFSSUQKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGl0ZW1zX2RhdGFfc3QKKwl7CisJc2hvcnQgbGVuZ3RoLCBjb2RlOwkvKiBsZW5ndGggaXMgYW1vdW50IG9mIGJ5dGVzICovCisJfSBpdGVtc19kYXRhW10gPQorCQl7IHsgNCwgSlBJJF9CVUZJTyB9LAorCQkgIHsgNCwgSlBJJF9DUFVUSU0gfSwKKwkJICB7IDQsIEpQSSRfRElSSU8gfSwKKwkJICB7IDgsIEpQSSRfTE9HSU5USU0gfSwKKwkJICB7IDQsIEpQSSRfUEFHRUZMVFMgfSwKKwkJICB7IDQsIEpQSSRfUElEIH0sCisJCSAgeyA0LCBKUEkkX1dTU0laRSB9LAorCQkgIHsgMCwgMCB9CisJCX07CisJCSAgCitpbnQgUkFORF9wb2xsKHZvaWQpCisJeworCWxvbmcgcGlkLCBpb3NiWzJdOworCWludCBzdGF0dXMgPSAwOworCXN0cnVjdAorCQl7CisJCXNob3J0IGxlbmd0aCwgY29kZTsKKwkJbG9uZyAqYnVmZmVyOworCQlpbnQgKnJldGxlbjsKKwkJfSBpdGVtWzMyXSwgKnBpdGVtOworCXVuc2lnbmVkIGNoYXIgZGF0YV9idWZmZXJbMjU2XTsKKwlzaG9ydCB0b3RhbF9sZW5ndGggPSAwOworCXN0cnVjdCBpdGVtc19kYXRhX3N0ICpwaXRlbXNfZGF0YTsKKworCXBpdGVtc19kYXRhID0gaXRlbXNfZGF0YTsKKwlwaXRlbSA9IGl0ZW07CisKKwkvKiBTZXR1cCAqLworCXdoaWxlIChwaXRlbXNfZGF0YS0+bGVuZ3RoCisJCSYmICh0b3RhbF9sZW5ndGggKyBwaXRlbXNfZGF0YS0+bGVuZ3RoIDw9IDI1NikpCisJCXsKKwkJcGl0ZW0tPmxlbmd0aCA9IHBpdGVtc19kYXRhLT5sZW5ndGg7CisJCXBpdGVtLT5jb2RlID0gcGl0ZW1zX2RhdGEtPmNvZGU7CisJCXBpdGVtLT5idWZmZXIgPSAobG9uZyAqKSZkYXRhX2J1ZmZlclt0b3RhbF9sZW5ndGhdOworCQlwaXRlbS0+cmV0bGVuID0gMDsKKwkJdG90YWxfbGVuZ3RoICs9IHBpdGVtc19kYXRhLT5sZW5ndGg7CisJCXBpdGVtc19kYXRhKys7CisJCXBpdGVtKys7CisJCX0KKwlwaXRlbS0+bGVuZ3RoID0gcGl0ZW0tPmNvZGUgPSAwOworCisJLyoKKwkgKiBTY2FuIHRocm91Z2ggYWxsIHRoZSBwcm9jZXNzZXMgaW4gdGhlIHN5c3RlbSBhbmQgYWRkIGVudHJvcHkgd2l0aAorCSAqIHJlc3VsdHMgZnJvbSB0aGUgcHJvY2Vzc2VzIHRoYXQgd2VyZSBwb3NzaWJsZSB0byBsb29rIGF0LgorCSAqIEhvd2V2ZXIsIHZpZXcgdGhlIGluZm9ybWF0aW9uIGFzIG9ubHkgaGFsZiB0cnVzdGFibGUuCisJICovCisJcGlkID0gLTE7CQkJLyogc2VhcmNoIGNvbnRleHQgKi8KKwl3aGlsZSAoKHN0YXR1cyA9IHN5cyRnZXRqcGl3KDAsICZwaWQsICAwLCBpdGVtLCBpb3NiLCAwLCAwKSkKKwkJIT0gU1MkX05PTU9SRVBST0MpCisJCXsKKwkJaWYgKHN0YXR1cyA9PSBTUyRfTk9STUFMKQorCQkJeworCQkJUkFORF9hZGQoZGF0YV9idWZmZXIsIHRvdGFsX2xlbmd0aCwgdG90YWxfbGVuZ3RoLzIpOworCQkJfQorCQl9CisJc3lzJGdldHRpbShpb3NiKTsKKwlSQU5EX2FkZCgodW5zaWduZWQgY2hhciAqKWlvc2IsIHNpemVvZihpb3NiKSwgc2l6ZW9mKGlvc2IpLzIpOworCXJldHVybiAxOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmRfd2luLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX3dpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTM0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kX3dpbi5jCkBAIC0wLDAgKzEsODA3IEBACisvKiBjcnlwdG8vcmFuZC9yYW5kX3dpbi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSAicmFuZF9sY2wuaCIKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaWZuZGVmIF9XSU4zMl9XSU5OVAorIyBkZWZpbmUgX1dJTjMyX1dJTk5UIDB4MDQwMAorI2VuZGlmCisjaW5jbHVkZSA8d2luY3J5cHQuaD4KKyNpbmNsdWRlIDx0bGhlbHAzMi5oPgorCisvKiBMaW1pdCB0aGUgdGltZSBzcGVudCB3YWxraW5nIHRocm91Z2ggdGhlIGhlYXAsIHByb2Nlc3NlcywgdGhyZWFkcyBhbmQgbW9kdWxlcyB0bworICAgYSBtYXhpbXVtIG9mIDEwMDAgbWlsaXNlY29uZHMgZWFjaCwgdW5sZXNzIENyeXB0b0dlblJhbmRvbSBmYWlsZWQgKi8KKyNkZWZpbmUgTUFYREVMQVkgMTAwMAorCisvKiBJbnRlbCBoYXJkd2FyZSBSTkcgQ1NQIC0tIGF2YWlsYWJsZSBmcm9tCisgKiBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vc2VjdXJpdHkvcm5nL3JlZGlzdF9saWNlbnNlLmh0bQorICovCisjZGVmaW5lIFBST1ZfSU5URUxfU0VDIDIyCisjZGVmaW5lIElOVEVMX0RFRl9QUk9WIEwiSW50ZWwgSGFyZHdhcmUgQ3J5cHRvZ3JhcGhpYyBTZXJ2aWNlIFByb3ZpZGVyIgorCitzdGF0aWMgdm9pZCByZWFkdGltZXIodm9pZCk7CitzdGF0aWMgdm9pZCByZWFkc2NyZWVuKHZvaWQpOworCisvKiBJdCBhcHBlYXJzIGxpa2UgQ1VSU09SSU5GTywgUENVUlNPUklORk8gYW5kIExQQ1VSU09SSU5GTyBhcmUgb25seSBkZWZpbmVkCisgICB3aGVuIFdJTlZFUiBpcyAweDA1MDAgYW5kIHVwLCB3aGljaCBjdXJyZW50bHkgb25seSBoYXBwZW5zIG9uIFdpbjIwMDAuCisgICBVbmZvcnR1bmF0ZWx5LCB0aG9zZSBhcmUgdHlwZWRlZnMsIHNvIHRoZXkncmUgYSBsaXR0bGUgYml0IGRpZmZpY3VsdCB0bworICAgZGV0ZWN0IHByb3Blcmx5LiAgT24gdGhlIG90aGVyIGhhbmQsIHRoZSBtYWNybyBDVVJTT1JfU0hPV0lORyBpcyBkZWZpbmVkCisgICB3aXRoaW4gdGhlIHNhbWUgY29uZGl0aW9uYWwsIHNvIGl0IGNhbiBiZSB1c2UgdG8gZGV0ZWN0IHRoZSBhYnNlbmNlIG9mIHNhaWQKKyAgIHR5cGVkZWZzLiAqLworCisjaWZuZGVmIENVUlNPUl9TSE9XSU5HCisvKgorICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGdsb2JhbCBjdXJzb3IuCisgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0NVUlNPUklORk8KK3sKKyAgICBEV09SRCAgIGNiU2l6ZTsKKyAgICBEV09SRCAgIGZsYWdzOworICAgIEhDVVJTT1IgaEN1cnNvcjsKKyAgICBQT0lOVCAgIHB0U2NyZWVuUG9zOworfSBDVVJTT1JJTkZPLCAqUENVUlNPUklORk8sICpMUENVUlNPUklORk87CisKKyNkZWZpbmUgQ1VSU09SX1NIT1dJTkcgICAgIDB4MDAwMDAwMDEKKyNlbmRpZiAvKiBDVVJTT1JfU0hPV0lORyAqLworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOQ0UpCit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqQ1JZUFRBQ1FVSVJFQ09OVEVYVFcpKEhDUllQVFBST1YgKiwgTFBDV1NUUiwgTFBDV1NUUiwKKwkJCQkgICAgRFdPUkQsIERXT1JEKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpDUllQVEdFTlJBTkRPTSkoSENSWVBUUFJPViwgRFdPUkQsIEJZVEUgKik7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqQ1JZUFRSRUxFQVNFQ09OVEVYVCkoSENSWVBUUFJPViwgRFdPUkQpOworCit0eXBlZGVmIEhXTkQgKFdJTkFQSSAqR0VURk9SRUdST1VORFdJTkRPVykoVk9JRCk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqR0VUQ1VSU09SSU5GTykoUENVUlNPUklORk8pOwordHlwZWRlZiBEV09SRCAoV0lOQVBJICpHRVRRVUVVRVNUQVRVUykoVUlOVCk7CisKK3R5cGVkZWYgSEFORExFIChXSU5BUEkgKkNSRUFURVRPT0xIRUxQMzJTTkFQU0hPVCkoRFdPUkQsIERXT1JEKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpDTE9TRVRPT0xIRUxQMzJTTkFQU0hPVCkoSEFORExFKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpIRUFQMzJGSVJTVCkoTFBIRUFQRU5UUlkzMiwgRFdPUkQsIHNpemVfdCk7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqSEVBUDMyTkVYVCkoTFBIRUFQRU5UUlkzMik7Cit0eXBlZGVmIEJPT0wgKFdJTkFQSSAqSEVBUDMyTElTVCkoSEFORExFLCBMUEhFQVBMSVNUMzIpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKlBST0NFU1MzMikoSEFORExFLCBMUFBST0NFU1NFTlRSWTMyKTsKK3R5cGVkZWYgQk9PTCAoV0lOQVBJICpUSFJFQUQzMikoSEFORExFLCBMUFRIUkVBREVOVFJZMzIpOwordHlwZWRlZiBCT09MIChXSU5BUEkgKk1PRFVMRTMyKShIQU5ETEUsIExQTU9EVUxFRU5UUlkzMik7CisKKyNpbmNsdWRlIDxsbWNvbnMuaD4KKyNpbmNsdWRlIDxsbXN0YXRzLmg+CisjaWYgMSAvKiBUaGUgTkVUIEFQSSBpcyBVbmljb2RlIG9ubHkuICBJdCByZXF1aXJlcyB0aGUgdXNlIG9mIHRoZSBVTklDT0RFCisgICAgICAgKiBtYWNyby4gIFdoZW4gVU5JQ09ERSBpcyBkZWZpbmVkIExQVFNUUiBiZWNvbWVzIExQV1NUUi4gIExNU1RSIHdhcworICAgICAgICogd2FzIGFkZGVkIHRvIHRoZSBQbGF0Zm9ybSBTREsgdG8gYWxsb3cgdGhlIE5FVCBBUEkgdG8gYmUgdXNlZCBpbgorICAgICAgICogbm9uLVVuaWNvZGUgYXBwbGljYXRpb25zIHByb3ZpZGVkIHRoYXQgVW5pY29kZSBzdHJpbmdzIHdlcmUgc3RpbGwKKyAgICAgICAqIHVzZWQgZm9yIGlucHV0LiAgTE1TVFIgaXMgZGVmaW5lZCBhcyBMUFdTVFIuCisgICAgICAgKi8KK3R5cGVkZWYgTkVUX0FQSV9TVEFUVVMgKE5FVF9BUElfRlVOQ1RJT04gKiBORVRTVEFUR0VUKQorICAgICAgICAoTFBXU1RSLCBMUFdTVFIsIERXT1JELCBEV09SRCwgTFBCWVRFKik7Cit0eXBlZGVmIE5FVF9BUElfU1RBVFVTIChORVRfQVBJX0ZVTkNUSU9OICogTkVURlJFRSkoTFBCWVRFKTsKKyNlbmRpZiAvKiAxICovCisjZW5kaWYgLyogIU9QRU5TU0xfU1lTX1dJTkNFICovCisKK2ludCBSQU5EX3BvbGwodm9pZCkKK3sKKwlNRU1PUllTVEFUVVMgbTsKKwlIQ1JZUFRQUk9WIGhQcm92aWRlciA9IDA7CisJRFdPUkQgdzsKKwlpbnQgZ29vZCA9IDA7CisKKwkvKiBEZXRlcm1pbmUgdGhlIE9TIHZlcnNpb24gd2UgYXJlIG9uIHNvIHdlIGNhbiB0dXJuIG9mZiB0aGluZ3MgCisJICogdGhhdCBkbyBub3Qgd29yayBwcm9wZXJseS4KKwkgKi8KKyAgICAgICAgT1NWRVJTSU9OSU5GTyBvc3ZlcmluZm8gOworICAgICAgICBvc3ZlcmluZm8uZHdPU1ZlcnNpb25JbmZvU2l6ZSA9IHNpemVvZihPU1ZFUlNJT05JTkZPKSA7CisgICAgICAgIEdldFZlcnNpb25FeCggJm9zdmVyaW5mbyApIDsKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOQ0UpCisjIGlmIGRlZmluZWQoX1dJTjMyX1dDRSkgJiYgX1dJTjMyX1dDRT49MzAwCisvKiBFdmVuIHRob3VnaCBNU0ROIHNheXMgX1dJTjMyX1dDRT49MjEwLCBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgYXZhaWxhYmxlCisgKiBpbiBjb21tb25seSBhdmFpbGFibGUgaW1wbGVtZW50YXRpb25zIHByaW9yIDMwMC4uLiAqLworCXsKKwlCWVRFIGJ1Zls2NF07CisJLyogcG9sbCB0aGUgQ3J5cHRvQVBJIFBSTkcgKi8KKwkvKiBUaGUgQ3J5cHRvQVBJIHJldHVybnMgc2l6ZW9mKGJ1ZikgYnl0ZXMgb2YgcmFuZG9tbmVzcyAqLworCWlmIChDcnlwdEFjcXVpcmVDb250ZXh0VygmaFByb3ZpZGVyLCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLAorCQkJCUNSWVBUX1ZFUklGWUNPTlRFWFQpKQorCQl7CisJCWlmIChDcnlwdEdlblJhbmRvbShoUHJvdmlkZXIsIHNpemVvZihidWYpLCBidWYpKQorCQkJUkFORF9hZGQoYnVmLCBzaXplb2YoYnVmKSwgc2l6ZW9mKGJ1ZikpOworCQlDcnlwdFJlbGVhc2VDb250ZXh0KGhQcm92aWRlciwgMCk7IAorCQl9CisJfQorIyBlbmRpZgorI2Vsc2UJLyogT1BFTlNTTF9TWVNfV0lOQ0UgKi8KKwkvKgorCSAqIE5vbmUgb2YgYmVsb3cgbGlicmFyaWVzIGFyZSBwcmVzZW50IG9uIFdpbmRvd3MgQ0UsIHdoaWNoIGlzCisJICogd2h5IHdlICNpZm5kZWYgdGhlIHdob2xlIHNlY3Rpb24uIFRoaXMgYWxzbyBleGN1c2VzIHVzIGZyb20KKwkgKiBoYW5kbGluZyB0aGUgR2V0UHJvY0FkZHJlc3MgaXNzdWUuIFRoZSB0cm91YmxlIGlzIHRoYXQgaW4KKwkgKiByZWFsIFdpbjMyIEFQSSBHZXRQcm9jQWRkcmVzcyBpcyBhdmFpbGFibGUgaW4gQU5TSSBmbGF2b3IKKwkgKiBvbmx5LiBJbiBXaW5DRSBvbiB0aGUgb3RoZXIgaGFuZCBHZXRQcm9jQWRkcmVzcyBpcyBhIG1hY3JvCisJICogbW9zdCBjb21tb25seSBkZWZpbmVkIGFzIEdldFByb2NBZGRyZXNzVywgd2hpY2ggYWNjZXB0cworCSAqIFVuaWNvZGUgYXJndW1lbnQuIElmIHdlIHdlcmUgdG8gY2FsbCBHZXRQcm9jQWRkcmVzcyB1bmRlcgorCSAqIFdpbkNFLCBJJ2QgcmVjb21tZW5kIHRvIGVpdGhlciByZWRlZmluZSBHZXRQcm9jQWRkcmVzcyBhcworCSAqIEdldFByb2NBZGRyZXNzQSAodGhlcmUgc2VlbSB0byBiZSBvbmUgaW4gY29tbW9uIENFIHNwZWMpIG9yCisJICogaW1wbGVtZW50IG93biBzaGltIHJvdXRpbmUsIHdoaWNoIHdvdWxkIGFjY2VwdCBBTlNJIGFyZ3VtZW50CisJICogYW5kIGV4cGFuZCBpdCB0byBVbmljb2RlLgorCSAqLworCXsKKwkvKiBsb2FkIGZ1bmN0aW9ucyBkeW5hbWljYWxseSAtIG5vdCBhdmFpbGFibGUgb24gYWxsIHN5c3RlbXMgKi8KKwlITU9EVUxFIGFkdmFwaSA9IExvYWRMaWJyYXJ5KFRFWFQoIkFEVkFQSTMyLkRMTCIpKTsKKwlITU9EVUxFIGtlcm5lbCA9IExvYWRMaWJyYXJ5KFRFWFQoIktFUk5FTDMyLkRMTCIpKTsKKwlITU9EVUxFIHVzZXIgPSBOVUxMOworCUhNT0RVTEUgbmV0YXBpID0gTG9hZExpYnJhcnkoVEVYVCgiTkVUQVBJMzIuRExMIikpOworCUNSWVBUQUNRVUlSRUNPTlRFWFRXIGFjcXVpcmUgPSBOVUxMOworCUNSWVBUR0VOUkFORE9NIGdlbiA9IE5VTEw7CisJQ1JZUFRSRUxFQVNFQ09OVEVYVCByZWxlYXNlID0gTlVMTDsKKwlORVRTVEFUR0VUIG5ldHN0YXRnZXQgPSBOVUxMOworCU5FVEZSRUUgbmV0ZnJlZSA9IE5VTEw7CisJQllURSBidWZbNjRdOworCisJaWYgKG5ldGFwaSkKKwkJeworCQluZXRzdGF0Z2V0ID0gKE5FVFNUQVRHRVQpIEdldFByb2NBZGRyZXNzKG5ldGFwaSwiTmV0U3RhdGlzdGljc0dldCIpOworCQluZXRmcmVlID0gKE5FVEZSRUUpIEdldFByb2NBZGRyZXNzKG5ldGFwaSwiTmV0QXBpQnVmZmVyRnJlZSIpOworCQl9CisKKwlpZiAobmV0c3RhdGdldCAmJiBuZXRmcmVlKQorCQl7CisJCUxQQllURSBvdXRidWY7CisJCS8qIE5ldFN0YXRpc3RpY3NHZXQoKSBpcyBhIFVuaWNvZGUgb25seSBmdW5jdGlvbgorIAkJICogU1RBVF9XT1JLU1RBVElPTl8wIGNvbnRhaW5zIDQ1IGZpZWxkcyBhbmQgU1RBVF9TRVJWRVJfMAorCQkgKiBjb250YWlucyAxNyBmaWVsZHMuICBXZSB0cmVhdCBlYWNoIGZpZWxkIGFzIGEgc291cmNlIG9mCisJCSAqIG9uZSBieXRlIG9mIGVudHJvcHkuCisgICAgICAgICAgICAgICAgICovCisKKwkJaWYgKG5ldHN0YXRnZXQoTlVMTCwgTCJMYW5tYW5Xb3Jrc3RhdGlvbiIsIDAsIDAsICZvdXRidWYpID09IDApCisJCQl7CisJCQlSQU5EX2FkZChvdXRidWYsIHNpemVvZihTVEFUX1dPUktTVEFUSU9OXzApLCA0NSk7CisJCQluZXRmcmVlKG91dGJ1Zik7CisJCQl9CisJCWlmIChuZXRzdGF0Z2V0KE5VTEwsIEwiTGFubWFuU2VydmVyIiwgMCwgMCwgJm91dGJ1ZikgPT0gMCkKKwkJCXsKKwkJCVJBTkRfYWRkKG91dGJ1Ziwgc2l6ZW9mKFNUQVRfU0VSVkVSXzApLCAxNyk7CisJCQluZXRmcmVlKG91dGJ1Zik7CisJCQl9CisJCX0KKworCWlmIChuZXRhcGkpCisJCUZyZWVMaWJyYXJ5KG5ldGFwaSk7CisKKyAgICAgICAgLyogSXQgYXBwZWFycyBsaWtlIHRoaXMgY2FuIGNhdXNlIGFuIGV4Y2VwdGlvbiBkZWVwIHdpdGhpbiBBRFZBUEkzMi5ETEwKKyAgICAgICAgICogYXQgcmFuZG9tIHRpbWVzIG9uIFdpbmRvd3MgMjAwMC4gIFJlcG9ydGVkIGJ5IEplZmZyZXkgQWx0bWFuLiAgCisgICAgICAgICAqIE9ubHkgdXNlIGl0IG9uIE5ULgorCSAqLworCS8qIFdvbGZnYW5nIE1hcmN6eSA8V01hcmN6eUB0b3BjYWxsLmNvLmF0PiByZXBvcnRzIHRoYXQKKwkgKiB0aGUgUmVnUXVlcnlWYWx1ZUV4IGNhbGwgYmVsb3cgY2FuIGhhbmcgb24gTlQ0LjAgKFNQNikuCisJICogU28gd2UgZG9uJ3QgdXNlIHRoaXMgYXQgYWxsIGZvciBub3cuICovCisjaWYgMAorICAgICAgICBpZiAoIG9zdmVyaW5mby5kd1BsYXRmb3JtSWQgPT0gVkVSX1BMQVRGT1JNX1dJTjMyX05UICYmCisJCW9zdmVyaW5mby5kd01ham9yVmVyc2lvbiA8IDUpCisJCXsKKwkJLyogUmVhZCBQZXJmb3JtYW5jZSBTdGF0aXN0aWNzIGZyb20gTlQvMjAwMCByZWdpc3RyeQorCQkgKiBUaGUgc2l6ZSBvZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSBjYW4gdmFyeSBmcm9tIGNhbGwKKwkJICogdG8gY2FsbCBzbyB3ZSBtdXN0IGd1ZXNzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gdXNlCisJCSAqIGFuZCBpbmNyZWFzZSBpdHMgc2l6ZSBpZiB3ZSBnZXQgYW4gRVJST1JfTU9SRV9EQVRBCisJCSAqIHJldHVybiBpbnN0ZWFkIG9mIEVSUk9SX1NVQ0NFU1MuCisJCSAqLworCQlMT05HICAgcmM9RVJST1JfTU9SRV9EQVRBOworCQljaGFyICogYnVmPU5VTEw7CisJCURXT1JEIGJ1ZnN6PTA7CisJCURXT1JEIGxlbmd0aDsKKworCQl3aGlsZSAocmMgPT0gRVJST1JfTU9SRV9EQVRBKQorCQkJeworCQkJYnVmID0gcmVhbGxvYyhidWYsYnVmc3orODE5Mik7CisJCQlpZiAoIWJ1ZikKKwkJCQlicmVhazsKKwkJCWJ1ZnN6ICs9IDgxOTI7CisKKwkJCWxlbmd0aCA9IGJ1ZnN6OworCQkJcmMgPSBSZWdRdWVyeVZhbHVlRXgoSEtFWV9QRVJGT1JNQU5DRV9EQVRBLCBURVhUKCJHbG9iYWwiKSwKKwkJCQlOVUxMLCBOVUxMLCBidWYsICZsZW5ndGgpOworCQkJfQorCQlpZiAocmMgPT0gRVJST1JfU1VDQ0VTUykKKwkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlbnRyb3B5IGNvdW50IGFzc3VtZSBvbmx5IGxlYXN0IHNpZ25pZmljYW50CisJCQkgKiBieXRlIG9mIGVhY2ggRFdPUkQgaXMgcmFuZG9tLgorCQkJICovCisJCQlSQU5EX2FkZCgmbGVuZ3RoLCBzaXplb2YobGVuZ3RoKSwgMCk7CisJCQlSQU5EX2FkZChidWYsIGxlbmd0aCwgbGVuZ3RoIC8gNC4wKTsKKworCQkJLyogQ2xvc2UgdGhlIFJlZ2lzdHJ5IEtleSB0byBhbGxvdyBXaW5kb3dzIHRvIGNsZWFudXAvY2xvc2UKKwkJCSAqIHRoZSBvcGVuIGhhbmRsZQorCQkJICogTm90ZTogVGhlICdIS0VZX1BFUkZPUk1BTkNFX0RBVEEnIGtleSBpcyBpbXBsaWNpdGx5IG9wZW5lZAorCQkJICogICAgICAgd2hlbiB0aGUgUmVnUXVlcnlWYWx1ZUV4IGFib3ZlIGlzIGRvbmUuICBIb3dldmVyLCBpZgorCQkJICogICAgICAgaXQgaXMgbm90IGV4cGxpY2l0bHkgY2xvc2VkLCBpdCBjYW4gY2F1c2UgZGlzaworCQkJICogICAgICAgcGFydGl0aW9uIG1hbmlwdWxhdGlvbiBwcm9ibGVtcy4KKwkJCSAqLworCQkJUmVnQ2xvc2VLZXkoSEtFWV9QRVJGT1JNQU5DRV9EQVRBKTsKKwkJCX0KKwkJaWYgKGJ1ZikKKwkJCWZyZWUoYnVmKTsKKwkJfQorI2VuZGlmCisKKwlpZiAoYWR2YXBpKQorCQl7CisJCS8qCisJCSAqIElmIGl0J3MgYXZhaWxhYmxlLCB0aGVuIGl0J3MgYXZhaWxhYmxlIGluIGJvdGggQU5TSQorCQkgKiBhbmQgVU5JQ09ERSBmbGF2b3JzIGV2ZW4gaW4gV2luOXgsIGRvY3VtZW50YXRpb24gc2F5cy4KKwkJICogV2UgZmF2b3IgVW5pY29kZS4uLgorCQkgKi8KKwkJYWNxdWlyZSA9IChDUllQVEFDUVVJUkVDT05URVhUVykgR2V0UHJvY0FkZHJlc3MoYWR2YXBpLAorCQkJIkNyeXB0QWNxdWlyZUNvbnRleHRXIik7CisJCWdlbiA9IChDUllQVEdFTlJBTkRPTSkgR2V0UHJvY0FkZHJlc3MoYWR2YXBpLAorCQkJIkNyeXB0R2VuUmFuZG9tIik7CisJCXJlbGVhc2UgPSAoQ1JZUFRSRUxFQVNFQ09OVEVYVCkgR2V0UHJvY0FkZHJlc3MoYWR2YXBpLAorCQkJIkNyeXB0UmVsZWFzZUNvbnRleHQiKTsKKwkJfQorCisJaWYgKGFjcXVpcmUgJiYgZ2VuICYmIHJlbGVhc2UpCisJCXsKKwkJLyogcG9sbCB0aGUgQ3J5cHRvQVBJIFBSTkcgKi8KKyAgICAgICAgICAgICAgICAvKiBUaGUgQ3J5cHRvQVBJIHJldHVybnMgc2l6ZW9mKGJ1ZikgYnl0ZXMgb2YgcmFuZG9tbmVzcyAqLworCQlpZiAoYWNxdWlyZSgmaFByb3ZpZGVyLCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLAorCQkJQ1JZUFRfVkVSSUZZQ09OVEVYVCkpCisJCQl7CisJCQlpZiAoZ2VuKGhQcm92aWRlciwgc2l6ZW9mKGJ1ZiksIGJ1ZikgIT0gMCkKKwkJCQl7CisJCQkJUkFORF9hZGQoYnVmLCBzaXplb2YoYnVmKSwgMCk7CisJCQkJZ29vZCA9IDE7CisjaWYgMAorCQkJCXByaW50ZigicmFuZG9tbmVzcyBmcm9tIFBST1ZfUlNBX0ZVTExcbiIpOworI2VuZGlmCisJCQkJfQorCQkJcmVsZWFzZShoUHJvdmlkZXIsIDApOyAKKwkJCX0KKwkJCisJCS8qIHBvbGwgdGhlIFBlbnRpdW0gUFJHIHdpdGggQ3J5cHRvQVBJICovCisJCWlmIChhY3F1aXJlKCZoUHJvdmlkZXIsIDAsIElOVEVMX0RFRl9QUk9WLCBQUk9WX0lOVEVMX1NFQywgMCkpCisJCQl7CisJCQlpZiAoZ2VuKGhQcm92aWRlciwgc2l6ZW9mKGJ1ZiksIGJ1ZikgIT0gMCkKKwkJCQl7CisJCQkJUkFORF9hZGQoYnVmLCBzaXplb2YoYnVmKSwgc2l6ZW9mKGJ1ZikpOworCQkJCWdvb2QgPSAxOworI2lmIDAKKwkJCQlwcmludGYoInJhbmRvbW5lc3MgZnJvbSBQUk9WX0lOVEVMX1NFQ1xuIik7CisjZW5kaWYKKwkJCQl9CisJCQlyZWxlYXNlKGhQcm92aWRlciwgMCk7CisJCQl9CisJCX0KKworICAgICAgICBpZiAoYWR2YXBpKQorCQlGcmVlTGlicmFyeShhZHZhcGkpOworCisJaWYgKChvc3ZlcmluZm8uZHdQbGF0Zm9ybUlkICE9IFZFUl9QTEFURk9STV9XSU4zMl9OVCB8fAorCSAgICAgIU9QRU5TU0xfaXNzZXJ2aWNlKCkpICYmCisJICAgICh1c2VyID0gTG9hZExpYnJhcnkoVEVYVCgiVVNFUjMyLkRMTCIpKSkpCisJCXsKKwkJR0VUQ1VSU09SSU5GTyBjdXJzb3I7CisJCUdFVEZPUkVHUk9VTkRXSU5ET1cgd2luOworCQlHRVRRVUVVRVNUQVRVUyBxdWV1ZTsKKworCQl3aW4gPSAoR0VURk9SRUdST1VORFdJTkRPVykgR2V0UHJvY0FkZHJlc3ModXNlciwgIkdldEZvcmVncm91bmRXaW5kb3ciKTsKKwkJY3Vyc29yID0gKEdFVENVUlNPUklORk8pIEdldFByb2NBZGRyZXNzKHVzZXIsICJHZXRDdXJzb3JJbmZvIik7CisJCXF1ZXVlID0gKEdFVFFVRVVFU1RBVFVTKSBHZXRQcm9jQWRkcmVzcyh1c2VyLCAiR2V0UXVldWVTdGF0dXMiKTsKKworCQlpZiAod2luKQorCQkJeworCQkJLyogd2luZG93IGhhbmRsZSAqLworCQkJSFdORCBoID0gd2luKCk7CisJCQlSQU5EX2FkZCgmaCwgc2l6ZW9mKGgpLCAwKTsKKwkJCX0KKwkJaWYgKGN1cnNvcikKKwkJCXsKKwkJCS8qIHVuZm9ydHVuYXRlbHksIGl0cyBub3Qgc2FmZSB0byBjYWxsIEdldEN1cnNvckluZm8oKQorCQkJICogb24gTlQ0IGV2ZW4gdGhvdWdoIGl0IGV4aXN0cyBpbiBTUDMgKG9yIFNQNikgYW5kCisJCQkgKiBoaWdoZXIuCisJCQkgKi8KKwkJCWlmICggb3N2ZXJpbmZvLmR3UGxhdGZvcm1JZCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQgJiYKKwkJCQlvc3ZlcmluZm8uZHdNYWpvclZlcnNpb24gPCA1KQorCQkJCWN1cnNvciA9IDA7CisJCQl9CisJCWlmIChjdXJzb3IpCisJCQl7CisJCQkvKiBjdXJzb3IgcG9zaXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSAyIGJ5dGVzIG9mIGVudHJvcHkgKi8KKwkJCUNVUlNPUklORk8gY2k7CisJCQljaS5jYlNpemUgPSBzaXplb2YoQ1VSU09SSU5GTyk7CisJCQlpZiAoY3Vyc29yKCZjaSkpCisJCQkJUkFORF9hZGQoJmNpLCBjaS5jYlNpemUsIDIpOworCQkJfQorCisJCWlmIChxdWV1ZSkKKwkJCXsKKwkJCS8qIG1lc3NhZ2UgcXVldWUgc3RhdHVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgMSBieXRlIG9mIGVudHJvcHkgKi8KKwkJCXcgPSBxdWV1ZShRU19BTExFVkVOVFMpOworCQkJUkFORF9hZGQoJncsIHNpemVvZih3KSwgMSk7CisJCQl9CisKKwkJRnJlZUxpYnJhcnkodXNlcik7CisJCX0KKworCS8qIFRvb2xoZWxwMzIgc25hcHNob3Q6IGVudW1lcmF0ZSBwcm9jZXNzZXMsIHRocmVhZHMsIG1vZHVsZXMgYW5kIGhlYXAKKwkgKiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvcHNkay93aW5iYXNlL3Rvb2xoZWxwXzVwZmQuaHRtCisJICogKFdpbiA5eCBhbmQgMjAwMCBvbmx5LCBub3QgYXZhaWxhYmxlIG9uIE5UKQorCSAqCisJICogVGhpcyBzZWVkaW5nIG1ldGhvZCB3YXMgcHJvcG9zZWQgaW4gUGV0ZXIgR3V0bWFubiwgU29mdHdhcmUKKwkgKiBHZW5lcmF0aW9uIG9mIFByYWN0aWNhbGx5IFN0cm9uZyBSYW5kb20gTnVtYmVycywKKwkgKiBodHRwOi8vd3d3LnVzZW5peC5vcmcvcHVibGljYXRpb25zL2xpYnJhcnkvcHJvY2VlZGluZ3Mvc2VjOTgvZ3V0bWFubi5odG1sCisJICogcmV2aXNlZCB2ZXJzaW9uIGF0IGh0dHA6Ly93d3cuY3J5cHRvZW5naW5lcy5jb20vfnBldGVyLzA2X3JhbmRvbS5wZGYKKwkgKiAoVGhlIGFzc2lnbm1lbnQgb2YgZW50cm9weSBlc3RpbWF0ZXMgYmVsb3cgaXMgYXJiaXRyYXJ5LCBidXQgYmFzZWQKKwkgKiBvbiBQZXRlcidzIGFuYWx5c2lzIHRoZSBmdWxsIHBvbGwgYXBwZWFycyB0byBiZSBzYWZlLiBBZGRpdGlvbmFsCisJICogaW50ZXJhY3RpdmUgc2VlZGluZyBpcyBlbmNvdXJhZ2VkLikKKwkgKi8KKworCWlmIChrZXJuZWwpCisJCXsKKwkJQ1JFQVRFVE9PTEhFTFAzMlNOQVBTSE9UIHNuYXA7CisJCUNMT1NFVE9PTEhFTFAzMlNOQVBTSE9UIGNsb3NlX3NuYXA7CisJCUhBTkRMRSBoYW5kbGU7CisKKwkJSEVBUDMyRklSU1QgaGVhcF9maXJzdDsKKwkJSEVBUDMyTkVYVCBoZWFwX25leHQ7CisJCUhFQVAzMkxJU1QgaGVhcGxpc3RfZmlyc3QsIGhlYXBsaXN0X25leHQ7CisJCVBST0NFU1MzMiBwcm9jZXNzX2ZpcnN0LCBwcm9jZXNzX25leHQ7CisJCVRIUkVBRDMyIHRocmVhZF9maXJzdCwgdGhyZWFkX25leHQ7CisJCU1PRFVMRTMyIG1vZHVsZV9maXJzdCwgbW9kdWxlX25leHQ7CisKKwkJSEVBUExJU1QzMiBobGlzdDsKKwkJSEVBUEVOVFJZMzIgaGVudHJ5OworCQlQUk9DRVNTRU5UUlkzMiBwOworCQlUSFJFQURFTlRSWTMyIHQ7CisJCU1PRFVMRUVOVFJZMzIgbTsKKwkJRFdPUkQgc3RhcnR0aW1lID0gMDsKKworCQlzbmFwID0gKENSRUFURVRPT0xIRUxQMzJTTkFQU0hPVCkKKwkJCUdldFByb2NBZGRyZXNzKGtlcm5lbCwgIkNyZWF0ZVRvb2xoZWxwMzJTbmFwc2hvdCIpOworCQljbG9zZV9zbmFwID0gKENMT1NFVE9PTEhFTFAzMlNOQVBTSE9UKQorCQkJR2V0UHJvY0FkZHJlc3Moa2VybmVsLCAiQ2xvc2VUb29saGVscDMyU25hcHNob3QiKTsKKwkJaGVhcF9maXJzdCA9IChIRUFQMzJGSVJTVCkgR2V0UHJvY0FkZHJlc3Moa2VybmVsLCAiSGVhcDMyRmlyc3QiKTsKKwkJaGVhcF9uZXh0ID0gKEhFQVAzMk5FWFQpIEdldFByb2NBZGRyZXNzKGtlcm5lbCwgIkhlYXAzMk5leHQiKTsKKwkJaGVhcGxpc3RfZmlyc3QgPSAoSEVBUDMyTElTVCkgR2V0UHJvY0FkZHJlc3Moa2VybmVsLCAiSGVhcDMyTGlzdEZpcnN0Iik7CisJCWhlYXBsaXN0X25leHQgPSAoSEVBUDMyTElTVCkgR2V0UHJvY0FkZHJlc3Moa2VybmVsLCAiSGVhcDMyTGlzdE5leHQiKTsKKwkJcHJvY2Vzc19maXJzdCA9IChQUk9DRVNTMzIpIEdldFByb2NBZGRyZXNzKGtlcm5lbCwgIlByb2Nlc3MzMkZpcnN0Iik7CisJCXByb2Nlc3NfbmV4dCA9IChQUk9DRVNTMzIpIEdldFByb2NBZGRyZXNzKGtlcm5lbCwgIlByb2Nlc3MzMk5leHQiKTsKKwkJdGhyZWFkX2ZpcnN0ID0gKFRIUkVBRDMyKSBHZXRQcm9jQWRkcmVzcyhrZXJuZWwsICJUaHJlYWQzMkZpcnN0Iik7CisJCXRocmVhZF9uZXh0ID0gKFRIUkVBRDMyKSBHZXRQcm9jQWRkcmVzcyhrZXJuZWwsICJUaHJlYWQzMk5leHQiKTsKKwkJbW9kdWxlX2ZpcnN0ID0gKE1PRFVMRTMyKSBHZXRQcm9jQWRkcmVzcyhrZXJuZWwsICJNb2R1bGUzMkZpcnN0Iik7CisJCW1vZHVsZV9uZXh0ID0gKE1PRFVMRTMyKSBHZXRQcm9jQWRkcmVzcyhrZXJuZWwsICJNb2R1bGUzMk5leHQiKTsKKworCQlpZiAoc25hcCAmJiBoZWFwX2ZpcnN0ICYmIGhlYXBfbmV4dCAmJiBoZWFwbGlzdF9maXJzdCAmJgorCQkJaGVhcGxpc3RfbmV4dCAmJiBwcm9jZXNzX2ZpcnN0ICYmIHByb2Nlc3NfbmV4dCAmJgorCQkJdGhyZWFkX2ZpcnN0ICYmIHRocmVhZF9uZXh0ICYmIG1vZHVsZV9maXJzdCAmJgorCQkJbW9kdWxlX25leHQgJiYgKGhhbmRsZSA9IHNuYXAoVEgzMkNTX1NOQVBBTEwsMCkpCisJCQkhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKwkJCXsKKwkJCS8qIGhlYXAgbGlzdCBhbmQgaGVhcCB3YWxraW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBIRUFQTElTVDMyIGNvbnRhaW5zIDMgZmllbGRzIHRoYXQgd2lsbCBjaGFuZ2Ugd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICogZWFjaCBlbnRyeS4gIENvbnNpZGVyIGVhY2ggZmllbGQgYSBzb3VyY2Ugb2YgMSBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBlbnRyb3B5LgorICAgICAgICAgICAgICAgICAgICAgICAgICogSEVBUEVOVFJZMzIgY29udGFpbnMgNSBmaWVsZHMgdGhhdCB3aWxsIGNoYW5nZSB3aXRoIAorICAgICAgICAgICAgICAgICAgICAgICAgICogZWFjaCBlbnRyeS4gIENvbnNpZGVyIGVhY2ggZmllbGQgYSBzb3VyY2Ugb2YgMSBieXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiBlbnRyb3B5LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQlaZXJvTWVtb3J5KCZobGlzdCwgc2l6ZW9mKEhFQVBMSVNUMzIpKTsKKwkJCWhsaXN0LmR3U2l6ZSA9IHNpemVvZihIRUFQTElTVDMyKTsJCQorCQkJaWYgKGdvb2QpIHN0YXJ0dGltZSA9IEdldFRpY2tDb3VudCgpOworI2lmZGVmIF9NU0NfVkVSCisJCQlpZiAoaGVhcGxpc3RfZmlyc3QoaGFuZGxlLCAmaGxpc3QpKQorCQkJCXsKKwkJCQkvKgorCQkJCSAgIGZvbGxvd2luZyBkaXNjdXNzaW9uIG9uIGRldiBNTCwgZXhjZXB0aW9uIG9uIFdpbkNFIChvciBvdGhlciBXaW4KKwkJCQkgICBwbGF0Zm9ybSkgaXMgdGhlb3JldGljYWxseSBvZiB1bmtub3duIG9yaWdpbjsgcHJldmVudCBpbmZpbml0ZQorCQkJCSAgIGxvb3AgaGVyZSB3aGVuIHRoaXMgdGhlb3JldGljYWwgY2FzZSBvY2N1cnM7IG90aGVyd2lzZSBjb3BlIHdpdGgKKwkJCQkgICB0aGUgZXhwZWN0ZWQgKE1TRE4gZG9jdW1lbnRlZCkgZXhjZXB0aW9uLXRocm93aW5nIGJlaGF2aW91ciBvZgorCQkJCSAgIEhlYXAzMk5leHQoKSBvbiBXaW5DRS4KKworCQkJCSAgIGJhc2VkIG9uIHBhdGNoIGluIG9yaWdpbmFsIG1lc3NhZ2UgYnkgVGFuZ3V5IEZhdXRyw6kgKDIwMDkvMDMvMDIpCisJCQkgICAgICAgICAgIFN1YmplY3Q6IFJBTkRfcG9sbCgpIGFuZCBDcmVhdGVUb29saGVscDMyU25hcHNob3QoKSBzdGFiaWxpdHkKKwkJCSAgICAgKi8KKwkJCQlpbnQgZXhfY250X2xpbWl0ID0gNDI7IAorCQkJCWRvCisJCQkJCXsKKwkJCQkJUkFORF9hZGQoJmhsaXN0LCBobGlzdC5kd1NpemUsIDMpOworCQkJCQlfX3RyeQorCQkJCQkJeworCQkJCQkJWmVyb01lbW9yeSgmaGVudHJ5LCBzaXplb2YoSEVBUEVOVFJZMzIpKTsKKwkJCQkJaGVudHJ5LmR3U2l6ZSA9IHNpemVvZihIRUFQRU5UUlkzMik7CisJCQkJCWlmIChoZWFwX2ZpcnN0KCZoZW50cnksCisJCQkJCQlobGlzdC50aDMyUHJvY2Vzc0lELAorCQkJCQkJaGxpc3QudGgzMkhlYXBJRCkpCisJCQkJCQl7CisJCQkJCQlpbnQgZW50cnljbnQgPSA4MDsKKwkJCQkJCWRvCisJCQkJCQkJUkFORF9hZGQoJmhlbnRyeSwKKwkJCQkJCQkJaGVudHJ5LmR3U2l6ZSwgNSk7CisJCQkJCQl3aGlsZSAoaGVhcF9uZXh0KCZoZW50cnkpCisJCQkJCQkmJiAoIWdvb2QgfHwgKEdldFRpY2tDb3VudCgpLXN0YXJ0dGltZSk8TUFYREVMQVkpCisJCQkJCQkJJiYgLS1lbnRyeWNudCA+IDApOworCQkJCQkJfQorCQkJCQkJfQorCQkJCQlfX2V4Y2VwdCAoRVhDRVBUSU9OX0VYRUNVVEVfSEFORExFUikKKwkJCQkJCXsKKwkJCQkJCQkvKiBpZ25vcmUgYWNjZXNzIHZpb2xhdGlvbnMgd2hlbiB3YWxraW5nIHRoZSBoZWFwIGxpc3QgKi8KKwkJCQkJCQlleF9jbnRfbGltaXQtLTsKKwkJCQkJCX0KKwkJCQkJfSB3aGlsZSAoaGVhcGxpc3RfbmV4dChoYW5kbGUsICZobGlzdCkgCisJCQkJCQkmJiAoIWdvb2QgfHwgKEdldFRpY2tDb3VudCgpLXN0YXJ0dGltZSk8TUFYREVMQVkpCisJCQkJCQkmJiBleF9jbnRfbGltaXQgPiAwKTsKKwkJCQl9CisKKyNlbHNlCisJCQlpZiAoaGVhcGxpc3RfZmlyc3QoaGFuZGxlLCAmaGxpc3QpKQorCQkJCXsKKwkJCQlkbworCQkJCQl7CisJCQkJCVJBTkRfYWRkKCZobGlzdCwgaGxpc3QuZHdTaXplLCAzKTsKKwkJCQkJaGVudHJ5LmR3U2l6ZSA9IHNpemVvZihIRUFQRU5UUlkzMik7CisJCQkJCWlmIChoZWFwX2ZpcnN0KCZoZW50cnksCisJCQkJCQlobGlzdC50aDMyUHJvY2Vzc0lELAorCQkJCQkJaGxpc3QudGgzMkhlYXBJRCkpCisJCQkJCQl7CisJCQkJCQlpbnQgZW50cnljbnQgPSA4MDsKKwkJCQkJCWRvCisJCQkJCQkJUkFORF9hZGQoJmhlbnRyeSwKKwkJCQkJCQkJaGVudHJ5LmR3U2l6ZSwgNSk7CisJCQkJCQl3aGlsZSAoaGVhcF9uZXh0KCZoZW50cnkpCisJCQkJCQkJJiYgLS1lbnRyeWNudCA+IDApOworCQkJCQkJfQorCQkJCQl9IHdoaWxlIChoZWFwbGlzdF9uZXh0KGhhbmRsZSwgJmhsaXN0KSAKKwkJCQkJCSYmICghZ29vZCB8fCAoR2V0VGlja0NvdW50KCktc3RhcnR0aW1lKTxNQVhERUxBWSkpOworCQkJCX0KKyNlbmRpZgorCisJCQkvKiBwcm9jZXNzIHdhbGtpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBST0NFU1NFTlRSWTMyIGNvbnRhaW5zIDkgZmllbGRzIHRoYXQgd2lsbCBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHdpdGggZWFjaCBlbnRyeS4gIENvbnNpZGVyIGVhY2ggZmllbGQgYSBzb3VyY2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIDEgYnl0ZSBvZiBlbnRyb3B5LgorICAgICAgICAgICAgICAgICAgICAgICAgICovCisJCQlwLmR3U2l6ZSA9IHNpemVvZihQUk9DRVNTRU5UUlkzMik7CisJCQorCQkJaWYgKGdvb2QpIHN0YXJ0dGltZSA9IEdldFRpY2tDb3VudCgpOworCQkJaWYgKHByb2Nlc3NfZmlyc3QoaGFuZGxlLCAmcCkpCisJCQkJZG8KKwkJCQkJUkFORF9hZGQoJnAsIHAuZHdTaXplLCA5KTsKKwkJCQl3aGlsZSAocHJvY2Vzc19uZXh0KGhhbmRsZSwgJnApICYmICghZ29vZCB8fCAoR2V0VGlja0NvdW50KCktc3RhcnR0aW1lKTxNQVhERUxBWSkpOworCisJCQkvKiB0aHJlYWQgd2Fsa2luZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogVEhSRUFERU5UUlkzMiBjb250YWlucyA2IGZpZWxkcyB0aGF0IHdpbGwgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGVhY2ggZW50cnkuICBDb25zaWRlciBlYWNoIGZpZWxkIGEgc291cmNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAxIGJ5dGUgb2YgZW50cm9weS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJdC5kd1NpemUgPSBzaXplb2YoVEhSRUFERU5UUlkzMik7CisJCQlpZiAoZ29vZCkgc3RhcnR0aW1lID0gR2V0VGlja0NvdW50KCk7CisJCQlpZiAodGhyZWFkX2ZpcnN0KGhhbmRsZSwgJnQpKQorCQkJCWRvCisJCQkJCVJBTkRfYWRkKCZ0LCB0LmR3U2l6ZSwgNik7CisJCQkJd2hpbGUgKHRocmVhZF9uZXh0KGhhbmRsZSwgJnQpICYmICghZ29vZCB8fCAoR2V0VGlja0NvdW50KCktc3RhcnR0aW1lKTxNQVhERUxBWSkpOworCisJCQkvKiBtb2R1bGUgd2Fsa2luZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTU9EVUxFRU5UUlkzMiBjb250YWlucyA5IGZpZWxkcyB0aGF0IHdpbGwgY2hhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aXRoIGVhY2ggZW50cnkuICBDb25zaWRlciBlYWNoIGZpZWxkIGEgc291cmNlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgKiAxIGJ5dGUgb2YgZW50cm9weS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJbS5kd1NpemUgPSBzaXplb2YoTU9EVUxFRU5UUlkzMik7CisJCQlpZiAoZ29vZCkgc3RhcnR0aW1lID0gR2V0VGlja0NvdW50KCk7CisJCQlpZiAobW9kdWxlX2ZpcnN0KGhhbmRsZSwgJm0pKQorCQkJCWRvCisJCQkJCVJBTkRfYWRkKCZtLCBtLmR3U2l6ZSwgOSk7CisJCQkJd2hpbGUgKG1vZHVsZV9uZXh0KGhhbmRsZSwgJm0pCisJCQkJCSAgICAgICAJJiYgKCFnb29kIHx8IChHZXRUaWNrQ291bnQoKS1zdGFydHRpbWUpPE1BWERFTEFZKSk7CisJCQlpZiAoY2xvc2Vfc25hcCkKKwkJCQljbG9zZV9zbmFwKGhhbmRsZSk7CisJCQllbHNlCisJCQkJQ2xvc2VIYW5kbGUoaGFuZGxlKTsKKworCQkJfQorCisJCUZyZWVMaWJyYXJ5KGtlcm5lbCk7CisJCX0KKwl9CisjZW5kaWYgLyogIU9QRU5TU0xfU1lTX1dJTkNFICovCisKKwkvKiB0aW1lciBkYXRhICovCisJcmVhZHRpbWVyKCk7CisJCisJLyogbWVtb3J5IHVzYWdlIHN0YXRpc3RpY3MgKi8KKwlHbG9iYWxNZW1vcnlTdGF0dXMoJm0pOworCVJBTkRfYWRkKCZtLCBzaXplb2YobSksIDEpOworCisJLyogcHJvY2VzcyBJRCAqLworCXcgPSBHZXRDdXJyZW50UHJvY2Vzc0lkKCk7CisJUkFORF9hZGQoJncsIHNpemVvZih3KSwgMSk7CisKKyNpZiAwCisJcHJpbnRmKCJFeGl0aW5nIFJBTkRfcG9sbFxuIik7CisjZW5kaWYKKworCXJldHVybigxKTsKK30KKworaW50IFJBTkRfZXZlbnQoVUlOVCBpTXNnLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorICAgICAgICB7CisgICAgICAgIGRvdWJsZSBhZGRfZW50cm9weT0wOworCisgICAgICAgIHN3aXRjaCAoaU1zZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgIGNhc2UgV01fS0VZRE9XTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBXUEFSQU0ga2V5OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSB3UGFyYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9lbnRyb3B5ID0gMC4wNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHdQYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCWNhc2UgV01fTU9VU0VNT1ZFOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBsYXN0eCxsYXN0eSxsYXN0ZHgsbGFzdGR5OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgseSxkeCxkeTsKKworICAgICAgICAgICAgICAgICAgICAgICAgeD1MT1dPUkQobFBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHk9SElXT1JEKGxQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkeD1sYXN0eC14OworICAgICAgICAgICAgICAgICAgICAgICAgZHk9bGFzdHkteTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkeCAhPSAwICYmIGR5ICE9IDAgJiYgZHgtbGFzdGR4ICE9IDAgJiYgZHktbGFzdGR5ICE9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9lbnRyb3B5PS4yOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdHg9eCwgbGFzdHk9eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RkeD1keCwgbGFzdGR5PWR5OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQlicmVhazsKKwkJfQorCisJcmVhZHRpbWVyKCk7CisgICAgICAgIFJBTkRfYWRkKCZpTXNnLCBzaXplb2YoaU1zZyksIGFkZF9lbnRyb3B5KTsKKwlSQU5EX2FkZCgmd1BhcmFtLCBzaXplb2Yod1BhcmFtKSwgMCk7CisJUkFORF9hZGQoJmxQYXJhbSwgc2l6ZW9mKGxQYXJhbSksIDApOworIAorCXJldHVybiAoUkFORF9zdGF0dXMoKSk7CisJfQorCisKK3ZvaWQgUkFORF9zY3JlZW4odm9pZCkgLyogZnVuY3Rpb24gYXZhaWxhYmxlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCit7CisJUkFORF9wb2xsKCk7CisJcmVhZHNjcmVlbigpOworfQorCisKKy8qIGZlZWQgdGltaW5nIGluZm9ybWF0aW9uIHRvIHRoZSBQUk5HICovCitzdGF0aWMgdm9pZCByZWFkdGltZXIodm9pZCkKK3sKKwlEV09SRCB3OworCUxBUkdFX0lOVEVHRVIgbDsKKwlzdGF0aWMgaW50IGhhdmVfcGVyZmMgPSAxOworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX01fWDg2KQorCXN0YXRpYyBpbnQgaGF2ZV90c2MgPSAxOworCURXT1JEIGN5Y2xlY291bnQ7CisKKwlpZiAoaGF2ZV90c2MpIHsKKwkgIF9fdHJ5IHsKKwkgICAgX19hc20geworCSAgICAgIF9lbWl0IDB4MGYKKwkgICAgICBfZW1pdCAweDMxCisJICAgICAgbW92IGN5Y2xlY291bnQsIGVheAorCSAgICAgIH0KKwkgICAgUkFORF9hZGQoJmN5Y2xlY291bnQsIHNpemVvZihjeWNsZWNvdW50KSwgMSk7CisJICB9IF9fZXhjZXB0KEVYQ0VQVElPTl9FWEVDVVRFX0hBTkRMRVIpIHsKKwkgICAgaGF2ZV90c2MgPSAwOworCSAgfQorCX0KKyNlbHNlCisjIGRlZmluZSBoYXZlX3RzYyAwCisjZW5kaWYKKworCWlmIChoYXZlX3BlcmZjKSB7CisJICBpZiAoUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoJmwpID09IDApCisJICAgIGhhdmVfcGVyZmMgPSAwOworCSAgZWxzZQorCSAgICBSQU5EX2FkZCgmbCwgc2l6ZW9mKGwpLCAwKTsKKwl9CisKKwlpZiAoIWhhdmVfdHNjICYmICFoYXZlX3BlcmZjKSB7CisJICB3ID0gR2V0VGlja0NvdW50KCk7CisJICBSQU5EX2FkZCgmdywgc2l6ZW9mKHcpLCAwKTsKKwl9Cit9CisKKy8qIGZlZWQgc2NyZWVuIGNvbnRlbnRzIHRvIFBSTkcgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENyZWF0ZWQgOTYwOTAxIGJ5IEdlcnRqYW4gdmFuIE9vc3RlbiwgZ2VydGphbkBXZXN0Lk5MLCBXZXN0IENvbnN1bHRpbmcgQi5WLgorICoKKyAqIENvZGUgYWRhcHRlZCBmcm9tCisgKiA8VVJMOmh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vZGVmYXVsdC5hc3B4P3NjaWQ9a2I7W0xOXTs5NzE5Mz47CisgKiB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IG1lc3NhZ2UgaXM6CisgKgorICogICAoQykgQ29weXJpZ2h0IE1pY3Jvc29mdCBDb3JwLiAxOTkzLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgIFlvdSBoYXZlIGEgcm95YWx0eS1mcmVlIHJpZ2h0IHRvIHVzZSwgbW9kaWZ5LCByZXByb2R1Y2UgYW5kCisgKiAgIGRpc3RyaWJ1dGUgdGhlIFNhbXBsZSBGaWxlcyAoYW5kL29yIGFueSBtb2RpZmllZCB2ZXJzaW9uKSBpbgorICogICBhbnkgd2F5IHlvdSBmaW5kIHVzZWZ1bCwgcHJvdmlkZWQgdGhhdCB5b3UgYWdyZWUgdGhhdAorICogICBNaWNyb3NvZnQgaGFzIG5vIHdhcnJhbnR5IG9ibGlnYXRpb25zIG9yIGxpYWJpbGl0eSBmb3IgYW55CisgKiAgIFNhbXBsZSBBcHBsaWNhdGlvbiBGaWxlcyB3aGljaCBhcmUgbW9kaWZpZWQuCisgKi8KKworc3RhdGljIHZvaWQgcmVhZHNjcmVlbih2b2lkKQoreworI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkNFKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMl9DWUdXSU4pCisgIEhEQwkJaFNjckRDOwkJLyogc2NyZWVuIERDICovCisgIEhEQwkJaE1lbURDOwkJLyogbWVtb3J5IERDICovCisgIEhCSVRNQVAJaEJpdG1hcDsJLyogaGFuZGxlIGZvciBvdXIgYml0bWFwICovCisgIEhCSVRNQVAJaE9sZEJpdG1hcDsJLyogaGFuZGxlIGZvciBwcmV2aW91cyBiaXRtYXAgKi8KKyAgQklUTUFQCWJtOwkJLyogYml0bWFwIHByb3BlcnRpZXMgKi8KKyAgdW5zaWduZWQgaW50CXNpemU7CQkvKiBzaXplIG9mIGJpdG1hcCAqLworICBjaGFyCQkqYm1iaXRzOwkvKiBjb250ZW50cyBvZiBiaXRtYXAgKi8KKyAgaW50CQl3OwkJLyogc2NyZWVuIHdpZHRoICovCisgIGludAkJaDsJCS8qIHNjcmVlbiBoZWlnaHQgKi8KKyAgaW50CQl5OwkJLyogeS1jb29yZGluYXRlIG9mIHNjcmVlbiBsaW5lcyB0byBncmFiICovCisgIGludAkJbiA9IDE2OwkJLyogbnVtYmVyIG9mIHNjcmVlbiBsaW5lcyB0byBncmFiIGF0IGEgdGltZSAqLworCisgIGlmIChHZXRWZXJzaW9uKCkgPCAweDgwMDAwMDAwICYmIE9QRU5TU0xfaXNzZXJ2aWNlKCk+MCkKKyAgICByZXR1cm47CisKKyAgLyogQ3JlYXRlIGEgc2NyZWVuIERDIGFuZCBhIG1lbW9yeSBEQyBjb21wYXRpYmxlIHRvIHNjcmVlbiBEQyAqLworICBoU2NyREMgPSBDcmVhdGVEQyhURVhUKCJESVNQTEFZIiksIE5VTEwsIE5VTEwsIE5VTEwpOworICBoTWVtREMgPSBDcmVhdGVDb21wYXRpYmxlREMoaFNjckRDKTsKKworICAvKiBHZXQgc2NyZWVuIHJlc29sdXRpb24gKi8KKyAgdyA9IEdldERldmljZUNhcHMoaFNjckRDLCBIT1JaUkVTKTsKKyAgaCA9IEdldERldmljZUNhcHMoaFNjckRDLCBWRVJUUkVTKTsKKworICAvKiBDcmVhdGUgYSBiaXRtYXAgY29tcGF0aWJsZSB3aXRoIHRoZSBzY3JlZW4gREMgKi8KKyAgaEJpdG1hcCA9IENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoaFNjckRDLCB3LCBuKTsKKworICAvKiBTZWxlY3QgbmV3IGJpdG1hcCBpbnRvIG1lbW9yeSBEQyAqLworICBoT2xkQml0bWFwID0gU2VsZWN0T2JqZWN0KGhNZW1EQywgaEJpdG1hcCk7CisKKyAgLyogR2V0IGJpdG1hcCBwcm9wZXJ0aWVzICovCisgIEdldE9iamVjdChoQml0bWFwLCBzaXplb2YoQklUTUFQKSwgKExQU1RSKSZibSk7CisgIHNpemUgPSAodW5zaWduZWQgaW50KWJtLmJtV2lkdGhCeXRlcyAqIGJtLmJtSGVpZ2h0ICogYm0uYm1QbGFuZXM7CisKKyAgYm1iaXRzID0gT1BFTlNTTF9tYWxsb2Moc2l6ZSk7CisgIGlmIChibWJpdHMpIHsKKyAgICAvKiBOb3cgZ28gdGhyb3VnaCB0aGUgd2hvbGUgc2NyZWVuLCByZXBlYXRlZGx5IGdyYWJiaW5nIG4gbGluZXMgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgaC1uOyB5ICs9IG4pCisgICAgCXsKKwl1bnNpZ25lZCBjaGFyIG1kW01EX0RJR0VTVF9MRU5HVEhdOworCisJLyogQml0Ymx0IHNjcmVlbiBEQyB0byBtZW1vcnkgREMgKi8KKwlCaXRCbHQoaE1lbURDLCAwLCAwLCB3LCBuLCBoU2NyREMsIDAsIHksIFNSQ0NPUFkpOworCisJLyogQ29weSBiaXRtYXAgYml0cyBmcm9tIG1lbW9yeSBEQyB0byBibWJpdHMgKi8KKwlHZXRCaXRtYXBCaXRzKGhCaXRtYXAsIHNpemUsIGJtYml0cyk7CisKKwkvKiBHZXQgdGhlIGhhc2ggb2YgdGhlIGJpdG1hcCAqLworCU1EKGJtYml0cyxzaXplLG1kKTsKKworCS8qIFNlZWQgdGhlIHJhbmRvbSBnZW5lcmF0b3Igd2l0aCB0aGUgaGFzaCB2YWx1ZSAqLworCVJBTkRfYWRkKG1kLCBNRF9ESUdFU1RfTEVOR1RILCAwKTsKKwl9CisKKyAgICBPUEVOU1NMX2ZyZWUoYm1iaXRzKTsKKyAgfQorCisgIC8qIFNlbGVjdCBvbGQgYml0bWFwIGJhY2sgaW50byBtZW1vcnkgREMgKi8KKyAgaEJpdG1hcCA9IFNlbGVjdE9iamVjdChoTWVtREMsIGhPbGRCaXRtYXApOworCisgIC8qIENsZWFuIHVwICovCisgIERlbGV0ZU9iamVjdChoQml0bWFwKTsKKyAgRGVsZXRlREMoaE1lbURDKTsKKyAgRGVsZXRlREMoaFNjckRDKTsKKyNlbmRpZiAvKiAhT1BFTlNTTF9TWVNfV0lOQ0UgKi8KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmFuZC9yYW5kZmlsZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZGZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQ0MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZGZpbGUuYwpAQCAtMCwwICsxLDMyNiBAQAorLyogY3J5cHRvL3JhbmQvcmFuZGZpbGUuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBXZSBuZWVkIHRvIGRlZmluZSB0aGlzIHRvIGdldCBtYWNyb3MgbGlrZSBTX0lGQkxLIGFuZCBTX0lGQ0hSICovCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0UgNTAwCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJlX29zLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisjaW5jbHVkZSA8dW5peGlvLmg+CisjZW5kaWYKKyNpZm5kZWYgTk9fU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19QT1NJWF9JTworIyBpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgc3RhdAlfc3RhdAorI2RlZmluZSBjaG1vZAlfY2htb2QKKyNkZWZpbmUgb3Blbglfb3BlbgorI2RlZmluZSBmZG9wZW4JX2Zkb3BlbgorI2VuZGlmCisKKyN1bmRlZiBCVUZTSVpFCisjZGVmaW5lIEJVRlNJWkUJMTAyNAorI2RlZmluZSBSQU5EX0RBVEEgMTAyNAorCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisvKiBUaGlzIGRlY2xhcmF0aW9uIGlzIGEgbmFzdHkgaGFjayB0byBnZXQgYXJvdW5kIHZtcycgZXh0ZW5zaW9uIHRvIGZvcGVuCisgKiBmb3IgcGFzc2luZyBpbiBzaGFyaW5nIG9wdGlvbnMgYmVpbmcgZGlzYWJsZWQgYnkgb3VyIC9TVEFOREFSRD1BTlNJODkgKi8KK3N0YXRpYyBGSUxFICooKmNvbnN0IHZtc19mb3BlbikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikgPQorICAgIChGSUxFICooKikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikpZm9wZW47CisjZGVmaW5lIFZNU19PUEVOX0FUVFJTICJzaHI9Z2V0LHB1dCx1cGQsZGVsIiwiY3R4PWJpbixzdG0iLCJyZm09c3RtIiwicmF0PW5vbmUiLCJtcnM9MCIKKyNlbmRpZgorCisvKiAjZGVmaW5lIFJGSUxFICIucm5kIiAtIGRlZmluZWQgaW4gLi4vLi4vZV9vcy5oICovCisKKy8qIE5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYXJlIGludGVuZGVkIGZvciBzZWVkIGZpbGVzIG9ubHkuCisgKiBFbnRyb3B5IGRldmljZXMgYW5kIEVHRCBzb2NrZXRzIGFyZSBoYW5kbGVkIGluIHJhbmRfdW5peC5jICovCisKK2ludCBSQU5EX2xvYWRfZmlsZShjb25zdCBjaGFyICpmaWxlLCBsb25nIGJ5dGVzKQorCXsKKwkvKiBJZiBieXRlcyA+PSAwLCByZWFkIHVwIHRvICdieXRlcycgYnl0ZXMuCisJICogaWYgYnl0ZXMgPT0gLTEsIHJlYWQgY29tcGxldGUgZmlsZS4gKi8KKworCU1TX1NUQVRJQyB1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFXTsKKyNpZm5kZWYgT1BFTlNTTF9OT19QT1NJWF9JTworCXN0cnVjdCBzdGF0IHNiOworI2VuZGlmCisJaW50IGkscmV0PTAsbjsKKwlGSUxFICppbjsKKworCWlmIChmaWxlID09IE5VTEwpIHJldHVybigwKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1BPU0lYX0lPCisjaWZkZWYgUFVSSUZZCisJLyogc3RydWN0IHN0YXQgY2FuIGhhdmUgcGFkZGluZyBhbmQgdW51c2VkIGZpZWxkcyB0aGF0IG1heSBub3QgYmUKKwkgKiBpbml0aWFsaXplZCBpbiB0aGUgY2FsbCB0byBzdGF0KCkuIFdlIG5lZWQgdG8gY2xlYXIgdGhlIGVudGlyZQorCSAqIHN0cnVjdHVyZSBiZWZvcmUgY2FsbGluZyBSQU5EX2FkZCgpIHRvIGF2b2lkIGNvbXBsYWludHMgZnJvbQorCSAqIGFwcGxpY2F0aW9ucyBzdWNoIGFzIFZhbGdyaW5kLgorCSAqLworCW1lbXNldCgmc2IsIDAsIHNpemVvZihzYikpOworI2VuZGlmCisJaWYgKHN0YXQoZmlsZSwmc2IpIDwgMCkgcmV0dXJuKDApOworCVJBTkRfYWRkKCZzYixzaXplb2Yoc2IpLDAuMCk7CisjZW5kaWYKKwlpZiAoYnl0ZXMgPT0gMCkgcmV0dXJuKHJldCk7CisKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwlpbj12bXNfZm9wZW4oZmlsZSwicmIiLFZNU19PUEVOX0FUVFJTKTsKKyNlbHNlCisJaW49Zm9wZW4oZmlsZSwicmIiKTsKKyNlbmRpZgorCWlmIChpbiA9PSBOVUxMKSBnb3RvIGVycjsKKyNpZiBkZWZpbmVkKFNfSUZCTEspICYmIGRlZmluZWQoU19JRkNIUikgJiYgIWRlZmluZWQoT1BORVNTTF9OT19QT1NJWF9JTykKKwlpZiAoc2Iuc3RfbW9kZSAmIChTX0lGQkxLIHwgU19JRkNIUikpIHsKKwkgIC8qIHRoaXMgZmlsZSBpcyBhIGRldmljZS4gd2UgZG9uJ3Qgd2FudCByZWFkIGFuIGluZmluaXRlIG51bWJlcgorCSAgICogb2YgYnl0ZXMgZnJvbSBhIHJhbmRvbSBkZXZpY2UsIG5vciBkbyB3ZSB3YW50IHRvIHVzZSBidWZmZXJlZAorCSAgICogSS9PIGJlY2F1c2Ugd2Ugd2lsbCB3YXN0ZSBzeXN0ZW0gZW50cm9weS4gCisJICAgKi8KKwkgIGJ5dGVzID0gKGJ5dGVzID09IC0xKSA/IDIwNDggOiBieXRlczsgLyogb2ssIGlzIDIwNDggZW5vdWdoPyAqLworCSAgc2V0dmJ1ZihpbiwgTlVMTCwgX0lPTkJGLCAwKTsgLyogZG9uJ3QgZG8gYnVmZmVyZWQgcmVhZHMgKi8KKwl9CisjZW5kaWYKKwlmb3IgKDs7KQorCQl7CisJCWlmIChieXRlcyA+IDApCisJCQluID0gKGJ5dGVzIDwgQlVGU0laRSk/KGludClieXRlczpCVUZTSVpFOworCQllbHNlCisJCQluID0gQlVGU0laRTsKKwkJaT1mcmVhZChidWYsMSxuLGluKTsKKwkJaWYgKGkgPD0gMCkgYnJlYWs7CisjaWZkZWYgUFVSSUZZCisJCVJBTkRfYWRkKGJ1ZixpLChkb3VibGUpaSk7CisjZWxzZQorCQkvKiBldmVuIGlmIG4gIT0gaSwgdXNlIHRoZSBmdWxsIGFycmF5ICovCisJCVJBTkRfYWRkKGJ1ZixuLChkb3VibGUpaSk7CisjZW5kaWYKKwkJcmV0Kz1pOworCQlpZiAoYnl0ZXMgPiAwKQorCQkJeworCQkJYnl0ZXMtPW47CisJCQlpZiAoYnl0ZXMgPD0gMCkgYnJlYWs7CisJCQl9CisJCX0KKwlmY2xvc2UoaW4pOworCU9QRU5TU0xfY2xlYW5zZShidWYsQlVGU0laRSk7CitlcnI6CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgUkFORF93cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGUpCisJeworCXVuc2lnbmVkIGNoYXIgYnVmW0JVRlNJWkVdOworCWludCBpLHJldD0wLHJhbmRfZXJyPTA7CisJRklMRSAqb3V0ID0gTlVMTDsKKwlpbnQgbjsKKyNpZm5kZWYgT1BFTlNTTF9OT19QT1NJWF9JTworCXN0cnVjdCBzdGF0IHNiOworCQorCWk9c3RhdChmaWxlLCZzYik7CisJaWYgKGkgIT0gLTEpIHsgCisjaWYgZGVmaW5lZChTX0lTQkxLKSAmJiBkZWZpbmVkKFNfSVNDSFIpCisJICBpZiAoU19JU0JMSyhzYi5zdF9tb2RlKSB8fCBTX0lTQ0hSKHNiLnN0X21vZGUpKSB7CisJICAgIC8qIHRoaXMgZmlsZSBpcyBhIGRldmljZS4gd2UgZG9uJ3Qgd3JpdGUgYmFjayB0byBpdC4gCisJICAgICAqIHdlICJzdWNjZWVkIiBvbiB0aGUgYXNzdW1wdGlvbiB0aGlzIGlzIHNvbWUgc29ydCAKKwkgICAgICogb2YgcmFuZG9tIGRldmljZS4gT3RoZXJ3aXNlIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gCisJICAgICAqIGFuZCBjaG1vZCB0aGUgZGV2aWNlIGNhdXNlcyBwcm9ibGVtcy4KKwkgICAgICovCisJICAgIHJldHVybigxKTsgCisJICB9CisjZW5kaWYKKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoT19DUkVBVCkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19QT1NJWF9JTykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorCXsKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmCisJLyogY2htb2QoLi4uLCAwNjAwKSBpcyB0b28gbGF0ZSB0byBwcm90ZWN0IHRoZSBmaWxlLAorCSAqIHBlcm1pc3Npb25zIHNob3VsZCBiZSByZXN0cmljdGl2ZSBmcm9tIHRoZSBzdGFydCAqLworCWludCBmZCA9IG9wZW4oZmlsZSwgT19XUk9OTFl8T19DUkVBVHxPX0JJTkFSWSwgMDYwMCk7CisJaWYgKGZkICE9IC0xKQorCQlvdXQgPSBmZG9wZW4oZmQsICJ3YiIpOworCX0KKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJLyogVk1TIE5PVEU6IFByaW9yIHZlcnNpb25zIG9mIHRoaXMgcm91dGluZSBjcmVhdGVkIGEgX25ld18KKwkgKiB2ZXJzaW9uIG9mIHRoZSByYW5kIGZpbGUgZm9yIGVhY2ggY2FsbCBpbnRvIHRoaXMgcm91dGluZSwgdGhlbgorCSAqIGRlbGV0ZWQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG5hbWVkIDstMSwgYW5kIGZpbmFsbHkgcmVuYW1lZAorCSAqIHRoZSBjdXJyZW50IHZlcnNpb24gYXMgJzsxJy4gVW5kZXIgY29uY3VycmVudCB1c2FnZSwgdGhpcworCSAqIHJlc3VsdGVkIGluIGFuIFJNUyByYWNlIGNvbmRpdGlvbiBpbiByZW5hbWUoKSB3aGljaCBjb3VsZAorCSAqIG9ycGhhbiBmaWxlcyAoc2VlIHZtcyBtZXNzYWdlIGhlbHAgZm9yIFJNUyRfUkVFTlQpLiBXaXRoIHRoZQorCSAqIGZvcGVuKCkgY2FsbHMgYmVsb3csIG9wZW5zc2wvVk1TIG5vdyBzaGFyZXMgdGhlIHRvcC1sZXZlbAorCSAqIHZlcnNpb24gb2YgdGhlIHJhbmQgZmlsZS4gTm90ZSB0aGF0IHRoZXJlIG1heSBzdGlsbCBiZQorCSAqIGNvbmRpdGlvbnMgd2hlcmUgdGhlIHRvcC1sZXZlbCByYW5kIGZpbGUgaXMgbG9ja2VkLiBJZiBzbywgdGhpcworCSAqIGNvZGUgd2lsbCB0aGVuIGNyZWF0ZSBhIG5ldyB2ZXJzaW9uIG9mIHRoZSByYW5kIGZpbGUuIFdpdGhvdXQKKwkgKiB0aGUgZGVsZXRlIGFuZCByZW5hbWUgY29kZSwgdGhpcyBjYW4gcmVzdWx0IGluIGFzY2VuZGluZyBmaWxlCisJICogdmVyc2lvbnMgdGhhdCBzdG9wIGF0IHZlcnNpb24gMzI3NjcsIGFuZCB0aGlzIHJvdXRpbmUgd2lsbCB0aGVuCisJICogcmV0dXJuIGFuIGVycm9yLiBUaGUgcmVtZWR5IGZvciB0aGlzIGlzIHRvIHJlY29kZSB0aGUgY2FsbGluZworCSAqIGFwcGxpY2F0aW9uIHRvIGF2b2lkIGNvbmN1cnJlbnQgdXNlIG9mIHRoZSByYW5kIGZpbGUsIG9yCisJICogc3luY2hyb25pemUgdXNhZ2UgYXQgdGhlIGFwcGxpY2F0aW9uIGxldmVsLiBBbHNvIGNvbnNpZGVyCisJICogd2hldGhlciBvciBub3QgeW91IE5FRUQgYSBwZXJzaXN0ZW50IHJhbmQgZmlsZSBpbiBhIGNvbmN1cnJlbnQKKwkgKiB1c2Ugc2l0dWF0aW9uLiAKKwkgKi8KKworCW91dCA9IHZtc19mb3BlbihmaWxlLCJyYisiLFZNU19PUEVOX0FUVFJTKTsKKwlpZiAob3V0ID09IE5VTEwpCisJCW91dCA9IHZtc19mb3BlbihmaWxlLCJ3YiIsVk1TX09QRU5fQVRUUlMpOworI2Vsc2UKKwlpZiAob3V0ID09IE5VTEwpCisJCW91dCA9IGZvcGVuKGZpbGUsIndiIik7CisjZW5kaWYKKwlpZiAob3V0ID09IE5VTEwpIGdvdG8gZXJyOworCisjaWZuZGVmIE5PX0NITU9ECisJY2htb2QoZmlsZSwwNjAwKTsKKyNlbmRpZgorCW49UkFORF9EQVRBOworCWZvciAoOzspCisJCXsKKwkJaT0obiA+IEJVRlNJWkUpP0JVRlNJWkU6bjsKKwkJbi09QlVGU0laRTsKKwkJaWYgKFJBTkRfYnl0ZXMoYnVmLGkpIDw9IDApCisJCQlyYW5kX2Vycj0xOworCQlpPWZ3cml0ZShidWYsMSxpLG91dCk7CisJCWlmIChpIDw9IDApCisJCQl7CisJCQlyZXQ9MDsKKwkJCWJyZWFrOworCQkJfQorCQlyZXQrPWk7CisJCWlmIChuIDw9IDApIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworCWZjbG9zZShvdXQpOworCU9QRU5TU0xfY2xlYW5zZShidWYsQlVGU0laRSk7CitlcnI6CisJcmV0dXJuIChyYW5kX2VyciA/IC0xIDogcmV0KTsKKwl9CisKK2NvbnN0IGNoYXIgKlJBTkRfZmlsZV9uYW1lKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCisJeworCWNoYXIgKnM9TlVMTDsKKwlpbnQgb2sgPSAwOworI2lmZGVmIF9fT3BlbkJTRF9fCisJc3RydWN0IHN0YXQgc2I7CisjZW5kaWYKKworCWlmIChPUEVOU1NMX2lzc2V0dWdpZCgpID09IDApCisJCXM9Z2V0ZW52KCJSQU5ERklMRSIpOworCWlmIChzICE9IE5VTEwgJiYgKnMgJiYgc3RybGVuKHMpICsgMSA8IHNpemUpCisJCXsKKwkJaWYgKEJVRl9zdHJsY3B5KGJ1ZixzLHNpemUpID49IHNpemUpCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoT1BFTlNTTF9pc3NldHVnaWQoKSA9PSAwKQorCQkJcz1nZXRlbnYoIkhPTUUiKTsKKyNpZmRlZiBERUZBVUxUX0hPTUUKKwkJaWYgKHMgPT0gTlVMTCkKKwkJCXsKKwkJCXMgPSBERUZBVUxUX0hPTUU7CisJCQl9CisjZW5kaWYKKwkJaWYgKHMgJiYgKnMgJiYgc3RybGVuKHMpK3N0cmxlbihSRklMRSkrMiA8IHNpemUpCisJCQl7CisJCQlCVUZfc3RybGNweShidWYscyxzaXplKTsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisJCQlCVUZfc3RybGNhdChidWYsIi8iLHNpemUpOworI2VuZGlmCisJCQlCVUZfc3RybGNhdChidWYsUkZJTEUsc2l6ZSk7CisJCQlvayA9IDE7CisJCQl9CisJCWVsc2UKKwkJICAJYnVmWzBdID0gJ1wwJzsgLyogbm8gZmlsZSBuYW1lICovCisJCX0KKworI2lmZGVmIF9fT3BlbkJTRF9fCisJLyogZ2l2ZW4gdGhhdCBhbGwgcmFuZG9tIGxvYWRzIGp1c3QgZmFpbCBpZiB0aGUgZmlsZSBjYW4ndCBiZSAKKwkgKiBzZWVuIG9uIGEgc3RhdCwgd2Ugc3RhdCB0aGUgZmlsZSB3ZSdyZSByZXR1cm5pbmcsIGlmIGl0CisJICogZmFpbHMsIHVzZSAvZGV2L2FyYW5kb20gaW5zdGVhZC4gdGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gCisJICogdXNlIHRoZWlyIG93biBzb3VyY2UgZm9yIGdvb2QgcmFuZG9tIGRhdGEsIGJ1dCBkZWZhdWx0cworCSAqIHRvIHNvbWV0aGluZyBob3BlZnVsbHkgZGVjZW50IGlmIHRoYXQgaXNuJ3QgYXZhaWxhYmxlLiAKKwkgKi8KKworCWlmICghb2spCisJCWlmIChCVUZfc3RybGNweShidWYsIi9kZXYvYXJhbmRvbSIsc2l6ZSkgPj0gc2l6ZSkgeworCQkJcmV0dXJuKE5VTEwpOworCQl9CQorCWlmIChzdGF0KGJ1Ziwmc2IpID09IC0xKQorCQlpZiAoQlVGX3N0cmxjcHkoYnVmLCIvZGV2L2FyYW5kb20iLHNpemUpID49IHNpemUpIHsKKwkJCXJldHVybihOVUxMKTsKKwkJfQkKKworI2VuZGlmCisJcmV0dXJuKGJ1Zik7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JhbmQvcmFuZHRlc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmR0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5MmE3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYW5kL3JhbmR0ZXN0LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qIGNyeXB0by9yYW5kL3JhbmR0ZXN0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKKyNpbmNsdWRlICIuLi9lX29zLmgiCisKKy8qIHNvbWUgRklQUyAxNDAtMSByYW5kb20gbnVtYmVyIHRlc3QgKi8KKy8qIHNvbWUgc2ltcGxlIHRlc3RzICovCisKK2ludCBtYWluKGludCBhcmdjLGNoYXIgKiphcmd2KQorCXsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyNTAwXTsKKwlpbnQgaSxqLGsscyxzaWduLG5zaWduLGVycj0wOworCXVuc2lnbmVkIGxvbmcgbjE7CisJdW5zaWduZWQgbG9uZyBuMlsxNl07CisJdW5zaWduZWQgbG9uZyBydW5zWzJdWzM0XTsKKwkvKmRvdWJsZSBkOyAqLworCWxvbmcgZDsKKworCWkgPSBSQU5EX3BzZXVkb19ieXRlcyhidWYsMjUwMCk7CisJaWYgKGkgPCAwKQorCQl7CisJCXByaW50ZiAoImluaXQgZmFpbGVkLCB0aGUgcmFuZCBtZXRob2QgaXMgbm90IHByb3Blcmx5IGluc3RhbGxlZFxuIik7CisJCWVycisrOworCQlnb3RvIGVycjsKKwkJfQorCisJbjE9MDsKKwlmb3IgKGk9MDsgaTwxNjsgaSsrKSBuMltpXT0wOworCWZvciAoaT0wOyBpPDM0OyBpKyspIHJ1bnNbMF1baV09cnVuc1sxXVtpXT0wOworCisJLyogdGVzdCAxIGFuZCAyICovCisJc2lnbj0wOworCW5zaWduPTA7CisJZm9yIChpPTA7IGk8MjUwMDsgaSsrKQorCQl7CisJCWo9YnVmW2ldOworCisJCW4yW2omMHgwZl0rKzsKKwkJbjJbKGo+PjQpJjB4MGZdKys7CisKKwkJZm9yIChrPTA7IGs8ODsgaysrKQorCQkJeworCQkJcz0oaiYweDAxKTsKKwkJCWlmIChzID09IHNpZ24pCisJCQkJbnNpZ24rKzsKKwkJCWVsc2UKKwkJCQl7CisJCQkJaWYgKG5zaWduID4gMzQpIG5zaWduPTM0OworCQkJCWlmIChuc2lnbiAhPSAwKQorCQkJCQl7CisJCQkJCXJ1bnNbc2lnbl1bbnNpZ24tMV0rKzsKKwkJCQkJaWYgKG5zaWduID4gNikKKwkJCQkJCXJ1bnNbc2lnbl1bNV0rKzsKKwkJCQkJfQorCQkJCXNpZ249czsKKwkJCQluc2lnbj0xOworCQkJCX0KKworCQkJaWYgKHMpIG4xKys7CisJCQlqPj49MTsKKwkJCX0KKwkJfQorCQlpZiAobnNpZ24gPiAzNCkgbnNpZ249MzQ7CisJCWlmIChuc2lnbiAhPSAwKSBydW5zW3NpZ25dW25zaWduLTFdKys7CisKKwkvKiB0ZXN0IDEgKi8KKwlpZiAoISgoOTY1NCA8IG4xKSAmJiAobjEgPCAxMDM0NikpKQorCQl7CisJCXByaW50ZigidGVzdCAxIGZhaWxlZCwgWD0lbHVcbiIsbjEpOworCQllcnIrKzsKKwkJfQorCXByaW50ZigidGVzdCAxIGRvbmVcbiIpOworCisJLyogdGVzdCAyICovCisjaWZkZWYgdW5kZWYKKwlkPTA7CisJZm9yIChpPTA7IGk8MTY7IGkrKykKKwkJZCs9bjJbaV0qbjJbaV07CisJZD1kKjE2LjAvNTAwMC4wLTUwMDAuMDsKKwlpZiAoISgoMS4wMyA8IGQpICYmIChkIDwgNTcuNCkpKQorCQl7CisJCXByaW50ZigidGVzdCAyIGZhaWxlZCwgWD0lLjJmXG4iLGQpOworCQllcnIrKzsKKwkJfQorI2VuZGlmCisJZD0wOworCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCWQrPW4yW2ldKm4yW2ldOworCWQ9KGQqOCkvMjUtNTAwMDAwOworCWlmICghKCgxMDMgPCBkKSAmJiAoZCA8IDU3NDApKSkKKwkJeworCQlwcmludGYoInRlc3QgMiBmYWlsZWQsIFg9JWxkLiUwMmxkXG4iLGQvMTAwTCxkJTEwMEwpOworCQllcnIrKzsKKwkJfQorCXByaW50ZigidGVzdCAyIGRvbmVcbiIpOworCisJLyogdGVzdCAzICovCisJZm9yIChpPTA7IGk8MjsgaSsrKQorCQl7CisJCWlmICghKCgyMjY3IDwgcnVuc1tpXVswXSkgJiYgKHJ1bnNbaV1bMF0gPCAyNzMzKSkpCisJCQl7CisJCQlwcmludGYoInRlc3QgMyBmYWlsZWQsIGJpdD0lZCBydW49JWQgbnVtPSVsdVxuIiwKKwkJCQlpLDEscnVuc1tpXVswXSk7CisJCQllcnIrKzsKKwkJCX0KKwkJaWYgKCEoKDEwNzkgPCBydW5zW2ldWzFdKSAmJiAocnVuc1tpXVsxXSA8IDE0MjEpKSkKKwkJCXsKKwkJCXByaW50ZigidGVzdCAzIGZhaWxlZCwgYml0PSVkIHJ1bj0lZCBudW09JWx1XG4iLAorCQkJCWksMixydW5zW2ldWzFdKTsKKwkJCWVycisrOworCQkJfQorCQlpZiAoISgoIDUwMiA8IHJ1bnNbaV1bMl0pICYmIChydW5zW2ldWzJdIDwgIDc0OCkpKQorCQkJeworCQkJcHJpbnRmKCJ0ZXN0IDMgZmFpbGVkLCBiaXQ9JWQgcnVuPSVkIG51bT0lbHVcbiIsCisJCQkJaSwzLHJ1bnNbaV1bMl0pOworCQkJZXJyKys7CisJCQl9CisJCWlmICghKCggMjIzIDwgcnVuc1tpXVszXSkgJiYgKHJ1bnNbaV1bM10gPCAgNDAyKSkpCisJCQl7CisJCQlwcmludGYoInRlc3QgMyBmYWlsZWQsIGJpdD0lZCBydW49JWQgbnVtPSVsdVxuIiwKKwkJCQlpLDQscnVuc1tpXVszXSk7CisJCQllcnIrKzsKKwkJCX0KKwkJaWYgKCEoKCAgOTAgPCBydW5zW2ldWzRdKSAmJiAocnVuc1tpXVs0XSA8ICAyMjMpKSkKKwkJCXsKKwkJCXByaW50ZigidGVzdCAzIGZhaWxlZCwgYml0PSVkIHJ1bj0lZCBudW09JWx1XG4iLAorCQkJCWksNSxydW5zW2ldWzRdKTsKKwkJCWVycisrOworCQkJfQorCQlpZiAoISgoICA5MCA8IHJ1bnNbaV1bNV0pICYmIChydW5zW2ldWzVdIDwgIDIyMykpKQorCQkJeworCQkJcHJpbnRmKCJ0ZXN0IDMgZmFpbGVkLCBiaXQ9JWQgcnVuPSVkIG51bT0lbHVcbiIsCisJCQkJaSw2LHJ1bnNbaV1bNV0pOworCQkJZXJyKys7CisJCQl9CisJCX0KKwlwcmludGYoInRlc3QgMyBkb25lXG4iKTsKKwkKKwkvKiB0ZXN0IDQgKi8KKwlpZiAocnVuc1swXVszM10gIT0gMCkKKwkJeworCQlwcmludGYoInRlc3QgNCBmYWlsZWQsIGJpdD0lZCBydW49JWQgbnVtPSVsdVxuIiwKKwkJCTAsMzQscnVuc1swXVszM10pOworCQllcnIrKzsKKwkJfQorCWlmIChydW5zWzFdWzMzXSAhPSAwKQorCQl7CisJCXByaW50ZigidGVzdCA0IGZhaWxlZCwgYml0PSVkIHJ1bj0lZCBudW09JWx1XG4iLAorCQkJMSwzNCxydW5zWzFdWzMzXSk7CisJCWVycisrOworCQl9CisJcHJpbnRmKCJ0ZXN0IDQgZG9uZVxuIik7CisgZXJyOgorCWVycj0oKGVycik/MTowKTsKKyNpZmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisgICAgaWYgKGVycikgcHJpbnRmKCJFUlJPUjogJWRcbiIsIGVycik7CisjZW5kaWYKKwlFWElUKGVycik7CisJcmV0dXJuKGVycik7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JjMi9yYzIuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjODM2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIGNyeXB0by9yYzIvcmMyLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfUkMyX0gKKyNkZWZpbmUgSEVBREVSX1JDMl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+IC8qIE9QRU5TU0xfTk9fUkMyLCBSQzJfSU5UICovCisjaWZkZWYgT1BFTlNTTF9OT19SQzIKKyNlcnJvciBSQzIgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2RlZmluZSBSQzJfRU5DUllQVAkxCisjZGVmaW5lIFJDMl9ERUNSWVBUCTAKKworI2RlZmluZSBSQzJfQkxPQ0sJOAorI2RlZmluZSBSQzJfS0VZX0xFTkdUSAkxNgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCByYzJfa2V5X3N0CisJeworCVJDMl9JTlQgZGF0YVs2NF07CisJfSBSQzJfS0VZOworCisgCit2b2lkIFJDMl9zZXRfa2V5KFJDMl9LRVkgKmtleSwgaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSxpbnQgYml0cyk7Cit2b2lkIFJDMl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsUkMyX0tFWSAqa2V5LAorCQkgICAgIGludCBlbmMpOwordm9pZCBSQzJfZW5jcnlwdCh1bnNpZ25lZCBsb25nICpkYXRhLFJDMl9LRVkgKmtleSk7Cit2b2lkIFJDMl9kZWNyeXB0KHVuc2lnbmVkIGxvbmcgKmRhdGEsUkMyX0tFWSAqa2V5KTsKK3ZvaWQgUkMyX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCVJDMl9LRVkgKmtzLCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYyk7Cit2b2lkIFJDMl9jZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgICBsb25nIGxlbmd0aCwgUkMyX0tFWSAqc2NoZWR1bGUsIHVuc2lnbmVkIGNoYXIgKml2ZWMsCisJCSAgICAgICBpbnQgKm51bSwgaW50IGVuYyk7Cit2b2lkIFJDMl9vZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgICBsb25nIGxlbmd0aCwgUkMyX0tFWSAqc2NoZWR1bGUsIHVuc2lnbmVkIGNoYXIgKml2ZWMsCisJCSAgICAgICBpbnQgKm51bSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyX2NiYy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjMi9yYzJfY2JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRmNDhkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyX2NiYy5jCkBAIC0wLDAgKzEsMjI2IEBACisvKiBjcnlwdG8vcmMyL3JjMl9jYmMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yYzIuaD4KKyNpbmNsdWRlICJyYzJfbG9jbC5oIgorCit2b2lkIFJDMl9jYmNfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwkgICAgIFJDMl9LRVkgKmtzLCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuY3J5cHQpCisJeworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdGluMCx0aW4xOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdG91dDAsdG91dDEseG9yMCx4b3IxOworCXJlZ2lzdGVyIGxvbmcgbD1sZW5ndGg7CisJdW5zaWduZWQgbG9uZyB0aW5bMl07CisKKwlpZiAoZW5jcnlwdCkKKwkJeworCQljMmwoaXYsdG91dDApOworCQljMmwoaXYsdG91dDEpOworCQlpdi09ODsKKwkJZm9yIChsLT04OyBsPj0wOyBsLT04KQorCQkJeworCQkJYzJsKGluLHRpbjApOworCQkJYzJsKGluLHRpbjEpOworCQkJdGluMF49dG91dDA7CisJCQl0aW4xXj10b3V0MTsKKwkJCXRpblswXT10aW4wOworCQkJdGluWzFdPXRpbjE7CisJCQlSQzJfZW5jcnlwdCh0aW4sa3MpOworCQkJdG91dDA9dGluWzBdOyBsMmModG91dDAsb3V0KTsKKwkJCXRvdXQxPXRpblsxXTsgbDJjKHRvdXQxLG91dCk7CisJCQl9CisJCWlmIChsICE9IC04KQorCQkJeworCQkJYzJsbihpbix0aW4wLHRpbjEsbCs4KTsKKwkJCXRpbjBePXRvdXQwOworCQkJdGluMV49dG91dDE7CisJCQl0aW5bMF09dGluMDsKKwkJCXRpblsxXT10aW4xOworCQkJUkMyX2VuY3J5cHQodGluLGtzKTsKKwkJCXRvdXQwPXRpblswXTsgbDJjKHRvdXQwLG91dCk7CisJCQl0b3V0MT10aW5bMV07IGwyYyh0b3V0MSxvdXQpOworCQkJfQorCQlsMmModG91dDAsaXYpOworCQlsMmModG91dDEsaXYpOworCQl9CisJZWxzZQorCQl7CisJCWMybChpdix4b3IwKTsKKwkJYzJsKGl2LHhvcjEpOworCQlpdi09ODsKKwkJZm9yIChsLT04OyBsPj0wOyBsLT04KQorCQkJeworCQkJYzJsKGluLHRpbjApOyB0aW5bMF09dGluMDsKKwkJCWMybChpbix0aW4xKTsgdGluWzFdPXRpbjE7CisJCQlSQzJfZGVjcnlwdCh0aW4sa3MpOworCQkJdG91dDA9dGluWzBdXnhvcjA7CisJCQl0b3V0MT10aW5bMV1eeG9yMTsKKwkJCWwyYyh0b3V0MCxvdXQpOworCQkJbDJjKHRvdXQxLG91dCk7CisJCQl4b3IwPXRpbjA7CisJCQl4b3IxPXRpbjE7CisJCQl9CisJCWlmIChsICE9IC04KQorCQkJeworCQkJYzJsKGluLHRpbjApOyB0aW5bMF09dGluMDsKKwkJCWMybChpbix0aW4xKTsgdGluWzFdPXRpbjE7CisJCQlSQzJfZGVjcnlwdCh0aW4sa3MpOworCQkJdG91dDA9dGluWzBdXnhvcjA7CisJCQl0b3V0MT10aW5bMV1eeG9yMTsKKwkJCWwyY24odG91dDAsdG91dDEsb3V0LGwrOCk7CisJCQl4b3IwPXRpbjA7CisJCQl4b3IxPXRpbjE7CisJCQl9CisJCWwyYyh4b3IwLGl2KTsKKwkJbDJjKHhvcjEsaXYpOworCQl9CisJdGluMD10aW4xPXRvdXQwPXRvdXQxPXhvcjA9eG9yMT0wOworCXRpblswXT10aW5bMV09MDsKKwl9CisKK3ZvaWQgUkMyX2VuY3J5cHQodW5zaWduZWQgbG9uZyAqZCwgUkMyX0tFWSAqa2V5KQorCXsKKwlpbnQgaSxuOworCXJlZ2lzdGVyIFJDMl9JTlQgKnAwLCpwMTsKKwlyZWdpc3RlciBSQzJfSU5UIHgwLHgxLHgyLHgzLHQ7CisJdW5zaWduZWQgbG9uZyBsOworCisJbD1kWzBdOworCXgwPShSQzJfSU5UKWwmMHhmZmZmOworCXgxPShSQzJfSU5UKShsPj4xNkwpOworCWw9ZFsxXTsKKwl4Mj0oUkMyX0lOVClsJjB4ZmZmZjsKKwl4Mz0oUkMyX0lOVCkobD4+MTZMKTsKKworCW49MzsKKwlpPTU7CisKKwlwMD1wMT0gJihrZXktPmRhdGFbMF0pOworCWZvciAoOzspCisJCXsKKwkJdD0oeDArKHgxJiB+eDMpKyh4MiZ4MykrICoocDArKykpJjB4ZmZmZjsKKwkJeDA9KHQ8PDEpfCh0Pj4xNSk7CisJCXQ9KHgxKyh4MiYgfngwKSsoeDMmeDApKyAqKHAwKyspKSYweGZmZmY7CisJCXgxPSh0PDwyKXwodD4+MTQpOworCQl0PSh4MisoeDMmIH54MSkrKHgwJngxKSsgKihwMCsrKSkmMHhmZmZmOworCQl4Mj0odDw8Myl8KHQ+PjEzKTsKKwkJdD0oeDMrKHgwJiB+eDIpKyh4MSZ4MikrICoocDArKykpJjB4ZmZmZjsKKwkJeDM9KHQ8PDUpfCh0Pj4xMSk7CisKKwkJaWYgKC0taSA9PSAwKQorCQkJeworCQkJaWYgKC0tbiA9PSAwKSBicmVhazsKKwkJCWk9KG4gPT0gMik/Njo1OworCisJCQl4MCs9cDFbeDMmMHgzZl07CisJCQl4MSs9cDFbeDAmMHgzZl07CisJCQl4Mis9cDFbeDEmMHgzZl07CisJCQl4Mys9cDFbeDImMHgzZl07CisJCQl9CisJCX0KKworCWRbMF09KHVuc2lnbmVkIGxvbmcpKHgwJjB4ZmZmZil8KCh1bnNpZ25lZCBsb25nKSh4MSYweGZmZmYpPDwxNkwpOworCWRbMV09KHVuc2lnbmVkIGxvbmcpKHgyJjB4ZmZmZil8KCh1bnNpZ25lZCBsb25nKSh4MyYweGZmZmYpPDwxNkwpOworCX0KKwordm9pZCBSQzJfZGVjcnlwdCh1bnNpZ25lZCBsb25nICpkLCBSQzJfS0VZICprZXkpCisJeworCWludCBpLG47CisJcmVnaXN0ZXIgUkMyX0lOVCAqcDAsKnAxOworCXJlZ2lzdGVyIFJDMl9JTlQgeDAseDEseDIseDMsdDsKKwl1bnNpZ25lZCBsb25nIGw7CisKKwlsPWRbMF07CisJeDA9KFJDMl9JTlQpbCYweGZmZmY7CisJeDE9KFJDMl9JTlQpKGw+PjE2TCk7CisJbD1kWzFdOworCXgyPShSQzJfSU5UKWwmMHhmZmZmOworCXgzPShSQzJfSU5UKShsPj4xNkwpOworCisJbj0zOworCWk9NTsKKworCXAwPSAmKGtleS0+ZGF0YVs2M10pOworCXAxPSAmKGtleS0+ZGF0YVswXSk7CisJZm9yICg7OykKKwkJeworCQl0PSgoeDM8PDExKXwoeDM+PjUpKSYweGZmZmY7CisJCXgzPSh0LSh4MCYgfngyKS0oeDEmeDIpLSAqKHAwLS0pKSYweGZmZmY7CisJCXQ9KCh4Mjw8MTMpfCh4Mj4+MykpJjB4ZmZmZjsKKwkJeDI9KHQtKHgzJiB+eDEpLSh4MCZ4MSktICoocDAtLSkpJjB4ZmZmZjsKKwkJdD0oKHgxPDwxNCl8KHgxPj4yKSkmMHhmZmZmOworCQl4MT0odC0oeDImIH54MCktKHgzJngwKS0gKihwMC0tKSkmMHhmZmZmOworCQl0PSgoeDA8PDE1KXwoeDA+PjEpKSYweGZmZmY7CisJCXgwPSh0LSh4MSYgfngzKS0oeDImeDMpLSAqKHAwLS0pKSYweGZmZmY7CisKKwkJaWYgKC0taSA9PSAwKQorCQkJeworCQkJaWYgKC0tbiA9PSAwKSBicmVhazsKKwkJCWk9KG4gPT0gMik/Njo1OworCisJCQl4Mz0oeDMtcDFbeDImMHgzZl0pJjB4ZmZmZjsKKwkJCXgyPSh4Mi1wMVt4MSYweDNmXSkmMHhmZmZmOworCQkJeDE9KHgxLXAxW3gwJjB4M2ZdKSYweGZmZmY7CisJCQl4MD0oeDAtcDFbeDMmMHgzZl0pJjB4ZmZmZjsKKwkJCX0KKwkJfQorCisJZFswXT0odW5zaWduZWQgbG9uZykoeDAmMHhmZmZmKXwoKHVuc2lnbmVkIGxvbmcpKHgxJjB4ZmZmZik8PDE2TCk7CisJZFsxXT0odW5zaWduZWQgbG9uZykoeDImMHhmZmZmKXwoKHVuc2lnbmVkIGxvbmcpKHgzJjB4ZmZmZik8PDE2TCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMl9lY2IuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyX2VjYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjg2YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMl9lY2IuYwpAQCAtMCwwICsxLDg4IEBACisvKiBjcnlwdG8vcmMyL3JjMl9lY2IuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yYzIuaD4KKyNpbmNsdWRlICJyYzJfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbHYuaD4KKworY29uc3QgY2hhciBSQzJfdmVyc2lvbltdPSJSQzIiIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworLyogUkMyIGFzIGltcGxlbWVudGVkIGZybSBhIHBvc3RpbmcgZnJvbQorICogTmV3c2dyb3Vwczogc2NpLmNyeXB0CisgKiBTZW5kZXI6IHBndXQwMUBjcy5hdWNrbGFuZC5hYy5ueiAoUGV0ZXIgR3V0bWFubikKKyAqIFN1YmplY3Q6IFNwZWNpZmljYXRpb24gZm9yIFJvbiBSaXZlc3RzIENpcGhlciBOby4yCisgKiBNZXNzYWdlLUlEOiA8NGZrMzlmJGY3MEBuZXQuYXVja2xhbmQuYWMubno+CisgKiBEYXRlOiAxMSBGZWIgMTk5NiAwNjo0NTowMyBHTVQKKyAqLworCit2b2lkIFJDMl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBSQzJfS0VZICprcywKKwkJICAgICBpbnQgZW5jcnlwdCkKKwl7CisJdW5zaWduZWQgbG9uZyBsLGRbMl07CisKKwljMmwoaW4sbCk7IGRbMF09bDsKKwljMmwoaW4sbCk7IGRbMV09bDsKKwlpZiAoZW5jcnlwdCkKKwkJUkMyX2VuY3J5cHQoZCxrcyk7CisJZWxzZQorCQlSQzJfZGVjcnlwdChkLGtzKTsKKwlsPWRbMF07IGwyYyhsLG91dCk7CisJbD1kWzFdOyBsMmMobCxvdXQpOworCWw9ZFswXT1kWzFdPTA7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMl9sb2NsLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMl9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1Y2QxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyX2xvY2wuaApAQCAtMCwwICsxLDE1NiBAQAorLyogY3J5cHRvL3JjMi9yYzJfbG9jbC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyN1bmRlZiBjMmwKKyNkZWZpbmUgYzJsKGMsbCkJKGwgPSgodW5zaWduZWQgbG9uZykoKigoYykrKykpKSAgICAsIFwKKwkJCSBsfD0oKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PCA4TCwgXAorCQkJIGx8PSgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8MTZMLCBcCisJCQkgbHw9KCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwyNEwpCisKKy8qIE5PVEUgLSBjIGlzIG5vdCBpbmNyZW1lbnRlZCBhcyBwZXIgYzJsICovCisjdW5kZWYgYzJsbgorI2RlZmluZSBjMmxuKGMsbDEsbDIsbikJeyBcCisJCQljKz1uOyBcCisJCQlsMT1sMj0wOyBcCisJCQlzd2l0Y2ggKG4pIHsgXAorCQkJY2FzZSA4OiBsMiA9KCh1bnNpZ25lZCBsb25nKSgqKC0tKGMpKSkpPDwyNEw7IFwKKwkJCWNhc2UgNzogbDJ8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MTZMOyBcCisJCQljYXNlIDY6IGwyfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PCA4TDsgXAorCQkJY2FzZSA1OiBsMnw9KCh1bnNpZ25lZCBsb25nKSgqKC0tKGMpKSkpOyAgICAgXAorCQkJY2FzZSA0OiBsMSA9KCh1bnNpZ25lZCBsb25nKSgqKC0tKGMpKSkpPDwyNEw7IFwKKwkJCWNhc2UgMzogbDF8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MTZMOyBcCisJCQljYXNlIDI6IGwxfD0oKHVuc2lnbmVkIGxvbmcpKCooLS0oYykpKSk8PCA4TDsgXAorCQkJY2FzZSAxOiBsMXw9KCh1bnNpZ25lZCBsb25nKSgqKC0tKGMpKSkpOyAgICAgXAorCQkJCX0gXAorCQkJfQorCisjdW5kZWYgbDJjCisjZGVmaW5lIGwyYyhsLGMpCSgqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKSAgICAgKSYweGZmKSwgXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4gOEwpJjB4ZmYpLCBcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjE2TCkmMHhmZiksIFwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MjRMKSYweGZmKSkKKworLyogTk9URSAtIGMgaXMgbm90IGluY3JlbWVudGVkIGFzIHBlciBsMmMgKi8KKyN1bmRlZiBsMmNuCisjZGVmaW5lIGwyY24obDEsbDIsYyxuKQl7IFwKKwkJCWMrPW47IFwKKwkJCXN3aXRjaCAobikgeyBcCisJCQljYXNlIDg6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+MjRMKSYweGZmKTsgXAorCQkJY2FzZSA3OiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMik+PjE2TCkmMHhmZik7IFwKKwkJCWNhc2UgNjogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDIpPj4gOEwpJjB4ZmYpOyBcCisJCQljYXNlIDU6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKSAgICAgKSYweGZmKTsgXAorCQkJY2FzZSA0OiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMSk+PjI0TCkmMHhmZik7IFwKKwkJCWNhc2UgMzogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDEpPj4xNkwpJjB4ZmYpOyBcCisJCQljYXNlIDI6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+IDhMKSYweGZmKTsgXAorCQkJY2FzZSAxOiAqKC0tKGMpKT0odW5zaWduZWQgY2hhcikoKChsMSkgICAgICkmMHhmZik7IFwKKwkJCQl9IFwKKwkJCX0KKworLyogTk9URSAtIGMgaXMgbm90IGluY3JlbWVudGVkIGFzIHBlciBuMmwgKi8KKyNkZWZpbmUgbjJsbihjLGwxLGwyLG4pCXsgXAorCQkJYys9bjsgXAorCQkJbDE9bDI9MDsgXAorCQkJc3dpdGNoIChuKSB7IFwKKwkJCWNhc2UgODogbDIgPSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKSAgICA7IFwKKwkJCWNhc2UgNzogbDJ8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8IDg7IFwKKwkJCWNhc2UgNjogbDJ8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MTY7IFwKKwkJCWNhc2UgNTogbDJ8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MjQ7IFwKKwkJCWNhc2UgNDogbDEgPSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKSAgICA7IFwKKwkJCWNhc2UgMzogbDF8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8IDg7IFwKKwkJCWNhc2UgMjogbDF8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MTY7IFwKKwkJCWNhc2UgMTogbDF8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MjQ7IFwKKwkJCQl9IFwKKwkJCX0KKworLyogTk9URSAtIGMgaXMgbm90IGluY3JlbWVudGVkIGFzIHBlciBsMm4gKi8KKyNkZWZpbmUgbDJubihsMSxsMixjLG4pCXsgXAorCQkJYys9bjsgXAorCQkJc3dpdGNoIChuKSB7IFwKKwkJCWNhc2UgODogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDIpICAgICkmMHhmZik7IFwKKwkJCWNhc2UgNzogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDIpPj4gOCkmMHhmZik7IFwKKwkJCWNhc2UgNjogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDIpPj4xNikmMHhmZik7IFwKKwkJCWNhc2UgNTogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDIpPj4yNCkmMHhmZik7IFwKKwkJCWNhc2UgNDogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDEpICAgICkmMHhmZik7IFwKKwkJCWNhc2UgMzogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDEpPj4gOCkmMHhmZik7IFwKKwkJCWNhc2UgMjogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDEpPj4xNikmMHhmZik7IFwKKwkJCWNhc2UgMTogKigtLShjKSk9KHVuc2lnbmVkIGNoYXIpKCgobDEpPj4yNCkmMHhmZik7IFwKKwkJCQl9IFwKKwkJCX0KKworI3VuZGVmIG4ybAorI2RlZmluZSBuMmwoYyxsKSAgICAgICAgKGwgPSgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8MjRMLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgbHw9KCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwxNkwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsfD0oKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PCA4TCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGx8PSgodW5zaWduZWQgbG9uZykoKigoYykrKykpKSkKKworI3VuZGVmIGwybgorI2RlZmluZSBsMm4obCxjKSAgICAgICAgKCooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4yNEwpJjB4ZmYpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjE2TCkmMHhmZiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+IDhMKSYweGZmKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpICAgICApJjB4ZmYpKQorCisjZGVmaW5lIENfUkMyKG4pIFwKKwl0PSh4MCsoeDEmIH54MykrKHgyJngzKSsgKihwMCsrKSkmMHhmZmZmOyBcCisJeDA9KHQ8PDEpfCh0Pj4xNSk7IFwKKwl0PSh4MSsoeDImIH54MCkrKHgzJngwKSsgKihwMCsrKSkmMHhmZmZmOyBcCisJeDE9KHQ8PDIpfCh0Pj4xNCk7IFwKKwl0PSh4MisoeDMmIH54MSkrKHgwJngxKSsgKihwMCsrKSkmMHhmZmZmOyBcCisJeDI9KHQ8PDMpfCh0Pj4xMyk7IFwKKwl0PSh4MysoeDAmIH54MikrKHgxJngyKSsgKihwMCsrKSkmMHhmZmZmOyBcCisJeDM9KHQ8PDUpfCh0Pj4xMSk7CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyX3NrZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyX3NrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTUwYjBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjMi9yYzJfc2tleS5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBjcnlwdG8vcmMyL3JjMl9za2V5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcmMyLmg+CisjaW5jbHVkZSAicmMyX2xvY2wuaCIKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga2V5X3RhYmxlWzI1Nl09eworCTB4ZDksMHg3OCwweGY5LDB4YzQsMHgxOSwweGRkLDB4YjUsMHhlZCwweDI4LDB4ZTksMHhmZCwweDc5LAorCTB4NGEsMHhhMCwweGQ4LDB4OWQsMHhjNiwweDdlLDB4MzcsMHg4MywweDJiLDB4NzYsMHg1MywweDhlLAorCTB4NjIsMHg0YywweDY0LDB4ODgsMHg0NCwweDhiLDB4ZmIsMHhhMiwweDE3LDB4OWEsMHg1OSwweGY1LAorCTB4ODcsMHhiMywweDRmLDB4MTMsMHg2MSwweDQ1LDB4NmQsMHg4ZCwweDA5LDB4ODEsMHg3ZCwweDMyLAorCTB4YmQsMHg4ZiwweDQwLDB4ZWIsMHg4NiwweGI3LDB4N2IsMHgwYiwweGYwLDB4OTUsMHgyMSwweDIyLAorCTB4NWMsMHg2YiwweDRlLDB4ODIsMHg1NCwweGQ2LDB4NjUsMHg5MywweGNlLDB4NjAsMHhiMiwweDFjLAorCTB4NzMsMHg1NiwweGMwLDB4MTQsMHhhNywweDhjLDB4ZjEsMHhkYywweDEyLDB4NzUsMHhjYSwweDFmLAorCTB4M2IsMHhiZSwweGU0LDB4ZDEsMHg0MiwweDNkLDB4ZDQsMHgzMCwweGEzLDB4M2MsMHhiNiwweDI2LAorCTB4NmYsMHhiZiwweDBlLDB4ZGEsMHg0NiwweDY5LDB4MDcsMHg1NywweDI3LDB4ZjIsMHgxZCwweDliLAorCTB4YmMsMHg5NCwweDQzLDB4MDMsMHhmOCwweDExLDB4YzcsMHhmNiwweDkwLDB4ZWYsMHgzZSwweGU3LAorCTB4MDYsMHhjMywweGQ1LDB4MmYsMHhjOCwweDY2LDB4MWUsMHhkNywweDA4LDB4ZTgsMHhlYSwweGRlLAorCTB4ODAsMHg1MiwweGVlLDB4ZjcsMHg4NCwweGFhLDB4NzIsMHhhYywweDM1LDB4NGQsMHg2YSwweDJhLAorCTB4OTYsMHgxYSwweGQyLDB4NzEsMHg1YSwweDE1LDB4NDksMHg3NCwweDRiLDB4OWYsMHhkMCwweDVlLAorCTB4MDQsMHgxOCwweGE0LDB4ZWMsMHhjMiwweGUwLDB4NDEsMHg2ZSwweDBmLDB4NTEsMHhjYiwweGNjLAorCTB4MjQsMHg5MSwweGFmLDB4NTAsMHhhMSwweGY0LDB4NzAsMHgzOSwweDk5LDB4N2MsMHgzYSwweDg1LAorCTB4MjMsMHhiOCwweGI0LDB4N2EsMHhmYywweDAyLDB4MzYsMHg1YiwweDI1LDB4NTUsMHg5NywweDMxLAorCTB4MmQsMHg1ZCwweGZhLDB4OTgsMHhlMywweDhhLDB4OTIsMHhhZSwweDA1LDB4ZGYsMHgyOSwweDEwLAorCTB4NjcsMHg2YywweGJhLDB4YzksMHhkMywweDAwLDB4ZTYsMHhjZiwweGUxLDB4OWUsMHhhOCwweDJjLAorCTB4NjMsMHgxNiwweDAxLDB4M2YsMHg1OCwweGUyLDB4ODksMHhhOSwweDBkLDB4MzgsMHgzNCwweDFiLAorCTB4YWIsMHgzMywweGZmLDB4YjAsMHhiYiwweDQ4LDB4MGMsMHg1ZiwweGI5LDB4YjEsMHhjZCwweDJlLAorCTB4YzUsMHhmMywweGRiLDB4NDcsMHhlNSwweGE1LDB4OWMsMHg3NywweDBhLDB4YTYsMHgyMCwweDY4LAorCTB4ZmUsMHg3ZiwweGMxLDB4YWQsCisJfTsKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0FSTV8pCisjcHJhZ21hIG9wdGltaXplKCJnIixvZmYpCisjZW5kaWYKKworLyogSXQgaGFzIGNvbWUgdG8gbXkgYXR0ZW50aW9uIHRoYXQgdGhlcmUgYXJlIDIgdmVyc2lvbnMgb2YgdGhlIFJDMgorICoga2V5IHNjaGVkdWxlLiAgT25lIHdoaWNoIGlzIG5vcm1hbCwgYW5kIGFudGhlciB3aGljaCBoYXMgYSBob29rIHRvCisgKiB1c2UgYSByZWR1Y2VkIGtleSBsZW5ndGguCisgKiBCU0FGRSB1c2VzIHRoZSAncmV0YXJkZWQnIHZlcnNpb24uICBXaGF0IEkgcHJldmlvdXNseSBzaGlwcGVkIGlzCisgKiB0aGUgc2FtZSBhcyBzcGVjaWZ5aW5nIDEwMjQgZm9yIHRoZSAnYml0cycgcGFyYW1ldGVyLiAgQnNhZmUgdXNlcworICogYSB2ZXJzaW9uIHdoZXJlIHRoZSBiaXRzIHBhcmFtZXRlciBpcyB0aGUgc2FtZSBhcyBsZW4qOCAqLwordm9pZCBSQzJfc2V0X2tleShSQzJfS0VZICprZXksIGludCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBiaXRzKQorCXsKKwlpbnQgaSxqOworCXVuc2lnbmVkIGNoYXIgKms7CisJUkMyX0lOVCAqa2k7CisJdW5zaWduZWQgaW50IGMsZDsKKworCWs9ICh1bnNpZ25lZCBjaGFyICopJihrZXktPmRhdGFbMF0pOworCSprPTA7IC8qIGZvciBpZiB0aGVyZSBpcyBhIHplcm8gbGVuZ3RoIGtleSAqLworCisJaWYgKGxlbiA+IDEyOCkgbGVuPTEyODsKKwlpZiAoYml0cyA8PSAwKSBiaXRzPTEwMjQ7CisJaWYgKGJpdHMgPiAxMDI0KSBiaXRzPTEwMjQ7CisKKwlmb3IgKGk9MDsgaTxsZW47IGkrKykKKwkJa1tpXT1kYXRhW2ldOworCisJLyogZXhwYW5kIHRhYmxlICovCisJZD1rW2xlbi0xXTsKKwlqPTA7CisJZm9yIChpPWxlbjsgaSA8IDEyODsgaSsrLGorKykKKwkJeworCQlkPWtleV90YWJsZVsoa1tqXStkKSYweGZmXTsKKwkJa1tpXT1kOworCQl9CisKKwkvKiBobW0uLi4uIGtleSByZWR1Y3Rpb24gdG8gJ2JpdHMnIGJpdHMgKi8KKworCWo9KGJpdHMrNyk+PjM7CisJaT0xMjgtajsKKwljPSAoMHhmZj4+KC1iaXRzICYgMHgwNykpOworCisJZD1rZXlfdGFibGVba1tpXSZjXTsKKwlrW2ldPWQ7CisJd2hpbGUgKGktLSkKKwkJeworCQlkPWtleV90YWJsZVtrW2kral1eZF07CisJCWtbaV09ZDsKKwkJfQorCisJLyogY29weSBmcm9tIGJ5dGVzIGludG8gUkMyX0lOVCdzICovCisJa2k9ICYoa2V5LT5kYXRhWzYzXSk7CisJZm9yIChpPTEyNzsgaT49MDsgaS09MikKKwkJKihraS0tKT0oKGtbaV08PDgpfGtbaS0xXSkmMHhmZmZmOworCX0KKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisjcHJhZ21hIG9wdGltaXplKCIiLG9uKQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMmNmYjY0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMmNmYjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhMDE1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyY2ZiNjQuYwpAQCAtMCwwICsxLDEyMiBAQAorLyogY3J5cHRvL3JjMi9yYzJjZmI2NC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL3JjMi5oPgorI2luY2x1ZGUgInJjMl9sb2NsLmgiCisKKy8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGVuY3J5cHRlZCBhcyB0aG91Z2ggNjRiaXQgY2ZiIG1vZGUgaXMgYmVpbmcKKyAqIHVzZWQuICBUaGUgZXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gdG8gcmVjb3JkIGhvdyBtdWNoIG9mIHRoZQorICogNjRiaXQgYmxvY2sgd2UgaGF2ZSB1c2VkIGlzIGNvbnRhaW5lZCBpbiAqbnVtOworICovCisKK3ZvaWQgUkMyX2NmYjY0X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJICAgICAgIGxvbmcgbGVuZ3RoLCBSQzJfS0VZICpzY2hlZHVsZSwgdW5zaWduZWQgY2hhciAqaXZlYywKKwkJICAgICAgIGludCAqbnVtLCBpbnQgZW5jcnlwdCkKKwl7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyB2MCx2MSx0OworCXJlZ2lzdGVyIGludCBuPSAqbnVtOworCXJlZ2lzdGVyIGxvbmcgbD1sZW5ndGg7CisJdW5zaWduZWQgbG9uZyB0aVsyXTsKKwl1bnNpZ25lZCBjaGFyICppdixjLGNjOworCisJaXY9KHVuc2lnbmVkIGNoYXIgKilpdmVjOworCWlmIChlbmNyeXB0KQorCQl7CisJCXdoaWxlIChsLS0pCisJCQl7CisJCQlpZiAobiA9PSAwKQorCQkJCXsKKwkJCQljMmwoaXYsdjApOyB0aVswXT12MDsKKwkJCQljMmwoaXYsdjEpOyB0aVsxXT12MTsKKwkJCQlSQzJfZW5jcnlwdCgodW5zaWduZWQgbG9uZyAqKXRpLHNjaGVkdWxlKTsKKwkJCQlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJCQkJdD10aVswXTsgbDJjKHQsaXYpOworCQkJCXQ9dGlbMV07IGwyYyh0LGl2KTsKKwkJCQlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJCQkJfQorCQkJYz0gKihpbisrKV5pdltuXTsKKwkJCSoob3V0KyspPWM7CisJCQlpdltuXT1jOworCQkJbj0obisxKSYweDA3OworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCXdoaWxlIChsLS0pCisJCQl7CisJCQlpZiAobiA9PSAwKQorCQkJCXsKKwkJCQljMmwoaXYsdjApOyB0aVswXT12MDsKKwkJCQljMmwoaXYsdjEpOyB0aVsxXT12MTsKKwkJCQlSQzJfZW5jcnlwdCgodW5zaWduZWQgbG9uZyAqKXRpLHNjaGVkdWxlKTsKKwkJCQlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJCQkJdD10aVswXTsgbDJjKHQsaXYpOworCQkJCXQ9dGlbMV07IGwyYyh0LGl2KTsKKwkJCQlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJCQkJfQorCQkJY2M9ICooaW4rKyk7CisJCQljPWl2W25dOworCQkJaXZbbl09Y2M7CisJCQkqKG91dCsrKT1jXmNjOworCQkJbj0obisxKSYweDA3OworCQkJfQorCQl9CisJdjA9djE9dGlbMF09dGlbMV09dD1jPWNjPTA7CisJKm51bT1uOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JjMi9yYzJvZmI2NC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjMi9yYzJvZmI2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjk3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMm9mYjY0LmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qIGNyeXB0by9yYzIvcmMyb2ZiNjQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9yYzIuaD4KKyNpbmNsdWRlICJyYzJfbG9jbC5oIgorCisvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBlbmNyeXB0ZWQgYXMgdGhvdWdoIDY0Yml0IG9mYiBtb2RlIGlzIGJlaW5nCisgKiB1c2VkLiAgVGhlIGV4dHJhIHN0YXRlIGluZm9ybWF0aW9uIHRvIHJlY29yZCBob3cgbXVjaCBvZiB0aGUKKyAqIDY0Yml0IGJsb2NrIHdlIGhhdmUgdXNlZCBpcyBjb250YWluZWQgaW4gKm51bTsKKyAqLwordm9pZCBSQzJfb2ZiNjRfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkgICAgICAgbG9uZyBsZW5ndGgsIFJDMl9LRVkgKnNjaGVkdWxlLCB1bnNpZ25lZCBjaGFyICppdmVjLAorCQkgICAgICAgaW50ICpudW0pCisJeworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgdjAsdjEsdDsKKwlyZWdpc3RlciBpbnQgbj0gKm51bTsKKwlyZWdpc3RlciBsb25nIGw9bGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgZFs4XTsKKwlyZWdpc3RlciBjaGFyICpkcDsKKwl1bnNpZ25lZCBsb25nIHRpWzJdOworCXVuc2lnbmVkIGNoYXIgKml2OworCWludCBzYXZlPTA7CisKKwlpdj0odW5zaWduZWQgY2hhciAqKWl2ZWM7CisJYzJsKGl2LHYwKTsKKwljMmwoaXYsdjEpOworCXRpWzBdPXYwOworCXRpWzFdPXYxOworCWRwPShjaGFyICopZDsKKwlsMmModjAsZHApOworCWwyYyh2MSxkcCk7CisJd2hpbGUgKGwtLSkKKwkJeworCQlpZiAobiA9PSAwKQorCQkJeworCQkJUkMyX2VuY3J5cHQoKHVuc2lnbmVkIGxvbmcgKil0aSxzY2hlZHVsZSk7CisJCQlkcD0oY2hhciAqKWQ7CisJCQl0PXRpWzBdOyBsMmModCxkcCk7CisJCQl0PXRpWzFdOyBsMmModCxkcCk7CisJCQlzYXZlKys7CisJCQl9CisJCSoob3V0KyspPSAqKGluKyspXmRbbl07CisJCW49KG4rMSkmMHgwNzsKKwkJfQorCWlmIChzYXZlKQorCQl7CisJCXYwPXRpWzBdOworCQl2MT10aVsxXTsKKwkJaXY9KHVuc2lnbmVkIGNoYXIgKilpdmVjOworCQlsMmModjAsaXYpOworCQlsMmModjEsaXYpOworCQl9CisJdD12MD12MT10aVswXT10aVsxXT0wOworCSpudW09bjsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyc3BlZWQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMyc3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWNmNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjMi9yYzJzcGVlZC5jCkBAIC0wLDAgKzEsMjc3IEBACisvKiBjcnlwdG8vcmMyL3JjMnNwZWVkLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogMTEtU2VwLTkyIEFuZHJldyBEYXZpZWwgICBTdXBwb3J0IGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggYWRkZWQgKi8KKy8qIDA2LUFwci05MiBMdWtlIEJyZW5uYW4gICAgU3VwcG9ydCBmb3IgVk1TIGFuZCBhZGQgZXh0cmEgc2lnbmFsIGNhbGxzICovCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgKCFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChfX0RFQ0MpKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NQUNPU1gpCisjZGVmaW5lIFRJTUVTCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSBPUEVOU1NMX1VOSVNURF9JTworT1BFTlNTTF9ERUNMQVJFX0VYSVQKKworI2lmbmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2lmbmRlZiBfSVJJWAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorI2lmZGVmIFRJTUVTCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjZW5kaWYKKworLyogRGVwZW5kaW5nIG9uIHRoZSBWTVMgdmVyc2lvbiwgdGhlIHRtcyBzdHJ1Y3R1cmUgaXMgcGVyaGFwcyBkZWZpbmVkLgorICAgVGhlIF9fVE1TIG1hY3JvIHdpbGwgc2hvdyBpZiBpdCB3YXMuICBJZiBpdCB3YXNuJ3QgZGVmaW5lZCwgd2Ugc2hvdWxkCisgICB1bmRlZmluZSBUSU1FUywgc2luY2UgdGhhdCB0ZWxscyB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbSBob3cgdGhpbmdzCisgICBzaG91bGQgYmUgaGFuZGxlZC4JCQkJLS0gUmljaGFyZCBMZXZpdHRlICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVNfREVDQykgJiYgIWRlZmluZWQoX19UTVMpCisjdW5kZWYgVElNRVMKKyNlbmRpZgorCisjaWZuZGVmIFRJTUVTCisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKF9fdWx0cml4KQorI2RlZmluZSBfUE9TSVhfU09VUkNFCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvcmMyLmg+CisKKy8qIFRoZSBmb2xsb3dpbmcgaWYgZnJvbSB0aW1lcygzKSBtYW4gcGFnZS4gIEl0IG1heSBuZWVkIHRvIGJlIGNoYW5nZWQgKi8KKyNpZm5kZWYgSFoKKyNpZm5kZWYgQ0xLX1RDSworI2RlZmluZSBIWgkxMDAuMAorI2Vsc2UJLyogQ0xLX1RDSyAqLworI2RlZmluZSBIWiAoKGRvdWJsZSlDTEtfVENLKQorI2VuZGlmCS8qIENMS19UQ0sgKi8KKyNlbmRpZgkvKiBIWiAqLworCisjZGVmaW5lIEJVRlNJWkUJKChsb25nKTEwMjQpCitsb25nIHJ1bj0wOworCitkb3VibGUgVGltZV9GKGludCBzKTsKKyNpZmRlZiBTSUdBTFJNCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChzZ2kpIHx8IGRlZmluZWQoX0FJWCkKKyNkZWZpbmUgU0lHUkVUVFlQRSB2b2lkCisjZWxzZQorI2RlZmluZSBTSUdSRVRUWVBFIGludAorI2VuZGlmCisKK1NJR1JFVFRZUEUgc2lnX2RvbmUoaW50IHNpZyk7CitTSUdSRVRUWVBFIHNpZ19kb25lKGludCBzaWcpCisJeworCXNpZ25hbChTSUdBTFJNLHNpZ19kb25lKTsKKwlydW49MDsKKyNpZmRlZiBMSU5UCisJc2lnPXNpZzsKKyNlbmRpZgorCX0KKyNlbmRpZgorCisjZGVmaW5lIFNUQVJUCTAKKyNkZWZpbmUgU1RPUAkxCisKK2RvdWJsZSBUaW1lX0YoaW50IHMpCisJeworCWRvdWJsZSByZXQ7CisjaWZkZWYgVElNRVMKKwlzdGF0aWMgc3RydWN0IHRtcyB0c3RhcnQsdGVuZDsKKworCWlmIChzID09IFNUQVJUKQorCQl7CisJCXRpbWVzKCZ0c3RhcnQpOworCQlyZXR1cm4oMCk7CisJCX0KKwllbHNlCisJCXsKKwkJdGltZXMoJnRlbmQpOworCQlyZXQ9KChkb3VibGUpKHRlbmQudG1zX3V0aW1lLXRzdGFydC50bXNfdXRpbWUpKS9IWjsKKwkJcmV0dXJuKChyZXQgPT0gMC4wKT8xZS02OnJldCk7CisJCX0KKyNlbHNlIC8qICF0aW1lcygpICovCisJc3RhdGljIHN0cnVjdCB0aW1lYiB0c3RhcnQsdGVuZDsKKwlsb25nIGk7CisKKwlpZiAocyA9PSBTVEFSVCkKKwkJeworCQlmdGltZSgmdHN0YXJ0KTsKKwkJcmV0dXJuKDApOworCQl9CisJZWxzZQorCQl7CisJCWZ0aW1lKCZ0ZW5kKTsKKwkJaT0obG9uZyl0ZW5kLm1pbGxpdG0tKGxvbmcpdHN0YXJ0Lm1pbGxpdG07CisJCXJldD0oKGRvdWJsZSkodGVuZC50aW1lLXRzdGFydC50aW1lKSkrKChkb3VibGUpaSkvMWUzOworCQlyZXR1cm4oKHJldCA9PSAwLjApPzFlLTY6cmV0KTsKKwkJfQorI2VuZGlmCisJfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisJeworCWxvbmcgY291bnQ7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmW0JVRlNJWkVdOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGtleVtdID17CisJCQkweDEyLDB4MzQsMHg1NiwweDc4LDB4OWEsMHhiYywweGRlLDB4ZjAsCisJCQkweGZlLDB4ZGMsMHhiYSwweDk4LDB4NzYsMHg1NCwweDMyLDB4MTAsCisJCQl9OworCVJDMl9LRVkgc2NoOworCWRvdWJsZSBhLGIsYyxkOworI2lmbmRlZiBTSUdBTFJNCisJbG9uZyBjYSxjYixjYzsKKyNlbmRpZgorCisjaWZuZGVmIFRJTUVTCisJcHJpbnRmKCJUbyBnZXQgdGhlIG1vc3QgYWNjdXJhdGUgcmVzdWx0cywgdHJ5IHRvIHJ1biB0aGlzXG4iKTsKKwlwcmludGYoInByb2dyYW0gd2hlbiB0aGlzIGNvbXB1dGVyIGlzIGlkbGUuXG4iKTsKKyNlbmRpZgorCisjaWZuZGVmIFNJR0FMUk0KKwlwcmludGYoIkZpcnN0IHdlIGNhbGN1bGF0ZSB0aGUgYXBwcm94aW1hdGUgc3BlZWQgLi4uXG4iKTsKKwlSQzJfc2V0X2tleSgmc2NoLDE2LGtleSwxMjgpOworCWNvdW50PTEwOworCWRvCXsKKwkJbG9uZyBpOworCQl1bnNpZ25lZCBsb25nIGRhdGFbMl07CisKKwkJY291bnQqPTI7CisJCVRpbWVfRihTVEFSVCk7CisJCWZvciAoaT1jb3VudDsgaTsgaS0tKQorCQkJUkMyX2VuY3J5cHQoZGF0YSwmc2NoKTsKKwkJZD1UaW1lX0YoU1RPUCk7CisJCX0gd2hpbGUgKGQgPCAzLjApOworCWNhPWNvdW50LzUxMjsKKwljYj1jb3VudDsKKwljYz1jb3VudCo4L0JVRlNJWkUrMTsKKwlwcmludGYoIkRvaW5nIFJDMl9zZXRfa2V5ICVsZCB0aW1lc1xuIixjYSk7CisjZGVmaW5lIENPTkQoZCkJKGNvdW50ICE9IChkKSkKKyNkZWZpbmUgQ09VTlQoZCkgKGQpCisjZWxzZQorI2RlZmluZSBDT05EKGMpCShydW4pCisjZGVmaW5lIENPVU5UKGQpIChjb3VudCkKKwlzaWduYWwoU0lHQUxSTSxzaWdfZG9uZSk7CisJcHJpbnRmKCJEb2luZyBSQzJfc2V0X2tleSBmb3IgMTAgc2Vjb25kc1xuIik7CisJYWxhcm0oMTApOworI2VuZGlmCisKKwlUaW1lX0YoU1RBUlQpOworCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjYSk7IGNvdW50Kz00KQorCQl7CisJCVJDMl9zZXRfa2V5KCZzY2gsMTYsa2V5LDEyOCk7CisJCVJDMl9zZXRfa2V5KCZzY2gsMTYsa2V5LDEyOCk7CisJCVJDMl9zZXRfa2V5KCZzY2gsMTYsa2V5LDEyOCk7CisJCVJDMl9zZXRfa2V5KCZzY2gsMTYsa2V5LDEyOCk7CisJCX0KKwlkPVRpbWVfRihTVE9QKTsKKwlwcmludGYoIiVsZCBSQzJfc2V0X2tleSdzIGluICUuMmYgc2Vjb25kc1xuIixjb3VudCxkKTsKKwlhPSgoZG91YmxlKUNPVU5UKGNhKSkvZDsKKworI2lmZGVmIFNJR0FMUk0KKwlwcmludGYoIkRvaW5nIFJDMl9lbmNyeXB0J3MgZm9yIDEwIHNlY29uZHNcbiIpOworCWFsYXJtKDEwKTsKKyNlbHNlCisJcHJpbnRmKCJEb2luZyBSQzJfZW5jcnlwdCAlbGQgdGltZXNcbiIsY2IpOworI2VuZGlmCisJVGltZV9GKFNUQVJUKTsKKwlmb3IgKGNvdW50PTAscnVuPTE7IENPTkQoY2IpOyBjb3VudCs9NCkKKwkJeworCQl1bnNpZ25lZCBsb25nIGRhdGFbMl07CisKKwkJUkMyX2VuY3J5cHQoZGF0YSwmc2NoKTsKKwkJUkMyX2VuY3J5cHQoZGF0YSwmc2NoKTsKKwkJUkMyX2VuY3J5cHQoZGF0YSwmc2NoKTsKKwkJUkMyX2VuY3J5cHQoZGF0YSwmc2NoKTsKKwkJfQorCWQ9VGltZV9GKFNUT1ApOworCXByaW50ZigiJWxkIFJDMl9lbmNyeXB0J3MgaW4gJS4yZiBzZWNvbmRcbiIsY291bnQsZCk7CisJYj0oKGRvdWJsZSlDT1VOVChjYikqOCkvZDsKKworI2lmZGVmIFNJR0FMUk0KKwlwcmludGYoIkRvaW5nIFJDMl9jYmNfZW5jcnlwdCBvbiAlbGQgYnl0ZSBibG9ja3MgZm9yIDEwIHNlY29uZHNcbiIsCisJCUJVRlNJWkUpOworCWFsYXJtKDEwKTsKKyNlbHNlCisJcHJpbnRmKCJEb2luZyBSQzJfY2JjX2VuY3J5cHQgJWxkIHRpbWVzIG9uICVsZCBieXRlIGJsb2Nrc1xuIixjYywKKwkJQlVGU0laRSk7CisjZW5kaWYKKwlUaW1lX0YoU1RBUlQpOworCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjYyk7IGNvdW50KyspCisJCVJDMl9jYmNfZW5jcnlwdChidWYsYnVmLEJVRlNJWkUsJnNjaCwKKwkJCSYoa2V5WzBdKSxSQzJfRU5DUllQVCk7CisJZD1UaW1lX0YoU1RPUCk7CisJcHJpbnRmKCIlbGQgUkMyX2NiY19lbmNyeXB0J3Mgb2YgJWxkIGJ5dGUgYmxvY2tzIGluICUuMmYgc2Vjb25kXG4iLAorCQljb3VudCxCVUZTSVpFLGQpOworCWM9KChkb3VibGUpQ09VTlQoY2MpKkJVRlNJWkUpL2Q7CisKKwlwcmludGYoIlJDMiBzZXRfa2V5ICAgICAgIHBlciBzZWMgPSAlMTIuMmYgKCU5LjNmdVMpXG4iLGEsMS4wZTYvYSk7CisJcHJpbnRmKCJSQzIgcmF3IGVjYiBieXRlcyBwZXIgc2VjID0gJTEyLjJmICglOS4zZnVTKVxuIixiLDguMGU2L2IpOworCXByaW50ZigiUkMyIGNiYyAgICAgYnl0ZXMgcGVyIHNlYyA9ICUxMi4yZiAoJTkuM2Z1UylcbiIsYyw4LjBlNi9jKTsKKwlleGl0KDApOworI2lmIGRlZmluZWQoTElOVCkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykKKwlyZXR1cm4oMCk7CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMnRlc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvcmMydGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMTE3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JjMnRlc3QuYwpAQCAtMCwwICsxLDI3NCBAQAorLyogY3J5cHRvL3JjMi9yYzJ0ZXN0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogVGhpcyBoYXMgYmVlbiBhIHF1aWNrbHkgaGFja2VkICdpZGVhdGVzdC5jJy4gIFdoZW4gSSBhZGQgdGVzdHMgZm9yIG90aGVyCisgKiBSQzIgbW9kZXMsIG1vcmUgb2YgdGhlIGNvZGUgd2lsbCBiZSB1bmNvbW1lbnRlZC4gKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICIuLi9lX29zLmgiCisKKyNpZmRlZiBPUEVOU1NMX05PX1JDMgoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwcmludGYoIk5vIFJDMiBzdXBwb3J0XG4iKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZWxzZQorI2luY2x1ZGUgPG9wZW5zc2wvcmMyLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFJDMmtleVs0XVsxNl09eworCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sCisJezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxfSwKKwl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorCSAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCXsweDAwLDB4MDEsMHgwMiwweDAzLDB4MDQsMHgwNSwweDA2LDB4MDcsCisJIDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MEUsMHgwRn0sCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgUkMycGxhaW5bNF1bOF09eworCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCXsweEZGLDB4RkYsMHhGRiwweEZGLDB4RkYsMHhGRiwweEZGLDB4RkZ9LAorCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDB9LAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFJDMmNpcGhlcls0XVs4XT17CisJezB4MUMsMHgxOSwweDhBLDB4ODMsMHg4RCwweEYwLDB4MjgsMHhCN30sCisJezB4MjEsMHg4MiwweDlDLDB4NzgsMHhBOSwweEY5LDB4QzAsMHg3NH0sCisJezB4MTMsMHhEQiwweDM1LDB4MTcsMHhEMywweDIxLDB4ODYsMHg5RX0sCisJezB4NTAsMHhEQywweDAxLDB4NjIsMHhCRCwweDc1LDB4N0YsMHgzMX0sCisJfTsKKy8qKioqKioqKioqKiovCisjaWZkZWYgdW5kZWYKK3Vuc2lnbmVkIGNoYXIga1sxNl09eworCTB4MDAsMHgwMSwweDAwLDB4MDIsMHgwMCwweDAzLDB4MDAsMHgwNCwKKwkweDAwLDB4MDUsMHgwMCwweDA2LDB4MDAsMHgwNywweDAwLDB4MDh9OworCit1bnNpZ25lZCBjaGFyIGluWzhdPXsweDAwLDB4MDAsMHgwMCwweDAxLDB4MDAsMHgwMiwweDAwLDB4MDN9OwordW5zaWduZWQgY2hhciAgY1s4XT17MHgxMSwweEZCLDB4RUQsMHgyQiwweDAxLDB4OTgsMHg2RCwweEU1fTsKK3Vuc2lnbmVkIGNoYXIgb3V0WzgwXTsKKworY2hhciAqdGV4dD0iSGVsbG8gdG8gYWxsIHBlb3BsZSBvdXQgdGhlcmUiOworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjZmJfa2V5WzE2XT17CisJMHhlMSwweGYwLDB4YzMsMHhkMiwweGE1LDB4YjQsMHg4NywweDk2LAorCTB4NjksMHg3OCwweDRiLDB4NWEsMHgyZCwweDNjLDB4MGYsMHgxZSwKKwl9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2ZiX2l2WzgwXT17MHgzNCwweDEyLDB4NzgsMHg1NiwweGFiLDB4OTAsMHhlZiwweGNkfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNmYl9idWYxWzQwXSxjZmJfYnVmMls0MF0sY2ZiX3RtcFs4XTsKKyNkZWZpbmUgQ0ZCX1RFU1RfU0laRSAyNAorc3RhdGljIHVuc2lnbmVkIGNoYXIgcGxhaW5bQ0ZCX1RFU1RfU0laRV09CisgICAgICAgIHsKKyAgICAgICAgMHg0ZSwweDZmLDB4NzcsMHgyMCwweDY5LDB4NzMsCisgICAgICAgIDB4MjAsMHg3NCwweDY4LDB4NjUsMHgyMCwweDc0LAorICAgICAgICAweDY5LDB4NmQsMHg2NSwweDIwLDB4NjYsMHg2ZiwKKyAgICAgICAgMHg3MiwweDIwLDB4NjEsMHg2YywweDZjLDB4MjAKKyAgICAgICAgfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNmYl9jaXBoZXI2NFtDRkJfVEVTVF9TSVpFXT17CisJMHg1OSwweEQ4LDB4RTIsMHg2NSwweDAwLDB4NTgsMHg2QywweDNGLAorCTB4MkMsMHgxNywweDI1LDB4RDAsMHgxQSwweDM4LDB4QjcsMHgyQSwKKwkweDM5LDB4NjEsMHgzNywweERDLDB4NzksMHhGQiwweDlGLDB4NDUKKworLyoJMHhGOSwweDc4LDB4MzIsMHhCNSwweDQyLDB4MUEsMHg2QiwweDM4LAorCTB4OUEsMHg0NCwweEQ2LDB4MDQsMHgxOSwweDQzLDB4QzQsMHhEOSwKKwkweDNELDB4MUUsMHhBRSwweDQ3LDB4RkMsMHhDRiwweDI5LDB4MEIsKi8KKwl9OyAKKworCisvKnN0YXRpYyBpbnQgY2ZiNjRfdGVzdCh1bnNpZ25lZCBjaGFyICpjZmJfY2lwaGVyKTsqLworc3RhdGljIGNoYXIgKnB0KHVuc2lnbmVkIGNoYXIgKnApOworI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisJeworCWludCBpLG4sZXJyPTA7CisJUkMyX0tFWSBrZXk7IAorCXVuc2lnbmVkIGNoYXIgYnVmWzhdLGJ1ZjJbOF07CisKKwlmb3IgKG49MDsgbjw0OyBuKyspCisJCXsKKwkJUkMyX3NldF9rZXkoJmtleSwxNiwmKFJDMmtleVtuXVswXSksMCAvKiBvciAxMDI0ICovKTsKKworCQlSQzJfZWNiX2VuY3J5cHQoJihSQzJwbGFpbltuXVswXSksYnVmLCZrZXksUkMyX0VOQ1JZUFQpOworCQlpZiAobWVtY21wKCYoUkMyY2lwaGVyW25dWzBdKSxidWYsOCkgIT0gMCkKKwkJCXsKKwkJCXByaW50ZigiZWNiIHJjMiBlcnJvciBlbmNyeXB0aW5nXG4iKTsKKwkJCXByaW50ZigiZ290ICAgICA6Iik7CisJCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCQkJcHJpbnRmKCIlMDJYICIsYnVmW2ldKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCXByaW50ZigiZXhwZWN0ZWQ6Iik7CisJCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCQkJcHJpbnRmKCIlMDJYICIsUkMyY2lwaGVyW25dW2ldKTsKKwkJCWVycj0yMDsKKwkJCXByaW50ZigiXG4iKTsKKwkJCX0KKworCQlSQzJfZWNiX2VuY3J5cHQoYnVmLGJ1ZjIsJmtleSxSQzJfREVDUllQVCk7CisJCWlmIChtZW1jbXAoJihSQzJwbGFpbltuXVswXSksYnVmMiw4KSAhPSAwKQorCQkJeworCQkJcHJpbnRmKCJlY2IgUkMyIGVycm9yIGRlY3J5cHRpbmdcbiIpOworCQkJcHJpbnRmKCJnb3QgICAgIDoiKTsKKwkJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJCQlwcmludGYoIiUwMlggIixidWZbaV0pOworCQkJcHJpbnRmKCJcbiIpOworCQkJcHJpbnRmKCJleHBlY3RlZDoiKTsKKwkJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJCQlwcmludGYoIiUwMlggIixSQzJwbGFpbltuXVtpXSk7CisJCQlwcmludGYoIlxuIik7CisJCQllcnI9MzsKKwkJCX0KKwkJfQorCisJaWYgKGVyciA9PSAwKSBwcmludGYoImVjYiBSQzIgb2tcbiIpOworI2lmZGVmIHVuZGVmCisJbWVtY3B5KGl2LGssOCk7CisJaWRlYV9jYmNfZW5jcnlwdCgodW5zaWduZWQgY2hhciAqKXRleHQsb3V0LHN0cmxlbih0ZXh0KSsxLCZrZXksaXYsMSk7CisJbWVtY3B5KGl2LGssOCk7CisJaWRlYV9jYmNfZW5jcnlwdChvdXQsb3V0LDgsJmRrZXksaXYsMCk7CisJaWRlYV9jYmNfZW5jcnlwdCgmKG91dFs4XSksJihvdXRbOF0pLHN0cmxlbih0ZXh0KSsxLTgsJmRrZXksaXYsMCk7CisJaWYgKG1lbWNtcCh0ZXh0LG91dCxzdHJsZW4odGV4dCkrMSkgIT0gMCkKKwkJeworCQlwcmludGYoImNiYyBpZGVhIGJhZFxuIik7CisJCWVycj00OworCQl9CisJZWxzZQorCQlwcmludGYoImNiYyBpZGVhIG9rXG4iKTsKKworCXByaW50ZigiY2ZiNjQgaWRlYSAiKTsKKwlpZiAoY2ZiNjRfdGVzdChjZmJfY2lwaGVyNjQpKQorCQl7CisJCXByaW50ZigiYmFkXG4iKTsKKwkJZXJyPTU7CisJCX0KKwllbHNlCisJCXByaW50Zigib2tcbiIpOworI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisgICAgaWYgKGVycikgcHJpbnRmKCJFUlJPUjogJWRcbiIsIGVycik7CisjZW5kaWYKKwlFWElUKGVycik7CisJcmV0dXJuKGVycik7CisJfQorCisjaWZkZWYgdW5kZWYKK3N0YXRpYyBpbnQgY2ZiNjRfdGVzdCh1bnNpZ25lZCBjaGFyICpjZmJfY2lwaGVyKQorICAgICAgICB7CisgICAgICAgIElERUFfS0VZX1NDSEVEVUxFIGVrcyxka3M7CisgICAgICAgIGludCBlcnI9MCxpLG47CisKKyAgICAgICAgaWRlYV9zZXRfZW5jcnlwdF9rZXkoY2ZiX2tleSwmZWtzKTsKKyAgICAgICAgaWRlYV9zZXRfZGVjcnlwdF9rZXkoJmVrcywmZGtzKTsKKyAgICAgICAgbWVtY3B5KGNmYl90bXAsY2ZiX2l2LDgpOworICAgICAgICBuPTA7CisgICAgICAgIGlkZWFfY2ZiNjRfZW5jcnlwdChwbGFpbixjZmJfYnVmMSwobG9uZykxMiwmZWtzLAorICAgICAgICAgICAgICAgIGNmYl90bXAsJm4sSURFQV9FTkNSWVBUKTsKKyAgICAgICAgaWRlYV9jZmI2NF9lbmNyeXB0KCYocGxhaW5bMTJdKSwmKGNmYl9idWYxWzEyXSksCisgICAgICAgICAgICAgICAgKGxvbmcpQ0ZCX1RFU1RfU0laRS0xMiwmZWtzLAorICAgICAgICAgICAgICAgIGNmYl90bXAsJm4sSURFQV9FTkNSWVBUKTsKKyAgICAgICAgaWYgKG1lbWNtcChjZmJfY2lwaGVyLGNmYl9idWYxLENGQl9URVNUX1NJWkUpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycj0xOworICAgICAgICAgICAgICAgIHByaW50ZigiaWRlYV9jZmI2NF9lbmNyeXB0IGVuY3J5cHQgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPENGQl9URVNUX1NJWkU7IGkrPTgpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLHB0KCYoY2ZiX2J1ZjFbaV0pKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICBtZW1jcHkoY2ZiX3RtcCxjZmJfaXYsOCk7CisgICAgICAgIG49MDsKKyAgICAgICAgaWRlYV9jZmI2NF9lbmNyeXB0KGNmYl9idWYxLGNmYl9idWYyLChsb25nKTE3LCZla3MsCisgICAgICAgICAgICAgICAgY2ZiX3RtcCwmbixJREVBX0RFQ1JZUFQpOworICAgICAgICBpZGVhX2NmYjY0X2VuY3J5cHQoJihjZmJfYnVmMVsxN10pLCYoY2ZiX2J1ZjJbMTddKSwKKyAgICAgICAgICAgICAgICAobG9uZylDRkJfVEVTVF9TSVpFLTE3LCZka3MsCisgICAgICAgICAgICAgICAgY2ZiX3RtcCwmbixJREVBX0RFQ1JZUFQpOworICAgICAgICBpZiAobWVtY21wKHBsYWluLGNmYl9idWYyLENGQl9URVNUX1NJWkUpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVycj0xOworICAgICAgICAgICAgICAgIHByaW50ZigiaWRlYV9jZmJfZW5jcnlwdCBkZWNyeXB0IGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTwyNDsgaSs9OCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIscHQoJihjZmJfYnVmMltpXSkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIHJldHVybihlcnIpOworICAgICAgICB9CisKK3N0YXRpYyBjaGFyICpwdCh1bnNpZ25lZCBjaGFyICpwKQorCXsKKwlzdGF0aWMgY2hhciBidWZzWzEwXVsyMF07CisJc3RhdGljIGludCBibnVtPTA7CisJY2hhciAqcmV0OworCWludCBpOworCXN0YXRpYyBjaGFyICpmPSIwMTIzNDU2Nzg5QUJDREVGIjsKKworCXJldD0gJihidWZzW2JudW0rK11bMF0pOworCWJudW0lPTEwOworCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJeworCQlyZXRbaSoyXT1mWyhwW2ldPj40KSYweGZdOworCQlyZXRbaSoyKzFdPWZbcFtpXSYweGZdOworCQl9CisJcmV0WzE2XT0nXDAnOworCXJldHVybihyZXQpOworCX0KKwkKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3JyYzIuZG9jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjMi9ycmMyLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTNlZTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjMi9ycmMyLmRvYwpAQCAtMCwwICsxLDIxOSBAQAorPkZyb20gY3lnbnVzLm1pbmNvbS5vei5hdSFtaW5ibmUubWluY29tLm96LmF1IWJ1bnlpcC5jYy51cS5vei5hdSFtdW5uYXJpLk9aLkFVIWNvbXAudnV3LmFjLm56IXdhaWthdG8hYXVja2xhbmQuYWMubnohbmV3cyBNb24gRmViIDEyIDE4OjQ4OjE3IEVTVCAxOTk2CitBcnRpY2xlIDIzNjAxIG9mIHNjaS5jcnlwdDoKK1BhdGg6IGN5Z251cy5taW5jb20ub3ouYXUhbWluYm5lLm1pbmNvbS5vei5hdSFidW55aXAuY2MudXEub3ouYXUhbXVubmFyaS5PWi5BVSFjb21wLnZ1dy5hYy5ueiF3YWlrYXRvIWF1Y2tsYW5kLmFjLm56IW5ld3MKKz5Gcm9tOiBwZ3V0MDFAY3MuYXVja2xhbmQuYWMubnogKFBldGVyIEd1dG1hbm4pCitOZXdzZ3JvdXBzOiBzY2kuY3J5cHQKK1N1YmplY3Q6IFNwZWNpZmljYXRpb24gZm9yIFJvbiBSaXZlc3RzIENpcGhlciBOby4yCitEYXRlOiAxMSBGZWIgMTk5NiAwNjo0NTowMyBHTVQKK09yZ2FuaXphdGlvbjogVW5pdmVyc2l0eSBvZiBBdWNrbGFuZAorTGluZXM6IDIwMworU2VuZGVyOiBwZ3V0MDFAY3MuYXVja2xhbmQuYWMubnogKFBldGVyIEd1dG1hbm4pCitNZXNzYWdlLUlEOiA8NGZrMzlmJGY3MEBuZXQuYXVja2xhbmQuYWMubno+CitOTlRQLVBvc3RpbmctSG9zdDogY3MyNi5jcy5hdWNrbGFuZC5hYy5uegorWC1OZXdzcmVhZGVyOiBOTiB2ZXJzaW9uIDYuNS4wICMzIChOT1YpCisKKworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbiBSaXZlc3QncyBDaXBoZXIgTm8uMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgCitSb24gUml2ZXN0J3MgQ2lwaGVyIE5vLjIgKGhlcmVhZnRlciByZWZlcnJlZCB0byBhcyBSUkMuMiwgb3RoZXIgcGVvcGxlIG1heQorcmVmZXIgdG8gaXQgYnkgb3RoZXIgbmFtZXMpIGlzIHdvcmQgb3JpZW50ZWQsIG9wZXJhdGluZyBvbiBhIGJsb2NrIG9mIDY0IGJpdHMKK2RpdmlkZWQgaW50byBmb3VyIDE2LWJpdCB3b3Jkcywgd2l0aCBhIGtleSB0YWJsZSBvZiA2NCB3b3Jkcy4gIEFsbCBkYXRhIHVuaXRzCithcmUgbGl0dGxlLWVuZGlhbi4gIFRoaXMgZnVuY3Rpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtIGlzIGJhc2VkIGluCit0aGUgcGFwZXIgIlRoZSBSQzUgRW5jcnlwdGlvbiBBbGdvcml0aG0iIChSQzUgaXMgYSB0cmFkZW1hcmsgb2YgUlNBRFNJKSwgdXNpbmcKK3RoZSBzYW1lIGdlbmVyYWwgbGF5b3V0LCB0ZXJtaW5vbG9neSwgYW5kIHBzZXVkb2NvZGUgc3R5bGUuCisgCisgCitOb3RhdGlvbiBhbmQgUlJDLjIgUHJpbWl0aXZlIE9wZXJhdGlvbnMKKyAKK1JSQy4yIHVzZXMgdGhlIGZvbGxvd2luZyBwcmltaXRpdmUgb3BlcmF0aW9uczoKKyAKKzEuIFR3bydzLWNvbXBsZW1lbnQgYWRkaXRpb24gb2Ygd29yZHMsIGRlbm90ZWQgYnkgIisiLiAgVGhlIGludmVyc2Ugb3BlcmF0aW9uLAorICAgc3VidHJhY3Rpb24sIGlzIGRlbm90ZWQgYnkgIi0iLgorMi4gQml0d2lzZSBleGNsdXNpdmUgT1IsIGRlbm90ZWQgYnkgIl4iLgorMy4gQml0d2lzZSBBTkQsIGRlbm90ZWQgYnkgIiYiLgorNC4gQml0d2lzZSBOT1QsIGRlbm90ZWQgYnkgIn4iLgorNS4gQSBsZWZ0LXJvdGF0aW9uIG9mIHdvcmRzOyB0aGUgcm90YXRpb24gb2Ygd29yZCB4IGxlZnQgYnkgeSBpcyBkZW5vdGVkCisgICB4IDw8PCB5LiAgVGhlIGludmVyc2Ugb3BlcmF0aW9uLCByaWdodC1yb3RhdGlvbiwgaXMgZGVub3RlZCB4ID4+PiB5LgorIAorVGhlc2Ugb3BlcmF0aW9ucyBhcmUgZGlyZWN0bHkgYW5kIGVmZmljaWVudGx5IHN1cHBvcnRlZCBieSBtb3N0IHByb2Nlc3NvcnMuCisgCisgCitUaGUgUlJDLjIgQWxnb3JpdGhtCisgCitSUkMuMiBjb25zaXN0cyBvZiB0aHJlZSBjb21wb25lbnRzLCBhICprZXkgZXhwYW5zaW9uKiBhbGdvcml0aG0sIGFuCisqZW5jcnlwdGlvbiogYWxnb3JpdGhtLCBhbmQgYSAqZGVjcnlwdGlvbiogYWxnb3JpdGhtLgorIAorIAorS2V5IEV4cGFuc2lvbgorIAorVGhlIHB1cnBvc2Ugb2YgdGhlIGtleS1leHBhbnNpb24gcm91dGluZSBpcyB0byBleHBhbmQgdGhlIHVzZXIncyBrZXkgSyB0byBmaWxsCit0aGUgZXhwYW5kZWQga2V5IGFycmF5IFMsIHNvIFMgcmVzZW1ibGVzIGFuIGFycmF5IG9mIHJhbmRvbSBiaW5hcnkgd29yZHMKK2RldGVybWluZWQgYnkgdGhlIHVzZXIncyBzZWNyZXQga2V5IEsuCisgCitJbml0aWFsaXNpbmcgdGhlIFMtYm94CisgCitSUkMuMiB1c2VzIGEgc2luZ2xlIDI1Ni1ieXRlIFMtYm94IGRlcml2ZWQgZnJvbSB0aGUgY2lwaGVydGV4dCBjb250ZW50cyBvZgorQmVhbGUgQ2lwaGVyIE5vLjEgWE9SJ2Qgd2l0aCBhIG9uZS10aW1lIHBhZC4gIFRoZSBCZWFsZSBDaXBoZXJzIHByZWRhdGUgbW9kZXJuCitjcnlwdG9ncmFwaHkgYnkgZW5vdWdoIHRpbWUgdGhhdCB0aGVyZSBzaG91bGQgYmUgbm8gY29uY2VybnMgYWJvdXQgdHJhcGRvb3JzCitoaWRkZW4gaW4gdGhlIGRhdGEuICBUaGV5IGhhdmUgYmVlbiBwdWJsaXNoZWQgd2lkZWx5LCBhbmQgdGhlIFMtYm94IGNhbiBiZQorZWFzaWx5IHJlY3JlYXRlZCBmcm9tIHRoZSBvbmUtdGltZSBwYWQgdmFsdWVzIGFuZCB0aGUgQmVhbGUgQ2lwaGVyIGRhdGEgdGFrZW4KK2Zyb20gYSBzdGFuZGFyZCBzb3VyY2UuICBUbyBpbml0aWFsaXNlIHRoZSBTLWJveDoKKyAKKyAgZm9yIGkgPSAwIHRvIDI1NSBkbworICAgIHNCb3hbIGkgXSA9ICggYmVhbGVbIGkgXSBtb2QgMjU2ICkgXiBwYWRbIGkgXQorIAorVGhlIGNvbnRlbnRzIG9mIEJlYWxlIENpcGhlciBOby4xIGFuZCB0aGUgbmVjZXNzYXJ5IG9uZS10aW1lIHBhZCBhcmUgZ2l2ZW4gYXMKK2FuIGFwcGVuZGl4IGF0IHRoZSBlbmQgb2YgdGhpcyBkb2N1bWVudC4gIEZvciBlZmZpY2llbmN5LCBpbXBsZW1lbnRvcnMgbWF5IHdpc2gKK3RvIHNraXAgdGhlIEJlYWxlIENpcGhlciBleHBhbnNpb24gYW5kIHN0b3JlIHRoZSBzQm94IHRhYmxlIGRpcmVjdGx5LgorIAorRXhwYW5kaW5nIHRoZSBTZWNyZXQgS2V5IHRvIDEyOCBCeXRlcworIAorVGhlIHNlY3JldCBrZXkgaXMgZmlyc3QgZXhwYW5kZWQgdG8gZmlsbCAxMjggYnl0ZXMgKDY0IHdvcmRzKS4gIFRoZSBleHBhbnNpb24KK2NvbnNpc3RzIG9mIHRha2luZyB0aGUgc3VtIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCBieXRlcyBpbiB0aGUgdXNlciBrZXksIGxvb2tpbmcKK3VwIHRoZSBzdW0gKG1vZHVsbyAyNTYpIGluIHRoZSBTLWJveCwgYW5kIGFwcGVuZGluZyB0aGUgcmVzdWx0IHRvIHRoZSBrZXkuICBUaGUKK29wZXJhdGlvbiBpcyByZXBlYXRlZCB3aXRoIHRoZSBzZWNvbmQgYnl0ZSBhbmQgbmV3IGxhc3QgYnl0ZSBvZiB0aGUga2V5IHVudGlsCithbGwgMTI4IGJ5dGVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQuICBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBwc2V1ZG9jb2RlIHRyZWF0cwordGhlIFMgYXJyYXkgYXMgYW4gYXJyYXkgb2YgMTI4IGJ5dGVzIHJhdGhlciB0aGFuIDY0IHdvcmRzLgorIAorICBmb3IgaiA9IDAgdG8gbGVuZ3RoLTEgZG8KKyAgICBTWyBqIF0gPSBLWyBqIF0KKyAgZm9yIGogPSBsZW5ndGggdG8gMTI3IGRvCisgICAgc1sgaiBdID0gc0JveFsgKCBTWyBqLWxlbmd0aCBdICsgU1sgai0xIF0gKSBtb2QgMjU2IF07CisgCitBdCB0aGlzIHBvaW50IGl0IGlzIHBvc3NpYmxlIHRvIHBlcmZvcm0gYSB0cnVuY2F0aW9uIG9mIHRoZSBlZmZlY3RpdmUga2V5CitsZW5ndGggdG8gZWFzZSB0aGUgY3JlYXRpb24gb2YgZXNwaW9uYWdlLWVuYWJsZWQgc29mdHdhcmUgcHJvZHVjdHMuICBIb3dldmVyCitzaW5jZSB0aGUgYXV0aG9yIGNhbm5vdCBjb25jZWl2ZSB3aHkgYW55b25lIHdvdWxkIHdhbnQgdG8gZG8gdGhpcywgaXQgd2lsbCBub3QKK2JlIGNvbnNpZGVyZWQgZnVydGhlci4KKyAKK1RoZSBmaW5hbCBwaGFzZSBvZiB0aGUga2V5IGV4cGFuc2lvbiBpbnZvbHZlcyByZXBsYWNpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgUword2l0aCB0aGUgZW50cnkgc2VsZWN0ZWQgZnJvbSB0aGUgUy1ib3g6CisgCisgIFNbIDAgXSA9IHNCb3hbIFNbIDAgXSBdCisgCisgCitFbmNyeXB0aW9uCisgCitUaGUgY2lwaGVyIGhhcyAxNiBmdWxsIHJvdW5kcywgZWFjaCBkaXZpZGVkIGludG8gNCBzdWJyb3VuZHMuICBUd28gb2YgdGhlIGZ1bGwKK3JvdW5kcyBwZXJmb3JtIGFuIGFkZGl0aW9uYWwgdHJhbnNmb3JtYXRpb24gb24gdGhlIGRhdGEuICBOb3RlIHRoYXQgdGhlCitmb2xsb3dpbmcgcHNldWRvY29kZSB0cmVhdHMgdGhlIFMgYXJyYXkgYXMgYW4gYXJyYXkgb2YgNjQgd29yZHMgcmF0aGVyIHRoYW4gMTI4CitieXRlcy4KKyAKKyAgZm9yIGkgPSAwIHRvIDE1IGRvCisgICAgaiA9IGkgKiA0OworICAgIHdvcmQwID0gKCB3b3JkMCArICggd29yZDEgJiB+d29yZDMgKSArICggd29yZDIgJiB3b3JkMyApICsgU1sgaiswIF0gKSA8PDwgMQorICAgIHdvcmQxID0gKCB3b3JkMSArICggd29yZDIgJiB+d29yZDAgKSArICggd29yZDMgJiB3b3JkMCApICsgU1sgaisxIF0gKSA8PDwgMgorICAgIHdvcmQyID0gKCB3b3JkMiArICggd29yZDMgJiB+d29yZDEgKSArICggd29yZDAgJiB3b3JkMSApICsgU1sgaisyIF0gKSA8PDwgMworICAgIHdvcmQzID0gKCB3b3JkMyArICggd29yZDAgJiB+d29yZDIgKSArICggd29yZDEgJiB3b3JkMiApICsgU1sgaiszIF0gKSA8PDwgNQorIAorSW4gYWRkaXRpb24gdGhlIGZpZnRoIGFuZCBlbGV2ZW50aCByb3VuZHMgYWRkIHRoZSBjb250ZW50cyBvZiB0aGUgUy1ib3ggaW5kZXhlZAorYnkgb25lIG9mIHRoZSBkYXRhIHdvcmRzIHRvIGFub3RoZXIgb2YgdGhlIGRhdGEgd29yZHMgZm9sbG93aW5nIHRoZSBmb3VyCitzdWJyb3VuZHMgYXMgZm9sbG93czoKKyAKKyAgICB3b3JkMCA9IHdvcmQwICsgU1sgd29yZDMgJiA2MyBdOworICAgIHdvcmQxID0gd29yZDEgKyBTWyB3b3JkMCAmIDYzIF07CisgICAgd29yZDIgPSB3b3JkMiArIFNbIHdvcmQxICYgNjMgXTsKKyAgICB3b3JkMyA9IHdvcmQzICsgU1sgd29yZDIgJiA2MyBdOworIAorIAorRGVjcnlwdGlvbgorIAorVGhlIGRlY3J5cHRpb24gb3BlcmF0aW9uIGlzIHNpbXBseSB0aGUgaW52ZXJzZSBvZiB0aGUgZW5jcnlwdGlvbiBvcGVyYXRpb24uCitOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBwc2V1ZG9jb2RlIHRyZWF0cyB0aGUgUyBhcnJheSBhcyBhbiBhcnJheSBvZiA2NCB3b3JkcworcmF0aGVyIHRoYW4gMTI4IGJ5dGVzLgorIAorICBmb3IgaSA9IDE1IGRvd250byAwIGRvCisgICAgaiA9IGkgKiA0OworICAgIHdvcmQzID0gKCB3b3JkMyA+Pj4gNSApIC0gKCB3b3JkMCAmIH53b3JkMiApIC0gKCB3b3JkMSAmIHdvcmQyICkgLSBTWyBqKzMgXQorICAgIHdvcmQyID0gKCB3b3JkMiA+Pj4gMyApIC0gKCB3b3JkMyAmIH53b3JkMSApIC0gKCB3b3JkMCAmIHdvcmQxICkgLSBTWyBqKzIgXQorICAgIHdvcmQxID0gKCB3b3JkMSA+Pj4gMiApIC0gKCB3b3JkMiAmIH53b3JkMCApIC0gKCB3b3JkMyAmIHdvcmQwICkgLSBTWyBqKzEgXQorICAgIHdvcmQwID0gKCB3b3JkMCA+Pj4gMSApIC0gKCB3b3JkMSAmIH53b3JkMyApIC0gKCB3b3JkMiAmIHdvcmQzICkgLSBTWyBqKzAgXQorIAorSW4gYWRkaXRpb24gdGhlIGZpZnRoIGFuZCBlbGV2ZW50aCByb3VuZHMgc3VidHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBTLWJveAoraW5kZXhlZCBieSBvbmUgb2YgdGhlIGRhdGEgd29yZHMgZnJvbSBhbm90aGVyIG9uZSBvZiB0aGUgZGF0YSB3b3JkcyBmb2xsb3dpbmcKK3RoZSBmb3VyIHN1YnJvdW5kcyBhcyBmb2xsb3dzOgorIAorICAgIHdvcmQzID0gd29yZDMgLSBTWyB3b3JkMiAmIDYzIF0KKyAgICB3b3JkMiA9IHdvcmQyIC0gU1sgd29yZDEgJiA2MyBdCisgICAgd29yZDEgPSB3b3JkMSAtIFNbIHdvcmQwICYgNjMgXQorICAgIHdvcmQwID0gd29yZDAgLSBTWyB3b3JkMyAmIDYzIF0KKyAKKyAKK1Rlc3QgVmVjdG9ycworIAorVGhlIGZvbGxvd2luZyB0ZXN0IHZlY3RvcnMgbWF5IGJlIHVzZWQgdG8gdGVzdCB0aGUgY29ycmVjdG5lc3Mgb2YgYW4gUlJDLjIKK2ltcGxlbWVudGF0aW9uOgorIAorICBLZXk6ICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgUGxhaW46ICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgQ2lwaGVyOiAgIDB4MUMsIDB4MTksIDB4OEEsIDB4ODMsIDB4OEQsIDB4RjAsIDB4MjgsIDB4QjcKKyAKKyAgS2V5OiAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxCisgIFBsYWluOiAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCisgIENpcGhlcjogICAweDIxLCAweDgyLCAweDlDLCAweDc4LCAweEE5LCAweEY5LCAweEMwLCAweDc0CisgCisgIEtleTogICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorICBQbGFpbjogICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRgorICBDaXBoZXI6ICAgMHgxMywgMHhEQiwgMHgzNSwgMHgxNywgMHhEMywgMHgyMSwgMHg4NiwgMHg5RQorIAorICBLZXk6ICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgICAgICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MEMsIDB4MEQsIDB4MEUsIDB4MEYKKyAgUGxhaW46ICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKyAgQ2lwaGVyOiAgIDB4NTAsIDB4REMsIDB4MDEsIDB4NjIsIDB4QkQsIDB4NzUsIDB4N0YsIDB4MzEKKyAKKyAKK0FwcGVuZGl4OiBCZWFsZSBDaXBoZXIgTm8uMSwgIlRoZSBMb2NhbGl0eSBvZiB0aGUgVmF1bHQiLCBhbmQgT25lLXRpbWUgUGFkIGZvcgorICAgICAgICAgIENyZWF0aW5nIHRoZSBTLUJveAorIAorQmVhbGUgQ2lwaGVyIE5vLjEuCisgCisgIDcxLCAxOTQsICAzOCwxNzAxLCAgODksICA3NiwgIDExLCAgODMsMTYyOSwgIDQ4LCAgOTQsICA2MywgMTMyLCAgMTYsIDExMSwgIDk1LAorICA4NCwgMzQxLCA5NzUsICAxNCwgIDQwLCAgNjQsICAyNywgIDgxLCAxMzksIDIxMywgIDYzLCAgOTAsMTEyMCwgICA4LCAgMTUsICAgMywKKyAxMjYsMjAxOCwgIDQwLCAgNzQsIDc1OCwgNDg1LCA2MDQsIDIzMCwgNDM2LCA2NjQsIDU4MiwgMTUwLCAyNTEsIDI4NCwgMzA4LCAyMzEsCisgMTI0LCAyMTEsIDQ4NiwgMjI1LCA0MDEsIDM3MCwgIDExLCAxMDEsIDMwNSwgMTM5LCAxODksICAxNywgIDMzLCAgODgsIDIwOCwgMTkzLAorIDE0NSwgICAxLCAgOTQsICA3MywgNDE2LCA5MTgsIDI2MywgIDI4LCA1MDAsIDUzOCwgMzU2LCAxMTcsIDEzNiwgMjE5LCAgMjcsIDE3NiwKKyAxMzAsICAxMCwgNDYwLCAgMjUsIDQ4NSwgIDE4LCA0MzYsICA2NSwgIDg0LCAyMDAsIDI4MywgMTE4LCAzMjAsIDEzOCwgIDM2LCA0MTYsCisgMjgwLCAgMTUsICA3MSwgMjI0LCA5NjEsICA0NCwgIDE2LCA0MDEsICAzOSwgIDg4LCAgNjEsIDMwNCwgIDEyLCAgMjEsICAyNCwgMjgzLAorIDEzNCwgIDkyLCAgNjMsIDI0NiwgNDg2LCA2ODIsICAgNywgMjE5LCAxODQsIDM2MCwgNzgwLCAgMTgsICA2NCwgNDYzLCA0NzQsIDEzMSwKKyAxNjAsICA3OSwgIDczLCA0NDAsICA5NSwgIDE4LCAgNjQsIDU4MSwgIDM0LCAgNjksIDEyOCwgMzY3LCA0NjAsICAxNywgIDgxLCAgMTIsCisgMTAzLCA4MjAsICA2MiwgMTEwLCAgOTcsIDEwMywgODYyLCAgNzAsICA2MCwxMzE3LCA0NzEsIDU0MCwgMjA4LCAxMjEsIDg5MCwgMzQ2LAorICAzNiwgMTUwLCAgNTksIDU2OCwgNjE0LCAgMTMsIDEyMCwgIDYzLCAyMTksIDgxMiwyMTYwLDE3ODAsICA5OSwgIDM1LCAgMTgsICAyMSwKKyAxMzYsIDg3MiwgIDE1LCAgMjgsIDE3MCwgIDg4LCAgIDQsICAzMCwgIDQ0LCAxMTIsICAxOCwgMTQ3LCA0MzYsIDE5NSwgMzIwLCAgMzcsCisgMTIyLCAxMTMsICAgNiwgMTQwLCAgIDgsIDEyMCwgMzA1LCAgNDIsICA1OCwgNDYxLCAgNDQsIDEwNiwgMzAxLCAgMTMsIDQwOCwgNjgwLAorICA5MywgIDg2LCAxMTYsIDUzMCwgIDgyLCA1NjgsICAgOSwgMTAyLCAgMzgsIDQxNiwgIDg5LCAgNzEsIDIxNiwgNzI4LCA5NjUsIDgxOCwKKyAgIDIsICAzOCwgMTIxLCAxOTUsICAxNCwgMzI2LCAxNDgsIDIzNCwgIDE4LCAgNTUsIDEzMSwgMjM0LCAzNjEsIDgyNCwgICA1LCAgODEsCisgNjIzLCAgNDgsIDk2MSwgIDE5LCAgMjYsICAzMywgIDEwLDExMDEsIDM2NSwgIDkyLCAgODgsIDE4MSwgMjc1LCAzNDYsIDIwMSwgMjA2CisgCitPbmUtdGltZSBQYWQuCisgCisgMTU4LCAxODYsIDIyMywgIDk3LCAgNjQsIDE0NSwgMTkwLCAxOTAsIDExNywgMjE3LCAxNjMsICA3MCwgMjA2LCAxNzYsIDE4MywgMTk0LAorIDE0NiwgIDQzLCAyNDgsIDE0MSwgICAzLCAgNTQsICA3MiwgMjIzLCAyMzMsIDE1MywgIDkxLCAyMTAsICAzNiwgMTMxLCAyNDQsIDE2MSwKKyAxMDUsIDEyMCwgMTEzLCAxOTEsIDExMywgIDg2LCAgMTksIDI0NSwgMjEzLCAyMjEsICA0MywgIDI3LCAyNDIsIDE1NywgIDczLCAyMTMsCisgMTkzLCAgOTIsIDE2NiwgIDEwLCAgMjMsIDE5NywgMTEyLCAxMTAsIDE5MywgIDMwLCAxNTYsICA1MSwgMTI1LCAgNTEsIDE1OCwgIDY3LAorIDE5NywgMjE1LCAgNTksIDIxOCwgMTEwLCAyNDYsIDE4MSwgICAwLCAxMzUsICA3NiwgMTY0LCAgOTcsICA0NywgIDg3LCAyMzQsIDEwOCwKKyAxNDQsIDEyNywgICA2LCAgIDYsIDIyMiwgMTcyLCAgODAsIDE0NCwgIDIyLCAyNDUsIDIwNywgIDcwLCAyMjcsIDE4MiwgMTQ2LCAxMzQsCisgMTE5LCAxNzYsICA3MywgIDU4LCAxMzUsICA2OSwgIDIzLCAxOTgsICAgMCwgMTcwLCAgMzIsIDE3MSwgMTc2LCAxMjksICA5MSwgIDI0LAorIDEyNiwgIDc3LCAyNDgsICAgMCwgMTE4LCAgNjksICA1NywgIDYwLCAxOTAsIDE3MSwgMjE3LCAgNjEsIDEzNiwgMTY5LCAxOTYsICA4NCwKKyAxNjgsIDE2NywgMTYzLCAxMDIsIDIyMywgIDY0LCAxNzQsIDE3OCwgMTY2LCAyMzksIDI0MiwgMTk1LCAyNDksICA5MiwgIDU5LCAgMzgsCisgMjQxLCAgNDYsIDIzNiwgIDMxLCAgNTksIDExNCwgIDIzLCAgNTAsIDExOSwgMTg2LCAgIDcsICA2NiwgMjEyLCAgOTcsIDIyMiwgMTgyLAorIDIzMCwgMTE4LCAxMjIsICA4NiwgMTA1LCAgOTIsIDE3OSwgMjQzLCAyNTUsIDE4OSwgMjIzLCAxNjQsIDE5NCwgMjE1LCAgOTgsICA0NCwKKyAgMTcsICAyMCwgIDUzLCAxNTMsIDEzNywgMjI0LCAxNzYsIDEwMCwgMjA4LCAxMTQsICAzNiwgMjAwLCAxNDUsIDE1MCwgMjE1LCAgMjAsCisgIDg3LCAgNDQsIDI1MiwgIDIwLCAyMzUsIDI0MiwgMTYzLCAxMzIsICA2MywgIDE4LCAgIDUsIDEyMiwgIDc0LCAgOTcsICAzNCwgIDk3LAorIDE0MiwgIDg2LCAxNDYsIDIyMSwgMTc5LCAxNjYsIDE2MSwgIDc0LCAgNjksIDE4MiwgIDg4LCAxMjAsIDEyOCwgIDU4LCAgNzYsIDE1NSwKKyAgMTUsICAzMCwgIDc3LCAyMTYsIDE2NSwgMTE3LCAxMDcsICA5MCwgMTY5LCAxMjcsIDE0MywgMTgxLCAyMDgsIDEzNywgMjAwLCAxMjcsCisgMTcwLCAxOTUsICAyNiwgIDg0LCAyNTUsIDEzMiwgMTUwLCAgNTgsIDEwMywgMjUwLCAxMjAsIDIyMSwgMjM3LCAgMzcsICAgOCwgIDk5CisgCisgCitJbXBsZW1lbnRhdGlvbgorIAorQSBub24tVVMgYmFzZWQgcHJvZ3JhbW1lciB3aG8gaGFzIG5ldmVyIHNlZW4gYW55IGVuY3J5cHRpb24gY29kZSBiZWZvcmUgd2lsbAorc2hvcnRseSBiZSBpbXBsZW1lbnRpbmcgUlJDLjIgYmFzZWQgc29sZWx5IG9uIHRoaXMgc3BlY2lmaWNhdGlvbiBhbmQgbm90IG9uCitrbm93bGVkZ2Ugb2YgYW55IG90aGVyIGVuY3J5cHRpb24gYWxnb3JpdGhtcy4gIFN0YW5kIGJ5LgorCisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JjMi90YWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvdGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkYzE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvdGFiLmMKQEAgLTAsMCArMSw4NiBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3Vuc2lnbmVkIGNoYXIgZWJpdHNfdG9fbnVtWzI1Nl09eworCTB4YmQsMHg1NiwweGVhLDB4ZjIsMHhhMiwweGYxLDB4YWMsMHgyYSwKKwkweGIwLDB4OTMsMHhkMSwweDljLDB4MWIsMHgzMywweGZkLDB4ZDAsCisJMHgzMCwweDA0LDB4YjYsMHhkYywweDdkLDB4ZGYsMHgzMiwweDRiLAorCTB4ZjcsMHhjYiwweDQ1LDB4OWIsMHgzMSwweGJiLDB4MjEsMHg1YSwKKwkweDQxLDB4OWYsMHhlMSwweGQ5LDB4NGEsMHg0ZCwweDllLDB4ZGEsCisJMHhhMCwweDY4LDB4MmMsMHhjMywweDI3LDB4NWYsMHg4MCwweDM2LAorCTB4M2UsMHhlZSwweGZiLDB4OTUsMHgxYSwweGZlLDB4Y2UsMHhhOCwKKwkweDM0LDB4YTksMHgxMywweGYwLDB4YTYsMHgzZiwweGQ4LDB4MGMsCisJMHg3OCwweDI0LDB4YWYsMHgyMywweDUyLDB4YzEsMHg2NywweDE3LAorCTB4ZjUsMHg2NiwweDkwLDB4ZTcsMHhlOCwweDA3LDB4YjgsMHg2MCwKKwkweDQ4LDB4ZTYsMHgxZSwweDUzLDB4ZjMsMHg5MiwweGE0LDB4NzIsCisJMHg4YywweDA4LDB4MTUsMHg2ZSwweDg2LDB4MDAsMHg4NCwweGZhLAorCTB4ZjQsMHg3ZiwweDhhLDB4NDIsMHgxOSwweGY2LDB4ZGIsMHhjZCwKKwkweDE0LDB4OGQsMHg1MCwweDEyLDB4YmEsMHgzYywweDA2LDB4NGUsCisJMHhlYywweGIzLDB4MzUsMHgxMSwweGExLDB4ODgsMHg4ZSwweDJiLAorCTB4OTQsMHg5OSwweGI3LDB4NzEsMHg3NCwweGQzLDB4ZTQsMHhiZiwKKwkweDNhLDB4ZGUsMHg5NiwweDBlLDB4YmMsMHgwYSwweGVkLDB4NzcsCisJMHhmYywweDM3LDB4NmIsMHgwMywweDc5LDB4ODksMHg2MiwweGM2LAorCTB4ZDcsMHhjMCwweGQyLDB4N2MsMHg2YSwweDhiLDB4MjIsMHhhMywKKwkweDViLDB4MDUsMHg1ZCwweDAyLDB4NzUsMHhkNSwweDYxLDB4ZTMsCisJMHgxOCwweDhmLDB4NTUsMHg1MSwweGFkLDB4MWYsMHgwYiwweDVlLAorCTB4ODUsMHhlNSwweGMyLDB4NTcsMHg2MywweGNhLDB4M2QsMHg2YywKKwkweGI0LDB4YzUsMHhjYywweDcwLDB4YjIsMHg5MSwweDU5LDB4MGQsCisJMHg0NywweDIwLDB4YzgsMHg0ZiwweDU4LDB4ZTAsMHgwMSwweGUyLAorCTB4MTYsMHgzOCwweGM0LDB4NmYsMHgzYiwweDBmLDB4NjUsMHg0NiwKKwkweGJlLDB4N2UsMHgyZCwweDdiLDB4ODIsMHhmOSwweDQwLDB4YjUsCisJMHgxZCwweDczLDB4ZjgsMHhlYiwweDI2LDB4YzcsMHg4NywweDk3LAorCTB4MjUsMHg1NCwweGIxLDB4MjgsMHhhYSwweDk4LDB4OWQsMHhhNSwKKwkweDY0LDB4NmQsMHg3YSwweGQ0LDB4MTAsMHg4MSwweDQ0LDB4ZWYsCisJMHg0OSwweGQ2LDB4YWUsMHgyZSwweGRkLDB4NzYsMHg1YywweDJmLAorCTB4YTcsMHgxYywweGM5LDB4MDksMHg2OSwweDlhLDB4ODMsMHhjZiwKKwkweDI5LDB4MzksMHhiOSwweGU5LDB4NGMsMHhmZiwweDQzLDB4YWIsCisJfTsKKwordW5zaWduZWQgY2hhciBudW1fdG9fZWJpdHNbMjU2XT17CisJMHg1ZCwweGJlLDB4OWIsMHg4YiwweDExLDB4OTksMHg2ZSwweDRkLAorCTB4NTksMHhmMywweDg1LDB4YTYsMHgzZiwweGI3LDB4ODMsMHhjNSwKKwkweGU0LDB4NzMsMHg2YiwweDNhLDB4NjgsMHg1YSwweGMwLDB4NDcsCisJMHhhMCwweDY0LDB4MzQsMHgwYywweGYxLDB4ZDAsMHg1MiwweGE1LAorCTB4YjksMHgxZSwweDk2LDB4NDMsMHg0MSwweGQ4LDB4ZDQsMHgyYywKKwkweGRiLDB4ZjgsMHgwNywweDc3LDB4MmEsMHhjYSwweGViLDB4ZWYsCisJMHgxMCwweDFjLDB4MTYsMHgwZCwweDM4LDB4NzIsMHgyZiwweDg5LAorCTB4YzEsMHhmOSwweDgwLDB4YzQsMHg2ZCwweGFlLDB4MzAsMHgzZCwKKwkweGNlLDB4MjAsMHg2MywweGZlLDB4ZTYsMHgxYSwweGM3LDB4YjgsCisJMHg1MCwweGU4LDB4MjQsMHgxNywweGZjLDB4MjUsMHg2ZiwweGJiLAorCTB4NmEsMHhhMywweDQ0LDB4NTMsMHhkOSwweGEyLDB4MDEsMHhhYiwKKwkweGJjLDB4YjYsMHgxZiwweDk4LDB4ZWUsMHg5YSwweGE3LDB4MmQsCisJMHg0ZiwweDllLDB4OGUsMHhhYywweGUwLDB4YzYsMHg0OSwweDQ2LAorCTB4MjksMHhmNCwweDk0LDB4OGEsMHhhZiwweGUxLDB4NWIsMHhjMywKKwkweGIzLDB4N2IsMHg1NywweGQxLDB4N2MsMHg5YywweGVkLDB4ODcsCisJMHg0MCwweDhjLDB4ZTIsMHhjYiwweDkzLDB4MTQsMHhjOSwweDYxLAorCTB4MmUsMHhlNSwweGNjLDB4ZjYsMHg1ZSwweGE4LDB4NWMsMHhkNiwKKwkweDc1LDB4OGQsMHg2MiwweDk1LDB4NTgsMHg2OSwweDc2LDB4YTEsCisJMHg0YSwweGI1LDB4NTUsMHgwOSwweDc4LDB4MzMsMHg4MiwweGQ3LAorCTB4ZGQsMHg3OSwweGY1LDB4MWIsMHgwYiwweGRlLDB4MjYsMHgyMSwKKwkweDI4LDB4NzQsMHgwNCwweDk3LDB4NTYsMHhkZiwweDNjLDB4ZjAsCisJMHgzNywweDM5LDB4ZGMsMHhmZiwweDA2LDB4YTQsMHhlYSwweDQyLAorCTB4MDgsMHhkYSwweGI0LDB4NzEsMHhiMCwweGNmLDB4MTIsMHg3YSwKKwkweDRlLDB4ZmEsMHg2YywweDFkLDB4ODQsMHgwMCwweGM4LDB4N2YsCisJMHg5MSwweDQ1LDB4YWEsMHgyYiwweGMyLDB4YjEsMHg4ZiwweGQ1LAorCTB4YmEsMHhmMiwweGFkLDB4MTksMHhiMiwweDY3LDB4MzYsMHhmNywKKwkweDBmLDB4MGEsMHg5MiwweDdkLDB4ZTMsMHg5ZCwweGU5LDB4OTAsCisJMHgzZSwweDIzLDB4MjcsMHg2NiwweDEzLDB4ZWMsMHg4MSwweDE1LAorCTB4YmQsMHgyMiwweGJmLDB4OWYsMHg3ZSwweGE5LDB4NTEsMHg0YiwKKwkweDRjLDB4ZmIsMHgwMiwweGQzLDB4NzAsMHg4NiwweDMxLDB4ZTcsCisJMHgzYiwweDA1LDB4MDMsMHg1NCwweDYwLDB4NDgsMHg2NSwweDE4LAorCTB4ZDIsMHhjZCwweDVmLDB4MzIsMHg4OCwweDBlLDB4MzUsMHhmZCwKKwl9OworCQorbWFpbigpCisJeworCWludCBpLGo7CisKKwlmb3IgKGk9MDsgaTwyNTY7IGkrKykKKwkJeworCQlmb3IgKGo9MDsgajwyNTY7IGorKykKKwkJCWlmIChlYml0c190b19udW1bal0gPT0gaSkKKwkJCQl7CisJCQkJcHJpbnRmKCIweCUwMngsIixqKTsKKwkJCQlicmVhazsKKwkJCQl9CisJCX0KKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3ZlcnNpb24gYi9saWIvb3BlbnNzbC9jcnlwdG8vcmMyL3ZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4OWQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzIvdmVyc2lvbgpAQCAtMCwwICsxLDIyIEBACisxLjEgMjMvMDgvOTYgLSBlYXkKKwlDaGFuZ2VkIFJDMl9zZXRfa2V5KCkgc28gaXQgbm93IHRha2VzIGFub3RoZXIgYXJndW1lbnQuICBNYW55CisJdGhhbmtzIHRvIFBldGVyIEd1dG1hbm4gPHBndXQwMUBjcy5hdWNrbGFuZC5hYy5uej4gZm9yIHRoZQorCWNsYXJpZmljYXRpb24gYW5kIG9yaWdpb25hbCBzcGVjaWZpY2F0aW9uIG9mIFJDMi4gIEJTQUZFIHVzZXMKKwl0aGlzIGxhc3QgcGFyYW1ldGVyLCAnYml0cycuICBJdCB0aGUga2V5IGlzIDEyOCBiaXRzLCBCU0FGRQorCWFsc28gc2V0cyB0aGlzIHBhcmFtZXRlciB0byAxMjguICBUaGUgb2xkIGJlaGF2aW91ciBjYW4gYmUKKwlkdXBsaWNhdGVkIGJ5IHNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gMTAyNC4KKworMS4wIDA4LzA0Lzk2IC0gZWF5CisJRmlyc3QgdmVyc2lvbiBvZiBTU0xlYXkgd2l0aCByYzIuICBUaGlzIGhhcyBiZWVuIHdyaXR0ZW4gZnJvbSB0aGUgc3BlYworCXBvc3RlZCBzY2kuY3J5cHQuICBJdCBpcyBpbiB0aGlzIGRpcmVjdG9yeSB1bmRlciBycmMyLmRvYworCUkgaGF2ZSBubyB0ZXN0IHZhbHVlcyBmb3IgYW55IG1vZGUgb3RoZXIgdGhhbiBlY2IsIG15IHdyYXBwZXJzIGZvciB0aGUKKwlvdGhlciBtb2RlcyBzaG91bGQgYmUgb2sgc2luY2UgdGhleSBhcmUgYmFzaWNhbGx5IHRoZSBzYW1lIGFzCisJdGhlIG9uZXMgdGFrZW4gZnJvbSBpZGVhIGFuZCBkZXMgOi0pLiAgSSBoYXZlIGltcGxlbWVudGVkIHRoZW0gYXMKKwlsaXR0bGUtZW5kaWFuIG9wZXJhdG9ycy4KKwlXaGlsZSByYzIgaXMgaW5jbHVkZWQgYmVjYXVzZSBpdCBpcyB1c2VkIHdpdGggU1NMLCBJIGRvbid0IGtub3cgaG93CisJZmFyIEkgdHJ1c3QgaXQuICBJdCBpcyBhYm91dCB0aGUgc2FtZSBzcGVlZCBhcyBJREVBIGFuZCBERVMuCisJU28gaWYgeW91IGFyZSBwYXJhbm9pZCwgdXNlZCBUcmlwcGxlIERFUywgZWxzZSBJREVBLiAgSWYgUkMyCisJZG9lcyBnZXQgdXNlZCBtb3JlLCBwZXJoYXBzIG1vcmUgcGVvcGxlIHdpbGwgbG9vayBmb3Igd2Vha25lc3NlcyBpbgorCWl0LgorCQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtNTg2LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LTU4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGE0NGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LTU4Ni5wbApAQCAtMCwwICsxLDI3MCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFtSZV13cml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBBdCBzb21lIHBvaW50IGl0IGJlY2FtZSBhcHBhcmVudCB0aGF0IHRoZSBvcmlnaW5hbCBTU0xlYXkgUkM0CisjIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBzdWJvcHRpbWFsbHkgb24gbGF0ZXN0IElBLTMyCisjIG1pY3JvYXJjaGl0ZWN0dXJlcy4gQWZ0ZXIgcmUtdHVuaW5nIHBlcmZvcm1hbmNlIGhhcyBjaGFuZ2VkIGFzCisjIGZvbGxvd2luZzoKKyMKKyMgUGVudGl1bQktMTAlCisjIFBlbnRpdW0gSUlJCSsxMiUKKyMgQU1ECQkrNTAlKCopCisjIFA0CQkrMjUwJSgqKikKKyMKKyMgKCopCVRoaXMgbnVtYmVyIGlzIGFjdHVhbGx5IGEgdHJhZGUtb2ZmOi0pIEl0J3MgcG9zc2libGUgdG8KKyMJYWNoaWV2ZQkrNzIlLCBidXQgYXQgdGhlIGNvc3Qgb2YgLTQ4JSBvZmYgUElJSSBwZXJmb3JtYW5jZS4KKyMJSW4gb3RoZXIgd29yZHMgY29kZSBwZXJmb3JtaW5nIGZ1cnRoZXIgMTMlIGZhc3RlciBvbiBBTUQKKyMJd291bGQgcGVyZm9ybSBhbG1vc3QgMiB0aW1lcyBzbG93ZXIgb24gSW50ZWwgUElJSS4uLgorIwlGb3IgcmVmZXJlbmNlISBUaGlzIGNvZGUgZGVsaXZlcnMgfjgwJSBvZiByYzQtYW1kNjQucGwKKyMJcGVyZm9ybWFuY2Ugb24gdGhlIHNhbWUgT3B0ZXJvbiBtYWNoaW5lLgorIyAoKiopCVRoaXMgbnVtYmVyIHJlcXVpcmVzIGNvbXByZXNzZWQga2V5IHNjaGVkdWxlIHNldCB1cCBieQorIwlSQzRfc2V0X2tleSBbc2VlIGNvbW1lbnRhcnkgYmVsb3cgZm9yIGZ1cnRoZXIgZGV0YWlsc10uCisjCisjCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwicmM0LTU4Ni5wbCIpOworCiskeHg9ImVheCI7CiskeXk9ImVieCI7CiskdHg9ImVjeCI7CiskdHk9ImVkeCI7CiskaW5wPSJlc2kiOworJG91dD0iZWJwIjsKKyRkYXQ9ImVkaSI7CisKK3N1YiBSQzRfbG9vcCB7CisgIG15ICRpPXNoaWZ0OworICBteSAkZnVuYyA9ICgkaT09MCk/Km1vdjoqb3I7CisKKwkmYWRkCSgmTEIoJHl5KSwmTEIoJHR4KSk7CisJJm1vdgkoJHR5LCZEV1AoMCwkZGF0LCR5eSw0KSk7CisJJm1vdgkoJkRXUCgwLCRkYXQsJHl5LDQpLCR0eCk7CisJJm1vdgkoJkRXUCgwLCRkYXQsJHh4LDQpLCR0eSk7CisJJmFkZAkoJHR5LCR0eCk7CisJJmluYwkoJkxCKCR4eCkpOworCSZhbmQJKCR0eSwweGZmKTsKKwkmcm9yCSgkb3V0LDgpCWlmICgkaSE9MCk7CisJaWYgKCRpPDMpIHsKKwkgICZtb3YJKCR0eCwmRFdQKDAsJGRhdCwkeHgsNCkpOworCX0gZWxzZSB7CisJICAmbW92CSgkdHgsJndwYXJhbSgzKSk7CSMgcmVsb2FkIFtyZS1iaWFzZWRdIG91dAorCX0KKwkmJGZ1bmMJKCRvdXQsJkRXUCgwLCRkYXQsJHR5LDQpKTsKK30KKworIyB2b2lkIFJDNChSQzRfS0VZICprZXksc2l6ZV90IGxlbixjb25zdCB1bnNpZ25lZCBjaGFyICppbnAsdW5zaWduZWQgY2hhciAqb3V0KTsKKyZmdW5jdGlvbl9iZWdpbigiUkM0Iik7CisJJm1vdgkoJGRhdCwmd3BhcmFtKDApKTsJIyBsb2FkIGtleSBzY2hlZHVsZSBwb2ludGVyCisJJm1vdgkoJHR5LCAmd3BhcmFtKDEpKTsJIyBsb2FkIGxlbgorCSZtb3YJKCRpbnAsJndwYXJhbSgyKSk7CSMgbG9hZCBpbnAKKwkmbW92CSgkb3V0LCZ3cGFyYW0oMykpOwkjIGxvYWQgb3V0CisKKwkmeG9yCSgkeHgsJHh4KTsJCSMgYXZvaWQgcGFydGlhbCByZWdpc3RlciBzdGFsbHMKKwkmeG9yCSgkeXksJHl5KTsKKworCSZjbXAJKCR0eSwwKTsJCSMgc2FmZXR5IG5ldAorCSZqZQkoJmxhYmVsKCJhYm9ydCIpKTsKKworCSZtb3YJKCZMQigkeHgpLCZCUCgwLCRkYXQpKTsJIyBsb2FkIGtleS0+eAorCSZtb3YJKCZMQigkeXkpLCZCUCg0LCRkYXQpKTsJIyBsb2FkIGtleS0+eQorCSZhZGQJKCRkYXQsOCk7CisKKwkmbGVhCSgkdHgsJkRXUCgwLCRpbnAsJHR5KSk7CisJJnN1YgkoJG91dCwkaW5wKTsJCSMgcmUtYmlhcyBvdXQKKwkmbW92CSgmd3BhcmFtKDEpLCR0eCk7CSMgc2F2ZSBpbnB1dCtsZW4KKworCSZpbmMJKCZMQigkeHgpKTsKKworCSMgZGV0ZWN0IGNvbXByZXNzZWQga2V5IHNjaGVkdWxlLi4uCisJJmNtcAkoJkRXUCgyNTYsJGRhdCksLTEpOworCSZqZQkoJmxhYmVsKCJSQzRfQ0hBUiIpKTsKKworCSZtb3YJKCR0eCwmRFdQKDAsJGRhdCwkeHgsNCkpOworCisJJmFuZAkoJHR5LC00KTsJCSMgaG93IG1hbnkgNC1ieXRlIGNodW5rcz8KKwkmanoJKCZsYWJlbCgibG9vcDEiKSk7CisKKwkmbGVhCSgkdHksJkRXUCgtNCwkaW5wLCR0eSkpOworCSZtb3YJKCZ3cGFyYW0oMiksJHR5KTsJIyBzYXZlIGlucHV0KyhsZW4vNCkqNC00CisJJm1vdgkoJndwYXJhbSgzKSwkb3V0KTsJIyAkb3V0IGFzIGFjY3VtdWxhdG9yIGluIHRoaXMgbG9vcAorCisJJnNldF9sYWJlbCgibG9vcDQiLDE2KTsKKwkJZm9yICgkaT0wOyRpPDQ7JGkrKykgeyBSQzRfbG9vcCgkaSk7IH0KKwkJJnJvcgkoJG91dCw4KTsKKwkJJnhvcgkoJG91dCwmRFdQKDAsJGlucCkpOworCQkmY21wCSgkaW5wLCZ3cGFyYW0oMikpOwkjIGNvbXBhcmUgdG8gaW5wdXQrKGxlbi80KSo0LTQKKwkJJm1vdgkoJkRXUCgwLCR0eCwkaW5wKSwkb3V0KTsjICR0eCBob2xkcyByZS1iaWFzZWQgb3V0IGhlcmUKKwkJJmxlYQkoJGlucCwmRFdQKDQsJGlucCkpOworCQkmbW92CSgkdHgsJkRXUCgwLCRkYXQsJHh4LDQpKTsKKwkmamIJKCZsYWJlbCgibG9vcDQiKSk7CisKKwkmY21wCSgkaW5wLCZ3cGFyYW0oMSkpOwkjIGNvbXBhcmUgdG8gaW5wdXQrbGVuCisJJmplCSgmbGFiZWwoImRvbmUiKSk7CisJJm1vdgkoJG91dCwmd3BhcmFtKDMpKTsJIyByZXN0b3JlICRvdXQKKworCSZzZXRfbGFiZWwoImxvb3AxIiwxNik7CisJCSZhZGQJKCZMQigkeXkpLCZMQigkdHgpKTsKKwkJJm1vdgkoJHR5LCZEV1AoMCwkZGF0LCR5eSw0KSk7CisJCSZtb3YJKCZEV1AoMCwkZGF0LCR5eSw0KSwkdHgpOworCQkmbW92CSgmRFdQKDAsJGRhdCwkeHgsNCksJHR5KTsKKwkJJmFkZAkoJHR5LCR0eCk7CisJCSZpbmMJKCZMQigkeHgpKTsKKwkJJmFuZAkoJHR5LDB4ZmYpOworCQkmbW92CSgkdHksJkRXUCgwLCRkYXQsJHR5LDQpKTsKKwkJJnhvcgkoJkxCKCR0eSksJkJQKDAsJGlucCkpOworCQkmbGVhCSgkaW5wLCZEV1AoMSwkaW5wKSk7CisJCSZtb3YJKCR0eCwmRFdQKDAsJGRhdCwkeHgsNCkpOworCQkmY21wCSgkaW5wLCZ3cGFyYW0oMSkpOwkjIGNvbXBhcmUgdG8gaW5wdXQrbGVuCisJCSZtb3YJKCZCUCgtMSwkb3V0LCRpbnApLCZMQigkdHkpKTsKKwkmamIJKCZsYWJlbCgibG9vcDEiKSk7CisKKwkmam1wCSgmbGFiZWwoImRvbmUiKSk7CisKKyMgdGhpcyBpcyBlc3NlbnRpYWxseSBJbnRlbCBQNCBzcGVjaWZpYyBjb2RlcGF0aC4uLgorJnNldF9sYWJlbCgiUkM0X0NIQVIiLDE2KTsKKwkmbW92egkoJHR4LCZCUCgwLCRkYXQsJHh4KSk7CisJIyBzdHJhbmdlbHkgZW5vdWdoIHVucm9sbGVkIGxvb3AgcGVyZm9ybXMgb3ZlciAyMCUgc2xvd2VyLi4uCisJJnNldF9sYWJlbCgiY2xvb3AxIik7CisJCSZhZGQJKCZMQigkeXkpLCZMQigkdHgpKTsKKwkJJm1vdnoJKCR0eSwmQlAoMCwkZGF0LCR5eSkpOworCQkmbW92CSgmQlAoMCwkZGF0LCR5eSksJkxCKCR0eCkpOworCQkmbW92CSgmQlAoMCwkZGF0LCR4eCksJkxCKCR0eSkpOworCQkmYWRkCSgmTEIoJHR5KSwmTEIoJHR4KSk7CisJCSZtb3Z6CSgkdHksJkJQKDAsJGRhdCwkdHkpKTsKKwkJJmFkZAkoJkxCKCR4eCksMSk7CisJCSZ4b3IJKCZMQigkdHkpLCZCUCgwLCRpbnApKTsKKwkJJmxlYQkoJGlucCwmRFdQKDEsJGlucCkpOworCQkmbW92egkoJHR4LCZCUCgwLCRkYXQsJHh4KSk7CisJCSZjbXAJKCRpbnAsJndwYXJhbSgxKSk7CisJCSZtb3YJKCZCUCgtMSwkb3V0LCRpbnApLCZMQigkdHkpKTsKKwkmamIJKCZsYWJlbCgiY2xvb3AxIikpOworCismc2V0X2xhYmVsKCJkb25lIik7CisJJmRlYwkoJkxCKCR4eCkpOworCSZtb3YJKCZCUCgtNCwkZGF0KSwmTEIoJHl5KSk7CSMgc2F2ZSBrZXktPnkKKwkmbW92CSgmQlAoLTgsJGRhdCksJkxCKCR4eCkpOwkjIHNhdmUga2V5LT54Cismc2V0X2xhYmVsKCJhYm9ydCIpOworJmZ1bmN0aW9uX2VuZCgiUkM0Iik7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiskaW5wPSJlc2kiOworJG91dD0iZWRpIjsKKyRpZGk9ImVicCI7CiskaWRvPSJlY3giOworJGlkeD0iZWR4IjsKKworJmV4dGVybmFsX2xhYmVsKCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCisjIHZvaWQgUkM0X3NldF9rZXkoUkM0X0tFWSAqa2V5LGludCBsZW4sY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CismZnVuY3Rpb25fYmVnaW4oIlJDNF9zZXRfa2V5Iik7CisJJm1vdgkoJG91dCwmd3BhcmFtKDApKTsJCSMgbG9hZCBrZXkKKwkmbW92CSgkaWRpLCZ3cGFyYW0oMSkpOwkJIyBsb2FkIGxlbgorCSZtb3YJKCRpbnAsJndwYXJhbSgyKSk7CQkjIGxvYWQgZGF0YQorCSZwaWNtZXVwKCRpZHgsIk9QRU5TU0xfaWEzMmNhcF9QIik7CisKKwkmbGVhCSgkb3V0LCZEV1AoMio0LCRvdXQpKTsJCSMgJmtleS0+ZGF0YQorCSZsZWEJKCRpbnAsJkRXUCgwLCRpbnAsJGlkaSkpOwkjICRpbnAgdG8gcG9pbnQgYXQgdGhlIGVuZAorCSZuZWcJKCRpZGkpOworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmbW92CSgmRFdQKC00LCRvdXQpLCRpZGkpOwkJIyBib3Jyb3cga2V5LT55CisKKwkmYnQJKCZEV1AoMCwkaWR4KSwyMCk7CQkjIGNoZWNrIGZvciBiaXQjMjAKKwkmamMJKCZsYWJlbCgiYzFzdGxvb3AiKSk7CisKKyZzZXRfbGFiZWwoIncxc3Rsb29wIiwxNik7CisJJm1vdgkoJkRXUCgwLCRvdXQsImVheCIsNCksImVheCIpOwkjIGtleS0+ZGF0YVtpXT1pOworCSZhZGQJKCZMQigiZWF4IiksMSk7CQkJIyBpKys7CisJJmpuYwkoJmxhYmVsKCJ3MXN0bG9vcCIpKTsKKworCSZ4b3IJKCRpZG8sJGlkbyk7CisJJnhvcgkoJGlkeCwkaWR4KTsKKworJnNldF9sYWJlbCgidzJuZGxvb3AiLDE2KTsKKwkmbW92CSgiZWF4IiwmRFdQKDAsJG91dCwkaWRvLDQpKTsKKwkmYWRkCSgmTEIoJGlkeCksJkJQKDAsJGlucCwkaWRpKSk7CisJJmFkZAkoJkxCKCRpZHgpLCZMQigiZWF4IikpOworCSZhZGQJKCRpZGksMSk7CisJJm1vdgkoImVieCIsJkRXUCgwLCRvdXQsJGlkeCw0KSk7CisJJmpuegkoJmxhYmVsKCJ3bm93cmFwIikpOworCSAgJm1vdgkoJGlkaSwmRFdQKC00LCRvdXQpKTsKKwkmc2V0X2xhYmVsKCJ3bm93cmFwIik7CisJJm1vdgkoJkRXUCgwLCRvdXQsJGlkeCw0KSwiZWF4Iik7CisJJm1vdgkoJkRXUCgwLCRvdXQsJGlkbyw0KSwiZWJ4Iik7CisJJmFkZAkoJkxCKCRpZG8pLDEpOworCSZqbmMJKCZsYWJlbCgidzJuZGxvb3AiKSk7Cismam1wCSgmbGFiZWwoImV4aXQiKSk7CisKKyMgVW5saWtlIGFsbCBvdGhlciB4ODYgW2FuZCB4ODZfNjRdIGltcGxlbWVudGF0aW9ucywgSW50ZWwgUDQgY29yZQorIyBbaW5jbHVkaW5nIEVNNjRUXSB3YXMgZm91bmQgdG8gcGVyZm9ybSBwb29ybHkgd2l0aCBhYm92ZSAiMzItYml0IiBrZXkKKyMgc2NoZWR1bGUsIGEuay5hLiBSQzRfSU5ULiBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmb3IgSUEtMzIgaGFuZC1jb2RlZAorIyBhc3NlbWJsZXIgdHVybmVkIG91dCB0byBiZSAzLjV4IGlmIHJlLWNvZGVkIGZvciBjb21wcmVzc2VkIDgtYml0IG9uZSwKKyMgYS5rLmEuIFJDNF9DSEFSISBJdCdzIGhvd2V2ZXIgaW5hcHByb3ByaWF0ZSB0byBqdXN0IHN3aXRjaCB0byA4LWJpdAorIyBzY2hlZHVsZSBmb3IgeDg2W182NF0sIGJlY2F1c2Ugbm9uLVA0IGltcGxlbWVudGF0aW9ucyBzdWZmZXIgZnJvbQorIyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBsb3NzZXMgdGhlbiwgZS5nLiBQSUlJIGV4aGliaXRzID4yeAorIyBkZXRlcmlvcmF0aW9uLCBhbmQgc28gZG9lcyBPcHRlcm9uLiBJbiBvcmRlciB0byBhc3N1cmUgb3B0aW1hbAorIyBhbGwtcm91bmQgcGVyZm9ybWFuY2UsIHdlIGRldGVjdCBQNCBhdCBydW4tdGltZSBhbmQgc2V0IHVwIGNvbXByZXNzZWQKKyMga2V5IHNjaGVkdWxlLCB3aGljaCBpcyByZWNvZ25pemVkIGJ5IFJDNCBwcm9jZWR1cmUuCisKKyZzZXRfbGFiZWwoImMxc3Rsb29wIiwxNik7CisJJm1vdgkoJkJQKDAsJG91dCwiZWF4IiksJkxCKCJlYXgiKSk7CSMga2V5LT5kYXRhW2ldPWk7CisJJmFkZAkoJkxCKCJlYXgiKSwxKTsJCQkjIGkrKzsKKwkmam5jCSgmbGFiZWwoImMxc3Rsb29wIikpOworCisJJnhvcgkoJGlkbywkaWRvKTsKKwkmeG9yCSgkaWR4LCRpZHgpOworCSZ4b3IJKCJlYngiLCJlYngiKTsKKworJnNldF9sYWJlbCgiYzJuZGxvb3AiLDE2KTsKKwkmbW92CSgmTEIoImVheCIpLCZCUCgwLCRvdXQsJGlkbykpOworCSZhZGQJKCZMQigkaWR4KSwmQlAoMCwkaW5wLCRpZGkpKTsKKwkmYWRkCSgmTEIoJGlkeCksJkxCKCJlYXgiKSk7CisJJmFkZAkoJGlkaSwxKTsKKwkmbW92CSgmTEIoImVieCIpLCZCUCgwLCRvdXQsJGlkeCkpOworCSZqbnoJKCZsYWJlbCgiY25vd3JhcCIpKTsKKwkgICZtb3YJKCRpZGksJkRXUCgtNCwkb3V0KSk7CisJJnNldF9sYWJlbCgiY25vd3JhcCIpOworCSZtb3YJKCZCUCgwLCRvdXQsJGlkeCksJkxCKCJlYXgiKSk7CisJJm1vdgkoJkJQKDAsJG91dCwkaWRvKSwmTEIoImVieCIpKTsKKwkmYWRkCSgmTEIoJGlkbyksMSk7CisJJmpuYwkoJmxhYmVsKCJjMm5kbG9vcCIpKTsKKworCSZtb3YJKCZEV1AoMjU2LCRvdXQpLC0xKTsJCSMgbWFyayBzY2hlZHVsZSBhcyBjb21wcmVzc2VkCisKKyZzZXRfbGFiZWwoImV4aXQiKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJm1vdgkoJkRXUCgtOCwkb3V0KSwiZWF4Iik7CQkjIGtleS0+eD0wOworCSZtb3YJKCZEV1AoLTQsJG91dCksImVheCIpOwkJIyBrZXktPnk9MDsKKyZmdW5jdGlvbl9lbmQoIlJDNF9zZXRfa2V5Iik7CisKKyMgY29uc3QgY2hhciAqUkM0X29wdGlvbnModm9pZCk7CismZnVuY3Rpb25fYmVnaW5fQigiUkM0X29wdGlvbnMiKTsKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7Cismc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmYmxpbmRwb3AoImVheCIpOworCSZsZWEJKCJlYXgiLCZEV1AoJmxhYmVsKCJvcHRzIikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksImVheCIpKTsKKwkmcGljbWV1cCgiZWR4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkmYnQJKCZEV1AoMCwiZWR4IiksMjApOworCSZqbmMJKCZsYWJlbCgic2tpcCIpKTsKKwkgICZhZGQJKCJlYXgiLDEyKTsKKwkmc2V0X2xhYmVsKCJza2lwIik7CisJJnJldAkoKTsKKyZzZXRfbGFiZWwoIm9wdHMiLDY0KTsKKyZhc2NpegkoInJjNCg0eCxpbnQpIik7CismYXNjaXoJKCJyYzQoMXgsY2hhcikiKTsKKyZhc2NpegkoIlJDNCBmb3IgeDg2LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+Iik7CismYWxpZ24JKDY0KTsKKyZmdW5jdGlvbl9lbmRfQigiUkM0X29wdGlvbnMiKTsKKworJmFzbV9maW5pc2goKTsKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LWlhNjQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtaWE2NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWNkNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LWlhNjQucGwKQEAgLTAsMCArMSw3NTUgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBEYXZpZCBNb3NiZXJnZXIgPERhdmlkLk1vc2JlcmdlckBhY20ub3JnPiBiYXNlZCBvbiB0aGUKKyMgSXRhbml1bSBvcHRpbWl6ZWQgQ3J5cHRvIGNvZGUgd2hpY2ggd2FzIHJlbGVhc2VkIGJ5IEhQIExhYnMgYXQKKyMgaHR0cDovL3d3dy5ocGwuaHAuY29tL3Jlc2VhcmNoL2xpbnV4L2NyeXB0by8uCisjCisjIENvcHlyaWdodCAoYykgMjAwNSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisjIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyMgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisjIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAgKi8KKworCisKKyMgVGhpcyBpcyBhIGxpdHRsZSBoZWxwZXIgcHJvZ3JhbSB3aGljaCBnZW5lcmF0ZXMgYSBzb2Z0d2FyZS1waXBlbGluZWQKKyMgZm9yIFJDNCBlbmNyeXB0aW9uLiAgVGhlIGJhc2ljIGFsZ29yaXRobSBsb29rcyBsaWtlIHRoaXM6CisjCisjICAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IGxlbjsgKytjb3VudGVyKQorIyAgICAgeworIyAgICAgICBpbiA9IGlucFtjb3VudGVyXTsKKyMgICAgICAgU0kgPSBTW0ldOworIyAgICAgICBKID0gKFNJICsgSikgJiAweGZmOworIyAgICAgICBTSiA9IFNbSl07CisjICAgICAgIFQgPSAoU0kgKyBTSikgJiAweGZmOworIyAgICAgICBTW0ldID0gU0osIFNbSl0gPSBTSTsKKyMgICAgICAgU1QgPSBTW1RdOworIyAgICAgICBvdXRwW2NvdW50ZXJdID0gaW4gXiBTVDsKKyMgICAgICAgSSA9IChJICsgMSkgJiAweGZmOworIyAgICAgfQorIworIyBQaXBlbGluaW5nIHRoaXMgbG9vcCBpc24ndCBlYXN5LCBiZWNhdXNlIHRoZSBzdG9yZXMgdG8gdGhlIFNbXSBhcnJheQorIyBuZWVkIHRvIGJlIG9ic2VydmVkIGluIHRoZSByaWdodCBvcmRlci4gIFRoZSBsb29wIGdlbmVyYXRlZCBieSB0aGUKKyMgY29kZSBiZWxvdyBoYXMgdGhlIGZvbGxvd2luZyBwaXBlbGluZSBkaWFncmFtOgorIworIyAgICAgIGN5Y2xlCisjICAgICB8IDAgfCAxIHwgMiB8IDMgfCA0IHwgNSB8IDYgfCA3IHwgOCB8IDkgfDEwIHwxMSB8MTIgfDEzIHwxNCB8MTUgfDE2IHwxNyB8CisjIGl0ZXIKKyMgICAxOiB4eHggTERJIHh4eCB4eHggeHh4IExESiB4eHggU1dQIHh4eCBMRFQgeHh4IHh4eAorIyAgIDI6ICAgICAgICAgICAgIHh4eCBMREkgeHh4IHh4eCB4eHggTERKIHh4eCBTV1AgeHh4IExEVCB4eHggeHh4CisjICAgMzogICAgICAgICAgICAgICAgICAgICAgICAgeHh4IExESSB4eHggeHh4IHh4eCBMREogeHh4IFNXUCB4eHggTERUIHh4eCB4eHgKKyMKKyMgICB3aGVyZToKKyMgCUxESSA9IGxvYWQgb2YgU1tJXQorIyAJTERKID0gbG9hZCBvZiBTW0pdCisjIAlTV1AgPSBzd2FwIG9mIFNbSV0gYW5kIFNbSl0KKyMgCUxEVCA9IGxvYWQgb2YgU1tUXQorIworIyBOb3RlIHRoYXQgaW4gdGhlIGFib3ZlIGRpYWdyYW0sIHRoZSBtYWpvciB0cm91YmxlLXNwb3QgaXMgdGhhdCBMREkKKyMgb2YgdGhlIDJuZCBpdGVyYXRpb24gaXMgcGVyZm9ybWVkIEJFRk9SRSB0aGUgU1dQIG9mIHRoZSBmaXJzdAorIyBpdGVyYXRpb24uICBGb3J0dW5hdGVseSwgdGhpcyBpcyBlYXN5IHRvIGRldGVjdCAoSSBvZiB0aGUgMXN0CisjIGl0ZXJhdGlvbiB3aWxsIGJlIGVxdWFsIHRvIEogb2YgdGhlIDJuZCBpdGVyYXRpb24pIGFuZCB3aGVuIHRoaXMKKyMgaGFwcGVucywgd2Ugc2ltcGx5IGZvcndhcmQgdGhlIHByb3BlciB2YWx1ZSBmcm9tIHRoZSAxc3QgaXRlcmF0aW9uCisjIHRvIHRoZSAybmQgb25lLiAgVGhlIHByb3BlciB2YWx1ZSBpbiB0aGlzIGNhc2UgaXMgc2ltcGx5IHRoZSB2YWx1ZQorIyBvZiBTW0ldIGZyb20gdGhlIGZpcnN0IGl0ZXJhdGlvbiAodGhhbmtzIHRvIHRoZSBmYWN0IHRoYXQgU1dQCisjIHNpbXBseSBzd2FwcyB0aGUgY29udGVudHMgb2YgU1tJXSBhbmQgU1tKXSkuCisjCisjIEFub3RoZXIgcG90ZW50aWFsIHRyb3VibGUtc3BvdCBpcyBpbiBjeWNsZSA3LCB3aGVyZSBTV1Agb2YgdGhlIDFzdAorIyBpdGVyYXRpb24gaXNzdWVzIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIExESSBvZiB0aGUgM3JkIGl0ZXJhdGlvbi4KKyMgSG93ZXZlciwgdGhhbmtzIHRvIElBLTY0IGV4ZWN1dGlvbiBzZW1hbnRpY3MsIHRoaXMgY2FuIGJlIHRha2VuCisjIGNhcmUgb2Ygc2ltcGx5IGJ5IHBsYWNpbmcgTERJIGxhdGVyIGluIHRoZSBpbnN0cnVjdGlvbi1ncm91cCB0aGFuCisjIFNXUC4gIElBLTY0IENQVXMgd2lsbCBhdXRvbWF0aWNhbGx5IGZvcndhcmQgdGhlIHZhbHVlIGlmIHRoZXkKKyMgZGV0ZWN0IHRoYXQgdGhlIFNXUCBhbmQgTERJIGFyZSBhY2Nlc3NpbmcgdGhlIHNhbWUgbWVtb3J5LWxvY2F0aW9uLgorCisjIFRoZSBjb3JlLWxvb3AgdGhhdCBjYW4gYmUgcGlwZWxpbmVkIHRoZW4gbG9va3MgbGlrZSB0aGlzIChhbm5vdGF0ZWQKKyMgd2l0aCBNY0tpbmxleS9NYWRpc29uIGlzc3VlIHBvcnQgJiBsYXRlbmN5IG51bWJlcnMsIGFzc3VtaW5nIEwxCisjIGNhY2hlIGhpdHMgZm9yIHRoZSBtb3N0IHBhcnQpOgorCisjIG9wZXJhdGlvbjoJICAgIGluc3RydWN0aW9uOgkJICAgIGlzc3VlLXBvcnRzOiAgbGF0ZW5jeQorIyAtLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLSAtLS0tLS0tCisKKyMgRGF0YSA9ICppbnArKyAgICAgICBsZDEgZGF0YSA9IFtpbnBdLCAxICAgICAgICAgICAgIE0wLU0xICAgICAgICAgMSBjeWMgICAgIGMwCisjICAgICAgICAgICAgICAgICAgICAgc2hsYWRkIElwdHIgPSBJLCBLZXlUYWJsZSwgMyAgICBNMC1NMywgSTAsIEkxIDEgY3ljCisjIEkgPSAoSSArIDEpICYgMHhmZiAgcGFkZDEgbmV4dEkgPSBJLCBvbmUgICAgICAgICAgICBNMC1NMywgSTAsIEkxIDMgY3ljCisjICAgICAgICAgICAgICAgICAgICAgOzsKKyMgU0kgPSBTW0ldICAgICAgICAgICBsZDggU0kgPSBbSXB0cl0gICAgICAgICAgICAgICAgIE0wLU0xICAgICAgICAgMSBjeWMgICAgIGMxICogYWZ0ZXIgU1dBUCEKKyMgICAgICAgICAgICAgICAgICAgICA7OworIyAgICAgICAgICAgICAgICAgICAgIGNtcC5lcS51bmMgcEJ5cGFzcyA9IEksIEogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhZnRlciBKIGlzIHZhbGlkIQorIyBKID0gU0kgKyBKICAgICAgICAgIGFkZCBKID0gSiwgU0kgICAgICAgICAgICAgICAgICAgTTAtTTMsIEkwLCBJMSAxIGN5YyAgICAgYzIKKyMgICAgICAgICAgICAgICAgICAgICAocEJ5cGFzcykgYnIuY29uZC5zcG50IEJ5cGFzcworIyAgICAgICAgICAgICAgICAgICAgIDs7CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBKID0gSiAmIDB4ZmYgICAgICAgIHp4dDEgSiA9IEogICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCAxIGN5YyAgICAgICAgICAgYzMKKyMgICAgICAgICAgICAgICAgICAgICA7OworIyAgICAgICAgICAgICAgICAgICAgIHNobGFkZCBKcHRyID0gSiwgS2V5VGFibGUsIDMgICAgTTAtTTMsIEkwLCBJMSAxIGN5YyAgICAgYzQKKyMgICAgICAgICAgICAgICAgICAgICA7OworIyBTSiA9IFNbSl0gICAgICAgICAgIGxkOCBTSiA9IFtKcHRyXSAgICAgICAgICAgICAgICAgTTAtTTEgICAgICAgICAxIGN5YyAgICAgYzUKKyMgICAgICAgICAgICAgICAgICAgICA7OworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVCA9IChTSSArIFNKKSAgICAgICBhZGQgVCA9IFNJLCBTSiAgICAgICAgICAgICAgICAgIE0wLU0zLCBJMCwgSTEgMSBjeWMgICAgIGM2CisjICAgICAgICAgICAgICAgICAgICAgOzsKKyMgVCA9IFQgJiAweGZmICAgICAgICB6eHQxIFQgPSBUICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSAgICAgICAgMSBjeWMKKyMgU1tJXSA9IFNKICAgICAgICAgICBzdDggW0lwdHJdID0gU0ogICAgICAgICAgICAgICAgIE0yLU0zICAgICAgICAgICAgICAgICAgIGM3CisjIFNbSl0gPSBTSSAgICAgICAgICAgc3Q4IFtKcHRyXSA9IFNJICAgICAgICAgICAgICAgICBNMi1NMworIyAgICAgICAgICAgICAgICAgICAgIDs7CisjICAgICAgICAgICAgICAgICAgICAgc2hsYWRkIFRwdHIgPSBULCBLZXlUYWJsZSwgMyAgICBNMC1NMywgSTAsIEkxIDEgY3ljICAgICBjOAorIyAgICAgICAgICAgICAgICAgICAgIDs7CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUID0gU1tUXSAgICAgICAgICAgIGxkOCBUID0gW1RwdHJdICAgICAgICAgICAgICAgICAgTTAtTTEgICAgICAgICAxIGN5YyAgICAgYzkKKyMgICAgICAgICAgICAgICAgICAgICA7OworIyBkYXRhIF49IFQgICAgICAgICAgIHhvciBkYXRhID0gZGF0YSwgVCAgICAgICAgICAgICAgTTAtTTMsIEkwLCBJMSAxIGN5YyAgICAgYzEwCisjICAgICAgICAgICAgICAgICAgICAgOzsKKyMgKm91dCsrID0gRGF0YSBeIFQgICBkZXAgd29yZCA9IHdvcmQsIGRhdGEsIDgsIFBPUyAgIEkwLCBJMSAgICAgICAgMSBjeWMgICAgIGMxMQorIyAgICAgICAgICAgICAgICAgICAgIDs7CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZXJlIGFyZSBzZXZlcmFsIHBvaW50cyB3b3J0aCBtYWtpbmcgaGVyZToKKworIyAgIC0gTm90ZSB0aGF0IGR1ZSB0byB0aGUgYnlwYXNzL2ZvcndhcmRpbmctcGF0aCwgdGhlIGZpcnN0IHR3bworIyAgICAgcGhhc2VzIG9mIHRoZSBsb29wIGFyZSBzdHJhbmdseSBtaW5nbGVkIHRvZ2V0aGVyLiAgSW4KKyMgICAgIHBhcnRpY3VsYXIsIG5vdGUgdGhhdCB0aGUgZmlyc3Qgc3RhZ2Ugb2YgdGhlIHBpcGVsaW5lIGlzCisjICAgICB1c2luZyB0aGUgdmFsdWUgb2YgIkoiLCBhcyBjYWxjdWxhdGVkIGJ5IHRoZSBzZWNvbmQgc3RhZ2UuCisjICAgLSBFYWNoIGJ1bmRsZS1wYWlyIHdpbGwgaGF2ZSBleGFjdGx5IDYgaW5zdHJ1Y3Rpb25zLgorIyAgIC0gUGlwZWxpbmVkLCB0aGUgbG9vcCBjYW4gZXhlY3V0ZSBpbiAzIGN5Y2xlcy9pdGVyYXRpb24gYW5kCisjICAgICA0IHN0YWdlcy4gIEhvd2V2ZXIsIE1jS2lubGV5L01hZGlzb24gY2FuIGlzc3VlICJzdDEiIHRvCisjICAgICB0aGUgc2FtZSBiYW5rIGF0IGEgcmF0ZSBvZiBhdCBtb3N0IG9uZSBwZXIgNCBjeWNsZXMuICBUaHVzLAorIyAgICAgaW5zdGVhZCBvZiBzdG9yaW5nIGVhY2ggYnl0ZSwgd2UgYWNjdW11bGF0ZSB0aGVtIGluIGEgd29yZAorIyAgICAgYW5kIHRoZW4gd3JpdGUgdGhlbSBiYWNrIGF0IG9uY2Ugd2l0aCBhIHNpbmdsZSAic3Q4IiAodGhpcworIyAgICAgaW1wbGllcyB0aGF0IHRoZSBzZXR1cCBjb2RlIG5lZWRzIHRvIGVuc3VyZSB0aGF0IHRoZSBvdXRwdXQKKyMgICAgIGJ1ZmZlciBpcyBwcm9wZXJseSBhbGlnbmVkLCBpZiBuZWVkIGJlLCBieSBlbmNvZGluZyB0aGUKKyMgICAgIGZpcnN0IGZldyBieXRlcyBzZXBhcmF0ZWx5KS4KKyMgICAtIFRoZXJlIGlzIG5vIHNwYWNlIGZvciBhICJici5jdG9wIiBpbnN0cnVjdGlvbi4gIEZvciB0aGlzCisjICAgICByZWFzb24gd2UgY2FuJ3QgdXNlIG1vZHVsZS1sb29wIHN1cHBvcnQgaW4gSUEtNjQgYW5kIGhhdmUKKyMgICAgIHRvIGRvIGEgdHJhZGl0aW9uYWwsIHB1cmVseSBzb2Z0d2FyZS1waXBlbGluZWQgbG9vcC4KKyMgICAtIFdlIGNhbid0IHJlcGxhY2UgYW55IG9mIHRoZSByZW1haW5pbmcgImFkZC96eHQxIiBwYWlycyB3aXRoCisjICAgICAicGFkZDEiIGJlY2F1c2UgdGhlIGxhdGVuY3kgZm9yIHRoYXQgaW5zdHJ1Y3Rpb24gaXMgdG9vIGhpZ2gKKyMgICAgIGFuZCB3b3VsZCBwdXNoIHRoZSBsb29wIHRvIHRoZSBwb2ludCB3aGVyZSBtb3JlIGJ5cGFzc2VzCisjICAgICB3b3VsZCBiZSBuZWVkZWQsIHdoaWNoIHdlIGRvbid0IGhhdmUgc3BhY2UgZm9yLgorIyAgIC0gVGhlIGFib3ZlIGxvb3AgcnVucyBhdCBhcm91bmQgMy4yNiBjeWNsZXMvYnl0ZSwgb3Igcm91Z2hseQorIyAgICAgNDQwIE1CeXRlL3NlYyBvbiBhIDEuNUdIeiBNYWRpc29uLiAgVGhpcyBpcyB3ZWxsIGJlbG93IHRoZQorIyAgICAgc3lzdGVtIGJ1cyBiYW5kd2lkdGggYW5kIGhlbmNlIHdpdGgganVkaWNpb3VzIHVzZSBvZgorIyAgICAgImxmZXRjaCIgdGhpcyBsb29wIGNhbiBydW4gYXQgKGFsbW9zdCkgcGVhayBzcGVlZCBldmVuIHdoZW4KKyMgICAgIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgcmVzaWRlIGluIG1lbW9yeS4gIFRoZQorIyAgICAgbWF4LiBsYXRlbmN5IHRoYXQgY2FuIGJlIHRvbGVyYXRlZCBpcyAoUFJFRkVUQ0hfRElTVEFOQ0UgKgorIyAgICAgTDJfTElORV9TSVpFICogMyBjeWMpLCBvciBhYm91dCAzODQgY3ljbGVzIGFzc3VtaW5nIChhdAorIyAgICAgbGVhc3QpIDEtYWhlYWQgcHJlZmV0Y2hpbmcgb2YgMTI4IGJ5dGUgY2FjaGUtbGluZXMuICBOb3RlCisjICAgICB0aGF0IHdlIGRvIE5PVCBwcmVmZXRjaCBpbnRvIEwxLCBzaW5jZSB0aGF0IHdvdWxkIG9ubHkKKyMgICAgIGludGVyZmVyZSB3aXRoIHRoZSBTW10gdGFibGUgdmFsdWVzIHN0b3JlZCB0aGVyZS4gIFRoaXMgaXMKKyMgICAgIGFjY2VwdGFibGUgYmVjYXVzZSB0aGVyZSBpcyBhIDEwIGN5Y2xlIGxhdGVuY3kgYmV0d2VlbgorIyAgICAgbG9hZCBhbmQgZmlyc3QgdXNlIG9mIHRoZSBpbnB1dCBkYXRhLgorIyAgIC0gV2UgdXNlIGEgYnJhbmNoIHRvIG91dC1vZi1saW5lIGJ5cGFzcy1jb2RlIG9mIGN5Y2xlLXByZXNzdXJlOgorIyAgICAgd2UgY2FsY3VsYXRlIHRoZSBuZXh0IEosIGNoZWNrIGZvciB0aGUgbmVlZCB0byBhY3RpdmF0ZSB0aGUKKyMgICAgIGJ5cGFzcyBwYXRoLCBhbmQgYWN0aXZhdGUgdGhlIGJ5cGFzcyBwYXRoIEFMTCBJTiBUSEUgU0FNRQorIyAgICAgQ1lDTEUuICBJZiB3ZSBkaWRuJ3QgaGF2ZSB0aGVzZSBjb25zdHJhaW50cywgd2UgY291bGQgZG8KKyMgICAgIHRoZSBieXBhc3Mgd2l0aCBhIHNpbXBsZSBjb25kaXRpb25hbCBtb3ZlIGluc3RydWN0aW9uLgorIyAgICAgRm9ydHVuYXRlbHksIHRoZSBieXBhc3MgcGF0aHMgZ2V0IGFjdGl2YXRlZCByZWxhdGl2ZWx5CisjICAgICBpbmZyZXF1ZW50bHksIHNvIHRoZSBleHRyYSBicmFuY2hlcyBkb24ndCBjb3N0IGFsbCB0aGF0IG11Y2gKKyMgICAgIChhYm91dCAwLjA0IGN5Y2xlcy9ieXRlLCBtZWFzdXJlZCBvbiBhIDE2Mzk2IGJ5dGUgZmlsZSB3aXRoCisjICAgICByYW5kb20gaW5wdXQgZGF0YSkuCisjCisKKyRwaGFzZXMgPSA0OwkJIyBudW1iZXIgb2Ygc3RhZ2VzL3BoYXNlcyBpbiB0aGUgcGlwZWxpbmVkLWxvb3AKKyR1bnJvbGxfY291bnQgPSA2OwkjIG51bWJlciBvZiB0aW1lcyB3ZSB1bnJvbGxlZCBpdAorJHBDb21JID0gKDEgPDwgMCk7CiskcENvbUogPSAoMSA8PCAxKTsKKyRwQ29tVCA9ICgxIDw8IDIpOworJHBPdXQgID0gKDEgPDwgMyk7CisKKyRORGF0YSA9IDQ7CiskTklQID0gMzsKKyROSlAgPSAyOworJE5JID0gMjsKKyROU0kgPSAzOworJE5TSiA9IDI7CiskTlQgPSAyOworJE5PdXRXb3JkID0gMjsKKworIworIyAkdGhyZXNob2xkIGlzIHRoZSBtaW5pbXVtIGxlbmd0aCBiZWZvcmUgd2UgYXR0ZW1wdCB0byB1c2UgdGhlCisjIGJpZyBzb2Z0d2FyZS1waXBlbGluZWQgbG9vcC4gIEl0IE1VU1QgYmUgZ3JlYXRlci1vci1lcXVhbAorIyB0bzoKKyMgIAkJUEhBU0VTICogKFVOUk9MTF9DT1VOVCArIDEpICsgNworIworIyBUaGUgIisgNyIgY29tZXMgZnJvbSB0aGUgZmFjdCB3ZSBtYXkgaGF2ZSB0byBlbmNvZGUgdXAgdG8KKyMgICA3IGJ5dGVzIHNlcGFyYXRlbHkgYmVmb3JlIHRoZSBvdXRwdXQgcG9pbnRlciBpcyBhbGlnbmVkLgorIworJHRocmVzaG9sZCA9ICgzICogKCRwaGFzZXMgKiAoJHVucm9sbF9jb3VudCArIDEpKSArIDcpOworCitzdWIgSSB7CisgICAgbG9jYWwgKmNvZGUgPSBzaGlmdDsKKyAgICBsb2NhbCAkZm9ybWF0ID0gc2hpZnQ7CisgICAgJGNvZGUgLj0gc3ByaW50ZiAoIlx0XHQiLiRmb3JtYXQuIlxuIiwgQF8pOworfQorCitzdWIgUCB7CisgICAgbG9jYWwgKmNvZGUgPSBzaGlmdDsKKyAgICBsb2NhbCAkZm9ybWF0ID0gc2hpZnQ7CisgICAgJGNvZGUgLj0gc3ByaW50ZiAoJGZvcm1hdC4iXG4iLCBAXyk7Cit9CisKK3N1YiBTVE9QIHsKKyAgICBsb2NhbCAqY29kZSA9IHNoaWZ0OworICAgICRjb2RlIC49PDxfX187CisJCTs7CitfX18KK30KKworc3ViIGVtaXRfYm9keSB7CisgICAgbG9jYWwgKmMgPSBzaGlmdDsKKyAgICBsb2NhbCAqYnlwYXNzID0gc2hpZnQ7CisgICAgbG9jYWwgKCRpdGVyYXRpb24sICRwKSA9IEBfOworCisgICAgbG9jYWwgJGkwID0gJGl0ZXJhdGlvbjsKKyAgICBsb2NhbCAkaTEgPSAkaXRlcmF0aW9uIC0gMTsKKyAgICBsb2NhbCAkaTIgPSAkaXRlcmF0aW9uIC0gMjsKKyAgICBsb2NhbCAkaTMgPSAkaXRlcmF0aW9uIC0gMzsKKyAgICBsb2NhbCAkaXcwID0gKCRpdGVyYXRpb24gLSAzKSAvIDg7CisgICAgbG9jYWwgJGl3MSA9ICgkaXRlcmF0aW9uID4gMykgPyAoJGl0ZXJhdGlvbiAtIDQpIC8gOCA6IDE7CisgICAgbG9jYWwgJGJ5dGVfbnVtID0gKCRpdGVyYXRpb24gLSAzKSAlIDg7CisgICAgbG9jYWwgJGxhYmVsID0gJGl0ZXJhdGlvbiArIDE7CisgICAgbG9jYWwgJHBBbnkgPSAoJHAgJiAweGYpID09IDB4ZjsKKyAgICBsb2NhbCAkcEJ5cCA9ICgoJHAgJiAkcENvbUkpICYmICgkaXRlcmF0aW9uID4gMCkpOworCisgICAgJGMuPTw8X19fOworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK19fXworCisgICAgaWYgKCgkcCAmIDB4ZikgPT0gMCkgeworCSRjLj0iI2lmZGVmIEhPU1RfSVNfQklHX0VORElBTlxuIjsKKwkmSShcJGMsInNoci51CU91dFdvcmRbJXVdID0gT3V0V29yZFsldV0sIDMyOzsiLAorCQkJCSRpdzEgJSAkTk91dFdvcmQsICRpdzEgJSAkTk91dFdvcmQpOworCSRjLj0iI2VuZGlmXG4iOworCSZJKFwkYywgInN0NCBbT3V0UHRyXSA9IE91dFdvcmRbJXVdLCA0IiwgJGl3MSAlICROT3V0V29yZCk7CisJcmV0dXJuOworICAgIH0KKworICAgICMgQ3ljbGUgMAorICAgICZJKFwkYywgInsgLm1taSIpCQkJCQkgICAgICBpZiAoJHBBbnkpOworICAgICZJKFwkYywgImxkMSAgICBEYXRhWyV1XSA9IFtJblB0cl0sIDEiLCAkaTAgJSAkTkRhdGEpICAgICBpZiAoJHAgJiAkcENvbUkpOworICAgICZJKFwkYywgInBhZGQxICBJWyV1XSA9IE9uZSwgSVsldV0iLCAkaTAgJSAkTkksICRpMSAlICROSSlpZiAoJHAgJiAkcENvbUkpOworICAgICZJKFwkYywgInp4dDEgICBKID0gSiIpCQkJCSAgICAgIGlmICgkcCAmICRwQ29tSik7CisgICAgJkkoXCRjLCAifSIpCQkJCQkgICAgICBpZiAoJHBBbnkpOworICAgICZJKFwkYywgInsgLm1taSIpCQkJCQkgICAgICBpZiAoJHBBbnkpOworICAgICZJKFwkYywgIkxLRVkgICBUWyV1XSA9IFtUWyV1XV0iLCAkaTEgJSAkTlQsICRpMSAlICROVCkgICBpZiAoJHAgJiAkcE91dCk7CisgICAgJkkoXCRjLCAiYWRkICAgIFRbJXVdID0gU0lbJXVdLCBTSlsldV0iLAorICAgICAgICRpMCAlICROVCwgJGkyICUgJE5TSSwgJGkxICUgJE5TSikJCSAgICAgIGlmICgkcCAmICRwQ29tVCk7CisgICAgJkkoXCRjLCAiS0VZQUREUihJUHJbJXVdLCBJWyV1XSkiLCAkaTAgJSAkTklQLCAkaTEgJSAkTkkpIGlmICgkcCAmICRwQ29tSSk7CisgICAgJkkoXCRjLCAifSIpCQkJCQkgICAgICBpZiAoJHBBbnkpOworICAgICZTVE9QKFwkYyk7CisKKyAgICAjIEN5Y2xlIDEKKyAgICAmSShcJGMsICJ7IC5tbWkiKQkJCQkJICAgICAgaWYgKCRwQW55KTsKKyAgICAmSShcJGMsICJTS0VZICAgW0lQclsldV1dID0gU0pbJXVdIiwgJGkyICUgJE5JUCwgJGkxJSROU0opaWYgKCRwICYgJHBDb21UKTsKKyAgICAmSShcJGMsICJTS0VZICAgW0pQWyV1XV0gPSBTSVsldV0iLCAkaTEgJSAkTkpQLCAkaTIlJE5TSSkgaWYgKCRwICYgJHBDb21UKTsKKyAgICAmSShcJGMsICJ6eHQxICAgVFsldV0gPSBUWyV1XSIsICRpMCAlICROVCwgJGkwICUgJE5UKSAgICAgaWYgKCRwICYgJHBDb21UKTsKKyAgICAmSShcJGMsICJ9IikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJkkoXCRjLCAieyAubW1pIikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJkkoXCRjLCAiTEtFWSAgIFNJWyV1XSA9IFtJUHJbJXVdXSIsICRpMCAlICROU0ksICRpMCUkTklQKWlmICgkcCAmICRwQ29tSSk7CisgICAgJkkoXCRjLCAiS0VZQUREUihKUFsldV0sIEopIiwgJGkwICUgJE5KUCkJCSAgICAgIGlmICgkcCAmICRwQ29tSik7CisgICAgJkkoXCRjLCAieG9yICAgIERhdGFbJXVdID0gRGF0YVsldV0sIFRbJXVdIiwKKyAgICAgICAkaTMgJSAkTkRhdGEsICRpMyAlICRORGF0YSwgJGkxICUgJE5UKQkJICAgICAgaWYgKCRwICYgJHBPdXQpOworICAgICZJKFwkYywgIn0iKQkJCQkJICAgICAgaWYgKCRwQW55KTsKKyAgICAmU1RPUChcJGMpOworCisgICAgIyBDeWNsZSAyCisgICAgJkkoXCRjLCAieyAubW1pIikJCQkJCSAgICAgIGlmICgkcEFueSk7CisgICAgJkkoXCRjLCAiTEtFWSAgIFNKWyV1XSA9IFtKUFsldV1dIiwgJGkwICUgJE5TSiwgJGkwJSROSlApIGlmICgkcCAmICRwQ29tSik7CisgICAgJkkoXCRjLCAiY21wLmVxIHBCeXBhc3MsIHAwID0gSVsldV0sIEoiLCAkaTEgJSAkTkkpCSAgICAgIGlmICgkcEJ5cCk7CisgICAgJkkoXCRjLCAiZGVwIE91dFdvcmRbJXVdID0gRGF0YVsldV0sIE91dFdvcmRbJXVdLCBCWVRFX1BPUygldSksIDgiLAorICAgICAgICRpdzAlJE5PdXRXb3JkLCAkaTMlJE5EYXRhLCAkaXcxJSROT3V0V29yZCwgJGJ5dGVfbnVtKSBpZiAoJHAgJiAkcE91dCk7CisgICAgJkkoXCRjLCAifSIpCQkJCQkgICAgICBpZiAoJHBBbnkpOworICAgICZJKFwkYywgInsgLm1tYiIpCQkJCQkgICAgICBpZiAoJHBBbnkpOworICAgICZJKFwkYywgImFkZCAgICBKID0gSiwgU0lbJXVdIiwgJGkwICUgJE5TSSkJCSAgICAgIGlmICgkcCAmICRwQ29tSSk7CisgICAgJkkoXCRjLCAiS0VZQUREUihUWyV1XSwgVFsldV0pIiwgJGkwICUgJE5ULCAkaTAgJSAkTlQpICAgIGlmICgkcCAmICRwQ29tVCk7CisgICAgJlAoXCRjLCAiKHBCeXBhc3MpXHRici5jb25kLnNwbnQubWFueSAucmM0QnlwYXNzJXUiLCRsYWJlbClpZiAoJHBCeXApOworICAgICZJKFwkYywgIn0iKSBpZiAoJHBBbnkpOworICAgICZTVE9QKFwkYyk7CisKKyAgICAmUChcJGMsICIucmM0UmVzdW1lJXU6IiwgJGxhYmVsKQkJCSAgICAgIGlmICgkcEJ5cCk7CisgICAgaWYgKCRieXRlX251bSA9PSAwICYmICRpdGVyYXRpb24gPj0gJHBoYXNlcykgeworCSZJKFwkYywgInN0OCBbT3V0UHRyXSA9IE91dFdvcmRbJXVdLCA4IiwKKwkgICAkaXcxICUgJE5PdXRXb3JkKQkJCQkgICAgICBpZiAoJHAgJiAkcE91dCk7CisJaWYgKCRpdGVyYXRpb24gPT0gKDEgKyAkdW5yb2xsX2NvdW50KSAqICRwaGFzZXMgLSAxKSB7CisJICAgIGlmICgkdW5yb2xsX2NvdW50ID09IDYpIHsKKwkJJkkoXCRjLCAibW92IE91dFdvcmRbJXVdID0gT3V0V29yZFsldV0iLAorCQkgICAkaXcxICUgJE5PdXRXb3JkLCAkaXcwICUgJE5PdXRXb3JkKTsKKwkgICAgfQorCSAgICAmSShcJGMsICJsZmV0Y2gubnQxIFtJblByZWZldGNoXSwgJXUiLAorCSAgICAgICAkdW5yb2xsX2NvdW50ICogJHBoYXNlcyk7CisJICAgICZJKFwkYywgImxmZXRjaC5leGNsLm50MSBbT3V0UHJlZmV0Y2hdLCAldSIsCisJICAgICAgICR1bnJvbGxfY291bnQgKiAkcGhhc2VzKTsKKwkgICAgJkkoXCRjLCAiYnIuY2xvb3Auc3B0ay5mZXcgLnJjNExvb3AiKTsKKwl9CisgICAgfQorCisgICAgaWYgKCRwQnlwKSB7CisJJlAoXCRieXBhc3MsICIucmM0QnlwYXNzJXU6IiwgJGxhYmVsKTsKKwkmSShcJGJ5cGFzcywgInN1YiBKID0gSiwgU0lbJXVdIiwgJGkwICUgJE5TSSk7CisJJkkoXCRieXBhc3MsICJub3AgMCIpOworCSZJKFwkYnlwYXNzLCAibm9wIDAiKTsKKwkmSShcJGJ5cGFzcywgIjs7Iik7CisJJkkoXCRieXBhc3MsICJhZGQgSiA9IEosIFNJWyV1XSIsICRpMSAlICROU0kpOworCSZJKFwkYnlwYXNzLCAibW92IFNJWyV1XSA9IFNJWyV1XSIsICRpMCAlICROU0ksICRpMSAlICROU0kpOworCSZJKFwkYnlwYXNzLCAiYnIuc3B0ay5tYW55IC5yYzRSZXN1bWUldVxuIiwgJGxhYmVsKTsKKwkmSShcJGJ5cGFzcywgIjs7Iik7CisgICAgfQorfQorCiskY29kZT08PF9fXzsKKy5pZGVudCBcInJjNC1pYTY0LnMsIHZlcnNpb24gMy4wXCIKKy5pZGVudCBcIkNvcHlyaWdodCAoYykgMjAwNSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLlwiCisKKyNkZWZpbmUgTENTYXZlCQlyOAorI2RlZmluZSBQUlNhdmUJCXI5CisKKy8qIElucHV0cyBiZWNvbWUgaW52YWxpZCBvbmNlIHJvdGF0aW9uIGJlZ2lucyEgICovCisKKyNkZWZpbmUgU3RhdGVUYWJsZQlpbjAKKyNkZWZpbmUgRGF0YUxlbgkJaW4xCisjZGVmaW5lIElucHV0QnVmZmVyCWluMgorI2RlZmluZSBPdXRwdXRCdWZmZXIJaW4zCisKKyNkZWZpbmUgS1RhYmxlCQlyMTQKKyNkZWZpbmUgSgkJcjE1CisjZGVmaW5lIEluUHRyCQlyMTYKKyNkZWZpbmUgT3V0UHRyCQlyMTcKKyNkZWZpbmUgSW5QcmVmZXRjaAlyMTgKKyNkZWZpbmUgT3V0UHJlZmV0Y2gJcjE5CisjZGVmaW5lIE9uZQkJcjIwCisjZGVmaW5lIExvb3BDb3VudAlyMjEKKyNkZWZpbmUgUmVtYWluZGVyCXIyMgorI2RlZmluZSBJRmluYWwJCXIyMworI2RlZmluZSBFbmRQdHIJCXIyNAorCisjZGVmaW5lIHRtcDAJCXIyNQorI2RlZmluZSB0bXAxCQlyMjYKKworI2RlZmluZSBwQnlwYXNzCQlwNgorI2RlZmluZSBwRG9uZQkJcDcKKyNkZWZpbmUgcFNtYWxsCQlwOAorI2RlZmluZSBwQWxpZ25lZAlwOQorI2RlZmluZSBwVW5hbGlnbmVkCXAxMAorCisjZGVmaW5lIHBDb21wdXRlSQlwUGhhc2VbMF0KKyNkZWZpbmUgcENvbXB1dGVKCXBQaGFzZVsxXQorI2RlZmluZSBwQ29tcHV0ZVQJcFBoYXNlWzJdCisjZGVmaW5lIHBPdXRwdXQJCXBQaGFzZVszXQorCisjZGVmaW5lIFJldFZhbAkJcjgKKyNkZWZpbmUgTF9PSwkJcDcKKyNkZWZpbmUgTF9OT0sJCXA4CisKKyNkZWZpbmUJX05JTlBVVFMJNAorI2RlZmluZQlfTk9VVFBVVAkwCisKKyNkZWZpbmUJX05ST1RBVEUJMjQKKyNkZWZpbmUJX05MT0NBTFMJKF9OUk9UQVRFIC0gX05JTlBVVFMgLSBfTk9VVFBVVCkKKworI2lmbmRlZiBTWgorIyBkZWZpbmUgU1oJNAkvLyB0aGlzIG11c3QgYmUgc2V0IHRvIHNpemVvZihSQzRfSU5UKQorI2VuZGlmCisKKyNpZiBTWiA9PSAxCisjIGRlZmluZSBMS0VZCQkJbGQxCisjIGRlZmluZSBTS0VZCQkJc3QxCisjIGRlZmluZSBLRVlBRERSKGRzdCwgaSkJYWRkIGRzdCA9IGksIEtUYWJsZQorI2VsaWYgU1ogPT0gMgorIyBkZWZpbmUgTEtFWQkJCWxkMgorIyBkZWZpbmUgU0tFWQkJCXN0MgorIyBkZWZpbmUgS0VZQUREUihkc3QsIGkpCXNobGFkZCBkc3QgPSBpLCAxLCBLVGFibGUKKyNlbGlmIFNaID09IDQKKyMgZGVmaW5lIExLRVkJCQlsZDQKKyMgZGVmaW5lIFNLRVkJCQlzdDQKKyMgZGVmaW5lIEtFWUFERFIoZHN0LCBpKQlzaGxhZGQgZHN0ID0gaSwgMiwgS1RhYmxlCisjZWxzZQorIyBkZWZpbmUgTEtFWQkJCWxkOAorIyBkZWZpbmUgU0tFWQkJCXN0OAorIyBkZWZpbmUgS0VZQUREUihkc3QsIGkpCXNobGFkZCBkc3QgPSBpLCAzLCBLVGFibGUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfSFBVWF9TT1VSQ0UpICYmICFkZWZpbmVkKF9MUDY0KQorIyBkZWZpbmUgQUREUAlhZGRwNAorI2Vsc2UKKyMgZGVmaW5lIEFERFAJYWRkCisjZW5kaWYKKworLyogRGVmaW5lIGEgbWFjcm8gZm9yIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBuLXRoIGJ5dGU6ICovCisKKyNpZiBkZWZpbmVkKF9IUFVYX1NPVVJDRSkgfHwgZGVmaW5lZChCX0VORElBTikKKyMgZGVmaW5lIEhPU1RfSVNfQklHX0VORElBTgorIyBkZWZpbmUgQllURV9QT1MobikJKDU2IC0gKDggKiAobikpKQorI2Vsc2UKKyMgZGVmaW5lIEJZVEVfUE9TKG4pCSg4ICogKG4pKQorI2VuZGlmCisKKy8qCisgICBXZSBtdXN0IHBlcmZvcm0gdGhlIGZpcnN0IHBoYXNlIG9mIHRoZSBwaXBlbGluZSBleHBsaWNpdGx5IHNpbmNlCisgICB3ZSB3aWxsIGFsd2F5cyBsb2FkIGZyb20gdGhlIHN0YWJsZSB0aGUgZmlyc3QgdGltZS4gVGhlIGJyLmNleGl0CisgICB3aWxsIG5ldmVyIGJlIHRha2VuIHNpbmNlIHJlZ2FyZGxlc3Mgb2YgdGhlIG51bWJlciBvZiBieXRlcyBiZWNhdXNlCisgICB0aGUgZXBpbG9ndWUgY291bnQgaXMgNC4KKyovCisvKiBNT0RTQ0hFRF9SQzQgbWFjcm8gd2FzIHNwbGl0IHRvIF9QUk9MT0dVRSBhbmQgX0xPT1AsIGJlY2F1c2UgSFAtVVgKKyAgIGFzc2VtYmxlciBmYWlsZWQgb24gb3JpZ2luYWwgbWFjcm8gd2l0aCBzeW50YXggZXJyb3IuIDxhcHBybz4gKi8KKyNkZWZpbmUgTU9EU0NIRURfUkM0X1BST0xPR1VFCQkJCQkJICAgXFwKKwl7CQkJCQkJCQkgICBcXAorCQkJCWxkMQkJRGF0YVswXSA9IFtJblB0cl0sIDE7CSAgIFxcCisJCQkJYWRkCQlJRmluYWwgPSAxLCBJWzFdOwkgICBcXAorCQkJCUtFWUFERFIoSVByWzBdLCBJWzFdKTsJCQkgICBcXAorCX0gOzsJCQkJCQkJCSAgIFxcCisJewkJCQkJCQkJICAgXFwKKwkJCQlMS0VZCQlTSVswXSA9IFtJUHJbMF1dOwkgICBcXAorCQkJCW1vdgkJcHIucm90ID0gMHgxMDAwMDsJICAgXFwKKwkJCQltb3YJCWFyLmVjID0gNDsJCSAgIFxcCisJfSA7OwkJCQkJCQkJICAgXFwKKwl7CQkJCQkJCQkgICBcXAorCQkJCWFkZAkJSiA9IEosIFNJWzBdOwkJICAgXFwKKwkJCQl6eHQxCQlJWzBdID0gSUZpbmFsOwkJICAgXFwKKwkJCQlici5jZXhpdC5zcG50LmZldyAuKzE2OyAvKiBuZXZlciB0YWtlbiAqLyAgXFwKKwl9IDs7CisjZGVmaW5lIE1PRFNDSEVEX1JDNF9MT09QKGxhYmVsKQkJCQkJICAgXFwKK2xhYmVsOgkJCQkJCQkJCSAgIFxcCisJewkubW1pOwkJCQkJCQkgICBcXAorCQkocENvbXB1dGVJKQlsZDEJCURhdGFbMF0gPSBbSW5QdHJdLCAxOwkgICBcXAorCQkocENvbXB1dGVJKQlhZGQJCUlGaW5hbCA9IDEsIElbMV07CSAgIFxcCisJCShwQ29tcHV0ZUopCXp4dDEJCUogPSBKOwkJCSAgIFxcCisJfXsJLm1taTsJCQkJCQkJICAgXFwKKwkJKHBPdXRwdXQpCUxLRVkJCVRbMV0gPSBbVFsxXV07CQkgICBcXAorCQkocENvbXB1dGVUKQlhZGQJCVRbMF0gPSBTSVsyXSwgU0pbMV07CSAgIFxcCisJCShwQ29tcHV0ZUkpCUtFWUFERFIoSVByWzBdLCBJWzFdKTsJCQkgICBcXAorCX0gOzsJCQkJCQkJCSAgIFxcCisJewkubW1pOwkJCQkJCQkgICBcXAorCQkocENvbXB1dGVUKQlTS0VZCQlbSVByWzJdXSA9IFNKWzFdOwkgICBcXAorCQkocENvbXB1dGVUKQlTS0VZCQlbSlBbMV1dID0gU0lbMl07CSAgIFxcCisJCShwQ29tcHV0ZVQpCXp4dDEJCVRbMF0gPSBUWzBdOwkJICAgXFwKKwl9ewkubW1pOwkJCQkJCQkgICBcXAorCQkocENvbXB1dGVJKQlMS0VZCQlTSVswXSA9IFtJUHJbMF1dOwkgICBcXAorCQkocENvbXB1dGVKKQlLRVlBRERSKEpQWzBdLCBKKTsJCQkgICBcXAorCQkocENvbXB1dGVJKQljbXAuZXEudW5jCXBCeXBhc3MsIHAwID0gSVsxXSwgSjsJICAgXFwKKwl9IDs7CQkJCQkJCQkgICBcXAorCXsJLm1taTsJCQkJCQkJICAgXFwKKwkJKHBDb21wdXRlSikJTEtFWQkJU0pbMF0gPSBbSlBbMF1dOwkgICBcXAorCQkocE91dHB1dCkJeG9yCQlEYXRhWzNdID0gRGF0YVszXSwgVFsxXTsgICBcXAorCQkJCW5vcAkJMHgwOwkJCSAgIFxcCisJfXsJLm1taTsJCQkJCQkJICAgXFwKKwkJKHBDb21wdXRlVCkJS0VZQUREUihUWzBdLCBUWzBdKTsJCQkgICBcXAorCQkocEJ5cGFzcykJbW92CQlTSVswXSA9IFNJWzFdOwkJICAgXFwKKwkJKHBDb21wdXRlSSkJenh0MQkJSVswXSA9IElGaW5hbDsJCSAgIFxcCisJfSA7OwkJCQkJCQkJICAgXFwKKwl7CS5tbWI7CQkJCQkJCSAgIFxcCisJCShwT3V0cHV0KQlzdDEJCVtPdXRQdHJdID0gRGF0YVszXSwgMTsJICAgXFwKKwkJKHBDb21wdXRlSSkJYWRkCQlKID0gSiwgU0lbMF07CQkgICBcXAorCQkJCWJyLmN0b3Auc3B0ay5mZXcgbGFiZWw7CQkJICAgXFwKKwl9IDs7CisKKwkudGV4dAorCisJLmFsaWduCTMyCisKKwkudHlwZQlSQzQsIFxAZnVuY3Rpb24KKwkuZ2xvYmFsCVJDNAorCisJLnByb2MJUkM0CisJLnByb2xvZ3VlCisKK1JDNDoKKwl7CisJICAJLm1taQorCQlhbGxvYwlyMiA9IGFyLnBmcywgX05JTlBVVFMsIF9OTE9DQUxTLCBfTk9VVFBVVCwgX05ST1RBVEUKKworCQkucm90ciBEYXRhWzRdLCBJWzJdLCBJUHJbM10sIFNJWzNdLCBKUFsyXSwgU0pbMl0sIFRbMl0sIFxcCisJCSAgICAgIE91dFdvcmRbMl0KKwkJLnJvdHAgcFBoYXNlWzRdCisKKwkJQUREUAkJSW5QcmVmZXRjaCA9IDAsIElucHV0QnVmZmVyCisJCUFERFAJCUtUYWJsZSA9IDAsIFN0YXRlVGFibGUKKwl9CisJeworCQkubW1pCisJCUFERFAJCUluUHRyID0gMCwgSW5wdXRCdWZmZXIKKwkJQUREUAkJT3V0UHRyID0gMCwgT3V0cHV0QnVmZmVyCisJCW1vdgkJUmV0VmFsID0gcjAKKwl9CisJOzsKKwl7CisJCS5tbWkKKwkJbGZldGNoLm50MQlbSW5QcmVmZXRjaF0sIDB4ODAKKwkJQUREUAkJT3V0UHJlZmV0Y2ggPSAwLCBPdXRwdXRCdWZmZXIKKwl9CisJeyAgICAgICAgICAgICAgIC8vIFJldHVybiAwIGlmIHRoZSBpbnB1dCBsZW5ndGggaXMgbm9uc2Vuc2ljYWwKKyAgICAgICAgCS5taWIKKwkJQUREUAkJU3RhdGVUYWJsZSA9IDAsIFN0YXRlVGFibGUKKyAgICAgICAgCWNtcC5nZS51bmMgIAlMX05PSywgTF9PSyA9IHIwLCBEYXRhTGVuCisJKExfTk9LKSBici5yZXQuc3B0ay5mZXcgcnAKKwl9CisJOzsKKwl7CisgICAgICAgIAkubWliCisgICAgICAgIAljbXAuZXEub3IgIAlMX05PSywgTF9PSyA9IHIwLCBJblB0cgorICAgICAgICAJY21wLmVxLm9yICAJTF9OT0ssIExfT0sgPSByMCwgT3V0UHRyCisJCW5vcAkJMHgwCisJfQorCXsKKwkJLm1pYgorICAgICAgICAJY21wLmVxLm9yICAJTF9OT0ssIExfT0sgPSByMCwgU3RhdGVUYWJsZQorCQlub3AJCTB4MAorCShMX05PSykgYnIucmV0LnNwdGsuZmV3IHJwCisJfQorCTs7CisJCUxLRVkJCUlbMV0gPSBbS1RhYmxlXSwgU1oKKy8qIFByZWZldGNoIHRoZSBzdGF0ZS10YWJsZS4gSXQgY29udGFpbnMgMjU2IGVsZW1lbnRzIG9mIHNpemUgU1ogKi8KKworI2lmIFNaID09IDEKKwkJQUREUAkJdG1wMCA9IDEqMTI4LCBTdGF0ZVRhYmxlCisjZWxpZiBTWiA9PSAyCisJCUFERFAJCXRtcDAgPSAzKjEyOCwgU3RhdGVUYWJsZQorCQlBRERQCQl0bXAxID0gMioxMjgsIFN0YXRlVGFibGUKKyNlbGlmIFNaID09IDQKKwkJQUREUAkJdG1wMCA9IDcqMTI4LCBTdGF0ZVRhYmxlCisJCUFERFAJCXRtcDEgPSA2KjEyOCwgU3RhdGVUYWJsZQorI2VsaWYgU1ogPT0gOAorCQlBRERQCQl0bXAwID0gMTUqMTI4LCBTdGF0ZVRhYmxlCisJCUFERFAJCXRtcDEgPSAxNCoxMjgsIFN0YXRlVGFibGUKKyNlbmRpZgorCQk7OworI2lmIFNaID49IDgKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDBdLCAtMjU2CS8vIDE1CisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAxXSwgLTI1Njs7CisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAwXSwgLTI1NgkvLyAxMworCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMV0sIC0yNTY7OworCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMF0sIC0yNTYJLy8gMTEKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDFdLCAtMjU2OzsKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDBdLCAtMjU2CS8vICA5CisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAxXSwgLTI1Njs7CisjZW5kaWYKKyNpZiBTWiA+PSA0CisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAwXSwgLTI1NgkvLyAgNworCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMV0sIC0yNTY7OworCQlsZmV0Y2guZmF1bHQubnQxCQlbdG1wMF0sIC0yNTYJLy8gIDUKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDFdLCAtMjU2OzsKKyNlbmRpZgorI2lmIFNaID49IDIKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDBdLCAtMjU2CS8vICAzCisJCWxmZXRjaC5mYXVsdC5udDEJCVt0bXAxXSwgLTI1Njs7CisjZW5kaWYKKwl7CisJCS5taWkKKwkJbGZldGNoLmZhdWx0Lm50MQkJW3RtcDBdCQkvLyAgMQorCQlhZGQJCUlbMV09MSxJWzFdOzsKKwkJenh0MQkJSVsxXT1JWzFdCisJfQorCXsKKwkJLm1taQorCQlsZmV0Y2gubnQxCVtJblByZWZldGNoXSwgMHg4MAorCQlsZmV0Y2guZXhjbC5udDEJW091dFByZWZldGNoXSwgMHg4MAorCQkuc2F2ZQkJcHIsIFBSU2F2ZQorCQltb3YJCVBSU2F2ZSA9IHByCisJfSA7OworCXsKKwkJLm1taQorCQlsZmV0Y2guZXhjbC5udDEJW091dFByZWZldGNoXSwgMHg4MAorCQlMS0VZCQlKID0gW0tUYWJsZV0sIFNaCisJCUFERFAJCUVuZFB0ciA9IERhdGFMZW4sIEluUHRyCisJfSAgOzsKKwl7CisJCS5tbWkKKwkJQUREUAkJRW5kUHRyID0gLTEsIEVuZFB0cgkvLyBNYWtlIGl0IHBvaW50IHRvCisJCQkJCQkJLy8gbGFzdCBkYXRhIGJ5dGUuCisJCW1vdgkJT25lID0gMQorCQkuc2F2ZQkJYXIubGMsIExDU2F2ZQorCQltb3YJCUxDU2F2ZSA9IGFyLmxjCisJCS5ib2R5CisJfSA7OworCXsKKwkJLm1tYgorCQlzdWIJCVJlbWFpbmRlciA9IDAsIE91dFB0cgorCQljbXAuZ3R1CQlwU21hbGwsIHAwID0gJHRocmVzaG9sZCwgRGF0YUxlbgorKHBTbWFsbCkJYnIuY29uZC5kcG50CS5yYzRSZW1haW5kZXIJCS8vIERhdGEgdG9vIHNtYWxsIGZvcgorCQkJCQkJCS8vIGJpZyBsb29wLgorCX0gOzsKKwl7CisJCS5tbWkKKwkJYW5kCQlSZW1haW5kZXIgPSAweDcsIFJlbWFpbmRlcgorCQk7OworCQljbXAuZXEJCXBBbGlnbmVkLCBwVW5hbGlnbmVkID0gUmVtYWluZGVyLCByMAorCQlub3AJCTB4MAorCX0gOzsKKwl7CisJCS5tbWIKKy5wcmVkLnJlbAkibXV0ZXgiLHBVbmFsaWduZWQscEFsaWduZWQKKyhwVW5hbGlnbmVkKQlhZGQJCVJlbWFpbmRlciA9IC0xLCBSZW1haW5kZXIKKyhwQWxpZ25lZCkJc3ViCQlSZW1haW5kZXIgPSBFbmRQdHIsIEluUHRyCisocEFsaWduZWQpCWJyLmNvbmQuZHB0ay5tYW55IC5yYzRBbGlnbmVkCisJfSA7OworCXsKKwkJLm1taQorCQlub3AJCTB4MAorCQlub3AJCTB4MAorCQltb3YuaQkJYXIubGMgPSBSZW1haW5kZXIKKwl9CisKKy8qIERvIHRoZSBpbml0aWFsIGZldyBieXRlcyB2aWEgdGhlIGNvbXBhY3QsIG1vZHVsby1zY2hlZHVsZWQgbG9vcAorICAgdW50aWwgdGhlIG91dHB1dCBwb2ludGVyIGlzIDgtYnl0ZS1hbGlnbmVkLiAgKi8KKworCQlNT0RTQ0hFRF9SQzRfUFJPTE9HVUUKKwkJTU9EU0NIRURfUkM0X0xPT1AoLlJDNEFsaWduTG9vcCkKKworCXsKKwkJLm1pYgorCQlzdWIJCVJlbWFpbmRlciA9IEVuZFB0ciwgSW5QdHIKKwkJenh0MQkJSUZpbmFsID0gSUZpbmFsCisJCWNscnJyYgkJCQkvLyBDbGVhciBDRk0ucnJiLnByIHNvCisJCTs7CQkJCS8vIG5leHQgIm1vdiBwci5yb3QgPSBOIgorCQkJCQkJLy8gZG9lcyB0aGUgcmlnaHQgdGhpbmcuCisJfQorCXsKKwkJLm1taQorCQltb3YJCUlbMV0gPSBJRmluYWwKKwkJbm9wCQkweDAKKwkJbm9wCQkweDAKKwl9IDs7CisKKworLnJjNEFsaWduZWQ6CisKKy8qCisgICBVbnJvbGxlZCBsb29wIGNvdW50ID0gKFJlbWFpbmRlciAtICgkdW5yb2xsX2NvdW50KzEpKiRwaGFzZXMpLygkdW5yb2xsX2NvdW50KiRwaGFzZXMpCisgKi8KKworCXsKKwkJLm1seAorCQlhZGQJTG9vcENvdW50ID0gMSAtICgkdW5yb2xsX2NvdW50ICsgMSkqJHBoYXNlcywgUmVtYWluZGVyCisJCW1vdmwJCVJlbWFpbmRlciA9IDB4YWFhYWFhYWFhYWFhYWFhYgorCX0gOzsKKwl7CisJCS5tbWkKKwkJc2V0Zi5zaWcJZjYgPSBMb29wQ291bnQJCS8vIE0yLCBNMwk2IGN5YworCQlzZXRmLnNpZwlmNyA9IFJlbWFpbmRlcgkJLy8gTTIsIE0zCTYgY3ljCisJCW5vcAkJMHgwCisJfSA7OworCXsKKwkJLm1mYgorCQlub3AJCTB4MAorCQl4bXB5Lmh1CQlmNiA9IGY2LCBmNworCQlub3AJCTB4MAorCX0gOzsKKwl7CisJCS5tbWkKKwkJZ2V0Zi5zaWcJTG9vcENvdW50ID0gZjY7OwkvLyBNMgkJNSBjeWMKKwkJbm9wCQkweDAKKwkJc2hyLnUJCUxvb3BDb3VudCA9IExvb3BDb3VudCwgNAorCX0gOzsKKwl7CisJCS5tbWkKKwkJbm9wCQkweDAKKwkJbm9wCQkweDAKKwkJbW92LmkJCWFyLmxjID0gTG9vcENvdW50CisJfSA7OworCisvKiBOb3cgY29tZXMgdGhlIHVucm9sbGVkIGxvb3A6ICovCisKKy5yYzRQcm9sb2d1ZToKK19fXworCiskaXRlcmF0aW9uID0gMDsKKworIyBHZW5lcmF0ZSB0aGUgcHJvbG9ndWU6CiskcHJlZGljYXRlcyA9IDE7Citmb3IgKCRpID0gMDsgJGkgPCAkcGhhc2VzOyArKyRpKSB7CisgICAgJmVtaXRfYm9keSAoXCRjb2RlLCBcJGJ5cGFzcywgJGl0ZXJhdGlvbisrLCAkcHJlZGljYXRlcyk7CisgICAgJHByZWRpY2F0ZXMgPSAoJHByZWRpY2F0ZXMgPDwgMSkgfCAxOworfQorCiskY29kZS49PDxfX187CisucmM0TG9vcDoKK19fXworCisjIEdlbmVyYXRlIHRoZSBib2R5OgorZm9yICgkaSA9IDA7ICRpIDwgJHVucm9sbF9jb3VudCokcGhhc2VzOyArKyRpKSB7CisgICAgJmVtaXRfYm9keSAoXCRjb2RlLCBcJGJ5cGFzcywgJGl0ZXJhdGlvbisrLCAkcHJlZGljYXRlcyk7Cit9CisKKyRjb2RlLj08PF9fXzsKKy5yYzRFcGlsb2d1ZToKK19fXworCisjIEdlbmVyYXRlIHRoZSBlcGlsb2d1ZToKK2ZvciAoJGkgPSAwOyAkaSA8ICRwaGFzZXM7ICsrJGkpIHsKKyAgICAkcHJlZGljYXRlcyA8PD0gMTsKKyAgICAmZW1pdF9ib2R5IChcJGNvZGUsIFwkYnlwYXNzLCAkaXRlcmF0aW9uKyssICRwcmVkaWNhdGVzKTsKK30KKworJGNvZGUuPTw8X19fOworCXsKKwkJLm1taQorCQlsZmV0Y2gubnQxCVtFbmRQdHJdCS8vIGZldGNoIGxpbmUgd2l0aCBsYXN0IGJ5dGUKKwkJbW92CQlJRmluYWwgPSBJWzFdCisJCW5vcAkJMHgwCisJfQorCisucmM0UmVtYWluZGVyOgorCXsKKwkJLm1taQorCQlzdWIJCVJlbWFpbmRlciA9IEVuZFB0ciwgSW5QdHIJLy8gQ2FsY3VsYXRlCisJCQkJCQkJCS8vICMgb2YgYnl0ZXMKKwkJCQkJCQkJLy8gbGVmdCAtIDEKKwkJbm9wCQkweDAKKwkJbm9wCQkweDAKKwl9IDs7CisJeworCQkubWliCisJCWNtcC5lcQkJcERvbmUsIHAwID0gLTEsIFJlbWFpbmRlciAvLyBkb25lIGFscmVhZHk/CisJCW1vdi5pCQlhci5sYyA9IFJlbWFpbmRlcgorKHBEb25lKQkJYnIuY29uZC5kcHRrLmZldyAucmM0Q29tcGxldGUKKwl9CisKKy8qIERvIHRoZSByZW1haW5pbmcgYnl0ZXMgdmlhIHRoZSBjb21wYWN0LCBtb2R1bG8tc2NoZWR1bGVkIGxvb3AgKi8KKworCQlNT0RTQ0hFRF9SQzRfUFJPTE9HVUUKKwkJTU9EU0NIRURfUkM0X0xPT1AoLlJDNFJlc3RMb29wKQorCisucmM0Q29tcGxldGU6CisJeworCQkubW1pCisJCWFkZAkJS1RhYmxlID0gLVNaLCBLVGFibGUKKwkJYWRkCQlJRmluYWwgPSAtMSwgSUZpbmFsCisJCW1vdgkJYXIubGMgPSBMQ1NhdmUKKwl9IDs7CisJeworCQkubWlpCisJCVNLRVkJCVtLVGFibGVdID0gSiwtU1oKKwkJenh0MQkJSUZpbmFsID0gSUZpbmFsCisJCW1vdgkJcHIgPSBQUlNhdmUsIDB4MUZGRkYKKwl9IDs7CisJeworCQkubWliCisJCVNLRVkJCVtLVGFibGVdID0gSUZpbmFsCisJCWFkZAkJUmV0VmFsID0gMSwgcjAKKwkJYnIucmV0LnNwdGsuZmV3CXJwCisJfSA7OworX19fCisKKyMgTGFzdCBidXQgbm90IGxlYXN0LCBlbWl0IHRoZSBjb2RlIGZvciB0aGUgYnlwYXNzLWNvZGUgb2YgdGhlIHVucm9sbGVkIGxvb3A6CisKKyRjb2RlLj0kYnlwYXNzOworCiskY29kZS49PDxfX187CisJLmVuZHAgUkM0CitfX18KKworcHJpbnQgJGNvZGU7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtczM5MHgucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQtczM5MHgucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2ODFmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzQvYXNtL3JjNC1zMzkweC5wbApAQCAtMCwwICsxLDIwNSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRmVicnVhcnkgMjAwOQorIworIyBQZXJmb3JtYW5jZSBpcyAyeCBvZiBnY2MgMy40LjYgb24gejEwLiBDb2RpbmcgInNlY3JldCIgaXMgdG8KKyMgImNsdXN0ZXIiIEFkZHJlc3MgR2VuZXJhdGlvbiBJbnRlcmxvY2tzLCBzbyB0aGF0IG9uZSBwaXBlbGluZSBzdGFsbAorIyByZXNvbHZlcyBzZXZlcmFsIGRlcGVuZGVuY2llcy4KKworJHJwPSIlcjE0IjsKKyRzcD0iJXIxNSI7CiskY29kZT08PF9fXzsKKy50ZXh0CisKK19fXworCisjIHZvaWQgUkM0KFJDNF9LRVkgKmtleSxzaXplX3QgbGVuLGNvbnN0IHZvaWQgKmlucCx2b2lkICpvdXQpCit7CiskYWNjPSIlcjAiOworJGNudD0iJXIxIjsKKyRrZXk9IiVyMiI7CiskbGVuPSIlcjMiOworJGlucD0iJXI0IjsKKyRvdXQ9IiVyNSI7CisKK0BYWD0oIiVyNiIsIiVyNyIpOworQFRYPSgiJXI4IiwiJXI5Iik7CiskWVk9IiVyMTAiOworJFRZPSIlcjExIjsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCVJDNAorLnR5cGUJUkM0LFxAZnVuY3Rpb24KKy5hbGlnbgk2NAorUkM0OgorCXN0bWcJJXI2LCVyMTEsNDgoJHNwKQorCWxsZ2MJJFhYWzBdLDAoJGtleSkKKwlsbGdjCSRZWSwxKCRrZXkpCisJbGEJJFhYWzBdLDEoJFhYWzBdKQorCW5pbGwJJFhYWzBdLDB4ZmYKKwlzcmxnCSRjbnQsJGxlbiwzCisJbHRncgkkY250LCRjbnQKKwlsbGdjCSRUWFswXSwyKCRYWFswXSwka2V5KQorCWp6CS5Mc2hvcnQKKwlqCS5Mb29wOAorCisuYWxpZ24JNjQKKy5Mb29wODoKK19fXworZm9yICgkaT0wOyRpPDg7JGkrKykgeworJGNvZGUuPTw8X19fOworCWxhCSRZWSwwKCRZWSwkVFhbMF0pCSMgJGkKKwluaWxsCSRZWSwyNTUKKwlsYQkkWFhbMV0sMSgkWFhbMF0pCisJbmlsbAkkWFhbMV0sMjU1CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGk9PTEpOworCWxsZ2MJJGFjYywyKCRUWSwka2V5KQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPjEpOworCXNsbGcJJGFjYywkYWNjLDgKKwlpYwkkYWNjLDIoJFRZLCRrZXkpCitfX18KKyRjb2RlLj08PF9fXzsKKwlsbGdjCSRUWSwyKCRZWSwka2V5KQorCXN0YwkkVFhbMF0sMigkWVksJGtleSkKKwlsbGdjCSRUWFsxXSwyKCRYWFsxXSwka2V5KQorCXN0YwkkVFksMigkWFhbMF0sJGtleSkKKwljcgkkWFhbMV0sJFlZCisJam5lCS5MY21vdiRpCisJbGEJJFRYWzFdLDAoJFRYWzBdKQorLkxjbW92JGk6CisJbGEJJFRZLDAoJFRZLCRUWFswXSkKKwluaWxsCSRUWSwyNTUKK19fXworcHVzaChAVFgsc2hpZnQoQFRYKSk7IHB1c2goQFhYLHNoaWZ0KEBYWCkpOyAgICAgIyAicm90YXRlIiByZWdpc3RlcnMKK30KKworJGNvZGUuPTw8X19fOworCWxnCSRUWFsxXSwwKCRpbnApCisJc2xsZwkkYWNjLCRhY2MsOAorCWxhCSRpbnAsOCgkaW5wKQorCWljCSRhY2MsMigkVFksJGtleSkKKwl4Z3IJJGFjYywkVFhbMV0KKwlzdGcJJGFjYywwKCRvdXQpCisJbGEJJG91dCw4KCRvdXQpCisJYnJjdAkkY250LC5Mb29wOAorCisuTHNob3J0OgorCWxnaGkJJGFjYyw3CisJbmdyCSRsZW4sJGFjYworCWp6CS5MZXhpdAorCWoJLkxvb3AxCisKKy5hbGlnbgkxNgorLkxvb3AxOgorCWxhCSRZWSwwKCRZWSwkVFhbMF0pCisJbmlsbAkkWVksMjU1CisJbGxnYwkkVFksMigkWVksJGtleSkKKwlzdGMJJFRYWzBdLDIoJFlZLCRrZXkpCisJc3RjCSRUWSwyKCRYWFswXSwka2V5KQorCWFyCSRUWSwkVFhbMF0KKwlhaGkJJFhYWzBdLDEKKwluaWxsCSRUWSwyNTUKKwluaWxsCSRYWFswXSwyNTUKKwlsbGdjCSRhY2MsMCgkaW5wKQorCWxhCSRpbnAsMSgkaW5wKQorCWxsZ2MJJFRZLDIoJFRZLCRrZXkpCisJbGxnYwkkVFhbMF0sMigkWFhbMF0sJGtleSkKKwl4cgkkYWNjLCRUWQorCXN0YwkkYWNjLDAoJG91dCkKKwlsYQkkb3V0LDEoJG91dCkKKwlicmN0CSRsZW4sLkxvb3AxCisKKy5MZXhpdDoKKwlhaGkJJFhYWzBdLC0xCisJc3RjCSRYWFswXSwwKCRrZXkpCisJc3RjCSRZWSwxKCRrZXkpCisJbG1nCSVyNiwlcjExLDQ4KCRzcCkKKwlicgkkcnAKKy5zaXplCVJDNCwuLVJDNAorLnN0cmluZwkiUkM0IGZvciBzMzkweCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKworX19fCit9CisKKyMgdm9pZCBSQzRfc2V0X2tleShSQzRfS0VZICprZXksdW5zaWduZWQgaW50IGxlbixjb25zdCB2b2lkICppbnApCit7CiskY250PSIlcjAiOworJGlkeD0iJXIxIjsKKyRrZXk9IiVyMiI7CiskbGVuPSIlcjMiOworJGlucD0iJXI0IjsKKyRhY2M9IiVyNSI7CiskZGF0PSIlcjYiOworJGlrZXk9IiVyNyI7CiskaWlucD0iJXI4IjsKKworJGNvZGUuPTw8X19fOworLmdsb2JsCVJDNF9zZXRfa2V5CisudHlwZQlSQzRfc2V0X2tleSxcQGZ1bmN0aW9uCisuYWxpZ24JNjQKK1JDNF9zZXRfa2V5OgorCXN0bWcJJXI2LCVyOCw0OCgkc3ApCisJbGhpCSRjbnQsMjU2CisJbGEJJGlkeCwwKCVyMCkKKwlzdGgJJGlkeCwwKCRrZXkpCisuYWxpZ24JNAorLkwxc3Rsb29wOgorCXN0YwkkaWR4LDIoJGlkeCwka2V5KQorCWxhCSRpZHgsMSgkaWR4KQorCWJyY3QJJGNudCwuTDFzdGxvb3AKKworCWxnaGkJJGlrZXksLTI1NgorCWxyCSRjbnQsJGxlbgorCWxhCSRpaW5wLDAoJXIwKQorCWxhCSRpZHgsMCglcjApCisuYWxpZ24JMTYKKy5MMm5kbG9vcDoKKwlsbGdjCSRhY2MsMisyNTYoJGlrZXksJGtleSkKKwlsbGdjCSRkYXQsMCgkaWlucCwkaW5wKQorCWxhCSRpZHgsMCgkaWR4LCRhY2MpCisJbGEJJGlrZXksMSgkaWtleSkKKwlsYQkkaWR4LDAoJGlkeCwkZGF0KQorCW5pbGwJJGlkeCwyNTUKKwlsYQkkaWlucCwxKCRpaW5wKQorCXRtbAkkaWtleSwyNTUKKwlsbGdjCSRkYXQsMigkaWR4LCRrZXkpCisJc3RjCSRkYXQsMisyNTYtMSgkaWtleSwka2V5KQorCXN0YwkkYWNjLDIoJGlkeCwka2V5KQorCWp6CS5MZG9uZQorCWJyY3QJJGNudCwuTDJuZGxvb3AKKwlscgkkY250LCRsZW4KKwlsYQkkaWlucCwwKCVyMCkKKwlqCS5MMm5kbG9vcAorLkxkb25lOgorCWxtZwklcjYsJXI4LDQ4KCRzcCkKKwlicgkkcnAKKy5zaXplCVJDNF9zZXRfa2V5LC4tUkM0X3NldF9rZXkKKworX19fCit9CisKKyMgY29uc3QgY2hhciAqUkM0X29wdGlvbnMoKQorJGNvZGUuPTw8X19fOworLmdsb2JsCVJDNF9vcHRpb25zCisudHlwZQlSQzRfb3B0aW9ucyxcQGZ1bmN0aW9uCisuYWxpZ24JMTYKK1JDNF9vcHRpb25zOgorCWxhcmwJJXIyLC5Mb3B0aW9ucworCWJyCSVyMTQKKy5zaXplCVJDNF9vcHRpb25zLC4tUkM0X29wdGlvbnMKKy5zZWN0aW9uCS5yb2RhdGEKKy5Mb3B0aW9uczoKKy5hbGlnbgk4Cisuc3RyaW5nCSJyYzQoOHgsY2hhcikiCitfX18KKworcHJpbnQgJGNvZGU7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L2FzbS9yYzQteDg2XzY0LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LXg4Nl82NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdiZTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9hc20vcmM0LXg4Nl82NC5wbApAQCAtMCwwICsxLDUwNCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgMi4yMnggUkM0IHR1bmUtdXA6LSkgSXQgc2hvdWxkIGJlIG5vdGVkIHRob3VnaCB0aGF0IG15IGhhbmQgW2FzIGluCisjICJoYW5kLWNvZGVkIGFzc2VtYmxlciJdIGRvZXNuJ3Qgc3RhbmQgZm9yIHRoZSB3aG9sZSBpbXByb3ZlbWVudAorIyBjb2VmZmljaWVudC4gSXQgdHVybmVkIG91dCB0aGF0IGVsaW1pbmF0aW5nIFJDNF9DSEFSIGZyb20gY29uZmlnCisjIGxpbmUgcmVzdWx0cyBpbiB+NDAlIGltcHJvdmVtZW50ICh5ZXMsIGV2ZW4gZm9yIEMgaW1wbGVtZW50YXRpb24pLgorIyBQcmVzdW1hYmx5IGl0IGhhcyBldmVyeXRoaW5nIHRvIGRvIHdpdGggQU1EIGNhY2hlIGFyY2hpdGVjdHVyZSBhbmQKKyMgUkFXIG9yIHdoYXRldmVyIHBlbmFsdGllcy4gT25jZSBhZ2FpbiEgVGhlIG1vZHVsZSAqcmVxdWlyZXMqIGNvbmZpZworIyBsaW5lICp3aXRob3V0KiBSQzRfQ0hBUiEgQXMgZm9yIGNvZGluZyAic2VjcmV0LCIgSSBiZXQgb24gcGFydGlhbAorIyByZWdpc3RlciBhcml0aG1ldGljcy4gRm9yIGV4YW1wbGUgaW5zdGVhZCBvZiAnaW5jICVyODsgYW5kICQyNTUsJXI4JworIyBJIHNpbXBseSAnaW5jICVyOGInLiBFdmVuIHRob3VnaCBvcHRpbWl6YXRpb24gbWFudWFsIGRpc2NvdXJhZ2VzCisjIHRvIG9wZXJhdGUgb24gcGFydGlhbCByZWdpc3RlcnMsIGl0IHR1cm5lZCBvdXQgdG8gYmUgdGhlIGJlc3QgYmV0LgorIyBBdCBsZWFzdCBmb3IgQU1ELi4uIEhvdyBJQTMyRSB3b3VsZCBwZXJmb3JtIHJlbWFpbnMgdG8gYmUgc2Vlbi4uLgorCisjIEFzIHdhcyBzaG93biBieSBNYXJjIEJldmFuZCByZW9yZGVyaW5nIG9mIGNvdXBsZSBvZiBsb2FkIG9wZXJhdGlvbnMKKyMgcmVzdWx0cyBpbiBldmVuIGhpZ2hlciBwZXJmb3JtYW5jZSBnYWluIG9mIDMuM3g6LSkgQXQgbGVhc3Qgb24KKyMgT3B0ZXJvbi4uLiBGb3IgcmVmZXJlbmNlLCAxeCBpbiB0aGlzIGNhc2UgaXMgUkM0X0NIQVIgQy1jb2RlCisjIGNvbXBpbGVkIHdpdGggZ2NjIDMuMy4yLCB3aGljaCBwZXJmb3JtcyBhdCB+NTRNQnBzIHBlciAxR0h6IGNsb2NrLgorIyBMYXR0ZXIgbWVhbnMgdGhhdCBpZiB5b3Ugd2FudCB0byAqZXN0aW1hdGUqIHdoYXQgdG8gZXhwZWN0IGZyb20KKyMgKnlvdXIqIE9wdGVyb24sIHRoZW4gbXVsdGlwbHkgNTQgYnkgMy4zIGFuZCBjbG9jayBmcmVxdWVuY3kgaW4gR0h6LgorCisjIEludGVsIFA0IEVNNjRUIGNvcmUgd2FzIGZvdW5kIHRvIHJ1biB0aGUgQU1ENjQgY29kZSByZWFsbHkgc2xvdy4uLgorIyBUaGUgb25seSB3YXkgdG8gYWNoaWV2ZSBjb21wYXJhYmxlIHBlcmZvcm1hbmNlIG9uIFA0IHdhcyB0byBrZWVwCisjIFJDNF9DSEFSLiBLaW5kIG9mIGlyb25pYywgaHVoPyBBcyBpdCdzIGFwcGFyZW50bHkgaW1wb3NzaWJsZSB0bworIyBjb21wb3NlIGJsZW5kZWQgY29kZSwgd2hpY2ggd291bGQgcGVyZm9ybSBldmVuIHdpdGhpbiAzMCUgbWFyZ2luYWwKKyMgb24gZWl0aGVyIEFNRCBhbmQgSW50ZWwgcGxhdGZvcm1zLCBJIGltcGxlbWVudCBib3RoIGNhc2VzLiBTZWUKKyMgcmM0X3NrZXkuYyBmb3IgZnVydGhlciBkZXRhaWxzLi4uCisKKyMgUDQgRU02NFQgY29yZSBhcHBlYXJzIHRvIGJlICJhbGxlcmdpYyIgdG8gNjQtYml0IGluYy9kZWMuIFJlcGxhY2luZyAKKyMgdGhvc2Ugd2l0aCBhZGQvc3ViIHJlc3VsdHMgaW4gNTAlIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9mIGZvbGRlZAorIyBsb29wLi4uCisKKyMgQXMgd2FzIHNob3duIGJ5IFpvdSBOYW5oYWkgbG9vcCB1bnJvbGxpbmcgY2FuIGltcHJvdmUgSW50ZWwgRU02NFQKKyMgcGVyZm9ybWFuY2UgYnkgPjMwJSBbdW5saWtlIFA0IDMyLWJpdCBjYXNlIHRoYXQgaXNdLiBCdXQgdGhpcyBpcworIyBwcm92aWRlZCB0aGF0IGxvYWRzIGFyZSByZW9yZGVyZWQgZXZlbiBtb3JlIGFnZ3Jlc3NpdmVseSEgQm90aCBjb2RlCisjIHBhdGhlcywgQU1ENjQgYW5kIEVNNjRULCByZW9yZGVyIGxvYWRzIGluIGVzc2VudGlhbGx5IHNhbWUgbWFubmVyCisjIGFzIG15IElBLTY0IGltcGxlbWVudGF0aW9uLiBPbiBPcHRlcm9uIHRoaXMgcmVzdWx0ZWQgaW4gbW9kZXN0IDUlCisjIGltcHJvdmVtZW50IFtJIGhhZCB0byB0ZXN0IGl0XSwgd2hpbGUgZmluYWwgSW50ZWwgUDQgcGVyZm9ybWFuY2UKKyMgYWNoaWV2ZXMgcmVzcGVjdGZ1bCA0MzJNQnBzIG9uIDIuOEdIeiBwcm9jZXNzb3Igbm93LiBGb3IgcmVmZXJlbmNlLgorIyBJZiBleGVjdXRlZCBvbiBYZW9uLCBjdXJyZW50IFJDNF9DSEFSIGNvZGUtcGF0aCBpcyAyLjd4IGZhc3RlciB0aGFuCisjIFJDNF9JTlQgY29kZS1wYXRoLiBXaGlsZSBpZiBleGVjdXRlZCBvbiBPcHRlcm9uLCBpdCdzIG9ubHkgMjUlCisjIHNsb3dlciB0aGFuIHRoZSBSQzRfSU5UIG9uZSBbbWVhbmluZyB0aGF0IGlmIENQVSC1LWFyY2ggZGV0ZWN0aW9uCisjIGlzIG5vdCBpbXBsZW1lbnRlZCwgdGhlbiB0aGlzIGZpbmFsIFJDNF9DSEFSIGNvZGUtcGF0aCBzaG91bGQgYmUKKyMgcHJlZmVycmVkLCBhcyBpdCBwcm92aWRlcyBiZXR0ZXIgKmFsbC1yb3VuZCogcGVyZm9ybWFuY2VdLgorCisjIEludGVsIENvcmUyIHdhcyBvYnNlcnZlZCB0byBwZXJmb3JtIHBvb3JseSBvbiBib3RoIGNvZGUgcGF0aHM6LSggSXQKKyMgYXBwYXJlbnRseSBzdWZmZXJzIGZyb20gc29tZSBraW5kIG9mIHBhcnRpYWwgcmVnaXN0ZXIgc3RhbGwsIHdoaWNoCisjIG9jY3VycyBpbiA2NC1iaXQgbW9kZSBvbmx5IFthcyB2aXJ0dWFsbHkgaWRlbnRpY2FsIDMyLWJpdCBsb29wIHdhcworIyBvYnNlcnZlZCB0byBvdXRwZXJmb3JtIDY0LWJpdCBvbmUgYnkgYWxtb3N0IDUwJV0uIEFkZGluZyB0d28gbW92emIgdG8KKyMgY2xvb3AxIGJvb3N0cyBpdHMgcGVyZm9ybWFuY2UgYnkgODAlISBUaGlzIGxvb3AgYXBwZWFycyB0byBiZSBvcHRpbWFsCisjIGZpdCBmb3IgQ29yZTIgYW5kIHRoZXJlZm9yZSB0aGUgY29kZSB3YXMgbW9kaWZpZWQgdG8gc2tpcCBjbG9vcDggb24KKyMgdGhpcyBDUFUuCisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCiskd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXg4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS94ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOworCitvcGVuIFNURE9VVCwifCAkXlggJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworCiskZGF0PSIlcmRpIjsJICAgICMgYXJnMQorJGxlbj0iJXJzaSI7CSAgICAjIGFyZzIKKyRpbnA9IiVyZHgiOwkgICAgIyBhcmczCiskb3V0PSIlcmN4IjsJICAgICMgYXJnNAorCitAWFg9KCIlcjgiLCIlcjEwIik7CitAVFg9KCIlcjkiLCIlcjExIik7CiskWVk9IiVyMTIiOworJFRZPSIlcjEzIjsKKworJGNvZGU9PDxfX187CisudGV4dAorCisuZ2xvYmwJUkM0CisudHlwZQlSQzQsXEBmdW5jdGlvbiw0CisuYWxpZ24JMTYKK1JDNDoJb3IJJGxlbiwkbGVuCisJam5lCS5MZW50cnkKKwlyZXQKKy5MZW50cnk6CisJcHVzaAklcmJ4CisJcHVzaAklcjEyCisJcHVzaAklcjEzCisuTHByb2xvZ3VlOgorCisJYWRkCVwkOCwkZGF0CisJbW92bAktOCgkZGF0KSwkWFhbMF0jZAorCW1vdmwJLTQoJGRhdCksJFlZI2QKKwljbXBsCVwkLTEsMjU2KCRkYXQpCisJamUJLkxSQzRfQ0hBUgorCWluYwkkWFhbMF0jYgorCW1vdmwJKCRkYXQsJFhYWzBdLDQpLCRUWFswXSNkCisJdGVzdAlcJC04LCRsZW4KKwlqegkuTGxvb3AxCisJam1wCS5MbG9vcDgKKy5hbGlnbgkxNgorLkxsb29wODoKK19fXworZm9yICgkaT0wOyRpPDg7JGkrKykgeworJGNvZGUuPTw8X19fOworCWFkZAkkVFhbMF0jYiwkWVkjYgorCW1vdgkkWFhbMF0sJFhYWzFdCisJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKKwlyb3IJXCQ4LCVyYXgJCQkjIHJvciBpcyByZWR1bmRhbnQgd2hlbiAkaT0wCisJaW5jCSRYWFsxXSNiCisJbW92bAkoJGRhdCwkWFhbMV0sNCksJFRYWzFdI2QKKwljbXAJJFhYWzFdLCRZWQorCW1vdmwJJFRYWzBdI2QsKCRkYXQsJFlZLDQpCisJY21vdmUJJFRYWzBdLCRUWFsxXQorCW1vdmwJJFRZI2QsKCRkYXQsJFhYWzBdLDQpCisJYWRkCSRUWFswXSNiLCRUWSNiCisJbW92YgkoJGRhdCwkVFksNCksJWFsCitfX18KK3B1c2goQFRYLHNoaWZ0KEBUWCkpOyBwdXNoKEBYWCxzaGlmdChAWFgpKTsJIyAicm90YXRlIiByZWdpc3RlcnMKK30KKyRjb2RlLj08PF9fXzsKKwlyb3IJXCQ4LCVyYXgKKwlzdWIJXCQ4LCRsZW4KKworCXhvcgkoJGlucCksJXJheAorCWFkZAlcJDgsJGlucAorCW1vdgklcmF4LCgkb3V0KQorCWFkZAlcJDgsJG91dAorCisJdGVzdAlcJC04LCRsZW4KKwlqbnoJLkxsb29wOAorCWNtcAlcJDAsJGxlbgorCWpuZQkuTGxvb3AxCisJam1wCS5MZXhpdAorCisuYWxpZ24JMTYKKy5MbG9vcDE6CisJYWRkCSRUWFswXSNiLCRZWSNiCisJbW92bAkoJGRhdCwkWVksNCksJFRZI2QKKwltb3ZsCSRUWFswXSNkLCgkZGF0LCRZWSw0KQorCW1vdmwJJFRZI2QsKCRkYXQsJFhYWzBdLDQpCisJYWRkCSRUWSNiLCRUWFswXSNiCisJaW5jCSRYWFswXSNiCisJbW92bAkoJGRhdCwkVFhbMF0sNCksJFRZI2QKKwltb3ZsCSgkZGF0LCRYWFswXSw0KSwkVFhbMF0jZAorCXhvcmIJKCRpbnApLCRUWSNiCisJaW5jCSRpbnAKKwltb3ZiCSRUWSNiLCgkb3V0KQorCWluYwkkb3V0CisJZGVjCSRsZW4KKwlqbnoJLkxsb29wMQorCWptcAkuTGV4aXQKKworLmFsaWduCTE2CisuTFJDNF9DSEFSOgorCWFkZAlcJDEsJFhYWzBdI2IKKwltb3Z6YgkoJGRhdCwkWFhbMF0pLCRUWFswXSNkCisJdGVzdAlcJC04LCRsZW4KKwlqegkuTGNsb29wMQorCWNtcGwJXCQwLDI2MCgkZGF0KQorCWpuegkuTGNsb29wMQorCWptcAkuTGNsb29wOAorLmFsaWduCTE2CisuTGNsb29wODoKKwltb3YJKCRpbnApLCVlYXgKKwltb3YJNCgkaW5wKSwlZWJ4CitfX18KKyMgdW5yb2xsIDJ4NC13aXNlLCBiZWNhdXNlIDY0LWJpdCByb3RhdGVzIGtpbGwgSW50ZWwgUDQuLi4KK2ZvciAoJGk9MDskaTw0OyRpKyspIHsKKyRjb2RlLj08PF9fXzsKKwlhZGQJJFRYWzBdI2IsJFlZI2IKKwlsZWEJMSgkWFhbMF0pLCRYWFsxXQorCW1vdnpiCSgkZGF0LCRZWSksJFRZI2QKKwltb3Z6YgkkWFhbMV0jYiwkWFhbMV0jZAorCW1vdnpiCSgkZGF0LCRYWFsxXSksJFRYWzFdI2QKKwltb3ZiCSRUWFswXSNiLCgkZGF0LCRZWSkKKwljbXAJJFhYWzFdLCRZWQorCW1vdmIJJFRZI2IsKCRkYXQsJFhYWzBdKQorCWpuZQkuTGNtb3YkaQkJCSMgSW50ZWwgY21vdiBpcyBzbG9vb293Li4uCisJbW92CSRUWFswXSwkVFhbMV0KKy5MY21vdiRpOgorCWFkZAkkVFhbMF0jYiwkVFkjYgorCXhvcgkoJGRhdCwkVFkpLCVhbAorCXJvcglcJDgsJWVheAorX19fCitwdXNoKEBUWCxzaGlmdChAVFgpKTsgcHVzaChAWFgsc2hpZnQoQFhYKSk7CSMgInJvdGF0ZSIgcmVnaXN0ZXJzCit9Citmb3IgKCRpPTQ7JGk8ODskaSsrKSB7CiskY29kZS49PDxfX187CisJYWRkCSRUWFswXSNiLCRZWSNiCisJbGVhCTEoJFhYWzBdKSwkWFhbMV0KKwltb3Z6YgkoJGRhdCwkWVkpLCRUWSNkCisJbW92emIJJFhYWzFdI2IsJFhYWzFdI2QKKwltb3Z6YgkoJGRhdCwkWFhbMV0pLCRUWFsxXSNkCisJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCisJY21wCSRYWFsxXSwkWVkKKwltb3ZiCSRUWSNiLCgkZGF0LCRYWFswXSkKKwlqbmUJLkxjbW92JGkJCQkjIEludGVsIGNtb3YgaXMgc2xvb29vdy4uLgorCW1vdgkkVFhbMF0sJFRYWzFdCisuTGNtb3YkaToKKwlhZGQJJFRYWzBdI2IsJFRZI2IKKwl4b3IJKCRkYXQsJFRZKSwlYmwKKwlyb3IJXCQ4LCVlYngKK19fXworcHVzaChAVFgsc2hpZnQoQFRYKSk7IHB1c2goQFhYLHNoaWZ0KEBYWCkpOwkjICJyb3RhdGUiIHJlZ2lzdGVycworfQorJGNvZGUuPTw8X19fOworCWxlYQktOCgkbGVuKSwkbGVuCisJbW92CSVlYXgsKCRvdXQpCisJbGVhCTgoJGlucCksJGlucAorCW1vdgklZWJ4LDQoJG91dCkKKwlsZWEJOCgkb3V0KSwkb3V0CisKKwl0ZXN0CVwkLTgsJGxlbgorCWpuegkuTGNsb29wOAorCWNtcAlcJDAsJGxlbgorCWpuZQkuTGNsb29wMQorCWptcAkuTGV4aXQKK19fXworJGNvZGUuPTw8X19fOworLmFsaWduCTE2CisuTGNsb29wMToKKwlhZGQJJFRYWzBdI2IsJFlZI2IKKwltb3Z6YgkoJGRhdCwkWVkpLCRUWSNkCisJbW92YgkkVFhbMF0jYiwoJGRhdCwkWVkpCisJbW92YgkkVFkjYiwoJGRhdCwkWFhbMF0pCisJYWRkCSRUWFswXSNiLCRUWSNiCisJYWRkCVwkMSwkWFhbMF0jYgorCW1vdnpiCSRUWSNiLCRUWSNkCisJbW92emIJJFhYWzBdI2IsJFhYWzBdI2QKKwltb3Z6YgkoJGRhdCwkVFkpLCRUWSNkCisJbW92emIJKCRkYXQsJFhYWzBdKSwkVFhbMF0jZAorCXhvcmIJKCRpbnApLCRUWSNiCisJbGVhCTEoJGlucCksJGlucAorCW1vdmIJJFRZI2IsKCRvdXQpCisJbGVhCTEoJG91dCksJG91dAorCXN1YglcJDEsJGxlbgorCWpuegkuTGNsb29wMQorCWptcAkuTGV4aXQKKworLmFsaWduCTE2CisuTGV4aXQ6CisJc3ViCVwkMSwkWFhbMF0jYgorCW1vdmwJJFhYWzBdI2QsLTgoJGRhdCkKKwltb3ZsCSRZWSNkLC00KCRkYXQpCisKKwltb3YJKCVyc3ApLCVyMTMKKwltb3YJOCglcnNwKSwlcjEyCisJbW92CTE2KCVyc3ApLCVyYngKKwlhZGQJXCQyNCwlcnNwCisuTGVwaWxvZ3VlOgorCXJldAorLnNpemUJUkM0LC4tUkM0CitfX18KKworJGlkeD0iJXI4IjsKKyRpZG89IiVyOSI7CisKKyRjb2RlLj08PF9fXzsKKy5leHRlcm4JT1BFTlNTTF9pYTMyY2FwX1AKKy5nbG9ibAlSQzRfc2V0X2tleQorLnR5cGUJUkM0X3NldF9rZXksXEBmdW5jdGlvbiwzCisuYWxpZ24JMTYKK1JDNF9zZXRfa2V5OgorCWxlYQk4KCRkYXQpLCRkYXQKKwlsZWEJKCRpbnAsJGxlbiksJGlucAorCW5lZwkkbGVuCisJbW92CSRsZW4sJXJjeAorCXhvcgklZWF4LCVlYXgKKwl4b3IJJGlkbywkaWRvCisJeG9yCSVyMTAsJXIxMAorCXhvcgklcjExLCVyMTEKKworCW1vdglPUEVOU1NMX2lhMzJjYXBfUCglcmlwKSwkaWR4I2QKKwlidAlcJDIwLCRpZHgjZAorCWpuYwkuTHcxc3Rsb29wCisJYnQJXCQzMCwkaWR4I2QKKwlzZXRjCSRpZG8jYgorCW1vdgkkaWRvI2QsMjYwKCRkYXQpCisJam1wCS5MYzFzdGxvb3AKKworLmFsaWduCTE2CisuTHcxc3Rsb29wOgorCW1vdgklZWF4LCgkZGF0LCVyYXgsNCkKKwlhZGQJXCQxLCVhbAorCWpuYwkuTHcxc3Rsb29wCisKKwl4b3IJJGlkbywkaWRvCisJeG9yCSRpZHgsJGlkeAorLmFsaWduCTE2CisuTHcybmRsb29wOgorCW1vdgkoJGRhdCwkaWRvLDQpLCVyMTBkCisJYWRkCSgkaW5wLCRsZW4sMSksJGlkeCNiCisJYWRkCSVyMTBiLCRpZHgjYgorCWFkZAlcJDEsJGxlbgorCW1vdgkoJGRhdCwkaWR4LDQpLCVyMTFkCisJY21vdnoJJXJjeCwkbGVuCisJbW92CSVyMTBkLCgkZGF0LCRpZHgsNCkKKwltb3YJJXIxMWQsKCRkYXQsJGlkbyw0KQorCWFkZAlcJDEsJGlkbyNiCisJam5jCS5MdzJuZGxvb3AKKwlqbXAJLkxleGl0X2tleQorCisuYWxpZ24JMTYKKy5MYzFzdGxvb3A6CisJbW92CSVhbCwoJGRhdCwlcmF4KQorCWFkZAlcJDEsJWFsCisJam5jCS5MYzFzdGxvb3AKKworCXhvcgkkaWRvLCRpZG8KKwl4b3IJJGlkeCwkaWR4CisuYWxpZ24JMTYKKy5MYzJuZGxvb3A6CisJbW92CSgkZGF0LCRpZG8pLCVyMTBiCisJYWRkCSgkaW5wLCRsZW4pLCRpZHgjYgorCWFkZAklcjEwYiwkaWR4I2IKKwlhZGQJXCQxLCRsZW4KKwltb3YJKCRkYXQsJGlkeCksJXIxMWIKKwlqbnoJLkxjbm93cmFwCisJbW92CSVyY3gsJGxlbgorLkxjbm93cmFwOgorCW1vdgklcjEwYiwoJGRhdCwkaWR4KQorCW1vdgklcjExYiwoJGRhdCwkaWRvKQorCWFkZAlcJDEsJGlkbyNiCisJam5jCS5MYzJuZGxvb3AKKwltb3ZsCVwkLTEsMjU2KCRkYXQpCisKKy5hbGlnbgkxNgorLkxleGl0X2tleToKKwl4b3IJJWVheCwlZWF4CisJbW92CSVlYXgsLTgoJGRhdCkKKwltb3YJJWVheCwtNCgkZGF0KQorCXJldAorLnNpemUJUkM0X3NldF9rZXksLi1SQzRfc2V0X2tleQorCisuZ2xvYmwJUkM0X29wdGlvbnMKKy50eXBlCVJDNF9vcHRpb25zLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorUkM0X29wdGlvbnM6CisJbGVhCS5Mb3B0cyglcmlwKSwlcmF4CisJbW92CU9QRU5TU0xfaWEzMmNhcF9QKCVyaXApLCVlZHgKKwlidAlcJDIwLCVlZHgKKwlqbmMJLkxkb25lCisJYWRkCVwkMTIsJXJheAorCWJ0CVwkMzAsJWVkeAorCWpuYwkuTGRvbmUKKwlhZGQJXCQxMywlcmF4CisuTGRvbmU6CisJcmV0CisuYWxpZ24JNjQKKy5Mb3B0czoKKy5hc2NpegkicmM0KDh4LGludCkiCisuYXNjaXoJInJjNCg4eCxjaGFyKSIKKy5hc2NpegkicmM0KDF4LGNoYXIpIgorLmFzY2l6CSJSQzQgZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgk2NAorLnNpemUJUkM0X29wdGlvbnMsLi1SQzRfb3B0aW9ucworX19fCisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCXN0cmVhbV9zZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorc3RyZWFtX3NlX2hhbmRsZXI6CisJcHVzaAklcnNpCisJcHVzaAklcmRpCisJcHVzaAklcmJ4CisJcHVzaAklcmJwCisJcHVzaAklcjEyCisJcHVzaAklcjEzCisJcHVzaAklcjE0CisJcHVzaAklcjE1CisJcHVzaGZxCisJc3ViCVwkNjQsJXJzcAorCisJbW92CTEyMCgkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UmF4CisJbW92CTI0OCgkY29udGV4dCksJXJieAkjIHB1bGwgY29udGV4dC0+UmlwCisKKwlsZWEJLkxwcm9sb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA8cHJvbG9ndWUgbGFiZWwKKwlqYgkuTGluX3Byb2xvZ3VlCisKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKworCWxlYQkuTGVwaWxvZ3VlKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49ZXBpbG9ndWUgbGFiZWwKKwlqYWUJLkxpbl9wcm9sb2d1ZQorCisJbGVhCTI0KCVyYXgpLCVyYXgKKworCW1vdgktOCglcmF4KSwlcmJ4CisJbW92CS0xNiglcmF4KSwlcjEyCisJbW92CS0yNCglcmF4KSwlcjEzCisJbW92CSVyYngsMTQ0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmJ4CisJbW92CSVyMTIsMjE2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEyCisJbW92CSVyMTMsMjI0KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UjEzCisKKy5MaW5fcHJvbG9ndWU6CisJbW92CTgoJXJheCksJXJkaQorCW1vdgkxNiglcmF4KSwlcnNpCisJbW92CSVyYXgsMTUyKCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNwCisJbW92CSVyc2ksMTY4KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UnNpCisJbW92CSVyZGksMTc2KCRjb250ZXh0KQkjIHJlc3RvcmUgY29udGV4dC0+UmRpCisKKwlqbXAJLkxjb21tb25fc2VoX2V4aXQKKy5zaXplCXN0cmVhbV9zZV9oYW5kbGVyLC4tc3RyZWFtX3NlX2hhbmRsZXIKKworLnR5cGUJa2V5X3NlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitrZXlfc2VfaGFuZGxlcjoKKwlwdXNoCSVyc2kKKwlwdXNoCSVyZGkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoZnEKKwlzdWIJXCQ2NCwlcnNwCisKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworLkxjb21tb25fc2VoX2V4aXQ6CisKKwltb3YJNDAoJGRpc3ApLCVyZGkJCSMgZGlzcC0+Q29udGV4dFJlY29yZAorCW1vdgkkY29udGV4dCwlcnNpCQkjIGNvbnRleHQKKwltb3YJXCQxNTQsJWVjeAkJIyBzaXplb2YoQ09OVEVYVCkKKwkubG9uZwkweGE1NDhmM2ZjCQkjIGNsZDsgcmVwIG1vdnNxCisKKwltb3YJJGRpc3AsJXJzaQorCXhvcgklcmN4LCVyY3gJCSMgYXJnMSwgVU5XX0ZMQUdfTkhBTkRMRVIKKwltb3YJOCglcnNpKSwlcmR4CQkjIGFyZzIsIGRpc3AtPkltYWdlQmFzZQorCW1vdgkwKCVyc2kpLCVyOAkJIyBhcmczLCBkaXNwLT5Db250cm9sUGMKKwltb3YJMTYoJXJzaSksJXI5CQkjIGFyZzQsIGRpc3AtPkZ1bmN0aW9uRW50cnkKKwltb3YJNDAoJXJzaSksJXIxMAkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbGVhCTU2KCVyc2kpLCVyMTEJCSMgJmRpc3AtPkhhbmRsZXJEYXRhCisJbGVhCTI0KCVyc2kpLCVyMTIJCSMgJmRpc3AtPkVzdGFibGlzaGVyRnJhbWUKKwltb3YJJXIxMCwzMiglcnNwKQkJIyBhcmc1CisJbW92CSVyMTEsNDAoJXJzcCkJCSMgYXJnNgorCW1vdgklcjEyLDQ4KCVyc3ApCQkjIGFyZzcKKwltb3YJJXJjeCw1NiglcnNwKQkJIyBhcmc4LCAoTlVMTCkKKwljYWxsCSpfX2ltcF9SdGxWaXJ0dWFsVW53aW5kKCVyaXApCisKKwltb3YJXCQxLCVlYXgJCSMgRXhjZXB0aW9uQ29udGludWVTZWFyY2gKKwlhZGQJXCQ2NCwlcnNwCisJcG9wZnEKKwlwb3AJJXIxNQorCXBvcAklcjE0CisJcG9wCSVyMTMKKwlwb3AJJXIxMgorCXBvcAklcmJwCisJcG9wCSVyYngKKwlwb3AJJXJkaQorCXBvcAklcnNpCisJcmV0Cisuc2l6ZQlrZXlfc2VfaGFuZGxlciwuLWtleV9zZV9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luX1JDNAorCS5ydmEJLkxTRUhfZW5kX1JDNAorCS5ydmEJLkxTRUhfaW5mb19SQzQKKworCS5ydmEJLkxTRUhfYmVnaW5fUkM0X3NldF9rZXkKKwkucnZhCS5MU0VIX2VuZF9SQzRfc2V0X2tleQorCS5ydmEJLkxTRUhfaW5mb19SQzRfc2V0X2tleQorCisuc2VjdGlvbgkueGRhdGEKKy5hbGlnbgk4CisuTFNFSF9pbmZvX1JDNDoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzdHJlYW1fc2VfaGFuZGxlcgorLkxTRUhfaW5mb19SQzRfc2V0X2tleToKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlrZXlfc2VfaGFuZGxlcgorX19fCit9CisKKyRjb2RlID1+IHMvIyhbYndkXSkvJDEvZ207CisKK3ByaW50ICRjb2RlOworCitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTAwYjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzQuYwpAQCAtMCwwICsxLDE5MyBAQAorLyogY3J5cHRvL3JjNC9yYzQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKK2NoYXIgKnVzYWdlW109eworInVzYWdlOiByYzQgYXJnc1xuIiwKKyJcbiIsCisiIC1pbiBhcmcgICAgICAgICAtIGlucHV0IGZpbGUgLSBkZWZhdWx0IHN0ZGluXG4iLAorIiAtb3V0IGFyZyAgICAgICAgLSBvdXRwdXQgZmlsZSAtIGRlZmF1bHQgc3Rkb3V0XG4iLAorIiAta2V5IGtleSAgICAgICAgLSBwYXNzd29yZFxuIiwKK05VTEwKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisJeworCUZJTEUgKmluPU5VTEwsKm91dD1OVUxMOworCWNoYXIgKmluZmlsZT1OVUxMLCpvdXRmaWxlPU5VTEwsKmtleXN0cj1OVUxMOworCVJDNF9LRVkga2V5OworCWNoYXIgYnVmW0JVRlNJWl07CisJaW50IGJhZG9wcz0wLGk7CisJY2hhciAqKnBwOworCXVuc2lnbmVkIGNoYXIgbWRbTUQ1X0RJR0VTVF9MRU5HVEhdOworCisJYXJnYy0tOworCWFyZ3YrKzsKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmIAkoc3RyY21wKCphcmd2LCItaW4iKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJaW5maWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLW91dCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlvdXRmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLWtleSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlrZXlzdHI9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJZnByaW50ZihzdGRlcnIsInVua25vd24gb3B0aW9uICVzXG4iLCphcmd2KTsKKwkJCWJhZG9wcz0xOworCQkJYnJlYWs7CisJCQl9CisJCWFyZ2MtLTsKKwkJYXJndisrOworCQl9CisKKwlpZiAoYmFkb3BzKQorCQl7CitiYWQ6CisJCWZvciAocHA9dXNhZ2U7ICgqcHAgIT0gTlVMTCk7IHBwKyspCisJCQlmcHJpbnRmKHN0ZGVyciwiJXMiLCpwcCk7CisJCWV4aXQoMSk7CisJCX0KKworCWlmIChpbmZpbGUgPT0gTlVMTCkKKwkJaW49c3RkaW47CisJZWxzZQorCQl7CisJCWluPWZvcGVuKGluZmlsZSwiciIpOworCQlpZiAoaW4gPT0gTlVMTCkKKwkJCXsKKwkJCXBlcnJvcigib3BlbiIpOworCQkJZXhpdCgxKTsKKwkJCX0KKworCQl9CisJaWYgKG91dGZpbGUgPT0gTlVMTCkKKwkJb3V0PXN0ZG91dDsKKwllbHNlCisJCXsKKwkJb3V0PWZvcGVuKG91dGZpbGUsInciKTsKKwkJaWYgKG91dCA9PSBOVUxMKQorCQkJeworCQkJcGVycm9yKCJvcGVuIik7CisJCQlleGl0KDEpOworCQkJfQorCQl9CisJCQorI2lmZGVmIE9QRU5TU0xfU1lTX01TRE9TCisJLyogVGhpcyBzaG91bGQgc2V0IHRoZSBmaWxlIHRvIGJpbmFyeSBtb2RlLiAqLworCXsKKyNpbmNsdWRlIDxmY250bC5oPgorCXNldG1vZGUoZmlsZW5vKGluKSxPX0JJTkFSWSk7CisJc2V0bW9kZShmaWxlbm8ob3V0KSxPX0JJTkFSWSk7CisJfQorI2VuZGlmCisKKwlpZiAoa2V5c3RyID09IE5VTEwpCisJCXsgLyogZ2V0IGtleSAqLworCQlpPUVWUF9yZWFkX3B3X3N0cmluZyhidWYsQlVGU0laLCJFbnRlciBSQzQgcGFzc3dvcmQ6IiwwKTsKKwkJaWYgKGkgIT0gMCkKKwkJCXsKKwkJCU9QRU5TU0xfY2xlYW5zZShidWYsQlVGU0laKTsKKwkJCWZwcmludGYoc3RkZXJyLCJiYWQgcGFzc3dvcmQgcmVhZFxuIik7CisJCQlleGl0KDEpOworCQkJfQorCQlrZXlzdHI9YnVmOworCQl9CisKKwlFVlBfRGlnZXN0KCh1bnNpZ25lZCBjaGFyICopa2V5c3RyLHN0cmxlbihrZXlzdHIpLG1kLE5VTEwsRVZQX21kNSgpLE5VTEwpOworCU9QRU5TU0xfY2xlYW5zZShrZXlzdHIsc3RybGVuKGtleXN0cikpOworCVJDNF9zZXRfa2V5KCZrZXksTUQ1X0RJR0VTVF9MRU5HVEgsbWQpOworCQorCWZvcig7OykKKwkJeworCQlpPWZyZWFkKGJ1ZiwxLEJVRlNJWixpbik7CisJCWlmIChpID09IDApIGJyZWFrOworCQlpZiAoaSA8IDApCisJCQl7CisJCQlwZXJyb3IoInJlYWQiKTsKKwkJCWV4aXQoMSk7CisJCQl9CisJCVJDNCgma2V5LCh1bnNpZ25lZCBpbnQpaSwodW5zaWduZWQgY2hhciAqKWJ1ZiwKKwkJCSh1bnNpZ25lZCBjaGFyICopYnVmKTsKKwkJaT1md3JpdGUoYnVmLCh1bnNpZ25lZCBpbnQpaSwxLG91dCk7CisJCWlmIChpICE9IDEpCisJCQl7CisJCQlwZXJyb3IoIndyaXRlIik7CisJCQlleGl0KDEpOworCQkJfQorCQl9CisJZmNsb3NlKG91dCk7CisJZmNsb3NlKGluKTsKKwlleGl0KDApOworCXJldHVybigxKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYzQvcmM0LmggYi9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDFhY2NjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzQuaApAQCAtMCwwICsxLDg5IEBACisvKiBjcnlwdG8vcmM0L3JjNC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1JDNF9ICisjZGVmaW5lIEhFQURFUl9SQzRfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPiAvKiBPUEVOU1NMX05PX1JDNCwgUkM0X0lOVCAqLworI2lmZGVmIE9QRU5TU0xfTk9fUkM0CisjZXJyb3IgUkM0IGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgcmM0X2tleV9zdAorCXsKKwlSQzRfSU5UIHgseTsKKwlSQzRfSU5UIGRhdGFbMjU2XTsKKwl9IFJDNF9LRVk7CisKKyAKK2NvbnN0IGNoYXIgKlJDNF9vcHRpb25zKHZvaWQpOwordm9pZCBSQzRfc2V0X2tleShSQzRfS0VZICprZXksIGludCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpOwordm9pZCBSQzQoUkM0X0tFWSAqa2V5LCBzaXplX3QgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbmRhdGEsCisJCXVuc2lnbmVkIGNoYXIgKm91dGRhdGEpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNF9lbmMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzQvcmM0X2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNGZjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNF9lbmMuYwpAQCAtMCwwICsxLDMxNSBAQAorLyogY3J5cHRvL3JjNC9yYzRfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcmM0Lmg+CisjaW5jbHVkZSAicmM0X2xvY2wuaCIKKworLyogUkM0IGFzIGltcGxlbWVudGVkIGZyb20gYSBwb3N0aW5nIGZyb20KKyAqIE5ld3Nncm91cHM6IHNjaS5jcnlwdAorICogRnJvbTogc3Rlcm5kYXJrQG5ldGNvbS5jb20gKERhdmlkIFN0ZXJuZGFyaykKKyAqIFN1YmplY3Q6IFJDNCBBbGdvcml0aG0gcmV2ZWFsZWQuCisgKiBNZXNzYWdlLUlEOiA8c3Rlcm5DdktMNEIuSHl5QG5ldGNvbS5jb20+CisgKiBEYXRlOiBXZWQsIDE0IFNlcCAxOTk0IDA2OjM1OjMxIEdNVAorICovCisKK3ZvaWQgUkM0KFJDNF9LRVkgKmtleSwgc2l6ZV90IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5kYXRhLAorCSAgICAgdW5zaWduZWQgY2hhciAqb3V0ZGF0YSkKKwl7CisgICAgICAgIHJlZ2lzdGVyIFJDNF9JTlQgKmQ7CisgICAgICAgIHJlZ2lzdGVyIFJDNF9JTlQgeCx5LHR4LHR5OworCXNpemVfdCBpOworICAgICAgICAKKyAgICAgICAgeD1rZXktPng7ICAgICAKKyAgICAgICAgeT1rZXktPnk7ICAgICAKKyAgICAgICAgZD1rZXktPmRhdGE7IAorCisjaWYgZGVmaW5lZChSQzRfQ0hVTkspCisJLyoKKwkgKiBUaGUgb3JpZ2luYWwgcmVhc29uIGZvciBpbXBsZW1lbnRpbmcgdGhpcygqKSB3YXMgdGhlIGZhY3QgdGhhdAorCSAqIHByZS0yMTE2NGEgQWxwaGEgQ1BVcyBkb24ndCBoYXZlIGJ5dGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMKKwkgKiBhbmQgZS5nLiBhIGJ5dGUgc3RvcmUgaGFzIHRvIGJlIGRvbmUgd2l0aCA2NC1iaXQgbG9hZCwgc2hpZnQsCisJICogYW5kLCBvciBhbmQgZmluYWxseSA2NC1iaXQgc3RvcmUuIFBlYWtpbmcgZGF0YSBhbmQgb3BlcmF0aW5nCisJICogYXQgbmF0dXJhbCB3b3JkIHNpemUgbWFkZSBpdCBwb3NzaWJsZSB0byByZWR1Y2UgYW1vdW50IG9mCisJICogaW5zdHJ1Y3Rpb25zIGFzIHdlbGwgYXMgdG8gcGVyZm9ybSBlYXJseSByZWFkLWFoZWFkIHdpdGhvdXQKKwkgKiBzdWZmZXJpbmcgZnJvbSBSQVcgKHJlYWQtYWZ0ZXItd3JpdGUpIGhhemFyZC4gVGhpcyByZXN1bHRlZAorCSAqIGluIH40MCUoKiopIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9uIDIxMDY0IGJveCB3aXRoIGdjYy4KKwkgKiBCdXQgaXQncyBub3Qgb25seSBBbHBoYSB1c2VycyB3aG8gd2luIGhlcmU6LSkgVGhhbmtzIHRvIHRoZQorCSAqIGVhcmx5LW4td2lkZSByZWFkLWFoZWFkIHRoaXMgaW1wbGVtZW50YXRpb24gYWxzbyBleGhpYml0cworCSAqID40MCUgc3BlZWQtdXAgb24gU1BBUkMgYW5kIDIwLTMwJSBvbiA2NC1iaXQgTUlQUyAoZGVwZW5kaW5nCisJICogb24gc2l6ZW9mKFJDNF9JTlQpKS4KKwkgKgorCSAqICgqKQkidGhpcyIgbWVhbnMgY29kZSB3aGljaCByZWNvZ25pemVzIHRoZSBjYXNlIHdoZW4gaW5wdXQKKwkgKglhbmQgb3V0cHV0IHBvaW50ZXJzIGFwcGVhciB0byBiZSBhbGlnbmVkIGF0IG5hdHVyYWwgQ1BVCisJICoJd29yZCBib3VuZGFyeQorCSAqICgqKikJaS5lLiBhY2NvcmRpbmcgdG8gJ2FwcHMvb3BlbnNzbCBzcGVlZCByYzQnIGJlbmNobWFyaywKKwkgKgljcnlwdG8vcmM0L3JjNHNwZWVkLmMgZXhoaWJpdHMgYWxtb3N0IDcwJSBzcGVlZC11cC4uLgorCSAqCisJICogQ2F2ZXRzLgorCSAqCisJICogLSBSQzRfQ0hVTks9InVuc2lnbmVkIGxvbmcgbG9uZyIgc2hvdWxkIGJlIGEgIzEgY2hvaWNlIGZvcgorCSAqICAgVWx0cmFTUEFSQy4gVW5mb3J0dW5hdGVseSBnY2MgZ2VuZXJhdGVzIHZlcnkgc2xvdyBjb2RlCisJICogICAoMi41LTMgdGltZXMgc2xvd2VyIHRoYW4gb25lIGdlbmVyYXRlZCBieSBTdW4ncyBXb3JrU2hvcAorCSAqICAgQykgYW5kIHRoZXJlZm9yZSBnY2MgKGF0IGxlYXN0IDIuOTUgYW5kIGVhcmxpZXIpIHNob3VsZAorCSAqICAgYWx3YXlzIGJlIHRvbGQgdGhhdCBSQzRfQ0hVTks9InVuc2lnbmVkIGxvbmciLgorCSAqCisJICoJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKwkgKi8KKworIyBkZWZpbmUgUkM0X1NURVAJKCBcCisJCQl4PSh4KzEpICYweGZmLAlcCisJCQl0eD1kW3hdLAlcCisJCQl5PSh0eCt5KSYweGZmLAlcCisJCQl0eT1kW3ldLAlcCisJCQlkW3ldPXR4LAlcCisJCQlkW3hdPXR5LAlcCisJCQkoUkM0X0NIVU5LKWRbKHR4K3R5KSYweGZmXVwKKwkJCSkKKworCWlmICggKCAoKHNpemVfdClpbmRhdGEgICYgKHNpemVvZihSQzRfQ0hVTkspLTEpKSB8IAorCSAgICAgICAoKHNpemVfdClvdXRkYXRhICYgKHNpemVvZihSQzRfQ0hVTkspLTEpKSApID09IDAgKQorCQl7CisJCVJDNF9DSFVOSyBpY2h1bmssb3RwOworCQljb25zdCB1bmlvbiB7IGxvbmcgb25lOyBjaGFyIGxpdHRsZTsgfSBpc19lbmRpYW4gPSB7MX07CisKKwkJLyoKKwkJICogSSByZWNrb24gd2UgY2FuIGFmZm9yZCB0byBpbXBsZW1lbnQgYm90aCBlbmRpYW4KKwkJICogY2FzZXMgYW5kIHRvIGRlY2lkZSB3aGljaCB3YXkgdG8gdGFrZSBhdCBydW4tdGltZQorCQkgKiBiZWNhdXNlIHRoZSBtYWNoaW5lIGNvZGUgYXBwZWFycyB0byBiZSB2ZXJ5IGNvbXBhY3QKKwkJICogYW5kIHJlZHVuZGFudCAxLTJLQiBpcyBwZXJmZWN0bHkgdG9sZXJhYmxlIChpLmUuCisJCSAqIGluIGNhc2UgdGhlIGNvbXBpbGVyIGZhaWxzIHRvIGVsaW1pbmF0ZSBpdDotKS4gQnkKKwkJICogc3VnZ2VzdGlvbiBmcm9tIFRlcnJlbCBMYXJzb24gPHRlcnJAdGVycmFsb2dpYy5uZXQ+CisJCSAqIHdobyBhbHNvIHN0YW5kcyBmb3IgdGhlIGlzX2VuZGlhbiB1bmlvbjotKQorCQkgKgorCQkgKiBTcGVjaWFsIG5vdGVzLgorCQkgKgorCQkgKiAtIGlzX2VuZGlhbiBpcyBkZWNsYXJlZCBhdXRvbWF0aWMgYXMgZG9pbmcgb3RoZXJ3aXNlCisJCSAqICAgKGRlY2xhcmluZyBzdGF0aWMpIHByZXZlbnRzIGdjYyBmcm9tIGVsaW1pbmF0aW5nCisJCSAqICAgdGhlIHJlZHVuZGFudCBjb2RlOworCQkgKiAtIGNvbXBpbGVycyAodGhvc2UgSSd2ZSB0cmllZCkgZG9uJ3Qgc2VlbSB0byBoYXZlCisJCSAqICAgcHJvYmxlbXMgZWxpbWluYXRpbmcgZWl0aGVyIHRoZSBvcGVyYXRvcnMgZ3VhcmRlZAorCQkgKiAgIGJ5ICJpZiAoc2l6ZW9mKFJDNF9DSFVOSyk9PTgpIiBvciB0aGUgY29uZGl0aW9uCisJCSAqICAgZXhwcmVzc2lvbnMgdGhlbXNlbHZlcyBzbyBJJ3ZlIGdvdCAnZW0gdG8gcmVwbGFjZQorCQkgKiAgIGNvcnJlc3BvbmRpbmcgI2lmZGVmcyBmcm9tIHRoZSBwcmV2aW91cyB2ZXJzaW9uOworCQkgKiAtIEkgY2hvc2UgdG8gbGV0IHRoZSByZWR1bmRhbnQgc3dpdGNoIGNhc2VzIHdoZW4KKwkJICogICBzaXplb2YoUkM0X0NIVU5LKSE9OCBiZSAod2VyZSBhbHNvICNpZmRlZmVkCisJCSAqICAgYmVmb3JlKTsKKwkJICogLSBpbiBjYXNlIHlvdSB3b25kZXIgIiYoc2l6ZW9mKFJDNF9DSFVOSykqOC0xKSIgaW4KKwkJICogICBbTEJdRVNIRlQgZ3VhcmRzIGFnYWluc3QgInNoaWZ0IGlzIG91dCBvZiByYW5nZSIKKwkJICogICB3YXJuaW5ncyB3aGVuIHNpemVvZihSQzRfQ0hVTkspIT04IAorCQkgKgorCQkgKgkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKwkJICovCisJCWlmICghaXNfZW5kaWFuLmxpdHRsZSkKKwkJCXsJLyogQklHLUVORElBTiBDQVNFICovCisjIGRlZmluZSBCRVNIRlQoYykJKCgoc2l6ZW9mKFJDNF9DSFVOSyktKGMpLTEpKjgpJihzaXplb2YoUkM0X0NIVU5LKSo4LTEpKQorCQkJZm9yICg7bGVuJigwLXNpemVvZihSQzRfQ0hVTkspKTtsZW4tPXNpemVvZihSQzRfQ0hVTkspKQorCQkJCXsKKwkJCQlpY2h1bmsgID0gKihSQzRfQ0hVTksgKilpbmRhdGE7CisJCQkJb3RwICA9IFJDNF9TVEVQPDxCRVNIRlQoMCk7CisJCQkJb3RwIHw9IFJDNF9TVEVQPDxCRVNIRlQoMSk7CisJCQkJb3RwIHw9IFJDNF9TVEVQPDxCRVNIRlQoMik7CisJCQkJb3RwIHw9IFJDNF9TVEVQPDxCRVNIRlQoMyk7CisJCQkJaWYgKHNpemVvZihSQzRfQ0hVTkspPT04KQorCQkJCQl7CisJCQkJCW90cCB8PSBSQzRfU1RFUDw8QkVTSEZUKDQpOworCQkJCQlvdHAgfD0gUkM0X1NURVA8PEJFU0hGVCg1KTsKKwkJCQkJb3RwIHw9IFJDNF9TVEVQPDxCRVNIRlQoNik7CisJCQkJCW90cCB8PSBSQzRfU1RFUDw8QkVTSEZUKDcpOworCQkJCQl9CisJCQkJKihSQzRfQ0hVTksgKilvdXRkYXRhID0gb3RwXmljaHVuazsKKwkJCQlpbmRhdGEgICs9IHNpemVvZihSQzRfQ0hVTkspOworCQkJCW91dGRhdGEgKz0gc2l6ZW9mKFJDNF9DSFVOSyk7CisJCQkJfQorCQkJaWYgKGxlbikKKwkJCQl7CisJCQkJUkM0X0NIVU5LIG1hc2s9KFJDNF9DSFVOSyktMSwgb2NodW5rOworCisJCQkJaWNodW5rID0gKihSQzRfQ0hVTksgKilpbmRhdGE7CisJCQkJb2NodW5rID0gKihSQzRfQ0hVTksgKilvdXRkYXRhOworCQkJCW90cCA9IDA7CisJCQkJaSA9IEJFU0hGVCgwKTsKKwkJCQltYXNrIDw8PSAoc2l6ZW9mKFJDNF9DSFVOSyktbGVuKTw8MzsKKwkJCQlzd2l0Y2ggKGxlbiYoc2l6ZW9mKFJDNF9DSFVOSyktMSkpCisJCQkJCXsKKwkJCQkJY2FzZSA3OglvdHAgID0gUkM0X1NURVA8PGksIGktPTg7CisJCQkJCWNhc2UgNjoJb3RwIHw9IFJDNF9TVEVQPDxpLCBpLT04OworCQkJCQljYXNlIDU6CW90cCB8PSBSQzRfU1RFUDw8aSwgaS09ODsKKwkJCQkJY2FzZSA0OglvdHAgfD0gUkM0X1NURVA8PGksIGktPTg7CisJCQkJCWNhc2UgMzoJb3RwIHw9IFJDNF9TVEVQPDxpLCBpLT04OworCQkJCQljYXNlIDI6CW90cCB8PSBSQzRfU1RFUDw8aSwgaS09ODsKKwkJCQkJY2FzZSAxOglvdHAgfD0gUkM0X1NURVA8PGksIGktPTg7CisJCQkJCWNhc2UgMDogOyAvKgorCQkJCQkJICAgKiBpdCdzIG5ldmVyIHRoZSBjYXNlLAorCQkJCQkJICAgKiBidXQgaXQgaGFzIHRvIGJlIGhlcmUKKwkJCQkJCSAgICogZm9yIHVsdHJpeD8KKwkJCQkJCSAgICovCisJCQkJCX0KKwkJCQlvY2h1bmsgJj0gfm1hc2s7CisJCQkJb2NodW5rIHw9IChvdHBeaWNodW5rKSAmIG1hc2s7CisJCQkJKihSQzRfQ0hVTksgKilvdXRkYXRhID0gb2NodW5rOworCQkJCX0KKwkJCWtleS0+eD14OyAgICAgCisJCQlrZXktPnk9eTsKKwkJCXJldHVybjsKKwkJCX0KKwkJZWxzZQorCQkJewkvKiBMSVRUTEUtRU5ESUFOIENBU0UgKi8KKyMgZGVmaW5lIExFU0hGVChjKQkoKChjKSo4KSYoc2l6ZW9mKFJDNF9DSFVOSykqOC0xKSkKKwkJCWZvciAoO2xlbiYoMC1zaXplb2YoUkM0X0NIVU5LKSk7bGVuLT1zaXplb2YoUkM0X0NIVU5LKSkKKwkJCQl7CisJCQkJaWNodW5rICA9ICooUkM0X0NIVU5LICopaW5kYXRhOworCQkJCW90cCAgPSBSQzRfU1RFUDsKKwkJCQlvdHAgfD0gUkM0X1NURVA8PDg7CisJCQkJb3RwIHw9IFJDNF9TVEVQPDwxNjsKKwkJCQlvdHAgfD0gUkM0X1NURVA8PDI0OworCQkJCWlmIChzaXplb2YoUkM0X0NIVU5LKT09OCkKKwkJCQkJeworCQkJCQlvdHAgfD0gUkM0X1NURVA8PExFU0hGVCg0KTsKKwkJCQkJb3RwIHw9IFJDNF9TVEVQPDxMRVNIRlQoNSk7CisJCQkJCW90cCB8PSBSQzRfU1RFUDw8TEVTSEZUKDYpOworCQkJCQlvdHAgfD0gUkM0X1NURVA8PExFU0hGVCg3KTsKKwkJCQkJfQorCQkJCSooUkM0X0NIVU5LICopb3V0ZGF0YSA9IG90cF5pY2h1bms7CisJCQkJaW5kYXRhICArPSBzaXplb2YoUkM0X0NIVU5LKTsKKwkJCQlvdXRkYXRhICs9IHNpemVvZihSQzRfQ0hVTkspOworCQkJCX0KKwkJCWlmIChsZW4pCisJCQkJeworCQkJCVJDNF9DSFVOSyBtYXNrPShSQzRfQ0hVTkspLTEsIG9jaHVuazsKKworCQkJCWljaHVuayA9ICooUkM0X0NIVU5LICopaW5kYXRhOworCQkJCW9jaHVuayA9ICooUkM0X0NIVU5LICopb3V0ZGF0YTsKKwkJCQlvdHAgPSAwOworCQkJCWkgICA9IDA7CisJCQkJbWFzayA+Pj0gKHNpemVvZihSQzRfQ0hVTkspLWxlbik8PDM7CisJCQkJc3dpdGNoIChsZW4mKHNpemVvZihSQzRfQ0hVTkspLTEpKQorCQkJCQl7CisJCQkJCWNhc2UgNzoJb3RwICA9IFJDNF9TVEVQLCAgICBpKz04OworCQkJCQljYXNlIDY6CW90cCB8PSBSQzRfU1RFUDw8aSwgaSs9ODsKKwkJCQkJY2FzZSA1OglvdHAgfD0gUkM0X1NURVA8PGksIGkrPTg7CisJCQkJCWNhc2UgNDoJb3RwIHw9IFJDNF9TVEVQPDxpLCBpKz04OworCQkJCQljYXNlIDM6CW90cCB8PSBSQzRfU1RFUDw8aSwgaSs9ODsKKwkJCQkJY2FzZSAyOglvdHAgfD0gUkM0X1NURVA8PGksIGkrPTg7CisJCQkJCWNhc2UgMToJb3RwIHw9IFJDNF9TVEVQPDxpLCBpKz04OworCQkJCQljYXNlIDA6IDsgLyoKKwkJCQkJCSAgICogaXQncyBuZXZlciB0aGUgY2FzZSwKKwkJCQkJCSAgICogYnV0IGl0IGhhcyB0byBiZSBoZXJlCisJCQkJCQkgICAqIGZvciB1bHRyaXg/CisJCQkJCQkgICAqLworCQkJCQl9CisJCQkJb2NodW5rICY9IH5tYXNrOworCQkJCW9jaHVuayB8PSAob3RwXmljaHVuaykgJiBtYXNrOworCQkJCSooUkM0X0NIVU5LICopb3V0ZGF0YSA9IG9jaHVuazsKKwkJCQl9CisJCQlrZXktPng9eDsgICAgIAorCQkJa2V5LT55PXk7CisJCQlyZXR1cm47CisJCQl9CisJCX0KKyNlbmRpZgorI2RlZmluZSBMT09QKGluLG91dCkgXAorCQl4PSgoeCsxKSYweGZmKTsgXAorCQl0eD1kW3hdOyBcCisJCXk9KHR4K3kpJjB4ZmY7IFwKKwkJZFt4XT10eT1kW3ldOyBcCisJCWRbeV09dHg7IFwKKwkJKG91dCkgPSBkWyh0eCt0eSkmMHhmZl1eIChpbik7CisKKyNpZm5kZWYgUkM0X0lOREVYCisjZGVmaW5lIFJDNF9MT09QKGEsYixpKQlMT09QKCooKGEpKyspLCooKGIpKyspKQorI2Vsc2UKKyNkZWZpbmUgUkM0X0xPT1AoYSxiLGkpCUxPT1AoYVtpXSxiW2ldKQorI2VuZGlmCisKKwlpPWxlbj4+MzsKKwlpZiAoaSkKKwkJeworCQlmb3IgKDs7KQorCQkJeworCQkJUkM0X0xPT1AoaW5kYXRhLG91dGRhdGEsMCk7CisJCQlSQzRfTE9PUChpbmRhdGEsb3V0ZGF0YSwxKTsKKwkJCVJDNF9MT09QKGluZGF0YSxvdXRkYXRhLDIpOworCQkJUkM0X0xPT1AoaW5kYXRhLG91dGRhdGEsMyk7CisJCQlSQzRfTE9PUChpbmRhdGEsb3V0ZGF0YSw0KTsKKwkJCVJDNF9MT09QKGluZGF0YSxvdXRkYXRhLDUpOworCQkJUkM0X0xPT1AoaW5kYXRhLG91dGRhdGEsNik7CisJCQlSQzRfTE9PUChpbmRhdGEsb3V0ZGF0YSw3KTsKKyNpZmRlZiBSQzRfSU5ERVgKKwkJCWluZGF0YSs9ODsKKwkJCW91dGRhdGErPTg7CisjZW5kaWYKKwkJCWlmICgtLWkgPT0gMCkgYnJlYWs7CisJCQl9CisJCX0KKwlpPWxlbiYweDA3OworCWlmIChpKQorCQl7CisJCWZvciAoOzspCisJCQl7CisJCQlSQzRfTE9PUChpbmRhdGEsb3V0ZGF0YSwwKTsgaWYgKC0taSA9PSAwKSBicmVhazsKKwkJCVJDNF9MT09QKGluZGF0YSxvdXRkYXRhLDEpOyBpZiAoLS1pID09IDApIGJyZWFrOworCQkJUkM0X0xPT1AoaW5kYXRhLG91dGRhdGEsMik7IGlmICgtLWkgPT0gMCkgYnJlYWs7CisJCQlSQzRfTE9PUChpbmRhdGEsb3V0ZGF0YSwzKTsgaWYgKC0taSA9PSAwKSBicmVhazsKKwkJCVJDNF9MT09QKGluZGF0YSxvdXRkYXRhLDQpOyBpZiAoLS1pID09IDApIGJyZWFrOworCQkJUkM0X0xPT1AoaW5kYXRhLG91dGRhdGEsNSk7IGlmICgtLWkgPT0gMCkgYnJlYWs7CisJCQlSQzRfTE9PUChpbmRhdGEsb3V0ZGF0YSw2KTsgaWYgKC0taSA9PSAwKSBicmVhazsKKwkJCX0KKwkJfSAgICAgICAgICAgICAgIAorCWtleS0+eD14OyAgICAgCisJa2V5LT55PXk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzRfbG9jbC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzRfbG9jbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTJlMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNF9sb2NsLmgKQEAgLTAsMCArMSw1IEBACisjaWZuZGVmIEhFQURFUl9SQzRfTE9DTF9ICisjZGVmaW5lIEhFQURFUl9SQzRfTE9DTF9ICisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2luY2x1ZGUgPGNyeXB0bGliLmg+CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYzQvcmM0X3NrZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzQvcmM0X3NrZXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjJjNDBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzRfc2tleS5jCkBAIC0wLDAgKzEsMTUwIEBACisvKiBjcnlwdG8vcmM0L3JjNF9za2V5LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvcmM0Lmg+CisjaW5jbHVkZSAicmM0X2xvY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisKK2NvbnN0IGNoYXIgUkM0X3ZlcnNpb25bXT0iUkM0IiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKK2NvbnN0IGNoYXIgKlJDNF9vcHRpb25zKHZvaWQpCisJeworI2lmZGVmIFJDNF9JTkRFWAorCWlmIChzaXplb2YoUkM0X0lOVCkgPT0gMSkKKwkJcmV0dXJuKCJyYzQoaWR4LGNoYXIpIik7CisJZWxzZQorCQlyZXR1cm4oInJjNChpZHgsaW50KSIpOworI2Vsc2UKKwlpZiAoc2l6ZW9mKFJDNF9JTlQpID09IDEpCisJCXJldHVybigicmM0KHB0cixjaGFyKSIpOworCWVsc2UKKwkJcmV0dXJuKCJyYzQocHRyLGludCkiKTsKKyNlbmRpZgorCX0KKworLyogUkM0IGFzIGltcGxlbWVudGVkIGZyb20gYSBwb3N0aW5nIGZyb20KKyAqIE5ld3Nncm91cHM6IHNjaS5jcnlwdAorICogRnJvbTogc3Rlcm5kYXJrQG5ldGNvbS5jb20gKERhdmlkIFN0ZXJuZGFyaykKKyAqIFN1YmplY3Q6IFJDNCBBbGdvcml0aG0gcmV2ZWFsZWQuCisgKiBNZXNzYWdlLUlEOiA8c3Rlcm5DdktMNEIuSHl5QG5ldGNvbS5jb20+CisgKiBEYXRlOiBXZWQsIDE0IFNlcCAxOTk0IDA2OjM1OjMxIEdNVAorICovCisKK3ZvaWQgUkM0X3NldF9rZXkoUkM0X0tFWSAqa2V5LCBpbnQgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKQorCXsKKyAgICAgICAgcmVnaXN0ZXIgUkM0X0lOVCB0bXA7CisgICAgICAgIHJlZ2lzdGVyIGludCBpZDEsaWQyOworICAgICAgICByZWdpc3RlciBSQzRfSU5UICpkOworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgCisgICAgICAgIGQ9ICYoa2V5LT5kYXRhWzBdKTsKKyAgICAgICAga2V5LT54ID0gMDsgICAgIAorICAgICAgICBrZXktPnkgPSAwOyAgICAgCisgICAgICAgIGlkMT1pZDI9MDsgICAgIAorCisjZGVmaW5lIFNLX0xPT1AoZCxuKSB7IFwKKwkJdG1wPWRbKG4pXTsgXAorCQlpZDIgPSAoZGF0YVtpZDFdICsgdG1wICsgaWQyKSAmIDB4ZmY7IFwKKwkJaWYgKCsraWQxID09IGxlbikgaWQxPTA7IFwKKwkJZFsobildPWRbaWQyXTsgXAorCQlkW2lkMl09dG1wOyB9CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfQ1BVSURfT0JKKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkKKyMgaWYJZGVmaW5lZChfX2kzODYpICAgfHwgZGVmaW5lZChfX2kzODZfXykgICB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IFwKKwlkZWZpbmVkKF9fSU5URUxfXykgfHwgXAorCWRlZmluZWQoX194ODZfNjQpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9BTUQ2NCkKKwlpZiAoc2l6ZW9mKFJDNF9JTlQpID4gMSkgeworCQkvKgorCQkgKiBVbmxpa2UgYWxsIG90aGVyIHg4NiBbYW5kIHg4Nl82NF0gaW1wbGVtZW50YXRpb25zLAorCQkgKiBJbnRlbCBQNCBjb3JlIFtpbmNsdWRpbmcgRU02NFRdIHdhcyBmb3VuZCB0byBwZXJmb3JtCisJCSAqIHBvb3JseSB3aXRoIHdpZGVyIFJDNF9JTlQuIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50CisJCSAqIGZvciBJQS0zMiBoYW5kLWNvZGVkIGFzc2VtYmxlciB0dXJuZWQgb3V0IHRvIGJlIDIuOHgKKwkJICogaWYgcmUtY29kZWQgZm9yIFJDNF9DSEFSISBJdCdzIGhvd2V2ZXIgaW5hcHByb3ByaWF0ZQorCQkgKiB0byBqdXN0IHN3aXRjaCB0byBSQzRfQ0hBUiBmb3IgeDg2W182NF0sIGFzIG5vbi1QNAorCQkgKiBpbXBsZW1lbnRhdGlvbnMgc3VmZmVyIGZyb20gc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UKKwkJICogbG9zc2VzIHRoZW4sIGUuZy4gUElJSSBleGhpYml0cyA+MnggZGV0ZXJpb3JhdGlvbiwKKwkJICogYW5kIHNvIGRvZXMgT3B0ZXJvbi4gSW4gb3JkZXIgdG8gYXNzdXJlIG9wdGltYWwKKwkJICogYWxsLXJvdW5kIHBlcmZvcm1hbmNlLCBsZXQgdXMgW3RyeSB0b10gZGV0ZWN0IFA0IGF0CisJCSAqIHJ1bi10aW1lIGJ5IGNoZWNraW5nIHVwb24gSFRUIGJpdCBpbiBDUFUgY2FwYWJpbGl0eQorCQkgKiB2ZWN0b3IgYW5kIHNldCB1cCBjb21wcmVzc2VkIGtleSBzY2hlZHVsZSwgd2hpY2ggaXMKKwkJICogcmVjb2duaXplZCBieSBjb3JyZXNwb25kaW5nbHkgdXBkYXRlZCBhc3NlbWJsZXIKKwkJICogbW9kdWxlLi4uCisJCSAqCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKwkJICovCisJCWlmIChPUEVOU1NMX2lhMzJjYXBfUCAmICgxPDwyOCkpIHsKKwkJCXVuc2lnbmVkIGNoYXIgKmNwPSh1bnNpZ25lZCBjaGFyICopZDsKKworCQkJZm9yIChpPTA7aTwyNTY7aSsrKSBjcFtpXT1pOworCQkJZm9yIChpPTA7aTwyNTY7aSsrKSBTS19MT09QKGNwLGkpOworCQkJLyogbWFyayBzY2hlZHVsZSBhcyBjb21wcmVzc2VkISAqLworCQkJZFsyNTYvc2l6ZW9mKFJDNF9JTlQpXT0tMTsKKwkJCXJldHVybjsKKwkJfQorCX0KKyMgZW5kaWYKKyNlbmRpZgorCWZvciAoaT0wOyBpIDwgMjU2OyBpKyspIGRbaV09aTsKKwlmb3IgKGk9MDsgaSA8IDI1NjsgaSs9NCkKKwkJeworCQlTS19MT09QKGQsaSswKTsKKwkJU0tfTE9PUChkLGkrMSk7CisJCVNLX0xPT1AoZCxpKzIpOworCQlTS19MT09QKGQsaSszKTsKKwkJfQorCX0KKyAgICAKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYzQvcmM0cy5jcHAgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MTRmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNHMuY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8vCisvLyBnZXR0c2MuaW5sCisvLworLy8gZ2l2ZXMgYWNjZXNzIHRvIHRoZSBQZW50aXVtJ3MgKHNlY3JldCkgY3ljbGUgY291bnRlcgorLy8KKy8vIFRoaXMgc29mdHdhcmUgd2FzIHdyaXR0ZW4gYnkgTGVvbmFyZCBKYW5rZSAoamFua2VAdW5peGcudWJjLmNhKQorLy8gaW4gMTk5Ni03IGFuZCBpcyBlbnRlcmVkLCBieSBoaW0sIGludG8gdGhlIHB1YmxpYyBkb21haW4uCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQordm9pZCBHZXRUU0ModW5zaWduZWQgbG9uZyYpOworI3ByYWdtYSBhdXggR2V0VFNDID0gMHgwZiAweDMxICJtb3YgW2VkaV0sIGVheCIgcGFybSBbZWRpXSBtb2RpZnkgW2VkeCBlYXhdOworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKK2lubGluZQordm9pZCBHZXRUU0ModW5zaWduZWQgbG9uZyYgdHNjKQoreworICBhc20gdm9sYXRpbGUoIi5ieXRlIDE1LCA0OVxuXHQiCisJICAgICAgIDogIj1lYXgiICh0c2MpCisJICAgICAgIDoKKwkgICAgICAgOiAiJWVkeCIsICIlZWF4Iik7Cit9CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQoraW5saW5lCit2b2lkIEdldFRTQyh1bnNpZ25lZCBsb25nJiB0c2MpCit7CisgIHVuc2lnbmVkIGxvbmcgYTsKKyAgX19hc20gX2VtaXQgMGZoCisgIF9fYXNtIF9lbWl0IDMxaAorICBfX2FzbSBtb3YgYSwgZWF4OworICB0c2M9YTsKK30KKyNlbmRpZiAgICAgIAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgorCit2b2lkIG1haW4oaW50IGFyZ2MsY2hhciAqYXJndltdKQorCXsKKwl1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxMDI0XTsKKwlSQzRfS0VZIGN0eDsKKwl1bnNpZ25lZCBsb25nIHMxLHMyLGUxLGUyOworCXVuc2lnbmVkIGNoYXIga1sxNl07CisJdW5zaWduZWQgbG9uZyBkYXRhWzJdOworCXVuc2lnbmVkIGNoYXIgaXZbOF07CisJaW50IGksbnVtPTY0LG51bW07CisJaW50IGo9MDsKKworCWlmIChhcmdjID49IDIpCisJCW51bT1hdG9pKGFyZ3ZbMV0pOworCisJaWYgKG51bSA9PSAwKSBudW09MjU2OworCWlmIChudW0gPiAxMDI0LTE2KSBudW09MTAyNC0xNjsKKwludW1tPW51bSs4OworCisJZm9yIChqPTA7IGo8NjsgaisrKQorCQl7CisJCWZvciAoaT0wOyBpPDEwOyBpKyspIC8qKi8KKwkJCXsKKwkJCVJDNCgmY3R4LG51bW0sYnVmZmVyLGJ1ZmZlcik7CisJCQlHZXRUU0MoczEpOworCQkJUkM0KCZjdHgsbnVtbSxidWZmZXIsYnVmZmVyKTsKKwkJCUdldFRTQyhlMSk7CisJCQlHZXRUU0MoczIpOworCQkJUkM0KCZjdHgsbnVtLGJ1ZmZlcixidWZmZXIpOworCQkJR2V0VFNDKGUyKTsKKwkJCVJDNCgmY3R4LG51bSxidWZmZXIsYnVmZmVyKTsKKwkJCX0KKworCQlwcmludGYoIlJDNCAoJWQgYnl0ZXMpICVkICVkICglZCkgLSA4IGJ5dGVzXG4iLG51bSwKKwkJCWUxLXMxLGUyLXMyLChlMS1zMSktKGUyLXMyKSk7CisJCX0KKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yYzQvcmM0c3BlZWQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yYzQvcmM0c3BlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJkMzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzRzcGVlZC5jCkBAIC0wLDAgKzEsMjUzIEBACisvKiBjcnlwdG8vcmM0L3JjNHNwZWVkLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogMTEtU2VwLTkyIEFuZHJldyBEYXZpZWwgICBTdXBwb3J0IGZvciBTaWxpY29uIEdyYXBoaWNzIElSSVggYWRkZWQgKi8KKy8qIDA2LUFwci05MiBMdWtlIEJyZW5uYW4gICAgU3VwcG9ydCBmb3IgVk1TIGFuZCBhZGQgZXh0cmEgc2lnbmFsIGNhbGxzICovCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgKCFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChfX0RFQ0MpKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NQUNPU1gpCisjZGVmaW5lIFRJTUVTCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSBPUEVOU1NMX1VOSVNURF9JTworT1BFTlNTTF9ERUNMQVJFX0VYSVQKKworI2lmbmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKKworI2lmbmRlZiBfSVJJWAorI2luY2x1ZGUgPHRpbWUuaD4KKyNlbmRpZgorI2lmZGVmIFRJTUVTCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+CisjZW5kaWYKKworLyogRGVwZW5kaW5nIG9uIHRoZSBWTVMgdmVyc2lvbiwgdGhlIHRtcyBzdHJ1Y3R1cmUgaXMgcGVyaGFwcyBkZWZpbmVkLgorICAgVGhlIF9fVE1TIG1hY3JvIHdpbGwgc2hvdyBpZiBpdCB3YXMuICBJZiBpdCB3YXNuJ3QgZGVmaW5lZCwgd2Ugc2hvdWxkCisgICB1bmRlZmluZSBUSU1FUywgc2luY2UgdGhhdCB0ZWxscyB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbSBob3cgdGhpbmdzCisgICBzaG91bGQgYmUgaGFuZGxlZC4JCQkJLS0gUmljaGFyZCBMZXZpdHRlICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVNfREVDQykgJiYgIWRlZmluZWQoX19UTVMpCisjdW5kZWYgVElNRVMKKyNlbmRpZgorCisjaWZuZGVmIFRJTUVTCisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoc3VuKSB8fCBkZWZpbmVkKF9fdWx0cml4KQorI2RlZmluZSBfUE9TSVhfU09VUkNFCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvcmM0Lmg+CisKKy8qIFRoZSBmb2xsb3dpbmcgaWYgZnJvbSB0aW1lcygzKSBtYW4gcGFnZS4gIEl0IG1heSBuZWVkIHRvIGJlIGNoYW5nZWQgKi8KKyNpZm5kZWYgSFoKKyNpZm5kZWYgQ0xLX1RDSworI2RlZmluZSBIWgkxMDAuMAorI2Vsc2UgLyogQ0xLX1RDSyAqLworI2RlZmluZSBIWiAoKGRvdWJsZSlDTEtfVENLKQorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZSBCVUZTSVpFCSgobG9uZykxMDI0KQorbG9uZyBydW49MDsKKworZG91YmxlIFRpbWVfRihpbnQgcyk7CisjaWZkZWYgU0lHQUxSTQorI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoc2dpKSB8fCBkZWZpbmVkKF9BSVgpCisjZGVmaW5lIFNJR1JFVFRZUEUgdm9pZAorI2Vsc2UKKyNkZWZpbmUgU0lHUkVUVFlQRSBpbnQKKyNlbmRpZgorCitTSUdSRVRUWVBFIHNpZ19kb25lKGludCBzaWcpOworU0lHUkVUVFlQRSBzaWdfZG9uZShpbnQgc2lnKQorCXsKKwlzaWduYWwoU0lHQUxSTSxzaWdfZG9uZSk7CisJcnVuPTA7CisjaWZkZWYgTElOVAorCXNpZz1zaWc7CisjZW5kaWYKKwl9CisjZW5kaWYKKworI2RlZmluZSBTVEFSVAkwCisjZGVmaW5lIFNUT1AJMQorCitkb3VibGUgVGltZV9GKGludCBzKQorCXsKKwlkb3VibGUgcmV0OworI2lmZGVmIFRJTUVTCisJc3RhdGljIHN0cnVjdCB0bXMgdHN0YXJ0LHRlbmQ7CisKKwlpZiAocyA9PSBTVEFSVCkKKwkJeworCQl0aW1lcygmdHN0YXJ0KTsKKwkJcmV0dXJuKDApOworCQl9CisJZWxzZQorCQl7CisJCXRpbWVzKCZ0ZW5kKTsKKwkJcmV0PSgoZG91YmxlKSh0ZW5kLnRtc191dGltZS10c3RhcnQudG1zX3V0aW1lKSkvSFo7CisJCXJldHVybigocmV0ID09IDAuMCk/MWUtNjpyZXQpOworCQl9CisjZWxzZSAvKiAhdGltZXMoKSAqLworCXN0YXRpYyBzdHJ1Y3QgdGltZWIgdHN0YXJ0LHRlbmQ7CisJbG9uZyBpOworCisJaWYgKHMgPT0gU1RBUlQpCisJCXsKKwkJZnRpbWUoJnRzdGFydCk7CisJCXJldHVybigwKTsKKwkJfQorCWVsc2UKKwkJeworCQlmdGltZSgmdGVuZCk7CisJCWk9KGxvbmcpdGVuZC5taWxsaXRtLShsb25nKXRzdGFydC5taWxsaXRtOworCQlyZXQ9KChkb3VibGUpKHRlbmQudGltZS10c3RhcnQudGltZSkpKygoZG91YmxlKWkpLzFlMzsKKwkJcmV0dXJuKChyZXQgPT0gMC4wKT8xZS02OnJldCk7CisJCX0KKyNlbmRpZgorCX0KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlsb25nIGNvdW50OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFXTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBrZXlbXSA9eworCQkJMHgxMiwweDM0LDB4NTYsMHg3OCwweDlhLDB4YmMsMHhkZSwweGYwLAorCQkJMHhmZSwweGRjLDB4YmEsMHg5OCwweDc2LDB4NTQsMHgzMiwweDEwLAorCQkJfTsKKwlSQzRfS0VZIHNjaDsKKwlkb3VibGUgYSxiLGMsZDsKKyNpZm5kZWYgU0lHQUxSTQorCWxvbmcgY2EsY2IsY2M7CisjZW5kaWYKKworI2lmbmRlZiBUSU1FUworCXByaW50ZigiVG8gZ2V0IHRoZSBtb3N0IGFjY3VyYXRlIHJlc3VsdHMsIHRyeSB0byBydW4gdGhpc1xuIik7CisJcHJpbnRmKCJwcm9ncmFtIHdoZW4gdGhpcyBjb21wdXRlciBpcyBpZGxlLlxuIik7CisjZW5kaWYKKworI2lmbmRlZiBTSUdBTFJNCisJcHJpbnRmKCJGaXJzdCB3ZSBjYWxjdWxhdGUgdGhlIGFwcHJveGltYXRlIHNwZWVkIC4uLlxuIik7CisJUkM0X3NldF9rZXkoJnNjaCwxNixrZXkpOworCWNvdW50PTEwOworCWRvCXsKKwkJbG9uZyBpOworCQl1bnNpZ25lZCBsb25nIGRhdGFbMl07CisKKwkJY291bnQqPTI7CisJCVRpbWVfRihTVEFSVCk7CisJCWZvciAoaT1jb3VudDsgaTsgaS0tKQorCQkJUkM0KCZzY2gsOCxidWYsYnVmKTsKKwkJZD1UaW1lX0YoU1RPUCk7CisJCX0gd2hpbGUgKGQgPCAzLjApOworCWNhPWNvdW50LzUxMjsKKwljYz1jb3VudCo4L0JVRlNJWkUrMTsKKwlwcmludGYoIkRvaW5nIFJDNF9zZXRfa2V5ICVsZCB0aW1lc1xuIixjYSk7CisjZGVmaW5lIENPTkQoZCkJKGNvdW50ICE9IChkKSkKKyNkZWZpbmUgQ09VTlQoZCkgKGQpCisjZWxzZQorI2RlZmluZSBDT05EKGMpCShydW4pCisjZGVmaW5lIENPVU5UKGQpIChjb3VudCkKKwlzaWduYWwoU0lHQUxSTSxzaWdfZG9uZSk7CisJcHJpbnRmKCJEb2luZyBSQzRfc2V0X2tleSBmb3IgMTAgc2Vjb25kc1xuIik7CisJYWxhcm0oMTApOworI2VuZGlmCisKKwlUaW1lX0YoU1RBUlQpOworCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjYSk7IGNvdW50Kz00KQorCQl7CisJCVJDNF9zZXRfa2V5KCZzY2gsMTYsa2V5KTsKKwkJUkM0X3NldF9rZXkoJnNjaCwxNixrZXkpOworCQlSQzRfc2V0X2tleSgmc2NoLDE2LGtleSk7CisJCVJDNF9zZXRfa2V5KCZzY2gsMTYsa2V5KTsKKwkJfQorCWQ9VGltZV9GKFNUT1ApOworCXByaW50ZigiJWxkIFJDNF9zZXRfa2V5J3MgaW4gJS4yZiBzZWNvbmRzXG4iLGNvdW50LGQpOworCWE9KChkb3VibGUpQ09VTlQoY2EpKS9kOworCisjaWZkZWYgU0lHQUxSTQorCXByaW50ZigiRG9pbmcgUkM0IG9uICVsZCBieXRlIGJsb2NrcyBmb3IgMTAgc2Vjb25kc1xuIixCVUZTSVpFKTsKKwlhbGFybSgxMCk7CisjZWxzZQorCXByaW50ZigiRG9pbmcgUkM0ICVsZCB0aW1lcyBvbiAlbGQgYnl0ZSBibG9ja3NcbiIsY2MsQlVGU0laRSk7CisjZW5kaWYKKwlUaW1lX0YoU1RBUlQpOworCWZvciAoY291bnQ9MCxydW49MTsgQ09ORChjYyk7IGNvdW50KyspCisJCVJDNCgmc2NoLEJVRlNJWkUsYnVmLGJ1Zik7CisJZD1UaW1lX0YoU1RPUCk7CisJcHJpbnRmKCIlbGQgUkM0J3Mgb2YgJWxkIGJ5dGUgYmxvY2tzIGluICUuMmYgc2Vjb25kXG4iLAorCQljb3VudCxCVUZTSVpFLGQpOworCWM9KChkb3VibGUpQ09VTlQoY2MpKkJVRlNJWkUpL2Q7CisKKwlwcmludGYoIlJDNCBzZXRfa2V5IHBlciBzZWMgPSAlMTIuMmYgKCU5LjNmdVMpXG4iLGEsMS4wZTYvYSk7CisJcHJpbnRmKCJSQzQgICBieXRlcyBwZXIgc2VjID0gJTEyLjJmICglOS4zZnVTKVxuIixjLDguMGU2L2MpOworCWV4aXQoMCk7CisjaWYgZGVmaW5lZChMSU5UKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKQorCXJldHVybigwKTsKKyNlbmRpZgorCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzR0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JjNHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNhNzllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9yYzR0ZXN0LmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qIGNyeXB0by9yYzQvcmM0dGVzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiLi4vZV9vcy5oIgorCisjaWZkZWYgT1BFTlNTTF9OT19SQzQKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcHJpbnRmKCJObyBSQzQgc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL3JjNC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGtleXNbN11bMzBdPXsKKwl7OCwweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhhYiwweGNkLDB4ZWZ9LAorCXs4LDB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweGFiLDB4Y2QsMHhlZn0sCisJezgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwfSwKKwl7NCwweGVmLDB4MDEsMHgyMywweDQ1fSwKKwl7OCwweDAxLDB4MjMsMHg0NSwweDY3LDB4ODksMHhhYiwweGNkLDB4ZWZ9LAorCXs0LDB4ZWYsMHgwMSwweDIzLDB4NDV9LAorCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRhdGFfbGVuWzddPXs4LDgsOCwyMCwyOCwxMH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBkYXRhWzddWzMwXT17CisJezB4MDEsMHgyMywweDQ1LDB4NjcsMHg4OSwweGFiLDB4Y2QsMHhlZiwweGZmfSwKKwl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmZ9LAorCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZn0sCisJezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKwkgICAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisJICAgMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmfSwKKwl7MHgxMiwweDM0LDB4NTYsMHg3OCwweDlBLDB4QkMsMHhERSwweEYwLAorCSAgIDB4MTIsMHgzNCwweDU2LDB4NzgsMHg5QSwweEJDLDB4REUsMHhGMCwKKwkgICAweDEyLDB4MzQsMHg1NiwweDc4LDB4OUEsMHhCQywweERFLDB4RjAsCisJICAgMHgxMiwweDM0LDB4NTYsMHg3OCwweGZmfSwKKwl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmfSwKKwl7MH0sCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgb3V0cHV0WzddWzMwXT17CisJezB4NzUsMHhiNywweDg3LDB4ODAsMHg5OSwweGUwLDB4YzUsMHg5NiwweDAwfSwKKwl7MHg3NCwweDk0LDB4YzIsMHhlNywweDEwLDB4NGIsMHgwOCwweDc5LDB4MDB9LAorCXsweGRlLDB4MTgsMHg4OSwweDQxLDB4YTMsMHgzNywweDVkLDB4M2EsMHgwMH0sCisJezB4ZDYsMHhhMSwweDQxLDB4YTcsMHhlYywweDNjLDB4MzgsMHhkZiwKKwkgMHhiZCwweDYxLDB4NWEsMHgxMSwweDYyLDB4ZTEsMHhjNywweGJhLAorCSAweDM2LDB4YjYsMHg3OCwweDU4LDB4MDB9LAorCXsweDY2LDB4YTAsMHg5NCwweDlmLDB4OGEsMHhmNywweGQ2LDB4ODksCisJIDB4MWYsMHg3ZiwweDgzLDB4MmIsMHhhOCwweDMzLDB4YzAsMHgwYywKKwkgMHg4OSwweDJlLDB4YmUsMHgzMCwweDE0LDB4M2MsMHhlMiwweDg3LAorCSAweDQwLDB4MDEsMHgxZSwweGNmLDB4MDB9LAorCXsweGQ2LDB4YTEsMHg0MSwweGE3LDB4ZWMsMHgzYywweDM4LDB4ZGYsMHhiZCwweDYxLDB4MDB9LAorCXswfSwKKwl9OworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorCXsKKwlpbnQgaSxlcnI9MDsKKwlpbnQgajsKKwl1bnNpZ25lZCBjaGFyICpwOworCVJDNF9LRVkga2V5OworCXVuc2lnbmVkIGNoYXIgb2J1Zls1MTJdOworCisJZm9yIChpPTA7IGk8NjsgaSsrKQorCQl7CisJCVJDNF9zZXRfa2V5KCZrZXksa2V5c1tpXVswXSwmKGtleXNbaV1bMV0pKTsKKwkJbWVtc2V0KG9idWYsMHgwMCxzaXplb2Yob2J1ZikpOworCQlSQzQoJmtleSxkYXRhX2xlbltpXSwmKGRhdGFbaV1bMF0pLG9idWYpOworCQlpZiAobWVtY21wKG9idWYsb3V0cHV0W2ldLGRhdGFfbGVuW2ldKzEpICE9IDApCisJCQl7CisJCQlwcmludGYoImVycm9yIGNhbGN1bGF0aW5nIFJDNFxuIik7CisJCQlwcmludGYoIm91dHB1dDoiKTsKKwkJCWZvciAoaj0wOyBqPGRhdGFfbGVuW2ldKzE7IGorKykKKwkJCQlwcmludGYoIiAlMDJ4IixvYnVmW2pdKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCXByaW50ZigiZXhwZWN0OiIpOworCQkJcD0gJihvdXRwdXRbaV1bMF0pOworCQkJZm9yIChqPTA7IGo8ZGF0YV9sZW5baV0rMTsgaisrKQorCQkJCXByaW50ZigiICUwMngiLCoocCsrKSk7CisJCQlwcmludGYoIlxuIik7CisJCQllcnIrKzsKKwkJCX0KKwkJZWxzZQorCQkJcHJpbnRmKCJ0ZXN0ICVkIG9rXG4iLGkpOworCQl9CisJcHJpbnRmKCJ0ZXN0IGVuZCBwcm9jZXNzaW5nICIpOworCWZvciAoaT0wOyBpPGRhdGFfbGVuWzNdOyBpKyspCisJCXsKKwkJUkM0X3NldF9rZXkoJmtleSxrZXlzWzNdWzBdLCYoa2V5c1szXVsxXSkpOworCQltZW1zZXQob2J1ZiwweDAwLHNpemVvZihvYnVmKSk7CisJCVJDNCgma2V5LGksJihkYXRhWzNdWzBdKSxvYnVmKTsKKwkJaWYgKChtZW1jbXAob2J1ZixvdXRwdXRbM10saSkgIT0gMCkgfHwgKG9idWZbaV0gIT0gMCkpCisJCQl7CisJCQlwcmludGYoImVycm9yIGluIFJDNCBsZW5ndGggcHJvY2Vzc2luZ1xuIik7CisJCQlwcmludGYoIm91dHB1dDoiKTsKKwkJCWZvciAoaj0wOyBqPGkrMTsgaisrKQorCQkJCXByaW50ZigiICUwMngiLG9idWZbal0pOworCQkJcHJpbnRmKCJcbiIpOworCQkJcHJpbnRmKCJleHBlY3Q6Iik7CisJCQlwPSAmKG91dHB1dFszXVswXSk7CisJCQlmb3IgKGo9MDsgajxpOyBqKyspCisJCQkJcHJpbnRmKCIgJTAyeCIsKihwKyspKTsKKwkJCXByaW50ZigiIDAwXG4iKTsKKwkJCWVycisrOworCQkJfQorCQllbHNlCisJCQl7CisJCQlwcmludGYoIi4iKTsKKwkJCWZmbHVzaChzdGRvdXQpOworCQkJfQorCQl9CisJcHJpbnRmKCJkb25lXG4iKTsKKwlwcmludGYoInRlc3QgbXVsdGktY2FsbCAiKTsKKwlmb3IgKGk9MDsgaTxkYXRhX2xlblszXTsgaSsrKQorCQl7CisJCVJDNF9zZXRfa2V5KCZrZXksa2V5c1szXVswXSwmKGtleXNbM11bMV0pKTsKKwkJbWVtc2V0KG9idWYsMHgwMCxzaXplb2Yob2J1ZikpOworCQlSQzQoJmtleSxpLCYoZGF0YVszXVswXSksb2J1Zik7CisJCVJDNCgma2V5LGRhdGFfbGVuWzNdLWksJihkYXRhWzNdW2ldKSwmKG9idWZbaV0pKTsKKwkJaWYgKG1lbWNtcChvYnVmLG91dHB1dFszXSxkYXRhX2xlblszXSsxKSAhPSAwKQorCQkJeworCQkJcHJpbnRmKCJlcnJvciBpbiBSQzQgbXVsdGktY2FsbCBwcm9jZXNzaW5nXG4iKTsKKwkJCXByaW50Zigib3V0cHV0OiIpOworCQkJZm9yIChqPTA7IGo8ZGF0YV9sZW5bM10rMTsgaisrKQorCQkJCXByaW50ZigiICUwMngiLG9idWZbal0pOworCQkJcHJpbnRmKCJcbiIpOworCQkJcHJpbnRmKCJleHBlY3Q6Iik7CisJCQlwPSAmKG91dHB1dFszXVswXSk7CisJCQlmb3IgKGo9MDsgajxkYXRhX2xlblszXSsxOyBqKyspCisJCQkJcHJpbnRmKCIgJTAyeCIsKihwKyspKTsKKwkJCWVycisrOworCQkJfQorCQllbHNlCisJCQl7CisJCQlwcmludGYoIi4iKTsKKwkJCWZmbHVzaChzdGRvdXQpOworCQkJfQorCQl9CisJcHJpbnRmKCJkb25lXG4iKTsKKwlwcmludGYoImJ1bGsgdGVzdCAiKTsKKwl7ICAgdW5zaWduZWQgY2hhciBidWZbNTEzXTsKKwkgICAgU0hBX0NUWCBjOworCSAgICB1bnNpZ25lZCBjaGFyIG1kW1NIQV9ESUdFU1RfTEVOR1RIXTsKKwkgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZXhwZWN0ZWRbXT17CisJCTB4YTQsMHg3YiwweGNjLDB4MDAsMHgzZCwweGQwLDB4YmQsMHhlMSwweGFjLDB4NWYsCisJCTB4MTIsMHgxZSwweDQ1LDB4YmMsMHhmYiwweDFhLDB4YTEsMHhmMiwweDdmLDB4YzUgfTsKKworCQlSQzRfc2V0X2tleSgma2V5LGtleXNbMF1bMF0sJihrZXlzWzNdWzFdKSk7CisJCW1lbXNldChidWYsJ1wwJyxzaXplb2YoYnVmKSk7CisJCVNIQTFfSW5pdCgmYyk7CisJCWZvciAoaT0wO2k8MjU3MTtpKyspIHsKKwkJCVJDNCgma2V5LHNpemVvZihidWYpLGJ1ZixidWYpOworCQkJU0hBMV9VcGRhdGUoJmMsYnVmLHNpemVvZihidWYpKTsKKwkJfQorCQlTSEExX0ZpbmFsKG1kLCZjKTsKKworCQlpZiAobWVtY21wKG1kLGV4cGVjdGVkLHNpemVvZihtZCkpKSB7CisJCQlwcmludGYoImVycm9yIGluIFJDNCBidWxrIHRlc3RcbiIpOworCQkJcHJpbnRmKCJvdXRwdXQ6Iik7CisJCQlmb3IgKGo9MDsgajwoaW50KXNpemVvZihtZCk7IGorKykKKwkJCQlwcmludGYoIiAlMDJ4IixtZFtqXSk7CisJCQlwcmludGYoIlxuIik7CisJCQlwcmludGYoImV4cGVjdDoiKTsKKwkJCWZvciAoaj0wOyBqPChpbnQpc2l6ZW9mKG1kKTsgaisrKQorCQkJCXByaW50ZigiICUwMngiLGV4cGVjdGVkW2pdKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJCWVycisrOworCQl9CisJCWVsc2UJcHJpbnRmKCJva1xuIik7CisJfQorI2lmZGVmIE9QRU5TU0xfU1lTX05FVFdBUkUKKyAgICBpZiAoZXJyKSBwcmludGYoIkVSUk9SOiAlZFxuIiwgZXJyKTsKKyNlbmRpZgorCUVYSVQoZXJyKTsKKwlyZXR1cm4oMCk7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmM0L3JyYzQuZG9jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9ycmM0LmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjlhOTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JjNC9ycmM0LmRvYwpAQCAtMCwwICsxLDI3OCBAQAorTmV3c2dyb3Vwczogc2NpLmNyeXB0LGFsdC5zZWN1cml0eSxjb21wLnNlY3VyaXR5Lm1pc2MsYWx0LnByaXZhY3kKK1BhdGg6IGdob3N0LmRzaS51bmltaS5pdCF1bml2LWx5b24xLmZyIWp1c3NpZXUuZnIhemFwaG9kLmNyaWhhbi5mciF3YXJ3aWNrIWNseWRlLm9wZW4uYWMudWshc3RyYXRoLWNzIWJuci5jby51ayFidCFwaXBleCFob3dsYW5kLnJlc3Rvbi5hbnMubmV0IWV1cm9wYS5lbmcuZ3RlZnNkLmNvbSFNYXRoV29ya3MuQ29tIXllc2h1YS5tYXJjYW0uY29tIWNoYXJuZWwuZWNzdC5jc3VjaGljby5lZHUhY3N1c2FjIWNzdXMuZWR1IW5ldGNvbS5jb20hc3Rlcm5kYXJrCitGcm9tOiBzdGVybmRhcmtAbmV0Y29tLmNvbSAoRGF2aWQgU3Rlcm5kYXJrKQorU3ViamVjdDogUkM0IEFsZ29yaXRobSByZXZlYWxlZC4KK01lc3NhZ2UtSUQ6IDxzdGVybkN2S0w0Qi5IeXlAbmV0Y29tLmNvbT4KK1NlbmRlcjogc3Rlcm5kYXJrQG5ldGNvbS5jb20gCitPcmdhbml6YXRpb246IE5FVENPTSBPbi1saW5lIENvbW11bmljYXRpb24gU2VydmljZXMgKDQwOCAyNjEtNDcwMCBndWVzdCkKK1gtTmV3c3JlYWRlcjogVElOIFt2ZXJzaW9uIDEuMiBQTDFdCitEYXRlOiBXZWQsIDE0IFNlcCAxOTk0IDA2OjM1OjMxIEdNVAorTGluZXM6IDI2MworWHJlZjogZ2hvc3QuZHNpLnVuaW1pLml0IHNjaS5jcnlwdDoyNzMzMiBhbHQuc2VjdXJpdHk6MTQ3MzIgY29tcC5zZWN1cml0eS5taXNjOjExNzAxIGFsdC5wcml2YWN5OjE2MDI2CisKK0kgYW0gc2hvY2tlZCwgIHNob2NrZWQsIEkgdGVsbCB5b3UsICBzaG9ja2VkLCB0byBkaXNjb3ZlcgordGhhdCB0aGUgY3lwaGVycHVua3MgaGF2ZSBpbGxlZ2FseSBhbmQgY3JpbWluYWxseSByZXZlYWxlZAorYSBjcnVjaWFsIFJTQSB0cmFkZSBzZWNyZXQgYW5kIGhhcm1lZCB0aGUgc2VjdXJpdHkgb2YKK0FtZXJpY2EgYnkgcmV2ZXJzZSBlbmdpbmVlcmluZyB0aGUgUkM0IGFsZ29yaXRobSBhbmQKK3B1Ymxpc2hpbmcgaXQgdG8gdGhlIHdvcmxkLgorIAorT24gU2F0dXJkYXkgbW9ybmluZyBhbiBhbm9ueW1vdXMgY3lwaGVycHVuayB3cm90ZToKKyAKKyAKKyAgIFNVQkpFQ1Q6ICBSQzQgU291cmNlIENvZGUKKyAKKyAKKyAgIEkndmUgdGVzdGVkIHRoaXMuICBJdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFJDNCBvYmplY3QgbW9kdWxlCisgICB0aGF0IGNvbWVzIGluIHRoZSB2YXJpb3VzIFJTQSB0b29sa2l0cy4gIAorIAorICAgLyogcmM0LmggKi8KKyAgIHR5cGVkZWYgc3RydWN0IHJjNF9rZXkKKyAgIHsgICAgICAKKyAgICAgICAgdW5zaWduZWQgY2hhciBzdGF0ZVsyNTZdOyAgICAgICAKKyAgICAgICAgdW5zaWduZWQgY2hhciB4OyAgICAgICAgCisgICAgICAgIHVuc2lnbmVkIGNoYXIgeTsKKyAgIH0gcmM0X2tleTsKKyAgIHZvaWQgcHJlcGFyZV9rZXkodW5zaWduZWQgY2hhciAqa2V5X2RhdGFfcHRyLGludCBrZXlfZGF0YV9sZW4sCisgICByYzRfa2V5ICprZXkpOworICAgdm9pZCByYzQodW5zaWduZWQgY2hhciAqYnVmZmVyX3B0cixpbnQgYnVmZmVyX2xlbixyYzRfa2V5ICoga2V5KTsKKyAgIAorICAgCisgICAvKnJjNC5jICovCisgICAjaW5jbHVkZSAicmM0LmgiCisgICBzdGF0aWMgdm9pZCBzd2FwX2J5dGUodW5zaWduZWQgY2hhciAqYSwgdW5zaWduZWQgY2hhciAqYik7CisgICB2b2lkIHByZXBhcmVfa2V5KHVuc2lnbmVkIGNoYXIgKmtleV9kYXRhX3B0ciwgaW50IGtleV9kYXRhX2xlbiwKKyAgIHJjNF9rZXkgKmtleSkKKyAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBzd2FwQnl0ZTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBpbmRleDE7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgyOworICAgICAgICB1bnNpZ25lZCBjaGFyKiBzdGF0ZTsKKyAgICAgICAgc2hvcnQgY291bnRlcjsgICAgIAorICAgICAgICAKKyAgICAgICAgc3RhdGUgPSAma2V5LT5zdGF0ZVswXTsgICAgICAgICAKKyAgICAgICAgZm9yKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspICAgICAgICAgICAgICAKKyAgICAgICAgc3RhdGVbY291bnRlcl0gPSBjb3VudGVyOyAgICAgICAgICAgICAgIAorICAgICAgICBrZXktPnggPSAwOyAgICAgCisgICAgICAgIGtleS0+eSA9IDA7ICAgICAKKyAgICAgICAgaW5kZXgxID0gMDsgICAgIAorICAgICAgICBpbmRleDIgPSAwOyAgICAgICAgICAgICAKKyAgICAgICAgZm9yKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspICAgICAgCisgICAgICAgIHsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICBpbmRleDIgPSAoa2V5X2RhdGFfcHRyW2luZGV4MV0gKyBzdGF0ZVtjb3VudGVyXSArCisgICAgICAgICAgICAgICAgaW5kZXgyKSAlIDI1NjsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgc3dhcF9ieXRlKCZzdGF0ZVtjb3VudGVyXSwgJnN0YXRlW2luZGV4Ml0pOyAgICAgICAgICAgIAorICAgCisgICAgICAgICAgICAgaW5kZXgxID0gKGluZGV4MSArIDEpICUga2V5X2RhdGFfbGVuOyAgCisgICAgICAgIH0gICAgICAgCisgICAgfQorICAgIAorICAgIHZvaWQgcmM0KHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcl9wdHIsIGludCBidWZmZXJfbGVuLCByYzRfa2V5ICprZXkpCisgICAgeyAKKyAgICAgICAgdW5zaWduZWQgY2hhciB4OworICAgICAgICB1bnNpZ25lZCBjaGFyIHk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqIHN0YXRlOworICAgICAgICB1bnNpZ25lZCBjaGFyIHhvckluZGV4OworICAgICAgICBzaG9ydCBjb3VudGVyOyAgICAgICAgICAgICAgCisgICAgICAgIAorICAgICAgICB4ID0ga2V5LT54OyAgICAgCisgICAgICAgIHkgPSBrZXktPnk7ICAgICAKKyAgICAgICAgCisgICAgICAgIHN0YXRlID0gJmtleS0+c3RhdGVbMF07ICAgICAgICAgCisgICAgICAgIGZvcihjb3VudGVyID0gMDsgY291bnRlciA8IGJ1ZmZlcl9sZW47IGNvdW50ZXIgKyspICAgICAgCisgICAgICAgIHsgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICB4ID0gKHggKyAxKSAlIDI1NjsgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgeSA9IChzdGF0ZVt4XSArIHkpICUgMjU2OyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgIHN3YXBfYnl0ZSgmc3RhdGVbeF0sICZzdGF0ZVt5XSk7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICB4b3JJbmRleCA9IChzdGF0ZVt4XSArIHN0YXRlW3ldKSAlIDI1NjsgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgYnVmZmVyX3B0cltjb3VudGVyXSBePSBzdGF0ZVt4b3JJbmRleF07ICAgICAgICAgCisgICAgICAgICB9ICAgICAgICAgICAgICAgCisgICAgICAgICBrZXktPnggPSB4OyAgICAgCisgICAgICAgICBrZXktPnkgPSB5OworICAgIH0KKyAgICAKKyAgICBzdGF0aWMgdm9pZCBzd2FwX2J5dGUodW5zaWduZWQgY2hhciAqYSwgdW5zaWduZWQgY2hhciAqYikKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgc3dhcEJ5dGU7IAorICAgICAgICAKKyAgICAgICAgc3dhcEJ5dGUgPSAqYTsgCisgICAgICAgICphID0gKmI7ICAgICAgCisgICAgICAgICpiID0gc3dhcEJ5dGU7CisgICAgfQorIAorIAorIAorQW5vdGhlciBjeXBoZXJwdW5rLCB0aGlzIG9uZSBub3QgYW5vbnltb3VzLCB0ZXN0ZWQgdGhlCitvdXRwdXQgZnJvbSB0aGlzIGFsZ29yaXRobSBhZ2FpbnN0IHRoZSBvdXRwdXQgZnJvbQorb2ZmaWNpYWwgUkM0IG9iamVjdCBjb2RlCisgCisgCisgICBEYXRlOiBUdWUsIDEzIFNlcCA5NCAxODozNzo1NiBQRFQKKyAgIEZyb206IGVrckBlaXQuQ09NIChFcmljIFJlc2NvcmxhKQorICAgTWVzc2FnZS1JZDogPDk0MDkxNDAxMzcuQUExNzc0M0BlaXRlY2guZWl0LmNvbT4KKyAgIFN1YmplY3Q6IFJDNCBjb21wYXRpYmlsaXR5IHRlc3RpbmcKKyAgIENjOiBjeXBoZXJwdW5rc0B0b2FkLmNvbQorICAgCisgICBPbmUgZGF0YSBwb2ludDoKKyAgIAorICAgSSBjYW4ndCBzYXkgYW55dGhpbmcgYWJvdXQgdGhlIGludGVybmFscyBvZiBSQzQgdmVyc3VzIHRoZQorICAgYWxnb3JpdGhtIHRoYXQgQmlsbCBTb21tZXJmZWxkIGlzIHJpZ2h0bHkgY2FsbGluZyAnQWxsZWdlZCBSQzQnLAorICAgc2luY2UgSSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IFJDNCdzIGludGVybmFscy4gCisgICAKKyAgIEhvd2V2ZXIsIEkgZG8gaGF2ZSBhIChsZWdpdGltYXRlbHkgYWNxdWlyZWQpIGNvcHkgb2YgQlNBRkUyIGFuZAorICAgc28gSSdtIGFibGUgdG8gY29tcGFyZSB0aGUgb3V0cHV0IG9mIHRoaXMgYWxnb3JpdGhtIHRvIHRoZSBvdXRwdXQKKyAgIG9mIGdlbnVpbmUgUkM0IGFzIGZvdW5kIGluIEJTQUZFLiBJIGNob3NlIGEgc2V0IG9mIHRlc3QgdmVjdG9ycworICAgYW5kIHJhbiB0aGVtIHRocm91Z2ggYm90aCBhbGdvcml0aG1zLiBUaGUgYWxnb3JpdGhtcyBhcHBlYXIgdG8KKyAgIGdpdmUgaWRlbnRpY2FsIHJlc3VsdHMsIGF0IGxlYXN0IHdpdGggdGhlc2Uga2V5L3BsYWludGV4dCBwYWlycy4KKyAgIAorICAgSSBub3RlIHRoYXQgdGhpcyBpcyB0aGUgYWxnb3JpdGhtIF93aXRob3V0XyBIYWwgRmlubmV5J3MKKyAgIHByb3Bvc2VkIG1vZGlmaWNhdGlvbgorICAgCisgICAoc2VlIDwxOTk0MDkxMzA2MDUuWEFBMjQxMzNAam9iZS5zaGVsbC5wb3J0YWwuY29tPikuCisgICAKKyAgIFRoZSB2ZWN0b3JzIEkgdXNlZCAodG9nZXRoZXIgd2l0aCB0aGUgY2lwaGVydGV4dCB0aGV5IHByb2R1Y2UpCisgICBmb2xsb3cgYXQgdGhlIGVuZCBvZiB0aGlzIG1lc3NhZ2UuCisgICAKKyAgIC1Fa3IKKyAgIAorICAgRGlzY2xhaW1lcjogVGhpcyBwb3N0aW5nIGRvZXMgbm90IHJlZmxlY3QgdGhlIG9waW5pb25zIG9mIEVJVC4KKyAgIAorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS1yZXN1bHRzIGZvbGxvdy0tLS0tLS0tLS0tLS0tCisgICBUZXN0IHZlY3RvciAwCisgICBLZXk6IDB4MDEgMHgyMyAweDQ1IDB4NjcgMHg4OSAweGFiIDB4Y2QgMHhlZiAKKyAgIElucHV0OiAweDAxIDB4MjMgMHg0NSAweDY3IDB4ODkgMHhhYiAweGNkIDB4ZWYgCisgICAwIE91dHB1dDogMHg3NSAweGI3IDB4ODcgMHg4MCAweDk5IDB4ZTAgMHhjNSAweDk2IAorICAgCisgICBUZXN0IHZlY3RvciAxCisgICBLZXk6IDB4MDEgMHgyMyAweDQ1IDB4NjcgMHg4OSAweGFiIDB4Y2QgMHhlZiAKKyAgIElucHV0OiAweDAwIDB4MDAgMHgwMCAweDAwIDB4MDAgMHgwMCAweDAwIDB4MDAgCisgICAwIE91dHB1dDogMHg3NCAweDk0IDB4YzIgMHhlNyAweDEwIDB4NGIgMHgwOCAweDc5IAorICAgCisgICBUZXN0IHZlY3RvciAyCisgICBLZXk6IDB4MDAgMHgwMCAweDAwIDB4MDAgMHgwMCAweDAwIDB4MDAgMHgwMCAKKyAgIElucHV0OiAweDAwIDB4MDAgMHgwMCAweDAwIDB4MDAgMHgwMCAweDAwIDB4MDAgCisgICAwIE91dHB1dDogMHhkZSAweDE4IDB4ODkgMHg0MSAweGEzIDB4MzcgMHg1ZCAweDNhIAorICAgCisgICBUZXN0IHZlY3RvciAzCisgICBLZXk6IDB4ZWYgMHgwMSAweDIzIDB4NDUgCisgICBJbnB1dDogMHgwMCAweDAwIDB4MDAgMHgwMCAweDAwIDB4MDAgMHgwMCAweDAwIDB4MDAgMHgwMCAKKyAgIDAgT3V0cHV0OiAweGQ2IDB4YTEgMHg0MSAweGE3IDB4ZWMgMHgzYyAweDM4IDB4ZGYgMHhiZCAweDYxIAorICAgCisgICBUZXN0IHZlY3RvciA0CisgICBLZXk6IDB4MDEgMHgyMyAweDQ1IDB4NjcgMHg4OSAweGFiIDB4Y2QgMHhlZiAKKyAgIElucHV0OiAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgCisgICAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIAorICAgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAweDAxIDB4MDEgMHgwMSAKKyAgIDB4MDEgCisgICAwIE91dHB1dDogMHg3NSAweDk1IDB4YzMgMHhlNiAweDExIDB4NGEgMHgwOSAweDc4IDB4MGMgMHg0YSAweGQ0IAorICAgMHg1MiAweDMzIDB4OGUgMHgxZiAweGZkIDB4OWEgMHgxYiAweGU5IDB4NDkgMHg4ZiAKKyAgIDB4ODEgMHgzZCAweDc2IDB4NTMgMHgzNCAweDQ5IDB4YjYgMHg3NyAweDhkIDB4Y2EgCisgICAweGQ4IDB4YzcgMHg4YSAweDhkIDB4MmIgMHhhOSAweGFjIDB4NjYgMHgwOCAweDVkIAorICAgMHgwZSAweDUzIDB4ZDUgMHg5YyAweDI2IDB4YzIgMHhkMSAweGM0IDB4OTAgMHhjMSAKKyAgIDB4ZWIgMHhiZSAweDBjIDB4ZTYgMHg2ZCAweDFiIDB4NmIgMHgxYiAweDEzIDB4YjYgCisgICAweGI5IDB4MTkgMHhiOCAweDQ3IDB4YzIgMHg1YSAweDkxIDB4NDQgMHg3YSAweDk1IAorICAgMHhlNyAweDVlIDB4NGUgMHhmMSAweDY3IDB4NzkgMHhjZCAweGU4IDB4YmYgMHgwYSAKKyAgIDB4OTUgMHg4NSAweDBlIDB4MzIgMHhhZiAweDk2IDB4ODkgMHg0NCAweDRmIDB4ZDMgCisgICAweDc3IDB4MTAgMHg4ZiAweDk4IDB4ZmQgMHhjYiAweGQ0IDB4ZTcgMHgyNiAweDU2IAorICAgMHg3NSAweDAwIDB4OTkgMHgwYiAweGNjIDB4N2UgMHgwYyAweGEzIDB4YzQgMHhhYSAKKyAgIDB4YTMgMHgwNCAweGEzIDB4ODcgMHhkMiAweDBmIDB4M2IgMHg4ZiAweGJiIDB4Y2QgCisgICAweDQyIDB4YTEgMHhiZCAweDMxIDB4MWQgMHg3YSAweDQzIDB4MDMgMHhkZCAweGE1IAorICAgMHhhYiAweDA3IDB4ODggMHg5NiAweGFlIDB4ODAgMHhjMSAweDhiIDB4MGEgMHhmNiAKKyAgIDB4NmQgMHhmZiAweDMxIDB4OTYgMHgxNiAweGViIDB4NzggMHg0ZSAweDQ5IDB4NWEgCisgICAweGQyIDB4Y2UgMHg5MCAweGQ3IDB4ZjcgMHg3MiAweGE4IDB4MTcgMHg0NyAweGI2IAorICAgMHg1ZiAweDYyIDB4MDkgMHgzYiAweDFlIDB4MGQgMHhiOSAweGU1IDB4YmEgMHg1MyAKKyAgIDB4MmYgMHhhZiAweGVjIDB4NDcgMHg1MCAweDgzIDB4MjMgMHhlNiAweDcxIDB4MzIgCisgICAweDdkIDB4ZjkgMHg0NCAweDQ0IDB4MzIgMHhjYiAweDczIDB4NjcgMHhjZSAweGM4IAorICAgMHgyZiAweDVkIDB4NDQgMHhjMCAweGQwIDB4MGIgMHg2NyAweGQ2IDB4NTAgMHhhMCAKKyAgIDB4NzUgMHhjZCAweDRiIDB4NzAgMHhkZSAweGRkIDB4NzcgMHhlYiAweDliIDB4MTAgCisgICAweDIzIDB4MWIgMHg2YiAweDViIDB4NzQgMHgxMyAweDQ3IDB4MzkgMHg2ZCAweDYyIAorICAgMHg4OSAweDc0IDB4MjEgMHhkNCAweDNkIDB4ZjkgMHhiNCAweDJlIDB4NDQgMHg2ZSAKKyAgIDB4MzUgMHg4ZSAweDljIDB4MTEgMHhhOSAweGIyIDB4MTggMHg0ZSAweGNiIDB4ZWYgCisgICAweDBjIDB4ZDggMHhlNyAweGE4IDB4NzcgMHhlZiAweDk2IDB4OGYgMHgxMyAweDkwIAorICAgMHhlYyAweDliIDB4M2QgMHgzNSAweGE1IDB4NTggMHg1YyAweGIwIDB4MDkgMHgyOSAKKyAgIDB4MGUgMHgyZiAweGNkIDB4ZTcgMHhiNSAweGVjIDB4NjYgMHhkOSAweDA4IDB4NGIgCisgICAweGU0IDB4NDAgMHg1NSAweGE2IDB4MTkgMHhkOSAweGRkIDB4N2YgMHhjMyAweDE2IAorICAgMHg2ZiAweDk0IDB4ODcgMHhmNyAweGNiIDB4MjcgMHgyOSAweDEyIDB4NDIgMHg2NCAKKyAgIDB4NDUgMHg5OSAweDg1IDB4MTQgMHhjMSAweDVkIDB4NTMgMHhhMSAweDhjIDB4ODYgCisgICAweDRjIDB4ZTMgMHhhMiAweGI3IDB4NTUgMHg1NyAweDkzIDB4OTggMHg4MSAweDI2IAorICAgMHg1MiAweDBlIDB4YWMgMHhmMiAweGUzIDB4MDYgMHg2ZSAweDIzIDB4MGMgMHg5MSAKKyAgIDB4YmUgMHhlNCAweGRkIDB4NTMgMHgwNCAweGY1IDB4ZmQgMHgwNCAweDA1IDB4YjMgCisgICAweDViIDB4ZDkgMHg5YyAweDczIDB4MTMgMHg1ZCAweDNkIDB4OWIgMHhjMyAweDM1IAorICAgMHhlZSAweDA0IDB4OWUgMHhmNiAweDliIDB4MzggMHg2NyAweGJmIDB4MmQgMHg3YiAKKyAgIDB4ZDEgMHhlYSAweGE1IDB4OTUgMHhkOCAweGJmIDB4YzAgMHgwNiAweDZmIDB4ZjggCisgICAweGQzIDB4MTUgMHgwOSAweGViIDB4MGMgMHg2YyAweGFhIDB4MDAgMHg2YyAweDgwIAorICAgMHg3YSAweDYyIDB4M2UgMHhmOCAweDRjIDB4M2QgMHgzMyAweGMxIDB4OTUgMHhkMiAKKyAgIDB4M2UgMHhlMyAweDIwIDB4YzQgMHgwZCAweGUwIDB4NTUgMHg4MSAweDU3IDB4YzggCisgICAweDIyIDB4ZDQgMHhiOCAweGM1IDB4NjkgMHhkOCAweDQ5IDB4YWUgMHhkNSAweDlkIAorICAgMHg0ZSAweDBmIDB4ZDcgMHhmMyAweDc5IDB4NTggMHg2YiAweDRiIDB4N2YgMHhmNiAKKyAgIDB4ODQgMHhlZCAweDZhIDB4MTggMHg5ZiAweDc0IDB4ODYgMHhkNCAweDliIDB4OWMgCisgICAweDRiIDB4YWQgMHg5YiAweGEyIDB4NGIgMHg5NiAweGFiIDB4ZjkgMHgyNCAweDM3IAorICAgMHgyYyAweDhhIDB4OGYgMHhmZiAweGIxIDB4MGQgMHg1NSAweDM1IDB4NDkgMHgwMCAKKyAgIDB4YTcgMHg3YSAweDNkIDB4YjUgMHhmMiAweDA1IDB4ZTEgMHhiOSAweDlmIDB4Y2QgCisgICAweDg2IDB4NjAgMHg4NiAweDNhIDB4MTUgMHg5YSAweGQ0IDB4YWIgMHhlNCAweDBmIAorICAgMHhhNCAweDg5IDB4MzQgMHgxNiAweDNkIDB4ZGQgMHhlNSAweDQyIDB4YTYgMHg1OCAKKyAgIDB4NTUgMHg0MCAweGZkIDB4NjggMHgzYyAweGJmIDB4ZDggMHhjMCAweDBmIDB4MTIgCisgICAweDEyIDB4OWEgMHgyOCAweDRkIDB4ZWEgMHhjYyAweDRjIDB4ZGUgMHhmZSAweDU4IAorICAgMHhiZSAweDcxIDB4MzcgMHg1NCAweDFjIDB4MDQgMHg3MSAweDI2IDB4YzggMHhkNCAKKyAgIDB4OWUgMHgyNyAweDU1IDB4YWIgMHgxOCAweDFhIDB4YjcgMHhlOSAweDQwIDB4YjAgCisgICAweGMwIAorICAgCisKKworLS0gCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitXZSBoYXZlIHRoZSByaWdodCB0byBkZWZlbmQgb3Vyc2VsdmVzIGFuZCBvdXIKK3Byb3BlcnR5LCBiZWNhdXNlIG9mIHRoZSBraW5kIG9mIGFuaW1hbHMgdGhhdCB3ZSAgICAgICAgICAgICAgSmFtZXMgQS4gRG9uYWxkCithcmUuICBUcnVlIGxhdyBkZXJpdmVzIGZyb20gdGhpcyByaWdodCwgbm90IGZyb20KK3RoZSBhcmJpdHJhcnkgcG93ZXIgb2YgdGhlIG9tbmlwb3RlbnQgc3RhdGUuICAgICAgICAgICAgICAgIGphbWVzZEBuZXRjb20uY29tCisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JpcGVtZC9SRUFETUUgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWZmYzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JpcGVtZC9SRUFETUUKQEAgLTAsMCArMSwxNSBAQAorUklQRU1ELTE2MAoraHR0cDovL3d3dy5lc2F0Lmt1bGV1dmVuLmFjLmJlL35ib3NzZWxhZS9yaXBlbWQxNjAuaHRtbAorCitUaGlzIGlzIG15IGltcGxlbWVudGF0aW9uIG9mIFJJUEVNRC0xNjAuICBUaGUgcGVudGl1bSBhc3NlbWJlciBpcyBhIGxpdHRsZQorb2ZmIHRoZSBwYWNlIHNpbmNlIEkgb25seSBnZXQgMTA1MCBjeWNsZXMsIHdoaWxlIHRoZSBiZXN0IGlzIDEwMTMuCitJIGhhdmUgYSBmZXcgaWRlYXMgZm9yIGhvdyB0byBnZXQgYW5vdGhlciAyMCBvciBzbyBjeWNsZXMsIGJ1dCBhdAordGhpcyBwb2ludCBJIHdpbGwgbm90IGJvdGhlciByaWdodCBub3cuICBJIGJlbGlldmUgdGhlIHRyaWNrIHdpbGwgYmUKK3RvIHJlbW92ZSBteSAnY29weSBYIGFycmF5IG9udG8gc3RhY2snIHVudGlsIGluc2lkZSB0aGUgUklQMSgpIGZpbmN0aW9ucyB0aGUKK2ZpcnN0IHRpbWUgcm91bmQuICBUbyBkbyB0aGlzIEkgbmVlZCBhbm90aGVyIHJlZ2lzdGVyIGFuZCB3aWxsIG9ubHkgaGF2ZSBvbmUKK3RlbXBvcmFyeSBvbmUuICBBIGJpdCB0cmlja3kuLi4uICBJIGNhbiBhbHNvIGNsZWFudXAgdGhlIHNhdmluZyBvZiB0aGUgNSB3b3JkcworYWZ0ZXIgdGhlIGZpcnN0IGhhbGYgb2YgdGhlIGNhbGN1bGF0aW9uLiAgSSBzaG91bGQgcmVhZCB0aGUgb3JpZ2lvbmFsCit2YWx1ZSwgYWRkIHRoZW4gd3JpdGUuICBDdXJyZW50bHkgSSBqdXN0IHNhdmUgdGhlIG5ldyBhbmQgcmVhZCB0aGUgb3JpZ2lvYWwuCitJIHRoZW4gcmVhZCBib3RoIGF0IHRoZSBlbmQuICBCYWQuCisKK2VyaWMgKDIwLUphbi0xOTk4KQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JpcGVtZC9hc20vcmlwcy5jcHAgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL2FzbS9yaXBzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2ExMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JpcGVtZC9hc20vcmlwcy5jcHAKQEAgLTAsMCArMSw4MiBAQAorLy8KKy8vIGdldHRzYy5pbmwKKy8vCisvLyBnaXZlcyBhY2Nlc3MgdG8gdGhlIFBlbnRpdW0ncyAoc2VjcmV0KSBjeWNsZSBjb3VudGVyCisvLworLy8gVGhpcyBzb2Z0d2FyZSB3YXMgd3JpdHRlbiBieSBMZW9uYXJkIEphbmtlIChqYW5rZUB1bml4Zy51YmMuY2EpCisvLyBpbiAxOTk2LTcgYW5kIGlzIGVudGVyZWQsIGJ5IGhpbSwgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKworI2lmIGRlZmluZWQoX19XQVRDT01DX18pCit2b2lkIEdldFRTQyh1bnNpZ25lZCBsb25nJik7CisjcHJhZ21hIGF1eCBHZXRUU0MgPSAweDBmIDB4MzEgIm1vdiBbZWRpXSwgZWF4IiBwYXJtIFtlZGldIG1vZGlmeSBbZWR4IGVheF07CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQoraW5saW5lCit2b2lkIEdldFRTQyh1bnNpZ25lZCBsb25nJiB0c2MpCit7CisgIGFzbSB2b2xhdGlsZSgiLmJ5dGUgMTUsIDQ5XG5cdCIKKwkgICAgICAgOiAiPWVheCIgKHRzYykKKwkgICAgICAgOgorCSAgICAgICA6ICIlZWR4IiwgIiVlYXgiKTsKK30KKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCitpbmxpbmUKK3ZvaWQgR2V0VFNDKHVuc2lnbmVkIGxvbmcmIHRzYykKK3sKKyAgdW5zaWduZWQgbG9uZyBhOworICBfX2FzbSBfZW1pdCAwZmgKKyAgX19hc20gX2VtaXQgMzFoCisgIF9fYXNtIG1vdiBhLCBlYXg7CisgIHRzYz1hOworfQorI2VuZGlmICAgICAgCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmlwZW1kLmg+CisKKyNkZWZpbmUgcmlwZW1kMTYwX2Jsb2NrX3g4NiByaXBlbWQxNjBfYmxvY2tfYXNtX2hvc3Rfb3JkZXIKKworZXh0ZXJuICJDIiB7Cit2b2lkIHJpcGVtZDE2MF9ibG9ja194ODYoUklQRU1EMTYwX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpidWZmZXIsaW50IG51bSk7Cit9CisKK3ZvaWQgbWFpbihpbnQgYXJnYyxjaGFyICphcmd2W10pCisJeworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzY0KjI1Nl07CisJUklQRU1EMTYwX0NUWCBjdHg7CisJdW5zaWduZWQgbG9uZyBzMSxzMixlMSxlMjsKKwl1bnNpZ25lZCBjaGFyIGtbMTZdOworCXVuc2lnbmVkIGxvbmcgZGF0YVsyXTsKKwl1bnNpZ25lZCBjaGFyIGl2WzhdOworCWludCBpLG51bT0wLG51bW07CisJaW50IGo9MDsKKworCWlmIChhcmdjID49IDIpCisJCW51bT1hdG9pKGFyZ3ZbMV0pOworCisJaWYgKG51bSA9PSAwKSBudW09MTY7CisJaWYgKG51bSA+IDI1MCkgbnVtPTE2OworCW51bW09bnVtKzI7CisjaWYgMAorCW51bSo9NjQ7CisJbnVtbSo9NjQ7CisjZW5kaWYKKworCWZvciAoaj0wOyBqPDY7IGorKykKKwkJeworCQlmb3IgKGk9MDsgaTwxMDsgaSsrKSAvKiovCisJCQl7CisJCQlyaXBlbWQxNjBfYmxvY2tfeDg2KCZjdHgsYnVmZmVyLG51bW0pOworCQkJR2V0VFNDKHMxKTsKKwkJCXJpcGVtZDE2MF9ibG9ja194ODYoJmN0eCxidWZmZXIsbnVtbSk7CisJCQlHZXRUU0MoZTEpOworCQkJR2V0VFNDKHMyKTsKKwkJCXJpcGVtZDE2MF9ibG9ja194ODYoJmN0eCxidWZmZXIsbnVtKTsKKwkJCUdldFRTQyhlMik7CisJCQlyaXBlbWQxNjBfYmxvY2tfeDg2KCZjdHgsYnVmZmVyLG51bSk7CisJCQl9CisJCXByaW50ZigicmlwZW1kMTYwICglZCBieXRlcykgJWQgJWQgKCUuMmYpXG4iLG51bSo2NCwKKwkJCWUxLXMxLGUyLXMyLChkb3VibGUpKChlMS1zMSktKGUyLXMyKSkvMik7CisJCX0KKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvYXNtL3JtZC01ODYucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL2FzbS9ybWQtNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjJiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL2FzbS9ybWQtNTg2LnBsCkBAIC0wLDAgKzEsNTkxIEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworIyBOb3JtYWwgaXMgdGhlCisjIHJpcGVtZDE2MF9ibG9ja19hc21fZGF0YV9vcmRlcihSSVBFTUQxNjBfQ1RYICpjLCBVTE9ORyAqWCxpbnQgYmxvY2tzKTsKKworJG5vcm1hbD0wOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sJDApOworCiskQT0iZWN4IjsKKyRCPSJlc2kiOworJEM9ImVkaSI7CiskRD0iZWJ4IjsKKyRFPSJlYnAiOworJHRtcDE9ImVheCI7CiskdG1wMj0iZWR4IjsKKworJEtMMT0weDVBODI3OTk5OworJEtMMj0weDZFRDlFQkExOworJEtMMz0weDhGMUJCQ0RDOworJEtMND0weEE5NTNGRDRFOworJEtSMD0weDUwQTI4QkU2OworJEtSMT0weDVDNEREMTI0OyAKKyRLUjI9MHg2RDcwM0VGMzsKKyRLUjM9MHg3QTZENzZFOTsKKworCitAd2w9KAkgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwxNSwKKwkgNywgNCwxMywgMSwxMCwgNiwxNSwgMywxMiwgMCwgOSwgNSwgMiwxNCwxMSwgOCwKKwkgMywxMCwxNCwgNCwgOSwxNSwgOCwgMSwgMiwgNywgMCwgNiwxMywxMSwgNSwxMiwKKwkgMSwgOSwxMSwxMCwgMCwgOCwxMiwgNCwxMywgMywgNywxNSwxNCwgNSwgNiwgMiwKKwkgNCwgMCwgNSwgOSwgNywxMiwgMiwxMCwxNCwgMSwgMywgOCwxMSwgNiwxNSwxMywKKwkgKTsKKworQHdyPSgJIDUsMTQsIDcsIDAsIDksIDIsMTEsIDQsMTMsIDYsMTUsIDgsIDEsMTAsIDMsMTIsCisJIDYsMTEsIDMsIDcsIDAsMTMsIDUsMTAsMTQsMTUsIDgsMTIsIDQsIDksIDEsIDIsCisJMTUsIDUsIDEsIDMsIDcsMTQsIDYsIDksMTEsIDgsMTIsIDIsMTAsIDAsIDQsMTMsCisJIDgsIDYsIDQsIDEsIDMsMTEsMTUsIDAsIDUsMTIsIDIsMTMsIDksIDcsMTAsMTQsCisJMTIsMTUsMTAsIDQsIDEsIDUsIDgsIDcsIDYsIDIsMTMsMTQsIDAsIDMsIDksMTEsCisJKTsKKworQHNsPSgJMTEsMTQsMTUsMTIsIDUsIDgsIDcsIDksMTEsMTMsMTQsMTUsIDYsIDcsIDksIDgsCisJIDcsIDYsIDgsMTMsMTEsIDksIDcsMTUsIDcsMTIsMTUsIDksMTEsIDcsMTMsMTIsCisJMTEsMTMsIDYsIDcsMTQsIDksMTMsMTUsMTQsIDgsMTMsIDYsIDUsMTIsIDcsIDUsCisJMTEsMTIsMTQsMTUsMTQsMTUsIDksIDgsIDksMTQsIDUsIDYsIDgsIDYsIDUsMTIsCisJIDksMTUsIDUsMTEsIDYsIDgsMTMsMTIsIDUsMTIsMTMsMTQsMTEsIDgsIDUsIDYsCisJICk7CisKK0Bzcj0oCSA4LCA5LCA5LDExLDEzLDE1LDE1LCA1LCA3LCA3LCA4LDExLDE0LDE0LDEyLCA2LAorCSA5LDEzLDE1LCA3LDEyLCA4LCA5LDExLCA3LCA3LDEyLCA3LCA2LDE1LDEzLDExLAorCSA5LCA3LDE1LDExLCA4LCA2LCA2LDE0LDEyLDEzLCA1LDE0LDEzLDEzLCA3LCA1LAorCTE1LCA1LCA4LDExLDE0LDE0LCA2LDE0LCA2LCA5LDEyLCA5LDEyLCA1LDE1LCA4LAorCSA4LCA1LDEyLCA5LDEyLCA1LDE0LCA2LCA4LDEzLCA2LCA1LDE1LDEzLDExLDExLAorIAkpOworCismcmlwZW1kMTYwX2Jsb2NrKCJyaXBlbWQxNjBfYmxvY2tfYXNtX2RhdGFfb3JkZXIiKTsKKyZhc21fZmluaXNoKCk7CisKK3N1YiBYdgorCXsKKwlsb2NhbCgkbik9QF87CisJcmV0dXJuKCZzd3RtcCgkbikpOworCSMgdG1wIG9uIHN0YWNrCisJfQorCitzdWIgTnAKKwl7CisJbG9jYWwoJHApPUBfOworCWxvY2FsKCVuKT0oJEEsJEUsJEIsJEEsJEMsJEIsJEQsJEMsJEUsJEQpOworCXJldHVybigkbnskcH0pOworCX0KKworc3ViIFJJUDEKKwl7CisJbG9jYWwoJGEsJGIsJGMsJGQsJGUsJHBvcywkcywkbywkcG9zMik9QF87CisKKwkmY29tbWVudCgkcCsrKTsKKwlpZiAoJHAgJiAxKQorCQl7CisJICMmbW92KCR0bXAxLAkkYykgaWYgJG8gPT0gLTE7CisJJnhvcigkdG1wMSwJJGQpIGlmICRvID09IC0xOworCSAmbW92KCR0bXAyLAkmWHYoJHBvcykpOworCSZ4b3IoJHRtcDEsCSRiKTsKKwkgJmFkZCgkYSwJJHRtcDIpOworCSZyb3RsKCRjLAkxMCk7CisJJmFkZCgkYSwJJHRtcDEpOworCSAmbW92KCR0bXAxLAkmTnAoJGMpKTsJIyBORVhUCisJICMgWFhYCisJJnJvdGwoJGEsCSRzKTsKKwkmYWRkKCRhLAkkZSk7CisJCX0KKwllbHNlCisJCXsKKwkgJnhvcigkdG1wMSwJJGQpOworCSZtb3YoJHRtcDIsCSZYdigkcG9zKSk7CisJICZ4b3IoJHRtcDEsCSRiKTsKKwkmYWRkKCRhLAkkdG1wMSk7CisJICZtb3YoJHRtcDEsCSZOcCgkYykpIGlmICRvIDw9IDA7CisJICZtb3YoJHRtcDEsCS0xKSBpZiAkbyA9PSAxOworCSAjIFhYWCBpZiAkbyA9PSAyOworCSZyb3RsKCRjLAkxMCk7CisJJmFkZCgkYSwJJHRtcDIpOworCSAmeG9yKCR0bXAxLAkmTnAoJGQpKSBpZiAkbyA8PSAwOworCSAmbW92KCR0bXAyLAkmWHYoJHBvczIpKSBpZiAkbyA9PSAxOworCSAmbW92KCR0bXAyLAkmd3BhcmFtKDApKSBpZiAkbyA9PSAyOworCSZyb3RsKCRhLAkkcyk7CisJJmFkZCgkYSwJJGUpOworCQl9CisJfQorCitzdWIgUklQMgorCXsKKwlsb2NhbCgkYSwkYiwkYywkZCwkZSwkcG9zLCRwb3MyLCRzLCRLLCRvKT1AXzsKKworIyBYWFhYWFgKKwkmY29tbWVudCgkcCsrKTsKKwlpZiAoJHAgJiAxKQorCQl7CisjCSAmbW92KCR0bXAyLAkmWHYoJHBvcykpIGlmICRvIDwgLTE7CisjCSZtb3YoJHRtcDEsCS0xKSBpZiAkbyA8IC0xOworCisJICZhZGQoJGEsCSR0bXAyKTsKKwkmbW92KCR0bXAyLAkkYyk7CisJICZzdWIoJHRtcDEsCSRiKTsKKwkmYW5kKCR0bXAyLAkkYik7CisJICZhbmQoJHRtcDEsCSRkKTsKKwkmb3IoJHRtcDIsCSR0bXAxKTsKKwkgJm1vdigkdG1wMSwJJlh2KCRwb3MyKSkgaWYgJG8gPD0gMDsgIyBYWFhYWFhYWFhYWFhYWAorCSAjIFhYWAorCSZyb3RsKCRjLAkxMCk7CisJJmxlYSgkYSwJJkRXUCgkSywkYSwkdG1wMiwxKSk7CisJICZtb3YoJHRtcDIsCS0xKSBpZiAkbyA8PSAwOworCSAjIFhYWAorCSZyb3RsKCRhLAkkcyk7CisJJmFkZCgkYSwJJGUpOworCQl9CisJZWxzZQorCQl7CisJICMgWFhYCisJICZhZGQoJGEsCSR0bXAxKTsKKwkmbW92KCR0bXAxLAkkYyk7CisJICZzdWIoJHRtcDIsCSRiKTsKKwkmYW5kKCR0bXAxLAkkYik7CisJICZhbmQoJHRtcDIsCSRkKTsKKwlpZiAoJG8gIT0gMikKKwkJeworCSZvcigkdG1wMSwJJHRtcDIpOworCSAmbW92KCR0bXAyLAkmWHYoJHBvczIpKSBpZiAkbyA8PSAwOworCSAmbW92KCR0bXAyLAktMSkgaWYgJG8gPT0gMTsKKwkmcm90bCgkYywJMTApOworCSZsZWEoJGEsCSZEV1AoJEssJGEsJHRtcDEsMSkpOworCSAmbW92KCR0bXAxLAktMSkgaWYgJG8gPD0gMDsKKwkgJnN1YigkdG1wMiwJJk5wKCRjKSkgaWYgJG8gPT0gMTsKKwkJfSBlbHNlIHsKKwkmb3IoJHRtcDIsCSR0bXAxKTsKKwkgJm1vdigkdG1wMSwJJk5wKCRjKSk7CisJJnJvdGwoJGMsCTEwKTsKKwkmbGVhKCRhLAkmRFdQKCRLLCRhLCR0bXAyLDEpKTsKKwkgJnhvcigkdG1wMSwJJk5wKCRkKSk7CisJCX0KKwkmcm90bCgkYSwJJHMpOworCSZhZGQoJGEsCSRlKTsKKwkJfQorCX0KKworc3ViIFJJUDMKKwl7CisJbG9jYWwoJGEsJGIsJGMsJGQsJGUsJHBvcywkcywkSywkbywkcG9zMik9QF87CisKKwkmY29tbWVudCgkcCsrKTsKKwlpZiAoJHAgJiAxKQorCQl7CisjCSAmbW92KCR0bXAyLAktMSkgaWYgJG8gPCAtMTsKKyMJJnN1YigkdG1wMiwJJGMpIGlmICRvIDwgLTE7CisJICZtb3YoJHRtcDEsCSZYdigkcG9zKSk7CisJJm9yKCR0bXAyLAkkYik7CisJICZhZGQoJGEsCSR0bXAxKTsKKwkmeG9yKCR0bXAyLAkkZCk7CisJICZtb3YoJHRtcDEsCS0xKSBpZiAkbyA8PSAwOwkJIyBORVhUCisJICMgWFhYCisJJnJvdGwoJGMsCTEwKTsKKwkmbGVhKCRhLAkmRFdQKCRLLCRhLCR0bXAyLDEpKTsKKwkgJnN1YigkdG1wMSwJJk5wKCRjKSkgaWYgJG8gPD0gMDsJIyBORVhUCisJICMgWFhYCisJJnJvdGwoJGEsCSRzKTsKKwkmYWRkKCRhLAkkZSk7CisJCX0KKwllbHNlCisJCXsKKwkgJm1vdigkdG1wMiwJJlh2KCRwb3MpKTsKKwkmb3IoJHRtcDEsCSRiKTsKKwkgJmFkZCgkYSwJJHRtcDIpOworCSZ4b3IoJHRtcDEsCSRkKTsKKwkgJm1vdigkdG1wMiwJLTEpIGlmICRvIDw9IDA7CQkjIE5FWFQKKwkgJm1vdigkdG1wMiwJLTEpIGlmICRvID09IDE7CisJICZtb3YoJHRtcDIsCSZYdigkcG9zMikpIGlmICRvID09IDI7CisJJnJvdGwoJGMsCTEwKTsKKwkmbGVhKCRhLAkmRFdQKCRLLCRhLCR0bXAxLDEpKTsKKwkgJnN1YigkdG1wMiwJJk5wKCRjKSkgaWYgJG8gPD0gMDsJIyBORVhUCisJICZtb3YoJHRtcDEsCSZOcCgkZCkpIGlmICRvID09IDE7CisJICZtb3YoJHRtcDEsCS0xKSBpZiAkbyA9PSAyOworCSZyb3RsKCRhLAkkcyk7CisJJmFkZCgkYSwJJGUpOworCQl9CisJfQorCitzdWIgUklQNAorCXsKKwlsb2NhbCgkYSwkYiwkYywkZCwkZSwkcG9zLCRzLCRLLCRvKT1AXzsKKworCSZjb21tZW50KCRwKyspOworCWlmICgkcCAmIDEpCisJCXsKKyMJICZtb3YoJHRtcDIsCS0xKSBpZiAkbyA9PSAtMjsKKyMJJm1vdigkdG1wMSwJJGQpIGlmICRvID09IC0yOworCSAmc3ViKCR0bXAyLAkkZCk7CisJJmFuZCgkdG1wMSwJJGIpOworCSAmYW5kKCR0bXAyLAkkYyk7CisJJm9yKCR0bXAyLAkkdG1wMSk7CisJICZtb3YoJHRtcDEsCSZYdigkcG9zKSk7CisJJnJvdGwoJGMsCTEwKTsKKwkmbGVhKCRhLAkmRFdQKCRLLCRhLCR0bXAyKSk7CisJICZtb3YoJHRtcDIsCS0xKSB1bmxlc3MgJG8gPiAwOwkjIE5FWFQKKwkgIyBYWFgKKwkmYWRkKCRhLAkkdG1wMSk7CisJICZtb3YoJHRtcDEsCSZOcCgkZCkpIHVubGVzcyAkbyA+IDA7ICMgTkVYVAorCSAjIFhYWAorCSZyb3RsKCRhLAkkcyk7CisJJmFkZCgkYSwJJGUpOworCQl9CisJZWxzZQorCQl7CisJICZzdWIoJHRtcDIsCSRkKTsKKwkmYW5kKCR0bXAxLAkkYik7CisJICZhbmQoJHRtcDIsCSRjKTsKKwkmb3IoJHRtcDIsCSR0bXAxKTsKKwkgJm1vdigkdG1wMSwJJlh2KCRwb3MpKTsKKwkmcm90bCgkYywJMTApOworCSZsZWEoJGEsCSZEV1AoJEssJGEsJHRtcDIpKTsKKwkgJm1vdigkdG1wMiwJLTEpIGlmICRvID09IDA7CSMgTkVYVAorCSAmbW92KCR0bXAyLAktMSkgaWYgJG8gPT0gMTsKKwkgJm1vdigkdG1wMiwJLTEpIGlmICRvID09IDI7CisJICMgWFhYCisJJmFkZCgkYSwJJHRtcDEpOworCSAmbW92KCR0bXAxLAkmTnAoJGQpKSBpZiAkbyA9PSAwOwkjIE5FWFQKKwkgJnN1YigkdG1wMiwJJk5wKCRkKSkgaWYgJG8gPT0gMTsKKwkgJnN1YigkdG1wMiwJJk5wKCRjKSkgaWYgJG8gPT0gMjsKKwkgIyBYWFgKKwkmcm90bCgkYSwJJHMpOworCSZhZGQoJGEsCSRlKTsKKwkJfQorCX0KKworc3ViIFJJUDUKKwl7CisJbG9jYWwoJGEsJGIsJGMsJGQsJGUsJHBvcywkcywkSywkbyk9QF87CisKKwkmY29tbWVudCgkcCsrKTsKKwlpZiAoJHAgJiAxKQorCQl7CisJICZtb3YoJHRtcDIsCS0xKSBpZiAkbyA9PSAtMjsKKwkmc3ViKCR0bXAyLAkkZCkgaWYgJG8gPT0gLTI7CisJICZtb3YoJHRtcDEsCSZYdigkcG9zKSk7CisJJm9yKCR0bXAyLAkkYyk7CisJICZhZGQoJGEsCSR0bXAxKTsKKwkmeG9yKCR0bXAyLAkkYik7CisJICZtb3YoJHRtcDEsCS0xKSBpZiAkbyA8PSAwOworCSAjIFhYWAorCSZyb3RsKCRjLAkxMCk7CisJJmxlYSgkYSwJJkRXUCgkSywkYSwkdG1wMiwxKSk7CisJICZzdWIoJHRtcDEsCSZOcCgkZCkpIGlmICRvIDw9IDA7CisJICMgWFhYCisJJnJvdGwoJGEsCSRzKTsKKwkmYWRkKCRhLAkkZSk7CisJCX0KKwllbHNlCisJCXsKKwkgJm1vdigkdG1wMiwJJlh2KCRwb3MpKTsKKwkmb3IoJHRtcDEsCSRjKTsKKwkgJmFkZCgkYSwJJHRtcDIpOworCSZ4b3IoJHRtcDEsCSRiKTsKKwkgJm1vdigkdG1wMiwJLTEpIGlmICRvIDw9IDA7CisJICZtb3YoJHRtcDIsCSZ3cGFyYW0oMCkpIGlmICRvID09IDE7CSMgTWlkZGxlIGNvZGUKKwkgJm1vdigkdG1wMiwJLTEpIGlmICRvID09IDI7CisJJnJvdGwoJGMsCTEwKTsKKwkmbGVhKCRhLAkmRFdQKCRLLCRhLCR0bXAxLDEpKTsKKwkgJnN1YigkdG1wMiwJJk5wKCRkKSkgaWYgJG8gPD0gMDsKKwkgJm1vdigmc3d0bXAoMTYpLAkkQSkgaWYgJG8gPT0gMTsKKwkgJm1vdigkdG1wMSwJJk5wKCRkKSkgaWYgJG8gPT0gMjsKKwkmcm90bCgkYSwJJHMpOworCSZhZGQoJGEsCSRlKTsKKwkJfQorCX0KKworc3ViIHJpcGVtZDE2MF9ibG9jaworCXsKKwlsb2NhbCgkbmFtZSk9QF87CisKKwkmZnVuY3Rpb25fYmVnaW5fQigkbmFtZSwiIiwzKTsKKworCSMgcGFyYW1ldGVyIDEgaXMgdGhlIFJJUEVNRDE2MF9DVFggc3RydWN0dXJlLgorCSMgQQkwCisJIyBCCTQKKwkjIEMJOAorCSMgRCAJMTIKKwkjIEUgCTE2CisKKwkmbW92KCR0bXAyLAkmd3BhcmFtKDApKTsKKwkgJm1vdigkdG1wMSwJJndwYXJhbSgxKSk7CisJJnB1c2goImVzaSIpOworCSAmbW92KCRBLAkmRFdQKCAwLCR0bXAyLCIiLDApKTsKKwkmcHVzaCgiZWRpIik7CisJICZtb3YoJEIsCSZEV1AoIDQsJHRtcDIsIiIsMCkpOworCSZwdXNoKCJlYnAiKTsKKwkgJm1vdigkQywJJkRXUCggOCwkdG1wMiwiIiwwKSk7CisJJnB1c2goImVieCIpOworCSAmc3RhY2tfcHVzaCgxNis1KzYpOworCQkJICAjIFNwZWNpYWwgY29tbWVudCBhYm91dCB0aGUgZmlndXJlIG9mIDYuCisJCQkgICMgSWRlYSBpcyB0byBwYWQgdGhlIGN1cnJlbnQgZnJhbWUgc28KKwkJCSAgIyB0aGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGdldHMgZmFpcmx5CisJCQkgICMgYWxpZ25lZC4gV2VsbCwgYXMgeW91IHJlYWxpemUgaXQgd291bGQKKwkJCSAgIyBhbHdheXMgZGVwZW5kIG9uIGhvdyB0aGUgZnJhbWUgYmVsb3cgaXMKKwkJCSAgIyBhbGlnbmVkLiBUaGUgZ29vZCBuZXdzIGFyZSB0aGF0IGdjYy0yLjk1CisJCQkgICMgYW5kIGxhdGVyIGRvZXMga2VlcCBmaXJzdCBhcmd1bWVudCBhdAorCQkJICAjIGxlYXN0IGRvdWJsZS13aXNlIGFsaWduZWQuCisJCQkgICMJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisKKwkmc2V0X2xhYmVsKCJzdGFydCIpIHVubGVzcyAkbm9ybWFsOworCSZjb21tZW50KCIiKTsKKworCSMgJm1vdigkdG1wMSwJJndwYXJhbSgxKSk7ICMgRG9uZSBhdCBlbmQgb2YgbG9vcAorCSMgJm1vdigkdG1wMiwJJndwYXJhbSgwKSk7ICMgRG9uZSBhdCBlbmQgb2YgbG9vcAorCisJZm9yICgkej0wOyAkejwxNjsgJHorPTIpCisJCXsKKwkJJm1vdigkRCwJCSZEV1AoICR6KjQsJHRtcDEsIiIsMCkpOworCQkgJm1vdigkRSwJCSZEV1AoICgkeisxKSo0LCR0bXAxLCIiLDApKTsKKwkJJm1vdigmc3d0bXAoJHopLAkkRCk7CisJCSAmbW92KCZzd3RtcCgkeisxKSwJJEUpOworCQl9CisJJm1vdigkdG1wMSwJJEMpOworCSAmbW92KCRELAkmRFdQKDEyLCR0bXAyLCIiLDApKTsKKwkmbW92KCRFLAkmRFdQKDE2LCR0bXAyLCIiLDApKTsKKworCSZSSVAxKCRBLCRCLCRDLCRELCRFLCR3bFsgMF0sJHNsWyAwXSwtMSk7CisJJlJJUDEoJEUsJEEsJEIsJEMsJEQsJHdsWyAxXSwkc2xbIDFdLDApOworCSZSSVAxKCRELCRFLCRBLCRCLCRDLCR3bFsgMl0sJHNsWyAyXSwwKTsKKwkmUklQMSgkQywkRCwkRSwkQSwkQiwkd2xbIDNdLCRzbFsgM10sMCk7CisJJlJJUDEoJEIsJEMsJEQsJEUsJEEsJHdsWyA0XSwkc2xbIDRdLDApOworCSZSSVAxKCRBLCRCLCRDLCRELCRFLCR3bFsgNV0sJHNsWyA1XSwwKTsKKwkmUklQMSgkRSwkQSwkQiwkQywkRCwkd2xbIDZdLCRzbFsgNl0sMCk7CisJJlJJUDEoJEQsJEUsJEEsJEIsJEMsJHdsWyA3XSwkc2xbIDddLDApOworCSZSSVAxKCRDLCRELCRFLCRBLCRCLCR3bFsgOF0sJHNsWyA4XSwwKTsKKwkmUklQMSgkQiwkQywkRCwkRSwkQSwkd2xbIDldLCRzbFsgOV0sMCk7CisJJlJJUDEoJEEsJEIsJEMsJEQsJEUsJHdsWzEwXSwkc2xbMTBdLDApOworCSZSSVAxKCRFLCRBLCRCLCRDLCRELCR3bFsxMV0sJHNsWzExXSwwKTsKKwkmUklQMSgkRCwkRSwkQSwkQiwkQywkd2xbMTJdLCRzbFsxMl0sMCk7CisJJlJJUDEoJEMsJEQsJEUsJEEsJEIsJHdsWzEzXSwkc2xbMTNdLDApOworCSZSSVAxKCRCLCRDLCRELCRFLCRBLCR3bFsxNF0sJHNsWzE0XSwwKTsKKwkmUklQMSgkQSwkQiwkQywkRCwkRSwkd2xbMTVdLCRzbFsxNV0sMSwkd2xbMTZdKTsKKworCSZSSVAyKCRFLCRBLCRCLCRDLCRELCR3bFsxNl0sJHdsWzE3XSwkc2xbMTZdLCRLTDEsLTEpOworCSZSSVAyKCRELCRFLCRBLCRCLCRDLCR3bFsxN10sJHdsWzE4XSwkc2xbMTddLCRLTDEsMCk7CisJJlJJUDIoJEMsJEQsJEUsJEEsJEIsJHdsWzE4XSwkd2xbMTldLCRzbFsxOF0sJEtMMSwwKTsKKwkmUklQMigkQiwkQywkRCwkRSwkQSwkd2xbMTldLCR3bFsyMF0sJHNsWzE5XSwkS0wxLDApOworCSZSSVAyKCRBLCRCLCRDLCRELCRFLCR3bFsyMF0sJHdsWzIxXSwkc2xbMjBdLCRLTDEsMCk7CisJJlJJUDIoJEUsJEEsJEIsJEMsJEQsJHdsWzIxXSwkd2xbMjJdLCRzbFsyMV0sJEtMMSwwKTsKKwkmUklQMigkRCwkRSwkQSwkQiwkQywkd2xbMjJdLCR3bFsyM10sJHNsWzIyXSwkS0wxLDApOworCSZSSVAyKCRDLCRELCRFLCRBLCRCLCR3bFsyM10sJHdsWzI0XSwkc2xbMjNdLCRLTDEsMCk7CisJJlJJUDIoJEIsJEMsJEQsJEUsJEEsJHdsWzI0XSwkd2xbMjVdLCRzbFsyNF0sJEtMMSwwKTsKKwkmUklQMigkQSwkQiwkQywkRCwkRSwkd2xbMjVdLCR3bFsyNl0sJHNsWzI1XSwkS0wxLDApOworCSZSSVAyKCRFLCRBLCRCLCRDLCRELCR3bFsyNl0sJHdsWzI3XSwkc2xbMjZdLCRLTDEsMCk7CisJJlJJUDIoJEQsJEUsJEEsJEIsJEMsJHdsWzI3XSwkd2xbMjhdLCRzbFsyN10sJEtMMSwwKTsKKwkmUklQMigkQywkRCwkRSwkQSwkQiwkd2xbMjhdLCR3bFsyOV0sJHNsWzI4XSwkS0wxLDApOworCSZSSVAyKCRCLCRDLCRELCRFLCRBLCR3bFsyOV0sJHdsWzMwXSwkc2xbMjldLCRLTDEsMCk7CisJJlJJUDIoJEEsJEIsJEMsJEQsJEUsJHdsWzMwXSwkd2xbMzFdLCRzbFszMF0sJEtMMSwwKTsKKwkmUklQMigkRSwkQSwkQiwkQywkRCwkd2xbMzFdLCR3bFszMl0sJHNsWzMxXSwkS0wxLDEpOworCisJJlJJUDMoJEQsJEUsJEEsJEIsJEMsJHdsWzMyXSwkc2xbMzJdLCRLTDIsLTEpOworCSZSSVAzKCRDLCRELCRFLCRBLCRCLCR3bFszM10sJHNsWzMzXSwkS0wyLDApOworCSZSSVAzKCRCLCRDLCRELCRFLCRBLCR3bFszNF0sJHNsWzM0XSwkS0wyLDApOworCSZSSVAzKCRBLCRCLCRDLCRELCRFLCR3bFszNV0sJHNsWzM1XSwkS0wyLDApOworCSZSSVAzKCRFLCRBLCRCLCRDLCRELCR3bFszNl0sJHNsWzM2XSwkS0wyLDApOworCSZSSVAzKCRELCRFLCRBLCRCLCRDLCR3bFszN10sJHNsWzM3XSwkS0wyLDApOworCSZSSVAzKCRDLCRELCRFLCRBLCRCLCR3bFszOF0sJHNsWzM4XSwkS0wyLDApOworCSZSSVAzKCRCLCRDLCRELCRFLCRBLCR3bFszOV0sJHNsWzM5XSwkS0wyLDApOworCSZSSVAzKCRBLCRCLCRDLCRELCRFLCR3bFs0MF0sJHNsWzQwXSwkS0wyLDApOworCSZSSVAzKCRFLCRBLCRCLCRDLCRELCR3bFs0MV0sJHNsWzQxXSwkS0wyLDApOworCSZSSVAzKCRELCRFLCRBLCRCLCRDLCR3bFs0Ml0sJHNsWzQyXSwkS0wyLDApOworCSZSSVAzKCRDLCRELCRFLCRBLCRCLCR3bFs0M10sJHNsWzQzXSwkS0wyLDApOworCSZSSVAzKCRCLCRDLCRELCRFLCRBLCR3bFs0NF0sJHNsWzQ0XSwkS0wyLDApOworCSZSSVAzKCRBLCRCLCRDLCRELCRFLCR3bFs0NV0sJHNsWzQ1XSwkS0wyLDApOworCSZSSVAzKCRFLCRBLCRCLCRDLCRELCR3bFs0Nl0sJHNsWzQ2XSwkS0wyLDApOworCSZSSVAzKCRELCRFLCRBLCRCLCRDLCR3bFs0N10sJHNsWzQ3XSwkS0wyLDEpOworCisJJlJJUDQoJEMsJEQsJEUsJEEsJEIsJHdsWzQ4XSwkc2xbNDhdLCRLTDMsLTEpOworCSZSSVA0KCRCLCRDLCRELCRFLCRBLCR3bFs0OV0sJHNsWzQ5XSwkS0wzLDApOworCSZSSVA0KCRBLCRCLCRDLCRELCRFLCR3bFs1MF0sJHNsWzUwXSwkS0wzLDApOworCSZSSVA0KCRFLCRBLCRCLCRDLCRELCR3bFs1MV0sJHNsWzUxXSwkS0wzLDApOworCSZSSVA0KCRELCRFLCRBLCRCLCRDLCR3bFs1Ml0sJHNsWzUyXSwkS0wzLDApOworCSZSSVA0KCRDLCRELCRFLCRBLCRCLCR3bFs1M10sJHNsWzUzXSwkS0wzLDApOworCSZSSVA0KCRCLCRDLCRELCRFLCRBLCR3bFs1NF0sJHNsWzU0XSwkS0wzLDApOworCSZSSVA0KCRBLCRCLCRDLCRELCRFLCR3bFs1NV0sJHNsWzU1XSwkS0wzLDApOworCSZSSVA0KCRFLCRBLCRCLCRDLCRELCR3bFs1Nl0sJHNsWzU2XSwkS0wzLDApOworCSZSSVA0KCRELCRFLCRBLCRCLCRDLCR3bFs1N10sJHNsWzU3XSwkS0wzLDApOworCSZSSVA0KCRDLCRELCRFLCRBLCRCLCR3bFs1OF0sJHNsWzU4XSwkS0wzLDApOworCSZSSVA0KCRCLCRDLCRELCRFLCRBLCR3bFs1OV0sJHNsWzU5XSwkS0wzLDApOworCSZSSVA0KCRBLCRCLCRDLCRELCRFLCR3bFs2MF0sJHNsWzYwXSwkS0wzLDApOworCSZSSVA0KCRFLCRBLCRCLCRDLCRELCR3bFs2MV0sJHNsWzYxXSwkS0wzLDApOworCSZSSVA0KCRELCRFLCRBLCRCLCRDLCR3bFs2Ml0sJHNsWzYyXSwkS0wzLDApOworCSZSSVA0KCRDLCRELCRFLCRBLCRCLCR3bFs2M10sJHNsWzYzXSwkS0wzLDEpOworCisJJlJJUDUoJEIsJEMsJEQsJEUsJEEsJHdsWzY0XSwkc2xbNjRdLCRLTDQsLTEpOworCSZSSVA1KCRBLCRCLCRDLCRELCRFLCR3bFs2NV0sJHNsWzY1XSwkS0w0LDApOworCSZSSVA1KCRFLCRBLCRCLCRDLCRELCR3bFs2Nl0sJHNsWzY2XSwkS0w0LDApOworCSZSSVA1KCRELCRFLCRBLCRCLCRDLCR3bFs2N10sJHNsWzY3XSwkS0w0LDApOworCSZSSVA1KCRDLCRELCRFLCRBLCRCLCR3bFs2OF0sJHNsWzY4XSwkS0w0LDApOworCSZSSVA1KCRCLCRDLCRELCRFLCRBLCR3bFs2OV0sJHNsWzY5XSwkS0w0LDApOworCSZSSVA1KCRBLCRCLCRDLCRELCRFLCR3bFs3MF0sJHNsWzcwXSwkS0w0LDApOworCSZSSVA1KCRFLCRBLCRCLCRDLCRELCR3bFs3MV0sJHNsWzcxXSwkS0w0LDApOworCSZSSVA1KCRELCRFLCRBLCRCLCRDLCR3bFs3Ml0sJHNsWzcyXSwkS0w0LDApOworCSZSSVA1KCRDLCRELCRFLCRBLCRCLCR3bFs3M10sJHNsWzczXSwkS0w0LDApOworCSZSSVA1KCRCLCRDLCRELCRFLCRBLCR3bFs3NF0sJHNsWzc0XSwkS0w0LDApOworCSZSSVA1KCRBLCRCLCRDLCRELCRFLCR3bFs3NV0sJHNsWzc1XSwkS0w0LDApOworCSZSSVA1KCRFLCRBLCRCLCRDLCRELCR3bFs3Nl0sJHNsWzc2XSwkS0w0LDApOworCSZSSVA1KCRELCRFLCRBLCRCLCRDLCR3bFs3N10sJHNsWzc3XSwkS0w0LDApOworCSZSSVA1KCRDLCRELCRFLCRBLCRCLCR3bFs3OF0sJHNsWzc4XSwkS0w0LDApOworCSZSSVA1KCRCLCRDLCRELCRFLCRBLCR3bFs3OV0sJHNsWzc5XSwkS0w0LDEpOworCisJIyAmbW92KCR0bXAyLAkmd3BhcmFtKDApKTsgIyBtb3ZlZCBpbnRvIGxhc3QgUklQNQorCSMgJm1vdigmc3d0bXAoMTYpLAkkQSk7CisJICZtb3YoJEEsCSZEV1AoIDAsJHRtcDIsIiIsMCkpOworCSZtb3YoJnN3dG1wKDE2KzEpLAkkQik7CisJICZtb3YoJnN3dG1wKDE2KzIpLAkkQyk7CisJJm1vdigkQiwJJkRXUCggNCwkdG1wMiwiIiwwKSk7CisJICZtb3YoJnN3dG1wKDE2KzMpLAkkRCk7CisJJm1vdigkQywJJkRXUCggOCwkdG1wMiwiIiwwKSk7CisJICZtb3YoJnN3dG1wKDE2KzQpLAkkRSk7CisJJm1vdigkRCwJJkRXUCgxMiwkdG1wMiwiIiwwKSk7CisJICZtb3YoJEUsCSZEV1AoMTYsJHRtcDIsIiIsMCkpOworCisJJlJJUDUoJEEsJEIsJEMsJEQsJEUsJHdyWyAwXSwkc3JbIDBdLCRLUjAsLTIpOworCSZSSVA1KCRFLCRBLCRCLCRDLCRELCR3clsgMV0sJHNyWyAxXSwkS1IwLDApOworCSZSSVA1KCRELCRFLCRBLCRCLCRDLCR3clsgMl0sJHNyWyAyXSwkS1IwLDApOworCSZSSVA1KCRDLCRELCRFLCRBLCRCLCR3clsgM10sJHNyWyAzXSwkS1IwLDApOworCSZSSVA1KCRCLCRDLCRELCRFLCRBLCR3clsgNF0sJHNyWyA0XSwkS1IwLDApOworCSZSSVA1KCRBLCRCLCRDLCRELCRFLCR3clsgNV0sJHNyWyA1XSwkS1IwLDApOworCSZSSVA1KCRFLCRBLCRCLCRDLCRELCR3clsgNl0sJHNyWyA2XSwkS1IwLDApOworCSZSSVA1KCRELCRFLCRBLCRCLCRDLCR3clsgN10sJHNyWyA3XSwkS1IwLDApOworCSZSSVA1KCRDLCRELCRFLCRBLCRCLCR3clsgOF0sJHNyWyA4XSwkS1IwLDApOworCSZSSVA1KCRCLCRDLCRELCRFLCRBLCR3clsgOV0sJHNyWyA5XSwkS1IwLDApOworCSZSSVA1KCRBLCRCLCRDLCRELCRFLCR3clsxMF0sJHNyWzEwXSwkS1IwLDApOworCSZSSVA1KCRFLCRBLCRCLCRDLCRELCR3clsxMV0sJHNyWzExXSwkS1IwLDApOworCSZSSVA1KCRELCRFLCRBLCRCLCRDLCR3clsxMl0sJHNyWzEyXSwkS1IwLDApOworCSZSSVA1KCRDLCRELCRFLCRBLCRCLCR3clsxM10sJHNyWzEzXSwkS1IwLDApOworCSZSSVA1KCRCLCRDLCRELCRFLCRBLCR3clsxNF0sJHNyWzE0XSwkS1IwLDApOworCSZSSVA1KCRBLCRCLCRDLCRELCRFLCR3clsxNV0sJHNyWzE1XSwkS1IwLDIpOworCisJJlJJUDQoJEUsJEEsJEIsJEMsJEQsJHdyWzE2XSwkc3JbMTZdLCRLUjEsLTIpOworCSZSSVA0KCRELCRFLCRBLCRCLCRDLCR3clsxN10sJHNyWzE3XSwkS1IxLDApOworCSZSSVA0KCRDLCRELCRFLCRBLCRCLCR3clsxOF0sJHNyWzE4XSwkS1IxLDApOworCSZSSVA0KCRCLCRDLCRELCRFLCRBLCR3clsxOV0sJHNyWzE5XSwkS1IxLDApOworCSZSSVA0KCRBLCRCLCRDLCRELCRFLCR3clsyMF0sJHNyWzIwXSwkS1IxLDApOworCSZSSVA0KCRFLCRBLCRCLCRDLCRELCR3clsyMV0sJHNyWzIxXSwkS1IxLDApOworCSZSSVA0KCRELCRFLCRBLCRCLCRDLCR3clsyMl0sJHNyWzIyXSwkS1IxLDApOworCSZSSVA0KCRDLCRELCRFLCRBLCRCLCR3clsyM10sJHNyWzIzXSwkS1IxLDApOworCSZSSVA0KCRCLCRDLCRELCRFLCRBLCR3clsyNF0sJHNyWzI0XSwkS1IxLDApOworCSZSSVA0KCRBLCRCLCRDLCRELCRFLCR3clsyNV0sJHNyWzI1XSwkS1IxLDApOworCSZSSVA0KCRFLCRBLCRCLCRDLCRELCR3clsyNl0sJHNyWzI2XSwkS1IxLDApOworCSZSSVA0KCRELCRFLCRBLCRCLCRDLCR3clsyN10sJHNyWzI3XSwkS1IxLDApOworCSZSSVA0KCRDLCRELCRFLCRBLCRCLCR3clsyOF0sJHNyWzI4XSwkS1IxLDApOworCSZSSVA0KCRCLCRDLCRELCRFLCRBLCR3clsyOV0sJHNyWzI5XSwkS1IxLDApOworCSZSSVA0KCRBLCRCLCRDLCRELCRFLCR3clszMF0sJHNyWzMwXSwkS1IxLDApOworCSZSSVA0KCRFLCRBLCRCLCRDLCRELCR3clszMV0sJHNyWzMxXSwkS1IxLDIpOworCisJJlJJUDMoJEQsJEUsJEEsJEIsJEMsJHdyWzMyXSwkc3JbMzJdLCRLUjIsLTIpOworCSZSSVAzKCRDLCRELCRFLCRBLCRCLCR3clszM10sJHNyWzMzXSwkS1IyLDApOworCSZSSVAzKCRCLCRDLCRELCRFLCRBLCR3clszNF0sJHNyWzM0XSwkS1IyLDApOworCSZSSVAzKCRBLCRCLCRDLCRELCRFLCR3clszNV0sJHNyWzM1XSwkS1IyLDApOworCSZSSVAzKCRFLCRBLCRCLCRDLCRELCR3clszNl0sJHNyWzM2XSwkS1IyLDApOworCSZSSVAzKCRELCRFLCRBLCRCLCRDLCR3clszN10sJHNyWzM3XSwkS1IyLDApOworCSZSSVAzKCRDLCRELCRFLCRBLCRCLCR3clszOF0sJHNyWzM4XSwkS1IyLDApOworCSZSSVAzKCRCLCRDLCRELCRFLCRBLCR3clszOV0sJHNyWzM5XSwkS1IyLDApOworCSZSSVAzKCRBLCRCLCRDLCRELCRFLCR3cls0MF0sJHNyWzQwXSwkS1IyLDApOworCSZSSVAzKCRFLCRBLCRCLCRDLCRELCR3cls0MV0sJHNyWzQxXSwkS1IyLDApOworCSZSSVAzKCRELCRFLCRBLCRCLCRDLCR3cls0Ml0sJHNyWzQyXSwkS1IyLDApOworCSZSSVAzKCRDLCRELCRFLCRBLCRCLCR3cls0M10sJHNyWzQzXSwkS1IyLDApOworCSZSSVAzKCRCLCRDLCRELCRFLCRBLCR3cls0NF0sJHNyWzQ0XSwkS1IyLDApOworCSZSSVAzKCRBLCRCLCRDLCRELCRFLCR3cls0NV0sJHNyWzQ1XSwkS1IyLDApOworCSZSSVAzKCRFLCRBLCRCLCRDLCRELCR3cls0Nl0sJHNyWzQ2XSwkS1IyLDApOworCSZSSVAzKCRELCRFLCRBLCRCLCRDLCR3cls0N10sJHNyWzQ3XSwkS1IyLDIsJHdyWzQ4XSk7CisKKwkmUklQMigkQywkRCwkRSwkQSwkQiwkd3JbNDhdLCR3cls0OV0sJHNyWzQ4XSwkS1IzLC0yKTsKKwkmUklQMigkQiwkQywkRCwkRSwkQSwkd3JbNDldLCR3cls1MF0sJHNyWzQ5XSwkS1IzLDApOworCSZSSVAyKCRBLCRCLCRDLCRELCRFLCR3cls1MF0sJHdyWzUxXSwkc3JbNTBdLCRLUjMsMCk7CisJJlJJUDIoJEUsJEEsJEIsJEMsJEQsJHdyWzUxXSwkd3JbNTJdLCRzcls1MV0sJEtSMywwKTsKKwkmUklQMigkRCwkRSwkQSwkQiwkQywkd3JbNTJdLCR3cls1M10sJHNyWzUyXSwkS1IzLDApOworCSZSSVAyKCRDLCRELCRFLCRBLCRCLCR3cls1M10sJHdyWzU0XSwkc3JbNTNdLCRLUjMsMCk7CisJJlJJUDIoJEIsJEMsJEQsJEUsJEEsJHdyWzU0XSwkd3JbNTVdLCRzcls1NF0sJEtSMywwKTsKKwkmUklQMigkQSwkQiwkQywkRCwkRSwkd3JbNTVdLCR3cls1Nl0sJHNyWzU1XSwkS1IzLDApOworCSZSSVAyKCRFLCRBLCRCLCRDLCRELCR3cls1Nl0sJHdyWzU3XSwkc3JbNTZdLCRLUjMsMCk7CisJJlJJUDIoJEQsJEUsJEEsJEIsJEMsJHdyWzU3XSwkd3JbNThdLCRzcls1N10sJEtSMywwKTsKKwkmUklQMigkQywkRCwkRSwkQSwkQiwkd3JbNThdLCR3cls1OV0sJHNyWzU4XSwkS1IzLDApOworCSZSSVAyKCRCLCRDLCRELCRFLCRBLCR3cls1OV0sJHdyWzYwXSwkc3JbNTldLCRLUjMsMCk7CisJJlJJUDIoJEEsJEIsJEMsJEQsJEUsJHdyWzYwXSwkd3JbNjFdLCRzcls2MF0sJEtSMywwKTsKKwkmUklQMigkRSwkQSwkQiwkQywkRCwkd3JbNjFdLCR3cls2Ml0sJHNyWzYxXSwkS1IzLDApOworCSZSSVAyKCRELCRFLCRBLCRCLCRDLCR3cls2Ml0sJHdyWzYzXSwkc3JbNjJdLCRLUjMsMCk7CisJJlJJUDIoJEMsJEQsJEUsJEEsJEIsJHdyWzYzXSwkd3JbNjRdLCRzcls2M10sJEtSMywyKTsKKworCSZSSVAxKCRCLCRDLCRELCRFLCRBLCR3cls2NF0sJHNyWzY0XSwtMik7CisJJlJJUDEoJEEsJEIsJEMsJEQsJEUsJHdyWzY1XSwkc3JbNjVdLDApOworCSZSSVAxKCRFLCRBLCRCLCRDLCRELCR3cls2Nl0sJHNyWzY2XSwwKTsKKwkmUklQMSgkRCwkRSwkQSwkQiwkQywkd3JbNjddLCRzcls2N10sMCk7CisJJlJJUDEoJEMsJEQsJEUsJEEsJEIsJHdyWzY4XSwkc3JbNjhdLDApOworCSZSSVAxKCRCLCRDLCRELCRFLCRBLCR3cls2OV0sJHNyWzY5XSwwKTsKKwkmUklQMSgkQSwkQiwkQywkRCwkRSwkd3JbNzBdLCRzcls3MF0sMCk7CisJJlJJUDEoJEUsJEEsJEIsJEMsJEQsJHdyWzcxXSwkc3JbNzFdLDApOworCSZSSVAxKCRELCRFLCRBLCRCLCRDLCR3cls3Ml0sJHNyWzcyXSwwKTsKKwkmUklQMSgkQywkRCwkRSwkQSwkQiwkd3JbNzNdLCRzcls3M10sMCk7CisJJlJJUDEoJEIsJEMsJEQsJEUsJEEsJHdyWzc0XSwkc3JbNzRdLDApOworCSZSSVAxKCRBLCRCLCRDLCRELCRFLCR3cls3NV0sJHNyWzc1XSwwKTsKKwkmUklQMSgkRSwkQSwkQiwkQywkRCwkd3JbNzZdLCRzcls3Nl0sMCk7CisJJlJJUDEoJEQsJEUsJEEsJEIsJEMsJHdyWzc3XSwkc3JbNzddLDApOworCSZSSVAxKCRDLCRELCRFLCRBLCRCLCR3cls3OF0sJHNyWzc4XSwwKTsKKwkmUklQMSgkQiwkQywkRCwkRSwkQSwkd3JbNzldLCRzcls3OV0sMik7CisKKwkjICZtb3YoJHRtcDIsCSZ3cGFyYW0oMCkpOyAjIE1vdmVkIGludG8gbGFzdCByb3VuZAorCisJICZtb3YoJHRtcDEsCSZEV1AoIDQsJHRtcDIsIiIsMCkpOwkjIGN0eC0+QgorIAkmYWRkKCRELAkkdG1wMSk7CQorCSAmbW92KCR0bXAxLAkmc3d0bXAoMTYrMikpOwkJIyAkYworCSZhZGQoJEQsCSR0bXAxKTsKKworCSAmbW92KCR0bXAxLAkmRFdQKCA4LCR0bXAyLCIiLDApKTsJIyBjdHgtPkMKKwkmYWRkKCRFLAkkdG1wMSk7CQorCSAmbW92KCR0bXAxLAkmc3d0bXAoMTYrMykpOwkJIyAkZAorCSZhZGQoJEUsCSR0bXAxKTsKKworCSAmbW92KCR0bXAxLAkmRFdQKDEyLCR0bXAyLCIiLDApKTsJIyBjdHgtPkQKKwkmYWRkKCRBLAkkdG1wMSk7CQorCSAmbW92KCR0bXAxLAkmc3d0bXAoMTYrNCkpOwkJIyAkZQorCSZhZGQoJEEsCSR0bXAxKTsKKworCisJICZtb3YoJHRtcDEsCSZEV1AoMTYsJHRtcDIsIiIsMCkpOwkjIGN0eC0+RQorCSZhZGQoJEIsCSR0bXAxKTsJCisJICZtb3YoJHRtcDEsCSZzd3RtcCgxNiswKSk7CQkjICRhCisJJmFkZCgkQiwJJHRtcDEpOworCisJICZtb3YoJHRtcDEsCSZEV1AoIDAsJHRtcDIsIiIsMCkpOwkjIGN0eC0+QQorCSZhZGQoJEMsCSR0bXAxKTsJCisJICZtb3YoJHRtcDEsCSZzd3RtcCgxNisxKSk7CQkjICRiCisJJmFkZCgkQywJJHRtcDEpOworCisJICZtb3YoJHRtcDEsCSZ3cGFyYW0oMikpOworCisJJm1vdigmRFdQKCAwLCR0bXAyLCIiLDApLAkkRCk7CisJICZtb3YoJkRXUCggNCwkdG1wMiwiIiwwKSwJJEUpOworCSZtb3YoJkRXUCggOCwkdG1wMiwiIiwwKSwJJEEpOworCSAmc3ViKCR0bXAxLDEpOworCSZtb3YoJkRXUCgxMiwkdG1wMiwiIiwwKSwJJEIpOworCSAmbW92KCZEV1AoMTYsJHRtcDIsIiIsMCksCSRDKTsKKworCSZqbGUoJmxhYmVsKCJnZXRfb3V0IikpOworCisJJm1vdigmd3BhcmFtKDIpLCR0bXAxKTsKKwkgJm1vdigkQywJJEEpOworCSZtb3YoJHRtcDEsCSZ3cGFyYW0oMSkpOworCSAmbW92KCRBLAkkRCk7CisJJmFkZCgkdG1wMSwJNjQpOworCSAmbW92KCRCLAkkRSk7CisJJm1vdigmd3BhcmFtKDEpLCR0bXAxKTsKKworCSZqbXAoJmxhYmVsKCJzdGFydCIpKTsKKworCSZzZXRfbGFiZWwoImdldF9vdXQiKTsKKworCSZzdGFja19wb3AoMTYrNSs2KTsKKworCSZwb3AoImVieCIpOworCSZwb3AoImVicCIpOworCSZwb3AoImVkaSIpOworCSZwb3AoImVzaSIpOworCSZyZXQoKTsKKwkmZnVuY3Rpb25fZW5kX0IoJG5hbWUpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JpcGVtZC9yaXBlbWQuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcmlwZW1kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0MmViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcmlwZW1kLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qIGNyeXB0by9yaXBlbWQvcmlwZW1kLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfUklQRU1EX0gKKyNkZWZpbmUgSEVBREVSX1JJUEVNRF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX05PX1JJUEVNRAorI2Vycm9yIFJJUEVNRCBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0xQMzJfXykKKyNkZWZpbmUgUklQRU1EMTYwX0xPTkcgdW5zaWduZWQgbG9uZworI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19DUkFZKSB8fCBkZWZpbmVkKF9fSUxQNjRfXykKKyNkZWZpbmUgUklQRU1EMTYwX0xPTkcgdW5zaWduZWQgbG9uZworI2RlZmluZSBSSVBFTUQxNjBfTE9OR19MT0cyIDMKKyNlbHNlCisjZGVmaW5lIFJJUEVNRDE2MF9MT05HIHVuc2lnbmVkIGludAorI2VuZGlmCisKKyNkZWZpbmUgUklQRU1EMTYwX0NCTE9DSwk2NAorI2RlZmluZSBSSVBFTUQxNjBfTEJMT0NLCShSSVBFTUQxNjBfQ0JMT0NLLzQpCisjZGVmaW5lIFJJUEVNRDE2MF9ESUdFU1RfTEVOR1RICTIwCisKK3R5cGVkZWYgc3RydWN0IFJJUEVNRDE2MHN0YXRlX3N0CisJeworCVJJUEVNRDE2MF9MT05HIEEsQixDLEQsRTsKKwlSSVBFTUQxNjBfTE9ORyBObCxOaDsKKwlSSVBFTUQxNjBfTE9ORyBkYXRhW1JJUEVNRDE2MF9MQkxPQ0tdOworCXVuc2lnbmVkIGludCAgIG51bTsKKwl9IFJJUEVNRDE2MF9DVFg7CisKK2ludCBSSVBFTUQxNjBfSW5pdChSSVBFTUQxNjBfQ1RYICpjKTsKK2ludCBSSVBFTUQxNjBfVXBkYXRlKFJJUEVNRDE2MF9DVFggKmMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworaW50IFJJUEVNRDE2MF9GaW5hbCh1bnNpZ25lZCBjaGFyICptZCwgUklQRU1EMTYwX0NUWCAqYyk7Cit1bnNpZ25lZCBjaGFyICpSSVBFTUQxNjAoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sCisJdW5zaWduZWQgY2hhciAqbWQpOwordm9pZCBSSVBFTUQxNjBfVHJhbnNmb3JtKFJJUEVNRDE2MF9DVFggKmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmIpOworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JpcGVtZC9ybWQxNjAuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kMTYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlYzU3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kMTYwLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIGNyeXB0by9yaXBlbWQvcm1kMTYwLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yaXBlbWQuaD4KKworI2RlZmluZSBCVUZTSVpFCTEwMjQqMTYKKwordm9pZCBkb19mcChGSUxFICpmKTsKK3ZvaWQgcHQodW5zaWduZWQgY2hhciAqbWQpOworI2lmICFkZWZpbmVkKF9PU0RfUE9TSVgpICYmICFkZWZpbmVkKF9fREpHUFBfXykKK2ludCByZWFkKGludCwgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOworI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKwl7CisJaW50IGksZXJyPTA7CisJRklMRSAqSU47CisKKwlpZiAoYXJnYyA9PSAxKQorCQl7CisJCWRvX2ZwKHN0ZGluKTsKKwkJfQorCWVsc2UKKwkJeworCQlmb3IgKGk9MTsgaTxhcmdjOyBpKyspCisJCQl7CisJCQlJTj1mb3Blbihhcmd2W2ldLCJyIik7CisJCQlpZiAoSU4gPT0gTlVMTCkKKwkJCQl7CisJCQkJcGVycm9yKGFyZ3ZbaV0pOworCQkJCWVycisrOworCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCXByaW50ZigiUklQRU1EMTYwKCVzKT0gIixhcmd2W2ldKTsKKwkJCWRvX2ZwKElOKTsKKwkJCWZjbG9zZShJTik7CisJCQl9CisJCX0KKwlleGl0KGVycik7CisJfQorCit2b2lkIGRvX2ZwKEZJTEUgKmYpCisJeworCVJJUEVNRDE2MF9DVFggYzsKKwl1bnNpZ25lZCBjaGFyIG1kW1JJUEVNRDE2MF9ESUdFU1RfTEVOR1RIXTsKKwlpbnQgZmQ7CisJaW50IGk7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmW0JVRlNJWkVdOworCisJZmQ9ZmlsZW5vKGYpOworCVJJUEVNRDE2MF9Jbml0KCZjKTsKKwlmb3IgKDs7KQorCQl7CisJCWk9cmVhZChmZCxidWYsQlVGU0laRSk7CisJCWlmIChpIDw9IDApIGJyZWFrOworCQlSSVBFTUQxNjBfVXBkYXRlKCZjLGJ1ZiwodW5zaWduZWQgbG9uZylpKTsKKwkJfQorCVJJUEVNRDE2MF9GaW5hbCgmKG1kWzBdKSwmYyk7CisJcHQobWQpOworCX0KKwordm9pZCBwdCh1bnNpZ25lZCBjaGFyICptZCkKKwl7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxSSVBFTUQxNjBfRElHRVNUX0xFTkdUSDsgaSsrKQorCQlwcmludGYoIiUwMngiLG1kW2ldKTsKKwlwcmludGYoIlxuIik7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL3JtZF9kZ3N0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL3JtZF9kZ3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliMDE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kX2Rnc3QuYwpAQCAtMCwwICsxLDI5MSBAQAorLyogY3J5cHRvL3JpcGVtZC9ybWRfZGdzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInJtZF9sb2NsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorCitjb25zdCBjaGFyIFJNRDE2MF92ZXJzaW9uW109IlJJUEUtTUQxNjAiIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworIyAgaWZkZWYgUk1EMTYwX0FTTQorICAgICB2b2lkIHJpcGVtZDE2MF9ibG9ja194ODYoUklQRU1EMTYwX0NUWCAqYywgdW5zaWduZWQgbG9uZyAqcCxzaXplX3QgbnVtKTsKKyMgICAgZGVmaW5lIHJpcGVtZDE2MF9ibG9jayByaXBlbWQxNjBfYmxvY2tfeDg2CisjICBlbHNlCisgICAgIHZvaWQgcmlwZW1kMTYwX2Jsb2NrKFJJUEVNRDE2MF9DVFggKmMsIHVuc2lnbmVkIGxvbmcgKnAsc2l6ZV90IG51bSk7CisjICBlbmRpZgorCitpbnQgUklQRU1EMTYwX0luaXQoUklQRU1EMTYwX0NUWCAqYykKKwl7CisJbWVtc2V0IChjLDAsc2l6ZW9mKCpjKSk7CisJYy0+QT1SSVBFTUQxNjBfQTsKKwljLT5CPVJJUEVNRDE2MF9COworCWMtPkM9UklQRU1EMTYwX0M7CisJYy0+RD1SSVBFTUQxNjBfRDsKKwljLT5FPVJJUEVNRDE2MF9FOworCXJldHVybiAxOworCX0KKworI2lmbmRlZiByaXBlbWQxNjBfYmxvY2tfZGF0YV9vcmRlcgorI2lmZGVmIFgKKyN1bmRlZiBYCisjZW5kaWYKK3ZvaWQgcmlwZW1kMTYwX2Jsb2NrX2RhdGFfb3JkZXIgKFJJUEVNRDE2MF9DVFggKmN0eCwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG51bSkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YT1wOworCXJlZ2lzdGVyIHVuc2lnbmVkIE1EMzJfUkVHX1QgQSxCLEMsRCxFOworCXVuc2lnbmVkIE1EMzJfUkVHX1QgYSxiLGMsZCxlLGw7CisjaWZuZGVmIE1EMzJfWEFSUkFZCisJLyogU2VlIGNvbW1lbnQgaW4gY3J5cHRvL3NoYS9zaGFfbG9jbC5oIGZvciBkZXRhaWxzLiAqLworCXVuc2lnbmVkIE1EMzJfUkVHX1QJWFgwLCBYWDEsIFhYMiwgWFgzLCBYWDQsIFhYNSwgWFg2LCBYWDcsCisJCQkJWFg4LCBYWDksWFgxMCxYWDExLFhYMTIsWFgxMyxYWDE0LFhYMTU7CisjIGRlZmluZSBYKGkpCVhYIyNpCisjZWxzZQorCVJJUEVNRDE2MF9MT05HCVhYWzE2XTsKKyMgZGVmaW5lIFgoaSkJWFhbaV0KKyNlbmRpZgorCisJZm9yICg7bnVtLS07KQorCQl7CisKKwlBPWN0eC0+QTsgQj1jdHgtPkI7IEM9Y3R4LT5DOyBEPWN0eC0+RDsgRT1jdHgtPkU7CisKKwlIT1NUX2MybChkYXRhLGwpOyBYKCAwKT1sOwlIT1NUX2MybChkYXRhLGwpOyBYKCAxKT1sOworCVJJUDEoQSxCLEMsRCxFLFdMMDAsU0wwMCk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDIpPWw7CisJUklQMShFLEEsQixDLEQsV0wwMSxTTDAxKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggMyk9bDsKKwlSSVAxKEQsRSxBLEIsQyxXTDAyLFNMMDIpOwlIT1NUX2MybChkYXRhLGwpOyBYKCA0KT1sOworCVJJUDEoQyxELEUsQSxCLFdMMDMsU0wwMyk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDUpPWw7CisJUklQMShCLEMsRCxFLEEsV0wwNCxTTDA0KTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggNik9bDsKKwlSSVAxKEEsQixDLEQsRSxXTDA1LFNMMDUpOwlIT1NUX2MybChkYXRhLGwpOyBYKCA3KT1sOworCVJJUDEoRSxBLEIsQyxELFdMMDYsU0wwNik7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDgpPWw7CisJUklQMShELEUsQSxCLEMsV0wwNyxTTDA3KTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggOSk9bDsKKwlSSVAxKEMsRCxFLEEsQixXTDA4LFNMMDgpOwlIT1NUX2MybChkYXRhLGwpOyBYKDEwKT1sOworCVJJUDEoQixDLEQsRSxBLFdMMDksU0wwOSk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoMTEpPWw7CisJUklQMShBLEIsQyxELEUsV0wxMCxTTDEwKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxMik9bDsKKwlSSVAxKEUsQSxCLEMsRCxXTDExLFNMMTEpOwlIT1NUX2MybChkYXRhLGwpOyBYKDEzKT1sOworCVJJUDEoRCxFLEEsQixDLFdMMTIsU0wxMik7CUhPU1RfYzJsKGRhdGEsbCk7IFgoMTQpPWw7CisJUklQMShDLEQsRSxBLEIsV0wxMyxTTDEzKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxNSk9bDsKKwlSSVAxKEIsQyxELEUsQSxXTDE0LFNMMTQpOworCVJJUDEoQSxCLEMsRCxFLFdMMTUsU0wxNSk7CisKKwlSSVAyKEUsQSxCLEMsRCxXTDE2LFNMMTYsS0wxKTsKKwlSSVAyKEQsRSxBLEIsQyxXTDE3LFNMMTcsS0wxKTsKKwlSSVAyKEMsRCxFLEEsQixXTDE4LFNMMTgsS0wxKTsKKwlSSVAyKEIsQyxELEUsQSxXTDE5LFNMMTksS0wxKTsKKwlSSVAyKEEsQixDLEQsRSxXTDIwLFNMMjAsS0wxKTsKKwlSSVAyKEUsQSxCLEMsRCxXTDIxLFNMMjEsS0wxKTsKKwlSSVAyKEQsRSxBLEIsQyxXTDIyLFNMMjIsS0wxKTsKKwlSSVAyKEMsRCxFLEEsQixXTDIzLFNMMjMsS0wxKTsKKwlSSVAyKEIsQyxELEUsQSxXTDI0LFNMMjQsS0wxKTsKKwlSSVAyKEEsQixDLEQsRSxXTDI1LFNMMjUsS0wxKTsKKwlSSVAyKEUsQSxCLEMsRCxXTDI2LFNMMjYsS0wxKTsKKwlSSVAyKEQsRSxBLEIsQyxXTDI3LFNMMjcsS0wxKTsKKwlSSVAyKEMsRCxFLEEsQixXTDI4LFNMMjgsS0wxKTsKKwlSSVAyKEIsQyxELEUsQSxXTDI5LFNMMjksS0wxKTsKKwlSSVAyKEEsQixDLEQsRSxXTDMwLFNMMzAsS0wxKTsKKwlSSVAyKEUsQSxCLEMsRCxXTDMxLFNMMzEsS0wxKTsKKworCVJJUDMoRCxFLEEsQixDLFdMMzIsU0wzMixLTDIpOworCVJJUDMoQyxELEUsQSxCLFdMMzMsU0wzMyxLTDIpOworCVJJUDMoQixDLEQsRSxBLFdMMzQsU0wzNCxLTDIpOworCVJJUDMoQSxCLEMsRCxFLFdMMzUsU0wzNSxLTDIpOworCVJJUDMoRSxBLEIsQyxELFdMMzYsU0wzNixLTDIpOworCVJJUDMoRCxFLEEsQixDLFdMMzcsU0wzNyxLTDIpOworCVJJUDMoQyxELEUsQSxCLFdMMzgsU0wzOCxLTDIpOworCVJJUDMoQixDLEQsRSxBLFdMMzksU0wzOSxLTDIpOworCVJJUDMoQSxCLEMsRCxFLFdMNDAsU0w0MCxLTDIpOworCVJJUDMoRSxBLEIsQyxELFdMNDEsU0w0MSxLTDIpOworCVJJUDMoRCxFLEEsQixDLFdMNDIsU0w0MixLTDIpOworCVJJUDMoQyxELEUsQSxCLFdMNDMsU0w0MyxLTDIpOworCVJJUDMoQixDLEQsRSxBLFdMNDQsU0w0NCxLTDIpOworCVJJUDMoQSxCLEMsRCxFLFdMNDUsU0w0NSxLTDIpOworCVJJUDMoRSxBLEIsQyxELFdMNDYsU0w0NixLTDIpOworCVJJUDMoRCxFLEEsQixDLFdMNDcsU0w0NyxLTDIpOworCisJUklQNChDLEQsRSxBLEIsV0w0OCxTTDQ4LEtMMyk7CisJUklQNChCLEMsRCxFLEEsV0w0OSxTTDQ5LEtMMyk7CisJUklQNChBLEIsQyxELEUsV0w1MCxTTDUwLEtMMyk7CisJUklQNChFLEEsQixDLEQsV0w1MSxTTDUxLEtMMyk7CisJUklQNChELEUsQSxCLEMsV0w1MixTTDUyLEtMMyk7CisJUklQNChDLEQsRSxBLEIsV0w1MyxTTDUzLEtMMyk7CisJUklQNChCLEMsRCxFLEEsV0w1NCxTTDU0LEtMMyk7CisJUklQNChBLEIsQyxELEUsV0w1NSxTTDU1LEtMMyk7CisJUklQNChFLEEsQixDLEQsV0w1NixTTDU2LEtMMyk7CisJUklQNChELEUsQSxCLEMsV0w1NyxTTDU3LEtMMyk7CisJUklQNChDLEQsRSxBLEIsV0w1OCxTTDU4LEtMMyk7CisJUklQNChCLEMsRCxFLEEsV0w1OSxTTDU5LEtMMyk7CisJUklQNChBLEIsQyxELEUsV0w2MCxTTDYwLEtMMyk7CisJUklQNChFLEEsQixDLEQsV0w2MSxTTDYxLEtMMyk7CisJUklQNChELEUsQSxCLEMsV0w2MixTTDYyLEtMMyk7CisJUklQNChDLEQsRSxBLEIsV0w2MyxTTDYzLEtMMyk7CisKKwlSSVA1KEIsQyxELEUsQSxXTDY0LFNMNjQsS0w0KTsKKwlSSVA1KEEsQixDLEQsRSxXTDY1LFNMNjUsS0w0KTsKKwlSSVA1KEUsQSxCLEMsRCxXTDY2LFNMNjYsS0w0KTsKKwlSSVA1KEQsRSxBLEIsQyxXTDY3LFNMNjcsS0w0KTsKKwlSSVA1KEMsRCxFLEEsQixXTDY4LFNMNjgsS0w0KTsKKwlSSVA1KEIsQyxELEUsQSxXTDY5LFNMNjksS0w0KTsKKwlSSVA1KEEsQixDLEQsRSxXTDcwLFNMNzAsS0w0KTsKKwlSSVA1KEUsQSxCLEMsRCxXTDcxLFNMNzEsS0w0KTsKKwlSSVA1KEQsRSxBLEIsQyxXTDcyLFNMNzIsS0w0KTsKKwlSSVA1KEMsRCxFLEEsQixXTDczLFNMNzMsS0w0KTsKKwlSSVA1KEIsQyxELEUsQSxXTDc0LFNMNzQsS0w0KTsKKwlSSVA1KEEsQixDLEQsRSxXTDc1LFNMNzUsS0w0KTsKKwlSSVA1KEUsQSxCLEMsRCxXTDc2LFNMNzYsS0w0KTsKKwlSSVA1KEQsRSxBLEIsQyxXTDc3LFNMNzcsS0w0KTsKKwlSSVA1KEMsRCxFLEEsQixXTDc4LFNMNzgsS0w0KTsKKwlSSVA1KEIsQyxELEUsQSxXTDc5LFNMNzksS0w0KTsKKworCWE9QTsgYj1COyBjPUM7IGQ9RDsgZT1FOworCS8qIERvIG90aGVyIGhhbGYgKi8KKwlBPWN0eC0+QTsgQj1jdHgtPkI7IEM9Y3R4LT5DOyBEPWN0eC0+RDsgRT1jdHgtPkU7CisKKwlSSVA1KEEsQixDLEQsRSxXUjAwLFNSMDAsS1IwKTsKKwlSSVA1KEUsQSxCLEMsRCxXUjAxLFNSMDEsS1IwKTsKKwlSSVA1KEQsRSxBLEIsQyxXUjAyLFNSMDIsS1IwKTsKKwlSSVA1KEMsRCxFLEEsQixXUjAzLFNSMDMsS1IwKTsKKwlSSVA1KEIsQyxELEUsQSxXUjA0LFNSMDQsS1IwKTsKKwlSSVA1KEEsQixDLEQsRSxXUjA1LFNSMDUsS1IwKTsKKwlSSVA1KEUsQSxCLEMsRCxXUjA2LFNSMDYsS1IwKTsKKwlSSVA1KEQsRSxBLEIsQyxXUjA3LFNSMDcsS1IwKTsKKwlSSVA1KEMsRCxFLEEsQixXUjA4LFNSMDgsS1IwKTsKKwlSSVA1KEIsQyxELEUsQSxXUjA5LFNSMDksS1IwKTsKKwlSSVA1KEEsQixDLEQsRSxXUjEwLFNSMTAsS1IwKTsKKwlSSVA1KEUsQSxCLEMsRCxXUjExLFNSMTEsS1IwKTsKKwlSSVA1KEQsRSxBLEIsQyxXUjEyLFNSMTIsS1IwKTsKKwlSSVA1KEMsRCxFLEEsQixXUjEzLFNSMTMsS1IwKTsKKwlSSVA1KEIsQyxELEUsQSxXUjE0LFNSMTQsS1IwKTsKKwlSSVA1KEEsQixDLEQsRSxXUjE1LFNSMTUsS1IwKTsKKworCVJJUDQoRSxBLEIsQyxELFdSMTYsU1IxNixLUjEpOworCVJJUDQoRCxFLEEsQixDLFdSMTcsU1IxNyxLUjEpOworCVJJUDQoQyxELEUsQSxCLFdSMTgsU1IxOCxLUjEpOworCVJJUDQoQixDLEQsRSxBLFdSMTksU1IxOSxLUjEpOworCVJJUDQoQSxCLEMsRCxFLFdSMjAsU1IyMCxLUjEpOworCVJJUDQoRSxBLEIsQyxELFdSMjEsU1IyMSxLUjEpOworCVJJUDQoRCxFLEEsQixDLFdSMjIsU1IyMixLUjEpOworCVJJUDQoQyxELEUsQSxCLFdSMjMsU1IyMyxLUjEpOworCVJJUDQoQixDLEQsRSxBLFdSMjQsU1IyNCxLUjEpOworCVJJUDQoQSxCLEMsRCxFLFdSMjUsU1IyNSxLUjEpOworCVJJUDQoRSxBLEIsQyxELFdSMjYsU1IyNixLUjEpOworCVJJUDQoRCxFLEEsQixDLFdSMjcsU1IyNyxLUjEpOworCVJJUDQoQyxELEUsQSxCLFdSMjgsU1IyOCxLUjEpOworCVJJUDQoQixDLEQsRSxBLFdSMjksU1IyOSxLUjEpOworCVJJUDQoQSxCLEMsRCxFLFdSMzAsU1IzMCxLUjEpOworCVJJUDQoRSxBLEIsQyxELFdSMzEsU1IzMSxLUjEpOworCisJUklQMyhELEUsQSxCLEMsV1IzMixTUjMyLEtSMik7CisJUklQMyhDLEQsRSxBLEIsV1IzMyxTUjMzLEtSMik7CisJUklQMyhCLEMsRCxFLEEsV1IzNCxTUjM0LEtSMik7CisJUklQMyhBLEIsQyxELEUsV1IzNSxTUjM1LEtSMik7CisJUklQMyhFLEEsQixDLEQsV1IzNixTUjM2LEtSMik7CisJUklQMyhELEUsQSxCLEMsV1IzNyxTUjM3LEtSMik7CisJUklQMyhDLEQsRSxBLEIsV1IzOCxTUjM4LEtSMik7CisJUklQMyhCLEMsRCxFLEEsV1IzOSxTUjM5LEtSMik7CisJUklQMyhBLEIsQyxELEUsV1I0MCxTUjQwLEtSMik7CisJUklQMyhFLEEsQixDLEQsV1I0MSxTUjQxLEtSMik7CisJUklQMyhELEUsQSxCLEMsV1I0MixTUjQyLEtSMik7CisJUklQMyhDLEQsRSxBLEIsV1I0MyxTUjQzLEtSMik7CisJUklQMyhCLEMsRCxFLEEsV1I0NCxTUjQ0LEtSMik7CisJUklQMyhBLEIsQyxELEUsV1I0NSxTUjQ1LEtSMik7CisJUklQMyhFLEEsQixDLEQsV1I0NixTUjQ2LEtSMik7CisJUklQMyhELEUsQSxCLEMsV1I0NyxTUjQ3LEtSMik7CisKKwlSSVAyKEMsRCxFLEEsQixXUjQ4LFNSNDgsS1IzKTsKKwlSSVAyKEIsQyxELEUsQSxXUjQ5LFNSNDksS1IzKTsKKwlSSVAyKEEsQixDLEQsRSxXUjUwLFNSNTAsS1IzKTsKKwlSSVAyKEUsQSxCLEMsRCxXUjUxLFNSNTEsS1IzKTsKKwlSSVAyKEQsRSxBLEIsQyxXUjUyLFNSNTIsS1IzKTsKKwlSSVAyKEMsRCxFLEEsQixXUjUzLFNSNTMsS1IzKTsKKwlSSVAyKEIsQyxELEUsQSxXUjU0LFNSNTQsS1IzKTsKKwlSSVAyKEEsQixDLEQsRSxXUjU1LFNSNTUsS1IzKTsKKwlSSVAyKEUsQSxCLEMsRCxXUjU2LFNSNTYsS1IzKTsKKwlSSVAyKEQsRSxBLEIsQyxXUjU3LFNSNTcsS1IzKTsKKwlSSVAyKEMsRCxFLEEsQixXUjU4LFNSNTgsS1IzKTsKKwlSSVAyKEIsQyxELEUsQSxXUjU5LFNSNTksS1IzKTsKKwlSSVAyKEEsQixDLEQsRSxXUjYwLFNSNjAsS1IzKTsKKwlSSVAyKEUsQSxCLEMsRCxXUjYxLFNSNjEsS1IzKTsKKwlSSVAyKEQsRSxBLEIsQyxXUjYyLFNSNjIsS1IzKTsKKwlSSVAyKEMsRCxFLEEsQixXUjYzLFNSNjMsS1IzKTsKKworCVJJUDEoQixDLEQsRSxBLFdSNjQsU1I2NCk7CisJUklQMShBLEIsQyxELEUsV1I2NSxTUjY1KTsKKwlSSVAxKEUsQSxCLEMsRCxXUjY2LFNSNjYpOworCVJJUDEoRCxFLEEsQixDLFdSNjcsU1I2Nyk7CisJUklQMShDLEQsRSxBLEIsV1I2OCxTUjY4KTsKKwlSSVAxKEIsQyxELEUsQSxXUjY5LFNSNjkpOworCVJJUDEoQSxCLEMsRCxFLFdSNzAsU1I3MCk7CisJUklQMShFLEEsQixDLEQsV1I3MSxTUjcxKTsKKwlSSVAxKEQsRSxBLEIsQyxXUjcyLFNSNzIpOworCVJJUDEoQyxELEUsQSxCLFdSNzMsU1I3Myk7CisJUklQMShCLEMsRCxFLEEsV1I3NCxTUjc0KTsKKwlSSVAxKEEsQixDLEQsRSxXUjc1LFNSNzUpOworCVJJUDEoRSxBLEIsQyxELFdSNzYsU1I3Nik7CisJUklQMShELEUsQSxCLEMsV1I3NyxTUjc3KTsKKwlSSVAxKEMsRCxFLEEsQixXUjc4LFNSNzgpOworCVJJUDEoQixDLEQsRSxBLFdSNzksU1I3OSk7CisKKwlEICAgICA9Y3R4LT5CK2MrRDsKKwljdHgtPkI9Y3R4LT5DK2QrRTsKKwljdHgtPkM9Y3R4LT5EK2UrQTsKKwljdHgtPkQ9Y3R4LT5FK2ErQjsKKwljdHgtPkU9Y3R4LT5BK2IrQzsKKwljdHgtPkE9RDsKKworCQl9CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL3JtZF9sb2NsLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL3JtZF9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE0YjM0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kX2xvY2wuaApAQCAtMCwwICsxLDE1MCBAQAorLyogY3J5cHRvL3JpcGVtZC9ybWRfbG9jbC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yaXBlbWQuaD4KKworI2lmbmRlZiBSSVBFTUQxNjBfTE9OR19MT0cyCisjZGVmaW5lIFJJUEVNRDE2MF9MT05HX0xPRzIgMiAvKiBkZWZhdWx0IHRvIDMyIGJpdHMgKi8KKyNlbmRpZgorCisvKgorICogRE8gRVhBTUlORSBDT01NRU5UUyBJTiBjcnlwdG8vbWQ1L21kNV9sb2NsLmggJiBjcnlwdG8vbWQ1L21kNV9kZ3N0LmMKKyAqIEZPUiBFWFBMQU5BVElPTlMgT04gRk9MTE9XSU5HICJDT0RFLiIKKyAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgKi8KKyNpZmRlZiBSTUQxNjBfQVNNCisjIGlmIGRlZmluZWQoX19pMzg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19JTlRFTF9fKQorIyAgZGVmaW5lIHJpcGVtZDE2MF9ibG9ja19kYXRhX29yZGVyIHJpcGVtZDE2MF9ibG9ja19hc21fZGF0YV9vcmRlcgorIyBlbmRpZgorI2VuZGlmCisKK3ZvaWQgcmlwZW1kMTYwX2Jsb2NrX2RhdGFfb3JkZXIgKFJJUEVNRDE2MF9DVFggKmMsIGNvbnN0IHZvaWQgKnAsc2l6ZV90IG51bSk7CisKKyNkZWZpbmUgREFUQV9PUkRFUl9JU19MSVRUTEVfRU5ESUFOCisKKyNkZWZpbmUgSEFTSF9MT05HICAgICAgICAgICAgICAgUklQRU1EMTYwX0xPTkcKKyNkZWZpbmUgSEFTSF9DVFggICAgICAgICAgICAgICAgUklQRU1EMTYwX0NUWAorI2RlZmluZSBIQVNIX0NCTE9DSyAgICAgICAgICAgICBSSVBFTUQxNjBfQ0JMT0NLCisjZGVmaW5lIEhBU0hfVVBEQVRFICAgICAgICAgICAgIFJJUEVNRDE2MF9VcGRhdGUKKyNkZWZpbmUgSEFTSF9UUkFOU0ZPUk0gICAgICAgICAgUklQRU1EMTYwX1RyYW5zZm9ybQorI2RlZmluZSBIQVNIX0ZJTkFMICAgICAgICAgICAgICBSSVBFTUQxNjBfRmluYWwKKyNkZWZpbmUJSEFTSF9NQUtFX1NUUklORyhjLHMpCWRvIHsJXAorCXVuc2lnbmVkIGxvbmcgbGw7CQlcCisJbGw9KGMpLT5BOyBIT1NUX2wyYyhsbCwocykpOwlcCisJbGw9KGMpLT5COyBIT1NUX2wyYyhsbCwocykpOwlcCisJbGw9KGMpLT5DOyBIT1NUX2wyYyhsbCwocykpOwlcCisJbGw9KGMpLT5EOyBIT1NUX2wyYyhsbCwocykpOwlcCisJbGw9KGMpLT5FOyBIT1NUX2wyYyhsbCwocykpOwlcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgSEFTSF9CTE9DS19EQVRBX09SREVSICAgcmlwZW1kMTYwX2Jsb2NrX2RhdGFfb3JkZXIKKworI2luY2x1ZGUgIm1kMzJfY29tbW9uLmgiCisKKyNpZiAwCisjZGVmaW5lIEYxKHgseSx6KQkgKCh4KV4oeSleKHopKQorI2RlZmluZSBGMih4LHkseikJKCgoeCkmKHkpKXwoKH54KSZ6KSkKKyNkZWZpbmUgRjMoeCx5LHopCSgoKHgpfCh+eSkpXih6KSkKKyNkZWZpbmUgRjQoeCx5LHopCSgoKHgpJih6KSl8KCh5KSYofih6KSkpKQorI2RlZmluZSBGNSh4LHkseikJICgoeCleKCh5KXwofih6KSkpKQorI2Vsc2UKKy8qCisgKiBUcmFuc2Zvcm1lZCBGMiBhbmQgRjQgYXJlIGNvdXJ0ZXN5IG9mIFdlaSBEYWkgPHdlaWRhaUBlc2tpbW8uY29tPgorICovCisjZGVmaW5lIEYxKHgseSx6KQkoKHgpIF4gKHkpIF4gKHopKQorI2RlZmluZSBGMih4LHkseikJKCgoKHkpIF4gKHopKSAmICh4KSkgXiAoeikpCisjZGVmaW5lIEYzKHgseSx6KQkoKCh+KHkpKSB8ICh4KSkgXiAoeikpCisjZGVmaW5lIEY0KHgseSx6KQkoKCgoeCkgXiAoeSkpICYgKHopKSBeICh5KSkKKyNkZWZpbmUgRjUoeCx5LHopCSgoKH4oeikpIHwgKHkpKSBeICh4KSkKKyNlbmRpZgorCisjZGVmaW5lIFJJUEVNRDE2MF9BCTB4Njc0NTIzMDFMCisjZGVmaW5lIFJJUEVNRDE2MF9CCTB4RUZDREFCODlMCisjZGVmaW5lIFJJUEVNRDE2MF9DCTB4OThCQURDRkVMCisjZGVmaW5lIFJJUEVNRDE2MF9ECTB4MTAzMjU0NzZMCisjZGVmaW5lIFJJUEVNRDE2MF9FCTB4QzNEMkUxRjBMCisKKyNpbmNsdWRlICJybWRjb25zdC5oIgorCisjZGVmaW5lIFJJUDEoYSxiLGMsZCxlLHcscykgeyBcCisJYSs9RjEoYixjLGQpK1godyk7IFwKKyAgICAgICAgYT1ST1RBVEUoYSxzKStlOyBcCisgICAgICAgIGM9Uk9UQVRFKGMsMTApOyB9CisKKyNkZWZpbmUgUklQMihhLGIsYyxkLGUsdyxzLEspIHsgXAorCWErPUYyKGIsYyxkKStYKHcpK0s7IFwKKyAgICAgICAgYT1ST1RBVEUoYSxzKStlOyBcCisgICAgICAgIGM9Uk9UQVRFKGMsMTApOyB9CisKKyNkZWZpbmUgUklQMyhhLGIsYyxkLGUsdyxzLEspIHsgXAorCWErPUYzKGIsYyxkKStYKHcpK0s7IFwKKyAgICAgICAgYT1ST1RBVEUoYSxzKStlOyBcCisgICAgICAgIGM9Uk9UQVRFKGMsMTApOyB9CisKKyNkZWZpbmUgUklQNChhLGIsYyxkLGUsdyxzLEspIHsgXAorCWErPUY0KGIsYyxkKStYKHcpK0s7IFwKKyAgICAgICAgYT1ST1RBVEUoYSxzKStlOyBcCisgICAgICAgIGM9Uk9UQVRFKGMsMTApOyB9CisKKyNkZWZpbmUgUklQNShhLGIsYyxkLGUsdyxzLEspIHsgXAorCWErPUY1KGIsYyxkKStYKHcpK0s7IFwKKyAgICAgICAgYT1ST1RBVEUoYSxzKStlOyBcCisgICAgICAgIGM9Uk9UQVRFKGMsMTApOyB9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kX29uZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JpcGVtZC9ybWRfb25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmYjEzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kX29uZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIGNyeXB0by9yaXBlbWQvcm1kX29uZS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmlwZW1kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKwordW5zaWduZWQgY2hhciAqUklQRU1EMTYwKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIHNpemVfdCBuLAorCSAgICAgdW5zaWduZWQgY2hhciAqbWQpCisJeworCVJJUEVNRDE2MF9DVFggYzsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtW1JJUEVNRDE2MF9ESUdFU1RfTEVOR1RIXTsKKworCWlmIChtZCA9PSBOVUxMKSBtZD1tOworCWlmICghUklQRU1EMTYwX0luaXQoJmMpKQorCQlyZXR1cm4gTlVMTDsKKwlSSVBFTUQxNjBfVXBkYXRlKCZjLGQsbik7CisJUklQRU1EMTYwX0ZpbmFsKG1kLCZjKTsKKwlPUEVOU1NMX2NsZWFuc2UoJmMsc2l6ZW9mKGMpKTsgLyogc2VjdXJpdHkgY29uc2lkZXJhdGlvbiAqLworCXJldHVybihtZCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL3JtZGNvbnN0LmggYi9saWIvb3BlbnNzbC9jcnlwdG8vcmlwZW1kL3JtZGNvbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNDhkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kY29uc3QuaApAQCAtMCwwICsxLDM5OSBAQAorLyogY3J5cHRvL3JpcGVtZC9ybWRjb25zdC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisjZGVmaW5lIEtMMCAweDAwMDAwMDAwTAorI2RlZmluZSBLTDEgMHg1QTgyNzk5OUwKKyNkZWZpbmUgS0wyIDB4NkVEOUVCQTFMCisjZGVmaW5lIEtMMyAweDhGMUJCQ0RDTAorI2RlZmluZSBLTDQgMHhBOTUzRkQ0RUwKKworI2RlZmluZSBLUjAgMHg1MEEyOEJFNkwKKyNkZWZpbmUgS1IxIDB4NUM0REQxMjRMCisjZGVmaW5lIEtSMiAweDZENzAzRUYzTAorI2RlZmluZSBLUjMgMHg3QTZENzZFOUwKKyNkZWZpbmUgS1I0IDB4MDAwMDAwMDBMCisKKyNkZWZpbmUgV0wwMCAgMAorI2RlZmluZSBTTDAwIDExCisjZGVmaW5lIFdMMDEgIDEKKyNkZWZpbmUgU0wwMSAxNAorI2RlZmluZSBXTDAyICAyCisjZGVmaW5lIFNMMDIgMTUKKyNkZWZpbmUgV0wwMyAgMworI2RlZmluZSBTTDAzIDEyCisjZGVmaW5lIFdMMDQgIDQKKyNkZWZpbmUgU0wwNCAgNQorI2RlZmluZSBXTDA1ICA1CisjZGVmaW5lIFNMMDUgIDgKKyNkZWZpbmUgV0wwNiAgNgorI2RlZmluZSBTTDA2ICA3CisjZGVmaW5lIFdMMDcgIDcKKyNkZWZpbmUgU0wwNyAgOQorI2RlZmluZSBXTDA4ICA4CisjZGVmaW5lIFNMMDggMTEKKyNkZWZpbmUgV0wwOSAgOQorI2RlZmluZSBTTDA5IDEzCisjZGVmaW5lIFdMMTAgMTAKKyNkZWZpbmUgU0wxMCAxNAorI2RlZmluZSBXTDExIDExCisjZGVmaW5lIFNMMTEgMTUKKyNkZWZpbmUgV0wxMiAxMgorI2RlZmluZSBTTDEyICA2CisjZGVmaW5lIFdMMTMgMTMKKyNkZWZpbmUgU0wxMyAgNworI2RlZmluZSBXTDE0IDE0CisjZGVmaW5lIFNMMTQgIDkKKyNkZWZpbmUgV0wxNSAxNQorI2RlZmluZSBTTDE1ICA4CisKKyNkZWZpbmUgV0wxNiAgNworI2RlZmluZSBTTDE2ICA3CisjZGVmaW5lIFdMMTcgIDQKKyNkZWZpbmUgU0wxNyAgNgorI2RlZmluZSBXTDE4IDEzCisjZGVmaW5lIFNMMTggIDgKKyNkZWZpbmUgV0wxOSAgMQorI2RlZmluZSBTTDE5IDEzCisjZGVmaW5lIFdMMjAgMTAKKyNkZWZpbmUgU0wyMCAxMQorI2RlZmluZSBXTDIxICA2CisjZGVmaW5lIFNMMjEgIDkKKyNkZWZpbmUgV0wyMiAxNQorI2RlZmluZSBTTDIyICA3CisjZGVmaW5lIFdMMjMgIDMKKyNkZWZpbmUgU0wyMyAxNQorI2RlZmluZSBXTDI0IDEyCisjZGVmaW5lIFNMMjQgIDcKKyNkZWZpbmUgV0wyNSAgMAorI2RlZmluZSBTTDI1IDEyCisjZGVmaW5lIFdMMjYgIDkKKyNkZWZpbmUgU0wyNiAxNQorI2RlZmluZSBXTDI3ICA1CisjZGVmaW5lIFNMMjcgIDkKKyNkZWZpbmUgV0wyOCAgMgorI2RlZmluZSBTTDI4IDExCisjZGVmaW5lIFdMMjkgMTQKKyNkZWZpbmUgU0wyOSAgNworI2RlZmluZSBXTDMwIDExCisjZGVmaW5lIFNMMzAgMTMKKyNkZWZpbmUgV0wzMSAgOAorI2RlZmluZSBTTDMxIDEyCisKKyNkZWZpbmUgV0wzMiAgMworI2RlZmluZSBTTDMyIDExCisjZGVmaW5lIFdMMzMgMTAKKyNkZWZpbmUgU0wzMyAxMworI2RlZmluZSBXTDM0IDE0CisjZGVmaW5lIFNMMzQgIDYKKyNkZWZpbmUgV0wzNSAgNAorI2RlZmluZSBTTDM1ICA3CisjZGVmaW5lIFdMMzYgIDkKKyNkZWZpbmUgU0wzNiAxNAorI2RlZmluZSBXTDM3IDE1CisjZGVmaW5lIFNMMzcgIDkKKyNkZWZpbmUgV0wzOCAgOAorI2RlZmluZSBTTDM4IDEzCisjZGVmaW5lIFdMMzkgIDEKKyNkZWZpbmUgU0wzOSAxNQorI2RlZmluZSBXTDQwICAyCisjZGVmaW5lIFNMNDAgMTQKKyNkZWZpbmUgV0w0MSAgNworI2RlZmluZSBTTDQxICA4CisjZGVmaW5lIFdMNDIgIDAKKyNkZWZpbmUgU0w0MiAxMworI2RlZmluZSBXTDQzICA2CisjZGVmaW5lIFNMNDMgIDYKKyNkZWZpbmUgV0w0NCAxMworI2RlZmluZSBTTDQ0ICA1CisjZGVmaW5lIFdMNDUgMTEKKyNkZWZpbmUgU0w0NSAxMgorI2RlZmluZSBXTDQ2ICA1CisjZGVmaW5lIFNMNDYgIDcKKyNkZWZpbmUgV0w0NyAxMgorI2RlZmluZSBTTDQ3ICA1CisKKyNkZWZpbmUgV0w0OCAgMQorI2RlZmluZSBTTDQ4IDExCisjZGVmaW5lIFdMNDkgIDkKKyNkZWZpbmUgU0w0OSAxMgorI2RlZmluZSBXTDUwIDExCisjZGVmaW5lIFNMNTAgMTQKKyNkZWZpbmUgV0w1MSAxMAorI2RlZmluZSBTTDUxIDE1CisjZGVmaW5lIFdMNTIgIDAKKyNkZWZpbmUgU0w1MiAxNAorI2RlZmluZSBXTDUzICA4CisjZGVmaW5lIFNMNTMgMTUKKyNkZWZpbmUgV0w1NCAxMgorI2RlZmluZSBTTDU0ICA5CisjZGVmaW5lIFdMNTUgIDQKKyNkZWZpbmUgU0w1NSAgOAorI2RlZmluZSBXTDU2IDEzCisjZGVmaW5lIFNMNTYgIDkKKyNkZWZpbmUgV0w1NyAgMworI2RlZmluZSBTTDU3IDE0CisjZGVmaW5lIFdMNTggIDcKKyNkZWZpbmUgU0w1OCAgNQorI2RlZmluZSBXTDU5IDE1CisjZGVmaW5lIFNMNTkgIDYKKyNkZWZpbmUgV0w2MCAxNAorI2RlZmluZSBTTDYwICA4CisjZGVmaW5lIFdMNjEgIDUKKyNkZWZpbmUgU0w2MSAgNgorI2RlZmluZSBXTDYyICA2CisjZGVmaW5lIFNMNjIgIDUKKyNkZWZpbmUgV0w2MyAgMgorI2RlZmluZSBTTDYzIDEyCisKKyNkZWZpbmUgV0w2NCAgNAorI2RlZmluZSBTTDY0ICA5CisjZGVmaW5lIFdMNjUgIDAKKyNkZWZpbmUgU0w2NSAxNQorI2RlZmluZSBXTDY2ICA1CisjZGVmaW5lIFNMNjYgIDUKKyNkZWZpbmUgV0w2NyAgOQorI2RlZmluZSBTTDY3IDExCisjZGVmaW5lIFdMNjggIDcKKyNkZWZpbmUgU0w2OCAgNgorI2RlZmluZSBXTDY5IDEyCisjZGVmaW5lIFNMNjkgIDgKKyNkZWZpbmUgV0w3MCAgMgorI2RlZmluZSBTTDcwIDEzCisjZGVmaW5lIFdMNzEgMTAKKyNkZWZpbmUgU0w3MSAxMgorI2RlZmluZSBXTDcyIDE0CisjZGVmaW5lIFNMNzIgIDUKKyNkZWZpbmUgV0w3MyAgMQorI2RlZmluZSBTTDczIDEyCisjZGVmaW5lIFdMNzQgIDMKKyNkZWZpbmUgU0w3NCAxMworI2RlZmluZSBXTDc1ICA4CisjZGVmaW5lIFNMNzUgMTQKKyNkZWZpbmUgV0w3NiAxMQorI2RlZmluZSBTTDc2IDExCisjZGVmaW5lIFdMNzcgIDYKKyNkZWZpbmUgU0w3NyAgOAorI2RlZmluZSBXTDc4IDE1CisjZGVmaW5lIFNMNzggIDUKKyNkZWZpbmUgV0w3OSAxMworI2RlZmluZSBTTDc5ICA2CisKKyNkZWZpbmUgV1IwMCAgNQorI2RlZmluZSBTUjAwICA4CisjZGVmaW5lIFdSMDEgMTQKKyNkZWZpbmUgU1IwMSAgOQorI2RlZmluZSBXUjAyICA3CisjZGVmaW5lIFNSMDIgIDkKKyNkZWZpbmUgV1IwMyAgMAorI2RlZmluZSBTUjAzIDExCisjZGVmaW5lIFdSMDQgIDkKKyNkZWZpbmUgU1IwNCAxMworI2RlZmluZSBXUjA1ICAyCisjZGVmaW5lIFNSMDUgMTUKKyNkZWZpbmUgV1IwNiAxMQorI2RlZmluZSBTUjA2IDE1CisjZGVmaW5lIFdSMDcgIDQKKyNkZWZpbmUgU1IwNyAgNQorI2RlZmluZSBXUjA4IDEzCisjZGVmaW5lIFNSMDggIDcKKyNkZWZpbmUgV1IwOSAgNgorI2RlZmluZSBTUjA5ICA3CisjZGVmaW5lIFdSMTAgMTUKKyNkZWZpbmUgU1IxMCAgOAorI2RlZmluZSBXUjExICA4CisjZGVmaW5lIFNSMTEgMTEKKyNkZWZpbmUgV1IxMiAgMQorI2RlZmluZSBTUjEyIDE0CisjZGVmaW5lIFdSMTMgMTAKKyNkZWZpbmUgU1IxMyAxNAorI2RlZmluZSBXUjE0ICAzCisjZGVmaW5lIFNSMTQgMTIKKyNkZWZpbmUgV1IxNSAxMgorI2RlZmluZSBTUjE1ICA2CisKKyNkZWZpbmUgV1IxNiAgNgorI2RlZmluZSBTUjE2ICA5CisjZGVmaW5lIFdSMTcgMTEKKyNkZWZpbmUgU1IxNyAxMworI2RlZmluZSBXUjE4ICAzCisjZGVmaW5lIFNSMTggMTUKKyNkZWZpbmUgV1IxOSAgNworI2RlZmluZSBTUjE5ICA3CisjZGVmaW5lIFdSMjAgIDAKKyNkZWZpbmUgU1IyMCAxMgorI2RlZmluZSBXUjIxIDEzCisjZGVmaW5lIFNSMjEgIDgKKyNkZWZpbmUgV1IyMiAgNQorI2RlZmluZSBTUjIyICA5CisjZGVmaW5lIFdSMjMgMTAKKyNkZWZpbmUgU1IyMyAxMQorI2RlZmluZSBXUjI0IDE0CisjZGVmaW5lIFNSMjQgIDcKKyNkZWZpbmUgV1IyNSAxNQorI2RlZmluZSBTUjI1ICA3CisjZGVmaW5lIFdSMjYgIDgKKyNkZWZpbmUgU1IyNiAxMgorI2RlZmluZSBXUjI3IDEyCisjZGVmaW5lIFNSMjcgIDcKKyNkZWZpbmUgV1IyOCAgNAorI2RlZmluZSBTUjI4ICA2CisjZGVmaW5lIFdSMjkgIDkKKyNkZWZpbmUgU1IyOSAxNQorI2RlZmluZSBXUjMwICAxCisjZGVmaW5lIFNSMzAgMTMKKyNkZWZpbmUgV1IzMSAgMgorI2RlZmluZSBTUjMxIDExCisKKyNkZWZpbmUgV1IzMiAxNQorI2RlZmluZSBTUjMyICA5CisjZGVmaW5lIFdSMzMgIDUKKyNkZWZpbmUgU1IzMyAgNworI2RlZmluZSBXUjM0ICAxCisjZGVmaW5lIFNSMzQgMTUKKyNkZWZpbmUgV1IzNSAgMworI2RlZmluZSBTUjM1IDExCisjZGVmaW5lIFdSMzYgIDcKKyNkZWZpbmUgU1IzNiAgOAorI2RlZmluZSBXUjM3IDE0CisjZGVmaW5lIFNSMzcgIDYKKyNkZWZpbmUgV1IzOCAgNgorI2RlZmluZSBTUjM4ICA2CisjZGVmaW5lIFdSMzkgIDkKKyNkZWZpbmUgU1IzOSAxNAorI2RlZmluZSBXUjQwIDExCisjZGVmaW5lIFNSNDAgMTIKKyNkZWZpbmUgV1I0MSAgOAorI2RlZmluZSBTUjQxIDEzCisjZGVmaW5lIFdSNDIgMTIKKyNkZWZpbmUgU1I0MiAgNQorI2RlZmluZSBXUjQzICAyCisjZGVmaW5lIFNSNDMgMTQKKyNkZWZpbmUgV1I0NCAxMAorI2RlZmluZSBTUjQ0IDEzCisjZGVmaW5lIFdSNDUgIDAKKyNkZWZpbmUgU1I0NSAxMworI2RlZmluZSBXUjQ2ICA0CisjZGVmaW5lIFNSNDYgIDcKKyNkZWZpbmUgV1I0NyAxMworI2RlZmluZSBTUjQ3ICA1CisKKyNkZWZpbmUgV1I0OCAgOAorI2RlZmluZSBTUjQ4IDE1CisjZGVmaW5lIFdSNDkgIDYKKyNkZWZpbmUgU1I0OSAgNQorI2RlZmluZSBXUjUwICA0CisjZGVmaW5lIFNSNTAgIDgKKyNkZWZpbmUgV1I1MSAgMQorI2RlZmluZSBTUjUxIDExCisjZGVmaW5lIFdSNTIgIDMKKyNkZWZpbmUgU1I1MiAxNAorI2RlZmluZSBXUjUzIDExCisjZGVmaW5lIFNSNTMgMTQKKyNkZWZpbmUgV1I1NCAxNQorI2RlZmluZSBTUjU0ICA2CisjZGVmaW5lIFdSNTUgIDAKKyNkZWZpbmUgU1I1NSAxNAorI2RlZmluZSBXUjU2ICA1CisjZGVmaW5lIFNSNTYgIDYKKyNkZWZpbmUgV1I1NyAxMgorI2RlZmluZSBTUjU3ICA5CisjZGVmaW5lIFdSNTggIDIKKyNkZWZpbmUgU1I1OCAxMgorI2RlZmluZSBXUjU5IDEzCisjZGVmaW5lIFNSNTkgIDkKKyNkZWZpbmUgV1I2MCAgOQorI2RlZmluZSBTUjYwIDEyCisjZGVmaW5lIFdSNjEgIDcKKyNkZWZpbmUgU1I2MSAgNQorI2RlZmluZSBXUjYyIDEwCisjZGVmaW5lIFNSNjIgMTUKKyNkZWZpbmUgV1I2MyAxNAorI2RlZmluZSBTUjYzICA4CisKKyNkZWZpbmUgV1I2NCAxMgorI2RlZmluZSBTUjY0ICA4CisjZGVmaW5lIFdSNjUgMTUKKyNkZWZpbmUgU1I2NSAgNQorI2RlZmluZSBXUjY2IDEwCisjZGVmaW5lIFNSNjYgMTIKKyNkZWZpbmUgV1I2NyAgNAorI2RlZmluZSBTUjY3ICA5CisjZGVmaW5lIFdSNjggIDEKKyNkZWZpbmUgU1I2OCAxMgorI2RlZmluZSBXUjY5ICA1CisjZGVmaW5lIFNSNjkgIDUKKyNkZWZpbmUgV1I3MCAgOAorI2RlZmluZSBTUjcwIDE0CisjZGVmaW5lIFdSNzEgIDcKKyNkZWZpbmUgU1I3MSAgNgorI2RlZmluZSBXUjcyICA2CisjZGVmaW5lIFNSNzIgIDgKKyNkZWZpbmUgV1I3MyAgMgorI2RlZmluZSBTUjczIDEzCisjZGVmaW5lIFdSNzQgMTMKKyNkZWZpbmUgU1I3NCAgNgorI2RlZmluZSBXUjc1IDE0CisjZGVmaW5lIFNSNzUgIDUKKyNkZWZpbmUgV1I3NiAgMAorI2RlZmluZSBTUjc2IDE1CisjZGVmaW5lIFdSNzcgIDMKKyNkZWZpbmUgU1I3NyAxMworI2RlZmluZSBXUjc4ICA5CisjZGVmaW5lIFNSNzggMTEKKyNkZWZpbmUgV1I3OSAxMQorI2RlZmluZSBTUjc5IDExCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kdGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JpcGVtZC9ybWR0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzNGUwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yaXBlbWQvcm1kdGVzdC5jCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBjcnlwdG8vcmlwZW1kL3JtZHRlc3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIi4uL2Vfb3MuaCIKKworI2lmZGVmIE9QRU5TU0xfTk9fUklQRU1ECitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHByaW50ZigiTm8gcmlwZW1kIHN1cHBvcnRcbiIpOworICAgIHJldHVybigwKTsKK30KKyNlbHNlCisjaW5jbHVkZSA8b3BlbnNzbC9yaXBlbWQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKyNpbmNsdWRlIDxvcGVuc3NsL2ViY2RpYy5oPgorI2VuZGlmCisKK3N0YXRpYyBjaGFyICp0ZXN0W109eworCSIiLAorCSJhIiwKKwkiYWJjIiwKKwkibWVzc2FnZSBkaWdlc3QiLAorCSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIsCisJImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKwkiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiLAorCSIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIsCisJTlVMTCwKKwl9OworCitzdGF0aWMgY2hhciAqcmV0W109eworCSI5YzExODVhNWM1ZTlmYzU0NjEyODA4OTc3ZWU4ZjU0OGIyMjU4ZDMxIiwKKwkiMGJkYzlkMmQyNTZiM2VlOWRhYWUzNDdiZTZmNGRjODM1YTQ2N2ZmZSIsCisJIjhlYjIwOGY3ZTA1ZDk4N2E5YjA0NGE4ZTk4YzZiMDg3ZjE1YTBiZmMiLAorCSI1ZDA2ODllZjQ5ZDJmYWU1NzJiODgxYjEyM2E4NWZmYTIxNTk1ZjM2IiwKKwkiZjcxYzI3MTA5YzY5MmMxYjU2YmJkY2ViNWI5ZDI4NjViMzcwOGRiYyIsCisJIjEyYTA1MzM4NGE5YzBjODhlNDA1YTA2YzI3ZGNmNDlhZGE2MmViMmIiLAorCSJiMGUyMGI2ZTMxMTY2NDAyODZlZDNhODdhNTcxMzA3OWIyMWY1MTg5IiwKKwkiOWI3NTJlNDU1NzNkNGIzOWY0ZGJkMzMyM2NhYjgyYmY2MzMyNmJmYiIsCisJfTsKKworc3RhdGljIGNoYXIgKnB0KHVuc2lnbmVkIGNoYXIgKm1kKTsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisJeworCWludCBpLGVycj0wOworCWNoYXIgKipQLCoqUjsKKwljaGFyICpwOworCXVuc2lnbmVkIGNoYXIgbWRbUklQRU1EMTYwX0RJR0VTVF9MRU5HVEhdOworCisJUD10ZXN0OworCVI9cmV0OworCWk9MTsKKwl3aGlsZSAoKlAgIT0gTlVMTCkKKwkJeworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCWViY2RpYzJhc2NpaSgoY2hhciAqKSpQLCAoY2hhciAqKSpQLCBzdHJsZW4oKGNoYXIgKikqUCkpOworI2VuZGlmCisJCUVWUF9EaWdlc3QoJihQWzBdWzBdKSxzdHJsZW4oKGNoYXIgKikqUCksbWQsTlVMTCxFVlBfcmlwZW1kMTYwKCksIE5VTEwpOworCQlwPXB0KG1kKTsKKwkJaWYgKHN0cmNtcChwLChjaGFyICopKlIpICE9IDApCisJCQl7CisJCQlwcmludGYoImVycm9yIGNhbGN1bGF0aW5nIFJJUEVNRDE2MCBvbiAnJXMnXG4iLCpQKTsKKwkJCXByaW50ZigiZ290ICVzIGluc3RlYWQgb2YgJXNcbiIscCwqUik7CisJCQllcnIrKzsKKwkJCX0KKwkJZWxzZQorCQkJcHJpbnRmKCJ0ZXN0ICVkIG9rXG4iLGkpOworCQlpKys7CisJCVIrKzsKKwkJUCsrOworCQl9CisJRVhJVChlcnIpOworCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyBjaGFyICpwdCh1bnNpZ25lZCBjaGFyICptZCkKKwl7CisJaW50IGk7CisJc3RhdGljIGNoYXIgYnVmWzgwXTsKKworCWZvciAoaT0wOyBpPFJJUEVNRDE2MF9ESUdFU1RfTEVOR1RIOyBpKyspCisJCXNwcmludGYoJihidWZbaSoyXSksIiUwMngiLG1kW2ldKTsKKwlyZXR1cm4oYnVmKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzQzNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYS5oCkBAIC0wLDAgKzEsNTAzIEBACisvKiBjcnlwdG8vcnNhL3JzYS5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1JTQV9ICisjZGVmaW5lIEhFQURFUl9SU0FfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9OT19SU0EKKyNlcnJvciBSU0EgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRGVjbGFyZWQgYWxyZWFkeSBpbiBvc3NsX3R5cC5oICovCisvKiB0eXBlZGVmIHN0cnVjdCByc2Ffc3QgUlNBOyAqLworLyogdHlwZWRlZiBzdHJ1Y3QgcnNhX21ldGhfc3QgUlNBX01FVEhPRDsgKi8KKworc3RydWN0IHJzYV9tZXRoX3N0CisJeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqcnNhX3B1Yl9lbmMpKGludCBmbGVuLGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sCisJCQkgICB1bnNpZ25lZCBjaGFyICp0bywKKwkJCSAgIFJTQSAqcnNhLGludCBwYWRkaW5nKTsKKwlpbnQgKCpyc2FfcHViX2RlYykoaW50IGZsZW4sY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKnRvLAorCQkJICAgUlNBICpyc2EsaW50IHBhZGRpbmcpOworCWludCAoKnJzYV9wcml2X2VuYykoaW50IGZsZW4sY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICp0bywKKwkJCSAgICBSU0EgKnJzYSxpbnQgcGFkZGluZyk7CisJaW50ICgqcnNhX3ByaXZfZGVjKShpbnQgZmxlbixjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKnRvLAorCQkJICAgIFJTQSAqcnNhLGludCBwYWRkaW5nKTsKKwlpbnQgKCpyc2FfbW9kX2V4cCkoQklHTlVNICpyMCxjb25zdCBCSUdOVU0gKkksUlNBICpyc2EsQk5fQ1RYICpjdHgpOyAvKiBDYW4gYmUgbnVsbCAqLworCWludCAoKmJuX21vZF9leHApKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisJCQkgIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsCisJCQkgIEJOX01PTlRfQ1RYICptX2N0eCk7IC8qIENhbiBiZSBudWxsICovCisJaW50ICgqaW5pdCkoUlNBICpyc2EpOwkJLyogY2FsbGVkIGF0IG5ldyAqLworCWludCAoKmZpbmlzaCkoUlNBICpyc2EpOwkvKiBjYWxsZWQgYXQgZnJlZSAqLworCWludCBmbGFnczsJCQkvKiBSU0FfTUVUSE9EX0ZMQUdfKiB0aGluZ3MgKi8KKwljaGFyICphcHBfZGF0YTsJCQkvKiBtYXkgYmUgbmVlZGVkISAqLworLyogTmV3IHNpZ24gYW5kIHZlcmlmeSBmdW5jdGlvbnM6IHNvbWUgbGlicmFyaWVzIGRvbid0IGFsbG93IGFyYml0cmFyeSBkYXRhCisgKiB0byBiZSBzaWduZWQvdmVyaWZpZWQ6IHRoaXMgYWxsb3dzIHRoZW0gdG8gYmUgdXNlZC4gTm90ZTogZm9yIHRoaXMgdG8gd29yaworICogdGhlIFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkgc2hvdWxkICpOT1QqIGJlIHVzZWQKKyAqIFJTQV9zaWduKCksIFJTQV92ZXJpZnkoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLiBOb3RlOiBmb3IgYmFja3dhcmRzCisgKiBjb21wYXRpYmlsaXR5IHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJTQV9GTEFHX1NJR05fVkVSCisgKiBvcHRpb24gaXMgc2V0IGluICdmbGFncycuCisgKi8KKwlpbnQgKCpyc2Ffc2lnbikoaW50IHR5cGUsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm0sIHVuc2lnbmVkIGludCBtX2xlbmd0aCwKKwkJdW5zaWduZWQgY2hhciAqc2lncmV0LCB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgY29uc3QgUlNBICpyc2EpOworCWludCAoKnJzYV92ZXJpZnkpKGludCBkdHlwZSwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqbSwgdW5zaWduZWQgaW50IG1fbGVuZ3RoLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWdidWYsIHVuc2lnbmVkIGludCBzaWdsZW4sCisJCQkJCQkJCWNvbnN0IFJTQSAqcnNhKTsKKy8qIElmIHRoaXMgY2FsbGJhY2sgaXMgTlVMTCwgdGhlIGJ1aWx0aW4gc29mdHdhcmUgUlNBIGtleS1nZW4gd2lsbCBiZSB1c2VkLiBUaGlzCisgKiBpcyBmb3IgYmVoYXZpb3VyYWwgY29tcGF0aWJpbGl0eSB3aGlsc3QgdGhlIGNvZGUgZ2V0cyByZXdpcmVkLCBidXQgb25lIGRheQorICogaXQgd291bGQgYmUgbmljZSB0byBhc3N1bWUgdGhlcmUgYXJlIG5vIHN1Y2ggdGhpbmdzIGFzICJidWlsdGluIHNvZnR3YXJlIgorICogaW1wbGVtZW50YXRpb25zLiAqLworCWludCAoKnJzYV9rZXlnZW4pKFJTQSAqcnNhLCBpbnQgYml0cywgQklHTlVNICplLCBCTl9HRU5DQiAqY2IpOworCX07CisKK3N0cnVjdCByc2Ffc3QKKwl7CisJLyogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB1c2VkIHRvIHBpY2t1cCBlcnJvcnMgd2hlcmUKKwkgKiB0aGlzIGlzIHBhc3NlZCBpbnN0ZWFkIG9mIGFFVlBfUEtFWSwgaXQgaXMgc2V0IHRvIDAgKi8KKwlpbnQgcGFkOworCWxvbmcgdmVyc2lvbjsKKwljb25zdCBSU0FfTUVUSE9EICptZXRoOworCS8qIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGlmICdtZXRoJyBpcyBFTkdJTkUtcHJvdmlkZWQgKi8KKwlFTkdJTkUgKmVuZ2luZTsKKwlCSUdOVU0gKm47CisJQklHTlVNICplOworCUJJR05VTSAqZDsKKwlCSUdOVU0gKnA7CisJQklHTlVNICpxOworCUJJR05VTSAqZG1wMTsKKwlCSUdOVU0gKmRtcTE7CisJQklHTlVNICppcW1wOworCS8qIGJlIGNhcmVmdWwgdXNpbmcgdGhpcyBpZiB0aGUgUlNBIHN0cnVjdHVyZSBpcyBzaGFyZWQgKi8KKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCWludCByZWZlcmVuY2VzOworCWludCBmbGFnczsKKworCS8qIFVzZWQgdG8gY2FjaGUgbW9udGdvbWVyeSB2YWx1ZXMgKi8KKwlCTl9NT05UX0NUWCAqX21ldGhvZF9tb2RfbjsKKwlCTl9NT05UX0NUWCAqX21ldGhvZF9tb2RfcDsKKwlCTl9NT05UX0NUWCAqX21ldGhvZF9tb2RfcTsKKworCS8qIGFsbCBCSUdOVU0gdmFsdWVzIGFyZSBhY3R1YWxseSBpbiB0aGUgZm9sbG93aW5nIGRhdGEsIGlmIGl0IGlzIG5vdAorCSAqIE5VTEwgKi8KKwljaGFyICpiaWdudW1fZGF0YTsKKwlCTl9CTElORElORyAqYmxpbmRpbmc7CisJQk5fQkxJTkRJTkcgKm10X2JsaW5kaW5nOworCX07CisKKyNpZm5kZWYgT1BFTlNTTF9SU0FfTUFYX01PRFVMVVNfQklUUworIyBkZWZpbmUgT1BFTlNTTF9SU0FfTUFYX01PRFVMVVNfQklUUwkxNjM4NAorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9SU0FfU01BTExfTU9EVUxVU19CSVRTCisjIGRlZmluZSBPUEVOU1NMX1JTQV9TTUFMTF9NT0RVTFVTX0JJVFMJMzA3MgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfUlNBX01BWF9QVUJFWFBfQklUUworIyBkZWZpbmUgT1BFTlNTTF9SU0FfTUFYX1BVQkVYUF9CSVRTCTY0IC8qIGV4cG9uZW50IGxpbWl0IGVuZm9yY2VkIGZvciAibGFyZ2UiIG1vZHVsdXMgb25seSAqLworI2VuZGlmCisKKyNkZWZpbmUgUlNBXzMJMHgzTAorI2RlZmluZSBSU0FfRjQJMHgxMDAwMUwKKworI2RlZmluZSBSU0FfTUVUSE9EX0ZMQUdfTk9fQ0hFQ0sJMHgwMDAxIC8qIGRvbid0IGNoZWNrIHB1Yi9wcml2YXRlIG1hdGNoICovCisKKyNkZWZpbmUgUlNBX0ZMQUdfQ0FDSEVfUFVCTElDCQkweDAwMDIKKyNkZWZpbmUgUlNBX0ZMQUdfQ0FDSEVfUFJJVkFURQkJMHgwMDA0CisjZGVmaW5lIFJTQV9GTEFHX0JMSU5ESU5HCQkweDAwMDgKKyNkZWZpbmUgUlNBX0ZMQUdfVEhSRUFEX1NBRkUJCTB4MDAxMAorLyogVGhpcyBmbGFnIG1lYW5zIHRoZSBwcml2YXRlIGtleSBvcGVyYXRpb25zIHdpbGwgYmUgaGFuZGxlZCBieSByc2FfbW9kX2V4cAorICogYW5kIHRoYXQgdGhleSBkbyBub3QgZGVwZW5kIG9uIHRoZSBwcml2YXRlIGtleSBjb21wb25lbnRzIGJlaW5nIHByZXNlbnQ6CisgKiBmb3IgZXhhbXBsZSBhIGtleSBzdG9yZWQgaW4gZXh0ZXJuYWwgaGFyZHdhcmUuIFdpdGhvdXQgdGhpcyBmbGFnIGJuX21vZF9leHAKKyAqIGdldHMgY2FsbGVkIHdoZW4gcHJpdmF0ZSBrZXkgY29tcG9uZW50cyBhcmUgYWJzZW50LgorICovCisjZGVmaW5lIFJTQV9GTEFHX0VYVF9QS0VZCQkweDAwMjAKKworLyogVGhpcyBmbGFnIGluIHRoZSBSU0FfTUVUSE9EIGVuYWJsZXMgdGhlIG5ldyByc2Ffc2lnbiwgcnNhX3ZlcmlmeSBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgUlNBX0ZMQUdfU0lHTl9WRVIJCTB4MDA0MAorCisjZGVmaW5lIFJTQV9GTEFHX05PX0JMSU5ESU5HCQkweDAwODAgLyogbmV3IHdpdGggMC45LjZqIGFuZCAwLjkuN2I7IHRoZSBidWlsdC1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBSU0EgaW1wbGVtZW50YXRpb24gbm93IHVzZXMgYmxpbmRpbmcgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGVmYXVsdCAoaWdub3JpbmcgUlNBX0ZMQUdfQkxJTkRJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBidXQgb3RoZXIgZW5naW5lcyBtaWdodCBub3QgbmVlZCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlNBX0ZMQUdfTk9fQ09OU1RUSU1FCQkweDAxMDAgLyogbmV3IHdpdGggMC45LjhmOyB0aGUgYnVpbHQtaW4gUlNBCisJCQkJCQkqIGltcGxlbWVudGF0aW9uIG5vdyB1c2VzIGNvbnN0YW50IHRpbWUKKwkJCQkJCSogb3BlcmF0aW9ucyBieSBkZWZhdWx0IGluIHByaXZhdGUga2V5IG9wZXJhdGlvbnMsCisJCQkJCQkqIGUuZy4sIGNvbnN0YW50IHRpbWUgbW9kdWxhciBleHBvbmVudGlhdGlvbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZHVsYXIgaW52ZXJzZSB3aXRob3V0IGxlYWtpbmcgYnJhbmNoZXMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBkaXZpc2lvbiB3aXRob3V0IGxlYWtpbmcgYnJhbmNoZXMuIFRoaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZsYWcgZGlzYWJsZXMgdGhlc2UgY29uc3RhbnQgdGltZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3BlcmF0aW9ucyBhbmQgcmVzdWx0cyBpbiBmYXN0ZXIgUlNBIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwcml2YXRlIGtleSBvcGVyYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2RlZmluZSBSU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FIFJTQV9GTEFHX05PX0NPTlNUVElNRSAvKiBkZXByZWNhdGVkIG5hbWUgZm9yIHRoZSBmbGFnKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5ldyB3aXRoIDAuOS43aDsgdGhlIGJ1aWx0LWluIFJTQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBub3cgdXNlcyBjb25zdGFudCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG1vZHVsYXIgZXhwb25lbnRpYXRpb24gZm9yIHNlY3JldCBleHBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnkgZGVmYXVsdC4gVGhpcyBmbGFnIGNhdXNlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmFzdGVyIHZhcmlhYmxlIHNsaWRpbmcgd2luZG93IG1ldGhvZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBiZSB1c2VkIGZvciBhbGwgZXhwb25lbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNlbmRpZgorCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RYX3NldF9yc2FfcGFkZGluZyhjdHgsIHBhZCkgXAorCUVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCAtMSwgRVZQX1BLRVlfQ1RSTF9SU0FfUEFERElORywgXAorCQkJCXBhZCwgTlVMTCkKKworI2RlZmluZSBFVlBfUEtFWV9DVFhfc2V0X3JzYV9wc3Nfc2FsdGxlbihjdHgsIGxlbikgXAorCUVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCBcCisJCQkJKEVWUF9QS0VZX09QX1NJR058RVZQX1BLRVlfT1BfVkVSSUZZKSwgXAorCQkJCUVWUF9QS0VZX0NUUkxfUlNBX1BTU19TQUxUTEVOLCBcCisJCQkJbGVuLCBOVUxMKQorCisjZGVmaW5lIEVWUF9QS0VZX0NUWF9zZXRfcnNhX2tleWdlbl9iaXRzKGN0eCwgYml0cykgXAorCUVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCBFVlBfUEtFWV9PUF9LRVlHRU4sIFwKKwkJCQlFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fQklUUywgYml0cywgTlVMTCkKKworI2RlZmluZSBFVlBfUEtFWV9DVFhfc2V0X3JzYV9rZXlnZW5fcHViZXhwKGN0eCwgcHViZXhwKSBcCisJRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCBFVlBfUEtFWV9SU0EsIEVWUF9QS0VZX09QX0tFWUdFTiwgXAorCQkJCUVWUF9QS0VZX0NUUkxfUlNBX0tFWUdFTl9QVUJFWFAsIDAsIHB1YmV4cCkKKworI2RlZmluZSBFVlBfUEtFWV9DVFJMX1JTQV9QQURESU5HCShFVlBfUEtFWV9BTEdfQ1RSTCArIDEpCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfUlNBX1BTU19TQUxUTEVOCShFVlBfUEtFWV9BTEdfQ1RSTCArIDIpCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9SU0FfS0VZR0VOX0JJVFMJKEVWUF9QS0VZX0FMR19DVFJMICsgMykKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9SU0FfS0VZR0VOX1BVQkVYUAkoRVZQX1BLRVlfQUxHX0NUUkwgKyA0KQorCisjZGVmaW5lIFJTQV9QS0NTMV9QQURESU5HCTEKKyNkZWZpbmUgUlNBX1NTTFYyM19QQURESU5HCTIKKyNkZWZpbmUgUlNBX05PX1BBRERJTkcJCTMKKyNkZWZpbmUgUlNBX1BLQ1MxX09BRVBfUEFERElORwk0CisjZGVmaW5lIFJTQV9YOTMxX1BBRERJTkcJNQorLyogRVZQX1BLRVlfIG9ubHkgKi8KKyNkZWZpbmUgUlNBX1BLQ1MxX1BTU19QQURESU5HCTYKKworI2RlZmluZSBSU0FfUEtDUzFfUEFERElOR19TSVpFCTExCisKKyNkZWZpbmUgUlNBX3NldF9hcHBfZGF0YShzLGFyZykgICAgICAgICBSU0Ffc2V0X2V4X2RhdGEocywwLGFyZykKKyNkZWZpbmUgUlNBX2dldF9hcHBfZGF0YShzKSAgICAgICAgICAgICBSU0FfZ2V0X2V4X2RhdGEocywwKQorCitSU0EgKglSU0FfbmV3KHZvaWQpOworUlNBICoJUlNBX25ld19tZXRob2QoRU5HSU5FICplbmdpbmUpOworaW50CVJTQV9zaXplKGNvbnN0IFJTQSAqKTsKKworLyogRGVwcmVjYXRlZCB2ZXJzaW9uICovCisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorUlNBICoJUlNBX2dlbmVyYXRlX2tleShpbnQgYml0cywgdW5zaWduZWQgbG9uZyBlLHZvaWQKKwkJKCpjYWxsYmFjaykoaW50LGludCx2b2lkICopLHZvaWQgKmNiX2FyZyk7CisjZW5kaWYgLyogIWRlZmluZWQoT1BFTlNTTF9OT19ERVBSRUNBVEVEKSAqLworCisvKiBOZXcgdmVyc2lvbiAqLworaW50CVJTQV9nZW5lcmF0ZV9rZXlfZXgoUlNBICpyc2EsIGludCBiaXRzLCBCSUdOVU0gKmUsIEJOX0dFTkNCICpjYik7CisKK2ludAlSU0FfY2hlY2tfa2V5KGNvbnN0IFJTQSAqKTsKKwkvKiBuZXh0IDQgcmV0dXJuIC0xIG9uIGVycm9yICovCitpbnQJUlNBX3B1YmxpY19lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCQl1bnNpZ25lZCBjaGFyICp0bywgUlNBICpyc2EsaW50IHBhZGRpbmcpOworaW50CVJTQV9wcml2YXRlX2VuY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sCisJCXVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSxpbnQgcGFkZGluZyk7CitpbnQJUlNBX3B1YmxpY19kZWNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCAKKwkJdW5zaWduZWQgY2hhciAqdG8sIFJTQSAqcnNhLGludCBwYWRkaW5nKTsKK2ludAlSU0FfcHJpdmF0ZV9kZWNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCAKKwkJdW5zaWduZWQgY2hhciAqdG8sIFJTQSAqcnNhLGludCBwYWRkaW5nKTsKK3ZvaWQJUlNBX2ZyZWUgKFJTQSAqcik7CisvKiAidXAiIHRoZSBSU0Egb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50ICovCitpbnQJUlNBX3VwX3JlZihSU0EgKnIpOworCitpbnQJUlNBX2ZsYWdzKGNvbnN0IFJTQSAqcik7CisKK3ZvaWQgUlNBX3NldF9kZWZhdWx0X21ldGhvZChjb25zdCBSU0FfTUVUSE9EICptZXRoKTsKK2NvbnN0IFJTQV9NRVRIT0QgKlJTQV9nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCk7Citjb25zdCBSU0FfTUVUSE9EICpSU0FfZ2V0X21ldGhvZChjb25zdCBSU0EgKnJzYSk7CitpbnQgUlNBX3NldF9tZXRob2QoUlNBICpyc2EsIGNvbnN0IFJTQV9NRVRIT0QgKm1ldGgpOworCisvKiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRoZSBtZW1vcnkgbG9ja2luZyBtYWxsb2MgY2FsbGJhY2tzIHRvIGJlIGluc3RhbGxlZCAqLworaW50IFJTQV9tZW1vcnlfbG9jayhSU0EgKnIpOworCisvKiB0aGVzZSBhcmUgdGhlIGFjdHVhbCBTU0xlYXkgUlNBIGZ1bmN0aW9ucyAqLworY29uc3QgUlNBX01FVEhPRCAqUlNBX1BLQ1MxX1NTTGVheSh2b2lkKTsKKworY29uc3QgUlNBX01FVEhPRCAqUlNBX251bGxfbWV0aG9kKHZvaWQpOworCitERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChSU0EsIFJTQVB1YmxpY0tleSkKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0KFJTQSwgUlNBUHJpdmF0ZUtleSkKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50CVJTQV9wcmludF9mcChGSUxFICpmcCwgY29uc3QgUlNBICpyLGludCBvZmZzZXQpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludAlSU0FfcHJpbnQoQklPICpicCwgY29uc3QgUlNBICpyLGludCBvZmZzZXQpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKK2ludCBpMmRfUlNBX05FVChjb25zdCBSU0EgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJaW50ICgqY2IpKGNoYXIgKmJ1ZiwgaW50IGxlbiwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgdmVyaWZ5KSwKKwkJaW50IHNnY2tleSk7CitSU0EgKmQyaV9SU0FfTkVUKFJTQSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgsCisJCSBpbnQgKCpjYikoY2hhciAqYnVmLCBpbnQgbGVuLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCB2ZXJpZnkpLAorCQkgaW50IHNnY2tleSk7CisKK2ludCBpMmRfTmV0c2NhcGVfUlNBKGNvbnN0IFJTQSAqYSwgdW5zaWduZWQgY2hhciAqKnBwLAorCQkgICAgIGludCAoKmNiKShjaGFyICpidWYsIGludCBsZW4sIGNvbnN0IGNoYXIgKnByb21wdCwKKwkJCSAgICAgICBpbnQgdmVyaWZ5KSk7CitSU0EgKmQyaV9OZXRzY2FwZV9SU0EoUlNBICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCwKKwkJICAgICAgaW50ICgqY2IpKGNoYXIgKmJ1ZiwgaW50IGxlbiwgY29uc3QgY2hhciAqcHJvbXB0LAorCQkJCWludCB2ZXJpZnkpKTsKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIHNpZ24gYW5kIHZlcmlmeSBhIFg1MDlfU0lHIEFTTjEgb2JqZWN0CisgKiBpbnNpZGUgUEtDUyMxIHBhZGRlZCBSU0EgZW5jcnlwdGlvbiAqLworaW50IFJTQV9zaWduKGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICptLCB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqc2lncmV0LCB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgUlNBICpyc2EpOworaW50IFJTQV92ZXJpZnkoaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm0sIHVuc2lnbmVkIGludCBtX2xlbmd0aCwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzaWdidWYsIHVuc2lnbmVkIGludCBzaWdsZW4sIFJTQSAqcnNhKTsKKworLyogVGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9uIHNpZ24gYW5kIHZlcmlmeSBhIEFTTjFfT0NURVRfU1RSSU5HCisgKiBvYmplY3QgaW5zaWRlIFBLQ1MjMSBwYWRkZWQgUlNBIGVuY3J5cHRpb24gKi8KK2ludCBSU0Ffc2lnbl9BU04xX09DVEVUX1NUUklORyhpbnQgdHlwZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyICptLCB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsCisJdW5zaWduZWQgY2hhciAqc2lncmV0LCB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgUlNBICpyc2EpOworaW50IFJTQV92ZXJpZnlfQVNOMV9PQ1RFVF9TVFJJTkcoaW50IHR5cGUsCisJY29uc3QgdW5zaWduZWQgY2hhciAqbSwgdW5zaWduZWQgaW50IG1fbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKnNpZ2J1ZiwgdW5zaWduZWQgaW50IHNpZ2xlbiwgUlNBICpyc2EpOworCitpbnQgUlNBX2JsaW5kaW5nX29uKFJTQSAqcnNhLCBCTl9DVFggKmN0eCk7Cit2b2lkIFJTQV9ibGluZGluZ19vZmYoUlNBICpyc2EpOworQk5fQkxJTkRJTkcgKlJTQV9zZXR1cF9ibGluZGluZyhSU0EgKnJzYSwgQk5fQ1RYICpjdHgpOworCitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMSh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCk7CitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsLGludCByc2FfbGVuKTsKK2ludCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8yKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsKTsKK2ludCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIodW5zaWduZWQgY2hhciAqdG8saW50IHRsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqZixpbnQgZmwsaW50IHJzYV9sZW4pOworaW50IFBLQ1MxX01HRjEodW5zaWduZWQgY2hhciAqbWFzaywgbG9uZyBsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2VlZCwgbG9uZyBzZWVkbGVuLCBjb25zdCBFVlBfTUQgKmRnc3QpOworaW50IFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsaW50IHBsKTsKK2ludCBSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsLGludCByc2FfbGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsaW50IHBsKTsKK2ludCBSU0FfcGFkZGluZ19hZGRfU1NMdjIzKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsKTsKK2ludCBSU0FfcGFkZGluZ19jaGVja19TU0x2MjModW5zaWduZWQgY2hhciAqdG8saW50IHRsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqZixpbnQgZmwsaW50IHJzYV9sZW4pOworaW50IFJTQV9wYWRkaW5nX2FkZF9ub25lKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsKTsKK2ludCBSU0FfcGFkZGluZ19jaGVja19ub25lKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsLGludCByc2FfbGVuKTsKK2ludCBSU0FfcGFkZGluZ19hZGRfWDkzMSh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCk7CitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfWDkzMSh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCxpbnQgcnNhX2xlbik7CitpbnQgUlNBX1g5MzFfaGFzaF9pZChpbnQgbmlkKTsKKworaW50IFJTQV92ZXJpZnlfUEtDUzFfUFNTKFJTQSAqcnNhLCBjb25zdCB1bnNpZ25lZCBjaGFyICptSGFzaCwKKwkJCWNvbnN0IEVWUF9NRCAqSGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqRU0sIGludCBzTGVuKTsKK2ludCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfUFNTKFJTQSAqcnNhLCB1bnNpZ25lZCBjaGFyICpFTSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1IYXNoLAorCQkJY29uc3QgRVZQX01EICpIYXNoLCBpbnQgc0xlbik7CisKK2ludCBSU0FfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCUNSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludCBSU0Ffc2V0X2V4X2RhdGEoUlNBICpyLGludCBpZHgsdm9pZCAqYXJnKTsKK3ZvaWQgKlJTQV9nZXRfZXhfZGF0YShjb25zdCBSU0EgKnIsIGludCBpZHgpOworCitSU0EgKlJTQVB1YmxpY0tleV9kdXAoUlNBICpyc2EpOworUlNBICpSU0FQcml2YXRlS2V5X2R1cChSU0EgKnJzYSk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfUlNBX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgUlNBIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFJTQV9GX0NIRUNLX1BBRERJTkdfTUQJCQkJIDE0MAorI2RlZmluZSBSU0FfRl9ET19SU0FfUFJJTlQJCQkJIDE0NgorI2RlZmluZSBSU0FfRl9JTlRfUlNBX1ZFUklGWQkJCQkgMTQ1CisjZGVmaW5lIFJTQV9GX01FTU9SWV9MT0NLCQkJCSAxMDAKKyNkZWZpbmUgUlNBX0ZfT0xEX1JTQV9QUklWX0RFQ09ERQkJCSAxNDcKKyNkZWZpbmUgUlNBX0ZfUEtFWV9SU0FfQ1RSTAkJCQkgMTQzCisjZGVmaW5lIFJTQV9GX1BLRVlfUlNBX0NUUkxfU1RSCQkJCSAxNDQKKyNkZWZpbmUgUlNBX0ZfUEtFWV9SU0FfU0lHTgkJCQkgMTQyCisjZGVmaW5lIFJTQV9GX1BLRVlfUlNBX1ZFUklGWVJFQ09WRVIJCQkgMTQxCisjZGVmaW5lIFJTQV9GX1JTQV9CVUlMVElOX0tFWUdFTgkJCSAxMjkKKyNkZWZpbmUgUlNBX0ZfUlNBX0NIRUNLX0tFWQkJCQkgMTIzCisjZGVmaW5lIFJTQV9GX1JTQV9FQVlfUFJJVkFURV9ERUNSWVBUCQkJIDEwMQorI2RlZmluZSBSU0FfRl9SU0FfRUFZX1BSSVZBVEVfRU5DUllQVAkJCSAxMDIKKyNkZWZpbmUgUlNBX0ZfUlNBX0VBWV9QVUJMSUNfREVDUllQVAkJCSAxMDMKKyNkZWZpbmUgUlNBX0ZfUlNBX0VBWV9QVUJMSUNfRU5DUllQVAkJCSAxMDQKKyNkZWZpbmUgUlNBX0ZfUlNBX0dFTkVSQVRFX0tFWQkJCQkgMTA1CisjZGVmaW5lIFJTQV9GX1JTQV9NRU1PUllfTE9DSwkJCQkgMTMwCisjZGVmaW5lIFJTQV9GX1JTQV9ORVdfTUVUSE9ECQkJCSAxMDYKKyNkZWZpbmUgUlNBX0ZfUlNBX05VTEwJCQkJCSAxMjQKKyNkZWZpbmUgUlNBX0ZfUlNBX05VTExfTU9EX0VYUAkJCQkgMTMxCisjZGVmaW5lIFJTQV9GX1JTQV9OVUxMX1BSSVZBVEVfREVDUllQVAkJCSAxMzIKKyNkZWZpbmUgUlNBX0ZfUlNBX05VTExfUFJJVkFURV9FTkNSWVBUCQkJIDEzMworI2RlZmluZSBSU0FfRl9SU0FfTlVMTF9QVUJMSUNfREVDUllQVAkJCSAxMzQKKyNkZWZpbmUgUlNBX0ZfUlNBX05VTExfUFVCTElDX0VOQ1JZUFQJCQkgMTM1CisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0FERF9OT05FCQkJIDEwNworI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfT0FFUAkJIDEyMQorI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfUFNTCQkJIDEyNQorI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfVFlQRV8xCQkgMTA4CisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0FERF9QS0NTMV9UWVBFXzIJCSAxMDkKKyNkZWZpbmUgUlNBX0ZfUlNBX1BBRERJTkdfQUREX1NTTFYyMwkJCSAxMTAKKyNkZWZpbmUgUlNBX0ZfUlNBX1BBRERJTkdfQUREX1g5MzEJCQkgMTI3CisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX05PTkUJCQkgMTExCisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX09BRVAJCSAxMjIKKyNkZWZpbmUgUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfUEtDUzFfVFlQRV8xCQkgMTEyCisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX1RZUEVfMgkJIDExMworI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19DSEVDS19TU0xWMjMJCQkgMTE0CisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1g5MzEJCQkgMTI4CisjZGVmaW5lIFJTQV9GX1JTQV9QUklOVAkJCQkJIDExNQorI2RlZmluZSBSU0FfRl9SU0FfUFJJTlRfRlAJCQkJIDExNgorI2RlZmluZSBSU0FfRl9SU0FfUFJJVl9ERUNPREUJCQkJIDEzNworI2RlZmluZSBSU0FfRl9SU0FfUFJJVl9FTkNPREUJCQkJIDEzOAorI2RlZmluZSBSU0FfRl9SU0FfUFVCX0RFQ09ERQkJCQkgMTM5CisjZGVmaW5lIFJTQV9GX1JTQV9TRVRVUF9CTElORElORwkJCSAxMzYKKyNkZWZpbmUgUlNBX0ZfUlNBX1NJR04JCQkJCSAxMTcKKyNkZWZpbmUgUlNBX0ZfUlNBX1NJR05fQVNOMV9PQ1RFVF9TVFJJTkcJCSAxMTgKKyNkZWZpbmUgUlNBX0ZfUlNBX1ZFUklGWQkJCQkgMTE5CisjZGVmaW5lIFJTQV9GX1JTQV9WRVJJRllfQVNOMV9PQ1RFVF9TVFJJTkcJCSAxMjAKKyNkZWZpbmUgUlNBX0ZfUlNBX1ZFUklGWV9QS0NTMV9QU1MJCQkgMTI2CisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgUlNBX1JfQUxHT1JJVEhNX01JU01BVENICQkJIDEwMAorI2RlZmluZSBSU0FfUl9CQURfRV9WQUxVRQkJCQkgMTAxCisjZGVmaW5lIFJTQV9SX0JBRF9GSVhFRF9IRUFERVJfREVDUllQVAkJCSAxMDIKKyNkZWZpbmUgUlNBX1JfQkFEX1BBRF9CWVRFX0NPVU5UCQkJIDEwMworI2RlZmluZSBSU0FfUl9CQURfU0lHTkFUVVJFCQkJCSAxMDQKKyNkZWZpbmUgUlNBX1JfQkxPQ0tfVFlQRV9JU19OT1RfMDEJCQkgMTA2CisjZGVmaW5lIFJTQV9SX0JMT0NLX1RZUEVfSVNfTk9UXzAyCQkJIDEwNworI2RlZmluZSBSU0FfUl9EQVRBX0dSRUFURVJfVEhBTl9NT0RfTEVOCQkJIDEwOAorI2RlZmluZSBSU0FfUl9EQVRBX1RPT19MQVJHRQkJCQkgMTA5CisjZGVmaW5lIFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRQkJIDExMAorI2RlZmluZSBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUwkJIDEzMgorI2RlZmluZSBSU0FfUl9EQVRBX1RPT19TTUFMTAkJCQkgMTExCisjZGVmaW5lIFJTQV9SX0RBVEFfVE9PX1NNQUxMX0ZPUl9LRVlfU0laRQkJIDEyMgorI2RlZmluZSBSU0FfUl9ESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWQkJIDExMgorI2RlZmluZSBSU0FfUl9ETVAxX05PVF9DT05HUlVFTlRfVE9fRAkJCSAxMjQKKyNkZWZpbmUgUlNBX1JfRE1RMV9OT1RfQ09OR1JVRU5UX1RPX0QJCQkgMTI1CisjZGVmaW5lIFJTQV9SX0RfRV9OT1RfQ09OR1JVRU5UX1RPXzEJCQkgMTIzCisjZGVmaW5lIFJTQV9SX0ZJUlNUX09DVEVUX0lOVkFMSUQJCQkgMTMzCisjZGVmaW5lIFJTQV9SX0lMTEVHQUxfT1JfVU5TVVBQT1JURURfUEFERElOR19NT0RFCSAxNDQKKyNkZWZpbmUgUlNBX1JfSU5WQUxJRF9ESUdFU1RfTEVOR1RICQkJIDE0MworI2RlZmluZSBSU0FfUl9JTlZBTElEX0hFQURFUgkJCQkgMTM3CisjZGVmaW5lIFJTQV9SX0lOVkFMSURfS0VZQklUUwkJCQkgMTQ1CisjZGVmaW5lIFJTQV9SX0lOVkFMSURfTUVTU0FHRV9MRU5HVEgJCQkgMTMxCisjZGVmaW5lIFJTQV9SX0lOVkFMSURfUEFERElORwkJCQkgMTM4CisjZGVmaW5lIFJTQV9SX0lOVkFMSURfUEFERElOR19NT0RFCQkJIDE0MQorI2RlZmluZSBSU0FfUl9JTlZBTElEX1BTU19TQUxUTEVOCQkJIDE0NgorI2RlZmluZSBSU0FfUl9JTlZBTElEX1RSQUlMRVIJCQkJIDEzOQorI2RlZmluZSBSU0FfUl9JTlZBTElEX1g5MzFfRElHRVNUCQkJIDE0MgorI2RlZmluZSBSU0FfUl9JUU1QX05PVF9JTlZFUlNFX09GX1EJCQkgMTI2CisjZGVmaW5lIFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTAkJCSAxMjAKKyNkZWZpbmUgUlNBX1JfTEFTVF9PQ1RFVF9JTlZBTElECQkJIDEzNAorI2RlZmluZSBSU0FfUl9NT0RVTFVTX1RPT19MQVJHRQkJCQkgMTA1CisjZGVmaW5lIFJTQV9SX05PX1BVQkxJQ19FWFBPTkVOVAkJCSAxNDAKKyNkZWZpbmUgUlNBX1JfTlVMTF9CRUZPUkVfQkxPQ0tfTUlTU0lORwkJCSAxMTMKKyNkZWZpbmUgUlNBX1JfTl9ET0VTX05PVF9FUVVBTF9QX1EJCQkgMTI3CisjZGVmaW5lIFJTQV9SX09BRVBfREVDT0RJTkdfRVJST1IJCQkgMTIxCisjZGVmaW5lIFJTQV9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUJIDE0OAorI2RlZmluZSBSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRAkJCSAxMTQKKyNkZWZpbmUgUlNBX1JfUF9OT1RfUFJJTUUJCQkJIDEyOAorI2RlZmluZSBSU0FfUl9RX05PVF9QUklNRQkJCQkgMTI5CisjZGVmaW5lIFJTQV9SX1JTQV9PUEVSQVRJT05TX05PVF9TVVBQT1JURUQJCSAxMzAKKyNkZWZpbmUgUlNBX1JfU0xFTl9DSEVDS19GQUlMRUQJCQkJIDEzNgorI2RlZmluZSBSU0FfUl9TTEVOX1JFQ09WRVJZX0ZBSUxFRAkJCSAxMzUKKyNkZWZpbmUgUlNBX1JfU1NMVjNfUk9MTEJBQ0tfQVRUQUNLCQkJIDExNQorI2RlZmluZSBSU0FfUl9USEVfQVNOMV9PQkpFQ1RfSURFTlRJRklFUl9JU19OT1RfS05PV05fRk9SX1RISVNfTUQgMTE2CisjZGVmaW5lIFJTQV9SX1VOS05PV05fQUxHT1JJVEhNX1RZUEUJCQkgMTE3CisjZGVmaW5lIFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFCQkJIDExOAorI2RlZmluZSBSU0FfUl9WQUxVRV9NSVNTSU5HCQkJCSAxNDcKKyNkZWZpbmUgUlNBX1JfV1JPTkdfU0lHTkFUVVJFX0xFTkdUSAkJCSAxMTkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2FtZXRoLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9hbWV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMzIwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9hbWV0aC5jCkBAIC0wLDAgKzEsMzQ5IEBACisvKiBjcnlwdG8vcnNhL3JzYV9hbWV0aC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNi4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKyNpbmNsdWRlIDxvcGVuc3NsL2Ntcy5oPgorI2VuZGlmCisjaW5jbHVkZSAiYXNuMV9sb2NsLmgiCisKK3N0YXRpYyBpbnQgcnNhX3B1Yl9lbmNvZGUoWDUwOV9QVUJLRVkgKnBrLCBjb25zdCBFVlBfUEtFWSAqcGtleSkKKwl7CisJdW5zaWduZWQgY2hhciAqcGVuYyA9IE5VTEw7CisJaW50IHBlbmNsZW47CisJcGVuY2xlbiA9IGkyZF9SU0FQdWJsaWNLZXkocGtleS0+cGtleS5yc2EsICZwZW5jKTsKKwlpZiAocGVuY2xlbiA8PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoWDUwOV9QVUJLRVlfc2V0MF9wYXJhbShwaywgT0JKX25pZDJvYmooRVZQX1BLRVlfUlNBKSwKKwkJCQlWX0FTTjFfTlVMTCwgTlVMTCwgcGVuYywgcGVuY2xlbikpCisJCXJldHVybiAxOworCisJT1BFTlNTTF9mcmVlKHBlbmMpOworCXJldHVybiAwOworCX0KKworc3RhdGljIGludCByc2FfcHViX2RlY29kZShFVlBfUEtFWSAqcGtleSwgWDUwOV9QVUJLRVkgKnB1YmtleSkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgcGtsZW47CisJUlNBICpyc2EgPSBOVUxMOworCWlmICghWDUwOV9QVUJLRVlfZ2V0MF9wYXJhbShOVUxMLCAmcCwgJnBrbGVuLCBOVUxMLCBwdWJrZXkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIShyc2EgPSBkMmlfUlNBUHVibGljS2V5KE5VTEwsICZwLCBwa2xlbikpKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUFVCX0RFQ09ERSwgRVJSX1JfUlNBX0xJQik7CisJCXJldHVybiAwOworCQl9CisJRVZQX1BLRVlfYXNzaWduX1JTQSAocGtleSwgcnNhKTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcnNhX3B1Yl9jbXAoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKQorCXsKKwlpZiAoQk5fY21wKGItPnBrZXkucnNhLT5uLGEtPnBrZXkucnNhLT5uKSAhPSAwCisJCXx8IEJOX2NtcChiLT5wa2V5LnJzYS0+ZSxhLT5wa2V5LnJzYS0+ZSkgIT0gMCkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBvbGRfcnNhX3ByaXZfZGVjb2RlKEVWUF9QS0VZICpwa2V5LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwgaW50IGRlcmxlbikKKwl7CisJUlNBICpyc2E7CisJaWYgKCEocnNhID0gZDJpX1JTQVByaXZhdGVLZXkgKE5VTEwsIHBkZXIsIGRlcmxlbikpKQorCQl7CisJCVJTQWVycihSU0FfRl9PTERfUlNBX1BSSVZfREVDT0RFLCBFUlJfUl9SU0FfTElCKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlFVlBfUEtFWV9hc3NpZ25fUlNBKHBrZXksIHJzYSk7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IG9sZF9yc2FfcHJpdl9lbmNvZGUoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVuc2lnbmVkIGNoYXIgKipwZGVyKQorCXsKKwlyZXR1cm4gaTJkX1JTQVByaXZhdGVLZXkocGtleS0+cGtleS5yc2EsIHBkZXIpOworCX0KKworc3RhdGljIGludCByc2FfcHJpdl9lbmNvZGUoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwl1bnNpZ25lZCBjaGFyICpyayA9IE5VTEw7CisJaW50IHJrbGVuOworCXJrbGVuID0gaTJkX1JTQVByaXZhdGVLZXkocGtleS0+cGtleS5yc2EsICZyayk7CisKKwlpZiAocmtsZW4gPD0gMCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BSSVZfRU5DT0RFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmICghUEtDUzhfcGtleV9zZXQwKHA4LCBPQkpfbmlkMm9iaihOSURfcnNhRW5jcnlwdGlvbiksIDAsCisJCQkJVl9BU04xX05VTEwsIE5VTEwsIHJrLCBya2xlbikpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QUklWX0VOQ09ERSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcnNhX3ByaXZfZGVjb2RlKEVWUF9QS0VZICpwa2V5LCBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgcGtsZW47CisJaWYgKCFQS0NTOF9wa2V5X2dldDAoTlVMTCwgJnAsICZwa2xlbiwgTlVMTCwgcDgpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gb2xkX3JzYV9wcml2X2RlY29kZShwa2V5LCAmcCwgcGtsZW4pOworCX0KKworc3RhdGljIGludCBpbnRfcnNhX3NpemUoY29uc3QgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBSU0Ffc2l6ZShwa2V5LT5wa2V5LnJzYSk7CisJfQorCitzdGF0aWMgaW50IHJzYV9iaXRzKGNvbnN0IEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4gQk5fbnVtX2JpdHMocGtleS0+cGtleS5yc2EtPm4pOworCX0KKworc3RhdGljIHZvaWQgaW50X3JzYV9mcmVlKEVWUF9QS0VZICpwa2V5KQorCXsKKwlSU0FfZnJlZShwa2V5LT5wa2V5LnJzYSk7CisJfQorCisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9idWZsZW4oY29uc3QgQklHTlVNICpiLCBzaXplX3QgKnBidWZsZW4pCisJeworCXNpemVfdCBpOworCWlmICghYikKKwkJcmV0dXJuOworCWlmICgqcGJ1ZmxlbiA8IChpID0gKHNpemVfdClCTl9udW1fYnl0ZXMoYikpKQorCQkJKnBidWZsZW4gPSBpOworCX0KKworc3RhdGljIGludCBkb19yc2FfcHJpbnQoQklPICpicCwgY29uc3QgUlNBICp4LCBpbnQgb2ZmLCBpbnQgcHJpdikKKwl7CisJY2hhciAqc3RyOworCWNvbnN0IGNoYXIgKnM7CisJdW5zaWduZWQgY2hhciAqbT1OVUxMOworCWludCByZXQ9MCwgbW9kX2xlbiA9IDA7CisJc2l6ZV90IGJ1Zl9sZW49MDsKKworCXVwZGF0ZV9idWZsZW4oeC0+biwgJmJ1Zl9sZW4pOworCXVwZGF0ZV9idWZsZW4oeC0+ZSwgJmJ1Zl9sZW4pOworCisJaWYgKHByaXYpCisJCXsKKwkJdXBkYXRlX2J1Zmxlbih4LT5kLCAmYnVmX2xlbik7CisJCXVwZGF0ZV9idWZsZW4oeC0+cCwgJmJ1Zl9sZW4pOworCQl1cGRhdGVfYnVmbGVuKHgtPnEsICZidWZfbGVuKTsKKwkJdXBkYXRlX2J1Zmxlbih4LT5kbXAxLCAmYnVmX2xlbik7CisJCXVwZGF0ZV9idWZsZW4oeC0+ZG1xMSwgJmJ1Zl9sZW4pOworCQl1cGRhdGVfYnVmbGVuKHgtPmlxbXAsICZidWZfbGVuKTsKKwkJfQorCisJbT0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKGJ1Zl9sZW4rMTApOworCWlmIChtID09IE5VTEwpCisJCXsKKwkJUlNBZXJyKFJTQV9GX0RPX1JTQV9QUklOVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoeC0+biAhPSBOVUxMKQorCQltb2RfbGVuID0gQk5fbnVtX2JpdHMoeC0+bik7CisKKwlpZighQklPX2luZGVudChicCxvZmYsMTI4KSkKKwkJZ290byBlcnI7CisKKwlpZiAocHJpdiAmJiB4LT5kKQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCJQcml2YXRlLUtleTogKCVkIGJpdClcbiIsIG1vZF9sZW4pCisJCQk8PSAwKSBnb3RvIGVycjsKKwkJc3RyID0gIm1vZHVsdXM6IjsKKwkJcyA9ICJwdWJsaWNFeHBvbmVudDoiOworCQl9CisJZWxzZQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCJQdWJsaWMtS2V5OiAoJWQgYml0KVxuIiwgbW9kX2xlbikKKwkJCTw9IDApIGdvdG8gZXJyOworCQlzdHIgPSAiTW9kdWx1czoiOworCQlzPSAiRXhwb25lbnQ6IjsKKwkJfQorCWlmICghQVNOMV9ibl9wcmludChicCxzdHIseC0+bixtLG9mZikpIGdvdG8gZXJyOworCWlmICghQVNOMV9ibl9wcmludChicCxzLHgtPmUsbSxvZmYpKQorCQlnb3RvIGVycjsKKwlpZiAocHJpdikKKwkJeworCQlpZiAoIUFTTjFfYm5fcHJpbnQoYnAsInByaXZhdGVFeHBvbmVudDoiLHgtPmQsbSxvZmYpKQorCQkJZ290byBlcnI7CisJCWlmICghQVNOMV9ibl9wcmludChicCwicHJpbWUxOiIseC0+cCxtLG9mZikpCisJCQlnb3RvIGVycjsKKwkJaWYgKCFBU04xX2JuX3ByaW50KGJwLCJwcmltZTI6Iix4LT5xLG0sb2ZmKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoIUFTTjFfYm5fcHJpbnQoYnAsImV4cG9uZW50MToiLHgtPmRtcDEsbSxvZmYpKQorCQkJZ290byBlcnI7CisJCWlmICghQVNOMV9ibl9wcmludChicCwiZXhwb25lbnQyOiIseC0+ZG1xMSxtLG9mZikpCisJCQlnb3RvIGVycjsKKwkJaWYgKCFBU04xX2JuX3ByaW50KGJwLCJjb2VmZmljaWVudDoiLHgtPmlxbXAsbSxvZmYpKQorCQkJZ290byBlcnI7CisJCX0KKwlyZXQ9MTsKK2VycjoKKwlpZiAobSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUobSk7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IHJzYV9wdWJfcHJpbnQoQklPICpicCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisJCQkJCQkJQVNOMV9QQ1RYICpjdHgpCisJeworCXJldHVybiBkb19yc2FfcHJpbnQoYnAsIHBrZXktPnBrZXkucnNhLCBpbmRlbnQsIDApOworCX0KKworCitzdGF0aWMgaW50IHJzYV9wcml2X3ByaW50KEJJTyAqYnAsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorCQkJCQkJCUFTTjFfUENUWCAqY3R4KQorCXsKKwlyZXR1cm4gZG9fcnNhX3ByaW50KGJwLCBwa2V5LT5wa2V5LnJzYSwgaW5kZW50LCAxKTsKKwl9CisKKworc3RhdGljIGludCByc2FfcGtleV9jdHJsKEVWUF9QS0VZICpwa2V5LCBpbnQgb3AsIGxvbmcgYXJnMSwgdm9pZCAqYXJnMikKKwl7CisJWDUwOV9BTEdPUiAqYWxnID0gTlVMTDsKKwlzd2l0Y2ggKG9wKQorCQl7CisKKwkJY2FzZSBBU04xX1BLRVlfQ1RSTF9QS0NTN19TSUdOOgorCQlpZiAoYXJnMSA9PSAwKQorCQkJUEtDUzdfU0lHTkVSX0lORk9fZ2V0MF9hbGdzKGFyZzIsIE5VTEwsIE5VTEwsICZhbGcpOworCQlicmVhazsKKworCQljYXNlIEFTTjFfUEtFWV9DVFJMX1BLQ1M3X0VOQ1JZUFQ6CisJCWlmIChhcmcxID09IDApCisJCQlQS0NTN19SRUNJUF9JTkZPX2dldDBfYWxnKGFyZzIsICZhbGcpOworCQlicmVhazsKKyNpZm5kZWYgT1BFTlNTTF9OT19DTVMKKwkJY2FzZSBBU04xX1BLRVlfQ1RSTF9DTVNfU0lHTjoKKwkJaWYgKGFyZzEgPT0gMCkKKwkJCUNNU19TaWduZXJJbmZvX2dldDBfYWxncyhhcmcyLCBOVUxMLCBOVUxMLCBOVUxMLCAmYWxnKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBBU04xX1BLRVlfQ1RSTF9DTVNfRU5WRUxPUEU6CisJCWlmIChhcmcxID09IDApCisJCQlDTVNfUmVjaXBpZW50SW5mb19rdHJpX2dldDBfYWxncyhhcmcyLCBOVUxMLCBOVUxMLCAmYWxnKTsKKwkJYnJlYWs7CisjZW5kaWYKKworCQljYXNlIEFTTjFfUEtFWV9DVFJMX0RFRkFVTFRfTURfTklEOgorCQkqKGludCAqKWFyZzIgPSBOSURfc2hhMTsKKwkJcmV0dXJuIDE7CisKKwkJZGVmYXVsdDoKKwkJcmV0dXJuIC0yOworCisJCX0KKworCWlmIChhbGcpCisJCVg1MDlfQUxHT1Jfc2V0MChhbGcsIE9CSl9uaWQyb2JqKE5JRF9yc2FFbmNyeXB0aW9uKSwKKwkJCQkJCQlWX0FTTjFfTlVMTCwgMCk7CisKKwlyZXR1cm4gMTsKKworCX0KKworCitjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCByc2FfYXNuMV9tZXRoc1tdID0gCisJeworCQl7CisJCUVWUF9QS0VZX1JTQSwKKwkJRVZQX1BLRVlfUlNBLAorCQlBU04xX1BLRVlfU0lHUEFSQU1fTlVMTCwKKworCQkiUlNBIiwKKwkJIk9wZW5TU0wgUlNBIG1ldGhvZCIsCisKKwkJcnNhX3B1Yl9kZWNvZGUsCisJCXJzYV9wdWJfZW5jb2RlLAorCQlyc2FfcHViX2NtcCwKKwkJcnNhX3B1Yl9wcmludCwKKworCQlyc2FfcHJpdl9kZWNvZGUsCisJCXJzYV9wcml2X2VuY29kZSwKKwkJcnNhX3ByaXZfcHJpbnQsCisKKwkJaW50X3JzYV9zaXplLAorCQlyc2FfYml0cywKKworCQkwLDAsMCwwLDAsMCwKKworCQlpbnRfcnNhX2ZyZWUsCisJCXJzYV9wa2V5X2N0cmwsCisJCW9sZF9yc2FfcHJpdl9kZWNvZGUsCisJCW9sZF9yc2FfcHJpdl9lbmNvZGUKKwkJfSwKKworCQl7CisJCUVWUF9QS0VZX1JTQTIsCisJCUVWUF9QS0VZX1JTQSwKKwkJQVNOMV9QS0VZX0FMSUFTCisJCX0KKwl9OwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfYXNuMS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfYXNuMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZmNhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9hc24xLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qIHJzYV9hc24xLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisKKy8qIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGZyZWUgYW5kIG5ldyBtZXRob2RzICovCitzdGF0aWMgaW50IHJzYV9jYihpbnQgb3BlcmF0aW9uLCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQkJCQkJdm9pZCAqZXhhcmcpCit7CisJaWYob3BlcmF0aW9uID09IEFTTjFfT1BfTkVXX1BSRSkgeworCQkqcHZhbCA9IChBU04xX1ZBTFVFICopUlNBX25ldygpOworCQlpZigqcHZhbCkgcmV0dXJuIDI7CisJCXJldHVybiAwOworCX0gZWxzZSBpZihvcGVyYXRpb24gPT0gQVNOMV9PUF9GUkVFX1BSRSkgeworCQlSU0FfZnJlZSgoUlNBICopKnB2YWwpOworCQkqcHZhbCA9IE5VTEw7CisJCXJldHVybiAyOworCX0KKwlyZXR1cm4gMTsKK30KKworQVNOMV9TRVFVRU5DRV9jYihSU0FQcml2YXRlS2V5LCByc2FfY2IpID0geworCUFTTjFfU0lNUExFKFJTQSwgdmVyc2lvbiwgTE9ORyksCisJQVNOMV9TSU1QTEUoUlNBLCBuLCBCSUdOVU0pLAorCUFTTjFfU0lNUExFKFJTQSwgZSwgQklHTlVNKSwKKwlBU04xX1NJTVBMRShSU0EsIGQsIEJJR05VTSksCisJQVNOMV9TSU1QTEUoUlNBLCBwLCBCSUdOVU0pLAorCUFTTjFfU0lNUExFKFJTQSwgcSwgQklHTlVNKSwKKwlBU04xX1NJTVBMRShSU0EsIGRtcDEsIEJJR05VTSksCisJQVNOMV9TSU1QTEUoUlNBLCBkbXExLCBCSUdOVU0pLAorCUFTTjFfU0lNUExFKFJTQSwgaXFtcCwgQklHTlVNKQorfSBBU04xX1NFUVVFTkNFX0VORF9jYihSU0EsIFJTQVByaXZhdGVLZXkpCisKKworQVNOMV9TRVFVRU5DRV9jYihSU0FQdWJsaWNLZXksIHJzYV9jYikgPSB7CisJQVNOMV9TSU1QTEUoUlNBLCBuLCBCSUdOVU0pLAorCUFTTjFfU0lNUExFKFJTQSwgZSwgQklHTlVNKSwKK30gQVNOMV9TRVFVRU5DRV9FTkRfY2IoUlNBLCBSU0FQdWJsaWNLZXkpCisKK0lNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoUlNBLCBSU0FQcml2YXRlS2V5LCBSU0FQcml2YXRlS2V5KQorCitJTVBMRU1FTlRfQVNOMV9FTkNPREVfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKFJTQSwgUlNBUHVibGljS2V5LCBSU0FQdWJsaWNLZXkpCisKK1JTQSAqUlNBUHVibGljS2V5X2R1cChSU0EgKnJzYSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kdXAoQVNOMV9JVEVNX3JwdHIoUlNBUHVibGljS2V5KSwgcnNhKTsKKwl9CisKK1JTQSAqUlNBUHJpdmF0ZUtleV9kdXAoUlNBICpyc2EpCisJeworCXJldHVybiBBU04xX2l0ZW1fZHVwKEFTTjFfSVRFTV9ycHRyKFJTQVByaXZhdGVLZXkpLCByc2EpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2Noay5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfY2hrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4NDhkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2Noay5jCkBAIC0wLDAgKzEsMTg0IEBACisvKiBjcnlwdG8vcnNhL3JzYV9jaGsuYyAgLSotIE1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCisKK2ludCBSU0FfY2hlY2tfa2V5KGNvbnN0IFJTQSAqa2V5KQorCXsKKwlCSUdOVU0gKmksICpqLCAqaywgKmwsICptOworCUJOX0NUWCAqY3R4OworCWludCByOworCWludCByZXQ9MTsKKwkKKwlpID0gQk5fbmV3KCk7CisJaiA9IEJOX25ldygpOworCWsgPSBCTl9uZXcoKTsKKwlsID0gQk5fbmV3KCk7CisJbSA9IEJOX25ldygpOworCWN0eCA9IEJOX0NUWF9uZXcoKTsKKwlpZiAoaSA9PSBOVUxMIHx8IGogPT0gTlVMTCB8fCBrID09IE5VTEwgfHwgbCA9PSBOVUxMIHx8CisJCW0gPT0gTlVMTCB8fCBjdHggPT0gTlVMTCkKKwkJeworCQlyZXQgPSAtMTsKKwkJUlNBZXJyKFJTQV9GX1JTQV9DSEVDS19LRVksIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwkKKwkvKiBwIHByaW1lPyAqLworCXIgPSBCTl9pc19wcmltZV9leChrZXktPnAsIEJOX3ByaW1lX2NoZWNrcywgTlVMTCwgTlVMTCk7CisJaWYgKHIgIT0gMSkKKwkJeworCQlyZXQgPSByOworCQlpZiAociAhPSAwKQorCQkJZ290byBlcnI7CisJCVJTQWVycihSU0FfRl9SU0FfQ0hFQ0tfS0VZLCBSU0FfUl9QX05PVF9QUklNRSk7CisJCX0KKwkKKwkvKiBxIHByaW1lPyAqLworCXIgPSBCTl9pc19wcmltZV9leChrZXktPnEsIEJOX3ByaW1lX2NoZWNrcywgTlVMTCwgTlVMTCk7CisJaWYgKHIgIT0gMSkKKwkJeworCQlyZXQgPSByOworCQlpZiAociAhPSAwKQorCQkJZ290byBlcnI7CisJCVJTQWVycihSU0FfRl9SU0FfQ0hFQ0tfS0VZLCBSU0FfUl9RX05PVF9QUklNRSk7CisJCX0KKwkKKwkvKiBuID0gcCpxPyAqLworCXIgPSBCTl9tdWwoaSwga2V5LT5wLCBrZXktPnEsIGN0eCk7CisJaWYgKCFyKSB7IHJldCA9IC0xOyBnb3RvIGVycjsgfQorCQorCWlmIChCTl9jbXAoaSwga2V5LT5uKSAhPSAwKQorCQl7CisJCXJldCA9IDA7CisJCVJTQWVycihSU0FfRl9SU0FfQ0hFQ0tfS0VZLCBSU0FfUl9OX0RPRVNfTk9UX0VRVUFMX1BfUSk7CisJCX0KKwkKKwkvKiBkKmUgPSAxICBtb2QgbGNtKHAtMSxxLTEpPyAqLworCisJciA9IEJOX3N1YihpLCBrZXktPnAsIEJOX3ZhbHVlX29uZSgpKTsKKwlpZiAoIXIpIHsgcmV0ID0gLTE7IGdvdG8gZXJyOyB9CisJciA9IEJOX3N1YihqLCBrZXktPnEsIEJOX3ZhbHVlX29uZSgpKTsKKwlpZiAoIXIpIHsgcmV0ID0gLTE7IGdvdG8gZXJyOyB9CisKKwkvKiBub3cgY29tcHV0ZSBrID0gbGNtKGksaikgKi8KKwlyID0gQk5fbXVsKGwsIGksIGosIGN0eCk7CisJaWYgKCFyKSB7IHJldCA9IC0xOyBnb3RvIGVycjsgfQorCXIgPSBCTl9nY2QobSwgaSwgaiwgY3R4KTsKKwlpZiAoIXIpIHsgcmV0ID0gLTE7IGdvdG8gZXJyOyB9CisJciA9IEJOX2RpdihrLCBOVUxMLCBsLCBtLCBjdHgpOyAvKiByZW1haW5kZXIgaXMgMCAqLworCWlmICghcikgeyByZXQgPSAtMTsgZ290byBlcnI7IH0KKworCXIgPSBCTl9tb2RfbXVsKGksIGtleS0+ZCwga2V5LT5lLCBrLCBjdHgpOworCWlmICghcikgeyByZXQgPSAtMTsgZ290byBlcnI7IH0KKworCWlmICghQk5faXNfb25lKGkpKQorCQl7CisJCXJldCA9IDA7CisJCVJTQWVycihSU0FfRl9SU0FfQ0hFQ0tfS0VZLCBSU0FfUl9EX0VfTk9UX0NPTkdSVUVOVF9UT18xKTsKKwkJfQorCQorCWlmIChrZXktPmRtcDEgIT0gTlVMTCAmJiBrZXktPmRtcTEgIT0gTlVMTCAmJiBrZXktPmlxbXAgIT0gTlVMTCkKKwkJeworCQkvKiBkbXAxID0gZCBtb2QgKHAtMSk/ICovCisJCXIgPSBCTl9zdWIoaSwga2V5LT5wLCBCTl92YWx1ZV9vbmUoKSk7CisJCWlmICghcikgeyByZXQgPSAtMTsgZ290byBlcnI7IH0KKworCQlyID0gQk5fbW9kKGosIGtleS0+ZCwgaSwgY3R4KTsKKwkJaWYgKCFyKSB7IHJldCA9IC0xOyBnb3RvIGVycjsgfQorCisJCWlmIChCTl9jbXAoaiwga2V5LT5kbXAxKSAhPSAwKQorCQkJeworCQkJcmV0ID0gMDsKKwkJCVJTQWVycihSU0FfRl9SU0FfQ0hFQ0tfS0VZLAorCQkJCVJTQV9SX0RNUDFfTk9UX0NPTkdSVUVOVF9UT19EKTsKKwkJCX0KKwkKKwkJLyogZG1xMSA9IGQgbW9kIChxLTEpPyAqLyAgICAKKwkJciA9IEJOX3N1YihpLCBrZXktPnEsIEJOX3ZhbHVlX29uZSgpKTsKKwkJaWYgKCFyKSB7IHJldCA9IC0xOyBnb3RvIGVycjsgfQorCQorCQlyID0gQk5fbW9kKGosIGtleS0+ZCwgaSwgY3R4KTsKKwkJaWYgKCFyKSB7IHJldCA9IC0xOyBnb3RvIGVycjsgfQorCisJCWlmIChCTl9jbXAoaiwga2V5LT5kbXExKSAhPSAwKQorCQkJeworCQkJcmV0ID0gMDsKKwkJCVJTQWVycihSU0FfRl9SU0FfQ0hFQ0tfS0VZLAorCQkJCVJTQV9SX0RNUTFfTk9UX0NPTkdSVUVOVF9UT19EKTsKKwkJCX0KKwkKKwkJLyogaXFtcCA9IHFeLTEgbW9kIHA/ICovCisJCWlmKCFCTl9tb2RfaW52ZXJzZShpLCBrZXktPnEsIGtleS0+cCwgY3R4KSkKKwkJCXsKKwkJCXJldCA9IC0xOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKEJOX2NtcChpLCBrZXktPmlxbXApICE9IDApCisJCQl7CisJCQlyZXQgPSAwOworCQkJUlNBZXJyKFJTQV9GX1JTQV9DSEVDS19LRVksCisJCQkJUlNBX1JfSVFNUF9OT1RfSU5WRVJTRV9PRl9RKTsKKwkJCX0KKwkJfQorCisgZXJyOgorCWlmIChpICE9IE5VTEwpIEJOX2ZyZWUoaSk7CisJaWYgKGogIT0gTlVMTCkgQk5fZnJlZShqKTsKKwlpZiAoayAhPSBOVUxMKSBCTl9mcmVlKGspOworCWlmIChsICE9IE5VTEwpIEJOX2ZyZWUobCk7CisJaWYgKG0gIT0gTlVMTCkgQk5fZnJlZShtKTsKKwlpZiAoY3R4ICE9IE5VTEwpIEJOX0NUWF9mcmVlKGN0eCk7CisJcmV0dXJuIChyZXQpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2RlcHIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2RlcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODU5ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfZGVwci5jCkBAIC0wLDAgKzEsMTAxIEBACisvKiBjcnlwdG8vcnNhL3JzYV9kZXByLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBOQjogVGhpcyBmaWxlIGNvbnRhaW5zIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIChjb21wYXRpYmlsaXR5IHdyYXBwZXJzIHRvIHRoZQorICogIm5ldyIgdmVyc2lvbnMpLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKworI2lmZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworCisjZWxzZQorCitSU0EgKlJTQV9nZW5lcmF0ZV9rZXkoaW50IGJpdHMsIHVuc2lnbmVkIGxvbmcgZV92YWx1ZSwKKwkgICAgIHZvaWQgKCpjYWxsYmFjaykoaW50LGludCx2b2lkICopLCB2b2lkICpjYl9hcmcpCisJeworCUJOX0dFTkNCIGNiOworCWludCBpOworCVJTQSAqcnNhID0gUlNBX25ldygpOworCUJJR05VTSAqZSA9IEJOX25ldygpOworCisJaWYoIXJzYSB8fCAhZSkgZ290byBlcnI7CisKKwkvKiBUaGUgcHJvYmxlbSBpcyB3aGVuIGJ1aWxkaW5nIHdpdGggOCwgMTYsIG9yIDMyIEJOX1VMT05HLAorCSAqIHVuc2lnbmVkIGxvbmcgY2FuIGJlIGxhcmdlciAqLworCWZvciAoaT0wOyBpPChpbnQpc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjg7IGkrKykKKwkJeworCQlpZiAoZV92YWx1ZSAmICgxVUw8PGkpKQorCQkJaWYgKEJOX3NldF9iaXQoZSxpKSA9PSAwKQorCQkJCWdvdG8gZXJyOworCQl9CisKKwlCTl9HRU5DQl9zZXRfb2xkKCZjYiwgY2FsbGJhY2ssIGNiX2FyZyk7CisKKwlpZihSU0FfZ2VuZXJhdGVfa2V5X2V4KHJzYSwgYml0cywgZSwgJmNiKSkgeworCQlCTl9mcmVlKGUpOworCQlyZXR1cm4gcnNhOworCX0KK2VycjoKKwlpZihlKSBCTl9mcmVlKGUpOworCWlmKHJzYSkgUlNBX2ZyZWUocnNhKTsKKwlyZXR1cm4gMDsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2VheS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfZWF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlYWVlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2VheS5jCkBAIC0wLDAgKzEsODkzIEBACisvKiBjcnlwdG8vcnNhL3JzYV9lYXkuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKKyNpZm5kZWYgUlNBX05VTEwKKworc3RhdGljIGludCBSU0FfZWF5X3B1YmxpY19lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCQl1bnNpZ25lZCBjaGFyICp0bywgUlNBICpyc2EsaW50IHBhZGRpbmcpOworc3RhdGljIGludCBSU0FfZWF5X3ByaXZhdGVfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkJdW5zaWduZWQgY2hhciAqdG8sIFJTQSAqcnNhLGludCBwYWRkaW5nKTsKK3N0YXRpYyBpbnQgUlNBX2VheV9wdWJsaWNfZGVjcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkJdW5zaWduZWQgY2hhciAqdG8sIFJTQSAqcnNhLGludCBwYWRkaW5nKTsKK3N0YXRpYyBpbnQgUlNBX2VheV9wcml2YXRlX2RlY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sCisJCXVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSxpbnQgcGFkZGluZyk7CitzdGF0aWMgaW50IFJTQV9lYXlfbW9kX2V4cChCSUdOVU0gKnIwLCBjb25zdCBCSUdOVU0gKmksIFJTQSAqcnNhLCBCTl9DVFggKmN0eCk7CitzdGF0aWMgaW50IFJTQV9lYXlfaW5pdChSU0EgKnJzYSk7CitzdGF0aWMgaW50IFJTQV9lYXlfZmluaXNoKFJTQSAqcnNhKTsKK3N0YXRpYyBSU0FfTUVUSE9EIHJzYV9wa2NzMV9lYXlfbWV0aD17CisJIkVyaWMgWW91bmcncyBQS0NTIzEgUlNBIiwKKwlSU0FfZWF5X3B1YmxpY19lbmNyeXB0LAorCVJTQV9lYXlfcHVibGljX2RlY3J5cHQsIC8qIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gKi8KKwlSU0FfZWF5X3ByaXZhdGVfZW5jcnlwdCwgLyogc2lnbmluZyAqLworCVJTQV9lYXlfcHJpdmF0ZV9kZWNyeXB0LAorCVJTQV9lYXlfbW9kX2V4cCwKKwlCTl9tb2RfZXhwX21vbnQsIC8qIFhYWCBwcm9iYWJseSB3ZSBzaG91bGQgbm90IHVzZSBNb250Z29tZXJ5IGlmICBlID09IDMgKi8KKwlSU0FfZWF5X2luaXQsCisJUlNBX2VheV9maW5pc2gsCisJMCwgLyogZmxhZ3MgKi8KKwlOVUxMLAorCTAsIC8qIHJzYV9zaWduICovCisJMCwgLyogcnNhX3ZlcmlmeSAqLworCU5VTEwgLyogcnNhX2tleWdlbiAqLworCX07CisKK2NvbnN0IFJTQV9NRVRIT0QgKlJTQV9QS0NTMV9TU0xlYXkodm9pZCkKKwl7CisJcmV0dXJuKCZyc2FfcGtjczFfZWF5X21ldGgpOworCX0KKworc3RhdGljIGludCBSU0FfZWF5X3B1YmxpY19lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCSAgICAgdW5zaWduZWQgY2hhciAqdG8sIFJTQSAqcnNhLCBpbnQgcGFkZGluZykKKwl7CisJQklHTlVNICpmLCpyZXQ7CisJaW50IGksaixrLG51bT0wLHI9IC0xOworCXVuc2lnbmVkIGNoYXIgKmJ1Zj1OVUxMOworCUJOX0NUWCAqY3R4PU5VTEw7CisKKwlpZiAoQk5fbnVtX2JpdHMocnNhLT5uKSA+IE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFMpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFVCTElDX0VOQ1JZUFQsIFJTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwlpZiAoQk5fdWNtcChyc2EtPm4sIHJzYS0+ZSkgPD0gMCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX0VBWV9QVUJMSUNfRU5DUllQVCwgUlNBX1JfQkFEX0VfVkFMVUUpOworCQlyZXR1cm4gLTE7CisJCX0KKworCS8qIGZvciBsYXJnZSBtb2R1bGksIGVuZm9yY2UgZXhwb25lbnQgbGltaXQgKi8KKwlpZiAoQk5fbnVtX2JpdHMocnNhLT5uKSA+IE9QRU5TU0xfUlNBX1NNQUxMX01PRFVMVVNfQklUUykKKwkJeworCQlpZiAoQk5fbnVtX2JpdHMocnNhLT5lKSA+IE9QRU5TU0xfUlNBX01BWF9QVUJFWFBfQklUUykKKwkJCXsKKwkJCVJTQWVycihSU0FfRl9SU0FfRUFZX1BVQkxJQ19FTkNSWVBULCBSU0FfUl9CQURfRV9WQUxVRSk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkKKwlpZiAoKGN0eD1CTl9DVFhfbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCUJOX0NUWF9zdGFydChjdHgpOworCWYgPSBCTl9DVFhfZ2V0KGN0eCk7CisJcmV0ID0gQk5fQ1RYX2dldChjdHgpOworCW51bT1CTl9udW1fYnl0ZXMocnNhLT5uKTsKKwlidWYgPSBPUEVOU1NMX21hbGxvYyhudW0pOworCWlmICghZiB8fCAhcmV0IHx8ICFidWYpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFVCTElDX0VOQ1JZUFQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJc3dpdGNoIChwYWRkaW5nKQorCQl7CisJY2FzZSBSU0FfUEtDUzFfUEFERElORzoKKwkJaT1SU0FfcGFkZGluZ19hZGRfUEtDUzFfdHlwZV8yKGJ1ZixudW0sZnJvbSxmbGVuKTsKKwkJYnJlYWs7CisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisJY2FzZSBSU0FfUEtDUzFfT0FFUF9QQURESU5HOgorCSAgICAgICAgaT1SU0FfcGFkZGluZ19hZGRfUEtDUzFfT0FFUChidWYsbnVtLGZyb20sZmxlbixOVUxMLDApOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgUlNBX1NTTFYyM19QQURESU5HOgorCQlpPVJTQV9wYWRkaW5nX2FkZF9TU0x2MjMoYnVmLG51bSxmcm9tLGZsZW4pOworCQlicmVhazsKKwljYXNlIFJTQV9OT19QQURESU5HOgorCQlpPVJTQV9wYWRkaW5nX2FkZF9ub25lKGJ1ZixudW0sZnJvbSxmbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFVCTElDX0VOQ1JZUFQsUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChpIDw9IDApIGdvdG8gZXJyOworCisJaWYgKEJOX2JpbjJibihidWYsbnVtLGYpID09IE5VTEwpIGdvdG8gZXJyOworCQorCWlmIChCTl91Y21wKGYsIHJzYS0+bikgPj0gMCkKKwkJeworCQkvKiB1c3VhbGx5IHRoZSBwYWRkaW5nIGZ1bmN0aW9ucyB3b3VsZCBjYXRjaCB0aGlzICovCisJCVJTQWVycihSU0FfRl9SU0FfRUFZX1BVQkxJQ19FTkNSWVBULFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChyc2EtPmZsYWdzICYgUlNBX0ZMQUdfQ0FDSEVfUFVCTElDKQorCQlpZiAoIUJOX01PTlRfQ1RYX3NldF9sb2NrZWQoJnJzYS0+X21ldGhvZF9tb2RfbiwgQ1JZUFRPX0xPQ0tfUlNBLCByc2EtPm4sIGN0eCkpCisJCQlnb3RvIGVycjsKKworCWlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHJldCxmLHJzYS0+ZSxyc2EtPm4sY3R4LAorCQlyc2EtPl9tZXRob2RfbW9kX24pKSBnb3RvIGVycjsKKworCS8qIHB1dCBpbiBsZWFkaW5nIDAgYnl0ZXMgaWYgdGhlIG51bWJlciBpcyBsZXNzIHRoYW4gdGhlCisJICogbGVuZ3RoIG9mIHRoZSBtb2R1bHVzICovCisJaj1CTl9udW1fYnl0ZXMocmV0KTsKKwlpPUJOX2JuMmJpbihyZXQsJih0b1tudW0tal0pKTsKKwlmb3IgKGs9MDsgazwobnVtLWkpOyBrKyspCisJCXRvW2tdPTA7CisKKwlyPW51bTsKK2VycjoKKwlpZiAoY3R4ICE9IE5VTEwpCisJCXsKKwkJQk5fQ1RYX2VuZChjdHgpOworCQlCTl9DVFhfZnJlZShjdHgpOworCQl9CisJaWYgKGJ1ZiAhPSBOVUxMKSAKKwkJeworCQlPUEVOU1NMX2NsZWFuc2UoYnVmLG51bSk7CisJCU9QRU5TU0xfZnJlZShidWYpOworCQl9CisJcmV0dXJuKHIpOworCX0KKworc3RhdGljIEJOX0JMSU5ESU5HICpyc2FfZ2V0X2JsaW5kaW5nKFJTQSAqcnNhLCBpbnQgKmxvY2FsLCBCTl9DVFggKmN0eCkKK3sKKwlCTl9CTElORElORyAqcmV0OworCWludCBnb3Rfd3JpdGVfbG9jayA9IDA7CisJQ1JZUFRPX1RIUkVBRElEIGN1cjsKKworCUNSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfUlNBKTsKKworCWlmIChyc2EtPmJsaW5kaW5nID09IE5VTEwpCisJCXsKKwkJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX1JTQSk7CisJCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfUlNBKTsKKwkJZ290X3dyaXRlX2xvY2sgPSAxOworCisJCWlmIChyc2EtPmJsaW5kaW5nID09IE5VTEwpCisJCQlyc2EtPmJsaW5kaW5nID0gUlNBX3NldHVwX2JsaW5kaW5nKHJzYSwgY3R4KTsKKwkJfQorCisJcmV0ID0gcnNhLT5ibGluZGluZzsKKwlpZiAocmV0ID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJQ1JZUFRPX1RIUkVBRElEX2N1cnJlbnQoJmN1cik7CisJaWYgKCFDUllQVE9fVEhSRUFESURfY21wKCZjdXIsIEJOX0JMSU5ESU5HX3RocmVhZF9pZChyZXQpKSkKKwkJeworCQkvKiByc2EtPmJsaW5kaW5nIGlzIG91cnMhICovCisKKwkJKmxvY2FsID0gMTsKKwkJfQorCWVsc2UKKwkJeworCQkvKiByZXNvcnQgdG8gcnNhLT5tdF9ibGluZGluZyBpbnN0ZWFkICovCisKKwkJKmxvY2FsID0gMDsgLyogaW5zdHJ1Y3RzIHJzYV9ibGluZGluZ19jb252ZXJ0KCksIHJzYV9ibGluZGluZ19pbnZlcnQoKQorCQkgICAgICAgICAgICAgKiB0aGF0IHRoZSBCTl9CTElORElORyBpcyBzaGFyZWQsIG1lYW5pbmcgdGhhdCBhY2Nlc3NlcworCQkgICAgICAgICAgICAgKiByZXF1aXJlIGxvY2tzLCBhbmQgdGhhdCB0aGUgYmxpbmRpbmcgZmFjdG9yIG11c3QgYmUKKwkJICAgICAgICAgICAgICogc3RvcmVkIG91dHNpZGUgdGhlIEJOX0JMSU5ESU5HCisJCSAgICAgICAgICAgICAqLworCisJCWlmIChyc2EtPm10X2JsaW5kaW5nID09IE5VTEwpCisJCQl7CisJCQlpZiAoIWdvdF93cml0ZV9sb2NrKQorCQkJCXsKKwkJCQlDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfUlNBKTsKKwkJCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1JTQSk7CisJCQkJZ290X3dyaXRlX2xvY2sgPSAxOworCQkJCX0KKwkJCQorCQkJaWYgKHJzYS0+bXRfYmxpbmRpbmcgPT0gTlVMTCkKKwkJCQlyc2EtPm10X2JsaW5kaW5nID0gUlNBX3NldHVwX2JsaW5kaW5nKHJzYSwgY3R4KTsKKwkJCX0KKwkJcmV0ID0gcnNhLT5tdF9ibGluZGluZzsKKwkJfQorCisgZXJyOgorCWlmIChnb3Rfd3JpdGVfbG9jaykKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JTQSk7CisJZWxzZQorCQlDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfUlNBKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJzYV9ibGluZGluZ19jb252ZXJ0KEJOX0JMSU5ESU5HICpiLCBpbnQgbG9jYWwsIEJJR05VTSAqZiwKKwlCSUdOVU0gKnIsIEJOX0NUWCAqY3R4KQoreworCWlmIChsb2NhbCkKKwkJcmV0dXJuIEJOX0JMSU5ESU5HX2NvbnZlcnRfZXgoZiwgTlVMTCwgYiwgY3R4KTsKKwllbHNlCisJCXsKKwkJaW50IHJldDsKKwkJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19SU0FfQkxJTkRJTkcpOworCQlyZXQgPSBCTl9CTElORElOR19jb252ZXJ0X2V4KGYsIHIsIGIsIGN0eCk7CisJCUNSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19SU0FfQkxJTkRJTkcpOworCQlyZXR1cm4gcmV0OworCQl9Cit9CisKK3N0YXRpYyBpbnQgcnNhX2JsaW5kaW5nX2ludmVydChCTl9CTElORElORyAqYiwgaW50IGxvY2FsLCBCSUdOVU0gKmYsCisJQklHTlVNICpyLCBCTl9DVFggKmN0eCkKK3sKKwlpZiAobG9jYWwpCisJCXJldHVybiBCTl9CTElORElOR19pbnZlcnRfZXgoZiwgTlVMTCwgYiwgY3R4KTsKKwllbHNlCisJCXsKKwkJaW50IHJldDsKKwkJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19SU0FfQkxJTkRJTkcpOworCQlyZXQgPSBCTl9CTElORElOR19pbnZlcnRfZXgoZiwgciwgYiwgY3R4KTsKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1JTQV9CTElORElORyk7CisJCXJldHVybiByZXQ7CisJCX0KK30KKworLyogc2lnbmluZyAqLworc3RhdGljIGludCBSU0FfZWF5X3ByaXZhdGVfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSwgaW50IHBhZGRpbmcpCisJeworCUJJR05VTSAqZiwgKnJldCwgKmJyLCAqcmVzOworCWludCBpLGosayxudW09MCxyPSAtMTsKKwl1bnNpZ25lZCBjaGFyICpidWY9TlVMTDsKKwlCTl9DVFggKmN0eD1OVUxMOworCWludCBsb2NhbF9ibGluZGluZyA9IDA7CisJQk5fQkxJTkRJTkcgKmJsaW5kaW5nID0gTlVMTDsKKworCWlmICgoY3R4PUJOX0NUWF9uZXcoKSkgPT0gTlVMTCkgZ290byBlcnI7CisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJZiAgID0gQk5fQ1RYX2dldChjdHgpOworCWJyICA9IEJOX0NUWF9nZXQoY3R4KTsKKwlyZXQgPSBCTl9DVFhfZ2V0KGN0eCk7CisJbnVtID0gQk5fbnVtX2J5dGVzKHJzYS0+bik7CisJYnVmID0gT1BFTlNTTF9tYWxsb2MobnVtKTsKKwlpZighZiB8fCAhcmV0IHx8ICFidWYpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFJJVkFURV9FTkNSWVBULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCXN3aXRjaCAocGFkZGluZykKKwkJeworCWNhc2UgUlNBX1BLQ1MxX1BBRERJTkc6CisJCWk9UlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMShidWYsbnVtLGZyb20sZmxlbik7CisJCWJyZWFrOworCWNhc2UgUlNBX1g5MzFfUEFERElORzoKKwkJaT1SU0FfcGFkZGluZ19hZGRfWDkzMShidWYsbnVtLGZyb20sZmxlbik7CisJCWJyZWFrOworCWNhc2UgUlNBX05PX1BBRERJTkc6CisJCWk9UlNBX3BhZGRpbmdfYWRkX25vbmUoYnVmLG51bSxmcm9tLGZsZW4pOworCQlicmVhazsKKwljYXNlIFJTQV9TU0xWMjNfUEFERElORzoKKwlkZWZhdWx0OgorCQlSU0FlcnIoUlNBX0ZfUlNBX0VBWV9QUklWQVRFX0VOQ1JZUFQsUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChpIDw9IDApIGdvdG8gZXJyOworCisJaWYgKEJOX2JpbjJibihidWYsbnVtLGYpID09IE5VTEwpIGdvdG8gZXJyOworCQorCWlmIChCTl91Y21wKGYsIHJzYS0+bikgPj0gMCkKKwkJewkKKwkJLyogdXN1YWxseSB0aGUgcGFkZGluZyBmdW5jdGlvbnMgd291bGQgY2F0Y2ggdGhpcyAqLworCQlSU0FlcnIoUlNBX0ZfUlNBX0VBWV9QUklWQVRFX0VOQ1JZUFQsUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKCEocnNhLT5mbGFncyAmIFJTQV9GTEFHX05PX0JMSU5ESU5HKSkKKwkJeworCQlibGluZGluZyA9IHJzYV9nZXRfYmxpbmRpbmcocnNhLCAmbG9jYWxfYmxpbmRpbmcsIGN0eCk7CisJCWlmIChibGluZGluZyA9PSBOVUxMKQorCQkJeworCQkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFJJVkFURV9FTkNSWVBULCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQorCWlmIChibGluZGluZyAhPSBOVUxMKQorCQlpZiAoIXJzYV9ibGluZGluZ19jb252ZXJ0KGJsaW5kaW5nLCBsb2NhbF9ibGluZGluZywgZiwgYnIsIGN0eCkpCisJCQlnb3RvIGVycjsKKworCWlmICggKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19FWFRfUEtFWSkgfHwKKwkJKChyc2EtPnAgIT0gTlVMTCkgJiYKKwkJKHJzYS0+cSAhPSBOVUxMKSAmJgorCQkocnNhLT5kbXAxICE9IE5VTEwpICYmCisJCShyc2EtPmRtcTEgIT0gTlVMTCkgJiYKKwkJKHJzYS0+aXFtcCAhPSBOVUxMKSkgKQorCQl7IAorCQlpZiAoIXJzYS0+bWV0aC0+cnNhX21vZF9leHAocmV0LCBmLCByc2EsIGN0eCkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCUJJR05VTSBsb2NhbF9kOworCQlCSUdOVU0gKmQgPSBOVUxMOworCQkKKwkJaWYgKCEocnNhLT5mbGFncyAmIFJTQV9GTEFHX05PX0NPTlNUVElNRSkpCisJCQl7CisJCQlCTl9pbml0KCZsb2NhbF9kKTsKKwkJCWQgPSAmbG9jYWxfZDsKKwkJCUJOX3dpdGhfZmxhZ3MoZCwgcnNhLT5kLCBCTl9GTEdfQ09OU1RUSU1FKTsKKwkJCX0KKwkJZWxzZQorCQkJZD0gcnNhLT5kOworCisJCWlmIChyc2EtPmZsYWdzICYgUlNBX0ZMQUdfQ0FDSEVfUFVCTElDKQorCQkJaWYoIUJOX01PTlRfQ1RYX3NldF9sb2NrZWQoJnJzYS0+X21ldGhvZF9tb2RfbiwgQ1JZUFRPX0xPQ0tfUlNBLCByc2EtPm4sIGN0eCkpCisJCQkJZ290byBlcnI7CisKKwkJaWYgKCFyc2EtPm1ldGgtPmJuX21vZF9leHAocmV0LGYsZCxyc2EtPm4sY3R4LAorCQkJCXJzYS0+X21ldGhvZF9tb2RfbikpIGdvdG8gZXJyOworCQl9CisKKwlpZiAoYmxpbmRpbmcpCisJCWlmICghcnNhX2JsaW5kaW5nX2ludmVydChibGluZGluZywgbG9jYWxfYmxpbmRpbmcsIHJldCwgYnIsIGN0eCkpCisJCQlnb3RvIGVycjsKKworCWlmIChwYWRkaW5nID09IFJTQV9YOTMxX1BBRERJTkcpCisJCXsKKwkJQk5fc3ViKGYsIHJzYS0+biwgcmV0KTsKKwkJaWYgKEJOX2NtcChyZXQsIGYpKQorCQkJcmVzID0gZjsKKwkJZWxzZQorCQkJcmVzID0gcmV0OworCQl9CisJZWxzZQorCQlyZXMgPSByZXQ7CisKKwkvKiBwdXQgaW4gbGVhZGluZyAwIGJ5dGVzIGlmIHRoZSBudW1iZXIgaXMgbGVzcyB0aGFuIHRoZQorCSAqIGxlbmd0aCBvZiB0aGUgbW9kdWx1cyAqLworCWo9Qk5fbnVtX2J5dGVzKHJlcyk7CisJaT1CTl9ibjJiaW4ocmVzLCYodG9bbnVtLWpdKSk7CisJZm9yIChrPTA7IGs8KG51bS1pKTsgaysrKQorCQl0b1trXT0wOworCisJcj1udW07CitlcnI6CisJaWYgKGN0eCAhPSBOVUxMKQorCQl7CisJCUJOX0NUWF9lbmQoY3R4KTsKKwkJQk5fQ1RYX2ZyZWUoY3R4KTsKKwkJfQorCWlmIChidWYgIT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX2NsZWFuc2UoYnVmLG51bSk7CisJCU9QRU5TU0xfZnJlZShidWYpOworCQl9CisJcmV0dXJuKHIpOworCX0KKworc3RhdGljIGludCBSU0FfZWF5X3ByaXZhdGVfZGVjcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSwgaW50IHBhZGRpbmcpCisJeworCUJJR05VTSAqZiwgKnJldCwgKmJyOworCWludCBqLG51bT0wLHI9IC0xOworCXVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgY2hhciAqYnVmPU5VTEw7CisJQk5fQ1RYICpjdHg9TlVMTDsKKwlpbnQgbG9jYWxfYmxpbmRpbmcgPSAwOworCUJOX0JMSU5ESU5HICpibGluZGluZyA9IE5VTEw7CisKKwlpZigoY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlmICAgPSBCTl9DVFhfZ2V0KGN0eCk7CisJYnIgID0gQk5fQ1RYX2dldChjdHgpOworCXJldCA9IEJOX0NUWF9nZXQoY3R4KTsKKwludW0gPSBCTl9udW1fYnl0ZXMocnNhLT5uKTsKKwlidWYgPSBPUEVOU1NMX21hbGxvYyhudW0pOworCWlmKCFmIHx8ICFyZXQgfHwgIWJ1ZikKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX0VBWV9QUklWQVRFX0RFQ1JZUFQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogVGhpcyBjaGVjayB3YXMgZm9yIGVxdWFsaXR5IGJ1dCBQR1AgZG9lcyBldmlsIHRoaW5ncworCSAqIGFuZCBjaG9wcyBvZmYgdGhlIHRvcCAnMCcgYnl0ZXMgKi8KKwlpZiAoZmxlbiA+IG51bSkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX0VBWV9QUklWQVRFX0RFQ1JZUFQsUlNBX1JfREFUQV9HUkVBVEVSX1RIQU5fTU9EX0xFTik7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBtYWtlIGRhdGEgaW50byBhIGJpZyBudW1iZXIgKi8KKwlpZiAoQk5fYmluMmJuKGZyb20sKGludClmbGVuLGYpID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKEJOX3VjbXAoZiwgcnNhLT5uKSA+PSAwKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfRUFZX1BSSVZBVEVfREVDUllQVCxSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfTU9EVUxVUyk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoIShyc2EtPmZsYWdzICYgUlNBX0ZMQUdfTk9fQkxJTkRJTkcpKQorCQl7CisJCWJsaW5kaW5nID0gcnNhX2dldF9ibGluZGluZyhyc2EsICZsb2NhbF9ibGluZGluZywgY3R4KTsKKwkJaWYgKGJsaW5kaW5nID09IE5VTEwpCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfUlNBX0VBWV9QUklWQVRFX0RFQ1JZUFQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCisJaWYgKGJsaW5kaW5nICE9IE5VTEwpCisJCWlmICghcnNhX2JsaW5kaW5nX2NvbnZlcnQoYmxpbmRpbmcsIGxvY2FsX2JsaW5kaW5nLCBmLCBiciwgY3R4KSkKKwkJCWdvdG8gZXJyOworCisJLyogZG8gdGhlIGRlY3J5cHQgKi8KKwlpZiAoIChyc2EtPmZsYWdzICYgUlNBX0ZMQUdfRVhUX1BLRVkpIHx8CisJCSgocnNhLT5wICE9IE5VTEwpICYmCisJCShyc2EtPnEgIT0gTlVMTCkgJiYKKwkJKHJzYS0+ZG1wMSAhPSBOVUxMKSAmJgorCQkocnNhLT5kbXExICE9IE5VTEwpICYmCisJCShyc2EtPmlxbXAgIT0gTlVMTCkpICkKKwkJeworCQlpZiAoIXJzYS0+bWV0aC0+cnNhX21vZF9leHAocmV0LCBmLCByc2EsIGN0eCkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCUJJR05VTSBsb2NhbF9kOworCQlCSUdOVU0gKmQgPSBOVUxMOworCQkKKwkJaWYgKCEocnNhLT5mbGFncyAmIFJTQV9GTEFHX05PX0NPTlNUVElNRSkpCisJCQl7CisJCQlkID0gJmxvY2FsX2Q7CisJCQlCTl93aXRoX2ZsYWdzKGQsIHJzYS0+ZCwgQk5fRkxHX0NPTlNUVElNRSk7CisJCQl9CisJCWVsc2UKKwkJCWQgPSByc2EtPmQ7CisKKwkJaWYgKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19DQUNIRV9QVUJMSUMpCisJCQlpZiAoIUJOX01PTlRfQ1RYX3NldF9sb2NrZWQoJnJzYS0+X21ldGhvZF9tb2RfbiwgQ1JZUFRPX0xPQ0tfUlNBLCByc2EtPm4sIGN0eCkpCisJCQkJZ290byBlcnI7CisJCWlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHJldCxmLGQscnNhLT5uLGN0eCwKKwkJCQlyc2EtPl9tZXRob2RfbW9kX24pKQorCQkgIGdvdG8gZXJyOworCQl9CisKKwlpZiAoYmxpbmRpbmcpCisJCWlmICghcnNhX2JsaW5kaW5nX2ludmVydChibGluZGluZywgbG9jYWxfYmxpbmRpbmcsIHJldCwgYnIsIGN0eCkpCisJCQlnb3RvIGVycjsKKworCXA9YnVmOworCWo9Qk5fYm4yYmluKHJldCxwKTsgLyogaiBpcyBvbmx5IHVzZWQgd2l0aCBuby1wYWRkaW5nIG1vZGUgKi8KKworCXN3aXRjaCAocGFkZGluZykKKwkJeworCWNhc2UgUlNBX1BLQ1MxX1BBRERJTkc6CisJCXI9UlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8yKHRvLG51bSxidWYsaixudW0pOworCQlicmVhazsKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKyAgICAgICAgY2FzZSBSU0FfUEtDUzFfT0FFUF9QQURESU5HOgorCSAgICAgICAgcj1SU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQKHRvLG51bSxidWYsaixudW0sTlVMTCwwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorIAljYXNlIFJTQV9TU0xWMjNfUEFERElORzoKKwkJcj1SU0FfcGFkZGluZ19jaGVja19TU0x2MjModG8sbnVtLGJ1ZixqLG51bSk7CisJCWJyZWFrOworCWNhc2UgUlNBX05PX1BBRERJTkc6CisJCXI9UlNBX3BhZGRpbmdfY2hlY2tfbm9uZSh0byxudW0sYnVmLGosbnVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFJJVkFURV9ERUNSWVBULFJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAociA8IDApCisJCVJTQWVycihSU0FfRl9SU0FfRUFZX1BSSVZBVEVfREVDUllQVCxSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCk7CisKK2VycjoKKwlpZiAoY3R4ICE9IE5VTEwpCisJCXsKKwkJQk5fQ1RYX2VuZChjdHgpOworCQlCTl9DVFhfZnJlZShjdHgpOworCQl9CisJaWYgKGJ1ZiAhPSBOVUxMKQorCQl7CisJCU9QRU5TU0xfY2xlYW5zZShidWYsbnVtKTsKKwkJT1BFTlNTTF9mcmVlKGJ1Zik7CisJCX0KKwlyZXR1cm4ocik7CisJfQorCisvKiBzaWduYXR1cmUgdmVyaWZpY2F0aW9uICovCitzdGF0aWMgaW50IFJTQV9lYXlfcHVibGljX2RlY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sCisJICAgICB1bnNpZ25lZCBjaGFyICp0bywgUlNBICpyc2EsIGludCBwYWRkaW5nKQorCXsKKwlCSUdOVU0gKmYsKnJldDsKKwlpbnQgaSxudW09MCxyPSAtMTsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgKmJ1Zj1OVUxMOworCUJOX0NUWCAqY3R4PU5VTEw7CisKKwlpZiAoQk5fbnVtX2JpdHMocnNhLT5uKSA+IE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFMpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFVCTElDX0RFQ1JZUFQsIFJTQV9SX01PRFVMVVNfVE9PX0xBUkdFKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwlpZiAoQk5fdWNtcChyc2EtPm4sIHJzYS0+ZSkgPD0gMCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX0VBWV9QVUJMSUNfREVDUllQVCwgUlNBX1JfQkFEX0VfVkFMVUUpOworCQlyZXR1cm4gLTE7CisJCX0KKworCS8qIGZvciBsYXJnZSBtb2R1bGksIGVuZm9yY2UgZXhwb25lbnQgbGltaXQgKi8KKwlpZiAoQk5fbnVtX2JpdHMocnNhLT5uKSA+IE9QRU5TU0xfUlNBX1NNQUxMX01PRFVMVVNfQklUUykKKwkJeworCQlpZiAoQk5fbnVtX2JpdHMocnNhLT5lKSA+IE9QRU5TU0xfUlNBX01BWF9QVUJFWFBfQklUUykKKwkJCXsKKwkJCVJTQWVycihSU0FfRl9SU0FfRUFZX1BVQkxJQ19ERUNSWVBULCBSU0FfUl9CQURfRV9WQUxVRSk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkKKwlpZigoY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlmID0gQk5fQ1RYX2dldChjdHgpOworCXJldCA9IEJOX0NUWF9nZXQoY3R4KTsKKwludW09Qk5fbnVtX2J5dGVzKHJzYS0+bik7CisJYnVmID0gT1BFTlNTTF9tYWxsb2MobnVtKTsKKwlpZighZiB8fCAhcmV0IHx8ICFidWYpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFVCTElDX0RFQ1JZUFQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogVGhpcyBjaGVjayB3YXMgZm9yIGVxdWFsaXR5IGJ1dCBQR1AgZG9lcyBldmlsIHRoaW5ncworCSAqIGFuZCBjaG9wcyBvZmYgdGhlIHRvcCAnMCcgYnl0ZXMgKi8KKwlpZiAoZmxlbiA+IG51bSkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX0VBWV9QVUJMSUNfREVDUllQVCxSU0FfUl9EQVRBX0dSRUFURVJfVEhBTl9NT0RfTEVOKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChCTl9iaW4yYm4oZnJvbSxmbGVuLGYpID09IE5VTEwpIGdvdG8gZXJyOworCisJaWYgKEJOX3VjbXAoZiwgcnNhLT5uKSA+PSAwKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfRUFZX1BVQkxJQ19ERUNSWVBULFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9NT0RVTFVTKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChyc2EtPmZsYWdzICYgUlNBX0ZMQUdfQ0FDSEVfUFVCTElDKQorCQlpZiAoIUJOX01PTlRfQ1RYX3NldF9sb2NrZWQoJnJzYS0+X21ldGhvZF9tb2RfbiwgQ1JZUFRPX0xPQ0tfUlNBLCByc2EtPm4sIGN0eCkpCisJCQlnb3RvIGVycjsKKworCWlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHJldCxmLHJzYS0+ZSxyc2EtPm4sY3R4LAorCQlyc2EtPl9tZXRob2RfbW9kX24pKSBnb3RvIGVycjsKKworCWlmICgocGFkZGluZyA9PSBSU0FfWDkzMV9QQURESU5HKSAmJiAoKHJldC0+ZFswXSAmIDB4ZikgIT0gMTIpKQorCQlCTl9zdWIocmV0LCByc2EtPm4sIHJldCk7CisKKwlwPWJ1ZjsKKwlpPUJOX2JuMmJpbihyZXQscCk7CisKKwlzd2l0Y2ggKHBhZGRpbmcpCisJCXsKKwljYXNlIFJTQV9QS0NTMV9QQURESU5HOgorCQlyPVJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMSh0byxudW0sYnVmLGksbnVtKTsKKwkJYnJlYWs7CisJY2FzZSBSU0FfWDkzMV9QQURESU5HOgorCQlyPVJTQV9wYWRkaW5nX2NoZWNrX1g5MzEodG8sbnVtLGJ1ZixpLG51bSk7CisJCWJyZWFrOworCWNhc2UgUlNBX05PX1BBRERJTkc6CisJCXI9UlNBX3BhZGRpbmdfY2hlY2tfbm9uZSh0byxudW0sYnVmLGksbnVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFVCTElDX0RFQ1JZUFQsUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChyIDwgMCkKKwkJUlNBZXJyKFJTQV9GX1JTQV9FQVlfUFVCTElDX0RFQ1JZUFQsUlNBX1JfUEFERElOR19DSEVDS19GQUlMRUQpOworCitlcnI6CisJaWYgKGN0eCAhPSBOVUxMKQorCQl7CisJCUJOX0NUWF9lbmQoY3R4KTsKKwkJQk5fQ1RYX2ZyZWUoY3R4KTsKKwkJfQorCWlmIChidWYgIT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX2NsZWFuc2UoYnVmLG51bSk7CisJCU9QRU5TU0xfZnJlZShidWYpOworCQl9CisJcmV0dXJuKHIpOworCX0KKworc3RhdGljIGludCBSU0FfZWF5X21vZF9leHAoQklHTlVNICpyMCwgY29uc3QgQklHTlVNICpJLCBSU0EgKnJzYSwgQk5fQ1RYICpjdHgpCisJeworCUJJR05VTSAqcjEsKm0xLCp2cmZ5OworCUJJR05VTSBsb2NhbF9kbXAxLGxvY2FsX2RtcTEsbG9jYWxfYyxsb2NhbF9yMTsKKwlCSUdOVU0gKmRtcDEsKmRtcTEsKmMsKnByMTsKKwlpbnQgcmV0PTA7CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlyMSA9IEJOX0NUWF9nZXQoY3R4KTsKKwltMSA9IEJOX0NUWF9nZXQoY3R4KTsKKwl2cmZ5ID0gQk5fQ1RYX2dldChjdHgpOworCisJeworCQlCSUdOVU0gbG9jYWxfcCwgbG9jYWxfcTsKKwkJQklHTlVNICpwID0gTlVMTCwgKnEgPSBOVUxMOworCisJCS8qIE1ha2Ugc3VyZSBCTl9tb2RfaW52ZXJzZSBpbiBNb250Z29tZXJ5IGludGlhbGl6YXRpb24gdXNlcyB0aGUKKwkJICogQk5fRkxHX0NPTlNUVElNRSBmbGFnICh1bmxlc3MgUlNBX0ZMQUdfTk9fQ09OU1RUSU1FIGlzIHNldCkKKwkJICovCisJCWlmICghKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19OT19DT05TVFRJTUUpKQorCQkJeworCQkJQk5faW5pdCgmbG9jYWxfcCk7CisJCQlwID0gJmxvY2FsX3A7CisJCQlCTl93aXRoX2ZsYWdzKHAsIHJzYS0+cCwgQk5fRkxHX0NPTlNUVElNRSk7CisKKwkJCUJOX2luaXQoJmxvY2FsX3EpOworCQkJcSA9ICZsb2NhbF9xOworCQkJQk5fd2l0aF9mbGFncyhxLCByc2EtPnEsIEJOX0ZMR19DT05TVFRJTUUpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlwID0gcnNhLT5wOworCQkJcSA9IHJzYS0+cTsKKwkJCX0KKworCQlpZiAocnNhLT5mbGFncyAmIFJTQV9GTEFHX0NBQ0hFX1BSSVZBVEUpCisJCQl7CisJCQlpZiAoIUJOX01PTlRfQ1RYX3NldF9sb2NrZWQoJnJzYS0+X21ldGhvZF9tb2RfcCwgQ1JZUFRPX0xPQ0tfUlNBLCBwLCBjdHgpKQorCQkJCWdvdG8gZXJyOworCQkJaWYgKCFCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCZyc2EtPl9tZXRob2RfbW9kX3EsIENSWVBUT19MT0NLX1JTQSwgcSwgY3R4KSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwl9CisKKwlpZiAocnNhLT5mbGFncyAmIFJTQV9GTEFHX0NBQ0hFX1BVQkxJQykKKwkJaWYgKCFCTl9NT05UX0NUWF9zZXRfbG9ja2VkKCZyc2EtPl9tZXRob2RfbW9kX24sIENSWVBUT19MT0NLX1JTQSwgcnNhLT5uLCBjdHgpKQorCQkJZ290byBlcnI7CisKKwkvKiBjb21wdXRlIEkgbW9kIHEgKi8KKwlpZiAoIShyc2EtPmZsYWdzICYgUlNBX0ZMQUdfTk9fQ09OU1RUSU1FKSkKKwkJeworCQljID0gJmxvY2FsX2M7CisJCUJOX3dpdGhfZmxhZ3MoYywgSSwgQk5fRkxHX0NPTlNUVElNRSk7CisJCWlmICghQk5fbW9kKHIxLGMscnNhLT5xLGN0eCkpIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQl7CisJCWlmICghQk5fbW9kKHIxLEkscnNhLT5xLGN0eCkpIGdvdG8gZXJyOworCQl9CisKKwkvKiBjb21wdXRlIHIxXmRtcTEgbW9kIHEgKi8KKwlpZiAoIShyc2EtPmZsYWdzICYgUlNBX0ZMQUdfTk9fQ09OU1RUSU1FKSkKKwkJeworCQlkbXExID0gJmxvY2FsX2RtcTE7CisJCUJOX3dpdGhfZmxhZ3MoZG1xMSwgcnNhLT5kbXExLCBCTl9GTEdfQ09OU1RUSU1FKTsKKwkJfQorCWVsc2UKKwkJZG1xMSA9IHJzYS0+ZG1xMTsKKwlpZiAoIXJzYS0+bWV0aC0+Ym5fbW9kX2V4cChtMSxyMSxkbXExLHJzYS0+cSxjdHgsCisJCXJzYS0+X21ldGhvZF9tb2RfcSkpIGdvdG8gZXJyOworCisJLyogY29tcHV0ZSBJIG1vZCBwICovCisJaWYgKCEocnNhLT5mbGFncyAmIFJTQV9GTEFHX05PX0NPTlNUVElNRSkpCisJCXsKKwkJYyA9ICZsb2NhbF9jOworCQlCTl93aXRoX2ZsYWdzKGMsIEksIEJOX0ZMR19DT05TVFRJTUUpOworCQlpZiAoIUJOX21vZChyMSxjLHJzYS0+cCxjdHgpKSBnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIUJOX21vZChyMSxJLHJzYS0+cCxjdHgpKSBnb3RvIGVycjsKKwkJfQorCisJLyogY29tcHV0ZSByMV5kbXAxIG1vZCBwICovCisJaWYgKCEocnNhLT5mbGFncyAmIFJTQV9GTEFHX05PX0NPTlNUVElNRSkpCisJCXsKKwkJZG1wMSA9ICZsb2NhbF9kbXAxOworCQlCTl93aXRoX2ZsYWdzKGRtcDEsIHJzYS0+ZG1wMSwgQk5fRkxHX0NPTlNUVElNRSk7CisJCX0KKwllbHNlCisJCWRtcDEgPSByc2EtPmRtcDE7CisJaWYgKCFyc2EtPm1ldGgtPmJuX21vZF9leHAocjAscjEsZG1wMSxyc2EtPnAsY3R4LAorCQlyc2EtPl9tZXRob2RfbW9kX3ApKSBnb3RvIGVycjsKKworCWlmICghQk5fc3ViKHIwLHIwLG0xKSkgZ290byBlcnI7CisJLyogVGhpcyB3aWxsIGhlbHAgc3RvcCB0aGUgc2l6ZSBvZiByMCBpbmNyZWFzaW5nLCB3aGljaCBkb2VzCisJICogYWZmZWN0IHRoZSBtdWx0aXBseSBpZiBpdCBvcHRpbWlzZWQgZm9yIGEgcG93ZXIgb2YgMiBzaXplICovCisJaWYgKEJOX2lzX25lZ2F0aXZlKHIwKSkKKwkJaWYgKCFCTl9hZGQocjAscjAscnNhLT5wKSkgZ290byBlcnI7CisKKwlpZiAoIUJOX211bChyMSxyMCxyc2EtPmlxbXAsY3R4KSkgZ290byBlcnI7CisKKwkvKiBUdXJuIEJOX0ZMR19DT05TVFRJTUUgZmxhZyBvbiBiZWZvcmUgZGl2aXNpb24gb3BlcmF0aW9uICovCisJaWYgKCEocnNhLT5mbGFncyAmIFJTQV9GTEFHX05PX0NPTlNUVElNRSkpCisJCXsKKwkJcHIxID0gJmxvY2FsX3IxOworCQlCTl93aXRoX2ZsYWdzKHByMSwgcjEsIEJOX0ZMR19DT05TVFRJTUUpOworCQl9CisJZWxzZQorCQlwcjEgPSByMTsKKwlpZiAoIUJOX21vZChyMCxwcjEscnNhLT5wLGN0eCkpIGdvdG8gZXJyOworCisJLyogSWYgcCA8IHEgaXQgaXMgb2NjYXNpb25hbGx5IHBvc3NpYmxlIGZvciB0aGUgY29ycmVjdGlvbiBvZgorICAgICAgICAgKiBhZGRpbmcgJ3AnIGlmIHIwIGlzIG5lZ2F0aXZlIGFib3ZlIHRvIGxlYXZlIHRoZSByZXN1bHQgc3RpbGwKKwkgKiBuZWdhdGl2ZS4gVGhpcyBjYW4gYnJlYWsgdGhlIHByaXZhdGUga2V5IG9wZXJhdGlvbnM6IHRoZSBmb2xsb3dpbmcKKwkgKiBzZWNvbmQgY29ycmVjdGlvbiBzaG91bGQgKmFsd2F5cyogY29ycmVjdCB0aGlzIHJhcmUgb2NjdXJyZW5jZS4KKwkgKiBUaGlzIHdpbGwgKm5ldmVyKiBoYXBwZW4gd2l0aCBPcGVuU1NMIGdlbmVyYXRlZCBrZXlzIGJlY2F1c2UKKyAgICAgICAgICogdGhleSBlbnN1cmUgcCA+IHEgW3N0ZXZlXQorICAgICAgICAgKi8KKwlpZiAoQk5faXNfbmVnYXRpdmUocjApKQorCQlpZiAoIUJOX2FkZChyMCxyMCxyc2EtPnApKSBnb3RvIGVycjsKKwlpZiAoIUJOX211bChyMSxyMCxyc2EtPnEsY3R4KSkgZ290byBlcnI7CisJaWYgKCFCTl9hZGQocjAscjEsbTEpKSBnb3RvIGVycjsKKworCWlmIChyc2EtPmUgJiYgcnNhLT5uKQorCQl7CisJCWlmICghcnNhLT5tZXRoLT5ibl9tb2RfZXhwKHZyZnkscjAscnNhLT5lLHJzYS0+bixjdHgscnNhLT5fbWV0aG9kX21vZF9uKSkgZ290byBlcnI7CisJCS8qIElmICdJJyB3YXMgZ3JlYXRlciB0aGFuIChvciBlcXVhbCB0bykgcnNhLT5uLCB0aGUgb3BlcmF0aW9uCisJCSAqIHdpbGwgYmUgZXF1aXZhbGVudCB0byB1c2luZyAnSSBtb2QgbicuIEhvd2V2ZXIsIHRoZSByZXN1bHQgb2YKKwkJICogdGhlIHZlcmlmeSB3aWxsICphbHdheXMqIGJlIGxlc3MgdGhhbiAnbicgc28gd2UgZG9uJ3QgY2hlY2sKKwkJICogZm9yIGFic29sdXRlIGVxdWFsaXR5LCBqdXN0IGNvbmdydWVuY3kuICovCisJCWlmICghQk5fc3ViKHZyZnksIHZyZnksIEkpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9tb2QodnJmeSwgdnJmeSwgcnNhLT5uLCBjdHgpKSBnb3RvIGVycjsKKwkJaWYgKEJOX2lzX25lZ2F0aXZlKHZyZnkpKQorCQkJaWYgKCFCTl9hZGQodnJmeSwgdnJmeSwgcnNhLT5uKSkgZ290byBlcnI7CisJCWlmICghQk5faXNfemVybyh2cmZ5KSkKKwkJCXsKKwkJCS8qICdJJyBhbmQgJ3ZyZnknIGFyZW4ndCBjb25ncnVlbnQgbW9kIG4uIERvbid0IGxlYWsKKwkJCSAqIG1pc2NhbGN1bGF0ZWQgQ1JUIG91dHB1dCwganVzdCBkbyBhIHJhdyAoc2xvd2VyKQorCQkJICogbW9kX2V4cCBhbmQgcmV0dXJuIHRoYXQgaW5zdGVhZC4gKi8KKworCQkJQklHTlVNIGxvY2FsX2Q7CisJCQlCSUdOVU0gKmQgPSBOVUxMOworCQkKKwkJCWlmICghKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19OT19DT05TVFRJTUUpKQorCQkJCXsKKwkJCQlkID0gJmxvY2FsX2Q7CisJCQkJQk5fd2l0aF9mbGFncyhkLCByc2EtPmQsIEJOX0ZMR19DT05TVFRJTUUpOworCQkJCX0KKwkJCWVsc2UKKwkJCQlkID0gcnNhLT5kOworCQkJaWYgKCFyc2EtPm1ldGgtPmJuX21vZF9leHAocjAsSSxkLHJzYS0+bixjdHgsCisJCQkJCQkgICByc2EtPl9tZXRob2RfbW9kX24pKSBnb3RvIGVycjsKKwkJCX0KKwkJfQorCXJldD0xOworZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgUlNBX2VheV9pbml0KFJTQSAqcnNhKQorCXsKKwlyc2EtPmZsYWdzfD1SU0FfRkxBR19DQUNIRV9QVUJMSUN8UlNBX0ZMQUdfQ0FDSEVfUFJJVkFURTsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IFJTQV9lYXlfZmluaXNoKFJTQSAqcnNhKQorCXsKKwlpZiAocnNhLT5fbWV0aG9kX21vZF9uICE9IE5VTEwpCisJCUJOX01PTlRfQ1RYX2ZyZWUocnNhLT5fbWV0aG9kX21vZF9uKTsKKwlpZiAocnNhLT5fbWV0aG9kX21vZF9wICE9IE5VTEwpCisJCUJOX01PTlRfQ1RYX2ZyZWUocnNhLT5fbWV0aG9kX21vZF9wKTsKKwlpZiAocnNhLT5fbWV0aG9kX21vZF9xICE9IE5VTEwpCisJCUJOX01PTlRfQ1RYX2ZyZWUocnNhLT5fbWV0aG9kX21vZF9xKTsKKwlyZXR1cm4oMSk7CisJfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfZXJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5ZjExMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2Vyci5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiBjcnlwdG8vcnNhL3JzYV9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA4IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfUlNBLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfUlNBLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFJTQV9zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKFJTQV9GX0NIRUNLX1BBRERJTkdfTUQpLAkiQ0hFQ0tfUEFERElOR19NRCJ9LAore0VSUl9GVU5DKFJTQV9GX0RPX1JTQV9QUklOVCksCSJET19SU0FfUFJJTlQifSwKK3tFUlJfRlVOQyhSU0FfRl9JTlRfUlNBX1ZFUklGWSksCSJJTlRfUlNBX1ZFUklGWSJ9LAore0VSUl9GVU5DKFJTQV9GX01FTU9SWV9MT0NLKSwJIk1FTU9SWV9MT0NLIn0sCit7RVJSX0ZVTkMoUlNBX0ZfT0xEX1JTQV9QUklWX0RFQ09ERSksCSJPTERfUlNBX1BSSVZfREVDT0RFIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUEtFWV9SU0FfQ1RSTCksCSJQS0VZX1JTQV9DVFJMIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUEtFWV9SU0FfQ1RSTF9TVFIpLAkiUEtFWV9SU0FfQ1RSTF9TVFIifSwKK3tFUlJfRlVOQyhSU0FfRl9QS0VZX1JTQV9TSUdOKSwJIlBLRVlfUlNBX1NJR04ifSwKK3tFUlJfRlVOQyhSU0FfRl9QS0VZX1JTQV9WRVJJRllSRUNPVkVSKSwJIlBLRVlfUlNBX1ZFUklGWVJFQ09WRVIifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfQlVJTFRJTl9LRVlHRU4pLAkiUlNBX0JVSUxUSU5fS0VZR0VOIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX0NIRUNLX0tFWSksCSJSU0FfY2hlY2tfa2V5In0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX0VBWV9QUklWQVRFX0RFQ1JZUFQpLAkiUlNBX0VBWV9QUklWQVRFX0RFQ1JZUFQifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfRUFZX1BSSVZBVEVfRU5DUllQVCksCSJSU0FfRUFZX1BSSVZBVEVfRU5DUllQVCJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9FQVlfUFVCTElDX0RFQ1JZUFQpLAkiUlNBX0VBWV9QVUJMSUNfREVDUllQVCJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9FQVlfUFVCTElDX0VOQ1JZUFQpLAkiUlNBX0VBWV9QVUJMSUNfRU5DUllQVCJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9HRU5FUkFURV9LRVkpLAkiUlNBX2dlbmVyYXRlX2tleSJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9NRU1PUllfTE9DSyksCSJSU0FfbWVtb3J5X2xvY2sifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfTkVXX01FVEhPRCksCSJSU0FfbmV3X21ldGhvZCJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9OVUxMKSwJIlJTQV9OVUxMIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX05VTExfTU9EX0VYUCksCSJSU0FfTlVMTF9NT0RfRVhQIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX05VTExfUFJJVkFURV9ERUNSWVBUKSwJIlJTQV9OVUxMX1BSSVZBVEVfREVDUllQVCJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9OVUxMX1BSSVZBVEVfRU5DUllQVCksCSJSU0FfTlVMTF9QUklWQVRFX0VOQ1JZUFQifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfTlVMTF9QVUJMSUNfREVDUllQVCksCSJSU0FfTlVMTF9QVUJMSUNfREVDUllQVCJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9OVUxMX1BVQkxJQ19FTkNSWVBUKSwJIlJTQV9OVUxMX1BVQkxJQ19FTkNSWVBUIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1BBRERJTkdfQUREX05PTkUpLAkiUlNBX3BhZGRpbmdfYWRkX25vbmUifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfT0FFUCksCSJSU0FfcGFkZGluZ19hZGRfUEtDUzFfT0FFUCJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9QQURESU5HX0FERF9QS0NTMV9QU1MpLAkiUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTUyJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9QQURESU5HX0FERF9QS0NTMV9UWVBFXzEpLAkiUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMSJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9QQURESU5HX0FERF9QS0NTMV9UWVBFXzIpLAkiUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMiJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9QQURESU5HX0FERF9TU0xWMjMpLAkiUlNBX3BhZGRpbmdfYWRkX1NTTHYyMyJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9QQURESU5HX0FERF9YOTMxKSwJIlJTQV9wYWRkaW5nX2FkZF9YOTMxIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfTk9ORSksCSJSU0FfcGFkZGluZ19jaGVja19ub25lIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfUEtDUzFfT0FFUCksCSJSU0FfcGFkZGluZ19jaGVja19QS0NTMV9PQUVQIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfUEtDUzFfVFlQRV8xKSwJIlJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMSJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX1RZUEVfMiksCSJSU0FfcGFkZGluZ19jaGVja19QS0NTMV90eXBlXzIifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfUEFERElOR19DSEVDS19TU0xWMjMpLAkiUlNBX3BhZGRpbmdfY2hlY2tfU1NMdjIzIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfWDkzMSksCSJSU0FfcGFkZGluZ19jaGVja19YOTMxIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1BSSU5UKSwJIlJTQV9wcmludCJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9QUklOVF9GUCksCSJSU0FfcHJpbnRfZnAifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfUFJJVl9ERUNPREUpLAkiUlNBX1BSSVZfREVDT0RFIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1BSSVZfRU5DT0RFKSwJIlJTQV9QUklWX0VOQ09ERSJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9QVUJfREVDT0RFKSwJIlJTQV9QVUJfREVDT0RFIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1NFVFVQX0JMSU5ESU5HKSwJIlJTQV9zZXR1cF9ibGluZGluZyJ9LAore0VSUl9GVU5DKFJTQV9GX1JTQV9TSUdOKSwJIlJTQV9zaWduIn0sCit7RVJSX0ZVTkMoUlNBX0ZfUlNBX1NJR05fQVNOMV9PQ1RFVF9TVFJJTkcpLAkiUlNBX3NpZ25fQVNOMV9PQ1RFVF9TVFJJTkcifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfVkVSSUZZKSwJIlJTQV92ZXJpZnkifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfVkVSSUZZX0FTTjFfT0NURVRfU1RSSU5HKSwJIlJTQV92ZXJpZnlfQVNOMV9PQ1RFVF9TVFJJTkcifSwKK3tFUlJfRlVOQyhSU0FfRl9SU0FfVkVSSUZZX1BLQ1MxX1BTUyksCSJSU0FfdmVyaWZ5X1BLQ1MxX1BTUyJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFJTQV9zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKFJTQV9SX0FMR09SSVRITV9NSVNNQVRDSCkgICAgLCJhbGdvcml0aG0gbWlzbWF0Y2gifSwKK3tFUlJfUkVBU09OKFJTQV9SX0JBRF9FX1ZBTFVFKSAgICAgICAgICAgLCJiYWQgZSB2YWx1ZSJ9LAore0VSUl9SRUFTT04oUlNBX1JfQkFEX0ZJWEVEX0hFQURFUl9ERUNSWVBUKSwiYmFkIGZpeGVkIGhlYWRlciBkZWNyeXB0In0sCit7RVJSX1JFQVNPTihSU0FfUl9CQURfUEFEX0JZVEVfQ09VTlQpICAgICwiYmFkIHBhZCBieXRlIGNvdW50In0sCit7RVJSX1JFQVNPTihSU0FfUl9CQURfU0lHTkFUVVJFKSAgICAgICAgICwiYmFkIHNpZ25hdHVyZSJ9LAore0VSUl9SRUFTT04oUlNBX1JfQkxPQ0tfVFlQRV9JU19OT1RfMDEpICAsImJsb2NrIHR5cGUgaXMgbm90IDAxIn0sCit7RVJSX1JFQVNPTihSU0FfUl9CTE9DS19UWVBFX0lTX05PVF8wMikgICwiYmxvY2sgdHlwZSBpcyBub3QgMDIifSwKK3tFUlJfUkVBU09OKFJTQV9SX0RBVEFfR1JFQVRFUl9USEFOX01PRF9MRU4pLCJkYXRhIGdyZWF0ZXIgdGhhbiBtb2QgbGVuIn0sCit7RVJSX1JFQVNPTihSU0FfUl9EQVRBX1RPT19MQVJHRSkgICAgICAgICwiZGF0YSB0b28gbGFyZ2UifSwKK3tFUlJfUkVBU09OKFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSksImRhdGEgdG9vIGxhcmdlIGZvciBrZXkgc2l6ZSJ9LAore0VSUl9SRUFTT04oUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMpLCJkYXRhIHRvbyBsYXJnZSBmb3IgbW9kdWx1cyJ9LAore0VSUl9SRUFTT04oUlNBX1JfREFUQV9UT09fU01BTEwpICAgICAgICAsImRhdGEgdG9vIHNtYWxsIn0sCit7RVJSX1JFQVNPTihSU0FfUl9EQVRBX1RPT19TTUFMTF9GT1JfS0VZX1NJWkUpLCJkYXRhIHRvbyBzbWFsbCBmb3Iga2V5IHNpemUifSwKK3tFUlJfUkVBU09OKFJTQV9SX0RJR0VTVF9UT09fQklHX0ZPUl9SU0FfS0VZKSwiZGlnZXN0IHRvbyBiaWcgZm9yIHJzYSBrZXkifSwKK3tFUlJfUkVBU09OKFJTQV9SX0RNUDFfTk9UX0NPTkdSVUVOVF9UT19EKSwiZG1wMSBub3QgY29uZ3J1ZW50IHRvIGQifSwKK3tFUlJfUkVBU09OKFJTQV9SX0RNUTFfTk9UX0NPTkdSVUVOVF9UT19EKSwiZG1xMSBub3QgY29uZ3J1ZW50IHRvIGQifSwKK3tFUlJfUkVBU09OKFJTQV9SX0RfRV9OT1RfQ09OR1JVRU5UX1RPXzEpLCJkIGUgbm90IGNvbmdydWVudCB0byAxIn0sCit7RVJSX1JFQVNPTihSU0FfUl9GSVJTVF9PQ1RFVF9JTlZBTElEKSAgICwiZmlyc3Qgb2N0ZXQgaW52YWxpZCJ9LAore0VSUl9SRUFTT04oUlNBX1JfSUxMRUdBTF9PUl9VTlNVUFBPUlRFRF9QQURESU5HX01PREUpLCJpbGxlZ2FsIG9yIHVuc3VwcG9ydGVkIHBhZGRpbmcgbW9kZSJ9LAore0VSUl9SRUFTT04oUlNBX1JfSU5WQUxJRF9ESUdFU1RfTEVOR1RIKSAsImludmFsaWQgZGlnZXN0IGxlbmd0aCJ9LAore0VSUl9SRUFTT04oUlNBX1JfSU5WQUxJRF9IRUFERVIpICAgICAgICAsImludmFsaWQgaGVhZGVyIn0sCit7RVJSX1JFQVNPTihSU0FfUl9JTlZBTElEX0tFWUJJVFMpICAgICAgICwiaW52YWxpZCBrZXliaXRzIn0sCit7RVJSX1JFQVNPTihSU0FfUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIKSwiaW52YWxpZCBtZXNzYWdlIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oUlNBX1JfSU5WQUxJRF9QQURESU5HKSAgICAgICAsImludmFsaWQgcGFkZGluZyJ9LAore0VSUl9SRUFTT04oUlNBX1JfSU5WQUxJRF9QQURESU5HX01PREUpICAsImludmFsaWQgcGFkZGluZyBtb2RlIn0sCit7RVJSX1JFQVNPTihSU0FfUl9JTlZBTElEX1BTU19TQUxUTEVOKSAgICwiaW52YWxpZCBwc3Mgc2FsdGxlbiJ9LAore0VSUl9SRUFTT04oUlNBX1JfSU5WQUxJRF9UUkFJTEVSKSAgICAgICAsImludmFsaWQgdHJhaWxlciJ9LAore0VSUl9SRUFTT04oUlNBX1JfSU5WQUxJRF9YOTMxX0RJR0VTVCkgICAsImludmFsaWQgeDkzMSBkaWdlc3QifSwKK3tFUlJfUkVBU09OKFJTQV9SX0lRTVBfTk9UX0lOVkVSU0VfT0ZfUSkgLCJpcW1wIG5vdCBpbnZlcnNlIG9mIHEifSwKK3tFUlJfUkVBU09OKFJTQV9SX0tFWV9TSVpFX1RPT19TTUFMTCkgICAgLCJrZXkgc2l6ZSB0b28gc21hbGwifSwKK3tFUlJfUkVBU09OKFJTQV9SX0xBU1RfT0NURVRfSU5WQUxJRCkgICAgLCJsYXN0IG9jdGV0IGludmFsaWQifSwKK3tFUlJfUkVBU09OKFJTQV9SX01PRFVMVVNfVE9PX0xBUkdFKSAgICAgLCJtb2R1bHVzIHRvbyBsYXJnZSJ9LAore0VSUl9SRUFTT04oUlNBX1JfTk9fUFVCTElDX0VYUE9ORU5UKSAgICAsIm5vIHB1YmxpYyBleHBvbmVudCJ9LAore0VSUl9SRUFTT04oUlNBX1JfTlVMTF9CRUZPUkVfQkxPQ0tfTUlTU0lORyksIm51bGwgYmVmb3JlIGJsb2NrIG1pc3NpbmcifSwKK3tFUlJfUkVBU09OKFJTQV9SX05fRE9FU19OT1RfRVFVQUxfUF9RKSAgLCJuIGRvZXMgbm90IGVxdWFsIHAgcSJ9LAore0VSUl9SRUFTT04oUlNBX1JfT0FFUF9ERUNPRElOR19FUlJPUikgICAsIm9hZXAgZGVjb2RpbmcgZXJyb3IifSwKK3tFUlJfUkVBU09OKFJTQV9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpLCJvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBrZXl0eXBlIn0sCit7RVJSX1JFQVNPTihSU0FfUl9QQURESU5HX0NIRUNLX0ZBSUxFRCkgICwicGFkZGluZyBjaGVjayBmYWlsZWQifSwKK3tFUlJfUkVBU09OKFJTQV9SX1BfTk9UX1BSSU1FKSAgICAgICAgICAgLCJwIG5vdCBwcmltZSJ9LAore0VSUl9SRUFTT04oUlNBX1JfUV9OT1RfUFJJTUUpICAgICAgICAgICAsInEgbm90IHByaW1lIn0sCit7RVJSX1JFQVNPTihSU0FfUl9SU0FfT1BFUkFUSU9OU19OT1RfU1VQUE9SVEVEKSwicnNhIG9wZXJhdGlvbnMgbm90IHN1cHBvcnRlZCJ9LAore0VSUl9SRUFTT04oUlNBX1JfU0xFTl9DSEVDS19GQUlMRUQpICAgICAsInNhbHQgbGVuZ3RoIGNoZWNrIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oUlNBX1JfU0xFTl9SRUNPVkVSWV9GQUlMRUQpICAsInNhbHQgbGVuZ3RoIHJlY292ZXJ5IGZhaWxlZCJ9LAore0VSUl9SRUFTT04oUlNBX1JfU1NMVjNfUk9MTEJBQ0tfQVRUQUNLKSAsInNzbHYzIHJvbGxiYWNrIGF0dGFjayJ9LAore0VSUl9SRUFTT04oUlNBX1JfVEhFX0FTTjFfT0JKRUNUX0lERU5USUZJRVJfSVNfTk9UX0tOT1dOX0ZPUl9USElTX01EKSwidGhlIGFzbjEgb2JqZWN0IGlkZW50aWZpZXIgaXMgbm90IGtub3duIGZvciB0aGlzIG1kIn0sCit7RVJSX1JFQVNPTihSU0FfUl9VTktOT1dOX0FMR09SSVRITV9UWVBFKSwidW5rbm93biBhbGdvcml0aG0gdHlwZSJ9LAore0VSUl9SRUFTT04oUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpICAsInVua25vd24gcGFkZGluZyB0eXBlIn0sCit7RVJSX1JFQVNPTihSU0FfUl9WQUxVRV9NSVNTSU5HKSAgICAgICAgICwidmFsdWUgbWlzc2luZyJ9LAore0VSUl9SRUFTT04oUlNBX1JfV1JPTkdfU0lHTkFUVVJFX0xFTkdUSCksIndyb25nIHNpZ25hdHVyZSBsZW5ndGgifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfUlNBX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKFJTQV9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxSU0Ffc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxSU0Ffc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9nZW4uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2dlbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2N2Y3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9nZW4uYwpAQCAtMCwwICsxLDIxOSBAQAorLyogY3J5cHRvL3JzYS9yc2FfZ2VuLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworCisvKiBOQjogdGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiAidXBncmFkZWQiLCB0aGUgZGVwcmVjYXRlZCB2ZXJzaW9ucyAod2hpY2ggYXJlCisgKiBjb21wYXRpYmlsaXR5IHdyYXBwZXJzIHVzaW5nIHRoZXNlIGZ1bmN0aW9ucykgYXJlIGluIHJzYV9kZXByLmMuCisgKiAtIEdlb2ZmCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisKK3N0YXRpYyBpbnQgcnNhX2J1aWx0aW5fa2V5Z2VuKFJTQSAqcnNhLCBpbnQgYml0cywgQklHTlVNICplX3ZhbHVlLCBCTl9HRU5DQiAqY2IpOworCisvKiBOQjogdGhpcyB3cmFwcGVyIHdvdWxkIG5vcm1hbGx5IGJlIHBsYWNlZCBpbiByc2FfbGliLmMgYW5kIHRoZSBzdGF0aWMKKyAqIGltcGxlbWVudGF0aW9uIHdvdWxkIHByb2JhYmx5IGJlIGluIHJzYV9lYXkuYy4gTm9uZXRoZWxlc3MsIGlzIGtlcHQgaGVyZSBzbworICogdGhhdCB3ZSBkb24ndCBpbnRyb2R1Y2UgYSBuZXcgbGlua2VyIGRlcGVuZGVuY3kuIEVnLiBhbnkgYXBwbGljYXRpb24gdGhhdAorICogd2Fzbid0IHByZXZpb3VzbHkgbGlua2luZyBvYmplY3QgY29kZSByZWxhdGVkIHRvIGtleS1nZW5lcmF0aW9uIHdvbid0IGhhdmUgdG8KKyAqIG5vdyBqdXN0IGJlY2F1c2Uga2V5LWdlbmVyYXRpb24gaXMgcGFydCBvZiBSU0FfTUVUSE9ELiAqLworaW50IFJTQV9nZW5lcmF0ZV9rZXlfZXgoUlNBICpyc2EsIGludCBiaXRzLCBCSUdOVU0gKmVfdmFsdWUsIEJOX0dFTkNCICpjYikKKwl7CisJaWYocnNhLT5tZXRoLT5yc2Ffa2V5Z2VuKQorCQlyZXR1cm4gcnNhLT5tZXRoLT5yc2Ffa2V5Z2VuKHJzYSwgYml0cywgZV92YWx1ZSwgY2IpOworCXJldHVybiByc2FfYnVpbHRpbl9rZXlnZW4ocnNhLCBiaXRzLCBlX3ZhbHVlLCBjYik7CisJfQorCitzdGF0aWMgaW50IHJzYV9idWlsdGluX2tleWdlbihSU0EgKnJzYSwgaW50IGJpdHMsIEJJR05VTSAqZV92YWx1ZSwgQk5fR0VOQ0IgKmNiKQorCXsKKwlCSUdOVU0gKnIwPU5VTEwsKnIxPU5VTEwsKnIyPU5VTEwsKnIzPU5VTEwsKnRtcDsKKwlCSUdOVU0gbG9jYWxfcjAsbG9jYWxfZCxsb2NhbF9wOworCUJJR05VTSAqcHIwLCpkLCpwOworCWludCBiaXRzcCxiaXRzcSxvaz0gLTEsbj0wOworCUJOX0NUWCAqY3R4PU5VTEw7CisKKwljdHg9Qk5fQ1RYX25ldygpOworCWlmIChjdHggPT0gTlVMTCkgZ290byBlcnI7CisJQk5fQ1RYX3N0YXJ0KGN0eCk7CisJcjAgPSBCTl9DVFhfZ2V0KGN0eCk7CisJcjEgPSBCTl9DVFhfZ2V0KGN0eCk7CisJcjIgPSBCTl9DVFhfZ2V0KGN0eCk7CisJcjMgPSBCTl9DVFhfZ2V0KGN0eCk7CisJaWYgKHIzID09IE5VTEwpIGdvdG8gZXJyOworCisJYml0c3A9KGJpdHMrMSkvMjsKKwliaXRzcT1iaXRzLWJpdHNwOworCisJLyogV2UgbmVlZCB0aGUgUlNBIGNvbXBvbmVudHMgbm9uLU5VTEwgKi8KKwlpZighcnNhLT5uICYmICgocnNhLT5uPUJOX25ldygpKSA9PSBOVUxMKSkgZ290byBlcnI7CisJaWYoIXJzYS0+ZCAmJiAoKHJzYS0+ZD1CTl9uZXcoKSkgPT0gTlVMTCkpIGdvdG8gZXJyOworCWlmKCFyc2EtPmUgJiYgKChyc2EtPmU9Qk5fbmV3KCkpID09IE5VTEwpKSBnb3RvIGVycjsKKwlpZighcnNhLT5wICYmICgocnNhLT5wPUJOX25ldygpKSA9PSBOVUxMKSkgZ290byBlcnI7CisJaWYoIXJzYS0+cSAmJiAoKHJzYS0+cT1CTl9uZXcoKSkgPT0gTlVMTCkpIGdvdG8gZXJyOworCWlmKCFyc2EtPmRtcDEgJiYgKChyc2EtPmRtcDE9Qk5fbmV3KCkpID09IE5VTEwpKSBnb3RvIGVycjsKKwlpZighcnNhLT5kbXExICYmICgocnNhLT5kbXExPUJOX25ldygpKSA9PSBOVUxMKSkgZ290byBlcnI7CisJaWYoIXJzYS0+aXFtcCAmJiAoKHJzYS0+aXFtcD1CTl9uZXcoKSkgPT0gTlVMTCkpIGdvdG8gZXJyOworCisJQk5fY29weShyc2EtPmUsIGVfdmFsdWUpOworCisJLyogZ2VuZXJhdGUgcCBhbmQgcSAqLworCWZvciAoOzspCisJCXsKKwkJaWYoIUJOX2dlbmVyYXRlX3ByaW1lX2V4KHJzYS0+cCwgYml0c3AsIDAsIE5VTEwsIE5VTEwsIGNiKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoIUJOX3N1YihyMixyc2EtPnAsQk5fdmFsdWVfb25lKCkpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9nY2QocjEscjIscnNhLT5lLGN0eCkpIGdvdG8gZXJyOworCQlpZiAoQk5faXNfb25lKHIxKSkgYnJlYWs7CisJCWlmKCFCTl9HRU5DQl9jYWxsKGNiLCAyLCBuKyspKQorCQkJZ290byBlcnI7CisJCX0KKwlpZighQk5fR0VOQ0JfY2FsbChjYiwgMywgMCkpCisJCWdvdG8gZXJyOworCWZvciAoOzspCisJCXsKKwkJLyogV2hlbiBnZW5lcmF0aW5nIHJpZGljdWxvdXNseSBzbWFsbCBrZXlzLCB3ZSBjYW4gZ2V0IHN0dWNrCisJCSAqIGNvbnRpbnVhbGx5IHJlZ2VuZXJhdGluZyB0aGUgc2FtZSBwcmltZSB2YWx1ZXMuIENoZWNrIGZvcgorCQkgKiB0aGlzIGFuZCBiYWlsIGlmIGl0IGhhcHBlbnMgMyB0aW1lcy4gKi8KKwkJdW5zaWduZWQgaW50IGRlZ2VuZXJhdGUgPSAwOworCQlkbworCQkJeworCQkJaWYoIUJOX2dlbmVyYXRlX3ByaW1lX2V4KHJzYS0+cSwgYml0c3EsIDAsIE5VTEwsIE5VTEwsIGNiKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0gd2hpbGUoKEJOX2NtcChyc2EtPnAsIHJzYS0+cSkgPT0gMCkgJiYgKCsrZGVnZW5lcmF0ZSA8IDMpKTsKKwkJaWYoZGVnZW5lcmF0ZSA9PSAzKQorCQkJeworCQkJb2sgPSAwOyAvKiB3ZSBzZXQgb3VyIG93biBlcnIgKi8KKwkJCVJTQWVycihSU0FfRl9SU0FfQlVJTFRJTl9LRVlHRU4sUlNBX1JfS0VZX1NJWkVfVE9PX1NNQUxMKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoIUJOX3N1YihyMixyc2EtPnEsQk5fdmFsdWVfb25lKCkpKSBnb3RvIGVycjsKKwkJaWYgKCFCTl9nY2QocjEscjIscnNhLT5lLGN0eCkpIGdvdG8gZXJyOworCQlpZiAoQk5faXNfb25lKHIxKSkKKwkJCWJyZWFrOworCQlpZighQk5fR0VOQ0JfY2FsbChjYiwgMiwgbisrKSkKKwkJCWdvdG8gZXJyOworCQl9CisJaWYoIUJOX0dFTkNCX2NhbGwoY2IsIDMsIDEpKQorCQlnb3RvIGVycjsKKwlpZiAoQk5fY21wKHJzYS0+cCxyc2EtPnEpIDwgMCkKKwkJeworCQl0bXA9cnNhLT5wOworCQlyc2EtPnA9cnNhLT5xOworCQlyc2EtPnE9dG1wOworCQl9CisKKwkvKiBjYWxjdWxhdGUgbiAqLworCWlmICghQk5fbXVsKHJzYS0+bixyc2EtPnAscnNhLT5xLGN0eCkpIGdvdG8gZXJyOworCisJLyogY2FsY3VsYXRlIGQgKi8KKwlpZiAoIUJOX3N1YihyMSxyc2EtPnAsQk5fdmFsdWVfb25lKCkpKSBnb3RvIGVycjsJLyogcC0xICovCisJaWYgKCFCTl9zdWIocjIscnNhLT5xLEJOX3ZhbHVlX29uZSgpKSkgZ290byBlcnI7CS8qIHEtMSAqLworCWlmICghQk5fbXVsKHIwLHIxLHIyLGN0eCkpIGdvdG8gZXJyOwkvKiAocC0xKShxLTEpICovCisJaWYgKCEocnNhLT5mbGFncyAmIFJTQV9GTEFHX05PX0NPTlNUVElNRSkpCisJCXsKKwkJICBwcjAgPSAmbG9jYWxfcjA7CisJCSAgQk5fd2l0aF9mbGFncyhwcjAsIHIwLCBCTl9GTEdfQ09OU1RUSU1FKTsKKwkJfQorCWVsc2UKKwkgIHByMCA9IHIwOworCWlmICghQk5fbW9kX2ludmVyc2UocnNhLT5kLHJzYS0+ZSxwcjAsY3R4KSkgZ290byBlcnI7CS8qIGQgKi8KKworCS8qIHNldCB1cCBkIGZvciBjb3JyZWN0IEJOX0ZMR19DT05TVFRJTUUgZmxhZyAqLworCWlmICghKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19OT19DT05TVFRJTUUpKQorCQl7CisJCWQgPSAmbG9jYWxfZDsKKwkJQk5fd2l0aF9mbGFncyhkLCByc2EtPmQsIEJOX0ZMR19DT05TVFRJTUUpOworCQl9CisJZWxzZQorCQlkID0gcnNhLT5kOworCisJLyogY2FsY3VsYXRlIGQgbW9kIChwLTEpICovCisJaWYgKCFCTl9tb2QocnNhLT5kbXAxLGQscjEsY3R4KSkgZ290byBlcnI7CisKKwkvKiBjYWxjdWxhdGUgZCBtb2QgKHEtMSkgKi8KKwlpZiAoIUJOX21vZChyc2EtPmRtcTEsZCxyMixjdHgpKSBnb3RvIGVycjsKKworCS8qIGNhbGN1bGF0ZSBpbnZlcnNlIG9mIHEgbW9kIHAgKi8KKwlpZiAoIShyc2EtPmZsYWdzICYgUlNBX0ZMQUdfTk9fQ09OU1RUSU1FKSkKKwkJeworCQlwID0gJmxvY2FsX3A7CisJCUJOX3dpdGhfZmxhZ3MocCwgcnNhLT5wLCBCTl9GTEdfQ09OU1RUSU1FKTsKKwkJfQorCWVsc2UKKwkJcCA9IHJzYS0+cDsKKwlpZiAoIUJOX21vZF9pbnZlcnNlKHJzYS0+aXFtcCxyc2EtPnEscCxjdHgpKSBnb3RvIGVycjsKKworCW9rPTE7CitlcnI6CisJaWYgKG9rID09IC0xKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfQlVJTFRJTl9LRVlHRU4sRVJSX0xJQl9CTik7CisJCW9rPTA7CisJCX0KKwlpZiAoY3R4ICE9IE5VTEwpCisJCXsKKwkJQk5fQ1RYX2VuZChjdHgpOworCQlCTl9DVFhfZnJlZShjdHgpOworCQl9CisKKwlyZXR1cm4gb2s7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDUwODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9saWIuYwpAQCAtMCwwICsxLDQ4MyBAQAorLyogY3J5cHRvL3JzYS9yc2FfbGliLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKyNpbmNsdWRlIDxvcGVuc3NsL2VuZ2luZS5oPgorI2VuZGlmCisKK2NvbnN0IGNoYXIgUlNBX3ZlcnNpb25bXT0iUlNBIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKK3N0YXRpYyBjb25zdCBSU0FfTUVUSE9EICpkZWZhdWx0X1JTQV9tZXRoPU5VTEw7CisKK1JTQSAqUlNBX25ldyh2b2lkKQorCXsKKwlSU0EgKnI9UlNBX25ld19tZXRob2QoTlVMTCk7CisKKwlyZXR1cm4gcjsKKwl9CisKK3ZvaWQgUlNBX3NldF9kZWZhdWx0X21ldGhvZChjb25zdCBSU0FfTUVUSE9EICptZXRoKQorCXsKKwlkZWZhdWx0X1JTQV9tZXRoID0gbWV0aDsKKwl9CisKK2NvbnN0IFJTQV9NRVRIT0QgKlJTQV9nZXRfZGVmYXVsdF9tZXRob2Qodm9pZCkKKwl7CisJaWYgKGRlZmF1bHRfUlNBX21ldGggPT0gTlVMTCkKKwkJeworI2lmZGVmIFJTQV9OVUxMCisJCWRlZmF1bHRfUlNBX21ldGg9UlNBX251bGxfbWV0aG9kKCk7CisjZWxzZQorI2lmIDAgLyogd2FzOiAjaWZkZWYgUlNBcmVmICovCisJCWRlZmF1bHRfUlNBX21ldGg9UlNBX1BLQ1MxX1JTQXJlZigpOworI2Vsc2UKKwkJZGVmYXVsdF9SU0FfbWV0aD1SU0FfUEtDUzFfU1NMZWF5KCk7CisjZW5kaWYKKyNlbmRpZgorCQl9CisKKwlyZXR1cm4gZGVmYXVsdF9SU0FfbWV0aDsKKwl9CisKK2NvbnN0IFJTQV9NRVRIT0QgKlJTQV9nZXRfbWV0aG9kKGNvbnN0IFJTQSAqcnNhKQorCXsKKwlyZXR1cm4gcnNhLT5tZXRoOworCX0KKworaW50IFJTQV9zZXRfbWV0aG9kKFJTQSAqcnNhLCBjb25zdCBSU0FfTUVUSE9EICptZXRoKQorCXsKKwkvKiBOQjogVGhlIGNhbGxlciBpcyBzcGVjaWZpY2FsbHkgc2V0dGluZyBhIG1ldGhvZCwgc28gaXQncyBub3QgdXAgdG8gdXMKKwkgKiB0byBkZWFsIHdpdGggd2hpY2ggRU5HSU5FIGl0IGNvbWVzIGZyb20uICovCisJY29uc3QgUlNBX01FVEhPRCAqbXRtcDsKKwltdG1wID0gcnNhLT5tZXRoOworCWlmIChtdG1wLT5maW5pc2gpIG10bXAtPmZpbmlzaChyc2EpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmIChyc2EtPmVuZ2luZSkKKwkJeworCQlFTkdJTkVfZmluaXNoKHJzYS0+ZW5naW5lKTsKKwkJcnNhLT5lbmdpbmUgPSBOVUxMOworCQl9CisjZW5kaWYKKwlyc2EtPm1ldGggPSBtZXRoOworCWlmIChtZXRoLT5pbml0KSBtZXRoLT5pbml0KHJzYSk7CisJcmV0dXJuIDE7CisJfQorCitSU0EgKlJTQV9uZXdfbWV0aG9kKEVOR0lORSAqZW5naW5lKQorCXsKKwlSU0EgKnJldDsKKworCXJldD0oUlNBICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFJTQSkpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX05FV19NRVRIT0QsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJcmV0LT5tZXRoID0gUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmIChlbmdpbmUpCisJCXsKKwkJaWYgKCFFTkdJTkVfaW5pdChlbmdpbmUpKQorCQkJeworCQkJUlNBZXJyKFJTQV9GX1JTQV9ORVdfTUVUSE9ELCBFUlJfUl9FTkdJTkVfTElCKTsKKwkJCU9QRU5TU0xfZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCXJldC0+ZW5naW5lID0gZW5naW5lOworCQl9CisJZWxzZQorCQlyZXQtPmVuZ2luZSA9IEVOR0lORV9nZXRfZGVmYXVsdF9SU0EoKTsKKwlpZihyZXQtPmVuZ2luZSkKKwkJeworCQlyZXQtPm1ldGggPSBFTkdJTkVfZ2V0X1JTQShyZXQtPmVuZ2luZSk7CisJCWlmKCFyZXQtPm1ldGgpCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfUlNBX05FV19NRVRIT0QsCisJCQkJRVJSX1JfRU5HSU5FX0xJQik7CisJCQlFTkdJTkVfZmluaXNoKHJldC0+ZW5naW5lKTsKKwkJCU9QRU5TU0xfZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKyNlbmRpZgorCisJcmV0LT5wYWQ9MDsKKwlyZXQtPnZlcnNpb249MDsKKwlyZXQtPm49TlVMTDsKKwlyZXQtPmU9TlVMTDsKKwlyZXQtPmQ9TlVMTDsKKwlyZXQtPnA9TlVMTDsKKwlyZXQtPnE9TlVMTDsKKwlyZXQtPmRtcDE9TlVMTDsKKwlyZXQtPmRtcTE9TlVMTDsKKwlyZXQtPmlxbXA9TlVMTDsKKwlyZXQtPnJlZmVyZW5jZXM9MTsKKwlyZXQtPl9tZXRob2RfbW9kX249TlVMTDsKKwlyZXQtPl9tZXRob2RfbW9kX3A9TlVMTDsKKwlyZXQtPl9tZXRob2RfbW9kX3E9TlVMTDsKKwlyZXQtPmJsaW5kaW5nPU5VTEw7CisJcmV0LT5tdF9ibGluZGluZz1OVUxMOworCXJldC0+YmlnbnVtX2RhdGE9TlVMTDsKKwlyZXQtPmZsYWdzPXJldC0+bWV0aC0+ZmxhZ3M7CisJaWYgKCFDUllQVE9fbmV3X2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1JTQSwgcmV0LCAmcmV0LT5leF9kYXRhKSkKKwkJeworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmIChyZXQtPmVuZ2luZSkKKwkJRU5HSU5FX2ZpbmlzaChyZXQtPmVuZ2luZSk7CisjZW5kaWYKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCisJaWYgKChyZXQtPm1ldGgtPmluaXQgIT0gTlVMTCkgJiYgIXJldC0+bWV0aC0+aW5pdChyZXQpKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJCWlmIChyZXQtPmVuZ2luZSkKKwkJCUVOR0lORV9maW5pc2gocmV0LT5lbmdpbmUpOworI2VuZGlmCisJCUNSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1JTQSwgcmV0LCAmcmV0LT5leF9kYXRhKTsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldD1OVUxMOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIFJTQV9mcmVlKFJTQSAqcikKKwl7CisJaW50IGk7CisKKwlpZiAociA9PSBOVUxMKSByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJnItPnJlZmVyZW5jZXMsLTEsQ1JZUFRPX0xPQ0tfUlNBKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlJTQSIscik7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIlJTQV9mcmVlLCBiYWQgcmVmZXJlbmNlIGNvdW50XG4iKTsKKwkJYWJvcnQoKTsKKwkJfQorI2VuZGlmCisKKwlpZiAoci0+bWV0aC0+ZmluaXNoKQorCQlyLT5tZXRoLT5maW5pc2gocik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisJaWYgKHItPmVuZ2luZSkKKwkJRU5HSU5FX2ZpbmlzaChyLT5lbmdpbmUpOworI2VuZGlmCisKKwlDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9SU0EsIHIsICZyLT5leF9kYXRhKTsKKworCWlmIChyLT5uICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+bik7CisJaWYgKHItPmUgIT0gTlVMTCkgQk5fY2xlYXJfZnJlZShyLT5lKTsKKwlpZiAoci0+ZCAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHItPmQpOworCWlmIChyLT5wICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+cCk7CisJaWYgKHItPnEgIT0gTlVMTCkgQk5fY2xlYXJfZnJlZShyLT5xKTsKKwlpZiAoci0+ZG1wMSAhPSBOVUxMKSBCTl9jbGVhcl9mcmVlKHItPmRtcDEpOworCWlmIChyLT5kbXExICE9IE5VTEwpIEJOX2NsZWFyX2ZyZWUoci0+ZG1xMSk7CisJaWYgKHItPmlxbXAgIT0gTlVMTCkgQk5fY2xlYXJfZnJlZShyLT5pcW1wKTsKKwlpZiAoci0+YmxpbmRpbmcgIT0gTlVMTCkgQk5fQkxJTkRJTkdfZnJlZShyLT5ibGluZGluZyk7CisJaWYgKHItPm10X2JsaW5kaW5nICE9IE5VTEwpIEJOX0JMSU5ESU5HX2ZyZWUoci0+bXRfYmxpbmRpbmcpOworCWlmIChyLT5iaWdudW1fZGF0YSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWVfbG9ja2VkKHItPmJpZ251bV9kYXRhKTsKKwlPUEVOU1NMX2ZyZWUocik7CisJfQorCitpbnQgUlNBX3VwX3JlZihSU0EgKnIpCisJeworCWludCBpID0gQ1JZUFRPX2FkZCgmci0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfUlNBKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlJTQSIscik7CisjZW5kaWYKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDIpCisJCXsKKwkJZnByaW50ZihzdGRlcnIsICJSU0FfdXBfcmVmLCBiYWQgcmVmZXJlbmNlIGNvdW50XG4iKTsKKwkJYWJvcnQoKTsKKwkJfQorI2VuZGlmCisJcmV0dXJuICgoaSA+IDEpID8gMSA6IDApOworCX0KKworaW50IFJTQV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKyAgICAgICAgeworCXJldHVybiBDUllQVE9fZ2V0X2V4X25ld19pbmRleChDUllQVE9fRVhfSU5ERVhfUlNBLCBhcmdsLCBhcmdwLAorCQkJCW5ld19mdW5jLCBkdXBfZnVuYywgZnJlZV9mdW5jKTsKKyAgICAgICAgfQorCitpbnQgUlNBX3NldF9leF9kYXRhKFJTQSAqciwgaW50IGlkeCwgdm9pZCAqYXJnKQorCXsKKwlyZXR1cm4oQ1JZUFRPX3NldF9leF9kYXRhKCZyLT5leF9kYXRhLGlkeCxhcmcpKTsKKwl9CisKK3ZvaWQgKlJTQV9nZXRfZXhfZGF0YShjb25zdCBSU0EgKnIsIGludCBpZHgpCisJeworCXJldHVybihDUllQVE9fZ2V0X2V4X2RhdGEoJnItPmV4X2RhdGEsaWR4KSk7CisJfQorCitpbnQgUlNBX3NpemUoY29uc3QgUlNBICpyKQorCXsKKwlyZXR1cm4oQk5fbnVtX2J5dGVzKHItPm4pKTsKKwl9CisKK2ludCBSU0FfcHVibGljX2VuY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sIHVuc2lnbmVkIGNoYXIgKnRvLAorCSAgICAgUlNBICpyc2EsIGludCBwYWRkaW5nKQorCXsKKwlyZXR1cm4ocnNhLT5tZXRoLT5yc2FfcHViX2VuYyhmbGVuLCBmcm9tLCB0bywgcnNhLCBwYWRkaW5nKSk7CisJfQorCitpbnQgUlNBX3ByaXZhdGVfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgdW5zaWduZWQgY2hhciAqdG8sCisJICAgICBSU0EgKnJzYSwgaW50IHBhZGRpbmcpCisJeworCXJldHVybihyc2EtPm1ldGgtPnJzYV9wcml2X2VuYyhmbGVuLCBmcm9tLCB0bywgcnNhLCBwYWRkaW5nKSk7CisJfQorCitpbnQgUlNBX3ByaXZhdGVfZGVjcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgdW5zaWduZWQgY2hhciAqdG8sCisJICAgICBSU0EgKnJzYSwgaW50IHBhZGRpbmcpCisJeworCXJldHVybihyc2EtPm1ldGgtPnJzYV9wcml2X2RlYyhmbGVuLCBmcm9tLCB0bywgcnNhLCBwYWRkaW5nKSk7CisJfQorCitpbnQgUlNBX3B1YmxpY19kZWNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCB1bnNpZ25lZCBjaGFyICp0bywKKwkgICAgIFJTQSAqcnNhLCBpbnQgcGFkZGluZykKKwl7CisJcmV0dXJuKHJzYS0+bWV0aC0+cnNhX3B1Yl9kZWMoZmxlbiwgZnJvbSwgdG8sIHJzYSwgcGFkZGluZykpOworCX0KKworaW50IFJTQV9mbGFncyhjb25zdCBSU0EgKnIpCisJeworCXJldHVybigociA9PSBOVUxMKT8wOnItPm1ldGgtPmZsYWdzKTsKKwl9CisKK3ZvaWQgUlNBX2JsaW5kaW5nX29mZihSU0EgKnJzYSkKKwl7CisJaWYgKHJzYS0+YmxpbmRpbmcgIT0gTlVMTCkKKwkJeworCQlCTl9CTElORElOR19mcmVlKHJzYS0+YmxpbmRpbmcpOworCQlyc2EtPmJsaW5kaW5nPU5VTEw7CisJCX0KKwlyc2EtPmZsYWdzICY9IH5SU0FfRkxBR19CTElORElORzsKKwlyc2EtPmZsYWdzIHw9IFJTQV9GTEFHX05PX0JMSU5ESU5HOworCX0KKworaW50IFJTQV9ibGluZGluZ19vbihSU0EgKnJzYSwgQk5fQ1RYICpjdHgpCisJeworCWludCByZXQ9MDsKKworCWlmIChyc2EtPmJsaW5kaW5nICE9IE5VTEwpCisJCVJTQV9ibGluZGluZ19vZmYocnNhKTsKKworCXJzYS0+YmxpbmRpbmcgPSBSU0Ffc2V0dXBfYmxpbmRpbmcocnNhLCBjdHgpOworCWlmIChyc2EtPmJsaW5kaW5nID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJcnNhLT5mbGFncyB8PSBSU0FfRkxBR19CTElORElORzsKKwlyc2EtPmZsYWdzICY9IH5SU0FfRkxBR19OT19CTElORElORzsKKwlyZXQ9MTsKK2VycjoKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBCSUdOVU0gKnJzYV9nZXRfcHVibGljX2V4cChjb25zdCBCSUdOVU0gKmQsIGNvbnN0IEJJR05VTSAqcCwKKwljb25zdCBCSUdOVU0gKnEsIEJOX0NUWCAqY3R4KQoreworCUJJR05VTSAqcmV0ID0gTlVMTCwgKnIwLCAqcjEsICpyMjsKKworCWlmIChkID09IE5VTEwgfHwgcCA9PSBOVUxMIHx8IHEgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwlyMCA9IEJOX0NUWF9nZXQoY3R4KTsKKwlyMSA9IEJOX0NUWF9nZXQoY3R4KTsKKwlyMiA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAocjIgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpZiAoIUJOX3N1YihyMSwgcCwgQk5fdmFsdWVfb25lKCkpKSBnb3RvIGVycjsKKwlpZiAoIUJOX3N1YihyMiwgcSwgQk5fdmFsdWVfb25lKCkpKSBnb3RvIGVycjsKKwlpZiAoIUJOX211bChyMCwgcjEsIHIyLCBjdHgpKSBnb3RvIGVycjsKKworCXJldCA9IEJOX21vZF9pbnZlcnNlKE5VTEwsIGQsIHIwLCBjdHgpOworZXJyOgorCUJOX0NUWF9lbmQoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCitCTl9CTElORElORyAqUlNBX3NldHVwX2JsaW5kaW5nKFJTQSAqcnNhLCBCTl9DVFggKmluX2N0eCkKK3sKKwlCSUdOVU0gbG9jYWxfbjsKKwlCSUdOVU0gKmUsKm47CisJQk5fQ1RYICpjdHg7CisJQk5fQkxJTkRJTkcgKnJldCA9IE5VTEw7CisKKwlpZiAoaW5fY3R4ID09IE5VTEwpCisJCXsKKwkJaWYgKChjdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpIHJldHVybiAwOworCQl9CisJZWxzZQorCQljdHggPSBpbl9jdHg7CisKKwlCTl9DVFhfc3RhcnQoY3R4KTsKKwllICA9IEJOX0NUWF9nZXQoY3R4KTsKKwlpZiAoZSA9PSBOVUxMKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfU0VUVVBfQkxJTkRJTkcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChyc2EtPmUgPT0gTlVMTCkKKwkJeworCQllID0gcnNhX2dldF9wdWJsaWNfZXhwKHJzYS0+ZCwgcnNhLT5wLCByc2EtPnEsIGN0eCk7CisJCWlmIChlID09IE5VTEwpCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfUlNBX1NFVFVQX0JMSU5ESU5HLCBSU0FfUl9OT19QVUJMSUNfRVhQT05FTlQpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCWUgPSByc2EtPmU7CisKKwkKKwlpZiAoKFJBTkRfc3RhdHVzKCkgPT0gMCkgJiYgcnNhLT5kICE9IE5VTEwgJiYgcnNhLT5kLT5kICE9IE5VTEwpCisJCXsKKwkJLyogaWYgUFJORyBpcyBub3QgcHJvcGVybHkgc2VlZGVkLCByZXNvcnQgdG8gc2VjcmV0CisJCSAqIGV4cG9uZW50IGFzIHVucHJlZGljdGFibGUgc2VlZCAqLworCQlSQU5EX2FkZChyc2EtPmQtPmQsIHJzYS0+ZC0+ZG1heCAqIHNpemVvZiByc2EtPmQtPmRbMF0sIDAuMCk7CisJCX0KKworCWlmICghKHJzYS0+ZmxhZ3MgJiBSU0FfRkxBR19OT19DT05TVFRJTUUpKQorCQl7CisJCS8qIFNldCBCTl9GTEdfQ09OU1RUSU1FIGZsYWcgKi8KKwkJbiA9ICZsb2NhbF9uOworCQlCTl93aXRoX2ZsYWdzKG4sIHJzYS0+biwgQk5fRkxHX0NPTlNUVElNRSk7CisJCX0KKwllbHNlCisJCW4gPSByc2EtPm47CisKKwlyZXQgPSBCTl9CTElORElOR19jcmVhdGVfcGFyYW0oTlVMTCwgZSwgbiwgY3R4LAorCQkJcnNhLT5tZXRoLT5ibl9tb2RfZXhwLCByc2EtPl9tZXRob2RfbW9kX24pOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1NFVFVQX0JMSU5ESU5HLCBFUlJfUl9CTl9MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCUNSWVBUT19USFJFQURJRF9jdXJyZW50KEJOX0JMSU5ESU5HX3RocmVhZF9pZChyZXQpKTsKK2VycjoKKwlCTl9DVFhfZW5kKGN0eCk7CisJaWYgKGluX2N0eCA9PSBOVUxMKQorCQlCTl9DVFhfZnJlZShjdHgpOworCWlmKHJzYS0+ZSA9PSBOVUxMKQorCQlCTl9mcmVlKGUpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IFJTQV9tZW1vcnlfbG9jayhSU0EgKnIpCisJeworCWludCBpLGosayxvZmY7CisJY2hhciAqcDsKKwlCSUdOVU0gKmJuLCoqdFs2XSwqYjsKKwlCTl9VTE9ORyAqdWw7CisKKwlpZiAoci0+ZCA9PSBOVUxMKSByZXR1cm4oMSk7CisJdFswXT0gJnItPmQ7CisJdFsxXT0gJnItPnA7CisJdFsyXT0gJnItPnE7CisJdFszXT0gJnItPmRtcDE7CisJdFs0XT0gJnItPmRtcTE7CisJdFs1XT0gJnItPmlxbXA7CisJaz1zaXplb2YoQklHTlVNKSo2OworCW9mZj1rL3NpemVvZihCTl9VTE9ORykrMTsKKwlqPTE7CisJZm9yIChpPTA7IGk8NjsgaSsrKQorCQlqKz0gKCp0W2ldKS0+dG9wOworCWlmICgocD1PUEVOU1NMX21hbGxvY19sb2NrZWQoKG9mZitqKSpzaXplb2YoQk5fVUxPTkcpKSkgPT0gTlVMTCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX01FTU9SWV9MT0NLLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJYm49KEJJR05VTSAqKXA7CisJdWw9KEJOX1VMT05HICopJihwW29mZl0pOworCWZvciAoaT0wOyBpPDY7IGkrKykKKwkJeworCQliPSAqKHRbaV0pOworCQkqKHRbaV0pPSAmKGJuW2ldKTsKKwkJbWVtY3B5KChjaGFyICopJihibltpXSksKGNoYXIgKiliLHNpemVvZihCSUdOVU0pKTsKKwkJYm5baV0uZmxhZ3M9Qk5fRkxHX1NUQVRJQ19EQVRBOworCQlibltpXS5kPXVsOworCQltZW1jcHkoKGNoYXIgKil1bCxiLT5kLHNpemVvZihCTl9VTE9ORykqYi0+dG9wKTsKKwkJdWwrPWItPnRvcDsKKwkJQk5fY2xlYXJfZnJlZShiKTsKKwkJfQorCQorCS8qIEkgc2hvdWxkIGZpeCB0aGlzIHNvIGl0IGNhbiBzdGlsbCBiZSBkb25lICovCisJci0+ZmxhZ3MmPSB+KFJTQV9GTEFHX0NBQ0hFX1BSSVZBVEV8UlNBX0ZMQUdfQ0FDSEVfUFVCTElDKTsKKworCXItPmJpZ251bV9kYXRhPXA7CisJcmV0dXJuKDEpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX2xvY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQyZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfbG9jbC5oCkBAIC0wLDAgKzEsNCBAQAorZXh0ZXJuIGludCBpbnRfcnNhX3ZlcmlmeShpbnQgZHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm0sIHVuc2lnbmVkIGludCBtX2xlbiwKKwkJdW5zaWduZWQgY2hhciAqcm0sIHNpemVfdCAqcHJtX2xlbiwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLCBzaXplX3Qgc2lnbGVuLAorCQlSU0EgKnJzYSk7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9ub25lLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9ub25lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmM2U2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX25vbmUuYwpAQCAtMCwwICsxLDk4IEBACisvKiBjcnlwdG8vcnNhL3JzYV9ub25lLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworaW50IFJTQV9wYWRkaW5nX2FkZF9ub25lKHVuc2lnbmVkIGNoYXIgKnRvLCBpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCBpbnQgZmxlbikKKwl7CisJaWYgKGZsZW4gPiB0bGVuKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19BRERfTk9ORSxSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworCQlyZXR1cm4oMCk7CisJCX0KKworCWlmIChmbGVuIDwgdGxlbikKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQUREX05PTkUsUlNBX1JfREFUQV9UT09fU01BTExfRk9SX0tFWV9TSVpFKTsKKwkJcmV0dXJuKDApOworCQl9CisJCisJbWVtY3B5KHRvLGZyb20sKHVuc2lnbmVkIGludClmbGVuKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfbm9uZSh1bnNpZ25lZCBjaGFyICp0bywgaW50IHRsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgaW50IGZsZW4sIGludCBudW0pCisJeworCisJaWYgKGZsZW4gPiB0bGVuKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19DSEVDS19OT05FLFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCisJbWVtc2V0KHRvLDAsdGxlbi1mbGVuKTsKKwltZW1jcHkodG8rdGxlbi1mbGVuLGZyb20sZmxlbik7CisJcmV0dXJuKHRsZW4pOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfbnVsbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfbnVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjIwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9udWxsLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qIHJzYV9udWxsLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKKy8qIFRoaXMgaXMgYSBkdW1teSBSU0EgaW1wbGVtZW50YXRpb24gdGhhdCBqdXN0IHJldHVybnMgZXJyb3JzIHdoZW4gY2FsbGVkLgorICogSXQgaXMgZGVzaWduZWQgdG8gYWxsb3cgc29tZSBSU0EgZnVuY3Rpb25zIHRvIHdvcmsgd2hpbGUgc3RvcHBpbmcgdGhvc2UKKyAqIGNvdmVyZWQgYnkgdGhlIFJTQSBwYXRlbnQuIFRoYXQgaXMgUlNBLCBlbmNyeXB0aW9uLCBkZWNyeXB0aW9uLCBzaWduaW5nCisgKiBhbmQgdmVyaWZ5IGlzIG5vdCBhbGxvd2VkIGJ1dCBSU0Ega2V5IGdlbmVyYXRpb24sIGtleSBjaGVja2luZyBhbmQgb3RoZXIKKyAqIG9wZXJhdGlvbnMgKGxpa2Ugc3RvcmluZyBSU0Ega2V5cykgYXJlIHBlcm1pdHRlZC4KKyAqLworCitzdGF0aWMgaW50IFJTQV9udWxsX3B1YmxpY19lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCQl1bnNpZ25lZCBjaGFyICp0bywgUlNBICpyc2EsaW50IHBhZGRpbmcpOworc3RhdGljIGludCBSU0FfbnVsbF9wcml2YXRlX2VuY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sCisJCXVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSxpbnQgcGFkZGluZyk7CitzdGF0aWMgaW50IFJTQV9udWxsX3B1YmxpY19kZWNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCQl1bnNpZ25lZCBjaGFyICp0bywgUlNBICpyc2EsaW50IHBhZGRpbmcpOworc3RhdGljIGludCBSU0FfbnVsbF9wcml2YXRlX2RlY3J5cHQoaW50IGZsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sCisJCXVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSxpbnQgcGFkZGluZyk7CisjaWYgMCAvKiBub3QgY3VycmVudGx5IHVzZWQgKi8KK3N0YXRpYyBpbnQgUlNBX251bGxfbW9kX2V4cChjb25zdCBCSUdOVU0gKnIwLCBjb25zdCBCSUdOVU0gKmksIFJTQSAqcnNhKTsKKyNlbmRpZgorc3RhdGljIGludCBSU0FfbnVsbF9pbml0KFJTQSAqcnNhKTsKK3N0YXRpYyBpbnQgUlNBX251bGxfZmluaXNoKFJTQSAqcnNhKTsKK3N0YXRpYyBSU0FfTUVUSE9EIHJzYV9udWxsX21ldGg9eworCSJOdWxsIFJTQSIsCisJUlNBX251bGxfcHVibGljX2VuY3J5cHQsCisJUlNBX251bGxfcHVibGljX2RlY3J5cHQsCisJUlNBX251bGxfcHJpdmF0ZV9lbmNyeXB0LAorCVJTQV9udWxsX3ByaXZhdGVfZGVjcnlwdCwKKwlOVUxMLAorCU5VTEwsCisJUlNBX251bGxfaW5pdCwKKwlSU0FfbnVsbF9maW5pc2gsCisJMCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMCisJfTsKKworY29uc3QgUlNBX01FVEhPRCAqUlNBX251bGxfbWV0aG9kKHZvaWQpCisJeworCXJldHVybigmcnNhX251bGxfbWV0aCk7CisJfQorCitzdGF0aWMgaW50IFJTQV9udWxsX3B1YmxpY19lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCSAgICAgdW5zaWduZWQgY2hhciAqdG8sIFJTQSAqcnNhLCBpbnQgcGFkZGluZykKKwl7CisJUlNBZXJyKFJTQV9GX1JTQV9OVUxMX1BVQkxJQ19FTkNSWVBULCBSU0FfUl9SU0FfT1BFUkFUSU9OU19OT1RfU1VQUE9SVEVEKTsKKwlyZXR1cm4gLTE7CisJfQorCitzdGF0aWMgaW50IFJTQV9udWxsX3ByaXZhdGVfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSwgaW50IHBhZGRpbmcpCisJeworCVJTQWVycihSU0FfRl9SU0FfTlVMTF9QUklWQVRFX0VOQ1JZUFQsIFJTQV9SX1JTQV9PUEVSQVRJT05TX05PVF9TVVBQT1JURUQpOworCXJldHVybiAtMTsKKwl9CisKK3N0YXRpYyBpbnQgUlNBX251bGxfcHJpdmF0ZV9kZWNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCSAgICAgdW5zaWduZWQgY2hhciAqdG8sIFJTQSAqcnNhLCBpbnQgcGFkZGluZykKKwl7CisJUlNBZXJyKFJTQV9GX1JTQV9OVUxMX1BSSVZBVEVfREVDUllQVCwgUlNBX1JfUlNBX09QRVJBVElPTlNfTk9UX1NVUFBPUlRFRCk7CisJcmV0dXJuIC0xOworCX0KKworc3RhdGljIGludCBSU0FfbnVsbF9wdWJsaWNfZGVjcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSwgaW50IHBhZGRpbmcpCisJeworCVJTQWVycihSU0FfRl9SU0FfTlVMTF9QVUJMSUNfREVDUllQVCwgUlNBX1JfUlNBX09QRVJBVElPTlNfTk9UX1NVUFBPUlRFRCk7CisJcmV0dXJuIC0xOworCX0KKworI2lmIDAgLyogbm90IGN1cnJlbnRseSB1c2VkICovCitzdGF0aWMgaW50IFJTQV9udWxsX21vZF9leHAoQklHTlVNICpyMCwgQklHTlVNICpJLCBSU0EgKnJzYSkKKwl7CisJLi4uZXJyKFJTQV9GX1JTQV9OVUxMX01PRF9FWFAsIFJTQV9SX1JTQV9PUEVSQVRJT05TX05PVF9TVVBQT1JURUQpOworCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworc3RhdGljIGludCBSU0FfbnVsbF9pbml0KFJTQSAqcnNhKQorCXsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IFJTQV9udWxsX2ZpbmlzaChSU0EgKnJzYSkKKwl7CisJcmV0dXJuKDEpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX29hZXAuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX29hZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM4ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2Ffb2FlcC5jCkBAIC0wLDAgKzEsMjI3IEBACisvKiBjcnlwdG8vcnNhL3JzYV9vYWVwLmMgKi8KKy8qIFdyaXR0ZW4gYnkgVWxmIE1vZWxsZXIuIFRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIgorICAgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICovCisKKy8qIEVNRS1PQUVQIGFzIGRlZmluZWQgaW4gUkZDIDI0MzcgKFBLQ1MgIzEgdjIuMCkgKi8KKworLyogU2VlIFZpY3RvciBTaG91cCwgIk9BRVAgcmVjb25zaWRlcmVkLCIgTm92LiAyMDAwLAorICogPFVSTDogaHR0cDovL3d3dy5zaG91cC5uZXQvcGFwZXJzL29hZXAucHMuWj4KKyAqIGZvciBwcm9ibGVtcyB3aXRoIHRoZSBzZWN1cml0eSBwcm9vZiBmb3IgdGhlCisgKiBvcmlnaW5hbCBPQUVQIHNjaGVtZSwgd2hpY2ggRU1FLU9BRVAgaXMgYmFzZWQgb24uCisgKiAKKyAqIEEgbmV3IHByb29mIGNhbiBiZSBmb3VuZCBpbiBFLiBGdWppc2FraSwgVC4gT2thbW90bywKKyAqIEQuIFBvaW50Y2hldmFsLCBKLiBTdGVybiwgIlJTQS1PRUFQIGlzIFN0aWxsIEFsaXZlISIsCisgKiBEZWMuIDIwMDAsIDxVUkw6IGh0dHA6Ly9lcHJpbnQuaWFjci5vcmcvMjAwMC8wNjEvPi4KKyAqIFRoZSBuZXcgcHJvb2YgaGFzIHN0cm9uZ2VyIHJlcXVpcmVtZW50cyBmb3IgdGhlCisgKiB1bmRlcmx5aW5nIHBlcm11dGF0aW9uOiAicGFydGlhbC1vbmUtd2F5bmVzcyIgaW5zdGVhZAorICogb2Ygb25lLXdheW5lc3MuICBGb3IgdGhlIFJTQSBmdW5jdGlvbiwgdGhpcyBpcworICogYW4gZXF1aXZhbGVudCBub3Rpb24uCisgKi8KKworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEEpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0hBMSkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCitzdGF0aWMgaW50IE1HRjEodW5zaWduZWQgY2hhciAqbWFzaywgbG9uZyBsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2VlZCwgbG9uZyBzZWVkbGVuKTsKKworaW50IFJTQV9wYWRkaW5nX2FkZF9QS0NTMV9PQUVQKHVuc2lnbmVkIGNoYXIgKnRvLCBpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCBpbnQgZmxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwYXJhbSwgaW50IHBsZW4pCisJeworCWludCBpLCBlbWxlbiA9IHRsZW4gLSAxOworCXVuc2lnbmVkIGNoYXIgKmRiLCAqc2VlZDsKKwl1bnNpZ25lZCBjaGFyICpkYm1hc2ssIHNlZWRtYXNrW1NIQV9ESUdFU1RfTEVOR1RIXTsKKworCWlmIChmbGVuID4gZW1sZW4gLSAyICogU0hBX0RJR0VTVF9MRU5HVEggLSAxKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfT0FFUCwKKwkJICAgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCWlmIChlbWxlbiA8IDIgKiBTSEFfRElHRVNUX0xFTkdUSCArIDEpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0FERF9QS0NTMV9PQUVQLCBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwpOworCQlyZXR1cm4gMDsKKwkJfQorCisJdG9bMF0gPSAwOworCXNlZWQgPSB0byArIDE7CisJZGIgPSB0byArIFNIQV9ESUdFU1RfTEVOR1RIICsgMTsKKworCUVWUF9EaWdlc3QoKHZvaWQgKilwYXJhbSwgcGxlbiwgZGIsIE5VTEwsIEVWUF9zaGExKCksIE5VTEwpOworCW1lbXNldChkYiArIFNIQV9ESUdFU1RfTEVOR1RILCAwLAorCQllbWxlbiAtIGZsZW4gLSAyICogU0hBX0RJR0VTVF9MRU5HVEggLSAxKTsKKwlkYltlbWxlbiAtIGZsZW4gLSBTSEFfRElHRVNUX0xFTkdUSCAtIDFdID0gMHgwMTsKKwltZW1jcHkoZGIgKyBlbWxlbiAtIGZsZW4gLSBTSEFfRElHRVNUX0xFTkdUSCwgZnJvbSwgKHVuc2lnbmVkIGludCkgZmxlbik7CisJaWYgKFJBTkRfYnl0ZXMoc2VlZCwgU0hBX0RJR0VTVF9MRU5HVEgpIDw9IDApCisJCXJldHVybiAwOworI2lmZGVmIFBLQ1NfVEVTVFZFQ1QKKwltZW1jcHkoc2VlZCwKKwkgICAiXHhhYVx4ZmRceDEyXHhmNlx4NTlceGNhXHhlNlx4MzRceDg5XHhiNFx4NzlceGU1XHgwN1x4NmRceGRlXHhjMlx4ZjBceDZjXHhiNVx4OGYiLAorCSAgIDIwKTsKKyNlbmRpZgorCisJZGJtYXNrID0gT1BFTlNTTF9tYWxsb2MoZW1sZW4gLSBTSEFfRElHRVNUX0xFTkdUSCk7CisJaWYgKGRibWFzayA9PSBOVUxMKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfT0FFUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKE1HRjEoZGJtYXNrLCBlbWxlbiAtIFNIQV9ESUdFU1RfTEVOR1RILCBzZWVkLCBTSEFfRElHRVNUX0xFTkdUSCkgPCAwKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgZW1sZW4gLSBTSEFfRElHRVNUX0xFTkdUSDsgaSsrKQorCQlkYltpXSBePSBkYm1hc2tbaV07CisKKwlpZiAoTUdGMShzZWVkbWFzaywgU0hBX0RJR0VTVF9MRU5HVEgsIGRiLCBlbWxlbiAtIFNIQV9ESUdFU1RfTEVOR1RIKSA8IDApCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBTSEFfRElHRVNUX0xFTkdUSDsgaSsrKQorCQlzZWVkW2ldIF49IHNlZWRtYXNrW2ldOworCisJT1BFTlNTTF9mcmVlKGRibWFzayk7CisJcmV0dXJuIDE7CisJfQorCitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUCh1bnNpZ25lZCBjaGFyICp0bywgaW50IHRsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgaW50IGZsZW4sIGludCBudW0sCisJY29uc3QgdW5zaWduZWQgY2hhciAqcGFyYW0sIGludCBwbGVuKQorCXsKKwlpbnQgaSwgZGJsZW4sIG1sZW4gPSAtMTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICptYXNrZWRkYjsKKwlpbnQgbHplcm87CisJdW5zaWduZWQgY2hhciAqZGIgPSBOVUxMLCBzZWVkW1NIQV9ESUdFU1RfTEVOR1RIXSwgcGhhc2hbU0hBX0RJR0VTVF9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgKnBhZGRlZF9mcm9tOworCWludCBiYWQgPSAwOworCisJaWYgKC0tbnVtIDwgMiAqIFNIQV9ESUdFU1RfTEVOR1RIICsgMSkKKwkJLyogJ251bScgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbW9kdWx1cywgaS5lLiBkb2VzIG5vdCBkZXBlbmQgb24gdGhlCisJCSAqIHBhcnRpY3VsYXIgY2lwaGVydGV4dC4gKi8KKwkJZ290byBkZWNvZGluZ19lcnI7CisKKwlsemVybyA9IG51bSAtIGZsZW47CisJaWYgKGx6ZXJvIDwgMCkKKwkJeworCQkvKiBzaWduYWxsaW5nIHRoaXMgZXJyb3IgaW1tZWRpYXRlbHkgYWZ0ZXIgZGV0ZWN0aW9uIG1pZ2h0IGFsbG93CisJCSAqIGZvciBzaWRlLWNoYW5uZWwgYXR0YWNrcyAoZS5nLiB0aW1pbmcgaWYgJ3BsZW4nIGlzIGh1Z2UKKwkJICogLS0gY2YuIEphbWVzIEguIE1hbmdlciwgIkEgQ2hvc2VuIENpcGhlcnRleHQgQXR0YWNrIG9uIFJTQSBPcHRpbWFsCisJCSAqIEFzeW1tZXRyaWMgRW5jcnlwdGlvbiBQYWRkaW5nIChPQUVQKSBbLi4uXSIsIENSWVBUTyAyMDAxKSwKKwkJICogc28gd2UgdXNlIGEgJ2JhZCcgZmxhZyAqLworCQliYWQgPSAxOworCQlsemVybyA9IDA7CisJCWZsZW4gPSBudW07IC8qIGRvbid0IG92ZXJmbG93IHRoZSBtZW1jcHkgdG8gcGFkZGVkX2Zyb20gKi8KKwkJfQorCisJZGJsZW4gPSBudW0gLSBTSEFfRElHRVNUX0xFTkdUSDsKKwlkYiA9IE9QRU5TU0xfbWFsbG9jKGRibGVuICsgbnVtKTsKKwlpZiAoZGIgPT0gTlVMTCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfUEtDUzFfT0FFUCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gLTE7CisJCX0KKworCS8qIEFsd2F5cyBkbyB0aGlzIHplcm8tcGFkZGluZyBjb3B5IChldmVuIHdoZW4gbHplcm8gPT0gMCkKKwkgKiB0byBhdm9pZCBsZWFraW5nIHRpbWluZyBpbmZvIGFib3V0IHRoZSB2YWx1ZSBvZiBsemVyby4gKi8KKwlwYWRkZWRfZnJvbSA9IGRiICsgZGJsZW47CisJbWVtc2V0KHBhZGRlZF9mcm9tLCAwLCBsemVybyk7CisJbWVtY3B5KHBhZGRlZF9mcm9tICsgbHplcm8sIGZyb20sIGZsZW4pOworCisJbWFza2VkZGIgPSBwYWRkZWRfZnJvbSArIFNIQV9ESUdFU1RfTEVOR1RIOworCisJaWYgKE1HRjEoc2VlZCwgU0hBX0RJR0VTVF9MRU5HVEgsIG1hc2tlZGRiLCBkYmxlbikpCisJCXJldHVybiAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgU0hBX0RJR0VTVF9MRU5HVEg7IGkrKykKKwkJc2VlZFtpXSBePSBwYWRkZWRfZnJvbVtpXTsKKyAgCisJaWYgKE1HRjEoZGIsIGRibGVuLCBzZWVkLCBTSEFfRElHRVNUX0xFTkdUSCkpCisJCXJldHVybiAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgZGJsZW47IGkrKykKKwkJZGJbaV0gXj0gbWFza2VkZGJbaV07CisKKwlFVlBfRGlnZXN0KCh2b2lkICopcGFyYW0sIHBsZW4sIHBoYXNoLCBOVUxMLCBFVlBfc2hhMSgpLCBOVUxMKTsKKworCWlmIChtZW1jbXAoZGIsIHBoYXNoLCBTSEFfRElHRVNUX0xFTkdUSCkgIT0gMCB8fCBiYWQpCisJCWdvdG8gZGVjb2RpbmdfZXJyOworCWVsc2UKKwkJeworCQlmb3IgKGkgPSBTSEFfRElHRVNUX0xFTkdUSDsgaSA8IGRibGVuOyBpKyspCisJCQlpZiAoZGJbaV0gIT0gMHgwMCkKKwkJCQlicmVhazsKKwkJaWYgKGkgPT0gZGJsZW4gfHwgZGJbaV0gIT0gMHgwMSkKKwkJCWdvdG8gZGVjb2RpbmdfZXJyOworCQllbHNlCisJCQl7CisJCQkvKiBldmVyeXRoaW5nIGxvb2tzIE9LICovCisKKwkJCW1sZW4gPSBkYmxlbiAtICsraTsKKwkJCWlmICh0bGVuIDwgbWxlbikKKwkJCQl7CisJCQkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX09BRVAsIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKKwkJCQltbGVuID0gLTE7CisJCQkJfQorCQkJZWxzZQorCQkJCW1lbWNweSh0bywgZGIgKyBpLCBtbGVuKTsKKwkJCX0KKwkJfQorCU9QRU5TU0xfZnJlZShkYik7CisJcmV0dXJuIG1sZW47CisKK2RlY29kaW5nX2VycjoKKwkvKiB0byBhdm9pZCBjaG9zZW4gY2lwaGVydGV4dCBhdHRhY2tzLCB0aGUgZXJyb3IgbWVzc2FnZSBzaG91bGQgbm90IHJldmVhbAorCSAqIHdoaWNoIGtpbmQgb2YgZGVjb2RpbmcgZXJyb3IgaGFwcGVuZWQgKi8KKwlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfUEtDUzFfT0FFUCwgUlNBX1JfT0FFUF9ERUNPRElOR19FUlJPUik7CisJaWYgKGRiICE9IE5VTEwpIE9QRU5TU0xfZnJlZShkYik7CisJcmV0dXJuIC0xOworCX0KKworaW50IFBLQ1MxX01HRjEodW5zaWduZWQgY2hhciAqbWFzaywgbG9uZyBsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2VlZCwgbG9uZyBzZWVkbGVuLCBjb25zdCBFVlBfTUQgKmRnc3QpCisJeworCWxvbmcgaSwgb3V0bGVuID0gMDsKKwl1bnNpZ25lZCBjaGFyIGNudFs0XTsKKwlFVlBfTURfQ1RYIGM7CisJdW5zaWduZWQgY2hhciBtZFtFVlBfTUFYX01EX1NJWkVdOworCWludCBtZGxlbjsKKworCUVWUF9NRF9DVFhfaW5pdCgmYyk7CisJbWRsZW4gPSBFVlBfTURfc2l6ZShkZ3N0KTsKKwlpZiAobWRsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisJZm9yIChpID0gMDsgb3V0bGVuIDwgbGVuOyBpKyspCisJCXsKKwkJY250WzBdID0gKHVuc2lnbmVkIGNoYXIpKChpID4+IDI0KSAmIDI1NSk7CisJCWNudFsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoaSA+PiAxNikgJiAyNTUpOworCQljbnRbMl0gPSAodW5zaWduZWQgY2hhcikoKGkgPj4gOCkpICYgMjU1OworCQljbnRbM10gPSAodW5zaWduZWQgY2hhcikoaSAmIDI1NSk7CisJCUVWUF9EaWdlc3RJbml0X2V4KCZjLGRnc3QsIE5VTEwpOworCQlFVlBfRGlnZXN0VXBkYXRlKCZjLCBzZWVkLCBzZWVkbGVuKTsKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmYywgY250LCA0KTsKKwkJaWYgKG91dGxlbiArIG1kbGVuIDw9IGxlbikKKwkJCXsKKwkJCUVWUF9EaWdlc3RGaW5hbF9leCgmYywgbWFzayArIG91dGxlbiwgTlVMTCk7CisJCQlvdXRsZW4gKz0gbWRsZW47CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCUVWUF9EaWdlc3RGaW5hbF9leCgmYywgbWQsIE5VTEwpOworCQkJbWVtY3B5KG1hc2sgKyBvdXRsZW4sIG1kLCBsZW4gLSBvdXRsZW4pOworCQkJb3V0bGVuID0gbGVuOworCQkJfQorCQl9CisJRVZQX01EX0NUWF9jbGVhbnVwKCZjKTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBpbnQgTUdGMSh1bnNpZ25lZCBjaGFyICptYXNrLCBsb25nIGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqc2VlZCwKKwkJIGxvbmcgc2VlZGxlbikKKwl7CisJcmV0dXJuIFBLQ1MxX01HRjEobWFzaywgbGVuLCBzZWVkLCBzZWVkbGVuLCBFVlBfc2hhMSgpKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3BrMS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfcGsxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2MDc1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3BrMS5jCkBAIC0wLDAgKzEsMjI0IEBACisvKiBjcnlwdG8vcnNhL3JzYV9wazEuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMSh1bnNpZ25lZCBjaGFyICp0bywgaW50IHRsZW4sCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCBpbnQgZmxlbikKKwl7CisJaW50IGo7CisJdW5zaWduZWQgY2hhciAqcDsKKworCWlmIChmbGVuID4gKHRsZW4tUlNBX1BLQ1MxX1BBRERJTkdfU0laRSkpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0FERF9QS0NTMV9UWVBFXzEsUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFKTsKKwkJcmV0dXJuKDApOworCQl9CisJCisJcD0odW5zaWduZWQgY2hhciAqKXRvOworCisJKihwKyspPTA7CisJKihwKyspPTE7IC8qIFByaXZhdGUgS2V5IEJUIChCbG9jayBUeXBlKSAqLworCisJLyogcGFkIG91dCB3aXRoIDB4ZmYgZGF0YSAqLworCWo9dGxlbi0zLWZsZW47CisJbWVtc2V0KHAsMHhmZixqKTsKKwlwKz1qOworCSoocCsrKT0nXDAnOworCW1lbWNweShwLGZyb20sKHVuc2lnbmVkIGludClmbGVuKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8xKHVuc2lnbmVkIGNoYXIgKnRvLCBpbnQgdGxlbiwKKwkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sIGludCBmbGVuLCBpbnQgbnVtKQorCXsKKwlpbnQgaSxqOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisKKwlwPWZyb207CisJaWYgKChudW0gIT0gKGZsZW4rMSkpIHx8ICgqKHArKykgIT0gMDEpKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19DSEVDS19QS0NTMV9UWVBFXzEsUlNBX1JfQkxPQ0tfVFlQRV9JU19OT1RfMDEpOworCQlyZXR1cm4oLTEpOworCQl9CisKKwkvKiBzY2FuIG92ZXIgcGFkZGluZyBkYXRhICovCisJaj1mbGVuLTE7IC8qIG9uZSBmb3IgdHlwZS4gKi8KKwlmb3IgKGk9MDsgaTxqOyBpKyspCisJCXsKKwkJaWYgKCpwICE9IDB4ZmYpIC8qIHNob3VsZCBkZWNyeXB0IHRvIDB4ZmYgKi8KKwkJCXsKKwkJCWlmICgqcCA9PSAwKQorCQkJCXsgcCsrOyBicmVhazsgfQorCQkJZWxzZQl7CisJCQkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX1RZUEVfMSxSU0FfUl9CQURfRklYRURfSEVBREVSX0RFQ1JZUFQpOworCQkJCXJldHVybigtMSk7CisJCQkJfQorCQkJfQorCQlwKys7CisJCX0KKworCWlmIChpID09IGopCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX1RZUEVfMSxSU0FfUl9OVUxMX0JFRk9SRV9CTE9DS19NSVNTSU5HKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCisJaWYgKGkgPCA4KQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19DSEVDS19QS0NTMV9UWVBFXzEsUlNBX1JfQkFEX1BBRF9CWVRFX0NPVU5UKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCWkrKzsgLyogU2tpcCBvdmVyIHRoZSAnXDAnICovCisJai09aTsKKwlpZiAoaiA+IHRsZW4pCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX1RZUEVfMSxSU0FfUl9EQVRBX1RPT19MQVJHRSk7CisJCXJldHVybigtMSk7CisJCX0KKwltZW1jcHkodG8scCwodW5zaWduZWQgaW50KWopOworCisJcmV0dXJuKGopOworCX0KKworaW50IFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzIodW5zaWduZWQgY2hhciAqdG8sIGludCB0bGVuLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgaW50IGZsZW4pCisJeworCWludCBpLGo7CisJdW5zaWduZWQgY2hhciAqcDsKKwkKKwlpZiAoZmxlbiA+ICh0bGVuLTExKSkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQUREX1BLQ1MxX1RZUEVfMixSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwkKKwlwPSh1bnNpZ25lZCBjaGFyICopdG87CisKKwkqKHArKyk9MDsKKwkqKHArKyk9MjsgLyogUHVibGljIEtleSBCVCAoQmxvY2sgVHlwZSkgKi8KKworCS8qIHBhZCBvdXQgd2l0aCBub24temVybyByYW5kb20gZGF0YSAqLworCWo9dGxlbi0zLWZsZW47CisKKwlpZiAoUkFORF9ieXRlcyhwLGopIDw9IDApCisJCXJldHVybigwKTsKKwlmb3IgKGk9MDsgaTxqOyBpKyspCisJCXsKKwkJaWYgKCpwID09ICdcMCcpCisJCQlkbwl7CisJCQkJaWYgKFJBTkRfYnl0ZXMocCwxKSA8PSAwKQorCQkJCQlyZXR1cm4oMCk7CisJCQkJfSB3aGlsZSAoKnAgPT0gJ1wwJyk7CisJCXArKzsKKwkJfQorCisJKihwKyspPSdcMCc7CisKKwltZW1jcHkocCxmcm9tLCh1bnNpZ25lZCBpbnQpZmxlbik7CisJcmV0dXJuKDEpOworCX0KKworaW50IFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMih1bnNpZ25lZCBjaGFyICp0bywgaW50IHRsZW4sCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCBpbnQgZmxlbiwgaW50IG51bSkKKwl7CisJaW50IGksajsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCisJcD1mcm9tOworCWlmICgobnVtICE9IChmbGVuKzEpKSB8fCAoKihwKyspICE9IDAyKSkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfUEtDUzFfVFlQRV8yLFJTQV9SX0JMT0NLX1RZUEVfSVNfTk9UXzAyKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorI2lmZGVmIFBLQ1MxX0NIRUNLCisJcmV0dXJuKG51bS0xMSk7CisjZW5kaWYKKworCS8qIHNjYW4gb3ZlciBwYWRkaW5nIGRhdGEgKi8KKwlqPWZsZW4tMTsgLyogb25lIGZvciB0eXBlLiAqLworCWZvciAoaT0wOyBpPGo7IGkrKykKKwkJaWYgKCoocCsrKSA9PSAwKSBicmVhazsKKworCWlmIChpID09IGopCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX1RZUEVfMixSU0FfUl9OVUxMX0JFRk9SRV9CTE9DS19NSVNTSU5HKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCisJaWYgKGkgPCA4KQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19DSEVDS19QS0NTMV9UWVBFXzIsUlNBX1JfQkFEX1BBRF9CWVRFX0NPVU5UKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCWkrKzsgLyogU2tpcCBvdmVyIHRoZSAnXDAnICovCisJai09aTsKKwlpZiAoaiA+IHRsZW4pCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX1RZUEVfMixSU0FfUl9EQVRBX1RPT19MQVJHRSk7CisJCXJldHVybigtMSk7CisJCX0KKwltZW1jcHkodG8scCwodW5zaWduZWQgaW50KWopOworCisJcmV0dXJuKGopOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfcG1ldGguYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3BtZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4OTJlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3BtZXRoLmMKQEAgLTAsMCArMSw1ODcgQEAKKy8qIGNyeXB0by9yc2EvcnNhX3BtZXRoLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA2LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSAiZXZwX2xvY2wuaCIKKyNpbmNsdWRlICJyc2FfbG9jbC5oIgorCisvKiBSU0EgcGtleSBjb250ZXh0IHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdAorCXsKKwkvKiBLZXkgZ2VuIHBhcmFtZXRlcnMgKi8KKwlpbnQgbmJpdHM7CisJQklHTlVNICpwdWJfZXhwOworCS8qIEtleWdlbiBjYWxsYmFjayBpbmZvICovCisJaW50IGdlbnRtcFsyXTsKKwkvKiBSU0EgcGFkZGluZyBtb2RlICovCisJaW50IHBhZF9tb2RlOworCS8qIG1lc3NhZ2UgZGlnZXN0ICovCisJY29uc3QgRVZQX01EICptZDsKKwkvKiBQU1MvT0FFUCBzYWx0IGxlbmd0aCAqLworCWludCBzYWx0bGVuOworCS8qIFRlbXAgYnVmZmVyICovCisJdW5zaWduZWQgY2hhciAqdGJ1ZjsKKwl9IFJTQV9QS0VZX0NUWDsKKworc3RhdGljIGludCBwa2V5X3JzYV9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KQorCXsKKwlSU0FfUEtFWV9DVFggKnJjdHg7CisJcmN0eCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihSU0FfUEtFWV9DVFgpKTsKKwlpZiAoIXJjdHgpCisJCXJldHVybiAwOworCXJjdHgtPm5iaXRzID0gMTAyNDsKKwlyY3R4LT5wdWJfZXhwID0gTlVMTDsKKwlyY3R4LT5wYWRfbW9kZSA9IFJTQV9QS0NTMV9QQURESU5HOworCXJjdHgtPm1kID0gTlVMTDsKKwlyY3R4LT50YnVmID0gTlVMTDsKKworCXJjdHgtPnNhbHRsZW4gPSAtMjsKKworCWN0eC0+ZGF0YSA9IHJjdHg7CisJY3R4LT5rZXlnZW5faW5mbyA9IHJjdHgtPmdlbnRtcDsKKwljdHgtPmtleWdlbl9pbmZvX2NvdW50ID0gMjsKKwkKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9yc2FfY29weShFVlBfUEtFWV9DVFggKmRzdCwgRVZQX1BLRVlfQ1RYICpzcmMpCisJeworCVJTQV9QS0VZX0NUWCAqZGN0eCwgKnNjdHg7CisJaWYgKCFwa2V5X3JzYV9pbml0KGRzdCkpCisJCXJldHVybiAwOworICAgICAgIAlzY3R4ID0gc3JjLT5kYXRhOworCWRjdHggPSBkc3QtPmRhdGE7CisJZGN0eC0+bmJpdHMgPSBzY3R4LT5uYml0czsKKwlpZiAoc2N0eC0+cHViX2V4cCkKKwkJeworCQlkY3R4LT5wdWJfZXhwID0gQk5fZHVwKHNjdHgtPnB1Yl9leHApOworCQlpZiAoIWRjdHgtPnB1Yl9leHApCisJCQlyZXR1cm4gMDsKKwkJfQorCWRjdHgtPnBhZF9tb2RlID0gc2N0eC0+cGFkX21vZGU7CisJZGN0eC0+bWQgPSBzY3R4LT5tZDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgc2V0dXBfdGJ1ZihSU0FfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVlfQ1RYICpwaykKKwl7CisJaWYgKGN0eC0+dGJ1ZikKKwkJcmV0dXJuIDE7CisJY3R4LT50YnVmID0gT1BFTlNTTF9tYWxsb2MoRVZQX1BLRVlfc2l6ZShway0+cGtleSkpOworCWlmICghY3R4LT50YnVmKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyB2b2lkIHBrZXlfcnNhX2NsZWFudXAoRVZQX1BLRVlfQ1RYICpjdHgpCisJeworCVJTQV9QS0VZX0NUWCAqcmN0eCA9IGN0eC0+ZGF0YTsKKwlpZiAocmN0eCkKKwkJeworCQlpZiAocmN0eC0+cHViX2V4cCkKKwkJCUJOX2ZyZWUocmN0eC0+cHViX2V4cCk7CisJCWlmIChyY3R4LT50YnVmKQorCQkJT1BFTlNTTF9mcmVlKHJjdHgtPnRidWYpOworCQlPUEVOU1NMX2ZyZWUocmN0eCk7CisJCX0KKwl9CisKK3N0YXRpYyBpbnQgcGtleV9yc2Ffc2lnbihFVlBfUEtFWV9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJzLCBzaXplX3QgdGJzbGVuKQorCXsKKwlpbnQgcmV0OworCVJTQV9QS0VZX0NUWCAqcmN0eCA9IGN0eC0+ZGF0YTsKKwlSU0EgKnJzYSA9IGN0eC0+cGtleS0+cGtleS5yc2E7CisKKwlpZiAocmN0eC0+bWQpCisJCXsKKwkJaWYgKHRic2xlbiAhPSAoc2l6ZV90KUVWUF9NRF9zaXplKHJjdHgtPm1kKSkKKwkJCXsKKwkJCVJTQWVycihSU0FfRl9QS0VZX1JTQV9TSUdOLAorCQkJCQlSU0FfUl9JTlZBTElEX0RJR0VTVF9MRU5HVEgpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlpZiAocmN0eC0+cGFkX21vZGUgPT0gUlNBX1g5MzFfUEFERElORykKKwkJCXsKKwkJCWlmICghc2V0dXBfdGJ1ZihyY3R4LCBjdHgpKQorCQkJCXJldHVybiAtMTsKKwkJCW1lbWNweShyY3R4LT50YnVmLCB0YnMsIHRic2xlbik7CisJCQlyY3R4LT50YnVmW3Ric2xlbl0gPQorCQkJCVJTQV9YOTMxX2hhc2hfaWQoRVZQX01EX3R5cGUocmN0eC0+bWQpKTsKKwkJCXJldCA9IFJTQV9wcml2YXRlX2VuY3J5cHQodGJzbGVuICsgMSwgcmN0eC0+dGJ1ZiwKKwkJCQkJCXNpZywgcnNhLCBSU0FfWDkzMV9QQURESU5HKTsKKwkJCX0KKwkJZWxzZSBpZiAocmN0eC0+cGFkX21vZGUgPT0gUlNBX1BLQ1MxX1BBRERJTkcpCisJCQl7CisJCQl1bnNpZ25lZCBpbnQgc2x0bXA7CisJCQlyZXQgPSBSU0Ffc2lnbihFVlBfTURfdHlwZShyY3R4LT5tZCksCisJCQkJCQl0YnMsIHRic2xlbiwgc2lnLCAmc2x0bXAsIHJzYSk7CisJCQlpZiAocmV0IDw9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCXJldCA9IHNsdG1wOworCQkJfQorCQllbHNlIGlmIChyY3R4LT5wYWRfbW9kZSA9PSBSU0FfUEtDUzFfUFNTX1BBRERJTkcpCisJCQl7CisJCQlpZiAoIXNldHVwX3RidWYocmN0eCwgY3R4KSkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAoIVJTQV9wYWRkaW5nX2FkZF9QS0NTMV9QU1MocnNhLCByY3R4LT50YnVmLCB0YnMsCisJCQkJCQlyY3R4LT5tZCwgcmN0eC0+c2FsdGxlbikpCisJCQkJcmV0dXJuIC0xOworCQkJcmV0ID0gUlNBX3ByaXZhdGVfZW5jcnlwdChSU0Ffc2l6ZShyc2EpLCByY3R4LT50YnVmLAorCQkJCQkJc2lnLCByc2EsIFJTQV9OT19QQURESU5HKTsKKwkJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCQl9CisJZWxzZQorCQlyZXQgPSBSU0FfcHJpdmF0ZV9lbmNyeXB0KHRic2xlbiwgdGJzLCBzaWcsIGN0eC0+cGtleS0+cGtleS5yc2EsCisJCQkJCQkJcmN0eC0+cGFkX21vZGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCSpzaWdsZW4gPSByZXQ7CisJcmV0dXJuIDE7CisJfQorCisKK3N0YXRpYyBpbnQgcGtleV9yc2FfdmVyaWZ5cmVjb3ZlcihFVlBfUEtFWV9DVFggKmN0eCwKKwkJCQkJdW5zaWduZWQgY2hhciAqcm91dCwgc2l6ZV90ICpyb3V0bGVuLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCBzaWdsZW4pCisJeworCWludCByZXQ7CisJUlNBX1BLRVlfQ1RYICpyY3R4ID0gY3R4LT5kYXRhOworCisJaWYgKHJjdHgtPm1kKQorCQl7CisJCWlmIChyY3R4LT5wYWRfbW9kZSA9PSBSU0FfWDkzMV9QQURESU5HKQorCQkJeworCQkJaWYgKCFzZXR1cF90YnVmKHJjdHgsIGN0eCkpCisJCQkJcmV0dXJuIC0xOworCQkJcmV0ID0gUlNBX3B1YmxpY19kZWNyeXB0KHNpZ2xlbiwgc2lnLAorCQkJCQkJcmN0eC0+dGJ1ZiwgY3R4LT5wa2V5LT5wa2V5LnJzYSwKKwkJCQkJCVJTQV9YOTMxX1BBRERJTkcpOworCQkJaWYgKHJldCA8IDEpCisJCQkJcmV0dXJuIDA7CisJCQlyZXQtLTsKKwkJCWlmIChyY3R4LT50YnVmW3JldF0gIT0KKwkJCQlSU0FfWDkzMV9oYXNoX2lkKEVWUF9NRF90eXBlKHJjdHgtPm1kKSkpCisJCQkJeworCQkJCVJTQWVycihSU0FfRl9QS0VZX1JTQV9WRVJJRllSRUNPVkVSLAorCQkJCQkJUlNBX1JfQUxHT1JJVEhNX01JU01BVENIKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlpZiAocmV0ICE9IEVWUF9NRF9zaXplKHJjdHgtPm1kKSkKKwkJCQl7CisJCQkJUlNBZXJyKFJTQV9GX1BLRVlfUlNBX1ZFUklGWVJFQ09WRVIsCisJCQkJCVJTQV9SX0lOVkFMSURfRElHRVNUX0xFTkdUSCk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJaWYgKHJvdXQpCisJCQkJbWVtY3B5KHJvdXQsIHJjdHgtPnRidWYsIHJldCk7CisJCQl9CisJCWVsc2UgaWYgKHJjdHgtPnBhZF9tb2RlID09IFJTQV9QS0NTMV9QQURESU5HKQorCQkJeworCQkJc2l6ZV90IHNsdG1wOworCQkJcmV0ID0gaW50X3JzYV92ZXJpZnkoRVZQX01EX3R5cGUocmN0eC0+bWQpLAorCQkJCQkJTlVMTCwgMCwgcm91dCwgJnNsdG1wLAorCQkJCQlzaWcsIHNpZ2xlbiwgY3R4LT5wa2V5LT5wa2V5LnJzYSk7CisJCQlpZiAocmV0IDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQlyZXQgPSBzbHRtcDsKKwkJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCQl9CisJZWxzZQorCQlyZXQgPSBSU0FfcHVibGljX2RlY3J5cHQoc2lnbGVuLCBzaWcsIHJvdXQsIGN0eC0+cGtleS0+cGtleS5yc2EsCisJCQkJCQkJcmN0eC0+cGFkX21vZGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCSpyb3V0bGVuID0gcmV0OworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBwa2V5X3JzYV92ZXJpZnkoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJzLCBzaXplX3QgdGJzbGVuKQorCXsKKwlSU0FfUEtFWV9DVFggKnJjdHggPSBjdHgtPmRhdGE7CisJUlNBICpyc2EgPSBjdHgtPnBrZXktPnBrZXkucnNhOworCXNpemVfdCByc2xlbjsKKwlpZiAocmN0eC0+bWQpCisJCXsKKwkJaWYgKHJjdHgtPnBhZF9tb2RlID09IFJTQV9QS0NTMV9QQURESU5HKQorCQkJcmV0dXJuIFJTQV92ZXJpZnkoRVZQX01EX3R5cGUocmN0eC0+bWQpLCB0YnMsIHRic2xlbiwKKwkJCQkJc2lnLCBzaWdsZW4sIHJzYSk7CisJCWlmIChyY3R4LT5wYWRfbW9kZSA9PSBSU0FfWDkzMV9QQURESU5HKQorCQkJeworCQkJaWYgKHBrZXlfcnNhX3ZlcmlmeXJlY292ZXIoY3R4LCBOVUxMLCAmcnNsZW4sCisJCQkJCXNpZywgc2lnbGVuKSA8PSAwKQorCQkJCXJldHVybiAwOworCQkJfQorCQllbHNlIGlmIChyY3R4LT5wYWRfbW9kZSA9PSBSU0FfUEtDUzFfUFNTX1BBRERJTkcpCisJCQl7CisJCQlpbnQgcmV0OworCQkJaWYgKCFzZXR1cF90YnVmKHJjdHgsIGN0eCkpCisJCQkJcmV0dXJuIC0xOworCQkJcmV0ID0gUlNBX3B1YmxpY19kZWNyeXB0KHNpZ2xlbiwgc2lnLCByY3R4LT50YnVmLAorCQkJCQkJCXJzYSwgUlNBX05PX1BBRERJTkcpOworCQkJaWYgKHJldCA8PSAwKQorCQkJCXJldHVybiAwOworCQkJcmV0ID0gUlNBX3ZlcmlmeV9QS0NTMV9QU1MocnNhLCB0YnMsIHJjdHgtPm1kLAorCQkJCQkJcmN0eC0+dGJ1ZiwgcmN0eC0+c2FsdGxlbik7CisJCQlpZiAocmV0IDw9IDApCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJZWxzZQorCQkJcmV0dXJuIC0xOworCQl9CisJZWxzZQorCQl7CisJCWlmICghc2V0dXBfdGJ1ZihyY3R4LCBjdHgpKQorCQkJcmV0dXJuIC0xOworCQlyc2xlbiA9IFJTQV9wdWJsaWNfZGVjcnlwdChzaWdsZW4sIHNpZywgcmN0eC0+dGJ1ZiwKKwkJCQkJCXJzYSwgcmN0eC0+cGFkX21vZGUpOworCQlpZiAocnNsZW4gPT0gMCkKKwkJCXJldHVybiAwOworCQl9CisKKwlpZiAoKHJzbGVuICE9IHRic2xlbikgfHwgbWVtY21wKHRicywgcmN0eC0+dGJ1ZiwgcnNsZW4pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworCQkJCisJfQorCQorCitzdGF0aWMgaW50IHBrZXlfcnNhX2VuY3J5cHQoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQkJCXVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pCisJeworCWludCByZXQ7CisJUlNBX1BLRVlfQ1RYICpyY3R4ID0gY3R4LT5kYXRhOworCXJldCA9IFJTQV9wdWJsaWNfZW5jcnlwdChpbmxlbiwgaW4sIG91dCwgY3R4LT5wa2V5LT5wa2V5LnJzYSwKKwkJCQkJCQlyY3R4LT5wYWRfbW9kZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKm91dGxlbiA9IHJldDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcGtleV9yc2FfZGVjcnlwdChFVlBfUEtFWV9DVFggKmN0eCwKKwkJCQkJdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgKm91dGxlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmxlbikKKwl7CisJaW50IHJldDsKKwlSU0FfUEtFWV9DVFggKnJjdHggPSBjdHgtPmRhdGE7CisJcmV0ID0gUlNBX3ByaXZhdGVfZGVjcnlwdChpbmxlbiwgaW4sIG91dCwgY3R4LT5wa2V5LT5wa2V5LnJzYSwKKwkJCQkJCQlyY3R4LT5wYWRfbW9kZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKm91dGxlbiA9IHJldDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGFkZGluZ19tZChjb25zdCBFVlBfTUQgKm1kLCBpbnQgcGFkZGluZykKKwl7CisJaWYgKCFtZCkKKwkJcmV0dXJuIDE7CisKKwlpZiAocGFkZGluZyA9PSBSU0FfTk9fUEFERElORykKKwkJeworCQlSU0FlcnIoUlNBX0ZfQ0hFQ0tfUEFERElOR19NRCwgUlNBX1JfSU5WQUxJRF9QQURESU5HX01PREUpOworCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKHBhZGRpbmcgPT0gUlNBX1g5MzFfUEFERElORykKKwkJeworCQlpZiAoUlNBX1g5MzFfaGFzaF9pZChFVlBfTURfdHlwZShtZCkpID09IC0xKQorCQkJeworCQkJUlNBZXJyKFJTQV9GX0NIRUNLX1BBRERJTkdfTUQsCisJCQkJCQlSU0FfUl9JTlZBTElEX1g5MzFfRElHRVNUKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlyZXR1cm4gMTsKKwkJfQorCisJcmV0dXJuIDE7CisJfQorCQkJCisKK3N0YXRpYyBpbnQgcGtleV9yc2FfY3RybChFVlBfUEtFWV9DVFggKmN0eCwgaW50IHR5cGUsIGludCBwMSwgdm9pZCAqcDIpCisJeworCVJTQV9QS0VZX0NUWCAqcmN0eCA9IGN0eC0+ZGF0YTsKKwlzd2l0Y2ggKHR5cGUpCisJCXsKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9QQURESU5HOgorCQlpZiAoKHAxID49IFJTQV9QS0NTMV9QQURESU5HKSAmJiAocDEgPD0gUlNBX1BLQ1MxX1BTU19QQURESU5HKSkKKwkJCXsKKwkJCWlmICghY2hlY2tfcGFkZGluZ19tZChyY3R4LT5tZCwgcDEpKQorCQkJCXJldHVybiAwOworCQkJaWYgKHAxID09IFJTQV9QS0NTMV9QU1NfUEFERElORykgCisJCQkJeworCQkJCWlmICghKGN0eC0+b3BlcmF0aW9uICYKKwkJCQkgICAgIChFVlBfUEtFWV9PUF9TSUdOIHwgRVZQX1BLRVlfT1BfVkVSSUZZKSkpCisJCQkJCWdvdG8gYmFkX3BhZDsKKwkJCQlpZiAoIXJjdHgtPm1kKQorCQkJCQlyY3R4LT5tZCA9IEVWUF9zaGExKCk7CisJCQkJfQorCQkJaWYgKHAxID09IFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpIAorCQkJCXsKKwkJCQlpZiAoIShjdHgtPm9wZXJhdGlvbiAmIEVWUF9QS0VZX09QX1RZUEVfQ1JZUFQpKQorCQkJCQlnb3RvIGJhZF9wYWQ7CisJCQkJaWYgKCFyY3R4LT5tZCkKKwkJCQkJcmN0eC0+bWQgPSBFVlBfc2hhMSgpOworCQkJCX0KKwkJCXJjdHgtPnBhZF9tb2RlID0gcDE7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwkJYmFkX3BhZDoKKwkJUlNBZXJyKFJTQV9GX1BLRVlfUlNBX0NUUkwsCisJCQkJUlNBX1JfSUxMRUdBTF9PUl9VTlNVUFBPUlRFRF9QQURESU5HX01PREUpOworCQlyZXR1cm4gLTI7CisKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9QU1NfU0FMVExFTjoKKwkJaWYgKHAxIDwgLTIpCisJCQlyZXR1cm4gLTI7CisJCWlmIChyY3R4LT5wYWRfbW9kZSAhPSBSU0FfUEtDUzFfUFNTX1BBRERJTkcpCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfUEtFWV9SU0FfQ1RSTCwgUlNBX1JfSU5WQUxJRF9QU1NfU0FMVExFTik7CisJCQlyZXR1cm4gLTI7CisJCQl9CisJCXJjdHgtPnNhbHRsZW4gPSBwMTsKKwkJcmV0dXJuIDE7CisKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fQklUUzoKKwkJaWYgKHAxIDwgMjU2KQorCQkJeworCQkJUlNBZXJyKFJTQV9GX1BLRVlfUlNBX0NUUkwsIFJTQV9SX0lOVkFMSURfS0VZQklUUyk7CisJCQlyZXR1cm4gLTI7CisJCQl9CisJCXJjdHgtPm5iaXRzID0gcDE7CisJCXJldHVybiAxOworCisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9SU0FfS0VZR0VOX1BVQkVYUDoKKwkJaWYgKCFwMikKKwkJCXJldHVybiAtMjsKKwkJcmN0eC0+cHViX2V4cCA9IHAyOworCQlyZXR1cm4gMTsKKworCQljYXNlIEVWUF9QS0VZX0NUUkxfTUQ6CisJCWlmICghY2hlY2tfcGFkZGluZ19tZChwMiwgcmN0eC0+cGFkX21vZGUpKQorCQkJcmV0dXJuIDA7CisJCXJjdHgtPm1kID0gcDI7CisJCXJldHVybiAxOworCisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9ESUdFU1RJTklUOgorCQljYXNlIEVWUF9QS0VZX0NUUkxfUEtDUzdfRU5DUllQVDoKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX1BLQ1M3X0RFQ1JZUFQ6CisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9QS0NTN19TSUdOOgorI2lmbmRlZiBPUEVOU1NMX05PX0NNUworCQljYXNlIEVWUF9QS0VZX0NUUkxfQ01TX0VOQ1JZUFQ6CisJCWNhc2UgRVZQX1BLRVlfQ1RSTF9DTVNfREVDUllQVDoKKwkJY2FzZSBFVlBfUEtFWV9DVFJMX0NNU19TSUdOOgorI2VuZGlmCisJCXJldHVybiAxOworCQljYXNlIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVk6CisJCQlSU0FlcnIoUlNBX0ZfUEtFWV9SU0FfQ1RSTCwKKwkJCVJTQV9SX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWVRZUEUpOworCQkJcmV0dXJuIC0yOwkKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gLTI7CisKKwkJfQorCX0KKwkJCQorc3RhdGljIGludCBwa2V5X3JzYV9jdHJsX3N0cihFVlBfUEtFWV9DVFggKmN0eCwKKwkJCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKQorCXsKKwlpZiAoIXZhbHVlKQorCQl7CisJCVJTQWVycihSU0FfRl9QS0VZX1JTQV9DVFJMX1NUUiwgUlNBX1JfVkFMVUVfTUlTU0lORyk7CisJCXJldHVybiAwOworCQl9CisJaWYgKCFzdHJjbXAodHlwZSwgInJzYV9wYWRkaW5nX21vZGUiKSkKKwkJeworCQlpbnQgcG07CisJCWlmICghc3RyY21wKHZhbHVlLCAicGtjczEiKSkKKwkJCXBtID0gUlNBX1BLQ1MxX1BBRERJTkc7CisJCWVsc2UgaWYgKCFzdHJjbXAodmFsdWUsICJzc2x2MjMiKSkKKwkJCXBtID0gUlNBX1NTTFYyM19QQURESU5HOworCQllbHNlIGlmICghc3RyY21wKHZhbHVlLCAibm9uZSIpKQorCQkJcG0gPSBSU0FfTk9fUEFERElORzsKKwkJZWxzZSBpZiAoIXN0cmNtcCh2YWx1ZSwgIm9lYXAiKSkKKwkJCXBtID0gUlNBX1BLQ1MxX09BRVBfUEFERElORzsKKwkJZWxzZSBpZiAoIXN0cmNtcCh2YWx1ZSwgIng5MzEiKSkKKwkJCXBtID0gUlNBX1g5MzFfUEFERElORzsKKwkJZWxzZSBpZiAoIXN0cmNtcCh2YWx1ZSwgInBzcyIpKQorCQkJcG0gPSBSU0FfUEtDUzFfUFNTX1BBRERJTkc7CisJCWVsc2UKKwkJCXsKKwkJCVJTQWVycihSU0FfRl9QS0VZX1JTQV9DVFJMX1NUUiwKKwkJCQkJCVJTQV9SX1VOS05PV05fUEFERElOR19UWVBFKTsKKwkJCXJldHVybiAtMjsKKwkJCX0KKwkJcmV0dXJuIEVWUF9QS0VZX0NUWF9zZXRfcnNhX3BhZGRpbmcoY3R4LCBwbSk7CisJCX0KKworCWlmICghc3RyY21wKHR5cGUsICJyc2FfcHNzX3NhbHRsZW4iKSkKKwkJeworCQlpbnQgc2FsdGxlbjsKKwkJc2FsdGxlbiA9IGF0b2kodmFsdWUpOworCQlyZXR1cm4gRVZQX1BLRVlfQ1RYX3NldF9yc2FfcHNzX3NhbHRsZW4oY3R4LCBzYWx0bGVuKTsKKwkJfQorCisJaWYgKCFzdHJjbXAodHlwZSwgInJzYV9rZXlnZW5fYml0cyIpKQorCQl7CisJCWludCBuYml0czsKKwkJbmJpdHMgPSBhdG9pKHZhbHVlKTsKKwkJcmV0dXJuIEVWUF9QS0VZX0NUWF9zZXRfcnNhX2tleWdlbl9iaXRzKGN0eCwgbmJpdHMpOworCQl9CisKKwlpZiAoIXN0cmNtcCh0eXBlLCAicnNhX2tleWdlbl9wdWJleHAiKSkKKwkJeworCQlpbnQgcmV0OworCQlCSUdOVU0gKnB1YmV4cCA9IE5VTEw7CisJCWlmICghQk5fYXNjMmJuKCZwdWJleHAsIHZhbHVlKSkKKwkJCXJldHVybiAwOworCQlyZXQgPSBFVlBfUEtFWV9DVFhfc2V0X3JzYV9rZXlnZW5fcHViZXhwKGN0eCwgcHViZXhwKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJQk5fZnJlZShwdWJleHApOworCQlyZXR1cm4gcmV0OworCQl9CisKKwlyZXR1cm4gLTI7CisJfQorCitzdGF0aWMgaW50IHBrZXlfcnNhX2tleWdlbihFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpCisJeworCVJTQSAqcnNhID0gTlVMTDsKKwlSU0FfUEtFWV9DVFggKnJjdHggPSBjdHgtPmRhdGE7CisJQk5fR0VOQ0IgKnBjYiwgY2I7CisJaW50IHJldDsKKwlpZiAoIXJjdHgtPnB1Yl9leHApCisJCXsKKwkJcmN0eC0+cHViX2V4cCA9IEJOX25ldygpOworCQlpZiAoIXJjdHgtPnB1Yl9leHAgfHwgIUJOX3NldF93b3JkKHJjdHgtPnB1Yl9leHAsIFJTQV9GNCkpCisJCQlyZXR1cm4gMDsKKwkJfQorCXJzYSA9IFJTQV9uZXcoKTsKKwlpZiAoIXJzYSkKKwkJcmV0dXJuIDA7CisJaWYgKGN0eC0+cGtleV9nZW5jYikKKwkJeworCQlwY2IgPSAmY2I7CisJCWV2cF9wa2V5X3NldF9jYl90cmFuc2xhdGUocGNiLCBjdHgpOworCQl9CisJZWxzZQorCQlwY2IgPSBOVUxMOworCXJldCA9IFJTQV9nZW5lcmF0ZV9rZXlfZXgocnNhLCByY3R4LT5uYml0cywgcmN0eC0+cHViX2V4cCwgcGNiKTsKKwlpZiAocmV0ID4gMCkKKwkJRVZQX1BLRVlfYXNzaWduX1JTQShwa2V5LCByc2EpOworCWVsc2UKKwkJUlNBX2ZyZWUocnNhKTsKKwlyZXR1cm4gcmV0OworCX0KKworY29uc3QgRVZQX1BLRVlfTUVUSE9EIHJzYV9wa2V5X21ldGggPSAKKwl7CisJRVZQX1BLRVlfUlNBLAorCUVWUF9QS0VZX0ZMQUdfQVVUT0FSR0xFTiwKKwlwa2V5X3JzYV9pbml0LAorCXBrZXlfcnNhX2NvcHksCisJcGtleV9yc2FfY2xlYW51cCwKKworCTAsMCwKKworCTAsCisJcGtleV9yc2Ffa2V5Z2VuLAorCisJMCwKKwlwa2V5X3JzYV9zaWduLAorCisJMCwKKwlwa2V5X3JzYV92ZXJpZnksCisKKwkwLAorCXBrZXlfcnNhX3ZlcmlmeXJlY292ZXIsCisKKworCTAsMCwwLDAsCisKKwkwLAorCXBrZXlfcnNhX2VuY3J5cHQsCisKKwkwLAorCXBrZXlfcnNhX2RlY3J5cHQsCisKKwkwLDAsCisKKwlwa2V5X3JzYV9jdHJsLAorCXBrZXlfcnNhX2N0cmxfc3RyCisKKworCX07CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9wcm4uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3Bybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNGRiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9wcm4uYwpAQCAtMCwwICsxLDkzIEBACisvKiBjcnlwdG8vcnNhL3JzYV9wcm4uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDYuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludCBSU0FfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IFJTQSAqeCwgaW50IG9mZikKKwl7CisJQklPICpiOworCWludCByZXQ7CisKKwlpZiAoKGI9QklPX25ldyhCSU9fc19maWxlKCkpKSA9PSBOVUxMKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUFJJTlRfRlAsRVJSX1JfQlVGX0xJQik7CisJCXJldHVybigwKTsKKwkJfQorCUJJT19zZXRfZnAoYixmcCxCSU9fTk9DTE9TRSk7CisJcmV0PVJTQV9wcmludChiLHgsb2ZmKTsKKwlCSU9fZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYKKworaW50IFJTQV9wcmludChCSU8gKmJwLCBjb25zdCBSU0EgKngsIGludCBvZmYpCisJeworCUVWUF9QS0VZICpwazsKKwlpbnQgcmV0OworCXBrID0gRVZQX1BLRVlfbmV3KCk7CisJaWYgKCFwayB8fCAhRVZQX1BLRVlfc2V0MV9SU0EocGssIChSU0EgKil4KSkKKwkJcmV0dXJuIDA7CisJcmV0ID0gRVZQX1BLRVlfcHJpbnRfcHJpdmF0ZShicCwgcGssIG9mZiwgTlVMTCk7CisJRVZQX1BLRVlfZnJlZShwayk7CisJcmV0dXJuIHJldDsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3Bzcy5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfcHNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyMTFlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3Bzcy5jCkBAIC0wLDAgKzEsMjc1IEBACisvKiByc2FfcHNzLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA1LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB6ZXJvZXNbXSA9IHswLDAsMCwwLDAsMCwwLDB9OworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfQVJNXykKKyNwcmFnbWEgb3B0aW1pemUoImciLCBvZmYpCisjZW5kaWYKKworaW50IFJTQV92ZXJpZnlfUEtDUzFfUFNTKFJTQSAqcnNhLCBjb25zdCB1bnNpZ25lZCBjaGFyICptSGFzaCwKKwkJCWNvbnN0IEVWUF9NRCAqSGFzaCwgY29uc3QgdW5zaWduZWQgY2hhciAqRU0sIGludCBzTGVuKQorCXsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaExlbiwgbWFza2VkREJMZW4sIE1TQml0cywgZW1MZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqSDsKKwl1bnNpZ25lZCBjaGFyICpEQiA9IE5VTEw7CisJRVZQX01EX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBIX1tFVlBfTUFYX01EX1NJWkVdOworCisJaExlbiA9IEVWUF9NRF9zaXplKEhhc2gpOworCWlmIChoTGVuIDwgMCkKKwkJZ290byBlcnI7CisJLyoKKwkgKiBOZWdhdGl2ZSBzTGVuIGhhcyBzcGVjaWFsIG1lYW5pbmdzOgorCSAqCS0xCXNMZW4gPT0gaExlbgorCSAqCS0yCXNhbHQgbGVuZ3RoIGlzIGF1dG9yZWNvdmVyZWQgZnJvbSBzaWduYXR1cmUKKwkgKgktTglyZXNlcnZlZAorCSAqLworCWlmICAgICAgKHNMZW4gPT0gLTEpCXNMZW4gPSBoTGVuOworCWVsc2UgaWYgKHNMZW4gPT0gLTIpCXNMZW4gPSAtMjsKKwllbHNlIGlmIChzTGVuIDwgLTIpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9WRVJJRllfUEtDUzFfUFNTLCBSU0FfUl9TTEVOX0NIRUNLX0ZBSUxFRCk7CisJCWdvdG8gZXJyOworCQl9CisKKwlNU0JpdHMgPSAoQk5fbnVtX2JpdHMocnNhLT5uKSAtIDEpICYgMHg3OworCWVtTGVuID0gUlNBX3NpemUocnNhKTsKKwlpZiAoRU1bMF0gJiAoMHhGRiA8PCBNU0JpdHMpKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfVkVSSUZZX1BLQ1MxX1BTUywgUlNBX1JfRklSU1RfT0NURVRfSU5WQUxJRCk7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKE1TQml0cyA9PSAwKQorCQl7CisJCUVNKys7CisJCWVtTGVuLS07CisJCX0KKwlpZiAoZW1MZW4gPCAoaExlbiArIHNMZW4gKyAyKSkgLyogc0xlbiBjYW4gYmUgc21hbGwgbmVnYXRpdmUgKi8KKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1ZFUklGWV9QS0NTMV9QU1MsIFJTQV9SX0RBVEFfVE9PX0xBUkdFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoRU1bZW1MZW4gLSAxXSAhPSAweGJjKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfVkVSSUZZX1BLQ1MxX1BTUywgUlNBX1JfTEFTVF9PQ1RFVF9JTlZBTElEKTsKKwkJZ290byBlcnI7CisJCX0KKwltYXNrZWREQkxlbiA9IGVtTGVuIC0gaExlbiAtIDE7CisJSCA9IEVNICsgbWFza2VkREJMZW47CisJREIgPSBPUEVOU1NMX21hbGxvYyhtYXNrZWREQkxlbik7CisJaWYgKCFEQikKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1ZFUklGWV9QS0NTMV9QU1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoUEtDUzFfTUdGMShEQiwgbWFza2VkREJMZW4sIEgsIGhMZW4sIEhhc2gpIDwgMCkKKwkJZ290byBlcnI7CisJZm9yIChpID0gMDsgaSA8IG1hc2tlZERCTGVuOyBpKyspCisJCURCW2ldIF49IEVNW2ldOworCWlmIChNU0JpdHMpCisJCURCWzBdICY9IDB4RkYgPj4gKDggLSBNU0JpdHMpOworCWZvciAoaSA9IDA7IERCW2ldID09IDAgJiYgaSA8IChtYXNrZWREQkxlbi0xKTsgaSsrKSA7CisJaWYgKERCW2krK10gIT0gMHgxKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfVkVSSUZZX1BLQ1MxX1BTUywgUlNBX1JfU0xFTl9SRUNPVkVSWV9GQUlMRUQpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChzTGVuID49IDAgJiYgKG1hc2tlZERCTGVuIC0gaSkgIT0gc0xlbikKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1ZFUklGWV9QS0NTMV9QU1MsIFJTQV9SX1NMRU5fQ0hFQ0tfRkFJTEVEKTsKKwkJZ290byBlcnI7CisJCX0KKwlFVlBfTURfQ1RYX2luaXQoJmN0eCk7CisJRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgSGFzaCwgTlVMTCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCB6ZXJvZXMsIHNpemVvZiB6ZXJvZXMpOworCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgbUhhc2gsIGhMZW4pOworCWlmIChtYXNrZWREQkxlbiAtIGkpCisJCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgREIgKyBpLCBtYXNrZWREQkxlbiAtIGkpOworCUVWUF9EaWdlc3RGaW5hbCgmY3R4LCBIXywgTlVMTCk7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOworCWlmIChtZW1jbXAoSF8sIEgsIGhMZW4pKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfVkVSSUZZX1BLQ1MxX1BTUywgUlNBX1JfQkFEX1NJR05BVFVSRSk7CisJCXJldCA9IDA7CisJCX0KKwllbHNlIAorCQlyZXQgPSAxOworCisJZXJyOgorCWlmIChEQikKKwkJT1BFTlNTTF9mcmVlKERCKTsKKworCXJldHVybiByZXQ7CisKKwl9CisKK2ludCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfUFNTKFJTQSAqcnNhLCB1bnNpZ25lZCBjaGFyICpFTSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1IYXNoLAorCQkJY29uc3QgRVZQX01EICpIYXNoLCBpbnQgc0xlbikKKwl7CisJaW50IGk7CisJaW50IHJldCA9IDA7CisJaW50IGhMZW4sIG1hc2tlZERCTGVuLCBNU0JpdHMsIGVtTGVuOworCXVuc2lnbmVkIGNoYXIgKkgsICpzYWx0ID0gTlVMTCwgKnA7CisJRVZQX01EX0NUWCBjdHg7CisKKwloTGVuID0gRVZQX01EX3NpemUoSGFzaCk7CisJaWYgKGhMZW4gPCAwKQorCQlnb3RvIGVycjsKKwkvKgorCSAqIE5lZ2F0aXZlIHNMZW4gaGFzIHNwZWNpYWwgbWVhbmluZ3M6CisJICoJLTEJc0xlbiA9PSBoTGVuCisJICoJLTIJc2FsdCBsZW5ndGggaXMgbWF4aW1pemVkCisJICoJLU4JcmVzZXJ2ZWQKKwkgKi8KKwlpZiAgICAgIChzTGVuID09IC0xKQlzTGVuID0gaExlbjsKKwllbHNlIGlmIChzTGVuID09IC0yKQlzTGVuID0gLTI7CisJZWxzZSBpZiAoc0xlbiA8IC0yKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfUFNTLCBSU0FfUl9TTEVOX0NIRUNLX0ZBSUxFRCk7CisJCWdvdG8gZXJyOworCQl9CisKKwlNU0JpdHMgPSAoQk5fbnVtX2JpdHMocnNhLT5uKSAtIDEpICYgMHg3OworCWVtTGVuID0gUlNBX3NpemUocnNhKTsKKwlpZiAoTVNCaXRzID09IDApCisJCXsKKwkJKkVNKysgPSAwOworCQllbUxlbi0tOworCQl9CisJaWYgKHNMZW4gPT0gLTIpCisJCXsKKwkJc0xlbiA9IGVtTGVuIC0gaExlbiAtIDI7CisJCX0KKwllbHNlIGlmIChlbUxlbiA8IChoTGVuICsgc0xlbiArIDIpKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfUFNTLAorCQkgICBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChzTGVuID4gMCkKKwkJeworCQlzYWx0ID0gT1BFTlNTTF9tYWxsb2Moc0xlbik7CisJCWlmICghc2FsdCkKKwkJCXsKKwkJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfUFNTLAorCQkgICAJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoUkFORF9ieXRlcyhzYWx0LCBzTGVuKSA8PSAwKQorCQkJZ290byBlcnI7CisJCX0KKwltYXNrZWREQkxlbiA9IGVtTGVuIC0gaExlbiAtIDE7CisJSCA9IEVNICsgbWFza2VkREJMZW47CisJRVZQX01EX0NUWF9pbml0KCZjdHgpOworCUVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIEhhc2gsIE5VTEwpOworCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwgemVyb2VzLCBzaXplb2YgemVyb2VzKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsIG1IYXNoLCBoTGVuKTsKKwlpZiAoc0xlbikKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LCBzYWx0LCBzTGVuKTsKKwlFVlBfRGlnZXN0RmluYWwoJmN0eCwgSCwgTlVMTCk7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOworCisJLyogR2VuZXJhdGUgZGJNYXNrIGluIHBsYWNlIHRoZW4gcGVyZm9ybSBYT1Igb24gaXQgKi8KKwlpZiAoUEtDUzFfTUdGMShFTSwgbWFza2VkREJMZW4sIEgsIGhMZW4sIEhhc2gpKQorCQlnb3RvIGVycjsKKworCXAgPSBFTTsKKworCS8qIEluaXRpYWwgUFMgWE9ScyB3aXRoIGFsbCB6ZXJvZXMgd2hpY2ggaXMgYSBOT1Agc28ganVzdCB1cGRhdGUKKwkgKiBwb2ludGVyLiBOb3RlIGZyb20gYSB0ZXN0IGFib3ZlIHRoaXMgdmFsdWUgaXMgZ3VhcmFudGVlZCB0bworCSAqIGJlIG5vbi1uZWdhdGl2ZS4KKwkgKi8KKwlwICs9IGVtTGVuIC0gc0xlbiAtIGhMZW4gLSAyOworCSpwKysgXj0gMHgxOworCWlmIChzTGVuID4gMCkKKwkJeworCQlmb3IgKGkgPSAwOyBpIDwgc0xlbjsgaSsrKQorCQkJKnArKyBePSBzYWx0W2ldOworCQl9CisJaWYgKE1TQml0cykKKwkJRU1bMF0gJj0gMHhGRiA+PiAoOCAtIE1TQml0cyk7CisKKwkvKiBIIGlzIGFscmVhZHkgaW4gcGxhY2Ugc28ganVzdCBzZXQgZmluYWwgMHhiYyAqLworCisJRU1bZW1MZW4gLSAxXSA9IDB4YmM7CisKKwlyZXQgPSAxOworCisJZXJyOgorCWlmIChzYWx0KQorCQlPUEVOU1NMX2ZyZWUoc2FsdCk7CisKKwlyZXR1cm4gcmV0OworCisJfQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNwcmFnbWEgb3B0aW1pemUoIiIsb24pCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3Nhb3MuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3Nhb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOThlMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2Ffc2Fvcy5jCkBAIC0wLDAgKzEsMTUwIEBACisvKiBjcnlwdG8vcnNhL3JzYV9zYW9zLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworaW50IFJTQV9zaWduX0FTTjFfT0NURVRfU1RSSU5HKGludCB0eXBlLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm0sIHVuc2lnbmVkIGludCBtX2xlbiwKKwl1bnNpZ25lZCBjaGFyICpzaWdyZXQsIHVuc2lnbmVkIGludCAqc2lnbGVuLCBSU0EgKnJzYSkKKwl7CisJQVNOMV9PQ1RFVF9TVFJJTkcgc2lnOworCWludCBpLGoscmV0PTE7CisJdW5zaWduZWQgY2hhciAqcCwqczsKKworCXNpZy50eXBlPVZfQVNOMV9PQ1RFVF9TVFJJTkc7CisJc2lnLmxlbmd0aD1tX2xlbjsKKwlzaWcuZGF0YT0odW5zaWduZWQgY2hhciAqKW07CisKKwlpPWkyZF9BU04xX09DVEVUX1NUUklORygmc2lnLE5VTEwpOworCWo9UlNBX3NpemUocnNhKTsKKwlpZiAoaSA+IChqLVJTQV9QS0NTMV9QQURESU5HX1NJWkUpKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfU0lHTl9BU04xX09DVEVUX1NUUklORyxSU0FfUl9ESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWSk7CisJCXJldHVybigwKTsKKwkJfQorCXM9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygodW5zaWduZWQgaW50KWorMSk7CisJaWYgKHMgPT0gTlVMTCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1NJR05fQVNOMV9PQ1RFVF9TVFJJTkcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwlwPXM7CisJaTJkX0FTTjFfT0NURVRfU1RSSU5HKCZzaWcsJnApOworCWk9UlNBX3ByaXZhdGVfZW5jcnlwdChpLHMsc2lncmV0LHJzYSxSU0FfUEtDUzFfUEFERElORyk7CisJaWYgKGkgPD0gMCkKKwkJcmV0PTA7CisJZWxzZQorCQkqc2lnbGVuPWk7CisKKwlPUEVOU1NMX2NsZWFuc2UocywodW5zaWduZWQgaW50KWorMSk7CisJT1BFTlNTTF9mcmVlKHMpOworCXJldHVybihyZXQpOworCX0KKworaW50IFJTQV92ZXJpZnlfQVNOMV9PQ1RFVF9TVFJJTkcoaW50IGR0eXBlLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm0sCisJdW5zaWduZWQgaW50IG1fbGVuLCB1bnNpZ25lZCBjaGFyICpzaWdidWYsIHVuc2lnbmVkIGludCBzaWdsZW4sCisJUlNBICpyc2EpCisJeworCWludCBpLHJldD0wOworCXVuc2lnbmVkIGNoYXIgKnM7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlBU04xX09DVEVUX1NUUklORyAqc2lnPU5VTEw7CisKKwlpZiAoc2lnbGVuICE9ICh1bnNpZ25lZCBpbnQpUlNBX3NpemUocnNhKSkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1ZFUklGWV9BU04xX09DVEVUX1NUUklORyxSU0FfUl9XUk9OR19TSUdOQVRVUkVfTEVOR1RIKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlzPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoKHVuc2lnbmVkIGludClzaWdsZW4pOworCWlmIChzID09IE5VTEwpCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9WRVJJRllfQVNOMV9PQ1RFVF9TVFJJTkcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCWk9UlNBX3B1YmxpY19kZWNyeXB0KChpbnQpc2lnbGVuLHNpZ2J1ZixzLHJzYSxSU0FfUEtDUzFfUEFERElORyk7CisKKwlpZiAoaSA8PSAwKSBnb3RvIGVycjsKKworCXA9czsKKwlzaWc9ZDJpX0FTTjFfT0NURVRfU1RSSU5HKE5VTEwsJnAsKGxvbmcpaSk7CisJaWYgKHNpZyA9PSBOVUxMKSBnb3RvIGVycjsKKworCWlmICgJKCh1bnNpZ25lZCBpbnQpc2lnLT5sZW5ndGggIT0gbV9sZW4pIHx8CisJCShtZW1jbXAobSxzaWctPmRhdGEsbV9sZW4pICE9IDApKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfVkVSSUZZX0FTTjFfT0NURVRfU1RSSU5HLFJTQV9SX0JBRF9TSUdOQVRVUkUpOworCQl9CisJZWxzZQorCQlyZXQ9MTsKK2VycjoKKwlpZiAoc2lnICE9IE5VTEwpIE1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShzaWcpOworCWlmIChzICE9IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9jbGVhbnNlKHMsKHVuc2lnbmVkIGludClzaWdsZW4pOworCQlPUEVOU1NMX2ZyZWUocyk7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3NpZ24uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9yc2EvcnNhX3NpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmU0ZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2Ffc2lnbi5jCkBAIC0wLDAgKzEsMjg1IEBACisvKiBjcnlwdG8vcnNhL3JzYV9zaWduLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlICJyc2FfbG9jbC5oIgorCisvKiBTaXplIG9mIGFuIFNTTCBzaWduYXR1cmU6IE1ENStTSEExICovCisjZGVmaW5lIFNTTF9TSUdfTEVOR1RICTM2CisKK2ludCBSU0Ffc2lnbihpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqbSwgdW5zaWduZWQgaW50IG1fbGVuLAorCSAgICAgdW5zaWduZWQgY2hhciAqc2lncmV0LCB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgUlNBICpyc2EpCisJeworCVg1MDlfU0lHIHNpZzsKKwlBU04xX1RZUEUgcGFyYW1ldGVyOworCWludCBpLGoscmV0PTE7CisJdW5zaWduZWQgY2hhciAqcCwgKnRtcHMgPSBOVUxMOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSBOVUxMOworCVg1MDlfQUxHT1IgYWxnb3I7CisJQVNOMV9PQ1RFVF9TVFJJTkcgZGlnZXN0OworCWlmKChyc2EtPmZsYWdzICYgUlNBX0ZMQUdfU0lHTl9WRVIpICYmIHJzYS0+bWV0aC0+cnNhX3NpZ24pCisJCXsKKwkJcmV0dXJuIHJzYS0+bWV0aC0+cnNhX3NpZ24odHlwZSwgbSwgbV9sZW4sCisJCQlzaWdyZXQsIHNpZ2xlbiwgcnNhKTsKKwkJfQorCS8qIFNwZWNpYWwgY2FzZTogU1NMIHNpZ25hdHVyZSwganVzdCBjaGVjayB0aGUgbGVuZ3RoICovCisJaWYodHlwZSA9PSBOSURfbWQ1X3NoYTEpIHsKKwkJaWYobV9sZW4gIT0gU1NMX1NJR19MRU5HVEgpIHsKKwkJCVJTQWVycihSU0FfRl9SU0FfU0lHTixSU0FfUl9JTlZBTElEX01FU1NBR0VfTEVOR1RIKTsKKwkJCXJldHVybigwKTsKKwkJfQorCQlpID0gU1NMX1NJR19MRU5HVEg7CisJCXMgPSBtOworCX0gZWxzZSB7CisJCXNpZy5hbGdvcj0gJmFsZ29yOworCQlzaWcuYWxnb3ItPmFsZ29yaXRobT1PQkpfbmlkMm9iaih0eXBlKTsKKwkJaWYgKHNpZy5hbGdvci0+YWxnb3JpdGhtID09IE5VTEwpCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfUlNBX1NJR04sUlNBX1JfVU5LTk9XTl9BTEdPUklUSE1fVFlQRSk7CisJCQlyZXR1cm4oMCk7CisJCQl9CisJCWlmIChzaWcuYWxnb3ItPmFsZ29yaXRobS0+bGVuZ3RoID09IDApCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfUlNBX1NJR04sUlNBX1JfVEhFX0FTTjFfT0JKRUNUX0lERU5USUZJRVJfSVNfTk9UX0tOT1dOX0ZPUl9USElTX01EKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKwkJcGFyYW1ldGVyLnR5cGU9Vl9BU04xX05VTEw7CisJCXBhcmFtZXRlci52YWx1ZS5wdHI9TlVMTDsKKwkJc2lnLmFsZ29yLT5wYXJhbWV0ZXI9ICZwYXJhbWV0ZXI7CisKKwkJc2lnLmRpZ2VzdD0gJmRpZ2VzdDsKKwkJc2lnLmRpZ2VzdC0+ZGF0YT0odW5zaWduZWQgY2hhciAqKW07IC8qIFRNUCBVR0xZIENBU1QgKi8KKwkJc2lnLmRpZ2VzdC0+bGVuZ3RoPW1fbGVuOworCisJCWk9aTJkX1g1MDlfU0lHKCZzaWcsTlVMTCk7CisJfQorCWo9UlNBX3NpemUocnNhKTsKKwlpZiAoaSA+IChqLVJTQV9QS0NTMV9QQURESU5HX1NJWkUpKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfU0lHTixSU0FfUl9ESUdFU1RfVE9PX0JJR19GT1JfUlNBX0tFWSk7CisJCXJldHVybigwKTsKKwkJfQorCWlmKHR5cGUgIT0gTklEX21kNV9zaGExKSB7CisJCXRtcHM9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygodW5zaWduZWQgaW50KWorMSk7CisJCWlmICh0bXBzID09IE5VTEwpCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfUlNBX1NJR04sRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKDApOworCQkJfQorCQlwPXRtcHM7CisJCWkyZF9YNTA5X1NJRygmc2lnLCZwKTsKKwkJcz10bXBzOworCX0KKwlpPVJTQV9wcml2YXRlX2VuY3J5cHQoaSxzLHNpZ3JldCxyc2EsUlNBX1BLQ1MxX1BBRERJTkcpOworCWlmIChpIDw9IDApCisJCXJldD0wOworCWVsc2UKKwkJKnNpZ2xlbj1pOworCisJaWYodHlwZSAhPSBOSURfbWQ1X3NoYTEpIHsKKwkJT1BFTlNTTF9jbGVhbnNlKHRtcHMsKHVuc2lnbmVkIGludClqKzEpOworCQlPUEVOU1NMX2ZyZWUodG1wcyk7CisJfQorCXJldHVybihyZXQpOworCX0KKworaW50IGludF9yc2FfdmVyaWZ5KGludCBkdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqbSwKKwkJCSAgdW5zaWduZWQgaW50IG1fbGVuLAorCQkJICB1bnNpZ25lZCBjaGFyICpybSwgc2l6ZV90ICpwcm1fbGVuLAorCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpzaWdidWYsIHNpemVfdCBzaWdsZW4sCisJCQkgIFJTQSAqcnNhKQorCXsKKwlpbnQgaSxyZXQ9MCxzaWd0eXBlOworCXVuc2lnbmVkIGNoYXIgKnM7CisJWDUwOV9TSUcgKnNpZz1OVUxMOworCisJaWYgKHNpZ2xlbiAhPSAodW5zaWduZWQgaW50KVJTQV9zaXplKHJzYSkpCisJCXsKKwkJUlNBZXJyKFJTQV9GX0lOVF9SU0FfVkVSSUZZLFJTQV9SX1dST05HX1NJR05BVFVSRV9MRU5HVEgpOworCQlyZXR1cm4oMCk7CisJCX0KKworCWlmKChkdHlwZSA9PSBOSURfbWQ1X3NoYTEpICYmIHJtKQorCQl7CisJCWkgPSBSU0FfcHVibGljX2RlY3J5cHQoKGludClzaWdsZW4sCisJCQkJCXNpZ2J1ZixybSxyc2EsUlNBX1BLQ1MxX1BBRERJTkcpOworCQlpZiAoaSA8PSAwKQorCQkJcmV0dXJuIDA7CisJCSpwcm1fbGVuID0gaTsKKwkJcmV0dXJuIDE7CisJCX0KKworCXM9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYygodW5zaWduZWQgaW50KXNpZ2xlbik7CisJaWYgKHMgPT0gTlVMTCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfSU5UX1JTQV9WRVJJRlksRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCWlmKChkdHlwZSA9PSBOSURfbWQ1X3NoYTEpICYmIChtX2xlbiAhPSBTU0xfU0lHX0xFTkdUSCkgKSB7CisJCQlSU0FlcnIoUlNBX0ZfSU5UX1JTQV9WRVJJRlksUlNBX1JfSU5WQUxJRF9NRVNTQUdFX0xFTkdUSCk7CisJCQlnb3RvIGVycjsKKwl9CisJaT1SU0FfcHVibGljX2RlY3J5cHQoKGludClzaWdsZW4sc2lnYnVmLHMscnNhLFJTQV9QS0NTMV9QQURESU5HKTsKKworCWlmIChpIDw9IDApIGdvdG8gZXJyOworCisJLyogU3BlY2lhbCBjYXNlOiBTU0wgc2lnbmF0dXJlICovCisJaWYoZHR5cGUgPT0gTklEX21kNV9zaGExKSB7CisJCWlmKChpICE9IFNTTF9TSUdfTEVOR1RIKSB8fCBtZW1jbXAocywgbSwgU1NMX1NJR19MRU5HVEgpKQorCQkJCVJTQWVycihSU0FfRl9JTlRfUlNBX1ZFUklGWSxSU0FfUl9CQURfU0lHTkFUVVJFKTsKKwkJZWxzZSByZXQgPSAxOworCX0gZWxzZSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA9czsKKwkJc2lnPWQyaV9YNTA5X1NJRyhOVUxMLCZwLChsb25nKWkpOworCisJCWlmIChzaWcgPT0gTlVMTCkgZ290byBlcnI7CisKKwkJLyogRXhjZXNzIGRhdGEgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGZvcmdlcmllcyAqLworCQlpZihwICE9IHMraSkKKwkJCXsKKwkJCVJTQWVycihSU0FfRl9JTlRfUlNBX1ZFUklGWSxSU0FfUl9CQURfU0lHTkFUVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCS8qIFBhcmFtZXRlcnMgdG8gdGhlIHNpZ25hdHVyZSBhbGdvcml0aG0gY2FuIGFsc28gYmUgdXNlZCB0bworCQkgICBjcmVhdGUgZm9yZ2VyaWVzICovCisJCWlmKHNpZy0+YWxnb3ItPnBhcmFtZXRlcgorCQkgICAmJiBBU04xX1RZUEVfZ2V0KHNpZy0+YWxnb3ItPnBhcmFtZXRlcikgIT0gVl9BU04xX05VTEwpCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfSU5UX1JTQV9WRVJJRlksUlNBX1JfQkFEX1NJR05BVFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlzaWd0eXBlPU9CSl9vYmoybmlkKHNpZy0+YWxnb3ItPmFsZ29yaXRobSk7CisKKworCSNpZmRlZiBSU0FfREVCVUcKKwkJLyogcHV0IGEgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmbGFnIGluIEVBWSAqLworCQlmcHJpbnRmKHN0ZGVyciwiaW4oJXMpIGV4cGVjdCglcylcbiIsT0JKX25pZDJsbihzaWd0eXBlKSwKKwkJCU9CSl9uaWQybG4oZHR5cGUpKTsKKwkjZW5kaWYKKwkJaWYgKHNpZ3R5cGUgIT0gZHR5cGUpCisJCQl7CisJCQlpZiAoKChkdHlwZSA9PSBOSURfbWQ1KSAmJgorCQkJCShzaWd0eXBlID09IE5JRF9tZDVXaXRoUlNBRW5jcnlwdGlvbikpIHx8CisJCQkJKChkdHlwZSA9PSBOSURfbWQyKSAmJgorCQkJCShzaWd0eXBlID09IE5JRF9tZDJXaXRoUlNBRW5jcnlwdGlvbikpKQorCQkJCXsKKwkJCQkvKiBvaywgd2Ugd2lsbCBsZXQgaXQgdGhyb3VnaCAqLworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1RESU8pICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjE2KQorCQkJCWZwcmludGYoc3RkZXJyLCJzaWduYXR1cmUgaGFzIHByb2JsZW1zLCByZS1tYWtlIHdpdGggcG9zdCBTU0xlYXkwNDVcbiIpOworI2VuZGlmCisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlSU0FlcnIoUlNBX0ZfSU5UX1JTQV9WRVJJRlksCisJCQkJCQlSU0FfUl9BTEdPUklUSE1fTUlTTUFUQ0gpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJaWYgKHJtKQorCQkJeworCQkJY29uc3QgRVZQX01EICptZDsKKwkJCW1kID0gRVZQX2dldF9kaWdlc3RieW5pZChkdHlwZSk7CisJCQlpZiAobWQgJiYgKEVWUF9NRF9zaXplKG1kKSAhPSBzaWctPmRpZ2VzdC0+bGVuZ3RoKSkKKwkJCQlSU0FlcnIoUlNBX0ZfSU5UX1JTQV9WRVJJRlksCisJCQkJCQlSU0FfUl9JTlZBTElEX0RJR0VTVF9MRU5HVEgpOworCQkJZWxzZQorCQkJCXsKKwkJCQltZW1jcHkocm0sIHNpZy0+ZGlnZXN0LT5kYXRhLAorCQkJCQkJCXNpZy0+ZGlnZXN0LT5sZW5ndGgpOworCQkJCSpwcm1fbGVuID0gc2lnLT5kaWdlc3QtPmxlbmd0aDsKKwkJCQlyZXQgPSAxOworCQkJCX0KKwkJCX0KKwkJZWxzZSBpZiAoKCh1bnNpZ25lZCBpbnQpc2lnLT5kaWdlc3QtPmxlbmd0aCAhPSBtX2xlbikgfHwKKwkJCShtZW1jbXAobSxzaWctPmRpZ2VzdC0+ZGF0YSxtX2xlbikgIT0gMCkpCisJCQl7CisJCQlSU0FlcnIoUlNBX0ZfSU5UX1JTQV9WRVJJRlksUlNBX1JfQkFEX1NJR05BVFVSRSk7CisJCQl9CisJCWVsc2UKKwkJCXJldD0xOworCX0KK2VycjoKKwlpZiAoc2lnICE9IE5VTEwpIFg1MDlfU0lHX2ZyZWUoc2lnKTsKKwlpZiAocyAhPSBOVUxMKQorCQl7CisJCU9QRU5TU0xfY2xlYW5zZShzLCh1bnNpZ25lZCBpbnQpc2lnbGVuKTsKKwkJT1BFTlNTTF9mcmVlKHMpOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgUlNBX3ZlcmlmeShpbnQgZHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm0sIHVuc2lnbmVkIGludCBtX2xlbiwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLCB1bnNpZ25lZCBpbnQgc2lnbGVuLAorCQlSU0EgKnJzYSkKKwl7CisKKwlpZigocnNhLT5mbGFncyAmIFJTQV9GTEFHX1NJR05fVkVSKSAmJiByc2EtPm1ldGgtPnJzYV92ZXJpZnkpCisJCXsKKwkJcmV0dXJuIHJzYS0+bWV0aC0+cnNhX3ZlcmlmeShkdHlwZSwgbSwgbV9sZW4sCisJCQlzaWdidWYsIHNpZ2xlbiwgcnNhKTsKKwkJfQorCisJcmV0dXJuIGludF9yc2FfdmVyaWZ5KGR0eXBlLCBtLCBtX2xlbiwgTlVMTCwgTlVMTCwgc2lnYnVmLCBzaWdsZW4sIHJzYSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2Ffc3NsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV9zc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmVmZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2Ffc3NsLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qIGNyeXB0by9yc2EvcnNhX3NzbC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisKK2ludCBSU0FfcGFkZGluZ19hZGRfU1NMdjIzKHVuc2lnbmVkIGNoYXIgKnRvLCBpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCBpbnQgZmxlbikKKwl7CisJaW50IGksajsKKwl1bnNpZ25lZCBjaGFyICpwOworCQorCWlmIChmbGVuID4gKHRsZW4tMTEpKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19BRERfU1NMVjIzLFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisJCXJldHVybigwKTsKKwkJfQorCQorCXA9KHVuc2lnbmVkIGNoYXIgKil0bzsKKworCSoocCsrKT0wOworCSoocCsrKT0yOyAvKiBQdWJsaWMgS2V5IEJUIChCbG9jayBUeXBlKSAqLworCisJLyogcGFkIG91dCB3aXRoIG5vbi16ZXJvIHJhbmRvbSBkYXRhICovCisJaj10bGVuLTMtOC1mbGVuOworCisJaWYgKFJBTkRfYnl0ZXMocCxqKSA8PSAwKQorCQlyZXR1cm4oMCk7CisJZm9yIChpPTA7IGk8ajsgaSsrKQorCQl7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJZG8JeworCQkJCWlmIChSQU5EX2J5dGVzKHAsMSkgPD0gMCkKKwkJCQkJcmV0dXJuKDApOworCQkJCX0gd2hpbGUgKCpwID09ICdcMCcpOworCQlwKys7CisJCX0KKworCW1lbXNldChwLDMsOCk7CisJcCs9ODsKKwkqKHArKyk9J1wwJzsKKworCW1lbWNweShwLGZyb20sKHVuc2lnbmVkIGludClmbGVuKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfU1NMdjIzKHVuc2lnbmVkIGNoYXIgKnRvLCBpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCBpbnQgZmxlbiwgaW50IG51bSkKKwl7CisJaW50IGksaixrOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisKKwlwPWZyb207CisJaWYgKGZsZW4gPCAxMCkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfU1NMVjIzLFJTQV9SX0RBVEFfVE9PX1NNQUxMKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCWlmICgobnVtICE9IChmbGVuKzEpKSB8fCAoKihwKyspICE9IDAyKSkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfU1NMVjIzLFJTQV9SX0JMT0NLX1RZUEVfSVNfTk9UXzAyKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCisJLyogc2NhbiBvdmVyIHBhZGRpbmcgZGF0YSAqLworCWo9Zmxlbi0xOyAvKiBvbmUgZm9yIHR5cGUgKi8KKwlmb3IgKGk9MDsgaTxqOyBpKyspCisJCWlmICgqKHArKykgPT0gMCkgYnJlYWs7CisKKwlpZiAoKGkgPT0gaikgfHwgKGkgPCA4KSkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfU1NMVjIzLFJTQV9SX05VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcpOworCQlyZXR1cm4oLTEpOworCQl9CisJZm9yIChrID0gLTk7IGs8LTE7IGsrKykKKwkJeworCQlpZiAocFtrXSAhPSAgMHgwMykgYnJlYWs7CisJCX0KKwlpZiAoayA9PSAtMSkKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfU1NMVjIzLFJTQV9SX1NTTFYzX1JPTExCQUNLX0FUVEFDSyk7CisJCXJldHVybigtMSk7CisJCX0KKworCWkrKzsgLyogU2tpcCBvdmVyIHRoZSAnXDAnICovCisJai09aTsKKwlpZiAoaiA+IHRsZW4pCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1NTTFYyMyxSU0FfUl9EQVRBX1RPT19MQVJHRSk7CisJCXJldHVybigtMSk7CisJCX0KKwltZW1jcHkodG8scCwodW5zaWduZWQgaW50KWopOworCisJcmV0dXJuKGopOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfdGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NzA1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV90ZXN0LmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qIHRlc3QgdmVjdG9ycyBmcm9tIHAxb3ZlY3QxLnR4dCAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImVfb3MuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaWZkZWYgT1BFTlNTTF9OT19SU0EKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcHJpbnRmKCJObyBSU0Egc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorCisjZGVmaW5lIFNldEtleSBcCisgIGtleS0+biA9IEJOX2JpbjJibihuLCBzaXplb2YobiktMSwga2V5LT5uKTsgXAorICBrZXktPmUgPSBCTl9iaW4yYm4oZSwgc2l6ZW9mKGUpLTEsIGtleS0+ZSk7IFwKKyAga2V5LT5kID0gQk5fYmluMmJuKGQsIHNpemVvZihkKS0xLCBrZXktPmQpOyBcCisgIGtleS0+cCA9IEJOX2JpbjJibihwLCBzaXplb2YocCktMSwga2V5LT5wKTsgXAorICBrZXktPnEgPSBCTl9iaW4yYm4ocSwgc2l6ZW9mKHEpLTEsIGtleS0+cSk7IFwKKyAga2V5LT5kbXAxID0gQk5fYmluMmJuKGRtcDEsIHNpemVvZihkbXAxKS0xLCBrZXktPmRtcDEpOyBcCisgIGtleS0+ZG1xMSA9IEJOX2JpbjJibihkbXExLCBzaXplb2YoZG1xMSktMSwga2V5LT5kbXExKTsgXAorICBrZXktPmlxbXAgPSBCTl9iaW4yYm4oaXFtcCwgc2l6ZW9mKGlxbXApLTEsIGtleS0+aXFtcCk7IFwKKyAgbWVtY3B5KGMsIGN0ZXh0X2V4LCBzaXplb2YoY3RleHRfZXgpIC0gMSk7IFwKKyAgcmV0dXJuIChzaXplb2YoY3RleHRfZXgpIC0gMSk7CisKK3N0YXRpYyBpbnQga2V5MShSU0EgKmtleSwgdW5zaWduZWQgY2hhciAqYykKKyAgICB7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbltdID0KKyJceDAwXHhBQVx4MzZceEFCXHhDRVx4ODhceEFDXHhGRFx4RkZceDU1XHg1Mlx4M0NceDdGXHhDNFx4NTJceDNGIgorIlx4OTBceEVGXHhBMFx4MERceEYzXHg3N1x4NEFceDI1XHg5Rlx4MkVceDYyXHhCNFx4QzVceEQ5XHg5Q1x4QjUiCisiXHhBRFx4QjNceDAwXHhBMFx4MjhceDVFXHg1M1x4MDFceDkzXHgwRVx4MENceDcwXHhGQlx4NjhceDc2XHg5MyIKKyJceDlDXHhFNlx4MTZceENFXHg2Mlx4NEFceDExXHhFMFx4MDhceDZEXHgzNFx4MUVceEJDXHhBQ1x4QTBceEExIgorIlx4RjUiOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZVtdID0gIlx4MTEiOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZFtdID0KKyJceDBBXHgwM1x4MzdceDQ4XHg2Mlx4NjRceDg3XHg2OVx4NUZceDVGXHgzMFx4QkNceDM4XHhCOVx4OEJceDQ0IgorIlx4QzJceENEXHgyRFx4RkZceDQzXHg0MFx4OThceENEXHgyMFx4RDhceEExXHgzOFx4RDBceDkwXHhCRlx4NjQiCisiXHg3OVx4N0NceDNGXHhBN1x4QTJceENEXHhDQlx4M0NceEQxXHhFMFx4QkRceEJBXHgyNlx4NTRceEI0XHhGOSIKKyJceERGXHg4RVx4OEFceEU1XHg5RFx4NzNceDNEXHg5Rlx4MzNceEIzXHgwMVx4NjJceDRBXHhGRFx4MURceDUxIjsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBbXSA9CisiXHgwMFx4RDhceDQwXHhCNFx4MTZceDY2XHhCNFx4MkVceDkyXHhFQVx4MERceEEzXHhCNFx4MzJceDA0XHhCNSIKKyJceENGXHhDRVx4MzNceDUyXHg1Mlx4NERceDA0XHgxNlx4QTVceEE0XHg0MVx4RTdceDAwXHhBRlx4NDZceDEyIgorIlx4MEQiOworICAgIAorICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHFbXSA9CisiXHgwMFx4QzlceDdGXHhCMVx4RjBceDI3XHhGNFx4NTNceEY2XHgzNFx4MTJceDMzXHhFQVx4QUFceEQxXHhEOSIKKyJceDM1XHgzRlx4NkNceDQyXHhEMFx4ODhceDY2XHhCMVx4RDBceDVBXHgwRlx4MjBceDM1XHgwMlx4OEJceDlEIgorIlx4ODkiOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1wMVtdID0KKyJceDU5XHgwQlx4OTVceDcyXHhBMlx4QzJceEE5XHhDNFx4MDZceDA1XHg5RFx4QzJceEFCXHgyRlx4MURceEFGIgorIlx4RUJceDdFXHg4Qlx4NEZceDEwXHhBN1x4NTRceDlFXHg4RVx4RURceEY1XHhCNFx4RkNceEUwXHg5RVx4MDUiOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1xMVtdID0KKyJceDAwXHg4RVx4M0NceDA1XHgyMVx4RkVceDE1XHhFMFx4RUFceDA2XHhBM1x4NkZceEYwXHhGMVx4MENceDk5IgorIlx4NTJceEMzXHg1Qlx4N0FceDc1XHgxNFx4RkRceDMyXHgzOFx4QjhceDBBXHhBRFx4NTJceDk4XHg2Mlx4OEQiCisiXHg1MSI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorIlx4MzZceDNGXHhGN1x4MThceDlEXHhBOFx4RTlceDBCXHgxRFx4MzRceDFGXHg3MVx4RDBceDlCXHg3Nlx4QTgiCisiXHhBOVx4NDNceEUxXHgxRFx4MTBceEIyXHg0RFx4MjRceDlGXHgyRFx4RUFceEZFXHhGOFx4MENceDE4XHgyNiI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBjdGV4dF9leFtdID0KKyJceDFiXHg4Zlx4MDVceGY5XHhjYVx4MWFceDc5XHg1Mlx4NmVceDUzXHhmM1x4Y2NceDUxXHg0Zlx4ZGJceDg5IgorIlx4MmJceGZiXHg5MVx4OTNceDIzXHgxZVx4NzhceGI5XHg5Mlx4ZTZceDhkXHg1MFx4YTRceDgwXHhjYlx4NTIiCisiXHgzM1x4ODlceDVjXHg3NFx4OTVceDhkXHg1ZFx4MDJceGFiXHg4Y1x4MGZceGQwXHg0MFx4ZWJceDU4XHg0NCIKKyJceGIwXHgwNVx4YzNceDllXHhkOFx4MjdceDRhXHg5ZFx4YmZceGE4XHgwNlx4NzFceDQwXHg5NFx4MzlceGQyIjsKKworICAgIFNldEtleTsKKyAgICB9CisKK3N0YXRpYyBpbnQga2V5MihSU0EgKmtleSwgdW5zaWduZWQgY2hhciAqYykKKyAgICB7CisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbltdID0KKyJceDAwXHhBM1x4MDdceDlBXHg5MFx4REZceDBEXHhGRFx4NzJceEFDXHgwOVx4MENceENDXHgyQVx4NzhceEI4IgorIlx4NzRceDEzXHgxM1x4M0VceDQwXHg3NVx4OUNceDk4XHhGQVx4RjhceDIwXHg0Rlx4MzVceDhBXHgwQlx4MjYiCisiXHgzQ1x4NjdceDcwXHhFN1x4ODNceEE5XHgzQlx4NjlceDcxXHhCN1x4MzdceDc5XHhEMlx4NzFceDdCXHhFOCIKKyJceDM0XHg3N1x4Q0YiOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZVtdID0gIlx4MyI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBkW10gPQorIlx4NkNceEFGXHhCQ1x4NjBceDk0XHhCM1x4RkVceDRDXHg3Mlx4QjBceEIzXHgzMlx4QzZceEZCXHgyNVx4QTIiCisiXHhCN1x4NjJceDI5XHg4MFx4NEVceDY4XHg2NVx4RkNceEE0XHg1QVx4NzRceERGXHgwRlx4OEZceEI4XHg0MSIKKyJceDNCXHg1Mlx4QzBceEQwXHhFNVx4M0RceDlCXHg1OVx4MEZceEYxXHg5Qlx4RTdceDlGXHg0OVx4RERceDIxIgorIlx4RTVceEVCIjsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHBbXSA9CisiXHgwMFx4Q0ZceDIwXHgzNVx4MDJceDhCXHg5RFx4ODZceDk4XHg0MFx4QjRceDE2XHg2Nlx4QjRceDJFXHg5MiIKKyJceEVBXHgwRFx4QTNceEI0XHgzMlx4MDRceEI1XHhDRlx4Q0VceDkxIjsKKworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHFbXSA9CisiXHgwMFx4QzlceDdGXHhCMVx4RjBceDI3XHhGNFx4NTNceEY2XHgzNFx4MTJceDMzXHhFQVx4QUFceEQxXHhEOSIKKyJceDM1XHgzRlx4NkNceDQyXHhEMFx4ODhceDY2XHhCMVx4RDBceDVGIjsKKyAgICAKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBkbXAxW10gPQorIlx4MDBceDhBXHgxNVx4NzhceEFDXHg1RFx4MTNceEFGXHgxMFx4MkJceDIyXHhCOVx4OTlceENEXHg3NFx4NjEiCisiXHhGMVx4NUVceDZEXHgyMlx4Q0NceDAzXHgyM1x4REZceERGXHgwQiI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBkbXExW10gPQorIlx4MDBceDg2XHg1NVx4MjFceDRBXHhDNVx4NERceDhEXHg0RVx4Q0RceDYxXHg3N1x4RjFceEM3XHgzNlx4OTAiCisiXHhDRVx4MkFceDQ4XHgyQ1x4OEJceDA1XHg5OVx4Q0JceEUwXHgzRiI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorIlx4MDBceDgzXHhFRlx4RUZceEI4XHhBOVx4QTRceDBEXHgxRFx4QjZceEVEXHg5OFx4QURceDg0XHhFRFx4MTMiCisiXHgzNVx4RENceEMxXHgwOFx4RjNceDIyXHhEMFx4NTdceENGXHg4RCI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBjdGV4dF9leFtdID0KKyJceDE0XHhiZFx4ZGRceDI4XHhjOVx4ODNceDM1XHgxOVx4MjNceDgwXHhlOFx4ZTVceDQ5XHhiMVx4NThceDJhIgorIlx4OGJceDQwXHhiNFx4NDhceDZkXHgwM1x4YTZceGE1XHgzMVx4MWZceDFmXHhkNVx4ZjBceGExXHg4MFx4ZTQiCisiXHgxN1x4NTNceDAzXHgyOVx4YTlceDM0XHg5MFx4NzRceGIxXHg1Mlx4MTNceDU0XHgyOVx4MDhceDI0XHg1MiIKKyJceDYyXHg1MSI7CisKKyAgICBTZXRLZXk7CisgICAgfQorCitzdGF0aWMgaW50IGtleTMoUlNBICprZXksIHVuc2lnbmVkIGNoYXIgKmMpCisgICAgeworICAgIHN0YXRpYyB1bnNpZ25lZCBjaGFyIG5bXSA9CisiXHgwMFx4QkJceEY4XHgyRlx4MDlceDA2XHg4Mlx4Q0VceDlDXHgyM1x4MzhceEFDXHgyQlx4OURceEE4XHg3MSIKKyJceEY3XHgzNlx4OERceDA3XHhFRVx4RDRceDEwXHg0M1x4QTRceDQwXHhENlx4QjZceEYwXHg3NFx4NTRceEY1IgorIlx4MUZceEI4XHhERlx4QkFceEFGXHgwM1x4NUNceDAyXHhBQlx4NjFceEVBXHg0OFx4Q0VceEVCXHg2Rlx4Q0QiCisiXHg0OFx4NzZceEVEXHg1Mlx4MERceDYwXHhFMVx4RUNceDQ2XHgxOVx4NzFceDlEXHg4QVx4NUJceDhCXHg4MCIKKyJceDdGXHhBRlx4QjhceEUwXHhBM1x4REZceEM3XHgzN1x4NzJceDNFXHhFNlx4QjRceEI3XHhEOVx4M0FceDI1IgorIlx4ODRceEVFXHg2QVx4NjRceDlEXHgwNlx4MDlceDUzXHg3NFx4ODhceDM0XHhCMlx4NDVceDQ1XHg5OFx4MzkiCisiXHg0RVx4RTBceEFBXHhCMVx4MkRceDdCXHg2MVx4QTVceDFGXHg1Mlx4N0FceDlBXHg0MVx4RjZceEMxXHg2OCIKKyJceDdGXHhFMlx4NTNceDcyXHg5OFx4Q0FceDJBXHg4Rlx4NTlceDQ2XHhGOFx4RTVceEZEXHgwOVx4MURceEJEIgorIlx4Q0IiOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZVtdID0gIlx4MTEiOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZFtdID0KKyJceDAwXHhBNVx4REFceEZDXHg1M1x4NDFceEZBXHhGMlx4ODlceEM0XHhCOVx4ODhceERCXHgzMFx4QzFceENEIgorIlx4RjhceDNGXHgzMVx4MjVceDFFXHgwNlx4NjhceEI0XHgyN1x4ODRceDgxXHgzOFx4MDFceDU3XHg5Nlx4NDEiCisiXHhCMlx4OTRceDEwXHhCM1x4QzdceDk5XHg4RFx4NkJceEM0XHg2NVx4NzRceDVFXHg1Q1x4MzlceDI2XHg2OSIKKyJceEQ2XHg4N1x4MERceEEyXHhDMFx4ODJceEE5XHgzOVx4RTNceDdGXHhEQ1x4QjhceDJFXHhDOVx4M0VceERBIgorIlx4QzlceDdGXHhGM1x4QURceDU5XHg1MFx4QUNceENGXHhCQ1x4MTFceDFDXHg3Nlx4RjFceEE5XHg1Mlx4OTQiCisiXHg0NFx4RTVceDZBXHhBRlx4NjhceEM1XHg2Q1x4MDlceDJDXHhEM1x4OERceEMzXHhCRVx4RjVceEQyXHgwQSIKKyJceDkzXHg5OVx4MjZceEVEXHg0Rlx4NzRceEExXHgzRVx4RERceEZCXHhFMVx4QTFceENFXHhDQ1x4NDhceDk0IgorIlx4QUZceDk0XHgyOFx4QzJceEI3XHhCOFx4ODhceDNGXHhFNFx4NDZceDNBXHg0Qlx4QzhceDVCXHgxQ1x4QjMiCisiXHhDMSI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBwW10gPQorIlx4MDBceEVFXHhDRlx4QUVceDgxXHhCMVx4QjlceEIzXHhDOVx4MDhceDgxXHgwQlx4MTBceEExXHhCNVx4NjAiCisiXHgwMVx4OTlceEVCXHg5Rlx4NDRceEFFXHhGNFx4RkRceEE0XHg5M1x4QjhceDFBXHg5RVx4M0RceDg0XHhGNiIKKyJceDMyXHgxMlx4NEVceEYwXHgyM1x4NkVceDVEXHgxRVx4M0JceDdFXHgyOFx4RkFceEU3XHhBQVx4MDRceDBBIgorIlx4MkRceDVCXHgyNVx4MjFceDc2XHg0NVx4OURceDFGXHgzOVx4NzVceDQxXHhCQVx4MkFceDU4XHhGQlx4NjUiCisiXHg5OSI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBxW10gPQorIlx4MDBceEM5XHg3Rlx4QjFceEYwXHgyN1x4RjRceDUzXHhGNlx4MzRceDEyXHgzM1x4RUFceEFBXHhEMVx4RDkiCisiXHgzNVx4M0ZceDZDXHg0Mlx4RDBceDg4XHg2Nlx4QjFceEQwXHg1QVx4MEZceDIwXHgzNVx4MDJceDhCXHg5RCIKKyJceDg2XHg5OFx4NDBceEI0XHgxNlx4NjZceEI0XHgyRVx4OTJceEVBXHgwRFx4QTNceEI0XHgzMlx4MDRceEI1IgorIlx4Q0ZceENFXHgzM1x4NTJceDUyXHg0RFx4MDRceDE2XHhBNVx4QTRceDQxXHhFN1x4MDBceEFGXHg0Nlx4MTUiCisiXHgwMyI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBkbXAxW10gPQorIlx4NTRceDQ5XHg0Q1x4QTZceDNFXHhCQVx4MDNceDM3XHhFNFx4RTJceDQwXHgyM1x4RkNceEQ2XHg5QVx4NUEiCisiXHhFQlx4MDdceEREXHhEQ1x4MDFceDgzXHhBNFx4RDBceEFDXHg5Qlx4NTRceEIwXHg1MVx4RjJceEIxXHgzRSIKKyJceEQ5XHg0OVx4MDlceDc1XHhFQVx4QjdceDc0XHgxNFx4RkZceDU5XHhDMVx4RjdceDY5XHgyRVx4OUFceDJFIgorIlx4MjBceDJCXHgzOFx4RkNceDkxXHgwQVx4NDdceDQxXHg3NFx4QURceEM5XHgzQ1x4MUZceDY3XHhDOVx4ODEiOworCisgICAgc3RhdGljIHVuc2lnbmVkIGNoYXIgZG1xMVtdID0KKyJceDQ3XHgxRVx4MDJceDkwXHhGRlx4MEFceEYwXHg3NVx4MDNceDUxXHhCN1x4RjhceDc4XHg4Nlx4NENceEE5IgorIlx4NjFceEFEXHhCRFx4M0FceDhBXHg3RVx4OTlceDFDXHg1Q1x4MDVceDU2XHhBOVx4NENceDMxXHg0Nlx4QTciCisiXHhGOVx4ODBceDNGXHg4Rlx4NkZceDhBXHhFM1x4NDJceEU5XHgzMVx4RkRceDhBXHhFNFx4N0FceDIyXHgwRCIKKyJceDFCXHg5OVx4QTRceDk1XHg4NFx4OThceDA3XHhGRVx4MzlceEY5XHgyNFx4NUFceDk4XHgzNlx4REFceDNEIjsKKyAgICAKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBpcW1wW10gPQorIlx4MDBceEIwXHg2Q1x4NEZceERBXHhCQlx4NjNceDAxXHgxOVx4OERceDI2XHg1Qlx4REJceEFFXHg5NFx4MjMiCisiXHhCM1x4ODBceEYyXHg3MVx4RjdceDM0XHg1M1x4ODhceDUwXHg5M1x4MDdceDdGXHhDRFx4MzlceEUyXHgxMSIKKyJceDlGXHhDOVx4ODZceDMyXHgxNVx4NEZceDU4XHg4M1x4QjFceDY3XHhBOVx4NjdceEJGXHg0MFx4MkJceDRFIgorIlx4OUVceDJFXHgwRlx4OTZceDU2XHhFNlx4OThceEVBXHgzNlx4NjZceEVEXHhGQlx4MjVceDc5XHg4MFx4MzkiCisiXHhGNyI7CisKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBjdGV4dF9leFtdID0KKyJceGI4XHgyNFx4NmJceDU2XHhhNlx4ZWRceDU4XHg4MVx4YWVceGI1XHg4NVx4ZDlceGEyXHg1Ylx4MmFceGQ3IgorIlx4OTBceGM0XHgxN1x4ZTBceDgwXHg2OFx4MWJceGYxXHhhY1x4MmJceGMzXHhkZVx4YjZceDlkXHg4Ylx4Y2UiCisiXHhmMFx4YzRceDM2XHg2Zlx4ZWNceDQwXHgwYVx4ZjBceDUyXHhhN1x4MmVceDliXHgwZVx4ZmZceGI1XHhiMyIKKyJceGYyXHhmMVx4OTJceGRiXHhlYVx4Y2FceDAzXHhjMVx4MjdceDQwXHgwNVx4NzFceDEzXHhiZlx4MWZceDA2IgorIlx4NjlceGFjXHgyMlx4ZTlceGYzXHhhN1x4ODVceDJlXHgzY1x4MTVceGQ5XHgxM1x4Y2FceGIwXHhiOFx4ODYiCisiXHgzYVx4OTVceGM5XHg5Mlx4OTRceGNlXHg4Nlx4NzRceDIxXHg0OVx4NTRceDYxXHgwM1x4NDZceGY0XHhkNCIKKyJceDc0XHhiMlx4NmZceDdjXHg0OFx4YjRceDJlXHhlNlx4OGVceDFmXHg1N1x4MmFceDFmXHhjNFx4MDJceDZhIgorIlx4YzRceDU2XHhiNFx4ZjVceDlmXHg3Ylx4NjJceDFlXHhhMVx4YjlceGQ4XHg4Zlx4NjRceDIwXHgyZlx4YjEiOworCisgICAgU2V0S2V5OworICAgIH0KKworc3RhdGljIGludCBwYWRfdW5rbm93bih2b2lkKQoreworICAgIHVuc2lnbmVkIGxvbmcgbDsKKyAgICB3aGlsZSAoKGwgPSBFUlJfZ2V0X2Vycm9yKCkpICE9IDApCisgICAgICBpZiAoRVJSX0dFVF9SRUFTT04obCkgPT0gUlNBX1JfVU5LTk9XTl9QQURESU5HX1RZUEUpCisJcmV0dXJuKDEpOworICAgIHJldHVybigwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgcm5kX3NlZWRbXSA9ICJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHkiOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorICAgIHsKKyAgICBpbnQgZXJyPTA7CisgICAgaW50IHY7CisgICAgUlNBICprZXk7CisgICAgdW5zaWduZWQgY2hhciBwdGV4dFsyNTZdOworICAgIHVuc2lnbmVkIGNoYXIgY3RleHRbMjU2XTsKKyAgICBzdGF0aWMgdW5zaWduZWQgY2hhciBwdGV4dF9leFtdID0gIlx4NTRceDg1XHg5Ylx4MzRceDJjXHg0OVx4ZWFceDJhIjsKKyAgICB1bnNpZ25lZCBjaGFyIGN0ZXh0X2V4WzI1Nl07CisgICAgaW50IHBsZW47CisgICAgaW50IGNsZW4gPSAwOworICAgIGludCBudW07CisgICAgaW50IG47CisKKyAgICBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKTsKKyAgICBDUllQVE9fZGJnX3NldF9vcHRpb25zKFZfQ1JZUFRPX01ERUJVR19BTEwpOworICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09OKTsKKworICAgIFJBTkRfc2VlZChybmRfc2VlZCwgc2l6ZW9mIHJuZF9zZWVkKTsgLyogb3IgT0FFUCBtYXkgZmFpbCAqLworCisgICAgcGxlbiA9IHNpemVvZihwdGV4dF9leCkgLSAxOworCisgICAgZm9yICh2ID0gMDsgdiA8IDY7IHYrKykKKwl7CisJa2V5ID0gUlNBX25ldygpOworCXN3aXRjaCAodiUzKSB7CisgICAgY2FzZSAwOgorCWNsZW4gPSBrZXkxKGtleSwgY3RleHRfZXgpOworCWJyZWFrOworICAgIGNhc2UgMToKKwljbGVuID0ga2V5MihrZXksIGN0ZXh0X2V4KTsKKwlicmVhazsKKyAgICBjYXNlIDI6CisJY2xlbiA9IGtleTMoa2V5LCBjdGV4dF9leCk7CisJYnJlYWs7CisJfQorCWlmICh2LzMgPj0gMSkga2V5LT5mbGFncyB8PSBSU0FfRkxBR19OT19DT05TVFRJTUU7CisKKwludW0gPSBSU0FfcHVibGljX2VuY3J5cHQocGxlbiwgcHRleHRfZXgsIGN0ZXh0LCBrZXksCisJCQkJIFJTQV9QS0NTMV9QQURESU5HKTsKKwlpZiAobnVtICE9IGNsZW4pCisJICAgIHsKKwkgICAgcHJpbnRmKCJQS0NTIzEgdjEuNSBlbmNyeXB0aW9uIGZhaWxlZCFcbiIpOworCSAgICBlcnI9MTsKKwkgICAgZ290byBvYWVwOworCSAgICB9CisgIAorCW51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjdGV4dCwgcHRleHQsIGtleSwKKwkJCQkgIFJTQV9QS0NTMV9QQURESU5HKTsKKwlpZiAobnVtICE9IHBsZW4gfHwgbWVtY21wKHB0ZXh0LCBwdGV4dF9leCwgbnVtKSAhPSAwKQorCSAgICB7CisJICAgIHByaW50ZigiUEtDUyMxIHYxLjUgZGVjcnlwdGlvbiBmYWlsZWQhXG4iKTsKKwkgICAgZXJyPTE7CisJICAgIH0KKwllbHNlCisJICAgIHByaW50ZigiUEtDUyAjMSB2MS41IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBva1xuIik7CisKKyAgICBvYWVwOgorCUVSUl9jbGVhcl9lcnJvcigpOworCW51bSA9IFJTQV9wdWJsaWNfZW5jcnlwdChwbGVuLCBwdGV4dF9leCwgY3RleHQsIGtleSwKKwkJCQkgUlNBX1BLQ1MxX09BRVBfUEFERElORyk7CisJaWYgKG51bSA9PSAtMSAmJiBwYWRfdW5rbm93bigpKQorCSAgICB7CisJICAgIHByaW50ZigiTm8gT0FFUCBzdXBwb3J0XG4iKTsKKwkgICAgZ290byBuZXh0OworCSAgICB9CisJaWYgKG51bSAhPSBjbGVuKQorCSAgICB7CisJICAgIHByaW50ZigiT0FFUCBlbmNyeXB0aW9uIGZhaWxlZCFcbiIpOworCSAgICBlcnI9MTsKKwkgICAgZ290byBuZXh0OworCSAgICB9CisKKwludW0gPSBSU0FfcHJpdmF0ZV9kZWNyeXB0KG51bSwgY3RleHQsIHB0ZXh0LCBrZXksCisJCQkJICBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKwlpZiAobnVtICE9IHBsZW4gfHwgbWVtY21wKHB0ZXh0LCBwdGV4dF9leCwgbnVtKSAhPSAwKQorCSAgICB7CisJICAgIHByaW50ZigiT0FFUCBkZWNyeXB0aW9uIChlbmNyeXB0ZWQgZGF0YSkgZmFpbGVkIVxuIik7CisJICAgIGVycj0xOworCSAgICB9CisJZWxzZSBpZiAobWVtY21wKGN0ZXh0LCBjdGV4dF9leCwgbnVtKSA9PSAwKQorCSAgICBwcmludGYoIk9BRVAgdGVzdCB2ZWN0b3IgJWQgcGFzc2VkIVxuIiwgdik7CisgICAgCisJLyogRGlmZmVyZW50IGNpcGhlcnRleHRzIChyc2Ffb2FlcC5jIHdpdGhvdXQgLURQS0NTX1RFU1RWRUNUKS4KKwkgICBUcnkgZGVjcnlwdGluZyBjdGV4dF9leCAqLworCisJbnVtID0gUlNBX3ByaXZhdGVfZGVjcnlwdChjbGVuLCBjdGV4dF9leCwgcHRleHQsIGtleSwKKwkJCQkgIFJTQV9QS0NTMV9PQUVQX1BBRERJTkcpOworCisJaWYgKG51bSAhPSBwbGVuIHx8IG1lbWNtcChwdGV4dCwgcHRleHRfZXgsIG51bSkgIT0gMCkKKwkgICAgeworCSAgICBwcmludGYoIk9BRVAgZGVjcnlwdGlvbiAodGVzdCB2ZWN0b3IgZGF0YSkgZmFpbGVkIVxuIik7CisJICAgIGVycj0xOworCSAgICB9CisJZWxzZQorCSAgICBwcmludGYoIk9BRVAgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIG9rXG4iKTsKKworCS8qIFRyeSBkZWNyeXB0aW5nIGNvcnJ1cHRlZCBjaXBoZXJ0ZXh0cyAqLworCWZvcihuID0gMCA7IG4gPCBjbGVuIDsgKytuKQorCSAgICB7CisJICAgIGludCBiOworCSAgICB1bnNpZ25lZCBjaGFyIHNhdmVkID0gY3RleHRbbl07CisJICAgIGZvcihiID0gMCA7IGIgPCAyNTYgOyArK2IpCisJCXsKKwkJaWYoYiA9PSBzYXZlZCkKKwkJICAgIGNvbnRpbnVlOworCQljdGV4dFtuXSA9IGI7CisJCW51bSA9IFJTQV9wcml2YXRlX2RlY3J5cHQobnVtLCBjdGV4dCwgcHRleHQsIGtleSwKKwkJCQkJICBSU0FfUEtDUzFfT0FFUF9QQURESU5HKTsKKwkJaWYobnVtID4gMCkKKwkJICAgIHsKKwkJICAgIHByaW50ZigiQ29ycnVwdCBkYXRhIGRlY3J5cHRlZCFcbiIpOworCQkgICAgZXJyID0gMTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisgICAgbmV4dDoKKwlSU0FfZnJlZShrZXkpOworCX0KKworICAgIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCk7CisgICAgRVJSX3JlbW92ZV90aHJlYWRfc3RhdGUoTlVMTCk7CisKKyAgICBDUllQVE9fbWVtX2xlYWtzX2ZwKHN0ZGVycik7CisKKyNpZmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisgICAgaWYgKGVycikgcHJpbnRmKCJFUlJPUjogJWRcbiIsIGVycik7CisjZW5kaWYKKyAgICByZXR1cm4gZXJyOworICAgIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfeDkzMS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3JzYS9yc2FfeDkzMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTQ4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vcnNhL3JzYV94OTMxLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qIHJzYV94OTMxLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA1LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKK2ludCBSU0FfcGFkZGluZ19hZGRfWDkzMSh1bnNpZ25lZCBjaGFyICp0bywgaW50IHRsZW4sCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLCBpbnQgZmxlbikKKwl7CisJaW50IGo7CisJdW5zaWduZWQgY2hhciAqcDsKKworCS8qIEFic29sdXRlIG1pbmltdW0gYW1vdW50IG9mIHBhZGRpbmcgaXMgMSBoZWFkZXIgbmliYmxlLCAxIHBhZGRpbmcKKwkgKiBuaWJibGUgYW5kIDIgdHJhaWxlciBieXRlczogYnV0IDEgaGFzaCBpZiBpcyBhbHJlYWR5IGluICdmcm9tJy4KKwkgKi8KKworCWogPSB0bGVuIC0gZmxlbiAtIDI7CisKKwlpZiAoaiA8IDApCisJCXsKKwkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0FERF9YOTMxLFJTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRSk7CisJCXJldHVybiAtMTsKKwkJfQorCQorCXA9KHVuc2lnbmVkIGNoYXIgKil0bzsKKworCS8qIElmIG5vIHBhZGRpbmcgc3RhcnQgYW5kIGVuZCBuaWJibGVzIGFyZSBpbiBvbmUgYnl0ZSAqLworCWlmIChqID09IDApCisJCSpwKysgPSAweDZBOworCWVsc2UKKwkJeworCQkqcCsrID0gMHg2QjsKKwkJaWYgKGogPiAxKQorCQkJeworCQkJbWVtc2V0KHAsIDB4QkIsIGogLSAxKTsKKwkJCXAgKz0gaiAtIDE7CisJCQl9CisJCSpwKysgPSAweEJBOworCQl9CisJbWVtY3B5KHAsZnJvbSwodW5zaWduZWQgaW50KWZsZW4pOworCXAgKz0gZmxlbjsKKwkqcCA9IDB4Q0M7CisJcmV0dXJuKDEpOworCX0KKworaW50IFJTQV9wYWRkaW5nX2NoZWNrX1g5MzEodW5zaWduZWQgY2hhciAqdG8sIGludCB0bGVuLAorCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgaW50IGZsZW4sIGludCBudW0pCisJeworCWludCBpID0gMCxqOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisKKwlwPWZyb207CisJaWYgKChudW0gIT0gZmxlbikgfHwgKCgqcCAhPSAweDZBKSAmJiAoKnAgIT0gMHg2QikpKQorCQl7CisJCVJTQWVycihSU0FfRl9SU0FfUEFERElOR19DSEVDS19YOTMxLFJTQV9SX0lOVkFMSURfSEVBREVSKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwlpZiAoKnArKyA9PSAweDZCKQorCQl7CisJCWo9Zmxlbi0zOworCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKQorCQkJeworCQkJdW5zaWduZWQgY2hhciBjID0gKnArKzsKKwkJCWlmIChjID09IDB4QkEpCisJCQkJYnJlYWs7CisJCQlpZiAoYyAhPSAweEJCKQorCQkJCXsKKwkJCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfWDkzMSwKKwkJCQkJUlNBX1JfSU5WQUxJRF9QQURESU5HKTsKKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCisJCWogLT0gaTsKKworCQlpZiAoaSA9PSAwKQorCQkJeworCQkJUlNBZXJyKFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1g5MzEsIFJTQV9SX0lOVkFMSURfUEFERElORyk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJfQorCWVsc2UgaiA9IGZsZW4gLSAyOworCisJaWYgKHBbal0gIT0gMHhDQykKKwkJeworCQlSU0FlcnIoUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfWDkzMSwgUlNBX1JfSU5WQUxJRF9UUkFJTEVSKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwltZW1jcHkodG8scCwodW5zaWduZWQgaW50KWopOworCisJcmV0dXJuKGopOworCX0KKworLyogVHJhbnNsYXRlIGJldHdlZW4gWDkzMSBoYXNoIGlkcyBhbmQgTklEcyAqLworCitpbnQgUlNBX1g5MzFfaGFzaF9pZChpbnQgbmlkKQorCXsKKwlzd2l0Y2ggKG5pZCkKKwkJeworCQljYXNlIE5JRF9zaGExOgorCQlyZXR1cm4gMHgzMzsKKworCQljYXNlIE5JRF9zaGEyNTY6CisJCXJldHVybiAweDM0OworCisJCWNhc2UgTklEX3NoYTM4NDoKKwkJcmV0dXJuIDB4MzY7CisKKwkJY2FzZSBOSURfc2hhNTEyOgorCQlyZXR1cm4gMHgzNTsKKworCQl9CisJcmV0dXJuIC0xOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3MzOTB4Y2FwLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vczM5MHhjYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmJlMDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3MzOTB4Y2FwLmMKQEAgLTAsMCArMSwzNyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIE9QRU5TU0xfczM5MHhjYXBfUDsKKworc3RhdGljIHNpZ2ptcF9idWYgaWxsX2ptcDsKK3N0YXRpYyB2b2lkIGlsbF9oYW5kbGVyIChpbnQgc2lnKSB7IHNpZ2xvbmdqbXAoaWxsX2ptcCxzaWcpOyB9CisKK3Vuc2lnbmVkIGxvbmcgT1BFTlNTTF9zMzkweF9mYWNpbGl0aWVzKHZvaWQpOworCit2b2lkIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCkKKwl7CisJc2lnc2V0X3Qgb3NldDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGlsbF9hY3Qsb2FjdDsKKworCWlmIChPUEVOU1NMX3MzOTB4Y2FwX1ApIHJldHVybjsKKworCW1lbXNldCgmaWxsX2FjdCwwLHNpemVvZihpbGxfYWN0KSk7CisJaWxsX2FjdC5zYV9oYW5kbGVyID0gaWxsX2hhbmRsZXI7CisJc2lnZmlsbHNldCgmaWxsX2FjdC5zYV9tYXNrKTsKKwlzaWdkZWxzZXQoJmlsbF9hY3Quc2FfbWFzayxTSUdJTEwpOworCXNpZ2RlbHNldCgmaWxsX2FjdC5zYV9tYXNrLFNJR1RSQVApOworCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCZpbGxfYWN0LnNhX21hc2ssJm9zZXQpOworCXNpZ2FjdGlvbiAoU0lHSUxMLCZpbGxfYWN0LCZvYWN0KTsKKworCS8qIHByb3RlY3Rpb24gYWdhaW5zdCBtaXNzaW5nIHN0b3JlLWZhY2lsaXR5LWxpc3QtZXh0ZW5kZWQgKi8KKwlpZiAoc2lnc2V0am1wKGlsbF9qbXAsMCkgPT0gMCkKKwkJT1BFTlNTTF9zMzkweGNhcF9QID0gT1BFTlNTTF9zMzkweF9mYWNpbGl0aWVzKCk7CisJZWxzZQorCQlPUEVOU1NMX3MzOTB4Y2FwX1AgPSAxVUw8PDYzOworCisJc2lnYWN0aW9uIChTSUdJTEwsJm9hY3QsTlVMTCk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssJm9zZXQsTlVMTCk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3MzOTB4Y3B1aWQuUyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zMzkweGNwdWlkLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1M2M2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zMzkweGNwdWlkLlMKQEAgLTAsMCArMSw5MiBAQAorLnRleHQKKworLmdsb2JsCU9QRU5TU0xfczM5MHhfZmFjaWxpdGllcworLnR5cGUJT1BFTlNTTF9zMzkweF9mYWNpbGl0aWVzLEBmdW5jdGlvbgorLmFsaWduCTE2CitPUEVOU1NMX3MzOTB4X2ZhY2lsaXRpZXM6CisJbGdoaQklcjAsMAorCS5sb25nCTB4YjJiMGYwMTAJIyBzdGZsZQkxNiglcjE1KQorCWxnCSVyMiwxNiglcjE1KQorCWxhcmwJJXIxLE9QRU5TU0xfczM5MHhjYXBfUAorCXN0ZwklcjIsMCglcjEpCisJYnIJJXIxNAorLnNpemUJT1BFTlNTTF9zMzkweF9mYWNpbGl0aWVzLC4tT1BFTlNTTF9zMzkweF9mYWNpbGl0aWVzCisKKy5nbG9ibAlPUEVOU1NMX3JkdHNjCisudHlwZQlPUEVOU1NMX3JkdHNjLEBmdW5jdGlvbgorLmFsaWduCTE2CitPUEVOU1NMX3JkdHNjOgorCXN0Y2sJMTYoJXIxNSkKKwlsZwklcjIsMTYoJXIxNSkKKwlicgklcjE0Cisuc2l6ZQlPUEVOU1NMX3JkdHNjLC4tT1BFTlNTTF9yZHRzYworCisuZ2xvYmwJT1BFTlNTTF9hdG9taWNfYWRkCisudHlwZQlPUEVOU1NMX2F0b21pY19hZGQsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK09QRU5TU0xfYXRvbWljX2FkZDoKKwlsCSVyMSwwKCVyMikKKy5Mc3BpbjoJbHIJJXIwLCVyMQorCWFyCSVyMCwlcjMKKwljcwklcjEsJXIwLDAoJXIyKQorCWJyYwk0LC5Mc3BpbgorCWxnZnIJJXIyLCVyMAkJIyBPcGVuU1NMIGV4cGVjdHMgdGhlIG5ldyB2YWx1ZQorCWJyCSVyMTQKKy5zaXplCU9QRU5TU0xfYXRvbWljX2FkZCwuLU9QRU5TU0xfYXRvbWljX2FkZAorCisuZ2xvYmwJT1BFTlNTTF93aXBlX2NwdQorLnR5cGUJT1BFTlNTTF93aXBlX2NwdSxAZnVuY3Rpb24KKy5hbGlnbgkxNgorT1BFTlNTTF93aXBlX2NwdToKKwl4Z3IJJXIwLCVyMAorCXhncgklcjEsJXIxCisJbGdyCSVyMiwlcjE1CisJeGdyCSVyMywlcjMKKwl4Z3IJJXI0LCVyNAorCWx6ZHIJJWYwCisJbHpkcgklZjEKKwlsemRyCSVmMgorCWx6ZHIJJWYzCisJbHpkcgklZjQKKwlsemRyCSVmNQorCWx6ZHIJJWY2CisJbHpkcgklZjcKKwlicgklcjE0Cisuc2l6ZQlPUEVOU1NMX3dpcGVfY3B1LC4tT1BFTlNTTF93aXBlX2NwdQorCisuZ2xvYmwJT1BFTlNTTF9jbGVhbnNlCisudHlwZQlPUEVOU1NMX2NsZWFuc2UsQGZ1bmN0aW9uCisuYWxpZ24JMTYKK09QRU5TU0xfY2xlYW5zZToKKwlsZ2hpCSVyNCwxNQorCWxnaGkJJXIwLDAKKwljbGdyCSVyMywlcjQKKwlqaAkuTG90CisJY2xncgklcjMsJXIwCisJYmNyCTgsJXIxNAorLkxpdHRsZToKKwlzdGMJJXIwLDAoJXIyKQorCWxhCSVyMiwxKCVyMikKKwlicmN0ZwklcjMsLkxpdHRsZQorCWJyCSVyMTQKKy5hbGlnbgk0CisuTG90Ogl0bWxsCSVyMiw3CisJanoJLkxhbGlnbmVkCisJc3RjCSVyMCwwKCVyMikKKwlsYQklcjIsMSglcjIpCisJYnJjdGcJJXIzLC5Mb3QKKy5MYWxpZ25lZDoKKwlzcmxnCSVyNCwlcjMsMworLkxvb3A6CXN0ZwklcjAsMCglcjIpCisJbGEJJXIyLDgoJXIyKQorCWJyY3RnCSVyNCwuTG9vcAorCWxnaGkJJXI0LDcKKwluZ3IJJXIzLCVyNAorCWpuegkuTGl0dGxlCisJYnIJJXIxNAorLnNpemUJT1BFTlNTTF9jbGVhbnNlLC4tT1BFTlNTTF9jbGVhbnNlCisKKy5zZWN0aW9uCS5pbml0CisJYnJhc2wJJXIxNCxPUEVOU1NMX2NwdWlkX3NldHVwCisKKy5jb21tCU9QRU5TU0xfczM5MHhjYXBfUCw4LDgKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL1JFQURNRSBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2U3NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vUkVBRE1FCkBAIC0wLDAgKzEgQEAKK0MyLnBsIHdvcmtzCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLTU4Ni5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjg3NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLTU4Ni5wbApAQCAtMCwwICsxLDIyMCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFtSZV13cml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyAiW1JlXXdyaXR0ZW4iIHdhcyBhY2hpZXZlZCBpbiB0d28gbWFqb3Igb3ZlcmhhdWxzLiBJbiAyMDA0IEJPRFlfKgorIyBmdW5jdGlvbnMgd2VyZSByZS1pbXBsZW1lbnRlZCB0byBhZGRyZXNzIFA0IHBlcmZvcm1hbmNlIGlzc3VlIFtzZWUKKyMgY29tbWVudGFyeSBiZWxvd10sIGFuZCBpbiAyMDA2IHRoZSByZXN0IHdhcyByZXdyaXR0ZW4gaW4gb3JkZXIgdG8KKyMgZ2FpbiBmcmVlZG9tIHRvIGxpYmVyYXRlIGxpY2Vuc2luZyB0ZXJtcy4KKworIyBJdCB3YXMgbm90ZWQgdGhhdCBJbnRlbCBJQS0zMiBDIGNvbXBpbGVyIGdlbmVyYXRlcyBjb2RlIHdoaWNoCisjIHBlcmZvcm1zIH4zMCUgKmZhc3Rlciogb24gUDQgQ1BVIHRoYW4gb3JpZ2luYWwgKmhhbmQtY29kZWQqCisjIFNIQTEgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLiBUbyBhZGRyZXNzIHRoaXMgcHJvYmxlbSAoYW5kCisjIHByb3ZlIHRoYXQgaHVtYW5zIGFyZSBzdGlsbCBiZXR0ZXIgdGhhbiBtYWNoaW5lczotKSwgdGhlCisjIG9yaWdpbmFsIGNvZGUgd2FzIG92ZXJoYXVsZWQsIHdoaWNoIHJlc3VsdGVkIGluIGZvbGxvd2luZworIyBwZXJmb3JtYW5jZSBjaGFuZ2VzOgorIworIwkJY29tcGFyZWQgd2l0aCBvcmlnaW5hbAljb21wYXJlZCB3aXRoIEludGVsIGNjCisjCQlhc3NlbWJsZXIgaW1wbC4JCWdlbmVyYXRlZCBjb2RlCisjIFBlbnRpdW0JLTE2JQkJCSs0OCUKKyMgUElJSS9BTUQJKzglCQkJKzE2JQorIyBQNAkJKzg1JSghKQkJCSs0NSUKKyMKKyMgQXMgeW91IGNhbiBzZWUgUGVudGl1bSBjYW1lIG91dCBhcyBsb29zZXI6LSggWWV0IEkgcmVja29uZWQgdGhhdAorIyBpbXByb3ZlbWVudCBvbiBQNCBvdXR3ZWlnaHRzIHRoZSBsb3NzIGFuZCBpbmNvcnBvcmF0ZSB0aGlzCisjIHJlLXR1bmVkIGNvZGUgdG8gMC45LjcgYW5kIGxhdGVyLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwic2hhMS01ODYucGwiLCRBUkdWWyQjQVJHVl0gZXEgIjM4NiIpOworCiskQT0iZWF4IjsKKyRCPSJlYngiOworJEM9ImVjeCI7CiskRD0iZWR4IjsKKyRFPSJlZGkiOworJFQ9ImVzaSI7CiskdG1wMT0iZWJwIjsKKworQFY9KCRBLCRCLCRDLCRELCRFLCRUKTsKKworc3ViIEJPRFlfMDBfMTUKKwl7CisJbG9jYWwoJG4sJGEsJGIsJGMsJGQsJGUsJGYpPUBfOworCisJJmNvbW1lbnQoIjAwXzE1ICRuIik7CisKKwkmbW92KCRmLCRjKTsJCQkjIGYgdG8gaG9sZCBGXzAwXzE5KGIsYyxkKQorCSBpZiAoJG49PTApICB7ICZtb3YoJHRtcDEsJGEpOyB9CisJIGVsc2UgICAgICAgIHsgJm1vdigkYSwkdG1wMSk7IH0KKwkmcm90bCgkdG1wMSw1KTsJCQkjIHRtcDE9Uk9UQVRFKGEsNSkKKwkgJnhvcigkZiwkZCk7CisJJmFkZCgkdG1wMSwkZSk7CQkJIyB0bXAxKz1lOworCSAmYW5kKCRmLCRiKTsKKwkmbW92KCRlLCZzd3RtcCgkbiUxNikpOwkJIyBlIGJlY29tZXMgdm9sYXRpbGUgYW5kIGlzIGxvYWRlZAorCSAJCQkJIyB3aXRoIHhpLCBhbHNvIG5vdGUgdGhhdCBlIGJlY29tZXMKKwkJCQkJIyBmIGluIG5leHQgcm91bmQuLi4KKwkgJnhvcigkZiwkZCk7CQkJIyBmIGhvbGRzIEZfMDBfMTkoYixjLGQpCisJJnJvdHIoJGIsMik7CQkJIyBiPVJPVEFURShiLDMwKQorCSAmbGVhKCR0bXAxLCZEV1AoMHg1YTgyNzk5OSwkdG1wMSwkZSkpOwkjIHRtcDErPUtfMDBfMTkreGkKKworCWlmICgkbj09MTUpIHsgJmFkZCgkZiwkdG1wMSk7IH0JIyBmKz10bXAxCisJZWxzZSAgICAgICAgeyAmYWRkKCR0bXAxLCRmKTsgfQkjIGYgYmVjb21lcyBhIGluIG5leHQgcm91bmQKKwl9CisKK3N1YiBCT0RZXzE2XzE5CisJeworCWxvY2FsKCRuLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKKworCSZjb21tZW50KCIxNl8xOSAkbiIpOworCisJJm1vdigkZiwmc3d0bXAoJG4lMTYpKTsJCSMgZiB0byBob2xkIFh1cGRhdGUoeGkseGEseGIseGMseGQpCisJICZtb3YoJHRtcDEsJGMpOwkJIyB0bXAxIHRvIGhvbGQgRl8wMF8xOShiLGMsZCkKKwkmeG9yKCRmLCZzd3RtcCgoJG4rMiklMTYpKTsKKwkgJnhvcigkdG1wMSwkZCk7CisJJnhvcigkZiwmc3d0bXAoKCRuKzgpJTE2KSk7CisJICZhbmQoJHRtcDEsJGIpOwkJIyB0bXAxIGhvbGRzIEZfMDBfMTkoYixjLGQpCisJJnJvdHIoJGIsMik7CQkJIyBiPVJPVEFURShiLDMwKQorCSAmeG9yKCRmLCZzd3RtcCgoJG4rMTMpJTE2KSk7CSMgZiBob2xkcyB4YV54Yl54Y154ZAorCSZyb3RsKCRmLDEpOwkJCSMgZj1ST1RBVEUoZiwxKQorCSAmeG9yKCR0bXAxLCRkKTsJCSMgdG1wMT1GXzAwXzE5KGIsYyxkKQorCSZtb3YoJnN3dG1wKCRuJTE2KSwkZik7CQkjIHhpPWYKKwkmbGVhKCRmLCZEV1AoMHg1YTgyNzk5OSwkZiwkZSkpOyMgZis9S18wMF8xOStlCisJICZtb3YoJGUsJGEpOwkJCSMgZSBiZWNvbWVzIHZvbGF0aWxlCisJJnJvdGwoJGUsNSk7CQkJIyBlPVJPVEFURShhLDUpCisJICZhZGQoJGYsJHRtcDEpOwkJIyBmKz1GXzAwXzE5KGIsYyxkKQorCSZhZGQoJGYsJGUpOwkJCSMgZis9Uk9UQVRFKGEsNSkKKwl9CisKK3N1YiBCT0RZXzIwXzM5CisJeworCWxvY2FsKCRuLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKKwlsb2NhbCAkSz0oJG48NDApPzB4NmVkOWViYTE6MHhjYTYyYzFkNjsKKworCSZjb21tZW50KCIyMF8zOSAkbiIpOworCisJJm1vdigkdG1wMSwkYik7CQkJIyB0bXAxIHRvIGhvbGQgRl8yMF8zOShiLGMsZCkKKwkgJm1vdigkZiwmc3d0bXAoJG4lMTYpKTsJIyBmIHRvIGhvbGQgWHVwZGF0ZSh4aSx4YSx4Yix4Yyx4ZCkKKwkmcm90cigkYiwyKTsJCQkjIGI9Uk9UQVRFKGIsMzApCisJICZ4b3IoJGYsJnN3dG1wKCgkbisyKSUxNikpOworCSZ4b3IoJHRtcDEsJGMpOworCSAmeG9yKCRmLCZzd3RtcCgoJG4rOCklMTYpKTsKKwkmeG9yKCR0bXAxLCRkKTsJCQkjIHRtcDEgaG9sZHMgRl8yMF8zOShiLGMsZCkKKwkgJnhvcigkZiwmc3d0bXAoKCRuKzEzKSUxNikpOwkjIGYgaG9sZHMgeGFeeGJeeGNeeGQKKwkmcm90bCgkZiwxKTsJCQkjIGY9Uk9UQVRFKGYsMSkKKwkgJmFkZCgkdG1wMSwkZSk7CisJJm1vdigmc3d0bXAoJG4lMTYpLCRmKTsJCSMgeGk9ZgorCSAmbW92KCRlLCRhKTsJCQkjIGUgYmVjb21lcyB2b2xhdGlsZQorCSZyb3RsKCRlLDUpOwkJCSMgZT1ST1RBVEUoYSw1KQorCSAmbGVhKCRmLCZEV1AoJEssJGYsJHRtcDEpKTsJIyBmKz1LXzIwXzM5K2UKKwkmYWRkKCRmLCRlKTsJCQkjIGYrPVJPVEFURShhLDUpCisJfQorCitzdWIgQk9EWV80MF81OQorCXsKKwlsb2NhbCgkbiwkYSwkYiwkYywkZCwkZSwkZik9QF87CisKKwkmY29tbWVudCgiNDBfNTkgJG4iKTsKKworCSZtb3YoJGYsJnN3dG1wKCRuJTE2KSk7CQkjIGYgdG8gaG9sZCBYdXBkYXRlKHhpLHhhLHhiLHhjLHhkKQorCSAmbW92KCR0bXAxLCZzd3RtcCgoJG4rMiklMTYpKTsKKwkmeG9yKCRmLCR0bXAxKTsKKwkgJm1vdigkdG1wMSwmc3d0bXAoKCRuKzgpJTE2KSk7CisJJnhvcigkZiwkdG1wMSk7CisJICZtb3YoJHRtcDEsJnN3dG1wKCgkbisxMyklMTYpKTsKKwkmeG9yKCRmLCR0bXAxKTsJCQkjIGYgaG9sZHMgeGFeeGJeeGNeeGQKKwkgJm1vdigkdG1wMSwkYik7CQkjIHRtcDEgdG8gaG9sZCBGXzQwXzU5KGIsYyxkKQorCSZyb3RsKCRmLDEpOwkJCSMgZj1ST1RBVEUoZiwxKQorCSAmb3IoJHRtcDEsJGMpOworCSZtb3YoJnN3dG1wKCRuJTE2KSwkZik7CQkjIHhpPWYKKwkgJmFuZCgkdG1wMSwkZCk7CisJJmxlYSgkZiwmRFdQKDB4OGYxYmJjZGMsJGYsJGUpKTsjIGYrPUtfNDBfNTkrZQorCSAmbW92KCRlLCRiKTsJCQkjIGUgYmVjb21lcyB2b2xhdGlsZSBhbmQgaXMgdXNlZAorCQkJCQkjIHRvIGNhbGN1bGF0ZSBGXzQwXzU5KGIsYyxkKQorCSZyb3RyKCRiLDIpOwkJCSMgYj1ST1RBVEUoYiwzMCkKKwkgJmFuZCgkZSwkYyk7CisJJm9yKCR0bXAxLCRlKTsJCQkjIHRtcDEgaG9sZHMgRl80MF81OShiLGMsZCkJCQorCSAmbW92KCRlLCRhKTsKKwkmcm90bCgkZSw1KTsJCQkjIGU9Uk9UQVRFKGEsNSkKKwkgJmFkZCgkZiwkdG1wMSk7CQkjIGYrPXRtcDE7CisJJmFkZCgkZiwkZSk7CQkJIyBmKz1ST1RBVEUoYSw1KQorCX0KKworJmZ1bmN0aW9uX2JlZ2luKCJzaGExX2Jsb2NrX2RhdGFfb3JkZXIiKTsKKwkmbW92KCR0bXAxLCZ3cGFyYW0oMCkpOwkjIFNIQV9DVFggKmMKKwkmbW92KCRULCZ3cGFyYW0oMSkpOwkjIGNvbnN0IHZvaWQgKmlucHV0CisJJm1vdigkQSwmd3BhcmFtKDIpKTsJIyBzaXplX3QgbnVtCisJJnN0YWNrX3B1c2goMTYpOwkjIGFsbG9jYXRlIFhbMTZdCisJJnNobCgkQSw2KTsKKwkmYWRkKCRBLCRUKTsKKwkmbW92KCZ3cGFyYW0oMiksJEEpOwkjIHBvaW50ZXIgYmV5b25kIHRoZSBlbmQgb2YgaW5wdXQKKwkmbW92KCRFLCZEV1AoMTYsJHRtcDEpKTsjIHByZS1sb2FkIEUKKworCSZzZXRfbGFiZWwoImxvb3AiLDE2KTsKKworCSMgY29weSBpbnB1dCBjaHVuayB0byBYLCBidXQgcmV2ZXJzaW5nIGJ5dGUgb3JkZXIhCisJZm9yICgkaT0wOyAkaTwxNjsgJGkrPTQpCisJCXsKKwkJJm1vdigkQSwmRFdQKDQqKCRpKzApLCRUKSk7CisJCSZtb3YoJEIsJkRXUCg0KigkaSsxKSwkVCkpOworCQkmbW92KCRDLCZEV1AoNCooJGkrMiksJFQpKTsKKwkJJm1vdigkRCwmRFdQKDQqKCRpKzMpLCRUKSk7CisJCSZic3dhcCgkQSk7CisJCSZic3dhcCgkQik7CisJCSZic3dhcCgkQyk7CisJCSZic3dhcCgkRCk7CisJCSZtb3YoJnN3dG1wKCRpKzApLCRBKTsKKwkJJm1vdigmc3d0bXAoJGkrMSksJEIpOworCQkmbW92KCZzd3RtcCgkaSsyKSwkQyk7CisJCSZtb3YoJnN3dG1wKCRpKzMpLCREKTsKKwkJfQorCSZtb3YoJndwYXJhbSgxKSwkVCk7CSMgcmVkdW5kYW50IGluIDFzdCBzcGluCisKKwkmbW92KCRBLCZEV1AoMCwkdG1wMSkpOwkjIGxvYWQgU0hBX0NUWAorCSZtb3YoJEIsJkRXUCg0LCR0bXAxKSk7CisJJm1vdigkQywmRFdQKDgsJHRtcDEpKTsKKwkmbW92KCRELCZEV1AoMTIsJHRtcDEpKTsKKwkjIEUgaXMgcHJlLWxvYWRlZAorCisJZm9yKCRpPTA7JGk8MTY7JGkrKykJeyAmQk9EWV8wMF8xNSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKwlmb3IoOyRpPDIwOyRpKyspCXsgJkJPRFlfMTZfMTkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CisJZm9yKDskaTw0MDskaSsrKQl7ICZCT0RZXzIwXzM5KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorCWZvcig7JGk8NjA7JGkrKykJeyAmQk9EWV80MF81OSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKwlmb3IoOyRpPDgwOyRpKyspCXsgJkJPRFlfMjBfMzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CisKKwkoKCRWWzVdIGVxICREKSBhbmQgKCRWWzBdIGVxICRFKSkgb3IgZGllOwkjIGRvdWJsZS1jaGVjaworCisJJm1vdigkdG1wMSwmd3BhcmFtKDApKTsJIyByZS1sb2FkIFNIQV9DVFgqCisJJm1vdigkRCwmd3BhcmFtKDEpKTsJIyBEIGlzIGxhc3QgIlQiIGFuZCBpcyBkaXNjYXJkZWQKKworCSZhZGQoJEUsJkRXUCgwLCR0bXAxKSk7CSMgRSBpcyBsYXN0ICJBIi4uLgorCSZhZGQoJFQsJkRXUCg0LCR0bXAxKSk7CisJJmFkZCgkQSwmRFdQKDgsJHRtcDEpKTsKKwkmYWRkKCRCLCZEV1AoMTIsJHRtcDEpKTsKKwkmYWRkKCRDLCZEV1AoMTYsJHRtcDEpKTsKKworCSZtb3YoJkRXUCgwLCR0bXAxKSwkRSk7CSMgdXBkYXRlIFNIQV9DVFgKKwkgJmFkZCgkRCw2NCk7CQkjIGFkdmFuY2UgaW5wdXQgcG9pbnRlcgorCSZtb3YoJkRXUCg0LCR0bXAxKSwkVCk7CisJICZjbXAoJEQsJndwYXJhbSgyKSk7CSMgaGF2ZSB3ZSByZWFjaGVkIHRoZSBlbmQgeWV0PworCSZtb3YoJkRXUCg4LCR0bXAxKSwkQSk7CisJICZtb3YoJEUsJEMpOwkJIyBDIGlzIGxhc3QgIkUiIHdoaWNoIG5lZWRzIHRvIGJlICJwcmUtbG9hZGVkIgorCSZtb3YoJkRXUCgxMiwkdG1wMSksJEIpOworCSAmbW92KCRULCREKTsJCSMgaW5wdXQgcG9pbnRlcgorCSZtb3YoJkRXUCgxNiwkdG1wMSksJEMpOworCSZqYigmbGFiZWwoImxvb3AiKSk7CisKKwkmc3RhY2tfcG9wKDE2KTsKKyZmdW5jdGlvbl9lbmQoInNoYTFfYmxvY2tfZGF0YV9vcmRlciIpOworJmFzY2l6KCJTSEExIGJsb2NrIHRyYW5zZm9ybSBmb3IgeDg2LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+Iik7CisKKyZhc21fZmluaXNoKCk7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLWFybXY0LWxhcmdlLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODg2MWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5wbApAQCAtMCwwICsxLDIzNCBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIHNoYTFfYmxvY2sgcHJvY2VkdXJlIGZvciBBUk12NC4KKyMKKyMgSmFudWFyeSAyMDA3LgorCisjIFNpemUvcGVyZm9ybWFuY2UgdHJhZGUtb2ZmCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIGltcGwJCXNpemUgaW4gYnl0ZXMJY29tcCBjeWNsZXNbKl0JbWVhc3VyZWQgcGVyZm9ybWFuY2UKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgdGh1bWIJCTMwNAkJMzIxMgkJNDQyMAorIyBhcm12NC1zbWFsbAkzOTIvKzI5JQkxOTU4Lys2NCUJMjI1MC8rOTYlCisjIGFybXY0LWNvbXBhY3QJNzQwLys4OSUJMTU1Mi8rMjYlCTE4NDAvKzIyJQorIyBhcm12NC1sYXJnZQkxNDIwLys5MiUJMTMwNy8rMTklCTEzNzAvKzM0JVsqKipdCisjIGZ1bGwgdW5yb2xsCX41MTAwLysyNjAlCX4xMjYwLys0JQl+MTMwMC8rNSUKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgdGh1bWIJCT0gc2FtZSBhcyAnc21hbGwnIGJ1dCBpbiBUaHVtYiBpbnN0cnVjdGlvbnNbKipdIGFuZAorIwkJICB3aXRoIHJlY3VycmluZyBjb2RlIGluIHR3byBwcml2YXRlIGZ1bmN0aW9uczsKKyMgc21hbGwJCT0gZGV0YWNoZWQgWGxvYWQvdXBkYXRlLCBsb29wcyBhcmUgZm9sZGVkOworIyBjb21wYWN0CT0gZGV0YWNoZWQgWGxvYWQvdXBkYXRlLCA1eCB1bnJvbGw7CisjIGxhcmdlCQk9IGludGVybGVhdmVkIFhsb2FkL3VwZGF0ZSwgNXggdW5yb2xsOworIyBmdWxsIHVucm9sbAk9IGludGVybGVhdmVkIFhsb2FkL3VwZGF0ZSwgZnVsbCB1bnJvbGwsIGVzdGltYXRlZFshXTsKKyMKKyMgWypdCU1hbnVhbGx5IGNvdW50ZWQgaW5zdHJ1Y3Rpb25zIGluICJncmFuZCIgbG9vcCBib2R5LiBNZWFzdXJlZAorIwlwZXJmb3JtYW5jZSBpcyBhZmZlY3RlZCBieSBwcm9sb2d1ZSBhbmQgZXBpbG9ndWUgb3ZlcmhlYWQsCisjCWktY2FjaGUgYXZhaWxhYmlsaXR5LCBicmFuY2ggcGVuYWx0aWVzLCBldGMuCisjIFsqKl0JV2hpbGUgZWFjaCBUaHVtYiBpbnN0cnVjdGlvbiBpcyB0d2ljZSBzbWFsbGVyLCB0aGV5IGFyZSBub3QgYXMKKyMJZGl2ZXJzZSBhcyBBUk0gb25lczogZS5nLiwgdGhlcmUgYXJlIG9ubHkgdHdvIGFyaXRobWV0aWMKKyMJaW5zdHJ1Y3Rpb25zIHdpdGggMyBhcmd1bWVudHMsIG5vIFtmaXhlZF0gcm90YXRlLCBhZGRyZXNzaW5nCisjCW1vZGVzIGFyZSBsaW1pdGVkLiBBcyByZXN1bHQgaXQgdGFrZXMgbW9yZSBpbnN0cnVjdGlvbnMgdG8gZG8KKyMJdGhlIHNhbWUgam9iIGluIFRodW1iLCB0aGVyZWZvcmUgdGhlIGNvZGUgaXMgbmV2ZXIgdHdpY2UgYXMKKyMJc21hbGwgYW5kIGFsd2F5cyBzbG93ZXIuCisjIFsqKipdCXdoaWNoIGlzIGFsc28gfjM1JSBiZXR0ZXIgdGhhbiBjb21waWxlciBnZW5lcmF0ZWQgY29kZS4KKworJG91dHB1dD1zaGlmdDsKK29wZW4gU1RET1VULCI+JG91dHB1dCI7CisKKyRjdHg9InIwIjsKKyRpbnA9InIxIjsKKyRsZW49InIyIjsKKyRhPSJyMyI7CiskYj0icjQiOworJGM9InI1IjsKKyRkPSJyNiI7CiskZT0icjciOworJEs9InI4IjsKKyR0MD0icjkiOworJHQxPSJyMTAiOworJHQyPSJyMTEiOworJHQzPSJyMTIiOworJFhpPSJyMTQiOworQFY9KCRhLCRiLCRjLCRkLCRlKTsKKworIyBPbmUgY2FuIG9wdGltaXplIHRoaXMgZm9yIGFsaWduZWQgYWNjZXNzIG9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlLAorIyBidXQgY29kZSdzIGVuZGlhbiBuZXV0cmFsaXR5IG1ha2VzIGl0IHRvbyBwcmV0dHk6LSkKK3N1YiBYbG9hZCB7CitteSAoJGEsJGIsJGMsJGQsJGUpPUBfOworJGNvZGUuPTw8X19fOworCWxkcmIJJHQwLFskaW5wXSwjNAorCWxkcmIJJHQxLFskaW5wLCMtM10KKwlsZHJiCSR0MixbJGlucCwjLTJdCisJbGRyYgkkdDMsWyRpbnAsIy0xXQorCWFkZAkkZSwkSywkZSxyb3IjMgkJCUAgRSs9S18wMF8xOQorCW9ycgkkdDAsJHQxLCR0MCxsc2wjOAorCWFkZAkkZSwkZSwkYSxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCW9ycgkkdDAsJHQyLCR0MCxsc2wjOAorCWVvcgkkdDEsJGMsJGQJCQlAIEZfeHhfeHgKKwlvcnIJJHQwLCR0MywkdDAsbHNsIzgKKwlhZGQJJGUsJGUsJHQwCQkJQCBFKz1YW2ldCisJc3RyCSR0MCxbJFhpLCMtNF0hCitfX18KK30KK3N1YiBYdXBkYXRlIHsKK215ICgkYSwkYiwkYywkZCwkZSwkZmxhZyk9QF87CiskY29kZS49PDxfX187CisJbGRyCSR0MCxbJFhpLCMxNSo0XQorCWxkcgkkdDEsWyRYaSwjMTMqNF0KKwlsZHIJJHQyLFskWGksIzcqNF0KKwlsZHIJJHQzLFskWGksIzIqNF0KKwlhZGQJJGUsJEssJGUscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJJHQwLCR0MCwkdDEKKwllb3IJJHQwLCR0MCwkdDIKKwllb3IJJHQwLCR0MCwkdDMKKwlhZGQJJGUsJGUsJGEscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKK19fXworJGNvZGUuPTw8X19fIGlmICghZGVmaW5lZCgkZmxhZykpOworCWVvcgkkdDEsJGMsJGQJCQlAIEZfeHhfeHgsIGJ1dCBub3QgaW4gNDBfNTkKK19fXworJGNvZGUuPTw8X19fOworCW1vdgkkdDAsJHQwLHJvciMzMQorCWFkZAkkZSwkZSwkdDAJCQlAIEUrPVhbaV0KKwlzdHIJJHQwLFskWGksIy00XSEKK19fXworfQorCitzdWIgQk9EWV8wMF8xNSB7CitteSAoJGEsJGIsJGMsJGQsJGUpPUBfOworCSZYbG9hZChAXyk7CiskY29kZS49PDxfX187CisJYW5kCSR0MSwkYiwkdDEscm9yIzIKKwllb3IJJHQxLCR0MSwkZCxyb3IjMgkJQCBGXzAwXzE5KEIsQyxEKQorCWFkZAkkZSwkZSwkdDEJCQlAIEUrPUZfMDBfMTkoQixDLEQpCitfX18KK30KKworc3ViIEJPRFlfMTZfMTkgeworbXkgKCRhLCRiLCRjLCRkLCRlKT1AXzsKKwkmWHVwZGF0ZShAXyk7CiskY29kZS49PDxfX187CisJYW5kCSR0MSwkYiwkdDEscm9yIzIKKwllb3IJJHQxLCR0MSwkZCxyb3IjMgkJQCBGXzAwXzE5KEIsQyxEKQorCWFkZAkkZSwkZSwkdDEJCQlAIEUrPUZfMDBfMTkoQixDLEQpCitfX18KK30KKworc3ViIEJPRFlfMjBfMzkgeworbXkgKCRhLCRiLCRjLCRkLCRlKT1AXzsKKwkmWHVwZGF0ZShAXyk7CiskY29kZS49PDxfX187CisJZW9yCSR0MSwkYiwkdDEscm9yIzIJCUAgRl8yMF8zOShCLEMsRCkKKwlhZGQJJGUsJGUsJHQxCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorX19fCit9CisKK3N1YiBCT0RZXzQwXzU5IHsKK215ICgkYSwkYiwkYywkZCwkZSk9QF87CisJJlh1cGRhdGUoQF8sMSk7CiskY29kZS49PDxfX187CisJYW5kCSR0MSwkYiwkYyxyb3IjMgorCW9ycgkkdDIsJGIsJGMscm9yIzIKKwlhbmQJJHQyLCR0MiwkZCxyb3IjMgorCW9ycgkkdDEsJHQxLCR0MgkJCUAgRl80MF81OShCLEMsRCkKKwlhZGQJJGUsJGUsJHQxCQkJQCBFKz1GXzQwXzU5KEIsQyxEKQorX19fCit9CisKKyRjb2RlPTw8X19fOworLnRleHQKKworLmdsb2JhbAlzaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy50eXBlCXNoYTFfYmxvY2tfZGF0YV9vcmRlciwlZnVuY3Rpb24KKworLmFsaWduCTIKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcjoKKwlzdG1kYglzcCEse3I0LXIxMixscn0KKwlhZGQJJGxlbiwkaW5wLCRsZW4sbHNsIzYJQCAkbGVuIHRvIHBvaW50IGF0IHRoZSBlbmQgb2YgJGlucAorCWxkbWlhCSRjdHgseyRhLCRiLCRjLCRkLCRlfQorLkxsb29wOgorCWxkcgkkSywuTEtfMDBfMTkKKwltb3YJJFhpLHNwCisJc3ViCXNwLHNwLCMxNSo0CisJbW92CSRjLCRjLHJvciMzMAorCW1vdgkkZCwkZCxyb3IjMzAKKwltb3YJJGUsJGUscm9yIzMwCQlAIFs2XQorLkxfMDBfMTU6CitfX18KK2ZvcigkaT0wOyRpPDU7JGkrKykgeworCSZCT0RZXzAwXzE1KEBWKTsJdW5zaGlmdChAVixwb3AoQFYpKTsKK30KKyRjb2RlLj08PF9fXzsKKwl0ZXEJJFhpLHNwCisJYm5lCS5MXzAwXzE1CQlAIFsoKDExKzQpKjUrMikqM10KK19fXworCSZCT0RZXzAwXzE1KEBWKTsJdW5zaGlmdChAVixwb3AoQFYpKTsKKwkmQk9EWV8xNl8xOShAVik7CXVuc2hpZnQoQFYscG9wKEBWKSk7CisJJkJPRFlfMTZfMTkoQFYpOwl1bnNoaWZ0KEBWLHBvcChAVikpOworCSZCT0RZXzE2XzE5KEBWKTsJdW5zaGlmdChAVixwb3AoQFYpKTsKKwkmQk9EWV8xNl8xOShAVik7CXVuc2hpZnQoQFYscG9wKEBWKSk7CiskY29kZS49PDxfX187CisKKwlsZHIJJEssLkxLXzIwXzM5CQlAIFsrMTUrMTYqNF0KKwlzdWIJc3Asc3AsIzI1KjQKKwljbW4Jc3AsIzAJCQlAIFsrM10sIGNsZWFyIGNhcnJ5IHRvIGRlbm90ZSAyMF8zOQorLkxfMjBfMzlfb3JfNjBfNzk6CitfX18KK2ZvcigkaT0wOyRpPDU7JGkrKykgeworCSZCT0RZXzIwXzM5KEBWKTsJdW5zaGlmdChAVixwb3AoQFYpKTsKK30KKyRjb2RlLj08PF9fXzsKKwl0ZXEJJFhpLHNwCQkJQCBwcmVzZXJ2ZSBjYXJyeQorCWJuZQkuTF8yMF8zOV9vcl82MF83OQlAIFsrKCgxMiszKSo1KzIpKjRdCisJYmNzCS5MX2RvbmUJCQlAIFsrKCgxMiszKSo1KzIpKjRdLCBzcGFyZSAzMDAgYnl0ZXMKKworCWxkcgkkSywuTEtfNDBfNTkKKwlzdWIJc3Asc3AsIzIwKjQJCUAgWysyXQorLkxfNDBfNTk6CitfX18KK2ZvcigkaT0wOyRpPDU7JGkrKykgeworCSZCT0RZXzQwXzU5KEBWKTsJdW5zaGlmdChAVixwb3AoQFYpKTsKK30KKyRjb2RlLj08PF9fXzsKKwl0ZXEJJFhpLHNwCisJYm5lCS5MXzQwXzU5CQlAIFsrKCgxMis1KSo1KzIpKjRdCisKKwlsZHIJJEssLkxLXzYwXzc5CisJc3ViCXNwLHNwLCMyMCo0CisJY21wCXNwLCMwCQkJQCBzZXQgY2FycnkgdG8gZGVub3RlIDYwXzc5CisJYgkuTF8yMF8zOV9vcl82MF83OQlAIFsrNF0sIHNwYXJlIDMwMCBieXRlcworLkxfZG9uZToKKwlhZGQJc3Asc3AsIzgwKjQJCUAgImRlYWxsb2NhdGUiIHN0YWNrIGZyYW1lCisJbGRtaWEJJGN0eCx7JEssJHQwLCR0MSwkdDIsJHQzfQorCWFkZAkkYSwkSywkYQorCWFkZAkkYiwkdDAsJGIKKwlhZGQJJGMsJHQxLCRjLHJvciMyCisJYWRkCSRkLCR0MiwkZCxyb3IjMgorCWFkZAkkZSwkdDMsJGUscm9yIzIKKwlzdG1pYQkkY3R4LHskYSwkYiwkYywkZCwkZX0KKwl0ZXEJJGlucCwkbGVuCisJYm5lCS5MbG9vcAkJCUAgWysxOF0sIHRvdGFsIDEzMDcKKworCWxkbWlhCXNwISx7cjQtcjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwlieAlscgkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorLmFsaWduCTIKKy5MS18wMF8xOToJLndvcmQJMHg1YTgyNzk5OQorLkxLXzIwXzM5Ogkud29yZAkweDZlZDllYmExCisuTEtfNDBfNTk6CS53b3JkCTB4OGYxYmJjZGMKKy5MS182MF83OToJLndvcmQJMHhjYTYyYzFkNgorLnNpemUJc2hhMV9ibG9ja19kYXRhX29yZGVyLC4tc2hhMV9ibG9ja19kYXRhX29yZGVyCisuYXNjaXoJIlNIQTEgYmxvY2sgdHJhbnNmb3JtIGZvciBBUk12NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkyCitfX18KKworJGNvZGUgPX4gcy9cYmJ4XHMrbHJcYi8ud29yZFx0MHhlMTJmZmYxZS9nbTsJIyBtYWtlIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgd2l0aCAtbWFyY2g9YXJtdjQKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOyAjIGVuZm9yY2UgZmx1c2gKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjQtbGFyZ2UucyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjQtbGFyZ2UucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmM5MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5zCkBAIC0wLDAgKzEsMzc3IEBACisudGV4dAorCisuZ2xvYmFsCXNoYTFfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMV9ibG9ja19kYXRhX29yZGVyLCVmdW5jdGlvbgorCisuYWxpZ24JMgorc2hhMV9ibG9ja19kYXRhX29yZGVyOgorCXN0bWRiCXNwISx7cjQtcjEyLGxyfQorCWFkZAlyMixyMSxyMixsc2wjNglAIHIyIHRvIHBvaW50IGF0IHRoZSBlbmQgb2YgcjEKKwlsZG1pYQlyMCx7cjMscjQscjUscjYscjd9CisuTGxvb3A6CisJbGRyCXI4LC5MS18wMF8xOQorCW1vdglyMTQsc3AKKwlzdWIJc3Asc3AsIzE1KjQKKwltb3YJcjUscjUscm9yIzMwCisJbW92CXI2LHI2LHJvciMzMAorCW1vdglyNyxyNyxyb3IjMzAJCUAgWzZdCisuTF8wMF8xNToKKwlsZHJiCXI5LFtyMV0sIzQKKwlsZHJiCXIxMCxbcjEsIy0zXQorCWxkcmIJcjExLFtyMSwjLTJdCisJbGRyYglyMTIsW3IxLCMtMV0KKwlhZGQJcjcscjgscjcscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlvcnIJcjkscjEwLHI5LGxzbCM4CisJYWRkCXI3LHI3LHIzLHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHIxMSxyOSxsc2wjOAorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjEyLHI5LGxzbCM4CisJYWRkCXI3LHI3LHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI0LHIxMCxyb3IjMgorCWVvcglyMTAscjEwLHI2LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI3LHI3LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHJiCXI5LFtyMV0sIzQKKwlsZHJiCXIxMCxbcjEsIy0zXQorCWxkcmIJcjExLFtyMSwjLTJdCisJbGRyYglyMTIsW3IxLCMtMV0KKwlhZGQJcjYscjgscjYscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlvcnIJcjkscjEwLHI5LGxzbCM4CisJYWRkCXI2LHI2LHI3LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHIxMSxyOSxsc2wjOAorCWVvcglyMTAscjQscjUJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjEyLHI5LGxzbCM4CisJYWRkCXI2LHI2LHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHIzLHIxMCxyb3IjMgorCWVvcglyMTAscjEwLHI1LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI2LHI2LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHJiCXI5LFtyMV0sIzQKKwlsZHJiCXIxMCxbcjEsIy0zXQorCWxkcmIJcjExLFtyMSwjLTJdCisJbGRyYglyMTIsW3IxLCMtMV0KKwlhZGQJcjUscjgscjUscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlvcnIJcjkscjEwLHI5LGxzbCM4CisJYWRkCXI1LHI1LHI2LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHIxMSxyOSxsc2wjOAorCWVvcglyMTAscjMscjQJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjEyLHI5LGxzbCM4CisJYWRkCXI1LHI1LHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI3LHIxMCxyb3IjMgorCWVvcglyMTAscjEwLHI0LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI1LHI1LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHJiCXI5LFtyMV0sIzQKKwlsZHJiCXIxMCxbcjEsIy0zXQorCWxkcmIJcjExLFtyMSwjLTJdCisJbGRyYglyMTIsW3IxLCMtMV0KKwlhZGQJcjQscjgscjQscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlvcnIJcjkscjEwLHI5LGxzbCM4CisJYWRkCXI0LHI0LHI1LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHIxMSxyOSxsc2wjOAorCWVvcglyMTAscjcscjMJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjEyLHI5LGxzbCM4CisJYWRkCXI0LHI0LHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI2LHIxMCxyb3IjMgorCWVvcglyMTAscjEwLHIzLHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI0LHI0LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHJiCXI5LFtyMV0sIzQKKwlsZHJiCXIxMCxbcjEsIy0zXQorCWxkcmIJcjExLFtyMSwjLTJdCisJbGRyYglyMTIsW3IxLCMtMV0KKwlhZGQJcjMscjgscjMscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlvcnIJcjkscjEwLHI5LGxzbCM4CisJYWRkCXIzLHIzLHI0LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHIxMSxyOSxsc2wjOAorCWVvcglyMTAscjYscjcJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjEyLHI5LGxzbCM4CisJYWRkCXIzLHIzLHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI1LHIxMCxyb3IjMgorCWVvcglyMTAscjEwLHI3LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXIzLHIzLHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwl0ZXEJcjE0LHNwCisJYm5lCS5MXzAwXzE1CQlAIFsoKDExKzQpKjUrMikqM10KKwlsZHJiCXI5LFtyMV0sIzQKKwlsZHJiCXIxMCxbcjEsIy0zXQorCWxkcmIJcjExLFtyMSwjLTJdCisJbGRyYglyMTIsW3IxLCMtMV0KKwlhZGQJcjcscjgscjcscm9yIzIJCQlAIEUrPUtfMDBfMTkKKwlvcnIJcjkscjEwLHI5LGxzbCM4CisJYWRkCXI3LHI3LHIzLHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJb3JyCXI5LHIxMSxyOSxsc2wjOAorCWVvcglyMTAscjUscjYJCQlAIEZfeHhfeHgKKwlvcnIJcjkscjEyLHI5LGxzbCM4CisJYWRkCXI3LHI3LHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI0LHIxMCxyb3IjMgorCWVvcglyMTAscjEwLHI2LHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI3LHI3LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJbGRyCXIxMixbcjE0LCMyKjRdCisJYWRkCXI2LHI4LHI2LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJZW9yCXI5LHI5LHIxMAorCWVvcglyOSxyOSxyMTEKKwllb3IJcjkscjkscjEyCisJYWRkCXI2LHI2LHI3LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXIxMCxyNCxyNQkJCUAgRl94eF94eCwgYnV0IG5vdCBpbiA0MF81OQorCW1vdglyOSxyOSxyb3IjMzEKKwlhZGQJcjYscjYscjkJCQlAIEUrPVhbaV0KKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjMscjEwLHJvciMyCisJZW9yCXIxMCxyMTAscjUscm9yIzIJCUAgRl8wMF8xOShCLEMsRCkKKwlhZGQJcjYscjYscjEwCQkJQCBFKz1GXzAwXzE5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwlhZGQJcjUscjgscjUscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJcjkscjkscjEwCisJZW9yCXI5LHI5LHIxMQorCWVvcglyOSxyOSxyMTIKKwlhZGQJcjUscjUscjYscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjEwLHIzLHI0CQkJQCBGX3h4X3h4LCBidXQgbm90IGluIDQwXzU5CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNSxyNSxyOQkJCUAgRSs9WFtpXQorCXN0cglyOSxbcjE0LCMtNF0hCisJYW5kCXIxMCxyNyxyMTAscm9yIzIKKwllb3IJcjEwLHIxMCxyNCxyb3IjMgkJQCBGXzAwXzE5KEIsQyxEKQorCWFkZAlyNSxyNSxyMTAJCQlAIEUrPUZfMDBfMTkoQixDLEQpCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWxkcglyMTIsW3IxNCwjMio0XQorCWFkZAlyNCxyOCxyNCxyb3IjMgkJCUAgRSs9S194eF94eAorCWVvcglyOSxyOSxyMTAKKwllb3IJcjkscjkscjExCisJZW9yCXI5LHI5LHIxMgorCWFkZAlyNCxyNCxyNSxyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCWVvcglyMTAscjcscjMJCQlAIEZfeHhfeHgsIGJ1dCBub3QgaW4gNDBfNTkKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI0LHI0LHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI2LHIxMCxyb3IjMgorCWVvcglyMTAscjEwLHIzLHJvciMyCQlAIEZfMDBfMTkoQixDLEQpCisJYWRkCXI0LHI0LHIxMAkJCUAgRSs9Rl8wMF8xOShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJbGRyCXIxMixbcjE0LCMyKjRdCisJYWRkCXIzLHI4LHIzLHJvciMyCQkJQCBFKz1LX3h4X3h4CisJZW9yCXI5LHI5LHIxMAorCWVvcglyOSxyOSxyMTEKKwllb3IJcjkscjkscjEyCisJYWRkCXIzLHIzLHI0LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJZW9yCXIxMCxyNixyNwkJCUAgRl94eF94eCwgYnV0IG5vdCBpbiA0MF81OQorCW1vdglyOSxyOSxyb3IjMzEKKwlhZGQJcjMscjMscjkJCQlAIEUrPVhbaV0KKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjUscjEwLHJvciMyCisJZW9yCXIxMCxyMTAscjcscm9yIzIJCUAgRl8wMF8xOShCLEMsRCkKKwlhZGQJcjMscjMscjEwCQkJQCBFKz1GXzAwXzE5KEIsQyxEKQorCisJbGRyCXI4LC5MS18yMF8zOQkJQCBbKzE1KzE2KjRdCisJc3ViCXNwLHNwLCMyNSo0CisJY21uCXNwLCMwCQkJQCBbKzNdLCBjbGVhciBjYXJyeSB0byBkZW5vdGUgMjBfMzkKKy5MXzIwXzM5X29yXzYwXzc5OgorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwlhZGQJcjcscjgscjcscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJcjkscjkscjEwCisJZW9yCXI5LHI5LHIxMQorCWVvcglyOSxyOSxyMTIKKwlhZGQJcjcscjcscjMscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjEwLHI1LHI2CQkJQCBGX3h4X3h4LCBidXQgbm90IGluIDQwXzU5CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNyxyNyxyOQkJCUAgRSs9WFtpXQorCXN0cglyOSxbcjE0LCMtNF0hCisJZW9yCXIxMCxyNCxyMTAscm9yIzIJCUAgRl8yMF8zOShCLEMsRCkKKwlhZGQJcjcscjcscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwlhZGQJcjYscjgscjYscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJcjkscjkscjEwCisJZW9yCXI5LHI5LHIxMQorCWVvcglyOSxyOSxyMTIKKwlhZGQJcjYscjYscjcscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjEwLHI0LHI1CQkJQCBGX3h4X3h4LCBidXQgbm90IGluIDQwXzU5CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNixyNixyOQkJCUAgRSs9WFtpXQorCXN0cglyOSxbcjE0LCMtNF0hCisJZW9yCXIxMCxyMyxyMTAscm9yIzIJCUAgRl8yMF8zOShCLEMsRCkKKwlhZGQJcjYscjYscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwlhZGQJcjUscjgscjUscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJcjkscjkscjEwCisJZW9yCXI5LHI5LHIxMQorCWVvcglyOSxyOSxyMTIKKwlhZGQJcjUscjUscjYscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjEwLHIzLHI0CQkJQCBGX3h4X3h4LCBidXQgbm90IGluIDQwXzU5CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNSxyNSxyOQkJCUAgRSs9WFtpXQorCXN0cglyOSxbcjE0LCMtNF0hCisJZW9yCXIxMCxyNyxyMTAscm9yIzIJCUAgRl8yMF8zOShCLEMsRCkKKwlhZGQJcjUscjUscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwlhZGQJcjQscjgscjQscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJcjkscjkscjEwCisJZW9yCXI5LHI5LHIxMQorCWVvcglyOSxyOSxyMTIKKwlhZGQJcjQscjQscjUscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjEwLHI3LHIzCQkJQCBGX3h4X3h4LCBidXQgbm90IGluIDQwXzU5CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNCxyNCxyOQkJCUAgRSs9WFtpXQorCXN0cglyOSxbcjE0LCMtNF0hCisJZW9yCXIxMCxyNixyMTAscm9yIzIJCUAgRl8yMF8zOShCLEMsRCkKKwlhZGQJcjQscjQscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwlhZGQJcjMscjgscjMscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJcjkscjkscjEwCisJZW9yCXI5LHI5LHIxMQorCWVvcglyOSxyOSxyMTIKKwlhZGQJcjMscjMscjQscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwllb3IJcjEwLHI2LHI3CQkJQCBGX3h4X3h4LCBidXQgbm90IGluIDQwXzU5CisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyMyxyMyxyOQkJCUAgRSs9WFtpXQorCXN0cglyOSxbcjE0LCMtNF0hCisJZW9yCXIxMCxyNSxyMTAscm9yIzIJCUAgRl8yMF8zOShCLEMsRCkKKwlhZGQJcjMscjMscjEwCQkJQCBFKz1GXzIwXzM5KEIsQyxEKQorCXRlcQlyMTQsc3AJCQlAIHByZXNlcnZlIGNhcnJ5CisJYm5lCS5MXzIwXzM5X29yXzYwXzc5CUAgWysoKDEyKzMpKjUrMikqNF0KKwliY3MJLkxfZG9uZQkJCUAgWysoKDEyKzMpKjUrMikqNF0sIHNwYXJlIDMwMCBieXRlcworCisJbGRyCXI4LC5MS180MF81OQorCXN1YglzcCxzcCwjMjAqNAkJQCBbKzJdCisuTF80MF81OToKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJbGRyCXIxMixbcjE0LCMyKjRdCisJYWRkCXI3LHI4LHI3LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJZW9yCXI5LHI5LHIxMAorCWVvcglyOSxyOSxyMTEKKwllb3IJcjkscjkscjEyCisJYWRkCXI3LHI3LHIzLHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNyxyNyxyOQkJCUAgRSs9WFtpXQorCXN0cglyOSxbcjE0LCMtNF0hCisJYW5kCXIxMCxyNCxyNSxyb3IjMgorCW9ycglyMTEscjQscjUscm9yIzIKKwlhbmQJcjExLHIxMSxyNixyb3IjMgorCW9ycglyMTAscjEwLHIxMQkJCUAgRl80MF81OShCLEMsRCkKKwlhZGQJcjcscjcscjEwCQkJQCBFKz1GXzQwXzU5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwlhZGQJcjYscjgscjYscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJcjkscjkscjEwCisJZW9yCXI5LHI5LHIxMQorCWVvcglyOSxyOSxyMTIKKwlhZGQJcjYscjYscjcscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXI2LHI2LHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHIzLHI0LHJvciMyCisJb3JyCXIxMSxyMyxyNCxyb3IjMgorCWFuZAlyMTEscjExLHI1LHJvciMyCisJb3JyCXIxMCxyMTAscjExCQkJQCBGXzQwXzU5KEIsQyxEKQorCWFkZAlyNixyNixyMTAJCQlAIEUrPUZfNDBfNTkoQixDLEQpCisJbGRyCXI5LFtyMTQsIzE1KjRdCisJbGRyCXIxMCxbcjE0LCMxMyo0XQorCWxkcglyMTEsW3IxNCwjNyo0XQorCWxkcglyMTIsW3IxNCwjMio0XQorCWFkZAlyNSxyOCxyNSxyb3IjMgkJCUAgRSs9S194eF94eAorCWVvcglyOSxyOSxyMTAKKwllb3IJcjkscjkscjExCisJZW9yCXI5LHI5LHIxMgorCWFkZAlyNSxyNSxyNixyb3IjMjcJCQlAIEUrPVJPUihBLDI3KQorCW1vdglyOSxyOSxyb3IjMzEKKwlhZGQJcjUscjUscjkJCQlAIEUrPVhbaV0KKwlzdHIJcjksW3IxNCwjLTRdIQorCWFuZAlyMTAscjcscjMscm9yIzIKKwlvcnIJcjExLHI3LHIzLHJvciMyCisJYW5kCXIxMSxyMTEscjQscm9yIzIKKwlvcnIJcjEwLHIxMCxyMTEJCQlAIEZfNDBfNTkoQixDLEQpCisJYWRkCXI1LHI1LHIxMAkJCUAgRSs9Rl80MF81OShCLEMsRCkKKwlsZHIJcjksW3IxNCwjMTUqNF0KKwlsZHIJcjEwLFtyMTQsIzEzKjRdCisJbGRyCXIxMSxbcjE0LCM3KjRdCisJbGRyCXIxMixbcjE0LCMyKjRdCisJYWRkCXI0LHI4LHI0LHJvciMyCQkJQCBFKz1LX3h4X3h4CisJZW9yCXI5LHI5LHIxMAorCWVvcglyOSxyOSxyMTEKKwllb3IJcjkscjkscjEyCisJYWRkCXI0LHI0LHI1LHJvciMyNwkJCUAgRSs9Uk9SKEEsMjcpCisJbW92CXI5LHI5LHJvciMzMQorCWFkZAlyNCxyNCxyOQkJCUAgRSs9WFtpXQorCXN0cglyOSxbcjE0LCMtNF0hCisJYW5kCXIxMCxyNixyNyxyb3IjMgorCW9ycglyMTEscjYscjcscm9yIzIKKwlhbmQJcjExLHIxMSxyMyxyb3IjMgorCW9ycglyMTAscjEwLHIxMQkJCUAgRl80MF81OShCLEMsRCkKKwlhZGQJcjQscjQscjEwCQkJQCBFKz1GXzQwXzU5KEIsQyxEKQorCWxkcglyOSxbcjE0LCMxNSo0XQorCWxkcglyMTAsW3IxNCwjMTMqNF0KKwlsZHIJcjExLFtyMTQsIzcqNF0KKwlsZHIJcjEyLFtyMTQsIzIqNF0KKwlhZGQJcjMscjgscjMscm9yIzIJCQlAIEUrPUtfeHhfeHgKKwllb3IJcjkscjkscjEwCisJZW9yCXI5LHI5LHIxMQorCWVvcglyOSxyOSxyMTIKKwlhZGQJcjMscjMscjQscm9yIzI3CQkJQCBFKz1ST1IoQSwyNykKKwltb3YJcjkscjkscm9yIzMxCisJYWRkCXIzLHIzLHI5CQkJQCBFKz1YW2ldCisJc3RyCXI5LFtyMTQsIy00XSEKKwlhbmQJcjEwLHI1LHI2LHJvciMyCisJb3JyCXIxMSxyNSxyNixyb3IjMgorCWFuZAlyMTEscjExLHI3LHJvciMyCisJb3JyCXIxMCxyMTAscjExCQkJQCBGXzQwXzU5KEIsQyxEKQorCWFkZAlyMyxyMyxyMTAJCQlAIEUrPUZfNDBfNTkoQixDLEQpCisJdGVxCXIxNCxzcAorCWJuZQkuTF80MF81OQkJQCBbKygoMTIrNSkqNSsyKSo0XQorCisJbGRyCXI4LC5MS182MF83OQorCXN1YglzcCxzcCwjMjAqNAorCWNtcAlzcCwjMAkJCUAgc2V0IGNhcnJ5IHRvIGRlbm90ZSA2MF83OQorCWIJLkxfMjBfMzlfb3JfNjBfNzkJQCBbKzRdLCBzcGFyZSAzMDAgYnl0ZXMKKy5MX2RvbmU6CisJYWRkCXNwLHNwLCM4MCo0CQlAICJkZWFsbG9jYXRlIiBzdGFjayBmcmFtZQorCWxkbWlhCXIwLHtyOCxyOSxyMTAscjExLHIxMn0KKwlhZGQJcjMscjgscjMKKwlhZGQJcjQscjkscjQKKwlhZGQJcjUscjEwLHI1LHJvciMyCisJYWRkCXI2LHIxMSxyNixyb3IjMgorCWFkZAlyNyxyMTIscjcscm9yIzIKKwlzdG1pYQlyMCx7cjMscjQscjUscjYscjd9CisJdGVxCXIxLHIyCisJYm5lCS5MbG9vcAkJCUAgWysxOF0sIHRvdGFsIDEzMDcKKworCWxkbWlhCXNwISx7cjQtcjEyLGxyfQorCXRzdAlsciwjMQorCW1vdmVxCXBjLGxyCQkJQCBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIFY0LCB5ZXQKKwkud29yZAkweGUxMmZmZjFlCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisuYWxpZ24JMgorLkxLXzAwXzE5Ogkud29yZAkweDVhODI3OTk5CisuTEtfMjBfMzk6CS53b3JkCTB4NmVkOWViYTEKKy5MS180MF81OToJLndvcmQJMHg4ZjFiYmNkYworLkxLXzYwXzc5Ogkud29yZAkweGNhNjJjMWQ2Cisuc2l6ZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsLi1zaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy5hc2NpegkiU0hBMSBibG9jayB0cmFuc2Zvcm0gZm9yIEFSTXY0LCBDUllQVE9HQU1TIGJ5IDxhcHByb0BvcGVuc3NsLm9yZz4iCisuYWxpZ24JMgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS1pYTY0LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS1pYTY0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzRmNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLWlhNjQucGwKQEAgLTAsMCArMSwzMDYgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIEV0ZXJuYWwgcXVlc3Rpb24gaXMgd2hhdCdzIHdyb25nIHdpdGggY29tcGlsZXIgZ2VuZXJhdGVkIGNvZGU/IFRoZQorIyB0cmljayBpcyB0aGF0IGl0J3MgcG9zc2libGUgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2hpZnRzIHJlcXVpcmVkCisjIHRvIHBlcmZvcm0gcm90YXRpb25zIGJ5IG1haW50YWluaW5nIGNvcHkgb2YgMzItYml0IHZhbHVlIGluIHVwcGVyCisjIGJpdHMgb2YgNjQtYml0IHJlZ2lzdGVyLiBKdXN0IGZvbGxvdyBtdXgyIGFuZCBzaHJwIGluc3RydWN0aW9ucy4uLgorIyBQZXJmb3JtYW5jZSB1bmRlciBiaWctZW5kaWFuIE9TIHN1Y2ggYXMgSFAtVVggaXMgMTc5TUJwcyoxR0h6LCB3aGljaAorIyBpcyA+NTAlIGJldHRlciB0aGFuIEhQIEMgYW5kID4yeCBiZXR0ZXIgdGhhbiBnY2MuCisKKyRjb2RlPTw8X19fOworLmlkZW50ICBcInNoYTEtaWE2NC5zLCB2ZXJzaW9uIDEuMlwiCisuaWRlbnQgIFwiSUEtNjQgSVNBIGFydHdvcmsgYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9cQGZ5LmNoYWxtZXJzLnNlPlwiCisuZXhwbGljaXQKKworX19fCisKKworaWYgKCReTyBlcSAiaHB1eCIpIHsKKyAgICAkQUREUD0iYWRkcDQiOworICAgIGZvciAoQEFSR1YpIHsgJEFERFA9ImFkZCIgaWYgKC9bXCtERHxcLW1scF02NC8pOyB9Cit9IGVsc2UgeyAkQUREUD0iYWRkIjsgfQorZm9yIChAQVJHVikgewkkYmlnX2VuZGlhbj0xIGlmICgvXC1EQl9FTkRJQU4vKTsKKwkJJGJpZ19lbmRpYW49MCBpZiAoL1wtRExfRU5ESUFOLyk7ICAgfQoraWYgKCFkZWZpbmVkKCRiaWdfZW5kaWFuKSkKKwkgICAgewkkYmlnX2VuZGlhbj0odW5wYWNrKCdMJyxwYWNrKCdOJywxKSk9PTEpOyAgIH0KKworIyRodW1hbj0xOworaWYgKCRodW1hbikgewkjIHVzZWZ1bCBmb3IgdmlzdWFsIGNvZGUgYXVkaXRpbmcuLi4KKwkoJEEsJEIsJEMsJEQsJEUsJFQpICAgPSAoIkEiLCJCIiwiQyIsIkQiLCJFIiwiVCIpOworCSgkaDAsJGgxLCRoMiwkaDMsJGg0KSA9ICgiaDAiLCJoMSIsImgyIiwiaDMiLCJoNCIpOworCSgkS18wMF8xOSwgJEtfMjBfMzksICRLXzQwXzU5LCAkS182MF83OSkgPQorCSAgICAoCSJLXzAwXzE5IiwiS18yMF8zOSIsIktfNDBfNTkiLCJLXzYwXzc5IgkpOworCUBYPSAoCSJYMCIsICJYMSIsICJYMiIsICJYMyIsICJYNCIsICJYNSIsICJYNiIsICJYNyIsCisJCSJYOCIsICJYOSIsIlgxMCIsIlgxMSIsIlgxMiIsIlgxMyIsIlgxNCIsIlgxNSIJKTsKK30KK2Vsc2UgeworCSgkQSwkQiwkQywkRCwkRSwkVCkgICA9ICgibG9jMCIsImxvYzEiLCJsb2MyIiwibG9jMyIsImxvYzQiLCJsb2M1Iik7CisJKCRoMCwkaDEsJGgyLCRoMywkaDQpID0gKCJsb2M2IiwibG9jNyIsImxvYzgiLCJsb2M5IiwibG9jMTAiKTsKKwkoJEtfMDBfMTksICRLXzIwXzM5LCAkS180MF81OSwgJEtfNjBfNzkpID0KKwkgICAgKAkicjE0IiwgInIxNSIsICJsb2MxMSIsICJsb2MxMiIJKTsKKwlAWD0gKAkicjE2IiwgInIxNyIsICJyMTgiLCAicjE5IiwgInIyMCIsICJyMjEiLCAicjIyIiwgInIyMyIsCisJCSJyMjQiLCAicjI1IiwgInIyNiIsICJyMjciLCAicjI4IiwgInIyOSIsICJyMzAiLCAicjMxIgkpOworfQorCitzdWIgQk9EWV8wMF8xNSB7Citsb2NhbAkqY29kZT1zaGlmdDsKK2xvY2FsCSgkaSwkYSwkYiwkYywkZCwkZSwkZik9QF87CisKKyRjb2RlLj08PF9fXyBpZiAoJGk9PTApOworeyAubW1pOwlsZDEJJFhbJGkmMHhmXT1baW5wXSwyCSAgICAvLyBNU0IKKwlsZDEJdG1wMj1bdG1wM10sMgkJfTs7Cit7IC5tbWk7CWxkMQl0bXAwPVtpbnBdLDIKKwlsZDEJdG1wND1bdG1wM10sMgkJICAgIC8vIExTQgorCWRlcAkkWFskaSYweGZdPSRYWyRpJjB4Zl0sdG1wMiw4LDgJfTs7CitfX18KK2lmICgkaTwxNSkgeworCSRjb2RlLj08PF9fXzsKK3sgLm1taTsJbGQxCSRYWygkaSsxKSYweGZdPVtpbnBdLDIJICAgIC8vICsxCisJZGVwCXRtcDE9dG1wMCx0bXA0LDgsOAl9OzsKK3sgLm1taTsJbGQxCXRtcDI9W3RtcDNdLDIJCSAgICAvLyArMQorCWFuZAl0bXA0PSRjLCRiCisJZGVwCSRYWyRpJjB4Zl09JFhbJGkmMHhmXSx0bXAxLDE2LDE2CX0gLy87OworeyAubW1pOwlhbmRjbQl0bXAxPSRkLCRiCisJYWRkCXRtcDA9JGUsJEtfMDBfMTkKKwlkZXAuegl0bXA1PSRhLDUsMjcJCX07OyAvLyBhPDw1Cit7IC5tbWk7CW9yCXRtcDQ9dG1wNCx0bXAxCQkgICAgLy8gRl8wMF8xOShiLGMsZCk9KGImYyl8KH5iJmQpCisJYWRkCSRmPXRtcDAsJFhbJGkmMHhmXQkgICAgLy8gZj14aStlK0tfMDBfMTkKKwlleHRyLnUJdG1wMT0kYSwyNyw1CQl9OzsgLy8gYT4+MjcKK3sgLm1taTsJbGQxCXRtcDA9W2lucF0sMgkJICAgIC8vICsxCisJYWRkCSRmPSRmLHRtcDQJCSAgICAvLyBmKz1GXzAwXzE5KGIsYyxkKQorCXNocnAJJGI9dG1wNix0bXA2LDIJCX0gICAvLyBiPVJPVEFURShiLDMwKQoreyAubW1pOwlsZDEJdG1wND1bdG1wM10sMgkJICAgIC8vICsxCisJb3IJdG1wNT10bXAxLHRtcDUJCSAgICAvLyBST1RBVEUoYSw1KQorCW11eDIJdG1wNj0kYSwweDQ0CQl9OzsgLy8gc2VlIGIgaW4gbmV4dCBpdGVyYXRpb24KK3sgLm1paTsJYWRkCSRmPSRmLHRtcDUJCSAgICAvLyBmKz1ST1RBVEUoYSw1KQorCWRlcAkkWFsoJGkrMSkmMHhmXT0kWFsoJGkrMSkmMHhmXSx0bXAyLDgsOAkvLyArMQorCW11eDIJJFhbJGkmMHhmXT0kWFskaSYweGZdLDB4NDQJfSAvLzs7CisKK19fXworCX0KK2Vsc2UJeworCSRjb2RlLj08PF9fXzsKK3sgLm1paTsJYW5kCXRtcDM9JGMsJGIKKwlkZXAJdG1wMT10bXAwLHRtcDQsOCw4OzsKKwlkZXAJJFhbJGkmMHhmXT0kWFskaSYweGZdLHRtcDEsMTYsMTYJfSAvLzs7Cit7IC5tbWk7CWFuZGNtCXRtcDE9JGQsJGIKKwlhZGQJdG1wMD0kZSwkS18wMF8xOQorCWRlcC56CXRtcDU9JGEsNSwyNwkJfTs7IC8vIGE8PDUKK3sgLm1taTsJb3IJdG1wND10bXAzLHRtcDEJCSAgICAvLyBGXzAwXzE5KGIsYyxkKT0oYiZjKXwofmImZCkKKwlhZGQJJGY9dG1wMCwkWFskaSYweGZdCSAgICAvLyBmPXhpK2UrS18wMF8xOQorCWV4dHIudQl0bXAxPSRhLDI3LDUJCX0gICAvLyBhPj4yNworeyAubW1pOwl4b3IJdG1wMj0kWFsoJGkrMCsxKSYweGZdLCRYWygkaSsyKzEpJjB4Zl0JLy8gKzEKKwl4b3IJdG1wMz0kWFsoJGkrOCsxKSYweGZdLCRYWygkaSsxMysxKSYweGZdIC8vICsxCisJbm9wLmkJMAkJCX07OworeyAubW1pOwlhZGQJJGY9JGYsdG1wNAkJICAgIC8vIGYrPUZfMDBfMTkoYixjLGQpCisJeG9yCXRtcDI9dG1wMix0bXAzCQkgICAgLy8gKzEKKwlzaHJwCSRiPXRtcDYsdG1wNiwyCQl9ICAgLy8gYj1ST1RBVEUoYiwzMCkKK3sgLm1taTsgb3IJdG1wMT10bXAxLHRtcDUJCSAgICAvLyBST1RBVEUoYSw1KQorCW11eDIJdG1wNj0kYSwweDQ0CQl9OzsgLy8gc2VlIGIgaW4gbmV4dCBpdGVyYXRpb24KK3sgLm1paTsJYWRkCSRmPSRmLHRtcDEJCSAgICAvLyBmKz1ST1RBVEUoYSw1KQorCXNocnAJJGU9dG1wMix0bXAyLDMxCQkgICAgLy8gZisxPVJPVEFURSh4WzBdXnhbMl1eeFs4XV54WzEzXSwxKQorCW11eDIJJFhbJGkmMHhmXT0kWFskaSYweGZdLDB4NDQgIH07OworCitfX18KKwl9Cit9CisKK3N1YiBCT0RZXzE2XzE5IHsKK2xvY2FsCSpjb2RlPXNoaWZ0OworbG9jYWwJKCRpLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKKworJGNvZGUuPTw8X19fOworeyAubW1pOwltb3YJJFhbJGkmMHhmXT0kZgkJICAgIC8vIFh1cGRhdGUKKwlhbmQJdG1wMD0kYywkYgorCWRlcC56CXRtcDU9JGEsNSwyNwkJfSAgIC8vIGE8PDUKK3sgLm1taTsJYW5kY20JdG1wMT0kZCwkYgorCWFkZAl0bXA0PSRlLCRLXzAwXzE5CX07OworeyAubW1pOwlvcgl0bXAwPXRtcDAsdG1wMQkJICAgIC8vIEZfMDBfMTkoYixjLGQpPShiJmMpfCh+YiZkKQorCWFkZAkkZj0kZix0bXA0CQkgICAgLy8gZis9ZStLXzAwXzE5CisJZXh0ci51CXRtcDE9JGEsMjcsNQkJfSAgIC8vIGE+PjI3Cit7IC5tbWk7CXhvcgl0bXAyPSRYWygkaSswKzEpJjB4Zl0sJFhbKCRpKzIrMSkmMHhmXQkvLyArMQorCXhvcgl0bXAzPSRYWygkaSs4KzEpJjB4Zl0sJFhbKCRpKzEzKzEpJjB4Zl0JLy8gKzEKKwlub3AuaQkwCQkJfTs7Cit7IC5tbWk7CWFkZAkkZj0kZix0bXAwCQkgICAgLy8gZis9Rl8wMF8xOShiLGMsZCkKKwl4b3IJdG1wMj10bXAyLHRtcDMJCSAgICAvLyArMQorCXNocnAJJGI9dG1wNix0bXA2LDIJCX0gICAvLyBiPVJPVEFURShiLDMwKQoreyAubW1pOwlvcgl0bXAxPXRtcDEsdG1wNQkJICAgIC8vIFJPVEFURShhLDUpCisJbXV4Mgl0bXA2PSRhLDB4NDQJCX07OyAvLyBzZWUgYiBpbiBuZXh0IGl0ZXJhdGlvbgoreyAubWlpOwlhZGQJJGY9JGYsdG1wMQkJICAgIC8vIGYrPVJPVEFURShhLDUpCisJc2hycAkkZT10bXAyLHRtcDIsMzEJCSAgICAvLyBmKzE9Uk9UQVRFKHhbMF1eeFsyXV54WzhdXnhbMTNdLDEpCisJbm9wLmkJMAkJCX07OworCitfX18KK30KKworc3ViIEJPRFlfMjBfMzkgeworbG9jYWwJKmNvZGU9c2hpZnQ7Citsb2NhbAkoJGksJGEsJGIsJGMsJGQsJGUsJGYsJEtvbnN0KT1AXzsKKwkkS29uc3QgPSAkS18yMF8zOSBpZiAoIWRlZmluZWQoJEtvbnN0KSk7CisKK2lmICgkaTw3OSkgeworJGNvZGUuPTw8X19fOworeyAubWliOwltb3YJJFhbJGkmMHhmXT0kZgkJICAgIC8vIFh1cGRhdGUKKwlkZXAuegl0bXA1PSRhLDUsMjcJCX0gICAvLyBhPDw1Cit7IC5taWI7CXhvcgl0bXAwPSRjLCRiCisJYWRkCXRtcDQ9JGUsJEtvbnN0CQl9OzsKK3sgLm1taTsJeG9yCXRtcDA9dG1wMCwkZAkJICAgIC8vIEZfMjBfMzkoYixjLGQpPWJeY15kCisJYWRkCSRmPSRmLHRtcDQJCSAgICAvLyBmKz1lK0tfMjBfMzkKKwlleHRyLnUJdG1wMT0kYSwyNyw1CQl9ICAgLy8gYT4+MjcKK3sgLm1taTsJeG9yCXRtcDI9JFhbKCRpKzArMSkmMHhmXSwkWFsoJGkrMisxKSYweGZdCS8vICsxCisJeG9yCXRtcDM9JFhbKCRpKzgrMSkmMHhmXSwkWFsoJGkrMTMrMSkmMHhmXQkvLyArMQorCW5vcC5pCTAJCQl9OzsKK3sgLm1taTsJYWRkCSRmPSRmLHRtcDAJCSAgICAvLyBmKz1GXzIwXzM5KGIsYyxkKQorCXhvcgl0bXAyPXRtcDIsdG1wMwkJICAgIC8vICsxCisJc2hycAkkYj10bXA2LHRtcDYsMgkJfSAgIC8vIGI9Uk9UQVRFKGIsMzApCit7IC5tbWk7CW9yCXRtcDE9dG1wMSx0bXA1CQkgICAgLy8gUk9UQVRFKGEsNSkKKwltdXgyCXRtcDY9JGEsMHg0NAkJfTs7IC8vIHNlZSBiIGluIG5leHQgaXRlcmF0aW9uCit7IC5taWk7CWFkZAkkZj0kZix0bXAxCQkgICAgLy8gZis9Uk9UQVRFKGEsNSkKKwlzaHJwCSRlPXRtcDIsdG1wMiwzMQkJICAgIC8vIGYrMT1ST1RBVEUoeFswXV54WzJdXnhbOF1eeFsxM10sMSkKKwlub3AuaQkwCQkJfTs7CisKK19fXworfQorZWxzZSB7CiskY29kZS49PDxfX187Cit7IC5taWI7CW1vdgkkWFskaSYweGZdPSRmCQkgICAgLy8gWHVwZGF0ZQorCWRlcC56CXRtcDU9JGEsNSwyNwkJfSAgIC8vIGE8PDUKK3sgLm1pYjsJeG9yCXRtcDA9JGMsJGIKKwlhZGQJdG1wND0kZSwkS29uc3QJCX07OworeyAubWliOwl4b3IJdG1wMD10bXAwLCRkCQkgICAgLy8gRl8yMF8zOShiLGMsZCk9Yl5jXmQKKwlleHRyLnUJdG1wMT0kYSwyNyw1CQl9ICAgLy8gYT4+MjcKK3sgLm1pYjsJYWRkCSRmPSRmLHRtcDQJCSAgICAvLyBmKz1lK0tfMjBfMzkKKwlhZGQJJGgxPSRoMSwkYQkJfTs7IC8vIHdyYXAgdXAKK3sgLm1taTsJYWRkCSRmPSRmLHRtcDAJCSAgICAvLyBmKz1GXzIwXzM5KGIsYyxkKQorCXNocnAJJGI9dG1wNix0bXA2LDIJCX0gICAvLyBiPVJPVEFURShiLDMwKSA7Oz8KK3sgLm1taTsJb3IJdG1wMT10bXAxLHRtcDUJCSAgICAvLyBST1RBVEUoYSw1KQorCWFkZAkkaDM9JGgzLCRjCQl9OzsgLy8gd3JhcCB1cAoreyAubWliOwlhZGQJdG1wMz0xLGlucAkJICAgIC8vIHVzZWQgaW4gdW5hbGlnbmVkIGNvZGVwYXRoCisJYWRkCSRmPSRmLHRtcDEJCX0gICAvLyBmKz1ST1RBVEUoYSw1KQoreyAubWliOwlhZGQJJGgyPSRoMiwkYgkJICAgIC8vIHdyYXAgdXAKKwlhZGQJJGg0PSRoNCwkZAkJfTs7IC8vIHdyYXAgdXAKKworX19fCit9Cit9CisKK3N1YiBCT0RZXzQwXzU5IHsKK2xvY2FsCSpjb2RlPXNoaWZ0OworbG9jYWwJKCRpLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKKworJGNvZGUuPTw8X19fOworeyAubW1pOwltb3YJJFhbJGkmMHhmXT0kZgkJICAgIC8vIFh1cGRhdGUKKwlhbmQJdG1wMD0kYywkYgorCWRlcC56CXRtcDU9JGEsNSwyNwkJfSAgIC8vIGE8PDUKK3sgLm1taTsJYW5kCXRtcDE9JGQsJGIKKwlhZGQJdG1wND0kZSwkS180MF81OQl9OzsKK3sgLm1taTsJb3IJdG1wMD10bXAwLHRtcDEJCSAgICAvLyAoYiZjKXwoYiZkKQorCWFkZAkkZj0kZix0bXA0CQkgICAgLy8gZis9ZStLXzQwXzU5CisJZXh0ci51CXRtcDE9JGEsMjcsNQkJfSAgIC8vIGE+PjI3Cit7IC5tbWk7CWFuZAl0bXA0PSRjLCRkCisJeG9yCXRtcDI9JFhbKCRpKzArMSkmMHhmXSwkWFsoJGkrMisxKSYweGZdCS8vICsxCisJeG9yCXRtcDM9JFhbKCRpKzgrMSkmMHhmXSwkWFsoJGkrMTMrMSkmMHhmXQkvLyArMQorCX07OworeyAubW1pOwlvcgl0bXAxPXRtcDEsdG1wNQkJICAgIC8vIFJPVEFURShhLDUpCisJeG9yCXRtcDI9dG1wMix0bXAzCQkgICAgLy8gKzEKKwlzaHJwCSRiPXRtcDYsdG1wNiwyCQl9ICAgLy8gYj1ST1RBVEUoYiwzMCkKK3sgLm1taTsJb3IJdG1wMD10bXAwLHRtcDQJCSAgICAvLyBGXzQwXzU5KGIsYyxkKT0oYiZjKXwoYiZkKXwoYyZkKQorCW11eDIJdG1wNj0kYSwweDQ0CQl9OzsgLy8gc2VlIGIgaW4gbmV4dCBpdGVyYXRpb24KK3sgLm1paTsJYWRkCSRmPSRmLHRtcDAJCSAgICAvLyBmKz1GXzQwXzU5KGIsYyxkKQorCXNocnAJJGU9dG1wMix0bXAyLDMxOzsJICAgIC8vIGYrMT1ST1RBVEUoeFswXV54WzJdXnhbOF1eeFsxM10sMSkKKwlhZGQJJGY9JGYsdG1wMQkJfTs7IC8vIGYrPVJPVEFURShhLDUpCisKK19fXworfQorc3ViIEJPRFlfNjBfNzkJeyAmQk9EWV8yMF8zOShAXywkS182MF83OSk7IH0KKworJGNvZGUuPTw8X19fOworLnRleHQKKwordG1wMD1yODsKK3RtcDE9cjk7Cit0bXAyPXIxMDsKK3RtcDM9cjExOworY3R4PXIzMjsJLy8gaW4wCitpbnA9cjMzOwkvLyBpbjEKKworLy8gdm9pZCBzaGExX2Jsb2NrX2RhdGFfb3JkZXIoU0hBX0NUWCAqYyxjb25zdCB2b2lkICpwLHNpemVfdCBudW0pOworLmdsb2JhbAlzaGExX2Jsb2NrX2RhdGFfb3JkZXIjCisucHJvYwlzaGExX2Jsb2NrX2RhdGFfb3JkZXIjCisuYWxpZ24JMzIKK3NoYTFfYmxvY2tfZGF0YV9vcmRlcjoKKwkucHJvbG9ndWUKK3sgLm1taTsJYWxsb2MJdG1wMT1hci5wZnMsMywxNSwwLDAKKwkkQUREUAl0bXAwPTQsY3R4CisJLnNhdmUJYXIubGMscjMKKwltb3YJcjM9YXIubGMJCX0KK3sgLm1taTsJJEFERFAJY3R4PTAsY3R4CisJJEFERFAJaW5wPTAsaW5wCisJbW92CXIyPXByCQkJfTs7Cit0bXA0PWluMjsKK3RtcDU9bG9jMTM7Cit0bXA2PWxvYzE0OworCS5ib2R5Cit7IC5tbHg7CWxkNAkkaDA9W2N0eF0sOAorCW1vdmwJJEtfMDBfMTk9MHg1YTgyNzk5OQl9Cit7IC5tbHg7CWxkNAkkaDE9W3RtcDBdLDgKKwltb3ZsCSRLXzIwXzM5PTB4NmVkOWViYTEJfTs7Cit7IC5tbHg7CWxkNAkkaDI9W2N0eF0sOAorCW1vdmwJJEtfNDBfNTk9MHg4ZjFiYmNkYwl9Cit7IC5tbHg7CWxkNAkkaDM9W3RtcDBdCisJbW92bAkkS182MF83OT0weGNhNjJjMWQ2CX07OworeyAubW1pOwlsZDQJJGg0PVtjdHhdLC0xNgorCWFkZAlpbjI9LTEsaW4yCQkgICAgLy8gYWRqdXN0IG51bSBmb3IgYXIubGMKKwltb3YJYXIuZWM9MQkJCX07OworeyAubW1pOwlub3AubQkwCisJYWRkCXRtcDM9MSxpbnAKKwltb3YJYXIubGM9aW4yCQl9OzsgLy8gYnJwLmxvb3AuaW1wOiB0b28gZmFyCisKKy5MZHRvcDoKK3sgLm1taTsJbW92CSRBPSRoMAorCW1vdgkkQj0kaDEKKwltdXgyCXRtcDY9JGgxLDB4NDQJCX0KK3sgLm1taTsJbW92CSRDPSRoMgorCW1vdgkkRD0kaDMKKwltb3YJJEU9JGg0CQkJfTs7CisKK19fXworCit7IG15ICRpLEBWPSgkQSwkQiwkQywkRCwkRSwkVCk7CisKKwlmb3IoJGk9MDskaTwxNjskaSsrKQl7ICZCT0RZXzAwXzE1KFwkY29kZSwkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKwlmb3IoOyRpPDIwOyRpKyspCXsgJkJPRFlfMTZfMTkoXCRjb2RlLCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorCWZvcig7JGk8NDA7JGkrKykJeyAmQk9EWV8yMF8zOShcJGNvZGUsJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CisJZm9yKDskaTw2MDskaSsrKQl7ICZCT0RZXzQwXzU5KFwkY29kZSwkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKwlmb3IoOyRpPDgwOyRpKyspCXsgJkJPRFlfNjBfNzkoXCRjb2RlLCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorCisJKCgkVls1XSBlcSAkRCkgYW5kICgkVlswXSBlcSAkRSkpIG9yIGRpZTsJIyBkb3VibGUtY2hlY2sKK30KKworJGNvZGUuPTw8X19fOworeyAubW1iOwlhZGQJJGgwPSRoMCwkRQorCW5vcC5tCTAKKwlici5jdG9wLmRwdGsubWFueQkuTGR0b3AJfTs7CisuTGRlbmQ6Cit7IC5tbWk7CWFkZAl0bXAwPTQsY3R4CisJbW92CWFyLmxjPXIzCQl9OzsKK3sgLm1taTsJc3Q0CVtjdHhdPSRoMCw4CisJc3Q0CVt0bXAwXT0kaDEsOAkJfTs7Cit7IC5tbWk7CXN0NAlbY3R4XT0kaDIsOAorCXN0NAlbdG1wMF09JGgzCQl9OzsKK3sgLm1pYjsJc3Q0CVtjdHhdPSRoNCwtMTYKKwltb3YJcHI9cjIsMHgxZmZmZgorCWJyLnJldC5zcHRrLm1hbnkJYjAJfTs7CisuZW5kcAlzaGExX2Jsb2NrX2RhdGFfb3JkZXIjCitzdHJpbmd6CSJTSEExIGJsb2NrIHRyYW5zZm9ybSBmb3IgSUE2NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworCiskb3V0cHV0PXNoaWZ0IGFuZCBvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworcHJpbnQgJGNvZGU7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLXBwYy5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtcHBjLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDBmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLXBwYy5wbApAQCAtMCwwICsxLDMxOSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIEkgbGV0IGhhcmR3YXJlIGhhbmRsZSB1bmFsaWduZWQgaW5wdXQoKiksIGV4Y2VwdCBvbiBwYWdlIGJvdW5kYXJpZXMKKyMgKHNlZSBiZWxvdyBmb3IgZGV0YWlscykuIE90aGVyd2lzZSBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24KKyMgd2l0aCBYIHZlY3RvciBpbiByZWdpc3RlciBiYW5rLiBUaGUgbW9kdWxlIGlzIGJpZy1lbmRpYW4gW3doaWNoIGlzCisjIG5vdCBiaWcgZGVhbCBhcyB0aGVyZSdyZSBubyBsaXR0bGUtZW5kaWFuIHRhcmdldHMgbGVmdCBhcm91bmRdLgorIworIyAoKikgdGhpcyBtZWFucyB0aGF0IHRoaXMgbW9kdWxlIGlzIGluYXBwcm9wcmlhdGUgZm9yIFBQQzQwMz8gRG9lcworIyAgICAgYW55Ym9keSBrbm93IGlmIHByZS1QT1dFUjMgY2FuIHN1c3RhaW4gdW5hbGlnbmVkIGxvYWQ/CisKKyMgCQkJLW02NAktbTMyCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUFBDOTcwLGdjYy00LjAuMAkrNzYlCSs1OSUKKyMgUG93ZXI2LHhsYy03CQkrNjglCSszMyUKKworJGZsYXZvdXIgPSBzaGlmdDsKKworaWYgKCRmbGF2b3VyID1+IC82NC8pIHsKKwkkU0laRV9UCT04OworCSRVQ01QCT0iY21wbGQiOworCSRTVFUJPSJzdGR1IjsKKwkkUE9QCT0ibGQiOworCSRQVVNICT0ic3RkIjsKK30gZWxzaWYgKCRmbGF2b3VyID1+IC8zMi8pIHsKKwkkU0laRV9UCT00OworCSRVQ01QCT0iY21wbHciOworCSRTVFUJPSJzdHd1IjsKKwkkUE9QCT0ibHd6IjsKKwkkUFVTSAk9InN0dyI7Cit9IGVsc2UgeyBkaWUgIm5vbnNlbnNlICRmbGF2b3VyIjsgfQorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXBwYy14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS9wcGMteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSBwcGMteGxhdGUucGwiOworCitvcGVuIFNURE9VVCwifCAkXlggJHhsYXRlICRmbGF2b3VyICIuc2hpZnQgfHwgZGllICJjYW4ndCBjYWxsICR4bGF0ZTogJCEiOworCiskRlJBTUU9MjQqJFNJWkVfVDsKKworJEsgID0icjAiOworJHNwID0icjEiOworJHRvYz0icjIiOworJGN0eD0icjMiOworJGlucD0icjQiOworJG51bT0icjUiOworJHQwID0icjE1IjsKKyR0MSA9InI2IjsKKworJEEgID0icjciOworJEIgID0icjgiOworJEMgID0icjkiOworJEQgID0icjEwIjsKKyRFICA9InIxMSI7CiskVCAgPSJyMTIiOworCitAVj0oJEEsJEIsJEMsJEQsJEUsJFQpOworQFg9KCJyMTYiLCJyMTciLCJyMTgiLCJyMTkiLCJyMjAiLCJyMjEiLCJyMjIiLCJyMjMiLAorICAgICJyMjQiLCJyMjUiLCJyMjYiLCJyMjciLCJyMjgiLCJyMjkiLCJyMzAiLCJyMzEiKTsKKworc3ViIEJPRFlfMDBfMTkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKK215ICRqPSRpKzE7CiskY29kZS49PDxfX18gaWYgKCRpPT0wKTsKKwlsd3oJQFhbJGldLGAkaSo0YCgkaW5wKQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPDE1KTsKKwlsd3oJQFhbJGpdLGAkaio0YCgkaW5wKQorCWFkZAkkZiwkSywkZQorCXJvdGx3aQkkZSwkYSw1CisJYWRkCSRmLCRmLEBYWyRpXQorCWFuZAkkdDAsJGMsJGIKKwlhZGQJJGYsJGYsJGUKKwlhbmRjCSR0MSwkZCwkYgorCXJvdGx3aQkkYiwkYiwzMAorCW9yCSR0MCwkdDAsJHQxCisJYWRkCSRmLCRmLCR0MAorX19fCiskY29kZS49PDxfX18gaWYgKCRpPj0xNSk7CisJYWRkCSRmLCRLLCRlCisJcm90bHdpCSRlLCRhLDUKKwl4b3IJQFhbJGolMTZdLEBYWyRqJTE2XSxAWFsoJGorMiklMTZdCisJYWRkCSRmLCRmLEBYWyRpJTE2XQorCWFuZAkkdDAsJGMsJGIKKwl4b3IJQFhbJGolMTZdLEBYWyRqJTE2XSxAWFsoJGorOCklMTZdCisJYWRkCSRmLCRmLCRlCisJYW5kYwkkdDEsJGQsJGIKKwlyb3Rsd2kJJGIsJGIsMzAKKwlvcgkkdDAsJHQwLCR0MQorCXhvcglAWFskaiUxNl0sQFhbJGolMTZdLEBYWygkaisxMyklMTZdCisJYWRkCSRmLCRmLCR0MAorCXJvdGx3aQlAWFskaiUxNl0sQFhbJGolMTZdLDEKK19fXworfQorCitzdWIgQk9EWV8yMF8zOSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYpPUBfOworbXkgJGo9JGkrMTsKKyRjb2RlLj08PF9fXyBpZiAoJGk8NzkpOworCWFkZAkkZiwkSywkZQorCXJvdGx3aQkkZSwkYSw1CisJeG9yCUBYWyRqJTE2XSxAWFskaiUxNl0sQFhbKCRqKzIpJTE2XQorCWFkZAkkZiwkZixAWFskaSUxNl0KKwl4b3IJJHQwLCRiLCRjCisJeG9yCUBYWyRqJTE2XSxAWFskaiUxNl0sQFhbKCRqKzgpJTE2XQorCWFkZAkkZiwkZiwkZQorCXJvdGx3aQkkYiwkYiwzMAorCXhvcgkkdDAsJHQwLCRkCisJeG9yCUBYWyRqJTE2XSxAWFskaiUxNl0sQFhbKCRqKzEzKSUxNl0KKwlhZGQJJGYsJGYsJHQwCisJcm90bHdpCUBYWyRqJTE2XSxAWFskaiUxNl0sMQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPT03OSk7CisJYWRkCSRmLCRLLCRlCisJcm90bHdpCSRlLCRhLDUKKwlsd3oJcjE2LDAoJGN0eCkKKwlhZGQJJGYsJGYsQFhbJGklMTZdCisJeG9yCSR0MCwkYiwkYworCWx3eglyMTcsNCgkY3R4KQorCWFkZAkkZiwkZiwkZQorCXJvdGx3aQkkYiwkYiwzMAorCWx3eglyMTgsOCgkY3R4KQorCXhvcgkkdDAsJHQwLCRkCisJbHd6CXIxOSwxMigkY3R4KQorCWFkZAkkZiwkZiwkdDAKKwlsd3oJcjIwLDE2KCRjdHgpCitfX18KK30KKworc3ViIEJPRFlfNDBfNTkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKK215ICRqPSRpKzE7CiskY29kZS49PDxfX187CisJYWRkCSRmLCRLLCRlCisJcm90bHdpCSRlLCRhLDUKKwl4b3IJQFhbJGolMTZdLEBYWyRqJTE2XSxAWFsoJGorMiklMTZdCisJYWRkCSRmLCRmLEBYWyRpJTE2XQorCWFuZAkkdDAsJGIsJGMKKwl4b3IJQFhbJGolMTZdLEBYWyRqJTE2XSxAWFsoJGorOCklMTZdCisJYWRkCSRmLCRmLCRlCisJb3IJJHQxLCRiLCRjCisJcm90bHdpCSRiLCRiLDMwCisJeG9yCUBYWyRqJTE2XSxAWFskaiUxNl0sQFhbKCRqKzEzKSUxNl0KKwlhbmQJJHQxLCR0MSwkZAorCW9yCSR0MCwkdDAsJHQxCisJcm90bHdpCUBYWyRqJTE2XSxAWFskaiUxNl0sMQorCWFkZAkkZiwkZiwkdDAKK19fXworfQorCiskY29kZT08PF9fXzsKKy5tYWNoaW5lCSJhbnkiCisudGV4dAorCisuZ2xvYmwJLnNoYTFfYmxvY2tfZGF0YV9vcmRlcgorLmFsaWduCTQKKy5zaGExX2Jsb2NrX2RhdGFfb3JkZXI6CisJbWZscglyMAorCSRTVFUJJHNwLGAtKCRGUkFNRSs2NClgKCRzcCkKKwkkUFVTSAlyMCxgJEZSQU1FLSRTSVpFX1QqMThgKCRzcCkKKwkkUFVTSAlyMTUsYCRGUkFNRS0kU0laRV9UKjE3YCgkc3ApCisJJFBVU0gJcjE2LGAkRlJBTUUtJFNJWkVfVCoxNmAoJHNwKQorCSRQVVNICXIxNyxgJEZSQU1FLSRTSVpFX1QqMTVgKCRzcCkKKwkkUFVTSAlyMTgsYCRGUkFNRS0kU0laRV9UKjE0YCgkc3ApCisJJFBVU0gJcjE5LGAkRlJBTUUtJFNJWkVfVCoxM2AoJHNwKQorCSRQVVNICXIyMCxgJEZSQU1FLSRTSVpFX1QqMTJgKCRzcCkKKwkkUFVTSAlyMjEsYCRGUkFNRS0kU0laRV9UKjExYCgkc3ApCisJJFBVU0gJcjIyLGAkRlJBTUUtJFNJWkVfVCoxMGAoJHNwKQorCSRQVVNICXIyMyxgJEZSQU1FLSRTSVpFX1QqOWAoJHNwKQorCSRQVVNICXIyNCxgJEZSQU1FLSRTSVpFX1QqOGAoJHNwKQorCSRQVVNICXIyNSxgJEZSQU1FLSRTSVpFX1QqN2AoJHNwKQorCSRQVVNICXIyNixgJEZSQU1FLSRTSVpFX1QqNmAoJHNwKQorCSRQVVNICXIyNyxgJEZSQU1FLSRTSVpFX1QqNWAoJHNwKQorCSRQVVNICXIyOCxgJEZSQU1FLSRTSVpFX1QqNGAoJHNwKQorCSRQVVNICXIyOSxgJEZSQU1FLSRTSVpFX1QqM2AoJHNwKQorCSRQVVNICXIzMCxgJEZSQU1FLSRTSVpFX1QqMmAoJHNwKQorCSRQVVNICXIzMSxgJEZSQU1FLSRTSVpFX1QqMWAoJHNwKQorCWx3egkkQSwwKCRjdHgpCisJbHd6CSRCLDQoJGN0eCkKKwlsd3oJJEMsOCgkY3R4KQorCWx3egkkRCwxMigkY3R4KQorCWx3egkkRSwxNigkY3R4KQorCWFuZGkuCXIwLCRpbnAsMworCWJuZQlMdW5hbGlnbmVkCitMYWxpZ25lZDoKKwltdGN0cgkkbnVtCisJYmwJTHNoYTFfYmxvY2tfcHJpdmF0ZQorTGRvbmU6CisJJFBPUAlyMCxgJEZSQU1FLSRTSVpFX1QqMThgKCRzcCkKKwkkUE9QCXIxNSxgJEZSQU1FLSRTSVpFX1QqMTdgKCRzcCkKKwkkUE9QCXIxNixgJEZSQU1FLSRTSVpFX1QqMTZgKCRzcCkKKwkkUE9QCXIxNyxgJEZSQU1FLSRTSVpFX1QqMTVgKCRzcCkKKwkkUE9QCXIxOCxgJEZSQU1FLSRTSVpFX1QqMTRgKCRzcCkKKwkkUE9QCXIxOSxgJEZSQU1FLSRTSVpFX1QqMTNgKCRzcCkKKwkkUE9QCXIyMCxgJEZSQU1FLSRTSVpFX1QqMTJgKCRzcCkKKwkkUE9QCXIyMSxgJEZSQU1FLSRTSVpFX1QqMTFgKCRzcCkKKwkkUE9QCXIyMixgJEZSQU1FLSRTSVpFX1QqMTBgKCRzcCkKKwkkUE9QCXIyMyxgJEZSQU1FLSRTSVpFX1QqOWAoJHNwKQorCSRQT1AJcjI0LGAkRlJBTUUtJFNJWkVfVCo4YCgkc3ApCisJJFBPUAlyMjUsYCRGUkFNRS0kU0laRV9UKjdgKCRzcCkKKwkkUE9QCXIyNixgJEZSQU1FLSRTSVpFX1QqNmAoJHNwKQorCSRQT1AJcjI3LGAkRlJBTUUtJFNJWkVfVCo1YCgkc3ApCisJJFBPUAlyMjgsYCRGUkFNRS0kU0laRV9UKjRgKCRzcCkKKwkkUE9QCXIyOSxgJEZSQU1FLSRTSVpFX1QqM2AoJHNwKQorCSRQT1AJcjMwLGAkRlJBTUUtJFNJWkVfVCoyYCgkc3ApCisJJFBPUAlyMzEsYCRGUkFNRS0kU0laRV9UKjFgKCRzcCkKKwltdGxyCXIwCisJYWRkaQkkc3AsJHNwLGAkRlJBTUUrNjRgCisJYmxyCitfX18KKworIyBQb3dlclBDIHNwZWNpZmljYXRpb24gYWxsb3dzIGFuIGltcGxlbWVudGF0aW9uIHRvIGJlIGlsbC1iZWhhdmVkCisjIHVwb24gdW5hbGlnbmVkIGFjY2VzcyB3aGljaCBjcm9zc2VzIHBhZ2UgYm91bmRhcnkuICJCZXR0ZXIgc2FmZQorIyB0aGFuIHNvcnJ5IiBwcmluY2lwbGUgbWFrZXMgbWUgdHJlYXQgaXQgc3BlY2lhbGx5LiBCdXQgSSBkb24ndAorIyBsb29rIGZvciBwYXJ0aWN1bGFyIG9mZmVuZGluZyB3b3JkLCBidXQgcmF0aGVyIGZvciA2NC1ieXRlIGlucHV0CisjIGJsb2NrIHdoaWNoIGNyb3NzZXMgdGhlIGJvdW5kYXJ5LiBPbmNlIGZvdW5kIHRoYXQgYmxvY2sgaXMgYWxpZ25lZAorIyBhbmQgaGFzaGVkIHNlcGFyYXRlbHkuLi4KKyRjb2RlLj08PF9fXzsKKy5hbGlnbgk0CitMdW5hbGlnbmVkOgorCXN1YmZpYwkkdDEsJGlucCw0MDk2CisJYW5kaS4JJHQxLCR0MSw0MDk1CTsgZGlzdGFuY2UgdG8gY2xvc2VzdCBwYWdlIGJvdW5kYXJ5CisJc3J3aS4JJHQxLCR0MSw2CTsgdDEvPTY0CisJYmVxCUxjcm9zc19wYWdlCisJJFVDTVAJJG51bSwkdDEKKwlibGUtCUxhbGlnbmVkCTsgZGlkbid0IGNyb3NzIHRoZSBwYWdlIGJvdW5kYXJ5CisJbXRjdHIJJHQxCisJc3ViZmMJJG51bSwkdDEsJG51bQorCWJsCUxzaGExX2Jsb2NrX3ByaXZhdGUKK0xjcm9zc19wYWdlOgorCWxpCSR0MSwxNgorCW10Y3RyCSR0MQorCWFkZGkJcjIwLCRzcCwkRlJBTUUJOyBzcG90IGJlbG93IHRoZSBmcmFtZQorTG1lbWNweToKKwlsYnoJcjE2LDAoJGlucCkKKwlsYnoJcjE3LDEoJGlucCkKKwlsYnoJcjE4LDIoJGlucCkKKwlsYnoJcjE5LDMoJGlucCkKKwlhZGRpCSRpbnAsJGlucCw0CisJc3RiCXIxNiwwKHIyMCkKKwlzdGIJcjE3LDEocjIwKQorCXN0YglyMTgsMihyMjApCisJc3RiCXIxOSwzKHIyMCkKKwlhZGRpCXIyMCxyMjAsNAorCWJkbnoJTG1lbWNweQorCisJJFBVU0gJJGlucCxgJEZSQU1FLSRTSVpFX1QqMTlgKCRzcCkKKwlsaQkkdDEsMQorCWFkZGkJJGlucCwkc3AsJEZSQU1FCisJbXRjdHIJJHQxCisJYmwJTHNoYTFfYmxvY2tfcHJpdmF0ZQorCSRQT1AJJGlucCxgJEZSQU1FLSRTSVpFX1QqMTlgKCRzcCkKKwlhZGRpYy4JJG51bSwkbnVtLC0xCisJYm5lLQlMdW5hbGlnbmVkCisJYglMZG9uZQorX19fCisKKyMgVGhpcyBpcyBwcml2YXRlIGJsb2NrIGZ1bmN0aW9uLCB3aGljaCB1c2VzIHRhaWxvcmVkIGNhbGxpbmcKKyMgaW50ZXJmYWNlLCBuYW1lbHkgdXBvbiBlbnRyeSBTSEFfQ1RYIGlzIHByZS1sb2FkZWQgdG8gZ2l2ZW4KKyMgcmVnaXN0ZXJzIGFuZCBjb3VudGVyIHJlZ2lzdGVyIGNvbnRhaW5zIGFtb3VudCBvZiBjaHVua3MgdG8KKyMgZGlnZXN0Li4uCiskY29kZS49PDxfX187CisuYWxpZ24JNAorTHNoYTFfYmxvY2tfcHJpdmF0ZToKK19fXworJGNvZGUuPTw8X19fOwkjIGxvYWQgS18wMF8xOQorCWxpcwkkSywweDVhODIKKwlvcmkJJEssJEssMHg3OTk5CitfX18KK2ZvcigkaT0wOyRpPDIwOyRpKyspCXsgJkJPRFlfMDBfMTkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49PDxfX187CSMgbG9hZCBLXzIwXzM5CisJbGlzCSRLLDB4NmVkOQorCW9yaQkkSywkSywweGViYTEKK19fXworZm9yKDskaTw0MDskaSsrKQl7ICZCT0RZXzIwXzM5KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPTw8X19fOwkjIGxvYWQgS180MF81OQorCWxpcwkkSywweDhmMWIKKwlvcmkJJEssJEssMHhiY2RjCitfX18KK2Zvcig7JGk8NjA7JGkrKykJeyAmQk9EWV80MF81OSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKyRjb2RlLj08PF9fXzsJIyBsb2FkIEtfNjBfNzkKKwlsaXMJJEssMHhjYTYyCisJb3JpCSRLLCRLLDB4YzFkNgorX19fCitmb3IoOyRpPDgwOyRpKyspCXsgJkJPRFlfMjBfMzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49PDxfX187CisJYWRkCXIxNixyMTYsJEUKKwlhZGQJcjE3LHIxNywkVAorCWFkZAlyMTgscjE4LCRBCisJYWRkCXIxOSxyMTksJEIKKwlhZGQJcjIwLHIyMCwkQworCXN0dwlyMTYsMCgkY3R4KQorCW1yCSRBLHIxNgorCXN0dwlyMTcsNCgkY3R4KQorCW1yCSRCLHIxNworCXN0dwlyMTgsOCgkY3R4KQorCW1yCSRDLHIxOAorCXN0dwlyMTksMTIoJGN0eCkKKwltcgkkRCxyMTkKKwlzdHcJcjIwLDE2KCRjdHgpCisJbXIJJEUscjIwCisJYWRkaQkkaW5wLCRpbnAsYDE2KjRgCisJYmRuei0JTHNoYTFfYmxvY2tfcHJpdmF0ZQorCWJscgorX19fCiskY29kZS49PDxfX187CisuYXNjaXoJIlNIQTEgYmxvY2sgdHJhbnNmb3JtIGZvciBQUEMsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBmeS5jaGFsbWVycy5zZT4iCitfX18KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CitwcmludCAkY29kZTsKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtczM5MHgucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLXMzOTB4LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTc4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLXMzOTB4LnBsCkBAIC0wLDAgKzEsMjI2IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgU0hBMSBibG9jayBwcm9jZWR1cmUgZm9yIHMzOTB4LgorCisjIEFwcmlsIDIwMDcuCisjCisjIFBlcmZvcm1hbmNlIGlzID4zMCUgYmV0dGVyIHRoYW4gZ2NjIDMuMyBnZW5lcmF0ZWQgY29kZS4gQnV0IHRoZSByZWFsCisjIHR3aXN0IGlzIHRoYXQgU0hBMSBoYXJkd2FyZSBzdXBwb3J0IGlzIGRldGVjdGVkIGFuZCB1dGlsaXplZC4gSW4KKyMgd2hpY2ggY2FzZSBwZXJmb3JtYW5jZSBjYW4gcmVhY2ggZnVydGhlciA+NC41eCBmb3IgbGFyZ2VyIGNodW5rcy4KKworIyBKYW51YXJ5IDIwMDkuCisjCisjIE9wdGltaXplIFh1cGRhdGUgZm9yIGFtb3VudCBvZiBtZW1vcnkgcmVmZXJlbmNlcyBhbmQgcmVzY2hlZHVsZQorIyBpbnN0cnVjdGlvbnMgdG8gZmF2b3VyIGR1YWwtaXNzdWUgejEwIHBpcGVsaW5lLiBPbiB6MTAgaGFyZHdhcmUgaXMKKyMgIm9ubHkiIH4yLjN4IGZhc3RlciB0aGFuIHNvZnR3YXJlLgorCiska2ltZGZ1bmM9MTsJIyBtYWdpYyBmdW5jdGlvbiBjb2RlIGZvciBraW1kIGluc3RydWN0aW9uCisKKyRvdXRwdXQ9c2hpZnQ7CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworCiskS18wMF8zOT0iJXIwIjsgJEs9JEtfMDBfMzk7CiskS180MF83OT0iJXIxIjsKKyRjdHg9IiVyMiI7CSRwcmVmZXRjaD0iJXIyIjsKKyRpbnA9IiVyMyI7CiskbGVuPSIlcjQiOworCiskQT0iJXI1IjsKKyRCPSIlcjYiOworJEM9IiVyNyI7CiskRD0iJXI4IjsKKyRFPSIlcjkiOwlAVj0oJEEsJEIsJEMsJEQsJEUpOworJHQwPSIlcjEwIjsKKyR0MT0iJXIxMSI7CitAWD0oIiVyMTIiLCIlcjEzIiwiJXIxNCIpOworJHNwPSIlcjE1IjsKKworJGZyYW1lPTE2MCsxNio0OworCitzdWIgWHVwZGF0ZSB7CitteSAkaT1zaGlmdDsKKworJGNvZGUuPTw8X19fIGlmICgkaT09MTUpOworCWxnCSRwcmVmZXRjaCwxNjAoJHNwKQkjIyMgWHVwZGF0ZSgxNikgd2FybS11cAorCWxyCSRYWzBdLCRYWzJdCitfX18KK3JldHVybiBpZiAoJGkmMSk7CSMgWHVwZGF0ZSBpcyB2ZWN0b3JpemVkIGFuZCBleGVjdXRlZCBldmVyeSAybmQgY3ljbGUKKyRjb2RlLj08PF9fXyBpZiAoJGk8MTYpOworCWxnCSRYWzBdLGAkaSo0YCgkaW5wKQkjIyMgWGxvYWQoJGkpCisJcmxsZwkkWFsxXSwkWFswXSwzMgorX19fCiskY29kZS49PDxfX18gaWYgKCRpPj0xNik7CisJeGdyCSRYWzBdLCRwcmVmZXRjaAkJIyMjIFh1cGRhdGUoJGkpCisJbGcJJHByZWZldGNoLGAxNjArNCooKCRpKzIpJTE2KWAoJHNwKQorCXhnCSRYWzBdLGAxNjArNCooKCRpKzgpJTE2KWAoJHNwKQorCXhncgkkWFswXSwkcHJlZmV0Y2gKKwlybGwJJFhbMF0sJFhbMF0sMQorCXJsbGcJJFhbMV0sJFhbMF0sMzIKKwlybGwJJFhbMV0sJFhbMV0sMQorCXJsbGcJJFhbMF0sJFhbMV0sMzIKKwlscgkkWFsyXSwkWFsxXQkJIyBmZWVkYmFjaworX19fCiskY29kZS49PDxfX18gaWYgKCRpPD03MCk7CisJc3RnCSRYWzBdLGAxNjArNCooJGklMTYpYCgkc3ApCitfX18KK3Vuc2hpZnQoQFgscG9wKEBYKSk7Cit9CisKK3N1YiBCT0RZXzAwXzE5IHsKK215ICgkaSwkYSwkYiwkYywkZCwkZSk9QF87CitteSAkeGk9JFhbMV07CisKKwkmWHVwZGF0ZSgkaSk7CiskY29kZS49PDxfX187CisJYWxyCSRlLCRLCQkjIyMgJGkKKwlybGwJJHQxLCRhLDUKKwlscgkkdDAsJGQKKwl4cgkkdDAsJGMKKwlhbHIJJGUsJHQxCisJbnIJJHQwLCRiCisJYWxyCSRlLCR4aQorCXhyCSR0MCwkZAorCXJsbAkkYiwkYiwzMAorCWFscgkkZSwkdDAKK19fXworfQorCitzdWIgQk9EWV8yMF8zOSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUpPUBfOworbXkgJHhpPSRYWzFdOworCisJJlh1cGRhdGUoJGkpOworJGNvZGUuPTw8X19fOworCWFscgkkZSwkSwkJIyMjICRpCisJcmxsCSR0MSwkYSw1CisJbHIJJHQwLCRiCisJYWxyCSRlLCR0MQorCXhyCSR0MCwkYworCWFscgkkZSwkeGkKKwl4cgkkdDAsJGQKKwlybGwJJGIsJGIsMzAKKwlhbHIJJGUsJHQwCitfX18KK30KKworc3ViIEJPRFlfNDBfNTkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlKT1AXzsKK215ICR4aT0kWFsxXTsKKworCSZYdXBkYXRlKCRpKTsKKyRjb2RlLj08PF9fXzsKKwlhbHIJJGUsJEsJCSMjIyAkaQorCXJsbAkkdDEsJGEsNQorCWxyCSR0MCwkYgorCWFscgkkZSwkdDEKKwlvcgkkdDAsJGMKKwlscgkkdDEsJGIKKwlucgkkdDAsJGQKKwlucgkkdDEsJGMKKwlhbHIJJGUsJHhpCisJb3IJJHQwLCR0MQorCXJsbAkkYiwkYiwzMAorCWFscgkkZSwkdDAKK19fXworfQorCiskY29kZS49PDxfX187CisudGV4dAorLmFsaWduCTY0CisudHlwZQlLdGFibGUsXEBvYmplY3QKK0t0YWJsZTogLmxvbmcJMHg1YTgyNzk5OSwweDZlZDllYmExLDB4OGYxYmJjZGMsMHhjYTYyYzFkNgorCS5za2lwCTQ4CSMubG9uZwkwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMAorLnNpemUJS3RhYmxlLC4tS3RhYmxlCisuZ2xvYmwJc2hhMV9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsXEBmdW5jdGlvbgorc2hhMV9ibG9ja19kYXRhX29yZGVyOgorX19fCiskY29kZS49PDxfX18gaWYgKCRraW1kZnVuYyk7CisJbGFybAklcjEsT1BFTlNTTF9zMzkweGNhcF9QCisJbGcJJXIwLDAoJXIxKQorCXRtaGwJJXIwLDB4NDAwMAkjIGNoZWNrIGZvciBtZXNzYWdlLXNlY3VyaXR5IGFzc2lzdAorCWp6CS5Mc29mdHdhcmUKKwlsZ2hpCSVyMCwwCisJbGEJJXIxLDE2KCRzcCkKKwkubG9uZwkweGI5M2UwMDAyCSMga2ltZCAlcjAsJXIyCisJbGcJJXIwLDE2KCRzcCkKKwl0bWhoCSVyMCxgMHg4MDAwPj4ka2ltZGZ1bmNgCisJanoJLkxzb2Z0d2FyZQorCWxnaGkJJXIwLCRraW1kZnVuYworCWxncgklcjEsJGN0eAorCWxncgklcjIsJGlucAorCXNsbGcJJXIzLCRsZW4sNgorCS5sb25nCTB4YjkzZTAwMDIJIyBraW1kICVyMCwlcjIKKwlicmMJMSwuLTQJCSMgcGF5IGF0dGVudGlvbiB0byAicGFydGlhbCBjb21wbGV0aW9uIgorCWJyCSVyMTQKKy5hbGlnbgkxNgorLkxzb2Z0d2FyZToKK19fXworJGNvZGUuPTw8X19fOworCWxnaGkJJXIxLC0kZnJhbWUKKwlzdGcJJGN0eCwxNigkc3ApCisJc3RtZwklcjYsJXIxNSw0OCgkc3ApCisJbGdyCSVyMCwkc3AKKwlsYQkkc3AsMCglcjEsJHNwKQorCXN0ZwklcjAsMCgkc3ApCisKKwlsYXJsCSR0MCxLdGFibGUKKwlsbGdmCSRBLDAoJGN0eCkKKwlsbGdmCSRCLDQoJGN0eCkKKwlsbGdmCSRDLDgoJGN0eCkKKwlsbGdmCSRELDEyKCRjdHgpCisJbGxnZgkkRSwxNigkY3R4KQorCisJbGcJJEtfMDBfMzksMCgkdDApCisJbGcJJEtfNDBfNzksOCgkdDApCisKKy5MbG9vcDoKKwlybGxnCSRLXzAwXzM5LCRLXzAwXzM5LDMyCitfX18KK2ZvciAoJGk9MDskaTwyMDskaSsrKQl7ICZCT0RZXzAwXzE5KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPTw8X19fOworCXJsbGcJJEtfMDBfMzksJEtfMDBfMzksMzIKK19fXworZm9yICg7JGk8NDA7JGkrKykJeyAmQk9EWV8yMF8zOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKyRjb2RlLj08PF9fXzsJJEs9JEtfNDBfNzk7CisJcmxsZwkkS180MF83OSwkS180MF83OSwzMgorX19fCitmb3IgKDskaTw2MDskaSsrKQl7ICZCT0RZXzQwXzU5KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPTw8X19fOworCXJsbGcJJEtfNDBfNzksJEtfNDBfNzksMzIKK19fXworZm9yICg7JGk8ODA7JGkrKykJeyAmQk9EWV8yMF8zOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKyRjb2RlLj08PF9fXzsKKworCWxnCSRjdHgsYCRmcmFtZSsxNmAoJHNwKQorCWxhCSRpbnAsNjQoJGlucCkKKwlhbAkkQSwwKCRjdHgpCisJYWwJJEIsNCgkY3R4KQorCWFsCSRDLDgoJGN0eCkKKwlhbAkkRCwxMigkY3R4KQorCWFsCSRFLDE2KCRjdHgpCisJc3QJJEEsMCgkY3R4KQorCXN0CSRCLDQoJGN0eCkKKwlzdAkkQyw4KCRjdHgpCisJc3QJJEQsMTIoJGN0eCkKKwlzdAkkRSwxNigkY3R4KQorCWJyY3QJJGxlbiwuTGxvb3AKKworCWxtZwklcjYsJXIxNSxgJGZyYW1lKzQ4YCgkc3ApCisJYnIJJXIxNAorLnNpemUJc2hhMV9ibG9ja19kYXRhX29yZGVyLC4tc2hhMV9ibG9ja19kYXRhX29yZGVyCisuc3RyaW5nCSJTSEExIGJsb2NrIHRyYW5zZm9ybSBmb3IgczM5MHgsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuY29tbQlPUEVOU1NMX3MzOTB4Y2FwX1AsOCw4CitfX18KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CisKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS1zcGFyY3Y5LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS1zcGFyY3Y5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDZmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGExLXNwYXJjdjkucGwKQEAgLTAsMCArMSwyODMgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpcyBub3QgcmVhbGx5IGltcHJlc3NpdmUgb24gcHJlLVQxIENQVTogKzglCisjIG92ZXIgU3VuIEMgYW5kICsyNSUgb3ZlciBnY2MgWzMuM10uIFdoaWxlIG9uIFQxLCBhLmsuYS4gTmlhZ2FyYSwgaXQKKyMgdHVybmVkIHRvIGJlIDQwJSBmYXN0ZXIgdGhhbiA2NC1iaXQgY29kZSBnZW5lcmF0ZWQgYnkgU3VuIEMgNS44IGFuZAorIyA+MnggdGhhbiA2NC1iaXQgY29kZSBnZW5lcmF0ZWQgYnkgZ2NjIDMuNC4gQW5kIHRoZXJlIGlzIGEgZ2ltbWljay4KKyMgWFsxNl0gdmVjdG9yIGlzIHBhY2tlZCB0byA4IDY0LWJpdCByZWdpc3RlcnMgYW5kIGFzIHJlc3VsdCBub3RoaW5nCisjIGlzIHNwaWxsZWQgb24gc3RhY2suIEluIGFkZGl0aW9uIGlucHV0IGRhdGEgaXMgbG9hZGVkIGluIGNvbXBhY3QKKyMgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UsIHRodXMgbWluaW1pemluZyB0aGUgd2luZG93IHdoZW4gdGhlIGNvZGUgaXMKKyMgc3ViamVjdCB0byBbaW50ZXItdGhyZWFkXSBjYWNoZS10aHJhc2hpbmcgaGF6YXJkLiBUaGUgZ29hbCBpcyB0bworIyBlbnN1cmUgc2NhbGFiaWxpdHkgb24gVWx0cmFTUEFSQyBUMSwgb3IgcmF0aGVyIHRvIGF2b2lkIGRlY2F5IHdoZW4KKyMgYW1vdW50IG9mIGFjdGl2ZSB0aHJlYWRzIGV4Y2VlZHMgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBjb3Jlcy4KKworJGJpdHM9MzI7Citmb3IgKEBBUkdWKQl7ICRiaXRzPTY0IGlmICgvXC1tNjQvIHx8IC9cLXhhcmNoXD12OS8pOyB9CitpZiAoJGJpdHM9PTY0KQl7ICRiaWFzPTIwNDc7ICRmcmFtZT0xOTI7IH0KK2Vsc2UJCXsgJGJpYXM9MDsgICAgJGZyYW1lPTExMjsgfQorCiskb3V0cHV0PXNoaWZ0Oworb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworQFg9KCIlbzAiLCIlbzEiLCIlbzIiLCIlbzMiLCIlbzQiLCIlbzUiLCIlZzEiLCIlbzciKTsKKyRyb3QxbT0iJWcyIjsKKyR0bXA2ND0iJWczIjsKKyRYaT0iJWc0IjsKKyRBPSIlbDAiOworJEI9IiVsMSI7CiskQz0iJWwyIjsKKyREPSIlbDMiOworJEU9IiVsNCI7CitAVj0oJEEsJEIsJEMsJEQsJEUpOworJEtfMDBfMTk9IiVsNSI7CiskS18yMF8zOT0iJWw2IjsKKyRLXzQwXzU5PSIlbDciOworJEtfNjBfNzk9IiVnNSI7CitASz0oJEtfMDBfMTksJEtfMjBfMzksJEtfNDBfNTksJEtfNjBfNzkpOworCiskY3R4PSIlaTAiOworJGlucD0iJWkxIjsKKyRsZW49IiVpMiI7CiskdG1wMD0iJWkzIjsKKyR0bXAxPSIlaTQiOworJHRtcDI9IiVpNSI7CisKK3N1YiBCT0RZXzAwXzE1IHsKK215ICgkaSwkYSwkYiwkYywkZCwkZSk9QF87CitteSAkeGk9KCRpJjEpP0BYWygkaS8yKSU4XTokWGk7CisKKyRjb2RlLj08PF9fXzsKKwlzbGwJJGEsNSwkdG1wMAkJISEgJGkKKwlhZGQJQEtbJGkvMjBdLCRlLCRlCisJc3JsCSRhLDI3LCR0bXAxCisJYWRkCSR0bXAwLCRlLCRlCisJYW5kCSRjLCRiLCR0bXAwCisJYWRkCSR0bXAxLCRlLCRlCisJc2xsCSRiLDMwLCR0bXAyCisJYW5kbgkkZCwkYiwkdG1wMQorCXNybAkkYiwyLCRiCisJb3IJJHRtcDEsJHRtcDAsJHRtcDEKKwlvcgkkdG1wMiwkYiwkYgorCWFkZAkkeGksJGUsJGUKK19fXworaWYgKCRpJjEgJiYgJGk8MTUpIHsKKwkkY29kZS49CisJIglzcmx4CUBYWygoJGkrMSkvMiklOF0sMzIsJFhpXG4iOworfQorJGNvZGUuPTw8X19fOworCWFkZAkkdG1wMSwkZSwkZQorX19fCit9CisKK3N1YiBYdXBkYXRlIHsKK215ICgkaSwkYSwkYiwkYywkZCwkZSk9QF87CitteSAkaj0kaS8yOworCitpZiAoJGkmMSkgeworJGNvZGUuPTw8X19fOworCXNsbAkkYSw1LCR0bXAwCQkhISAkaQorCWFkZAlAS1skaS8yMF0sJGUsJGUKKwlzcmwJJGEsMjcsJHRtcDEKK19fXworfSBlbHNlIHsKKyRjb2RlLj08PF9fXzsKKwlzbGx4CUBYWygkais2KSU4XSwzMiwkWGkJISBYdXBkYXRlKCRpKQorCXhvcglAWFsoJGorMSklOF0sQFhbJGolOF0sQFhbJGolOF0KKwlzcmx4CUBYWygkais3KSU4XSwzMiwkdG1wMQorCXhvcglAWFsoJGorNCklOF0sQFhbJGolOF0sQFhbJGolOF0KKwlzbGwJJGEsNSwkdG1wMAkJISEgJGkKKwlvcgkkdG1wMSwkWGksJFhpCisJYWRkCUBLWyRpLzIwXSwkZSwkZQkJISEKKwl4b3IJJFhpLEBYWyRqJThdLEBYWyRqJThdCisJc3JseAlAWFskaiU4XSwzMSwkWGkKKwlhZGQJQFhbJGolOF0sQFhbJGolOF0sQFhbJGolOF0KKwlhbmQJJFhpLCRyb3QxbSwkWGkKKwlhbmRuCUBYWyRqJThdLCRyb3QxbSxAWFskaiU4XQorCXNybAkkYSwyNywkdG1wMQkJISEKKwlvcgkkWGksQFhbJGolOF0sQFhbJGolOF0KK19fXworfQorfQorCitzdWIgQk9EWV8xNl8xOSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUpPUBfOworCisJJlh1cGRhdGUoQF8pOworICAgIGlmICgkaSYxKSB7CisJJHhpPUBYWygkaS8yKSU4XTsKKyAgICB9IGVsc2UgeworCSR4aT0kWGk7CisJJGNvZGUuPSJcdHNybHgJQFhbKCRpLzIpJThdLDMyLCR4aVxuIjsKKyAgICB9CiskY29kZS49PDxfX187CisJYWRkCSR0bXAwLCRlLCRlCQkhIQorCWFuZAkkYywkYiwkdG1wMAorCWFkZAkkdG1wMSwkZSwkZQorCXNsbAkkYiwzMCwkdG1wMgorCWFkZAkkeGksJGUsJGUKKwlhbmRuCSRkLCRiLCR0bXAxCisJc3JsCSRiLDIsJGIKKwlvcgkkdG1wMSwkdG1wMCwkdG1wMQorCW9yCSR0bXAyLCRiLCRiCisJYWRkCSR0bXAxLCRlLCRlCitfX18KK30KKworc3ViIEJPRFlfMjBfMzkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlKT1AXzsKK215ICR4aTsKKwkmWHVwZGF0ZShAXyk7CisgICAgaWYgKCRpJjEpIHsKKwkkeGk9QFhbKCRpLzIpJThdOworICAgIH0gZWxzZSB7CisJJHhpPSRYaTsKKwkkY29kZS49Ilx0c3JseAlAWFsoJGkvMiklOF0sMzIsJHhpXG4iOworICAgIH0KKyRjb2RlLj08PF9fXzsKKwlhZGQJJHRtcDAsJGUsJGUJCSEhCisJeG9yCSRjLCRiLCR0bXAwCisJYWRkCSR0bXAxLCRlLCRlCisJc2xsCSRiLDMwLCR0bXAyCisJeG9yCSRkLCR0bXAwLCR0bXAxCisJc3JsCSRiLDIsJGIKKwlhZGQJJHRtcDEsJGUsJGUKKwlvcgkkdG1wMiwkYiwkYgorCWFkZAkkeGksJGUsJGUKK19fXworfQorCitzdWIgQk9EWV80MF81OSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUpPUBfOworbXkgJHhpOworCSZYdXBkYXRlKEBfKTsKKyAgICBpZiAoJGkmMSkgeworCSR4aT1AWFsoJGkvMiklOF07CisgICAgfSBlbHNlIHsKKwkkeGk9JFhpOworCSRjb2RlLj0iXHRzcmx4CUBYWygkaS8yKSU4XSwzMiwkeGlcbiI7CisgICAgfQorJGNvZGUuPTw8X19fOworCWFkZAkkdG1wMCwkZSwkZQkJISEKKwlhbmQJJGMsJGIsJHRtcDAKKwlhZGQJJHRtcDEsJGUsJGUKKwlzbGwJJGIsMzAsJHRtcDIKKwlvcgkkYywkYiwkdG1wMQorCXNybAkkYiwyLCRiCisJYW5kCSRkLCR0bXAxLCR0bXAxCisJYWRkCSR4aSwkZSwkZQorCW9yCSR0bXAxLCR0bXAwLCR0bXAxCisJb3IJJHRtcDIsJGIsJGIKKwlhZGQJJHRtcDEsJGUsJGUKK19fXworfQorCiskY29kZS49PDxfX18gaWYgKCRiaXRzPT02NCk7CisucmVnaXN0ZXIJJWcyLCNzY3JhdGNoCisucmVnaXN0ZXIJJWczLCNzY3JhdGNoCitfX18KKyRjb2RlLj08PF9fXzsKKy5zZWN0aW9uCSIudGV4dCIsI2FsbG9jLCNleGVjaW5zdHIKKworLmFsaWduCTMyCisuZ2xvYmwJc2hhMV9ibG9ja19kYXRhX29yZGVyCitzaGExX2Jsb2NrX2RhdGFfb3JkZXI6CisJc2F2ZQklc3AsLSRmcmFtZSwlc3AKKwlzbGx4CSRsZW4sNiwkbGVuCisJYWRkCSRpbnAsJGxlbiwkbGVuCisKKwlvcgklZzAsMSwkcm90MW0KKwlzbGx4CSRyb3QxbSwzMiwkcm90MW0KKwlvcgkkcm90MW0sMSwkcm90MW0KKworCWxkCVskY3R4KzBdLCRBCisJbGQJWyRjdHgrNF0sJEIKKwlsZAlbJGN0eCs4XSwkQworCWxkCVskY3R4KzEyXSwkRAorCWxkCVskY3R4KzE2XSwkRQorCWFuZG4JJGlucCw3LCR0bXAwCisKKwlzZXRoaQklaGkoMHg1YTgyNzk5OSksJEtfMDBfMTkKKwlvcgkkS18wMF8xOSwlbG8oMHg1YTgyNzk5OSksJEtfMDBfMTkKKwlzZXRoaQklaGkoMHg2ZWQ5ZWJhMSksJEtfMjBfMzkKKwlvcgkkS18yMF8zOSwlbG8oMHg2ZWQ5ZWJhMSksJEtfMjBfMzkKKwlzZXRoaQklaGkoMHg4ZjFiYmNkYyksJEtfNDBfNTkKKwlvcgkkS180MF81OSwlbG8oMHg4ZjFiYmNkYyksJEtfNDBfNTkKKwlzZXRoaQklaGkoMHhjYTYyYzFkNiksJEtfNjBfNzkKKwlvcgkkS182MF83OSwlbG8oMHhjYTYyYzFkNiksJEtfNjBfNzkKKworLkxsb29wOgorCWxkeAlbJHRtcDArMF0sQFhbMF0KKwlsZHgJWyR0bXAwKzE2XSxAWFsyXQorCWxkeAlbJHRtcDArMzJdLEBYWzRdCisJbGR4CVskdG1wMCs0OF0sQFhbNl0KKwlhbmQJJGlucCw3LCR0bXAxCisJbGR4CVskdG1wMCs4XSxAWFsxXQorCXNsbAkkdG1wMSwzLCR0bXAxCisJbGR4CVskdG1wMCsyNF0sQFhbM10KKwlzdWJjYwklZzAsJHRtcDEsJHRtcDIJISBzaG91bGQgYmUgNjQtJHRtcDEsIGJ1dCAtJHRtcDEgd29ya3MgdG9vCisJbGR4CVskdG1wMCs0MF0sQFhbNV0KKwlieixwdAklaWNjLC5MYWxpZ25lZAorCWxkeAlbJHRtcDArNTZdLEBYWzddCisKKwlzbGx4CUBYWzBdLCR0bXAxLEBYWzBdCisJbGR4CVskdG1wMCs2NF0sJHRtcDY0CitfX18KK2ZvcigkaT0wOyRpPDc7JGkrKykKK3sgICAkY29kZS49PDxfX187CisJc3JseAlAWFskaSsxXSwkdG1wMiwkWGkKKwlzbGx4CUBYWyRpKzFdLCR0bXAxLEBYWyRpKzFdCisJb3IJJFhpLEBYWyRpXSxAWFskaV0KK19fXworfQorJGNvZGUuPTw8X19fOworCXNybHgJJHRtcDY0LCR0bXAyLCR0bXA2NAorCW9yCSR0bXA2NCxAWFs3XSxAWFs3XQorLkxhbGlnbmVkOgorCXNybHgJQFhbMF0sMzIsJFhpCitfX18KK2ZvciAoJGk9MDskaTwxNjskaSsrKQl7ICZCT0RZXzAwXzE1KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorZm9yICg7JGk8MjA7JGkrKykJeyAmQk9EWV8xNl8xOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KK2ZvciAoOyRpPDQwOyRpKyspCXsgJkJPRFlfMjBfMzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9Citmb3IgKDskaTw2MDskaSsrKQl7ICZCT0RZXzQwXzU5KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorZm9yICg7JGk8ODA7JGkrKykJeyAmQk9EWV8yMF8zOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKyRjb2RlLj08PF9fXzsKKworCWxkCVskY3R4KzBdLEBYWzBdCisJbGQJWyRjdHgrNF0sQFhbMV0KKwlsZAlbJGN0eCs4XSxAWFsyXQorCWxkCVskY3R4KzEyXSxAWFszXQorCWFkZAkkaW5wLDY0LCRpbnAKKwlsZAlbJGN0eCsxNl0sQFhbNF0KKwljbXAJJGlucCwkbGVuCisKKwlhZGQJJEEsQFhbMF0sJEEKKwlzdAkkQSxbJGN0eCswXQorCWFkZAkkQixAWFsxXSwkQgorCXN0CSRCLFskY3R4KzRdCisJYWRkCSRDLEBYWzJdLCRDCisJc3QJJEMsWyRjdHgrOF0KKwlhZGQJJEQsQFhbM10sJEQKKwlzdAkkRCxbJGN0eCsxMl0KKwlhZGQJJEUsQFhbNF0sJEUKKwlzdAkkRSxbJGN0eCsxNl0KKworCWJuZQlgJGJpdHM9PTY0PyIleGNjIjoiJWljYyJgLC5MbG9vcAorCWFuZG4JJGlucCw3LCR0bXAwCisKKwlyZXQKKwlyZXN0b3JlCisudHlwZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsI2Z1bmN0aW9uCisuc2l6ZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsKC4tc2hhMV9ibG9ja19kYXRhX29yZGVyKQorLmFzY2l6CSJTSEExIGJsb2NrIHRyYW5zZm9ybSBmb3IgU1BBUkN2OSwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS1zcGFyY3Y5YS5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtc3BhcmN2OWEucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVlYjg1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtc3BhcmN2OWEucGwKQEAgLTAsMCArMSw2MDAgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBKYW51YXJ5IDIwMDkKKyMKKyMgUHJvdmlkZWQgdGhhdCBVbHRyYVNQQVJDIFZJUyBpbnN0cnVjdGlvbnMgYXJlIHBpcGUtbGluZWQoKikgYW5kCisjIHBhaXJhYmxlKCopIHdpdGggSUFMVSBvbmVzLCBvZmZsb2FkaW5nIG9mIFh1cGRhdGUgdG8gdGhlIFVsdHJhU1BBUkMKKyMgR3JhcGhpYyBVbml0IHdvdWxkIG1ha2UgaXQgcG9zc2libGUgdG8gYWNoaWV2ZSBoaWdoZXIgaW5zdHJ1Y3Rpb24tCisjIGxldmVsIHBhcmFsbGVsaXNtLCBJTFAsIGFuZCB0aHVzIGhpZ2hlciBwZXJmb3JtYW5jZS4gSXQgc2hvdWxkIGJlCisjIGV4cGxpY2l0bHkgbm90ZWQgdGhhdCBJTFAgaXMgdGhlIGtleXdvcmQsIGFuZCBpdCBtZWFucyB0aGF0IHRoaXMKKyMgY29kZSB3b3VsZCBiZSB1bnN1aXRhYmxlIGZvciBjb3JlcyBsaWtlIFVsdHJhU1BBUkMtVHguIFRoZSBpZGVhIGlzCisjIG5vdCByZWFsbHkgbm92ZWwsIFN1biBoYWQgVklTLXBvd2VyZWQgaW1wbGVtZW50YXRpb24gZm9yIGEgd2hpbGUuCisjIFVubGlrZSBTdW4ncyBpbXBsZW1lbnRhdGlvbiB0aGlzIG9uZSBjYW4gcHJvY2VzcyBtdWx0aXBsZSB1bmFsaWduZWQKKyMgaW5wdXQgYmxvY2tzLCBhbmQgYXMgc3VjaCB3b3JrcyBhcyBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBPcGVuU1NMCisjIHNoYTFfYmxvY2tfZGF0YV9vcmRlci4gUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2FzIG1lYXN1cmVkIHRvIGJlCisjIDQwJSBvdmVyIHB1cmUgSUFMVSBzaGExLXNwYXJjdjkucGwgb24gVWx0cmFTUEFSQy1JSWksIGJ1dCAxMiUgb24KKyMgVWx0cmFTUEFSQy1JSUkuIFNlZSBiZWxvdyBmb3IgZGlzY3Vzc2lvbi4uLgorIworIyBUaGUgbW9kdWxlIGRvZXMgbm90IHByZXNlbnQgZGlyZWN0IGludGVyZXN0IGZvciBPcGVuU1NMLCBiZWNhdXNlCisjIGl0IGRvZXNuJ3QgcHJvdmlkZSBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gY29udGVtcG9yYXJ5IFNQQVJDdjkgQ1BVcywKKyMgVWx0cmFTUEFSQy1UeCBhbmQgU1BBUkM2NC1WW0lJXSB0byBiZSBzcGVjaWZpYy4gVGhvc2Ugd2hvIGZlZWwgdGhleQorIyBhYnNvbHV0ZWx5IG11c3Qgc2NvcmUgb24gVWx0cmFTUEFSQy1JLUlWIGNhbiBzaW1wbHkgcmVwbGFjZQorIyBjcnlwdG8vc2hhL2FzbS9zaGExLXNwYXJjdjkucGwgd2l0aCB0aGlzIG1vZHVsZS4KKyMKKyMgKCopCSJQaXBlLWxpbmVkIiBtZWFucyB0aGF0IGV2ZW4gaWYgaXQgdGFrZXMgc2V2ZXJhbCBjeWNsZXMgdG8KKyMJY29tcGxldGUsIG5leHQgaW5zdHJ1Y3Rpb24gdXNpbmcgc2FtZSBmdW5jdGlvbmFsIHVuaXQgW2J1dCBub3QKKyMJZGVwZW5kaW5nIG9uIHRoZSByZXN1bHQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb25dIGNhbiBzdGFydAorIwlleGVjdXRpb24gd2l0aG91dCBoYXZpbmcgdG8gd2FpdCBmb3IgdGhlIHVuaXQuICJQYWlyYWJsZSIKKyMJbWVhbnMgdGhhdCB0d28gW29yIG1vcmVdIGluZGVwZW5kZW50IGluc3RydWN0aW9ucyBjYW4gYmUKKyMJaXNzdWVkIGF0IHRoZSB2ZXJ5IHNhbWUgdGltZS4KKworJGJpdHM9MzI7Citmb3IgKEBBUkdWKQl7ICRiaXRzPTY0IGlmICgvXC1tNjQvIHx8IC9cLXhhcmNoXD12OS8pOyB9CitpZiAoJGJpdHM9PTY0KQl7ICRiaWFzPTIwNDc7ICRmcmFtZT0xOTI7IH0KK2Vsc2UJCXsgJGJpYXM9MDsgICAgJGZyYW1lPTExMjsgfQorCiskb3V0cHV0PXNoaWZ0Oworb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworJGN0eD0iJWkwIjsKKyRpbnA9IiVpMSI7CiskbGVuPSIlaTIiOworJHRtcDA9IiVpMyI7CiskdG1wMT0iJWk0IjsKKyR0bXAyPSIlaTUiOworJHRtcDM9IiVnNSI7CisKKyRiYXNlPSIlZzEiOworJGFsaWduPSIlZzQiOworJFhmZXI9IiVvNSI7CiskblhmZXI9JHRtcDM7CiskWGk9IiVvNyI7CisKKyRBPSIlbDAiOworJEI9IiVsMSI7CiskQz0iJWwyIjsKKyREPSIlbDMiOworJEU9IiVsNCI7CitAVj0oJEEsJEIsJEMsJEQsJEUpOworCiskQWN0eD0iJW8wIjsKKyRCY3R4PSIlbzEiOworJENjdHg9IiVvMiI7CiskRGN0eD0iJW8zIjsKKyRFY3R4PSIlbzQiOworCiskZm11bD0iJWYzMiI7CiskVktfMDBfMTk9IiVmMzQiOworJFZLXzIwXzM5PSIlZjM2IjsKKyRWS180MF81OT0iJWYzOCI7CiskVktfNjBfNzk9IiVmNDAiOworQFZLPSgkVktfMDBfMTksJFZLXzIwXzM5LCRWS180MF81OSwkVktfNjBfNzkpOworQFg9KCIlZjAiLCAiJWYxIiwgIiVmMiIsICIlZjMiLCAiJWY0IiwgIiVmNSIsICIlZjYiLCAiJWY3IiwKKyAgICAiJWY4IiwgIiVmOSIsIiVmMTAiLCIlZjExIiwiJWYxMiIsIiVmMTMiLCIlZjE0IiwiJWYxNSIsIiVmMTYiKTsKKworIyBUaGlzIGlzIHJlZmVyZW5jZSAyeC1wYXJhbGxlbGl6ZWQgVklTLXBvd2VyZWQgWHVwZGF0ZSBwcm9jZWR1cmUuIEl0CisjIGNvdmVycyBldmVuIEtfTk5fTU0gYWRkaXRpb24uLi4KK3N1YiBYdXBkYXRlIHsKK215ICgkaSk9QF87CitteSAkSz1AVktbKCRpKzE2KS8yMF07CitteSAkaj0oJGkrMTYpJTE2OworCisjCVsgcHJvdmlkZWQgdGhhdCBHU1IuYWxpZ25hZGRyX29mZnNldCBpcyA1LCAkbXVsIGNvbnRhaW5zCisjCSAgMHgxMDBVTEw8PDMyfDB4MTAwIHZhbHVlIGFuZCBLX05OX01NIGFyZSBwcmUtbG9hZGVkIHRvCisjCSAgY2hvc2VuIHJlZ2lzdGVycy4uLiBdCiskY29kZS49PDxfX187CisJZnhvcnMJCUBYWygkaisxMyklMTZdLEBYWyRqXSxAWFskal0JIS0xLy0xLy0xOlhbMF1ePVhbMTNdCisJZnhvcnMJCUBYWygkaisxNCklMTZdLEBYWyRqKzFdLEBYWyRqKzFdISAwLyAwLyAwOlhbMV1ePVhbMTRdCisJZnhvcgkJQFhbKCRqKzIpJTE2XSxAWFsoJGorOCklMTZdLCVmMTghIDEvIDEvIDE6VG1wPVhbMiwzXV5YWzgsOV0KKwlmeG9yCQklZjE4LEBYWyRqXSxAWFskal0JCSEgMi8gNC8gMzpYWzAsMV1ePVhbMiwzXV5YWzgsOV0KKwlmYWxpZ25kYXRhCUBYWyRqXSxAWFskal0sJWYxOAkJISAzLyA3LyA1OlRtcD1YWzAsMV0+Pj4yNAorCWZwYWRkMzIJCUBYWyRqXSxAWFskal0sQFhbJGpdCQkhIDQvIDgvIDY6WFswLDFdPDw9MQorCWZtdWw4dWx4MTYJJWYxOCwkZm11bCwlZjE4CQkJISA1LzEwLyA3OlRtcD4+PTcsIFRtcCY9MQorCSFbZnhvcnMJCSVmMTUsJWYyLCVmMl0KKwlmb3IJCSVmMTgsQFhbJGpdLEBYWyRqXQkJISA4LzE0LzEwOlhbMCwxXXw9VG1wCisJIVtmeG9ycwkJJWYwLCVmMywlZjNdCQkJITEwLzE3LzEyOlhbMF0gZGVwZW5kZW5jeQorCWZwYWRkMzIJCSRLLEBYWyRqXSwlZjIwCisJc3RkCQklZjIwLFskWGZlcitgNCokamBdCitfX18KKyMgVGhlIG51bWJlcnMgZGVsaW1pdGVkIHdpdGggc2xhc2ggYXJlIHRoZSBlYXJsaWVzdCBwb3NzaWJsZSBkaXNwYXRjaAorIyBjeWNsZXMgZm9yIGdpdmVuIGluc3RydWN0aW9uIGFzc3VtaW5nIDEgY3ljbGUgbGF0ZW5jeSBmb3Igc2ltcGxlIFZJUworIyBpbnN0cnVjdGlvbnMsIHN1Y2ggYXMgb24gVWx0cmFTUEFSQy1JJklJLCAzIGN5Y2xlcyBsYXRlbmN5LCBzdWNoIGFzCisjIG9uIFVsdHJhU1BBUkMtSUlJJklWLCBhbmQgMiBjeWNsZXMgbGF0ZW5jeSgqKSwgcmVzcGVjdGl2ZWx5LiBCZWluZworIyAyeC1wYXJhbGxlbGl6ZWQgdGhlIHByb2NlZHVyZSBpcyAid29ydGgiIDUsIDguNSBvciA2IHRpY2tzIHBlciBTSEExCisjIHJvdW5kLiBBcyBbbG9uZyBhc10gRlBVL1ZJUyBpbnN0cnVjdGlvbnMgYXJlIHBlcmZlY3RseSBwYWlyYWJsZSB3aXRoCisjIElBTFUgb25lcywgdGhlIHJvdW5kIHRpbWluZyBpcyBkZWZpbmVkIGJ5IHRoZSBtYXhpbXVtIGJldHdlZW4gVklTCisjIGFuZCBJQUxVIHRpbWluZ3MuIFRoZSBsYXR0ZXIgdmFyaWVzIGZyb20gcm91bmQgdG8gcm91bmQgYW5kIGF2ZXJhZ2VzCisjIG91dCBhdCA2LjI1IHRpY2tzLiBUaGlzIG1lYW5zIHRoYXQgVVNJJklJIHNob3VsZCBvcGVyYXRlIGF0IElBTFUKKyMgcmF0ZSwgd2hpbGUgVVNJSUkmSVYgLSBhdCBWSVMgcmF0ZS4gVGhpcyBleHBsYWlucyB3aHkgcGVyZm9ybWFuY2UKKyMgaW1wcm92ZW1lbnQgdmFyaWVzIGFtb25nIHByb2Nlc3NvcnMuIFdlbGwsIGdpdmVuIHRoYXQgcHVyZSBJQUxVCisjIHNoYTEtc3BhcmN2OS5wbCBtb2R1bGUgZXhoaWJpdHMgdmlydHVhbGx5IHVuaWZvcm0gcGVyZm9ybWFuY2Ugb2YKKyMgfjkuMyBjeWNsZXMgcGVyIFNIQTEgcm91bmQuIFRpbWluZ3MgbWVudGlvbmVkIGFib3ZlIGFyZSB0aGVvcmV0aWNhbAorIyBsb3dlciBsaW1pdHMuIFJlYWwtbGlmZSBwZXJmb3JtYW5jZSB3YXMgbWVhc3VyZWQgdG8gYmUgNi42IGN5Y2xlcworIyBwZXIgU0hBMSByb3VuZCBvbiBVU0lJaSBhbmQgOC4zIG9uIFVTSUlJLiBUaGUgbGF0dGVyIGlzIGxvd2VyIHRoYW4KKyMgaGFsZi1yb3VuZCBWSVMgdGltaW5nLCBiZWNhdXNlIHRoZXJlIGFyZSAxNiBYdXBkYXRlLWZyZWUgcm91bmRzLAorIyB3aGljaCAicHVzaCBkb3duIiBhdmVyYWdlIHRoZW9yZXRpY2FsIHRpbWluZyB0byA4IGN5Y2xlcy4uLgorCisjICgqKQlTUEFSQzY0LVZbSUldIHdhcyBvcmlnaW5hbGx5IGJlbGlldmVkIHRvIGhhdmUgMiBjeWNsZXMgVklTCisjCWxhdGVuY3kuIFdlbGwsIGl0IG1pZ2h0IGhhdmUsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgZGVkaWNhdGVkCisjCVZJUy11bml0LiBJbnN0ZWFkLCBWSVMgaW5zdHJ1Y3Rpb25zIGFyZSBleGVjdXRlZCBieSBvdGhlcgorIwlmdW5jdGlvbmFsIHVuaXRzLCBvbmVzIHVzZWQgaGVyZSAtIGJ5IElBTFUuIFRoaXMgZG9lc24ndAorIwlpbXByb3ZlIGVmZmVjdGl2ZSBJTFAuLi4KK30KKworIyBUaGUgcmVmZXJlbmNlIFh1cGRhdGUgcHJvY2VkdXJlIGlzIHRoZW4gInN0cmFpbmVkIiBvdmVyICpwYWlycyogb2YKKyMgQk9EWV9OTl9NTSBhbmQga2luZCBvZiBtb2R1bG8tc2NoZWR1bGVkIGluIHJlc3BlY3QgdG8gWFtuXV49WFtuKzEzXQorIyBhbmQgS19OTl9NTSBhZGRpdGlvbi4gSXQncyAicnVubmluZyIgMTUgcm91bmRzIGFoZWFkLCB3aGljaCBsZWF2ZXMKKyMgcGxlbnR5IG9mIHJvb20gdG8gYW1vcnRpemUgZm9yIHJlYWQtYWZ0ZXItd3JpdGUgaGF6YXJkLCBhcyB3ZWxsIGFzCisjIHRvIGZldGNoIGFuZCBhbGlnbiBpbnB1dCBmb3IgdGhlIG5leHQgc3Bpbi4gVGhlIFZJUyBpbnN0cnVjdGlvbnMgYXJlCisjIHNjaGVkdWxlZCBmb3IgbGF0ZW5jeSBvZiAyIGN5Y2xlcywgYmVjYXVzZSB0aGVyZSBhcmUgbm90IGVub3VnaCBJQUxVCisjIGluc3RydWN0aW9ucyB0byBzY2hlZHVsZSBmb3IgbGF0ZW5jeSBvZiAzLCB3aGlsZSBzY2hlZHVsaW5nIGZvciAxCisjIHdvdWxkIGdpdmUgbm8gZ2FpbiBvbiBVU0kmSUkgYW55d2F5LgorCitzdWIgQk9EWV8wMF8xOSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUpPUBfOworbXkgJGo9JGkmfjE7CitteSAkaz0oJGorMTYrMiklMTY7CSMgYWhlYWQgcmVmZXJlbmNlCitteSAkbD0oJGorMTYtMiklMTY7CSMgYmVoaW5kIHJlZmVyZW5jZQorbXkgJEs9QFZLWygkaisxNi0yKS8yMF07CisKKyRqPSgkaisxNiklMTY7CisKKyRjb2RlLj08PF9fXyBpZiAoISgkaSYxKSk7CisJc2xsCQkkYSw1LCR0bXAwCQkJISEgJGkKKwlhbmQJCSRjLCRiLCR0bXAzCisJbGQJCVskWGZlcitgNCooJGklMTYpYF0sJFhpCisJIGZ4b3JzCQlAWFsoJGorMTQpJTE2XSxAWFskaisxXSxAWFskaisxXSEgMC8gMC8gMDpYWzFdXj1YWzE0XQorCXNybAkJJGEsMjcsJHRtcDEKKwlhZGQJCSR0bXAwLCRlLCRlCisJIGZ4b3IJCUBYWygkaisyKSUxNl0sQFhbKCRqKzgpJTE2XSwlZjE4ISAxLyAxLyAxOlRtcD1YWzIsM11eWFs4LDldCisJc2xsCQkkYiwzMCwkdG1wMgorCWFkZAkJJHRtcDEsJGUsJGUKKwlhbmRuCQkkZCwkYiwkdG1wMQorCWFkZAkJJFhpLCRlLCRlCisJIGZ4b3IJCSVmMTgsQFhbJGpdLEBYWyRqXQkJISAyLyA0LyAzOlhbMCwxXV49WFsyLDNdXlhbOCw5XQorCXNybAkJJGIsMiwkYgorCW9yCQkkdG1wMSwkdG1wMywkdG1wMQorCW9yCQkkdG1wMiwkYiwkYgorCWFkZAkJJHRtcDEsJGUsJGUKKwkgZmFsaWduZGF0YQlAWFskal0sQFhbJGpdLCVmMTgJCSEgMy8gNy8gNTpUbXA9WFswLDFdPj4+MjQKK19fXworJGNvZGUuPTw8X19fIGlmICgkaSYxKTsKKwlzbGwJCSRhLDUsJHRtcDAJCQkhISAkaQorCWFuZAkJJGMsJGIsJHRtcDMKKwlsZAkJWyRYZmVyK2A0KigkaSUxNilgXSwkWGkKKwkgZnBhZGQzMglAWFskal0sQFhbJGpdLEBYWyRqXQkJISA0LyA4LyA2OlhbMCwxXTw8PTEKKwlzcmwJCSRhLDI3LCR0bXAxCisJYWRkCQkkdG1wMCwkZSwkZQorCSBmbXVsOHVseDE2CSVmMTgsJGZtdWwsJWYxOAkJCSEgNS8xMC8gNzpUbXA+Pj03LCBUbXAmPTEKKwlzbGwJCSRiLDMwLCR0bXAyCisJYWRkCQkkdG1wMSwkZSwkZQorCSBmcGFkZDMyCSRLLEBYWyRsXSwlZjIwCQkJIQorCWFuZG4JCSRkLCRiLCR0bXAxCisJYWRkCQkkWGksJGUsJGUKKwkgZnhvcnMJCUBYWygkaysxMyklMTZdLEBYWyRrXSxAWFska10JIS0xLy0xLy0xOlhbMF1ePVhbMTNdCisJc3JsCQkkYiwyLCRiCisJb3IJCSR0bXAxLCR0bXAzLCR0bXAxCisJIGZ4b3IJCSVmMTgsQFhbJGpdLEBYWyRqXQkJISA4LzE0LzEwOlhbMCwxXXw9VG1wCisJb3IJCSR0bXAyLCRiLCRiCisJYWRkCQkkdG1wMSwkZSwkZQorX19fCiskY29kZS49PDxfX18gaWYgKCRpJjEgJiYgJGk+PTIpOworCSBzdGQJCSVmMjAsWyRYZmVyK2A0KiRsYF0JCSEKK19fXworfQorCitzdWIgQk9EWV8yMF8zOSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUpPUBfOworbXkgJGo9JGkmfjE7CitteSAkaz0oJGorMTYrMiklMTY7CSMgYWhlYWQgcmVmZXJlbmNlCitteSAkbD0oJGorMTYtMiklMTY7CSMgYmVoaW5kIHJlZmVyZW5jZQorbXkgJEs9QFZLWygkaisxNi0yKS8yMF07CisKKyRqPSgkaisxNiklMTY7CisKKyRjb2RlLj08PF9fXyBpZiAoISgkaSYxKSAmJiAkaTw2NCk7CisJc2xsCQkkYSw1LCR0bXAwCQkJISEgJGkKKwlsZAkJWyRYZmVyK2A0KigkaSUxNilgXSwkWGkKKwkgZnhvcnMJCUBYWygkaisxNCklMTZdLEBYWyRqKzFdLEBYWyRqKzFdISAwLyAwLyAwOlhbMV1ePVhbMTRdCisJc3JsCQkkYSwyNywkdG1wMQorCWFkZAkJJHRtcDAsJGUsJGUKKwkgZnhvcgkJQFhbKCRqKzIpJTE2XSxAWFsoJGorOCklMTZdLCVmMTghIDEvIDEvIDE6VG1wPVhbMiwzXV5YWzgsOV0KKwl4b3IJCSRjLCRiLCR0bXAwCisJYWRkCQkkdG1wMSwkZSwkZQorCXNsbAkJJGIsMzAsJHRtcDIKKwl4b3IJCSRkLCR0bXAwLCR0bXAxCisJIGZ4b3IJCSVmMTgsQFhbJGpdLEBYWyRqXQkJISAyLyA0LyAzOlhbMCwxXV49WFsyLDNdXlhbOCw5XQorCXNybAkJJGIsMiwkYgorCWFkZAkJJHRtcDEsJGUsJGUKKwlvcgkJJHRtcDIsJGIsJGIKKwlhZGQJCSRYaSwkZSwkZQorCSBmYWxpZ25kYXRhCUBYWyRqXSxAWFskal0sJWYxOAkJISAzLyA3LyA1OlRtcD1YWzAsMV0+Pj4yNAorX19fCiskY29kZS49PDxfX18gaWYgKCRpJjEgJiYgJGk8NjQpOworCXNsbAkJJGEsNSwkdG1wMAkJCSEhICRpCisJbGQJCVskWGZlcitgNCooJGklMTYpYF0sJFhpCisJIGZwYWRkMzIJQFhbJGpdLEBYWyRqXSxAWFskal0JCSEgNC8gOC8gNjpYWzAsMV08PD0xCisJc3JsCQkkYSwyNywkdG1wMQorCWFkZAkJJHRtcDAsJGUsJGUKKwkgZm11bDh1bHgxNgklZjE4LCRmbXVsLCVmMTgJCQkhIDUvMTAvIDc6VG1wPj49NywgVG1wJj0xCisJeG9yCQkkYywkYiwkdG1wMAorCWFkZAkJJHRtcDEsJGUsJGUKKwkgZnBhZGQzMgkkSyxAWFskbF0sJWYyMAkJCSEKKwlzbGwJCSRiLDMwLCR0bXAyCisJeG9yCQkkZCwkdG1wMCwkdG1wMQorCSBmeG9ycwkJQFhbKCRrKzEzKSUxNl0sQFhbJGtdLEBYWyRrXQkhLTEvLTEvLTE6WFswXV49WFsxM10KKwlzcmwJCSRiLDIsJGIKKwlhZGQJCSR0bXAxLCRlLCRlCisJIGZ4b3IJCSVmMTgsQFhbJGpdLEBYWyRqXQkJISA4LzE0LzEwOlhbMCwxXXw9VG1wCisJb3IJCSR0bXAyLCRiLCRiCisJYWRkCQkkWGksJGUsJGUKKwkgc3RkCQklZjIwLFskWGZlcitgNCokbGBdCQkhCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGk9PTY0KTsKKwlzbGwJCSRhLDUsJHRtcDAJCQkhISAkaQorCWxkCQlbJFhmZXIrYDQqKCRpJTE2KWBdLCRYaQorCSBmcGFkZDMyCSRLLEBYWyRsXSwlZjIwCisJc3JsCQkkYSwyNywkdG1wMQorCWFkZAkJJHRtcDAsJGUsJGUKKwl4b3IJCSRjLCRiLCR0bXAwCisJYWRkCQkkdG1wMSwkZSwkZQorCXNsbAkJJGIsMzAsJHRtcDIKKwl4b3IJCSRkLCR0bXAwLCR0bXAxCisJIHN0ZAkJJWYyMCxbJFhmZXIrYDQqJGxgXQorCXNybAkJJGIsMiwkYgorCWFkZAkJJHRtcDEsJGUsJGUKKwlvcgkJJHRtcDIsJGIsJGIKKwlhZGQJCSRYaSwkZSwkZQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPjY0KTsKKwlzbGwJCSRhLDUsJHRtcDAJCQkhISAkaQorCWxkCQlbJFhmZXIrYDQqKCRpJTE2KWBdLCRYaQorCXNybAkJJGEsMjcsJHRtcDEKKwlhZGQJCSR0bXAwLCRlLCRlCisJeG9yCQkkYywkYiwkdG1wMAorCWFkZAkJJHRtcDEsJGUsJGUKKwlzbGwJCSRiLDMwLCR0bXAyCisJeG9yCQkkZCwkdG1wMCwkdG1wMQorCXNybAkJJGIsMiwkYgorCWFkZAkJJHRtcDEsJGUsJGUKKwlvcgkJJHRtcDIsJGIsJGIKKwlhZGQJCSRYaSwkZSwkZQorX19fCit9CisKK3N1YiBCT0RZXzQwXzU5IHsKK215ICgkaSwkYSwkYiwkYywkZCwkZSk9QF87CitteSAkaj0kaSZ+MTsKK215ICRrPSgkaisxNisyKSUxNjsJIyBhaGVhZCByZWZlcmVuY2UKK215ICRsPSgkaisxNi0yKSUxNjsJIyBiZWhpbmQgcmVmZXJlbmNlCitteSAkSz1AVktbKCRqKzE2LTIpLzIwXTsKKworJGo9KCRqKzE2KSUxNjsKKworJGNvZGUuPTw8X19fIGlmICghKCRpJjEpKTsKKwlzbGwJCSRhLDUsJHRtcDAJCQkhISAkaQorCWxkCQlbJFhmZXIrYDQqKCRpJTE2KWBdLCRYaQorCSBmeG9ycwkJQFhbKCRqKzE0KSUxNl0sQFhbJGorMV0sQFhbJGorMV0hIDAvIDAvIDA6WFsxXV49WFsxNF0KKwlzcmwJCSRhLDI3LCR0bXAxCisJYWRkCQkkdG1wMCwkZSwkZQorCSBmeG9yCQlAWFsoJGorMiklMTZdLEBYWygkais4KSUxNl0sJWYxOCEgMS8gMS8gMTpUbXA9WFsyLDNdXlhbOCw5XQorCWFuZAkJJGMsJGIsJHRtcDAKKwlhZGQJCSR0bXAxLCRlLCRlCisJc2xsCQkkYiwzMCwkdG1wMgorCW9yCQkkYywkYiwkdG1wMQorCSBmeG9yCQklZjE4LEBYWyRqXSxAWFskal0JCSEgMi8gNC8gMzpYWzAsMV1ePVhbMiwzXV5YWzgsOV0KKwlzcmwJCSRiLDIsJGIKKwlhbmQJCSRkLCR0bXAxLCR0bXAxCisJYWRkCQkkWGksJGUsJGUKKwlvcgkJJHRtcDEsJHRtcDAsJHRtcDEKKwkgZmFsaWduZGF0YQlAWFskal0sQFhbJGpdLCVmMTgJCSEgMy8gNy8gNTpUbXA9WFswLDFdPj4+MjQKKwlvcgkJJHRtcDIsJGIsJGIKKwlhZGQJCSR0bXAxLCRlLCRlCisJIGZwYWRkMzIJQFhbJGpdLEBYWyRqXSxAWFskal0JCSEgNC8gOC8gNjpYWzAsMV08PD0xCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGkmMSk7CisJc2xsCQkkYSw1LCR0bXAwCQkJISEgJGkKKwlsZAkJWyRYZmVyK2A0KigkaSUxNilgXSwkWGkKKwlzcmwJCSRhLDI3LCR0bXAxCisJYWRkCQkkdG1wMCwkZSwkZQorCSBmbXVsOHVseDE2CSVmMTgsJGZtdWwsJWYxOAkJCSEgNS8xMC8gNzpUbXA+Pj03LCBUbXAmPTEKKwlhbmQJCSRjLCRiLCR0bXAwCisJYWRkCQkkdG1wMSwkZSwkZQorCSBmcGFkZDMyCSRLLEBYWyRsXSwlZjIwCQkJIQorCXNsbAkJJGIsMzAsJHRtcDIKKwlvcgkJJGMsJGIsJHRtcDEKKwkgZnhvcnMJCUBYWygkaysxMyklMTZdLEBYWyRrXSxAWFska10JIS0xLy0xLy0xOlhbMF1ePVhbMTNdCisJc3JsCQkkYiwyLCRiCisJYW5kCQkkZCwkdG1wMSwkdG1wMQorCSBmeG9yCQklZjE4LEBYWyRqXSxAWFskal0JCSEgOC8xNC8xMDpYWzAsMV18PVRtcAorCWFkZAkJJFhpLCRlLCRlCisJb3IJCSR0bXAxLCR0bXAwLCR0bXAxCisJb3IJCSR0bXAyLCRiLCRiCisJYWRkCQkkdG1wMSwkZSwkZQorCSBzdGQJCSVmMjAsWyRYZmVyK2A0KiRsYF0JCSEKK19fXworfQorCisjIElmIHRoZXJlIGlzIG1vcmUgZGF0YSB0byBwcm9jZXNzLCB0aGVuIHdlIHByZS1mZXRjaCB0aGUgZGF0YSBmb3IKKyMgbmV4dCBpdGVyYXRpb24gaW4gbGFzdCB0ZW4gcm91bmRzLi4uCitzdWIgQk9EWV83MF83OSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUpPUBfOworbXkgJGo9JGkmfjE7CitteSAkbT0oJGklOCkqMjsKKworJGo9KCRqKzE2KSUxNjsKKworJGNvZGUuPTw8X19fIGlmICgkaT09NzApOworCXNsbAkJJGEsNSwkdG1wMAkJCSEhICRpCisJbGQJCVskWGZlcitgNCooJGklMTYpYF0sJFhpCisJc3JsCQkkYSwyNywkdG1wMQorCWFkZAkJJHRtcDAsJGUsJGUKKwkgbGRkCQlbJGlucCs2NF0sQFhbMF0KKwl4b3IJCSRjLCRiLCR0bXAwCisJYWRkCQkkdG1wMSwkZSwkZQorCXNsbAkJJGIsMzAsJHRtcDIKKwl4b3IJCSRkLCR0bXAwLCR0bXAxCisJc3JsCQkkYiwyLCRiCisJYWRkCQkkdG1wMSwkZSwkZQorCW9yCQkkdG1wMiwkYiwkYgorCWFkZAkJJFhpLCRlLCRlCisKKwlhbmQJCSRpbnAsLTY0LCRuWGZlcgorCWluYwkJNjQsJGlucAorCWFuZAkJJG5YZmVyLDI1NSwkblhmZXIKKwlhbGlnbmFkZHIJJWcwLCRhbGlnbiwlZzAKKwlhZGQJCSRiYXNlLCRuWGZlciwkblhmZXIKK19fXworJGNvZGUuPTw8X19fIGlmICgkaT09NzEpOworCXNsbAkJJGEsNSwkdG1wMAkJCSEhICRpCisJbGQJCVskWGZlcitgNCooJGklMTYpYF0sJFhpCisJc3JsCQkkYSwyNywkdG1wMQorCWFkZAkJJHRtcDAsJGUsJGUKKwl4b3IJCSRjLCRiLCR0bXAwCisJYWRkCQkkdG1wMSwkZSwkZQorCXNsbAkJJGIsMzAsJHRtcDIKKwl4b3IJCSRkLCR0bXAwLCR0bXAxCisJc3JsCQkkYiwyLCRiCisJYWRkCQkkdG1wMSwkZSwkZQorCW9yCQkkdG1wMiwkYiwkYgorCWFkZAkJJFhpLCRlLCRlCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGk+PTcyKTsKKwkgZmFsaWduZGF0YQlAWFskbV0sQFhbJG0rMl0sQFhbJG1dCisJc2xsCQkkYSw1LCR0bXAwCQkJISEgJGkKKwlsZAkJWyRYZmVyK2A0KigkaSUxNilgXSwkWGkKKwlzcmwJCSRhLDI3LCR0bXAxCisJYWRkCQkkdG1wMCwkZSwkZQorCXhvcgkJJGMsJGIsJHRtcDAKKwlhZGQJCSR0bXAxLCRlLCRlCisJIGZwYWRkMzIJJFZLXzAwXzE5LEBYWyRtXSwlZjIwCisJc2xsCQkkYiwzMCwkdG1wMgorCXhvcgkJJGQsJHRtcDAsJHRtcDEKKwlzcmwJCSRiLDIsJGIKKwlhZGQJCSR0bXAxLCRlLCRlCisJb3IJCSR0bXAyLCRiLCRiCisJYWRkCQkkWGksJGUsJGUKK19fXworJGNvZGUuPTw8X19fIGlmICgkaTw3Nyk7CisJIGxkZAkJWyRpbnArYDgqKCRpKzEtNzApYF0sQFhbMiooJGkrMS03MCldCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGk9PTc3KTsJIyByZWR1bmRhbnQgaWYgJGlucCB3YXMgYWxpZ25lZAorCSBhZGQJCSRhbGlnbiw2MywkdG1wMAorCSBhbmQJCSR0bXAwLC04LCR0bXAwCisJIGxkZAkJWyRpbnArJHRtcDBdLEBYWzE2XQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPj03Mik7CisJIHN0ZAkJJWYyMCxbJG5YZmVyK2A0KiRtYF0KK19fXworfQorCiskY29kZS49PDxfX187Cisuc2VjdGlvbgkiLnRleHQiLCNhbGxvYywjZXhlY2luc3RyCisKKy5hbGlnbgk2NAordmlzX2NvbnN0OgorLmxvbmcJMHg1YTgyNzk5OSwweDVhODI3OTk5CSEgS18wMF8xOQorLmxvbmcJMHg2ZWQ5ZWJhMSwweDZlZDllYmExCSEgS18yMF8zOQorLmxvbmcJMHg4ZjFiYmNkYywweDhmMWJiY2RjCSEgS180MF81OQorLmxvbmcJMHhjYTYyYzFkNiwweGNhNjJjMWQ2CSEgS182MF83OQorLmxvbmcJMHgwMDAwMDEwMCwweDAwMDAwMTAwCisuYWxpZ24JNjQKKy50eXBlCXZpc19jb25zdCwjb2JqZWN0Cisuc2l6ZQl2aXNfY29uc3QsKC4tdmlzX2NvbnN0KQorCisuZ2xvYmwJc2hhMV9ibG9ja19kYXRhX29yZGVyCitzaGExX2Jsb2NrX2RhdGFfb3JkZXI6CisJc2F2ZQklc3AsLSRmcmFtZSwlc3AKKwlhZGQJJWZwLCRiaWFzLTI1NiwkYmFzZQorCisxOgljYWxsCS4rOAorCWFkZAklbzcsdmlzX2NvbnN0LTFiLCR0bXAwCisKKwlsZGQJWyR0bXAwKzBdLCRWS18wMF8xOQorCWxkZAlbJHRtcDArOF0sJFZLXzIwXzM5CisJbGRkCVskdG1wMCsxNl0sJFZLXzQwXzU5CisJbGRkCVskdG1wMCsyNF0sJFZLXzYwXzc5CisJbGRkCVskdG1wMCszMl0sJGZtdWwKKworCWxkCVskY3R4KzBdLCRBY3R4CisJYW5kCSRiYXNlLC0yNTYsJGJhc2UKKwlsZAlbJGN0eCs0XSwkQmN0eAorCXN1YgkkYmFzZSwkYmlhcyskZnJhbWUsJXNwCisJbGQJWyRjdHgrOF0sJENjdHgKKwlhbmQJJGlucCw3LCRhbGlnbgorCWxkCVskY3R4KzEyXSwkRGN0eAorCWFuZAkkaW5wLC04LCRpbnAKKwlsZAlbJGN0eCsxNl0sJEVjdHgKKworCSEgWFsxNl0gaXMgbWFpbnRhaW5lZCBpbiBGUCByZWdpc3RlciBiYW5rCisJYWxpZ25hZGRyCSVnMCwkYWxpZ24sJWcwCisJbGRkCQlbJGlucCswXSxAWFswXQorCXN1YgkJJGlucCwtNjQsJFhmZXIKKwlsZGQJCVskaW5wKzhdLEBYWzJdCisJYW5kCQkkWGZlciwtNjQsJFhmZXIKKwlsZGQJCVskaW5wKzE2XSxAWFs0XQorCWFuZAkJJFhmZXIsMjU1LCRYZmVyCisJbGRkCQlbJGlucCsyNF0sQFhbNl0KKwlhZGQJCSRiYXNlLCRYZmVyLCRYZmVyCisJbGRkCQlbJGlucCszMl0sQFhbOF0KKwlsZGQJCVskaW5wKzQwXSxAWFsxMF0KKwlsZGQJCVskaW5wKzQ4XSxAWFsxMl0KKwlicnoscHQJCSRhbGlnbiwuTGFsaWduZWQKKwlsZGQJCVskaW5wKzU2XSxAWFsxNF0KKworCWxkZAkJWyRpbnArNjRdLEBYWzE2XQorCWZhbGlnbmRhdGEJQFhbMF0sQFhbMl0sQFhbMF0KKwlmYWxpZ25kYXRhCUBYWzJdLEBYWzRdLEBYWzJdCisJZmFsaWduZGF0YQlAWFs0XSxAWFs2XSxAWFs0XQorCWZhbGlnbmRhdGEJQFhbNl0sQFhbOF0sQFhbNl0KKwlmYWxpZ25kYXRhCUBYWzhdLEBYWzEwXSxAWFs4XQorCWZhbGlnbmRhdGEJQFhbMTBdLEBYWzEyXSxAWFsxMF0KKwlmYWxpZ25kYXRhCUBYWzEyXSxAWFsxNF0sQFhbMTJdCisJZmFsaWduZGF0YQlAWFsxNF0sQFhbMTZdLEBYWzE0XQorCisuTGFsaWduZWQ6CisJbW92CQk1LCR0bXAwCisJZGVjCQkxLCRsZW4KKwlhbGlnbmFkZHIJJWcwLCR0bXAwLCVnMAorCWZwYWRkMzIJCSRWS18wMF8xOSxAWFswXSwlZjE2CisJZnBhZGQzMgkJJFZLXzAwXzE5LEBYWzJdLCVmMTgKKwlmcGFkZDMyCQkkVktfMDBfMTksQFhbNF0sJWYyMAorCWZwYWRkMzIJCSRWS18wMF8xOSxAWFs2XSwlZjIyCisJZnBhZGQzMgkJJFZLXzAwXzE5LEBYWzhdLCVmMjQKKwlmcGFkZDMyCQkkVktfMDBfMTksQFhbMTBdLCVmMjYKKwlmcGFkZDMyCQkkVktfMDBfMTksQFhbMTJdLCVmMjgKKwlmcGFkZDMyCQkkVktfMDBfMTksQFhbMTRdLCVmMzAKKwlzdGQJCSVmMTYsWyRYZmVyKzBdCisJbW92CQkkQWN0eCwkQQorCXN0ZAkJJWYxOCxbJFhmZXIrOF0KKwltb3YJCSRCY3R4LCRCCisJc3RkCQklZjIwLFskWGZlcisxNl0KKwltb3YJCSRDY3R4LCRDCisJc3RkCQklZjIyLFskWGZlcisyNF0KKwltb3YJCSREY3R4LCRECisJc3RkCQklZjI0LFskWGZlciszMl0KKwltb3YJCSRFY3R4LCRFCisJc3RkCQklZjI2LFskWGZlcis0MF0KKwlmeG9ycwkJQFhbMTNdLEBYWzBdLEBYWzBdCisJc3RkCQklZjI4LFskWGZlcis0OF0KKwliYQkJLkxvb3AKKwlzdGQJCSVmMzAsWyRYZmVyKzU2XQorLmFsaWduCTMyCisuTG9vcDoKK19fXworZm9yICgkaT0wOyRpPDIwOyRpKyspCXsgJkJPRFlfMDBfMTkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9Citmb3IgKDskaTw0MDskaSsrKQl7ICZCT0RZXzIwXzM5KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorZm9yICg7JGk8NjA7JGkrKykJeyAmQk9EWV80MF81OSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KK2ZvciAoOyRpPDcwOyRpKyspCXsgJkJPRFlfMjBfMzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49PDxfX187CisJdHN0CQkkbGVuCisJYnoscG4JCWAkYml0cz09MzI/IiVpY2MiOiIleGNjImAsLkx0YWlsCisJbm9wCitfX18KK2ZvciAoOyRpPDgwOyRpKyspCXsgJkJPRFlfNzBfNzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49PDxfX187CisJYWRkCQkkQSwkQWN0eCwkQWN0eAorCWFkZAkJJEIsJEJjdHgsJEJjdHgKKwlhZGQJCSRDLCRDY3R4LCRDY3R4CisJYWRkCQkkRCwkRGN0eCwkRGN0eAorCWFkZAkJJEUsJEVjdHgsJEVjdHgKKwltb3YJCTUsJHRtcDAKKwlmeG9ycwkJQFhbMTNdLEBYWzBdLEBYWzBdCisJbW92CQkkQWN0eCwkQQorCW1vdgkJJEJjdHgsJEIKKwltb3YJCSRDY3R4LCRDCisJbW92CQkkRGN0eCwkRAorCW1vdgkJJEVjdHgsJEUKKwlhbGlnbmFkZHIJJWcwLCR0bXAwLCVnMAkKKwlkZWMJCTEsJGxlbgorCWJhCQkuTG9vcAorCW1vdgkJJG5YZmVyLCRYZmVyCisKKy5hbGlnbgkzMgorLkx0YWlsOgorX19fCitmb3IoJGk9NzA7JGk8ODA7JGkrKykJeyAmQk9EWV8yMF8zOSgkaSxAVik7IHVuc2hpZnQoQFYscG9wKEBWKSk7IH0KKyRjb2RlLj08PF9fXzsKKwlhZGQJJEEsJEFjdHgsJEFjdHgKKwlhZGQJJEIsJEJjdHgsJEJjdHgKKwlhZGQJJEMsJENjdHgsJENjdHgKKwlhZGQJJEQsJERjdHgsJERjdHgKKwlhZGQJJEUsJEVjdHgsJEVjdHgKKworCXN0CSRBY3R4LFskY3R4KzBdCisJc3QJJEJjdHgsWyRjdHgrNF0KKwlzdAkkQ2N0eCxbJGN0eCs4XQorCXN0CSREY3R4LFskY3R4KzEyXQorCXN0CSRFY3R4LFskY3R4KzE2XQorCisJcmV0CisJcmVzdG9yZQorLnR5cGUJc2hhMV9ibG9ja19kYXRhX29yZGVyLCNmdW5jdGlvbgorLnNpemUJc2hhMV9ibG9ja19kYXRhX29yZGVyLCguLXNoYTFfYmxvY2tfZGF0YV9vcmRlcikKKy5hc2NpegkiU0hBMSBibG9jayB0cmFuc2Zvcm0gZm9yIFNQQVJDdjlhLCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorX19fCisKKyMgUHVycG9zZSBvZiB0aGVzZSBzdWJyb3V0aW5lcyBpcyB0byBleHBsaWNpdGx5IGVuY29kZSBWSVMgaW5zdHJ1Y3Rpb25zLAorIyBzbyB0aGF0IG9uZSBjYW4gY29tcGlsZSB0aGUgbW9kdWxlIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWNpZnkgVklTCisjIGV4dGVudGlvbnMgb24gY29tcGlsZXIgY29tbWFuZCBsaW5lLCBlLmcuIC14YXJjaD12OSB2cy4gLXhhcmNoPXY5YS4KKyMgSWRlYSBpcyB0byByZXNlcnZlIGZvciBvcHRpb24gdG8gcHJvZHVjZSAidW5pdmVyc2FsIiBiaW5hcnkgYW5kIGxldAorIyBwcm9ncmFtbWVyIGRldGVjdCBpZiBjdXJyZW50IENQVSBpcyBWSVMgY2FwYWJsZSBhdCBydW4tdGltZS4KK3N1YiB1bnZpcyB7CitteSAoJG1uZW1vbmljLCRyczEsJHJzMiwkcmQpPUBfOworbXkgJHJlZiwkb3BmOworbXkgJXZpc29wZiA9ICgJImZtdWw4dWx4MTYiCT0+IDB4MDM3LAorCQkiZmFsaWduZGF0YSIJPT4gMHgwNDgsCisJCSJmcGFkZDMyIgk9PiAweDA1MiwKKwkJImZ4b3IiCQk9PiAweDA2YywKKwkJImZ4b3JzIgkJPT4gMHgwNmQJKTsKKworICAgICRyZWYgPSAiJG1uZW1vbmljXHQkcnMxLCRyczIsJHJkIjsKKworICAgIGlmICgkb3BmPSR2aXNvcGZ7JG1uZW1vbmljfSkgeworCWZvcmVhY2ggKCRyczEsJHJzMiwkcmQpIHsKKwkgICAgcmV0dXJuICRyZWYgaWYgKCEvJWYoWzAtOV17MSwyfSkvKTsKKwkgICAgJF89JDE7CisJICAgIGlmICgkMT49MzIpIHsKKwkJcmV0dXJuICRyZWYgaWYgKCQxJjEpOworCQkjIHJlLWVuY29kZSBmb3IgdXBwZXIgZG91YmxlIHJlZ2lzdGVyIGFkZHJlc3NpbmcKKwkJJF89KCQxfCQxPj41KSYzMTsKKwkgICAgfQorCX0KKworCXJldHVybglzcHJpbnRmICIud29yZFx0MHglMDh4ICElcyIsCisJCQkweDgxYjAwMDAwfCRyZDw8MjV8JHJzMTw8MTR8JG9wZjw8NXwkcnMyLAorCQkJJHJlZjsKKyAgICB9IGVsc2UgeworCXJldHVybiAkcmVmOworICAgIH0KK30KK3N1YiB1bmFsaWduYWRkciB7CitteSAoJG1uZW1vbmljLCRyczEsJHJzMiwkcmQpPUBfOworbXkgJWJpYXMgPSAoICJnIiA9PiAwLCAibyIgPT4gOCwgImwiID0+IDE2LCAiaSIgPT4gMjQgKTsKK215ICRyZWY9IiRtbmVtb25pY1x0JHJzMSwkcnMyLCRyZCI7CisKKyAgICBmb3JlYWNoICgkcnMxLCRyczIsJHJkKSB7CisJaWYgKC8lKFtnb2xpXSkoWzAtN10pLykJeyAkXz0kYmlhc3skMX0rJDI7IH0KKwllbHNlCQkJeyByZXR1cm4gJHJlZjsgfQorICAgIH0KKyAgICByZXR1cm4gIHNwcmludGYgIi53b3JkXHQweCUwOHggISVzIiwKKwkJICAgIDB4ODFiMDAzMDB8JHJkPDwyNXwkcnMxPDwxNHwkcnMyLAorCQkgICAgJHJlZjsKK30KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CiskY29kZSA9fiBzL1xiKGZbXlxzXSopXHMrKCVmWzAtOV17MSwyfSksKCVmWzAtOV17MSwyfSksKCVmWzAtOV17MSwyfSkvCisJCSZ1bnZpcygkMSwkMiwkMywkNCkKKwkgIC9nZW07CiskY29kZSA9fiBzL1xiKGFsaWduYWRkcilccysoJVtnb2xpXVswLTddKSwoJVtnb2xpXVswLTddKSwoJVtnb2xpXVswLTddKS8KKwkJJnVuYWxpZ25hZGRyKCQxLCQyLCQzLCQ0KQorCSAgL2dlbTsKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS10aHVtYi5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtdGh1bWIucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5ZWE5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEtdGh1bWIucGwKQEAgLTAsMCArMSwyNTkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBzaGExX2Jsb2NrIGZvciBUaHVtYi4KKyMKKyMgSmFudWFyeSAyMDA3LgorIworIyBUaGUgY29kZSBkb2VzIG5vdCBwcmVzZW50IGRpcmVjdCBpbnRlcmVzdCB0byBPcGVuU1NMLCBiZWNhdXNlIG9mIGxvdworIyBwZXJmb3JtYW5jZS4gSXRzIHB1cnBvc2UgaXMgdG8gZXN0YWJsaXNoIF9zaXplXyBiZW5jaG1hcmsuIFByZXR0eQorIyB1c2VsZXNzIG9uZSBJIG11c3Qgc2F5LCBiZWNhdXNlIDMwJSBvciA4OCBieXRlcyBsYXJnZXIgQVJNdjQgY29kZQorIyBbYXZpYWxhYmxlIG9uIGRlbWFuZF0gaXMgYWxtb3N0IF90d2ljZV8gYXMgZmFzdC4gSXQgc2hvdWxkIGFsc28gYmUKKyMgbm90ZWQgdGhhdCBpbi1saW5pbmcgb2YgLkxjb21tb24gYW5kIC5Mcm90YXRlIGltcHJvdmVzIHBlcmZvcm1hbmNlCisjIGJ5IG92ZXIgNDAlLCB3aGlsZSBjb2RlIGluY3JlYXNlcyBieSBvbmx5IDEwJSBvciAzMiBieXRlcy4gQnV0IG9uY2UKKyMgYWdhaW4sIHRoZSBnb2FsIHdhcyB0byBlc3RhYmxpc2ggX3NpemVfIGJlbmNobWFyaywgbm90IHBlcmZvcm1hbmNlLgorCiskb3V0cHV0PXNoaWZ0Oworb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworJGlubGluZT0wOworIyRjaGVhdF9vbl9iaW51dGlscz0xOworCiskdDA9InIwIjsKKyR0MT0icjEiOworJHQyPSJyMiI7CiskYT0icjMiOworJGI9InI0IjsKKyRjPSJyNSI7CiskZD0icjYiOworJGU9InI3IjsKKyRLPSJyOCI7CSMgInVwcGVyIiByZWdpc3RlcnMgY2FuIGJlIHVzZWQgaW4gYWRkL3N1YiBhbmQgbW92IGluc25zCiskY3R4PSJyOSI7CiskaW5wPSJyMTAiOworJGxlbj0icjExIjsKKyRYaT0icjEyIjsKKworc3ViIGNvbW1vbiB7Cis8PF9fXzsKKwlzdWIJJHQwLCM0CisJbGRyCSR0MSxbJHQwXQorCWFkZAkkZSwkSwkJCUAgRSs9S194eF94eAorCWxzbAkkdDIsJGEsIzUKKwlhZGQJJHQyLCRlCisJbHNyCSRlLCRhLCMyNworCWFkZAkkdDIsJGUJCQlAIEUrPVJPUihBLDI3KQorCWFkZAkkdDIsJHQxCQkJQCBFKz1YW2ldCitfX18KK30KK3N1YiByb3RhdGUgeworPDxfX187CisJbW92CSRlLCRkCQkJQCBFPUQKKwltb3YJJGQsJGMJCQlAIEQ9QworCWxzbAkkYywkYiwjMzAKKwlsc3IJJGIsJGIsIzIKKwlvcnIJJGMsJGIJCQlAIEM9Uk9SKEIsMikKKwltb3YJJGIsJGEJCQlAIEI9QQorCWFkZAkkYSwkdDIsJHQxCQlAIEE9RStGX3h4X3h4KEIsQyxEKQorX19fCit9CisKK3N1YiBCT0RZXzAwXzE5IHsKKyRjb2RlLj0kaW5saW5lPyZjb21tb24oKToiXHRibAkuTGNvbW1vblxuIjsKKyRjb2RlLj08PF9fXzsKKwltb3YJJHQxLCRjCisJZW9yCSR0MSwkZAorCWFuZAkkdDEsJGIKKwllb3IJJHQxLCRkCQkJQCBGXzAwXzE5KEIsQyxEKQorX19fCiskY29kZS49JGlubGluZT8mcm90YXRlKCk6Ilx0YmwJLkxyb3RhdGVcbiI7Cit9CisKK3N1YiBCT0RZXzIwXzM5IHsKKyRjb2RlLj0kaW5saW5lPyZjb21tb24oKToiXHRibAkuTGNvbW1vblxuIjsKKyRjb2RlLj08PF9fXzsKKwltb3YJJHQxLCRiCisJZW9yCSR0MSwkYworCWVvcgkkdDEsJGQJCQlAIEZfMjBfMzkoQixDLEQpCitfX18KKyRjb2RlLj0kaW5saW5lPyZyb3RhdGUoKToiXHRibAkuTHJvdGF0ZVxuIjsKK30KKworc3ViIEJPRFlfNDBfNTkgeworJGNvZGUuPSRpbmxpbmU/JmNvbW1vbigpOiJcdGJsCS5MY29tbW9uXG4iOworJGNvZGUuPTw8X19fOworCW1vdgkkdDEsJGIKKwlhbmQJJHQxLCRjCisJbW92CSRlLCRiCisJb3JyCSRlLCRjCisJYW5kCSRlLCRkCisJb3JyCSR0MSwkZQkJCUAgRl80MF81OShCLEMsRCkKK19fXworJGNvZGUuPSRpbmxpbmU/JnJvdGF0ZSgpOiJcdGJsCS5Mcm90YXRlXG4iOworfQorCiskY29kZT08PF9fXzsKKy50ZXh0CisuY29kZQkxNgorCisuZ2xvYmFsCXNoYTFfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMV9ibG9ja19kYXRhX29yZGVyLCVmdW5jdGlvbgorCisuYWxpZ24JMgorc2hhMV9ibG9ja19kYXRhX29yZGVyOgorX19fCitpZiAoJGNoZWF0X29uX2JpbnV0aWxzKSB7CiskY29kZS49PDxfX187CisuY29kZQkzMgorCWFkZAlyMyxwYywjMQorCWJ4CXIzCQkJQCBzd2l0Y2ggdG8gVGh1bWIgSVNBCisuY29kZQkxNgorX19fCit9CiskY29kZS49PDxfX187CisJcHVzaAl7cjQtcjd9CisJbW92CXIzLHI4CisJbW92CXI0LHI5CisJbW92CXI1LHIxMAorCW1vdglyNixyMTEKKwltb3YJcjcscjEyCisJcHVzaAl7cjMtcjcsbHJ9CisJbHNsCXIyLCM2CisJbW92CSRjdHgscjAJCQlAIHNhdmUgY29udGV4dAorCW1vdgkkaW5wLHIxCQkJQCBzYXZlIGlucAorCW1vdgkkbGVuLHIyCQkJQCBzYXZlIGxlbgorCWFkZAkkbGVuLCRpbnAJCUAgJGxlbiB0byBwb2ludCBhdCBpbnAgZW5kCisKKy5MbG9vcDoKKwltb3YJJFhpLHNwCisJbW92CSR0MixzcAorCXN1YgkkdDIsIzE2KjQJCUAgWzNdCisuTFhsb2FkOgorCWxkcmIJJGEsWyR0MSwjMF0JCUAgJHQxIGlzIHIxIGFuZCBob2xkcyBpbnAKKwlsZHJiCSRiLFskdDEsIzFdCisJbGRyYgkkYyxbJHQxLCMyXQorCWxkcmIJJGQsWyR0MSwjM10KKwlsc2wJJGEsIzI0CisJbHNsCSRiLCMxNgorCWxzbAkkYywjOAorCW9ycgkkYSwkYgorCW9ycgkkYSwkYworCW9ycgkkYSwkZAorCWFkZAkkdDEsIzQKKwlwdXNoCXskYX0KKwljbXAJc3AsJHQyCisJYm5lCS5MWGxvYWQJCQlAIFsrMTQqMTZdCisKKwltb3YJJGlucCwkdDEJCUAgdXBkYXRlICRpbnAKKwlzdWIJJHQyLCMzMio0CisJc3ViCSR0MiwjMzIqNAorCW1vdgkkZSwjMzEJCQlAIFsrNF0KKy5MWHVwZGF0ZToKKwlsZHIJJGEsW3NwLCMxNSo0XQorCWxkcgkkYixbc3AsIzEzKjRdCisJbGRyCSRjLFtzcCwjNyo0XQorCWxkcgkkZCxbc3AsIzIqNF0KKwllb3IJJGEsJGIKKwllb3IJJGEsJGMKKwllb3IJJGEsJGQKKwlyb3IJJGEsJGUKKwlwdXNoCXskYX0KKwljbXAJc3AsJHQyCisJYm5lCS5MWHVwZGF0ZQkJQCBbKygxMSsxKSo2NF0KKworCWxkbWlhCSR0MCEseyRhLCRiLCRjLCRkLCRlfQlAICR0MCBpcyByMCBhbmQgaG9sZHMgY3R4CisJbW92CSR0MCwkWGkKKworCWxkcgkkdDIsLkxLXzAwXzE5CisJbW92CSR0MSwkdDAKKwlzdWIJJHQxLCMyMCo0CisJbW92CSRYaSwkdDEKKwltb3YJJEssJHQyCQkJQCBbKzcrNF0KKy5MXzAwXzE5OgorX19fCisJJkJPRFlfMDBfMTkoKTsKKyRjb2RlLj08PF9fXzsKKwljbXAJJFhpLCR0MAorCWJuZQkuTF8wMF8xOQkJQCBbKygyKzkrNCsyKzgrMikqMjBdCisKKwlsZHIJJHQyLC5MS18yMF8zOQorCW1vdgkkdDEsJHQwCisJc3ViCSR0MSwjMjAqNAorCW1vdgkkWGksJHQxCisJbW92CSRLLCR0MgkJCUAgWys1XQorLkxfMjBfMzlfb3JfNjBfNzk6CitfX18KKwkmQk9EWV8yMF8zOSgpOworJGNvZGUuPTw8X19fOworCWNtcAkkWGksJHQwCisJYm5lCS5MXzIwXzM5X29yXzYwXzc5CUAgWysoMis5KzMrMis4KzIpKjIwKjJdCisJY21wCXNwLCR0MAorCWJlcQkuTGRvbmUJCQlAIFsrMl0KKworCWxkcgkkdDIsLkxLXzQwXzU5CisJbW92CSR0MSwkdDAKKwlzdWIJJHQxLCMyMCo0CisJbW92CSRYaSwkdDEKKwltb3YJJEssJHQyCQkJQCBbKzVdCisuTF80MF81OToKK19fXworCSZCT0RZXzQwXzU5KCk7CiskY29kZS49PDxfX187CisJY21wCSRYaSwkdDAKKwlibmUJLkxfNDBfNTkJCUAgWysoMis5KzYrMis4KzIpKjIwXQorCisJbGRyCSR0MiwuTEtfNjBfNzkKKwltb3YJJFhpLHNwCisJbW92CSRLLCR0MgorCWIJLkxfMjBfMzlfb3JfNjBfNzkJQCBbKzRdCisuTGRvbmU6CisJbW92CSR0MCwkY3R4CisJbGRyCSR0MSxbJHQwLCMwXQorCWxkcgkkdDIsWyR0MCwjNF0KKwlhZGQJJGEsJHQxCisJbGRyCSR0MSxbJHQwLCM4XQorCWFkZAkkYiwkdDIKKwlsZHIJJHQyLFskdDAsIzEyXQorCWFkZAkkYywkdDEKKwlsZHIJJHQxLFskdDAsIzE2XQorCWFkZAkkZCwkdDIKKwlhZGQJJGUsJHQxCisJc3RtaWEJJHQwISx7JGEsJGIsJGMsJGQsJGV9CUAgWysyMF0KKworCWFkZAlzcCwjODAqNAkJQCBkZWFsbG9jYXRlIHN0YWNrIGZyYW1lCisJbW92CSR0MCwkY3R4CQlAIHJlc3RvcmUgY3R4CisJbW92CSR0MSwkaW5wCQlAIHJlc3RvcmUgaW5wCisJY21wCSR0MSwkbGVuCisJYmVxCS5MZXhpdAorCWIJLkxsb29wCQkJQCBbKzZdIHRvdGFsIDMyMTIgY3ljbGVzCisuTGV4aXQ6CisJcG9wCXtyMi1yN30KKwltb3YJcjgscjIKKwltb3YJcjkscjMKKwltb3YJcjEwLHI0CisJbW92CXIxMSxyNQorCW1vdglyMTIscjYKKwltb3YJbHIscjcKKwlwb3AJe3I0LXI3fQorCWJ4CWxyCisuYWxpZ24JMgorX19fCiskY29kZS49Ii5MY29tbW9uOlxuIi4mY29tbW9uKCkuIlx0bW92CXBjLGxyXG4iIGlmICghJGlubGluZSk7CiskY29kZS49Ii5Mcm90YXRlOlxuIi4mcm90YXRlKCkuIlx0bW92CXBjLGxyXG4iIGlmICghJGlubGluZSk7CiskY29kZS49PDxfX187CisuYWxpZ24JMgorLkxLXzAwXzE5Ogkud29yZAkweDVhODI3OTk5CisuTEtfMjBfMzk6CS53b3JkCTB4NmVkOWViYTEKKy5MS180MF81OToJLndvcmQJMHg4ZjFiYmNkYworLkxLXzYwXzc5Ogkud29yZAkweGNhNjJjMWQ2Cisuc2l6ZQlzaGExX2Jsb2NrX2RhdGFfb3JkZXIsLi1zaGExX2Jsb2NrX2RhdGFfb3JkZXIKKy5hc2NpegkiU0hBMSBibG9jayB0cmFuc2Zvcm0gZm9yIFRodW1iLCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorX19fCisKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOyAjIGVuZm9yY2UgZmx1c2gKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEteDg2XzY0LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMS14ODZfNjQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkYzVlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTEteDg2XzY0LnBsCkBAIC0wLDAgKzEsMzUxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBzaGExX2Jsb2NrIHByb2NlZHVyZSBmb3IgeDg2XzY0LgorIworIyBJdCB3YXMgYnJvdWdodCB0byBteSBhdHRlbnRpb24gdGhhdCBvbiBFTTY0VCBjb21waWxlci1nZW5lcmF0ZWQgY29kZQorIyB3YXMgZmFyIGJlaGluZCAzMi1iaXQgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIHVubGlrZSBvbgorIyBPcHRlcm9uIHdoZXJlIGNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlIHdhcyBvbmx5IDE1JSBiZWhpbmQgMzItYml0CisjIGFzc2VtYmxlciwgd2hpY2ggb3JpZ2luYWxseSBtYWRlIGl0IGhhcmQgdG8gbW90aXZhdGUgdGhlIGVmZm9ydC4KKyMgVGhlcmUgd2FzIHN1Z2dlc3Rpb24gdG8gbWVjaGFuaWNhbGx5IHRyYW5zbGF0ZSAzMi1iaXQgY29kZSwgYnV0IEkKKyMgZGlzbWlzc2VkIGl0LCByZWFzb25pbmcgdGhhdCB4ODZfNjQgb2ZmZXJzIGVub3VnaCByZWdpc3RlciBiYW5rCisjIGNhcGFjaXR5IHRvIGZ1bGx5IHV0aWxpemUgU0hBLTEgcGFyYWxsZWxpc20uIFRoZXJlZm9yZSB0aGlzIGZyZXNoCisjIGltcGxlbWVudGF0aW9uOi0pIEhvd2V2ZXIhIFdoaWxlIDY0LWJpdCBjb2RlIGRvZXMgcGVyZm9ybXMgYmV0dGVyCisjIG9uIE9wdGVyb24sIEkgZmFpbGVkIHRvIGJlYXQgMzItYml0IGFzc2VtYmxlciBvbiBFTTY0VCBjb3JlLiBXZWxsLAorIyB4ODZfNjQgZG9lcyBvZmZlciBsYXJnZXIgKmFkZHJlc3NhYmxlKiBiYW5rLCBidXQgb3V0LW9mLW9yZGVyIGNvcmUKKyMgcmVhY2hlcyBmb3IgZXZlbiBtb3JlIHJlZ2lzdGVycyB0aHJvdWdoIGR5bmFtaWMgYWxpYXNpbmcsIGFuZCBFTTY0VAorIyBjb3JlIG11c3QgaGF2ZSBtYW5hZ2VkIHRvIHJ1bi10aW1lIG9wdGltaXplIGV2ZW4gMzItYml0IGNvZGUganVzdCBhcworIyBnb29kIGFzIDY0LWJpdCBvbmUuIFBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGlzIHN1bW1hcml6ZWQgaW4gdGhlCisjIGZvbGxvd2luZyB0YWJsZToKKyMKKyMJCWdjYyAzLjQJCTMyLWJpdCBhc20JY3ljbGVzL2J5dGUKKyMgT3B0ZXJvbgkrNDUlCQkrMjAlCQk2LjgKKyMgWGVvbiBQNAkrNjUlCQkrMCUJCTkuOQorIyBDb3JlMgkJKzYwJQkJKzEwJQkJNy4wCisKKyRmbGF2b3VyID0gc2hpZnQ7Ciskb3V0cHV0ICA9IHNoaWZ0OworaWYgKCRmbGF2b3VyID1+IC9cLi8pIHsgJG91dHB1dCA9ICRmbGF2b3VyOyB1bmRlZiAkZmxhdm91cjsgfQorCiskd2luNjQ9MDsgJHdpbjY0PTEgaWYgKCRmbGF2b3VyID1+IC9bbm1dYXNtfG1pbmd3NjQvIHx8ICRvdXRwdXQgPX4gL1wuYXNtJC8pOworCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXg4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS94ODZfNjQteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSB4ODZfNjQteGxhdGUucGwiOworCitvcGVuIFNURE9VVCwifCAkXlggJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiOworCiskY3R4PSIlcmRpIjsJIyAxc3QgYXJnCiskaW5wPSIlcnNpIjsJIyAybmQgYXJnCiskbnVtPSIlcmR4IjsJIyAzcmQgYXJnCisKKyMgcmVhc3NpZ24gYXJndW1lbnRzIGluIG9yZGVyIHRvIHByb2R1Y2UgbW9yZSBjb21wYWN0IGNvZGUKKyRjdHg9IiVyOCI7CiskaW5wPSIlcjkiOworJG51bT0iJXIxMCI7CisKKyR4aT0iJWVheCI7CiskdDA9IiVlYngiOworJHQxPSIlZWN4IjsKKyRBPSIlZWR4IjsKKyRCPSIlZXNpIjsKKyRDPSIlZWRpIjsKKyREPSIlZWJwIjsKKyRFPSIlcjExZCI7CiskVD0iJXIxMmQiOworCitAVj0oJEEsJEIsJEMsJEQsJEUsJFQpOworCitzdWIgUFJPTE9HVUUgeworbXkgJGZ1bmM9c2hpZnQ7CiskY29kZS49PDxfX187CisuZ2xvYmwJJGZ1bmMKKy50eXBlCSRmdW5jLFxAZnVuY3Rpb24sMworLmFsaWduCTE2CiskZnVuYzoKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwltb3YJJXJzcCwlcjExCisJbW92CSVyZGksJGN0eAkjIHJlYXNzaWduZWQgYXJndW1lbnQKKwlzdWIJXCRgOCsxNio0YCwlcnNwCisJbW92CSVyc2ksJGlucAkjIHJlYXNzaWduZWQgYXJndW1lbnQKKwlhbmQJXCQtNjQsJXJzcAorCW1vdgklcmR4LCRudW0JIyByZWFzc2lnbmVkIGFyZ3VtZW50CisJbW92CSVyMTEsYDE2KjRgKCVyc3ApCisuTHByb2xvZ3VlOgorCisJbW92CTAoJGN0eCksJEEKKwltb3YJNCgkY3R4KSwkQgorCW1vdgk4KCRjdHgpLCRDCisJbW92CTEyKCRjdHgpLCRECisJbW92CTE2KCRjdHgpLCRFCitfX18KK30KKworc3ViIEVQSUxPR1VFIHsKK215ICRmdW5jPXNoaWZ0OworJGNvZGUuPTw8X19fOworCW1vdglgMTYqNGAoJXJzcCksJXJzaQorCW1vdgkoJXJzaSksJXIxMgorCW1vdgk4KCVyc2kpLCVyYnAKKwltb3YJMTYoJXJzaSksJXJieAorCWxlYQkyNCglcnNpKSwlcnNwCisuTGVwaWxvZ3VlOgorCXJldAorLnNpemUJJGZ1bmMsLi0kZnVuYworX19fCit9CisKK3N1YiBCT0RZXzAwXzE5IHsKK215ICgkaSwkYSwkYiwkYywkZCwkZSwkZiwkaG9zdCk9QF87CitteSAkaj0kaSsxOworJGNvZGUuPTw8X19fIGlmICgkaT09MCk7CisJbW92CWA0KiRpYCgkaW5wKSwkeGkJCisJYCJic3dhcAkkeGkiCWlmKCFkZWZpbmVkKCRob3N0KSlgCisJbW92CSR4aSxgNCokaWAoJXJzcCkKK19fXworJGNvZGUuPTw8X19fIGlmICgkaTwxNSk7CisJbGVhCTB4NWE4Mjc5OTkoJHhpLCRlKSwkZgorCW1vdgkkYywkdDAKKwltb3YJYDQqJGpgKCRpbnApLCR4aQorCW1vdgkkYSwkZQorCXhvcgkkZCwkdDAKKwlgImJzd2FwCSR4aSIJaWYoIWRlZmluZWQoJGhvc3QpKWAJCisJcm9sCVwkNSwkZQorCWFuZAkkYiwkdDAKKwltb3YJJHhpLGA0KiRqYCglcnNwKQorCWFkZAkkZSwkZgorCXhvcgkkZCwkdDAKKwlyb2wJXCQzMCwkYgorCWFkZAkkdDAsJGYKK19fXworJGNvZGUuPTw8X19fIGlmICgkaT49MTUpOworCWxlYQkweDVhODI3OTk5KCR4aSwkZSksJGYKKwltb3YJYDQqKCRqJTE2KWAoJXJzcCksJHhpCisJbW92CSRjLCR0MAorCW1vdgkkYSwkZQorCXhvcglgNCooKCRqKzIpJTE2KWAoJXJzcCksJHhpCisJeG9yCSRkLCR0MAorCXJvbAlcJDUsJGUKKwl4b3IJYDQqKCgkais4KSUxNilgKCVyc3ApLCR4aQorCWFuZAkkYiwkdDAKKwlhZGQJJGUsJGYKKwl4b3IJYDQqKCgkaisxMyklMTYpYCglcnNwKSwkeGkKKwl4b3IJJGQsJHQwCisJcm9sCVwkMzAsJGIKKwlhZGQJJHQwLCRmCisJcm9sCVwkMSwkeGkKKwltb3YJJHhpLGA0KigkaiUxNilgKCVyc3ApCitfX18KK30KKworc3ViIEJPRFlfMjBfMzkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKK215ICRqPSRpKzE7CitteSAkSz0oJGk8NDApPzB4NmVkOWViYTE6MHhjYTYyYzFkNjsKKyRjb2RlLj08PF9fXyBpZiAoJGk8NzkpOworCWxlYQkkSygkeGksJGUpLCRmCisJbW92CWA0KigkaiUxNilgKCVyc3ApLCR4aQorCW1vdgkkYywkdDAKKwltb3YJJGEsJGUKKwl4b3IJYDQqKCgkaisyKSUxNilgKCVyc3ApLCR4aQorCXhvcgkkYiwkdDAKKwlyb2wJXCQ1LCRlCisJeG9yCWA0KigoJGorOCklMTYpYCglcnNwKSwkeGkKKwl4b3IJJGQsJHQwCisJYWRkCSRlLCRmCisJeG9yCWA0KigoJGorMTMpJTE2KWAoJXJzcCksJHhpCisJcm9sCVwkMzAsJGIKKwlhZGQJJHQwLCRmCisJcm9sCVwkMSwkeGkKK19fXworJGNvZGUuPTw8X19fIGlmICgkaTw3Nik7CisJbW92CSR4aSxgNCooJGolMTYpYCglcnNwKQorX19fCiskY29kZS49PDxfX18gaWYgKCRpPT03OSk7CisJbGVhCSRLKCR4aSwkZSksJGYKKwltb3YJJGMsJHQwCisJbW92CSRhLCRlCisJeG9yCSRiLCR0MAorCXJvbAlcJDUsJGUKKwl4b3IJJGQsJHQwCisJYWRkCSRlLCRmCisJcm9sCVwkMzAsJGIKKwlhZGQJJHQwLCRmCitfX18KK30KKworc3ViIEJPRFlfNDBfNTkgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlLCRmKT1AXzsKK215ICRqPSRpKzE7CiskY29kZS49PDxfX187CisJbGVhCTB4OGYxYmJjZGMoJHhpLCRlKSwkZgorCW1vdglgNCooJGolMTYpYCglcnNwKSwkeGkKKwltb3YJJGIsJHQwCisJbW92CSRiLCR0MQorCXhvcglgNCooKCRqKzIpJTE2KWAoJXJzcCksJHhpCisJbW92CSRhLCRlCisJYW5kCSRjLCR0MAorCXhvcglgNCooKCRqKzgpJTE2KWAoJXJzcCksJHhpCisJb3IJJGMsJHQxCisJcm9sCVwkNSwkZQorCXhvcglgNCooKCRqKzEzKSUxNilgKCVyc3ApLCR4aQorCWFuZAkkZCwkdDEKKwlhZGQJJGUsJGYKKwlyb2wJXCQxLCR4aQorCW9yCSR0MSwkdDAKKwlyb2wJXCQzMCwkYgorCW1vdgkkeGksYDQqKCRqJTE2KWAoJXJzcCkKKwlhZGQJJHQwLCRmCitfX18KK30KKworJGNvZGU9Ii50ZXh0XG4iOworCismUFJPTE9HVUUoInNoYTFfYmxvY2tfZGF0YV9vcmRlciIpOworJGNvZGUuPSIuYWxpZ24JNFxuLkxsb29wOlxuIjsKK2ZvcigkaT0wOyRpPDIwOyRpKyspCXsgJkJPRFlfMDBfMTkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9Citmb3IoOyRpPDQwOyRpKyspCXsgJkJPRFlfMjBfMzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9Citmb3IoOyRpPDYwOyRpKyspCXsgJkJPRFlfNDBfNTkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9Citmb3IoOyRpPDgwOyRpKyspCXsgJkJPRFlfMjBfMzkoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49PDxfX187CisJYWRkCTAoJGN0eCksJEUKKwlhZGQJNCgkY3R4KSwkVAorCWFkZAk4KCRjdHgpLCRBCisJYWRkCTEyKCRjdHgpLCRCCisJYWRkCTE2KCRjdHgpLCRDCisJbW92CSRFLDAoJGN0eCkKKwltb3YJJFQsNCgkY3R4KQorCW1vdgkkQSw4KCRjdHgpCisJbW92CSRCLDEyKCRjdHgpCisJbW92CSRDLDE2KCRjdHgpCisKKwl4Y2hnCSRFLCRBCSMgbW92CSRFLCRBCisJeGNoZwkkVCwkQgkjIG1vdgkkVCwkQgorCXhjaGcJJEUsJEMJIyBtb3YJJEEsJEMKKwl4Y2hnCSRULCRECSMgbW92CSRCLCRECisJCQkjIG1vdgkkQywkRQorCWxlYQlgMTYqNGAoJGlucCksJGlucAorCXN1YglcJDEsJG51bQorCWpuegkuTGxvb3AKK19fXworJkVQSUxPR1VFKCJzaGExX2Jsb2NrX2RhdGFfb3JkZXIiKTsKKyRjb2RlLj08PF9fXzsKKy5hc2NpegkiU0hBMSBibG9jayB0cmFuc2Zvcm0gZm9yIHg4Nl82NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkxNgorX19fCisKKyMgRVhDRVBUSU9OX0RJU1BPU0lUSU9OIGhhbmRsZXIgKEVYQ0VQVElPTl9SRUNPUkQgKnJlYyxVTE9ORzY0IGZyYW1lLAorIwkJQ09OVEVYVCAqY29udGV4dCxESVNQQVRDSEVSX0NPTlRFWFQgKmRpc3ApCitpZiAoJHdpbjY0KSB7CiskcmVjPSIlcmN4IjsKKyRmcmFtZT0iJXJkeCI7CiskY29udGV4dD0iJXI4IjsKKyRkaXNwPSIlcjkiOworCiskY29kZS49PDxfX187CisuZXh0ZXJuCV9faW1wX1J0bFZpcnR1YWxVbndpbmQKKy50eXBlCXNlX2hhbmRsZXIsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitzZV9oYW5kbGVyOgorCXB1c2gJJXJzaQorCXB1c2gJJXJkaQorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCXB1c2hmcQorCXN1YglcJDY0LCVyc3AKKworCW1vdgkxMjAoJGNvbnRleHQpLCVyYXgJIyBwdWxsIGNvbnRleHQtPlJheAorCW1vdgkyNDgoJGNvbnRleHQpLCVyYngJIyBwdWxsIGNvbnRleHQtPlJpcAorCisJbGVhCS5McHJvbG9ndWUoJXJpcCksJXIxMAorCWNtcAklcjEwLCVyYngJCSMgY29udGV4dC0+UmlwPC5McHJvbG9ndWUKKwlqYgkuTGluX3Byb2xvZ3VlCisKKwltb3YJMTUyKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5Sc3AKKworCWxlYQkuTGVwaWxvZ3VlKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcD49LkxlcGlsb2d1ZQorCWphZQkuTGluX3Byb2xvZ3VlCisKKwltb3YJYDE2KjRgKCVyYXgpLCVyYXgJIyBwdWxsIHNhdmVkIHN0YWNrIHBvaW50ZXIKKwlsZWEJMjQoJXJheCksJXJheAorCisJbW92CS04KCVyYXgpLCVyYngKKwltb3YJLTE2KCVyYXgpLCVyYnAKKwltb3YJLTI0KCVyYXgpLCVyMTIKKwltb3YJJXJieCwxNDQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYngKKwltb3YJJXJicCwxNjAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYnAKKwltb3YJJXIxMiwyMTYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTIKKworLkxpbl9wcm9sb2d1ZToKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworCW1vdgk0MCgkZGlzcCksJXJkaQkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAorCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCXNlX2hhbmRsZXIsLi1zZV9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luX3NoYTFfYmxvY2tfZGF0YV9vcmRlcgorCS5ydmEJLkxTRUhfZW5kX3NoYTFfYmxvY2tfZGF0YV9vcmRlcgorCS5ydmEJLkxTRUhfaW5mb19zaGExX2Jsb2NrX2RhdGFfb3JkZXIKKworLnNlY3Rpb24JLnhkYXRhCisuYWxpZ24JOAorLkxTRUhfaW5mb19zaGExX2Jsb2NrX2RhdGFfb3JkZXI6CisJLmJ5dGUJOSwwLDAsMAorCS5ydmEJc2VfaGFuZGxlcgorX19fCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGEyNTYtNTg2LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMjU2LTU4Ni5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2M4YjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMjU2LTU4Ni5wbApAQCAtMCwwICsxLDI1MSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgU0hBMjU2IGJsb2NrIHRyYW5zZm9ybSBmb3IgeDg2LiBTZXB0ZW1iZXIgMjAwNy4KKyMKKyMgUGVyZm9ybWFuY2UgaW4gY2xvY2sgY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZSAobGVzcyBpcyBiZXR0ZXIpOgorIworIwkJUGVudGl1bQlQSUlJCVA0CUFNRCBLOAlDb3JlMgorIyBnY2MJCTQ2CTM2CTQxCTI3CTI2CisjIGljYwkJNTcJMzMJMzgJMjUJMjMJCisjIHg4NiBhc20JNDAJMzAJMzUJMjAJMjAKKyMgeDg2XzY0IGFzbSgqKQktCS0JMjEJMTUuOAkxNi41CisjCisjICgqKSB4ODZfNjQgYXNzZW1ibGVyIHBlcmZvcm1hbmNlIGlzIHByZXNlbnRlZCBmb3IgcmVmZXJlbmNlCisjICAgICBwdXJwb3Nlcy4KKyMKKyMgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb3ZlciBjb21waWxlciBnZW5lcmF0ZWQgY29kZSB2YXJpZXMgZnJvbQorIyAxMCUgdG8gNDAlIFtzZWUgYWJvdmVdLiBOb3QgdmVyeSBpbXByZXNzaXZlIG9uIHNvbWUgtS1hcmNocywgYnV0CisjIGl0J3MgNSB0aW1lcyBzbWFsbGVyIGFuZCBvcHRpbWl6aWVzIGFtb3VudCBvZiB3cml0ZXMuCisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CitwdXNoKEBJTkMsIiR7ZGlyfSIsIiR7ZGlyfS4uLy4uL3Blcmxhc20iKTsKK3JlcXVpcmUgIng4NmFzbS5wbCI7CisKKyZhc21faW5pdCgkQVJHVlswXSwic2hhNTEyLTU4Ni5wbCIsJEFSR1ZbJCNBUkdWXSBlcSAiMzg2Iik7CisKKyRBPSJlYXgiOworJEU9ImVkeCI7CiskVD0iZWJ4IjsKKyRBb2ZmPSZEV1AoMCwiZXNwIik7CiskQm9mZj0mRFdQKDQsImVzcCIpOworJENvZmY9JkRXUCg4LCJlc3AiKTsKKyREb2ZmPSZEV1AoMTIsImVzcCIpOworJEVvZmY9JkRXUCgxNiwiZXNwIik7CiskRm9mZj0mRFdQKDIwLCJlc3AiKTsKKyRHb2ZmPSZEV1AoMjQsImVzcCIpOworJEhvZmY9JkRXUCgyOCwiZXNwIik7CiskWG9mZj0mRFdQKDMyLCJlc3AiKTsKKyRLMjU2PSJlYnAiOworCitzdWIgQk9EWV8wMF8xNSgpIHsKKyAgICBteSAkaW5fMTZfNjM9c2hpZnQ7CisKKwkmbW92CSgiZWN4IiwkRSk7CisJICZhZGQJKCRULCZEV1AoNCooOCsxNSsxNi05KSwiZXNwIikpCWlmICgkaW5fMTZfNjMpOwkjIFQgKz0gWFstN10KKwkmcm9yCSgiZWN4Iiw2KTsKKwkmbW92CSgiZWRpIiwkRSk7CisJJnJvcgkoImVkaSIsMTEpOworCSAmbW92CSgiZXNpIiwkRm9mZik7CisJJnhvcgkoImVjeCIsImVkaSIpOworCSZyb3IJKCJlZGkiLDI1LTExKTsKKwkgJm1vdgkoJkRXUCg0Kig4KzE1KSwiZXNwIiksJFQpCWlmICgkaW5fMTZfNjMpOwkjIHNhdmUgWFswXQorCSZ4b3IJKCJlY3giLCJlZGkiKTsJIyBTaWdtYTEoZSkKKwkgJm1vdgkoImVkaSIsJEdvZmYpOworCSZhZGQJKCRULCJlY3giKTsJIyBUICs9IFNpZ21hMShlKQorCSAmbW92CSgkRW9mZiwkRSk7CSMgbW9kdWxvLXNjaGVkdWxlZAorCisJJnhvcgkoImVzaSIsImVkaSIpOworCSAmbW92CSgiZWN4IiwkQSk7CisJJmFuZAkoImVzaSIsJEUpOworCSAmbW92CSgkRSwkRG9mZik7CSMgZSBiZWNvbWVzIGQsIHdoaWNoIGlzIGUgaW4gbmV4dCBpdGVyYXRpb24KKwkmeG9yCSgiZXNpIiwiZWRpIik7CSMgQ2goZSxmLGcpCisJICZtb3YJKCJlZGkiLCRBKTsKKwkmYWRkCSgkVCwiZXNpIik7CSMgVCArPSBDaChlLGYsZykKKworCSZyb3IJKCJlY3giLDIpOworCSAmYWRkCSgkVCwkSG9mZik7CSMgVCArPSBoCisJJnJvcgkoImVkaSIsMTMpOworCSAmbW92CSgiZXNpIiwkQm9mZik7CisJJnhvcgkoImVjeCIsImVkaSIpOworCSZyb3IJKCJlZGkiLDIyLTEzKTsKKwkgJmFkZAkoJEUsJFQpOwkjIGQgKz0gVAorCSZ4b3IJKCJlY3giLCJlZGkiKTsJIyBTaWdtYTAoYSkKKwkgJm1vdgkoImVkaSIsJENvZmYpOworCisJJmFkZAkoJFQsImVjeCIpOwkjIFQgKz0gU2lnbWEwKGEpCisJICZtb3YJKCRBb2ZmLCRBKTsJIyBtb2R1bG8tc2NoZWR1bGVkCisKKwkmbW92CSgiZWN4IiwkQSk7CisJICZzdWIJKCJlc3AiLDQpOworCSZvcgkoJEEsImVzaSIpOwkjIGEgYmVjb21lcyBoLCB3aGljaCBpcyBhIGluIG5leHQgaXRlcmF0aW9uCisJJmFuZAkoImVjeCIsImVzaSIpOworCSZhbmQJKCRBLCJlZGkiKTsKKwkgJm1vdgkoImVzaSIsJkRXUCgwLCRLMjU2KSk7CisJJm9yCSgkQSwiZWN4Iik7CSMgaD1NYWooYSxiLGMpCisKKwkmYWRkCSgkSzI1Niw0KTsKKwkmYWRkCSgkQSwkVCk7CSMgaCArPSBUCisJICZtb3YJKCRULCZEV1AoNCooOCsxNSsxNi0xKSwiZXNwIikpCWlmICgkaW5fMTZfNjMpOwkjIHByZWxvYWQgVAorCSZhZGQJKCRFLCJlc2kiKTsJIyBkICs9IEsyNTZbaV0KKwkmYWRkCSgkQSwiZXNpIik7CSMgaCArPSBLMjU2W2ldCit9CisKKyZmdW5jdGlvbl9iZWdpbigic2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIiKTsKKwkmbW92CSgiZXNpIix3cGFyYW0oMCkpOwkjIGN0eAorCSZtb3YJKCJlZGkiLHdwYXJhbSgxKSk7CSMgaW5wCisJJm1vdgkoImVheCIsd3BhcmFtKDIpKTsJIyBudW0KKwkmbW92CSgiZWJ4IiwiZXNwIik7CQkjIHNhdmVkIHNwCisKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CSMgbWFrZSBpdCBQSUMhCismc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmYmxpbmRwb3AoJEsyNTYpOworCSZsZWEJKCRLMjU2LCZEV1AoJmxhYmVsKCJLMjU2IikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJEsyNTYpKTsKKworCSZzdWIJKCJlc3AiLDE2KTsKKwkmYW5kCSgiZXNwIiwtNjQpOworCisJJnNobAkoImVheCIsNik7CisJJmFkZAkoImVheCIsImVkaSIpOworCSZtb3YJKCZEV1AoMCwiZXNwIiksImVzaSIpOwkjIGN0eAorCSZtb3YJKCZEV1AoNCwiZXNwIiksImVkaSIpOwkjIGlucAorCSZtb3YJKCZEV1AoOCwiZXNwIiksImVheCIpOwkjIGlucCtudW0qMTI4CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksImVieCIpOwkjIHNhdmVkIHNwCisKKyZzZXRfbGFiZWwoImxvb3AiLDE2KTsKKyAgICAjIGNvcHkgaW5wdXQgYmxvY2sgdG8gc3RhY2sgcmV2ZXJzaW5nIGJ5dGUgYW5kIGR3b3JkIG9yZGVyCisgICAgZm9yKCRpPTA7JGk8NDskaSsrKSB7CisJJm1vdgkoImVheCIsJkRXUCgkaSoxNiswLCJlZGkiKSk7CisJJm1vdgkoImVieCIsJkRXUCgkaSoxNis0LCJlZGkiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgkaSoxNis4LCJlZGkiKSk7CisJJm1vdgkoImVkeCIsJkRXUCgkaSoxNisxMiwiZWRpIikpOworCSZic3dhcAkoImVheCIpOworCSZic3dhcAkoImVieCIpOworCSZic3dhcAkoImVjeCIpOworCSZic3dhcAkoImVkeCIpOworCSZwdXNoCSgiZWF4Iik7CisJJnB1c2gJKCJlYngiKTsKKwkmcHVzaAkoImVjeCIpOworCSZwdXNoCSgiZWR4Iik7CisgICAgfQorCSZhZGQJKCJlZGkiLDY0KTsKKwkmc3ViCSgiZXNwIiw0KjgpOwkJIyBwbGFjZSBmb3IgQSxCLEMsRCxFLEYsRyxICisJJm1vdgkoJkRXUCg0Kig4KzE2KSs0LCJlc3AiKSwiZWRpIik7CisKKwkjIGNvcHkgY3R4LT5oWzAtN10gdG8gQSxCLEMsRCxFLEYsRyxIIG9uIHN0YWNrCisJJm1vdgkoJEEsJkRXUCgwLCJlc2kiKSk7CisJJm1vdgkoImVieCIsJkRXUCg0LCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCg4LCJlc2kiKSk7CisJJm1vdgkoImVkaSIsJkRXUCgxMiwiZXNpIikpOworCSMgJm1vdgkoJEFvZmYsJEEpOworCSZtb3YJKCRCb2ZmLCJlYngiKTsKKwkmbW92CSgkQ29mZiwiZWN4Iik7CisJJm1vdgkoJERvZmYsImVkaSIpOworCSZtb3YJKCRFLCZEV1AoMTYsImVzaSIpKTsJCisJJm1vdgkoImVieCIsJkRXUCgyMCwiZXNpIikpOworCSZtb3YJKCJlY3giLCZEV1AoMjQsImVzaSIpKTsKKwkmbW92CSgiZWRpIiwmRFdQKDI4LCJlc2kiKSk7CisJIyAmbW92CSgkRW9mZiwkRSk7CisJJm1vdgkoJEZvZmYsImVieCIpOworCSZtb3YJKCRHb2ZmLCJlY3giKTsKKwkmbW92CSgkSG9mZiwiZWRpIik7CisKKyZzZXRfbGFiZWwoIjAwXzE1IiwxNik7CisJJm1vdgkoJFQsJkRXUCg0Kig4KzE1KSwiZXNwIikpOworCisJJkJPRFlfMDBfMTUoKTsKKworCSZjbXAJKCJlc2kiLDB4YzE5YmYxNzQpOworCSZqbmUJKCZsYWJlbCgiMDBfMTUiKSk7CisKKwkmbW92CSgkVCwmRFdQKDQqKDgrMTUrMTYtMSksImVzcCIpKTsJIyBwcmVsb2FkZWQgaW4gQk9EWV8wMF8xNSgxKQorJnNldF9sYWJlbCgiMTZfNjMiLDE2KTsKKwkmbW92CSgiZXNpIiwkVCk7CisJICZtb3YJKCJlY3giLCZEV1AoNCooOCsxNSsxNi0xNCksImVzcCIpKTsKKwkmc2hyCSgkVCwzKTsKKwkmcm9yCSgiZXNpIiw3KTsKKwkmeG9yCSgkVCwiZXNpIik7CisJJnJvcgkoImVzaSIsMTgtNyk7CisJICZtb3YJKCJlZGkiLCJlY3giKTsKKwkmeG9yCSgkVCwiZXNpIik7CQkJIyBUID0gc2lnbWEwKFhbLTE1XSkKKworCSZzaHIJKCJlY3giLDEwKTsKKwkgJm1vdgkoImVzaSIsJkRXUCg0Kig4KzE1KzE2KSwiZXNwIikpOworCSZyb3IJKCJlZGkiLDE3KTsKKwkmeG9yCSgiZWN4IiwiZWRpIik7CisJJnJvcgkoImVkaSIsMTktMTcpOworCSAmYWRkCSgkVCwiZXNpIik7CQkJIyBUICs9IFhbLTE2XQorCSZ4b3IJKCJlZGkiLCJlY3giKQkJCSMgc2lnbWExKFhbLTJdKQorCisJJmFkZAkoJFQsImVkaSIpOwkJCSMgVCArPSBzaWdtYTEoWFstMl0pCisJIyAmYWRkCSgkVCwmRFdQKDQqKDgrMTUrMTYtOSksImVzcCIpKTsJIyBUICs9IFhbLTddLCBtb3ZlZCB0byBCT0RZXzAwXzE1KDEpCisJIyAmbW92CSgmRFdQKDQqKDgrMTUpLCJlc3AiKSwkVCk7CSMgc2F2ZSBYWzBdCisKKwkmQk9EWV8wMF8xNSgxKTsKKworCSZjbXAJKCJlc2kiLDB4YzY3MTc4ZjIpOworCSZqbmUJKCZsYWJlbCgiMTZfNjMiKSk7CisKKwkmbW92CSgiZXNpIiwmRFdQKDQqKDgrMTYrNjQpKzAsImVzcCIpKTsjY3R4CisJIyAmbW92CSgkQSwkQW9mZik7CisJJm1vdgkoImVieCIsJEJvZmYpOworCSZtb3YJKCJlY3giLCRDb2ZmKTsKKwkmbW92CSgiZWRpIiwkRG9mZik7CisJJmFkZAkoJEEsJkRXUCgwLCJlc2kiKSk7CisJJmFkZAkoImVieCIsJkRXUCg0LCJlc2kiKSk7CisJJmFkZAkoImVjeCIsJkRXUCg4LCJlc2kiKSk7CisJJmFkZAkoImVkaSIsJkRXUCgxMiwiZXNpIikpOworCSZtb3YJKCZEV1AoMCwiZXNpIiksJEEpOworCSZtb3YJKCZEV1AoNCwiZXNpIiksImVieCIpOworCSZtb3YJKCZEV1AoOCwiZXNpIiksImVjeCIpOworCSZtb3YJKCZEV1AoMTIsImVzaSIpLCJlZGkiKTsKKwkjICZtb3YJKCRFLCRFb2ZmKTsKKwkmbW92CSgiZWF4IiwkRm9mZik7CisJJm1vdgkoImVieCIsJEdvZmYpOworCSZtb3YJKCJlY3giLCRIb2ZmKTsKKwkmbW92CSgiZWRpIiwmRFdQKDQqKDgrMTYrNjQpKzQsImVzcCIpKTsjaW5wCisJJmFkZAkoJEUsJkRXUCgxNiwiZXNpIikpOworCSZhZGQJKCJlYXgiLCZEV1AoMjAsImVzaSIpKTsKKwkmYWRkCSgiZWJ4IiwmRFdQKDI0LCJlc2kiKSk7CisJJmFkZAkoImVjeCIsJkRXUCgyOCwiZXNpIikpOworCSZtb3YJKCZEV1AoMTYsImVzaSIpLCRFKTsKKwkmbW92CSgmRFdQKDIwLCJlc2kiKSwiZWF4Iik7CisJJm1vdgkoJkRXUCgyNCwiZXNpIiksImVieCIpOworCSZtb3YJKCZEV1AoMjgsImVzaSIpLCJlY3giKTsKKworCSZhZGQJKCJlc3AiLDQqKDgrMTYrNjQpKTsJCSMgZGVzdHJveSBmcmFtZQorCSZzdWIJKCRLMjU2LDQqNjQpOwkJCSMgcmV3aW5kIEsKKworCSZjbXAJKCJlZGkiLCZEV1AoOCwiZXNwIikpOwkJIyBhcmUgd2UgZG9uZSB5ZXQ/CisJJmpiCSgmbGFiZWwoImxvb3AiKSk7CisKKwkmbW92CSgiZXNwIiwmRFdQKDEyLCJlc3AiKSk7CQkjIHJlc3RvcmUgc3AKKyZmdW5jdGlvbl9lbmRfQSgpOworCismc2V0X2xhYmVsKCJLMjU2Iiw2NCk7CSMgWWVzISBJIGtlZXAgaXQgaW4gdGhlIGNvZGUgc2VnbWVudCEKKwkmZGF0YV93b3JkKDB4NDI4YTJmOTgsMHg3MTM3NDQ5MSwweGI1YzBmYmNmLDB4ZTliNWRiYTUpOworCSZkYXRhX3dvcmQoMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNSk7CisJJmRhdGFfd29yZCgweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzKTsKKwkmZGF0YV93b3JkKDB4NzJiZTVkNzQsMHg4MGRlYjFmZSwweDliZGMwNmE3LDB4YzE5YmYxNzQpOworCSZkYXRhX3dvcmQoMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYyk7CisJJmRhdGFfd29yZCgweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhKTsKKwkmZGF0YV93b3JkKDB4OTgzZTUxNTIsMHhhODMxYzY2ZCwweGIwMDMyN2M4LDB4YmY1OTdmYzcpOworCSZkYXRhX3dvcmQoMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2Nyk7CisJJmRhdGFfd29yZCgweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzKTsKKwkmZGF0YV93b3JkKDB4NjUwYTczNTQsMHg3NjZhMGFiYiwweDgxYzJjOTJlLDB4OTI3MjJjODUpOworCSZkYXRhX3dvcmQoMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMyk7CisJJmRhdGFfd29yZCgweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwKTsKKwkmZGF0YV93b3JkKDB4MTlhNGMxMTYsMHgxZTM3NmMwOCwweDI3NDg3NzRjLDB4MzRiMGJjYjUpOworCSZkYXRhX3dvcmQoMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMyk7CisJJmRhdGFfd29yZCgweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4KTsKKwkmZGF0YV93b3JkKDB4OTBiZWZmZmEsMHhhNDUwNmNlYiwweGJlZjlhM2Y3LDB4YzY3MTc4ZjIpOworJmZ1bmN0aW9uX2VuZF9CKCJzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciIpOworJmFzY2l6KCJTSEEyNTYgYmxvY2sgdHJhbnNmb3JtIGZvciB4ODYsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iKTsKKworJmFzbV9maW5pc2goKTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni1hcm12NC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni1hcm12NC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQ4NDZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhMjU2LWFybXY0LnBsCkBAIC0wLDAgKzEsMTgxIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFRoZSBtb2R1bGUgaXMsIGhvd2V2ZXIsIGR1YWwgbGljZW5zZWQgdW5kZXIgT3BlblNTTCBhbmQKKyMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKKyMgZGV0YWlscyBzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+YXBwcm8vY3J5cHRvZ2Ftcy8uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgU0hBMjU2IGJsb2NrIHByb2NlZHVyZSBmb3IgQVJNdjQuIE1heSAyMDA3LgorCisjIFBlcmZvcm1hbmNlIGlzIH4yeCBiZXR0ZXIgdGhhbiBnY2MgMy40IGdlbmVyYXRlZCBjb2RlIGFuZCBpbiAiYWJzby0KKyMgbHV0ZSIgdGVybXMgaXMgfjIyNTAgY3ljbGVzIHBlciA2NC1ieXRlIGJsb2NrIG9yIH4zNSBjeWNsZXMgcGVyCisjIGJ5dGUuCisKKyRvdXRwdXQ9c2hpZnQ7CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworCiskY3R4PSJyMCI7CSR0MD0icjAiOworJGlucD0icjEiOworJGxlbj0icjIiOwkkdDE9InIyIjsKKyRUMT0icjMiOworJEE9InI0IjsKKyRCPSJyNSI7CiskQz0icjYiOworJEQ9InI3IjsKKyRFPSJyOCI7CiskRj0icjkiOworJEc9InIxMCI7CiskSD0icjExIjsKK0BWPSgkQSwkQiwkQywkRCwkRSwkRiwkRywkSCk7CiskdDI9InIxMiI7CiskS3RibD0icjE0IjsKKworQFNpZ21hMD0oIDIsMTMsMjIpOworQFNpZ21hMT0oIDYsMTEsMjUpOworQHNpZ21hMD0oIDcsMTgsIDMpOworQHNpZ21hMT0oMTcsMTksMTApOworCitzdWIgQk9EWV8wMF8xNSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpID0gQF87CisKKyRjb2RlLj08PF9fXyBpZiAoJGk8MTYpOworCWxkcmIJJFQxLFskaW5wLCMzXQkJCUAgJGkKKwlsZHJiCSR0MixbJGlucCwjMl0KKwlsZHJiCSR0MSxbJGlucCwjMV0KKwlsZHJiCSR0MCxbJGlucF0sIzQKKwlvcnIJJFQxLCRUMSwkdDIsbHNsIzgKKwlvcnIJJFQxLCRUMSwkdDEsbHNsIzE2CisJb3JyCSRUMSwkVDEsJHQwLGxzbCMyNAorCWAic3RyCSRpbnAsW3NwLCMxNyo0XSIJaWYgKCRpPT0xNSlgCitfX18KKyRjb2RlLj08PF9fXzsKKwlsZHIJJHQyLFskS3RibF0sIzQJCQlAICpLMjU2KysKKwlzdHIJJFQxLFtzcCwjYCRpJTE2YCo0XQorCW1vdgkkdDAsJGUscm9yIyRTaWdtYTFbMF0KKwllb3IJJHQwLCR0MCwkZSxyb3IjJFNpZ21hMVsxXQorCWVvcgkkdDAsJHQwLCRlLHJvciMkU2lnbWExWzJdCUAgU2lnbWExKGUpCisJYWRkCSRUMSwkVDEsJHQwCisJZW9yCSR0MSwkZiwkZworCWFuZAkkdDEsJHQxLCRlCisJZW9yCSR0MSwkdDEsJGcJCQlAIENoKGUsZixnKQorCWFkZAkkVDEsJFQxLCR0MQorCWFkZAkkVDEsJFQxLCRoCisJYWRkCSRUMSwkVDEsJHQyCisJbW92CSRoLCRhLHJvciMkU2lnbWEwWzBdCisJZW9yCSRoLCRoLCRhLHJvciMkU2lnbWEwWzFdCisJZW9yCSRoLCRoLCRhLHJvciMkU2lnbWEwWzJdCQlAIFNpZ21hMChhKQorCW9ycgkkdDAsJGEsJGIKKwlhbmQJJHQwLCR0MCwkYworCWFuZAkkdDEsJGEsJGIKKwlvcnIJJHQwLCR0MCwkdDEJCQlAIE1haihhLGIsYykKKwlhZGQJJGgsJGgsJHQwCisJYWRkCSRkLCRkLCRUMQorCWFkZAkkaCwkaCwkVDEKK19fXworfQorCitzdWIgQk9EWV8xNl9YWCB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpID0gQF87CisKKyRjb2RlLj08PF9fXzsKKwlsZHIJJHQxLFtzcCwjYCgkaSsxKSUxNmAqNF0JQCAkaQorCWxkcgkkdDIsW3NwLCNgKCRpKzE0KSUxNmAqNF0KKwlsZHIJJFQxLFtzcCwjYCgkaSswKSUxNmAqNF0KKwlsZHIJJGlucCxbc3AsI2AoJGkrOSklMTZgKjRdCisJbW92CSR0MCwkdDEscm9yIyRzaWdtYTBbMF0KKwllb3IJJHQwLCR0MCwkdDEscm9yIyRzaWdtYTBbMV0KKwllb3IJJHQwLCR0MCwkdDEsbHNyIyRzaWdtYTBbMl0JQCBzaWdtYTAoWFtpKzFdKQorCW1vdgkkdDEsJHQyLHJvciMkc2lnbWExWzBdCisJZW9yCSR0MSwkdDEsJHQyLHJvciMkc2lnbWExWzFdCisJZW9yCSR0MSwkdDEsJHQyLGxzciMkc2lnbWExWzJdCUAgc2lnbWExKFhbaSsxNF0pCisJYWRkCSRUMSwkVDEsJHQwCisJYWRkCSRUMSwkVDEsJHQxCisJYWRkCSRUMSwkVDEsJGlucAorX19fCisJJkJPRFlfMDBfMTUoQF8pOworfQorCiskY29kZT08PF9fXzsKKy50ZXh0CisuY29kZQkzMgorCisudHlwZQlLMjU2LCVvYmplY3QKKy5hbGlnbgk1CitLMjU2OgorLndvcmQJMHg0MjhhMmY5OCwweDcxMzc0NDkxLDB4YjVjMGZiY2YsMHhlOWI1ZGJhNQorLndvcmQJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorLndvcmQJMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMworLndvcmQJMHg3MmJlNWQ3NCwweDgwZGViMWZlLDB4OWJkYzA2YTcsMHhjMTliZjE3NAorLndvcmQJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworLndvcmQJMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYQorLndvcmQJMHg5ODNlNTE1MiwweGE4MzFjNjZkLDB4YjAwMzI3YzgsMHhiZjU5N2ZjNworLndvcmQJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworLndvcmQJMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMworLndvcmQJMHg2NTBhNzM1NCwweDc2NmEwYWJiLDB4ODFjMmM5MmUsMHg5MjcyMmM4NQorLndvcmQJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworLndvcmQJMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MAorLndvcmQJMHgxOWE0YzExNiwweDFlMzc2YzA4LDB4Mjc0ODc3NGMsMHgzNGIwYmNiNQorLndvcmQJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworLndvcmQJMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOAorLndvcmQJMHg5MGJlZmZmYSwweGE0NTA2Y2ViLDB4YmVmOWEzZjcsMHhjNjcxNzhmMgorLnNpemUJSzI1NiwuLUsyNTYKKworLmdsb2JhbAlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIsJWZ1bmN0aW9uCitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKKwlzdWIJcjMscGMsIzgJCUAgc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKwlhZGQJJGxlbiwkaW5wLCRsZW4sbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKwlzdG1kYglzcCEseyRjdHgsJGlucCwkbGVuLHI0LXIxMixscn0KKwlsZG1pYQkkY3R4LHskQSwkQiwkQywkRCwkRSwkRiwkRywkSH0KKwlzdWIJJEt0YmwscjMsIzI1NgkJQCBLMjU2CisJc3ViCXNwLHNwLCMxNio0CQlAIGFsbG9jYShYWzE2XSkKKy5Mb29wOgorX19fCitmb3IoJGk9MDskaTwxNjskaSsrKQl7ICZCT0RZXzAwXzE1KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPSIuTHJvdW5kc18xNl94eDpcbiI7Citmb3IgKDskaTwzMjskaSsrKQl7ICZCT0RZXzE2X1hYKCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPTw8X19fOworCWFuZAkkdDIsJHQyLCMweGZmCisJY21wCSR0MiwjMHhmMgorCWJuZQkuTHJvdW5kc18xNl94eAorCisJbGRyCSRUMSxbc3AsIzE2KjRdCQlAIHB1bGwgY3R4CisJbGRyCSR0MCxbJFQxLCMwXQorCWxkcgkkdDEsWyRUMSwjNF0KKwlsZHIJJHQyLFskVDEsIzhdCisJYWRkCSRBLCRBLCR0MAorCWxkcgkkdDAsWyRUMSwjMTJdCisJYWRkCSRCLCRCLCR0MQorCWxkcgkkdDEsWyRUMSwjMTZdCisJYWRkCSRDLCRDLCR0MgorCWxkcgkkdDIsWyRUMSwjMjBdCisJYWRkCSRELCRELCR0MAorCWxkcgkkdDAsWyRUMSwjMjRdCisJYWRkCSRFLCRFLCR0MQorCWxkcgkkdDEsWyRUMSwjMjhdCisJYWRkCSRGLCRGLCR0MgorCWxkcgkkaW5wLFtzcCwjMTcqNF0JCUAgcHVsbCBpbnAKKwlsZHIJJHQyLFtzcCwjMTgqNF0JCUAgcHVsbCBpbnArbGVuCisJYWRkCSRHLCRHLCR0MAorCWFkZAkkSCwkSCwkdDEKKwlzdG1pYQkkVDEseyRBLCRCLCRDLCRELCRFLCRGLCRHLCRIfQorCWNtcAkkaW5wLCR0MgorCXN1YgkkS3RibCwkS3RibCwjMjU2CUAgcmV3aW5kIEt0YmwKKwlibmUJLkxvb3AKKworCWFkZAlzcCxzcCwjYDE2KzNgKjQJQCBkZXN0cm95IGZyYW1lCisJbGRtaWEJc3AhLHtyNC1yMTIsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCWJ4CWxyCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisuc2l6ZSAgIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyLC4tc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKy5hc2NpeiAgIlNIQTI1NiBibG9jayB0cmFuc2Zvcm0gZm9yIEFSTXY0LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorLmFsaWduCTIKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKKyRjb2RlID1+IHMvXGJieFxzK2xyXGIvLndvcmRcdDB4ZTEyZmZmMWUvZ207CSMgbWFrZSBpdCBwb3NzaWJsZSB0byBjb21waWxlIHdpdGggLW1hcmNoPWFybXY0CitwcmludCAkY29kZTsKK2Nsb3NlIFNURE9VVDsgIyBlbmZvcmNlIGZsdXNoCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGEyNTYtYXJtdjQucyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTI1Ni1hcm12NC5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOWNjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGEyNTYtYXJtdjQucwpAQCAtMCwwICsxLDExMTEgQEAKKy50ZXh0CisuY29kZQkzMgorCisudHlwZQlLMjU2LCVvYmplY3QKKy5hbGlnbgk1CitLMjU2OgorLndvcmQJMHg0MjhhMmY5OCwweDcxMzc0NDkxLDB4YjVjMGZiY2YsMHhlOWI1ZGJhNQorLndvcmQJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorLndvcmQJMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMworLndvcmQJMHg3MmJlNWQ3NCwweDgwZGViMWZlLDB4OWJkYzA2YTcsMHhjMTliZjE3NAorLndvcmQJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworLndvcmQJMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYQorLndvcmQJMHg5ODNlNTE1MiwweGE4MzFjNjZkLDB4YjAwMzI3YzgsMHhiZjU5N2ZjNworLndvcmQJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworLndvcmQJMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMworLndvcmQJMHg2NTBhNzM1NCwweDc2NmEwYWJiLDB4ODFjMmM5MmUsMHg5MjcyMmM4NQorLndvcmQJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworLndvcmQJMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MAorLndvcmQJMHgxOWE0YzExNiwweDFlMzc2YzA4LDB4Mjc0ODc3NGMsMHgzNGIwYmNiNQorLndvcmQJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworLndvcmQJMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOAorLndvcmQJMHg5MGJlZmZmYSwweGE0NTA2Y2ViLDB4YmVmOWEzZjcsMHhjNjcxNzhmMgorLnNpemUJSzI1NiwuLUsyNTYKKworLmdsb2JhbAlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIsJWZ1bmN0aW9uCitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKKwlzdWIJcjMscGMsIzgJCUAgc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKwlhZGQJcjIscjEscjIsbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKwlzdG1kYglzcCEse3IwLHIxLHIyLHI0LXIxMixscn0KKwlsZG1pYQlyMCx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0KKwlzdWIJcjE0LHIzLCMyNTYJCUAgSzI1NgorCXN1YglzcCxzcCwjMTYqNAkJQCBhbGxvY2EoWFsxNl0pCisuTG9vcDoKKwlsZHJiCXIzLFtyMSwjM10JCQlAIDAKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMixbcjEsIzFdCisJbGRyYglyMCxbcjFdLCM0CisJb3JyCXIzLHIzLHIxMixsc2wjOAorCW9ycglyMyxyMyxyMixsc2wjMTYKKwlvcnIJcjMscjMscjAsbHNsIzI0CisJCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzAqNF0KKwltb3YJcjAscjgscm9yIzYKKwllb3IJcjAscjAscjgscm9yIzExCisJZW9yCXIwLHIwLHI4LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyOSxyMTAKKwlhbmQJcjIscjIscjgKKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjExCisJYWRkCXIzLHIzLHIxMgorCW1vdglyMTEscjQscm9yIzIKKwllb3IJcjExLHIxMSxyNCxyb3IjMTMKKwllb3IJcjExLHIxMSxyNCxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHI0LHI1CisJYW5kCXIwLHIwLHI2CisJYW5kCXIyLHI0LHI1CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXIxMSxyMTEscjAKKwlhZGQJcjcscjcscjMKKwlhZGQJcjExLHIxMSxyMworCWxkcmIJcjMsW3IxLCMzXQkJCUAgMQorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIyLFtyMSwjMV0KKwlsZHJiCXIwLFtyMV0sIzQKKwlvcnIJcjMscjMscjEyLGxzbCM4CisJb3JyCXIzLHIzLHIyLGxzbCMxNgorCW9ycglyMyxyMyxyMCxsc2wjMjQKKwkKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJc3RyCXIzLFtzcCwjMSo0XQorCW1vdglyMCxyNyxyb3IjNgorCWVvcglyMCxyMCxyNyxyb3IjMTEKKwllb3IJcjAscjAscjcscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI4LHI5CisJYW5kCXIyLHIyLHI3CisJZW9yCXIyLHIyLHI5CQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjEwCisJYWRkCXIzLHIzLHIxMgorCW1vdglyMTAscjExLHJvciMyCisJZW9yCXIxMCxyMTAscjExLHJvciMxMworCWVvcglyMTAscjEwLHIxMSxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHIxMSxyNAorCWFuZAlyMCxyMCxyNQorCWFuZAlyMixyMTEscjQKKwlvcnIJcjAscjAscjIJCQlAIE1haihhLGIsYykKKwlhZGQJcjEwLHIxMCxyMAorCWFkZAlyNixyNixyMworCWFkZAlyMTAscjEwLHIzCisJbGRyYglyMyxbcjEsIzNdCQkJQCAyCisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjIsW3IxLCMxXQorCWxkcmIJcjAsW3IxXSwjNAorCW9ycglyMyxyMyxyMTIsbHNsIzgKKwlvcnIJcjMscjMscjIsbHNsIzE2CisJb3JyCXIzLHIzLHIwLGxzbCMyNAorCQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMyKjRdCisJbW92CXIwLHI2LHJvciM2CisJZW9yCXIwLHIwLHI2LHJvciMxMQorCWVvcglyMCxyMCxyNixyb3IjMjUJQCBTaWdtYTEoZSkKKwlhZGQJcjMscjMscjAKKwllb3IJcjIscjcscjgKKwlhbmQJcjIscjIscjYKKwllb3IJcjIscjIscjgJCQlAIENoKGUsZixnKQorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyOQorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjkscjEwLHJvciMyCisJZW9yCXI5LHI5LHIxMCxyb3IjMTMKKwllb3IJcjkscjkscjEwLHJvciMyMgkJQCBTaWdtYTAoYSkKKwlvcnIJcjAscjEwLHIxMQorCWFuZAlyMCxyMCxyNAorCWFuZAlyMixyMTAscjExCisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXI5LHI5LHIwCisJYWRkCXI1LHI1LHIzCisJYWRkCXI5LHI5LHIzCisJbGRyYglyMyxbcjEsIzNdCQkJQCAzCisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjIsW3IxLCMxXQorCWxkcmIJcjAsW3IxXSwjNAorCW9ycglyMyxyMyxyMTIsbHNsIzgKKwlvcnIJcjMscjMscjIsbHNsIzE2CisJb3JyCXIzLHIzLHIwLGxzbCMyNAorCQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMzKjRdCisJbW92CXIwLHI1LHJvciM2CisJZW9yCXIwLHIwLHI1LHJvciMxMQorCWVvcglyMCxyMCxyNSxyb3IjMjUJQCBTaWdtYTEoZSkKKwlhZGQJcjMscjMscjAKKwllb3IJcjIscjYscjcKKwlhbmQJcjIscjIscjUKKwllb3IJcjIscjIscjcJCQlAIENoKGUsZixnKQorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyOAorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjgscjkscm9yIzIKKwllb3IJcjgscjgscjkscm9yIzEzCisJZW9yCXI4LHI4LHI5LHJvciMyMgkJQCBTaWdtYTAoYSkKKwlvcnIJcjAscjkscjEwCisJYW5kCXIwLHIwLHIxMQorCWFuZAlyMixyOSxyMTAKKwlvcnIJcjAscjAscjIJCQlAIE1haihhLGIsYykKKwlhZGQJcjgscjgscjAKKwlhZGQJcjQscjQscjMKKwlhZGQJcjgscjgscjMKKwlsZHJiCXIzLFtyMSwjM10JCQlAIDQKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMixbcjEsIzFdCisJbGRyYglyMCxbcjFdLCM0CisJb3JyCXIzLHIzLHIxMixsc2wjOAorCW9ycglyMyxyMyxyMixsc2wjMTYKKwlvcnIJcjMscjMscjAsbHNsIzI0CisJCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzQqNF0KKwltb3YJcjAscjQscm9yIzYKKwllb3IJcjAscjAscjQscm9yIzExCisJZW9yCXIwLHIwLHI0LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyNSxyNgorCWFuZAlyMixyMixyNAorCWVvcglyMixyMixyNgkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI3CisJYWRkCXIzLHIzLHIxMgorCW1vdglyNyxyOCxyb3IjMgorCWVvcglyNyxyNyxyOCxyb3IjMTMKKwllb3IJcjcscjcscjgscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyOCxyOQorCWFuZAlyMCxyMCxyMTAKKwlhbmQJcjIscjgscjkKKwlvcnIJcjAscjAscjIJCQlAIE1haihhLGIsYykKKwlhZGQJcjcscjcscjAKKwlhZGQJcjExLHIxMSxyMworCWFkZAlyNyxyNyxyMworCWxkcmIJcjMsW3IxLCMzXQkJCUAgNQorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIyLFtyMSwjMV0KKwlsZHJiCXIwLFtyMV0sIzQKKwlvcnIJcjMscjMscjEyLGxzbCM4CisJb3JyCXIzLHIzLHIyLGxzbCMxNgorCW9ycglyMyxyMyxyMCxsc2wjMjQKKwkKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJc3RyCXIzLFtzcCwjNSo0XQorCW1vdglyMCxyMTEscm9yIzYKKwllb3IJcjAscjAscjExLHJvciMxMQorCWVvcglyMCxyMCxyMTEscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI0LHI1CisJYW5kCXIyLHIyLHIxMQorCWVvcglyMixyMixyNQkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI2CisJYWRkCXIzLHIzLHIxMgorCW1vdglyNixyNyxyb3IjMgorCWVvcglyNixyNixyNyxyb3IjMTMKKwllb3IJcjYscjYscjcscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyNyxyOAorCWFuZAlyMCxyMCxyOQorCWFuZAlyMixyNyxyOAorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNixyNixyMAorCWFkZAlyMTAscjEwLHIzCisJYWRkCXI2LHI2LHIzCisJbGRyYglyMyxbcjEsIzNdCQkJQCA2CisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjIsW3IxLCMxXQorCWxkcmIJcjAsW3IxXSwjNAorCW9ycglyMyxyMyxyMTIsbHNsIzgKKwlvcnIJcjMscjMscjIsbHNsIzE2CisJb3JyCXIzLHIzLHIwLGxzbCMyNAorCQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCM2KjRdCisJbW92CXIwLHIxMCxyb3IjNgorCWVvcglyMCxyMCxyMTAscm9yIzExCisJZW9yCXIwLHIwLHIxMCxyb3IjMjUJQCBTaWdtYTEoZSkKKwlhZGQJcjMscjMscjAKKwllb3IJcjIscjExLHI0CisJYW5kCXIyLHIyLHIxMAorCWVvcglyMixyMixyNAkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI1CisJYWRkCXIzLHIzLHIxMgorCW1vdglyNSxyNixyb3IjMgorCWVvcglyNSxyNSxyNixyb3IjMTMKKwllb3IJcjUscjUscjYscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyNixyNworCWFuZAlyMCxyMCxyOAorCWFuZAlyMixyNixyNworCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMAorCWFkZAlyOSxyOSxyMworCWFkZAlyNSxyNSxyMworCWxkcmIJcjMsW3IxLCMzXQkJCUAgNworCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIyLFtyMSwjMV0KKwlsZHJiCXIwLFtyMV0sIzQKKwlvcnIJcjMscjMscjEyLGxzbCM4CisJb3JyCXIzLHIzLHIyLGxzbCMxNgorCW9ycglyMyxyMyxyMCxsc2wjMjQKKwkKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJc3RyCXIzLFtzcCwjNyo0XQorCW1vdglyMCxyOSxyb3IjNgorCWVvcglyMCxyMCxyOSxyb3IjMTEKKwllb3IJcjAscjAscjkscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHIxMCxyMTEKKwlhbmQJcjIscjIscjkKKwllb3IJcjIscjIscjExCQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjQKKwlhZGQJcjMscjMscjEyCisJbW92CXI0LHI1LHJvciMyCisJZW9yCXI0LHI0LHI1LHJvciMxMworCWVvcglyNCxyNCxyNSxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHI1LHI2CisJYW5kCXIwLHIwLHI3CisJYW5kCXIyLHI1LHI2CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXI0LHI0LHIwCisJYWRkCXI4LHI4LHIzCisJYWRkCXI0LHI0LHIzCisJbGRyYglyMyxbcjEsIzNdCQkJQCA4CisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjIsW3IxLCMxXQorCWxkcmIJcjAsW3IxXSwjNAorCW9ycglyMyxyMyxyMTIsbHNsIzgKKwlvcnIJcjMscjMscjIsbHNsIzE2CisJb3JyCXIzLHIzLHIwLGxzbCMyNAorCQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCM4KjRdCisJbW92CXIwLHI4LHJvciM2CisJZW9yCXIwLHIwLHI4LHJvciMxMQorCWVvcglyMCxyMCxyOCxyb3IjMjUJQCBTaWdtYTEoZSkKKwlhZGQJcjMscjMscjAKKwllb3IJcjIscjkscjEwCisJYW5kCXIyLHIyLHI4CisJZW9yCXIyLHIyLHIxMAkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxMQorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjExLHI0LHJvciMyCisJZW9yCXIxMSxyMTEscjQscm9yIzEzCisJZW9yCXIxMSxyMTEscjQscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyNCxyNQorCWFuZAlyMCxyMCxyNgorCWFuZAlyMixyNCxyNQorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwCisJYWRkCXI3LHI3LHIzCisJYWRkCXIxMSxyMTEscjMKKwlsZHJiCXIzLFtyMSwjM10JCQlAIDkKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMixbcjEsIzFdCisJbGRyYglyMCxbcjFdLCM0CisJb3JyCXIzLHIzLHIxMixsc2wjOAorCW9ycglyMyxyMyxyMixsc2wjMTYKKwlvcnIJcjMscjMscjAsbHNsIzI0CisJCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzkqNF0KKwltb3YJcjAscjcscm9yIzYKKwllb3IJcjAscjAscjcscm9yIzExCisJZW9yCXIwLHIwLHI3LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyOCxyOQorCWFuZAlyMixyMixyNworCWVvcglyMixyMixyOQkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxMAorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjEwLHIxMSxyb3IjMgorCWVvcglyMTAscjEwLHIxMSxyb3IjMTMKKwllb3IJcjEwLHIxMCxyMTEscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyMTEscjQKKwlhbmQJcjAscjAscjUKKwlhbmQJcjIscjExLHI0CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXIxMCxyMTAscjAKKwlhZGQJcjYscjYscjMKKwlhZGQJcjEwLHIxMCxyMworCWxkcmIJcjMsW3IxLCMzXQkJCUAgMTAKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMixbcjEsIzFdCisJbGRyYglyMCxbcjFdLCM0CisJb3JyCXIzLHIzLHIxMixsc2wjOAorCW9ycglyMyxyMyxyMixsc2wjMTYKKwlvcnIJcjMscjMscjAsbHNsIzI0CisJCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzEwKjRdCisJbW92CXIwLHI2LHJvciM2CisJZW9yCXIwLHIwLHI2LHJvciMxMQorCWVvcglyMCxyMCxyNixyb3IjMjUJQCBTaWdtYTEoZSkKKwlhZGQJcjMscjMscjAKKwllb3IJcjIscjcscjgKKwlhbmQJcjIscjIscjYKKwllb3IJcjIscjIscjgJCQlAIENoKGUsZixnKQorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyOQorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjkscjEwLHJvciMyCisJZW9yCXI5LHI5LHIxMCxyb3IjMTMKKwllb3IJcjkscjkscjEwLHJvciMyMgkJQCBTaWdtYTAoYSkKKwlvcnIJcjAscjEwLHIxMQorCWFuZAlyMCxyMCxyNAorCWFuZAlyMixyMTAscjExCisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXI5LHI5LHIwCisJYWRkCXI1LHI1LHIzCisJYWRkCXI5LHI5LHIzCisJbGRyYglyMyxbcjEsIzNdCQkJQCAxMQorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIyLFtyMSwjMV0KKwlsZHJiCXIwLFtyMV0sIzQKKwlvcnIJcjMscjMscjEyLGxzbCM4CisJb3JyCXIzLHIzLHIyLGxzbCMxNgorCW9ycglyMyxyMyxyMCxsc2wjMjQKKwkKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJc3RyCXIzLFtzcCwjMTEqNF0KKwltb3YJcjAscjUscm9yIzYKKwllb3IJcjAscjAscjUscm9yIzExCisJZW9yCXIwLHIwLHI1LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyNixyNworCWFuZAlyMixyMixyNQorCWVvcglyMixyMixyNwkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI4CisJYWRkCXIzLHIzLHIxMgorCW1vdglyOCxyOSxyb3IjMgorCWVvcglyOCxyOCxyOSxyb3IjMTMKKwllb3IJcjgscjgscjkscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyOSxyMTAKKwlhbmQJcjAscjAscjExCisJYW5kCXIyLHI5LHIxMAorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyOCxyOCxyMAorCWFkZAlyNCxyNCxyMworCWFkZAlyOCxyOCxyMworCWxkcmIJcjMsW3IxLCMzXQkJCUAgMTIKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMixbcjEsIzFdCisJbGRyYglyMCxbcjFdLCM0CisJb3JyCXIzLHIzLHIxMixsc2wjOAorCW9ycglyMyxyMyxyMixsc2wjMTYKKwlvcnIJcjMscjMscjAsbHNsIzI0CisJCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzEyKjRdCisJbW92CXIwLHI0LHJvciM2CisJZW9yCXIwLHIwLHI0LHJvciMxMQorCWVvcglyMCxyMCxyNCxyb3IjMjUJQCBTaWdtYTEoZSkKKwlhZGQJcjMscjMscjAKKwllb3IJcjIscjUscjYKKwlhbmQJcjIscjIscjQKKwllb3IJcjIscjIscjYJCQlAIENoKGUsZixnKQorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyNworCWFkZAlyMyxyMyxyMTIKKwltb3YJcjcscjgscm9yIzIKKwllb3IJcjcscjcscjgscm9yIzEzCisJZW9yCXI3LHI3LHI4LHJvciMyMgkJQCBTaWdtYTAoYSkKKwlvcnIJcjAscjgscjkKKwlhbmQJcjAscjAscjEwCisJYW5kCXIyLHI4LHI5CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwCisJYWRkCXIxMSxyMTEscjMKKwlhZGQJcjcscjcscjMKKwlsZHJiCXIzLFtyMSwjM10JCQlAIDEzCisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjIsW3IxLCMxXQorCWxkcmIJcjAsW3IxXSwjNAorCW9ycglyMyxyMyxyMTIsbHNsIzgKKwlvcnIJcjMscjMscjIsbHNsIzE2CisJb3JyCXIzLHIzLHIwLGxzbCMyNAorCQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMxMyo0XQorCW1vdglyMCxyMTEscm9yIzYKKwllb3IJcjAscjAscjExLHJvciMxMQorCWVvcglyMCxyMCxyMTEscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI0LHI1CisJYW5kCXIyLHIyLHIxMQorCWVvcglyMixyMixyNQkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI2CisJYWRkCXIzLHIzLHIxMgorCW1vdglyNixyNyxyb3IjMgorCWVvcglyNixyNixyNyxyb3IjMTMKKwllb3IJcjYscjYscjcscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyNyxyOAorCWFuZAlyMCxyMCxyOQorCWFuZAlyMixyNyxyOAorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNixyNixyMAorCWFkZAlyMTAscjEwLHIzCisJYWRkCXI2LHI2LHIzCisJbGRyYglyMyxbcjEsIzNdCQkJQCAxNAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIyLFtyMSwjMV0KKwlsZHJiCXIwLFtyMV0sIzQKKwlvcnIJcjMscjMscjEyLGxzbCM4CisJb3JyCXIzLHIzLHIyLGxzbCMxNgorCW9ycglyMyxyMyxyMCxsc2wjMjQKKwkKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJc3RyCXIzLFtzcCwjMTQqNF0KKwltb3YJcjAscjEwLHJvciM2CisJZW9yCXIwLHIwLHIxMCxyb3IjMTEKKwllb3IJcjAscjAscjEwLHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyMTEscjQKKwlhbmQJcjIscjIscjEwCisJZW9yCXIyLHIyLHI0CQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjUKKwlhZGQJcjMscjMscjEyCisJbW92CXI1LHI2LHJvciMyCisJZW9yCXI1LHI1LHI2LHJvciMxMworCWVvcglyNSxyNSxyNixyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHI2LHI3CisJYW5kCXIwLHIwLHI4CisJYW5kCXIyLHI2LHI3CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXI1LHI1LHIwCisJYWRkCXI5LHI5LHIzCisJYWRkCXI1LHI1LHIzCisJbGRyYglyMyxbcjEsIzNdCQkJQCAxNQorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIyLFtyMSwjMV0KKwlsZHJiCXIwLFtyMV0sIzQKKwlvcnIJcjMscjMscjEyLGxzbCM4CisJb3JyCXIzLHIzLHIyLGxzbCMxNgorCW9ycglyMyxyMyxyMCxsc2wjMjQKKwlzdHIJcjEsW3NwLCMxNyo0XQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMxNSo0XQorCW1vdglyMCxyOSxyb3IjNgorCWVvcglyMCxyMCxyOSxyb3IjMTEKKwllb3IJcjAscjAscjkscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHIxMCxyMTEKKwlhbmQJcjIscjIscjkKKwllb3IJcjIscjIscjExCQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjQKKwlhZGQJcjMscjMscjEyCisJbW92CXI0LHI1LHJvciMyCisJZW9yCXI0LHI0LHI1LHJvciMxMworCWVvcglyNCxyNCxyNSxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHI1LHI2CisJYW5kCXIwLHIwLHI3CisJYW5kCXIyLHI1LHI2CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXI0LHI0LHIwCisJYWRkCXI4LHI4LHIzCisJYWRkCXI0LHI0LHIzCisuTHJvdW5kc18xNl94eDoKKwlsZHIJcjIsW3NwLCMxKjRdCUAgMTYKKwlsZHIJcjEyLFtzcCwjMTQqNF0KKwlsZHIJcjMsW3NwLCMwKjRdCisJbGRyCXIxLFtzcCwjOSo0XQorCW1vdglyMCxyMixyb3IjNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCW1vdglyMixyMTIscm9yIzE3CisJZW9yCXIyLHIyLHIxMixyb3IjMTkKKwllb3IJcjIscjIscjEyLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWFkZAlyMyxyMyxyMAorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyMQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMwKjRdCisJbW92CXIwLHI4LHJvciM2CisJZW9yCXIwLHIwLHI4LHJvciMxMQorCWVvcglyMCxyMCxyOCxyb3IjMjUJQCBTaWdtYTEoZSkKKwlhZGQJcjMscjMscjAKKwllb3IJcjIscjkscjEwCisJYW5kCXIyLHIyLHI4CisJZW9yCXIyLHIyLHIxMAkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxMQorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjExLHI0LHJvciMyCisJZW9yCXIxMSxyMTEscjQscm9yIzEzCisJZW9yCXIxMSxyMTEscjQscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyNCxyNQorCWFuZAlyMCxyMCxyNgorCWFuZAlyMixyNCxyNQorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwCisJYWRkCXI3LHI3LHIzCisJYWRkCXIxMSxyMTEscjMKKwlsZHIJcjIsW3NwLCMyKjRdCUAgMTcKKwlsZHIJcjEyLFtzcCwjMTUqNF0KKwlsZHIJcjMsW3NwLCMxKjRdCisJbGRyCXIxLFtzcCwjMTAqNF0KKwltb3YJcjAscjIscm9yIzcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwltb3YJcjIscjEyLHJvciMxNworCWVvcglyMixyMixyMTIscm9yIzE5CisJZW9yCXIyLHIyLHIxMixsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJcjMscjMscjAKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjEKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJc3RyCXIzLFtzcCwjMSo0XQorCW1vdglyMCxyNyxyb3IjNgorCWVvcglyMCxyMCxyNyxyb3IjMTEKKwllb3IJcjAscjAscjcscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI4LHI5CisJYW5kCXIyLHIyLHI3CisJZW9yCXIyLHIyLHI5CQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjEwCisJYWRkCXIzLHIzLHIxMgorCW1vdglyMTAscjExLHJvciMyCisJZW9yCXIxMCxyMTAscjExLHJvciMxMworCWVvcglyMTAscjEwLHIxMSxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHIxMSxyNAorCWFuZAlyMCxyMCxyNQorCWFuZAlyMixyMTEscjQKKwlvcnIJcjAscjAscjIJCQlAIE1haihhLGIsYykKKwlhZGQJcjEwLHIxMCxyMAorCWFkZAlyNixyNixyMworCWFkZAlyMTAscjEwLHIzCisJbGRyCXIyLFtzcCwjMyo0XQlAIDE4CisJbGRyCXIxMixbc3AsIzAqNF0KKwlsZHIJcjMsW3NwLCMyKjRdCisJbGRyCXIxLFtzcCwjMTEqNF0KKwltb3YJcjAscjIscm9yIzcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwltb3YJcjIscjEyLHJvciMxNworCWVvcglyMixyMixyMTIscm9yIzE5CisJZW9yCXIyLHIyLHIxMixsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJcjMscjMscjAKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjEKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJc3RyCXIzLFtzcCwjMio0XQorCW1vdglyMCxyNixyb3IjNgorCWVvcglyMCxyMCxyNixyb3IjMTEKKwllb3IJcjAscjAscjYscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI3LHI4CisJYW5kCXIyLHIyLHI2CisJZW9yCXIyLHIyLHI4CQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjkKKwlhZGQJcjMscjMscjEyCisJbW92CXI5LHIxMCxyb3IjMgorCWVvcglyOSxyOSxyMTAscm9yIzEzCisJZW9yCXI5LHI5LHIxMCxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHIxMCxyMTEKKwlhbmQJcjAscjAscjQKKwlhbmQJcjIscjEwLHIxMQorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyOSxyOSxyMAorCWFkZAlyNSxyNSxyMworCWFkZAlyOSxyOSxyMworCWxkcglyMixbc3AsIzQqNF0JQCAxOQorCWxkcglyMTIsW3NwLCMxKjRdCisJbGRyCXIzLFtzcCwjMyo0XQorCWxkcglyMSxbc3AsIzEyKjRdCisJbW92CXIwLHIyLHJvciM3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbW92CXIyLHIxMixyb3IjMTcKKwllb3IJcjIscjIscjEyLHJvciMxOQorCWVvcglyMixyMixyMTIsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJYWRkCXIzLHIzLHIwCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzMqNF0KKwltb3YJcjAscjUscm9yIzYKKwllb3IJcjAscjAscjUscm9yIzExCisJZW9yCXIwLHIwLHI1LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyNixyNworCWFuZAlyMixyMixyNQorCWVvcglyMixyMixyNwkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI4CisJYWRkCXIzLHIzLHIxMgorCW1vdglyOCxyOSxyb3IjMgorCWVvcglyOCxyOCxyOSxyb3IjMTMKKwllb3IJcjgscjgscjkscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyOSxyMTAKKwlhbmQJcjAscjAscjExCisJYW5kCXIyLHI5LHIxMAorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyOCxyOCxyMAorCWFkZAlyNCxyNCxyMworCWFkZAlyOCxyOCxyMworCWxkcglyMixbc3AsIzUqNF0JQCAyMAorCWxkcglyMTIsW3NwLCMyKjRdCisJbGRyCXIzLFtzcCwjNCo0XQorCWxkcglyMSxbc3AsIzEzKjRdCisJbW92CXIwLHIyLHJvciM3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbW92CXIyLHIxMixyb3IjMTcKKwllb3IJcjIscjIscjEyLHJvciMxOQorCWVvcglyMixyMixyMTIsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJYWRkCXIzLHIzLHIwCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzQqNF0KKwltb3YJcjAscjQscm9yIzYKKwllb3IJcjAscjAscjQscm9yIzExCisJZW9yCXIwLHIwLHI0LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyNSxyNgorCWFuZAlyMixyMixyNAorCWVvcglyMixyMixyNgkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI3CisJYWRkCXIzLHIzLHIxMgorCW1vdglyNyxyOCxyb3IjMgorCWVvcglyNyxyNyxyOCxyb3IjMTMKKwllb3IJcjcscjcscjgscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyOCxyOQorCWFuZAlyMCxyMCxyMTAKKwlhbmQJcjIscjgscjkKKwlvcnIJcjAscjAscjIJCQlAIE1haihhLGIsYykKKwlhZGQJcjcscjcscjAKKwlhZGQJcjExLHIxMSxyMworCWFkZAlyNyxyNyxyMworCWxkcglyMixbc3AsIzYqNF0JQCAyMQorCWxkcglyMTIsW3NwLCMzKjRdCisJbGRyCXIzLFtzcCwjNSo0XQorCWxkcglyMSxbc3AsIzE0KjRdCisJbW92CXIwLHIyLHJvciM3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbW92CXIyLHIxMixyb3IjMTcKKwllb3IJcjIscjIscjEyLHJvciMxOQorCWVvcglyMixyMixyMTIsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJYWRkCXIzLHIzLHIwCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzUqNF0KKwltb3YJcjAscjExLHJvciM2CisJZW9yCXIwLHIwLHIxMSxyb3IjMTEKKwllb3IJcjAscjAscjExLHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyNCxyNQorCWFuZAlyMixyMixyMTEKKwllb3IJcjIscjIscjUJCQlAIENoKGUsZixnKQorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyNgorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjYscjcscm9yIzIKKwllb3IJcjYscjYscjcscm9yIzEzCisJZW9yCXI2LHI2LHI3LHJvciMyMgkJQCBTaWdtYTAoYSkKKwlvcnIJcjAscjcscjgKKwlhbmQJcjAscjAscjkKKwlhbmQJcjIscjcscjgKKwlvcnIJcjAscjAscjIJCQlAIE1haihhLGIsYykKKwlhZGQJcjYscjYscjAKKwlhZGQJcjEwLHIxMCxyMworCWFkZAlyNixyNixyMworCWxkcglyMixbc3AsIzcqNF0JQCAyMgorCWxkcglyMTIsW3NwLCM0KjRdCisJbGRyCXIzLFtzcCwjNio0XQorCWxkcglyMSxbc3AsIzE1KjRdCisJbW92CXIwLHIyLHJvciM3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbW92CXIyLHIxMixyb3IjMTcKKwllb3IJcjIscjIscjEyLHJvciMxOQorCWVvcglyMixyMixyMTIsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJYWRkCXIzLHIzLHIwCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzYqNF0KKwltb3YJcjAscjEwLHJvciM2CisJZW9yCXIwLHIwLHIxMCxyb3IjMTEKKwllb3IJcjAscjAscjEwLHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyMTEscjQKKwlhbmQJcjIscjIscjEwCisJZW9yCXIyLHIyLHI0CQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjUKKwlhZGQJcjMscjMscjEyCisJbW92CXI1LHI2LHJvciMyCisJZW9yCXI1LHI1LHI2LHJvciMxMworCWVvcglyNSxyNSxyNixyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHI2LHI3CisJYW5kCXIwLHIwLHI4CisJYW5kCXIyLHI2LHI3CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXI1LHI1LHIwCisJYWRkCXI5LHI5LHIzCisJYWRkCXI1LHI1LHIzCisJbGRyCXIyLFtzcCwjOCo0XQlAIDIzCisJbGRyCXIxMixbc3AsIzUqNF0KKwlsZHIJcjMsW3NwLCM3KjRdCisJbGRyCXIxLFtzcCwjMCo0XQorCW1vdglyMCxyMixyb3IjNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCW1vdglyMixyMTIscm9yIzE3CisJZW9yCXIyLHIyLHIxMixyb3IjMTkKKwllb3IJcjIscjIscjEyLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWFkZAlyMyxyMyxyMAorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyMQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCM3KjRdCisJbW92CXIwLHI5LHJvciM2CisJZW9yCXIwLHIwLHI5LHJvciMxMQorCWVvcglyMCxyMCxyOSxyb3IjMjUJQCBTaWdtYTEoZSkKKwlhZGQJcjMscjMscjAKKwllb3IJcjIscjEwLHIxMQorCWFuZAlyMixyMixyOQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyNAorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjQscjUscm9yIzIKKwllb3IJcjQscjQscjUscm9yIzEzCisJZW9yCXI0LHI0LHI1LHJvciMyMgkJQCBTaWdtYTAoYSkKKwlvcnIJcjAscjUscjYKKwlhbmQJcjAscjAscjcKKwlhbmQJcjIscjUscjYKKwlvcnIJcjAscjAscjIJCQlAIE1haihhLGIsYykKKwlhZGQJcjQscjQscjAKKwlhZGQJcjgscjgscjMKKwlhZGQJcjQscjQscjMKKwlsZHIJcjIsW3NwLCM5KjRdCUAgMjQKKwlsZHIJcjEyLFtzcCwjNio0XQorCWxkcglyMyxbc3AsIzgqNF0KKwlsZHIJcjEsW3NwLCMxKjRdCisJbW92CXIwLHIyLHJvciM3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbW92CXIyLHIxMixyb3IjMTcKKwllb3IJcjIscjIscjEyLHJvciMxOQorCWVvcglyMixyMixyMTIsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJYWRkCXIzLHIzLHIwCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzgqNF0KKwltb3YJcjAscjgscm9yIzYKKwllb3IJcjAscjAscjgscm9yIzExCisJZW9yCXIwLHIwLHI4LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyOSxyMTAKKwlhbmQJcjIscjIscjgKKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjExCisJYWRkCXIzLHIzLHIxMgorCW1vdglyMTEscjQscm9yIzIKKwllb3IJcjExLHIxMSxyNCxyb3IjMTMKKwllb3IJcjExLHIxMSxyNCxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHI0LHI1CisJYW5kCXIwLHIwLHI2CisJYW5kCXIyLHI0LHI1CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXIxMSxyMTEscjAKKwlhZGQJcjcscjcscjMKKwlhZGQJcjExLHIxMSxyMworCWxkcglyMixbc3AsIzEwKjRdCUAgMjUKKwlsZHIJcjEyLFtzcCwjNyo0XQorCWxkcglyMyxbc3AsIzkqNF0KKwlsZHIJcjEsW3NwLCMyKjRdCisJbW92CXIwLHIyLHJvciM3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbW92CXIyLHIxMixyb3IjMTcKKwllb3IJcjIscjIscjEyLHJvciMxOQorCWVvcglyMixyMixyMTIsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJYWRkCXIzLHIzLHIwCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCXN0cglyMyxbc3AsIzkqNF0KKwltb3YJcjAscjcscm9yIzYKKwllb3IJcjAscjAscjcscm9yIzExCisJZW9yCXIwLHIwLHI3LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyOCxyOQorCWFuZAlyMixyMixyNworCWVvcglyMixyMixyOQkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHIxMAorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjEwLHIxMSxyb3IjMgorCWVvcglyMTAscjEwLHIxMSxyb3IjMTMKKwllb3IJcjEwLHIxMCxyMTEscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyMTEscjQKKwlhbmQJcjAscjAscjUKKwlhbmQJcjIscjExLHI0CisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXIxMCxyMTAscjAKKwlhZGQJcjYscjYscjMKKwlhZGQJcjEwLHIxMCxyMworCWxkcglyMixbc3AsIzExKjRdCUAgMjYKKwlsZHIJcjEyLFtzcCwjOCo0XQorCWxkcglyMyxbc3AsIzEwKjRdCisJbGRyCXIxLFtzcCwjMyo0XQorCW1vdglyMCxyMixyb3IjNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCW1vdglyMixyMTIscm9yIzE3CisJZW9yCXIyLHIyLHIxMixyb3IjMTkKKwllb3IJcjIscjIscjEyLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWFkZAlyMyxyMyxyMAorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyMQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMxMCo0XQorCW1vdglyMCxyNixyb3IjNgorCWVvcglyMCxyMCxyNixyb3IjMTEKKwllb3IJcjAscjAscjYscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI3LHI4CisJYW5kCXIyLHIyLHI2CisJZW9yCXIyLHIyLHI4CQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjkKKwlhZGQJcjMscjMscjEyCisJbW92CXI5LHIxMCxyb3IjMgorCWVvcglyOSxyOSxyMTAscm9yIzEzCisJZW9yCXI5LHI5LHIxMCxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHIxMCxyMTEKKwlhbmQJcjAscjAscjQKKwlhbmQJcjIscjEwLHIxMQorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyOSxyOSxyMAorCWFkZAlyNSxyNSxyMworCWFkZAlyOSxyOSxyMworCWxkcglyMixbc3AsIzEyKjRdCUAgMjcKKwlsZHIJcjEyLFtzcCwjOSo0XQorCWxkcglyMyxbc3AsIzExKjRdCisJbGRyCXIxLFtzcCwjNCo0XQorCW1vdglyMCxyMixyb3IjNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCW1vdglyMixyMTIscm9yIzE3CisJZW9yCXIyLHIyLHIxMixyb3IjMTkKKwllb3IJcjIscjIscjEyLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWFkZAlyMyxyMyxyMAorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyMQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMxMSo0XQorCW1vdglyMCxyNSxyb3IjNgorCWVvcglyMCxyMCxyNSxyb3IjMTEKKwllb3IJcjAscjAscjUscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI2LHI3CisJYW5kCXIyLHIyLHI1CisJZW9yCXIyLHIyLHI3CQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjgKKwlhZGQJcjMscjMscjEyCisJbW92CXI4LHI5LHJvciMyCisJZW9yCXI4LHI4LHI5LHJvciMxMworCWVvcglyOCxyOCxyOSxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHI5LHIxMAorCWFuZAlyMCxyMCxyMTEKKwlhbmQJcjIscjkscjEwCisJb3JyCXIwLHIwLHIyCQkJQCBNYWooYSxiLGMpCisJYWRkCXI4LHI4LHIwCisJYWRkCXI0LHI0LHIzCisJYWRkCXI4LHI4LHIzCisJbGRyCXIyLFtzcCwjMTMqNF0JQCAyOAorCWxkcglyMTIsW3NwLCMxMCo0XQorCWxkcglyMyxbc3AsIzEyKjRdCisJbGRyCXIxLFtzcCwjNSo0XQorCW1vdglyMCxyMixyb3IjNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCW1vdglyMixyMTIscm9yIzE3CisJZW9yCXIyLHIyLHIxMixyb3IjMTkKKwllb3IJcjIscjIscjEyLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWFkZAlyMyxyMyxyMAorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyMQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMxMio0XQorCW1vdglyMCxyNCxyb3IjNgorCWVvcglyMCxyMCxyNCxyb3IjMTEKKwllb3IJcjAscjAscjQscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI1LHI2CisJYW5kCXIyLHIyLHI0CisJZW9yCXIyLHIyLHI2CQkJQCBDaChlLGYsZykKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjcKKwlhZGQJcjMscjMscjEyCisJbW92CXI3LHI4LHJvciMyCisJZW9yCXI3LHI3LHI4LHJvciMxMworCWVvcglyNyxyNyxyOCxyb3IjMjIJCUAgU2lnbWEwKGEpCisJb3JyCXIwLHI4LHI5CisJYW5kCXIwLHIwLHIxMAorCWFuZAlyMixyOCxyOQorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNyxyNyxyMAorCWFkZAlyMTEscjExLHIzCisJYWRkCXI3LHI3LHIzCisJbGRyCXIyLFtzcCwjMTQqNF0JQCAyOQorCWxkcglyMTIsW3NwLCMxMSo0XQorCWxkcglyMyxbc3AsIzEzKjRdCisJbGRyCXIxLFtzcCwjNio0XQorCW1vdglyMCxyMixyb3IjNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCW1vdglyMixyMTIscm9yIzE3CisJZW9yCXIyLHIyLHIxMixyb3IjMTkKKwllb3IJcjIscjIscjEyLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWFkZAlyMyxyMyxyMAorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyMQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMxMyo0XQorCW1vdglyMCxyMTEscm9yIzYKKwllb3IJcjAscjAscjExLHJvciMxMQorCWVvcglyMCxyMCxyMTEscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHI0LHI1CisJYW5kCXIyLHIyLHIxMQorCWVvcglyMixyMixyNQkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI2CisJYWRkCXIzLHIzLHIxMgorCW1vdglyNixyNyxyb3IjMgorCWVvcglyNixyNixyNyxyb3IjMTMKKwllb3IJcjYscjYscjcscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyNyxyOAorCWFuZAlyMCxyMCxyOQorCWFuZAlyMixyNyxyOAorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNixyNixyMAorCWFkZAlyMTAscjEwLHIzCisJYWRkCXI2LHI2LHIzCisJbGRyCXIyLFtzcCwjMTUqNF0JQCAzMAorCWxkcglyMTIsW3NwLCMxMio0XQorCWxkcglyMyxbc3AsIzE0KjRdCisJbGRyCXIxLFtzcCwjNyo0XQorCW1vdglyMCxyMixyb3IjNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCW1vdglyMixyMTIscm9yIzE3CisJZW9yCXIyLHIyLHIxMixyb3IjMTkKKwllb3IJcjIscjIscjEyLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWFkZAlyMyxyMyxyMAorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyMQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlzdHIJcjMsW3NwLCMxNCo0XQorCW1vdglyMCxyMTAscm9yIzYKKwllb3IJcjAscjAscjEwLHJvciMxMQorCWVvcglyMCxyMCxyMTAscm9yIzI1CUAgU2lnbWExKGUpCisJYWRkCXIzLHIzLHIwCisJZW9yCXIyLHIxMSxyNAorCWFuZAlyMixyMixyMTAKKwllb3IJcjIscjIscjQJCQlAIENoKGUsZixnKQorCWFkZAlyMyxyMyxyMgorCWFkZAlyMyxyMyxyNQorCWFkZAlyMyxyMyxyMTIKKwltb3YJcjUscjYscm9yIzIKKwllb3IJcjUscjUscjYscm9yIzEzCisJZW9yCXI1LHI1LHI2LHJvciMyMgkJQCBTaWdtYTAoYSkKKwlvcnIJcjAscjYscjcKKwlhbmQJcjAscjAscjgKKwlhbmQJcjIscjYscjcKKwlvcnIJcjAscjAscjIJCQlAIE1haihhLGIsYykKKwlhZGQJcjUscjUscjAKKwlhZGQJcjkscjkscjMKKwlhZGQJcjUscjUscjMKKwlsZHIJcjIsW3NwLCMwKjRdCUAgMzEKKwlsZHIJcjEyLFtzcCwjMTMqNF0KKwlsZHIJcjMsW3NwLCMxNSo0XQorCWxkcglyMSxbc3AsIzgqNF0KKwltb3YJcjAscjIscm9yIzcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwltb3YJcjIscjEyLHJvciMxNworCWVvcglyMixyMixyMTIscm9yIzE5CisJZW9yCXIyLHIyLHIxMixsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlhZGQJcjMscjMscjAKKwlhZGQJcjMscjMscjIKKwlhZGQJcjMscjMscjEKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJc3RyCXIzLFtzcCwjMTUqNF0KKwltb3YJcjAscjkscm9yIzYKKwllb3IJcjAscjAscjkscm9yIzExCisJZW9yCXIwLHIwLHI5LHJvciMyNQlAIFNpZ21hMShlKQorCWFkZAlyMyxyMyxyMAorCWVvcglyMixyMTAscjExCisJYW5kCXIyLHIyLHI5CisJZW9yCXIyLHIyLHIxMQkJCUAgQ2goZSxmLGcpCisJYWRkCXIzLHIzLHIyCisJYWRkCXIzLHIzLHI0CisJYWRkCXIzLHIzLHIxMgorCW1vdglyNCxyNSxyb3IjMgorCWVvcglyNCxyNCxyNSxyb3IjMTMKKwllb3IJcjQscjQscjUscm9yIzIyCQlAIFNpZ21hMChhKQorCW9ycglyMCxyNSxyNgorCWFuZAlyMCxyMCxyNworCWFuZAlyMixyNSxyNgorCW9ycglyMCxyMCxyMgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNCxyNCxyMAorCWFkZAlyOCxyOCxyMworCWFkZAlyNCxyNCxyMworCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgorCWJuZQkuTHJvdW5kc18xNl94eAorCisJbGRyCXIzLFtzcCwjMTYqNF0JCUAgcHVsbCBjdHgKKwlsZHIJcjAsW3IzLCMwXQorCWxkcglyMixbcjMsIzRdCisJbGRyCXIxMixbcjMsIzhdCisJYWRkCXI0LHI0LHIwCisJbGRyCXIwLFtyMywjMTJdCisJYWRkCXI1LHI1LHIyCisJbGRyCXIyLFtyMywjMTZdCisJYWRkCXI2LHI2LHIxMgorCWxkcglyMTIsW3IzLCMyMF0KKwlhZGQJcjcscjcscjAKKwlsZHIJcjAsW3IzLCMyNF0KKwlhZGQJcjgscjgscjIKKwlsZHIJcjIsW3IzLCMyOF0KKwlhZGQJcjkscjkscjEyCisJbGRyCXIxLFtzcCwjMTcqNF0JCUAgcHVsbCBpbnAKKwlsZHIJcjEyLFtzcCwjMTgqNF0JCUAgcHVsbCBpbnArbGVuCisJYWRkCXIxMCxyMTAscjAKKwlhZGQJcjExLHIxMSxyMgorCXN0bWlhCXIzLHtyNCxyNSxyNixyNyxyOCxyOSxyMTAscjExfQorCWNtcAlyMSxyMTIKKwlzdWIJcjE0LHIxNCwjMjU2CUAgcmV3aW5kIEt0YmwKKwlibmUJLkxvb3AKKworCWFkZAlzcCxzcCwjMTkqNAlAIGRlc3Ryb3kgZnJhbWUKKwlsZG1pYQlzcCEse3I0LXIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0CisJLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorLnNpemUgICBzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciwuLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisuYXNjaXogICJTSEEyNTYgYmxvY2sgdHJhbnNmb3JtIGZvciBBUk12NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9Ab3BlbnNzbC5vcmc+IgorLmFsaWduCTIKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi01ODYucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItNTg2LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWYzMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItNTg2LnBsCkBAIC0wLDAgKzEsNjQ0IEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTSEE1MTIgYmxvY2sgdHJhbnNmb3JtIGZvciB4ODYuIFNlcHRlbWJlciAyMDA3LgorIworIyBQZXJmb3JtYW5jZSBpbiBjbG9jayBjeWNsZXMgcGVyIHByb2Nlc3NlZCBieXRlIChsZXNzIGlzIGJldHRlcik6CisjCisjCQlQZW50aXVtCVBJSUkJUDQJQU1EIEs4CUNvcmUyCisjIGdjYwkJMTAwCTc1CTExNgk1NAk2NgorIyBpY2MJCTk3CTc3CTk1CTU1CTU3CisjIHg4NiBhc20JNjEJNTYJODIJMzYJNDAKKyMgU1NFMiBhc20JLQktCTM4CTI0CTIwCisjIHg4Nl82NCBhc20oKikJLQktCTMwCTEwLjAJMTAuNQorIworIyAoKikgeDg2XzY0IGFzc2VtYmxlciBwZXJmb3JtYW5jZSBpcyBwcmVzZW50ZWQgZm9yIHJlZmVyZW5jZQorIyAgICAgcHVycG9zZXMuCisjCisjIElBTFUgY29kZS1wYXRoIGlzIG9wdGltaXplZCBmb3IgZWxkZXIgUGVudGl1bXMuIE9uIHZhbmlsbGEgUGVudGl1bQorIyBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHJlYWNoZXMgfjYwJSwKKyMgd2hpbGUgb24gUElJSSAtIH4zNSUuIE9uIG5ld2VyILUtYXJjaHMgaW1wcm92ZW1lbnQgdmFyaWVzIGZyb20gMTUlCisjIHRvIDUwJSwgYnV0IGl0J3MgbGVzcyBpbXBvcnRhbnQgYXMgdGhleSBhcmUgZXhwZWN0ZWQgdG8gZXhlY3V0ZSBTU0UyCisjIGNvZGUtcGF0aCwgd2hpY2ggaXMgY29tbW9ubHkgfjItM3ggZmFzdGVyIFt0aGFuIGNvbXBpbGVyIGdlbmVyYXRlZAorIyBjb2RlXS4gU1NFMiBjb2RlLXBhdGggaXMgYXMgZmFzdCBhcyBvcmlnaW5hbCBzaGE1MTItc3NlMi5wbCwgZXZlbgorIyB0aG91Z2ggaXQgZG9lcyBub3QgdXNlIDEyOC1iaXQgb3BlcmF0aW9ucy4gVGhlIGxhdHRlciBtZWFucyB0aGF0CisjIFNTRTItYXdhcmUga2VybmVsIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBleGVjdXRlIHRoZSBjb2RlLiBBbm90aGVyCisjIGRpZmZlcmVuY2UgaXMgdGhhdCBuZXcgY29kZSBvcHRpbWl6ZXMgYW1vdW50IG9mIHdyaXRlcywgYnV0IGF0IHRoZQorIyBjb3N0IG9mIGluY3JlYXNlZCBkYXRhIGNhY2hlICJmb290cHJpbnQiIGJ5IDEvMktCLgorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCIke2Rpcn0iLCIke2Rpcn0uLi8uLi9wZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sInNoYTUxMi01ODYucGwiLCRBUkdWWyQjQVJHVl0gZXEgIjM4NiIpOworCiskc3NlMj0wOworZm9yIChAQVJHVikgeyAkc3NlMj0xIGlmICgvLURPUEVOU1NMX0lBMzJfU1NFMi8pOyB9CisKKyZleHRlcm5hbF9sYWJlbCgiT1BFTlNTTF9pYTMyY2FwX1AiKSBpZiAoJHNzZTIpOworCiskVGxvPSZEV1AoMCwiZXNwIik7CSRUaGk9JkRXUCg0LCJlc3AiKTsKKyRBbG89JkRXUCg4LCJlc3AiKTsJJEFoaT0mRFdQKDgrNCwiZXNwIik7CiskQmxvPSZEV1AoMTYsImVzcCIpOwkkQmhpPSZEV1AoMTYrNCwiZXNwIik7CiskQ2xvPSZEV1AoMjQsImVzcCIpOwkkQ2hpPSZEV1AoMjQrNCwiZXNwIik7CiskRGxvPSZEV1AoMzIsImVzcCIpOwkkRGhpPSZEV1AoMzIrNCwiZXNwIik7CiskRWxvPSZEV1AoNDAsImVzcCIpOwkkRWhpPSZEV1AoNDArNCwiZXNwIik7CiskRmxvPSZEV1AoNDgsImVzcCIpOwkkRmhpPSZEV1AoNDgrNCwiZXNwIik7CiskR2xvPSZEV1AoNTYsImVzcCIpOwkkR2hpPSZEV1AoNTYrNCwiZXNwIik7CiskSGxvPSZEV1AoNjQsImVzcCIpOwkkSGhpPSZEV1AoNjQrNCwiZXNwIik7CiskSzUxMj0iZWJwIjsKKworJEFzc2UyPSZRV1AoMCwiZXNwIik7CiskQnNzZTI9JlFXUCg4LCJlc3AiKTsKKyRDc3NlMj0mUVdQKDE2LCJlc3AiKTsKKyREc3NlMj0mUVdQKDI0LCJlc3AiKTsKKyRFc3NlMj0mUVdQKDMyLCJlc3AiKTsKKyRGc3NlMj0mUVdQKDQwLCJlc3AiKTsKKyRHc3NlMj0mUVdQKDQ4LCJlc3AiKTsKKyRIc3NlMj0mUVdQKDU2LCJlc3AiKTsKKworJEE9Im1tMCI7CSMgQi1EIGFuZAorJEU9Im1tNCI7CSMgRi1IIGFyZSBjb21tb25seSBsb2FkZWQgdG8gcmVzcGVjdGl2ZWx5IG1tMS1tbTMgYW5kCisJCSMgbW01LW1tNywgYnV0IGl0J3MgZG9uZSBvbiBvbi1kZW1hbmQgYmFzaXMuLi4KKworc3ViIEJPRFlfMDBfMTVfc3NlMiB7CisgICAgbXkgJHByZWZldGNoPXNoaWZ0OworCisJJm1vdnEJKCJtbTUiLCRGc3NlMik7CQkJIyBsb2FkIGYKKwkmbW92cQkoIm1tNiIsJEdzc2UyKTsJCQkjIGxvYWQgZworCSZtb3ZxCSgibW03IiwkSHNzZTIpOwkJCSMgbG9hZCBoCisKKwkmbW92cQkoIm1tMSIsJEUpOwkJCSMgJW1tMSBpcyBzbGlkaW5nIHJpZ2h0CisJJm1vdnEJKCJtbTIiLCRFKTsJCQkjICVtbTIgaXMgc2xpZGluZyBsZWZ0CisJJnBzcmxxCSgibW0xIiwxNCk7CisJJm1vdnEJKCRFc3NlMiwkRSk7CQkJIyBtb2R1bG8tc2NoZWR1bGVkIHNhdmUgZQorCSZwc2xscQkoIm1tMiIsMjMpOworCSZtb3ZxCSgibW0zIiwibW0xIik7CQkJIyAlbW0zIGlzIFQxCisJJnBzcmxxCSgibW0xIiw0KTsKKwkmcHhvcgkoIm1tMyIsIm1tMiIpOworCSZwc2xscQkoIm1tMiIsMjMpOworCSZweG9yCSgibW0zIiwibW0xIik7CisJJnBzcmxxCSgibW0xIiwyMyk7CisJJnB4b3IJKCJtbTMiLCJtbTIiKTsKKwkmcHNsbHEJKCJtbTIiLDQpOworCSZweG9yCSgibW0zIiwibW0xIik7CisJJnBhZGRxCSgibW03IixRV1AoMCwkSzUxMikpOwkJIyBoKz1LNTEyW2ldCisJJnB4b3IJKCJtbTMiLCJtbTIiKTsJCQkjIFQxPVNpZ21hMV81MTIoZSkKKworCSZweG9yCSgibW01IiwibW02Iik7CQkJIyBmXj1nCisJJm1vdnEJKCJtbTEiLCRCc3NlMik7CQkJIyBsb2FkIGIKKwkmcGFuZAkoIm1tNSIsJEUpOwkJCSMgZiY9ZQorCSZtb3ZxCSgibW0yIiwkQ3NzZTIpOwkJCSMgbG9hZCBjCisJJnB4b3IJKCJtbTUiLCJtbTYiKTsJCQkjIGZePWcKKwkmbW92cQkoJEUsJERzc2UyKTsJCQkjIGUgPSBsb2FkIGQKKwkmcGFkZHEJKCJtbTMiLCJtbTUiKTsJCQkjIFQxKz1DaChlLGYsZykKKwkmbW92cQkoJlFXUCgwLCJlc3AiKSwkQSk7CQkjIG1vZHVsby1zY2hlZHVsZWQgc2F2ZSBhCisJJnBhZGRxCSgibW0zIiwibW03Iik7CQkJIyBUMSs9aAorCisJJm1vdnEJKCJtbTUiLCRBKTsJCQkjICVtbTUgaXMgc2xpZGluZyByaWdodAorCSZtb3ZxCSgibW02IiwkQSk7CQkJIyAlbW02IGlzIHNsaWRpbmcgbGVmdAorCSZwYWRkcQkoIm1tMyIsJlFXUCg4KjksImVzcCIpKTsJIyBUMSs9WFswXQorCSZwc3JscQkoIm1tNSIsMjgpOworCSZwYWRkcQkoJEUsIm1tMyIpOwkJCSMgZSArPSBUMQorCSZwc2xscQkoIm1tNiIsMjUpOworCSZtb3ZxCSgibW03IiwibW01Iik7CQkJIyAlbW03IGlzIFQyCisJJnBzcmxxCSgibW01Iiw2KTsKKwkmcHhvcgkoIm1tNyIsIm1tNiIpOworCSZwc2xscQkoIm1tNiIsNSk7CisJJnB4b3IJKCJtbTciLCJtbTUiKTsKKwkmcHNybHEJKCJtbTUiLDUpOworCSZweG9yCSgibW03IiwibW02Iik7CisJJnBzbGxxCSgibW02Iiw2KTsKKwkmcHhvcgkoIm1tNyIsIm1tNSIpOworCSZzdWIJKCJlc3AiLDgpOworCSZweG9yCSgibW03IiwibW02Iik7CQkJIyBUMj1TaWdtYTBfNTEyKGEpCisKKwkmbW92cQkoIm1tNSIsJEEpOwkJCSMgJW1tNT1hCisJJnBvcgkoJEEsIm1tMiIpOwkJCSMgYT1hfGMKKwkmbW92cQkoIm1tNiIsJlFXUCg4Kig5KzE2LTE0KSwiZXNwIikpCWlmICgkcHJlZmV0Y2gpOworCSZwYW5kCSgibW01IiwibW0yIik7CQkJIyAlbW01PWEmYworCSZwYW5kCSgkQSwibW0xIik7CQkJIyBhPShhfGMpJmIKKwkmbW92cQkoIm1tMiIsJlFXUCg4Kig5KzE2LTEpLCJlc3AiKSkJaWYgKCRwcmVmZXRjaCk7CisJJnBvcgkoIm1tNSIsJEEpOwkJCSMgJW1tNT0oYSZjKXwoKGF8YykmYikKKwkmcGFkZHEJKCJtbTciLCJtbTUiKTsJCQkjIFQyKz1NYWooYSxiLGMpCisJJm1vdnEJKCRBLCJtbTMiKTsJCQkjIGE9VDEKKworCSZtb3YJKCZMQigiZWR4IiksJkJQKDAsJEs1MTIpKTsKKwkmcGFkZHEJKCRBLCJtbTciKTsJCQkjIGErPVQyCisJJmFkZAkoJEs1MTIsOCk7Cit9CisKK3N1YiBCT0RZXzAwXzE1X3g4NiB7CisJI2RlZmluZSBTaWdtYTEoeCkJKFJPVFIoKHgpLDE0KSBeIFJPVFIoKHgpLDE4KSAgXiBST1RSKCh4KSw0MSkpCisJIwlMTwkJbG8+PjE0XmhpPDwxOCBeIGxvPj4xOF5oaTw8MTQgXiBoaT4+OV5sbzw8MjMKKwkjCUhJCQloaT4+MTRebG88PDE4IF4gaGk+PjE4XmxvPDwxNCBeIGxvPj45XmhpPDwyMworCSZtb3YJKCJlY3giLCRFbG8pOworCSZtb3YJKCJlZHgiLCRFaGkpOworCSZtb3YJKCJlc2kiLCJlY3giKTsKKworCSZzaHIJKCJlY3giLDkpCSMgbG8+PjkKKwkmbW92CSgiZWRpIiwiZWR4Iik7CisJJnNocgkoImVkeCIsOSkJIyBoaT4+OQorCSZtb3YJKCJlYngiLCJlY3giKTsKKwkmc2hsCSgiZXNpIiwxNCk7CSMgbG88PDE0CisJJm1vdgkoImVheCIsImVkeCIpOworCSZzaGwJKCJlZGkiLDE0KTsJIyBoaTw8MTQKKwkmeG9yCSgiZWJ4IiwiZXNpIik7CisKKwkmc2hyCSgiZWN4IiwxNC05KTsJIyBsbz4+MTQKKwkmeG9yCSgiZWF4IiwiZWRpIik7CisJJnNocgkoImVkeCIsMTQtOSk7CSMgaGk+PjE0CisJJnhvcgkoImVheCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDE4LTE0KTsJIyBsbzw8MTgKKwkmeG9yCSgiZWJ4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsMTgtMTQpOwkjIGhpPDwxOAorCSZ4b3IJKCJlYngiLCJlc2kiKTsKKworCSZzaHIJKCJlY3giLDE4LTE0KTsJIyBsbz4+MTgKKwkmeG9yCSgiZWF4IiwiZWRpIik7CisJJnNocgkoImVkeCIsMTgtMTQpOwkjIGhpPj4xOAorCSZ4b3IJKCJlYXgiLCJlY3giKTsKKwkmc2hsCSgiZXNpIiwyMy0xOCk7CSMgbG88PDIzCisJJnhvcgkoImVieCIsImVkeCIpOworCSZzaGwJKCJlZGkiLDIzLTE4KTsJIyBoaTw8MjMKKwkmeG9yCSgiZWF4IiwiZXNpIik7CisJJnhvcgkoImVieCIsImVkaSIpOwkJCSMgVDEgPSBTaWdtYTEoZSkKKworCSZtb3YJKCJlY3giLCRGbG8pOworCSZtb3YJKCJlZHgiLCRGaGkpOworCSZtb3YJKCJlc2kiLCRHbG8pOworCSZtb3YJKCJlZGkiLCRHaGkpOworCSAmYWRkCSgiZWF4IiwkSGxvKTsKKwkgJmFkYwkoImVieCIsJEhoaSk7CQkJIyBUMSArPSBoCisJJnhvcgkoImVjeCIsImVzaSIpOworCSZ4b3IJKCJlZHgiLCJlZGkiKTsKKwkmYW5kCSgiZWN4IiwkRWxvKTsKKwkmYW5kCSgiZWR4IiwkRWhpKTsKKwkgJmFkZAkoImVheCIsJkRXUCg4Kig5KzE1KSswLCJlc3AiKSk7CisJICZhZGMJKCJlYngiLCZEV1AoOCooOSsxNSkrNCwiZXNwIikpOwkjIFQxICs9IFhbMF0KKwkmeG9yCSgiZWN4IiwiZXNpIik7CisJJnhvcgkoImVkeCIsImVkaSIpOwkJCSMgQ2goZSxmLGcpID0gKGZeZykmZSleZworCisJJm1vdgkoImVzaSIsJkRXUCgwLCRLNTEyKSk7CisJJm1vdgkoImVkaSIsJkRXUCg0LCRLNTEyKSk7CQkjIEtbaV0KKwkmYWRkCSgiZWF4IiwiZWN4Iik7CisJJmFkYwkoImVieCIsImVkeCIpOwkJCSMgVDEgKz0gQ2goZSxmLGcpCisJJm1vdgkoImVjeCIsJERsbyk7CisJJm1vdgkoImVkeCIsJERoaSk7CisJJmFkZAkoImVheCIsImVzaSIpOworCSZhZGMJKCJlYngiLCJlZGkiKTsJCQkjIFQxICs9IEtbaV0KKwkmbW92CSgkVGxvLCJlYXgiKTsKKwkmbW92CSgkVGhpLCJlYngiKTsJCQkjIHB1dCBUMSBhd2F5CisJJmFkZAkoImVheCIsImVjeCIpOworCSZhZGMJKCJlYngiLCJlZHgiKTsJCQkjIGQgKz0gVDEKKworCSNkZWZpbmUgU2lnbWEwKHgpCShST1RSKCh4KSwyOCkgXiBST1RSKCh4KSwzNCkgXiBST1RSKCh4KSwzOSkpCisJIwlMTwkJbG8+PjI4XmhpPDw0ICBeIGhpPj4yXmxvPDwzMCBeIGhpPj43XmxvPDwyNQorCSMJSEkJCWhpPj4yOF5sbzw8NCAgXiBsbz4+Ml5oaTw8MzAgXiBsbz4+N15oaTw8MjUKKwkmbW92CSgiZWN4IiwkQWxvKTsKKwkmbW92CSgiZWR4IiwkQWhpKTsKKwkmbW92CSgkRGxvLCJlYXgiKTsKKwkmbW92CSgkRGhpLCJlYngiKTsKKwkmbW92CSgiZXNpIiwiZWN4Iik7CisKKwkmc2hyCSgiZWN4IiwyKQkjIGxvPj4yCisJJm1vdgkoImVkaSIsImVkeCIpOworCSZzaHIJKCJlZHgiLDIpCSMgaGk+PjIKKwkmbW92CSgiZWJ4IiwiZWN4Iik7CisJJnNobAkoImVzaSIsNCk7CSMgbG88PDQKKwkmbW92CSgiZWF4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsNCk7CSMgaGk8PDQKKwkmeG9yCSgiZWJ4IiwiZXNpIik7CisKKwkmc2hyCSgiZWN4Iiw3LTIpOwkjIGxvPj43CisJJnhvcgkoImVheCIsImVkaSIpOworCSZzaHIJKCJlZHgiLDctMik7CSMgaGk+PjcKKwkmeG9yCSgiZWJ4IiwiZWN4Iik7CisJJnNobAkoImVzaSIsMjUtNCk7CSMgbG88PDI1CisJJnhvcgkoImVheCIsImVkeCIpOworCSZzaGwJKCJlZGkiLDI1LTQpOwkjIGhpPDwyNQorCSZ4b3IJKCJlYXgiLCJlc2kiKTsKKworCSZzaHIJKCJlY3giLDI4LTcpOwkjIGxvPj4yOAorCSZ4b3IJKCJlYngiLCJlZGkiKTsKKwkmc2hyCSgiZWR4IiwyOC03KTsJIyBoaT4+MjgKKwkmeG9yCSgiZWF4IiwiZWN4Iik7CisJJnNobAkoImVzaSIsMzAtMjUpOwkjIGxvPDwzMAorCSZ4b3IJKCJlYngiLCJlZHgiKTsKKwkmc2hsCSgiZWRpIiwzMC0yNSk7CSMgaGk8PDMwCisJJnhvcgkoImVheCIsImVzaSIpOworCSZ4b3IJKCJlYngiLCJlZGkiKTsJCQkjIFNpZ21hMChhKQorCisJJm1vdgkoImVjeCIsJEFsbyk7CisJJm1vdgkoImVkeCIsJEFoaSk7CisJJm1vdgkoImVzaSIsJEJsbyk7CisJJm1vdgkoImVkaSIsJEJoaSk7CisJJmFkZAkoImVheCIsJFRsbyk7CisJJmFkYwkoImVieCIsJFRoaSk7CQkJIyBUMSA9IFNpZ21hMChhKStUMQorCSZvcgkoImVjeCIsImVzaSIpOworCSZvcgkoImVkeCIsImVkaSIpOworCSZhbmQJKCJlY3giLCRDbG8pOworCSZhbmQJKCJlZHgiLCRDaGkpOworCSZhbmQJKCJlc2kiLCRBbG8pOworCSZhbmQJKCJlZGkiLCRBaGkpOworCSZvcgkoImVjeCIsImVzaSIpOworCSZvcgkoImVkeCIsImVkaSIpOwkJCSMgTWFqKGEsYixjKSA9ICgoYXxiKSZjKXwoYSZiKQorCisJJmFkZAkoImVheCIsImVjeCIpOworCSZhZGMJKCJlYngiLCJlZHgiKTsJCQkjIFQxICs9IE1haihhLGIsYykKKwkmbW92CSgkVGxvLCJlYXgiKTsKKwkmbW92CSgkVGhpLCJlYngiKTsKKworCSZtb3YJKCZMQigiZWR4IiksJkJQKDAsJEs1MTIpKTsJIyBwcmUtZmV0Y2ggTFNCIG9mICpLCisJJnN1YgkoImVzcCIsOCk7CisJJmxlYQkoJEs1MTIsJkRXUCg4LCRLNTEyKSk7CQkjIEsrKworfQorCisKKyZmdW5jdGlvbl9iZWdpbigic2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIiKTsKKwkmbW92CSgiZXNpIix3cGFyYW0oMCkpOwkjIGN0eAorCSZtb3YJKCJlZGkiLHdwYXJhbSgxKSk7CSMgaW5wCisJJm1vdgkoImVheCIsd3BhcmFtKDIpKTsJIyBudW0KKwkmbW92CSgiZWJ4IiwiZXNwIik7CQkjIHNhdmVkIHNwCisKKwkmY2FsbAkoJmxhYmVsKCJwaWNfcG9pbnQiKSk7CSMgbWFrZSBpdCBQSUMhCismc2V0X2xhYmVsKCJwaWNfcG9pbnQiKTsKKwkmYmxpbmRwb3AoJEs1MTIpOworCSZsZWEJKCRLNTEyLCZEV1AoJmxhYmVsKCJLNTEyIikuIi0iLiZsYWJlbCgicGljX3BvaW50IiksJEs1MTIpKTsKKworCSZzdWIJKCJlc3AiLDE2KTsKKwkmYW5kCSgiZXNwIiwtNjQpOworCisJJnNobAkoImVheCIsNyk7CisJJmFkZAkoImVheCIsImVkaSIpOworCSZtb3YJKCZEV1AoMCwiZXNwIiksImVzaSIpOwkjIGN0eAorCSZtb3YJKCZEV1AoNCwiZXNwIiksImVkaSIpOwkjIGlucAorCSZtb3YJKCZEV1AoOCwiZXNwIiksImVheCIpOwkjIGlucCtudW0qMTI4CisJJm1vdgkoJkRXUCgxMiwiZXNwIiksImVieCIpOwkjIHNhdmVkIHNwCisKK2lmICgkc3NlMikgeworCSZwaWNtZXVwKCJlZHgiLCJPUEVOU1NMX2lhMzJjYXBfUCIsJEs1MTIsJmxhYmVsKCJLNTEyIikpOworCSZidAkoJkRXUCgwLCJlZHgiKSwyNik7CisJJmpuYwkoJmxhYmVsKCJsb29wX3g4NiIpKTsKKworCSMgbG9hZCBjdHgtPmhbMC03XQorCSZtb3ZxCSgkQSwmUVdQKDAsImVzaSIpKTsKKwkmbW92cQkoIm1tMSIsJlFXUCg4LCJlc2kiKSk7CisJJm1vdnEJKCJtbTIiLCZRV1AoMTYsImVzaSIpKTsKKwkmbW92cQkoIm1tMyIsJlFXUCgyNCwiZXNpIikpOworCSZtb3ZxCSgkRSwmUVdQKDMyLCJlc2kiKSk7CisJJm1vdnEJKCJtbTUiLCZRV1AoNDAsImVzaSIpKTsKKwkmbW92cQkoIm1tNiIsJlFXUCg0OCwiZXNpIikpOworCSZtb3ZxCSgibW03IiwmUVdQKDU2LCJlc2kiKSk7CisJJnN1YgkoImVzcCIsOCoxMCk7CisKKyZzZXRfbGFiZWwoImxvb3Bfc3NlMiIsMTYpOworCSMgJm1vdnEJKCRBc3NlMiwkQSk7CisJJm1vdnEJKCRCc3NlMiwibW0xIik7CisJJm1vdnEJKCRDc3NlMiwibW0yIik7CisJJm1vdnEJKCREc3NlMiwibW0zIik7CisJIyAmbW92cQkoJEVzc2UyLCRFKTsKKwkmbW92cQkoJEZzc2UyLCJtbTUiKTsKKwkmbW92cQkoJEdzc2UyLCJtbTYiKTsKKwkmbW92cQkoJEhzc2UyLCJtbTciKTsKKworCSZtb3YJKCJlY3giLCZEV1AoMCwiZWRpIikpOworCSZtb3YJKCJlZHgiLCZEV1AoNCwiZWRpIikpOworCSZhZGQJKCJlZGkiLDgpOworCSZic3dhcAkoImVjeCIpOworCSZic3dhcAkoImVkeCIpOworCSZtb3YJKCZEV1AoOCo5KzQsImVzcCIpLCJlY3giKTsKKwkmbW92CSgmRFdQKDgqOSswLCJlc3AiKSwiZWR4Iik7CisKKyZzZXRfbGFiZWwoIjAwXzE0X3NzZTIiLDE2KTsKKwkmbW92CSgiZWF4IiwmRFdQKDAsImVkaSIpKTsKKwkmbW92CSgiZWJ4IiwmRFdQKDQsImVkaSIpKTsKKwkmYWRkCSgiZWRpIiw4KTsKKwkmYnN3YXAJKCJlYXgiKTsKKwkmYnN3YXAJKCJlYngiKTsKKwkmbW92CSgmRFdQKDgqOCs0LCJlc3AiKSwiZWF4Iik7CisJJm1vdgkoJkRXUCg4KjgrMCwiZXNwIiksImVieCIpOworCisJJkJPRFlfMDBfMTVfc3NlMigpOworCisJJmNtcAkoJkxCKCJlZHgiKSwweDM1KTsKKwkmam5lCSgmbGFiZWwoIjAwXzE0X3NzZTIiKSk7CisKKwkmQk9EWV8wMF8xNV9zc2UyKDEpOworCismc2V0X2xhYmVsKCIxNl83OV9zc2UyIiwxNik7CisJIyZtb3ZxCSgibW0yIiwmUVdQKDgqKDkrMTYtMSksImVzcCIpKTsJI3ByZWZldGNoZWQgaW4gQk9EWV8wMF8xNSAKKwkjJm1vdnEJKCJtbTYiLCZRV1AoOCooOSsxNi0xNCksImVzcCIpKTsKKwkmbW92cQkoIm1tMSIsIm1tMiIpOworCisJJnBzcmxxCSgibW0yIiwxKTsKKwkmbW92cQkoIm1tNyIsIm1tNiIpOworCSZwc3JscQkoIm1tNiIsNik7CisJJm1vdnEJKCJtbTMiLCJtbTIiKTsKKworCSZwc3JscQkoIm1tMiIsNy0xKTsKKwkmbW92cQkoIm1tNSIsIm1tNiIpOworCSZwc3JscQkoIm1tNiIsMTktNik7CisJJnB4b3IJKCJtbTMiLCJtbTIiKTsKKworCSZwc3JscQkoIm1tMiIsOC03KTsKKwkmcHhvcgkoIm1tNSIsIm1tNiIpOworCSZwc3JscQkoIm1tNiIsNjEtMTkpOworCSZweG9yCSgibW0zIiwibW0yIik7CisKKwkmbW92cQkoIm1tMiIsJlFXUCg4Kig5KzE2KSwiZXNwIikpOworCisJJnBzbGxxCSgibW0xIiw1Nik7CisJJnB4b3IJKCJtbTUiLCJtbTYiKTsKKwkmcHNsbHEJKCJtbTciLDMpOworCSZweG9yCSgibW0zIiwibW0xIik7CisKKwkmcGFkZHEJKCJtbTIiLCZRV1AoOCooOSsxNi05KSwiZXNwIikpOworCisJJnBzbGxxCSgibW0xIiw2My01Nik7CisJJnB4b3IJKCJtbTUiLCJtbTciKTsKKwkmcHNsbHEJKCJtbTciLDQ1LTMpOworCSZweG9yCSgibW0zIiwibW0xIik7CisJJnB4b3IJKCJtbTUiLCJtbTciKTsKKworCSZwYWRkcQkoIm1tMyIsIm1tNSIpOworCSZwYWRkcQkoIm1tMyIsIm1tMiIpOworCSZtb3ZxCSgmUVdQKDgqOSwiZXNwIiksIm1tMyIpOworCisJJkJPRFlfMDBfMTVfc3NlMigxKTsKKworCSZjbXAJKCZMQigiZWR4IiksMHgxNyk7CisJJmpuZQkoJmxhYmVsKCIxNl83OV9zc2UyIikpOworCisJIyAmbW92cQkoJEEsJEFzc2UyKTsKKwkmbW92cQkoIm1tMSIsJEJzc2UyKTsKKwkmbW92cQkoIm1tMiIsJENzc2UyKTsKKwkmbW92cQkoIm1tMyIsJERzc2UyKTsKKwkjICZtb3ZxCSgkRSwkRXNzZTIpOworCSZtb3ZxCSgibW01IiwkRnNzZTIpOworCSZtb3ZxCSgibW02IiwkR3NzZTIpOworCSZtb3ZxCSgibW03IiwkSHNzZTIpOworCisJJnBhZGRxCSgkQSwmUVdQKDAsImVzaSIpKTsKKwkmcGFkZHEJKCJtbTEiLCZRV1AoOCwiZXNpIikpOworCSZwYWRkcQkoIm1tMiIsJlFXUCgxNiwiZXNpIikpOworCSZwYWRkcQkoIm1tMyIsJlFXUCgyNCwiZXNpIikpOworCSZwYWRkcQkoJEUsJlFXUCgzMiwiZXNpIikpOworCSZwYWRkcQkoIm1tNSIsJlFXUCg0MCwiZXNpIikpOworCSZwYWRkcQkoIm1tNiIsJlFXUCg0OCwiZXNpIikpOworCSZwYWRkcQkoIm1tNyIsJlFXUCg1NiwiZXNpIikpOworCisJJm1vdnEJKCZRV1AoMCwiZXNpIiksJEEpOworCSZtb3ZxCSgmUVdQKDgsImVzaSIpLCJtbTEiKTsKKwkmbW92cQkoJlFXUCgxNiwiZXNpIiksIm1tMiIpOworCSZtb3ZxCSgmUVdQKDI0LCJlc2kiKSwibW0zIik7CisJJm1vdnEJKCZRV1AoMzIsImVzaSIpLCRFKTsKKwkmbW92cQkoJlFXUCg0MCwiZXNpIiksIm1tNSIpOworCSZtb3ZxCSgmUVdQKDQ4LCJlc2kiKSwibW02Iik7CisJJm1vdnEJKCZRV1AoNTYsImVzaSIpLCJtbTciKTsKKworCSZhZGQJKCJlc3AiLDgqODApOwkJCSMgZGVzdHJveSBmcmFtZQorCSZzdWIJKCRLNTEyLDgqODApOwkJCSMgcmV3aW5kIEsKKworCSZjbXAJKCJlZGkiLCZEV1AoOCoxMCs4LCJlc3AiKSk7CSMgYXJlIHdlIGRvbmUgeWV0PworCSZqYgkoJmxhYmVsKCJsb29wX3NzZTIiKSk7CisKKwkmZW1tcwkoKTsKKwkmbW92CSgiZXNwIiwmRFdQKDgqMTArMTIsImVzcCIpKTsJIyByZXN0b3JlIHNwCismZnVuY3Rpb25fZW5kX0EoKTsKK30KKyZzZXRfbGFiZWwoImxvb3BfeDg2IiwxNik7CisgICAgIyBjb3B5IGlucHV0IGJsb2NrIHRvIHN0YWNrIHJldmVyc2luZyBieXRlIGFuZCBxd29yZCBvcmRlcgorICAgIGZvciAoJGk9MDskaTw4OyRpKyspIHsKKwkmbW92CSgiZWF4IiwmRFdQKCRpKjE2KzAsImVkaSIpKTsKKwkmbW92CSgiZWJ4IiwmRFdQKCRpKjE2KzQsImVkaSIpKTsKKwkmbW92CSgiZWN4IiwmRFdQKCRpKjE2KzgsImVkaSIpKTsKKwkmbW92CSgiZWR4IiwmRFdQKCRpKjE2KzEyLCJlZGkiKSk7CisJJmJzd2FwCSgiZWF4Iik7CisJJmJzd2FwCSgiZWJ4Iik7CisJJmJzd2FwCSgiZWN4Iik7CisJJmJzd2FwCSgiZWR4Iik7CisJJnB1c2gJKCJlYXgiKTsKKwkmcHVzaAkoImVieCIpOworCSZwdXNoCSgiZWN4Iik7CisJJnB1c2gJKCJlZHgiKTsKKyAgICB9CisJJmFkZAkoImVkaSIsMTI4KTsKKwkmc3ViCSgiZXNwIiw5KjgpOwkJIyBwbGFjZSBmb3IgVCxBLEIsQyxELEUsRixHLEgKKwkmbW92CSgmRFdQKDgqKDkrMTYpKzQsImVzcCIpLCJlZGkiKTsKKworCSMgY29weSBjdHgtPmhbMC03XSB0byBBLEIsQyxELEUsRixHLEggb24gc3RhY2sKKwkmbGVhCSgiZWRpIiwmRFdQKDgsImVzcCIpKTsKKwkmbW92CSgiZWN4IiwxNik7CisJJmRhdGFfd29yZCgweEE1RjNGNjg5KTsJCSMgcmVwIG1vdnNkCisKKyZzZXRfbGFiZWwoIjAwXzE1X3g4NiIsMTYpOworCSZCT0RZXzAwXzE1X3g4NigpOworCisJJmNtcAkoJkxCKCJlZHgiKSwweDk0KTsKKwkmam5lCSgmbGFiZWwoIjAwXzE1X3g4NiIpKTsKKworJnNldF9sYWJlbCgiMTZfNzlfeDg2IiwxNik7CisJI2RlZmluZSBzaWdtYTAoeCkJKFJPVFIoKHgpLDEpICBeIFJPVFIoKHgpLDgpICBeICgoeCk+PjcpKQorCSMJTE8JCWxvPj4xXmhpPDwzMSAgXiBsbz4+OF5oaTw8MjQgXiBsbz4+N15oaTw8MjUKKwkjCUhJCQloaT4+MV5sbzw8MzEgIF4gaGk+PjhebG88PDI0IF4gaGk+PjcKKwkmbW92CSgiZWN4IiwmRFdQKDgqKDkrMTUrMTYtMSkrMCwiZXNwIikpOworCSZtb3YJKCJlZHgiLCZEV1AoOCooOSsxNSsxNi0xKSs0LCJlc3AiKSk7CisJJm1vdgkoImVzaSIsImVjeCIpOworCisJJnNocgkoImVjeCIsMSkJIyBsbz4+MQorCSZtb3YJKCJlZGkiLCJlZHgiKTsKKwkmc2hyCSgiZWR4IiwxKQkjIGhpPj4xCisJJm1vdgkoImVheCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDI0KTsJIyBsbzw8MjQKKwkmbW92CSgiZWJ4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsMjQpOwkjIGhpPDwyNAorCSZ4b3IJKCJlYngiLCJlc2kiKTsKKworCSZzaHIJKCJlY3giLDctMSk7CSMgbG8+PjcKKwkmeG9yCSgiZWF4IiwiZWRpIik7CisJJnNocgkoImVkeCIsNy0xKTsJIyBoaT4+NworCSZ4b3IJKCJlYXgiLCJlY3giKTsKKwkmc2hsCSgiZXNpIiwzMS0yNCk7CSMgbG88PDMxCisJJnhvcgkoImVieCIsImVkeCIpOworCSZzaGwJKCJlZGkiLDI1LTI0KTsJIyBoaTw8MjUKKwkmeG9yCSgiZWJ4IiwiZXNpIik7CisKKwkmc2hyCSgiZWN4Iiw4LTcpOwkjIGxvPj44CisJJnhvcgkoImVheCIsImVkaSIpOworCSZzaHIJKCJlZHgiLDgtNyk7CSMgaGk+PjgKKwkmeG9yCSgiZWF4IiwiZWN4Iik7CisJJnNobAkoImVkaSIsMzEtMjUpOwkjIGhpPDwzMQorCSZ4b3IJKCJlYngiLCJlZHgiKTsKKwkmeG9yCSgiZWF4IiwiZWRpIik7CQkJIyBUMSA9IHNpZ21hMChYWy0xNV0pCisKKwkmbW92CSgmRFdQKDAsImVzcCIpLCJlYXgiKTsKKwkmbW92CSgmRFdQKDQsImVzcCIpLCJlYngiKTsJCSMgcHV0IFQxIGF3YXkKKworCSNkZWZpbmUgc2lnbWExKHgpCShST1RSKCh4KSwxOSkgXiBST1RSKCh4KSw2MSkgXiAoKHgpPj42KSkKKwkjCUxPCQlsbz4+MTleaGk8PDEzIF4gaGk+PjI5XmxvPDwzIF4gbG8+PjZeaGk8PDI2CisJIwlISQkJaGk+PjE5XmxvPDwxMyBeIGxvPj4yOV5oaTw8MyBeIGhpPj42CisJJm1vdgkoImVjeCIsJkRXUCg4Kig5KzE1KzE2LTE0KSswLCJlc3AiKSk7CisJJm1vdgkoImVkeCIsJkRXUCg4Kig5KzE1KzE2LTE0KSs0LCJlc3AiKSk7CisJJm1vdgkoImVzaSIsImVjeCIpOworCisJJnNocgkoImVjeCIsNikJIyBsbz4+NgorCSZtb3YJKCJlZGkiLCJlZHgiKTsKKwkmc2hyCSgiZWR4Iiw2KQkjIGhpPj42CisJJm1vdgkoImVheCIsImVjeCIpOworCSZzaGwJKCJlc2kiLDMpOwkjIGxvPDwzCisJJm1vdgkoImVieCIsImVkeCIpOworCSZzaGwJKCJlZGkiLDMpOwkjIGhpPDwzCisJJnhvcgkoImVheCIsImVzaSIpOworCisJJnNocgkoImVjeCIsMTktNik7CSMgbG8+PjE5CisJJnhvcgkoImVieCIsImVkaSIpOworCSZzaHIJKCJlZHgiLDE5LTYpOwkjIGhpPj4xOQorCSZ4b3IJKCJlYXgiLCJlY3giKTsKKwkmc2hsCSgiZXNpIiwxMy0zKTsJIyBsbzw8MTMKKwkmeG9yCSgiZWJ4IiwiZWR4Iik7CisJJnNobAkoImVkaSIsMTMtMyk7CSMgaGk8PDEzCisJJnhvcgkoImVieCIsImVzaSIpOworCisJJnNocgkoImVjeCIsMjktMTkpOwkjIGxvPj4yOQorCSZ4b3IJKCJlYXgiLCJlZGkiKTsKKwkmc2hyCSgiZWR4IiwyOS0xOSk7CSMgaGk+PjI5CisJJnhvcgkoImVieCIsImVjeCIpOworCSZzaGwJKCJlZGkiLDI2LTEzKTsJIyBoaTw8MjYKKwkmeG9yCSgiZWF4IiwiZWR4Iik7CisJJnhvcgkoImVheCIsImVkaSIpOwkJCSMgc2lnbWExKFhbLTJdKQorCisJJm1vdgkoImVjeCIsJkRXUCg4Kig5KzE1KzE2KSswLCJlc3AiKSk7CisJJm1vdgkoImVkeCIsJkRXUCg4Kig5KzE1KzE2KSs0LCJlc3AiKSk7CisJJmFkZAkoImVheCIsJkRXUCgwLCJlc3AiKSk7CisJJmFkYwkoImVieCIsJkRXUCg0LCJlc3AiKSk7CQkjIFQxID0gc2lnbWExKFhbLTJdKStUMQorCSZtb3YJKCJlc2kiLCZEV1AoOCooOSsxNSsxNi05KSswLCJlc3AiKSk7CisJJm1vdgkoImVkaSIsJkRXUCg4Kig5KzE1KzE2LTkpKzQsImVzcCIpKTsKKwkmYWRkCSgiZWF4IiwiZWN4Iik7CisJJmFkYwkoImVieCIsImVkeCIpOwkJCSMgVDEgKz0gWFstMTZdCisJJmFkZAkoImVheCIsImVzaSIpOworCSZhZGMJKCJlYngiLCJlZGkiKTsJCQkjIFQxICs9IFhbLTddCisJJm1vdgkoJkRXUCg4Kig5KzE1KSswLCJlc3AiKSwiZWF4Iik7CisJJm1vdgkoJkRXUCg4Kig5KzE1KSs0LCJlc3AiKSwiZWJ4Iik7CSMgc2F2ZSBYWzBdCisKKwkmQk9EWV8wMF8xNV94ODYoKTsKKworCSZjbXAJKCZMQigiZWR4IiksMHgxNyk7CisJJmpuZQkoJmxhYmVsKCIxNl83OV94ODYiKSk7CisKKwkmbW92CSgiZXNpIiwmRFdQKDgqKDkrMTYrODApKzAsImVzcCIpKTsjIGN0eAorCSZtb3YJKCJlZGkiLCZEV1AoOCooOSsxNis4MCkrNCwiZXNwIikpOyMgaW5wCisgICAgZm9yKCRpPTA7JGk8NDskaSsrKSB7CisJJm1vdgkoImVheCIsJkRXUCgkaSoxNiswLCJlc2kiKSk7CisJJm1vdgkoImVieCIsJkRXUCgkaSoxNis0LCJlc2kiKSk7CisJJm1vdgkoImVjeCIsJkRXUCgkaSoxNis4LCJlc2kiKSk7CisJJm1vdgkoImVkeCIsJkRXUCgkaSoxNisxMiwiZXNpIikpOworCSZhZGQJKCJlYXgiLCZEV1AoOCsoJGkqMTYpKzAsImVzcCIpKTsKKwkmYWRjCSgiZWJ4IiwmRFdQKDgrKCRpKjE2KSs0LCJlc3AiKSk7CisJJm1vdgkoJkRXUCgkaSoxNiswLCJlc2kiKSwiZWF4Iik7CisJJm1vdgkoJkRXUCgkaSoxNis0LCJlc2kiKSwiZWJ4Iik7CisJJmFkZAkoImVjeCIsJkRXUCg4KygkaSoxNikrOCwiZXNwIikpOworCSZhZGMJKCJlZHgiLCZEV1AoOCsoJGkqMTYpKzEyLCJlc3AiKSk7CisJJm1vdgkoJkRXUCgkaSoxNis4LCJlc2kiKSwiZWN4Iik7CisJJm1vdgkoJkRXUCgkaSoxNisxMiwiZXNpIiksImVkeCIpOworICAgIH0KKwkmYWRkCSgiZXNwIiw4Kig5KzE2KzgwKSk7CQkjIGRlc3Ryb3kgZnJhbWUKKwkmc3ViCSgkSzUxMiw4KjgwKTsJCQkjIHJld2luZCBLCisKKwkmY21wCSgiZWRpIiwmRFdQKDgsImVzcCIpKTsJCSMgYXJlIHdlIGRvbmUgeWV0PworCSZqYgkoJmxhYmVsKCJsb29wX3g4NiIpKTsKKworCSZtb3YJKCJlc3AiLCZEV1AoMTIsImVzcCIpKTsJCSMgcmVzdG9yZSBzcAorJmZ1bmN0aW9uX2VuZF9BKCk7CisKKyZzZXRfbGFiZWwoIks1MTIiLDY0KTsJIyBZZXMhIEkga2VlcCBpdCBpbiB0aGUgY29kZSBzZWdtZW50IQorCSZkYXRhX3dvcmQoMHhkNzI4YWUyMiwweDQyOGEyZjk4KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MjNlZjY1Y2QsMHg3MTM3NDQ5MSk7CSMgdTY0CisJJmRhdGFfd29yZCgweGVjNGQzYjJmLDB4YjVjMGZiY2YpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg4MTg5ZGJiYywweGU5YjVkYmE1KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZjM0OGI1MzgsMHgzOTU2YzI1Yik7CSMgdTY0CisJJmRhdGFfd29yZCgweGI2MDVkMDE5LDB4NTlmMTExZjEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhhZjE5NGY5YiwweDkyM2Y4MmE0KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZGE2ZDgxMTgsMHhhYjFjNWVkNSk7CSMgdTY0CisJJmRhdGFfd29yZCgweGEzMDMwMjQyLDB4ZDgwN2FhOTgpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg0NTcwNmZiZSwweDEyODM1YjAxKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NGVlNGIyOGMsMHgyNDMxODViZSk7CSMgdTY0CisJJmRhdGFfd29yZCgweGQ1ZmZiNGUyLDB4NTUwYzdkYzMpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhmMjdiODk2ZiwweDcyYmU1ZDc0KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4M2IxNjk2YjEsMHg4MGRlYjFmZSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDI1YzcxMjM1LDB4OWJkYzA2YTcpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhjZjY5MjY5NCwweGMxOWJmMTc0KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4OWVmMTRhZDIsMHhlNDliNjljMSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDM4NGYyNWUzLDB4ZWZiZTQ3ODYpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg4YjhjZDViNSwweDBmYzE5ZGM2KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NzdhYzljNjUsMHgyNDBjYTFjYyk7CSMgdTY0CisJJmRhdGFfd29yZCgweDU5MmIwMjc1LDB4MmRlOTJjNmYpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg2ZWE2ZTQ4MywweDRhNzQ4NGFhKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4YmQ0MWZiZDQsMHg1Y2IwYTlkYyk7CSMgdTY0CisJJmRhdGFfd29yZCgweDgzMTE1M2I1LDB4NzZmOTg4ZGEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhlZTY2ZGZhYiwweDk4M2U1MTUyKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MmRiNDMyMTAsMHhhODMxYzY2ZCk7CSMgdTY0CisJJmRhdGFfd29yZCgweDk4ZmIyMTNmLDB4YjAwMzI3YzgpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhiZWVmMGVlNCwweGJmNTk3ZmM3KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4M2RhODhmYzIsMHhjNmUwMGJmMyk7CSMgdTY0CisJJmRhdGFfd29yZCgweDkzMGFhNzI1LDB4ZDVhNzkxNDcpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhlMDAzODI2ZiwweDA2Y2E2MzUxKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MGEwZTZlNzAsMHgxNDI5Mjk2Nyk7CSMgdTY0CisJJmRhdGFfd29yZCgweDQ2ZDIyZmZjLDB4MjdiNzBhODUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg1YzI2YzkyNiwweDJlMWIyMTM4KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NWFjNDJhZWQsMHg0ZDJjNmRmYyk7CSMgdTY0CisJJmRhdGFfd29yZCgweDlkOTViM2RmLDB4NTMzODBkMTMpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg4YmFmNjNkZSwweDY1MGE3MzU0KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4M2M3N2IyYTgsMHg3NjZhMGFiYik7CSMgdTY0CisJJmRhdGFfd29yZCgweDQ3ZWRhZWU2LDB4ODFjMmM5MmUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgxNDgyMzUzYiwweDkyNzIyYzg1KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NGNmMTAzNjQsMHhhMmJmZThhMSk7CSMgdTY0CisJJmRhdGFfd29yZCgweGJjNDIzMDAxLDB4YTgxYTY2NGIpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhkMGY4OTc5MSwweGMyNGI4YjcwKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4MDY1NGJlMzAsMHhjNzZjNTFhMyk7CSMgdTY0CisJJmRhdGFfd29yZCgweGQ2ZWY1MjE4LDB4ZDE5MmU4MTkpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg1NTY1YTkxMCwweGQ2OTkwNjI0KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NTc3MTIwMmEsMHhmNDBlMzU4NSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDMyYmJkMWI4LDB4MTA2YWEwNzApOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhiOGQyZDBjOCwweDE5YTRjMTE2KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NTE0MWFiNTMsMHgxZTM3NmMwOCk7CSMgdTY0CisJJmRhdGFfd29yZCgweGRmOGVlYjk5LDB4Mjc0ODc3NGMpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhlMTliNDhhOCwweDM0YjBiY2I1KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4YzVjOTVhNjMsMHgzOTFjMGNiMyk7CSMgdTY0CisJJmRhdGFfd29yZCgweGUzNDE4YWNiLDB4NGVkOGFhNGEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg3NzYzZTM3MywweDViOWNjYTRmKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZDZiMmI4YTMsMHg2ODJlNmZmMyk7CSMgdTY0CisJJmRhdGFfd29yZCgweDVkZWZiMmZjLDB4NzQ4ZjgyZWUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg0MzE3MmY2MCwweDc4YTU2MzZmKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4YTFmMGFiNzIsMHg4NGM4NzgxNCk7CSMgdTY0CisJJmRhdGFfd29yZCgweDFhNjQzOWVjLDB4OGNjNzAyMDgpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgyMzYzMWUyOCwweDkwYmVmZmZhKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZGU4MmJkZTksMHhhNDUwNmNlYik7CSMgdTY0CisJJmRhdGFfd29yZCgweGIyYzY3OTE1LDB4YmVmOWEzZjcpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhlMzcyNTMyYiwweGM2NzE3OGYyKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZWEyNjYxOWMsMHhjYTI3M2VjZSk7CSMgdTY0CisJJmRhdGFfd29yZCgweDIxYzBjMjA3LDB4ZDE4NmI4YzcpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhjZGUwZWIxZSwweGVhZGE3ZGQ2KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4ZWU2ZWQxNzgsMHhmNTdkNGY3Zik7CSMgdTY0CisJJmRhdGFfd29yZCgweDcyMTc2ZmJhLDB4MDZmMDY3YWEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHhhMmM4OThhNiwweDBhNjM3ZGM1KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4YmVmOTBkYWUsMHgxMTNmOTgwNCk7CSMgdTY0CisJJmRhdGFfd29yZCgweDEzMWM0NzFiLDB4MWI3MTBiMzUpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgyMzA0N2Q4NCwweDI4ZGI3N2Y1KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NDBjNzI0OTMsMHgzMmNhYWI3Yik7CSMgdTY0CisJJmRhdGFfd29yZCgweDE1YzliZWJjLDB4M2M5ZWJlMGEpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHg5YzEwMGQ0YywweDQzMWQ2N2M0KTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4Y2IzZTQyYjYsMHg0Y2M1ZDRiZSk7CSMgdTY0CisJJmRhdGFfd29yZCgweGZjNjU3ZTJhLDB4NTk3ZjI5OWMpOwkjIHU2NAorCSZkYXRhX3dvcmQoMHgzYWQ2ZmFlYywweDVmY2I2ZmFiKTsJIyB1NjQKKwkmZGF0YV93b3JkKDB4NGE0NzU4MTcsMHg2YzQ0MTk4Yyk7CSMgdTY0CismZnVuY3Rpb25fZW5kX0IoInNoYTUxMl9ibG9ja19kYXRhX29yZGVyIik7CismYXNjaXooIlNIQTUxMiBibG9jayB0cmFuc2Zvcm0gZm9yIHg4NiwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIpOworCismYXNtX2ZpbmlzaCgpOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY0LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYmI5NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItYXJtdjQucGwKQEAgLTAsMCArMSwzOTkgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBTSEE1MTIgYmxvY2sgcHJvY2VkdXJlIGZvciBBUk12NC4gU2VwdGVtYmVyIDIwMDcuCisKKyMgVGhpcyBjb2RlIGlzIH40LjUgKGZvdXIgYW5kIGEgaGFsZikgdGltZXMgZmFzdGVyIHRoYW4gY29kZSBnZW5lcmF0ZWQKKyMgYnkgZ2NjIDMuNCBhbmQgaXQgc3BlbmRzIH43MiBjbG9jayBjeWNsZXMgcGVyIGJ5dGUuIAorCisjIEJ5dGUgb3JkZXIgW2luXWRlcGVuZGVuY2UuID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIENhbGxlciBpcyBleHBlY3RlZCB0byBtYWludGFpbiBzcGVjaWZpYyAqZHdvcmQqIG9yZGVyIGluIGhbMC03XSwKKyMgbmFtZWx5IHdpdGggbW9zdCBzaWduaWZpY2FudCBkd29yZCBhdCAqbG93ZXIqIGFkZHJlc3MsIHdoaWNoIGlzCisjIHJlZmxlY3RlZCBpbiBiZWxvdyB0d28gcGFyYW1ldGVycy4gKkJ5dGUqIG9yZGVyIHdpdGhpbiB0aGVzZSBkd29yZHMKKyMgaW4gdHVybiBpcyB3aGF0ZXZlciAqbmF0aXZlKiBieXRlIG9yZGVyIG9uIGN1cnJlbnQgcGxhdGZvcm0uCiskaGk9MDsKKyRsbz00OworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiskb3V0cHV0PXNoaWZ0Oworb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworJGN0eD0icjAiOworJGlucD0icjEiOworJGxlbj0icjIiOworJFRsbz0icjMiOworJFRoaT0icjQiOworJEFsbz0icjUiOworJEFoaT0icjYiOworJEVsbz0icjciOworJEVoaT0icjgiOworJHQwPSJyOSI7CiskdDE9InIxMCI7CiskdDI9InIxMSI7CiskdDM9InIxMiI7CisjIyMjIyMjIyMjIyMJcjEzIGlzIHN0YWNrIHBvaW50ZXIKKyRLdGJsPSJyMTQiOworIyMjIyMjIyMjIyMjCXIxNSBpcyBwcm9ncmFtIGNvdW50ZXIKKworJEFvZmY9OCowOworJEJvZmY9OCoxOworJENvZmY9OCoyOworJERvZmY9OCozOworJEVvZmY9OCo0OworJEZvZmY9OCo1OworJEdvZmY9OCo2OworJEhvZmY9OCo3OworJFhvZmY9OCo4OworCitzdWIgQk9EWV8wMF8xNSgpIHsKK215ICRtYWdpYyA9IHNoaWZ0OworJGNvZGUuPTw8X19fOworCWxkcgkkdDIsW3NwLCMkSG9mZiswXQlAIGgubG8KKwlsZHIJJHQzLFtzcCwjJEhvZmYrNF0JQCBoLmhpCisJQCBTaWdtYTEoeCkJKFJPVFIoKHgpLDE0KSBeIFJPVFIoKHgpLDE4KSAgXiBST1RSKCh4KSw0MSkpCisJQCBMTwkJbG8+PjE0XmhpPDwxOCBeIGxvPj4xOF5oaTw8MTQgXiBoaT4+OV5sbzw8MjMKKwlAIEhJCQloaT4+MTRebG88PDE4IF4gaGk+PjE4XmxvPDwxNCBeIGxvPj45XmhpPDwyMworCW1vdgkkdDAsJEVsbyxsc3IjMTQKKwltb3YJJHQxLCRFaGksbHNyIzE0CisJZW9yCSR0MCwkdDAsJEVoaSxsc2wjMTgKKwllb3IJJHQxLCR0MSwkRWxvLGxzbCMxOAorCWVvcgkkdDAsJHQwLCRFbG8sbHNyIzE4CisJZW9yCSR0MSwkdDEsJEVoaSxsc3IjMTgKKwllb3IJJHQwLCR0MCwkRWhpLGxzbCMxNAorCWVvcgkkdDEsJHQxLCRFbG8sbHNsIzE0CisJZW9yCSR0MCwkdDAsJEVoaSxsc3IjOQorCWVvcgkkdDEsJHQxLCRFbG8sbHNyIzkKKwllb3IJJHQwLCR0MCwkRWxvLGxzbCMyMworCWVvcgkkdDEsJHQxLCRFaGksbHNsIzIzCUAgU2lnbWExKGUpCisJYWRkcwkkVGxvLCRUbG8sJHQwCisJYWRjCSRUaGksJFRoaSwkdDEJCUAgVCArPSBTaWdtYTEoZSkKKwlhZGRzCSRUbG8sJFRsbywkdDIKKwlhZGMJJFRoaSwkVGhpLCR0MwkJQCBUICs9IGgKKworCWxkcgkkdDAsW3NwLCMkRm9mZiswXQlAIGYubG8KKwlsZHIJJHQxLFtzcCwjJEZvZmYrNF0JQCBmLmhpCisJbGRyCSR0Mixbc3AsIyRHb2ZmKzBdCUAgZy5sbworCWxkcgkkdDMsW3NwLCMkR29mZis0XQlAIGcuaGkKKwlzdHIJJEVsbyxbc3AsIyRFb2ZmKzBdCisJc3RyCSRFaGksW3NwLCMkRW9mZis0XQorCXN0cgkkQWxvLFtzcCwjJEFvZmYrMF0KKwlzdHIJJEFoaSxbc3AsIyRBb2ZmKzRdCisKKwllb3IJJHQwLCR0MCwkdDIKKwllb3IJJHQxLCR0MSwkdDMKKwlhbmQJJHQwLCR0MCwkRWxvCisJYW5kCSR0MSwkdDEsJEVoaQorCWVvcgkkdDAsJHQwLCR0MgorCWVvcgkkdDEsJHQxLCR0MwkJQCBDaChlLGYsZykKKworCWxkcgkkdDIsWyRLdGJsLCM0XQkJQCBLW2ldLmxvCisJbGRyCSR0MyxbJEt0YmwsIzBdCQlAIEtbaV0uaGkKKwlsZHIJJEVsbyxbc3AsIyREb2ZmKzBdCUAgZC5sbworCWxkcgkkRWhpLFtzcCwjJERvZmYrNF0JQCBkLmhpCisKKwlhZGRzCSRUbG8sJFRsbywkdDAKKwlhZGMJJFRoaSwkVGhpLCR0MQkJQCBUICs9IENoKGUsZixnKQorCWFkZHMJJFRsbywkVGxvLCR0MgorCWFkYwkkVGhpLCRUaGksJHQzCQlAIFQgKz0gS1tpXQorCWFkZHMJJEVsbywkRWxvLCRUbG8KKwlhZGMJJEVoaSwkRWhpLCRUaGkJCUAgZCArPSBUCisKKwlhbmQJJHQwLCR0MiwjMHhmZgorCXRlcQkkdDAsIyRtYWdpYworCW9ycmVxCSRLdGJsLCRLdGJsLCMxCisKKwlsZHIJJHQyLFtzcCwjJEJvZmYrMF0JQCBiLmxvCisJbGRyCSR0Myxbc3AsIyRDb2ZmKzBdCUAgYy5sbworCUAgU2lnbWEwKHgpCShST1RSKCh4KSwyOCkgXiBST1RSKCh4KSwzNCkgXiBST1RSKCh4KSwzOSkpCisJQCBMTwkJbG8+PjI4XmhpPDw0ICBeIGhpPj4yXmxvPDwzMCBeIGhpPj43XmxvPDwyNQorCUAgSEkJCWhpPj4yOF5sbzw8NCAgXiBsbz4+Ml5oaTw8MzAgXiBsbz4+N15oaTw8MjUKKwltb3YJJHQwLCRBbG8sbHNyIzI4CisJbW92CSR0MSwkQWhpLGxzciMyOAorCWVvcgkkdDAsJHQwLCRBaGksbHNsIzQKKwllb3IJJHQxLCR0MSwkQWxvLGxzbCM0CisJZW9yCSR0MCwkdDAsJEFoaSxsc3IjMgorCWVvcgkkdDEsJHQxLCRBbG8sbHNyIzIKKwllb3IJJHQwLCR0MCwkQWxvLGxzbCMzMAorCWVvcgkkdDEsJHQxLCRBaGksbHNsIzMwCisJZW9yCSR0MCwkdDAsJEFoaSxsc3IjNworCWVvcgkkdDEsJHQxLCRBbG8sbHNyIzcKKwllb3IJJHQwLCR0MCwkQWxvLGxzbCMyNQorCWVvcgkkdDEsJHQxLCRBaGksbHNsIzI1CUAgU2lnbWEwKGEpCisJYWRkcwkkVGxvLCRUbG8sJHQwCisJYWRjCSRUaGksJFRoaSwkdDEJCUAgVCArPSBTaWdtYTAoYSkKKworCWFuZAkkdDAsJEFsbywkdDIKKwlvcnIJJEFsbywkQWxvLCR0MgorCWxkcgkkdDEsW3NwLCMkQm9mZis0XQlAIGIuaGkKKwlsZHIJJHQyLFtzcCwjJENvZmYrNF0JQCBjLmhpCisJYW5kCSRBbG8sJEFsbywkdDMKKwlvcnIJJEFsbywkQWxvLCR0MAkJQCBNYWooYSxiLGMpLmxvCisJYW5kCSR0MywkQWhpLCR0MQorCW9ycgkkQWhpLCRBaGksJHQxCisJYW5kCSRBaGksJEFoaSwkdDIKKwlvcnIJJEFoaSwkQWhpLCR0MwkJQCBNYWooYSxiLGMpLmhpCisJYWRkcwkkQWxvLCRBbG8sJFRsbworCWFkYwkkQWhpLCRBaGksJFRoaQkJQCBoICs9IFQKKworCXN1YglzcCxzcCwjOAorCWFkZAkkS3RibCwkS3RibCwjOAorX19fCit9CiskY29kZT08PF9fXzsKKy50ZXh0CisuY29kZQkzMgorLnR5cGUJSzUxMiwlb2JqZWN0CisuYWxpZ24JNQorSzUxMjoKKy53b3JkCTB4NDI4YTJmOTgsMHhkNzI4YWUyMiwgMHg3MTM3NDQ5MSwweDIzZWY2NWNkCisud29yZAkweGI1YzBmYmNmLDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsMHg4MTg5ZGJiYworLndvcmQJMHgzOTU2YzI1YiwweGYzNDhiNTM4LCAweDU5ZjExMWYxLDB4YjYwNWQwMTkKKy53b3JkCTB4OTIzZjgyYTQsMHhhZjE5NGY5YiwgMHhhYjFjNWVkNSwweGRhNmQ4MTE4Cisud29yZAkweGQ4MDdhYTk4LDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsMHg0NTcwNmZiZQorLndvcmQJMHgyNDMxODViZSwweDRlZTRiMjhjLCAweDU1MGM3ZGMzLDB4ZDVmZmI0ZTIKKy53b3JkCTB4NzJiZTVkNzQsMHhmMjdiODk2ZiwgMHg4MGRlYjFmZSwweDNiMTY5NmIxCisud29yZAkweDliZGMwNmE3LDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsMHhjZjY5MjY5NAorLndvcmQJMHhlNDliNjljMSwweDllZjE0YWQyLCAweGVmYmU0Nzg2LDB4Mzg0ZjI1ZTMKKy53b3JkCTB4MGZjMTlkYzYsMHg4YjhjZDViNSwgMHgyNDBjYTFjYywweDc3YWM5YzY1Cisud29yZAkweDJkZTkyYzZmLDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsMHg2ZWE2ZTQ4MworLndvcmQJMHg1Y2IwYTlkYywweGJkNDFmYmQ0LCAweDc2Zjk4OGRhLDB4ODMxMTUzYjUKKy53b3JkCTB4OTgzZTUxNTIsMHhlZTY2ZGZhYiwgMHhhODMxYzY2ZCwweDJkYjQzMjEwCisud29yZAkweGIwMDMyN2M4LDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsMHhiZWVmMGVlNAorLndvcmQJMHhjNmUwMGJmMywweDNkYTg4ZmMyLCAweGQ1YTc5MTQ3LDB4OTMwYWE3MjUKKy53b3JkCTB4MDZjYTYzNTEsMHhlMDAzODI2ZiwgMHgxNDI5Mjk2NywweDBhMGU2ZTcwCisud29yZAkweDI3YjcwYTg1LDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsMHg1YzI2YzkyNgorLndvcmQJMHg0ZDJjNmRmYywweDVhYzQyYWVkLCAweDUzMzgwZDEzLDB4OWQ5NWIzZGYKKy53b3JkCTB4NjUwYTczNTQsMHg4YmFmNjNkZSwgMHg3NjZhMGFiYiwweDNjNzdiMmE4Cisud29yZAkweDgxYzJjOTJlLDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsMHgxNDgyMzUzYgorLndvcmQJMHhhMmJmZThhMSwweDRjZjEwMzY0LCAweGE4MWE2NjRiLDB4YmM0MjMwMDEKKy53b3JkCTB4YzI0YjhiNzAsMHhkMGY4OTc5MSwgMHhjNzZjNTFhMywweDA2NTRiZTMwCisud29yZAkweGQxOTJlODE5LDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsMHg1NTY1YTkxMAorLndvcmQJMHhmNDBlMzU4NSwweDU3NzEyMDJhLCAweDEwNmFhMDcwLDB4MzJiYmQxYjgKKy53b3JkCTB4MTlhNGMxMTYsMHhiOGQyZDBjOCwgMHgxZTM3NmMwOCwweDUxNDFhYjUzCisud29yZAkweDI3NDg3NzRjLDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsMHhlMTliNDhhOAorLndvcmQJMHgzOTFjMGNiMywweGM1Yzk1YTYzLCAweDRlZDhhYTRhLDB4ZTM0MThhY2IKKy53b3JkCTB4NWI5Y2NhNGYsMHg3NzYzZTM3MywgMHg2ODJlNmZmMywweGQ2YjJiOGEzCisud29yZAkweDc0OGY4MmVlLDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsMHg0MzE3MmY2MAorLndvcmQJMHg4NGM4NzgxNCwweGExZjBhYjcyLCAweDhjYzcwMjA4LDB4MWE2NDM5ZWMKKy53b3JkCTB4OTBiZWZmZmEsMHgyMzYzMWUyOCwgMHhhNDUwNmNlYiwweGRlODJiZGU5Cisud29yZAkweGJlZjlhM2Y3LDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsMHhlMzcyNTMyYgorLndvcmQJMHhjYTI3M2VjZSwweGVhMjY2MTljLCAweGQxODZiOGM3LDB4MjFjMGMyMDcKKy53b3JkCTB4ZWFkYTdkZDYsMHhjZGUwZWIxZSwgMHhmNTdkNGY3ZiwweGVlNmVkMTc4Cisud29yZAkweDA2ZjA2N2FhLDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsMHhhMmM4OThhNgorLndvcmQJMHgxMTNmOTgwNCwweGJlZjkwZGFlLCAweDFiNzEwYjM1LDB4MTMxYzQ3MWIKKy53b3JkCTB4MjhkYjc3ZjUsMHgyMzA0N2Q4NCwgMHgzMmNhYWI3YiwweDQwYzcyNDkzCisud29yZAkweDNjOWViZTBhLDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsMHg5YzEwMGQ0YworLndvcmQJMHg0Y2M1ZDRiZSwweGNiM2U0MmI2LCAweDU5N2YyOTljLDB4ZmM2NTdlMmEKKy53b3JkCTB4NWZjYjZmYWIsMHgzYWQ2ZmFlYywgMHg2YzQ0MTk4YywweDRhNDc1ODE3Cisuc2l6ZQlLNTEyLC4tSzUxMgorCisuZ2xvYmFsCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyCisudHlwZQlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciwlZnVuY3Rpb24KK3NoYTUxMl9ibG9ja19kYXRhX29yZGVyOgorCXN1YglyMyxwYywjOAkJQCBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorCWFkZAkkbGVuLCRpbnAsJGxlbixsc2wjNwlAIGxlbiB0byBwb2ludCBhdCB0aGUgZW5kIG9mIGlucAorCXN0bWRiCXNwISx7cjQtcjEyLGxyfQorCXN1YgkkS3RibCxyMywjNjQwCQlAIEs1MTIKKwlzdWIJc3Asc3AsIzkqOAorCisJbGRyCSRFbG8sWyRjdHgsIyRFb2ZmKyRsb10KKwlsZHIJJEVoaSxbJGN0eCwjJEVvZmYrJGhpXQorCWxkcgkkdDAsIFskY3R4LCMkR29mZiskbG9dCisJbGRyCSR0MSwgWyRjdHgsIyRHb2ZmKyRoaV0KKwlsZHIJJHQyLCBbJGN0eCwjJEhvZmYrJGxvXQorCWxkcgkkdDMsIFskY3R4LCMkSG9mZiskaGldCisuTG9vcDoKKwlzdHIJJHQwLCBbc3AsIyRHb2ZmKzBdCisJc3RyCSR0MSwgW3NwLCMkR29mZis0XQorCXN0cgkkdDIsIFtzcCwjJEhvZmYrMF0KKwlzdHIJJHQzLCBbc3AsIyRIb2ZmKzRdCisJbGRyCSRBbG8sWyRjdHgsIyRBb2ZmKyRsb10KKwlsZHIJJEFoaSxbJGN0eCwjJEFvZmYrJGhpXQorCWxkcgkkVGxvLFskY3R4LCMkQm9mZiskbG9dCisJbGRyCSRUaGksWyRjdHgsIyRCb2ZmKyRoaV0KKwlsZHIJJHQwLCBbJGN0eCwjJENvZmYrJGxvXQorCWxkcgkkdDEsIFskY3R4LCMkQ29mZiskaGldCisJbGRyCSR0MiwgWyRjdHgsIyREb2ZmKyRsb10KKwlsZHIJJHQzLCBbJGN0eCwjJERvZmYrJGhpXQorCXN0cgkkVGxvLFtzcCwjJEJvZmYrMF0KKwlzdHIJJFRoaSxbc3AsIyRCb2ZmKzRdCisJc3RyCSR0MCwgW3NwLCMkQ29mZiswXQorCXN0cgkkdDEsIFtzcCwjJENvZmYrNF0KKwlzdHIJJHQyLCBbc3AsIyREb2ZmKzBdCisJc3RyCSR0MywgW3NwLCMkRG9mZis0XQorCWxkcgkkVGxvLFskY3R4LCMkRm9mZiskbG9dCisJbGRyCSRUaGksWyRjdHgsIyRGb2ZmKyRoaV0KKwlzdHIJJFRsbyxbc3AsIyRGb2ZmKzBdCisJc3RyCSRUaGksW3NwLCMkRm9mZis0XQorCisuTDAwXzE1OgorCWxkcmIJJFRsbyxbJGlucCwjN10KKwlsZHJiCSR0MCwgWyRpbnAsIzZdCisJbGRyYgkkdDEsIFskaW5wLCM1XQorCWxkcmIJJHQyLCBbJGlucCwjNF0KKwlsZHJiCSRUaGksWyRpbnAsIzNdCisJbGRyYgkkdDMsIFskaW5wLCMyXQorCW9ycgkkVGxvLCRUbG8sJHQwLGxzbCM4CisJbGRyYgkkdDAsIFskaW5wLCMxXQorCW9ycgkkVGxvLCRUbG8sJHQxLGxzbCMxNgorCWxkcmIJJHQxLCBbJGlucF0sIzgKKwlvcnIJJFRsbywkVGxvLCR0Mixsc2wjMjQKKwlvcnIJJFRoaSwkVGhpLCR0Myxsc2wjOAorCW9ycgkkVGhpLCRUaGksJHQwLGxzbCMxNgorCW9ycgkkVGhpLCRUaGksJHQxLGxzbCMyNAorCXN0cgkkVGxvLFtzcCwjJFhvZmYrMF0KKwlzdHIJJFRoaSxbc3AsIyRYb2ZmKzRdCitfX18KKwkmQk9EWV8wMF8xNSgweDk0KTsKKyRjb2RlLj08PF9fXzsKKwl0c3QJJEt0YmwsIzEKKwliZXEJLkwwMF8xNQorCWJpYwkkS3RibCwkS3RibCwjMQorCisuTDE2Xzc5OgorCWxkcgkkdDAsW3NwLCNgJFhvZmYrOCooMTYtMSlgKzBdCisJbGRyCSR0MSxbc3AsI2AkWG9mZis4KigxNi0xKWArNF0KKwlsZHIJJHQyLFtzcCwjYCRYb2ZmKzgqKDE2LTE0KWArMF0KKwlsZHIJJHQzLFtzcCwjYCRYb2ZmKzgqKDE2LTE0KWArNF0KKworCUAgc2lnbWEwKHgpCShST1RSKCh4KSwxKSAgXiBST1RSKCh4KSw4KSAgXiAoKHgpPj43KSkKKwlAIExPCQlsbz4+MV5oaTw8MzEgIF4gbG8+PjheaGk8PDI0IF4gbG8+PjdeaGk8PDI1CisJQCBISQkJaGk+PjFebG88PDMxICBeIGhpPj44XmxvPDwyNCBeIGhpPj43CisJbW92CSRUbG8sJHQwLGxzciMxCisJbW92CSRUaGksJHQxLGxzciMxCisJZW9yCSRUbG8sJFRsbywkdDEsbHNsIzMxCisJZW9yCSRUaGksJFRoaSwkdDAsbHNsIzMxCisJZW9yCSRUbG8sJFRsbywkdDAsbHNyIzgKKwllb3IJJFRoaSwkVGhpLCR0MSxsc3IjOAorCWVvcgkkVGxvLCRUbG8sJHQxLGxzbCMyNAorCWVvcgkkVGhpLCRUaGksJHQwLGxzbCMyNAorCWVvcgkkVGxvLCRUbG8sJHQwLGxzciM3CisJZW9yCSRUaGksJFRoaSwkdDEsbHNyIzcKKwllb3IJJFRsbywkVGxvLCR0MSxsc2wjMjUKKworCUAgc2lnbWExKHgpCShST1RSKCh4KSwxOSkgXiBST1RSKCh4KSw2MSkgXiAoKHgpPj42KSkKKwlAIExPCQlsbz4+MTleaGk8PDEzIF4gaGk+PjI5XmxvPDwzIF4gbG8+PjZeaGk8PDI2CisJQCBISQkJaGk+PjE5XmxvPDwxMyBeIGxvPj4yOV5oaTw8MyBeIGhpPj42CisJbW92CSR0MCwkdDIsbHNyIzE5CisJbW92CSR0MSwkdDMsbHNyIzE5CisJZW9yCSR0MCwkdDAsJHQzLGxzbCMxMworCWVvcgkkdDEsJHQxLCR0Mixsc2wjMTMKKwllb3IJJHQwLCR0MCwkdDMsbHNyIzI5CisJZW9yCSR0MSwkdDEsJHQyLGxzciMyOQorCWVvcgkkdDAsJHQwLCR0Mixsc2wjMworCWVvcgkkdDEsJHQxLCR0Myxsc2wjMworCWVvcgkkdDAsJHQwLCR0Mixsc3IjNgorCWVvcgkkdDEsJHQxLCR0Myxsc3IjNgorCWVvcgkkdDAsJHQwLCR0Myxsc2wjMjYKKworCWxkcgkkdDIsW3NwLCNgJFhvZmYrOCooMTYtOSlgKzBdCisJbGRyCSR0Myxbc3AsI2AkWG9mZis4KigxNi05KWArNF0KKwlhZGRzCSRUbG8sJFRsbywkdDAKKwlhZGMJJFRoaSwkVGhpLCR0MQorCisJbGRyCSR0MCxbc3AsI2AkWG9mZis4KjE2YCswXQorCWxkcgkkdDEsW3NwLCNgJFhvZmYrOCoxNmArNF0KKwlhZGRzCSRUbG8sJFRsbywkdDIKKwlhZGMJJFRoaSwkVGhpLCR0MworCWFkZHMJJFRsbywkVGxvLCR0MAorCWFkYwkkVGhpLCRUaGksJHQxCisJc3RyCSRUbG8sW3NwLCMkWG9mZiswXQorCXN0cgkkVGhpLFtzcCwjJFhvZmYrNF0KK19fXworCSZCT0RZXzAwXzE1KDB4MTcpOworJGNvZGUuPTw8X19fOworCXRzdAkkS3RibCwjMQorCWJlcQkuTDE2Xzc5CisJYmljCSRLdGJsLCRLdGJsLCMxCisKKwlsZHIJJFRsbyxbc3AsIyRCb2ZmKzBdCisJbGRyCSRUaGksW3NwLCMkQm9mZis0XQorCWxkcgkkdDAsIFskY3R4LCMkQW9mZiskbG9dCisJbGRyCSR0MSwgWyRjdHgsIyRBb2ZmKyRoaV0KKwlsZHIJJHQyLCBbJGN0eCwjJEJvZmYrJGxvXQorCWxkcgkkdDMsIFskY3R4LCMkQm9mZiskaGldCisJYWRkcwkkdDAsJEFsbywkdDAKKwlhZGMJJHQxLCRBaGksJHQxCisJYWRkcwkkdDIsJFRsbywkdDIKKwlhZGMJJHQzLCRUaGksJHQzCisJc3RyCSR0MCwgWyRjdHgsIyRBb2ZmKyRsb10KKwlzdHIJJHQxLCBbJGN0eCwjJEFvZmYrJGhpXQorCXN0cgkkdDIsIFskY3R4LCMkQm9mZiskbG9dCisJc3RyCSR0MywgWyRjdHgsIyRCb2ZmKyRoaV0KKworCWxkcgkkQWxvLFtzcCwjJENvZmYrMF0KKwlsZHIJJEFoaSxbc3AsIyRDb2ZmKzRdCisJbGRyCSRUbG8sW3NwLCMkRG9mZiswXQorCWxkcgkkVGhpLFtzcCwjJERvZmYrNF0KKwlsZHIJJHQwLCBbJGN0eCwjJENvZmYrJGxvXQorCWxkcgkkdDEsIFskY3R4LCMkQ29mZiskaGldCisJbGRyCSR0MiwgWyRjdHgsIyREb2ZmKyRsb10KKwlsZHIJJHQzLCBbJGN0eCwjJERvZmYrJGhpXQorCWFkZHMJJHQwLCRBbG8sJHQwCisJYWRjCSR0MSwkQWhpLCR0MQorCWFkZHMJJHQyLCRUbG8sJHQyCisJYWRjCSR0MywkVGhpLCR0MworCXN0cgkkdDAsIFskY3R4LCMkQ29mZiskbG9dCisJc3RyCSR0MSwgWyRjdHgsIyRDb2ZmKyRoaV0KKwlzdHIJJHQyLCBbJGN0eCwjJERvZmYrJGxvXQorCXN0cgkkdDMsIFskY3R4LCMkRG9mZiskaGldCisKKwlsZHIJJFRsbyxbc3AsIyRGb2ZmKzBdCisJbGRyCSRUaGksW3NwLCMkRm9mZis0XQorCWxkcgkkdDAsIFskY3R4LCMkRW9mZiskbG9dCisJbGRyCSR0MSwgWyRjdHgsIyRFb2ZmKyRoaV0KKwlsZHIJJHQyLCBbJGN0eCwjJEZvZmYrJGxvXQorCWxkcgkkdDMsIFskY3R4LCMkRm9mZiskaGldCisJYWRkcwkkRWxvLCRFbG8sJHQwCisJYWRjCSRFaGksJEVoaSwkdDEKKwlhZGRzCSR0MiwkVGxvLCR0MgorCWFkYwkkdDMsJFRoaSwkdDMKKwlzdHIJJEVsbyxbJGN0eCwjJEVvZmYrJGxvXQorCXN0cgkkRWhpLFskY3R4LCMkRW9mZiskaGldCisJc3RyCSR0MiwgWyRjdHgsIyRGb2ZmKyRsb10KKwlzdHIJJHQzLCBbJGN0eCwjJEZvZmYrJGhpXQorCisJbGRyCSRBbG8sW3NwLCMkR29mZiswXQorCWxkcgkkQWhpLFtzcCwjJEdvZmYrNF0KKwlsZHIJJFRsbyxbc3AsIyRIb2ZmKzBdCisJbGRyCSRUaGksW3NwLCMkSG9mZis0XQorCWxkcgkkdDAsIFskY3R4LCMkR29mZiskbG9dCisJbGRyCSR0MSwgWyRjdHgsIyRHb2ZmKyRoaV0KKwlsZHIJJHQyLCBbJGN0eCwjJEhvZmYrJGxvXQorCWxkcgkkdDMsIFskY3R4LCMkSG9mZiskaGldCisJYWRkcwkkdDAsJEFsbywkdDAKKwlhZGMJJHQxLCRBaGksJHQxCisJYWRkcwkkdDIsJFRsbywkdDIKKwlhZGMJJHQzLCRUaGksJHQzCisJc3RyCSR0MCwgWyRjdHgsIyRHb2ZmKyRsb10KKwlzdHIJJHQxLCBbJGN0eCwjJEdvZmYrJGhpXQorCXN0cgkkdDIsIFskY3R4LCMkSG9mZiskbG9dCisJc3RyCSR0MywgWyRjdHgsIyRIb2ZmKyRoaV0KKworCWFkZAlzcCxzcCwjNjQwCisJc3ViCSRLdGJsLCRLdGJsLCM2NDAKKworCXRlcQkkaW5wLCRsZW4KKwlibmUJLkxvb3AKKworCWFkZAlzcCxzcCwjOCo5CQlAIGRlc3Ryb3kgZnJhbWUKKwlsZG1pYQlzcCEse3I0LXIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0CisJYngJbHIJCQlAIGludGVyb3BlcmFibGUgd2l0aCBUaHVtYiBJU0E6LSkKKy5zaXplICAgc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIsLi1zaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLmFzY2l6ICAiU0hBNTEyIGJsb2NrIHRyYW5zZm9ybSBmb3IgQVJNdjQsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24JMgorX19fCisKKyRjb2RlID1+IHMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VtOworJGNvZGUgPX4gcy9cYmJ4XHMrbHJcYi8ud29yZFx0MHhlMTJmZmYxZS9nbTsJIyBtYWtlIGl0IHBvc3NpYmxlIHRvIGNvbXBpbGUgd2l0aCAtbWFyY2g9YXJtdjQKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOyAjIGVuZm9yY2UgZmx1c2gKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12NC5zIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY0LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiZjliNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12NC5zCkBAIC0wLDAgKzEsNDE2IEBACisudGV4dAorLmNvZGUJMzIKKy50eXBlCUs1MTIsJW9iamVjdAorLmFsaWduCTUKK0s1MTI6Cisud29yZAkweDQyOGEyZjk4LDB4ZDcyOGFlMjIsIDB4NzEzNzQ0OTEsMHgyM2VmNjVjZAorLndvcmQJMHhiNWMwZmJjZiwweGVjNGQzYjJmLCAweGU5YjVkYmE1LDB4ODE4OWRiYmMKKy53b3JkCTB4Mzk1NmMyNWIsMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwweGI2MDVkMDE5Cisud29yZAkweDkyM2Y4MmE0LDB4YWYxOTRmOWIsIDB4YWIxYzVlZDUsMHhkYTZkODExOAorLndvcmQJMHhkODA3YWE5OCwweGEzMDMwMjQyLCAweDEyODM1YjAxLDB4NDU3MDZmYmUKKy53b3JkCTB4MjQzMTg1YmUsMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywweGQ1ZmZiNGUyCisud29yZAkweDcyYmU1ZDc0LDB4ZjI3Yjg5NmYsIDB4ODBkZWIxZmUsMHgzYjE2OTZiMQorLndvcmQJMHg5YmRjMDZhNywweDI1YzcxMjM1LCAweGMxOWJmMTc0LDB4Y2Y2OTI2OTQKKy53b3JkCTB4ZTQ5YjY5YzEsMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwweDM4NGYyNWUzCisud29yZAkweDBmYzE5ZGM2LDB4OGI4Y2Q1YjUsIDB4MjQwY2ExY2MsMHg3N2FjOWM2NQorLndvcmQJMHgyZGU5MmM2ZiwweDU5MmIwMjc1LCAweDRhNzQ4NGFhLDB4NmVhNmU0ODMKKy53b3JkCTB4NWNiMGE5ZGMsMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwweDgzMTE1M2I1Cisud29yZAkweDk4M2U1MTUyLDB4ZWU2NmRmYWIsIDB4YTgzMWM2NmQsMHgyZGI0MzIxMAorLndvcmQJMHhiMDAzMjdjOCwweDk4ZmIyMTNmLCAweGJmNTk3ZmM3LDB4YmVlZjBlZTQKKy53b3JkCTB4YzZlMDBiZjMsMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywweDkzMGFhNzI1Cisud29yZAkweDA2Y2E2MzUxLDB4ZTAwMzgyNmYsIDB4MTQyOTI5NjcsMHgwYTBlNmU3MAorLndvcmQJMHgyN2I3MGE4NSwweDQ2ZDIyZmZjLCAweDJlMWIyMTM4LDB4NWMyNmM5MjYKKy53b3JkCTB4NGQyYzZkZmMsMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywweDlkOTViM2RmCisud29yZAkweDY1MGE3MzU0LDB4OGJhZjYzZGUsIDB4NzY2YTBhYmIsMHgzYzc3YjJhOAorLndvcmQJMHg4MWMyYzkyZSwweDQ3ZWRhZWU2LCAweDkyNzIyYzg1LDB4MTQ4MjM1M2IKKy53b3JkCTB4YTJiZmU4YTEsMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwweGJjNDIzMDAxCisud29yZAkweGMyNGI4YjcwLDB4ZDBmODk3OTEsIDB4Yzc2YzUxYTMsMHgwNjU0YmUzMAorLndvcmQJMHhkMTkyZTgxOSwweGQ2ZWY1MjE4LCAweGQ2OTkwNjI0LDB4NTU2NWE5MTAKKy53b3JkCTB4ZjQwZTM1ODUsMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwweDMyYmJkMWI4Cisud29yZAkweDE5YTRjMTE2LDB4YjhkMmQwYzgsIDB4MWUzNzZjMDgsMHg1MTQxYWI1MworLndvcmQJMHgyNzQ4Nzc0YywweGRmOGVlYjk5LCAweDM0YjBiY2I1LDB4ZTE5YjQ4YTgKKy53b3JkCTB4MzkxYzBjYjMsMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwweGUzNDE4YWNiCisud29yZAkweDViOWNjYTRmLDB4Nzc2M2UzNzMsIDB4NjgyZTZmZjMsMHhkNmIyYjhhMworLndvcmQJMHg3NDhmODJlZSwweDVkZWZiMmZjLCAweDc4YTU2MzZmLDB4NDMxNzJmNjAKKy53b3JkCTB4ODRjODc4MTQsMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwweDFhNjQzOWVjCisud29yZAkweDkwYmVmZmZhLDB4MjM2MzFlMjgsIDB4YTQ1MDZjZWIsMHhkZTgyYmRlOQorLndvcmQJMHhiZWY5YTNmNywweGIyYzY3OTE1LCAweGM2NzE3OGYyLDB4ZTM3MjUzMmIKKy53b3JkCTB4Y2EyNzNlY2UsMHhlYTI2NjE5YywgMHhkMTg2YjhjNywweDIxYzBjMjA3Cisud29yZAkweGVhZGE3ZGQ2LDB4Y2RlMGViMWUsIDB4ZjU3ZDRmN2YsMHhlZTZlZDE3OAorLndvcmQJMHgwNmYwNjdhYSwweDcyMTc2ZmJhLCAweDBhNjM3ZGM1LDB4YTJjODk4YTYKKy53b3JkCTB4MTEzZjk4MDQsMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwweDEzMWM0NzFiCisud29yZAkweDI4ZGI3N2Y1LDB4MjMwNDdkODQsIDB4MzJjYWFiN2IsMHg0MGM3MjQ5MworLndvcmQJMHgzYzllYmUwYSwweDE1YzliZWJjLCAweDQzMWQ2N2M0LDB4OWMxMDBkNGMKKy53b3JkCTB4NGNjNWQ0YmUsMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywweGZjNjU3ZTJhCisud29yZAkweDVmY2I2ZmFiLDB4M2FkNmZhZWMsIDB4NmM0NDE5OGMsMHg0YTQ3NTgxNworLnNpemUJSzUxMiwuLUs1MTIKKworLmdsb2JhbAlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIsJWZ1bmN0aW9uCitzaGE1MTJfYmxvY2tfZGF0YV9vcmRlcjoKKwlzdWIJcjMscGMsIzgJCUAgc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIKKwlhZGQJcjIscjEscjIsbHNsIzcJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKwlzdG1kYglzcCEse3I0LXIxMixscn0KKwlzdWIJcjE0LHIzLCM2NDAJCUAgSzUxMgorCXN1YglzcCxzcCwjOSo4CisKKwlsZHIJcjcsW3IwLCMzMis0XQorCWxkcglyOCxbcjAsIzMyKzBdCisJbGRyCXI5LCBbcjAsIzQ4KzRdCisJbGRyCXIxMCwgW3IwLCM0OCswXQorCWxkcglyMTEsIFtyMCwjNTYrNF0KKwlsZHIJcjEyLCBbcjAsIzU2KzBdCisuTG9vcDoKKwlzdHIJcjksIFtzcCwjNDgrMF0KKwlzdHIJcjEwLCBbc3AsIzQ4KzRdCisJc3RyCXIxMSwgW3NwLCM1NiswXQorCXN0cglyMTIsIFtzcCwjNTYrNF0KKwlsZHIJcjUsW3IwLCMwKzRdCisJbGRyCXI2LFtyMCwjMCswXQorCWxkcglyMyxbcjAsIzgrNF0KKwlsZHIJcjQsW3IwLCM4KzBdCisJbGRyCXI5LCBbcjAsIzE2KzRdCisJbGRyCXIxMCwgW3IwLCMxNiswXQorCWxkcglyMTEsIFtyMCwjMjQrNF0KKwlsZHIJcjEyLCBbcjAsIzI0KzBdCisJc3RyCXIzLFtzcCwjOCswXQorCXN0cglyNCxbc3AsIzgrNF0KKwlzdHIJcjksIFtzcCwjMTYrMF0KKwlzdHIJcjEwLCBbc3AsIzE2KzRdCisJc3RyCXIxMSwgW3NwLCMyNCswXQorCXN0cglyMTIsIFtzcCwjMjQrNF0KKwlsZHIJcjMsW3IwLCM0MCs0XQorCWxkcglyNCxbcjAsIzQwKzBdCisJc3RyCXIzLFtzcCwjNDArMF0KKwlzdHIJcjQsW3NwLCM0MCs0XQorCisuTDAwXzE1OgorCWxkcmIJcjMsW3IxLCM3XQorCWxkcmIJcjksIFtyMSwjNl0KKwlsZHJiCXIxMCwgW3IxLCM1XQorCWxkcmIJcjExLCBbcjEsIzRdCisJbGRyYglyNCxbcjEsIzNdCisJbGRyYglyMTIsIFtyMSwjMl0KKwlvcnIJcjMscjMscjksbHNsIzgKKwlsZHJiCXI5LCBbcjEsIzFdCisJb3JyCXIzLHIzLHIxMCxsc2wjMTYKKwlsZHJiCXIxMCwgW3IxXSwjOAorCW9ycglyMyxyMyxyMTEsbHNsIzI0CisJb3JyCXI0LHI0LHIxMixsc2wjOAorCW9ycglyNCxyNCxyOSxsc2wjMTYKKwlvcnIJcjQscjQscjEwLGxzbCMyNAorCXN0cglyMyxbc3AsIzY0KzBdCisJc3RyCXI0LFtzcCwjNjQrNF0KKwlsZHIJcjExLFtzcCwjNTYrMF0JQCBoLmxvCisJbGRyCXIxMixbc3AsIzU2KzRdCUAgaC5oaQorCUAgU2lnbWExKHgpCShST1RSKCh4KSwxNCkgXiBST1RSKCh4KSwxOCkgIF4gUk9UUigoeCksNDEpKQorCUAgTE8JCWxvPj4xNF5oaTw8MTggXiBsbz4+MTheaGk8PDE0IF4gaGk+PjlebG88PDIzCisJQCBISQkJaGk+PjE0XmxvPDwxOCBeIGhpPj4xOF5sbzw8MTQgXiBsbz4+OV5oaTw8MjMKKwltb3YJcjkscjcsbHNyIzE0CisJbW92CXIxMCxyOCxsc3IjMTQKKwllb3IJcjkscjkscjgsbHNsIzE4CisJZW9yCXIxMCxyMTAscjcsbHNsIzE4CisJZW9yCXI5LHI5LHI3LGxzciMxOAorCWVvcglyMTAscjEwLHI4LGxzciMxOAorCWVvcglyOSxyOSxyOCxsc2wjMTQKKwllb3IJcjEwLHIxMCxyNyxsc2wjMTQKKwllb3IJcjkscjkscjgsbHNyIzkKKwllb3IJcjEwLHIxMCxyNyxsc3IjOQorCWVvcglyOSxyOSxyNyxsc2wjMjMKKwllb3IJcjEwLHIxMCxyOCxsc2wjMjMJQCBTaWdtYTEoZSkKKwlhZGRzCXIzLHIzLHI5CisJYWRjCXI0LHI0LHIxMAkJQCBUICs9IFNpZ21hMShlKQorCWFkZHMJcjMscjMscjExCisJYWRjCXI0LHI0LHIxMgkJQCBUICs9IGgKKworCWxkcglyOSxbc3AsIzQwKzBdCUAgZi5sbworCWxkcglyMTAsW3NwLCM0MCs0XQlAIGYuaGkKKwlsZHIJcjExLFtzcCwjNDgrMF0JQCBnLmxvCisJbGRyCXIxMixbc3AsIzQ4KzRdCUAgZy5oaQorCXN0cglyNyxbc3AsIzMyKzBdCisJc3RyCXI4LFtzcCwjMzIrNF0KKwlzdHIJcjUsW3NwLCMwKzBdCisJc3RyCXI2LFtzcCwjMCs0XQorCisJZW9yCXI5LHI5LHIxMQorCWVvcglyMTAscjEwLHIxMgorCWFuZAlyOSxyOSxyNworCWFuZAlyMTAscjEwLHI4CisJZW9yCXI5LHI5LHIxMQorCWVvcglyMTAscjEwLHIxMgkJQCBDaChlLGYsZykKKworCWxkcglyMTEsW3IxNCwjNF0JCUAgS1tpXS5sbworCWxkcglyMTIsW3IxNCwjMF0JCUAgS1tpXS5oaQorCWxkcglyNyxbc3AsIzI0KzBdCUAgZC5sbworCWxkcglyOCxbc3AsIzI0KzRdCUAgZC5oaQorCisJYWRkcwlyMyxyMyxyOQorCWFkYwlyNCxyNCxyMTAJCUAgVCArPSBDaChlLGYsZykKKwlhZGRzCXIzLHIzLHIxMQorCWFkYwlyNCxyNCxyMTIJCUAgVCArPSBLW2ldCisJYWRkcwlyNyxyNyxyMworCWFkYwlyOCxyOCxyNAkJQCBkICs9IFQKKworCWFuZAlyOSxyMTEsIzB4ZmYKKwl0ZXEJcjksIzE0OAorCW9ycmVxCXIxNCxyMTQsIzEKKworCWxkcglyMTEsW3NwLCM4KzBdCUAgYi5sbworCWxkcglyMTIsW3NwLCMxNiswXQlAIGMubG8KKwlAIFNpZ21hMCh4KQkoUk9UUigoeCksMjgpIF4gUk9UUigoeCksMzQpIF4gUk9UUigoeCksMzkpKQorCUAgTE8JCWxvPj4yOF5oaTw8NCAgXiBoaT4+Ml5sbzw8MzAgXiBoaT4+N15sbzw8MjUKKwlAIEhJCQloaT4+MjhebG88PDQgIF4gbG8+PjJeaGk8PDMwIF4gbG8+PjdeaGk8PDI1CisJbW92CXI5LHI1LGxzciMyOAorCW1vdglyMTAscjYsbHNyIzI4CisJZW9yCXI5LHI5LHI2LGxzbCM0CisJZW9yCXIxMCxyMTAscjUsbHNsIzQKKwllb3IJcjkscjkscjYsbHNyIzIKKwllb3IJcjEwLHIxMCxyNSxsc3IjMgorCWVvcglyOSxyOSxyNSxsc2wjMzAKKwllb3IJcjEwLHIxMCxyNixsc2wjMzAKKwllb3IJcjkscjkscjYsbHNyIzcKKwllb3IJcjEwLHIxMCxyNSxsc3IjNworCWVvcglyOSxyOSxyNSxsc2wjMjUKKwllb3IJcjEwLHIxMCxyNixsc2wjMjUJQCBTaWdtYTAoYSkKKwlhZGRzCXIzLHIzLHI5CisJYWRjCXI0LHI0LHIxMAkJQCBUICs9IFNpZ21hMChhKQorCisJYW5kCXI5LHI1LHIxMQorCW9ycglyNSxyNSxyMTEKKwlsZHIJcjEwLFtzcCwjOCs0XQlAIGIuaGkKKwlsZHIJcjExLFtzcCwjMTYrNF0JQCBjLmhpCisJYW5kCXI1LHI1LHIxMgorCW9ycglyNSxyNSxyOQkJQCBNYWooYSxiLGMpLmxvCisJYW5kCXIxMixyNixyMTAKKwlvcnIJcjYscjYscjEwCisJYW5kCXI2LHI2LHIxMQorCW9ycglyNixyNixyMTIJCUAgTWFqKGEsYixjKS5oaQorCWFkZHMJcjUscjUscjMKKwlhZGMJcjYscjYscjQJCUAgaCArPSBUCisKKwlzdWIJc3Asc3AsIzgKKwlhZGQJcjE0LHIxNCwjOAorCXRzdAlyMTQsIzEKKwliZXEJLkwwMF8xNQorCWJpYwlyMTQscjE0LCMxCisKKy5MMTZfNzk6CisJbGRyCXI5LFtzcCwjMTg0KzBdCisJbGRyCXIxMCxbc3AsIzE4NCs0XQorCWxkcglyMTEsW3NwLCM4MCswXQorCWxkcglyMTIsW3NwLCM4MCs0XQorCisJQCBzaWdtYTAoeCkJKFJPVFIoKHgpLDEpICBeIFJPVFIoKHgpLDgpICBeICgoeCk+PjcpKQorCUAgTE8JCWxvPj4xXmhpPDwzMSAgXiBsbz4+OF5oaTw8MjQgXiBsbz4+N15oaTw8MjUKKwlAIEhJCQloaT4+MV5sbzw8MzEgIF4gaGk+PjhebG88PDI0IF4gaGk+PjcKKwltb3YJcjMscjksbHNyIzEKKwltb3YJcjQscjEwLGxzciMxCisJZW9yCXIzLHIzLHIxMCxsc2wjMzEKKwllb3IJcjQscjQscjksbHNsIzMxCisJZW9yCXIzLHIzLHI5LGxzciM4CisJZW9yCXI0LHI0LHIxMCxsc3IjOAorCWVvcglyMyxyMyxyMTAsbHNsIzI0CisJZW9yCXI0LHI0LHI5LGxzbCMyNAorCWVvcglyMyxyMyxyOSxsc3IjNworCWVvcglyNCxyNCxyMTAsbHNyIzcKKwllb3IJcjMscjMscjEwLGxzbCMyNQorCisJQCBzaWdtYTEoeCkJKFJPVFIoKHgpLDE5KSBeIFJPVFIoKHgpLDYxKSBeICgoeCk+PjYpKQorCUAgTE8JCWxvPj4xOV5oaTw8MTMgXiBoaT4+MjlebG88PDMgXiBsbz4+Nl5oaTw8MjYKKwlAIEhJCQloaT4+MTlebG88PDEzIF4gbG8+PjI5XmhpPDwzIF4gaGk+PjYKKwltb3YJcjkscjExLGxzciMxOQorCW1vdglyMTAscjEyLGxzciMxOQorCWVvcglyOSxyOSxyMTIsbHNsIzEzCisJZW9yCXIxMCxyMTAscjExLGxzbCMxMworCWVvcglyOSxyOSxyMTIsbHNyIzI5CisJZW9yCXIxMCxyMTAscjExLGxzciMyOQorCWVvcglyOSxyOSxyMTEsbHNsIzMKKwllb3IJcjEwLHIxMCxyMTIsbHNsIzMKKwllb3IJcjkscjkscjExLGxzciM2CisJZW9yCXIxMCxyMTAscjEyLGxzciM2CisJZW9yCXI5LHI5LHIxMixsc2wjMjYKKworCWxkcglyMTEsW3NwLCMxMjArMF0KKwlsZHIJcjEyLFtzcCwjMTIwKzRdCisJYWRkcwlyMyxyMyxyOQorCWFkYwlyNCxyNCxyMTAKKworCWxkcglyOSxbc3AsIzE5MiswXQorCWxkcglyMTAsW3NwLCMxOTIrNF0KKwlhZGRzCXIzLHIzLHIxMQorCWFkYwlyNCxyNCxyMTIKKwlhZGRzCXIzLHIzLHI5CisJYWRjCXI0LHI0LHIxMAorCXN0cglyMyxbc3AsIzY0KzBdCisJc3RyCXI0LFtzcCwjNjQrNF0KKwlsZHIJcjExLFtzcCwjNTYrMF0JQCBoLmxvCisJbGRyCXIxMixbc3AsIzU2KzRdCUAgaC5oaQorCUAgU2lnbWExKHgpCShST1RSKCh4KSwxNCkgXiBST1RSKCh4KSwxOCkgIF4gUk9UUigoeCksNDEpKQorCUAgTE8JCWxvPj4xNF5oaTw8MTggXiBsbz4+MTheaGk8PDE0IF4gaGk+PjlebG88PDIzCisJQCBISQkJaGk+PjE0XmxvPDwxOCBeIGhpPj4xOF5sbzw8MTQgXiBsbz4+OV5oaTw8MjMKKwltb3YJcjkscjcsbHNyIzE0CisJbW92CXIxMCxyOCxsc3IjMTQKKwllb3IJcjkscjkscjgsbHNsIzE4CisJZW9yCXIxMCxyMTAscjcsbHNsIzE4CisJZW9yCXI5LHI5LHI3LGxzciMxOAorCWVvcglyMTAscjEwLHI4LGxzciMxOAorCWVvcglyOSxyOSxyOCxsc2wjMTQKKwllb3IJcjEwLHIxMCxyNyxsc2wjMTQKKwllb3IJcjkscjkscjgsbHNyIzkKKwllb3IJcjEwLHIxMCxyNyxsc3IjOQorCWVvcglyOSxyOSxyNyxsc2wjMjMKKwllb3IJcjEwLHIxMCxyOCxsc2wjMjMJQCBTaWdtYTEoZSkKKwlhZGRzCXIzLHIzLHI5CisJYWRjCXI0LHI0LHIxMAkJQCBUICs9IFNpZ21hMShlKQorCWFkZHMJcjMscjMscjExCisJYWRjCXI0LHI0LHIxMgkJQCBUICs9IGgKKworCWxkcglyOSxbc3AsIzQwKzBdCUAgZi5sbworCWxkcglyMTAsW3NwLCM0MCs0XQlAIGYuaGkKKwlsZHIJcjExLFtzcCwjNDgrMF0JQCBnLmxvCisJbGRyCXIxMixbc3AsIzQ4KzRdCUAgZy5oaQorCXN0cglyNyxbc3AsIzMyKzBdCisJc3RyCXI4LFtzcCwjMzIrNF0KKwlzdHIJcjUsW3NwLCMwKzBdCisJc3RyCXI2LFtzcCwjMCs0XQorCisJZW9yCXI5LHI5LHIxMQorCWVvcglyMTAscjEwLHIxMgorCWFuZAlyOSxyOSxyNworCWFuZAlyMTAscjEwLHI4CisJZW9yCXI5LHI5LHIxMQorCWVvcglyMTAscjEwLHIxMgkJQCBDaChlLGYsZykKKworCWxkcglyMTEsW3IxNCwjNF0JCUAgS1tpXS5sbworCWxkcglyMTIsW3IxNCwjMF0JCUAgS1tpXS5oaQorCWxkcglyNyxbc3AsIzI0KzBdCUAgZC5sbworCWxkcglyOCxbc3AsIzI0KzRdCUAgZC5oaQorCisJYWRkcwlyMyxyMyxyOQorCWFkYwlyNCxyNCxyMTAJCUAgVCArPSBDaChlLGYsZykKKwlhZGRzCXIzLHIzLHIxMQorCWFkYwlyNCxyNCxyMTIJCUAgVCArPSBLW2ldCisJYWRkcwlyNyxyNyxyMworCWFkYwlyOCxyOCxyNAkJQCBkICs9IFQKKworCWFuZAlyOSxyMTEsIzB4ZmYKKwl0ZXEJcjksIzIzCisJb3JyZXEJcjE0LHIxNCwjMQorCisJbGRyCXIxMSxbc3AsIzgrMF0JQCBiLmxvCisJbGRyCXIxMixbc3AsIzE2KzBdCUAgYy5sbworCUAgU2lnbWEwKHgpCShST1RSKCh4KSwyOCkgXiBST1RSKCh4KSwzNCkgXiBST1RSKCh4KSwzOSkpCisJQCBMTwkJbG8+PjI4XmhpPDw0ICBeIGhpPj4yXmxvPDwzMCBeIGhpPj43XmxvPDwyNQorCUAgSEkJCWhpPj4yOF5sbzw8NCAgXiBsbz4+Ml5oaTw8MzAgXiBsbz4+N15oaTw8MjUKKwltb3YJcjkscjUsbHNyIzI4CisJbW92CXIxMCxyNixsc3IjMjgKKwllb3IJcjkscjkscjYsbHNsIzQKKwllb3IJcjEwLHIxMCxyNSxsc2wjNAorCWVvcglyOSxyOSxyNixsc3IjMgorCWVvcglyMTAscjEwLHI1LGxzciMyCisJZW9yCXI5LHI5LHI1LGxzbCMzMAorCWVvcglyMTAscjEwLHI2LGxzbCMzMAorCWVvcglyOSxyOSxyNixsc3IjNworCWVvcglyMTAscjEwLHI1LGxzciM3CisJZW9yCXI5LHI5LHI1LGxzbCMyNQorCWVvcglyMTAscjEwLHI2LGxzbCMyNQlAIFNpZ21hMChhKQorCWFkZHMJcjMscjMscjkKKwlhZGMJcjQscjQscjEwCQlAIFQgKz0gU2lnbWEwKGEpCisKKwlhbmQJcjkscjUscjExCisJb3JyCXI1LHI1LHIxMQorCWxkcglyMTAsW3NwLCM4KzRdCUAgYi5oaQorCWxkcglyMTEsW3NwLCMxNis0XQlAIGMuaGkKKwlhbmQJcjUscjUscjEyCisJb3JyCXI1LHI1LHI5CQlAIE1haihhLGIsYykubG8KKwlhbmQJcjEyLHI2LHIxMAorCW9ycglyNixyNixyMTAKKwlhbmQJcjYscjYscjExCisJb3JyCXI2LHI2LHIxMgkJQCBNYWooYSxiLGMpLmhpCisJYWRkcwlyNSxyNSxyMworCWFkYwlyNixyNixyNAkJQCBoICs9IFQKKworCXN1YglzcCxzcCwjOAorCWFkZAlyMTQscjE0LCM4CisJdHN0CXIxNCwjMQorCWJlcQkuTDE2Xzc5CisJYmljCXIxNCxyMTQsIzEKKworCWxkcglyMyxbc3AsIzgrMF0KKwlsZHIJcjQsW3NwLCM4KzRdCisJbGRyCXI5LCBbcjAsIzArNF0KKwlsZHIJcjEwLCBbcjAsIzArMF0KKwlsZHIJcjExLCBbcjAsIzgrNF0KKwlsZHIJcjEyLCBbcjAsIzgrMF0KKwlhZGRzCXI5LHI1LHI5CisJYWRjCXIxMCxyNixyMTAKKwlhZGRzCXIxMSxyMyxyMTEKKwlhZGMJcjEyLHI0LHIxMgorCXN0cglyOSwgW3IwLCMwKzRdCisJc3RyCXIxMCwgW3IwLCMwKzBdCisJc3RyCXIxMSwgW3IwLCM4KzRdCisJc3RyCXIxMiwgW3IwLCM4KzBdCisKKwlsZHIJcjUsW3NwLCMxNiswXQorCWxkcglyNixbc3AsIzE2KzRdCisJbGRyCXIzLFtzcCwjMjQrMF0KKwlsZHIJcjQsW3NwLCMyNCs0XQorCWxkcglyOSwgW3IwLCMxNis0XQorCWxkcglyMTAsIFtyMCwjMTYrMF0KKwlsZHIJcjExLCBbcjAsIzI0KzRdCisJbGRyCXIxMiwgW3IwLCMyNCswXQorCWFkZHMJcjkscjUscjkKKwlhZGMJcjEwLHI2LHIxMAorCWFkZHMJcjExLHIzLHIxMQorCWFkYwlyMTIscjQscjEyCisJc3RyCXI5LCBbcjAsIzE2KzRdCisJc3RyCXIxMCwgW3IwLCMxNiswXQorCXN0cglyMTEsIFtyMCwjMjQrNF0KKwlzdHIJcjEyLCBbcjAsIzI0KzBdCisKKwlsZHIJcjMsW3NwLCM0MCswXQorCWxkcglyNCxbc3AsIzQwKzRdCisJbGRyCXI5LCBbcjAsIzMyKzRdCisJbGRyCXIxMCwgW3IwLCMzMiswXQorCWxkcglyMTEsIFtyMCwjNDArNF0KKwlsZHIJcjEyLCBbcjAsIzQwKzBdCisJYWRkcwlyNyxyNyxyOQorCWFkYwlyOCxyOCxyMTAKKwlhZGRzCXIxMSxyMyxyMTEKKwlhZGMJcjEyLHI0LHIxMgorCXN0cglyNyxbcjAsIzMyKzRdCisJc3RyCXI4LFtyMCwjMzIrMF0KKwlzdHIJcjExLCBbcjAsIzQwKzRdCisJc3RyCXIxMiwgW3IwLCM0MCswXQorCisJbGRyCXI1LFtzcCwjNDgrMF0KKwlsZHIJcjYsW3NwLCM0OCs0XQorCWxkcglyMyxbc3AsIzU2KzBdCisJbGRyCXI0LFtzcCwjNTYrNF0KKwlsZHIJcjksIFtyMCwjNDgrNF0KKwlsZHIJcjEwLCBbcjAsIzQ4KzBdCisJbGRyCXIxMSwgW3IwLCM1Nis0XQorCWxkcglyMTIsIFtyMCwjNTYrMF0KKwlhZGRzCXI5LHI1LHI5CisJYWRjCXIxMCxyNixyMTAKKwlhZGRzCXIxMSxyMyxyMTEKKwlhZGMJcjEyLHI0LHIxMgorCXN0cglyOSwgW3IwLCM0OCs0XQorCXN0cglyMTAsIFtyMCwjNDgrMF0KKwlzdHIJcjExLCBbcjAsIzU2KzRdCisJc3RyCXIxMiwgW3IwLCM1NiswXQorCisJYWRkCXNwLHNwLCM2NDAKKwlzdWIJcjE0LHIxNCwjNjQwCisKKwl0ZXEJcjEscjIKKwlibmUJLkxvb3AKKworCWFkZAlzcCxzcCwjOCo5CQlAIGRlc3Ryb3kgZnJhbWUKKwlsZG1pYQlzcCEse3I0LXIxMixscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0CisJLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorLnNpemUgICBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciwuLXNoYTUxMl9ibG9ja19kYXRhX29yZGVyCisuYXNjaXogICJTSEE1MTIgYmxvY2sgdHJhbnNmb3JtIGZvciBBUk12NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9Ab3BlbnNzbC5vcmc+IgorLmFsaWduCTIKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1pYTY0LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLWlhNjQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2Y2U1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1pYTY0LnBsCkBAIC0wLDAgKzEsNjcyIEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTSEEyNTYvNTEyX1RyYW5zZm9ybSBmb3IgSXRhbml1bS4KKyMKKyMgc2hhNTEyX2Jsb2NrIHJ1bnMgaW4gMTAwMyBjeWNsZXMgb24gSXRhbml1bSAyLCB3aGljaCBpcyBhbG1vc3QgNTAlCisjIGZhc3RlciB0aGFuIGdjYyBhbmQgPjYwJSghKSBmYXN0ZXIgdGhhbiBjb2RlIGdlbmVyYXRlZCBieSBIUC1VWAorIyBjb21waWxlciAoeWVzLCBIUC1VWCBpcyBnZW5lcmF0aW5nIHNsb3dlciBjb2RlLCBiZWNhdXNlIHVubGlrZSBnY2MsCisjIGl0IGZhaWxlZCB0byBkZXBsb3kgInNoaWZ0IHJpZ2h0IHBhaXIsIiAnc2hycCcgaW5zdHJ1Y3Rpb24sIHdoaWNoCisjIHN1YnN0aXR1dGVzIGZvciA2NC1iaXQgcm90YXRlKS4KKyMKKyMgOTI0IGN5Y2xlcyBsb25nIHNoYTI1Nl9ibG9jayBvdXRwZXJmb3JtcyBnY2MgYnkgb3ZlciBmYWN0b3Igb2YgMighKQorIyBhbmQgSFAtVVggY29tcGlsZXIgLSBieSA+NDAlICh5ZXMsIGdjYyB3b24gc2hhNTEyX2Jsb2NrLCBidXQgbG9zdAorIyB0aGlzIG9uZSBiaWcgdGltZSkuIE5vdGUgdGhhdCAiZm9ybWFsbHkiIDkyNCBpcyBhYm91dCAxMDAgY3ljbGVzCisjIHRvbyBtdWNoLiBJIG1lYW4gaXQncyA2NCAzMi1iaXQgcm91bmRzIHZzLiA4MCB2aXJ0dWFsbHkgaWRlbnRpY2FsCisjIDY0LWJpdCBvbmVzIGFuZCAxMDAzKjY0LzgwIGdpdmVzIDgwMi4gRXh0cmEgY3ljbGVzLCAyIHBlciByb3VuZCwKKyMgYXJlIHNwZW50IG9uIGV4dHJhIHdvcmsgdG8gcHJvdmlkZSBmb3IgMzItYml0IHJvdGF0aW9ucy4gMzItYml0CisjIHJvdGF0aW9ucyBhcmUgc3RpbGwgaGFuZGxlZCBieSAnc2hycCcgaW5zdHJ1Y3Rpb24gYW5kIGZvciB0aGlzCisjIHJlYXNvbiBsb3dlciAzMiBiaXRzIGFyZSBkZXBvc2l0ZWQgdG8gdXBwZXIgaGFsZiBvZiA2NC1iaXQgcmVnaXN0ZXIKKyMgcHJpb3IgJ3NocnAnIGlzc3VlLiBBbmQgaW4gb3JkZXIgdG8gbWluaW1pemUgdGhlIGFtb3VudCBvZiBzdWNoCisjIG9wZXJhdGlvbnMsIFhbMTZdIHZhbHVlcyBhcmUgKm1haW50YWluZWQqIHdpdGggY29waWVzIG9mIGxvd2VyCisjIGhhbHZlcyBpbiB1cHBlciBoYWx2ZXMsIHdoaWNoIGlzIHdoeSB5b3UnbGwgc3BvdCBzdWNoIGluc3RydWN0aW9ucworIyBhcyBjdXN0b20gJ211eDInLCAicGFyYWxsZWwgMzItYml0IGFkZCwiICdwYWRkNCcgYW5kICJwYXJhbGxlbAorIyAzMi1iaXQgdW5zaWduZWQgcmlnaHQgc2hpZnQsIiAncHNocjQudScgaW5zdHJ1Y3Rpb25zIGhlcmUuCisjCisjIFJ1bGVzIG9mIGVuZ2FnZW1lbnQuCisjCisjIFRoZXJlIGlzIG9ubHkgb25lIGludGVnZXIgc2hpZnRlciBtZWFuaW5nIHRoYXQgaWYgSSBoYXZlIHR3byByb3RhdGUsCisjIGRlcG9zaXQgb3IgZXh0cmFjdCBpbnN0cnVjdGlvbnMgaW4gYWRqYWNlbnQgYnVuZGxlcywgdGhleSBzaGFsbAorIyBzcGxpdCBbYXQgcnVuLXRpbWUgaWYgdGhleSBoYXZlIHRvXS4gQnV0IG5vdGUgdGhhdCB2YXJpYWJsZSBhbmQKKyMgcGFyYWxsZWwgc2hpZnRzIGFyZSBwZXJmb3JtZWQgYnkgbXVsdGktbWVkaWEgQUxVIGFuZCAqYXJlKiBwYWlyYWJsZQorIyB3aXRoIHJvdGF0ZXMgW2FuZCBhbGlrZV0uIE9uIHRoZSBiYWNrc2lkZSBNTUFMVSBpcyByYXRoZXIgc2xvdzogaXQKKyMgdGFrZXMgMiBleHRyYSBjeWNsZXMgYmVmb3JlIHRoZSByZXN1bHQgb2YgaW50ZWdlciBvcGVyYXRpb24gaXMKKyMgYXZhaWxhYmxlICp0byogTU1BTFUgYW5kIDIoKikgZXh0cmEgY3ljbGVzIGJlZm9yZSB0aGUgcmVzdWx0IG9mIE1NCisjIG9wZXJhdGlvbiBpcyBhdmFpbGFibGUgImJhY2siICp0byogaW50ZWdlciBBTFUsIG5vdCB0byBtZW50aW9uIHRoYXQKKyMgTU1BTFUgaXRzZWxmIGhhcyAyIGN5Y2xlcyBsYXRlbmN5LiBIb3dldmVyISBJIGV4cGxpY2l0bHkgc2NoZWR1bGVkCisjIHRoZXNlIE1NIGluc3RydWN0aW9ucyB0byBhdm9pZCBNTSBzdGFsbHMsIHNvIHRoYXQgYWxsIHRoZXNlIGV4dHJhCisjIGxhdGVuY2llcyBnZXQgImhpZGRlbiIgaW4gaW5zdHJ1Y3Rpb24tbGV2ZWwgcGFyYWxsZWxpc20uCisjCisjICgqKSAyIGN5Y2xlcyBvbiBJdGFuaXVtIDEgYW5kIDEgY3ljbGUgb24gSXRhbml1bSAyLiBCdXQgSSBzY2hlZHVsZQorIyAgICAgZm9yIDIgaW4gb3JkZXIgdG8gcHJvdmlkZSBmb3IgYmVzdCAqb3ZlcmFsbCogcGVyZm9ybWFuY2UsCisjICAgICBiZWNhdXNlIG9uIEl0YW5pdW0gMSBzdGFsbCBvbiBNTSByZXN1bHQgaXMgYWNjb21wYW5pZWQgYnkKKyMgICAgIHBpcGVsaW5lIGZsdXNoLCB3aGljaCB0YWtlcyA2IGN5Y2xlczotKAorIworIyBSZXN1bHRpbmcgcGVyZm9ybWFuY2UgbnVtYmVycyBmb3IgOTAwTUh6IEl0YW5pdW0gMiBzeXN0ZW06CisjCisjIFRoZSAnbnVtYmVycycgYXJlIGluIDEwMDBzIG9mIGJ5dGVzIHBlciBzZWNvbmQgcHJvY2Vzc2VkLgorIyB0eXBlICAgICAxNiBieXRlcyAgICA2NCBieXRlcyAgIDI1NiBieXRlcyAgMTAyNCBieXRlcyAgODE5MiBieXRlcworIyBzaGExKCopICAgNjIxMC4xNGsgICAyMDM3Ni4zMGsgICA1MjQ0Ny44M2sgICA4NTg3MC4wNWsgIDEwNTQ3OC4xMmsKKyMgc2hhMjU2ICAgIDc0NzYuNDVrICAgMjA1NzIuMDVrICAgNDE1MzguMzRrICAgNTYwNjIuMjlrICAgNjIwOTMuMThrCisjIHNoYTUxMiAgICA0OTk2LjU2ayAgIDIwMDI2LjI4ayAgIDQ3NTk3LjIwayAgIDg1Mjc4Ljc5ayAgMTExNTAxLjMxaworIworIyAoKikgU0hBMSBudW1iZXJzIGFyZSBmb3IgSFAtVVggY29tcGlsZXIgYW5kIGFyZSBwcmVzZW50ZWQgcHVyZWx5CisjICAgICBmb3IgcmVmZXJlbmNlIHB1cnBvc2VzLiBJIGJldCBpdCBjYW4gaW1wcm92ZWQgdG9vLi4uCisjCisjIFRvIGdlbmVyYXRlIGNvZGUsIHBhc3MgdGhlIGZpbGUgbmFtZSB3aXRoIGVpdGhlciAyNTYgb3IgNTEyIGluIGl0cworIyBuYW1lIGFuZCBjb21waWxlciBmbGFncy4KKworJG91dHB1dD1zaGlmdDsKKworaWYgKCRvdXRwdXQgPX4gLzUxMi4qXC5bc3xhc21dLykgeworCSRTWj04OworCSRCSVRTPTgqJFNaOworCSRMRFc9ImxkOCI7CisJJFNUVz0ic3Q4IjsKKwkkQUREPSJhZGQiOworCSRTSFJVPSJzaHIudSI7CisJJFRBQkxFPSJLNTEyIjsKKwkkZnVuYz0ic2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIiOworCUBTaWdtYTA9KDI4LDM0LDM5KTsKKwlAU2lnbWExPSgxNCwxOCw0MSk7CisJQHNpZ21hMD0oMSwgIDgsIDcpOworCUBzaWdtYTE9KDE5LDYxLCA2KTsKKwkkcm91bmRzPTgwOworfSBlbHNpZiAoJG91dHB1dCA9fiAvMjU2LipcLltzfGFzbV0vKSB7CisJJFNaPTQ7CisJJEJJVFM9OCokU1o7CisJJExEVz0ibGQ0IjsKKwkkU1RXPSJzdDQiOworCSRBREQ9InBhZGQ0IjsKKwkkU0hSVT0icHNocjQudSI7CisJJFRBQkxFPSJLMjU2IjsKKwkkZnVuYz0ic2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIiOworCUBTaWdtYTA9KCAyLDEzLDIyKTsKKwlAU2lnbWExPSggNiwxMSwyNSk7CisJQHNpZ21hMD0oIDcsMTgsIDMpOworCUBzaWdtYTE9KDE3LDE5LDEwKTsKKwkkcm91bmRzPTY0OworfSBlbHNlIHsgZGllICJub25zZW5zZSAkb3V0cHV0IjsgfQorCitvcGVuIFNURE9VVCwiPiRvdXRwdXQiIHx8IGRpZSAiY2FuJ3Qgb3BlbiAkb3V0cHV0OiAkISI7CisKK2lmICgkXk8gZXEgImhwdXgiKSB7CisgICAgJEFERFA9ImFkZHA0IjsKKyAgICBmb3IgKEBBUkdWKSB7ICRBRERQPSJhZGQiIGlmICgvW1wrRER8XC1tbHBdNjQvKTsgfQorfSBlbHNlIHsgJEFERFA9ImFkZCI7IH0KK2ZvciAoQEFSR1YpICB7CSRiaWdfZW5kaWFuPTEgaWYgKC9cLURCX0VORElBTi8pOworCQkkYmlnX2VuZGlhbj0wIGlmICgvXC1ETF9FTkRJQU4vKTsgIH0KK2lmICghZGVmaW5lZCgkYmlnX2VuZGlhbikpCisgICAgICAgICAgICAgewkkYmlnX2VuZGlhbj0odW5wYWNrKCdMJyxwYWNrKCdOJywxKSk9PTEpOyAgfQorCiskY29kZT08PF9fXzsKKy5pZGVudCAgXCIkb3V0cHV0LCB2ZXJzaW9uIDEuMVwiCisuaWRlbnQgIFwiSUEtNjQgSVNBIGFydHdvcmsgYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9cQGZ5LmNoYWxtZXJzLnNlPlwiCisuZXhwbGljaXQKKy50ZXh0CisKK3Bmc3NhdmU9cjI7CitsY3NhdmU9cjM7CitwcnNhdmU9cjE0OworSz1yMTU7CitBPXIxNjsJQj1yMTc7CUM9cjE4OwlEPXIxOTsKK0U9cjIwOwlGPXIyMTsJRz1yMjI7CUg9cjIzOworVDE9cjI0OwlUMj1yMjU7CitzMD1yMjY7CXMxPXIyNzsJdDA9cjI4Owl0MT1yMjk7CitLdGJsPXIzMDsKK2N0eD1yMzE7CS8vIDFzdCBhcmcKK2lucHV0PXI0ODsJLy8gMm5kIGFyZworbnVtPXI0OTsJLy8gM3JkIGFyZworc2dtMD1yNTA7CXNnbTE9cjUxOwkvLyBzbWFsbCBjb25zdGFudHMKK0FfPXI1NDsJQl89cjU1OwlDXz1yNTY7CURfPXI1NzsKK0VfPXI1ODsJRl89cjU5OwlHXz1yNjA7CUhfPXI2MTsKKworLy8gdm9pZCAkZnVuYyAoU0hBX0NUWCAqY3R4LCBjb25zdCB2b2lkICppbixzaXplX3QgbnVtWyxpbnQgaG9zdF0pCisuZ2xvYmFsCSRmdW5jIworLnByb2MJJGZ1bmMjCisuYWxpZ24JMzIKKyRmdW5jOgorCS5wcm9sb2d1ZQorCS5zYXZlCWFyLnBmcyxwZnNzYXZlCit7IC5tbWk7CWFsbG9jCXBmc3NhdmU9YXIucGZzLDMsMjcsMCwxNgorCSRBRERQCWN0eD0wLHIzMgkJLy8gMXN0IGFyZworCS5zYXZlCWFyLmxjLGxjc2F2ZQorCW1vdglsY3NhdmU9YXIubGMJfQoreyAubW1pOwkkQUREUAlpbnB1dD0wLHIzMwkJLy8gMm5kIGFyZworCW1vdgludW09cjM0CQkJLy8gM3JkIGFyZworCS5zYXZlCXByLHByc2F2ZQorCW1vdglwcnNhdmU9cHIJfTs7CisKKwkuYm9keQoreyAubWliOwlhZGQJcjg9MCokU1osY3R4CisJYWRkCXI5PTEqJFNaLGN0eAorCWJycC5sb29wLmltcAkuTF9maXJzdDE2LC5MX2ZpcnN0MTZfZW5kLTE2CX0KK3sgLm1pYjsJYWRkCXIxMD0yKiRTWixjdHgKKwlhZGQJcjExPTMqJFNaLGN0eAorCWJycC5sb29wLmltcAkuTF9yZXN0LC5MX3Jlc3RfZW5kLTE2CQl9OzsKKworLy8gbG9hZCBBLUgKKy5McGljX3BvaW50OgoreyAubW1pOwkkTERXCUFfPVtyOF0sNCokU1oKKwkkTERXCUJfPVtyOV0sNCokU1oKKwltb3YJS3RibD1pcAkJfQoreyAubW1pOwkkTERXCUNfPVtyMTBdLDQqJFNaCisJJExEVwlEXz1bcjExXSw0KiRTWgorCW1vdglzZ20wPSRzaWdtYTBbMl0JfTs7Cit7IC5tbWk7CSRMRFcJRV89W3I4XQorCSRMRFcJRl89W3I5XQorCWFkZAlLdGJsPSgkVEFCTEUjLS5McGljX3BvaW50KSxLdGJsCQl9Cit7IC5tbWk7CSRMRFcJR189W3IxMF0KKwkkTERXCUhfPVtyMTFdCisJY21wLm5lCXAwLHAxNj0wLHIwCX07OwkvLyB1c2VkIGluIHNoYTI1Nl9ibG9jaworX19fCiskY29kZS49PDxfX18gaWYgKCRCSVRTPT02NCk7Cit7IC5taWk7CWFuZAlyOD03LGlucHV0CisJYW5kCWlucHV0PX43LGlucHV0OzsKKwljbXAuZXEJcDkscDA9MSxyOAl9Cit7IC5tbWk7CWNtcC5lcQlwMTAscDA9MixyOAorCWNtcC5lcQlwMTEscDA9MyxyOAorCWNtcC5lcQlwMTIscDA9NCxyOAl9Cit7IC5tbWk7CWNtcC5lcQlwMTMscDA9NSxyOAorCWNtcC5lcQlwMTQscDA9NixyOAorCWNtcC5lcQlwMTUscDA9NyxyOAl9OzsKK19fXworJGNvZGUuPTw8X19fOworLkxfb3V0ZXI6Cisucm90cglYWzE2XQoreyAubW1pOwltb3YJQT1BXworCW1vdglCPUJfCisJbW92CWFyLmxjPTE0CX0KK3sgLm1taTsJbW92CUM9Q18KKwltb3YJRD1EXworCW1vdglFPUVfCQl9Cit7IC5tbWk7CW1vdglGPUZfCisJbW92CUc9R18KKwltb3YJYXIuZWM9MgkJfQoreyAubW1pOwlsZDEJWFsxNV09W2lucHV0XSwkU1oJCS8vIGVsaW1pbmF0ZWQgaW4gNjQtYml0CisJbW92CUg9SF8KKwltb3YJc2dtMT0kc2lnbWExWzJdCX07OworCitfX18KKyR0MD0idDAiLCAkdDE9InQxIiwgJGNvZGUuPTw8X19fIGlmICgkQklUUz09MzIpOworLmFsaWduCTMyCisuTF9maXJzdDE2OgoreyAubW1pOwkJYWRkCXI5PTEtJFNaLGlucHV0CisJCWFkZAlyMTA9Mi0kU1osaW5wdXQKKwkJYWRkCXIxMT0zLSRTWixpbnB1dAl9OzsKK3sgLm1taTsJCWxkMQlyOT1bcjldCisJCWxkMQlyMTA9W3IxMF0KKwkJZGVwLnoJJHQxPUUsMzIsMzIJfQoreyAubW1pOwkJJExEVwlLPVtLdGJsXSwkU1oKKwkJbGQxCXIxMT1bcjExXQorCQl6eHQ0CUU9RQkJfTs7Cit7IC5taWk7CQlvcgkkdDE9JHQxLEUKKwkJZGVwCVhbMTVdPVhbMTVdLHI5LDgsOAorCQlkZXAJcjExPXIxMCxyMTEsOCw4CX07OworeyAubW1pOwkJYW5kCVQxPUYsRQorCQlhbmQJVDI9QSxCCisJCWRlcAlYWzE1XT1YWzE1XSxyMTEsMTYsMTYJfQoreyAubW1pOwkJYW5kY20Jcjg9RyxFCisJCWFuZAlyOT1BLEMKKwkJbXV4MgkkdDA9QSwweDQ0CX07OwkvLyBjb3B5IGxvd2VyIGhhbGYgdG8gdXBwZXIKK3sgLm1taTsJKHAxNikJbGQxCVhbMTUtMV09W2lucHV0XSwkU1oJLy8gcHJlZmV0Y2gKKwkJeG9yCVQxPVQxLHI4CQkvLyBUMT0oKGUgJiBmKSBeICh+ZSAmIGcpKQorCQlfcm90cglyMTE9JHQxLCRTaWdtYTFbMF0gfQkvLyBST1RSKGUsMTQpCit7IC5taWI7CQlhbmQJcjEwPUIsQworCQl4b3IJVDI9VDIscjkJfTs7CitfX18KKyR0MD0iQSIsICR0MT0iRSIsICRjb2RlLj08PF9fXyBpZiAoJEJJVFM9PTY0KTsKKy8vIGluIDY0LWJpdCBtb2RlIEkgbG9hZCB3aG9sZSBYWzE2XSBhdCBvbmNlIGFuZCB0YWtlIGNhcmUgb2YgYWxpZ25tZW50Li4uCit7IC5tbWk7CWFkZAlyOD0xKiRTWixpbnB1dAorCWFkZAlyOT0yKiRTWixpbnB1dAorCWFkZAlyMTA9MyokU1osaW5wdXQJCX07OworeyAubW1iOwkkTERXCVhbMTVdPVtpbnB1dF0sNCokU1oKKwkkTERXCVhbMTRdPVtyOF0sNCokU1oKKyhwOSkJYnIuY29uZC5kcG50Lm1hbnkJLkwxYnl0ZQl9OzsKK3sgLm1tYjsJJExEVwlYWzEzXT1bcjldLDQqJFNaCisJJExEVwlYWzEyXT1bcjEwXSw0KiRTWgorKHAxMCkJYnIuY29uZC5kcG50Lm1hbnkJLkwyYnl0ZQl9OzsKK3sgLm1tYjsJJExEVwlYWzExXT1baW5wdXRdLDQqJFNaCisJJExEVwlYWzEwXT1bcjhdLDQqJFNaCisocDExKQlici5jb25kLmRwbnQubWFueQkuTDNieXRlCX07OworeyAubW1iOwkkTERXCVhbIDldPVtyOV0sNCokU1oKKwkkTERXCVhbIDhdPVtyMTBdLDQqJFNaCisocDEyKQlici5jb25kLmRwbnQubWFueQkuTDRieXRlCX07OworeyAubW1iOwkkTERXCVhbIDddPVtpbnB1dF0sNCokU1oKKwkkTERXCVhbIDZdPVtyOF0sNCokU1oKKyhwMTMpCWJyLmNvbmQuZHBudC5tYW55CS5MNWJ5dGUJfTs7Cit7IC5tbWI7CSRMRFcJWFsgNV09W3I5XSw0KiRTWgorCSRMRFcJWFsgNF09W3IxMF0sNCokU1oKKyhwMTQpCWJyLmNvbmQuZHBudC5tYW55CS5MNmJ5dGUJfTs7Cit7IC5tbWI7CSRMRFcJWFsgM109W2lucHV0XSw0KiRTWgorCSRMRFcJWFsgMl09W3I4XSw0KiRTWgorKHAxNSkJYnIuY29uZC5kcG50Lm1hbnkJLkw3Ynl0ZQl9OzsKK3sgLm1tYjsJJExEVwlYWyAxXT1bcjldLDQqJFNaCisJJExEVwlYWyAwXT1bcjEwXSw0KiRTWgorCWJyLm1hbnkJLkxfZmlyc3QxNgkJfTs7CisuTDFieXRlOgoreyAubW1pOwkkTERXCVhbMTNdPVtyOV0sNCokU1oKKwkkTERXCVhbMTJdPVtyMTBdLDQqJFNaCisJc2hycAlYWzE1XT1YWzE1XSxYWzE0XSw1Ngl9OzsKK3sgLm1taTsJJExEVwlYWzExXT1baW5wdXRdLDQqJFNaCisJJExEVwlYWzEwXT1bcjhdLDQqJFNaCisJc2hycAlYWzE0XT1YWzE0XSxYWzEzXSw1Ngl9Cit7IC5tbWk7CSRMRFcJWFsgOV09W3I5XSw0KiRTWgorCSRMRFcJWFsgOF09W3IxMF0sNCokU1oKKwlzaHJwCVhbMTNdPVhbMTNdLFhbMTJdLDU2CX07OworeyAubW1pOwkkTERXCVhbIDddPVtpbnB1dF0sNCokU1oKKwkkTERXCVhbIDZdPVtyOF0sNCokU1oKKwlzaHJwCVhbMTJdPVhbMTJdLFhbMTFdLDU2CX0KK3sgLm1taTsJJExEVwlYWyA1XT1bcjldLDQqJFNaCisJJExEVwlYWyA0XT1bcjEwXSw0KiRTWgorCXNocnAJWFsxMV09WFsxMV0sWFsxMF0sNTYJfTs7Cit7IC5tbWk7CSRMRFcJWFsgM109W2lucHV0XSw0KiRTWgorCSRMRFcJWFsgMl09W3I4XSw0KiRTWgorCXNocnAJWFsxMF09WFsxMF0sWFsgOV0sNTYJfQoreyAubW1pOwkkTERXCVhbIDFdPVtyOV0sNCokU1oKKwkkTERXCVhbIDBdPVtyMTBdLDQqJFNaCisJc2hycAlYWyA5XT1YWyA5XSxYWyA4XSw1Ngl9OzsKK3sgLm1paTsJJExEVwlUMT1baW5wdXRdCisJc2hycAlYWyA4XT1YWyA4XSxYWyA3XSw1NgorCXNocnAJWFsgN109WFsgN10sWFsgNl0sNTYJfQoreyAubWlpOwlzaHJwCVhbIDZdPVhbIDZdLFhbIDVdLDU2CisJc2hycAlYWyA1XT1YWyA1XSxYWyA0XSw1Ngl9OzsKK3sgLm1paTsJc2hycAlYWyA0XT1YWyA0XSxYWyAzXSw1NgorCXNocnAJWFsgM109WFsgM10sWFsgMl0sNTYJfQoreyAubWlpOwlzaHJwCVhbIDJdPVhbIDJdLFhbIDFdLDU2CisJc2hycAlYWyAxXT1YWyAxXSxYWyAwXSw1Ngl9Cit7IC5taWI7CXNocnAJWFsgMF09WFsgMF0sVDEsNTYKKwlici5tYW55CS5MX2ZpcnN0MTYJCX07OworLkwyYnl0ZToKK3sgLm1taTsJJExEVwlYWzExXT1baW5wdXRdLDQqJFNaCisJJExEVwlYWzEwXT1bcjhdLDQqJFNaCisJc2hycAlYWzE1XT1YWzE1XSxYWzE0XSw0OAl9Cit7IC5tbWk7CSRMRFcJWFsgOV09W3I5XSw0KiRTWgorCSRMRFcJWFsgOF09W3IxMF0sNCokU1oKKwlzaHJwCVhbMTRdPVhbMTRdLFhbMTNdLDQ4CX07OworeyAubW1pOwkkTERXCVhbIDddPVtpbnB1dF0sNCokU1oKKwkkTERXCVhbIDZdPVtyOF0sNCokU1oKKwlzaHJwCVhbMTNdPVhbMTNdLFhbMTJdLDQ4CX0KK3sgLm1taTsJJExEVwlYWyA1XT1bcjldLDQqJFNaCisJJExEVwlYWyA0XT1bcjEwXSw0KiRTWgorCXNocnAJWFsxMl09WFsxMl0sWFsxMV0sNDgJfTs7Cit7IC5tbWk7CSRMRFcJWFsgM109W2lucHV0XSw0KiRTWgorCSRMRFcJWFsgMl09W3I4XSw0KiRTWgorCXNocnAJWFsxMV09WFsxMV0sWFsxMF0sNDgJfQoreyAubW1pOwkkTERXCVhbIDFdPVtyOV0sNCokU1oKKwkkTERXCVhbIDBdPVtyMTBdLDQqJFNaCisJc2hycAlYWzEwXT1YWzEwXSxYWyA5XSw0OAl9OzsKK3sgLm1paTsJJExEVwlUMT1baW5wdXRdCisJc2hycAlYWyA5XT1YWyA5XSxYWyA4XSw0OAorCXNocnAJWFsgOF09WFsgOF0sWFsgN10sNDgJfQoreyAubWlpOwlzaHJwCVhbIDddPVhbIDddLFhbIDZdLDQ4CisJc2hycAlYWyA2XT1YWyA2XSxYWyA1XSw0OAl9OzsKK3sgLm1paTsJc2hycAlYWyA1XT1YWyA1XSxYWyA0XSw0OAorCXNocnAJWFsgNF09WFsgNF0sWFsgM10sNDgJfQoreyAubWlpOwlzaHJwCVhbIDNdPVhbIDNdLFhbIDJdLDQ4CisJc2hycAlYWyAyXT1YWyAyXSxYWyAxXSw0OAl9Cit7IC5taWk7CXNocnAJWFsgMV09WFsgMV0sWFsgMF0sNDgKKwlzaHJwCVhbIDBdPVhbIDBdLFQxLDQ4CX0KK3sgLm1mYjsJYnIubWFueQkuTF9maXJzdDE2CQl9OzsKKy5MM2J5dGU6Cit7IC5tbWk7CSRMRFcJWFsgOV09W3I5XSw0KiRTWgorCSRMRFcJWFsgOF09W3IxMF0sNCokU1oKKwlzaHJwCVhbMTVdPVhbMTVdLFhbMTRdLDQwCX07OworeyAubW1pOwkkTERXCVhbIDddPVtpbnB1dF0sNCokU1oKKwkkTERXCVhbIDZdPVtyOF0sNCokU1oKKwlzaHJwCVhbMTRdPVhbMTRdLFhbMTNdLDQwCX0KK3sgLm1taTsJJExEVwlYWyA1XT1bcjldLDQqJFNaCisJJExEVwlYWyA0XT1bcjEwXSw0KiRTWgorCXNocnAJWFsxM109WFsxM10sWFsxMl0sNDAJfTs7Cit7IC5tbWk7CSRMRFcJWFsgM109W2lucHV0XSw0KiRTWgorCSRMRFcJWFsgMl09W3I4XSw0KiRTWgorCXNocnAJWFsxMl09WFsxMl0sWFsxMV0sNDAJfQoreyAubW1pOwkkTERXCVhbIDFdPVtyOV0sNCokU1oKKwkkTERXCVhbIDBdPVtyMTBdLDQqJFNaCisJc2hycAlYWzExXT1YWzExXSxYWzEwXSw0MAl9OzsKK3sgLm1paTsJJExEVwlUMT1baW5wdXRdCisJc2hycAlYWzEwXT1YWzEwXSxYWyA5XSw0MAorCXNocnAJWFsgOV09WFsgOV0sWFsgOF0sNDAJfQoreyAubWlpOwlzaHJwCVhbIDhdPVhbIDhdLFhbIDddLDQwCisJc2hycAlYWyA3XT1YWyA3XSxYWyA2XSw0MAl9OzsKK3sgLm1paTsJc2hycAlYWyA2XT1YWyA2XSxYWyA1XSw0MAorCXNocnAJWFsgNV09WFsgNV0sWFsgNF0sNDAJfQoreyAubWlpOwlzaHJwCVhbIDRdPVhbIDRdLFhbIDNdLDQwCisJc2hycAlYWyAzXT1YWyAzXSxYWyAyXSw0MAl9Cit7IC5taWk7CXNocnAJWFsgMl09WFsgMl0sWFsgMV0sNDAKKwlzaHJwCVhbIDFdPVhbIDFdLFhbIDBdLDQwCX0KK3sgLm1pYjsJc2hycAlYWyAwXT1YWyAwXSxUMSw0MAorCWJyLm1hbnkJLkxfZmlyc3QxNgkJfTs7CisuTDRieXRlOgoreyAubW1pOwkkTERXCVhbIDddPVtpbnB1dF0sNCokU1oKKwkkTERXCVhbIDZdPVtyOF0sNCokU1oKKwlzaHJwCVhbMTVdPVhbMTVdLFhbMTRdLDMyCX0KK3sgLm1taTsJJExEVwlYWyA1XT1bcjldLDQqJFNaCisJJExEVwlYWyA0XT1bcjEwXSw0KiRTWgorCXNocnAJWFsxNF09WFsxNF0sWFsxM10sMzIJfTs7Cit7IC5tbWk7CSRMRFcJWFsgM109W2lucHV0XSw0KiRTWgorCSRMRFcJWFsgMl09W3I4XSw0KiRTWgorCXNocnAJWFsxM109WFsxM10sWFsxMl0sMzIJfQoreyAubW1pOwkkTERXCVhbIDFdPVtyOV0sNCokU1oKKwkkTERXCVhbIDBdPVtyMTBdLDQqJFNaCisJc2hycAlYWzEyXT1YWzEyXSxYWzExXSwzMgl9OzsKK3sgLm1paTsJJExEVwlUMT1baW5wdXRdCisJc2hycAlYWzExXT1YWzExXSxYWzEwXSwzMgorCXNocnAJWFsxMF09WFsxMF0sWFsgOV0sMzIJfQoreyAubWlpOwlzaHJwCVhbIDldPVhbIDldLFhbIDhdLDMyCisJc2hycAlYWyA4XT1YWyA4XSxYWyA3XSwzMgl9OzsKK3sgLm1paTsJc2hycAlYWyA3XT1YWyA3XSxYWyA2XSwzMgorCXNocnAJWFsgNl09WFsgNl0sWFsgNV0sMzIJfQoreyAubWlpOwlzaHJwCVhbIDVdPVhbIDVdLFhbIDRdLDMyCisJc2hycAlYWyA0XT1YWyA0XSxYWyAzXSwzMgl9Cit7IC5taWk7CXNocnAJWFsgM109WFsgM10sWFsgMl0sMzIKKwlzaHJwCVhbIDJdPVhbIDJdLFhbIDFdLDMyCX0KK3sgLm1paTsJc2hycAlYWyAxXT1YWyAxXSxYWyAwXSwzMgorCXNocnAJWFsgMF09WFsgMF0sVDEsMzIJfQoreyAubWZiOwlici5tYW55CS5MX2ZpcnN0MTYJCX07OworLkw1Ynl0ZToKK3sgLm1taTsJJExEVwlYWyA1XT1bcjldLDQqJFNaCisJJExEVwlYWyA0XT1bcjEwXSw0KiRTWgorCXNocnAJWFsxNV09WFsxNV0sWFsxNF0sMjQJfTs7Cit7IC5tbWk7CSRMRFcJWFsgM109W2lucHV0XSw0KiRTWgorCSRMRFcJWFsgMl09W3I4XSw0KiRTWgorCXNocnAJWFsxNF09WFsxNF0sWFsxM10sMjQJfQoreyAubW1pOwkkTERXCVhbIDFdPVtyOV0sNCokU1oKKwkkTERXCVhbIDBdPVtyMTBdLDQqJFNaCisJc2hycAlYWzEzXT1YWzEzXSxYWzEyXSwyNAl9OzsKK3sgLm1paTsJJExEVwlUMT1baW5wdXRdCisJc2hycAlYWzEyXT1YWzEyXSxYWzExXSwyNAorCXNocnAJWFsxMV09WFsxMV0sWFsxMF0sMjQJfQoreyAubWlpOwlzaHJwCVhbMTBdPVhbMTBdLFhbIDldLDI0CisJc2hycAlYWyA5XT1YWyA5XSxYWyA4XSwyNAl9OzsKK3sgLm1paTsJc2hycAlYWyA4XT1YWyA4XSxYWyA3XSwyNAorCXNocnAJWFsgN109WFsgN10sWFsgNl0sMjQJfQoreyAubWlpOwlzaHJwCVhbIDZdPVhbIDZdLFhbIDVdLDI0CisJc2hycAlYWyA1XT1YWyA1XSxYWyA0XSwyNAl9Cit7IC5taWk7CXNocnAJWFsgNF09WFsgNF0sWFsgM10sMjQKKwlzaHJwCVhbIDNdPVhbIDNdLFhbIDJdLDI0CX0KK3sgLm1paTsJc2hycAlYWyAyXT1YWyAyXSxYWyAxXSwyNAorCXNocnAJWFsgMV09WFsgMV0sWFsgMF0sMjQJfQoreyAubWliOwlzaHJwCVhbIDBdPVhbIDBdLFQxLDI0CisJYnIubWFueQkuTF9maXJzdDE2CQl9OzsKKy5MNmJ5dGU6Cit7IC5tbWk7CSRMRFcJWFsgM109W2lucHV0XSw0KiRTWgorCSRMRFcJWFsgMl09W3I4XSw0KiRTWgorCXNocnAJWFsxNV09WFsxNV0sWFsxNF0sMTYJfQoreyAubW1pOwkkTERXCVhbIDFdPVtyOV0sNCokU1oKKwkkTERXCVhbIDBdPVtyMTBdLDQqJFNaCisJc2hycAlYWzE0XT1YWzE0XSxYWzEzXSwxNgl9OzsKK3sgLm1paTsJJExEVwlUMT1baW5wdXRdCisJc2hycAlYWzEzXT1YWzEzXSxYWzEyXSwxNgorCXNocnAJWFsxMl09WFsxMl0sWFsxMV0sMTYJfQoreyAubWlpOwlzaHJwCVhbMTFdPVhbMTFdLFhbMTBdLDE2CisJc2hycAlYWzEwXT1YWzEwXSxYWyA5XSwxNgl9OzsKK3sgLm1paTsJc2hycAlYWyA5XT1YWyA5XSxYWyA4XSwxNgorCXNocnAJWFsgOF09WFsgOF0sWFsgN10sMTYJfQoreyAubWlpOwlzaHJwCVhbIDddPVhbIDddLFhbIDZdLDE2CisJc2hycAlYWyA2XT1YWyA2XSxYWyA1XSwxNgl9Cit7IC5taWk7CXNocnAJWFsgNV09WFsgNV0sWFsgNF0sMTYKKwlzaHJwCVhbIDRdPVhbIDRdLFhbIDNdLDE2CX0KK3sgLm1paTsJc2hycAlYWyAzXT1YWyAzXSxYWyAyXSwxNgorCXNocnAJWFsgMl09WFsgMl0sWFsgMV0sMTYJfQoreyAubWlpOwlzaHJwCVhbIDFdPVhbIDFdLFhbIDBdLDE2CisJc2hycAlYWyAwXT1YWyAwXSxUMSwxNgl9Cit7IC5tZmI7CWJyLm1hbnkJLkxfZmlyc3QxNgkJfTs7CisuTDdieXRlOgoreyAubW1pOwkkTERXCVhbIDFdPVtyOV0sNCokU1oKKwkkTERXCVhbIDBdPVtyMTBdLDQqJFNaCisJc2hycAlYWzE1XT1YWzE1XSxYWzE0XSw4CX07OworeyAubWlpOwkkTERXCVQxPVtpbnB1dF0KKwlzaHJwCVhbMTRdPVhbMTRdLFhbMTNdLDgKKwlzaHJwCVhbMTNdPVhbMTNdLFhbMTJdLDgJfQoreyAubWlpOwlzaHJwCVhbMTJdPVhbMTJdLFhbMTFdLDgKKwlzaHJwCVhbMTFdPVhbMTFdLFhbMTBdLDgJfTs7Cit7IC5taWk7CXNocnAJWFsxMF09WFsxMF0sWFsgOV0sOAorCXNocnAJWFsgOV09WFsgOV0sWFsgOF0sOAl9Cit7IC5taWk7CXNocnAJWFsgOF09WFsgOF0sWFsgN10sOAorCXNocnAJWFsgN109WFsgN10sWFsgNl0sOAl9Cit7IC5taWk7CXNocnAJWFsgNl09WFsgNl0sWFsgNV0sOAorCXNocnAJWFsgNV09WFsgNV0sWFsgNF0sOAl9Cit7IC5taWk7CXNocnAJWFsgNF09WFsgNF0sWFsgM10sOAorCXNocnAJWFsgM109WFsgM10sWFsgMl0sOAl9Cit7IC5taWk7CXNocnAJWFsgMl09WFsgMl0sWFsgMV0sOAorCXNocnAJWFsgMV09WFsgMV0sWFsgMF0sOAl9Cit7IC5taWI7CXNocnAJWFsgMF09WFsgMF0sVDEsOAorCWJyLm1hbnkJLkxfZmlyc3QxNgkJfTs7CisKKy5hbGlnbgkzMgorLkxfZmlyc3QxNjoKK3sgLm1taTsJCSRMRFcJSz1bS3RibF0sJFNaCisJCWFuZAlUMT1GLEUKKwkJYW5kCVQyPUEsQgkJfQoreyAubW1pOwkJLy8kTERXCVhbMTVdPVtpbnB1dF0sJFNaCS8vIFhbaV09KmlucHV0KysKKwkJYW5kY20Jcjg9RyxFCisJCWFuZAlyOT1BLEMJCX07OworeyAubW1pOwkJeG9yCVQxPVQxLHI4CQkvL1QxPSgoZSAmIGYpIF4gKH5lICYgZykpCisJCWFuZAlyMTA9QixDCisJCV9yb3RyCXIxMT0kdDEsJFNpZ21hMVswXSB9CS8vIFJPVFIoZSwxNCkKK3sgLm1taTsJCXhvcglUMj1UMixyOQorCQltdXgxCVhbMTVdPVhbMTVdLFxAcmV2IH07OwkvLyBlbGltaW5hdGVkIGluIGJpZy1lbmRpYW4KK19fXworJGNvZGUuPTw8X19fOworeyAubWliOwkJYWRkCVQxPVQxLEgJCQkvLyBUMT1DaChlLGYsZykraAorCQlfcm90cglyOD0kdDEsJFNpZ21hMVsxXSB9CS8vIFJPVFIoZSwxOCkKK3sgLm1pYjsJCXhvcglUMj1UMixyMTAJCS8vIFQyPSgoYSAmIGIpIF4gKGEgJiBjKSBeIChiICYgYykpCisJCW1vdglIPUcJCX07OworeyAubWliOwkJeG9yCXIxMT1yOCxyMTEKKwkJX3JvdHIJcjk9JHQxLCRTaWdtYTFbMl0gfQkvLyBST1RSKGUsNDEpCit7IC5taWI7CQltb3YJRz1GCisJCW1vdglGPUUJCX07OworeyAubWliOwkJeG9yCXI5PXI5LHIxMQkJLy8gcjk9U2lnbWExKGUpCisJCV9yb3RyCXIxMD0kdDAsJFNpZ21hMFswXSB9CS8vIFJPVFIoYSwyOCkKK3sgLm1pYjsJCWFkZAlUMT1UMSxLCQkJLy8gVDE9Q2goZSxmLGcpK2grSzUxMltpXQorCQltb3YJRT1ECQl9OzsKK3sgLm1pYjsJCWFkZAlUMT1UMSxyOQkJLy8gVDErPVNpZ21hMShlKQorCQlfcm90cglyMTE9JHQwLCRTaWdtYTBbMV0gfQkvLyBST1RSKGEsMzQpCit7IC5taWI7CQltb3YJRD1DCisJCW1vdglDPUIJCX07OworeyAubWliOwkJYWRkCVQxPVQxLFhbMTVdCQkvLyBUMSs9WFtpXQorCQlfcm90cglyOD0kdDAsJFNpZ21hMFsyXSB9CS8vIFJPVFIoYSwzOSkKK3sgLm1pYjsJCXhvcglyMTA9cjEwLHIxMQorCQltdXgyCVhbMTVdPVhbMTVdLDB4NDQgfTs7CS8vIGVsaW1pbmF0ZWQgaW4gNjQtYml0Cit7IC5tbWk7CQl4b3IJcjEwPXI4LHIxMAkJLy8gcjEwPVNpZ21hMChhKQorCQltb3YJQj1BCisJCWFkZAlBPVQxLFQyCQl9OzsKK3sgLm1pYjsJCWFkZAlFPUUsVDEKKwkJYWRkCUE9QSxyMTAJCQkvLyBUMj1NYWooYSxiLGMpK1NpZ21hMChhKQorCWJyLmN0b3Auc3B0awkuTF9maXJzdDE2CX07OworLkxfZmlyc3QxNl9lbmQ6CisKK3sgLm1paTsJbW92CWFyLmxjPSRyb3VuZHMtMTcKKwltb3YJYXIuZWM9MQkJCX07OworCisuYWxpZ24JMzIKKy5MX3Jlc3Q6Cisucm90cglYWzE2XQoreyAubWliOwkJJExEVwlLPVtLdGJsXSwkU1oKKwkJX3JvdHIJcjg9WFsxNS0xXSwkc2lnbWEwWzBdIH0JLy8gUk9UUihzMCwxKQoreyAubWliOyAJJEFERAlYWzE1XT1YWzE1XSxYWzE1LTldCS8vIFhbaSYweEZdKz1YWyhpKzkpJjB4Rl0KKwkJJFNIUlUJczA9WFsxNS0xXSxzZ20wCX07OwkvLyBzMD1YWyhpKzEpJjB4Rl0+PjcKK3sgLm1pYjsJCWFuZAlUMT1GLEUKKwkJX3JvdHIJcjk9WFsxNS0xXSwkc2lnbWEwWzFdIH0JLy8gUk9UUihzMCw4KQoreyAubWliOwkJYW5kY20JcjEwPUcsRQorCQkkU0hSVQlzMT1YWzE1LTE0XSxzZ20xIH07OwkvLyBzMT1YWyhpKzE0KSYweEZdPj42Cit7IC5tbWk7CQl4b3IJVDE9VDEscjEwCQkvLyBUMT0oKGUgJiBmKSBeICh+ZSAmIGcpKQorCQl4b3IJcjk9cjgscjkKKwkJX3JvdHIJcjEwPVhbMTUtMTRdLCRzaWdtYTFbMF0gfTs7Ly8gUk9UUihzMSwxOSkKK3sgLm1pYjsJCWFuZAlUMj1BLEIJCQorCQlfcm90cglyMTE9WFsxNS0xNF0sJHNpZ21hMVsxXSB9Ly8gUk9UUihzMSw2MSkKK3sgLm1pYjsJCWFuZAlyOD1BLEMJCX07OworX19fCiskdDA9InQwIiwgJHQxPSJ0MSIsICRjb2RlLj08PF9fXyBpZiAoJEJJVFM9PTMyKTsKKy8vIEkgYWRoZXJlIHRvIG1taTsgaW4gb3JkZXIgdG8gaG9sZCBJdGFuaXVtIDEgYmFjayBhbmQgYXZvaWQgNiBjeWNsZQorLy8gcGlwZWxpbmUgZmx1c2ggaW4gbGFzdCBidW5kbGUuIE5vdGUgdGhhdCBldmVuIG9uIEl0YW5pdW0yIHRoZQorLy8gbGF0dGVyIHN0YWxscyBmb3Igb25lIGNsb2NrIGN5Y2xlLi4uCit7IC5tbWk7CQl4b3IJczA9czAscjkJCS8vIHMwPXNpZ21hMChYWyhpKzEpJjB4Rl0pCisJCWRlcC56CSR0MT1FLDMyLDMyCX0KK3sgLm1taTsJCXhvcglyMTA9cjExLHIxMAorCQl6eHQ0CUU9RQkJfTs7Cit7IC5tbWk7CQlvcgkkdDE9JHQxLEUKKwkJeG9yCXMxPXMxLHIxMAkJLy8gczE9c2lnbWExKFhbKGkrMTQpJjB4Rl0pCisJCW11eDIJJHQwPUEsMHg0NAl9OzsJLy8gY29weSBsb3dlciBoYWxmIHRvIHVwcGVyCit7IC5tbWk7CQl4b3IJVDI9VDIscjgKKwkJX3JvdHIJcjk9JHQxLCRTaWdtYTFbMF0gfQkvLyBST1RSKGUsMTQpCit7IC5tbWk7CQlhbmQJcjEwPUIsQworCQlhZGQJVDE9VDEsSAkJCS8vIFQxPUNoKGUsZixnKStoCisJCSRBREQJWFsxNV09WFsxNV0sczAJfTs7CS8vIFhbaSYweEZdKz1zaWdtYTAoWFsoaSsxKSYweEZdKQorX19fCiskdDA9IkEiLCAkdDE9IkUiLCAkY29kZS49PDxfX18gaWYgKCRCSVRTPT02NCk7Cit7IC5taWI7CQl4b3IJczA9czAscjkJCS8vIHMwPXNpZ21hMChYWyhpKzEpJjB4Rl0pCisJCV9yb3RyCXI5PSR0MSwkU2lnbWExWzBdIH0JLy8gUk9UUihlLDE0KQoreyAubWliOwkJeG9yCXIxMD1yMTEscjEwCisJCXhvcglUMj1UMixyOAl9OzsKK3sgLm1pYjsJCXhvcglzMT1zMSxyMTAJCS8vIHMxPXNpZ21hMShYWyhpKzE0KSYweEZdKQorCQlhZGQJVDE9VDEsSAkJfQoreyAubWliOwkJYW5kCXIxMD1CLEMKKwkJJEFERAlYWzE1XT1YWzE1XSxzMAl9OzsJLy8gWFtpJjB4Rl0rPXNpZ21hMChYWyhpKzEpJjB4Rl0pCitfX18KKyRjb2RlLj08PF9fXzsKK3sgLm1taTsJCXhvcglUMj1UMixyMTAJCS8vIFQyPSgoYSAmIGIpIF4gKGEgJiBjKSBeIChiICYgYykpCisJCW1vdglIPUcKKwkJX3JvdHIJcjg9JHQxLCRTaWdtYTFbMV0gfTs7CS8vIFJPVFIoZSwxOCkKK3sgLm1taTsJCXhvcglyMTE9cjgscjkKKwkJJEFERAlYWzE1XT1YWzE1XSxzMQkJLy8gWFtpJjB4Rl0rPXNpZ21hMShYWyhpKzE0KSYweEZdKQorCQlfcm90cglyOT0kdDEsJFNpZ21hMVsyXSB9CS8vIFJPVFIoZSw0MSkKK3sgLm1taTsJCW1vdglHPUYKKwkJbW92CUY9RQkJfTs7Cit7IC5taWI7CQl4b3IJcjk9cjkscjExCQkvLyByOT1TaWdtYTEoZSkKKwkJX3JvdHIJcjEwPSR0MCwkU2lnbWEwWzBdIH0JLy8gUk9UUihhLDI4KQoreyAubWliOwkJYWRkCVQxPVQxLEsJCQkvLyBUMT1DaChlLGYsZykraCtLNTEyW2ldCisJCW1vdglFPUQJCX07OworeyAubWliOwkJYWRkCVQxPVQxLHI5CQkvLyBUMSs9U2lnbWExKGUpCisJCV9yb3RyCXIxMT0kdDAsJFNpZ21hMFsxXSB9CS8vIFJPVFIoYSwzNCkKK3sgLm1pYjsJCW1vdglEPUMKKwkJbW92CUM9QgkJfTs7Cit7IC5tbWk7CQlhZGQJVDE9VDEsWFsxNV0JCS8vIFQxKz1YW2ldCisJCXhvcglyMTA9cjEwLHIxMQorCQlfcm90cglyOD0kdDAsJFNpZ21hMFsyXSB9OzsJLy8gUk9UUihhLDM5KQoreyAubW1pOwkJeG9yCXIxMD1yOCxyMTAJCS8vIHIxMD1TaWdtYTAoYSkKKwkJbW92CUI9QQorCQlhZGQJQT1UMSxUMgkJfTs7Cit7IC5taWI7CQlhZGQJRT1FLFQxCisJCWFkZAlBPUEscjEwCQkJLy8gVDI9TWFqKGEsYixjKStTaWdtYTAoYSkKKwlici5jdG9wLnNwdGsJLkxfcmVzdAl9OzsKKy5MX3Jlc3RfZW5kOgorCit7IC5tbWk7CWFkZAlBXz1BXyxBCisJYWRkCUJfPUJfLEIKKwlhZGQJQ189Q18sQwkJCX0KK3sgLm1taTsJYWRkCURfPURfLEQKKwlhZGQJRV89RV8sRQorCWNtcC5sdHUJcDE2LHAwPTEsbnVtCQl9OzsKK3sgLm1taTsJYWRkCUZfPUZfLEYKKwlhZGQJR189R18sRworCWFkZAlIXz1IXyxICQkJfQoreyAubW1iOwlhZGQJS3RibD0tJFNaKiRyb3VuZHMsS3RibAorKHAxNikJYWRkCW51bT0tMSxudW0KKyhwMTYpCWJyLmRwdGsubWFueQkuTF9vdXRlcgl9OzsKKworeyAubWliOwlhZGQJcjg9MCokU1osY3R4CisJYWRkCXI5PTEqJFNaLGN0eAkJfQoreyAubWliOwlhZGQJcjEwPTIqJFNaLGN0eAorCWFkZAlyMTE9MyokU1osY3R4CQl9OzsKK3sgLm1taTsJJFNUVwlbcjhdPUFfLDQqJFNaCisJJFNUVwlbcjldPUJfLDQqJFNaCisJbW92CWFyLmxjPWxjc2F2ZQkJfQoreyAubW1pOwkkU1RXCVtyMTBdPUNfLDQqJFNaCisJJFNUVwlbcjExXT1EXyw0KiRTWgorCW1vdglwcj1wcnNhdmUsMHgxZmZmZgl9OzsKK3sgLm1tYjsJJFNUVwlbcjhdPUVfCisJJFNUVwlbcjldPUZfCQkJfQoreyAubW1iOwkkU1RXCVtyMTBdPUdfCisJJFNUVwlbcjExXT1IXworCWJyLnJldC5zcHRrLm1hbnkJYjAJfTs7CisuZW5kcAkkZnVuYyMKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKKyRjb2RlID1+IHMvX3JvdHIoXHMrKShbXj1dKyk9KFteLF0rKSwoWzAtOV0rKS9zaHJwJDEkMj0kMywkMywkNC9nbTsKK2lmICgkQklUUz09NjQpIHsKKyAgICAkY29kZSA9fiBzL211eDIoXHMrKVxTKy9ub3AuaSQxIDB4MC9nbTsKKyAgICAkY29kZSA9fiBzL211eDEoXHMrKVxTKy9ub3AuaSQxIDB4MC9nbQlpZiAoJGJpZ19lbmRpYW4pOworICAgICRjb2RlID1+IHMvKHNocnBccytYXFtbXj1dKyk9KFteLF0rKSwoW14sXSspLChbMS05XSspLyQxPSQzLCQyLDY0LSQ0L2dtCisgICAgCQkJCQkJaWYgKCEkYmlnX2VuZGlhbik7CisgICAgJGNvZGUgPX4gcy9sZDEoXHMrKVhcW1xTKy9ub3AubSQxIDB4MC9nbTsKK30KKworcHJpbnQgJGNvZGU7CisKK3ByaW50PDxfX18gaWYgKCRCSVRTPT0zMik7CisuYWxpZ24JNjQKKy50eXBlCUsyNTYjLFxAb2JqZWN0CitLMjU2OglkYXRhNAkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisJZGF0YTQJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorCWRhdGE0CTB4ZDgwN2FhOTgsMHgxMjgzNWIwMSwweDI0MzE4NWJlLDB4NTUwYzdkYzMKKwlkYXRhNAkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisJZGF0YTQJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworCWRhdGE0CTB4MmRlOTJjNmYsMHg0YTc0ODRhYSwweDVjYjBhOWRjLDB4NzZmOTg4ZGEKKwlkYXRhNAkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisJZGF0YTQJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworCWRhdGE0CTB4MjdiNzBhODUsMHgyZTFiMjEzOCwweDRkMmM2ZGZjLDB4NTMzODBkMTMKKwlkYXRhNAkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisJZGF0YTQJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworCWRhdGE0CTB4ZDE5MmU4MTksMHhkNjk5MDYyNCwweGY0MGUzNTg1LDB4MTA2YWEwNzAKKwlkYXRhNAkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisJZGF0YTQJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworCWRhdGE0CTB4NzQ4ZjgyZWUsMHg3OGE1NjM2ZiwweDg0Yzg3ODE0LDB4OGNjNzAyMDgKKwlkYXRhNAkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCisuc2l6ZQlLMjU2IywkU1oqJHJvdW5kcworc3RyaW5negkiU0hBMjU2IGJsb2NrIHRyYW5zZm9ybSBmb3IgSUE2NCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworcHJpbnQ8PF9fXyBpZiAoJEJJVFM9PTY0KTsKKy5hbGlnbgk2NAorLnR5cGUJSzUxMiMsXEBvYmplY3QKK0s1MTI6CWRhdGE4CTB4NDI4YTJmOThkNzI4YWUyMiwweDcxMzc0NDkxMjNlZjY1Y2QKKwlkYXRhOAkweGI1YzBmYmNmZWM0ZDNiMmYsMHhlOWI1ZGJhNTgxODlkYmJjCisJZGF0YTgJMHgzOTU2YzI1YmYzNDhiNTM4LDB4NTlmMTExZjFiNjA1ZDAxOQorCWRhdGE4CTB4OTIzZjgyYTRhZjE5NGY5YiwweGFiMWM1ZWQ1ZGE2ZDgxMTgKKwlkYXRhOAkweGQ4MDdhYTk4YTMwMzAyNDIsMHgxMjgzNWIwMTQ1NzA2ZmJlCisJZGF0YTgJMHgyNDMxODViZTRlZTRiMjhjLDB4NTUwYzdkYzNkNWZmYjRlMgorCWRhdGE4CTB4NzJiZTVkNzRmMjdiODk2ZiwweDgwZGViMWZlM2IxNjk2YjEKKwlkYXRhOAkweDliZGMwNmE3MjVjNzEyMzUsMHhjMTliZjE3NGNmNjkyNjk0CisJZGF0YTgJMHhlNDliNjljMTllZjE0YWQyLDB4ZWZiZTQ3ODYzODRmMjVlMworCWRhdGE4CTB4MGZjMTlkYzY4YjhjZDViNSwweDI0MGNhMWNjNzdhYzljNjUKKwlkYXRhOAkweDJkZTkyYzZmNTkyYjAyNzUsMHg0YTc0ODRhYTZlYTZlNDgzCisJZGF0YTgJMHg1Y2IwYTlkY2JkNDFmYmQ0LDB4NzZmOTg4ZGE4MzExNTNiNQorCWRhdGE4CTB4OTgzZTUxNTJlZTY2ZGZhYiwweGE4MzFjNjZkMmRiNDMyMTAKKwlkYXRhOAkweGIwMDMyN2M4OThmYjIxM2YsMHhiZjU5N2ZjN2JlZWYwZWU0CisJZGF0YTgJMHhjNmUwMGJmMzNkYTg4ZmMyLDB4ZDVhNzkxNDc5MzBhYTcyNQorCWRhdGE4CTB4MDZjYTYzNTFlMDAzODI2ZiwweDE0MjkyOTY3MGEwZTZlNzAKKwlkYXRhOAkweDI3YjcwYTg1NDZkMjJmZmMsMHgyZTFiMjEzODVjMjZjOTI2CisJZGF0YTgJMHg0ZDJjNmRmYzVhYzQyYWVkLDB4NTMzODBkMTM5ZDk1YjNkZgorCWRhdGE4CTB4NjUwYTczNTQ4YmFmNjNkZSwweDc2NmEwYWJiM2M3N2IyYTgKKwlkYXRhOAkweDgxYzJjOTJlNDdlZGFlZTYsMHg5MjcyMmM4NTE0ODIzNTNiCisJZGF0YTgJMHhhMmJmZThhMTRjZjEwMzY0LDB4YTgxYTY2NGJiYzQyMzAwMQorCWRhdGE4CTB4YzI0YjhiNzBkMGY4OTc5MSwweGM3NmM1MWEzMDY1NGJlMzAKKwlkYXRhOAkweGQxOTJlODE5ZDZlZjUyMTgsMHhkNjk5MDYyNDU1NjVhOTEwCisJZGF0YTgJMHhmNDBlMzU4NTU3NzEyMDJhLDB4MTA2YWEwNzAzMmJiZDFiOAorCWRhdGE4CTB4MTlhNGMxMTZiOGQyZDBjOCwweDFlMzc2YzA4NTE0MWFiNTMKKwlkYXRhOAkweDI3NDg3NzRjZGY4ZWViOTksMHgzNGIwYmNiNWUxOWI0OGE4CisJZGF0YTgJMHgzOTFjMGNiM2M1Yzk1YTYzLDB4NGVkOGFhNGFlMzQxOGFjYgorCWRhdGE4CTB4NWI5Y2NhNGY3NzYzZTM3MywweDY4MmU2ZmYzZDZiMmI4YTMKKwlkYXRhOAkweDc0OGY4MmVlNWRlZmIyZmMsMHg3OGE1NjM2ZjQzMTcyZjYwCisJZGF0YTgJMHg4NGM4NzgxNGExZjBhYjcyLDB4OGNjNzAyMDgxYTY0MzllYworCWRhdGE4CTB4OTBiZWZmZmEyMzYzMWUyOCwweGE0NTA2Y2ViZGU4MmJkZTkKKwlkYXRhOAkweGJlZjlhM2Y3YjJjNjc5MTUsMHhjNjcxNzhmMmUzNzI1MzJiCisJZGF0YTgJMHhjYTI3M2VjZWVhMjY2MTljLDB4ZDE4NmI4YzcyMWMwYzIwNworCWRhdGE4CTB4ZWFkYTdkZDZjZGUwZWIxZSwweGY1N2Q0ZjdmZWU2ZWQxNzgKKwlkYXRhOAkweDA2ZjA2N2FhNzIxNzZmYmEsMHgwYTYzN2RjNWEyYzg5OGE2CisJZGF0YTgJMHgxMTNmOTgwNGJlZjkwZGFlLDB4MWI3MTBiMzUxMzFjNDcxYgorCWRhdGE4CTB4MjhkYjc3ZjUyMzA0N2Q4NCwweDMyY2FhYjdiNDBjNzI0OTMKKwlkYXRhOAkweDNjOWViZTBhMTVjOWJlYmMsMHg0MzFkNjdjNDljMTAwZDRjCisJZGF0YTgJMHg0Y2M1ZDRiZWNiM2U0MmI2LDB4NTk3ZjI5OWNmYzY1N2UyYQorCWRhdGE4CTB4NWZjYjZmYWIzYWQ2ZmFlYywweDZjNDQxOThjNGE0NzU4MTcKKy5zaXplCUs1MTIjLCRTWiokcm91bmRzCitzdHJpbmd6CSJTSEE1MTIgYmxvY2sgdHJhbnNmb3JtIGZvciBJQTY0LCBDUllQVE9HQU1TIGJ5IDxhcHByb1xAb3BlbnNzbC5vcmc+IgorX19fCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItcHBjLnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLXBwYy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhhNmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLXBwYy5wbApAQCAtMCwwICsxLDQ2MiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIEkgbGV0IGhhcmR3YXJlIGhhbmRsZSB1bmFsaWduZWQgaW5wdXQsIGV4Y2VwdCBvbiBwYWdlIGJvdW5kYXJpZXMKKyMgKHNlZSBiZWxvdyBmb3IgZGV0YWlscykuIE90aGVyd2lzZSBzdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24KKyMgd2l0aCBYIHZlY3RvciBpbiByZWdpc3RlciBiYW5rLiBUaGUgbW9kdWxlIGlzIGJpZy1lbmRpYW4gW3doaWNoIGlzCisjIG5vdCBiaWcgZGVhbCBhcyB0aGVyZSdyZSBubyBsaXR0bGUtZW5kaWFuIHRhcmdldHMgbGVmdCBhcm91bmRdLgorCisjCQkJc2hhMjU2CQl8CXNoYTUxMgorIyAJCQktbTY0CS1tMzIJfAktbTY0CS1tMzIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUFBDOTcwLGdjYy00LjAuMAkrNTAlCSszOCUJfAkrNDAlCSs0MTAlKCopCisjIFBvd2VyNix4bGMtNwkJKzE1MCUJKzkwJQl8CSsxMDAlCSs0MzAlKCopCisjCisjICgqKQk2NC1iaXQgY29kZSBpbiAzMi1iaXQgYXBwbGljYXRpb24gY29udGV4dCwgd2hpY2ggYWN0dWFsbHkgaXMKKyMJb24gVE9ETyBsaXN0LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBmb3Igc2FmZSBkZXBsb3ltZW50IGluCisjCTMyLWJpdCAqbXV0bGktdGhyZWFkZWQqIGNvbnRleHQgYXN5bmNyb25vdXMgc2lnbmFscyBzaG91bGQgYmUKKyMJYmxvY2tlZCB1cG9uIGVudHJ5IHRvIFNIQTUxMiBibG9jayByb3V0aW5lLiBUaGlzIGlzIGJlY2F1c2UKKyMJMzItYml0IHNpZ25hbGluZyBwcm9jZWR1cmUgaW52YWxpZGF0ZXMgdXBwZXIgaGFsdmVzIG9mIEdQUnMuCisjCUNvbnRleHQgc3dpdGNoIHByb2NlZHVyZSBwcmVzZXJ2ZXMgdGhlbSwgYnV0IG5vdCBzaWduYWxpbmc6LSgKKworIyBTZWNvbmQgdmVyc2lvbiBpcyB0cnVlIG11bHRpLXRocmVhZCBzYWZlLiBUcm91YmxlIHdpdGggdGhlIG9yaWdpbmFsCisjIHZlcnNpb24gd2FzIHRoYXQgaXQgd2FzIHVzaW5nIHRocmVhZCBsb2NhbCBzdG9yYWdlIHBvaW50ZXIgcmVnaXN0ZXIuCisjIFdlbGwsIGl0IHNjcnVwdWxvdXNseSBwcmVzZXJ2ZWQgaXQsIGJ1dCB0aGUgcHJvYmxlbSB3b3VsZCBhcmlzZSB0aGUKKyMgbW9tZW50IGFzeW5jaHJvbm91cyBzaWduYWwgd2FzIGRlbGl2ZXJlZCBhbmQgc2lnbmFsIGhhbmRsZXIgd291bGQKKyMgZGVyZWZlcmVuY2UgdGhlIFRMUyBwb2ludGVyLiBXaGlsZSBpdCdzIG5ldmVyIHRoZSBjYXNlIGluIG9wZW5zc2wKKyMgYXBwbGljYXRpb24gb3IgdGVzdCBzdWl0ZSwgd2UgaGF2ZSB0byByZXNwZWN0IHRoaXMgc2NlbmFyaW8gYW5kIG5vdAorIyB1c2UgVExTIHBvaW50ZXIgcmVnaXN0ZXIuIEFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIHJlcXVpcmUgY2FsbGVyIHRvCisjIGJsb2NrIHNpZ25hbHMgcHJpb3IgY2FsbGluZyB0aGlzIHJvdXRpbmUuIEZvciB0aGUgcmVjb3JkLCBpbiAzMi1iaXQKKyMgY29udGV4dCBSMiBzZXJ2ZXMgYXMgVExTIHBvaW50ZXIsIHdoaWxlIGluIDY0LWJpdCBjb250ZXh0IC0gUjEzLgorCiskZmxhdm91cj1zaGlmdDsKKyRvdXRwdXQgPXNoaWZ0OworCitpZiAoJGZsYXZvdXIgPX4gLzY0LykgeworCSRTSVpFX1Q9ODsKKwkkU1RVPSJzdGR1IjsKKwkkVUNNUD0iY21wbGQiOworCSRTSEw9InNsZGkiOworCSRQT1A9ImxkIjsKKwkkUFVTSD0ic3RkIjsKK30gZWxzaWYgKCRmbGF2b3VyID1+IC8zMi8pIHsKKwkkU0laRV9UPTQ7CisJJFNUVT0ic3R3dSI7CisJJFVDTVA9ImNtcGx3IjsKKwkkU0hMPSJzbHdpIjsKKwkkUE9QPSJsd3oiOworCSRQVVNIPSJzdHciOworfSBlbHNlIHsgZGllICJub25zZW5zZSAkZmxhdm91ciI7IH0KKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKKyggJHhsYXRlPSIke2Rpcn1wcGMteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgorKCAkeGxhdGU9IiR7ZGlyfS4uLy4uL3Blcmxhc20vcHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlKSBvcgorZGllICJjYW4ndCBsb2NhdGUgcHBjLXhsYXRlLnBsIjsKKworb3BlbiBTVERPVVQsInwgJF5YICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IiB8fCBkaWUgImNhbid0IGNhbGwgJHhsYXRlOiAkISI7CisKK2lmICgkb3V0cHV0ID1+IC81MTIvKSB7CisJJGZ1bmM9InNoYTUxMl9ibG9ja19kYXRhX29yZGVyIjsKKwkkU1o9ODsKKwlAU2lnbWEwPSgyOCwzNCwzOSk7CisJQFNpZ21hMT0oMTQsMTgsNDEpOworCUBzaWdtYTA9KDEsICA4LCA3KTsKKwlAc2lnbWExPSgxOSw2MSwgNik7CisJJHJvdW5kcz04MDsKKwkkTEQ9ImxkIjsKKwkkU1Q9InN0ZCI7CisJJFJPUj0icm90cmRpIjsKKwkkU0hSPSJzcmRpIjsKK30gZWxzZSB7CisJJGZ1bmM9InNoYTI1Nl9ibG9ja19kYXRhX29yZGVyIjsKKwkkU1o9NDsKKwlAU2lnbWEwPSggMiwxMywyMik7CisJQFNpZ21hMT0oIDYsMTEsMjUpOworCUBzaWdtYTA9KCA3LDE4LCAzKTsKKwlAc2lnbWExPSgxNywxOSwxMCk7CisJJHJvdW5kcz02NDsKKwkkTEQ9Imx3eiI7CisJJFNUPSJzdHciOworCSRST1I9InJvdHJ3aSI7CisJJFNIUj0ic3J3aSI7Cit9CisKKyRGUkFNRT0zMiokU0laRV9UOworCiskc3AgPSJyMSI7CiskdG9jPSJyMiI7CiskY3R4PSJyMyI7CSMgemFwcGVkIGJ5ICRhMAorJGlucD0icjQiOwkjIHphcHBlZCBieSAkYTEKKyRudW09InI1IjsJIyB6YXBwZWQgYnkgJHQwCisKKyRUICA9InIwIjsKKyRhMCA9InIzIjsKKyRhMSA9InI0IjsKKyR0MCA9InI1IjsKKyR0MSA9InI2IjsKKyRUYmw9InI3IjsKKworJEEgID0icjgiOworJEIgID0icjkiOworJEMgID0icjEwIjsKKyREICA9InIxMSI7CiskRSAgPSJyMTIiOworJEYgID0icjEzIjsJJEY9InIyIiBpZiAoJFNJWkVfVD09OCk7IyByZWFzc2lnbmVkIHRvIGV4ZW1wdCBUTFMgcG9pbnRlcgorJEcgID0icjE0IjsKKyRIICA9InIxNSI7CisKK0BWPSgkQSwkQiwkQywkRCwkRSwkRiwkRywkSCk7CitAWD0oInIxNiIsInIxNyIsInIxOCIsInIxOSIsInIyMCIsInIyMSIsInIyMiIsInIyMyIsCisgICAgInIyNCIsInIyNSIsInIyNiIsInIyNyIsInIyOCIsInIyOSIsInIzMCIsInIzMSIpOworCiskaW5wPSJyMzEiOwkjIHJlYXNzaWduZWQgJGlucCEgYWxpYXNlcyB3aXRoIEBYWzE1XQorCitzdWIgUk9VTkRfMDBfMTUgeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlLCRmLCRnLCRoKT1AXzsKKyRjb2RlLj08PF9fXzsKKwkkTEQJJFQsYCRpKiRTWmAoJFRibCkKKwkkUk9SCSRhMCwkZSwkU2lnbWExWzBdCisJJFJPUgkkYTEsJGUsJFNpZ21hMVsxXQorCWFuZAkkdDAsJGYsJGUKKwlhbmRjCSR0MSwkZywkZQorCWFkZAkkVCwkVCwkaAorCXhvcgkkYTAsJGEwLCRhMQorCSRST1IJJGExLCRhMSxgJFNpZ21hMVsyXS0kU2lnbWExWzFdYAorCW9yCSR0MCwkdDAsJHQxCQk7IENoKGUsZixnKQorCWFkZAkkVCwkVCxAWFskaV0KKwl4b3IJJGEwLCRhMCwkYTEJCTsgU2lnbWExKGUpCisJYWRkCSRULCRULCR0MAorCWFkZAkkVCwkVCwkYTAKKworCSRST1IJJGEwLCRhLCRTaWdtYTBbMF0KKwkkUk9SCSRhMSwkYSwkU2lnbWEwWzFdCisJYW5kCSR0MCwkYSwkYgorCWFuZAkkdDEsJGEsJGMKKwl4b3IJJGEwLCRhMCwkYTEKKwkkUk9SCSRhMSwkYTEsYCRTaWdtYTBbMl0tJFNpZ21hMFsxXWAKKwl4b3IJJHQwLCR0MCwkdDEKKwlhbmQJJHQxLCRiLCRjCisJeG9yCSRhMCwkYTAsJGExCQk7IFNpZ21hMChhKQorCWFkZAkkZCwkZCwkVAorCXhvcgkkdDAsJHQwLCR0MQkJOyBNYWooYSxiLGMpCisJYWRkCSRoLCRULCRhMAorCWFkZAkkaCwkaCwkdDAKKworX19fCit9CisKK3N1YiBST1VORF8xNl94eCB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpPUBfOworJGktPTE2OworJGNvZGUuPTw8X19fOworCSRST1IJJGEwLEBYWygkaSsxKSUxNl0sJHNpZ21hMFswXQorCSRST1IJJGExLEBYWygkaSsxKSUxNl0sJHNpZ21hMFsxXQorCSRST1IJJHQwLEBYWygkaSsxNCklMTZdLCRzaWdtYTFbMF0KKwkkUk9SCSR0MSxAWFsoJGkrMTQpJTE2XSwkc2lnbWExWzFdCisJeG9yCSRhMCwkYTAsJGExCisJJFNIUgkkYTEsQFhbKCRpKzEpJTE2XSwkc2lnbWEwWzJdCisJeG9yCSR0MCwkdDAsJHQxCisJJFNIUgkkdDEsQFhbKCRpKzE0KSUxNl0sJHNpZ21hMVsyXQorCWFkZAlAWFskaV0sQFhbJGldLEBYWygkaSs5KSUxNl0KKwl4b3IJJGEwLCRhMCwkYTEJCTsgc2lnbWEwKFhbKGkrMSkmMHgwZl0pCisJeG9yCSR0MCwkdDAsJHQxCQk7IHNpZ21hMShYWyhpKzE0KSYweDBmXSkKKwlhZGQJQFhbJGldLEBYWyRpXSwkYTAKKwlhZGQJQFhbJGldLEBYWyRpXSwkdDAKK19fXworJlJPVU5EXzAwXzE1KCRpLCRhLCRiLCRjLCRkLCRlLCRmLCRnLCRoKTsKK30KKworJGNvZGU9PDxfX187CisubWFjaGluZQkiYW55IgorLnRleHQKKworLmdsb2JsCSRmdW5jCisuYWxpZ24JNgorJGZ1bmM6CisJbWZscglyMAorCSRTVFUJJHNwLGAtKCRGUkFNRSsxNiokU1opYCgkc3ApCisJJFNITAkkbnVtLCRudW0sYGxvZygxNiokU1opL2xvZygyKWAKKworCSRQVVNICSRjdHgsYCRGUkFNRS0kU0laRV9UKjIyYCgkc3ApCisKKwkkUFVTSAlyMCxgJEZSQU1FLSRTSVpFX1QqMjFgKCRzcCkKKwkkUFVTSAkkdG9jLGAkRlJBTUUtJFNJWkVfVCoyMGAoJHNwKQorCSRQVVNICXIxMyxgJEZSQU1FLSRTSVpFX1QqMTlgKCRzcCkKKwkkUFVTSAlyMTQsYCRGUkFNRS0kU0laRV9UKjE4YCgkc3ApCisJJFBVU0gJcjE1LGAkRlJBTUUtJFNJWkVfVCoxN2AoJHNwKQorCSRQVVNICXIxNixgJEZSQU1FLSRTSVpFX1QqMTZgKCRzcCkKKwkkUFVTSAlyMTcsYCRGUkFNRS0kU0laRV9UKjE1YCgkc3ApCisJJFBVU0gJcjE4LGAkRlJBTUUtJFNJWkVfVCoxNGAoJHNwKQorCSRQVVNICXIxOSxgJEZSQU1FLSRTSVpFX1QqMTNgKCRzcCkKKwkkUFVTSAlyMjAsYCRGUkFNRS0kU0laRV9UKjEyYCgkc3ApCisJJFBVU0gJcjIxLGAkRlJBTUUtJFNJWkVfVCoxMWAoJHNwKQorCSRQVVNICXIyMixgJEZSQU1FLSRTSVpFX1QqMTBgKCRzcCkKKwkkUFVTSAlyMjMsYCRGUkFNRS0kU0laRV9UKjlgKCRzcCkKKwkkUFVTSAlyMjQsYCRGUkFNRS0kU0laRV9UKjhgKCRzcCkKKwkkUFVTSAlyMjUsYCRGUkFNRS0kU0laRV9UKjdgKCRzcCkKKwkkUFVTSAlyMjYsYCRGUkFNRS0kU0laRV9UKjZgKCRzcCkKKwkkUFVTSAlyMjcsYCRGUkFNRS0kU0laRV9UKjVgKCRzcCkKKwkkUFVTSAlyMjgsYCRGUkFNRS0kU0laRV9UKjRgKCRzcCkKKwkkUFVTSAlyMjksYCRGUkFNRS0kU0laRV9UKjNgKCRzcCkKKwkkUFVTSAlyMzAsYCRGUkFNRS0kU0laRV9UKjJgKCRzcCkKKwkkUFVTSAlyMzEsYCRGUkFNRS0kU0laRV9UKjFgKCRzcCkKKworCSRMRAkkQSxgMCokU1pgKCRjdHgpCisJbXIJJGlucCxyNAkJCQk7IGluY2FybmF0ZSAkaW5wCisJJExECSRCLGAxKiRTWmAoJGN0eCkKKwkkTEQJJEMsYDIqJFNaYCgkY3R4KQorCSRMRAkkRCxgMyokU1pgKCRjdHgpCisJJExECSRFLGA0KiRTWmAoJGN0eCkKKwkkTEQJJEYsYDUqJFNaYCgkY3R4KQorCSRMRAkkRyxgNiokU1pgKCRjdHgpCisJJExECSRILGA3KiRTWmAoJGN0eCkKKworCWIJTFBJQ21ldXAKK0xQSUNlZHVwOgorCWFuZGkuCXIwLCRpbnAsMworCWJuZQlMdW5hbGlnbmVkCitMYWxpZ25lZDoKKwlhZGQJJG51bSwkaW5wLCRudW0KKwkkUFVTSAkkbnVtLGAkRlJBTUUtJFNJWkVfVCoyNGAoJHNwKQk7IGVuZCBwb2ludGVyCisJJFBVU0gJJGlucCxgJEZSQU1FLSRTSVpFX1QqMjNgKCRzcCkJOyBpbnAgcG9pbnRlcgorCWJsCUxzaGEyX2Jsb2NrX3ByaXZhdGUKK0xkb25lOgorCSRQT1AJcjAsYCRGUkFNRS0kU0laRV9UKjIxYCgkc3ApCisJJFBPUAkkdG9jLGAkRlJBTUUtJFNJWkVfVCoyMGAoJHNwKQorCSRQT1AJcjEzLGAkRlJBTUUtJFNJWkVfVCoxOWAoJHNwKQorCSRQT1AJcjE0LGAkRlJBTUUtJFNJWkVfVCoxOGAoJHNwKQorCSRQT1AJcjE1LGAkRlJBTUUtJFNJWkVfVCoxN2AoJHNwKQorCSRQT1AJcjE2LGAkRlJBTUUtJFNJWkVfVCoxNmAoJHNwKQorCSRQT1AJcjE3LGAkRlJBTUUtJFNJWkVfVCoxNWAoJHNwKQorCSRQT1AJcjE4LGAkRlJBTUUtJFNJWkVfVCoxNGAoJHNwKQorCSRQT1AJcjE5LGAkRlJBTUUtJFNJWkVfVCoxM2AoJHNwKQorCSRQT1AJcjIwLGAkRlJBTUUtJFNJWkVfVCoxMmAoJHNwKQorCSRQT1AJcjIxLGAkRlJBTUUtJFNJWkVfVCoxMWAoJHNwKQorCSRQT1AJcjIyLGAkRlJBTUUtJFNJWkVfVCoxMGAoJHNwKQorCSRQT1AJcjIzLGAkRlJBTUUtJFNJWkVfVCo5YCgkc3ApCisJJFBPUAlyMjQsYCRGUkFNRS0kU0laRV9UKjhgKCRzcCkKKwkkUE9QCXIyNSxgJEZSQU1FLSRTSVpFX1QqN2AoJHNwKQorCSRQT1AJcjI2LGAkRlJBTUUtJFNJWkVfVCo2YCgkc3ApCisJJFBPUAlyMjcsYCRGUkFNRS0kU0laRV9UKjVgKCRzcCkKKwkkUE9QCXIyOCxgJEZSQU1FLSRTSVpFX1QqNGAoJHNwKQorCSRQT1AJcjI5LGAkRlJBTUUtJFNJWkVfVCozYCgkc3ApCisJJFBPUAlyMzAsYCRGUkFNRS0kU0laRV9UKjJgKCRzcCkKKwkkUE9QCXIzMSxgJEZSQU1FLSRTSVpFX1QqMWAoJHNwKQorCW10bHIJcjAKKwlhZGRpCSRzcCwkc3AsYCRGUkFNRSsxNiokU1pgCisJYmxyCitfX18KKworIyBQb3dlclBDIHNwZWNpZmljYXRpb24gYWxsb3dzIGFuIGltcGxlbWVudGF0aW9uIHRvIGJlIGlsbC1iZWhhdmVkCisjIHVwb24gdW5hbGlnbmVkIGFjY2VzcyB3aGljaCBjcm9zc2VzIHBhZ2UgYm91bmRhcnkuICJCZXR0ZXIgc2FmZQorIyB0aGFuIHNvcnJ5IiBwcmluY2lwbGUgbWFrZXMgbWUgdHJlYXQgaXQgc3BlY2lhbGx5LiBCdXQgSSBkb24ndAorIyBsb29rIGZvciBwYXJ0aWN1bGFyIG9mZmVuZGluZyB3b3JkLCBidXQgcmF0aGVyIGZvciB0aGUgaW5wdXQKKyMgYmxvY2sgd2hpY2ggY3Jvc3NlcyB0aGUgYm91bmRhcnkuIE9uY2UgZm91bmQgdGhhdCBibG9jayBpcyBhbGlnbmVkCisjIGFuZCBoYXNoZWQgc2VwYXJhdGVseS4uLgorJGNvZGUuPTw8X19fOworLmFsaWduCTQKK0x1bmFsaWduZWQ6CisJc3ViZmljCSR0MSwkaW5wLDQwOTYKKwlhbmRpLgkkdDEsJHQxLGA0MDk2LTE2KiRTWmAJOyBkaXN0YW5jZSB0byBjbG9zZXN0IHBhZ2UgYm91bmRhcnkKKwliZXEJTGNyb3NzX3BhZ2UKKwkkVUNNUAkkbnVtLCR0MQorCWJsZS0JTGFsaWduZWQJCTsgZGlkbid0IGNyb3NzIHRoZSBwYWdlIGJvdW5kYXJ5CisJc3ViZmMJJG51bSwkdDEsJG51bQorCWFkZAkkdDEsJGlucCwkdDEKKwkkUFVTSAkkbnVtLGAkRlJBTUUtJFNJWkVfVCoyNWAoJHNwKQk7IHNhdmUgcmVhbCByZW1haW5pbmcgbnVtCisJJFBVU0gJJHQxLGAkRlJBTUUtJFNJWkVfVCoyNGAoJHNwKQk7IGludGVybWVkaWF0ZSBlbmQgcG9pbnRlcgorCSRQVVNICSRpbnAsYCRGUkFNRS0kU0laRV9UKjIzYCgkc3ApCTsgaW5wIHBvaW50ZXIKKwlibAlMc2hhMl9ibG9ja19wcml2YXRlCisJOyAkaW5wIGVxdWFscyB0byB0aGUgaW50ZXJtZWRpYXRlIGVuZCBwb2ludGVyIGhlcmUKKwkkUE9QCSRudW0sYCRGUkFNRS0kU0laRV9UKjI1YCgkc3ApCTsgcmVzdG9yZSByZWFsIHJlbWFpbmluZyBudW0KK0xjcm9zc19wYWdlOgorCWxpCSR0MSxgMTYqJFNaLzRgCisJbXRjdHIJJHQxCisJYWRkaQlyMjAsJHNwLCRGUkFNRQkJCTsgYWxpZ25lZCBzcG90IGJlbG93IHRoZSBmcmFtZQorTG1lbWNweToKKwlsYnoJcjE2LDAoJGlucCkKKwlsYnoJcjE3LDEoJGlucCkKKwlsYnoJcjE4LDIoJGlucCkKKwlsYnoJcjE5LDMoJGlucCkKKwlhZGRpCSRpbnAsJGlucCw0CisJc3RiCXIxNiwwKHIyMCkKKwlzdGIJcjE3LDEocjIwKQorCXN0YglyMTgsMihyMjApCisJc3RiCXIxOSwzKHIyMCkKKwlhZGRpCXIyMCxyMjAsNAorCWJkbnoJTG1lbWNweQorCisJJFBVU0gJJGlucCxgJEZSQU1FLSRTSVpFX1QqMjZgKCRzcCkJOyBzYXZlIHJlYWwgaW5wCisJYWRkaQkkdDEsJHNwLGAkRlJBTUUrMTYqJFNaYAkJOyBmaWN0aXRpb3VzIGVuZCBwb2ludGVyCisJYWRkaQkkaW5wLCRzcCwkRlJBTUUJCQk7IGZpY3RpdGlvdXMgaW5wIHBvaW50ZXIKKwkkUFVTSAkkbnVtLGAkRlJBTUUtJFNJWkVfVCoyNWAoJHNwKQk7IHNhdmUgcmVhbCBudW0KKwkkUFVTSAkkdDEsYCRGUkFNRS0kU0laRV9UKjI0YCgkc3ApCTsgZW5kIHBvaW50ZXIKKwkkUFVTSAkkaW5wLGAkRlJBTUUtJFNJWkVfVCoyM2AoJHNwKQk7IGlucCBwb2ludGVyCisJYmwJTHNoYTJfYmxvY2tfcHJpdmF0ZQorCSRQT1AJJGlucCxgJEZSQU1FLSRTSVpFX1QqMjZgKCRzcCkJOyByZXN0b3JlIHJlYWwgaW5wCisJJFBPUAkkbnVtLGAkRlJBTUUtJFNJWkVfVCoyNWAoJHNwKQk7IHJlc3RvcmUgcmVhbCBudW0KKwlhZGRpYy4JJG51bSwkbnVtLGAtMTYqJFNaYAkJOyBudW0tLQorCWJuZS0JTHVuYWxpZ25lZAorCWIJTGRvbmUKK19fXworCiskY29kZS49PDxfX187CisuYWxpZ24JNAorTHNoYTJfYmxvY2tfcHJpdmF0ZToKK19fXworZm9yKCRpPTA7JGk8MTY7JGkrKykgeworJGNvZGUuPTw8X19fIGlmICgkU1o9PTQpOworCWx3eglAWFskaV0sYCRpKiRTWmAoJGlucCkKK19fXworIyA2NC1iaXQgbG9hZHMgYXJlIHNwbGl0IHRvIDJ4MzItYml0IG9uZXMsIGFzIENQVSBjYW4ndCBoYW5kbGUKKyMgdW5hbGlnbmVkIDY0LWJpdCBsb2Fkcywgb25seSAzMi1iaXQgb25lcy4uLgorJGNvZGUuPTw8X19fIGlmICgkU1o9PTgpOworCWx3egkkdDAsYCRpKiRTWmAoJGlucCkKKwlsd3oJQFhbJGldLGAkaSokU1orNGAoJGlucCkKKwlpbnNyZGkJQFhbJGldLCR0MCwzMiwwCitfX18KKwkmUk9VTkRfMDBfMTUoJGksQFYpOworCXVuc2hpZnQoQFYscG9wKEBWKSk7Cit9CiskY29kZS49PDxfX187CisJbGkJJFQsYCRyb3VuZHMvMTYtMWAKKwltdGN0cgkkVAorLmFsaWduCTQKK0xyb3VuZHM6CisJYWRkaQkkVGJsLCRUYmwsYDE2KiRTWmAKK19fXworZm9yKDskaTwzMjskaSsrKSB7CisJJlJPVU5EXzE2X3h4KCRpLEBWKTsKKwl1bnNoaWZ0KEBWLHBvcChAVikpOworfQorJGNvZGUuPTw8X19fOworCWJkbnotCUxyb3VuZHMKKworCSRQT1AJJGN0eCxgJEZSQU1FLSRTSVpFX1QqMjJgKCRzcCkKKwkkUE9QCSRpbnAsYCRGUkFNRS0kU0laRV9UKjIzYCgkc3ApCTsgaW5wIHBvaW50ZXIKKwkkUE9QCSRudW0sYCRGUkFNRS0kU0laRV9UKjI0YCgkc3ApCTsgZW5kIHBvaW50ZXIKKwlzdWJpCSRUYmwsJFRibCxgKCRyb3VuZHMtMTYpKiRTWmAJOyByZXdpbmQgVGJsCisKKwkkTEQJcjE2LGAwKiRTWmAoJGN0eCkKKwkkTEQJcjE3LGAxKiRTWmAoJGN0eCkKKwkkTEQJcjE4LGAyKiRTWmAoJGN0eCkKKwkkTEQJcjE5LGAzKiRTWmAoJGN0eCkKKwkkTEQJcjIwLGA0KiRTWmAoJGN0eCkKKwkkTEQJcjIxLGA1KiRTWmAoJGN0eCkKKwkkTEQJcjIyLGA2KiRTWmAoJGN0eCkKKwlhZGRpCSRpbnAsJGlucCxgMTYqJFNaYAkJOyBhZHZhbmNlIGlucAorCSRMRAlyMjMsYDcqJFNaYCgkY3R4KQorCWFkZAkkQSwkQSxyMTYKKwlhZGQJJEIsJEIscjE3CisJJFBVU0gJJGlucCxgJEZSQU1FLSRTSVpFX1QqMjNgKCRzcCkKKwlhZGQJJEMsJEMscjE4CisJJFNUCSRBLGAwKiRTWmAoJGN0eCkKKwlhZGQJJEQsJEQscjE5CisJJFNUCSRCLGAxKiRTWmAoJGN0eCkKKwlhZGQJJEUsJEUscjIwCisJJFNUCSRDLGAyKiRTWmAoJGN0eCkKKwlhZGQJJEYsJEYscjIxCisJJFNUCSRELGAzKiRTWmAoJGN0eCkKKwlhZGQJJEcsJEcscjIyCisJJFNUCSRFLGA0KiRTWmAoJGN0eCkKKwlhZGQJJEgsJEgscjIzCisJJFNUCSRGLGA1KiRTWmAoJGN0eCkKKwkkU1QJJEcsYDYqJFNaYCgkY3R4KQorCSRVQ01QCSRpbnAsJG51bQorCSRTVAkkSCxgNyokU1pgKCRjdHgpCisJYm5lCUxzaGEyX2Jsb2NrX3ByaXZhdGUKKwlibHIKK19fXworCisjIFVnbHkgaGFjayBoZXJlLCBiZWNhdXNlIFBQQyBhc3NlbWJsZXIgc3ludGF4IHNlZW0gdG8gdmFyeSB0b28KKyMgbXVjaCBmcm9tIHBsYXRmb3JtcyB0byBwbGF0Zm9ybS4uLgorJGNvZGUuPTw8X19fOworLmFsaWduCTYKK0xQSUNtZXVwOgorCWJsCUxQSUMKKwlhZGRpCSRUYmwsJFRibCxgNjQtNGAJOyAiZGlzdGFuY2UiIGJldHdlZW4gLiBhbmQgbGFzdCBub3AKKwliCUxQSUNlZHVwCisJbm9wCisJbm9wCisJbm9wCisJbm9wCisJbm9wCitMUElDOgltZmxyCSRUYmwKKwlibHIKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKKwlub3AKK19fXworJGNvZGUuPTw8X19fIGlmICgkU1o9PTgpOworCS5sb25nCTB4NDI4YTJmOTgsMHhkNzI4YWUyMiwweDcxMzc0NDkxLDB4MjNlZjY1Y2QKKwkubG9uZwkweGI1YzBmYmNmLDB4ZWM0ZDNiMmYsMHhlOWI1ZGJhNSwweDgxODlkYmJjCisJLmxvbmcJMHgzOTU2YzI1YiwweGYzNDhiNTM4LDB4NTlmMTExZjEsMHhiNjA1ZDAxOQorCS5sb25nCTB4OTIzZjgyYTQsMHhhZjE5NGY5YiwweGFiMWM1ZWQ1LDB4ZGE2ZDgxMTgKKwkubG9uZwkweGQ4MDdhYTk4LDB4YTMwMzAyNDIsMHgxMjgzNWIwMSwweDQ1NzA2ZmJlCisJLmxvbmcJMHgyNDMxODViZSwweDRlZTRiMjhjLDB4NTUwYzdkYzMsMHhkNWZmYjRlMgorCS5sb25nCTB4NzJiZTVkNzQsMHhmMjdiODk2ZiwweDgwZGViMWZlLDB4M2IxNjk2YjEKKwkubG9uZwkweDliZGMwNmE3LDB4MjVjNzEyMzUsMHhjMTliZjE3NCwweGNmNjkyNjk0CisJLmxvbmcJMHhlNDliNjljMSwweDllZjE0YWQyLDB4ZWZiZTQ3ODYsMHgzODRmMjVlMworCS5sb25nCTB4MGZjMTlkYzYsMHg4YjhjZDViNSwweDI0MGNhMWNjLDB4NzdhYzljNjUKKwkubG9uZwkweDJkZTkyYzZmLDB4NTkyYjAyNzUsMHg0YTc0ODRhYSwweDZlYTZlNDgzCisJLmxvbmcJMHg1Y2IwYTlkYywweGJkNDFmYmQ0LDB4NzZmOTg4ZGEsMHg4MzExNTNiNQorCS5sb25nCTB4OTgzZTUxNTIsMHhlZTY2ZGZhYiwweGE4MzFjNjZkLDB4MmRiNDMyMTAKKwkubG9uZwkweGIwMDMyN2M4LDB4OThmYjIxM2YsMHhiZjU5N2ZjNywweGJlZWYwZWU0CisJLmxvbmcJMHhjNmUwMGJmMywweDNkYTg4ZmMyLDB4ZDVhNzkxNDcsMHg5MzBhYTcyNQorCS5sb25nCTB4MDZjYTYzNTEsMHhlMDAzODI2ZiwweDE0MjkyOTY3LDB4MGEwZTZlNzAKKwkubG9uZwkweDI3YjcwYTg1LDB4NDZkMjJmZmMsMHgyZTFiMjEzOCwweDVjMjZjOTI2CisJLmxvbmcJMHg0ZDJjNmRmYywweDVhYzQyYWVkLDB4NTMzODBkMTMsMHg5ZDk1YjNkZgorCS5sb25nCTB4NjUwYTczNTQsMHg4YmFmNjNkZSwweDc2NmEwYWJiLDB4M2M3N2IyYTgKKwkubG9uZwkweDgxYzJjOTJlLDB4NDdlZGFlZTYsMHg5MjcyMmM4NSwweDE0ODIzNTNiCisJLmxvbmcJMHhhMmJmZThhMSwweDRjZjEwMzY0LDB4YTgxYTY2NGIsMHhiYzQyMzAwMQorCS5sb25nCTB4YzI0YjhiNzAsMHhkMGY4OTc5MSwweGM3NmM1MWEzLDB4MDY1NGJlMzAKKwkubG9uZwkweGQxOTJlODE5LDB4ZDZlZjUyMTgsMHhkNjk5MDYyNCwweDU1NjVhOTEwCisJLmxvbmcJMHhmNDBlMzU4NSwweDU3NzEyMDJhLDB4MTA2YWEwNzAsMHgzMmJiZDFiOAorCS5sb25nCTB4MTlhNGMxMTYsMHhiOGQyZDBjOCwweDFlMzc2YzA4LDB4NTE0MWFiNTMKKwkubG9uZwkweDI3NDg3NzRjLDB4ZGY4ZWViOTksMHgzNGIwYmNiNSwweGUxOWI0OGE4CisJLmxvbmcJMHgzOTFjMGNiMywweGM1Yzk1YTYzLDB4NGVkOGFhNGEsMHhlMzQxOGFjYgorCS5sb25nCTB4NWI5Y2NhNGYsMHg3NzYzZTM3MywweDY4MmU2ZmYzLDB4ZDZiMmI4YTMKKwkubG9uZwkweDc0OGY4MmVlLDB4NWRlZmIyZmMsMHg3OGE1NjM2ZiwweDQzMTcyZjYwCisJLmxvbmcJMHg4NGM4NzgxNCwweGExZjBhYjcyLDB4OGNjNzAyMDgsMHgxYTY0MzllYworCS5sb25nCTB4OTBiZWZmZmEsMHgyMzYzMWUyOCwweGE0NTA2Y2ViLDB4ZGU4MmJkZTkKKwkubG9uZwkweGJlZjlhM2Y3LDB4YjJjNjc5MTUsMHhjNjcxNzhmMiwweGUzNzI1MzJiCisJLmxvbmcJMHhjYTI3M2VjZSwweGVhMjY2MTljLDB4ZDE4NmI4YzcsMHgyMWMwYzIwNworCS5sb25nCTB4ZWFkYTdkZDYsMHhjZGUwZWIxZSwweGY1N2Q0ZjdmLDB4ZWU2ZWQxNzgKKwkubG9uZwkweDA2ZjA2N2FhLDB4NzIxNzZmYmEsMHgwYTYzN2RjNSwweGEyYzg5OGE2CisJLmxvbmcJMHgxMTNmOTgwNCwweGJlZjkwZGFlLDB4MWI3MTBiMzUsMHgxMzFjNDcxYgorCS5sb25nCTB4MjhkYjc3ZjUsMHgyMzA0N2Q4NCwweDMyY2FhYjdiLDB4NDBjNzI0OTMKKwkubG9uZwkweDNjOWViZTBhLDB4MTVjOWJlYmMsMHg0MzFkNjdjNCwweDljMTAwZDRjCisJLmxvbmcJMHg0Y2M1ZDRiZSwweGNiM2U0MmI2LDB4NTk3ZjI5OWMsMHhmYzY1N2UyYQorCS5sb25nCTB4NWZjYjZmYWIsMHgzYWQ2ZmFlYywweDZjNDQxOThjLDB4NGE0NzU4MTcKK19fXworJGNvZGUuPTw8X19fIGlmICgkU1o9PTQpOworCS5sb25nCTB4NDI4YTJmOTgsMHg3MTM3NDQ5MSwweGI1YzBmYmNmLDB4ZTliNWRiYTUKKwkubG9uZwkweDM5NTZjMjViLDB4NTlmMTExZjEsMHg5MjNmODJhNCwweGFiMWM1ZWQ1CisJLmxvbmcJMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMworCS5sb25nCTB4NzJiZTVkNzQsMHg4MGRlYjFmZSwweDliZGMwNmE3LDB4YzE5YmYxNzQKKwkubG9uZwkweGU0OWI2OWMxLDB4ZWZiZTQ3ODYsMHgwZmMxOWRjNiwweDI0MGNhMWNjCisJLmxvbmcJMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYQorCS5sb25nCTB4OTgzZTUxNTIsMHhhODMxYzY2ZCwweGIwMDMyN2M4LDB4YmY1OTdmYzcKKwkubG9uZwkweGM2ZTAwYmYzLDB4ZDVhNzkxNDcsMHgwNmNhNjM1MSwweDE0MjkyOTY3CisJLmxvbmcJMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMworCS5sb25nCTB4NjUwYTczNTQsMHg3NjZhMGFiYiwweDgxYzJjOTJlLDB4OTI3MjJjODUKKwkubG9uZwkweGEyYmZlOGExLDB4YTgxYTY2NGIsMHhjMjRiOGI3MCwweGM3NmM1MWEzCisJLmxvbmcJMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MAorCS5sb25nCTB4MTlhNGMxMTYsMHgxZTM3NmMwOCwweDI3NDg3NzRjLDB4MzRiMGJjYjUKKwkubG9uZwkweDM5MWMwY2IzLDB4NGVkOGFhNGEsMHg1YjljY2E0ZiwweDY4MmU2ZmYzCisJLmxvbmcJMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOAorCS5sb25nCTB4OTBiZWZmZmEsMHhhNDUwNmNlYiwweGJlZjlhM2Y3LDB4YzY3MTc4ZjIKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLXMzOTB4LnBsIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLXMzOTB4LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZWYyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItczM5MHgucGwKQEAgLTAsMCArMSwzMDEgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBTSEEyNTYvNTEyIGJsb2NrIHByb2NlZHVyZXMgZm9yIHMzOTB4LgorCisjIEFwcmlsIDIwMDcuCisjCisjIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyIGlzIHJlcG9ydGVkbHkgPjMgdGltZXMgZmFzdGVyIHRoYW4gZ2NjIDMuMworIyBnZW5lcmF0ZWQgY29kZSAobXVzdCBiZSBhIGJ1ZyBpbiBjb21waWxlciwgYXMgaW1wcm92ZW1lbnQgaXMKKyMgInBhdGhvbG9naWNhbGx5IiBoaWdoLCBpbiBwYXJ0aWN1bGFyIGluIGNvbXBhcmlzb24gdG8gb3RoZXIgU0hBCisjIG1vZHVsZXMpLiBCdXQgdGhlIHJlYWwgdHdpc3QgaXMgdGhhdCBpdCBkZXRlY3RzIGlmIGhhcmR3YXJlIHN1cHBvcnQKKyMgZm9yIFNIQTI1NiBpcyBhdmFpbGFibGUgYW5kIGluIHN1Y2ggY2FzZSB1dGlsaXplcyBpdC4gVGhlbiB0aGUKKyMgcGVyZm9ybWFuY2UgY2FuIHJlYWNoID42LjV4IG9mIGFzc2VtYmxlciBvbmUgZm9yIGxhcmdlciBjaHVua3MuCisjCisjIHNoYTUxMl9ibG9ja19kYXRhX29yZGVyIGlzIH43MCUgZmFzdGVyIHRoYW4gZ2NjIDMuMyBnZW5lcmF0ZWQgY29kZS4KKworIyBKYW51YXJ5IDIwMDkuCisjCisjIEFkZCBzdXBwb3J0IGZvciBoYXJkd2FyZSBTSEE1MTIgYW5kIHJlc2NoZWR1bGUgaW5zdHJ1Y3Rpb25zIHRvCisjIGZhdm91ciBkdWFsLWlzc3VlIHoxMCBwaXBlbGluZS4gSGFyZHdhcmUgU0hBMjU2LzUxMiBpcyB+NC43eCBmYXN0ZXIKKyMgdGhhbiBzb2Z0d2FyZS4KKworJHQwPSIlcjAiOworJHQxPSIlcjEiOworJGN0eD0iJXIyIjsJJHQyPSIlcjIiOworJGlucD0iJXIzIjsKKyRsZW49IiVyNCI7CSMgdXNlZCBhcyBpbmRleCBpbiBpbm5lciBsb29wCisKKyRBPSIlcjUiOworJEI9IiVyNiI7CiskQz0iJXI3IjsKKyREPSIlcjgiOworJEU9IiVyOSI7CiskRj0iJXIxMCI7CiskRz0iJXIxMSI7CiskSD0iJXIxMiI7CUBWPSgkQSwkQiwkQywkRCwkRSwkRiwkRywkSCk7CiskdGJsPSIlcjEzIjsKKyRUMT0iJXIxNCI7Ciskc3A9IiVyMTUiOworCiskb3V0cHV0PXNoaWZ0Oworb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworaWYgKCRvdXRwdXQgPX4gLzUxMi8pIHsKKwkkbGFiZWw9IjUxMiI7CisJJFNaPTg7CisJJExEPSJsZyI7CSMgbG9hZCBmcm9tIG1lbW9yeQorCSRTVD0ic3RnIjsJIyBzdG9yZSB0byBtZW1vcnkKKwkkQUREPSJhbGciOwkjIGFkZCB3aXRoIG1lbW9yeSBvcGVyYW5kCisJJFJPVD0icmxsZyI7CSMgcm90YXRlIGxlZnQKKwkkU0hSPSJzcmxnIjsJIyBsb2dpY2FsIHJpZ2h0IHNoaWZ0IFtzZWUgZXZlbiBhdCB0aGUgZW5kXQorCUBTaWdtYTA9KDI1LDMwLDM2KTsKKwlAU2lnbWExPSgyMyw0Niw1MCk7CisJQHNpZ21hMD0oNTYsNjMsIDcpOworCUBzaWdtYTE9KCAzLDQ1LCA2KTsKKwkkcm91bmRzPTgwOworCSRraW1kZnVuYz0zOwkjIDAgbWVhbnMgdW5rbm93bi91bnN1cHBvcnRlZC91bmltcGxlbWVudGVkL2Rpc2FibGVkCit9IGVsc2UgeworCSRsYWJlbD0iMjU2IjsKKwkkU1o9NDsKKwkkTEQ9ImxsZ2YiOwkjIGxvYWQgZnJvbSBtZW1vcnkKKwkkU1Q9InN0IjsJIyBzdG9yZSB0byBtZW1vcnkKKwkkQUREPSJhbCI7CSMgYWRkIHdpdGggbWVtb3J5IG9wZXJhbmQKKwkkUk9UPSJybGwiOwkjIHJvdGF0ZSBsZWZ0CisJJFNIUj0ic3JsIjsJIyBsb2dpY2FsIHJpZ2h0IHNoaWZ0CisJQFNpZ21hMD0oMTAsMTksMzApOworCUBTaWdtYTE9KCA3LDIxLDI2KTsKKwlAc2lnbWEwPSgxNCwyNSwgMyk7CisJQHNpZ21hMT0oMTMsMTUsMTApOworCSRyb3VuZHM9NjQ7CisJJGtpbWRmdW5jPTI7CSMgbWFnaWMgZnVuY3Rpb24gY29kZSBmb3Iga2ltZCBpbnN0cnVjdGlvbgorfQorJEZ1bmM9InNoYSR7bGFiZWx9X2Jsb2NrX2RhdGFfb3JkZXIiOworJFRhYmxlPSJLJHtsYWJlbH0iOworJGZyYW1lPTE2MCsxNiokU1o7CisKK3N1YiBCT0RZXzAwXzE1IHsKK215ICgkaSwkYSwkYiwkYywkZCwkZSwkZiwkZywkaCkgPSBAXzsKKworJGNvZGUuPTw8X19fIGlmICgkaTwxNik7CisJJExECSRUMSxgJGkqJFNaYCgkaW5wKQkjIyMgJGkKK19fXworJGNvZGUuPTw8X19fOworCSRST1QJJHQwLCRlLCRTaWdtYTFbMF0KKwkkUk9UCSR0MSwkZSwkU2lnbWExWzFdCisJIGxncgkkdDIsJGYKKwl4Z3IJJHQwLCR0MQorCSRST1QJJHQxLCR0MSxgJFNpZ21hMVsyXS0kU2lnbWExWzFdYAorCSB4Z3IJJHQyLCRnCisJJFNUCSRUMSxgMTYwKyRTWiooJGklMTYpYCgkc3ApCisJeGdyCSR0MCwkdDEJCQkjIFNpZ21hMShlKQorCWxhCSRUMSwwKCRUMSwkaCkJCSMgVDErPWgKKwkgbmdyCSR0MiwkZQorCSBsZ3IJJHQxLCRhCisJYWxncgkkVDEsJHQwCQkJIyBUMSs9U2lnbWExKGUpCisJJFJPVAkkaCwkYSwkU2lnbWEwWzBdCisJIHhncgkkdDIsJGcJCQkjIENoKGUsZixnKQorCSRBREQJJFQxLGAkaSokU1pgKCRsZW4sJHRibCkJIyBUMSs9S1tpXQorCSRST1QJJHQwLCRhLCRTaWdtYTBbMV0KKwlhbGdyCSRUMSwkdDIJCQkjIFQxKz1DaChlLGYsZykKKwkgb2dyCSR0MSwkYgorCXhncgkkaCwkdDAKKwkgbGdyCSR0MiwkYQorCSBuZ3IJJHQxLCRjCisJJFJPVAkkdDAsJHQwLGAkU2lnbWEwWzJdLSRTaWdtYTBbMV1gCisJeGdyCSRoLCR0MAkJCSMgaD1TaWdtYTAoYSkKKwkgbmdyCSR0MiwkYgorCWFsZ3IJJGgsJFQxCQkJIyBoKz1UMQorCSBvZ3IJJHQyLCR0MQkJCSMgTWFqKGEsYixjKQorCWxhCSRkLDAoJGQsJFQxKQkJIyBkKz1UMQorCWFsZ3IJJGgsJHQyCQkJIyBoKz1NYWooYSxiLGMpCitfX18KK30KKworc3ViIEJPRFlfMTZfWFggeworbXkgKCRpLCRhLCRiLCRjLCRkLCRlLCRmLCRnLCRoKSA9IEBfOworCiskY29kZS49PDxfX187CisJJExECSRUMSxgMTYwKyRTWiooKCRpKzEpJTE2KWAoJHNwKQkjIyMgJGkKKwkkTEQJJHQxLGAxNjArJFNaKigoJGkrMTQpJTE2KWAoJHNwKQorCSRST1QJJHQwLCRUMSwkc2lnbWEwWzBdCisJJFNIUgkkVDEsJHNpZ21hMFsyXQorCSRST1QJJHQyLCR0MCxgJHNpZ21hMFsxXS0kc2lnbWEwWzBdYAorCXhncgkkVDEsJHQwCisJJFJPVAkkdDAsJHQxLCRzaWdtYTFbMF0KKwl4Z3IJJFQxLCR0MgkJCQkjIHNpZ21hMChYW2krMV0pCisJJFNIUgkkdDEsJHNpZ21hMVsyXQorCSRBREQJJFQxLGAxNjArJFNaKigkaSUxNilgKCRzcCkJIyArPVhbaV0KKwl4Z3IJJHQxLCR0MAorCSRST1QJJHQwLCR0MCxgJHNpZ21hMVsxXS0kc2lnbWExWzBdYAorCSRBREQJJFQxLGAxNjArJFNaKigoJGkrOSklMTYpYCgkc3ApCSMgKz1YW2krOV0KKwl4Z3IJJHQxLCR0MAkJCQkjIHNpZ21hMShYW2krMTRdKQorCWFsZ3IJJFQxLCR0MQkJCQkjICs9c2lnbWExKFhbaSsxNF0pCitfX18KKwkmQk9EWV8wMF8xNShAXyk7Cit9CisKKyRjb2RlLj08PF9fXzsKKy50ZXh0CisuYWxpZ24JNjQKKy50eXBlCSRUYWJsZSxcQG9iamVjdAorJFRhYmxlOgorX19fCiskY29kZS49PDxfX18gaWYgKCRTWj09NCk7CisJLmxvbmcJMHg0MjhhMmY5OCwweDcxMzc0NDkxLDB4YjVjMGZiY2YsMHhlOWI1ZGJhNQorCS5sb25nCTB4Mzk1NmMyNWIsMHg1OWYxMTFmMSwweDkyM2Y4MmE0LDB4YWIxYzVlZDUKKwkubG9uZwkweGQ4MDdhYTk4LDB4MTI4MzViMDEsMHgyNDMxODViZSwweDU1MGM3ZGMzCisJLmxvbmcJMHg3MmJlNWQ3NCwweDgwZGViMWZlLDB4OWJkYzA2YTcsMHhjMTliZjE3NAorCS5sb25nCTB4ZTQ5YjY5YzEsMHhlZmJlNDc4NiwweDBmYzE5ZGM2LDB4MjQwY2ExY2MKKwkubG9uZwkweDJkZTkyYzZmLDB4NGE3NDg0YWEsMHg1Y2IwYTlkYywweDc2Zjk4OGRhCisJLmxvbmcJMHg5ODNlNTE1MiwweGE4MzFjNjZkLDB4YjAwMzI3YzgsMHhiZjU5N2ZjNworCS5sb25nCTB4YzZlMDBiZjMsMHhkNWE3OTE0NywweDA2Y2E2MzUxLDB4MTQyOTI5NjcKKwkubG9uZwkweDI3YjcwYTg1LDB4MmUxYjIxMzgsMHg0ZDJjNmRmYywweDUzMzgwZDEzCisJLmxvbmcJMHg2NTBhNzM1NCwweDc2NmEwYWJiLDB4ODFjMmM5MmUsMHg5MjcyMmM4NQorCS5sb25nCTB4YTJiZmU4YTEsMHhhODFhNjY0YiwweGMyNGI4YjcwLDB4Yzc2YzUxYTMKKwkubG9uZwkweGQxOTJlODE5LDB4ZDY5OTA2MjQsMHhmNDBlMzU4NSwweDEwNmFhMDcwCisJLmxvbmcJMHgxOWE0YzExNiwweDFlMzc2YzA4LDB4Mjc0ODc3NGMsMHgzNGIwYmNiNQorCS5sb25nCTB4MzkxYzBjYjMsMHg0ZWQ4YWE0YSwweDViOWNjYTRmLDB4NjgyZTZmZjMKKwkubG9uZwkweDc0OGY4MmVlLDB4NzhhNTYzNmYsMHg4NGM4NzgxNCwweDhjYzcwMjA4CisJLmxvbmcJMHg5MGJlZmZmYSwweGE0NTA2Y2ViLDB4YmVmOWEzZjcsMHhjNjcxNzhmMgorX19fCiskY29kZS49PDxfX18gaWYgKCRTWj09OCk7CisJLnF1YWQJMHg0MjhhMmY5OGQ3MjhhZTIyLDB4NzEzNzQ0OTEyM2VmNjVjZAorCS5xdWFkCTB4YjVjMGZiY2ZlYzRkM2IyZiwweGU5YjVkYmE1ODE4OWRiYmMKKwkucXVhZAkweDM5NTZjMjViZjM0OGI1MzgsMHg1OWYxMTFmMWI2MDVkMDE5CisJLnF1YWQJMHg5MjNmODJhNGFmMTk0ZjliLDB4YWIxYzVlZDVkYTZkODExOAorCS5xdWFkCTB4ZDgwN2FhOThhMzAzMDI0MiwweDEyODM1YjAxNDU3MDZmYmUKKwkucXVhZAkweDI0MzE4NWJlNGVlNGIyOGMsMHg1NTBjN2RjM2Q1ZmZiNGUyCisJLnF1YWQJMHg3MmJlNWQ3NGYyN2I4OTZmLDB4ODBkZWIxZmUzYjE2OTZiMQorCS5xdWFkCTB4OWJkYzA2YTcyNWM3MTIzNSwweGMxOWJmMTc0Y2Y2OTI2OTQKKwkucXVhZAkweGU0OWI2OWMxOWVmMTRhZDIsMHhlZmJlNDc4NjM4NGYyNWUzCisJLnF1YWQJMHgwZmMxOWRjNjhiOGNkNWI1LDB4MjQwY2ExY2M3N2FjOWM2NQorCS5xdWFkCTB4MmRlOTJjNmY1OTJiMDI3NSwweDRhNzQ4NGFhNmVhNmU0ODMKKwkucXVhZAkweDVjYjBhOWRjYmQ0MWZiZDQsMHg3NmY5ODhkYTgzMTE1M2I1CisJLnF1YWQJMHg5ODNlNTE1MmVlNjZkZmFiLDB4YTgzMWM2NmQyZGI0MzIxMAorCS5xdWFkCTB4YjAwMzI3Yzg5OGZiMjEzZiwweGJmNTk3ZmM3YmVlZjBlZTQKKwkucXVhZAkweGM2ZTAwYmYzM2RhODhmYzIsMHhkNWE3OTE0NzkzMGFhNzI1CisJLnF1YWQJMHgwNmNhNjM1MWUwMDM4MjZmLDB4MTQyOTI5NjcwYTBlNmU3MAorCS5xdWFkCTB4MjdiNzBhODU0NmQyMmZmYywweDJlMWIyMTM4NWMyNmM5MjYKKwkucXVhZAkweDRkMmM2ZGZjNWFjNDJhZWQsMHg1MzM4MGQxMzlkOTViM2RmCisJLnF1YWQJMHg2NTBhNzM1NDhiYWY2M2RlLDB4NzY2YTBhYmIzYzc3YjJhOAorCS5xdWFkCTB4ODFjMmM5MmU0N2VkYWVlNiwweDkyNzIyYzg1MTQ4MjM1M2IKKwkucXVhZAkweGEyYmZlOGExNGNmMTAzNjQsMHhhODFhNjY0YmJjNDIzMDAxCisJLnF1YWQJMHhjMjRiOGI3MGQwZjg5NzkxLDB4Yzc2YzUxYTMwNjU0YmUzMAorCS5xdWFkCTB4ZDE5MmU4MTlkNmVmNTIxOCwweGQ2OTkwNjI0NTU2NWE5MTAKKwkucXVhZAkweGY0MGUzNTg1NTc3MTIwMmEsMHgxMDZhYTA3MDMyYmJkMWI4CisJLnF1YWQJMHgxOWE0YzExNmI4ZDJkMGM4LDB4MWUzNzZjMDg1MTQxYWI1MworCS5xdWFkCTB4Mjc0ODc3NGNkZjhlZWI5OSwweDM0YjBiY2I1ZTE5YjQ4YTgKKwkucXVhZAkweDM5MWMwY2IzYzVjOTVhNjMsMHg0ZWQ4YWE0YWUzNDE4YWNiCisJLnF1YWQJMHg1YjljY2E0Zjc3NjNlMzczLDB4NjgyZTZmZjNkNmIyYjhhMworCS5xdWFkCTB4NzQ4ZjgyZWU1ZGVmYjJmYywweDc4YTU2MzZmNDMxNzJmNjAKKwkucXVhZAkweDg0Yzg3ODE0YTFmMGFiNzIsMHg4Y2M3MDIwODFhNjQzOWVjCisJLnF1YWQJMHg5MGJlZmZmYTIzNjMxZTI4LDB4YTQ1MDZjZWJkZTgyYmRlOQorCS5xdWFkCTB4YmVmOWEzZjdiMmM2NzkxNSwweGM2NzE3OGYyZTM3MjUzMmIKKwkucXVhZAkweGNhMjczZWNlZWEyNjYxOWMsMHhkMTg2YjhjNzIxYzBjMjA3CisJLnF1YWQJMHhlYWRhN2RkNmNkZTBlYjFlLDB4ZjU3ZDRmN2ZlZTZlZDE3OAorCS5xdWFkCTB4MDZmMDY3YWE3MjE3NmZiYSwweDBhNjM3ZGM1YTJjODk4YTYKKwkucXVhZAkweDExM2Y5ODA0YmVmOTBkYWUsMHgxYjcxMGIzNTEzMWM0NzFiCisJLnF1YWQJMHgyOGRiNzdmNTIzMDQ3ZDg0LDB4MzJjYWFiN2I0MGM3MjQ5MworCS5xdWFkCTB4M2M5ZWJlMGExNWM5YmViYywweDQzMWQ2N2M0OWMxMDBkNGMKKwkucXVhZAkweDRjYzVkNGJlY2IzZTQyYjYsMHg1OTdmMjk5Y2ZjNjU3ZTJhCisJLnF1YWQJMHg1ZmNiNmZhYjNhZDZmYWVjLDB4NmM0NDE5OGM0YTQ3NTgxNworX19fCiskY29kZS49PDxfX187Cisuc2l6ZQkkVGFibGUsLi0kVGFibGUKKy5nbG9ibAkkRnVuYworLnR5cGUJJEZ1bmMsXEBmdW5jdGlvbgorJEZ1bmM6CitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGtpbWRmdW5jKTsKKwlsYXJsCSVyMSxPUEVOU1NMX3MzOTB4Y2FwX1AKKwlsZwklcjAsMCglcjEpCisJdG1obAklcjAsMHg0MDAwCSMgY2hlY2sgZm9yIG1lc3NhZ2Utc2VjdXJpdHkgYXNzaXN0CisJanoJLkxzb2Z0d2FyZQorCWxnaGkJJXIwLDAKKwlsYQklcjEsMTYoJHNwKQorCS5sb25nCTB4YjkzZTAwMDIJIyBraW1kICVyMCwlcjIKKwlsZwklcjAsMTYoJHNwKQorCXRtaGgJJXIwLGAweDgwMDA+PiRraW1kZnVuY2AKKwlqegkuTHNvZnR3YXJlCisJbGdoaQklcjAsJGtpbWRmdW5jCisJbGdyCSVyMSwkY3R4CisJbGdyCSVyMiwkaW5wCisJc2xsZwklcjMsJGxlbixgbG9nKDE2KiRTWikvbG9nKDIpYAorCS5sb25nCTB4YjkzZTAwMDIJIyBraW1kICVyMCwlcjIKKwlicmMJMSwuLTQJCSMgcGF5IGF0dGVudGlvbiB0byAicGFydGlhbCBjb21wbGV0aW9uIgorCWJyCSVyMTQKKy5hbGlnbgkxNgorLkxzb2Z0d2FyZToKK19fXworJGNvZGUuPTw8X19fOworCXNsbGcJJGxlbiwkbGVuLGBsb2coMTYqJFNaKS9sb2coMilgCisJbGdoaQklcjEsLSRmcmFtZQorCWFncgkkbGVuLCRpbnAKKwlzdG1nCSRjdHgsJXIxNSwxNigkc3ApCisJbGdyCSVyMCwkc3AKKwlsYQkkc3AsMCglcjEsJHNwKQorCXN0ZwklcjAsMCgkc3ApCisKKwlsYXJsCSR0YmwsJFRhYmxlCisJJExECSRBLGAwKiRTWmAoJGN0eCkKKwkkTEQJJEIsYDEqJFNaYCgkY3R4KQorCSRMRAkkQyxgMiokU1pgKCRjdHgpCisJJExECSRELGAzKiRTWmAoJGN0eCkKKwkkTEQJJEUsYDQqJFNaYCgkY3R4KQorCSRMRAkkRixgNSokU1pgKCRjdHgpCisJJExECSRHLGA2KiRTWmAoJGN0eCkKKwkkTEQJJEgsYDcqJFNaYCgkY3R4KQorCisuTGxvb3A6CisJbGdoaQkkbGVuLDAKK19fXworZm9yICgkaT0wOyRpPDE2OyRpKyspCXsgJkJPRFlfMDBfMTUoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49Ii5Mcm91bmRzXzE2X3h4OlxuIjsKK2ZvciAoOyRpPDMyOyRpKyspCXsgJkJPRFlfMTZfWFgoJGksQFYpOyB1bnNoaWZ0KEBWLHBvcChAVikpOyB9CiskY29kZS49PDxfX187CisJYWdoaQkkbGVuLGAxNiokU1pgCisJbGdoaQkkdDAsYCgkcm91bmRzLTE2KSokU1pgCisJY2xncgkkbGVuLCR0MAorCWpuZQkuTHJvdW5kc18xNl94eAorCisJbGcJJGN0eCxgJGZyYW1lKzE2YCgkc3ApCisJbGEJJGlucCxgMTYqJFNaYCgkaW5wKQorCSRBREQJJEEsYDAqJFNaYCgkY3R4KQorCSRBREQJJEIsYDEqJFNaYCgkY3R4KQorCSRBREQJJEMsYDIqJFNaYCgkY3R4KQorCSRBREQJJEQsYDMqJFNaYCgkY3R4KQorCSRBREQJJEUsYDQqJFNaYCgkY3R4KQorCSRBREQJJEYsYDUqJFNaYCgkY3R4KQorCSRBREQJJEcsYDYqJFNaYCgkY3R4KQorCSRBREQJJEgsYDcqJFNaYCgkY3R4KQorCSRTVAkkQSxgMCokU1pgKCRjdHgpCisJJFNUCSRCLGAxKiRTWmAoJGN0eCkKKwkkU1QJJEMsYDIqJFNaYCgkY3R4KQorCSRTVAkkRCxgMyokU1pgKCRjdHgpCisJJFNUCSRFLGA0KiRTWmAoJGN0eCkKKwkkU1QJJEYsYDUqJFNaYCgkY3R4KQorCSRTVAkkRyxgNiokU1pgKCRjdHgpCisJJFNUCSRILGA3KiRTWmAoJGN0eCkKKwljbGcJJGlucCxgJGZyYW1lKzMyYCgkc3ApCisJam5lCS5MbG9vcAorCisJbG1nCSVyNiwlcjE1LGAkZnJhbWUrNDhgKCRzcCkJCisJYnIJJXIxNAorLnNpemUJJEZ1bmMsLi0kRnVuYworLnN0cmluZwkiU0hBJHtsYWJlbH0gYmxvY2sgdHJhbnNmb3JtIGZvciBzMzkweCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKKy5jb21tCU9QRU5TU0xfczM5MHhjYXBfUCw4LDgKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKKyMgdW5saWtlIDMyLWJpdCBzaGlmdCA2NC1iaXQgb25lIHRha2VzIHRocmVlIGFyZ3VtZW50cworJGNvZGUgPX4gcy8oc3JsZ1xzKykoJXJbMC05XSspLC8kMSQyLCQyLC9nbTsKKworcHJpbnQgJGNvZGU7CitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItc3BhcmN2OS5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi1zcGFyY3Y5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjQxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL2FzbS9zaGE1MTItc3BhcmN2OS5wbApAQCAtMCwwICsxLDU5MyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIFNIQTI1NiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBvdmVyIGNvbXBpbGVyIGdlbmVyYXRlZCBjb2RlIHZhcmllcworIyBmcm9tIDQwJSBmb3IgU3VuIEMgWzMyLWJpdCBidWlsZF0gdG8gNzAlIGZvciBnY2MgWzMuMywgNjQtYml0CisjIGJ1aWxkXS4gSnVzdCBsaWtlIGluIFNIQTEgbW9kdWxlIEkgYWltIHRvIGVuc3VyZSBzY2FsYWJpbGl0eSBvbgorIyBVbHRyYVNQQVJDIFQxIGJ5IHBhY2tpbmcgWFsxNl0gdG8gOCA2NC1iaXQgcmVnaXN0ZXJzLgorCisjIFNIQTUxMiBvbiBwcmUtVDEgVWx0cmFTUEFSQy4KKyMKKyMgUGVyZm9ybWFuY2UgaXMgPjc1JSBiZXR0ZXIgdGhhbiA2NC1iaXQgY29kZSBnZW5lcmF0ZWQgYnkgU3VuIEMgYW5kCisjIG92ZXIgMnggdGhhbiAzMi1iaXQgY29kZS4gWFsxNl0gcmVzaWRlcyBvbiBzdGFjaywgYnV0IGFjY2VzcyB0byBpdAorIyBpcyBzY2hlZHVsZWQgZm9yIEwyIGxhdGVuY3kgYW5kIHN0YWdlZCB0aHJvdWdoIDMyIGxlYXN0IHNpZ25pZmljYW50CisjIGJpdHMgb2YgJWwwLSVsNy4gVGhlIGxhdHRlciBpcyBkb25lIHRvIGFjaGlldmUgMzItLzY0LWJpdCBBQkkKKyMgZHVhbGl0eS4gTmV2ZXRoZWxlc3MgaXQncyB+NDAlIGZhc3RlciB0aGFuIFNIQTI1Niwgd2hpY2ggaXMgcHJldHR5CisjIGdvb2QgW29wdGltYWwgY29lZmZpY2llbnQgaXMgNTAlXS4KKyMKKyMgU0hBNTEyIG9uIFVsdHJhU1BBUkMgVDEuCisjCisjIEl0J3Mgbm90IGFueSBmYXN0ZXIgdGhhbiA2NC1iaXQgY29kZSBnZW5lcmF0ZWQgYnkgU3VuIEMgNS44LiBUaGlzIGlzCisjIGJlY2F1c2UgNjQtYml0IGNvZGUgZ2VuZXJhdG9yIGhhcyB0aGUgYWR2YW50YWdlIG9mIHVzaW5nIDY0LWJpdAorIyBsb2FkcygqKSB0byBhY2Nlc3MgWFsxNl0sIHdoaWNoIEkgY29uc2Npb3VzbHkgdHJhZGVkIGZvciAzMi0vNjQtYml0CisjIEFCSSBkdWFsaXR5IFthcyBwZXIgYWJvdmVdLiBCdXQgaXQgc3VycGFzc2VzIDMyLWJpdCBTdW4gQyBnZW5lcmF0ZWQKKyMgY29kZSBieSA2MCUsIG5vdCB0byBtZW50aW9uIHRoYXQgaXQgZG9lc24ndCBzdWZmZXIgZnJvbSBzZXZlcmUgZGVjYXkKKyMgd2hlbiBydW5uaW5nIDQgdGltZXMgcGh5c2ljYWwgY29yZXMgdGhyZWFkcyBhbmQgdGhhdCBpdCBsZWF2ZXMgZ2NjCisjIFszLjRdIGJlaGluZCBieSBvdmVyIDR4IGZhY3RvciEgSWYgY29tcGFyZWQgdG8gU0hBMjU2LCBzaW5nbGUgdGhyZWFkCisjIHBlcmZvcm1hbmNlIGlzIG9ubHkgMTAlIGJldHRlciwgYnV0IG92ZXJhbGwgdGhyb3VnaHB1dCBmb3IgbWF4aW11bQorIyBhbW91bnQgb2YgdGhyZWFkcyBmb3IgZ2l2ZW4gQ1BVIGV4Y2VlZHMgY29ycmVzcG9uZGluZyBvbmUgb2YgU0hBMjU2CisjIGJ5IDMwJSBbYWdhaW4sIG9wdGltYWwgY29lZmZpY2llbnQgaXMgNTAlXS4KKyMKKyMgKCopCVVubGlrZSBwcmUtVDEgVWx0cmFTUEFSQyBsb2FkcyBvbiBUMSBhcmUgZXhlY3V0ZWQgc3RyaWN0bHkKKyMJaW4tb3JkZXIsIGkuZS4gbG9hZCBpbnN0cnVjdGlvbiBoYXMgdG8gY29tcGxldGUgcHJpb3IgbmV4dAorIwlpbnN0cnVjdGlvbiBpbiBnaXZlbiB0aHJlYWQgaXMgZXhlY3V0ZWQsIGV2ZW4gaWYgdGhlIGxhdHRlciBpcworIwlub3QgZGVwZW5kZW50IG9uIGxvYWQgcmVzdWx0ISBUaGlzIG1lYW5zIHRoYXQgb24gVDEgdHdvIDMyLWJpdAorIwlsb2FkcyBhcmUgYWx3YXlzIHNsb3dlciB0aGFuIG9uZSA2NC1iaXQgbG9hZC4gT25jZSBhZ2FpbiB0aGlzCisjCWlzIHVubGlrZSBwcmUtVDEgVWx0cmFTUEFSQywgd2hlcmUsIGlmIHNjaGVkdWxlZCBhcHByb3ByaWF0ZWx5LAorIwkyeDMyLWJpdCBsb2FkcyBjYW4gYmUgYXMgZmFzdCBhcyAxeDY0LWJpdCBvbmVzLgorCiskYml0cz0zMjsKK2ZvciAoQEFSR1YpCXsgJGJpdHM9NjQgaWYgKC9cLW02NC8gfHwgL1wteGFyY2hcPXY5Lyk7IH0KK2lmICgkYml0cz09NjQpCXsgJGJpYXM9MjA0NzsgJGZyYW1lPTE5MjsgfQorZWxzZQkJeyAkYmlhcz0wOyAgICAkZnJhbWU9MTEyOyB9CisKKyRvdXRwdXQ9c2hpZnQ7CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiOworCitpZiAoJG91dHB1dCA9fiAvNTEyLykgeworCSRsYWJlbD0iNTEyIjsKKwkkU1o9ODsKKwkkTEQ9ImxkeCI7CQkjIGxvYWQgZnJvbSBtZW1vcnkKKwkkU1Q9InN0eCI7CQkjIHN0b3JlIHRvIG1lbW9yeQorCSRTTEw9InNsbHgiOwkJIyBzaGlmdCBsZWZ0IGxvZ2ljYWwKKwkkU1JMPSJzcmx4IjsJCSMgc2hpZnQgcmlnaHQgbG9naWNhbAorCUBTaWdtYTA9KDI4LDM0LDM5KTsKKwlAU2lnbWExPSgxNCwxOCw0MSk7CisJQHNpZ21hMD0oIDcsIDEsIDgpOwkjIHJpZ2h0IHNoaWZ0IGZpcnN0CisJQHNpZ21hMT0oIDYsMTksNjEpOwkjIHJpZ2h0IHNoaWZ0IGZpcnN0CisJJGxhc3RLPTB4ODE3OworCSRyb3VuZHM9ODA7CisJJGFsaWduPTQ7CisKKwkkbG9jYWxzPTE2KiRTWjsJCSMgWFsxNl0KKworCSRBPSIlbzAiOworCSRCPSIlbzEiOworCSRDPSIlbzIiOworCSREPSIlbzMiOworCSRFPSIlbzQiOworCSRGPSIlbzUiOworCSRHPSIlZzEiOworCSRIPSIlbzciOworCUBWPSgkQSwkQiwkQywkRCwkRSwkRiwkRywkSCk7Cit9IGVsc2UgeworCSRsYWJlbD0iMjU2IjsKKwkkU1o9NDsKKwkkTEQ9ImxkIjsJCSMgbG9hZCBmcm9tIG1lbW9yeQorCSRTVD0ic3QiOwkJIyBzdG9yZSB0byBtZW1vcnkKKwkkU0xMPSJzbGwiOwkJIyBzaGlmdCBsZWZ0IGxvZ2ljYWwKKwkkU1JMPSJzcmwiOwkJIyBzaGlmdCByaWdodCBsb2dpY2FsCisJQFNpZ21hMD0oIDIsMTMsMjIpOworCUBTaWdtYTE9KCA2LDExLDI1KTsKKwlAc2lnbWEwPSggMywgNywxOCk7CSMgcmlnaHQgc2hpZnQgZmlyc3QKKwlAc2lnbWExPSgxMCwxNywxOSk7CSMgcmlnaHQgc2hpZnQgZmlyc3QKKwkkbGFzdEs9MHg4ZjI7CisJJHJvdW5kcz02NDsKKwkkYWxpZ249ODsKKworCSRsb2NhbHM9MDsJCSMgWFsxNl0gaXMgcmVnaXN0ZXIgcmVzaWRlbnQKKwlAWD0oIiVvMCIsIiVvMSIsIiVvMiIsIiVvMyIsIiVvNCIsIiVvNSIsIiVnMSIsIiVvNyIpOworCQorCSRBPSIlbDAiOworCSRCPSIlbDEiOworCSRDPSIlbDIiOworCSREPSIlbDMiOworCSRFPSIlbDQiOworCSRGPSIlbDUiOworCSRHPSIlbDYiOworCSRIPSIlbDciOworCUBWPSgkQSwkQiwkQywkRCwkRSwkRiwkRywkSCk7Cit9CiskVDE9IiVnMiI7CiskdG1wMD0iJWczIjsKKyR0bXAxPSIlZzQiOworJHRtcDI9IiVnNSI7CisKKyRjdHg9IiVpMCI7CiskaW5wPSIlaTEiOworJGxlbj0iJWkyIjsKKyRLdGJsPSIlaTMiOworJHRtcDMxPSIlaTQiOworJHRtcDMyPSIlaTUiOworCisjIyMjIyMjIyMjIyBTSEEyNTYKKyRYbG9hZCA9IHN1YiB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpPUBfOworCisgICAgaWYgKCRpPT0wKSB7CiskY29kZS49PDxfX187CisJbGR4CVskaW5wKzBdLEBYWzBdCisJbGR4CVskaW5wKzE2XSxAWFsyXQorCWxkeAlbJGlucCszMl0sQFhbNF0KKwlsZHgJWyRpbnArNDhdLEBYWzZdCisJbGR4CVskaW5wKzhdLEBYWzFdCisJbGR4CVskaW5wKzI0XSxAWFszXQorCXN1YmNjCSVnMCwkdG1wMzEsJHRtcDMyICEgc2hvdWxkIGJlIDY0LSR0bXAzMSwgYnV0IC0kdG1wMzEgd29ya3MgdG9vCisJbGR4CVskaW5wKzQwXSxAWFs1XQorCWJ6LHB0CSVpY2MsLkxhbGlnbmVkCisJbGR4CVskaW5wKzU2XSxAWFs3XQorCisJc2xseAlAWFswXSwkdG1wMzEsQFhbMF0KKwlsZHgJWyRpbnArNjRdLCRUMQorX19fCitmb3IoJGo9MDskajw3OyRqKyspCit7ICAgJGNvZGUuPTw8X19fOworCXNybHgJQFhbJGorMV0sJHRtcDMyLCR0bXAxCisJc2xseAlAWFskaisxXSwkdG1wMzEsQFhbJGorMV0KKwlvcgkkdG1wMSxAWFskal0sQFhbJGpdCitfX18KK30KKyRjb2RlLj08PF9fXzsKKwlzcmx4CSRUMSwkdG1wMzIsJFQxCisJb3IJJFQxLEBYWzddLEBYWzddCisuTGFsaWduZWQ6CitfX18KKyAgICB9CisKKyAgICBpZiAoJGkmMSkgeworCSRjb2RlLj0iXHRhZGQJQFhbJGkvMl0sJGgsJFQxXG4iOworICAgIH0gZWxzZSB7CisJJGNvZGUuPSJcdHNybHgJQFhbJGkvMl0sMzIsJFQxXG5cdGFkZAkkaCwkVDEsJFQxXG4iOworICAgIH0KK30gaWYgKCRTWj09NCk7CisKKyMjIyMjIyMjIyMjIFNIQTUxMgorJFhsb2FkID0gc3ViIHsKK215ICgkaSwkYSwkYiwkYywkZCwkZSwkZiwkZywkaCk9QF87CitteSBAcGFpcj0oIiVsIi5ldmFsKCgkaSoyKSU4KSwiJWwiLmV2YWwoKCRpKjIpJTgrMSksIiVsIi5ldmFsKCgoJGkrMSkqMiklOCkpOworCiskY29kZS49PDxfX18gaWYgKCRpPT0wKTsKKwlsZAlbJGlucCswXSwlbDAKKwlsZAlbJGlucCs0XSwlbDEKKwlsZAlbJGlucCs4XSwlbDIKKwlsZAlbJGlucCsxMl0sJWwzCisJbGQJWyRpbnArMTZdLCVsNAorCWxkCVskaW5wKzIwXSwlbDUKKwlsZAlbJGlucCsyNF0sJWw2CisJbGQJWyRpbnArMjhdLCVsNworX19fCiskY29kZS49PDxfX18gaWYgKCRpPDE1KTsKKwlzbGx4CUBwYWlyWzFdLCR0bXAzMSwkdG1wMgkhIFhsb2FkKCRpKQorCWFkZAkkdG1wMzEsMzIsJHRtcDAKKwlzbGx4CUBwYWlyWzBdLCR0bXAwLCR0bXAxCisJYCJsZAlbJGlucCsiLmV2YWwoMzIrMCskaSo4KS4iXSxAcGFpclswXSIJaWYgKCRpPDEyKWAKKwlzcmx4CUBwYWlyWzJdLCR0bXAzMixAcGFpclsxXQorCW9yCSR0bXAxLCR0bXAyLCR0bXAyCisJb3IJQHBhaXJbMV0sJHRtcDIsJHRtcDIKKwlgImxkCVskaW5wKyIuZXZhbCgzMis0KyRpKjgpLiJdLEBwYWlyWzFdIglpZiAoJGk8MTIpYAorCWFkZAkkaCwkdG1wMiwkVDEKKwkkU1QJJHRtcDIsWyVzcCtgJGJpYXMrJGZyYW1lKyRpKiRTWmBdCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGk9PTEyKTsKKwlicm56LGEJJHRtcDMxLC4rOAorCWxkCVskaW5wKzEyOF0sJWwwCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJGk9PTE1KTsKKwlsZAlbJXNwK2AkYmlhcyskZnJhbWUrKCgkaSsxKzEpJTE2KSokU1orMGBdLCVsMgorCXNsbHgJQHBhaXJbMV0sJHRtcDMxLCR0bXAyCSEgWGxvYWQoJGkpCisJYWRkCSR0bXAzMSwzMiwkdG1wMAorCWxkCVslc3ArYCRiaWFzKyRmcmFtZSsoKCRpKzErMSklMTYpKiRTWis0YF0sJWwzCisJc2xseAlAcGFpclswXSwkdG1wMCwkdG1wMQorCWxkCVslc3ArYCRiaWFzKyRmcmFtZSsoKCRpKzErOSklMTYpKiRTWiswYF0sJWw0CisJc3JseAlAcGFpclsyXSwkdG1wMzIsQHBhaXJbMV0KKwlvcgkkdG1wMSwkdG1wMiwkdG1wMgorCWxkCVslc3ArYCRiaWFzKyRmcmFtZSsoKCRpKzErOSklMTYpKiRTWis0YF0sJWw1CisJb3IJQHBhaXJbMV0sJHRtcDIsJHRtcDIKKwlsZAlbJXNwK2AkYmlhcyskZnJhbWUrKCgkaSsxKzE0KSUxNikqJFNaKzBgXSwlbDYKKwlhZGQJJGgsJHRtcDIsJFQxCisJJFNUCSR0bXAyLFslc3ArYCRiaWFzKyRmcmFtZSskaSokU1pgXQorCWxkCVslc3ArYCRiaWFzKyRmcmFtZSsoKCRpKzErMTQpJTE2KSokU1orNGBdLCVsNworCWxkCVslc3ArYCRiaWFzKyRmcmFtZSsoKCRpKzErMCklMTYpKiRTWiswYF0sJWwwCisJbGQJWyVzcCtgJGJpYXMrJGZyYW1lKygoJGkrMSswKSUxNikqJFNaKzRgXSwlbDEKK19fXworfSBpZiAoJFNaPT04KTsKKworIyMjIyMjIyMjIyMgY29tbW9uCitzdWIgQk9EWV8wMF8xNSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpPUBfOworCisgICAgaWYgKCRpPDE2KSB7CisJJiRYbG9hZChAXyk7CisgICAgfSBlbHNlIHsKKwkkY29kZS49Ilx0YWRkCSRoLCRUMSwkVDFcbiI7CisgICAgfQorCiskY29kZS49PDxfX187CisJJFNSTAkkZSxAU2lnbWExWzBdLCRoCSEhICRpCisJeG9yCSRmLCRnLCR0bXAyCisJJFNMTAkkZSxgJFNaKjgtQFNpZ21hMVsyXWAsJHRtcDEKKwlhbmQJJGUsJHRtcDIsJHRtcDIKKwkkU1JMCSRlLEBTaWdtYTFbMV0sJHRtcDAKKwl4b3IJJHRtcDEsJGgsJGgKKwkkU0xMCSRlLGAkU1oqOC1AU2lnbWExWzFdYCwkdG1wMQorCXhvcgkkdG1wMCwkaCwkaAorCSRTUkwJJGUsQFNpZ21hMVsyXSwkdG1wMAorCXhvcgkkdG1wMSwkaCwkaAorCSRTTEwJJGUsYCRTWio4LUBTaWdtYTFbMF1gLCR0bXAxCisJeG9yCSR0bXAwLCRoLCRoCisJeG9yCSRnLCR0bXAyLCR0bXAyCQkhIENoKGUsZixnKQorCXhvcgkkdG1wMSwkaCwkdG1wMAkJISBTaWdtYTEoZSkKKworCSRTUkwJJGEsQFNpZ21hMFswXSwkaAorCWFkZAkkdG1wMiwkVDEsJFQxCisJJExECVskS3RibCtgJGkqJFNaYF0sJHRtcDIJISBLWyRpXQorCSRTTEwJJGEsYCRTWio4LUBTaWdtYTBbMl1gLCR0bXAxCisJYWRkCSR0bXAwLCRUMSwkVDEKKwkkU1JMCSRhLEBTaWdtYTBbMV0sJHRtcDAKKwl4b3IJJHRtcDEsJGgsJGgKKwkkU0xMCSRhLGAkU1oqOC1AU2lnbWEwWzFdYCwkdG1wMQorCXhvcgkkdG1wMCwkaCwkaAorCSRTUkwJJGEsQFNpZ21hMFsyXSwkdG1wMAorCXhvcgkkdG1wMSwkaCwkaAkKKwkkU0xMCSRhLGAkU1oqOC1AU2lnbWEwWzBdYCwkdG1wMQorCXhvcgkkdG1wMCwkaCwkaAorCXhvcgkkdG1wMSwkaCwkaAkJISBTaWdtYTAoYSkKKworCW9yCSRhLCRiLCR0bXAwCisJYW5kCSRhLCRiLCR0bXAxCisJYW5kCSRjLCR0bXAwLCR0bXAwCisJb3IJJHRtcDAsJHRtcDEsJHRtcDEJISBNYWooYSxiLGMpCisJYWRkCSR0bXAyLCRUMSwkVDEJCSEgKz1LWyRpXQorCWFkZAkkdG1wMSwkaCwkaAorCisJYWRkCSRUMSwkZCwkZAorCWFkZAkkVDEsJGgsJGgKK19fXworfQorCisjIyMjIyMjIyMjIyBTSEEyNTYKKyRCT0RZXzE2X1hYID0gc3ViIHsKK215ICRpPUBfWzBdOworbXkgJHhpOworCisgICAgaWYgKCRpJjEpIHsKKwkkeGk9JHRtcDMyOworCSRjb2RlLj0iXHRzcmx4CUBYWygoJGkrMSkvMiklOF0sMzIsJHhpXG4iOworICAgIH0gZWxzZSB7CisJJHhpPUBYWygoJGkrMSkvMiklOF07CisgICAgfQorJGNvZGUuPTw8X19fOworCXNybAkkeGksQHNpZ21hMFswXSwkVDEJCSEhIFh1cGRhdGUoJGkpCisJc2xsCSR4aSxgMzItQHNpZ21hMFsyXWAsJHRtcDEKKwlzcmwJJHhpLEBzaWdtYTBbMV0sJHRtcDAKKwl4b3IJJHRtcDEsJFQxLCRUMQorCXNsbAkkdG1wMSxgQHNpZ21hMFsyXS1Ac2lnbWEwWzFdYCwkdG1wMQorCXhvcgkkdG1wMCwkVDEsJFQxCisJc3JsCSR4aSxAc2lnbWEwWzJdLCR0bXAwCisJeG9yCSR0bXAxLCRUMSwkVDEKK19fXworICAgIGlmICgkaSYxKSB7CisJJHhpPUBYWygoJGkrMTQpLzIpJThdOworICAgIH0gZWxzZSB7CisJJHhpPSR0bXAzMjsKKwkkY29kZS49Ilx0c3JseAlAWFsoKCRpKzE0KS8yKSU4XSwzMiwkeGlcbiI7CisgICAgfQorJGNvZGUuPTw8X19fOworCXNybAkkeGksQHNpZ21hMVswXSwkdG1wMgorCXhvcgkkdG1wMCwkVDEsJFQxCQkJISBUMT1zaWdtYTAoWFtpKzFdKQorCXNsbAkkeGksYDMyLUBzaWdtYTFbMl1gLCR0bXAxCisJc3JsCSR4aSxAc2lnbWExWzFdLCR0bXAwCisJeG9yCSR0bXAxLCR0bXAyLCR0bXAyCisJc2xsCSR0bXAxLGBAc2lnbWExWzJdLUBzaWdtYTFbMV1gLCR0bXAxCisJeG9yCSR0bXAwLCR0bXAyLCR0bXAyCisJc3JsCSR4aSxAc2lnbWExWzJdLCR0bXAwCisJeG9yCSR0bXAxLCR0bXAyLCR0bXAyCitfX18KKyAgICBpZiAoJGkmMSkgeworCSR4aT1AWFsoJGkvMiklOF07CiskY29kZS49PDxfX187CisJc3JseAlAWFsoKCRpKzkpLzIpJThdLDMyLCR0bXAxCSEgWFtpKzldCisJeG9yCSR0bXAwLCR0bXAyLCR0bXAyCQkhIHNpZ21hMShYW2krMTRdKQorCXNybAlAWFsoJGkvMiklOF0sMCwkdG1wMAorCWFkZAkkeGksJFQxLCRUMQkJCSEgKz1YW2ldCisJeG9yCSR0bXAwLEBYWygkaS8yKSU4XSxAWFsoJGkvMiklOF0KKwlhZGQJJHRtcDIsJFQxLCRUMQorCWFkZAkkdG1wMSwkVDEsJFQxCisKKwlzcmwJJFQxLDAsJFQxCisJb3IJJFQxLEBYWygkaS8yKSU4XSxAWFsoJGkvMiklOF0KK19fXworICAgIH0gZWxzZSB7CisJJHhpPUBYWygoJGkrOSkvMiklOF07CiskY29kZS49PDxfX187CisJc3JseAlAWFsoJGkvMiklOF0sMzIsJHRtcDEJCSEgWFtpXQorCXhvcgkkdG1wMCwkdG1wMiwkdG1wMgkJISBzaWdtYTEoWFtpKzE0XSkKKwlzcmwJQFhbKCRpLzIpJThdLDAsQFhbKCRpLzIpJThdCisJYWRkCSR4aSwkVDEsJFQxCQkJISArPVhbaSs5XQorCWFkZAkkdG1wMiwkVDEsJFQxCisJYWRkCSR0bXAxLCRUMSwkVDEKKworCXNsbHgJJFQxLDMyLCR0bXAwCisJb3IJJHRtcDAsQFhbKCRpLzIpJThdLEBYWygkaS8yKSU4XQorX19fCisgICAgfQorICAgICZCT0RZXzAwXzE1KEBfKTsKK30gaWYgKCRTWj09NCk7CisKKyMjIyMjIyMjIyMjIFNIQTUxMgorJEJPRFlfMTZfWFggPSBzdWIgeworbXkgJGk9QF9bMF07CitteSBAcGFpcj0oIiVsIi5ldmFsKCgkaSoyKSU4KSwiJWwiLmV2YWwoKCRpKjIpJTgrMSkpOworCiskY29kZS49PDxfX187CisJc2xseAklbDIsMzIsJHRtcDAJCSEhIFh1cGRhdGUoJGkpCisJb3IJJWwzLCR0bXAwLCR0bXAwCisKKwlzcmx4CSR0bXAwLEBzaWdtYTBbMF0sJFQxCisJbGQJWyVzcCtgJGJpYXMrJGZyYW1lKygoJGkrMSsxKSUxNikqJFNaKzBgXSwlbDIKKwlzbGx4CSR0bXAwLGA2NC1Ac2lnbWEwWzJdYCwkdG1wMQorCWxkCVslc3ArYCRiaWFzKyRmcmFtZSsoKCRpKzErMSklMTYpKiRTWis0YF0sJWwzCisJc3JseAkkdG1wMCxAc2lnbWEwWzFdLCR0bXAwCisJeG9yCSR0bXAxLCRUMSwkVDEKKwlzbGx4CSR0bXAxLGBAc2lnbWEwWzJdLUBzaWdtYTBbMV1gLCR0bXAxCisJeG9yCSR0bXAwLCRUMSwkVDEKKwlzcmx4CSR0bXAwLGBAc2lnbWEwWzJdLUBzaWdtYTBbMV1gLCR0bXAwCisJeG9yCSR0bXAxLCRUMSwkVDEKKwlzbGx4CSVsNiwzMiwkdG1wMgorCXhvcgkkdG1wMCwkVDEsJFQxCQkhIHNpZ21hMChYWyRpKzFdKQorCW9yCSVsNywkdG1wMiwkdG1wMgorCisJc3JseAkkdG1wMixAc2lnbWExWzBdLCR0bXAxCisJbGQJWyVzcCtgJGJpYXMrJGZyYW1lKygoJGkrMSsxNCklMTYpKiRTWiswYF0sJWw2CisJc2xseAkkdG1wMixgNjQtQHNpZ21hMVsyXWAsJHRtcDAKKwlsZAlbJXNwK2AkYmlhcyskZnJhbWUrKCgkaSsxKzE0KSUxNikqJFNaKzRgXSwlbDcKKwlzcmx4CSR0bXAyLEBzaWdtYTFbMV0sJHRtcDIKKwl4b3IJJHRtcDAsJHRtcDEsJHRtcDEKKwlzbGx4CSR0bXAwLGBAc2lnbWExWzJdLUBzaWdtYTFbMV1gLCR0bXAwCisJeG9yCSR0bXAyLCR0bXAxLCR0bXAxCisJc3JseAkkdG1wMixgQHNpZ21hMVsyXS1Ac2lnbWExWzFdYCwkdG1wMgorCXhvcgkkdG1wMCwkdG1wMSwkdG1wMQorCXNsbHgJJWw0LDMyLCR0bXAwCisJeG9yCSR0bXAyLCR0bXAxLCR0bXAxCSEgc2lnbWExKFhbJGkrMTRdKQorCWxkCVslc3ArYCRiaWFzKyRmcmFtZSsoKCRpKzErOSklMTYpKiRTWiswYF0sJWw0CisJb3IJJWw1LCR0bXAwLCR0bXAwCisJbGQJWyVzcCtgJGJpYXMrJGZyYW1lKygoJGkrMSs5KSUxNikqJFNaKzRgXSwlbDUKKworCXNsbHgJJWwwLDMyLCR0bXAyCisJYWRkCSR0bXAxLCRUMSwkVDEKKwlsZAlbJXNwK2AkYmlhcyskZnJhbWUrKCgkaSsxKzApJTE2KSokU1orMGBdLCVsMAorCW9yCSVsMSwkdG1wMiwkdG1wMgorCWFkZAkkdG1wMCwkVDEsJFQxCQkhICs9WFskaSs5XQorCWxkCVslc3ArYCRiaWFzKyRmcmFtZSsoKCRpKzErMCklMTYpKiRTWis0YF0sJWwxCisJYWRkCSR0bXAyLCRUMSwkVDEJCSEgKz1YWyRpXQorCSRTVAkkVDEsWyVzcCtgJGJpYXMrJGZyYW1lKygkaSUxNikqJFNaYF0KK19fXworICAgICZCT0RZXzAwXzE1KEBfKTsKK30gaWYgKCRTWj09OCk7CisKKyRjb2RlLj08PF9fXyBpZiAoJGJpdHM9PTY0KTsKKy5yZWdpc3RlcgklZzIsI3NjcmF0Y2gKKy5yZWdpc3RlcgklZzMsI3NjcmF0Y2gKK19fXworJGNvZGUuPTw8X19fOworLnNlY3Rpb24JIi50ZXh0IiwjYWxsb2MsI2V4ZWNpbnN0cgorCisuYWxpZ24JNjQKK0ske2xhYmVsfToKKy50eXBlCUske2xhYmVsfSwjb2JqZWN0CitfX18KK2lmICgkU1o9PTQpIHsKKyRjb2RlLj08PF9fXzsKKwkubG9uZwkweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1CisJLmxvbmcJMHgzOTU2YzI1YiwgMHg1OWYxMTFmMSwgMHg5MjNmODJhNCwgMHhhYjFjNWVkNQorCS5sb25nCTB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMKKwkubG9uZwkweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0CisJLmxvbmcJMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYworCS5sb25nCTB4MmRlOTJjNmYsIDB4NGE3NDg0YWEsIDB4NWNiMGE5ZGMsIDB4NzZmOTg4ZGEKKwkubG9uZwkweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3CisJLmxvbmcJMHhjNmUwMGJmMywgMHhkNWE3OTE0NywgMHgwNmNhNjM1MSwgMHgxNDI5Mjk2NworCS5sb25nCTB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMKKwkubG9uZwkweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1CisJLmxvbmcJMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMworCS5sb25nCTB4ZDE5MmU4MTksIDB4ZDY5OTA2MjQsIDB4ZjQwZTM1ODUsIDB4MTA2YWEwNzAKKwkubG9uZwkweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1CisJLmxvbmcJMHgzOTFjMGNiMywgMHg0ZWQ4YWE0YSwgMHg1YjljY2E0ZiwgMHg2ODJlNmZmMworCS5sb25nCTB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgKKwkubG9uZwkweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyCitfX18KK30gZWxzZSB7CiskY29kZS49PDxfX187CisJLmxvbmcJMHg0MjhhMmY5OCwweGQ3MjhhZTIyLCAweDcxMzc0NDkxLDB4MjNlZjY1Y2QKKwkubG9uZwkweGI1YzBmYmNmLDB4ZWM0ZDNiMmYsIDB4ZTliNWRiYTUsMHg4MTg5ZGJiYworCS5sb25nCTB4Mzk1NmMyNWIsMHhmMzQ4YjUzOCwgMHg1OWYxMTFmMSwweGI2MDVkMDE5CisJLmxvbmcJMHg5MjNmODJhNCwweGFmMTk0ZjliLCAweGFiMWM1ZWQ1LDB4ZGE2ZDgxMTgKKwkubG9uZwkweGQ4MDdhYTk4LDB4YTMwMzAyNDIsIDB4MTI4MzViMDEsMHg0NTcwNmZiZQorCS5sb25nCTB4MjQzMTg1YmUsMHg0ZWU0YjI4YywgMHg1NTBjN2RjMywweGQ1ZmZiNGUyCisJLmxvbmcJMHg3MmJlNWQ3NCwweGYyN2I4OTZmLCAweDgwZGViMWZlLDB4M2IxNjk2YjEKKwkubG9uZwkweDliZGMwNmE3LDB4MjVjNzEyMzUsIDB4YzE5YmYxNzQsMHhjZjY5MjY5NAorCS5sb25nCTB4ZTQ5YjY5YzEsMHg5ZWYxNGFkMiwgMHhlZmJlNDc4NiwweDM4NGYyNWUzCisJLmxvbmcJMHgwZmMxOWRjNiwweDhiOGNkNWI1LCAweDI0MGNhMWNjLDB4NzdhYzljNjUKKwkubG9uZwkweDJkZTkyYzZmLDB4NTkyYjAyNzUsIDB4NGE3NDg0YWEsMHg2ZWE2ZTQ4MworCS5sb25nCTB4NWNiMGE5ZGMsMHhiZDQxZmJkNCwgMHg3NmY5ODhkYSwweDgzMTE1M2I1CisJLmxvbmcJMHg5ODNlNTE1MiwweGVlNjZkZmFiLCAweGE4MzFjNjZkLDB4MmRiNDMyMTAKKwkubG9uZwkweGIwMDMyN2M4LDB4OThmYjIxM2YsIDB4YmY1OTdmYzcsMHhiZWVmMGVlNAorCS5sb25nCTB4YzZlMDBiZjMsMHgzZGE4OGZjMiwgMHhkNWE3OTE0NywweDkzMGFhNzI1CisJLmxvbmcJMHgwNmNhNjM1MSwweGUwMDM4MjZmLCAweDE0MjkyOTY3LDB4MGEwZTZlNzAKKwkubG9uZwkweDI3YjcwYTg1LDB4NDZkMjJmZmMsIDB4MmUxYjIxMzgsMHg1YzI2YzkyNgorCS5sb25nCTB4NGQyYzZkZmMsMHg1YWM0MmFlZCwgMHg1MzM4MGQxMywweDlkOTViM2RmCisJLmxvbmcJMHg2NTBhNzM1NCwweDhiYWY2M2RlLCAweDc2NmEwYWJiLDB4M2M3N2IyYTgKKwkubG9uZwkweDgxYzJjOTJlLDB4NDdlZGFlZTYsIDB4OTI3MjJjODUsMHgxNDgyMzUzYgorCS5sb25nCTB4YTJiZmU4YTEsMHg0Y2YxMDM2NCwgMHhhODFhNjY0YiwweGJjNDIzMDAxCisJLmxvbmcJMHhjMjRiOGI3MCwweGQwZjg5NzkxLCAweGM3NmM1MWEzLDB4MDY1NGJlMzAKKwkubG9uZwkweGQxOTJlODE5LDB4ZDZlZjUyMTgsIDB4ZDY5OTA2MjQsMHg1NTY1YTkxMAorCS5sb25nCTB4ZjQwZTM1ODUsMHg1NzcxMjAyYSwgMHgxMDZhYTA3MCwweDMyYmJkMWI4CisJLmxvbmcJMHgxOWE0YzExNiwweGI4ZDJkMGM4LCAweDFlMzc2YzA4LDB4NTE0MWFiNTMKKwkubG9uZwkweDI3NDg3NzRjLDB4ZGY4ZWViOTksIDB4MzRiMGJjYjUsMHhlMTliNDhhOAorCS5sb25nCTB4MzkxYzBjYjMsMHhjNWM5NWE2MywgMHg0ZWQ4YWE0YSwweGUzNDE4YWNiCisJLmxvbmcJMHg1YjljY2E0ZiwweDc3NjNlMzczLCAweDY4MmU2ZmYzLDB4ZDZiMmI4YTMKKwkubG9uZwkweDc0OGY4MmVlLDB4NWRlZmIyZmMsIDB4NzhhNTYzNmYsMHg0MzE3MmY2MAorCS5sb25nCTB4ODRjODc4MTQsMHhhMWYwYWI3MiwgMHg4Y2M3MDIwOCwweDFhNjQzOWVjCisJLmxvbmcJMHg5MGJlZmZmYSwweDIzNjMxZTI4LCAweGE0NTA2Y2ViLDB4ZGU4MmJkZTkKKwkubG9uZwkweGJlZjlhM2Y3LDB4YjJjNjc5MTUsIDB4YzY3MTc4ZjIsMHhlMzcyNTMyYgorCS5sb25nCTB4Y2EyNzNlY2UsMHhlYTI2NjE5YywgMHhkMTg2YjhjNywweDIxYzBjMjA3CisJLmxvbmcJMHhlYWRhN2RkNiwweGNkZTBlYjFlLCAweGY1N2Q0ZjdmLDB4ZWU2ZWQxNzgKKwkubG9uZwkweDA2ZjA2N2FhLDB4NzIxNzZmYmEsIDB4MGE2MzdkYzUsMHhhMmM4OThhNgorCS5sb25nCTB4MTEzZjk4MDQsMHhiZWY5MGRhZSwgMHgxYjcxMGIzNSwweDEzMWM0NzFiCisJLmxvbmcJMHgyOGRiNzdmNSwweDIzMDQ3ZDg0LCAweDMyY2FhYjdiLDB4NDBjNzI0OTMKKwkubG9uZwkweDNjOWViZTBhLDB4MTVjOWJlYmMsIDB4NDMxZDY3YzQsMHg5YzEwMGQ0YworCS5sb25nCTB4NGNjNWQ0YmUsMHhjYjNlNDJiNiwgMHg1OTdmMjk5YywweGZjNjU3ZTJhCisJLmxvbmcJMHg1ZmNiNmZhYiwweDNhZDZmYWVjLCAweDZjNDQxOThjLDB4NGE0NzU4MTcKK19fXworfQorJGNvZGUuPTw8X19fOworLnNpemUJSyR7bGFiZWx9LC4tSyR7bGFiZWx9CisuZ2xvYmwJc2hhJHtsYWJlbH1fYmxvY2tfZGF0YV9vcmRlcgorc2hhJHtsYWJlbH1fYmxvY2tfZGF0YV9vcmRlcjoKKwlzYXZlCSVzcCxgLSRmcmFtZS0kbG9jYWxzYCwlc3AKKwlhbmQJJGlucCxgJGFsaWduLTFgLCR0bXAzMQorCXNsbHgJJGxlbixgbG9nKDE2KiRTWikvbG9nKDIpYCwkbGVuCisJYW5kbgkkaW5wLGAkYWxpZ24tMWAsJGlucAorCXNsbAkkdG1wMzEsMywkdG1wMzEKKwlhZGQJJGlucCwkbGVuLCRsZW4KK19fXworJGNvZGUuPTw8X19fIGlmICgkU1o9PTgpOyAjIFNIQTUxMgorCW1vdgkzMiwkdG1wMzIKKwlzdWIJJHRtcDMyLCR0bXAzMSwkdG1wMzIKK19fXworJGNvZGUuPTw8X19fOworLkxwaWM6CWNhbGwJLis4CisJYWRkCSVvNyxLJHtsYWJlbH0tLkxwaWMsJEt0YmwKKworCSRMRAlbJGN0eCtgMCokU1pgXSwkQQorCSRMRAlbJGN0eCtgMSokU1pgXSwkQgorCSRMRAlbJGN0eCtgMiokU1pgXSwkQworCSRMRAlbJGN0eCtgMyokU1pgXSwkRAorCSRMRAlbJGN0eCtgNCokU1pgXSwkRQorCSRMRAlbJGN0eCtgNSokU1pgXSwkRgorCSRMRAlbJGN0eCtgNiokU1pgXSwkRworCSRMRAlbJGN0eCtgNyokU1pgXSwkSAorCisuTGxvb3A6CitfX18KK2ZvciAoJGk9MDskaTwxNjskaSsrKQl7ICZCT0RZXzAwXzE1KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPSIuTDE2X3h4OlxuIjsKK2ZvciAoOyRpPDMyOyRpKyspCXsgJiRCT0RZXzE2X1hYKCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPTw8X19fOworCWFuZAkkdG1wMiwweGZmZiwkdG1wMgorCWNtcAkkdG1wMiwkbGFzdEsKKwlibmUJLkwxNl94eAorCWFkZAkkS3RibCxgMTYqJFNaYCwkS3RibAkhIEt0YmwrPTE2CisKK19fXworJGNvZGUuPTw8X19fIGlmICgkU1o9PTQpOyAjIFNIQTI1NgorCSRMRAlbJGN0eCtgMCokU1pgXSxAWFswXQorCSRMRAlbJGN0eCtgMSokU1pgXSxAWFsxXQorCSRMRAlbJGN0eCtgMiokU1pgXSxAWFsyXQorCSRMRAlbJGN0eCtgMyokU1pgXSxAWFszXQorCSRMRAlbJGN0eCtgNCokU1pgXSxAWFs0XQorCSRMRAlbJGN0eCtgNSokU1pgXSxAWFs1XQorCSRMRAlbJGN0eCtgNiokU1pgXSxAWFs2XQorCSRMRAlbJGN0eCtgNyokU1pgXSxAWFs3XQorCisJYWRkCSRBLEBYWzBdLCRBCisJJFNUCSRBLFskY3R4K2AwKiRTWmBdCisJYWRkCSRCLEBYWzFdLCRCCisJJFNUCSRCLFskY3R4K2AxKiRTWmBdCisJYWRkCSRDLEBYWzJdLCRDCisJJFNUCSRDLFskY3R4K2AyKiRTWmBdCisJYWRkCSRELEBYWzNdLCRECisJJFNUCSRELFskY3R4K2AzKiRTWmBdCisJYWRkCSRFLEBYWzRdLCRFCisJJFNUCSRFLFskY3R4K2A0KiRTWmBdCisJYWRkCSRGLEBYWzVdLCRGCisJJFNUCSRGLFskY3R4K2A1KiRTWmBdCisJYWRkCSRHLEBYWzZdLCRHCisJJFNUCSRHLFskY3R4K2A2KiRTWmBdCisJYWRkCSRILEBYWzddLCRICisJJFNUCSRILFskY3R4K2A3KiRTWmBdCitfX18KKyRjb2RlLj08PF9fXyBpZiAoJFNaPT04KTsgIyBTSEE1MTIKKwlsZAlbJGN0eCtgMCokU1orMGBdLCVsMAorCWxkCVskY3R4K2AwKiRTWis0YF0sJWwxCisJbGQJWyRjdHgrYDEqJFNaKzBgXSwlbDIKKwlsZAlbJGN0eCtgMSokU1orNGBdLCVsMworCWxkCVskY3R4K2AyKiRTWiswYF0sJWw0CisJbGQJWyRjdHgrYDIqJFNaKzRgXSwlbDUKKwlsZAlbJGN0eCtgMyokU1orMGBdLCVsNgorCisJc2xseAklbDAsMzIsJHRtcDAKKwlsZAlbJGN0eCtgMyokU1orNGBdLCVsNworCXNsbHgJJWwyLDMyLCR0bXAxCisJb3IJJWwxLCR0bXAwLCR0bXAwCisJb3IJJWwzLCR0bXAxLCR0bXAxCisJYWRkCSR0bXAwLCRBLCRBCisJYWRkCSR0bXAxLCRCLCRCCisJJFNUCSRBLFskY3R4K2AwKiRTWmBdCisJc2xseAklbDQsMzIsJHRtcDIKKwkkU1QJJEIsWyRjdHgrYDEqJFNaYF0KKwlzbGx4CSVsNiwzMiwkVDEKKwlvcgklbDUsJHRtcDIsJHRtcDIKKwlvcgklbDcsJFQxLCRUMQorCWFkZAkkdG1wMiwkQywkQworCSRTVAkkQyxbJGN0eCtgMiokU1pgXQorCWFkZAkkVDEsJEQsJEQKKwkkU1QJJEQsWyRjdHgrYDMqJFNaYF0KKworCWxkCVskY3R4K2A0KiRTWiswYF0sJWwwCisJbGQJWyRjdHgrYDQqJFNaKzRgXSwlbDEKKwlsZAlbJGN0eCtgNSokU1orMGBdLCVsMgorCWxkCVskY3R4K2A1KiRTWis0YF0sJWwzCisJbGQJWyRjdHgrYDYqJFNaKzBgXSwlbDQKKwlsZAlbJGN0eCtgNiokU1orNGBdLCVsNQorCWxkCVskY3R4K2A3KiRTWiswYF0sJWw2CisKKwlzbGx4CSVsMCwzMiwkdG1wMAorCWxkCVskY3R4K2A3KiRTWis0YF0sJWw3CisJc2xseAklbDIsMzIsJHRtcDEKKwlvcgklbDEsJHRtcDAsJHRtcDAKKwlvcgklbDMsJHRtcDEsJHRtcDEKKwlhZGQJJHRtcDAsJEUsJEUKKwlhZGQJJHRtcDEsJEYsJEYKKwkkU1QJJEUsWyRjdHgrYDQqJFNaYF0KKwlzbGx4CSVsNCwzMiwkdG1wMgorCSRTVAkkRixbJGN0eCtgNSokU1pgXQorCXNsbHgJJWw2LDMyLCRUMQorCW9yCSVsNSwkdG1wMiwkdG1wMgorCW9yCSVsNywkVDEsJFQxCisJYWRkCSR0bXAyLCRHLCRHCisJJFNUCSRHLFskY3R4K2A2KiRTWmBdCisJYWRkCSRUMSwkSCwkSAorCSRTVAkkSCxbJGN0eCtgNyokU1pgXQorX19fCiskY29kZS49PDxfX187CisJYWRkCSRpbnAsYDE2KiRTWmAsJGlucAkJISBhZHZhbmNlIGlucAorCWNtcAkkaW5wLCRsZW4KKwlibmUJYCRiaXRzPT02ND8iJXhjYyI6IiVpY2MiYCwuTGxvb3AKKwlzdWIJJEt0YmwsYCgkcm91bmRzLTE2KSokU1pgLCRLdGJsCSEgcmV3aW5kIEt0YmwKKworCXJldAorCXJlc3RvcmUKKy50eXBlCXNoYSR7bGFiZWx9X2Jsb2NrX2RhdGFfb3JkZXIsI2Z1bmN0aW9uCisuc2l6ZQlzaGEke2xhYmVsfV9ibG9ja19kYXRhX29yZGVyLCguLXNoYSR7bGFiZWx9X2Jsb2NrX2RhdGFfb3JkZXIpCisuYXNjaXoJIlNIQSR7bGFiZWx9IGJsb2NrIHRyYW5zZm9ybSBmb3IgU1BBUkN2OSwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKK19fXworCiskY29kZSA9fiBzL1xgKFteXGBdKilcYC9ldmFsICQxL2dlbTsKK3ByaW50ICRjb2RlOworY2xvc2UgU1RET1VUOwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9hc20vc2hhNTEyLXg4Nl82NC5wbCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi14ODZfNjQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2NDNmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvYXNtL3NoYTUxMi14ODZfNjQucGwKQEAgLTAsMCArMSw0NTYgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgV3JpdHRlbiBieSBBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT4gZm9yIHRoZSBPcGVuU1NMCisjIHByb2plY3QuIFJpZ2h0cyBmb3IgcmVkaXN0cmlidXRpb24gYW5kIHVzYWdlIGluIHNvdXJjZSBhbmQgYmluYXJ5CisjIGZvcm1zIGFyZSBncmFudGVkIGFjY29yZGluZyB0byB0aGUgT3BlblNTTCBsaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBzaGEyNTYvNTEyX2Jsb2NrIHByb2NlZHVyZSBmb3IgeDg2XzY0LgorIworIyA0MCUgaW1wcm92ZW1lbnQgb3ZlciBjb21waWxlci1nZW5lcmF0ZWQgY29kZSBvbiBPcHRlcm9uLiBPbiBFTTY0VAorIyBzaGEyNTYgd2FzIG9ic2VydmVkIHRvIHJ1biA+ODAlIGZhc3RlciBhbmQgc2hhNTEyIC0gPjQwJS4gTm8gbWFnaWNhbAorIyB0cmlja3MsIGp1c3Qgc3RyYWlnaHQgaW1wbGVtZW50YXRpb24uLi4gSSByZWFsbHkgd29uZGVyIHdoeSBnY2MKKyMgW2JlaW5nIGFybWVkIHdpdGggaW5saW5lIGFzc2VtYmxlcl0gZmFpbHMgdG8gZ2VuZXJhdGUgYXMgZmFzdCBjb2RlLgorIyBUaGUgb25seSB0aGluZyB3aGljaCBpcyBjb29sIGFib3V0IHRoaXMgbW9kdWxlIGlzIHRoYXQgaXQncyB2ZXJ5CisjIHNhbWUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgdXNlZCBmb3IgYm90aCBTSEEtMjU2IGFuZCBTSEEtNTEyLiBJbgorIyBmb3JtZXIgY2FzZSB0aGUgaW5zdHJ1Y3Rpb25zIG9wZXJhdGUgb24gMzItYml0IG9wZXJhbmRzLCB3aGlsZSBpbgorIyBsYXR0ZXIgLSBvbiA2NC1iaXQgb25lcy4gQWxsIEkgaGFkIHRvIGRvIGlzIHRvIGdldCBvbmUgZmxhdm9yIHJpZ2h0LAorIyB0aGUgb3RoZXIgb25lIHBhc3NlZCB0aGUgdGVzdCByaWdodCBhd2F5Oi0pCisjCisjIHNoYTI1Nl9ibG9jayBydW5zIGluIH4xMDA1IGN5Y2xlcyBvbiBPcHRlcm9uLCB3aGljaCBnaXZlcyB5b3UKKyMgYXN5bXB0b3RpYyBwZXJmb3JtYW5jZSBvZiA2NCoxMDAwLzEwMDU9NjMuN01CcHMgdGltZXMgQ1BVIGNsb2NrCisjIGZyZXF1ZW5jeSBpbiBHSHouIHNoYTUxMl9ibG9jayBydW5zIGluIH4xMjc1IGN5Y2xlcywgd2hpY2ggcmVzdWx0cworIyBpbiAxMjgqMTAwMC8xMjc1PTEwME1CcHMgcGVyIEdIei4gSXMgdGhlcmUgcm9vbSBmb3IgaW1wcm92ZW1lbnQ/CisjIFdlbGwsIGlmIHlvdSBjb21wYXJlIGl0IHRvIElBLTY0IGltcGxlbWVudGF0aW9uLCB3aGljaCBtYWludGFpbnMKKyMgWFsxNl0gaW4gcmVnaXN0ZXIgYmFua1shXSwgdGVuZHMgdG8gNCBpbnN0cnVjdGlvbnMgcGVyIENQVSBjbG9jaworIyBjeWNsZSBhbmQgcnVucyBpbiAxMDAzIGN5Y2xlcywgMTI3NSBpcyB2ZXJ5IGdvb2QgcmVzdWx0IGZvciAzLXdheQorIyBpc3N1ZSBPcHRlcm9uIHBpcGVsaW5lIGFuZCBYWzE2XSBtYWludGFpbmVkIGluIG1lbW9yeS4gU28gdGhhdCAqaWYqCisjIHRoZXJlIGlzIGEgd2F5IHRvIGltcHJvdmUgaXQsICp0aGVuKiB0aGUgb25seSB3YXkgd291bGQgYmUgdG8gdHJ5IHRvCisjIG9mZmxvYWQgWFsxNl0gdXBkYXRlcyB0byBTU0UgdW5pdCwgYnV0IHRoYXQgd291bGQgcmVxdWlyZSAiZGVlcGVyIgorIyBsb29wIHVucm9sbCwgd2hpY2ggaW4gdHVybiB3b3VsZCBuYXR1cmFsbHkgY2F1c2Ugc2l6ZSBibG93LXVwLCBub3QKKyMgdG8gbWVudGlvbiBpbmNyZWFzZWQgY29tcGxleGl0eSEgQW5kIG9uY2UgYWdhaW4sIG9ubHkgKmlmKiBpdCdzCisjIGFjdHVhbGx5IHBvc3NpYmxlIHRvIG5vdGljZWFibHkgaW1wcm92ZSBvdmVyYWxsIElMUCwgaW5zdHJ1Y3Rpb24KKyMgbGV2ZWwgcGFyYWxsZWxpc20sIG9uIGEgZ2l2ZW4gQ1BVIGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZS4KKyMKKyMgU3BlY2lhbCBub3RlIG9uIEludGVsIEVNNjRULiBXaGlsZSBPcHRlcm9uIENQVSBleGhpYml0cyBwZXJmZWN0CisjIHBlcmZyb21hbmNlIHJhdGlvIG9mIDEuNSBiZXR3ZWVuIDY0LSBhbmQgMzItYml0IGZsYXZvcnMgW3NlZSBhYm92ZV0sCisjIFtjdXJyZW50bHkgYXZhaWxhYmxlXSBFTTY0VCBDUFVzIGFwcGFyZW50bHkgYXJlIGZhciBmcm9tIGl0LiBPbiB0aGUKKyMgY29udHJhcnksIDY0LWJpdCB2ZXJzaW9uLCBzaGE1MTJfYmxvY2ssIGlzIH4zMCUgKnNsb3dlciogdGhhbiAzMi1iaXQKKyMgc2hhMjU2X2Jsb2NrOi0oIFRoaXMgaXMgcHJlc3VtYWJseSBiZWNhdXNlIDY0LWJpdCBzaGlmdHMvcm90YXRlcworIyBhcHBhcmVudGx5IGFyZSBub3QgYXRvbWljIGluc3RydWN0aW9ucywgYnV0IGltcGxlbWVudGVkIGluIG1pY3JvY29kZS4KKworJGZsYXZvdXIgPSBzaGlmdDsKKyRvdXRwdXQgID0gc2hpZnQ7CitpZiAoJGZsYXZvdXIgPX4gL1wuLykgeyAkb3V0cHV0ID0gJGZsYXZvdXI7IHVuZGVmICRmbGF2b3VyOyB9CisKKyR3aW42ND0wOyAkd2luNjQ9MSBpZiAoJGZsYXZvdXIgPX4gL1tubV1hc218bWluZ3c2NC8gfHwgJG91dHB1dCA9fiAvXC5hc20kLyk7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9eDg2XzY0LXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHg4Nl82NC14bGF0ZS5wbCI7CisKK29wZW4gU1RET1VULCJ8ICReWCAkeGxhdGUgJGZsYXZvdXIgJG91dHB1dCI7CisKK2lmICgkb3V0cHV0ID1+IC81MTIvKSB7CisJJGZ1bmM9InNoYTUxMl9ibG9ja19kYXRhX29yZGVyIjsKKwkkVEFCTEU9Iks1MTIiOworCSRTWj04OworCUBST1Q9KCRBLCRCLCRDLCRELCRFLCRGLCRHLCRIKT0oIiVyYXgiLCIlcmJ4IiwiJXJjeCIsIiVyZHgiLAorCQkJCQkiJXI4IiwgIiVyOSIsICIlcjEwIiwiJXIxMSIpOworCSgkVDEsJGEwLCRhMSwkYTIpPSgiJXIxMiIsIiVyMTMiLCIlcjE0IiwiJXIxNSIpOworCUBTaWdtYTA9KDI4LDM0LDM5KTsKKwlAU2lnbWExPSgxNCwxOCw0MSk7CisJQHNpZ21hMD0oMSwgIDgsIDcpOworCUBzaWdtYTE9KDE5LDYxLCA2KTsKKwkkcm91bmRzPTgwOworfSBlbHNlIHsKKwkkZnVuYz0ic2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIiOworCSRUQUJMRT0iSzI1NiI7CisJJFNaPTQ7CisJQFJPVD0oJEEsJEIsJEMsJEQsJEUsJEYsJEcsJEgpPSgiJWVheCIsIiVlYngiLCIlZWN4IiwiJWVkeCIsCisJCQkJCSIlcjhkIiwiJXI5ZCIsIiVyMTBkIiwiJXIxMWQiKTsKKwkoJFQxLCRhMCwkYTEsJGEyKT0oIiVyMTJkIiwiJXIxM2QiLCIlcjE0ZCIsIiVyMTVkIik7CisJQFNpZ21hMD0oIDIsMTMsMjIpOworCUBTaWdtYTE9KCA2LDExLDI1KTsKKwlAc2lnbWEwPSggNywxOCwgMyk7CisJQHNpZ21hMT0oMTcsMTksMTApOworCSRyb3VuZHM9NjQ7Cit9CisKKyRjdHg9IiVyZGkiOwkjIDFzdCBhcmcKKyRyb3VuZD0iJXJkaSI7CSMgemFwcyAkY3R4CiskaW5wPSIlcnNpIjsJIyAybmQgYXJnCiskVGJsPSIlcmJwIjsKKworJF9jdHg9IjE2KiRTWiswKjgoJXJzcCkiOworJF9pbnA9IjE2KiRTWisxKjgoJXJzcCkiOworJF9lbmQ9IjE2KiRTWisyKjgoJXJzcCkiOworJF9yc3A9IjE2KiRTWiszKjgoJXJzcCkiOworJGZyYW1lc3o9IjE2KiRTWis0KjgiOworCisKK3N1YiBST1VORF8wMF8xNSgpCit7IG15ICgkaSwkYSwkYiwkYywkZCwkZSwkZiwkZywkaCkgPSBAXzsKKworJGNvZGUuPTw8X19fOworCW1vdgkkZSwkYTAKKwltb3YJJGUsJGExCisJbW92CSRmLCRhMgorCisJcm9yCVwkJFNpZ21hMVswXSwkYTAKKwlyb3IJXCQkU2lnbWExWzFdLCRhMQorCXhvcgkkZywkYTIJCQkjIGZeZworCisJeG9yCSRhMSwkYTAKKwlyb3IJXCRgJFNpZ21hMVsyXS0kU2lnbWExWzFdYCwkYTEKKwlhbmQJJGUsJGEyCQkJIyAoZl5nKSZlCisJbW92CSRUMSxgJFNaKigkaSYweGYpYCglcnNwKQorCisJeG9yCSRhMSwkYTAJCQkjIFNpZ21hMShlKQorCXhvcgkkZywkYTIJCQkjIENoKGUsZixnKT0oKGZeZykmZSleZworCWFkZAkkaCwkVDEJCQkjIFQxKz1oCisKKwltb3YJJGEsJGgKKwlhZGQJJGEwLCRUMQkJCSMgVDErPVNpZ21hMShlKQorCisJYWRkCSRhMiwkVDEJCQkjIFQxKz1DaChlLGYsZykKKwltb3YJJGEsJGEwCisJbW92CSRhLCRhMQorCisJcm9yCVwkJFNpZ21hMFswXSwkaAorCXJvcglcJCRTaWdtYTBbMV0sJGEwCisJbW92CSRhLCRhMgorCWFkZAkoJFRibCwkcm91bmQsJFNaKSwkVDEJIyBUMSs9S1tyb3VuZF0KKworCXhvcgkkYTAsJGgKKwlyb3IJXCRgJFNpZ21hMFsyXS0kU2lnbWEwWzFdYCwkYTAKKwlvcgkkYywkYTEJCQkjIGF8YworCisJeG9yCSRhMCwkaAkJCSMgaD1TaWdtYTAoYSkKKwlhbmQJJGMsJGEyCQkJIyBhJmMKKwlhZGQJJFQxLCRkCQkJIyBkKz1UMQorCisJYW5kCSRiLCRhMQkJCSMgKGF8YykmYgorCWFkZAkkVDEsJGgJCQkjIGgrPVQxCisKKwlvcgkkYTIsJGExCQkJIyBNYWooYSxiLGMpPSgoYXxjKSZiKXwoYSZjKQorCWxlYQkxKCRyb3VuZCksJHJvdW5kCSMgcm91bmQrKworCisJYWRkCSRhMSwkaAkJCSMgaCs9TWFqKGEsYixjKQorX19fCit9CisKK3N1YiBST1VORF8xNl9YWCgpCit7IG15ICgkaSwkYSwkYiwkYywkZCwkZSwkZiwkZywkaCkgPSBAXzsKKworJGNvZGUuPTw8X19fOworCW1vdglgJFNaKigoJGkrMSkmMHhmKWAoJXJzcCksJGEwCisJbW92CWAkU1oqKCgkaSsxNCkmMHhmKWAoJXJzcCksJFQxCisKKwltb3YJJGEwLCRhMgorCisJc2hyCVwkJHNpZ21hMFsyXSwkYTAKKwlyb3IJXCQkc2lnbWEwWzBdLCRhMgorCisJeG9yCSRhMiwkYTAKKwlyb3IJXCRgJHNpZ21hMFsxXS0kc2lnbWEwWzBdYCwkYTIKKworCXhvcgkkYTIsJGEwCQkJIyBzaWdtYTAoWFsoaSsxKSYweGZdKQorCW1vdgkkVDEsJGExCisKKwlzaHIJXCQkc2lnbWExWzJdLCRUMQorCXJvcglcJCRzaWdtYTFbMF0sJGExCisKKwl4b3IJJGExLCRUMQorCXJvcglcJGAkc2lnbWExWzFdLSRzaWdtYTFbMF1gLCRhMQorCisJeG9yCSRhMSwkVDEJCQkjIHNpZ21hMShYWyhpKzE0KSYweGZdKQorCisJYWRkCSRhMCwkVDEKKworCWFkZAlgJFNaKigoJGkrOSkmMHhmKWAoJXJzcCksJFQxCisKKwlhZGQJYCRTWiooJGkmMHhmKWAoJXJzcCksJFQxCitfX18KKwkmUk9VTkRfMDBfMTUoQF8pOworfQorCiskY29kZT08PF9fXzsKKy50ZXh0CisKKy5nbG9ibAkkZnVuYworLnR5cGUJJGZ1bmMsXEBmdW5jdGlvbiw0CisuYWxpZ24JMTYKKyRmdW5jOgorCXB1c2gJJXJieAorCXB1c2gJJXJicAorCXB1c2gJJXIxMgorCXB1c2gJJXIxMworCXB1c2gJJXIxNAorCXB1c2gJJXIxNQorCW1vdgklcnNwLCVyMTEJCSMgY29weSAlcnNwCisJc2hsCVwkNCwlcmR4CQkjIG51bSoxNgorCXN1YglcJCRmcmFtZXN6LCVyc3AKKwlsZWEJKCRpbnAsJXJkeCwkU1opLCVyZHgJIyBpbnArbnVtKjE2KiRTWgorCWFuZAlcJC02NCwlcnNwCQkjIGFsaWduIHN0YWNrIGZyYW1lCisJbW92CSRjdHgsJF9jdHgJCSMgc2F2ZSBjdHgsIDFzdCBhcmcKKwltb3YJJGlucCwkX2lucAkJIyBzYXZlIGlucCwgMm5kIGFyaAorCW1vdgklcmR4LCRfZW5kCQkjIHNhdmUgZW5kIHBvaW50ZXIsICIzcmQiIGFyZworCW1vdgklcjExLCRfcnNwCQkjIHNhdmUgY29weSBvZiAlcnNwCisuTHByb2xvZ3VlOgorCisJbGVhCSRUQUJMRSglcmlwKSwkVGJsCisKKwltb3YJJFNaKjAoJGN0eCksJEEKKwltb3YJJFNaKjEoJGN0eCksJEIKKwltb3YJJFNaKjIoJGN0eCksJEMKKwltb3YJJFNaKjMoJGN0eCksJEQKKwltb3YJJFNaKjQoJGN0eCksJEUKKwltb3YJJFNaKjUoJGN0eCksJEYKKwltb3YJJFNaKjYoJGN0eCksJEcKKwltb3YJJFNaKjcoJGN0eCksJEgKKwlqbXAJLkxsb29wCisKKy5hbGlnbgkxNgorLkxsb29wOgorCXhvcgkkcm91bmQsJHJvdW5kCitfX18KKwlmb3IoJGk9MDskaTwxNjskaSsrKSB7CisJCSRjb2RlLj0iCW1vdgkkU1oqJGkoJGlucCksJFQxXG4iOworCQkkY29kZS49Iglic3dhcAkkVDFcbiI7CisJCSZST1VORF8wMF8xNSgkaSxAUk9UKTsKKwkJdW5zaGlmdChAUk9ULHBvcChAUk9UKSk7CisJfQorJGNvZGUuPTw8X19fOworCWptcAkuTHJvdW5kc18xNl94eAorLmFsaWduCTE2CisuTHJvdW5kc18xNl94eDoKK19fXworCWZvcig7JGk8MzI7JGkrKykgeworCQkmUk9VTkRfMTZfWFgoJGksQFJPVCk7CisJCXVuc2hpZnQoQFJPVCxwb3AoQFJPVCkpOworCX0KKworJGNvZGUuPTw8X19fOworCWNtcAlcJCRyb3VuZHMsJHJvdW5kCisJamIJLkxyb3VuZHNfMTZfeHgKKworCW1vdgkkX2N0eCwkY3R4CisJbGVhCTE2KiRTWigkaW5wKSwkaW5wCisKKwlhZGQJJFNaKjAoJGN0eCksJEEKKwlhZGQJJFNaKjEoJGN0eCksJEIKKwlhZGQJJFNaKjIoJGN0eCksJEMKKwlhZGQJJFNaKjMoJGN0eCksJEQKKwlhZGQJJFNaKjQoJGN0eCksJEUKKwlhZGQJJFNaKjUoJGN0eCksJEYKKwlhZGQJJFNaKjYoJGN0eCksJEcKKwlhZGQJJFNaKjcoJGN0eCksJEgKKworCWNtcAkkX2VuZCwkaW5wCisKKwltb3YJJEEsJFNaKjAoJGN0eCkKKwltb3YJJEIsJFNaKjEoJGN0eCkKKwltb3YJJEMsJFNaKjIoJGN0eCkKKwltb3YJJEQsJFNaKjMoJGN0eCkKKwltb3YJJEUsJFNaKjQoJGN0eCkKKwltb3YJJEYsJFNaKjUoJGN0eCkKKwltb3YJJEcsJFNaKjYoJGN0eCkKKwltb3YJJEgsJFNaKjcoJGN0eCkKKwlqYgkuTGxvb3AKKworCW1vdgkkX3JzcCwlcnNpCisJbW92CSglcnNpKSwlcjE1CisJbW92CTgoJXJzaSksJXIxNAorCW1vdgkxNiglcnNpKSwlcjEzCisJbW92CTI0KCVyc2kpLCVyMTIKKwltb3YJMzIoJXJzaSksJXJicAorCW1vdgk0MCglcnNpKSwlcmJ4CisJbGVhCTQ4KCVyc2kpLCVyc3AKKy5MZXBpbG9ndWU6CisJcmV0Cisuc2l6ZQkkZnVuYywuLSRmdW5jCitfX18KKworaWYgKCRTWj09NCkgeworJGNvZGUuPTw8X19fOworLmFsaWduCTY0CisudHlwZQkkVEFCTEUsXEBvYmplY3QKKyRUQUJMRToKKwkubG9uZwkweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisJLmxvbmcJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorCS5sb25nCTB4ZDgwN2FhOTgsMHgxMjgzNWIwMSwweDI0MzE4NWJlLDB4NTUwYzdkYzMKKwkubG9uZwkweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisJLmxvbmcJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworCS5sb25nCTB4MmRlOTJjNmYsMHg0YTc0ODRhYSwweDVjYjBhOWRjLDB4NzZmOTg4ZGEKKwkubG9uZwkweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisJLmxvbmcJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworCS5sb25nCTB4MjdiNzBhODUsMHgyZTFiMjEzOCwweDRkMmM2ZGZjLDB4NTMzODBkMTMKKwkubG9uZwkweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisJLmxvbmcJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworCS5sb25nCTB4ZDE5MmU4MTksMHhkNjk5MDYyNCwweGY0MGUzNTg1LDB4MTA2YWEwNzAKKwkubG9uZwkweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisJLmxvbmcJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworCS5sb25nCTB4NzQ4ZjgyZWUsMHg3OGE1NjM2ZiwweDg0Yzg3ODE0LDB4OGNjNzAyMDgKKwkubG9uZwkweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCitfX18KK30gZWxzZSB7CiskY29kZS49PDxfX187CisuYWxpZ24JNjQKKy50eXBlCSRUQUJMRSxcQG9iamVjdAorJFRBQkxFOgorCS5xdWFkCTB4NDI4YTJmOThkNzI4YWUyMiwweDcxMzc0NDkxMjNlZjY1Y2QKKwkucXVhZAkweGI1YzBmYmNmZWM0ZDNiMmYsMHhlOWI1ZGJhNTgxODlkYmJjCisJLnF1YWQJMHgzOTU2YzI1YmYzNDhiNTM4LDB4NTlmMTExZjFiNjA1ZDAxOQorCS5xdWFkCTB4OTIzZjgyYTRhZjE5NGY5YiwweGFiMWM1ZWQ1ZGE2ZDgxMTgKKwkucXVhZAkweGQ4MDdhYTk4YTMwMzAyNDIsMHgxMjgzNWIwMTQ1NzA2ZmJlCisJLnF1YWQJMHgyNDMxODViZTRlZTRiMjhjLDB4NTUwYzdkYzNkNWZmYjRlMgorCS5xdWFkCTB4NzJiZTVkNzRmMjdiODk2ZiwweDgwZGViMWZlM2IxNjk2YjEKKwkucXVhZAkweDliZGMwNmE3MjVjNzEyMzUsMHhjMTliZjE3NGNmNjkyNjk0CisJLnF1YWQJMHhlNDliNjljMTllZjE0YWQyLDB4ZWZiZTQ3ODYzODRmMjVlMworCS5xdWFkCTB4MGZjMTlkYzY4YjhjZDViNSwweDI0MGNhMWNjNzdhYzljNjUKKwkucXVhZAkweDJkZTkyYzZmNTkyYjAyNzUsMHg0YTc0ODRhYTZlYTZlNDgzCisJLnF1YWQJMHg1Y2IwYTlkY2JkNDFmYmQ0LDB4NzZmOTg4ZGE4MzExNTNiNQorCS5xdWFkCTB4OTgzZTUxNTJlZTY2ZGZhYiwweGE4MzFjNjZkMmRiNDMyMTAKKwkucXVhZAkweGIwMDMyN2M4OThmYjIxM2YsMHhiZjU5N2ZjN2JlZWYwZWU0CisJLnF1YWQJMHhjNmUwMGJmMzNkYTg4ZmMyLDB4ZDVhNzkxNDc5MzBhYTcyNQorCS5xdWFkCTB4MDZjYTYzNTFlMDAzODI2ZiwweDE0MjkyOTY3MGEwZTZlNzAKKwkucXVhZAkweDI3YjcwYTg1NDZkMjJmZmMsMHgyZTFiMjEzODVjMjZjOTI2CisJLnF1YWQJMHg0ZDJjNmRmYzVhYzQyYWVkLDB4NTMzODBkMTM5ZDk1YjNkZgorCS5xdWFkCTB4NjUwYTczNTQ4YmFmNjNkZSwweDc2NmEwYWJiM2M3N2IyYTgKKwkucXVhZAkweDgxYzJjOTJlNDdlZGFlZTYsMHg5MjcyMmM4NTE0ODIzNTNiCisJLnF1YWQJMHhhMmJmZThhMTRjZjEwMzY0LDB4YTgxYTY2NGJiYzQyMzAwMQorCS5xdWFkCTB4YzI0YjhiNzBkMGY4OTc5MSwweGM3NmM1MWEzMDY1NGJlMzAKKwkucXVhZAkweGQxOTJlODE5ZDZlZjUyMTgsMHhkNjk5MDYyNDU1NjVhOTEwCisJLnF1YWQJMHhmNDBlMzU4NTU3NzEyMDJhLDB4MTA2YWEwNzAzMmJiZDFiOAorCS5xdWFkCTB4MTlhNGMxMTZiOGQyZDBjOCwweDFlMzc2YzA4NTE0MWFiNTMKKwkucXVhZAkweDI3NDg3NzRjZGY4ZWViOTksMHgzNGIwYmNiNWUxOWI0OGE4CisJLnF1YWQJMHgzOTFjMGNiM2M1Yzk1YTYzLDB4NGVkOGFhNGFlMzQxOGFjYgorCS5xdWFkCTB4NWI5Y2NhNGY3NzYzZTM3MywweDY4MmU2ZmYzZDZiMmI4YTMKKwkucXVhZAkweDc0OGY4MmVlNWRlZmIyZmMsMHg3OGE1NjM2ZjQzMTcyZjYwCisJLnF1YWQJMHg4NGM4NzgxNGExZjBhYjcyLDB4OGNjNzAyMDgxYTY0MzllYworCS5xdWFkCTB4OTBiZWZmZmEyMzYzMWUyOCwweGE0NTA2Y2ViZGU4MmJkZTkKKwkucXVhZAkweGJlZjlhM2Y3YjJjNjc5MTUsMHhjNjcxNzhmMmUzNzI1MzJiCisJLnF1YWQJMHhjYTI3M2VjZWVhMjY2MTljLDB4ZDE4NmI4YzcyMWMwYzIwNworCS5xdWFkCTB4ZWFkYTdkZDZjZGUwZWIxZSwweGY1N2Q0ZjdmZWU2ZWQxNzgKKwkucXVhZAkweDA2ZjA2N2FhNzIxNzZmYmEsMHgwYTYzN2RjNWEyYzg5OGE2CisJLnF1YWQJMHgxMTNmOTgwNGJlZjkwZGFlLDB4MWI3MTBiMzUxMzFjNDcxYgorCS5xdWFkCTB4MjhkYjc3ZjUyMzA0N2Q4NCwweDMyY2FhYjdiNDBjNzI0OTMKKwkucXVhZAkweDNjOWViZTBhMTVjOWJlYmMsMHg0MzFkNjdjNDljMTAwZDRjCisJLnF1YWQJMHg0Y2M1ZDRiZWNiM2U0MmI2LDB4NTk3ZjI5OWNmYzY1N2UyYQorCS5xdWFkCTB4NWZjYjZmYWIzYWQ2ZmFlYywweDZjNDQxOThjNGE0NzU4MTcKK19fXworfQorCisjIEVYQ0VQVElPTl9ESVNQT1NJVElPTiBoYW5kbGVyIChFWENFUFRJT05fUkVDT1JEICpyZWMsVUxPTkc2NCBmcmFtZSwKKyMJCUNPTlRFWFQgKmNvbnRleHQsRElTUEFUQ0hFUl9DT05URVhUICpkaXNwKQoraWYgKCR3aW42NCkgeworJHJlYz0iJXJjeCI7CiskZnJhbWU9IiVyZHgiOworJGNvbnRleHQ9IiVyOCI7CiskZGlzcD0iJXI5IjsKKworJGNvZGUuPTw8X19fOworLmV4dGVybglfX2ltcF9SdGxWaXJ0dWFsVW53aW5kCisudHlwZQlzZV9oYW5kbGVyLFxAYWJpLW9tbmlwb3RlbnQKKy5hbGlnbgkxNgorc2VfaGFuZGxlcjoKKwlwdXNoCSVyc2kKKwlwdXNoCSVyZGkKKwlwdXNoCSVyYngKKwlwdXNoCSVyYnAKKwlwdXNoCSVyMTIKKwlwdXNoCSVyMTMKKwlwdXNoCSVyMTQKKwlwdXNoCSVyMTUKKwlwdXNoZnEKKwlzdWIJXCQ2NCwlcnNwCisKKwltb3YJMTIwKCRjb250ZXh0KSwlcmF4CSMgcHVsbCBjb250ZXh0LT5SYXgKKwltb3YJMjQ4KCRjb250ZXh0KSwlcmJ4CSMgcHVsbCBjb250ZXh0LT5SaXAKKworCWxlYQkuTHByb2xvZ3VlKCVyaXApLCVyMTAKKwljbXAJJXIxMCwlcmJ4CQkjIGNvbnRleHQtPlJpcDwuTHByb2xvZ3VlCisJamIJLkxpbl9wcm9sb2d1ZQorCisJbW92CTE1MigkY29udGV4dCksJXJheAkjIHB1bGwgY29udGV4dC0+UnNwCisKKwlsZWEJLkxlcGlsb2d1ZSglcmlwKSwlcjEwCisJY21wCSVyMTAsJXJieAkJIyBjb250ZXh0LT5SaXA+PS5MZXBpbG9ndWUKKwlqYWUJLkxpbl9wcm9sb2d1ZQorCisJbW92CTE2KiRTWiszKjgoJXJheCksJXJheAkjIHB1bGwgJF9yc3AKKwlsZWEJNDgoJXJheCksJXJheAorCisJbW92CS04KCVyYXgpLCVyYngKKwltb3YJLTE2KCVyYXgpLCVyYnAKKwltb3YJLTI0KCVyYXgpLCVyMTIKKwltb3YJLTMyKCVyYXgpLCVyMTMKKwltb3YJLTQwKCVyYXgpLCVyMTQKKwltb3YJLTQ4KCVyYXgpLCVyMTUKKwltb3YJJXJieCwxNDQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYngKKwltb3YJJXJicCwxNjAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SYnAKKwltb3YJJXIxMiwyMTYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTIKKwltb3YJJXIxMywyMjQoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTMKKwltb3YJJXIxNCwyMzIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTQKKwltb3YJJXIxNSwyNDAoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SMTUKKworLkxpbl9wcm9sb2d1ZToKKwltb3YJOCglcmF4KSwlcmRpCisJbW92CTE2KCVyYXgpLCVyc2kKKwltb3YJJXJheCwxNTIoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc3AKKwltb3YJJXJzaSwxNjgoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5Sc2kKKwltb3YJJXJkaSwxNzYoJGNvbnRleHQpCSMgcmVzdG9yZSBjb250ZXh0LT5SZGkKKworCW1vdgk0MCgkZGlzcCksJXJkaQkJIyBkaXNwLT5Db250ZXh0UmVjb3JkCisJbW92CSRjb250ZXh0LCVyc2kJCSMgY29udGV4dAorCW1vdglcJDE1NCwlZWN4CQkjIHNpemVvZihDT05URVhUKQorCS5sb25nCTB4YTU0OGYzZmMJCSMgY2xkOyByZXAgbW92c3EKKworCW1vdgkkZGlzcCwlcnNpCisJeG9yCSVyY3gsJXJjeAkJIyBhcmcxLCBVTldfRkxBR19OSEFORExFUgorCW1vdgk4KCVyc2kpLCVyZHgJCSMgYXJnMiwgZGlzcC0+SW1hZ2VCYXNlCisJbW92CTAoJXJzaSksJXI4CQkjIGFyZzMsIGRpc3AtPkNvbnRyb2xQYworCW1vdgkxNiglcnNpKSwlcjkJCSMgYXJnNCwgZGlzcC0+RnVuY3Rpb25FbnRyeQorCW1vdgk0MCglcnNpKSwlcjEwCQkjIGRpc3AtPkNvbnRleHRSZWNvcmQKKwlsZWEJNTYoJXJzaSksJXIxMQkJIyAmZGlzcC0+SGFuZGxlckRhdGEKKwlsZWEJMjQoJXJzaSksJXIxMgkJIyAmZGlzcC0+RXN0YWJsaXNoZXJGcmFtZQorCW1vdgklcjEwLDMyKCVyc3ApCQkjIGFyZzUKKwltb3YJJXIxMSw0MCglcnNwKQkJIyBhcmc2CisJbW92CSVyMTIsNDgoJXJzcCkJCSMgYXJnNworCW1vdgklcmN4LDU2KCVyc3ApCQkjIGFyZzgsIChOVUxMKQorCWNhbGwJKl9faW1wX1J0bFZpcnR1YWxVbndpbmQoJXJpcCkKKworCW1vdglcJDEsJWVheAkJIyBFeGNlcHRpb25Db250aW51ZVNlYXJjaAorCWFkZAlcJDY0LCVyc3AKKwlwb3BmcQorCXBvcAklcjE1CisJcG9wCSVyMTQKKwlwb3AJJXIxMworCXBvcAklcjEyCisJcG9wCSVyYnAKKwlwb3AJJXJieAorCXBvcAklcmRpCisJcG9wCSVyc2kKKwlyZXQKKy5zaXplCXNlX2hhbmRsZXIsLi1zZV9oYW5kbGVyCisKKy5zZWN0aW9uCS5wZGF0YQorLmFsaWduCTQKKwkucnZhCS5MU0VIX2JlZ2luXyRmdW5jCisJLnJ2YQkuTFNFSF9lbmRfJGZ1bmMKKwkucnZhCS5MU0VIX2luZm9fJGZ1bmMKKworLnNlY3Rpb24JLnhkYXRhCisuYWxpZ24JOAorLkxTRUhfaW5mb18kZnVuYzoKKwkuYnl0ZQk5LDAsMCwwCisJLnJ2YQlzZV9oYW5kbGVyCitfX18KK30KKworJGNvZGUgPX4gcy9cYChbXlxgXSopXGAvZXZhbCAkMS9nZW07CitwcmludCAkY29kZTsKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMTI2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYS5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiBjcnlwdG8vc2hhL3NoYS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKyNkZWZpbmUgQlVGU0laRQkxMDI0KjE2CisKK3ZvaWQgZG9fZnAoRklMRSAqZik7Cit2b2lkIHB0KHVuc2lnbmVkIGNoYXIgKm1kKTsKK2ludCByZWFkKGludCwgdm9pZCAqLCB1bnNpZ25lZCBpbnQpOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlpbnQgaSxlcnI9MDsKKwlGSUxFICpJTjsKKworCWlmIChhcmdjID09IDEpCisJCXsKKwkJZG9fZnAoc3RkaW4pOworCQl9CisJZWxzZQorCQl7CisJCWZvciAoaT0xOyBpPGFyZ2M7IGkrKykKKwkJCXsKKwkJCUlOPWZvcGVuKGFyZ3ZbaV0sInIiKTsKKwkJCWlmIChJTiA9PSBOVUxMKQorCQkJCXsKKwkJCQlwZXJyb3IoYXJndltpXSk7CisJCQkJZXJyKys7CisJCQkJY29udGludWU7CisJCQkJfQorCQkJcHJpbnRmKCJTSEEoJXMpPSAiLGFyZ3ZbaV0pOworCQkJZG9fZnAoSU4pOworCQkJZmNsb3NlKElOKTsKKwkJCX0KKwkJfQorCWV4aXQoZXJyKTsKKwl9CisKK3ZvaWQgZG9fZnAoRklMRSAqZikKKwl7CisJU0hBX0NUWCBjOworCXVuc2lnbmVkIGNoYXIgbWRbU0hBX0RJR0VTVF9MRU5HVEhdOworCWludCBmZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltCVUZTSVpFXTsKKworCWZkPWZpbGVubyhmKTsKKwlTSEFfSW5pdCgmYyk7CisJZm9yICg7OykKKwkJeworCQlpPXJlYWQoZmQsYnVmLEJVRlNJWkUpOworCQlpZiAoaSA8PSAwKSBicmVhazsKKwkJU0hBX1VwZGF0ZSgmYyxidWYsKHVuc2lnbmVkIGxvbmcpaSk7CisJCX0KKwlTSEFfRmluYWwoJihtZFswXSksJmMpOworCXB0KG1kKTsKKwl9CisKK3ZvaWQgcHQodW5zaWduZWQgY2hhciAqbWQpCisJeworCWludCBpOworCisJZm9yIChpPTA7IGk8U0hBX0RJR0VTVF9MRU5HVEg7IGkrKykKKwkJcHJpbnRmKCIlMDJ4IixtZFtpXSk7CisJcHJpbnRmKCJcbiIpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGEuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjYWNmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qIGNyeXB0by9zaGEvc2hhLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfU0hBX0gKKyNkZWZpbmUgSEVBREVSX1NIQV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfTk9fU0hBKSB8fCAoZGVmaW5lZChPUEVOU1NMX05PX1NIQTApICYmIGRlZmluZWQoT1BFTlNTTF9OT19TSEExKSkKKyNlcnJvciBTSEEgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9GSVBTKQorI2RlZmluZSBGSVBTX1NIQV9TSVpFX1Qgc2l6ZV90CisjZW5kaWYKKworLyoKKyAqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqICEgU0hBX0xPTkcgaGFzIHRvIGJlIGF0IGxlYXN0IDMyIGJpdHMgd2lkZS4gSWYgaXQncyB3aWRlciwgdGhlbiAhCisgKiAhIFNIQV9MT05HX0xPRzIgaGFzIHRvIGJlIGRlZmluZWQgYWxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgIQorICogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICovCisKKyNpZiBkZWZpbmVkKF9fTFAzMl9fKQorI2RlZmluZSBTSEFfTE9ORyB1bnNpZ25lZCBsb25nCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0NSQVkpIHx8IGRlZmluZWQoX19JTFA2NF9fKQorI2RlZmluZSBTSEFfTE9ORyB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFNIQV9MT05HX0xPRzIgMworI2Vsc2UKKyNkZWZpbmUgU0hBX0xPTkcgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSBTSEFfTEJMT0NLCTE2CisjZGVmaW5lIFNIQV9DQkxPQ0sJKFNIQV9MQkxPQ0sqNCkJLyogU0hBIHRyZWF0cyBpbnB1dCBkYXRhIGFzIGEKKwkJCQkJICogY29udGlndW91cyBhcnJheSBvZiAzMiBiaXQKKwkJCQkJICogd2lkZSBiaWctZW5kaWFuIHZhbHVlcy4gKi8KKyNkZWZpbmUgU0hBX0xBU1RfQkxPQ0sgIChTSEFfQ0JMT0NLLTgpCisjZGVmaW5lIFNIQV9ESUdFU1RfTEVOR1RIIDIwCisKK3R5cGVkZWYgc3RydWN0IFNIQXN0YXRlX3N0CisJeworCVNIQV9MT05HIGgwLGgxLGgyLGgzLGg0OworCVNIQV9MT05HIE5sLE5oOworCVNIQV9MT05HIGRhdGFbU0hBX0xCTE9DS107CisJdW5zaWduZWQgaW50IG51bTsKKwl9IFNIQV9DVFg7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEwCitpbnQgU0hBX0luaXQoU0hBX0NUWCAqYyk7CitpbnQgU0hBX1VwZGF0ZShTSEFfQ1RYICpjLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKK2ludCBTSEFfRmluYWwodW5zaWduZWQgY2hhciAqbWQsIFNIQV9DVFggKmMpOwordW5zaWduZWQgY2hhciAqU0hBKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIHNpemVfdCBuLCB1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIFNIQV9UcmFuc2Zvcm0oU0hBX0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEExCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKmMpOworaW50IFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworaW50IFNIQTFfRmluYWwodW5zaWduZWQgY2hhciAqbWQsIFNIQV9DVFggKmMpOwordW5zaWduZWQgY2hhciAqU0hBMShjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwgdW5zaWduZWQgY2hhciAqbWQpOwordm9pZCBTSEExX1RyYW5zZm9ybShTSEFfQ1RYICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKKyNlbmRpZgorCisjZGVmaW5lIFNIQTI1Nl9DQkxPQ0sJKFNIQV9MQkxPQ0sqNCkJLyogU0hBLTI1NiB0cmVhdHMgaW5wdXQgZGF0YSBhcyBhCisJCQkJCSAqIGNvbnRpZ3VvdXMgYXJyYXkgb2YgMzIgYml0CisJCQkJCSAqIHdpZGUgYmlnLWVuZGlhbiB2YWx1ZXMuICovCisjZGVmaW5lIFNIQTIyNF9ESUdFU1RfTEVOR1RICTI4CisjZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RICTMyCisKK3R5cGVkZWYgc3RydWN0IFNIQTI1NnN0YXRlX3N0CisJeworCVNIQV9MT05HIGhbOF07CisJU0hBX0xPTkcgTmwsTmg7CisJU0hBX0xPTkcgZGF0YVtTSEFfTEJMT0NLXTsKKwl1bnNpZ25lZCBpbnQgbnVtLG1kX2xlbjsKKwl9IFNIQTI1Nl9DVFg7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEyNTYKK2ludCBTSEEyMjRfSW5pdChTSEEyNTZfQ1RYICpjKTsKK2ludCBTSEEyMjRfVXBkYXRlKFNIQTI1Nl9DVFggKmMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworaW50IFNIQTIyNF9GaW5hbCh1bnNpZ25lZCBjaGFyICptZCwgU0hBMjU2X0NUWCAqYyk7Cit1bnNpZ25lZCBjaGFyICpTSEEyMjQoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sdW5zaWduZWQgY2hhciAqbWQpOworaW50IFNIQTI1Nl9Jbml0KFNIQTI1Nl9DVFggKmMpOworaW50IFNIQTI1Nl9VcGRhdGUoU0hBMjU2X0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgU0hBMjU2X0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBTSEEyNTZfQ1RYICpjKTsKK3Vuc2lnbmVkIGNoYXIgKlNIQTI1Nihjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3Qgbix1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIFNIQTI1Nl9UcmFuc2Zvcm0oU0hBMjU2X0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKworI2RlZmluZSBTSEEzODRfRElHRVNUX0xFTkdUSAk0OAorI2RlZmluZSBTSEE1MTJfRElHRVNUX0xFTkdUSAk2NAorCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBNTEyCisvKgorICogVW5saWtlIDMyLWJpdCBkaWdlc3QgYWxnb3JpdGhtcywgU0hBLTUxMiAqcmVsaWVzKiBvbiBTSEFfTE9ORzY0CisgKiBiZWluZyBleGFjdGx5IDY0LWJpdCB3aWRlLiBTZWUgSW1wbGVtZW50YXRpb24gTm90ZXMgaW4gc2hhNTEyLmMKKyAqIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgKi8KKyNkZWZpbmUgU0hBNTEyX0NCTE9DSwkoU0hBX0xCTE9DSyo4KQkvKiBTSEEtNTEyIHRyZWF0cyBpbnB1dCBkYXRhIGFzIGEKKwkJCQkJICogY29udGlndW91cyBhcnJheSBvZiA2NCBiaXQKKwkJCQkJICogd2lkZSBiaWctZW5kaWFuIHZhbHVlcy4gKi8KKyNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KSkgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisjZGVmaW5lIFNIQV9MT05HNjQgdW5zaWduZWQgX19pbnQ2NAorI2RlZmluZSBVNjQoQykgICAgIEMjI1VJNjQKKyNlbGlmIGRlZmluZWQoX19hcmNoNjRfXykKKyNkZWZpbmUgU0hBX0xPTkc2NCB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFU2NChDKSAgICAgQyMjVUwKKyNlbHNlCisjZGVmaW5lIFNIQV9MT05HNjQgdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIFU2NChDKSAgICAgQyMjVUxMCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgU0hBNTEyc3RhdGVfc3QKKwl7CisJU0hBX0xPTkc2NCBoWzhdOworCVNIQV9MT05HNjQgTmwsTmg7CisJdW5pb24geworCQlTSEFfTE9ORzY0CWRbU0hBX0xCTE9DS107CisJCXVuc2lnbmVkIGNoYXIJcFtTSEE1MTJfQ0JMT0NLXTsKKwl9IHU7CisJdW5zaWduZWQgaW50IG51bSxtZF9sZW47CisJfSBTSEE1MTJfQ1RYOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEE1MTIKK2ludCBTSEEzODRfSW5pdChTSEE1MTJfQ1RYICpjKTsKK2ludCBTSEEzODRfVXBkYXRlKFNIQTUxMl9DVFggKmMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworaW50IFNIQTM4NF9GaW5hbCh1bnNpZ25lZCBjaGFyICptZCwgU0hBNTEyX0NUWCAqYyk7Cit1bnNpZ25lZCBjaGFyICpTSEEzODQoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sdW5zaWduZWQgY2hhciAqbWQpOworaW50IFNIQTUxMl9Jbml0KFNIQTUxMl9DVFggKmMpOworaW50IFNIQTUxMl9VcGRhdGUoU0hBNTEyX0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgU0hBNTEyX0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBTSEE1MTJfQ1RYICpjKTsKK3Vuc2lnbmVkIGNoYXIgKlNIQTUxMihjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3Qgbix1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIFNIQTUxMl9UcmFuc2Zvcm0oU0hBNTEyX0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGExLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUwYzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGExLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qIGNyeXB0by9zaGEvc2hhMS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKyNkZWZpbmUgQlVGU0laRQkxMDI0KjE2CisKK3ZvaWQgZG9fZnAoRklMRSAqZik7Cit2b2lkIHB0KHVuc2lnbmVkIGNoYXIgKm1kKTsKKyNpZm5kZWYgX09TRF9QT1NJWAoraW50IHJlYWQoaW50LCB2b2lkICosIHVuc2lnbmVkIGludCk7CisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorCXsKKwlpbnQgaSxlcnI9MDsKKwlGSUxFICpJTjsKKworCWlmIChhcmdjID09IDEpCisJCXsKKwkJZG9fZnAoc3RkaW4pOworCQl9CisJZWxzZQorCQl7CisJCWZvciAoaT0xOyBpPGFyZ2M7IGkrKykKKwkJCXsKKwkJCUlOPWZvcGVuKGFyZ3ZbaV0sInIiKTsKKwkJCWlmIChJTiA9PSBOVUxMKQorCQkJCXsKKwkJCQlwZXJyb3IoYXJndltpXSk7CisJCQkJZXJyKys7CisJCQkJY29udGludWU7CisJCQkJfQorCQkJcHJpbnRmKCJTSEExKCVzKT0gIixhcmd2W2ldKTsKKwkJCWRvX2ZwKElOKTsKKwkJCWZjbG9zZShJTik7CisJCQl9CisJCX0KKwlleGl0KGVycik7CisJfQorCit2b2lkIGRvX2ZwKEZJTEUgKmYpCisJeworCVNIQV9DVFggYzsKKwl1bnNpZ25lZCBjaGFyIG1kW1NIQV9ESUdFU1RfTEVOR1RIXTsKKwlpbnQgZmQ7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciBidWZbQlVGU0laRV07CisKKwlmZD1maWxlbm8oZik7CisJU0hBMV9Jbml0KCZjKTsKKwlmb3IgKDs7KQorCQl7CisJCWk9cmVhZChmZCxidWYsQlVGU0laRSk7CisJCWlmIChpIDw9IDApIGJyZWFrOworCQlTSEExX1VwZGF0ZSgmYyxidWYsKHVuc2lnbmVkIGxvbmcpaSk7CisJCX0KKwlTSEExX0ZpbmFsKCYobWRbMF0pLCZjKTsKKwlwdChtZCk7CisJfQorCit2b2lkIHB0KHVuc2lnbmVkIGNoYXIgKm1kKQorCXsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPFNIQV9ESUdFU1RfTEVOR1RIOyBpKyspCisJCXByaW50ZigiJTAyeCIsbWRbaV0pOworCXByaW50ZigiXG4iKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhMV9vbmUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhMV9vbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzY1YjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGExX29uZS5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIGNyeXB0by9zaGEvc2hhMV9vbmUuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEExCit1bnNpZ25lZCBjaGFyICpTSEExKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIHNpemVfdCBuLCB1bnNpZ25lZCBjaGFyICptZCkKKwl7CisJU0hBX0NUWCBjOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG1bU0hBX0RJR0VTVF9MRU5HVEhdOworCisJaWYgKG1kID09IE5VTEwpIG1kPW07CisJaWYgKCFTSEExX0luaXQoJmMpKQorCQlyZXR1cm4gTlVMTDsKKwlTSEExX1VwZGF0ZSgmYyxkLG4pOworCVNIQTFfRmluYWwobWQsJmMpOworCU9QRU5TU0xfY2xlYW5zZSgmYyxzaXplb2YoYykpOworCXJldHVybihtZCk7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYTFkZ3N0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYTFkZ3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkMTkyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhMWRnc3QuYwpAQCAtMCwwICsxLDc0IEBACisvKiBjcnlwdG8vc2hhL3NoYTFkZ3N0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQTEpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU0hBKQorCisjdW5kZWYgIFNIQV8wCisjZGVmaW5lIFNIQV8xCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisKK2NvbnN0IGNoYXIgU0hBMV92ZXJzaW9uW109IlNIQTEiIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworLyogVGhlIGltcGxlbWVudGF0aW9uIGlzIGluIC4uL21kMzJfY29tbW9uLmggKi8KKworI2luY2x1ZGUgInNoYV9sb2NsLmgiCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYTF0ZXN0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYTF0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlYjM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhMXRlc3QuYwpAQCAtMCwwICsxLDE3OCBAQAorLyogY3J5cHRvL3NoYS9zaGExdGVzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiLi4vZV9vcy5oIgorCisjaWZkZWYgT1BFTlNTTF9OT19TSEEKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcHJpbnRmKCJObyBTSEEgc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworI2luY2x1ZGUgPG9wZW5zc2wvZWJjZGljLmg+CisjZW5kaWYKKworI3VuZGVmIFNIQV8wIC8qIEZJUFMgMTgwICovCisjZGVmaW5lICBTSEFfMSAvKiBGSVBTIDE4MC0xICovCisKK3N0YXRpYyBjaGFyICp0ZXN0W109eworCSJhYmMiLAorCSJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCisJTlVMTCwKKwl9OworCisjaWZkZWYgU0hBXzAKK3N0YXRpYyBjaGFyICpyZXRbXT17CisJIjAxNjRiOGE5MTRjZDJhNWU3NGM0ZjdmZjA4MmM0ZDk3ZjFlZGY4ODAiLAorCSJkMjUxNmVlMWFjZmE1YmFmMzNkZmMxYzQ3MWU0Mzg0NDllZjEzNGM4IiwKKwl9Oworc3RhdGljIGNoYXIgKmJpZ3JldD0KKwkiMzIzMmFmZmE0ODYyOGEyNjY1M2I1YWFhNDQ1NDFmZDkwZDY5MDYwMyI7CisjZW5kaWYKKyNpZmRlZiBTSEFfMQorc3RhdGljIGNoYXIgKnJldFtdPXsKKwkiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIsCisJIjg0OTgzZTQ0MWMzYmQyNmViYWFlNGFhMWY5NTEyOWU1ZTU0NjcwZjEiLAorCX07CitzdGF0aWMgY2hhciAqYmlncmV0PQorCSIzNGFhOTczY2Q0YzRkYWE0ZjYxZWViMmJkYmFkMjczMTY1MzQwMTZmIjsKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqcHQodW5zaWduZWQgY2hhciAqbWQpOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKwl7CisJaW50IGksZXJyPTA7CisJY2hhciAqKlAsKipSOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZlsxMDAwXTsKKwljaGFyICpwLCpyOworCUVWUF9NRF9DVFggYzsKKwl1bnNpZ25lZCBjaGFyIG1kW1NIQV9ESUdFU1RfTEVOR1RIXTsKKworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJZWJjZGljMmFzY2lpKHRlc3RbMF0sIHRlc3RbMF0sIHN0cmxlbih0ZXN0WzBdKSk7CisJZWJjZGljMmFzY2lpKHRlc3RbMV0sIHRlc3RbMV0sIHN0cmxlbih0ZXN0WzFdKSk7CisjZW5kaWYKKworCUVWUF9NRF9DVFhfaW5pdCgmYyk7CisJUD10ZXN0OworCVI9cmV0OworCWk9MTsKKwl3aGlsZSAoKlAgIT0gTlVMTCkKKwkJeworCQlFVlBfRGlnZXN0KCpQLHN0cmxlbigoY2hhciAqKSpQKSxtZCxOVUxMLEVWUF9zaGExKCksIE5VTEwpOworCQlwPXB0KG1kKTsKKwkJaWYgKHN0cmNtcChwLChjaGFyICopKlIpICE9IDApCisJCQl7CisJCQlwcmludGYoImVycm9yIGNhbGN1bGF0aW5nIFNIQTEgb24gJyVzJ1xuIiwqUCk7CisJCQlwcmludGYoImdvdCAlcyBpbnN0ZWFkIG9mICVzXG4iLHAsKlIpOworCQkJZXJyKys7CisJCQl9CisJCWVsc2UKKwkJCXByaW50ZigidGVzdCAlZCBva1xuIixpKTsKKwkJaSsrOworCQlSKys7CisJCVArKzsKKwkJfQorCisJbWVtc2V0KGJ1ZiwnYScsMTAwMCk7CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwllYmNkaWMyYXNjaWkoYnVmLCBidWYsIDEwMDApOworI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLworCUVWUF9EaWdlc3RJbml0X2V4KCZjLEVWUF9zaGExKCksIE5VTEwpOworCWZvciAoaT0wOyBpPDEwMDA7IGkrKykKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmYyxidWYsMTAwMCk7CisJRVZQX0RpZ2VzdEZpbmFsX2V4KCZjLG1kLE5VTEwpOworCXA9cHQobWQpOworCisJcj1iaWdyZXQ7CisJaWYgKHN0cmNtcChwLHIpICE9IDApCisJCXsKKwkJcHJpbnRmKCJlcnJvciBjYWxjdWxhdGluZyBTSEExIG9uICdhJyAqIDEwMDBcbiIpOworCQlwcmludGYoImdvdCAlcyBpbnN0ZWFkIG9mICVzXG4iLHAscik7CisJCWVycisrOworCQl9CisJZWxzZQorCQlwcmludGYoInRlc3QgMyBva1xuIik7CisKKyNpZmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisgICAgaWYgKGVycikgcHJpbnRmKCJFUlJPUjogJWRcbiIsIGVycik7CisjZW5kaWYKKwlFWElUKGVycik7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZjKTsKKwlyZXR1cm4oMCk7CisJfQorCitzdGF0aWMgY2hhciAqcHQodW5zaWduZWQgY2hhciAqbWQpCisJeworCWludCBpOworCXN0YXRpYyBjaGFyIGJ1Zls4MF07CisKKwlmb3IgKGk9MDsgaTxTSEFfRElHRVNUX0xFTkdUSDsgaSsrKQorCQlzcHJpbnRmKCYoYnVmW2kqMl0pLCIlMDJ4IixtZFtpXSk7CisJcmV0dXJuKGJ1Zik7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYTI1Ni5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGEyNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTUyZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGEyNTYuYwpAQCAtMCwwICsxLDI4MiBAQAorLyogY3J5cHRvL3NoYS9zaGEyNTYuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogYWNjb3JkaW5nIHRvIHRoZSBPcGVuU1NMIGxpY2Vuc2UgW2ZvdW5kIGluIC4uLy4uL0xJQ0VOU0VdLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEEyNTYpCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisKK2NvbnN0IGNoYXIgU0hBMjU2X3ZlcnNpb25bXT0iU0hBLTI1NiIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCitpbnQgU0hBMjI0X0luaXQgKFNIQTI1Nl9DVFggKmMpCisJeworCW1lbXNldCAoYywwLHNpemVvZigqYykpOworCWMtPmhbMF09MHhjMTA1OWVkOFVMOwljLT5oWzFdPTB4MzY3Y2Q1MDdVTDsKKwljLT5oWzJdPTB4MzA3MGRkMTdVTDsJYy0+aFszXT0weGY3MGU1OTM5VUw7CisJYy0+aFs0XT0weGZmYzAwYjMxVUw7CWMtPmhbNV09MHg2ODU4MTUxMVVMOworCWMtPmhbNl09MHg2NGY5OGZhN1VMOwljLT5oWzddPTB4YmVmYTRmYTRVTDsKKwljLT5tZF9sZW49U0hBMjI0X0RJR0VTVF9MRU5HVEg7CisJcmV0dXJuIDE7CisJfQorCitpbnQgU0hBMjU2X0luaXQgKFNIQTI1Nl9DVFggKmMpCisJeworCW1lbXNldCAoYywwLHNpemVvZigqYykpOworCWMtPmhbMF09MHg2YTA5ZTY2N1VMOwljLT5oWzFdPTB4YmI2N2FlODVVTDsKKwljLT5oWzJdPTB4M2M2ZWYzNzJVTDsJYy0+aFszXT0weGE1NGZmNTNhVUw7CisJYy0+aFs0XT0weDUxMGU1MjdmVUw7CWMtPmhbNV09MHg5YjA1Njg4Y1VMOworCWMtPmhbNl09MHgxZjgzZDlhYlVMOwljLT5oWzddPTB4NWJlMGNkMTlVTDsKKwljLT5tZF9sZW49U0hBMjU2X0RJR0VTVF9MRU5HVEg7CisJcmV0dXJuIDE7CisJfQorCit1bnNpZ25lZCBjaGFyICpTSEEyMjQoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sIHVuc2lnbmVkIGNoYXIgKm1kKQorCXsKKwlTSEEyNTZfQ1RYIGM7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbVtTSEEyMjRfRElHRVNUX0xFTkdUSF07CisKKwlpZiAobWQgPT0gTlVMTCkgbWQ9bTsKKwlTSEEyMjRfSW5pdCgmYyk7CisJU0hBMjU2X1VwZGF0ZSgmYyxkLG4pOworCVNIQTI1Nl9GaW5hbChtZCwmYyk7CisJT1BFTlNTTF9jbGVhbnNlKCZjLHNpemVvZihjKSk7CisJcmV0dXJuKG1kKTsKKwl9CisKK3Vuc2lnbmVkIGNoYXIgKlNIQTI1Nihjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwgdW5zaWduZWQgY2hhciAqbWQpCisJeworCVNIQTI1Nl9DVFggYzsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKKworCWlmIChtZCA9PSBOVUxMKSBtZD1tOworCVNIQTI1Nl9Jbml0KCZjKTsKKwlTSEEyNTZfVXBkYXRlKCZjLGQsbik7CisJU0hBMjU2X0ZpbmFsKG1kLCZjKTsKKwlPUEVOU1NMX2NsZWFuc2UoJmMsc2l6ZW9mKGMpKTsKKwlyZXR1cm4obWQpOworCX0KKworaW50IFNIQTIyNF9VcGRhdGUoU0hBMjU2X0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sgICByZXR1cm4gU0hBMjU2X1VwZGF0ZSAoYyxkYXRhLGxlbik7ICAgfQoraW50IFNIQTIyNF9GaW5hbCAodW5zaWduZWQgY2hhciAqbWQsIFNIQTI1Nl9DVFggKmMpCit7ICAgcmV0dXJuIFNIQTI1Nl9GaW5hbCAobWQsYyk7ICAgfQorCisjZGVmaW5lCURBVEFfT1JERVJfSVNfQklHX0VORElBTgorCisjZGVmaW5lCUhBU0hfTE9ORwkJU0hBX0xPTkcKKyNkZWZpbmUJSEFTSF9DVFgJCVNIQTI1Nl9DVFgKKyNkZWZpbmUJSEFTSF9DQkxPQ0sJCVNIQV9DQkxPQ0sKKy8qCisgKiBOb3RlIHRoYXQgRklQUzE4MC0yIGRpc2N1c3NlcyAiVHJ1bmNhdGlvbiBvZiB0aGUgSGFzaCBGdW5jdGlvbiBPdXRwdXQuIgorICogZGVmYXVsdDogY2FzZSBiZWxvdyBjb3ZlcnMgZm9yIGl0LiBJdCdzIG5vdCBjbGVhciBob3dldmVyIGlmIGl0J3MKKyAqIHBlcm1pdHRlZCB0byB0cnVuY2F0ZSB0byBhbW91bnQgb2YgYnl0ZXMgbm90IGRpdmlzaWJsZSBieSA0LiBJIGJldCBub3QsCisgKiBidXQgaWYgaXQgaXMsIHRoZW4gZGVmYXVsdDogY2FzZSBzaGFsbCBiZSBleHRlbmRlZC4gRm9yIHJlZmVyZW5jZS4KKyAqIElkZWEgYmVoaW5kIHNlcGFyYXRlIGNhc2VzIGZvciBwcmUtZGVmaW5lZCBsZW5naHRzIGlzIHRvIGxldCB0aGUKKyAqIGNvbXBpbGVyIGRlY2lkZSBpZiBpdCdzIGFwcHJvcHJpYXRlIHRvIHVucm9sbCBzbWFsbCBsb29wcy4KKyAqLworI2RlZmluZQlIQVNIX01BS0VfU1RSSU5HKGMscykJZG8gewlcCisJdW5zaWduZWQgbG9uZyBsbDsJCVwKKwl1bnNpZ25lZCBpbnQgIG5uOwkJXAorCXN3aXRjaCAoKGMpLT5tZF9sZW4pCQlcCisJeyAgIGNhc2UgU0hBMjI0X0RJR0VTVF9MRU5HVEg6CVwKKwkJZm9yIChubj0wO25uPFNIQTIyNF9ESUdFU1RfTEVOR1RILzQ7bm4rKykJXAorCQl7ICAgbGw9KGMpLT5oW25uXTsgSE9TVF9sMmMobGwsKHMpKTsgICB9CVwKKwkJYnJlYWs7CQkJXAorCSAgICBjYXNlIFNIQTI1Nl9ESUdFU1RfTEVOR1RIOglcCisJCWZvciAobm49MDtubjxTSEEyNTZfRElHRVNUX0xFTkdUSC80O25uKyspCVwKKwkJeyAgIGxsPShjKS0+aFtubl07IEhPU1RfbDJjKGxsLChzKSk7ICAgfQlcCisJCWJyZWFrOwkJCVwKKwkgICAgZGVmYXVsdDoJCQlcCisJCWlmICgoYyktPm1kX2xlbiA+IFNIQTI1Nl9ESUdFU1RfTEVOR1RIKQlcCisJCSAgICByZXR1cm4gMDsJCQkJXAorCQlmb3IgKG5uPTA7bm48KGMpLT5tZF9sZW4vNDtubisrKQkJXAorCQl7ICAgbGw9KGMpLT5oW25uXTsgSE9TVF9sMmMobGwsKHMpKTsgICB9CVwKKwkJYnJlYWs7CQkJXAorCX0JCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUJSEFTSF9VUERBVEUJCVNIQTI1Nl9VcGRhdGUKKyNkZWZpbmUJSEFTSF9UUkFOU0ZPUk0JCVNIQTI1Nl9UcmFuc2Zvcm0KKyNkZWZpbmUJSEFTSF9GSU5BTAkJU0hBMjU2X0ZpbmFsCisjZGVmaW5lCUhBU0hfQkxPQ0tfREFUQV9PUkRFUglzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorI2lmbmRlZiBTSEEyNTZfQVNNCitzdGF0aWMKKyNlbmRpZgordm9pZCBzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciAoU0hBMjU2X0NUWCAqY3R4LCBjb25zdCB2b2lkICppbiwgc2l6ZV90IG51bSk7CisKKyNpbmNsdWRlICJtZDMyX2NvbW1vbi5oIgorCisjaWZuZGVmIFNIQTI1Nl9BU00KK3N0YXRpYyBjb25zdCBTSEFfTE9ORyBLMjU2WzY0XSA9IHsKKwkweDQyOGEyZjk4VUwsMHg3MTM3NDQ5MVVMLDB4YjVjMGZiY2ZVTCwweGU5YjVkYmE1VUwsCisJMHgzOTU2YzI1YlVMLDB4NTlmMTExZjFVTCwweDkyM2Y4MmE0VUwsMHhhYjFjNWVkNVVMLAorCTB4ZDgwN2FhOThVTCwweDEyODM1YjAxVUwsMHgyNDMxODViZVVMLDB4NTUwYzdkYzNVTCwKKwkweDcyYmU1ZDc0VUwsMHg4MGRlYjFmZVVMLDB4OWJkYzA2YTdVTCwweGMxOWJmMTc0VUwsCisJMHhlNDliNjljMVVMLDB4ZWZiZTQ3ODZVTCwweDBmYzE5ZGM2VUwsMHgyNDBjYTFjY1VMLAorCTB4MmRlOTJjNmZVTCwweDRhNzQ4NGFhVUwsMHg1Y2IwYTlkY1VMLDB4NzZmOTg4ZGFVTCwKKwkweDk4M2U1MTUyVUwsMHhhODMxYzY2ZFVMLDB4YjAwMzI3YzhVTCwweGJmNTk3ZmM3VUwsCisJMHhjNmUwMGJmM1VMLDB4ZDVhNzkxNDdVTCwweDA2Y2E2MzUxVUwsMHgxNDI5Mjk2N1VMLAorCTB4MjdiNzBhODVVTCwweDJlMWIyMTM4VUwsMHg0ZDJjNmRmY1VMLDB4NTMzODBkMTNVTCwKKwkweDY1MGE3MzU0VUwsMHg3NjZhMGFiYlVMLDB4ODFjMmM5MmVVTCwweDkyNzIyYzg1VUwsCisJMHhhMmJmZThhMVVMLDB4YTgxYTY2NGJVTCwweGMyNGI4YjcwVUwsMHhjNzZjNTFhM1VMLAorCTB4ZDE5MmU4MTlVTCwweGQ2OTkwNjI0VUwsMHhmNDBlMzU4NVVMLDB4MTA2YWEwNzBVTCwKKwkweDE5YTRjMTE2VUwsMHgxZTM3NmMwOFVMLDB4Mjc0ODc3NGNVTCwweDM0YjBiY2I1VUwsCisJMHgzOTFjMGNiM1VMLDB4NGVkOGFhNGFVTCwweDViOWNjYTRmVUwsMHg2ODJlNmZmM1VMLAorCTB4NzQ4ZjgyZWVVTCwweDc4YTU2MzZmVUwsMHg4NGM4NzgxNFVMLDB4OGNjNzAyMDhVTCwKKwkweDkwYmVmZmZhVUwsMHhhNDUwNmNlYlVMLDB4YmVmOWEzZjdVTCwweGM2NzE3OGYyVUwgfTsKKworLyoKKyAqIEZJUFMgc3BlY2lmaWNhdGlvbiByZWZlcnMgdG8gcmlnaHQgcm90YXRpb25zLCB3aGlsZSBvdXIgUk9UQVRFIG1hY3JvCisgKiBpcyBsZWZ0IG9uZS4gVGhpcyBpcyB3aHkgeW91IG1pZ2h0IG5vdGljZSB0aGF0IHJvdGF0aW9uIGNvZWZmaWNpZW50cworICogZGlmZmVyIGZyb20gdGhvc2Ugb2JzZXJ2ZWQgaW4gRklQUyBkb2N1bWVudCBieSAzMi1OLi4uCisgKi8KKyNkZWZpbmUgU2lnbWEwKHgpCShST1RBVEUoKHgpLDMwKSBeIFJPVEFURSgoeCksMTkpIF4gUk9UQVRFKCh4KSwxMCkpCisjZGVmaW5lIFNpZ21hMSh4KQkoUk9UQVRFKCh4KSwyNikgXiBST1RBVEUoKHgpLDIxKSBeIFJPVEFURSgoeCksNykpCisjZGVmaW5lIHNpZ21hMCh4KQkoUk9UQVRFKCh4KSwyNSkgXiBST1RBVEUoKHgpLDE0KSBeICgoeCk+PjMpKQorI2RlZmluZSBzaWdtYTEoeCkJKFJPVEFURSgoeCksMTUpIF4gUk9UQVRFKCh4KSwxMykgXiAoKHgpPj4xMCkpCisKKyNkZWZpbmUgQ2goeCx5LHopCSgoKHgpICYgKHkpKSBeICgofih4KSkgJiAoeikpKQorI2RlZmluZSBNYWooeCx5LHopCSgoKHgpICYgKHkpKSBeICgoeCkgJiAoeikpIF4gKCh5KSAmICh6KSkpCisKKyNpZmRlZiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVAorCitzdGF0aWMgdm9pZCBzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciAoU0hBMjU2X0NUWCAqY3R4LCBjb25zdCB2b2lkICppbiwgc2l6ZV90IG51bSkKKwl7CisJdW5zaWduZWQgTUQzMl9SRUdfVCBhLGIsYyxkLGUsZixnLGgsczAsczEsVDEsVDI7CisJU0hBX0xPTkcJWFsxNl0sbDsKKwlpbnQgaTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhPWluOworCisJCQl3aGlsZSAobnVtLS0pIHsKKworCWEgPSBjdHgtPmhbMF07CWIgPSBjdHgtPmhbMV07CWMgPSBjdHgtPmhbMl07CWQgPSBjdHgtPmhbM107CisJZSA9IGN0eC0+aFs0XTsJZiA9IGN0eC0+aFs1XTsJZyA9IGN0eC0+aFs2XTsJaCA9IGN0eC0+aFs3XTsKKworCWZvciAoaT0wO2k8MTY7aSsrKQorCQl7CisJCUhPU1RfYzJsKGRhdGEsbCk7IFQxID0gWFtpXSA9IGw7CisJCVQxICs9IGggKyBTaWdtYTEoZSkgKyBDaChlLGYsZykgKyBLMjU2W2ldOworCQlUMiA9IFNpZ21hMChhKSArIE1haihhLGIsYyk7CisJCWggPSBnOwlnID0gZjsJZiA9IGU7CWUgPSBkICsgVDE7CisJCWQgPSBjOwljID0gYjsJYiA9IGE7CWEgPSBUMSArIFQyOworCQl9CisKKwlmb3IgKDtpPDY0O2krKykKKwkJeworCQlzMCA9IFhbKGkrMSkmMHgwZl07CXMwID0gc2lnbWEwKHMwKTsKKwkJczEgPSBYWyhpKzE0KSYweDBmXTsJczEgPSBzaWdtYTEoczEpOworCisJCVQxID0gWFtpJjB4Zl0gKz0gczAgKyBzMSArIFhbKGkrOSkmMHhmXTsKKwkJVDEgKz0gaCArIFNpZ21hMShlKSArIENoKGUsZixnKSArIEsyNTZbaV07CisJCVQyID0gU2lnbWEwKGEpICsgTWFqKGEsYixjKTsKKwkJaCA9IGc7CWcgPSBmOwlmID0gZTsJZSA9IGQgKyBUMTsKKwkJZCA9IGM7CWMgPSBiOwliID0gYTsJYSA9IFQxICsgVDI7CisJCX0KKworCWN0eC0+aFswXSArPSBhOwljdHgtPmhbMV0gKz0gYjsJY3R4LT5oWzJdICs9IGM7CWN0eC0+aFszXSArPSBkOworCWN0eC0+aFs0XSArPSBlOwljdHgtPmhbNV0gKz0gZjsJY3R4LT5oWzZdICs9IGc7CWN0eC0+aFs3XSArPSBoOworCisJCQl9Cit9CisKKyNlbHNlCisKKyNkZWZpbmUJUk9VTkRfMDBfMTUoaSxhLGIsYyxkLGUsZixnLGgpCQlkbyB7CVwKKwlUMSArPSBoICsgU2lnbWExKGUpICsgQ2goZSxmLGcpICsgSzI1NltpXTsJXAorCWggPSBTaWdtYTAoYSkgKyBNYWooYSxiLGMpOwkJCVwKKwlkICs9IFQxOwloICs9IFQxOwkJfSB3aGlsZSAoMCkKKworI2RlZmluZQlST1VORF8xNl82MyhpLGEsYixjLGQsZSxmLGcsaCxYKQlkbyB7CVwKKwlzMCA9IFhbKGkrMSkmMHgwZl07CXMwID0gc2lnbWEwKHMwKTsJXAorCXMxID0gWFsoaSsxNCkmMHgwZl07CXMxID0gc2lnbWExKHMxKTsJXAorCVQxID0gWFsoaSkmMHgwZl0gKz0gczAgKyBzMSArIFhbKGkrOSkmMHgwZl07CVwKKwlST1VORF8wMF8xNShpLGEsYixjLGQsZSxmLGcsaCk7CQl9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciAoU0hBMjU2X0NUWCAqY3R4LCBjb25zdCB2b2lkICppbiwgc2l6ZV90IG51bSkKKwl7CisJdW5zaWduZWQgTUQzMl9SRUdfVCBhLGIsYyxkLGUsZixnLGgsczAsczEsVDE7CisJU0hBX0xPTkcJWFsxNl07CisJaW50IGk7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YT1pbjsKKwljb25zdCB1bmlvbiB7IGxvbmcgb25lOyBjaGFyIGxpdHRsZTsgfSBpc19lbmRpYW4gPSB7MX07CisKKwkJCXdoaWxlIChudW0tLSkgeworCisJYSA9IGN0eC0+aFswXTsJYiA9IGN0eC0+aFsxXTsJYyA9IGN0eC0+aFsyXTsJZCA9IGN0eC0+aFszXTsKKwllID0gY3R4LT5oWzRdOwlmID0gY3R4LT5oWzVdOwlnID0gY3R4LT5oWzZdOwloID0gY3R4LT5oWzddOworCisJaWYgKCFpc19lbmRpYW4ubGl0dGxlICYmIHNpemVvZihTSEFfTE9ORyk9PTQgJiYgKChzaXplX3QpaW4lNCk9PTApCisJCXsKKwkJY29uc3QgU0hBX0xPTkcgKlc9KGNvbnN0IFNIQV9MT05HICopZGF0YTsKKworCQlUMSA9IFhbMF0gPSBXWzBdOwlST1VORF8wMF8xNSgwLGEsYixjLGQsZSxmLGcsaCk7CisJCVQxID0gWFsxXSA9IFdbMV07CVJPVU5EXzAwXzE1KDEsaCxhLGIsYyxkLGUsZixnKTsKKwkJVDEgPSBYWzJdID0gV1syXTsJUk9VTkRfMDBfMTUoMixnLGgsYSxiLGMsZCxlLGYpOworCQlUMSA9IFhbM10gPSBXWzNdOwlST1VORF8wMF8xNSgzLGYsZyxoLGEsYixjLGQsZSk7CisJCVQxID0gWFs0XSA9IFdbNF07CVJPVU5EXzAwXzE1KDQsZSxmLGcsaCxhLGIsYyxkKTsKKwkJVDEgPSBYWzVdID0gV1s1XTsJUk9VTkRfMDBfMTUoNSxkLGUsZixnLGgsYSxiLGMpOworCQlUMSA9IFhbNl0gPSBXWzZdOwlST1VORF8wMF8xNSg2LGMsZCxlLGYsZyxoLGEsYik7CisJCVQxID0gWFs3XSA9IFdbN107CVJPVU5EXzAwXzE1KDcsYixjLGQsZSxmLGcsaCxhKTsKKwkJVDEgPSBYWzhdID0gV1s4XTsJUk9VTkRfMDBfMTUoOCxhLGIsYyxkLGUsZixnLGgpOworCQlUMSA9IFhbOV0gPSBXWzldOwlST1VORF8wMF8xNSg5LGgsYSxiLGMsZCxlLGYsZyk7CisJCVQxID0gWFsxMF0gPSBXWzEwXTsJUk9VTkRfMDBfMTUoMTAsZyxoLGEsYixjLGQsZSxmKTsKKwkJVDEgPSBYWzExXSA9IFdbMTFdOwlST1VORF8wMF8xNSgxMSxmLGcsaCxhLGIsYyxkLGUpOworCQlUMSA9IFhbMTJdID0gV1sxMl07CVJPVU5EXzAwXzE1KDEyLGUsZixnLGgsYSxiLGMsZCk7CisJCVQxID0gWFsxM10gPSBXWzEzXTsJUk9VTkRfMDBfMTUoMTMsZCxlLGYsZyxoLGEsYixjKTsKKwkJVDEgPSBYWzE0XSA9IFdbMTRdOwlST1VORF8wMF8xNSgxNCxjLGQsZSxmLGcsaCxhLGIpOworCQlUMSA9IFhbMTVdID0gV1sxNV07CVJPVU5EXzAwXzE1KDE1LGIsYyxkLGUsZixnLGgsYSk7CisKKwkJZGF0YSArPSBTSEEyNTZfQ0JMT0NLOworCQl9CisJZWxzZQorCQl7CisJCVNIQV9MT05HIGw7CisKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzBdID0gbDsgIFJPVU5EXzAwXzE1KDAsYSxiLGMsZCxlLGYsZyxoKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzFdID0gbDsgIFJPVU5EXzAwXzE1KDEsaCxhLGIsYyxkLGUsZixnKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzJdID0gbDsgIFJPVU5EXzAwXzE1KDIsZyxoLGEsYixjLGQsZSxmKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzNdID0gbDsgIFJPVU5EXzAwXzE1KDMsZixnLGgsYSxiLGMsZCxlKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzRdID0gbDsgIFJPVU5EXzAwXzE1KDQsZSxmLGcsaCxhLGIsYyxkKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzVdID0gbDsgIFJPVU5EXzAwXzE1KDUsZCxlLGYsZyxoLGEsYixjKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzZdID0gbDsgIFJPVU5EXzAwXzE1KDYsYyxkLGUsZixnLGgsYSxiKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzddID0gbDsgIFJPVU5EXzAwXzE1KDcsYixjLGQsZSxmLGcsaCxhKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzhdID0gbDsgIFJPVU5EXzAwXzE1KDgsYSxiLGMsZCxlLGYsZyxoKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzldID0gbDsgIFJPVU5EXzAwXzE1KDksaCxhLGIsYyxkLGUsZixnKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzEwXSA9IGw7IFJPVU5EXzAwXzE1KDEwLGcsaCxhLGIsYyxkLGUsZik7CisJCUhPU1RfYzJsKGRhdGEsbCk7IFQxID0gWFsxMV0gPSBsOyBST1VORF8wMF8xNSgxMSxmLGcsaCxhLGIsYyxkLGUpOworCQlIT1NUX2MybChkYXRhLGwpOyBUMSA9IFhbMTJdID0gbDsgUk9VTkRfMDBfMTUoMTIsZSxmLGcsaCxhLGIsYyxkKTsKKwkJSE9TVF9jMmwoZGF0YSxsKTsgVDEgPSBYWzEzXSA9IGw7IFJPVU5EXzAwXzE1KDEzLGQsZSxmLGcsaCxhLGIsYyk7CisJCUhPU1RfYzJsKGRhdGEsbCk7IFQxID0gWFsxNF0gPSBsOyBST1VORF8wMF8xNSgxNCxjLGQsZSxmLGcsaCxhLGIpOworCQlIT1NUX2MybChkYXRhLGwpOyBUMSA9IFhbMTVdID0gbDsgUk9VTkRfMDBfMTUoMTUsYixjLGQsZSxmLGcsaCxhKTsKKwkJfQorCisJZm9yIChpPTE2O2k8NjQ7aSs9OCkKKwkJeworCQlST1VORF8xNl82MyhpKzAsYSxiLGMsZCxlLGYsZyxoLFgpOworCQlST1VORF8xNl82MyhpKzEsaCxhLGIsYyxkLGUsZixnLFgpOworCQlST1VORF8xNl82MyhpKzIsZyxoLGEsYixjLGQsZSxmLFgpOworCQlST1VORF8xNl82MyhpKzMsZixnLGgsYSxiLGMsZCxlLFgpOworCQlST1VORF8xNl82MyhpKzQsZSxmLGcsaCxhLGIsYyxkLFgpOworCQlST1VORF8xNl82MyhpKzUsZCxlLGYsZyxoLGEsYixjLFgpOworCQlST1VORF8xNl82MyhpKzYsYyxkLGUsZixnLGgsYSxiLFgpOworCQlST1VORF8xNl82MyhpKzcsYixjLGQsZSxmLGcsaCxhLFgpOworCQl9CisKKwljdHgtPmhbMF0gKz0gYTsJY3R4LT5oWzFdICs9IGI7CWN0eC0+aFsyXSArPSBjOwljdHgtPmhbM10gKz0gZDsKKwljdHgtPmhbNF0gKz0gZTsJY3R4LT5oWzVdICs9IGY7CWN0eC0+aFs2XSArPSBnOwljdHgtPmhbN10gKz0gaDsKKworCQkJfQorCX0KKworI2VuZGlmCisjZW5kaWYgLyogU0hBMjU2X0FTTSAqLworCisjZW5kaWYgLyogT1BFTlNTTF9OT19TSEEyNTYgKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhMjU2dC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGEyNTZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0YTNiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhMjU2dC5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKiBjcnlwdG8vc2hhL3NoYTI1NnQuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisjaWYgZGVmaW5lZChPUEVOU1NMX05PX1NIQSkgfHwgZGVmaW5lZChPUEVOU1NMX05PX1NIQTI1NikKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgcHJpbnRmKCJObyBTSEEyNTYgc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKwordW5zaWduZWQgY2hhciBhcHBfYjFbU0hBMjU2X0RJR0VTVF9MRU5HVEhdID0geworCTB4YmEsMHg3OCwweDE2LDB4YmYsMHg4ZiwweDAxLDB4Y2YsMHhlYSwKKwkweDQxLDB4NDEsMHg0MCwweGRlLDB4NWQsMHhhZSwweDIyLDB4MjMsCisJMHhiMCwweDAzLDB4NjEsMHhhMywweDk2LDB4MTcsMHg3YSwweDljLAorCTB4YjQsMHgxMCwweGZmLDB4NjEsMHhmMiwweDAwLDB4MTUsMHhhZAl9OworCit1bnNpZ25lZCBjaGFyIGFwcF9iMltTSEEyNTZfRElHRVNUX0xFTkdUSF0gPSB7CisJMHgyNCwweDhkLDB4NmEsMHg2MSwweGQyLDB4MDYsMHgzOCwweGI4LAorCTB4ZTUsMHhjMCwweDI2LDB4OTMsMHgwYywweDNlLDB4NjAsMHgzOSwKKwkweGEzLDB4M2MsMHhlNCwweDU5LDB4NjQsMHhmZiwweDIxLDB4NjcsCisJMHhmNiwweGVjLDB4ZWQsMHhkNCwweDE5LDB4ZGIsMHgwNiwweGMxCX07CisKK3Vuc2lnbmVkIGNoYXIgYXBwX2IzW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXSA9IHsKKwkweGNkLDB4YzcsMHg2ZSwweDVjLDB4OTksMHgxNCwweGZiLDB4OTIsCisJMHg4MSwweGExLDB4YzcsMHhlMiwweDg0LDB4ZDcsMHgzZSwweDY3LAorCTB4ZjEsMHg4MCwweDlhLDB4NDgsMHhhNCwweDk3LDB4MjAsMHgwZSwKKwkweDA0LDB4NmQsMHgzOSwweGNjLDB4YzcsMHgxMSwweDJjLDB4ZDAJfTsKKwordW5zaWduZWQgY2hhciBhZGRlbnVtXzFbU0hBMjI0X0RJR0VTVF9MRU5HVEhdID0geworCTB4MjMsMHgwOSwweDdkLDB4MjIsMHgzNCwweDA1LDB4ZDgsMHgyMiwKKwkweDg2LDB4NDIsMHhhNCwweDc3LDB4YmQsMHhhMiwweDU1LDB4YjMsCisJMHgyYSwweGFkLDB4YmMsMHhlNCwweGJkLDB4YTAsMHhiMywweGY3LAorCTB4ZTMsMHg2YywweDlkLDB4YTcgfTsKKwordW5zaWduZWQgY2hhciBhZGRlbnVtXzJbU0hBMjI0X0RJR0VTVF9MRU5HVEhdID0geworCTB4NzUsMHgzOCwweDhiLDB4MTYsMHg1MSwweDI3LDB4NzYsMHhjYywKKwkweDVkLDB4YmEsMHg1ZCwweGExLDB4ZmQsMHg4OSwweDAxLDB4NTAsCisJMHhiMCwweGM2LDB4NDUsMHg1YywweGI0LDB4ZjUsMHg4YiwweDE5LAorCTB4NTIsMHg1MiwweDI1LDB4MjUgfTsKKwordW5zaWduZWQgY2hhciBhZGRlbnVtXzNbU0hBMjI0X0RJR0VTVF9MRU5HVEhdID0geworCTB4MjAsMHg3OSwweDQ2LDB4NTUsMHg5OCwweDBjLDB4OTEsMHhkOCwKKwkweGJiLDB4YjQsMHhjMSwweGVhLDB4OTcsMHg2MSwweDhhLDB4NGIsCisJMHhmMCwweDNmLDB4NDIsMHg1OCwweDE5LDB4NDgsMHhiMiwweGVlLAorCTB4NGUsMHhlNywweGFkLDB4NjcgfTsKKworaW50IG1haW4gKGludCBhcmdjLGNoYXIgKiphcmd2KQoreyB1bnNpZ25lZCBjaGFyIG1kW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKKyAgaW50CQlpOworICBFVlBfTURfQ1RYCWV2cDsKKworICAgIGZwcmludGYoc3Rkb3V0LCJUZXN0aW5nIFNIQS0yNTYgIik7CisKKyAgICBFVlBfRGlnZXN0ICgiYWJjIiwzLG1kLE5VTEwsRVZQX3NoYTI1NigpLE5VTEwpOworICAgIGlmIChtZW1jbXAobWQsYXBwX2IxLHNpemVvZihhcHBfYjEpKSkKKyAgICB7CWZmbHVzaChzdGRvdXQpOworCWZwcmludGYoc3RkZXJyLCJcblRFU1QgMSBvZiAzIGZhaWxlZC5cbiIpOworCXJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisJZnByaW50ZihzdGRvdXQsIi4iKTsgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBFVlBfRGlnZXN0ICgiYWJjZGJjZGUiImNkZWZkZWZnIiJlZmdoZmdoaSIiZ2hpamhpamsiCisJCSJpamtsamtsbSIia2xtbmxtbm8iIm1ub3Bub3BxIiw1NixtZCxOVUxMLEVWUF9zaGEyNTYoKSxOVUxMKTsKKyAgICBpZiAobWVtY21wKG1kLGFwcF9iMixzaXplb2YoYXBwX2IyKSkpCisgICAgewlmZmx1c2goc3Rkb3V0KTsKKwlmcHJpbnRmKHN0ZGVyciwiXG5URVNUIDIgb2YgMyBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorCWZwcmludGYoc3Rkb3V0LCIuIik7IGZmbHVzaChzdGRvdXQpOworCisgICAgRVZQX01EX0NUWF9pbml0ICgmZXZwKTsKKyAgICBFVlBfRGlnZXN0SW5pdF9leCAoJmV2cCxFVlBfc2hhMjU2KCksTlVMTCk7CisgICAgZm9yIChpPTA7aTwxMDAwMDAwO2krPTE2MCkKKwlFVlBfRGlnZXN0VXBkYXRlICgmZXZwLAkiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiCisJCQkJImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIgorCQkJCSJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIKKwkJCQkiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiCisJCQkJImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIiwKKwkJCQkoMTAwMDAwMC1pKTwxNjA/MTAwMDAwMC1pOjE2MCk7CisgICAgRVZQX0RpZ2VzdEZpbmFsX2V4ICgmZXZwLG1kLE5VTEwpOworICAgIEVWUF9NRF9DVFhfY2xlYW51cCAoJmV2cCk7CisKKyAgICBpZiAobWVtY21wKG1kLGFwcF9iMyxzaXplb2YoYXBwX2IzKSkpCisgICAgewlmZmx1c2goc3Rkb3V0KTsKKwlmcHJpbnRmKHN0ZGVyciwiXG5URVNUIDMgb2YgMyBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorCWZwcmludGYoc3Rkb3V0LCIuIik7IGZmbHVzaChzdGRvdXQpOworCisgICAgZnByaW50ZihzdGRvdXQsIiBwYXNzZWQuXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBmcHJpbnRmKHN0ZG91dCwiVGVzdGluZyBTSEEtMjI0ICIpOworCisgICAgRVZQX0RpZ2VzdCAoImFiYyIsMyxtZCxOVUxMLEVWUF9zaGEyMjQoKSxOVUxMKTsKKyAgICBpZiAobWVtY21wKG1kLGFkZGVudW1fMSxzaXplb2YoYWRkZW51bV8xKSkpCisgICAgewlmZmx1c2goc3Rkb3V0KTsKKwlmcHJpbnRmKHN0ZGVyciwiXG5URVNUIDEgb2YgMyBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorCWZwcmludGYoc3Rkb3V0LCIuIik7IGZmbHVzaChzdGRvdXQpOworCisgICAgRVZQX0RpZ2VzdCAoImFiY2RiY2RlIiJjZGVmZGVmZyIiZWZnaGZnaGkiImdoaWpoaWprIgorCQkiaWprbGprbG0iImtsbW5sbW5vIiJtbm9wbm9wcSIsNTYsbWQsTlVMTCxFVlBfc2hhMjI0KCksTlVMTCk7CisgICAgaWYgKG1lbWNtcChtZCxhZGRlbnVtXzIsc2l6ZW9mKGFkZGVudW1fMikpKQorICAgIHsJZmZsdXNoKHN0ZG91dCk7CisJZnByaW50ZihzdGRlcnIsIlxuVEVTVCAyIG9mIDMgZmFpbGVkLlxuIik7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKwlmcHJpbnRmKHN0ZG91dCwiLiIpOyBmZmx1c2goc3Rkb3V0KTsKKworICAgIEVWUF9NRF9DVFhfaW5pdCAoJmV2cCk7CisgICAgRVZQX0RpZ2VzdEluaXRfZXggKCZldnAsRVZQX3NoYTIyNCgpLE5VTEwpOworICAgIGZvciAoaT0wO2k8MTAwMDAwMDtpKz02NCkKKwlFVlBfRGlnZXN0VXBkYXRlICgmZXZwLAkiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiCisJCQkJImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIiwKKwkJCQkoMTAwMDAwMC1pKTw2ND8xMDAwMDAwLWk6NjQpOworICAgIEVWUF9EaWdlc3RGaW5hbF9leCAoJmV2cCxtZCxOVUxMKTsKKyAgICBFVlBfTURfQ1RYX2NsZWFudXAgKCZldnApOworCisgICAgaWYgKG1lbWNtcChtZCxhZGRlbnVtXzMsc2l6ZW9mKGFkZGVudW1fMykpKQorICAgIHsJZmZsdXNoKHN0ZG91dCk7CisJZnByaW50ZihzdGRlcnIsIlxuVEVTVCAzIG9mIDMgZmFpbGVkLlxuIik7CisJcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKwlmcHJpbnRmKHN0ZG91dCwiLiIpOyBmZmx1c2goc3Rkb3V0KTsKKworICAgIGZwcmludGYoc3Rkb3V0LCIgcGFzc2VkLlxuIik7IGZmbHVzaChzdGRvdXQpOworCisgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYTUxMi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGE1MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmMwZTU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGE1MTIuYwpAQCAtMCwwICsxLDY0MSBAQAorLyogY3J5cHRvL3NoYS9zaGE1MTIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZAorICogYWNjb3JkaW5nIHRvIHRoZSBPcGVuU1NMIGxpY2Vuc2UgW2ZvdW5kIGluIC4uLy4uL0xJQ0VOU0VdLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEE1MTIpCisvKgorICogSU1QTEVNRU5UQVRJT04gTk9URVMuCisgKgorICogQXMgeW91IG1pZ2h0IGhhdmUgbm90aWNlZCAzMi1iaXQgaGFzaCBhbGdvcml0aG1zOgorICoKKyAqIC0gcGVybWl0IFNIQV9MT05HIHRvIGJlIHdpZGVyIHRoYW4gMzItYml0IChjYXNlIG9uIENSQVkpOworICogLSBvcHRpbWl6ZWQgdmVyc2lvbnMgaW1wbGVtZW50IHR3byB0cmFuc2Zvcm0gZnVuY3Rpb25zOiBvbmUgb3BlcmF0aW5nCisgKiAgIG9uIFthbGlnbmVkXSBkYXRhIGluIGhvc3QgYnl0ZSBvcmRlciBhbmQgb25lIC0gb24gZGF0YSBpbiBpbnB1dAorICogICBzdHJlYW0gYnl0ZSBvcmRlcjsKKyAqIC0gc2hhcmUgY29tbW9uIGJ5dGUtb3JkZXIgbmV1dHJhbCBjb2xsZWN0b3IgYW5kIHBhZGRpbmcgZnVuY3Rpb24KKyAqICAgaW1wbGVtZW50YXRpb25zLCAuLi9tZDMyX2NvbW1vbi5oOworICoKKyAqIE5laXRoZXIgb2YgdGhlIGFib3ZlIGFwcGxpZXMgdG8gdGhpcyBTSEEtNTEyIGltcGxlbWVudGF0aW9ucy4gUmVhc29ucworICogW2luIHJldmVyc2Ugb3JkZXJdIGFyZToKKyAqCisgKiAtIGl0J3MgdGhlIG9ubHkgNjQtYml0IGhhc2ggYWxnb3JpdGhtIGZvciB0aGUgbW9tZW50IG9mIHRoaXMgd3JpdGluZywKKyAqICAgdGhlcmUgaXMgbm8gbmVlZCBmb3IgY29tbW9uIGNvbGxlY3Rvci9wYWRkaW5nIGltcGxlbWVudGF0aW9uIFt5ZXRdOworICogLSBieSBzdXBwb3J0aW5nIG9ubHkgb25lIHRyYW5zZm9ybSBmdW5jdGlvbiBbd2hpY2ggb3BlcmF0ZXMgb24KKyAqICAgKmFsaWduZWQqIGRhdGEgaW4gaW5wdXQgc3RyZWFtIGJ5dGUgb3JkZXIsIGJpZy1lbmRpYW4gaW4gdGhpcyBjYXNlXQorICogICB3ZSBtaW5pbWl6ZSBidXJkZW4gb2YgbWFpbnRlbmFuY2UgaW4gdHdvIHdheXM6IGEpIGNvbGxlY3Rvci9wYWRkaW5nCisgKiAgIGZ1bmN0aW9uIGlzIHNpbXBsZXI7IGIpIG9ubHkgb25lIHRyYW5zZm9ybSBmdW5jdGlvbiB0byBzdGFyZSBhdDsKKyAqIC0gU0hBX0xPTkc2NCBpcyByZXF1aXJlZCB0byBiZSBleGFjdGx5IDY0LWJpdCBpbiBvcmRlciB0byBiZSBhYmxlIHRvCisgKiAgIGFwcGx5IGEgbnVtYmVyIG9mIG9wdGltaXphdGlvbnMgdG8gbWl0aWdhdGUgcG90ZW50aWFsIHBlcmZvcm1hbmNlCisgKiAgIHBlbmFsdGllcyBjYXVzZWQgYnkgcHJldmlvdXMgZGVzaWduIGRlY2lzaW9uOworICoKKyAqIENhdmVhdCBsZWN0b3IuCisgKgorICogSW1wbGVtZW50YXRpb24gcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgImxvbmcgbG9uZyIgaXMgNjQtYml0IG9uCisgKiBib3RoIDMyLSBhbmQgNjQtYml0IHBsYXRmb3Jtcy4gSWYgc29tZSBjb21waWxlciB2ZW5kb3IgY29tZXMgdXAKKyAqIHdpdGggMTI4LWJpdCBsb25nIGxvbmcsIGFkanVzdG1lbnQgdG8gc2hhLmggd291bGQgYmUgcmVxdWlyZWQuCisgKiBBcyB0aGlzIGltcGxlbWVudGF0aW9uIHJlbGllcyBvbiA2NC1iaXQgaW50ZWdlciB0eXBlLCBpdCdzIHRvdGFsbHkKKyAqIGluYXBwcm9wcmlhdGUgZm9yIHBsYXRmb3JtcyB3aGljaCBkb24ndCBzdXBwb3J0IGl0LCBtb3N0IG5vdGFibHkKKyAqIDE2LWJpdCBwbGF0Zm9ybXMuCisgKgkJCQkJPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKworY29uc3QgY2hhciBTSEE1MTJfdmVyc2lvbltdPSJTSEEtNTEyIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKKyNpZiBkZWZpbmVkKF9faTM4NikgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSB8fCBcCisgICAgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfTV9BTUQ2NCkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IFwKKyAgICBkZWZpbmVkKF9fczM5MF9fKSB8fCBkZWZpbmVkKF9fczM5MHhfXykgfHwgXAorICAgIGRlZmluZWQoU0hBNTEyX0FTTSkKKyNkZWZpbmUgU0hBNTEyX0JMT0NLX0NBTl9NQU5BR0VfVU5BTElHTkVEX0RBVEEKKyNlbmRpZgorCitpbnQgU0hBMzg0X0luaXQgKFNIQTUxMl9DVFggKmMpCisJeworI2lmIGRlZmluZWQoU0hBNTEyX0FTTSkgJiYgKGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2FybSkpCisJLyogbWFpbnRhaW4gZHdvcmQgb3JkZXIgcmVxdWlyZWQgYnkgYXNzZW1ibGVyIG1vZHVsZSAqLworCXVuc2lnbmVkIGludCAqaCA9ICh1bnNpZ25lZCBpbnQgKiljLT5oOworCisJaFswXSAgPSAweGNiYmI5ZDVkOyBoWzFdICA9IDB4YzEwNTllZDg7CisJaFsyXSAgPSAweDYyOWEyOTJhOyBoWzNdICA9IDB4MzY3Y2Q1MDc7CisJaFs0XSAgPSAweDkxNTkwMTVhOyBoWzVdICA9IDB4MzA3MGRkMTc7CisJaFs2XSAgPSAweDE1MmZlY2Q4OyBoWzddICA9IDB4ZjcwZTU5Mzk7CisJaFs4XSAgPSAweDY3MzMyNjY3OyBoWzldICA9IDB4ZmZjMDBiMzE7CisJaFsxMF0gPSAweDhlYjQ0YTg3OyBoWzExXSA9IDB4Njg1ODE1MTE7CisJaFsxMl0gPSAweGRiMGMyZTBkOyBoWzEzXSA9IDB4NjRmOThmYTc7CisJaFsxNF0gPSAweDQ3YjU0ODFkOyBoWzE1XSA9IDB4YmVmYTRmYTQ7CisjZWxzZQorCWMtPmhbMF09VTY0KDB4Y2JiYjlkNWRjMTA1OWVkOCk7CisJYy0+aFsxXT1VNjQoMHg2MjlhMjkyYTM2N2NkNTA3KTsKKwljLT5oWzJdPVU2NCgweDkxNTkwMTVhMzA3MGRkMTcpOworCWMtPmhbM109VTY0KDB4MTUyZmVjZDhmNzBlNTkzOSk7CisJYy0+aFs0XT1VNjQoMHg2NzMzMjY2N2ZmYzAwYjMxKTsKKwljLT5oWzVdPVU2NCgweDhlYjQ0YTg3Njg1ODE1MTEpOworCWMtPmhbNl09VTY0KDB4ZGIwYzJlMGQ2NGY5OGZhNyk7CisJYy0+aFs3XT1VNjQoMHg0N2I1NDgxZGJlZmE0ZmE0KTsKKyNlbmRpZgorICAgICAgICBjLT5ObD0wOyAgICAgICAgYy0+Tmg9MDsKKyAgICAgICAgYy0+bnVtPTA7ICAgICAgIGMtPm1kX2xlbj1TSEEzODRfRElHRVNUX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIDE7CisJfQorCitpbnQgU0hBNTEyX0luaXQgKFNIQTUxMl9DVFggKmMpCisJeworI2lmIGRlZmluZWQoU0hBNTEyX0FTTSkgJiYgKGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2FybSkpCisJLyogbWFpbnRhaW4gZHdvcmQgb3JkZXIgcmVxdWlyZWQgYnkgYXNzZW1ibGVyIG1vZHVsZSAqLworCXVuc2lnbmVkIGludCAqaCA9ICh1bnNpZ25lZCBpbnQgKiljLT5oOworCisJaFswXSAgPSAweDZhMDllNjY3OyBoWzFdICA9IDB4ZjNiY2M5MDg7CisJaFsyXSAgPSAweGJiNjdhZTg1OyBoWzNdICA9IDB4ODRjYWE3M2I7CisJaFs0XSAgPSAweDNjNmVmMzcyOyBoWzVdICA9IDB4ZmU5NGY4MmI7CisJaFs2XSAgPSAweGE1NGZmNTNhOyBoWzddICA9IDB4NWYxZDM2ZjE7CisJaFs4XSAgPSAweDUxMGU1MjdmOyBoWzldICA9IDB4YWRlNjgyZDE7CisJaFsxMF0gPSAweDliMDU2ODhjOyBoWzExXSA9IDB4MmIzZTZjMWY7CisJaFsxMl0gPSAweDFmODNkOWFiOyBoWzEzXSA9IDB4ZmI0MWJkNmI7CisJaFsxNF0gPSAweDViZTBjZDE5OyBoWzE1XSA9IDB4MTM3ZTIxNzk7CisjZWxzZQorCWMtPmhbMF09VTY0KDB4NmEwOWU2NjdmM2JjYzkwOCk7CisJYy0+aFsxXT1VNjQoMHhiYjY3YWU4NTg0Y2FhNzNiKTsKKwljLT5oWzJdPVU2NCgweDNjNmVmMzcyZmU5NGY4MmIpOworCWMtPmhbM109VTY0KDB4YTU0ZmY1M2E1ZjFkMzZmMSk7CisJYy0+aFs0XT1VNjQoMHg1MTBlNTI3ZmFkZTY4MmQxKTsKKwljLT5oWzVdPVU2NCgweDliMDU2ODhjMmIzZTZjMWYpOworCWMtPmhbNl09VTY0KDB4MWY4M2Q5YWJmYjQxYmQ2Yik7CisJYy0+aFs3XT1VNjQoMHg1YmUwY2QxOTEzN2UyMTc5KTsKKyNlbmRpZgorICAgICAgICBjLT5ObD0wOyAgICAgICAgYy0+Tmg9MDsKKyAgICAgICAgYy0+bnVtPTA7ICAgICAgIGMtPm1kX2xlbj1TSEE1MTJfRElHRVNUX0xFTkdUSDsKKyAgICAgICAgcmV0dXJuIDE7CisJfQorCisjaWZuZGVmIFNIQTUxMl9BU00KK3N0YXRpYworI2VuZGlmCit2b2lkIHNoYTUxMl9ibG9ja19kYXRhX29yZGVyIChTSEE1MTJfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgbnVtKTsKKworaW50IFNIQTUxMl9GaW5hbCAodW5zaWduZWQgY2hhciAqbWQsIFNIQTUxMl9DVFggKmMpCisJeworCXVuc2lnbmVkIGNoYXIgKnA9KHVuc2lnbmVkIGNoYXIgKiljLT51LnA7CisJc2l6ZV90IG49Yy0+bnVtOworCisJcFtuXT0weDgwOwkvKiBUaGVyZSBhbHdheXMgaXMgYSByb29tIGZvciBvbmUgKi8KKwluKys7CisJaWYgKG4gPiAoc2l6ZW9mKGMtPnUpLTE2KSkKKwkJbWVtc2V0IChwK24sMCxzaXplb2YoYy0+dSktbiksIG49MCwKKwkJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIgKGMscCwxKTsKKworCW1lbXNldCAocCtuLDAsc2l6ZW9mKGMtPnUpLTE2LW4pOworI2lmZGVmCUJfRU5ESUFOCisJYy0+dS5kW1NIQV9MQkxPQ0stMl0gPSBjLT5OaDsKKwljLT51LmRbU0hBX0xCTE9DSy0xXSA9IGMtPk5sOworI2Vsc2UKKwlwW3NpemVvZihjLT51KS0xXSAgPSAodW5zaWduZWQgY2hhcikoYy0+TmwpOworCXBbc2l6ZW9mKGMtPnUpLTJdICA9ICh1bnNpZ25lZCBjaGFyKShjLT5ObD4+OCk7CisJcFtzaXplb2YoYy0+dSktM10gID0gKHVuc2lnbmVkIGNoYXIpKGMtPk5sPj4xNik7CisJcFtzaXplb2YoYy0+dSktNF0gID0gKHVuc2lnbmVkIGNoYXIpKGMtPk5sPj4yNCk7CisJcFtzaXplb2YoYy0+dSktNV0gID0gKHVuc2lnbmVkIGNoYXIpKGMtPk5sPj4zMik7CisJcFtzaXplb2YoYy0+dSktNl0gID0gKHVuc2lnbmVkIGNoYXIpKGMtPk5sPj40MCk7CisJcFtzaXplb2YoYy0+dSktN10gID0gKHVuc2lnbmVkIGNoYXIpKGMtPk5sPj40OCk7CisJcFtzaXplb2YoYy0+dSktOF0gID0gKHVuc2lnbmVkIGNoYXIpKGMtPk5sPj41Nik7CisJcFtzaXplb2YoYy0+dSktOV0gID0gKHVuc2lnbmVkIGNoYXIpKGMtPk5oKTsKKwlwW3NpemVvZihjLT51KS0xMF0gPSAodW5zaWduZWQgY2hhcikoYy0+Tmg+PjgpOworCXBbc2l6ZW9mKGMtPnUpLTExXSA9ICh1bnNpZ25lZCBjaGFyKShjLT5OaD4+MTYpOworCXBbc2l6ZW9mKGMtPnUpLTEyXSA9ICh1bnNpZ25lZCBjaGFyKShjLT5OaD4+MjQpOworCXBbc2l6ZW9mKGMtPnUpLTEzXSA9ICh1bnNpZ25lZCBjaGFyKShjLT5OaD4+MzIpOworCXBbc2l6ZW9mKGMtPnUpLTE0XSA9ICh1bnNpZ25lZCBjaGFyKShjLT5OaD4+NDApOworCXBbc2l6ZW9mKGMtPnUpLTE1XSA9ICh1bnNpZ25lZCBjaGFyKShjLT5OaD4+NDgpOworCXBbc2l6ZW9mKGMtPnUpLTE2XSA9ICh1bnNpZ25lZCBjaGFyKShjLT5OaD4+NTYpOworI2VuZGlmCisKKwlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciAoYyxwLDEpOworCisJaWYgKG1kPT0wKSByZXR1cm4gMDsKKworI2lmIGRlZmluZWQoU0hBNTEyX0FTTSkgJiYgKGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2FybSkpCisJLyogcmVjYWxsIGFzc2VtYmxlciBkd29yZCBvcmRlci4uLiAqLworCW4gPSBjLT5tZF9sZW47CisJaWYgKG4gPT0gU0hBMzg0X0RJR0VTVF9MRU5HVEggfHwgbiA9PSBTSEE1MTJfRElHRVNUX0xFTkdUSCkKKwkJeworCQl1bnNpZ25lZCBpbnQgKmggPSAodW5zaWduZWQgaW50ICopYy0+aCwgdDsKKworCQlmb3IgKG4vPTQ7bjtuLS0pCisJCQl7CisJCQl0ID0gKihoKyspOworCQkJKihtZCsrKSA9ICh1bnNpZ25lZCBjaGFyKSh0Pj4yNCk7CisJCQkqKG1kKyspID0gKHVuc2lnbmVkIGNoYXIpKHQ+PjE2KTsKKwkJCSoobWQrKykgPSAodW5zaWduZWQgY2hhcikodD4+OCk7CisJCQkqKG1kKyspID0gKHVuc2lnbmVkIGNoYXIpKHQpOworCQkJfQorCQl9CisJZWxzZQlyZXR1cm4gMDsKKyNlbHNlCisJc3dpdGNoIChjLT5tZF9sZW4pCisJCXsKKwkJLyogTGV0IGNvbXBpbGVyIGRlY2lkZSBpZiBpdCdzIGFwcHJvcHJpYXRlIHRvIHVucm9sbC4uLiAqLworCQljYXNlIFNIQTM4NF9ESUdFU1RfTEVOR1RIOgorCQkJZm9yIChuPTA7bjxTSEEzODRfRElHRVNUX0xFTkdUSC84O24rKykKKwkJCQl7CisJCQkJU0hBX0xPTkc2NCB0ID0gYy0+aFtuXTsKKworCQkJCSoobWQrKykJPSAodW5zaWduZWQgY2hhcikodD4+NTYpOworCQkJCSoobWQrKykJPSAodW5zaWduZWQgY2hhcikodD4+NDgpOworCQkJCSoobWQrKykJPSAodW5zaWduZWQgY2hhcikodD4+NDApOworCQkJCSoobWQrKykJPSAodW5zaWduZWQgY2hhcikodD4+MzIpOworCQkJCSoobWQrKykJPSAodW5zaWduZWQgY2hhcikodD4+MjQpOworCQkJCSoobWQrKykJPSAodW5zaWduZWQgY2hhcikodD4+MTYpOworCQkJCSoobWQrKykJPSAodW5zaWduZWQgY2hhcikodD4+OCk7CisJCQkJKihtZCsrKQk9ICh1bnNpZ25lZCBjaGFyKSh0KTsKKwkJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTSEE1MTJfRElHRVNUX0xFTkdUSDoKKwkJCWZvciAobj0wO248U0hBNTEyX0RJR0VTVF9MRU5HVEgvODtuKyspCisJCQkJeworCQkJCVNIQV9MT05HNjQgdCA9IGMtPmhbbl07CisKKwkJCQkqKG1kKyspCT0gKHVuc2lnbmVkIGNoYXIpKHQ+PjU2KTsKKwkJCQkqKG1kKyspCT0gKHVuc2lnbmVkIGNoYXIpKHQ+PjQ4KTsKKwkJCQkqKG1kKyspCT0gKHVuc2lnbmVkIGNoYXIpKHQ+PjQwKTsKKwkJCQkqKG1kKyspCT0gKHVuc2lnbmVkIGNoYXIpKHQ+PjMyKTsKKwkJCQkqKG1kKyspCT0gKHVuc2lnbmVkIGNoYXIpKHQ+PjI0KTsKKwkJCQkqKG1kKyspCT0gKHVuc2lnbmVkIGNoYXIpKHQ+PjE2KTsKKwkJCQkqKG1kKyspCT0gKHVuc2lnbmVkIGNoYXIpKHQ+PjgpOworCQkJCSoobWQrKykJPSAodW5zaWduZWQgY2hhcikodCk7CisJCQkJfQorCQkJYnJlYWs7CisJCS8qIC4uLiBhcyB3ZWxsIGFzIG1ha2Ugc3VyZSBtZF9sZW4gaXMgbm90IGFidXNlZC4gKi8KKwkJZGVmYXVsdDoJcmV0dXJuIDA7CisJCX0KKyNlbmRpZgorCXJldHVybiAxOworCX0KKworaW50IFNIQTM4NF9GaW5hbCAodW5zaWduZWQgY2hhciAqbWQsU0hBNTEyX0NUWCAqYykKK3sgICByZXR1cm4gU0hBNTEyX0ZpbmFsIChtZCxjKTsgICB9CisKK2ludCBTSEE1MTJfVXBkYXRlIChTSEE1MTJfQ1RYICpjLCBjb25zdCB2b2lkICpfZGF0YSwgc2l6ZV90IGxlbikKKwl7CisJU0hBX0xPTkc2NAlsOworCXVuc2lnbmVkIGNoYXIgICpwPWMtPnUucDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhPShjb25zdCB1bnNpZ25lZCBjaGFyICopX2RhdGE7CisKKwlpZiAobGVuPT0wKSByZXR1cm4gIDE7CisKKwlsID0gKGMtPk5sKygoKFNIQV9MT05HNjQpbGVuKTw8MykpJlU2NCgweGZmZmZmZmZmZmZmZmZmZmYpOworCWlmIChsIDwgYy0+TmwpCQljLT5OaCsrOworCWlmIChzaXplb2YobGVuKT49OCkJYy0+TmgrPSgoKFNIQV9MT05HNjQpbGVuKT4+NjEpOworCWMtPk5sPWw7CisKKwlpZiAoYy0+bnVtICE9IDApCisJCXsKKwkJc2l6ZV90IG4gPSBzaXplb2YoYy0+dSkgLSBjLT5udW07CisKKwkJaWYgKGxlbiA8IG4pCisJCQl7CisJCQltZW1jcHkgKHArYy0+bnVtLGRhdGEsbGVuKSwgYy0+bnVtICs9ICh1bnNpZ25lZCBpbnQpbGVuOworCQkJcmV0dXJuIDE7CisJCQl9CisJCWVsc2UJeworCQkJbWVtY3B5IChwK2MtPm51bSxkYXRhLG4pLCBjLT5udW0gPSAwOworCQkJbGVuLT1uLCBkYXRhKz1uOworCQkJc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIgKGMscCwxKTsKKwkJCX0KKwkJfQorCisJaWYgKGxlbiA+PSBzaXplb2YoYy0+dSkpCisJCXsKKyNpZm5kZWYgU0hBNTEyX0JMT0NLX0NBTl9NQU5BR0VfVU5BTElHTkVEX0RBVEEKKwkJaWYgKChzaXplX3QpZGF0YSVzaXplb2YoYy0+dS5kWzBdKSAhPSAwKQorCQkJd2hpbGUgKGxlbiA+PSBzaXplb2YoYy0+dSkpCisJCQkJbWVtY3B5IChwLGRhdGEsc2l6ZW9mKGMtPnUpKSwKKwkJCQlzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciAoYyxwLDEpLAorCQkJCWxlbiAgLT0gc2l6ZW9mKGMtPnUpLAorCQkJCWRhdGEgKz0gc2l6ZW9mKGMtPnUpOworCQllbHNlCisjZW5kaWYKKwkJCXNoYTUxMl9ibG9ja19kYXRhX29yZGVyIChjLGRhdGEsbGVuL3NpemVvZihjLT51KSksCisJCQlkYXRhICs9IGxlbiwKKwkJCWxlbiAgJT0gc2l6ZW9mKGMtPnUpLAorCQkJZGF0YSAtPSBsZW47CisJCX0KKworCWlmIChsZW4gIT0gMCkJbWVtY3B5IChwLGRhdGEsbGVuKSwgYy0+bnVtID0gKGludClsZW47CisKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTSEEzODRfVXBkYXRlIChTSEE1MTJfQ1RYICpjLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQoreyAgIHJldHVybiBTSEE1MTJfVXBkYXRlIChjLGRhdGEsbGVuKTsgICB9CisKK3ZvaWQgU0hBNTEyX1RyYW5zZm9ybSAoU0hBNTEyX0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sgICBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciAoYyxkYXRhLDEpOyAgfQorCit1bnNpZ25lZCBjaGFyICpTSEEzODQoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sIHVuc2lnbmVkIGNoYXIgKm1kKQorCXsKKwlTSEE1MTJfQ1RYIGM7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgbVtTSEEzODRfRElHRVNUX0xFTkdUSF07CisKKwlpZiAobWQgPT0gTlVMTCkgbWQ9bTsKKwlTSEEzODRfSW5pdCgmYyk7CisJU0hBNTEyX1VwZGF0ZSgmYyxkLG4pOworCVNIQTUxMl9GaW5hbChtZCwmYyk7CisJT1BFTlNTTF9jbGVhbnNlKCZjLHNpemVvZihjKSk7CisJcmV0dXJuKG1kKTsKKwl9CisKK3Vuc2lnbmVkIGNoYXIgKlNIQTUxMihjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwgdW5zaWduZWQgY2hhciAqbWQpCisJeworCVNIQTUxMl9DVFggYzsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBtW1NIQTUxMl9ESUdFU1RfTEVOR1RIXTsKKworCWlmIChtZCA9PSBOVUxMKSBtZD1tOworCVNIQTUxMl9Jbml0KCZjKTsKKwlTSEE1MTJfVXBkYXRlKCZjLGQsbik7CisJU0hBNTEyX0ZpbmFsKG1kLCZjKTsKKwlPUEVOU1NMX2NsZWFuc2UoJmMsc2l6ZW9mKGMpKTsKKwlyZXR1cm4obWQpOworCX0KKworI2lmbmRlZiBTSEE1MTJfQVNNCitzdGF0aWMgY29uc3QgU0hBX0xPTkc2NCBLNTEyWzgwXSA9IHsKKyAgICAgICAgVTY0KDB4NDI4YTJmOThkNzI4YWUyMiksVTY0KDB4NzEzNzQ0OTEyM2VmNjVjZCksCisgICAgICAgIFU2NCgweGI1YzBmYmNmZWM0ZDNiMmYpLFU2NCgweGU5YjVkYmE1ODE4OWRiYmMpLAorICAgICAgICBVNjQoMHgzOTU2YzI1YmYzNDhiNTM4KSxVNjQoMHg1OWYxMTFmMWI2MDVkMDE5KSwKKyAgICAgICAgVTY0KDB4OTIzZjgyYTRhZjE5NGY5YiksVTY0KDB4YWIxYzVlZDVkYTZkODExOCksCisgICAgICAgIFU2NCgweGQ4MDdhYTk4YTMwMzAyNDIpLFU2NCgweDEyODM1YjAxNDU3MDZmYmUpLAorICAgICAgICBVNjQoMHgyNDMxODViZTRlZTRiMjhjKSxVNjQoMHg1NTBjN2RjM2Q1ZmZiNGUyKSwKKyAgICAgICAgVTY0KDB4NzJiZTVkNzRmMjdiODk2ZiksVTY0KDB4ODBkZWIxZmUzYjE2OTZiMSksCisgICAgICAgIFU2NCgweDliZGMwNmE3MjVjNzEyMzUpLFU2NCgweGMxOWJmMTc0Y2Y2OTI2OTQpLAorICAgICAgICBVNjQoMHhlNDliNjljMTllZjE0YWQyKSxVNjQoMHhlZmJlNDc4NjM4NGYyNWUzKSwKKyAgICAgICAgVTY0KDB4MGZjMTlkYzY4YjhjZDViNSksVTY0KDB4MjQwY2ExY2M3N2FjOWM2NSksCisgICAgICAgIFU2NCgweDJkZTkyYzZmNTkyYjAyNzUpLFU2NCgweDRhNzQ4NGFhNmVhNmU0ODMpLAorICAgICAgICBVNjQoMHg1Y2IwYTlkY2JkNDFmYmQ0KSxVNjQoMHg3NmY5ODhkYTgzMTE1M2I1KSwKKyAgICAgICAgVTY0KDB4OTgzZTUxNTJlZTY2ZGZhYiksVTY0KDB4YTgzMWM2NmQyZGI0MzIxMCksCisgICAgICAgIFU2NCgweGIwMDMyN2M4OThmYjIxM2YpLFU2NCgweGJmNTk3ZmM3YmVlZjBlZTQpLAorICAgICAgICBVNjQoMHhjNmUwMGJmMzNkYTg4ZmMyKSxVNjQoMHhkNWE3OTE0NzkzMGFhNzI1KSwKKyAgICAgICAgVTY0KDB4MDZjYTYzNTFlMDAzODI2ZiksVTY0KDB4MTQyOTI5NjcwYTBlNmU3MCksCisgICAgICAgIFU2NCgweDI3YjcwYTg1NDZkMjJmZmMpLFU2NCgweDJlMWIyMTM4NWMyNmM5MjYpLAorICAgICAgICBVNjQoMHg0ZDJjNmRmYzVhYzQyYWVkKSxVNjQoMHg1MzM4MGQxMzlkOTViM2RmKSwKKyAgICAgICAgVTY0KDB4NjUwYTczNTQ4YmFmNjNkZSksVTY0KDB4NzY2YTBhYmIzYzc3YjJhOCksCisgICAgICAgIFU2NCgweDgxYzJjOTJlNDdlZGFlZTYpLFU2NCgweDkyNzIyYzg1MTQ4MjM1M2IpLAorICAgICAgICBVNjQoMHhhMmJmZThhMTRjZjEwMzY0KSxVNjQoMHhhODFhNjY0YmJjNDIzMDAxKSwKKyAgICAgICAgVTY0KDB4YzI0YjhiNzBkMGY4OTc5MSksVTY0KDB4Yzc2YzUxYTMwNjU0YmUzMCksCisgICAgICAgIFU2NCgweGQxOTJlODE5ZDZlZjUyMTgpLFU2NCgweGQ2OTkwNjI0NTU2NWE5MTApLAorICAgICAgICBVNjQoMHhmNDBlMzU4NTU3NzEyMDJhKSxVNjQoMHgxMDZhYTA3MDMyYmJkMWI4KSwKKyAgICAgICAgVTY0KDB4MTlhNGMxMTZiOGQyZDBjOCksVTY0KDB4MWUzNzZjMDg1MTQxYWI1MyksCisgICAgICAgIFU2NCgweDI3NDg3NzRjZGY4ZWViOTkpLFU2NCgweDM0YjBiY2I1ZTE5YjQ4YTgpLAorICAgICAgICBVNjQoMHgzOTFjMGNiM2M1Yzk1YTYzKSxVNjQoMHg0ZWQ4YWE0YWUzNDE4YWNiKSwKKyAgICAgICAgVTY0KDB4NWI5Y2NhNGY3NzYzZTM3MyksVTY0KDB4NjgyZTZmZjNkNmIyYjhhMyksCisgICAgICAgIFU2NCgweDc0OGY4MmVlNWRlZmIyZmMpLFU2NCgweDc4YTU2MzZmNDMxNzJmNjApLAorICAgICAgICBVNjQoMHg4NGM4NzgxNGExZjBhYjcyKSxVNjQoMHg4Y2M3MDIwODFhNjQzOWVjKSwKKyAgICAgICAgVTY0KDB4OTBiZWZmZmEyMzYzMWUyOCksVTY0KDB4YTQ1MDZjZWJkZTgyYmRlOSksCisgICAgICAgIFU2NCgweGJlZjlhM2Y3YjJjNjc5MTUpLFU2NCgweGM2NzE3OGYyZTM3MjUzMmIpLAorICAgICAgICBVNjQoMHhjYTI3M2VjZWVhMjY2MTljKSxVNjQoMHhkMTg2YjhjNzIxYzBjMjA3KSwKKyAgICAgICAgVTY0KDB4ZWFkYTdkZDZjZGUwZWIxZSksVTY0KDB4ZjU3ZDRmN2ZlZTZlZDE3OCksCisgICAgICAgIFU2NCgweDA2ZjA2N2FhNzIxNzZmYmEpLFU2NCgweDBhNjM3ZGM1YTJjODk4YTYpLAorICAgICAgICBVNjQoMHgxMTNmOTgwNGJlZjkwZGFlKSxVNjQoMHgxYjcxMGIzNTEzMWM0NzFiKSwKKyAgICAgICAgVTY0KDB4MjhkYjc3ZjUyMzA0N2Q4NCksVTY0KDB4MzJjYWFiN2I0MGM3MjQ5MyksCisgICAgICAgIFU2NCgweDNjOWViZTBhMTVjOWJlYmMpLFU2NCgweDQzMWQ2N2M0OWMxMDBkNGMpLAorICAgICAgICBVNjQoMHg0Y2M1ZDRiZWNiM2U0MmI2KSxVNjQoMHg1OTdmMjk5Y2ZjNjU3ZTJhKSwKKyAgICAgICAgVTY0KDB4NWZjYjZmYWIzYWQ2ZmFlYyksVTY0KDB4NmM0NDE5OGM0YTQ3NTgxNykgfTsKKworI2lmbmRlZiBQRURBTlRJQworIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXz49MiAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0FTTSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19JTkxJTkVfQVNNKQorIyAgaWYgZGVmaW5lZChfX3g4Nl82NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorIyAgIGRlZmluZSBST1RSKGEsbikJKHsgU0hBX0xPTkc2NCByZXQ7CQlcCisJCQkJYXNtICgicm9ycSAlMSwlMCIJXAorCQkJCTogIj1yIihyZXQpCQlcCisJCQkJOiAiSiIobiksIjAiKGEpCQlcCisJCQkJOiAiY2MiKTsgcmV0OwkJfSkKKyMgICBpZiAhZGVmaW5lZChCX0VORElBTikKKyMgICAgZGVmaW5lIFBVTEw2NCh4KSAoeyBTSEFfTE9ORzY0IHJldD0qKChjb25zdCBTSEFfTE9ORzY0ICopKCYoeCkpKTsJXAorCQkJCWFzbSAoImJzd2FwcQklMCIJCVwKKwkJCQk6ICI9ciIocmV0KQkJCVwKKwkJCQk6ICIwIihyZXQpKTsgcmV0OwkJfSkKKyMgICBlbmRpZgorIyAgZWxpZiAoZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pKSAmJiAhZGVmaW5lZChCX0VORElBTikKKyMgICBpZiBkZWZpbmVkKEkzODZfT05MWSkKKyMgICAgZGVmaW5lIFBVTEw2NCh4KSAoeyBjb25zdCB1bnNpZ25lZCBpbnQgKnA9KGNvbnN0IHVuc2lnbmVkIGludCAqKSgmKHgpKTtcCisJCQkgdW5zaWduZWQgaW50IGhpPXBbMF0sbG89cFsxXTsJCVwKKwkJCQlhc20oInhjaGdiICUlYWgsJSVhbDt4Y2hnYiAlJWRoLCUlZGw7IlwKKwkJCQkgICAgInJvbGwgJDE2LCUlZWF4OyByb2xsICQxNiwlJWVkeDsgIlwKKwkJCQkgICAgInhjaGdiICUlYWgsJSVhbDt4Y2hnYiAlJWRoLCUlZGw7IiBcCisJCQkJOiAiPWEiKGxvKSwiPWQiKGhpKQkJXAorCQkJCTogIjAiKGxvKSwiMSIoaGkpIDogImNjIik7CVwKKwkJCQkoKFNIQV9MT05HNjQpaGkpPDwzMnxsbzsJfSkKKyMgICBlbHNlCisjICAgIGRlZmluZSBQVUxMNjQoeCkgKHsgY29uc3QgdW5zaWduZWQgaW50ICpwPShjb25zdCB1bnNpZ25lZCBpbnQgKikoJih4KSk7XAorCQkJIHVuc2lnbmVkIGludCBoaT1wWzBdLGxvPXBbMV07CQlcCisJCQkJYXNtICgiYnN3YXBsICUwOyBic3dhcGwgJTE7IglcCisJCQkJOiAiPXIiKGxvKSwiPXIiKGhpKQkJXAorCQkJCTogIjAiKGxvKSwiMSIoaGkpKTsJCVwKKwkJCQkoKFNIQV9MT05HNjQpaGkpPDwzMnxsbzsJfSkKKyMgICBlbmRpZgorIyAgZWxpZiAoZGVmaW5lZChfQVJDSF9QUEMpICYmIGRlZmluZWQoX182NEJJVF9fKSkgfHwgZGVmaW5lZChfQVJDSF9QUEM2NCkKKyMgICBkZWZpbmUgUk9UUihhLG4pCSh7IFNIQV9MT05HNjQgcmV0OwkJXAorCQkJCWFzbSAoInJvdHJkaSAlMCwlMSwlMiIJXAorCQkJCTogIj1yIihyZXQpCQlcCisJCQkJOiAiciIoYSksIksiKG4pKTsgcmV0Owl9KQorIyAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgaWYgZGVmaW5lZChfV0lONjQpCS8qIGFwcGxpZXMgdG8gYm90aCBJQS02NCBhbmQgQU1ENjQgKi8KKyMgICBwcmFnbWEgaW50cmluc2ljKF9yb3RyNjQpCisjICAgZGVmaW5lIFJPVFIoYSxuKQlfcm90cjY0KChhKSxuKQorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoX01fSVg4NikgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19BU00pICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fSU5MSU5FX0FTTSkKKyMgICBpZiBkZWZpbmVkKEkzODZfT05MWSkKKyAgICBzdGF0aWMgU0hBX0xPTkc2NCBfX2Zhc3RjYWxsIF9fcHVsbDY0YmUoY29uc3Qgdm9pZCAqeCkKKyAgICB7CV9hc20JbW92CWVkeCwgW2VjeCArIDBdCisJX2FzbQltb3YJZWF4LCBbZWN4ICsgNF0KKwlfYXNtCXhjaGcJZGgsZGwKKwlfYXNtCXhjaGcJYWgsYWwKKwlfYXNtCXJvbAllZHgsMTYKKwlfYXNtCXJvbAllYXgsMTYKKwlfYXNtCXhjaGcJZGgsZGwKKwlfYXNtCXhjaGcJYWgsYWwKKyAgICB9CisjICAgZWxzZQorICAgIHN0YXRpYyBTSEFfTE9ORzY0IF9fZmFzdGNhbGwgX19wdWxsNjRiZShjb25zdCB2b2lkICp4KQorICAgIHsJX2FzbQltb3YJZWR4LCBbZWN4ICsgMF0KKwlfYXNtCW1vdgllYXgsIFtlY3ggKyA0XQorCV9hc20JYnN3YXAJZWR4CisJX2FzbQlic3dhcAllYXgKKyAgICB9CisjICAgZW5kaWYKKyMgICBkZWZpbmUgUFVMTDY0KHgpIF9fcHVsbDY0YmUoJih4KSkKKyMgICBpZiBfTVNDX1ZFUjw9MTIwMAorIyAgICBwcmFnbWEgaW5saW5lX2RlcHRoKDApCisjICAgZW5kaWYKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBQVUxMNjQKKyNkZWZpbmUgQih4LGopICAgICgoKFNIQV9MT05HNjQpKCooKChjb25zdCB1bnNpZ25lZCBjaGFyICopKCZ4KSkraikpKTw8KCg3LWopKjgpKQorI2RlZmluZSBQVUxMNjQoeCkgKEIoeCwwKXxCKHgsMSl8Qih4LDIpfEIoeCwzKXxCKHgsNCl8Qih4LDUpfEIoeCw2KXxCKHgsNykpCisjZW5kaWYKKworI2lmbmRlZiBST1RSCisjZGVmaW5lIFJPVFIoeCxzKQkoKCh4KT4+cykgfCAoeCk8PCg2NC1zKSkKKyNlbmRpZgorCisjZGVmaW5lIFNpZ21hMCh4KQkoUk9UUigoeCksMjgpIF4gUk9UUigoeCksMzQpIF4gUk9UUigoeCksMzkpKQorI2RlZmluZSBTaWdtYTEoeCkJKFJPVFIoKHgpLDE0KSBeIFJPVFIoKHgpLDE4KSBeIFJPVFIoKHgpLDQxKSkKKyNkZWZpbmUgc2lnbWEwKHgpCShST1RSKCh4KSwxKSAgXiBST1RSKCh4KSw4KSAgXiAoKHgpPj43KSkKKyNkZWZpbmUgc2lnbWExKHgpCShST1RSKCh4KSwxOSkgXiBST1RSKCh4KSw2MSkgXiAoKHgpPj42KSkKKworI2RlZmluZSBDaCh4LHkseikJKCgoeCkgJiAoeSkpIF4gKCh+KHgpKSAmICh6KSkpCisjZGVmaW5lIE1haih4LHkseikJKCgoeCkgJiAoeSkpIF4gKCh4KSAmICh6KSkgXiAoKHkpICYgKHopKSkKKworCisjaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikKKy8qCisgKiBUaGlzIGNvZGUgc2hvdWxkIGdpdmUgYmV0dGVyIHJlc3VsdHMgb24gMzItYml0IENQVSB3aXRoIGxlc3MgdGhhbgorICogfjI0IHJlZ2lzdGVycywgYm90aCBzaXplIGFuZCBwZXJmb3JtYW5jZSB3aXNlLi4uCisgKi8KK3N0YXRpYyB2b2lkIHNoYTUxMl9ibG9ja19kYXRhX29yZGVyIChTSEE1MTJfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmluLCBzaXplX3QgbnVtKQorCXsKKwljb25zdCBTSEFfTE9ORzY0ICpXPWluOworCVNIQV9MT05HNjQJQSxFLFQ7CisJU0hBX0xPTkc2NAlYWzkrODBdLCpGOworCWludCBpOworCisJCQl3aGlsZSAobnVtLS0pIHsKKworCUYgICAgPSBYKzgwOworCUEgICAgPSBjdHgtPmhbMF07CUZbMV0gPSBjdHgtPmhbMV07CisJRlsyXSA9IGN0eC0+aFsyXTsJRlszXSA9IGN0eC0+aFszXTsKKwlFICAgID0gY3R4LT5oWzRdOwlGWzVdID0gY3R4LT5oWzVdOworCUZbNl0gPSBjdHgtPmhbNl07CUZbN10gPSBjdHgtPmhbN107CisKKwlmb3IgKGk9MDtpPDE2O2krKyxGLS0pCisJCXsKKyNpZmRlZiBCX0VORElBTgorCQlUID0gV1tpXTsKKyNlbHNlCisJCVQgPSBQVUxMNjQoV1tpXSk7CisjZW5kaWYKKwkJRlswXSA9IEE7CisJCUZbNF0gPSBFOworCQlGWzhdID0gVDsKKwkJVCAgICs9IEZbN10gKyBTaWdtYTEoRSkgKyBDaChFLEZbNV0sRls2XSkgKyBLNTEyW2ldOworCQlFICAgID0gRlszXSArIFQ7CisJCUEgICAgPSBUICsgU2lnbWEwKEEpICsgTWFqKEEsRlsxXSxGWzJdKTsKKwkJfQorCisJZm9yICg7aTw4MDtpKyssRi0tKQorCQl7CisJCVQgICAgPSBzaWdtYTAoRls4KzE2LTFdKTsKKwkJVCAgICs9IHNpZ21hMShGWzgrMTYtMTRdKTsKKwkJVCAgICs9IEZbOCsxNl0gKyBGWzgrMTYtOV07CisKKwkJRlswXSA9IEE7CisJCUZbNF0gPSBFOworCQlGWzhdID0gVDsKKwkJVCAgICs9IEZbN10gKyBTaWdtYTEoRSkgKyBDaChFLEZbNV0sRls2XSkgKyBLNTEyW2ldOworCQlFICAgID0gRlszXSArIFQ7CisJCUEgICAgPSBUICsgU2lnbWEwKEEpICsgTWFqKEEsRlsxXSxGWzJdKTsKKwkJfQorCisJY3R4LT5oWzBdICs9IEE7CQljdHgtPmhbMV0gKz0gRlsxXTsKKwljdHgtPmhbMl0gKz0gRlsyXTsJY3R4LT5oWzNdICs9IEZbM107CisJY3R4LT5oWzRdICs9IEU7CQljdHgtPmhbNV0gKz0gRls1XTsKKwljdHgtPmhbNl0gKz0gRls2XTsJY3R4LT5oWzddICs9IEZbN107CisKKwkJCVcrPVNIQV9MQkxPQ0s7CisJCQl9CisJfQorCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU01BTExfRk9PVFBSSU5UKQorCitzdGF0aWMgdm9pZCBzaGE1MTJfYmxvY2tfZGF0YV9vcmRlciAoU0hBNTEyX0NUWCAqY3R4LCBjb25zdCB2b2lkICppbiwgc2l6ZV90IG51bSkKKwl7CisJY29uc3QgU0hBX0xPTkc2NCAqVz1pbjsKKwlTSEFfTE9ORzY0CWEsYixjLGQsZSxmLGcsaCxzMCxzMSxUMSxUMjsKKwlTSEFfTE9ORzY0CVhbMTZdOworCWludCBpOworCisJCQl3aGlsZSAobnVtLS0pIHsKKworCWEgPSBjdHgtPmhbMF07CWIgPSBjdHgtPmhbMV07CWMgPSBjdHgtPmhbMl07CWQgPSBjdHgtPmhbM107CisJZSA9IGN0eC0+aFs0XTsJZiA9IGN0eC0+aFs1XTsJZyA9IGN0eC0+aFs2XTsJaCA9IGN0eC0+aFs3XTsKKworCWZvciAoaT0wO2k8MTY7aSsrKQorCQl7CisjaWZkZWYgQl9FTkRJQU4KKwkJVDEgPSBYW2ldID0gV1tpXTsKKyNlbHNlCisJCVQxID0gWFtpXSA9IFBVTEw2NChXW2ldKTsKKyNlbmRpZgorCQlUMSArPSBoICsgU2lnbWExKGUpICsgQ2goZSxmLGcpICsgSzUxMltpXTsKKwkJVDIgPSBTaWdtYTAoYSkgKyBNYWooYSxiLGMpOworCQloID0gZzsJZyA9IGY7CWYgPSBlOwllID0gZCArIFQxOworCQlkID0gYzsJYyA9IGI7CWIgPSBhOwlhID0gVDEgKyBUMjsKKwkJfQorCisJZm9yICg7aTw4MDtpKyspCisJCXsKKwkJczAgPSBYWyhpKzEpJjB4MGZdOwlzMCA9IHNpZ21hMChzMCk7CisJCXMxID0gWFsoaSsxNCkmMHgwZl07CXMxID0gc2lnbWExKHMxKTsKKworCQlUMSA9IFhbaSYweGZdICs9IHMwICsgczEgKyBYWyhpKzkpJjB4Zl07CisJCVQxICs9IGggKyBTaWdtYTEoZSkgKyBDaChlLGYsZykgKyBLNTEyW2ldOworCQlUMiA9IFNpZ21hMChhKSArIE1haihhLGIsYyk7CisJCWggPSBnOwlnID0gZjsJZiA9IGU7CWUgPSBkICsgVDE7CisJCWQgPSBjOwljID0gYjsJYiA9IGE7CWEgPSBUMSArIFQyOworCQl9CisKKwljdHgtPmhbMF0gKz0gYTsJY3R4LT5oWzFdICs9IGI7CWN0eC0+aFsyXSArPSBjOwljdHgtPmhbM10gKz0gZDsKKwljdHgtPmhbNF0gKz0gZTsJY3R4LT5oWzVdICs9IGY7CWN0eC0+aFs2XSArPSBnOwljdHgtPmhbN10gKz0gaDsKKworCQkJVys9U0hBX0xCTE9DSzsKKwkJCX0KKwl9CisKKyNlbHNlCisKKyNkZWZpbmUJUk9VTkRfMDBfMTUoaSxhLGIsYyxkLGUsZixnLGgpCQlkbyB7CVwKKwlUMSArPSBoICsgU2lnbWExKGUpICsgQ2goZSxmLGcpICsgSzUxMltpXTsJXAorCWggPSBTaWdtYTAoYSkgKyBNYWooYSxiLGMpOwkJCVwKKwlkICs9IFQxOwloICs9IFQxOwkJfSB3aGlsZSAoMCkKKworI2RlZmluZQlST1VORF8xNl84MChpLGosYSxiLGMsZCxlLGYsZyxoLFgpCWRvIHsJXAorCXMwID0gWFsoaisxKSYweDBmXTsJczAgPSBzaWdtYTAoczApOwlcCisJczEgPSBYWyhqKzE0KSYweDBmXTsJczEgPSBzaWdtYTEoczEpOwlcCisJVDEgPSBYWyhqKSYweDBmXSArPSBzMCArIHMxICsgWFsoais5KSYweDBmXTsJXAorCVJPVU5EXzAwXzE1KGkraixhLGIsYyxkLGUsZixnLGgpOwkJfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgc2hhNTEyX2Jsb2NrX2RhdGFfb3JkZXIgKFNIQTUxMl9DVFggKmN0eCwgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBudW0pCisJeworCWNvbnN0IFNIQV9MT05HNjQgKlc9aW47CisJU0hBX0xPTkc2NAlhLGIsYyxkLGUsZixnLGgsczAsczEsVDE7CisJU0hBX0xPTkc2NAlYWzE2XTsKKwlpbnQgaTsKKworCQkJd2hpbGUgKG51bS0tKSB7CisKKwlhID0gY3R4LT5oWzBdOwliID0gY3R4LT5oWzFdOwljID0gY3R4LT5oWzJdOwlkID0gY3R4LT5oWzNdOworCWUgPSBjdHgtPmhbNF07CWYgPSBjdHgtPmhbNV07CWcgPSBjdHgtPmhbNl07CWggPSBjdHgtPmhbN107CisKKyNpZmRlZiBCX0VORElBTgorCVQxID0gWFswXSA9IFdbMF07CVJPVU5EXzAwXzE1KDAsYSxiLGMsZCxlLGYsZyxoKTsKKwlUMSA9IFhbMV0gPSBXWzFdOwlST1VORF8wMF8xNSgxLGgsYSxiLGMsZCxlLGYsZyk7CisJVDEgPSBYWzJdID0gV1syXTsJUk9VTkRfMDBfMTUoMixnLGgsYSxiLGMsZCxlLGYpOworCVQxID0gWFszXSA9IFdbM107CVJPVU5EXzAwXzE1KDMsZixnLGgsYSxiLGMsZCxlKTsKKwlUMSA9IFhbNF0gPSBXWzRdOwlST1VORF8wMF8xNSg0LGUsZixnLGgsYSxiLGMsZCk7CisJVDEgPSBYWzVdID0gV1s1XTsJUk9VTkRfMDBfMTUoNSxkLGUsZixnLGgsYSxiLGMpOworCVQxID0gWFs2XSA9IFdbNl07CVJPVU5EXzAwXzE1KDYsYyxkLGUsZixnLGgsYSxiKTsKKwlUMSA9IFhbN10gPSBXWzddOwlST1VORF8wMF8xNSg3LGIsYyxkLGUsZixnLGgsYSk7CisJVDEgPSBYWzhdID0gV1s4XTsJUk9VTkRfMDBfMTUoOCxhLGIsYyxkLGUsZixnLGgpOworCVQxID0gWFs5XSA9IFdbOV07CVJPVU5EXzAwXzE1KDksaCxhLGIsYyxkLGUsZixnKTsKKwlUMSA9IFhbMTBdID0gV1sxMF07CVJPVU5EXzAwXzE1KDEwLGcsaCxhLGIsYyxkLGUsZik7CisJVDEgPSBYWzExXSA9IFdbMTFdOwlST1VORF8wMF8xNSgxMSxmLGcsaCxhLGIsYyxkLGUpOworCVQxID0gWFsxMl0gPSBXWzEyXTsJUk9VTkRfMDBfMTUoMTIsZSxmLGcsaCxhLGIsYyxkKTsKKwlUMSA9IFhbMTNdID0gV1sxM107CVJPVU5EXzAwXzE1KDEzLGQsZSxmLGcsaCxhLGIsYyk7CisJVDEgPSBYWzE0XSA9IFdbMTRdOwlST1VORF8wMF8xNSgxNCxjLGQsZSxmLGcsaCxhLGIpOworCVQxID0gWFsxNV0gPSBXWzE1XTsJUk9VTkRfMDBfMTUoMTUsYixjLGQsZSxmLGcsaCxhKTsKKyNlbHNlCisJVDEgPSBYWzBdICA9IFBVTEw2NChXWzBdKTsJUk9VTkRfMDBfMTUoMCxhLGIsYyxkLGUsZixnLGgpOworCVQxID0gWFsxXSAgPSBQVUxMNjQoV1sxXSk7CVJPVU5EXzAwXzE1KDEsaCxhLGIsYyxkLGUsZixnKTsKKwlUMSA9IFhbMl0gID0gUFVMTDY0KFdbMl0pOwlST1VORF8wMF8xNSgyLGcsaCxhLGIsYyxkLGUsZik7CisJVDEgPSBYWzNdICA9IFBVTEw2NChXWzNdKTsJUk9VTkRfMDBfMTUoMyxmLGcsaCxhLGIsYyxkLGUpOworCVQxID0gWFs0XSAgPSBQVUxMNjQoV1s0XSk7CVJPVU5EXzAwXzE1KDQsZSxmLGcsaCxhLGIsYyxkKTsKKwlUMSA9IFhbNV0gID0gUFVMTDY0KFdbNV0pOwlST1VORF8wMF8xNSg1LGQsZSxmLGcsaCxhLGIsYyk7CisJVDEgPSBYWzZdICA9IFBVTEw2NChXWzZdKTsJUk9VTkRfMDBfMTUoNixjLGQsZSxmLGcsaCxhLGIpOworCVQxID0gWFs3XSAgPSBQVUxMNjQoV1s3XSk7CVJPVU5EXzAwXzE1KDcsYixjLGQsZSxmLGcsaCxhKTsKKwlUMSA9IFhbOF0gID0gUFVMTDY0KFdbOF0pOwlST1VORF8wMF8xNSg4LGEsYixjLGQsZSxmLGcsaCk7CisJVDEgPSBYWzldICA9IFBVTEw2NChXWzldKTsJUk9VTkRfMDBfMTUoOSxoLGEsYixjLGQsZSxmLGcpOworCVQxID0gWFsxMF0gPSBQVUxMNjQoV1sxMF0pOwlST1VORF8wMF8xNSgxMCxnLGgsYSxiLGMsZCxlLGYpOworCVQxID0gWFsxMV0gPSBQVUxMNjQoV1sxMV0pOwlST1VORF8wMF8xNSgxMSxmLGcsaCxhLGIsYyxkLGUpOworCVQxID0gWFsxMl0gPSBQVUxMNjQoV1sxMl0pOwlST1VORF8wMF8xNSgxMixlLGYsZyxoLGEsYixjLGQpOworCVQxID0gWFsxM10gPSBQVUxMNjQoV1sxM10pOwlST1VORF8wMF8xNSgxMyxkLGUsZixnLGgsYSxiLGMpOworCVQxID0gWFsxNF0gPSBQVUxMNjQoV1sxNF0pOwlST1VORF8wMF8xNSgxNCxjLGQsZSxmLGcsaCxhLGIpOworCVQxID0gWFsxNV0gPSBQVUxMNjQoV1sxNV0pOwlST1VORF8wMF8xNSgxNSxiLGMsZCxlLGYsZyxoLGEpOworI2VuZGlmCisKKwlmb3IgKGk9MTY7aTw4MDtpKz0xNikKKwkJeworCQlST1VORF8xNl84MChpLCAwLGEsYixjLGQsZSxmLGcsaCxYKTsKKwkJUk9VTkRfMTZfODAoaSwgMSxoLGEsYixjLGQsZSxmLGcsWCk7CisJCVJPVU5EXzE2XzgwKGksIDIsZyxoLGEsYixjLGQsZSxmLFgpOworCQlST1VORF8xNl84MChpLCAzLGYsZyxoLGEsYixjLGQsZSxYKTsKKwkJUk9VTkRfMTZfODAoaSwgNCxlLGYsZyxoLGEsYixjLGQsWCk7CisJCVJPVU5EXzE2XzgwKGksIDUsZCxlLGYsZyxoLGEsYixjLFgpOworCQlST1VORF8xNl84MChpLCA2LGMsZCxlLGYsZyxoLGEsYixYKTsKKwkJUk9VTkRfMTZfODAoaSwgNyxiLGMsZCxlLGYsZyxoLGEsWCk7CisJCVJPVU5EXzE2XzgwKGksIDgsYSxiLGMsZCxlLGYsZyxoLFgpOworCQlST1VORF8xNl84MChpLCA5LGgsYSxiLGMsZCxlLGYsZyxYKTsKKwkJUk9VTkRfMTZfODAoaSwxMCxnLGgsYSxiLGMsZCxlLGYsWCk7CisJCVJPVU5EXzE2XzgwKGksMTEsZixnLGgsYSxiLGMsZCxlLFgpOworCQlST1VORF8xNl84MChpLDEyLGUsZixnLGgsYSxiLGMsZCxYKTsKKwkJUk9VTkRfMTZfODAoaSwxMyxkLGUsZixnLGgsYSxiLGMsWCk7CisJCVJPVU5EXzE2XzgwKGksMTQsYyxkLGUsZixnLGgsYSxiLFgpOworCQlST1VORF8xNl84MChpLDE1LGIsYyxkLGUsZixnLGgsYSxYKTsKKwkJfQorCisJY3R4LT5oWzBdICs9IGE7CWN0eC0+aFsxXSArPSBiOwljdHgtPmhbMl0gKz0gYzsJY3R4LT5oWzNdICs9IGQ7CisJY3R4LT5oWzRdICs9IGU7CWN0eC0+aFs1XSArPSBmOwljdHgtPmhbNl0gKz0gZzsJY3R4LT5oWzddICs9IGg7CisKKwkJCVcrPVNIQV9MQkxPQ0s7CisJCQl9CisJfQorCisjZW5kaWYKKworI2VuZGlmIC8qIFNIQTUxMl9BU00gKi8KKworI2Vsc2UgLyogIU9QRU5TU0xfTk9fU0hBNTEyICovCisKKyNpZiBkZWZpbmVkKFBFREFOVElDKSB8fCBkZWZpbmVkKF9fREVDQykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19NQUNPU1gpCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworI2VuZGlmCisKKyNlbmRpZiAvKiAhT1BFTlNTTF9OT19TSEE1MTIgKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhNTEydC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGE1MTJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwMDQxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhNTEydC5jCkBAIC0wLDAgKzEsMTg0IEBACisvKiBjcnlwdG8vc2hhL3NoYTUxMnQuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfTk9fU0hBKSB8fCBkZWZpbmVkKE9QRU5TU0xfTk9fU0hBNTEyKQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwcmludGYoIk5vIFNIQTUxMiBzdXBwb3J0XG4iKTsKKyAgICByZXR1cm4oMCk7Cit9CisjZWxzZQorCit1bnNpZ25lZCBjaGFyIGFwcF9jMVtTSEE1MTJfRElHRVNUX0xFTkdUSF0gPSB7CisJMHhkZCwweGFmLDB4MzUsMHhhMSwweDkzLDB4NjEsMHg3YSwweGJhLAorCTB4Y2MsMHg0MSwweDczLDB4NDksMHhhZSwweDIwLDB4NDEsMHgzMSwKKwkweDEyLDB4ZTYsMHhmYSwweDRlLDB4ODksMHhhOSwweDdlLDB4YTIsCisJMHgwYSwweDllLDB4ZWUsMHhlNiwweDRiLDB4NTUsMHhkMywweDlhLAorCTB4MjEsMHg5MiwweDk5LDB4MmEsMHgyNywweDRmLDB4YzEsMHhhOCwKKwkweDM2LDB4YmEsMHgzYywweDIzLDB4YTMsMHhmZSwweGViLDB4YmQsCisJMHg0NSwweDRkLDB4NDQsMHgyMywweDY0LDB4M2MsMHhlOCwweDBlLAorCTB4MmEsMHg5YSwweGM5LDB4NGYsMHhhNSwweDRjLDB4YTQsMHg5ZiB9OworCit1bnNpZ25lZCBjaGFyIGFwcF9jMltTSEE1MTJfRElHRVNUX0xFTkdUSF0gPSB7CisJMHg4ZSwweDk1LDB4OWIsMHg3NSwweGRhLDB4ZTMsMHgxMywweGRhLAorCTB4OGMsMHhmNCwweGY3LDB4MjgsMHgxNCwweGZjLDB4MTQsMHgzZiwKKwkweDhmLDB4NzcsMHg3OSwweGM2LDB4ZWIsMHg5ZiwweDdmLDB4YTEsCisJMHg3MiwweDk5LDB4YWUsMHhhZCwweGI2LDB4ODgsMHg5MCwweDE4LAorCTB4NTAsMHgxZCwweDI4LDB4OWUsMHg0OSwweDAwLDB4ZjcsMHhlNCwKKwkweDMzLDB4MWIsMHg5OSwweGRlLDB4YzQsMHhiNSwweDQzLDB4M2EsCisJMHhjNywweGQzLDB4MjksMHhlZSwweGI2LDB4ZGQsMHgyNiwweDU0LAorCTB4NWUsMHg5NiwweGU1LDB4NWIsMHg4NywweDRiLDB4ZTksMHgwOSB9OworCit1bnNpZ25lZCBjaGFyIGFwcF9jM1tTSEE1MTJfRElHRVNUX0xFTkdUSF0gPSB7CisJMHhlNywweDE4LDB4NDgsMHgzZCwweDBjLDB4ZTcsMHg2OSwweDY0LAorCTB4NGUsMHgyZSwweDQyLDB4YzcsMHhiYywweDE1LDB4YjQsMHg2MywKKwkweDhlLDB4MWYsMHg5OCwweGIxLDB4M2IsMHgyMCwweDQ0LDB4MjgsCisJMHg1NiwweDMyLDB4YTgsMHgwMywweGFmLDB4YTksMHg3MywweGViLAorCTB4ZGUsMHgwZiwweGYyLDB4NDQsMHg4NywweDdlLDB4YTYsMHgwYSwKKwkweDRjLDB4YjAsMHg0MywweDJjLDB4ZTUsMHg3NywweGMzLDB4MWIsCisJMHhlYiwweDAwLDB4OWMsMHg1YywweDJjLDB4NDksMHhhYSwweDJlLAorCTB4NGUsMHhhZCwweGIyLDB4MTcsMHhhZCwweDhjLDB4YzAsMHg5YiB9OworCit1bnNpZ25lZCBjaGFyIGFwcF9kMVtTSEEzODRfRElHRVNUX0xFTkdUSF0gPSB7CisJMHhjYiwweDAwLDB4NzUsMHgzZiwweDQ1LDB4YTMsMHg1ZSwweDhiLAorCTB4YjUsMHhhMCwweDNkLDB4NjksMHg5YSwweGM2LDB4NTAsMHgwNywKKwkweDI3LDB4MmMsMHgzMiwweGFiLDB4MGUsMHhkZSwweGQxLDB4NjMsCisJMHgxYSwweDhiLDB4NjAsMHg1YSwweDQzLDB4ZmYsMHg1YiwweGVkLAorCTB4ODAsMHg4NiwweDA3LDB4MmIsMHhhMSwweGU3LDB4Y2MsMHgyMywKKwkweDU4LDB4YmEsMHhlYywweGExLDB4MzQsMHhjOCwweDI1LDB4YTcgfTsKKwordW5zaWduZWQgY2hhciBhcHBfZDJbU0hBMzg0X0RJR0VTVF9MRU5HVEhdID0geworCTB4MDksMHgzMywweDBjLDB4MzMsMHhmNywweDExLDB4NDcsMHhlOCwKKwkweDNkLDB4MTksMHgyZiwweGM3LDB4ODIsMHhjZCwweDFiLDB4NDcsCisJMHg1MywweDExLDB4MWIsMHgxNywweDNiLDB4M2IsMHgwNSwweGQyLAorCTB4MmYsMHhhMCwweDgwLDB4ODYsMHhlMywweGIwLDB4ZjcsMHgxMiwKKwkweGZjLDB4YzcsMHhjNywweDFhLDB4NTUsMHg3ZSwweDJkLDB4YjksCisJMHg2NiwweGMzLDB4ZTksMHhmYSwweDkxLDB4NzQsMHg2MCwweDM5IH07CisKK3Vuc2lnbmVkIGNoYXIgYXBwX2QzW1NIQTM4NF9ESUdFU1RfTEVOR1RIXSA9IHsKKwkweDlkLDB4MGUsMHgxOCwweDA5LDB4NzEsMHg2NCwweDc0LDB4Y2IsCisJMHgwOCwweDZlLDB4ODMsMHg0ZSwweDMxLDB4MGEsMHg0YSwweDFjLAorCTB4ZWQsMHgxNCwweDllLDB4OWMsMHgwMCwweGYyLDB4NDgsMHg1MiwKKwkweDc5LDB4NzIsMHhjZSwweGM1LDB4NzAsMHg0YywweDJhLDB4NWIsCisJMHgwNywweGI4LDB4YjMsMHhkYywweDM4LDB4ZWMsMHhjNCwweGViLAorCTB4YWUsMHg5NywweGRkLDB4ZDgsMHg3ZiwweDNkLDB4ODksMHg4NSB9OworCitpbnQgbWFpbiAoaW50IGFyZ2MsY2hhciAqKmFyZ3YpCit7IHVuc2lnbmVkIGNoYXIgbWRbU0hBNTEyX0RJR0VTVF9MRU5HVEhdOworICBpbnQJCWk7CisgIEVWUF9NRF9DVFgJZXZwOworCisjaWZkZWYgT1BFTlNTTF9JQTMyX1NTRTIKKyAgICAvKiBBbHRlcm5hdGl2ZSB0byB0aGlzIGlzIHRvIGNhbGwgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMuLi4KKyAgICAgKiBUaGUgYmVsb3cgY29kZSBpcyByZXRhaW5lZCBleGNsdXNpdmVseSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiAqLworICAgIHsgY2hhciAgICAgICplbnY7CisKKwlpZiAoKGVudj1nZXRlbnYoIk9QRU5TU0xfaWEzMmNhcCIpKSkKKwkgICAgT1BFTlNTTF9pYTMyY2FwID0gc3RydG91bCAoZW52LE5VTEwsMCk7CisgICAgfQorI2VuZGlmCisKKyAgICBmcHJpbnRmKHN0ZG91dCwiVGVzdGluZyBTSEEtNTEyICIpOworCisgICAgRVZQX0RpZ2VzdCAoImFiYyIsMyxtZCxOVUxMLEVWUF9zaGE1MTIoKSxOVUxMKTsKKyAgICBpZiAobWVtY21wKG1kLGFwcF9jMSxzaXplb2YoYXBwX2MxKSkpCisgICAgewlmZmx1c2goc3Rkb3V0KTsKKwlmcHJpbnRmKHN0ZGVyciwiXG5URVNUIDEgb2YgMyBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorCWZwcmludGYoc3Rkb3V0LCIuIik7IGZmbHVzaChzdGRvdXQpOworCisgICAgRVZQX0RpZ2VzdCAoImFiY2RlZmdoIiJiY2RlZmdoaSIiY2RlZmdoaWoiImRlZmdoaWprIgorCQkiZWZnaGlqa2wiImZnaGlqa2xtIiJnaGlqa2xtbiIiaGlqa2xtbm8iCisJCSJpamtsbW5vcCIiamtsbW5vcHEiImtsbW5vcHFyIiJsbW5vcHFycyIKKwkJIm1ub3BxcnN0IiJub3BxcnN0dSIsMTEyLG1kLE5VTEwsRVZQX3NoYTUxMigpLE5VTEwpOworICAgIGlmIChtZW1jbXAobWQsYXBwX2MyLHNpemVvZihhcHBfYzIpKSkKKyAgICB7CWZmbHVzaChzdGRvdXQpOworCWZwcmludGYoc3RkZXJyLCJcblRFU1QgMiBvZiAzIGZhaWxlZC5cbiIpOworCXJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisJZnByaW50ZihzdGRvdXQsIi4iKTsgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBFVlBfTURfQ1RYX2luaXQgKCZldnApOworICAgIEVWUF9EaWdlc3RJbml0X2V4ICgmZXZwLEVWUF9zaGE1MTIoKSxOVUxMKTsKKyAgICBmb3IgKGk9MDtpPDEwMDAwMDA7aSs9Mjg4KQorCUVWUF9EaWdlc3RVcGRhdGUgKCZldnAsCSJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIKKwkJCQkiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiCisJCQkJImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIgorCQkJCSJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIKKwkJCQkiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiCisJCQkJImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIgorCQkJCSJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIKKwkJCQkiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiCisJCQkJImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIiwKKwkJCQkoMTAwMDAwMC1pKTwyODg/MTAwMDAwMC1pOjI4OCk7CisgICAgRVZQX0RpZ2VzdEZpbmFsX2V4ICgmZXZwLG1kLE5VTEwpOworICAgIEVWUF9NRF9DVFhfY2xlYW51cCAoJmV2cCk7CisKKyAgICBpZiAobWVtY21wKG1kLGFwcF9jMyxzaXplb2YoYXBwX2MzKSkpCisgICAgewlmZmx1c2goc3Rkb3V0KTsKKwlmcHJpbnRmKHN0ZGVyciwiXG5URVNUIDMgb2YgMyBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorCWZwcmludGYoc3Rkb3V0LCIuIik7IGZmbHVzaChzdGRvdXQpOworCisgICAgZnByaW50ZihzdGRvdXQsIiBwYXNzZWQuXG4iKTsgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBmcHJpbnRmKHN0ZG91dCwiVGVzdGluZyBTSEEtMzg0ICIpOworCisgICAgRVZQX0RpZ2VzdCAoImFiYyIsMyxtZCxOVUxMLEVWUF9zaGEzODQoKSxOVUxMKTsKKyAgICBpZiAobWVtY21wKG1kLGFwcF9kMSxzaXplb2YoYXBwX2QxKSkpCisgICAgewlmZmx1c2goc3Rkb3V0KTsKKwlmcHJpbnRmKHN0ZGVyciwiXG5URVNUIDEgb2YgMyBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorCWZwcmludGYoc3Rkb3V0LCIuIik7IGZmbHVzaChzdGRvdXQpOworCisgICAgRVZQX0RpZ2VzdCAoImFiY2RlZmdoIiJiY2RlZmdoaSIiY2RlZmdoaWoiImRlZmdoaWprIgorCQkiZWZnaGlqa2wiImZnaGlqa2xtIiJnaGlqa2xtbiIiaGlqa2xtbm8iCisJCSJpamtsbW5vcCIiamtsbW5vcHEiImtsbW5vcHFyIiJsbW5vcHFycyIKKwkJIm1ub3BxcnN0IiJub3BxcnN0dSIsMTEyLG1kLE5VTEwsRVZQX3NoYTM4NCgpLE5VTEwpOworICAgIGlmIChtZW1jbXAobWQsYXBwX2QyLHNpemVvZihhcHBfZDIpKSkKKyAgICB7CWZmbHVzaChzdGRvdXQpOworCWZwcmludGYoc3RkZXJyLCJcblRFU1QgMiBvZiAzIGZhaWxlZC5cbiIpOworCXJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisJZnByaW50ZihzdGRvdXQsIi4iKTsgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBFVlBfTURfQ1RYX2luaXQgKCZldnApOworICAgIEVWUF9EaWdlc3RJbml0X2V4ICgmZXZwLEVWUF9zaGEzODQoKSxOVUxMKTsKKyAgICBmb3IgKGk9MDtpPDEwMDAwMDA7aSs9NjQpCisJRVZQX0RpZ2VzdFVwZGF0ZSAoJmV2cCwJImFhYWFhYWFhIiJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIgorCQkJCSJhYWFhYWFhYSIiYWFhYWFhYWEiImFhYWFhYWFhIiJhYWFhYWFhYSIsCisJCQkJKDEwMDAwMDAtaSk8NjQ/MTAwMDAwMC1pOjY0KTsKKyAgICBFVlBfRGlnZXN0RmluYWxfZXggKCZldnAsbWQsTlVMTCk7CisgICAgRVZQX01EX0NUWF9jbGVhbnVwICgmZXZwKTsKKworICAgIGlmIChtZW1jbXAobWQsYXBwX2QzLHNpemVvZihhcHBfZDMpKSkKKyAgICB7CWZmbHVzaChzdGRvdXQpOworCWZwcmludGYoc3RkZXJyLCJcblRFU1QgMyBvZiAzIGZhaWxlZC5cbiIpOworCXJldHVybiAxOworICAgIH0KKyAgICBlbHNlCisJZnByaW50ZihzdGRvdXQsIi4iKTsgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBmcHJpbnRmKHN0ZG91dCwiIHBhc3NlZC5cbiIpOyBmZmx1c2goc3Rkb3V0KTsKKworICByZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGFfZGdzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGFfZGdzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWI1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc2hhL3NoYV9kZ3N0LmMKQEAgLTAsMCArMSw3NCBAQAorLyogY3J5cHRvL3NoYS9zaGExZGdzdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEEwKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NIQSkKKworI3VuZGVmICBTSEFfMQorI2RlZmluZSBTSEFfMAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3Nsdi5oPgorCitjb25zdCBjaGFyIFNIQV92ZXJzaW9uW109IlNIQSIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCisvKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgaW4gLi4vbWQzMl9jb21tb24uaCAqLworCisjaW5jbHVkZSAic2hhX2xvY2wuaCIKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhX2xvY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzJjMjZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGFfbG9jbC5oCkBAIC0wLDAgKzEsNDM3IEBACisvKiBjcnlwdG8vc2hhL3NoYV9sb2NsLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKyNkZWZpbmUgREFUQV9PUkRFUl9JU19CSUdfRU5ESUFOCisKKyNkZWZpbmUgSEFTSF9MT05HICAgICAgICAgICAgICAgU0hBX0xPTkcKKyNkZWZpbmUgSEFTSF9DVFggICAgICAgICAgICAgICAgU0hBX0NUWAorI2RlZmluZSBIQVNIX0NCTE9DSyAgICAgICAgICAgICBTSEFfQ0JMT0NLCisjZGVmaW5lIEhBU0hfTUFLRV9TVFJJTkcoYyxzKSAgIGRvIHsJXAorCXVuc2lnbmVkIGxvbmcgbGw7CQlcCisJbGw9KGMpLT5oMDsgSE9TVF9sMmMobGwsKHMpKTsJXAorCWxsPShjKS0+aDE7IEhPU1RfbDJjKGxsLChzKSk7CVwKKwlsbD0oYyktPmgyOyBIT1NUX2wyYyhsbCwocykpOwlcCisJbGw9KGMpLT5oMzsgSE9TVF9sMmMobGwsKHMpKTsJXAorCWxsPShjKS0+aDQ7IEhPU1RfbDJjKGxsLChzKSk7CVwKKwl9IHdoaWxlICgwKQorCisjaWYgZGVmaW5lZChTSEFfMCkKKworIyBkZWZpbmUgSEFTSF9VUERBVEUgICAgICAgICAgICAgCVNIQV9VcGRhdGUKKyMgZGVmaW5lIEhBU0hfVFJBTlNGT1JNICAgICAgICAgIAlTSEFfVHJhbnNmb3JtCisjIGRlZmluZSBIQVNIX0ZJTkFMICAgICAgICAgICAgICAJU0hBX0ZpbmFsCisjIGRlZmluZSBIQVNIX0lOSVQJCQlTSEFfSW5pdAorIyBkZWZpbmUgSEFTSF9CTE9DS19EQVRBX09SREVSICAgCXNoYV9ibG9ja19kYXRhX29yZGVyCisjIGRlZmluZSBYdXBkYXRlKGEsaXgsaWEsaWIsaWMsaWQpCShpeD0oYSk9KGlhXmliXmljXmlkKSkKKworc3RhdGljIHZvaWQgc2hhX2Jsb2NrX2RhdGFfb3JkZXIgKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsc2l6ZV90IG51bSk7CisKKyNlbGlmIGRlZmluZWQoU0hBXzEpCisKKyMgZGVmaW5lIEhBU0hfVVBEQVRFICAgICAgICAgICAgIAlTSEExX1VwZGF0ZQorIyBkZWZpbmUgSEFTSF9UUkFOU0ZPUk0gICAgICAgICAgCVNIQTFfVHJhbnNmb3JtCisjIGRlZmluZSBIQVNIX0ZJTkFMICAgICAgICAgICAgICAJU0hBMV9GaW5hbAorIyBkZWZpbmUgSEFTSF9JTklUCQkJU0hBMV9Jbml0CisjIGRlZmluZSBIQVNIX0JMT0NLX0RBVEFfT1JERVIgICAJc2hhMV9ibG9ja19kYXRhX29yZGVyCisjIGlmIGRlZmluZWQoX19NV0VSS1NfXykgJiYgZGVmaW5lZChfX01DNjhLX18pCisgICAvKiBNZXRyb3dlcmtzIGZvciBNb3Rvcm9sYSBmYWlscyBvdGhlcndpc2U6LSggPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPiAqLworIyAgZGVmaW5lIFh1cGRhdGUoYSxpeCxpYSxpYixpYyxpZCkJZG8geyAoYSk9KGlhXmliXmljXmlkKTsJCVwKKwkJCQkJICAgICBpeD0oYSk9Uk9UQVRFKChhKSwxKTsJXAorCQkJCQl9IHdoaWxlICgwKQorIyBlbHNlCisjICBkZWZpbmUgWHVwZGF0ZShhLGl4LGlhLGliLGljLGlkKQkoIChhKT0oaWFeaWJeaWNeaWQpLAlcCisJCQkJCSAgaXg9KGEpPVJPVEFURSgoYSksMSkJXAorCQkJCQkpCisjIGVuZGlmCisKKyNpZm5kZWYgU0hBMV9BU00KK3N0YXRpYworI2VuZGlmCit2b2lkIHNoYTFfYmxvY2tfZGF0YV9vcmRlciAoU0hBX0NUWCAqYywgY29uc3Qgdm9pZCAqcCxzaXplX3QgbnVtKTsKKworI2Vsc2UKKyMgZXJyb3IgIkVpdGhlciBTSEFfMCBvciBTSEFfMSBtdXN0IGJlIGRlZmluZWQuIgorI2VuZGlmCisKKyNpbmNsdWRlICJtZDMyX2NvbW1vbi5oIgorCisjZGVmaW5lIElOSVRfREFUQV9oMCAweDY3NDUyMzAxVUwKKyNkZWZpbmUgSU5JVF9EQVRBX2gxIDB4ZWZjZGFiODlVTAorI2RlZmluZSBJTklUX0RBVEFfaDIgMHg5OGJhZGNmZVVMCisjZGVmaW5lIElOSVRfREFUQV9oMyAweDEwMzI1NDc2VUwKKyNkZWZpbmUgSU5JVF9EQVRBX2g0IDB4YzNkMmUxZjBVTAorCitpbnQgSEFTSF9JTklUIChTSEFfQ1RYICpjKQorCXsKKwltZW1zZXQgKGMsMCxzaXplb2YoKmMpKTsKKwljLT5oMD1JTklUX0RBVEFfaDA7CisJYy0+aDE9SU5JVF9EQVRBX2gxOworCWMtPmgyPUlOSVRfREFUQV9oMjsKKwljLT5oMz1JTklUX0RBVEFfaDM7CisJYy0+aDQ9SU5JVF9EQVRBX2g0OworCXJldHVybiAxOworCX0KKworI2RlZmluZSBLXzAwXzE5CTB4NWE4Mjc5OTlVTAorI2RlZmluZSBLXzIwXzM5IDB4NmVkOWViYTFVTAorI2RlZmluZSBLXzQwXzU5IDB4OGYxYmJjZGNVTAorI2RlZmluZSBLXzYwXzc5IDB4Y2E2MmMxZDZVTAorCisvKiBBcyAgcG9pbnRlZCBvdXQgYnkgV2VpIERhaSA8d2VpZGFpQGVza2ltby5jb20+LCBGKCkgYmVsb3cgY2FuIGJlCisgKiBzaW1wbGlmaWVkIHRvIHRoZSBjb2RlIGluIEZfMDBfMTkuICBXZWkgYXR0cmlidXRlcyB0aGVzZSBvcHRpbWlzYXRpb25zCisgKiB0byBQZXRlciBHdXRtYW5uJ3MgU0hTIGNvZGUsIGFuZCBoZSBhdHRyaWJ1dGVzIGl0IHRvIFJpY2ggU2Nocm9lcHBlbC4KKyAqICNkZWZpbmUgRih4LHkseikgKCgoeCkgJiAoeSkpICB8ICAoKH4oeCkpICYgKHopKSkKKyAqIEkndmUganVzdCBiZWNvbWUgYXdhcmUgb2YgYW5vdGhlciB0d2VhayB0byBiZSBtYWRlLCBhZ2FpbiBmcm9tIFdlaSBEYWksCisgKiBpbiBGXzQwXzU5LCAoeCZhKXwoeSZhKSAtPiAoeHx5KSZhCisgKi8KKyNkZWZpbmUJRl8wMF8xOShiLGMsZCkJKCgoKGMpIF4gKGQpKSAmIChiKSkgXiAoZCkpIAorI2RlZmluZQlGXzIwXzM5KGIsYyxkKQkoKGIpIF4gKGMpIF4gKGQpKQorI2RlZmluZSBGXzQwXzU5KGIsYyxkKQkoKChiKSAmIChjKSkgfCAoKChiKXwoYykpICYgKGQpKSkgCisjZGVmaW5lCUZfNjBfNzkoYixjLGQpCUZfMjBfMzkoYixjLGQpCisKKyNpZm5kZWYgT1BFTlNTTF9TTUFMTF9GT09UUFJJTlQKKworI2RlZmluZSBCT0RZXzAwXzE1KGksYSxiLGMsZCxlLGYseGkpIFwKKwkoZik9eGkrKGUpK0tfMDBfMTkrUk9UQVRFKChhKSw1KStGXzAwXzE5KChiKSwoYyksKGQpKTsgXAorCShiKT1ST1RBVEUoKGIpLDMwKTsKKworI2RlZmluZSBCT0RZXzE2XzE5KGksYSxiLGMsZCxlLGYseGkseGEseGIseGMseGQpIFwKKwlYdXBkYXRlKGYseGkseGEseGIseGMseGQpOyBcCisJKGYpKz0oZSkrS18wMF8xOStST1RBVEUoKGEpLDUpK0ZfMDBfMTkoKGIpLChjKSwoZCkpOyBcCisJKGIpPVJPVEFURSgoYiksMzApOworCisjZGVmaW5lIEJPRFlfMjBfMzEoaSxhLGIsYyxkLGUsZix4aSx4YSx4Yix4Yyx4ZCkgXAorCVh1cGRhdGUoZix4aSx4YSx4Yix4Yyx4ZCk7IFwKKwkoZikrPShlKStLXzIwXzM5K1JPVEFURSgoYSksNSkrRl8yMF8zOSgoYiksKGMpLChkKSk7IFwKKwkoYik9Uk9UQVRFKChiKSwzMCk7CisKKyNkZWZpbmUgQk9EWV8zMl8zOShpLGEsYixjLGQsZSxmLHhhLHhiLHhjLHhkKSBcCisJWHVwZGF0ZShmLHhhLHhhLHhiLHhjLHhkKTsgXAorCShmKSs9KGUpK0tfMjBfMzkrUk9UQVRFKChhKSw1KStGXzIwXzM5KChiKSwoYyksKGQpKTsgXAorCShiKT1ST1RBVEUoKGIpLDMwKTsKKworI2RlZmluZSBCT0RZXzQwXzU5KGksYSxiLGMsZCxlLGYseGEseGIseGMseGQpIFwKKwlYdXBkYXRlKGYseGEseGEseGIseGMseGQpOyBcCisJKGYpKz0oZSkrS180MF81OStST1RBVEUoKGEpLDUpK0ZfNDBfNTkoKGIpLChjKSwoZCkpOyBcCisJKGIpPVJPVEFURSgoYiksMzApOworCisjZGVmaW5lIEJPRFlfNjBfNzkoaSxhLGIsYyxkLGUsZix4YSx4Yix4Yyx4ZCkgXAorCVh1cGRhdGUoZix4YSx4YSx4Yix4Yyx4ZCk7IFwKKwkoZik9eGErKGUpK0tfNjBfNzkrUk9UQVRFKChhKSw1KStGXzYwXzc5KChiKSwoYyksKGQpKTsgXAorCShiKT1ST1RBVEUoKGIpLDMwKTsKKworI2lmZGVmIFgKKyN1bmRlZiBYCisjZW5kaWYKKyNpZm5kZWYgTUQzMl9YQVJSQVkKKyAgLyoKKyAgICogT3JpZ2luYWxseSBYIHdhcyBhbiBhcnJheS4gQXMgaXQncyBhdXRvbWF0aWMgaXQncyBuYXR1cmFsCisgICAqIHRvIGV4cGVjdCBSSVNDIGNvbXBpbGVyIHRvIGFjY29tb2RhdGUgYXQgbGVhc3QgcGFydCBvZiBpdCBpbgorICAgKiB0aGUgcmVnaXN0ZXIgYmFuaywgaXNuJ3QgaXQ/IFVuZm9ydHVuYXRlbHkgbm90IGFsbCBjb21waWxlcnMKKyAgICogImZpbmQiIHRoaXMgZXhwZWN0YXRpb24gcmVhc29uYWJsZTotKCBPbiBvcmRlciB0byBtYWtlIHN1Y2gKKyAgICogY29tcGlsZXJzIGdlbmVyYXRlIGJldHRlciBjb2RlIEkgcmVwbGFjZSBYW10gd2l0aCBhIGJ1bmNoIG9mCisgICAqIFgwLCBYMSwgZXRjLiBTZWUgdGhlIGZ1bmN0aW9uIGJvZHkgYmVsb3cuLi4KKyAgICoJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKyAgICovCisjIGRlZmluZSBYKGkpCVhYIyNpCisjZWxzZQorICAvKgorICAgKiBIb3dldmVyISBTb21lIGNvbXBpbGVycyAobW9zdCBub3RhYmx5IEhQIEMpIGdldCBvdmVyd2hlbG1lZCBieQorICAgKiB0aGF0IG1hbnkgbG9jYWwgdmFyaWFibGVzIHNvIHRoYXQgd2UgaGF2ZSB0byBoYXZlIHRoZSB3YXkgdG8KKyAgICogZmFsbCBkb3duIHRvIHRoZSBvcmlnaW5hbCBiZWhhdmlvci4KKyAgICovCisjIGRlZmluZSBYKGkpCVhYW2ldCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFNIQV8xKSB8fCAhZGVmaW5lZChTSEExX0FTTSkKK3N0YXRpYyB2b2lkIEhBU0hfQkxPQ0tfREFUQV9PUkRFUiAoU0hBX0NUWCAqYywgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IG51bSkKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YT1wOworCXJlZ2lzdGVyIHVuc2lnbmVkIE1EMzJfUkVHX1QgQSxCLEMsRCxFLFQsbDsKKyNpZm5kZWYgTUQzMl9YQVJSQVkKKwl1bnNpZ25lZCBNRDMyX1JFR19UCVhYMCwgWFgxLCBYWDIsIFhYMywgWFg0LCBYWDUsIFhYNiwgWFg3LAorCQkJCVhYOCwgWFg5LFhYMTAsWFgxMSxYWDEyLFhYMTMsWFgxNCxYWDE1OworI2Vsc2UKKwlTSEFfTE9ORwlYWFsxNl07CisjZW5kaWYKKworCUE9Yy0+aDA7CisJQj1jLT5oMTsKKwlDPWMtPmgyOworCUQ9Yy0+aDM7CisJRT1jLT5oNDsKKworCWZvciAoOzspCisJCQl7CisJY29uc3QgdW5pb24geyBsb25nIG9uZTsgY2hhciBsaXR0bGU7IH0gaXNfZW5kaWFuID0gezF9OworCisJaWYgKCFpc19lbmRpYW4ubGl0dGxlICYmIHNpemVvZihTSEFfTE9ORyk9PTQgJiYgKChzaXplX3QpcCU0KT09MCkKKwkJeworCQljb25zdCBTSEFfTE9ORyAqVz0oY29uc3QgU0hBX0xPTkcgKilkYXRhOworCisJCVgoIDApID0gV1swXTsJCQkJWCggMSkgPSBXWyAxXTsKKwkJQk9EWV8wMF8xNSggMCxBLEIsQyxELEUsVCxYKCAwKSk7CVgoIDIpID0gV1sgMl07CisJCUJPRFlfMDBfMTUoIDEsVCxBLEIsQyxELEUsWCggMSkpOwlYKCAzKSA9IFdbIDNdOworCQlCT0RZXzAwXzE1KCAyLEUsVCxBLEIsQyxELFgoIDIpKTsJWCggNCkgPSBXWyA0XTsKKwkJQk9EWV8wMF8xNSggMyxELEUsVCxBLEIsQyxYKCAzKSk7CVgoIDUpID0gV1sgNV07CisJCUJPRFlfMDBfMTUoIDQsQyxELEUsVCxBLEIsWCggNCkpOwlYKCA2KSA9IFdbIDZdOworCQlCT0RZXzAwXzE1KCA1LEIsQyxELEUsVCxBLFgoIDUpKTsJWCggNykgPSBXWyA3XTsKKwkJQk9EWV8wMF8xNSggNixBLEIsQyxELEUsVCxYKCA2KSk7CVgoIDgpID0gV1sgOF07CisJCUJPRFlfMDBfMTUoIDcsVCxBLEIsQyxELEUsWCggNykpOwlYKCA5KSA9IFdbIDldOworCQlCT0RZXzAwXzE1KCA4LEUsVCxBLEIsQyxELFgoIDgpKTsJWCgxMCkgPSBXWzEwXTsKKwkJQk9EWV8wMF8xNSggOSxELEUsVCxBLEIsQyxYKCA5KSk7CVgoMTEpID0gV1sxMV07CisJCUJPRFlfMDBfMTUoMTAsQyxELEUsVCxBLEIsWCgxMCkpOwlYKDEyKSA9IFdbMTJdOworCQlCT0RZXzAwXzE1KDExLEIsQyxELEUsVCxBLFgoMTEpKTsJWCgxMykgPSBXWzEzXTsKKwkJQk9EWV8wMF8xNSgxMixBLEIsQyxELEUsVCxYKDEyKSk7CVgoMTQpID0gV1sxNF07CisJCUJPRFlfMDBfMTUoMTMsVCxBLEIsQyxELEUsWCgxMykpOwlYKDE1KSA9IFdbMTVdOworCQlCT0RZXzAwXzE1KDE0LEUsVCxBLEIsQyxELFgoMTQpKTsKKwkJQk9EWV8wMF8xNSgxNSxELEUsVCxBLEIsQyxYKDE1KSk7CisKKwkJZGF0YSArPSBTSEFfQ0JMT0NLOworCQl9CisJZWxzZQorCQl7CisJCUhPU1RfYzJsKGRhdGEsbCk7IFgoIDApPWw7CQlIT1NUX2MybChkYXRhLGwpOyBYKCAxKT1sOworCQlCT0RZXzAwXzE1KCAwLEEsQixDLEQsRSxULFgoIDApKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggMik9bDsKKwkJQk9EWV8wMF8xNSggMSxULEEsQixDLEQsRSxYKCAxKSk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDMpPWw7CisJCUJPRFlfMDBfMTUoIDIsRSxULEEsQixDLEQsWCggMikpOwlIT1NUX2MybChkYXRhLGwpOyBYKCA0KT1sOworCQlCT0RZXzAwXzE1KCAzLEQsRSxULEEsQixDLFgoIDMpKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggNSk9bDsKKwkJQk9EWV8wMF8xNSggNCxDLEQsRSxULEEsQixYKCA0KSk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDYpPWw7CisJCUJPRFlfMDBfMTUoIDUsQixDLEQsRSxULEEsWCggNSkpOwlIT1NUX2MybChkYXRhLGwpOyBYKCA3KT1sOworCQlCT0RZXzAwXzE1KCA2LEEsQixDLEQsRSxULFgoIDYpKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCggOCk9bDsKKwkJQk9EWV8wMF8xNSggNyxULEEsQixDLEQsRSxYKCA3KSk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoIDkpPWw7CisJCUJPRFlfMDBfMTUoIDgsRSxULEEsQixDLEQsWCggOCkpOwlIT1NUX2MybChkYXRhLGwpOyBYKDEwKT1sOworCQlCT0RZXzAwXzE1KCA5LEQsRSxULEEsQixDLFgoIDkpKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxMSk9bDsKKwkJQk9EWV8wMF8xNSgxMCxDLEQsRSxULEEsQixYKDEwKSk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoMTIpPWw7CisJCUJPRFlfMDBfMTUoMTEsQixDLEQsRSxULEEsWCgxMSkpOwlIT1NUX2MybChkYXRhLGwpOyBYKDEzKT1sOworCQlCT0RZXzAwXzE1KDEyLEEsQixDLEQsRSxULFgoMTIpKTsJSE9TVF9jMmwoZGF0YSxsKTsgWCgxNCk9bDsKKwkJQk9EWV8wMF8xNSgxMyxULEEsQixDLEQsRSxYKDEzKSk7CUhPU1RfYzJsKGRhdGEsbCk7IFgoMTUpPWw7CisJCUJPRFlfMDBfMTUoMTQsRSxULEEsQixDLEQsWCgxNCkpOworCQlCT0RZXzAwXzE1KDE1LEQsRSxULEEsQixDLFgoMTUpKTsKKwkJfQorCisJQk9EWV8xNl8xOSgxNixDLEQsRSxULEEsQixYKCAwKSxYKCAwKSxYKCAyKSxYKCA4KSxYKDEzKSk7CisJQk9EWV8xNl8xOSgxNyxCLEMsRCxFLFQsQSxYKCAxKSxYKCAxKSxYKCAzKSxYKCA5KSxYKDE0KSk7CisJQk9EWV8xNl8xOSgxOCxBLEIsQyxELEUsVCxYKCAyKSxYKCAyKSxYKCA0KSxYKDEwKSxYKDE1KSk7CisJQk9EWV8xNl8xOSgxOSxULEEsQixDLEQsRSxYKCAzKSxYKCAzKSxYKCA1KSxYKDExKSxYKCAwKSk7CisKKwlCT0RZXzIwXzMxKDIwLEUsVCxBLEIsQyxELFgoIDQpLFgoIDQpLFgoIDYpLFgoMTIpLFgoIDEpKTsKKwlCT0RZXzIwXzMxKDIxLEQsRSxULEEsQixDLFgoIDUpLFgoIDUpLFgoIDcpLFgoMTMpLFgoIDIpKTsKKwlCT0RZXzIwXzMxKDIyLEMsRCxFLFQsQSxCLFgoIDYpLFgoIDYpLFgoIDgpLFgoMTQpLFgoIDMpKTsKKwlCT0RZXzIwXzMxKDIzLEIsQyxELEUsVCxBLFgoIDcpLFgoIDcpLFgoIDkpLFgoMTUpLFgoIDQpKTsKKwlCT0RZXzIwXzMxKDI0LEEsQixDLEQsRSxULFgoIDgpLFgoIDgpLFgoMTApLFgoIDApLFgoIDUpKTsKKwlCT0RZXzIwXzMxKDI1LFQsQSxCLEMsRCxFLFgoIDkpLFgoIDkpLFgoMTEpLFgoIDEpLFgoIDYpKTsKKwlCT0RZXzIwXzMxKDI2LEUsVCxBLEIsQyxELFgoMTApLFgoMTApLFgoMTIpLFgoIDIpLFgoIDcpKTsKKwlCT0RZXzIwXzMxKDI3LEQsRSxULEEsQixDLFgoMTEpLFgoMTEpLFgoMTMpLFgoIDMpLFgoIDgpKTsKKwlCT0RZXzIwXzMxKDI4LEMsRCxFLFQsQSxCLFgoMTIpLFgoMTIpLFgoMTQpLFgoIDQpLFgoIDkpKTsKKwlCT0RZXzIwXzMxKDI5LEIsQyxELEUsVCxBLFgoMTMpLFgoMTMpLFgoMTUpLFgoIDUpLFgoMTApKTsKKwlCT0RZXzIwXzMxKDMwLEEsQixDLEQsRSxULFgoMTQpLFgoMTQpLFgoIDApLFgoIDYpLFgoMTEpKTsKKwlCT0RZXzIwXzMxKDMxLFQsQSxCLEMsRCxFLFgoMTUpLFgoMTUpLFgoIDEpLFgoIDcpLFgoMTIpKTsKKworCUJPRFlfMzJfMzkoMzIsRSxULEEsQixDLEQsWCggMCksWCggMiksWCggOCksWCgxMykpOworCUJPRFlfMzJfMzkoMzMsRCxFLFQsQSxCLEMsWCggMSksWCggMyksWCggOSksWCgxNCkpOworCUJPRFlfMzJfMzkoMzQsQyxELEUsVCxBLEIsWCggMiksWCggNCksWCgxMCksWCgxNSkpOworCUJPRFlfMzJfMzkoMzUsQixDLEQsRSxULEEsWCggMyksWCggNSksWCgxMSksWCggMCkpOworCUJPRFlfMzJfMzkoMzYsQSxCLEMsRCxFLFQsWCggNCksWCggNiksWCgxMiksWCggMSkpOworCUJPRFlfMzJfMzkoMzcsVCxBLEIsQyxELEUsWCggNSksWCggNyksWCgxMyksWCggMikpOworCUJPRFlfMzJfMzkoMzgsRSxULEEsQixDLEQsWCggNiksWCggOCksWCgxNCksWCggMykpOworCUJPRFlfMzJfMzkoMzksRCxFLFQsQSxCLEMsWCggNyksWCggOSksWCgxNSksWCggNCkpOworCisJQk9EWV80MF81OSg0MCxDLEQsRSxULEEsQixYKCA4KSxYKDEwKSxYKCAwKSxYKCA1KSk7CisJQk9EWV80MF81OSg0MSxCLEMsRCxFLFQsQSxYKCA5KSxYKDExKSxYKCAxKSxYKCA2KSk7CisJQk9EWV80MF81OSg0MixBLEIsQyxELEUsVCxYKDEwKSxYKDEyKSxYKCAyKSxYKCA3KSk7CisJQk9EWV80MF81OSg0MyxULEEsQixDLEQsRSxYKDExKSxYKDEzKSxYKCAzKSxYKCA4KSk7CisJQk9EWV80MF81OSg0NCxFLFQsQSxCLEMsRCxYKDEyKSxYKDE0KSxYKCA0KSxYKCA5KSk7CisJQk9EWV80MF81OSg0NSxELEUsVCxBLEIsQyxYKDEzKSxYKDE1KSxYKCA1KSxYKDEwKSk7CisJQk9EWV80MF81OSg0NixDLEQsRSxULEEsQixYKDE0KSxYKCAwKSxYKCA2KSxYKDExKSk7CisJQk9EWV80MF81OSg0NyxCLEMsRCxFLFQsQSxYKDE1KSxYKCAxKSxYKCA3KSxYKDEyKSk7CisJQk9EWV80MF81OSg0OCxBLEIsQyxELEUsVCxYKCAwKSxYKCAyKSxYKCA4KSxYKDEzKSk7CisJQk9EWV80MF81OSg0OSxULEEsQixDLEQsRSxYKCAxKSxYKCAzKSxYKCA5KSxYKDE0KSk7CisJQk9EWV80MF81OSg1MCxFLFQsQSxCLEMsRCxYKCAyKSxYKCA0KSxYKDEwKSxYKDE1KSk7CisJQk9EWV80MF81OSg1MSxELEUsVCxBLEIsQyxYKCAzKSxYKCA1KSxYKDExKSxYKCAwKSk7CisJQk9EWV80MF81OSg1MixDLEQsRSxULEEsQixYKCA0KSxYKCA2KSxYKDEyKSxYKCAxKSk7CisJQk9EWV80MF81OSg1MyxCLEMsRCxFLFQsQSxYKCA1KSxYKCA3KSxYKDEzKSxYKCAyKSk7CisJQk9EWV80MF81OSg1NCxBLEIsQyxELEUsVCxYKCA2KSxYKCA4KSxYKDE0KSxYKCAzKSk7CisJQk9EWV80MF81OSg1NSxULEEsQixDLEQsRSxYKCA3KSxYKCA5KSxYKDE1KSxYKCA0KSk7CisJQk9EWV80MF81OSg1NixFLFQsQSxCLEMsRCxYKCA4KSxYKDEwKSxYKCAwKSxYKCA1KSk7CisJQk9EWV80MF81OSg1NyxELEUsVCxBLEIsQyxYKCA5KSxYKDExKSxYKCAxKSxYKCA2KSk7CisJQk9EWV80MF81OSg1OCxDLEQsRSxULEEsQixYKDEwKSxYKDEyKSxYKCAyKSxYKCA3KSk7CisJQk9EWV80MF81OSg1OSxCLEMsRCxFLFQsQSxYKDExKSxYKDEzKSxYKCAzKSxYKCA4KSk7CisKKwlCT0RZXzYwXzc5KDYwLEEsQixDLEQsRSxULFgoMTIpLFgoMTQpLFgoIDQpLFgoIDkpKTsKKwlCT0RZXzYwXzc5KDYxLFQsQSxCLEMsRCxFLFgoMTMpLFgoMTUpLFgoIDUpLFgoMTApKTsKKwlCT0RZXzYwXzc5KDYyLEUsVCxBLEIsQyxELFgoMTQpLFgoIDApLFgoIDYpLFgoMTEpKTsKKwlCT0RZXzYwXzc5KDYzLEQsRSxULEEsQixDLFgoMTUpLFgoIDEpLFgoIDcpLFgoMTIpKTsKKwlCT0RZXzYwXzc5KDY0LEMsRCxFLFQsQSxCLFgoIDApLFgoIDIpLFgoIDgpLFgoMTMpKTsKKwlCT0RZXzYwXzc5KDY1LEIsQyxELEUsVCxBLFgoIDEpLFgoIDMpLFgoIDkpLFgoMTQpKTsKKwlCT0RZXzYwXzc5KDY2LEEsQixDLEQsRSxULFgoIDIpLFgoIDQpLFgoMTApLFgoMTUpKTsKKwlCT0RZXzYwXzc5KDY3LFQsQSxCLEMsRCxFLFgoIDMpLFgoIDUpLFgoMTEpLFgoIDApKTsKKwlCT0RZXzYwXzc5KDY4LEUsVCxBLEIsQyxELFgoIDQpLFgoIDYpLFgoMTIpLFgoIDEpKTsKKwlCT0RZXzYwXzc5KDY5LEQsRSxULEEsQixDLFgoIDUpLFgoIDcpLFgoMTMpLFgoIDIpKTsKKwlCT0RZXzYwXzc5KDcwLEMsRCxFLFQsQSxCLFgoIDYpLFgoIDgpLFgoMTQpLFgoIDMpKTsKKwlCT0RZXzYwXzc5KDcxLEIsQyxELEUsVCxBLFgoIDcpLFgoIDkpLFgoMTUpLFgoIDQpKTsKKwlCT0RZXzYwXzc5KDcyLEEsQixDLEQsRSxULFgoIDgpLFgoMTApLFgoIDApLFgoIDUpKTsKKwlCT0RZXzYwXzc5KDczLFQsQSxCLEMsRCxFLFgoIDkpLFgoMTEpLFgoIDEpLFgoIDYpKTsKKwlCT0RZXzYwXzc5KDc0LEUsVCxBLEIsQyxELFgoMTApLFgoMTIpLFgoIDIpLFgoIDcpKTsKKwlCT0RZXzYwXzc5KDc1LEQsRSxULEEsQixDLFgoMTEpLFgoMTMpLFgoIDMpLFgoIDgpKTsKKwlCT0RZXzYwXzc5KDc2LEMsRCxFLFQsQSxCLFgoMTIpLFgoMTQpLFgoIDQpLFgoIDkpKTsKKwlCT0RZXzYwXzc5KDc3LEIsQyxELEUsVCxBLFgoMTMpLFgoMTUpLFgoIDUpLFgoMTApKTsKKwlCT0RZXzYwXzc5KDc4LEEsQixDLEQsRSxULFgoMTQpLFgoIDApLFgoIDYpLFgoMTEpKTsKKwlCT0RZXzYwXzc5KDc5LFQsQSxCLEMsRCxFLFgoMTUpLFgoIDEpLFgoIDcpLFgoMTIpKTsKKwkKKwljLT5oMD0oYy0+aDArRSkmMHhmZmZmZmZmZkw7IAorCWMtPmgxPShjLT5oMStUKSYweGZmZmZmZmZmTDsKKwljLT5oMj0oYy0+aDIrQSkmMHhmZmZmZmZmZkw7CisJYy0+aDM9KGMtPmgzK0IpJjB4ZmZmZmZmZmZMOworCWMtPmg0PShjLT5oNCtDKSYweGZmZmZmZmZmTDsKKworCWlmICgtLW51bSA9PSAwKSBicmVhazsKKworCUE9Yy0+aDA7CisJQj1jLT5oMTsKKwlDPWMtPmgyOworCUQ9Yy0+aDM7CisJRT1jLT5oNDsKKworCQkJfQorCX0KKyNlbmRpZgorCisjZWxzZQkvKiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVCAqLworCisjZGVmaW5lIEJPRFlfMDBfMTUoeGkpCQkgZG8gewlcCisJVD1FK0tfMDBfMTkrRl8wMF8xOShCLEMsRCk7CVwKKwlFPUQsIEQ9QywgQz1ST1RBVEUoQiwzMCksIEI9QTsJXAorCUE9Uk9UQVRFKEEsNSkrVCt4aTsJICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBCT0RZXzE2XzE5KHhhLHhiLHhjLHhkKQkgZG8gewlcCisJWHVwZGF0ZShULHhhLHhhLHhiLHhjLHhkKTsJXAorCVQrPUUrS18wMF8xOStGXzAwXzE5KEIsQyxEKTsJXAorCUU9RCwgRD1DLCBDPVJPVEFURShCLDMwKSwgQj1BOwlcCisJQT1ST1RBVEUoQSw1KStUOwkgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIEJPRFlfMjBfMzkoeGEseGIseGMseGQpCSBkbyB7CVwKKwlYdXBkYXRlKFQseGEseGEseGIseGMseGQpOwlcCisJVCs9RStLXzIwXzM5K0ZfMjBfMzkoQixDLEQpOwlcCisJRT1ELCBEPUMsIEM9Uk9UQVRFKEIsMzApLCBCPUE7CVwKKwlBPVJPVEFURShBLDUpK1Q7CSAgICB9IHdoaWxlKDApCisKKyNkZWZpbmUgQk9EWV80MF81OSh4YSx4Yix4Yyx4ZCkJIGRvIHsJXAorCVh1cGRhdGUoVCx4YSx4YSx4Yix4Yyx4ZCk7CVwKKwlUKz1FK0tfNDBfNTkrRl80MF81OShCLEMsRCk7CVwKKwlFPUQsIEQ9QywgQz1ST1RBVEUoQiwzMCksIEI9QTsJXAorCUE9Uk9UQVRFKEEsNSkrVDsJICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBCT0RZXzYwXzc5KHhhLHhiLHhjLHhkKQkgZG8gewlcCisJWHVwZGF0ZShULHhhLHhhLHhiLHhjLHhkKTsJXAorCVQ9RStLXzYwXzc5K0ZfNjBfNzkoQixDLEQpOwlcCisJRT1ELCBEPUMsIEM9Uk9UQVRFKEIsMzApLCBCPUE7CVwKKwlBPVJPVEFURShBLDUpK1QreGE7CSAgICB9IHdoaWxlKDApCisKKyNpZiAhZGVmaW5lZChTSEFfMSkgfHwgIWRlZmluZWQoU0hBMV9BU00pCitzdGF0aWMgdm9pZCBIQVNIX0JMT0NLX0RBVEFfT1JERVIgKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKnAsIHNpemVfdCBudW0pCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE9cDsKKwlyZWdpc3RlciB1bnNpZ25lZCBNRDMyX1JFR19UIEEsQixDLEQsRSxULGw7CisJaW50IGk7CisJU0hBX0xPTkcJWFsxNl07CisKKwlBPWMtPmgwOworCUI9Yy0+aDE7CisJQz1jLT5oMjsKKwlEPWMtPmgzOworCUU9Yy0+aDQ7CisKKwlmb3IgKDs7KQorCQl7CisJZm9yIChpPTA7aTwxNjtpKyspCisJeyBIT1NUX2MybChkYXRhLGwpOyBYW2ldPWw7IEJPRFlfMDBfMTUoWFtpXSk7IH0KKwlmb3IgKGk9MDtpPDQ7aSsrKQorCXsgQk9EWV8xNl8xOShYW2ldLCAgICAgICBYW2krMl0sICAgICAgWFtpKzhdLCAgICAgWFsoaSsxMykmMTVdKTsgfQorCWZvciAoO2k8MjQ7aSsrKQorCXsgQk9EWV8yMF8zOShYW2kmMTVdLCAgICBYWyhpKzIpJjE1XSwgWFsoaSs4KSYxNV0sWFsoaSsxMykmMTVdKTsgfQorCWZvciAoaT0wO2k8MjA7aSsrKQorCXsgQk9EWV80MF81OShYWyhpKzgpJjE1XSxYWyhpKzEwKSYxNV0sWFtpJjE1XSwgICAgWFsoaSs1KSYxNV0pOyAgfQorCWZvciAoaT00O2k8MjQ7aSsrKQorCXsgQk9EWV82MF83OShYWyhpKzgpJjE1XSxYWyhpKzEwKSYxNV0sWFtpJjE1XSwgICAgWFsoaSs1KSYxNV0pOyAgfQorCisJYy0+aDA9KGMtPmgwK0EpJjB4ZmZmZmZmZmZMOyAKKwljLT5oMT0oYy0+aDErQikmMHhmZmZmZmZmZkw7CisJYy0+aDI9KGMtPmgyK0MpJjB4ZmZmZmZmZmZMOworCWMtPmgzPShjLT5oMytEKSYweGZmZmZmZmZmTDsKKwljLT5oND0oYy0+aDQrRSkmMHhmZmZmZmZmZkw7CisKKwlpZiAoLS1udW0gPT0gMCkgYnJlYWs7CisKKwlBPWMtPmgwOworCUI9Yy0+aDE7CisJQz1jLT5oMjsKKwlEPWMtPmgzOworCUU9Yy0+aDQ7CisKKwkJfQorCX0KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhdGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3NoYS9zaGF0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc2MTQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zaGEvc2hhdGVzdC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiBjcnlwdG8vc2hhL3NoYXRlc3QuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgIi4uL2Vfb3MuaCIKKworI2lmIGRlZmluZWQoT1BFTlNTTF9OT19TSEEpIHx8IGRlZmluZWQoT1BFTlNTTF9OT19TSEEwKQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBwcmludGYoIk5vIFNIQTAgc3VwcG9ydFxuIik7CisgICAgcmV0dXJuKDApOworfQorI2Vsc2UKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworI2luY2x1ZGUgPG9wZW5zc2wvZWJjZGljLmg+CisjZW5kaWYKKworI2RlZmluZSBTSEFfMCAvKiBGSVBTIDE4MCAqLworI3VuZGVmICBTSEFfMSAvKiBGSVBTIDE4MC0xICovCisKK3N0YXRpYyBjaGFyICp0ZXN0W109eworCSJhYmMiLAorCSJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCisJTlVMTCwKKwl9OworCisjaWZkZWYgU0hBXzAKK3N0YXRpYyBjaGFyICpyZXRbXT17CisJIjAxNjRiOGE5MTRjZDJhNWU3NGM0ZjdmZjA4MmM0ZDk3ZjFlZGY4ODAiLAorCSJkMjUxNmVlMWFjZmE1YmFmMzNkZmMxYzQ3MWU0Mzg0NDllZjEzNGM4IiwKKwl9Oworc3RhdGljIGNoYXIgKmJpZ3JldD0KKwkiMzIzMmFmZmE0ODYyOGEyNjY1M2I1YWFhNDQ1NDFmZDkwZDY5MDYwMyI7CisjZW5kaWYKKyNpZmRlZiBTSEFfMQorc3RhdGljIGNoYXIgKnJldFtdPXsKKwkiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIsCisJIjg0OTgzZTQ0MWMzYmQyNmViYWFlNGFhMWY5NTEyOWU1ZTU0NjcwZjEiLAorCX07CitzdGF0aWMgY2hhciAqYmlncmV0PQorCSIzNGFhOTczY2Q0YzRkYWE0ZjYxZWViMmJkYmFkMjczMTY1MzQwMTZmIjsKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqcHQodW5zaWduZWQgY2hhciAqbWQpOworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKwl7CisJaW50IGksZXJyPTA7CisJY2hhciAqKlAsKipSOworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZlsxMDAwXTsKKwljaGFyICpwLCpyOworCUVWUF9NRF9DVFggYzsKKwl1bnNpZ25lZCBjaGFyIG1kW1NIQV9ESUdFU1RfTEVOR1RIXTsKKworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJZWJjZGljMmFzY2lpKHRlc3RbMF0sIHRlc3RbMF0sIHN0cmxlbih0ZXN0WzBdKSk7CisJZWJjZGljMmFzY2lpKHRlc3RbMV0sIHRlc3RbMV0sIHN0cmxlbih0ZXN0WzFdKSk7CisjZW5kaWYKKworCUVWUF9NRF9DVFhfaW5pdCgmYyk7CisJUD10ZXN0OworCVI9cmV0OworCWk9MTsKKwl3aGlsZSAoKlAgIT0gTlVMTCkKKwkJeworCQlFVlBfRGlnZXN0KCpQLHN0cmxlbigqUCksbWQsTlVMTCxFVlBfc2hhKCksIE5VTEwpOworCQlwPXB0KG1kKTsKKwkJaWYgKHN0cmNtcChwLCpSKSAhPSAwKQorCQkJeworCQkJcHJpbnRmKCJlcnJvciBjYWxjdWxhdGluZyBTSEEgb24gJyVzJ1xuIiwqUCk7CisJCQlwcmludGYoImdvdCAlcyBpbnN0ZWFkIG9mICVzXG4iLHAsKlIpOworCQkJZXJyKys7CisJCQl9CisJCWVsc2UKKwkJCXByaW50ZigidGVzdCAlZCBva1xuIixpKTsKKwkJaSsrOworCQlSKys7CisJCVArKzsKKwkJfQorCisJbWVtc2V0KGJ1ZiwnYScsMTAwMCk7CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwllYmNkaWMyYXNjaWkoYnVmLCBidWYsIDEwMDApOworI2VuZGlmIC8qQ0hBUlNFVF9FQkNESUMqLworCUVWUF9EaWdlc3RJbml0X2V4KCZjLEVWUF9zaGEoKSwgTlVMTCk7CisJZm9yIChpPTA7IGk8MTAwMDsgaSsrKQorCQlFVlBfRGlnZXN0VXBkYXRlKCZjLGJ1ZiwxMDAwKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgoJmMsbWQsTlVMTCk7CisJcD1wdChtZCk7CisKKwlyPWJpZ3JldDsKKwlpZiAoc3RyY21wKHAscikgIT0gMCkKKwkJeworCQlwcmludGYoImVycm9yIGNhbGN1bGF0aW5nIFNIQSBvbiAnJXMnXG4iLHApOworCQlwcmludGYoImdvdCAlcyBpbnN0ZWFkIG9mICVzXG4iLHAscik7CisJCWVycisrOworCQl9CisJZWxzZQorCQlwcmludGYoInRlc3QgMyBva1xuIik7CisKKyNpZmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisgICAgaWYgKGVycikgcHJpbnRmKCJFUlJPUjogJWRcbiIsIGVycik7CisjZW5kaWYKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmMpOworCUVYSVQoZXJyKTsKKwlyZXR1cm4oMCk7CisJfQorCitzdGF0aWMgY2hhciAqcHQodW5zaWduZWQgY2hhciAqbWQpCisJeworCWludCBpOworCXN0YXRpYyBjaGFyIGJ1Zls4MF07CisKKwlmb3IgKGk9MDsgaTxTSEFfRElHRVNUX0xFTkdUSDsgaSsrKQorCQlzcHJpbnRmKCYoYnVmW2kqMl0pLCIlMDJ4IixtZFtpXSk7CisJcmV0dXJuKGJ1Zik7CisJfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc3BhcmNjcHVpZC5TIGIvbGliL29wZW5zc2wvY3J5cHRvL3NwYXJjY3B1aWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThiMTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3NwYXJjY3B1aWQuUwpAQCAtMCwwICsxLDMyMCBAQAorI2lmIGRlZmluZWQoX19TVU5QUk9fQykgJiYgZGVmaW5lZChfX3NwYXJjdjkpCisjIGRlZmluZSBBQkk2NCAgLyogVGhleSd2ZSBzYWlkIC14YXJjaD12OSBhdCBjb21tYW5kIGxpbmUgKi8KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcmNoNjRfXykKKyMgZGVmaW5lIEFCSTY0ICAvKiBUaGV5J3ZlIHNhaWQgLW02NCBhdCBjb21tYW5kIGxpbmUgKi8KKyNlbmRpZgorCisjaWZkZWYgQUJJNjQKKyAgLnJlZ2lzdGVyCSVnMiwjc2NyYXRjaAorICAucmVnaXN0ZXIJJWczLCNzY3JhdGNoCisjIGRlZmluZQlGUkFNRQktMTkyCisjIGRlZmluZQlCSUFTCTIwNDcKKyNlbHNlCisjIGRlZmluZQlGUkFNRQktOTYKKyMgZGVmaW5lCUJJQVMJMAorI2VuZGlmCisKKy50ZXh0CisuYWxpZ24JMzIKKy5nbG9iYWwJT1BFTlNTTF93aXBlX2NwdQorLnR5cGUJT1BFTlNTTF93aXBlX2NwdSwjZnVuY3Rpb24KKyEgS2VlcCBpbiBtaW5kIHRoYXQgdGhpcyBkb2VzIG5vdCBleGN1c2UgdXMgZnJvbSB3aXBpbmcgdGhlIHN0YWNrIQorISBUaGlzIHJvdXRpbmUgd2lwZXMgcmVnaXN0ZXJzLCBidXQgbm90IHRoZSBiYWNraW5nIHN0b3JlIFt3aGljaAorISByZXNpZGVzIG9uIHRoZSBzdGFjaywgdG93YXJkIGxvd2VyIGFkZHJlc3Nlc10uIFRvIGZhY2lsaXRhdGUgZm9yCishIHN0YWNrIHdpcGluZyBJIHJldHVybiBwb2ludGVyIHRvIHRoZSB0b3Agb2Ygc3RhY2sgb2YgdGhlICpjYWxsZXIqLgorT1BFTlNTTF93aXBlX2NwdToKKwlzYXZlCSVzcCxGUkFNRSwlc3AKKwlub3AKKyNpZmRlZiBfX3N1bgorI2luY2x1ZGUgPHN5cy90cmFwLmg+CisJdGEJU1RfQ0xFQU5fV0lORE9XUworI2Vsc2UKKwljYWxsCS53YWxrLnJlZy53aW5zCisjZW5kaWYKKwlub3AKKwljYWxsCS5QSUMuemVyby51cAorCW1vdgkuemVyby0oLi00KSwlbzAKKwlsZAlbJW8wXSwlZjAKKwlsZAlbJW8wXSwlZjEKKworCXN1YmNjCSVnMCwxLCVvMAorCSEgRm9sbG93aW5nIGlzIFY5ICJyZCAlY2NyLCVvMCIgaW5zdHJ1Y3Rpb24uIEhvd2V2ZXIhIFY4CisJISBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBpdCAoInJkICVhc3IyLCVvMCIgaW4gVjggdGVybXMpIGRvZXMKKwkhIG5vdCBjYXVzZSBpbGxlZ2FsX2luc3RydWN0aW9uIHRyYXAuIEl0IHRoZXJlZm9yZSBjYW4gYmUgdXNlZAorCSEgdG8gZGV0ZXJtaW5lIGlmIHRoZSBDUFUgdGhlIGNvZGUgaXMgZXhlY3V0aW5nIG9uIGlzIFY4LSBvcgorCSEgVjktY29tcGxpYW50LCBhcyBWOSByZXR1cm5zIGEgZGlzdGluY3QgdmFsdWUgb2YgMHg5OSwKKwkhICJuZWdhdGl2ZSIgYW5kICJib3Jyb3ciIGJpdHMgc2V0IGluIGJvdGggJWljYyBhbmQgJXhjYy4KKwkud29yZAkweDkxNDA4MDAwCSFyZAklY2NyLCVvMAorCWNtcAklbzAsMHg5OQorCWJuZQkudjgKKwlub3AKKwkJCSEgRXZlbiB0aG91Z2ggd2UgZG8gbm90IHVzZSAlZnAgcmVnaXN0ZXIgYmFuaywKKwkJCSEgd2Ugd2lwZSBpdCBhcyBtZW1jcHkgbWlnaHQgaGF2ZSB1c2VkIGl0Li4uCisJCQkud29yZAkweGJmYTAwMDQwCSFmbW92ZAklZjAsJWY2MgorCQkJLndvcmQJMHhiYmEwMDA0MAkhLi4uCisJCQkud29yZAkweGI3YTAwMDQwCisJCQkud29yZAkweGIzYTAwMDQwCisJCQkud29yZAkweGFmYTAwMDQwCisJCQkud29yZAkweGFiYTAwMDQwCisJCQkud29yZAkweGE3YTAwMDQwCisJCQkud29yZAkweGEzYTAwMDQwCisJCQkud29yZAkweDlmYTAwMDQwCisJCQkud29yZAkweDliYTAwMDQwCisJCQkud29yZAkweDk3YTAwMDQwCisJCQkud29yZAkweDkzYTAwMDQwCisJCQkud29yZAkweDhmYTAwMDQwCisJCQkud29yZAkweDhiYTAwMDQwCisJCQkud29yZAkweDg3YTAwMDQwCisJCQkud29yZAkweDgzYTAwMDQwCSFmbW92ZAklZjAsJWYzMgorLnY4OgkJCWZtb3ZzCSVmMSwlZjMxCisJY2xyCSVvMAorCQkJZm1vdnMJJWYwLCVmMzAKKwljbHIJJW8xCisJCQlmbW92cwklZjEsJWYyOQorCWNscgklbzIKKwkJCWZtb3ZzCSVmMCwlZjI4CisJY2xyCSVvMworCQkJZm1vdnMJJWYxLCVmMjcKKwljbHIJJW80CisJCQlmbW92cwklZjAsJWYyNgorCWNscgklbzUKKwkJCWZtb3ZzCSVmMSwlZjI1CisJY2xyCSVvNworCQkJZm1vdnMJJWYwLCVmMjQKKwljbHIJJWwwCisJCQlmbW92cwklZjEsJWYyMworCWNscgklbDEKKwkJCWZtb3ZzCSVmMCwlZjIyCisJY2xyCSVsMgorCQkJZm1vdnMJJWYxLCVmMjEKKwljbHIJJWwzCisJCQlmbW92cwklZjAsJWYyMAorCWNscgklbDQKKwkJCWZtb3ZzCSVmMSwlZjE5CisJY2xyCSVsNQorCQkJZm1vdnMJJWYwLCVmMTgKKwljbHIJJWw2CisJCQlmbW92cwklZjEsJWYxNworCWNscgklbDcKKwkJCWZtb3ZzCSVmMCwlZjE2CisJY2xyCSVpMAorCQkJZm1vdnMJJWYxLCVmMTUKKwljbHIJJWkxCisJCQlmbW92cwklZjAsJWYxNAorCWNscgklaTIKKwkJCWZtb3ZzCSVmMSwlZjEzCisJY2xyCSVpMworCQkJZm1vdnMJJWYwLCVmMTIKKwljbHIJJWk0CisJCQlmbW92cwklZjEsJWYxMQorCWNscgklaTUKKwkJCWZtb3ZzCSVmMCwlZjEwCisJY2xyCSVnMQorCQkJZm1vdnMJJWYxLCVmOQorCWNscgklZzIKKwkJCWZtb3ZzCSVmMCwlZjgKKwljbHIJJWczCisJCQlmbW92cwklZjEsJWY3CisJY2xyCSVnNAorCQkJZm1vdnMJJWYwLCVmNgorCWNscgklZzUKKwkJCWZtb3ZzCSVmMSwlZjUKKwkJCWZtb3ZzCSVmMCwlZjQKKwkJCWZtb3ZzCSVmMSwlZjMKKwkJCWZtb3ZzCSVmMCwlZjIKKworCWFkZAklZnAsQklBUywlaTAJISByZXR1cm4gcG9pbnRlciB0byBjYWxsZXK0cyB0b3Agb2Ygc3RhY2sKKworCXJldAorCXJlc3RvcmUKKworLnplcm86CS5sb25nCTB4MCwweDAKKy5QSUMuemVyby51cDoKKwlyZXRsCisJYWRkCSVvMCwlbzcsJW8wCisjaWZkZWYgREVCVUcKKy5nbG9iYWwJd2Fsa19yZWdfd2lucworLnR5cGUJd2Fsa19yZWdfd2lucywjZnVuY3Rpb24KK3dhbGtfcmVnX3dpbnM6CisjZW5kaWYKKy53YWxrLnJlZy53aW5zOgorCXNhdmUJJXNwLEZSQU1FLCVzcAorCWNtcAklaTcsJW83CisJYmUJMmYKKwljbHIJJW8wCisJY21wCSVvNywwCSEgY29tcGlsZXIgbmV2ZXIgY2xlYW5zICVvNy4uLgorCWJlCTFmCSEgY291bGQgaGF2ZSBiZWVuIGEgbGVhZiBmdW5jdGlvbi4uLgorCWNscgklbzEKKwljYWxsCS53YWxrLnJlZy53aW5zCisJbm9wCisxOgljbHIJJW8yCisJY2xyCSVvMworCWNscgklbzQKKwljbHIJJW81CisJY2xyCSVvNworCWNscgklbDAKKwljbHIJJWwxCisJY2xyCSVsMgorCWNscgklbDMKKwljbHIJJWw0CisJY2xyCSVsNQorCWNscgklbDYKKwljbHIJJWw3CisJYWRkCSVvMCwxLCVpMAkhIHVzZWQgZm9yIGRlYnVnZ2luZworMjoJcmV0CisJcmVzdG9yZQorLnNpemUJT1BFTlNTTF93aXBlX2NwdSwuLU9QRU5TU0xfd2lwZV9jcHUKKworLmdsb2JhbAlPUEVOU1NMX2F0b21pY19hZGQKKy50eXBlCU9QRU5TU0xfYXRvbWljX2FkZCwjZnVuY3Rpb24KKy5hbGlnbgkzMgorT1BFTlNTTF9hdG9taWNfYWRkOgorI2lmbmRlZiBBQkk2NAorCXN1YmNjCSVnMCwxLCVvMgorCS53b3JkCTB4OTU0MDgwMDAJIXJkCSVjY3IsJW8yLCBzZWUgY29tbWVudCBhYm92ZQorCWNtcAklbzIsMHg5OQorCWJlCS52OQorCW5vcAorCXNhdmUJJXNwLEZSQU1FLCVzcAorCWJhCS5lbnRlcgorCW5vcAorI2lmZGVmIF9fc3VuCishIE5vdGUgdGhhdCB5b3UgZG8gbm90IGhhdmUgdG8gbGluayB3aXRoIGxpYnRocmVhZCB0byBjYWxsIHRocl95aWVsZCwKKyEgYXMgbGliYyBwcm92aWRlcyBhIHN0dWIsIHdoaWNoIGlzIG92ZXJsb2FkZWQgdGhlIG1vbWVudCB5b3UgbGluaworISB3aXRoICplaXRoZXIqIGxpYnB0aHJlYWQgb3IgbGlidGhyZWFkLi4uCisjZGVmaW5lCVlJRUxEX0NQVQl0aHJfeWllbGQKKyNlbHNlCishIGFwcGxpZXMgYXQgbGVhc3QgdG8gTGludXggYW5kIEZyZWVCU0QuLi4gRmVlZGJhY2sgZXhwZWN0ZWQuLi4KKyNkZWZpbmUJWUlFTERfQ1BVCXNjaGVkX3lpZWxkCisjZW5kaWYKKy5zcGluOgljYWxsCVlJRUxEX0NQVQorCW5vcAorLmVudGVyOglsZAlbJWkwXSwlaTIKKwljbXAJJWkyLC00MDk2CisJYmUJLnNwaW4KKwltb3YJLTEsJWkyCisJc3dhcAlbJWkwXSwlaTIKKwljbXAJJWkyLC0xCisJYmUJLnNwaW4KKwlhZGQJJWkyLCVpMSwlaTIKKwlzdGJhcgorCXN0CSVpMixbJWkwXQorCXNyYQklaTIsJWcwLCVpMAorCXJldAorCXJlc3RvcmUKKy52OToKKyNlbmRpZgorCWxkCVslbzBdLCVvMgorMToJYWRkCSVvMSwlbzIsJW8zCisJLndvcmQJMHhkN2UyMTAwYQkhY2FzIFslbzBdLCVvMiwlbzMsIGNvbXBhcmUgWyVvMF0gd2l0aCAlbzIgYW5kIHN3YXAgJW8zCisJY21wCSVvMiwlbzMKKwlibmUJMWIKKwltb3YJJW8zLCVvMgkJISBjYXMgaXMgYWx3YXlzIGZldGNoaW5nIHRvIGRlc3QuIHJlZ2lzdGVyCisJYWRkCSVvMSwlbzIsJW8wCSEgT3BlblNTTCBleHBlY3RzIHRoZSBuZXcgdmFsdWUKKwlyZXRsCisJc3JhCSVvMCwlZzAsJW8wCSEgd2UgcmV0dXJuIHNpZ25lZCBpbnQsIHJlbWVtYmVyPworLnNpemUJT1BFTlNTTF9hdG9taWNfYWRkLC4tT1BFTlNTTF9hdG9taWNfYWRkCisKKy5nbG9iYWwJX3NwYXJjdjlfcmR0aWNrCisuYWxpZ24JMzIKK19zcGFyY3Y5X3JkdGljazoKKwlzdWJjYwklZzAsMSwlbzAKKwkud29yZAkweDkxNDA4MDAwCSFyZAklY2NyLCVvMAorCWNtcAklbzAsMHg5OQorCWJuZQkubm90aWNrCisJeG9yCSVvMCwlbzAsJW8wCisJLndvcmQJMHg5MTQxMDAwMAkhcmQJJXRpY2ssJW8wCisJcmV0bAorCS53b3JkCTB4OTMzMjMwMjAJIXNybHgJJW8yLDMyLCVvMQorLm5vdGljazoKKwlyZXRsCisJeG9yCSVvMSwlbzEsJW8xCisudHlwZQlfc3BhcmN2OV9yZHRpY2ssI2Z1bmN0aW9uCisuc2l6ZQlfc3BhcmN2OV9yZHRpY2ssLi1fc3BhcmN2OV9yZHRpY2sKKworLmdsb2JhbAlPUEVOU1NMX2NsZWFuc2UKKy5hbGlnbgkzMgorT1BFTlNTTF9jbGVhbnNlOgorCWNtcAklbzEsMTQKKwlub3AKKyNpZmRlZiBBQkk2NAorCWJndQkleGNjLC5Mb3QKKyNlbHNlCisJYmd1CS5Mb3QKKyNlbmRpZgorCWNtcAklbzEsMAorCWJuZQkuTGl0dGxlCisJbm9wCisJcmV0bAorCW5vcAorCisuTGl0dGxlOgorCXN0YgklZzAsWyVvMF0KKwlzdWJjYwklbzEsMSwlbzEKKwlibnoJLkxpdHRsZQorCWFkZAklbzAsMSwlbzAKKwlyZXRsCisJbm9wCisuYWxpZ24JMzIKKy5Mb3Q6CisjaWZuZGVmIEFCSTY0CisJc3ViY2MJJWcwLDEsJWcxCisJISBzZWUgYWJvdmUgZm9yIGV4cGxhbmF0aW9uCisJLndvcmQJMHg4MzQwODAwMAkhcmQJJWNjciwlZzEKKwljbXAJJWcxLDB4OTkKKwlibmUJLnY4bG90CisJbm9wCisjZW5kaWYKKworLnY5bG90OglhbmRjYwklbzAsNywlZzAKKwliegkudjlhbGlnbmVkCisJbm9wCisJc3RiCSVnMCxbJW8wXQorCXN1YgklbzEsMSwlbzEKKwliYQkudjlsb3QKKwlhZGQJJW8wLDEsJW8wCisuYWxpZ24JMTYsMHgwMTAwMDAwMAorLnY5YWxpZ25lZDoKKwkud29yZAkweGMwNzIwMDAwCSFzdHgJJWcwLFslbzBdCisJc3ViCSVvMSw4LCVvMQorCWFuZGNjCSVvMSwtOCwlZzAKKyNpZmRlZiBBQkk2NAorCS53b3JkCTB4MTI2ZmZmZmQJIWJuegkleGNjLC52OWFsaWduZWQKKyNlbHNlCisJLndvcmQJMHgxMjRmZmZmZAkhYm56CSVpY2MsLnY5YWxpZ25lZAorI2VuZGlmCisJYWRkCSVvMCw4LCVvMAorCisJY21wCSVvMSwwCisJYm5lCS5MaXR0bGUKKwlub3AKKwlyZXRsCisJbm9wCisjaWZuZGVmIEFCSTY0Cisudjhsb3Q6CWFuZGNjCSVvMCwzLCVnMAorCWJ6CS52OGFsaWduZWQKKwlub3AKKwlzdGIJJWcwLFslbzBdCisJc3ViCSVvMSwxLCVvMQorCWJhCS52OGxvdAorCWFkZAklbzAsMSwlbzAKKwlub3AKKy52OGFsaWduZWQ6CisJc3QJJWcwLFslbzBdCisJc3ViCSVvMSw0LCVvMQorCWFuZGNjCSVvMSwtNCwlZzAKKwlibnoJLnY4YWxpZ25lZAorCWFkZAklbzAsNCwlbzAKKworCWNtcAklbzEsMAorCWJuZQkuTGl0dGxlCisJbm9wCisJcmV0bAorCW5vcAorI2VuZGlmCisudHlwZQlPUEVOU1NMX2NsZWFuc2UsI2Z1bmN0aW9uCisuc2l6ZQlPUEVOU1NMX2NsZWFuc2UsLi1PUEVOU1NMX2NsZWFuc2UKKworLnNlY3Rpb24JIi5pbml0IiwjYWxsb2MsI2V4ZWNpbnN0cgorCWNhbGwJT1BFTlNTTF9jcHVpZF9zZXR1cAorCW5vcApkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3NwYXJjdjljYXAuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zcGFyY3Y5Y2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMWQyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zcGFyY3Y5Y2FwLmMKQEAgLTAsMCArMSwxNTQgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjZGVmaW5lIFNQQVJDVjlfVElDS19QUklWSUxFR0VECSgxPDwwKQorI2RlZmluZSBTUEFSQ1Y5X1BSRUZFUl9GUFUJKDE8PDEpCisjZGVmaW5lIFNQQVJDVjlfVklTMQkJKDE8PDIpCisjZGVmaW5lIFNQQVJDVjlfVklTMgkJKDE8PDMpCS8qIHJlc2VydmVkICovCisjZGVmaW5lIFNQQVJDVjlfRk1BREQJCSgxPDw0KQkvKiByZXNlcnZlZCBmb3IgU1BBUkM2NCBWICovCitzdGF0aWMgaW50IE9QRU5TU0xfc3BhcmN2OWNhcF9QPVNQQVJDVjlfVElDS19QUklWSUxFR0VEOworCitpbnQgYm5fbXVsX21vbnQoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGNvbnN0IEJOX1VMT05HICpicCwgY29uc3QgQk5fVUxPTkcgKm5wLGNvbnN0IEJOX1VMT05HICpuMCwgaW50IG51bSkKKwl7CisJaW50IGJuX211bF9tb250X2ZwdShCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgY29uc3QgQk5fVUxPTkcgKmJwLCBjb25zdCBCTl9VTE9ORyAqbnAsY29uc3QgQk5fVUxPTkcgKm4wLCBpbnQgbnVtKTsKKwlpbnQgYm5fbXVsX21vbnRfaW50KEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsIGNvbnN0IEJOX1VMT05HICpucCxjb25zdCBCTl9VTE9ORyAqbjAsIGludCBudW0pOworCisJaWYgKChPUEVOU1NMX3NwYXJjdjljYXBfUCYoU1BBUkNWOV9QUkVGRVJfRlBVfFNQQVJDVjlfVklTMSkpID09CisJCShTUEFSQ1Y5X1BSRUZFUl9GUFV8U1BBUkNWOV9WSVMxKSkKKwkJcmV0dXJuIGJuX211bF9tb250X2ZwdShycCxhcCxicCxucCxuMCxudW0pOworCWVsc2UKKwkJcmV0dXJuIGJuX211bF9tb250X2ludChycCxhcCxicCxucCxuMCxudW0pOworCX0KKwordW5zaWduZWQgbG9uZyBPUEVOU1NMX3JkdHNjKHZvaWQpCisJeworCXVuc2lnbmVkIGxvbmcgX3NwYXJjdjlfcmR0aWNrKHZvaWQpOworCisJaWYgKE9QRU5TU0xfc3BhcmN2OWNhcF9QJlNQQVJDVjlfVElDS19QUklWSUxFR0VEKQorI2lmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19TVlI0KQorCQlyZXR1cm4gZ2V0aHJ0aW1lKCk7CisjZWxzZQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCWVsc2UKKwkJcmV0dXJuIF9zcGFyY3Y5X3JkdGljaygpOworCX0KKworI2lmIGRlZmluZWQoX19zdW4pICYmIGRlZmluZWQoX19TVlI0KQorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxsaWJkZXZpbmZvLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RlbWluZm8uaD4KKwordHlwZWRlZiBkaV9ub2RlX3QgKCpkaV9pbml0X3QpKGNvbnN0IGNoYXIgKix1aW50X3QpOwordHlwZWRlZiB2b2lkICAgICAgKCpkaV9maW5pX3QpKGRpX25vZGVfdCk7Cit0eXBlZGVmIGNoYXIgKiAgICAoKmRpX25vZGVfbmFtZV90KShkaV9ub2RlX3QpOwordHlwZWRlZiBpbnQgICAgICAgKCpkaV93YWxrX25vZGVfdCkoZGlfbm9kZV90LHVpbnRfdCxkaV9ub2RlX25hbWVfdCxpbnQgKCopKGRpX25vZGVfdCxkaV9ub2RlX25hbWVfdCkpOworCisjZGVmaW5lIERMTElOSyhoLG5hbWUpIChuYW1lPShuYW1lIyNfdClkbHN5bSgoaCksI25hbWUpKQorCitzdGF0aWMgaW50IHdhbGtfbm9kZW5hbWUoZGlfbm9kZV90IG5vZGUsIGRpX25vZGVfbmFtZV90IGRpX25vZGVfbmFtZSkKKwl7CisJY2hhciAqbmFtZSA9ICgqZGlfbm9kZV9uYW1lKShub2RlKTsKKworCS8qIFRoaXMgaXMgZXhwZWN0ZWQgdG8gY2F0Y2ggYWxsIFVsdHJhU1BBUkMgZmxhdm9ycyBwcmlvciBUMSAqLworCWlmICghc3RyY21wIChuYW1lLCJTVU5XLFVsdHJhU1BBUkMiKSB8fAorCSAgICAhc3RybmNtcChuYW1lLCJTVU5XLFVsdHJhU1BBUkMtSSIsMTcpKSAgLyogY292ZXJzIElJLElJSSxJViAqLworCQl7CisJCU9QRU5TU0xfc3BhcmN2OWNhcF9QIHw9IFNQQVJDVjlfUFJFRkVSX0ZQVXxTUEFSQ1Y5X1ZJUzE7CisKKwkJLyogJXRpY2sgaXMgcHJpdmlsZWdlZCBvbmx5IG9uIFVsdHJhU1BBUkMtSS9JSSwgYnV0IG5vdCBJSWUgKi8KKwkJaWYgKG5hbWVbMTRdIT0nXDAnICYmIG5hbWVbMTddIT0nXDAnICYmIG5hbWVbMThdIT0nXDAnKQorCQkJT1BFTlNTTF9zcGFyY3Y5Y2FwX1AgJj0gflNQQVJDVjlfVElDS19QUklWSUxFR0VEOworCisJCXJldHVybiBESV9XQUxLX1RFUk1JTkFURTsKKwkJfQorCS8qIFRoaXMgaXMgZXhwZWN0ZWQgdG8gY2F0Y2ggcmVtYWluaW5nIFVsdHJhU1BBUkNzLCBzdWNoIGFzIFQxICovCisJZWxzZSBpZiAoIXN0cm5jbXAobmFtZSwiU1VOVyxVbHRyYVNQQVJDIiwxNSkpCisJCXsKKwkJT1BFTlNTTF9zcGFyY3Y5Y2FwX1AgJj0gflNQQVJDVjlfVElDS19QUklWSUxFR0VEOworCisJCXJldHVybiBESV9XQUxLX1RFUk1JTkFURTsKKwkJfQorCisJcmV0dXJuIERJX1dBTEtfQ09OVElOVUU7CisJfQorCit2b2lkIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCkKKwl7CisJdm9pZCAqaDsKKwljaGFyICplLHNpWzI1Nl07CisJc3RhdGljIGludCB0cmlnZ2VyPTA7CisKKwlpZiAodHJpZ2dlcikgcmV0dXJuOworCXRyaWdnZXI9MTsKKworCWlmICgoZT1nZXRlbnYoIk9QRU5TU0xfc3BhcmN2OWNhcCIpKSkKKwkJeworCQlPUEVOU1NMX3NwYXJjdjljYXBfUD1zdHJ0b3VsKGUsTlVMTCwwKTsKKwkJcmV0dXJuOworCQl9CisKKwlpZiAoc3lzaW5mbyhTSV9NQUNISU5FLHNpLHNpemVvZihzaSkpPjApCisJCXsKKwkJaWYgKHN0cmNtcChzaSwic3VuNHYiKSkKKwkJCS8qIEZQVSBpcyBwcmVmZXJyZWQgZm9yIGFsbCBDUFVzLCBidXQgVVMtVDEvMiAqLworCQkJT1BFTlNTTF9zcGFyY3Y5Y2FwX1AgfD0gU1BBUkNWOV9QUkVGRVJfRlBVOworCQl9CisKKwlpZiAoc3lzaW5mbyhTSV9JU0FMSVNULHNpLHNpemVvZihzaSkpPjApCisJCXsKKwkJaWYgKHN0cnN0cihzaSwiK3ZpcyIpKQorCQkJT1BFTlNTTF9zcGFyY3Y5Y2FwX1AgfD0gU1BBUkNWOV9WSVMxOworCQlpZiAoc3Ryc3RyKHNpLCIrdmlzMiIpKQorCQkJeworCQkJT1BFTlNTTF9zcGFyY3Y5Y2FwX1AgfD0gU1BBUkNWOV9WSVMyOworCQkJT1BFTlNTTF9zcGFyY3Y5Y2FwX1AgJj0gflNQQVJDVjlfVElDS19QUklWSUxFR0VEOworCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwlpZiAoKGggPSBkbG9wZW4oImxpYmRldmluZm8uc28uMSIsUlRMRF9MQVpZKSkpIGRvCisJCXsKKwkJZGlfaW5pdF90CWRpX2luaXQ7CisJCWRpX2ZpbmlfdAlkaV9maW5pOworCQlkaV93YWxrX25vZGVfdAlkaV93YWxrX25vZGU7CisJCWRpX25vZGVfbmFtZV90CWRpX25vZGVfbmFtZTsKKwkJZGlfbm9kZV90CXJvb3Rfbm9kZTsKKworCQlpZiAoIURMTElOSyhoLGRpX2luaXQpKQkJYnJlYWs7CisJCWlmICghRExMSU5LKGgsZGlfZmluaSkpCQlicmVhazsKKwkJaWYgKCFETExJTksoaCxkaV93YWxrX25vZGUpKQlicmVhazsKKwkJaWYgKCFETExJTksoaCxkaV9ub2RlX25hbWUpKQlicmVhazsKKworCQlpZiAoKHJvb3Rfbm9kZSA9ICgqZGlfaW5pdCkoIi8iLERJTkZPU1VCVFJFRSkpIT1ESV9OT0RFX05JTCkKKwkJCXsKKwkJCSgqZGlfd2Fsa19ub2RlKShyb290X25vZGUsRElfV0FMS19TSUJGSVJTVCwKKwkJCQkJZGlfbm9kZV9uYW1lLHdhbGtfbm9kZW5hbWUpOworCQkJKCpkaV9maW5pKShyb290X25vZGUpOworCQkJfQorCQl9IHdoaWxlKDApOworCisJaWYgKGgpIGRsY2xvc2UoaCk7CisJfQorCisjZWxzZQorCit2b2lkIE9QRU5TU0xfY3B1aWRfc2V0dXAodm9pZCkKKwl7CisJY2hhciAqZTsKKyAKKwlpZiAoKGU9Z2V0ZW52KCJPUEVOU1NMX3NwYXJjdjljYXAiKSkpCisJCXsKKwkJT1BFTlNTTF9zcGFyY3Y5Y2FwX1A9c3RydG91bChlLE5VTEwsMCk7CisJCXJldHVybjsKKwkJfQorCisJLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVzdCBzdXBwb3J0cyBVbHRyYVNQQVJDLUkqIG9ubHkgKi8KKwlPUEVOU1NMX3NwYXJjdjljYXBfUCB8PSBTUEFSQ1Y5X1BSRUZFUl9GUFV8U1BBUkNWOV9WSVMxOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc3RhY2svc2FmZXN0YWNrLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RhY2svc2FmZXN0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxY2I4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zdGFjay9zYWZlc3RhY2suaApAQCAtMCwwICsxLDI1NzQgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfU0FGRVNUQUNLX0gKKyNkZWZpbmUgSEVBREVSX1NBRkVTVEFDS19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisKKyNpZm5kZWYgQ0hFQ0tFRF9QVFJfT0YKKyNkZWZpbmUgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgcCkgXAorICAgICgodm9pZCopICgxID8gcCA6ICh0eXBlKikwKSkKKyNlbmRpZgorCisvKiBJbiBDKysgd2UgZ2V0IHByb2JsZW1zIGJlY2F1c2UgYW4gZXhwbGljaXQgY2FzdCBpcyBuZWVkZWQgZnJvbSAodm9pZCAqKQorICogd2UgdXNlIENIRUNLRURfU1RBQ0tfT0YgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IHR5cGUgaXMgcGFzc2VkIGluIHRoZSBtYWNyb3MKKyAqIGJlbG93LiAKKyAqLworCisjZGVmaW5lIENIRUNLRURfU1RBQ0tfT0YodHlwZSwgcCkgXAorICAgICgoX1NUQUNLKikgKDEgPyBwIDogKFNUQUNLX09GKHR5cGUpKikwKSkKKworI2RlZmluZSBDSEVDS0VEX1NLX0ZSRUVfRlVOQyh0eXBlLCBwKSBcCisgICAgKCh2b2lkICgqKSh2b2lkICopKSAoKDEgPyBwIDogKHZvaWQgKCopKHR5cGUgKikpMCkpKQorCisjZGVmaW5lIENIRUNLRURfU0tfRlJFRV9GVU5DMih0eXBlLCBwKSBcCisgICAgKCh2b2lkICgqKSh2b2lkICopKSAoKDEgPyBwIDogKHZvaWQgKCopKHR5cGUpKTApKSkKKworI2RlZmluZSBDSEVDS0VEX1NLX0NNUF9GVU5DKHR5cGUsIHApIFwKKyAgICAoKGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSBcCisJKCgxID8gcCA6IChpbnQgKCopKGNvbnN0IHR5cGUgKiBjb25zdCAqLCBjb25zdCB0eXBlICogY29uc3QgKikpMCkpKQorCisjZGVmaW5lIFNUQUNLX09GKHR5cGUpIHN0cnVjdCBzdGFja19zdF8jI3R5cGUKKyNkZWZpbmUgUFJFREVDTEFSRV9TVEFDS19PRih0eXBlKSBTVEFDS19PRih0eXBlKTsKKworI2RlZmluZSBERUNMQVJFX1NUQUNLX09GKHR5cGUpIFwKK1NUQUNLX09GKHR5cGUpIFwKKyAgICB7IFwKKyAgICBfU1RBQ0sgc3RhY2s7IFwKKyAgICB9OworI2RlZmluZSBERUNMQVJFX1NQRUNJQUxfU1RBQ0tfT0YodHlwZSwgdHlwZTIpIFwKK1NUQUNLX09GKHR5cGUpIFwKKyAgICB7IFwKKyAgICBfU1RBQ0sgc3RhY2s7IFwKKyAgICB9OworCisjZGVmaW5lIElNUExFTUVOVF9TVEFDS19PRih0eXBlKSAvKiBuYWRhIChvYnNvbGV0ZSBpbiBuZXcgc2FmZXN0YWNrIGFwcHJvYWNoKSovCisKKworLyogU3RyaW5ncyBhcmUgc3BlY2lhbDogbm9ybWFsbHkgYW4gbGhhc2ggZW50cnkgd2lsbCBwb2ludCB0byBhIHNpbmdsZQorICogKHNvbWV3aGF0KSBtdXRhYmxlIG9iamVjdC4gSW4gdGhlIGNhc2Ugb2Ygc3RyaW5nczoKKyAqCisgKiBhKSBJbnN0ZWFkIG9mIGEgc2luZ2xlIGNoYXIsIHRoZXJlIGlzIGFuIGFycmF5IG9mIGNoYXJzLCBOVUwtdGVybWluYXRlZC4KKyAqIGIpIFRoZSBzdHJpbmcgbWF5IGhhdmUgYmUgaW1tdXRhYmxlLgorICoKKyAqIFNvLCB0aGV5IG5lZWQgdGhlaXIgb3duIGRlY2xhcmF0aW9ucy4gRXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yCisgKiB0eXBlLWNoZWNraW5nIHRvb2xzLCBzdWNoIGFzIERlcHV0eS4KKyAqCitvICogSW4gcHJhY3RpY2UsIGhvd2V2ZXIsIGl0IGFwcGVhcnMgdG8gYmUgaGFyZCB0byBoYXZlIGEgY29uc3QKKyAqIHN0cmluZy4gRm9yIG5vdywgSSdtIHNldHRsaW5nIGZvciBkZWFsaW5nIHdpdGggdGhlIGZhY3QgaXQgaXMgYQorICogc3RyaW5nIGF0IGFsbC4KKyAqLwordHlwZWRlZiBjaGFyICpPUEVOU1NMX1NUUklORzsKKwordHlwZWRlZiBjb25zdCBjaGFyICpPUEVOU1NMX0NTVFJJTkc7CisKKy8qIENvbmZ1c2luZ2x5LCBMSEFTSF9PRihTVFJJTkcpIGRlYWxzIHdpdGggY2hhciAqKiB0aHJvdWdob3V0LCBidXQKKyAqIFNUQUNLX09GKFNUUklORykgaXMgcmVhbGx5IG1vcmUgbGlrZSBTVEFDS19PRihjaGFyKSwgb25seSwgYXMKKyAqIG1lbnRpb25lZCBhYm92ZSwgaW5zdGVhZCBvZiBhIHNpbmdsZSBjaGFyIGVhY2ggZW50cnkgaXMgYQorICogTlVMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgY2hhcnMuIFNvLCB3ZSBoYXZlIHRvIGltcGxlbWVudCBTVFJJTkcKKyAqIHNwZWNpYWxseSBmb3IgU1RBQ0tfT0YuIFRoaXMgaXMgZGVhbHQgd2l0aCBpbiB0aGUgYXV0b2dlbmVyYXRlZAorICogbWFjcm9zIGJlbG93LgorICovCisKK0RFQ0xBUkVfU1BFQ0lBTF9TVEFDS19PRihPUEVOU1NMX1NUUklORywgY2hhcikKKworLyogU2ltaWxhcmx5LCB3ZSBzb21ldGltZXMgdXNlIGEgYmxvY2sgb2YgY2hhcmFjdGVycywgTk9UCisgKiBudWwtdGVybWluYXRlZC4gVGhlc2Ugc2hvdWxkIGFsc28gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tICJub3JtYWwiCisgKiBzdGFja3MuICovCisKK3R5cGVkZWYgdm9pZCAqT1BFTlNTTF9CTE9DSzsKK0RFQ0xBUkVfU1BFQ0lBTF9TVEFDS19PRihPUEVOU1NMX0JMT0NLLCB2b2lkKQorCisvKiBTS01fc2tfLi4uIHN0YWNrIG1hY3JvcyBhcmUgaW50ZXJuYWwgdG8gc2FmZXN0YWNrLmg6CisgKiBuZXZlciB1c2UgdGhlbSBkaXJlY3RseSwgdXNlIHNrXzx0eXBlPl8uLi4gaW5zdGVhZCAqLworI2RlZmluZSBTS01fc2tfbmV3KHR5cGUsIGNtcCkgXAorCSgoU1RBQ0tfT0YodHlwZSkgKilza19uZXcoQ0hFQ0tFRF9TS19DTVBfRlVOQyh0eXBlLCBjbXApKSkKKyNkZWZpbmUgU0tNX3NrX25ld19udWxsKHR5cGUpIFwKKwkoKFNUQUNLX09GKHR5cGUpICopc2tfbmV3X251bGwoKSkKKyNkZWZpbmUgU0tNX3NrX2ZyZWUodHlwZSwgc3QpIFwKKwlza19mcmVlKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfbnVtKHR5cGUsIHN0KSBcCisJc2tfbnVtKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfdmFsdWUodHlwZSwgc3QsaSkgXAorCSgodHlwZSAqKXNrX3ZhbHVlKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBpKSkKKyNkZWZpbmUgU0tNX3NrX3NldCh0eXBlLCBzdCxpLHZhbCkgXAorCXNrX3NldChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSwgaSwgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgdmFsKSkKKyNkZWZpbmUgU0tNX3NrX3plcm8odHlwZSwgc3QpIFwKKwlza196ZXJvKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfcHVzaCh0eXBlLCBzdCwgdmFsKSBcCisJc2tfcHVzaChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSwgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgdmFsKSkKKyNkZWZpbmUgU0tNX3NrX3Vuc2hpZnQodHlwZSwgc3QsIHZhbCkgXAorCXNrX3Vuc2hpZnQoQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCksIENIRUNLRURfUFRSX09GKHR5cGUsIHZhbCkpCisjZGVmaW5lIFNLTV9za19maW5kKHR5cGUsIHN0LCB2YWwpIFwKKwlza19maW5kKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBDSEVDS0VEX1BUUl9PRih0eXBlLCB2YWwpKQorI2RlZmluZSBTS01fc2tfZmluZF9leCh0eXBlLCBzdCwgdmFsKSBcCisJc2tfZmluZF9leChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSwgXAorCQkgICBDSEVDS0VEX1BUUl9PRih0eXBlLCB2YWwpKQorI2RlZmluZSBTS01fc2tfZGVsZXRlKHR5cGUsIHN0LCBpKSBcCisJKHR5cGUgKilza19kZWxldGUoQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCksIGkpCisjZGVmaW5lIFNLTV9za19kZWxldGVfcHRyKHR5cGUsIHN0LCBwdHIpIFwKKwkodHlwZSAqKXNrX2RlbGV0ZV9wdHIoQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCksIENIRUNLRURfUFRSX09GKHR5cGUsIHB0cikpCisjZGVmaW5lIFNLTV9za19pbnNlcnQodHlwZSwgc3QsdmFsLCBpKSBcCisJc2tfaW5zZXJ0KENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBDSEVDS0VEX1BUUl9PRih0eXBlLCB2YWwpLCBpKQorI2RlZmluZSBTS01fc2tfc2V0X2NtcF9mdW5jKHR5cGUsIHN0LCBjbXApIFwKKwkoKGludCAoKikoY29uc3QgdHlwZSAqIGNvbnN0ICosY29uc3QgdHlwZSAqIGNvbnN0ICopKSBcCisJc2tfc2V0X2NtcF9mdW5jKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBDSEVDS0VEX1NLX0NNUF9GVU5DKHR5cGUsIGNtcCkpKQorI2RlZmluZSBTS01fc2tfZHVwKHR5cGUsIHN0KSBcCisJKFNUQUNLX09GKHR5cGUpICopc2tfZHVwKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfcG9wX2ZyZWUodHlwZSwgc3QsIGZyZWVfZnVuYykgXAorCXNrX3BvcF9mcmVlKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBDSEVDS0VEX1NLX0ZSRUVfRlVOQyh0eXBlLCBmcmVlX2Z1bmMpKQorI2RlZmluZSBTS01fc2tfc2hpZnQodHlwZSwgc3QpIFwKKwkodHlwZSAqKXNrX3NoaWZ0KENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfcG9wKHR5cGUsIHN0KSBcCisJKHR5cGUgKilza19wb3AoQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCkpCisjZGVmaW5lIFNLTV9za19zb3J0KHR5cGUsIHN0KSBcCisJc2tfc29ydChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSkKKyNkZWZpbmUgU0tNX3NrX2lzX3NvcnRlZCh0eXBlLCBzdCkgXAorCXNrX2lzX3NvcnRlZChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSkKKworI2RlZmluZQlTS01fQVNOMV9TRVRfT0ZfZDJpKHR5cGUsIHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisgIChTVEFDS19PRih0eXBlKSAqKWQyaV9BU04xX1NFVCgoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiopQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCksIFwKKwkJCQlwcCwgbGVuZ3RoLCBcCisJCQkJQ0hFQ0tFRF9EMklfT0YodHlwZSwgZDJpX2Z1bmMpLCBcCisJCQkJQ0hFQ0tFRF9TS19GUkVFX0ZVTkModHlwZSwgZnJlZV9mdW5jKSwgXAorCQkJCWV4X3RhZywgZXhfY2xhc3MpCisKKyNkZWZpbmUJU0tNX0FTTjFfU0VUX09GX2kyZCh0eXBlLCBzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKyAgaTJkX0FTTjFfU0VUKChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKUNIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBwcCwgXAorCQkJCUNIRUNLRURfSTJEX09GKHR5cGUsIGkyZF9mdW5jKSwgXAorCQkJCWV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkKKworI2RlZmluZQlTS01fQVNOMV9zZXFfcGFjayh0eXBlLCBzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJQVNOMV9zZXFfcGFjayhDSEVDS0VEX1BUUl9PRihTVEFDS19PRih0eXBlKSwgc3QpLCBcCisJCQlDSEVDS0VEX0kyRF9PRih0eXBlLCBpMmRfZnVuYyksIGJ1ZiwgbGVuKQorCisjZGVmaW5lCVNLTV9BU04xX3NlcV91bnBhY2sodHlwZSwgYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwkoU1RBQ0tfT0YodHlwZSkgKilBU04xX3NlcV91bnBhY2soYnVmLCBsZW4sIENIRUNLRURfRDJJX09GKHR5cGUsIGQyaV9mdW5jKSwgQ0hFQ0tFRF9TS19GUkVFX0ZVTkModHlwZSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBTS01fUEtDUzEyX2RlY3J5cHRfZDJpKHR5cGUsIGFsZ29yLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBwYXNzLCBwYXNzbGVuLCBvY3QsIHNlcSkgXAorCShTVEFDS19PRih0eXBlKSAqKVBLQ1MxMl9kZWNyeXB0X2QyaShhbGdvciwgXAorCQkJCUNIRUNLRURfRDJJX09GKHR5cGUsIGQyaV9mdW5jKSwgXAorCQkJCUNIRUNLRURfU0tfRlJFRV9GVU5DKHR5cGUsIGZyZWVfZnVuYyksIFwKKwkJCQlwYXNzLCBwYXNzbGVuLCBvY3QsIHNlcSkKKworLyogVGhpcyBibG9jayBvZiBkZWZpbmVzIGlzIHVwZGF0ZWQgYnkgdXRpbC9ta3N0YWNrLnBsLCBwbGVhc2UgZG8gbm90IHRvdWNoISAqLworI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fbmV3KGNtcCkgU0tNX3NrX25ldyhBQ0NFU1NfREVTQ1JJUFRJT04sIChjbXApKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQUNDRVNTX0RFU0NSSVBUSU9OKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fZnJlZShzdCkgU0tNX3NrX2ZyZWUoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fbnVtKHN0KSBTS01fc2tfbnVtKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSkKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl96ZXJvKHN0KSBTS01fc2tfemVybyhBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCksIChjbXApKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fZHVwKHN0KSBTS01fc2tfZHVwKEFDQ0VTU19ERVNDUklQVElPTiwgc3QpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fcG9wKHN0KSBTS01fc2tfcG9wKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSkKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3NvcnQoc3QpIFNLTV9za19zb3J0KEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSkKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCkpCisKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfbmV3KGNtcCkgU0tNX3NrX25ldyhBU0lkT3JSYW5nZSwgKGNtcCkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEFTSWRPclJhbmdlKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV9mcmVlKHN0KSBTS01fc2tfZnJlZShBU0lkT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfbnVtKHN0KSBTS01fc2tfbnVtKEFTSWRPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEFTSWRPclJhbmdlLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEFTSWRPclJhbmdlLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV96ZXJvKHN0KSBTS01fc2tfemVybyhBU0lkT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChBU0lkT3JSYW5nZSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQVNJZE9yUmFuZ2UsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTSWRPclJhbmdlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChBU0lkT3JSYW5nZSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShBU0lkT3JSYW5nZSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTSWRPclJhbmdlLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQVNJZE9yUmFuZ2UsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEFTSWRPclJhbmdlLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfZHVwKHN0KSBTS01fc2tfZHVwKEFTSWRPclJhbmdlLCBzdCkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEFTSWRPclJhbmdlLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2Vfc2hpZnQoc3QpIFNLTV9za19zaGlmdChBU0lkT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfcG9wKHN0KSBTS01fc2tfcG9wKEFTSWRPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV9zb3J0KHN0KSBTS01fc2tfc29ydChBU0lkT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEFTSWRPclJhbmdlLCAoc3QpKQorCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19uZXcoY21wKSBTS01fc2tfbmV3KEFTTjFfR0VORVJBTFNUUklORywgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChBU04xX0dFTkVSQUxTVFJJTkcpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19mcmVlKHN0KSBTS01fc2tfZnJlZShBU04xX0dFTkVSQUxTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19udW0oc3QpIFNLTV9za19udW0oQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShBU04xX0dFTkVSQUxTVFJJTkcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEFTTjFfR0VORVJBTFNUUklORywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3plcm8oc3QpIFNLTV9za196ZXJvKEFTTjFfR0VORVJBTFNUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShBU04xX0dFTkVSQUxTVFJJTkcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEFTTjFfR0VORVJBTFNUUklORywgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEFTTjFfR0VORVJBTFNUUklORywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19kdXAoc3QpIFNLTV9za19kdXAoQVNOMV9HRU5FUkFMU1RSSU5HLCBzdCkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShBU04xX0dFTkVSQUxTVFJJTkcsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfc2hpZnQoc3QpIFNLTV9za19zaGlmdChBU04xX0dFTkVSQUxTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19wb3Aoc3QpIFNLTV9za19wb3AoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfc29ydChzdCkgU0tNX3NrX3NvcnQoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEFTTjFfR0VORVJBTFNUUklORywgKHN0KSkKKworI2RlZmluZSBza19BU04xX0lOVEVHRVJfbmV3KGNtcCkgU0tNX3NrX25ldyhBU04xX0lOVEVHRVIsIChjbXApKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQVNOMV9JTlRFR0VSKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQVNOMV9JTlRFR0VSLCAoc3QpKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfbnVtKHN0KSBTS01fc2tfbnVtKEFTTjFfSU5URUdFUiwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQVNOMV9JTlRFR0VSLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChBU04xX0lOVEVHRVIsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl96ZXJvKHN0KSBTS01fc2tfemVybyhBU04xX0lOVEVHRVIsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEFTTjFfSU5URUdFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEFTTjFfSU5URUdFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTTjFfSU5URUdFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEFTTjFfSU5URUdFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQVNOMV9JTlRFR0VSLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTTjFfSU5URUdFUiwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChBU04xX0lOVEVHRVIsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhBU04xX0lOVEVHRVIsIChzdCksIChjbXApKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfZHVwKHN0KSBTS01fc2tfZHVwKEFTTjFfSU5URUdFUiwgc3QpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQVNOMV9JTlRFR0VSLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQVNOMV9JTlRFR0VSLCAoc3QpKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfcG9wKHN0KSBTS01fc2tfcG9wKEFTTjFfSU5URUdFUiwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3NvcnQoc3QpIFNLTV9za19zb3J0KEFTTjFfSU5URUdFUiwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChBU04xX0lOVEVHRVIsIChzdCkpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfbmV3KGNtcCkgU0tNX3NrX25ldyhBU04xX09CSkVDVCwgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEFTTjFfT0JKRUNUKQorI2RlZmluZSBza19BU04xX09CSkVDVF9mcmVlKHN0KSBTS01fc2tfZnJlZShBU04xX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfbnVtKHN0KSBTS01fc2tfbnVtKEFTTjFfT0JKRUNULCAoc3QpKQorI2RlZmluZSBza19BU04xX09CSkVDVF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEFTTjFfT0JKRUNULCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEFTTjFfT0JKRUNULCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19BU04xX09CSkVDVF96ZXJvKHN0KSBTS01fc2tfemVybyhBU04xX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChBU04xX09CSkVDVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQVNOMV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX09CSkVDVF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTTjFfT0JKRUNULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChBU04xX09CSkVDVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShBU04xX09CSkVDVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU04xX09CSkVDVF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTTjFfT0JKRUNULCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQVNOMV9PQkpFQ1QsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEFTTjFfT0JKRUNULCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfZHVwKHN0KSBTS01fc2tfZHVwKEFTTjFfT0JKRUNULCBzdCkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEFTTjFfT0JKRUNULCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1Rfc2hpZnQoc3QpIFNLTV9za19zaGlmdChBU04xX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfcG9wKHN0KSBTS01fc2tfcG9wKEFTTjFfT0JKRUNULCAoc3QpKQorI2RlZmluZSBza19BU04xX09CSkVDVF9zb3J0KHN0KSBTS01fc2tfc29ydChBU04xX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEFTTjFfT0JKRUNULCAoc3QpKQorCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX25ldyhjbXApIFNLTV9za19uZXcoQVNOMV9TVFJJTkdfVEFCTEUsIChjbXApKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChBU04xX1NUUklOR19UQUJMRSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX251bShzdCkgU0tNX3NrX251bShBU04xX1NUUklOR19UQUJMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfemVybyhzdCkgU0tNX3NrX3plcm8oQVNOMV9TVFJJTkdfVEFCTEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQVNOMV9TVFJJTkdfVEFCTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEFTTjFfU1RSSU5HX1RBQkxFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEFTTjFfU1RSSU5HX1RBQkxFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2R1cChzdCkgU0tNX3NrX2R1cChBU04xX1NUUklOR19UQUJMRSwgc3QpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3BvcChzdCkgU0tNX3NrX3BvcChBU04xX1NUUklOR19UQUJMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfc29ydChzdCkgU0tNX3NrX3NvcnQoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChBU04xX1NUUklOR19UQUJMRSwgKHN0KSkKKworI2RlZmluZSBza19BU04xX1RZUEVfbmV3KGNtcCkgU0tNX3NrX25ldyhBU04xX1RZUEUsIChjbXApKQorI2RlZmluZSBza19BU04xX1RZUEVfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQVNOMV9UWVBFKQorI2RlZmluZSBza19BU04xX1RZUEVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQVNOMV9UWVBFLCAoc3QpKQorI2RlZmluZSBza19BU04xX1RZUEVfbnVtKHN0KSBTS01fc2tfbnVtKEFTTjFfVFlQRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQVNOMV9UWVBFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChBU04xX1RZUEUsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV96ZXJvKHN0KSBTS01fc2tfemVybyhBU04xX1RZUEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEFTTjFfVFlQRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEFTTjFfVFlQRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTTjFfVFlQRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEFTTjFfVFlQRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQVNOMV9UWVBFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTTjFfVFlQRSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChBU04xX1RZUEUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhBU04xX1RZUEUsIChzdCksIChjbXApKQorI2RlZmluZSBza19BU04xX1RZUEVfZHVwKHN0KSBTS01fc2tfZHVwKEFTTjFfVFlQRSwgc3QpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQVNOMV9UWVBFLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQVNOMV9UWVBFLCAoc3QpKQorI2RlZmluZSBza19BU04xX1RZUEVfcG9wKHN0KSBTS01fc2tfcG9wKEFTTjFfVFlQRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3NvcnQoc3QpIFNLTV9za19zb3J0KEFTTjFfVFlQRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChBU04xX1RZUEUsIChzdCkpCisKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX25ldyhjbXApIFNLTV9za19uZXcoQVNOMV9VVEY4U1RSSU5HLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEFTTjFfVVRGOFNUUklORykKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX2ZyZWUoc3QpIFNLTV9za19mcmVlKEFTTjFfVVRGOFNUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX251bShzdCkgU0tNX3NrX251bShBU04xX1VURjhTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVVRGOFNUUklOR192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQVNOMV9VVEY4U1RSSU5HLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfemVybyhzdCkgU0tNX3NrX3plcm8oQVNOMV9VVEY4U1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChBU04xX1VURjhTVFJJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChBU04xX1VURjhTVFJJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChBU04xX1VURjhTVFJJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChBU04xX1VURjhTVFJJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihBU04xX1VURjhTVFJJTkcsIChzdCksIChwdHIpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQVNOMV9VVEY4U1RSSU5HLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQVNOMV9VVEY4U1RSSU5HLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX2R1cChzdCkgU0tNX3NrX2R1cChBU04xX1VURjhTVFJJTkcsIHN0KQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0FTTjFfVVRGOFNUUklOR19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEFTTjFfVVRGOFNUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX3BvcChzdCkgU0tNX3NrX3BvcChBU04xX1VURjhTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVVRGOFNUUklOR19zb3J0KHN0KSBTS01fc2tfc29ydChBU04xX1VURjhTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVVRGOFNUUklOR19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQVNOMV9VVEY4U1RSSU5HLCAoc3QpKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfbmV3KGNtcCkgU0tNX3NrX25ldyhBU04xX1ZBTFVFLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChBU04xX1ZBTFVFKQorI2RlZmluZSBza19BU04xX1ZBTFVFX2ZyZWUoc3QpIFNLTV9za19mcmVlKEFTTjFfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfbnVtKHN0KSBTS01fc2tfbnVtKEFTTjFfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShBU04xX1ZBTFVFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQVNOMV9WQUxVRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV96ZXJvKHN0KSBTS01fc2tfemVybyhBU04xX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19BU04xX1ZBTFVFX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQVNOMV9WQUxVRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChBU04xX1ZBTFVFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTTjFfVkFMVUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1ZBTFVFX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQVNOMV9WQUxVRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEFTTjFfVkFMVUUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTTjFfVkFMVUUsIChzdCksIChwdHIpKQorI2RlZmluZSBza19BU04xX1ZBTFVFX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEFTTjFfVkFMVUUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQVNOMV9WQUxVRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfZHVwKHN0KSBTS01fc2tfZHVwKEFTTjFfVkFMVUUsIHN0KQorI2RlZmluZSBza19BU04xX1ZBTFVFX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShBU04xX1ZBTFVFLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEFTTjFfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfcG9wKHN0KSBTS01fc2tfcG9wKEFTTjFfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfc29ydChzdCkgU0tNX3NrX3NvcnQoQVNOMV9WQUxVRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQVNOMV9WQUxVRSwgKHN0KSkKKworI2RlZmluZSBza19CSU9fbmV3KGNtcCkgU0tNX3NrX25ldyhCSU8sIChjbXApKQorI2RlZmluZSBza19CSU9fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQklPKQorI2RlZmluZSBza19CSU9fZnJlZShzdCkgU0tNX3NrX2ZyZWUoQklPLCAoc3QpKQorI2RlZmluZSBza19CSU9fbnVtKHN0KSBTS01fc2tfbnVtKEJJTywgKHN0KSkKKyNkZWZpbmUgc2tfQklPX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQklPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0JJT19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChCSU8sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT196ZXJvKHN0KSBTS01fc2tfemVybyhCSU8sIChzdCkpCisjZGVmaW5lIHNrX0JJT19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEJJTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEJJTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEJJTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEJJTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQklPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0JJT19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEJJTywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0JJT19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChCSU8sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0JJT19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhCSU8sIChzdCksIChjbXApKQorI2RlZmluZSBza19CSU9fZHVwKHN0KSBTS01fc2tfZHVwKEJJTywgc3QpCisjZGVmaW5lIHNrX0JJT19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQklPLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQklPX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQklPLCAoc3QpKQorI2RlZmluZSBza19CSU9fcG9wKHN0KSBTS01fc2tfcG9wKEJJTywgKHN0KSkKKyNkZWZpbmUgc2tfQklPX3NvcnQoc3QpIFNLTV9za19zb3J0KEJJTywgKHN0KSkKKyNkZWZpbmUgc2tfQklPX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChCSU8sIChzdCkpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX25ldyhjbXApIFNLTV9za19uZXcoQllfRElSX0VOVFJZLCAoY21wKSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEJZX0RJUl9FTlRSWSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX2ZyZWUoc3QpIFNLTV9za19mcmVlKEJZX0RJUl9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX251bShzdCkgU0tNX3NrX251bShCWV9ESVJfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEJZX0RJUl9FTlRSWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQllfRElSX0VOVFJZLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfemVybyhzdCkgU0tNX3NrX3plcm8oQllfRElSX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChCWV9ESVJfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChCWV9ESVJfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChCWV9ESVJfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChCWV9ESVJfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEJZX0RJUl9FTlRSWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihCWV9ESVJfRU5UUlksIChzdCksIChwdHIpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQllfRElSX0VOVFJZLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQllfRElSX0VOVFJZLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX2R1cChzdCkgU0tNX3NrX2R1cChCWV9ESVJfRU5UUlksIHN0KQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEJZX0RJUl9FTlRSWSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEJZX0RJUl9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX3BvcChzdCkgU0tNX3NrX3BvcChCWV9ESVJfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9zb3J0KHN0KSBTS01fc2tfc29ydChCWV9ESVJfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQllfRElSX0VOVFJZLCAoc3QpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX25ldyhjbXApIFNLTV9za19uZXcoQllfRElSX0hBU0gsIChjbXApKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChCWV9ESVJfSEFTSCkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQllfRElSX0hBU0gsIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX251bShzdCkgU0tNX3NrX251bShCWV9ESVJfSEFTSCwgKHN0KSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShCWV9ESVJfSEFTSCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChCWV9ESVJfSEFTSCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfemVybyhzdCkgU0tNX3NrX3plcm8oQllfRElSX0hBU0gsIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQllfRElSX0hBU0gsIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEJZX0RJUl9IQVNILCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChCWV9ESVJfSEFTSCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQllfRElSX0hBU0gsIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQllfRElSX0hBU0gsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihCWV9ESVJfSEFTSCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEJZX0RJUl9IQVNILCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhCWV9ESVJfSEFTSCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2R1cChzdCkgU0tNX3NrX2R1cChCWV9ESVJfSEFTSCwgc3QpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShCWV9ESVJfSEFTSCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQllfRElSX0hBU0gsIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3BvcChzdCkgU0tNX3NrX3BvcChCWV9ESVJfSEFTSCwgKHN0KSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfc29ydChzdCkgU0tNX3NrX3NvcnQoQllfRElSX0hBU0gsIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChCWV9ESVJfSEFTSCwgKHN0KSkKKworI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX25ldyhjbXApIFNLTV9za19uZXcoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKGNtcCkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcykKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19mcmVlKHN0KSBTS01fc2tfZnJlZShDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX251bShzdCkgU0tNX3NrX251bShDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKHN0KSwgKGkpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfemVybyhzdCkgU0tNX3NrX3plcm8oQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCksIChjbXApKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX2R1cChzdCkgU0tNX3NrX2R1cChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCBzdCkKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfc2hpZnQoc3QpIFNLTV9za19zaGlmdChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3BvcChzdCkgU0tNX3NrX3BvcChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3NvcnQoc3QpIFNLTV9za19zb3J0KENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCkpCisKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fbmV3KGNtcCkgU0tNX3NrX25ldyhDTVNfUmVjaXBpZW50SW5mbywgKGNtcCkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKENNU19SZWNpcGllbnRJbmZvKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb19mcmVlKHN0KSBTS01fc2tfZnJlZShDTVNfUmVjaXBpZW50SW5mbywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fbnVtKHN0KSBTS01fc2tfbnVtKENNU19SZWNpcGllbnRJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb196ZXJvKHN0KSBTS01fc2tfemVybyhDTVNfUmVjaXBpZW50SW5mbywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChDTVNfUmVjaXBpZW50SW5mbywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ01TX1JlY2lwaWVudEluZm8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChDTVNfUmVjaXBpZW50SW5mbywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDTVNfUmVjaXBpZW50SW5mbywgKHN0KSwgKGkpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQ01TX1JlY2lwaWVudEluZm8sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fZHVwKHN0KSBTS01fc2tfZHVwKENNU19SZWNpcGllbnRJbmZvLCBzdCkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fc2hpZnQoc3QpIFNLTV9za19zaGlmdChDTVNfUmVjaXBpZW50SW5mbywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fcG9wKHN0KSBTS01fc2tfcG9wKENNU19SZWNpcGllbnRJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb19zb3J0KHN0KSBTS01fc2tfc29ydChDTVNfUmVjaXBpZW50SW5mbywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9faXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENNU19SZWNpcGllbnRJbmZvLCAoc3QpKQorCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9uZXcoY21wKSBTS01fc2tfbmV3KENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKGNtcCkpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9mcmVlKHN0KSBTS01fc2tfZnJlZShDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCkpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9udW0oc3QpIFNLTV9za19udW0oQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmV2b2NhdGlvbkluZm9DaG9pY2VfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3plcm8oc3QpIFNLTV9za196ZXJvKENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9kdXAoc3QpIFNLTV9za19kdXAoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCBzdCkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19DTVNfUmV2b2NhdGlvbkluZm9DaG9pY2Vfc2hpZnQoc3QpIFNLTV9za19zaGlmdChDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCkpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9wb3Aoc3QpIFNLTV9za19wb3AoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmV2b2NhdGlvbkluZm9DaG9pY2Vfc29ydChzdCkgU0tNX3NrX3NvcnQoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmV2b2NhdGlvbkluZm9DaG9pY2VfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSkKKworI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19uZXcoY21wKSBTS01fc2tfbmV3KENNU19TaWduZXJJbmZvLCAoY21wKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQ01TX1NpZ25lckluZm8pCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX2ZyZWUoc3QpIFNLTV9za19mcmVlKENNU19TaWduZXJJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19udW0oc3QpIFNLTV9za19udW0oQ01TX1NpZ25lckluZm8sIChzdCkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQ01TX1NpZ25lckluZm8sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQ01TX1NpZ25lckluZm8sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX3plcm8oc3QpIFNLTV9za196ZXJvKENNU19TaWduZXJJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKENNU19TaWduZXJJbmZvLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChDTVNfU2lnbmVySW5mbywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoQ01TX1NpZ25lckluZm8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KENNU19TaWduZXJJbmZvLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKENNU19TaWduZXJJbmZvLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoQ01TX1NpZ25lckluZm8sIChzdCksIChwdHIpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChDTVNfU2lnbmVySW5mbywgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQ01TX1NpZ25lckluZm8sIChzdCksIChjbXApKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19kdXAoc3QpIFNLTV9za19kdXAoQ01TX1NpZ25lckluZm8sIHN0KQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQ01TX1NpZ25lckluZm8sIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KENNU19TaWduZXJJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19wb3Aoc3QpIFNLTV9za19wb3AoQ01TX1NpZ25lckluZm8sIChzdCkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX3NvcnQoc3QpIFNLTV9za19zb3J0KENNU19TaWduZXJJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQ01TX1NpZ25lckluZm8sIChzdCkpCisKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX25ldyhjbXApIFNLTV9za19uZXcoQ09ORl9JTU9EVUxFLCAoY21wKSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKENPTkZfSU1PRFVMRSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX2ZyZWUoc3QpIFNLTV9za19mcmVlKENPTkZfSU1PRFVMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX251bShzdCkgU0tNX3NrX251bShDT05GX0lNT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfSU1PRFVMRV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKENPTkZfSU1PRFVMRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQ09ORl9JTU9EVUxFLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfemVybyhzdCkgU0tNX3NrX3plcm8oQ09ORl9JTU9EVUxFLCAoc3QpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChDT05GX0lNT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChDT05GX0lNT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDT05GX0lNT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChDT05GX0lNT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKENPTkZfSU1PRFVMRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDT05GX0lNT0RVTEUsIChzdCksIChwdHIpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQ09ORl9JTU9EVUxFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQ09ORl9JTU9EVUxFLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX2R1cChzdCkgU0tNX3NrX2R1cChDT05GX0lNT0RVTEUsIHN0KQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKENPTkZfSU1PRFVMRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NPTkZfSU1PRFVMRV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KENPTkZfSU1PRFVMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX3BvcChzdCkgU0tNX3NrX3BvcChDT05GX0lNT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfSU1PRFVMRV9zb3J0KHN0KSBTS01fc2tfc29ydChDT05GX0lNT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfSU1PRFVMRV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQ09ORl9JTU9EVUxFLCAoc3QpKQorCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX25ldyhjbXApIFNLTV9za19uZXcoQ09ORl9NT0RVTEUsIChjbXApKQorI2RlZmluZSBza19DT05GX01PRFVMRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChDT05GX01PRFVMRSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQ09ORl9NT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX251bShzdCkgU0tNX3NrX251bShDT05GX01PRFVMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShDT05GX01PRFVMRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19DT05GX01PRFVMRV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChDT05GX01PRFVMRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfemVybyhzdCkgU0tNX3NrX3plcm8oQ09ORl9NT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQ09ORl9NT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX01PRFVMRV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KENPTkZfTU9EVUxFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDT05GX01PRFVMRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQ09ORl9NT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX01PRFVMRV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQ09ORl9NT0RVTEUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDT05GX01PRFVMRSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KENPTkZfTU9EVUxFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DT05GX01PRFVMRV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhDT05GX01PRFVMRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX2R1cChzdCkgU0tNX3NrX2R1cChDT05GX01PRFVMRSwgc3QpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShDT05GX01PRFVMRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQ09ORl9NT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX3BvcChzdCkgU0tNX3NrX3BvcChDT05GX01PRFVMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfc29ydChzdCkgU0tNX3NrX3NvcnQoQ09ORl9NT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChDT05GX01PRFVMRSwgKHN0KSkKKworI2RlZmluZSBza19DT05GX1ZBTFVFX25ldyhjbXApIFNLTV9za19uZXcoQ09ORl9WQUxVRSwgKGNtcCkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQ09ORl9WQUxVRSkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9mcmVlKHN0KSBTS01fc2tfZnJlZShDT05GX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX251bShzdCkgU0tNX3NrX251bShDT05GX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQ09ORl9WQUxVRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENPTkZfVkFMVUUsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfemVybyhzdCkgU0tNX3NrX3plcm8oQ09ORl9WQUxVRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKENPTkZfVkFMVUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ09ORl9WQUxVRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDT05GX1ZBTFVFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KENPTkZfVkFMVUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDT05GX1ZBTFVFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDT05GX1ZBTFVFLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChDT05GX1ZBTFVFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENPTkZfVkFMVUUsIChzdCksIChjbXApKQorI2RlZmluZSBza19DT05GX1ZBTFVFX2R1cChzdCkgU0tNX3NrX2R1cChDT05GX1ZBTFVFLCBzdCkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQ09ORl9WQUxVRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChDT05GX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3BvcChzdCkgU0tNX3NrX3BvcChDT05GX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3NvcnQoc3QpIFNLTV9za19zb3J0KENPTkZfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENPTkZfVkFMVUUsIChzdCkpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfbmV3KGNtcCkgU0tNX3NrX25ldyhDUllQVE9fRVhfREFUQV9GVU5DUywgKGNtcCkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKENSWVBUT19FWF9EQVRBX0ZVTkNTKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19mcmVlKHN0KSBTS01fc2tfZnJlZShDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfbnVtKHN0KSBTS01fc2tfbnVtKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU196ZXJvKHN0KSBTS01fc2tfemVybyhDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSwgKGkpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfZHVwKHN0KSBTS01fc2tfZHVwKENSWVBUT19FWF9EQVRBX0ZVTkNTLCBzdCkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1Nfc2hpZnQoc3QpIFNLTV9za19zaGlmdChDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcG9wKHN0KSBTS01fc2tfcG9wKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19zb3J0KHN0KSBTS01fc2tfc29ydChDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpKQorCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX25ldyhjbXApIFNLTV9za19uZXcoQ1JZUFRPX2R5bmxvY2ssIChjbXApKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChDUllQVE9fZHlubG9jaykKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQ1JZUFRPX2R5bmxvY2ssIChzdCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX251bShzdCkgU0tNX3NrX251bShDUllQVE9fZHlubG9jaywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShDUllQVE9fZHlubG9jaywgKHN0KSwgKGkpKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChDUllQVE9fZHlubG9jaywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfemVybyhzdCkgU0tNX3NrX3plcm8oQ1JZUFRPX2R5bmxvY2ssIChzdCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQ1JZUFRPX2R5bmxvY2ssIChzdCksICh2YWwpKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KENSWVBUT19keW5sb2NrLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDUllQVE9fZHlubG9jaywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQ1JZUFRPX2R5bmxvY2ssIChzdCksICh2YWwpKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQ1JZUFRPX2R5bmxvY2ssIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDUllQVE9fZHlubG9jaywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KENSWVBUT19keW5sb2NrLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhDUllQVE9fZHlubG9jaywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX2R1cChzdCkgU0tNX3NrX2R1cChDUllQVE9fZHlubG9jaywgc3QpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShDUllQVE9fZHlubG9jaywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQ1JZUFRPX2R5bmxvY2ssIChzdCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX3BvcChzdCkgU0tNX3NrX3BvcChDUllQVE9fZHlubG9jaywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfc29ydChzdCkgU0tNX3NrX3NvcnQoQ1JZUFRPX2R5bmxvY2ssIChzdCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChDUllQVE9fZHlubG9jaywgKHN0KSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX25ldyhjbXApIFNLTV9za19uZXcoRElTVF9QT0lOVCwgKGNtcCkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoRElTVF9QT0lOVCkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9mcmVlKHN0KSBTS01fc2tfZnJlZShESVNUX1BPSU5ULCAoc3QpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX251bShzdCkgU0tNX3NrX251bShESVNUX1BPSU5ULCAoc3QpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoRElTVF9QT0lOVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KERJU1RfUE9JTlQsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfemVybyhzdCkgU0tNX3NrX3plcm8oRElTVF9QT0lOVCwgKHN0KSkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKERJU1RfUE9JTlQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoRElTVF9QT0lOVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChESVNUX1BPSU5ULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KERJU1RfUE9JTlQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShESVNUX1BPSU5ULCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihESVNUX1BPSU5ULCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChESVNUX1BPSU5ULCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKERJU1RfUE9JTlQsIChzdCksIChjbXApKQorI2RlZmluZSBza19ESVNUX1BPSU5UX2R1cChzdCkgU0tNX3NrX2R1cChESVNUX1BPSU5ULCBzdCkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoRElTVF9QT0lOVCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfc2hpZnQoc3QpIFNLTV9za19zaGlmdChESVNUX1BPSU5ULCAoc3QpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3BvcChzdCkgU0tNX3NrX3BvcChESVNUX1BPSU5ULCAoc3QpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3NvcnQoc3QpIFNLTV9za19zb3J0KERJU1RfUE9JTlQsIChzdCkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKERJU1RfUE9JTlQsIChzdCkpCisKKyNkZWZpbmUgc2tfRU5HSU5FX25ldyhjbXApIFNLTV9za19uZXcoRU5HSU5FLCAoY21wKSkKKyNkZWZpbmUgc2tfRU5HSU5FX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEVOR0lORSkKKyNkZWZpbmUgc2tfRU5HSU5FX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVOR0lORSwgKHN0KSkKKyNkZWZpbmUgc2tfRU5HSU5FX251bShzdCkgU0tNX3NrX251bShFTkdJTkUsIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEVOR0lORSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FTkdJTkVfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRU5HSU5FLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfemVybyhzdCkgU0tNX3NrX3plcm8oRU5HSU5FLCAoc3QpKQorI2RlZmluZSBza19FTkdJTkVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChFTkdJTkUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFTkdJTkUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChFTkdJTkUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChFTkdJTkUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVOR0lORSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FTkdJTkVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihFTkdJTkUsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FTkdJTkVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoRU5HSU5FLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19FTkdJTkVfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRU5HSU5FLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfRU5HSU5FX2R1cChzdCkgU0tNX3NrX2R1cChFTkdJTkUsIHN0KQorI2RlZmluZSBza19FTkdJTkVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEVOR0lORSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0VOR0lORV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVOR0lORSwgKHN0KSkKKyNkZWZpbmUgc2tfRU5HSU5FX3BvcChzdCkgU0tNX3NrX3BvcChFTkdJTkUsIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9zb3J0KHN0KSBTS01fc2tfc29ydChFTkdJTkUsIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRU5HSU5FLCAoc3QpKQorCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fbmV3KGNtcCkgU0tNX3NrX25ldyhFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoY21wKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChFTkdJTkVfQ0xFQU5VUF9JVEVNKQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fbnVtKHN0KSBTS01fc2tfbnVtKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV96ZXJvKHN0KSBTS01fc2tfemVybyhFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoc3QpKQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCksIChwdHIpKQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fZHVwKHN0KSBTS01fc2tfZHVwKEVOR0lORV9DTEVBTlVQX0lURU0sIHN0KQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fcG9wKHN0KSBTS01fc2tfcG9wKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fc29ydChzdCkgU0tNX3NrX3NvcnQoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSkKKworI2RlZmluZSBza19FU1NfQ0VSVF9JRF9uZXcoY21wKSBTS01fc2tfbmV3KEVTU19DRVJUX0lELCAoY21wKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoRVNTX0NFUlRfSUQpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVTU19DRVJUX0lELCAoc3QpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9udW0oc3QpIFNLTV9za19udW0oRVNTX0NFUlRfSUQsIChzdCkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoRVNTX0NFUlRfSUQsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRVNTX0NFUlRfSUQsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX3plcm8oc3QpIFNLTV9za196ZXJvKEVTU19DRVJUX0lELCAoc3QpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEVTU19DRVJUX0lELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFU1NfQ0VSVF9JRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoRVNTX0NFUlRfSUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEVTU19DRVJUX0lELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVTU19DRVJUX0lELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoRVNTX0NFUlRfSUQsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChFU1NfQ0VSVF9JRCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRVNTX0NFUlRfSUQsIChzdCksIChjbXApKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9kdXAoc3QpIFNLTV9za19kdXAoRVNTX0NFUlRfSUQsIHN0KQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoRVNTX0NFUlRfSUQsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVTU19DRVJUX0lELCAoc3QpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9wb3Aoc3QpIFNLTV9za19wb3AoRVNTX0NFUlRfSUQsIChzdCkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX3NvcnQoc3QpIFNLTV9za19zb3J0KEVTU19DRVJUX0lELCAoc3QpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRVNTX0NFUlRfSUQsIChzdCkpCisKKyNkZWZpbmUgc2tfRVZQX01EX25ldyhjbXApIFNLTV9za19uZXcoRVZQX01ELCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX01EX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEVWUF9NRCkKKyNkZWZpbmUgc2tfRVZQX01EX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVWUF9NRCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX01EX251bShzdCkgU0tNX3NrX251bShFVlBfTUQsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9NRF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEVWUF9NRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfTURfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRVZQX01ELCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfemVybyhzdCkgU0tNX3NrX3plcm8oRVZQX01ELCAoc3QpKQorI2RlZmluZSBza19FVlBfTURfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChFVlBfTUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFVlBfTUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChFVlBfTUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChFVlBfTUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVWUF9NRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfTURfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihFVlBfTUQsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FVlBfTURfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoRVZQX01ELCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19FVlBfTURfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRVZQX01ELCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX01EX2R1cChzdCkgU0tNX3NrX2R1cChFVlBfTUQsIHN0KQorI2RlZmluZSBza19FVlBfTURfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEVWUF9NRCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0VWUF9NRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVWUF9NRCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX01EX3BvcChzdCkgU0tNX3NrX3BvcChFVlBfTUQsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9NRF9zb3J0KHN0KSBTS01fc2tfc29ydChFVlBfTUQsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9NRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRVZQX01ELCAoc3QpKQorCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX25ldyhjbXApIFNLTV9za19uZXcoRVZQX1BCRV9DVEwsIChjbXApKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChFVlBfUEJFX0NUTCkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfZnJlZShzdCkgU0tNX3NrX2ZyZWUoRVZQX1BCRV9DVEwsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX251bShzdCkgU0tNX3NrX251bShFVlBfUEJFX0NUTCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShFVlBfUEJFX0NUTCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChFVlBfUEJFX0NUTCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfemVybyhzdCkgU0tNX3NrX3plcm8oRVZQX1BCRV9DVEwsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goRVZQX1BCRV9DVEwsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEVWUF9QQkVfQ1RMLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChFVlBfUEJFX0NUTCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoRVZQX1BCRV9DVEwsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoRVZQX1BCRV9DVEwsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihFVlBfUEJFX0NUTCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEVWUF9QQkVfQ1RMLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhFVlBfUEJFX0NUTCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX2R1cChzdCkgU0tNX3NrX2R1cChFVlBfUEJFX0NUTCwgc3QpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShFVlBfUEJFX0NUTCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoRVZQX1BCRV9DVEwsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX3BvcChzdCkgU0tNX3NrX3BvcChFVlBfUEJFX0NUTCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfc29ydChzdCkgU0tNX3NrX3NvcnQoRVZQX1BCRV9DVEwsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChFVlBfUEJFX0NUTCwgKHN0KSkKKworI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9uZXcoY21wKSBTS01fc2tfbmV3KEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0RfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoRVZQX1BLRVlfQVNOMV9NRVRIT0QpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9udW0oc3QpIFNLTV9za19udW0oRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0Rfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3plcm8oc3QpIFNLTV9za196ZXJvKEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0RfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFVlBfUEtFWV9BU04xX01FVEhPRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0RfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChFVlBfUEtFWV9BU04xX01FVEhPRCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0Rfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChjbXApKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9kdXAoc3QpIFNLTV9za19kdXAoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIHN0KQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9wb3Aoc3QpIFNLTV9za19wb3AoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3NvcnQoc3QpIFNLTV9za19zb3J0KEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCkpCisKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX25ldyhjbXApIFNLTV9za19uZXcoRVZQX1BLRVlfTUVUSE9ELCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEVWUF9QS0VZX01FVEhPRCkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVWUF9QS0VZX01FVEhPRCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX251bShzdCkgU0tNX3NrX251bShFVlBfUEtFWV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX01FVEhPRF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEVWUF9QS0VZX01FVEhPRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0Rfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRVZQX1BLRVlfTUVUSE9ELCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfemVybyhzdCkgU0tNX3NrX3plcm8oRVZQX1BLRVlfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChFVlBfUEtFWV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFVlBfUEtFWV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChFVlBfUEtFWV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChFVlBfUEtFWV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVWUF9QS0VZX01FVEhPRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihFVlBfUEtFWV9NRVRIT0QsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoRVZQX1BLRVlfTUVUSE9ELCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0Rfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRVZQX1BLRVlfTUVUSE9ELCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX2R1cChzdCkgU0tNX3NrX2R1cChFVlBfUEtFWV9NRVRIT0QsIHN0KQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEVWUF9QS0VZX01FVEhPRCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0VWUF9QS0VZX01FVEhPRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVWUF9QS0VZX01FVEhPRCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX3BvcChzdCkgU0tNX3NrX3BvcChFVlBfUEtFWV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX01FVEhPRF9zb3J0KHN0KSBTS01fc2tfc29ydChFVlBfUEtFWV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX01FVEhPRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRVZQX1BLRVlfTUVUSE9ELCAoc3QpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9uZXcoY21wKSBTS01fc2tfbmV3KEdFTkVSQUxfTkFNRSwgKGNtcCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChHRU5FUkFMX05BTUUpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9mcmVlKHN0KSBTS01fc2tfZnJlZShHRU5FUkFMX05BTUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9udW0oc3QpIFNLTV9za19udW0oR0VORVJBTF9OQU1FLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShHRU5FUkFMX05BTUUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEdFTkVSQUxfTkFNRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3plcm8oc3QpIFNLTV9za196ZXJvKEdFTkVSQUxfTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goR0VORVJBTF9OQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoR0VORVJBTF9OQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoR0VORVJBTF9OQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoR0VORVJBTF9OQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShHRU5FUkFMX05BTUUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoR0VORVJBTF9OQU1FLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEdFTkVSQUxfTkFNRSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEdFTkVSQUxfTkFNRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9kdXAoc3QpIFNLTV9za19kdXAoR0VORVJBTF9OQU1FLCBzdCkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShHRU5FUkFMX05BTUUsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChHRU5FUkFMX05BTUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9wb3Aoc3QpIFNLTV9za19wb3AoR0VORVJBTF9OQU1FLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVfc29ydChzdCkgU0tNX3NrX3NvcnQoR0VORVJBTF9OQU1FLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEdFTkVSQUxfTkFNRSwgKHN0KSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVTX25ldyhjbXApIFNLTV9za19uZXcoR0VORVJBTF9OQU1FUywgKGNtcCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoR0VORVJBTF9OQU1FUykKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19mcmVlKHN0KSBTS01fc2tfZnJlZShHRU5FUkFMX05BTUVTLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX251bShzdCkgU0tNX3NrX251bShHRU5FUkFMX05BTUVTLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoR0VORVJBTF9OQU1FUywgKHN0KSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEdFTkVSQUxfTkFNRVMsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfemVybyhzdCkgU0tNX3NrX3plcm8oR0VORVJBTF9OQU1FUywgKHN0KSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEdFTkVSQUxfTkFNRVMsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoR0VORVJBTF9OQU1FUywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChHRU5FUkFMX05BTUVTLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEdFTkVSQUxfTkFNRVMsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShHRU5FUkFMX05BTUVTLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihHRU5FUkFMX05BTUVTLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChHRU5FUkFMX05BTUVTLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEdFTkVSQUxfTkFNRVMsIChzdCksIChjbXApKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX2R1cChzdCkgU0tNX3NrX2R1cChHRU5FUkFMX05BTUVTLCBzdCkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoR0VORVJBTF9OQU1FUywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfc2hpZnQoc3QpIFNLTV9za19zaGlmdChHRU5FUkFMX05BTUVTLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3BvcChzdCkgU0tNX3NrX3BvcChHRU5FUkFMX05BTUVTLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3NvcnQoc3QpIFNLTV9za19zb3J0KEdFTkVSQUxfTkFNRVMsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEdFTkVSQUxfTkFNRVMsIChzdCkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX25ldyhjbXApIFNLTV9za19uZXcoR0VORVJBTF9TVUJUUkVFLCAoY21wKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEdFTkVSQUxfU1VCVFJFRSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX2ZyZWUoc3QpIFNLTV9za19mcmVlKEdFTkVSQUxfU1VCVFJFRSwgKHN0KSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX251bShzdCkgU0tNX3NrX251bShHRU5FUkFMX1NVQlRSRUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEdFTkVSQUxfU1VCVFJFRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoR0VORVJBTF9TVUJUUkVFLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfemVybyhzdCkgU0tNX3NrX3plcm8oR0VORVJBTF9TVUJUUkVFLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChHRU5FUkFMX1NVQlRSRUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChHRU5FUkFMX1NVQlRSRUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChHRU5FUkFMX1NVQlRSRUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChHRU5FUkFMX1NVQlRSRUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEdFTkVSQUxfU1VCVFJFRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihHRU5FUkFMX1NVQlRSRUUsIChzdCksIChwdHIpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoR0VORVJBTF9TVUJUUkVFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoR0VORVJBTF9TVUJUUkVFLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX2R1cChzdCkgU0tNX3NrX2R1cChHRU5FUkFMX1NVQlRSRUUsIHN0KQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEdFTkVSQUxfU1VCVFJFRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEdFTkVSQUxfU1VCVFJFRSwgKHN0KSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX3BvcChzdCkgU0tNX3NrX3BvcChHRU5FUkFMX1NVQlRSRUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9zb3J0KHN0KSBTS01fc2tfc29ydChHRU5FUkFMX1NVQlRSRUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoR0VORVJBTF9TVUJUUkVFLCAoc3QpKQorCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9uZXcoY21wKSBTS01fc2tfbmV3KElQQWRkcmVzc0ZhbWlseSwgKGNtcCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChJUEFkZHJlc3NGYW1pbHkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9mcmVlKHN0KSBTS01fc2tfZnJlZShJUEFkZHJlc3NGYW1pbHksIChzdCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9udW0oc3QpIFNLTV9za19udW0oSVBBZGRyZXNzRmFtaWx5LCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NGYW1pbHlfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShJUEFkZHJlc3NGYW1pbHksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KElQQWRkcmVzc0ZhbWlseSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3plcm8oc3QpIFNLTV9za196ZXJvKElQQWRkcmVzc0ZhbWlseSwgKHN0KSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShJUEFkZHJlc3NGYW1pbHksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KElQQWRkcmVzc0ZhbWlseSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKElQQWRkcmVzc0ZhbWlseSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9kdXAoc3QpIFNLTV9za19kdXAoSVBBZGRyZXNzRmFtaWx5LCBzdCkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShJUEFkZHJlc3NGYW1pbHksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19JUEFkZHJlc3NGYW1pbHlfc2hpZnQoc3QpIFNLTV9za19zaGlmdChJUEFkZHJlc3NGYW1pbHksIChzdCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9wb3Aoc3QpIFNLTV9za19wb3AoSVBBZGRyZXNzRmFtaWx5LCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NGYW1pbHlfc29ydChzdCkgU0tNX3NrX3NvcnQoSVBBZGRyZXNzRmFtaWx5LCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NGYW1pbHlfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKElQQWRkcmVzc0ZhbWlseSwgKHN0KSkKKworI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX25ldyhjbXApIFNLTV9za19uZXcoSVBBZGRyZXNzT3JSYW5nZSwgKGNtcCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoSVBBZGRyZXNzT3JSYW5nZSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9mcmVlKHN0KSBTS01fc2tfZnJlZShJUEFkZHJlc3NPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX251bShzdCkgU0tNX3NrX251bShJUEFkZHJlc3NPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoSVBBZGRyZXNzT3JSYW5nZSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KElQQWRkcmVzc09yUmFuZ2UsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfemVybyhzdCkgU0tNX3NrX3plcm8oSVBBZGRyZXNzT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKElQQWRkcmVzc09yUmFuZ2UsIChzdCksICh2YWwpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoSVBBZGRyZXNzT3JSYW5nZSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChJUEFkZHJlc3NPclJhbmdlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KElQQWRkcmVzc09yUmFuZ2UsIChzdCksICh2YWwpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShJUEFkZHJlc3NPclJhbmdlLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihJUEFkZHJlc3NPclJhbmdlLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChJUEFkZHJlc3NPclJhbmdlLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKElQQWRkcmVzc09yUmFuZ2UsIChzdCksIChjbXApKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX2R1cChzdCkgU0tNX3NrX2R1cChJUEFkZHJlc3NPclJhbmdlLCBzdCkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoSVBBZGRyZXNzT3JSYW5nZSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2Vfc2hpZnQoc3QpIFNLTV9za19zaGlmdChJUEFkZHJlc3NPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3BvcChzdCkgU0tNX3NrX3BvcChJUEFkZHJlc3NPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3NvcnQoc3QpIFNLTV9za19zb3J0KElQQWRkcmVzc09yUmFuZ2UsIChzdCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKElQQWRkcmVzc09yUmFuZ2UsIChzdCkpCisKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfbmV3KGNtcCkgU0tNX3NrX25ldyhLUkI1X0FQUkVRQk9EWSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEtSQjVfQVBSRVFCT0RZKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X0FQUkVRQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfbnVtKHN0KSBTS01fc2tfbnVtKEtSQjVfQVBSRVFCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV96ZXJvKHN0KSBTS01fc2tfemVybyhLUkI1X0FQUkVRQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChLUkI1X0FQUkVRQk9EWSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9BUFJFUUJPRFksIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChLUkI1X0FQUkVRQk9EWSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X0FQUkVRQk9EWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoS1JCNV9BUFJFUUJPRFksIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfZHVwKHN0KSBTS01fc2tfZHVwKEtSQjVfQVBSRVFCT0RZLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X0FQUkVRQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfcG9wKHN0KSBTS01fc2tfcG9wKEtSQjVfQVBSRVFCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV9zb3J0KHN0KSBTS01fc2tfc29ydChLUkI1X0FQUkVRQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfQVBSRVFCT0RZLCAoc3QpKQorCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfbmV3KGNtcCkgU0tNX3NrX25ldyhLUkI1X0FVVEhEQVRBLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChLUkI1X0FVVEhEQVRBKQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX2ZyZWUoc3QpIFNLTV9za19mcmVlKEtSQjVfQVVUSERBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfbnVtKHN0KSBTS01fc2tfbnVtKEtSQjVfQVVUSERBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShLUkI1X0FVVEhEQVRBLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoS1JCNV9BVVRIREFUQSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV96ZXJvKHN0KSBTS01fc2tfemVybyhLUkI1X0FVVEhEQVRBLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goS1JCNV9BVVRIREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChLUkI1X0FVVEhEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEtSQjVfQVVUSERBVEEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoS1JCNV9BVVRIREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEtSQjVfQVVUSERBVEEsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEtSQjVfQVVUSERBVEEsIChzdCksIChwdHIpKQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEtSQjVfQVVUSERBVEEsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoS1JCNV9BVVRIREFUQSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfZHVwKHN0KSBTS01fc2tfZHVwKEtSQjVfQVVUSERBVEEsIHN0KQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShLUkI1X0FVVEhEQVRBLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEtSQjVfQVVUSERBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfcG9wKHN0KSBTS01fc2tfcG9wKEtSQjVfQVVUSERBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfc29ydChzdCkgU0tNX3NrX3NvcnQoS1JCNV9BVVRIREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoS1JCNV9BVVRIREFUQSwgKHN0KSkKKworI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX25ldyhjbXApIFNLTV9za19uZXcoS1JCNV9BVVRIRU5UQk9EWSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoS1JCNV9BVVRIRU5UQk9EWSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X0FVVEhFTlRCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX251bShzdCkgU0tNX3NrX251bShLUkI1X0FVVEhFTlRCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoS1JCNV9BVVRIRU5UQk9EWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfQVVUSEVOVEJPRFksIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfemVybyhzdCkgU0tNX3NrX3plcm8oS1JCNV9BVVRIRU5UQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEtSQjVfQVVUSEVOVEJPRFksIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9BVVRIRU5UQk9EWSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChLUkI1X0FVVEhFTlRCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEtSQjVfQVVUSEVOVEJPRFksIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X0FVVEhFTlRCT0RZLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihLUkI1X0FVVEhFTlRCT0RZLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChLUkI1X0FVVEhFTlRCT0RZLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfQVVUSEVOVEJPRFksIChzdCksIChjbXApKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX2R1cChzdCkgU0tNX3NrX2R1cChLUkI1X0FVVEhFTlRCT0RZLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoS1JCNV9BVVRIRU5UQk9EWSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X0FVVEhFTlRCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3BvcChzdCkgU0tNX3NrX3BvcChLUkI1X0FVVEhFTlRCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3NvcnQoc3QpIFNLTV9za19zb3J0KEtSQjVfQVVUSEVOVEJPRFksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfQVVUSEVOVEJPRFksIChzdCkpCisKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9uZXcoY21wKSBTS01fc2tfbmV3KEtSQjVfQ0hFQ0tTVU0sIChjbXApKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEtSQjVfQ0hFQ0tTVU0pCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1fZnJlZShzdCkgU0tNX3NrX2ZyZWUoS1JCNV9DSEVDS1NVTSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9udW0oc3QpIFNLTV9za19udW0oS1JCNV9DSEVDS1NVTSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEtSQjVfQ0hFQ0tTVU0sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChLUkI1X0NIRUNLU1VNLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX3plcm8oc3QpIFNLTV9za196ZXJvKEtSQjVfQ0hFQ0tTVU0sIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChLUkI1X0NIRUNLU1VNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEtSQjVfQ0hFQ0tTVU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoS1JCNV9DSEVDS1NVTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChLUkI1X0NIRUNLU1VNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoS1JCNV9DSEVDS1NVTSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoS1JCNV9DSEVDS1NVTSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoS1JCNV9DSEVDS1NVTSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhLUkI1X0NIRUNLU1VNLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9kdXAoc3QpIFNLTV9za19kdXAoS1JCNV9DSEVDS1NVTSwgc3QpCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEtSQjVfQ0hFQ0tTVU0sIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoS1JCNV9DSEVDS1NVTSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9wb3Aoc3QpIFNLTV9za19wb3AoS1JCNV9DSEVDS1NVTSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9zb3J0KHN0KSBTS01fc2tfc29ydChLUkI1X0NIRUNLU1VNLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChLUkI1X0NIRUNLU1VNLCAoc3QpKQorCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9uZXcoY21wKSBTS01fc2tfbmV3KEtSQjVfRU5DREFUQSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChLUkI1X0VOQ0RBVEEpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X0VOQ0RBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9udW0oc3QpIFNLTV9za19udW0oS1JCNV9FTkNEQVRBLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0RBVEFfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShLUkI1X0VOQ0RBVEEsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfRU5DREFUQSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3plcm8oc3QpIFNLTV9za196ZXJvKEtSQjVfRU5DREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goS1JCNV9FTkNEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9FTkNEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoS1JCNV9FTkNEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoS1JCNV9FTkNEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X0VOQ0RBVEEsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoS1JCNV9FTkNEQVRBLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEtSQjVfRU5DREFUQSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfRU5DREFUQSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9kdXAoc3QpIFNLTV9za19kdXAoS1JCNV9FTkNEQVRBLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShLUkI1X0VOQ0RBVEEsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19LUkI1X0VOQ0RBVEFfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X0VOQ0RBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9wb3Aoc3QpIFNLTV9za19wb3AoS1JCNV9FTkNEQVRBLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0RBVEFfc29ydChzdCkgU0tNX3NrX3NvcnQoS1JCNV9FTkNEQVRBLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0RBVEFfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfRU5DREFUQSwgKHN0KSkKKworI2RlZmluZSBza19LUkI1X0VOQ0tFWV9uZXcoY21wKSBTS01fc2tfbmV3KEtSQjVfRU5DS0VZLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoS1JCNV9FTkNLRVkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX2ZyZWUoc3QpIFNLTV9za19mcmVlKEtSQjVfRU5DS0VZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9udW0oc3QpIFNLTV9za19udW0oS1JCNV9FTkNLRVksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoS1JCNV9FTkNLRVksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoS1JCNV9FTkNLRVksIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX3plcm8oc3QpIFNLTV9za196ZXJvKEtSQjVfRU5DS0VZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEtSQjVfRU5DS0VZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChLUkI1X0VOQ0tFWSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoS1JCNV9FTkNLRVksIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEtSQjVfRU5DS0VZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEtSQjVfRU5DS0VZLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoS1JCNV9FTkNLRVksIChzdCksIChwdHIpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChLUkI1X0VOQ0tFWSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoS1JCNV9FTkNLRVksIChzdCksIChjbXApKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9kdXAoc3QpIFNLTV9za19kdXAoS1JCNV9FTkNLRVksIHN0KQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoS1JCNV9FTkNLRVksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEtSQjVfRU5DS0VZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9wb3Aoc3QpIFNLTV9za19wb3AoS1JCNV9FTkNLRVksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX3NvcnQoc3QpIFNLTV9za19zb3J0KEtSQjVfRU5DS0VZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoS1JCNV9FTkNLRVksIChzdCkpCisKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfbmV3KGNtcCkgU0tNX3NrX25ldyhLUkI1X1BSSU5DTkFNRSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEtSQjVfUFJJTkNOQU1FKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X1BSSU5DTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfbnVtKHN0KSBTS01fc2tfbnVtKEtSQjVfUFJJTkNOQU1FLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV96ZXJvKHN0KSBTS01fc2tfemVybyhLUkI1X1BSSU5DTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChLUkI1X1BSSU5DTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9QUklOQ05BTUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChLUkI1X1BSSU5DTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X1BSSU5DTkFNRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoS1JCNV9QUklOQ05BTUUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfZHVwKHN0KSBTS01fc2tfZHVwKEtSQjVfUFJJTkNOQU1FLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X1BSSU5DTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfcG9wKHN0KSBTS01fc2tfcG9wKEtSQjVfUFJJTkNOQU1FLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV9zb3J0KHN0KSBTS01fc2tfc29ydChLUkI1X1BSSU5DTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfUFJJTkNOQU1FLCAoc3QpKQorCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9uZXcoY21wKSBTS01fc2tfbmV3KEtSQjVfVEtUQk9EWSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChLUkI1X1RLVEJPRFkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X1RLVEJPRFksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9udW0oc3QpIFNLTV9za19udW0oS1JCNV9US1RCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1RLVEJPRFlfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShLUkI1X1RLVEJPRFksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfVEtUQk9EWSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3plcm8oc3QpIFNLTV9za196ZXJvKEtSQjVfVEtUQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goS1JCNV9US1RCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9US1RCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoS1JCNV9US1RCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoS1JCNV9US1RCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X1RLVEJPRFksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoS1JCNV9US1RCT0RZLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEtSQjVfVEtUQk9EWSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfVEtUQk9EWSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9kdXAoc3QpIFNLTV9za19kdXAoS1JCNV9US1RCT0RZLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShLUkI1X1RLVEJPRFksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19LUkI1X1RLVEJPRFlfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X1RLVEJPRFksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9wb3Aoc3QpIFNLTV9za19wb3AoS1JCNV9US1RCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1RLVEJPRFlfc29ydChzdCkgU0tNX3NrX3NvcnQoS1JCNV9US1RCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1RLVEJPRFlfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfVEtUQk9EWSwgKHN0KSkKKworI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfbmV3KGNtcCkgU0tNX3NrX25ldyhNRU1fT0JKRUNUX0RBVEEsIChjbXApKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoTUVNX09CSkVDVF9EQVRBKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfZnJlZShzdCkgU0tNX3NrX2ZyZWUoTUVNX09CSkVDVF9EQVRBLCAoc3QpKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfbnVtKHN0KSBTS01fc2tfbnVtKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfTUVNX09CSkVDVF9EQVRBX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoTUVNX09CSkVDVF9EQVRBLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChNRU1fT0JKRUNUX0RBVEEsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV96ZXJvKHN0KSBTS01fc2tfemVybyhNRU1fT0JKRUNUX0RBVEEsIChzdCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoTUVNX09CSkVDVF9EQVRBLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChNRU1fT0JKRUNUX0RBVEEsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhNRU1fT0JKRUNUX0RBVEEsIChzdCksIChjbXApKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfZHVwKHN0KSBTS01fc2tfZHVwKE1FTV9PQkpFQ1RfREFUQSwgc3QpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoTUVNX09CSkVDVF9EQVRBLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfTUVNX09CSkVDVF9EQVRBX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoTUVNX09CSkVDVF9EQVRBLCAoc3QpKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfcG9wKHN0KSBTS01fc2tfcG9wKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfTUVNX09CSkVDVF9EQVRBX3NvcnQoc3QpIFNLTV9za19zb3J0KE1FTV9PQkpFQ1RfREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfTUVNX09CSkVDVF9EQVRBX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChNRU1fT0JKRUNUX0RBVEEsIChzdCkpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfbmV3KGNtcCkgU0tNX3NrX25ldyhNSU1FX0hFQURFUiwgKGNtcCkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKE1JTUVfSEVBREVSKQorI2RlZmluZSBza19NSU1FX0hFQURFUl9mcmVlKHN0KSBTS01fc2tfZnJlZShNSU1FX0hFQURFUiwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfbnVtKHN0KSBTS01fc2tfbnVtKE1JTUVfSEVBREVSLCAoc3QpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKE1JTUVfSEVBREVSLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KE1JTUVfSEVBREVSLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl96ZXJvKHN0KSBTS01fc2tfemVybyhNSU1FX0hFQURFUiwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChNSU1FX0hFQURFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoTUlNRV9IRUFERVIsIChzdCksICh2YWwpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKE1JTUVfSEVBREVSLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChNSU1FX0hFQURFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShNSU1FX0hFQURFUiwgKHN0KSwgKGkpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKE1JTUVfSEVBREVSLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoTUlNRV9IRUFERVIsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKE1JTUVfSEVBREVSLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfZHVwKHN0KSBTS01fc2tfZHVwKE1JTUVfSEVBREVSLCBzdCkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKE1JTUVfSEVBREVSLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfc2hpZnQoc3QpIFNLTV9za19zaGlmdChNSU1FX0hFQURFUiwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfcG9wKHN0KSBTS01fc2tfcG9wKE1JTUVfSEVBREVSLCAoc3QpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl9zb3J0KHN0KSBTS01fc2tfc29ydChNSU1FX0hFQURFUiwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKE1JTUVfSEVBREVSLCAoc3QpKQorCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fbmV3KGNtcCkgU0tNX3NrX25ldyhNSU1FX1BBUkFNLCAoY21wKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChNSU1FX1BBUkFNKQorI2RlZmluZSBza19NSU1FX1BBUkFNX2ZyZWUoc3QpIFNLTV9za19mcmVlKE1JTUVfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fbnVtKHN0KSBTS01fc2tfbnVtKE1JTUVfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShNSU1FX1BBUkFNLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoTUlNRV9QQVJBTSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV96ZXJvKHN0KSBTS01fc2tfemVybyhNSU1FX1BBUkFNLCAoc3QpKQorI2RlZmluZSBza19NSU1FX1BBUkFNX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goTUlNRV9QQVJBTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChNSU1FX1BBUkFNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKE1JTUVfUEFSQU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19NSU1FX1BBUkFNX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoTUlNRV9QQVJBTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE1JTUVfUEFSQU0sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKE1JTUVfUEFSQU0sIChzdCksIChwdHIpKQorI2RlZmluZSBza19NSU1FX1BBUkFNX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KE1JTUVfUEFSQU0sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoTUlNRV9QQVJBTSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fZHVwKHN0KSBTS01fc2tfZHVwKE1JTUVfUEFSQU0sIHN0KQorI2RlZmluZSBza19NSU1FX1BBUkFNX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShNSU1FX1BBUkFNLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KE1JTUVfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fcG9wKHN0KSBTS01fc2tfcG9wKE1JTUVfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fc29ydChzdCkgU0tNX3NrX3NvcnQoTUlNRV9QQVJBTSwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoTUlNRV9QQVJBTSwgKHN0KSkKKworI2RlZmluZSBza19OQU1FX0ZVTkNTX25ldyhjbXApIFNLTV9za19uZXcoTkFNRV9GVU5DUywgKGNtcCkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoTkFNRV9GVU5DUykKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19mcmVlKHN0KSBTS01fc2tfZnJlZShOQU1FX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX251bShzdCkgU0tNX3NrX251bShOQU1FX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoTkFNRV9GVU5DUywgKHN0KSwgKGkpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KE5BTUVfRlVOQ1MsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfemVybyhzdCkgU0tNX3NrX3plcm8oTkFNRV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKE5BTUVfRlVOQ1MsIChzdCksICh2YWwpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoTkFNRV9GVU5DUywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChOQU1FX0ZVTkNTLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KE5BTUVfRlVOQ1MsIChzdCksICh2YWwpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShOQU1FX0ZVTkNTLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihOQU1FX0ZVTkNTLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChOQU1FX0ZVTkNTLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKE5BTUVfRlVOQ1MsIChzdCksIChjbXApKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX2R1cChzdCkgU0tNX3NrX2R1cChOQU1FX0ZVTkNTLCBzdCkKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoTkFNRV9GVU5DUywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1Nfc2hpZnQoc3QpIFNLTV9za19zaGlmdChOQU1FX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3BvcChzdCkgU0tNX3NrX3BvcChOQU1FX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3NvcnQoc3QpIFNLTV9za19zb3J0KE5BTUVfRlVOQ1MsIChzdCkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKE5BTUVfRlVOQ1MsIChzdCkpCisKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfbmV3KGNtcCkgU0tNX3NrX25ldyhPQ1NQX0NFUlRJRCwgKGNtcCkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKE9DU1BfQ0VSVElEKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF9mcmVlKHN0KSBTS01fc2tfZnJlZShPQ1NQX0NFUlRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfbnVtKHN0KSBTS01fc2tfbnVtKE9DU1BfQ0VSVElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKE9DU1BfQ0VSVElELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KE9DU1BfQ0VSVElELCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF96ZXJvKHN0KSBTS01fc2tfemVybyhPQ1NQX0NFUlRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChPQ1NQX0NFUlRJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoT0NTUF9DRVJUSUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKE9DU1BfQ0VSVElELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChPQ1NQX0NFUlRJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShPQ1NQX0NFUlRJRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKE9DU1BfQ0VSVElELCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoT0NTUF9DRVJUSUQsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKE9DU1BfQ0VSVElELCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfZHVwKHN0KSBTS01fc2tfZHVwKE9DU1BfQ0VSVElELCBzdCkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKE9DU1BfQ0VSVElELCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfc2hpZnQoc3QpIFNLTV9za19zaGlmdChPQ1NQX0NFUlRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfcG9wKHN0KSBTS01fc2tfcG9wKE9DU1BfQ0VSVElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF9zb3J0KHN0KSBTS01fc2tfc29ydChPQ1NQX0NFUlRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKE9DU1BfQ0VSVElELCAoc3QpKQorCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX25ldyhjbXApIFNLTV9za19uZXcoT0NTUF9PTkVSRVEsIChjbXApKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChPQ1NQX09ORVJFUSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfZnJlZShzdCkgU0tNX3NrX2ZyZWUoT0NTUF9PTkVSRVEsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX251bShzdCkgU0tNX3NrX251bShPQ1NQX09ORVJFUSwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShPQ1NQX09ORVJFUSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChPQ1NQX09ORVJFUSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfemVybyhzdCkgU0tNX3NrX3plcm8oT0NTUF9PTkVSRVEsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goT0NTUF9PTkVSRVEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KE9DU1BfT05FUkVRLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChPQ1NQX09ORVJFUSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoT0NTUF9PTkVSRVEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoT0NTUF9PTkVSRVEsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihPQ1NQX09ORVJFUSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KE9DU1BfT05FUkVRLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhPQ1NQX09ORVJFUSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX2R1cChzdCkgU0tNX3NrX2R1cChPQ1NQX09ORVJFUSwgc3QpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShPQ1NQX09ORVJFUSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoT0NTUF9PTkVSRVEsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX3BvcChzdCkgU0tNX3NrX3BvcChPQ1NQX09ORVJFUSwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfc29ydChzdCkgU0tNX3NrX3NvcnQoT0NTUF9PTkVSRVEsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChPQ1NQX09ORVJFUSwgKHN0KSkKKworI2RlZmluZSBza19PQ1NQX1JFU1BJRF9uZXcoY21wKSBTS01fc2tfbmV3KE9DU1BfUkVTUElELCAoY21wKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoT0NTUF9SRVNQSUQpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX2ZyZWUoc3QpIFNLTV9za19mcmVlKE9DU1BfUkVTUElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9udW0oc3QpIFNLTV9za19udW0oT0NTUF9SRVNQSUQsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoT0NTUF9SRVNQSUQsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoT0NTUF9SRVNQSUQsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX3plcm8oc3QpIFNLTV9za196ZXJvKE9DU1BfUkVTUElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKE9DU1BfUkVTUElELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChPQ1NQX1JFU1BJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoT0NTUF9SRVNQSUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KE9DU1BfUkVTUElELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE9DU1BfUkVTUElELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoT0NTUF9SRVNQSUQsIChzdCksIChwdHIpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChPQ1NQX1JFU1BJRCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoT0NTUF9SRVNQSUQsIChzdCksIChjbXApKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9kdXAoc3QpIFNLTV9za19kdXAoT0NTUF9SRVNQSUQsIHN0KQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoT0NTUF9SRVNQSUQsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KE9DU1BfUkVTUElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9wb3Aoc3QpIFNLTV9za19wb3AoT0NTUF9SRVNQSUQsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX3NvcnQoc3QpIFNLTV9za19zb3J0KE9DU1BfUkVTUElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoT0NTUF9SRVNQSUQsIChzdCkpCisKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX25ldyhjbXApIFNLTV9za19uZXcoT0NTUF9TSU5HTEVSRVNQLCAoY21wKSkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKE9DU1BfU0lOR0xFUkVTUCkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX2ZyZWUoc3QpIFNLTV9za19mcmVlKE9DU1BfU0lOR0xFUkVTUCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX251bShzdCkgU0tNX3NrX251bShPQ1NQX1NJTkdMRVJFU1AsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfU0lOR0xFUkVTUF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKE9DU1BfU0lOR0xFUkVTUCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1Bfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoT0NTUF9TSU5HTEVSRVNQLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfemVybyhzdCkgU0tNX3NrX3plcm8oT0NTUF9TSU5HTEVSRVNQLCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChPQ1NQX1NJTkdMRVJFU1AsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChPQ1NQX1NJTkdMRVJFU1AsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChPQ1NQX1NJTkdMRVJFU1AsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChPQ1NQX1NJTkdMRVJFU1AsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE9DU1BfU0lOR0xFUkVTUCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihPQ1NQX1NJTkdMRVJFU1AsIChzdCksIChwdHIpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoT0NTUF9TSU5HTEVSRVNQLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1Bfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoT0NTUF9TSU5HTEVSRVNQLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX2R1cChzdCkgU0tNX3NrX2R1cChPQ1NQX1NJTkdMRVJFU1AsIHN0KQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKE9DU1BfU0lOR0xFUkVTUCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX09DU1BfU0lOR0xFUkVTUF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KE9DU1BfU0lOR0xFUkVTUCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX3BvcChzdCkgU0tNX3NrX3BvcChPQ1NQX1NJTkdMRVJFU1AsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfU0lOR0xFUkVTUF9zb3J0KHN0KSBTS01fc2tfc29ydChPQ1NQX1NJTkdMRVJFU1AsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfU0lOR0xFUkVTUF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoT0NTUF9TSU5HTEVSRVNQLCAoc3QpKQorCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX25ldyhjbXApIFNLTV9za19uZXcoUEtDUzEyX1NBRkVCQUcsIChjbXApKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChQS0NTMTJfU0FGRUJBRykKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfZnJlZShzdCkgU0tNX3NrX2ZyZWUoUEtDUzEyX1NBRkVCQUcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX251bShzdCkgU0tNX3NrX251bShQS0NTMTJfU0FGRUJBRywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfemVybyhzdCkgU0tNX3NrX3plcm8oUEtDUzEyX1NBRkVCQUcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goUEtDUzEyX1NBRkVCQUcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFBLQ1MxMl9TQUZFQkFHLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChQS0NTMTJfU0FGRUJBRywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoUEtDUzEyX1NBRkVCQUcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoUEtDUzEyX1NBRkVCQUcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihQS0NTMTJfU0FGRUJBRywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFBLQ1MxMl9TQUZFQkFHLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX2R1cChzdCkgU0tNX3NrX2R1cChQS0NTMTJfU0FGRUJBRywgc3QpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoUEtDUzEyX1NBRkVCQUcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX3BvcChzdCkgU0tNX3NrX3BvcChQS0NTMTJfU0FGRUJBRywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfc29ydChzdCkgU0tNX3NrX3NvcnQoUEtDUzEyX1NBRkVCQUcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChQS0NTMTJfU0FGRUJBRywgKHN0KSkKKworI2RlZmluZSBza19QS0NTN19uZXcoY21wKSBTS01fc2tfbmV3KFBLQ1M3LCAoY21wKSkKKyNkZWZpbmUgc2tfUEtDUzdfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoUEtDUzcpCisjZGVmaW5lIHNrX1BLQ1M3X2ZyZWUoc3QpIFNLTV9za19mcmVlKFBLQ1M3LCAoc3QpKQorI2RlZmluZSBza19QS0NTN19udW0oc3QpIFNLTV9za19udW0oUEtDUzcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoUEtDUzcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoUEtDUzcsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1M3X3plcm8oc3QpIFNLTV9za196ZXJvKFBLQ1M3LCAoc3QpKQorI2RlZmluZSBza19QS0NTN19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFBLQ1M3LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChQS0NTNywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1M3X2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoUEtDUzcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFBLQ1M3LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFBLQ1M3LCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1BLQ1M3X2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoUEtDUzcsIChzdCksIChwdHIpKQorI2RlZmluZSBza19QS0NTN19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChQS0NTNywgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoUEtDUzcsIChzdCksIChjbXApKQorI2RlZmluZSBza19QS0NTN19kdXAoc3QpIFNLTV9za19kdXAoUEtDUzcsIHN0KQorI2RlZmluZSBza19QS0NTN19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoUEtDUzcsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19QS0NTN19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFBLQ1M3LCAoc3QpKQorI2RlZmluZSBza19QS0NTN19wb3Aoc3QpIFNLTV9za19wb3AoUEtDUzcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X3NvcnQoc3QpIFNLTV9za19zb3J0KFBLQ1M3LCAoc3QpKQorI2RlZmluZSBza19QS0NTN19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoUEtDUzcsIChzdCkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19uZXcoY21wKSBTS01fc2tfbmV3KFBLQ1M3X1JFQ0lQX0lORk8sIChjbXApKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFBLQ1M3X1JFQ0lQX0lORk8pCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZnJlZShzdCkgU0tNX3NrX2ZyZWUoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19udW0oc3QpIFNLTV9za19udW0oUEtDUzdfUkVDSVBfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFBLQ1M3X1JFQ0lQX0lORk8sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3plcm8oc3QpIFNLTV9za196ZXJvKFBLQ1M3X1JFQ0lQX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFBLQ1M3X1JFQ0lQX0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kdXAoc3QpIFNLTV9za19kdXAoUEtDUzdfUkVDSVBfSU5GTywgc3QpCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFBLQ1M3X1JFQ0lQX0lORk8sIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19wb3Aoc3QpIFNLTV9za19wb3AoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zb3J0KHN0KSBTS01fc2tfc29ydChQS0NTN19SRUNJUF9JTkZPLCAoc3QpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChQS0NTN19SRUNJUF9JTkZPLCAoc3QpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX25ldyhjbXApIFNLTV9za19uZXcoUEtDUzdfU0lHTkVSX0lORk8sIChjbXApKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChQS0NTN19TSUdORVJfSU5GTykKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fZnJlZShzdCkgU0tNX3NrX2ZyZWUoUEtDUzdfU0lHTkVSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX251bShzdCkgU0tNX3NrX251bShQS0NTN19TSUdORVJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9femVybyhzdCkgU0tNX3NrX3plcm8oUEtDUzdfU0lHTkVSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goUEtDUzdfU0lHTkVSX0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFBLQ1M3X1NJR05FUl9JTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoUEtDUzdfU0lHTkVSX0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoUEtDUzdfU0lHTkVSX0lORk8sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFBLQ1M3X1NJR05FUl9JTkZPLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2R1cChzdCkgU0tNX3NrX2R1cChQS0NTN19TSUdORVJfSU5GTywgc3QpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoUEtDUzdfU0lHTkVSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3BvcChzdCkgU0tNX3NrX3BvcChQS0NTN19TSUdORVJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fc29ydChzdCkgU0tNX3NrX3NvcnQoUEtDUzdfU0lHTkVSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChQS0NTN19TSUdORVJfSU5GTywgKHN0KSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX25ldyhjbXApIFNLTV9za19uZXcoUE9MSUNZSU5GTywgKGNtcCkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoUE9MSUNZSU5GTykKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19mcmVlKHN0KSBTS01fc2tfZnJlZShQT0xJQ1lJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX251bShzdCkgU0tNX3NrX251bShQT0xJQ1lJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoUE9MSUNZSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFBPTElDWUlORk8sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9femVybyhzdCkgU0tNX3NrX3plcm8oUE9MSUNZSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFBPTElDWUlORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoUE9MSUNZSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9fZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChQT0xJQ1lJTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFBPTElDWUlORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShQT0xJQ1lJTkZPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9fZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihQT0xJQ1lJTkZPLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChQT0xJQ1lJTkZPLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFBPTElDWUlORk8sIChzdCksIChjbXApKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX2R1cChzdCkgU0tNX3NrX2R1cChQT0xJQ1lJTkZPLCBzdCkKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoUE9MSUNZSU5GTywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1BPTElDWUlORk9fc2hpZnQoc3QpIFNLTV9za19zaGlmdChQT0xJQ1lJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3BvcChzdCkgU0tNX3NrX3BvcChQT0xJQ1lJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3NvcnQoc3QpIFNLTV9za19zb3J0KFBPTElDWUlORk8sIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9faXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFBPTElDWUlORk8sIChzdCkpCisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fbmV3KGNtcCkgU0tNX3NrX25ldyhQT0xJQ1lRVUFMSU5GTywgKGNtcCkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFBPTElDWVFVQUxJTkZPKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19mcmVlKHN0KSBTS01fc2tfZnJlZShQT0xJQ1lRVUFMSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fbnVtKHN0KSBTS01fc2tfbnVtKFBPTElDWVFVQUxJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT196ZXJvKHN0KSBTS01fc2tfemVybyhQT0xJQ1lRVUFMSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChQT0xJQ1lRVUFMSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoUE9MSUNZUVVBTElORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChQT0xJQ1lRVUFMSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShQT0xJQ1lRVUFMSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoUE9MSUNZUVVBTElORk8sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fZHVwKHN0KSBTS01fc2tfZHVwKFBPTElDWVFVQUxJTkZPLCBzdCkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fc2hpZnQoc3QpIFNLTV9za19zaGlmdChQT0xJQ1lRVUFMSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fcG9wKHN0KSBTS01fc2tfcG9wKFBPTElDWVFVQUxJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19zb3J0KHN0KSBTS01fc2tfc29ydChQT0xJQ1lRVUFMSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9faXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFBPTElDWVFVQUxJTkZPLCAoc3QpKQorCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX25ldyhjbXApIFNLTV9za19uZXcoUE9MSUNZX01BUFBJTkcsIChjbXApKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChQT0xJQ1lfTUFQUElORykKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfZnJlZShzdCkgU0tNX3NrX2ZyZWUoUE9MSUNZX01BUFBJTkcsIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX251bShzdCkgU0tNX3NrX251bShQT0xJQ1lfTUFQUElORywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShQT0xJQ1lfTUFQUElORywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChQT0xJQ1lfTUFQUElORywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfemVybyhzdCkgU0tNX3NrX3plcm8oUE9MSUNZX01BUFBJTkcsIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goUE9MSUNZX01BUFBJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFBPTElDWV9NQVBQSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChQT0xJQ1lfTUFQUElORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoUE9MSUNZX01BUFBJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoUE9MSUNZX01BUFBJTkcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihQT0xJQ1lfTUFQUElORywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFBPTElDWV9NQVBQSU5HLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhQT0xJQ1lfTUFQUElORywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2R1cChzdCkgU0tNX3NrX2R1cChQT0xJQ1lfTUFQUElORywgc3QpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShQT0xJQ1lfTUFQUElORywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoUE9MSUNZX01BUFBJTkcsIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3BvcChzdCkgU0tNX3NrX3BvcChQT0xJQ1lfTUFQUElORywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfc29ydChzdCkgU0tNX3NrX3NvcnQoUE9MSUNZX01BUFBJTkcsIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChQT0xJQ1lfTUFQUElORywgKHN0KSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX25ldyhjbXApIFNLTV9za19uZXcoU1NMX0NJUEhFUiwgKGNtcCkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoU1NMX0NJUEhFUikKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9mcmVlKHN0KSBTS01fc2tfZnJlZShTU0xfQ0lQSEVSLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX251bShzdCkgU0tNX3NrX251bShTU0xfQ0lQSEVSLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoU1NMX0NJUEhFUiwgKHN0KSwgKGkpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFNTTF9DSVBIRVIsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfemVybyhzdCkgU0tNX3NrX3plcm8oU1NMX0NJUEhFUiwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFNTTF9DSVBIRVIsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoU1NMX0NJUEhFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChTU0xfQ0lQSEVSLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFNTTF9DSVBIRVIsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShTU0xfQ0lQSEVSLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihTU0xfQ0lQSEVSLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChTU0xfQ0lQSEVSLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFNTTF9DSVBIRVIsIChzdCksIChjbXApKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX2R1cChzdCkgU0tNX3NrX2R1cChTU0xfQ0lQSEVSLCBzdCkKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoU1NMX0NJUEhFUiwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfc2hpZnQoc3QpIFNLTV9za19zaGlmdChTU0xfQ0lQSEVSLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3BvcChzdCkgU0tNX3NrX3BvcChTU0xfQ0lQSEVSLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3NvcnQoc3QpIFNLTV9za19zb3J0KFNTTF9DSVBIRVIsIChzdCkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFNTTF9DSVBIRVIsIChzdCkpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfbmV3KGNtcCkgU0tNX3NrX25ldyhTU0xfQ09NUCwgKGNtcCkpCisjZGVmaW5lIHNrX1NTTF9DT01QX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFNTTF9DT01QKQorI2RlZmluZSBza19TU0xfQ09NUF9mcmVlKHN0KSBTS01fc2tfZnJlZShTU0xfQ09NUCwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfbnVtKHN0KSBTS01fc2tfbnVtKFNTTF9DT01QLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ09NUF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFNTTF9DT01QLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NTTF9DT01QX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFNTTF9DT01QLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19TU0xfQ09NUF96ZXJvKHN0KSBTS01fc2tfemVybyhTU0xfQ09NUCwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChTU0xfQ09NUCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NTTF9DT01QX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoU1NMX0NPTVAsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TU0xfQ09NUF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFNTTF9DT01QLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChTU0xfQ09NUCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NTTF9DT01QX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShTU0xfQ09NUCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19TU0xfQ09NUF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFNTTF9DT01QLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoU1NMX0NPTVAsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1NTTF9DT01QX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFNTTF9DT01QLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfZHVwKHN0KSBTS01fc2tfZHVwKFNTTF9DT01QLCBzdCkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFNTTF9DT01QLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfc2hpZnQoc3QpIFNLTV9za19zaGlmdChTU0xfQ09NUCwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfcG9wKHN0KSBTS01fc2tfcG9wKFNTTF9DT01QLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ09NUF9zb3J0KHN0KSBTS01fc2tfc29ydChTU0xfQ09NUCwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFNTTF9DT01QLCAoc3QpKQorCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9uZXcoY21wKSBTS01fc2tfbmV3KFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKGNtcCkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9mcmVlKHN0KSBTS01fc2tfZnJlZShTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9udW0oc3QpIFNLTV9za19udW0oU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3plcm8oc3QpIFNLTV9za196ZXJvKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9kdXAoc3QpIFNLTV9za19kdXAoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCBzdCkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfc2hpZnQoc3QpIFNLTV9za19zaGlmdChTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3Aoc3QpIFNLTV9za19wb3AoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfc29ydChzdCkgU0tNX3NrX3NvcnQoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSkKKworI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fbmV3KGNtcCkgU0tNX3NrX25ldyhTVE9SRV9BVFRSX0lORk8sIChjbXApKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoU1RPUkVfQVRUUl9JTkZPKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fZnJlZShzdCkgU0tNX3NrX2ZyZWUoU1RPUkVfQVRUUl9JTkZPLCAoc3QpKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fbnVtKHN0KSBTS01fc2tfbnVtKFNUT1JFX0FUVFJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfQVRUUl9JTkZPX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoU1RPUkVfQVRUUl9JTkZPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChTVE9SRV9BVFRSX0lORk8sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT196ZXJvKHN0KSBTS01fc2tfemVybyhTVE9SRV9BVFRSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoU1RPUkVfQVRUUl9JTkZPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChTVE9SRV9BVFRSX0lORk8sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhTVE9SRV9BVFRSX0lORk8sIChzdCksIChjbXApKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fZHVwKHN0KSBTS01fc2tfZHVwKFNUT1JFX0FUVFJfSU5GTywgc3QpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoU1RPUkVfQVRUUl9JTkZPLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfU1RPUkVfQVRUUl9JTkZPX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoU1RPUkVfQVRUUl9JTkZPLCAoc3QpKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fcG9wKHN0KSBTS01fc2tfcG9wKFNUT1JFX0FUVFJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfQVRUUl9JTkZPX3NvcnQoc3QpIFNLTV9za19zb3J0KFNUT1JFX0FUVFJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfQVRUUl9JTkZPX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChTVE9SRV9BVFRSX0lORk8sIChzdCkpCisKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX25ldyhjbXApIFNLTV9za19uZXcoU1RPUkVfT0JKRUNULCAoY21wKSkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFNUT1JFX09CSkVDVCkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX2ZyZWUoc3QpIFNLTV9za19mcmVlKFNUT1JFX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX251bShzdCkgU0tNX3NrX251bShTVE9SRV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1NUT1JFX09CSkVDVF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFNUT1JFX09CSkVDVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1Rfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoU1RPUkVfT0JKRUNULCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfemVybyhzdCkgU0tNX3NrX3plcm8oU1RPUkVfT0JKRUNULCAoc3QpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChTVE9SRV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChTVE9SRV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChTVE9SRV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChTVE9SRV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFNUT1JFX09CSkVDVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihTVE9SRV9PQkpFQ1QsIChzdCksIChwdHIpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoU1RPUkVfT0JKRUNULCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1Rfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoU1RPUkVfT0JKRUNULCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX2R1cChzdCkgU0tNX3NrX2R1cChTVE9SRV9PQkpFQ1QsIHN0KQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFNUT1JFX09CSkVDVCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1NUT1JFX09CSkVDVF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFNUT1JFX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX3BvcChzdCkgU0tNX3NrX3BvcChTVE9SRV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1NUT1JFX09CSkVDVF9zb3J0KHN0KSBTS01fc2tfc29ydChTVE9SRV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1NUT1JFX09CSkVDVF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoU1RPUkVfT0JKRUNULCAoc3QpKQorCisjZGVmaW5lIHNrX1NYTkVUSURfbmV3KGNtcCkgU0tNX3NrX25ldyhTWE5FVElELCAoY21wKSkKKyNkZWZpbmUgc2tfU1hORVRJRF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChTWE5FVElEKQorI2RlZmluZSBza19TWE5FVElEX2ZyZWUoc3QpIFNLTV9za19mcmVlKFNYTkVUSUQsIChzdCkpCisjZGVmaW5lIHNrX1NYTkVUSURfbnVtKHN0KSBTS01fc2tfbnVtKFNYTkVUSUQsIChzdCkpCisjZGVmaW5lIHNrX1NYTkVUSURfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShTWE5FVElELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NYTkVUSURfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoU1hORVRJRCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1hORVRJRF96ZXJvKHN0KSBTS01fc2tfemVybyhTWE5FVElELCAoc3QpKQorI2RlZmluZSBza19TWE5FVElEX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goU1hORVRJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NYTkVUSURfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChTWE5FVElELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1hORVRJRF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFNYTkVUSUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TWE5FVElEX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoU1hORVRJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NYTkVUSURfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFNYTkVUSUQsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfU1hORVRJRF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFNYTkVUSUQsIChzdCksIChwdHIpKQorI2RlZmluZSBza19TWE5FVElEX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFNYTkVUSUQsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1NYTkVUSURfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoU1hORVRJRCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1NYTkVUSURfZHVwKHN0KSBTS01fc2tfZHVwKFNYTkVUSUQsIHN0KQorI2RlZmluZSBza19TWE5FVElEX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShTWE5FVElELCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfU1hORVRJRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFNYTkVUSUQsIChzdCkpCisjZGVmaW5lIHNrX1NYTkVUSURfcG9wKHN0KSBTS01fc2tfcG9wKFNYTkVUSUQsIChzdCkpCisjZGVmaW5lIHNrX1NYTkVUSURfc29ydChzdCkgU0tNX3NrX3NvcnQoU1hORVRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfU1hORVRJRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoU1hORVRJRCwgKHN0KSkKKworI2RlZmluZSBza19VSV9TVFJJTkdfbmV3KGNtcCkgU0tNX3NrX25ldyhVSV9TVFJJTkcsIChjbXApKQorI2RlZmluZSBza19VSV9TVFJJTkdfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoVUlfU1RSSU5HKQorI2RlZmluZSBza19VSV9TVFJJTkdfZnJlZShzdCkgU0tNX3NrX2ZyZWUoVUlfU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19VSV9TVFJJTkdfbnVtKHN0KSBTS01fc2tfbnVtKFVJX1NUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfVUlfU1RSSU5HX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoVUlfU1RSSU5HLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChVSV9TVFJJTkcsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR196ZXJvKHN0KSBTS01fc2tfemVybyhVSV9TVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFVJX1NUUklORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFVJX1NUUklORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFVJX1NUUklORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFVJX1NUUklORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoVUlfU1RSSU5HLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFVJX1NUUklORywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1VJX1NUUklOR19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChVSV9TVFJJTkcsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhVSV9TVFJJTkcsIChzdCksIChjbXApKQorI2RlZmluZSBza19VSV9TVFJJTkdfZHVwKHN0KSBTS01fc2tfZHVwKFVJX1NUUklORywgc3QpCisjZGVmaW5lIHNrX1VJX1NUUklOR19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoVUlfU1RSSU5HLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfVUlfU1RSSU5HX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoVUlfU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19VSV9TVFJJTkdfcG9wKHN0KSBTS01fc2tfcG9wKFVJX1NUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfVUlfU1RSSU5HX3NvcnQoc3QpIFNLTV9za19zb3J0KFVJX1NUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfVUlfU1RSSU5HX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChVSV9TVFJJTkcsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDksIChjbXApKQorI2RlZmluZSBza19YNTA5X25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDkpCisjZGVmaW5lIHNrX1g1MDlfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9udW0oc3QpIFNLTV9za19udW0oWDUwOSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5LCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDksIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5LCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9kdXAoc3QpIFNLTV9za19kdXAoWDUwOSwgc3QpCisjZGVmaW5lIHNrX1g1MDlfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5LCAoc3QpKQorI2RlZmluZSBza19YNTA5X2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5LCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX25ldyhjbXApIFNLTV9za19uZXcoWDUwOVYzX0VYVF9NRVRIT0QsIChjbXApKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5VjNfRVhUX01FVEhPRCkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX251bShzdCkgU0tNX3NrX251bShYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOVYzX0VYVF9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOVYzX0VYVF9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlWM19FWFRfTUVUSE9ELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlWM19FWFRfTUVUSE9ELCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5VjNfRVhUX01FVEhPRCwgc3QpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0Rfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X0FMR09SX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9BTEdPUiwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9BTEdPUikKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9mcmVlKHN0KSBTS01fc2tfZnJlZShYNTA5X0FMR09SLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FMR09SX251bShzdCkgU0tNX3NrX251bShYNTA5X0FMR09SLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9BTEdPUiwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFg1MDlfQUxHT1IsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9BTEdPUiwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfQUxHT1IsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoWDUwOV9BTEdPUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X0FMR09SLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfQUxHT1IsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0FMR09SX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShYNTA5X0FMR09SLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X0FMR09SLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X0FMR09SLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFg1MDlfQUxHT1IsIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X0FMR09SX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X0FMR09SLCBzdCkKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9BTEdPUiwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1Jfc2hpZnQoc3QpIFNLTV9za19zaGlmdChYNTA5X0FMR09SLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X0FMR09SLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfQUxHT1IsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFg1MDlfQUxHT1IsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfbmV3KGNtcCkgU0tNX3NrX25ldyhYNTA5X0FUVFJJQlVURSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfQVRUUklCVVRFKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9mcmVlKHN0KSBTS01fc2tfZnJlZShYNTA5X0FUVFJJQlVURSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfbnVtKHN0KSBTS01fc2tfbnVtKFg1MDlfQVRUUklCVVRFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV96ZXJvKHN0KSBTS01fc2tfemVybyhYNTA5X0FUVFJJQlVURSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X0FUVFJJQlVURSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoWDUwOV9BVFRSSUJVVEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X0FUVFJJQlVURSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShYNTA5X0FUVFJJQlVURSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9BVFRSSUJVVEUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfZHVwKHN0KSBTS01fc2tfZHVwKFg1MDlfQVRUUklCVVRFLCBzdCkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChYNTA5X0FUVFJJQlVURSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfcG9wKHN0KSBTS01fc2tfcG9wKFg1MDlfQVRUUklCVVRFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X0FUVFJJQlVURSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFg1MDlfQVRUUklCVVRFLCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfQ1JMX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9DUkwsIChjbXApKQorI2RlZmluZSBza19YNTA5X0NSTF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X0NSTCkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9DUkwsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX251bShzdCkgU0tNX3NrX251bShYNTA5X0NSTCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X0NSTCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0NSTF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X0NSTCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9DUkwsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9DUkwsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0NSTF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfQ1JMLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X0NSTCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9DUkwsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0NSTF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9DUkwsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X0NSTCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfQ1JMLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X0NSTF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X0NSTCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X0NSTCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X0NSTCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9DUkwsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X0NSTCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9DUkwsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X0NSTCwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDlfRVhURU5TSU9OLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9FWFRFTlNJT04pCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2ZyZWUoc3QpIFNLTV9za19mcmVlKFg1MDlfRVhURU5TSU9OLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9udW0oc3QpIFNLTV9za19udW0oWDUwOV9FWFRFTlNJT04sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9FWFRFTlNJT04sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoWDUwOV9FWFRFTlNJT04sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDlfRVhURU5TSU9OLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfRVhURU5TSU9OLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChYNTA5X0VYVEVOU0lPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOV9FWFRFTlNJT04sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfRVhURU5TSU9OLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFg1MDlfRVhURU5TSU9OLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOV9FWFRFTlNJT04sIChzdCksIChwdHIpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X0VYVEVOU0lPTiwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoWDUwOV9FWFRFTlNJT04sIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9kdXAoc3QpIFNLTV9za19kdXAoWDUwOV9FWFRFTlNJT04sIHN0KQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9FWFRFTlNJT04sIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFg1MDlfRVhURU5TSU9OLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOV9FWFRFTlNJT04sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfRVhURU5TSU9OLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoWDUwOV9FWFRFTlNJT04sIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9JTkZPLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfSU5GTykKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX2ZyZWUoc3QpIFNLTV9za19mcmVlKFg1MDlfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX251bShzdCkgU0tNX3NrX251bShYNTA5X0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfSU5GT192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0lORk9fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoWDUwOV9JTkZPLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9femVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9JTkZPLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0lORk9fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChYNTA5X0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9fZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFg1MDlfSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0lORk9fZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X0lORk8sIChzdCksIChwdHIpKQorI2RlZmluZSBza19YNTA5X0lORk9faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9JTkZPLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X0lORk9fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoWDUwOV9JTkZPLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X0lORk8sIHN0KQorI2RlZmluZSBza19YNTA5X0lORk9fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfSU5GTywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfSU5GT19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFg1MDlfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfSU5GT19zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfSU5GT19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoWDUwOV9JTkZPLCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9MT09LVVAsIChjbXApKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X0xPT0tVUCkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9MT09LVVAsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX251bShzdCkgU0tNX3NrX251bShYNTA5X0xPT0tVUCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X0xPT0tVUCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X0xPT0tVUCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9MT09LVVAsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9MT09LVVAsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfTE9PS1VQLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X0xPT0tVUCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9MT09LVVAsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9MT09LVVAsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X0xPT0tVUCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfTE9PS1VQLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X0xPT0tVUCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X0xPT0tVUCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X0xPT0tVUCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9MT09LVVAsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X0xPT0tVUCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9MT09LVVAsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X0xPT0tVUCwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X05BTUVfbmV3KGNtcCkgU0tNX3NrX25ldyhYNTA5X05BTUUsIChjbXApKQorI2RlZmluZSBza19YNTA5X05BTUVfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9OQU1FKQorI2RlZmluZSBza19YNTA5X05BTUVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9OQU1FLCAoc3QpKQorI2RlZmluZSBza19YNTA5X05BTUVfbnVtKHN0KSBTS01fc2tfbnVtKFg1MDlfTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9OQU1FLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X05BTUUsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV96ZXJvKHN0KSBTS01fc2tfemVybyhYNTA5X05BTUUsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFg1MDlfTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9OQU1FLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFg1MDlfTkFNRSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X05BTUUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X05BTUUsIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X05BTUVfZHVwKHN0KSBTS01fc2tfZHVwKFg1MDlfTkFNRSwgc3QpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9OQU1FLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9OQU1FLCAoc3QpKQorI2RlZmluZSBza19YNTA5X05BTUVfcG9wKHN0KSBTS01fc2tfcG9wKFg1MDlfTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X05BTUUsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9OQU1FX0VOVFJZLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfTkFNRV9FTlRSWSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUoc3QpIFNLTV9za19mcmVlKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX251bShzdCkgU0tNX3NrX251bShYNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X05BTUVfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChYNTA5X05BTUVfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X05BTUVfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X05BTUVfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X05BTUVfRU5UUlksIChzdCksIChwdHIpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X05BTUVfRU5UUlksIHN0KQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFg1MDlfTkFNRV9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9PQkpFQ1QsIChjbXApKQorI2RlZmluZSBza19YNTA5X09CSkVDVF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X09CSkVDVCkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX251bShzdCkgU0tNX3NrX251bShYNTA5X09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X09CSkVDVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X09CSkVDVF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X09CSkVDVCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X09CSkVDVF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfT0JKRUNULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X09CSkVDVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X09CSkVDVF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9PQkpFQ1QsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X09CSkVDVCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfT0JKRUNULCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X09CSkVDVF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X09CSkVDVCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X09CSkVDVCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X09CSkVDVCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1Rfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X09CSkVDVCwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9QT0xJQ1lfREFUQSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9QT0xJQ1lfREFUQSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9mcmVlKHN0KSBTS01fc2tfZnJlZShYNTA5X1BPTElDWV9EQVRBLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX251bShzdCkgU0tNX3NrX251bShYNTA5X1BPTElDWV9EQVRBLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9QT0xJQ1lfREFUQSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFg1MDlfUE9MSUNZX0RBVEEsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9QT0xJQ1lfREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfUE9MSUNZX0RBVEEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoWDUwOV9QT0xJQ1lfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X1BPTElDWV9EQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfUE9MSUNZX0RBVEEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShYNTA5X1BPTElDWV9EQVRBLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X1BPTElDWV9EQVRBLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X1BPTElDWV9EQVRBLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFg1MDlfUE9MSUNZX0RBVEEsIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X1BPTElDWV9EQVRBLCBzdCkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9QT0xJQ1lfREFUQSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfc2hpZnQoc3QpIFNLTV9za19zaGlmdChYNTA5X1BPTElDWV9EQVRBLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X1BPTElDWV9EQVRBLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfUE9MSUNZX0RBVEEsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFg1MDlfUE9MSUNZX0RBVEEsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDlfUE9MSUNZX05PREUsIChjbXApKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfUE9MSUNZX05PREUpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9udW0oc3QpIFNLTV9za19udW0oWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfUE9MSUNZX05PREUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X1BPTElDWV9OT0RFLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDlfUE9MSUNZX05PREUsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X1BPTElDWV9OT0RFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfUE9MSUNZX05PREUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X1BPTElDWV9OT0RFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X1BPTElDWV9OT0RFLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9kdXAoc3QpIFNLTV9za19kdXAoWDUwOV9QT0xJQ1lfTk9ERSwgc3QpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfUE9MSUNZX05PREUsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X1BPTElDWV9OT0RFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X1BPTElDWV9OT0RFLCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDlfUFVSUE9TRSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X1BVUlBPU0UpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9mcmVlKHN0KSBTS01fc2tfZnJlZShYNTA5X1BVUlBPU0UsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9udW0oc3QpIFNLTV9za19udW0oWDUwOV9QVVJQT1NFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BVUlBPU0VfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X1BVUlBPU0UsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFg1MDlfUFVSUE9TRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDlfUFVSUE9TRSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9QVVJQT1NFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoWDUwOV9QVVJQT1NFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOV9QVVJQT1NFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9QVVJQT1NFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShYNTA5X1BVUlBPU0UsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOV9QVVJQT1NFLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfUFVSUE9TRSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFg1MDlfUFVSUE9TRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9kdXAoc3QpIFNLTV9za19kdXAoWDUwOV9QVVJQT1NFLCBzdCkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X1BVUlBPU0UsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X1BVUlBPU0Vfc2hpZnQoc3QpIFNLTV9za19zaGlmdChYNTA5X1BVUlBPU0UsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOV9QVVJQT1NFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BVUlBPU0Vfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9QVVJQT1NFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BVUlBPU0VfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFg1MDlfUFVSUE9TRSwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfbmV3KGNtcCkgU0tNX3NrX25ldyhYNTA5X1JFVk9LRUQsIChjbXApKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9SRVZPS0VEKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9SRVZPS0VELCAoc3QpKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfbnVtKHN0KSBTS01fc2tfbnVtKFg1MDlfUkVWT0tFRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9SRVZPS0VELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X1JFVk9LRUQsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF96ZXJvKHN0KSBTS01fc2tfemVybyhYNTA5X1JFVk9LRUQsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfUkVWT0tFRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfUkVWT0tFRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFg1MDlfUkVWT0tFRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfUkVWT0tFRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9SRVZPS0VELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFg1MDlfUkVWT0tFRCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X1JFVk9LRUQsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X1JFVk9LRUQsIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfZHVwKHN0KSBTS01fc2tfZHVwKFg1MDlfUkVWT0tFRCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9SRVZPS0VELCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9SRVZPS0VELCAoc3QpKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfcG9wKHN0KSBTS01fc2tfcG9wKFg1MDlfUkVWT0tFRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfUkVWT0tFRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X1JFVk9LRUQsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDlfVFJVU1QsIChjbXApKQorI2RlZmluZSBza19YNTA5X1RSVVNUX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfVFJVU1QpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9UUlVTVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9udW0oc3QpIFNLTV9za19udW0oWDUwOV9UUlVTVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfVFJVU1QsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X1RSVVNULCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDlfVFJVU1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X1RSVVNULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfVFJVU1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOV9UUlVTVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X1RSVVNULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9UUlVTVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOV9UUlVTVCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9UUlVTVCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X1RSVVNULCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9kdXAoc3QpIFNLTV9za19kdXAoWDUwOV9UUlVTVCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfVFJVU1QsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9UUlVTVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOV9UUlVTVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X1RSVVNULCAoc3QpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X1RSVVNULCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9WRVJJRllfUEFSQU0sIChjbXApKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X1ZFUklGWV9QQVJBTSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9WRVJJRllfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX251bShzdCkgU0tNX3NrX251bShYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1femVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9WRVJJRllfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9WRVJJRllfUEFSQU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfVkVSSUZZX1BBUkFNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9WRVJJRllfUEFSQU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9WRVJJRllfUEFSQU0sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfVkVSSUZZX1BBUkFNLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X1ZFUklGWV9QQVJBTSwgc3QpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9WRVJJRllfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9WRVJJRllfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSkKKworI2RlZmluZSBza19uaWRfdHJpcGxlX25ldyhjbXApIFNLTV9za19uZXcobmlkX3RyaXBsZSwgKGNtcCkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwobmlkX3RyaXBsZSkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9mcmVlKHN0KSBTS01fc2tfZnJlZShuaWRfdHJpcGxlLCAoc3QpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX251bShzdCkgU0tNX3NrX251bShuaWRfdHJpcGxlLCAoc3QpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUobmlkX3RyaXBsZSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KG5pZF90cmlwbGUsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfemVybyhzdCkgU0tNX3NrX3plcm8obmlkX3RyaXBsZSwgKHN0KSkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKG5pZF90cmlwbGUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQobmlkX3RyaXBsZSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChuaWRfdHJpcGxlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KG5pZF90cmlwbGUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShuaWRfdHJpcGxlLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihuaWRfdHJpcGxlLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChuaWRfdHJpcGxlLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKG5pZF90cmlwbGUsIChzdCksIChjbXApKQorI2RlZmluZSBza19uaWRfdHJpcGxlX2R1cChzdCkgU0tNX3NrX2R1cChuaWRfdHJpcGxlLCBzdCkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUobmlkX3RyaXBsZSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChuaWRfdHJpcGxlLCAoc3QpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3BvcChzdCkgU0tNX3NrX3BvcChuaWRfdHJpcGxlLCAoc3QpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3NvcnQoc3QpIFNLTV9za19zb3J0KG5pZF90cmlwbGUsIChzdCkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKG5pZF90cmlwbGUsIChzdCkpCisKKyNkZWZpbmUgc2tfdm9pZF9uZXcoY21wKSBTS01fc2tfbmV3KHZvaWQsIChjbXApKQorI2RlZmluZSBza192b2lkX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKHZvaWQpCisjZGVmaW5lIHNrX3ZvaWRfZnJlZShzdCkgU0tNX3NrX2ZyZWUodm9pZCwgKHN0KSkKKyNkZWZpbmUgc2tfdm9pZF9udW0oc3QpIFNLTV9za19udW0odm9pZCwgKHN0KSkKKyNkZWZpbmUgc2tfdm9pZF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKHZvaWQsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfdm9pZF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldCh2b2lkLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza192b2lkX3plcm8oc3QpIFNLTV9za196ZXJvKHZvaWQsIChzdCkpCisjZGVmaW5lIHNrX3ZvaWRfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaCh2b2lkLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfdm9pZF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KHZvaWQsIChzdCksICh2YWwpKQorI2RlZmluZSBza192b2lkX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQodm9pZCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX3ZvaWRfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leCh2b2lkLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfdm9pZF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUodm9pZCwgKHN0KSwgKGkpKQorI2RlZmluZSBza192b2lkX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIodm9pZCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX3ZvaWRfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQodm9pZCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfdm9pZF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyh2b2lkLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfdm9pZF9kdXAoc3QpIFNLTV9za19kdXAodm9pZCwgc3QpCisjZGVmaW5lIHNrX3ZvaWRfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKHZvaWQsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza192b2lkX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQodm9pZCwgKHN0KSkKKyNkZWZpbmUgc2tfdm9pZF9wb3Aoc3QpIFNLTV9za19wb3Aodm9pZCwgKHN0KSkKKyNkZWZpbmUgc2tfdm9pZF9zb3J0KHN0KSBTS01fc2tfc29ydCh2b2lkLCAoc3QpKQorI2RlZmluZSBza192b2lkX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZCh2b2lkLCAoc3QpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfbmV3KGNtcCkgKChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKXNrX25ldyhDSEVDS0VEX1NLX0NNUF9GVU5DKHZvaWQsIGNtcCkpKQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX25ld19udWxsKCkgKChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKXNrX25ld19udWxsKCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfcHVzaChzdCwgdmFsKSBza19wdXNoKENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIENIRUNLRURfUFRSX09GKHZvaWQsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfZmluZChzdCwgdmFsKSBza19maW5kKENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIENIRUNLRURfUFRSX09GKHZvaWQsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfdmFsdWUoc3QsIGkpICgoT1BFTlNTTF9CTE9DSylza192YWx1ZShDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX0JMT0NLKSwgc3QpLCBpKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19udW0oc3QpIFNLTV9za19udW0oT1BFTlNTTF9CTE9DSywgc3QpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgc2tfcG9wX2ZyZWUoQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSyksIHN0KSwgQ0hFQ0tFRF9TS19GUkVFX0ZVTkMyKE9QRU5TU0xfQkxPQ0ssIGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfaW5zZXJ0KHN0LCB2YWwsIGkpIHNrX2luc2VydChDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX0JMT0NLKSwgc3QpLCBDSEVDS0VEX1BUUl9PRih2b2lkLCB2YWwpLCBpKQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX2ZyZWUoc3QpIFNLTV9za19mcmVlKE9QRU5TU0xfQkxPQ0ssIHN0KQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX3NldChzdCwgaSwgdmFsKSBza19zZXQoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIGksIENIRUNLRURfUFRSX09GKHZvaWQsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfemVybyhzdCkgU0tNX3NrX3plcm8oT1BFTlNTTF9CTE9DSywgKHN0KSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS191bnNoaWZ0KHN0LCB2YWwpIHNrX3Vuc2hpZnQoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIENIRUNLRURfUFRSX09GKHZvaWQsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfZmluZF9leChzdCwgdmFsKSBza19maW5kX2V4KChfU1RBQ0sgKilDSEVDS0VEX0NPTlNUX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX0JMT0NLKSwgc3QpLCBDSEVDS0VEX0NPTlNUX1BUUl9PRih2b2lkLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShPUEVOU1NMX0JMT0NLLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfZGVsZXRlX3B0cihzdCwgcHRyKSAoT1BFTlNTTF9CTE9DSyAqKXNrX2RlbGV0ZV9wdHIoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIENIRUNLRURfUFRSX09GKHZvaWQsIHB0cikpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc2V0X2NtcF9mdW5jKHN0LCBjbXApICBcCisJKChpbnQgKCopKGNvbnN0IHZvaWQgKiBjb25zdCAqLGNvbnN0IHZvaWQgKiBjb25zdCAqKSkgXAorCXNrX3NldF9jbXBfZnVuYygoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSyksIHN0KSwgQ0hFQ0tFRF9TS19DTVBfRlVOQyh2b2lkLCBjbXApKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19kdXAoc3QpIFNLTV9za19kdXAoT1BFTlNTTF9CTE9DSywgc3QpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc2hpZnQoc3QpIFNLTV9za19zaGlmdChPUEVOU1NMX0JMT0NLLCAoc3QpKQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX3BvcChzdCkgKHZvaWQgKilza19wb3AoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc29ydChzdCkgU0tNX3NrX3NvcnQoT1BFTlNTTF9CTE9DSywgKHN0KSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoT1BFTlNTTF9CTE9DSywgKHN0KSkKKworCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19uZXcoY21wKSAoKFNUQUNLX09GKE9QRU5TU0xfUFNUUklORykgKilza19uZXcoQ0hFQ0tFRF9TS19DTVBfRlVOQyhPUEVOU1NMX1NUUklORywgY21wKSkpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19uZXdfbnVsbCgpICgoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSAqKXNrX25ld19udWxsKCkpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19wdXNoKHN0LCB2YWwpIHNrX3B1c2goQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1BUUl9PRihPUEVOU1NMX1NUUklORywgdmFsKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX2ZpbmQoc3QsIHZhbCkgc2tfZmluZChDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1BTVFJJTkcpLCBzdCksIENIRUNLRURfUFRSX09GKE9QRU5TU0xfU1RSSU5HLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfdmFsdWUoc3QsIGkpICgoT1BFTlNTTF9QU1RSSU5HKXNrX3ZhbHVlKENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfUFNUUklORyksIHN0KSwgaSkpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19udW0oc3QpIFNLTV9za19udW0oT1BFTlNTTF9QU1RSSU5HLCBzdCkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIHNrX3BvcF9mcmVlKENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfUFNUUklORyksIHN0KSwgQ0hFQ0tFRF9TS19GUkVFX0ZVTkMyKE9QRU5TU0xfUFNUUklORywgZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX2luc2VydChzdCwgdmFsLCBpKSBza19pbnNlcnQoQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1BUUl9PRihPUEVOU1NMX1NUUklORywgdmFsKSwgaSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX2ZyZWUoc3QpIFNLTV9za19mcmVlKE9QRU5TU0xfUFNUUklORywgc3QpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19zZXQoc3QsIGksIHZhbCkgc2tfc2V0KChfU1RBQ0sgKilDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1BTVFJJTkcpLCBzdCksIGksIENIRUNLRURfUFRSX09GKE9QRU5TU0xfU1RSSU5HLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfemVybyhzdCkgU0tNX3NrX3plcm8oT1BFTlNTTF9QU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfdW5zaGlmdChzdCwgdmFsKSBza191bnNoaWZ0KChfU1RBQ0sgKilDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1BTVFJJTkcpLCBzdCksIENIRUNLRURfUFRSX09GKE9QRU5TU0xfU1RSSU5HLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfZmluZF9leChzdCwgdmFsKSBza19maW5kX2V4KChfU1RBQ0sgKilDSEVDS0VEX0NPTlNUX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1BTVFJJTkcpLCBzdCksIENIRUNLRURfQ09OU1RfUFRSX09GKE9QRU5TU0xfU1RSSU5HLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE9QRU5TU0xfUFNUUklORywgKHN0KSwgKGkpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfZGVsZXRlX3B0cihzdCwgcHRyKSAoT1BFTlNTTF9QU1RSSU5HICopc2tfZGVsZXRlX3B0cigoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1BUUl9PRihPUEVOU1NMX1NUUklORywgcHRyKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX3NldF9jbXBfZnVuYyhzdCwgY21wKSAgXAorCSgoaW50ICgqKShjb25zdCBPUEVOU1NMX1NUUklORyAqIGNvbnN0ICosY29uc3QgT1BFTlNTTF9TVFJJTkcgKiBjb25zdCAqKSkgXAorCXNrX3NldF9jbXBfZnVuYygoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1NLX0NNUF9GVU5DKE9QRU5TU0xfU1RSSU5HLCBjbXApKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX2R1cChzdCkgU0tNX3NrX2R1cChPUEVOU1NMX1BTVFJJTkcsIHN0KQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfc2hpZnQoc3QpIFNLTV9za19zaGlmdChPUEVOU1NMX1BTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19wb3Aoc3QpIChPUEVOU1NMX1NUUklORyAqKXNrX3BvcCgoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfc29ydChzdCkgU0tNX3NrX3NvcnQoT1BFTlNTTF9QU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKE9QRU5TU0xfUFNUUklORywgKHN0KSkKKworCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX25ldyhjbXApICgoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICopc2tfbmV3KENIRUNLRURfU0tfQ01QX0ZVTkMoY2hhciwgY21wKSkpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCkgKChTVEFDS19PRihPUEVOU1NMX1NUUklORykgKilza19uZXdfbnVsbCgpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19wdXNoKHN0LCB2YWwpIHNrX3B1c2goQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpLCBzdCksIENIRUNLRURfUFRSX09GKGNoYXIsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX2ZpbmQoc3QsIHZhbCkgc2tfZmluZChDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSwgQ0hFQ0tFRF9QVFJfT0YoY2hhciwgdmFsKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoc3QsIGkpICgoT1BFTlNTTF9TVFJJTkcpc2tfdmFsdWUoQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpLCBzdCksIGkpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19udW0oc3QpIFNLTV9za19udW0oT1BFTlNTTF9TVFJJTkcsIHN0KQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBza19wb3BfZnJlZShDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSwgQ0hFQ0tFRF9TS19GUkVFX0ZVTkMyKE9QRU5TU0xfU1RSSU5HLCBmcmVlX2Z1bmMpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19pbnNlcnQoc3QsIHZhbCwgaSkgc2tfaW5zZXJ0KENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1BUUl9PRihjaGFyLCB2YWwpLCBpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19mcmVlKHN0KSBTS01fc2tfZnJlZShPUEVOU1NMX1NUUklORywgc3QpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX3NldChzdCwgaSwgdmFsKSBza19zZXQoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSwgc3QpLCBpLCBDSEVDS0VEX1BUUl9PRihjaGFyLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR196ZXJvKHN0KSBTS01fc2tfemVybyhPUEVOU1NMX1NUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfdW5zaGlmdChzdCwgdmFsKSBza191bnNoaWZ0KChfU1RBQ0sgKilDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSwgQ0hFQ0tFRF9QVFJfT0YoY2hhciwgdmFsKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfZmluZF9leChzdCwgdmFsKSBza19maW5kX2V4KChfU1RBQ0sgKilDSEVDS0VEX0NPTlNUX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSwgQ0hFQ0tFRF9DT05TVF9QVFJfT0YoY2hhciwgdmFsKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE9QRU5TU0xfU1RSSU5HLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX2RlbGV0ZV9wdHIoc3QsIHB0cikgKE9QRU5TU0xfU1RSSU5HICopc2tfZGVsZXRlX3B0cigoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpLCBzdCksIENIRUNLRURfUFRSX09GKGNoYXIsIHB0cikpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX3NldF9jbXBfZnVuYyhzdCwgY21wKSAgXAorCSgoaW50ICgqKShjb25zdCBjaGFyICogY29uc3QgKixjb25zdCBjaGFyICogY29uc3QgKikpIFwKKwlza19zZXRfY21wX2Z1bmMoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1NLX0NNUF9GVU5DKGNoYXIsIGNtcCkpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19kdXAoc3QpIFNLTV9za19kdXAoT1BFTlNTTF9TVFJJTkcsIHN0KQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KE9QRU5TU0xfU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19wb3Aoc3QpIChjaGFyICopc2tfcG9wKChfU1RBQ0sgKilDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfc29ydChzdCkgU0tNX3NrX3NvcnQoT1BFTlNTTF9TVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChPUEVOU1NMX1NUUklORywgKHN0KSkKKworCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9BQ0NFU1NfREVTQ1JJUFRJT04oc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9BQ0NFU1NfREVTQ1JJUFRJT04oc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19BQ0NFU1NfREVTQ1JJUFRJT04oc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfQUNDRVNTX0RFU0NSSVBUSU9OKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhBQ0NFU1NfREVTQ1JJUFRJT04sIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX0FTTjFfSU5URUdFUihzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoQVNOMV9JTlRFR0VSLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX0FTTjFfSU5URUdFUihzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKEFTTjFfSU5URUdFUiwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX0FTTjFfSU5URUdFUihzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soQVNOMV9JTlRFR0VSLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19BU04xX0lOVEVHRVIoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKEFTTjFfSU5URUdFUiwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfQVNOMV9PQkpFQ1Qoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKEFTTjFfT0JKRUNULCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX0FTTjFfT0JKRUNUKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoQVNOMV9PQkpFQ1QsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19BU04xX09CSkVDVChzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soQVNOMV9PQkpFQ1QsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX0FTTjFfT0JKRUNUKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhBU04xX09CSkVDVCwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfQVNOMV9UWVBFKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShBU04xX1RZUEUsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfQVNOMV9UWVBFKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoQVNOMV9UWVBFLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfQVNOMV9UWVBFKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhBU04xX1RZUEUsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX0FTTjFfVFlQRShidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soQVNOMV9UWVBFLCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9BU04xX1VURjhTVFJJTkcoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9BU04xX1VURjhTVFJJTkcoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChBU04xX1VURjhTVFJJTkcsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19BU04xX1VURjhTVFJJTkcoc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfQVNOMV9VVEY4U1RSSU5HKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhBU04xX1VURjhTVFJJTkcsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX0RJU1RfUE9JTlQoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKERJU1RfUE9JTlQsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfRElTVF9QT0lOVChzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKERJU1RfUE9JTlQsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19ESVNUX1BPSU5UKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhESVNUX1BPSU5ULCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19ESVNUX1BPSU5UKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhESVNUX1BPSU5ULCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9FU1NfQ0VSVF9JRChzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoRVNTX0NFUlRfSUQsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfRVNTX0NFUlRfSUQoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChFU1NfQ0VSVF9JRCwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX0VTU19DRVJUX0lEKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhFU1NfQ0VSVF9JRCwgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfRVNTX0NFUlRfSUQoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKEVTU19DRVJUX0lELCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9FVlBfTUQoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKEVWUF9NRCwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9FVlBfTUQoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChFVlBfTUQsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19FVlBfTUQoc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKEVWUF9NRCwgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfRVZQX01EKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhFVlBfTUQsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX0dFTkVSQUxfTkFNRShzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoR0VORVJBTF9OQU1FLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX0dFTkVSQUxfTkFNRShzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKEdFTkVSQUxfTkFNRSwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX0dFTkVSQUxfTkFNRShzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soR0VORVJBTF9OQU1FLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19HRU5FUkFMX05BTUUoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKEdFTkVSQUxfTkFNRSwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfT0NTUF9PTkVSRVEoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKE9DU1BfT05FUkVRLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX09DU1BfT05FUkVRKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoT0NTUF9PTkVSRVEsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19PQ1NQX09ORVJFUShzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soT0NTUF9PTkVSRVEsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX09DU1BfT05FUkVRKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhPQ1NQX09ORVJFUSwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfT0NTUF9TSU5HTEVSRVNQKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShPQ1NQX1NJTkdMRVJFU1AsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfT0NTUF9TSU5HTEVSRVNQKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoT0NTUF9TSU5HTEVSRVNQLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfT0NTUF9TSU5HTEVSRVNQKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhPQ1NQX1NJTkdMRVJFU1AsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX09DU1BfU0lOR0xFUkVTUChidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soT0NTUF9TSU5HTEVSRVNQLCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9QS0NTMTJfU0FGRUJBRyhzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoUEtDUzEyX1NBRkVCQUcsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfUEtDUzEyX1NBRkVCQUcoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChQS0NTMTJfU0FGRUJBRywgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1BLQ1MxMl9TQUZFQkFHKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfUEtDUzEyX1NBRkVCQUcoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFBLQ1MxMl9TQUZFQkFHLCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9QS0NTNyhzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoUEtDUzcsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfUEtDUzcoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChQS0NTNywgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1BLQ1M3KHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhQS0NTNywgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfUEtDUzcoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFBLQ1M3LCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9QS0NTN19SRUNJUF9JTkZPKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1JFQ0lQX0lORk8oc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfUEtDUzdfUkVDSVBfSU5GTyhzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfUEtDUzdfUkVDSVBfSU5GTyhidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soUEtDUzdfUkVDSVBfSU5GTywgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfUEtDUzdfU0lHTkVSX0lORk8oc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKFBLQ1M3X1NJR05FUl9JTkZPLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1NJR05FUl9JTkZPKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoUEtDUzdfU0lHTkVSX0lORk8sIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19QS0NTN19TSUdORVJfSU5GTyhzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soUEtDUzdfU0lHTkVSX0lORk8sIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX1BLQ1M3X1NJR05FUl9JTkZPKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhQS0NTN19TSUdORVJfSU5GTywgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfUE9MSUNZSU5GTyhzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoUE9MSUNZSU5GTywgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9QT0xJQ1lJTkZPKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoUE9MSUNZSU5GTywgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1BPTElDWUlORk8oc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFBPTElDWUlORk8sIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX1BPTElDWUlORk8oYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFBPTElDWUlORk8sIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1BPTElDWVFVQUxJTkZPKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShQT0xJQ1lRVUFMSU5GTywgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9QT0xJQ1lRVUFMSU5GTyhzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfUE9MSUNZUVVBTElORk8oc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19QT0xJQ1lRVUFMSU5GTyhidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soUE9MSUNZUVVBTElORk8sIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1NYTkVUSUQoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKFNYTkVUSUQsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfU1hORVRJRChzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFNYTkVUSUQsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19TWE5FVElEKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhTWE5FVElELCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19TWE5FVElEKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhTWE5FVElELCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9YNTA5KHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5LCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1g1MDkoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChYNTA5LCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOShzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soWDUwOSwgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfWDUwOShidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOSwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfWDUwOV9BTEdPUihzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoWDUwOV9BTEdPUiwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9YNTA5X0FMR09SKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoWDUwOV9BTEdPUiwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1g1MDlfQUxHT1Ioc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFg1MDlfQUxHT1IsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX1g1MDlfQUxHT1IoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFg1MDlfQUxHT1IsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1g1MDlfQVRUUklCVVRFKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5X0FUVFJJQlVURSwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9YNTA5X0FUVFJJQlVURShzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOV9BVFRSSUJVVEUoc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19YNTA5X0FUVFJJQlVURShidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOV9BVFRSSUJVVEUsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1g1MDlfQ1JMKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5X0NSTCwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9YNTA5X0NSTChzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFg1MDlfQ1JMLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOV9DUkwoc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFg1MDlfQ1JMLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19YNTA5X0NSTChidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOV9DUkwsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1g1MDlfRVhURU5TSU9OKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5X0VYVEVOU0lPTiwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9YNTA5X0VYVEVOU0lPTihzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFg1MDlfRVhURU5TSU9OLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOV9FWFRFTlNJT04oc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFg1MDlfRVhURU5TSU9OLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19YNTA5X0VYVEVOU0lPTihidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOV9FWFRFTlNJT04sIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1g1MDlfTkFNRV9FTlRSWShzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1g1MDlfTkFNRV9FTlRSWShzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1g1MDlfTkFNRV9FTlRSWShzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19YNTA5X05BTUVfRU5UUlkoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFg1MDlfTkFNRV9FTlRSWSwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfWDUwOV9SRVZPS0VEKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5X1JFVk9LRUQsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfWDUwOV9SRVZPS0VEKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoWDUwOV9SRVZPS0VELCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOV9SRVZPS0VEKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhYNTA5X1JFVk9LRUQsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX1g1MDlfUkVWT0tFRChidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOV9SRVZPS0VELCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIFBLQ1MxMl9kZWNyeXB0X2QyaV9QS0NTMTJfU0FGRUJBRyhhbGdvciwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgcGFzcywgcGFzc2xlbiwgb2N0LCBzZXEpIFwKKwlTS01fUEtDUzEyX2RlY3J5cHRfZDJpKFBLQ1MxMl9TQUZFQkFHLCAoYWxnb3IpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKHBhc3MpLCAocGFzc2xlbiksIChvY3QpLCAoc2VxKSkKKworI2RlZmluZSBQS0NTMTJfZGVjcnlwdF9kMmlfUEtDUzcoYWxnb3IsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIHBhc3MsIHBhc3NsZW4sIG9jdCwgc2VxKSBcCisJU0tNX1BLQ1MxMl9kZWNyeXB0X2QyaShQS0NTNywgKGFsZ29yKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChwYXNzKSwgKHBhc3NsZW4pLCAob2N0KSwgKHNlcSkpCisKKyNkZWZpbmUgbGhfQURERURfT0JKX25ldygpIExITV9saF9uZXcoQURERURfT0JKLGFkZGVkX29iaikKKyNkZWZpbmUgbGhfQURERURfT0JKX2luc2VydChsaCxpbnN0KSBMSE1fbGhfaW5zZXJ0KEFEREVEX09CSixsaCxpbnN0KQorI2RlZmluZSBsaF9BRERFRF9PQkpfcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKEFEREVEX09CSixsaCxpbnN0KQorI2RlZmluZSBsaF9BRERFRF9PQkpfZGVsZXRlKGxoLGluc3QpIExITV9saF9kZWxldGUoQURERURfT0JKLGxoLGluc3QpCisjZGVmaW5lIGxoX0FEREVEX09CSl9kb2FsbChsaCxmbikgTEhNX2xoX2RvYWxsKEFEREVEX09CSixsaCxmbikKKyNkZWZpbmUgbGhfQURERURfT0JKX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhBRERFRF9PQkosbGgsZm4sYXJnX3R5cGUsYXJnKQorI2RlZmluZSBsaF9BRERFRF9PQkpfZXJyb3IobGgpIExITV9saF9lcnJvcihBRERFRF9PQkosbGgpCisjZGVmaW5lIGxoX0FEREVEX09CSl9udW1faXRlbXMobGgpIExITV9saF9udW1faXRlbXMoQURERURfT0JKLGxoKQorI2RlZmluZSBsaF9BRERFRF9PQkpfZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKEFEREVEX09CSixsaCkKKyNkZWZpbmUgbGhfQURERURfT0JKX25vZGVfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV9zdGF0c19iaW8oQURERURfT0JKLGxoLG91dCkKKyNkZWZpbmUgbGhfQURERURfT0JKX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oQURERURfT0JKLGxoLG91dCkKKyNkZWZpbmUgbGhfQURERURfT0JKX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhBRERFRF9PQkosbGgsb3V0KQorI2RlZmluZSBsaF9BRERFRF9PQkpfZnJlZShsaCkgTEhNX2xoX2ZyZWUoQURERURfT0JKLGxoKQorCisjZGVmaW5lIGxoX0FQUF9JTkZPX25ldygpIExITV9saF9uZXcoQVBQX0lORk8sYXBwX2luZm8pCisjZGVmaW5lIGxoX0FQUF9JTkZPX2luc2VydChsaCxpbnN0KSBMSE1fbGhfaW5zZXJ0KEFQUF9JTkZPLGxoLGluc3QpCisjZGVmaW5lIGxoX0FQUF9JTkZPX3JldHJpZXZlKGxoLGluc3QpIExITV9saF9yZXRyaWV2ZShBUFBfSU5GTyxsaCxpbnN0KQorI2RlZmluZSBsaF9BUFBfSU5GT19kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShBUFBfSU5GTyxsaCxpbnN0KQorI2RlZmluZSBsaF9BUFBfSU5GT19kb2FsbChsaCxmbikgTEhNX2xoX2RvYWxsKEFQUF9JTkZPLGxoLGZuKQorI2RlZmluZSBsaF9BUFBfSU5GT19kb2FsbF9hcmcobGgsZm4sYXJnX3R5cGUsYXJnKSBcCisgIExITV9saF9kb2FsbF9hcmcoQVBQX0lORk8sbGgsZm4sYXJnX3R5cGUsYXJnKQorI2RlZmluZSBsaF9BUFBfSU5GT19lcnJvcihsaCkgTEhNX2xoX2Vycm9yKEFQUF9JTkZPLGxoKQorI2RlZmluZSBsaF9BUFBfSU5GT19udW1faXRlbXMobGgpIExITV9saF9udW1faXRlbXMoQVBQX0lORk8sbGgpCisjZGVmaW5lIGxoX0FQUF9JTkZPX2Rvd25fbG9hZChsaCkgTEhNX2xoX2Rvd25fbG9hZChBUFBfSU5GTyxsaCkKKyNkZWZpbmUgbGhfQVBQX0lORk9fbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhBUFBfSU5GTyxsaCxvdXQpCisjZGVmaW5lIGxoX0FQUF9JTkZPX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oQVBQX0lORk8sbGgsb3V0KQorI2RlZmluZSBsaF9BUFBfSU5GT19zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9zdGF0c19iaW8oQVBQX0lORk8sbGgsb3V0KQorI2RlZmluZSBsaF9BUFBfSU5GT19mcmVlKGxoKSBMSE1fbGhfZnJlZShBUFBfSU5GTyxsaCkKKworI2RlZmluZSBsaF9DT05GX1ZBTFVFX25ldygpIExITV9saF9uZXcoQ09ORl9WQUxVRSxjb25mX3ZhbHVlKQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX2luc2VydChsaCxpbnN0KSBMSE1fbGhfaW5zZXJ0KENPTkZfVkFMVUUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9yZXRyaWV2ZShsaCxpbnN0KSBMSE1fbGhfcmV0cmlldmUoQ09ORl9WQUxVRSxsaCxpbnN0KQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKENPTkZfVkFMVUUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9kb2FsbChsaCxmbikgTEhNX2xoX2RvYWxsKENPTkZfVkFMVUUsbGgsZm4pCisjZGVmaW5lIGxoX0NPTkZfVkFMVUVfZG9hbGxfYXJnKGxoLGZuLGFyZ190eXBlLGFyZykgXAorICBMSE1fbGhfZG9hbGxfYXJnKENPTkZfVkFMVUUsbGgsZm4sYXJnX3R5cGUsYXJnKQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoQ09ORl9WQUxVRSxsaCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9udW1faXRlbXMobGgpIExITV9saF9udW1faXRlbXMoQ09ORl9WQUxVRSxsaCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9kb3duX2xvYWQobGgpIExITV9saF9kb3duX2xvYWQoQ09ORl9WQUxVRSxsaCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKENPTkZfVkFMVUUsbGgsb3V0KQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oQ09ORl9WQUxVRSxsaCxvdXQpCisjZGVmaW5lIGxoX0NPTkZfVkFMVUVfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfc3RhdHNfYmlvKENPTkZfVkFMVUUsbGgsb3V0KQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX2ZyZWUobGgpIExITV9saF9mcmVlKENPTkZfVkFMVUUsbGgpCisKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfbmV3KCkgTEhNX2xoX25ldyhFTkdJTkVfUElMRSxlbmdpbmVfcGlsZSkKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfaW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoRU5HSU5FX1BJTEUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKEVOR0lORV9QSUxFLGxoLGluc3QpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKEVOR0lORV9QSUxFLGxoLGluc3QpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoRU5HSU5FX1BJTEUsbGgsZm4pCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhFTkdJTkVfUElMRSxsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoRU5HSU5FX1BJTEUsbGgpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhFTkdJTkVfUElMRSxsaCkKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKEVOR0lORV9QSUxFLGxoKQorI2RlZmluZSBsaF9FTkdJTkVfUElMRV9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKEVOR0lORV9QSUxFLGxoLG91dCkKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhFTkdJTkVfUElMRSxsaCxvdXQpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhFTkdJTkVfUElMRSxsaCxvdXQpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2ZyZWUobGgpIExITV9saF9mcmVlKEVOR0lORV9QSUxFLGxoKQorCisjZGVmaW5lIGxoX0VSUl9TVEFURV9uZXcoKSBMSE1fbGhfbmV3KEVSUl9TVEFURSxlcnJfc3RhdGUpCisjZGVmaW5lIGxoX0VSUl9TVEFURV9pbnNlcnQobGgsaW5zdCkgTEhNX2xoX2luc2VydChFUlJfU1RBVEUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX3JldHJpZXZlKGxoLGluc3QpIExITV9saF9yZXRyaWV2ZShFUlJfU1RBVEUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKEVSUl9TVEFURSxsaCxpbnN0KQorI2RlZmluZSBsaF9FUlJfU1RBVEVfZG9hbGwobGgsZm4pIExITV9saF9kb2FsbChFUlJfU1RBVEUsbGgsZm4pCisjZGVmaW5lIGxoX0VSUl9TVEFURV9kb2FsbF9hcmcobGgsZm4sYXJnX3R5cGUsYXJnKSBcCisgIExITV9saF9kb2FsbF9hcmcoRVJSX1NUQVRFLGxoLGZuLGFyZ190eXBlLGFyZykKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoRVJSX1NUQVRFLGxoKQorI2RlZmluZSBsaF9FUlJfU1RBVEVfbnVtX2l0ZW1zKGxoKSBMSE1fbGhfbnVtX2l0ZW1zKEVSUl9TVEFURSxsaCkKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2Rvd25fbG9hZChsaCkgTEhNX2xoX2Rvd25fbG9hZChFUlJfU1RBVEUsbGgpCisjZGVmaW5lIGxoX0VSUl9TVEFURV9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKEVSUl9TVEFURSxsaCxvdXQpCisjZGVmaW5lIGxoX0VSUl9TVEFURV9ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKEVSUl9TVEFURSxsaCxvdXQpCisjZGVmaW5lIGxoX0VSUl9TVEFURV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9zdGF0c19iaW8oRVJSX1NUQVRFLGxoLG91dCkKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2ZyZWUobGgpIExITV9saF9mcmVlKEVSUl9TVEFURSxsaCkKKworI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfbmV3KCkgTEhNX2xoX25ldyhFUlJfU1RSSU5HX0RBVEEsZXJyX3N0cmluZ19kYXRhKQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfaW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoRVJSX1NUUklOR19EQVRBLGxoLGluc3QpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9yZXRyaWV2ZShsaCxpbnN0KSBMSE1fbGhfcmV0cmlldmUoRVJSX1NUUklOR19EQVRBLGxoLGluc3QpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShFUlJfU1RSSU5HX0RBVEEsbGgsaW5zdCkKKyNkZWZpbmUgbGhfRVJSX1NUUklOR19EQVRBX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoRVJSX1NUUklOR19EQVRBLGxoLGZuKQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfZG9hbGxfYXJnKGxoLGZuLGFyZ190eXBlLGFyZykgXAorICBMSE1fbGhfZG9hbGxfYXJnKEVSUl9TVFJJTkdfREFUQSxsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9lcnJvcihsaCkgTEhNX2xoX2Vycm9yKEVSUl9TVFJJTkdfREFUQSxsaCkKKyNkZWZpbmUgbGhfRVJSX1NUUklOR19EQVRBX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhFUlJfU1RSSU5HX0RBVEEsbGgpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9kb3duX2xvYWQobGgpIExITV9saF9kb3duX2xvYWQoRVJSX1NUUklOR19EQVRBLGxoKQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhFUlJfU1RSSU5HX0RBVEEsbGgsb3V0KQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhFUlJfU1RSSU5HX0RBVEEsbGgsb3V0KQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfc3RhdHNfYmlvKEVSUl9TVFJJTkdfREFUQSxsaCxvdXQpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9mcmVlKGxoKSBMSE1fbGhfZnJlZShFUlJfU1RSSU5HX0RBVEEsbGgpCisKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9uZXcoKSBMSE1fbGhfbmV3KEVYX0NMQVNTX0lURU0sZXhfY2xhc3NfaXRlbSkKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9pbnNlcnQobGgsaW5zdCkgTEhNX2xoX2luc2VydChFWF9DTEFTU19JVEVNLGxoLGluc3QpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKEVYX0NMQVNTX0lURU0sbGgsaW5zdCkKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShFWF9DTEFTU19JVEVNLGxoLGluc3QpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fZG9hbGwobGgsZm4pIExITV9saF9kb2FsbChFWF9DTEFTU19JVEVNLGxoLGZuKQorI2RlZmluZSBsaF9FWF9DTEFTU19JVEVNX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhFWF9DTEFTU19JVEVNLGxoLGZuLGFyZ190eXBlLGFyZykKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9lcnJvcihsaCkgTEhNX2xoX2Vycm9yKEVYX0NMQVNTX0lURU0sbGgpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fbnVtX2l0ZW1zKGxoKSBMSE1fbGhfbnVtX2l0ZW1zKEVYX0NMQVNTX0lURU0sbGgpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKEVYX0NMQVNTX0lURU0sbGgpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhFWF9DTEFTU19JVEVNLGxoLG91dCkKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKEVYX0NMQVNTX0lURU0sbGgsb3V0KQorI2RlZmluZSBsaF9FWF9DTEFTU19JVEVNX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhFWF9DTEFTU19JVEVNLGxoLG91dCkKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9mcmVlKGxoKSBMSE1fbGhfZnJlZShFWF9DTEFTU19JVEVNLGxoKQorCisjZGVmaW5lIGxoX0ZVTkNUSU9OX25ldygpIExITV9saF9uZXcoRlVOQ1RJT04sZnVuY3Rpb24pCisjZGVmaW5lIGxoX0ZVTkNUSU9OX2luc2VydChsaCxpbnN0KSBMSE1fbGhfaW5zZXJ0KEZVTkNUSU9OLGxoLGluc3QpCisjZGVmaW5lIGxoX0ZVTkNUSU9OX3JldHJpZXZlKGxoLGluc3QpIExITV9saF9yZXRyaWV2ZShGVU5DVElPTixsaCxpbnN0KQorI2RlZmluZSBsaF9GVU5DVElPTl9kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShGVU5DVElPTixsaCxpbnN0KQorI2RlZmluZSBsaF9GVU5DVElPTl9kb2FsbChsaCxmbikgTEhNX2xoX2RvYWxsKEZVTkNUSU9OLGxoLGZuKQorI2RlZmluZSBsaF9GVU5DVElPTl9kb2FsbF9hcmcobGgsZm4sYXJnX3R5cGUsYXJnKSBcCisgIExITV9saF9kb2FsbF9hcmcoRlVOQ1RJT04sbGgsZm4sYXJnX3R5cGUsYXJnKQorI2RlZmluZSBsaF9GVU5DVElPTl9lcnJvcihsaCkgTEhNX2xoX2Vycm9yKEZVTkNUSU9OLGxoKQorI2RlZmluZSBsaF9GVU5DVElPTl9udW1faXRlbXMobGgpIExITV9saF9udW1faXRlbXMoRlVOQ1RJT04sbGgpCisjZGVmaW5lIGxoX0ZVTkNUSU9OX2Rvd25fbG9hZChsaCkgTEhNX2xoX2Rvd25fbG9hZChGVU5DVElPTixsaCkKKyNkZWZpbmUgbGhfRlVOQ1RJT05fbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhGVU5DVElPTixsaCxvdXQpCisjZGVmaW5lIGxoX0ZVTkNUSU9OX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oRlVOQ1RJT04sbGgsb3V0KQorI2RlZmluZSBsaF9GVU5DVElPTl9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9zdGF0c19iaW8oRlVOQ1RJT04sbGgsb3V0KQorI2RlZmluZSBsaF9GVU5DVElPTl9mcmVlKGxoKSBMSE1fbGhfZnJlZShGVU5DVElPTixsaCkKKworI2RlZmluZSBsaF9NRU1fbmV3KCkgTEhNX2xoX25ldyhNRU0sbWVtKQorI2RlZmluZSBsaF9NRU1faW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoTUVNLGxoLGluc3QpCisjZGVmaW5lIGxoX01FTV9yZXRyaWV2ZShsaCxpbnN0KSBMSE1fbGhfcmV0cmlldmUoTUVNLGxoLGluc3QpCisjZGVmaW5lIGxoX01FTV9kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShNRU0sbGgsaW5zdCkKKyNkZWZpbmUgbGhfTUVNX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoTUVNLGxoLGZuKQorI2RlZmluZSBsaF9NRU1fZG9hbGxfYXJnKGxoLGZuLGFyZ190eXBlLGFyZykgXAorICBMSE1fbGhfZG9hbGxfYXJnKE1FTSxsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX01FTV9lcnJvcihsaCkgTEhNX2xoX2Vycm9yKE1FTSxsaCkKKyNkZWZpbmUgbGhfTUVNX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhNRU0sbGgpCisjZGVmaW5lIGxoX01FTV9kb3duX2xvYWQobGgpIExITV9saF9kb3duX2xvYWQoTUVNLGxoKQorI2RlZmluZSBsaF9NRU1fbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhNRU0sbGgsb3V0KQorI2RlZmluZSBsaF9NRU1fbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhNRU0sbGgsb3V0KQorI2RlZmluZSBsaF9NRU1fc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfc3RhdHNfYmlvKE1FTSxsaCxvdXQpCisjZGVmaW5lIGxoX01FTV9mcmVlKGxoKSBMSE1fbGhfZnJlZShNRU0sbGgpCisKKyNkZWZpbmUgbGhfT0JKX05BTUVfbmV3KCkgTEhNX2xoX25ldyhPQkpfTkFNRSxvYmpfbmFtZSkKKyNkZWZpbmUgbGhfT0JKX05BTUVfaW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoT0JKX05BTUUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT0JKX05BTUVfcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKE9CSl9OQU1FLGxoLGluc3QpCisjZGVmaW5lIGxoX09CSl9OQU1FX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKE9CSl9OQU1FLGxoLGluc3QpCisjZGVmaW5lIGxoX09CSl9OQU1FX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoT0JKX05BTUUsbGgsZm4pCisjZGVmaW5lIGxoX09CSl9OQU1FX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhPQkpfTkFNRSxsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX09CSl9OQU1FX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoT0JKX05BTUUsbGgpCisjZGVmaW5lIGxoX09CSl9OQU1FX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhPQkpfTkFNRSxsaCkKKyNkZWZpbmUgbGhfT0JKX05BTUVfZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKE9CSl9OQU1FLGxoKQorI2RlZmluZSBsaF9PQkpfTkFNRV9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKE9CSl9OQU1FLGxoLG91dCkKKyNkZWZpbmUgbGhfT0JKX05BTUVfbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhPQkpfTkFNRSxsaCxvdXQpCisjZGVmaW5lIGxoX09CSl9OQU1FX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhPQkpfTkFNRSxsaCxvdXQpCisjZGVmaW5lIGxoX09CSl9OQU1FX2ZyZWUobGgpIExITV9saF9mcmVlKE9CSl9OQU1FLGxoKQorCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19uZXcoKSBMSE1fbGhfbmV3KE9QRU5TU0xfQ1NUUklORyxvcGVuc3NsX2NzdHJpbmcpCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19pbnNlcnQobGgsaW5zdCkgTEhNX2xoX2luc2VydChPUEVOU1NMX0NTVFJJTkcsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX3JldHJpZXZlKGxoLGluc3QpIExITV9saF9yZXRyaWV2ZShPUEVOU1NMX0NTVFJJTkcsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKE9QRU5TU0xfQ1NUUklORyxsaCxpbnN0KQorI2RlZmluZSBsaF9PUEVOU1NMX0NTVFJJTkdfZG9hbGwobGgsZm4pIExITV9saF9kb2FsbChPUEVOU1NMX0NTVFJJTkcsbGgsZm4pCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19kb2FsbF9hcmcobGgsZm4sYXJnX3R5cGUsYXJnKSBcCisgIExITV9saF9kb2FsbF9hcmcoT1BFTlNTTF9DU1RSSU5HLGxoLGZuLGFyZ190eXBlLGFyZykKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoT1BFTlNTTF9DU1RSSU5HLGxoKQorI2RlZmluZSBsaF9PUEVOU1NMX0NTVFJJTkdfbnVtX2l0ZW1zKGxoKSBMSE1fbGhfbnVtX2l0ZW1zKE9QRU5TU0xfQ1NUUklORyxsaCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX2Rvd25fbG9hZChsaCkgTEhNX2xoX2Rvd25fbG9hZChPUEVOU1NMX0NTVFJJTkcsbGgpCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKE9QRU5TU0xfQ1NUUklORyxsaCxvdXQpCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKE9QRU5TU0xfQ1NUUklORyxsaCxvdXQpCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9zdGF0c19iaW8oT1BFTlNTTF9DU1RSSU5HLGxoLG91dCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX2ZyZWUobGgpIExITV9saF9mcmVlKE9QRU5TU0xfQ1NUUklORyxsaCkKKworI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19uZXcoKSBMSE1fbGhfbmV3KE9QRU5TU0xfU1RSSU5HLG9wZW5zc2xfc3RyaW5nKQorI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19pbnNlcnQobGgsaW5zdCkgTEhNX2xoX2luc2VydChPUEVOU1NMX1NUUklORyxsaCxpbnN0KQorI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19yZXRyaWV2ZShsaCxpbnN0KSBMSE1fbGhfcmV0cmlldmUoT1BFTlNTTF9TVFJJTkcsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZGVsZXRlKGxoLGluc3QpIExITV9saF9kZWxldGUoT1BFTlNTTF9TVFJJTkcsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZG9hbGwobGgsZm4pIExITV9saF9kb2FsbChPUEVOU1NMX1NUUklORyxsaCxmbikKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZG9hbGxfYXJnKGxoLGZuLGFyZ190eXBlLGFyZykgXAorICBMSE1fbGhfZG9hbGxfYXJnKE9QRU5TU0xfU1RSSU5HLGxoLGZuLGFyZ190eXBlLGFyZykKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZXJyb3IobGgpIExITV9saF9lcnJvcihPUEVOU1NMX1NUUklORyxsaCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfbnVtX2l0ZW1zKGxoKSBMSE1fbGhfbnVtX2l0ZW1zKE9QRU5TU0xfU1RSSU5HLGxoKQorI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19kb3duX2xvYWQobGgpIExITV9saF9kb3duX2xvYWQoT1BFTlNTTF9TVFJJTkcsbGgpCisjZGVmaW5lIGxoX09QRU5TU0xfU1RSSU5HX25vZGVfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV9zdGF0c19iaW8oT1BFTlNTTF9TVFJJTkcsbGgsb3V0KQorI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKE9QRU5TU0xfU1RSSU5HLGxoLG91dCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfc3RhdHNfYmlvKE9QRU5TU0xfU1RSSU5HLGxoLG91dCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZnJlZShsaCkgTEhNX2xoX2ZyZWUoT1BFTlNTTF9TVFJJTkcsbGgpCisKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fbmV3KCkgTEhNX2xoX25ldyhTU0xfU0VTU0lPTixzc2xfc2Vzc2lvbikKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05faW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoU1NMX1NFU1NJT04sbGgsaW5zdCkKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKFNTTF9TRVNTSU9OLGxoLGluc3QpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKFNTTF9TRVNTSU9OLGxoLGluc3QpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoU1NMX1NFU1NJT04sbGgsZm4pCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhTU0xfU0VTU0lPTixsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoU1NMX1NFU1NJT04sbGgpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhTU0xfU0VTU0lPTixsaCkKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKFNTTF9TRVNTSU9OLGxoKQorI2RlZmluZSBsaF9TU0xfU0VTU0lPTl9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKFNTTF9TRVNTSU9OLGxoLG91dCkKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhTU0xfU0VTU0lPTixsaCxvdXQpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhTU0xfU0VTU0lPTixsaCxvdXQpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2ZyZWUobGgpIExITV9saF9mcmVlKFNTTF9TRVNTSU9OLGxoKQorLyogRW5kIG9mIHV0aWwvbWtzdGFjay5wbCBibG9jaywgeW91IG1heSBub3cgZWRpdCA6LSkgKi8KKworI2VuZGlmIC8qICFkZWZpbmVkIEhFQURFUl9TQUZFU1RBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3N0YWNrL3N0YWNrLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RhY2svc3RhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNmMWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3N0YWNrL3N0YWNrLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qIGNyeXB0by9zdGFjay9zdGFjay5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKy8qIENvZGUgZm9yIHN0YWNrcworICogQXV0aG9yIC0gRXJpYyBZb3VuZyB2IDEuMAorICogMS4yIGVheSAxMi1NYXItOTcgLQlNb2RpZmllZCBza19maW5kIHNvIHRoYXQgaXQgX0RPRVNfIHJldHVybiB0aGUKKyAqCQkJbG93ZXN0IGluZGV4IGZvciB0aGUgc2VhcmNoZWQgaXRlbS4KKyAqCisgKiAxLjEgZWF5IC0gVGFrZSBmcm9tIG5ldGRiIGFuZCBhZGRlZCB0byBTU0xlYXkKKyAqCisgKiAxLjAgZWF5IC0gRmlyc3QgdmVyc2lvbiAyOS8wNy85MgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKworI3VuZGVmIE1JTl9OT0RFUworI2RlZmluZSBNSU5fTk9ERVMJNAorCitjb25zdCBjaGFyIFNUQUNLX3ZlcnNpb25bXT0iU3RhY2siIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworI2luY2x1ZGUgPGVycm5vLmg+CisKK2ludCAoKnNrX3NldF9jbXBfZnVuYyhfU1RBQ0sgKnNrLCBpbnQgKCpjKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpKQorCQkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopCisJeworCWludCAoKm9sZCkoY29uc3Qgdm9pZCAqLGNvbnN0IHZvaWQgKik9c2stPmNvbXA7CisKKwlpZiAoc2stPmNvbXAgIT0gYykKKwkJc2stPnNvcnRlZD0wOworCXNrLT5jb21wPWM7CisKKwlyZXR1cm4gb2xkOworCX0KKworX1NUQUNLICpza19kdXAoX1NUQUNLICpzaykKKwl7CisJX1NUQUNLICpyZXQ7CisJY2hhciAqKnM7CisKKwlpZiAoKHJldD1za19uZXcoc2stPmNvbXApKSA9PSBOVUxMKSBnb3RvIGVycjsKKwlzPShjaGFyICoqKU9QRU5TU0xfcmVhbGxvYygoY2hhciAqKXJldC0+ZGF0YSwKKwkJKHVuc2lnbmVkIGludClzaXplb2YoY2hhciAqKSpzay0+bnVtX2FsbG9jKTsKKwlpZiAocyA9PSBOVUxMKSBnb3RvIGVycjsKKwlyZXQtPmRhdGE9czsKKworCXJldC0+bnVtPXNrLT5udW07CisJbWVtY3B5KHJldC0+ZGF0YSxzay0+ZGF0YSxzaXplb2YoY2hhciAqKSpzay0+bnVtKTsKKwlyZXQtPnNvcnRlZD1zay0+c29ydGVkOworCXJldC0+bnVtX2FsbG9jPXNrLT5udW1fYWxsb2M7CisJcmV0LT5jb21wPXNrLT5jb21wOworCXJldHVybihyZXQpOworZXJyOgorCWlmKHJldCkKKwkJc2tfZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKKwl9CisKK19TVEFDSyAqc2tfbmV3X251bGwodm9pZCkKKwl7CisJcmV0dXJuIHNrX25ldygoaW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpMCk7CisJfQorCitfU1RBQ0sgKnNrX25ldyhpbnQgKCpjKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpCisJeworCV9TVEFDSyAqcmV0OworCWludCBpOworCisJaWYgKChyZXQ9T1BFTlNTTF9tYWxsb2Moc2l6ZW9mKF9TVEFDSykpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAoKHJldC0+ZGF0YT1PUEVOU1NMX21hbGxvYyhzaXplb2YoY2hhciAqKSpNSU5fTk9ERVMpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlmb3IgKGk9MDsgaTxNSU5fTk9ERVM7IGkrKykKKwkJcmV0LT5kYXRhW2ldPU5VTEw7CisJcmV0LT5jb21wPWM7CisJcmV0LT5udW1fYWxsb2M9TUlOX05PREVTOworCXJldC0+bnVtPTA7CisJcmV0LT5zb3J0ZWQ9MDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZihyZXQpCisJCU9QRU5TU0xfZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKKwl9CisKK2ludCBza19pbnNlcnQoX1NUQUNLICpzdCwgdm9pZCAqZGF0YSwgaW50IGxvYykKKwl7CisJY2hhciAqKnM7CisKKwlpZihzdCA9PSBOVUxMKSByZXR1cm4gMDsKKwlpZiAoc3QtPm51bV9hbGxvYyA8PSBzdC0+bnVtKzEpCisJCXsKKwkJcz1PUEVOU1NMX3JlYWxsb2MoKGNoYXIgKilzdC0+ZGF0YSwKKwkJCSh1bnNpZ25lZCBpbnQpc2l6ZW9mKGNoYXIgKikqc3QtPm51bV9hbGxvYyoyKTsKKwkJaWYgKHMgPT0gTlVMTCkKKwkJCXJldHVybigwKTsKKwkJc3QtPmRhdGE9czsKKwkJc3QtPm51bV9hbGxvYyo9MjsKKwkJfQorCWlmICgobG9jID49IChpbnQpc3QtPm51bSkgfHwgKGxvYyA8IDApKQorCQlzdC0+ZGF0YVtzdC0+bnVtXT1kYXRhOworCWVsc2UKKwkJeworCQlpbnQgaTsKKwkJY2hhciAqKmYsKip0OworCisJCWY9c3QtPmRhdGE7CisJCXQ9JihzdC0+ZGF0YVsxXSk7CisJCWZvciAoaT1zdC0+bnVtOyBpPj1sb2M7IGktLSkKKwkJCXRbaV09ZltpXTsKKwkJCQorI2lmZGVmIHVuZGVmIC8qIG5vIG1lbW1vdmUgb24gc3Vub3MgOi0oICovCisJCW1lbW1vdmUoJihzdC0+ZGF0YVtsb2MrMV0pLAorCQkJJihzdC0+ZGF0YVtsb2NdKSwKKwkJCXNpemVvZihjaGFyICopKihzdC0+bnVtLWxvYykpOworI2VuZGlmCisJCXN0LT5kYXRhW2xvY109ZGF0YTsKKwkJfQorCXN0LT5udW0rKzsKKwlzdC0+c29ydGVkPTA7CisJcmV0dXJuKHN0LT5udW0pOworCX0KKwordm9pZCAqc2tfZGVsZXRlX3B0cihfU1RBQ0sgKnN0LCB2b2lkICpwKQorCXsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPHN0LT5udW07IGkrKykKKwkJaWYgKHN0LT5kYXRhW2ldID09IHApCisJCQlyZXR1cm4oc2tfZGVsZXRlKHN0LGkpKTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCit2b2lkICpza19kZWxldGUoX1NUQUNLICpzdCwgaW50IGxvYykKKwl7CisJY2hhciAqcmV0OworCWludCBpLGo7CisKKwlpZighc3QgfHwgKGxvYyA8IDApIHx8IChsb2MgPj0gc3QtPm51bSkpIHJldHVybiBOVUxMOworCisJcmV0PXN0LT5kYXRhW2xvY107CisJaWYgKGxvYyAhPSBzdC0+bnVtLTEpCisJCXsKKwkJaj1zdC0+bnVtLTE7CisJCWZvciAoaT1sb2M7IGk8ajsgaSsrKQorCQkJc3QtPmRhdGFbaV09c3QtPmRhdGFbaSsxXTsKKwkJLyogSW4gdGhlb3J5IG1lbWNweSBpcyBub3Qgc2FmZSBmb3IgdGhpcworCQkgKiBtZW1jcHkoICYoc3QtPmRhdGFbbG9jXSksCisJCSAqCSYoc3QtPmRhdGFbbG9jKzFdKSwKKwkJICoJc2l6ZW9mKGNoYXIgKikqKHN0LT5udW0tbG9jLTEpKTsKKwkJICovCisJCX0KKwlzdC0+bnVtLS07CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGludGVybmFsX2ZpbmQoX1NUQUNLICpzdCwgdm9pZCAqZGF0YSwgaW50IHJldF92YWxfb3B0aW9ucykKKwl7CisJY29uc3Qgdm9pZCAqIGNvbnN0ICpyOworCWludCBpOworCisJaWYoc3QgPT0gTlVMTCkgcmV0dXJuIC0xOworCisJaWYgKHN0LT5jb21wID09IE5VTEwpCisJCXsKKwkJZm9yIChpPTA7IGk8c3QtPm51bTsgaSsrKQorCQkJaWYgKHN0LT5kYXRhW2ldID09IGRhdGEpCisJCQkJcmV0dXJuKGkpOworCQlyZXR1cm4oLTEpOworCQl9CisJc2tfc29ydChzdCk7CisJaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwlyPU9CSl9ic2VhcmNoX2V4XygmZGF0YSxzdC0+ZGF0YSxzdC0+bnVtLHNpemVvZih2b2lkICopLHN0LT5jb21wLAorCQkJICByZXRfdmFsX29wdGlvbnMpOworCWlmIChyID09IE5VTEwpIHJldHVybigtMSk7CisJcmV0dXJuIChpbnQpKChjaGFyICoqKXItc3QtPmRhdGEpOworCX0KKworaW50IHNrX2ZpbmQoX1NUQUNLICpzdCwgdm9pZCAqZGF0YSkKKwl7CisJcmV0dXJuIGludGVybmFsX2ZpbmQoc3QsIGRhdGEsIE9CSl9CU0VBUkNIX0ZJUlNUX1ZBTFVFX09OX01BVENIKTsKKwl9CitpbnQgc2tfZmluZF9leChfU1RBQ0sgKnN0LCB2b2lkICpkYXRhKQorCXsKKwlyZXR1cm4gaW50ZXJuYWxfZmluZChzdCwgZGF0YSwgT0JKX0JTRUFSQ0hfVkFMVUVfT05fTk9NQVRDSCk7CisJfQorCitpbnQgc2tfcHVzaChfU1RBQ0sgKnN0LCB2b2lkICpkYXRhKQorCXsKKwlyZXR1cm4oc2tfaW5zZXJ0KHN0LGRhdGEsc3QtPm51bSkpOworCX0KKworaW50IHNrX3Vuc2hpZnQoX1NUQUNLICpzdCwgdm9pZCAqZGF0YSkKKwl7CisJcmV0dXJuKHNrX2luc2VydChzdCxkYXRhLDApKTsKKwl9CisKK3ZvaWQgKnNrX3NoaWZ0KF9TVEFDSyAqc3QpCisJeworCWlmIChzdCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJaWYgKHN0LT5udW0gPD0gMCkgcmV0dXJuKE5VTEwpOworCXJldHVybihza19kZWxldGUoc3QsMCkpOworCX0KKwordm9pZCAqc2tfcG9wKF9TVEFDSyAqc3QpCisJeworCWlmIChzdCA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJaWYgKHN0LT5udW0gPD0gMCkgcmV0dXJuKE5VTEwpOworCXJldHVybihza19kZWxldGUoc3Qsc3QtPm51bS0xKSk7CisJfQorCit2b2lkIHNrX3plcm8oX1NUQUNLICpzdCkKKwl7CisJaWYgKHN0ID09IE5VTEwpIHJldHVybjsKKwlpZiAoc3QtPm51bSA8PSAwKSByZXR1cm47CisJbWVtc2V0KChjaGFyICopc3QtPmRhdGEsMCxzaXplb2Yoc3QtPmRhdGEpKnN0LT5udW0pOworCXN0LT5udW09MDsKKwl9CisKK3ZvaWQgc2tfcG9wX2ZyZWUoX1NUQUNLICpzdCwgdm9pZCAoKmZ1bmMpKHZvaWQgKikpCisJeworCWludCBpOworCisJaWYgKHN0ID09IE5VTEwpIHJldHVybjsKKwlmb3IgKGk9MDsgaTxzdC0+bnVtOyBpKyspCisJCWlmIChzdC0+ZGF0YVtpXSAhPSBOVUxMKQorCQkJZnVuYyhzdC0+ZGF0YVtpXSk7CisJc2tfZnJlZShzdCk7CisJfQorCit2b2lkIHNrX2ZyZWUoX1NUQUNLICpzdCkKKwl7CisJaWYgKHN0ID09IE5VTEwpIHJldHVybjsKKwlpZiAoc3QtPmRhdGEgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHN0LT5kYXRhKTsKKwlPUEVOU1NMX2ZyZWUoc3QpOworCX0KKworaW50IHNrX251bShjb25zdCBfU1RBQ0sgKnN0KQoreworCWlmKHN0ID09IE5VTEwpIHJldHVybiAtMTsKKwlyZXR1cm4gc3QtPm51bTsKK30KKwordm9pZCAqc2tfdmFsdWUoY29uc3QgX1NUQUNLICpzdCwgaW50IGkpCit7CisJaWYoIXN0IHx8IChpIDwgMCkgfHwgKGkgPj0gc3QtPm51bSkpIHJldHVybiBOVUxMOworCXJldHVybiBzdC0+ZGF0YVtpXTsKK30KKwordm9pZCAqc2tfc2V0KF9TVEFDSyAqc3QsIGludCBpLCB2b2lkICp2YWx1ZSkKK3sKKwlpZighc3QgfHwgKGkgPCAwKSB8fCAoaSA+PSBzdC0+bnVtKSkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIChzdC0+ZGF0YVtpXSA9IHZhbHVlKTsKK30KKwordm9pZCBza19zb3J0KF9TVEFDSyAqc3QpCisJeworCWlmIChzdCAmJiAhc3QtPnNvcnRlZCkKKwkJeworCQlpbnQgKCpjb21wX2Z1bmMpKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICopOworCisJCS8qIHNhbWUgY29tbWVudCBhcyBpbiBza19maW5kIC4uLiBwcmV2aW91c2x5IHN0LT5jb21wIHdhcyBkZWNsYXJlZAorCQkgKiBhcyBhICh2b2lkKix2b2lkKikgY2FsbGJhY2sgdHlwZSwgYnV0IHRoaXMgbWFkZSB0aGUgcG9wdWxhdGlvbgorCQkgKiBvZiB0aGUgY2FsbGJhY2sgcG9pbnRlciBpbGxvZ2ljYWwgLSBvdXIgY2FsbGJhY2tzIGNvbXBhcmUKKwkJICogdHlwZSoqIHdpdGggdHlwZSoqLCBzbyB3ZSBsZWF2ZSB0aGUgY2FzdGluZyB1bnRpbCBhYnNvbHV0ZWx5CisJCSAqIG5lY2Vzc2FyeSAoaWUuICJub3ciKS4gKi8KKwkJY29tcF9mdW5jPShpbnQgKCopKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICopKShzdC0+Y29tcCk7CisJCXFzb3J0KHN0LT5kYXRhLHN0LT5udW0sc2l6ZW9mKGNoYXIgKiksIGNvbXBfZnVuYyk7CisJCXN0LT5zb3J0ZWQ9MTsKKwkJfQorCX0KKworaW50IHNrX2lzX3NvcnRlZChjb25zdCBfU1RBQ0sgKnN0KQorCXsKKwlpZiAoIXN0KQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gc3QtPnNvcnRlZDsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc3RhY2svc3RhY2suaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zdGFjay9zdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzVlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RhY2svc3RhY2suaApAQCAtMCwwICsxLDEwOCBAQAorLyogY3J5cHRvL3N0YWNrL3N0YWNrLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfU1RBQ0tfSAorI2RlZmluZSBIRUFERVJfU1RBQ0tfSAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzdGFja19zdAorCXsKKwlpbnQgbnVtOworCWNoYXIgKipkYXRhOworCWludCBzb3J0ZWQ7CisKKwlpbnQgbnVtX2FsbG9jOworCWludCAoKmNvbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKTsKKwl9IF9TVEFDSzsgIC8qIFVzZSBTVEFDS19PRiguLi4pIGluc3RlYWQgKi8KKworI2RlZmluZSBNX3NrX251bShzaykJCSgoc2spID8gKHNrKS0+bnVtOi0xKQorI2RlZmluZSBNX3NrX3ZhbHVlKHNrLG4pCSgoc2spID8gKHNrKS0+ZGF0YVtuXSA6IE5VTEwpCisKK2ludCBza19udW0oY29uc3QgX1NUQUNLICopOwordm9pZCAqc2tfdmFsdWUoY29uc3QgX1NUQUNLICosIGludCk7CisKK3ZvaWQgKnNrX3NldChfU1RBQ0sgKiwgaW50LCB2b2lkICopOworCitfU1RBQ0sgKnNrX25ldyhpbnQgKCpjbXApKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7CitfU1RBQ0sgKnNrX25ld19udWxsKHZvaWQpOwordm9pZCBza19mcmVlKF9TVEFDSyAqKTsKK3ZvaWQgc2tfcG9wX2ZyZWUoX1NUQUNLICpzdCwgdm9pZCAoKmZ1bmMpKHZvaWQgKikpOworaW50IHNrX2luc2VydChfU1RBQ0sgKnNrLCB2b2lkICpkYXRhLCBpbnQgd2hlcmUpOwordm9pZCAqc2tfZGVsZXRlKF9TVEFDSyAqc3QsIGludCBsb2MpOwordm9pZCAqc2tfZGVsZXRlX3B0cihfU1RBQ0sgKnN0LCB2b2lkICpwKTsKK2ludCBza19maW5kKF9TVEFDSyAqc3QsIHZvaWQgKmRhdGEpOworaW50IHNrX2ZpbmRfZXgoX1NUQUNLICpzdCwgdm9pZCAqZGF0YSk7CitpbnQgc2tfcHVzaChfU1RBQ0sgKnN0LCB2b2lkICpkYXRhKTsKK2ludCBza191bnNoaWZ0KF9TVEFDSyAqc3QsIHZvaWQgKmRhdGEpOwordm9pZCAqc2tfc2hpZnQoX1NUQUNLICpzdCk7Cit2b2lkICpza19wb3AoX1NUQUNLICpzdCk7Cit2b2lkIHNrX3plcm8oX1NUQUNLICpzdCk7CitpbnQgKCpza19zZXRfY21wX2Z1bmMoX1NUQUNLICpzaywgaW50ICgqYykoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSkKKwkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOworX1NUQUNLICpza19kdXAoX1NUQUNLICpzdCk7Cit2b2lkIHNrX3NvcnQoX1NUQUNLICpzdCk7CitpbnQgc2tfaXNfc29ydGVkKGNvbnN0IF9TVEFDSyAqc3QpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvUkVBRE1FIGIvbGliL29wZW5zc2wvY3J5cHRvL3N0b3JlL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjYxNjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3N0b3JlL1JFQURNRQpAQCAtMCwwICsxLDk1IEBACitUaGUgU1RPUkUgdHlwZQorPT09PT09PT09PT09PT0KKworQSBTVE9SRSwgYXMgZGVmaW5lZCBpbiB0aGlzIGNvZGUgc2VjdGlvbiwgaXMgcmVhbGx5IGEgcmF0aGVyIHNpbXBsZQordGhpbmcgd2hpY2ggc3RvcmVzIG9iamVjdHMgYW5kIHBlci1vYmplY3QgYXNzb2NpYXRpb25zIHRvIGEgbnVtYmVyCitvZiBhdHRyaWJ1dGVzLiAgV2hhdCBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQgZW50aXJlbHkgZGVwZW5kcyBvbgordGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYSBTVE9SRS4gIEl0IGhhcyBzb21lIHN1cHBvcnQgZm9yCitnZW5lcmF0aW9uIG9mIGNlcnRhaW4gb2JqZWN0cyAoZm9yIGV4YW1wbGUsIGtleXMgYW5kIENSTHMpLgorCisKK1N1cHBvcnRlZCBvYmplY3QgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIG5vdywgdGhlIG9iamVjdHMgdGhhdCBhcmUgc3VwcG9ydGVkIGFyZSB0aGUgZm9sbG93aW5nOgorCitYLjUwOSBjZXJ0aWZpY2F0ZQorWC41MDkgQ1JMCitwcml2YXRlIGtleQorcHVibGljIGtleQorbnVtYmVyCithcmJpdHJhcnkgKGFwcGxpY2F0aW9uKSBkYXRhCisKK1RoZSBpbnRlbnRpb24gaXMgdGhhdCBhIFNUT1JFIHNob3VsZCBiZSBhYmxlIHRvIHN0b3JlIGV2ZXJ5dGhpbmcKK25lZWRlZCBieSBhbiBhcHBsaWNhdGlvbiB0aGF0IHdhbnRzIGEgY2VydC9rZXkgc3RvcmUsIGFzIHdlbGwgYXMKK3RoZSBkYXRhIGEgQ0EgbWlnaHQgbmVlZCB0byBzdG9yZSAodGhpcyBpbmNsdWRlcyB0aGUgc2VyaWFsIG51bWJlcgorY291bnRlciwgd2hpY2ggZXhwbGFpbnMgdGhlIHN1cHBvcnQgZm9yIG51bWJlcnMpLgorCisKK1N1cHBvcnRlZCBhdHRyaWJ1dGUgdHlwZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIG5vdywgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQ6CisKK0ZyaWVuZGx5IE5hbWUJCS0gdGhlIHZhbHVlIGlzIGEgbm9ybWFsIEMgc3RyaW5nCitLZXkgSUQJCQktIHRoZSB2YWx1ZSBpcyBhIDE2MCBiaXQgU0hBMSBoYXNoCitJc3N1ZXIgS2V5IElECQktIHRoZSB2YWx1ZSBpcyBhIDE2MCBiaXQgU0hBMSBoYXNoCitTdWJqZWN0IEtleSBJRAkJLSB0aGUgdmFsdWUgaXMgYSAxNjAgYml0IFNIQTEgaGFzaAorSXNzdWVyL1NlcmlhbCBIYXNoCS0gdGhlIHZhbHVlIGlzIGEgMTYwIGJpdCBTSEExIGhhc2gKK0lzc3VlcgkJCS0gdGhlIHZhbHVlIGlzIGEgWDUwOV9OQU1FCitTZXJpYWwJCQktIHRoZSB2YWx1ZSBpcyBhIEJJR05VTQorU3ViamVjdAkJCS0gdGhlIHZhbHVlIGlzIGEgWDUwOV9OQU1FCitDZXJ0aWZpY2F0ZSBIYXNoCS0gdGhlIHZhbHVlIGlzIGEgMTYwIGJpdCBTSEExIGhhc2gKK0VtYWlsCQkJLSB0aGUgdmFsdWUgaXMgYSBub3JtYWwgQyBzdHJpbmcKK0ZpbGVuYW1lCQktIHRoZSB2YWx1ZSBpcyBhIG5vcm1hbCBDIHN0cmluZworCitJdCBpcyBleHBlY3RlZCB0aGF0IHRoZXNlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGVub3VnaCB0byBzdXBwb3J0Cit0aGUgbmVlZCBmcm9tIG1vc3QsIGlmIG5vdCBhbGwsIGN1cnJlbnQgYXBwbGljYXRpb25zLiAgQXBwbGljYXRpb25zCit0aGF0IG5lZWQgdG8gZG8gY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIHdvdWxkIHR5cGljYWxseSB1c2UgU3ViamVjdAorS2V5IElELCBJc3N1ZXIvU2VyaWFsIEhhc2ggb3IgU3ViamVjdCB0byBsb29rIHVwIGlzc3VlciBjZXJ0aWZpY2F0ZXMuCitTL01JTUUgYXBwbGljYXRpb25zIHdvdWxkIHR5cGljYWxseSB1c2UgRW1haWwgdG8gbG9vayB1cCByZWNpcGllbnQKK2FuZCBzaWduZXIgY2VydGlmaWNhdGVzLgorCitUaGVyZSdzIGFkZGVkIHN1cHBvcnQgZm9yIGNvbWJpbmVkIHNldHMgb2YgYXR0cmlidXRlcyB0byBzZWFyY2ggZm9yLAord2l0aCB0aGUgc3BlY2lhbCBPUiBhdHRyaWJ1dGUuCisKKworU3VwcG9ydGVkIGJhc2ljIGZ1bmN0aW9uYWxpdHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmdW5jdGlvbnMgdGhhdCBhcmUgc3VwcG9ydGVkIHRocm91Z2ggdGhlIFNUT1JFIHR5cGUgYXJlIHRoZXNlOgorCitnZW5lcmF0ZV9vYmplY3QJCS0gZm9yIGV4YW1wbGUgdG8gZ2VuZXJhdGUga2V5cyBhbmQgQ1JMcworZ2V0X29iamVjdAkJLSB0byBsb29rIHVwIG9uZSBvYmplY3QKKwkJCSAgTk9URTogdGhpcyBmdW5jdGlvbiBpcyByZWFsbHkgcmF0aGVyCisJCQkgIHJlZHVuZGFudCBhbmQgcHJvYmFibHkgb2YgbGVzc2VyIHVzYWdlCisJCQkgIHRoYW4gdGhlIGxpc3QgZnVuY3Rpb25zCitzdG9yZV9vYmplY3QJCS0gc3RvcmUgYW4gb2JqZWN0IGFuZCB0aGUgYXR0cmlidXRlcworCQkJICBhc3NvY2lhdGVkIHdpdGggaXQKK21vZGlmeV9vYmplY3QJCS0gbW9kaWZ5IHRoZSBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aAorCQkJICBhIHNwZWNpZmljIG9iamVjdAorcmV2b2tlX29iamVjdAkJLSByZXZva2UgYW4gb2JqZWN0CisJCQkgIE5PVEU6IHRoaXMgb25seSBtYXJrcyBhbiBvYmplY3QgYXMKKwkJCSAgaW52YWxpZCwgaXQgZG9lc24ndCByZW1vdmUgdGhlIG9iamVjdAorCQkJICBmcm9tIHRoZSBkYXRhYmFzZQorZGVsZXRlX29iamVjdAkJLSByZW1vdmUgYW4gb2JqZWN0IGZyb20gdGhlIGRhdGFiYXNlCitsaXN0X29iamVjdAkJLSBsaXN0IG9iamVjdHMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKwkJCSAgc2V0IG9mIGF0dHJpYnV0ZXMKKwkJCSAgTk9URTogdGhpcyBpcyByZWFsbHkgZm91ciBmdW5jdGlvbnM6CisJCQkgIGxpc3Rfc3RhcnQsIGxpc3RfbmV4dCwgbGlzdF9lbmQgYW5kCisJCQkgIGxpc3RfZW5kcAordXBkYXRlX3N0b3JlCQktIHVwZGF0ZSB0aGUgaW50ZXJuYWwgZGF0YSBvZiB0aGUgc3RvcmUKK2xvY2tfc3RvcmUJCS0gbG9jayB0aGUgc3RvcmUKK3VubG9ja19zdG9yZQkJLSB1bmxvY2sgdGhlIHN0b3JlCisKK1RoZSBsaXN0IGZ1bmN0aW9ucyBuZWVkIHNvbWUgZXh0cmEgZXhwbGFuYXRpb246IGxpc3Rfc3RhcnQgaXMKK3VzZWQgdG8gc2V0IHVwIGEgbG9va3VwLiAgVGhhdCdzIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIHRvIHVzZSBpbgordGhlIHNlYXJjaCBhcmUgc2V0IHVwLiAgSXQgcmV0dXJucyBhIHNlYXJjaCBjb250ZXh0LiAgbGlzdF9uZXh0CityZXR1cm5zIHRoZSBuZXh0IG9iamVjdCBzZWFyY2hlZCBmb3IuICBsaXN0X2VuZCBjbG9zZXMgdGhlIHNlYXJjaC4KK2xpc3RfZW5kcCBpcyB1c2VkIHRvIGNoZWNrIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kLgorCitBIGZldyB3b3JkcyBvbiB0aGUgc3RvcmUgZnVuY3Rpb25zIGFzIHdlbGw6IHVwZGF0ZV9zdG9yZSBpcwordHlwaWNhbGx5IHVzZWQgYnkgYSBDQSBhcHBsaWNhdGlvbiB0byB1cGRhdGUgdGhlIGludGVybmFsCitzdHJ1Y3R1cmUgb2YgYSBkYXRhYmFzZS4gIFRoaXMgbWF5IGZvciBleGFtcGxlIGludm9sdmUgYXV0b21hdGljCityZW1vdmFsIG9mIGV4cGlyZWQgY2VydGlmaWNhdGVzLiAgbG9ja19zdG9yZSBhbmQgdW5sb2NrX3N0b3JlCithcmUgdXNlZCBmb3IgbG9ja2luZyBhIHN0b3JlIHRvIGFsbG93IGV4Y2x1c2l2ZSB3cml0ZXMuCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RvcmUuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjhjN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RvcmUuaApAQCAtMCwwICsxLDU2MSBAQAorLyogY3J5cHRvL3N0b3JlL3N0b3JlLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMy4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9TVE9SRV9ICisjZGVmaW5lIEhFQURFUl9TVE9SRV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX1NUT1JFCisjZXJyb3IgU1RPUkUgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQWxyZWFkeSBkZWZpbmVkIGluIG9zc2xfdHlwLmggKi8KKy8qIHR5cGVkZWYgc3RydWN0IHN0b3JlX3N0IFNUT1JFOyAqLworLyogdHlwZWRlZiBzdHJ1Y3Qgc3RvcmVfbWV0aG9kX3N0IFNUT1JFX01FVEhPRDsgKi8KKworCisvKiBBbGwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIDAsIGEgbmVnYXRpdmUgbnVtYmVyIG9yIE5VTEwgb24gZXJyb3IuCisgICBXaGVuIGV2ZXJ5dGhpbmcgaXMgZmluZSwgdGhleSByZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBvciBhIG5vbi1OVUxMCisgICBwb2ludGVyLCBhbGwgZGVwZW5kaW5nIG9uIHRoZWlyIHB1cnBvc2UuICovCisKKy8qIENyZWF0b3JzIGFuZCBkZXN0cnVjdG9yLiAgICovCitTVE9SRSAqU1RPUkVfbmV3X21ldGhvZChjb25zdCBTVE9SRV9NRVRIT0QgKm1ldGhvZCk7CitTVE9SRSAqU1RPUkVfbmV3X2VuZ2luZShFTkdJTkUgKmVuZ2luZSk7Cit2b2lkIFNUT1JFX2ZyZWUoU1RPUkUgKnVpKTsKKworCisvKiBHaXZlIGEgdXNlciBpbnRlcmZhY2UgcGFyYW1ldHJpc2VkIGNvbnRyb2wgY29tbWFuZHMuICBUaGlzIGNhbiBiZSB1c2VkIHRvCisgICBzZW5kIGRvd24gYW4gaW50ZWdlciwgYSBkYXRhIHBvaW50ZXIgb3IgYSBmdW5jdGlvbiBwb2ludGVyLCBhcyB3ZWxsIGFzCisgICBiZSB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tIGEgU1RPUkUuICovCitpbnQgU1RPUkVfY3RybChTVE9SRSAqc3RvcmUsIGludCBjbWQsIGxvbmcgaSwgdm9pZCAqcCwgdm9pZCAoKmYpKHZvaWQpKTsKKworLyogQSBjb250cm9sIHRvIHNldCB0aGUgZGlyZWN0b3J5IHdpdGgga2V5cyBhbmQgY2VydGlmaWNhdGVzLiAgVXNlZCBieSB0aGUKKyAgIGJ1aWx0LWluIGRpcmVjdG9yeSBsZXZlbCBtZXRob2QuICovCisjZGVmaW5lIFNUT1JFX0NUUkxfU0VUX0RJUkVDVE9SWQkweDAwMDEKKy8qIEEgY29udHJvbCB0byBzZXQgYSBmaWxlIHRvIGxvYWQuICBVc2VkIGJ5IHRoZSBidWlsdC1pbiBmaWxlIGxldmVsIG1ldGhvZC4gKi8KKyNkZWZpbmUgU1RPUkVfQ1RSTF9TRVRfRklMRQkJMHgwMDAyCisvKiBBIGNvbnRyb2wgdG8gc2V0IGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGxvYWQuICBDYW4gYmUgdXNlZCBieSBhbnkgbWV0aG9kCisgICB0aGF0IHdpc2hlcyB0byBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlLiAqLworI2RlZmluZSBTVE9SRV9DVFJMX1NFVF9DT05GX0ZJTEUJMHgwMDAzCisvKiBBIGNvbnRyb2wgdG8gc2V0IGEgdGhlIHNlY3Rpb24gb2YgdGhlIGxvYWRlZCBjb25maWd1cmF0aW9uIGZpbGUuICBDYW4gYmUKKyAgIHVzZWQgYnkgYW55IG1ldGhvZCB0aGF0IHdpc2hlcyB0byBsb2FkIGEgY29uZmlndXJhdGlvbiBmaWxlLiAqLworI2RlZmluZSBTVE9SRV9DVFJMX1NFVF9DT05GX1NFQ1RJT04JMHgwMDA0CisKKworLyogU29tZSBtZXRob2RzIG1heSB1c2UgZXh0cmEgZGF0YSAqLworI2RlZmluZSBTVE9SRV9zZXRfYXBwX2RhdGEocyxhcmcpCVNUT1JFX3NldF9leF9kYXRhKHMsMCxhcmcpCisjZGVmaW5lIFNUT1JFX2dldF9hcHBfZGF0YShzKQkJU1RPUkVfZ2V0X2V4X2RhdGEocywwKQoraW50IFNUT1JFX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwlDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgU1RPUkVfc2V0X2V4X2RhdGEoU1RPUkUgKnIsaW50IGlkeCx2b2lkICphcmcpOwordm9pZCAqU1RPUkVfZ2V0X2V4X2RhdGEoU1RPUkUgKnIsIGludCBpZHgpOworCisvKiBVc2Ugc3BlY2lmaWMgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBvbmUgKi8KK2NvbnN0IFNUT1JFX01FVEhPRCAqU1RPUkVfZ2V0X21ldGhvZChTVE9SRSAqc3RvcmUpOworY29uc3QgU1RPUkVfTUVUSE9EICpTVE9SRV9zZXRfbWV0aG9kKFNUT1JFICpzdG9yZSwgY29uc3QgU1RPUkVfTUVUSE9EICptZXRoKTsKKworLyogVGhlIHN0YW5kYXJkIE9wZW5TU0wgbWV0aG9kcy4gKi8KKy8qIFRoaXMgaXMgdGhlIGluLW1lbW9yeSBtZXRob2QuICBJdCBkb2VzIGV2ZXJ5dGhpbmcgZXhjZXB0IHJldm9raW5nIGFuZCB1cGRhdGluZywKKyAgIGFuZCBpcyBvZiBjb3Vyc2Ugdm9sYXRpbGUuICBJdCdzIHVzZWQgYnkgb3RoZXIgbWV0aG9kcyB0aGF0IGhhdmUgYW4gaW4tbWVtb3J5CisgICBjYWNoZS4gKi8KK2NvbnN0IFNUT1JFX01FVEhPRCAqU1RPUkVfTWVtb3J5KHZvaWQpOworI2lmIDAgLyogTm90IHlldCBpbXBsZW1lbnRlZCAqLworLyogVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHN0b3JlLiAgSXQgZG9lcyBldmVyeXRoaW5nIGV4Y2VwdCByZXZva2luZyBhbmQgdXBkYXRpbmcsCisgICBhbmQgdXNlcyBTVE9SRV9NZW1vcnkoKSB0byBjYWNoZSB0aGluZ3MgaW4gbWVtb3J5LiAqLworY29uc3QgU1RPUkVfTUVUSE9EICpTVE9SRV9EaXJlY3Rvcnkodm9pZCk7CisvKiBUaGlzIGlzIHRoZSBmaWxlIHN0b3JlLiAgSXQgZG9lcyBldmVyeXRoaW5nIGV4Y2VwdCByZXZva2luZyBhbmQgdXBkYXRpbmcsCisgICBhbmQgdXNlcyBTVE9SRV9NZW1vcnkoKSB0byBjYWNoZSB0aGluZ3MgaW4gbWVtb3J5LiAgQ2VydGlmaWNhdGVzIGFyZSBhZGRlZAorICAgdG8gaXQgd2l0aCB0aGUgc3RvcmUgb3BlcmF0aW9uLCBhbmQgaXQgd2lsbCBvbmx5IGdldCBjYWNoZWQgY2VydGlmaWNhdGVzLiAqLworY29uc3QgU1RPUkVfTUVUSE9EICpTVE9SRV9GaWxlKHZvaWQpOworI2VuZGlmCisKKy8qIFN0b3JlIGZ1bmN0aW9ucyB0YWtlIGEgdHlwZSBjb2RlIGZvciB0aGUgdHlwZSBvZiBkYXRhIHRoZXkgc2hvdWxkIHN0b3JlCisgICBvciBmZXRjaCAqLwordHlwZWRlZiBlbnVtIFNUT1JFX29iamVjdF90eXBlcworCXsKKwlTVE9SRV9PQkpFQ1RfVFlQRV9YNTA5X0NFUlRJRklDQVRFPQkweDAxLCAvKiBYNTA5ICogKi8KKwlTVE9SRV9PQkpFQ1RfVFlQRV9YNTA5X0NSTD0JCTB4MDIsIC8qIFg1MDlfQ1JMICogKi8KKwlTVE9SRV9PQkpFQ1RfVFlQRV9QUklWQVRFX0tFWT0JCTB4MDMsIC8qIEVWUF9QS0VZICogKi8KKwlTVE9SRV9PQkpFQ1RfVFlQRV9QVUJMSUNfS0VZPQkJMHgwNCwgLyogRVZQX1BLRVkgKiAqLworCVNUT1JFX09CSkVDVF9UWVBFX05VTUJFUj0JCTB4MDUsIC8qIEJJR05VTSAqICovCisJU1RPUkVfT0JKRUNUX1RZUEVfQVJCSVRSQVJZPQkJMHgwNiwgLyogQlVGX01FTSAqICovCisJU1RPUkVfT0JKRUNUX1RZUEVfTlVNPQkJCTB4MDYgIC8qIFRoZSBhbW91bnQgb2Yga25vd24KKwkJCQkJCQkgb2JqZWN0IHR5cGVzICovCisJfSBTVE9SRV9PQkpFQ1RfVFlQRVM7CisvKiBMaXN0IG9mIHRleHQgc3RyaW5ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QgdHlwZXMuICovCitleHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IFNUT1JFX29iamVjdF90eXBlX3N0cmluZ1tTVE9SRV9PQkpFQ1RfVFlQRV9OVU0rMV07CisKKy8qIFNvbWUgc3RvcmUgZnVuY3Rpb25zIHRha2UgYSBwYXJhbWV0ZXIgbGlzdC4gIFRob3NlIHBhcmFtZXRlcnMgY29tZSB3aXRoCisgICBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb2Rlcy4gVGhlIGNvbW1lbnRzIGZvbGxvd2luZyB0aGUgY29kZXMgYmVsb3cgaW5kaWNhdGUKKyAgIHdoYXQgdHlwZSB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgcG9pbnRlciB0by4gKi8KK3R5cGVkZWYgZW51bSBTVE9SRV9wYXJhbXMKKwl7CisJU1RPUkVfUEFSQU1fRVZQX1RZUEU9CQkJMHgwMSwgLyogaW50ICovCisJU1RPUkVfUEFSQU1fQklUUz0JCQkweDAyLCAvKiBzaXplX3QgKi8KKwlTVE9SRV9QQVJBTV9LRVlfUEFSQU1FVEVSUz0JCTB4MDMsIC8qID8/PyAqLworCVNUT1JFX1BBUkFNX0tFWV9OT19QQVJBTUVURVJTPQkJMHgwNCwgLyogTi9BICovCisJU1RPUkVfUEFSQU1fQVVUSF9QQVNTUEhSQVNFPQkJMHgwNSwgLyogY2hhciAqICovCisJU1RPUkVfUEFSQU1fQVVUSF9LUkI1X1RJQ0tFVD0JCTB4MDYsIC8qIHZvaWQgKiAqLworCVNUT1JFX1BBUkFNX1RZUEVfTlVNPQkJCTB4MDYgIC8qIFRoZSBhbW91bnQgb2Yga25vd24KKwkJCQkJCQkgcGFyYW1ldGVyIHR5cGVzICovCisJfSBTVE9SRV9QQVJBTV9UWVBFUzsKKy8qIFBhcmFtZXRlciB2YWx1ZSBzaXplcy4gIC0xIG1lYW5zIHVua25vd24sIGFueXRoaW5nIGVsc2UgaXMgdGhlIHJlcXVpcmVkIHNpemUuICovCitleHRlcm4gY29uc3QgaW50IFNUT1JFX3BhcmFtX3NpemVzW1NUT1JFX1BBUkFNX1RZUEVfTlVNKzFdOworCisvKiBTdG9yZSBmdW5jdGlvbnMgdGFrZSBhdHRyaWJ1dGUgbGlzdHMuICBUaG9zZSBhdHRyaWJ1dGVzIGNvbWUgd2l0aCBjb2Rlcy4KKyAgIFRoZSBjb21tZW50cyBmb2xsb3dpbmcgdGhlIGNvZGVzIGJlbG93IGluZGljYXRlIHdoYXQgdHlwZSB0aGUgdmFsdWUgc2hvdWxkCisgICBiZSBhIHBvaW50ZXIgdG8uICovCit0eXBlZGVmIGVudW0gU1RPUkVfYXR0cmlicworCXsKKwlTVE9SRV9BVFRSX0VORD0JCQkJMHgwMCwKKwlTVE9SRV9BVFRSX0ZSSUVORExZTkFNRT0JCTB4MDEsIC8qIEMgc3RyaW5nICovCisJU1RPUkVfQVRUUl9LRVlJRD0JCQkweDAyLCAvKiAxNjAgYml0IHN0cmluZyAoU0hBMSkgKi8KKwlTVE9SRV9BVFRSX0lTU1VFUktFWUlEPQkJCTB4MDMsIC8qIDE2MCBiaXQgc3RyaW5nIChTSEExKSAqLworCVNUT1JFX0FUVFJfU1VCSkVDVEtFWUlEPQkJMHgwNCwgLyogMTYwIGJpdCBzdHJpbmcgKFNIQTEpICovCisJU1RPUkVfQVRUUl9JU1NVRVJTRVJJQUxIQVNIPQkJMHgwNSwgLyogMTYwIGJpdCBzdHJpbmcgKFNIQTEpICovCisJU1RPUkVfQVRUUl9JU1NVRVI9CQkJMHgwNiwgLyogWDUwOV9OQU1FICogKi8KKwlTVE9SRV9BVFRSX1NFUklBTD0JCQkweDA3LCAvKiBCSUdOVU0gKiAqLworCVNUT1JFX0FUVFJfU1VCSkVDVD0JCQkweDA4LCAvKiBYNTA5X05BTUUgKiAqLworCVNUT1JFX0FUVFJfQ0VSVEhBU0g9CQkJMHgwOSwgLyogMTYwIGJpdCBzdHJpbmcgKFNIQTEpICovCisJU1RPUkVfQVRUUl9FTUFJTD0JCQkweDBhLCAvKiBDIHN0cmluZyAqLworCVNUT1JFX0FUVFJfRklMRU5BTUU9CQkJMHgwYiwgLyogQyBzdHJpbmcgKi8KKwlTVE9SRV9BVFRSX1RZUEVfTlVNPQkJCTB4MGIsIC8qIFRoZSBhbW91bnQgb2Yga25vd24KKwkJCQkJCQkgYXR0cmlidXRlIHR5cGVzICovCisJU1RPUkVfQVRUUl9PUj0JCQkJMHhmZiAgLyogVGhpcyBpcyBhIHNwZWNpYWwKKwkJCQkJCQkgc2VwYXJhdG9yLCB3aGljaAorCQkJCQkJCSBleHByZXNzZXMgdGhlIE9SCisJCQkJCQkJIG9wZXJhdGlvbi4gICovCisJfSBTVE9SRV9BVFRSX1RZUEVTOworLyogQXR0cmlidXRlIHZhbHVlIHNpemVzLiAgLTEgbWVhbnMgdW5rbm93biwgYW55dGhpbmcgZWxzZSBpcyB0aGUgcmVxdWlyZWQgc2l6ZS4gKi8KK2V4dGVybiBjb25zdCBpbnQgU1RPUkVfYXR0cl9zaXplc1tTVE9SRV9BVFRSX1RZUEVfTlVNKzFdOworCit0eXBlZGVmIGVudW0gU1RPUkVfY2VydGlmaWNhdGVfc3RhdHVzCisJeworCVNUT1JFX1g1MDlfVkFMSUQ9CQkJMHgwMCwKKwlTVE9SRV9YNTA5X0VYUElSRUQ9CQkJMHgwMSwKKwlTVE9SRV9YNTA5X1NVU1BFTkRFRD0JCQkweDAyLAorCVNUT1JFX1g1MDlfUkVWT0tFRD0JCQkweDAzCisJfSBTVE9SRV9DRVJUSUZJQ0FURV9TVEFUVVM7CisKKy8qIEVuZ2luZSBzdG9yZSBmdW5jdGlvbnMgd2lsbCByZXR1cm4gYSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgdGhlIG5lY2Vzc2FyeQorICogaW5mb3JtYXRpb24sIGluY2x1ZGluZyByZXZva2F0aW9uIHN0YXR1cyBmb3IgY2VydGlmaWNhdGVzLiAgVGhpcyBpcyByZWFsbHkgbm90CisgKiBuZWVkZWQgZm9yIGFwcGxpY2F0aW9uIGF1dGhvcnMsIGFzIHRoZSBFTkdJTkUgZnJhbWV3b3JrIGZ1bmN0aW9ucyB3aWxsIGV4dHJhY3QKKyAqIHRoZSBPcGVuU1NMLXNwZWNpZmljIGluZm9ybWF0aW9uIHdoZW4gYXQgYWxsIHBvc3NpYmxlLiAgSG93ZXZlciwgZm9yIGVuZ2luZQorICogYXV0aG9ycywgaXQncyBjcnVjaWFsIHRvIGtub3cgdGhpcyBzdHJ1Y3R1cmUuICAqLwordHlwZWRlZiBzdHJ1Y3QgU1RPUkVfT0JKRUNUX3N0CisJeworCVNUT1JFX09CSkVDVF9UWVBFUyB0eXBlOworCXVuaW9uCisJCXsKKwkJc3RydWN0CisJCQl7CisJCQlTVE9SRV9DRVJUSUZJQ0FURV9TVEFUVVMgc3RhdHVzOworCQkJWDUwOSAqY2VydGlmaWNhdGU7CisJCQl9IHg1MDk7CisJCVg1MDlfQ1JMICpjcmw7CisJCUVWUF9QS0VZICprZXk7CisJCUJJR05VTSAqbnVtYmVyOworCQlCVUZfTUVNICphcmJpdHJhcnk7CisJCX0gZGF0YTsKKwl9IFNUT1JFX09CSkVDVDsKK0RFQ0xBUkVfU1RBQ0tfT0YoU1RPUkVfT0JKRUNUKQorU1RPUkVfT0JKRUNUICpTVE9SRV9PQkpFQ1RfbmV3KHZvaWQpOwordm9pZCBTVE9SRV9PQkpFQ1RfZnJlZShTVE9SRV9PQkpFQ1QgKmRhdGEpOworCisKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgaGFuZGxlIHRoZSBzdG9yYWdlLiBUaGV5IHJldHVybiAwLCBhIG5lZ2F0aXZlIG51bWJlcgorICAgb3IgTlVMTCBvbiBlcnJvciwgYW55dGhpbmcgZWxzZSBvbiBzdWNjZXNzLiAqLworWDUwOSAqU1RPUkVfZ2V0X2NlcnRpZmljYXRlKFNUT1JFICplLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworaW50IFNUT1JFX3N0b3JlX2NlcnRpZmljYXRlKFNUT1JFICplLCBYNTA5ICpkYXRhLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworaW50IFNUT1JFX21vZGlmeV9jZXJ0aWZpY2F0ZShTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIHNlYXJjaF9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIGFkZF9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBtb2RpZnlfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBkZWxldGVfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK2ludCBTVE9SRV9yZXZva2VfY2VydGlmaWNhdGUoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitpbnQgU1RPUkVfZGVsZXRlX2NlcnRpZmljYXRlKFNUT1JFICplLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOwordm9pZCAqU1RPUkVfbGlzdF9jZXJ0aWZpY2F0ZV9zdGFydChTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK1g1MDkgKlNUT1JFX2xpc3RfY2VydGlmaWNhdGVfbmV4dChTVE9SRSAqZSwgdm9pZCAqaGFuZGxlKTsKK2ludCBTVE9SRV9saXN0X2NlcnRpZmljYXRlX2VuZChTVE9SRSAqZSwgdm9pZCAqaGFuZGxlKTsKK2ludCBTVE9SRV9saXN0X2NlcnRpZmljYXRlX2VuZHAoU1RPUkUgKmUsIHZvaWQgKmhhbmRsZSk7CitFVlBfUEtFWSAqU1RPUkVfZ2VuZXJhdGVfa2V5KFNUT1JFICplLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworRVZQX1BLRVkgKlNUT1JFX2dldF9wcml2YXRlX2tleShTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK2ludCBTVE9SRV9zdG9yZV9wcml2YXRlX2tleShTVE9SRSAqZSwgRVZQX1BLRVkgKmRhdGEsCisJT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitpbnQgU1RPUkVfbW9kaWZ5X3ByaXZhdGVfa2V5KFNUT1JFICplLCBPUEVOU1NMX0lURU0gc2VhcmNoX2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gYWRkX3N0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIG1vZGlmeV9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIGRlbGV0ZV9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworaW50IFNUT1JFX3Jldm9rZV9wcml2YXRlX2tleShTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK2ludCBTVE9SRV9kZWxldGVfcHJpdmF0ZV9rZXkoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7Cit2b2lkICpTVE9SRV9saXN0X3ByaXZhdGVfa2V5X3N0YXJ0KFNUT1JFICplLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworRVZQX1BLRVkgKlNUT1JFX2xpc3RfcHJpdmF0ZV9rZXlfbmV4dChTVE9SRSAqZSwgdm9pZCAqaGFuZGxlKTsKK2ludCBTVE9SRV9saXN0X3ByaXZhdGVfa2V5X2VuZChTVE9SRSAqZSwgdm9pZCAqaGFuZGxlKTsKK2ludCBTVE9SRV9saXN0X3ByaXZhdGVfa2V5X2VuZHAoU1RPUkUgKmUsIHZvaWQgKmhhbmRsZSk7CitFVlBfUEtFWSAqU1RPUkVfZ2V0X3B1YmxpY19rZXkoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitpbnQgU1RPUkVfc3RvcmVfcHVibGljX2tleShTVE9SRSAqZSwgRVZQX1BLRVkgKmRhdGEsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitpbnQgU1RPUkVfbW9kaWZ5X3B1YmxpY19rZXkoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBzZWFyY2hfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBhZGRfc3R0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gbW9kaWZ5X2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gZGVsZXRlX2F0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitpbnQgU1RPUkVfcmV2b2tlX3B1YmxpY19rZXkoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitpbnQgU1RPUkVfZGVsZXRlX3B1YmxpY19rZXkoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7Cit2b2lkICpTVE9SRV9saXN0X3B1YmxpY19rZXlfc3RhcnQoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitFVlBfUEtFWSAqU1RPUkVfbGlzdF9wdWJsaWNfa2V5X25leHQoU1RPUkUgKmUsIHZvaWQgKmhhbmRsZSk7CitpbnQgU1RPUkVfbGlzdF9wdWJsaWNfa2V5X2VuZChTVE9SRSAqZSwgdm9pZCAqaGFuZGxlKTsKK2ludCBTVE9SRV9saXN0X3B1YmxpY19rZXlfZW5kcChTVE9SRSAqZSwgdm9pZCAqaGFuZGxlKTsKK1g1MDlfQ1JMICpTVE9SRV9nZW5lcmF0ZV9jcmwoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitYNTA5X0NSTCAqU1RPUkVfZ2V0X2NybChTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK2ludCBTVE9SRV9zdG9yZV9jcmwoU1RPUkUgKmUsIFg1MDlfQ1JMICpkYXRhLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworaW50IFNUT1JFX21vZGlmeV9jcmwoU1RPUkUgKmUsIE9QRU5TU0xfSVRFTSBzZWFyY2hfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBhZGRfc3R0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gbW9kaWZ5X2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gZGVsZXRlX2F0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitpbnQgU1RPUkVfZGVsZXRlX2NybChTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3ZvaWQgKlNUT1JFX2xpc3RfY3JsX3N0YXJ0KFNUT1JFICplLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworWDUwOV9DUkwgKlNUT1JFX2xpc3RfY3JsX25leHQoU1RPUkUgKmUsIHZvaWQgKmhhbmRsZSk7CitpbnQgU1RPUkVfbGlzdF9jcmxfZW5kKFNUT1JFICplLCB2b2lkICpoYW5kbGUpOworaW50IFNUT1JFX2xpc3RfY3JsX2VuZHAoU1RPUkUgKmUsIHZvaWQgKmhhbmRsZSk7CitpbnQgU1RPUkVfc3RvcmVfbnVtYmVyKFNUT1JFICplLCBCSUdOVU0gKmRhdGEsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitpbnQgU1RPUkVfbW9kaWZ5X251bWJlcihTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIHNlYXJjaF9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIGFkZF9zdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBtb2RpZnlfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBkZWxldGVfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK0JJR05VTSAqU1RPUkVfZ2V0X251bWJlcihTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK2ludCBTVE9SRV9kZWxldGVfbnVtYmVyKFNUT1JFICplLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworaW50IFNUT1JFX3N0b3JlX2FyYml0cmFyeShTVE9SRSAqZSwgQlVGX01FTSAqZGF0YSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK2ludCBTVE9SRV9tb2RpZnlfYXJiaXRyYXJ5KFNUT1JFICplLCBPUEVOU1NMX0lURU0gc2VhcmNoX2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gYWRkX3N0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIG1vZGlmeV9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIGRlbGV0ZV9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworQlVGX01FTSAqU1RPUkVfZ2V0X2FyYml0cmFyeShTVE9SRSAqZSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK2ludCBTVE9SRV9kZWxldGVfYXJiaXRyYXJ5KFNUT1JFICplLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworCisKKy8qIENyZWF0ZSBhbmQgbWFuaXB1bGF0ZSBtZXRob2RzICovCitTVE9SRV9NRVRIT0QgKlNUT1JFX2NyZWF0ZV9tZXRob2QoY2hhciAqbmFtZSk7Cit2b2lkIFNUT1JFX2Rlc3Ryb3lfbWV0aG9kKFNUT1JFX01FVEhPRCAqc3RvcmVfbWV0aG9kKTsKKworLyogVGhlc2UgY2FsbGJhY2sgdHlwZXMgYXJlIHVzZSBmb3Igc3RvcmUgaGFuZGxlcnMgKi8KK3R5cGVkZWYgaW50ICgqU1RPUkVfSU5JVElBTElTRV9GVU5DX1BUUikoU1RPUkUgKik7Cit0eXBlZGVmIHZvaWQgKCpTVE9SRV9DTEVBTlVQX0ZVTkNfUFRSKShTVE9SRSAqKTsKK3R5cGVkZWYgU1RPUkVfT0JKRUNUICooKlNUT1JFX0dFTkVSQVRFX09CSkVDVF9GVU5DX1BUUikoU1RPUkUgKiwgU1RPUkVfT0JKRUNUX1RZUEVTIHR5cGUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOwordHlwZWRlZiBTVE9SRV9PQkpFQ1QgKigqU1RPUkVfR0VUX09CSkVDVF9GVU5DX1BUUikoU1RPUkUgKiwgU1RPUkVfT0JKRUNUX1RZUEVTIHR5cGUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOwordHlwZWRlZiB2b2lkICooKlNUT1JFX1NUQVJUX09CSkVDVF9GVU5DX1BUUikoU1RPUkUgKiwgU1RPUkVfT0JKRUNUX1RZUEVTIHR5cGUsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOwordHlwZWRlZiBTVE9SRV9PQkpFQ1QgKigqU1RPUkVfTkVYVF9PQkpFQ1RfRlVOQ19QVFIpKFNUT1JFICosIHZvaWQgKmhhbmRsZSk7Cit0eXBlZGVmIGludCAoKlNUT1JFX0VORF9PQkpFQ1RfRlVOQ19QVFIpKFNUT1JFICosIHZvaWQgKmhhbmRsZSk7Cit0eXBlZGVmIGludCAoKlNUT1JFX0hBTkRMRV9PQkpFQ1RfRlVOQ19QVFIpKFNUT1JFICosIFNUT1JFX09CSkVDVF9UWVBFUyB0eXBlLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3R5cGVkZWYgaW50ICgqU1RPUkVfU1RPUkVfT0JKRUNUX0ZVTkNfUFRSKShTVE9SRSAqLCBTVE9SRV9PQkpFQ1RfVFlQRVMgdHlwZSwgU1RPUkVfT0JKRUNUICpkYXRhLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3R5cGVkZWYgaW50ICgqU1RPUkVfTU9ESUZZX09CSkVDVF9GVU5DX1BUUikoU1RPUkUgKiwgU1RPUkVfT0JKRUNUX1RZUEVTIHR5cGUsIE9QRU5TU0xfSVRFTSBzZWFyY2hfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gYWRkX2F0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIG1vZGlmeV9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBkZWxldGVfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3R5cGVkZWYgaW50ICgqU1RPUkVfR0VORVJJQ19GVU5DX1BUUikoU1RPUkUgKiwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7Cit0eXBlZGVmIGludCAoKlNUT1JFX0NUUkxfRlVOQ19QVFIpKFNUT1JFICosIGludCBjbWQsIGxvbmcgbCwgdm9pZCAqcCwgdm9pZCAoKmYpKHZvaWQpKTsKKworaW50IFNUT1JFX21ldGhvZF9zZXRfaW5pdGlhbGlzZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9JTklUSUFMSVNFX0ZVTkNfUFRSIGluaXRfZik7CitpbnQgU1RPUkVfbWV0aG9kX3NldF9jbGVhbnVwX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20sIFNUT1JFX0NMRUFOVVBfRlVOQ19QVFIgY2xlYW5fZik7CitpbnQgU1RPUkVfbWV0aG9kX3NldF9nZW5lcmF0ZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9HRU5FUkFURV9PQkpFQ1RfRlVOQ19QVFIgZ2VuZXJhdGVfZik7CitpbnQgU1RPUkVfbWV0aG9kX3NldF9nZXRfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfR0VUX09CSkVDVF9GVU5DX1BUUiBnZXRfZik7CitpbnQgU1RPUkVfbWV0aG9kX3NldF9zdG9yZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9TVE9SRV9PQkpFQ1RfRlVOQ19QVFIgc3RvcmVfZik7CitpbnQgU1RPUkVfbWV0aG9kX3NldF9tb2RpZnlfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfTU9ESUZZX09CSkVDVF9GVU5DX1BUUiBzdG9yZV9mKTsKK2ludCBTVE9SRV9tZXRob2Rfc2V0X3Jldm9rZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9IQU5ETEVfT0JKRUNUX0ZVTkNfUFRSIHJldm9rZV9mKTsKK2ludCBTVE9SRV9tZXRob2Rfc2V0X2RlbGV0ZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9IQU5ETEVfT0JKRUNUX0ZVTkNfUFRSIGRlbGV0ZV9mKTsKK2ludCBTVE9SRV9tZXRob2Rfc2V0X2xpc3Rfc3RhcnRfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfU1RBUlRfT0JKRUNUX0ZVTkNfUFRSIGxpc3Rfc3RhcnRfZik7CitpbnQgU1RPUkVfbWV0aG9kX3NldF9saXN0X25leHRfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfTkVYVF9PQkpFQ1RfRlVOQ19QVFIgbGlzdF9uZXh0X2YpOworaW50IFNUT1JFX21ldGhvZF9zZXRfbGlzdF9lbmRfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfRU5EX09CSkVDVF9GVU5DX1BUUiBsaXN0X2VuZF9mKTsKK2ludCBTVE9SRV9tZXRob2Rfc2V0X3VwZGF0ZV9zdG9yZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9HRU5FUklDX0ZVTkNfUFRSKTsKK2ludCBTVE9SRV9tZXRob2Rfc2V0X2xvY2tfc3RvcmVfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfR0VORVJJQ19GVU5DX1BUUik7CitpbnQgU1RPUkVfbWV0aG9kX3NldF91bmxvY2tfc3RvcmVfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfR0VORVJJQ19GVU5DX1BUUik7CitpbnQgU1RPUkVfbWV0aG9kX3NldF9jdHJsX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20sIFNUT1JFX0NUUkxfRlVOQ19QVFIgY3RybF9mKTsKKworU1RPUkVfSU5JVElBTElTRV9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2luaXRpYWxpc2VfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSk7CitTVE9SRV9DTEVBTlVQX0ZVTkNfUFRSIFNUT1JFX21ldGhvZF9nZXRfY2xlYW51cF9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKTsKK1NUT1JFX0dFTkVSQVRFX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2dlbmVyYXRlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pOworU1RPUkVfR0VUX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2dldF9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKTsKK1NUT1JFX1NUT1JFX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X3N0b3JlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pOworU1RPUkVfTU9ESUZZX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X21vZGlmeV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKTsKK1NUT1JFX0hBTkRMRV9PQkpFQ1RfRlVOQ19QVFIgU1RPUkVfbWV0aG9kX2dldF9yZXZva2VfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSk7CitTVE9SRV9IQU5ETEVfT0JKRUNUX0ZVTkNfUFRSIFNUT1JFX21ldGhvZF9nZXRfZGVsZXRlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pOworU1RPUkVfU1RBUlRfT0JKRUNUX0ZVTkNfUFRSIFNUT1JFX21ldGhvZF9nZXRfbGlzdF9zdGFydF9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKTsKK1NUT1JFX05FWFRfT0JKRUNUX0ZVTkNfUFRSIFNUT1JFX21ldGhvZF9nZXRfbGlzdF9uZXh0X2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pOworU1RPUkVfRU5EX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2xpc3RfZW5kX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pOworU1RPUkVfR0VORVJJQ19GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X3VwZGF0ZV9zdG9yZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKTsKK1NUT1JFX0dFTkVSSUNfRlVOQ19QVFIgU1RPUkVfbWV0aG9kX2dldF9sb2NrX3N0b3JlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pOworU1RPUkVfR0VORVJJQ19GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X3VubG9ja19zdG9yZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKTsKK1NUT1JFX0NUUkxfRlVOQ19QVFIgU1RPUkVfbWV0aG9kX2dldF9jdHJsX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pOworCisvKiBNZXRob2QgaGVscGVyIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy4gKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRocm91Z2ggdGhlIGluZm9ybWF0aW9uIGluIGEgbGlzdAorICAgb2YgT1BFTlNTTF9JVEVNcy4gIEl0IHN0b3JlcyBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBpbiBhIHN0cnVjdHVyZWQKKyAgIHdheS4qLwordHlwZWRlZiBzdHJ1Y3QgU1RPUkVfYXR0cl9pbmZvX3N0IFNUT1JFX0FUVFJfSU5GTzsKKworLyogUGFyc2UgYSBsaXN0IG9mIE9QRU5TU0xfSVRFTXMgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gYSBTVE9SRV9BVFRSX0lORk8uCisgICBOb3RlIHRoYXQgd2UgZG8gdGhpcyBpbiB0aGUgbGlzdCBmb3JtLCBzaW5jZSB0aGUgbGlzdCBvZiBPUEVOU1NMX0lURU1zIGNhbgorICAgY29tZSBpbiBibG9ja3Mgc2VwYXJhdGVkIHdpdGggU1RPUkVfQVRUUl9PUi4gIE5vdGUgdGhhdCB0aGUgdmFsdWUgcmV0dXJuZWQKKyAgIGJ5IFNUT1JFX3BhcnNlX2F0dHJzX25leHQoKSBtdXN0IGJlIGZyZWVkIHdpdGggU1RPUkVfQVRUUl9JTkZPX2ZyZWUoKS4gKi8KK3ZvaWQgKlNUT1JFX3BhcnNlX2F0dHJzX3N0YXJ0KE9QRU5TU0xfSVRFTSAqYXR0cmlidXRlcyk7CitTVE9SRV9BVFRSX0lORk8gKlNUT1JFX3BhcnNlX2F0dHJzX25leHQodm9pZCAqaGFuZGxlKTsKK2ludCBTVE9SRV9wYXJzZV9hdHRyc19lbmQodm9pZCAqaGFuZGxlKTsKK2ludCBTVE9SRV9wYXJzZV9hdHRyc19lbmRwKHZvaWQgKmhhbmRsZSk7CisKKy8qIENyZWF0b3IgYW5kIGRlc3RydWN0b3IgKi8KK1NUT1JFX0FUVFJfSU5GTyAqU1RPUkVfQVRUUl9JTkZPX25ldyh2b2lkKTsKK2ludCBTVE9SRV9BVFRSX0lORk9fZnJlZShTVE9SRV9BVFRSX0lORk8gKmF0dHJzKTsKKworLyogTWFuaXB1bGF0b3JzICovCitjaGFyICpTVE9SRV9BVFRSX0lORk9fZ2V0MF9jc3RyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSk7Cit1bnNpZ25lZCBjaGFyICpTVE9SRV9BVFRSX0lORk9fZ2V0MF9zaGExc3RyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsCisJU1RPUkVfQVRUUl9UWVBFUyBjb2RlKTsKK1g1MDlfTkFNRSAqU1RPUkVfQVRUUl9JTkZPX2dldDBfZG4oU1RPUkVfQVRUUl9JTkZPICphdHRycywgU1RPUkVfQVRUUl9UWVBFUyBjb2RlKTsKK0JJR05VTSAqU1RPUkVfQVRUUl9JTkZPX2dldDBfbnVtYmVyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSk7CitpbnQgU1RPUkVfQVRUUl9JTkZPX3NldF9jc3RyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSwKKwljaGFyICpjc3RyLCBzaXplX3QgY3N0cl9zaXplKTsKK2ludCBTVE9SRV9BVFRSX0lORk9fc2V0X3NoYTFzdHIoU1RPUkVfQVRUUl9JTkZPICphdHRycywgU1RPUkVfQVRUUl9UWVBFUyBjb2RlLAorCXVuc2lnbmVkIGNoYXIgKnNoYTFzdHIsIHNpemVfdCBzaGExc3RyX3NpemUpOworaW50IFNUT1JFX0FUVFJfSU5GT19zZXRfZG4oU1RPUkVfQVRUUl9JTkZPICphdHRycywgU1RPUkVfQVRUUl9UWVBFUyBjb2RlLAorCVg1MDlfTkFNRSAqZG4pOworaW50IFNUT1JFX0FUVFJfSU5GT19zZXRfbnVtYmVyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSwKKwlCSUdOVU0gKm51bWJlcik7CitpbnQgU1RPUkVfQVRUUl9JTkZPX21vZGlmeV9jc3RyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSwKKwljaGFyICpjc3RyLCBzaXplX3QgY3N0cl9zaXplKTsKK2ludCBTVE9SRV9BVFRSX0lORk9fbW9kaWZ5X3NoYTFzdHIoU1RPUkVfQVRUUl9JTkZPICphdHRycywgU1RPUkVfQVRUUl9UWVBFUyBjb2RlLAorCXVuc2lnbmVkIGNoYXIgKnNoYTFzdHIsIHNpemVfdCBzaGExc3RyX3NpemUpOworaW50IFNUT1JFX0FUVFJfSU5GT19tb2RpZnlfZG4oU1RPUkVfQVRUUl9JTkZPICphdHRycywgU1RPUkVfQVRUUl9UWVBFUyBjb2RlLAorCVg1MDlfTkFNRSAqZG4pOworaW50IFNUT1JFX0FUVFJfSU5GT19tb2RpZnlfbnVtYmVyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSwKKwlCSUdOVU0gKm51bWJlcik7CisKKy8qIENvbXBhcmUgb24gYmFzaXMgb2YgYSBiaXQgcGF0dGVybiBmb3JtZWQgYnkgdGhlIFNUT1JFX0FUVFJfVFlQRVMgdmFsdWVzCisgICBpbiBlYWNoIGNvbnRhaW5lZCBhdHRyaWJ1dGUuICovCitpbnQgU1RPUkVfQVRUUl9JTkZPX2NvbXBhcmUoY29uc3QgU1RPUkVfQVRUUl9JTkZPICogY29uc3QgKmEsCisJCQkgICAgY29uc3QgU1RPUkVfQVRUUl9JTkZPICogY29uc3QgKmIpOworLyogQ2hlY2sgaWYgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGluIGEgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBhdHRyaWJ1dGVzCisgICBzZXQgaW4gYi4gKi8KK2ludCBTVE9SRV9BVFRSX0lORk9faW5fcmFuZ2UoU1RPUkVfQVRUUl9JTkZPICphLCBTVE9SRV9BVFRSX0lORk8gKmIpOworLyogQ2hlY2sgaWYgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGluIGEgYXJlIGFsc28gc2V0IGluIGIuICovCitpbnQgU1RPUkVfQVRUUl9JTkZPX2luKFNUT1JFX0FUVFJfSU5GTyAqYSwgU1RPUkVfQVRUUl9JTkZPICpiKTsKKy8qIFNhbWUgYXMgU1RPUkVfQVRUUl9JTkZPX2luKCksIGJ1dCBhbHNvIGNoZWNrcyB0aGUgYXR0cmlidXRlIHZhbHVlcy4gKi8KK2ludCBTVE9SRV9BVFRSX0lORk9faW5fZXgoU1RPUkVfQVRUUl9JTkZPICphLCBTVE9SRV9BVFRSX0lORk8gKmIpOworCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfU1RPUkVfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBTVE9SRSBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBTVE9SRV9GX01FTV9ERUxFVEUJCQkJIDEzNAorI2RlZmluZSBTVE9SRV9GX01FTV9HRU5FUkFURQkJCQkgMTM1CisjZGVmaW5lIFNUT1JFX0ZfTUVNX0xJU1RfRU5ECQkJCSAxNjgKKyNkZWZpbmUgU1RPUkVfRl9NRU1fTElTVF9ORVhUCQkJCSAxMzYKKyNkZWZpbmUgU1RPUkVfRl9NRU1fTElTVF9TVEFSVAkJCQkgMTM3CisjZGVmaW5lIFNUT1JFX0ZfTUVNX01PRElGWQkJCQkgMTY5CisjZGVmaW5lIFNUT1JFX0ZfTUVNX1NUT1JFCQkJCSAxMzgKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fR0VUMF9DU1RSCQkgMTM5CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX0dFVDBfRE4JCQkgMTQwCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX0dFVDBfTlVNQkVSCQkgMTQxCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX0dFVDBfU0hBMVNUUgkJIDE0MgorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19NT0RJRllfQ1NUUgkJIDE0MworI2RlZmluZSBTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19NT0RJRllfRE4JCSAxNDQKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fTU9ESUZZX05VTUJFUgkJIDE0NQorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19NT0RJRllfU0hBMVNUUgkJIDE0NgorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19TRVRfQ1NUUgkJIDE0NworI2RlZmluZSBTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19TRVRfRE4JCQkgMTQ4CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX1NFVF9OVU1CRVIJCSAxNDkKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fU0VUX1NIQTFTVFIJCSAxNTAKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9DRVJUSUZJQ0FURQkJCSAxNzAKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9DVFJMCQkJCSAxNjEKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9ERUxFVEVfQVJCSVRSQVJZCQkJIDE1OAorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0RFTEVURV9DRVJUSUZJQ0FURQkJIDEwMgorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0RFTEVURV9DUkwJCQkgMTAzCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfREVMRVRFX05VTUJFUgkJCSAxMDQKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9ERUxFVEVfUFJJVkFURV9LRVkJCSAxMDUKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9ERUxFVEVfUFVCTElDX0tFWQkJCSAxMDYKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9HRU5FUkFURV9DUkwJCQkgMTA3CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfR0VORVJBVEVfS0VZCQkJIDEwOAorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0dFVF9BUkJJVFJBUlkJCQkgMTU5CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfR0VUX0NFUlRJRklDQVRFCQkJIDEwOQorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0dFVF9DUkwJCQkJIDExMAorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0dFVF9OVU1CRVIJCQkgMTExCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfR0VUX1BSSVZBVEVfS0VZCQkJIDExMgorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0dFVF9QVUJMSUNfS0VZCQkJIDExMworI2RlZmluZSBTVE9SRV9GX1NUT1JFX0xJU1RfQ0VSVElGSUNBVEVfRU5ECQkgMTE0CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfTElTVF9DRVJUSUZJQ0FURV9FTkRQCQkgMTUzCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfTElTVF9DRVJUSUZJQ0FURV9ORVhUCQkgMTE1CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfTElTVF9DRVJUSUZJQ0FURV9TVEFSVAkJIDExNgorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0xJU1RfQ1JMX0VORAkJCSAxMTcKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9MSVNUX0NSTF9FTkRQCQkJIDE1NAorI2RlZmluZSBTVE9SRV9GX1NUT1JFX0xJU1RfQ1JMX05FWFQJCQkgMTE4CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfTElTVF9DUkxfU1RBUlQJCQkgMTE5CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfTElTVF9QUklWQVRFX0tFWV9FTkQJCSAxMjAKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9MSVNUX1BSSVZBVEVfS0VZX0VORFAJCSAxNTUKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9MSVNUX1BSSVZBVEVfS0VZX05FWFQJCSAxMjEKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9MSVNUX1BSSVZBVEVfS0VZX1NUQVJUCQkgMTIyCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfTElTVF9QVUJMSUNfS0VZX0VORAkJIDEyMworI2RlZmluZSBTVE9SRV9GX1NUT1JFX0xJU1RfUFVCTElDX0tFWV9FTkRQCQkgMTU2CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfTElTVF9QVUJMSUNfS0VZX05FWFQJCSAxMjQKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9MSVNUX1BVQkxJQ19LRVlfU1RBUlQJCSAxMjUKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9NT0RJRllfQVJCSVRSQVJZCQkJIDE2MgorI2RlZmluZSBTVE9SRV9GX1NUT1JFX01PRElGWV9DRVJUSUZJQ0FURQkJIDE2MworI2RlZmluZSBTVE9SRV9GX1NUT1JFX01PRElGWV9DUkwJCQkgMTY0CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfTU9ESUZZX05VTUJFUgkJCSAxNjUKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9NT0RJRllfUFJJVkFURV9LRVkJCSAxNjYKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9NT0RJRllfUFVCTElDX0tFWQkJCSAxNjcKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9ORVdfRU5HSU5FCQkJIDEzMworI2RlZmluZSBTVE9SRV9GX1NUT1JFX05FV19NRVRIT0QJCQkgMTMyCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfUEFSU0VfQVRUUlNfRU5ECQkJIDE1MQorI2RlZmluZSBTVE9SRV9GX1NUT1JFX1BBUlNFX0FUVFJTX0VORFAJCQkgMTcyCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfUEFSU0VfQVRUUlNfTkVYVAkJCSAxNTIKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9QQVJTRV9BVFRSU19TVEFSVAkJCSAxNzEKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9SRVZPS0VfQ0VSVElGSUNBVEUJCSAxMjkKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9SRVZPS0VfUFJJVkFURV9LRVkJCSAxMzAKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9SRVZPS0VfUFVCTElDX0tFWQkJCSAxMzEKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9TVE9SRV9BUkJJVFJBUlkJCQkgMTU3CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfU1RPUkVfQ0VSVElGSUNBVEUJCQkgMTAwCisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfU1RPUkVfQ1JMCQkJCSAxMDEKKyNkZWZpbmUgU1RPUkVfRl9TVE9SRV9TVE9SRV9OVU1CRVIJCQkgMTI2CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfU1RPUkVfUFJJVkFURV9LRVkJCQkgMTI3CisjZGVmaW5lIFNUT1JFX0ZfU1RPUkVfU1RPUkVfUFVCTElDX0tFWQkJCSAxMjgKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBTVE9SRV9SX0FMUkVBRFlfSEFTX0FfVkFMVUUJCQkgMTI3CisjZGVmaW5lIFNUT1JFX1JfRkFJTEVEX0RFTEVUSU5HX0FSQklUUkFSWQkJIDEzMgorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9ERUxFVElOR19DRVJUSUZJQ0FURQkJIDEwMAorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9ERUxFVElOR19LRVkJCQkgMTAxCisjZGVmaW5lIFNUT1JFX1JfRkFJTEVEX0RFTEVUSU5HX05VTUJFUgkJCSAxMDIKKyNkZWZpbmUgU1RPUkVfUl9GQUlMRURfR0VORVJBVElOR19DUkwJCQkgMTAzCisjZGVmaW5lIFNUT1JFX1JfRkFJTEVEX0dFTkVSQVRJTkdfS0VZCQkJIDEwNAorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX0FSQklUUkFSWQkJIDEzMworI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX0NFUlRJRklDQVRFCQkgMTA1CisjZGVmaW5lIFNUT1JFX1JfRkFJTEVEX0dFVFRJTkdfS0VZCQkJIDEwNgorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX05VTUJFUgkJCSAxMDcKKyNkZWZpbmUgU1RPUkVfUl9GQUlMRURfTElTVElOR19DRVJUSUZJQ0FURVMJCSAxMDgKKyNkZWZpbmUgU1RPUkVfUl9GQUlMRURfTElTVElOR19LRVlTCQkJIDEwOQorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfQVJCSVRSQVJZCQkgMTM4CisjZGVmaW5lIFNUT1JFX1JfRkFJTEVEX01PRElGWUlOR19DRVJUSUZJQ0FURQkJIDEzOQorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfQ1JMCQkJIDE0MAorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfTlVNQkVSCQkJIDE0MQorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfUFJJVkFURV9LRVkJCSAxNDIKKyNkZWZpbmUgU1RPUkVfUl9GQUlMRURfTU9ESUZZSU5HX1BVQkxJQ19LRVkJCSAxNDMKKyNkZWZpbmUgU1RPUkVfUl9GQUlMRURfUkVWT0tJTkdfQ0VSVElGSUNBVEUJCSAxMTAKKyNkZWZpbmUgU1RPUkVfUl9GQUlMRURfUkVWT0tJTkdfS0VZCQkJIDExMQorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9TVE9SSU5HX0FSQklUUkFSWQkJIDEzNAorI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9TVE9SSU5HX0NFUlRJRklDQVRFCQkgMTEyCisjZGVmaW5lIFNUT1JFX1JfRkFJTEVEX1NUT1JJTkdfS0VZCQkJIDExMworI2RlZmluZSBTVE9SRV9SX0ZBSUxFRF9TVE9SSU5HX05VTUJFUgkJCSAxMTQKKyNkZWZpbmUgU1RPUkVfUl9OT1RfSU1QTEVNRU5URUQJCQkJIDEyOAorI2RlZmluZSBTVE9SRV9SX05PX0NPTlRST0xfRlVOQ1RJT04JCQkgMTQ0CisjZGVmaW5lIFNUT1JFX1JfTk9fREVMRVRFX0FSQklUUkFSWV9GVU5DVElPTgkJIDEzNQorI2RlZmluZSBTVE9SRV9SX05PX0RFTEVURV9OVU1CRVJfRlVOQ1RJT04JCSAxMTUKKyNkZWZpbmUgU1RPUkVfUl9OT19ERUxFVEVfT0JKRUNUX0ZVTkNUSU9OCQkgMTE2CisjZGVmaW5lIFNUT1JFX1JfTk9fR0VORVJBVEVfQ1JMX0ZVTkNUSU9OCQkgMTE3CisjZGVmaW5lIFNUT1JFX1JfTk9fR0VORVJBVEVfT0JKRUNUX0ZVTkNUSU9OCQkgMTE4CisjZGVmaW5lIFNUT1JFX1JfTk9fR0VUX09CSkVDVF9BUkJJVFJBUllfRlVOQ1RJT04JIDEzNgorI2RlZmluZSBTVE9SRV9SX05PX0dFVF9PQkpFQ1RfRlVOQ1RJT04JCQkgMTE5CisjZGVmaW5lIFNUT1JFX1JfTk9fR0VUX09CSkVDVF9OVU1CRVJfRlVOQ1RJT04JCSAxMjAKKyNkZWZpbmUgU1RPUkVfUl9OT19MSVNUX09CSkVDVF9FTkRQX0ZVTkNUSU9OCQkgMTMxCisjZGVmaW5lIFNUT1JFX1JfTk9fTElTVF9PQkpFQ1RfRU5EX0ZVTkNUSU9OCQkgMTIxCisjZGVmaW5lIFNUT1JFX1JfTk9fTElTVF9PQkpFQ1RfTkVYVF9GVU5DVElPTgkJIDEyMgorI2RlZmluZSBTVE9SRV9SX05PX0xJU1RfT0JKRUNUX1NUQVJUX0ZVTkNUSU9OCQkgMTIzCisjZGVmaW5lIFNUT1JFX1JfTk9fTU9ESUZZX09CSkVDVF9GVU5DVElPTgkJIDE0NQorI2RlZmluZSBTVE9SRV9SX05PX1JFVk9LRV9PQkpFQ1RfRlVOQ1RJT04JCSAxMjQKKyNkZWZpbmUgU1RPUkVfUl9OT19TVE9SRQkJCQkgMTI5CisjZGVmaW5lIFNUT1JFX1JfTk9fU1RPUkVfT0JKRUNUX0FSQklUUkFSWV9GVU5DVElPTgkgMTM3CisjZGVmaW5lIFNUT1JFX1JfTk9fU1RPUkVfT0JKRUNUX0ZVTkNUSU9OCQkgMTI1CisjZGVmaW5lIFNUT1JFX1JfTk9fU1RPUkVfT0JKRUNUX05VTUJFUl9GVU5DVElPTgkJIDEyNgorI2RlZmluZSBTVE9SRV9SX05PX1ZBTFVFCQkJCSAxMzAKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfZXJyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX2Vyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNGVkZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX2Vyci5jCkBAIC0wLDAgKzEsMjExIEBACisvKiBjcnlwdG8vc3RvcmUvc3RyX2Vyci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogTk9URTogdGhpcyBmaWxlIHdhcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgbWtlcnIucGwgc2NyaXB0OiBhbnkgY2hhbmdlcworICogbWFkZSB0byBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBuZXh0IHVwZGF0ZXMgdGhpcyBmaWxlLAorICogb25seSByZWFzb24gc3RyaW5ncyB3aWxsIGJlIHByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3RvcmUuaD4KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworI2RlZmluZSBFUlJfRlVOQyhmdW5jKSBFUlJfUEFDSyhFUlJfTElCX1NUT1JFLGZ1bmMsMCkKKyNkZWZpbmUgRVJSX1JFQVNPTihyZWFzb24pIEVSUl9QQUNLKEVSUl9MSUJfU1RPUkUsMCxyZWFzb24pCisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgU1RPUkVfc3RyX2Z1bmN0c1tdPQorCXsKK3tFUlJfRlVOQyhTVE9SRV9GX01FTV9ERUxFVEUpLAkiTUVNX0RFTEVURSJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfTUVNX0dFTkVSQVRFKSwJIk1FTV9HRU5FUkFURSJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfTUVNX0xJU1RfRU5EKSwJIk1FTV9MSVNUX0VORCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfTUVNX0xJU1RfTkVYVCksCSJNRU1fTElTVF9ORVhUIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9NRU1fTElTVF9TVEFSVCksCSJNRU1fTElTVF9TVEFSVCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfTUVNX01PRElGWSksCSJNRU1fTU9ESUZZIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9NRU1fU1RPUkUpLAkiTUVNX1NUT1JFIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fR0VUMF9DU1RSKSwJIlNUT1JFX0FUVFJfSU5GT19nZXQwX2NzdHIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19HRVQwX0ROKSwJIlNUT1JFX0FUVFJfSU5GT19nZXQwX2RuIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fR0VUMF9OVU1CRVIpLAkiU1RPUkVfQVRUUl9JTkZPX2dldDBfbnVtYmVyIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fR0VUMF9TSEExU1RSKSwJIlNUT1JFX0FUVFJfSU5GT19nZXQwX3NoYTFzdHIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19NT0RJRllfQ1NUUiksCSJTVE9SRV9BVFRSX0lORk9fbW9kaWZ5X2NzdHIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19NT0RJRllfRE4pLAkiU1RPUkVfQVRUUl9JTkZPX21vZGlmeV9kbiJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX01PRElGWV9OVU1CRVIpLAkiU1RPUkVfQVRUUl9JTkZPX21vZGlmeV9udW1iZXIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19NT0RJRllfU0hBMVNUUiksCSJTVE9SRV9BVFRSX0lORk9fbW9kaWZ5X3NoYTFzdHIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19TRVRfQ1NUUiksCSJTVE9SRV9BVFRSX0lORk9fc2V0X2NzdHIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19TRVRfRE4pLAkiU1RPUkVfQVRUUl9JTkZPX3NldF9kbiJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX1NFVF9OVU1CRVIpLAkiU1RPUkVfQVRUUl9JTkZPX3NldF9udW1iZXIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19TRVRfU0hBMVNUUiksCSJTVE9SRV9BVFRSX0lORk9fc2V0X3NoYTFzdHIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0NFUlRJRklDQVRFKSwJIlNUT1JFX0NFUlRJRklDQVRFIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9DVFJMKSwJIlNUT1JFX2N0cmwifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0RFTEVURV9BUkJJVFJBUlkpLAkiU1RPUkVfZGVsZXRlX2FyYml0cmFyeSJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfREVMRVRFX0NFUlRJRklDQVRFKSwJIlNUT1JFX2RlbGV0ZV9jZXJ0aWZpY2F0ZSJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfREVMRVRFX0NSTCksCSJTVE9SRV9kZWxldGVfY3JsIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9ERUxFVEVfTlVNQkVSKSwJIlNUT1JFX2RlbGV0ZV9udW1iZXIifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0RFTEVURV9QUklWQVRFX0tFWSksCSJTVE9SRV9kZWxldGVfcHJpdmF0ZV9rZXkifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0RFTEVURV9QVUJMSUNfS0VZKSwJIlNUT1JFX2RlbGV0ZV9wdWJsaWNfa2V5In0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9HRU5FUkFURV9DUkwpLAkiU1RPUkVfZ2VuZXJhdGVfY3JsIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9HRU5FUkFURV9LRVkpLAkiU1RPUkVfZ2VuZXJhdGVfa2V5In0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9HRVRfQVJCSVRSQVJZKSwJIlNUT1JFX2dldF9hcmJpdHJhcnkifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0dFVF9DRVJUSUZJQ0FURSksCSJTVE9SRV9nZXRfY2VydGlmaWNhdGUifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0dFVF9DUkwpLAkiU1RPUkVfZ2V0X2NybCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfR0VUX05VTUJFUiksCSJTVE9SRV9nZXRfbnVtYmVyIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9HRVRfUFJJVkFURV9LRVkpLAkiU1RPUkVfZ2V0X3ByaXZhdGVfa2V5In0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9HRVRfUFVCTElDX0tFWSksCSJTVE9SRV9nZXRfcHVibGljX2tleSJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTElTVF9DRVJUSUZJQ0FURV9FTkQpLAkiU1RPUkVfbGlzdF9jZXJ0aWZpY2F0ZV9lbmQifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0xJU1RfQ0VSVElGSUNBVEVfRU5EUCksCSJTVE9SRV9saXN0X2NlcnRpZmljYXRlX2VuZHAifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0xJU1RfQ0VSVElGSUNBVEVfTkVYVCksCSJTVE9SRV9saXN0X2NlcnRpZmljYXRlX25leHQifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0xJU1RfQ0VSVElGSUNBVEVfU1RBUlQpLAkiU1RPUkVfbGlzdF9jZXJ0aWZpY2F0ZV9zdGFydCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTElTVF9DUkxfRU5EKSwJIlNUT1JFX2xpc3RfY3JsX2VuZCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTElTVF9DUkxfRU5EUCksCSJTVE9SRV9saXN0X2NybF9lbmRwIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9MSVNUX0NSTF9ORVhUKSwJIlNUT1JFX2xpc3RfY3JsX25leHQifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0xJU1RfQ1JMX1NUQVJUKSwJIlNUT1JFX2xpc3RfY3JsX3N0YXJ0In0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9MSVNUX1BSSVZBVEVfS0VZX0VORCksCSJTVE9SRV9saXN0X3ByaXZhdGVfa2V5X2VuZCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTElTVF9QUklWQVRFX0tFWV9FTkRQKSwJIlNUT1JFX2xpc3RfcHJpdmF0ZV9rZXlfZW5kcCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTElTVF9QUklWQVRFX0tFWV9ORVhUKSwJIlNUT1JFX2xpc3RfcHJpdmF0ZV9rZXlfbmV4dCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTElTVF9QUklWQVRFX0tFWV9TVEFSVCksCSJTVE9SRV9saXN0X3ByaXZhdGVfa2V5X3N0YXJ0In0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9MSVNUX1BVQkxJQ19LRVlfRU5EKSwJIlNUT1JFX2xpc3RfcHVibGljX2tleV9lbmQifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX0xJU1RfUFVCTElDX0tFWV9FTkRQKSwJIlNUT1JFX2xpc3RfcHVibGljX2tleV9lbmRwIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9MSVNUX1BVQkxJQ19LRVlfTkVYVCksCSJTVE9SRV9saXN0X3B1YmxpY19rZXlfbmV4dCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTElTVF9QVUJMSUNfS0VZX1NUQVJUKSwJIlNUT1JFX2xpc3RfcHVibGljX2tleV9zdGFydCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTU9ESUZZX0FSQklUUkFSWSksCSJTVE9SRV9tb2RpZnlfYXJiaXRyYXJ5In0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9NT0RJRllfQ0VSVElGSUNBVEUpLAkiU1RPUkVfbW9kaWZ5X2NlcnRpZmljYXRlIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9NT0RJRllfQ1JMKSwJIlNUT1JFX21vZGlmeV9jcmwifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX01PRElGWV9OVU1CRVIpLAkiU1RPUkVfbW9kaWZ5X251bWJlciJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTU9ESUZZX1BSSVZBVEVfS0VZKSwJIlNUT1JFX21vZGlmeV9wcml2YXRlX2tleSJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTU9ESUZZX1BVQkxJQ19LRVkpLAkiU1RPUkVfbW9kaWZ5X3B1YmxpY19rZXkifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX05FV19FTkdJTkUpLAkiU1RPUkVfbmV3X2VuZ2luZSJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfTkVXX01FVEhPRCksCSJTVE9SRV9uZXdfbWV0aG9kIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9QQVJTRV9BVFRSU19FTkQpLAkiU1RPUkVfcGFyc2VfYXR0cnNfZW5kIn0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9QQVJTRV9BVFRSU19FTkRQKSwJIlNUT1JFX3BhcnNlX2F0dHJzX2VuZHAifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX1BBUlNFX0FUVFJTX05FWFQpLAkiU1RPUkVfcGFyc2VfYXR0cnNfbmV4dCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfUEFSU0VfQVRUUlNfU1RBUlQpLAkiU1RPUkVfcGFyc2VfYXR0cnNfc3RhcnQifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX1JFVk9LRV9DRVJUSUZJQ0FURSksCSJTVE9SRV9yZXZva2VfY2VydGlmaWNhdGUifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX1JFVk9LRV9QUklWQVRFX0tFWSksCSJTVE9SRV9yZXZva2VfcHJpdmF0ZV9rZXkifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX1JFVk9LRV9QVUJMSUNfS0VZKSwJIlNUT1JFX3Jldm9rZV9wdWJsaWNfa2V5In0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9TVE9SRV9BUkJJVFJBUlkpLAkiU1RPUkVfc3RvcmVfYXJiaXRyYXJ5In0sCit7RVJSX0ZVTkMoU1RPUkVfRl9TVE9SRV9TVE9SRV9DRVJUSUZJQ0FURSksCSJTVE9SRV9zdG9yZV9jZXJ0aWZpY2F0ZSJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfU1RPUkVfQ1JMKSwJIlNUT1JFX3N0b3JlX2NybCJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfU1RPUkVfTlVNQkVSKSwJIlNUT1JFX3N0b3JlX251bWJlciJ9LAore0VSUl9GVU5DKFNUT1JFX0ZfU1RPUkVfU1RPUkVfUFJJVkFURV9LRVkpLAkiU1RPUkVfc3RvcmVfcHJpdmF0ZV9rZXkifSwKK3tFUlJfRlVOQyhTVE9SRV9GX1NUT1JFX1NUT1JFX1BVQkxJQ19LRVkpLAkiU1RPUkVfc3RvcmVfcHVibGljX2tleSJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFNUT1JFX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oU1RPUkVfUl9BTFJFQURZX0hBU19BX1ZBTFVFKSAsImFscmVhZHkgaGFzIGEgdmFsdWUifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfRkFJTEVEX0RFTEVUSU5HX0FSQklUUkFSWSksImZhaWxlZCBkZWxldGluZyBhcmJpdHJhcnkifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfRkFJTEVEX0RFTEVUSU5HX0NFUlRJRklDQVRFKSwiZmFpbGVkIGRlbGV0aW5nIGNlcnRpZmljYXRlIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9ERUxFVElOR19LRVkpICwiZmFpbGVkIGRlbGV0aW5nIGtleSJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9GQUlMRURfREVMRVRJTkdfTlVNQkVSKSwiZmFpbGVkIGRlbGV0aW5nIG51bWJlciJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9GQUlMRURfR0VORVJBVElOR19DUkwpLCJmYWlsZWQgZ2VuZXJhdGluZyBjcmwifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfRkFJTEVEX0dFTkVSQVRJTkdfS0VZKSwiZmFpbGVkIGdlbmVyYXRpbmcga2V5In0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX0FSQklUUkFSWSksImZhaWxlZCBnZXR0aW5nIGFyYml0cmFyeSJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9GQUlMRURfR0VUVElOR19DRVJUSUZJQ0FURSksImZhaWxlZCBnZXR0aW5nIGNlcnRpZmljYXRlIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX0tFWSkgICwiZmFpbGVkIGdldHRpbmcga2V5In0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX05VTUJFUiksImZhaWxlZCBnZXR0aW5nIG51bWJlciJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9GQUlMRURfTElTVElOR19DRVJUSUZJQ0FURVMpLCJmYWlsZWQgbGlzdGluZyBjZXJ0aWZpY2F0ZXMifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfRkFJTEVEX0xJU1RJTkdfS0VZUykgLCJmYWlsZWQgbGlzdGluZyBrZXlzIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfQVJCSVRSQVJZKSwiZmFpbGVkIG1vZGlmeWluZyBhcmJpdHJhcnkifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfRkFJTEVEX01PRElGWUlOR19DRVJUSUZJQ0FURSksImZhaWxlZCBtb2RpZnlpbmcgY2VydGlmaWNhdGUifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfRkFJTEVEX01PRElGWUlOR19DUkwpLCJmYWlsZWQgbW9kaWZ5aW5nIGNybCJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9GQUlMRURfTU9ESUZZSU5HX05VTUJFUiksImZhaWxlZCBtb2RpZnlpbmcgbnVtYmVyIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfUFJJVkFURV9LRVkpLCJmYWlsZWQgbW9kaWZ5aW5nIHByaXZhdGUga2V5In0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfUFVCTElDX0tFWSksImZhaWxlZCBtb2RpZnlpbmcgcHVibGljIGtleSJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9GQUlMRURfUkVWT0tJTkdfQ0VSVElGSUNBVEUpLCJmYWlsZWQgcmV2b2tpbmcgY2VydGlmaWNhdGUifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfRkFJTEVEX1JFVk9LSU5HX0tFWSkgLCJmYWlsZWQgcmV2b2tpbmcga2V5In0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9TVE9SSU5HX0FSQklUUkFSWSksImZhaWxlZCBzdG9yaW5nIGFyYml0cmFyeSJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9GQUlMRURfU1RPUklOR19DRVJUSUZJQ0FURSksImZhaWxlZCBzdG9yaW5nIGNlcnRpZmljYXRlIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9TVE9SSU5HX0tFWSkgICwiZmFpbGVkIHN0b3Jpbmcga2V5In0sCit7RVJSX1JFQVNPTihTVE9SRV9SX0ZBSUxFRF9TVE9SSU5HX05VTUJFUiksImZhaWxlZCBzdG9yaW5nIG51bWJlciJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9OT1RfSU1QTEVNRU5URUQpICAgICAsIm5vdCBpbXBsZW1lbnRlZCJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9OT19DT05UUk9MX0ZVTkNUSU9OKSAsIm5vIGNvbnRyb2wgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fREVMRVRFX0FSQklUUkFSWV9GVU5DVElPTiksIm5vIGRlbGV0ZSBhcmJpdHJhcnkgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fREVMRVRFX05VTUJFUl9GVU5DVElPTiksIm5vIGRlbGV0ZSBudW1iZXIgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fREVMRVRFX09CSkVDVF9GVU5DVElPTiksIm5vIGRlbGV0ZSBvYmplY3QgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fR0VORVJBVEVfQ1JMX0ZVTkNUSU9OKSwibm8gZ2VuZXJhdGUgY3JsIGZ1bmN0aW9uIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX05PX0dFTkVSQVRFX09CSkVDVF9GVU5DVElPTiksIm5vIGdlbmVyYXRlIG9iamVjdCBmdW5jdGlvbiJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9OT19HRVRfT0JKRUNUX0FSQklUUkFSWV9GVU5DVElPTiksIm5vIGdldCBvYmplY3QgYXJiaXRyYXJ5IGZ1bmN0aW9uIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX05PX0dFVF9PQkpFQ1RfRlVOQ1RJT04pLCJubyBnZXQgb2JqZWN0IGZ1bmN0aW9uIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX05PX0dFVF9PQkpFQ1RfTlVNQkVSX0ZVTkNUSU9OKSwibm8gZ2V0IG9iamVjdCBudW1iZXIgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fTElTVF9PQkpFQ1RfRU5EUF9GVU5DVElPTiksIm5vIGxpc3Qgb2JqZWN0IGVuZHAgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fTElTVF9PQkpFQ1RfRU5EX0ZVTkNUSU9OKSwibm8gbGlzdCBvYmplY3QgZW5kIGZ1bmN0aW9uIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX05PX0xJU1RfT0JKRUNUX05FWFRfRlVOQ1RJT04pLCJubyBsaXN0IG9iamVjdCBuZXh0IGZ1bmN0aW9uIn0sCit7RVJSX1JFQVNPTihTVE9SRV9SX05PX0xJU1RfT0JKRUNUX1NUQVJUX0ZVTkNUSU9OKSwibm8gbGlzdCBvYmplY3Qgc3RhcnQgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fTU9ESUZZX09CSkVDVF9GVU5DVElPTiksIm5vIG1vZGlmeSBvYmplY3QgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fUkVWT0tFX09CSkVDVF9GVU5DVElPTiksIm5vIHJldm9rZSBvYmplY3QgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fU1RPUkUpICAgICAgICAgICAgLCJubyBzdG9yZSJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9OT19TVE9SRV9PQkpFQ1RfQVJCSVRSQVJZX0ZVTkNUSU9OKSwibm8gc3RvcmUgb2JqZWN0IGFyYml0cmFyeSBmdW5jdGlvbiJ9LAore0VSUl9SRUFTT04oU1RPUkVfUl9OT19TVE9SRV9PQkpFQ1RfRlVOQ1RJT04pLCJubyBzdG9yZSBvYmplY3QgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fU1RPUkVfT0JKRUNUX05VTUJFUl9GVU5DVElPTiksIm5vIHN0b3JlIG9iamVjdCBudW1iZXIgZnVuY3Rpb24ifSwKK3tFUlJfUkVBU09OKFNUT1JFX1JfTk9fVkFMVUUpICAgICAgICAgICAgLCJubyB2YWx1ZSJ9LAorezAsTlVMTH0KKwl9OworCisjZW5kaWYKKwordm9pZCBFUlJfbG9hZF9TVE9SRV9zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhTVE9SRV9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxTVE9SRV9zdHJfZnVuY3RzKTsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLFNUT1JFX3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkYmNiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbGliLmMKQEAgLTAsMCArMSwxODI4IEBACisvKiBjcnlwdG8vc3RvcmUvc3RyX2xpYi5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDMuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2luY2x1ZGUgPG9wZW5zc2wvZW5naW5lLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgInN0cl9sb2NsLmgiCisKK2NvbnN0IGNoYXIgKiBjb25zdCBTVE9SRV9vYmplY3RfdHlwZV9zdHJpbmdbU1RPUkVfT0JKRUNUX1RZUEVfTlVNKzFdID0KKwl7CisJMCwKKwkiWC41MDkgQ2VydGlmaWNhdGUiLAorCSJYLjUwOSBDUkwiLAorCSJQcml2YXRlIEtleSIsCisJIlB1YmxpYyBLZXkiLAorCSJOdW1iZXIiLAorCSJBcmJpdHJhcnkgRGF0YSIKKwl9OworCitjb25zdCBpbnQgU1RPUkVfcGFyYW1fc2l6ZXNbU1RPUkVfUEFSQU1fVFlQRV9OVU0rMV0gPQorCXsKKwkwLAorCXNpemVvZihpbnQpLAkJLyogRVZQX1RZUEUgKi8KKwlzaXplb2Yoc2l6ZV90KSwJCS8qIEJJVFMgKi8KKwktMSwJCQkvKiBLRVlfUEFSQU1FVEVSUyAqLworCTAJCQkvKiBLRVlfTk9fUEFSQU1FVEVSUyAqLworCX07CQorCitjb25zdCBpbnQgU1RPUkVfYXR0cl9zaXplc1tTVE9SRV9BVFRSX1RZUEVfTlVNKzFdID0KKwl7CisJMCwKKwktMSwJCQkvKiBGUklFTkRMWU5BTUU6CUMgc3RyaW5nICovCisJU0hBX0RJR0VTVF9MRU5HVEgsCS8qIEtFWUlEOgkJU0hBMSBkaWdlc3QsIDE2MCBiaXRzICovCisJU0hBX0RJR0VTVF9MRU5HVEgsCS8qIElTU1VFUktFWUlEOgkJU0hBMSBkaWdlc3QsIDE2MCBiaXRzICovCisJU0hBX0RJR0VTVF9MRU5HVEgsCS8qIFNVQkpFQ1RLRVlJRDoJU0hBMSBkaWdlc3QsIDE2MCBiaXRzICovCisJU0hBX0RJR0VTVF9MRU5HVEgsCS8qIElTU1VFUlNFUklBTEhBU0g6CVNIQTEgZGlnZXN0LCAxNjAgYml0cyAqLworCXNpemVvZihYNTA5X05BTUUgKiksCS8qIElTU1VFUjoJCVg1MDlfTkFNRSAqICovCisJc2l6ZW9mKEJJR05VTSAqKSwJLyogU0VSSUFMOgkJQklHTlVNICogKi8KKwlzaXplb2YoWDUwOV9OQU1FICopLAkvKiBTVUJKRUNUOgkJWDUwOV9OQU1FICogKi8KKwlTSEFfRElHRVNUX0xFTkdUSCwJLyogQ0VSVEhBU0g6CQlTSEExIGRpZ2VzdCwgMTYwIGJpdHMgKi8KKwktMSwJCQkvKiBFTUFJTDoJCUMgc3RyaW5nICovCisJLTEsCQkJLyogRklMRU5BTUU6CQlDIHN0cmluZyAqLworCX07CQorCitTVE9SRSAqU1RPUkVfbmV3X21ldGhvZChjb25zdCBTVE9SRV9NRVRIT0QgKm1ldGhvZCkKKwl7CisJU1RPUkUgKnJldDsKKworCWlmIChtZXRob2QgPT0gTlVMTCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX05FV19NRVRIT0QsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldD0oU1RPUkUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoU1RPUkUpKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9ORVdfTUVUSE9ELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldC0+bWV0aD1tZXRob2Q7CisKKwlDUllQVE9fbmV3X2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1NUT1JFLCByZXQsICZyZXQtPmV4X2RhdGEpOworCWlmIChyZXQtPm1ldGgtPmluaXQgJiYgIXJldC0+bWV0aC0+aW5pdChyZXQpKQorCQl7CisJCVNUT1JFX2ZyZWUocmV0KTsKKwkJcmV0ID0gTlVMTDsKKwkJfQorCXJldHVybiByZXQ7CisJfQorCitTVE9SRSAqU1RPUkVfbmV3X2VuZ2luZShFTkdJTkUgKmVuZ2luZSkKKwl7CisJU1RPUkUgKnJldCA9IE5VTEw7CisJRU5HSU5FICplID0gZW5naW5lOworCWNvbnN0IFNUT1JFX01FVEhPRCAqbWV0aCA9IDA7CisKKyNpZmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWUgPSBOVUxMOworI2Vsc2UKKwlpZiAoZW5naW5lKQorCQl7CisJCWlmICghRU5HSU5FX2luaXQoZW5naW5lKSkKKwkJCXsKKwkJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTkVXX0VOR0lORSwgRVJSX1JfRU5HSU5FX0xJQik7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJZSA9IGVuZ2luZTsKKwkJfQorCWVsc2UKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX05FV19FTkdJTkUsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZihlKQorCQl7CisJCW1ldGggPSBFTkdJTkVfZ2V0X1NUT1JFKGUpOworCQlpZighbWV0aCkKKwkJCXsKKwkJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTkVXX0VOR0lORSwKKwkJCQlFUlJfUl9FTkdJTkVfTElCKTsKKwkJCUVOR0lORV9maW5pc2goZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwlyZXQgPSBTVE9SRV9uZXdfbWV0aG9kKG1ldGgpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX05FV19FTkdJTkUsRVJSX1JfU1RPUkVfTElCKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCXJldC0+ZW5naW5lID0gZTsKKworCXJldHVybihyZXQpOworCX0KKwordm9pZCBTVE9SRV9mcmVlKFNUT1JFICpzdG9yZSkKKwl7CisJaWYgKHN0b3JlID09IE5VTEwpCisJCXJldHVybjsKKwlpZiAoc3RvcmUtPm1ldGgtPmNsZWFuKQorCQlzdG9yZS0+bWV0aC0+Y2xlYW4oc3RvcmUpOworCUNSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1NUT1JFLCBzdG9yZSwgJnN0b3JlLT5leF9kYXRhKTsKKwlPUEVOU1NMX2ZyZWUoc3RvcmUpOworCX0KKworaW50IFNUT1JFX2N0cmwoU1RPUkUgKnN0b3JlLCBpbnQgY21kLCBsb25nIGksIHZvaWQgKnAsIHZvaWQgKCpmKSh2b2lkKSkKKwl7CisJaWYgKHN0b3JlID09IE5VTEwpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9DVFJMLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybiAwOworCQl9CisJaWYgKHN0b3JlLT5tZXRoLT5jdHJsKQorCQlyZXR1cm4gc3RvcmUtPm1ldGgtPmN0cmwoc3RvcmUsIGNtZCwgaSwgcCwgZik7CisJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9DVFJMLFNUT1JFX1JfTk9fQ09OVFJPTF9GVU5DVElPTik7CisJcmV0dXJuIDA7CisJfQorCisKK2ludCBTVE9SRV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKyAgICAgICAgeworCXJldHVybiBDUllQVE9fZ2V0X2V4X25ld19pbmRleChDUllQVE9fRVhfSU5ERVhfU1RPUkUsIGFyZ2wsIGFyZ3AsCisJCQkJbmV3X2Z1bmMsIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworICAgICAgICB9CisKK2ludCBTVE9SRV9zZXRfZXhfZGF0YShTVE9SRSAqciwgaW50IGlkeCwgdm9pZCAqYXJnKQorCXsKKwlyZXR1cm4oQ1JZUFRPX3NldF9leF9kYXRhKCZyLT5leF9kYXRhLGlkeCxhcmcpKTsKKwl9CisKK3ZvaWQgKlNUT1JFX2dldF9leF9kYXRhKFNUT1JFICpyLCBpbnQgaWR4KQorCXsKKwlyZXR1cm4oQ1JZUFRPX2dldF9leF9kYXRhKCZyLT5leF9kYXRhLGlkeCkpOworCX0KKworY29uc3QgU1RPUkVfTUVUSE9EICpTVE9SRV9nZXRfbWV0aG9kKFNUT1JFICpzdG9yZSkKKwl7CisJcmV0dXJuIHN0b3JlLT5tZXRoOworCX0KKworY29uc3QgU1RPUkVfTUVUSE9EICpTVE9SRV9zZXRfbWV0aG9kKFNUT1JFICpzdG9yZSwgY29uc3QgU1RPUkVfTUVUSE9EICptZXRoKQorCXsKKwlzdG9yZS0+bWV0aD1tZXRoOworCXJldHVybiBzdG9yZS0+bWV0aDsKKwl9CisKKworLyogQVBJIGhlbHBlcnMgKi8KKworI2RlZmluZSBjaGVja19zdG9yZShzLGZuY29kZSxmbm5hbWUsZm5lcnJjb2RlKSBcCisJZG8gXAorCQl7IFwKKwkJaWYgKChzKSA9PSBOVUxMIHx8IChzKS0+bWV0aCA9PSBOVUxMKSBcCisJCQl7IFwKKwkJCVNUT1JFZXJyKChmbmNvZGUpLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOyBcCisJCQlyZXR1cm4gMDsgXAorCQkJfSBcCisJCWlmICgocyktPm1ldGgtPmZubmFtZSA9PSBOVUxMKSBcCisJCQl7IFwKKwkJCVNUT1JFZXJyKChmbmNvZGUpLCAoZm5lcnJjb2RlKSk7IFwKKwkJCXJldHVybiAwOyBcCisJCQl9IFwKKwkJfSBcCisJd2hpbGUoMCkKKworLyogQVBJIGZ1bmN0aW9ucyAqLworCitYNTA5ICpTVE9SRV9nZXRfY2VydGlmaWNhdGUoU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJWDUwOSAqeDsKKworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9HRVRfQ0VSVElGSUNBVEUsCisJCWdldF9vYmplY3QsU1RPUkVfUl9OT19HRVRfT0JKRUNUX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IHMtPm1ldGgtPmdldF9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfWDUwOV9DRVJUSUZJQ0FURSwKKwkJYXR0cmlidXRlcywgcGFyYW1ldGVycyk7CisJaWYgKCFvYmplY3QgfHwgIW9iamVjdC0+ZGF0YS54NTA5LmNlcnRpZmljYXRlKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfR0VUX0NFUlRJRklDQVRFLAorCQkJU1RPUkVfUl9GQUlMRURfR0VUVElOR19DRVJUSUZJQ0FURSk7CisJCXJldHVybiAwOworCQl9CisJQ1JZUFRPX2FkZCgmb2JqZWN0LT5kYXRhLng1MDkuY2VydGlmaWNhdGUtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5KTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlg1MDkiLGRhdGEpOworI2VuZGlmCisJeCA9IG9iamVjdC0+ZGF0YS54NTA5LmNlcnRpZmljYXRlOworCVNUT1JFX09CSkVDVF9mcmVlKG9iamVjdCk7CisJcmV0dXJuIHg7CisJfQorCitpbnQgU1RPUkVfc3RvcmVfY2VydGlmaWNhdGUoU1RPUkUgKnMsIFg1MDkgKmRhdGEsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJaW50IGk7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfQ0VSVElGSUNBVEUsCisJCXN0b3JlX29iamVjdCxTVE9SRV9SX05PX1NUT1JFX09CSkVDVF9GVU5DVElPTik7CisKKwlvYmplY3QgPSBTVE9SRV9PQkpFQ1RfbmV3KCk7CisJaWYgKCFvYmplY3QpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9TVE9SRV9DRVJUSUZJQ0FURSwKKwkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkKKwlDUllQVE9fYWRkKCZkYXRhLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfWDUwOSk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJYNTA5IixkYXRhKTsKKyNlbmRpZgorCW9iamVjdC0+ZGF0YS54NTA5LmNlcnRpZmljYXRlID0gZGF0YTsKKworCWkgPSBzLT5tZXRoLT5zdG9yZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfWDUwOV9DRVJUSUZJQ0FURSwKKwkJb2JqZWN0LCBhdHRyaWJ1dGVzLCBwYXJhbWV0ZXJzKTsKKworCVNUT1JFX09CSkVDVF9mcmVlKG9iamVjdCk7CisKKwlpZiAoIWkpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9TVE9SRV9DRVJUSUZJQ0FURSwKKwkJCVNUT1JFX1JfRkFJTEVEX1NUT1JJTkdfQ0VSVElGSUNBVEUpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX21vZGlmeV9jZXJ0aWZpY2F0ZShTVE9SRSAqcywgT1BFTlNTTF9JVEVNIHNlYXJjaF9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIGFkZF9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBtb2RpZnlfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBkZWxldGVfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTU9ESUZZX0NFUlRJRklDQVRFLAorCQltb2RpZnlfb2JqZWN0LFNUT1JFX1JfTk9fTU9ESUZZX09CSkVDVF9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPm1vZGlmeV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfWDUwOV9DRVJUSUZJQ0FURSwKKwkJICAgIHNlYXJjaF9hdHRyaWJ1dGVzLCBhZGRfYXR0cmlidXRlcywgbW9kaWZ5X2F0dHJpYnV0ZXMsCisJCSAgICBkZWxldGVfYXR0cmlidXRlcywgcGFyYW1ldGVycykpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9NT0RJRllfQ0VSVElGSUNBVEUsCisJCQlTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfQ0VSVElGSUNBVEUpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX3Jldm9rZV9jZXJ0aWZpY2F0ZShTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfUkVWT0tFX0NFUlRJRklDQVRFLAorCQlyZXZva2Vfb2JqZWN0LFNUT1JFX1JfTk9fUkVWT0tFX09CSkVDVF9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPnJldm9rZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfWDUwOV9DRVJUSUZJQ0FURSwKKwkJICAgIGF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfUkVWT0tFX0NFUlRJRklDQVRFLAorCQkJU1RPUkVfUl9GQUlMRURfUkVWT0tJTkdfQ0VSVElGSUNBVEUpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX2RlbGV0ZV9jZXJ0aWZpY2F0ZShTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfREVMRVRFX0NFUlRJRklDQVRFLAorCQlkZWxldGVfb2JqZWN0LFNUT1JFX1JfTk9fREVMRVRFX09CSkVDVF9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPmRlbGV0ZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfWDUwOV9DRVJUSUZJQ0FURSwKKwkJICAgIGF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfREVMRVRFX0NFUlRJRklDQVRFLAorCQkJU1RPUkVfUl9GQUlMRURfREVMRVRJTkdfQ0VSVElGSUNBVEUpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKwordm9pZCAqU1RPUkVfbGlzdF9jZXJ0aWZpY2F0ZV9zdGFydChTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwl2b2lkICpoYW5kbGU7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTElTVF9DRVJUSUZJQ0FURV9TVEFSVCwKKwkJbGlzdF9vYmplY3Rfc3RhcnQsU1RPUkVfUl9OT19MSVNUX09CSkVDVF9TVEFSVF9GVU5DVElPTik7CisKKwloYW5kbGUgPSBzLT5tZXRoLT5saXN0X29iamVjdF9zdGFydChzLAorCQlTVE9SRV9PQkpFQ1RfVFlQRV9YNTA5X0NFUlRJRklDQVRFLCBhdHRyaWJ1dGVzLCBwYXJhbWV0ZXJzKTsKKwlpZiAoIWhhbmRsZSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0xJU1RfQ0VSVElGSUNBVEVfU1RBUlQsCisJCQlTVE9SRV9SX0ZBSUxFRF9MSVNUSU5HX0NFUlRJRklDQVRFUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGhhbmRsZTsKKwl9CisKK1g1MDkgKlNUT1JFX2xpc3RfY2VydGlmaWNhdGVfbmV4dChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKQorCXsKKwlTVE9SRV9PQkpFQ1QgKm9iamVjdDsKKwlYNTA5ICp4OworCisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0xJU1RfQ0VSVElGSUNBVEVfTkVYVCwKKwkJbGlzdF9vYmplY3RfbmV4dCxTVE9SRV9SX05PX0xJU1RfT0JKRUNUX05FWFRfRlVOQ1RJT04pOworCisJb2JqZWN0ID0gcy0+bWV0aC0+bGlzdF9vYmplY3RfbmV4dChzLCBoYW5kbGUpOworCWlmICghb2JqZWN0IHx8ICFvYmplY3QtPmRhdGEueDUwOS5jZXJ0aWZpY2F0ZSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0xJU1RfQ0VSVElGSUNBVEVfTkVYVCwKKwkJCVNUT1JFX1JfRkFJTEVEX0xJU1RJTkdfQ0VSVElGSUNBVEVTKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlDUllQVE9fYWRkKCZvYmplY3QtPmRhdGEueDUwOS5jZXJ0aWZpY2F0ZS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDkpOworI2lmZGVmIFJFRl9QUklOVAorCVJFRl9QUklOVCgiWDUwOSIsZGF0YSk7CisjZW5kaWYKKwl4ID0gb2JqZWN0LT5kYXRhLng1MDkuY2VydGlmaWNhdGU7CisJU1RPUkVfT0JKRUNUX2ZyZWUob2JqZWN0KTsKKwlyZXR1cm4geDsKKwl9CisKK2ludCBTVE9SRV9saXN0X2NlcnRpZmljYXRlX2VuZChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTElTVF9DRVJUSUZJQ0FURV9FTkQsCisJCWxpc3Rfb2JqZWN0X2VuZCxTVE9SRV9SX05PX0xJU1RfT0JKRUNUX0VORF9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPmxpc3Rfb2JqZWN0X2VuZChzLCBoYW5kbGUpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTElTVF9DRVJUSUZJQ0FURV9FTkQsCisJCQlTVE9SRV9SX0ZBSUxFRF9MSVNUSU5HX0NFUlRJRklDQVRFUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCitpbnQgU1RPUkVfbGlzdF9jZXJ0aWZpY2F0ZV9lbmRwKFNUT1JFICpzLCB2b2lkICpoYW5kbGUpCisJeworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9MSVNUX0NFUlRJRklDQVRFX0VORFAsCisJCWxpc3Rfb2JqZWN0X2VuZHAsU1RPUkVfUl9OT19MSVNUX09CSkVDVF9FTkRQX0ZVTkNUSU9OKTsKKworCWlmICghcy0+bWV0aC0+bGlzdF9vYmplY3RfZW5kcChzLCBoYW5kbGUpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTElTVF9DRVJUSUZJQ0FURV9FTkRQLAorCQkJU1RPUkVfUl9GQUlMRURfTElTVElOR19DRVJUSUZJQ0FURVMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworRVZQX1BLRVkgKlNUT1JFX2dlbmVyYXRlX2tleShTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlTVE9SRV9PQkpFQ1QgKm9iamVjdDsKKwlFVlBfUEtFWSAqcGtleTsKKworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9HRU5FUkFURV9LRVksCisJCWdlbmVyYXRlX29iamVjdCxTVE9SRV9SX05PX0dFTkVSQVRFX09CSkVDVF9GVU5DVElPTik7CisKKwlvYmplY3QgPSBzLT5tZXRoLT5nZW5lcmF0ZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfUFJJVkFURV9LRVksCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCWlmICghb2JqZWN0IHx8ICFvYmplY3QtPmRhdGEua2V5KQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfR0VORVJBVEVfS0VZLAorCQkJU1RPUkVfUl9GQUlMRURfR0VORVJBVElOR19LRVkpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT19hZGQoJm9iamVjdC0+ZGF0YS5rZXktPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19FVlBfUEtFWSk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJFVlBfUEtFWSIsZGF0YSk7CisjZW5kaWYKKwlwa2V5ID0gb2JqZWN0LT5kYXRhLmtleTsKKwlTVE9SRV9PQkpFQ1RfZnJlZShvYmplY3QpOworCXJldHVybiBwa2V5OworCX0KKworRVZQX1BLRVkgKlNUT1JFX2dldF9wcml2YXRlX2tleShTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlTVE9SRV9PQkpFQ1QgKm9iamVjdDsKKwlFVlBfUEtFWSAqcGtleTsKKworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9HRVRfUFJJVkFURV9LRVksCisJCWdldF9vYmplY3QsU1RPUkVfUl9OT19HRVRfT0JKRUNUX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IHMtPm1ldGgtPmdldF9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfUFJJVkFURV9LRVksCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCWlmICghb2JqZWN0IHx8ICFvYmplY3QtPmRhdGEua2V5IHx8ICFvYmplY3QtPmRhdGEua2V5KQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfR0VUX1BSSVZBVEVfS0VZLAorCQkJU1RPUkVfUl9GQUlMRURfR0VUVElOR19LRVkpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT19hZGQoJm9iamVjdC0+ZGF0YS5rZXktPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19FVlBfUEtFWSk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJFVlBfUEtFWSIsZGF0YSk7CisjZW5kaWYKKwlwa2V5ID0gb2JqZWN0LT5kYXRhLmtleTsKKwlTVE9SRV9PQkpFQ1RfZnJlZShvYmplY3QpOworCXJldHVybiBwa2V5OworCX0KKworaW50IFNUT1JFX3N0b3JlX3ByaXZhdGVfa2V5KFNUT1JFICpzLCBFVlBfUEtFWSAqZGF0YSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlTVE9SRV9PQkpFQ1QgKm9iamVjdDsKKwlpbnQgaTsKKworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9TVE9SRV9QUklWQVRFX0tFWSwKKwkJc3RvcmVfb2JqZWN0LFNUT1JFX1JfTk9fU1RPUkVfT0JKRUNUX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IFNUT1JFX09CSkVDVF9uZXcoKTsKKwlpZiAoIW9iamVjdCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX1BSSVZBVEVfS0VZLAorCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCW9iamVjdC0+ZGF0YS5rZXkgPSBFVlBfUEtFWV9uZXcoKTsKKwlpZiAoIW9iamVjdC0+ZGF0YS5rZXkpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9TVE9SRV9QUklWQVRFX0tFWSwKKwkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkKKwlDUllQVE9fYWRkKCZkYXRhLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworI2lmZGVmIFJFRl9QUklOVAorCVJFRl9QUklOVCgiRVZQX1BLRVkiLGRhdGEpOworI2VuZGlmCisJb2JqZWN0LT5kYXRhLmtleSA9IGRhdGE7CisKKwlpID0gcy0+bWV0aC0+c3RvcmVfb2JqZWN0KHMsIFNUT1JFX09CSkVDVF9UWVBFX1BSSVZBVEVfS0VZLCBvYmplY3QsCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCisJU1RPUkVfT0JKRUNUX2ZyZWUob2JqZWN0KTsKKworCWlmICghaSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX1BSSVZBVEVfS0VZLAorCQkJU1RPUkVfUl9GQUlMRURfU1RPUklOR19LRVkpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBpOworCX0KKworaW50IFNUT1JFX21vZGlmeV9wcml2YXRlX2tleShTVE9SRSAqcywgT1BFTlNTTF9JVEVNIHNlYXJjaF9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIGFkZF9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBtb2RpZnlfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBkZWxldGVfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTU9ESUZZX1BSSVZBVEVfS0VZLAorCQltb2RpZnlfb2JqZWN0LFNUT1JFX1JfTk9fTU9ESUZZX09CSkVDVF9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPm1vZGlmeV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfUFJJVkFURV9LRVksCisJCSAgICBzZWFyY2hfYXR0cmlidXRlcywgYWRkX2F0dHJpYnV0ZXMsIG1vZGlmeV9hdHRyaWJ1dGVzLAorCQkgICAgZGVsZXRlX2F0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTU9ESUZZX1BSSVZBVEVfS0VZLAorCQkJU1RPUkVfUl9GQUlMRURfTU9ESUZZSU5HX1BSSVZBVEVfS0VZKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9yZXZva2VfcHJpdmF0ZV9rZXkoU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJaW50IGk7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfUkVWT0tFX1BSSVZBVEVfS0VZLAorCQlyZXZva2Vfb2JqZWN0LFNUT1JFX1JfTk9fUkVWT0tFX09CSkVDVF9GVU5DVElPTik7CisKKwlpID0gcy0+bWV0aC0+cmV2b2tlX29iamVjdChzLCBTVE9SRV9PQkpFQ1RfVFlQRV9QUklWQVRFX0tFWSwKKwkJYXR0cmlidXRlcywgcGFyYW1ldGVycyk7CisKKwlpZiAoIWkpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9SRVZPS0VfUFJJVkFURV9LRVksCisJCQlTVE9SRV9SX0ZBSUxFRF9SRVZPS0lOR19LRVkpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBpOworCX0KKworaW50IFNUT1JFX2RlbGV0ZV9wcml2YXRlX2tleShTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfREVMRVRFX1BSSVZBVEVfS0VZLAorCQlkZWxldGVfb2JqZWN0LFNUT1JFX1JfTk9fREVMRVRFX09CSkVDVF9GVU5DVElPTik7CisJCisJaWYgKCFzLT5tZXRoLT5kZWxldGVfb2JqZWN0KHMsIFNUT1JFX09CSkVDVF9UWVBFX1BSSVZBVEVfS0VZLAorCQkgICAgYXR0cmlidXRlcywgcGFyYW1ldGVycykpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9ERUxFVEVfUFJJVkFURV9LRVksCisJCQlTVE9SRV9SX0ZBSUxFRF9ERUxFVElOR19LRVkpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKwordm9pZCAqU1RPUkVfbGlzdF9wcml2YXRlX2tleV9zdGFydChTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwl2b2lkICpoYW5kbGU7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTElTVF9QUklWQVRFX0tFWV9TVEFSVCwKKwkJbGlzdF9vYmplY3Rfc3RhcnQsU1RPUkVfUl9OT19MSVNUX09CSkVDVF9TVEFSVF9GVU5DVElPTik7CisKKwloYW5kbGUgPSBzLT5tZXRoLT5saXN0X29iamVjdF9zdGFydChzLCBTVE9SRV9PQkpFQ1RfVFlQRV9QUklWQVRFX0tFWSwKKwkJYXR0cmlidXRlcywgcGFyYW1ldGVycyk7CisJaWYgKCFoYW5kbGUpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9MSVNUX1BSSVZBVEVfS0VZX1NUQVJULAorCQkJU1RPUkVfUl9GQUlMRURfTElTVElOR19LRVlTKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gaGFuZGxlOworCX0KKworRVZQX1BLRVkgKlNUT1JFX2xpc3RfcHJpdmF0ZV9rZXlfbmV4dChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKQorCXsKKwlTVE9SRV9PQkpFQ1QgKm9iamVjdDsKKwlFVlBfUEtFWSAqcGtleTsKKworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9MSVNUX1BSSVZBVEVfS0VZX05FWFQsCisJCWxpc3Rfb2JqZWN0X25leHQsU1RPUkVfUl9OT19MSVNUX09CSkVDVF9ORVhUX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IHMtPm1ldGgtPmxpc3Rfb2JqZWN0X25leHQocywgaGFuZGxlKTsKKwlpZiAoIW9iamVjdCB8fCAhb2JqZWN0LT5kYXRhLmtleSB8fCAhb2JqZWN0LT5kYXRhLmtleSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0xJU1RfUFJJVkFURV9LRVlfTkVYVCwKKwkJCVNUT1JFX1JfRkFJTEVEX0xJU1RJTkdfS0VZUyk7CisJCXJldHVybiAwOworCQl9CisJQ1JZUFRPX2FkZCgmb2JqZWN0LT5kYXRhLmtleS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIkVWUF9QS0VZIixkYXRhKTsKKyNlbmRpZgorCXBrZXkgPSBvYmplY3QtPmRhdGEua2V5OworCVNUT1JFX09CSkVDVF9mcmVlKG9iamVjdCk7CisJcmV0dXJuIHBrZXk7CisJfQorCitpbnQgU1RPUkVfbGlzdF9wcml2YXRlX2tleV9lbmQoU1RPUkUgKnMsIHZvaWQgKmhhbmRsZSkKKwl7CisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0xJU1RfUFJJVkFURV9LRVlfRU5ELAorCQlsaXN0X29iamVjdF9lbmQsU1RPUkVfUl9OT19MSVNUX09CSkVDVF9FTkRfRlVOQ1RJT04pOworCisJaWYgKCFzLT5tZXRoLT5saXN0X29iamVjdF9lbmQocywgaGFuZGxlKSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0xJU1RfUFJJVkFURV9LRVlfRU5ELAorCQkJU1RPUkVfUl9GQUlMRURfTElTVElOR19LRVlTKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9saXN0X3ByaXZhdGVfa2V5X2VuZHAoU1RPUkUgKnMsIHZvaWQgKmhhbmRsZSkKKwl7CisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0xJU1RfUFJJVkFURV9LRVlfRU5EUCwKKwkJbGlzdF9vYmplY3RfZW5kcCxTVE9SRV9SX05PX0xJU1RfT0JKRUNUX0VORFBfRlVOQ1RJT04pOworCisJaWYgKCFzLT5tZXRoLT5saXN0X29iamVjdF9lbmRwKHMsIGhhbmRsZSkpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9MSVNUX1BSSVZBVEVfS0VZX0VORFAsCisJCQlTVE9SRV9SX0ZBSUxFRF9MSVNUSU5HX0tFWVMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworRVZQX1BLRVkgKlNUT1JFX2dldF9wdWJsaWNfa2V5KFNUT1JFICpzLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pCisJeworCVNUT1JFX09CSkVDVCAqb2JqZWN0OworCUVWUF9QS0VZICpwa2V5OworCisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0dFVF9QVUJMSUNfS0VZLAorCQlnZXRfb2JqZWN0LFNUT1JFX1JfTk9fR0VUX09CSkVDVF9GVU5DVElPTik7CisKKwlvYmplY3QgPSBzLT5tZXRoLT5nZXRfb2JqZWN0KHMsIFNUT1JFX09CSkVDVF9UWVBFX1BVQkxJQ19LRVksCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCWlmICghb2JqZWN0IHx8ICFvYmplY3QtPmRhdGEua2V5IHx8ICFvYmplY3QtPmRhdGEua2V5KQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfR0VUX1BVQkxJQ19LRVksCisJCQlTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX0tFWSk7CisJCXJldHVybiAwOworCQl9CisJQ1JZUFRPX2FkZCgmb2JqZWN0LT5kYXRhLmtleS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIkVWUF9QS0VZIixkYXRhKTsKKyNlbmRpZgorCXBrZXkgPSBvYmplY3QtPmRhdGEua2V5OworCVNUT1JFX09CSkVDVF9mcmVlKG9iamVjdCk7CisJcmV0dXJuIHBrZXk7CisJfQorCitpbnQgU1RPUkVfc3RvcmVfcHVibGljX2tleShTVE9SRSAqcywgRVZQX1BLRVkgKmRhdGEsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJaW50IGk7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfU1RPUkVfUFVCTElDX0tFWSwKKwkJc3RvcmVfb2JqZWN0LFNUT1JFX1JfTk9fU1RPUkVfT0JKRUNUX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IFNUT1JFX09CSkVDVF9uZXcoKTsKKwlpZiAoIW9iamVjdCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX1BVQkxJQ19LRVksCisJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJb2JqZWN0LT5kYXRhLmtleSA9IEVWUF9QS0VZX25ldygpOworCWlmICghb2JqZWN0LT5kYXRhLmtleSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX1BVQkxJQ19LRVksCisJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJCisJQ1JZUFRPX2FkZCgmZGF0YS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIkVWUF9QS0VZIixkYXRhKTsKKyNlbmRpZgorCW9iamVjdC0+ZGF0YS5rZXkgPSBkYXRhOworCisJaSA9IHMtPm1ldGgtPnN0b3JlX29iamVjdChzLCBTVE9SRV9PQkpFQ1RfVFlQRV9QVUJMSUNfS0VZLCBvYmplY3QsCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCisJU1RPUkVfT0JKRUNUX2ZyZWUob2JqZWN0KTsKKworCWlmICghaSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX1BVQkxJQ19LRVksCisJCQlTVE9SRV9SX0ZBSUxFRF9TVE9SSU5HX0tFWSk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGk7CisJfQorCitpbnQgU1RPUkVfbW9kaWZ5X3B1YmxpY19rZXkoU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBzZWFyY2hfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBhZGRfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gbW9kaWZ5X2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gZGVsZXRlX2F0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX01PRElGWV9QVUJMSUNfS0VZLAorCQltb2RpZnlfb2JqZWN0LFNUT1JFX1JfTk9fTU9ESUZZX09CSkVDVF9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPm1vZGlmeV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfUFVCTElDX0tFWSwKKwkJICAgIHNlYXJjaF9hdHRyaWJ1dGVzLCBhZGRfYXR0cmlidXRlcywgbW9kaWZ5X2F0dHJpYnV0ZXMsCisJCSAgICBkZWxldGVfYXR0cmlidXRlcywgcGFyYW1ldGVycykpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9NT0RJRllfUFVCTElDX0tFWSwKKwkJCVNUT1JFX1JfRkFJTEVEX01PRElGWUlOR19QVUJMSUNfS0VZKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9yZXZva2VfcHVibGljX2tleShTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlpbnQgaTsKKworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9SRVZPS0VfUFVCTElDX0tFWSwKKwkJcmV2b2tlX29iamVjdCxTVE9SRV9SX05PX1JFVk9LRV9PQkpFQ1RfRlVOQ1RJT04pOworCisJaSA9IHMtPm1ldGgtPnJldm9rZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfUFVCTElDX0tFWSwKKwkJYXR0cmlidXRlcywgcGFyYW1ldGVycyk7CisKKwlpZiAoIWkpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9SRVZPS0VfUFVCTElDX0tFWSwKKwkJCVNUT1JFX1JfRkFJTEVEX1JFVk9LSU5HX0tFWSk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIGk7CisJfQorCitpbnQgU1RPUkVfZGVsZXRlX3B1YmxpY19rZXkoU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0RFTEVURV9QVUJMSUNfS0VZLAorCQlkZWxldGVfb2JqZWN0LFNUT1JFX1JfTk9fREVMRVRFX09CSkVDVF9GVU5DVElPTik7CisJCisJaWYgKCFzLT5tZXRoLT5kZWxldGVfb2JqZWN0KHMsIFNUT1JFX09CSkVDVF9UWVBFX1BVQkxJQ19LRVksCisJCSAgICBhdHRyaWJ1dGVzLCBwYXJhbWV0ZXJzKSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0RFTEVURV9QVUJMSUNfS0VZLAorCQkJU1RPUkVfUl9GQUlMRURfREVMRVRJTkdfS0VZKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK3ZvaWQgKlNUT1JFX2xpc3RfcHVibGljX2tleV9zdGFydChTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwl2b2lkICpoYW5kbGU7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTElTVF9QVUJMSUNfS0VZX1NUQVJULAorCQlsaXN0X29iamVjdF9zdGFydCxTVE9SRV9SX05PX0xJU1RfT0JKRUNUX1NUQVJUX0ZVTkNUSU9OKTsKKworCWhhbmRsZSA9IHMtPm1ldGgtPmxpc3Rfb2JqZWN0X3N0YXJ0KHMsIFNUT1JFX09CSkVDVF9UWVBFX1BVQkxJQ19LRVksCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCWlmICghaGFuZGxlKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTElTVF9QVUJMSUNfS0VZX1NUQVJULAorCQkJU1RPUkVfUl9GQUlMRURfTElTVElOR19LRVlTKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gaGFuZGxlOworCX0KKworRVZQX1BLRVkgKlNUT1JFX2xpc3RfcHVibGljX2tleV9uZXh0KFNUT1JFICpzLCB2b2lkICpoYW5kbGUpCisJeworCVNUT1JFX09CSkVDVCAqb2JqZWN0OworCUVWUF9QS0VZICpwa2V5OworCisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0xJU1RfUFVCTElDX0tFWV9ORVhULAorCQlsaXN0X29iamVjdF9uZXh0LFNUT1JFX1JfTk9fTElTVF9PQkpFQ1RfTkVYVF9GVU5DVElPTik7CisKKwlvYmplY3QgPSBzLT5tZXRoLT5saXN0X29iamVjdF9uZXh0KHMsIGhhbmRsZSk7CisJaWYgKCFvYmplY3QgfHwgIW9iamVjdC0+ZGF0YS5rZXkgfHwgIW9iamVjdC0+ZGF0YS5rZXkpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9MSVNUX1BVQkxJQ19LRVlfTkVYVCwKKwkJCVNUT1JFX1JfRkFJTEVEX0xJU1RJTkdfS0VZUyk7CisJCXJldHVybiAwOworCQl9CisJQ1JZUFRPX2FkZCgmb2JqZWN0LT5kYXRhLmtleS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX0VWUF9QS0VZKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIkVWUF9QS0VZIixkYXRhKTsKKyNlbmRpZgorCXBrZXkgPSBvYmplY3QtPmRhdGEua2V5OworCVNUT1JFX09CSkVDVF9mcmVlKG9iamVjdCk7CisJcmV0dXJuIHBrZXk7CisJfQorCitpbnQgU1RPUkVfbGlzdF9wdWJsaWNfa2V5X2VuZChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTElTVF9QVUJMSUNfS0VZX0VORCwKKwkJbGlzdF9vYmplY3RfZW5kLFNUT1JFX1JfTk9fTElTVF9PQkpFQ1RfRU5EX0ZVTkNUSU9OKTsKKworCWlmICghcy0+bWV0aC0+bGlzdF9vYmplY3RfZW5kKHMsIGhhbmRsZSkpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9MSVNUX1BVQkxJQ19LRVlfRU5ELAorCQkJU1RPUkVfUl9GQUlMRURfTElTVElOR19LRVlTKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9saXN0X3B1YmxpY19rZXlfZW5kcChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTElTVF9QVUJMSUNfS0VZX0VORFAsCisJCWxpc3Rfb2JqZWN0X2VuZHAsU1RPUkVfUl9OT19MSVNUX09CSkVDVF9FTkRQX0ZVTkNUSU9OKTsKKworCWlmICghcy0+bWV0aC0+bGlzdF9vYmplY3RfZW5kcChzLCBoYW5kbGUpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTElTVF9QVUJMSUNfS0VZX0VORFAsCisJCQlTVE9SRV9SX0ZBSUxFRF9MSVNUSU5HX0tFWVMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworWDUwOV9DUkwgKlNUT1JFX2dlbmVyYXRlX2NybChTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlTVE9SRV9PQkpFQ1QgKm9iamVjdDsKKwlYNTA5X0NSTCAqY3JsOworCisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0dFTkVSQVRFX0NSTCwKKwkJZ2VuZXJhdGVfb2JqZWN0LFNUT1JFX1JfTk9fR0VORVJBVEVfQ1JMX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IHMtPm1ldGgtPmdlbmVyYXRlX29iamVjdChzLCBTVE9SRV9PQkpFQ1RfVFlQRV9YNTA5X0NSTCwKKwkJYXR0cmlidXRlcywgcGFyYW1ldGVycyk7CisJaWYgKCFvYmplY3QgfHwgIW9iamVjdC0+ZGF0YS5jcmwpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9HRU5FUkFURV9DUkwsCisJCQlTVE9SRV9SX0ZBSUxFRF9HRU5FUkFUSU5HX0NSTCk7CisJCXJldHVybiAwOworCQl9CisJQ1JZUFRPX2FkZCgmb2JqZWN0LT5kYXRhLmNybC0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDlfQ1JMKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlg1MDlfQ1JMIixkYXRhKTsKKyNlbmRpZgorCWNybCA9IG9iamVjdC0+ZGF0YS5jcmw7CisJU1RPUkVfT0JKRUNUX2ZyZWUob2JqZWN0KTsKKwlyZXR1cm4gY3JsOworCX0KKworWDUwOV9DUkwgKlNUT1JFX2dldF9jcmwoU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJWDUwOV9DUkwgKmNybDsKKworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9HRVRfQ1JMLAorCQlnZXRfb2JqZWN0LFNUT1JFX1JfTk9fR0VUX09CSkVDVF9GVU5DVElPTik7CisKKwlvYmplY3QgPSBzLT5tZXRoLT5nZXRfb2JqZWN0KHMsIFNUT1JFX09CSkVDVF9UWVBFX1g1MDlfQ1JMLAorCQlhdHRyaWJ1dGVzLCBwYXJhbWV0ZXJzKTsKKwlpZiAoIW9iamVjdCB8fCAhb2JqZWN0LT5kYXRhLmNybCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0dFVF9DUkwsCisJCQlTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX0tFWSk7CisJCXJldHVybiAwOworCQl9CisJQ1JZUFRPX2FkZCgmb2JqZWN0LT5kYXRhLmNybC0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDlfQ1JMKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlg1MDlfQ1JMIixkYXRhKTsKKyNlbmRpZgorCWNybCA9IG9iamVjdC0+ZGF0YS5jcmw7CisJU1RPUkVfT0JKRUNUX2ZyZWUob2JqZWN0KTsKKwlyZXR1cm4gY3JsOworCX0KKworaW50IFNUT1JFX3N0b3JlX2NybChTVE9SRSAqcywgWDUwOV9DUkwgKmRhdGEsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJaW50IGk7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfU1RPUkVfQ1JMLAorCQlzdG9yZV9vYmplY3QsU1RPUkVfUl9OT19TVE9SRV9PQkpFQ1RfRlVOQ1RJT04pOworCisJb2JqZWN0ID0gU1RPUkVfT0JKRUNUX25ldygpOworCWlmICghb2JqZWN0KQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfU1RPUkVfQ1JMLAorCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCQorCUNSWVBUT19hZGQoJmRhdGEtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5X0NSTCk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJYNTA5X0NSTCIsZGF0YSk7CisjZW5kaWYKKwlvYmplY3QtPmRhdGEuY3JsID0gZGF0YTsKKworCWkgPSBzLT5tZXRoLT5zdG9yZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfWDUwOV9DUkwsIG9iamVjdCwKKwkJYXR0cmlidXRlcywgcGFyYW1ldGVycyk7CisKKwlTVE9SRV9PQkpFQ1RfZnJlZShvYmplY3QpOworCisJaWYgKCFpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfU1RPUkVfQ1JMLAorCQkJU1RPUkVfUl9GQUlMRURfU1RPUklOR19LRVkpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBpOworCX0KKworaW50IFNUT1JFX21vZGlmeV9jcmwoU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBzZWFyY2hfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBhZGRfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gbW9kaWZ5X2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gZGVsZXRlX2F0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX01PRElGWV9DUkwsCisJCW1vZGlmeV9vYmplY3QsU1RPUkVfUl9OT19NT0RJRllfT0JKRUNUX0ZVTkNUSU9OKTsKKworCWlmICghcy0+bWV0aC0+bW9kaWZ5X29iamVjdChzLCBTVE9SRV9PQkpFQ1RfVFlQRV9YNTA5X0NSTCwKKwkJICAgIHNlYXJjaF9hdHRyaWJ1dGVzLCBhZGRfYXR0cmlidXRlcywgbW9kaWZ5X2F0dHJpYnV0ZXMsCisJCSAgICBkZWxldGVfYXR0cmlidXRlcywgcGFyYW1ldGVycykpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9NT0RJRllfQ1JMLAorCQkJU1RPUkVfUl9GQUlMRURfTU9ESUZZSU5HX0NSTCk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCitpbnQgU1RPUkVfZGVsZXRlX2NybChTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfREVMRVRFX0NSTCwKKwkJZGVsZXRlX29iamVjdCxTVE9SRV9SX05PX0RFTEVURV9PQkpFQ1RfRlVOQ1RJT04pOworCQorCWlmICghcy0+bWV0aC0+ZGVsZXRlX29iamVjdChzLCBTVE9SRV9PQkpFQ1RfVFlQRV9YNTA5X0NSTCwKKwkJICAgIGF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfREVMRVRFX0NSTCwKKwkJCVNUT1JFX1JfRkFJTEVEX0RFTEVUSU5HX0tFWSk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCit2b2lkICpTVE9SRV9saXN0X2NybF9zdGFydChTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwl2b2lkICpoYW5kbGU7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfTElTVF9DUkxfU1RBUlQsCisJCWxpc3Rfb2JqZWN0X3N0YXJ0LFNUT1JFX1JfTk9fTElTVF9PQkpFQ1RfU1RBUlRfRlVOQ1RJT04pOworCisJaGFuZGxlID0gcy0+bWV0aC0+bGlzdF9vYmplY3Rfc3RhcnQocywgU1RPUkVfT0JKRUNUX1RZUEVfWDUwOV9DUkwsCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCWlmICghaGFuZGxlKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTElTVF9DUkxfU1RBUlQsCisJCQlTVE9SRV9SX0ZBSUxFRF9MSVNUSU5HX0tFWVMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiBoYW5kbGU7CisJfQorCitYNTA5X0NSTCAqU1RPUkVfbGlzdF9jcmxfbmV4dChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKQorCXsKKwlTVE9SRV9PQkpFQ1QgKm9iamVjdDsKKwlYNTA5X0NSTCAqY3JsOworCisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0xJU1RfQ1JMX05FWFQsCisJCWxpc3Rfb2JqZWN0X25leHQsU1RPUkVfUl9OT19MSVNUX09CSkVDVF9ORVhUX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IHMtPm1ldGgtPmxpc3Rfb2JqZWN0X25leHQocywgaGFuZGxlKTsKKwlpZiAoIW9iamVjdCB8fCAhb2JqZWN0LT5kYXRhLmNybCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0xJU1RfQ1JMX05FWFQsCisJCQlTVE9SRV9SX0ZBSUxFRF9MSVNUSU5HX0tFWVMpOworCQlyZXR1cm4gMDsKKwkJfQorCUNSWVBUT19hZGQoJm9iamVjdC0+ZGF0YS5jcmwtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5X0NSTCk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJYNTA5X0NSTCIsZGF0YSk7CisjZW5kaWYKKwljcmwgPSBvYmplY3QtPmRhdGEuY3JsOworCVNUT1JFX09CSkVDVF9mcmVlKG9iamVjdCk7CisJcmV0dXJuIGNybDsKKwl9CisKK2ludCBTVE9SRV9saXN0X2NybF9lbmQoU1RPUkUgKnMsIHZvaWQgKmhhbmRsZSkKKwl7CisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0xJU1RfQ1JMX0VORCwKKwkJbGlzdF9vYmplY3RfZW5kLFNUT1JFX1JfTk9fTElTVF9PQkpFQ1RfRU5EX0ZVTkNUSU9OKTsKKworCWlmICghcy0+bWV0aC0+bGlzdF9vYmplY3RfZW5kKHMsIGhhbmRsZSkpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9MSVNUX0NSTF9FTkQsCisJCQlTVE9SRV9SX0ZBSUxFRF9MSVNUSU5HX0tFWVMpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX2xpc3RfY3JsX2VuZHAoU1RPUkUgKnMsIHZvaWQgKmhhbmRsZSkKKwl7CisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0xJU1RfQ1JMX0VORFAsCisJCWxpc3Rfb2JqZWN0X2VuZHAsU1RPUkVfUl9OT19MSVNUX09CSkVDVF9FTkRQX0ZVTkNUSU9OKTsKKworCWlmICghcy0+bWV0aC0+bGlzdF9vYmplY3RfZW5kcChzLCBoYW5kbGUpKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfTElTVF9DUkxfRU5EUCwKKwkJCVNUT1JFX1JfRkFJTEVEX0xJU1RJTkdfS0VZUyk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCitpbnQgU1RPUkVfc3RvcmVfbnVtYmVyKFNUT1JFICpzLCBCSUdOVU0gKmRhdGEsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJaW50IGk7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfU1RPUkVfTlVNQkVSLAorCQlzdG9yZV9vYmplY3QsU1RPUkVfUl9OT19TVE9SRV9PQkpFQ1RfTlVNQkVSX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IFNUT1JFX09CSkVDVF9uZXcoKTsKKwlpZiAoIW9iamVjdCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX05VTUJFUiwKKwkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkKKwlvYmplY3QtPmRhdGEubnVtYmVyID0gZGF0YTsKKworCWkgPSBzLT5tZXRoLT5zdG9yZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfTlVNQkVSLCBvYmplY3QsCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCisJU1RPUkVfT0JKRUNUX2ZyZWUob2JqZWN0KTsKKworCWlmICghaSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX05VTUJFUiwKKwkJCVNUT1JFX1JfRkFJTEVEX1NUT1JJTkdfTlVNQkVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9tb2RpZnlfbnVtYmVyKFNUT1JFICpzLCBPUEVOU1NMX0lURU0gc2VhcmNoX2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gYWRkX2F0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIG1vZGlmeV9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIGRlbGV0ZV9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pCisJeworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9NT0RJRllfTlVNQkVSLAorCQltb2RpZnlfb2JqZWN0LFNUT1JFX1JfTk9fTU9ESUZZX09CSkVDVF9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPm1vZGlmeV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfTlVNQkVSLAorCQkgICAgc2VhcmNoX2F0dHJpYnV0ZXMsIGFkZF9hdHRyaWJ1dGVzLCBtb2RpZnlfYXR0cmlidXRlcywKKwkJICAgIGRlbGV0ZV9hdHRyaWJ1dGVzLCBwYXJhbWV0ZXJzKSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX01PRElGWV9OVU1CRVIsCisJCQlTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfTlVNQkVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK0JJR05VTSAqU1RPUkVfZ2V0X251bWJlcihTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlTVE9SRV9PQkpFQ1QgKm9iamVjdDsKKwlCSUdOVU0gKm47CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfR0VUX05VTUJFUiwKKwkJZ2V0X29iamVjdCxTVE9SRV9SX05PX0dFVF9PQkpFQ1RfTlVNQkVSX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IHMtPm1ldGgtPmdldF9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfTlVNQkVSLCBhdHRyaWJ1dGVzLAorCQlwYXJhbWV0ZXJzKTsKKwlpZiAoIW9iamVjdCB8fCAhb2JqZWN0LT5kYXRhLm51bWJlcikKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0dFVF9OVU1CRVIsCisJCQlTVE9SRV9SX0ZBSUxFRF9HRVRUSU5HX05VTUJFUik7CisJCXJldHVybiAwOworCQl9CisJbiA9IG9iamVjdC0+ZGF0YS5udW1iZXI7CisJb2JqZWN0LT5kYXRhLm51bWJlciA9IE5VTEw7CisJU1RPUkVfT0JKRUNUX2ZyZWUob2JqZWN0KTsKKwlyZXR1cm4gbjsKKwl9CisKK2ludCBTVE9SRV9kZWxldGVfbnVtYmVyKFNUT1JFICpzLCBPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pCisJeworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9ERUxFVEVfTlVNQkVSLAorCQlkZWxldGVfb2JqZWN0LFNUT1JFX1JfTk9fREVMRVRFX05VTUJFUl9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPmRlbGV0ZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfTlVNQkVSLCBhdHRyaWJ1dGVzLAorCQkgICAgcGFyYW1ldGVycykpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9ERUxFVEVfTlVNQkVSLAorCQkJU1RPUkVfUl9GQUlMRURfREVMRVRJTkdfTlVNQkVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9zdG9yZV9hcmJpdHJhcnkoU1RPUkUgKnMsIEJVRl9NRU0gKmRhdGEsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJaW50IGk7CisKKwljaGVja19zdG9yZShzLFNUT1JFX0ZfU1RPUkVfU1RPUkVfQVJCSVRSQVJZLAorCQlzdG9yZV9vYmplY3QsU1RPUkVfUl9OT19TVE9SRV9PQkpFQ1RfQVJCSVRSQVJZX0ZVTkNUSU9OKTsKKworCW9iamVjdCA9IFNUT1JFX09CSkVDVF9uZXcoKTsKKwlpZiAoIW9iamVjdCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX0FSQklUUkFSWSwKKwkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwkKKwlvYmplY3QtPmRhdGEuYXJiaXRyYXJ5ID0gZGF0YTsKKworCWkgPSBzLT5tZXRoLT5zdG9yZV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfQVJCSVRSQVJZLCBvYmplY3QsCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCisJU1RPUkVfT0JKRUNUX2ZyZWUob2JqZWN0KTsKKworCWlmICghaSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1NUT1JFX0FSQklUUkFSWSwKKwkJCVNUT1JFX1JfRkFJTEVEX1NUT1JJTkdfQVJCSVRSQVJZKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9tb2RpZnlfYXJiaXRyYXJ5KFNUT1JFICpzLCBPUEVOU1NMX0lURU0gc2VhcmNoX2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gYWRkX2F0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIG1vZGlmeV9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIGRlbGV0ZV9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pCisJeworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9NT0RJRllfQVJCSVRSQVJZLAorCQltb2RpZnlfb2JqZWN0LFNUT1JFX1JfTk9fTU9ESUZZX09CSkVDVF9GVU5DVElPTik7CisKKwlpZiAoIXMtPm1ldGgtPm1vZGlmeV9vYmplY3QocywgU1RPUkVfT0JKRUNUX1RZUEVfQVJCSVRSQVJZLAorCQkgICAgc2VhcmNoX2F0dHJpYnV0ZXMsIGFkZF9hdHRyaWJ1dGVzLCBtb2RpZnlfYXR0cmlidXRlcywKKwkJICAgIGRlbGV0ZV9hdHRyaWJ1dGVzLCBwYXJhbWV0ZXJzKSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX01PRElGWV9BUkJJVFJBUlksCisJCQlTVE9SRV9SX0ZBSUxFRF9NT0RJRllJTkdfQVJCSVRSQVJZKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK0JVRl9NRU0gKlNUT1JFX2dldF9hcmJpdHJhcnkoU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJQlVGX01FTSAqYjsKKworCWNoZWNrX3N0b3JlKHMsU1RPUkVfRl9TVE9SRV9HRVRfQVJCSVRSQVJZLAorCQlnZXRfb2JqZWN0LFNUT1JFX1JfTk9fR0VUX09CSkVDVF9BUkJJVFJBUllfRlVOQ1RJT04pOworCisJb2JqZWN0ID0gcy0+bWV0aC0+Z2V0X29iamVjdChzLCBTVE9SRV9PQkpFQ1RfVFlQRV9BUkJJVFJBUlksCisJCWF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCWlmICghb2JqZWN0IHx8ICFvYmplY3QtPmRhdGEuYXJiaXRyYXJ5KQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfR0VUX0FSQklUUkFSWSwKKwkJCVNUT1JFX1JfRkFJTEVEX0dFVFRJTkdfQVJCSVRSQVJZKTsKKwkJcmV0dXJuIDA7CisJCX0KKwliID0gb2JqZWN0LT5kYXRhLmFyYml0cmFyeTsKKwlvYmplY3QtPmRhdGEuYXJiaXRyYXJ5ID0gTlVMTDsKKwlTVE9SRV9PQkpFQ1RfZnJlZShvYmplY3QpOworCXJldHVybiBiOworCX0KKworaW50IFNUT1JFX2RlbGV0ZV9hcmJpdHJhcnkoU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJY2hlY2tfc3RvcmUocyxTVE9SRV9GX1NUT1JFX0RFTEVURV9BUkJJVFJBUlksCisJCWRlbGV0ZV9vYmplY3QsU1RPUkVfUl9OT19ERUxFVEVfQVJCSVRSQVJZX0ZVTkNUSU9OKTsKKworCWlmICghcy0+bWV0aC0+ZGVsZXRlX29iamVjdChzLCBTVE9SRV9PQkpFQ1RfVFlQRV9BUkJJVFJBUlksIGF0dHJpYnV0ZXMsCisJCSAgICBwYXJhbWV0ZXJzKSkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0RFTEVURV9BUkJJVFJBUlksCisJCQlTVE9SRV9SX0ZBSUxFRF9ERUxFVElOR19BUkJJVFJBUlkpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworU1RPUkVfT0JKRUNUICpTVE9SRV9PQkpFQ1RfbmV3KHZvaWQpCisJeworCVNUT1JFX09CSkVDVCAqb2JqZWN0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFNUT1JFX09CSkVDVCkpOworCWlmIChvYmplY3QpIG1lbXNldChvYmplY3QsIDAsIHNpemVvZihTVE9SRV9PQkpFQ1QpKTsKKwlyZXR1cm4gb2JqZWN0OworCX0KK3ZvaWQgU1RPUkVfT0JKRUNUX2ZyZWUoU1RPUkVfT0JKRUNUICpkYXRhKQorCXsKKwlpZiAoIWRhdGEpIHJldHVybjsKKwlzd2l0Y2ggKGRhdGEtPnR5cGUpCisJCXsKKwljYXNlIFNUT1JFX09CSkVDVF9UWVBFX1g1MDlfQ0VSVElGSUNBVEU6CisJCVg1MDlfZnJlZShkYXRhLT5kYXRhLng1MDkuY2VydGlmaWNhdGUpOworCQlicmVhazsKKwljYXNlIFNUT1JFX09CSkVDVF9UWVBFX1g1MDlfQ1JMOgorCQlYNTA5X0NSTF9mcmVlKGRhdGEtPmRhdGEuY3JsKTsKKwkJYnJlYWs7CisJY2FzZSBTVE9SRV9PQkpFQ1RfVFlQRV9QUklWQVRFX0tFWToKKwljYXNlIFNUT1JFX09CSkVDVF9UWVBFX1BVQkxJQ19LRVk6CisJCUVWUF9QS0VZX2ZyZWUoZGF0YS0+ZGF0YS5rZXkpOworCQlicmVhazsKKwljYXNlIFNUT1JFX09CSkVDVF9UWVBFX05VTUJFUjoKKwkJQk5fZnJlZShkYXRhLT5kYXRhLm51bWJlcik7CisJCWJyZWFrOworCWNhc2UgU1RPUkVfT0JKRUNUX1RZUEVfQVJCSVRSQVJZOgorCQlCVUZfTUVNX2ZyZWUoZGF0YS0+ZGF0YS5hcmJpdHJhcnkpOworCQlicmVhazsKKwkJfQorCU9QRU5TU0xfZnJlZShkYXRhKTsKKwl9CisKK0lNUExFTUVOVF9TVEFDS19PRihTVE9SRV9PQkpFQ1QqKQorCisKK3N0cnVjdCBTVE9SRV9hdHRyX2luZm9fc3QKKwl7CisJdW5zaWduZWQgY2hhciBzZXRbKFNUT1JFX0FUVFJfVFlQRV9OVU0gKyA4KSAvIDhdOworCXVuaW9uCisJCXsKKwkJY2hhciAqY3N0cmluZzsKKwkJdW5zaWduZWQgY2hhciAqc2hhMXN0cmluZzsKKwkJWDUwOV9OQU1FICpkbjsKKwkJQklHTlVNICpudW1iZXI7CisJCXZvaWQgKmFueTsKKwkJfSB2YWx1ZXNbU1RPUkVfQVRUUl9UWVBFX05VTSsxXTsKKwlzaXplX3QgdmFsdWVfc2l6ZXNbU1RPUkVfQVRUUl9UWVBFX05VTSsxXTsKKwl9OworCisjZGVmaW5lIEFUVFJfSVNfU0VUKGEsaSkJKChpKSA+IDAgJiYgKGkpIDwgU1RPUkVfQVRUUl9UWVBFX05VTSBcCisJCQkJJiYgKChhKS0+c2V0WyhpKSAvIDhdICYgKDEgPDwgKChpKSAlIDgpKSkpCisjZGVmaW5lIFNFVF9BVFRSQklUKGEsaSkJKChhKS0+c2V0WyhpKSAvIDhdIHw9ICgxIDw8ICgoaSkgJSA4KSkpCisjZGVmaW5lIENMRUFSX0FUVFJCSVQoYSxpKQkoKGEpLT5zZXRbKGkpIC8gOF0gJj0gfigxIDw8ICgoaSkgJSA4KSkpCisKK1NUT1JFX0FUVFJfSU5GTyAqU1RPUkVfQVRUUl9JTkZPX25ldyh2b2lkKQorCXsKKwlyZXR1cm4gKFNUT1JFX0FUVFJfSU5GTyAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihTVE9SRV9BVFRSX0lORk8pKTsKKwl9CitzdGF0aWMgdm9pZCBTVE9SRV9BVFRSX0lORk9fYXR0cl9mcmVlKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsCisJU1RPUkVfQVRUUl9UWVBFUyBjb2RlKQorCXsKKwlpZiAoQVRUUl9JU19TRVQoYXR0cnMsY29kZSkpCisJCXsKKwkJc3dpdGNoKGNvZGUpCisJCQl7CisJCWNhc2UgU1RPUkVfQVRUUl9GUklFTkRMWU5BTUU6CisJCWNhc2UgU1RPUkVfQVRUUl9FTUFJTDoKKwkJY2FzZSBTVE9SRV9BVFRSX0ZJTEVOQU1FOgorCQkJU1RPUkVfQVRUUl9JTkZPX21vZGlmeV9jc3RyKGF0dHJzLCBjb2RlLCBOVUxMLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFNUT1JFX0FUVFJfS0VZSUQ6CisJCWNhc2UgU1RPUkVfQVRUUl9JU1NVRVJLRVlJRDoKKwkJY2FzZSBTVE9SRV9BVFRSX1NVQkpFQ1RLRVlJRDoKKwkJY2FzZSBTVE9SRV9BVFRSX0lTU1VFUlNFUklBTEhBU0g6CisJCWNhc2UgU1RPUkVfQVRUUl9DRVJUSEFTSDoKKwkJCVNUT1JFX0FUVFJfSU5GT19tb2RpZnlfc2hhMXN0cihhdHRycywgY29kZSwgTlVMTCwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBTVE9SRV9BVFRSX0lTU1VFUjoKKwkJY2FzZSBTVE9SRV9BVFRSX1NVQkpFQ1Q6CisJCQlTVE9SRV9BVFRSX0lORk9fbW9kaWZ5X2RuKGF0dHJzLCBjb2RlLCBOVUxMKTsKKwkJCWJyZWFrOworCQljYXNlIFNUT1JFX0FUVFJfU0VSSUFMOgorCQkJU1RPUkVfQVRUUl9JTkZPX21vZGlmeV9udW1iZXIoYXR0cnMsIGNvZGUsIE5VTEwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK2ludCBTVE9SRV9BVFRSX0lORk9fZnJlZShTVE9SRV9BVFRSX0lORk8gKmF0dHJzKQorCXsKKwlpZiAoYXR0cnMpCisJCXsKKwkJU1RPUkVfQVRUUl9UWVBFUyBpOworCQlmb3IoaSA9IDA7IGkrKyA8IFNUT1JFX0FUVFJfVFlQRV9OVU07KQorCQkJU1RPUkVfQVRUUl9JTkZPX2F0dHJfZnJlZShhdHRycywgaSk7CisJCU9QRU5TU0xfZnJlZShhdHRycyk7CisJCX0KKwlyZXR1cm4gMTsKKwl9CitjaGFyICpTVE9SRV9BVFRSX0lORk9fZ2V0MF9jc3RyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSkKKwl7CisJaWYgKCFhdHRycykKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19HRVQwX0NTVFIsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmIChBVFRSX0lTX1NFVChhdHRycyxjb2RlKSkKKwkJcmV0dXJuIGF0dHJzLT52YWx1ZXNbY29kZV0uY3N0cmluZzsKKwlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19HRVQwX0NTVFIsCisJCVNUT1JFX1JfTk9fVkFMVUUpOworCXJldHVybiBOVUxMOworCX0KK3Vuc2lnbmVkIGNoYXIgKlNUT1JFX0FUVFJfSU5GT19nZXQwX3NoYTFzdHIoU1RPUkVfQVRUUl9JTkZPICphdHRycywKKwlTVE9SRV9BVFRSX1RZUEVTIGNvZGUpCisJeworCWlmICghYXR0cnMpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fR0VUMF9TSEExU1RSLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZiAoQVRUUl9JU19TRVQoYXR0cnMsY29kZSkpCisJCXJldHVybiBhdHRycy0+dmFsdWVzW2NvZGVdLnNoYTFzdHJpbmc7CisJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fR0VUMF9TSEExU1RSLAorCQlTVE9SRV9SX05PX1ZBTFVFKTsKKwlyZXR1cm4gTlVMTDsKKwl9CitYNTA5X05BTUUgKlNUT1JFX0FUVFJfSU5GT19nZXQwX2RuKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSkKKwl7CisJaWYgKCFhdHRycykKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19HRVQwX0ROLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZiAoQVRUUl9JU19TRVQoYXR0cnMsY29kZSkpCisJCXJldHVybiBhdHRycy0+dmFsdWVzW2NvZGVdLmRuOworCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX0dFVDBfRE4sCisJCVNUT1JFX1JfTk9fVkFMVUUpOworCXJldHVybiBOVUxMOworCX0KK0JJR05VTSAqU1RPUkVfQVRUUl9JTkZPX2dldDBfbnVtYmVyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSkKKwl7CisJaWYgKCFhdHRycykKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19HRVQwX05VTUJFUiwKKwkJCUVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybiBOVUxMOworCQl9CisJaWYgKEFUVFJfSVNfU0VUKGF0dHJzLGNvZGUpKQorCQlyZXR1cm4gYXR0cnMtPnZhbHVlc1tjb2RlXS5udW1iZXI7CisJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fR0VUMF9OVU1CRVIsCisJCVNUT1JFX1JfTk9fVkFMVUUpOworCXJldHVybiBOVUxMOworCX0KK2ludCBTVE9SRV9BVFRSX0lORk9fc2V0X2NzdHIoU1RPUkVfQVRUUl9JTkZPICphdHRycywgU1RPUkVfQVRUUl9UWVBFUyBjb2RlLAorCWNoYXIgKmNzdHIsIHNpemVfdCBjc3RyX3NpemUpCisJeworCWlmICghYXR0cnMpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fU0VUX0NTVFIsCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmICghQVRUUl9JU19TRVQoYXR0cnMsY29kZSkpCisJCXsKKwkJaWYgKChhdHRycy0+dmFsdWVzW2NvZGVdLmNzdHJpbmcgPSBCVUZfc3RybmR1cChjc3RyLCBjc3RyX3NpemUpKSkKKwkJCXJldHVybiAxOworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19TRVRfQ1NUUiwKKwkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19TRVRfQ1NUUiwgU1RPUkVfUl9BTFJFQURZX0hBU19BX1ZBTFVFKTsKKwlyZXR1cm4gMDsKKwl9CitpbnQgU1RPUkVfQVRUUl9JTkZPX3NldF9zaGExc3RyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSwKKwl1bnNpZ25lZCBjaGFyICpzaGExc3RyLCBzaXplX3Qgc2hhMXN0cl9zaXplKQorCXsKKwlpZiAoIWF0dHJzKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX1NFVF9TSEExU1RSLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoIUFUVFJfSVNfU0VUKGF0dHJzLGNvZGUpKQorCQl7CisJCWlmICgoYXR0cnMtPnZhbHVlc1tjb2RlXS5zaGExc3RyaW5nID0KKwkJCSAgICAodW5zaWduZWQgY2hhciAqKUJVRl9tZW1kdXAoc2hhMXN0ciwKKwkJCQkgICAgc2hhMXN0cl9zaXplKSkpCisJCQlyZXR1cm4gMTsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fU0VUX1NIQTFTVFIsCisJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fU0VUX1NIQTFTVFIsIFNUT1JFX1JfQUxSRUFEWV9IQVNfQV9WQUxVRSk7CisJcmV0dXJuIDA7CisJfQoraW50IFNUT1JFX0FUVFJfSU5GT19zZXRfZG4oU1RPUkVfQVRUUl9JTkZPICphdHRycywgU1RPUkVfQVRUUl9UWVBFUyBjb2RlLAorCVg1MDlfTkFNRSAqZG4pCisJeworCWlmICghYXR0cnMpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fU0VUX0ROLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoIUFUVFJfSVNfU0VUKGF0dHJzLGNvZGUpKQorCQl7CisJCWlmICgoYXR0cnMtPnZhbHVlc1tjb2RlXS5kbiA9IFg1MDlfTkFNRV9kdXAoZG4pKSkKKwkJCXJldHVybiAxOworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19TRVRfRE4sCisJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fU0VUX0ROLCBTVE9SRV9SX0FMUkVBRFlfSEFTX0FfVkFMVUUpOworCXJldHVybiAwOworCX0KK2ludCBTVE9SRV9BVFRSX0lORk9fc2V0X251bWJlcihTVE9SRV9BVFRSX0lORk8gKmF0dHJzLCBTVE9SRV9BVFRSX1RZUEVTIGNvZGUsCisJQklHTlVNICpudW1iZXIpCisJeworCWlmICghYXR0cnMpCisJCXsKKwkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fU0VUX05VTUJFUiwKKwkJCUVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybiAwOworCQl9CisJaWYgKCFBVFRSX0lTX1NFVChhdHRycyxjb2RlKSkKKwkJeworCQlpZiAoKGF0dHJzLT52YWx1ZXNbY29kZV0ubnVtYmVyID0gQk5fZHVwKG51bWJlcikpKQorCQkJcmV0dXJuIDE7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX1NFVF9OVU1CRVIsCisJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9BVFRSX0lORk9fU0VUX05VTUJFUiwgU1RPUkVfUl9BTFJFQURZX0hBU19BX1ZBTFVFKTsKKwlyZXR1cm4gMDsKKwl9CitpbnQgU1RPUkVfQVRUUl9JTkZPX21vZGlmeV9jc3RyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSwKKwljaGFyICpjc3RyLCBzaXplX3QgY3N0cl9zaXplKQorCXsKKwlpZiAoIWF0dHJzKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX01PRElGWV9DU1RSLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoQVRUUl9JU19TRVQoYXR0cnMsY29kZSkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGF0dHJzLT52YWx1ZXNbY29kZV0uY3N0cmluZyk7CisJCWF0dHJzLT52YWx1ZXNbY29kZV0uY3N0cmluZyA9IE5VTEw7CisJCUNMRUFSX0FUVFJCSVQoYXR0cnMsIGNvZGUpOworCQl9CisJcmV0dXJuIFNUT1JFX0FUVFJfSU5GT19zZXRfY3N0cihhdHRycywgY29kZSwgY3N0ciwgY3N0cl9zaXplKTsKKwl9CitpbnQgU1RPUkVfQVRUUl9JTkZPX21vZGlmeV9zaGExc3RyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSwKKwl1bnNpZ25lZCBjaGFyICpzaGExc3RyLCBzaXplX3Qgc2hhMXN0cl9zaXplKQorCXsKKwlpZiAoIWF0dHJzKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfQVRUUl9JTkZPX01PRElGWV9TSEExU1RSLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoQVRUUl9JU19TRVQoYXR0cnMsY29kZSkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGF0dHJzLT52YWx1ZXNbY29kZV0uc2hhMXN0cmluZyk7CisJCWF0dHJzLT52YWx1ZXNbY29kZV0uc2hhMXN0cmluZyA9IE5VTEw7CisJCUNMRUFSX0FUVFJCSVQoYXR0cnMsIGNvZGUpOworCQl9CisJcmV0dXJuIFNUT1JFX0FUVFJfSU5GT19zZXRfc2hhMXN0cihhdHRycywgY29kZSwgc2hhMXN0ciwgc2hhMXN0cl9zaXplKTsKKwl9CitpbnQgU1RPUkVfQVRUUl9JTkZPX21vZGlmeV9kbihTVE9SRV9BVFRSX0lORk8gKmF0dHJzLCBTVE9SRV9BVFRSX1RZUEVTIGNvZGUsCisJWDUwOV9OQU1FICpkbikKKwl7CisJaWYgKCFhdHRycykKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19NT0RJRllfRE4sCisJCQlFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChBVFRSX0lTX1NFVChhdHRycyxjb2RlKSkKKwkJeworCQlPUEVOU1NMX2ZyZWUoYXR0cnMtPnZhbHVlc1tjb2RlXS5kbik7CisJCWF0dHJzLT52YWx1ZXNbY29kZV0uZG4gPSBOVUxMOworCQlDTEVBUl9BVFRSQklUKGF0dHJzLCBjb2RlKTsKKwkJfQorCXJldHVybiBTVE9SRV9BVFRSX0lORk9fc2V0X2RuKGF0dHJzLCBjb2RlLCBkbik7CisJfQoraW50IFNUT1JFX0FUVFJfSU5GT19tb2RpZnlfbnVtYmVyKFNUT1JFX0FUVFJfSU5GTyAqYXR0cnMsIFNUT1JFX0FUVFJfVFlQRVMgY29kZSwKKwlCSUdOVU0gKm51bWJlcikKKwl7CisJaWYgKCFhdHRycykKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX0FUVFJfSU5GT19NT0RJRllfTlVNQkVSLAorCQkJRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoQVRUUl9JU19TRVQoYXR0cnMsY29kZSkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGF0dHJzLT52YWx1ZXNbY29kZV0ubnVtYmVyKTsKKwkJYXR0cnMtPnZhbHVlc1tjb2RlXS5udW1iZXIgPSBOVUxMOworCQlDTEVBUl9BVFRSQklUKGF0dHJzLCBjb2RlKTsKKwkJfQorCXJldHVybiBTVE9SRV9BVFRSX0lORk9fc2V0X251bWJlcihhdHRycywgY29kZSwgbnVtYmVyKTsKKwl9CisKK3N0cnVjdCBhdHRyX2xpc3RfY3R4X3N0CisJeworCU9QRU5TU0xfSVRFTSAqYXR0cmlidXRlczsKKwl9Owordm9pZCAqU1RPUkVfcGFyc2VfYXR0cnNfc3RhcnQoT1BFTlNTTF9JVEVNICphdHRyaWJ1dGVzKQorCXsKKwlpZiAoYXR0cmlidXRlcykKKwkJeworCQlzdHJ1Y3QgYXR0cl9saXN0X2N0eF9zdCAqY29udGV4dCA9CisJCQkoc3RydWN0IGF0dHJfbGlzdF9jdHhfc3QgKilPUEVOU1NMX21hbGxvYyhzaXplb2Yoc3RydWN0IGF0dHJfbGlzdF9jdHhfc3QpKTsKKwkJaWYgKGNvbnRleHQpCisJCQljb250ZXh0LT5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKwkJZWxzZQorCQkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9QQVJTRV9BVFRSU19TVEFSVCwKKwkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBjb250ZXh0OworCQl9CisJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9QQVJTRV9BVFRSU19TVEFSVCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwlyZXR1cm4gMDsKKwl9CitTVE9SRV9BVFRSX0lORk8gKlNUT1JFX3BhcnNlX2F0dHJzX25leHQodm9pZCAqaGFuZGxlKQorCXsKKwlzdHJ1Y3QgYXR0cl9saXN0X2N0eF9zdCAqY29udGV4dCA9IChzdHJ1Y3QgYXR0cl9saXN0X2N0eF9zdCAqKWhhbmRsZTsKKworCWlmIChjb250ZXh0ICYmIGNvbnRleHQtPmF0dHJpYnV0ZXMpCisJCXsKKwkJU1RPUkVfQVRUUl9JTkZPICphdHRycyA9IE5VTEw7CisKKwkJd2hpbGUoY29udGV4dC0+YXR0cmlidXRlcworCQkJJiYgY29udGV4dC0+YXR0cmlidXRlcy0+Y29kZSAhPSBTVE9SRV9BVFRSX09SCisJCQkmJiBjb250ZXh0LT5hdHRyaWJ1dGVzLT5jb2RlICE9IFNUT1JFX0FUVFJfRU5EKQorCQkJeworCQkJc3dpdGNoKGNvbnRleHQtPmF0dHJpYnV0ZXMtPmNvZGUpCisJCQkJeworCQkJY2FzZSBTVE9SRV9BVFRSX0ZSSUVORExZTkFNRToKKwkJCWNhc2UgU1RPUkVfQVRUUl9FTUFJTDoKKwkJCWNhc2UgU1RPUkVfQVRUUl9GSUxFTkFNRToKKwkJCQlpZiAoIWF0dHJzKSBhdHRycyA9IFNUT1JFX0FUVFJfSU5GT19uZXcoKTsKKwkJCQlpZiAoYXR0cnMgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1BBUlNFX0FUVFJTX05FWFQsCisJCQkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJU1RPUkVfQVRUUl9JTkZPX3NldF9jc3RyKGF0dHJzLAorCQkJCQljb250ZXh0LT5hdHRyaWJ1dGVzLT5jb2RlLAorCQkJCQljb250ZXh0LT5hdHRyaWJ1dGVzLT52YWx1ZSwKKwkJCQkJY29udGV4dC0+YXR0cmlidXRlcy0+dmFsdWVfc2l6ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNUT1JFX0FUVFJfS0VZSUQ6CisJCQljYXNlIFNUT1JFX0FUVFJfSVNTVUVSS0VZSUQ6CisJCQljYXNlIFNUT1JFX0FUVFJfU1VCSkVDVEtFWUlEOgorCQkJY2FzZSBTVE9SRV9BVFRSX0lTU1VFUlNFUklBTEhBU0g6CisJCQljYXNlIFNUT1JFX0FUVFJfQ0VSVEhBU0g6CisJCQkJaWYgKCFhdHRycykgYXR0cnMgPSBTVE9SRV9BVFRSX0lORk9fbmV3KCk7CisJCQkJaWYgKGF0dHJzID09IE5VTEwpCisJCQkJCXsKKwkJCQkJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9QQVJTRV9BVFRSU19ORVhULAorCQkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCVNUT1JFX0FUVFJfSU5GT19zZXRfc2hhMXN0cihhdHRycywKKwkJCQkJY29udGV4dC0+YXR0cmlidXRlcy0+Y29kZSwKKwkJCQkJY29udGV4dC0+YXR0cmlidXRlcy0+dmFsdWUsCisJCQkJCWNvbnRleHQtPmF0dHJpYnV0ZXMtPnZhbHVlX3NpemUpOworCQkJCWJyZWFrOworCQkJY2FzZSBTVE9SRV9BVFRSX0lTU1VFUjoKKwkJCWNhc2UgU1RPUkVfQVRUUl9TVUJKRUNUOgorCQkJCWlmICghYXR0cnMpIGF0dHJzID0gU1RPUkVfQVRUUl9JTkZPX25ldygpOworCQkJCWlmIChhdHRycyA9PSBOVUxMKQorCQkJCQl7CisJCQkJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfUEFSU0VfQVRUUlNfTkVYVCwKKwkJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlTVE9SRV9BVFRSX0lORk9fbW9kaWZ5X2RuKGF0dHJzLAorCQkJCQljb250ZXh0LT5hdHRyaWJ1dGVzLT5jb2RlLAorCQkJCQljb250ZXh0LT5hdHRyaWJ1dGVzLT52YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNUT1JFX0FUVFJfU0VSSUFMOgorCQkJCWlmICghYXR0cnMpIGF0dHJzID0gU1RPUkVfQVRUUl9JTkZPX25ldygpOworCQkJCWlmIChhdHRycyA9PSBOVUxMKQorCQkJCQl7CisJCQkJCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfUEFSU0VfQVRUUlNfTkVYVCwKKwkJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlTVE9SRV9BVFRSX0lORk9fbW9kaWZ5X251bWJlcihhdHRycywKKwkJCQkJY29udGV4dC0+YXR0cmlidXRlcy0+Y29kZSwKKwkJCQkJY29udGV4dC0+YXR0cmlidXRlcy0+dmFsdWUpOworCQkJCWJyZWFrOworCQkJCX0KKwkJCWNvbnRleHQtPmF0dHJpYnV0ZXMrKzsKKwkJCX0KKwkJaWYgKGNvbnRleHQtPmF0dHJpYnV0ZXMtPmNvZGUgPT0gU1RPUkVfQVRUUl9PUikKKwkJCWNvbnRleHQtPmF0dHJpYnV0ZXMrKzsKKwkJcmV0dXJuIGF0dHJzOworCWVycjoKKwkJd2hpbGUoY29udGV4dC0+YXR0cmlidXRlcworCQkJJiYgY29udGV4dC0+YXR0cmlidXRlcy0+Y29kZSAhPSBTVE9SRV9BVFRSX09SCisJCQkmJiBjb250ZXh0LT5hdHRyaWJ1dGVzLT5jb2RlICE9IFNUT1JFX0FUVFJfRU5EKQorCQkJY29udGV4dC0+YXR0cmlidXRlcysrOworCQlpZiAoY29udGV4dC0+YXR0cmlidXRlcy0+Y29kZSA9PSBTVE9SRV9BVFRSX09SKQorCQkJY29udGV4dC0+YXR0cmlidXRlcysrOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCVNUT1JFZXJyKFNUT1JFX0ZfU1RPUkVfUEFSU0VfQVRUUlNfTkVYVCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwlyZXR1cm4gTlVMTDsKKwl9CitpbnQgU1RPUkVfcGFyc2VfYXR0cnNfZW5kKHZvaWQgKmhhbmRsZSkKKwl7CisJc3RydWN0IGF0dHJfbGlzdF9jdHhfc3QgKmNvbnRleHQgPSAoc3RydWN0IGF0dHJfbGlzdF9jdHhfc3QgKiloYW5kbGU7CisKKwlpZiAoY29udGV4dCAmJiBjb250ZXh0LT5hdHRyaWJ1dGVzKQorCQl7CisjaWYgMAorCQlPUEVOU1NMX0lURU0gKmF0dHJpYnV0ZXMgPSBjb250ZXh0LT5hdHRyaWJ1dGVzOworI2VuZGlmCisJCU9QRU5TU0xfZnJlZShjb250ZXh0KTsKKwkJcmV0dXJuIDE7CisJCX0KKwlTVE9SRWVycihTVE9SRV9GX1NUT1JFX1BBUlNFX0FUVFJTX0VORCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBTVE9SRV9wYXJzZV9hdHRyc19lbmRwKHZvaWQgKmhhbmRsZSkKKwl7CisJc3RydWN0IGF0dHJfbGlzdF9jdHhfc3QgKmNvbnRleHQgPSAoc3RydWN0IGF0dHJfbGlzdF9jdHhfc3QgKiloYW5kbGU7CisKKwlpZiAoY29udGV4dCAmJiBjb250ZXh0LT5hdHRyaWJ1dGVzKQorCQl7CisJCXJldHVybiBjb250ZXh0LT5hdHRyaWJ1dGVzLT5jb2RlID09IFNUT1JFX0FUVFJfRU5EOworCQl9CisJU1RPUkVlcnIoU1RPUkVfRl9TVE9SRV9QQVJTRV9BVFRSU19FTkRQLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCXJldHVybiAwOworCX0KKworc3RhdGljIGludCBhdHRyX2luZm9fY29tcGFyZV9jb21wdXRlX3JhbmdlKAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmFiaXRzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpiYml0cywKKwl1bnNpZ25lZCBpbnQgKmFsb3dwLCB1bnNpZ25lZCBpbnQgKmFoaWdocCwKKwl1bnNpZ25lZCBpbnQgKmJsb3dwLCB1bnNpZ25lZCBpbnQgKmJoaWdocCkKKwl7CisJdW5zaWduZWQgaW50IGFsb3cgPSAodW5zaWduZWQgaW50KS0xLCBhaGlnaCA9IDA7CisJdW5zaWduZWQgaW50IGJsb3cgPSAodW5zaWduZWQgaW50KS0xLCBiaGlnaCA9IDA7CisJaW50IGksIHJlcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgKFNUT1JFX0FUVFJfVFlQRV9OVU0gKyA4KSAvIDg7IGkrKywgYWJpdHMrKywgYmJpdHMrKykKKwkJeworCQlpZiAocmVzID09IDApCisJCQl7CisJCQlpZiAoKmFiaXRzIDwgKmJiaXRzKSByZXMgPSAtMTsKKwkJCWlmICgqYWJpdHMgPiAqYmJpdHMpIHJlcyA9IDE7CisJCQl9CisJCWlmICgqYWJpdHMpCisJCQl7CisJCQlpZiAoYWxvdyA9PSAodW5zaWduZWQgaW50KS0xKQorCQkJCXsKKwkJCQlhbG93ID0gaSAqIDg7CisJCQkJaWYgKCEoKmFiaXRzICYgMHgwMSkpIGFsb3crKzsKKwkJCQlpZiAoISgqYWJpdHMgJiAweDAyKSkgYWxvdysrOworCQkJCWlmICghKCphYml0cyAmIDB4MDQpKSBhbG93Kys7CisJCQkJaWYgKCEoKmFiaXRzICYgMHgwOCkpIGFsb3crKzsKKwkJCQlpZiAoISgqYWJpdHMgJiAweDEwKSkgYWxvdysrOworCQkJCWlmICghKCphYml0cyAmIDB4MjApKSBhbG93Kys7CisJCQkJaWYgKCEoKmFiaXRzICYgMHg0MCkpIGFsb3crKzsKKwkJCQl9CisJCQlhaGlnaCA9IGkgKiA4ICsgNzsKKwkJCWlmICghKCphYml0cyAmIDB4ODApKSBhaGlnaCsrOworCQkJaWYgKCEoKmFiaXRzICYgMHg0MCkpIGFoaWdoKys7CisJCQlpZiAoISgqYWJpdHMgJiAweDIwKSkgYWhpZ2grKzsKKwkJCWlmICghKCphYml0cyAmIDB4MTApKSBhaGlnaCsrOworCQkJaWYgKCEoKmFiaXRzICYgMHgwOCkpIGFoaWdoKys7CisJCQlpZiAoISgqYWJpdHMgJiAweDA0KSkgYWhpZ2grKzsKKwkJCWlmICghKCphYml0cyAmIDB4MDIpKSBhaGlnaCsrOworCQkJfQorCQlpZiAoKmJiaXRzKQorCQkJeworCQkJaWYgKGJsb3cgPT0gKHVuc2lnbmVkIGludCktMSkKKwkJCQl7CisJCQkJYmxvdyA9IGkgKiA4OworCQkJCWlmICghKCpiYml0cyAmIDB4MDEpKSBibG93Kys7CisJCQkJaWYgKCEoKmJiaXRzICYgMHgwMikpIGJsb3crKzsKKwkJCQlpZiAoISgqYmJpdHMgJiAweDA0KSkgYmxvdysrOworCQkJCWlmICghKCpiYml0cyAmIDB4MDgpKSBibG93Kys7CisJCQkJaWYgKCEoKmJiaXRzICYgMHgxMCkpIGJsb3crKzsKKwkJCQlpZiAoISgqYmJpdHMgJiAweDIwKSkgYmxvdysrOworCQkJCWlmICghKCpiYml0cyAmIDB4NDApKSBibG93Kys7CisJCQkJfQorCQkJYmhpZ2ggPSBpICogOCArIDc7CisJCQlpZiAoISgqYmJpdHMgJiAweDgwKSkgYmhpZ2grKzsKKwkJCWlmICghKCpiYml0cyAmIDB4NDApKSBiaGlnaCsrOworCQkJaWYgKCEoKmJiaXRzICYgMHgyMCkpIGJoaWdoKys7CisJCQlpZiAoISgqYmJpdHMgJiAweDEwKSkgYmhpZ2grKzsKKwkJCWlmICghKCpiYml0cyAmIDB4MDgpKSBiaGlnaCsrOworCQkJaWYgKCEoKmJiaXRzICYgMHgwNCkpIGJoaWdoKys7CisJCQlpZiAoISgqYmJpdHMgJiAweDAyKSkgYmhpZ2grKzsKKwkJCX0KKwkJfQorCWlmIChhaGlnaCArIGFsb3cgPCBiaGlnaCArIGJsb3cpIHJlcyA9IC0xOworCWlmIChhaGlnaCArIGFsb3cgPiBiaGlnaCArIGJsb3cpIHJlcyA9IDE7CisJaWYgKGFsb3dwKSAqYWxvd3AgPSBhbG93OworCWlmIChhaGlnaHApICphaGlnaHAgPSBhaGlnaDsKKwlpZiAoYmxvd3ApICpibG93cCA9IGJsb3c7CisJaWYgKGJoaWdocCkgKmJoaWdocCA9IGJoaWdoOworCXJldHVybiByZXM7CisJfQorCitpbnQgU1RPUkVfQVRUUl9JTkZPX2NvbXBhcmUoY29uc3QgU1RPUkVfQVRUUl9JTkZPICogY29uc3QgKmEsCisJCQkgICAgY29uc3QgU1RPUkVfQVRUUl9JTkZPICogY29uc3QgKmIpCisJeworCWlmIChhID09IGIpIHJldHVybiAwOworCWlmICghYSkgcmV0dXJuIC0xOworCWlmICghYikgcmV0dXJuIDE7CisJcmV0dXJuIGF0dHJfaW5mb19jb21wYXJlX2NvbXB1dGVfcmFuZ2UoKCphKS0+c2V0LCAoKmIpLT5zZXQsIDAsIDAsIDAsIDApOworCX0KKworaW50IFNUT1JFX0FUVFJfSU5GT19pbl9yYW5nZShTVE9SRV9BVFRSX0lORk8gKmEsIFNUT1JFX0FUVFJfSU5GTyAqYikKKwl7CisJdW5zaWduZWQgaW50IGFsb3csIGFoaWdoLCBibG93LCBiaGlnaDsKKworCWlmIChhID09IGIpIHJldHVybiAxOworCWlmICghYSkgcmV0dXJuIDA7CisJaWYgKCFiKSByZXR1cm4gMDsKKwlhdHRyX2luZm9fY29tcGFyZV9jb21wdXRlX3JhbmdlKGEtPnNldCwgYi0+c2V0LAorCQkmYWxvdywgJmFoaWdoLCAmYmxvdywgJmJoaWdoKTsKKwlpZiAoYWxvdyA+PSBibG93ICYmIGFoaWdoIDw9IGJoaWdoKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKK2ludCBTVE9SRV9BVFRSX0lORk9faW4oU1RPUkVfQVRUUl9JTkZPICphLCBTVE9SRV9BVFRSX0lORk8gKmIpCisJeworCXVuc2lnbmVkIGNoYXIgKmFiaXRzLCAqYmJpdHM7CisJaW50IGk7CisKKwlpZiAoYSA9PSBiKSByZXR1cm4gMTsKKwlpZiAoIWEpIHJldHVybiAwOworCWlmICghYikgcmV0dXJuIDA7CisJYWJpdHMgPSBhLT5zZXQ7CisJYmJpdHMgPSBiLT5zZXQ7CisJZm9yIChpID0gMDsgaSA8IChTVE9SRV9BVFRSX1RZUEVfTlVNICsgOCkgLyA4OyBpKyssIGFiaXRzKyssIGJiaXRzKyspCisJCXsKKwkJaWYgKCphYml0cyAmJiAoKmJiaXRzICYgKmFiaXRzKSAhPSAqYWJpdHMpCisJCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX0FUVFJfSU5GT19pbl9leChTVE9SRV9BVFRSX0lORk8gKmEsIFNUT1JFX0FUVFJfSU5GTyAqYikKKwl7CisJU1RPUkVfQVRUUl9UWVBFUyBpOworCisJaWYgKGEgPT0gYikgcmV0dXJuIDE7CisJaWYgKCFTVE9SRV9BVFRSX0lORk9faW4oYSwgYikpIHJldHVybiAwOworCWZvciAoaSA9IDE7IGkgPCBTVE9SRV9BVFRSX1RZUEVfTlVNOyBpKyspCisJCWlmIChBVFRSX0lTX1NFVChhLCBpKSkKKwkJCXsKKwkJCXN3aXRjaChpKQorCQkJCXsKKwkJCWNhc2UgU1RPUkVfQVRUUl9GUklFTkRMWU5BTUU6CisJCQljYXNlIFNUT1JFX0FUVFJfRU1BSUw6CisJCQljYXNlIFNUT1JFX0FUVFJfRklMRU5BTUU6CisJCQkJaWYgKHN0cmNtcChhLT52YWx1ZXNbaV0uY3N0cmluZywKKwkJCQkJICAgIGItPnZhbHVlc1tpXS5jc3RyaW5nKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCQljYXNlIFNUT1JFX0FUVFJfS0VZSUQ6CisJCQljYXNlIFNUT1JFX0FUVFJfSVNTVUVSS0VZSUQ6CisJCQljYXNlIFNUT1JFX0FUVFJfU1VCSkVDVEtFWUlEOgorCQkJY2FzZSBTVE9SRV9BVFRSX0lTU1VFUlNFUklBTEhBU0g6CisJCQljYXNlIFNUT1JFX0FUVFJfQ0VSVEhBU0g6CisJCQkJaWYgKG1lbWNtcChhLT52YWx1ZXNbaV0uc2hhMXN0cmluZywKKwkJCQkJICAgIGItPnZhbHVlc1tpXS5zaGExc3RyaW5nLAorCQkJCQkgICAgYS0+dmFsdWVfc2l6ZXNbaV0pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1RPUkVfQVRUUl9JU1NVRVI6CisJCQljYXNlIFNUT1JFX0FUVFJfU1VCSkVDVDoKKwkJCQlpZiAoWDUwOV9OQU1FX2NtcChhLT52YWx1ZXNbaV0uZG4sCisJCQkJCSAgICBiLT52YWx1ZXNbaV0uZG4pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgU1RPUkVfQVRUUl9TRVJJQUw6CisJCQkJaWYgKEJOX2NtcChhLT52YWx1ZXNbaV0ubnVtYmVyLAorCQkJCQkgICAgYi0+dmFsdWVzW2ldLm51bWJlcikpCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbG9jbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOGNiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX2xvY2wuaApAQCAtMCwwICsxLDEyNCBAQAorLyogY3J5cHRvL3N0b3JlL3N0cl9sb2NsLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMy4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9TVE9SRV9MT0NMX0gKKyNkZWZpbmUgSEVBREVSX1NUT1JFX0xPQ0xfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0b3JlLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBzdG9yZV9tZXRob2Rfc3QKKwl7CisJY2hhciAqbmFtZTsKKworCS8qIEFsbCB0aGUgZnVuY3Rpb25zIHJldHVybiBhIHBvc2l0aXZlIGludGVnZXIgb3Igbm9uLU5VTEwgZm9yIHN1Y2Nlc3MKKwkgICBhbmQgMCwgYSBuZWdhdGl2ZSBpbnRlZ2VyIG9yIE5VTEwgZm9yIGZhaWx1cmUgKi8KKworCS8qIEluaXRpYWxpc2UgdGhlIFNUT1JFIHdpdGggcHJpdmF0ZSBkYXRhICovCisJU1RPUkVfSU5JVElBTElTRV9GVU5DX1BUUiBpbml0OworCS8qIEluaXRpYWxpc2UgdGhlIFNUT1JFIHdpdGggcHJpdmF0ZSBkYXRhICovCisJU1RPUkVfQ0xFQU5VUF9GVU5DX1BUUiBjbGVhbjsKKwkvKiBHZW5lcmF0ZSBhbiBvYmplY3Qgb2YgYSBnaXZlbiB0eXBlICovCisJU1RPUkVfR0VORVJBVEVfT0JKRUNUX0ZVTkNfUFRSIGdlbmVyYXRlX29iamVjdDsKKwkvKiBHZXQgYW4gb2JqZWN0IG9mIGEgZ2l2ZW4gdHlwZS4gIFRoaXMgZnVuY3Rpb24gaXNuJ3QgcmVhbGx5IHZlcnkKKwkgICB1c2VmdWwgc2luY2UgdGhlIGxpc3RpbmcgZnVuY3Rpb25zIChiZWxvdykgY2FuIGJlIHVzZWQgZm9yIHRoZQorCSAgIHNhbWUgcHVycG9zZSBhbmQgYXJlIG11Y2ggbW9yZSBnZW5lcmFsLiAqLworCVNUT1JFX0dFVF9PQkpFQ1RfRlVOQ19QVFIgZ2V0X29iamVjdDsKKwkvKiBTdG9yZSBhbiBvYmplY3Qgb2YgYSBnaXZlbiB0eXBlLiAqLworCVNUT1JFX1NUT1JFX09CSkVDVF9GVU5DX1BUUiBzdG9yZV9vYmplY3Q7CisJLyogTW9kaWZ5IHRoZSBhdHRyaWJ1dGVzIGJvdW5kIHRvIGFuIG9iamVjdCBvZiBhIGdpdmVuIHR5cGUuICovCisJU1RPUkVfTU9ESUZZX09CSkVDVF9GVU5DX1BUUiBtb2RpZnlfb2JqZWN0OworCS8qIFJldm9rZSBhbiBvYmplY3Qgb2YgYSBnaXZlbiB0eXBlLiAqLworCVNUT1JFX0hBTkRMRV9PQkpFQ1RfRlVOQ19QVFIgcmV2b2tlX29iamVjdDsKKwkvKiBEZWxldGUgYW4gb2JqZWN0IG9mIGEgZ2l2ZW4gdHlwZS4gKi8KKwlTVE9SRV9IQU5ETEVfT0JKRUNUX0ZVTkNfUFRSIGRlbGV0ZV9vYmplY3Q7CisJLyogTGlzdCBhIGJ1bmNoIG9mIG9iamVjdHMgb2YgYSBnaXZlbiB0eXBlIGFuZCB3aXRoIHRoZSBhc3NvY2lhdGVkCisJICAgYXR0cmlidXRlcy4gKi8KKwlTVE9SRV9TVEFSVF9PQkpFQ1RfRlVOQ19QVFIgbGlzdF9vYmplY3Rfc3RhcnQ7CisJU1RPUkVfTkVYVF9PQkpFQ1RfRlVOQ19QVFIgbGlzdF9vYmplY3RfbmV4dDsKKwlTVE9SRV9FTkRfT0JKRUNUX0ZVTkNfUFRSIGxpc3Rfb2JqZWN0X2VuZDsKKwlTVE9SRV9FTkRfT0JKRUNUX0ZVTkNfUFRSIGxpc3Rfb2JqZWN0X2VuZHA7CisJLyogU3RvcmUtbGV2ZWwgZnVuY3Rpb24gdG8gbWFrZSBhbnkgbmVjZXNzYXJ5IHVwZGF0ZSBvcGVyYXRpb25zLiAqLworCVNUT1JFX0dFTkVSSUNfRlVOQ19QVFIgdXBkYXRlX3N0b3JlOworCS8qIFN0b3JlLWxldmVsIGZ1bmN0aW9uIHRvIGdldCBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBzdG9yZS4gKi8KKwlTVE9SRV9HRU5FUklDX0ZVTkNfUFRSIGxvY2tfc3RvcmU7CisJLyogU3RvcmUtbGV2ZWwgZnVuY3Rpb24gdG8gcmVsZWFzZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBzdG9yZS4gKi8KKwlTVE9SRV9HRU5FUklDX0ZVTkNfUFRSIHVubG9ja19zdG9yZTsKKworCS8qIEdlbmVyaWMgY29udHJvbCBmdW5jdGlvbiAqLworCVNUT1JFX0NUUkxfRlVOQ19QVFIgY3RybDsKKwl9OworCitzdHJ1Y3Qgc3RvcmVfc3QKKwl7CisJY29uc3QgU1RPUkVfTUVUSE9EICptZXRoOworCS8qIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGlmICdtZXRoJyBpcyBFTkdJTkUtcHJvdmlkZWQgKi8KKwlFTkdJTkUgKmVuZ2luZTsKKworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisJaW50IHJlZmVyZW5jZXM7CisJfTsKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbWVtLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzRmN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vc3RvcmUvc3RyX21lbS5jCkBAIC0wLDAgKzEsMzY1IEBACisvKiBjcnlwdG8vc3RvcmUvc3RyX21lbS5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDMuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSAic3RyX2xvY2wuaCIKKworLyogVGhlIG1lbW9yeSBzdG9yZSBpcyBjdXJyZW50bHkgaGlnaGx5IGV4cGVyaW1lbnRhbC4gIEl0J3MgbWVhbnQgdG8gYmVjb21lCisgICBhIGJhc2Ugc3RvcmUgdXNlZCBieSBvdGhlciBzdG9yZXMgZm9yIGludGVybmFsIGNhY2hpbmcgKGZvciBmdWxsIGNhY2hpbmcKKyAgIHN1cHBvcnQsIGFnaW5nIG5lZWRzIHRvIGJlIGFkZGVkKS4KKworICAgVGhlIGRhdGFiYXNlIHVzZSBpcyBtZWFudCB0byBzdXBwb3J0IGFzIG11Y2ggYXR0cmlidXRlIGFzc29jaWF0aW9uIGFzCisgICBwb3NzaWJsZSwgd2hpbGUgcHJvdmlkaW5nIGZvciBhcyBzbWFsbCBzZWFyY2ggcmFuZ2VzIGFzIHBvc3NpYmxlLgorICAgVGhpcyBpcyBjdXJyZW50bHkgcHJvdmlkZWQgZm9yIGJ5IHNvcnRpbmcgdGhlIGVudHJpZXMgYnkgbnVtYmVycyB0aGF0CisgICBhcmUgY29tcG9zZWQgb2YgYml0cyBzZXQgYXQgdGhlIHBvc2l0aW9ucyBpbmRpY2F0ZWQgYnkgYXR0cmlidXRlIHR5cGUKKyAgIGNvZGVzLiAgVGhpcyBwcm92aWRlcyBmb3IgcmFuZ2VzIGRldGVybWluZWQgYnkgdGhlIGhpZ2hlc3QgYXR0cmlidXRlCisgICB0eXBlIGNvZGUgdmFsdWUuICBBIGJldHRlciBpZGVhIG1pZ2h0IGJlIHRvIHNvcnQgYnkgdmFsdWVzIGNvbXB1dGVkCisgICBmcm9tIHRoZSByYW5nZSBvZiBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0IChiYXNpY2FsbHksCisgICB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYXR0cmlidXRlIHR5cGUgY29kZSkKKyAgIGFuZCBpdCdzIGRpc3RhbmNlIGZyb20gYSBiYXNlIChiYXNpY2FsbHksIHRoZSBsb3dlc3QgYXNzb2NpYXRlZAorICAgYXR0cmlidXRlIHR5cGUgY29kZSkuCisqLworCit0eXBlZGVmIHN0cnVjdCBtZW1fb2JqZWN0X2RhdGFfc3QKKwl7CisJU1RPUkVfT0JKRUNUICpvYmplY3Q7CisJU1RPUkVfQVRUUl9JTkZPICphdHRyX2luZm87CisJaW50IHJlZmVyZW5jZXM7CisJfSBNRU1fT0JKRUNUX0RBVEE7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoTUVNX09CSkVDVF9EQVRBKQorc3RydWN0IG1lbV9kYXRhX3N0CisJeworCVNUQUNLX09GKE1FTV9PQkpFQ1RfREFUQSkgKmRhdGE7IC8qIHNvcnRlZCB3aXRoCisJCQkJCSAgKiBTVE9SRV9BVFRSX0lORk9fY29tcGFyZSgpLiAqLworCXVuc2lnbmVkIGludCBjb21wdXRlX2NvbXBvbmVudHMgOiAxOyAvKiBDdXJyZW50bHkgdW51c2VkLCBidXQgY2FuCisJCQkJCQliZSB1c2VkIHRvIGFkZCBhdHRyaWJ1dGVzCisJCQkJCQlmcm9tIHBhcnRzIG9mIHRoZSBkYXRhLiAqLworCX07CisKK0RFQ0xBUkVfU1RBQ0tfT0YoU1RPUkVfQVRUUl9JTkZPKQorc3RydWN0IG1lbV9jdHhfc3QKKwl7CisJaW50IHR5cGU7CQkvKiBUaGUgdHlwZSB3ZSdyZSBzZWFyY2hpbmcgZm9yICovCisJU1RBQ0tfT0YoU1RPUkVfQVRUUl9JTkZPKSAqc2VhcmNoX2F0dHJpYnV0ZXM7IC8qIFNldHMgb2YKKwkJCQkgICAgIGF0dHJpYnV0ZXMgdG8gc2VhcmNoIGZvci4gIEVhY2gKKwkJCQkgICAgIGVsZW1lbnQgaXMgYSBTVE9SRV9BVFRSX0lORk8uICovCisJaW50IHNlYXJjaF9pbmRleDsJLyogd2hpY2ggb2YgdGhlIHNlYXJjaCBhdHRyaWJ1dGVzIHdlCisJCQkJICAgZm91bmQgYSBtYXRjaCBmb3IsIC0xIHdoZW4gd2Ugc3RpbGwKKwkJCQkgICBoYXZlbid0IGZvdW5kIGFueSAqLworCWludCBpbmRleDsJCS8qIC0xIGFzIGxvbmcgYXMgd2UncmUgc2VhcmNoaW5nIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0ICovCisJfTsKKworc3RhdGljIGludCBtZW1faW5pdChTVE9SRSAqcyk7CitzdGF0aWMgdm9pZCBtZW1fY2xlYW4oU1RPUkUgKnMpOworc3RhdGljIFNUT1JFX09CSkVDVCAqbWVtX2dlbmVyYXRlKFNUT1JFICpzLCBTVE9SRV9PQkpFQ1RfVFlQRVMgdHlwZSwKKwlPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3N0YXRpYyBTVE9SRV9PQkpFQ1QgKm1lbV9nZXQoU1RPUkUgKnMsIFNUT1JFX09CSkVDVF9UWVBFUyB0eXBlLAorCU9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworc3RhdGljIGludCBtZW1fc3RvcmUoU1RPUkUgKnMsIFNUT1JFX09CSkVDVF9UWVBFUyB0eXBlLAorCVNUT1JFX09CSkVDVCAqZGF0YSwgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3N0YXRpYyBpbnQgbWVtX21vZGlmeShTVE9SRSAqcywgU1RPUkVfT0JKRUNUX1RZUEVTIHR5cGUsCisJT1BFTlNTTF9JVEVNIHNlYXJjaF9hdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBhZGRfYXR0cmlidXRlc1tdLAorCU9QRU5TU0xfSVRFTSBtb2RpZnlfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gZGVsZXRlX2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3N0YXRpYyBpbnQgbWVtX2RlbGV0ZShTVE9SRSAqcywgU1RPUkVfT0JKRUNUX1RZUEVTIHR5cGUsCisJT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSk7CitzdGF0aWMgdm9pZCAqbWVtX2xpc3Rfc3RhcnQoU1RPUkUgKnMsIFNUT1JFX09CSkVDVF9UWVBFUyB0eXBlLAorCU9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pOworc3RhdGljIFNUT1JFX09CSkVDVCAqbWVtX2xpc3RfbmV4dChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKTsKK3N0YXRpYyBpbnQgbWVtX2xpc3RfZW5kKFNUT1JFICpzLCB2b2lkICpoYW5kbGUpOworc3RhdGljIGludCBtZW1fbGlzdF9lbmRwKFNUT1JFICpzLCB2b2lkICpoYW5kbGUpOworc3RhdGljIGludCBtZW1fbG9jayhTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3N0YXRpYyBpbnQgbWVtX3VubG9jayhTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKTsKK3N0YXRpYyBpbnQgbWVtX2N0cmwoU1RPUkUgKnMsIGludCBjbWQsIGxvbmcgbCwgdm9pZCAqcCwgdm9pZCAoKmYpKHZvaWQpKTsKKworc3RhdGljIFNUT1JFX01FVEhPRCBzdG9yZV9tZW1vcnkgPQorCXsKKwkiT3BlblNTTCBtZW1vcnkgc3RvcmUgaW50ZXJmYWNlIiwKKwltZW1faW5pdCwKKwltZW1fY2xlYW4sCisJbWVtX2dlbmVyYXRlLAorCW1lbV9nZXQsCisJbWVtX3N0b3JlLAorCW1lbV9tb2RpZnksCisJTlVMTCwgLyogcmV2b2tlICovCisJbWVtX2RlbGV0ZSwKKwltZW1fbGlzdF9zdGFydCwKKwltZW1fbGlzdF9uZXh0LAorCW1lbV9saXN0X2VuZCwKKwltZW1fbGlzdF9lbmRwLAorCU5VTEwsIC8qIHVwZGF0ZSAqLworCW1lbV9sb2NrLAorCW1lbV91bmxvY2ssCisJbWVtX2N0cmwKKwl9OworCitjb25zdCBTVE9SRV9NRVRIT0QgKlNUT1JFX01lbW9yeSh2b2lkKQorCXsKKwlyZXR1cm4gJnN0b3JlX21lbW9yeTsKKwl9CisKK3N0YXRpYyBpbnQgbWVtX2luaXQoU1RPUkUgKnMpCisJeworCXJldHVybiAxOworCX0KKworc3RhdGljIHZvaWQgbWVtX2NsZWFuKFNUT1JFICpzKQorCXsKKwlyZXR1cm47CisJfQorCitzdGF0aWMgU1RPUkVfT0JKRUNUICptZW1fZ2VuZXJhdGUoU1RPUkUgKnMsIFNUT1JFX09CSkVDVF9UWVBFUyB0eXBlLAorCU9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sIE9QRU5TU0xfSVRFTSBwYXJhbWV0ZXJzW10pCisJeworCVNUT1JFZXJyKFNUT1JFX0ZfTUVNX0dFTkVSQVRFLCBTVE9SRV9SX05PVF9JTVBMRU1FTlRFRCk7CisJcmV0dXJuIDA7CisJfQorc3RhdGljIFNUT1JFX09CSkVDVCAqbWVtX2dldChTVE9SRSAqcywgU1RPUkVfT0JKRUNUX1RZUEVTIHR5cGUsCisJT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJdm9pZCAqY29udGV4dCA9IG1lbV9saXN0X3N0YXJ0KHMsIHR5cGUsIGF0dHJpYnV0ZXMsIHBhcmFtZXRlcnMpOworCQorCWlmIChjb250ZXh0KQorCQl7CisJCVNUT1JFX09CSkVDVCAqb2JqZWN0ID0gbWVtX2xpc3RfbmV4dChzLCBjb250ZXh0KTsKKworCQlpZiAobWVtX2xpc3RfZW5kKHMsIGNvbnRleHQpKQorCQkJcmV0dXJuIG9iamVjdDsKKwkJfQorCXJldHVybiBOVUxMOworCX0KK3N0YXRpYyBpbnQgbWVtX3N0b3JlKFNUT1JFICpzLCBTVE9SRV9PQkpFQ1RfVFlQRVMgdHlwZSwKKwlTVE9SRV9PQkpFQ1QgKmRhdGEsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVlcnIoU1RPUkVfRl9NRU1fU1RPUkUsIFNUT1JFX1JfTk9UX0lNUExFTUVOVEVEKTsKKwlyZXR1cm4gMDsKKwl9CitzdGF0aWMgaW50IG1lbV9tb2RpZnkoU1RPUkUgKnMsIFNUT1JFX09CSkVDVF9UWVBFUyB0eXBlLAorCU9QRU5TU0xfSVRFTSBzZWFyY2hfYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gYWRkX2F0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gbW9kaWZ5X2F0dHJpYnV0ZXNbXSwgT1BFTlNTTF9JVEVNIGRlbGV0ZV9hdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJU1RPUkVlcnIoU1RPUkVfRl9NRU1fTU9ESUZZLCBTVE9SRV9SX05PVF9JTVBMRU1FTlRFRCk7CisJcmV0dXJuIDA7CisJfQorc3RhdGljIGludCBtZW1fZGVsZXRlKFNUT1JFICpzLCBTVE9SRV9PQkpFQ1RfVFlQRVMgdHlwZSwKKwlPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlTVE9SRWVycihTVE9SRV9GX01FTV9ERUxFVEUsIFNUT1JFX1JfTk9UX0lNUExFTUVOVEVEKTsKKwlyZXR1cm4gMDsKKwl9CisKKy8qIFRoZSBsaXN0IGZ1bmN0aW9ucyBtYXkgYmUgdGhlIGhhcmRlc3QgdG8gdW5kZXJzdGFuZC4gIEJhc2ljYWxseSwKKyAgIG1lbV9saXN0X3N0YXJ0IGNvbXBpbGVzIGEgc3RhY2sgb2YgYXR0cmlidXRlIGluZm8gZWxlbWVudHMsIGFuZAorICAgcHV0cyB0aGF0IHN0YWNrIGludG8gdGhlIGNvbnRleHQgdG8gYmUgcmV0dXJuZWQuICBtZW1fbGlzdF9uZXh0CisgICB3aWxsIHRoZW4gZmluZCB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgc3RvcmUsIGFuZCB0aGVuCisgICB3YWxrIGFsbCB0aGUgd2F5IHRvIHRoZSBlbmQgb2YgdGhlIHN0b3JlIChzaW5jZSBhbnkgY29tYmluYXRpb24KKyAgIG9mIGF0dHJpYnV0ZSBiaXRzIGFib3ZlIHRoZSBzdGFydGluZyBwb2ludCBtYXkgbWF0Y2ggdGhlIHNlYXJjaGVkCisgICBmb3IgYml0IHBhdHRlcm4uLi4pLiAqLworc3RhdGljIHZvaWQgKm1lbV9saXN0X3N0YXJ0KFNUT1JFICpzLCBTVE9SRV9PQkpFQ1RfVFlQRVMgdHlwZSwKKwlPUEVOU1NMX0lURU0gYXR0cmlidXRlc1tdLCBPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlzdHJ1Y3QgbWVtX2N0eF9zdCAqY29udGV4dCA9CisJCShzdHJ1Y3QgbWVtX2N0eF9zdCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWVtX2N0eF9zdCkpOworCXZvaWQgKmF0dHJpYnV0ZV9jb250ZXh0ID0gTlVMTDsKKwlTVE9SRV9BVFRSX0lORk8gKmF0dHJzID0gTlVMTDsKKworCWlmICghY29udGV4dCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX01FTV9MSVNUX1NUQVJULCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJbWVtc2V0KGNvbnRleHQsIDAsIHNpemVvZihzdHJ1Y3QgbWVtX2N0eF9zdCkpOworCisJYXR0cmlidXRlX2NvbnRleHQgPSBTVE9SRV9wYXJzZV9hdHRyc19zdGFydChhdHRyaWJ1dGVzKTsKKwlpZiAoIWF0dHJpYnV0ZV9jb250ZXh0KQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfTUVNX0xJU1RfU1RBUlQsIEVSUl9SX1NUT1JFX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisKKwl3aGlsZSgoYXR0cnMgPSBTVE9SRV9wYXJzZV9hdHRyc19uZXh0KGF0dHJpYnV0ZV9jb250ZXh0KSkpCisJCXsKKwkJaWYgKGNvbnRleHQtPnNlYXJjaF9hdHRyaWJ1dGVzID09IE5VTEwpCisJCQl7CisJCQljb250ZXh0LT5zZWFyY2hfYXR0cmlidXRlcyA9CisJCQkJc2tfU1RPUkVfQVRUUl9JTkZPX25ldyhTVE9SRV9BVFRSX0lORk9fY29tcGFyZSk7CisJCQlpZiAoIWNvbnRleHQtPnNlYXJjaF9hdHRyaWJ1dGVzKQorCQkJCXsKKwkJCQlTVE9SRWVycihTVE9SRV9GX01FTV9MSVNUX1NUQVJULAorCQkJCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQlza19TVE9SRV9BVFRSX0lORk9fcHVzaChjb250ZXh0LT5zZWFyY2hfYXR0cmlidXRlcyxhdHRycyk7CisJCX0KKwlpZiAoIVNUT1JFX3BhcnNlX2F0dHJzX2VuZHAoYXR0cmlidXRlX2NvbnRleHQpKQorCQlnb3RvIGVycjsKKwlTVE9SRV9wYXJzZV9hdHRyc19lbmQoYXR0cmlidXRlX2NvbnRleHQpOworCWNvbnRleHQtPnNlYXJjaF9pbmRleCA9IC0xOworCWNvbnRleHQtPmluZGV4ID0gLTE7CisJcmV0dXJuIGNvbnRleHQ7CisgZXJyOgorCWlmIChhdHRyaWJ1dGVfY29udGV4dCkgU1RPUkVfcGFyc2VfYXR0cnNfZW5kKGF0dHJpYnV0ZV9jb250ZXh0KTsKKwltZW1fbGlzdF9lbmQocywgY29udGV4dCk7CisJcmV0dXJuIE5VTEw7CisJfQorc3RhdGljIFNUT1JFX09CSkVDVCAqbWVtX2xpc3RfbmV4dChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKQorCXsKKwlpbnQgaTsKKwlzdHJ1Y3QgbWVtX2N0eF9zdCAqY29udGV4dCA9IChzdHJ1Y3QgbWVtX2N0eF9zdCAqKWhhbmRsZTsKKwlzdHJ1Y3QgbWVtX29iamVjdF9kYXRhX3N0IGtleSA9IHsgMCwgMCwgMSB9OworCXN0cnVjdCBtZW1fZGF0YV9zdCAqc3RvcmUgPQorCQkoc3RydWN0IG1lbV9kYXRhX3N0ICopU1RPUkVfZ2V0X2V4X2RhdGEocywgMSk7CisJaW50IHNyY2g7CisJaW50IGNyZXMgPSAwOworCisJaWYgKCFjb250ZXh0KQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfTUVNX0xJU1RfTkVYVCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZiAoIXN0b3JlKQorCQl7CisJCVNUT1JFZXJyKFNUT1JFX0ZfTUVNX0xJU1RfTkVYVCwgU1RPUkVfUl9OT19TVE9SRSk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAoY29udGV4dC0+c2VhcmNoX2luZGV4ID09IC0xKQorCQl7CisJCWZvciAoaSA9IDA7CisJCSAgICAgaSA8IHNrX1NUT1JFX0FUVFJfSU5GT19udW0oY29udGV4dC0+c2VhcmNoX2F0dHJpYnV0ZXMpOworCQkgICAgIGkrKykKKwkJCXsKKwkJCWtleS5hdHRyX2luZm8KKwkJCSAgPSBza19TVE9SRV9BVFRSX0lORk9fdmFsdWUoY29udGV4dC0+c2VhcmNoX2F0dHJpYnV0ZXMsCisJCQkJCQkgICAgIGkpOworCQkJc3JjaCA9IHNrX01FTV9PQkpFQ1RfREFUQV9maW5kX2V4KHN0b3JlLT5kYXRhLCAma2V5KTsKKworCQkJaWYgKHNyY2ggPj0gMCkKKwkJCQl7CisJCQkJY29udGV4dC0+c2VhcmNoX2luZGV4ID0gc3JjaDsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwlpZiAoY29udGV4dC0+c2VhcmNoX2luZGV4IDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJCisJa2V5LmF0dHJfaW5mbyA9CisJCXNrX1NUT1JFX0FUVFJfSU5GT192YWx1ZShjb250ZXh0LT5zZWFyY2hfYXR0cmlidXRlcywKKwkJCQkJIGNvbnRleHQtPnNlYXJjaF9pbmRleCk7CisJZm9yKHNyY2ggPSBjb250ZXh0LT5zZWFyY2hfaW5kZXg7CisJICAgIHNyY2ggPCBza19NRU1fT0JKRUNUX0RBVEFfbnVtKHN0b3JlLT5kYXRhKQorCQkgICAgJiYgU1RPUkVfQVRUUl9JTkZPX2luX3JhbmdlKGtleS5hdHRyX2luZm8sCisJCQkgICAgc2tfTUVNX09CSkVDVF9EQVRBX3ZhbHVlKHN0b3JlLT5kYXRhLCBzcmNoKS0+YXR0cl9pbmZvKQorCQkgICAgJiYgIShjcmVzID0gU1RPUkVfQVRUUl9JTkZPX2luX2V4KGtleS5hdHRyX2luZm8sCisJCQkJIHNrX01FTV9PQkpFQ1RfREFUQV92YWx1ZShzdG9yZS0+ZGF0YSwgc3JjaCktPmF0dHJfaW5mbykpOworCSAgICBzcmNoKyspCisJCTsKKworCWNvbnRleHQtPnNlYXJjaF9pbmRleCA9IHNyY2g7CisJaWYgKGNyZXMpCisJCXJldHVybiAoc2tfTUVNX09CSkVDVF9EQVRBX3ZhbHVlKHN0b3JlLT5kYXRhLCBzcmNoKSktPm9iamVjdDsKKwlyZXR1cm4gTlVMTDsKKwl9CitzdGF0aWMgaW50IG1lbV9saXN0X2VuZChTVE9SRSAqcywgdm9pZCAqaGFuZGxlKQorCXsKKwlzdHJ1Y3QgbWVtX2N0eF9zdCAqY29udGV4dCA9IChzdHJ1Y3QgbWVtX2N0eF9zdCAqKWhhbmRsZTsKKworCWlmICghY29udGV4dCkKKwkJeworCQlTVE9SRWVycihTVE9SRV9GX01FTV9MSVNUX0VORCwgRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlpZiAoY29udGV4dCAmJiBjb250ZXh0LT5zZWFyY2hfYXR0cmlidXRlcykKKwkJc2tfU1RPUkVfQVRUUl9JTkZPX2ZyZWUoY29udGV4dC0+c2VhcmNoX2F0dHJpYnV0ZXMpOworCWlmIChjb250ZXh0KSBPUEVOU1NMX2ZyZWUoY29udGV4dCk7CisJcmV0dXJuIDE7CisJfQorc3RhdGljIGludCBtZW1fbGlzdF9lbmRwKFNUT1JFICpzLCB2b2lkICpoYW5kbGUpCisJeworCXN0cnVjdCBtZW1fY3R4X3N0ICpjb250ZXh0ID0gKHN0cnVjdCBtZW1fY3R4X3N0ICopaGFuZGxlOworCisJaWYgKCFjb250ZXh0CisJICAgIHx8IGNvbnRleHQtPnNlYXJjaF9pbmRleAorCSAgICAgICA9PSBza19TVE9SRV9BVFRSX0lORk9fbnVtKGNvbnRleHQtPnNlYXJjaF9hdHRyaWJ1dGVzKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQorc3RhdGljIGludCBtZW1fbG9jayhTVE9SRSAqcywgT1BFTlNTTF9JVEVNIGF0dHJpYnV0ZXNbXSwKKwlPUEVOU1NMX0lURU0gcGFyYW1ldGVyc1tdKQorCXsKKwlyZXR1cm4gMTsKKwl9CitzdGF0aWMgaW50IG1lbV91bmxvY2soU1RPUkUgKnMsIE9QRU5TU0xfSVRFTSBhdHRyaWJ1dGVzW10sCisJT1BFTlNTTF9JVEVNIHBhcmFtZXRlcnNbXSkKKwl7CisJcmV0dXJuIDE7CisJfQorc3RhdGljIGludCBtZW1fY3RybChTVE9SRSAqcywgaW50IGNtZCwgbG9uZyBsLCB2b2lkICpwLCB2b2lkICgqZikodm9pZCkpCisJeworCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbWV0aC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3N0b3JlL3N0cl9tZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2ZGUwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by9zdG9yZS9zdHJfbWV0aC5jCkBAIC0wLDAgKzEsMjUwIEBACisvKiBjcnlwdG8vc3RvcmUvc3RyX21ldGguYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAzLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgInN0cl9sb2NsLmgiCisKK1NUT1JFX01FVEhPRCAqU1RPUkVfY3JlYXRlX21ldGhvZChjaGFyICpuYW1lKQorCXsKKwlTVE9SRV9NRVRIT0QgKnN0b3JlX21ldGhvZCA9IChTVE9SRV9NRVRIT0QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoU1RPUkVfTUVUSE9EKSk7CisKKwlpZiAoc3RvcmVfbWV0aG9kKQorCQl7CisJCW1lbXNldChzdG9yZV9tZXRob2QsIDAsIHNpemVvZigqc3RvcmVfbWV0aG9kKSk7CisJCXN0b3JlX21ldGhvZC0+bmFtZSA9IEJVRl9zdHJkdXAobmFtZSk7CisJCX0KKwlyZXR1cm4gc3RvcmVfbWV0aG9kOworCX0KKworLyogQklHIEZTQ0tJTkcgV0FSTklORyEhISEgIElmIHlvdSB1c2UgdGhpcyBvbiBhIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG1ldGhvZAorICAgKHRoYXQgaXMsIGl0IGhhc24ndCBiZWVuIGFsbG9jYXRlZCB1c2luZyBTVE9SRV9jcmVhdGVfbWV0aG9kKCksIHlvdSBkZXNlcnZlCisgICBhbnl0aGluZyBNdXJwaHkgY2FuIHRocm93IGF0IHlvdSBhbmQgbW9yZSEgIFlvdSBoYXZlIGJlZW4gd2FybmVkLiAqLwordm9pZCBTVE9SRV9kZXN0cm95X21ldGhvZChTVE9SRV9NRVRIT0QgKnN0b3JlX21ldGhvZCkKKwl7CisJaWYgKCFzdG9yZV9tZXRob2QpIHJldHVybjsKKwlPUEVOU1NMX2ZyZWUoc3RvcmVfbWV0aG9kLT5uYW1lKTsKKwlzdG9yZV9tZXRob2QtPm5hbWUgPSBOVUxMOworCU9QRU5TU0xfZnJlZShzdG9yZV9tZXRob2QpOworCX0KKworaW50IFNUT1JFX21ldGhvZF9zZXRfaW5pdGlhbGlzZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9JTklUSUFMSVNFX0ZVTkNfUFRSIGluaXRfZikKKwl7CisJc20tPmluaXQgPSBpbml0X2Y7CisJcmV0dXJuIDE7CisJfQorCitpbnQgU1RPUkVfbWV0aG9kX3NldF9jbGVhbnVwX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20sIFNUT1JFX0NMRUFOVVBfRlVOQ19QVFIgY2xlYW5fZikKKwl7CisJc20tPmNsZWFuID0gY2xlYW5fZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9tZXRob2Rfc2V0X2dlbmVyYXRlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20sIFNUT1JFX0dFTkVSQVRFX09CSkVDVF9GVU5DX1BUUiBnZW5lcmF0ZV9mKQorCXsKKwlzbS0+Z2VuZXJhdGVfb2JqZWN0ID0gZ2VuZXJhdGVfZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9tZXRob2Rfc2V0X2dldF9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9HRVRfT0JKRUNUX0ZVTkNfUFRSIGdldF9mKQorCXsKKwlzbS0+Z2V0X29iamVjdCA9IGdldF9mOworCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX21ldGhvZF9zZXRfc3RvcmVfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfU1RPUkVfT0JKRUNUX0ZVTkNfUFRSIHN0b3JlX2YpCisJeworCXNtLT5zdG9yZV9vYmplY3QgPSBzdG9yZV9mOworCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX21ldGhvZF9zZXRfbW9kaWZ5X2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20sIFNUT1JFX01PRElGWV9PQkpFQ1RfRlVOQ19QVFIgbW9kaWZ5X2YpCisJeworCXNtLT5tb2RpZnlfb2JqZWN0ID0gbW9kaWZ5X2Y7CisJcmV0dXJuIDE7CisJfQorCitpbnQgU1RPUkVfbWV0aG9kX3NldF9yZXZva2VfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfSEFORExFX09CSkVDVF9GVU5DX1BUUiByZXZva2VfZikKKwl7CisJc20tPnJldm9rZV9vYmplY3QgPSByZXZva2VfZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9tZXRob2Rfc2V0X2RlbGV0ZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9IQU5ETEVfT0JKRUNUX0ZVTkNfUFRSIGRlbGV0ZV9mKQorCXsKKwlzbS0+ZGVsZXRlX29iamVjdCA9IGRlbGV0ZV9mOworCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX21ldGhvZF9zZXRfbGlzdF9zdGFydF9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9TVEFSVF9PQkpFQ1RfRlVOQ19QVFIgbGlzdF9zdGFydF9mKQorCXsKKwlzbS0+bGlzdF9vYmplY3Rfc3RhcnQgPSBsaXN0X3N0YXJ0X2Y7CisJcmV0dXJuIDE7CisJfQorCitpbnQgU1RPUkVfbWV0aG9kX3NldF9saXN0X25leHRfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfTkVYVF9PQkpFQ1RfRlVOQ19QVFIgbGlzdF9uZXh0X2YpCisJeworCXNtLT5saXN0X29iamVjdF9uZXh0ID0gbGlzdF9uZXh0X2Y7CisJcmV0dXJuIDE7CisJfQorCitpbnQgU1RPUkVfbWV0aG9kX3NldF9saXN0X2VuZF9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtLCBTVE9SRV9FTkRfT0JKRUNUX0ZVTkNfUFRSIGxpc3RfZW5kX2YpCisJeworCXNtLT5saXN0X29iamVjdF9lbmQgPSBsaXN0X2VuZF9mOworCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX21ldGhvZF9zZXRfdXBkYXRlX3N0b3JlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20sIFNUT1JFX0dFTkVSSUNfRlVOQ19QVFIgdXBkYXRlX2YpCisJeworCXNtLT51cGRhdGVfc3RvcmUgPSB1cGRhdGVfZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9tZXRob2Rfc2V0X2xvY2tfc3RvcmVfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfR0VORVJJQ19GVU5DX1BUUiBsb2NrX2YpCisJeworCXNtLT5sb2NrX3N0b3JlID0gbG9ja19mOworCXJldHVybiAxOworCX0KKworaW50IFNUT1JFX21ldGhvZF9zZXRfdW5sb2NrX3N0b3JlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20sIFNUT1JFX0dFTkVSSUNfRlVOQ19QVFIgdW5sb2NrX2YpCisJeworCXNtLT51bmxvY2tfc3RvcmUgPSB1bmxvY2tfZjsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTVE9SRV9tZXRob2Rfc2V0X2N0cmxfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSwgU1RPUkVfQ1RSTF9GVU5DX1BUUiBjdHJsX2YpCisJeworCXNtLT5jdHJsID0gY3RybF9mOworCXJldHVybiAxOworCX0KKworU1RPUkVfSU5JVElBTElTRV9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2luaXRpYWxpc2VfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSkKKwl7CisJcmV0dXJuIHNtLT5pbml0OworCX0KKworU1RPUkVfQ0xFQU5VUF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2NsZWFudXBfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSkKKwl7CisJcmV0dXJuIHNtLT5jbGVhbjsKKwl9CisKK1NUT1JFX0dFTkVSQVRFX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2dlbmVyYXRlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pCisJeworCXJldHVybiBzbS0+Z2VuZXJhdGVfb2JqZWN0OworCX0KKworU1RPUkVfR0VUX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2dldF9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKQorCXsKKwlyZXR1cm4gc20tPmdldF9vYmplY3Q7CisJfQorCitTVE9SRV9TVE9SRV9PQkpFQ1RfRlVOQ19QVFIgU1RPUkVfbWV0aG9kX2dldF9zdG9yZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKQorCXsKKwlyZXR1cm4gc20tPnN0b3JlX29iamVjdDsKKwl9CisKK1NUT1JFX01PRElGWV9PQkpFQ1RfRlVOQ19QVFIgU1RPUkVfbWV0aG9kX2dldF9tb2RpZnlfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSkKKwl7CisJcmV0dXJuIHNtLT5tb2RpZnlfb2JqZWN0OworCX0KKworU1RPUkVfSEFORExFX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X3Jldm9rZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKQorCXsKKwlyZXR1cm4gc20tPnJldm9rZV9vYmplY3Q7CisJfQorCitTVE9SRV9IQU5ETEVfT0JKRUNUX0ZVTkNfUFRSIFNUT1JFX21ldGhvZF9nZXRfZGVsZXRlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pCisJeworCXJldHVybiBzbS0+ZGVsZXRlX29iamVjdDsKKwl9CisKK1NUT1JFX1NUQVJUX09CSkVDVF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2xpc3Rfc3RhcnRfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSkKKwl7CisJcmV0dXJuIHNtLT5saXN0X29iamVjdF9zdGFydDsKKwl9CisKK1NUT1JFX05FWFRfT0JKRUNUX0ZVTkNfUFRSIFNUT1JFX21ldGhvZF9nZXRfbGlzdF9uZXh0X2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pCisJeworCXJldHVybiBzbS0+bGlzdF9vYmplY3RfbmV4dDsKKwl9CisKK1NUT1JFX0VORF9PQkpFQ1RfRlVOQ19QVFIgU1RPUkVfbWV0aG9kX2dldF9saXN0X2VuZF9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKQorCXsKKwlyZXR1cm4gc20tPmxpc3Rfb2JqZWN0X2VuZDsKKwl9CisKK1NUT1JFX0dFTkVSSUNfRlVOQ19QVFIgU1RPUkVfbWV0aG9kX2dldF91cGRhdGVfc3RvcmVfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSkKKwl7CisJcmV0dXJuIHNtLT51cGRhdGVfc3RvcmU7CisJfQorCitTVE9SRV9HRU5FUklDX0ZVTkNfUFRSIFNUT1JFX21ldGhvZF9nZXRfbG9ja19zdG9yZV9mdW5jdGlvbihTVE9SRV9NRVRIT0QgKnNtKQorCXsKKwlyZXR1cm4gc20tPmxvY2tfc3RvcmU7CisJfQorCitTVE9SRV9HRU5FUklDX0ZVTkNfUFRSIFNUT1JFX21ldGhvZF9nZXRfdW5sb2NrX3N0b3JlX2Z1bmN0aW9uKFNUT1JFX01FVEhPRCAqc20pCisJeworCXJldHVybiBzbS0+dW5sb2NrX3N0b3JlOworCX0KKworU1RPUkVfQ1RSTF9GVU5DX1BUUiBTVE9SRV9tZXRob2RfZ2V0X2N0cmxfZnVuY3Rpb24oU1RPUkVfTUVUSE9EICpzbSkKKwl7CisJcmV0dXJuIHNtLT5jdHJsOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3N5bWhhY2tzLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vc3ltaGFja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQ0YTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3N5bWhhY2tzLmgKQEAgLTAsMCArMSw0NDkgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfU1lNSEFDS1NfSAorI2RlZmluZSBIRUFERVJfU1lNSEFDS1NfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisvKiBIYWNrcyB0byBzb2x2ZSB0aGUgcHJvYmxlbSB3aXRoIGxpbmtlcnMgaW5jYXBhYmxlIG9mIGhhbmRsaW5nIHZlcnkgbG9uZworICAgc3ltYm9sIG5hbWVzLiAgSW4gdGhlIGNhc2Ugb2YgVk1TLCB0aGUgbGltaXQgaXMgMzEgY2hhcmFjdGVycyBvbiBWTVMgZm9yCisgICBWQVguICovCisvKiBOb3RlIHRoYXQgdGhpcyBhZmZlY3RzIHV0aWwvbGliZWF5Lm51bSBhbmQgdXRpbC9zc2xlYXkubnVtLi4uICB5b3UgbWF5CisgICBjaGFuZ2UgdGhvc2UgbWFudWFsbHksIGJ1dCB0aGF0J3Mgbm90IHJlY29tbWVuZGVkLCBhcyB0aG9zZSBmaWxlcyBhcmUKKyAgIGNvbnRyb2xsZWQgY2VudHJhbGx5IGFuZCB1cGRhdGVkIG9uIFVuaXgsIGFuZCB0aGUgY2VudHJhbCBkZWZpbml0aW9uCisgICBtYXkgZGlzYWdyZWUgd2l0aCB5b3Vycywgd2hpY2ggaW4gdHVybiBtYXkgY29tZSB3aXRoIHNoYXJlYWJsZSBsaWJyYXJ5CisgICBpbmNvbXBhdGliaWxpdGllcy4gKi8KKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKworLyogSGFjayBhIGxvbmcgbmFtZSBpbiBjcnlwdG8vZXhfZGF0YS5jICovCisjdW5kZWYgQ1JZUFRPX2dldF9leF9kYXRhX2ltcGxlbWVudGF0aW9uCisjZGVmaW5lIENSWVBUT19nZXRfZXhfZGF0YV9pbXBsZW1lbnRhdGlvbglDUllQVE9fZ2V0X2V4X2RhdGFfaW1wbAorI3VuZGVmIENSWVBUT19zZXRfZXhfZGF0YV9pbXBsZW1lbnRhdGlvbgorI2RlZmluZSBDUllQVE9fc2V0X2V4X2RhdGFfaW1wbGVtZW50YXRpb24JQ1JZUFRPX3NldF9leF9kYXRhX2ltcGwKKworLyogSGFjayBhIGxvbmcgbmFtZSBpbiBjcnlwdG8vYXNuMS9hX21ic3RyLmMgKi8KKyN1bmRlZiBBU04xX1NUUklOR19zZXRfZGVmYXVsdF9tYXNrX2FzYworI2RlZmluZSBBU04xX1NUUklOR19zZXRfZGVmYXVsdF9tYXNrX2FzYwlBU04xX1NUUklOR19zZXRfZGVmX21hc2tfYXNjCisKKyNpZiAwIC8qIE5vIGxvbmdlciBuZWVkZWQsIHNpbmNlIHNhZmVzdGFjayBtYWNybyBtYWdpYyBkb2VzIHRoZSBqb2IgKi8KKy8qIEhhY2sgdGhlIG5hbWVzIGNyZWF0ZWQgd2l0aCBERUNMQVJFX0FTTjFfU0VUX09GKFBLQ1M3X1NJR05FUl9JTkZPKSAqLworI3VuZGVmIGkyZF9BU04xX1NFVF9PRl9QS0NTN19TSUdORVJfSU5GTworI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfUEtDUzdfU0lHTkVSX0lORk8JaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1NJR0lORgorI3VuZGVmIGQyaV9BU04xX1NFVF9PRl9QS0NTN19TSUdORVJfSU5GTworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfUEtDUzdfU0lHTkVSX0lORk8JZDJpX0FTTjFfU0VUX09GX1BLQ1M3X1NJR0lORgorI2VuZGlmCisKKyNpZiAwIC8qIE5vIGxvbmdlciBuZWVkZWQsIHNpbmNlIHNhZmVzdGFjayBtYWNybyBtYWdpYyBkb2VzIHRoZSBqb2IgKi8KKy8qIEhhY2sgdGhlIG5hbWVzIGNyZWF0ZWQgd2l0aCBERUNMQVJFX0FTTjFfU0VUX09GKFBLQ1M3X1JFQ0lQX0lORk8pICovCisjdW5kZWYgaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1JFQ0lQX0lORk8KKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1JFQ0lQX0lORk8JaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1JFQ0lORgorI3VuZGVmIGQyaV9BU04xX1NFVF9PRl9QS0NTN19SRUNJUF9JTkZPCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9QS0NTN19SRUNJUF9JTkZPCWQyaV9BU04xX1NFVF9PRl9QS0NTN19SRUNJTkYKKyNlbmRpZgorCisjaWYgMCAvKiBObyBsb25nZXIgbmVlZGVkLCBzaW5jZSBzYWZlc3RhY2sgbWFjcm8gbWFnaWMgZG9lcyB0aGUgam9iICovCisvKiBIYWNrIHRoZSBuYW1lcyBjcmVhdGVkIHdpdGggREVDTEFSRV9BU04xX1NFVF9PRihBQ0NFU1NfREVTQ1JJUFRJT04pICovCisjdW5kZWYgaTJkX0FTTjFfU0VUX09GX0FDQ0VTU19ERVNDUklQVElPTgorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfQUNDRVNTX0RFU0NSSVBUSU9OCWkyZF9BU04xX1NFVF9PRl9BQ0NfREVTQworI3VuZGVmIGQyaV9BU04xX1NFVF9PRl9BQ0NFU1NfREVTQ1JJUFRJT04KKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX0FDQ0VTU19ERVNDUklQVElPTglkMmlfQVNOMV9TRVRfT0ZfQUNDX0RFU0MKKyNlbmRpZgorCisvKiBIYWNrIHRoZSBuYW1lcyBjcmVhdGVkIHdpdGggREVDTEFSRV9QRU1fcncoTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRSkgKi8KKyN1bmRlZiBQRU1fcmVhZF9ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFCisjZGVmaW5lIFBFTV9yZWFkX05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UJCVBFTV9yZWFkX05TX0NFUlRfU0VRCisjdW5kZWYgUEVNX3dyaXRlX05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UKKyNkZWZpbmUgUEVNX3dyaXRlX05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UJUEVNX3dyaXRlX05TX0NFUlRfU0VRCisjdW5kZWYgUEVNX3JlYWRfYmlvX05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UKKyNkZWZpbmUgUEVNX3JlYWRfYmlvX05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UJUEVNX3JlYWRfYmlvX05TX0NFUlRfU0VRCisjdW5kZWYgUEVNX3dyaXRlX2Jpb19ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFCisjZGVmaW5lIFBFTV93cml0ZV9iaW9fTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRQlQRU1fd3JpdGVfYmlvX05TX0NFUlRfU0VRCisjdW5kZWYgUEVNX3dyaXRlX2NiX2Jpb19ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFCisjZGVmaW5lIFBFTV93cml0ZV9jYl9iaW9fTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRQlQRU1fd3JpdGVfY2JfYmlvX05TX0NFUlRfU0VRCisKKy8qIEhhY2sgdGhlIG5hbWVzIGNyZWF0ZWQgd2l0aCBERUNMQVJFX1BFTV9ydyhQS0NTOF9QUklWX0tFWV9JTkZPKSAqLworI3VuZGVmIFBFTV9yZWFkX1BLQ1M4X1BSSVZfS0VZX0lORk8KKyNkZWZpbmUgUEVNX3JlYWRfUEtDUzhfUFJJVl9LRVlfSU5GTwkJUEVNX3JlYWRfUDhfUFJJVl9LRVlfSU5GTworI3VuZGVmIFBFTV93cml0ZV9QS0NTOF9QUklWX0tFWV9JTkZPCisjZGVmaW5lIFBFTV93cml0ZV9QS0NTOF9QUklWX0tFWV9JTkZPCQlQRU1fd3JpdGVfUDhfUFJJVl9LRVlfSU5GTworI3VuZGVmIFBFTV9yZWFkX2Jpb19QS0NTOF9QUklWX0tFWV9JTkZPCisjZGVmaW5lIFBFTV9yZWFkX2Jpb19QS0NTOF9QUklWX0tFWV9JTkZPCVBFTV9yZWFkX2Jpb19QOF9QUklWX0tFWV9JTkZPCisjdW5kZWYgUEVNX3dyaXRlX2Jpb19QS0NTOF9QUklWX0tFWV9JTkZPCisjZGVmaW5lIFBFTV93cml0ZV9iaW9fUEtDUzhfUFJJVl9LRVlfSU5GTwlQRU1fd3JpdGVfYmlvX1A4X1BSSVZfS0VZX0lORk8KKyN1bmRlZiBQRU1fd3JpdGVfY2JfYmlvX1BLQ1M4X1BSSVZfS0VZX0lORk8KKyNkZWZpbmUgUEVNX3dyaXRlX2NiX2Jpb19QS0NTOF9QUklWX0tFWV9JTkZPCVBFTV93cnRfY2JfYmlvX1A4X1BSSVZfS0VZX0lORk8KKworLyogSGFjayBvdGhlciBQRU0gbmFtZXMgKi8KKyN1bmRlZiBQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdmF0ZUtleV9uaWQKKyNkZWZpbmUgUEVNX3dyaXRlX2Jpb19QS0NTOFByaXZhdGVLZXlfbmlkCVBFTV93cml0ZV9iaW9fUEtDUzhQcml2S2V5X25pZAorCisvKiBIYWNrIHNvbWUgbG9uZyBYNTA5IG5hbWVzICovCisjdW5kZWYgWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfY3JpdGljYWwKKyNkZWZpbmUgWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfY3JpdGljYWwJWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfY3JpdGljCisjdW5kZWYgWDUwOV9wb2xpY3lfdHJlZV9nZXQwX3VzZXJfcG9saWNpZXMKKyNkZWZpbmUgWDUwOV9wb2xpY3lfdHJlZV9nZXQwX3VzZXJfcG9saWNpZXMJWDUwOV9wY3lfdHJlZV9nZXQwX3Vzcl9wb2xpY2llcworI3VuZGVmIFg1MDlfcG9saWN5X25vZGVfZ2V0MF9xdWFsaWZpZXJzCisjZGVmaW5lIFg1MDlfcG9saWN5X25vZGVfZ2V0MF9xdWFsaWZpZXJzCVg1MDlfcGN5X25vZGVfZ2V0MF9xdWFsaWZpZXJzCisjdW5kZWYgWDUwOV9TVE9SRV9DVFhfZ2V0X2V4cGxpY2l0X3BvbGljeQorI2RlZmluZSBYNTA5X1NUT1JFX0NUWF9nZXRfZXhwbGljaXRfcG9saWN5CVg1MDlfU1RPUkVfQ1RYX2dldF9leHBsX3BvbGljeQorI3VuZGVmIFg1MDlfU1RPUkVfQ1RYX2dldDBfY3VycmVudF9pc3N1ZXIKKyNkZWZpbmUgWDUwOV9TVE9SRV9DVFhfZ2V0MF9jdXJyZW50X2lzc3VlcglYNTA5X1NUT1JFX0NUWF9nZXQwX2N1cl9pc3N1ZXIKKworLyogSGFjayBzb21lIGxvbmcgQ1JZUFRPIG5hbWVzICovCisjdW5kZWYgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sKKyNkZWZpbmUgQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sgICAgIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NiCisjdW5kZWYgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjaworI2RlZmluZSBDUllQVE9fc2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrICAgICAgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYgorI3VuZGVmIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrCisjZGVmaW5lIENSWVBUT19zZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrCUNSWVBUT19zZXRfZHlubG9ja19sb2NrX2NiCisjdW5kZWYgQ1JZUFRPX2dldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sKKyNkZWZpbmUgQ1JZUFRPX2dldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sJQ1JZUFRPX2dldF9keW5sb2NrX2xvY2tfY2IKKyN1bmRlZiBDUllQVE9fZ2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjaworI2RlZmluZSBDUllQVE9fZ2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayAgICAgQ1JZUFRPX2dldF9keW5sb2NrX2Rlc3Ryb3lfY2IKKyN1bmRlZiBDUllQVE9fZ2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrCisjZGVmaW5lIENSWVBUT19nZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sgICAgICBDUllQVE9fZ2V0X2R5bmxvY2tfY3JlYXRlX2NiCisjdW5kZWYgQ1JZUFRPX3NldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucworI2RlZmluZSBDUllQVE9fc2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zICAgICAgQ1JZUFRPX3NldF9sb2NrZWRfbWVtX2V4X2Z1bmNzCisjdW5kZWYgQ1JZUFRPX2dldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucworI2RlZmluZSBDUllQVE9fZ2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zICAgICAgQ1JZUFRPX2dldF9sb2NrZWRfbWVtX2V4X2Z1bmNzCisKKy8qIEhhY2sgc29tZSBsb25nIFNTTCBuYW1lcyAqLworI3VuZGVmIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzCisjZGVmaW5lIFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzCVNTTF9DVFhfc2V0X2RlZl92ZXJpZnlfcGF0aHMKKyN1bmRlZiBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4CisjZGVmaW5lIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHggICAgICBTU0xfZ2V0X2V4X2RfWDUwOV9TVE9SRV9DVFhfaWR4CisjdW5kZWYgU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sKKyNkZWZpbmUgU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sgICAgIFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmpzX3RvX3N0aworI3VuZGVmIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sKKyNkZWZpbmUgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjayAgICAgIFNTTF9hZGRfZGlyX2NlcnRfc3VianNfdG9fc3RrCisjdW5kZWYgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZQorI2RlZmluZSBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlICAgICAgU1NMX0NUWF91c2VfY2VydF9jaGFpbl9maWxlCisjdW5kZWYgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2sKKyNkZWZpbmUgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2sJU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2IKKyN1bmRlZiBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YQorI2RlZmluZSBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YSAgU1NMX0NUWF9zZXRfZGVmX3Bhc3N3ZF9jYl91ZAorI3VuZGVmIFNTTF9DT01QX2dldF9jb21wcmVzc2lvbl9tZXRob2RzCisjZGVmaW5lIFNTTF9DT01QX2dldF9jb21wcmVzc2lvbl9tZXRob2RzCVNTTF9DT01QX2dldF9jb21wcmVzc19tZXRob2RzCisKKyN1bmRlZiBzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dAorI2RlZmluZSBzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dAlzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnX2V4dAorI3VuZGVmIHNzbF9hZGRfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0CisjZGVmaW5lIHNzbF9hZGRfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0CXNzbF9hZGRfc2VydmVyaGVsbG9fcmVuZWdfZXh0CisjdW5kZWYgc3NsX3BhcnNlX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dAorI2RlZmluZSBzc2xfcGFyc2VfY2xpZW50aGVsbG9fcmVuZWdvdGlhdGVfZXh0CXNzbF9wYXJzZV9jbGllbnRoZWxsb19yZW5lZ19leHQKKyN1bmRlZiBzc2xfcGFyc2Vfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0CisjZGVmaW5lIHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQJc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3JlbmVnX2V4dAorCisvKiBIYWNrIHNvbWUgbG9uZyBFTkdJTkUgbmFtZXMgKi8KKyN1bmRlZiBFTkdJTkVfZ2V0X2RlZmF1bHRfQk5fbW9kX2V4cF9jcnQKKyNkZWZpbmUgRU5HSU5FX2dldF9kZWZhdWx0X0JOX21vZF9leHBfY3J0CUVOR0lORV9nZXRfZGVmX0JOX21vZF9leHBfY3J0CisjdW5kZWYgRU5HSU5FX3NldF9kZWZhdWx0X0JOX21vZF9leHBfY3J0CisjZGVmaW5lIEVOR0lORV9zZXRfZGVmYXVsdF9CTl9tb2RfZXhwX2NydAlFTkdJTkVfc2V0X2RlZl9CTl9tb2RfZXhwX2NydAorI3VuZGVmIEVOR0lORV9zZXRfbG9hZF9wcml2a2V5X2Z1bmN0aW9uCisjZGVmaW5lIEVOR0lORV9zZXRfbG9hZF9wcml2a2V5X2Z1bmN0aW9uCUVOR0lORV9zZXRfbG9hZF9wcml2a2V5X2ZuCisjdW5kZWYgRU5HSU5FX2dldF9sb2FkX3ByaXZrZXlfZnVuY3Rpb24KKyNkZWZpbmUgRU5HSU5FX2dldF9sb2FkX3ByaXZrZXlfZnVuY3Rpb24JRU5HSU5FX2dldF9sb2FkX3ByaXZrZXlfZm4KKyN1bmRlZiBFTkdJTkVfdW5yZWdpc3Rlcl9wa2V5X2FzbjFfbWV0aHMKKyNkZWZpbmUgRU5HSU5FX3VucmVnaXN0ZXJfcGtleV9hc24xX21ldGhzCUVOR0lORV91bnJlZ19wa2V5X2FzbjFfbWV0aHMKKyN1bmRlZiBFTkdJTkVfcmVnaXN0ZXJfYWxsX3BrZXlfYXNuMV9tZXRocworI2RlZmluZSBFTkdJTkVfcmVnaXN0ZXJfYWxsX3BrZXlfYXNuMV9tZXRocwlFTkdJTkVfcmVnX2FsbF9wa2V5X2FzbjFfbWV0aHMKKyN1bmRlZiBFTkdJTkVfc2V0X2RlZmF1bHRfcGtleV9hc24xX21ldGhzCisjZGVmaW5lIEVOR0lORV9zZXRfZGVmYXVsdF9wa2V5X2FzbjFfbWV0aHMJRU5HSU5FX3NldF9kZWZfcGtleV9hc24xX21ldGhzCisjdW5kZWYgRU5HSU5FX2dldF9wa2V5X2FzbjFfbWV0aF9lbmdpbmUKKyNkZWZpbmUgRU5HSU5FX2dldF9wa2V5X2FzbjFfbWV0aF9lbmdpbmUJRU5HSU5FX2dldF9wa2V5X2FzbjFfbWV0aF9lbmcKKyN1bmRlZiBFTkdJTkVfc2V0X2xvYWRfc3NsX2NsaWVudF9jZXJ0X2Z1bmN0aW9uCisjZGVmaW5lIEVOR0lORV9zZXRfbG9hZF9zc2xfY2xpZW50X2NlcnRfZnVuY3Rpb24gXAorCQkJCQkJRU5HSU5FX3NldF9sZF9zc2xfY2xudF9jZXJ0X2ZuCisjdW5kZWYgRU5HSU5FX2dldF9zc2xfY2xpZW50X2NlcnRfZnVuY3Rpb24KKyNkZWZpbmUgRU5HSU5FX2dldF9zc2xfY2xpZW50X2NlcnRfZnVuY3Rpb24JRU5HSU5FX2dldF9zc2xfY2xpZW50X2NlcnRfZm4KKworLyogSGFjayBzb21lIGxvbmcgT0NTUCBuYW1lcyAqLworI3VuZGVmIE9DU1BfUkVRVUVTVF9nZXRfZXh0X2J5X2NyaXRpY2FsCisjZGVmaW5lIE9DU1BfUkVRVUVTVF9nZXRfZXh0X2J5X2NyaXRpY2FsCU9DU1BfUkVRVUVTVF9nZXRfZXh0X2J5X2NyaXQKKyN1bmRlZiBPQ1NQX0JBU0lDUkVTUF9nZXRfZXh0X2J5X2NyaXRpY2FsCisjZGVmaW5lIE9DU1BfQkFTSUNSRVNQX2dldF9leHRfYnlfY3JpdGljYWwgICAgICBPQ1NQX0JBU0lDUkVTUF9nZXRfZXh0X2J5X2NyaXQKKyN1bmRlZiBPQ1NQX1NJTkdMRVJFU1BfZ2V0X2V4dF9ieV9jcml0aWNhbAorI2RlZmluZSBPQ1NQX1NJTkdMRVJFU1BfZ2V0X2V4dF9ieV9jcml0aWNhbCAgICAgT0NTUF9TSU5HTEVSRVNQX2dldF9leHRfYnlfY3JpdAorCisvKiBIYWNrIHNvbWUgbG9uZyBERVMgbmFtZXMgKi8KKyN1bmRlZiBfb3NzbF9vbGRfZGVzX2VkZTNfY2ZiNjRfZW5jcnlwdAorI2RlZmluZSBfb3NzbF9vbGRfZGVzX2VkZTNfY2ZiNjRfZW5jcnlwdAlfb3NzbF9vZGVzX2VkZTNfY2ZiNjRfZW5jcnlwdAorI3VuZGVmIF9vc3NsX29sZF9kZXNfZWRlM19vZmI2NF9lbmNyeXB0CisjZGVmaW5lIF9vc3NsX29sZF9kZXNfZWRlM19vZmI2NF9lbmNyeXB0CV9vc3NsX29kZXNfZWRlM19vZmI2NF9lbmNyeXB0CisKKy8qIEhhY2sgc29tZSBsb25nIEVWUCBuYW1lcyAqLworI3VuZGVmIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX25vY29uZgorI2RlZmluZSBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYJT1BFTlNTTF9hZGRfYWxsX2FsZ29fbm9jb25mCisjdW5kZWYgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfY29uZgorI2RlZmluZSBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19jb25mCQlPUEVOU1NMX2FkZF9hbGxfYWxnb19jb25mCisjdW5kZWYgRVZQX1BLRVlfbWV0aF9zZXRfdmVyaWZ5X3JlY292ZXIKKyNkZWZpbmUgRVZQX1BLRVlfbWV0aF9zZXRfdmVyaWZ5X3JlY292ZXIJRVZQX1BLRVlfbWV0aF9zZXRfdnJmeV9yZWNvdmVyCisKKy8qIEhhY2sgc29tZSBsb25nIEVDIG5hbWVzICovCisjdW5kZWYgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybQorI2RlZmluZSBFQ19HUk9VUF9zZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtCUVDX0dST1VQX3NldF9wb2ludF9jb252X2Zvcm0KKyN1bmRlZiBFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtCisjZGVmaW5lIEVDX0dST1VQX2dldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0JRUNfR1JPVVBfZ2V0X3BvaW50X2NvbnZfZm9ybQorI3VuZGVmIEVDX0dST1VQX2NsZWFyX2ZyZWVfYWxsX2V4dHJhX2RhdGEKKyNkZWZpbmUgRUNfR1JPVVBfY2xlYXJfZnJlZV9hbGxfZXh0cmFfZGF0YQlFQ19HUk9VUF9jbHJfZnJlZV9hbGxfeHRyYV9kYXRhCisjdW5kZWYgRUNfUE9JTlRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcAorI2RlZmluZSBFQ19QT0lOVF9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1BPSU5UX3NldF9KcHJval9jb29yZHNfR0ZwCisjdW5kZWYgRUNfUE9JTlRfZ2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcAorI2RlZmluZSBFQ19QT0lOVF9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1BPSU5UX2dldF9KcHJval9jb29yZHNfR0ZwCisjdW5kZWYgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAKKyNkZWZpbmUgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAgICAgIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRzX0dGcAorI3VuZGVmIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwCisjZGVmaW5lIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwICAgICBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3Jkc19HRnAKKyN1bmRlZiBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAKKyNkZWZpbmUgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwIEVDX1BPSU5UX3NldF9jb21wcl9jb29yZHNfR0ZwCisjdW5kZWYgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtCisjZGVmaW5lIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybSAgICBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3Jkc19HRjJtCisjdW5kZWYgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtCisjZGVmaW5lIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybSAgICBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3Jkc19HRjJtCisjdW5kZWYgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0YybQorI2RlZmluZSBFQ19QT0lOVF9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRjJtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVDX1BPSU5UX3NldF9jb21wcl9jb29yZHNfR0YybQorI3VuZGVmIGVjX0dGMm1fc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaAorI2RlZmluZSBlY19HRjJtX3NpbXBsZV9ncm91cF9jbGVhcl9maW5pc2gJZWNfR0YybV9zaW1wbGVfZ3JwX2Nscl9maW5pc2gKKyN1bmRlZiBlY19HRjJtX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQKKyNkZWZpbmUgZWNfR0YybV9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50CWVjX0dGMm1fc2ltcGxlX2dycF9jaGtfZGlzY3JpbQorI3VuZGVmIGVjX0dGMm1fc2ltcGxlX3BvaW50X2NsZWFyX2ZpbmlzaAorI2RlZmluZSBlY19HRjJtX3NpbXBsZV9wb2ludF9jbGVhcl9maW5pc2gJZWNfR0YybV9zaW1wbGVfcHRfY2xyX2ZpbmlzaAorI3VuZGVmIGVjX0dGMm1fc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eQorI2RlZmluZSBlY19HRjJtX3NpbXBsZV9wb2ludF9zZXRfdG9faW5maW5pdHkJZWNfR0YybV9zaW1wbGVfcHRfc2V0X3RvX2luZgorI3VuZGVmIGVjX0dGMm1fc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZQorI2RlZmluZSBlY19HRjJtX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUJZWNfR0YybV9zaW1wbGVfcHRzX21ha2VfYWZmaW5lCisjdW5kZWYgZWNfR0YybV9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcworI2RlZmluZSBlY19HRjJtX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGMm1fc21wX3B0X3NldF9hZl9jb29yZHMKKyN1bmRlZiBlY19HRjJtX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzCisjZGVmaW5lIGVjX0dGMm1fc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0YybV9zbXBfcHRfZ2V0X2FmX2Nvb3JkcworI3VuZGVmIGVjX0dGMm1fc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzCisjZGVmaW5lIGVjX0dGMm1fc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGMm1fc21wX3NldF9jb21wcl9jb29yZHMKKyN1bmRlZiBlY19HRnBfc2ltcGxlX2dyb3VwX3NldF9jdXJ2ZV9HRnAKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmVfR0ZwICAgICAgIGVjX0dGcF9zaW1wbGVfZ3JwX3NldF9jdXJ2ZV9HRnAKKyN1bmRlZiBlY19HRnBfc2ltcGxlX2dyb3VwX2dldF9jdXJ2ZV9HRnAKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY3VydmVfR0ZwICAgICAgIGVjX0dGcF9zaW1wbGVfZ3JwX2dldF9jdXJ2ZV9HRnAKKyN1bmRlZiBlY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaAorI2RlZmluZSBlY19HRnBfc2ltcGxlX2dyb3VwX2NsZWFyX2ZpbmlzaAllY19HRnBfc2ltcGxlX2dycF9jbGVhcl9maW5pc2gKKyN1bmRlZiBlY19HRnBfc2ltcGxlX2dyb3VwX3NldF9nZW5lcmF0b3IKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfZ2VuZXJhdG9yICAgICAgIGVjX0dGcF9zaW1wbGVfZ3JwX3NldF9nZW5lcmF0b3IKKyN1bmRlZiBlY19HRnBfc2ltcGxlX2dyb3VwX2dldDBfZ2VuZXJhdG9yCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0MF9nZW5lcmF0b3IgICAgICBlY19HRnBfc2ltcGxlX2dycF9ndDBfZ2VuZXJhdG9yCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY29mYWN0b3IKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY29mYWN0b3IJZWNfR0ZwX3NpbXBsZV9ncnBfZ2V0X2NvZmFjdG9yCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9wb2ludF9jbGVhcl9maW5pc2gKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9wb2ludF9jbGVhcl9maW5pc2gJZWNfR0ZwX3NpbXBsZV9wdF9jbGVhcl9maW5pc2gKKyN1bmRlZiBlY19HRnBfc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eQorI2RlZmluZSBlY19HRnBfc2ltcGxlX3BvaW50X3NldF90b19pbmZpbml0eSAgICAgZWNfR0ZwX3NpbXBsZV9wdF9zZXRfdG9faW5mCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUJZWNfR0ZwX3NpbXBsZV9wdHNfbWFrZV9hZmZpbmUKKyN1bmRlZiBlY19HRnBfc2ltcGxlX2dyb3VwX2dldF9jdXJ2ZV9HRnAKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY3VydmVfR0ZwICAgICAgIGVjX0dGcF9zaW1wbGVfZ3JwX2dldF9jdXJ2ZV9HRnAKKyN1bmRlZiBlY19HRnBfc2ltcGxlX3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zbXBfc2V0X0pwcm9qX2Nvb3Jkc19HRnAKKyN1bmRlZiBlY19HRnBfc2ltcGxlX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zbXBfZ2V0X0pwcm9qX2Nvb3Jkc19HRnAKKyN1bmRlZiBlY19HRnBfc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NtcF9wdF9zZXRfYWZfY29vcmRzX0dGcAorI3VuZGVmIGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc21wX3B0X2dldF9hZl9jb29yZHNfR0ZwCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlc19HRnAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NtcF9zZXRfY29tcHJfY29vcmRzX0dGcAorI3VuZGVmIGVjX0dGcF9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcworI2RlZmluZSBlY19HRnBfc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NtcF9wdF9zZXRfYWZfY29vcmRzCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc21wX3B0X2dldF9hZl9jb29yZHMKKyN1bmRlZiBlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NtcF9zZXRfY29tcHJfY29vcmRzCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9ncm91cF9jaGVja19kaXNjcmltaW5hbnQJZWNfR0ZwX3NpbXBsZV9ncnBfY2hrX2Rpc2NyaW0KKworLyogSGFjayBzb20gbG9uZyBTVE9SRSBuYW1lcyAqLworI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfaW5pdGlhbGlzZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X2luaXRpYWxpc2VfZnVuY3Rpb24JU1RPUkVfbWV0aF9zZXRfaW5pdGlhbGlzZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfY2xlYW51cF9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X2NsZWFudXBfZnVuY3Rpb24JU1RPUkVfbWV0aF9zZXRfY2xlYW51cF9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfZ2VuZXJhdGVfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX3NldF9nZW5lcmF0ZV9mdW5jdGlvbglTVE9SRV9tZXRoX3NldF9nZW5lcmF0ZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfbW9kaWZ5X2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9zZXRfbW9kaWZ5X2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X21vZGlmeV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfcmV2b2tlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9zZXRfcmV2b2tlX2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X3Jldm9rZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfZGVsZXRlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9zZXRfZGVsZXRlX2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X2RlbGV0ZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfbGlzdF9zdGFydF9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X2xpc3Rfc3RhcnRfZnVuY3Rpb24JU1RPUkVfbWV0aF9zZXRfbGlzdF9zdGFydF9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfbGlzdF9uZXh0X2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9zZXRfbGlzdF9uZXh0X2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X2xpc3RfbmV4dF9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfbGlzdF9lbmRfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX3NldF9saXN0X2VuZF9mdW5jdGlvbglTVE9SRV9tZXRoX3NldF9saXN0X2VuZF9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfdXBkYXRlX3N0b3JlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9zZXRfdXBkYXRlX3N0b3JlX2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X3VwZGF0ZV9zdG9yZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfbG9ja19zdG9yZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X2xvY2tfc3RvcmVfZnVuY3Rpb24JU1RPUkVfbWV0aF9zZXRfbG9ja19zdG9yZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9zZXRfdW5sb2NrX3N0b3JlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9zZXRfdW5sb2NrX3N0b3JlX2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X3VubG9ja19zdG9yZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfaW5pdGlhbGlzZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X2luaXRpYWxpc2VfZnVuY3Rpb24JU1RPUkVfbWV0aF9nZXRfaW5pdGlhbGlzZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfY2xlYW51cF9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X2NsZWFudXBfZnVuY3Rpb24JU1RPUkVfbWV0aF9nZXRfY2xlYW51cF9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfZ2VuZXJhdGVfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX2dldF9nZW5lcmF0ZV9mdW5jdGlvbglTVE9SRV9tZXRoX2dldF9nZW5lcmF0ZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfbW9kaWZ5X2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9nZXRfbW9kaWZ5X2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X21vZGlmeV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfcmV2b2tlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9nZXRfcmV2b2tlX2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X3Jldm9rZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfZGVsZXRlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9nZXRfZGVsZXRlX2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X2RlbGV0ZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfbGlzdF9zdGFydF9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X2xpc3Rfc3RhcnRfZnVuY3Rpb24JU1RPUkVfbWV0aF9nZXRfbGlzdF9zdGFydF9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfbGlzdF9uZXh0X2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9nZXRfbGlzdF9uZXh0X2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X2xpc3RfbmV4dF9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfbGlzdF9lbmRfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX2dldF9saXN0X2VuZF9mdW5jdGlvbglTVE9SRV9tZXRoX2dldF9saXN0X2VuZF9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfdXBkYXRlX3N0b3JlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9nZXRfdXBkYXRlX3N0b3JlX2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X3VwZGF0ZV9zdG9yZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfbG9ja19zdG9yZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X2xvY2tfc3RvcmVfZnVuY3Rpb24JU1RPUkVfbWV0aF9nZXRfbG9ja19zdG9yZV9mbgorI3VuZGVmIFNUT1JFX21ldGhvZF9nZXRfdW5sb2NrX3N0b3JlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9nZXRfdW5sb2NrX3N0b3JlX2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X3VubG9ja19zdG9yZV9mbgorCisvKiBIYWNrIHNvbWUgbG9uZyBUUyBuYW1lcyAqLworI3VuZGVmIFRTX1JFU1BfQ1RYX3NldF9zdGF0dXNfaW5mb19jb25kCisjZGVmaW5lIFRTX1JFU1BfQ1RYX3NldF9zdGF0dXNfaW5mb19jb25kCVRTX1JFU1BfQ1RYX3NldF9zdGF0X2luZm9fY29uZAorI3VuZGVmIFRTX1JFU1BfQ1RYX3NldF9jbG9ja19wcmVjaXNpb25fZGlnaXRzCisjZGVmaW5lIFRTX1JFU1BfQ1RYX3NldF9jbG9ja19wcmVjaXNpb25fZGlnaXRzCVRTX1JFU1BfQ1RYX3NldF9jbGtfcHJlY19kaWdpdHMKKyN1bmRlZiBUU19DT05GX3NldF9jbG9ja19wcmVjaXNpb25fZGlnaXRzCisjZGVmaW5lIFRTX0NPTkZfc2V0X2Nsb2NrX3ByZWNpc2lvbl9kaWdpdHMJVFNfQ09ORl9zZXRfY2xrX3ByZWNfZGlnaXRzCisKKy8qIEhhY2sgc29tZSBsb25nIENNUyBuYW1lcyAqLworI3VuZGVmIENNU19SZWNpcGllbnRJbmZvX2t0cmlfZ2V0MF9hbGdzCisjZGVmaW5lIENNU19SZWNpcGllbnRJbmZvX2t0cmlfZ2V0MF9hbGdzCUNNU19SZWNpcEluZm9fa3RyaV9nZXQwX2FsZ3MKKyN1bmRlZiBDTVNfUmVjaXBpZW50SW5mb19rdHJpX2dldDBfc2lnbmVyX2lkCisjZGVmaW5lIENNU19SZWNpcGllbnRJbmZvX2t0cmlfZ2V0MF9zaWduZXJfaWQJQ01TX1JlY2lwSW5mb19rdHJpX2dldDBfc2lncl9pZAorI3VuZGVmIENNU19PdGhlclJldm9jYXRpb25JbmZvRm9ybWF0X2l0CisjZGVmaW5lIENNU19PdGhlclJldm9jYXRpb25JbmZvRm9ybWF0X2l0CUNNU19PdGhlclJldm9jSW5mb0Zvcm1hdF9pdAorI3VuZGVmIENNU19LZXlBZ3JlZVJlY2lwaWVudElkZW50aWZpZXJfaXQKKyNkZWZpbmUgQ01TX0tleUFncmVlUmVjaXBpZW50SWRlbnRpZmllcl9pdAlDTVNfS2V5QWdyZWVSZWNpcElkZW50aWZpZXJfaXQKKyN1bmRlZiBDTVNfT3JpZ2luYXRvcklkZW50aWZpZXJPcktleV9pdAorI2RlZmluZSBDTVNfT3JpZ2luYXRvcklkZW50aWZpZXJPcktleV9pdAlDTVNfT3JpZ2luYXRvcklkT3JLZXlfaXQKKyN1bmRlZiBjbXNfU2lnbmVySWRlbnRpZmllcl9nZXQwX3NpZ25lcl9pZAorI2RlZmluZSBjbXNfU2lnbmVySWRlbnRpZmllcl9nZXQwX3NpZ25lcl9pZAljbXNfU2lnbmVySWRfZ2V0MF9zaWduZXJfaWQKKworLyogSGFjayBzb21lIGxvbmcgRFRMUzEgbmFtZXMgKi8KKyN1bmRlZiBkdGxzMV9yZXRyYW5zbWl0X2J1ZmZlcmVkX21lc3NhZ2VzCisjZGVmaW5lIGR0bHMxX3JldHJhbnNtaXRfYnVmZmVyZWRfbWVzc2FnZXMJZHRsczFfcmV0cmFuc21pdF9idWZmZXJlZF9tc2dzCisKKy8qIEhhY2sgc29tZSBsb25nIFVJIG5hbWVzICovCisjdW5kZWYgVUlfbWV0aG9kX2dldF9wcm9tcHRfY29uc3RydWN0b3IKKyNkZWZpbmUgVUlfbWV0aG9kX2dldF9wcm9tcHRfY29uc3RydWN0b3IJVUlfbWV0aG9kX2dldF9wcm9tcHRfY29uc3RydWN0cgorI3VuZGVmIFVJX21ldGhvZF9zZXRfcHJvbXB0X2NvbnN0cnVjdG9yCisjZGVmaW5lIFVJX21ldGhvZF9zZXRfcHJvbXB0X2NvbnN0cnVjdG9yCVVJX21ldGhvZF9zZXRfcHJvbXB0X2NvbnN0cnVjdHIKKworI2VuZGlmIC8qIGRlZmluZWQgT1BFTlNTTF9TWVNfVk1TICovCisKKworLyogQ2FzZSBpbnNlbnNpdGl2ZSBsaW5raW5nIGNhdXNlcyBwcm9ibGVtcy4uLi4gKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19PUzIpCisjdW5kZWYgRVJSX2xvYWRfQ1JZUFRPX3N0cmluZ3MKKyNkZWZpbmUgRVJSX2xvYWRfQ1JZUFRPX3N0cmluZ3MJCQlFUlJfbG9hZF9DUllQVE9saWJfc3RyaW5ncworI3VuZGVmIE9DU1BfY3JsSURfbmV3CisjZGVmaW5lIE9DU1BfY3JsSURfbmV3CQkJCU9DU1BfY3JsSUQyX25ldworCisjdW5kZWYgZDJpX0VDUEFSQU1FVEVSUworI2RlZmluZSBkMmlfRUNQQVJBTUVURVJTCQkJZDJpX1VDX0VDUEFSQU1FVEVSUworI3VuZGVmIGkyZF9FQ1BBUkFNRVRFUlMKKyNkZWZpbmUgaTJkX0VDUEFSQU1FVEVSUwkJCWkyZF9VQ19FQ1BBUkFNRVRFUlMKKyN1bmRlZiBkMmlfRUNQS1BBUkFNRVRFUlMKKyNkZWZpbmUgZDJpX0VDUEtQQVJBTUVURVJTCQkJZDJpX1VDX0VDUEtQQVJBTUVURVJTCisjdW5kZWYgaTJkX0VDUEtQQVJBTUVURVJTCisjZGVmaW5lIGkyZF9FQ1BLUEFSQU1FVEVSUwkJCWkyZF9VQ19FQ1BLUEFSQU1FVEVSUworCisvKiBUaGVzZSBmdW5jdGlvbnMgZG8gbm90IHNlZW0gdG8gZXhpc3QhICBIb3dldmVyLCBJJ20gcGFyYW5vaWQuLi4KKyAgIE9yaWdpbmFsIGNvbW1hbmQgaW4geDUwOXYzLmg6CisgICBUaGVzZSBmdW5jdGlvbnMgYXJlIGJlaW5nIHJlZGVmaW5lZCBpbiBhbm90aGVyIGRpcmVjdG9yeSwKKyAgIGFuZCBjbGFzaCB3aGVuIHRoZSBsaW5rZXIgaXMgY2FzZS1pbnNlbnNpdGl2ZSwgc28gbGV0J3MKKyAgIGhpZGUgdGhlbSBhIGxpdHRsZSwgYnkgZ2l2aW5nIHRoZW0gYW4gZXh0cmEgJ28nIGF0IHRoZQorICAgYmVnaW5uaW5nIG9mIHRoZSBuYW1lLi4uICovCisjdW5kZWYgWDUwOXYzX2NsZWFudXBfZXh0ZW5zaW9ucworI2RlZmluZSBYNTA5djNfY2xlYW51cF9leHRlbnNpb25zCQlvWDUwOXYzX2NsZWFudXBfZXh0ZW5zaW9ucworI3VuZGVmIFg1MDl2M19hZGRfZXh0ZW5zaW9uCisjZGVmaW5lIFg1MDl2M19hZGRfZXh0ZW5zaW9uCQkJb1g1MDl2M19hZGRfZXh0ZW5zaW9uCisjdW5kZWYgWDUwOXYzX2FkZF9uZXRzY2FwZV9leHRlbnNpb25zCisjZGVmaW5lIFg1MDl2M19hZGRfbmV0c2NhcGVfZXh0ZW5zaW9ucwkJb1g1MDl2M19hZGRfbmV0c2NhcGVfZXh0ZW5zaW9ucworI3VuZGVmIFg1MDl2M19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucworI2RlZmluZSBYNTA5djNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnMJCW9YNTA5djNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnMKKworLyogVGhpcyBvbmUgY2xhc2hlcyB3aXRoIENNU19kYXRhX2NyZWF0ZSAqLworI3VuZGVmIGNtc19EYXRhX2NyZWF0ZQorI2RlZmluZSBjbXNfRGF0YV9jcmVhdGUJCQkJcHJpdl9jbXNfRGF0YV9jcmVhdGUKKworI2VuZGlmCisKKworI2VuZGlmIC8qICEgZGVmaW5lZCBIRUFERVJfVk1TX0lESEFDS1NfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvUkVBRE1FIGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmIyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9SRUFETUUKQEAgLTAsMCArMSwxNCBAQAorTXV0aXRocmVhZGluZyB0ZXN0aW5nIGFyZWEuCisKK1NpbmNlIHRoaXMgc3R1ZmYgaXMgdmVyeSB2ZXJ5IHBsYXRvcm0gc3BlY2lmaWMsIHRoaXMgaXMgbm90IHBhcnQgb2YgdGhlCitub3JtYWwgYnVpbGQuICBIYXZlIGEgcmVhZCBvZiBkb2MvdGhyZWFkcy5kb2MuCisKK210dGVzdCB3aWxsIGRvIHNvbWUgdGVzdGluZyBhbmQgd2lsbCBjdXJyZW50bHkgYnVpbGQgdW5kZXIgV2luZG93cyBOVC85NSwKK1NvbGFyaXMgYW5kIExpbnV4LiAgVGhlIElSSVggc3R1ZmYgaXMgbm90IGZpbmlzaGVkLgorCitJIGhhdmUgdGVzdGVkIHRoaXMgcHJvZ3JhbSBvbiBhIDEyIENQVSB1bHRyYSBzcGFyYyBib3ggKHNvbGFyaXMgMi41LjEpCithbmQgdGhpbmdzIHNlZW0gdG8gd29yayBvay4KKworVGhlIExpbnV4IHB0aHJlYWRzIHBhY2thZ2UgY2FuIGJlIHJldHJpZXZlZCBmcm9tIAoraHR0cDovL3d3dy5taXQuZWR1OjgwMDEvcGVvcGxlL3Byb3Zlbi9wdGhyZWFkcy5odG1sCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by90aHJlYWRzL210dGVzdC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvbXR0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhN2FhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by90aHJlYWRzL210dGVzdC5jCkBAIC0wLDAgKzEsMTMxMCBAQAorLyogY3J5cHRvL3RocmVhZHMvbXR0ZXN0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBMSU5VWAorI2luY2x1ZGUgPHR5cGVkZWZzLmg+CisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4zMgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorI2lmZGVmIFNPTEFSSVMKKyNpbmNsdWRlIDxzeW5jaC5oPgorI2luY2x1ZGUgPHRocmVhZC5oPgorI2VuZGlmCisjaWZkZWYgSVJJWAorI2luY2x1ZGUgPHVsb2Nrcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2VuZGlmCisjaWZkZWYgUFRIUkVBRFMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisjaWYgIWRlZmluZWQgX19pbnQ2NAorIyAgZGVmaW5lIF9faW50NjQgbG9uZyBsb25nCisjZW5kaWYgICAKKyNpbmNsdWRlIDxud21way5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlICIuLi8uLi9lX29zLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19GUF9BUEkKKyNkZWZpbmUgQVBQU19XSU4xNgorI2luY2x1ZGUgIi4uL2J1ZmZlci9ic3NfZmlsZS5jIgorI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX1NZU19ORVRXQVJFCisjZGVmaW5lIFRFU1RfU0VSVkVSX0NFUlQgIi9vcGVuc3NsL2FwcHMvc2VydmVyLnBlbSIKKyNkZWZpbmUgVEVTVF9DTElFTlRfQ0VSVCAiL29wZW5zc2wvYXBwcy9jbGllbnQucGVtIgorI2Vsc2UKKyNkZWZpbmUgVEVTVF9TRVJWRVJfQ0VSVCAiLi4vLi4vYXBwcy9zZXJ2ZXIucGVtIgorI2RlZmluZSBURVNUX0NMSUVOVF9DRVJUICIuLi8uLi9hcHBzL2NsaWVudC5wZW0iCisjZW5kaWYKKworI2RlZmluZSBNQVhfVEhSRUFEX05VTUJFUgkxMDAKKworaW50IE1TX0NBTExCQUNLIHZlcmlmeV9jYWxsYmFjayhpbnQgb2ssIFg1MDlfU1RPUkVfQ1RYICp4cyk7Cit2b2lkIHRocmVhZF9zZXR1cCh2b2lkKTsKK3ZvaWQgdGhyZWFkX2NsZWFudXAodm9pZCk7Cit2b2lkIGRvX3RocmVhZHMoU1NMX0NUWCAqc19jdHgsU1NMX0NUWCAqY19jdHgpOworCit2b2lkIGlyaXhfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSxpbnQgdHlwZSxjaGFyICpmaWxlLGludCBsaW5lKTsKK3ZvaWQgc29sYXJpc19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLGludCB0eXBlLGNoYXIgKmZpbGUsaW50IGxpbmUpOwordm9pZCB3aW4zMl9sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLGludCB0eXBlLGNoYXIgKmZpbGUsaW50IGxpbmUpOwordm9pZCBwdGhyZWFkc19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLGludCB0eXBlLGNoYXIgKmZpbGUsaW50IGxpbmUpOwordm9pZCBuZXR3YXJlX2xvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsaW50IHR5cGUsY2hhciAqZmlsZSxpbnQgbGluZSk7Cit2b2lkIGJlb3NfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSxpbnQgdHlwZSxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKTsKKwordW5zaWduZWQgbG9uZyBpcml4X3RocmVhZF9pZCh2b2lkICk7Cit1bnNpZ25lZCBsb25nIHNvbGFyaXNfdGhyZWFkX2lkKHZvaWQgKTsKK3Vuc2lnbmVkIGxvbmcgcHRocmVhZHNfdGhyZWFkX2lkKHZvaWQgKTsKK3Vuc2lnbmVkIGxvbmcgbmV0d2FyZV90aHJlYWRfaWQodm9pZCApOwordW5zaWduZWQgbG9uZyBiZW9zX3RocmVhZF9pZCh2b2lkICk7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCitzdGF0aWMgTVBLTXV0ZXggKmxvY2tfY3M7CitzdGF0aWMgTVBLU2VtYSBUaHJlYWRTZW07CitzdGF0aWMgbG9uZyAqbG9ja19jb3VudDsKKyNlbmRpZgorCitCSU8gKmJpb19lcnI9TlVMTDsKK0JJTyAqYmlvX3N0ZG91dD1OVUxMOworCitzdGF0aWMgY2hhciAqY2lwaGVyPU5VTEw7CitpbnQgdmVyYm9zZT0wOworI2lmZGVmIEZJT05CSU8KK3N0YXRpYyBpbnQgc19uYmlvPTA7CisjZW5kaWYKKworaW50IHRocmVhZF9udW1iZXI9MTA7CitpbnQgbnVtYmVyX29mX2xvb3BzPTEwOworaW50IHJlY29ubmVjdD0wOworaW50IGNhY2hlX3N0YXRzPTA7CisKK3N0YXRpYyBjb25zdCBjaGFyIHJuZF9zZWVkW10gPSAic3RyaW5nIHRvIG1ha2UgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRoaW5rIGl0IGhhcyBlbnRyb3B5IjsKKworaW50IGRvaXQoY2hhciAqY3R4WzRdKTsKK3N0YXRpYyB2b2lkIHByaW50X3N0YXRzKEZJTEUgKmZwLCBTU0xfQ1RYICpjdHgpCit7CisJZnByaW50ZihmcCwiJTRsZCBpdGVtcyBpbiB0aGUgc2Vzc2lvbiBjYWNoZVxuIiwKKwkJU1NMX0NUWF9zZXNzX251bWJlcihjdHgpKTsKKwlmcHJpbnRmKGZwLCIlNGQgY2xpZW50IGNvbm5lY3RzIChTU0xfY29ubmVjdCgpKVxuIiwKKwkJU1NMX0NUWF9zZXNzX2Nvbm5lY3QoY3R4KSk7CisJZnByaW50ZihmcCwiJTRkIGNsaWVudCBjb25uZWN0cyB0aGF0IGZpbmlzaGVkXG4iLAorCQlTU0xfQ1RYX3Nlc3NfY29ubmVjdF9nb29kKGN0eCkpOworCWZwcmludGYoZnAsIiU0ZCBzZXJ2ZXIgY29ubmVjdHMgKFNTTF9hY2NlcHQoKSlcbiIsCisJCVNTTF9DVFhfc2Vzc19hY2NlcHQoY3R4KSk7CisJZnByaW50ZihmcCwiJTRkIHNlcnZlciBjb25uZWN0cyB0aGF0IGZpbmlzaGVkXG4iLAorCQlTU0xfQ1RYX3Nlc3NfYWNjZXB0X2dvb2QoY3R4KSk7CisJZnByaW50ZihmcCwiJTRkIHNlc3Npb24gY2FjaGUgaGl0c1xuIixTU0xfQ1RYX3Nlc3NfaGl0cyhjdHgpKTsKKwlmcHJpbnRmKGZwLCIlNGQgc2Vzc2lvbiBjYWNoZSBtaXNzZXNcbiIsU1NMX0NUWF9zZXNzX21pc3NlcyhjdHgpKTsKKwlmcHJpbnRmKGZwLCIlNGQgc2Vzc2lvbiBjYWNoZSB0aW1lb3V0c1xuIixTU0xfQ1RYX3Nlc3NfdGltZW91dHMoY3R4KSk7CisJfQorCitzdGF0aWMgdm9pZCBzdl91c2FnZSh2b2lkKQorCXsKKwlmcHJpbnRmKHN0ZGVyciwidXNhZ2U6IHNzbHRlc3QgW2FyZ3MgLi4uXVxuIik7CisJZnByaW50ZihzdGRlcnIsIlxuIik7CisJZnByaW50ZihzdGRlcnIsIiAtc2VydmVyX2F1dGggIC0gY2hlY2sgc2VydmVyIGNlcnRpZmljYXRlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1jbGllbnRfYXV0aCAgLSBkbyBjbGllbnQgYXV0aGVudGljYXRpb25cbiIpOworCWZwcmludGYoc3RkZXJyLCIgLXYgICAgICAgICAgICAtIG1vcmUgb3V0cHV0XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1DQXBhdGggYXJnICAgLSBQRU0gZm9ybWF0IGRpcmVjdG9yeSBvZiBDQSdzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1DQWZpbGUgYXJnICAgLSBQRU0gZm9ybWF0IGZpbGUgb2YgQ0Enc1xuIik7CisJZnByaW50ZihzdGRlcnIsIiAtdGhyZWFkcyBhcmcgIC0gbnVtYmVyIG9mIHRocmVhZHNcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLWxvb3BzIGFyZyAgICAtIG51bWJlciBvZiAnY29ubmVjdGlvbnMnLCBwZXIgdGhyZWFkXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1yZWNvbm5lY3QgICAgLSByZXVzZSBzZXNzaW9uLWlkJ3NcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLXN0YXRzICAgICAgICAtIHNlcnZlciBzZXNzaW9uLWlkIGNhY2hlIHN0YXRzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1jZXJ0IGFyZyAgICAgLSBzZXJ2ZXIgY2VydGlmaWNhdGUva2V5XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1jY2VydCBhcmcgICAgLSBjbGllbnQgY2VydGlmaWNhdGUva2V5XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1zc2wzICAgICAgICAgLSBqdXN0IFNTTHYzblxuIik7CisJfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorCXsKKwljaGFyICpDQXBhdGg9TlVMTCwqQ0FmaWxlPU5VTEw7CisJaW50IGJhZG9wPTA7CisJaW50IHJldD0xOworCWludCBjbGllbnRfYXV0aD0wOworCWludCBzZXJ2ZXJfYXV0aD0wOworCVNTTF9DVFggKnNfY3R4PU5VTEw7CisJU1NMX0NUWCAqY19jdHg9TlVMTDsKKwljaGFyICpzY2VydD1URVNUX1NFUlZFUl9DRVJUOworCWNoYXIgKmNjZXJ0PVRFU1RfQ0xJRU5UX0NFUlQ7CisJU1NMX01FVEhPRCAqc3NsX21ldGhvZD1TU0x2MjNfbWV0aG9kKCk7CisKKwlSQU5EX3NlZWQocm5kX3NlZWQsIHNpemVvZiBybmRfc2VlZCk7CisKKwlpZiAoYmlvX2VyciA9PSBOVUxMKQorCQliaW9fZXJyPUJJT19uZXdfZnAoc3RkZXJyLEJJT19OT0NMT1NFKTsKKwlpZiAoYmlvX3N0ZG91dCA9PSBOVUxMKQorCQliaW9fc3Rkb3V0PUJJT19uZXdfZnAoc3Rkb3V0LEJJT19OT0NMT1NFKTsKKwlhcmdjLS07CisJYXJndisrOworCisJd2hpbGUgKGFyZ2MgPj0gMSkKKwkJeworCQlpZgkoc3RyY21wKCphcmd2LCItc2VydmVyX2F1dGgiKSA9PSAwKQorCQkJc2VydmVyX2F1dGg9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItY2xpZW50X2F1dGgiKSA9PSAwKQorCQkJY2xpZW50X2F1dGg9MTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcmVjb25uZWN0IikgPT0gMCkKKwkJCXJlY29ubmVjdD0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zdGF0cyIpID09IDApCisJCQljYWNoZV9zdGF0cz0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zc2wzIikgPT0gMCkKKwkJCXNzbF9tZXRob2Q9U1NMdjNfbWV0aG9kKCk7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXNzbDIiKSA9PSAwKQorCQkJc3NsX21ldGhvZD1TU0x2Ml9tZXRob2QoKTsKKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItQ0FwYXRoIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCUNBcGF0aD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1DQWZpbGUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJQ0FmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWNlcnQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc2NlcnQ9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItY2NlcnQiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJY2NlcnQ9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItdGhyZWFkcyIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQl0aHJlYWRfbnVtYmVyPSBhdG9pKCooKythcmd2KSk7CisJCQlpZiAodGhyZWFkX251bWJlciA9PSAwKSB0aHJlYWRfbnVtYmVyPTE7CisJCQlpZiAodGhyZWFkX251bWJlciA+IE1BWF9USFJFQURfTlVNQkVSKQorCQkJCXRocmVhZF9udW1iZXI9TUFYX1RIUkVBRF9OVU1CRVI7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWxvb3BzIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW51bWJlcl9vZl9sb29wcz0gYXRvaSgqKCsrYXJndikpOworCQkJaWYgKG51bWJlcl9vZl9sb29wcyA9PSAwKSBudW1iZXJfb2ZfbG9vcHM9MTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJZnByaW50ZihzdGRlcnIsInVua25vd24gb3B0aW9uICVzXG4iLCphcmd2KTsKKwkJCWJhZG9wPTE7CisJCQlicmVhazsKKwkJCX0KKwkJYXJnYy0tOworCQlhcmd2Kys7CisJCX0KKwlpZiAoYmFkb3ApCisJCXsKK2JhZDoKKwkJc3ZfdXNhZ2UoKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChjaXBoZXIgPT0gTlVMTCAmJiBPUEVOU1NMX2lzc2V0dWdpZCgpID09IDApCisJCWNpcGhlcj1nZXRlbnYoIlNTTF9DSVBIRVIiKTsKKworCVNTTF9sb2FkX2Vycm9yX3N0cmluZ3MoKTsKKwlPcGVuU1NMX2FkZF9zc2xfYWxnb3JpdGhtcygpOworCisJY19jdHg9U1NMX0NUWF9uZXcoc3NsX21ldGhvZCk7CisJc19jdHg9U1NMX0NUWF9uZXcoc3NsX21ldGhvZCk7CisJaWYgKChjX2N0eCA9PSBOVUxMKSB8fCAoc19jdHggPT0gTlVMTCkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCVNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShzX2N0eCwKKwkJU1NMX1NFU1NfQ0FDSEVfTk9fQVVUT19DTEVBUnxTU0xfU0VTU19DQUNIRV9TRVJWRVIpOworCVNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjX2N0eCwKKwkJU1NMX1NFU1NfQ0FDSEVfTk9fQVVUT19DTEVBUnxTU0xfU0VTU19DQUNIRV9TRVJWRVIpOworCisJaWYgKCFTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKHNfY3R4LHNjZXJ0LFNTTF9GSUxFVFlQRV9QRU0pKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCX0KKwllbHNlIGlmICghU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlKHNfY3R4LHNjZXJ0LFNTTF9GSUxFVFlQRV9QRU0pKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoY2xpZW50X2F1dGgpCisJCXsKKwkJU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShjX2N0eCxjY2VydCwKKwkJCVNTTF9GSUxFVFlQRV9QRU0pOworCQlTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUoY19jdHgsY2NlcnQsCisJCQlTU0xfRklMRVRZUEVfUEVNKTsKKwkJfQorCisJaWYgKAkoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNfY3R4LENBZmlsZSxDQXBhdGgpKSB8fAorCQkoIVNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNfY3R4KSkgfHwKKwkJKCFTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjX2N0eCxDQWZpbGUsQ0FwYXRoKSkgfHwKKwkJKCFTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhjX2N0eCkpKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCJTU0xfbG9hZF92ZXJpZnlfbG9jYXRpb25zXG4iKTsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChjbGllbnRfYXV0aCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiY2xpZW50IGF1dGhlbnRpY2F0aW9uXG4iKTsKKwkJU1NMX0NUWF9zZXRfdmVyaWZ5KHNfY3R4LAorCQkJU1NMX1ZFUklGWV9QRUVSfFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQsCisJCQl2ZXJpZnlfY2FsbGJhY2spOworCQl9CisJaWYgKHNlcnZlcl9hdXRoKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCJzZXJ2ZXIgYXV0aGVudGljYXRpb25cbiIpOworCQlTU0xfQ1RYX3NldF92ZXJpZnkoY19jdHgsU1NMX1ZFUklGWV9QRUVSLAorCQkJdmVyaWZ5X2NhbGxiYWNrKTsKKwkJfQorCisJdGhyZWFkX3NldHVwKCk7CisJZG9fdGhyZWFkcyhzX2N0eCxjX2N0eCk7CisJdGhyZWFkX2NsZWFudXAoKTsKK2VuZDoKKwkKKwlpZiAoY19jdHggIT0gTlVMTCkgCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIkNsaWVudCBTU0xfQ1RYIHN0YXRzIHRoZW4gZnJlZSBpdFxuIik7CisJCXByaW50X3N0YXRzKHN0ZGVycixjX2N0eCk7CisJCVNTTF9DVFhfZnJlZShjX2N0eCk7CisJCX0KKwlpZiAoc19jdHggIT0gTlVMTCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiU2VydmVyIFNTTF9DVFggc3RhdHMgdGhlbiBmcmVlIGl0XG4iKTsKKwkJcHJpbnRfc3RhdHMoc3RkZXJyLHNfY3R4KTsKKwkJaWYgKGNhY2hlX3N0YXRzKQorCQkJeworCQkJZnByaW50ZihzdGRlcnIsIi0tLS0tXG4iKTsKKwkJCWxoX3N0YXRzKFNTTF9DVFhfc2Vzc2lvbnMoc19jdHgpLHN0ZGVycik7CisJCQlmcHJpbnRmKHN0ZGVyciwiLS0tLS1cbiIpOworCQkvKglsaF9ub2RlX3N0YXRzKFNTTF9DVFhfc2Vzc2lvbnMoc19jdHgpLHN0ZGVycik7CisJCQlmcHJpbnRmKHN0ZGVyciwiLS0tLS1cbiIpOyAqLworCQkJbGhfbm9kZV91c2FnZV9zdGF0cyhTU0xfQ1RYX3Nlc3Npb25zKHNfY3R4KSxzdGRlcnIpOworCQkJZnByaW50ZihzdGRlcnIsIi0tLS0tXG4iKTsKKwkJCX0KKwkJU1NMX0NUWF9mcmVlKHNfY3R4KTsKKwkJZnByaW50ZihzdGRlcnIsImRvbmUgZnJlZVxuIik7CisJCX0KKwlleGl0KHJldCk7CisJcmV0dXJuKDApOworCX0KKworI2RlZmluZSBXX1JFQUQJMQorI2RlZmluZSBXX1dSSVRFCTIKKyNkZWZpbmUgQ19ET05FCTEKKyNkZWZpbmUgU19ET05FCTIKKworaW50IG5kb2l0KFNTTF9DVFggKnNzbF9jdHhbMl0pCisJeworCWludCBpOworCWludCByZXQ7CisJY2hhciAqY3R4WzRdOworCisJY3R4WzBdPShjaGFyICopc3NsX2N0eFswXTsKKwljdHhbMV09KGNoYXIgKilzc2xfY3R4WzFdOworCisJaWYgKHJlY29ubmVjdCkKKwkJeworCQljdHhbMl09KGNoYXIgKilTU0xfbmV3KHNzbF9jdHhbMF0pOworCQljdHhbM109KGNoYXIgKilTU0xfbmV3KHNzbF9jdHhbMV0pOworCQl9CisJZWxzZQorCQl7CisJCWN0eFsyXT1OVUxMOworCQljdHhbM109TlVMTDsKKwkJfQorCisJZnByaW50ZihzdGRvdXQsInN0YXJ0ZWQgdGhyZWFkICVsdVxuIixDUllQVE9fdGhyZWFkX2lkKCkpOworCWZvciAoaT0wOyBpPG51bWJlcl9vZl9sb29wczsgaSsrKQorCQl7CisvKgkJZnByaW50ZihzdGRlcnIsIiU0ZCAlMmQgY3R4LT5yZWYgKCUzZCwlM2QpXG4iLAorCQkJQ1JZUFRPX3RocmVhZF9pZCgpLGksCisJCQlzc2xfY3R4WzBdLT5yZWZlcmVuY2VzLAorCQkJc3NsX2N0eFsxXS0+cmVmZXJlbmNlcyk7ICovCisJLyoJcHRocmVhZF9kZWxheV9ucCgmdG0pOyovCisKKwkJcmV0PWRvaXQoY3R4KTsKKwkJaWYgKHJldCAhPSAwKQorCQkJeworCQkJZnByaW50ZihzdGRvdXQsImVycm9yWyVkXSAlbHUgLSAlZFxuIiwKKwkJCQlpLENSWVBUT190aHJlYWRfaWQoKSxyZXQpOworCQkJcmV0dXJuKHJldCk7CisJCQl9CisJCX0KKwlmcHJpbnRmKHN0ZG91dCwiRE9ORSAlbHVcbiIsQ1JZUFRPX3RocmVhZF9pZCgpKTsKKwlpZiAocmVjb25uZWN0KQorCQl7CisJCVNTTF9mcmVlKChTU0wgKiljdHhbMl0pOworCQlTU0xfZnJlZSgoU1NMICopY3R4WzNdKTsKKwkJfQorIyAgIGlmZGVmIE9QRU5TU0xfU1lTX05FVFdBUkUKKyAgICAgICAgTVBLU2VtYXBob3JlU2lnbmFsKFRocmVhZFNlbSk7CisjICAgZW5kaWYKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgZG9pdChjaGFyICpjdHhbNF0pCisJeworCVNTTF9DVFggKnNfY3R4LCpjX2N0eDsKKwlzdGF0aWMgY2hhciBjYnVmWzIwMF0sc2J1ZlsyMDBdOworCVNTTCAqY19zc2w9TlVMTDsKKwlTU0wgKnNfc3NsPU5VTEw7CisJQklPICpjX3RvX3M9TlVMTDsKKwlCSU8gKnNfdG9fYz1OVUxMOworCUJJTyAqY19iaW89TlVMTDsKKwlCSU8gKnNfYmlvPU5VTEw7CisJaW50IGNfcixjX3csc19yLHNfdzsKKwlpbnQgY193YW50LHNfd2FudDsKKwlpbnQgaTsKKwlpbnQgZG9uZT0wOworCWludCBjX3dyaXRlLHNfd3JpdGU7CisJaW50IGRvX3NlcnZlcj0wLGRvX2NsaWVudD0wOworCisJc19jdHg9KFNTTF9DVFggKiljdHhbMF07CisJY19jdHg9KFNTTF9DVFggKiljdHhbMV07CisKKwlpZiAoY3R4WzJdICE9IE5VTEwpCisJCXNfc3NsPShTU0wgKiljdHhbMl07CisJZWxzZQorCQlzX3NzbD1TU0xfbmV3KHNfY3R4KTsKKworCWlmIChjdHhbM10gIT0gTlVMTCkKKwkJY19zc2w9KFNTTCAqKWN0eFszXTsKKwllbHNlCisJCWNfc3NsPVNTTF9uZXcoY19jdHgpOworCisJaWYgKChzX3NzbCA9PSBOVUxMKSB8fCAoY19zc2wgPT0gTlVMTCkpIGdvdG8gZXJyOworCisJY190b19zPUJJT19uZXcoQklPX3NfbWVtKCkpOworCXNfdG9fYz1CSU9fbmV3KEJJT19zX21lbSgpKTsKKwlpZiAoKHNfdG9fYyA9PSBOVUxMKSB8fCAoY190b19zID09IE5VTEwpKSBnb3RvIGVycjsKKworCWNfYmlvPUJJT19uZXcoQklPX2Zfc3NsKCkpOworCXNfYmlvPUJJT19uZXcoQklPX2Zfc3NsKCkpOworCWlmICgoY19iaW8gPT0gTlVMTCkgfHwgKHNfYmlvID09IE5VTEwpKSBnb3RvIGVycjsKKworCVNTTF9zZXRfY29ubmVjdF9zdGF0ZShjX3NzbCk7CisJU1NMX3NldF9iaW8oY19zc2wsc190b19jLGNfdG9fcyk7CisJQklPX3NldF9zc2woY19iaW8sY19zc2wsKGN0eFsyXSA9PSBOVUxMKT9CSU9fQ0xPU0U6QklPX05PQ0xPU0UpOworCisJU1NMX3NldF9hY2NlcHRfc3RhdGUoc19zc2wpOworCVNTTF9zZXRfYmlvKHNfc3NsLGNfdG9fcyxzX3RvX2MpOworCUJJT19zZXRfc3NsKHNfYmlvLHNfc3NsLChjdHhbM10gPT0gTlVMTCk/QklPX0NMT1NFOkJJT19OT0NMT1NFKTsKKworCWNfcj0wOyBzX3I9MTsKKwljX3c9MTsgc193PTA7CisJY193YW50PVdfV1JJVEU7CisJc193YW50PTA7CisJY193cml0ZT0xLHNfd3JpdGU9MDsKKworCS8qIFdlIGNhbiBhbHdheXMgZG8gd3JpdGVzICovCisJZm9yICg7OykKKwkJeworCQlkb19zZXJ2ZXI9MDsKKwkJZG9fY2xpZW50PTA7CisKKwkJaT0oaW50KUJJT19wZW5kaW5nKHNfYmlvKTsKKwkJaWYgKChpICYmIHNfcikgfHwgc193KSBkb19zZXJ2ZXI9MTsKKworCQlpPShpbnQpQklPX3BlbmRpbmcoY19iaW8pOworCQlpZiAoKGkgJiYgY19yKSB8fCBjX3cpIGRvX2NsaWVudD0xOworCisJCWlmIChkb19zZXJ2ZXIgJiYgdmVyYm9zZSkKKwkJCXsKKwkJCWlmIChTU0xfaW5faW5pdChzX3NzbCkpCisJCQkJcHJpbnRmKCJzZXJ2ZXIgd2FpdGluZyBpbiBTU0xfYWNjZXB0IC0gJXNcbiIsCisJCQkJCVNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhzX3NzbCkpOworCQkJZWxzZSBpZiAoc193cml0ZSkKKwkJCQlwcmludGYoInNlcnZlcjpTU0xfd3JpdGUoKVxuIik7CisJCQllbHNlIAorCQkJCXByaW50Zigic2VydmVyOlNTTF9yZWFkKClcbiIpOworCQkJfQorCisJCWlmIChkb19jbGllbnQgJiYgdmVyYm9zZSkKKwkJCXsKKwkJCWlmIChTU0xfaW5faW5pdChjX3NzbCkpCisJCQkJcHJpbnRmKCJjbGllbnQgd2FpdGluZyBpbiBTU0xfY29ubmVjdCAtICVzXG4iLAorCQkJCQlTU0xfc3RhdGVfc3RyaW5nX2xvbmcoY19zc2wpKTsKKwkJCWVsc2UgaWYgKGNfd3JpdGUpCisJCQkJcHJpbnRmKCJjbGllbnQ6U1NMX3dyaXRlKClcbiIpOworCQkJZWxzZQorCQkJCXByaW50ZigiY2xpZW50OlNTTF9yZWFkKClcbiIpOworCQkJfQorCisJCWlmICghZG9fY2xpZW50ICYmICFkb19zZXJ2ZXIpCisJCQl7CisJCQlmcHJpbnRmKHN0ZG91dCwiRVJST1IgSU4gU1RBUlRVUFxuIik7CisJCQlicmVhazsKKwkJCX0KKwkJaWYgKGRvX2NsaWVudCAmJiAhKGRvbmUgJiBDX0RPTkUpKQorCQkJeworCQkJaWYgKGNfd3JpdGUpCisJCQkJeworCQkJCWk9QklPX3dyaXRlKGNfYmlvLCJoZWxsbyBmcm9tIGNsaWVudFxuIiwxOCk7CisJCQkJaWYgKGkgPCAwKQorCQkJCQl7CisJCQkJCWNfcj0wOworCQkJCQljX3c9MDsKKwkJCQkJaWYgKEJJT19zaG91bGRfcmV0cnkoY19iaW8pKQorCQkJCQkJeworCQkJCQkJaWYgKEJJT19zaG91bGRfcmVhZChjX2JpbykpCisJCQkJCQkJY19yPTE7CisJCQkJCQlpZiAoQklPX3Nob3VsZF93cml0ZShjX2JpbykpCisJCQkJCQkJY193PTE7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCJFUlJPUiBpbiBDTElFTlRcbiIpOworCQkJCQkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCQkJCQkJcmV0dXJuKDEpOworCQkJCQkJfQorCQkJCQl9CisJCQkJZWxzZSBpZiAoaSA9PSAwKQorCQkJCQl7CisJCQkJCWZwcmludGYoc3RkZXJyLCJTU0wgQ0xJRU5UIFNUQVJUVVAgRkFJTEVEXG4iKTsKKwkJCQkJcmV0dXJuKDEpOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCS8qIG9rICovCisJCQkJCWNfd3JpdGU9MDsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaT1CSU9fcmVhZChjX2JpbyxjYnVmLDEwMCk7CisJCQkJaWYgKGkgPCAwKQorCQkJCQl7CisJCQkJCWNfcj0wOworCQkJCQljX3c9MDsKKwkJCQkJaWYgKEJJT19zaG91bGRfcmV0cnkoY19iaW8pKQorCQkJCQkJeworCQkJCQkJaWYgKEJJT19zaG91bGRfcmVhZChjX2JpbykpCisJCQkJCQkJY19yPTE7CisJCQkJCQlpZiAoQklPX3Nob3VsZF93cml0ZShjX2JpbykpCisJCQkJCQkJY193PTE7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCJFUlJPUiBpbiBDTElFTlRcbiIpOworCQkJCQkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCQkJCQkJcmV0dXJuKDEpOworCQkJCQkJfQorCQkJCQl9CisJCQkJZWxzZSBpZiAoaSA9PSAwKQorCQkJCQl7CisJCQkJCWZwcmludGYoc3RkZXJyLCJTU0wgQ0xJRU5UIFNUQVJUVVAgRkFJTEVEXG4iKTsKKwkJCQkJcmV0dXJuKDEpOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWRvbmV8PUNfRE9ORTsKKyNpZmRlZiB1bmRlZgorCQkJCQlmcHJpbnRmKHN0ZG91dCwiQ0xJRU5UOmZyb20gc2VydmVyOiIpOworCQkJCQlmd3JpdGUoY2J1ZiwxLGksc3Rkb3V0KTsKKwkJCQkJZmZsdXNoKHN0ZG91dCk7CisjZW5kaWYKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQlpZiAoZG9fc2VydmVyICYmICEoZG9uZSAmIFNfRE9ORSkpCisJCQl7CisJCQlpZiAoIXNfd3JpdGUpCisJCQkJeworCQkJCWk9QklPX3JlYWQoc19iaW8sc2J1ZiwxMDApOworCQkJCWlmIChpIDwgMCkKKwkJCQkJeworCQkJCQlzX3I9MDsKKwkJCQkJc193PTA7CisJCQkJCWlmIChCSU9fc2hvdWxkX3JldHJ5KHNfYmlvKSkKKwkJCQkJCXsKKwkJCQkJCWlmIChCSU9fc2hvdWxkX3JlYWQoc19iaW8pKQorCQkJCQkJCXNfcj0xOworCQkJCQkJaWYgKEJJT19zaG91bGRfd3JpdGUoc19iaW8pKQorCQkJCQkJCXNfdz0xOworCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwiRVJST1IgaW4gU0VSVkVSXG4iKTsKKwkJCQkJCUVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKwkJCQkJCXJldHVybigxKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWVsc2UgaWYgKGkgPT0gMCkKKwkJCQkJeworCQkJCQlmcHJpbnRmKHN0ZGVyciwiU1NMIFNFUlZFUiBTVEFSVFVQIEZBSUxFRFxuIik7CisJCQkJCXJldHVybigxKTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlzX3dyaXRlPTE7CisJCQkJCXNfdz0xOworI2lmZGVmIHVuZGVmCisJCQkJCWZwcmludGYoc3Rkb3V0LCJTRVJWRVI6ZnJvbSBjbGllbnQ6Iik7CisJCQkJCWZ3cml0ZShzYnVmLDEsaSxzdGRvdXQpOworCQkJCQlmZmx1c2goc3Rkb3V0KTsKKyNlbmRpZgorCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpPUJJT193cml0ZShzX2JpbywiaGVsbG8gZnJvbSBzZXJ2ZXJcbiIsMTgpOworCQkJCWlmIChpIDwgMCkKKwkJCQkJeworCQkJCQlzX3I9MDsKKwkJCQkJc193PTA7CisJCQkJCWlmIChCSU9fc2hvdWxkX3JldHJ5KHNfYmlvKSkKKwkJCQkJCXsKKwkJCQkJCWlmIChCSU9fc2hvdWxkX3JlYWQoc19iaW8pKQorCQkJCQkJCXNfcj0xOworCQkJCQkJaWYgKEJJT19zaG91bGRfd3JpdGUoc19iaW8pKQorCQkJCQkJCXNfdz0xOworCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwiRVJST1IgaW4gU0VSVkVSXG4iKTsKKwkJCQkJCUVSUl9wcmludF9lcnJvcnNfZnAoc3RkZXJyKTsKKwkJCQkJCXJldHVybigxKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWVsc2UgaWYgKGkgPT0gMCkKKwkJCQkJeworCQkJCQlmcHJpbnRmKHN0ZGVyciwiU1NMIFNFUlZFUiBTVEFSVFVQIEZBSUxFRFxuIik7CisJCQkJCXJldHVybigxKTsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlzX3dyaXRlPTA7CisJCQkJCXNfcj0xOworCQkJCQlkb25lfD1TX0RPTkU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJaWYgKChkb25lICYgU19ET05FKSAmJiAoZG9uZSAmIENfRE9ORSkpIGJyZWFrOworIyAgIGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkKKyAgICAgICAgVGhyZWFkU3dpdGNoV2l0aERlbGF5KCk7CisjICAgZW5kaWYKKwkJfQorCisJU1NMX3NldF9zaHV0ZG93bihjX3NzbCxTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOworCVNTTF9zZXRfc2h1dGRvd24oc19zc2wsU1NMX1NFTlRfU0hVVERPV058U1NMX1JFQ0VJVkVEX1NIVVRET1dOKTsKKworI2lmZGVmIHVuZGVmCisJZnByaW50ZihzdGRvdXQsIkRPTkVcbiIpOworI2VuZGlmCitlcnI6CisJLyogV2UgaGF2ZSB0byBzZXQgdGhlIEJJTydzIHRvIE5VTEwgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZQorCSAqIGZyZWUoKWVkIHR3aWNlLiAgT25jZSB3aGVuIHRoIHNfc3NsIGlzIFNTTF9mcmVlKCllZCBhbmQKKwkgKiBhZ2FpbiB3aGVuIGNfc3NsIGlzIFNTTF9mcmVlKCllZC4KKwkgKiBUaGlzIGlzIGEgaGFjayByZXF1aXJlZCBiZWNhdXNlIHNfc3NsIGFuZCBjX3NzbCBhcmUgc2hhcmluZyB0aGUgc2FtZQorCSAqIEJJTyBzdHJ1Y3R1cmUgYW5kIFNTTF9zZXRfYmlvKCkgYW5kIFNTTF9mcmVlKCkgYXV0b21hdGljYWxseQorCSAqIEJJT19mcmVlIG5vbiBOVUxMIGVudHJpZXMuCisJICogWW91IHNob3VsZCBub3Qgbm9ybWFsbHkgZG8gdGhpcyBvciBiZSByZXF1aXJlZCB0byBkbyB0aGlzICovCisKKwlpZiAoc19zc2wgIT0gTlVMTCkKKwkJeworCQlzX3NzbC0+cmJpbz1OVUxMOworCQlzX3NzbC0+d2Jpbz1OVUxMOworCQl9CisJaWYgKGNfc3NsICE9IE5VTEwpCisJCXsKKwkJY19zc2wtPnJiaW89TlVMTDsKKwkJY19zc2wtPndiaW89TlVMTDsKKwkJfQorCisJLyogVGhlIFNTTCdzIGFyZSBvcHRpb25hbGx5IGZyZWVkIGluIHRoZSBmb2xsb3dpbmcgY2FsbHMgKi8KKwlpZiAoY190b19zICE9IE5VTEwpIEJJT19mcmVlKGNfdG9fcyk7CisJaWYgKHNfdG9fYyAhPSBOVUxMKSBCSU9fZnJlZShzX3RvX2MpOworCisJaWYgKGNfYmlvICE9IE5VTEwpIEJJT19mcmVlKGNfYmlvKTsKKwlpZiAoc19iaW8gIT0gTlVMTCkgQklPX2ZyZWUoc19iaW8pOworCXJldHVybigwKTsKKwl9CisKK2ludCBNU19DQUxMQkFDSyB2ZXJpZnlfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwljaGFyICpzLCBidWZbMjU2XTsKKworCWlmICh2ZXJib3NlKQorCQl7CisJCXM9WDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGN0eC0+Y3VycmVudF9jZXJ0KSwKKwkJCQkgICAgYnVmLDI1Nik7CisJCWlmIChzICE9IE5VTEwpCisJCQl7CisJCQlpZiAob2spCisJCQkJZnByaW50ZihzdGRlcnIsImRlcHRoPSVkICVzXG4iLAorCQkJCQljdHgtPmVycm9yX2RlcHRoLGJ1Zik7CisJCQllbHNlCisJCQkJZnByaW50ZihzdGRlcnIsImRlcHRoPSVkIGVycm9yPSVkICVzXG4iLAorCQkJCQljdHgtPmVycm9yX2RlcHRoLGN0eC0+ZXJyb3IsYnVmKTsKKwkJCX0KKwkJfQorCXJldHVybihvayk7CisJfQorCisjZGVmaW5lIFRIUkVBRF9TVEFDS19TSVpFICgxNioxMDI0KQorCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzIKKworc3RhdGljIEhBTkRMRSAqbG9ja19jczsKKwordm9pZCB0aHJlYWRfc2V0dXAodm9pZCkKKwl7CisJaW50IGk7CisKKwlsb2NrX2NzPU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihIQU5ETEUpKTsKKwlmb3IgKGk9MDsgaTxDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKwkJeworCQlsb2NrX2NzW2ldPUNyZWF0ZU11dGV4KE5VTEwsRkFMU0UsTlVMTCk7CisJCX0KKworCUNSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjaygodm9pZCAoKikoaW50LGludCxjaGFyICosaW50KSl3aW4zMl9sb2NraW5nX2NhbGxiYWNrKTsKKwkvKiBpZCBjYWxsYmFjayBkZWZpbmVkICovCisJfQorCit2b2lkIHRocmVhZF9jbGVhbnVwKHZvaWQpCisJeworCWludCBpOworCisJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworCWZvciAoaT0wOyBpPENSWVBUT19udW1fbG9ja3MoKTsgaSsrKQorCQlDbG9zZUhhbmRsZShsb2NrX2NzW2ldKTsKKwlPUEVOU1NMX2ZyZWUobG9ja19jcyk7CisJfQorCit2b2lkIHdpbjMyX2xvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsIGludCB0eXBlLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKwl7CisJaWYgKG1vZGUgJiBDUllQVE9fTE9DSykKKwkJeworCQlXYWl0Rm9yU2luZ2xlT2JqZWN0KGxvY2tfY3NbdHlwZV0sSU5GSU5JVEUpOworCQl9CisJZWxzZQorCQl7CisJCVJlbGVhc2VNdXRleChsb2NrX2NzW3R5cGVdKTsKKwkJfQorCX0KKwordm9pZCBkb190aHJlYWRzKFNTTF9DVFggKnNfY3R4LCBTU0xfQ1RYICpjX2N0eCkKKwl7CisJZG91YmxlIHJldDsKKwlTU0xfQ1RYICpzc2xfY3R4WzJdOworCURXT1JEIHRocmVhZF9pZFtNQVhfVEhSRUFEX05VTUJFUl07CisJSEFORExFIHRocmVhZF9oYW5kbGVbTUFYX1RIUkVBRF9OVU1CRVJdOworCWludCBpOworCVNZU1RFTVRJTUUgc3RhcnQsZW5kOworCisJc3NsX2N0eFswXT1zX2N0eDsKKwlzc2xfY3R4WzFdPWNfY3R4OworCisJR2V0U3lzdGVtVGltZSgmc3RhcnQpOworCWZvciAoaT0wOyBpPHRocmVhZF9udW1iZXI7IGkrKykKKwkJeworCQl0aHJlYWRfaGFuZGxlW2ldPUNyZWF0ZVRocmVhZChOVUxMLAorCQkJVEhSRUFEX1NUQUNLX1NJWkUsCisJCQkoTFBUSFJFQURfU1RBUlRfUk9VVElORSluZG9pdCwKKwkJCSh2b2lkICopc3NsX2N0eCwKKwkJCTBMLAorCQkJJih0aHJlYWRfaWRbaV0pKTsKKwkJfQorCisJcHJpbnRmKCJyZWFwaW5nXG4iKTsKKwlmb3IgKGk9MDsgaTx0aHJlYWRfbnVtYmVyOyBpKz01MCkKKwkJeworCQlpbnQgajsKKworCQlqPSh0aHJlYWRfbnVtYmVyIDwgKGkrNTApKT8odGhyZWFkX251bWJlci1pKTo1MDsKKworCQlpZiAoV2FpdEZvck11bHRpcGxlT2JqZWN0cyhqLAorCQkJKENPTlNUIEhBTkRMRSAqKSYodGhyZWFkX2hhbmRsZVtpXSksVFJVRSxJTkZJTklURSkKKwkJCT09IFdBSVRfRkFJTEVEKQorCQkJeworCQkJZnByaW50ZihzdGRlcnIsIldhaXRGb3JNdWx0aXBsZU9iamVjdHMgZmFpbGVkOiVkXG4iLEdldExhc3RFcnJvcigpKTsKKwkJCWV4aXQoMSk7CisJCQl9CisJCX0KKwlHZXRTeXN0ZW1UaW1lKCZlbmQpOworCisJaWYgKHN0YXJ0LndEYXlPZldlZWsgPiBlbmQud0RheU9mV2VlaykgZW5kLndEYXlPZldlZWsrPTc7CisJcmV0PShlbmQud0RheU9mV2Vlay1zdGFydC53RGF5T2ZXZWVrKSoyNDsKKworCXJldD0ocmV0K2VuZC53SG91ci1zdGFydC53SG91cikqNjA7CisJcmV0PShyZXQrZW5kLndNaW51dGUtc3RhcnQud01pbnV0ZSkqNjA7CisJcmV0PShyZXQrZW5kLndTZWNvbmQtc3RhcnQud1NlY29uZCk7CisJcmV0Kz0oZW5kLndNaWxsaXNlY29uZHMtc3RhcnQud01pbGxpc2Vjb25kcykvMTAwMC4wOworCisJcHJpbnRmKCJ3aW4zMiB0aHJlYWRzIGRvbmUgLSAlLjNmIHNlY29uZHNcbiIscmV0KTsKKwl9CisKKyNlbmRpZiAvKiBPUEVOU1NMX1NZU19XSU4zMiAqLworCisjaWZkZWYgU09MQVJJUworCitzdGF0aWMgbXV0ZXhfdCAqbG9ja19jczsKKy8qc3RhdGljIHJ3bG9ja190ICpsb2NrX2NzOyAqLworc3RhdGljIGxvbmcgKmxvY2tfY291bnQ7CisKK3ZvaWQgdGhyZWFkX3NldHVwKHZvaWQpCisJeworCWludCBpOworCisJbG9ja19jcz1PUEVOU1NMX21hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YobXV0ZXhfdCkpOworCWxvY2tfY291bnQ9T1BFTlNTTF9tYWxsb2MoQ1JZUFRPX251bV9sb2NrcygpICogc2l6ZW9mKGxvbmcpKTsKKwlmb3IgKGk9MDsgaTxDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKwkJeworCQlsb2NrX2NvdW50W2ldPTA7CisJCS8qIHJ3bG9ja19pbml0KCYobG9ja19jc1tpXSksVVNZTkNfVEhSRUFELE5VTEwpOyAqLworCQltdXRleF9pbml0KCYobG9ja19jc1tpXSksVVNZTkNfVEhSRUFELE5VTEwpOworCQl9CisKKwlDUllQVE9fc2V0X2lkX2NhbGxiYWNrKCh1bnNpZ25lZCBsb25nICgqKSgpKXNvbGFyaXNfdGhyZWFkX2lkKTsKKwlDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soKHZvaWQgKCopKCkpc29sYXJpc19sb2NraW5nX2NhbGxiYWNrKTsKKwl9CisKK3ZvaWQgdGhyZWFkX2NsZWFudXAodm9pZCkKKwl7CisJaW50IGk7CisKKwlDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisKKwlmcHJpbnRmKHN0ZGVyciwiY2xlYW51cFxuIik7CisKKwlmb3IgKGk9MDsgaTxDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKwkJeworCQkvKiByd2xvY2tfZGVzdHJveSgmKGxvY2tfY3NbaV0pKTsgKi8KKwkJbXV0ZXhfZGVzdHJveSgmKGxvY2tfY3NbaV0pKTsKKwkJZnByaW50ZihzdGRlcnIsIiU4bGQ6JXNcbiIsbG9ja19jb3VudFtpXSxDUllQVE9fZ2V0X2xvY2tfbmFtZShpKSk7CisJCX0KKwlPUEVOU1NMX2ZyZWUobG9ja19jcyk7CisJT1BFTlNTTF9mcmVlKGxvY2tfY291bnQpOworCisJZnByaW50ZihzdGRlcnIsImRvbmUgY2xlYW51cFxuIik7CisKKwl9CisKK3ZvaWQgc29sYXJpc19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLCBpbnQgdHlwZSwgY2hhciAqZmlsZSwgaW50IGxpbmUpCisJeworI2lmZGVmIHVuZGVmCisJZnByaW50ZihzdGRlcnIsInRocmVhZD0lNGQgbW9kZT0lcyBsb2NrPSVzICVzOiVkXG4iLAorCQlDUllQVE9fdGhyZWFkX2lkKCksCisJCShtb2RlJkNSWVBUT19MT0NLKT8ibCI6InUiLAorCQkodHlwZSZDUllQVE9fUkVBRCk/InIiOiJ3IixmaWxlLGxpbmUpOworI2VuZGlmCisKKwkvKgorCWlmIChDUllQVE9fTE9DS19TU0xfQ0VSVCA9PSB0eXBlKQorCWZwcmludGYoc3RkZXJyLCIodCxtLGYsbCkgJWxkICVkICVzICVkXG4iLAorCQlDUllQVE9fdGhyZWFkX2lkKCksCisJCW1vZGUsZmlsZSxsaW5lKTsKKwkqLworCWlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCisJCXsKKwkvKglpZiAobW9kZSAmIENSWVBUT19SRUFEKQorCQkJcndfcmRsb2NrKCYobG9ja19jc1t0eXBlXSkpOworCQllbHNlCisJCQlyd193cmxvY2soJihsb2NrX2NzW3R5cGVdKSk7ICovCisKKwkJbXV0ZXhfbG9jaygmKGxvY2tfY3NbdHlwZV0pKTsKKwkJbG9ja19jb3VudFt0eXBlXSsrOworCQl9CisJZWxzZQorCQl7CisvKgkJcndfdW5sb2NrKCYobG9ja19jc1t0eXBlXSkpOyAgKi8KKwkJbXV0ZXhfdW5sb2NrKCYobG9ja19jc1t0eXBlXSkpOworCQl9CisJfQorCit2b2lkIGRvX3RocmVhZHMoU1NMX0NUWCAqc19jdHgsIFNTTF9DVFggKmNfY3R4KQorCXsKKwlTU0xfQ1RYICpzc2xfY3R4WzJdOworCXRocmVhZF90IHRocmVhZF9jdHhbTUFYX1RIUkVBRF9OVU1CRVJdOworCWludCBpOworCisJc3NsX2N0eFswXT1zX2N0eDsKKwlzc2xfY3R4WzFdPWNfY3R4OworCisJdGhyX3NldGNvbmN1cnJlbmN5KHRocmVhZF9udW1iZXIpOworCWZvciAoaT0wOyBpPHRocmVhZF9udW1iZXI7IGkrKykKKwkJeworCQl0aHJfY3JlYXRlKE5VTEwsIFRIUkVBRF9TVEFDS19TSVpFLAorCQkJKHZvaWQgKigqKSgpKW5kb2l0LAorCQkJKHZvaWQgKilzc2xfY3R4LAorCQkJMEwsCisJCQkmKHRocmVhZF9jdHhbaV0pKTsKKwkJfQorCisJcHJpbnRmKCJyZWFwaW5nXG4iKTsKKwlmb3IgKGk9MDsgaTx0aHJlYWRfbnVtYmVyOyBpKyspCisJCXsKKwkJdGhyX2pvaW4odGhyZWFkX2N0eFtpXSxOVUxMLE5VTEwpOworCQl9CisKKwlwcmludGYoInNvbGFyaXMgdGhyZWFkcyBkb25lICglZCwlZClcbiIsCisJCXNfY3R4LT5yZWZlcmVuY2VzLGNfY3R4LT5yZWZlcmVuY2VzKTsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgc29sYXJpc190aHJlYWRfaWQodm9pZCkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlyZXQ9KHVuc2lnbmVkIGxvbmcpdGhyX3NlbGYoKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYgLyogU09MQVJJUyAqLworCisjaWZkZWYgSVJJWAorCisKK3N0YXRpYyB1c3B0cl90ICphcmVuYTsKK3N0YXRpYyB1c2VtYV90ICoqbG9ja19jczsKKwordm9pZCB0aHJlYWRfc2V0dXAodm9pZCkKKwl7CisJaW50IGk7CisJY2hhciBmaWxlbmFtZVsyMF07CisKKwlzdHJjcHkoZmlsZW5hbWUsIi90bXAvbXR0ZXN0LlhYWFhYWCIpOworCW1rdGVtcChmaWxlbmFtZSk7CisKKwl1c2NvbmZpZyhDT05GX1NUSFJFQURJT09GRik7CisJdXNjb25maWcoQ09ORl9TVEhSRUFETUFMTE9DT0ZGKTsKKwl1c2NvbmZpZyhDT05GX0lOSVRVU0VSUywxMDApOworCXVzY29uZmlnKENPTkZfTE9DS1RZUEUsVVNfREVCVUdQTFVTKTsKKwlhcmVuYT11c2luaXQoZmlsZW5hbWUpOworCXVubGluayhmaWxlbmFtZSk7CisKKwlsb2NrX2NzPU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZih1c2VtYV90ICopKTsKKwlmb3IgKGk9MDsgaTxDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKwkJeworCQlsb2NrX2NzW2ldPXVzbmV3c2VtYShhcmVuYSwxKTsKKwkJfQorCisJQ1JZUFRPX3NldF9pZF9jYWxsYmFjaygodW5zaWduZWQgbG9uZyAoKikoKSlpcml4X3RocmVhZF9pZCk7CisJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKCh2b2lkICgqKSgpKWlyaXhfbG9ja2luZ19jYWxsYmFjayk7CisJfQorCit2b2lkIHRocmVhZF9jbGVhbnVwKHZvaWQpCisJeworCWludCBpOworCisJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworCWZvciAoaT0wOyBpPENSWVBUT19udW1fbG9ja3MoKTsgaSsrKQorCQl7CisJCWNoYXIgYnVmWzEwXTsKKworCQlzcHJpbnRmKGJ1ZiwiJTJkOiIsaSk7CisJCXVzZHVtcHNlbWEobG9ja19jc1tpXSxzdGRvdXQsYnVmKTsKKwkJdXNmcmVlc2VtYShsb2NrX2NzW2ldLGFyZW5hKTsKKwkJfQorCU9QRU5TU0xfZnJlZShsb2NrX2NzKTsKKwl9CisKK3ZvaWQgaXJpeF9sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLCBpbnQgdHlwZSwgY2hhciAqZmlsZSwgaW50IGxpbmUpCisJeworCWlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCisJCXsKKwkJcHJpbnRmKCJsb2NrICVkXG4iLHR5cGUpOworCQl1c3BzZW1hKGxvY2tfY3NbdHlwZV0pOworCQl9CisJZWxzZQorCQl7CisJCXByaW50ZigidW5sb2NrICVkXG4iLHR5cGUpOworCQl1c3ZzZW1hKGxvY2tfY3NbdHlwZV0pOworCQl9CisJfQorCit2b2lkIGRvX3RocmVhZHMoU1NMX0NUWCAqc19jdHgsIFNTTF9DVFggKmNfY3R4KQorCXsKKwlTU0xfQ1RYICpzc2xfY3R4WzJdOworCWludCB0aHJlYWRfY3R4W01BWF9USFJFQURfTlVNQkVSXTsKKwlpbnQgaTsKKworCXNzbF9jdHhbMF09c19jdHg7CisJc3NsX2N0eFsxXT1jX2N0eDsKKworCWZvciAoaT0wOyBpPHRocmVhZF9udW1iZXI7IGkrKykKKwkJeworCQl0aHJlYWRfY3R4W2ldPXNwcm9jKCh2b2lkICgqKSgpKW5kb2l0LAorCQkJUFJfU0FERFJ8UFJfU0ZEUywodm9pZCAqKXNzbF9jdHgpOworCQl9CisKKwlwcmludGYoInJlYXBpbmdcbiIpOworCWZvciAoaT0wOyBpPHRocmVhZF9udW1iZXI7IGkrKykKKwkJeworCQl3YWl0KE5VTEwpOworCQl9CisKKwlwcmludGYoImlyaXggdGhyZWFkcyBkb25lICglZCwlZClcbiIsCisJCXNfY3R4LT5yZWZlcmVuY2VzLGNfY3R4LT5yZWZlcmVuY2VzKTsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgaXJpeF90aHJlYWRfaWQodm9pZCkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlyZXQ9KHVuc2lnbmVkIGxvbmcpZ2V0cGlkKCk7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmIC8qIElSSVggKi8KKworI2lmZGVmIFBUSFJFQURTCisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgKmxvY2tfY3M7CitzdGF0aWMgbG9uZyAqbG9ja19jb3VudDsKKwordm9pZCB0aHJlYWRfc2V0dXAodm9pZCkKKwl7CisJaW50IGk7CisKKwlsb2NrX2NzPU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihwdGhyZWFkX211dGV4X3QpKTsKKwlsb2NrX2NvdW50PU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihsb25nKSk7CisJZm9yIChpPTA7IGk8Q1JZUFRPX251bV9sb2NrcygpOyBpKyspCisJCXsKKwkJbG9ja19jb3VudFtpXT0wOworCQlwdGhyZWFkX211dGV4X2luaXQoJihsb2NrX2NzW2ldKSxOVUxMKTsKKwkJfQorCisJQ1JZUFRPX3NldF9pZF9jYWxsYmFjaygodW5zaWduZWQgbG9uZyAoKikoKSlwdGhyZWFkc190aHJlYWRfaWQpOworCUNSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjaygodm9pZCAoKikoKSlwdGhyZWFkc19sb2NraW5nX2NhbGxiYWNrKTsKKwl9CisKK3ZvaWQgdGhyZWFkX2NsZWFudXAodm9pZCkKKwl7CisJaW50IGk7CisKKwlDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisJZnByaW50ZihzdGRlcnIsImNsZWFudXBcbiIpOworCWZvciAoaT0wOyBpPENSWVBUT19udW1fbG9ja3MoKTsgaSsrKQorCQl7CisJCXB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmKGxvY2tfY3NbaV0pKTsKKwkJZnByaW50ZihzdGRlcnIsIiU4bGQ6JXNcbiIsbG9ja19jb3VudFtpXSwKKwkJCUNSWVBUT19nZXRfbG9ja19uYW1lKGkpKTsKKwkJfQorCU9QRU5TU0xfZnJlZShsb2NrX2NzKTsKKwlPUEVOU1NMX2ZyZWUobG9ja19jb3VudCk7CisKKwlmcHJpbnRmKHN0ZGVyciwiZG9uZSBjbGVhbnVwXG4iKTsKKwl9CisKK3ZvaWQgcHRocmVhZHNfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSwgaW50IHR5cGUsIGNoYXIgKmZpbGUsCisJICAgICBpbnQgbGluZSkKKyAgICAgIHsKKyNpZmRlZiB1bmRlZgorCWZwcmludGYoc3RkZXJyLCJ0aHJlYWQ9JTRkIG1vZGU9JXMgbG9jaz0lcyAlczolZFxuIiwKKwkJQ1JZUFRPX3RocmVhZF9pZCgpLAorCQkobW9kZSZDUllQVE9fTE9DSyk/ImwiOiJ1IiwKKwkJKHR5cGUmQ1JZUFRPX1JFQUQpPyJyIjoidyIsZmlsZSxsaW5lKTsKKyNlbmRpZgorLyoKKwlpZiAoQ1JZUFRPX0xPQ0tfU1NMX0NFUlQgPT0gdHlwZSkKKwkJZnByaW50ZihzdGRlcnIsIih0LG0sZixsKSAlbGQgJWQgJXMgJWRcbiIsCisJCUNSWVBUT190aHJlYWRfaWQoKSwKKwkJbW9kZSxmaWxlLGxpbmUpOworKi8KKwlpZiAobW9kZSAmIENSWVBUT19MT0NLKQorCQl7CisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmKGxvY2tfY3NbdHlwZV0pKTsKKwkJbG9ja19jb3VudFt0eXBlXSsrOworCQl9CisJZWxzZQorCQl7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYobG9ja19jc1t0eXBlXSkpOworCQl9CisJfQorCit2b2lkIGRvX3RocmVhZHMoU1NMX0NUWCAqc19jdHgsIFNTTF9DVFggKmNfY3R4KQorCXsKKwlTU0xfQ1RYICpzc2xfY3R4WzJdOworCXB0aHJlYWRfdCB0aHJlYWRfY3R4W01BWF9USFJFQURfTlVNQkVSXTsKKwlpbnQgaTsKKworCXNzbF9jdHhbMF09c19jdHg7CisJc3NsX2N0eFsxXT1jX2N0eDsKKworCS8qCisJdGhyX3NldGNvbmN1cnJlbmN5KHRocmVhZF9udW1iZXIpOworCSovCisJZm9yIChpPTA7IGk8dGhyZWFkX251bWJlcjsgaSsrKQorCQl7CisJCXB0aHJlYWRfY3JlYXRlKCYodGhyZWFkX2N0eFtpXSksIE5VTEwsCisJCQkodm9pZCAqKCopKCkpbmRvaXQsICh2b2lkICopc3NsX2N0eCk7CisJCX0KKworCXByaW50ZigicmVhcGluZ1xuIik7CisJZm9yIChpPTA7IGk8dGhyZWFkX251bWJlcjsgaSsrKQorCQl7CisJCXB0aHJlYWRfam9pbih0aHJlYWRfY3R4W2ldLE5VTEwpOworCQl9CisKKwlwcmludGYoInB0aHJlYWRzIHRocmVhZHMgZG9uZSAoJWQsJWQpXG4iLAorCQlzX2N0eC0+cmVmZXJlbmNlcyxjX2N0eC0+cmVmZXJlbmNlcyk7CisJfQorCit1bnNpZ25lZCBsb25nIHB0aHJlYWRzX3RocmVhZF9pZCh2b2lkKQorCXsKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXJldD0odW5zaWduZWQgbG9uZylwdGhyZWFkX3NlbGYoKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNlbmRpZiAvKiBQVEhSRUFEUyAqLworCisKKworI2lmZGVmIE9QRU5TU0xfU1lTX05FVFdBUkUKKwordm9pZCB0aHJlYWRfc2V0dXAodm9pZCkKK3sKKyAgIGludCBpOworCisgICBsb2NrX2NzPU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihNUEtNdXRleCkpOworICAgbG9ja19jb3VudD1PUEVOU1NMX21hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YobG9uZykpOworICAgZm9yIChpPTA7IGk8Q1JZUFRPX251bV9sb2NrcygpOyBpKyspCisgICB7CisgICAgICBsb2NrX2NvdW50W2ldPTA7CisgICAgICBsb2NrX2NzW2ldPU1QS011dGV4QWxsb2MoIk9wZW5TU0wgbXV0ZXgiKTsKKyAgIH0KKworICAgVGhyZWFkU2VtID0gTVBLU2VtYXBob3JlQWxsb2MoIk9wZW5TU0wgbXR0ZXN0IHNlbWFwaG9yZSIsIDAgKTsKKworICAgQ1JZUFRPX3NldF9pZF9jYWxsYmFjaygodW5zaWduZWQgbG9uZyAoKikoKSluZXR3YXJlX3RocmVhZF9pZCk7CisgICBDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soKHZvaWQgKCopKCkpbmV0d2FyZV9sb2NraW5nX2NhbGxiYWNrKTsKK30KKwordm9pZCB0aHJlYWRfY2xlYW51cCh2b2lkKQoreworICAgaW50IGk7CisKKyAgIENSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKworICAgZnByaW50ZihzdGRvdXQsInRocmVhZF9jbGVhbnVwXG4iKTsKKworICAgZm9yIChpPTA7IGk8Q1JZUFRPX251bV9sb2NrcygpOyBpKyspCisgICB7CisgICAgICBNUEtNdXRleEZyZWUobG9ja19jc1tpXSk7CisgICAgICBmcHJpbnRmKHN0ZG91dCwiJThsZDolc1xuIixsb2NrX2NvdW50W2ldLENSWVBUT19nZXRfbG9ja19uYW1lKGkpKTsKKyAgIH0KKyAgIE9QRU5TU0xfZnJlZShsb2NrX2NzKTsKKyAgIE9QRU5TU0xfZnJlZShsb2NrX2NvdW50KTsKKworICAgTVBLU2VtYXBob3JlRnJlZShUaHJlYWRTZW0pOworCisgICBmcHJpbnRmKHN0ZG91dCwiZG9uZSBjbGVhbnVwXG4iKTsKK30KKwordm9pZCBuZXR3YXJlX2xvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsIGludCB0eXBlLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKK3sKKyAgIGlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCisgICB7CisgICAgICBNUEtNdXRleExvY2sobG9ja19jc1t0eXBlXSk7CisgICAgICBsb2NrX2NvdW50W3R5cGVdKys7CisgICB9CisgICBlbHNlCisgICAgICBNUEtNdXRleFVubG9jayhsb2NrX2NzW3R5cGVdKTsKK30KKwordm9pZCBkb190aHJlYWRzKFNTTF9DVFggKnNfY3R4LCBTU0xfQ1RYICpjX2N0eCkKK3sKKyAgIFNTTF9DVFggKnNzbF9jdHhbMl07CisgICBpbnQgaTsKKyAgIHNzbF9jdHhbMF09c19jdHg7CisgICBzc2xfY3R4WzFdPWNfY3R4OworCisgICBmb3IgKGk9MDsgaTx0aHJlYWRfbnVtYmVyOyBpKyspCisgICB7CisgICAgICBCZWdpblRocmVhZCggKHZvaWQoKikodm9pZCopKW5kb2l0LCBOVUxMLCBUSFJFQURfU1RBQ0tfU0laRSwgCisgICAgICAgICAgICAgICAgICAgKHZvaWQqKXNzbF9jdHgpOworICAgICAgVGhyZWFkU3dpdGNoV2l0aERlbGF5KCk7CisgICB9CisKKyAgIHByaW50ZigicmVhcGluZ1xuIik7CisKKyAgICAgIC8qIGxvb3AgdW50aWwgYWxsIHRocmVhZHMgaGF2ZSBzaWduYWxlZCB0aGUgc2VtYXBob3JlICovCisgICBmb3IgKGk9MDsgaTx0aHJlYWRfbnVtYmVyOyBpKyspCisgICB7CisgICAgICBNUEtTZW1hcGhvcmVXYWl0KFRocmVhZFNlbSk7CisgICB9CisgICBwcmludGYoIm5ldHdhcmUgdGhyZWFkcyBkb25lICglZCwlZClcbiIsCisgICAgICAgICBzX2N0eC0+cmVmZXJlbmNlcyxjX2N0eC0+cmVmZXJlbmNlcyk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbmV0d2FyZV90aHJlYWRfaWQodm9pZCkKK3sKKyAgIHVuc2lnbmVkIGxvbmcgcmV0OworCisgICByZXQ9KHVuc2lnbmVkIGxvbmcpR2V0VGhyZWFkSUQoKTsKKyAgIHJldHVybihyZXQpOworfQorI2VuZGlmIC8qIE5FVFdBUkUgKi8KKworI2lmZGVmIEJFT1NfVEhSRUFEUworCisjaW5jbHVkZSA8TG9ja2VyLmg+CisKK3N0YXRpYyBCTG9ja2VyKiogbG9ja19jczsKK3N0YXRpYyBsb25nKiBsb2NrX2NvdW50OworCit2b2lkIHRocmVhZF9zZXR1cCh2b2lkKQorCXsKKwlpbnQgaTsKKworCWxvY2tfY3M9KEJMb2NrZXIqKilPUEVOU1NMX21hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YoQkxvY2tlciopKTsKKwlsb2NrX2NvdW50PShsb25nKilPUEVOU1NMX21hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YobG9uZykpOworCWZvciAoaT0wOyBpPENSWVBUT19udW1fbG9ja3MoKTsgaSsrKQorCQl7CisJCWxvY2tfY291bnRbaV09MDsKKwkJbG9ja19jc1tpXSA9IG5ldyBCTG9ja2VyKENSWVBUT19nZXRfbG9ja19uYW1lKGkpKTsKKwkJfQorCisJQ1JZUFRPX3NldF9pZF9jYWxsYmFjaygodW5zaWduZWQgbG9uZyAoKikoKSliZW9zX3RocmVhZF9pZCk7CisJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGJlb3NfbG9ja2luZ19jYWxsYmFjayk7CisJfQorCit2b2lkIHRocmVhZF9jbGVhbnVwKHZvaWQpCisJeworCWludCBpOworCisJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKE5VTEwpOworCWZwcmludGYoc3RkZXJyLCJjbGVhbnVwXG4iKTsKKwlmb3IgKGk9MDsgaTxDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKwkJeworCQlkZWxldGUgbG9ja19jc1tpXTsKKwkJZnByaW50ZihzdGRlcnIsIiU4bGQ6JXNcbiIsbG9ja19jb3VudFtpXSwKKwkJCUNSWVBUT19nZXRfbG9ja19uYW1lKGkpKTsKKwkJfQorCU9QRU5TU0xfZnJlZShsb2NrX2NzKTsKKwlPUEVOU1NMX2ZyZWUobG9ja19jb3VudCk7CisKKwlmcHJpbnRmKHN0ZGVyciwiZG9uZSBjbGVhbnVwXG4iKTsKKwl9CisKK3ZvaWQgYmVvc19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLCBpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCisgICAgeworI2lmIDAKKwlmcHJpbnRmKHN0ZGVyciwidGhyZWFkPSU0ZCBtb2RlPSVzIGxvY2s9JXMgJXM6JWRcbiIsCisJCUNSWVBUT190aHJlYWRfaWQoKSwKKwkJKG1vZGUmQ1JZUFRPX0xPQ0spPyJsIjoidSIsCisJCSh0eXBlJkNSWVBUT19SRUFEKT8iciI6InciLGZpbGUsbGluZSk7CisjZW5kaWYKKwlpZiAobW9kZSAmIENSWVBUT19MT0NLKQorCQl7CisJCWxvY2tfY3NbdHlwZV0tPkxvY2soKTsKKwkJbG9ja19jb3VudFt0eXBlXSsrOworCQl9CisJZWxzZQorCQl7CisJCWxvY2tfY3NbdHlwZV0tPlVubG9jaygpOworCQl9CisJfQorCit2b2lkIGRvX3RocmVhZHMoU1NMX0NUWCAqc19jdHgsIFNTTF9DVFggKmNfY3R4KQorCXsKKwlTU0xfQ1RYICpzc2xfY3R4WzJdOworCXRocmVhZF9pZCB0aHJlYWRfY3R4W01BWF9USFJFQURfTlVNQkVSXTsKKwlpbnQgaTsKKworCXNzbF9jdHhbMF09c19jdHg7CisJc3NsX2N0eFsxXT1jX2N0eDsKKworCWZvciAoaT0wOyBpPHRocmVhZF9udW1iZXI7IGkrKykKKwkJeworCQl0aHJlYWRfY3R4W2ldID0gc3Bhd25fdGhyZWFkKCh0aHJlYWRfZnVuYyluZG9pdCwKKwkJCU5VTEwsIEJfTk9STUFMX1BSSU9SSVRZLCAodm9pZCAqKXNzbF9jdHgpOworCQlyZXN1bWVfdGhyZWFkKHRocmVhZF9jdHhbaV0pOworCQl9CisKKwlwcmludGYoIndhaXRpbmcuLi5cbiIpOworCWZvciAoaT0wOyBpPHRocmVhZF9udW1iZXI7IGkrKykKKwkJeworCQlzdGF0dXNfdCByZXN1bHQ7CisJCXdhaXRfZm9yX3RocmVhZCh0aHJlYWRfY3R4W2ldLCAmcmVzdWx0KTsKKwkJfQorCisJcHJpbnRmKCJiZW9zIHRocmVhZHMgZG9uZSAoJWQsJWQpXG4iLAorCQlzX2N0eC0+cmVmZXJlbmNlcyxjX2N0eC0+cmVmZXJlbmNlcyk7CisJfQorCit1bnNpZ25lZCBsb25nIGJlb3NfdGhyZWFkX2lkKHZvaWQpCisJeworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJcmV0PSh1bnNpZ25lZCBsb25nKWZpbmRfdGhyZWFkKE5VTEwpOworCXJldHVybihyZXQpOworCX0KKworI2VuZGlmIC8qIEJFT1NfVEhSRUFEUyAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvbmV0d2FyZS5iYXQgYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9uZXR3YXJlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjNlY2EzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvbmV0d2FyZS5iYXQKQEAgLTAsMCArMSw3OSBAQAorQGVjaG8gb2ZmCityZW0gYmF0Y2ggZmlsZSB0byBidWlsZCBtdWx0aS10aHJlYWQgdGVzdCAoIG10dGVzdC5ubG0gKQorCityZW0gY29tbWFuZCBsaW5lIGFyZ3VtZW50czoKK3JlbSAgICAgIGRlYnVnID0+IGJ1aWxkIHVzaW5nIGRlYnVnIHNldHRpbmdzCisKK3JlbQorcmVtIEFmdGVyIGJ1aWxkaW5nLCBjb3B5IG10dGVzdC5ubG0gdG8gdGhlIHNlcnZlciBhbmQgcnVuIGl0LCB5b3UnbGwgcHJvYmFibHkKK3JlbSB3YW50IHRvIHJlZGlyZWN0IHN0ZG91dCBhbmQgc3RkZXJyLiAgQW4gZXhhbXBsZSBjb21tYW5kIGxpbmUgd291bGQgYmUKK3JlbSAibXR0ZXN0Lm5sbSAtdGhyZWFkIDIwIC1sb29wcyAxMCAtQ0FmaWxlIFxvcGVuc3NsXGFwcHNcc2VydmVyLnBlbSA+bXR0ZXN0Lm91dCAyPm10dGVzdC5lcnIiCityZW0gCisKK2RlbCBtdHRlc3QubmxtCisKK3NldCBCTERfREVCVUc9CitzZXQgQ0ZMQUdTPQorc2V0IExGTEFHUz0KK3NldCBMSUJTPQorCitpZiAiJTEiID09ICJERUJVRyIgc2V0IEJMRF9ERUJVRz1ZRVMKK2lmICIlMSIgPT0gImRlYnVnIiBzZXQgQkxEX0RFQlVHPVlFUworCitpZiAiJU1XQ0luY2x1ZGVzJSIgPT0gIiIgZ290byBpbmNfZXJyb3IKK2lmICIlUFJFTFVERSUiID09ICIiIGdvdG8gcHJlbHVkZV9lcnJvcgoraWYgIiVJTVBPUlRTJSIgPT0gIiIgZ290byBpbXBvcnRzX2Vycm9yCisKK3NldCBDRkxBR1M9LWMgLUkuLlwuLlxvdXRpbmNfbncgLW5vc3lzcGF0aCAtRE9QRU5TU0xfU1lTX05FVFdBUkUgLW9wdCBvZmYgLWcgLXN5bSBpbnRlcm5hbCAtbWF4ZXJyb3JzIDIwCisKK2lmICIlQkxEX0RFQlVHJSIgPT0gIllFUyIgc2V0IExJQlM9Li5cLi5cb3V0X253LmRiZ1xzc2wubGliIC4uXC4uXG91dF9udy5kYmdcY3J5cHRvLmxpYgoraWYgIiVCTERfREVCVUclIiA9PSAiIiAgc2V0IExJQlM9Li5cLi5cb3V0X253XHNzbC5saWIgLi5cLi5cb3V0X253XGNyeXB0by5saWIKKworc2V0IExGTEFHUz0tbXNnc3R5bGUgZ2NjIC16ZXJvYnNzIC1zdGFja3NpemUgMzI3NjggLW5vc3RkbGliIC1zeW0gaW50ZXJuYWwgCisgIAorcmVtIGdlbmVyYXRlIGNvbW1hbmQgZmlsZSBmb3IgbWV0cm93ZXJrcworZWNoby4KK2VjaG8gR2VuZXJhdGluZyBNZXRyb3dlcmtzIGNvbW1hbmQgZmlsZTogbXR0ZXN0LmRlZgorZWNobyAjIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBjb21tYW5kIGZpbGUgZm9yIG1ldHJvd2Vya3MgYnVpbGQgPiBtdHRlc3QuZGVmCitlY2hvIElNUE9SVCBAJUlNUE9SVFMlXGNsaWIuaW1wICAgICAgICAgICAgICA+PiBtdHRlc3QuZGVmIAorZWNobyBJTVBPUlQgQCVJTVBPUlRTJVx0aHJlYWRzLmltcCAgICAgICAgICAgPj4gbXR0ZXN0LmRlZiAKK2VjaG8gSU1QT1JUIEAlSU1QT1JUUyVcd3MybmxtLmltcCAgICAgICAgICAgID4+IG10dGVzdC5kZWYgCitlY2hvIElNUE9SVCBHZXRQcm9jZXNzU3dpdGNoQ291bnQgICAgICAgICAgICA+PiBtdHRlc3QuZGVmCitlY2hvIE1PRFVMRSBjbGliICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBtdHRlc3QuZGVmIAorCityZW0gY29tcGlsZQorZWNoby4KK2VjaG8gQ29tcGlsaW5nIG10dGVzdC5jCittd2NjbmxtLmV4ZSBtdHRlc3QuYyAlQ0ZMQUdTJSAKK2lmIGVycm9ybGV2ZWwgMSBnb3RvIGVuZAorCityZW0gbGluayAgICAgICAgICAgICAgIAorZWNoby4KK2VjaG8gTGlua2luZyBtdHRlc3QubmxtCittd2xkbmxtLmV4ZSAlTEZMQUdTJSAtc2NyZWVubmFtZSBtdHRlc3QgLWNvbW1hbmRmaWxlIG10dGVzdC5kZWYgbXR0ZXN0Lm8gIiVQUkVMVURFJSIgJUxJQlMlIC1vIG10dGVzdC5ubG0KK2lmIGVycm9ybGV2ZWwgMSBnb3RvIGVuZAorCitnb3RvIGVuZAorCis6aW5jX2Vycm9yCitlY2hvLgorZWNobyBFbnZpcm9ubWVudCB2YXJpYWJsZSBNV0NJbmNsdWRlcyBpcyBub3Qgc2V0IC0gc2VlIGluc3RhbGwubncKK2dvdG8gZW5kCisKKzpwcmVsdWRlX2Vycm9yCitlY2hvLgorZWNobyBFbnZpcm9ubWVudCB2YXJpYWJsZSBQUkVMVURFIGlzIG5vdCBzZXQgLSBzZWUgaW5zdGFsbC5udworZ290byBlbmQKKworOmltcG9ydHNfZXJyb3IKK2VjaG8uCitlY2hvIEVudmlyb25tZW50IHZhcmlhYmxlIElNUE9SVFMgaXMgbm90IHNldCAtIHNlZSBpbnN0YWxsLm53Citnb3RvIGVuZAorICAgIAorICAgIAorOmVuZAorc2V0IEJMRF9ERUJVRz0KK3NldCBDRkxBR1M9CitzZXQgTEZMQUdTPQorc2V0IExJQlM9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by90aHJlYWRzL3Byb2ZpbGUuc2ggYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9wcm9maWxlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlM2UzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9wcm9maWxlLnNoCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisvYmluL3JtIC1mIG10dGVzdAorY2MgLXAgLURTT0xBUklTIC1JLi4vLi4vaW5jbHVkZSAtZyBtdHRlc3QuYyAtbyBtdHRlc3QgLUwvdXNyL2xpYi9saWJjIC1sZGwgLUwuLi8uLiAtbHRocmVhZCAgLWxzc2wgLWxjcnlwdG8gLWxuc2wgLWxzb2NrZXQKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvcHRlc3QuYmF0IGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvcHRlc3QuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzFiNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9wdGVzdC5iYXQKQEAgLTAsMCArMSw0IEBACitkZWwgbXR0ZXN0LmV4ZQorCitwdXJpZnkgY2wgL08yIC1EV0lOMzIgL01EIC1JLi5cLi5cb3V0IG10dGVzdC5jIC9GZW10dGVzdCAuLlwuLlxvdXRcc3NsMzIubGliIC4uXC4uXG91dFxjcnlwdDMyLmxpYgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9wdGhyZWFkLnNoIGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvcHRocmVhZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM0OTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvcHRocmVhZC5zaApAQCAtMCwwICsxLDkgQEAKKyMhL2Jpbi9zaAorIworIyBidWlsZCB1c2luZyBwdGhyZWFkcworIworIyBodHRwOi8vd3d3Lm1pdC5lZHU6ODAwMS9wZW9wbGUvcHJvdmVuL3B0aHJlYWRzLmh0bWwKKyMKKy9iaW4vcm0gLWYgbXR0ZXN0CitwZ2NjIC1EUFRIUkVBRFMgLUkuLi8uLi9pbmNsdWRlIC1nIG10dGVzdC5jIC1vIG10dGVzdCAtTC4uLy4uIC1sc3NsIC1sY3J5cHRvIAorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9wdGhyZWFkMi5zaCBiL2xpYi9vcGVuc3NsL2NyeXB0by90aHJlYWRzL3B0aHJlYWQyLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjY0YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9wdGhyZWFkMi5zaApAQCAtMCwwICsxLDcgQEAKKyMhL2Jpbi9zaAorIworIyBidWlsZCB1c2luZyBwdGhyZWFkcyB3aGVyZSBpdCdzIGFscmVhZHkgYnVpbHQgaW50byB0aGUgc3lzdGVtCisjCisvYmluL3JtIC1mIG10dGVzdAorZ2NjIC1EUFRIUkVBRFMgLUkuLi8uLi9pbmNsdWRlIC1nIG10dGVzdC5jIC1vIG10dGVzdCAtTC4uLy4uIC1sc3NsIC1sY3J5cHRvIC1scHRocmVhZAorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9wdGhyZWFkcy12bXMuY29tIGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvcHRocmVhZHMtdm1zLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2Y5MmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvcHRocmVhZHMtdm1zLmNvbQpAQCAtMCwwICsxLDE0IEBACiskISBUbyBjb21waWxlIG10dGVzdCBvbiBWTVMuCiskIQorJCEgV0FSTklORzogb25seSB0ZXN0ZWQgd2l0aCBERUMgQyBzbyBmYXIuCiskCiskIGlmIChmJGdldHN5aSgiY3B1IikubHQuMTI4KQorJCB0aGVuCiskICAgICBhcmNoIDo9IFZBWAorJCBlbHNlCiskICAgICBhcmNoID0gZiRlZGl0KCBmJGdldHN5aSggIkFSQ0hfTkFNRSIpLCAiVVBDQVNFIikKKyQgICAgIGlmIChhcmNoIC5lcXMuICIiKSB0aGVuIGFyY2ggPSAiVU5LIgorJCBlbmRpZgorJCBkZWZpbmUvdXNlciBvcGVuc3NsIFstLS5pbmNsdWRlLm9wZW5zc2xdCiskIGNjL2RlZj1QVEhSRUFEUyBtdHRlc3QuYworJCBsaW5rIG10dGVzdCxbLS0uJ2FyY2gnLmV4ZS5zc2xdbGlic3NsL2xpYixbLS0uJ2FyY2gnLmV4ZS5jcnlwdG9dbGliY3J5cHRvL2xpYgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvcHVyaWZ5LnNoIGIvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvcHVyaWZ5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNDRmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy9wdXJpZnkuc2gKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKy9iaW4vcm0gLWYgbXR0ZXN0CitwdXJpZnkgY2MgLURTT0xBUklTIC1JLi4vLi4vaW5jbHVkZSAtZyBtdHRlc3QuYyAtbyBtdHRlc3QgLUwuLi8uLiAtbHRocmVhZCAgLWxzc2wgLWxjcnlwdG8gLWxuc2wgLWxzb2NrZXQKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3RocmVhZHMvc29sYXJpcy5zaCBiL2xpYi9vcGVuc3NsL2NyeXB0by90aHJlYWRzL3NvbGFyaXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5MzA5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by90aHJlYWRzL3NvbGFyaXMuc2gKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKy9iaW4vcm0gLWYgbXR0ZXN0CitjYyAtRFNPTEFSSVMgLUkuLi8uLi9pbmNsdWRlIC1nIG10dGVzdC5jIC1vIG10dGVzdCAtTC4uLy4uIC1sdGhyZWFkICAtbHNzbCAtbGNyeXB0byAtbG5zbCAtbHNvY2tldAorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy90aC1sb2NrLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy90aC1sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhYWU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by90aHJlYWRzL3RoLWxvY2suYwpAQCAtMCwwICsxLDM4NyBAQAorLyogY3J5cHRvL3RocmVhZHMvdGgtbG9jay5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaWZkZWYgTElOVVgKKyNpbmNsdWRlIDx0eXBlZGVmcy5oPgorI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKyNpZmRlZiBTT0xBUklTCisjaW5jbHVkZSA8c3luY2guaD4KKyNpbmNsdWRlIDx0aHJlYWQuaD4KKyNlbmRpZgorI2lmZGVmIElSSVgKKyNpbmNsdWRlIDx1bG9ja3MuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNlbmRpZgorI2lmZGVmIFBUSFJFQURTCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlICIuLi8uLi9lX29zLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorCit2b2lkIENSWVBUT190aHJlYWRfc2V0dXAodm9pZCk7Cit2b2lkIENSWVBUT190aHJlYWRfY2xlYW51cCh2b2lkKTsKKworc3RhdGljIHZvaWQgaXJpeF9sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLGludCB0eXBlLGNoYXIgKmZpbGUsaW50IGxpbmUpOworc3RhdGljIHZvaWQgc29sYXJpc19sb2NraW5nX2NhbGxiYWNrKGludCBtb2RlLGludCB0eXBlLGNoYXIgKmZpbGUsaW50IGxpbmUpOworc3RhdGljIHZvaWQgd2luMzJfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSxpbnQgdHlwZSxjaGFyICpmaWxlLGludCBsaW5lKTsKK3N0YXRpYyB2b2lkIHB0aHJlYWRzX2xvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsaW50IHR5cGUsY2hhciAqZmlsZSxpbnQgbGluZSk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGlyaXhfdGhyZWFkX2lkKHZvaWQgKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNvbGFyaXNfdGhyZWFkX2lkKHZvaWQgKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHB0aHJlYWRzX3RocmVhZF9pZCh2b2lkICk7CisKKy8qIHVzYWdlOgorICogQ1JZUFRPX3RocmVhZF9zZXR1cCgpOworICogYXBwbGljYXRpb24gY29kZQorICogQ1JZUFRPX3RocmVhZF9jbGVhbnVwKCk7CisgKi8KKworI2RlZmluZSBUSFJFQURfU1RBQ0tfU0laRSAoMTYqMTAyNCkKKworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjMyCisKK3N0YXRpYyBIQU5ETEUgKmxvY2tfY3M7CisKK3ZvaWQgQ1JZUFRPX3RocmVhZF9zZXR1cCh2b2lkKQorCXsKKwlpbnQgaTsKKworCWxvY2tfY3M9T1BFTlNTTF9tYWxsb2MoQ1JZUFRPX251bV9sb2NrcygpICogc2l6ZW9mKEhBTkRMRSkpOworCWZvciAoaT0wOyBpPENSWVBUT19udW1fbG9ja3MoKTsgaSsrKQorCQl7CisJCWxvY2tfY3NbaV09Q3JlYXRlTXV0ZXgoTlVMTCxGQUxTRSxOVUxMKTsKKwkJfQorCisJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKCh2b2lkICgqKShpbnQsaW50LGNoYXIgKixpbnQpKXdpbjMyX2xvY2tpbmdfY2FsbGJhY2spOworCS8qIGlkIGNhbGxiYWNrIGRlZmluZWQgKi8KKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgdm9pZCBDUllQVE9fdGhyZWFkX2NsZWFudXAodm9pZCkKKwl7CisJaW50IGk7CisKKwlDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisJZm9yIChpPTA7IGk8Q1JZUFRPX251bV9sb2NrcygpOyBpKyspCisJCUNsb3NlSGFuZGxlKGxvY2tfY3NbaV0pOworCU9QRU5TU0xfZnJlZShsb2NrX2NzKTsKKwl9CisKK3ZvaWQgd2luMzJfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSwgaW50IHR5cGUsIGNoYXIgKmZpbGUsIGludCBsaW5lKQorCXsKKwlpZiAobW9kZSAmIENSWVBUT19MT0NLKQorCQl7CisJCVdhaXRGb3JTaW5nbGVPYmplY3QobG9ja19jc1t0eXBlXSxJTkZJTklURSk7CisJCX0KKwllbHNlCisJCXsKKwkJUmVsZWFzZU11dGV4KGxvY2tfY3NbdHlwZV0pOworCQl9CisJfQorCisjZW5kaWYgLyogT1BFTlNTTF9TWVNfV0lOMzIgKi8KKworI2lmZGVmIFNPTEFSSVMKKworI2RlZmluZSBVU0VfTVVURVgKKworI2lmZGVmIFVTRV9NVVRFWAorc3RhdGljIG11dGV4X3QgKmxvY2tfY3M7CisjZWxzZQorc3RhdGljIHJ3bG9ja190ICpsb2NrX2NzOworI2VuZGlmCitzdGF0aWMgbG9uZyAqbG9ja19jb3VudDsKKwordm9pZCBDUllQVE9fdGhyZWFkX3NldHVwKHZvaWQpCisJeworCWludCBpOworCisjaWZkZWYgVVNFX01VVEVYCisJbG9ja19jcz1PUEVOU1NMX21hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YobXV0ZXhfdCkpOworI2Vsc2UKKwlsb2NrX2NzPU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihyd2xvY2tfdCkpOworI2VuZGlmCisJbG9ja19jb3VudD1PUEVOU1NMX21hbGxvYyhDUllQVE9fbnVtX2xvY2tzKCkgKiBzaXplb2YobG9uZykpOworCWZvciAoaT0wOyBpPENSWVBUT19udW1fbG9ja3MoKTsgaSsrKQorCQl7CisJCWxvY2tfY291bnRbaV09MDsKKyNpZmRlZiBVU0VfTVVURVgKKwkJbXV0ZXhfaW5pdCgmKGxvY2tfY3NbaV0pLFVTWU5DX1RIUkVBRCxOVUxMKTsKKyNlbHNlCisJCXJ3bG9ja19pbml0KCYobG9ja19jc1tpXSksVVNZTkNfVEhSRUFELE5VTEwpOworI2VuZGlmCisJCX0KKworCUNSWVBUT19zZXRfaWRfY2FsbGJhY2soKHVuc2lnbmVkIGxvbmcgKCopKCkpc29sYXJpc190aHJlYWRfaWQpOworCUNSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjaygodm9pZCAoKikoKSlzb2xhcmlzX2xvY2tpbmdfY2FsbGJhY2spOworCX0KKwordm9pZCBDUllQVE9fdGhyZWFkX2NsZWFudXAodm9pZCkKKwl7CisJaW50IGk7CisKKwlDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisJZm9yIChpPTA7IGk8Q1JZUFRPX251bV9sb2NrcygpOyBpKyspCisJCXsKKyNpZmRlZiBVU0VfTVVURVgKKwkJbXV0ZXhfZGVzdHJveSgmKGxvY2tfY3NbaV0pKTsKKyNlbHNlCisJCXJ3bG9ja19kZXN0cm95KCYobG9ja19jc1tpXSkpOworI2VuZGlmCisJCX0KKwlPUEVOU1NMX2ZyZWUobG9ja19jcyk7CisJT1BFTlNTTF9mcmVlKGxvY2tfY291bnQpOworCX0KKwordm9pZCBzb2xhcmlzX2xvY2tpbmdfY2FsbGJhY2soaW50IG1vZGUsIGludCB0eXBlLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKKwl7CisjaWYgMAorCWZwcmludGYoc3RkZXJyLCJ0aHJlYWQ9JTRkIG1vZGU9JXMgbG9jaz0lcyAlczolZFxuIiwKKwkJQ1JZUFRPX3RocmVhZF9pZCgpLAorCQkobW9kZSZDUllQVE9fTE9DSyk/ImwiOiJ1IiwKKwkJKHR5cGUmQ1JZUFRPX1JFQUQpPyJyIjoidyIsZmlsZSxsaW5lKTsKKyNlbmRpZgorCisjaWYgMAorCWlmIChDUllQVE9fTE9DS19TU0xfQ0VSVCA9PSB0eXBlKQorCQlmcHJpbnRmKHN0ZGVyciwiKHQsbSxmLGwpICVsZCAlZCAlcyAlZFxuIiwKKwkJCUNSWVBUT190aHJlYWRfaWQoKSwKKwkJCW1vZGUsZmlsZSxsaW5lKTsKKyNlbmRpZgorCWlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCisJCXsKKyNpZmRlZiBVU0VfTVVURVgKKwkJbXV0ZXhfbG9jaygmKGxvY2tfY3NbdHlwZV0pKTsKKyNlbHNlCisJCWlmIChtb2RlICYgQ1JZUFRPX1JFQUQpCisJCQlyd19yZGxvY2soJihsb2NrX2NzW3R5cGVdKSk7CisJCWVsc2UKKwkJCXJ3X3dybG9jaygmKGxvY2tfY3NbdHlwZV0pKTsKKyNlbmRpZgorCQlsb2NrX2NvdW50W3R5cGVdKys7CisJCX0KKwllbHNlCisJCXsKKyNpZmRlZiBVU0VfTVVURVgKKwkJbXV0ZXhfdW5sb2NrKCYobG9ja19jc1t0eXBlXSkpOworI2Vsc2UKKwkJcndfdW5sb2NrKCYobG9ja19jc1t0eXBlXSkpOworI2VuZGlmCisJCX0KKwl9CisKK3Vuc2lnbmVkIGxvbmcgc29sYXJpc190aHJlYWRfaWQodm9pZCkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlyZXQ9KHVuc2lnbmVkIGxvbmcpdGhyX3NlbGYoKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYgLyogU09MQVJJUyAqLworCisjaWZkZWYgSVJJWAorLyogSSBkb24ndCB0aGluayB0aGlzIHdvcmtzLi4uLi4gKi8KKworc3RhdGljIHVzcHRyX3QgKmFyZW5hOworc3RhdGljIHVzZW1hX3QgKipsb2NrX2NzOworCit2b2lkIENSWVBUT190aHJlYWRfc2V0dXAodm9pZCkKKwl7CisJaW50IGk7CisJY2hhciBmaWxlbmFtZVsyMF07CisKKwlzdHJjcHkoZmlsZW5hbWUsIi90bXAvbXR0ZXN0LlhYWFhYWCIpOworCW1rdGVtcChmaWxlbmFtZSk7CisKKwl1c2NvbmZpZyhDT05GX1NUSFJFQURJT09GRik7CisJdXNjb25maWcoQ09ORl9TVEhSRUFETUFMTE9DT0ZGKTsKKwl1c2NvbmZpZyhDT05GX0lOSVRVU0VSUywxMDApOworCXVzY29uZmlnKENPTkZfTE9DS1RZUEUsVVNfREVCVUdQTFVTKTsKKwlhcmVuYT11c2luaXQoZmlsZW5hbWUpOworCXVubGluayhmaWxlbmFtZSk7CisKKwlsb2NrX2NzPU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZih1c2VtYV90ICopKTsKKwlmb3IgKGk9MDsgaTxDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKwkJeworCQlsb2NrX2NzW2ldPXVzbmV3c2VtYShhcmVuYSwxKTsKKwkJfQorCisJQ1JZUFRPX3NldF9pZF9jYWxsYmFjaygodW5zaWduZWQgbG9uZyAoKikoKSlpcml4X3RocmVhZF9pZCk7CisJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKCh2b2lkICgqKSgpKWlyaXhfbG9ja2luZ19jYWxsYmFjayk7CisJfQorCit2b2lkIENSWVBUT190aHJlYWRfY2xlYW51cCh2b2lkKQorCXsKKwlpbnQgaTsKKworCUNSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhOVUxMKTsKKwlmb3IgKGk9MDsgaTxDUllQVE9fbnVtX2xvY2tzKCk7IGkrKykKKwkJeworCQljaGFyIGJ1ZlsxMF07CisKKwkJc3ByaW50ZihidWYsIiUyZDoiLGkpOworCQl1c2R1bXBzZW1hKGxvY2tfY3NbaV0sc3Rkb3V0LGJ1Zik7CisJCXVzZnJlZXNlbWEobG9ja19jc1tpXSxhcmVuYSk7CisJCX0KKwlPUEVOU1NMX2ZyZWUobG9ja19jcyk7CisJfQorCit2b2lkIGlyaXhfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSwgaW50IHR5cGUsIGNoYXIgKmZpbGUsIGludCBsaW5lKQorCXsKKwlpZiAobW9kZSAmIENSWVBUT19MT0NLKQorCQl7CisJCXVzcHNlbWEobG9ja19jc1t0eXBlXSk7CisJCX0KKwllbHNlCisJCXsKKwkJdXN2c2VtYShsb2NrX2NzW3R5cGVdKTsKKwkJfQorCX0KKwordW5zaWduZWQgbG9uZyBpcml4X3RocmVhZF9pZCh2b2lkKQorCXsKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXJldD0odW5zaWduZWQgbG9uZylnZXRwaWQoKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYgLyogSVJJWCAqLworCisvKiBMaW51eCBhbmQgYSBmZXcgb3RoZXJzICovCisjaWZkZWYgUFRIUkVBRFMKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCAqbG9ja19jczsKK3N0YXRpYyBsb25nICpsb2NrX2NvdW50OworCit2b2lkIENSWVBUT190aHJlYWRfc2V0dXAodm9pZCkKKwl7CisJaW50IGk7CisKKwlsb2NrX2NzPU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihwdGhyZWFkX211dGV4X3QpKTsKKwlsb2NrX2NvdW50PU9QRU5TU0xfbWFsbG9jKENSWVBUT19udW1fbG9ja3MoKSAqIHNpemVvZihsb25nKSk7CisJZm9yIChpPTA7IGk8Q1JZUFRPX251bV9sb2NrcygpOyBpKyspCisJCXsKKwkJbG9ja19jb3VudFtpXT0wOworCQlwdGhyZWFkX211dGV4X2luaXQoJihsb2NrX2NzW2ldKSxOVUxMKTsKKwkJfQorCisJQ1JZUFRPX3NldF9pZF9jYWxsYmFjaygodW5zaWduZWQgbG9uZyAoKikoKSlwdGhyZWFkc190aHJlYWRfaWQpOworCUNSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjaygodm9pZCAoKikoKSlwdGhyZWFkc19sb2NraW5nX2NhbGxiYWNrKTsKKwl9CisKK3ZvaWQgdGhyZWFkX2NsZWFudXAodm9pZCkKKwl7CisJaW50IGk7CisKKwlDUllQVE9fc2V0X2xvY2tpbmdfY2FsbGJhY2soTlVMTCk7CisJZm9yIChpPTA7IGk8Q1JZUFRPX251bV9sb2NrcygpOyBpKyspCisJCXsKKwkJcHRocmVhZF9tdXRleF9kZXN0cm95KCYobG9ja19jc1tpXSkpOworCQl9CisJT1BFTlNTTF9mcmVlKGxvY2tfY3MpOworCU9QRU5TU0xfZnJlZShsb2NrX2NvdW50KTsKKwl9CisKK3ZvaWQgcHRocmVhZHNfbG9ja2luZ19jYWxsYmFjayhpbnQgbW9kZSwgaW50IHR5cGUsIGNoYXIgKmZpbGUsCisJICAgICBpbnQgbGluZSkKKyAgICAgIHsKKyNpZiAwCisJZnByaW50ZihzdGRlcnIsInRocmVhZD0lNGQgbW9kZT0lcyBsb2NrPSVzICVzOiVkXG4iLAorCQlDUllQVE9fdGhyZWFkX2lkKCksCisJCShtb2RlJkNSWVBUT19MT0NLKT8ibCI6InUiLAorCQkodHlwZSZDUllQVE9fUkVBRCk/InIiOiJ3IixmaWxlLGxpbmUpOworI2VuZGlmCisjaWYgMAorCWlmIChDUllQVE9fTE9DS19TU0xfQ0VSVCA9PSB0eXBlKQorCQlmcHJpbnRmKHN0ZGVyciwiKHQsbSxmLGwpICVsZCAlZCAlcyAlZFxuIiwKKwkJQ1JZUFRPX3RocmVhZF9pZCgpLAorCQltb2RlLGZpbGUsbGluZSk7CisjZW5kaWYKKwlpZiAobW9kZSAmIENSWVBUT19MT0NLKQorCQl7CisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmKGxvY2tfY3NbdHlwZV0pKTsKKwkJbG9ja19jb3VudFt0eXBlXSsrOworCQl9CisJZWxzZQorCQl7CisJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYobG9ja19jc1t0eXBlXSkpOworCQl9CisJfQorCit1bnNpZ25lZCBsb25nIHB0aHJlYWRzX3RocmVhZF9pZCh2b2lkKQorCXsKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXJldD0odW5zaWduZWQgbG9uZylwdGhyZWFkX3NlbGYoKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNlbmRpZiAvKiBQVEhSRUFEUyAqLworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy93aW4zMi5iYXQgYi9saWIvb3BlbnNzbC9jcnlwdG8vdGhyZWFkcy93aW4zMi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ZGE4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by90aHJlYWRzL3dpbjMyLmJhdApAQCAtMCwwICsxLDQgQEAKK2RlbCBtdHRlc3QuZXhlCisKK2NsIC9PMiAtRFdJTjMyIC9NRCAtSS4uXC4uXG91dCBtdHRlc3QuYyAvRmVtdHRlc3QgLi5cLi5cb3V0XHNzbGVheTMyLmxpYiAuLlwuLlxvdXRcbGliZWF5MzIubGliCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by90cy90c19lcnIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by90cy90c19lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDhiMGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3RzL3RzX2Vyci5jCkBAIC0wLDAgKzEsMTc5IEBACisvKiBjcnlwdG8vdHMvdHNfZXJyLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBOT1RFOiB0aGlzIGZpbGUgd2FzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBta2Vyci5wbCBzY3JpcHQ6IGFueSBjaGFuZ2VzCisgKiBtYWRlIHRvIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IG5leHQgdXBkYXRlcyB0aGlzIGZpbGUsCisgKiBvbmx5IHJlYXNvbiBzdHJpbmdzIHdpbGwgYmUgcHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90cy5oPgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisjZGVmaW5lIEVSUl9GVU5DKGZ1bmMpIEVSUl9QQUNLKEVSUl9MSUJfVFMsZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9UUywwLHJlYXNvbikKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBUU19zdHJfZnVuY3RzW109CisJewore0VSUl9GVU5DKFRTX0ZfRDJJX1RTX1JFU1ApLAkiZDJpX1RTX1JFU1AifSwKK3tFUlJfRlVOQyhUU19GX0RFRl9TRVJJQUxfQ0IpLAkiREVGX1NFUklBTF9DQiJ9LAore0VSUl9GVU5DKFRTX0ZfREVGX1RJTUVfQ0IpLAkiREVGX1RJTUVfQ0IifSwKK3tFUlJfRlVOQyhUU19GX0VTU19BRERfU0lHTklOR19DRVJUKSwJIkVTU19BRERfU0lHTklOR19DRVJUIn0sCit7RVJSX0ZVTkMoVFNfRl9FU1NfQ0VSVF9JRF9ORVdfSU5JVCksCSJFU1NfQ0VSVF9JRF9ORVdfSU5JVCJ9LAore0VSUl9GVU5DKFRTX0ZfRVNTX1NJR05JTkdfQ0VSVF9ORVdfSU5JVCksCSJFU1NfU0lHTklOR19DRVJUX05FV19JTklUIn0sCit7RVJSX0ZVTkMoVFNfRl9JTlRfVFNfUkVTUF9WRVJJRllfVE9LRU4pLAkiSU5UX1RTX1JFU1BfVkVSSUZZX1RPS0VOIn0sCit7RVJSX0ZVTkMoVFNfRl9QS0NTN19UT19UU19UU1RfSU5GTyksCSJQS0NTN190b19UU19UU1RfSU5GTyJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfQUNDVVJBQ1lfU0VUX01JQ1JPUyksCSJUU19BQ0NVUkFDWV9zZXRfbWljcm9zIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19BQ0NVUkFDWV9TRVRfTUlMTElTKSwJIlRTX0FDQ1VSQUNZX3NldF9taWxsaXMifSwKK3tFUlJfRlVOQyhUU19GX1RTX0FDQ1VSQUNZX1NFVF9TRUNPTkRTKSwJIlRTX0FDQ1VSQUNZX3NldF9zZWNvbmRzIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19DSEVDS19JTVBSSU5UUyksCSJUU19DSEVDS19JTVBSSU5UUyJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfQ0hFQ0tfTk9OQ0VTKSwJIlRTX0NIRUNLX05PTkNFUyJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfQ0hFQ0tfUE9MSUNZKSwJIlRTX0NIRUNLX1BPTElDWSJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfQ0hFQ0tfU0lHTklOR19DRVJUUyksCSJUU19DSEVDS19TSUdOSU5HX0NFUlRTIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19DSEVDS19TVEFUVVNfSU5GTyksCSJUU19DSEVDS19TVEFUVVNfSU5GTyJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfQ09NUFVURV9JTVBSSU5UKSwJIlRTX0NPTVBVVEVfSU1QUklOVCJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfQ09ORl9TRVRfREVGQVVMVF9FTkdJTkUpLAkiVFNfQ09ORl9zZXRfZGVmYXVsdF9lbmdpbmUifSwKK3tFUlJfRlVOQyhUU19GX1RTX0dFVF9TVEFUVVNfVEVYVCksCSJUU19HRVRfU1RBVFVTX1RFWFQifSwKK3tFUlJfRlVOQyhUU19GX1RTX01TR19JTVBSSU5UX1NFVF9BTEdPKSwJIlRTX01TR19JTVBSSU5UX3NldF9hbGdvIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVFfU0VUX01TR19JTVBSSU5UKSwJIlRTX1JFUV9zZXRfbXNnX2ltcHJpbnQifSwKK3tFUlJfRlVOQyhUU19GX1RTX1JFUV9TRVRfTk9OQ0UpLAkiVFNfUkVRX3NldF9ub25jZSJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfUkVRX1NFVF9QT0xJQ1lfSUQpLAkiVFNfUkVRX3NldF9wb2xpY3lfaWQifSwKK3tFUlJfRlVOQyhUU19GX1RTX1JFU1BfQ1JFQVRFX1JFU1BPTlNFKSwJIlRTX1JFU1BfY3JlYXRlX3Jlc3BvbnNlIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVNQX0NSRUFURV9UU1RfSU5GTyksCSJUU19SRVNQX0NSRUFURV9UU1RfSU5GTyJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfUkVTUF9DVFhfQUREX0ZBSUxVUkVfSU5GTyksCSJUU19SRVNQX0NUWF9hZGRfZmFpbHVyZV9pbmZvIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVNQX0NUWF9BRERfTUQpLAkiVFNfUkVTUF9DVFhfYWRkX21kIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVNQX0NUWF9BRERfUE9MSUNZKSwJIlRTX1JFU1BfQ1RYX2FkZF9wb2xpY3kifSwKK3tFUlJfRlVOQyhUU19GX1RTX1JFU1BfQ1RYX05FVyksCSJUU19SRVNQX0NUWF9uZXcifSwKK3tFUlJfRlVOQyhUU19GX1RTX1JFU1BfQ1RYX1NFVF9BQ0NVUkFDWSksCSJUU19SRVNQX0NUWF9zZXRfYWNjdXJhY3kifSwKK3tFUlJfRlVOQyhUU19GX1RTX1JFU1BfQ1RYX1NFVF9DRVJUUyksCSJUU19SRVNQX0NUWF9zZXRfY2VydHMifSwKK3tFUlJfRlVOQyhUU19GX1RTX1JFU1BfQ1RYX1NFVF9ERUZfUE9MSUNZKSwJIlRTX1JFU1BfQ1RYX3NldF9kZWZfcG9saWN5In0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVNQX0NUWF9TRVRfU0lHTkVSX0NFUlQpLAkiVFNfUkVTUF9DVFhfc2V0X3NpZ25lcl9jZXJ0In0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVNQX0NUWF9TRVRfU1RBVFVTX0lORk8pLAkiVFNfUkVTUF9DVFhfc2V0X3N0YXR1c19pbmZvIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVNQX0dFVF9QT0xJQ1kpLAkiVFNfUkVTUF9HRVRfUE9MSUNZIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVNQX1NFVF9HRU5USU1FX1dJVEhfUFJFQ0lTSU9OKSwJIlRTX1JFU1BfU0VUX0dFTlRJTUVfV0lUSF9QUkVDSVNJT04ifSwKK3tFUlJfRlVOQyhUU19GX1RTX1JFU1BfU0VUX1NUQVRVU19JTkZPKSwJIlRTX1JFU1Bfc2V0X3N0YXR1c19pbmZvIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19SRVNQX1NFVF9UU1RfSU5GTyksCSJUU19SRVNQX3NldF90c3RfaW5mbyJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfUkVTUF9TSUdOKSwJIlRTX1JFU1BfU0lHTiJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfUkVTUF9WRVJJRllfU0lHTkFUVVJFKSwJIlRTX1JFU1BfdmVyaWZ5X3NpZ25hdHVyZSJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfUkVTUF9WRVJJRllfVE9LRU4pLAkiVFNfUkVTUF92ZXJpZnlfdG9rZW4ifSwKK3tFUlJfRlVOQyhUU19GX1RTX1RTVF9JTkZPX1NFVF9BQ0NVUkFDWSksCSJUU19UU1RfSU5GT19zZXRfYWNjdXJhY3kifSwKK3tFUlJfRlVOQyhUU19GX1RTX1RTVF9JTkZPX1NFVF9NU0dfSU1QUklOVCksCSJUU19UU1RfSU5GT19zZXRfbXNnX2ltcHJpbnQifSwKK3tFUlJfRlVOQyhUU19GX1RTX1RTVF9JTkZPX1NFVF9OT05DRSksCSJUU19UU1RfSU5GT19zZXRfbm9uY2UifSwKK3tFUlJfRlVOQyhUU19GX1RTX1RTVF9JTkZPX1NFVF9QT0xJQ1lfSUQpLAkiVFNfVFNUX0lORk9fc2V0X3BvbGljeV9pZCJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfVFNUX0lORk9fU0VUX1NFUklBTCksCSJUU19UU1RfSU5GT19zZXRfc2VyaWFsIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19UU1RfSU5GT19TRVRfVElNRSksCSJUU19UU1RfSU5GT19zZXRfdGltZSJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfVFNUX0lORk9fU0VUX1RTQSksCSJUU19UU1RfSU5GT19zZXRfdHNhIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19WRVJJRlkpLAkiVFNfVkVSSUZZIn0sCit7RVJSX0ZVTkMoVFNfRl9UU19WRVJJRllfQ0VSVCksCSJUU19WRVJJRllfQ0VSVCJ9LAore0VSUl9GVU5DKFRTX0ZfVFNfVkVSSUZZX0NUWF9ORVcpLAkiVFNfVkVSSUZZX0NUWF9uZXcifSwKK3swLE5VTEx9CisJfTsKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBUU19zdHJfcmVhc29uc1tdPQorCXsKK3tFUlJfUkVBU09OKFRTX1JfQkFEX1BLQ1M3X1RZUEUpICAgICAgICAgLCJiYWQgcGtjczcgdHlwZSJ9LAore0VSUl9SRUFTT04oVFNfUl9CQURfVFlQRSkgICAgICAgICAgICAgICAsImJhZCB0eXBlIn0sCit7RVJSX1JFQVNPTihUU19SX0NFUlRJRklDQVRFX1ZFUklGWV9FUlJPUiksImNlcnRpZmljYXRlIHZlcmlmeSBlcnJvciJ9LAore0VSUl9SRUFTT04oVFNfUl9DT1VMRF9OT1RfU0VUX0VOR0lORSkgICAsImNvdWxkIG5vdCBzZXQgZW5naW5lIn0sCit7RVJSX1JFQVNPTihUU19SX0NPVUxEX05PVF9TRVRfVElNRSkgICAgICwiY291bGQgbm90IHNldCB0aW1lIn0sCit7RVJSX1JFQVNPTihUU19SX0QySV9UU19SRVNQX0lOVF9GQUlMRUQpICwiZDJpIHRzIHJlc3AgaW50IGZhaWxlZCJ9LAore0VSUl9SRUFTT04oVFNfUl9ERVRBQ0hFRF9DT05URU5UKSAgICAgICAsImRldGFjaGVkIGNvbnRlbnQifSwKK3tFUlJfUkVBU09OKFRTX1JfRVNTX0FERF9TSUdOSU5HX0NFUlRfRVJST1IpLCJlc3MgYWRkIHNpZ25pbmcgY2VydCBlcnJvciJ9LAore0VSUl9SRUFTT04oVFNfUl9FU1NfU0lHTklOR19DRVJUSUZJQ0FURV9FUlJPUiksImVzcyBzaWduaW5nIGNlcnRpZmljYXRlIGVycm9yIn0sCit7RVJSX1JFQVNPTihUU19SX0lOVkFMSURfTlVMTF9QT0lOVEVSKSAgICwiaW52YWxpZCBudWxsIHBvaW50ZXIifSwKK3tFUlJfUkVBU09OKFRTX1JfSU5WQUxJRF9TSUdORVJfQ0VSVElGSUNBVEVfUFVSUE9TRSksImludmFsaWQgc2lnbmVyIGNlcnRpZmljYXRlIHB1cnBvc2UifSwKK3tFUlJfUkVBU09OKFRTX1JfTUVTU0FHRV9JTVBSSU5UX01JU01BVENIKSwibWVzc2FnZSBpbXByaW50IG1pc21hdGNoIn0sCit7RVJSX1JFQVNPTihUU19SX05PTkNFX01JU01BVENIKSAgICAgICAgICwibm9uY2UgbWlzbWF0Y2gifSwKK3tFUlJfUkVBU09OKFRTX1JfTk9OQ0VfTk9UX1JFVFVSTkVEKSAgICAgLCJub25jZSBub3QgcmV0dXJuZWQifSwKK3tFUlJfUkVBU09OKFRTX1JfTk9fQ09OVEVOVCkgICAgICAgICAgICAgLCJubyBjb250ZW50In0sCit7RVJSX1JFQVNPTihUU19SX05PX1RJTUVfU1RBTVBfVE9LRU4pICAgICwibm8gdGltZSBzdGFtcCB0b2tlbiJ9LAore0VSUl9SRUFTT04oVFNfUl9QS0NTN19BRERfU0lHTkFUVVJFX0VSUk9SKSwicGtjczcgYWRkIHNpZ25hdHVyZSBlcnJvciJ9LAore0VSUl9SRUFTT04oVFNfUl9QS0NTN19BRERfU0lHTkVEX0FUVFJfRVJST1IpLCJwa2NzNyBhZGQgc2lnbmVkIGF0dHIgZXJyb3IifSwKK3tFUlJfUkVBU09OKFRTX1JfUEtDUzdfVE9fVFNfVFNUX0lORk9fRkFJTEVEKSwicGtjczcgdG8gdHMgdHN0IGluZm8gZmFpbGVkIn0sCit7RVJSX1JFQVNPTihUU19SX1BPTElDWV9NSVNNQVRDSCkgICAgICAgICwicG9saWN5IG1pc21hdGNoIn0sCit7RVJSX1JFQVNPTihUU19SX1BSSVZBVEVfS0VZX0RPRVNfTk9UX01BVENIX0NFUlRJRklDQVRFKSwicHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggY2VydGlmaWNhdGUifSwKK3tFUlJfUkVBU09OKFRTX1JfUkVTUE9OU0VfU0VUVVBfRVJST1IpICAgLCJyZXNwb25zZSBzZXR1cCBlcnJvciJ9LAore0VSUl9SRUFTT04oVFNfUl9TSUdOQVRVUkVfRkFJTFVSRSkgICAgICAsInNpZ25hdHVyZSBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihUU19SX1RIRVJFX01VU1RfQkVfT05FX1NJR05FUiksInRoZXJlIG11c3QgYmUgb25lIHNpZ25lciJ9LAore0VSUl9SRUFTT04oVFNfUl9USU1FX1NZU0NBTExfRVJST1IpICAgICAsInRpbWUgc3lzY2FsbCBlcnJvciJ9LAore0VSUl9SRUFTT04oVFNfUl9UT0tFTl9OT1RfUFJFU0VOVCkgICAgICAsInRva2VuIG5vdCBwcmVzZW50In0sCit7RVJSX1JFQVNPTihUU19SX1RPS0VOX1BSRVNFTlQpICAgICAgICAgICwidG9rZW4gcHJlc2VudCJ9LAore0VSUl9SRUFTT04oVFNfUl9UU0FfTkFNRV9NSVNNQVRDSCkgICAgICAsInRzYSBuYW1lIG1pc21hdGNoIn0sCit7RVJSX1JFQVNPTihUU19SX1RTQV9VTlRSVVNURUQpICAgICAgICAgICwidHNhIHVudHJ1c3RlZCJ9LAore0VSUl9SRUFTT04oVFNfUl9UU1RfSU5GT19TRVRVUF9FUlJPUikgICAsInRzdCBpbmZvIHNldHVwIGVycm9yIn0sCit7RVJSX1JFQVNPTihUU19SX1RTX0RBVEFTSUdOKSAgICAgICAgICAgICwidHMgZGF0YXNpZ24ifSwKK3tFUlJfUkVBU09OKFRTX1JfVU5BQ0NFUFRBQkxFX1BPTElDWSkgICAgLCJ1bmFjY2VwdGFibGUgcG9saWN5In0sCit7RVJSX1JFQVNPTihUU19SX1VOU1VQUE9SVEVEX01EX0FMR09SSVRITSksInVuc3VwcG9ydGVkIG1kIGFsZ29yaXRobSJ9LAore0VSUl9SRUFTT04oVFNfUl9VTlNVUFBPUlRFRF9WRVJTSU9OKSAgICAsInVuc3VwcG9ydGVkIHZlcnNpb24ifSwKK3tFUlJfUkVBU09OKFRTX1JfV1JPTkdfQ09OVEVOVF9UWVBFKSAgICAgLCJ3cm9uZyBjb250ZW50IHR5cGUifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfVFNfc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworCWlmIChFUlJfZnVuY19lcnJvcl9zdHJpbmcoVFNfc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsVFNfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxUU19zdHJfcmVhc29ucyk7CisJCX0KKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by90eHRfZGIvdHh0X2RiLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vdHh0X2RiL3R4dF9kYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMmNlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdHh0X2RiL3R4dF9kYi5jCkBAIC0wLDAgKzEsMzg4IEBACisvKiBjcnlwdG8vdHh0X2RiL3R4dF9kYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3R4dF9kYi5oPgorCisjdW5kZWYgQlVGU0laRQorI2RlZmluZSBCVUZTSVpFCTUxMgorCitjb25zdCBjaGFyIFRYVF9EQl92ZXJzaW9uW109IlRYVF9EQiIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCitUWFRfREIgKlRYVF9EQl9yZWFkKEJJTyAqaW4sIGludCBudW0pCisJeworCVRYVF9EQiAqcmV0PU5VTEw7CisJaW50IGVyPTE7CisJaW50IGVzYz0wOworCWxvbmcgbG49MDsKKwlpbnQgaSxhZGQsbjsKKwlpbnQgc2l6ZT1CVUZTSVpFOworCWludCBvZmZzZXQ9MDsKKwljaGFyICpwLCpmOworCU9QRU5TU0xfU1RSSU5HICpwcDsKKwlCVUZfTUVNICpidWY9TlVMTDsKKworCWlmICgoYnVmPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpIGdvdG8gZXJyOworCWlmICghQlVGX01FTV9ncm93KGJ1ZixzaXplKSkgZ290byBlcnI7CisKKwlpZiAoKHJldD1PUEVOU1NMX21hbGxvYyhzaXplb2YoVFhUX0RCKSkpID09IE5VTEwpCisJCWdvdG8gZXJyOworCXJldC0+bnVtX2ZpZWxkcz1udW07CisJcmV0LT5pbmRleD1OVUxMOworCXJldC0+cXVhbD1OVUxMOworCWlmICgocmV0LT5kYXRhPXNrX09QRU5TU0xfUFNUUklOR19uZXdfbnVsbCgpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAoKHJldC0+aW5kZXg9T1BFTlNTTF9tYWxsb2Moc2l6ZW9mKCpyZXQtPmluZGV4KSpudW0pKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAoKHJldC0+cXVhbD1PUEVOU1NMX21hbGxvYyhzaXplb2YoKihyZXQtPnF1YWwpKSpudW0pKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJeworCQlyZXQtPmluZGV4W2ldPU5VTEw7CisJCXJldC0+cXVhbFtpXT1OVUxMOworCQl9CisKKwlhZGQ9KG51bSsxKSpzaXplb2YoY2hhciAqKTsKKwlidWYtPmRhdGFbc2l6ZS0xXT0nXDAnOworCW9mZnNldD0wOworCWZvciAoOzspCisJCXsKKwkJaWYgKG9mZnNldCAhPSAwKQorCQkJeworCQkJc2l6ZSs9QlVGU0laRTsKKwkJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGJ1ZixzaXplKSkgZ290byBlcnI7CisJCQl9CisJCWJ1Zi0+ZGF0YVtvZmZzZXRdPSdcMCc7CisJCUJJT19nZXRzKGluLCYoYnVmLT5kYXRhW29mZnNldF0pLHNpemUtb2Zmc2V0KTsKKwkJbG4rKzsKKwkJaWYgKGJ1Zi0+ZGF0YVtvZmZzZXRdID09ICdcMCcpIGJyZWFrOworCQlpZiAoKG9mZnNldCA9PSAwKSAmJiAoYnVmLT5kYXRhWzBdID09ICcjJykpIGNvbnRpbnVlOworCQlpPXN0cmxlbigmKGJ1Zi0+ZGF0YVtvZmZzZXRdKSk7CisJCW9mZnNldCs9aTsKKwkJaWYgKGJ1Zi0+ZGF0YVtvZmZzZXQtMV0gIT0gJ1xuJykKKwkJCWNvbnRpbnVlOworCQllbHNlCisJCQl7CisJCQlidWYtPmRhdGFbb2Zmc2V0LTFdPSdcMCc7IC8qIGJsYXQgdGhlICdcbicgKi8KKwkJCWlmICghKHA9T1BFTlNTTF9tYWxsb2MoYWRkK29mZnNldCkpKSBnb3RvIGVycjsKKwkJCW9mZnNldD0wOworCQkJfQorCQlwcD0oY2hhciAqKilwOworCQlwKz1hZGQ7CisJCW49MDsKKwkJcHBbbisrXT1wOworCQlpPTA7CisJCWY9YnVmLT5kYXRhOworCisJCWVzYz0wOworCQlmb3IgKDs7KQorCQkJeworCQkJaWYgKCpmID09ICdcMCcpIGJyZWFrOworCQkJaWYgKCpmID09ICdcdCcpCisJCQkJeworCQkJCWlmIChlc2MpCisJCQkJCXAtLTsKKwkJCQllbHNlCisJCQkJCXsJCisJCQkJCSoocCsrKT0nXDAnOworCQkJCQlmKys7CisJCQkJCWlmIChuID49ICBudW0pIGJyZWFrOworCQkJCQlwcFtuKytdPXA7CisJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJZXNjPSgqZiA9PSAnXFwnKTsKKwkJCSoocCsrKT0gKihmKyspOworCQkJfQorCQkqKHArKyk9J1wwJzsKKwkJaWYgKChuICE9IG51bSkgfHwgKCpmICE9ICdcMCcpKQorCQkJeworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1RESU8pICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjE2KQkvKiB0ZW1wb3JhcnkgZml4IDotKCAqLworCQkJZnByaW50ZihzdGRlcnIsIndyb25nIG51bWJlciBvZiBmaWVsZHMgb24gbGluZSAlbGQgKGxvb2tpbmcgZm9yIGZpZWxkICVkLCBnb3QgJWQsICclcycgbGVmdClcbiIsbG4sbnVtLG4sZik7CisjZW5kaWYKKwkJCWVyPTI7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcHBbbl09cDsKKwkJaWYgKCFza19PUEVOU1NMX1BTVFJJTkdfcHVzaChyZXQtPmRhdGEscHApKQorCQkJeworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1RESU8pICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjE2KQkvKiB0ZW1wb3JhcnkgZml4IDotKCAqLworCQkJZnByaW50ZihzdGRlcnIsImZhaWx1cmUgaW4gc2tfcHVzaFxuIik7CisjZW5kaWYKKwkJCWVyPTI7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVyPTA7CitlcnI6CisJQlVGX01FTV9mcmVlKGJ1Zik7CisJaWYgKGVyKQorCQl7CisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TVERJTykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMTYpCisJCWlmIChlciA9PSAxKSBmcHJpbnRmKHN0ZGVyciwiT1BFTlNTTF9tYWxsb2MgZmFpbHVyZVxuIik7CisjZW5kaWYKKwkJaWYgKHJldCAhPSBOVUxMKQorCQkJeworCQkJaWYgKHJldC0+ZGF0YSAhPSBOVUxMKSBza19PUEVOU1NMX1BTVFJJTkdfZnJlZShyZXQtPmRhdGEpOworCQkJaWYgKHJldC0+aW5kZXggIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHJldC0+aW5kZXgpOworCQkJaWYgKHJldC0+cXVhbCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocmV0LT5xdWFsKTsKKwkJCWlmIChyZXQgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHJldCk7CisJCQl9CisJCXJldHVybihOVUxMKTsKKwkJfQorCWVsc2UKKwkJcmV0dXJuKHJldCk7CisJfQorCitPUEVOU1NMX1NUUklORyAqVFhUX0RCX2dldF9ieV9pbmRleChUWFRfREIgKmRiLCBpbnQgaWR4LCBPUEVOU1NMX1NUUklORyAqdmFsdWUpCisJeworCU9QRU5TU0xfU1RSSU5HICpyZXQ7CisJTEhBU0hfT0YoT1BFTlNTTF9TVFJJTkcpICpsaDsKKworCWlmIChpZHggPj0gZGItPm51bV9maWVsZHMpCisJCXsKKwkJZGItPmVycm9yPURCX0VSUk9SX0lOREVYX09VVF9PRl9SQU5HRTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJbGg9ZGItPmluZGV4W2lkeF07CisJaWYgKGxoID09IE5VTEwpCisJCXsKKwkJZGItPmVycm9yPURCX0VSUk9SX05PX0lOREVYOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlyZXQ9bGhfT1BFTlNTTF9TVFJJTkdfcmV0cmlldmUobGgsdmFsdWUpOworCWRiLT5lcnJvcj1EQl9FUlJPUl9PSzsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBUWFRfREJfY3JlYXRlX2luZGV4KFRYVF9EQiAqZGIsIGludCBmaWVsZCwgaW50ICgqcXVhbCkoT1BFTlNTTF9TVFJJTkcgKiksCisJCQlMSEFTSF9IQVNIX0ZOX1RZUEUgaGFzaCwgTEhBU0hfQ09NUF9GTl9UWVBFIGNtcCkKKwl7CisJTEhBU0hfT0YoT1BFTlNTTF9TVFJJTkcpICppZHg7CisJT1BFTlNTTF9TVFJJTkcgKnI7CisJaW50IGksbjsKKworCWlmIChmaWVsZCA+PSBkYi0+bnVtX2ZpZWxkcykKKwkJeworCQlkYi0+ZXJyb3I9REJfRVJST1JfSU5ERVhfT1VUX09GX1JBTkdFOworCQlyZXR1cm4oMCk7CisJCX0KKwkvKiBGSVhNRTogd2UgbG9zZSB0eXBlIGNoZWNraW5nIGF0IHRoaXMgcG9pbnQgKi8KKwlpZiAoKGlkeD0oTEhBU0hfT0YoT1BFTlNTTF9TVFJJTkcpICopbGhfbmV3KGhhc2gsY21wKSkgPT0gTlVMTCkKKwkJeworCQlkYi0+ZXJyb3I9REJfRVJST1JfTUFMTE9DOworCQlyZXR1cm4oMCk7CisJCX0KKwluPXNrX09QRU5TU0xfUFNUUklOR19udW0oZGItPmRhdGEpOworCWZvciAoaT0wOyBpPG47IGkrKykKKwkJeworCQlyPXNrX09QRU5TU0xfUFNUUklOR192YWx1ZShkYi0+ZGF0YSxpKTsKKwkJaWYgKChxdWFsICE9IE5VTEwpICYmIChxdWFsKHIpID09IDApKSBjb250aW51ZTsKKwkJaWYgKChyPWxoX09QRU5TU0xfU1RSSU5HX2luc2VydChpZHgscikpICE9IE5VTEwpCisJCQl7CisJCQlkYi0+ZXJyb3I9REJfRVJST1JfSU5ERVhfQ0xBU0g7CisJCQlkYi0+YXJnMT1za19PUEVOU1NMX1BTVFJJTkdfZmluZChkYi0+ZGF0YSxyKTsKKwkJCWRiLT5hcmcyPWk7CisJCQlsaF9PUEVOU1NMX1NUUklOR19mcmVlKGlkeCk7CisJCQlyZXR1cm4oMCk7CisJCQl9CisJCX0KKwlpZiAoZGItPmluZGV4W2ZpZWxkXSAhPSBOVUxMKSBsaF9PUEVOU1NMX1NUUklOR19mcmVlKGRiLT5pbmRleFtmaWVsZF0pOworCWRiLT5pbmRleFtmaWVsZF09aWR4OworCWRiLT5xdWFsW2ZpZWxkXT1xdWFsOworCXJldHVybigxKTsKKwl9CisKK2xvbmcgVFhUX0RCX3dyaXRlKEJJTyAqb3V0LCBUWFRfREIgKmRiKQorCXsKKwlsb25nIGksaixuLG5uLGwsdG90PTA7CisJY2hhciAqcCwqKnBwLCpmOworCUJVRl9NRU0gKmJ1Zj1OVUxMOworCWxvbmcgcmV0PSAtMTsKKworCWlmICgoYnVmPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCisJCWdvdG8gZXJyOworCW49c2tfT1BFTlNTTF9QU1RSSU5HX251bShkYi0+ZGF0YSk7CisJbm49ZGItPm51bV9maWVsZHM7CisJZm9yIChpPTA7IGk8bjsgaSsrKQorCQl7CisJCXBwPXNrX09QRU5TU0xfUFNUUklOR192YWx1ZShkYi0+ZGF0YSxpKTsKKworCQlsPTA7CisJCWZvciAoaj0wOyBqPG5uOyBqKyspCisJCQl7CisJCQlpZiAocHBbal0gIT0gTlVMTCkKKwkJCQlsKz1zdHJsZW4ocHBbal0pOworCQkJfQorCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihidWYsKGludCkobCoyK25uKSkpIGdvdG8gZXJyOworCisJCXA9YnVmLT5kYXRhOworCQlmb3IgKGo9MDsgajxubjsgaisrKQorCQkJeworCQkJZj1wcFtqXTsKKwkJCWlmIChmICE9IE5VTEwpCisJCQkJZm9yICg7OykgCisJCQkJCXsKKwkJCQkJaWYgKCpmID09ICdcMCcpIGJyZWFrOworCQkJCQlpZiAoKmYgPT0gJ1x0JykgKihwKyspPSdcXCc7CisJCQkJCSoocCsrKT0gKihmKyspOworCQkJCQl9CisJCQkqKHArKyk9J1x0JzsKKwkJCX0KKwkJcFstMV09J1xuJzsKKwkJaj1wLWJ1Zi0+ZGF0YTsKKwkJaWYgKEJJT193cml0ZShvdXQsYnVmLT5kYXRhLChpbnQpaikgIT0gaikKKwkJCWdvdG8gZXJyOworCQl0b3QrPWo7CisJCX0KKwlyZXQ9dG90OworZXJyOgorCWlmIChidWYgIT0gTlVMTCkgQlVGX01FTV9mcmVlKGJ1Zik7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgVFhUX0RCX2luc2VydChUWFRfREIgKmRiLCBPUEVOU1NMX1NUUklORyAqcm93KQorCXsKKwlpbnQgaTsKKwlPUEVOU1NMX1NUUklORyAqcjsKKworCWZvciAoaT0wOyBpPGRiLT5udW1fZmllbGRzOyBpKyspCisJCXsKKwkJaWYgKGRiLT5pbmRleFtpXSAhPSBOVUxMKQorCQkJeworCQkJaWYgKChkYi0+cXVhbFtpXSAhPSBOVUxMKSAmJgorCQkJCShkYi0+cXVhbFtpXShyb3cpID09IDApKSBjb250aW51ZTsKKwkJCXI9bGhfT1BFTlNTTF9TVFJJTkdfcmV0cmlldmUoZGItPmluZGV4W2ldLHJvdyk7CisJCQlpZiAociAhPSBOVUxMKQorCQkJCXsKKwkJCQlkYi0+ZXJyb3I9REJfRVJST1JfSU5ERVhfQ0xBU0g7CisJCQkJZGItPmFyZzE9aTsKKwkJCQlkYi0+YXJnX3Jvdz1yOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCS8qIFdlIGhhdmUgcGFzc2VkIHRoZSBpbmRleCBjaGVja3MsIG5vdyBqdXN0IGFwcGVuZCBhbmQgaW5zZXJ0ICovCisJaWYgKCFza19PUEVOU1NMX1BTVFJJTkdfcHVzaChkYi0+ZGF0YSxyb3cpKQorCQl7CisJCWRiLT5lcnJvcj1EQl9FUlJPUl9NQUxMT0M7CisJCWdvdG8gZXJyOworCQl9CisKKwlmb3IgKGk9MDsgaTxkYi0+bnVtX2ZpZWxkczsgaSsrKQorCQl7CisJCWlmIChkYi0+aW5kZXhbaV0gIT0gTlVMTCkKKwkJCXsKKwkJCWlmICgoZGItPnF1YWxbaV0gIT0gTlVMTCkgJiYKKwkJCQkoZGItPnF1YWxbaV0ocm93KSA9PSAwKSkgY29udGludWU7CisJCQkodm9pZClsaF9PUEVOU1NMX1NUUklOR19pbnNlcnQoZGItPmluZGV4W2ldLHJvdyk7CisJCQl9CisJCX0KKwlyZXR1cm4oMSk7CitlcnI6CisJcmV0dXJuKDApOworCX0KKwordm9pZCBUWFRfREJfZnJlZShUWFRfREIgKmRiKQorCXsKKwlpbnQgaSxuOworCWNoYXIgKipwLCptYXg7CisKKwlpZihkYiA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlpZiAoZGItPmluZGV4ICE9IE5VTEwpCisJCXsKKwkJZm9yIChpPWRiLT5udW1fZmllbGRzLTE7IGk+PTA7IGktLSkKKwkJCWlmIChkYi0+aW5kZXhbaV0gIT0gTlVMTCkgbGhfT1BFTlNTTF9TVFJJTkdfZnJlZShkYi0+aW5kZXhbaV0pOworCQlPUEVOU1NMX2ZyZWUoZGItPmluZGV4KTsKKwkJfQorCWlmIChkYi0+cXVhbCAhPSBOVUxMKQorCQlPUEVOU1NMX2ZyZWUoZGItPnF1YWwpOworCWlmIChkYi0+ZGF0YSAhPSBOVUxMKQorCQl7CisJCWZvciAoaT1za19PUEVOU1NMX1BTVFJJTkdfbnVtKGRiLT5kYXRhKS0xOyBpPj0wOyBpLS0pCisJCQl7CisJCQkvKiBjaGVjayBpZiBhbnkgJ2ZpZWxkcycgaGF2ZSBiZWVuIGFsbG9jYXRlZAorCQkJICogZnJvbSBvdXRzaWRlIG9mIHRoZSBpbml0aWFsIGJsb2NrICovCisJCQlwPXNrX09QRU5TU0xfUFNUUklOR192YWx1ZShkYi0+ZGF0YSxpKTsKKwkJCW1heD1wW2RiLT5udW1fZmllbGRzXTsgLyogbGFzdCBhZGRyZXNzICovCisJCQlpZiAobWF4ID09IE5VTEwpIC8qIG5ldyByb3cgKi8KKwkJCQl7CisJCQkJZm9yIChuPTA7IG48ZGItPm51bV9maWVsZHM7IG4rKykKKwkJCQkJaWYgKHBbbl0gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHBbbl0pOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJZm9yIChuPTA7IG48ZGItPm51bV9maWVsZHM7IG4rKykKKwkJCQkJeworCQkJCQlpZiAoKChwW25dIDwgKGNoYXIgKilwKSB8fCAocFtuXSA+IG1heCkpCisJCQkJCQkmJiAocFtuXSAhPSBOVUxMKSkKKwkJCQkJCU9QRU5TU0xfZnJlZShwW25dKTsKKwkJCQkJfQorCQkJCX0KKwkJCU9QRU5TU0xfZnJlZShza19PUEVOU1NMX1BTVFJJTkdfdmFsdWUoZGItPmRhdGEsaSkpOworCQkJfQorCQlza19PUEVOU1NMX1BTVFJJTkdfZnJlZShkYi0+ZGF0YSk7CisJCX0KKwlPUEVOU1NMX2ZyZWUoZGIpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by90eHRfZGIvdHh0X2RiLmggYi9saWIvb3BlbnNzbC9jcnlwdG8vdHh0X2RiL3R4dF9kYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYmU0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdHh0X2RiL3R4dF9kYi5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiBjcnlwdG8vdHh0X2RiL3R4dF9kYi5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1RYVF9EQl9ICisjZGVmaW5lIEhFQURFUl9UWFRfREJfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorCisjZGVmaW5lIERCX0VSUk9SX09LCQkJMAorI2RlZmluZSBEQl9FUlJPUl9NQUxMT0MJCQkxCisjZGVmaW5lIERCX0VSUk9SX0lOREVYX0NMQVNIICAgIAkyCisjZGVmaW5lIERCX0VSUk9SX0lOREVYX09VVF9PRl9SQU5HRQkzCisjZGVmaW5lIERCX0VSUk9SX05PX0lOREVYCQk0CisjZGVmaW5lIERCX0VSUk9SX0lOU0VSVF9JTkRFWF9DTEFTSCAgICAJNQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIE9QRU5TU0xfU1RSSU5HICpPUEVOU1NMX1BTVFJJTkc7CitERUNMQVJFX1NQRUNJQUxfU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HLCBPUEVOU1NMX1NUUklORykKKwordHlwZWRlZiBzdHJ1Y3QgdHh0X2RiX3N0CisJeworCWludCBudW1fZmllbGRzOworCVNUQUNLX09GKE9QRU5TU0xfUFNUUklORykgKmRhdGE7CisJTEhBU0hfT0YoT1BFTlNTTF9TVFJJTkcpICoqaW5kZXg7CisJaW50ICgqKnF1YWwpKE9QRU5TU0xfU1RSSU5HICopOworCWxvbmcgZXJyb3I7CisJbG9uZyBhcmcxOworCWxvbmcgYXJnMjsKKwlPUEVOU1NMX1NUUklORyAqYXJnX3JvdzsKKwl9IFRYVF9EQjsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworVFhUX0RCICpUWFRfREJfcmVhZChCSU8gKmluLCBpbnQgbnVtKTsKK2xvbmcgVFhUX0RCX3dyaXRlKEJJTyAqb3V0LCBUWFRfREIgKmRiKTsKKyNlbHNlCitUWFRfREIgKlRYVF9EQl9yZWFkKGNoYXIgKmluLCBpbnQgbnVtKTsKK2xvbmcgVFhUX0RCX3dyaXRlKGNoYXIgKm91dCwgVFhUX0RCICpkYik7CisjZW5kaWYKK2ludCBUWFRfREJfY3JlYXRlX2luZGV4KFRYVF9EQiAqZGIsaW50IGZpZWxkLGludCAoKnF1YWwpKE9QRU5TU0xfU1RSSU5HICopLAorCQkJTEhBU0hfSEFTSF9GTl9UWVBFIGhhc2gsIExIQVNIX0NPTVBfRk5fVFlQRSBjbXApOwordm9pZCBUWFRfREJfZnJlZShUWFRfREIgKmRiKTsKK09QRU5TU0xfU1RSSU5HICpUWFRfREJfZ2V0X2J5X2luZGV4KFRYVF9EQiAqZGIsIGludCBpZHgsIE9QRU5TU0xfU1RSSU5HICp2YWx1ZSk7CitpbnQgVFhUX0RCX2luc2VydChUWFRfREIgKmRiLCBPUEVOU1NMX1NUUklORyAqdmFsdWUpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8vdWkvdWkuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWNmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdWkvdWkuaApAQCAtMCwwICsxLDM4MyBAQAorLyogY3J5cHRvL3VpL3VpLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9VSV9ICisjZGVmaW5lIEhFQURFUl9VSV9ICisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvc2FmZXN0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBEZWNsYXJlZCBhbHJlYWR5IGluIG9zc2xfdHlwLmggKi8KKy8qIHR5cGVkZWYgc3RydWN0IHVpX3N0IFVJOyAqLworLyogdHlwZWRlZiBzdHJ1Y3QgdWlfbWV0aG9kX3N0IFVJX01FVEhPRDsgKi8KKworCisvKiBBbGwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIC0xIG9yIE5VTEwgb24gZXJyb3IgYW5kIGluIHNvbWUgY2FzZXMKKyAgIChVSV9wcm9jZXNzKCkpIC0yIGlmIGludGVycnVwdGVkIG9yIGluIHNvbWUgb3RoZXIgd2F5IGNhbmNlbGxlZC4KKyAgIFdoZW4gZXZlcnl0aGluZyBpcyBmaW5lLCB0aGV5IHJldHVybiAwLCBhIHBvc2l0aXZlIHZhbHVlIG9yIGEgbm9uLU5VTEwKKyAgIHBvaW50ZXIsIGFsbCBkZXBlbmRpbmcgb24gdGhlaXIgcHVycG9zZS4gKi8KKworLyogQ3JlYXRvcnMgYW5kIGRlc3RydWN0b3IuICAgKi8KK1VJICpVSV9uZXcodm9pZCk7CitVSSAqVUlfbmV3X21ldGhvZChjb25zdCBVSV9NRVRIT0QgKm1ldGhvZCk7Cit2b2lkIFVJX2ZyZWUoVUkgKnVpKTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gYWRkIHN0cmluZ3MgdG8gYmUgcHJpbnRlZCBhbmQgcHJvbXB0CisgICBzdHJpbmdzIHRvIHByb21wdCBmb3IgZGF0YS4gIFRoZSBuYW1lcyBhcmUgVUlfe2FkZCxkdXB9XzxmdW5jdGlvbj5fc3RyaW5nCisgICBhbmQgVUlfe2FkZCxkdXB9X2lucHV0X2Jvb2xlYW4uCisKKyAgIFVJX3thZGQsZHVwfV88ZnVuY3Rpb24+X3N0cmluZyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisJYWRkCWFkZCBhIHRleHQgb3IgcHJvbXB0IHN0cmluZy4gIFRoZSBwb2ludGVycyBnaXZlbiB0byB0aGVzZQorCQlmdW5jdGlvbnMgYXJlIHVzZWQgdmVyYmF0aW0sIG5vIGNvcHlpbmcgaXMgZG9uZS4KKwlkdXAJbWFrZSBhIGNvcHkgb2YgdGhlIHRleHQgb3IgcHJvbXB0IHN0cmluZywgdGhlbiBhZGQgdGhlIGNvcHkKKwkJdG8gdGhlIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncyBpbiB0aGUgdXNlciBpbnRlcmZhY2UuCisJPGZ1bmN0aW9uPgorCQlUaGUgZnVuY3Rpb24gaXMgYSBuYW1lIGZvciB0aGUgZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBnaXZlbgorCQlzdHJpbmcgc2hhbGwgYmUgdXNlZCBmb3IuICBJdCBjYW4gYmUgb25lIG9mOgorCQkJaW5wdXQJdXNlIHRoZSBzdHJpbmcgYXMgZGF0YSBwcm9tcHQuCisJCQl2ZXJpZnkJdXNlIHRoZSBzdHJpbmcgYXMgdmVyaWZpY2F0aW9uIHByb21wdC4gIFRoaXMKKwkJCQlpcyB1c2VkIHRvIHZlcmlmeSBhIHByZXZpb3VzIGlucHV0LgorCQkJaW5mbwl1c2UgdGhlIHN0cmluZyBmb3IgaW5mb3JtYXRpb25hbCBvdXRwdXQuCisJCQllcnJvcgl1c2UgdGhlIHN0cmluZyBmb3IgZXJyb3Igb3V0cHV0LgorICAgSG9uZXN0bHksIHRoZXJlJ3MgY3VycmVudGx5IG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBpbmZvIGFuZCBlcnJvciBmb3IgdGhlCisgICBtb21lbnQuCisKKyAgIFVJX3thZGQsZHVwfV9pbnB1dF9ib29sZWFuIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGZvciAiYWRkIiBhbmQgImR1cCIsCisgICBhbmQgYXJlIHR5cGljYWxseSB1c2VkIHdoZW4gb25lIHdhbnRzIHRvIHByb21wdCBmb3IgYSB5ZXMvbm8gcmVzcG9uc2UuCisKKworICAgQWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBncm91cCB0YWtlIGEgVUkgYW5kIGEgcHJvbXB0IHN0cmluZy4KKyAgIFRoZSBzdHJpbmcgaW5wdXQgYW5kIHZlcmlmeSBhZGRpdGlvbiBmdW5jdGlvbnMgYWxzbyB0YWtlIGEgZmxhZyBhcmd1bWVudCwKKyAgIGEgYnVmZmVyIGZvciB0aGUgcmVzdWx0IHRvIGVuZCB1cCB3aXRoLCBhIG1pbmltdW0gaW5wdXQgc2l6ZSBhbmQgYSBtYXhpbXVtCisgICBpbnB1dCBzaXplICh0aGUgcmVzdWx0IGJ1ZmZlciBNVVNUIGJlIGxhcmdlIGVub3VnaCB0byBiZSBhYmxlIHRvIGNvbnRhaW4KKyAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzKS4gIEFkZGl0aW9uYWxseSwgdGhlIHZlcmlmeSBhZGRpdGlvbgorICAgZnVuY3Rpb25zIHRha2VzIGFub3RoZXIgYnVmZmVyIHRvIGNvbXBhcmUgdGhlIHJlc3VsdCBhZ2FpbnN0LgorICAgVGhlIGJvb2xlYW4gaW5wdXQgZnVuY3Rpb25zIHRha2UgYW4gYWN0aW9uIGRlc2NyaXB0aW9uIHN0cmluZyAod2hpY2ggc2hvdWxkCisgICBiZSBzYWZlIHRvIGlnbm9yZSBpZiB0aGUgZXhwZWN0ZWQgdXNlciBhY3Rpb24gaXMgb2J2aW91cywgZm9yIGV4YW1wbGUgd2l0aAorICAgYSBkaWFsb2cgYm94IHdpdGggYW4gT0sgYnV0dG9uIGFuZCBhIENhbmNlbCBidXR0b24pLCBhIHN0cmluZyBvZiBhY2NlcHRhYmxlCisgICBjaGFyYWN0ZXJzIHRvIG1lYW4gT0sgYW5kIHRvIG1lYW4gQ2FuY2VsLiAgVGhlIHR3byBsYXN0IHN0cmluZ3MgYXJlIGNoZWNrZWQKKyAgIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbid0IGhhdmUgY29tbW9uIGNoYXJhY3RlcnMuICBBZGRpdGlvbmFsbHksIHRoZSBzYW1lCisgICBmbGFnIGFyZ3VtZW50IGFzIGZvciB0aGUgc3RyaW5nIGlucHV0IGlzIHRha2VuLCBhcyB3ZWxsIGFzIGEgcmVzdWx0IGJ1ZmZlci4KKyAgIFRoZSByZXN1bHQgYnVmZmVyIGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IG9uZSBieXRlIGxvbmcuICBEZXBlbmRpbmcgb24KKyAgIHRoZSBhbnN3ZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbSB0aGUgT0sgb3IgdGhlIENhbmNlbCBjaGFyYWN0ZXIgc3RyaW5ncworICAgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlc3VsdCBidWZmZXIuICBObyBOVUwgd2lsbCBiZQorICAgYWRkZWQsIHNvIHRoZSByZXN1bHQgaXMgKm5vdCogYSBzdHJpbmcuCisKKyAgIE9uIHN1Y2Nlc3MsIHRoZSBhbGwgcmV0dXJuIGFuIGluZGV4IG9mIHRoZSBhZGRlZCBpbmZvcm1hdGlvbi4gIFRoYXQgaW5kZXgKKyAgIGlzIHVzZWZ1bGwgd2hlbiByZXRyaWV2aW5nIHJlc3VsdHMgd2l0aCBVSV9nZXQwX3Jlc3VsdCgpLiAqLworaW50IFVJX2FkZF9pbnB1dF9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBmbGFncywKKwljaGFyICpyZXN1bHRfYnVmLCBpbnQgbWluc2l6ZSwgaW50IG1heHNpemUpOworaW50IFVJX2R1cF9pbnB1dF9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBmbGFncywKKwljaGFyICpyZXN1bHRfYnVmLCBpbnQgbWluc2l6ZSwgaW50IG1heHNpemUpOworaW50IFVJX2FkZF92ZXJpZnlfc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgZmxhZ3MsCisJY2hhciAqcmVzdWx0X2J1ZiwgaW50IG1pbnNpemUsIGludCBtYXhzaXplLCBjb25zdCBjaGFyICp0ZXN0X2J1Zik7CitpbnQgVUlfZHVwX3ZlcmlmeV9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBmbGFncywKKwljaGFyICpyZXN1bHRfYnVmLCBpbnQgbWluc2l6ZSwgaW50IG1heHNpemUsIGNvbnN0IGNoYXIgKnRlc3RfYnVmKTsKK2ludCBVSV9hZGRfaW5wdXRfYm9vbGVhbihVSSAqdWksIGNvbnN0IGNoYXIgKnByb21wdCwgY29uc3QgY2hhciAqYWN0aW9uX2Rlc2MsCisJY29uc3QgY2hhciAqb2tfY2hhcnMsIGNvbnN0IGNoYXIgKmNhbmNlbF9jaGFycywKKwlpbnQgZmxhZ3MsIGNoYXIgKnJlc3VsdF9idWYpOworaW50IFVJX2R1cF9pbnB1dF9ib29sZWFuKFVJICp1aSwgY29uc3QgY2hhciAqcHJvbXB0LCBjb25zdCBjaGFyICphY3Rpb25fZGVzYywKKwljb25zdCBjaGFyICpva19jaGFycywgY29uc3QgY2hhciAqY2FuY2VsX2NoYXJzLAorCWludCBmbGFncywgY2hhciAqcmVzdWx0X2J1Zik7CitpbnQgVUlfYWRkX2luZm9fc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqdGV4dCk7CitpbnQgVUlfZHVwX2luZm9fc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqdGV4dCk7CitpbnQgVUlfYWRkX2Vycm9yX3N0cmluZyhVSSAqdWksIGNvbnN0IGNoYXIgKnRleHQpOworaW50IFVJX2R1cF9lcnJvcl9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICp0ZXh0KTsKKworLyogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSBmbGFncy4gIFRoZXkgY2FuIGJlIG9yJ2VkIHRvZ2V0aGVyLiAqLworLyogVXNlIHRvIGhhdmUgZWNob2luZyBvZiBpbnB1dCAqLworI2RlZmluZSBVSV9JTlBVVF9GTEFHX0VDSE8JCTB4MDEKKy8qIFVzZSBhIGRlZmF1bHQgcGFzc3dvcmQuICBXaGVyZSB0aGF0IHBhc3N3b3JkIGlzIGZvdW5kIGlzIGNvbXBsZXRlbHkKKyAgIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiwgaXQgbWlnaHQgZm9yIGV4YW1wbGUgYmUgaW4gdGhlIHVzZXIgZGF0YSBzZXQKKyAgIHdpdGggVUlfYWRkX3VzZXJfZGF0YSgpLiAgSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGhhdmUgbW9yZSB0aGFuCisgICBvbmUgaW5wdXQgaW4gZWFjaCBVSSBiZWluZyBtYXJrZWQgd2l0aCB0aGlzIGZsYWcsIG9yIHRoZSBhcHBsaWNhdGlvbgorICAgbWlnaHQgZ2V0IGNvbmZ1c2VkLiAqLworI2RlZmluZSBVSV9JTlBVVF9GTEFHX0RFRkFVTFRfUFdECTB4MDIKKworLyogVGhlIHVzZXIgb2YgdGhlc2Ugcm91dGluZXMgbWF5IHdhbnQgdG8gZGVmaW5lIGZsYWdzIG9mIHRoZWlyIG93bi4gIFRoZSBjb3JlCisgICBVSSB3b24ndCBsb29rIGF0IHRob3NlLCBidXQgd2lsbCBwYXNzIHRoZW0gb24gdG8gdGhlIG1ldGhvZCByb3V0aW5lcy4gIFRoZXkKKyAgIG11c3QgdXNlIGhpZ2hlciBiaXRzIHNvIHRoZXkgZG9uJ3QgZ2V0IGNvbmZ1c2VkIHdpdGggdGhlIFVJIGJpdHMgYWJvdmUuCisgICBVSV9JTlBVVF9GTEFHX1VTRVJfQkFTRSB0ZWxscyB3aGljaCBpcyB0aGUgbG93ZXN0IGJpdCB0byB1c2UuICBBIGdvb2QKKyAgIGV4YW1wbGUgb2YgdXNlIGlzIHRoaXM6CisKKwkjZGVmaW5lIE1ZX1VJX0ZMQUcxCSgweDAxIDw8IFVJX0lOUFVUX0ZMQUdfVVNFUl9CQVNFKQorCisqLworI2RlZmluZSBVSV9JTlBVVF9GTEFHX1VTRVJfQkFTRQkxNgorCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaGVscHMgY29uc3RydWN0IGEgcHJvbXB0LiAgb2JqZWN0X2Rlc2MgaXMgYQorICAgdGV4dHVhbCBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0LCBmb3IgZXhhbXBsZSAicGFzcyBwaHJhc2UiLAorICAgYW5kIG9iamVjdF9uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgKG1pZ2h0IGJlIGEgY2FyZCBuYW1lIG9yCisgICBhIGZpbGUgbmFtZS4KKyAgIFRoZSByZXR1cm5lZCBzdHJpbmcgc2hhbGwgYWx3YXlzIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCB3aXRoCisgICBPUEVOU1NMX21hbGxvYygpLCBhbmQgbmVlZCB0byBiZSBmcmVlJ2Qgd2l0aCBPUEVOU1NMX2ZyZWUoKS4KKworICAgSWYgdGhlIHVpX21ldGhvZCBkb2Vzbid0IGNvbnRhaW4gYSBwb2ludGVyIHRvIGEgdXNlci1kZWZpbmVkIHByb21wdAorICAgY29uc3RydWN0b3IsIGEgZGVmYXVsdCBzdHJpbmcgaXMgYnVpbHQsIGxvb2tpbmcgbGlrZSB0aGlzOgorCisJIkVudGVyIHtvYmplY3RfZGVzY30gZm9yIHtvYmplY3RfbmFtZX06IgorCisgICBTbywgaWYgb2JqZWN0X2Rlc2MgaGFzIHRoZSB2YWx1ZSAicGFzcyBwaHJhc2UiIGFuZCBvYmplY3RfbmFtZSBoYXMKKyAgIHRoZSB2YWx1ZSAiZm9vLmtleSIsIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzOgorCisJIkVudGVyIHBhc3MgcGhyYXNlIGZvciBmb28ua2V5OiIKKyovCitjaGFyICpVSV9jb25zdHJ1Y3RfcHJvbXB0KFVJICp1aV9tZXRob2QsCisJY29uc3QgY2hhciAqb2JqZWN0X2Rlc2MsIGNvbnN0IGNoYXIgKm9iamVjdF9uYW1lKTsKKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHVzZXItc3BlY2lmaWMgZGF0YS4KKyAgIEFueSBwcmV2aW91cyBzdWNoIHBvaW50ZXIgd2lsbCBiZSByZXR1cm5lZCBhbmQgcmVwbGFjZWQuCisKKyAgIEZvciBjYWxsYmFjayBwdXJwb3NlcywgdGhpcyBmdW5jdGlvbiBtYWtlcyBhIGxvdCBtb3JlIHNlbnNlIHRoYW4gdXNpbmcKKyAgIGV4X2RhdGEsIHNpbmNlIHRoZSBsYXR0ZXIgcmVxdWlyZXMgdGhhdCBkaWZmZXJlbnQgcGFydHMgb2YgT3BlblNTTCBvcgorICAgYXBwbGljYXRpb25zIHNoYXJlIHRoZSBzYW1lIGV4X2RhdGEgaW5kZXguCisKKyAgIE5vdGUgdGhhdCB0aGUgVUlfT3BlblNTTCgpIG1ldGhvZCBjb21wbGV0ZWx5IGlnbm9yZXMgdGhlIHVzZXIgZGF0YS4KKyAgIE90aGVyIG1ldGhvZHMgbWF5IG5vdCwgaG93ZXZlci4gICovCit2b2lkICpVSV9hZGRfdXNlcl9kYXRhKFVJICp1aSwgdm9pZCAqdXNlcl9kYXRhKTsKKy8qIFdlIG5lZWQgYSB1c2VyIGRhdGEgcmV0cmlldmluZyBmdW5jdGlvbiBhcyB3ZWxsLiAgKi8KK3ZvaWQgKlVJX2dldDBfdXNlcl9kYXRhKFVJICp1aSk7CisKKy8qIFJldHVybiB0aGUgcmVzdWx0IGFzc29jaWF0ZWQgd2l0aCBhIHByb21wdCBnaXZlbiB3aXRoIHRoZSBpbmRleCBpLiAqLworY29uc3QgY2hhciAqVUlfZ2V0MF9yZXN1bHQoVUkgKnVpLCBpbnQgaSk7CisKKy8qIFdoZW4gYWxsIHN0cmluZ3MgaGF2ZSBiZWVuIGFkZGVkLCBwcm9jZXNzIHRoZSB3aG9sZSB0aGluZy4gKi8KK2ludCBVSV9wcm9jZXNzKFVJICp1aSk7CisKKy8qIEdpdmUgYSB1c2VyIGludGVyZmFjZSBwYXJhbWV0cmlzZWQgY29udHJvbCBjb21tYW5kcy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAgIHNlbmQgZG93biBhbiBpbnRlZ2VyLCBhIGRhdGEgcG9pbnRlciBvciBhIGZ1bmN0aW9uIHBvaW50ZXIsIGFzIHdlbGwgYXMKKyAgIGJlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gYSBVSS4gKi8KK2ludCBVSV9jdHJsKFVJICp1aSwgaW50IGNtZCwgbG9uZyBpLCB2b2lkICpwLCB2b2lkICgqZikodm9pZCkpOworCisvKiBUaGUgY29tbWFuZHMgKi8KKy8qIFVzZSBVSV9DT05UUk9MX1BSSU5UX0VSUk9SUyB3aXRoIHRoZSB2YWx1ZSAxIHRvIGhhdmUgVUlfcHJvY2VzcyBwcmludCB0aGUKKyAgIE9wZW5TU0wgZXJyb3Igc3RhY2sgYmVmb3JlIHByaW50aW5nIGFueSBpbmZvIG9yIGFkZGVkIGVycm9yIG1lc3NhZ2VzIGFuZAorICAgYmVmb3JlIGFueSBwcm9tcHRpbmcuICovCisjZGVmaW5lIFVJX0NUUkxfUFJJTlRfRVJST1JTCQkxCisvKiBDaGVjayBpZiBhIFVJX3Byb2Nlc3MoKSBpcyBwb3NzaWJsZSB0byBkbyBhZ2FpbiB3aXRoIHRoZSBzYW1lIGluc3RhbmNlIG9mCisgICBhIHVzZXIgaW50ZXJmYWNlLiAgVGhpcyBtYWtlcyBVSV9jdHJsKCkgcmV0dXJuIDEgaWYgaXQgaXMgcmVkb2FibGUsIGFuZCAwCisgICBpZiBub3QuICovCisjZGVmaW5lIFVJX0NUUkxfSVNfUkVET0FCTEUJCTIKKworCisvKiBTb21lIG1ldGhvZHMgbWF5IHVzZSBleHRyYSBkYXRhICovCisjZGVmaW5lIFVJX3NldF9hcHBfZGF0YShzLGFyZykgICAgICAgICBVSV9zZXRfZXhfZGF0YShzLDAsYXJnKQorI2RlZmluZSBVSV9nZXRfYXBwX2RhdGEocykgICAgICAgICAgICAgVUlfZ2V0X2V4X2RhdGEocywwKQoraW50IFVJX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwlDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgVUlfc2V0X2V4X2RhdGEoVUkgKnIsaW50IGlkeCx2b2lkICphcmcpOwordm9pZCAqVUlfZ2V0X2V4X2RhdGEoVUkgKnIsIGludCBpZHgpOworCisvKiBVc2Ugc3BlY2lmaWMgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBvbmUgKi8KK3ZvaWQgVUlfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IFVJX01FVEhPRCAqbWV0aCk7Citjb25zdCBVSV9NRVRIT0QgKlVJX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKTsKK2NvbnN0IFVJX01FVEhPRCAqVUlfZ2V0X21ldGhvZChVSSAqdWkpOworY29uc3QgVUlfTUVUSE9EICpVSV9zZXRfbWV0aG9kKFVJICp1aSwgY29uc3QgVUlfTUVUSE9EICptZXRoKTsKKworLyogVGhlIG1ldGhvZCB3aXRoIGFsbCB0aGUgYnVpbHQtaW4gdGhpbmdpZXMgKi8KK1VJX01FVEhPRCAqVUlfT3BlblNTTCh2b2lkKTsKKworCisvKiAtLS0tLS0tLS0tIEZvciBtZXRob2Qgd3JpdGVycyAtLS0tLS0tLS0tICovCisvKiBBIG1ldGhvZCBjb250YWlucyBhIG51bWJlciBvZiBmdW5jdGlvbnMgdGhhdCBpbXBsZW1lbnQgdGhlIGxvdyBsZXZlbAorICAgb2YgdGhlIFVzZXIgSW50ZXJmYWNlLiAgVGhlIGZ1bmN0aW9ucyBhcmU6CisKKwlhbiBvcGVuZXIJVGhpcyBmdW5jdGlvbiBzdGFydHMgYSBzZXNzaW9uLCBtYXliZSBieSBvcGVuaW5nCisJCQlhIGNoYW5uZWwgdG8gYSB0dHksIG9yIGJ5IG9wZW5pbmcgYSB3aW5kb3cuCisJYSB3cml0ZXIJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gd3JpdGUgYSBnaXZlbiBzdHJpbmcsCisJCQltYXliZSB0byB0aGUgdHR5LCBtYXliZSBhcyBhIGZpZWxkIGxhYmVsIGluIGEKKwkJCXdpbmRvdy4KKwlhIGZsdXNoZXIJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZmx1c2ggZXZlcnl0aGluZyB0aGF0CisJCQloYXMgYmVlbiBvdXRwdXQgc28gZmFyLiAgSXQgY2FuIGJlIHVzZWQgdG8gYWN0dWFsbHkKKwkJCWRpc3BsYXkgYSBkaWFsb2cgYm94IGFmdGVyIGl0IGhhcyBiZWVuIGJ1aWx0LgorCWEgcmVhZGVyCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgYSBnaXZlbiBwcm9tcHQsCisJCQltYXliZSBmcm9tIHRoZSB0dHksIG1heWJlIGZyb20gYSBmaWVsZCBpbiBhCisJCQl3aW5kb3cuICBOb3RlIHRoYXQgaXQncyBjYWxsZWQgd3RoIGFsbCBzdHJpbmcKKwkJCXN0cnVjdHVyZXMsIG5vdCBvbmx5IHRoZSBwcm9tcHQgb25lcywgc28gaXQgbXVzdAorCQkJY2hlY2sgc3VjaCB0aGluZ3MgaXRzZWxmLgorCWEgY2xvc2VyCVRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBzZXNzaW9uLCBtYXliZSBieSBjbG9zaW5nCisJCQl0aGUgY2hhbm5lbCB0byB0aGUgdHR5LCBvciBjbG9zaW5nIHRoZSB3aW5kb3cuCisKKyAgIEFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlIGV4cGVjdGVkIHRvIHJldHVybjoKKworCTAJb24gZXJyb3IuCisJMQlvbiBzdWNjZXNzLgorCS0xCW9uIG91dC1vZi1iYW5kIGV2ZW50cywgZm9yIGV4YW1wbGUgaWYgc29tZSBwcm9tcHRpbmcgaGFzCisJCWJlZW4gY2FuY2VsZWQgKGJ5IHByZXNzaW5nIEN0cmwtQywgZm9yIGV4YW1wbGUpLiAgVGhpcyBpcworCQlvbmx5IGNoZWNrZWQgd2hlbiByZXR1cm5lZCBieSB0aGUgZmx1c2hlciBvciB0aGUgcmVhZGVyLgorCisgICBUaGUgd2F5IHRoaXMgaXMgdXNlZCwgdGhlIG9wZW5lciBpcyBmaXJzdCBjYWxsZWQsIHRoZW4gdGhlIHdyaXRlciBmb3IgYWxsCisgICBzdHJpbmdzLCB0aGVuIHRoZSBmbHVzaGVyLCB0aGVuIHRoZSByZWFkZXIgZm9yIGFsbCBzdHJpbmdzIGFuZCBmaW5hbGx5IHRoZQorICAgY2xvc2VyLiAgTm90ZSB0aGF0IGlmIHlvdSB3YW50IHRvIHByb21wdCBmcm9tIGEgdGVybWluYWwgb3Igb3RoZXIgY29tbWFuZAorICAgbGluZSBpbnRlcmZhY2UsIHRoZSBiZXN0IGlzIHRvIGhhdmUgdGhlIHJlYWRlciBhbHNvIHdyaXRlIHRoZSBwcm9tcHRzCisgICBpbnN0ZWFkIG9mIGhhdmluZyB0aGUgd3JpdGVyIGRvIGl0LiAgSWYgeW91IHdhbnQgdG8gcHJvbXB0IGZyb20gYSBkaWFsb2cKKyAgIGJveCwgdGhlIHdyaXRlciBjYW4gYmUgdXNlZCB0byBidWlsZCB1cCB0aGUgY29udGVudHMgb2YgdGhlIGJveCwgYW5kIHRoZQorICAgZmx1c2hlciB0byBhY3R1YWxseSBkaXNwbGF5IHRoZSBib3ggYW5kIHJ1biB0aGUgZXZlbnQgbG9vcCB1bnRpbCBhbGwgZGF0YQorICAgaGFzIGJlZW4gZ2l2ZW4sIGFmdGVyIHdoaWNoIHRoZSByZWFkZXIgb25seSBncmFicyB0aGUgZ2l2ZW4gZGF0YSBhbmQgcHV0cworICAgdGhlbSBiYWNrIGludG8gdGhlIFVJIHN0cmluZ3MuCisKKyAgIEFsbCBtZXRob2QgZnVuY3Rpb25zIHRha2UgYSBVSSBhcyBhcmd1bWVudC4gIEFkZGl0aW9uYWxseSwgdGhlIHdyaXRlciBhbmQKKyAgIHRoZSByZWFkZXIgdGFrZSBhIFVJX1NUUklORy4KKyovCisKKy8qIFRoZSBVSV9TVFJJTkcgdHlwZSBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgdGhlIG5lZWRlZCBpbmZvCisgICBhYm91dCBhIHN0cmluZyBvciBhIHByb21wdCwgaW5jbHVkaW5nIHRlc3QgZGF0YSBmb3IgYSB2ZXJpZmljYXRpb24gcHJvbXB0LgorKi8KK3R5cGVkZWYgc3RydWN0IHVpX3N0cmluZ19zdCBVSV9TVFJJTkc7CitERUNMQVJFX1NUQUNLX09GKFVJX1NUUklORykKKworLyogVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBzdHJpbmdzIHRoYXQgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgICBUaGlzIGlzIG9ubHkgbmVlZGVkIGJ5IG1ldGhvZCBhdXRob3JzLiAqLworZW51bSBVSV9zdHJpbmdfdHlwZXMKKwl7CisJVUlUX05PTkU9MCwKKwlVSVRfUFJPTVBULAkJLyogUHJvbXB0IGZvciBhIHN0cmluZyAqLworCVVJVF9WRVJJRlksCQkvKiBQcm9tcHQgZm9yIGEgc3RyaW5nIGFuZCB2ZXJpZnkgKi8KKwlVSVRfQk9PTEVBTiwJCS8qIFByb21wdCBmb3IgYSB5ZXMvbm8gcmVzcG9uc2UgKi8KKwlVSVRfSU5GTywJCS8qIFNlbmQgaW5mbyB0byB0aGUgdXNlciAqLworCVVJVF9FUlJPUgkJLyogU2VuZCBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSB1c2VyICovCisJfTsKKworLyogQ3JlYXRlIGFuZCBtYW5pcHVsYXRlIG1ldGhvZHMgKi8KK1VJX01FVEhPRCAqVUlfY3JlYXRlX21ldGhvZChjaGFyICpuYW1lKTsKK3ZvaWQgVUlfZGVzdHJveV9tZXRob2QoVUlfTUVUSE9EICp1aV9tZXRob2QpOworaW50IFVJX21ldGhvZF9zZXRfb3BlbmVyKFVJX01FVEhPRCAqbWV0aG9kLCBpbnQgKCpvcGVuZXIpKFVJICp1aSkpOworaW50IFVJX21ldGhvZF9zZXRfd3JpdGVyKFVJX01FVEhPRCAqbWV0aG9kLCBpbnQgKCp3cml0ZXIpKFVJICp1aSwgVUlfU1RSSU5HICp1aXMpKTsKK2ludCBVSV9tZXRob2Rfc2V0X2ZsdXNoZXIoVUlfTUVUSE9EICptZXRob2QsIGludCAoKmZsdXNoZXIpKFVJICp1aSkpOworaW50IFVJX21ldGhvZF9zZXRfcmVhZGVyKFVJX01FVEhPRCAqbWV0aG9kLCBpbnQgKCpyZWFkZXIpKFVJICp1aSwgVUlfU1RSSU5HICp1aXMpKTsKK2ludCBVSV9tZXRob2Rfc2V0X2Nsb3NlcihVSV9NRVRIT0QgKm1ldGhvZCwgaW50ICgqY2xvc2VyKShVSSAqdWkpKTsKK2ludCBVSV9tZXRob2Rfc2V0X3Byb21wdF9jb25zdHJ1Y3RvcihVSV9NRVRIT0QgKm1ldGhvZCwgY2hhciAqKCpwcm9tcHRfY29uc3RydWN0b3IpKFVJKiB1aSwgY29uc3QgY2hhciogb2JqZWN0X2Rlc2MsIGNvbnN0IGNoYXIqIG9iamVjdF9uYW1lKSk7CitpbnQgKCpVSV9tZXRob2RfZ2V0X29wZW5lcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKik7CitpbnQgKCpVSV9tZXRob2RfZ2V0X3dyaXRlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKixVSV9TVFJJTkcqKTsKK2ludCAoKlVJX21ldGhvZF9nZXRfZmx1c2hlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKik7CitpbnQgKCpVSV9tZXRob2RfZ2V0X3JlYWRlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKixVSV9TVFJJTkcqKTsKK2ludCAoKlVJX21ldGhvZF9nZXRfY2xvc2VyKFVJX01FVEhPRCAqbWV0aG9kKSkoVUkqKTsKK2NoYXIqICgqVUlfbWV0aG9kX2dldF9wcm9tcHRfY29uc3RydWN0b3IoVUlfTUVUSE9EICptZXRob2QpKShVSSosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBoZWxwZXJzIGZvciBtZXRob2Qgd3JpdGVycyB0byBhY2Nlc3MgcmVsZXZhbnQKKyAgIGRhdGEgZnJvbSBhIFVJX1NUUklORy4gKi8KKworLyogUmV0dXJuIHR5cGUgb2YgdGhlIFVJX1NUUklORyAqLworZW51bSBVSV9zdHJpbmdfdHlwZXMgVUlfZ2V0X3N0cmluZ190eXBlKFVJX1NUUklORyAqdWlzKTsKKy8qIFJldHVybiBpbnB1dCBmbGFncyBvZiB0aGUgVUlfU1RSSU5HICovCitpbnQgVUlfZ2V0X2lucHV0X2ZsYWdzKFVJX1NUUklORyAqdWlzKTsKKy8qIFJldHVybiB0aGUgYWN0dWFsIHN0cmluZyB0byBvdXRwdXQgKHRoZSBwcm9tcHQsIGluZm8gb3IgZXJyb3IpICovCitjb25zdCBjaGFyICpVSV9nZXQwX291dHB1dF9zdHJpbmcoVUlfU1RSSU5HICp1aXMpOworLyogUmV0dXJuIHRoZSBvcHRpb25hbCBhY3Rpb24gc3RyaW5nIHRvIG91dHB1dCAodGhlIGJvb2xlYW4gcHJvbXRwIGluc3RydWN0aW9uKSAqLworY29uc3QgY2hhciAqVUlfZ2V0MF9hY3Rpb25fc3RyaW5nKFVJX1NUUklORyAqdWlzKTsKKy8qIFJldHVybiB0aGUgcmVzdWx0IG9mIGEgcHJvbXB0ICovCitjb25zdCBjaGFyICpVSV9nZXQwX3Jlc3VsdF9zdHJpbmcoVUlfU1RSSU5HICp1aXMpOworLyogUmV0dXJuIHRoZSBzdHJpbmcgdG8gdGVzdCB0aGUgcmVzdWx0IGFnYWluc3QuICBPbmx5IHVzZWZ1bCB3aXRoIHZlcmlmaWVzLiAqLworY29uc3QgY2hhciAqVUlfZ2V0MF90ZXN0X3N0cmluZyhVSV9TVFJJTkcgKnVpcyk7CisvKiBSZXR1cm4gdGhlIHJlcXVpcmVkIG1pbmltdW0gc2l6ZSBvZiB0aGUgcmVzdWx0ICovCitpbnQgVUlfZ2V0X3Jlc3VsdF9taW5zaXplKFVJX1NUUklORyAqdWlzKTsKKy8qIFJldHVybiB0aGUgcmVxdWlyZWQgbWF4aW11bSBzaXplIG9mIHRoZSByZXN1bHQgKi8KK2ludCBVSV9nZXRfcmVzdWx0X21heHNpemUoVUlfU1RSSU5HICp1aXMpOworLyogU2V0IHRoZSByZXN1bHQgb2YgYSBVSV9TVFJJTkcuICovCitpbnQgVUlfc2V0X3Jlc3VsdChVSSAqdWksIFVJX1NUUklORyAqdWlzLCBjb25zdCBjaGFyICpyZXN1bHQpOworCisKKy8qIEEgY291cGxlIG9mIHBvcHVsYXIgdXRpbGl0eSBmdW5jdGlvbnMgKi8KK2ludCBVSV9VVElMX3JlYWRfcHdfc3RyaW5nKGNoYXIgKmJ1ZixpbnQgbGVuZ3RoLGNvbnN0IGNoYXIgKnByb21wdCxpbnQgdmVyaWZ5KTsKK2ludCBVSV9VVElMX3JlYWRfcHcoY2hhciAqYnVmLGNoYXIgKmJ1ZmYsaW50IHNpemUsY29uc3QgY2hhciAqcHJvbXB0LGludCB2ZXJpZnkpOworCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfVUlfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBVSSBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBVSV9GX0dFTkVSQUxfQUxMT0NBVEVfQk9PTEVBTgkJCSAxMDgKKyNkZWZpbmUgVUlfRl9HRU5FUkFMX0FMTE9DQVRFX1BST01QVAkJCSAxMDkKKyNkZWZpbmUgVUlfRl9HRU5FUkFMX0FMTE9DQVRFX1NUUklORwkJCSAxMDAKKyNkZWZpbmUgVUlfRl9VSV9DVFJMCQkJCQkgMTExCisjZGVmaW5lIFVJX0ZfVUlfRFVQX0VSUk9SX1NUUklORwkJCSAxMDEKKyNkZWZpbmUgVUlfRl9VSV9EVVBfSU5GT19TVFJJTkcJCQkJIDEwMgorI2RlZmluZSBVSV9GX1VJX0RVUF9JTlBVVF9CT09MRUFOCQkJIDExMAorI2RlZmluZSBVSV9GX1VJX0RVUF9JTlBVVF9TVFJJTkcJCQkgMTAzCisjZGVmaW5lIFVJX0ZfVUlfRFVQX1ZFUklGWV9TVFJJTkcJCQkgMTA2CisjZGVmaW5lIFVJX0ZfVUlfR0VUMF9SRVNVTFQJCQkJIDEwNworI2RlZmluZSBVSV9GX1VJX05FV19NRVRIT0QJCQkJIDEwNAorI2RlZmluZSBVSV9GX1VJX1NFVF9SRVNVTFQJCQkJIDEwNQorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIFVJX1JfQ09NTU9OX09LX0FORF9DQU5DRUxfQ0hBUkFDVEVSUwkJIDEwNAorI2RlZmluZSBVSV9SX0lOREVYX1RPT19MQVJHRQkJCQkgMTAyCisjZGVmaW5lIFVJX1JfSU5ERVhfVE9PX1NNQUxMCQkJCSAxMDMKKyNkZWZpbmUgVUlfUl9OT19SRVNVTFRfQlVGRkVSCQkJCSAxMDUKKyNkZWZpbmUgVUlfUl9SRVNVTFRfVE9PX0xBUkdFCQkJCSAxMDAKKyNkZWZpbmUgVUlfUl9SRVNVTFRfVE9PX1NNQUxMCQkJCSAxMDEKKyNkZWZpbmUgVUlfUl9VTktOT1dOX0NPTlRST0xfQ09NTUFORAkJCSAxMDYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aV9jb21wYXQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aV9jb21wYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2UwZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3VpL3VpX2NvbXBhdC5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIGNyeXB0by91aS91aV9jb21wYXQuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3VpX2NvbXBhdC5oPgorCitpbnQgX29zc2xfb2xkX2Rlc19yZWFkX3B3X3N0cmluZyhjaGFyICpidWYsaW50IGxlbmd0aCxjb25zdCBjaGFyICpwcm9tcHQsaW50IHZlcmlmeSkKKwl7CisJcmV0dXJuIFVJX1VUSUxfcmVhZF9wd19zdHJpbmcoYnVmLCBsZW5ndGgsIHByb21wdCwgdmVyaWZ5KTsKKwl9CisKK2ludCBfb3NzbF9vbGRfZGVzX3JlYWRfcHcoY2hhciAqYnVmLGNoYXIgKmJ1ZmYsaW50IHNpemUsY29uc3QgY2hhciAqcHJvbXB0LGludCB2ZXJpZnkpCisJeworCXJldHVybiBVSV9VVElMX3JlYWRfcHcoYnVmLCBidWZmLCBzaXplLCBwcm9tcHQsIHZlcmlmeSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3VpL3VpX2NvbXBhdC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3VpL3VpX2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNWM5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdWkvdWlfY29tcGF0LmgKQEAgLTAsMCArMSw4MyBAQAorLyogY3J5cHRvL3VpL3VpLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9VSV9DT01QQVRfSAorI2RlZmluZSBIRUFERVJfVUlfQ09NUEFUX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3VpLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdlcmUgcHJldmlvdXNseSBwYXJ0IG9mIHRoZSBERVMgc2VjdGlvbiwKKyAgIGFuZCBhcmUgcHJvdmlkZWQgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zLiAqLworCisjZGVmaW5lIGRlc19yZWFkX3B3X3N0cmluZyhiLGwscCx2KSBcCisJX29zc2xfb2xkX2Rlc19yZWFkX3B3X3N0cmluZygoYiksKGwpLChwKSwodikpCisjZGVmaW5lIGRlc19yZWFkX3B3KGIsYmYscyxwLHYpIFwKKwlfb3NzbF9vbGRfZGVzX3JlYWRfcHcoKGIpLChiZiksKHMpLChwKSwodikpCisKK2ludCBfb3NzbF9vbGRfZGVzX3JlYWRfcHdfc3RyaW5nKGNoYXIgKmJ1ZixpbnQgbGVuZ3RoLGNvbnN0IGNoYXIgKnByb21wdCxpbnQgdmVyaWZ5KTsKK2ludCBfb3NzbF9vbGRfZGVzX3JlYWRfcHcoY2hhciAqYnVmLGNoYXIgKmJ1ZmYsaW50IHNpemUsY29uc3QgY2hhciAqcHJvbXB0LGludCB2ZXJpZnkpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3VpL3VpX2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3VpL3VpX2Vyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Yjk2MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdWkvdWlfZXJyLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIGNyeXB0by91aS91aV9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3VpLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9VSSxmdW5jLDApCisjZGVmaW5lIEVSUl9SRUFTT04ocmVhc29uKSBFUlJfUEFDSyhFUlJfTElCX1VJLDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFVJX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoVUlfRl9HRU5FUkFMX0FMTE9DQVRFX0JPT0xFQU4pLAkiR0VORVJBTF9BTExPQ0FURV9CT09MRUFOIn0sCit7RVJSX0ZVTkMoVUlfRl9HRU5FUkFMX0FMTE9DQVRFX1BST01QVCksCSJHRU5FUkFMX0FMTE9DQVRFX1BST01QVCJ9LAore0VSUl9GVU5DKFVJX0ZfR0VORVJBTF9BTExPQ0FURV9TVFJJTkcpLAkiR0VORVJBTF9BTExPQ0FURV9TVFJJTkcifSwKK3tFUlJfRlVOQyhVSV9GX1VJX0NUUkwpLAkiVUlfY3RybCJ9LAore0VSUl9GVU5DKFVJX0ZfVUlfRFVQX0VSUk9SX1NUUklORyksCSJVSV9kdXBfZXJyb3Jfc3RyaW5nIn0sCit7RVJSX0ZVTkMoVUlfRl9VSV9EVVBfSU5GT19TVFJJTkcpLAkiVUlfZHVwX2luZm9fc3RyaW5nIn0sCit7RVJSX0ZVTkMoVUlfRl9VSV9EVVBfSU5QVVRfQk9PTEVBTiksCSJVSV9kdXBfaW5wdXRfYm9vbGVhbiJ9LAore0VSUl9GVU5DKFVJX0ZfVUlfRFVQX0lOUFVUX1NUUklORyksCSJVSV9kdXBfaW5wdXRfc3RyaW5nIn0sCit7RVJSX0ZVTkMoVUlfRl9VSV9EVVBfVkVSSUZZX1NUUklORyksCSJVSV9kdXBfdmVyaWZ5X3N0cmluZyJ9LAore0VSUl9GVU5DKFVJX0ZfVUlfR0VUMF9SRVNVTFQpLAkiVUlfZ2V0MF9yZXN1bHQifSwKK3tFUlJfRlVOQyhVSV9GX1VJX05FV19NRVRIT0QpLAkiVUlfbmV3X21ldGhvZCJ9LAore0VSUl9GVU5DKFVJX0ZfVUlfU0VUX1JFU1VMVCksCSJVSV9zZXRfcmVzdWx0In0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgVUlfc3RyX3JlYXNvbnNbXT0KKwl7Cit7RVJSX1JFQVNPTihVSV9SX0NPTU1PTl9PS19BTkRfQ0FOQ0VMX0NIQVJBQ1RFUlMpLCJjb21tb24gb2sgYW5kIGNhbmNlbCBjaGFyYWN0ZXJzIn0sCit7RVJSX1JFQVNPTihVSV9SX0lOREVYX1RPT19MQVJHRSkgICAgICAgICwiaW5kZXggdG9vIGxhcmdlIn0sCit7RVJSX1JFQVNPTihVSV9SX0lOREVYX1RPT19TTUFMTCkgICAgICAgICwiaW5kZXggdG9vIHNtYWxsIn0sCit7RVJSX1JFQVNPTihVSV9SX05PX1JFU1VMVF9CVUZGRVIpICAgICAgICwibm8gcmVzdWx0IGJ1ZmZlciJ9LAore0VSUl9SRUFTT04oVUlfUl9SRVNVTFRfVE9PX0xBUkdFKSAgICAgICAsInJlc3VsdCB0b28gbGFyZ2UifSwKK3tFUlJfUkVBU09OKFVJX1JfUkVTVUxUX1RPT19TTUFMTCkgICAgICAgLCJyZXN1bHQgdG9vIHNtYWxsIn0sCit7RVJSX1JFQVNPTihVSV9SX1VOS05PV05fQ09OVFJPTF9DT01NQU5EKSwidW5rbm93biBjb250cm9sIGNvbW1hbmQifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfVUlfc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworCWlmIChFUlJfZnVuY19lcnJvcl9zdHJpbmcoVUlfc3RyX2Z1bmN0c1swXS5lcnJvcikgPT0gTlVMTCkKKwkJeworCQlFUlJfbG9hZF9zdHJpbmdzKDAsVUlfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxVSV9zdHJfcmVhc29ucyk7CisJCX0KKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aV9saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aV9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGFiYzI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3VpL3VpX2xpYi5jCkBAIC0wLDAgKzEsOTI0IEBACisvKiBjcnlwdG8vdWkvdWlfbGliLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3VpLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlICJ1aV9sb2NsLmgiCisKK0lNUExFTUVOVF9TVEFDS19PRihVSV9TVFJJTkdfU1QpCisKK3N0YXRpYyBjb25zdCBVSV9NRVRIT0QgKmRlZmF1bHRfVUlfbWV0aD1OVUxMOworCitVSSAqVUlfbmV3KHZvaWQpCisJeworCXJldHVybihVSV9uZXdfbWV0aG9kKE5VTEwpKTsKKwl9CisKK1VJICpVSV9uZXdfbWV0aG9kKGNvbnN0IFVJX01FVEhPRCAqbWV0aG9kKQorCXsKKwlVSSAqcmV0OworCisJcmV0PShVSSAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihVSSkpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlVSWVycihVSV9GX1VJX05FV19NRVRIT0QsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmIChtZXRob2QgPT0gTlVMTCkKKwkJcmV0LT5tZXRoPVVJX2dldF9kZWZhdWx0X21ldGhvZCgpOworCWVsc2UKKwkJcmV0LT5tZXRoPW1ldGhvZDsKKworCXJldC0+c3RyaW5ncz1OVUxMOworCXJldC0+dXNlcl9kYXRhPU5VTEw7CisJcmV0LT5mbGFncz0wOworCUNSWVBUT19uZXdfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfVUksIHJldCwgJnJldC0+ZXhfZGF0YSk7CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyB2b2lkIGZyZWVfc3RyaW5nKFVJX1NUUklORyAqdWlzKQorCXsKKwlpZiAodWlzLT5mbGFncyAmIE9VVF9TVFJJTkdfRlJFRUFCTEUpCisJCXsKKwkJT1BFTlNTTF9mcmVlKChjaGFyICopdWlzLT5vdXRfc3RyaW5nKTsKKwkJc3dpdGNoKHVpcy0+dHlwZSkKKwkJCXsKKwkJY2FzZSBVSVRfQk9PTEVBTjoKKwkJCU9QRU5TU0xfZnJlZSgoY2hhciAqKXVpcy0+Xy5ib29sZWFuX2RhdGEuYWN0aW9uX2Rlc2MpOworCQkJT1BFTlNTTF9mcmVlKChjaGFyICopdWlzLT5fLmJvb2xlYW5fZGF0YS5va19jaGFycyk7CisJCQlPUEVOU1NMX2ZyZWUoKGNoYXIgKil1aXMtPl8uYm9vbGVhbl9kYXRhLmNhbmNlbF9jaGFycyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQkJfQorCQl9CisJT1BFTlNTTF9mcmVlKHVpcyk7CisJfQorCit2b2lkIFVJX2ZyZWUoVUkgKnVpKQorCXsKKwlpZiAodWkgPT0gTlVMTCkKKwkJcmV0dXJuOworCXNrX1VJX1NUUklOR19wb3BfZnJlZSh1aS0+c3RyaW5ncyxmcmVlX3N0cmluZyk7CisJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfVUksIHVpLCAmdWktPmV4X2RhdGEpOworCU9QRU5TU0xfZnJlZSh1aSk7CisJfQorCitzdGF0aWMgaW50IGFsbG9jYXRlX3N0cmluZ19zdGFjayhVSSAqdWkpCisJeworCWlmICh1aS0+c3RyaW5ncyA9PSBOVUxMKQorCQl7CisJCXVpLT5zdHJpbmdzPXNrX1VJX1NUUklOR19uZXdfbnVsbCgpOworCQlpZiAodWktPnN0cmluZ3MgPT0gTlVMTCkKKwkJCXsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCXJldHVybiAwOworCX0KKworc3RhdGljIFVJX1NUUklORyAqZ2VuZXJhbF9hbGxvY2F0ZV9wcm9tcHQoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsCisJaW50IHByb21wdF9mcmVlYWJsZSwgZW51bSBVSV9zdHJpbmdfdHlwZXMgdHlwZSwgaW50IGlucHV0X2ZsYWdzLAorCWNoYXIgKnJlc3VsdF9idWYpCisJeworCVVJX1NUUklORyAqcmV0ID0gTlVMTDsKKworCWlmIChwcm9tcHQgPT0gTlVMTCkKKwkJeworCQlVSWVycihVSV9GX0dFTkVSQUxfQUxMT0NBVEVfUFJPTVBULEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCX0KKwllbHNlIGlmICgodHlwZSA9PSBVSVRfUFJPTVBUIHx8IHR5cGUgPT0gVUlUX1ZFUklGWQorCQkJIHx8IHR5cGUgPT0gVUlUX0JPT0xFQU4pICYmIHJlc3VsdF9idWYgPT0gTlVMTCkKKwkJeworCQlVSWVycihVSV9GX0dFTkVSQUxfQUxMT0NBVEVfUFJPTVBULFVJX1JfTk9fUkVTVUxUX0JVRkZFUik7CisJCX0KKwllbHNlIGlmICgocmV0ID0gKFVJX1NUUklORyAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihVSV9TVFJJTkcpKSkpCisJCXsKKwkJcmV0LT5vdXRfc3RyaW5nPXByb21wdDsKKwkJcmV0LT5mbGFncz1wcm9tcHRfZnJlZWFibGUgPyBPVVRfU1RSSU5HX0ZSRUVBQkxFIDogMDsKKwkJcmV0LT5pbnB1dF9mbGFncz1pbnB1dF9mbGFnczsKKwkJcmV0LT50eXBlPXR5cGU7CisJCXJldC0+cmVzdWx0X2J1Zj1yZXN1bHRfYnVmOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyBpbnQgZ2VuZXJhbF9hbGxvY2F0ZV9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsCisJaW50IHByb21wdF9mcmVlYWJsZSwgZW51bSBVSV9zdHJpbmdfdHlwZXMgdHlwZSwgaW50IGlucHV0X2ZsYWdzLAorCWNoYXIgKnJlc3VsdF9idWYsIGludCBtaW5zaXplLCBpbnQgbWF4c2l6ZSwgY29uc3QgY2hhciAqdGVzdF9idWYpCisJeworCWludCByZXQgPSAtMTsKKwlVSV9TVFJJTkcgKnMgPSBnZW5lcmFsX2FsbG9jYXRlX3Byb21wdCh1aSwgcHJvbXB0LCBwcm9tcHRfZnJlZWFibGUsCisJCXR5cGUsIGlucHV0X2ZsYWdzLCByZXN1bHRfYnVmKTsKKworCWlmIChzKQorCQl7CisJCWlmIChhbGxvY2F0ZV9zdHJpbmdfc3RhY2sodWkpID49IDApCisJCQl7CisJCQlzLT5fLnN0cmluZ19kYXRhLnJlc3VsdF9taW5zaXplPW1pbnNpemU7CisJCQlzLT5fLnN0cmluZ19kYXRhLnJlc3VsdF9tYXhzaXplPW1heHNpemU7CisJCQlzLT5fLnN0cmluZ19kYXRhLnRlc3RfYnVmPXRlc3RfYnVmOworCQkJcmV0PXNrX1VJX1NUUklOR19wdXNoKHVpLT5zdHJpbmdzLCBzKTsKKwkJCS8qIHNrX3B1c2goKSByZXR1cm5zIDAgb24gZXJyb3IuICBMZXQncyBhZGRhcHQgdGhhdCAqLworCQkJaWYgKHJldCA8PSAwKSByZXQtLTsKKwkJCX0KKwkJZWxzZQorCQkJZnJlZV9zdHJpbmcocyk7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIGludCBnZW5lcmFsX2FsbG9jYXRlX2Jvb2xlYW4oVUkgKnVpLAorCWNvbnN0IGNoYXIgKnByb21wdCwgY29uc3QgY2hhciAqYWN0aW9uX2Rlc2MsCisJY29uc3QgY2hhciAqb2tfY2hhcnMsIGNvbnN0IGNoYXIgKmNhbmNlbF9jaGFycywKKwlpbnQgcHJvbXB0X2ZyZWVhYmxlLCBlbnVtIFVJX3N0cmluZ190eXBlcyB0eXBlLCBpbnQgaW5wdXRfZmxhZ3MsCisJY2hhciAqcmVzdWx0X2J1ZikKKwl7CisJaW50IHJldCA9IC0xOworCVVJX1NUUklORyAqczsKKwljb25zdCBjaGFyICpwOworCisJaWYgKG9rX2NoYXJzID09IE5VTEwpCisJCXsKKwkJVUllcnIoVUlfRl9HRU5FUkFMX0FMTE9DQVRFX0JPT0xFQU4sRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJfQorCWVsc2UgaWYgKGNhbmNlbF9jaGFycyA9PSBOVUxMKQorCQl7CisJCVVJZXJyKFVJX0ZfR0VORVJBTF9BTExPQ0FURV9CT09MRUFOLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCX0KKwllbHNlCisJCXsKKwkJZm9yKHAgPSBva19jaGFyczsgKnA7IHArKykKKwkJCXsKKwkJCWlmIChzdHJjaHIoY2FuY2VsX2NoYXJzLCAqcCkpCisJCQkJeworCQkJCVVJZXJyKFVJX0ZfR0VORVJBTF9BTExPQ0FURV9CT09MRUFOLAorCQkJCQlVSV9SX0NPTU1PTl9PS19BTkRfQ0FOQ0VMX0NIQVJBQ1RFUlMpOworCQkJCX0KKwkJCX0KKworCQlzID0gZ2VuZXJhbF9hbGxvY2F0ZV9wcm9tcHQodWksIHByb21wdCwgcHJvbXB0X2ZyZWVhYmxlLAorCQkJdHlwZSwgaW5wdXRfZmxhZ3MsIHJlc3VsdF9idWYpOworCisJCWlmIChzKQorCQkJeworCQkJaWYgKGFsbG9jYXRlX3N0cmluZ19zdGFjayh1aSkgPj0gMCkKKwkJCQl7CisJCQkJcy0+Xy5ib29sZWFuX2RhdGEuYWN0aW9uX2Rlc2MgPSBhY3Rpb25fZGVzYzsKKwkJCQlzLT5fLmJvb2xlYW5fZGF0YS5va19jaGFycyA9IG9rX2NoYXJzOworCQkJCXMtPl8uYm9vbGVhbl9kYXRhLmNhbmNlbF9jaGFycyA9IGNhbmNlbF9jaGFyczsKKwkJCQlyZXQ9c2tfVUlfU1RSSU5HX3B1c2godWktPnN0cmluZ3MsIHMpOworCQkJCS8qIHNrX3B1c2goKSByZXR1cm5zIDAgb24gZXJyb3IuCisJCQkJICAgTGV0J3MgYWRkYXB0IHRoYXQgKi8KKwkJCQlpZiAocmV0IDw9IDApIHJldC0tOworCQkJCX0KKwkJCWVsc2UKKwkJCQlmcmVlX3N0cmluZyhzKTsKKwkJCX0KKwkJfQorCXJldHVybiByZXQ7CisJfQorCisvKiBSZXR1cm5zIHRoZSBpbmRleCB0byB0aGUgcGxhY2UgaW4gdGhlIHN0YWNrIG9yIC0xIGZvciBlcnJvci4gIFVzZXMgYQorICAgZGlyZWN0IHJlZmVyZW5jZSB0byB0aGUgcHJvbXB0LiAgKi8KK2ludCBVSV9hZGRfaW5wdXRfc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgZmxhZ3MsCisJY2hhciAqcmVzdWx0X2J1ZiwgaW50IG1pbnNpemUsIGludCBtYXhzaXplKQorCXsKKwlyZXR1cm4gZ2VuZXJhbF9hbGxvY2F0ZV9zdHJpbmcodWksIHByb21wdCwgMCwKKwkJVUlUX1BST01QVCwgZmxhZ3MsIHJlc3VsdF9idWYsIG1pbnNpemUsIG1heHNpemUsIE5VTEwpOworCX0KKworLyogU2FtZSBhcyBVSV9hZGRfaW5wdXRfc3RyaW5nKCksIGV4Y2VwdHMgaXQgdGFrZXMgYSBjb3B5IG9mIHRoZSBwcm9tcHQgKi8KK2ludCBVSV9kdXBfaW5wdXRfc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgZmxhZ3MsCisJY2hhciAqcmVzdWx0X2J1ZiwgaW50IG1pbnNpemUsIGludCBtYXhzaXplKQorCXsKKwljaGFyICpwcm9tcHRfY29weT1OVUxMOworCisJaWYgKHByb21wdCkKKwkJeworCQlwcm9tcHRfY29weT1CVUZfc3RyZHVwKHByb21wdCk7CisJCWlmIChwcm9tcHRfY29weSA9PSBOVUxMKQorCQkJeworCQkJVUllcnIoVUlfRl9VSV9EVVBfSU5QVVRfU1RSSU5HLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJCisJcmV0dXJuIGdlbmVyYWxfYWxsb2NhdGVfc3RyaW5nKHVpLCBwcm9tcHRfY29weSwgMSwKKwkJVUlUX1BST01QVCwgZmxhZ3MsIHJlc3VsdF9idWYsIG1pbnNpemUsIG1heHNpemUsIE5VTEwpOworCX0KKworaW50IFVJX2FkZF92ZXJpZnlfc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgZmxhZ3MsCisJY2hhciAqcmVzdWx0X2J1ZiwgaW50IG1pbnNpemUsIGludCBtYXhzaXplLCBjb25zdCBjaGFyICp0ZXN0X2J1ZikKKwl7CisJcmV0dXJuIGdlbmVyYWxfYWxsb2NhdGVfc3RyaW5nKHVpLCBwcm9tcHQsIDAsCisJCVVJVF9WRVJJRlksIGZsYWdzLCByZXN1bHRfYnVmLCBtaW5zaXplLCBtYXhzaXplLCB0ZXN0X2J1Zik7CisJfQorCitpbnQgVUlfZHVwX3ZlcmlmeV9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBmbGFncywKKwljaGFyICpyZXN1bHRfYnVmLCBpbnQgbWluc2l6ZSwgaW50IG1heHNpemUsIGNvbnN0IGNoYXIgKnRlc3RfYnVmKQorCXsKKwljaGFyICpwcm9tcHRfY29weT1OVUxMOworCisJaWYgKHByb21wdCkKKwkJeworCQlwcm9tcHRfY29weT1CVUZfc3RyZHVwKHByb21wdCk7CisJCWlmIChwcm9tcHRfY29weSA9PSBOVUxMKQorCQkJeworCQkJVUllcnIoVUlfRl9VSV9EVVBfVkVSSUZZX1NUUklORyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkKKwlyZXR1cm4gZ2VuZXJhbF9hbGxvY2F0ZV9zdHJpbmcodWksIHByb21wdF9jb3B5LCAxLAorCQlVSVRfVkVSSUZZLCBmbGFncywgcmVzdWx0X2J1ZiwgbWluc2l6ZSwgbWF4c2l6ZSwgdGVzdF9idWYpOworCX0KKworaW50IFVJX2FkZF9pbnB1dF9ib29sZWFuKFVJICp1aSwgY29uc3QgY2hhciAqcHJvbXB0LCBjb25zdCBjaGFyICphY3Rpb25fZGVzYywKKwljb25zdCBjaGFyICpva19jaGFycywgY29uc3QgY2hhciAqY2FuY2VsX2NoYXJzLAorCWludCBmbGFncywgY2hhciAqcmVzdWx0X2J1ZikKKwl7CisJcmV0dXJuIGdlbmVyYWxfYWxsb2NhdGVfYm9vbGVhbih1aSwgcHJvbXB0LCBhY3Rpb25fZGVzYywKKwkJb2tfY2hhcnMsIGNhbmNlbF9jaGFycywgMCwgVUlUX0JPT0xFQU4sIGZsYWdzLCByZXN1bHRfYnVmKTsKKwl9CisKK2ludCBVSV9kdXBfaW5wdXRfYm9vbGVhbihVSSAqdWksIGNvbnN0IGNoYXIgKnByb21wdCwgY29uc3QgY2hhciAqYWN0aW9uX2Rlc2MsCisJY29uc3QgY2hhciAqb2tfY2hhcnMsIGNvbnN0IGNoYXIgKmNhbmNlbF9jaGFycywKKwlpbnQgZmxhZ3MsIGNoYXIgKnJlc3VsdF9idWYpCisJeworCWNoYXIgKnByb21wdF9jb3B5ID0gTlVMTDsKKwljaGFyICphY3Rpb25fZGVzY19jb3B5ID0gTlVMTDsKKwljaGFyICpva19jaGFyc19jb3B5ID0gTlVMTDsKKwljaGFyICpjYW5jZWxfY2hhcnNfY29weSA9IE5VTEw7CisKKwlpZiAocHJvbXB0KQorCQl7CisJCXByb21wdF9jb3B5PUJVRl9zdHJkdXAocHJvbXB0KTsKKwkJaWYgKHByb21wdF9jb3B5ID09IE5VTEwpCisJCQl7CisJCQlVSWVycihVSV9GX1VJX0RVUF9JTlBVVF9CT09MRUFOLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCisJaWYgKGFjdGlvbl9kZXNjKQorCQl7CisJCWFjdGlvbl9kZXNjX2NvcHk9QlVGX3N0cmR1cChhY3Rpb25fZGVzYyk7CisJCWlmIChhY3Rpb25fZGVzY19jb3B5ID09IE5VTEwpCisJCQl7CisJCQlVSWVycihVSV9GX1VJX0RVUF9JTlBVVF9CT09MRUFOLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCisJaWYgKG9rX2NoYXJzKQorCQl7CisJCW9rX2NoYXJzX2NvcHk9QlVGX3N0cmR1cChva19jaGFycyk7CisJCWlmIChva19jaGFyc19jb3B5ID09IE5VTEwpCisJCQl7CisJCQlVSWVycihVSV9GX1VJX0RVUF9JTlBVVF9CT09MRUFOLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCisJaWYgKGNhbmNlbF9jaGFycykKKwkJeworCQljYW5jZWxfY2hhcnNfY29weT1CVUZfc3RyZHVwKGNhbmNlbF9jaGFycyk7CisJCWlmIChjYW5jZWxfY2hhcnNfY29weSA9PSBOVUxMKQorCQkJeworCQkJVUllcnIoVUlfRl9VSV9EVVBfSU5QVVRfQk9PTEVBTixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCQorCXJldHVybiBnZW5lcmFsX2FsbG9jYXRlX2Jvb2xlYW4odWksIHByb21wdF9jb3B5LCBhY3Rpb25fZGVzY19jb3B5LAorCQlva19jaGFyc19jb3B5LCBjYW5jZWxfY2hhcnNfY29weSwgMSwgVUlUX0JPT0xFQU4sIGZsYWdzLAorCQlyZXN1bHRfYnVmKTsKKyBlcnI6CisJaWYgKHByb21wdF9jb3B5KSBPUEVOU1NMX2ZyZWUocHJvbXB0X2NvcHkpOworCWlmIChhY3Rpb25fZGVzY19jb3B5KSBPUEVOU1NMX2ZyZWUoYWN0aW9uX2Rlc2NfY29weSk7CisJaWYgKG9rX2NoYXJzX2NvcHkpIE9QRU5TU0xfZnJlZShva19jaGFyc19jb3B5KTsKKwlpZiAoY2FuY2VsX2NoYXJzX2NvcHkpIE9QRU5TU0xfZnJlZShjYW5jZWxfY2hhcnNfY29weSk7CisJcmV0dXJuIC0xOworCX0KKworaW50IFVJX2FkZF9pbmZvX3N0cmluZyhVSSAqdWksIGNvbnN0IGNoYXIgKnRleHQpCisJeworCXJldHVybiBnZW5lcmFsX2FsbG9jYXRlX3N0cmluZyh1aSwgdGV4dCwgMCwgVUlUX0lORk8sIDAsIE5VTEwsIDAsIDAsCisJCU5VTEwpOworCX0KKworaW50IFVJX2R1cF9pbmZvX3N0cmluZyhVSSAqdWksIGNvbnN0IGNoYXIgKnRleHQpCisJeworCWNoYXIgKnRleHRfY29weT1OVUxMOworCisJaWYgKHRleHQpCisJCXsKKwkJdGV4dF9jb3B5PUJVRl9zdHJkdXAodGV4dCk7CisJCWlmICh0ZXh0X2NvcHkgPT0gTlVMTCkKKwkJCXsKKwkJCVVJZXJyKFVJX0ZfVUlfRFVQX0lORk9fU1RSSU5HLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisJcmV0dXJuIGdlbmVyYWxfYWxsb2NhdGVfc3RyaW5nKHVpLCB0ZXh0X2NvcHksIDEsIFVJVF9JTkZPLCAwLCBOVUxMLAorCQkwLCAwLCBOVUxMKTsKKwl9CisKK2ludCBVSV9hZGRfZXJyb3Jfc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqdGV4dCkKKwl7CisJcmV0dXJuIGdlbmVyYWxfYWxsb2NhdGVfc3RyaW5nKHVpLCB0ZXh0LCAwLCBVSVRfRVJST1IsIDAsIE5VTEwsIDAsIDAsCisJCU5VTEwpOworCX0KKworaW50IFVJX2R1cF9lcnJvcl9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICp0ZXh0KQorCXsKKwljaGFyICp0ZXh0X2NvcHk9TlVMTDsKKworCWlmICh0ZXh0KQorCQl7CisJCXRleHRfY29weT1CVUZfc3RyZHVwKHRleHQpOworCQlpZiAodGV4dF9jb3B5ID09IE5VTEwpCisJCQl7CisJCQlVSWVycihVSV9GX1VJX0RVUF9FUlJPUl9TVFJJTkcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJcmV0dXJuIGdlbmVyYWxfYWxsb2NhdGVfc3RyaW5nKHVpLCB0ZXh0X2NvcHksIDEsIFVJVF9FUlJPUiwgMCwgTlVMTCwKKwkJMCwgMCwgTlVMTCk7CisJfQorCitjaGFyICpVSV9jb25zdHJ1Y3RfcHJvbXB0KFVJICp1aSwgY29uc3QgY2hhciAqb2JqZWN0X2Rlc2MsCisJY29uc3QgY2hhciAqb2JqZWN0X25hbWUpCisJeworCWNoYXIgKnByb21wdCA9IE5VTEw7CisKKwlpZiAodWktPm1ldGgtPnVpX2NvbnN0cnVjdF9wcm9tcHQpCisJCXByb21wdCA9IHVpLT5tZXRoLT51aV9jb25zdHJ1Y3RfcHJvbXB0KHVpLAorCQkJb2JqZWN0X2Rlc2MsIG9iamVjdF9uYW1lKTsKKwllbHNlCisJCXsKKwkJY2hhciBwcm9tcHQxW10gPSAiRW50ZXIgIjsKKwkJY2hhciBwcm9tcHQyW10gPSAiIGZvciAiOworCQljaGFyIHByb21wdDNbXSA9ICI6IjsKKwkJaW50IGxlbiA9IDA7CisKKwkJaWYgKG9iamVjdF9kZXNjID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJbGVuID0gc2l6ZW9mKHByb21wdDEpIC0gMSArIHN0cmxlbihvYmplY3RfZGVzYyk7CisJCWlmIChvYmplY3RfbmFtZSkKKwkJCWxlbiArPSBzaXplb2YocHJvbXB0MikgLSAxICsgc3RybGVuKG9iamVjdF9uYW1lKTsKKwkJbGVuICs9IHNpemVvZihwcm9tcHQzKSAtIDE7CisKKwkJcHJvbXB0ID0gKGNoYXIgKilPUEVOU1NMX21hbGxvYyhsZW4gKyAxKTsKKwkJQlVGX3N0cmxjcHkocHJvbXB0LCBwcm9tcHQxLCBsZW4gKyAxKTsKKwkJQlVGX3N0cmxjYXQocHJvbXB0LCBvYmplY3RfZGVzYywgbGVuICsgMSk7CisJCWlmIChvYmplY3RfbmFtZSkKKwkJCXsKKwkJCUJVRl9zdHJsY2F0KHByb21wdCwgcHJvbXB0MiwgbGVuICsgMSk7CisJCQlCVUZfc3RybGNhdChwcm9tcHQsIG9iamVjdF9uYW1lLCBsZW4gKyAxKTsKKwkJCX0KKwkJQlVGX3N0cmxjYXQocHJvbXB0LCBwcm9tcHQzLCBsZW4gKyAxKTsKKwkJfQorCXJldHVybiBwcm9tcHQ7CisJfQorCit2b2lkICpVSV9hZGRfdXNlcl9kYXRhKFVJICp1aSwgdm9pZCAqdXNlcl9kYXRhKQorCXsKKwl2b2lkICpvbGRfZGF0YSA9IHVpLT51c2VyX2RhdGE7CisJdWktPnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKwlyZXR1cm4gb2xkX2RhdGE7CisJfQorCit2b2lkICpVSV9nZXQwX3VzZXJfZGF0YShVSSAqdWkpCisJeworCXJldHVybiB1aS0+dXNlcl9kYXRhOworCX0KKworY29uc3QgY2hhciAqVUlfZ2V0MF9yZXN1bHQoVUkgKnVpLCBpbnQgaSkKKwl7CisJaWYgKGkgPCAwKQorCQl7CisJCVVJZXJyKFVJX0ZfVUlfR0VUMF9SRVNVTFQsVUlfUl9JTkRFWF9UT09fU01BTEwpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmIChpID49IHNrX1VJX1NUUklOR19udW0odWktPnN0cmluZ3MpKQorCQl7CisJCVVJZXJyKFVJX0ZfVUlfR0VUMF9SRVNVTFQsVUlfUl9JTkRFWF9UT09fTEFSR0UpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCXJldHVybiBVSV9nZXQwX3Jlc3VsdF9zdHJpbmcoc2tfVUlfU1RSSU5HX3ZhbHVlKHVpLT5zdHJpbmdzLCBpKSk7CisJfQorCitzdGF0aWMgaW50IHByaW50X2Vycm9yKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgVUkgKnVpKQorCXsKKwlVSV9TVFJJTkcgdWlzOworCisJbWVtc2V0KCZ1aXMsIDAsIHNpemVvZih1aXMpKTsKKwl1aXMudHlwZSA9IFVJVF9FUlJPUjsKKwl1aXMub3V0X3N0cmluZyA9IHN0cjsKKworCWlmICh1aS0+bWV0aC0+dWlfd3JpdGVfc3RyaW5nCisJCSYmICF1aS0+bWV0aC0+dWlfd3JpdGVfc3RyaW5nKHVpLCAmdWlzKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworCX0KKworaW50IFVJX3Byb2Nlc3MoVUkgKnVpKQorCXsKKwlpbnQgaSwgb2s9MDsKKworCWlmICh1aS0+bWV0aC0+dWlfb3Blbl9zZXNzaW9uICYmICF1aS0+bWV0aC0+dWlfb3Blbl9zZXNzaW9uKHVpKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHVpLT5mbGFncyAmIFVJX0ZMQUdfUFJJTlRfRVJST1JTKQorCQlFUlJfcHJpbnRfZXJyb3JzX2NiKAorCQkJKGludCAoKikoY29uc3QgY2hhciAqLCBzaXplX3QsIHZvaWQgKikpcHJpbnRfZXJyb3IsCisJCQkodm9pZCAqKXVpKTsKKworCWZvcihpPTA7IGk8c2tfVUlfU1RSSU5HX251bSh1aS0+c3RyaW5ncyk7IGkrKykKKwkJeworCQlpZiAodWktPm1ldGgtPnVpX3dyaXRlX3N0cmluZworCQkJJiYgIXVpLT5tZXRoLT51aV93cml0ZV9zdHJpbmcodWksCisJCQkJc2tfVUlfU1RSSU5HX3ZhbHVlKHVpLT5zdHJpbmdzLCBpKSkpCisJCQl7CisJCQlvaz0tMTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZiAodWktPm1ldGgtPnVpX2ZsdXNoKQorCQlzd2l0Y2godWktPm1ldGgtPnVpX2ZsdXNoKHVpKSkKKwkJCXsKKwkJY2FzZSAtMTogLyogSW50ZXJydXB0L0NhbmNlbC9zb21ldGhpbmcuLi4gKi8KKwkJCW9rID0gLTI7CisJCQlnb3RvIGVycjsKKwkJY2FzZSAwOiAvKiBFcnJvcnMgKi8KKwkJCW9rID0gLTE7CisJCQlnb3RvIGVycjsKKwkJZGVmYXVsdDogLyogU3VjY2VzcyAqLworCQkJb2sgPSAwOworCQkJYnJlYWs7CisJCQl9CisKKwlmb3IoaT0wOyBpPHNrX1VJX1NUUklOR19udW0odWktPnN0cmluZ3MpOyBpKyspCisJCXsKKwkJaWYgKHVpLT5tZXRoLT51aV9yZWFkX3N0cmluZykKKwkJCXsKKwkJCXN3aXRjaCh1aS0+bWV0aC0+dWlfcmVhZF9zdHJpbmcodWksCisJCQkJc2tfVUlfU1RSSU5HX3ZhbHVlKHVpLT5zdHJpbmdzLCBpKSkpCisJCQkJeworCQkJY2FzZSAtMTogLyogSW50ZXJydXB0L0NhbmNlbC9zb21ldGhpbmcuLi4gKi8KKwkJCQlvayA9IC0yOworCQkJCWdvdG8gZXJyOworCQkJY2FzZSAwOiAvKiBFcnJvcnMgKi8KKwkJCQlvayA9IC0xOworCQkJCWdvdG8gZXJyOworCQkJZGVmYXVsdDogLyogU3VjY2VzcyAqLworCQkJCW9rID0gMDsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKyBlcnI6CisJaWYgKHVpLT5tZXRoLT51aV9jbG9zZV9zZXNzaW9uICYmICF1aS0+bWV0aC0+dWlfY2xvc2Vfc2Vzc2lvbih1aSkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gb2s7CisJfQorCitpbnQgVUlfY3RybChVSSAqdWksIGludCBjbWQsIGxvbmcgaSwgdm9pZCAqcCwgdm9pZCAoKmYpKHZvaWQpKQorCXsKKwlpZiAodWkgPT0gTlVMTCkKKwkJeworCQlVSWVycihVSV9GX1VJX0NUUkwsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuIC0xOworCQl9CisJc3dpdGNoKGNtZCkKKwkJeworCWNhc2UgVUlfQ1RSTF9QUklOVF9FUlJPUlM6CisJCXsKKwkJaW50IHNhdmVfZmxhZyA9ICEhKHVpLT5mbGFncyAmIFVJX0ZMQUdfUFJJTlRfRVJST1JTKTsKKwkJaWYgKGkpCisJCQl1aS0+ZmxhZ3MgfD0gVUlfRkxBR19QUklOVF9FUlJPUlM7CisJCWVsc2UKKwkJCXVpLT5mbGFncyAmPSB+VUlfRkxBR19QUklOVF9FUlJPUlM7CisJCXJldHVybiBzYXZlX2ZsYWc7CisJCX0KKwljYXNlIFVJX0NUUkxfSVNfUkVET0FCTEU6CisJCXJldHVybiAhISh1aS0+ZmxhZ3MgJiBVSV9GTEFHX1JFRE9BQkxFKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwkJfQorCVVJZXJyKFVJX0ZfVUlfQ1RSTCxVSV9SX1VOS05PV05fQ09OVFJPTF9DT01NQU5EKTsKKwlyZXR1cm4gLTE7CisJfQorCitpbnQgVUlfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCSAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpCisgICAgICAgIHsKKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX1VJLCBhcmdsLCBhcmdwLAorCQkJCW5ld19mdW5jLCBkdXBfZnVuYywgZnJlZV9mdW5jKTsKKyAgICAgICAgfQorCitpbnQgVUlfc2V0X2V4X2RhdGEoVUkgKnIsIGludCBpZHgsIHZvaWQgKmFyZykKKwl7CisJcmV0dXJuKENSWVBUT19zZXRfZXhfZGF0YSgmci0+ZXhfZGF0YSxpZHgsYXJnKSk7CisJfQorCit2b2lkICpVSV9nZXRfZXhfZGF0YShVSSAqciwgaW50IGlkeCkKKwl7CisJcmV0dXJuKENSWVBUT19nZXRfZXhfZGF0YSgmci0+ZXhfZGF0YSxpZHgpKTsKKwl9CisKK3ZvaWQgVUlfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IFVJX01FVEhPRCAqbWV0aCkKKwl7CisJZGVmYXVsdF9VSV9tZXRoPW1ldGg7CisJfQorCitjb25zdCBVSV9NRVRIT0QgKlVJX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKQorCXsKKwlpZiAoZGVmYXVsdF9VSV9tZXRoID09IE5VTEwpCisJCXsKKwkJZGVmYXVsdF9VSV9tZXRoPVVJX09wZW5TU0woKTsKKwkJfQorCXJldHVybiBkZWZhdWx0X1VJX21ldGg7CisJfQorCitjb25zdCBVSV9NRVRIT0QgKlVJX2dldF9tZXRob2QoVUkgKnVpKQorCXsKKwlyZXR1cm4gdWktPm1ldGg7CisJfQorCitjb25zdCBVSV9NRVRIT0QgKlVJX3NldF9tZXRob2QoVUkgKnVpLCBjb25zdCBVSV9NRVRIT0QgKm1ldGgpCisJeworCXVpLT5tZXRoPW1ldGg7CisJcmV0dXJuIHVpLT5tZXRoOworCX0KKworCitVSV9NRVRIT0QgKlVJX2NyZWF0ZV9tZXRob2QoY2hhciAqbmFtZSkKKwl7CisJVUlfTUVUSE9EICp1aV9tZXRob2QgPSAoVUlfTUVUSE9EICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFVJX01FVEhPRCkpOworCisJaWYgKHVpX21ldGhvZCkKKwkJeworCQltZW1zZXQodWlfbWV0aG9kLCAwLCBzaXplb2YoKnVpX21ldGhvZCkpOworCQl1aV9tZXRob2QtPm5hbWUgPSBCVUZfc3RyZHVwKG5hbWUpOworCQl9CisJcmV0dXJuIHVpX21ldGhvZDsKKwl9CisKKy8qIEJJRyBGU0NLSU5HIFdBUk5JTkchISEhICBJZiB5b3UgdXNlIHRoaXMgb24gYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBtZXRob2QKKyAgICh0aGF0IGlzLCBpdCBoYXNuJ3QgYmVlbiBhbGxvY2F0ZWQgdXNpbmcgVUlfY3JlYXRlX21ldGhvZCgpLCB5b3UgZGVzZXJ2ZQorICAgYW55dGhpbmcgTXVycGh5IGNhbiB0aHJvdyBhdCB5b3UgYW5kIG1vcmUhICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4gKi8KK3ZvaWQgVUlfZGVzdHJveV9tZXRob2QoVUlfTUVUSE9EICp1aV9tZXRob2QpCisJeworCU9QRU5TU0xfZnJlZSh1aV9tZXRob2QtPm5hbWUpOworCXVpX21ldGhvZC0+bmFtZSA9IE5VTEw7CisJT1BFTlNTTF9mcmVlKHVpX21ldGhvZCk7CisJfQorCitpbnQgVUlfbWV0aG9kX3NldF9vcGVuZXIoVUlfTUVUSE9EICptZXRob2QsIGludCAoKm9wZW5lcikoVUkgKnVpKSkKKwl7CisJaWYgKG1ldGhvZCkKKwkJeworCQltZXRob2QtPnVpX29wZW5fc2Vzc2lvbiA9IG9wZW5lcjsKKwkJcmV0dXJuIDA7CisJCX0KKwllbHNlCisJCXJldHVybiAtMTsKKwl9CisKK2ludCBVSV9tZXRob2Rfc2V0X3dyaXRlcihVSV9NRVRIT0QgKm1ldGhvZCwgaW50ICgqd3JpdGVyKShVSSAqdWksIFVJX1NUUklORyAqdWlzKSkKKwl7CisJaWYgKG1ldGhvZCkKKwkJeworCQltZXRob2QtPnVpX3dyaXRlX3N0cmluZyA9IHdyaXRlcjsKKwkJcmV0dXJuIDA7CisJCX0KKwllbHNlCisJCXJldHVybiAtMTsKKwl9CisKK2ludCBVSV9tZXRob2Rfc2V0X2ZsdXNoZXIoVUlfTUVUSE9EICptZXRob2QsIGludCAoKmZsdXNoZXIpKFVJICp1aSkpCisJeworCWlmIChtZXRob2QpCisJCXsKKwkJbWV0aG9kLT51aV9mbHVzaCA9IGZsdXNoZXI7CisJCXJldHVybiAwOworCQl9CisJZWxzZQorCQlyZXR1cm4gLTE7CisJfQorCitpbnQgVUlfbWV0aG9kX3NldF9yZWFkZXIoVUlfTUVUSE9EICptZXRob2QsIGludCAoKnJlYWRlcikoVUkgKnVpLCBVSV9TVFJJTkcgKnVpcykpCisJeworCWlmIChtZXRob2QpCisJCXsKKwkJbWV0aG9kLT51aV9yZWFkX3N0cmluZyA9IHJlYWRlcjsKKwkJcmV0dXJuIDA7CisJCX0KKwllbHNlCisJCXJldHVybiAtMTsKKwl9CisKK2ludCBVSV9tZXRob2Rfc2V0X2Nsb3NlcihVSV9NRVRIT0QgKm1ldGhvZCwgaW50ICgqY2xvc2VyKShVSSAqdWkpKQorCXsKKwlpZiAobWV0aG9kKQorCQl7CisJCW1ldGhvZC0+dWlfY2xvc2Vfc2Vzc2lvbiA9IGNsb3NlcjsKKwkJcmV0dXJuIDA7CisJCX0KKwllbHNlCisJCXJldHVybiAtMTsKKwl9CisKK2ludCBVSV9tZXRob2Rfc2V0X3Byb21wdF9jb25zdHJ1Y3RvcihVSV9NRVRIT0QgKm1ldGhvZCwgY2hhciAqKCpwcm9tcHRfY29uc3RydWN0b3IpKFVJKiB1aSwgY29uc3QgY2hhciogb2JqZWN0X2Rlc2MsIGNvbnN0IGNoYXIqIG9iamVjdF9uYW1lKSkKKwl7CisJaWYgKG1ldGhvZCkKKwkJeworCQltZXRob2QtPnVpX2NvbnN0cnVjdF9wcm9tcHQgPSBwcm9tcHRfY29uc3RydWN0b3I7CisJCXJldHVybiAwOworCQl9CisJZWxzZQorCQlyZXR1cm4gLTE7CisJfQorCitpbnQgKCpVSV9tZXRob2RfZ2V0X29wZW5lcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKikKKwl7CisJaWYgKG1ldGhvZCkKKwkJcmV0dXJuIG1ldGhvZC0+dWlfb3Blbl9zZXNzaW9uOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7CisJfQorCitpbnQgKCpVSV9tZXRob2RfZ2V0X3dyaXRlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKixVSV9TVFJJTkcqKQorCXsKKwlpZiAobWV0aG9kKQorCQlyZXR1cm4gbWV0aG9kLT51aV93cml0ZV9zdHJpbmc7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKwl9CisKK2ludCAoKlVJX21ldGhvZF9nZXRfZmx1c2hlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKikKKwl7CisJaWYgKG1ldGhvZCkKKwkJcmV0dXJuIG1ldGhvZC0+dWlfZmx1c2g7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKwl9CisKK2ludCAoKlVJX21ldGhvZF9nZXRfcmVhZGVyKFVJX01FVEhPRCAqbWV0aG9kKSkoVUkqLFVJX1NUUklORyopCisJeworCWlmIChtZXRob2QpCisJCXJldHVybiBtZXRob2QtPnVpX3JlYWRfc3RyaW5nOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7CisJfQorCitpbnQgKCpVSV9tZXRob2RfZ2V0X2Nsb3NlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKikKKwl7CisJaWYgKG1ldGhvZCkKKwkJcmV0dXJuIG1ldGhvZC0+dWlfY2xvc2Vfc2Vzc2lvbjsKKwllbHNlCisJCXJldHVybiBOVUxMOworCX0KKworY2hhciogKCpVSV9tZXRob2RfZ2V0X3Byb21wdF9jb25zdHJ1Y3RvcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKiwgY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKQorCXsKKwlpZiAobWV0aG9kKQorCQlyZXR1cm4gbWV0aG9kLT51aV9jb25zdHJ1Y3RfcHJvbXB0OworCWVsc2UKKwkJcmV0dXJuIE5VTEw7CisJfQorCitlbnVtIFVJX3N0cmluZ190eXBlcyBVSV9nZXRfc3RyaW5nX3R5cGUoVUlfU1RSSU5HICp1aXMpCisJeworCWlmICghdWlzKQorCQlyZXR1cm4gVUlUX05PTkU7CisJcmV0dXJuIHVpcy0+dHlwZTsKKwl9CisKK2ludCBVSV9nZXRfaW5wdXRfZmxhZ3MoVUlfU1RSSU5HICp1aXMpCisJeworCWlmICghdWlzKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdWlzLT5pbnB1dF9mbGFnczsKKwl9CisKK2NvbnN0IGNoYXIgKlVJX2dldDBfb3V0cHV0X3N0cmluZyhVSV9TVFJJTkcgKnVpcykKKwl7CisJaWYgKCF1aXMpCisJCXJldHVybiBOVUxMOworCXJldHVybiB1aXMtPm91dF9zdHJpbmc7CisJfQorCitjb25zdCBjaGFyICpVSV9nZXQwX2FjdGlvbl9zdHJpbmcoVUlfU1RSSU5HICp1aXMpCisJeworCWlmICghdWlzKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2godWlzLT50eXBlKQorCQl7CisJY2FzZSBVSVRfUFJPTVBUOgorCWNhc2UgVUlUX0JPT0xFQU46CisJCXJldHVybiB1aXMtPl8uYm9vbGVhbl9kYXRhLmFjdGlvbl9kZXNjOworCWRlZmF1bHQ6CisJCXJldHVybiBOVUxMOworCQl9CisJfQorCitjb25zdCBjaGFyICpVSV9nZXQwX3Jlc3VsdF9zdHJpbmcoVUlfU1RSSU5HICp1aXMpCisJeworCWlmICghdWlzKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2godWlzLT50eXBlKQorCQl7CisJY2FzZSBVSVRfUFJPTVBUOgorCWNhc2UgVUlUX1ZFUklGWToKKwkJcmV0dXJuIHVpcy0+cmVzdWx0X2J1ZjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworY29uc3QgY2hhciAqVUlfZ2V0MF90ZXN0X3N0cmluZyhVSV9TVFJJTkcgKnVpcykKKwl7CisJaWYgKCF1aXMpCisJCXJldHVybiBOVUxMOworCXN3aXRjaCh1aXMtPnR5cGUpCisJCXsKKwljYXNlIFVJVF9WRVJJRlk6CisJCXJldHVybiB1aXMtPl8uc3RyaW5nX2RhdGEudGVzdF9idWY7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKK2ludCBVSV9nZXRfcmVzdWx0X21pbnNpemUoVUlfU1RSSU5HICp1aXMpCisJeworCWlmICghdWlzKQorCQlyZXR1cm4gLTE7CisJc3dpdGNoKHVpcy0+dHlwZSkKKwkJeworCWNhc2UgVUlUX1BST01QVDoKKwljYXNlIFVJVF9WRVJJRlk6CisJCXJldHVybiB1aXMtPl8uc3RyaW5nX2RhdGEucmVzdWx0X21pbnNpemU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCQl9CisJfQorCitpbnQgVUlfZ2V0X3Jlc3VsdF9tYXhzaXplKFVJX1NUUklORyAqdWlzKQorCXsKKwlpZiAoIXVpcykKKwkJcmV0dXJuIC0xOworCXN3aXRjaCh1aXMtPnR5cGUpCisJCXsKKwljYXNlIFVJVF9QUk9NUFQ6CisJY2FzZSBVSVRfVkVSSUZZOgorCQlyZXR1cm4gdWlzLT5fLnN0cmluZ19kYXRhLnJlc3VsdF9tYXhzaXplOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwkJfQorCX0KKworaW50IFVJX3NldF9yZXN1bHQoVUkgKnVpLCBVSV9TVFJJTkcgKnVpcywgY29uc3QgY2hhciAqcmVzdWx0KQorCXsKKwlpbnQgbCA9IHN0cmxlbihyZXN1bHQpOworCisJdWktPmZsYWdzICY9IH5VSV9GTEFHX1JFRE9BQkxFOworCisJaWYgKCF1aXMpCisJCXJldHVybiAtMTsKKwlzd2l0Y2ggKHVpcy0+dHlwZSkKKwkJeworCWNhc2UgVUlUX1BST01QVDoKKwljYXNlIFVJVF9WRVJJRlk6CisJCXsKKwkJY2hhciBudW1iZXIxW0RFQ0lNQUxfU0laRSh1aXMtPl8uc3RyaW5nX2RhdGEucmVzdWx0X21pbnNpemUpKzFdOworCQljaGFyIG51bWJlcjJbREVDSU1BTF9TSVpFKHVpcy0+Xy5zdHJpbmdfZGF0YS5yZXN1bHRfbWF4c2l6ZSkrMV07CisKKwkJQklPX3NucHJpbnRmKG51bWJlcjEsIHNpemVvZihudW1iZXIxKSwgIiVkIiwKKwkJCXVpcy0+Xy5zdHJpbmdfZGF0YS5yZXN1bHRfbWluc2l6ZSk7CisJCUJJT19zbnByaW50ZihudW1iZXIyLCBzaXplb2YobnVtYmVyMiksICIlZCIsCisJCQl1aXMtPl8uc3RyaW5nX2RhdGEucmVzdWx0X21heHNpemUpOworCisJCWlmIChsIDwgdWlzLT5fLnN0cmluZ19kYXRhLnJlc3VsdF9taW5zaXplKQorCQkJeworCQkJdWktPmZsYWdzIHw9IFVJX0ZMQUdfUkVET0FCTEU7CisJCQlVSWVycihVSV9GX1VJX1NFVF9SRVNVTFQsVUlfUl9SRVNVTFRfVE9PX1NNQUxMKTsKKwkJCUVSUl9hZGRfZXJyb3JfZGF0YSg1LCJZb3UgbXVzdCB0eXBlIGluICIsCisJCQkJbnVtYmVyMSwiIHRvICIsbnVtYmVyMiwiIGNoYXJhY3RlcnMiKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJaWYgKGwgPiB1aXMtPl8uc3RyaW5nX2RhdGEucmVzdWx0X21heHNpemUpCisJCQl7CisJCQl1aS0+ZmxhZ3MgfD0gVUlfRkxBR19SRURPQUJMRTsKKwkJCVVJZXJyKFVJX0ZfVUlfU0VUX1JFU1VMVCxVSV9SX1JFU1VMVF9UT09fTEFSR0UpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDUsIllvdSBtdXN0IHR5cGUgaW4gIiwKKwkJCQludW1iZXIxLCIgdG8gIixudW1iZXIyLCIgY2hhcmFjdGVycyIpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisKKwkJaWYgKCF1aXMtPnJlc3VsdF9idWYpCisJCQl7CisJCQlVSWVycihVSV9GX1VJX1NFVF9SRVNVTFQsVUlfUl9OT19SRVNVTFRfQlVGRkVSKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKworCQlCVUZfc3RybGNweSh1aXMtPnJlc3VsdF9idWYsIHJlc3VsdCwKKwkJCSAgICB1aXMtPl8uc3RyaW5nX2RhdGEucmVzdWx0X21heHNpemUgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSBVSVRfQk9PTEVBTjoKKwkJeworCQljb25zdCBjaGFyICpwOworCisJCWlmICghdWlzLT5yZXN1bHRfYnVmKQorCQkJeworCQkJVUllcnIoVUlfRl9VSV9TRVRfUkVTVUxULFVJX1JfTk9fUkVTVUxUX0JVRkZFUik7CisJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJdWlzLT5yZXN1bHRfYnVmWzBdID0gJ1wwJzsKKwkJZm9yKHAgPSByZXN1bHQ7ICpwOyBwKyspCisJCQl7CisJCQlpZiAoc3RyY2hyKHVpcy0+Xy5ib29sZWFuX2RhdGEub2tfY2hhcnMsICpwKSkKKwkJCQl7CisJCQkJdWlzLT5yZXN1bHRfYnVmWzBdID0KKwkJCQkJdWlzLT5fLmJvb2xlYW5fZGF0YS5va19jaGFyc1swXTsKKwkJCQlicmVhazsKKwkJCQl9CisJCQlpZiAoc3RyY2hyKHVpcy0+Xy5ib29sZWFuX2RhdGEuY2FuY2VsX2NoYXJzLCAqcCkpCisJCQkJeworCQkJCXVpcy0+cmVzdWx0X2J1ZlswXSA9CisJCQkJCXVpcy0+Xy5ib29sZWFuX2RhdGEuY2FuY2VsX2NoYXJzWzBdOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwkJfQorCQl9CisJcmV0dXJuIDA7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3VpL3VpX2xvY2wuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aV9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0YTU1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aV9sb2NsLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8qIGNyeXB0by91aS91aS5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfVUlfTE9DTF9ICisjZGVmaW5lIEhFQURFUl9VSV9MT0NMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvdWkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCisjaWZkZWYgXworI3VuZGVmIF8KKyNlbmRpZgorCitzdHJ1Y3QgdWlfbWV0aG9kX3N0CisJeworCWNoYXIgKm5hbWU7CisKKwkvKiBBbGwgdGhlIGZ1bmN0aW9ucyByZXR1cm4gMSBvciBub24tTlVMTCBmb3Igc3VjY2VzcyBhbmQgMCBvciBOVUxMCisJICAgZm9yIGZhaWx1cmUgKi8KKworCS8qIE9wZW4gd2hhdGV2ZXIgY2hhbm5lbCBmb3IgdGhpcywgYmUgaXQgdGhlIGNvbnNvbGUsIGFuIFggd2luZG93CisJICAgb3Igd2hhdGV2ZXIuCisJICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgdXNlIHRoZSBleF9kYXRhIHN0cnVjdHVyZSB0byBzYXZlCisJICAgaW50ZXJtZWRpYXRlIGRhdGEuICovCisJaW50ICgqdWlfb3Blbl9zZXNzaW9uKShVSSAqdWkpOworCisJaW50ICgqdWlfd3JpdGVfc3RyaW5nKShVSSAqdWksIFVJX1NUUklORyAqdWlzKTsKKworCS8qIEZsdXNoIHRoZSBvdXRwdXQuICBJZiBhIEdVSSBkaWFsb2cgYm94IGlzIHVzZWQsIHRoaXMgZnVuY3Rpb24gY2FuCisJICAgYmUgdXNlZCB0byBhY3R1YWxseSBkaXNwbGF5IGl0LiAqLworCWludCAoKnVpX2ZsdXNoKShVSSAqdWkpOworCisJaW50ICgqdWlfcmVhZF9zdHJpbmcpKFVJICp1aSwgVUlfU1RSSU5HICp1aXMpOworCisJaW50ICgqdWlfY2xvc2Vfc2Vzc2lvbikoVUkgKnVpKTsKKworCS8qIENvbnN0cnVjdCBhIHByb21wdCBpbiBhIHVzZXItZGVmaW5lZCBtYW5uZXIuICBvYmplY3RfZGVzYyBpcyBhCisJICAgdGV4dHVhbCBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0LCBmb3IgZXhhbXBsZSAicGFzcyBwaHJhc2UiLAorCSAgIGFuZCBvYmplY3RfbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgb2JqZWN0IChtaWdodCBiZSBhIGNhcmQgbmFtZSBvcgorCSAgIGEgZmlsZSBuYW1lLgorCSAgIFRoZSByZXR1cm5lZCBzdHJpbmcgc2hhbGwgYWx3YXlzIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCB3aXRoCisJICAgT1BFTlNTTF9tYWxsb2MoKSwgYW5kIG5lZWQgdG8gYmUgZnJlZSdkIHdpdGggT1BFTlNTTF9mcmVlKCkuICovCisJY2hhciAqKCp1aV9jb25zdHJ1Y3RfcHJvbXB0KShVSSAqdWksIGNvbnN0IGNoYXIgKm9iamVjdF9kZXNjLAorCQljb25zdCBjaGFyICpvYmplY3RfbmFtZSk7CisJfTsKKworc3RydWN0IHVpX3N0cmluZ19zdAorCXsKKwllbnVtIFVJX3N0cmluZ190eXBlcyB0eXBlOyAvKiBJbnB1dCAqLworCWNvbnN0IGNoYXIgKm91dF9zdHJpbmc7CS8qIElucHV0ICovCisJaW50IGlucHV0X2ZsYWdzOwkvKiBGbGFncyBmcm9tIHRoZSB1c2VyICovCisKKwkvKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIGNvbXBsZXRlbHkgaXJyZWxldmFudCBmb3IgVUlUX0lORk8sCisJICAgYW5kIGNhbiB0aGVyZWZvcmUgYmUgc2V0IHRvIDAgb3IgTlVMTCAqLworCWNoYXIgKnJlc3VsdF9idWY7CS8qIElucHV0IGFuZCBPdXRwdXQ6IElmIG5vdCBOVUxMLCB1c2VyLWRlZmluZWQKKwkJCQkgICB3aXRoIHNpemUgaW4gcmVzdWx0X21heHNpemUuICBPdGhlcndpc2UsIGl0CisJCQkJICAgbWF5IGJlIGFsbG9jYXRlZCBieSB0aGUgVUkgcm91dGluZSwgbWVhbmluZworCQkJCSAgIHJlc3VsdF9taW5zaXplIGlzIGdvaW5nIHRvIGJlIG92ZXJ3cml0dGVuLiovCisJdW5pb24KKwkJeworCQlzdHJ1Y3QKKwkJCXsKKwkJCWludCByZXN1bHRfbWluc2l6ZTsJLyogSW5wdXQ6IG1pbmltdW0gcmVxdWlyZWQKKwkJCQkJCSAgIHNpemUgb2YgdGhlIHJlc3VsdC4KKwkJCQkJCSovCisJCQlpbnQgcmVzdWx0X21heHNpemU7CS8qIElucHV0OiBtYXhpbXVtIHBlcm1pdHRlZAorCQkJCQkJICAgc2l6ZSBvZiB0aGUgcmVzdWx0ICovCisKKwkJCWNvbnN0IGNoYXIgKnRlc3RfYnVmOwkvKiBJbnB1dDogdGVzdCBzdHJpbmcgdG8gdmVyaWZ5CisJCQkJCQkgICBhZ2FpbnN0ICovCisJCQl9IHN0cmluZ19kYXRhOworCQlzdHJ1Y3QKKwkJCXsKKwkJCWNvbnN0IGNoYXIgKmFjdGlvbl9kZXNjOyAvKiBJbnB1dCAqLworCQkJY29uc3QgY2hhciAqb2tfY2hhcnM7IC8qIElucHV0ICovCisJCQljb25zdCBjaGFyICpjYW5jZWxfY2hhcnM7IC8qIElucHV0ICovCisJCQl9IGJvb2xlYW5fZGF0YTsKKwkJfSBfOworCisjZGVmaW5lIE9VVF9TVFJJTkdfRlJFRUFCTEUgMHgwMQorCWludCBmbGFnczsJCS8qIGZsYWdzIGZvciBpbnRlcm5hbCB1c2UgKi8KKwl9OworCitzdHJ1Y3QgdWlfc3QKKwl7CisJY29uc3QgVUlfTUVUSE9EICptZXRoOworCVNUQUNLX09GKFVJX1NUUklORykgKnN0cmluZ3M7IC8qIFdlIG1pZ2h0IHdhbnQgdG8gcHJvbXB0IGZvciBtb3JlCisJCQkJCSB0aGFuIG9uZSB0aGluZyBhdCBhIHRpbWUsIGFuZAorCQkJCQkgd2l0aCBkaWZmZXJlbnQgZWNob2luZyBzdGF0dXMuICAqLworCXZvaWQgKnVzZXJfZGF0YTsKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCisjZGVmaW5lIFVJX0ZMQUdfUkVET0FCTEUJMHgwMDAxCisjZGVmaW5lIFVJX0ZMQUdfUFJJTlRfRVJST1JTCTB4MDEwMAorCWludCBmbGFnczsKKwl9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aV9vcGVuc3NsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vdWkvdWlfb3BlbnNzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNWNiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdWkvdWlfb3BlbnNzbC5jCkBAIC0wLDAgKzEsNzEyIEBACisvKiBjcnlwdG8vdWkvdWlfb3BlbnNzbC5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgYW5kIG90aGVycworICogZm9yIHRoZSBPcGVuU1NMIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBUaGUgbG93ZXN0IGxldmVsIHBhcnQgb2YgdGhpcyBmaWxlIHdhcyBwcmV2aW91c2x5IGluIGNyeXB0by9kZXMvcmVhZF9wd2QuYywKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisvKiBuZWVkIGZvciAjZGVmaW5lIF9QT1NJWF9DX1NPVVJDRSBhcmlzZXMgd2hlbmV2ZXIgeW91IHBhc3MgLWFuc2kgdG8gZ2NjCisgKiBbbWF5YmUgb3RoZXJzP10sIGJlY2F1c2UgaXQgbWFza3MgaW50ZXJmYWNlcyBub3QgZGlzY3Vzc2VkIGluIHN0YW5kYXJkLAorICogc2lnYWN0aW9uIGFuZCBmaWxlbm8gaW5jbHVkZWQuIC1wZWRhbnRpYyB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvcgorICogdGhlIGludGVuZGVkIHB1cnBvc2VzLCBidXQgd2UgY2FuJ3QgcHJldmVudCB1c2VycyBmcm9tIGFkZGluZyAtYW5zaS4KKyAqLworI2lmbmRlZiBfUE9TSVhfQ19TT1VSQ0UKKyNkZWZpbmUgX1BPU0lYX0NfU09VUkNFIDIKKyNlbmRpZgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpCisjIGlmZGVmIE9QRU5TU0xfVU5JU1RECisjICBpbmNsdWRlIE9QRU5TU0xfVU5JU1RECisjIGVsc2UKKyMgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBlbmRpZgorLyogSWYgdW5pc3RkLmggZGVmaW5lcyBfUE9TSVhfVkVSU0lPTiwgd2UgY29uY2x1ZGUgdGhhdCB3ZQorICogYXJlIG9uIGEgUE9TSVggc3lzdGVtIGFuZCBoYXZlIHNpZ2FjdGlvbiBhbmQgdGVybWlvcy4gKi8KKyMgaWYgZGVmaW5lZChfUE9TSVhfVkVSU0lPTikKKworIyAgZGVmaW5lIFNJR0FDVElPTgorIyAgaWYgIWRlZmluZWQoVEVSTUlPUykgJiYgIWRlZmluZWQoVEVSTUlPKSAmJiAhZGVmaW5lZChTR1RUWSkKKyMgICBkZWZpbmUgVEVSTUlPUworIyAgZW5kaWYKKworIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSU4xNlRUWQorIyB1bmRlZiBPUEVOU1NMX1NZU19XSU4xNgorIyB1bmRlZiBXSU4xNgorIyB1bmRlZiBfV0lORE9XUworIyBpbmNsdWRlIDxncmFwaC5oPgorI2VuZGlmCisKKy8qIDA2LUFwci05MiBMdWtlIEJyZW5uYW4gICAgU3VwcG9ydCBmb3IgVk1TICovCisjaW5jbHVkZSAidWlfbG9jbC5oIgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMJCS8qIHByb3RvdHlwZXMgZm9yIHN5cyR3aGF0ZXZlciAqLworIyBpbmNsdWRlIDxzdGFybGV0Lmg+CisjIGlmZGVmIF9fREVDQworIyAgcHJhZ21hIG1lc3NhZ2UgZGlzYWJsZSBET0xMQVJJRAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBXSU5fQ09OU09MRV9CVUcKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorI2lmbmRlZiBPUEVOU1NMX1NZU19XSU5DRQorIyBpbmNsdWRlIDx3aW5jb24uaD4KKyNlbmRpZgorI2VuZGlmCisKKworLyogVGhlcmUgYXJlIDUgdHlwZXMgb2YgdGVybWluYWwgaW50ZXJmYWNlIHN1cHBvcnRlZCwKKyAqIFRFUk1JTywgVEVSTUlPUywgVk1TLCBNU0RPUyBhbmQgU0dUVFkKKyAqLworCisjaWYgZGVmaW5lZChfX3NnaSkgJiYgIWRlZmluZWQoVEVSTUlPUykKKyMgZGVmaW5lIFRFUk1JT1MKKyMgdW5kZWYgIFRFUk1JTworIyB1bmRlZiAgU0dUVFkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoVEVSTUlPKSAmJiAhZGVmaW5lZChfX0FORFJPSURfXykKKyMgdW5kZWYgIFRFUk1JT1MKKyMgZGVmaW5lIFRFUk1JTworIyB1bmRlZiAgU0dUVFkKKyNlbmRpZgorCisjaWZkZWYgX0xJQkMKKyMgdW5kZWYgIFRFUk1JT1MKKyMgZGVmaW5lIFRFUk1JTworIyB1bmRlZiAgU0dUVFkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoVEVSTUlPKSAmJiAhZGVmaW5lZChURVJNSU9TKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19NQUNJTlRPU0hfQ0xBU1NJQykgJiYgIWRlZmluZWQoTUFDX09TX0dVU0lfU09VUkNFKQorIyB1bmRlZiAgVEVSTUlPUworIyB1bmRlZiAgVEVSTUlPCisjIGRlZmluZSBTR1RUWQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZYV09SS1MpCisjdW5kZWYgVEVSTUlPUworI3VuZGVmIFRFUk1JTworI3VuZGVmIFNHVFRZCisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkKKyN1bmRlZiBURVJNSU9TCisjdW5kZWYgVEVSTUlPCisjdW5kZWYgU0dUVFkKKyNlbmRpZgorCisjaWZkZWYgVEVSTUlPUworIyBpbmNsdWRlIDx0ZXJtaW9zLmg+CisjIGRlZmluZSBUVFlfU1RSVUNUCQlzdHJ1Y3QgdGVybWlvcworIyBkZWZpbmUgVFRZX0ZMQUdTCQljX2xmbGFnCisjIGRlZmluZSBUVFlfZ2V0KHR0eSxkYXRhKQl0Y2dldGF0dHIodHR5LGRhdGEpCisjIGRlZmluZSBUVFlfc2V0KHR0eSxkYXRhKQl0Y3NldGF0dHIodHR5LFRDU0FOT1csZGF0YSkKKyNlbmRpZgorCisjaWZkZWYgVEVSTUlPCisjIGluY2x1ZGUgPHRlcm1pby5oPgorIyBkZWZpbmUgVFRZX1NUUlVDVAkJc3RydWN0IHRlcm1pbworIyBkZWZpbmUgVFRZX0ZMQUdTCQljX2xmbGFnCisjIGRlZmluZSBUVFlfZ2V0KHR0eSxkYXRhKQlpb2N0bCh0dHksVENHRVRBLGRhdGEpCisjIGRlZmluZSBUVFlfc2V0KHR0eSxkYXRhKQlpb2N0bCh0dHksVENTRVRBLGRhdGEpCisjZW5kaWYKKworI2lmZGVmIFNHVFRZCisjIGluY2x1ZGUgPHNndHR5Lmg+CisjIGRlZmluZSBUVFlfU1RSVUNUCQlzdHJ1Y3Qgc2d0dHliCisjIGRlZmluZSBUVFlfRkxBR1MJCXNnX2ZsYWdzCisjIGRlZmluZSBUVFlfZ2V0KHR0eSxkYXRhKQlpb2N0bCh0dHksVElPQ0dFVFAsZGF0YSkKKyMgZGVmaW5lIFRUWV9zZXQodHR5LGRhdGEpCWlvY3RsKHR0eSxUSU9DU0VUUCxkYXRhKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChfTElCQykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfTUFDSU5UT1NIX0NMQVNTSUMpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1NVTk9TKQorIyBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9TWVNfTVNET1MKKyMgaW5jbHVkZSA8Y29uaW8uaD4KKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisjIGluY2x1ZGUgPHNzZGVmLmg+CisjIGluY2x1ZGUgPGlvZGVmLmg+CisjIGluY2x1ZGUgPHR0ZGVmLmg+CisjIGluY2x1ZGUgPGRlc2NyaXAuaD4KK3N0cnVjdCBJT1NCIHsKKwlzaG9ydCBpb3NiJHdfdmFsdWU7CisJc2hvcnQgaW9zYiR3X2NvdW50OworCWxvbmcgIGlvc2IkbF9pbmZvOworCX07CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfU1lTX1NVTk9TCisJdHlwZWRlZiBpbnQgc2lnX2F0b21pY190OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01BQ0lOVE9TSF9DTEFTU0lDKSB8fCBkZWZpbmVkKE1BQ19PU19HVVNJX1NPVVJDRSkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKQorLyoKKyAqIFRoaXMgb25lIG5lZWRzIHdvcmsuIEFzIGEgbWF0dGVyIG9mIGZhY3QgdGhlIGNvZGUgaXMgdW5vcGVyYXRpb25hbAorICogYW5kIHRoaXMgaXMgb25seSBhIHRyaWNrIHRvIGdldCBpdCBjb21waWxlZC4KKyAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgKi8KKyMgZGVmaW5lIFRUWV9TVFJVQ1QgaW50CisjZW5kaWYKKworI2lmbmRlZiBOWDUwOV9TSUcKKyMgZGVmaW5lIE5YNTA5X1NJRyAzMgorI2VuZGlmCisKKworLyogRGVmaW5lIGdsb2JhbHMuICBUaGV5IGFyZSBwcm90ZWN0ZWQgYnkgYSBsb2NrICovCisjaWZkZWYgU0lHQUNUSU9OCitzdGF0aWMgc3RydWN0IHNpZ2FjdGlvbiBzYXZzaWdbTlg1MDlfU0lHXTsKKyNlbHNlCitzdGF0aWMgdm9pZCAoKnNhdnNpZ1tOWDUwOV9TSUddKShpbnQgKTsKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCitzdGF0aWMgc3RydWN0IElPU0IgaW9zYjsKK3N0YXRpYyAkREVTQ1JJUFRPUih0ZXJtaW5hbCwiVFQiKTsKK3N0YXRpYyBsb25nIHR0eV9vcmlnWzNdLCB0dHlfbmV3WzNdOyAvKiBYWFggICBJcyB0aGVyZSBhbnkgZ3VhcmFudGVlIHRoYXQgdGhpcyB3aWxsIGFsd2F5cyBzdWZmaWNlIGZvciB0aGUgYWN0dWFsIHN0cnVjdHVyZXM/ICovCitzdGF0aWMgbG9uZyBzdGF0dXM7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgY2hhbm5lbCA9IDA7CisjZWxzZQorI2lmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSB8fCBkZWZpbmVkKF9fREpHUFBfXykKK3N0YXRpYyBUVFlfU1RSVUNUIHR0eV9vcmlnLHR0eV9uZXc7CisjZW5kaWYKKyNlbmRpZgorc3RhdGljIEZJTEUgKnR0eV9pbiwgKnR0eV9vdXQ7CitzdGF0aWMgaW50IGlzX2FfdHR5OworCisvKiBEZWNsYXJlIHN0YXRpYyBmdW5jdGlvbnMgKi8KKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU4xNikgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOQ0UpCitzdGF0aWMgaW50IHJlYWRfdGlsbF9ubChGSUxFICopOworc3RhdGljIHZvaWQgcmVjc2lnKGludCk7CitzdGF0aWMgdm9pZCBwdXNoc2lnKHZvaWQpOworc3RhdGljIHZvaWQgcG9wc2lnKHZvaWQpOworI2VuZGlmCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19NU0RPUykgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMTYpCitzdGF0aWMgaW50IG5vZWNob19mZ2V0cyhjaGFyICpidWYsIGludCBzaXplLCBGSUxFICp0dHkpOworI2VuZGlmCitzdGF0aWMgaW50IHJlYWRfc3RyaW5nX2lubmVyKFVJICp1aSwgVUlfU1RSSU5HICp1aXMsIGludCBlY2hvLCBpbnQgc3RyaXBfbmwpOworCitzdGF0aWMgaW50IHJlYWRfc3RyaW5nKFVJICp1aSwgVUlfU1RSSU5HICp1aXMpOworc3RhdGljIGludCB3cml0ZV9zdHJpbmcoVUkgKnVpLCBVSV9TVFJJTkcgKnVpcyk7CisKK3N0YXRpYyBpbnQgb3Blbl9jb25zb2xlKFVJICp1aSk7CitzdGF0aWMgaW50IGVjaG9fY29uc29sZShVSSAqdWkpOworc3RhdGljIGludCBub2VjaG9fY29uc29sZShVSSAqdWkpOworc3RhdGljIGludCBjbG9zZV9jb25zb2xlKFVJICp1aSk7CisKK3N0YXRpYyBVSV9NRVRIT0QgdWlfb3BlbnNzbCA9CisJeworCSJPcGVuU1NMIGRlZmF1bHQgdXNlciBpbnRlcmZhY2UiLAorCW9wZW5fY29uc29sZSwKKwl3cml0ZV9zdHJpbmcsCisJTlVMTCwJCQkvKiBObyBmbHVzaGVyIGlzIG5lZWRlZCBmb3IgY29tbWFuZCBsaW5lcyAqLworCXJlYWRfc3RyaW5nLAorCWNsb3NlX2NvbnNvbGUsCisJTlVMTAorCX07CisKKy8qIFRoZSBtZXRob2Qgd2l0aCBhbGwgdGhlIGJ1aWx0LWluIHRoaW5naWVzICovCitVSV9NRVRIT0QgKlVJX09wZW5TU0wodm9pZCkKKwl7CisJcmV0dXJuICZ1aV9vcGVuc3NsOworCX0KKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgaW5mbyBhbmQgZXJyb3Igc3RyaW5ncyBhcmUgcHJpbnRlZAorICAgYmVmb3JlIGFueSBwcm9tcHQuICovCitzdGF0aWMgaW50IHdyaXRlX3N0cmluZyhVSSAqdWksIFVJX1NUUklORyAqdWlzKQorCXsKKwlzd2l0Y2ggKFVJX2dldF9zdHJpbmdfdHlwZSh1aXMpKQorCQl7CisJY2FzZSBVSVRfRVJST1I6CisJY2FzZSBVSVRfSU5GTzoKKwkJZnB1dHMoVUlfZ2V0MF9vdXRwdXRfc3RyaW5nKHVpcyksIHR0eV9vdXQpOworCQlmZmx1c2godHR5X291dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IHJlYWRfc3RyaW5nKFVJICp1aSwgVUlfU1RSSU5HICp1aXMpCisJeworCWludCBvayA9IDA7CisKKwlzd2l0Y2ggKFVJX2dldF9zdHJpbmdfdHlwZSh1aXMpKQorCQl7CisJY2FzZSBVSVRfQk9PTEVBTjoKKwkJZnB1dHMoVUlfZ2V0MF9vdXRwdXRfc3RyaW5nKHVpcyksIHR0eV9vdXQpOworCQlmcHV0cyhVSV9nZXQwX2FjdGlvbl9zdHJpbmcodWlzKSwgdHR5X291dCk7CisJCWZmbHVzaCh0dHlfb3V0KTsKKwkJcmV0dXJuIHJlYWRfc3RyaW5nX2lubmVyKHVpLCB1aXMsCisJCQlVSV9nZXRfaW5wdXRfZmxhZ3ModWlzKSAmIFVJX0lOUFVUX0ZMQUdfRUNITywgMCk7CisJY2FzZSBVSVRfUFJPTVBUOgorCQlmcHV0cyhVSV9nZXQwX291dHB1dF9zdHJpbmcodWlzKSwgdHR5X291dCk7CisJCWZmbHVzaCh0dHlfb3V0KTsKKwkJcmV0dXJuIHJlYWRfc3RyaW5nX2lubmVyKHVpLCB1aXMsCisJCQlVSV9nZXRfaW5wdXRfZmxhZ3ModWlzKSAmIFVJX0lOUFVUX0ZMQUdfRUNITywgMSk7CisJY2FzZSBVSVRfVkVSSUZZOgorCQlmcHJpbnRmKHR0eV9vdXQsIlZlcmlmeWluZyAtICVzIiwKKwkJCVVJX2dldDBfb3V0cHV0X3N0cmluZyh1aXMpKTsKKwkJZmZsdXNoKHR0eV9vdXQpOworCQlpZiAoKG9rID0gcmVhZF9zdHJpbmdfaW5uZXIodWksIHVpcywKKwkJCVVJX2dldF9pbnB1dF9mbGFncyh1aXMpICYgVUlfSU5QVVRfRkxBR19FQ0hPLCAxKSkgPD0gMCkKKwkJCXJldHVybiBvazsKKwkJaWYgKHN0cmNtcChVSV9nZXQwX3Jlc3VsdF9zdHJpbmcodWlzKSwKKwkJCVVJX2dldDBfdGVzdF9zdHJpbmcodWlzKSkgIT0gMCkKKwkJCXsKKwkJCWZwcmludGYodHR5X291dCwiVmVyaWZ5IGZhaWx1cmVcbiIpOworCQkJZmZsdXNoKHR0eV9vdXQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCQl9CisJcmV0dXJuIDE7CisJfQorCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU4xNikgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOQ0UpCisvKiBJbnRlcm5hbCBmdW5jdGlvbnMgdG8gcmVhZCBhIHN0cmluZyB3aXRob3V0IGVjaG9pbmcgKi8KK3N0YXRpYyBpbnQgcmVhZF90aWxsX25sKEZJTEUgKmluKQorCXsKKyNkZWZpbmUgU0laRSA0CisJY2hhciBidWZbU0laRSsxXTsKKworCWRvCXsKKwkJaWYgKCFmZ2V0cyhidWYsU0laRSxpbikpCisJCQlyZXR1cm4gMDsKKwkJfSB3aGlsZSAoc3RyY2hyKGJ1ZiwnXG4nKSA9PSBOVUxMKTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgaW50cl9zaWduYWw7CisjZW5kaWYKKworc3RhdGljIGludCByZWFkX3N0cmluZ19pbm5lcihVSSAqdWksIFVJX1NUUklORyAqdWlzLCBpbnQgZWNobywgaW50IHN0cmlwX25sKQorCXsKKwlzdGF0aWMgaW50IHBzOworCWludCBvazsKKwljaGFyIHJlc3VsdFtCVUZTSVpdOworCWludCBtYXhzaXplID0gQlVGU0laLTE7CisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMTYpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkNFKQorCWNoYXIgKnA7CisKKwlpbnRyX3NpZ25hbD0wOworCW9rPTA7CisJcHM9MDsKKworCXB1c2hzaWcoKTsKKwlwcz0xOworCisJaWYgKCFlY2hvICYmICFub2VjaG9fY29uc29sZSh1aSkpCisJCWdvdG8gZXJyb3I7CisJcHM9MjsKKworCXJlc3VsdFswXT0nXDAnOworI2lmZGVmIE9QRU5TU0xfU1lTX01TRE9TCisJaWYgKCFlY2hvKQorCQl7CisJCW5vZWNob19mZ2V0cyhyZXN1bHQsbWF4c2l6ZSx0dHlfaW4pOworCQlwPXJlc3VsdDsgLyogRklYTUU6IG5vZWNob19mZ2V0cyBkb2Vzbid0IHJldHVybiBlcnJvcnMgKi8KKwkJfQorCWVsc2UKKwkJcD1mZ2V0cyhyZXN1bHQsbWF4c2l6ZSx0dHlfaW4pOworI2Vsc2UKKwlwPWZnZXRzKHJlc3VsdCxtYXhzaXplLHR0eV9pbik7CisjZW5kaWYKKwlpZighcCkKKwkJZ290byBlcnJvcjsKKwlpZiAoZmVvZih0dHlfaW4pKSBnb3RvIGVycm9yOworCWlmIChmZXJyb3IodHR5X2luKSkgZ290byBlcnJvcjsKKwlpZiAoKHA9KGNoYXIgKilzdHJjaHIocmVzdWx0LCdcbicpKSAhPSBOVUxMKQorCQl7CisJCWlmIChzdHJpcF9ubCkKKwkJCSpwPSdcMCc7CisJCX0KKwllbHNlCisJCWlmICghcmVhZF90aWxsX25sKHR0eV9pbikpCisJCQlnb3RvIGVycm9yOworCWlmIChVSV9zZXRfcmVzdWx0KHVpLCB1aXMsIHJlc3VsdCkgPj0gMCkKKwkJb2s9MTsKKworZXJyb3I6CisJaWYgKGludHJfc2lnbmFsID09IFNJR0lOVCkKKwkJb2s9LTE7CisJaWYgKCFlY2hvKSBmcHJpbnRmKHR0eV9vdXQsIlxuIik7CisJaWYgKHBzID49IDIgJiYgIWVjaG8gJiYgIWVjaG9fY29uc29sZSh1aSkpCisJCW9rPTA7CisKKwlpZiAocHMgPj0gMSkKKwkJcG9wc2lnKCk7CisjZWxzZQorCW9rPTE7CisjZW5kaWYKKworCU9QRU5TU0xfY2xlYW5zZShyZXN1bHQsQlVGU0laKTsKKwlyZXR1cm4gb2s7CisJfQorCisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyB0byBvcGVuLCBoYW5kbGUgYW5kIGNsb3NlIGEgY2hhbm5lbCB0byB0aGUgY29uc29sZS4gICovCitzdGF0aWMgaW50IG9wZW5fY29uc29sZShVSSAqdWkpCisJeworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfVUkpOworCWlzX2FfdHR5ID0gMTsKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTUFDSU5UT1NIX0NMQVNTSUMpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfVlhXT1JLUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1MpCisJdHR5X2luPXN0ZGluOworCXR0eV9vdXQ9c3RkZXJyOworI2Vsc2UKKyMgIGlmZGVmIE9QRU5TU0xfU1lTX01TRE9TCisjICAgIGRlZmluZSBERVZfVFRZICJjb24iCisjICBlbHNlCisjICAgIGRlZmluZSBERVZfVFRZICIvZGV2L3R0eSIKKyMgIGVuZGlmCisJaWYgKCh0dHlfaW49Zm9wZW4oREVWX1RUWSwiciIpKSA9PSBOVUxMKQorCQl0dHlfaW49c3RkaW47CisJaWYgKCh0dHlfb3V0PWZvcGVuKERFVl9UVFksInciKSkgPT0gTlVMTCkKKwkJdHR5X291dD1zdGRlcnI7CisjZW5kaWYKKworI2lmIGRlZmluZWQoVFRZX2dldCkgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorIAlpZiAoVFRZX2dldChmaWxlbm8odHR5X2luKSwmdHR5X29yaWcpID09IC0xKQorCQl7CisjaWZkZWYgRU5PVFRZCisJCWlmIChlcnJubyA9PSBFTk9UVFkpCisJCQlpc19hX3R0eT0wOworCQllbHNlCisjZW5kaWYKKyNpZmRlZiBFSU5WQUwKKwkJLyogQXJpZWwgR2xlbm4gYXJpZWxAY29sdW1iaWEuZWR1IHJlcG9ydHMgdGhhdCBzb2xhcmlzCisJCSAqIGNhbiByZXR1cm4gRUlOVkFMIGluc3RlYWQuICBUaGlzIHNob3VsZCBiZSBvayAqLworCQlpZiAoZXJybm8gPT0gRUlOVkFMKQorCQkJaXNfYV90dHk9MDsKKwkJZWxzZQorI2VuZGlmCisJCQlyZXR1cm4gMDsKKwkJfQorI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisJc3RhdHVzID0gc3lzJGFzc2lnbigmdGVybWluYWwsJmNoYW5uZWwsMCwwKTsKKwlpZiAoc3RhdHVzICE9IFNTJF9OT1JNQUwpCisJCXJldHVybiAwOworCXN0YXR1cz1zeXMkcWlvdygwLGNoYW5uZWwsSU8kX1NFTlNFTU9ERSwmaW9zYiwwLDAsdHR5X29yaWcsMTIsMCwwLDAsMCk7CisJaWYgKChzdGF0dXMgIT0gU1MkX05PUk1BTCkgfHwgKGlvc2IuaW9zYiR3X3ZhbHVlICE9IFNTJF9OT1JNQUwpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBub2VjaG9fY29uc29sZShVSSAqdWkpCisJeworI2lmZGVmIFRUWV9GTEFHUworCW1lbWNweSgmKHR0eV9uZXcpLCYodHR5X29yaWcpLHNpemVvZih0dHlfb3JpZykpOworCXR0eV9uZXcuVFRZX0ZMQUdTICY9IH5FQ0hPOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFRUWV9zZXQpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykKKwlpZiAoaXNfYV90dHkgJiYgKFRUWV9zZXQoZmlsZW5vKHR0eV9pbiksJnR0eV9uZXcpID09IC0xKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwl0dHlfbmV3WzBdID0gdHR5X29yaWdbMF07CisJdHR5X25ld1sxXSA9IHR0eV9vcmlnWzFdIHwgVFQkTV9OT0VDSE87CisJdHR5X25ld1syXSA9IHR0eV9vcmlnWzJdOworCXN0YXR1cyA9IHN5cyRxaW93KDAsY2hhbm5lbCxJTyRfU0VUTU9ERSwmaW9zYiwwLDAsdHR5X25ldywxMiwwLDAsMCwwKTsKKwlpZiAoKHN0YXR1cyAhPSBTUyRfTk9STUFMKSB8fCAoaW9zYi5pb3NiJHdfdmFsdWUgIT0gU1MkX05PUk1BTCkpCisJCXJldHVybiAwOworI2VuZGlmCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGVjaG9fY29uc29sZShVSSAqdWkpCisJeworI2lmIGRlZmluZWQoVFRZX3NldCkgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorCW1lbWNweSgmKHR0eV9uZXcpLCYodHR5X29yaWcpLHNpemVvZih0dHlfb3JpZykpOworCXR0eV9uZXcuVFRZX0ZMQUdTIHw9IEVDSE87CisjZW5kaWYKKworI2lmIGRlZmluZWQoVFRZX3NldCkgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorCWlmIChpc19hX3R0eSAmJiAoVFRZX3NldChmaWxlbm8odHR5X2luKSwmdHR5X25ldykgPT0gLTEpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCXR0eV9uZXdbMF0gPSB0dHlfb3JpZ1swXTsKKwl0dHlfbmV3WzFdID0gdHR5X29yaWdbMV0gJiB+VFQkTV9OT0VDSE87CisJdHR5X25ld1syXSA9IHR0eV9vcmlnWzJdOworCXN0YXR1cyA9IHN5cyRxaW93KDAsY2hhbm5lbCxJTyRfU0VUTU9ERSwmaW9zYiwwLDAsdHR5X25ldywxMiwwLDAsMCwwKTsKKwlpZiAoKHN0YXR1cyAhPSBTUyRfTk9STUFMKSB8fCAoaW9zYi5pb3NiJHdfdmFsdWUgIT0gU1MkX05PUk1BTCkpCisJCXJldHVybiAwOworI2VuZGlmCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGNsb3NlX2NvbnNvbGUoVUkgKnVpKQorCXsKKwlpZiAodHR5X2luICE9IHN0ZGluKSBmY2xvc2UodHR5X2luKTsKKwlpZiAodHR5X291dCAhPSBzdGRlcnIpIGZjbG9zZSh0dHlfb3V0KTsKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKwlzdGF0dXMgPSBzeXMkZGFzc2duKGNoYW5uZWwpOworI2VuZGlmCisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1VJKTsKKworCXJldHVybiAxOworCX0KKworCisjaWYgIWRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMTYpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkNFKQorLyogSW50ZXJuYWwgZnVuY3Rpb25zIHRvIGhhbmRsZSBzaWduYWxzIGFuZCBhY3Qgb24gdGhlbSAqLworc3RhdGljIHZvaWQgcHVzaHNpZyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfV0lOMzIKKwlpbnQgaTsKKyNlbmRpZgorI2lmZGVmIFNJR0FDVElPTgorCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwltZW1zZXQoJnNhLDAsc2l6ZW9mIHNhKTsKKwlzYS5zYV9oYW5kbGVyPXJlY3NpZzsKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzIKKwlzYXZzaWdbU0lHQUJSVF09c2lnbmFsKFNJR0FCUlQscmVjc2lnKTsKKwlzYXZzaWdbU0lHRlBFXT1zaWduYWwoU0lHRlBFLHJlY3NpZyk7CisJc2F2c2lnW1NJR0lMTF09c2lnbmFsKFNJR0lMTCxyZWNzaWcpOworCXNhdnNpZ1tTSUdJTlRdPXNpZ25hbChTSUdJTlQscmVjc2lnKTsKKwlzYXZzaWdbU0lHU0VHVl09c2lnbmFsKFNJR1NFR1YscmVjc2lnKTsKKwlzYXZzaWdbU0lHVEVSTV09c2lnbmFsKFNJR1RFUk0scmVjc2lnKTsKKyNlbHNlCisJZm9yIChpPTE7IGk8Tlg1MDlfU0lHOyBpKyspCisJCXsKKyNpZmRlZiBTSUdVU1IxCisJCWlmIChpID09IFNJR1VTUjEpCisJCQljb250aW51ZTsKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjIKKwkJaWYgKGkgPT0gU0lHVVNSMikKKwkJCWNvbnRpbnVlOworI2VuZGlmCisjaWZkZWYgU0lHS0lMTAorCQlpZiAoaSA9PSBTSUdLSUxMKSAvKiBXZSBjYW4ndCBtYWtlIGFueSBhY3Rpb24gb24gdGhhdC4gKi8KKwkJCWNvbnRpbnVlOworI2VuZGlmCisjaWZkZWYgU0lHQUNUSU9OCisJCXNpZ2FjdGlvbihpLCZzYSwmc2F2c2lnW2ldKTsKKyNlbHNlCisJCXNhdnNpZ1tpXT1zaWduYWwoaSxyZWNzaWcpOworI2VuZGlmCisJCX0KKyNlbmRpZgorCisjaWZkZWYgU0lHV0lOQ0gKKwlzaWduYWwoU0lHV0lOQ0gsU0lHX0RGTCk7CisjZW5kaWYKKwl9CisKK3N0YXRpYyB2b2lkIHBvcHNpZyh2b2lkKQorCXsKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4zMgorCXNpZ25hbChTSUdBQlJULHNhdnNpZ1tTSUdBQlJUXSk7CisJc2lnbmFsKFNJR0ZQRSxzYXZzaWdbU0lHRlBFXSk7CisJc2lnbmFsKFNJR0lMTCxzYXZzaWdbU0lHSUxMXSk7CisJc2lnbmFsKFNJR0lOVCxzYXZzaWdbU0lHSU5UXSk7CisJc2lnbmFsKFNJR1NFR1Ysc2F2c2lnW1NJR1NFR1ZdKTsKKwlzaWduYWwoU0lHVEVSTSxzYXZzaWdbU0lHVEVSTV0pOworI2Vsc2UKKwlpbnQgaTsKKwlmb3IgKGk9MTsgaTxOWDUwOV9TSUc7IGkrKykKKwkJeworI2lmZGVmIFNJR1VTUjEKKwkJaWYgKGkgPT0gU0lHVVNSMSkKKwkJCWNvbnRpbnVlOworI2VuZGlmCisjaWZkZWYgU0lHVVNSMgorCQlpZiAoaSA9PSBTSUdVU1IyKQorCQkJY29udGludWU7CisjZW5kaWYKKyNpZmRlZiBTSUdBQ1RJT04KKwkJc2lnYWN0aW9uKGksJnNhdnNpZ1tpXSxOVUxMKTsKKyNlbHNlCisJCXNpZ25hbChpLHNhdnNpZ1tpXSk7CisjZW5kaWYKKwkJfQorI2VuZGlmCisJfQorCitzdGF0aWMgdm9pZCByZWNzaWcoaW50IGkpCisJeworCWludHJfc2lnbmFsPWk7CisJfQorI2VuZGlmCisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyBzcGVjaWZpYyBmb3IgV2luZG93cyAqLworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjE2KSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU5DRSkKK3N0YXRpYyBpbnQgbm9lY2hvX2ZnZXRzKGNoYXIgKmJ1ZiwgaW50IHNpemUsIEZJTEUgKnR0eSkKKwl7CisJaW50IGk7CisJY2hhciAqcDsKKworCXA9YnVmOworCWZvciAoOzspCisJCXsKKwkJaWYgKHNpemUgPT0gMCkKKwkJCXsKKwkJCSpwPSdcMCc7CisJCQlicmVhazsKKwkJCX0KKwkJc2l6ZS0tOworI2lmZGVmIFdJTjE2VFRZCisJCWk9X2luY2hhcigpOworI2VsaWYgZGVmaW5lZChfV0lOMzIpCisJCWk9X2dldGNoKCk7CisjZWxzZQorCQlpPWdldGNoKCk7CisjZW5kaWYKKwkJaWYgKGkgPT0gJ1xyJykgaT0nXG4nOworCQkqKHArKyk9aTsKKwkJaWYgKGkgPT0gJ1xuJykKKwkJCXsKKwkJCSpwPSdcMCc7CisJCQlicmVhazsKKwkJCX0KKwkJfQorI2lmZGVmIFdJTl9DT05TT0xFX0JVRworLyogV2luOTUgaGFzIHNldmVyYWwgZXZpbCBjb25zb2xlIGJ1Z3M6IG9uZSBvZiB0aGVzZSBpcyB0aGF0IHRoZQorICogbGFzdCBjaGFyYWN0ZXIgcmVhZCB1c2luZyBnZXRjaCgpIGlzIHBhc3NlZCB0byB0aGUgbmV4dCByZWFkOiB0aGlzIGlzCisgKiB1c3VhbGx5IGEgQ1Igc28gdGhpcyBjYW4gYmUgdHJvdWJsZS4gTm8gU1RESU8gZml4IHNlZW1zIHRvIHdvcmsgYnV0CisgKiBmbHVzaGluZyB0aGUgY29uc29sZSBhcHBlYXJzIHRvIGRvIHRoZSB0cmljay4KKyAqLworCQl7CisJCQlIQU5ETEUgaW5oOworCQkJaW5oID0gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOworCQkJRmx1c2hDb25zb2xlSW5wdXRCdWZmZXIoaW5oKTsKKwkJfQorI2VuZGlmCisJcmV0dXJuKHN0cmxlbihidWYpKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by91aS91aV91dGlsLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8vdWkvdWlfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOTc2MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdWkvdWlfdXRpbC5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qIGNyeXB0by91aS91aV91dGlsLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAidWlfbG9jbC5oIgorCitpbnQgVUlfVVRJTF9yZWFkX3B3X3N0cmluZyhjaGFyICpidWYsaW50IGxlbmd0aCxjb25zdCBjaGFyICpwcm9tcHQsaW50IHZlcmlmeSkKKwl7CisJY2hhciBidWZmW0JVRlNJWl07CisJaW50IHJldDsKKworCXJldD1VSV9VVElMX3JlYWRfcHcoYnVmLGJ1ZmYsKGxlbmd0aD5CVUZTSVopP0JVRlNJWjpsZW5ndGgscHJvbXB0LHZlcmlmeSk7CisJT1BFTlNTTF9jbGVhbnNlKGJ1ZmYsQlVGU0laKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBVSV9VVElMX3JlYWRfcHcoY2hhciAqYnVmLGNoYXIgKmJ1ZmYsaW50IHNpemUsY29uc3QgY2hhciAqcHJvbXB0LGludCB2ZXJpZnkpCisJeworCWludCBvayA9IDA7CisJVUkgKnVpOworCisJaWYgKHNpemUgPCAxKQorCQlyZXR1cm4gLTE7CisKKwl1aSA9IFVJX25ldygpOworCWlmICh1aSkKKwkJeworCQlvayA9IFVJX2FkZF9pbnB1dF9zdHJpbmcodWkscHJvbXB0LDAsYnVmLDAsc2l6ZS0xKTsKKwkJaWYgKG9rID49IDAgJiYgdmVyaWZ5KQorCQkJb2sgPSBVSV9hZGRfdmVyaWZ5X3N0cmluZyh1aSxwcm9tcHQsMCxidWZmLDAsc2l6ZS0xLAorCQkJCWJ1Zik7CisJCWlmIChvayA+PSAwKQorCQkJb2s9VUlfcHJvY2Vzcyh1aSk7CisJCVVJX2ZyZWUodWkpOworCQl9CisJaWYgKG9rID4gMCkKKwkJb2sgPSAwOworCXJldHVybihvayk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3VpZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3VpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZmQ1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8vdWlkLmMKQEAgLTAsMCArMSw4OSBAQAorLyogY3J5cHRvL3VpZC5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKworI2lmIGRlZmluZWQoX19PcGVuQlNEX18pIHx8IChkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiBfX0ZyZWVCU0RfXyA+IDIpCisKKyNpbmNsdWRlIE9QRU5TU0xfVU5JU1RECisKK2ludCBPUEVOU1NMX2lzc2V0dWdpZCh2b2lkKQorCXsKKwlyZXR1cm4gaXNzZXR1Z2lkKCk7CisJfQorCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZYV09SS1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkKKworaW50IE9QRU5TU0xfaXNzZXR1Z2lkKHZvaWQpCisJeworCXJldHVybiAwOworCX0KKworI2Vsc2UKKworI2luY2x1ZGUgT1BFTlNTTF9VTklTVEQKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworaW50IE9QRU5TU0xfaXNzZXR1Z2lkKHZvaWQpCisJeworCWlmIChnZXR1aWQoKSAhPSBnZXRldWlkKCkpIHJldHVybiAxOworCWlmIChnZXRnaWQoKSAhPSBnZXRlZ2lkKCkpIHJldHVybiAxOworCXJldHVybiAwOworCX0KKyNlbmRpZgorCisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkvYnlfZGlyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS9ieV9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2NhNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkvYnlfZGlyLmMKQEAgLTAsMCArMSw0ODIgQEAKKy8qIGNyeXB0by94NTA5L2J5X2Rpci5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKworI2lmbmRlZiBOT19TWVNfVFlQRVNfSAorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1BPU0lYX0lPCisjIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworCit0eXBlZGVmIHN0cnVjdCBsb29rdXBfZGlyX2hhc2hlc19zdAorCXsKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisJaW50IHN1ZmZpeDsKKwl9IEJZX0RJUl9IQVNIOworCit0eXBlZGVmIHN0cnVjdCBsb29rdXBfZGlyX2VudHJ5X3N0CisJeworCWNoYXIgKmRpcjsKKwlpbnQgZGlyX3R5cGU7CisJU1RBQ0tfT0YoQllfRElSX0hBU0gpICpoYXNoZXM7CisJfSBCWV9ESVJfRU5UUlk7CisKK3R5cGVkZWYgc3RydWN0IGxvb2t1cF9kaXJfc3QKKwl7CisJQlVGX01FTSAqYnVmZmVyOworCVNUQUNLX09GKEJZX0RJUl9FTlRSWSkgKmRpcnM7CisJfSBCWV9ESVI7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoQllfRElSX0hBU0gpCitERUNMQVJFX1NUQUNLX09GKEJZX0RJUl9FTlRSWSkKKworc3RhdGljIGludCBkaXJfY3RybChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgY21kLCBjb25zdCBjaGFyICphcmdwLCBsb25nIGFyZ2wsCisJY2hhciAqKnJldCk7CitzdGF0aWMgaW50IG5ld19kaXIoWDUwOV9MT09LVVAgKmx1KTsKK3N0YXRpYyB2b2lkIGZyZWVfZGlyKFg1MDlfTE9PS1VQICpsdSk7CitzdGF0aWMgaW50IGFkZF9jZXJ0X2RpcihCWV9ESVIgKmN0eCxjb25zdCBjaGFyICpkaXIsaW50IHR5cGUpOworc3RhdGljIGludCBnZXRfY2VydF9ieV9zdWJqZWN0KFg1MDlfTE9PS1VQICp4bCxpbnQgdHlwZSxYNTA5X05BTUUgKm5hbWUsCisJWDUwOV9PQkpFQ1QgKnJldCk7CitYNTA5X0xPT0tVUF9NRVRIT0QgeDUwOV9kaXJfbG9va3VwPQorCXsKKwkiTG9hZCBjZXJ0cyBmcm9tIGZpbGVzIGluIGEgZGlyZWN0b3J5IiwKKwluZXdfZGlyLAkJLyogbmV3ICovCisJZnJlZV9kaXIsCQkvKiBmcmVlICovCisJTlVMTCwgCQkJLyogaW5pdCAqLworCU5VTEwsCQkJLyogc2h1dGRvd24gKi8KKwlkaXJfY3RybCwJCS8qIGN0cmwgKi8KKwlnZXRfY2VydF9ieV9zdWJqZWN0LAkvKiBnZXRfYnlfc3ViamVjdCAqLworCU5VTEwsCQkJLyogZ2V0X2J5X2lzc3Vlcl9zZXJpYWwgKi8KKwlOVUxMLAkJCS8qIGdldF9ieV9maW5nZXJwcmludCAqLworCU5VTEwsCQkJLyogZ2V0X2J5X2FsaWFzICovCisJfTsKKworWDUwOV9MT09LVVBfTUVUSE9EICpYNTA5X0xPT0tVUF9oYXNoX2Rpcih2b2lkKQorCXsKKwlyZXR1cm4oJng1MDlfZGlyX2xvb2t1cCk7CisJfQorCitzdGF0aWMgaW50IGRpcl9jdHJsKFg1MDlfTE9PS1VQICpjdHgsIGludCBjbWQsIGNvbnN0IGNoYXIgKmFyZ3AsIGxvbmcgYXJnbCwKKwkgICAgIGNoYXIgKipyZXRwKQorCXsKKwlpbnQgcmV0PTA7CisJQllfRElSICpsZDsKKwljaGFyICpkaXIgPSBOVUxMOworCisJbGQ9KEJZX0RJUiAqKWN0eC0+bWV0aG9kX2RhdGE7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgWDUwOV9MX0FERF9ESVI6CisJCWlmIChhcmdsID09IFg1MDlfRklMRVRZUEVfREVGQVVMVCkKKwkJCXsKKwkJCWRpcj0oY2hhciAqKWdldGVudihYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyX2VudigpKTsKKwkJCWlmIChkaXIpCisJCQkJcmV0PWFkZF9jZXJ0X2RpcihsZCxkaXIsWDUwOV9GSUxFVFlQRV9QRU0pOworCQkJZWxzZQorCQkJCXJldD1hZGRfY2VydF9kaXIobGQsWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2RpcigpLAorCQkJCQlYNTA5X0ZJTEVUWVBFX1BFTSk7CisJCQlpZiAoIXJldCkKKwkJCQl7CisJCQkJWDUwOWVycihYNTA5X0ZfRElSX0NUUkwsWDUwOV9SX0xPQURJTkdfQ0VSVF9ESVIpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJcmV0PWFkZF9jZXJ0X2RpcihsZCxhcmdwLChpbnQpYXJnbCk7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IG5ld19kaXIoWDUwOV9MT09LVVAgKmx1KQorCXsKKwlCWV9ESVIgKmE7CisKKwlpZiAoKGE9KEJZX0RJUiAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCWV9ESVIpKSkgPT0gTlVMTCkKKwkJcmV0dXJuKDApOworCWlmICgoYS0+YnVmZmVyPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGEpOworCQlyZXR1cm4oMCk7CisJCX0KKwlhLT5kaXJzPU5VTEw7CisJbHUtPm1ldGhvZF9kYXRhPShjaGFyICopYTsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgdm9pZCBieV9kaXJfaGFzaF9mcmVlKEJZX0RJUl9IQVNIICpoYXNoKQorCXsKKwlPUEVOU1NMX2ZyZWUoaGFzaCk7CisJfQorCitzdGF0aWMgaW50IGJ5X2Rpcl9oYXNoX2NtcChjb25zdCBCWV9ESVJfSEFTSCAqIGNvbnN0ICphLAorCQkJY29uc3QgQllfRElSX0hBU0ggKiBjb25zdCAqYikKKwl7CisJaWYgKCgqYSktPmhhc2ggPiAoKmIpLT5oYXNoKQorCQlyZXR1cm4gMTsKKwlpZiAoKCphKS0+aGFzaCA8ICgqYiktPmhhc2gpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyB2b2lkIGJ5X2Rpcl9lbnRyeV9mcmVlKEJZX0RJUl9FTlRSWSAqZW50KQorCXsKKwlpZiAoZW50LT5kaXIpCisJCU9QRU5TU0xfZnJlZShlbnQtPmRpcik7CisJaWYgKGVudC0+aGFzaGVzKQorCQlza19CWV9ESVJfSEFTSF9wb3BfZnJlZShlbnQtPmhhc2hlcywgYnlfZGlyX2hhc2hfZnJlZSk7CisJT1BFTlNTTF9mcmVlKGVudCk7CisJfQorCitzdGF0aWMgdm9pZCBmcmVlX2RpcihYNTA5X0xPT0tVUCAqbHUpCisJeworCUJZX0RJUiAqYTsKKworCWE9KEJZX0RJUiAqKWx1LT5tZXRob2RfZGF0YTsKKwlpZiAoYS0+ZGlycyAhPSBOVUxMKQorCQlza19CWV9ESVJfRU5UUllfcG9wX2ZyZWUoYS0+ZGlycywgYnlfZGlyX2VudHJ5X2ZyZWUpOworCWlmIChhLT5idWZmZXIgIT0gTlVMTCkKKwkJQlVGX01FTV9mcmVlKGEtPmJ1ZmZlcik7CisJT1BFTlNTTF9mcmVlKGEpOworCX0KKworc3RhdGljIGludCBhZGRfY2VydF9kaXIoQllfRElSICpjdHgsIGNvbnN0IGNoYXIgKmRpciwgaW50IHR5cGUpCisJeworCWludCBqLGxlbjsKKwljb25zdCBjaGFyICpzLCpzcywqcDsKKworCWlmIChkaXIgPT0gTlVMTCB8fCAhKmRpcikKKwkgICAgeworCSAgICBYNTA5ZXJyKFg1MDlfRl9BRERfQ0VSVF9ESVIsWDUwOV9SX0lOVkFMSURfRElSRUNUT1JZKTsKKwkgICAgcmV0dXJuIDA7CisJICAgIH0KKworCXM9ZGlyOworCXA9czsKKwlmb3IgKDs7cCsrKQorCQl7CisJCWlmICgoKnAgPT0gTElTVF9TRVBBUkFUT1JfQ0hBUikgfHwgKCpwID09ICdcMCcpKQorCQkJeworCQkJQllfRElSX0VOVFJZICplbnQ7CisJCQlzcz1zOworCQkJcz1wKzE7CisJCQlsZW49KGludCkocC1zcyk7CisJCQlpZiAobGVuID09IDApIGNvbnRpbnVlOworCQkJZm9yIChqPTA7IGogPCBza19CWV9ESVJfRU5UUllfbnVtKGN0eC0+ZGlycyk7IGorKykKKwkJCQl7CisJCQkJZW50ID0gc2tfQllfRElSX0VOVFJZX3ZhbHVlKGN0eC0+ZGlycywgaik7CisJCQkJaWYgKHN0cmxlbihlbnQtPmRpcikgPT0gKHNpemVfdClsZW4gJiYKKwkJCQkgICAgc3RybmNtcChlbnQtPmRpcixzcywodW5zaWduZWQgaW50KWxlbikgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJaWYgKGogPCBza19CWV9ESVJfRU5UUllfbnVtKGN0eC0+ZGlycykpCisJCQkJY29udGludWU7CisJCQlpZiAoY3R4LT5kaXJzID09IE5VTEwpCisJCQkJeworCQkJCWN0eC0+ZGlycyA9IHNrX0JZX0RJUl9FTlRSWV9uZXdfbnVsbCgpOworCQkJCWlmICghY3R4LT5kaXJzKQorCQkJCQl7CisJCQkJCVg1MDllcnIoWDUwOV9GX0FERF9DRVJUX0RJUixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJZW50ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEJZX0RJUl9FTlRSWSkpOworCQkJaWYgKCFlbnQpCisJCQkJcmV0dXJuIDA7CisJCQllbnQtPmRpcl90eXBlID0gdHlwZTsKKwkJCWVudC0+aGFzaGVzID0gc2tfQllfRElSX0hBU0hfbmV3KGJ5X2Rpcl9oYXNoX2NtcCk7CisJCQllbnQtPmRpciA9IE9QRU5TU0xfbWFsbG9jKCh1bnNpZ25lZCBpbnQpbGVuKzEpOworCQkJaWYgKCFlbnQtPmRpciB8fCAhZW50LT5oYXNoZXMpCisJCQkJeworCQkJCWJ5X2Rpcl9lbnRyeV9mcmVlKGVudCk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJc3RybmNweShlbnQtPmRpcixzcywodW5zaWduZWQgaW50KWxlbik7CisJCQllbnQtPmRpcltsZW5dID0gJ1wwJzsKKwkJCWlmICghc2tfQllfRElSX0VOVFJZX3B1c2goY3R4LT5kaXJzLCBlbnQpKQorCQkJCXsKKwkJCQlieV9kaXJfZW50cnlfZnJlZShlbnQpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJaWYgKCpwID09ICdcMCcpCisJCQlicmVhazsKKwkJfQorCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBnZXRfY2VydF9ieV9zdWJqZWN0KFg1MDlfTE9PS1VQICp4bCwgaW50IHR5cGUsIFg1MDlfTkFNRSAqbmFtZSwKKwkgICAgIFg1MDlfT0JKRUNUICpyZXQpCisJeworCUJZX0RJUiAqY3R4OworCXVuaW9uCXsKKwkJc3RydWN0CXsKKwkJCVg1MDkgc3RfeDUwOTsKKwkJCVg1MDlfQ0lORiBzdF94NTA5X2NpbmY7CisJCQl9IHg1MDk7CisJCXN0cnVjdAl7CisJCQlYNTA5X0NSTCBzdF9jcmw7CisJCQlYNTA5X0NSTF9JTkZPIHN0X2NybF9pbmZvOworCQkJfSBjcmw7CisJCX0gZGF0YTsKKwlpbnQgb2s9MDsKKwlpbnQgaSxqLGs7CisJdW5zaWduZWQgbG9uZyBoOworCUJVRl9NRU0gKmI9TlVMTDsKKwlYNTA5X09CSkVDVCBzdG1wLCp0bXA7CisJY29uc3QgY2hhciAqcG9zdGZpeD0iIjsKKworCWlmIChuYW1lID09IE5VTEwpIHJldHVybigwKTsKKworCXN0bXAudHlwZT10eXBlOworCWlmICh0eXBlID09IFg1MDlfTFVfWDUwOSkKKwkJeworCQlkYXRhLng1MDkuc3RfeDUwOS5jZXJ0X2luZm89ICZkYXRhLng1MDkuc3RfeDUwOV9jaW5mOworCQlkYXRhLng1MDkuc3RfeDUwOV9jaW5mLnN1YmplY3Q9bmFtZTsKKwkJc3RtcC5kYXRhLng1MDk9ICZkYXRhLng1MDkuc3RfeDUwOTsKKwkJcG9zdGZpeD0iIjsKKwkJfQorCWVsc2UgaWYgKHR5cGUgPT0gWDUwOV9MVV9DUkwpCisJCXsKKwkJZGF0YS5jcmwuc3RfY3JsLmNybD0gJmRhdGEuY3JsLnN0X2NybF9pbmZvOworCQlkYXRhLmNybC5zdF9jcmxfaW5mby5pc3N1ZXI9bmFtZTsKKwkJc3RtcC5kYXRhLmNybD0gJmRhdGEuY3JsLnN0X2NybDsKKwkJcG9zdGZpeD0iciI7CisJCX0KKwllbHNlCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfR0VUX0NFUlRfQllfU1VCSkVDVCxYNTA5X1JfV1JPTkdfTE9PS1VQX1RZUEUpOworCQlnb3RvIGZpbmlzaDsKKwkJfQorCisJaWYgKChiPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfR0VUX0NFUlRfQllfU1VCSkVDVCxFUlJfUl9CVUZfTElCKTsKKwkJZ290byBmaW5pc2g7CisJCX0KKwkKKwljdHg9KEJZX0RJUiAqKXhsLT5tZXRob2RfZGF0YTsKKworCWg9WDUwOV9OQU1FX2hhc2gobmFtZSk7CisJZm9yIChpPTA7IGkgPCBza19CWV9ESVJfRU5UUllfbnVtKGN0eC0+ZGlycyk7IGkrKykKKwkJeworCQlCWV9ESVJfRU5UUlkgKmVudDsKKwkJaW50IGlkeDsKKwkJQllfRElSX0hBU0ggaHRtcCwgKmhlbnQ7CisJCWVudCA9IHNrX0JZX0RJUl9FTlRSWV92YWx1ZShjdHgtPmRpcnMsIGkpOworCQlqPXN0cmxlbihlbnQtPmRpcikrMSs4KzYrMSsxOworCQlpZiAoIUJVRl9NRU1fZ3JvdyhiLGopKQorCQkJeworCQkJWDUwOWVycihYNTA5X0ZfR0VUX0NFUlRfQllfU1VCSkVDVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGZpbmlzaDsKKwkJCX0KKwkJaWYgKHR5cGUgPT0gWDUwOV9MVV9DUkwgJiYgZW50LT5oYXNoZXMpCisJCQl7CisJCQlodG1wLmhhc2ggPSBoOworCQkJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKwkJCWlkeCA9IHNrX0JZX0RJUl9IQVNIX2ZpbmQoZW50LT5oYXNoZXMsICZodG1wKTsKKwkJCWlmIChpZHggPj0gMCkKKwkJCQl7CisJCQkJaGVudCA9IHNrX0JZX0RJUl9IQVNIX3ZhbHVlKGVudC0+aGFzaGVzLCBpZHgpOworCQkJCWsgPSBoZW50LT5zdWZmaXg7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQloZW50ID0gTlVMTDsKKwkJCQlrPTA7CisJCQkJfQorCQkJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlrID0gMDsKKwkJCWhlbnQgPSBOVUxMOworCQkJfQorCQlmb3IgKDs7KQorCQkJeworCQkJY2hhciBjID0gJy8nOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQkJYyA9IGVudC0+ZGlyW3N0cmxlbihlbnQtPmRpciktMV07CisJCQlpZiAoYyAhPSAnOicgJiYgYyAhPSAnPicgJiYgYyAhPSAnXScpCisJCQkJeworCQkJCS8qIElmIG5vIHNlcGFyYXRvciBpcyBwcmVzZW50LCB3ZSBhc3N1bWUgdGhlCisJCQkJICAgZGlyZWN0b3J5IHNwZWNpZmllciBpcyBhIGxvZ2ljYWwgbmFtZSwgYW5kCisJCQkJICAgYWRkIGEgY29sb24uICBXZSByZWFsbHkgc2hvdWxkIHVzZSBiZXR0ZXIKKwkJCQkgICBWTVMgcm91dGluZXMgZm9yIG1lcmdpbmcgdGhpbmdzIGxpa2UgdGhpcywKKwkJCQkgICBidXQgdGhpcyB3aWxsIGRvIGZvciBub3cuLi4KKwkJCQkgICAtLSBSaWNoYXJkIExldml0dGUgKi8KKwkJCQljID0gJzonOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJYyA9ICdcMCc7CisJCQkJfQorI2VuZGlmCisJCQlpZiAoYyA9PSAnXDAnKQorCQkJCXsKKwkJCQkvKiBUaGlzIGlzIHNwZWNpYWwuICBXaGVuIGMgPT0gJ1wwJywgbm8KKwkJCQkgICBkaXJlY3Rvcnkgc2VwYXJhdG9yIHNob3VsZCBiZSBhZGRlZC4gKi8KKwkJCQlCSU9fc25wcmludGYoYi0+ZGF0YSxiLT5tYXgsCisJCQkJCSIlcyUwOGx4LiVzJWQiLGVudC0+ZGlyLGgsCisJCQkJCXBvc3RmaXgsayk7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlCSU9fc25wcmludGYoYi0+ZGF0YSxiLT5tYXgsCisJCQkJCSIlcyVjJTA4bHguJXMlZCIsZW50LT5kaXIsYyxoLAorCQkJCQlwb3N0Zml4LGspOworCQkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19QT1NJWF9JTworI2lmZGVmIF9XSU4zMgorI2RlZmluZSBzdGF0IF9zdGF0CisjZW5kaWYKKwkJCXsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaWYgKHN0YXQoYi0+ZGF0YSwmc3QpIDwgMCkKKwkJCQlicmVhazsKKwkJCX0KKyNlbmRpZgorCQkJLyogZm91bmQgb25lLiAqLworCQkJaWYgKHR5cGUgPT0gWDUwOV9MVV9YNTA5KQorCQkJCXsKKwkJCQlpZiAoKFg1MDlfbG9hZF9jZXJ0X2ZpbGUoeGwsYi0+ZGF0YSwKKwkJCQkJZW50LT5kaXJfdHlwZSkpID09IDApCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWVsc2UgaWYgKHR5cGUgPT0gWDUwOV9MVV9DUkwpCisJCQkJeworCQkJCWlmICgoWDUwOV9sb2FkX2NybF9maWxlKHhsLGItPmRhdGEsCisJCQkJCWVudC0+ZGlyX3R5cGUpKSA9PSAwKQorCQkJCQlicmVhazsKKwkJCQl9CisJCQkvKiBlbHNlIGNhc2Ugd2lsbCBjYXVnaHQgaGlnaGVyIHVwICovCisJCQlrKys7CisJCQl9CisKKwkJLyogd2UgaGF2ZSBhZGRlZCBpdCB0byB0aGUgY2FjaGUgc28gbm93IHB1bGwKKwkJICogaXQgb3V0IGFnYWluICovCisJCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJCWogPSBza19YNTA5X09CSkVDVF9maW5kKHhsLT5zdG9yZV9jdHgtPm9ianMsJnN0bXApOworCQlpZihqICE9IC0xKSB0bXA9c2tfWDUwOV9PQkpFQ1RfdmFsdWUoeGwtPnN0b3JlX2N0eC0+b2JqcyxqKTsKKwkJZWxzZSB0bXAgPSBOVUxMOworCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisKKworCQkvKiBJZiBhIENSTCwgdXBkYXRlIHRoZSBsYXN0IGZpbGUgc3VmZml4IGFkZGVkIGZvciB0aGlzICovCisKKwkJaWYgKHR5cGUgPT0gWDUwOV9MVV9DUkwpCisJCQl7CisJCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJLyogTG9vayBmb3IgZW50cnkgYWdhaW4gaW4gY2FzZSBhbm90aGVyIHRocmVhZCBhZGRlZAorCQkJICogYW4gZW50cnkgZmlyc3QuCisJCQkgKi8KKwkJCWlmICghaGVudCkKKwkJCQl7CisJCQkJaHRtcC5oYXNoID0gaDsKKwkJCQlpZHggPSBza19CWV9ESVJfSEFTSF9maW5kKGVudC0+aGFzaGVzLCAmaHRtcCk7CisJCQkJaWYgKGlkeCA+PSAwKQorCQkJCQloZW50ID0KKwkJCQkJIHNrX0JZX0RJUl9IQVNIX3ZhbHVlKGVudC0+aGFzaGVzLCBpZHgpOworCQkJCX0KKwkJCWlmICghaGVudCkKKwkJCQl7CisJCQkJaGVudCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihCWV9ESVJfSEFTSCkpOworCQkJCWhlbnQtPmhhc2ggPSBoOworCQkJCWhlbnQtPnN1ZmZpeCA9IGs7CisJCQkJaWYgKCFza19CWV9ESVJfSEFTSF9wdXNoKGVudC0+aGFzaGVzLCBoZW50KSkKKwkJCQkJeworCQkJCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJCQkJCU9QRU5TU0xfZnJlZShoZW50KTsKKwkJCQkJb2sgPSAwOworCQkJCQlnb3RvIGZpbmlzaDsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UgaWYgKGhlbnQtPnN1ZmZpeCA8IGspCisJCQkJaGVudC0+c3VmZml4ID0gazsKKworCQkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCisJCQl9CisKKwkJaWYgKHRtcCAhPSBOVUxMKQorCQkJeworCQkJb2s9MTsKKwkJCXJldC0+dHlwZT10bXAtPnR5cGU7CisJCQltZW1jcHkoJnJldC0+ZGF0YSwmdG1wLT5kYXRhLHNpemVvZihyZXQtPmRhdGEpKTsKKwkJCS8qIElmIHdlIHdlcmUgZ29pbmcgdG8gdXAgdGhlIHJlZmVyZW5jZSBjb3VudCwKKwkJCSAqIHdlIHdvdWxkIG5lZWQgdG8gZG8gaXQgb24gYSBwZXJsICd0eXBlJworCQkJICogYmFzaXMgKi8KKwkvKgkJQ1JZUFRPX2FkZCgmdG1wLT5kYXRhLng1MDktPnJlZmVyZW5jZXMsMSwKKwkJCQlDUllQVE9fTE9DS19YNTA5KTsqLworCQkJZ290byBmaW5pc2g7CisJCQl9CisJCX0KK2ZpbmlzaDoKKwlpZiAoYiAhPSBOVUxMKSBCVUZfTUVNX2ZyZWUoYik7CisJcmV0dXJuKG9rKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS9ieV9maWxlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS9ieV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiMDhlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L2J5X2ZpbGUuYwpAQCAtMCwwICsxLDMwMCBAQAorLyogY3J5cHRvL3g1MDkvYnlfZmlsZS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fU1RESU8KKworc3RhdGljIGludCBieV9maWxlX2N0cmwoWDUwOV9MT09LVVAgKmN0eCwgaW50IGNtZCwgY29uc3QgY2hhciAqYXJnYywKKwlsb25nIGFyZ2wsIGNoYXIgKipyZXQpOworWDUwOV9MT09LVVBfTUVUSE9EIHg1MDlfZmlsZV9sb29rdXA9CisJeworCSJMb2FkIGZpbGUgaW50byBjYWNoZSIsCisJTlVMTCwJCS8qIG5ldyAqLworCU5VTEwsCQkvKiBmcmVlICovCisJTlVMTCwgCQkvKiBpbml0ICovCisJTlVMTCwJCS8qIHNodXRkb3duICovCisJYnlfZmlsZV9jdHJsLAkvKiBjdHJsICovCisJTlVMTCwJCS8qIGdldF9ieV9zdWJqZWN0ICovCisJTlVMTCwJCS8qIGdldF9ieV9pc3N1ZXJfc2VyaWFsICovCisJTlVMTCwJCS8qIGdldF9ieV9maW5nZXJwcmludCAqLworCU5VTEwsCQkvKiBnZXRfYnlfYWxpYXMgKi8KKwl9OworCitYNTA5X0xPT0tVUF9NRVRIT0QgKlg1MDlfTE9PS1VQX2ZpbGUodm9pZCkKKwl7CisJcmV0dXJuKCZ4NTA5X2ZpbGVfbG9va3VwKTsKKwl9CisKK3N0YXRpYyBpbnQgYnlfZmlsZV9jdHJsKFg1MDlfTE9PS1VQICpjdHgsIGludCBjbWQsIGNvbnN0IGNoYXIgKmFyZ3AsIGxvbmcgYXJnbCwKKwkgICAgIGNoYXIgKipyZXQpCisJeworCWludCBvaz0wOworCWNoYXIgKmZpbGU7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgWDUwOV9MX0ZJTEVfTE9BRDoKKwkJaWYgKGFyZ2wgPT0gWDUwOV9GSUxFVFlQRV9ERUZBVUxUKQorCQkJeworCQkJZmlsZSA9IChjaGFyICopZ2V0ZW52KFg1MDlfZ2V0X2RlZmF1bHRfY2VydF9maWxlX2VudigpKTsKKwkJCWlmIChmaWxlKQorCQkJCW9rID0gKFg1MDlfbG9hZF9jZXJ0X2NybF9maWxlKGN0eCxmaWxlLAorCQkJCQkgICAgICBYNTA5X0ZJTEVUWVBFX1BFTSkgIT0gMCk7CisKKwkJCWVsc2UKKwkJCQlvayA9IChYNTA5X2xvYWRfY2VydF9jcmxfZmlsZShjdHgsWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2ZpbGUoKSwKKwkJCQkJICAgICAgWDUwOV9GSUxFVFlQRV9QRU0pICE9IDApOworCisJCQlpZiAoIW9rKQorCQkJCXsKKwkJCQlYNTA5ZXJyKFg1MDlfRl9CWV9GSUxFX0NUUkwsWDUwOV9SX0xPQURJTkdfREVGQVVMVFMpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYoYXJnbCA9PSBYNTA5X0ZJTEVUWVBFX1BFTSkKKwkJCQlvayA9IChYNTA5X2xvYWRfY2VydF9jcmxfZmlsZShjdHgsYXJncCwKKwkJCQkJWDUwOV9GSUxFVFlQRV9QRU0pICE9IDApOworCQkJZWxzZQorCQkJCW9rID0gKFg1MDlfbG9hZF9jZXJ0X2ZpbGUoY3R4LGFyZ3AsKGludClhcmdsKSAhPSAwKTsKKwkJCX0KKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ob2spOworCX0KKworaW50IFg1MDlfbG9hZF9jZXJ0X2ZpbGUoWDUwOV9MT09LVVAgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCisJeworCWludCByZXQ9MDsKKwlCSU8gKmluPU5VTEw7CisJaW50IGksY291bnQ9MDsKKwlYNTA5ICp4PU5VTEw7CisKKwlpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4oMSk7CisJaW49QklPX25ldyhCSU9fc19maWxlX2ludGVybmFsKCkpOworCisJaWYgKChpbiA9PSBOVUxMKSB8fCAoQklPX3JlYWRfZmlsZW5hbWUoaW4sZmlsZSkgPD0gMCkpCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9MT0FEX0NFUlRfRklMRSxFUlJfUl9TWVNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICh0eXBlID09IFg1MDlfRklMRVRZUEVfUEVNKQorCQl7CisJCWZvciAoOzspCisJCQl7CisJCQl4PVBFTV9yZWFkX2Jpb19YNTA5X0FVWChpbixOVUxMLE5VTEwsTlVMTCk7CisJCQlpZiAoeCA9PSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoKEVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2xhc3RfZXJyb3IoKSkgPT0KKwkJCQkJUEVNX1JfTk9fU1RBUlRfTElORSkgJiYgKGNvdW50ID4gMCkpCisJCQkJCXsKKwkJCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCVg1MDllcnIoWDUwOV9GX1g1MDlfTE9BRF9DRVJUX0ZJTEUsCisJCQkJCQlFUlJfUl9QRU1fTElCKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisJCQlpPVg1MDlfU1RPUkVfYWRkX2NlcnQoY3R4LT5zdG9yZV9jdHgseCk7CisJCQlpZiAoIWkpIGdvdG8gZXJyOworCQkJY291bnQrKzsKKwkJCVg1MDlfZnJlZSh4KTsKKwkJCXg9TlVMTDsKKwkJCX0KKwkJcmV0PWNvdW50OworCQl9CisJZWxzZSBpZiAodHlwZSA9PSBYNTA5X0ZJTEVUWVBFX0FTTjEpCisJCXsKKwkJeD1kMmlfWDUwOV9iaW8oaW4sTlVMTCk7CisJCWlmICh4ID09IE5VTEwpCisJCQl7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X0xPQURfQ0VSVF9GSUxFLEVSUl9SX0FTTjFfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpPVg1MDlfU1RPUkVfYWRkX2NlcnQoY3R4LT5zdG9yZV9jdHgseCk7CisJCWlmICghaSkgZ290byBlcnI7CisJCXJldD1pOworCQl9CisJZWxzZQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfTE9BRF9DRVJUX0ZJTEUsWDUwOV9SX0JBRF9YNTA5X0ZJTEVUWVBFKTsKKwkJZ290byBlcnI7CisJCX0KK2VycjoKKwlpZiAoeCAhPSBOVUxMKSBYNTA5X2ZyZWUoeCk7CisJaWYgKGluICE9IE5VTEwpIEJJT19mcmVlKGluKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBYNTA5X2xvYWRfY3JsX2ZpbGUoWDUwOV9MT09LVVAgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCisJeworCWludCByZXQ9MDsKKwlCSU8gKmluPU5VTEw7CisJaW50IGksY291bnQ9MDsKKwlYNTA5X0NSTCAqeD1OVUxMOworCisJaWYgKGZpbGUgPT0gTlVMTCkgcmV0dXJuKDEpOworCWluPUJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKTsKKworCWlmICgoaW4gPT0gTlVMTCkgfHwgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGZpbGUpIDw9IDApKQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfTE9BRF9DUkxfRklMRSxFUlJfUl9TWVNfTElCKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICh0eXBlID09IFg1MDlfRklMRVRZUEVfUEVNKQorCQl7CisJCWZvciAoOzspCisJCQl7CisJCQl4PVBFTV9yZWFkX2Jpb19YNTA5X0NSTChpbixOVUxMLE5VTEwsTlVMTCk7CisJCQlpZiAoeCA9PSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoKEVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2xhc3RfZXJyb3IoKSkgPT0KKwkJCQkJUEVNX1JfTk9fU1RBUlRfTElORSkgJiYgKGNvdW50ID4gMCkpCisJCQkJCXsKKwkJCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCVg1MDllcnIoWDUwOV9GX1g1MDlfTE9BRF9DUkxfRklMRSwKKwkJCQkJCUVSUl9SX1BFTV9MSUIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCWk9WDUwOV9TVE9SRV9hZGRfY3JsKGN0eC0+c3RvcmVfY3R4LHgpOworCQkJaWYgKCFpKSBnb3RvIGVycjsKKwkJCWNvdW50Kys7CisJCQlYNTA5X0NSTF9mcmVlKHgpOworCQkJeD1OVUxMOworCQkJfQorCQlyZXQ9Y291bnQ7CisJCX0KKwllbHNlIGlmICh0eXBlID09IFg1MDlfRklMRVRZUEVfQVNOMSkKKwkJeworCQl4PWQyaV9YNTA5X0NSTF9iaW8oaW4sTlVMTCk7CisJCWlmICh4ID09IE5VTEwpCisJCQl7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X0xPQURfQ1JMX0ZJTEUsRVJSX1JfQVNOMV9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWk9WDUwOV9TVE9SRV9hZGRfY3JsKGN0eC0+c3RvcmVfY3R4LHgpOworCQlpZiAoIWkpIGdvdG8gZXJyOworCQlyZXQ9aTsKKwkJfQorCWVsc2UKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X0xPQURfQ1JMX0ZJTEUsWDUwOV9SX0JBRF9YNTA5X0ZJTEVUWVBFKTsKKwkJZ290byBlcnI7CisJCX0KK2VycjoKKwlpZiAoeCAhPSBOVUxMKSBYNTA5X0NSTF9mcmVlKHgpOworCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgWDUwOV9sb2FkX2NlcnRfY3JsX2ZpbGUoWDUwOV9MT09LVVAgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCit7CisJU1RBQ0tfT0YoWDUwOV9JTkZPKSAqaW5mOworCVg1MDlfSU5GTyAqaXRtcDsKKwlCSU8gKmluOworCWludCBpLCBjb3VudCA9IDA7CisJaWYodHlwZSAhPSBYNTA5X0ZJTEVUWVBFX1BFTSkKKwkJcmV0dXJuIFg1MDlfbG9hZF9jZXJ0X2ZpbGUoY3R4LCBmaWxlLCB0eXBlKTsKKwlpbiA9IEJJT19uZXdfZmlsZShmaWxlLCAiciIpOworCWlmKCFpbikgeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X0xPQURfQ0VSVF9DUkxfRklMRSxFUlJfUl9TWVNfTElCKTsKKwkJcmV0dXJuIDA7CisJfQorCWluZiA9IFBFTV9YNTA5X0lORk9fcmVhZF9iaW8oaW4sIE5VTEwsIE5VTEwsIE5VTEwpOworCUJJT19mcmVlKGluKTsKKwlpZighaW5mKSB7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfTE9BRF9DRVJUX0NSTF9GSUxFLEVSUl9SX1BFTV9MSUIpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yKGkgPSAwOyBpIDwgc2tfWDUwOV9JTkZPX251bShpbmYpOyBpKyspIHsKKwkJaXRtcCA9IHNrX1g1MDlfSU5GT192YWx1ZShpbmYsIGkpOworCQlpZihpdG1wLT54NTA5KSB7CisJCQlYNTA5X1NUT1JFX2FkZF9jZXJ0KGN0eC0+c3RvcmVfY3R4LCBpdG1wLT54NTA5KTsKKwkJCWNvdW50Kys7CisJCX0KKwkJaWYoaXRtcC0+Y3JsKSB7CisJCQlYNTA5X1NUT1JFX2FkZF9jcmwoY3R4LT5zdG9yZV9jdHgsIGl0bXAtPmNybCk7CisJCQljb3VudCsrOworCQl9CisJfQorCXNrX1g1MDlfSU5GT19wb3BfZnJlZShpbmYsIFg1MDlfSU5GT19mcmVlKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworI2VuZGlmIC8qIE9QRU5TU0xfTk9fU1RESU8gKi8KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOS5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNGY0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5LmgKQEAgLTAsMCArMSwxMjg1IEBACisvKiBjcnlwdG8veDUwOS94NTA5LmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBFQ0RIIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisKKyNpZm5kZWYgSEVBREVSX1g1MDlfSAorI2RlZmluZSBIRUFERVJfWDUwOV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zeW1oYWNrcy5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0JVRkZFUgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FVlAKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NhZmVzdGFjay5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKyNpbmNsdWRlIDxvcGVuc3NsL2VjLmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0VDRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9lY2RzYS5oPgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisjaW5jbHVkZSA8b3BlbnNzbC9lY2RoLmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4zMgorLyogVW5kZXIgV2luMzIgdGhlc2UgYXJlIGRlZmluZWQgaW4gd2luY3J5cHQuaCAqLworI3VuZGVmIFg1MDlfTkFNRQorI3VuZGVmIFg1MDlfQ0VSVF9QQUlSCisjdW5kZWYgWDUwOV9FWFRFTlNJT05TCisjZW5kaWYKKworI2RlZmluZSBYNTA5X0ZJTEVUWVBFX1BFTQkxCisjZGVmaW5lIFg1MDlfRklMRVRZUEVfQVNOMQkyCisjZGVmaW5lIFg1MDlfRklMRVRZUEVfREVGQVVMVAkzCisKKyNkZWZpbmUgWDUwOXYzX0tVX0RJR0lUQUxfU0lHTkFUVVJFCTB4MDA4MAorI2RlZmluZSBYNTA5djNfS1VfTk9OX1JFUFVESUFUSU9OCTB4MDA0MAorI2RlZmluZSBYNTA5djNfS1VfS0VZX0VOQ0lQSEVSTUVOVAkweDAwMjAKKyNkZWZpbmUgWDUwOXYzX0tVX0RBVEFfRU5DSVBIRVJNRU5UCTB4MDAxMAorI2RlZmluZSBYNTA5djNfS1VfS0VZX0FHUkVFTUVOVAkJMHgwMDA4CisjZGVmaW5lIFg1MDl2M19LVV9LRVlfQ0VSVF9TSUdOCQkweDAwMDQKKyNkZWZpbmUgWDUwOXYzX0tVX0NSTF9TSUdOCQkweDAwMDIKKyNkZWZpbmUgWDUwOXYzX0tVX0VOQ0lQSEVSX09OTFkJCTB4MDAwMQorI2RlZmluZSBYNTA5djNfS1VfREVDSVBIRVJfT05MWQkJMHg4MDAwCisjZGVmaW5lIFg1MDl2M19LVV9VTkRFRgkJCTB4ZmZmZgorCit0eXBlZGVmIHN0cnVjdCBYNTA5X29iamVjdHNfc3QKKwl7CisJaW50IG5pZDsKKwlpbnQgKCphMmkpKHZvaWQpOworCWludCAoKmkyYSkodm9pZCk7CisJfSBYNTA5X09CSkVDVFM7CisKK3N0cnVjdCBYNTA5X2FsZ29yX3N0CisJeworCUFTTjFfT0JKRUNUICphbGdvcml0aG07CisJQVNOMV9UWVBFICpwYXJhbWV0ZXI7CisJfSAvKiBYNTA5X0FMR09SICovOworCitERUNMQVJFX0FTTjFfU0VUX09GKFg1MDlfQUxHT1IpCisKK3R5cGVkZWYgU1RBQ0tfT0YoWDUwOV9BTEdPUikgWDUwOV9BTEdPUlM7CisKK3R5cGVkZWYgc3RydWN0IFg1MDlfdmFsX3N0CisJeworCUFTTjFfVElNRSAqbm90QmVmb3JlOworCUFTTjFfVElNRSAqbm90QWZ0ZXI7CisJfSBYNTA5X1ZBTDsKKworc3RydWN0IFg1MDlfcHVia2V5X3N0CisJeworCVg1MDlfQUxHT1IgKmFsZ29yOworCUFTTjFfQklUX1NUUklORyAqcHVibGljX2tleTsKKwlFVlBfUEtFWSAqcGtleTsKKwl9OworCit0eXBlZGVmIHN0cnVjdCBYNTA5X3NpZ19zdAorCXsKKwlYNTA5X0FMR09SICphbGdvcjsKKwlBU04xX09DVEVUX1NUUklORyAqZGlnZXN0OworCX0gWDUwOV9TSUc7CisKK3R5cGVkZWYgc3RydWN0IFg1MDlfbmFtZV9lbnRyeV9zdAorCXsKKwlBU04xX09CSkVDVCAqb2JqZWN0OworCUFTTjFfU1RSSU5HICp2YWx1ZTsKKwlpbnQgc2V0OworCWludCBzaXplOyAJLyogdGVtcCB2YXJpYWJsZSAqLworCX0gWDUwOV9OQU1FX0VOVFJZOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoWDUwOV9OQU1FX0VOVFJZKQorCisvKiB3ZSBhbHdheXMga2VlcCBYNTA5X05BTUVzIGluIDIgZm9ybXMuICovCitzdHJ1Y3QgWDUwOV9uYW1lX3N0CisJeworCVNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKmVudHJpZXM7CisJaW50IG1vZGlmaWVkOwkvKiB0cnVlIGlmICdieXRlcycgbmVlZHMgdG8gYmUgYnVpbHQgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19CVUZGRVIKKwlCVUZfTUVNICpieXRlczsKKyNlbHNlCisJY2hhciAqYnl0ZXM7CisjZW5kaWYKKy8qCXVuc2lnbmVkIGxvbmcgaGFzaDsgS2VlcCB0aGUgaGFzaCBhcm91bmQgZm9yIGxvb2t1cHMgKi8KKwl1bnNpZ25lZCBjaGFyICpjYW5vbl9lbmM7CisJaW50IGNhbm9uX2VuY2xlbjsKKwl9IC8qIFg1MDlfTkFNRSAqLzsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X05BTUUpCisKKyNkZWZpbmUgWDUwOV9FWF9WX05FVFNDQVBFX0hBQ0sJCTB4ODAwMAorI2RlZmluZSBYNTA5X0VYX1ZfSU5JVAkJCTB4MDAwMQordHlwZWRlZiBzdHJ1Y3QgWDUwOV9leHRlbnNpb25fc3QKKwl7CisJQVNOMV9PQkpFQ1QgKm9iamVjdDsKKwlBU04xX0JPT0xFQU4gY3JpdGljYWw7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKnZhbHVlOworCX0gWDUwOV9FWFRFTlNJT047CisKK3R5cGVkZWYgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pIFg1MDlfRVhURU5TSU9OUzsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X0VYVEVOU0lPTikKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoWDUwOV9FWFRFTlNJT04pCisKKy8qIGEgc2VxdWVuY2Ugb2YgdGhlc2UgYXJlIHVzZWQgKi8KK3R5cGVkZWYgc3RydWN0IHg1MDlfYXR0cmlidXRlc19zdAorCXsKKwlBU04xX09CSkVDVCAqb2JqZWN0OworCWludCBzaW5nbGU7IC8qIDAgZm9yIGEgc2V0LCAxIGZvciBhIHNpbmdsZSBpdGVtICh3aGljaCBpcyB3cm9uZykgKi8KKwl1bmlvbgl7CisJCWNoYXIJCSpwdHI7CisvKiAwICovCQlTVEFDS19PRihBU04xX1RZUEUpICpzZXQ7CisvKiAxICovCQlBU04xX1RZUEUJKnNpbmdsZTsKKwkJfSB2YWx1ZTsKKwl9IFg1MDlfQVRUUklCVVRFOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKQorREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X0FUVFJJQlVURSkKKworCit0eXBlZGVmIHN0cnVjdCBYNTA5X3JlcV9pbmZvX3N0CisJeworCUFTTjFfRU5DT0RJTkcgZW5jOworCUFTTjFfSU5URUdFUiAqdmVyc2lvbjsKKwlYNTA5X05BTUUgKnN1YmplY3Q7CisJWDUwOV9QVUJLRVkgKnB1YmtleTsKKwkvKiAgZD0yIGhsPTIgbD0gIDAgY29uczogY29udDogMDAgKi8KKwlTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKmF0dHJpYnV0ZXM7IC8qIFsgMCBdICovCisJfSBYNTA5X1JFUV9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBYNTA5X3JlcV9zdAorCXsKKwlYNTA5X1JFUV9JTkZPICpyZXFfaW5mbzsKKwlYNTA5X0FMR09SICpzaWdfYWxnOworCUFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlOworCWludCByZWZlcmVuY2VzOworCX0gWDUwOV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHg1MDlfY2luZl9zdAorCXsKKwlBU04xX0lOVEVHRVIgKnZlcnNpb247CQkvKiBbIDAgXSBkZWZhdWx0IG9mIHYxICovCisJQVNOMV9JTlRFR0VSICpzZXJpYWxOdW1iZXI7CisJWDUwOV9BTEdPUiAqc2lnbmF0dXJlOworCVg1MDlfTkFNRSAqaXNzdWVyOworCVg1MDlfVkFMICp2YWxpZGl0eTsKKwlYNTA5X05BTUUgKnN1YmplY3Q7CisJWDUwOV9QVUJLRVkgKmtleTsKKwlBU04xX0JJVF9TVFJJTkcgKmlzc3VlclVJRDsJCS8qIFsgMSBdIG9wdGlvbmFsIGluIHYyICovCisJQVNOMV9CSVRfU1RSSU5HICpzdWJqZWN0VUlEOwkJLyogWyAyIF0gb3B0aW9uYWwgaW4gdjIgKi8KKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dGVuc2lvbnM7CS8qIFsgMyBdIG9wdGlvbmFsIGluIHYzICovCisJfSBYNTA5X0NJTkY7CisKKy8qIFRoaXMgc3R1ZmYgaXMgY2VydGlmaWNhdGUgImF1eGlsaWFyeSBpbmZvIgorICogaXQgY29udGFpbnMgZGV0YWlscyB3aGljaCBhcmUgdXNlZnVsIGluIGNlcnRpZmljYXRlCisgKiBzdG9yZXMgYW5kIGRhdGFiYXNlcy4gV2hlbiB1c2VkIHRoaXMgaXMgdGFnZ2VkIG9udG8KKyAqIHRoZSBlbmQgb2YgdGhlIGNlcnRpZmljYXRlIGl0c2VsZgorICovCisKK3R5cGVkZWYgc3RydWN0IHg1MDlfY2VydF9hdXhfc3QKKwl7CisJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICp0cnVzdDsJCS8qIHRydXN0ZWQgdXNlcyAqLworCVNUQUNLX09GKEFTTjFfT0JKRUNUKSAqcmVqZWN0OwkJLyogcmVqZWN0ZWQgdXNlcyAqLworCUFTTjFfVVRGOFNUUklORyAqYWxpYXM7CQkJLyogImZyaWVuZGx5IG5hbWUiICovCisJQVNOMV9PQ1RFVF9TVFJJTkcgKmtleWlkOwkJLyoga2V5IGlkIG9mIHByaXZhdGUga2V5ICovCisJU1RBQ0tfT0YoWDUwOV9BTEdPUikgKm90aGVyOwkJLyogb3RoZXIgdW5zcGVjaWZpZWQgaW5mbyAqLworCX0gWDUwOV9DRVJUX0FVWDsKKworc3RydWN0IHg1MDlfc3QKKwl7CisJWDUwOV9DSU5GICpjZXJ0X2luZm87CisJWDUwOV9BTEdPUiAqc2lnX2FsZzsKKwlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZTsKKwlpbnQgdmFsaWQ7CisJaW50IHJlZmVyZW5jZXM7CisJY2hhciAqbmFtZTsKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCS8qIFRoZXNlIGNvbnRhaW4gY29waWVzIG9mIHZhcmlvdXMgZXh0ZW5zaW9uIHZhbHVlcyAqLworCWxvbmcgZXhfcGF0aGxlbjsKKwlsb25nIGV4X3BjcGF0aGxlbjsKKwl1bnNpZ25lZCBsb25nIGV4X2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgZXhfa3VzYWdlOworCXVuc2lnbmVkIGxvbmcgZXhfeGt1c2FnZTsKKwl1bnNpZ25lZCBsb25nIGV4X25zY2VydDsKKwlBU04xX09DVEVUX1NUUklORyAqc2tpZDsKKwlBVVRIT1JJVFlfS0VZSUQgKmFraWQ7CisJWDUwOV9QT0xJQ1lfQ0FDSEUgKnBvbGljeV9jYWNoZTsKKwlTVEFDS19PRihESVNUX1BPSU5UKSAqY3JsZHA7CisJU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqYWx0bmFtZTsKKwlOQU1FX0NPTlNUUkFJTlRTICpuYzsKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CisJU1RBQ0tfT0YoSVBBZGRyZXNzRmFtaWx5KSAqcmZjMzc3OV9hZGRyOworCXN0cnVjdCBBU0lkZW50aWZpZXJzX3N0ICpyZmMzNzc5X2FzaWQ7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKwl1bnNpZ25lZCBjaGFyIHNoYTFfaGFzaFtTSEFfRElHRVNUX0xFTkdUSF07CisjZW5kaWYKKwlYNTA5X0NFUlRfQVVYICphdXg7CisJfSAvKiBYNTA5ICovOworCitERUNMQVJFX1NUQUNLX09GKFg1MDkpCitERUNMQVJFX0FTTjFfU0VUX09GKFg1MDkpCisKKy8qIFRoaXMgaXMgdXNlZCBmb3IgYSB0YWJsZSBvZiB0cnVzdCBjaGVja2luZyBmdW5jdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV90cnVzdF9zdCB7CisJaW50IHRydXN0OworCWludCBmbGFnczsKKwlpbnQgKCpjaGVja190cnVzdCkoc3RydWN0IHg1MDlfdHJ1c3Rfc3QgKiwgWDUwOSAqLCBpbnQpOworCWNoYXIgKm5hbWU7CisJaW50IGFyZzE7CisJdm9pZCAqYXJnMjsKK30gWDUwOV9UUlVTVDsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X1RSVVNUKQorCit0eXBlZGVmIHN0cnVjdCB4NTA5X2NlcnRfcGFpcl9zdCB7CisJWDUwOSAqZm9yd2FyZDsKKwlYNTA5ICpyZXZlcnNlOworfSBYNTA5X0NFUlRfUEFJUjsKKworLyogc3RhbmRhcmQgdHJ1c3QgaWRzICovCisKKyNkZWZpbmUgWDUwOV9UUlVTVF9ERUZBVUxUCS0xCS8qIE9ubHkgdmFsaWQgaW4gcHVycG9zZSBzZXR0aW5ncyAqLworCisjZGVmaW5lIFg1MDlfVFJVU1RfQ09NUEFUCTEKKyNkZWZpbmUgWDUwOV9UUlVTVF9TU0xfQ0xJRU5UCTIKKyNkZWZpbmUgWDUwOV9UUlVTVF9TU0xfU0VSVkVSCTMKKyNkZWZpbmUgWDUwOV9UUlVTVF9FTUFJTAk0CisjZGVmaW5lIFg1MDlfVFJVU1RfT0JKRUNUX1NJR04JNQorI2RlZmluZSBYNTA5X1RSVVNUX09DU1BfU0lHTgk2CisjZGVmaW5lIFg1MDlfVFJVU1RfT0NTUF9SRVFVRVNUCTcKKyNkZWZpbmUgWDUwOV9UUlVTVF9UU0EJCTgKKworLyogS2VlcCB0aGVzZSB1cCB0byBkYXRlISAqLworI2RlZmluZSBYNTA5X1RSVVNUX01JTgkJMQorI2RlZmluZSBYNTA5X1RSVVNUX01BWAkJOAorCisKKy8qIHRydXN0X2ZsYWdzIHZhbHVlcyAqLworI2RlZmluZQlYNTA5X1RSVVNUX0RZTkFNSUMgCTEKKyNkZWZpbmUJWDUwOV9UUlVTVF9EWU5BTUlDX05BTUUJMgorCisvKiBjaGVja190cnVzdCByZXR1cm4gY29kZXMgKi8KKworI2RlZmluZSBYNTA5X1RSVVNUX1RSVVNURUQJMQorI2RlZmluZSBYNTA5X1RSVVNUX1JFSkVDVEVECTIKKyNkZWZpbmUgWDUwOV9UUlVTVF9VTlRSVVNURUQJMworCisvKiBGbGFncyBmb3IgWDUwOV9wcmludF9leCgpICovCisKKyNkZWZpbmUJWDUwOV9GTEFHX0NPTVBBVAkJMAorI2RlZmluZQlYNTA5X0ZMQUdfTk9fSEVBREVSCQkxTAorI2RlZmluZQlYNTA5X0ZMQUdfTk9fVkVSU0lPTgkJKDFMIDw8IDEpCisjZGVmaW5lCVg1MDlfRkxBR19OT19TRVJJQUwJCSgxTCA8PCAyKQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fU0lHTkFNRQkJKDFMIDw8IDMpCisjZGVmaW5lCVg1MDlfRkxBR19OT19JU1NVRVIJCSgxTCA8PCA0KQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fVkFMSURJVFkJCSgxTCA8PCA1KQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fU1VCSkVDVAkJKDFMIDw8IDYpCisjZGVmaW5lCVg1MDlfRkxBR19OT19QVUJLRVkJCSgxTCA8PCA3KQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fRVhURU5TSU9OUwkJKDFMIDw8IDgpCisjZGVmaW5lCVg1MDlfRkxBR19OT19TSUdEVU1QCQkoMUwgPDwgOSkKKyNkZWZpbmUJWDUwOV9GTEFHX05PX0FVWAkJKDFMIDw8IDEwKQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fQVRUUklCVVRFUwkJKDFMIDw8IDExKQorCisvKiBGbGFncyBzcGVjaWZpYyB0byBYNTA5X05BTUVfcHJpbnRfZXgoKSAqLwkKKworLyogVGhlIGZpZWxkIHNlcGFyYXRvciBpbmZvcm1hdGlvbiAqLworCisjZGVmaW5lIFhOX0ZMQUdfU0VQX01BU0sJKDB4ZiA8PCAxNikKKworI2RlZmluZSBYTl9GTEFHX0NPTVBBVAkJMAkJLyogVHJhZGl0aW9uYWwgU1NMZWF5OiB1c2Ugb2xkIFg1MDlfTkFNRV9wcmludCAqLworI2RlZmluZSBYTl9GTEFHX1NFUF9DT01NQV9QTFVTCSgxIDw8IDE2KQkvKiBSRkMyMjUzICwrICovCisjZGVmaW5lIFhOX0ZMQUdfU0VQX0NQTFVTX1NQQwkoMiA8PCAxNikJLyogLCsgc3BhY2VkOiBtb3JlIHJlYWRhYmxlICovCisjZGVmaW5lIFhOX0ZMQUdfU0VQX1NQTFVTX1NQQwkoMyA8PCAxNikJLyogOysgc3BhY2VkICovCisjZGVmaW5lIFhOX0ZMQUdfU0VQX01VTFRJTElORQkoNCA8PCAxNikJLyogT25lIGxpbmUgcGVyIGZpZWxkICovCisKKyNkZWZpbmUgWE5fRkxBR19ETl9SRVYJCSgxIDw8IDIwKQkvKiBSZXZlcnNlIEROIG9yZGVyICovCisKKy8qIEhvdyB0aGUgZmllbGQgbmFtZSBpcyBzaG93biAqLworCisjZGVmaW5lIFhOX0ZMQUdfRk5fTUFTSwkJKDB4MyA8PCAyMSkKKworI2RlZmluZSBYTl9GTEFHX0ZOX1NOCQkwCQkvKiBPYmplY3Qgc2hvcnQgbmFtZSAqLworI2RlZmluZSBYTl9GTEFHX0ZOX0xOCQkoMSA8PCAyMSkJLyogT2JqZWN0IGxvbmcgbmFtZSAqLworI2RlZmluZSBYTl9GTEFHX0ZOX09JRAkJKDIgPDwgMjEpCS8qIEFsd2F5cyB1c2UgT0lEcyAqLworI2RlZmluZSBYTl9GTEFHX0ZOX05PTkUJCSgzIDw8IDIxKQkvKiBObyBmaWVsZCBuYW1lcyAqLworCisjZGVmaW5lIFhOX0ZMQUdfU1BDX0VRCQkoMSA8PCAyMykJLyogUHV0IHNwYWNlcyByb3VuZCAnPScgKi8KKworLyogVGhpcyBkZXRlcm1pbmVzIGlmIHdlIGR1bXAgZmllbGRzIHdlIGRvbid0IHJlY29nbmlzZToKKyAqIFJGQzIyNTMgcmVxdWlyZXMgdGhpcy4KKyAqLworCisjZGVmaW5lIFhOX0ZMQUdfRFVNUF9VTktOT1dOX0ZJRUxEUyAoMSA8PCAyNCkKKworI2RlZmluZSBYTl9GTEFHX0ZOX0FMSUdOCSgxIDw8IDI1KQkvKiBBbGlnbiBmaWVsZCBuYW1lcyB0byAyMCBjaGFyYWN0ZXJzICovCisKKy8qIENvbXBsZXRlIHNldCBvZiBSRkMyMjUzIGZsYWdzICovCisKKyNkZWZpbmUgWE5fRkxBR19SRkMyMjUzIChBU04xX1NUUkZMR1NfUkZDMjI1MyB8IFwKKwkJCVhOX0ZMQUdfU0VQX0NPTU1BX1BMVVMgfCBcCisJCQlYTl9GTEFHX0ROX1JFViB8IFwKKwkJCVhOX0ZMQUdfRk5fU04gfCBcCisJCQlYTl9GTEFHX0RVTVBfVU5LTk9XTl9GSUVMRFMpCisKKy8qIHJlYWRhYmxlIG9uZWxpbmUgZm9ybSAqLworCisjZGVmaW5lIFhOX0ZMQUdfT05FTElORSAoQVNOMV9TVFJGTEdTX1JGQzIyNTMgfCBcCisJCQlBU04xX1NUUkZMR1NfRVNDX1FVT1RFIHwgXAorCQkJWE5fRkxBR19TRVBfQ1BMVVNfU1BDIHwgXAorCQkJWE5fRkxBR19TUENfRVEgfCBcCisJCQlYTl9GTEFHX0ZOX1NOKQorCisvKiByZWFkYWJsZSBtdWx0aWxpbmUgZm9ybSAqLworCisjZGVmaW5lIFhOX0ZMQUdfTVVMVElMSU5FIChBU04xX1NUUkZMR1NfRVNDX0NUUkwgfCBcCisJCQlBU04xX1NUUkZMR1NfRVNDX01TQiB8IFwKKwkJCVhOX0ZMQUdfU0VQX01VTFRJTElORSB8IFwKKwkJCVhOX0ZMQUdfU1BDX0VRIHwgXAorCQkJWE5fRkxBR19GTl9MTiB8IFwKKwkJCVhOX0ZMQUdfRk5fQUxJR04pCisKK3N0cnVjdCB4NTA5X3Jldm9rZWRfc3QKKwl7CisJQVNOMV9JTlRFR0VSICpzZXJpYWxOdW1iZXI7CisJQVNOMV9USU1FICpyZXZvY2F0aW9uRGF0ZTsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgLyogb3B0aW9uYWwgKi8gKmV4dGVuc2lvbnM7CisJLyogU2V0IHVwIGlmIGluZGlyZWN0IENSTCAqLworCVNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKmlzc3VlcjsKKwkvKiBSZXZvY2F0aW9uIHJlYXNvbiAqLworCWludCByZWFzb247CisJaW50IHNlcXVlbmNlOyAvKiBsb2FkIHNlcXVlbmNlICovCisJfTsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X1JFVk9LRUQpCitERUNMQVJFX0FTTjFfU0VUX09GKFg1MDlfUkVWT0tFRCkKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9jcmxfaW5mb19zdAorCXsKKwlBU04xX0lOVEVHRVIgKnZlcnNpb247CisJWDUwOV9BTEdPUiAqc2lnX2FsZzsKKwlYNTA5X05BTUUgKmlzc3VlcjsKKwlBU04xX1RJTUUgKmxhc3RVcGRhdGU7CisJQVNOMV9USU1FICpuZXh0VXBkYXRlOworCVNUQUNLX09GKFg1MDlfUkVWT0tFRCkgKnJldm9rZWQ7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pIC8qIFswXSAqLyAqZXh0ZW5zaW9uczsKKwlBU04xX0VOQ09ESU5HIGVuYzsKKwl9IFg1MDlfQ1JMX0lORk87CisKK3N0cnVjdCBYNTA5X2NybF9zdAorCXsKKwkvKiBhY3R1YWwgc2lnbmF0dXJlICovCisJWDUwOV9DUkxfSU5GTyAqY3JsOworCVg1MDlfQUxHT1IgKnNpZ19hbGc7CisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmU7CisJaW50IHJlZmVyZW5jZXM7CisJaW50IGZsYWdzOworCS8qIENvcGllcyBvZiB2YXJpb3VzIGV4dGVuc2lvbnMgKi8KKwlBVVRIT1JJVFlfS0VZSUQgKmFraWQ7CisJSVNTVUlOR19ESVNUX1BPSU5UICppZHA7CisJLyogQ29udmVuaWVudCBicmVha2Rvd24gb2YgSURQICovCisJaW50IGlkcF9mbGFnczsKKwlpbnQgaWRwX3JlYXNvbnM7CisJLyogQ1JMIGFuZCBiYXNlIENSTCBudW1iZXJzIGZvciBkZWx0YSBwcm9jZXNzaW5nICovCisJQVNOMV9JTlRFR0VSICpjcmxfbnVtYmVyOworCUFTTjFfSU5URUdFUiAqYmFzZV9jcmxfbnVtYmVyOworI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorCXVuc2lnbmVkIGNoYXIgc2hhMV9oYXNoW1NIQV9ESUdFU1RfTEVOR1RIXTsKKyNlbmRpZgorCVNUQUNLX09GKEdFTkVSQUxfTkFNRVMpICppc3N1ZXJzOworCWNvbnN0IFg1MDlfQ1JMX01FVEhPRCAqbWV0aDsKKwl2b2lkICptZXRoX2RhdGE7CisJfSAvKiBYNTA5X0NSTCAqLzsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X0NSTCkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoWDUwOV9DUkwpCisKK3R5cGVkZWYgc3RydWN0IHByaXZhdGVfa2V5X3N0CisJeworCWludCB2ZXJzaW9uOworCS8qIFRoZSBQS0NTIzggZGF0YSB0eXBlcyAqLworCVg1MDlfQUxHT1IgKmVuY19hbGdvcjsKKwlBU04xX09DVEVUX1NUUklORyAqZW5jX3BrZXk7CS8qIGVuY3J5cHRlZCBwdWIga2V5ICovCisKKwkvKiBXaGVuIGRlY3J5cHRlZCwgdGhlIGZvbGxvd2luZyB3aWxsIG5vdCBiZSBOVUxMICovCisJRVZQX1BLRVkgKmRlY19wa2V5OworCisJLyogdXNlZCB0byBlbmNyeXB0IGFuZCBkZWNyeXB0ICovCisJaW50IGtleV9sZW5ndGg7CisJY2hhciAqa2V5X2RhdGE7CisJaW50IGtleV9mcmVlOwkvKiB0cnVlIGlmIHdlIHNob3VsZCBhdXRvIGZyZWUga2V5X2RhdGEgKi8KKworCS8qIGV4cGFuZGVkIHZlcnNpb24gb2YgJ2VuY19hbGdvcicgKi8KKwlFVlBfQ0lQSEVSX0lORk8gY2lwaGVyOworCisJaW50IHJlZmVyZW5jZXM7CisJfSBYNTA5X1BLRVk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FVlAKK3R5cGVkZWYgc3RydWN0IFg1MDlfaW5mb19zdAorCXsKKwlYNTA5ICp4NTA5OworCVg1MDlfQ1JMICpjcmw7CisJWDUwOV9QS0VZICp4X3BrZXk7CisKKwlFVlBfQ0lQSEVSX0lORk8gZW5jX2NpcGhlcjsKKwlpbnQgZW5jX2xlbjsKKwljaGFyICplbmNfZGF0YTsKKworCWludCByZWZlcmVuY2VzOworCX0gWDUwOV9JTkZPOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfSU5GTykKKyNlbmRpZgorCisvKiBUaGUgbmV4dCAyIHN0cnVjdHVyZXMgYW5kIHRoZWlyIDggcm91dGluZXMgd2VyZSBzZW50IHRvIG1lIGJ5CisgKiBQYXQgUmljaGFyZCA8cGF0ckB4NTA5LmNvbT4gYW5kIGFyZSB1c2VkIHRvIG1hbmlwdWxhdGUKKyAqIE5ldHNjYXBlcyBzcGtpIHN0cnVjdHVyZXMgLSB1c2VmdWwgaWYgeW91IGFyZSB3cml0aW5nIGEgQ0Egd2ViIHBhZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgTmV0c2NhcGVfc3BrYWNfc3QKKwl7CisJWDUwOV9QVUJLRVkgKnB1YmtleTsKKwlBU04xX0lBNVNUUklORyAqY2hhbGxlbmdlOwkvKiBjaGFsbGVuZ2Ugc2VudCBpbiBhdGxhcyA+PSBQUjIgKi8KKwl9IE5FVFNDQVBFX1NQS0FDOworCit0eXBlZGVmIHN0cnVjdCBOZXRzY2FwZV9zcGtpX3N0CisJeworCU5FVFNDQVBFX1NQS0FDICpzcGthYzsJLyogc2lnbmVkIHB1YmxpYyBrZXkgYW5kIGNoYWxsZW5nZSAqLworCVg1MDlfQUxHT1IgKnNpZ19hbGdvcjsKKwlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZTsKKwl9IE5FVFNDQVBFX1NQS0k7CisKKy8qIE5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UKKwl7CisJQVNOMV9PQkpFQ1QgKnR5cGU7CisJU1RBQ0tfT0YoWDUwOSkgKmNlcnRzOworCX0gTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRTsKKworLyogVW51c2VkIChhbmQgaXYgbGVuZ3RoIGlzIHdyb25nKQordHlwZWRlZiBzdHJ1Y3QgQ0JDUGFyYW1ldGVyX3N0CisJeworCXVuc2lnbmVkIGNoYXIgaXZbOF07CisJfSBDQkNfUEFSQU07CisqLworCisvKiBQYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIHN0cnVjdHVyZSAqLworCit0eXBlZGVmIHN0cnVjdCBQQkVQQVJBTV9zdCB7CitBU04xX09DVEVUX1NUUklORyAqc2FsdDsKK0FTTjFfSU5URUdFUiAqaXRlcjsKK30gUEJFUEFSQU07CisKKy8qIFBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gVjIgc3RydWN0dXJlcyAqLworCit0eXBlZGVmIHN0cnVjdCBQQkUyUEFSQU1fc3QgeworWDUwOV9BTEdPUiAqa2V5ZnVuYzsKK1g1MDlfQUxHT1IgKmVuY3J5cHRpb247Cit9IFBCRTJQQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgUEJLREYyUEFSQU1fc3QgeworQVNOMV9UWVBFICpzYWx0OwkvKiBVc3VhbGx5IE9DVEVUIFNUUklORyBidXQgY291bGQgYmUgYW55dGhpbmcgKi8KK0FTTjFfSU5URUdFUiAqaXRlcjsKK0FTTjFfSU5URUdFUiAqa2V5bGVuZ3RoOworWDUwOV9BTEdPUiAqcHJmOworfSBQQktERjJQQVJBTTsKKworCisvKiBQS0NTIzggcHJpdmF0ZSBrZXkgaW5mbyBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IHBrY3M4X3ByaXZfa2V5X2luZm9fc3QKKyAgICAgICAgeworICAgICAgICBpbnQgYnJva2VuOyAgICAgLyogRmxhZyBmb3IgdmFyaW91cyBicm9rZW4gZm9ybWF0cyAqLworI2RlZmluZSBQS0NTOF9PSwkJMAorI2RlZmluZSBQS0NTOF9OT19PQ1RFVAkJMQorI2RlZmluZSBQS0NTOF9FTUJFRERFRF9QQVJBTQkyCisjZGVmaW5lIFBLQ1M4X05TX0RCCQkzCisjZGVmaW5lIFBLQ1M4X05FR19QUklWS0VZCTQKKyAgICAgICAgQVNOMV9JTlRFR0VSICp2ZXJzaW9uOworICAgICAgICBYNTA5X0FMR09SICpwa2V5YWxnOworICAgICAgICBBU04xX1RZUEUgKnBrZXk7IC8qIFNob3VsZCBiZSBPQ1RFVCBTVFJJTkcgYnV0IHNvbWUgYXJlIGJyb2tlbiAqLworICAgICAgICBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKmF0dHJpYnV0ZXM7CisgICAgICAgIH07CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5X3ZmeS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcGtjczcuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBYNTA5X0VYVF9QQUNLX1VOS05PV04JMQorI2RlZmluZSBYNTA5X0VYVF9QQUNLX1NUUklORwkyCisKKyNkZWZpbmUJCVg1MDlfZ2V0X3ZlcnNpb24oeCkgQVNOMV9JTlRFR0VSX2dldCgoeCktPmNlcnRfaW5mby0+dmVyc2lvbikKKy8qICNkZWZpbmUJWDUwOV9nZXRfc2VyaWFsTnVtYmVyKHgpICgoeCktPmNlcnRfaW5mby0+c2VyaWFsTnVtYmVyKSAqLworI2RlZmluZQkJWDUwOV9nZXRfbm90QmVmb3JlKHgpICgoeCktPmNlcnRfaW5mby0+dmFsaWRpdHktPm5vdEJlZm9yZSkKKyNkZWZpbmUJCVg1MDlfZ2V0X25vdEFmdGVyKHgpICgoeCktPmNlcnRfaW5mby0+dmFsaWRpdHktPm5vdEFmdGVyKQorI2RlZmluZQkJWDUwOV9leHRyYWN0X2tleSh4KQlYNTA5X2dldF9wdWJrZXkoeCkgLyoqKioqLworI2RlZmluZQkJWDUwOV9SRVFfZ2V0X3ZlcnNpb24oeCkgQVNOMV9JTlRFR0VSX2dldCgoeCktPnJlcV9pbmZvLT52ZXJzaW9uKQorI2RlZmluZQkJWDUwOV9SRVFfZ2V0X3N1YmplY3RfbmFtZSh4KSAoKHgpLT5yZXFfaW5mby0+c3ViamVjdCkKKyNkZWZpbmUJCVg1MDlfUkVRX2V4dHJhY3Rfa2V5KGEpCVg1MDlfUkVRX2dldF9wdWJrZXkoYSkKKyNkZWZpbmUJCVg1MDlfbmFtZV9jbXAoYSxiKQlYNTA5X05BTUVfY21wKChhKSwoYikpCisjZGVmaW5lCQlYNTA5X2dldF9zaWduYXR1cmVfdHlwZSh4KSBFVlBfUEtFWV90eXBlKE9CSl9vYmoybmlkKCh4KS0+c2lnX2FsZy0+YWxnb3JpdGhtKSkKKworI2RlZmluZQkJWDUwOV9DUkxfZ2V0X3ZlcnNpb24oeCkgQVNOMV9JTlRFR0VSX2dldCgoeCktPmNybC0+dmVyc2lvbikKKyNkZWZpbmUgCVg1MDlfQ1JMX2dldF9sYXN0VXBkYXRlKHgpICgoeCktPmNybC0+bGFzdFVwZGF0ZSkKKyNkZWZpbmUgCVg1MDlfQ1JMX2dldF9uZXh0VXBkYXRlKHgpICgoeCktPmNybC0+bmV4dFVwZGF0ZSkKKyNkZWZpbmUJCVg1MDlfQ1JMX2dldF9pc3N1ZXIoeCkgKCh4KS0+Y3JsLT5pc3N1ZXIpCisjZGVmaW5lCQlYNTA5X0NSTF9nZXRfUkVWT0tFRCh4KSAoKHgpLT5jcmwtPnJldm9rZWQpCisKK3ZvaWQgWDUwOV9DUkxfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IFg1MDlfQ1JMX01FVEhPRCAqbWV0aCk7CitYNTA5X0NSTF9NRVRIT0QgKlg1MDlfQ1JMX01FVEhPRF9uZXcoCisJaW50ICgqY3JsX2luaXQpKFg1MDlfQ1JMICpjcmwpLAorCWludCAoKmNybF9mcmVlKShYNTA5X0NSTCAqY3JsKSwKKwlpbnQgKCpjcmxfbG9va3VwKShYNTA5X0NSTCAqY3JsLCBYNTA5X1JFVk9LRUQgKipyZXQsCisJCQkJQVNOMV9JTlRFR0VSICpzZXIsIFg1MDlfTkFNRSAqaXNzdWVyKSwKKwlpbnQgKCpjcmxfdmVyaWZ5KShYNTA5X0NSTCAqY3JsLCBFVlBfUEtFWSAqcGspKTsKK3ZvaWQgWDUwOV9DUkxfTUVUSE9EX2ZyZWUoWDUwOV9DUkxfTUVUSE9EICptKTsKKwordm9pZCBYNTA5X0NSTF9zZXRfbWV0aF9kYXRhKFg1MDlfQ1JMICpjcmwsIHZvaWQgKmRhdCk7Cit2b2lkICpYNTA5X0NSTF9nZXRfbWV0aF9kYXRhKFg1MDlfQ1JMICpjcmwpOworCisvKiBUaGlzIG9uZSBpcyBvbmx5IHVzZWQgc28gdGhhdCBhIGJpbmFyeSBmb3JtIGNhbiBvdXRwdXQsIGFzIGluCisgKiBpMmRfWDUwOV9OQU1FKFg1MDlfZ2V0X1g1MDlfUFVCS0VZKHgpLCZidWYpICovCisjZGVmaW5lIAlYNTA5X2dldF9YNTA5X1BVQktFWSh4KSAoKHgpLT5jZXJ0X2luZm8tPmtleSkKKworCitjb25zdCBjaGFyICpYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyhsb25nIG4pOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRVZQCitpbnQgWDUwOV92ZXJpZnkoWDUwOSAqYSwgRVZQX1BLRVkgKnIpOworCitpbnQgWDUwOV9SRVFfdmVyaWZ5KFg1MDlfUkVRICphLCBFVlBfUEtFWSAqcik7CitpbnQgWDUwOV9DUkxfdmVyaWZ5KFg1MDlfQ1JMICphLCBFVlBfUEtFWSAqcik7CitpbnQgTkVUU0NBUEVfU1BLSV92ZXJpZnkoTkVUU0NBUEVfU1BLSSAqYSwgRVZQX1BLRVkgKnIpOworCitORVRTQ0FQRV9TUEtJICogTkVUU0NBUEVfU1BLSV9iNjRfZGVjb2RlKGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbik7CitjaGFyICogTkVUU0NBUEVfU1BLSV9iNjRfZW5jb2RlKE5FVFNDQVBFX1NQS0kgKngpOworRVZQX1BLRVkgKk5FVFNDQVBFX1NQS0lfZ2V0X3B1YmtleShORVRTQ0FQRV9TUEtJICp4KTsKK2ludCBORVRTQ0FQRV9TUEtJX3NldF9wdWJrZXkoTkVUU0NBUEVfU1BLSSAqeCwgRVZQX1BLRVkgKnBrZXkpOworCitpbnQgTkVUU0NBUEVfU1BLSV9wcmludChCSU8gKm91dCwgTkVUU0NBUEVfU1BLSSAqc3BraSk7CisKK2ludCBYNTA5X3NpZ25hdHVyZV9wcmludChCSU8gKmJwLFg1MDlfQUxHT1IgKmFsZywgQVNOMV9TVFJJTkcgKnNpZyk7CisKK2ludCBYNTA5X3NpZ24oWDUwOSAqeCwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQpOworaW50IFg1MDlfUkVRX3NpZ24oWDUwOV9SRVEgKngsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kKTsKK2ludCBYNTA5X0NSTF9zaWduKFg1MDlfQ1JMICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCk7CitpbnQgTkVUU0NBUEVfU1BLSV9zaWduKE5FVFNDQVBFX1NQS0kgKngsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kKTsKKworaW50IFg1MDlfcHVia2V5X2RpZ2VzdChjb25zdCBYNTA5ICpkYXRhLGNvbnN0IEVWUF9NRCAqdHlwZSwKKwkJdW5zaWduZWQgY2hhciAqbWQsIHVuc2lnbmVkIGludCAqbGVuKTsKK2ludCBYNTA5X2RpZ2VzdChjb25zdCBYNTA5ICpkYXRhLGNvbnN0IEVWUF9NRCAqdHlwZSwKKwkJdW5zaWduZWQgY2hhciAqbWQsIHVuc2lnbmVkIGludCAqbGVuKTsKK2ludCBYNTA5X0NSTF9kaWdlc3QoY29uc3QgWDUwOV9DUkwgKmRhdGEsY29uc3QgRVZQX01EICp0eXBlLAorCQl1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pOworaW50IFg1MDlfUkVRX2RpZ2VzdChjb25zdCBYNTA5X1JFUSAqZGF0YSxjb25zdCBFVlBfTUQgKnR5cGUsCisJCXVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKmxlbik7CitpbnQgWDUwOV9OQU1FX2RpZ2VzdChjb25zdCBYNTA5X05BTUUgKmRhdGEsY29uc3QgRVZQX01EICp0eXBlLAorCQl1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK1g1MDkgKmQyaV9YNTA5X2ZwKEZJTEUgKmZwLCBYNTA5ICoqeDUwOSk7CitpbnQgaTJkX1g1MDlfZnAoRklMRSAqZnAsWDUwOSAqeDUwOSk7CitYNTA5X0NSTCAqZDJpX1g1MDlfQ1JMX2ZwKEZJTEUgKmZwLFg1MDlfQ1JMICoqY3JsKTsKK2ludCBpMmRfWDUwOV9DUkxfZnAoRklMRSAqZnAsWDUwOV9DUkwgKmNybCk7CitYNTA5X1JFUSAqZDJpX1g1MDlfUkVRX2ZwKEZJTEUgKmZwLFg1MDlfUkVRICoqcmVxKTsKK2ludCBpMmRfWDUwOV9SRVFfZnAoRklMRSAqZnAsWDUwOV9SRVEgKnJlcSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitSU0EgKmQyaV9SU0FQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLFJTQSAqKnJzYSk7CitpbnQgaTJkX1JTQVByaXZhdGVLZXlfZnAoRklMRSAqZnAsUlNBICpyc2EpOworUlNBICpkMmlfUlNBUHVibGljS2V5X2ZwKEZJTEUgKmZwLFJTQSAqKnJzYSk7CitpbnQgaTJkX1JTQVB1YmxpY0tleV9mcChGSUxFICpmcCxSU0EgKnJzYSk7CitSU0EgKmQyaV9SU0FfUFVCS0VZX2ZwKEZJTEUgKmZwLFJTQSAqKnJzYSk7CitpbnQgaTJkX1JTQV9QVUJLRVlfZnAoRklMRSAqZnAsUlNBICpyc2EpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCitEU0EgKmQyaV9EU0FfUFVCS0VZX2ZwKEZJTEUgKmZwLCBEU0EgKipkc2EpOworaW50IGkyZF9EU0FfUFVCS0VZX2ZwKEZJTEUgKmZwLCBEU0EgKmRzYSk7CitEU0EgKmQyaV9EU0FQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBEU0EgKipkc2EpOworaW50IGkyZF9EU0FQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBEU0EgKmRzYSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworRUNfS0VZICpkMmlfRUNfUFVCS0VZX2ZwKEZJTEUgKmZwLCBFQ19LRVkgKiplY2tleSk7CitpbnQgICBpMmRfRUNfUFVCS0VZX2ZwKEZJTEUgKmZwLCBFQ19LRVkgKmVja2V5KTsKK0VDX0tFWSAqZDJpX0VDUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRUNfS0VZICoqZWNrZXkpOworaW50ICAgaTJkX0VDUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRUNfS0VZICplY2tleSk7CisjZW5kaWYKK1g1MDlfU0lHICpkMmlfUEtDUzhfZnAoRklMRSAqZnAsWDUwOV9TSUcgKipwOCk7CitpbnQgaTJkX1BLQ1M4X2ZwKEZJTEUgKmZwLFg1MDlfU0lHICpwOCk7CitQS0NTOF9QUklWX0tFWV9JTkZPICpkMmlfUEtDUzhfUFJJVl9LRVlfSU5GT19mcChGSUxFICpmcCwKKwkJCQkJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKipwOGluZik7CitpbnQgaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk9fZnAoRklMRSAqZnAsUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpOworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlJbmZvX2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqa2V5KTsKK2ludCBpMmRfUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKnBrZXkpOworRVZQX1BLRVkgKmQyaV9Qcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqKmEpOworaW50IGkyZF9QVUJLRVlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICpwa2V5KTsKK0VWUF9QS0VZICpkMmlfUFVCS0VZX2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqKmEpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK1g1MDkgKmQyaV9YNTA5X2JpbyhCSU8gKmJwLFg1MDkgKip4NTA5KTsKK2ludCBpMmRfWDUwOV9iaW8oQklPICpicCxYNTA5ICp4NTA5KTsKK1g1MDlfQ1JMICpkMmlfWDUwOV9DUkxfYmlvKEJJTyAqYnAsWDUwOV9DUkwgKipjcmwpOworaW50IGkyZF9YNTA5X0NSTF9iaW8oQklPICpicCxYNTA5X0NSTCAqY3JsKTsKK1g1MDlfUkVRICpkMmlfWDUwOV9SRVFfYmlvKEJJTyAqYnAsWDUwOV9SRVEgKipyZXEpOworaW50IGkyZF9YNTA5X1JFUV9iaW8oQklPICpicCxYNTA5X1JFUSAqcmVxKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK1JTQSAqZDJpX1JTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsUlNBICoqcnNhKTsKK2ludCBpMmRfUlNBUHJpdmF0ZUtleV9iaW8oQklPICpicCxSU0EgKnJzYSk7CitSU0EgKmQyaV9SU0FQdWJsaWNLZXlfYmlvKEJJTyAqYnAsUlNBICoqcnNhKTsKK2ludCBpMmRfUlNBUHVibGljS2V5X2JpbyhCSU8gKmJwLFJTQSAqcnNhKTsKK1JTQSAqZDJpX1JTQV9QVUJLRVlfYmlvKEJJTyAqYnAsUlNBICoqcnNhKTsKK2ludCBpMmRfUlNBX1BVQktFWV9iaW8oQklPICpicCxSU0EgKnJzYSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKK0RTQSAqZDJpX0RTQV9QVUJLRVlfYmlvKEJJTyAqYnAsIERTQSAqKmRzYSk7CitpbnQgaTJkX0RTQV9QVUJLRVlfYmlvKEJJTyAqYnAsIERTQSAqZHNhKTsKK0RTQSAqZDJpX0RTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIERTQSAqKmRzYSk7CitpbnQgaTJkX0RTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIERTQSAqZHNhKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCitFQ19LRVkgKmQyaV9FQ19QVUJLRVlfYmlvKEJJTyAqYnAsIEVDX0tFWSAqKmVja2V5KTsKK2ludCAgIGkyZF9FQ19QVUJLRVlfYmlvKEJJTyAqYnAsIEVDX0tFWSAqZWNrZXkpOworRUNfS0VZICpkMmlfRUNQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFQ19LRVkgKiplY2tleSk7CitpbnQgICBpMmRfRUNQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFQ19LRVkgKmVja2V5KTsKKyNlbmRpZgorWDUwOV9TSUcgKmQyaV9QS0NTOF9iaW8oQklPICpicCxYNTA5X1NJRyAqKnA4KTsKK2ludCBpMmRfUEtDUzhfYmlvKEJJTyAqYnAsWDUwOV9TSUcgKnA4KTsKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKmQyaV9QS0NTOF9QUklWX0tFWV9JTkZPX2JpbyhCSU8gKmJwLAorCQkJCQkJUEtDUzhfUFJJVl9LRVlfSU5GTyAqKnA4aW5mKTsKK2ludCBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GT19iaW8oQklPICpicCxQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZik7CitpbnQgaTJkX1BLQ1M4UHJpdmF0ZUtleUluZm9fYmlvKEJJTyAqYnAsIEVWUF9QS0VZICprZXkpOworaW50IGkyZF9Qcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWSAqZDJpX1ByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICoqYSk7CitpbnQgaTJkX1BVQktFWV9iaW8oQklPICpicCwgRVZQX1BLRVkgKnBrZXkpOworRVZQX1BLRVkgKmQyaV9QVUJLRVlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICoqYSk7CisjZW5kaWYKKworWDUwOSAqWDUwOV9kdXAoWDUwOSAqeDUwOSk7CitYNTA5X0FUVFJJQlVURSAqWDUwOV9BVFRSSUJVVEVfZHVwKFg1MDlfQVRUUklCVVRFICp4YSk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9FWFRFTlNJT05fZHVwKFg1MDlfRVhURU5TSU9OICpleCk7CitYNTA5X0NSTCAqWDUwOV9DUkxfZHVwKFg1MDlfQ1JMICpjcmwpOworWDUwOV9SRVEgKlg1MDlfUkVRX2R1cChYNTA5X1JFUSAqcmVxKTsKK1g1MDlfQUxHT1IgKlg1MDlfQUxHT1JfZHVwKFg1MDlfQUxHT1IgKnhuKTsKK2ludCBYNTA5X0FMR09SX3NldDAoWDUwOV9BTEdPUiAqYWxnLCBBU04xX09CSkVDVCAqYW9iaiwgaW50IHB0eXBlLCB2b2lkICpwdmFsKTsKK3ZvaWQgWDUwOV9BTEdPUl9nZXQwKEFTTjFfT0JKRUNUICoqcGFvYmosIGludCAqcHB0eXBlLCB2b2lkICoqcHB2YWwsCisJCQkJCQlYNTA5X0FMR09SICphbGdvcik7CisKK1g1MDlfTkFNRSAqWDUwOV9OQU1FX2R1cChYNTA5X05BTUUgKnhuKTsKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX0VOVFJZX2R1cChYNTA5X05BTUVfRU5UUlkgKm5lKTsKKworaW50CQlYNTA5X2NtcF90aW1lKGNvbnN0IEFTTjFfVElNRSAqcywgdGltZV90ICp0KTsKK2ludAkJWDUwOV9jbXBfY3VycmVudF90aW1lKGNvbnN0IEFTTjFfVElNRSAqcyk7CitBU04xX1RJTUUgKglYNTA5X3RpbWVfYWRqKEFTTjFfVElNRSAqcywgbG9uZyBhZGosIHRpbWVfdCAqdCk7CitBU04xX1RJTUUgKglYNTA5X3RpbWVfYWRqX2V4KEFTTjFfVElNRSAqcywKKwkJCQlpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjLCB0aW1lX3QgKnQpOworQVNOMV9USU1FICoJWDUwOV9nbXRpbWVfYWRqKEFTTjFfVElNRSAqcywgbG9uZyBhZGopOworCitjb25zdCBjaGFyICoJWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2FyZWEodm9pZCApOworY29uc3QgY2hhciAqCVg1MDlfZ2V0X2RlZmF1bHRfY2VydF9kaXIodm9pZCApOworY29uc3QgY2hhciAqCVg1MDlfZ2V0X2RlZmF1bHRfY2VydF9maWxlKHZvaWQgKTsKK2NvbnN0IGNoYXIgKglYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyX2Vudih2b2lkICk7Citjb25zdCBjaGFyICoJWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2ZpbGVfZW52KHZvaWQgKTsKK2NvbnN0IGNoYXIgKglYNTA5X2dldF9kZWZhdWx0X3ByaXZhdGVfZGlyKHZvaWQgKTsKKworWDUwOV9SRVEgKglYNTA5X3RvX1g1MDlfUkVRKFg1MDkgKngsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kKTsKK1g1MDkgKgkJWDUwOV9SRVFfdG9fWDUwOShYNTA5X1JFUSAqciwgaW50IGRheXMsRVZQX1BLRVkgKnBrZXkpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQUxHT1IpCitERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OUyhYNTA5X0FMR09SUywgWDUwOV9BTEdPUlMsIFg1MDlfQUxHT1JTKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X1ZBTCkKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X1BVQktFWSkKKworaW50CQlYNTA5X1BVQktFWV9zZXQoWDUwOV9QVUJLRVkgKip4LCBFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWSAqCVg1MDlfUFVCS0VZX2dldChYNTA5X1BVQktFWSAqa2V5KTsKK2ludAkJWDUwOV9nZXRfcHVia2V5X3BhcmFtZXRlcnMoRVZQX1BLRVkgKnBrZXksCisJCQkJCSAgIFNUQUNLX09GKFg1MDkpICpjaGFpbik7CitpbnQJCWkyZF9QVUJLRVkoRVZQX1BLRVkgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK0VWUF9QS0VZICoJZDJpX1BVQktFWShFVlBfUEtFWSAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJbG9uZyBsZW5ndGgpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQoraW50CQlpMmRfUlNBX1BVQktFWShSU0EgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK1JTQSAqCQlkMmlfUlNBX1BVQktFWShSU0EgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQoraW50CQlpMmRfRFNBX1BVQktFWShEU0EgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK0RTQSAqCQlkMmlfRFNBX1BVQktFWShEU0EgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDCitpbnQJCWkyZF9FQ19QVUJLRVkoRUNfS0VZICphLCB1bnNpZ25lZCBjaGFyICoqcHApOworRUNfS0VZIAkJKmQyaV9FQ19QVUJLRVkoRUNfS0VZICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJbG9uZyBsZW5ndGgpOworI2VuZGlmCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9TSUcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfUkVRX0lORk8pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfUkVRKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQVRUUklCVVRFKQorWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZShpbnQgbmlkLCBpbnQgYXRydHlwZSwgdm9pZCAqdmFsdWUpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfRVhURU5TSU9OKQorREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlMoWDUwOV9FWFRFTlNJT05TLCBYNTA5X0VYVEVOU0lPTlMsIFg1MDlfRVhURU5TSU9OUykKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X05BTUVfRU5UUlkpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9OQU1FKQorCitpbnQJCVg1MDlfTkFNRV9zZXQoWDUwOV9OQU1FICoqeG4sIFg1MDlfTkFNRSAqbmFtZSk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9DSU5GKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDkpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQ0VSVF9BVVgpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9DRVJUX1BBSVIpCisKK2ludCBYNTA5X2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludCBYNTA5X3NldF9leF9kYXRhKFg1MDkgKnIsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkICpYNTA5X2dldF9leF9kYXRhKFg1MDkgKnIsIGludCBpZHgpOworaW50CQlpMmRfWDUwOV9BVVgoWDUwOSAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworWDUwOSAqCQlkMmlfWDUwOV9BVVgoWDUwOSAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLGxvbmcgbGVuZ3RoKTsKKworaW50IFg1MDlfYWxpYXNfc2V0MShYNTA5ICp4LCB1bnNpZ25lZCBjaGFyICpuYW1lLCBpbnQgbGVuKTsKK2ludCBYNTA5X2tleWlkX3NldDEoWDUwOSAqeCwgdW5zaWduZWQgY2hhciAqaWQsIGludCBsZW4pOwordW5zaWduZWQgY2hhciAqIFg1MDlfYWxpYXNfZ2V0MChYNTA5ICp4LCBpbnQgKmxlbik7Cit1bnNpZ25lZCBjaGFyICogWDUwOV9rZXlpZF9nZXQwKFg1MDkgKngsIGludCAqbGVuKTsKK2ludCAoKlg1MDlfVFJVU1Rfc2V0X2RlZmF1bHQoaW50ICgqdHJ1c3QpKGludCAsIFg1MDkgKiwgaW50KSkpKGludCwgWDUwOSAqLCBpbnQpOworaW50IFg1MDlfVFJVU1Rfc2V0KGludCAqdCwgaW50IHRydXN0KTsKK2ludCBYNTA5X2FkZDFfdHJ1c3Rfb2JqZWN0KFg1MDkgKngsIEFTTjFfT0JKRUNUICpvYmopOworaW50IFg1MDlfYWRkMV9yZWplY3Rfb2JqZWN0KFg1MDkgKngsIEFTTjFfT0JKRUNUICpvYmopOwordm9pZCBYNTA5X3RydXN0X2NsZWFyKFg1MDkgKngpOwordm9pZCBYNTA5X3JlamVjdF9jbGVhcihYNTA5ICp4KTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X1JFVk9LRUQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQ1JMX0lORk8pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQ1JMKQorCitpbnQgWDUwOV9DUkxfYWRkMF9yZXZva2VkKFg1MDlfQ1JMICpjcmwsIFg1MDlfUkVWT0tFRCAqcmV2KTsKK2ludCBYNTA5X0NSTF9nZXQwX2J5X3NlcmlhbChYNTA5X0NSTCAqY3JsLAorCQlYNTA5X1JFVk9LRUQgKipyZXQsIEFTTjFfSU5URUdFUiAqc2VyaWFsKTsKK2ludCBYNTA5X0NSTF9nZXQwX2J5X2NlcnQoWDUwOV9DUkwgKmNybCwgWDUwOV9SRVZPS0VEICoqcmV0LCBYNTA5ICp4KTsKKworWDUwOV9QS0VZICoJWDUwOV9QS0VZX25ldyh2b2lkICk7Cit2b2lkCQlYNTA5X1BLRVlfZnJlZShYNTA5X1BLRVkgKmEpOworaW50CQlpMmRfWDUwOV9QS0VZKFg1MDlfUEtFWSAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworWDUwOV9QS0VZICoJZDJpX1g1MDlfUEtFWShYNTA5X1BLRVkgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCxsb25nIGxlbmd0aCk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfU1BLSSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfU1BLQUMpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UpCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FVlAKK1g1MDlfSU5GTyAqCVg1MDlfSU5GT19uZXcodm9pZCk7Cit2b2lkCQlYNTA5X0lORk9fZnJlZShYNTA5X0lORk8gKmEpOworY2hhciAqCQlYNTA5X05BTUVfb25lbGluZShYNTA5X05BTUUgKmEsY2hhciAqYnVmLGludCBzaXplKTsKKworaW50IEFTTjFfdmVyaWZ5KGkyZF9vZl92b2lkICppMmQsIFg1MDlfQUxHT1IgKmFsZ29yMSwKKwkJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmUsY2hhciAqZGF0YSxFVlBfUEtFWSAqcGtleSk7CisKK2ludCBBU04xX2RpZ2VzdChpMmRfb2Zfdm9pZCAqaTJkLGNvbnN0IEVWUF9NRCAqdHlwZSxjaGFyICpkYXRhLAorCQl1bnNpZ25lZCBjaGFyICptZCx1bnNpZ25lZCBpbnQgKmxlbik7CisKK2ludCBBU04xX3NpZ24oaTJkX29mX3ZvaWQgKmkyZCwgWDUwOV9BTEdPUiAqYWxnb3IxLAorCSAgICAgIFg1MDlfQUxHT1IgKmFsZ29yMiwgQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmUsCisJICAgICAgY2hhciAqZGF0YSxFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICp0eXBlKTsKKworaW50IEFTTjFfaXRlbV9kaWdlc3QoY29uc3QgQVNOMV9JVEVNICppdCxjb25zdCBFVlBfTUQgKnR5cGUsdm9pZCAqZGF0YSwKKwl1bnNpZ25lZCBjaGFyICptZCx1bnNpZ25lZCBpbnQgKmxlbik7CisKK2ludCBBU04xX2l0ZW1fdmVyaWZ5KGNvbnN0IEFTTjFfSVRFTSAqaXQsIFg1MDlfQUxHT1IgKmFsZ29yMSwKKwlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZSx2b2lkICpkYXRhLEVWUF9QS0VZICpwa2V5KTsKKworaW50IEFTTjFfaXRlbV9zaWduKGNvbnN0IEFTTjFfSVRFTSAqaXQsIFg1MDlfQUxHT1IgKmFsZ29yMSwgWDUwOV9BTEdPUiAqYWxnb3IyLAorCUFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlLAorCXZvaWQgKmRhdGEsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKnR5cGUpOworI2VuZGlmCisKK2ludCAJCVg1MDlfc2V0X3ZlcnNpb24oWDUwOSAqeCxsb25nIHZlcnNpb24pOworaW50IAkJWDUwOV9zZXRfc2VyaWFsTnVtYmVyKFg1MDkgKngsIEFTTjFfSU5URUdFUiAqc2VyaWFsKTsKK0FTTjFfSU5URUdFUiAqCVg1MDlfZ2V0X3NlcmlhbE51bWJlcihYNTA5ICp4KTsKK2ludCAJCVg1MDlfc2V0X2lzc3Vlcl9uYW1lKFg1MDkgKngsIFg1MDlfTkFNRSAqbmFtZSk7CitYNTA5X05BTUUgKglYNTA5X2dldF9pc3N1ZXJfbmFtZShYNTA5ICphKTsKK2ludCAJCVg1MDlfc2V0X3N1YmplY3RfbmFtZShYNTA5ICp4LCBYNTA5X05BTUUgKm5hbWUpOworWDUwOV9OQU1FICoJWDUwOV9nZXRfc3ViamVjdF9uYW1lKFg1MDkgKmEpOworaW50IAkJWDUwOV9zZXRfbm90QmVmb3JlKFg1MDkgKngsIGNvbnN0IEFTTjFfVElNRSAqdG0pOworaW50IAkJWDUwOV9zZXRfbm90QWZ0ZXIoWDUwOSAqeCwgY29uc3QgQVNOMV9USU1FICp0bSk7CitpbnQgCQlYNTA5X3NldF9wdWJrZXkoWDUwOSAqeCwgRVZQX1BLRVkgKnBrZXkpOworRVZQX1BLRVkgKglYNTA5X2dldF9wdWJrZXkoWDUwOSAqeCk7CitBU04xX0JJVF9TVFJJTkcgKiBYNTA5X2dldDBfcHVia2V5X2JpdHN0cihjb25zdCBYNTA5ICp4KTsKK2ludAkJWDUwOV9jZXJ0aWZpY2F0ZV90eXBlKFg1MDkgKngsRVZQX1BLRVkgKnB1YmtleSAvKiBvcHRpb25hbCAqLyk7CisKK2ludAkJWDUwOV9SRVFfc2V0X3ZlcnNpb24oWDUwOV9SRVEgKngsbG9uZyB2ZXJzaW9uKTsKK2ludAkJWDUwOV9SRVFfc2V0X3N1YmplY3RfbmFtZShYNTA5X1JFUSAqcmVxLFg1MDlfTkFNRSAqbmFtZSk7CitpbnQJCVg1MDlfUkVRX3NldF9wdWJrZXkoWDUwOV9SRVEgKngsIEVWUF9QS0VZICpwa2V5KTsKK0VWUF9QS0VZICoJWDUwOV9SRVFfZ2V0X3B1YmtleShYNTA5X1JFUSAqcmVxKTsKK2ludAkJWDUwOV9SRVFfZXh0ZW5zaW9uX25pZChpbnQgbmlkKTsKK2ludCAqCQlYNTA5X1JFUV9nZXRfZXh0ZW5zaW9uX25pZHModm9pZCk7Cit2b2lkCQlYNTA5X1JFUV9zZXRfZXh0ZW5zaW9uX25pZHMoaW50ICpuaWRzKTsKK1NUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqWDUwOV9SRVFfZ2V0X2V4dGVuc2lvbnMoWDUwOV9SRVEgKnJlcSk7CitpbnQgWDUwOV9SRVFfYWRkX2V4dGVuc2lvbnNfbmlkKFg1MDlfUkVRICpyZXEsIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0cywKKwkJCQlpbnQgbmlkKTsKK2ludCBYNTA5X1JFUV9hZGRfZXh0ZW5zaW9ucyhYNTA5X1JFUSAqcmVxLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHMpOworaW50IFg1MDlfUkVRX2dldF9hdHRyX2NvdW50KGNvbnN0IFg1MDlfUkVRICpyZXEpOworaW50IFg1MDlfUkVRX2dldF9hdHRyX2J5X05JRChjb25zdCBYNTA5X1JFUSAqcmVxLCBpbnQgbmlkLAorCQkJICBpbnQgbGFzdHBvcyk7CitpbnQgWDUwOV9SRVFfZ2V0X2F0dHJfYnlfT0JKKGNvbnN0IFg1MDlfUkVRICpyZXEsIEFTTjFfT0JKRUNUICpvYmosCisJCQkgIGludCBsYXN0cG9zKTsKK1g1MDlfQVRUUklCVVRFICpYNTA5X1JFUV9nZXRfYXR0cihjb25zdCBYNTA5X1JFUSAqcmVxLCBpbnQgbG9jKTsKK1g1MDlfQVRUUklCVVRFICpYNTA5X1JFUV9kZWxldGVfYXR0cihYNTA5X1JFUSAqcmVxLCBpbnQgbG9jKTsKK2ludCBYNTA5X1JFUV9hZGQxX2F0dHIoWDUwOV9SRVEgKnJlcSwgWDUwOV9BVFRSSUJVVEUgKmF0dHIpOworaW50IFg1MDlfUkVRX2FkZDFfYXR0cl9ieV9PQkooWDUwOV9SRVEgKnJlcSwKKwkJCWNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworaW50IFg1MDlfUkVRX2FkZDFfYXR0cl9ieV9OSUQoWDUwOV9SRVEgKnJlcSwKKwkJCWludCBuaWQsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworaW50IFg1MDlfUkVRX2FkZDFfYXR0cl9ieV90eHQoWDUwOV9SRVEgKnJlcSwKKwkJCWNvbnN0IGNoYXIgKmF0dHJuYW1lLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKKworaW50IFg1MDlfQ1JMX3NldF92ZXJzaW9uKFg1MDlfQ1JMICp4LCBsb25nIHZlcnNpb24pOworaW50IFg1MDlfQ1JMX3NldF9pc3N1ZXJfbmFtZShYNTA5X0NSTCAqeCwgWDUwOV9OQU1FICpuYW1lKTsKK2ludCBYNTA5X0NSTF9zZXRfbGFzdFVwZGF0ZShYNTA5X0NSTCAqeCwgY29uc3QgQVNOMV9USU1FICp0bSk7CitpbnQgWDUwOV9DUkxfc2V0X25leHRVcGRhdGUoWDUwOV9DUkwgKngsIGNvbnN0IEFTTjFfVElNRSAqdG0pOworaW50IFg1MDlfQ1JMX3NvcnQoWDUwOV9DUkwgKmNybCk7CisKK2ludCBYNTA5X1JFVk9LRURfc2V0X3NlcmlhbE51bWJlcihYNTA5X1JFVk9LRUQgKngsIEFTTjFfSU5URUdFUiAqc2VyaWFsKTsKK2ludCBYNTA5X1JFVk9LRURfc2V0X3Jldm9jYXRpb25EYXRlKFg1MDlfUkVWT0tFRCAqciwgQVNOMV9USU1FICp0bSk7CisKK2ludAkJWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXkoWDUwOV9SRVEgKng1MDksRVZQX1BLRVkgKnBrZXkpOworCitpbnQJCVg1MDlfY2hlY2tfcHJpdmF0ZV9rZXkoWDUwOSAqeDUwOSxFVlBfUEtFWSAqcGtleSk7CisKK2ludAkJWDUwOV9pc3N1ZXJfYW5kX3NlcmlhbF9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYik7Cit1bnNpZ25lZCBsb25nCVg1MDlfaXNzdWVyX2FuZF9zZXJpYWxfaGFzaChYNTA5ICphKTsKKworaW50CQlYNTA5X2lzc3Vlcl9uYW1lX2NtcChjb25zdCBYNTA5ICphLCBjb25zdCBYNTA5ICpiKTsKK3Vuc2lnbmVkIGxvbmcJWDUwOV9pc3N1ZXJfbmFtZV9oYXNoKFg1MDkgKmEpOworCitpbnQJCVg1MDlfc3ViamVjdF9uYW1lX2NtcChjb25zdCBYNTA5ICphLCBjb25zdCBYNTA5ICpiKTsKK3Vuc2lnbmVkIGxvbmcJWDUwOV9zdWJqZWN0X25hbWVfaGFzaChYNTA5ICp4KTsKKworI2lmbmRlZiBPUEVOU1NMX05PX01ENQordW5zaWduZWQgbG9uZwlYNTA5X2lzc3Vlcl9uYW1lX2hhc2hfb2xkKFg1MDkgKmEpOwordW5zaWduZWQgbG9uZwlYNTA5X3N1YmplY3RfbmFtZV9oYXNoX29sZChYNTA5ICp4KTsKKyNlbmRpZgorCitpbnQJCVg1MDlfY21wKGNvbnN0IFg1MDkgKmEsIGNvbnN0IFg1MDkgKmIpOworaW50CQlYNTA5X05BTUVfY21wKGNvbnN0IFg1MDlfTkFNRSAqYSwgY29uc3QgWDUwOV9OQU1FICpiKTsKK3Vuc2lnbmVkIGxvbmcJWDUwOV9OQU1FX2hhc2goWDUwOV9OQU1FICp4KTsKK3Vuc2lnbmVkIGxvbmcJWDUwOV9OQU1FX2hhc2hfb2xkKFg1MDlfTkFNRSAqeCk7CisKK2ludAkJWDUwOV9DUkxfY21wKGNvbnN0IFg1MDlfQ1JMICphLCBjb25zdCBYNTA5X0NSTCAqYik7CitpbnQJCVg1MDlfQ1JMX21hdGNoKGNvbnN0IFg1MDlfQ1JMICphLCBjb25zdCBYNTA5X0NSTCAqYik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQJCVg1MDlfcHJpbnRfZXhfZnAoRklMRSAqYnAsWDUwOSAqeCwgdW5zaWduZWQgbG9uZyBubWZsYWcsIHVuc2lnbmVkIGxvbmcgY2ZsYWcpOworaW50CQlYNTA5X3ByaW50X2ZwKEZJTEUgKmJwLFg1MDkgKngpOworaW50CQlYNTA5X0NSTF9wcmludF9mcChGSUxFICpicCxYNTA5X0NSTCAqeCk7CitpbnQJCVg1MDlfUkVRX3ByaW50X2ZwKEZJTEUgKmJwLFg1MDlfUkVRICpyZXEpOworaW50IFg1MDlfTkFNRV9wcmludF9leF9mcChGSUxFICpmcCwgWDUwOV9OQU1FICpubSwgaW50IGluZGVudCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworaW50CQlYNTA5X05BTUVfcHJpbnQoQklPICpicCwgWDUwOV9OQU1FICpuYW1lLCBpbnQgb2Jhc2UpOworaW50IFg1MDlfTkFNRV9wcmludF9leChCSU8gKm91dCwgWDUwOV9OQU1FICpubSwgaW50IGluZGVudCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CitpbnQJCVg1MDlfcHJpbnRfZXgoQklPICpicCxYNTA5ICp4LCB1bnNpZ25lZCBsb25nIG5tZmxhZywgdW5zaWduZWQgbG9uZyBjZmxhZyk7CitpbnQJCVg1MDlfcHJpbnQoQklPICpicCxYNTA5ICp4KTsKK2ludAkJWDUwOV9vY3NwaWRfcHJpbnQoQklPICpicCxYNTA5ICp4KTsKK2ludAkJWDUwOV9DRVJUX0FVWF9wcmludChCSU8gKmJwLFg1MDlfQ0VSVF9BVVggKngsIGludCBpbmRlbnQpOworaW50CQlYNTA5X0NSTF9wcmludChCSU8gKmJwLFg1MDlfQ1JMICp4KTsKK2ludAkJWDUwOV9SRVFfcHJpbnRfZXgoQklPICpicCwgWDUwOV9SRVEgKngsIHVuc2lnbmVkIGxvbmcgbm1mbGFnLCB1bnNpZ25lZCBsb25nIGNmbGFnKTsKK2ludAkJWDUwOV9SRVFfcHJpbnQoQklPICpicCxYNTA5X1JFUSAqcmVxKTsKKyNlbmRpZgorCitpbnQgCQlYNTA5X05BTUVfZW50cnlfY291bnQoWDUwOV9OQU1FICpuYW1lKTsKK2ludCAJCVg1MDlfTkFNRV9nZXRfdGV4dF9ieV9OSUQoWDUwOV9OQU1FICpuYW1lLCBpbnQgbmlkLAorCQkJY2hhciAqYnVmLGludCBsZW4pOworaW50CQlYNTA5X05BTUVfZ2V0X3RleHRfYnlfT0JKKFg1MDlfTkFNRSAqbmFtZSwgQVNOMV9PQkpFQ1QgKm9iaiwKKwkJCWNoYXIgKmJ1ZixpbnQgbGVuKTsKKworLyogTk9URTogeW91IHNob3VsZCBiZSBwYXNzc2luZyAtMSwgbm90IDAgYXMgbGFzdHBvcy4gIFRoZSBmdW5jdGlvbnMgdGhhdCB1c2UKKyAqIGxhc3Rwb3MsIHNlYXJjaCBhZnRlciB0aGF0IHBvc2l0aW9uIG9uLiAqLworaW50IAkJWDUwOV9OQU1FX2dldF9pbmRleF9ieV9OSUQoWDUwOV9OQU1FICpuYW1lLGludCBuaWQsaW50IGxhc3Rwb3MpOworaW50IAkJWDUwOV9OQU1FX2dldF9pbmRleF9ieV9PQkooWDUwOV9OQU1FICpuYW1lLEFTTjFfT0JKRUNUICpvYmosCisJCQlpbnQgbGFzdHBvcyk7CitYNTA5X05BTUVfRU5UUlkgKlg1MDlfTkFNRV9nZXRfZW50cnkoWDUwOV9OQU1FICpuYW1lLCBpbnQgbG9jKTsKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX2RlbGV0ZV9lbnRyeShYNTA5X05BTUUgKm5hbWUsIGludCBsb2MpOworaW50IAkJWDUwOV9OQU1FX2FkZF9lbnRyeShYNTA5X05BTUUgKm5hbWUsWDUwOV9OQU1FX0VOVFJZICpuZSwKKwkJCWludCBsb2MsIGludCBzZXQpOworaW50IFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfT0JKKFg1MDlfTkFNRSAqbmFtZSwgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IHR5cGUsCisJCQl1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbiwgaW50IGxvYywgaW50IHNldCk7CitpbnQgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV9OSUQoWDUwOV9OQU1FICpuYW1lLCBpbnQgbmlkLCBpbnQgdHlwZSwKKwkJCXVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuLCBpbnQgbG9jLCBpbnQgc2V0KTsKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV90eHQoWDUwOV9OQU1FX0VOVFJZICoqbmUsCisJCWNvbnN0IGNoYXIgKmZpZWxkLCBpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X05JRChYNTA5X05BTUVfRU5UUlkgKipuZSwgaW50IG5pZCwKKwkJCWludCB0eXBlLHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK2ludCBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChYNTA5X05BTUUgKm5hbWUsIGNvbnN0IGNoYXIgKmZpZWxkLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuLCBpbnQgbG9jLCBpbnQgc2V0KTsKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV9PQkooWDUwOV9OQU1FX0VOVFJZICoqbmUsCisJCQlBU04xX09CSkVDVCAqb2JqLCBpbnQgdHlwZSxjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywKKwkJCWludCBsZW4pOworaW50IAkJWDUwOV9OQU1FX0VOVFJZX3NldF9vYmplY3QoWDUwOV9OQU1FX0VOVFJZICpuZSwKKwkJCUFTTjFfT0JKRUNUICpvYmopOworaW50IAkJWDUwOV9OQU1FX0VOVFJZX3NldF9kYXRhKFg1MDlfTkFNRV9FTlRSWSAqbmUsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworQVNOMV9PQkpFQ1QgKglYNTA5X05BTUVfRU5UUllfZ2V0X29iamVjdChYNTA5X05BTUVfRU5UUlkgKm5lKTsKK0FTTjFfU1RSSU5HICoJWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKFg1MDlfTkFNRV9FTlRSWSAqbmUpOworCitpbnQJCVg1MDl2M19nZXRfZXh0X2NvdW50KGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCk7CitpbnQJCVg1MDl2M19nZXRfZXh0X2J5X05JRChjb25zdCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngsCisJCQkJICAgICAgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50CQlYNTA5djNfZ2V0X2V4dF9ieV9PQkooY29uc3QgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4LAorCQkJCSAgICAgIEFTTjFfT0JKRUNUICpvYmosaW50IGxhc3Rwb3MpOworaW50CQlYNTA5djNfZ2V0X2V4dF9ieV9jcml0aWNhbChjb25zdCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngsCisJCQkJCSAgIGludCBjcml0LCBpbnQgbGFzdHBvcyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOXYzX2dldF9leHQoY29uc3QgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4LCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5djNfZGVsZXRlX2V4dChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngsIGludCBsb2MpOworU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpYNTA5djNfYWRkX2V4dChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKip4LAorCQkJCQkgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKTsKKworaW50CQlYNTA5X2dldF9leHRfY291bnQoWDUwOSAqeCk7CitpbnQJCVg1MDlfZ2V0X2V4dF9ieV9OSUQoWDUwOSAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50CQlYNTA5X2dldF9leHRfYnlfT0JKKFg1MDkgKngsQVNOMV9PQkpFQ1QgKm9iaixpbnQgbGFzdHBvcyk7CitpbnQJCVg1MDlfZ2V0X2V4dF9ieV9jcml0aWNhbChYNTA5ICp4LCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpOworWDUwOV9FWFRFTlNJT04gKlg1MDlfZ2V0X2V4dChYNTA5ICp4LCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5X2RlbGV0ZV9leHQoWDUwOSAqeCwgaW50IGxvYyk7CitpbnQJCVg1MDlfYWRkX2V4dChYNTA5ICp4LCBYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBsb2MpOwordm9pZAkqCVg1MDlfZ2V0X2V4dF9kMmkoWDUwOSAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CitpbnQJCVg1MDlfYWRkMV9leHRfaTJkKFg1MDkgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworaW50CQlYNTA5X0NSTF9nZXRfZXh0X2NvdW50KFg1MDlfQ1JMICp4KTsKK2ludAkJWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoWDUwOV9DUkwgKngsIGludCBuaWQsIGludCBsYXN0cG9zKTsKK2ludAkJWDUwOV9DUkxfZ2V0X2V4dF9ieV9PQkooWDUwOV9DUkwgKngsQVNOMV9PQkpFQ1QgKm9iaixpbnQgbGFzdHBvcyk7CitpbnQJCVg1MDlfQ1JMX2dldF9leHRfYnlfY3JpdGljYWwoWDUwOV9DUkwgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9DUkxfZ2V0X2V4dChYNTA5X0NSTCAqeCwgaW50IGxvYyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9DUkxfZGVsZXRlX2V4dChYNTA5X0NSTCAqeCwgaW50IGxvYyk7CitpbnQJCVg1MDlfQ1JMX2FkZF9leHQoWDUwOV9DUkwgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7Cit2b2lkCSoJWDUwOV9DUkxfZ2V0X2V4dF9kMmkoWDUwOV9DUkwgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpOworaW50CQlYNTA5X0NSTF9hZGQxX2V4dF9pMmQoWDUwOV9DUkwgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworaW50CQlYNTA5X1JFVk9LRURfZ2V0X2V4dF9jb3VudChYNTA5X1JFVk9LRUQgKngpOworaW50CQlYNTA5X1JFVk9LRURfZ2V0X2V4dF9ieV9OSUQoWDUwOV9SRVZPS0VEICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcyk7CitpbnQJCVg1MDlfUkVWT0tFRF9nZXRfZXh0X2J5X09CSihYNTA5X1JFVk9LRUQgKngsQVNOMV9PQkpFQ1QgKm9iaixpbnQgbGFzdHBvcyk7CitpbnQJCVg1MDlfUkVWT0tFRF9nZXRfZXh0X2J5X2NyaXRpY2FsKFg1MDlfUkVWT0tFRCAqeCwgaW50IGNyaXQsIGludCBsYXN0cG9zKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5X1JFVk9LRURfZ2V0X2V4dChYNTA5X1JFVk9LRUQgKngsIGludCBsb2MpOworWDUwOV9FWFRFTlNJT04gKlg1MDlfUkVWT0tFRF9kZWxldGVfZXh0KFg1MDlfUkVWT0tFRCAqeCwgaW50IGxvYyk7CitpbnQJCVg1MDlfUkVWT0tFRF9hZGRfZXh0KFg1MDlfUkVWT0tFRCAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKTsKK3ZvaWQJKglYNTA5X1JFVk9LRURfZ2V0X2V4dF9kMmkoWDUwOV9SRVZPS0VEICp4LCBpbnQgbmlkLCBpbnQgKmNyaXQsIGludCAqaWR4KTsKK2ludAkJWDUwOV9SRVZPS0VEX2FkZDFfZXh0X2kyZChYNTA5X1JFVk9LRUQgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworWDUwOV9FWFRFTlNJT04gKlg1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9OSUQoWDUwOV9FWFRFTlNJT04gKipleCwKKwkJCWludCBuaWQsIGludCBjcml0LCBBU04xX09DVEVUX1NUUklORyAqZGF0YSk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X09CSihYNTA5X0VYVEVOU0lPTiAqKmV4LAorCQkJQVNOMV9PQkpFQ1QgKm9iaixpbnQgY3JpdCxBU04xX09DVEVUX1NUUklORyAqZGF0YSk7CitpbnQJCVg1MDlfRVhURU5TSU9OX3NldF9vYmplY3QoWDUwOV9FWFRFTlNJT04gKmV4LEFTTjFfT0JKRUNUICpvYmopOworaW50CQlYNTA5X0VYVEVOU0lPTl9zZXRfY3JpdGljYWwoWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgY3JpdCk7CitpbnQJCVg1MDlfRVhURU5TSU9OX3NldF9kYXRhKFg1MDlfRVhURU5TSU9OICpleCwKKwkJCUFTTjFfT0NURVRfU1RSSU5HICpkYXRhKTsKK0FTTjFfT0JKRUNUICoJWDUwOV9FWFRFTlNJT05fZ2V0X29iamVjdChYNTA5X0VYVEVOU0lPTiAqZXgpOworQVNOMV9PQ1RFVF9TVFJJTkcgKlg1MDlfRVhURU5TSU9OX2dldF9kYXRhKFg1MDlfRVhURU5TSU9OICpuZSk7CitpbnQJCVg1MDlfRVhURU5TSU9OX2dldF9jcml0aWNhbChYNTA5X0VYVEVOU0lPTiAqZXgpOworCitpbnQgWDUwOWF0X2dldF9hdHRyX2NvdW50KGNvbnN0IFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqeCk7CitpbnQgWDUwOWF0X2dldF9hdHRyX2J5X05JRChjb25zdCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsIGludCBuaWQsCisJCQkgIGludCBsYXN0cG9zKTsKK2ludCBYNTA5YXRfZ2V0X2F0dHJfYnlfT0JKKGNvbnN0IFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2ssIEFTTjFfT0JKRUNUICpvYmosCisJCQkgIGludCBsYXN0cG9zKTsKK1g1MDlfQVRUUklCVVRFICpYNTA5YXRfZ2V0X2F0dHIoY29uc3QgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICp4LCBpbnQgbG9jKTsKK1g1MDlfQVRUUklCVVRFICpYNTA5YXRfZGVsZXRlX2F0dHIoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICp4LCBpbnQgbG9jKTsKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKip4LAorCQkJCQkgWDUwOV9BVFRSSUJVVEUgKmF0dHIpOworU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpYNTA5YXRfYWRkMV9hdHRyX2J5X09CSihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKip4LAorCQkJY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKlg1MDlhdF9hZGQxX2F0dHJfYnlfTklEKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqKngsCisJCQlpbnQgbmlkLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cl9ieV90eHQoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICoqeCwKKwkJCWNvbnN0IGNoYXIgKmF0dHJuYW1lLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK3ZvaWQgKlg1MDlhdF9nZXQwX2RhdGFfYnlfT0JKKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqeCwKKwkJCQlBU04xX09CSkVDVCAqb2JqLCBpbnQgbGFzdHBvcywgaW50IHR5cGUpOworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9OSUQoWDUwOV9BVFRSSUJVVEUgKiphdHRyLCBpbnQgbmlkLAorCSAgICAgaW50IGF0cnR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkooWDUwOV9BVFRSSUJVVEUgKiphdHRyLAorCSAgICAgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGF0cnR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV90eHQoWDUwOV9BVFRSSUJVVEUgKiphdHRyLAorCQljb25zdCBjaGFyICphdHJuYW1lLCBpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworaW50IFg1MDlfQVRUUklCVVRFX3NldDFfb2JqZWN0KFg1MDlfQVRUUklCVVRFICphdHRyLCBjb25zdCBBU04xX09CSkVDVCAqb2JqKTsKK2ludCBYNTA5X0FUVFJJQlVURV9zZXQxX2RhdGEoWDUwOV9BVFRSSUJVVEUgKmF0dHIsIGludCBhdHRydHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbik7Cit2b2lkICpYNTA5X0FUVFJJQlVURV9nZXQwX2RhdGEoWDUwOV9BVFRSSUJVVEUgKmF0dHIsIGludCBpZHgsCisJCQkJCWludCBhdHJ0eXBlLCB2b2lkICpkYXRhKTsKK2ludCBYNTA5X0FUVFJJQlVURV9jb3VudChYNTA5X0FUVFJJQlVURSAqYXR0cik7CitBU04xX09CSkVDVCAqWDUwOV9BVFRSSUJVVEVfZ2V0MF9vYmplY3QoWDUwOV9BVFRSSUJVVEUgKmF0dHIpOworQVNOMV9UWVBFICpYNTA5X0FUVFJJQlVURV9nZXQwX3R5cGUoWDUwOV9BVFRSSUJVVEUgKmF0dHIsIGludCBpZHgpOworCitpbnQgRVZQX1BLRVlfZ2V0X2F0dHJfY291bnQoY29uc3QgRVZQX1BLRVkgKmtleSk7CitpbnQgRVZQX1BLRVlfZ2V0X2F0dHJfYnlfTklEKGNvbnN0IEVWUF9QS0VZICprZXksIGludCBuaWQsCisJCQkgIGludCBsYXN0cG9zKTsKK2ludCBFVlBfUEtFWV9nZXRfYXR0cl9ieV9PQkooY29uc3QgRVZQX1BLRVkgKmtleSwgQVNOMV9PQkpFQ1QgKm9iaiwKKwkJCSAgaW50IGxhc3Rwb3MpOworWDUwOV9BVFRSSUJVVEUgKkVWUF9QS0VZX2dldF9hdHRyKGNvbnN0IEVWUF9QS0VZICprZXksIGludCBsb2MpOworWDUwOV9BVFRSSUJVVEUgKkVWUF9QS0VZX2RlbGV0ZV9hdHRyKEVWUF9QS0VZICprZXksIGludCBsb2MpOworaW50IEVWUF9QS0VZX2FkZDFfYXR0cihFVlBfUEtFWSAqa2V5LCBYNTA5X0FUVFJJQlVURSAqYXR0cik7CitpbnQgRVZQX1BLRVlfYWRkMV9hdHRyX2J5X09CSihFVlBfUEtFWSAqa2V5LAorCQkJY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitpbnQgRVZQX1BLRVlfYWRkMV9hdHRyX2J5X05JRChFVlBfUEtFWSAqa2V5LAorCQkJaW50IG5pZCwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitpbnQgRVZQX1BLRVlfYWRkMV9hdHRyX2J5X3R4dChFVlBfUEtFWSAqa2V5LAorCQkJY29uc3QgY2hhciAqYXR0cm5hbWUsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworCitpbnQJCVg1MDlfdmVyaWZ5X2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCk7CisKKy8qIGxvb2t1cCBhIGNlcnQgZnJvbSBhIFg1MDkgU1RBQ0sgKi8KK1g1MDkgKlg1MDlfZmluZF9ieV9pc3N1ZXJfYW5kX3NlcmlhbChTVEFDS19PRihYNTA5KSAqc2ssWDUwOV9OQU1FICpuYW1lLAorCQkJCSAgICAgQVNOMV9JTlRFR0VSICpzZXJpYWwpOworWDUwOSAqWDUwOV9maW5kX2J5X3N1YmplY3QoU1RBQ0tfT0YoWDUwOSkgKnNrLFg1MDlfTkFNRSAqbmFtZSk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEJFUEFSQU0pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBCRTJQQVJBTSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEJLREYyUEFSQU0pCisKK2ludCBQS0NTNV9wYmVfc2V0MF9hbGdvcihYNTA5X0FMR09SICphbGdvciwgaW50IGFsZywgaW50IGl0ZXIsCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4pOworCitYNTA5X0FMR09SICpQS0NTNV9wYmVfc2V0KGludCBhbGcsIGludCBpdGVyLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuKTsKK1g1MDlfQUxHT1IgKlBLQ1M1X3BiZTJfc2V0KGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgaW50IGl0ZXIsCisJCQkJCSB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbik7CitYNTA5X0FMR09SICpQS0NTNV9wYmUyX3NldF9pdihjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIGludCBpdGVyLAorCQkJCSB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbiwKKwkJCQkgdW5zaWduZWQgY2hhciAqYWl2LCBpbnQgcHJmX25pZCk7CisKKy8qIFBLQ1MjOCB1dGlsaXRpZXMgKi8KKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQS0NTOF9QUklWX0tFWV9JTkZPKQorCitFVlBfUEtFWSAqRVZQX1BLQ1M4MlBLRVkoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgpOworUEtDUzhfUFJJVl9LRVlfSU5GTyAqRVZQX1BLRVkyUEtDUzgoRVZQX1BLRVkgKnBrZXkpOworUEtDUzhfUFJJVl9LRVlfSU5GTyAqRVZQX1BLRVkyUEtDUzhfYnJva2VuKEVWUF9QS0VZICpwa2V5LCBpbnQgYnJva2VuKTsKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKlBLQ1M4X3NldF9icm9rZW4oUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGludCBicm9rZW4pOworCitpbnQgUEtDUzhfcGtleV9zZXQwKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnByaXYsIEFTTjFfT0JKRUNUICphb2JqLAorCQkJaW50IHZlcnNpb24sIGludCBwdHlwZSwgdm9pZCAqcHZhbCwKKwkJCQl1bnNpZ25lZCBjaGFyICpwZW5jLCBpbnQgcGVuY2xlbik7CitpbnQgUEtDUzhfcGtleV9nZXQwKEFTTjFfT0JKRUNUICoqcHBrYWxnLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGssIGludCAqcHBrbGVuLAorCQlYNTA5X0FMR09SICoqcGEsCisJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KTsKKworaW50IFg1MDlfUFVCS0VZX3NldDBfcGFyYW0oWDUwOV9QVUJLRVkgKnB1YiwgQVNOMV9PQkpFQ1QgKmFvYmosCisJCQkJCWludCBwdHlwZSwgdm9pZCAqcHZhbCwKKwkJCQkJdW5zaWduZWQgY2hhciAqcGVuYywgaW50IHBlbmNsZW4pOworaW50IFg1MDlfUFVCS0VZX2dldDBfcGFyYW0oQVNOMV9PQkpFQ1QgKipwcGthbGcsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKipwaywgaW50ICpwcGtsZW4sCisJCVg1MDlfQUxHT1IgKipwYSwKKwkJWDUwOV9QVUJLRVkgKnB1Yik7CisKK2ludCBYNTA5X2NoZWNrX3RydXN0KFg1MDkgKngsIGludCBpZCwgaW50IGZsYWdzKTsKK2ludCBYNTA5X1RSVVNUX2dldF9jb3VudCh2b2lkKTsKK1g1MDlfVFJVU1QgKiBYNTA5X1RSVVNUX2dldDAoaW50IGlkeCk7CitpbnQgWDUwOV9UUlVTVF9nZXRfYnlfaWQoaW50IGlkKTsKK2ludCBYNTA5X1RSVVNUX2FkZChpbnQgaWQsIGludCBmbGFncywgaW50ICgqY2spKFg1MDlfVFJVU1QgKiwgWDUwOSAqLCBpbnQpLAorCQkJCQljaGFyICpuYW1lLCBpbnQgYXJnMSwgdm9pZCAqYXJnMik7Cit2b2lkIFg1MDlfVFJVU1RfY2xlYW51cCh2b2lkKTsKK2ludCBYNTA5X1RSVVNUX2dldF9mbGFncyhYNTA5X1RSVVNUICp4cCk7CitjaGFyICpYNTA5X1RSVVNUX2dldDBfbmFtZShYNTA5X1RSVVNUICp4cCk7CitpbnQgWDUwOV9UUlVTVF9nZXRfdHJ1c3QoWDUwOV9UUlVTVCAqeHApOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1g1MDlfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBYNTA5IGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFg1MDlfRl9BRERfQ0VSVF9ESVIJCQkJIDEwMAorI2RlZmluZSBYNTA5X0ZfQllfRklMRV9DVFJMCQkJCSAxMDEKKyNkZWZpbmUgWDUwOV9GX0NIRUNLX1BPTElDWQkJCQkgMTQ1CisjZGVmaW5lIFg1MDlfRl9ESVJfQ1RSTAkJCQkJIDEwMgorI2RlZmluZSBYNTA5X0ZfR0VUX0NFUlRfQllfU1VCSkVDVAkJCSAxMDMKKyNkZWZpbmUgWDUwOV9GX05FVFNDQVBFX1NQS0lfQjY0X0RFQ09ERQkJCSAxMjkKKyNkZWZpbmUgWDUwOV9GX05FVFNDQVBFX1NQS0lfQjY0X0VOQ09ERQkJCSAxMzAKKyNkZWZpbmUgWDUwOV9GX1g1MDlBVF9BREQxX0FUVFIJCQkJIDEzNQorI2RlZmluZSBYNTA5X0ZfWDUwOVYzX0FERF9FWFQJCQkJIDEwNAorI2RlZmluZSBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfQ1JFQVRFX0JZX05JRAkJIDEzNgorI2RlZmluZSBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfQ1JFQVRFX0JZX09CSgkJIDEzNworI2RlZmluZSBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfQ1JFQVRFX0JZX1RYVAkJIDE0MAorI2RlZmluZSBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfR0VUMF9EQVRBCQkJIDEzOQorI2RlZmluZSBYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfU0VUMV9EQVRBCQkJIDEzOAorI2RlZmluZSBYNTA5X0ZfWDUwOV9DSEVDS19QUklWQVRFX0tFWQkJCSAxMjgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQ1JMX1BSSU5UX0ZQCQkJIDE0NworI2RlZmluZSBYNTA5X0ZfWDUwOV9FWFRFTlNJT05fQ1JFQVRFX0JZX05JRAkJIDEwOAorI2RlZmluZSBYNTA5X0ZfWDUwOV9FWFRFTlNJT05fQ1JFQVRFX0JZX09CSgkJIDEwOQorI2RlZmluZSBYNTA5X0ZfWDUwOV9HRVRfUFVCS0VZX1BBUkFNRVRFUlMJCSAxMTAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTE9BRF9DRVJUX0NSTF9GSUxFCQkJIDEzMgorI2RlZmluZSBYNTA5X0ZfWDUwOV9MT0FEX0NFUlRfRklMRQkJCSAxMTEKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTE9BRF9DUkxfRklMRQkJCSAxMTIKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9BRERfRU5UUlkJCQkgMTEzCisjZGVmaW5lIFg1MDlfRl9YNTA5X05BTUVfRU5UUllfQ1JFQVRFX0JZX05JRAkJIDExNAorI2RlZmluZSBYNTA5X0ZfWDUwOV9OQU1FX0VOVFJZX0NSRUFURV9CWV9UWFQJCSAxMzEKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9FTlRSWV9TRVRfT0JKRUNUCQkgMTE1CisjZGVmaW5lIFg1MDlfRl9YNTA5X05BTUVfT05FTElORQkJCSAxMTYKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9QUklOVAkJCQkgMTE3CisjZGVmaW5lIFg1MDlfRl9YNTA5X1BSSU5UX0VYX0ZQCQkJCSAxMTgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfUFVCS0VZX0dFVAkJCQkgMTE5CisjZGVmaW5lIFg1MDlfRl9YNTA5X1BVQktFWV9TRVQJCQkJIDEyMAorI2RlZmluZSBYNTA5X0ZfWDUwOV9SRVFfQ0hFQ0tfUFJJVkFURV9LRVkJCSAxNDQKKyNkZWZpbmUgWDUwOV9GX1g1MDlfUkVRX1BSSU5UX0VYCQkJIDEyMQorI2RlZmluZSBYNTA5X0ZfWDUwOV9SRVFfUFJJTlRfRlAJCQkgMTIyCisjZGVmaW5lIFg1MDlfRl9YNTA5X1JFUV9UT19YNTA5CQkJCSAxMjMKKyNkZWZpbmUgWDUwOV9GX1g1MDlfU1RPUkVfQUREX0NFUlQJCQkgMTI0CisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0FERF9DUkwJCQkgMTI1CisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9HRVQxX0lTU1VFUgkJIDE0NgorI2RlZmluZSBYNTA5X0ZfWDUwOV9TVE9SRV9DVFhfSU5JVAkJCSAxNDMKKyNkZWZpbmUgWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX05FVwkJCSAxNDIKKyNkZWZpbmUgWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX1BVUlBPU0VfSU5IRVJJVAkJIDEzNAorI2RlZmluZSBYNTA5X0ZfWDUwOV9UT19YNTA5X1JFUQkJCQkgMTI2CisjZGVmaW5lIFg1MDlfRl9YNTA5X1RSVVNUX0FERAkJCQkgMTMzCisjZGVmaW5lIFg1MDlfRl9YNTA5X1RSVVNUX1NFVAkJCQkgMTQxCisjZGVmaW5lIFg1MDlfRl9YNTA5X1ZFUklGWV9DRVJUCQkJCSAxMjcKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBYNTA5X1JfQkFEX1g1MDlfRklMRVRZUEUJCQkgMTAwCisjZGVmaW5lIFg1MDlfUl9CQVNFNjRfREVDT0RFX0VSUk9SCQkJIDExOAorI2RlZmluZSBYNTA5X1JfQ0FOVF9DSEVDS19ESF9LRVkJCQkgMTE0CisjZGVmaW5lIFg1MDlfUl9DRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRQkJIDEwMQorI2RlZmluZSBYNTA5X1JfRVJSX0FTTjFfTElCCQkJCSAxMDIKKyNkZWZpbmUgWDUwOV9SX0lOVkFMSURfRElSRUNUT1JZCQkJIDExMworI2RlZmluZSBYNTA5X1JfSU5WQUxJRF9GSUVMRF9OQU1FCQkJIDExOQorI2RlZmluZSBYNTA5X1JfSU5WQUxJRF9UUlVTVAkJCQkgMTIzCisjZGVmaW5lIFg1MDlfUl9LRVlfVFlQRV9NSVNNQVRDSAkJCSAxMTUKKyNkZWZpbmUgWDUwOV9SX0tFWV9WQUxVRVNfTUlTTUFUQ0gJCQkgMTE2CisjZGVmaW5lIFg1MDlfUl9MT0FESU5HX0NFUlRfRElSCQkJCSAxMDMKKyNkZWZpbmUgWDUwOV9SX0xPQURJTkdfREVGQVVMVFMJCQkJIDEwNAorI2RlZmluZSBYNTA5X1JfTUVUSE9EX05PVF9TVVBQT1JURUQJCQkgMTI0CisjZGVmaW5lIFg1MDlfUl9OT19DRVJUX1NFVF9GT1JfVVNfVE9fVkVSSUZZCQkgMTA1CisjZGVmaW5lIFg1MDlfUl9QVUJMSUNfS0VZX0RFQ09ERV9FUlJPUgkJCSAxMjUKKyNkZWZpbmUgWDUwOV9SX1BVQkxJQ19LRVlfRU5DT0RFX0VSUk9SCQkJIDEyNgorI2RlZmluZSBYNTA5X1JfU0hPVUxEX1JFVFJZCQkJCSAxMDYKKyNkZWZpbmUgWDUwOV9SX1VOQUJMRV9UT19GSU5EX1BBUkFNRVRFUlNfSU5fQ0hBSU4JIDEwNworI2RlZmluZSBYNTA5X1JfVU5BQkxFX1RPX0dFVF9DRVJUU19QVUJMSUNfS0VZCQkgMTA4CisjZGVmaW5lIFg1MDlfUl9VTktOT1dOX0tFWV9UWVBFCQkJCSAxMTcKKyNkZWZpbmUgWDUwOV9SX1VOS05PV05fTklECQkJCSAxMDkKKyNkZWZpbmUgWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRAkJCSAxMjEKKyNkZWZpbmUgWDUwOV9SX1VOS05PV05fVFJVU1RfSUQJCQkJIDEyMAorI2RlZmluZSBYNTA5X1JfVU5TVVBQT1JURURfQUxHT1JJVEhNCQkJIDExMQorI2RlZmluZSBYNTA5X1JfV1JPTkdfTE9PS1VQX1RZUEUJCQkgMTEyCisjZGVmaW5lIFg1MDlfUl9XUk9OR19UWVBFCQkJCSAxMjIKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfYXR0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2F0dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NDYwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2F0dC5jCkBAIC0wLDAgKzEsMzU5IEBACisvKiBjcnlwdG8veDUwOS94NTA5X2F0dC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworaW50IFg1MDlhdF9nZXRfYXR0cl9jb3VudChjb25zdCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngpCit7CisJcmV0dXJuIHNrX1g1MDlfQVRUUklCVVRFX251bSh4KTsKK30KKworaW50IFg1MDlhdF9nZXRfYXR0cl9ieV9OSUQoY29uc3QgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICp4LCBpbnQgbmlkLAorCQkJICBpbnQgbGFzdHBvcykKK3sKKwlBU04xX09CSkVDVCAqb2JqOworCisJb2JqPU9CSl9uaWQyb2JqKG5pZCk7CisJaWYgKG9iaiA9PSBOVUxMKSByZXR1cm4oLTIpOworCXJldHVybihYNTA5YXRfZ2V0X2F0dHJfYnlfT0JKKHgsb2JqLGxhc3Rwb3MpKTsKK30KKworaW50IFg1MDlhdF9nZXRfYXR0cl9ieV9PQkooY29uc3QgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpzaywgQVNOMV9PQkpFQ1QgKm9iaiwKKwkJCSAgaW50IGxhc3Rwb3MpCit7CisJaW50IG47CisJWDUwOV9BVFRSSUJVVEUgKmV4OworCisJaWYgKHNrID09IE5VTEwpIHJldHVybigtMSk7CisJbGFzdHBvcysrOworCWlmIChsYXN0cG9zIDwgMCkKKwkJbGFzdHBvcz0wOworCW49c2tfWDUwOV9BVFRSSUJVVEVfbnVtKHNrKTsKKwlmb3IgKCA7IGxhc3Rwb3MgPCBuOyBsYXN0cG9zKyspCisJCXsKKwkJZXg9c2tfWDUwOV9BVFRSSUJVVEVfdmFsdWUoc2ssbGFzdHBvcyk7CisJCWlmIChPQkpfY21wKGV4LT5vYmplY3Qsb2JqKSA9PSAwKQorCQkJcmV0dXJuKGxhc3Rwb3MpOworCQl9CisJcmV0dXJuKC0xKTsKK30KKworWDUwOV9BVFRSSUJVVEUgKlg1MDlhdF9nZXRfYXR0cihjb25zdCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsIGludCBsb2MpCit7CisJaWYgKHggPT0gTlVMTCB8fCBza19YNTA5X0FUVFJJQlVURV9udW0oeCkgPD0gbG9jIHx8IGxvYyA8IDApCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJcmV0dXJuIHNrX1g1MDlfQVRUUklCVVRFX3ZhbHVlKHgsbG9jKTsKK30KKworWDUwOV9BVFRSSUJVVEUgKlg1MDlhdF9kZWxldGVfYXR0cihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsIGludCBsb2MpCit7CisJWDUwOV9BVFRSSUJVVEUgKnJldDsKKworCWlmICh4ID09IE5VTEwgfHwgc2tfWDUwOV9BVFRSSUJVVEVfbnVtKHgpIDw9IGxvYyB8fCBsb2MgPCAwKQorCQlyZXR1cm4oTlVMTCk7CisJcmV0PXNrX1g1MDlfQVRUUklCVVRFX2RlbGV0ZSh4LGxvYyk7CisJcmV0dXJuKHJldCk7Cit9CisKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKip4LAorCQkJCQkgWDUwOV9BVFRSSUJVVEUgKmF0dHIpCit7CisJWDUwOV9BVFRSSUJVVEUgKm5ld19hdHRyPU5VTEw7CisJU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpzaz1OVUxMOworCisJaWYgKHggPT0gTlVMTCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5QVRfQUREMV9BVFRSLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlnb3RvIGVycjI7CisJCX0gCisKKwlpZiAoKnggPT0gTlVMTCkKKwkJeworCQlpZiAoKHNrPXNrX1g1MDlfQVRUUklCVVRFX25ld19udWxsKCkpID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJc2s9ICp4OworCisJaWYgKChuZXdfYXR0cj1YNTA5X0FUVFJJQlVURV9kdXAoYXR0cikpID09IE5VTEwpCisJCWdvdG8gZXJyMjsKKwlpZiAoIXNrX1g1MDlfQVRUUklCVVRFX3B1c2goc2ssbmV3X2F0dHIpKQorCQlnb3RvIGVycjsKKwlpZiAoKnggPT0gTlVMTCkKKwkJKng9c2s7CisJcmV0dXJuKHNrKTsKK2VycjoKKwlYNTA5ZXJyKFg1MDlfRl9YNTA5QVRfQUREMV9BVFRSLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKK2VycjI6CisJaWYgKG5ld19hdHRyICE9IE5VTEwpIFg1MDlfQVRUUklCVVRFX2ZyZWUobmV3X2F0dHIpOworCWlmIChzayAhPSBOVUxMKSBza19YNTA5X0FUVFJJQlVURV9mcmVlKHNrKTsKKwlyZXR1cm4oTlVMTCk7Cit9CisKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cl9ieV9PQkooU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICoqeCwKKwkJCWNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCit7CisJWDUwOV9BVFRSSUJVVEUgKmF0dHI7CisJU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpyZXQ7CisJYXR0ciA9IFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkooTlVMTCwgb2JqLCB0eXBlLCBieXRlcywgbGVuKTsKKwlpZighYXR0cikgcmV0dXJuIDA7CisJcmV0ID0gWDUwOWF0X2FkZDFfYXR0cih4LCBhdHRyKTsKKwlYNTA5X0FUVFJJQlVURV9mcmVlKGF0dHIpOworCXJldHVybiByZXQ7Cit9CisKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cl9ieV9OSUQoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICoqeCwKKwkJCWludCBuaWQsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCit7CisJWDUwOV9BVFRSSUJVVEUgKmF0dHI7CisJU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpyZXQ7CisJYXR0ciA9IFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9OSUQoTlVMTCwgbmlkLCB0eXBlLCBieXRlcywgbGVuKTsKKwlpZighYXR0cikgcmV0dXJuIDA7CisJcmV0ID0gWDUwOWF0X2FkZDFfYXR0cih4LCBhdHRyKTsKKwlYNTA5X0FUVFJJQlVURV9mcmVlKGF0dHIpOworCXJldHVybiByZXQ7Cit9CisKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cl9ieV90eHQoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICoqeCwKKwkJCWNvbnN0IGNoYXIgKmF0dHJuYW1lLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQoreworCVg1MDlfQVRUUklCVVRFICphdHRyOworCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqcmV0OworCWF0dHIgPSBYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfdHh0KE5VTEwsIGF0dHJuYW1lLCB0eXBlLCBieXRlcywgbGVuKTsKKwlpZighYXR0cikgcmV0dXJuIDA7CisJcmV0ID0gWDUwOWF0X2FkZDFfYXR0cih4LCBhdHRyKTsKKwlYNTA5X0FUVFJJQlVURV9mcmVlKGF0dHIpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgKlg1MDlhdF9nZXQwX2RhdGFfYnlfT0JKKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqeCwKKwkJCQlBU04xX09CSkVDVCAqb2JqLCBpbnQgbGFzdHBvcywgaW50IHR5cGUpCit7CisJaW50IGk7CisJWDUwOV9BVFRSSUJVVEUgKmF0OworCWkgPSBYNTA5YXRfZ2V0X2F0dHJfYnlfT0JKKHgsIG9iaiwgbGFzdHBvcyk7CisJaWYgKGkgPT0gLTEpCisJCXJldHVybiBOVUxMOworCWlmICgobGFzdHBvcyA8PSAtMikgJiYgKFg1MDlhdF9nZXRfYXR0cl9ieV9PQkooeCwgb2JqLCBpKSAhPSAtMSkpCisJCXJldHVybiBOVUxMOworCWF0ID0gWDUwOWF0X2dldF9hdHRyKHgsIGkpOworCWlmIChsYXN0cG9zIDw9IC0zICYmIChYNTA5X0FUVFJJQlVURV9jb3VudChhdCkgIT0gMSkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBYNTA5X0FUVFJJQlVURV9nZXQwX2RhdGEoYXQsIDAsIHR5cGUsIE5VTEwpOworfQorCitYNTA5X0FUVFJJQlVURSAqWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X05JRChYNTA5X0FUVFJJQlVURSAqKmF0dHIsIGludCBuaWQsCisJICAgICBpbnQgYXRydHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlBU04xX09CSkVDVCAqb2JqOworCVg1MDlfQVRUUklCVVRFICpyZXQ7CisKKwlvYmo9T0JKX25pZDJvYmoobmlkKTsKKwlpZiAob2JqID09IE5VTEwpCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfQ1JFQVRFX0JZX05JRCxYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlyZXQ9WDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X09CSihhdHRyLG9iaixhdHJ0eXBlLGRhdGEsbGVuKTsKKwlpZiAocmV0ID09IE5VTEwpIEFTTjFfT0JKRUNUX2ZyZWUob2JqKTsKKwlyZXR1cm4ocmV0KTsKK30KKworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkooWDUwOV9BVFRSSUJVVEUgKiphdHRyLAorCSAgICAgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGF0cnR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJWDUwOV9BVFRSSUJVVEUgKnJldDsKKworCWlmICgoYXR0ciA9PSBOVUxMKSB8fCAoKmF0dHIgPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9WDUwOV9BVFRSSUJVVEVfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X0FUVFJJQlVURV9DUkVBVEVfQllfT0JKLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJcmV0PSAqYXR0cjsKKworCWlmICghWDUwOV9BVFRSSUJVVEVfc2V0MV9vYmplY3QocmV0LG9iaikpCisJCWdvdG8gZXJyOworCWlmICghWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhKHJldCxhdHJ0eXBlLGRhdGEsbGVuKSkKKwkJZ290byBlcnI7CisKKwlpZiAoKGF0dHIgIT0gTlVMTCkgJiYgKCphdHRyID09IE5VTEwpKSAqYXR0cj1yZXQ7CisJcmV0dXJuKHJldCk7CitlcnI6CisJaWYgKChhdHRyID09IE5VTEwpIHx8IChyZXQgIT0gKmF0dHIpKQorCQlYNTA5X0FUVFJJQlVURV9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworfQorCitYNTA5X0FUVFJJQlVURSAqWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X3R4dChYNTA5X0FUVFJJQlVURSAqKmF0dHIsCisJCWNvbnN0IGNoYXIgKmF0cm5hbWUsIGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKKwl7CisJQVNOMV9PQkpFQ1QgKm9iajsKKwlYNTA5X0FUVFJJQlVURSAqbmF0dHI7CisKKwlvYmo9T0JKX3R4dDJvYmooYXRybmFtZSwgMCk7CisJaWYgKG9iaiA9PSBOVUxMKQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfQVRUUklCVVRFX0NSRUFURV9CWV9UWFQsCisJCQkJCQlYNTA5X1JfSU5WQUxJRF9GSUVMRF9OQU1FKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJuYW1lPSIsIGF0cm5hbWUpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwluYXR0ciA9IFg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV9PQkooYXR0cixvYmosdHlwZSxieXRlcyxsZW4pOworCUFTTjFfT0JKRUNUX2ZyZWUob2JqKTsKKwlyZXR1cm4gbmF0dHI7CisJfQorCitpbnQgWDUwOV9BVFRSSUJVVEVfc2V0MV9vYmplY3QoWDUwOV9BVFRSSUJVVEUgKmF0dHIsIGNvbnN0IEFTTjFfT0JKRUNUICpvYmopCit7CisJaWYgKChhdHRyID09IE5VTEwpIHx8IChvYmogPT0gTlVMTCkpCisJCXJldHVybigwKTsKKwlBU04xX09CSkVDVF9mcmVlKGF0dHItPm9iamVjdCk7CisJYXR0ci0+b2JqZWN0PU9CSl9kdXAob2JqKTsKKwlyZXR1cm4oMSk7Cit9CisKK2ludCBYNTA5X0FUVFJJQlVURV9zZXQxX2RhdGEoWDUwOV9BVFRSSUJVVEUgKmF0dHIsIGludCBhdHRydHlwZSwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlBU04xX1RZUEUgKnR0bXA7CisJQVNOMV9TVFJJTkcgKnN0bXAgPSBOVUxMOworCWludCBhdHlwZSA9IDA7CisJaWYgKCFhdHRyKSByZXR1cm4gMDsKKwlpZihhdHRydHlwZSAmIE1CU1RSSU5HX0ZMQUcpIHsKKwkJc3RtcCA9IEFTTjFfU1RSSU5HX3NldF9ieV9OSUQoTlVMTCwgZGF0YSwgbGVuLCBhdHRydHlwZSwKKwkJCQkJCU9CSl9vYmoybmlkKGF0dHItPm9iamVjdCkpOworCQlpZighc3RtcCkgeworCQkJWDUwOWVycihYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfU0VUMV9EQVRBLCBFUlJfUl9BU04xX0xJQik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlhdHlwZSA9IHN0bXAtPnR5cGU7CisJfSBlbHNlIGlmIChsZW4gIT0gLTEpeworCQlpZighKHN0bXAgPSBBU04xX1NUUklOR190eXBlX25ldyhhdHRydHlwZSkpKSBnb3RvIGVycjsKKwkJaWYoIUFTTjFfU1RSSU5HX3NldChzdG1wLCBkYXRhLCBsZW4pKSBnb3RvIGVycjsKKwkJYXR5cGUgPSBhdHRydHlwZTsKKwl9CisJaWYoIShhdHRyLT52YWx1ZS5zZXQgPSBza19BU04xX1RZUEVfbmV3X251bGwoKSkpIGdvdG8gZXJyOworCWF0dHItPnNpbmdsZSA9IDA7CisJLyogVGhpcyBpcyBhIGJpdCBuYXVnaHR5IGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBzaG91bGQgcmVhbGx5IGhhdmUKKwkgKiBhdCBsZWFzdCBvbmUgdmFsdWUgYnV0IHNvbWUgdHlwZXMgdXNlIGFuZCB6ZXJvIGxlbmd0aCBTRVQgYW5kCisJICogcmVxdWlyZSB0aGlzLgorCSAqLworCWlmIChhdHRydHlwZSA9PSAwKQorCQlyZXR1cm4gMTsKKwlpZighKHR0bXAgPSBBU04xX1RZUEVfbmV3KCkpKSBnb3RvIGVycjsKKwlpZiAoKGxlbiA9PSAtMSkgJiYgIShhdHRydHlwZSAmIE1CU1RSSU5HX0ZMQUcpKQorCQl7CisJCWlmICghQVNOMV9UWVBFX3NldDEodHRtcCwgYXR0cnR5cGUsIGRhdGEpKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCUFTTjFfVFlQRV9zZXQodHRtcCwgYXR5cGUsIHN0bXApOworCWlmKCFza19BU04xX1RZUEVfcHVzaChhdHRyLT52YWx1ZS5zZXQsIHR0bXApKSBnb3RvIGVycjsKKwlyZXR1cm4gMTsKKwllcnI6CisJWDUwOWVycihYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfU0VUMV9EQVRBLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBYNTA5X0FUVFJJQlVURV9jb3VudChYNTA5X0FUVFJJQlVURSAqYXR0cikKK3sKKwlpZighYXR0ci0+c2luZ2xlKSByZXR1cm4gc2tfQVNOMV9UWVBFX251bShhdHRyLT52YWx1ZS5zZXQpOworCWlmKGF0dHItPnZhbHVlLnNpbmdsZSkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK0FTTjFfT0JKRUNUICpYNTA5X0FUVFJJQlVURV9nZXQwX29iamVjdChYNTA5X0FUVFJJQlVURSAqYXR0cikKK3sKKwlpZiAoYXR0ciA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJcmV0dXJuKGF0dHItPm9iamVjdCk7Cit9CisKK3ZvaWQgKlg1MDlfQVRUUklCVVRFX2dldDBfZGF0YShYNTA5X0FUVFJJQlVURSAqYXR0ciwgaW50IGlkeCwKKwkJCQkJaW50IGF0cnR5cGUsIHZvaWQgKmRhdGEpCit7CisJQVNOMV9UWVBFICp0dG1wOworCXR0bXAgPSBYNTA5X0FUVFJJQlVURV9nZXQwX3R5cGUoYXR0ciwgaWR4KTsKKwlpZighdHRtcCkgcmV0dXJuIE5VTEw7CisJaWYoYXRydHlwZSAhPSBBU04xX1RZUEVfZ2V0KHR0bXApKXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfR0VUMF9EQVRBLCBYNTA5X1JfV1JPTkdfVFlQRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gdHRtcC0+dmFsdWUucHRyOworfQorCitBU04xX1RZUEUgKlg1MDlfQVRUUklCVVRFX2dldDBfdHlwZShYNTA5X0FUVFJJQlVURSAqYXR0ciwgaW50IGlkeCkKK3sKKwlpZiAoYXR0ciA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJaWYoaWR4ID49IFg1MDlfQVRUUklCVVRFX2NvdW50KGF0dHIpKSByZXR1cm4gTlVMTDsKKwlpZighYXR0ci0+c2luZ2xlKSByZXR1cm4gc2tfQVNOMV9UWVBFX3ZhbHVlKGF0dHItPnZhbHVlLnNldCwgaWR4KTsKKwllbHNlIHJldHVybiBhdHRyLT52YWx1ZS5zaW5nbGU7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2NtcC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmM5ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9jbXAuYwpAQCAtMCwwICsxLDMzMSBAQAorLyogY3J5cHRvL3g1MDkveDUwOV9jbXAuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworaW50IFg1MDlfaXNzdWVyX2FuZF9zZXJpYWxfY21wKGNvbnN0IFg1MDkgKmEsIGNvbnN0IFg1MDkgKmIpCisJeworCWludCBpOworCVg1MDlfQ0lORiAqYWksKmJpOworCisJYWk9YS0+Y2VydF9pbmZvOworCWJpPWItPmNlcnRfaW5mbzsKKwlpPU1fQVNOMV9JTlRFR0VSX2NtcChhaS0+c2VyaWFsTnVtYmVyLGJpLT5zZXJpYWxOdW1iZXIpOworCWlmIChpKSByZXR1cm4oaSk7CisJcmV0dXJuKFg1MDlfTkFNRV9jbXAoYWktPmlzc3VlcixiaS0+aXNzdWVyKSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1Cit1bnNpZ25lZCBsb25nIFg1MDlfaXNzdWVyX2FuZF9zZXJpYWxfaGFzaChYNTA5ICphKQorCXsKKwl1bnNpZ25lZCBsb25nIHJldD0wOworCUVWUF9NRF9DVFggY3R4OworCXVuc2lnbmVkIGNoYXIgbWRbMTZdOworCWNoYXIgKmY7CisKKwlFVlBfTURfQ1RYX2luaXQoJmN0eCk7CisJZj1YNTA5X05BTUVfb25lbGluZShhLT5jZXJ0X2luZm8tPmlzc3VlcixOVUxMLDApOworCXJldD1zdHJsZW4oZik7CisJRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCwgRVZQX21kNSgpLCBOVUxMKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsKHVuc2lnbmVkIGNoYXIgKilmLHJldCk7CisJT1BFTlNTTF9mcmVlKGYpOworCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwodW5zaWduZWQgY2hhciAqKWEtPmNlcnRfaW5mby0+c2VyaWFsTnVtYmVyLT5kYXRhLAorCQkodW5zaWduZWQgbG9uZylhLT5jZXJ0X2luZm8tPnNlcmlhbE51bWJlci0+bGVuZ3RoKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgoJmN0eCwmKG1kWzBdKSxOVUxMKTsKKwlyZXQ9KAkoKHVuc2lnbmVkIGxvbmcpbWRbMF0gICAgICl8KCh1bnNpZ25lZCBsb25nKW1kWzFdPDw4TCl8CisJCSgodW5zaWduZWQgbG9uZyltZFsyXTw8MTZMKXwoKHVuc2lnbmVkIGxvbmcpbWRbM108PDI0TCkKKwkJKSYweGZmZmZmZmZmTDsKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisJCitpbnQgWDUwOV9pc3N1ZXJfbmFtZV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYikKKwl7CisJcmV0dXJuKFg1MDlfTkFNRV9jbXAoYS0+Y2VydF9pbmZvLT5pc3N1ZXIsYi0+Y2VydF9pbmZvLT5pc3N1ZXIpKTsKKwl9CisKK2ludCBYNTA5X3N1YmplY3RfbmFtZV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYikKKwl7CisJcmV0dXJuKFg1MDlfTkFNRV9jbXAoYS0+Y2VydF9pbmZvLT5zdWJqZWN0LGItPmNlcnRfaW5mby0+c3ViamVjdCkpOworCX0KKworaW50IFg1MDlfQ1JMX2NtcChjb25zdCBYNTA5X0NSTCAqYSwgY29uc3QgWDUwOV9DUkwgKmIpCisJeworCXJldHVybihYNTA5X05BTUVfY21wKGEtPmNybC0+aXNzdWVyLGItPmNybC0+aXNzdWVyKSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCitpbnQgWDUwOV9DUkxfbWF0Y2goY29uc3QgWDUwOV9DUkwgKmEsIGNvbnN0IFg1MDlfQ1JMICpiKQorCXsKKwlyZXR1cm4gbWVtY21wKGEtPnNoYTFfaGFzaCwgYi0+c2hhMV9oYXNoLCAyMCk7CisJfQorI2VuZGlmCisKK1g1MDlfTkFNRSAqWDUwOV9nZXRfaXNzdWVyX25hbWUoWDUwOSAqYSkKKwl7CisJcmV0dXJuKGEtPmNlcnRfaW5mby0+aXNzdWVyKTsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgWDUwOV9pc3N1ZXJfbmFtZV9oYXNoKFg1MDkgKngpCisJeworCXJldHVybihYNTA5X05BTUVfaGFzaCh4LT5jZXJ0X2luZm8tPmlzc3VlcikpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX01ENQordW5zaWduZWQgbG9uZyBYNTA5X2lzc3Vlcl9uYW1lX2hhc2hfb2xkKFg1MDkgKngpCisJeworCXJldHVybihYNTA5X05BTUVfaGFzaF9vbGQoeC0+Y2VydF9pbmZvLT5pc3N1ZXIpKTsKKwl9CisjZW5kaWYKKworWDUwOV9OQU1FICpYNTA5X2dldF9zdWJqZWN0X25hbWUoWDUwOSAqYSkKKwl7CisJcmV0dXJuKGEtPmNlcnRfaW5mby0+c3ViamVjdCk7CisJfQorCitBU04xX0lOVEVHRVIgKlg1MDlfZ2V0X3NlcmlhbE51bWJlcihYNTA5ICphKQorCXsKKwlyZXR1cm4oYS0+Y2VydF9pbmZvLT5zZXJpYWxOdW1iZXIpOworCX0KKwordW5zaWduZWQgbG9uZyBYNTA5X3N1YmplY3RfbmFtZV9oYXNoKFg1MDkgKngpCisJeworCXJldHVybihYNTA5X05BTUVfaGFzaCh4LT5jZXJ0X2luZm8tPnN1YmplY3QpKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKK3Vuc2lnbmVkIGxvbmcgWDUwOV9zdWJqZWN0X25hbWVfaGFzaF9vbGQoWDUwOSAqeCkKKwl7CisJcmV0dXJuKFg1MDlfTkFNRV9oYXNoX29sZCh4LT5jZXJ0X2luZm8tPnN1YmplY3QpKTsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1NIQQorLyogQ29tcGFyZSB0d28gY2VydGlmaWNhdGVzOiB0aGV5IG11c3QgYmUgaWRlbnRpY2FsIGZvcgorICogdGhpcyB0byB3b3JrLiBOQjogQWx0aG91Z2ggImNtcCIgb3BlcmF0aW9ucyBhcmUgZ2VuZXJhbGx5CisgKiBwcm90b3R5cGVkIHRvIHRha2UgImNvbnN0IiBhcmd1bWVudHMgKGVnLiBmb3IgdXNlIGluCisgKiBTVEFDS3MpLCB0aGUgd2F5IFg1MDkgaGFuZGxpbmcgaXMgLSB0aGVzZSBvcGVyYXRpb25zIG1heQorICogaW52b2x2ZSBlbnN1cmluZyB0aGUgaGFzaGVzIGFyZSB1cC10by1kYXRlIGFuZCBlbnN1cmluZworICogY2VydGFpbiBjZXJ0IGluZm9ybWF0aW9uIGlzIGNhY2hlZC4gU28gdGhpcyBpcyB0aGUgcG9pbnQKKyAqIHdoZXJlIHRoZSAiZGVwdGgtZmlyc3QiIGNvbnN0aWZpY2F0aW9uIHRyZWUgaGFzIHRvIGhhbHQKKyAqIHdpdGggYW4gZXZpbCBjYXN0LgorICovCitpbnQgWDUwOV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYikKK3sKKwkvKiBlbnN1cmUgaGFzaCBpcyB2YWxpZCAqLworCVg1MDlfY2hlY2tfcHVycG9zZSgoWDUwOSAqKWEsIC0xLCAwKTsKKwlYNTA5X2NoZWNrX3B1cnBvc2UoKFg1MDkgKiliLCAtMSwgMCk7CisKKwlyZXR1cm4gbWVtY21wKGEtPnNoYTFfaGFzaCwgYi0+c2hhMV9oYXNoLCBTSEFfRElHRVNUX0xFTkdUSCk7Cit9CisjZW5kaWYKKworCitpbnQgWDUwOV9OQU1FX2NtcChjb25zdCBYNTA5X05BTUUgKmEsIGNvbnN0IFg1MDlfTkFNRSAqYikKKwl7CisJaW50IHJldDsKKworCS8qIEVuc3VyZSBjYW5vbmljYWwgZW5jb2RpbmcgaXMgcHJlc2VudCBhbmQgdXAgdG8gZGF0ZSAqLworCisJaWYgKCFhLT5jYW5vbl9lbmMgfHwgYS0+bW9kaWZpZWQpCisJCXsKKwkJcmV0ID0gaTJkX1g1MDlfTkFNRSgoWDUwOV9OQU1FICopYSwgTlVMTCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIC0yOworCQl9CisKKwlpZiAoIWItPmNhbm9uX2VuYyB8fCBiLT5tb2RpZmllZCkKKwkJeworCQlyZXQgPSBpMmRfWDUwOV9OQU1FKChYNTA5X05BTUUgKiliLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gLTI7CisJCX0KKworCXJldCA9IGEtPmNhbm9uX2VuY2xlbiAtIGItPmNhbm9uX2VuY2xlbjsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gbWVtY21wKGEtPmNhbm9uX2VuYywgYi0+Y2Fub25fZW5jLCBhLT5jYW5vbl9lbmNsZW4pOworCisJfQorCit1bnNpZ25lZCBsb25nIFg1MDlfTkFNRV9oYXNoKFg1MDlfTkFNRSAqeCkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQ9MDsKKwl1bnNpZ25lZCBjaGFyIG1kW1NIQV9ESUdFU1RfTEVOR1RIXTsKKworCS8qIE1ha2Ugc3VyZSBYNTA5X05BTUUgc3RydWN0dXJlIGNvbnRhaW5zIHZhbGlkIGNhY2hlZCBlbmNvZGluZyAqLworCWkyZF9YNTA5X05BTUUoeCxOVUxMKTsKKwlFVlBfRGlnZXN0KHgtPmNhbm9uX2VuYywgeC0+Y2Fub25fZW5jbGVuLCBtZCwgTlVMTCwgRVZQX3NoYTEoKSwgTlVMTCk7CisKKwlyZXQ9KAkoKHVuc2lnbmVkIGxvbmcpbWRbMF0gICAgICl8KCh1bnNpZ25lZCBsb25nKW1kWzFdPDw4TCl8CisJCSgodW5zaWduZWQgbG9uZyltZFsyXTw8MTZMKXwoKHVuc2lnbmVkIGxvbmcpbWRbM108PDI0TCkKKwkJKSYweGZmZmZmZmZmTDsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKworI2lmbmRlZiBPUEVOU1NMX05PX01ENQorLyogSSBub3cgREVSIGVuY29kZSB0aGUgbmFtZSBhbmQgaGFzaCBpdC4gIFNpbmNlIEkgY2FjaGUgdGhlIERFUiBlbmNvZGluZywKKyAqIHRoaXMgaXMgcmVhc29uYWJseSBlZmZpY2llbnQuICovCisKK3Vuc2lnbmVkIGxvbmcgWDUwOV9OQU1FX2hhc2hfb2xkKFg1MDlfTkFNRSAqeCkKKwl7CisJdW5zaWduZWQgbG9uZyByZXQ9MDsKKwl1bnNpZ25lZCBjaGFyIG1kWzE2XTsKKworCS8qIE1ha2Ugc3VyZSBYNTA5X05BTUUgc3RydWN0dXJlIGNvbnRhaW5zIHZhbGlkIGNhY2hlZCBlbmNvZGluZyAqLworCWkyZF9YNTA5X05BTUUoeCxOVUxMKTsKKwlFVlBfRGlnZXN0KHgtPmJ5dGVzLT5kYXRhLCB4LT5ieXRlcy0+bGVuZ3RoLCBtZCwgTlVMTCwgRVZQX21kNSgpLCBOVUxMKTsKKworCXJldD0oCSgodW5zaWduZWQgbG9uZyltZFswXSAgICAgKXwoKHVuc2lnbmVkIGxvbmcpbWRbMV08PDhMKXwKKwkJKCh1bnNpZ25lZCBsb25nKW1kWzJdPDwxNkwpfCgodW5zaWduZWQgbG9uZyltZFszXTw8MjRMKQorCQkpJjB4ZmZmZmZmZmZMOworCXJldHVybihyZXQpOworCX0KKyNlbmRpZgorCisvKiBTZWFyY2ggYSBzdGFjayBvZiBYNTA5IGZvciBhIG1hdGNoICovCitYNTA5ICpYNTA5X2ZpbmRfYnlfaXNzdWVyX2FuZF9zZXJpYWwoU1RBQ0tfT0YoWDUwOSkgKnNrLCBYNTA5X05BTUUgKm5hbWUsCisJCUFTTjFfSU5URUdFUiAqc2VyaWFsKQorCXsKKwlpbnQgaTsKKwlYNTA5X0NJTkYgY2luZjsKKwlYNTA5IHgsKng1MDk9TlVMTDsKKworCWlmKCFzaykgcmV0dXJuIE5VTEw7CisKKwl4LmNlcnRfaW5mbz0gJmNpbmY7CisJY2luZi5zZXJpYWxOdW1iZXI9c2VyaWFsOworCWNpbmYuaXNzdWVyPW5hbWU7CisKKwlmb3IgKGk9MDsgaTxza19YNTA5X251bShzayk7IGkrKykKKwkJeworCQl4NTA5PXNrX1g1MDlfdmFsdWUoc2ssaSk7CisJCWlmIChYNTA5X2lzc3Vlcl9hbmRfc2VyaWFsX2NtcCh4NTA5LCZ4KSA9PSAwKQorCQkJcmV0dXJuKHg1MDkpOworCQl9CisJcmV0dXJuKE5VTEwpOworCX0KKworWDUwOSAqWDUwOV9maW5kX2J5X3N1YmplY3QoU1RBQ0tfT0YoWDUwOSkgKnNrLCBYNTA5X05BTUUgKm5hbWUpCisJeworCVg1MDkgKng1MDk7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaTxza19YNTA5X251bShzayk7IGkrKykKKwkJeworCQl4NTA5PXNrX1g1MDlfdmFsdWUoc2ssaSk7CisJCWlmIChYNTA5X05BTUVfY21wKFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4NTA5KSxuYW1lKSA9PSAwKQorCQkJcmV0dXJuKHg1MDkpOworCQl9CisJcmV0dXJuKE5VTEwpOworCX0KKworRVZQX1BLRVkgKlg1MDlfZ2V0X3B1YmtleShYNTA5ICp4KQorCXsKKwlpZiAoKHggPT0gTlVMTCkgfHwgKHgtPmNlcnRfaW5mbyA9PSBOVUxMKSkKKwkJcmV0dXJuKE5VTEwpOworCXJldHVybihYNTA5X1BVQktFWV9nZXQoeC0+Y2VydF9pbmZvLT5rZXkpKTsKKwl9CisKK0FTTjFfQklUX1NUUklORyAqWDUwOV9nZXQwX3B1YmtleV9iaXRzdHIoY29uc3QgWDUwOSAqeCkKKwl7CisJaWYoIXgpIHJldHVybiBOVUxMOworCXJldHVybiB4LT5jZXJ0X2luZm8tPmtleS0+cHVibGljX2tleTsKKwl9CisKK2ludCBYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KFg1MDkgKngsIEVWUF9QS0VZICprKQorCXsKKwlFVlBfUEtFWSAqeGs7CisJaW50IHJldDsKKworCXhrPVg1MDlfZ2V0X3B1YmtleSh4KTsKKworCWlmICh4aykKKwkJcmV0ID0gRVZQX1BLRVlfY21wKHhrLCBrKTsKKwllbHNlCisJCXJldCA9IC0yOworCisJc3dpdGNoIChyZXQpCisJCXsKKwljYXNlIDE6CisJCWJyZWFrOworCWNhc2UgMDoKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9DSEVDS19QUklWQVRFX0tFWSxYNTA5X1JfS0VZX1ZBTFVFU19NSVNNQVRDSCk7CisJCWJyZWFrOworCWNhc2UgLTE6CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfQ0hFQ0tfUFJJVkFURV9LRVksWDUwOV9SX0tFWV9UWVBFX01JU01BVENIKTsKKwkJYnJlYWs7CisJY2FzZSAtMjoKKwkgICAgICAgIFg1MDllcnIoWDUwOV9GX1g1MDlfQ0hFQ0tfUFJJVkFURV9LRVksWDUwOV9SX1VOS05PV05fS0VZX1RZUEUpOworCQl9CisJaWYgKHhrKQorCQlFVlBfUEtFWV9mcmVlKHhrKTsKKwlpZiAocmV0ID4gMCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9kMi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9kMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDEwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2QyLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfZDIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworaW50IFg1MDlfU1RPUkVfc2V0X2RlZmF1bHRfcGF0aHMoWDUwOV9TVE9SRSAqY3R4KQorCXsKKwlYNTA5X0xPT0tVUCAqbG9va3VwOworCisJbG9va3VwPVg1MDlfU1RPUkVfYWRkX2xvb2t1cChjdHgsWDUwOV9MT09LVVBfZmlsZSgpKTsKKwlpZiAobG9va3VwID09IE5VTEwpIHJldHVybigwKTsKKwlYNTA5X0xPT0tVUF9sb2FkX2ZpbGUobG9va3VwLE5VTEwsWDUwOV9GSUxFVFlQRV9ERUZBVUxUKTsKKworCWxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoY3R4LFg1MDlfTE9PS1VQX2hhc2hfZGlyKCkpOworCWlmIChsb29rdXAgPT0gTlVMTCkgcmV0dXJuKDApOworCVg1MDlfTE9PS1VQX2FkZF9kaXIobG9va3VwLE5VTEwsWDUwOV9GSUxFVFlQRV9ERUZBVUxUKTsKKwkKKwkvKiBjbGVhciBhbnkgZXJyb3JzICovCisJRVJSX2NsZWFyX2Vycm9yKCk7CisKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhYNTA5X1NUT1JFICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsCisJCWNvbnN0IGNoYXIgKnBhdGgpCisJeworCVg1MDlfTE9PS1VQICpsb29rdXA7CisKKwlpZiAoZmlsZSAhPSBOVUxMKQorCQl7CisJCWxvb2t1cD1YNTA5X1NUT1JFX2FkZF9sb29rdXAoY3R4LFg1MDlfTE9PS1VQX2ZpbGUoKSk7CisJCWlmIChsb29rdXAgPT0gTlVMTCkgcmV0dXJuKDApOworCQlpZiAoWDUwOV9MT09LVVBfbG9hZF9maWxlKGxvb2t1cCxmaWxlLFg1MDlfRklMRVRZUEVfUEVNKSAhPSAxKQorCQkgICAgcmV0dXJuKDApOworCQl9CisJaWYgKHBhdGggIT0gTlVMTCkKKwkJeworCQlsb29rdXA9WDUwOV9TVE9SRV9hZGRfbG9va3VwKGN0eCxYNTA5X0xPT0tVUF9oYXNoX2RpcigpKTsKKwkJaWYgKGxvb2t1cCA9PSBOVUxMKSByZXR1cm4oMCk7CisJCWlmIChYNTA5X0xPT0tVUF9hZGRfZGlyKGxvb2t1cCxwYXRoLFg1MDlfRklMRVRZUEVfUEVNKSAhPSAxKQorCQkgICAgcmV0dXJuKDApOworCQl9CisJaWYgKChwYXRoID09IE5VTEwpICYmIChmaWxlID09IE5VTEwpKQorCQlyZXR1cm4oMCk7CisJcmV0dXJuKDEpOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2RlZi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9kZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGFjMTUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9kZWYuYwpAQCAtMCwwICsxLDgxIEBACisvKiBjcnlwdG8veDUwOS94NTA5X2RlZi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworY29uc3QgY2hhciAqWDUwOV9nZXRfZGVmYXVsdF9wcml2YXRlX2Rpcih2b2lkKQorCXsgcmV0dXJuKFg1MDlfUFJJVkFURV9ESVIpOyB9CisJCitjb25zdCBjaGFyICpYNTA5X2dldF9kZWZhdWx0X2NlcnRfYXJlYSh2b2lkKQorCXsgcmV0dXJuKFg1MDlfQ0VSVF9BUkVBKTsgfQorCitjb25zdCBjaGFyICpYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyKHZvaWQpCisJeyByZXR1cm4oWDUwOV9DRVJUX0RJUik7IH0KKworY29uc3QgY2hhciAqWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2ZpbGUodm9pZCkKKwl7IHJldHVybihYNTA5X0NFUlRfRklMRSk7IH0KKworY29uc3QgY2hhciAqWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2Rpcl9lbnYodm9pZCkKKwl7IHJldHVybihYNTA5X0NFUlRfRElSX0VWUCk7IH0KKworY29uc3QgY2hhciAqWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2ZpbGVfZW52KHZvaWQpCisJeyByZXR1cm4oWDUwOV9DRVJUX0ZJTEVfRVZQKTsgfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X2Vyci5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9lcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE0MDJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9lcnIuYwpAQCAtMCwwICsxLDE2NCBAQAorLyogY3J5cHRvL3g1MDkveDUwOV9lcnIuYyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIE5PVEU6IHRoaXMgZmlsZSB3YXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIG1rZXJyLnBsIHNjcmlwdDogYW55IGNoYW5nZXMKKyAqIG1hZGUgdG8gaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgbmV4dCB1cGRhdGVzIHRoaXMgZmlsZSwKKyAqIG9ubHkgcmVhc29uIHN0cmluZ3Mgd2lsbCBiZSBwcmVzZXJ2ZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworI2RlZmluZSBFUlJfRlVOQyhmdW5jKSBFUlJfUEFDSyhFUlJfTElCX1g1MDksZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9YNTA5LDAscmVhc29uKQorCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFg1MDlfc3RyX2Z1bmN0c1tdPQorCXsKK3tFUlJfRlVOQyhYNTA5X0ZfQUREX0NFUlRfRElSKSwJIkFERF9DRVJUX0RJUiJ9LAore0VSUl9GVU5DKFg1MDlfRl9CWV9GSUxFX0NUUkwpLAkiQllfRklMRV9DVFJMIn0sCit7RVJSX0ZVTkMoWDUwOV9GX0NIRUNLX1BPTElDWSksCSJDSEVDS19QT0xJQ1kifSwKK3tFUlJfRlVOQyhYNTA5X0ZfRElSX0NUUkwpLAkiRElSX0NUUkwifSwKK3tFUlJfRlVOQyhYNTA5X0ZfR0VUX0NFUlRfQllfU1VCSkVDVCksCSJHRVRfQ0VSVF9CWV9TVUJKRUNUIn0sCit7RVJSX0ZVTkMoWDUwOV9GX05FVFNDQVBFX1NQS0lfQjY0X0RFQ09ERSksCSJORVRTQ0FQRV9TUEtJX2I2NF9kZWNvZGUifSwKK3tFUlJfRlVOQyhYNTA5X0ZfTkVUU0NBUEVfU1BLSV9CNjRfRU5DT0RFKSwJIk5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZSJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5QVRfQUREMV9BVFRSKSwJIlg1MDlhdF9hZGQxX2F0dHIifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOVYzX0FERF9FWFQpLAkiWDUwOXYzX2FkZF9leHQifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfQ1JFQVRFX0JZX05JRCksCSJYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklEIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfQVRUUklCVVRFX0NSRUFURV9CWV9PQkopLAkiWDUwOV9BVFRSSUJVVEVfY3JlYXRlX2J5X09CSiJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X0FUVFJJQlVURV9DUkVBVEVfQllfVFhUKSwJIlg1MDlfQVRUUklCVVRFX2NyZWF0ZV9ieV90eHQifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOV9BVFRSSUJVVEVfR0VUMF9EQVRBKSwJIlg1MDlfQVRUUklCVVRFX2dldDBfZGF0YSJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X0FUVFJJQlVURV9TRVQxX0RBVEEpLAkiWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfQ0hFQ0tfUFJJVkFURV9LRVkpLAkiWDUwOV9jaGVja19wcml2YXRlX2tleSJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X0NSTF9QUklOVF9GUCksCSJYNTA5X0NSTF9wcmludF9mcCJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X0VYVEVOU0lPTl9DUkVBVEVfQllfTklEKSwJIlg1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9OSUQifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOV9FWFRFTlNJT05fQ1JFQVRFX0JZX09CSiksCSJYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfR0VUX1BVQktFWV9QQVJBTUVURVJTKSwJIlg1MDlfZ2V0X3B1YmtleV9wYXJhbWV0ZXJzIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfTE9BRF9DRVJUX0NSTF9GSUxFKSwJIlg1MDlfbG9hZF9jZXJ0X2NybF9maWxlIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfTE9BRF9DRVJUX0ZJTEUpLAkiWDUwOV9sb2FkX2NlcnRfZmlsZSJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X0xPQURfQ1JMX0ZJTEUpLAkiWDUwOV9sb2FkX2NybF9maWxlIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfTkFNRV9BRERfRU5UUlkpLAkiWDUwOV9OQU1FX2FkZF9lbnRyeSJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X05BTUVfRU5UUllfQ1JFQVRFX0JZX05JRCksCSJYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X05JRCJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X05BTUVfRU5UUllfQ1JFQVRFX0JZX1RYVCksCSJYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X3R4dCJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X05BTUVfRU5UUllfU0VUX09CSkVDVCksCSJYNTA5X05BTUVfRU5UUllfc2V0X29iamVjdCJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X05BTUVfT05FTElORSksCSJYNTA5X05BTUVfb25lbGluZSJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X05BTUVfUFJJTlQpLAkiWDUwOV9OQU1FX3ByaW50In0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfUFJJTlRfRVhfRlApLAkiWDUwOV9wcmludF9leF9mcCJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X1BVQktFWV9HRVQpLAkiWDUwOV9QVUJLRVlfZ2V0In0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfUFVCS0VZX1NFVCksCSJYNTA5X1BVQktFWV9zZXQifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOV9SRVFfQ0hFQ0tfUFJJVkFURV9LRVkpLAkiWDUwOV9SRVFfY2hlY2tfcHJpdmF0ZV9rZXkifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOV9SRVFfUFJJTlRfRVgpLAkiWDUwOV9SRVFfcHJpbnRfZXgifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOV9SRVFfUFJJTlRfRlApLAkiWDUwOV9SRVFfcHJpbnRfZnAifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOV9SRVFfVE9fWDUwOSksCSJYNTA5X1JFUV90b19YNTA5In0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfU1RPUkVfQUREX0NFUlQpLAkiWDUwOV9TVE9SRV9hZGRfY2VydCJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X1NUT1JFX0FERF9DUkwpLAkiWDUwOV9TVE9SRV9hZGRfY3JsIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX0dFVDFfSVNTVUVSKSwJIlg1MDlfU1RPUkVfQ1RYX2dldDFfaXNzdWVyIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX0lOSVQpLAkiWDUwOV9TVE9SRV9DVFhfaW5pdCJ9LAore0VSUl9GVU5DKFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9ORVcpLAkiWDUwOV9TVE9SRV9DVFhfbmV3In0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX1BVUlBPU0VfSU5IRVJJVCksCSJYNTA5X1NUT1JFX0NUWF9wdXJwb3NlX2luaGVyaXQifSwKK3tFUlJfRlVOQyhYNTA5X0ZfWDUwOV9UT19YNTA5X1JFUSksCSJYNTA5X3RvX1g1MDlfUkVRIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfVFJVU1RfQUREKSwJIlg1MDlfVFJVU1RfYWRkIn0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfVFJVU1RfU0VUKSwJIlg1MDlfVFJVU1Rfc2V0In0sCit7RVJSX0ZVTkMoWDUwOV9GX1g1MDlfVkVSSUZZX0NFUlQpLAkiWDUwOV92ZXJpZnlfY2VydCJ9LAorezAsTlVMTH0KKwl9OworCitzdGF0aWMgRVJSX1NUUklOR19EQVRBIFg1MDlfc3RyX3JlYXNvbnNbXT0KKwl7Cit7RVJSX1JFQVNPTihYNTA5X1JfQkFEX1g1MDlfRklMRVRZUEUpICAgICwiYmFkIHg1MDkgZmlsZXR5cGUifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9CQVNFNjRfREVDT0RFX0VSUk9SKSAgLCJiYXNlNjQgZGVjb2RlIGVycm9yIn0sCit7RVJSX1JFQVNPTihYNTA5X1JfQ0FOVF9DSEVDS19ESF9LRVkpICAgICwiY2FudCBjaGVjayBkaCBrZXkifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9DRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRSksImNlcnQgYWxyZWFkeSBpbiBoYXNoIHRhYmxlIn0sCit7RVJSX1JFQVNPTihYNTA5X1JfRVJSX0FTTjFfTElCKSAgICAgICAgICwiZXJyIGFzbjEgbGliIn0sCit7RVJSX1JFQVNPTihYNTA5X1JfSU5WQUxJRF9ESVJFQ1RPUlkpICAgICwiaW52YWxpZCBkaXJlY3RvcnkifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9JTlZBTElEX0ZJRUxEX05BTUUpICAgLCJpbnZhbGlkIGZpZWxkIG5hbWUifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9JTlZBTElEX1RSVVNUKSAgICAgICAgLCJpbnZhbGlkIHRydXN0In0sCit7RVJSX1JFQVNPTihYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gpICAgICwia2V5IHR5cGUgbWlzbWF0Y2gifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9LRVlfVkFMVUVTX01JU01BVENIKSAgLCJrZXkgdmFsdWVzIG1pc21hdGNoIn0sCit7RVJSX1JFQVNPTihYNTA5X1JfTE9BRElOR19DRVJUX0RJUikgICAgICwibG9hZGluZyBjZXJ0IGRpciJ9LAore0VSUl9SRUFTT04oWDUwOV9SX0xPQURJTkdfREVGQVVMVFMpICAgICAsImxvYWRpbmcgZGVmYXVsdHMifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRCkgLCJtZXRob2Qgbm90IHN1cHBvcnRlZCJ9LAore0VSUl9SRUFTT04oWDUwOV9SX05PX0NFUlRfU0VUX0ZPUl9VU19UT19WRVJJRlkpLCJubyBjZXJ0IHNldCBmb3IgdXMgdG8gdmVyaWZ5In0sCit7RVJSX1JFQVNPTihYNTA5X1JfUFVCTElDX0tFWV9ERUNPREVfRVJST1IpLCJwdWJsaWMga2V5IGRlY29kZSBlcnJvciJ9LAore0VSUl9SRUFTT04oWDUwOV9SX1BVQkxJQ19LRVlfRU5DT0RFX0VSUk9SKSwicHVibGljIGtleSBlbmNvZGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9TSE9VTERfUkVUUlkpICAgICAgICAgLCJzaG91bGQgcmV0cnkifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9VTkFCTEVfVE9fRklORF9QQVJBTUVURVJTX0lOX0NIQUlOKSwidW5hYmxlIHRvIGZpbmQgcGFyYW1ldGVycyBpbiBjaGFpbiJ9LAore0VSUl9SRUFTT04oWDUwOV9SX1VOQUJMRV9UT19HRVRfQ0VSVFNfUFVCTElDX0tFWSksInVuYWJsZSB0byBnZXQgY2VydHMgcHVibGljIGtleSJ9LAore0VSUl9SRUFTT04oWDUwOV9SX1VOS05PV05fS0VZX1RZUEUpICAgICAsInVua25vd24ga2V5IHR5cGUifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9VTktOT1dOX05JRCkgICAgICAgICAgLCJ1bmtub3duIG5pZCJ9LAore0VSUl9SRUFTT04oWDUwOV9SX1VOS05PV05fUFVSUE9TRV9JRCkgICAsInVua25vd24gcHVycG9zZSBpZCJ9LAore0VSUl9SRUFTT04oWDUwOV9SX1VOS05PV05fVFJVU1RfSUQpICAgICAsInVua25vd24gdHJ1c3QgaWQifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9VTlNVUFBPUlRFRF9BTEdPUklUSE0pLCJ1bnN1cHBvcnRlZCBhbGdvcml0aG0ifSwKK3tFUlJfUkVBU09OKFg1MDlfUl9XUk9OR19MT09LVVBfVFlQRSkgICAgLCJ3cm9uZyBsb29rdXAgdHlwZSJ9LAore0VSUl9SRUFTT04oWDUwOV9SX1dST05HX1RZUEUpICAgICAgICAgICAsIndyb25nIHR5cGUifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfWDUwOV9zdHJpbmdzKHZvaWQpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VSUgorCisJaWYgKEVSUl9mdW5jX2Vycm9yX3N0cmluZyhYNTA5X3N0cl9mdW5jdHNbMF0uZXJyb3IpID09IE5VTEwpCisJCXsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLFg1MDlfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxYNTA5X3N0cl9yZWFzb25zKTsKKwkJfQorI2VuZGlmCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9leHQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmZGFjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfZXh0LmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfZXh0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisKK2ludCBYNTA5X0NSTF9nZXRfZXh0X2NvdW50KFg1MDlfQ1JMICp4KQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfY291bnQoeC0+Y3JsLT5leHRlbnNpb25zKSk7CisJfQorCitpbnQgWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoWDUwOV9DUkwgKngsIGludCBuaWQsIGludCBsYXN0cG9zKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfYnlfTklEKHgtPmNybC0+ZXh0ZW5zaW9ucyxuaWQsbGFzdHBvcykpOworCX0KKworaW50IFg1MDlfQ1JMX2dldF9leHRfYnlfT0JKKFg1MDlfQ1JMICp4LCBBU04xX09CSkVDVCAqb2JqLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X09CSih4LT5jcmwtPmV4dGVuc2lvbnMsb2JqLGxhc3Rwb3MpKTsKKwl9CisKK2ludCBYNTA5X0NSTF9nZXRfZXh0X2J5X2NyaXRpY2FsKFg1MDlfQ1JMICp4LCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9ieV9jcml0aWNhbCh4LT5jcmwtPmV4dGVuc2lvbnMsY3JpdCxsYXN0cG9zKSk7CisJfQorCitYNTA5X0VYVEVOU0lPTiAqWDUwOV9DUkxfZ2V0X2V4dChYNTA5X0NSTCAqeCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0KHgtPmNybC0+ZXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X0NSTF9kZWxldGVfZXh0KFg1MDlfQ1JMICp4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2RlbGV0ZV9leHQoeC0+Y3JsLT5leHRlbnNpb25zLGxvYykpOworCX0KKwordm9pZCAqWDUwOV9DUkxfZ2V0X2V4dF9kMmkoWDUwOV9DUkwgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpCit7CisJcmV0dXJuIFg1MDlWM19nZXRfZDJpKHgtPmNybC0+ZXh0ZW5zaW9ucywgbmlkLCBjcml0LCBpZHgpOworfQorCitpbnQgWDUwOV9DUkxfYWRkMV9leHRfaTJkKFg1MDlfQ1JMICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gWDUwOVYzX2FkZDFfaTJkKCZ4LT5jcmwtPmV4dGVuc2lvbnMsIG5pZCwgdmFsdWUsIGNyaXQsIGZsYWdzKTsKK30KKworaW50IFg1MDlfQ1JMX2FkZF9leHQoWDUwOV9DUkwgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19hZGRfZXh0KCYoeC0+Y3JsLT5leHRlbnNpb25zKSxleCxsb2MpICE9IE5VTEwpOworCX0KKworaW50IFg1MDlfZ2V0X2V4dF9jb3VudChYNTA5ICp4KQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfY291bnQoeC0+Y2VydF9pbmZvLT5leHRlbnNpb25zKSk7CisJfQorCitpbnQgWDUwOV9nZXRfZXh0X2J5X05JRChYNTA5ICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X05JRCh4LT5jZXJ0X2luZm8tPmV4dGVuc2lvbnMsbmlkLGxhc3Rwb3MpKTsKKwl9CisKK2ludCBYNTA5X2dldF9leHRfYnlfT0JKKFg1MDkgKngsIEFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zKQorCXsKKwlyZXR1cm4oWDUwOXYzX2dldF9leHRfYnlfT0JKKHgtPmNlcnRfaW5mby0+ZXh0ZW5zaW9ucyxvYmosbGFzdHBvcykpOworCX0KKworaW50IFg1MDlfZ2V0X2V4dF9ieV9jcml0aWNhbChYNTA5ICp4LCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9ieV9jcml0aWNhbCh4LT5jZXJ0X2luZm8tPmV4dGVuc2lvbnMsY3JpdCxsYXN0cG9zKSk7CisJfQorCitYNTA5X0VYVEVOU0lPTiAqWDUwOV9nZXRfZXh0KFg1MDkgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dCh4LT5jZXJ0X2luZm8tPmV4dGVuc2lvbnMsbG9jKSk7CisJfQorCitYNTA5X0VYVEVOU0lPTiAqWDUwOV9kZWxldGVfZXh0KFg1MDkgKngsIGludCBsb2MpCisJeworCXJldHVybihYNTA5djNfZGVsZXRlX2V4dCh4LT5jZXJ0X2luZm8tPmV4dGVuc2lvbnMsbG9jKSk7CisJfQorCitpbnQgWDUwOV9hZGRfZXh0KFg1MDkgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19hZGRfZXh0KCYoeC0+Y2VydF9pbmZvLT5leHRlbnNpb25zKSxleCxsb2MpICE9IE5VTEwpOworCX0KKwordm9pZCAqWDUwOV9nZXRfZXh0X2QyaShYNTA5ICp4LCBpbnQgbmlkLCBpbnQgKmNyaXQsIGludCAqaWR4KQoreworCXJldHVybiBYNTA5VjNfZ2V0X2QyaSh4LT5jZXJ0X2luZm8tPmV4dGVuc2lvbnMsIG5pZCwgY3JpdCwgaWR4KTsKK30KKworaW50IFg1MDlfYWRkMV9leHRfaTJkKFg1MDkgKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLCBpbnQgY3JpdCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBYNTA5VjNfYWRkMV9pMmQoJngtPmNlcnRfaW5mby0+ZXh0ZW5zaW9ucywgbmlkLCB2YWx1ZSwgY3JpdCwKKwkJCQkJCQlmbGFncyk7Cit9CisKK2ludCBYNTA5X1JFVk9LRURfZ2V0X2V4dF9jb3VudChYNTA5X1JFVk9LRUQgKngpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9jb3VudCh4LT5leHRlbnNpb25zKSk7CisJfQorCitpbnQgWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfTklEKFg1MDlfUkVWT0tFRCAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9ieV9OSUQoeC0+ZXh0ZW5zaW9ucyxuaWQsbGFzdHBvcykpOworCX0KKworaW50IFg1MDlfUkVWT0tFRF9nZXRfZXh0X2J5X09CSihYNTA5X1JFVk9LRUQgKngsIEFTTjFfT0JKRUNUICpvYmosCisJICAgICBpbnQgbGFzdHBvcykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X09CSih4LT5leHRlbnNpb25zLG9iaixsYXN0cG9zKSk7CisJfQorCitpbnQgWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfY3JpdGljYWwoWDUwOV9SRVZPS0VEICp4LCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpCisJeworCXJldHVybihYNTA5djNfZ2V0X2V4dF9ieV9jcml0aWNhbCh4LT5leHRlbnNpb25zLGNyaXQsbGFzdHBvcykpOworCX0KKworWDUwOV9FWFRFTlNJT04gKlg1MDlfUkVWT0tFRF9nZXRfZXh0KFg1MDlfUkVWT0tFRCAqeCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0KHgtPmV4dGVuc2lvbnMsbG9jKSk7CisJfQorCitYNTA5X0VYVEVOU0lPTiAqWDUwOV9SRVZPS0VEX2RlbGV0ZV9leHQoWDUwOV9SRVZPS0VEICp4LCBpbnQgbG9jKQorCXsKKwlyZXR1cm4oWDUwOXYzX2RlbGV0ZV9leHQoeC0+ZXh0ZW5zaW9ucyxsb2MpKTsKKwl9CisKK2ludCBYNTA5X1JFVk9LRURfYWRkX2V4dChYNTA5X1JFVk9LRUQgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYykKKwl7CisJcmV0dXJuKFg1MDl2M19hZGRfZXh0KCYoeC0+ZXh0ZW5zaW9ucyksZXgsbG9jKSAhPSBOVUxMKTsKKwl9CisKK3ZvaWQgKlg1MDlfUkVWT0tFRF9nZXRfZXh0X2QyaShYNTA5X1JFVk9LRUQgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpCit7CisJcmV0dXJuIFg1MDlWM19nZXRfZDJpKHgtPmV4dGVuc2lvbnMsIG5pZCwgY3JpdCwgaWR4KTsKK30KKworaW50IFg1MDlfUkVWT0tFRF9hZGQxX2V4dF9pMmQoWDUwOV9SRVZPS0VEICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gWDUwOVYzX2FkZDFfaTJkKCZ4LT5leHRlbnNpb25zLCBuaWQsIHZhbHVlLCBjcml0LCBmbGFncyk7Cit9CisKK0lNUExFTUVOVF9TVEFDS19PRihYNTA5X0VYVEVOU0lPTikKK0lNUExFTUVOVF9BU04xX1NFVF9PRihYNTA5X0VYVEVOU0lPTikKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfbHUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfbHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTZlMDRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9sdS5jCkBAIC0wLDAgKzEsNzE2IEBACisvKiBjcnlwdG8veDUwOS94NTA5X2x1LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworWDUwOV9MT09LVVAgKlg1MDlfTE9PS1VQX25ldyhYNTA5X0xPT0tVUF9NRVRIT0QgKm1ldGhvZCkKKwl7CisJWDUwOV9MT09LVVAgKnJldDsKKworCXJldD0oWDUwOV9MT09LVVAgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9MT09LVVApKTsKKwlpZiAocmV0ID09IE5VTEwpIHJldHVybiBOVUxMOworCisJcmV0LT5pbml0PTA7CisJcmV0LT5za2lwPTA7CisJcmV0LT5tZXRob2Q9bWV0aG9kOworCXJldC0+bWV0aG9kX2RhdGE9TlVMTDsKKwlyZXQtPnN0b3JlX2N0eD1OVUxMOworCWlmICgobWV0aG9kLT5uZXdfaXRlbSAhPSBOVUxMKSAmJiAhbWV0aG9kLT5uZXdfaXRlbShyZXQpKQorCQl7CisJCU9QRU5TU0xfZnJlZShyZXQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCXJldHVybiByZXQ7CisJfQorCit2b2lkIFg1MDlfTE9PS1VQX2ZyZWUoWDUwOV9MT09LVVAgKmN0eCkKKwl7CisJaWYgKGN0eCA9PSBOVUxMKSByZXR1cm47CisJaWYgKAkoY3R4LT5tZXRob2QgIT0gTlVMTCkgJiYKKwkJKGN0eC0+bWV0aG9kLT5mcmVlICE9IE5VTEwpKQorCQljdHgtPm1ldGhvZC0+ZnJlZShjdHgpOworCU9QRU5TU0xfZnJlZShjdHgpOworCX0KKworaW50IFg1MDlfTE9PS1VQX2luaXQoWDUwOV9MT09LVVAgKmN0eCkKKwl7CisJaWYgKGN0eC0+bWV0aG9kID09IE5VTEwpIHJldHVybiAwOworCWlmIChjdHgtPm1ldGhvZC0+aW5pdCAhPSBOVUxMKQorCQlyZXR1cm4gY3R4LT5tZXRob2QtPmluaXQoY3R4KTsKKwllbHNlCisJCXJldHVybiAxOworCX0KKworaW50IFg1MDlfTE9PS1VQX3NodXRkb3duKFg1MDlfTE9PS1VQICpjdHgpCisJeworCWlmIChjdHgtPm1ldGhvZCA9PSBOVUxMKSByZXR1cm4gMDsKKwlpZiAoY3R4LT5tZXRob2QtPnNodXRkb3duICE9IE5VTEwpCisJCXJldHVybiBjdHgtPm1ldGhvZC0+c2h1dGRvd24oY3R4KTsKKwllbHNlCisJCXJldHVybiAxOworCX0KKworaW50IFg1MDlfTE9PS1VQX2N0cmwoWDUwOV9MT09LVVAgKmN0eCwgaW50IGNtZCwgY29uc3QgY2hhciAqYXJnYywgbG9uZyBhcmdsLAorCSAgICAgY2hhciAqKnJldCkKKwl7CisJaWYgKGN0eC0+bWV0aG9kID09IE5VTEwpIHJldHVybiAtMTsKKwlpZiAoY3R4LT5tZXRob2QtPmN0cmwgIT0gTlVMTCkKKwkJcmV0dXJuIGN0eC0+bWV0aG9kLT5jdHJsKGN0eCxjbWQsYXJnYyxhcmdsLHJldCk7CisJZWxzZQorCQlyZXR1cm4gMTsKKwl9CisKK2ludCBYNTA5X0xPT0tVUF9ieV9zdWJqZWN0KFg1MDlfTE9PS1VQICpjdHgsIGludCB0eXBlLCBYNTA5X05BTUUgKm5hbWUsCisJICAgICBYNTA5X09CSkVDVCAqcmV0KQorCXsKKwlpZiAoKGN0eC0+bWV0aG9kID09IE5VTEwpIHx8IChjdHgtPm1ldGhvZC0+Z2V0X2J5X3N1YmplY3QgPT0gTlVMTCkpCisJCXJldHVybiBYNTA5X0xVX0ZBSUw7CisJaWYgKGN0eC0+c2tpcCkgcmV0dXJuIDA7CisJcmV0dXJuIGN0eC0+bWV0aG9kLT5nZXRfYnlfc3ViamVjdChjdHgsdHlwZSxuYW1lLHJldCk7CisJfQorCitpbnQgWDUwOV9MT09LVVBfYnlfaXNzdWVyX3NlcmlhbChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgdHlwZSwgWDUwOV9OQU1FICpuYW1lLAorCSAgICAgQVNOMV9JTlRFR0VSICpzZXJpYWwsIFg1MDlfT0JKRUNUICpyZXQpCisJeworCWlmICgoY3R4LT5tZXRob2QgPT0gTlVMTCkgfHwKKwkJKGN0eC0+bWV0aG9kLT5nZXRfYnlfaXNzdWVyX3NlcmlhbCA9PSBOVUxMKSkKKwkJcmV0dXJuIFg1MDlfTFVfRkFJTDsKKwlyZXR1cm4gY3R4LT5tZXRob2QtPmdldF9ieV9pc3N1ZXJfc2VyaWFsKGN0eCx0eXBlLG5hbWUsc2VyaWFsLHJldCk7CisJfQorCitpbnQgWDUwOV9MT09LVVBfYnlfZmluZ2VycHJpbnQoWDUwOV9MT09LVVAgKmN0eCwgaW50IHR5cGUsCisJICAgICB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbiwgWDUwOV9PQkpFQ1QgKnJldCkKKwl7CisJaWYgKChjdHgtPm1ldGhvZCA9PSBOVUxMKSB8fCAoY3R4LT5tZXRob2QtPmdldF9ieV9maW5nZXJwcmludCA9PSBOVUxMKSkKKwkJcmV0dXJuIFg1MDlfTFVfRkFJTDsKKwlyZXR1cm4gY3R4LT5tZXRob2QtPmdldF9ieV9maW5nZXJwcmludChjdHgsdHlwZSxieXRlcyxsZW4scmV0KTsKKwl9CisKK2ludCBYNTA5X0xPT0tVUF9ieV9hbGlhcyhYNTA5X0xPT0tVUCAqY3R4LCBpbnQgdHlwZSwgY2hhciAqc3RyLCBpbnQgbGVuLAorCSAgICAgWDUwOV9PQkpFQ1QgKnJldCkKKwl7CisJaWYgKChjdHgtPm1ldGhvZCA9PSBOVUxMKSB8fCAoY3R4LT5tZXRob2QtPmdldF9ieV9hbGlhcyA9PSBOVUxMKSkKKwkJcmV0dXJuIFg1MDlfTFVfRkFJTDsKKwlyZXR1cm4gY3R4LT5tZXRob2QtPmdldF9ieV9hbGlhcyhjdHgsdHlwZSxzdHIsbGVuLHJldCk7CisJfQorCisgIAorc3RhdGljIGludCB4NTA5X29iamVjdF9jbXAoY29uc3QgWDUwOV9PQkpFQ1QgKiBjb25zdCAqYSwgY29uc3QgWDUwOV9PQkpFQ1QgKiBjb25zdCAqYikKKyAgCXsKKyAJaW50IHJldDsKKworIAlyZXQ9KCgqYSktPnR5cGUgLSAoKmIpLT50eXBlKTsKKyAJaWYgKHJldCkgcmV0dXJuIHJldDsKKyAJc3dpdGNoICgoKmEpLT50eXBlKQorIAkJeworIAljYXNlIFg1MDlfTFVfWDUwOToKKyAJCXJldD1YNTA5X3N1YmplY3RfbmFtZV9jbXAoKCphKS0+ZGF0YS54NTA5LCgqYiktPmRhdGEueDUwOSk7CisgCQlicmVhazsKKyAJY2FzZSBYNTA5X0xVX0NSTDoKKyAJCXJldD1YNTA5X0NSTF9jbXAoKCphKS0+ZGF0YS5jcmwsKCpiKS0+ZGF0YS5jcmwpOworIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogYWJvcnQoKTsgKi8KKwkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworWDUwOV9TVE9SRSAqWDUwOV9TVE9SRV9uZXcodm9pZCkKKwl7CisJWDUwOV9TVE9SRSAqcmV0OworCisJaWYgKChyZXQ9KFg1MDlfU1RPUkUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9TVE9SRSkpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlyZXQtPm9ianMgPSBza19YNTA5X09CSkVDVF9uZXcoeDUwOV9vYmplY3RfY21wKTsKKwlyZXQtPmNhY2hlPTE7CisJcmV0LT5nZXRfY2VydF9tZXRob2RzPXNrX1g1MDlfTE9PS1VQX25ld19udWxsKCk7CisJcmV0LT52ZXJpZnk9MDsKKwlyZXQtPnZlcmlmeV9jYj0wOworCisJaWYgKChyZXQtPnBhcmFtID0gWDUwOV9WRVJJRllfUEFSQU1fbmV3KCkpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcmV0LT5nZXRfaXNzdWVyID0gMDsKKwlyZXQtPmNoZWNrX2lzc3VlZCA9IDA7CisJcmV0LT5jaGVja19yZXZvY2F0aW9uID0gMDsKKwlyZXQtPmdldF9jcmwgPSAwOworCXJldC0+Y2hlY2tfY3JsID0gMDsKKwlyZXQtPmNlcnRfY3JsID0gMDsKKwlyZXQtPmxvb2t1cF9jZXJ0cyA9IDA7CisJcmV0LT5sb29rdXBfY3JscyA9IDA7CisJcmV0LT5jbGVhbnVwID0gMDsKKworCWlmICghQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9YNTA5X1NUT1JFLCByZXQsICZyZXQtPmV4X2RhdGEpKQorCQl7CisJCXNrX1g1MDlfT0JKRUNUX2ZyZWUocmV0LT5vYmpzKTsKKwkJT1BFTlNTTF9mcmVlKHJldCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlyZXQtPnJlZmVyZW5jZXM9MTsKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIHZvaWQgY2xlYW51cChYNTA5X09CSkVDVCAqYSkKKwl7CisJaWYgKGEtPnR5cGUgPT0gWDUwOV9MVV9YNTA5KQorCQl7CisJCVg1MDlfZnJlZShhLT5kYXRhLng1MDkpOworCQl9CisJZWxzZSBpZiAoYS0+dHlwZSA9PSBYNTA5X0xVX0NSTCkKKwkJeworCQlYNTA5X0NSTF9mcmVlKGEtPmRhdGEuY3JsKTsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBhYm9ydCgpOyAqLworCQl9CisKKwlPUEVOU1NMX2ZyZWUoYSk7CisJfQorCit2b2lkIFg1MDlfU1RPUkVfZnJlZShYNTA5X1NUT1JFICp2ZnkpCisJeworCWludCBpOworCVNUQUNLX09GKFg1MDlfTE9PS1VQKSAqc2s7CisJWDUwOV9MT09LVVAgKmx1OworCisJaWYgKHZmeSA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlzaz12ZnktPmdldF9jZXJ0X21ldGhvZHM7CisJZm9yIChpPTA7IGk8c2tfWDUwOV9MT09LVVBfbnVtKHNrKTsgaSsrKQorCQl7CisJCWx1PXNrX1g1MDlfTE9PS1VQX3ZhbHVlKHNrLGkpOworCQlYNTA5X0xPT0tVUF9zaHV0ZG93bihsdSk7CisJCVg1MDlfTE9PS1VQX2ZyZWUobHUpOworCQl9CisJc2tfWDUwOV9MT09LVVBfZnJlZShzayk7CisJc2tfWDUwOV9PQkpFQ1RfcG9wX2ZyZWUodmZ5LT5vYmpzLCBjbGVhbnVwKTsKKworCUNSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1g1MDlfU1RPUkUsIHZmeSwgJnZmeS0+ZXhfZGF0YSk7CisJaWYgKHZmeS0+cGFyYW0pCisJCVg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUodmZ5LT5wYXJhbSk7CisJT1BFTlNTTF9mcmVlKHZmeSk7CisJfQorCitYNTA5X0xPT0tVUCAqWDUwOV9TVE9SRV9hZGRfbG9va3VwKFg1MDlfU1RPUkUgKnYsIFg1MDlfTE9PS1VQX01FVEhPRCAqbSkKKwl7CisJaW50IGk7CisJU1RBQ0tfT0YoWDUwOV9MT09LVVApICpzazsKKwlYNTA5X0xPT0tVUCAqbHU7CisKKwlzaz12LT5nZXRfY2VydF9tZXRob2RzOworCWZvciAoaT0wOyBpPHNrX1g1MDlfTE9PS1VQX251bShzayk7IGkrKykKKwkJeworCQlsdT1za19YNTA5X0xPT0tVUF92YWx1ZShzayxpKTsKKwkJaWYgKG0gPT0gbHUtPm1ldGhvZCkKKwkJCXsKKwkJCXJldHVybiBsdTsKKwkJCX0KKwkJfQorCS8qIGEgbmV3IG9uZSAqLworCWx1PVg1MDlfTE9PS1VQX25ldyhtKTsKKwlpZiAobHUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQl7CisJCWx1LT5zdG9yZV9jdHg9djsKKwkJaWYgKHNrX1g1MDlfTE9PS1VQX3B1c2godi0+Z2V0X2NlcnRfbWV0aG9kcyxsdSkpCisJCQlyZXR1cm4gbHU7CisJCWVsc2UKKwkJCXsKKwkJCVg1MDlfTE9PS1VQX2ZyZWUobHUpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwl9CisKK2ludCBYNTA5X1NUT1JFX2dldF9ieV9zdWJqZWN0KFg1MDlfU1RPUkVfQ1RYICp2cywgaW50IHR5cGUsIFg1MDlfTkFNRSAqbmFtZSwKKwkgICAgIFg1MDlfT0JKRUNUICpyZXQpCisJeworCVg1MDlfU1RPUkUgKmN0eD12cy0+Y3R4OworCVg1MDlfTE9PS1VQICpsdTsKKwlYNTA5X09CSkVDVCBzdG1wLCp0bXA7CisJaW50IGksajsKKworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJdG1wPVg1MDlfT0JKRUNUX3JldHJpZXZlX2J5X3N1YmplY3QoY3R4LT5vYmpzLHR5cGUsbmFtZSk7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCisJaWYgKHRtcCA9PSBOVUxMIHx8IHR5cGUgPT0gWDUwOV9MVV9DUkwpCisJCXsKKwkJZm9yIChpPXZzLT5jdXJyZW50X21ldGhvZDsgaTxza19YNTA5X0xPT0tVUF9udW0oY3R4LT5nZXRfY2VydF9tZXRob2RzKTsgaSsrKQorCQkJeworCQkJbHU9c2tfWDUwOV9MT09LVVBfdmFsdWUoY3R4LT5nZXRfY2VydF9tZXRob2RzLGkpOworCQkJaj1YNTA5X0xPT0tVUF9ieV9zdWJqZWN0KGx1LHR5cGUsbmFtZSwmc3RtcCk7CisJCQlpZiAoaiA8IDApCisJCQkJeworCQkJCXZzLT5jdXJyZW50X21ldGhvZD1qOworCQkJCXJldHVybiBqOworCQkJCX0KKwkJCWVsc2UgaWYgKGopCisJCQkJeworCQkJCXRtcD0gJnN0bXA7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl2cy0+Y3VycmVudF9tZXRob2Q9MDsKKwkJaWYgKHRtcCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKworLyoJaWYgKHJldC0+ZGF0YS5wdHIgIT0gTlVMTCkKKwkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cyhyZXQpOyAqLworCisJcmV0LT50eXBlPXRtcC0+dHlwZTsKKwlyZXQtPmRhdGEucHRyPXRtcC0+ZGF0YS5wdHI7CisKKwlYNTA5X09CSkVDVF91cF9yZWZfY291bnQocmV0KTsKKworCXJldHVybiAxOworCX0KKworaW50IFg1MDlfU1RPUkVfYWRkX2NlcnQoWDUwOV9TVE9SRSAqY3R4LCBYNTA5ICp4KQorCXsKKwlYNTA5X09CSkVDVCAqb2JqOworCWludCByZXQ9MTsKKworCWlmICh4ID09IE5VTEwpIHJldHVybiAwOworCW9iaj0oWDUwOV9PQkpFQ1QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9PQkpFQ1QpKTsKKwlpZiAob2JqID09IE5VTEwpCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9TVE9SRV9BRERfQ0VSVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisJb2JqLT50eXBlPVg1MDlfTFVfWDUwOTsKKwlvYmotPmRhdGEueDUwOT14OworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKworCVg1MDlfT0JKRUNUX3VwX3JlZl9jb3VudChvYmopOworCisJaWYgKFg1MDlfT0JKRUNUX3JldHJpZXZlX21hdGNoKGN0eC0+b2Jqcywgb2JqKSkKKwkJeworCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKG9iaik7CisJCU9QRU5TU0xfZnJlZShvYmopOworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1NUT1JFX0FERF9DRVJULFg1MDlfUl9DRVJUX0FMUkVBRFlfSU5fSEFTSF9UQUJMRSk7CisJCXJldD0wOworCQl9IAorCWVsc2Ugc2tfWDUwOV9PQkpFQ1RfcHVzaChjdHgtPm9ianMsIG9iaik7CisKKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisKKwlyZXR1cm4gcmV0OworCX0KKworaW50IFg1MDlfU1RPUkVfYWRkX2NybChYNTA5X1NUT1JFICpjdHgsIFg1MDlfQ1JMICp4KQorCXsKKwlYNTA5X09CSkVDVCAqb2JqOworCWludCByZXQ9MTsKKworCWlmICh4ID09IE5VTEwpIHJldHVybiAwOworCW9iaj0oWDUwOV9PQkpFQ1QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9PQkpFQ1QpKTsKKwlpZiAob2JqID09IE5VTEwpCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9TVE9SRV9BRERfQ1JMLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlvYmotPnR5cGU9WDUwOV9MVV9DUkw7CisJb2JqLT5kYXRhLmNybD14OworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKworCVg1MDlfT0JKRUNUX3VwX3JlZl9jb3VudChvYmopOworCisJaWYgKFg1MDlfT0JKRUNUX3JldHJpZXZlX21hdGNoKGN0eC0+b2Jqcywgb2JqKSkKKwkJeworCQlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKG9iaik7CisJCU9QRU5TU0xfZnJlZShvYmopOworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1NUT1JFX0FERF9DUkwsWDUwOV9SX0NFUlRfQUxSRUFEWV9JTl9IQVNIX1RBQkxFKTsKKwkJcmV0PTA7CisJCX0KKwllbHNlIHNrX1g1MDlfT0JKRUNUX3B1c2goY3R4LT5vYmpzLCBvYmopOworCisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCisJcmV0dXJuIHJldDsKKwl9CisKK3ZvaWQgWDUwOV9PQkpFQ1RfdXBfcmVmX2NvdW50KFg1MDlfT0JKRUNUICphKQorCXsKKwlzd2l0Y2ggKGEtPnR5cGUpCisJCXsKKwljYXNlIFg1MDlfTFVfWDUwOToKKwkJQ1JZUFRPX2FkZCgmYS0+ZGF0YS54NTA5LT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfWDUwOSk7CisJCWJyZWFrOworCWNhc2UgWDUwOV9MVV9DUkw6CisJCUNSWVBUT19hZGQoJmEtPmRhdGEuY3JsLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfWDUwOV9DUkwpOworCQlicmVhazsKKwkJfQorCX0KKwordm9pZCBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKFg1MDlfT0JKRUNUICphKQorCXsKKwlzd2l0Y2ggKGEtPnR5cGUpCisJCXsKKwljYXNlIFg1MDlfTFVfWDUwOToKKwkJWDUwOV9mcmVlKGEtPmRhdGEueDUwOSk7CisJCWJyZWFrOworCWNhc2UgWDUwOV9MVV9DUkw6CisJCVg1MDlfQ1JMX2ZyZWUoYS0+ZGF0YS5jcmwpOworCQlicmVhazsKKwkJfQorCX0KKworc3RhdGljIGludCB4NTA5X29iamVjdF9pZHhfY250KFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCwgaW50IHR5cGUsCisJICAgICBYNTA5X05BTUUgKm5hbWUsIGludCAqcG5tYXRjaCkKKwl7CisJWDUwOV9PQkpFQ1Qgc3RtcDsKKwlYNTA5IHg1MDlfczsKKwlYNTA5X0NJTkYgY2luZl9zOworCVg1MDlfQ1JMIGNybF9zOworCVg1MDlfQ1JMX0lORk8gY3JsX2luZm9fczsKKwlpbnQgaWR4OworCisJc3RtcC50eXBlPXR5cGU7CisJc3dpdGNoICh0eXBlKQorCQl7CisJY2FzZSBYNTA5X0xVX1g1MDk6CisJCXN0bXAuZGF0YS54NTA5PSAmeDUwOV9zOworCQl4NTA5X3MuY2VydF9pbmZvPSAmY2luZl9zOworCQljaW5mX3Muc3ViamVjdD1uYW1lOworCQlicmVhazsKKwljYXNlIFg1MDlfTFVfQ1JMOgorCQlzdG1wLmRhdGEuY3JsPSAmY3JsX3M7CisJCWNybF9zLmNybD0gJmNybF9pbmZvX3M7CisJCWNybF9pbmZvX3MuaXNzdWVyPW5hbWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGFib3J0KCk7ICovCisJCXJldHVybiAtMTsKKwkJfQorCisJaWR4ID0gc2tfWDUwOV9PQkpFQ1RfZmluZChoLCZzdG1wKTsKKwlpZiAoaWR4ID49IDAgJiYgcG5tYXRjaCkKKwkJeworCQlpbnQgdGlkeDsKKwkJY29uc3QgWDUwOV9PQkpFQ1QgKnRvYmosICpwc3RtcDsKKwkJKnBubWF0Y2ggPSAxOworCQlwc3RtcCA9ICZzdG1wOworCQlmb3IgKHRpZHggPSBpZHggKyAxOyB0aWR4IDwgc2tfWDUwOV9PQkpFQ1RfbnVtKGgpOyB0aWR4KyspCisJCQl7CisJCQl0b2JqID0gc2tfWDUwOV9PQkpFQ1RfdmFsdWUoaCwgdGlkeCk7CisJCQlpZiAoeDUwOV9vYmplY3RfY21wKCZ0b2JqLCAmcHN0bXApKQorCQkJCWJyZWFrOworCQkJKCpwbm1hdGNoKSsrOworCQkJfQorCQl9CisJcmV0dXJuIGlkeDsKKwl9CisKKworaW50IFg1MDlfT0JKRUNUX2lkeF9ieV9zdWJqZWN0KFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCwgaW50IHR5cGUsCisJICAgICBYNTA5X05BTUUgKm5hbWUpCisJeworCXJldHVybiB4NTA5X29iamVjdF9pZHhfY250KGgsIHR5cGUsIG5hbWUsIE5VTEwpOworCX0KKworWDUwOV9PQkpFQ1QgKlg1MDlfT0JKRUNUX3JldHJpZXZlX2J5X3N1YmplY3QoU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpICpoLCBpbnQgdHlwZSwKKwkgICAgIFg1MDlfTkFNRSAqbmFtZSkKKwl7CisJaW50IGlkeDsKKwlpZHggPSBYNTA5X09CSkVDVF9pZHhfYnlfc3ViamVjdChoLCB0eXBlLCBuYW1lKTsKKwlpZiAoaWR4PT0tMSkgcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGgsIGlkeCk7CisJfQorCitTVEFDS19PRihYNTA5KSogWDUwOV9TVE9SRV9nZXQxX2NlcnRzKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pCisJeworCWludCBpLCBpZHgsIGNudDsKKwlTVEFDS19PRihYNTA5KSAqc2s7CisJWDUwOSAqeDsKKwlYNTA5X09CSkVDVCAqb2JqOworCXNrID0gc2tfWDUwOV9uZXdfbnVsbCgpOworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJaWR4ID0geDUwOV9vYmplY3RfaWR4X2NudChjdHgtPmN0eC0+b2JqcywgWDUwOV9MVV9YNTA5LCBubSwgJmNudCk7CisJaWYgKGlkeCA8IDApCisJCXsKKwkJLyogTm90aGluZyBmb3VuZCBpbiBjYWNoZTogZG8gbG9va3VwIHRvIHBvc3NpYmx5IGFkZCBuZXcKKwkJICogb2JqZWN0cyB0byBjYWNoZQorCQkgKi8KKwkJWDUwOV9PQkpFQ1QgeG9iajsKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQlpZiAoIVg1MDlfU1RPUkVfZ2V0X2J5X3N1YmplY3QoY3R4LCBYNTA5X0xVX1g1MDksIG5tLCAmeG9iaikpCisJCQl7CisJCQlza19YNTA5X2ZyZWUoc2spOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJnhvYmopOworCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQlpZHggPSB4NTA5X29iamVjdF9pZHhfY250KGN0eC0+Y3R4LT5vYmpzLFg1MDlfTFVfWDUwOSxubSwgJmNudCk7CisJCWlmIChpZHggPCAwKQorCQkJeworCQkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJc2tfWDUwOV9mcmVlKHNrKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBpZHgrKykKKwkJeworCQlvYmogPSBza19YNTA5X09CSkVDVF92YWx1ZShjdHgtPmN0eC0+b2JqcywgaWR4KTsKKwkJeCA9IG9iai0+ZGF0YS54NTA5OworCQlDUllQVE9fYWRkKCZ4LT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19YNTA5KTsKKwkJaWYgKCFza19YNTA5X3B1c2goc2ssIHgpKQorCQkJeworCQkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJWDUwOV9mcmVlKHgpOworCQkJc2tfWDUwOV9wb3BfZnJlZShzaywgWDUwOV9mcmVlKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCXJldHVybiBzazsKKworCX0KKworU1RBQ0tfT0YoWDUwOV9DUkwpKiBYNTA5X1NUT1JFX2dldDFfY3JscyhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X05BTUUgKm5tKQorCXsKKwlpbnQgaSwgaWR4LCBjbnQ7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICpzazsKKwlYNTA5X0NSTCAqeDsKKwlYNTA5X09CSkVDVCAqb2JqLCB4b2JqOworCXNrID0gc2tfWDUwOV9DUkxfbmV3X251bGwoKTsKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCS8qIENoZWNrIGNhY2hlIGZpcnN0ICovCisJaWR4ID0geDUwOV9vYmplY3RfaWR4X2NudChjdHgtPmN0eC0+b2JqcywgWDUwOV9MVV9DUkwsIG5tLCAmY250KTsKKworCS8qIEFsd2F5cyBkbyBsb29rdXAgdG8gcG9zc2libHkgYWRkIG5ldyBDUkxzIHRvIGNhY2hlCisJICovCisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCWlmICghWDUwOV9TVE9SRV9nZXRfYnlfc3ViamVjdChjdHgsIFg1MDlfTFVfQ1JMLCBubSwgJnhvYmopKQorCQl7CisJCXNrX1g1MDlfQ1JMX2ZyZWUoc2spOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJnhvYmopOworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJaWR4ID0geDUwOV9vYmplY3RfaWR4X2NudChjdHgtPmN0eC0+b2JqcyxYNTA5X0xVX0NSTCwgbm0sICZjbnQpOworCWlmIChpZHggPCAwKQorCQl7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5X1NUT1JFKTsKKwkJc2tfWDUwOV9DUkxfZnJlZShzayk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGlkeCsrKQorCQl7CisJCW9iaiA9IHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGN0eC0+Y3R4LT5vYmpzLCBpZHgpOworCQl4ID0gb2JqLT5kYXRhLmNybDsKKwkJQ1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfWDUwOV9DUkwpOworCQlpZiAoIXNrX1g1MDlfQ1JMX3B1c2goc2ssIHgpKQorCQkJeworCQkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCQkJWDUwOV9DUkxfZnJlZSh4KTsKKwkJCXNrX1g1MDlfQ1JMX3BvcF9mcmVlKHNrLCBYNTA5X0NSTF9mcmVlKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCXJldHVybiBzazsKKwl9CisKK1g1MDlfT0JKRUNUICpYNTA5X09CSkVDVF9yZXRyaWV2ZV9tYXRjaChTVEFDS19PRihYNTA5X09CSkVDVCkgKmgsIFg1MDlfT0JKRUNUICp4KQorCXsKKwlpbnQgaWR4LCBpOworCVg1MDlfT0JKRUNUICpvYmo7CisJaWR4ID0gc2tfWDUwOV9PQkpFQ1RfZmluZChoLCB4KTsKKwlpZiAoaWR4ID09IC0xKSByZXR1cm4gTlVMTDsKKwlpZiAoKHgtPnR5cGUgIT0gWDUwOV9MVV9YNTA5KSAmJiAoeC0+dHlwZSAhPSBYNTA5X0xVX0NSTCkpCisJCXJldHVybiBza19YNTA5X09CSkVDVF92YWx1ZShoLCBpZHgpOworCWZvciAoaSA9IGlkeDsgaSA8IHNrX1g1MDlfT0JKRUNUX251bShoKTsgaSsrKQorCQl7CisJCW9iaiA9IHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGgsIGkpOworCQlpZiAoeDUwOV9vYmplY3RfY21wKChjb25zdCBYNTA5X09CSkVDVCAqKikmb2JqLCAoY29uc3QgWDUwOV9PQkpFQ1QgKiopJngpKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICh4LT50eXBlID09IFg1MDlfTFVfWDUwOSkKKwkJCXsKKwkJCWlmICghWDUwOV9jbXAob2JqLT5kYXRhLng1MDksIHgtPmRhdGEueDUwOSkpCisJCQkJcmV0dXJuIG9iajsKKwkJCX0KKwkJZWxzZSBpZiAoeC0+dHlwZSA9PSBYNTA5X0xVX0NSTCkKKwkJCXsKKwkJCWlmICghWDUwOV9DUkxfbWF0Y2gob2JqLT5kYXRhLmNybCwgeC0+ZGF0YS5jcmwpKQorCQkJCXJldHVybiBvYmo7CisJCQl9CisJCWVsc2UKKwkJCXJldHVybiBvYmo7CisJCX0KKwlyZXR1cm4gTlVMTDsKKwl9CisKKworLyogVHJ5IHRvIGdldCBpc3N1ZXIgY2VydGlmaWNhdGUgZnJvbSBzdG9yZS4gRHVlIHRvIGxpbWl0YXRpb25zCisgKiBvZiB0aGUgQVBJIHRoaXMgY2FuIG9ubHkgcmV0cmlldmUgYSBzaW5nbGUgY2VydGlmaWNhdGUgbWF0Y2hpbmcKKyAqIGEgZ2l2ZW4gc3ViamVjdCBuYW1lLiBIb3dldmVyIGl0IHdpbGwgZmlsbCB0aGUgY2FjaGUgd2l0aCBhbGwKKyAqIG1hdGNoaW5nIGNlcnRpZmljYXRlcywgc28gd2UgY2FuIGV4YW1pbmUgdGhlIGNhY2hlIGZvciBhbGwKKyAqIG1hdGNoZXMuCisgKgorICogUmV0dXJuIHZhbHVlcyBhcmU6CisgKiAgMSBsb29rdXAgc3VjY2Vzc2Z1bC4KKyAqICAwIGNlcnRpZmljYXRlIG5vdCBmb3VuZC4KKyAqIC0xIHNvbWUgb3RoZXIgZXJyb3IuCisgKi8KK2ludCBYNTA5X1NUT1JFX0NUWF9nZXQxX2lzc3VlcihYNTA5ICoqaXNzdWVyLCBYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4KQorCXsKKwlYNTA5X05BTUUgKnhuOworCVg1MDlfT0JKRUNUIG9iaiwgKnBvYmo7CisJaW50IGksIG9rLCBpZHgsIHJldDsKKwl4bj1YNTA5X2dldF9pc3N1ZXJfbmFtZSh4KTsKKwlvaz1YNTA5X1NUT1JFX2dldF9ieV9zdWJqZWN0KGN0eCxYNTA5X0xVX1g1MDkseG4sJm9iaik7CisJaWYgKG9rICE9IFg1MDlfTFVfWDUwOSkKKwkJeworCQlpZiAob2sgPT0gWDUwOV9MVV9SRVRSWSkKKwkJCXsKKwkJCVg1MDlfT0JKRUNUX2ZyZWVfY29udGVudHMoJm9iaik7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9HRVQxX0lTU1VFUixYNTA5X1JfU0hPVUxEX1JFVFJZKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJZWxzZSBpZiAob2sgIT0gWDUwOV9MVV9GQUlMKQorCQkJeworCQkJWDUwOV9PQkpFQ1RfZnJlZV9jb250ZW50cygmb2JqKTsKKwkJCS8qIG5vdCBnb29kIDotKCwgYnJlYWsgYW55d2F5ICovCisJCQlyZXR1cm4gLTE7CisJCQl9CisJCXJldHVybiAwOworCQl9CisJLyogSWYgY2VydGlmaWNhdGUgbWF0Y2hlcyBhbGwgT0sgKi8KKwlpZiAoY3R4LT5jaGVja19pc3N1ZWQoY3R4LCB4LCBvYmouZGF0YS54NTA5KSkKKwkJeworCQkqaXNzdWVyID0gb2JqLmRhdGEueDUwOTsKKwkJcmV0dXJuIDE7CisJCX0KKwlYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKCZvYmopOworCisJLyogRWxzZSBmaW5kIGluZGV4IG9mIGZpcnN0IGNlcnQgYWNjZXB0ZWQgYnkgJ2NoZWNrX2lzc3VlZCcgKi8KKwlyZXQgPSAwOworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfWDUwOV9TVE9SRSk7CisJaWR4ID0gWDUwOV9PQkpFQ1RfaWR4X2J5X3N1YmplY3QoY3R4LT5jdHgtPm9ianMsIFg1MDlfTFVfWDUwOSwgeG4pOworCWlmIChpZHggIT0gLTEpIC8qIHNob3VsZCBiZSB0cnVlIGFzIHdlJ3ZlIGhhZCBhdCBsZWFzdCBvbmUgbWF0Y2ggKi8KKwkJeworCQkvKiBMb29rIHRocm91Z2ggYWxsIG1hdGNoaW5nIGNlcnRzIGZvciBzdWl0YWJsZSBpc3N1ZXIgKi8KKwkJZm9yIChpID0gaWR4OyBpIDwgc2tfWDUwOV9PQkpFQ1RfbnVtKGN0eC0+Y3R4LT5vYmpzKTsgaSsrKQorCQkJeworCQkJcG9iaiA9IHNrX1g1MDlfT0JKRUNUX3ZhbHVlKGN0eC0+Y3R4LT5vYmpzLCBpKTsKKwkJCS8qIFNlZSBpZiB3ZSd2ZSBydW4gcGFzdCB0aGUgbWF0Y2hlcyAqLworCQkJaWYgKHBvYmotPnR5cGUgIT0gWDUwOV9MVV9YNTA5KQorCQkJCWJyZWFrOworCQkJaWYgKFg1MDlfTkFNRV9jbXAoeG4sIFg1MDlfZ2V0X3N1YmplY3RfbmFtZShwb2JqLT5kYXRhLng1MDkpKSkKKwkJCQlicmVhazsKKwkJCWlmIChjdHgtPmNoZWNrX2lzc3VlZChjdHgsIHgsIHBvYmotPmRhdGEueDUwOSkpCisJCQkJeworCQkJCSppc3N1ZXIgPSBwb2JqLT5kYXRhLng1MDk7CisJCQkJWDUwOV9PQkpFQ1RfdXBfcmVmX2NvdW50KHBvYmopOworCQkJCXJldCA9IDE7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDlfU1RPUkUpOworCXJldHVybiByZXQ7CisJfQorCitpbnQgWDUwOV9TVE9SRV9zZXRfZmxhZ3MoWDUwOV9TVE9SRSAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0X2ZsYWdzKGN0eC0+cGFyYW0sIGZsYWdzKTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX3NldF9kZXB0aChYNTA5X1NUT1JFICpjdHgsIGludCBkZXB0aCkKKwl7CisJWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKGN0eC0+cGFyYW0sIGRlcHRoKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX3NldF9wdXJwb3NlKFg1MDlfU1RPUkUgKmN0eCwgaW50IHB1cnBvc2UpCisJeworCXJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfcHVycG9zZShjdHgtPnBhcmFtLCBwdXJwb3NlKTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX3NldF90cnVzdChYNTA5X1NUT1JFICpjdHgsIGludCB0cnVzdCkKKwl7CisJcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90cnVzdChjdHgtPnBhcmFtLCB0cnVzdCk7CisJfQorCitpbnQgWDUwOV9TVE9SRV9zZXQxX3BhcmFtKFg1MDlfU1RPUkUgKmN0eCwgWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0MShjdHgtPnBhcmFtLCBwYXJhbSk7CisJfQorCit2b2lkIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYihYNTA5X1NUT1JFICpjdHgsCisJCQkJICBpbnQgKCp2ZXJpZnlfY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpCisJeworCWN0eC0+dmVyaWZ5X2NiID0gdmVyaWZ5X2NiOworCX0KKworSU1QTEVNRU5UX1NUQUNLX09GKFg1MDlfTE9PS1VQKQorSU1QTEVNRU5UX1NUQUNLX09GKFg1MDlfT0JKRUNUKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9vYmouYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfb2JqLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmZWQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfb2JqLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfb2JqLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKworY2hhciAqWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9OQU1FICphLCBjaGFyICpidWYsIGludCBsZW4pCisJeworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CitpbnQgaTsKKwlpbnQgbixsb2xkLGwsbDEsbDIsbnVtLGosdHlwZTsKKwljb25zdCBjaGFyICpzOworCWNoYXIgKnA7CisJdW5zaWduZWQgY2hhciAqcTsKKwlCVUZfTUVNICpiPU5VTEw7CisJc3RhdGljIGNvbnN0IGNoYXIgaGV4WzE3XT0iMDEyMzQ1Njc4OUFCQ0RFRiI7CisJaW50IGdzX2RvaXRbNF07CisJY2hhciB0bXBfYnVmWzgwXTsKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworCWNoYXIgZWJjZGljX2J1ZlsxMDI0XTsKKyNlbmRpZgorCisJaWYgKGJ1ZiA9PSBOVUxMKQorCQl7CisJCWlmICgoYj1CVUZfTUVNX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJaWYgKCFCVUZfTUVNX2dyb3coYiwyMDApKSBnb3RvIGVycjsKKwkJYi0+ZGF0YVswXT0nXDAnOworCQlsZW49MjAwOworCQl9CisJaWYgKGEgPT0gTlVMTCkKKwkgICAgeworCSAgICBpZihiKQorCQl7CisJCWJ1Zj1iLT5kYXRhOworCQlPUEVOU1NMX2ZyZWUoYik7CisJCX0KKwkgICAgc3RybmNweShidWYsIk5PIFg1MDlfTkFNRSIsbGVuKTsKKwkgICAgYnVmW2xlbi0xXT0nXDAnOworCSAgICByZXR1cm4gYnVmOworCSAgICB9CisKKwlsZW4tLTsgLyogc3BhY2UgZm9yICdcMCcgKi8KKwlsPTA7CisJZm9yIChpPTA7IGk8c2tfWDUwOV9OQU1FX0VOVFJZX251bShhLT5lbnRyaWVzKTsgaSsrKQorCQl7CisJCW5lPXNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShhLT5lbnRyaWVzLGkpOworCQluPU9CSl9vYmoybmlkKG5lLT5vYmplY3QpOworCQlpZiAoKG4gPT0gTklEX3VuZGVmKSB8fCAoKHM9T0JKX25pZDJzbihuKSkgPT0gTlVMTCkpCisJCQl7CisJCQlpMnRfQVNOMV9PQkpFQ1QodG1wX2J1ZixzaXplb2YodG1wX2J1ZiksbmUtPm9iamVjdCk7CisJCQlzPXRtcF9idWY7CisJCQl9CisJCWwxPXN0cmxlbihzKTsKKworCQl0eXBlPW5lLT52YWx1ZS0+dHlwZTsKKwkJbnVtPW5lLT52YWx1ZS0+bGVuZ3RoOworCQlxPW5lLT52YWx1ZS0+ZGF0YTsKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFZfQVNOMV9HRU5FUkFMU1RSSU5HIHx8CisJCSAgICB0eXBlID09IFZfQVNOMV9WSVNJQkxFU1RSSU5HIHx8CisJCSAgICB0eXBlID09IFZfQVNOMV9QUklOVEFCTEVTVFJJTkcgfHwKKwkJICAgIHR5cGUgPT0gVl9BU04xX1RFTEVURVhTVFJJTkcgfHwKKwkJICAgIHR5cGUgPT0gVl9BU04xX1ZJU0lCTEVTVFJJTkcgfHwKKwkJICAgIHR5cGUgPT0gVl9BU04xX0lBNVNUUklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNjaWkyZWJjZGljKGViY2RpY19idWYsIHEsCisJCQkJICAgICAobnVtID4gc2l6ZW9mIGViY2RpY19idWYpCisJCQkJICAgICA/IHNpemVvZiBlYmNkaWNfYnVmIDogbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHE9ZWJjZGljX2J1ZjsKKwkJfQorI2VuZGlmCisKKwkJaWYgKCh0eXBlID09IFZfQVNOMV9HRU5FUkFMU1RSSU5HKSAmJiAoKG51bSU0KSA9PSAwKSkKKwkJCXsKKwkJCWdzX2RvaXRbMF09Z3NfZG9pdFsxXT1nc19kb2l0WzJdPWdzX2RvaXRbM109MDsKKwkJCWZvciAoaj0wOyBqPG51bTsgaisrKQorCQkJCWlmIChxW2pdICE9IDApIGdzX2RvaXRbaiYzXT0xOworCisJCQlpZiAoZ3NfZG9pdFswXXxnc19kb2l0WzFdfGdzX2RvaXRbMl0pCisJCQkJZ3NfZG9pdFswXT1nc19kb2l0WzFdPWdzX2RvaXRbMl09Z3NfZG9pdFszXT0xOworCQkJZWxzZQorCQkJCXsKKwkJCQlnc19kb2l0WzBdPWdzX2RvaXRbMV09Z3NfZG9pdFsyXT0wOworCQkJCWdzX2RvaXRbM109MTsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCWdzX2RvaXRbMF09Z3NfZG9pdFsxXT1nc19kb2l0WzJdPWdzX2RvaXRbM109MTsKKworCQlmb3IgKGwyPWo9MDsgajxudW07IGorKykKKwkJCXsKKwkJCWlmICghZ3NfZG9pdFtqJjNdKSBjb250aW51ZTsKKwkJCWwyKys7CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCQlpZiAoKHFbal0gPCAnICcpIHx8IChxW2pdID4gJ34nKSkgbDIrPTM7CisjZWxzZQorCQkJaWYgKChvc190b2FzY2lpW3Fbal1dIDwgb3NfdG9hc2NpaVsnICddKSB8fAorCQkJICAgIChvc190b2FzY2lpW3Fbal1dID4gb3NfdG9hc2NpaVsnfiddKSkgbDIrPTM7CisjZW5kaWYKKwkJCX0KKworCQlsb2xkPWw7CisJCWwrPTErbDErMStsMjsKKwkJaWYgKGIgIT0gTlVMTCkKKwkJCXsKKwkJCWlmICghQlVGX01FTV9ncm93KGIsbCsxKSkgZ290byBlcnI7CisJCQlwPSAmKGItPmRhdGFbbG9sZF0pOworCQkJfQorCQllbHNlIGlmIChsID4gbGVuKQorCQkJeworCQkJYnJlYWs7CisJCQl9CisJCWVsc2UKKwkJCXA9ICYoYnVmW2xvbGRdKTsKKwkJKihwKyspPScvJzsKKwkJbWVtY3B5KHAscywodW5zaWduZWQgaW50KWwxKTsgcCs9bDE7CisJCSoocCsrKT0nPSc7CisKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMgLyogcSB3YXMgYXNzaWduZWQgYWJvdmUgYWxyZWFkeS4gKi8KKwkJcT1uZS0+dmFsdWUtPmRhdGE7CisjZW5kaWYKKworCQlmb3IgKGo9MDsgajxudW07IGorKykKKwkJCXsKKwkJCWlmICghZ3NfZG9pdFtqJjNdKSBjb250aW51ZTsKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJCW49cVtqXTsKKwkJCWlmICgobiA8ICcgJykgfHwgKG4gPiAnficpKQorCQkJCXsKKwkJCQkqKHArKyk9J1xcJzsKKwkJCQkqKHArKyk9J3gnOworCQkJCSoocCsrKT1oZXhbKG4+PjQpJjB4MGZdOworCQkJCSoocCsrKT1oZXhbbiYweDBmXTsKKwkJCQl9CisJCQllbHNlCisJCQkJKihwKyspPW47CisjZWxzZQorCQkJbj1vc190b2FzY2lpW3Fbal1dOworCQkJaWYgKChuIDwgb3NfdG9hc2NpaVsnICddKSB8fAorCQkJICAgIChuID4gb3NfdG9hc2NpaVsnfiddKSkKKwkJCQl7CisJCQkJKihwKyspPSdcXCc7CisJCQkJKihwKyspPSd4JzsKKwkJCQkqKHArKyk9aGV4WyhuPj40KSYweDBmXTsKKwkJCQkqKHArKyk9aGV4W24mMHgwZl07CisJCQkJfQorCQkJZWxzZQorCQkJCSoocCsrKT1xW2pdOworI2VuZGlmCisJCQl9CisJCSpwPSdcMCc7CisJCX0KKwlpZiAoYiAhPSBOVUxMKQorCQl7CisJCXA9Yi0+ZGF0YTsKKwkJT1BFTlNTTF9mcmVlKGIpOworCQl9CisJZWxzZQorCQlwPWJ1ZjsKKwlpZiAoaSA9PSAwKQorCQkqcCA9ICdcMCc7CisJcmV0dXJuKHApOworZXJyOgorCVg1MDllcnIoWDUwOV9GX1g1MDlfTkFNRV9PTkVMSU5FLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlpZiAoYiAhPSBOVUxMKSBCVUZfTUVNX2ZyZWUoYik7CisJcmV0dXJuKE5VTEwpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9yMnguYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfcjJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0YTE0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfcjJ4LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfcjJ4LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorCitYNTA5ICpYNTA5X1JFUV90b19YNTA5KFg1MDlfUkVRICpyLCBpbnQgZGF5cywgRVZQX1BLRVkgKnBrZXkpCisJeworCVg1MDkgKnJldD1OVUxMOworCVg1MDlfQ0lORiAqeGk9TlVMTDsKKwlYNTA5X05BTUUgKnhuOworCisJaWYgKChyZXQ9WDUwOV9uZXcoKSkgPT0gTlVMTCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1JFUV9UT19YNTA5LEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCS8qIGR1cGxpY2F0ZSB0aGUgcmVxdWVzdCAqLworCXhpPXJldC0+Y2VydF9pbmZvOworCisJaWYgKHNrX1g1MDlfQVRUUklCVVRFX251bShyLT5yZXFfaW5mby0+YXR0cmlidXRlcykgIT0gMCkKKwkJeworCQlpZiAoKHhpLT52ZXJzaW9uPU1fQVNOMV9JTlRFR0VSX25ldygpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJaWYgKCFBU04xX0lOVEVHRVJfc2V0KHhpLT52ZXJzaW9uLDIpKSBnb3RvIGVycjsKKy8qCQl4aS0+ZXh0ZW5zaW9ucz1yaS0+YXR0cmlidXRlczsgPC0gYmFkLCBzaG91bGQgbm90IGV2ZXIgYmUgZG9uZQorCQlyaS0+YXR0cmlidXRlcz1OVUxMOyAqLworCQl9CisKKwl4bj1YNTA5X1JFUV9nZXRfc3ViamVjdF9uYW1lKHIpOworCWlmIChYNTA5X3NldF9zdWJqZWN0X25hbWUocmV0LFg1MDlfTkFNRV9kdXAoeG4pKSA9PSAwKQorCQlnb3RvIGVycjsKKwlpZiAoWDUwOV9zZXRfaXNzdWVyX25hbWUocmV0LFg1MDlfTkFNRV9kdXAoeG4pKSA9PSAwKQorCQlnb3RvIGVycjsKKworCWlmIChYNTA5X2dtdGltZV9hZGooeGktPnZhbGlkaXR5LT5ub3RCZWZvcmUsMCkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJaWYgKFg1MDlfZ210aW1lX2Fkaih4aS0+dmFsaWRpdHktPm5vdEFmdGVyLChsb25nKTYwKjYwKjI0KmRheXMpID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJWDUwOV9zZXRfcHVia2V5KHJldCxYNTA5X1JFUV9nZXRfcHVia2V5KHIpKTsKKworCWlmICghWDUwOV9zaWduKHJldCxwa2V5LEVWUF9tZDUoKSkpCisJCWdvdG8gZXJyOworCWlmICgwKQorCQl7CitlcnI6CisJCVg1MDlfZnJlZShyZXQpOworCQlyZXQ9TlVMTDsKKwkJfQorCXJldHVybihyZXQpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9yZXEuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxODNkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfcmVxLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfcmVxLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCitYNTA5X1JFUSAqWDUwOV90b19YNTA5X1JFUShYNTA5ICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCkKKwl7CisJWDUwOV9SRVEgKnJldDsKKwlYNTA5X1JFUV9JTkZPICpyaTsKKwlpbnQgaTsKKwlFVlBfUEtFWSAqcGt0bXA7CisKKwlyZXQ9WDUwOV9SRVFfbmV3KCk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfVE9fWDUwOV9SRVEsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJcmk9cmV0LT5yZXFfaW5mbzsKKworCXJpLT52ZXJzaW9uLT5sZW5ndGg9MTsKKwlyaS0+dmVyc2lvbi0+ZGF0YT0odW5zaWduZWQgY2hhciAqKU9QRU5TU0xfbWFsbG9jKDEpOworCWlmIChyaS0+dmVyc2lvbi0+ZGF0YSA9PSBOVUxMKSBnb3RvIGVycjsKKwlyaS0+dmVyc2lvbi0+ZGF0YVswXT0wOyAvKiB2ZXJzaW9uID09IDAgKi8KKworCWlmICghWDUwOV9SRVFfc2V0X3N1YmplY3RfbmFtZShyZXQsWDUwOV9nZXRfc3ViamVjdF9uYW1lKHgpKSkKKwkJZ290byBlcnI7CisKKwlwa3RtcCA9IFg1MDlfZ2V0X3B1YmtleSh4KTsKKwlpPVg1MDlfUkVRX3NldF9wdWJrZXkocmV0LHBrdG1wKTsKKwlFVlBfUEtFWV9mcmVlKHBrdG1wKTsKKwlpZiAoIWkpIGdvdG8gZXJyOworCisJaWYgKHBrZXkgIT0gTlVMTCkKKwkJeworCQlpZiAoIVg1MDlfUkVRX3NpZ24ocmV0LHBrZXksbWQpKQorCQkJZ290byBlcnI7CisJCX0KKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlYNTA5X1JFUV9mcmVlKHJldCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworRVZQX1BLRVkgKlg1MDlfUkVRX2dldF9wdWJrZXkoWDUwOV9SRVEgKnJlcSkKKwl7CisJaWYgKChyZXEgPT0gTlVMTCkgfHwgKHJlcS0+cmVxX2luZm8gPT0gTlVMTCkpCisJCXJldHVybihOVUxMKTsKKwlyZXR1cm4oWDUwOV9QVUJLRVlfZ2V0KHJlcS0+cmVxX2luZm8tPnB1YmtleSkpOworCX0KKworaW50IFg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5KFg1MDlfUkVRICp4LCBFVlBfUEtFWSAqaykKKwl7CisJRVZQX1BLRVkgKnhrPU5VTEw7CisJaW50IG9rPTA7CisKKwl4az1YNTA5X1JFUV9nZXRfcHVia2V5KHgpOworCXN3aXRjaCAoRVZQX1BLRVlfY21wKHhrLCBrKSkKKwkJeworCWNhc2UgMToKKwkJb2s9MTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1JFUV9DSEVDS19QUklWQVRFX0tFWSxYNTA5X1JfS0VZX1ZBTFVFU19NSVNNQVRDSCk7CisJCWJyZWFrOworCWNhc2UgLTE6CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfUkVRX0NIRUNLX1BSSVZBVEVfS0VZLFg1MDlfUl9LRVlfVFlQRV9NSVNNQVRDSCk7CisJCWJyZWFrOworCWNhc2UgLTI6CisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKwkJaWYgKGstPnR5cGUgPT0gRVZQX1BLRVlfRUMpCisJCQl7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1JFUV9DSEVDS19QUklWQVRFX0tFWSwgRVJSX1JfRUNfTElCKTsKKwkJCWJyZWFrOworCQkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwkJaWYgKGstPnR5cGUgPT0gRVZQX1BLRVlfREgpCisJCQl7CisJCQkvKiBObyBpZGVhICovCisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1JFUV9DSEVDS19QUklWQVRFX0tFWSxYNTA5X1JfQ0FOVF9DSEVDS19ESF9LRVkpOworCQkJYnJlYWs7CisJCQl9CisjZW5kaWYKKwkgICAgICAgIFg1MDllcnIoWDUwOV9GX1g1MDlfUkVRX0NIRUNLX1BSSVZBVEVfS0VZLFg1MDlfUl9VTktOT1dOX0tFWV9UWVBFKTsKKwkJfQorCisJRVZQX1BLRVlfZnJlZSh4ayk7CisJcmV0dXJuKG9rKTsKKwl9CisKKy8qIEl0IHNlZW1zIHNldmVyYWwgb3JnYW5pc2F0aW9ucyBoYWQgdGhlIHNhbWUgaWRlYSBvZiBpbmNsdWRpbmcgYSBsaXN0IG9mCisgKiBleHRlbnNpb25zIGluIGEgY2VydGlmaWNhdGUgcmVxdWVzdC4gVGhlcmUgYXJlIGF0IGxlYXN0IHR3byBPSURzIHRoYXQgYXJlCisgKiB1c2VkIGFuZCB0aGVyZSBtYXkgYmUgbW9yZTogc28gdGhlIGxpc3QgaXMgY29uZmlndXJhYmxlLgorICovCisKK3N0YXRpYyBpbnQgZXh0X25pZF9saXN0W10gPSB7IE5JRF9leHRfcmVxLCBOSURfbXNfZXh0X3JlcSwgTklEX3VuZGVmfTsKKworc3RhdGljIGludCAqZXh0X25pZHMgPSBleHRfbmlkX2xpc3Q7CisKK2ludCBYNTA5X1JFUV9leHRlbnNpb25fbmlkKGludCByZXFfbmlkKQoreworCWludCBpLCBuaWQ7CisJZm9yKGkgPSAwOyA7IGkrKykgeworCQluaWQgPSBleHRfbmlkc1tpXTsKKwkJaWYobmlkID09IE5JRF91bmRlZikgcmV0dXJuIDA7CisJCWVsc2UgaWYgKHJlcV9uaWQgPT0gbmlkKSByZXR1cm4gMTsKKwl9Cit9CisKK2ludCAqWDUwOV9SRVFfZ2V0X2V4dGVuc2lvbl9uaWRzKHZvaWQpCit7CisJcmV0dXJuIGV4dF9uaWRzOworfQorCQordm9pZCBYNTA5X1JFUV9zZXRfZXh0ZW5zaW9uX25pZHMoaW50ICpuaWRzKQoreworCWV4dF9uaWRzID0gbmlkczsKK30KKworU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpYNTA5X1JFUV9nZXRfZXh0ZW5zaW9ucyhYNTA5X1JFUSAqcmVxKQorCXsKKwlYNTA5X0FUVFJJQlVURSAqYXR0cjsKKwlBU04xX1RZUEUgKmV4dCA9IE5VTEw7CisJaW50IGlkeCwgKnBuaWQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKworCWlmICgocmVxID09IE5VTEwpIHx8IChyZXEtPnJlcV9pbmZvID09IE5VTEwpIHx8ICFleHRfbmlkcykKKwkJcmV0dXJuKE5VTEwpOworCWZvciAocG5pZCA9IGV4dF9uaWRzOyAqcG5pZCAhPSBOSURfdW5kZWY7IHBuaWQrKykKKwkJeworCQlpZHggPSBYNTA5X1JFUV9nZXRfYXR0cl9ieV9OSUQocmVxLCAqcG5pZCwgLTEpOworCQlpZiAoaWR4ID09IC0xKQorCQkJY29udGludWU7CisJCWF0dHIgPSBYNTA5X1JFUV9nZXRfYXR0cihyZXEsIGlkeCk7CisJCWlmKGF0dHItPnNpbmdsZSkgZXh0ID0gYXR0ci0+dmFsdWUuc2luZ2xlOworCQllbHNlIGlmKHNrX0FTTjFfVFlQRV9udW0oYXR0ci0+dmFsdWUuc2V0KSkKKwkJCWV4dCA9IHNrX0FTTjFfVFlQRV92YWx1ZShhdHRyLT52YWx1ZS5zZXQsIDApOworCQlicmVhazsKKwkJfQorCWlmKCFleHQgfHwgKGV4dC0+dHlwZSAhPSBWX0FTTjFfU0VRVUVOQ0UpKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gZXh0LT52YWx1ZS5zZXF1ZW5jZS0+ZGF0YTsKKwlyZXR1cm4gKFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKQorCQlBU04xX2l0ZW1fZDJpKE5VTEwsICZwLCBleHQtPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGgsCisJCQkJQVNOMV9JVEVNX3JwdHIoWDUwOV9FWFRFTlNJT05TKSk7Cit9CisKKy8qIEFkZCBhIFNUQUNLX09GIGV4dGVuc2lvbnMgdG8gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0OiBhbGxvdyBhbHRlcm5hdGl2ZSBPSURzCisgKiBpbiBjYXNlIHdlIHdhbnQgdG8gY3JlYXRlIGEgbm9uIHN0YW5kYXJkIG9uZS4KKyAqLworCitpbnQgWDUwOV9SRVFfYWRkX2V4dGVuc2lvbnNfbmlkKFg1MDlfUkVRICpyZXEsIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0cywKKwkJCQlpbnQgbmlkKQoreworCUFTTjFfVFlQRSAqYXQgPSBOVUxMOworCVg1MDlfQVRUUklCVVRFICphdHRyID0gTlVMTDsKKwlpZighKGF0ID0gQVNOMV9UWVBFX25ldygpKSB8fAorCQkhKGF0LT52YWx1ZS5zZXF1ZW5jZSA9IEFTTjFfU1RSSU5HX25ldygpKSkgZ290byBlcnI7CisKKwlhdC0+dHlwZSA9IFZfQVNOMV9TRVFVRU5DRTsKKwkvKiBHZW5lcmF0ZSBlbmNvZGluZyBvZiBleHRlbnNpb25zICovCisJYXQtPnZhbHVlLnNlcXVlbmNlLT5sZW5ndGggPSAKKwkJCUFTTjFfaXRlbV9pMmQoKEFTTjFfVkFMVUUgKilleHRzLAorCQkJCSZhdC0+dmFsdWUuc2VxdWVuY2UtPmRhdGEsCisJCQkJQVNOMV9JVEVNX3JwdHIoWDUwOV9FWFRFTlNJT05TKSk7CisJaWYoIShhdHRyID0gWDUwOV9BVFRSSUJVVEVfbmV3KCkpKSBnb3RvIGVycjsKKwlpZighKGF0dHItPnZhbHVlLnNldCA9IHNrX0FTTjFfVFlQRV9uZXdfbnVsbCgpKSkgZ290byBlcnI7CisJaWYoIXNrX0FTTjFfVFlQRV9wdXNoKGF0dHItPnZhbHVlLnNldCwgYXQpKSBnb3RvIGVycjsKKwlhdCA9IE5VTEw7CisJYXR0ci0+c2luZ2xlID0gMDsKKwlhdHRyLT5vYmplY3QgPSBPQkpfbmlkMm9iaihuaWQpOworCWlmICghcmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcykKKwkJeworCQlpZiAoIShyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzID0gc2tfWDUwOV9BVFRSSUJVVEVfbmV3X251bGwoKSkpCisJCQlnb3RvIGVycjsKKwkJfQorCWlmKCFza19YNTA5X0FUVFJJQlVURV9wdXNoKHJlcS0+cmVxX2luZm8tPmF0dHJpYnV0ZXMsIGF0dHIpKSBnb3RvIGVycjsKKwlyZXR1cm4gMTsKKwllcnI6CisJWDUwOV9BVFRSSUJVVEVfZnJlZShhdHRyKTsKKwlBU04xX1RZUEVfZnJlZShhdCk7CisJcmV0dXJuIDA7Cit9CisvKiBUaGlzIGlzIHRoZSBub3JtYWwgdXNhZ2U6IHVzZSB0aGUgIm9mZmljaWFsIiBPSUQgKi8KK2ludCBYNTA5X1JFUV9hZGRfZXh0ZW5zaW9ucyhYNTA5X1JFUSAqcmVxLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHMpCit7CisJcmV0dXJuIFg1MDlfUkVRX2FkZF9leHRlbnNpb25zX25pZChyZXEsIGV4dHMsIE5JRF9leHRfcmVxKTsKK30KKworLyogUmVxdWVzdCBhdHRyaWJ1dGUgZnVuY3Rpb25zICovCisKK2ludCBYNTA5X1JFUV9nZXRfYXR0cl9jb3VudChjb25zdCBYNTA5X1JFUSAqcmVxKQoreworCXJldHVybiBYNTA5YXRfZ2V0X2F0dHJfY291bnQocmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcyk7Cit9CisKK2ludCBYNTA5X1JFUV9nZXRfYXR0cl9ieV9OSUQoY29uc3QgWDUwOV9SRVEgKnJlcSwgaW50IG5pZCwKKwkJCSAgaW50IGxhc3Rwb3MpCit7CisJcmV0dXJuIFg1MDlhdF9nZXRfYXR0cl9ieV9OSUQocmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcywgbmlkLCBsYXN0cG9zKTsKK30KKworaW50IFg1MDlfUkVRX2dldF9hdHRyX2J5X09CSihjb25zdCBYNTA5X1JFUSAqcmVxLCBBU04xX09CSkVDVCAqb2JqLAorCQkJICBpbnQgbGFzdHBvcykKK3sKKwlyZXR1cm4gWDUwOWF0X2dldF9hdHRyX2J5X09CSihyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzLCBvYmosIGxhc3Rwb3MpOworfQorCitYNTA5X0FUVFJJQlVURSAqWDUwOV9SRVFfZ2V0X2F0dHIoY29uc3QgWDUwOV9SRVEgKnJlcSwgaW50IGxvYykKK3sKKwlyZXR1cm4gWDUwOWF0X2dldF9hdHRyKHJlcS0+cmVxX2luZm8tPmF0dHJpYnV0ZXMsIGxvYyk7Cit9CisKK1g1MDlfQVRUUklCVVRFICpYNTA5X1JFUV9kZWxldGVfYXR0cihYNTA5X1JFUSAqcmVxLCBpbnQgbG9jKQoreworCXJldHVybiBYNTA5YXRfZGVsZXRlX2F0dHIocmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcywgbG9jKTsKK30KKworaW50IFg1MDlfUkVRX2FkZDFfYXR0cihYNTA5X1JFUSAqcmVxLCBYNTA5X0FUVFJJQlVURSAqYXR0cikKK3sKKwlpZihYNTA5YXRfYWRkMV9hdHRyKCZyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzLCBhdHRyKSkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBYNTA5X1JFUV9hZGQxX2F0dHJfYnlfT0JKKFg1MDlfUkVRICpyZXEsCisJCQljb25zdCBBU04xX09CSkVDVCAqb2JqLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQoreworCWlmKFg1MDlhdF9hZGQxX2F0dHJfYnlfT0JKKCZyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzLCBvYmosCisJCQkJdHlwZSwgYnl0ZXMsIGxlbikpIHJldHVybiAxOworCXJldHVybiAwOworfQorCitpbnQgWDUwOV9SRVFfYWRkMV9hdHRyX2J5X05JRChYNTA5X1JFUSAqcmVxLAorCQkJaW50IG5pZCwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKK3sKKwlpZihYNTA5YXRfYWRkMV9hdHRyX2J5X05JRCgmcmVxLT5yZXFfaW5mby0+YXR0cmlidXRlcywgbmlkLAorCQkJCXR5cGUsIGJ5dGVzLCBsZW4pKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworaW50IFg1MDlfUkVRX2FkZDFfYXR0cl9ieV90eHQoWDUwOV9SRVEgKnJlcSwKKwkJCWNvbnN0IGNoYXIgKmF0dHJuYW1lLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKQoreworCWlmKFg1MDlhdF9hZGQxX2F0dHJfYnlfdHh0KCZyZXEtPnJlcV9pbmZvLT5hdHRyaWJ1dGVzLCBhdHRybmFtZSwKKwkJCQl0eXBlLCBieXRlcywgbGVuKSkgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X3NldC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yjk0ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV9zZXQuYwpAQCAtMCwwICsxLDE1MCBAQAorLyogY3J5cHRvL3g1MDkveDUwOV9zZXQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKK2ludCBYNTA5X3NldF92ZXJzaW9uKFg1MDkgKngsIGxvbmcgdmVyc2lvbikKKwl7CisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCWlmICh4LT5jZXJ0X2luZm8tPnZlcnNpb24gPT0gTlVMTCkKKwkJeworCQlpZiAoKHgtPmNlcnRfaW5mby0+dmVyc2lvbj1NX0FTTjFfSU5URUdFUl9uZXcoKSkgPT0gTlVMTCkKKwkJCXJldHVybigwKTsKKwkJfQorCXJldHVybihBU04xX0lOVEVHRVJfc2V0KHgtPmNlcnRfaW5mby0+dmVyc2lvbix2ZXJzaW9uKSk7CisJfQorCitpbnQgWDUwOV9zZXRfc2VyaWFsTnVtYmVyKFg1MDkgKngsIEFTTjFfSU5URUdFUiAqc2VyaWFsKQorCXsKKwlBU04xX0lOVEVHRVIgKmluOworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCWluPXgtPmNlcnRfaW5mby0+c2VyaWFsTnVtYmVyOworCWlmIChpbiAhPSBzZXJpYWwpCisJCXsKKwkJaW49TV9BU04xX0lOVEVHRVJfZHVwKHNlcmlhbCk7CisJCWlmIChpbiAhPSBOVUxMKQorCQkJeworCQkJTV9BU04xX0lOVEVHRVJfZnJlZSh4LT5jZXJ0X2luZm8tPnNlcmlhbE51bWJlcik7CisJCQl4LT5jZXJ0X2luZm8tPnNlcmlhbE51bWJlcj1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X3NldF9pc3N1ZXJfbmFtZShYNTA5ICp4LCBYNTA5X05BTUUgKm5hbWUpCisJeworCWlmICgoeCA9PSBOVUxMKSB8fCAoeC0+Y2VydF9pbmZvID09IE5VTEwpKSByZXR1cm4oMCk7CisJcmV0dXJuKFg1MDlfTkFNRV9zZXQoJngtPmNlcnRfaW5mby0+aXNzdWVyLG5hbWUpKTsKKwl9CisKK2ludCBYNTA5X3NldF9zdWJqZWN0X25hbWUoWDUwOSAqeCwgWDUwOV9OQU1FICpuYW1lKQorCXsKKwlpZiAoKHggPT0gTlVMTCkgfHwgKHgtPmNlcnRfaW5mbyA9PSBOVUxMKSkgcmV0dXJuKDApOworCXJldHVybihYNTA5X05BTUVfc2V0KCZ4LT5jZXJ0X2luZm8tPnN1YmplY3QsbmFtZSkpOworCX0KKworaW50IFg1MDlfc2V0X25vdEJlZm9yZShYNTA5ICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKQorCXsKKwlBU04xX1RJTUUgKmluOworCisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5jZXJ0X2luZm8tPnZhbGlkaXR5ID09IE5VTEwpKSByZXR1cm4oMCk7CisJaW49eC0+Y2VydF9pbmZvLT52YWxpZGl0eS0+bm90QmVmb3JlOworCWlmIChpbiAhPSB0bSkKKwkJeworCQlpbj1NX0FTTjFfVElNRV9kdXAodG0pOworCQlpZiAoaW4gIT0gTlVMTCkKKwkJCXsKKwkJCU1fQVNOMV9USU1FX2ZyZWUoeC0+Y2VydF9pbmZvLT52YWxpZGl0eS0+bm90QmVmb3JlKTsKKwkJCXgtPmNlcnRfaW5mby0+dmFsaWRpdHktPm5vdEJlZm9yZT1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X3NldF9ub3RBZnRlcihYNTA5ICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKQorCXsKKwlBU04xX1RJTUUgKmluOworCisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5jZXJ0X2luZm8tPnZhbGlkaXR5ID09IE5VTEwpKSByZXR1cm4oMCk7CisJaW49eC0+Y2VydF9pbmZvLT52YWxpZGl0eS0+bm90QWZ0ZXI7CisJaWYgKGluICE9IHRtKQorCQl7CisJCWluPU1fQVNOMV9USU1FX2R1cCh0bSk7CisJCWlmIChpbiAhPSBOVUxMKQorCQkJeworCQkJTV9BU04xX1RJTUVfZnJlZSh4LT5jZXJ0X2luZm8tPnZhbGlkaXR5LT5ub3RBZnRlcik7CisJCQl4LT5jZXJ0X2luZm8tPnZhbGlkaXR5LT5ub3RBZnRlcj1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X3NldF9wdWJrZXkoWDUwOSAqeCwgRVZQX1BLRVkgKnBrZXkpCisJeworCWlmICgoeCA9PSBOVUxMKSB8fCAoeC0+Y2VydF9pbmZvID09IE5VTEwpKSByZXR1cm4oMCk7CisJcmV0dXJuKFg1MDlfUFVCS0VZX3NldCgmKHgtPmNlcnRfaW5mby0+a2V5KSxwa2V5KSk7CisJfQorCisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV90cnMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdHJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjYjljOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdHJzLmMKQEAgLTAsMCArMSwyODggQEAKKy8qIHg1MDlfdHJzLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworCitzdGF0aWMgaW50IHRyX2NtcChjb25zdCBYNTA5X1RSVVNUICogY29uc3QgKmEsCisJCWNvbnN0IFg1MDlfVFJVU1QgKiBjb25zdCAqYik7CitzdGF0aWMgdm9pZCB0cnRhYmxlX2ZyZWUoWDUwOV9UUlVTVCAqcCk7CisKK3N0YXRpYyBpbnQgdHJ1c3RfMW9pZGFueShYNTA5X1RSVVNUICp0cnVzdCwgWDUwOSAqeCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgdHJ1c3RfMW9pZChYNTA5X1RSVVNUICp0cnVzdCwgWDUwOSAqeCwgaW50IGZsYWdzKTsKK3N0YXRpYyBpbnQgdHJ1c3RfY29tcGF0KFg1MDlfVFJVU1QgKnRydXN0LCBYNTA5ICp4LCBpbnQgZmxhZ3MpOworCitzdGF0aWMgaW50IG9ial90cnVzdChpbnQgaWQsIFg1MDkgKngsIGludCBmbGFncyk7CitzdGF0aWMgaW50ICgqZGVmYXVsdF90cnVzdCkoaW50IGlkLCBYNTA5ICp4LCBpbnQgZmxhZ3MpID0gb2JqX3RydXN0OworCisvKiBXQVJOSU5HOiB0aGUgZm9sbG93aW5nIHRhYmxlIHNob3VsZCBiZSBrZXB0IGluIG9yZGVyIG9mIHRydXN0CisgKiBhbmQgd2l0aG91dCBhbnkgZ2FwcyBzbyB3ZSBjYW4ganVzdCBzdWJ0cmFjdCB0aGUgbWluaW11bSB0cnVzdAorICogdmFsdWUgdG8gZ2V0IGFuIGluZGV4IGludG8gdGhlIHRhYmxlCisgKi8KKworc3RhdGljIFg1MDlfVFJVU1QgdHJzdGFuZGFyZFtdID0gewore1g1MDlfVFJVU1RfQ09NUEFULCAwLCB0cnVzdF9jb21wYXQsICJjb21wYXRpYmxlIiwgMCwgTlVMTH0sCit7WDUwOV9UUlVTVF9TU0xfQ0xJRU5ULCAwLCB0cnVzdF8xb2lkYW55LCAiU1NMIENsaWVudCIsIE5JRF9jbGllbnRfYXV0aCwgTlVMTH0sCit7WDUwOV9UUlVTVF9TU0xfU0VSVkVSLCAwLCB0cnVzdF8xb2lkYW55LCAiU1NMIFNlcnZlciIsIE5JRF9zZXJ2ZXJfYXV0aCwgTlVMTH0sCit7WDUwOV9UUlVTVF9FTUFJTCwgMCwgdHJ1c3RfMW9pZGFueSwgIlMvTUlNRSBlbWFpbCIsIE5JRF9lbWFpbF9wcm90ZWN0LCBOVUxMfSwKK3tYNTA5X1RSVVNUX09CSkVDVF9TSUdOLCAwLCB0cnVzdF8xb2lkYW55LCAiT2JqZWN0IFNpZ25lciIsIE5JRF9jb2RlX3NpZ24sIE5VTEx9LAore1g1MDlfVFJVU1RfT0NTUF9TSUdOLCAwLCB0cnVzdF8xb2lkLCAiT0NTUCByZXNwb25kZXIiLCBOSURfT0NTUF9zaWduLCBOVUxMfSwKK3tYNTA5X1RSVVNUX09DU1BfUkVRVUVTVCwgMCwgdHJ1c3RfMW9pZCwgIk9DU1AgcmVxdWVzdCIsIE5JRF9hZF9PQ1NQLCBOVUxMfSwKK3tYNTA5X1RSVVNUX1RTQSwgMCwgdHJ1c3RfMW9pZGFueSwgIlRTQSBzZXJ2ZXIiLCBOSURfdGltZV9zdGFtcCwgTlVMTH0KK307CisKKyNkZWZpbmUgWDUwOV9UUlVTVF9DT1VOVAkoc2l6ZW9mKHRyc3RhbmRhcmQpL3NpemVvZihYNTA5X1RSVVNUKSkKKworSU1QTEVNRU5UX1NUQUNLX09GKFg1MDlfVFJVU1QpCisKK3N0YXRpYyBTVEFDS19PRihYNTA5X1RSVVNUKSAqdHJ0YWJsZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgdHJfY21wKGNvbnN0IFg1MDlfVFJVU1QgKiBjb25zdCAqYSwKKwkJY29uc3QgWDUwOV9UUlVTVCAqIGNvbnN0ICpiKQoreworCXJldHVybiAoKmEpLT50cnVzdCAtICgqYiktPnRydXN0OworfQorCitpbnQgKCpYNTA5X1RSVVNUX3NldF9kZWZhdWx0KGludCAoKnRydXN0KShpbnQgLCBYNTA5ICosIGludCkpKShpbnQsIFg1MDkgKiwgaW50KQoreworCWludCAoKm9sZHRydXN0KShpbnQgLCBYNTA5ICosIGludCk7CisJb2xkdHJ1c3QgPSBkZWZhdWx0X3RydXN0OworCWRlZmF1bHRfdHJ1c3QgPSB0cnVzdDsKKwlyZXR1cm4gb2xkdHJ1c3Q7Cit9CisKKworaW50IFg1MDlfY2hlY2tfdHJ1c3QoWDUwOSAqeCwgaW50IGlkLCBpbnQgZmxhZ3MpCit7CisJWDUwOV9UUlVTVCAqcHQ7CisJaW50IGlkeDsKKwlpZihpZCA9PSAtMSkgcmV0dXJuIDE7CisJaWR4ID0gWDUwOV9UUlVTVF9nZXRfYnlfaWQoaWQpOworCWlmKGlkeCA9PSAtMSkgcmV0dXJuIGRlZmF1bHRfdHJ1c3QoaWQsIHgsIGZsYWdzKTsKKwlwdCA9IFg1MDlfVFJVU1RfZ2V0MChpZHgpOworCXJldHVybiBwdC0+Y2hlY2tfdHJ1c3QocHQsIHgsIGZsYWdzKTsKK30KKworaW50IFg1MDlfVFJVU1RfZ2V0X2NvdW50KHZvaWQpCit7CisJaWYoIXRydGFibGUpIHJldHVybiBYNTA5X1RSVVNUX0NPVU5UOworCXJldHVybiBza19YNTA5X1RSVVNUX251bSh0cnRhYmxlKSArIFg1MDlfVFJVU1RfQ09VTlQ7Cit9CisKK1g1MDlfVFJVU1QgKiBYNTA5X1RSVVNUX2dldDAoaW50IGlkeCkKK3sKKwlpZihpZHggPCAwKSByZXR1cm4gTlVMTDsKKwlpZihpZHggPCAoaW50KVg1MDlfVFJVU1RfQ09VTlQpIHJldHVybiB0cnN0YW5kYXJkICsgaWR4OworCXJldHVybiBza19YNTA5X1RSVVNUX3ZhbHVlKHRydGFibGUsIGlkeCAtIFg1MDlfVFJVU1RfQ09VTlQpOworfQorCitpbnQgWDUwOV9UUlVTVF9nZXRfYnlfaWQoaW50IGlkKQoreworCVg1MDlfVFJVU1QgdG1wOworCWludCBpZHg7CisJaWYoKGlkID49IFg1MDlfVFJVU1RfTUlOKSAmJiAoaWQgPD0gWDUwOV9UUlVTVF9NQVgpKQorCQkJCSByZXR1cm4gaWQgLSBYNTA5X1RSVVNUX01JTjsKKwl0bXAudHJ1c3QgPSBpZDsKKwlpZighdHJ0YWJsZSkgcmV0dXJuIC0xOworCWlkeCA9IHNrX1g1MDlfVFJVU1RfZmluZCh0cnRhYmxlLCAmdG1wKTsKKwlpZihpZHggPT0gLTEpIHJldHVybiAtMTsKKwlyZXR1cm4gaWR4ICsgWDUwOV9UUlVTVF9DT1VOVDsKK30KKworaW50IFg1MDlfVFJVU1Rfc2V0KGludCAqdCwgaW50IHRydXN0KQoreworCWlmKFg1MDlfVFJVU1RfZ2V0X2J5X2lkKHRydXN0KSA9PSAtMSkgeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1RSVVNUX1NFVCwgWDUwOV9SX0lOVkFMSURfVFJVU1QpOworCQlyZXR1cm4gMDsKKwl9CisJKnQgPSB0cnVzdDsKKwlyZXR1cm4gMTsKK30KKworaW50IFg1MDlfVFJVU1RfYWRkKGludCBpZCwgaW50IGZsYWdzLCBpbnQgKCpjaykoWDUwOV9UUlVTVCAqLCBYNTA5ICosIGludCksCisJCQkJCWNoYXIgKm5hbWUsIGludCBhcmcxLCB2b2lkICphcmcyKQoreworCWludCBpZHg7CisJWDUwOV9UUlVTVCAqdHJ0bXA7CisJLyogVGhpcyBpcyBzZXQgYWNjb3JkaW5nIHRvIHdoYXQgd2UgY2hhbmdlOiBhcHBsaWNhdGlvbiBjYW4ndCBzZXQgaXQgKi8KKwlmbGFncyAmPSB+WDUwOV9UUlVTVF9EWU5BTUlDOworCS8qIFRoaXMgd2lsbCBhbHdheXMgYmUgc2V0IGZvciBhcHBsaWNhdGlvbiBtb2RpZmllZCB0cnVzdCBlbnRyaWVzICovCisJZmxhZ3MgfD0gWDUwOV9UUlVTVF9EWU5BTUlDX05BTUU7CisJLyogR2V0IGV4aXN0aW5nIGVudHJ5IGlmIGFueSAqLworCWlkeCA9IFg1MDlfVFJVU1RfZ2V0X2J5X2lkKGlkKTsKKwkvKiBOZWVkIGEgbmV3IGVudHJ5ICovCisJaWYoaWR4ID09IC0xKSB7CisJCWlmKCEodHJ0bXAgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9UUlVTVCkpKSkgeworCQkJWDUwOWVycihYNTA5X0ZfWDUwOV9UUlVTVF9BREQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdHJ0bXAtPmZsYWdzID0gWDUwOV9UUlVTVF9EWU5BTUlDOworCX0gZWxzZSB0cnRtcCA9IFg1MDlfVFJVU1RfZ2V0MChpZHgpOworCisJLyogT1BFTlNTTF9mcmVlIGV4aXN0aW5nIG5hbWUgaWYgZHluYW1pYyAqLworCWlmKHRydG1wLT5mbGFncyAmIFg1MDlfVFJVU1RfRFlOQU1JQ19OQU1FKSBPUEVOU1NMX2ZyZWUodHJ0bXAtPm5hbWUpOworCS8qIGR1cCBzdXBwbGllZCBuYW1lICovCisJaWYoISh0cnRtcC0+bmFtZSA9IEJVRl9zdHJkdXAobmFtZSkpKSB7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfVFJVU1RfQURELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIEtlZXAgdGhlIGR5bmFtaWMgZmxhZyBvZiBleGlzdGluZyBlbnRyeSAqLworCXRydG1wLT5mbGFncyAmPSBYNTA5X1RSVVNUX0RZTkFNSUM7CisJLyogU2V0IGFsbCBvdGhlciBmbGFncyAqLworCXRydG1wLT5mbGFncyB8PSBmbGFnczsKKworCXRydG1wLT50cnVzdCA9IGlkOworCXRydG1wLT5jaGVja190cnVzdCA9IGNrOworCXRydG1wLT5hcmcxID0gYXJnMTsKKwl0cnRtcC0+YXJnMiA9IGFyZzI7CisKKwkvKiBJZiBpdHMgYSBuZXcgZW50cnkgbWFuYWdlIHRoZSBkeW5hbWljIHRhYmxlICovCisJaWYoaWR4ID09IC0xKSB7CisJCWlmKCF0cnRhYmxlICYmICEodHJ0YWJsZSA9IHNrX1g1MDlfVFJVU1RfbmV3KHRyX2NtcCkpKSB7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1RSVVNUX0FERCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXNrX1g1MDlfVFJVU1RfcHVzaCh0cnRhYmxlLCB0cnRtcCkpIHsKKwkJCVg1MDllcnIoWDUwOV9GX1g1MDlfVFJVU1RfQURELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB0cnRhYmxlX2ZyZWUoWDUwOV9UUlVTVCAqcCkKKwl7CisJaWYoIXApIHJldHVybjsKKwlpZiAocC0+ZmxhZ3MgJiBYNTA5X1RSVVNUX0RZTkFNSUMpIAorCQl7CisJCWlmIChwLT5mbGFncyAmIFg1MDlfVFJVU1RfRFlOQU1JQ19OQU1FKQorCQkJT1BFTlNTTF9mcmVlKHAtPm5hbWUpOworCQlPUEVOU1NMX2ZyZWUocCk7CisJCX0KKwl9CisKK3ZvaWQgWDUwOV9UUlVTVF9jbGVhbnVwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgWDUwOV9UUlVTVF9DT1VOVDsgaSsrKSB0cnRhYmxlX2ZyZWUodHJzdGFuZGFyZCArIGkpOworCXNrX1g1MDlfVFJVU1RfcG9wX2ZyZWUodHJ0YWJsZSwgdHJ0YWJsZV9mcmVlKTsKKwl0cnRhYmxlID0gTlVMTDsKK30KKworaW50IFg1MDlfVFJVU1RfZ2V0X2ZsYWdzKFg1MDlfVFJVU1QgKnhwKQoreworCXJldHVybiB4cC0+ZmxhZ3M7Cit9CisKK2NoYXIgKlg1MDlfVFJVU1RfZ2V0MF9uYW1lKFg1MDlfVFJVU1QgKnhwKQoreworCXJldHVybiB4cC0+bmFtZTsKK30KKworaW50IFg1MDlfVFJVU1RfZ2V0X3RydXN0KFg1MDlfVFJVU1QgKnhwKQoreworCXJldHVybiB4cC0+dHJ1c3Q7Cit9CisKK3N0YXRpYyBpbnQgdHJ1c3RfMW9pZGFueShYNTA5X1RSVVNUICp0cnVzdCwgWDUwOSAqeCwgaW50IGZsYWdzKQoreworCWlmKHgtPmF1eCAmJiAoeC0+YXV4LT50cnVzdCB8fCB4LT5hdXgtPnJlamVjdCkpCisJCXJldHVybiBvYmpfdHJ1c3QodHJ1c3QtPmFyZzEsIHgsIGZsYWdzKTsKKwkvKiB3ZSBkb24ndCBoYXZlIGFueSB0cnVzdCBzZXR0aW5nczogZm9yIGNvbXBhdGliaWxpdHkKKwkgKiB3ZSByZXR1cm4gdHJ1c3RlZCBpZiBpdCBpcyBzZWxmIHNpZ25lZAorCSAqLworCXJldHVybiB0cnVzdF9jb21wYXQodHJ1c3QsIHgsIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0cnVzdF8xb2lkKFg1MDlfVFJVU1QgKnRydXN0LCBYNTA5ICp4LCBpbnQgZmxhZ3MpCit7CisJaWYoeC0+YXV4KSByZXR1cm4gb2JqX3RydXN0KHRydXN0LT5hcmcxLCB4LCBmbGFncyk7CisJcmV0dXJuIFg1MDlfVFJVU1RfVU5UUlVTVEVEOworfQorCitzdGF0aWMgaW50IHRydXN0X2NvbXBhdChYNTA5X1RSVVNUICp0cnVzdCwgWDUwOSAqeCwgaW50IGZsYWdzKQoreworCVg1MDlfY2hlY2tfcHVycG9zZSh4LCAtMSwgMCk7CisJaWYoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU1MpIHJldHVybiBYNTA5X1RSVVNUX1RSVVNURUQ7CisJZWxzZSByZXR1cm4gWDUwOV9UUlVTVF9VTlRSVVNURUQ7Cit9CisKK3N0YXRpYyBpbnQgb2JqX3RydXN0KGludCBpZCwgWDUwOSAqeCwgaW50IGZsYWdzKQoreworCUFTTjFfT0JKRUNUICpvYmo7CisJaW50IGk7CisJWDUwOV9DRVJUX0FVWCAqYXg7CisJYXggPSB4LT5hdXg7CisJaWYoIWF4KSByZXR1cm4gWDUwOV9UUlVTVF9VTlRSVVNURUQ7CisJaWYoYXgtPnJlamVjdCkgeworCQlmb3IoaSA9IDA7IGkgPCBza19BU04xX09CSkVDVF9udW0oYXgtPnJlamVjdCk7IGkrKykgeworCQkJb2JqID0gc2tfQVNOMV9PQkpFQ1RfdmFsdWUoYXgtPnJlamVjdCwgaSk7CisJCQlpZihPQkpfb2JqMm5pZChvYmopID09IGlkKSByZXR1cm4gWDUwOV9UUlVTVF9SRUpFQ1RFRDsKKwkJfQorCX0JCisJaWYoYXgtPnRydXN0KSB7CisJCWZvcihpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShheC0+dHJ1c3QpOyBpKyspIHsKKwkJCW9iaiA9IHNrX0FTTjFfT0JKRUNUX3ZhbHVlKGF4LT50cnVzdCwgaSk7CisJCQlpZihPQkpfb2JqMm5pZChvYmopID09IGlkKSByZXR1cm4gWDUwOV9UUlVTVF9UUlVTVEVEOworCQl9CisJfQorCXJldHVybiBYNTA5X1RSVVNUX1VOVFJVU1RFRDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV90eHQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdHh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0Zjc1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdHh0LmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qIGNyeXB0by94NTA5L3g1MDlfdHh0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisKK2NvbnN0IGNoYXIgKlg1MDlfdmVyaWZ5X2NlcnRfZXJyb3Jfc3RyaW5nKGxvbmcgbikKKwl7CisJc3RhdGljIGNoYXIgYnVmWzEwMF07CisKKwlzd2l0Y2ggKChpbnQpbikKKwkJeworCWNhc2UgWDUwOV9WX09LOgorCQlyZXR1cm4oIm9rIik7CisJY2FzZSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQ6CisJCXJldHVybigidW5hYmxlIHRvIGdldCBpc3N1ZXIgY2VydGlmaWNhdGUiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkw6CisJCXJldHVybigidW5hYmxlIHRvIGdldCBjZXJ0aWZpY2F0ZSBDUkwiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ1JZUFRfQ0VSVF9TSUdOQVRVUkU6CisJCXJldHVybigidW5hYmxlIHRvIGRlY3J5cHQgY2VydGlmaWNhdGUncyBzaWduYXR1cmUiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ1JZUFRfQ1JMX1NJR05BVFVSRToKKwkJcmV0dXJuKCJ1bmFibGUgdG8gZGVjcnlwdCBDUkwncyBzaWduYXR1cmUiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWToKKwkJcmV0dXJuKCJ1bmFibGUgdG8gZGVjb2RlIGlzc3VlciBwdWJsaWMga2V5Iik7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfU0lHTkFUVVJFX0ZBSUxVUkU6CisJCXJldHVybigiY2VydGlmaWNhdGUgc2lnbmF0dXJlIGZhaWx1cmUiKTsKKwljYXNlIFg1MDlfVl9FUlJfQ1JMX1NJR05BVFVSRV9GQUlMVVJFOgorCQlyZXR1cm4oIkNSTCBzaWduYXR1cmUgZmFpbHVyZSIpOworCWNhc2UgWDUwOV9WX0VSUl9DRVJUX05PVF9ZRVRfVkFMSUQ6CisJCXJldHVybigiY2VydGlmaWNhdGUgaXMgbm90IHlldCB2YWxpZCIpOworCWNhc2UgWDUwOV9WX0VSUl9DUkxfTk9UX1lFVF9WQUxJRDoKKwkJcmV0dXJuKCJDUkwgaXMgbm90IHlldCB2YWxpZCIpOworCWNhc2UgWDUwOV9WX0VSUl9DRVJUX0hBU19FWFBJUkVEOgorCQlyZXR1cm4oImNlcnRpZmljYXRlIGhhcyBleHBpcmVkIik7CisJY2FzZSBYNTA5X1ZfRVJSX0NSTF9IQVNfRVhQSVJFRDoKKwkJcmV0dXJuKCJDUkwgaGFzIGV4cGlyZWQiKTsKKwljYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVGT1JFX0ZJRUxEOgorCQlyZXR1cm4oImZvcm1hdCBlcnJvciBpbiBjZXJ0aWZpY2F0ZSdzIG5vdEJlZm9yZSBmaWVsZCIpOworCWNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9BRlRFUl9GSUVMRDoKKwkJcmV0dXJuKCJmb3JtYXQgZXJyb3IgaW4gY2VydGlmaWNhdGUncyBub3RBZnRlciBmaWVsZCIpOworCWNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTEFTVF9VUERBVEVfRklFTEQ6CisJCXJldHVybigiZm9ybWF0IGVycm9yIGluIENSTCdzIGxhc3RVcGRhdGUgZmllbGQiKTsKKwljYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX05FWFRfVVBEQVRFX0ZJRUxEOgorCQlyZXR1cm4oImZvcm1hdCBlcnJvciBpbiBDUkwncyBuZXh0VXBkYXRlIGZpZWxkIik7CisJY2FzZSBYNTA5X1ZfRVJSX09VVF9PRl9NRU06CisJCXJldHVybigib3V0IG9mIG1lbW9yeSIpOworCWNhc2UgWDUwOV9WX0VSUl9ERVBUSF9aRVJPX1NFTEZfU0lHTkVEX0NFUlQ6CisJCXJldHVybigic2VsZiBzaWduZWQgY2VydGlmaWNhdGUiKTsKKwljYXNlIFg1MDlfVl9FUlJfU0VMRl9TSUdORURfQ0VSVF9JTl9DSEFJTjoKKwkJcmV0dXJuKCJzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZSBpbiBjZXJ0aWZpY2F0ZSBjaGFpbiIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFk6CisJCXJldHVybigidW5hYmxlIHRvIGdldCBsb2NhbCBpc3N1ZXIgY2VydGlmaWNhdGUiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRToKKwkJcmV0dXJuKCJ1bmFibGUgdG8gdmVyaWZ5IHRoZSBmaXJzdCBjZXJ0aWZpY2F0ZSIpOworCWNhc2UgWDUwOV9WX0VSUl9DRVJUX0NIQUlOX1RPT19MT05HOgorCQlyZXR1cm4oImNlcnRpZmljYXRlIGNoYWluIHRvbyBsb25nIik7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfUkVWT0tFRDoKKwkJcmV0dXJuKCJjZXJ0aWZpY2F0ZSByZXZva2VkIik7CisJY2FzZSBYNTA5X1ZfRVJSX0lOVkFMSURfQ0E6CisJCXJldHVybiAoImludmFsaWQgQ0EgY2VydGlmaWNhdGUiKTsKKwljYXNlIFg1MDlfVl9FUlJfSU5WQUxJRF9OT05fQ0E6CisJCXJldHVybiAoImludmFsaWQgbm9uLUNBIGNlcnRpZmljYXRlIChoYXMgQ0EgbWFya2luZ3MpIik7CisJY2FzZSBYNTA5X1ZfRVJSX1BBVEhfTEVOR1RIX0VYQ0VFREVEOgorCQlyZXR1cm4gKCJwYXRoIGxlbmd0aCBjb25zdHJhaW50IGV4Y2VlZGVkIik7CisJY2FzZSBYNTA5X1ZfRVJSX1BST1hZX1BBVEhfTEVOR1RIX0VYQ0VFREVEOgorCQlyZXR1cm4oInByb3h5IHBhdGggbGVuZ3RoIGNvbnN0cmFpbnQgZXhjZWVkZWQiKTsKKwljYXNlIFg1MDlfVl9FUlJfUFJPWFlfQ0VSVElGSUNBVEVTX05PVF9BTExPV0VEOgorCQlyZXR1cm4oInByb3h5IGNlcnRpZmljYXRlcyBub3QgYWxsb3dlZCwgcGxlYXNlIHNldCB0aGUgYXBwcm9wcmlhdGUgZmxhZyIpOworCWNhc2UgWDUwOV9WX0VSUl9JTlZBTElEX1BVUlBPU0U6CisJCXJldHVybiAoInVuc3VwcG9ydGVkIGNlcnRpZmljYXRlIHB1cnBvc2UiKTsKKwljYXNlIFg1MDlfVl9FUlJfQ0VSVF9VTlRSVVNURUQ6CisJCXJldHVybiAoImNlcnRpZmljYXRlIG5vdCB0cnVzdGVkIik7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfUkVKRUNURUQ6CisJCXJldHVybiAoImNlcnRpZmljYXRlIHJlamVjdGVkIik7CisJY2FzZSBYNTA5X1ZfRVJSX0FQUExJQ0FUSU9OX1ZFUklGSUNBVElPTjoKKwkJcmV0dXJuKCJhcHBsaWNhdGlvbiB2ZXJpZmljYXRpb24gZmFpbHVyZSIpOworCWNhc2UgWDUwOV9WX0VSUl9TVUJKRUNUX0lTU1VFUl9NSVNNQVRDSDoKKwkJcmV0dXJuKCJzdWJqZWN0IGlzc3VlciBtaXNtYXRjaCIpOworCWNhc2UgWDUwOV9WX0VSUl9BS0lEX1NLSURfTUlTTUFUQ0g6CisJCXJldHVybigiYXV0aG9yaXR5IGFuZCBzdWJqZWN0IGtleSBpZGVudGlmaWVyIG1pc21hdGNoIik7CisJY2FzZSBYNTA5X1ZfRVJSX0FLSURfSVNTVUVSX1NFUklBTF9NSVNNQVRDSDoKKwkJcmV0dXJuKCJhdXRob3JpdHkgYW5kIGlzc3VlciBzZXJpYWwgbnVtYmVyIG1pc21hdGNoIik7CisJY2FzZSBYNTA5X1ZfRVJSX0tFWVVTQUdFX05PX0NFUlRTSUdOOgorCQlyZXR1cm4oImtleSB1c2FnZSBkb2VzIG5vdCBpbmNsdWRlIGNlcnRpZmljYXRlIHNpZ25pbmciKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkxfSVNTVUVSOgorCQlyZXR1cm4oInVuYWJsZSB0byBnZXQgQ1JMIGlzc3VlciBjZXJ0aWZpY2F0ZSIpOworCWNhc2UgWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfRVhURU5TSU9OOgorCQlyZXR1cm4oInVuaGFuZGxlZCBjcml0aWNhbCBleHRlbnNpb24iKTsKKwljYXNlIFg1MDlfVl9FUlJfS0VZVVNBR0VfTk9fQ1JMX1NJR046CisJCXJldHVybigia2V5IHVzYWdlIGRvZXMgbm90IGluY2x1ZGUgQ1JMIHNpZ25pbmciKTsKKwljYXNlIFg1MDlfVl9FUlJfS0VZVVNBR0VfTk9fRElHSVRBTF9TSUdOQVRVUkU6CisJCXJldHVybigia2V5IHVzYWdlIGRvZXMgbm90IGluY2x1ZGUgZGlnaXRhbCBzaWduYXR1cmUiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0NSTF9FWFRFTlNJT046CisJCXJldHVybigidW5oYW5kbGVkIGNyaXRpY2FsIENSTCBleHRlbnNpb24iKTsKKwljYXNlIFg1MDlfVl9FUlJfSU5WQUxJRF9FWFRFTlNJT046CisJCXJldHVybigiaW52YWxpZCBvciBpbmNvbnNpc3RlbnQgY2VydGlmaWNhdGUgZXh0ZW5zaW9uIik7CisJY2FzZSBYNTA5X1ZfRVJSX0lOVkFMSURfUE9MSUNZX0VYVEVOU0lPTjoKKwkJcmV0dXJuKCJpbnZhbGlkIG9yIGluY29uc2lzdGVudCBjZXJ0aWZpY2F0ZSBwb2xpY3kgZXh0ZW5zaW9uIik7CisJY2FzZSBYNTA5X1ZfRVJSX05PX0VYUExJQ0lUX1BPTElDWToKKwkJcmV0dXJuKCJubyBleHBsaWNpdCBwb2xpY3kiKTsKKwljYXNlIFg1MDlfVl9FUlJfRElGRkVSRU5UX0NSTF9TQ09QRToKKwlyZXR1cm4oIkRpZmZlcmVudCBDUkwgc2NvcGUiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5TVVBQT1JURURfRVhURU5TSU9OX0ZFQVRVUkU6CisJcmV0dXJuKCJVbnN1cHBvcnRlZCBleHRlbnNpb24gZmVhdHVyZSIpOworIAljYXNlIFg1MDlfVl9FUlJfVU5ORVNURURfUkVTT1VSQ0U6CisgCQlyZXR1cm4oIlJGQyAzNzc5IHJlc291cmNlIG5vdCBzdWJzZXQgb2YgcGFyZW50J3MgcmVzb3VyY2VzIik7CisKKwljYXNlIFg1MDlfVl9FUlJfUEVSTUlUVEVEX1ZJT0xBVElPTjoKKwkJcmV0dXJuKCJwZXJtaXR0ZWQgc3VidHJlZSB2aW9sYXRpb24iKTsKKwljYXNlIFg1MDlfVl9FUlJfRVhDTFVERURfVklPTEFUSU9OOgorCQlyZXR1cm4oImV4Y2x1ZGVkIHN1YnRyZWUgdmlvbGF0aW9uIik7CisJY2FzZSBYNTA5X1ZfRVJSX1NVQlRSRUVfTUlOTUFYOgorCQlyZXR1cm4oIm5hbWUgY29uc3RyYWludHMgbWluaW11bSBhbmQgbWF4aW11bSBub3Qgc3VwcG9ydGVkIik7CisJY2FzZSBYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX0NPTlNUUkFJTlRfVFlQRToKKwkJcmV0dXJuKCJ1bnN1cHBvcnRlZCBuYW1lIGNvbnN0cmFpbnQgdHlwZSIpOworCWNhc2UgWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9DT05TVFJBSU5UX1NZTlRBWDoKKwkJcmV0dXJuKCJ1bnN1cHBvcnRlZCBvciBpbnZhbGlkIG5hbWUgY29uc3RyYWludCBzeW50YXgiKTsKKwljYXNlIFg1MDlfVl9FUlJfVU5TVVBQT1JURURfTkFNRV9TWU5UQVg6CisJCXJldHVybigidW5zdXBwb3J0ZWQgb3IgaW52YWxpZCBuYW1lIHN5bnRheCIpOworCWNhc2UgWDUwOV9WX0VSUl9DUkxfUEFUSF9WQUxJREFUSU9OX0VSUk9SOgorCQlyZXR1cm4oIkNSTCBwYXRoIHZhbGlkYXRpb24gZXJyb3IiKTsKKworCWRlZmF1bHQ6CisJCUJJT19zbnByaW50ZihidWYsc2l6ZW9mIGJ1ZiwiZXJyb3IgbnVtYmVyICVsZCIsbik7CisJCXJldHVybihidWYpOworCQl9CisJfQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdjMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU2ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV92My5jCkBAIC0wLDAgKzEsMjc0IEBACisvKiBjcnlwdG8veDUwOS94NTA5X3YzLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCitpbnQgWDUwOXYzX2dldF9leHRfY291bnQoY29uc3QgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4KQorCXsKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisJcmV0dXJuKHNrX1g1MDlfRVhURU5TSU9OX251bSh4KSk7CisJfQorCitpbnQgWDUwOXYzX2dldF9leHRfYnlfTklEKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwgaW50IG5pZCwKKwkJCSAgaW50IGxhc3Rwb3MpCisJeworCUFTTjFfT0JKRUNUICpvYmo7CisKKwlvYmo9T0JKX25pZDJvYmoobmlkKTsKKwlpZiAob2JqID09IE5VTEwpIHJldHVybigtMik7CisJcmV0dXJuKFg1MDl2M19nZXRfZXh0X2J5X09CSih4LG9iaixsYXN0cG9zKSk7CisJfQorCitpbnQgWDUwOXYzX2dldF9leHRfYnlfT0JKKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqc2ssIEFTTjFfT0JKRUNUICpvYmosCisJCQkgIGludCBsYXN0cG9zKQorCXsKKwlpbnQgbjsKKwlYNTA5X0VYVEVOU0lPTiAqZXg7CisKKwlpZiAoc2sgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwlsYXN0cG9zKys7CisJaWYgKGxhc3Rwb3MgPCAwKQorCQlsYXN0cG9zPTA7CisJbj1za19YNTA5X0VYVEVOU0lPTl9udW0oc2spOworCWZvciAoIDsgbGFzdHBvcyA8IG47IGxhc3Rwb3MrKykKKwkJeworCQlleD1za19YNTA5X0VYVEVOU0lPTl92YWx1ZShzayxsYXN0cG9zKTsKKwkJaWYgKE9CSl9jbXAoZXgtPm9iamVjdCxvYmopID09IDApCisJCQlyZXR1cm4obGFzdHBvcyk7CisJCX0KKwlyZXR1cm4oLTEpOworCX0KKworaW50IFg1MDl2M19nZXRfZXh0X2J5X2NyaXRpY2FsKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqc2ssIGludCBjcml0LAorCQkJICAgICAgIGludCBsYXN0cG9zKQorCXsKKwlpbnQgbjsKKwlYNTA5X0VYVEVOU0lPTiAqZXg7CisKKwlpZiAoc2sgPT0gTlVMTCkgcmV0dXJuKC0xKTsKKwlsYXN0cG9zKys7CisJaWYgKGxhc3Rwb3MgPCAwKQorCQlsYXN0cG9zPTA7CisJbj1za19YNTA5X0VYVEVOU0lPTl9udW0oc2spOworCWZvciAoIDsgbGFzdHBvcyA8IG47IGxhc3Rwb3MrKykKKwkJeworCQlleD1za19YNTA5X0VYVEVOU0lPTl92YWx1ZShzayxsYXN0cG9zKTsKKwkJaWYgKAkoKGV4LT5jcml0aWNhbCA+IDApICYmIGNyaXQpIHx8CisJCQkoKGV4LT5jcml0aWNhbCA8PSAwKSAmJiAhY3JpdCkpCisJCQlyZXR1cm4obGFzdHBvcyk7CisJCX0KKwlyZXR1cm4oLTEpOworCX0KKworWDUwOV9FWFRFTlNJT04gKlg1MDl2M19nZXRfZXh0KGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwgaW50IGxvYykKKwl7CisJaWYgKHggPT0gTlVMTCB8fCBza19YNTA5X0VYVEVOU0lPTl9udW0oeCkgPD0gbG9jIHx8IGxvYyA8IDApCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJcmV0dXJuIHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKHgsbG9jKTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5djNfZGVsZXRlX2V4dChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngsIGludCBsb2MpCisJeworCVg1MDlfRVhURU5TSU9OICpyZXQ7CisKKwlpZiAoeCA9PSBOVUxMIHx8IHNrX1g1MDlfRVhURU5TSU9OX251bSh4KSA8PSBsb2MgfHwgbG9jIDwgMCkKKwkJcmV0dXJuKE5VTEwpOworCXJldD1za19YNTA5X0VYVEVOU0lPTl9kZWxldGUoeCxsb2MpOworCXJldHVybihyZXQpOworCX0KKworU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpYNTA5djNfYWRkX2V4dChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKip4LAorCQkJCQkgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKQorCXsKKwlYNTA5X0VYVEVOU0lPTiAqbmV3X2V4PU5VTEw7CisJaW50IG47CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpzaz1OVUxMOworCisJaWYgKHggPT0gTlVMTCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5VjNfQUREX0VYVCxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlnb3RvIGVycjI7CisJCX0KKworCWlmICgqeCA9PSBOVUxMKQorCQl7CisJCWlmICgoc2s9c2tfWDUwOV9FWFRFTlNJT05fbmV3X251bGwoKSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQl9CisJZWxzZQorCQlzaz0gKng7CisKKwluPXNrX1g1MDlfRVhURU5TSU9OX251bShzayk7CisJaWYgKGxvYyA+IG4pIGxvYz1uOworCWVsc2UgaWYgKGxvYyA8IDApIGxvYz1uOworCisJaWYgKChuZXdfZXg9WDUwOV9FWFRFTlNJT05fZHVwKGV4KSkgPT0gTlVMTCkKKwkJZ290byBlcnIyOworCWlmICghc2tfWDUwOV9FWFRFTlNJT05faW5zZXJ0KHNrLG5ld19leCxsb2MpKQorCQlnb3RvIGVycjsKKwlpZiAoKnggPT0gTlVMTCkKKwkJKng9c2s7CisJcmV0dXJuKHNrKTsKK2VycjoKKwlYNTA5ZXJyKFg1MDlfRl9YNTA5VjNfQUREX0VYVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CitlcnIyOgorCWlmIChuZXdfZXggIT0gTlVMTCkgWDUwOV9FWFRFTlNJT05fZnJlZShuZXdfZXgpOworCWlmIChzayAhPSBOVUxMKSBza19YNTA5X0VYVEVOU0lPTl9mcmVlKHNrKTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitYNTA5X0VYVEVOU0lPTiAqWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X05JRChYNTA5X0VYVEVOU0lPTiAqKmV4LCBpbnQgbmlkLAorCSAgICAgaW50IGNyaXQsIEFTTjFfT0NURVRfU1RSSU5HICpkYXRhKQorCXsKKwlBU04xX09CSkVDVCAqb2JqOworCVg1MDlfRVhURU5TSU9OICpyZXQ7CisKKwlvYmo9T0JKX25pZDJvYmoobmlkKTsKKwlpZiAob2JqID09IE5VTEwpCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9FWFRFTlNJT05fQ1JFQVRFX0JZX05JRCxYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlyZXQ9WDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X09CSihleCxvYmosY3JpdCxkYXRhKTsKKwlpZiAocmV0ID09IE5VTEwpIEFTTjFfT0JKRUNUX2ZyZWUob2JqKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfT0JKKFg1MDlfRVhURU5TSU9OICoqZXgsCisJICAgICBBU04xX09CSkVDVCAqb2JqLCBpbnQgY3JpdCwgQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGEpCisJeworCVg1MDlfRVhURU5TSU9OICpyZXQ7CisKKwlpZiAoKGV4ID09IE5VTEwpIHx8ICgqZXggPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9WDUwOV9FWFRFTlNJT05fbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X0VYVEVOU0lPTl9DUkVBVEVfQllfT0JKLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybihOVUxMKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJcmV0PSAqZXg7CisKKwlpZiAoIVg1MDlfRVhURU5TSU9OX3NldF9vYmplY3QocmV0LG9iaikpCisJCWdvdG8gZXJyOworCWlmICghWDUwOV9FWFRFTlNJT05fc2V0X2NyaXRpY2FsKHJldCxjcml0KSkKKwkJZ290byBlcnI7CisJaWYgKCFYNTA5X0VYVEVOU0lPTl9zZXRfZGF0YShyZXQsZGF0YSkpCisJCWdvdG8gZXJyOworCQorCWlmICgoZXggIT0gTlVMTCkgJiYgKCpleCA9PSBOVUxMKSkgKmV4PXJldDsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAoKGV4ID09IE5VTEwpIHx8IChyZXQgIT0gKmV4KSkKKwkJWDUwOV9FWFRFTlNJT05fZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKKwl9CisKK2ludCBYNTA5X0VYVEVOU0lPTl9zZXRfb2JqZWN0KFg1MDlfRVhURU5TSU9OICpleCwgQVNOMV9PQkpFQ1QgKm9iaikKKwl7CisJaWYgKChleCA9PSBOVUxMKSB8fCAob2JqID09IE5VTEwpKQorCQlyZXR1cm4oMCk7CisJQVNOMV9PQkpFQ1RfZnJlZShleC0+b2JqZWN0KTsKKwlleC0+b2JqZWN0PU9CSl9kdXAob2JqKTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgWDUwOV9FWFRFTlNJT05fc2V0X2NyaXRpY2FsKFg1MDlfRVhURU5TSU9OICpleCwgaW50IGNyaXQpCisJeworCWlmIChleCA9PSBOVUxMKSByZXR1cm4oMCk7CisJZXgtPmNyaXRpY2FsPShjcml0KT8weEZGOi0xOworCXJldHVybigxKTsKKwl9CisKK2ludCBYNTA5X0VYVEVOU0lPTl9zZXRfZGF0YShYNTA5X0VYVEVOU0lPTiAqZXgsIEFTTjFfT0NURVRfU1RSSU5HICpkYXRhKQorCXsKKwlpbnQgaTsKKworCWlmIChleCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaT1NX0FTTjFfT0NURVRfU1RSSU5HX3NldChleC0+dmFsdWUsZGF0YS0+ZGF0YSxkYXRhLT5sZW5ndGgpOworCWlmICghaSkgcmV0dXJuKDApOworCXJldHVybigxKTsKKwl9CisKK0FTTjFfT0JKRUNUICpYNTA5X0VYVEVOU0lPTl9nZXRfb2JqZWN0KFg1MDlfRVhURU5TSU9OICpleCkKKwl7CisJaWYgKGV4ID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlyZXR1cm4oZXgtPm9iamVjdCk7CisJfQorCitBU04xX09DVEVUX1NUUklORyAqWDUwOV9FWFRFTlNJT05fZ2V0X2RhdGEoWDUwOV9FWFRFTlNJT04gKmV4KQorCXsKKwlpZiAoZXggPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCXJldHVybihleC0+dmFsdWUpOworCX0KKworaW50IFg1MDlfRVhURU5TSU9OX2dldF9jcml0aWNhbChYNTA5X0VYVEVOU0lPTiAqZXgpCisJeworCWlmIChleCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYoZXgtPmNyaXRpY2FsID4gMCkgcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV92ZnkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdmZ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlYmY2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdmZ5LmMKQEAgLTAsMCArMSwyMjE1IEBACisvKiBjcnlwdG8veDUwOS94NTA5X3ZmeS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKworLyogQ1JMIHNjb3JlIHZhbHVlcyAqLworCisvKiBObyB1bmhhbmRsZWQgY3JpdGljYWwgZXh0ZW5zaW9ucyAqLworCisjZGVmaW5lIENSTF9TQ09SRV9OT0NSSVRJQ0FMCTB4MTAwCisKKy8qIGNlcnRpZmljYXRlIGlzIHdpdGhpbiBDUkwgc2NvcGUgKi8KKworI2RlZmluZSBDUkxfU0NPUkVfU0NPUEUJCTB4MDgwCisKKy8qIENSTCB0aW1lcyB2YWxpZCAqLworCisjZGVmaW5lIENSTF9TQ09SRV9USU1FCQkweDA0MAorCisvKiBJc3N1ZXIgbmFtZSBtYXRjaGVzIGNlcnRpZmljYXRlICovCisKKyNkZWZpbmUgQ1JMX1NDT1JFX0lTU1VFUl9OQU1FCTB4MDIwCisKKy8qIElmIHRoaXMgc2NvcmUgb3IgYWJvdmUgQ1JMIGlzIHByb2JhYmx5IHZhbGlkICovCisKKyNkZWZpbmUgQ1JMX1NDT1JFX1ZBTElEIChDUkxfU0NPUkVfTk9DUklUSUNBTHxDUkxfU0NPUkVfVElNRXxDUkxfU0NPUkVfU0NPUEUpCisKKy8qIENSTCBpc3N1ZXIgaXMgY2VydGlmaWNhdGUgaXNzdWVyICovCisKKyNkZWZpbmUgQ1JMX1NDT1JFX0lTU1VFUl9DRVJUCTB4MDE4CisKKy8qIENSTCBpc3N1ZXIgaXMgb24gY2VydGlmaWNhdGUgcGF0aCAqLworCisjZGVmaW5lIENSTF9TQ09SRV9TQU1FX1BBVEgJMHgwMDgKKworLyogQ1JMIGlzc3VlciBtYXRjaGVzIENSTCBBS0lEICovCisKKyNkZWZpbmUgQ1JMX1NDT1JFX0FLSUQJCTB4MDA0CisKKy8qIEhhdmUgYSBkZWx0YSBDUkwgd2l0aCB2YWxpZCB0aW1lcyAqLworCisjZGVmaW5lIENSTF9TQ09SRV9USU1FX0RFTFRBCTB4MDAyCisKK3N0YXRpYyBpbnQgbnVsbF9jYWxsYmFjayhpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmUpOworc3RhdGljIGludCBjaGVja19pc3N1ZWQoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCwgWDUwOSAqaXNzdWVyKTsKK3N0YXRpYyBYNTA5ICpmaW5kX2lzc3VlcihYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqc2ssIFg1MDkgKngpOworc3RhdGljIGludCBjaGVja19jaGFpbl9leHRlbnNpb25zKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworc3RhdGljIGludCBjaGVja19uYW1lX2NvbnN0cmFpbnRzKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworc3RhdGljIGludCBjaGVja190cnVzdChYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK3N0YXRpYyBpbnQgY2hlY2tfcmV2b2NhdGlvbihYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK3N0YXRpYyBpbnQgY2hlY2tfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK3N0YXRpYyBpbnQgY2hlY2tfcG9saWN5KFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCitzdGF0aWMgaW50IGdldF9jcmxfc2NvcmUoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqKnBpc3N1ZXIsCisJCQl1bnNpZ25lZCBpbnQgKnByZWFzb25zLAorCQkJWDUwOV9DUkwgKmNybCwgWDUwOSAqeCk7CitzdGF0aWMgaW50IGdldF9jcmxfZGVsdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCQlYNTA5X0NSTCAqKnBjcmwsIFg1MDlfQ1JMICoqcGRjcmwsIFg1MDkgKngpOworc3RhdGljIHZvaWQgZ2V0X2RlbHRhX3NrKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICoqZGNybCwgaW50ICpwY3JsX3Njb3JlLAorCQkJWDUwOV9DUkwgKmJhc2UsIFNUQUNLX09GKFg1MDlfQ1JMKSAqY3Jscyk7CitzdGF0aWMgdm9pZCBjcmxfYWtpZF9jaGVjayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsLAorCQkJCVg1MDkgKipwaXNzdWVyLCBpbnQgKnBjcmxfc2NvcmUpOworc3RhdGljIGludCBjcmxfY3JsZHBfY2hlY2soWDUwOSAqeCwgWDUwOV9DUkwgKmNybCwgaW50IGNybF9zY29yZSwKKwkJCQl1bnNpZ25lZCBpbnQgKnByZWFzb25zKTsKK3N0YXRpYyBpbnQgY2hlY2tfY3JsX3BhdGgoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCk7CitzdGF0aWMgaW50IGNoZWNrX2NybF9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4LAorCQkJU1RBQ0tfT0YoWDUwOSkgKmNlcnRfcGF0aCwKKwkJCVNUQUNLX09GKFg1MDkpICpjcmxfcGF0aCk7CisKK3N0YXRpYyBpbnQgaW50ZXJuYWxfdmVyaWZ5KFg1MDlfU1RPUkVfQ1RYICpjdHgpOworY29uc3QgY2hhciBYNTA5X3ZlcnNpb25bXT0iWC41MDkiIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworCitzdGF0aWMgaW50IG51bGxfY2FsbGJhY2soaW50IG9rLCBYNTA5X1NUT1JFX0NUWCAqZSkKKwl7CisJcmV0dXJuIG9rOworCX0KKworI2lmIDAKK3N0YXRpYyBpbnQgeDUwOV9zdWJqZWN0X2NtcChYNTA5ICoqYSwgWDUwOSAqKmIpCisJeworCXJldHVybiBYNTA5X3N1YmplY3RfbmFtZV9jbXAoKmEsKmIpOworCX0KKyNlbmRpZgorCitpbnQgWDUwOV92ZXJpZnlfY2VydChYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlYNTA5ICp4LCp4dG1wLCpjaGFpbl9zcz1OVUxMOworCVg1MDlfTkFNRSAqeG47CisJaW50IGJhZF9jaGFpbiA9IDA7CisJWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtID0gY3R4LT5wYXJhbTsKKwlpbnQgZGVwdGgsaSxvaz0wOworCWludCBudW07CisJaW50ICgqY2IpKGludCB4b2ssWDUwOV9TVE9SRV9DVFggKnhjdHgpOworCVNUQUNLX09GKFg1MDkpICpza3RtcD1OVUxMOworCWlmIChjdHgtPmNlcnQgPT0gTlVMTCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1ZFUklGWV9DRVJULFg1MDlfUl9OT19DRVJUX1NFVF9GT1JfVVNfVE9fVkVSSUZZKTsKKwkJcmV0dXJuIC0xOworCQl9CisKKwljYj1jdHgtPnZlcmlmeV9jYjsKKworCS8qIGZpcnN0IHdlIG1ha2Ugc3VyZSB0aGUgY2hhaW4gd2UgYXJlIGdvaW5nIHRvIGJ1aWxkIGlzCisJICogcHJlc2VudCBhbmQgdGhhdCB0aGUgZmlyc3QgZW50cnkgaXMgaW4gcGxhY2UgKi8KKwlpZiAoY3R4LT5jaGFpbiA9PSBOVUxMKQorCQl7CisJCWlmICgJKChjdHgtPmNoYWluPXNrX1g1MDlfbmV3X251bGwoKSkgPT0gTlVMTCkgfHwKKwkJCSghc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4sY3R4LT5jZXJ0KSkpCisJCQl7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1ZFUklGWV9DRVJULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlDUllQVE9fYWRkKCZjdHgtPmNlcnQtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5KTsKKwkJY3R4LT5sYXN0X3VudHJ1c3RlZD0xOworCQl9CisKKwkvKiBXZSB1c2UgYSB0ZW1wb3JhcnkgU1RBQ0sgc28gd2UgY2FuIGNob3AgYW5kIGhhY2sgYXQgaXQgKi8KKwlpZiAoY3R4LT51bnRydXN0ZWQgIT0gTlVMTAorCSAgICAmJiAoc2t0bXA9c2tfWDUwOV9kdXAoY3R4LT51bnRydXN0ZWQpKSA9PSBOVUxMKQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfVkVSSUZZX0NFUlQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVuZDsKKwkJfQorCisJbnVtPXNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pOworCXg9c2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLG51bS0xKTsKKwlkZXB0aD1wYXJhbS0+ZGVwdGg7CisKKworCWZvciAoOzspCisJCXsKKwkJLyogSWYgd2UgaGF2ZSBlbm91Z2gsIHdlIGJyZWFrICovCisJCWlmIChkZXB0aCA8IG51bSkgYnJlYWs7IC8qIEZJWE1FOiBJZiB0aGlzIGhhcHBlbnMsIHdlIHNob3VsZCB0YWtlCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vdGUgb2YgaXQgYW5kLCBpZiBhcHByb3ByaWF0ZSwgdXNlIHRoZQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgKiBYNTA5X1ZfRVJSX0NFUlRfQ0hBSU5fVE9PX0xPTkcgZXJyb3IKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICogY29kZSBsYXRlci4KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkJLyogSWYgd2UgYXJlIHNlbGYgc2lnbmVkLCB3ZSBicmVhayAqLworCQl4bj1YNTA5X2dldF9pc3N1ZXJfbmFtZSh4KTsKKwkJaWYgKGN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeCx4KSkgYnJlYWs7CisKKwkJLyogSWYgd2Ugd2VyZSBwYXNzZWQgYSBjZXJ0IGNoYWluLCB1c2UgaXQgZmlyc3QgKi8KKwkJaWYgKGN0eC0+dW50cnVzdGVkICE9IE5VTEwpCisJCQl7CisJCQl4dG1wPWZpbmRfaXNzdWVyKGN0eCwgc2t0bXAseCk7CisJCQlpZiAoeHRtcCAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIXNrX1g1MDlfcHVzaChjdHgtPmNoYWluLHh0bXApKQorCQkJCQl7CisJCQkJCVg1MDllcnIoWDUwOV9GX1g1MDlfVkVSSUZZX0NFUlQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCUNSWVBUT19hZGQoJnh0bXAtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5KTsKKwkJCQkodm9pZClza19YNTA5X2RlbGV0ZV9wdHIoc2t0bXAseHRtcCk7CisJCQkJY3R4LT5sYXN0X3VudHJ1c3RlZCsrOworCQkJCXg9eHRtcDsKKwkJCQludW0rKzsKKwkJCQkvKiByZXBhcnNlIHRoZSBmdWxsIGNoYWluIGZvcgorCQkJCSAqIHRoZSBuZXh0IG9uZSAqLworCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJYnJlYWs7CisJCX0KKworCS8qIGF0IHRoaXMgcG9pbnQsIGNoYWluIHNob3VsZCBjb250YWluIGEgbGlzdCBvZiB1bnRydXN0ZWQKKwkgKiBjZXJ0aWZpY2F0ZXMuICBXZSBub3cgbmVlZCB0byBhZGQgYXQgbGVhc3Qgb25lIHRydXN0ZWQgb25lLAorCSAqIGlmIHBvc3NpYmxlLCBvdGhlcndpc2Ugd2UgY29tcGxhaW4uICovCisKKwkvKiBFeGFtaW5lIGxhc3QgY2VydGlmaWNhdGUgaW4gY2hhaW4gYW5kIHNlZSBpZiBpdAorIAkgKiBpcyBzZWxmIHNpZ25lZC4KKyAJICovCisKKwlpPXNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pOworCXg9c2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLGktMSk7CisJeG4gPSBYNTA5X2dldF9zdWJqZWN0X25hbWUoeCk7CisJaWYgKGN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeCwgeCkpCisJCXsKKwkJLyogd2UgaGF2ZSBhIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlICovCisJCWlmIChza19YNTA5X251bShjdHgtPmNoYWluKSA9PSAxKQorCQkJeworCQkJLyogV2UgaGF2ZSBhIHNpbmdsZSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZTogc2VlIGlmCisJCQkgKiB3ZSBjYW4gZmluZCBpdCBpbiB0aGUgc3RvcmUuIFdlIG11c3QgaGF2ZSBhbiBleGFjdAorCQkJICogbWF0Y2ggdG8gYXZvaWQgcG9zc2libGUgaW1wZXJzb25hdGlvbi4KKwkJCSAqLworCQkJb2sgPSBjdHgtPmdldF9pc3N1ZXIoJnh0bXAsIGN0eCwgeCk7CisJCQlpZiAoKG9rIDw9IDApIHx8IFg1MDlfY21wKHgsIHh0bXApKSAKKwkJCQl7CisJCQkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVDsKKwkJCQljdHgtPmN1cnJlbnRfY2VydD14OworCQkJCWN0eC0+ZXJyb3JfZGVwdGg9aS0xOworCQkJCWlmIChvayA9PSAxKSBYNTA5X2ZyZWUoeHRtcCk7CisJCQkJYmFkX2NoYWluID0gMTsKKwkJCQlvaz1jYigwLGN0eCk7CisJCQkJaWYgKCFvaykgZ290byBlbmQ7CisJCQkJfQorCQkJZWxzZSAKKwkJCQl7CisJCQkJLyogV2UgaGF2ZSBhIG1hdGNoOiByZXBsYWNlIGNlcnRpZmljYXRlIHdpdGggc3RvcmUgdmVyc2lvbgorCQkJCSAqIHNvIHdlIGdldCBhbnkgdHJ1c3Qgc2V0dGluZ3MuCisJCQkJICovCisJCQkJWDUwOV9mcmVlKHgpOworCQkJCXggPSB4dG1wOworCQkJCSh2b2lkKXNrX1g1MDlfc2V0KGN0eC0+Y2hhaW4sIGkgLSAxLCB4KTsKKwkJCQljdHgtPmxhc3RfdW50cnVzdGVkPTA7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQl7CisJCQkvKiBleHRyYWN0IGFuZCBzYXZlIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlIGZvciBsYXRlciB1c2UgKi8KKwkJCWNoYWluX3NzPXNrX1g1MDlfcG9wKGN0eC0+Y2hhaW4pOworCQkJY3R4LT5sYXN0X3VudHJ1c3RlZC0tOworCQkJbnVtLS07CisJCQl4PXNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbixudW0tMSk7CisJCQl9CisJCX0KKworCS8qIFdlIG5vdyBsb29rdXAgY2VydHMgZnJvbSB0aGUgY2VydGlmaWNhdGUgc3RvcmUgKi8KKwlmb3IgKDs7KQorCQl7CisJCS8qIElmIHdlIGhhdmUgZW5vdWdoLCB3ZSBicmVhayAqLworCQlpZiAoZGVwdGggPCBudW0pIGJyZWFrOworCisJCS8qIElmIHdlIGFyZSBzZWxmIHNpZ25lZCwgd2UgYnJlYWsgKi8KKwkJeG49WDUwOV9nZXRfaXNzdWVyX25hbWUoeCk7CisJCWlmIChjdHgtPmNoZWNrX2lzc3VlZChjdHgseCx4KSkgYnJlYWs7CisKKwkJb2sgPSBjdHgtPmdldF9pc3N1ZXIoJnh0bXAsIGN0eCwgeCk7CisKKwkJaWYgKG9rIDwgMCkgcmV0dXJuIG9rOworCQlpZiAob2sgPT0gMCkgYnJlYWs7CisKKwkJeCA9IHh0bXA7CisJCWlmICghc2tfWDUwOV9wdXNoKGN0eC0+Y2hhaW4seCkpCisJCQl7CisJCQlYNTA5X2ZyZWUoeHRtcCk7CisJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1ZFUklGWV9DRVJULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQkJfQorCQludW0rKzsKKwkJfQorCisJLyogd2Ugbm93IGhhdmUgb3VyIGNoYWluLCBsZXRzIGNoZWNrIGl0Li4uICovCisJeG49WDUwOV9nZXRfaXNzdWVyX25hbWUoeCk7CisKKwkvKiBJcyBsYXN0IGNlcnRpZmljYXRlIGxvb2tlZCB1cCBzZWxmIHNpZ25lZD8gKi8KKwlpZiAoIWN0eC0+Y2hlY2tfaXNzdWVkKGN0eCx4LHgpKQorCQl7CisJCWlmICgoY2hhaW5fc3MgPT0gTlVMTCkgfHwgIWN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeCwgY2hhaW5fc3MpKQorCQkJeworCQkJaWYgKGN0eC0+bGFzdF91bnRydXN0ZWQgPj0gbnVtKQorCQkJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFk7CisJCQllbHNlCisJCQkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQ7CisJCQljdHgtPmN1cnJlbnRfY2VydD14OworCQkJfQorCQllbHNlCisJCQl7CisKKwkJCXNrX1g1MDlfcHVzaChjdHgtPmNoYWluLGNoYWluX3NzKTsKKwkJCW51bSsrOworCQkJY3R4LT5sYXN0X3VudHJ1c3RlZD1udW07CisJCQljdHgtPmN1cnJlbnRfY2VydD1jaGFpbl9zczsKKwkJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9TRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOOworCQkJY2hhaW5fc3M9TlVMTDsKKwkJCX0KKworCQljdHgtPmVycm9yX2RlcHRoPW51bS0xOworCQliYWRfY2hhaW4gPSAxOworCQlvaz1jYigwLGN0eCk7CisJCWlmICghb2spIGdvdG8gZW5kOworCQl9CisKKwkvKiBXZSBoYXZlIHRoZSBjaGFpbiBjb21wbGV0ZTogbm93IHdlIG5lZWQgdG8gY2hlY2sgaXRzIHB1cnBvc2UgKi8KKwlvayA9IGNoZWNrX2NoYWluX2V4dGVuc2lvbnMoY3R4KTsKKworCWlmICghb2spIGdvdG8gZW5kOworCisJLyogQ2hlY2sgbmFtZSBjb25zdHJhaW50cyAqLworCisJb2sgPSBjaGVja19uYW1lX2NvbnN0cmFpbnRzKGN0eCk7CisJCisJaWYgKCFvaykgZ290byBlbmQ7CisKKwkvKiBUaGUgY2hhaW4gZXh0ZW5zaW9ucyBhcmUgT0s6IGNoZWNrIHRydXN0ICovCisKKwlpZiAocGFyYW0tPnRydXN0ID4gMCkgb2sgPSBjaGVja190cnVzdChjdHgpOworCisJaWYgKCFvaykgZ290byBlbmQ7CisKKwkvKiBXZSBtYXkgYXMgd2VsbCBjb3B5IGRvd24gYW55IERTQSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHJlcXVpcmVkICovCisJWDUwOV9nZXRfcHVia2V5X3BhcmFtZXRlcnMoTlVMTCxjdHgtPmNoYWluKTsKKworCS8qIENoZWNrIHJldm9jYXRpb24gc3RhdHVzOiB3ZSBkbyB0aGlzIGFmdGVyIGNvcHlpbmcgcGFyYW1ldGVycworCSAqIGJlY2F1c2UgdGhleSBtYXkgYmUgbmVlZGVkIGZvciBDUkwgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbi4KKwkgKi8KKworCW9rID0gY3R4LT5jaGVja19yZXZvY2F0aW9uKGN0eCk7CisJaWYoIW9rKSBnb3RvIGVuZDsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgYSBjaGFpbiBhbmQgbmVlZCB0byB2ZXJpZnkgaXQgKi8KKwlpZiAoY3R4LT52ZXJpZnkgIT0gTlVMTCkKKwkJb2s9Y3R4LT52ZXJpZnkoY3R4KTsKKwllbHNlCisJCW9rPWludGVybmFsX3ZlcmlmeShjdHgpOworCWlmKCFvaykgZ290byBlbmQ7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CisJLyogUkZDIDM3NzkgcGF0aCB2YWxpZGF0aW9uLCBub3cgdGhhdCBDUkwgY2hlY2sgaGFzIGJlZW4gZG9uZSAqLworCW9rID0gdjNfYXNpZF92YWxpZGF0ZV9wYXRoKGN0eCk7CisJaWYgKCFvaykgZ290byBlbmQ7CisJb2sgPSB2M19hZGRyX3ZhbGlkYXRlX3BhdGgoY3R4KTsKKwlpZiAoIW9rKSBnb3RvIGVuZDsKKyNlbmRpZgorCisJLyogSWYgd2UgZ2V0IHRoaXMgZmFyIGV2YWx1YXRlIHBvbGljaWVzICovCisJaWYgKCFiYWRfY2hhaW4gJiYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfUE9MSUNZX0NIRUNLKSkKKwkJb2sgPSBjdHgtPmNoZWNrX3BvbGljeShjdHgpOworCWlmKCFvaykgZ290byBlbmQ7CisJaWYgKDApCisJCXsKK2VuZDoKKwkJWDUwOV9nZXRfcHVia2V5X3BhcmFtZXRlcnMoTlVMTCxjdHgtPmNoYWluKTsKKwkJfQorCWlmIChza3RtcCAhPSBOVUxMKSBza19YNTA5X2ZyZWUoc2t0bXApOworCWlmIChjaGFpbl9zcyAhPSBOVUxMKSBYNTA5X2ZyZWUoY2hhaW5fc3MpOworCXJldHVybiBvazsKKwl9CisKKworLyogR2l2ZW4gYSBTVEFDS19PRihYNTA5KSBmaW5kIHRoZSBpc3N1ZXIgb2YgY2VydCAoaWYgYW55KQorICovCisKK3N0YXRpYyBYNTA5ICpmaW5kX2lzc3VlcihYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqc2ssIFg1MDkgKngpCit7CisJaW50IGk7CisJWDUwOSAqaXNzdWVyOworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X251bShzayk7IGkrKykKKwkJeworCQlpc3N1ZXIgPSBza19YNTA5X3ZhbHVlKHNrLCBpKTsKKwkJaWYgKGN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeCwgaXNzdWVyKSkKKwkJCXJldHVybiBpc3N1ZXI7CisJCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogR2l2ZW4gYSBwb3NzaWJsZSBjZXJ0aWZpY2F0ZSBhbmQgaXNzdWVyIGNoZWNrIHRoZW0gKi8KKworc3RhdGljIGludCBjaGVja19pc3N1ZWQoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCwgWDUwOSAqaXNzdWVyKQoreworCWludCByZXQ7CisJcmV0ID0gWDUwOV9jaGVja19pc3N1ZWQoaXNzdWVyLCB4KTsKKwlpZiAocmV0ID09IFg1MDlfVl9PSykKKwkJcmV0dXJuIDE7CisJLyogSWYgd2UgaGF2ZW4ndCBhc2tlZCBmb3IgaXNzdWVyIGVycm9ycyBkb24ndCBzZXQgY3R4ICovCisJaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19DQl9JU1NVRVJfQ0hFQ0spKQorCQlyZXR1cm4gMDsKKworCWN0eC0+ZXJyb3IgPSByZXQ7CisJY3R4LT5jdXJyZW50X2NlcnQgPSB4OworCWN0eC0+Y3VycmVudF9pc3N1ZXIgPSBpc3N1ZXI7CisJcmV0dXJuIGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEFsdGVybmF0aXZlIGxvb2t1cCBtZXRob2Q6IGxvb2sgZnJvbSBhIFNUQUNLIHN0b3JlZCBpbiBvdGhlcl9jdHggKi8KKworc3RhdGljIGludCBnZXRfaXNzdWVyX3NrKFg1MDkgKippc3N1ZXIsIFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpCit7CisJKmlzc3VlciA9IGZpbmRfaXNzdWVyKGN0eCwgY3R4LT5vdGhlcl9jdHgsIHgpOworCWlmICgqaXNzdWVyKQorCQl7CisJCUNSWVBUT19hZGQoJigqaXNzdWVyKS0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDkpOworCQlyZXR1cm4gMTsKKwkJfQorCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisJCisKKy8qIENoZWNrIGEgY2VydGlmaWNhdGUgY2hhaW5zIGV4dGVuc2lvbnMgZm9yIGNvbnNpc3RlbmN5CisgKiB3aXRoIHRoZSBzdXBwbGllZCBwdXJwb3NlCisgKi8KKworc3RhdGljIGludCBjaGVja19jaGFpbl9leHRlbnNpb25zKFg1MDlfU1RPUkVfQ1RYICpjdHgpCit7CisjaWZkZWYgT1BFTlNTTF9OT19DSEFJTl9WRVJJRlkKKwlyZXR1cm4gMTsKKyNlbHNlCisJaW50IGksIG9rPTAsIG11c3RfYmVfY2EsIHBsZW4gPSAwOworCVg1MDkgKng7CisJaW50ICgqY2IpKGludCB4b2ssWDUwOV9TVE9SRV9DVFggKnhjdHgpOworCWludCBwcm94eV9wYXRoX2xlbmd0aCA9IDA7CisJaW50IHB1cnBvc2U7CisJaW50IGFsbG93X3Byb3h5X2NlcnRzOworCWNiPWN0eC0+dmVyaWZ5X2NiOworCisJLyogbXVzdF9iZV9jYSBjYW4gaGF2ZSAxIG9mIDMgdmFsdWVzOgorCSAgIC0xOiB3ZSBhY2NlcHQgYm90aCBDQSBhbmQgbm9uLUNBIGNlcnRpZmljYXRlcywgdG8gYWxsb3cgZGlyZWN0CisJICAgICAgIHVzZSBvZiBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgKHdoaWNoIGFyZSBtYXJrZWQgYXMgQ0EpLgorCSAgIDA6ICB3ZSBvbmx5IGFjY2VwdCBub24tQ0EgY2VydGlmaWNhdGVzLiAgVGhpcyBpcyBjdXJyZW50bHkgbm90CisJICAgICAgIHVzZWQsIGJ1dCB0aGUgcG9zc2liaWxpdHkgaXMgcHJlc2VudCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuCisJICAgMTogIHdlIG9ubHkgYWNjZXB0IENBIGNlcnRpZmljYXRlcy4gIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgZm9yCisJICAgICAgIGFsbCBjZXJ0aWZpY2F0ZXMgaW4gdGhlIGNoYWluIGV4Y2VwdCB0aGUgbGVhZiBjZXJ0aWZpY2F0ZS4KKwkqLworCW11c3RfYmVfY2EgPSAtMTsKKworCS8qIENSTCBwYXRoIHZhbGlkYXRpb24gKi8KKwlpZiAoY3R4LT5wYXJlbnQpCisJCXsKKwkJYWxsb3dfcHJveHlfY2VydHMgPSAwOworCQlwdXJwb3NlID0gWDUwOV9QVVJQT1NFX0NSTF9TSUdOOworCQl9CisJZWxzZQorCQl7CisJCWFsbG93X3Byb3h5X2NlcnRzID0KKwkJCSEhKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfQUxMT1dfUFJPWFlfQ0VSVFMpOworCQkvKiBBIGhhY2sgdG8ga2VlcCBwZW9wbGUgd2hvIGRvbid0IHdhbnQgdG8gbW9kaWZ5IHRoZWlyCisJCSAgIHNvZnR3YXJlIGhhcHB5ICovCisJCWlmIChnZXRlbnYoIk9QRU5TU0xfQUxMT1dfUFJPWFlfQ0VSVFMiKSkKKwkJCWFsbG93X3Byb3h5X2NlcnRzID0gMTsKKwkJcHVycG9zZSA9IGN0eC0+cGFyYW0tPnB1cnBvc2U7CisJCX0KKworCS8qIENoZWNrIGFsbCB1bnRydXN0ZWQgY2VydGlmaWNhdGVzICovCisJZm9yIChpID0gMDsgaSA8IGN0eC0+bGFzdF91bnRydXN0ZWQ7IGkrKykKKwkJeworCQlpbnQgcmV0OworCQl4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpKTsKKwkJaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19JR05PUkVfQ1JJVElDQUwpCisJCQkmJiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQ1JJVElDQUwpKQorCQkJeworCQkJY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0VYVEVOU0lPTjsKKwkJCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCQkJY3R4LT5jdXJyZW50X2NlcnQgPSB4OworCQkJb2s9Y2IoMCxjdHgpOworCQkJaWYgKCFvaykgZ290byBlbmQ7CisJCQl9CisJCWlmICghYWxsb3dfcHJveHlfY2VydHMgJiYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1BST1hZKSkKKwkJCXsKKwkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX1BST1hZX0NFUlRJRklDQVRFU19OT1RfQUxMT1dFRDsKKwkJCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCQkJY3R4LT5jdXJyZW50X2NlcnQgPSB4OworCQkJb2s9Y2IoMCxjdHgpOworCQkJaWYgKCFvaykgZ290byBlbmQ7CisJCQl9CisJCXJldCA9IFg1MDlfY2hlY2tfY2EoeCk7CisJCXN3aXRjaChtdXN0X2JlX2NhKQorCQkJeworCQljYXNlIC0xOgorCQkJaWYgKChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1g1MDlfU1RSSUNUKQorCQkJCSYmIChyZXQgIT0gMSkgJiYgKHJldCAhPSAwKSkKKwkJCQl7CisJCQkJcmV0ID0gMDsKKwkJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9JTlZBTElEX0NBOworCQkJCX0KKwkJCWVsc2UKKwkJCQlyZXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQl7CisJCQkJcmV0ID0gMDsKKwkJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9JTlZBTElEX05PTl9DQTsKKwkJCQl9CisJCQllbHNlCisJCQkJcmV0ID0gMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKChyZXQgPT0gMCkKKwkJCQl8fCAoKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfWDUwOV9TVFJJQ1QpCisJCQkJCSYmIChyZXQgIT0gMSkpKQorCQkJCXsKKwkJCQlyZXQgPSAwOworCQkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfQ0E7CisJCQkJfQorCQkJZWxzZQorCQkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJCX0KKwkJaWYgKHJldCA9PSAwKQorCQkJeworCQkJY3R4LT5lcnJvcl9kZXB0aCA9IGk7CisJCQljdHgtPmN1cnJlbnRfY2VydCA9IHg7CisJCQlvaz1jYigwLGN0eCk7CisJCQlpZiAoIW9rKSBnb3RvIGVuZDsKKwkJCX0KKwkJaWYgKGN0eC0+cGFyYW0tPnB1cnBvc2UgPiAwKQorCQkJeworCQkJcmV0ID0gWDUwOV9jaGVja19wdXJwb3NlKHgsIHB1cnBvc2UsIG11c3RfYmVfY2EgPiAwKTsKKwkJCWlmICgocmV0ID09IDApCisJCQkJfHwgKChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX1g1MDlfU1RSSUNUKQorCQkJCQkmJiAocmV0ICE9IDEpKSkKKwkJCQl7CisJCQkJY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfSU5WQUxJRF9QVVJQT1NFOworCQkJCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCQkJCWN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKwkJCQlvaz1jYigwLGN0eCk7CisJCQkJaWYgKCFvaykgZ290byBlbmQ7CisJCQkJfQorCQkJfQorCQkvKiBDaGVjayBwYXRobGVuIGlmIG5vdCBzZWxmIGlzc3VlZCAqLworCQlpZiAoKGkgPiAxKSAmJiAhKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NJKQorCQkJICAgJiYgKHgtPmV4X3BhdGhsZW4gIT0gLTEpCisJCQkgICAmJiAocGxlbiA+ICh4LT5leF9wYXRobGVuICsgcHJveHlfcGF0aF9sZW5ndGggKyAxKSkpCisJCQl7CisJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9QQVRIX0xFTkdUSF9FWENFRURFRDsKKwkJCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCQkJY3R4LT5jdXJyZW50X2NlcnQgPSB4OworCQkJb2s9Y2IoMCxjdHgpOworCQkJaWYgKCFvaykgZ290byBlbmQ7CisJCQl9CisJCS8qIEluY3JlbWVudCBwYXRoIGxlbmd0aCBpZiBub3Qgc2VsZiBpc3N1ZWQgKi8KKwkJaWYgKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU0kpKQorCQkJcGxlbisrOworCQkvKiBJZiB0aGlzIGNlcnRpZmljYXRlIGlzIGEgcHJveHkgY2VydGlmaWNhdGUsIHRoZSBuZXh0CisJCSAgIGNlcnRpZmljYXRlIG11c3QgYmUgYW5vdGhlciBwcm94eSBjZXJ0aWZpY2F0ZSBvciBhIEVFCisJCSAgIGNlcnRpZmljYXRlLiAgSWYgbm90LCB0aGUgbmV4dCBjZXJ0aWZpY2F0ZSBtdXN0IGJlIGEKKwkJICAgQ0EgY2VydGlmaWNhdGUuICAqLworCQlpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfUFJPWFkpCisJCQl7CisJCQlpZiAoeC0+ZXhfcGNwYXRobGVuICE9IC0xICYmIGkgPiB4LT5leF9wY3BhdGhsZW4pCisJCQkJeworCQkJCWN0eC0+ZXJyb3IgPQorCQkJCQlYNTA5X1ZfRVJSX1BST1hZX1BBVEhfTEVOR1RIX0VYQ0VFREVEOworCQkJCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCQkJCWN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKwkJCQlvaz1jYigwLGN0eCk7CisJCQkJaWYgKCFvaykgZ290byBlbmQ7CisJCQkJfQorCQkJcHJveHlfcGF0aF9sZW5ndGgrKzsKKwkJCW11c3RfYmVfY2EgPSAwOworCQkJfQorCQllbHNlCisJCQltdXN0X2JlX2NhID0gMTsKKwkJfQorCW9rID0gMTsKKyBlbmQ6CisJcmV0dXJuIG9rOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgY2hlY2tfbmFtZV9jb25zdHJhaW50cyhYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlYNTA5ICp4OworCWludCBpLCBqLCBydjsKKwkvKiBDaGVjayBuYW1lIGNvbnN0cmFpbnRzIGZvciBhbGwgY2VydGlmaWNhdGVzICovCisJZm9yIChpID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgLSAxOyBpID49IDA7IGktLSkKKwkJeworCQl4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpKTsKKwkJLyogSWdub3JlIHNlbGYgaXNzdWVkIGNlcnRzIHVubGVzcyBsYXN0IGluIGNoYWluICovCisJCWlmIChpICYmICh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkpCisJCQljb250aW51ZTsKKwkJLyogQ2hlY2sgYWdhaW5zdCBjb25zdHJhaW50cyBmb3IgYWxsIGNlcnRpZmljYXRlcyBoaWdoZXIgaW4KKwkJICogY2hhaW4gaW5jbHVkaW5nIHRydXN0IGFuY2hvci4gVHJ1c3QgYW5jaG9yIG5vdCBzdHJpY3RseQorCQkgKiBzcGVha2luZyBuZWVkZWQgYnV0IGlmIGl0IGluY2x1ZGVzIGNvbnN0cmFpbnRzIGl0IGlzIHRvIGJlCisJCSAqIGFzc3VtZWQgaXQgZXhwZWN0cyB0aGVtIHRvIGJlIG9iZXllZC4KKwkJICovCisJCWZvciAoaiA9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pIC0gMTsgaiA+IGk7IGotLSkKKwkJCXsKKwkJCU5BTUVfQ09OU1RSQUlOVFMgKm5jID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBqKS0+bmM7CisJCQlpZiAobmMpCisJCQkJeworCQkJCXJ2ID0gTkFNRV9DT05TVFJBSU5UU19jaGVjayh4LCBuYyk7CisJCQkJaWYgKHJ2ICE9IFg1MDlfVl9PSykKKwkJCQkJeworCQkJCQljdHgtPmVycm9yID0gcnY7CisJCQkJCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCQkJCQljdHgtPmN1cnJlbnRfY2VydCA9IHg7CisJCQkJCWlmICghY3R4LT52ZXJpZnlfY2IoMCxjdHgpKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgY2hlY2tfdHJ1c3QoWDUwOV9TVE9SRV9DVFggKmN0eCkKK3sKKyNpZmRlZiBPUEVOU1NMX05PX0NIQUlOX1ZFUklGWQorCXJldHVybiAxOworI2Vsc2UKKwlpbnQgaSwgb2s7CisJWDUwOSAqeDsKKwlpbnQgKCpjYikoaW50IHhvayxYNTA5X1NUT1JFX0NUWCAqeGN0eCk7CisJY2I9Y3R4LT52ZXJpZnlfY2I7CisvKiBGb3Igbm93IGp1c3QgY2hlY2sgdGhlIGxhc3QgY2VydGlmaWNhdGUgaW4gdGhlIGNoYWluICovCisJaSA9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pIC0gMTsKKwl4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBpKTsKKwlvayA9IFg1MDlfY2hlY2tfdHJ1c3QoeCwgY3R4LT5wYXJhbS0+dHJ1c3QsIDApOworCWlmIChvayA9PSBYNTA5X1RSVVNUX1RSVVNURUQpCisJCXJldHVybiAxOworCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCWN0eC0+Y3VycmVudF9jZXJ0ID0geDsKKwlpZiAob2sgPT0gWDUwOV9UUlVTVF9SRUpFQ1RFRCkKKwkJY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfQ0VSVF9SRUpFQ1RFRDsKKwllbHNlCisJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NFUlRfVU5UUlVTVEVEOworCW9rID0gY2IoMCwgY3R4KTsKKwlyZXR1cm4gb2s7CisjZW5kaWYKK30KKworc3RhdGljIGludCBjaGVja19yZXZvY2F0aW9uKFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCWludCBpLCBsYXN0LCBvazsKKwlpZiAoIShjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0NSTF9DSEVDSykpCisJCXJldHVybiAxOworCWlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0NSTF9DSEVDS19BTEwpCisJCWxhc3QgPSBza19YNTA5X251bShjdHgtPmNoYWluKSAtIDE7CisJZWxzZQorCQl7CisJCS8qIElmIGNoZWNraW5nIENSTCBwYXRocyB0aGlzIGlzbid0IHRoZSBFRSBjZXJ0aWZpY2F0ZSAqLworCQlpZiAoY3R4LT5wYXJlbnQpCisJCQlyZXR1cm4gMTsKKwkJbGFzdCA9IDA7CisJCX0KKwlmb3IoaSA9IDA7IGkgPD0gbGFzdDsgaSsrKQorCQl7CisJCWN0eC0+ZXJyb3JfZGVwdGggPSBpOworCQlvayA9IGNoZWNrX2NlcnQoY3R4KTsKKwkJaWYgKCFvaykgcmV0dXJuIG9rOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGNoZWNrX2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJWDUwOV9DUkwgKmNybCA9IE5VTEwsICpkY3JsID0gTlVMTDsKKwlYNTA5ICp4OworCWludCBvaywgY251bTsKKwljbnVtID0gY3R4LT5lcnJvcl9kZXB0aDsKKwl4ID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBjbnVtKTsKKwljdHgtPmN1cnJlbnRfY2VydCA9IHg7CisJY3R4LT5jdXJyZW50X2lzc3VlciA9IE5VTEw7CisJY3R4LT5jdXJyZW50X3JlYXNvbnMgPSAwOworCXdoaWxlIChjdHgtPmN1cnJlbnRfcmVhc29ucyAhPSBDUkxEUF9BTExfUkVBU09OUykKKwkJeworCQkvKiBUcnkgdG8gcmV0cmlldmUgcmVsZXZhbnQgQ1JMICovCisJCWlmIChjdHgtPmdldF9jcmwpCisJCQlvayA9IGN0eC0+Z2V0X2NybChjdHgsICZjcmwsIHgpOworCQllbHNlCisJCQlvayA9IGdldF9jcmxfZGVsdGEoY3R4LCAmY3JsLCAmZGNybCwgeCk7CisJCS8qIElmIGVycm9yIGxvb2tpbmcgdXAgQ1JMLCBub3RoaW5nIHdlIGNhbiBkbyBleGNlcHQKKwkJICogbm90aWZ5IGNhbGxiYWNrCisJCSAqLworCQlpZighb2spCisJCQl7CisJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTDsKKwkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQljdHgtPmN1cnJlbnRfY3JsID0gY3JsOworCQlvayA9IGN0eC0+Y2hlY2tfY3JsKGN0eCwgY3JsKTsKKwkJaWYgKCFvaykKKwkJCWdvdG8gZXJyOworCisJCWlmIChkY3JsKQorCQkJeworCQkJb2sgPSBjdHgtPmNoZWNrX2NybChjdHgsIGRjcmwpOworCQkJaWYgKCFvaykKKwkJCQlnb3RvIGVycjsKKwkJCW9rID0gY3R4LT5jZXJ0X2NybChjdHgsIGRjcmwsIHgpOworCQkJaWYgKCFvaykKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJb2sgPSAxOworCisJCS8qIERvbid0IGxvb2sgaW4gZnVsbCBDUkwgaWYgZGVsdGEgcmVhc29uIGlzIHJlbW92ZWZyb21DUkwgKi8KKwkJaWYgKG9rICE9IDIpCisJCQl7CisJCQlvayA9IGN0eC0+Y2VydF9jcmwoY3R4LCBjcmwsIHgpOworCQkJaWYgKCFvaykKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQlYNTA5X0NSTF9mcmVlKGNybCk7CisJCVg1MDlfQ1JMX2ZyZWUoZGNybCk7CisJCWNybCA9IE5VTEw7CisJCWRjcmwgPSBOVUxMOworCQl9CisJZXJyOgorCVg1MDlfQ1JMX2ZyZWUoY3JsKTsKKwlYNTA5X0NSTF9mcmVlKGRjcmwpOworCisJY3R4LT5jdXJyZW50X2NybCA9IE5VTEw7CisJcmV0dXJuIG9rOworCisJfQorCisvKiBDaGVjayBDUkwgdGltZXMgYWdhaW5zdCB2YWx1ZXMgaW4gWDUwOV9TVE9SRV9DVFggKi8KKworc3RhdGljIGludCBjaGVja19jcmxfdGltZShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsLCBpbnQgbm90aWZ5KQorCXsKKwl0aW1lX3QgKnB0aW1lOworCWludCBpOworCWlmIChub3RpZnkpCisJCWN0eC0+Y3VycmVudF9jcmwgPSBjcmw7CisJaWYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfVVNFX0NIRUNLX1RJTUUpCisJCXB0aW1lID0gJmN0eC0+cGFyYW0tPmNoZWNrX3RpbWU7CisJZWxzZQorCQlwdGltZSA9IE5VTEw7CisKKwlpPVg1MDlfY21wX3RpbWUoWDUwOV9DUkxfZ2V0X2xhc3RVcGRhdGUoY3JsKSwgcHRpbWUpOworCWlmIChpID09IDApCisJCXsKKwkJaWYgKCFub3RpZnkpCisJCQlyZXR1cm4gMDsKKwkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9MQVNUX1VQREFURV9GSUVMRDsKKwkJaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQorCQkJcmV0dXJuIDA7CisJCX0KKworCWlmIChpID4gMCkKKwkJeworCQlpZiAoIW5vdGlmeSkKKwkJCXJldHVybiAwOworCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfQ1JMX05PVF9ZRVRfVkFMSUQ7CisJCWlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKKwkJCXJldHVybiAwOworCQl9CisKKwlpZihYNTA5X0NSTF9nZXRfbmV4dFVwZGF0ZShjcmwpKQorCQl7CisJCWk9WDUwOV9jbXBfdGltZShYNTA5X0NSTF9nZXRfbmV4dFVwZGF0ZShjcmwpLCBwdGltZSk7CisKKwkJaWYgKGkgPT0gMCkKKwkJCXsKKwkJCWlmICghbm90aWZ5KQorCQkJCXJldHVybiAwOworCQkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0VSUk9SX0lOX0NSTF9ORVhUX1VQREFURV9GSUVMRDsKKwkJCWlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJLyogSWdub3JlIGV4cGlyeSBvZiBiYXNlIENSTCBpcyBkZWx0YSBpcyB2YWxpZCAqLworCQlpZiAoKGkgPCAwKSAmJiAhKGN0eC0+Y3VycmVudF9jcmxfc2NvcmUgJiBDUkxfU0NPUkVfVElNRV9ERUxUQSkpCisJCQl7CisJCQlpZiAoIW5vdGlmeSkKKwkJCQlyZXR1cm4gMDsKKwkJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9DUkxfSEFTX0VYUElSRUQ7CisJCQlpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCWlmIChub3RpZnkpCisJCWN0eC0+Y3VycmVudF9jcmwgPSBOVUxMOworCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGdldF9jcmxfc2soWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKipwY3JsLCBYNTA5X0NSTCAqKnBkY3JsLAorCQkJWDUwOSAqKnBpc3N1ZXIsIGludCAqcHNjb3JlLCB1bnNpZ25lZCBpbnQgKnByZWFzb25zLAorCQkJU1RBQ0tfT0YoWDUwOV9DUkwpICpjcmxzKQorCXsKKwlpbnQgaSwgY3JsX3Njb3JlLCBiZXN0X3Njb3JlID0gKnBzY29yZTsKKwl1bnNpZ25lZCBpbnQgcmVhc29ucywgYmVzdF9yZWFzb25zID0gMDsKKwlYNTA5ICp4ID0gY3R4LT5jdXJyZW50X2NlcnQ7CisJWDUwOV9DUkwgKmNybCwgKmJlc3RfY3JsID0gTlVMTDsKKwlYNTA5ICpjcmxfaXNzdWVyID0gTlVMTCwgKmJlc3RfY3JsX2lzc3VlciA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9DUkxfbnVtKGNybHMpOyBpKyspCisJCXsKKwkJY3JsID0gc2tfWDUwOV9DUkxfdmFsdWUoY3JscywgaSk7CisJCXJlYXNvbnMgPSAqcHJlYXNvbnM7CisJCWNybF9zY29yZSA9IGdldF9jcmxfc2NvcmUoY3R4LCAmY3JsX2lzc3VlciwgJnJlYXNvbnMsIGNybCwgeCk7CisKKwkJaWYgKGNybF9zY29yZSA+IGJlc3Rfc2NvcmUpCisJCQl7CisJCQliZXN0X2NybCA9IGNybDsKKwkJCWJlc3RfY3JsX2lzc3VlciA9IGNybF9pc3N1ZXI7CisJCQliZXN0X3Njb3JlID0gY3JsX3Njb3JlOworCQkJYmVzdF9yZWFzb25zID0gcmVhc29uczsKKwkJCX0KKwkJfQorCisJaWYgKGJlc3RfY3JsKQorCQl7CisJCWlmICgqcGNybCkKKwkJCVg1MDlfQ1JMX2ZyZWUoKnBjcmwpOworCQkqcGNybCA9IGJlc3RfY3JsOworCQkqcGlzc3VlciA9IGJlc3RfY3JsX2lzc3VlcjsKKwkJKnBzY29yZSA9IGJlc3Rfc2NvcmU7CisJCSpwcmVhc29ucyA9IGJlc3RfcmVhc29uczsKKwkJQ1JZUFRPX2FkZCgmYmVzdF9jcmwtPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX1g1MDlfQ1JMKTsKKwkJaWYgKCpwZGNybCkKKwkJCXsKKwkJCVg1MDlfQ1JMX2ZyZWUoKnBkY3JsKTsKKwkJCSpwZGNybCA9IE5VTEw7CisJCQl9CisJCWdldF9kZWx0YV9zayhjdHgsIHBkY3JsLCBwc2NvcmUsIGJlc3RfY3JsLCBjcmxzKTsKKwkJfQorCisJaWYgKGJlc3Rfc2NvcmUgPj0gQ1JMX1NDT1JFX1ZBTElEKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworCX0KKworLyogQ29tcGFyZSB0d28gQ1JMIGV4dGVuc2lvbnMgZm9yIGRlbHRhIGNoZWNraW5nIHB1cnBvc2VzLiBUaGV5IHNob3VsZCBiZQorICogYm90aCBwcmVzZW50IG9yIGJvdGggYWJzZW50LiBJZiBib3RoIHByZXNlbnQgYWxsIGZpZWxkcyBtdXN0IGJlIGlkZW50aWNhbC4KKyAqLworCitzdGF0aWMgaW50IGNybF9leHRlbnNpb25fbWF0Y2goWDUwOV9DUkwgKmEsIFg1MDlfQ1JMICpiLCBpbnQgbmlkKQorCXsKKwlBU04xX09DVEVUX1NUUklORyAqZXh0YSwgKmV4dGI7CisJaW50IGk7CisJaSA9IFg1MDlfQ1JMX2dldF9leHRfYnlfTklEKGEsIG5pZCwgMCk7CisJaWYgKGkgPj0gMCkKKwkJeworCQkvKiBDYW4ndCBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzICovCisJCWlmIChYNTA5X0NSTF9nZXRfZXh0X2J5X05JRChhLCBuaWQsIGkpICE9IC0xKQorCQkJcmV0dXJuIDA7CisJCWV4dGEgPSBYNTA5X0VYVEVOU0lPTl9nZXRfZGF0YShYNTA5X0NSTF9nZXRfZXh0KGEsIGkpKTsKKwkJfQorCWVsc2UKKwkJZXh0YSA9IE5VTEw7CisKKwlpID0gWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoYiwgbmlkLCAwKTsKKworCWlmIChpID49IDApCisJCXsKKworCQlpZiAoWDUwOV9DUkxfZ2V0X2V4dF9ieV9OSUQoYiwgbmlkLCBpKSAhPSAtMSkKKwkJCXJldHVybiAwOworCQlleHRiID0gWDUwOV9FWFRFTlNJT05fZ2V0X2RhdGEoWDUwOV9DUkxfZ2V0X2V4dChiLCBpKSk7CisJCX0KKwllbHNlCisJCWV4dGIgPSBOVUxMOworCisJaWYgKCFleHRhICYmICFleHRiKQorCQlyZXR1cm4gMTsKKworCWlmICghZXh0YSB8fCAhZXh0YikKKwkJcmV0dXJuIDA7CisKKworCWlmIChBU04xX09DVEVUX1NUUklOR19jbXAoZXh0YSwgZXh0YikpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7CisJfQorCisvKiBTZWUgaWYgYSBiYXNlIGFuZCBkZWx0YSBhcmUgY29tcGF0aWJsZSAqLworCitzdGF0aWMgaW50IGNoZWNrX2RlbHRhX2Jhc2UoWDUwOV9DUkwgKmRlbHRhLCBYNTA5X0NSTCAqYmFzZSkKKwl7CisJLyogRGVsdGEgQ1JMIG11c3QgYmUgYSBkZWx0YSAqLworCWlmICghZGVsdGEtPmJhc2VfY3JsX251bWJlcikKKwkJCXJldHVybiAwOworCS8qIEJhc2UgbXVzdCBoYXZlIGEgQ1JMIG51bWJlciAqLworCWlmICghYmFzZS0+Y3JsX251bWJlcikKKwkJCXJldHVybiAwOworCS8qIElzc3VlciBuYW1lcyBtdXN0IG1hdGNoICovCisJaWYgKFg1MDlfTkFNRV9jbXAoWDUwOV9DUkxfZ2V0X2lzc3VlcihiYXNlKSwKKwkJCQlYNTA5X0NSTF9nZXRfaXNzdWVyKGRlbHRhKSkpCisJCXJldHVybiAwOworCS8qIEFLSUQgYW5kIElEUCBtdXN0IG1hdGNoICovCisJaWYgKCFjcmxfZXh0ZW5zaW9uX21hdGNoKGRlbHRhLCBiYXNlLCBOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyKSkKKwkJCXJldHVybiAwOworCWlmICghY3JsX2V4dGVuc2lvbl9tYXRjaChkZWx0YSwgYmFzZSwgTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50KSkKKwkJCXJldHVybiAwOworCS8qIERlbHRhIENSTCBiYXNlIG51bWJlciBtdXN0IG5vdCBleGNlZWQgRnVsbCBDUkwgbnVtYmVyLiAqLworCWlmIChBU04xX0lOVEVHRVJfY21wKGRlbHRhLT5iYXNlX2NybF9udW1iZXIsIGJhc2UtPmNybF9udW1iZXIpID4gMCkKKwkJCXJldHVybiAwOworCS8qIERlbHRhIENSTCBudW1iZXIgbXVzdCBleGNlZWQgZnVsbCBDUkwgbnVtYmVyICovCisJaWYgKEFTTjFfSU5URUdFUl9jbXAoZGVsdGEtPmNybF9udW1iZXIsIGJhc2UtPmNybF9udW1iZXIpID4gMCkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworCX0KKworLyogRm9yIGEgZ2l2ZW4gYmFzZSBDUkwgZmluZCBhIGRlbHRhLi4uIG1heWJlIGV4dGVuZCB0byBkZWx0YSBzY29yaW5nCisgKiBvciByZXRyaWV2ZSBhIGNoYWluIG9mIGRlbHRhcy4uLgorICovCisKK3N0YXRpYyB2b2lkIGdldF9kZWx0YV9zayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqKmRjcmwsIGludCAqcHNjb3JlLAorCQkJWDUwOV9DUkwgKmJhc2UsIFNUQUNLX09GKFg1MDlfQ1JMKSAqY3JscykKKwl7CisJWDUwOV9DUkwgKmRlbHRhOworCWludCBpOworCWlmICghKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfVVNFX0RFTFRBUykpCisJCXJldHVybjsKKwlpZiAoISgoY3R4LT5jdXJyZW50X2NlcnQtPmV4X2ZsYWdzIHwgYmFzZS0+ZmxhZ3MpICYgRVhGTEFHX0ZSRVNIRVNUKSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X0NSTF9udW0oY3Jscyk7IGkrKykKKwkJeworCQlkZWx0YSA9IHNrX1g1MDlfQ1JMX3ZhbHVlKGNybHMsIGkpOworCQlpZiAoY2hlY2tfZGVsdGFfYmFzZShkZWx0YSwgYmFzZSkpCisJCQl7CisJCQlpZiAoY2hlY2tfY3JsX3RpbWUoY3R4LCBkZWx0YSwgMCkpCisJCQkJKnBzY29yZSB8PSBDUkxfU0NPUkVfVElNRV9ERUxUQTsKKwkJCUNSWVBUT19hZGQoJmRlbHRhLT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19YNTA5X0NSTCk7CisJCQkqZGNybCA9IGRlbHRhOworCQkJcmV0dXJuOworCQkJfQorCQl9CisJKmRjcmwgPSBOVUxMOworCX0KKworLyogRm9yIGEgZ2l2ZW4gQ1JMIHJldHVybiBob3cgc3VpdGFibGUgaXQgaXMgZm9yIHRoZSBzdXBwbGllZCBjZXJ0aWZpY2F0ZSAneCcuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbWFzayBvZiBzZXZlcmFsIGNyaXRlcmlhLgorICogSWYgdGhlIGlzc3VlciBpcyBub3QgdGhlIGNlcnRpZmljYXRlIGlzc3VlciB0aGlzIGlzIHJldHVybmVkIGluICpwaXNzdWVyLgorICogVGhlIHJlYXNvbnMgbWFzayBpcyBhbHNvIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBDUkwgaXMgc3VpdGFibGU6IGlmCisgKiBubyBuZXcgcmVhc29ucyB0aGUgQ1JMIGlzIHJlamVjdGVkLCBvdGhlcndpc2UgcmVhc29ucyBpcyB1cGRhdGVkLgorICovCisKK3N0YXRpYyBpbnQgZ2V0X2NybF9zY29yZShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICoqcGlzc3VlciwKKwkJCXVuc2lnbmVkIGludCAqcHJlYXNvbnMsCisJCQlYNTA5X0NSTCAqY3JsLCBYNTA5ICp4KQorCXsKKworCWludCBjcmxfc2NvcmUgPSAwOworCXVuc2lnbmVkIGludCB0bXBfcmVhc29ucyA9ICpwcmVhc29ucywgY3JsX3JlYXNvbnM7CisKKwkvKiBGaXJzdCBzZWUgaWYgd2UgY2FuIHJlamVjdCBDUkwgc3RyYWlnaHQgYXdheSAqLworCisJLyogSW52YWxpZCBJRFAgY2Fubm90IGJlIHByb2Nlc3NlZCAqLworCWlmIChjcmwtPmlkcF9mbGFncyAmIElEUF9JTlZBTElEKQorCQlyZXR1cm4gMDsKKwkvKiBSZWFzb24gY29kZXMgb3IgaW5kaXJlY3QgQ1JMcyBuZWVkIGV4dGVuZGVkIENSTCBzdXBwb3J0ICovCisJaWYgKCEoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19FWFRFTkRFRF9DUkxfU1VQUE9SVCkpCisJCXsKKwkJaWYgKGNybC0+aWRwX2ZsYWdzICYgKElEUF9JTkRJUkVDVCB8IElEUF9SRUFTT05TKSkKKwkJCXJldHVybiAwOworCQl9CisJZWxzZSBpZiAoY3JsLT5pZHBfZmxhZ3MgJiBJRFBfUkVBU09OUykKKwkJeworCQkvKiBJZiBubyBuZXcgcmVhc29ucyByZWplY3QgKi8KKwkJaWYgKCEoY3JsLT5pZHBfcmVhc29ucyAmIH50bXBfcmVhc29ucykpCisJCQlyZXR1cm4gMDsKKwkJfQorCS8qIERvbid0IHByb2Nlc3MgZGVsdGFzIGF0IHRoaXMgc3RhZ2UgKi8KKwllbHNlIGlmIChjcmwtPmJhc2VfY3JsX251bWJlcikKKwkJcmV0dXJuIDA7CisJLyogSWYgaXNzdWVyIG5hbWUgZG9lc24ndCBtYXRjaCBjZXJ0aWZpY2F0ZSBuZWVkIGluZGlyZWN0IENSTCAqLworCWlmIChYNTA5X05BTUVfY21wKFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpLCBYNTA5X0NSTF9nZXRfaXNzdWVyKGNybCkpKQorCQl7CisJCWlmICghKGNybC0+aWRwX2ZsYWdzICYgSURQX0lORElSRUNUKSkKKwkJCXJldHVybiAwOworCQl9CisJZWxzZQorCQljcmxfc2NvcmUgfD0gQ1JMX1NDT1JFX0lTU1VFUl9OQU1FOworCisJaWYgKCEoY3JsLT5mbGFncyAmIEVYRkxBR19DUklUSUNBTCkpCisJCWNybF9zY29yZSB8PSBDUkxfU0NPUkVfTk9DUklUSUNBTDsKKworCS8qIENoZWNrIGV4cGlyeSAqLworCWlmIChjaGVja19jcmxfdGltZShjdHgsIGNybCwgMCkpCisJCWNybF9zY29yZSB8PSBDUkxfU0NPUkVfVElNRTsKKworCS8qIENoZWNrIGF1dGhvcml0eSBrZXkgSUQgYW5kIGxvY2F0ZSBjZXJ0aWZpY2F0ZSBpc3N1ZXIgKi8KKwljcmxfYWtpZF9jaGVjayhjdHgsIGNybCwgcGlzc3VlciwgJmNybF9zY29yZSk7CisKKwkvKiBJZiB3ZSBjYW4ndCBsb2NhdGUgY2VydGlmaWNhdGUgaXNzdWVyIGF0IHRoaXMgcG9pbnQgZm9yZ2V0IGl0ICovCisKKwlpZiAoIShjcmxfc2NvcmUgJiBDUkxfU0NPUkVfQUtJRCkpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgY2VydCBmb3IgbWF0Y2hpbmcgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgKi8KKworCWlmIChjcmxfY3JsZHBfY2hlY2soeCwgY3JsLCBjcmxfc2NvcmUsICZjcmxfcmVhc29ucykpCisJCXsKKwkJLyogSWYgbm8gbmV3IHJlYXNvbnMgcmVqZWN0ICovCisJCWlmICghKGNybF9yZWFzb25zICYgfnRtcF9yZWFzb25zKSkKKwkJCXJldHVybiAwOworCQl0bXBfcmVhc29ucyB8PSBjcmxfcmVhc29uczsKKwkJY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9TQ09QRTsKKwkJfQorCisJKnByZWFzb25zID0gdG1wX3JlYXNvbnM7CisKKwlyZXR1cm4gY3JsX3Njb3JlOworCisJfQorCitzdGF0aWMgdm9pZCBjcmxfYWtpZF9jaGVjayhYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsLAorCQkJCVg1MDkgKipwaXNzdWVyLCBpbnQgKnBjcmxfc2NvcmUpCisJeworCVg1MDkgKmNybF9pc3N1ZXIgPSBOVUxMOworCVg1MDlfTkFNRSAqY25tID0gWDUwOV9DUkxfZ2V0X2lzc3VlcihjcmwpOworCWludCBjaWR4ID0gY3R4LT5lcnJvcl9kZXB0aDsKKwlpbnQgaTsKKworCWlmIChjaWR4ICE9IHNrX1g1MDlfbnVtKGN0eC0+Y2hhaW4pIC0gMSkKKwkJY2lkeCsrOworCisJY3JsX2lzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgY2lkeCk7CisKKwlpZiAoWDUwOV9jaGVja19ha2lkKGNybF9pc3N1ZXIsIGNybC0+YWtpZCkgPT0gWDUwOV9WX09LKQorCQl7CisJCWlmICgqcGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSkKKwkJCXsKKwkJCSpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEfENSTF9TQ09SRV9JU1NVRVJfQ0VSVDsKKwkJCSpwaXNzdWVyID0gY3JsX2lzc3VlcjsKKwkJCXJldHVybjsKKwkJCX0KKwkJfQorCisJZm9yIChjaWR4Kys7IGNpZHggPCBza19YNTA5X251bShjdHgtPmNoYWluKTsgY2lkeCsrKQorCQl7CisJCWNybF9pc3N1ZXIgPSBza19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sIGNpZHgpOworCQlpZiAoWDUwOV9OQU1FX2NtcChYNTA5X2dldF9zdWJqZWN0X25hbWUoY3JsX2lzc3VlciksIGNubSkpCisJCQljb250aW51ZTsKKwkJaWYgKFg1MDlfY2hlY2tfYWtpZChjcmxfaXNzdWVyLCBjcmwtPmFraWQpID09IFg1MDlfVl9PSykKKwkJCXsKKwkJCSpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEfENSTF9TQ09SRV9TQU1FX1BBVEg7CisJCQkqcGlzc3VlciA9IGNybF9pc3N1ZXI7CisJCQlyZXR1cm47CisJCQl9CisJCX0KKworCS8qIEFueXRoaW5nIGVsc2UgbmVlZHMgZXh0ZW5kZWQgQ1JMIHN1cHBvcnQgKi8KKworCWlmICghKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfRVhURU5ERURfQ1JMX1NVUFBPUlQpKQorCQlyZXR1cm47CisKKwkvKiBPdGhlcndpc2UgdGhlIENSTCBpc3N1ZXIgaXMgbm90IG9uIHRoZSBwYXRoLiBMb29rIGZvciBpdCBpbiB0aGUKKwkgKiBzZXQgb2YgdW50cnVzdGVkIGNlcnRpZmljYXRlcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9udW0oY3R4LT51bnRydXN0ZWQpOyBpKyspCisJCXsKKwkJY3JsX2lzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT51bnRydXN0ZWQsIGkpOworCQlpZiAoWDUwOV9OQU1FX2NtcChYNTA5X2dldF9zdWJqZWN0X25hbWUoY3JsX2lzc3VlciksIGNubSkpCisJCQljb250aW51ZTsKKwkJaWYgKFg1MDlfY2hlY2tfYWtpZChjcmxfaXNzdWVyLCBjcmwtPmFraWQpID09IFg1MDlfVl9PSykKKwkJCXsKKwkJCSpwaXNzdWVyID0gY3JsX2lzc3VlcjsKKwkJCSpwY3JsX3Njb3JlIHw9IENSTF9TQ09SRV9BS0lEOworCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisvKiBDaGVjayB0aGUgcGF0aCBvZiBhIENSTCBpc3N1ZXIgY2VydGlmaWNhdGUuIFRoaXMgY3JlYXRlcyBhIG5ldworICogWDUwOV9TVE9SRV9DVFggYW5kIHBvcHVsYXRlcyBpdCB3aXRoIG1vc3Qgb2YgdGhlIHBhcmFtZXRlcnMgZnJvbSB0aGUKKyAqIHBhcmVudC4gVGhpcyBjb3VsZCBiZSBvcHRpbWlzZWQgc29tZXdoYXQgc2luY2UgYSBsb3Qgb2YgcGF0aCBjaGVja2luZworICogd2lsbCBiZSBkdXBsaWNhdGVkIGJ5IHRoZSBwYXJlbnQsIGJ1dCB0aGlzIHdpbGwgcmFyZWx5IGJlIHVzZWQgaW4gCisgKiBwcmFjdGljZS4KKyAqLworCitzdGF0aWMgaW50IGNoZWNrX2NybF9wYXRoKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpCisJeworCVg1MDlfU1RPUkVfQ1RYIGNybF9jdHg7CisJaW50IHJldDsKKwkvKiBEb24ndCBhbGxvdyByZWN1cnNpdmUgQ1JMIHBhdGggdmFsaWRhdGlvbiAqLworCWlmIChjdHgtPnBhcmVudCkKKwkJcmV0dXJuIDA7CisJaWYgKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZjcmxfY3R4LCBjdHgtPmN0eCwgeCwgY3R4LT51bnRydXN0ZWQpKQorCQlyZXR1cm4gLTE7CisKKwljcmxfY3R4LmNybHMgPSBjdHgtPmNybHM7CisJLyogQ29weSB2ZXJpZnkgcGFyYW1zIGFjcm9zcyAqLworCVg1MDlfU1RPUkVfQ1RYX3NldDBfcGFyYW0oJmNybF9jdHgsIGN0eC0+cGFyYW0pOworCisJY3JsX2N0eC5wYXJlbnQgPSBjdHg7CisJY3JsX2N0eC52ZXJpZnlfY2IgPSBjdHgtPnZlcmlmeV9jYjsKKworCS8qIFZlcmlmeSBDUkwgaXNzdWVyICovCisJcmV0ID0gWDUwOV92ZXJpZnlfY2VydCgmY3JsX2N0eCk7CisKKwlpZiAocmV0IDw9IDApCisJCWdvdG8gZXJyOworCisJLyogQ2hlY2sgY2hhaW4gaXMgYWNjZXB0YWJsZSAqLworCisJcmV0ID0gY2hlY2tfY3JsX2NoYWluKGN0eCwgY3R4LT5jaGFpbiwgY3JsX2N0eC5jaGFpbik7CisJZXJyOgorCVg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJmNybF9jdHgpOworCXJldHVybiByZXQ7CisJfQorCisvKiBSRkMzMjgwIHNheXMgbm90aGluZyBhYm91dCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gQ1JMIHBhdGgKKyAqIGFuZCBjZXJ0aWZpY2F0ZSBwYXRoLCB3aGljaCBjb3VsZCBsZWFkIHRvIHNpdHVhdGlvbnMgd2hlcmUgYQorICogY2VydGlmaWNhdGUgY291bGQgYmUgcmV2b2tlZCBvciB2YWxpZGF0ZWQgYnkgYSBDQSBub3QgYXV0aG9yaXNlZAorICogdG8gZG8gc28uIFJGQzUyODAgaXMgbW9yZSBzdHJpY3QgYW5kIHN0YXRlcyB0aGF0IHRoZSB0d28gcGF0aHMgbXVzdAorICogZW5kIGluIHRoZSBzYW1lIHRydXN0IGFuY2hvciwgdGhvdWdoIHNvbWUgZGlzY3Vzc2lvbnMgcmVtYWluLi4uCisgKiB1bnRpbCB0aGlzIGlzIHJlc29sdmVkIHdlIHVzZSB0aGUgUkZDNTI4MCB2ZXJzaW9uCisgKi8KKworc3RhdGljIGludCBjaGVja19jcmxfY2hhaW4oWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCVNUQUNLX09GKFg1MDkpICpjZXJ0X3BhdGgsCisJCQlTVEFDS19PRihYNTA5KSAqY3JsX3BhdGgpCisJeworCVg1MDkgKmNlcnRfdGEsICpjcmxfdGE7CisJY2VydF90YSA9IHNrX1g1MDlfdmFsdWUoY2VydF9wYXRoLCBza19YNTA5X251bShjZXJ0X3BhdGgpIC0gMSk7CisJY3JsX3RhID0gc2tfWDUwOV92YWx1ZShjcmxfcGF0aCwgc2tfWDUwOV9udW0oY3JsX3BhdGgpIC0gMSk7CisJaWYgKCFYNTA5X2NtcChjZXJ0X3RhLCBjcmxfdGEpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKKy8qIENoZWNrIGZvciBtYXRjaCBiZXR3ZWVuIHR3byBkaXN0IHBvaW50IG5hbWVzOiB0aHJlZSBzZXBhcmF0ZSBjYXNlcy4KKyAqIDEuIEJvdGggYXJlIHJlbGF0aXZlIG5hbWVzIGFuZCBjb21wYXJlIFg1MDlfTkFNRSB0eXBlcy4KKyAqIDIuIE9uZSBmdWxsLCBvbmUgcmVsYXRpdmUuIENvbXBhcmUgWDUwOV9OQU1FIHRvIEdFTkVSQUxfTkFNRVMuCisgKiAzLiBCb3RoIGFyZSBmdWxsIG5hbWVzIGFuZCBjb21wYXJlIHR3byBHRU5FUkFMX05BTUVTLgorICogNC4gT25lIGlzIE5VTEw6IGF1dG9tYXRpYyBtYXRjaC4KKyAqLworCisKK3N0YXRpYyBpbnQgaWRwX2NoZWNrX2RwKERJU1RfUE9JTlRfTkFNRSAqYSwgRElTVF9QT0lOVF9OQU1FICpiKQorCXsKKwlYNTA5X05BTUUgKm5tID0gTlVMTDsKKwlHRU5FUkFMX05BTUVTICpnZW5zID0gTlVMTDsKKwlHRU5FUkFMX05BTUUgKmdlbmEsICpnZW5iOworCWludCBpLCBqOworCWlmICghYSB8fCAhYikKKwkJcmV0dXJuIDE7CisJaWYgKGEtPnR5cGUgPT0gMSkKKwkJeworCQlpZiAoIWEtPmRwbmFtZSkKKwkJCXJldHVybiAwOworCQkvKiBDYXNlIDE6IHR3byBYNTA5X05BTUUgKi8KKwkJaWYgKGItPnR5cGUgPT0gMSkKKwkJCXsKKwkJCWlmICghYi0+ZHBuYW1lKQorCQkJCXJldHVybiAwOworCQkJaWYgKCFYNTA5X05BTUVfY21wKGEtPmRwbmFtZSwgYi0+ZHBuYW1lKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJLyogQ2FzZSAyOiBzZXQgbmFtZSBhbmQgR0VORVJBTF9OQU1FUyBhcHByb3ByaWF0ZWx5ICovCisJCW5tID0gYS0+ZHBuYW1lOworCQlnZW5zID0gYi0+bmFtZS5mdWxsbmFtZTsKKwkJfQorCWVsc2UgaWYgKGItPnR5cGUgPT0gMSkKKwkJeworCQlpZiAoIWItPmRwbmFtZSkKKwkJCXJldHVybiAwOworCQkvKiBDYXNlIDI6IHNldCBuYW1lIGFuZCBHRU5FUkFMX05BTUVTIGFwcHJvcHJpYXRlbHkgKi8KKwkJZ2VucyA9IGEtPm5hbWUuZnVsbG5hbWU7CisJCW5tID0gYi0+ZHBuYW1lOworCQl9CisKKwkvKiBIYW5kbGUgY2FzZSAyIHdpdGggb25lIEdFTkVSQUxfTkFNRVMgYW5kIG9uZSBYNTA5X05BTUUgKi8KKwlpZiAobm0pCisJCXsKKwkJZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZ2Vucyk7IGkrKykKKwkJCXsKKwkJCWdlbmEgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoZ2VucywgaSk7CQorCQkJaWYgKGdlbmEtPnR5cGUgIT0gR0VOX0RJUk5BTUUpCisJCQkJY29udGludWU7CisJCQlpZiAoIVg1MDlfTkFNRV9jbXAobm0sIGdlbmEtPmQuZGlyZWN0b3J5TmFtZSkpCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCXJldHVybiAwOworCQl9CisKKwkvKiBFbHNlIGNhc2UgMzogdHdvIEdFTkVSQUxfTkFNRVMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGEtPm5hbWUuZnVsbG5hbWUpOyBpKyspCisJCXsKKwkJZ2VuYSA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShhLT5uYW1lLmZ1bGxuYW1lLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IHNrX0dFTkVSQUxfTkFNRV9udW0oYi0+bmFtZS5mdWxsbmFtZSk7IGorKykKKwkJCXsKKwkJCWdlbmIgPSBza19HRU5FUkFMX05BTUVfdmFsdWUoYi0+bmFtZS5mdWxsbmFtZSwgaik7CisJCQlpZiAoIUdFTkVSQUxfTkFNRV9jbXAoZ2VuYSwgZ2VuYikpCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCXJldHVybiAwOworCisJfQorCitzdGF0aWMgaW50IGNybGRwX2NoZWNrX2NybGlzc3VlcihESVNUX1BPSU5UICpkcCwgWDUwOV9DUkwgKmNybCwgaW50IGNybF9zY29yZSkKKwl7CisJaW50IGk7CisJWDUwOV9OQU1FICpubSA9IFg1MDlfQ1JMX2dldF9pc3N1ZXIoY3JsKTsKKwkvKiBJZiBubyBDUkxpc3N1ZXIgcmV0dXJuIGlzIHN1Y2Nlc3NmdWwgaWZmIGRvbid0IG5lZWQgYSBtYXRjaCAqLworCWlmICghZHAtPkNSTGlzc3VlcikKKwkJcmV0dXJuICEhKGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSk7CisJZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZHAtPkNSTGlzc3Vlcik7IGkrKykKKwkJeworCQlHRU5FUkFMX05BTUUgKmdlbiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShkcC0+Q1JMaXNzdWVyLCBpKTsKKwkJaWYgKGdlbi0+dHlwZSAhPSBHRU5fRElSTkFNRSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIVg1MDlfTkFNRV9jbXAoZ2VuLT5kLmRpcmVjdG9yeU5hbWUsIG5tKSkKKwkJCXJldHVybiAxOworCQl9CisJcmV0dXJuIDA7CisJfQorCisvKiBDaGVjayBDUkxEUCBhbmQgSURQICovCisKK3N0YXRpYyBpbnQgY3JsX2NybGRwX2NoZWNrKFg1MDkgKngsIFg1MDlfQ1JMICpjcmwsIGludCBjcmxfc2NvcmUsCisJCQkJdW5zaWduZWQgaW50ICpwcmVhc29ucykKKwl7CisJaW50IGk7CisJaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX09OTFlBVFRSKQorCQlyZXR1cm4gMDsKKwlpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQ0EpCisJCXsKKwkJaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX09OTFlVU0VSKQorCQkJcmV0dXJuIDA7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX09OTFlDQSkKKwkJCXJldHVybiAwOworCQl9CisJKnByZWFzb25zID0gY3JsLT5pZHBfcmVhc29uczsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfRElTVF9QT0lOVF9udW0oeC0+Y3JsZHApOyBpKyspCisJCXsKKwkJRElTVF9QT0lOVCAqZHAgPSBza19ESVNUX1BPSU5UX3ZhbHVlKHgtPmNybGRwLCBpKTsKKwkJaWYgKGNybGRwX2NoZWNrX2NybGlzc3VlcihkcCwgY3JsLCBjcmxfc2NvcmUpKQorCQkJeworCQkJaWYgKCFjcmwtPmlkcCB8fAorCQkJICAgICBpZHBfY2hlY2tfZHAoZHAtPmRpc3Rwb2ludCwgY3JsLT5pZHAtPmRpc3Rwb2ludCkpCisJCQkJeworCQkJCSpwcmVhc29ucyAmPSBkcC0+ZHBfcmVhc29uczsKKwkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCX0KKwlpZiAoKCFjcmwtPmlkcCB8fCAhY3JsLT5pZHAtPmRpc3Rwb2ludCkgJiYgKGNybF9zY29yZSAmIENSTF9TQ09SRV9JU1NVRVJfTkFNRSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworCX0KKworLyogUmV0cmlldmUgQ1JMIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCBjZXJ0aWZpY2F0ZS4KKyAqIElmIGRlbHRhcyBlbmFibGVkIHRyeSB0byBmaW5kIGEgZGVsdGEgQ1JMIHRvbworICovCisJCitzdGF0aWMgaW50IGdldF9jcmxfZGVsdGEoWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCQlYNTA5X0NSTCAqKnBjcmwsIFg1MDlfQ1JMICoqcGRjcmwsIFg1MDkgKngpCisJeworCWludCBvazsKKwlYNTA5ICppc3N1ZXIgPSBOVUxMOworCWludCBjcmxfc2NvcmUgPSAwOworCXVuc2lnbmVkIGludCByZWFzb25zOworCVg1MDlfQ1JMICpjcmwgPSBOVUxMLCAqZGNybCA9IE5VTEw7CisJU1RBQ0tfT0YoWDUwOV9DUkwpICpza2NybDsKKwlYNTA5X05BTUUgKm5tID0gWDUwOV9nZXRfaXNzdWVyX25hbWUoeCk7CisJcmVhc29ucyA9IGN0eC0+Y3VycmVudF9yZWFzb25zOworCW9rID0gZ2V0X2NybF9zayhjdHgsICZjcmwsICZkY3JsLCAKKwkJCQkmaXNzdWVyLCAmY3JsX3Njb3JlLCAmcmVhc29ucywgY3R4LT5jcmxzKTsKKworCWlmIChvaykKKwkJZ290byBkb25lOworCisJLyogTG9va3VwIENSTHMgZnJvbSBzdG9yZSAqLworCisJc2tjcmwgPSBjdHgtPmxvb2t1cF9jcmxzKGN0eCwgbm0pOworCisJLyogSWYgbm8gQ1JMcyBmb3VuZCBhbmQgYSBuZWFyIG1hdGNoIGZyb20gZ2V0X2NybF9zayB1c2UgdGhhdCAqLworCWlmICghc2tjcmwgJiYgY3JsKQorCQlnb3RvIGRvbmU7CisKKwlnZXRfY3JsX3NrKGN0eCwgJmNybCwgJmRjcmwsICZpc3N1ZXIsICZjcmxfc2NvcmUsICZyZWFzb25zLCBza2NybCk7CisKKwlza19YNTA5X0NSTF9wb3BfZnJlZShza2NybCwgWDUwOV9DUkxfZnJlZSk7CisKKwlkb25lOgorCisJLyogSWYgd2UgZ290IGFueSBraW5kIG9mIENSTCB1c2UgaXQgYW5kIHJldHVybiBzdWNjZXNzICovCisJaWYgKGNybCkKKwkJeworCQljdHgtPmN1cnJlbnRfaXNzdWVyID0gaXNzdWVyOworCQljdHgtPmN1cnJlbnRfY3JsX3Njb3JlID0gY3JsX3Njb3JlOworCQljdHgtPmN1cnJlbnRfcmVhc29ucyA9IHJlYXNvbnM7CisJCSpwY3JsID0gY3JsOworCQkqcGRjcmwgPSBkY3JsOworCQlyZXR1cm4gMTsKKwkJfQorCisJcmV0dXJuIDA7CisJfQorCisvKiBDaGVjayBDUkwgdmFsaWRpdHkgKi8KK3N0YXRpYyBpbnQgY2hlY2tfY3JsKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwpCisJeworCVg1MDkgKmlzc3VlciA9IE5VTEw7CisJRVZQX1BLRVkgKmlrZXkgPSBOVUxMOworCWludCBvayA9IDAsIGNobnVtLCBjbnVtOworCWNudW0gPSBjdHgtPmVycm9yX2RlcHRoOworCWNobnVtID0gc2tfWDUwOV9udW0oY3R4LT5jaGFpbikgLSAxOworCS8qIGlmIHdlIGhhdmUgYW4gYWx0ZXJuYXRpdmUgQ1JMIGlzc3VlciBjZXJ0IHVzZSB0aGF0ICovCisJaWYgKGN0eC0+Y3VycmVudF9pc3N1ZXIpCisJCWlzc3VlciA9IGN0eC0+Y3VycmVudF9pc3N1ZXI7CisKKwkvKiBFbHNlIGZpbmQgQ1JMIGlzc3VlcjogaWYgbm90IGxhc3QgY2VydGlmaWNhdGUgdGhlbiBpc3N1ZXIKKwkgKiBpcyBuZXh0IGNlcnRpZmljYXRlIGluIGNoYWluLgorCSAqLworCWVsc2UgaWYgKGNudW0gPCBjaG51bSkKKwkJaXNzdWVyID0gc2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLCBjbnVtICsgMSk7CisJZWxzZQorCQl7CisJCWlzc3VlciA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgY2hudW0pOworCQkvKiBJZiBub3Qgc2VsZiBzaWduZWQsIGNhbid0IGNoZWNrIHNpZ25hdHVyZSAqLworCQlpZighY3R4LT5jaGVja19pc3N1ZWQoY3R4LCBpc3N1ZXIsIGlzc3VlcikpCisJCQl7CisJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTF9JU1NVRVI7CisJCQlvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJCQlpZighb2spIGdvdG8gZXJyOworCQkJfQorCQl9CisKKwlpZihpc3N1ZXIpCisJCXsKKwkJLyogU2tpcCBtb3N0IHRlc3RzIGZvciBkZWx0YXMgYmVjYXVzZSB0aGV5IGhhdmUgYWxyZWFkeQorCQkgKiBiZWVuIGRvbmUKKwkJICovCisJCWlmICghY3JsLT5iYXNlX2NybF9udW1iZXIpCisJCQl7CisJCQkvKiBDaGVjayBmb3IgY1JMU2lnbiBiaXQgaWYga2V5VXNhZ2UgcHJlc2VudCAqLworCQkJaWYgKChpc3N1ZXItPmV4X2ZsYWdzICYgRVhGTEFHX0tVU0FHRSkgJiYKKwkJCQkhKGlzc3Vlci0+ZXhfa3VzYWdlICYgS1VfQ1JMX1NJR04pKQorCQkJCXsKKwkJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19DUkxfU0lHTjsKKwkJCQlvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJCQkJaWYoIW9rKSBnb3RvIGVycjsKKwkJCQl9CisKKwkJCWlmICghKGN0eC0+Y3VycmVudF9jcmxfc2NvcmUgJiBDUkxfU0NPUkVfU0NPUEUpKQorCQkJCXsKKwkJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9ESUZGRVJFTlRfQ1JMX1NDT1BFOworCQkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCQlpZighb2spIGdvdG8gZXJyOworCQkJCX0KKworCQkJaWYgKCEoY3R4LT5jdXJyZW50X2NybF9zY29yZSAmIENSTF9TQ09SRV9TQU1FX1BBVEgpKQorCQkJCXsKKwkJCQlpZiAoY2hlY2tfY3JsX3BhdGgoY3R4LCBjdHgtPmN1cnJlbnRfaXNzdWVyKSA8PSAwKQorCQkJCQl7CisJCQkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NSTF9QQVRIX1ZBTElEQVRJT05fRVJST1I7CisJCQkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCQkJaWYoIW9rKSBnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKworCQkJaWYgKGNybC0+aWRwX2ZsYWdzICYgSURQX0lOVkFMSUQpCisJCQkJeworCQkJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0lOVkFMSURfRVhURU5TSU9OOworCQkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCQlpZighb2spIGdvdG8gZXJyOworCQkJCX0KKworCisJCQl9CisKKwkJaWYgKCEoY3R4LT5jdXJyZW50X2NybF9zY29yZSAmIENSTF9TQ09SRV9USU1FKSkKKwkJCXsKKwkJCW9rID0gY2hlY2tfY3JsX3RpbWUoY3R4LCBjcmwsIDEpOworCQkJaWYgKCFvaykKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBBdHRlbXB0IHRvIGdldCBpc3N1ZXIgY2VydGlmaWNhdGUgcHVibGljIGtleSAqLworCQlpa2V5ID0gWDUwOV9nZXRfcHVia2V5KGlzc3Vlcik7CisKKwkJaWYoIWlrZXkpCisJCQl7CisJCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWTsKKwkJCW9rID0gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJCWlmICghb2spIGdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQkvKiBWZXJpZnkgQ1JMIHNpZ25hdHVyZSAqLworCQkJaWYoWDUwOV9DUkxfdmVyaWZ5KGNybCwgaWtleSkgPD0gMCkKKwkJCQl7CisJCQkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0NSTF9TSUdOQVRVUkVfRkFJTFVSRTsKKwkJCQlvayA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CisJCQkJaWYgKCFvaykgZ290byBlcnI7CisJCQkJfQorCQkJfQorCQl9CisKKwlvayA9IDE7CisKKwllcnI6CisJRVZQX1BLRVlfZnJlZShpa2V5KTsKKwlyZXR1cm4gb2s7CisJfQorCisvKiBDaGVjayBjZXJ0aWZpY2F0ZSBhZ2FpbnN0IENSTCAqLworc3RhdGljIGludCBjZXJ0X2NybChYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsLCBYNTA5ICp4KQorCXsKKwlpbnQgb2s7CisJWDUwOV9SRVZPS0VEICpyZXY7CisJLyogVGhlIHJ1bGVzIGNoYW5nZWQgZm9yIHRoaXMuLi4gcHJldmlvdXNseSBpZiBhIENSTCBjb250YWluZWQKKwkgKiB1bmhhbmRsZWQgY3JpdGljYWwgZXh0ZW5zaW9ucyBpdCBjb3VsZCBzdGlsbCBiZSB1c2VkIHRvIGluZGljYXRlCisJICogYSBjZXJ0aWZpY2F0ZSB3YXMgcmV2b2tlZC4gVGhpcyBoYXMgc2luY2UgYmVlbiBjaGFuZ2VkIHNpbmNlIAorCSAqIGNyaXRpY2FsIGV4dGVuc2lvbiBjYW4gY2hhbmdlIHRoZSBtZWFuaW5nIG9mIENSTCBlbnRyaWVzLgorCSAqLworCWlmIChjcmwtPmZsYWdzICYgRVhGTEFHX0NSSVRJQ0FMKQorCQl7CisJCWlmIChjdHgtPnBhcmFtLT5mbGFncyAmIFg1MDlfVl9GTEFHX0lHTk9SRV9DUklUSUNBTCkKKwkJCXJldHVybiAxOworCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9VTkhBTkRMRURfQ1JJVElDQUxfQ1JMX0VYVEVOU0lPTjsKKwkJb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworCQlpZighb2spCisJCQlyZXR1cm4gMDsKKwkJfQorCS8qIExvb2sgZm9yIHNlcmlhbCBudW1iZXIgb2YgY2VydGlmaWNhdGUgaW4gQ1JMCisJICogSWYgZm91bmQgbWFrZSBzdXJlIHJlYXNvbiBpcyBub3QgcmVtb3ZlRnJvbUNSTC4KKwkgKi8KKwlpZiAoWDUwOV9DUkxfZ2V0MF9ieV9jZXJ0KGNybCwgJnJldiwgeCkpCisJCXsKKwkJaWYgKHJldi0+cmVhc29uID09IENSTF9SRUFTT05fUkVNT1ZFX0ZST01fQ1JMKQorCQkJcmV0dXJuIDI7CisJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfRVJSX0NFUlRfUkVWT0tFRDsKKwkJb2sgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOworCQlpZiAoIW9rKQorCQkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBjaGVja19wb2xpY3koWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJaW50IHJldDsKKwlpZiAoY3R4LT5wYXJlbnQpCisJCXJldHVybiAxOworCXJldCA9IFg1MDlfcG9saWN5X2NoZWNrKCZjdHgtPnRyZWUsICZjdHgtPmV4cGxpY2l0X3BvbGljeSwgY3R4LT5jaGFpbiwKKwkJCQljdHgtPnBhcmFtLT5wb2xpY2llcywgY3R4LT5wYXJhbS0+ZmxhZ3MpOworCWlmIChyZXQgPT0gMCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9DSEVDS19QT0xJQ1ksRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCS8qIEludmFsaWQgb3IgaW5jb25zaXN0ZW50IGV4dGVuc2lvbnMgKi8KKwlpZiAocmV0ID09IC0xKQorCQl7CisJCS8qIExvY2F0ZSBjZXJ0aWZpY2F0ZXMgd2l0aCBiYWQgZXh0ZW5zaW9ucyBhbmQgbm90aWZ5CisJCSAqIGNhbGxiYWNrLgorCQkgKi8KKwkJWDUwOSAqeDsKKwkJaW50IGk7CisJCWZvciAoaSA9IDE7IGkgPCBza19YNTA5X251bShjdHgtPmNoYWluKTsgaSsrKQorCQkJeworCQkJeCA9IHNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbiwgaSk7CisJCQlpZiAoISh4LT5leF9mbGFncyAmIEVYRkxBR19JTlZBTElEX1BPTElDWSkpCisJCQkJY29udGludWU7CisJCQljdHgtPmN1cnJlbnRfY2VydCA9IHg7CisJCQljdHgtPmVycm9yID0gWDUwOV9WX0VSUl9JTlZBTElEX1BPTElDWV9FWFRFTlNJT047CisJCQlpZighY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJcmV0dXJuIDE7CisJCX0KKwlpZiAocmV0ID09IC0yKQorCQl7CisJCWN0eC0+Y3VycmVudF9jZXJ0ID0gTlVMTDsKKwkJY3R4LT5lcnJvciA9IFg1MDlfVl9FUlJfTk9fRVhQTElDSVRfUE9MSUNZOworCQlyZXR1cm4gY3R4LT52ZXJpZnlfY2IoMCwgY3R4KTsKKwkJfQorCisJaWYgKGN0eC0+cGFyYW0tPmZsYWdzICYgWDUwOV9WX0ZMQUdfTk9USUZZX1BPTElDWSkKKwkJeworCQljdHgtPmN1cnJlbnRfY2VydCA9IE5VTEw7CisJCWN0eC0+ZXJyb3IgPSBYNTA5X1ZfT0s7CisJCWlmICghY3R4LT52ZXJpZnlfY2IoMiwgY3R4KSkKKwkJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgY2hlY2tfY2VydF90aW1lKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpCisJeworCXRpbWVfdCAqcHRpbWU7CisJaW50IGk7CisKKwlpZiAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19VU0VfQ0hFQ0tfVElNRSkKKwkJcHRpbWUgPSAmY3R4LT5wYXJhbS0+Y2hlY2tfdGltZTsKKwllbHNlCisJCXB0aW1lID0gTlVMTDsKKworCWk9WDUwOV9jbXBfdGltZShYNTA5X2dldF9ub3RCZWZvcmUoeCksIHB0aW1lKTsKKwlpZiAoaSA9PSAwKQorCQl7CisJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9CRUZPUkVfRklFTEQ7CisJCWN0eC0+Y3VycmVudF9jZXJ0PXg7CisJCWlmICghY3R4LT52ZXJpZnlfY2IoMCwgY3R4KSkKKwkJCXJldHVybiAwOworCQl9CisKKwlpZiAoaSA+IDApCisJCXsKKwkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0NFUlRfTk9UX1lFVF9WQUxJRDsKKwkJY3R4LT5jdXJyZW50X2NlcnQ9eDsKKwkJaWYgKCFjdHgtPnZlcmlmeV9jYigwLCBjdHgpKQorCQkJcmV0dXJuIDA7CisJCX0KKworCWk9WDUwOV9jbXBfdGltZShYNTA5X2dldF9ub3RBZnRlcih4KSwgcHRpbWUpOworCWlmIChpID09IDApCisJCXsKKwkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0FGVEVSX0ZJRUxEOworCQljdHgtPmN1cnJlbnRfY2VydD14OworCQlpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJaWYgKGkgPCAwKQorCQl7CisJCWN0eC0+ZXJyb3I9WDUwOV9WX0VSUl9DRVJUX0hBU19FWFBJUkVEOworCQljdHgtPmN1cnJlbnRfY2VydD14OworCQlpZiAoIWN0eC0+dmVyaWZ5X2NiKDAsIGN0eCkpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGludGVybmFsX3ZlcmlmeShYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlpbnQgb2s9MCxuOworCVg1MDkgKnhzLCp4aTsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCWludCAoKmNiKShpbnQgeG9rLFg1MDlfU1RPUkVfQ1RYICp4Y3R4KTsKKworCWNiPWN0eC0+dmVyaWZ5X2NiOworCisJbj1za19YNTA5X251bShjdHgtPmNoYWluKTsKKwljdHgtPmVycm9yX2RlcHRoPW4tMTsKKwluLS07CisJeGk9c2tfWDUwOV92YWx1ZShjdHgtPmNoYWluLG4pOworCisJaWYgKGN0eC0+Y2hlY2tfaXNzdWVkKGN0eCwgeGksIHhpKSkKKwkJeHM9eGk7CisJZWxzZQorCQl7CisJCWlmIChuIDw9IDApCisJCQl7CisJCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRTsKKwkJCWN0eC0+Y3VycmVudF9jZXJ0PXhpOworCQkJb2s9Y2IoMCxjdHgpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW4tLTsKKwkJCWN0eC0+ZXJyb3JfZGVwdGg9bjsKKwkJCXhzPXNrX1g1MDlfdmFsdWUoY3R4LT5jaGFpbixuKTsKKwkJCX0KKwkJfQorCisvKgljdHgtPmVycm9yPTA7ICBub3QgbmVlZGVkICovCisJd2hpbGUgKG4gPj0gMCkKKwkJeworCQljdHgtPmVycm9yX2RlcHRoPW47CisKKwkJLyogU2tpcCBzaWduYXR1cmUgY2hlY2sgZm9yIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlcyB1bmxlc3MKKwkJICogZXhwbGljaXRseSBhc2tlZCBmb3IuIEl0IGRvZXNuJ3QgYWRkIGFueSBzZWN1cml0eSBhbmQKKwkJICoganVzdCB3YXN0ZXMgdGltZS4KKwkJICovCisJCWlmICgheHMtPnZhbGlkICYmICh4cyAhPSB4aSB8fCAoY3R4LT5wYXJhbS0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19DSEVDS19TU19TSUdOQVRVUkUpKSkKKwkJCXsKKwkJCWlmICgocGtleT1YNTA5X2dldF9wdWJrZXkoeGkpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQljdHgtPmVycm9yPVg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWTsKKwkJCQljdHgtPmN1cnJlbnRfY2VydD14aTsKKwkJCQlvaz0oKmNiKSgwLGN0eCk7CisJCQkJaWYgKCFvaykgZ290byBlbmQ7CisJCQkJfQorCQkJZWxzZSBpZiAoWDUwOV92ZXJpZnkoeHMscGtleSkgPD0gMCkKKwkJCQl7CisJCQkJY3R4LT5lcnJvcj1YNTA5X1ZfRVJSX0NFUlRfU0lHTkFUVVJFX0ZBSUxVUkU7CisJCQkJY3R4LT5jdXJyZW50X2NlcnQ9eHM7CisJCQkJb2s9KCpjYikoMCxjdHgpOworCQkJCWlmICghb2spCisJCQkJCXsKKwkJCQkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQl9CisJCQlFVlBfUEtFWV9mcmVlKHBrZXkpOworCQkJcGtleT1OVUxMOworCQkJfQorCisJCXhzLT52YWxpZCA9IDE7CisKKwkJb2sgPSBjaGVja19jZXJ0X3RpbWUoY3R4LCB4cyk7CisJCWlmICghb2spCisJCQlnb3RvIGVuZDsKKworCQkvKiBUaGUgbGFzdCBlcnJvciAoaWYgYW55KSBpcyBzdGlsbCBpbiB0aGUgZXJyb3IgdmFsdWUgKi8KKwkJY3R4LT5jdXJyZW50X2lzc3Vlcj14aTsKKwkJY3R4LT5jdXJyZW50X2NlcnQ9eHM7CisJCW9rPSgqY2IpKDEsY3R4KTsKKwkJaWYgKCFvaykgZ290byBlbmQ7CisKKwkJbi0tOworCQlpZiAobiA+PSAwKQorCQkJeworCQkJeGk9eHM7CisJCQl4cz1za19YNTA5X3ZhbHVlKGN0eC0+Y2hhaW4sbik7CisJCQl9CisJCX0KKwlvaz0xOworZW5kOgorCXJldHVybiBvazsKKwl9CisKK2ludCBYNTA5X2NtcF9jdXJyZW50X3RpbWUoY29uc3QgQVNOMV9USU1FICpjdG0pCit7CisJcmV0dXJuIFg1MDlfY21wX3RpbWUoY3RtLCBOVUxMKTsKK30KKworaW50IFg1MDlfY21wX3RpbWUoY29uc3QgQVNOMV9USU1FICpjdG0sIHRpbWVfdCAqY21wX3RpbWUpCisJeworCWNoYXIgKnN0cjsKKwlBU04xX1RJTUUgYXRtOworCWxvbmcgb2Zmc2V0OworCWNoYXIgYnVmZjFbMjRdLGJ1ZmYyWzI0XSwqcDsKKwlpbnQgaSxqOworCisJcD1idWZmMTsKKwlpPWN0bS0+bGVuZ3RoOworCXN0cj0oY2hhciAqKWN0bS0+ZGF0YTsKKwlpZiAoY3RtLT50eXBlID09IFZfQVNOMV9VVENUSU1FKQorCQl7CisJCWlmICgoaSA8IDExKSB8fCAoaSA+IDE3KSkgcmV0dXJuIDA7CisJCW1lbWNweShwLHN0ciwxMCk7CisJCXArPTEwOworCQlzdHIrPTEwOworCQl9CisJZWxzZQorCQl7CisJCWlmIChpIDwgMTMpIHJldHVybiAwOworCQltZW1jcHkocCxzdHIsMTIpOworCQlwKz0xMjsKKwkJc3RyKz0xMjsKKwkJfQorCisJaWYgKCgqc3RyID09ICdaJykgfHwgKCpzdHIgPT0gJy0nKSB8fCAoKnN0ciA9PSAnKycpKQorCQl7ICoocCsrKT0nMCc7ICoocCsrKT0nMCc7IH0KKwllbHNlCisJCXsgCisJCSoocCsrKT0gKihzdHIrKyk7CisJCSoocCsrKT0gKihzdHIrKyk7CisJCS8qIFNraXAgYW55IGZyYWN0aW9uYWwgc2Vjb25kcy4uLiAqLworCQlpZiAoKnN0ciA9PSAnLicpCisJCQl7CisJCQlzdHIrKzsKKwkJCXdoaWxlICgoKnN0ciA+PSAnMCcpICYmICgqc3RyIDw9ICc5JykpIHN0cisrOworCQkJfQorCQkKKwkJfQorCSoocCsrKT0nWic7CisJKihwKyspPSdcMCc7CisKKwlpZiAoKnN0ciA9PSAnWicpCisJCW9mZnNldD0wOworCWVsc2UKKwkJeworCQlpZiAoKCpzdHIgIT0gJysnKSAmJiAoKnN0ciAhPSAnLScpKQorCQkJcmV0dXJuIDA7CisJCW9mZnNldD0oKHN0clsxXS0nMCcpKjEwKyhzdHJbMl0tJzAnKSkqNjA7CisJCW9mZnNldCs9KHN0clszXS0nMCcpKjEwKyhzdHJbNF0tJzAnKTsKKwkJaWYgKCpzdHIgPT0gJy0nKQorCQkJb2Zmc2V0PSAtb2Zmc2V0OworCQl9CisJYXRtLnR5cGU9Y3RtLT50eXBlOworCWF0bS5mbGFncyA9IDA7CisJYXRtLmxlbmd0aD1zaXplb2YoYnVmZjIpOworCWF0bS5kYXRhPSh1bnNpZ25lZCBjaGFyICopYnVmZjI7CisKKwlpZiAoWDUwOV90aW1lX2FkaigmYXRtLC1vZmZzZXQqNjAsIGNtcF90aW1lKSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmIChjdG0tPnR5cGUgPT0gVl9BU04xX1VUQ1RJTUUpCisJCXsKKwkJaT0oYnVmZjFbMF0tJzAnKSoxMCsoYnVmZjFbMV0tJzAnKTsKKwkJaWYgKGkgPCA1MCkgaSs9MTAwOyAvKiBjZi4gUkZDIDI0NTkgKi8KKwkJaj0oYnVmZjJbMF0tJzAnKSoxMCsoYnVmZjJbMV0tJzAnKTsKKwkJaWYgKGogPCA1MCkgais9MTAwOworCisJCWlmIChpIDwgaikgcmV0dXJuIC0xOworCQlpZiAoaSA+IGopIHJldHVybiAxOworCQl9CisJaT1zdHJjbXAoYnVmZjEsYnVmZjIpOworCWlmIChpID09IDApIC8qIHdhaXQgYSBzZWNvbmQgdGhlbiByZXR1cm4geW91bmdlciA6LSkgKi8KKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIGk7CisJfQorCitBU04xX1RJTUUgKlg1MDlfZ210aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgYWRqKQoreworCXJldHVybiBYNTA5X3RpbWVfYWRqKHMsIGFkaiwgTlVMTCk7Cit9CisKK0FTTjFfVElNRSAqWDUwOV90aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgb2Zmc2V0X3NlYywgdGltZV90ICppbl90bSkKKwl7CisJcmV0dXJuIFg1MDlfdGltZV9hZGpfZXgocywgMCwgb2Zmc2V0X3NlYywgaW5fdG0pOworCX0KKworQVNOMV9USU1FICpYNTA5X3RpbWVfYWRqX2V4KEFTTjFfVElNRSAqcywKKwkJCQlpbnQgb2Zmc2V0X2RheSwgbG9uZyBvZmZzZXRfc2VjLCB0aW1lX3QgKmluX3RtKQorCXsKKwl0aW1lX3QgdDsKKworCWlmIChpbl90bSkgdCA9ICppbl90bTsKKwllbHNlIHRpbWUoJnQpOworCisJaWYgKHMgJiYgIShzLT5mbGFncyAmIEFTTjFfU1RSSU5HX0ZMQUdfTVNUUklORykpCisJCXsKKwkJaWYgKHMtPnR5cGUgPT0gVl9BU04xX1VUQ1RJTUUpCisJCQlyZXR1cm4gQVNOMV9VVENUSU1FX2FkaihzLHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOworCQlpZiAocy0+dHlwZSA9PSBWX0FTTjFfR0VORVJBTElaRURUSU1FKQorCQkJcmV0dXJuIEFTTjFfR0VORVJBTElaRURUSU1FX2FkaihzLCB0LCBvZmZzZXRfZGF5LAorCQkJCQkJCQlvZmZzZXRfc2VjKTsKKwkJfQorCXJldHVybiBBU04xX1RJTUVfYWRqKHMsIHQsIG9mZnNldF9kYXksIG9mZnNldF9zZWMpOworCX0KKworaW50IFg1MDlfZ2V0X3B1YmtleV9wYXJhbWV0ZXJzKEVWUF9QS0VZICpwa2V5LCBTVEFDS19PRihYNTA5KSAqY2hhaW4pCisJeworCUVWUF9QS0VZICprdG1wPU5VTEwsKmt0bXAyOworCWludCBpLGo7CisKKwlpZiAoKHBrZXkgIT0gTlVMTCkgJiYgIUVWUF9QS0VZX21pc3NpbmdfcGFyYW1ldGVycyhwa2V5KSkgcmV0dXJuIDE7CisKKwlmb3IgKGk9MDsgaTxza19YNTA5X251bShjaGFpbik7IGkrKykKKwkJeworCQlrdG1wPVg1MDlfZ2V0X3B1YmtleShza19YNTA5X3ZhbHVlKGNoYWluLGkpKTsKKwkJaWYgKGt0bXAgPT0gTlVMTCkKKwkJCXsKKwkJCVg1MDllcnIoWDUwOV9GX1g1MDlfR0VUX1BVQktFWV9QQVJBTUVURVJTLFg1MDlfUl9VTkFCTEVfVE9fR0VUX0NFUlRTX1BVQkxJQ19LRVkpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmICghRVZQX1BLRVlfbWlzc2luZ19wYXJhbWV0ZXJzKGt0bXApKQorCQkJYnJlYWs7CisJCWVsc2UKKwkJCXsKKwkJCUVWUF9QS0VZX2ZyZWUoa3RtcCk7CisJCQlrdG1wPU5VTEw7CisJCQl9CisJCX0KKwlpZiAoa3RtcCA9PSBOVUxMKQorCQl7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfR0VUX1BVQktFWV9QQVJBTUVURVJTLFg1MDlfUl9VTkFCTEVfVE9fRklORF9QQVJBTUVURVJTX0lOX0NIQUlOKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCS8qIGZpcnN0LCBwb3B1bGF0ZSB0aGUgb3RoZXIgY2VydHMgKi8KKwlmb3IgKGo9aS0xOyBqID49IDA7IGotLSkKKwkJeworCQlrdG1wMj1YNTA5X2dldF9wdWJrZXkoc2tfWDUwOV92YWx1ZShjaGFpbixqKSk7CisJCUVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhrdG1wMixrdG1wKTsKKwkJRVZQX1BLRVlfZnJlZShrdG1wMik7CisJCX0KKwkKKwlpZiAocGtleSAhPSBOVUxMKSBFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMocGtleSxrdG1wKTsKKwlFVlBfUEtFWV9mcmVlKGt0bXApOworCXJldHVybiAxOworCX0KKworaW50IFg1MDlfU1RPUkVfQ1RYX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKQorCXsKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzICh1c3VhbGx5KSBjYWxsZWQgb25seSBvbmNlLCBieQorCSAqIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHggKHNzbC9zc2xfY2VydC5jKS4gKi8KKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX1g1MDlfU1RPUkVfQ1RYLCBhcmdsLCBhcmdwLAorCQkJbmV3X2Z1bmMsIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworCX0KKworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF9leF9kYXRhKFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBpZHgsIHZvaWQgKmRhdGEpCisJeworCXJldHVybiBDUllQVE9fc2V0X2V4X2RhdGEoJmN0eC0+ZXhfZGF0YSxpZHgsZGF0YSk7CisJfQorCit2b2lkICpYNTA5X1NUT1JFX0NUWF9nZXRfZXhfZGF0YShYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgaWR4KQorCXsKKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9kYXRhKCZjdHgtPmV4X2RhdGEsaWR4KTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3IoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+ZXJyb3I7CisJfQorCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9lcnJvcihYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgZXJyKQorCXsKKwljdHgtPmVycm9yPWVycjsKKwl9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXJyb3JfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+ZXJyb3JfZGVwdGg7CisJfQorCitYNTA5ICpYNTA5X1NUT1JFX0NUWF9nZXRfY3VycmVudF9jZXJ0KFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPmN1cnJlbnRfY2VydDsKKwl9CisKK1NUQUNLX09GKFg1MDkpICpYNTA5X1NUT1JFX0NUWF9nZXRfY2hhaW4oWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+Y2hhaW47CisJfQorCitTVEFDS19PRihYNTA5KSAqWDUwOV9TVE9SRV9DVFhfZ2V0MV9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4KQorCXsKKwlpbnQgaTsKKwlYNTA5ICp4OworCVNUQUNLX09GKFg1MDkpICpjaGFpbjsKKwlpZiAoIWN0eC0+Y2hhaW4gfHwgIShjaGFpbiA9IHNrX1g1MDlfZHVwKGN0eC0+Y2hhaW4pKSkgcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfbnVtKGNoYWluKTsgaSsrKQorCQl7CisJCXggPSBza19YNTA5X3ZhbHVlKGNoYWluLCBpKTsKKwkJQ1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywgMSwgQ1JZUFRPX0xPQ0tfWDUwOSk7CisJCX0KKwlyZXR1cm4gY2hhaW47CisJfQorCitYNTA5ICpYNTA5X1NUT1JFX0NUWF9nZXQwX2N1cnJlbnRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPmN1cnJlbnRfaXNzdWVyOworCX0KKworWDUwOV9DUkwgKlg1MDlfU1RPUkVfQ1RYX2dldDBfY3VycmVudF9jcmwoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+Y3VycmVudF9jcmw7CisJfQorCitYNTA5X1NUT1JFX0NUWCAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wYXJlbnRfY3R4KFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPnBhcmVudDsKKwl9CisKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCkKKwl7CisJY3R4LT5jZXJ0PXg7CisJfQorCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4LCBTVEFDS19PRihYNTA5KSAqc2spCisJeworCWN0eC0+dW50cnVzdGVkPXNrOworCX0KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXQwX2NybHMoWDUwOV9TVE9SRV9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOV9DUkwpICpzaykKKwl7CisJY3R4LT5jcmxzPXNrOworCX0KKworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF9wdXJwb3NlKFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBwdXJwb3NlKQorCXsKKwlyZXR1cm4gWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KGN0eCwgMCwgcHVycG9zZSwgMCk7CisJfQorCitpbnQgWDUwOV9TVE9SRV9DVFhfc2V0X3RydXN0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCB0cnVzdCkKKwl7CisJcmV0dXJuIFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdChjdHgsIDAsIDAsIHRydXN0KTsKKwl9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdGhlIFg1MDlfU1RPUkVfQ1RYIHB1cnBvc2UgYW5kIHRydXN0CisgKiB2YWx1ZXMuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aGVuIGFub3RoZXIgc3RydWN0dXJlIGhhcyBpdHMKKyAqIG93biB0cnVzdCBhbmQgcHVycG9zZSB2YWx1ZXMgd2hpY2ggKGlmIHNldCkgd2lsbCBiZSBpbmhlcml0ZWQgYnkKKyAqIHRoZSBjdHguIElmIHRoZXkgYXJlbid0IHNldCB0aGVuIHdlIHdpbGwgdXN1YWxseSBoYXZlIGEgZGVmYXVsdAorICogcHVycG9zZSBpbiBtaW5kIHdoaWNoIHNob3VsZCB0aGVuIGJlIHVzZWQgdG8gc2V0IHRoZSB0cnVzdCB2YWx1ZS4KKyAqIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBTU0wgdXNlOiBhbiBTU0wgc3RydWN0dXJlIHdpbGwgaGF2ZSBpdHMgb3duCisgKiBwdXJwb3NlIGFuZCB0cnVzdCBzZXR0aW5ncyB3aGljaCB0aGUgYXBwbGljYXRpb24gY2FuIHNldDogaWYgdGhleQorICogYXJlbid0IHNldCB0aGVuIHdlIHVzZSB0aGUgZGVmYXVsdCBvZiBTU0wgY2xpZW50L3NlcnZlci4KKyAqLworCitpbnQgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBkZWZfcHVycG9zZSwKKwkJCQlpbnQgcHVycG9zZSwgaW50IHRydXN0KQoreworCWludCBpZHg7CisJLyogSWYgcHVycG9zZSBub3Qgc2V0IHVzZSBkZWZhdWx0ICovCisJaWYgKCFwdXJwb3NlKSBwdXJwb3NlID0gZGVmX3B1cnBvc2U7CisJLyogSWYgd2UgaGF2ZSBhIHB1cnBvc2UgdGhlbiBjaGVjayBpdCBpcyB2YWxpZCAqLworCWlmIChwdXJwb3NlKQorCQl7CisJCVg1MDlfUFVSUE9TRSAqcHRtcDsKKwkJaWR4ID0gWDUwOV9QVVJQT1NFX2dldF9ieV9pZChwdXJwb3NlKTsKKwkJaWYgKGlkeCA9PSAtMSkKKwkJCXsKKwkJCVg1MDllcnIoWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX1BVUlBPU0VfSU5IRVJJVCwKKwkJCQkJCVg1MDlfUl9VTktOT1dOX1BVUlBPU0VfSUQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCXB0bXAgPSBYNTA5X1BVUlBPU0VfZ2V0MChpZHgpOworCQlpZiAocHRtcC0+dHJ1c3QgPT0gWDUwOV9UUlVTVF9ERUZBVUxUKQorCQkJeworCQkJaWR4ID0gWDUwOV9QVVJQT1NFX2dldF9ieV9pZChkZWZfcHVycG9zZSk7CisJCQlpZiAoaWR4ID09IC0xKQorCQkJCXsKKwkJCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9QVVJQT1NFX0lOSEVSSVQsCisJCQkJCQlYNTA5X1JfVU5LTk9XTl9QVVJQT1NFX0lEKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlwdG1wID0gWDUwOV9QVVJQT1NFX2dldDAoaWR4KTsKKwkJCX0KKwkJLyogSWYgdHJ1c3Qgbm90IHNldCB0aGVuIGdldCBmcm9tIHB1cnBvc2UgZGVmYXVsdCAqLworCQlpZiAoIXRydXN0KSB0cnVzdCA9IHB0bXAtPnRydXN0OworCQl9CisJaWYgKHRydXN0KQorCQl7CisJCWlkeCA9IFg1MDlfVFJVU1RfZ2V0X2J5X2lkKHRydXN0KTsKKwkJaWYgKGlkeCA9PSAtMSkKKwkJCXsKKwkJCVg1MDllcnIoWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX1BVUlBPU0VfSU5IRVJJVCwKKwkJCQkJCVg1MDlfUl9VTktOT1dOX1RSVVNUX0lEKTsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwlpZiAocHVycG9zZSAmJiAhY3R4LT5wYXJhbS0+cHVycG9zZSkgY3R4LT5wYXJhbS0+cHVycG9zZSA9IHB1cnBvc2U7CisJaWYgKHRydXN0ICYmICFjdHgtPnBhcmFtLT50cnVzdCkgY3R4LT5wYXJhbS0+dHJ1c3QgPSB0cnVzdDsKKwlyZXR1cm4gMTsKK30KKworWDUwOV9TVE9SRV9DVFggKlg1MDlfU1RPUkVfQ1RYX25ldyh2b2lkKQoreworCVg1MDlfU1RPUkVfQ1RYICpjdHg7CisJY3R4ID0gKFg1MDlfU1RPUkVfQ1RYICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfU1RPUkVfQ1RYKSk7CisJaWYgKCFjdHgpCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9TVE9SRV9DVFhfTkVXLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwltZW1zZXQoY3R4LCAwLCBzaXplb2YoWDUwOV9TVE9SRV9DVFgpKTsKKwlyZXR1cm4gY3R4OworfQorCit2b2lkIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoWDUwOV9TVE9SRV9DVFggKmN0eCkKK3sKKwlYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKGN0eCk7CisJT1BFTlNTTF9mcmVlKGN0eCk7Cit9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9pbml0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfU1RPUkUgKnN0b3JlLCBYNTA5ICp4NTA5LAorCSAgICAgU1RBQ0tfT0YoWDUwOSkgKmNoYWluKQorCXsKKwlpbnQgcmV0ID0gMTsKKwljdHgtPmN0eD1zdG9yZTsKKwljdHgtPmN1cnJlbnRfbWV0aG9kPTA7CisJY3R4LT5jZXJ0PXg1MDk7CisJY3R4LT51bnRydXN0ZWQ9Y2hhaW47CisJY3R4LT5jcmxzID0gTlVMTDsKKwljdHgtPmxhc3RfdW50cnVzdGVkPTA7CisJY3R4LT5vdGhlcl9jdHg9TlVMTDsKKwljdHgtPnZhbGlkPTA7CisJY3R4LT5jaGFpbj1OVUxMOworCWN0eC0+ZXJyb3I9MDsKKwljdHgtPmV4cGxpY2l0X3BvbGljeT0wOworCWN0eC0+ZXJyb3JfZGVwdGg9MDsKKwljdHgtPmN1cnJlbnRfY2VydD1OVUxMOworCWN0eC0+Y3VycmVudF9pc3N1ZXI9TlVMTDsKKwljdHgtPnRyZWUgPSBOVUxMOworCWN0eC0+cGFyZW50ID0gTlVMTDsKKworCWN0eC0+cGFyYW0gPSBYNTA5X1ZFUklGWV9QQVJBTV9uZXcoKTsKKworCWlmICghY3R4LT5wYXJhbSkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9JTklULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCS8qIEluaGVyaXQgY2FsbGJhY2tzIGFuZCBmbGFncyBmcm9tIFg1MDlfU1RPUkUgaWYgbm90IHNldAorCSAqIHVzZSBkZWZhdWx0cy4KKwkgKi8KKworCisJaWYgKHN0b3JlKQorCQlyZXQgPSBYNTA5X1ZFUklGWV9QQVJBTV9pbmhlcml0KGN0eC0+cGFyYW0sIHN0b3JlLT5wYXJhbSk7CisJZWxzZQorCQljdHgtPnBhcmFtLT5mbGFncyB8PSBYNTA5X1ZQX0ZMQUdfREVGQVVMVHxYNTA5X1ZQX0ZMQUdfT05DRTsKKworCWlmIChzdG9yZSkKKwkJeworCQljdHgtPnZlcmlmeV9jYiA9IHN0b3JlLT52ZXJpZnlfY2I7CisJCWN0eC0+Y2xlYW51cCA9IHN0b3JlLT5jbGVhbnVwOworCQl9CisJZWxzZQorCQljdHgtPmNsZWFudXAgPSAwOworCisJaWYgKHJldCkKKwkJcmV0ID0gWDUwOV9WRVJJRllfUEFSQU1faW5oZXJpdChjdHgtPnBhcmFtLAorCQkJCQlYNTA5X1ZFUklGWV9QQVJBTV9sb29rdXAoImRlZmF1bHQiKSk7CisKKwlpZiAocmV0ID09IDApCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9TVE9SRV9DVFhfSU5JVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoc3RvcmUgJiYgc3RvcmUtPmNoZWNrX2lzc3VlZCkKKwkJY3R4LT5jaGVja19pc3N1ZWQgPSBzdG9yZS0+Y2hlY2tfaXNzdWVkOworCWVsc2UKKwkJY3R4LT5jaGVja19pc3N1ZWQgPSBjaGVja19pc3N1ZWQ7CisKKwlpZiAoc3RvcmUgJiYgc3RvcmUtPmdldF9pc3N1ZXIpCisJCWN0eC0+Z2V0X2lzc3VlciA9IHN0b3JlLT5nZXRfaXNzdWVyOworCWVsc2UKKwkJY3R4LT5nZXRfaXNzdWVyID0gWDUwOV9TVE9SRV9DVFhfZ2V0MV9pc3N1ZXI7CisKKwlpZiAoc3RvcmUgJiYgc3RvcmUtPnZlcmlmeV9jYikKKwkJY3R4LT52ZXJpZnlfY2IgPSBzdG9yZS0+dmVyaWZ5X2NiOworCWVsc2UKKwkJY3R4LT52ZXJpZnlfY2IgPSBudWxsX2NhbGxiYWNrOworCisJaWYgKHN0b3JlICYmIHN0b3JlLT52ZXJpZnkpCisJCWN0eC0+dmVyaWZ5ID0gc3RvcmUtPnZlcmlmeTsKKwllbHNlCisJCWN0eC0+dmVyaWZ5ID0gaW50ZXJuYWxfdmVyaWZ5OworCisJaWYgKHN0b3JlICYmIHN0b3JlLT5jaGVja19yZXZvY2F0aW9uKQorCQljdHgtPmNoZWNrX3Jldm9jYXRpb24gPSBzdG9yZS0+Y2hlY2tfcmV2b2NhdGlvbjsKKwllbHNlCisJCWN0eC0+Y2hlY2tfcmV2b2NhdGlvbiA9IGNoZWNrX3Jldm9jYXRpb247CisKKwlpZiAoc3RvcmUgJiYgc3RvcmUtPmdldF9jcmwpCisJCWN0eC0+Z2V0X2NybCA9IHN0b3JlLT5nZXRfY3JsOworCWVsc2UKKwkJY3R4LT5nZXRfY3JsID0gTlVMTDsKKworCWlmIChzdG9yZSAmJiBzdG9yZS0+Y2hlY2tfY3JsKQorCQljdHgtPmNoZWNrX2NybCA9IHN0b3JlLT5jaGVja19jcmw7CisJZWxzZQorCQljdHgtPmNoZWNrX2NybCA9IGNoZWNrX2NybDsKKworCWlmIChzdG9yZSAmJiBzdG9yZS0+Y2VydF9jcmwpCisJCWN0eC0+Y2VydF9jcmwgPSBzdG9yZS0+Y2VydF9jcmw7CisJZWxzZQorCQljdHgtPmNlcnRfY3JsID0gY2VydF9jcmw7CisKKwlpZiAoc3RvcmUgJiYgc3RvcmUtPmxvb2t1cF9jZXJ0cykKKwkJY3R4LT5sb29rdXBfY2VydHMgPSBzdG9yZS0+bG9va3VwX2NlcnRzOworCWVsc2UKKwkJY3R4LT5sb29rdXBfY2VydHMgPSBYNTA5X1NUT1JFX2dldDFfY2VydHM7CisKKwlpZiAoc3RvcmUgJiYgc3RvcmUtPmxvb2t1cF9jcmxzKQorCQljdHgtPmxvb2t1cF9jcmxzID0gc3RvcmUtPmxvb2t1cF9jcmxzOworCWVsc2UKKwkJY3R4LT5sb29rdXBfY3JscyA9IFg1MDlfU1RPUkVfZ2V0MV9jcmxzOworCisJY3R4LT5jaGVja19wb2xpY3kgPSBjaGVja19wb2xpY3k7CisKKworCS8qIFRoaXMgbWVtc2V0KCkgY2FuJ3QgbWFrZSBhbnkgc2Vuc2UgYW55d2F5LCBzbyBpdCdzIHJlbW92ZWQuIEFzCisJICogWDUwOV9TVE9SRV9DVFhfY2xlYW51cCBkb2VzIGEgcHJvcGVyICJmcmVlIiBvbiB0aGUgZXhfZGF0YSwgd2UgcHV0IGEKKwkgKiBjb3JyZXNwb25kaW5nICJuZXciIGhlcmUgYW5kIHJlbW92ZSB0aGlzIGJvZ3VzIGluaXRpYWxpc2F0aW9uLiAqLworCS8qIG1lbXNldCgmKGN0eC0+ZXhfZGF0YSksMCxzaXplb2YoQ1JZUFRPX0VYX0RBVEEpKTsgKi8KKwlpZighQ1JZUFRPX25ld19leF9kYXRhKENSWVBUT19FWF9JTkRFWF9YNTA5X1NUT1JFX0NUWCwgY3R4LAorCQkJCSYoY3R4LT5leF9kYXRhKSkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGN0eCk7CisJCVg1MDllcnIoWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX0lOSVQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworLyogU2V0IGFsdGVybmF0aXZlIGxvb2t1cCBtZXRob2Q6IGp1c3QgYSBTVEFDSyBvZiB0cnVzdGVkIGNlcnRpZmljYXRlcy4KKyAqIFRoaXMgYXZvaWRzIFg1MDlfU1RPUkUgbmFzdGluZXNzIHdoZXJlIGl0IGlzbid0IG5lZWRlZC4KKyAqLworCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soWDUwOV9TVE9SRV9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOSkgKnNrKQoreworCWN0eC0+b3RoZXJfY3R4ID0gc2s7CisJY3R4LT5nZXRfaXNzdWVyID0gZ2V0X2lzc3Vlcl9zazsKK30KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCWlmIChjdHgtPmNsZWFudXApIGN0eC0+Y2xlYW51cChjdHgpOworCWlmIChjdHgtPnBhcmFtICE9IE5VTEwpCisJCXsKKwkJaWYgKGN0eC0+cGFyZW50ID09IE5VTEwpCisJCQlYNTA5X1ZFUklGWV9QQVJBTV9mcmVlKGN0eC0+cGFyYW0pOworCQljdHgtPnBhcmFtPU5VTEw7CisJCX0KKwlpZiAoY3R4LT50cmVlICE9IE5VTEwpCisJCXsKKwkJWDUwOV9wb2xpY3lfdHJlZV9mcmVlKGN0eC0+dHJlZSk7CisJCWN0eC0+dHJlZT1OVUxMOworCQl9CisJaWYgKGN0eC0+Y2hhaW4gIT0gTlVMTCkKKwkJeworCQlza19YNTA5X3BvcF9mcmVlKGN0eC0+Y2hhaW4sWDUwOV9mcmVlKTsKKwkJY3R4LT5jaGFpbj1OVUxMOworCQl9CisJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfWDUwOV9TVE9SRV9DVFgsIGN0eCwgJihjdHgtPmV4X2RhdGEpKTsKKwltZW1zZXQoJmN0eC0+ZXhfZGF0YSwwLHNpemVvZihDUllQVE9fRVhfREFUQSkpOworCX0KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGRlcHRoKQorCXsKKwlYNTA5X1ZFUklGWV9QQVJBTV9zZXRfZGVwdGgoY3R4LT5wYXJhbSwgZGVwdGgpOworCX0KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZmxhZ3MoWDUwOV9TVE9SRV9DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJWDUwOV9WRVJJRllfUEFSQU1fc2V0X2ZsYWdzKGN0eC0+cGFyYW0sIGZsYWdzKTsKKwl9CisKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X3RpbWUoWDUwOV9TVE9SRV9DVFggKmN0eCwgdW5zaWduZWQgbG9uZyBmbGFncywgdGltZV90IHQpCisJeworCVg1MDlfVkVSSUZZX1BBUkFNX3NldF90aW1lKGN0eC0+cGFyYW0sIHQpOworCX0KKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NiKFg1MDlfU1RPUkVfQ1RYICpjdHgsCisJCQkJICBpbnQgKCp2ZXJpZnlfY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpCisJeworCWN0eC0+dmVyaWZ5X2NiPXZlcmlmeV9jYjsKKwl9CisKK1g1MDlfUE9MSUNZX1RSRUUgKlg1MDlfU1RPUkVfQ1RYX2dldDBfcG9saWN5X3RyZWUoWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+dHJlZTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXhwbGljaXRfcG9saWN5KFg1MDlfU1RPUkVfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPmV4cGxpY2l0X3BvbGljeTsKKwl9CisKK2ludCBYNTA5X1NUT1JFX0NUWF9zZXRfZGVmYXVsdChYNTA5X1NUT1JFX0NUWCAqY3R4LCBjb25zdCBjaGFyICpuYW1lKQorCXsKKwljb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07CisJcGFyYW0gPSBYNTA5X1ZFUklGWV9QQVJBTV9sb29rdXAobmFtZSk7CisJaWYgKCFwYXJhbSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQoY3R4LT5wYXJhbSwgcGFyYW0pOworCX0KKworWDUwOV9WRVJJRllfUEFSQU0gKlg1MDlfU1RPUkVfQ1RYX2dldDBfcGFyYW0oWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJcmV0dXJuIGN0eC0+cGFyYW07CisJfQorCit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldDBfcGFyYW0oWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtKQorCXsKKwlpZiAoY3R4LT5wYXJhbSkKKwkJWDUwOV9WRVJJRllfUEFSQU1fZnJlZShjdHgtPnBhcmFtKTsKKwljdHgtPnBhcmFtID0gcGFyYW07CisJfQorCitJTVBMRU1FTlRfU1RBQ0tfT0YoWDUwOSkKK0lNUExFTUVOVF9BU04xX1NFVF9PRihYNTA5KQorCitJTVBMRU1FTlRfU1RBQ0tfT0YoWDUwOV9OQU1FKQorCitJTVBMRU1FTlRfU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpCitJTVBMRU1FTlRfQVNOMV9TRVRfT0YoWDUwOV9BVFRSSUJVVEUpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X3ZmeS5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV92ZnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTA5YjMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOV92ZnkuaApAQCAtMCwwICsxLDU2NyBAQAorLyogY3J5cHRvL3g1MDkveDUwOV92ZnkuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9YNTA5X0gKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKy8qIG9wZW5zc2wveDUwOS5oIGVuZHMgdXAgI2luY2x1ZGUtaW5nIHRoaXMgZmlsZSBhdCBhYm91dCB0aGUgb25seQorICogYXBwcm9wcmlhdGUgbW9tZW50LiAqLworI2VuZGlmCisKKyNpZm5kZWYgSEVBREVSX1g1MDlfVkZZX0gKKyNkZWZpbmUgSEVBREVSX1g1MDlfVkZZX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19MSEFTSAorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAwCisvKiBPdXRlciBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHg1MDlfaGFzaF9kaXJfc3QKKwl7CisJaW50IG51bV9kaXJzOworCWNoYXIgKipkaXJzOworCWludCAqZGlyc190eXBlOworCWludCBudW1fZGlyc19hbGxvY2VkOworCX0gWDUwOV9IQVNIX0RJUl9DVFg7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9maWxlX3N0CisJeworCWludCBudW1fcGF0aHM7CS8qIG51bWJlciBvZiBwYXRocyB0byBmaWxlcyBvciBkaXJlY3RvcmllcyAqLworCWludCBudW1fYWxsb2NlZDsKKwljaGFyICoqcGF0aHM7CS8qIHRoZSBsaXN0IG9mIHBhdGhzIG9yIGRpcmVjdG9yaWVzICovCisJaW50ICpwYXRoX3R5cGU7CisJfSBYNTA5X0NFUlRfRklMRV9DVFg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKK1NTTF9DVFggLT4gWDUwOV9TVE9SRSAgICAKKwkJLT4gWDUwOV9MT09LVVAKKwkJCS0+WDUwOV9MT09LVVBfTUVUSE9ECisJCS0+IFg1MDlfTE9PS1VQCisJCQktPlg1MDlfTE9PS1VQX01FVEhPRAorIAorU1NMCS0+IFg1MDlfU1RPUkVfQ1RYCisJCS0+WDUwOV9TVE9SRSAgICAKKworVGhlIFg1MDlfU1RPUkUgaG9sZHMgdGhlIHRhYmxlcyBldGMgZm9yIHZlcmlmaWNhdGlvbiBzdHVmZi4KK0EgWDUwOV9TVE9SRV9DVFggaXMgdXNlZCB3aGlsZSB2YWxpZGF0aW5nIGEgc2luZ2xlIGNlcnRpZmljYXRlLgorVGhlIFg1MDlfU1RPUkUgaGFzIFg1MDlfTE9PS1VQcyBmb3IgbG9va2luZyB1cCBjZXJ0cy4KK1RoZSBYNTA5X1NUT1JFIHRoZW4gY2FsbHMgYSBmdW5jdGlvbiB0byBhY3R1YWxseSB2ZXJpZnkgdGhlCitjZXJ0aWZpY2F0ZSBjaGFpbi4KKyovCisKKyNkZWZpbmUgWDUwOV9MVV9SRVRSWQkJLTEKKyNkZWZpbmUgWDUwOV9MVV9GQUlMCQkwCisjZGVmaW5lIFg1MDlfTFVfWDUwOQkJMQorI2RlZmluZSBYNTA5X0xVX0NSTAkJMgorI2RlZmluZSBYNTA5X0xVX1BLRVkJCTMKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9vYmplY3Rfc3QKKwl7CisJLyogb25lIG9mIHRoZSBhYm92ZSB0eXBlcyAqLworCWludCB0eXBlOworCXVuaW9uCXsKKwkJY2hhciAqcHRyOworCQlYNTA5ICp4NTA5OworCQlYNTA5X0NSTCAqY3JsOworCQlFVlBfUEtFWSAqcGtleTsKKwkJfSBkYXRhOworCX0gWDUwOV9PQkpFQ1Q7CisKK3R5cGVkZWYgc3RydWN0IHg1MDlfbG9va3VwX3N0IFg1MDlfTE9PS1VQOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfTE9PS1VQKQorREVDTEFSRV9TVEFDS19PRihYNTA5X09CSkVDVCkKKworLyogVGhpcyBpcyBhIHN0YXRpYyB0aGF0IGRlZmluZXMgdGhlIGZ1bmN0aW9uIGludGVyZmFjZSAqLwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9sb29rdXBfbWV0aG9kX3N0CisJeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqbmV3X2l0ZW0pKFg1MDlfTE9PS1VQICpjdHgpOworCXZvaWQgKCpmcmVlKShYNTA5X0xPT0tVUCAqY3R4KTsKKwlpbnQgKCppbml0KShYNTA5X0xPT0tVUCAqY3R4KTsKKwlpbnQgKCpzaHV0ZG93bikoWDUwOV9MT09LVVAgKmN0eCk7CisJaW50ICgqY3RybCkoWDUwOV9MT09LVVAgKmN0eCxpbnQgY21kLGNvbnN0IGNoYXIgKmFyZ2MsbG9uZyBhcmdsLAorCQkJY2hhciAqKnJldCk7CisJaW50ICgqZ2V0X2J5X3N1YmplY3QpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsWDUwOV9OQU1FICpuYW1lLAorCQkJICAgICAgWDUwOV9PQkpFQ1QgKnJldCk7CisJaW50ICgqZ2V0X2J5X2lzc3Vlcl9zZXJpYWwpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsWDUwOV9OQU1FICpuYW1lLAorCQkJCSAgICBBU04xX0lOVEVHRVIgKnNlcmlhbCxYNTA5X09CSkVDVCAqcmV0KTsKKwlpbnQgKCpnZXRfYnlfZmluZ2VycHJpbnQpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsCisJCQkJICB1bnNpZ25lZCBjaGFyICpieXRlcyxpbnQgbGVuLAorCQkJCSAgWDUwOV9PQkpFQ1QgKnJldCk7CisJaW50ICgqZ2V0X2J5X2FsaWFzKShYNTA5X0xPT0tVUCAqY3R4LGludCB0eXBlLGNoYXIgKnN0cixpbnQgbGVuLAorCQkJICAgIFg1MDlfT0JKRUNUICpyZXQpOworCX0gWDUwOV9MT09LVVBfTUVUSE9EOworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkIGFsbCBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCBhIHZlcmlmeSBvcGVyYXRpb24KKyAqIGJ5IGluY2x1ZGluZyBhbiBYNTA5X1ZFUklGWV9QQVJBTSBzdHJ1Y3R1cmUgaW4gcmVsYXRlZCBzdHJ1Y3R1cmVzIHRoZQorICogcGFyYW1ldGVycyB1c2VkIGNhbiBiZSBjdXN0b21pemVkCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9WRVJJRllfUEFSQU1fc3QKKwl7CisJY2hhciAqbmFtZTsKKwl0aW1lX3QgY2hlY2tfdGltZTsJLyogVGltZSB0byB1c2UgKi8KKwl1bnNpZ25lZCBsb25nIGluaF9mbGFnczsgLyogSW5oZXJpdGFuY2UgZmxhZ3MgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBWYXJpb3VzIHZlcmlmeSBmbGFncyAqLworCWludCBwdXJwb3NlOwkJLyogcHVycG9zZSB0byBjaGVjayB1bnRydXN0ZWQgY2VydGlmaWNhdGVzICovCisJaW50IHRydXN0OwkJLyogdHJ1c3Qgc2V0dGluZyB0byBjaGVjayAqLworCWludCBkZXB0aDsJCS8qIFZlcmlmeSBkZXB0aCAqLworCVNUQUNLX09GKEFTTjFfT0JKRUNUKSAqcG9saWNpZXM7CS8qIFBlcm1pc3NpYmxlIHBvbGljaWVzICovCisJfSBYNTA5X1ZFUklGWV9QQVJBTTsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X1ZFUklGWV9QQVJBTSkKKworLyogVGhpcyBpcyB1c2VkIHRvIGhvbGQgZXZlcnl0aGluZy4gIEl0IGlzIHVzZWQgZm9yIGFsbCBjZXJ0aWZpY2F0ZQorICogdmFsaWRhdGlvbi4gIE9uY2Ugd2UgaGF2ZSBhIGNlcnRpZmljYXRlIGNoYWluLCB0aGUgJ3ZlcmlmeScKKyAqIGZ1bmN0aW9uIGlzIHRoZW4gY2FsbGVkIHRvIGFjdHVhbGx5IGNoZWNrIHRoZSBjZXJ0IGNoYWluLiAqLworc3RydWN0IHg1MDlfc3RvcmVfc3QKKwl7CisJLyogVGhlIGZvbGxvd2luZyBpcyBhIGNhY2hlIG9mIHRydXN0ZWQgY2VydHMgKi8KKwlpbnQgY2FjaGU7IAkvKiBpZiB0cnVlLCBzdGFzaCBhbnkgaGl0cyAqLworCVNUQUNLX09GKFg1MDlfT0JKRUNUKSAqb2JqczsJLyogQ2FjaGUgb2YgYWxsIG9iamVjdHMgKi8KKworCS8qIFRoZXNlIGFyZSBleHRlcm5hbCBsb29rdXAgbWV0aG9kcyAqLworCVNUQUNLX09GKFg1MDlfTE9PS1VQKSAqZ2V0X2NlcnRfbWV0aG9kczsKKworCVg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbTsKKworCS8qIENhbGxiYWNrcyBmb3IgdmFyaW91cyBvcGVyYXRpb25zICovCisJaW50ICgqdmVyaWZ5KShYNTA5X1NUT1JFX0NUWCAqY3R4KTsJLyogY2FsbGVkIHRvIHZlcmlmeSBhIGNlcnRpZmljYXRlICovCisJaW50ICgqdmVyaWZ5X2NiKShpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmN0eCk7CS8qIGVycm9yIGNhbGxiYWNrICovCisJaW50ICgqZ2V0X2lzc3VlcikoWDUwOSAqKmlzc3VlciwgWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCk7CS8qIGdldCBpc3N1ZXJzIGNlcnQgZnJvbSBjdHggKi8KKwlpbnQgKCpjaGVja19pc3N1ZWQpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngsIFg1MDkgKmlzc3Vlcik7IC8qIGNoZWNrIGlzc3VlZCAqLworCWludCAoKmNoZWNrX3Jldm9jYXRpb24pKFg1MDlfU1RPUkVfQ1RYICpjdHgpOyAvKiBDaGVjayByZXZvY2F0aW9uIHN0YXR1cyBvZiBjaGFpbiAqLworCWludCAoKmdldF9jcmwpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICoqY3JsLCBYNTA5ICp4KTsgLyogcmV0cmlldmUgQ1JMICovCisJaW50ICgqY2hlY2tfY3JsKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsKTsgLyogQ2hlY2sgQ1JMIHZhbGlkaXR5ICovCisJaW50ICgqY2VydF9jcmwpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwsIFg1MDkgKngpOyAvKiBDaGVjayBjZXJ0aWZpY2F0ZSBhZ2FpbnN0IENSTCAqLworCVNUQUNLX09GKFg1MDkpICogKCpsb29rdXBfY2VydHMpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pOworCVNUQUNLX09GKFg1MDlfQ1JMKSAqICgqbG9va3VwX2NybHMpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pOworCWludCAoKmNsZWFudXApKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCisJQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKwlpbnQgcmVmZXJlbmNlczsKKwl9IC8qIFg1MDlfU1RPUkUgKi87CisKK2ludCBYNTA5X1NUT1JFX3NldF9kZXB0aChYNTA5X1NUT1JFICpzdG9yZSwgaW50IGRlcHRoKTsKKworI2RlZmluZSBYNTA5X1NUT1JFX3NldF92ZXJpZnlfY2JfZnVuYyhjdHgsZnVuYykgKChjdHgpLT52ZXJpZnlfY2I9KGZ1bmMpKQorI2RlZmluZSBYNTA5X1NUT1JFX3NldF92ZXJpZnlfZnVuYyhjdHgsZnVuYykJKChjdHgpLT52ZXJpZnk9KGZ1bmMpKQorCisvKiBUaGlzIGlzIHRoZSBmdW5jdGlvbnMgcGx1cyBhbiBpbnN0YW5jZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLiAqLworc3RydWN0IHg1MDlfbG9va3VwX3N0CisJeworCWludCBpbml0OwkJCS8qIGhhdmUgd2UgYmVlbiBzdGFydGVkICovCisJaW50IHNraXA7CQkJLyogZG9uJ3QgdXNlIHVzLiAqLworCVg1MDlfTE9PS1VQX01FVEhPRCAqbWV0aG9kOwkvKiB0aGUgZnVuY3Rpb25zICovCisJY2hhciAqbWV0aG9kX2RhdGE7CQkvKiBtZXRob2QgZGF0YSAqLworCisJWDUwOV9TVE9SRSAqc3RvcmVfY3R4OwkvKiB3aG8gb3ducyB1cyAqLworCX0gLyogWDUwOV9MT09LVVAgKi87CisKKy8qIFRoaXMgaXMgYSB1c2VkIHdoZW4gdmVyaWZ5aW5nIGNlcnQgY2hhaW5zLiAgU2luY2UgdGhlCisgKiBnYXRoZXJpbmcgb2YgdGhlIGNlcnQgY2hhaW4gY2FuIHRha2Ugc29tZSB0aW1lIChhbmQgaGF2ZSB0byBiZQorICogJ3JldHJpZWQnLCB0aGlzIG5lZWRzIHRvIGJlIGtlcHQgYW5kIHBhc3NlZCBhcm91bmQuICovCitzdHJ1Y3QgeDUwOV9zdG9yZV9jdHhfc3QgICAgICAvKiBYNTA5X1NUT1JFX0NUWCAqLworCXsKKwlYNTA5X1NUT1JFICpjdHg7CisJaW50IGN1cnJlbnRfbWV0aG9kOwkvKiB1c2VkIHdoZW4gbG9va2luZyB1cCBjZXJ0cyAqLworCisJLyogVGhlIGZvbGxvd2luZyBhcmUgc2V0IGJ5IHRoZSBjYWxsZXIgKi8KKwlYNTA5ICpjZXJ0OwkJLyogVGhlIGNlcnQgdG8gY2hlY2sgKi8KKwlTVEFDS19PRihYNTA5KSAqdW50cnVzdGVkOwkvKiBjaGFpbiBvZiBYNTA5cyAtIHVudHJ1c3RlZCAtIHBhc3NlZCBpbiAqLworCVNUQUNLX09GKFg1MDlfQ1JMKSAqY3JsczsJLyogc2V0IG9mIENSTHMgcGFzc2VkIGluICovCisKKwlYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07CisJdm9pZCAqb3RoZXJfY3R4OwkvKiBPdGhlciBpbmZvIGZvciB1c2Ugd2l0aCBnZXRfaXNzdWVyKCkgKi8KKworCS8qIENhbGxiYWNrcyBmb3IgdmFyaW91cyBvcGVyYXRpb25zICovCisJaW50ICgqdmVyaWZ5KShYNTA5X1NUT1JFX0NUWCAqY3R4KTsJLyogY2FsbGVkIHRvIHZlcmlmeSBhIGNlcnRpZmljYXRlICovCisJaW50ICgqdmVyaWZ5X2NiKShpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmN0eCk7CQkvKiBlcnJvciBjYWxsYmFjayAqLworCWludCAoKmdldF9pc3N1ZXIpKFg1MDkgKippc3N1ZXIsIFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpOwkvKiBnZXQgaXNzdWVycyBjZXJ0IGZyb20gY3R4ICovCisJaW50ICgqY2hlY2tfaXNzdWVkKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4LCBYNTA5ICppc3N1ZXIpOyAvKiBjaGVjayBpc3N1ZWQgKi8KKwlpbnQgKCpjaGVja19yZXZvY2F0aW9uKShYNTA5X1NUT1JFX0NUWCAqY3R4KTsgLyogQ2hlY2sgcmV2b2NhdGlvbiBzdGF0dXMgb2YgY2hhaW4gKi8KKwlpbnQgKCpnZXRfY3JsKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqKmNybCwgWDUwOSAqeCk7IC8qIHJldHJpZXZlIENSTCAqLworCWludCAoKmNoZWNrX2NybCkoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCk7IC8qIENoZWNrIENSTCB2YWxpZGl0eSAqLworCWludCAoKmNlcnRfY3JsKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsLCBYNTA5ICp4KTsgLyogQ2hlY2sgY2VydGlmaWNhdGUgYWdhaW5zdCBDUkwgKi8KKwlpbnQgKCpjaGVja19wb2xpY3kpKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCVNUQUNLX09GKFg1MDkpICogKCpsb29rdXBfY2VydHMpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pOworCVNUQUNLX09GKFg1MDlfQ1JMKSAqICgqbG9va3VwX2NybHMpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pOworCWludCAoKmNsZWFudXApKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCisJLyogVGhlIGZvbGxvd2luZyBpcyBidWlsdCB1cCAqLworCWludCB2YWxpZDsJCS8qIGlmIDAsIHJlYnVpbGQgY2hhaW4gKi8KKwlpbnQgbGFzdF91bnRydXN0ZWQ7CS8qIGluZGV4IG9mIGxhc3QgdW50cnVzdGVkIGNlcnQgKi8KKwlTVEFDS19PRihYNTA5KSAqY2hhaW47IAkJLyogY2hhaW4gb2YgWDUwOXMgLSBidWlsdCB1cCBhbmQgdHJ1c3RlZCAqLworCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWU7CS8qIFZhbGlkIHBvbGljeSB0cmVlICovCisKKwlpbnQgZXhwbGljaXRfcG9saWN5OwkvKiBSZXF1aXJlIGV4cGxpY2l0IHBvbGljeSB2YWx1ZSAqLworCisJLyogV2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZywgdGhpcyBpcyB3aHkgKi8KKwlpbnQgZXJyb3JfZGVwdGg7CisJaW50IGVycm9yOworCVg1MDkgKmN1cnJlbnRfY2VydDsKKwlYNTA5ICpjdXJyZW50X2lzc3VlcjsJLyogY2VydCBjdXJyZW50bHkgYmVpbmcgdGVzdGVkIGFzIHZhbGlkIGlzc3VlciAqLworCVg1MDlfQ1JMICpjdXJyZW50X2NybDsJLyogY3VycmVudCBDUkwgKi8KKworCWludCBjdXJyZW50X2NybF9zY29yZTsgIC8qIHNjb3JlIG9mIGN1cnJlbnQgQ1JMICovCisJdW5zaWduZWQgaW50IGN1cnJlbnRfcmVhc29uczsgIC8qIFJlYXNvbiBtYXNrICovCisKKwlYNTA5X1NUT1JFX0NUWCAqcGFyZW50OyAvKiBGb3IgQ1JMIHBhdGggdmFsaWRhdGlvbjogcGFyZW50IGNvbnRleHQgKi8KKworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisJfSAvKiBYNTA5X1NUT1JFX0NUWCAqLzsKKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGRlcHRoKTsKKworI2RlZmluZSBYNTA5X1NUT1JFX0NUWF9zZXRfYXBwX2RhdGEoY3R4LGRhdGEpIFwKKwlYNTA5X1NUT1JFX0NUWF9zZXRfZXhfZGF0YShjdHgsMCxkYXRhKQorI2RlZmluZSBYNTA5X1NUT1JFX0NUWF9nZXRfYXBwX2RhdGEoY3R4KSBcCisJWDUwOV9TVE9SRV9DVFhfZ2V0X2V4X2RhdGEoY3R4LDApCisKKyNkZWZpbmUgWDUwOV9MX0ZJTEVfTE9BRAkxCisjZGVmaW5lIFg1MDlfTF9BRERfRElSCQkyCisKKyNkZWZpbmUgWDUwOV9MT09LVVBfbG9hZF9maWxlKHgsbmFtZSx0eXBlKSBcCisJCVg1MDlfTE9PS1VQX2N0cmwoKHgpLFg1MDlfTF9GSUxFX0xPQUQsKG5hbWUpLChsb25nKSh0eXBlKSxOVUxMKQorCisjZGVmaW5lIFg1MDlfTE9PS1VQX2FkZF9kaXIoeCxuYW1lLHR5cGUpIFwKKwkJWDUwOV9MT09LVVBfY3RybCgoeCksWDUwOV9MX0FERF9ESVIsKG5hbWUpLChsb25nKSh0eXBlKSxOVUxMKQorCisjZGVmaW5lCQlYNTA5X1ZfT0sJCQkJCTAKKy8qIGlsbGVnYWwgZXJyb3IgKGZvciB1bmluaXRpYWxpemVkIHZhbHVlcywgdG8gYXZvaWQgWDUwOV9WX09LKTogMSAqLworCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQJCTIKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkwJCQkzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOQUJMRV9UT19ERUNSWVBUX0NFUlRfU0lHTkFUVVJFCTQKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ1JZUFRfQ1JMX1NJR05BVFVSRQk1CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOQUJMRV9UT19ERUNPREVfSVNTVUVSX1BVQkxJQ19LRVkJNgorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX1NJR05BVFVSRV9GQUlMVVJFCQk3CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NSTF9TSUdOQVRVUkVfRkFJTFVSRQkJOAorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX05PVF9ZRVRfVkFMSUQJCQk5CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQJCQkxMAorI2RlZmluZQkJWDUwOV9WX0VSUl9DUkxfTk9UX1lFVF9WQUxJRAkJCTExCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NSTF9IQVNfRVhQSVJFRAkJCTEyCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0JFRk9SRV9GSUVMRAkxMworI2RlZmluZQkJWDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9BRlRFUl9GSUVMRAkxNAorI2RlZmluZQkJWDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTEFTVF9VUERBVEVfRklFTEQJMTUKKyNkZWZpbmUJCVg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX05FWFRfVVBEQVRFX0ZJRUxECTE2CisjZGVmaW5lCQlYNTA5X1ZfRVJSX09VVF9PRl9NRU0JCQkJMTcKKyNkZWZpbmUJCVg1MDlfVl9FUlJfREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUCQkxOAorI2RlZmluZQkJWDUwOV9WX0VSUl9TRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOCQkxOQorI2RlZmluZQkJWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFkJMjAKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRQkyMQorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX0NIQUlOX1RPT19MT05HCQkJMjIKKyNkZWZpbmUJCVg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VECQkJCTIzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0lOVkFMSURfQ0EJCQkJMjQKKyNkZWZpbmUJCVg1MDlfVl9FUlJfUEFUSF9MRU5HVEhfRVhDRUVERUQJCQkyNQorI2RlZmluZQkJWDUwOV9WX0VSUl9JTlZBTElEX1BVUlBPU0UJCQkyNgorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX1VOVFJVU1RFRAkJCTI3CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NFUlRfUkVKRUNURUQJCQkyOAorLyogVGhlc2UgYXJlICdpbmZvcm1hdGlvbmFsJyB3aGVuIGxvb2tpbmcgZm9yIGlzc3VlciBjZXJ0ICovCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1NVQkpFQ1RfSVNTVUVSX01JU01BVENICQkyOQorI2RlZmluZQkJWDUwOV9WX0VSUl9BS0lEX1NLSURfTUlTTUFUQ0gJCQkzMAorI2RlZmluZQkJWDUwOV9WX0VSUl9BS0lEX0lTU1VFUl9TRVJJQUxfTUlTTUFUQ0gJCTMxCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0tFWVVTQUdFX05PX0NFUlRTSUdOCQkJMzIKKworI2RlZmluZQkJWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTF9JU1NVRVIJCTMzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOSEFORExFRF9DUklUSUNBTF9FWFRFTlNJT04JCTM0CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0tFWVVTQUdFX05PX0NSTF9TSUdOCQkJMzUKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0NSTF9FWFRFTlNJT04JMzYKKyNkZWZpbmUJCVg1MDlfVl9FUlJfSU5WQUxJRF9OT05fQ0EJCQkzNworI2RlZmluZQkJWDUwOV9WX0VSUl9QUk9YWV9QQVRIX0xFTkdUSF9FWENFRURFRAkJMzgKKyNkZWZpbmUJCVg1MDlfVl9FUlJfS0VZVVNBR0VfTk9fRElHSVRBTF9TSUdOQVRVUkUJMzkKKyNkZWZpbmUJCVg1MDlfVl9FUlJfUFJPWFlfQ0VSVElGSUNBVEVTX05PVF9BTExPV0VECTQwCisKKyNkZWZpbmUJCVg1MDlfVl9FUlJfSU5WQUxJRF9FWFRFTlNJT04JCQk0MQorI2RlZmluZQkJWDUwOV9WX0VSUl9JTlZBTElEX1BPTElDWV9FWFRFTlNJT04JCTQyCisjZGVmaW5lCQlYNTA5X1ZfRVJSX05PX0VYUExJQ0lUX1BPTElDWQkJCTQzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0RJRkZFUkVOVF9DUkxfU0NPUEUJCQk0NAorI2RlZmluZQkJWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9FWFRFTlNJT05fRkVBVFVSRQk0NQorCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOTkVTVEVEX1JFU09VUkNFCQkJNDYKKworI2RlZmluZQkJWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OCQkJNDcKKyNkZWZpbmUJCVg1MDlfVl9FUlJfRVhDTFVERURfVklPTEFUSU9OCQkJNDgKKyNkZWZpbmUJCVg1MDlfVl9FUlJfU1VCVFJFRV9NSU5NQVgJCQk0OQorI2RlZmluZQkJWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9DT05TVFJBSU5UX1RZUEUJCTUxCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX0NPTlNUUkFJTlRfU1lOVEFYCTUyCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX05BTUVfU1lOVEFYCQk1MworI2RlZmluZQkJWDUwOV9WX0VSUl9DUkxfUEFUSF9WQUxJREFUSU9OX0VSUk9SCQk1NAorCisvKiBUaGUgYXBwbGljYXRpb24gaXMgbm90IGhhcHB5ICovCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0FQUExJQ0FUSU9OX1ZFUklGSUNBVElPTgkJNTAKKworLyogQ2VydGlmaWNhdGUgdmVyaWZ5IGZsYWdzICovCisKKy8qIFNlbmQgaXNzdWVyK3N1YmplY3QgY2hlY2tzIHRvIHZlcmlmeV9jYiAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19DQl9JU1NVRVJfQ0hFQ0sJCTB4MQorLyogVXNlIGNoZWNrIHRpbWUgaW5zdGVhZCBvZiBjdXJyZW50IHRpbWUgKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfVVNFX0NIRUNLX1RJTUUJCTB4MgorLyogTG9va3VwIENSTHMgKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfQ1JMX0NIRUNLCQkJMHg0CisvKiBMb29rdXAgQ1JMcyBmb3Igd2hvbGUgY2hhaW4gKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfQ1JMX0NIRUNLX0FMTAkJMHg4CisvKiBJZ25vcmUgdW5oYW5kbGVkIGNyaXRpY2FsIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfSUdOT1JFX0NSSVRJQ0FMCQkweDEwCisvKiBEaXNhYmxlIHdvcmthcm91bmRzIGZvciBicm9rZW4gY2VydGlmaWNhdGVzICovCisjZGVmaW5lCVg1MDlfVl9GTEFHX1g1MDlfU1RSSUNUCQkJMHgyMAorLyogRW5hYmxlIHByb3h5IGNlcnRpZmljYXRlIHZhbGlkYXRpb24gKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfQUxMT1dfUFJPWFlfQ0VSVFMJCTB4NDAKKy8qIEVuYWJsZSBwb2xpY3kgY2hlY2tpbmcgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfUE9MSUNZX0NIRUNLCQkweDgwCisvKiBQb2xpY3kgdmFyaWFibGUgcmVxdWlyZS1leHBsaWNpdC1wb2xpY3kgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfRVhQTElDSVRfUE9MSUNZCQkweDEwMAorLyogUG9saWN5IHZhcmlhYmxlIGluaGliaXQtYW55LXBvbGljeSAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19JTkhJQklUX0FOWQkJCTB4MjAwCisvKiBQb2xpY3kgdmFyaWFibGUgaW5oaWJpdC1wb2xpY3ktbWFwcGluZyAqLworI2RlZmluZSBYNTA5X1ZfRkxBR19JTkhJQklUX01BUAkJCTB4NDAwCisvKiBOb3RpZnkgY2FsbGJhY2sgdGhhdCBwb2xpY3kgaXMgT0sgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfTk9USUZZX1BPTElDWQkJMHg4MDAKKy8qIEV4dGVuZGVkIENSTCBmZWF0dXJlcyBzdWNoIGFzIGluZGlyZWN0IENSTHMsIGFsdGVybmF0ZSBDUkwgc2lnbmluZyBrZXlzICovCisjZGVmaW5lIFg1MDlfVl9GTEFHX0VYVEVOREVEX0NSTF9TVVBQT1JUCTB4MTAwMAorLyogRGVsdGEgQ1JMIHN1cHBvcnQgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfVVNFX0RFTFRBUwkJCTB4MjAwMAorLyogQ2hlY2sgc2VsZnNpZ25lZCBDQSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfQ0hFQ0tfU1NfU0lHTkFUVVJFCQkweDQwMDAKKworCisjZGVmaW5lIFg1MDlfVlBfRkxBR19ERUZBVUxUCQkJMHgxCisjZGVmaW5lIFg1MDlfVlBfRkxBR19PVkVSV1JJVEUJCQkweDIKKyNkZWZpbmUgWDUwOV9WUF9GTEFHX1JFU0VUX0ZMQUdTCQkweDQKKyNkZWZpbmUgWDUwOV9WUF9GTEFHX0xPQ0tFRAkJCTB4OAorI2RlZmluZSBYNTA5X1ZQX0ZMQUdfT05DRQkJCTB4MTAKKworLyogSW50ZXJuYWwgdXNlOiBtYXNrIG9mIHBvbGljeSByZWxhdGVkIG9wdGlvbnMgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfUE9MSUNZX01BU0sgKFg1MDlfVl9GTEFHX1BPTElDWV9DSEVDSyBcCisJCQkJfCBYNTA5X1ZfRkxBR19FWFBMSUNJVF9QT0xJQ1kgXAorCQkJCXwgWDUwOV9WX0ZMQUdfSU5ISUJJVF9BTlkgXAorCQkJCXwgWDUwOV9WX0ZMQUdfSU5ISUJJVF9NQVApCisKK2ludCBYNTA5X09CSkVDVF9pZHhfYnlfc3ViamVjdChTVEFDS19PRihYNTA5X09CSkVDVCkgKmgsIGludCB0eXBlLAorCSAgICAgWDUwOV9OQU1FICpuYW1lKTsKK1g1MDlfT0JKRUNUICpYNTA5X09CSkVDVF9yZXRyaWV2ZV9ieV9zdWJqZWN0KFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCxpbnQgdHlwZSxYNTA5X05BTUUgKm5hbWUpOworWDUwOV9PQkpFQ1QgKlg1MDlfT0JKRUNUX3JldHJpZXZlX21hdGNoKFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCwgWDUwOV9PQkpFQ1QgKngpOwordm9pZCBYNTA5X09CSkVDVF91cF9yZWZfY291bnQoWDUwOV9PQkpFQ1QgKmEpOwordm9pZCBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKFg1MDlfT0JKRUNUICphKTsKK1g1MDlfU1RPUkUgKlg1MDlfU1RPUkVfbmV3KHZvaWQgKTsKK3ZvaWQgWDUwOV9TVE9SRV9mcmVlKFg1MDlfU1RPUkUgKnYpOworCitTVEFDS19PRihYNTA5KSogWDUwOV9TVE9SRV9nZXQxX2NlcnRzKFg1MDlfU1RPUkVfQ1RYICpzdCwgWDUwOV9OQU1FICpubSk7CitTVEFDS19PRihYNTA5X0NSTCkqIFg1MDlfU1RPUkVfZ2V0MV9jcmxzKFg1MDlfU1RPUkVfQ1RYICpzdCwgWDUwOV9OQU1FICpubSk7CitpbnQgWDUwOV9TVE9SRV9zZXRfZmxhZ3MoWDUwOV9TVE9SRSAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBYNTA5X1NUT1JFX3NldF9wdXJwb3NlKFg1MDlfU1RPUkUgKmN0eCwgaW50IHB1cnBvc2UpOworaW50IFg1MDlfU1RPUkVfc2V0X3RydXN0KFg1MDlfU1RPUkUgKmN0eCwgaW50IHRydXN0KTsKK2ludCBYNTA5X1NUT1JFX3NldDFfcGFyYW0oWDUwOV9TVE9SRSAqY3R4LCBYNTA5X1ZFUklGWV9QQVJBTSAqcG0pOworCit2b2lkIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYihYNTA5X1NUT1JFICpjdHgsCisJCQkJICBpbnQgKCp2ZXJpZnlfY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpOworCitYNTA5X1NUT1JFX0NUWCAqWDUwOV9TVE9SRV9DVFhfbmV3KHZvaWQpOworCitpbnQgWDUwOV9TVE9SRV9DVFhfZ2V0MV9pc3N1ZXIoWDUwOSAqKmlzc3VlciwgWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCk7CisKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfZnJlZShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK2ludCBYNTA5X1NUT1JFX0NUWF9pbml0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfU1RPUkUgKnN0b3JlLAorCQkJIFg1MDkgKng1MDksIFNUQUNLX09GKFg1MDkpICpjaGFpbik7Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soWDUwOV9TVE9SRV9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOSkgKnNrKTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfY2xlYW51cChYNTA5X1NUT1JFX0NUWCAqY3R4KTsKKworWDUwOV9MT09LVVAgKlg1MDlfU1RPUkVfYWRkX2xvb2t1cChYNTA5X1NUT1JFICp2LCBYNTA5X0xPT0tVUF9NRVRIT0QgKm0pOworCitYNTA5X0xPT0tVUF9NRVRIT0QgKlg1MDlfTE9PS1VQX2hhc2hfZGlyKHZvaWQpOworWDUwOV9MT09LVVBfTUVUSE9EICpYNTA5X0xPT0tVUF9maWxlKHZvaWQpOworCitpbnQgWDUwOV9TVE9SRV9hZGRfY2VydChYNTA5X1NUT1JFICpjdHgsIFg1MDkgKngpOworaW50IFg1MDlfU1RPUkVfYWRkX2NybChYNTA5X1NUT1JFICpjdHgsIFg1MDlfQ1JMICp4KTsKKworaW50IFg1MDlfU1RPUkVfZ2V0X2J5X3N1YmplY3QoWDUwOV9TVE9SRV9DVFggKnZzLGludCB0eXBlLFg1MDlfTkFNRSAqbmFtZSwKKwlYNTA5X09CSkVDVCAqcmV0KTsKKworaW50IFg1MDlfTE9PS1VQX2N0cmwoWDUwOV9MT09LVVAgKmN0eCwgaW50IGNtZCwgY29uc3QgY2hhciAqYXJnYywKKwlsb25nIGFyZ2wsIGNoYXIgKipyZXQpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fU1RESU8KK2ludCBYNTA5X2xvYWRfY2VydF9maWxlKFg1MDlfTE9PS1VQICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKK2ludCBYNTA5X2xvYWRfY3JsX2ZpbGUoWDUwOV9MT09LVVAgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworaW50IFg1MDlfbG9hZF9jZXJ0X2NybF9maWxlKFg1MDlfTE9PS1VQICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKKyNlbmRpZgorCisKK1g1MDlfTE9PS1VQICpYNTA5X0xPT0tVUF9uZXcoWDUwOV9MT09LVVBfTUVUSE9EICptZXRob2QpOwordm9pZCBYNTA5X0xPT0tVUF9mcmVlKFg1MDlfTE9PS1VQICpjdHgpOworaW50IFg1MDlfTE9PS1VQX2luaXQoWDUwOV9MT09LVVAgKmN0eCk7CitpbnQgWDUwOV9MT09LVVBfYnlfc3ViamVjdChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgdHlwZSwgWDUwOV9OQU1FICpuYW1lLAorCVg1MDlfT0JKRUNUICpyZXQpOworaW50IFg1MDlfTE9PS1VQX2J5X2lzc3Vlcl9zZXJpYWwoWDUwOV9MT09LVVAgKmN0eCwgaW50IHR5cGUsIFg1MDlfTkFNRSAqbmFtZSwKKwlBU04xX0lOVEVHRVIgKnNlcmlhbCwgWDUwOV9PQkpFQ1QgKnJldCk7CitpbnQgWDUwOV9MT09LVVBfYnlfZmluZ2VycHJpbnQoWDUwOV9MT09LVVAgKmN0eCwgaW50IHR5cGUsCisJdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4sIFg1MDlfT0JKRUNUICpyZXQpOworaW50IFg1MDlfTE9PS1VQX2J5X2FsaWFzKFg1MDlfTE9PS1VQICpjdHgsIGludCB0eXBlLCBjaGFyICpzdHIsCisJaW50IGxlbiwgWDUwOV9PQkpFQ1QgKnJldCk7CitpbnQgWDUwOV9MT09LVVBfc2h1dGRvd24oWDUwOV9MT09LVVAgKmN0eCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworaW50CVg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMgKFg1MDlfU1RPUkUgKmN0eCwKKwkJY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZGlyKTsKK2ludAlYNTA5X1NUT1JFX3NldF9kZWZhdWx0X3BhdGhzKFg1MDlfU1RPUkUgKmN0eCk7CisjZW5kaWYKKworaW50IFg1MDlfU1RPUkVfQ1RYX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwlDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQJWDUwOV9TVE9SRV9DVFhfc2V0X2V4X2RhdGEoWDUwOV9TVE9SRV9DVFggKmN0eCxpbnQgaWR4LHZvaWQgKmRhdGEpOwordm9pZCAqCVg1MDlfU1RPUkVfQ1RYX2dldF9leF9kYXRhKFg1MDlfU1RPUkVfQ1RYICpjdHgsaW50IGlkeCk7CitpbnQJWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKFg1MDlfU1RPUkVfQ1RYICpjdHgpOwordm9pZAlYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoWDUwOV9TVE9SRV9DVFggKmN0eCxpbnQgcyk7CitpbnQJWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworWDUwOSAqCVg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitYNTA5ICpYNTA5X1NUT1JFX0NUWF9nZXQwX2N1cnJlbnRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworWDUwOV9DUkwgKlg1MDlfU1RPUkVfQ1RYX2dldDBfY3VycmVudF9jcmwoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitYNTA5X1NUT1JFX0NUWCAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wYXJlbnRfY3R4KFg1MDlfU1RPUkVfQ1RYICpjdHgpOworU1RBQ0tfT0YoWDUwOSkgKlg1MDlfU1RPUkVfQ1RYX2dldF9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK1NUQUNLX09GKFg1MDkpICpYNTA5X1NUT1JFX0NUWF9nZXQxX2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjdHgpOwordm9pZAlYNTA5X1NUT1JFX0NUWF9zZXRfY2VydChYNTA5X1NUT1JFX0NUWCAqYyxYNTA5ICp4KTsKK3ZvaWQJWDUwOV9TVE9SRV9DVFhfc2V0X2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjLFNUQUNLX09GKFg1MDkpICpzayk7Cit2b2lkCVg1MDlfU1RPUkVfQ1RYX3NldDBfY3JscyhYNTA5X1NUT1JFX0NUWCAqYyxTVEFDS19PRihYNTA5X0NSTCkgKnNrKTsKK2ludCBYNTA5X1NUT1JFX0NUWF9zZXRfcHVycG9zZShYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgcHVycG9zZSk7CitpbnQgWDUwOV9TVE9SRV9DVFhfc2V0X3RydXN0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCB0cnVzdCk7CitpbnQgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBkZWZfcHVycG9zZSwKKwkJCQlpbnQgcHVycG9zZSwgaW50IHRydXN0KTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X2ZsYWdzKFg1MDlfU1RPUkVfQ1RYICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfdGltZShYNTA5X1NUT1JFX0NUWCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCQkJCQl0aW1lX3QgdCk7Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF92ZXJpZnlfY2IoWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCQkgIGludCAoKnZlcmlmeV9jYikoaW50LCBYNTA5X1NUT1JFX0NUWCAqKSk7CisgIAorWDUwOV9QT0xJQ1lfVFJFRSAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wb2xpY3lfdHJlZShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXhwbGljaXRfcG9saWN5KFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCitYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wYXJhbShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0MF9wYXJhbShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pOworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF9kZWZhdWx0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBYNTA5X1ZFUklGWV9QQVJBTSBmdW5jdGlvbnMgKi8KKworWDUwOV9WRVJJRllfUEFSQU0gKlg1MDlfVkVSSUZZX1BBUkFNX25ldyh2b2lkKTsKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fZnJlZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQoWDUwOV9WRVJJRllfUEFSQU0gKnRvLAorCQkJCQkJY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKmZyb20pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDEoWDUwOV9WRVJJRllfUEFSQU0gKnRvLCAKKwkJCQkJCWNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpmcm9tKTsKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXQxX25hbWUoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfZmxhZ3MoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9jbGVhcl9mbGFncyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIFg1MDlfVkVSSUZZX1BBUkFNX2dldF9mbGFncyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF9wdXJwb3NlKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgaW50IHB1cnBvc2UpOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF90cnVzdChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGludCB0cnVzdCk7Cit2b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3NldF9kZXB0aChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGludCBkZXB0aCk7Cit2b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90aW1lKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgdGltZV90IHQpOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2FkZDBfcG9saWN5KFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwKKwkJCQkJCUFTTjFfT0JKRUNUICpwb2xpY3kpOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfcG9saWNpZXMoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCAKKwkJCQkJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICpwb2xpY2llcyk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2RlcHRoKGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7CisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9hZGQwX3RhYmxlKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7Citjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9WRVJJRllfUEFSQU1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBYNTA5X1ZFUklGWV9QQVJBTV90YWJsZV9jbGVhbnVwKHZvaWQpOworCitpbnQgWDUwOV9wb2xpY3lfY2hlY2soWDUwOV9QT0xJQ1lfVFJFRSAqKnB0cmVlLCBpbnQgKnBleHBsaWNpdF9wb2xpY3ksCisJCQlTVEFDS19PRihYNTA5KSAqY2VydHMsCisJCQlTVEFDS19PRihBU04xX09CSkVDVCkgKnBvbGljeV9vaWRzLAorCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKKwordm9pZCBYNTA5X3BvbGljeV90cmVlX2ZyZWUoWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSk7CisKK2ludCBYNTA5X3BvbGljeV90cmVlX2xldmVsX2NvdW50KGNvbnN0IFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpOworWDUwOV9QT0xJQ1lfTEVWRUwgKgorCVg1MDlfcG9saWN5X3RyZWVfZ2V0MF9sZXZlbChjb25zdCBYNTA5X1BPTElDWV9UUkVFICp0cmVlLCBpbnQgaSk7CisKK1NUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICoKKwlYNTA5X3BvbGljeV90cmVlX2dldDBfcG9saWNpZXMoY29uc3QgWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSk7CisKK1NUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICoKKwlYNTA5X3BvbGljeV90cmVlX2dldDBfdXNlcl9wb2xpY2llcyhjb25zdCBYNTA5X1BPTElDWV9UUkVFICp0cmVlKTsKKworaW50IFg1MDlfcG9saWN5X2xldmVsX25vZGVfY291bnQoWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsKTsKKworWDUwOV9QT0xJQ1lfTk9ERSAqWDUwOV9wb2xpY3lfbGV2ZWxfZ2V0MF9ub2RlKFg1MDlfUE9MSUNZX0xFVkVMICpsZXZlbCwgaW50IGkpOworCitjb25zdCBBU04xX09CSkVDVCAqWDUwOV9wb2xpY3lfbm9kZV9nZXQwX3BvbGljeShjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlKTsKKworU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICoKKwlYNTA5X3BvbGljeV9ub2RlX2dldDBfcXVhbGlmaWVycyhjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlKTsKK2NvbnN0IFg1MDlfUE9MSUNZX05PREUgKgorCVg1MDlfcG9saWN5X25vZGVfZ2V0MF9wYXJlbnQoY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlfdnBtLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X3ZwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDg5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5X3ZwbS5jCkBAIC0wLDAgKzEsNDM4IEBACisvKiB4NTA5X3ZwbS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwNC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisvKiBYNTA5X1ZFUklGWV9QQVJBTSBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgeDUwOV92ZXJpZnlfcGFyYW1femVybyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pCisJeworCWlmICghcGFyYW0pCisJCXJldHVybjsKKwlwYXJhbS0+bmFtZSA9IE5VTEw7CisJcGFyYW0tPnB1cnBvc2UgPSAwOworCXBhcmFtLT50cnVzdCA9IDA7CisJLypwYXJhbS0+aW5oX2ZsYWdzID0gWDUwOV9WUF9GTEFHX0RFRkFVTFQ7Ki8KKwlwYXJhbS0+aW5oX2ZsYWdzID0gMDsKKwlwYXJhbS0+ZmxhZ3MgPSAwOworCXBhcmFtLT5kZXB0aCA9IC0xOworCWlmIChwYXJhbS0+cG9saWNpZXMpCisJCXsKKwkJc2tfQVNOMV9PQkpFQ1RfcG9wX2ZyZWUocGFyYW0tPnBvbGljaWVzLCBBU04xX09CSkVDVF9mcmVlKTsKKwkJcGFyYW0tPnBvbGljaWVzID0gTlVMTDsKKwkJfQorCX0KKworWDUwOV9WRVJJRllfUEFSQU0gKlg1MDlfVkVSSUZZX1BBUkFNX25ldyh2b2lkKQorCXsKKwlYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07CisJcGFyYW0gPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOV9WRVJJRllfUEFSQU0pKTsKKwltZW1zZXQocGFyYW0sIDAsIHNpemVvZihYNTA5X1ZFUklGWV9QQVJBTSkpOworCXg1MDlfdmVyaWZ5X3BhcmFtX3plcm8ocGFyYW0pOworCXJldHVybiBwYXJhbTsKKwl9CisKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fZnJlZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pCisJeworCXg1MDlfdmVyaWZ5X3BhcmFtX3plcm8ocGFyYW0pOworCU9QRU5TU0xfZnJlZShwYXJhbSk7CisJfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaG93IHBhcmFtZXRlcnMgYXJlICJpbmhlcml0ZWQiIGZyb20gb25lIHN0cnVjdHVyZQorICogdG8gYW5vdGhlci4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50IHdheXMgdGhpcyBjYW4gaGFwcGVuLgorICoKKyAqIDEuIElmIGEgY2hpbGQgc3RydWN0dXJlIG5lZWRzIHRvIGhhdmUgaXRzIHZhbHVlcyBpbml0aWFsaXplZCBmcm9tIGEgcGFyZW50CisgKiAgICB0aGV5IGFyZSBzaW1wbHkgY29waWVkIGFjcm9zcy4gRm9yIGV4YW1wbGUgU1NMX0NUWCBjb3BpZWQgdG8gU1NMLgorICogMi4gSWYgdGhlIHN0cnVjdHVyZSBzaG91bGQgdGFrZSBvbiB2YWx1ZXMgb25seSBpZiB0aGV5IGFyZSBjdXJyZW50bHkgdW5zZXQuCisgKiAgICBGb3IgZXhhbXBsZSB0aGUgdmFsdWVzIGluIGFuIFNTTCBzdHJ1Y3R1cmUgd2lsbCB0YWtlIGFwcHJvcHJpYXRlIHZhbHVlCisgKiAgICBmb3IgU1NMIHNlcnZlcnMgb3IgY2xpZW50cyBidXQgb25seSBpZiB0aGUgYXBwbGljYXRpb24gaGFzIG5vdCBzZXQgbmV3CisgKiAgICBvbmVzLgorICoKKyAqIFRoZSAiaW5oX2ZsYWdzIiBmaWVsZCBkZXRlcm1pbmVzIGhvdyB0aGlzIGZ1bmN0aW9uIGJlaGF2ZXMuIAorICoKKyAqIE5vcm1hbGx5IGFueSB2YWx1ZXMgd2hpY2ggYXJlIHNldCBpbiB0aGUgZGVmYXVsdCBhcmUgbm90IGNvcGllZCBmcm9tIHRoZQorICogZGVzdGluYXRpb24gYW5kIHZlcmlmeSBmbGFncyBhcmUgT1JlZCB0b2dldGhlci4KKyAqCisgKiBJZiBYNTA5X1ZQX0ZMQUdfREVGQVVMVCBpcyBzZXQgdGhlbiBhbnl0aGluZyBzZXQgaW4gdGhlIHNvdXJjZSBpcyBjb3BpZWQKKyAqIHRvIHRoZSBkZXN0aW5hdGlvbi4gRWZmZWN0aXZlbHkgdGhlIHZhbHVlcyBpbiAidG8iIGJlY29tZSBkZWZhdWx0IHZhbHVlcworICogd2hpY2ggd2lsbCBiZSB1c2VkIG9ubHkgaWYgbm90aGluZyBuZXcgaXMgc2V0IGluICJmcm9tIi4KKyAqCisgKiBJZiBYNTA5X1ZQX0ZMQUdfT1ZFUldSSVRFIGlzIHNldCB0aGVuIGFsbCB2YWx1ZSBhcmUgY29waWVkIGFjcm9zcyB3aGV0aGVyCisgKiB0aGV5IGFyZSBzZXQgb3Igbm90LiBGbGFncyBpcyBzdGlsbCBPcmVkIHRob3VnaC4KKyAqCisgKiBJZiBYNTA5X1ZQX0ZMQUdfUkVTRVRfRkxBR1MgaXMgc2V0IHRoZW4gdGhlIGZsYWdzIHZhbHVlIGlzIGNvcGllZCBpbnN0ZWFkCisgKiBvZiBPUmVkLgorICoKKyAqIElmIFg1MDlfVlBfRkxBR19MT0NLRUQgaXMgc2V0IHRoZW4gbm8gdmFsdWVzIGFyZSBjb3BpZWQuCisgKgorICogSWYgWDUwOV9WUF9GTEFHX09OQ0UgaXMgc2V0IHRoZW4gdGhlIGN1cnJlbnQgaW5oX2ZsYWdzIHNldHRpbmcgaXMgemVyb2VkCisgKiBhZnRlciB0aGUgbmV4dCBjYWxsLgorICovCisKKy8qIE1hY3JvIHRvIHRlc3QgaWYgYSBmaWVsZCBzaG91bGQgYmUgY29waWVkIGZyb20gc3JjIHRvIGRlc3QgKi8KKworI2RlZmluZSB0ZXN0X3g1MDlfdmVyaWZ5X3BhcmFtX2NvcHkoZmllbGQsIGRlZikgXAorCSh0b19vdmVyd3JpdGUgfHwgXAorCQkoKHNyYy0+ZmllbGQgIT0gZGVmKSAmJiAodG9fZGVmYXVsdCB8fCAoZGVzdC0+ZmllbGQgPT0gZGVmKSkpKQorCisvKiBNYWNybyB0byB0ZXN0IGFuZCBjb3B5IGEgZmllbGQgaWYgbmVjZXNzYXJ5ICovCisKKyNkZWZpbmUgeDUwOV92ZXJpZnlfcGFyYW1fY29weShmaWVsZCwgZGVmKSBcCisJaWYgKHRlc3RfeDUwOV92ZXJpZnlfcGFyYW1fY29weShmaWVsZCwgZGVmKSkgXAorCQlkZXN0LT5maWVsZCA9IHNyYy0+ZmllbGQKKwkJCisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9pbmhlcml0KFg1MDlfVkVSSUZZX1BBUkFNICpkZXN0LAorCQkJCQkJY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKnNyYykKKwl7CisJdW5zaWduZWQgbG9uZyBpbmhfZmxhZ3M7CisJaW50IHRvX2RlZmF1bHQsIHRvX292ZXJ3cml0ZTsKKwlpZiAoIXNyYykKKwkJcmV0dXJuIDE7CisJaW5oX2ZsYWdzID0gZGVzdC0+aW5oX2ZsYWdzIHwgc3JjLT5pbmhfZmxhZ3M7CisKKwlpZiAoaW5oX2ZsYWdzICYgWDUwOV9WUF9GTEFHX09OQ0UpCisJCWRlc3QtPmluaF9mbGFncyA9IDA7CisKKwlpZiAoaW5oX2ZsYWdzICYgWDUwOV9WUF9GTEFHX0xPQ0tFRCkKKwkJcmV0dXJuIDE7CisKKwlpZiAoaW5oX2ZsYWdzICYgWDUwOV9WUF9GTEFHX0RFRkFVTFQpCisJCXRvX2RlZmF1bHQgPSAxOworCWVsc2UKKwkJdG9fZGVmYXVsdCA9IDA7CisKKwlpZiAoaW5oX2ZsYWdzICYgWDUwOV9WUF9GTEFHX09WRVJXUklURSkKKwkJdG9fb3ZlcndyaXRlID0gMTsKKwllbHNlCisJCXRvX292ZXJ3cml0ZSA9IDA7CisKKwl4NTA5X3ZlcmlmeV9wYXJhbV9jb3B5KHB1cnBvc2UsIDApOworCXg1MDlfdmVyaWZ5X3BhcmFtX2NvcHkodHJ1c3QsIDApOworCXg1MDlfdmVyaWZ5X3BhcmFtX2NvcHkoZGVwdGgsIC0xKTsKKworCS8qIElmIG92ZXJ3cml0ZSBvciBjaGVjayB0aW1lIG5vdCBzZXQsIGNvcHkgYWNyb3NzICovCisKKwlpZiAodG9fb3ZlcndyaXRlIHx8ICEoZGVzdC0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19VU0VfQ0hFQ0tfVElNRSkpCisJCXsKKwkJZGVzdC0+Y2hlY2tfdGltZSA9IHNyYy0+Y2hlY2tfdGltZTsKKwkJZGVzdC0+ZmxhZ3MgJj0gflg1MDlfVl9GTEFHX1VTRV9DSEVDS19USU1FOworCQkvKiBEb24ndCBuZWVkIHRvIGNvcHkgZmxhZzogdGhhdCBpcyBkb25lIGJlbG93ICovCisJCX0KKworCWlmIChpbmhfZmxhZ3MgJiBYNTA5X1ZQX0ZMQUdfUkVTRVRfRkxBR1MpCisJCWRlc3QtPmZsYWdzID0gMDsKKworCWRlc3QtPmZsYWdzIHw9IHNyYy0+ZmxhZ3M7CisKKwlpZiAodGVzdF94NTA5X3ZlcmlmeV9wYXJhbV9jb3B5KHBvbGljaWVzLCBOVUxMKSkKKwkJeworCQlpZiAoIVg1MDlfVkVSSUZZX1BBUkFNX3NldDFfcG9saWNpZXMoZGVzdCwgc3JjLT5wb2xpY2llcykpCisJCQlyZXR1cm4gMDsKKwkJfQorCisJcmV0dXJuIDE7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0MShYNTA5X1ZFUklGWV9QQVJBTSAqdG8sCisJCQkJCQljb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqZnJvbSkKKwl7CisJdW5zaWduZWQgbG9uZyBzYXZlX2ZsYWdzID0gdG8tPmluaF9mbGFnczsKKwlpbnQgcmV0OworCXRvLT5pbmhfZmxhZ3MgfD0gWDUwOV9WUF9GTEFHX0RFRkFVTFQ7CisJcmV0ID0gWDUwOV9WRVJJRllfUEFSQU1faW5oZXJpdCh0bywgZnJvbSk7CisJdG8tPmluaF9mbGFncyA9IHNhdmVfZmxhZ3M7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXQxX25hbWUoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCBjb25zdCBjaGFyICpuYW1lKQorCXsKKwlpZiAocGFyYW0tPm5hbWUpCisJCU9QRU5TU0xfZnJlZShwYXJhbS0+bmFtZSk7CisJcGFyYW0tPm5hbWUgPSBCVUZfc3RyZHVwKG5hbWUpOworCWlmIChwYXJhbS0+bmFtZSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQorCitpbnQgWDUwOV9WRVJJRllfUEFSQU1fc2V0X2ZsYWdzKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJcGFyYW0tPmZsYWdzIHw9IGZsYWdzOworCWlmIChmbGFncyAmIFg1MDlfVl9GTEFHX1BPTElDWV9NQVNLKQorCQlwYXJhbS0+ZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfUE9MSUNZX0NIRUNLOworCXJldHVybiAxOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2NsZWFyX2ZsYWdzKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJcGFyYW0tPmZsYWdzICY9IH5mbGFnczsKKwlyZXR1cm4gMTsKKwl9CisKK3Vuc2lnbmVkIGxvbmcgWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2ZsYWdzKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSkKKwl7CisJcmV0dXJuIHBhcmFtLT5mbGFnczsKKwl9CisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfcHVycG9zZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGludCBwdXJwb3NlKQorCXsKKwlyZXR1cm4gWDUwOV9QVVJQT1NFX3NldCgmcGFyYW0tPnB1cnBvc2UsIHB1cnBvc2UpOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF90cnVzdChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGludCB0cnVzdCkKKwl7CisJcmV0dXJuIFg1MDlfVFJVU1Rfc2V0KCZwYXJhbS0+dHJ1c3QsIHRydXN0KTsKKwl9CisKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgaW50IGRlcHRoKQorCXsKKwlwYXJhbS0+ZGVwdGggPSBkZXB0aDsKKwl9CisKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fc2V0X3RpbWUoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCB0aW1lX3QgdCkKKwl7CisJcGFyYW0tPmNoZWNrX3RpbWUgPSB0OworCXBhcmFtLT5mbGFncyB8PSBYNTA5X1ZfRkxBR19VU0VfQ0hFQ0tfVElNRTsKKwl9CisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9hZGQwX3BvbGljeShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIEFTTjFfT0JKRUNUICpwb2xpY3kpCisJeworCWlmICghcGFyYW0tPnBvbGljaWVzKQorCQl7CisJCXBhcmFtLT5wb2xpY2llcyA9IHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCk7CisJCWlmICghcGFyYW0tPnBvbGljaWVzKQorCQkJcmV0dXJuIDA7CisJCX0KKwlpZiAoIXNrX0FTTjFfT0JKRUNUX3B1c2gocGFyYW0tPnBvbGljaWVzLCBwb2xpY3kpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXQxX3BvbGljaWVzKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgCisJCQkJCVNUQUNLX09GKEFTTjFfT0JKRUNUKSAqcG9saWNpZXMpCisJeworCWludCBpOworCUFTTjFfT0JKRUNUICpvaWQsICpkb2lkOworCWlmICghcGFyYW0pCisJCXJldHVybiAwOworCWlmIChwYXJhbS0+cG9saWNpZXMpCisJCXNrX0FTTjFfT0JKRUNUX3BvcF9mcmVlKHBhcmFtLT5wb2xpY2llcywgQVNOMV9PQkpFQ1RfZnJlZSk7CisKKwlpZiAoIXBvbGljaWVzKQorCQl7CisJCXBhcmFtLT5wb2xpY2llcyA9IE5VTEw7CisJCXJldHVybiAxOworCQl9CisKKwlwYXJhbS0+cG9saWNpZXMgPSBza19BU04xX09CSkVDVF9uZXdfbnVsbCgpOworCWlmICghcGFyYW0tPnBvbGljaWVzKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBza19BU04xX09CSkVDVF9udW0ocG9saWNpZXMpOyBpKyspCisJCXsKKwkJb2lkID0gc2tfQVNOMV9PQkpFQ1RfdmFsdWUocG9saWNpZXMsIGkpOworCQlkb2lkID0gT0JKX2R1cChvaWQpOworCQlpZiAoIWRvaWQpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFza19BU04xX09CSkVDVF9wdXNoKHBhcmFtLT5wb2xpY2llcywgZG9pZCkpCisJCQl7CisJCQlBU04xX09CSkVDVF9mcmVlKGRvaWQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlwYXJhbS0+ZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfUE9MSUNZX0NIRUNLOworCXJldHVybiAxOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2dldF9kZXB0aChjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pCisJeworCXJldHVybiBwYXJhbS0+ZGVwdGg7CisJfQorCisvKiBEZWZhdWx0IHZlcmlmeSBwYXJhbWV0ZXJzOiB0aGVzZSBhcmUgdXNlZCBmb3IgdmFyaW91cworICogYXBwbGljYXRpb25zIGFuZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgdXNlciBzcGVjaWZpZWQgdGFibGUuCisgKiBOQjogdGhlICduYW1lJyBmaWVsZCAqbXVzdCogYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyIGJlY2F1c2UgaXQKKyAqIHdpbGwgYmUgc2VhcmNoZWQgdXNpbmcgT0JKX3NlYXJjaC4KKyAqLworCitzdGF0aWMgY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gZGVmYXVsdF90YWJsZVtdID0geworCXsKKwkiZGVmYXVsdCIsCS8qIFg1MDkgZGVmYXVsdCBwYXJhbWV0ZXJzICovCisJMCwJCS8qIENoZWNrIHRpbWUgKi8KKwkwLAkJLyogaW50ZXJuYWwgZmxhZ3MgKi8KKwkwLAkJLyogZmxhZ3MgKi8KKwkwLAkJLyogcHVycG9zZSAqLworCTAsCQkvKiB0cnVzdCAqLworCTEwMCwJCS8qIGRlcHRoICovCisJTlVMTAkJLyogcG9saWNpZXMgKi8KKwl9LAorCXsKKwkicGtjczciLAkJCS8qIFMvTUlNRSBzaWduIHBhcmFtZXRlcnMgKi8KKwkwLAkJCQkvKiBDaGVjayB0aW1lICovCisJMCwJCQkJLyogaW50ZXJuYWwgZmxhZ3MgKi8KKwkwLAkJCQkvKiBmbGFncyAqLworCVg1MDlfUFVSUE9TRV9TTUlNRV9TSUdOLAkvKiBwdXJwb3NlICovCisJWDUwOV9UUlVTVF9FTUFJTCwJCS8qIHRydXN0ICovCisJLTEsCQkJCS8qIGRlcHRoICovCisJTlVMTAkJCQkvKiBwb2xpY2llcyAqLworCX0sCisJeworCSJzbWltZV9zaWduIiwJCQkvKiBTL01JTUUgc2lnbiBwYXJhbWV0ZXJzICovCisJMCwJCQkJLyogQ2hlY2sgdGltZSAqLworCTAsCQkJCS8qIGludGVybmFsIGZsYWdzICovCisJMCwJCQkJLyogZmxhZ3MgKi8KKwlYNTA5X1BVUlBPU0VfU01JTUVfU0lHTiwJLyogcHVycG9zZSAqLworCVg1MDlfVFJVU1RfRU1BSUwsCQkvKiB0cnVzdCAqLworCS0xLAkJCQkvKiBkZXB0aCAqLworCU5VTEwJCQkJLyogcG9saWNpZXMgKi8KKwl9LAorCXsKKwkic3NsX2NsaWVudCIsCQkJLyogU1NML1RMUyBjbGllbnQgcGFyYW1ldGVycyAqLworCTAsCQkJCS8qIENoZWNrIHRpbWUgKi8KKwkwLAkJCQkvKiBpbnRlcm5hbCBmbGFncyAqLworCTAsCQkJCS8qIGZsYWdzICovCisJWDUwOV9QVVJQT1NFX1NTTF9DTElFTlQsCS8qIHB1cnBvc2UgKi8KKwlYNTA5X1RSVVNUX1NTTF9DTElFTlQsCQkvKiB0cnVzdCAqLworCS0xLAkJCQkvKiBkZXB0aCAqLworCU5VTEwJCQkJLyogcG9saWNpZXMgKi8KKwl9LAorCXsKKwkic3NsX3NlcnZlciIsCQkJLyogU1NML1RMUyBzZXJ2ZXIgcGFyYW1ldGVycyAqLworCTAsCQkJCS8qIENoZWNrIHRpbWUgKi8KKwkwLAkJCQkvKiBpbnRlcm5hbCBmbGFncyAqLworCTAsCQkJCS8qIGZsYWdzICovCisJWDUwOV9QVVJQT1NFX1NTTF9TRVJWRVIsCS8qIHB1cnBvc2UgKi8KKwlYNTA5X1RSVVNUX1NTTF9TRVJWRVIsCQkvKiB0cnVzdCAqLworCS0xLAkJCQkvKiBkZXB0aCAqLworCU5VTEwJCQkJLyogcG9saWNpZXMgKi8KKwl9fTsKKworc3RhdGljIFNUQUNLX09GKFg1MDlfVkVSSUZZX1BBUkFNKSAqcGFyYW1fdGFibGUgPSBOVUxMOworCitzdGF0aWMgaW50IHRhYmxlX2NtcChjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqYSwgY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKmIpCisKKwl7CisJcmV0dXJuIHN0cmNtcChhLT5uYW1lLCBiLT5uYW1lKTsKKwl9CisKK0RFQ0xBUkVfT0JKX0JTRUFSQ0hfQ01QX0ZOKFg1MDlfVkVSSUZZX1BBUkFNLCBYNTA5X1ZFUklGWV9QQVJBTSwKKwkJCSAgIHRhYmxlKTsKK0lNUExFTUVOVF9PQkpfQlNFQVJDSF9DTVBfRk4oWDUwOV9WRVJJRllfUEFSQU0sIFg1MDlfVkVSSUZZX1BBUkFNLAorCQkJICAgICB0YWJsZSk7CisKK3N0YXRpYyBpbnQgcGFyYW1fY21wKGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICogY29uc3QgKmEsCisJCQljb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqIGNvbnN0ICpiKQorCXsKKwlyZXR1cm4gc3RyY21wKCgqYSktPm5hbWUsICgqYiktPm5hbWUpOworCX0KKworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2FkZDBfdGFibGUoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtKQorCXsKKwlpbnQgaWR4OworCVg1MDlfVkVSSUZZX1BBUkFNICpwdG1wOworCWlmICghcGFyYW1fdGFibGUpCisJCXsKKwkJcGFyYW1fdGFibGUgPSBza19YNTA5X1ZFUklGWV9QQVJBTV9uZXcocGFyYW1fY21wKTsKKwkJaWYgKCFwYXJhbV90YWJsZSkKKwkJCXJldHVybiAwOworCQl9CisJZWxzZQorCQl7CisJCWlkeCA9IHNrX1g1MDlfVkVSSUZZX1BBUkFNX2ZpbmQocGFyYW1fdGFibGUsIHBhcmFtKTsKKwkJaWYgKGlkeCAhPSAtMSkKKwkJCXsKKwkJCXB0bXAgPSBza19YNTA5X1ZFUklGWV9QQVJBTV92YWx1ZShwYXJhbV90YWJsZSwgaWR4KTsKKwkJCVg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUocHRtcCk7CisJCQkodm9pZClza19YNTA5X1ZFUklGWV9QQVJBTV9kZWxldGUocGFyYW1fdGFibGUsIGlkeCk7CisJCQl9CisJCX0KKwlpZiAoIXNrX1g1MDlfVkVSSUZZX1BBUkFNX3B1c2gocGFyYW1fdGFibGUsIHBhcmFtKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7CisJfQorCitjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9WRVJJRllfUEFSQU1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCisJeworCWludCBpZHg7CisJWDUwOV9WRVJJRllfUEFSQU0gcG07CisKKwlwbS5uYW1lID0gKGNoYXIgKiluYW1lOworCWlmIChwYXJhbV90YWJsZSkKKwkJeworCQlpZHggPSBza19YNTA5X1ZFUklGWV9QQVJBTV9maW5kKHBhcmFtX3RhYmxlLCAmcG0pOworCQlpZiAoaWR4ICE9IC0xKQorCQkJcmV0dXJuIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3ZhbHVlKHBhcmFtX3RhYmxlLCBpZHgpOworCQl9CisJcmV0dXJuIE9CSl9ic2VhcmNoX3RhYmxlKCZwbSwgZGVmYXVsdF90YWJsZSwKKwkJCSAgIHNpemVvZihkZWZhdWx0X3RhYmxlKS9zaXplb2YoWDUwOV9WRVJJRllfUEFSQU0pKTsKKwl9CisKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fdGFibGVfY2xlYW51cCh2b2lkKQorCXsKKwlpZiAocGFyYW1fdGFibGUpCisJCXNrX1g1MDlfVkVSSUZZX1BBUkFNX3BvcF9mcmVlKHBhcmFtX3RhYmxlLAorCQkJCQkJWDUwOV9WRVJJRllfUEFSQU1fZnJlZSk7CisJcGFyYW1fdGFibGUgPSBOVUxMOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDljc2V0LmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5Y3NldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDlkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5Y3NldC5jCkBAIC0wLDAgKzEsMTcwIEBACisvKiBjcnlwdG8veDUwOS94NTA5Y3NldC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKK2ludCBYNTA5X0NSTF9zZXRfdmVyc2lvbihYNTA5X0NSTCAqeCwgbG9uZyB2ZXJzaW9uKQorCXsKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKHgtPmNybC0+dmVyc2lvbiA9PSBOVUxMKQorCQl7CisJCWlmICgoeC0+Y3JsLT52ZXJzaW9uPU1fQVNOMV9JTlRFR0VSX25ldygpKSA9PSBOVUxMKQorCQkJcmV0dXJuKDApOworCQl9CisJcmV0dXJuKEFTTjFfSU5URUdFUl9zZXQoeC0+Y3JsLT52ZXJzaW9uLHZlcnNpb24pKTsKKwl9CisKK2ludCBYNTA5X0NSTF9zZXRfaXNzdWVyX25hbWUoWDUwOV9DUkwgKngsIFg1MDlfTkFNRSAqbmFtZSkKKwl7CisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5jcmwgPT0gTlVMTCkpIHJldHVybigwKTsKKwlyZXR1cm4oWDUwOV9OQU1FX3NldCgmeC0+Y3JsLT5pc3N1ZXIsbmFtZSkpOworCX0KKworCitpbnQgWDUwOV9DUkxfc2V0X2xhc3RVcGRhdGUoWDUwOV9DUkwgKngsIGNvbnN0IEFTTjFfVElNRSAqdG0pCisJeworCUFTTjFfVElNRSAqaW47CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaW49eC0+Y3JsLT5sYXN0VXBkYXRlOworCWlmIChpbiAhPSB0bSkKKwkJeworCQlpbj1NX0FTTjFfVElNRV9kdXAodG0pOworCQlpZiAoaW4gIT0gTlVMTCkKKwkJCXsKKwkJCU1fQVNOMV9USU1FX2ZyZWUoeC0+Y3JsLT5sYXN0VXBkYXRlKTsKKwkJCXgtPmNybC0+bGFzdFVwZGF0ZT1pbjsKKwkJCX0KKwkJfQorCXJldHVybihpbiAhPSBOVUxMKTsKKwl9CisKK2ludCBYNTA5X0NSTF9zZXRfbmV4dFVwZGF0ZShYNTA5X0NSTCAqeCwgY29uc3QgQVNOMV9USU1FICp0bSkKKwl7CisJQVNOMV9USU1FICppbjsKKworCWlmICh4ID09IE5VTEwpIHJldHVybigwKTsKKwlpbj14LT5jcmwtPm5leHRVcGRhdGU7CisJaWYgKGluICE9IHRtKQorCQl7CisJCWluPU1fQVNOMV9USU1FX2R1cCh0bSk7CisJCWlmIChpbiAhPSBOVUxMKQorCQkJeworCQkJTV9BU04xX1RJTUVfZnJlZSh4LT5jcmwtPm5leHRVcGRhdGUpOworCQkJeC0+Y3JsLT5uZXh0VXBkYXRlPWluOworCQkJfQorCQl9CisJcmV0dXJuKGluICE9IE5VTEwpOworCX0KKworaW50IFg1MDlfQ1JMX3NvcnQoWDUwOV9DUkwgKmMpCisJeworCWludCBpOworCVg1MDlfUkVWT0tFRCAqcjsKKwkvKiBzb3J0IHRoZSBkYXRhIHNvIGl0IHdpbGwgYmUgd3JpdHRlbiBpbiBzZXJpYWwKKwkgKiBudW1iZXIgb3JkZXIgKi8KKwlza19YNTA5X1JFVk9LRURfc29ydChjLT5jcmwtPnJldm9rZWQpOworCWZvciAoaT0wOyBpPHNrX1g1MDlfUkVWT0tFRF9udW0oYy0+Y3JsLT5yZXZva2VkKTsgaSsrKQorCQl7CisJCXI9c2tfWDUwOV9SRVZPS0VEX3ZhbHVlKGMtPmNybC0+cmV2b2tlZCxpKTsKKwkJci0+c2VxdWVuY2U9aTsKKwkJfQorCWMtPmNybC0+ZW5jLm1vZGlmaWVkID0gMTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBYNTA5X1JFVk9LRURfc2V0X3Jldm9jYXRpb25EYXRlKFg1MDlfUkVWT0tFRCAqeCwgQVNOMV9USU1FICp0bSkKKwl7CisJQVNOMV9USU1FICppbjsKKworCWlmICh4ID09IE5VTEwpIHJldHVybigwKTsKKwlpbj14LT5yZXZvY2F0aW9uRGF0ZTsKKwlpZiAoaW4gIT0gdG0pCisJCXsKKwkJaW49TV9BU04xX1RJTUVfZHVwKHRtKTsKKwkJaWYgKGluICE9IE5VTEwpCisJCQl7CisJCQlNX0FTTjFfVElNRV9mcmVlKHgtPnJldm9jYXRpb25EYXRlKTsKKwkJCXgtPnJldm9jYXRpb25EYXRlPWluOworCQkJfQorCQl9CisJcmV0dXJuKGluICE9IE5VTEwpOworCX0KKworaW50IFg1MDlfUkVWT0tFRF9zZXRfc2VyaWFsTnVtYmVyKFg1MDlfUkVWT0tFRCAqeCwgQVNOMV9JTlRFR0VSICpzZXJpYWwpCisJeworCUFTTjFfSU5URUdFUiAqaW47CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaW49eC0+c2VyaWFsTnVtYmVyOworCWlmIChpbiAhPSBzZXJpYWwpCisJCXsKKwkJaW49TV9BU04xX0lOVEVHRVJfZHVwKHNlcmlhbCk7CisJCWlmIChpbiAhPSBOVUxMKQorCQkJeworCQkJTV9BU04xX0lOVEVHRVJfZnJlZSh4LT5zZXJpYWxOdW1iZXIpOworCQkJeC0+c2VyaWFsTnVtYmVyPWluOworCQkJfQorCQl9CisJcmV0dXJuKGluICE9IE5VTEwpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDluYW1lLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YmM0ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5bmFtZS5jCkBAIC0wLDAgKzEsMzgzIEBACisvKiBjcnlwdG8veDUwOS94NTA5bmFtZS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3RhY2suaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKK2ludCBYNTA5X05BTUVfZ2V0X3RleHRfYnlfTklEKFg1MDlfTkFNRSAqbmFtZSwgaW50IG5pZCwgY2hhciAqYnVmLCBpbnQgbGVuKQorCXsKKwlBU04xX09CSkVDVCAqb2JqOworCisJb2JqPU9CSl9uaWQyb2JqKG5pZCk7CisJaWYgKG9iaiA9PSBOVUxMKSByZXR1cm4oLTEpOworCXJldHVybihYNTA5X05BTUVfZ2V0X3RleHRfYnlfT0JKKG5hbWUsb2JqLGJ1ZixsZW4pKTsKKwl9CisKK2ludCBYNTA5X05BTUVfZ2V0X3RleHRfYnlfT0JKKFg1MDlfTkFNRSAqbmFtZSwgQVNOMV9PQkpFQ1QgKm9iaiwgY2hhciAqYnVmLAorCSAgICAgaW50IGxlbikKKwl7CisJaW50IGk7CisJQVNOMV9TVFJJTkcgKmRhdGE7CisKKwlpPVg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfT0JKKG5hbWUsb2JqLC0xKTsKKwlpZiAoaSA8IDApIHJldHVybigtMSk7CisJZGF0YT1YNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEoWDUwOV9OQU1FX2dldF9lbnRyeShuYW1lLGkpKTsKKwlpPShkYXRhLT5sZW5ndGggPiAobGVuLTEpKT8obGVuLTEpOmRhdGEtPmxlbmd0aDsKKwlpZiAoYnVmID09IE5VTEwpIHJldHVybihkYXRhLT5sZW5ndGgpOworCW1lbWNweShidWYsZGF0YS0+ZGF0YSxpKTsKKwlidWZbaV09J1wwJzsKKwlyZXR1cm4oaSk7CisJfQorCitpbnQgWDUwOV9OQU1FX2VudHJ5X2NvdW50KFg1MDlfTkFNRSAqbmFtZSkKKwl7CisJaWYgKG5hbWUgPT0gTlVMTCkgcmV0dXJuKDApOworCXJldHVybihza19YNTA5X05BTUVfRU5UUllfbnVtKG5hbWUtPmVudHJpZXMpKTsKKwl9CisKK2ludCBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChYNTA5X05BTUUgKm5hbWUsIGludCBuaWQsIGludCBsYXN0cG9zKQorCXsKKwlBU04xX09CSkVDVCAqb2JqOworCisJb2JqPU9CSl9uaWQyb2JqKG5pZCk7CisJaWYgKG9iaiA9PSBOVUxMKSByZXR1cm4oLTIpOworCXJldHVybihYNTA5X05BTUVfZ2V0X2luZGV4X2J5X09CSihuYW1lLG9iaixsYXN0cG9zKSk7CisJfQorCisvKiBOT1RFOiB5b3Ugc2hvdWxkIGJlIHBhc3NzaW5nIC0xLCBub3QgMCBhcyBsYXN0cG9zICovCitpbnQgWDUwOV9OQU1FX2dldF9pbmRleF9ieV9PQkooWDUwOV9OQU1FICpuYW1lLCBBU04xX09CSkVDVCAqb2JqLAorCSAgICAgaW50IGxhc3Rwb3MpCisJeworCWludCBuOworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqc2s7CisKKwlpZiAobmFtZSA9PSBOVUxMKSByZXR1cm4oLTEpOworCWlmIChsYXN0cG9zIDwgMCkKKwkJbGFzdHBvcz0gLTE7CisJc2s9bmFtZS0+ZW50cmllczsKKwluPXNrX1g1MDlfTkFNRV9FTlRSWV9udW0oc2spOworCWZvciAobGFzdHBvcysrOyBsYXN0cG9zIDwgbjsgbGFzdHBvcysrKQorCQl7CisJCW5lPXNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShzayxsYXN0cG9zKTsKKwkJaWYgKE9CSl9jbXAobmUtPm9iamVjdCxvYmopID09IDApCisJCQlyZXR1cm4obGFzdHBvcyk7CisJCX0KKwlyZXR1cm4oLTEpOworCX0KKworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfZ2V0X2VudHJ5KFg1MDlfTkFNRSAqbmFtZSwgaW50IGxvYykKKwl7CisJaWYobmFtZSA9PSBOVUxMIHx8IHNrX1g1MDlfTkFNRV9FTlRSWV9udW0obmFtZS0+ZW50cmllcykgPD0gbG9jCisJICAgfHwgbG9jIDwgMCkKKwkJcmV0dXJuKE5VTEwpOworCWVsc2UKKwkJcmV0dXJuKHNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShuYW1lLT5lbnRyaWVzLGxvYykpOworCX0KKworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfZGVsZXRlX2VudHJ5KFg1MDlfTkFNRSAqbmFtZSwgaW50IGxvYykKKwl7CisJWDUwOV9OQU1FX0VOVFJZICpyZXQ7CisJaW50IGksbixzZXRfcHJldixzZXRfbmV4dDsKKwlTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICpzazsKKworCWlmIChuYW1lID09IE5VTEwgfHwgc2tfWDUwOV9OQU1FX0VOVFJZX251bShuYW1lLT5lbnRyaWVzKSA8PSBsb2MKKwkgICAgfHwgbG9jIDwgMCkKKwkJcmV0dXJuKE5VTEwpOworCXNrPW5hbWUtPmVudHJpZXM7CisJcmV0PXNrX1g1MDlfTkFNRV9FTlRSWV9kZWxldGUoc2ssbG9jKTsKKwluPXNrX1g1MDlfTkFNRV9FTlRSWV9udW0oc2spOworCW5hbWUtPm1vZGlmaWVkPTE7CisJaWYgKGxvYyA9PSBuKSByZXR1cm4ocmV0KTsKKworCS8qIGVsc2Ugd2UgbmVlZCB0byBmaXh1cCB0aGUgc2V0IGZpZWxkICovCisJaWYgKGxvYyAhPSAwKQorCQlzZXRfcHJldj0oc2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHNrLGxvYy0xKSktPnNldDsKKwllbHNlCisJCXNldF9wcmV2PXJldC0+c2V0LTE7CisJc2V0X25leHQ9c2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHNrLGxvYyktPnNldDsKKworCS8qIHNldF9wcmV2IGlzIHRoZSBwcmV2aW91cyBzZXQKKwkgKiBzZXQgaXMgdGhlIGN1cnJlbnQgc2V0CisJICogc2V0X25leHQgaXMgdGhlIGZvbGxvd2luZworCSAqIHByZXYgIDEgMQkxIDEJMSAxCTEgMQorCSAqIHNldCAgIDEJMQkyCTIKKwkgKiBuZXh0ICAxIDEJMiAyCTIgMgkzIDIKKwkgKiBzbyBiYXNpY2FsbHkgb25seSBpZiBwcmV2IGFuZCBuZXh0IGRpZmZlciBieSAyLCB0aGVuCisJICogcmUtbnVtYmVyIGRvd24gYnkgMSAqLworCWlmIChzZXRfcHJldisxIDwgc2V0X25leHQpCisJCWZvciAoaT1sb2M7IGk8bjsgaSsrKQorCQkJc2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHNrLGkpLT5zZXQtLTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X09CSihYNTA5X05BTUUgKm5hbWUsIEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLAorCQkJdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4sIGludCBsb2MsIGludCBzZXQpCit7CisJWDUwOV9OQU1FX0VOVFJZICpuZTsKKwlpbnQgcmV0OworCW5lID0gWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV9PQkooTlVMTCwgb2JqLCB0eXBlLCBieXRlcywgbGVuKTsKKwlpZighbmUpIHJldHVybiAwOworCXJldCA9IFg1MDlfTkFNRV9hZGRfZW50cnkobmFtZSwgbmUsIGxvYywgc2V0KTsKKwlYNTA5X05BTUVfRU5UUllfZnJlZShuZSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfTklEKFg1MDlfTkFNRSAqbmFtZSwgaW50IG5pZCwgaW50IHR5cGUsCisJCQl1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbiwgaW50IGxvYywgaW50IHNldCkKK3sKKwlYNTA5X05BTUVfRU5UUlkgKm5lOworCWludCByZXQ7CisJbmUgPSBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X05JRChOVUxMLCBuaWQsIHR5cGUsIGJ5dGVzLCBsZW4pOworCWlmKCFuZSkgcmV0dXJuIDA7CisJcmV0ID0gWDUwOV9OQU1FX2FkZF9lbnRyeShuYW1lLCBuZSwgbG9jLCBzZXQpOworCVg1MDlfTkFNRV9FTlRSWV9mcmVlKG5lKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQoWDUwOV9OQU1FICpuYW1lLCBjb25zdCBjaGFyICpmaWVsZCwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbiwgaW50IGxvYywgaW50IHNldCkKK3sKKwlYNTA5X05BTUVfRU5UUlkgKm5lOworCWludCByZXQ7CisJbmUgPSBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X3R4dChOVUxMLCBmaWVsZCwgdHlwZSwgYnl0ZXMsIGxlbik7CisJaWYoIW5lKSByZXR1cm4gMDsKKwlyZXQgPSBYNTA5X05BTUVfYWRkX2VudHJ5KG5hbWUsIG5lLCBsb2MsIHNldCk7CisJWDUwOV9OQU1FX0VOVFJZX2ZyZWUobmUpOworCXJldHVybiByZXQ7Cit9CisKKy8qIGlmIHNldCBpcyAtMSwgYXBwZW5kIHRvIHByZXZpb3VzIHNldCwgMCAnYSBuZXcgb25lJywgYW5kIDEsCisgKiBwcmVwZW5kIHRvIHRoZSBndXkgd2UgYXJlIGFib3V0IHRvIHN0b21wIG9uLiAqLworaW50IFg1MDlfTkFNRV9hZGRfZW50cnkoWDUwOV9OQU1FICpuYW1lLCBYNTA5X05BTUVfRU5UUlkgKm5lLCBpbnQgbG9jLAorCSAgICAgaW50IHNldCkKKwl7CisJWDUwOV9OQU1FX0VOVFJZICpuZXdfbmFtZT1OVUxMOworCWludCBuLGksaW5jOworCVNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKnNrOworCisJaWYgKG5hbWUgPT0gTlVMTCkgcmV0dXJuKDApOworCXNrPW5hbWUtPmVudHJpZXM7CisJbj1za19YNTA5X05BTUVfRU5UUllfbnVtKHNrKTsKKwlpZiAobG9jID4gbikgbG9jPW47CisJZWxzZSBpZiAobG9jIDwgMCkgbG9jPW47CisKKwluYW1lLT5tb2RpZmllZD0xOworCisJaWYgKHNldCA9PSAtMSkKKwkJeworCQlpZiAobG9jID09IDApCisJCQl7CisJCQlzZXQ9MDsKKwkJCWluYz0xOworCQkJfQorCQllbHNlCisJCQl7CisJCQlzZXQ9c2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHNrLGxvYy0xKS0+c2V0OworCQkJaW5jPTA7CisJCQl9CisJCX0KKwllbHNlIC8qIGlmIChzZXQgPj0gMCkgKi8KKwkJeworCQlpZiAobG9jID49IG4pCisJCQl7CisJCQlpZiAobG9jICE9IDApCisJCQkJc2V0PXNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShzayxsb2MtMSktPnNldCsxOworCQkJZWxzZQorCQkJCXNldD0wOworCQkJfQorCQllbHNlCisJCQlzZXQ9c2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKHNrLGxvYyktPnNldDsKKwkJaW5jPShzZXQgPT0gMCk/MTowOworCQl9CisKKwlpZiAoKG5ld19uYW1lPVg1MDlfTkFNRV9FTlRSWV9kdXAobmUpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwluZXdfbmFtZS0+c2V0PXNldDsKKwlpZiAoIXNrX1g1MDlfTkFNRV9FTlRSWV9pbnNlcnQoc2ssbmV3X25hbWUsbG9jKSkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X05BTUVfQUREX0VOVFJZLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoaW5jKQorCQl7CisJCW49c2tfWDUwOV9OQU1FX0VOVFJZX251bShzayk7CisJCWZvciAoaT1sb2MrMTsgaTxuOyBpKyspCisJCQlza19YNTA5X05BTUVfRU5UUllfdmFsdWUoc2ssaS0xKS0+c2V0Kz0xOworCQl9CQorCXJldHVybigxKTsKK2VycjoKKwlpZiAobmV3X25hbWUgIT0gTlVMTCkKKwkJWDUwOV9OQU1FX0VOVFJZX2ZyZWUobmV3X25hbWUpOworCXJldHVybigwKTsKKwl9CisKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV90eHQoWDUwOV9OQU1FX0VOVFJZICoqbmUsCisJCWNvbnN0IGNoYXIgKmZpZWxkLCBpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pCisJeworCUFTTjFfT0JKRUNUICpvYmo7CisJWDUwOV9OQU1FX0VOVFJZICpuZW50cnk7CisKKwlvYmo9T0JKX3R4dDJvYmooZmllbGQsIDApOworCWlmIChvYmogPT0gTlVMTCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X05BTUVfRU5UUllfQ1JFQVRFX0JZX1RYVCwKKwkJCQkJCVg1MDlfUl9JTlZBTElEX0ZJRUxEX05BTUUpOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgIm5hbWU9IiwgZmllbGQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwluZW50cnkgPSBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihuZSxvYmosdHlwZSxieXRlcyxsZW4pOworCUFTTjFfT0JKRUNUX2ZyZWUob2JqKTsKKwlyZXR1cm4gbmVudHJ5OworCX0KKworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X05JRChYNTA5X05BTUVfRU5UUlkgKipuZSwgaW50IG5pZCwKKwkgICAgIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKKwl7CisJQVNOMV9PQkpFQ1QgKm9iajsKKwlYNTA5X05BTUVfRU5UUlkgKm5lbnRyeTsKKworCW9iaj1PQkpfbmlkMm9iaihuaWQpOworCWlmIChvYmogPT0gTlVMTCkKKwkJeworCQlYNTA5ZXJyKFg1MDlfRl9YNTA5X05BTUVfRU5UUllfQ1JFQVRFX0JZX05JRCxYNTA5X1JfVU5LTk9XTl9OSUQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwluZW50cnkgPSBYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihuZSxvYmosdHlwZSxieXRlcyxsZW4pOworCUFTTjFfT0JKRUNUX2ZyZWUob2JqKTsKKwlyZXR1cm4gbmVudHJ5OworCX0KKworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfRU5UUllfY3JlYXRlX2J5X09CSihYNTA5X05BTUVfRU5UUlkgKipuZSwKKwkgICAgIEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKKwl7CisJWDUwOV9OQU1FX0VOVFJZICpyZXQ7CisKKwlpZiAoKG5lID09IE5VTEwpIHx8ICgqbmUgPT0gTlVMTCkpCisJCXsKKwkJaWYgKChyZXQ9WDUwOV9OQU1FX0VOVFJZX25ldygpKSA9PSBOVUxMKQorCQkJcmV0dXJuKE5VTEwpOworCQl9CisJZWxzZQorCQlyZXQ9ICpuZTsKKworCWlmICghWDUwOV9OQU1FX0VOVFJZX3NldF9vYmplY3QocmV0LG9iaikpCisJCWdvdG8gZXJyOworCWlmICghWDUwOV9OQU1FX0VOVFJZX3NldF9kYXRhKHJldCx0eXBlLGJ5dGVzLGxlbikpCisJCWdvdG8gZXJyOworCisJaWYgKChuZSAhPSBOVUxMKSAmJiAoKm5lID09IE5VTEwpKSAqbmU9cmV0OworCXJldHVybihyZXQpOworZXJyOgorCWlmICgobmUgPT0gTlVMTCkgfHwgKHJldCAhPSAqbmUpKQorCQlYNTA5X05BTUVfRU5UUllfZnJlZShyZXQpOworCXJldHVybihOVUxMKTsKKwl9CisKK2ludCBYNTA5X05BTUVfRU5UUllfc2V0X29iamVjdChYNTA5X05BTUVfRU5UUlkgKm5lLCBBU04xX09CSkVDVCAqb2JqKQorCXsKKwlpZiAoKG5lID09IE5VTEwpIHx8IChvYmogPT0gTlVMTCkpCisJCXsKKwkJWDUwOWVycihYNTA5X0ZfWDUwOV9OQU1FX0VOVFJZX1NFVF9PQkpFQ1QsRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKDApOworCQl9CisJQVNOMV9PQkpFQ1RfZnJlZShuZS0+b2JqZWN0KTsKKwluZS0+b2JqZWN0PU9CSl9kdXAob2JqKTsKKwlyZXR1cm4oKG5lLT5vYmplY3QgPT0gTlVMTCk/MDoxKTsKKwl9CisKK2ludCBYNTA5X05BTUVfRU5UUllfc2V0X2RhdGEoWDUwOV9OQU1FX0VOVFJZICpuZSwgaW50IHR5cGUsCisJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKKwl7CisJaW50IGk7CisKKwlpZiAoKG5lID09IE5VTEwpIHx8ICgoYnl0ZXMgPT0gTlVMTCkgJiYgKGxlbiAhPSAwKSkpIHJldHVybigwKTsKKwlpZigodHlwZSA+IDApICYmICh0eXBlICYgTUJTVFJJTkdfRkxBRykpIAorCQlyZXR1cm4gQVNOMV9TVFJJTkdfc2V0X2J5X05JRCgmbmUtPnZhbHVlLCBieXRlcywKKwkJCQkJCWxlbiwgdHlwZSwKKwkJCQkJT0JKX29iajJuaWQobmUtPm9iamVjdCkpID8gMSA6IDA7CisJaWYgKGxlbiA8IDApIGxlbj1zdHJsZW4oKGNvbnN0IGNoYXIgKilieXRlcyk7CisJaT1BU04xX1NUUklOR19zZXQobmUtPnZhbHVlLGJ5dGVzLGxlbik7CisJaWYgKCFpKSByZXR1cm4oMCk7CisJaWYgKHR5cGUgIT0gVl9BU04xX1VOREVGKQorCQl7CisJCWlmICh0eXBlID09IFZfQVNOMV9BUFBfQ0hPT1NFKQorCQkJbmUtPnZhbHVlLT50eXBlPUFTTjFfUFJJTlRBQkxFX3R5cGUoYnl0ZXMsbGVuKTsKKwkJZWxzZQorCQkJbmUtPnZhbHVlLT50eXBlPXR5cGU7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCitBU04xX09CSkVDVCAqWDUwOV9OQU1FX0VOVFJZX2dldF9vYmplY3QoWDUwOV9OQU1FX0VOVFJZICpuZSkKKwl7CisJaWYgKG5lID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlyZXR1cm4obmUtPm9iamVjdCk7CisJfQorCitBU04xX1NUUklORyAqWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKFg1MDlfTkFNRV9FTlRSWSAqbmUpCisJeworCWlmIChuZSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJcmV0dXJuKG5lLT52YWx1ZSk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5cnNldC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOXJzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWY2YjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOXJzZXQuYwpAQCAtMCwwICsxLDgzIEBACisvKiBjcnlwdG8veDUwOS94NTA5cnNldC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworaW50IFg1MDlfUkVRX3NldF92ZXJzaW9uKFg1MDlfUkVRICp4LCBsb25nIHZlcnNpb24pCisJeworCWlmICh4ID09IE5VTEwpIHJldHVybigwKTsKKwlyZXR1cm4oQVNOMV9JTlRFR0VSX3NldCh4LT5yZXFfaW5mby0+dmVyc2lvbix2ZXJzaW9uKSk7CisJfQorCitpbnQgWDUwOV9SRVFfc2V0X3N1YmplY3RfbmFtZShYNTA5X1JFUSAqeCwgWDUwOV9OQU1FICpuYW1lKQorCXsKKwlpZiAoKHggPT0gTlVMTCkgfHwgKHgtPnJlcV9pbmZvID09IE5VTEwpKSByZXR1cm4oMCk7CisJcmV0dXJuKFg1MDlfTkFNRV9zZXQoJngtPnJlcV9pbmZvLT5zdWJqZWN0LG5hbWUpKTsKKwl9CisKK2ludCBYNTA5X1JFUV9zZXRfcHVia2V5KFg1MDlfUkVRICp4LCBFVlBfUEtFWSAqcGtleSkKKwl7CisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5yZXFfaW5mbyA9PSBOVUxMKSkgcmV0dXJuKDApOworCXJldHVybihYNTA5X1BVQktFWV9zZXQoJngtPnJlcV9pbmZvLT5wdWJrZXkscGtleSkpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveDUwOXNwa2kuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlzcGtpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhMjAzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDlzcGtpLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIHg1MDlzcGtpLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisKK2ludCBORVRTQ0FQRV9TUEtJX3NldF9wdWJrZXkoTkVUU0NBUEVfU1BLSSAqeCwgRVZQX1BLRVkgKnBrZXkpCit7CisJaWYgKCh4ID09IE5VTEwpIHx8ICh4LT5zcGthYyA9PSBOVUxMKSkgcmV0dXJuKDApOworCXJldHVybihYNTA5X1BVQktFWV9zZXQoJih4LT5zcGthYy0+cHVia2V5KSxwa2V5KSk7Cit9CisKK0VWUF9QS0VZICpORVRTQ0FQRV9TUEtJX2dldF9wdWJrZXkoTkVUU0NBUEVfU1BLSSAqeCkKK3sKKwlpZiAoKHggPT0gTlVMTCkgfHwgKHgtPnNwa2FjID09IE5VTEwpKQorCQlyZXR1cm4oTlVMTCk7CisJcmV0dXJuKFg1MDlfUFVCS0VZX2dldCh4LT5zcGthYy0+cHVia2V5KSk7Cit9CisKKy8qIExvYWQgYSBOZXRzY2FwZSBTUEtJIGZyb20gYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcgKi8KKworTkVUU0NBUEVfU1BLSSAqIE5FVFNDQVBFX1NQS0lfYjY0X2RlY29kZShjb25zdCBjaGFyICpzdHIsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqc3BraV9kZXI7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgc3BraV9sZW47CisJTkVUU0NBUEVfU1BLSSAqc3BraTsKKwlpZihsZW4gPD0gMCkgbGVuID0gc3RybGVuKHN0cik7CisJaWYgKCEoc3BraV9kZXIgPSBPUEVOU1NMX21hbGxvYyhsZW4gKyAxKSkpIHsKKwkJWDUwOWVycihYNTA5X0ZfTkVUU0NBUEVfU1BLSV9CNjRfREVDT0RFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlzcGtpX2xlbiA9IEVWUF9EZWNvZGVCbG9jayhzcGtpX2RlciwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzdHIsIGxlbik7CisJaWYoc3BraV9sZW4gPCAwKSB7CisJCVg1MDllcnIoWDUwOV9GX05FVFNDQVBFX1NQS0lfQjY0X0RFQ09ERSwKKwkJCQkJCVg1MDlfUl9CQVNFNjRfREVDT0RFX0VSUk9SKTsKKwkJT1BFTlNTTF9mcmVlKHNwa2lfZGVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXAgPSBzcGtpX2RlcjsKKwlzcGtpID0gZDJpX05FVFNDQVBFX1NQS0koTlVMTCwgJnAsIHNwa2lfbGVuKTsKKwlPUEVOU1NMX2ZyZWUoc3BraV9kZXIpOworCXJldHVybiBzcGtpOworfQorCisvKiBHZW5lcmF0ZSBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyBmcm9tIGFuIFNQS0kgKi8KKworY2hhciAqIE5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZShORVRTQ0FQRV9TUEtJICpzcGtpKQoreworCXVuc2lnbmVkIGNoYXIgKmRlcl9zcGtpLCAqcDsKKwljaGFyICpiNjRfc3RyOworCWludCBkZXJfbGVuOworCWRlcl9sZW4gPSBpMmRfTkVUU0NBUEVfU1BLSShzcGtpLCBOVUxMKTsKKwlkZXJfc3BraSA9IE9QRU5TU0xfbWFsbG9jKGRlcl9sZW4pOworCWI2NF9zdHIgPSBPUEVOU1NMX21hbGxvYyhkZXJfbGVuICogMik7CisJaWYoIWRlcl9zcGtpIHx8ICFiNjRfc3RyKSB7CisJCVg1MDllcnIoWDUwOV9GX05FVFNDQVBFX1NQS0lfQjY0X0VOQ09ERSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcCA9IGRlcl9zcGtpOworCWkyZF9ORVRTQ0FQRV9TUEtJKHNwa2ksICZwKTsKKwlFVlBfRW5jb2RlQmxvY2soKHVuc2lnbmVkIGNoYXIgKiliNjRfc3RyLCBkZXJfc3BraSwgZGVyX2xlbik7CisJT1BFTlNTTF9mcmVlKGRlcl9zcGtpKTsKKwlyZXR1cm4gYjY0X3N0cjsKK30KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5L3g1MDl0eXBlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5dHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODVhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94NTA5dHlwZS5jCkBAIC0wLDAgKzEsMTI1IEBACisvKiBjcnlwdG8veDUwOS94NTA5dHlwZS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworaW50IFg1MDlfY2VydGlmaWNhdGVfdHlwZShYNTA5ICp4LCBFVlBfUEtFWSAqcGtleSkKKwl7CisJRVZQX1BLRVkgKnBrOworCWludCByZXQ9MCxpOworCisJaWYgKHggPT0gTlVMTCkgcmV0dXJuKDApOworCisJaWYgKHBrZXkgPT0gTlVMTCkKKwkJcGs9WDUwOV9nZXRfcHVia2V5KHgpOworCWVsc2UKKwkJcGs9cGtleTsKKworCWlmIChwayA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwlzd2l0Y2ggKHBrLT50eXBlKQorCQl7CisJY2FzZSBFVlBfUEtFWV9SU0E6CisJCXJldD1FVlBfUEtfUlNBfEVWUF9QS1RfU0lHTjsKKy8qCQlpZiAoIXNpZ24gb25seSBleHRlbnNpb24pICovCisJCQlyZXR8PUVWUF9QS1RfRU5DOworCWJyZWFrOworCWNhc2UgRVZQX1BLRVlfRFNBOgorCQlyZXQ9RVZQX1BLX0RTQXxFVlBfUEtUX1NJR047CisJCWJyZWFrOworCWNhc2UgRVZQX1BLRVlfRUM6CisJCXJldD1FVlBfUEtfRUN8RVZQX1BLVF9TSUdOfEVWUF9QS1RfRVhDSDsKKwkJYnJlYWs7CisJY2FzZSBFVlBfUEtFWV9ESDoKKwkJcmV0PUVWUF9QS19ESHxFVlBfUEtUX0VYQ0g7CisJCWJyZWFrOwkKKwljYXNlIE5JRF9pZF9Hb3N0UjM0MTBfOTQ6CisJY2FzZSBOSURfaWRfR29zdFIzNDEwXzIwMDE6CisJCXJldD1FVlBfUEtUX0VYQ0h8RVZQX1BLVF9TSUdOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwkJfQorCisJaT1YNTA5X2dldF9zaWduYXR1cmVfdHlwZSh4KTsKKwlzd2l0Y2ggKGkpCisJCXsKKwljYXNlIEVWUF9QS0VZX1JTQToKKwkJcmV0fD1FVlBfUEtTX1JTQTsKKwkJYnJlYWs7CisJY2FzZSBFVlBfUEtFWV9EU0E6CisJCXJldHw9RVZQX1BLU19EU0E7CisJCWJyZWFrOworCWNhc2UgRVZQX1BLRVlfRUM6CisJCXJldHw9RVZQX1BLU19FQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJCX0KKworCWlmIChFVlBfUEtFWV9zaXplKHBrKSA8PSAxMDI0LzgpLyogLzggYmVjYXVzZSBpdCdzIDEwMjQgYml0cyB3ZSBsb29rCisJCQkJCSAgIGZvciwgbm90IGJ5dGVzICovCisJCXJldHw9RVZQX1BLVF9FWFA7CisJaWYocGtleT09TlVMTCkgRVZQX1BLRVlfZnJlZShwayk7CisJcmV0dXJuKHJldCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOS94X2FsbC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveF9hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmFlMzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDkveF9hbGwuYwpAQCAtMCwwICsxLDUxNSBAQAorLyogY3J5cHRvL3g1MDkveF9hbGwuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKworaW50IFg1MDlfdmVyaWZ5KFg1MDkgKmEsIEVWUF9QS0VZICpyKQorCXsKKwlyZXR1cm4oQVNOMV9pdGVtX3ZlcmlmeShBU04xX0lURU1fcnB0cihYNTA5X0NJTkYpLGEtPnNpZ19hbGcsCisJCWEtPnNpZ25hdHVyZSxhLT5jZXJ0X2luZm8scikpOworCX0KKworaW50IFg1MDlfUkVRX3ZlcmlmeShYNTA5X1JFUSAqYSwgRVZQX1BLRVkgKnIpCisJeworCXJldHVybiggQVNOMV9pdGVtX3ZlcmlmeShBU04xX0lURU1fcnB0cihYNTA5X1JFUV9JTkZPKSwKKwkJYS0+c2lnX2FsZyxhLT5zaWduYXR1cmUsYS0+cmVxX2luZm8scikpOworCX0KKworaW50IE5FVFNDQVBFX1NQS0lfdmVyaWZ5KE5FVFNDQVBFX1NQS0kgKmEsIEVWUF9QS0VZICpyKQorCXsKKwlyZXR1cm4oQVNOMV9pdGVtX3ZlcmlmeShBU04xX0lURU1fcnB0cihORVRTQ0FQRV9TUEtBQyksCisJCWEtPnNpZ19hbGdvcixhLT5zaWduYXR1cmUsYS0+c3BrYWMscikpOworCX0KKworaW50IFg1MDlfc2lnbihYNTA5ICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCkKKwl7CisJcmV0dXJuKEFTTjFfaXRlbV9zaWduKEFTTjFfSVRFTV9ycHRyKFg1MDlfQ0lORiksIHgtPmNlcnRfaW5mby0+c2lnbmF0dXJlLAorCQl4LT5zaWdfYWxnLCB4LT5zaWduYXR1cmUsIHgtPmNlcnRfaW5mbyxwa2V5LG1kKSk7CisJfQorCitpbnQgWDUwOV9SRVFfc2lnbihYNTA5X1JFUSAqeCwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQpCisJeworCXJldHVybihBU04xX2l0ZW1fc2lnbihBU04xX0lURU1fcnB0cihYNTA5X1JFUV9JTkZPKSx4LT5zaWdfYWxnLCBOVUxMLAorCQl4LT5zaWduYXR1cmUsIHgtPnJlcV9pbmZvLHBrZXksbWQpKTsKKwl9CisKK2ludCBYNTA5X0NSTF9zaWduKFg1MDlfQ1JMICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCkKKwl7CisJeC0+Y3JsLT5lbmMubW9kaWZpZWQgPSAxOworCXJldHVybihBU04xX2l0ZW1fc2lnbihBU04xX0lURU1fcnB0cihYNTA5X0NSTF9JTkZPKSx4LT5jcmwtPnNpZ19hbGcsCisJCXgtPnNpZ19hbGcsIHgtPnNpZ25hdHVyZSwgeC0+Y3JsLHBrZXksbWQpKTsKKwl9CisKK2ludCBORVRTQ0FQRV9TUEtJX3NpZ24oTkVUU0NBUEVfU1BLSSAqeCwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQpCisJeworCXJldHVybihBU04xX2l0ZW1fc2lnbihBU04xX0lURU1fcnB0cihORVRTQ0FQRV9TUEtBQyksIHgtPnNpZ19hbGdvcixOVUxMLAorCQl4LT5zaWduYXR1cmUsIHgtPnNwa2FjLHBrZXksbWQpKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK1g1MDkgKmQyaV9YNTA5X2ZwKEZJTEUgKmZwLCBYNTA5ICoqeDUwOSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfZnAoQVNOMV9JVEVNX3JwdHIoWDUwOSksIGZwLCB4NTA5KTsKKwl9CisKK2ludCBpMmRfWDUwOV9mcChGSUxFICpmcCwgWDUwOSAqeDUwOSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9pMmRfZnAoQVNOMV9JVEVNX3JwdHIoWDUwOSksIGZwLCB4NTA5KTsKKwl9CisjZW5kaWYKKworWDUwOSAqZDJpX1g1MDlfYmlvKEJJTyAqYnAsIFg1MDkgKip4NTA5KQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2QyaV9iaW8oQVNOMV9JVEVNX3JwdHIoWDUwOSksIGJwLCB4NTA5KTsKKwl9CisKK2ludCBpMmRfWDUwOV9iaW8oQklPICpicCwgWDUwOSAqeDUwOSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9pMmRfYmlvKEFTTjFfSVRFTV9ycHRyKFg1MDkpLCBicCwgeDUwOSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitYNTA5X0NSTCAqZDJpX1g1MDlfQ1JMX2ZwKEZJTEUgKmZwLCBYNTA5X0NSTCAqKmNybCkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfZnAoQVNOMV9JVEVNX3JwdHIoWDUwOV9DUkwpLCBmcCwgY3JsKTsKKwl9CisKK2ludCBpMmRfWDUwOV9DUkxfZnAoRklMRSAqZnAsIFg1MDlfQ1JMICpjcmwpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2ZwKEFTTjFfSVRFTV9ycHRyKFg1MDlfQ1JMKSwgZnAsIGNybCk7CisJfQorI2VuZGlmCisKK1g1MDlfQ1JMICpkMmlfWDUwOV9DUkxfYmlvKEJJTyAqYnAsIFg1MDlfQ1JMICoqY3JsKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2QyaV9iaW8oQVNOMV9JVEVNX3JwdHIoWDUwOV9DUkwpLCBicCwgY3JsKTsKKwl9CisKK2ludCBpMmRfWDUwOV9DUkxfYmlvKEJJTyAqYnAsIFg1MDlfQ1JMICpjcmwpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihYNTA5X0NSTCksIGJwLCBjcmwpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorUEtDUzcgKmQyaV9QS0NTN19mcChGSUxFICpmcCwgUEtDUzcgKipwNykKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfZnAoQVNOMV9JVEVNX3JwdHIoUEtDUzcpLCBmcCwgcDcpOworCX0KKworaW50IGkyZF9QS0NTN19mcChGSUxFICpmcCwgUEtDUzcgKnA3KQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9mcChBU04xX0lURU1fcnB0cihQS0NTNyksIGZwLCBwNyk7CisJfQorI2VuZGlmCisKK1BLQ1M3ICpkMmlfUEtDUzdfYmlvKEJJTyAqYnAsIFBLQ1M3ICoqcDcpCisJeworCXJldHVybiBBU04xX2l0ZW1fZDJpX2JpbyhBU04xX0lURU1fcnB0cihQS0NTNyksIGJwLCBwNyk7CisJfQorCitpbnQgaTJkX1BLQ1M3X2JpbyhCSU8gKmJwLCBQS0NTNyAqcDcpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihQS0NTNyksIGJwLCBwNyk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitYNTA5X1JFUSAqZDJpX1g1MDlfUkVRX2ZwKEZJTEUgKmZwLCBYNTA5X1JFUSAqKnJlcSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfZnAoQVNOMV9JVEVNX3JwdHIoWDUwOV9SRVEpLCBmcCwgcmVxKTsKKwl9CisKK2ludCBpMmRfWDUwOV9SRVFfZnAoRklMRSAqZnAsIFg1MDlfUkVRICpyZXEpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2ZwKEFTTjFfSVRFTV9ycHRyKFg1MDlfUkVRKSwgZnAsIHJlcSk7CisJfQorI2VuZGlmCisKK1g1MDlfUkVRICpkMmlfWDUwOV9SRVFfYmlvKEJJTyAqYnAsIFg1MDlfUkVRICoqcmVxKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2QyaV9iaW8oQVNOMV9JVEVNX3JwdHIoWDUwOV9SRVEpLCBicCwgcmVxKTsKKwl9CisKK2ludCBpMmRfWDUwOV9SRVFfYmlvKEJJTyAqYnAsIFg1MDlfUkVRICpyZXEpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihYNTA5X1JFUSksIGJwLCByZXEpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitSU0EgKmQyaV9SU0FQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBSU0EgKipyc2EpCisJeworCXJldHVybiBBU04xX2l0ZW1fZDJpX2ZwKEFTTjFfSVRFTV9ycHRyKFJTQVByaXZhdGVLZXkpLCBmcCwgcnNhKTsKKwl9CisKK2ludCBpMmRfUlNBUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgUlNBICpyc2EpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2ZwKEFTTjFfSVRFTV9ycHRyKFJTQVByaXZhdGVLZXkpLCBmcCwgcnNhKTsKKwl9CisKK1JTQSAqZDJpX1JTQVB1YmxpY0tleV9mcChGSUxFICpmcCwgUlNBICoqcnNhKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2QyaV9mcChBU04xX0lURU1fcnB0cihSU0FQdWJsaWNLZXkpLCBmcCwgcnNhKTsKKwl9CisKKworUlNBICpkMmlfUlNBX1BVQktFWV9mcChGSUxFICpmcCwgUlNBICoqcnNhKQorCXsKKwlyZXR1cm4gQVNOMV9kMmlfZnAoKHZvaWQgKigqKSh2b2lkKSkKKwkJCSAgIFJTQV9uZXcsKEQySV9PRih2b2lkKSlkMmlfUlNBX1BVQktFWSwgZnAsCisJCQkgICAodm9pZCAqKilyc2EpOworCX0KKworaW50IGkyZF9SU0FQdWJsaWNLZXlfZnAoRklMRSAqZnAsIFJTQSAqcnNhKQorCXsKKwlyZXR1cm4gQVNOMV9pdGVtX2kyZF9mcChBU04xX0lURU1fcnB0cihSU0FQdWJsaWNLZXkpLCBmcCwgcnNhKTsKKwl9CisKK2ludCBpMmRfUlNBX1BVQktFWV9mcChGSUxFICpmcCwgUlNBICpyc2EpCisJeworCXJldHVybiBBU04xX2kyZF9mcCgoSTJEX09GKHZvaWQpKWkyZF9SU0FfUFVCS0VZLGZwLHJzYSk7CisJfQorI2VuZGlmCisKK1JTQSAqZDJpX1JTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIFJTQSAqKnJzYSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfYmlvKEFTTjFfSVRFTV9ycHRyKFJTQVByaXZhdGVLZXkpLCBicCwgcnNhKTsKKwl9CisKK2ludCBpMmRfUlNBUHJpdmF0ZUtleV9iaW8oQklPICpicCwgUlNBICpyc2EpCisJeworCXJldHVybiBBU04xX2l0ZW1faTJkX2JpbyhBU04xX0lURU1fcnB0cihSU0FQcml2YXRlS2V5KSwgYnAsIHJzYSk7CisJfQorCitSU0EgKmQyaV9SU0FQdWJsaWNLZXlfYmlvKEJJTyAqYnAsIFJTQSAqKnJzYSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9kMmlfYmlvKEFTTjFfSVRFTV9ycHRyKFJTQVB1YmxpY0tleSksIGJwLCByc2EpOworCX0KKworCitSU0EgKmQyaV9SU0FfUFVCS0VZX2JpbyhCSU8gKmJwLCBSU0EgKipyc2EpCisJeworCXJldHVybiBBU04xX2QyaV9iaW9fb2YoUlNBLFJTQV9uZXcsZDJpX1JTQV9QVUJLRVksYnAscnNhKTsKKwl9CisKK2ludCBpMmRfUlNBUHVibGljS2V5X2JpbyhCSU8gKmJwLCBSU0EgKnJzYSkKKwl7CisJcmV0dXJuIEFTTjFfaXRlbV9pMmRfYmlvKEFTTjFfSVRFTV9ycHRyKFJTQVB1YmxpY0tleSksIGJwLCByc2EpOworCX0KKworaW50IGkyZF9SU0FfUFVCS0VZX2JpbyhCSU8gKmJwLCBSU0EgKnJzYSkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2Jpb19vZihSU0EsaTJkX1JTQV9QVUJLRVksYnAscnNhKTsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorRFNBICpkMmlfRFNBUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRFNBICoqZHNhKQorCXsKKwlyZXR1cm4gQVNOMV9kMmlfZnBfb2YoRFNBLERTQV9uZXcsZDJpX0RTQVByaXZhdGVLZXksZnAsZHNhKTsKKwl9CisKK2ludCBpMmRfRFNBUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRFNBICpkc2EpCisJeworCXJldHVybiBBU04xX2kyZF9mcF9vZl9jb25zdChEU0EsaTJkX0RTQVByaXZhdGVLZXksZnAsZHNhKTsKKwl9CisKK0RTQSAqZDJpX0RTQV9QVUJLRVlfZnAoRklMRSAqZnAsIERTQSAqKmRzYSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2ZwX29mKERTQSxEU0FfbmV3LGQyaV9EU0FfUFVCS0VZLGZwLGRzYSk7CisJfQorCitpbnQgaTJkX0RTQV9QVUJLRVlfZnAoRklMRSAqZnAsIERTQSAqZHNhKQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfZnBfb2YoRFNBLGkyZF9EU0FfUFVCS0VZLGZwLGRzYSk7CisJfQorI2VuZGlmCisKK0RTQSAqZDJpX0RTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIERTQSAqKmRzYSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihEU0EsRFNBX25ldyxkMmlfRFNBUHJpdmF0ZUtleSxicCxkc2EKKyk7CisJfQorCitpbnQgaTJkX0RTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIERTQSAqZHNhKQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfYmlvX29mX2NvbnN0KERTQSxpMmRfRFNBUHJpdmF0ZUtleSxicCxkc2EpOworCX0KKworRFNBICpkMmlfRFNBX1BVQktFWV9iaW8oQklPICpicCwgRFNBICoqZHNhKQorCXsKKwlyZXR1cm4gQVNOMV9kMmlfYmlvX29mKERTQSxEU0FfbmV3LGQyaV9EU0FfUFVCS0VZLGJwLGRzYSk7CisJfQorCitpbnQgaTJkX0RTQV9QVUJLRVlfYmlvKEJJTyAqYnAsIERTQSAqZHNhKQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfYmlvX29mKERTQSxpMmRfRFNBX1BVQktFWSxicCxkc2EpOworCX0KKworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorRUNfS0VZICpkMmlfRUNfUFVCS0VZX2ZwKEZJTEUgKmZwLCBFQ19LRVkgKiplY2tleSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2ZwX29mKEVDX0tFWSxFQ19LRVlfbmV3LGQyaV9FQ19QVUJLRVksZnAsZWNrZXkpOworCX0KKyAgCitpbnQgaTJkX0VDX1BVQktFWV9mcChGSUxFICpmcCwgRUNfS0VZICplY2tleSkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2ZwX29mKEVDX0tFWSxpMmRfRUNfUFVCS0VZLGZwLGVja2V5KTsKKwl9CisKK0VDX0tFWSAqZDJpX0VDUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRUNfS0VZICoqZWNrZXkpCisJeworCXJldHVybiBBU04xX2QyaV9mcF9vZihFQ19LRVksRUNfS0VZX25ldyxkMmlfRUNQcml2YXRlS2V5LGZwLGVja2V5KTsKKwl9CisgIAoraW50IGkyZF9FQ1ByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVDX0tFWSAqZWNrZXkpCisJeworCXJldHVybiBBU04xX2kyZF9mcF9vZihFQ19LRVksaTJkX0VDUHJpdmF0ZUtleSxmcCxlY2tleSk7CisJfQorI2VuZGlmCitFQ19LRVkgKmQyaV9FQ19QVUJLRVlfYmlvKEJJTyAqYnAsIEVDX0tFWSAqKmVja2V5KQorCXsKKwlyZXR1cm4gQVNOMV9kMmlfYmlvX29mKEVDX0tFWSxFQ19LRVlfbmV3LGQyaV9FQ19QVUJLRVksYnAsZWNrZXkpOworCX0KKyAgCitpbnQgaTJkX0VDX1BVQktFWV9iaW8oQklPICpicCwgRUNfS0VZICplY2RzYSkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2Jpb19vZihFQ19LRVksaTJkX0VDX1BVQktFWSxicCxlY2RzYSk7CisJfQorCitFQ19LRVkgKmQyaV9FQ1ByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVDX0tFWSAqKmVja2V5KQorCXsKKwlyZXR1cm4gQVNOMV9kMmlfYmlvX29mKEVDX0tFWSxFQ19LRVlfbmV3LGQyaV9FQ1ByaXZhdGVLZXksYnAsZWNrZXkpOworCX0KKyAgCitpbnQgaTJkX0VDUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRUNfS0VZICplY2tleSkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2Jpb19vZihFQ19LRVksaTJkX0VDUHJpdmF0ZUtleSxicCxlY2tleSk7CisJfQorI2VuZGlmCisKKworaW50IFg1MDlfcHVia2V5X2RpZ2VzdChjb25zdCBYNTA5ICpkYXRhLCBjb25zdCBFVlBfTUQgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKm1kLAorCSAgICAgdW5zaWduZWQgaW50ICpsZW4pCisJeworCUFTTjFfQklUX1NUUklORyAqa2V5OworCWtleSA9IFg1MDlfZ2V0MF9wdWJrZXlfYml0c3RyKGRhdGEpOworCWlmKCFrZXkpIHJldHVybiAwOworCXJldHVybiBFVlBfRGlnZXN0KGtleS0+ZGF0YSwga2V5LT5sZW5ndGgsIG1kLCBsZW4sIHR5cGUsIE5VTEwpOworCX0KKworaW50IFg1MDlfZGlnZXN0KGNvbnN0IFg1MDkgKmRhdGEsIGNvbnN0IEVWUF9NRCAqdHlwZSwgdW5zaWduZWQgY2hhciAqbWQsCisJICAgICB1bnNpZ25lZCBpbnQgKmxlbikKKwl7CisJcmV0dXJuKEFTTjFfaXRlbV9kaWdlc3QoQVNOMV9JVEVNX3JwdHIoWDUwOSksdHlwZSwoY2hhciAqKWRhdGEsbWQsbGVuKSk7CisJfQorCitpbnQgWDUwOV9DUkxfZGlnZXN0KGNvbnN0IFg1MDlfQ1JMICpkYXRhLCBjb25zdCBFVlBfTUQgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKm1kLAorCSAgICAgdW5zaWduZWQgaW50ICpsZW4pCisJeworCXJldHVybihBU04xX2l0ZW1fZGlnZXN0KEFTTjFfSVRFTV9ycHRyKFg1MDlfQ1JMKSx0eXBlLChjaGFyICopZGF0YSxtZCxsZW4pKTsKKwl9CisKK2ludCBYNTA5X1JFUV9kaWdlc3QoY29uc3QgWDUwOV9SRVEgKmRhdGEsIGNvbnN0IEVWUF9NRCAqdHlwZSwgdW5zaWduZWQgY2hhciAqbWQsCisJICAgICB1bnNpZ25lZCBpbnQgKmxlbikKKwl7CisJcmV0dXJuKEFTTjFfaXRlbV9kaWdlc3QoQVNOMV9JVEVNX3JwdHIoWDUwOV9SRVEpLHR5cGUsKGNoYXIgKilkYXRhLG1kLGxlbikpOworCX0KKworaW50IFg1MDlfTkFNRV9kaWdlc3QoY29uc3QgWDUwOV9OQU1FICpkYXRhLCBjb25zdCBFVlBfTUQgKnR5cGUsIHVuc2lnbmVkIGNoYXIgKm1kLAorCSAgICAgdW5zaWduZWQgaW50ICpsZW4pCisJeworCXJldHVybihBU04xX2l0ZW1fZGlnZXN0KEFTTjFfSVRFTV9ycHRyKFg1MDlfTkFNRSksdHlwZSwoY2hhciAqKWRhdGEsbWQsbGVuKSk7CisJfQorCitpbnQgUEtDUzdfSVNTVUVSX0FORF9TRVJJQUxfZGlnZXN0KFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMICpkYXRhLCBjb25zdCBFVlBfTUQgKnR5cGUsCisJICAgICB1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pCisJeworCXJldHVybihBU04xX2l0ZW1fZGlnZXN0KEFTTjFfSVRFTV9ycHRyKFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMKSx0eXBlLAorCQkoY2hhciAqKWRhdGEsbWQsbGVuKSk7CisJfQorCisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK1g1MDlfU0lHICpkMmlfUEtDUzhfZnAoRklMRSAqZnAsIFg1MDlfU0lHICoqcDgpCisJeworCXJldHVybiBBU04xX2QyaV9mcF9vZihYNTA5X1NJRyxYNTA5X1NJR19uZXcsZDJpX1g1MDlfU0lHLGZwLHA4KTsKKwl9CisKK2ludCBpMmRfUEtDUzhfZnAoRklMRSAqZnAsIFg1MDlfU0lHICpwOCkKKwl7CisJcmV0dXJuIEFTTjFfaTJkX2ZwX29mKFg1MDlfU0lHLGkyZF9YNTA5X1NJRyxmcCxwOCk7CisJfQorI2VuZGlmCisKK1g1MDlfU0lHICpkMmlfUEtDUzhfYmlvKEJJTyAqYnAsIFg1MDlfU0lHICoqcDgpCisJeworCXJldHVybiBBU04xX2QyaV9iaW9fb2YoWDUwOV9TSUcsWDUwOV9TSUdfbmV3LGQyaV9YNTA5X1NJRyxicCxwOCk7CisJfQorCitpbnQgaTJkX1BLQ1M4X2JpbyhCSU8gKmJwLCBYNTA5X1NJRyAqcDgpCisJeworCXJldHVybiBBU04xX2kyZF9iaW9fb2YoWDUwOV9TSUcsaTJkX1g1MDlfU0lHLGJwLHA4KTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKmQyaV9QS0NTOF9QUklWX0tFWV9JTkZPX2ZwKEZJTEUgKmZwLAorCQkJCQkJIFBLQ1M4X1BSSVZfS0VZX0lORk8gKipwOGluZikKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2ZwX29mKFBLQ1M4X1BSSVZfS0VZX0lORk8sUEtDUzhfUFJJVl9LRVlfSU5GT19uZXcsCisJCQkgICAgICBkMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyxmcCxwOGluZik7CisJfQorCitpbnQgaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk9fZnAoRklMRSAqZnAsIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfZnBfb2YoUEtDUzhfUFJJVl9LRVlfSU5GTyxpMmRfUEtDUzhfUFJJVl9LRVlfSU5GTyxmcCwKKwkJCSAgICAgIHA4aW5mKTsKKwl9CisKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5SW5mb19mcChGSUxFICpmcCwgRVZQX1BLRVkgKmtleSkKKwl7CisJUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmY7CisJaW50IHJldDsKKwlwOGluZiA9IEVWUF9QS0VZMlBLQ1M4KGtleSk7CisJaWYoIXA4aW5mKSByZXR1cm4gMDsKKwlyZXQgPSBpMmRfUEtDUzhfUFJJVl9LRVlfSU5GT19mcChmcCwgcDhpbmYpOworCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOGluZik7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBpMmRfUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBBU04xX2kyZF9mcF9vZihFVlBfUEtFWSxpMmRfUHJpdmF0ZUtleSxmcCxwa2V5KTsKKwl9CisKK0VWUF9QS0VZICpkMmlfUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKiphKQoreworCXJldHVybiBBU04xX2QyaV9mcF9vZihFVlBfUEtFWSxFVlBfUEtFWV9uZXcsZDJpX0F1dG9Qcml2YXRlS2V5LGZwLGEpOworfQorCitpbnQgaTJkX1BVQktFWV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBBU04xX2kyZF9mcF9vZihFVlBfUEtFWSxpMmRfUFVCS0VZLGZwLHBrZXkpOworCX0KKworRVZQX1BLRVkgKmQyaV9QVUJLRVlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICoqYSkKK3sKKwlyZXR1cm4gQVNOMV9kMmlfZnBfb2YoRVZQX1BLRVksRVZQX1BLRVlfbmV3LGQyaV9QVUJLRVksZnAsYSk7Cit9CisKKyNlbmRpZgorCitQS0NTOF9QUklWX0tFWV9JTkZPICpkMmlfUEtDUzhfUFJJVl9LRVlfSU5GT19iaW8oQklPICpicCwKKwkJCQkJCSBQS0NTOF9QUklWX0tFWV9JTkZPICoqcDhpbmYpCisJeworCXJldHVybiBBU04xX2QyaV9iaW9fb2YoUEtDUzhfUFJJVl9LRVlfSU5GTyxQS0NTOF9QUklWX0tFWV9JTkZPX25ldywKKwkJCSAgICBkMmlfUEtDUzhfUFJJVl9LRVlfSU5GTyxicCxwOGluZik7CisJfQorCitpbnQgaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk9fYmlvKEJJTyAqYnAsIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfYmlvX29mKFBLQ1M4X1BSSVZfS0VZX0lORk8saTJkX1BLQ1M4X1BSSVZfS0VZX0lORk8sYnAsCisJCQkgICAgICAgcDhpbmYpOworCX0KKworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlJbmZvX2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqa2V5KQorCXsKKwlQS0NTOF9QUklWX0tFWV9JTkZPICpwOGluZjsKKwlpbnQgcmV0OworCXA4aW5mID0gRVZQX1BLRVkyUEtDUzgoa2V5KTsKKwlpZighcDhpbmYpIHJldHVybiAwOworCXJldCA9IGkyZF9QS0NTOF9QUklWX0tFWV9JTkZPX2JpbyhicCwgcDhpbmYpOworCVBLQ1M4X1BSSVZfS0VZX0lORk9fZnJlZShwOGluZik7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBpMmRfUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRVZQX1BLRVkgKnBrZXkpCisJeworCXJldHVybiBBU04xX2kyZF9iaW9fb2YoRVZQX1BLRVksaTJkX1ByaXZhdGVLZXksYnAscGtleSk7CisJfQorCitFVlBfUEtFWSAqZDJpX1ByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICoqYSkKKwl7CisJcmV0dXJuIEFTTjFfZDJpX2Jpb19vZihFVlBfUEtFWSxFVlBfUEtFWV9uZXcsZDJpX0F1dG9Qcml2YXRlS2V5LGJwLGEpOworCX0KKworaW50IGkyZF9QVUJLRVlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICpwa2V5KQorCXsKKwlyZXR1cm4gQVNOMV9pMmRfYmlvX29mKEVWUF9QS0VZLGkyZF9QVUJLRVksYnAscGtleSk7CisJfQorCitFVlBfUEtFWSAqZDJpX1BVQktFWV9iaW8oQklPICpicCwgRVZQX1BLRVkgKiphKQorCXsKKwlyZXR1cm4gQVNOMV9kMmlfYmlvX29mKEVWUF9QS0VZLEVWUF9QS0VZX25ldyxkMmlfUFVCS0VZLGJwLGEpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvZXh0X2RhdC5oIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9leHRfZGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkYWVlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvZXh0X2RhdC5oCkBAIC0wLDAgKzEsMTMyIEBACisvKiBleHRfZGF0LmggKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qIFRoaXMgZmlsZSBjb250YWlucyBhIHRhYmxlIG9mICJzdGFuZGFyZCIgZXh0ZW5zaW9ucyAqLworCitleHRlcm4gWDUwOVYzX0VYVF9NRVRIT0QgdjNfYmNvbnMsIHYzX25zY2VydCwgdjNfa2V5X3VzYWdlLCB2M19leHRfa3U7CitleHRlcm4gWDUwOVYzX0VYVF9NRVRIT0QgdjNfcGtleV91c2FnZV9wZXJpb2QsIHYzX3N4bmV0LCB2M19pbmZvLCB2M19zaW5mbzsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19uc19pYTVfbGlzdFtdLCB2M19hbHRbXSwgdjNfc2tleV9pZCwgdjNfYWtleV9pZDsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19jcmxfbnVtLCB2M19jcmxfcmVhc29uLCB2M19jcmxfaW52ZGF0ZTsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19kZWx0YV9jcmwsIHYzX2Nwb2xzLCB2M19jcmxkLCB2M19mcmVzaGVzdF9jcmw7CitleHRlcm4gWDUwOVYzX0VYVF9NRVRIT0QgdjNfb2NzcF9ub25jZSwgdjNfb2NzcF9hY2NyZXNwLCB2M19vY3NwX2FjdXRvZmY7CitleHRlcm4gWDUwOVYzX0VYVF9NRVRIT0QgdjNfb2NzcF9jcmxpZCwgdjNfb2NzcF9ub2NoZWNrLCB2M19vY3NwX3NlcnZpY2Vsb2M7CitleHRlcm4gWDUwOVYzX0VYVF9NRVRIT0QgdjNfY3JsX2hvbGQsIHYzX3BjaTsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19wb2xpY3lfbWFwcGluZ3MsIHYzX3BvbGljeV9jb25zdHJhaW50czsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19uYW1lX2NvbnN0cmFpbnRzLCB2M19pbmhpYml0X2FueXAsIHYzX2lkcDsKK2V4dGVybiBYNTA5VjNfRVhUX01FVEhPRCB2M19hZGRyLCB2M19hc2lkOworCisvKiBUaGlzIHRhYmxlIHdpbGwgYmUgc2VhcmNoZWQgdXNpbmcgT0JKX2JzZWFyY2ggc28gaXQgKm11c3QqIGtlcHQgaW4KKyAqIG9yZGVyIG9mIHRoZSBleHRfbmlkIHZhbHVlcy4KKyAqLworCitzdGF0aWMgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKnN0YW5kYXJkX2V4dHNbXSA9IHsKKyZ2M19uc2NlcnQsCismdjNfbnNfaWE1X2xpc3RbMF0sCismdjNfbnNfaWE1X2xpc3RbMV0sCismdjNfbnNfaWE1X2xpc3RbMl0sCismdjNfbnNfaWE1X2xpc3RbM10sCismdjNfbnNfaWE1X2xpc3RbNF0sCismdjNfbnNfaWE1X2xpc3RbNV0sCismdjNfbnNfaWE1X2xpc3RbNl0sCismdjNfc2tleV9pZCwKKyZ2M19rZXlfdXNhZ2UsCismdjNfcGtleV91c2FnZV9wZXJpb2QsCismdjNfYWx0WzBdLAorJnYzX2FsdFsxXSwKKyZ2M19iY29ucywKKyZ2M19jcmxfbnVtLAorJnYzX2Nwb2xzLAorJnYzX2FrZXlfaWQsCismdjNfY3JsZCwKKyZ2M19leHRfa3UsCismdjNfZGVsdGFfY3JsLAorJnYzX2NybF9yZWFzb24sCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorJnYzX2NybF9pbnZkYXRlLAorI2VuZGlmCismdjNfc3huZXQsCismdjNfaW5mbywKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CismdjNfYWRkciwKKyZ2M19hc2lkLAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorJnYzX29jc3Bfbm9uY2UsCismdjNfb2NzcF9jcmxpZCwKKyZ2M19vY3NwX2FjY3Jlc3AsCismdjNfb2NzcF9ub2NoZWNrLAorJnYzX29jc3BfYWN1dG9mZiwKKyZ2M19vY3NwX3NlcnZpY2Vsb2MsCisjZW5kaWYKKyZ2M19zaW5mbywKKyZ2M19wb2xpY3lfY29uc3RyYWludHMsCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorJnYzX2NybF9ob2xkLAorI2VuZGlmCismdjNfcGNpLAorJnYzX25hbWVfY29uc3RyYWludHMsCismdjNfcG9saWN5X21hcHBpbmdzLAorJnYzX2luaGliaXRfYW55cCwKKyZ2M19pZHAsCismdjNfYWx0WzJdLAorJnYzX2ZyZXNoZXN0X2NybCwKK307CisKKy8qIE51bWJlciBvZiBzdGFuZGFyZCBleHRlbnNpb25zICovCisKKyNkZWZpbmUgU1RBTkRBUkRfRVhURU5TSU9OX0NPVU5UIChzaXplb2Yoc3RhbmRhcmRfZXh0cykvc2l6ZW9mKFg1MDlWM19FWFRfTUVUSE9EICopKQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3BjeV9jYWNoZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9wY3lfY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzJiN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9wY3lfY2FjaGUuYwpAQCAtMCwwICsxLDI4NiBAQAorLyogcGN5X2NhY2hlLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKyNpbmNsdWRlICJwY3lfaW50LmgiCisKK3N0YXRpYyBpbnQgcG9saWN5X2RhdGFfY21wKGNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKiBjb25zdCAqYSwKKwkJCQljb25zdCBYNTA5X1BPTElDWV9EQVRBICogY29uc3QgKmIpOworc3RhdGljIGludCBwb2xpY3lfY2FjaGVfc2V0X2ludChsb25nICpvdXQsIEFTTjFfSU5URUdFUiAqdmFsdWUpOworCisvKiBTZXQgY2FjaGUgZW50cnkgYWNjb3JkaW5nIHRvIENlcnRpZmljYXRlUG9saWNpZXMgZXh0ZW5zaW9uLgorICogTm90ZTogdGhpcyBkZXN0cm95cyB0aGUgcGFzc2VkIENFUlRJRklDQVRFUE9MSUNJRVMgc3RydWN0dXJlLgorICovCisKK3N0YXRpYyBpbnQgcG9saWN5X2NhY2hlX2NyZWF0ZShYNTA5ICp4LAorCQkJQ0VSVElGSUNBVEVQT0xJQ0lFUyAqcG9saWNpZXMsIGludCBjcml0KQorCXsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUgPSB4LT5wb2xpY3lfY2FjaGU7CisJWDUwOV9QT0xJQ1lfREFUQSAqZGF0YSA9IE5VTEw7CisJUE9MSUNZSU5GTyAqcG9saWN5OworCWlmIChza19QT0xJQ1lJTkZPX251bShwb2xpY2llcykgPT0gMCkKKwkJZ290byBiYWRfcG9saWN5OworCWNhY2hlLT5kYXRhID0gc2tfWDUwOV9QT0xJQ1lfREFUQV9uZXcocG9saWN5X2RhdGFfY21wKTsKKwlpZiAoIWNhY2hlLT5kYXRhKQorCQlnb3RvIGJhZF9wb2xpY3k7CisJZm9yIChpID0gMDsgaSA8IHNrX1BPTElDWUlORk9fbnVtKHBvbGljaWVzKTsgaSsrKQorCQl7CisJCXBvbGljeSA9IHNrX1BPTElDWUlORk9fdmFsdWUocG9saWNpZXMsIGkpOworCQlkYXRhID0gcG9saWN5X2RhdGFfbmV3KHBvbGljeSwgTlVMTCwgY3JpdCk7CisJCWlmICghZGF0YSkKKwkJCWdvdG8gYmFkX3BvbGljeTsKKwkJLyogRHVwbGljYXRlIHBvbGljeSBPSURzIGFyZSBpbGxlZ2FsOiByZWplY3QgaWYgbWF0Y2hlcworCQkgKiBmb3VuZC4KKwkJICovCisJCWlmIChPQkpfb2JqMm5pZChkYXRhLT52YWxpZF9wb2xpY3kpID09IE5JRF9hbnlfcG9saWN5KQorCQkJeworCQkJaWYgKGNhY2hlLT5hbnlQb2xpY3kpCisJCQkJeworCQkJCXJldCA9IC0xOworCQkJCWdvdG8gYmFkX3BvbGljeTsKKwkJCQl9CisJCQljYWNoZS0+YW55UG9saWN5ID0gZGF0YTsKKwkJCX0KKwkJZWxzZSBpZiAoc2tfWDUwOV9QT0xJQ1lfREFUQV9maW5kKGNhY2hlLT5kYXRhLCBkYXRhKSAhPSAtMSkKKwkJCXsKKwkJCXJldCA9IC0xOworCQkJZ290byBiYWRfcG9saWN5OworCQkJfQorCQllbHNlIGlmICghc2tfWDUwOV9QT0xJQ1lfREFUQV9wdXNoKGNhY2hlLT5kYXRhLCBkYXRhKSkKKwkJCWdvdG8gYmFkX3BvbGljeTsKKwkJZGF0YSA9IE5VTEw7CisJCX0KKwlyZXQgPSAxOworCWJhZF9wb2xpY3k6CisJaWYgKHJldCA9PSAtMSkKKwkJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX0lOVkFMSURfUE9MSUNZOworCWlmIChkYXRhKQorCQlwb2xpY3lfZGF0YV9mcmVlKGRhdGEpOworCXNrX1BPTElDWUlORk9fcG9wX2ZyZWUocG9saWNpZXMsIFBPTElDWUlORk9fZnJlZSk7CisJaWYgKHJldCA8PSAwKQorCQl7CisJCXNrX1g1MDlfUE9MSUNZX0RBVEFfcG9wX2ZyZWUoY2FjaGUtPmRhdGEsIHBvbGljeV9kYXRhX2ZyZWUpOworCQljYWNoZS0+ZGF0YSA9IE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworCQorc3RhdGljIGludCBwb2xpY3lfY2FjaGVfbmV3KFg1MDkgKngpCisJeworCVg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZTsKKwlBU04xX0lOVEVHRVIgKmV4dF9hbnkgPSBOVUxMOworCVBPTElDWV9DT05TVFJBSU5UUyAqZXh0X3Bjb25zID0gTlVMTDsKKwlDRVJUSUZJQ0FURVBPTElDSUVTICpleHRfY3BvbHMgPSBOVUxMOworCVBPTElDWV9NQVBQSU5HUyAqZXh0X3BtYXBzID0gTlVMTDsKKwlpbnQgaTsKKwljYWNoZSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1BPTElDWV9DQUNIRSkpOworCWlmICghY2FjaGUpCisJCXJldHVybiAwOworCWNhY2hlLT5hbnlQb2xpY3kgPSBOVUxMOworCWNhY2hlLT5kYXRhID0gTlVMTDsKKwljYWNoZS0+YW55X3NraXAgPSAtMTsKKwljYWNoZS0+ZXhwbGljaXRfc2tpcCA9IC0xOworCWNhY2hlLT5tYXBfc2tpcCA9IC0xOworCisJeC0+cG9saWN5X2NhY2hlID0gY2FjaGU7CisKKwkvKiBIYW5kbGUgcmVxdWlyZUV4cGxpY2l0UG9saWN5ICpmaXJzdCouIE5lZWQgdG8gcHJvY2VzcyB0aGlzCisJICogZXZlbiBpZiB3ZSBkb24ndCBoYXZlIGFueSBwb2xpY2llcy4KKwkgKi8KKwlleHRfcGNvbnMgPSBYNTA5X2dldF9leHRfZDJpKHgsIE5JRF9wb2xpY3lfY29uc3RyYWludHMsICZpLCBOVUxMKTsKKworCWlmICghZXh0X3Bjb25zKQorCQl7CisJCWlmIChpICE9IC0xKQorCQkJZ290byBiYWRfY2FjaGU7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCFleHRfcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeQorCQkJJiYgIWV4dF9wY29ucy0+aW5oaWJpdFBvbGljeU1hcHBpbmcpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJaWYgKCFwb2xpY3lfY2FjaGVfc2V0X2ludCgmY2FjaGUtPmV4cGxpY2l0X3NraXAsCisJCQlleHRfcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeSkpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJaWYgKCFwb2xpY3lfY2FjaGVfc2V0X2ludCgmY2FjaGUtPm1hcF9za2lwLAorCQkJZXh0X3Bjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZykpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJfQorCisJLyogUHJvY2VzcyBDZXJ0aWZpY2F0ZVBvbGljaWVzICovCisKKwlleHRfY3BvbHMgPSBYNTA5X2dldF9leHRfZDJpKHgsIE5JRF9jZXJ0aWZpY2F0ZV9wb2xpY2llcywgJmksIE5VTEwpOworCS8qIElmIG5vIENlcnRpZmljYXRlUG9saWNpZXMgZXh0ZW5zaW9uIG9yIHByb2JsZW0gZGVjb2RpbmcgdGhlbgorCSAqIHRoZXJlIGlzIG5vIHBvaW50IGNvbnRpbnVpbmcgYmVjYXVzZSB0aGUgdmFsaWQgcG9saWNpZXMgd2lsbCBiZQorCSAqIE5VTEwuCisJICovCisJaWYgKCFleHRfY3BvbHMpCisJCXsKKwkJLyogSWYgbm90IGFic2VudCBzb21lIHByb2JsZW0gd2l0aCBleHRlbnNpb24gKi8KKwkJaWYgKGkgIT0gLTEpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJcmV0dXJuIDE7CisJCX0KKworCWkgPSBwb2xpY3lfY2FjaGVfY3JlYXRlKHgsIGV4dF9jcG9scywgaSk7CisKKwkvKiBOQjogZXh0X2Nwb2xzIGZyZWVkIGJ5IHBvbGljeV9jYWNoZV9zZXRfcG9saWNpZXMgKi8KKworCWlmIChpIDw9IDApCisJCXJldHVybiBpOworCisJZXh0X3BtYXBzID0gWDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfcG9saWN5X21hcHBpbmdzLCAmaSwgTlVMTCk7CisKKwlpZiAoIWV4dF9wbWFwcykKKwkJeworCQkvKiBJZiBub3QgYWJzZW50IHNvbWUgcHJvYmxlbSB3aXRoIGV4dGVuc2lvbiAqLworCQlpZiAoaSAhPSAtMSkKKwkJCWdvdG8gYmFkX2NhY2hlOworCQl9CisJZWxzZQorCQl7CisJCWkgPSBwb2xpY3lfY2FjaGVfc2V0X21hcHBpbmcoeCwgZXh0X3BtYXBzKTsKKwkJaWYgKGkgPD0gMCkKKwkJCWdvdG8gYmFkX2NhY2hlOworCQl9CisKKwlleHRfYW55ID0gWDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfaW5oaWJpdF9hbnlfcG9saWN5LCAmaSwgTlVMTCk7CisKKwlpZiAoIWV4dF9hbnkpCisJCXsKKwkJaWYgKGkgIT0gLTEpCisJCQlnb3RvIGJhZF9jYWNoZTsKKwkJfQorCWVsc2UgaWYgKCFwb2xpY3lfY2FjaGVfc2V0X2ludCgmY2FjaGUtPmFueV9za2lwLCBleHRfYW55KSkKKwkJCWdvdG8gYmFkX2NhY2hlOworCisJaWYgKDApCisJCXsKKwkJYmFkX2NhY2hlOgorCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfSU5WQUxJRF9QT0xJQ1k7CisJCX0KKworCWlmKGV4dF9wY29ucykKKwkJUE9MSUNZX0NPTlNUUkFJTlRTX2ZyZWUoZXh0X3Bjb25zKTsKKworCWlmIChleHRfYW55KQorCQlBU04xX0lOVEVHRVJfZnJlZShleHRfYW55KTsKKworCXJldHVybiAxOworCisJCit9CisKK3ZvaWQgcG9saWN5X2NhY2hlX2ZyZWUoWDUwOV9QT0xJQ1lfQ0FDSEUgKmNhY2hlKQorCXsKKwlpZiAoIWNhY2hlKQorCQlyZXR1cm47CisJaWYgKGNhY2hlLT5hbnlQb2xpY3kpCisJCXBvbGljeV9kYXRhX2ZyZWUoY2FjaGUtPmFueVBvbGljeSk7CisJaWYgKGNhY2hlLT5kYXRhKQorCQlza19YNTA5X1BPTElDWV9EQVRBX3BvcF9mcmVlKGNhY2hlLT5kYXRhLCBwb2xpY3lfZGF0YV9mcmVlKTsKKwlPUEVOU1NMX2ZyZWUoY2FjaGUpOworCX0KKworY29uc3QgWDUwOV9QT0xJQ1lfQ0FDSEUgKnBvbGljeV9jYWNoZV9zZXQoWDUwOSAqeCkKKwl7CisKKwlpZiAoeC0+cG9saWN5X2NhY2hlID09IE5VTEwpCisJCXsKKwkJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19YNTA5KTsKKwkJCXBvbGljeV9jYWNoZV9uZXcoeCk7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5KTsKKwkJfQorCisJcmV0dXJuIHgtPnBvbGljeV9jYWNoZTsKKworCX0KKworWDUwOV9QT0xJQ1lfREFUQSAqcG9saWN5X2NhY2hlX2ZpbmRfZGF0YShjb25zdCBYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUsCisJCQkJCQljb25zdCBBU04xX09CSkVDVCAqaWQpCisJeworCWludCBpZHg7CisJWDUwOV9QT0xJQ1lfREFUQSB0bXA7CisJdG1wLnZhbGlkX3BvbGljeSA9IChBU04xX09CSkVDVCAqKWlkOworCWlkeCA9IHNrX1g1MDlfUE9MSUNZX0RBVEFfZmluZChjYWNoZS0+ZGF0YSwgJnRtcCk7CisJaWYgKGlkeCA9PSAtMSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNrX1g1MDlfUE9MSUNZX0RBVEFfdmFsdWUoY2FjaGUtPmRhdGEsIGlkeCk7CisJfQorCitzdGF0aWMgaW50IHBvbGljeV9kYXRhX2NtcChjb25zdCBYNTA5X1BPTElDWV9EQVRBICogY29uc3QgKmEsCisJCQkJY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqIGNvbnN0ICpiKQorCXsKKwlyZXR1cm4gT0JKX2NtcCgoKmEpLT52YWxpZF9wb2xpY3ksICgqYiktPnZhbGlkX3BvbGljeSk7CisJfQorCitzdGF0aWMgaW50IHBvbGljeV9jYWNoZV9zZXRfaW50KGxvbmcgKm91dCwgQVNOMV9JTlRFR0VSICp2YWx1ZSkKKwl7CisJaWYgKHZhbHVlID09IE5VTEwpCisJCXJldHVybiAxOworCWlmICh2YWx1ZS0+dHlwZSA9PSBWX0FTTjFfTkVHX0lOVEVHRVIpCisJCXJldHVybiAwOworCSpvdXQgPSBBU04xX0lOVEVHRVJfZ2V0KHZhbHVlKTsKKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3BjeV9kYXRhLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3BjeV9kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0NGIwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvcGN5X2RhdGEuYwpAQCAtMCwwICsxLDEzNSBAQAorLyogcGN5X2RhdGEuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDQuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgInBjeV9pbnQuaCIKKworLyogUG9saWN5IE5vZGUgcm91dGluZXMgKi8KKwordm9pZCBwb2xpY3lfZGF0YV9mcmVlKFg1MDlfUE9MSUNZX0RBVEEgKmRhdGEpCisJeworCUFTTjFfT0JKRUNUX2ZyZWUoZGF0YS0+dmFsaWRfcG9saWN5KTsKKwkvKiBEb24ndCBmcmVlIHF1YWxpZmllcnMgaWYgc2hhcmVkICovCisJaWYgKCEoZGF0YS0+ZmxhZ3MgJiBQT0xJQ1lfREFUQV9GTEFHX1NIQVJFRF9RVUFMSUZJRVJTKSkKKwkJc2tfUE9MSUNZUVVBTElORk9fcG9wX2ZyZWUoZGF0YS0+cXVhbGlmaWVyX3NldCwKKwkJCQkJUE9MSUNZUVVBTElORk9fZnJlZSk7CisJc2tfQVNOMV9PQkpFQ1RfcG9wX2ZyZWUoZGF0YS0+ZXhwZWN0ZWRfcG9saWN5X3NldCwgQVNOMV9PQkpFQ1RfZnJlZSk7CisJT1BFTlNTTF9mcmVlKGRhdGEpOworCX0KKworLyogQ3JlYXRlIGEgZGF0YSBiYXNlZCBvbiBhbiBleGlzdGluZyBwb2xpY3kuIElmICdpZCcgaXMgTlVMTCB1c2UgdGhlCisgKiBvaWQgaW4gdGhlIHBvbGljeSwgb3RoZXJ3aXNlIHVzZSAnaWQnLiBUaGlzIGJlaGF2aW91ciBjb3ZlcnMgdGhlIHR3bworICogdHlwZXMgb2YgZGF0YSBpbiBSRkMzMjgwOiBkYXRhIHdpdGggZnJvbSBhIENlcnRpZmljYXRlUG9sY2llcyBleHRlbnNpb24KKyAqIGFuZCBhZGRpdGlvbmFsIGRhdGEgd2l0aCBqdXN0IHRoZSBxdWFsaWZpZXJzIG9mIGFueVBvbGljeSBhbmQgSUQgZnJvbQorICogYW5vdGhlciBzb3VyY2UuCisgKi8KKworWDUwOV9QT0xJQ1lfREFUQSAqcG9saWN5X2RhdGFfbmV3KFBPTElDWUlORk8gKnBvbGljeSwKKwkJCQkJY29uc3QgQVNOMV9PQkpFQ1QgKmNpZCwgaW50IGNyaXQpCisJeworCVg1MDlfUE9MSUNZX0RBVEEgKnJldDsKKwlBU04xX09CSkVDVCAqaWQ7CisJaWYgKCFwb2xpY3kgJiYgIWNpZCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGNpZCkKKwkJeworCQlpZCA9IE9CSl9kdXAoY2lkKTsKKwkJaWYgKCFpZCkKKwkJCXJldHVybiBOVUxMOworCQl9CisJZWxzZQorCQlpZCA9IE5VTEw7CisJcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUE9MSUNZX0RBVEEpKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0LT5leHBlY3RlZF9wb2xpY3lfc2V0ID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKTsKKwlpZiAoIXJldC0+ZXhwZWN0ZWRfcG9saWN5X3NldCkKKwkJeworCQlPUEVOU1NMX2ZyZWUocmV0KTsKKwkJaWYgKGlkKQorCQkJQVNOMV9PQkpFQ1RfZnJlZShpZCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAoY3JpdCkKKwkJcmV0LT5mbGFncyA9IFBPTElDWV9EQVRBX0ZMQUdfQ1JJVElDQUw7CisJZWxzZQorCQlyZXQtPmZsYWdzID0gMDsKKworCWlmIChpZCkKKwkJcmV0LT52YWxpZF9wb2xpY3kgPSBpZDsKKwllbHNlCisJCXsKKwkJcmV0LT52YWxpZF9wb2xpY3kgPSBwb2xpY3ktPnBvbGljeWlkOworCQlwb2xpY3ktPnBvbGljeWlkID0gTlVMTDsKKwkJfQorCisJaWYgKHBvbGljeSkKKwkJeworCQlyZXQtPnF1YWxpZmllcl9zZXQgPSBwb2xpY3ktPnF1YWxpZmllcnM7CisJCXBvbGljeS0+cXVhbGlmaWVycyA9IE5VTEw7CisJCX0KKwllbHNlCisJCXJldC0+cXVhbGlmaWVyX3NldCA9IE5VTEw7CisKKwlyZXR1cm4gcmV0OworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9wY3lfaW50LmggYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3BjeV9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ZmOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9wY3lfaW50LmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qIHBjeV9pbnQuaCAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDQuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworCit0eXBlZGVmIHN0cnVjdCBYNTA5X1BPTElDWV9EQVRBX3N0IFg1MDlfUE9MSUNZX0RBVEE7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfREFUQSkKKworLyogSW50ZXJuYWwgc3RydWN0dXJlcyAqLworCisvKiBUaGlzIHN0cnVjdHVyZSBhbmQgdGhlIGZpZWxkIG5hbWVzIGNvcnJlc3BvbmQgdG8gdGhlIFBvbGljeSAnbm9kZScgb2YKKyAqIFJGQzMyODAuIE5CIHRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIG5vIHBvaW50ZXJzIHRvIHBhcmVudCBvciBjaGlsZAorICogZGF0YTogWDUwOV9QT0xJQ1lfTk9ERSBjb250YWlucyB0aGF0LiBUaGlzIG1lYW5zIHRoYXQgdGhlIG1haW4gcG9saWN5IGRhdGEKKyAqIGNhbiBiZSBrZXB0IHN0YXRpYyBhbmQgY2FjaGVkIHdpdGggdGhlIGNlcnRpZmljYXRlLgorICovCisKK3N0cnVjdCBYNTA5X1BPTElDWV9EQVRBX3N0CisJeworCXVuc2lnbmVkIGludCBmbGFnczsKKwkvKiBQb2xpY3kgT0lEIGFuZCBxdWFsaWZpZXJzIGZvciB0aGlzIGRhdGEgKi8KKwlBU04xX09CSkVDVCAqdmFsaWRfcG9saWN5OworCVNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqcXVhbGlmaWVyX3NldDsKKwlTVEFDS19PRihBU04xX09CSkVDVCkgKmV4cGVjdGVkX3BvbGljeV9zZXQ7CisJfTsKKworLyogWDUwOV9QT0xJQ1lfREFUQSBmbGFncyB2YWx1ZXMgKi8KKworLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGUgc3RydWN0dXJlIGhhcyBiZWVuIG1hcHBlZCB1c2luZyBhIHBvbGljeSBtYXBwaW5nCisgKiBleHRlbnNpb24uIElmIHBvbGljeSBtYXBwaW5nIGlzIG5vdCBhY3RpdmUgaXRzIHJlZmVyZW5jZXMgZ2V0IGRlbGV0ZWQuIAorICovCisKKyNkZWZpbmUgUE9MSUNZX0RBVEFfRkxBR19NQVBQRUQJCQkweDEKKworLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGUgZGF0YSBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSBwb2xpY3kgaW4gQ2VydGlmaWNhdGUKKyAqIFBvbGljaWVzOiBpdCBoYXMgYmVlbiBtYXBwZWQgdG8gYW55IHBvbGljeS4KKyAqLworCisjZGVmaW5lIFBPTElDWV9EQVRBX0ZMQUdfTUFQUEVEX0FOWQkJMHgyCisKKy8qIEFORCB3aXRoIGZsYWdzIHRvIHNlZSBpZiBhbnkgbWFwcGluZyBoYXMgb2NjdXJyZWQgKi8KKworI2RlZmluZSBQT0xJQ1lfREFUQV9GTEFHX01BUF9NQVNLCQkweDMKKworLyogcXVhbGlmaWVycyBhcmUgc2hhcmVkIGFuZCBzaG91bGRuJ3QgYmUgZnJlZWQgKi8KKworI2RlZmluZSBQT0xJQ1lfREFUQV9GTEFHX1NIQVJFRF9RVUFMSUZJRVJTCTB4NAorCisvKiBQYXJlbnQgbm9kZSBpcyBhbiBleHRyYSBub2RlIGFuZCBzaG91bGQgYmUgZnJlZWQgKi8KKworI2RlZmluZSBQT0xJQ1lfREFUQV9GTEFHX0VYVFJBX05PREUJCTB4OAorCisvKiBDb3JyZXNwb25kaW5nIENlcnRpZmljYXRlUG9saWNpZXMgaXMgY3JpdGljYWwgKi8KKworI2RlZmluZSBQT0xJQ1lfREFUQV9GTEFHX0NSSVRJQ0FMCQkweDEwCisKKy8qIFRoaXMgc3RydWN0dXJlIGlzIGNhY2hlZCB3aXRoIGEgY2VydGlmaWNhdGUgKi8KKworc3RydWN0IFg1MDlfUE9MSUNZX0NBQ0hFX3N0IHsKKwkvKiBhbnlQb2xpY3kgZGF0YSBvciBOVUxMIGlmIG5vIGFueVBvbGljeSAqLworCVg1MDlfUE9MSUNZX0RBVEEgKmFueVBvbGljeTsKKwkvKiBvdGhlciBwb2xpY3kgZGF0YSAqLworCVNUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpICpkYXRhOworCS8qIElmIEluaGliaXRBbnlQb2xpY3kgcHJlc2VudCB0aGlzIGlzIGl0cyB2YWx1ZSBvciAtMSBpZiBhYnNlbnQuICovCisJbG9uZyBhbnlfc2tpcDsKKwkvKiBJZiBwb2xpY3lDb25zdHJhaW50cyBhbmQgcmVxdWlyZUV4cGxpY2l0UG9saWN5IHByZXNlbnQgdGhpcyBpcyBpdHMKKwkgKiB2YWx1ZSBvciAtMSBpZiBhYnNlbnQuCisJICovCisJbG9uZyBleHBsaWNpdF9za2lwOworCS8qIElmIHBvbGljeUNvbnN0cmFpbnRzIGFuZCBwb2xpY3lNYXBwaW5nIHByZXNlbnQgdGhpcyBpcyBpdHMKKwkgKiB2YWx1ZSBvciAtMSBpZiBhYnNlbnQuCisgICAgICAgICAqLworCWxvbmcgbWFwX3NraXA7CisJfTsKKworLyojZGVmaW5lIFBPTElDWV9DQUNIRV9GTEFHX0NSSVRJQ0FMCQlQT0xJQ1lfREFUQV9GTEFHX0NSSVRJQ0FMKi8KKworLyogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbm9kZXMgKi8KKworc3RydWN0IFg1MDlfUE9MSUNZX05PREVfc3QKKwl7CisJLyogbm9kZSBkYXRhIHRoaXMgcmVmZXJzIHRvICovCisJY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqZGF0YTsKKwkvKiBQYXJlbnQgbm9kZSAqLworCVg1MDlfUE9MSUNZX05PREUgKnBhcmVudDsKKwkvKiBOdW1iZXIgb2YgY2hpbGQgbm9kZXMgKi8KKwlpbnQgbmNoaWxkOworCX07CisKK3N0cnVjdCBYNTA5X1BPTElDWV9MRVZFTF9zdAorCXsKKwkvKiBDZXJ0IGZvciB0aGlzIGxldmVsICovCisJWDUwOSAqY2VydDsKKwkvKiBub2RlcyBhdCB0aGlzIGxldmVsICovCisJU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKm5vZGVzOworCS8qIGFueVBvbGljeSBub2RlICovCisJWDUwOV9QT0xJQ1lfTk9ERSAqYW55UG9saWN5OworCS8qIEV4dHJhIGRhdGEgKi8KKwkvKlNUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpICpleHRyYV9kYXRhOyovCisJdW5zaWduZWQgaW50IGZsYWdzOworCX07CisKK3N0cnVjdCBYNTA5X1BPTElDWV9UUkVFX3N0CisJeworCS8qIFRoaXMgaXMgdGhlIHRyZWUgJ2xldmVsJyBkYXRhICovCisJWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsczsKKwlpbnQgbmxldmVsOworCS8qIEV4dHJhIHBvbGljeSBkYXRhIHdoZW4gYWRkaXRpb25hbCBub2RlcyAobm90IGZyb20gdGhlIGNlcnRpZmljYXRlKQorCSAqIGFyZSByZXF1aXJlZC4KKwkgKi8KKwlTVEFDS19PRihYNTA5X1BPTElDWV9EQVRBKSAqZXh0cmFfZGF0YTsKKwkvKiBUaGlzIGlzIHRoZSBhdXRob3JpdHkgY29uc3RhaW5lZCBwb2xpY3kgc2V0ICovCisJU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKmF1dGhfcG9saWNpZXM7CisJU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKnVzZXJfcG9saWNpZXM7CisJdW5zaWduZWQgaW50IGZsYWdzOworCX07CisKKy8qIFNldCBpZiBhbnlQb2xpY3kgcHJlc2VudCBpbiB1c2VyIHBvbGljaWVzICovCisjZGVmaW5lIFBPTElDWV9GTEFHX0FOWV9QT0xJQ1kJCTB4MgorCisvKiBVc2VmdWwgbWFjcm9zICovCisKKyNkZWZpbmUgbm9kZV9kYXRhX2NyaXRpY2FsKGRhdGEpIChkYXRhLT5mbGFncyAmIFBPTElDWV9EQVRBX0ZMQUdfQ1JJVElDQUwpCisjZGVmaW5lIG5vZGVfY3JpdGljYWwobm9kZSkgbm9kZV9kYXRhX2NyaXRpY2FsKG5vZGUtPmRhdGEpCisKKy8qIEludGVybmFsIGZ1bmN0aW9ucyAqLworCitYNTA5X1BPTElDWV9EQVRBICpwb2xpY3lfZGF0YV9uZXcoUE9MSUNZSU5GTyAqcG9saWN5LCBjb25zdCBBU04xX09CSkVDVCAqaWQsCisJCQkJCQkJCWludCBjcml0KTsKK3ZvaWQgcG9saWN5X2RhdGFfZnJlZShYNTA5X1BPTElDWV9EQVRBICpkYXRhKTsKKworWDUwOV9QT0xJQ1lfREFUQSAqcG9saWN5X2NhY2hlX2ZpbmRfZGF0YShjb25zdCBYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUsCisJCQkJCQkJY29uc3QgQVNOMV9PQkpFQ1QgKmlkKTsKK2ludCBwb2xpY3lfY2FjaGVfc2V0X21hcHBpbmcoWDUwOSAqeCwgUE9MSUNZX01BUFBJTkdTICptYXBzKTsKKworCitTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqcG9saWN5X25vZGVfY21wX25ldyh2b2lkKTsKKwordm9pZCBwb2xpY3lfY2FjaGVfaW5pdCh2b2lkKTsKKwordm9pZCBwb2xpY3lfY2FjaGVfZnJlZShYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUpOworCitYNTA5X1BPTElDWV9OT0RFICpsZXZlbF9maW5kX25vZGUoY29uc3QgWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsLAorCQkJCQljb25zdCBYNTA5X1BPTElDWV9OT0RFICpwYXJlbnQsCQorCQkJCQljb25zdCBBU04xX09CSkVDVCAqaWQpOworCitYNTA5X1BPTElDWV9OT0RFICp0cmVlX2ZpbmRfc2soU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKnNrLAorCQkJCQkJY29uc3QgQVNOMV9PQkpFQ1QgKmlkKTsKKworWDUwOV9QT0xJQ1lfTk9ERSAqbGV2ZWxfYWRkX25vZGUoWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsLAorCQkJY29uc3QgWDUwOV9QT0xJQ1lfREFUQSAqZGF0YSwKKwkJCVg1MDlfUE9MSUNZX05PREUgKnBhcmVudCwKKwkJCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpOwordm9pZCBwb2xpY3lfbm9kZV9mcmVlKFg1MDlfUE9MSUNZX05PREUgKm5vZGUpOworaW50IHBvbGljeV9ub2RlX21hdGNoKGNvbnN0IFg1MDlfUE9MSUNZX0xFVkVMICpsdmwsCisJCSAgICAgIGNvbnN0IFg1MDlfUE9MSUNZX05PREUgKm5vZGUsIGNvbnN0IEFTTjFfT0JKRUNUICpvaWQpOworCitjb25zdCBYNTA5X1BPTElDWV9DQUNIRSAqcG9saWN5X2NhY2hlX3NldChYNTA5ICp4KTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvcGN5X2xpYi5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9wY3lfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiZmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvcGN5X2xpYi5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiBwY3lfbGliLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgInBjeV9pbnQuaCIKKworLyogYWNjZXNzb3IgZnVuY3Rpb25zICovCisKKy8qIFg1MDlfUE9MSUNZX1RSRUUgc3R1ZmYgKi8KKworaW50IFg1MDlfcG9saWN5X3RyZWVfbGV2ZWxfY291bnQoY29uc3QgWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSkKKwl7CisJaWYgKCF0cmVlKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdHJlZS0+bmxldmVsOworCX0KKworWDUwOV9QT0xJQ1lfTEVWRUwgKgorCVg1MDlfcG9saWN5X3RyZWVfZ2V0MF9sZXZlbChjb25zdCBYNTA5X1BPTElDWV9UUkVFICp0cmVlLCBpbnQgaSkKKwl7CisJaWYgKCF0cmVlIHx8IChpIDwgMCkgfHwgKGkgPj0gdHJlZS0+bmxldmVsKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHRyZWUtPmxldmVscyArIGk7CisJfQorCitTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqCisJCVg1MDlfcG9saWN5X3RyZWVfZ2V0MF9wb2xpY2llcyhjb25zdCBYNTA5X1BPTElDWV9UUkVFICp0cmVlKQorCXsKKwlpZiAoIXRyZWUpCisJCXJldHVybiBOVUxMOworCXJldHVybiB0cmVlLT5hdXRoX3BvbGljaWVzOworCX0KKworU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKgorCVg1MDlfcG9saWN5X3RyZWVfZ2V0MF91c2VyX3BvbGljaWVzKGNvbnN0IFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCWlmICghdHJlZSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHRyZWUtPmZsYWdzICYgUE9MSUNZX0ZMQUdfQU5ZX1BPTElDWSkKKwkJcmV0dXJuIHRyZWUtPmF1dGhfcG9saWNpZXM7CisJZWxzZQorCQlyZXR1cm4gdHJlZS0+dXNlcl9wb2xpY2llczsKKwl9CisKKy8qIFg1MDlfUE9MSUNZX0xFVkVMIHN0dWZmICovCisKK2ludCBYNTA5X3BvbGljeV9sZXZlbF9ub2RlX2NvdW50KFg1MDlfUE9MSUNZX0xFVkVMICpsZXZlbCkKKwl7CisJaW50IG47CisJaWYgKCFsZXZlbCkKKwkJcmV0dXJuIDA7CisJaWYgKGxldmVsLT5hbnlQb2xpY3kpCisJCW4gPSAxOworCWVsc2UKKwkJbiA9IDA7CisJaWYgKGxldmVsLT5ub2RlcykKKwkJbiArPSBza19YNTA5X1BPTElDWV9OT0RFX251bShsZXZlbC0+bm9kZXMpOworCXJldHVybiBuOworCX0KKworWDUwOV9QT0xJQ1lfTk9ERSAqWDUwOV9wb2xpY3lfbGV2ZWxfZ2V0MF9ub2RlKFg1MDlfUE9MSUNZX0xFVkVMICpsZXZlbCwgaW50IGkpCisJeworCWlmICghbGV2ZWwpCisJCXJldHVybiBOVUxMOworCWlmIChsZXZlbC0+YW55UG9saWN5KQorCQl7CisJCWlmIChpID09IDApCisJCQlyZXR1cm4gbGV2ZWwtPmFueVBvbGljeTsKKwkJaS0tOworCQl9CisJcmV0dXJuIHNrX1g1MDlfUE9MSUNZX05PREVfdmFsdWUobGV2ZWwtPm5vZGVzLCBpKTsKKwl9CisKKy8qIFg1MDlfUE9MSUNZX05PREUgc3R1ZmYgKi8KKworY29uc3QgQVNOMV9PQkpFQ1QgKlg1MDlfcG9saWN5X25vZGVfZ2V0MF9wb2xpY3koY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSkKKwl7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbm9kZS0+ZGF0YS0+dmFsaWRfcG9saWN5OworCX0KKworI2lmIDAKK2ludCBYNTA5X3BvbGljeV9ub2RlX2dldF9jcml0aWNhbChjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlKQorCXsKKwlpZiAobm9kZV9jcml0aWNhbChub2RlKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKK1NUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqCisJCVg1MDlfcG9saWN5X25vZGVfZ2V0MF9xdWFsaWZpZXJzKGNvbnN0IFg1MDlfUE9MSUNZX05PREUgKm5vZGUpCisJeworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG5vZGUtPmRhdGEtPnF1YWxpZmllcl9zZXQ7CisJfQorCitjb25zdCBYNTA5X1BPTElDWV9OT0RFICoKKwkJWDUwOV9wb2xpY3lfbm9kZV9nZXQwX3BhcmVudChjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlKQorCXsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCXJldHVybiBub2RlLT5wYXJlbnQ7CisJfQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvcGN5X21hcC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9wY3lfbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExNjNiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvcGN5X21hcC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKiBwY3lfbWFwLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKyNpbmNsdWRlICJwY3lfaW50LmgiCisKKy8qIFNldCBwb2xpY3kgbWFwcGluZyBlbnRyaWVzIGluIGNhY2hlLgorICogTm90ZTogdGhpcyBtb2RpZmllcyB0aGUgcGFzc2VkIFBPTElDWV9NQVBQSU5HUyBzdHJ1Y3R1cmUKKyAqLworCitpbnQgcG9saWN5X2NhY2hlX3NldF9tYXBwaW5nKFg1MDkgKngsIFBPTElDWV9NQVBQSU5HUyAqbWFwcykKKwl7CisJUE9MSUNZX01BUFBJTkcgKm1hcDsKKwlYNTA5X1BPTElDWV9EQVRBICpkYXRhOworCVg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZSA9IHgtPnBvbGljeV9jYWNoZTsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpZiAoc2tfUE9MSUNZX01BUFBJTkdfbnVtKG1hcHMpID09IDApCisJCXsKKwkJcmV0ID0gLTE7CisJCWdvdG8gYmFkX21hcHBpbmc7CisJCX0KKwlmb3IgKGkgPSAwOyBpIDwgc2tfUE9MSUNZX01BUFBJTkdfbnVtKG1hcHMpOyBpKyspCisJCXsKKwkJbWFwID0gc2tfUE9MSUNZX01BUFBJTkdfdmFsdWUobWFwcywgaSk7CisJCS8qIFJlamVjdCBpZiBtYXAgdG8gb3IgZnJvbSBhbnlQb2xpY3kgKi8KKwkJaWYgKChPQkpfb2JqMm5pZChtYXAtPnN1YmplY3REb21haW5Qb2xpY3kpID09IE5JRF9hbnlfcG9saWN5KQorCQkgICB8fCAoT0JKX29iajJuaWQobWFwLT5pc3N1ZXJEb21haW5Qb2xpY3kpID09IE5JRF9hbnlfcG9saWN5KSkKKwkJCXsKKwkJCXJldCA9IC0xOworCQkJZ290byBiYWRfbWFwcGluZzsKKwkJCX0KKworCQkvKiBBdHRlbXB0IHRvIGZpbmQgbWF0Y2hpbmcgcG9saWN5IGRhdGEgKi8KKwkJZGF0YSA9IHBvbGljeV9jYWNoZV9maW5kX2RhdGEoY2FjaGUsIG1hcC0+aXNzdWVyRG9tYWluUG9saWN5KTsKKwkJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbnlQb2xpY3kgY2FuJ3QgbWFwICovCisJCWlmICghZGF0YSAmJiAhY2FjaGUtPmFueVBvbGljeSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENyZWF0ZSBhIE5PREUgZnJvbSBhbnlQb2xpY3kgKi8KKwkJaWYgKCFkYXRhKQorCQkJeworCQkJZGF0YSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBtYXAtPmlzc3VlckRvbWFpblBvbGljeSwKKwkJCQkJY2FjaGUtPmFueVBvbGljeS0+ZmxhZ3MKKwkJCQkJCSYgUE9MSUNZX0RBVEFfRkxBR19DUklUSUNBTCk7CisJCQlpZiAoIWRhdGEpCisJCQkJZ290byBiYWRfbWFwcGluZzsKKwkJCWRhdGEtPnF1YWxpZmllcl9zZXQgPSBjYWNoZS0+YW55UG9saWN5LT5xdWFsaWZpZXJfc2V0OworCQkJLyptYXAtPmlzc3VlckRvbWFpblBvbGljeSA9IE5VTEw7Ki8KKwkJCWRhdGEtPmZsYWdzIHw9IFBPTElDWV9EQVRBX0ZMQUdfTUFQUEVEX0FOWTsKKwkJCWRhdGEtPmZsYWdzIHw9IFBPTElDWV9EQVRBX0ZMQUdfU0hBUkVEX1FVQUxJRklFUlM7CisJCQlpZiAoIXNrX1g1MDlfUE9MSUNZX0RBVEFfcHVzaChjYWNoZS0+ZGF0YSwgZGF0YSkpCisJCQkJeworCQkJCXBvbGljeV9kYXRhX2ZyZWUoZGF0YSk7CisJCQkJZ290byBiYWRfbWFwcGluZzsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCWRhdGEtPmZsYWdzIHw9IFBPTElDWV9EQVRBX0ZMQUdfTUFQUEVEOworCQlpZiAoIXNrX0FTTjFfT0JKRUNUX3B1c2goZGF0YS0+ZXhwZWN0ZWRfcG9saWN5X3NldCwgCisJCQkJCQltYXAtPnN1YmplY3REb21haW5Qb2xpY3kpKQorCQkJZ290byBiYWRfbWFwcGluZzsKKwkJbWFwLT5zdWJqZWN0RG9tYWluUG9saWN5ID0gTlVMTDsKKworCQl9CisKKwlyZXQgPSAxOworCWJhZF9tYXBwaW5nOgorCWlmIChyZXQgPT0gLTEpCisJCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19JTlZBTElEX1BPTElDWTsKKwlza19QT0xJQ1lfTUFQUElOR19wb3BfZnJlZShtYXBzLCBQT0xJQ1lfTUFQUElOR19mcmVlKTsKKwlyZXR1cm4gcmV0OworCisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9wY3lfbm9kZS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My9wY3lfbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWU3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3BjeV9ub2RlLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qIHBjeV9ub2RlLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDA0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaW5jbHVkZSAicGN5X2ludC5oIgorCitzdGF0aWMgaW50IG5vZGVfY21wKGNvbnN0IFg1MDlfUE9MSUNZX05PREUgKiBjb25zdCAqYSwKKwkJCWNvbnN0IFg1MDlfUE9MSUNZX05PREUgKiBjb25zdCAqYikKKwl7CisJcmV0dXJuIE9CSl9jbXAoKCphKS0+ZGF0YS0+dmFsaWRfcG9saWN5LCAoKmIpLT5kYXRhLT52YWxpZF9wb2xpY3kpOworCX0KKworU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkgKnBvbGljeV9ub2RlX2NtcF9uZXcodm9pZCkKKwl7CisJcmV0dXJuIHNrX1g1MDlfUE9MSUNZX05PREVfbmV3KG5vZGVfY21wKTsKKwl9CisKK1g1MDlfUE9MSUNZX05PREUgKnRyZWVfZmluZF9zayhTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqbm9kZXMsCisJCQkJCWNvbnN0IEFTTjFfT0JKRUNUICppZCkKKwl7CisJWDUwOV9QT0xJQ1lfREFUQSBuOworCVg1MDlfUE9MSUNZX05PREUgbDsKKwlpbnQgaWR4OworCisJbi52YWxpZF9wb2xpY3kgPSAoQVNOMV9PQkpFQ1QgKilpZDsKKwlsLmRhdGEgPSAmbjsKKworCWlkeCA9IHNrX1g1MDlfUE9MSUNZX05PREVfZmluZChub2RlcywgJmwpOworCWlmIChpZHggPT0gLTEpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHNrX1g1MDlfUE9MSUNZX05PREVfdmFsdWUobm9kZXMsIGlkeCk7CisKKwl9CisKK1g1MDlfUE9MSUNZX05PREUgKmxldmVsX2ZpbmRfbm9kZShjb25zdCBYNTA5X1BPTElDWV9MRVZFTCAqbGV2ZWwsCisJCQkJCWNvbnN0IFg1MDlfUE9MSUNZX05PREUgKnBhcmVudCwJCisJCQkJCWNvbnN0IEFTTjFfT0JKRUNUICppZCkKKwl7CisJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZTsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9QT0xJQ1lfTk9ERV9udW0obGV2ZWwtPm5vZGVzKTsgaSsrKQorCQl7CisJCW5vZGUgPSBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKGxldmVsLT5ub2RlcywgaSk7CisJCWlmIChub2RlLT5wYXJlbnQgPT0gcGFyZW50KQorCQkJeworCQkJaWYgKCFPQkpfY21wKG5vZGUtPmRhdGEtPnZhbGlkX3BvbGljeSwgaWQpKQorCQkJCXJldHVybiBub2RlOworCQkJfQorCQl9CisJcmV0dXJuIE5VTEw7CisJfQorCitYNTA5X1BPTElDWV9OT0RFICpsZXZlbF9hZGRfbm9kZShYNTA5X1BPTElDWV9MRVZFTCAqbGV2ZWwsCisJCQljb25zdCBYNTA5X1BPTElDWV9EQVRBICpkYXRhLAorCQkJWDUwOV9QT0xJQ1lfTk9ERSAqcGFyZW50LAorCQkJWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSkKKwl7CisJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZTsKKwlub2RlID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUE9MSUNZX05PREUpKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCW5vZGUtPmRhdGEgPSBkYXRhOworCW5vZGUtPnBhcmVudCA9IHBhcmVudDsKKwlub2RlLT5uY2hpbGQgPSAwOworCWlmIChsZXZlbCkKKwkJeworCQlpZiAoT0JKX29iajJuaWQoZGF0YS0+dmFsaWRfcG9saWN5KSA9PSBOSURfYW55X3BvbGljeSkKKwkJCXsKKwkJCWlmIChsZXZlbC0+YW55UG9saWN5KQorCQkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJCWxldmVsLT5hbnlQb2xpY3kgPSBub2RlOworCQkJfQorCQllbHNlCisJCQl7CisKKwkJCWlmICghbGV2ZWwtPm5vZGVzKQorCQkJCWxldmVsLT5ub2RlcyA9IHBvbGljeV9ub2RlX2NtcF9uZXcoKTsKKwkJCWlmICghbGV2ZWwtPm5vZGVzKQorCQkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJCWlmICghc2tfWDUwOV9QT0xJQ1lfTk9ERV9wdXNoKGxldmVsLT5ub2Rlcywgbm9kZSkpCisJCQkJZ290byBub2RlX2Vycm9yOworCQkJfQorCQl9CisKKwlpZiAodHJlZSkKKwkJeworCQlpZiAoIXRyZWUtPmV4dHJhX2RhdGEpCisJCQkgdHJlZS0+ZXh0cmFfZGF0YSA9IHNrX1g1MDlfUE9MSUNZX0RBVEFfbmV3X251bGwoKTsKKwkJaWYgKCF0cmVlLT5leHRyYV9kYXRhKQorCQkJZ290byBub2RlX2Vycm9yOworCQlpZiAoIXNrX1g1MDlfUE9MSUNZX0RBVEFfcHVzaCh0cmVlLT5leHRyYV9kYXRhLCBkYXRhKSkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJfQorCisJaWYgKHBhcmVudCkKKwkJcGFyZW50LT5uY2hpbGQrKzsKKworCXJldHVybiBub2RlOworCisJbm9kZV9lcnJvcjoKKwlwb2xpY3lfbm9kZV9mcmVlKG5vZGUpOworCXJldHVybiAwOworCisJfQorCit2b2lkIHBvbGljeV9ub2RlX2ZyZWUoWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSkKKwl7CisJT1BFTlNTTF9mcmVlKG5vZGUpOworCX0KKworLyogU2VlIGlmIGEgcG9saWN5IG5vZGUgbWF0Y2hlcyBhIHBvbGljeSBPSUQuIElmIG1hcHBpbmcgZW5hYmxlZCBsb29rIHRocm91Z2gKKyAqIGV4cGVjdGVkIHBvbGljeSBzZXQgb3RoZXJ3aXNlIGp1c3QgdmFsaWQgcG9saWN5LgorICovCisKK2ludCBwb2xpY3lfbm9kZV9tYXRjaChjb25zdCBYNTA5X1BPTElDWV9MRVZFTCAqbHZsLAorCQkgICAgICBjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlLCBjb25zdCBBU04xX09CSkVDVCAqb2lkKQorCXsKKwlpbnQgaTsKKwlBU04xX09CSkVDVCAqcG9saWN5X29pZDsKKwljb25zdCBYNTA5X1BPTElDWV9EQVRBICp4ID0gbm9kZS0+ZGF0YTsKKworCWlmICgJICAgIChsdmwtPmZsYWdzICYgWDUwOV9WX0ZMQUdfSU5ISUJJVF9NQVApCisJCXx8ICEoeC0+ZmxhZ3MgJiBQT0xJQ1lfREFUQV9GTEFHX01BUF9NQVNLKSkKKwkJeworCQlpZiAoIU9CSl9jbXAoeC0+dmFsaWRfcG9saWN5LCBvaWQpKQorCQkJcmV0dXJuIDE7CisJCXJldHVybiAwOworCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKHgtPmV4cGVjdGVkX3BvbGljeV9zZXQpOyBpKyspCisJCXsKKwkJcG9saWN5X29pZCA9IHNrX0FTTjFfT0JKRUNUX3ZhbHVlKHgtPmV4cGVjdGVkX3BvbGljeV9zZXQsIGkpOworCQlpZiAoIU9CSl9jbXAocG9saWN5X29pZCwgb2lkKSkKKwkJCXJldHVybiAxOworCQl9CisJcmV0dXJuIDA7CisKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3BjeV90cmVlLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3BjeV90cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJmNmIyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvcGN5X3RyZWUuYwpAQCAtMCwwICsxLDg3MyBAQAorLyogcGN5X3RyZWUuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDQuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgInBjeV9pbnQuaCIKKworLyogRW5hYmxlIHRoaXMgdG8gcHJpbnQgb3V0IHRoZSBjb21wbGV0ZSBwb2xpY3kgdHJlZSBhdCB2YXJpb3VzIHBvaW50IGR1cmluZworICogZXZhbHVhdGlvbi4KKyAqLworCisvKiNkZWZpbmUgT1BFTlNTTF9QT0xJQ1lfREVCVUcqLworCisjaWZkZWYgT1BFTlNTTF9QT0xJQ1lfREVCVUcKKworc3RhdGljIHZvaWQgZXhwZWN0ZWRfcHJpbnQoQklPICplcnIsIFg1MDlfUE9MSUNZX0xFVkVMICpsZXYsCisJCQkJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSwgaW50IGluZGVudCkKKwl7CisJaWYgKAkgICAgKGxldi0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19JTkhJQklUX01BUCkKKwkJfHwgIShub2RlLT5kYXRhLT5mbGFncyAmIFBPTElDWV9EQVRBX0ZMQUdfTUFQX01BU0spKQorCQlCSU9fcHV0cyhlcnIsICIgIE5vdCBNYXBwZWRcbiIpOworCWVsc2UKKwkJeworCQlpbnQgaTsKKwkJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICpwc2V0ID0gbm9kZS0+ZGF0YS0+ZXhwZWN0ZWRfcG9saWN5X3NldDsKKwkJQVNOMV9PQkpFQ1QgKm9pZDsKKwkJQklPX3B1dHMoZXJyLCAiICBFeHBlY3RlZDogIik7CisJCWZvciAoaSA9IDA7IGkgPCBza19BU04xX09CSkVDVF9udW0ocHNldCk7IGkrKykKKwkJCXsKKwkJCW9pZCA9IHNrX0FTTjFfT0JKRUNUX3ZhbHVlKHBzZXQsIGkpOworCQkJaWYgKGkpCisJCQkJQklPX3B1dHMoZXJyLCAiLCAiKTsKKwkJCWkyYV9BU04xX09CSkVDVChlcnIsIG9pZCk7CisJCQl9CisJCUJJT19wdXRzKGVyciwgIlxuIik7CisJCX0KKwl9CisKK3N0YXRpYyB2b2lkIHRyZWVfcHJpbnQoY2hhciAqc3RyLCBYNTA5X1BPTElDWV9UUkVFICp0cmVlLAorCQkJWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnIpCisJeworCVg1MDlfUE9MSUNZX0xFVkVMICpwbGV2OworCVg1MDlfUE9MSUNZX05PREUgKm5vZGU7CisJaW50IGk7CisJQklPICplcnI7CisJZXJyID0gQklPX25ld19mcChzdGRlcnIsIEJJT19OT0NMT1NFKTsKKwlpZiAoIWN1cnIpCisJCWN1cnIgPSB0cmVlLT5sZXZlbHMgKyB0cmVlLT5ubGV2ZWw7CisJZWxzZQorCQljdXJyKys7CisJQklPX3ByaW50ZihlcnIsICJMZXZlbCBwcmludCBhZnRlciAlc1xuIiwgc3RyKTsKKwlCSU9fcHJpbnRmKGVyciwgIlByaW50aW5nIFVwIHRvIExldmVsICVsZFxuIiwgY3VyciAtIHRyZWUtPmxldmVscyk7CisJZm9yIChwbGV2ID0gdHJlZS0+bGV2ZWxzOyBwbGV2ICE9IGN1cnI7IHBsZXYrKykKKwkJeworCQlCSU9fcHJpbnRmKGVyciwgIkxldmVsICVsZCwgZmxhZ3MgPSAleFxuIiwKKwkJCQlwbGV2IC0gdHJlZS0+bGV2ZWxzLCBwbGV2LT5mbGFncyk7CisJCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X1BPTElDWV9OT0RFX251bShwbGV2LT5ub2Rlcyk7IGkrKykKKwkJCXsKKwkJCW5vZGUgPSBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKHBsZXYtPm5vZGVzLCBpKTsKKwkJCVg1MDlfUE9MSUNZX05PREVfcHJpbnQoZXJyLCBub2RlLCAyKTsKKwkJCWV4cGVjdGVkX3ByaW50KGVyciwgcGxldiwgbm9kZSwgMik7CisJCQlCSU9fcHJpbnRmKGVyciwgIiAgRmxhZ3M6ICV4XG4iLCBub2RlLT5kYXRhLT5mbGFncyk7CisJCQl9CisJCWlmIChwbGV2LT5hbnlQb2xpY3kpCisJCQlYNTA5X1BPTElDWV9OT0RFX3ByaW50KGVyciwgcGxldi0+YW55UG9saWN5LCAyKTsKKwkJfQorCisJQklPX2ZyZWUoZXJyKTsKKworCX0KKyNlbHNlCisKKyNkZWZpbmUgdHJlZV9wcmludChhLGIsYykgLyogKi8KKworI2VuZGlmCisKKy8qIEluaXRpYWxpemUgcG9saWN5IHRyZWUuIFJldHVybiB2YWx1ZXM6CisgKiAgMCBTb21lIGludGVybmFsIGVycm9yIG9jY3VyZWQuCisgKiAtMSBJbmNvbnNpc3RlbnQgb3IgaW52YWxpZCBleHRlbnNpb25zIGluIGNlcnRpZmljYXRlcy4KKyAqICAxIFRyZWUgaW5pdGlhbGl6ZWQgT0suCisgKiAgMiBQb2xpY3kgdHJlZSBpcyBlbXB0eS4KKyAqICA1IFRyZWUgT0sgYW5kIHJlcXVpcmVFeHBsaWNpdFBvbGljeSB0cnVlLgorICogIDYgVHJlZSBlbXB0eSBhbmQgcmVxdWlyZUV4cGxpY2l0UG9saWN5IHRydWUuCisgKi8KKworc3RhdGljIGludCB0cmVlX2luaXQoWDUwOV9QT0xJQ1lfVFJFRSAqKnB0cmVlLCBTVEFDS19PRihYNTA5KSAqY2VydHMsCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCisJeworCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWU7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsOworCWNvbnN0IFg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZTsKKwlYNTA5X1BPTElDWV9EQVRBICpkYXRhID0gTlVMTDsKKwlYNTA5ICp4OworCWludCByZXQgPSAxOworCWludCBpLCBuOworCWludCBleHBsaWNpdF9wb2xpY3k7CisJaW50IGFueV9za2lwOworCWludCBtYXBfc2tpcDsKKwkqcHRyZWUgPSBOVUxMOworCW4gPSBza19YNTA5X251bShjZXJ0cyk7CisKKyNpZiAwCisJLyogRGlzYWJsZSBwb2xpY3kgbWFwcGluZyBmb3Igbm93Li4uICovCisJZmxhZ3MgfD0gWDUwOV9WX0ZMQUdfSU5ISUJJVF9NQVA7CisjZW5kaWYKKworCWlmIChmbGFncyAmIFg1MDlfVl9GTEFHX0VYUExJQ0lUX1BPTElDWSkKKwkJZXhwbGljaXRfcG9saWN5ID0gMDsKKwllbHNlCisJCWV4cGxpY2l0X3BvbGljeSA9IG4gKyAxOworCisJaWYgKGZsYWdzICYgWDUwOV9WX0ZMQUdfSU5ISUJJVF9BTlkpCisJCWFueV9za2lwID0gMDsKKwllbHNlCisJCWFueV9za2lwID0gbiArIDE7CisKKwlpZiAoZmxhZ3MgJiBYNTA5X1ZfRkxBR19JTkhJQklUX01BUCkKKwkJbWFwX3NraXAgPSAwOworCWVsc2UKKwkJbWFwX3NraXAgPSBuICsgMTsKKworCS8qIENhbid0IGRvIGFueXRoaW5nIHdpdGgganVzdCBhIHRydXN0IGFuY2hvciAqLworCWlmIChuID09IDEpCisJCXJldHVybiAxOworCS8qIEZpcnN0IHNldHVwIHBvbGljeSBjYWNoZSBpbiBhbGwgY2VydGlmaWNhdGVzIGFwYXJ0IGZyb20gdGhlCisJICogdHJ1c3QgYW5jaG9yLiBOb3RlIGFueSBiYWQgY2FjaGUgcmVzdWx0cyBvbiB0aGUgd2F5LiBBbHNvIGNhbgorCSAqIGNhbGN1bGF0ZSBleHBsaWNpdF9wb2xpY3kgdmFsdWUgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlmb3IgKGkgPSBuIC0gMjsgaSA+PSAwOyBpLS0pCisJCXsKKwkJeCA9IHNrX1g1MDlfdmFsdWUoY2VydHMsIGkpOworCQlYNTA5X2NoZWNrX3B1cnBvc2UoeCwgLTEsIC0xKTsKKwkJY2FjaGUgPSBwb2xpY3lfY2FjaGVfc2V0KHgpOworCQkvKiBJZiBjYWNoZSBOVUxMIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQ6IHJldHVybiBpbW1lZGlhdGVseSAqLworCQlpZiAoY2FjaGUgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQkvKiBJZiBpbmNvbnNpc3RlbnQgZXh0ZW5zaW9ucyBrZWVwIGEgbm90ZSBvZiBpdCBidXQgY29udGludWUgKi8KKwkJaWYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX0lOVkFMSURfUE9MSUNZKQorCQkJcmV0ID0gLTE7CisJCS8qIE90aGVyd2lzZSBpZiB3ZSBoYXZlIG5vIGRhdGEgKGhlbmNlIG5vIENlcnRpZmljYXRlUG9saWNpZXMpCisJCSAqIGFuZCBoYXZlbid0IGFscmVhZHkgc2V0IGFuIGluY29uc2lzdGVudCBjb2RlIG5vdGUgaXQuCisJCSAqLworCQllbHNlIGlmICgocmV0ID09IDEpICYmICFjYWNoZS0+ZGF0YSkKKwkJCXJldCA9IDI7CisJCWlmIChleHBsaWNpdF9wb2xpY3kgPiAwKQorCQkJeworCQkJaWYgKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU0kpKQorCQkJCWV4cGxpY2l0X3BvbGljeS0tOworCQkJaWYgKChjYWNoZS0+ZXhwbGljaXRfc2tpcCAhPSAtMSkKKwkJCQkmJiAoY2FjaGUtPmV4cGxpY2l0X3NraXAgPCBleHBsaWNpdF9wb2xpY3kpKQorCQkJCWV4cGxpY2l0X3BvbGljeSA9IGNhY2hlLT5leHBsaWNpdF9za2lwOworCQkJfQorCQl9CisKKwlpZiAocmV0ICE9IDEpCisJCXsKKwkJaWYgKHJldCA9PSAyICYmICFleHBsaWNpdF9wb2xpY3kpCisJCQlyZXR1cm4gNjsKKwkJcmV0dXJuIHJldDsKKwkJfQorCisKKwkvKiBJZiB3ZSBnZXQgdGhpcyBmYXIgaW5pdGlhbGl6ZSB0aGUgdHJlZSAqLworCisJdHJlZSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1BPTElDWV9UUkVFKSk7CisKKwlpZiAoIXRyZWUpCisJCXJldHVybiAwOworCisJdHJlZS0+ZmxhZ3MgPSAwOworCXRyZWUtPmxldmVscyA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihYNTA5X1BPTElDWV9MRVZFTCkgKiBuKTsKKwl0cmVlLT5ubGV2ZWwgPSAwOworCXRyZWUtPmV4dHJhX2RhdGEgPSBOVUxMOworCXRyZWUtPmF1dGhfcG9saWNpZXMgPSBOVUxMOworCXRyZWUtPnVzZXJfcG9saWNpZXMgPSBOVUxMOworCisJaWYgKCF0cmVlLT5sZXZlbHMpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHRyZWUpOworCQlyZXR1cm4gMDsKKwkJfQorCisJbWVtc2V0KHRyZWUtPmxldmVscywgMCwgbiAqIHNpemVvZihYNTA5X1BPTElDWV9MRVZFTCkpOworCisJdHJlZS0+bmxldmVsID0gbjsKKworCWxldmVsID0gdHJlZS0+bGV2ZWxzOworCisJLyogUm9vdCBkYXRhOiBpbml0aWFsaXplIHRvIGFueVBvbGljeSAqLworCisJZGF0YSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBPQkpfbmlkMm9iaihOSURfYW55X3BvbGljeSksIDApOworCisJaWYgKCFkYXRhIHx8ICFsZXZlbF9hZGRfbm9kZShsZXZlbCwgZGF0YSwgTlVMTCwgdHJlZSkpCisJCWdvdG8gYmFkX3RyZWU7CisKKwlmb3IgKGkgPSBuIC0gMjsgaSA+PSAwOyBpLS0pCisJCXsKKwkJbGV2ZWwrKzsKKwkJeCA9IHNrX1g1MDlfdmFsdWUoY2VydHMsIGkpOworCQljYWNoZSA9IHBvbGljeV9jYWNoZV9zZXQoeCk7CisJCUNSWVBUT19hZGQoJngtPnJlZmVyZW5jZXMsIDEsIENSWVBUT19MT0NLX1g1MDkpOworCQlsZXZlbC0+Y2VydCA9IHg7CisKKwkJaWYgKCFjYWNoZS0+YW55UG9saWN5KQorCQkJCWxldmVsLT5mbGFncyB8PSBYNTA5X1ZfRkxBR19JTkhJQklUX0FOWTsKKworCQkvKiBEZXRlcm1pbmUgaW5oaWJpdCBhbnkgYW5kIGluaGliaXQgbWFwIGZsYWdzICovCisJCWlmIChhbnlfc2tpcCA9PSAwKQorCQkJeworCQkJLyogQW55IG1hdGNoaW5nIGFsbG93ZWQgaWYgY2VydGlmaWNhdGUgaXMgc2VsZgorCQkJICogaXNzdWVkIGFuZCBub3QgdGhlIGxhc3QgaW4gdGhlIGNoYWluLgorCQkJICovCisJCQlpZiAoISh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkgfHwgKGkgPT0gMCkpCisJCQkJbGV2ZWwtPmZsYWdzIHw9IFg1MDlfVl9GTEFHX0lOSElCSVRfQU5ZOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoISh4LT5leF9mbGFncyAmIEVYRkxBR19TSSkpCisJCQkJYW55X3NraXAtLTsKKwkJCWlmICgoY2FjaGUtPmFueV9za2lwID49IDApCisJCQkJJiYgKGNhY2hlLT5hbnlfc2tpcCA8IGFueV9za2lwKSkKKwkJCQlhbnlfc2tpcCA9IGNhY2hlLT5hbnlfc2tpcDsKKwkJCX0KKworCQlpZiAobWFwX3NraXAgPT0gMCkKKwkJCWxldmVsLT5mbGFncyB8PSBYNTA5X1ZfRkxBR19JTkhJQklUX01BUDsKKwkJZWxzZQorCQkJeworCQkJaWYgKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU0kpKQorCQkJCW1hcF9za2lwLS07CisJCQlpZiAoKGNhY2hlLT5tYXBfc2tpcCA+PSAwKQorCQkJCSYmIChjYWNoZS0+bWFwX3NraXAgPCBtYXBfc2tpcCkpCisJCQkJbWFwX3NraXAgPSBjYWNoZS0+bWFwX3NraXA7CisJCQl9CisKKwkJfQorCisJKnB0cmVlID0gdHJlZTsKKworCWlmIChleHBsaWNpdF9wb2xpY3kpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDU7CisKKwliYWRfdHJlZToKKworCVg1MDlfcG9saWN5X3RyZWVfZnJlZSh0cmVlKTsKKworCXJldHVybiAwOworCisJfQorCitzdGF0aWMgaW50IHRyZWVfbGlua19tYXRjaGluZ19ub2RlcyhYNTA5X1BPTElDWV9MRVZFTCAqY3VyciwKKwkJCQljb25zdCBYNTA5X1BPTElDWV9EQVRBICpkYXRhKQorCXsKKwlYNTA5X1BPTElDWV9MRVZFTCAqbGFzdCA9IGN1cnIgLSAxOworCVg1MDlfUE9MSUNZX05PREUgKm5vZGU7CisJaW50IGksIG1hdGNoZWQgPSAwOworCS8qIEl0ZXJhdGUgdGhyb3VnaCBhbGwgaW4gbm9kZXMgbGlua2luZyBtYXRjaGVzICovCisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfUE9MSUNZX05PREVfbnVtKGxhc3QtPm5vZGVzKTsgaSsrKQorCQl7CisJCW5vZGUgPSBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKGxhc3QtPm5vZGVzLCBpKTsKKwkJaWYgKHBvbGljeV9ub2RlX21hdGNoKGxhc3QsIG5vZGUsIGRhdGEtPnZhbGlkX3BvbGljeSkpCisJCQl7CisJCQlpZiAoIWxldmVsX2FkZF9ub2RlKGN1cnIsIGRhdGEsIG5vZGUsIE5VTEwpKQorCQkJCXJldHVybiAwOworCQkJbWF0Y2hlZCA9IDE7CisJCQl9CisJCX0KKwlpZiAoIW1hdGNoZWQgJiYgbGFzdC0+YW55UG9saWN5KQorCQl7CisJCWlmICghbGV2ZWxfYWRkX25vZGUoY3VyciwgZGF0YSwgbGFzdC0+YW55UG9saWN5LCBOVUxMKSkKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCisvKiBUaGlzIGNvcnJlc3BvbmRzIHRvIFJGQzMyODAgNi4xLjMoZCkoMSk6CisgKiBsaW5rIGFueSBkYXRhIGZyb20gQ2VydGlmaWNhdGVQb2xpY2llcyBvbnRvIG1hdGNoaW5nIHBhcmVudAorICogb3IgYW55UG9saWN5IGlmIG5vIG1hdGNoLgorICovCisKK3N0YXRpYyBpbnQgdHJlZV9saW5rX25vZGVzKFg1MDlfUE9MSUNZX0xFVkVMICpjdXJyLAorCQkJCWNvbnN0IFg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZSkKKwl7CisJaW50IGk7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKmxhc3Q7CisJWDUwOV9QT0xJQ1lfREFUQSAqZGF0YTsKKwlsYXN0ID0gY3VyciAtIDE7CisJZm9yIChpID0gMDsgaSA8IHNrX1g1MDlfUE9MSUNZX0RBVEFfbnVtKGNhY2hlLT5kYXRhKTsgaSsrKQorCQl7CisJCWRhdGEgPSBza19YNTA5X1BPTElDWV9EQVRBX3ZhbHVlKGNhY2hlLT5kYXRhLCBpKTsKKwkJLyogSWYgYSBub2RlIGlzIG1hcHBlZCBhbnkgaXQgZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZworCQkgKiBDZXJ0aWZpY2F0ZVBvbGljaWVzIGVudHJ5LiAKKwkJICogSG93ZXZlciBzdWNoIGFuIGlkZW50aWNhbCBub2RlIHdvdWxkIGJlIGNyZWF0ZWQKKwkJICogaWYgYW55UG9saWN5IG1hdGNoaW5nIGlzIGVuYWJsZWQgYmVjYXVzZSB0aGVyZSB3b3VsZCBiZQorCQkgKiBubyBtYXRjaCB3aXRoIHRoZSBwYXJlbnQgdmFsaWRfcG9saWN5X3NldC4gU28gd2UgY3JlYXRlCisJCSAqIGxpbmsgYmVjYXVzZSB0aGVuIGl0IHdpbGwgaGF2ZSB0aGUgbWFwcGluZyBmbGFncworCQkgKiByaWdodCBhbmQgd2UgY2FuIHBydW5lIGl0IGxhdGVyLgorCQkgKi8KKyNpZiAwCisJCWlmICgoZGF0YS0+ZmxhZ3MgJiBQT0xJQ1lfREFUQV9GTEFHX01BUFBFRF9BTlkpCisJCQkmJiAhKGN1cnItPmZsYWdzICYgWDUwOV9WX0ZMQUdfSU5ISUJJVF9BTlkpKQorCQkJY29udGludWU7CisjZW5kaWYKKwkJLyogTG9vayBmb3IgbWF0Y2hpbmcgbm9kZXMgaW4gcHJldmlvdXMgbGV2ZWwgKi8KKwkJaWYgKCF0cmVlX2xpbmtfbWF0Y2hpbmdfbm9kZXMoY3VyciwgZGF0YSkpCisJCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKy8qIFRoaXMgY29ycmVzcG9uZHMgdG8gUkZDMzI4MCA2LjEuMyhkKSgyKToKKyAqIENyZWF0ZSBuZXcgZGF0YSBmb3IgYW55IHVubWF0Y2hlZCBwb2xpY2llcyBpbiB0aGUgcGFyZW50IGFuZCBsaW5rCisgKiB0byBhbnlQb2xpY3kuCisgKi8KKworc3RhdGljIGludCB0cmVlX2FkZF91bm1hdGNoZWQoWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnIsCisJCQljb25zdCBYNTA5X1BPTElDWV9DQUNIRSAqY2FjaGUsCisJCQljb25zdCBBU04xX09CSkVDVCAqaWQsCisJCQlYNTA5X1BPTElDWV9OT0RFICpub2RlLAorCQkJWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSkKKwl7CisJWDUwOV9QT0xJQ1lfREFUQSAqZGF0YTsKKwlpZiAoaWQgPT0gTlVMTCkKKwkJaWQgPSBub2RlLT5kYXRhLT52YWxpZF9wb2xpY3k7CisJLyogQ3JlYXRlIGEgbmV3IG5vZGUgd2l0aCBxdWFsaWZpZXJzIGZyb20gYW55UG9saWN5IGFuZAorCSAqIGlkIGZyb20gdW5tYXRjaGVkIG5vZGUuCisJICovCisJZGF0YSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBpZCwgbm9kZV9jcml0aWNhbChub2RlKSk7CisKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwkvKiBDdXJyIG1heSBub3QgaGF2ZSBhbnlQb2xpY3kgKi8KKwlkYXRhLT5xdWFsaWZpZXJfc2V0ID0gY2FjaGUtPmFueVBvbGljeS0+cXVhbGlmaWVyX3NldDsKKwlkYXRhLT5mbGFncyB8PSBQT0xJQ1lfREFUQV9GTEFHX1NIQVJFRF9RVUFMSUZJRVJTOworCWlmICghbGV2ZWxfYWRkX25vZGUoY3VyciwgZGF0YSwgbm9kZSwgdHJlZSkpCisJCXsKKwkJcG9saWN5X2RhdGFfZnJlZShkYXRhKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCB0cmVlX2xpbmtfdW5tYXRjaGVkKFg1MDlfUE9MSUNZX0xFVkVMICpjdXJyLAorCQkJY29uc3QgWDUwOV9QT0xJQ1lfQ0FDSEUgKmNhY2hlLAorCQkJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSwKKwkJCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCWNvbnN0IFg1MDlfUE9MSUNZX0xFVkVMICpsYXN0ID0gY3VyciAtIDE7CisJaW50IGk7CisKKwlpZiAoCSAgICAobGFzdC0+ZmxhZ3MgJiBYNTA5X1ZfRkxBR19JTkhJQklUX01BUCkKKwkJfHwgIShub2RlLT5kYXRhLT5mbGFncyAmIFBPTElDWV9EQVRBX0ZMQUdfTUFQUEVEKSkKKwkJeworCQkvKiBJZiBubyBwb2xpY3kgbWFwcGluZzogbWF0Y2hlZCBpZiBvbmUgY2hpbGQgcHJlc2VudCAqLworCQlpZiAobm9kZS0+bmNoaWxkKQorCQkJcmV0dXJuIDE7CisJCWlmICghdHJlZV9hZGRfdW5tYXRjaGVkKGN1cnIsIGNhY2hlLCBOVUxMLCBub2RlLCB0cmVlKSkKKwkJCXJldHVybiAwOworCQkvKiBBZGQgaXQgKi8KKwkJfQorCWVsc2UKKwkJeworCQkvKiBJZiBtYXBwaW5nOiBtYXRjaGVkIGlmIG9uZSBjaGlsZCBwZXIgZXhwZWN0ZWQgcG9saWN5IHNldCAqLworCQlTVEFDS19PRihBU04xX09CSkVDVCkgKmV4cHNldCA9IG5vZGUtPmRhdGEtPmV4cGVjdGVkX3BvbGljeV9zZXQ7CisJCWlmIChub2RlLT5uY2hpbGQgPT0gc2tfQVNOMV9PQkpFQ1RfbnVtKGV4cHNldCkpCisJCQlyZXR1cm4gMTsKKwkJLyogTG9jYXRlIHVubWF0Y2hlZCBub2RlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKGV4cHNldCk7IGkrKykKKwkJCXsKKwkJCUFTTjFfT0JKRUNUICpvaWQgPSBza19BU04xX09CSkVDVF92YWx1ZShleHBzZXQsIGkpOworCQkJaWYgKGxldmVsX2ZpbmRfbm9kZShjdXJyLCBub2RlLCBvaWQpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCF0cmVlX2FkZF91bm1hdGNoZWQoY3VyciwgY2FjaGUsIG9pZCwgbm9kZSwgdHJlZSkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJfQorCisJcmV0dXJuIDE7CisKKwl9CisKK3N0YXRpYyBpbnQgdHJlZV9saW5rX2FueShYNTA5X1BPTElDWV9MRVZFTCAqY3VyciwKKwkJCWNvbnN0IFg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZSwKKwkJCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCWludCBpOworCS8qWDUwOV9QT0xJQ1lfREFUQSAqZGF0YTsqLworCVg1MDlfUE9MSUNZX05PREUgKm5vZGU7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKmxhc3QgPSBjdXJyIC0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBza19YNTA5X1BPTElDWV9OT0RFX251bShsYXN0LT5ub2Rlcyk7IGkrKykKKwkJeworCQlub2RlID0gc2tfWDUwOV9QT0xJQ1lfTk9ERV92YWx1ZShsYXN0LT5ub2RlcywgaSk7CisKKwkJaWYgKCF0cmVlX2xpbmtfdW5tYXRjaGVkKGN1cnIsIGNhY2hlLCBub2RlLCB0cmVlKSkKKwkJCXJldHVybiAwOworCisjaWYgMAorCisJCS8qIFNraXAgYW55IG5vZGUgd2l0aCBhbnkgY2hpbGRyZW46IHdlIG9ubHkgd2FudCB1bm1hdGhjZWQKKwkJICogbm9kZXMuCisJCSAqCisJCSAqIE5vdGU6IG5lZWQgc29tZXRoaW5nIGJldHRlciBmb3IgcG9saWN5IG1hcHBpbmcKKwkJICogYmVjYXVzZSBlYWNoIG5vZGUgbWF5IGhhdmUgbXVsdGlwbGUgY2hpbGRyZW4gCisJCSAqLworCQlpZiAobm9kZS0+bmNoaWxkKQorCQkJY29udGludWU7CisKKwkJLyogQ3JlYXRlIGEgbmV3IG5vZGUgd2l0aCBxdWFsaWZpZXJzIGZyb20gYW55UG9saWN5IGFuZAorCQkgKiBpZCBmcm9tIHVubWF0Y2hlZCBub2RlLgorCQkgKi8KKwkJZGF0YSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBub2RlLT5kYXRhLT52YWxpZF9wb2xpY3ksIAorCQkJCQkJbm9kZV9jcml0aWNhbChub2RlKSk7CisKKwkJaWYgKGRhdGEgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCQkvKiBDdXJyIG1heSBub3QgaGF2ZSBhbnlQb2xpY3kgKi8KKwkJZGF0YS0+cXVhbGlmaWVyX3NldCA9IGNhY2hlLT5hbnlQb2xpY3ktPnF1YWxpZmllcl9zZXQ7CisJCWRhdGEtPmZsYWdzIHw9IFBPTElDWV9EQVRBX0ZMQUdfU0hBUkVEX1FVQUxJRklFUlM7CisJCWlmICghbGV2ZWxfYWRkX25vZGUoY3VyciwgZGF0YSwgbm9kZSwgdHJlZSkpCisJCQl7CisJCQlwb2xpY3lfZGF0YV9mcmVlKGRhdGEpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKyNlbmRpZgorCisJCX0KKwkvKiBGaW5hbGx5IGFkZCBsaW5rIHRvIGFueVBvbGljeSAqLworCWlmIChsYXN0LT5hbnlQb2xpY3kpCisJCXsKKwkJaWYgKCFsZXZlbF9hZGRfbm9kZShjdXJyLCBjYWNoZS0+YW55UG9saWN5LAorCQkJCQkJbGFzdC0+YW55UG9saWN5LCBOVUxMKSkKKwkJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCisvKiBQcnVuZSB0aGUgdHJlZTogZGVsZXRlIGFueSBjaGlsZCBtYXBwZWQgY2hpbGQgZGF0YSBvbiB0aGUgY3VycmVudCBsZXZlbAorICogdGhlbiBwcm9jZWVkIHVwIHRoZSB0cmVlIGRlbGV0aW5nIGFueSBkYXRhIHdpdGggbm8gY2hpbGRyZW4uIElmIHdlIGV2ZXIKKyAqIGhhdmUgbm8gZGF0YSBvbiBhIGxldmVsIHdlIGNhbiBoYWx0IGJlY2F1c2UgdGhlIHRyZWUgd2lsbCBiZSBlbXB0eS4KKyAqLworCitzdGF0aWMgaW50IHRyZWVfcHJ1bmUoWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSwgWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnIpCisJeworCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICpub2RlczsKKwlYNTA5X1BPTElDWV9OT0RFICpub2RlOworCWludCBpOworCW5vZGVzID0gY3Vyci0+bm9kZXM7CisJaWYgKGN1cnItPmZsYWdzICYgWDUwOV9WX0ZMQUdfSU5ISUJJVF9NQVApCisJCXsKKwkJZm9yIChpID0gc2tfWDUwOV9QT0xJQ1lfTk9ERV9udW0obm9kZXMpIC0gMTsgaSA+PSAwOyBpLS0pCisJCQl7CisJCQlub2RlID0gc2tfWDUwOV9QT0xJQ1lfTk9ERV92YWx1ZShub2RlcywgaSk7CisJCQkvKiBEZWxldGUgYW55IG1hcHBlZCBkYXRhOiBzZWUgUkZDMzI4MCBYWFhYICovCisJCQlpZiAobm9kZS0+ZGF0YS0+ZmxhZ3MgJiBQT0xJQ1lfREFUQV9GTEFHX01BUF9NQVNLKQorCQkJCXsKKwkJCQlub2RlLT5wYXJlbnQtPm5jaGlsZC0tOworCQkJCU9QRU5TU0xfZnJlZShub2RlKTsKKwkJCQkodm9pZClza19YNTA5X1BPTElDWV9OT0RFX2RlbGV0ZShub2RlcyxpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCWZvcig7OykJeworCQktLWN1cnI7CisJCW5vZGVzID0gY3Vyci0+bm9kZXM7CisJCWZvciAoaSA9IHNrX1g1MDlfUE9MSUNZX05PREVfbnVtKG5vZGVzKSAtIDE7IGkgPj0gMDsgaS0tKQorCQkJeworCQkJbm9kZSA9IHNrX1g1MDlfUE9MSUNZX05PREVfdmFsdWUobm9kZXMsIGkpOworCQkJaWYgKG5vZGUtPm5jaGlsZCA9PSAwKQorCQkJCXsKKwkJCQlub2RlLT5wYXJlbnQtPm5jaGlsZC0tOworCQkJCU9QRU5TU0xfZnJlZShub2RlKTsKKwkJCQkodm9pZClza19YNTA5X1BPTElDWV9OT0RFX2RlbGV0ZShub2RlcywgaSk7CisJCQkJfQorCQkJfQorCQlpZiAoY3Vyci0+YW55UG9saWN5ICYmICFjdXJyLT5hbnlQb2xpY3ktPm5jaGlsZCkKKwkJCXsKKwkJCWlmIChjdXJyLT5hbnlQb2xpY3ktPnBhcmVudCkKKwkJCQljdXJyLT5hbnlQb2xpY3ktPnBhcmVudC0+bmNoaWxkLS07CisJCQlPUEVOU1NMX2ZyZWUoY3Vyci0+YW55UG9saWN5KTsKKwkJCWN1cnItPmFueVBvbGljeSA9IE5VTEw7CisJCQl9CisJCWlmIChjdXJyID09IHRyZWUtPmxldmVscykKKwkJCXsKKwkJCS8qIElmIHdlIHphcHBlZCBhbnlQb2xpY3kgYXQgdG9wIHRoZW4gdHJlZSBpcyBlbXB0eSAqLworCQkJaWYgKCFjdXJyLT5hbnlQb2xpY3kpCisJCQkJCXJldHVybiAyOworCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKworCXJldHVybiAxOworCisJfQorCitzdGF0aWMgaW50IHRyZWVfYWRkX2F1dGhfbm9kZShTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqKnBub2RlcywKKwkJCQkJCSBYNTA5X1BPTElDWV9OT0RFICpwY3kpCisJeworCWlmICghKnBub2RlcykKKwkJeworCQkqcG5vZGVzID0gcG9saWN5X25vZGVfY21wX25ldygpOworCQlpZiAoISpwbm9kZXMpCisJCQlyZXR1cm4gMDsKKwkJfQorCWVsc2UgaWYgKHNrX1g1MDlfUE9MSUNZX05PREVfZmluZCgqcG5vZGVzLCBwY3kpICE9IC0xKQorCQlyZXR1cm4gMTsKKworCWlmICghc2tfWDUwOV9QT0xJQ1lfTk9ERV9wdXNoKCpwbm9kZXMsIHBjeSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7CisKKwl9CisKKy8qIENhbGN1bGF0ZSB0aGUgYXV0aG9yaXR5IHNldCBiYXNlZCBvbiBwb2xpY3kgdHJlZS4KKyAqIFRoZSAncG5vZGVzJyBwYXJhbWV0ZXIgaXMgdXNlZCBhcyBhIHN0b3JlIGZvciB0aGUgc2V0IG9mIHBvbGljeSBub2RlcworICogdXNlZCB0byBjYWxjdWxhdGUgdGhlIHVzZXIgc2V0LiBJZiB0aGUgYXV0aG9yaXR5IHNldCBpcyBub3QgYW55UG9saWN5CisgKiB0aGVuIHBub2RlcyB3aWxsIGp1c3QgcG9pbnQgdG8gdGhlIGF1dGhvcml0eSBzZXQuIElmIGhvd2V2ZXIgdGhlIGF1dGhvcml0eQorICogc2V0IGlzIGFueVBvbGljeSB0aGVuIHRoZSBzZXQgb2YgdmFsaWQgcG9saWNpZXMgKG90aGVyIHRoYW4gYW55UG9saWN5KQorICogaXMgc3RvcmUgaW4gcG5vZGVzLiBUaGUgcmV0dXJuIHZhbHVlIG9mICcyJyBpcyB1c2VkIGluIHRoaXMgY2FzZSB0byBpbmRpY2F0ZQorICogdGhhdCBwbm9kZXMgc2hvdWxkIGJlIGZyZWVkLgorICovCisKK3N0YXRpYyBpbnQgdHJlZV9jYWxjdWxhdGVfYXV0aG9yaXR5X3NldChYNTA5X1BPTElDWV9UUkVFICp0cmVlLAorCQkJCQlTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqKnBub2RlcykKKwl7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnI7CisJWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSwgKmFueXB0cjsKKwlTVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKSAqKmFkZG5vZGVzOworCWludCBpLCBqOworCWN1cnIgPSB0cmVlLT5sZXZlbHMgKyB0cmVlLT5ubGV2ZWwgLSAxOworCisJLyogSWYgbGFzdCBsZXZlbCBjb250YWlucyBhbnlQb2xpY3kgc2V0IGlzIGFueVBvbGljeSAqLworCWlmIChjdXJyLT5hbnlQb2xpY3kpCisJCXsKKwkJaWYgKCF0cmVlX2FkZF9hdXRoX25vZGUoJnRyZWUtPmF1dGhfcG9saWNpZXMsIGN1cnItPmFueVBvbGljeSkpCisJCQlyZXR1cm4gMDsKKwkJYWRkbm9kZXMgPSBwbm9kZXM7CisJCX0KKwllbHNlCisJCS8qIEFkZCBwb2xpY2llcyB0byBhdXRob3JpdHkgc2V0ICovCisJCWFkZG5vZGVzID0gJnRyZWUtPmF1dGhfcG9saWNpZXM7CisKKwljdXJyID0gdHJlZS0+bGV2ZWxzOworCWZvciAoaSA9IDE7IGkgPCB0cmVlLT5ubGV2ZWw7IGkrKykKKwkJeworCQkvKiBJZiBubyBhbnlQb2xpY3kgbm9kZSBvbiB0aGlzIHRoaXMgbGV2ZWwgaXQgY2FuJ3QKKwkJICogYXBwZWFyIG9uIGxvd2VyIGxldmVscyBzbyBlbmQgc2VhcmNoLgorCQkgKi8KKwkJaWYgKCEoYW55cHRyID0gY3Vyci0+YW55UG9saWN5KSkKKwkJCWJyZWFrOworCQljdXJyKys7CisJCWZvciAoaiA9IDA7IGogPCBza19YNTA5X1BPTElDWV9OT0RFX251bShjdXJyLT5ub2Rlcyk7IGorKykKKwkJCXsKKwkJCW5vZGUgPSBza19YNTA5X1BPTElDWV9OT0RFX3ZhbHVlKGN1cnItPm5vZGVzLCBqKTsKKwkJCWlmICgobm9kZS0+cGFyZW50ID09IGFueXB0cikKKwkJCQkmJiAhdHJlZV9hZGRfYXV0aF9ub2RlKGFkZG5vZGVzLCBub2RlKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCWlmIChhZGRub2RlcyA9PSBwbm9kZXMpCisJCXJldHVybiAyOworCisJKnBub2RlcyA9IHRyZWUtPmF1dGhfcG9saWNpZXM7CisKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgdHJlZV9jYWxjdWxhdGVfdXNlcl9zZXQoWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSwKKwkJCQlTVEFDS19PRihBU04xX09CSkVDVCkgKnBvbGljeV9vaWRzLAorCQkJCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICphdXRoX25vZGVzKQorCXsKKwlpbnQgaTsKKwlYNTA5X1BPTElDWV9OT0RFICpub2RlOworCUFTTjFfT0JKRUNUICpvaWQ7CisKKwlYNTA5X1BPTElDWV9OT0RFICphbnlQb2xpY3k7CisJWDUwOV9QT0xJQ1lfREFUQSAqZXh0cmE7CisKKwkvKiBDaGVjayBpZiBhbnlQb2xpY3kgcHJlc2VudCBpbiBhdXRob3JpdHkgY29uc3RyYWluZWQgcG9saWN5IHNldDoKKwkgKiB0aGlzIHdpbGwgaGFwcGVuIGlmIGl0IGlzIGEgbGVhZiBub2RlLgorCSAqLworCisJaWYgKHNrX0FTTjFfT0JKRUNUX251bShwb2xpY3lfb2lkcykgPD0gMCkKKwkJcmV0dXJuIDE7CisKKwlhbnlQb2xpY3kgPSB0cmVlLT5sZXZlbHNbdHJlZS0+bmxldmVsIC0gMV0uYW55UG9saWN5OworCisJZm9yIChpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShwb2xpY3lfb2lkcyk7IGkrKykKKwkJeworCQlvaWQgPSBza19BU04xX09CSkVDVF92YWx1ZShwb2xpY3lfb2lkcywgaSk7CisJCWlmIChPQkpfb2JqMm5pZChvaWQpID09IE5JRF9hbnlfcG9saWN5KQorCQkJeworCQkJdHJlZS0+ZmxhZ3MgfD0gUE9MSUNZX0ZMQUdfQU5ZX1BPTElDWTsKKwkJCXJldHVybiAxOworCQkJfQorCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQVNOMV9PQkpFQ1RfbnVtKHBvbGljeV9vaWRzKTsgaSsrKQorCQl7CisJCW9pZCA9IHNrX0FTTjFfT0JKRUNUX3ZhbHVlKHBvbGljeV9vaWRzLCBpKTsKKwkJbm9kZSA9IHRyZWVfZmluZF9zayhhdXRoX25vZGVzLCBvaWQpOworCQlpZiAoIW5vZGUpCisJCQl7CisJCQlpZiAoIWFueVBvbGljeSkKKwkJCQljb250aW51ZTsKKwkJCS8qIENyZWF0ZSBhIG5ldyBub2RlIHdpdGggcG9saWN5IElEIGZyb20gdXNlciBzZXQKKwkJCSAqIGFuZCBxdWFsaWZpZXJzIGZyb20gYW55UG9saWN5LgorCQkJICovCisJCQlleHRyYSA9IHBvbGljeV9kYXRhX25ldyhOVUxMLCBvaWQsCisJCQkJCQlub2RlX2NyaXRpY2FsKGFueVBvbGljeSkpOworCQkJaWYgKCFleHRyYSkKKwkJCQlyZXR1cm4gMDsKKwkJCWV4dHJhLT5xdWFsaWZpZXJfc2V0ID0gYW55UG9saWN5LT5kYXRhLT5xdWFsaWZpZXJfc2V0OworCQkJZXh0cmEtPmZsYWdzID0gUE9MSUNZX0RBVEFfRkxBR19TSEFSRURfUVVBTElGSUVSUworCQkJCQkJfCBQT0xJQ1lfREFUQV9GTEFHX0VYVFJBX05PREU7CisJCQlub2RlID0gbGV2ZWxfYWRkX25vZGUoTlVMTCwgZXh0cmEsIGFueVBvbGljeS0+cGFyZW50LAorCQkJCQkJdHJlZSk7CisJCQl9CisJCWlmICghdHJlZS0+dXNlcl9wb2xpY2llcykKKwkJCXsKKwkJCXRyZWUtPnVzZXJfcG9saWNpZXMgPSBza19YNTA5X1BPTElDWV9OT0RFX25ld19udWxsKCk7CisJCQlpZiAoIXRyZWUtPnVzZXJfcG9saWNpZXMpCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCWlmICghc2tfWDUwOV9QT0xJQ1lfTk9ERV9wdXNoKHRyZWUtPnVzZXJfcG9saWNpZXMsIG5vZGUpKQorCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIGludCB0cmVlX2V2YWx1YXRlKFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpCisJeworCWludCByZXQsIGk7CisJWDUwOV9QT0xJQ1lfTEVWRUwgKmN1cnIgPSB0cmVlLT5sZXZlbHMgKyAxOworCWNvbnN0IFg1MDlfUE9MSUNZX0NBQ0hFICpjYWNoZTsKKworCWZvcihpID0gMTsgaSA8IHRyZWUtPm5sZXZlbDsgaSsrLCBjdXJyKyspCisJCXsKKwkJY2FjaGUgPSBwb2xpY3lfY2FjaGVfc2V0KGN1cnItPmNlcnQpOworCQlpZiAoIXRyZWVfbGlua19ub2RlcyhjdXJyLCBjYWNoZSkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoIShjdXJyLT5mbGFncyAmIFg1MDlfVl9GTEFHX0lOSElCSVRfQU5ZKQorCQkJJiYgIXRyZWVfbGlua19hbnkoY3VyciwgY2FjaGUsIHRyZWUpKQorCQkJcmV0dXJuIDA7CisJdHJlZV9wcmludCgiYmVmb3JlIHRyZWVfcHJ1bmUoKSIsIHRyZWUsIGN1cnIpOworCQlyZXQgPSB0cmVlX3BydW5lKHRyZWUsIGN1cnIpOworCQlpZiAocmV0ICE9IDEpCisJCQlyZXR1cm4gcmV0OworCQl9CisKKwlyZXR1cm4gMTsKKworCX0KKworc3RhdGljIHZvaWQgZXhub2RlX2ZyZWUoWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSkKKwl7CisJaWYgKG5vZGUtPmRhdGEgJiYgKG5vZGUtPmRhdGEtPmZsYWdzICYgUE9MSUNZX0RBVEFfRkxBR19FWFRSQV9OT0RFKSkKKwkJT1BFTlNTTF9mcmVlKG5vZGUpOworCX0KKworCit2b2lkIFg1MDlfcG9saWN5X3RyZWVfZnJlZShYNTA5X1BPTElDWV9UUkVFICp0cmVlKQorCXsKKwlYNTA5X1BPTElDWV9MRVZFTCAqY3VycjsKKwlpbnQgaTsKKworCWlmICghdHJlZSkKKwkJcmV0dXJuOworCisJc2tfWDUwOV9QT0xJQ1lfTk9ERV9mcmVlKHRyZWUtPmF1dGhfcG9saWNpZXMpOworCXNrX1g1MDlfUE9MSUNZX05PREVfcG9wX2ZyZWUodHJlZS0+dXNlcl9wb2xpY2llcywgZXhub2RlX2ZyZWUpOworCisJZm9yKGkgPSAwLCBjdXJyID0gdHJlZS0+bGV2ZWxzOyBpIDwgdHJlZS0+bmxldmVsOyBpKyssIGN1cnIrKykKKwkJeworCQlpZiAoY3Vyci0+Y2VydCkKKwkJCVg1MDlfZnJlZShjdXJyLT5jZXJ0KTsKKwkJaWYgKGN1cnItPm5vZGVzKQorCQkJc2tfWDUwOV9QT0xJQ1lfTk9ERV9wb3BfZnJlZShjdXJyLT5ub2RlcywKKwkJCQkJCXBvbGljeV9ub2RlX2ZyZWUpOworCQlpZiAoY3Vyci0+YW55UG9saWN5KQorCQkJcG9saWN5X25vZGVfZnJlZShjdXJyLT5hbnlQb2xpY3kpOworCQl9CisKKwlpZiAodHJlZS0+ZXh0cmFfZGF0YSkKKwkJc2tfWDUwOV9QT0xJQ1lfREFUQV9wb3BfZnJlZSh0cmVlLT5leHRyYV9kYXRhLAorCQkJCQkJcG9saWN5X2RhdGFfZnJlZSk7CisKKwlPUEVOU1NMX2ZyZWUodHJlZS0+bGV2ZWxzKTsKKwlPUEVOU1NMX2ZyZWUodHJlZSk7CisKKwl9CisKKy8qIEFwcGxpY2F0aW9uIHBvbGljeSBjaGVja2luZyBmdW5jdGlvbi4KKyAqIFJldHVybiBjb2RlczoKKyAqICAwIAlJbnRlcm5hbCBFcnJvci4KKyAqICAxICAgU3VjY2Vzc2Z1bC4KKyAqIC0xICAgT25lIG9yIG1vcmUgY2VydGlmaWNhdGVzIGNvbnRhaW4gaW52YWxpZCBvciBpbmNvbnNpc3RlbnQgZXh0ZW5zaW9ucworICogLTIJVXNlciBjb25zdHJhaW5lZCBwb2xpY3kgc2V0IGVtcHR5IGFuZCByZXF1aXJlRXhwbGljaXQgdHJ1ZS4KKyAqLworCitpbnQgWDUwOV9wb2xpY3lfY2hlY2soWDUwOV9QT0xJQ1lfVFJFRSAqKnB0cmVlLCBpbnQgKnBleHBsaWNpdF9wb2xpY3ksCisJCQlTVEFDS19PRihYNTA5KSAqY2VydHMsCisJCQlTVEFDS19PRihBU04xX09CSkVDVCkgKnBvbGljeV9vaWRzLAorCQkJdW5zaWduZWQgaW50IGZsYWdzKQorCXsKKwlpbnQgcmV0OworCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWUgPSBOVUxMOworCVNUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICpub2RlcywgKmF1dGhfbm9kZXMgPSBOVUxMOworCSpwdHJlZSA9IE5VTEw7CisKKwkqcGV4cGxpY2l0X3BvbGljeSA9IDA7CisJcmV0ID0gdHJlZV9pbml0KCZ0cmVlLCBjZXJ0cywgZmxhZ3MpOworCisJc3dpdGNoIChyZXQpCisJCXsKKworCQkvKiBUcmVlIGVtcHR5IHJlcXVpcmVFeHBsaWNpdCBGYWxzZTogT0sgKi8KKwkJY2FzZSAyOgorCQlyZXR1cm4gMTsKKworCQkvKiBTb21lIGludGVybmFsIGVycm9yICovCisJCWNhc2UgLTE6CisJCXJldHVybiAtMTsKKworCQkvKiBTb21lIGludGVybmFsIGVycm9yICovCisJCWNhc2UgMDoKKwkJcmV0dXJuIDA7CisKKwkJLyogVHJlZSBlbXB0eSByZXF1aXJlRXhwbGljaXQgVHJ1ZTogRXJyb3IgKi8KKworCQljYXNlIDY6CisJCSpwZXhwbGljaXRfcG9saWN5ID0gMTsKKwkJcmV0dXJuIC0yOworCisJCS8qIFRyZWUgT0sgcmVxdWlyZUV4cGxpY2l0IFRydWU6IE9LIGFuZCBjb250aW51ZSAqLworCQljYXNlIDU6CisJCSpwZXhwbGljaXRfcG9saWN5ID0gMTsKKwkJYnJlYWs7CisKKwkJLyogVHJlZSBPSzogY29udGludWUgKi8KKworCQljYXNlIDE6CisJCWlmICghdHJlZSkKKwkJCS8qCisJCQkgKiB0cmVlX2luaXQoKSByZXR1cm5zIHN1Y2Nlc3MgYW5kIGEgbnVsbCB0cmVlCisJCQkgKiBpZiBpdCdzIGp1c3QgbG9va2luZyBhdCBhIHRydXN0IGFuY2hvci4KKwkJCSAqIEknbSBub3Qgc3VyZSB0aGF0IHJldHVybmluZyBzdWNjZXNzIGhlcmUgaXMKKwkJCSAqIGNvcnJlY3QsIGJ1dCBJJ20gc3VyZSB0aGF0IHJlcG9ydGluZyB0aGlzCisJCQkgKiBhcyBhbiBpbnRlcm5hbCBlcnJvciB3aGljaCBvdXIgY2FsbGVyCisJCQkgKiBpbnRlcnByZXRzIGFzIGEgbWFsbG9jIGZhaWx1cmUgaXMgd3JvbmcuCisJCQkgKi8KKwkJCXJldHVybiAxOworCQlicmVhazsKKwkJfQorCisJaWYgKCF0cmVlKSBnb3RvIGVycm9yOworCXJldCA9IHRyZWVfZXZhbHVhdGUodHJlZSk7CisKKwl0cmVlX3ByaW50KCJ0cmVlX2V2YWx1YXRlKCkiLCB0cmVlLCBOVUxMKTsKKworCWlmIChyZXQgPD0gMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFJldHVybiB2YWx1ZSAyIG1lYW5zIHRyZWUgZW1wdHkgKi8KKwlpZiAocmV0ID09IDIpCisJCXsKKwkJWDUwOV9wb2xpY3lfdHJlZV9mcmVlKHRyZWUpOworCQlpZiAoKnBleHBsaWNpdF9wb2xpY3kpCisJCQlyZXR1cm4gLTI7CisJCWVsc2UKKwkJCXJldHVybiAxOworCQl9CisKKwkvKiBUcmVlIGlzIG5vdCBlbXB0eTogY29udGludWUgKi8KKworCXJldCA9IHRyZWVfY2FsY3VsYXRlX2F1dGhvcml0eV9zZXQodHJlZSwgJmF1dGhfbm9kZXMpOworCisJaWYgKCFyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoIXRyZWVfY2FsY3VsYXRlX3VzZXJfc2V0KHRyZWUsIHBvbGljeV9vaWRzLCBhdXRoX25vZGVzKSkKKwkJZ290byBlcnJvcjsKKwkKKwlpZiAocmV0ID09IDIpCisJCXNrX1g1MDlfUE9MSUNZX05PREVfZnJlZShhdXRoX25vZGVzKTsKKworCWlmICh0cmVlKQorCQkqcHRyZWUgPSB0cmVlOworCisJaWYgKCpwZXhwbGljaXRfcG9saWN5KQorCQl7CisJCW5vZGVzID0gWDUwOV9wb2xpY3lfdHJlZV9nZXQwX3VzZXJfcG9saWNpZXModHJlZSk7CisJCWlmIChza19YNTA5X1BPTElDWV9OT0RFX251bShub2RlcykgPD0gMCkKKwkJCXJldHVybiAtMjsKKwkJfQorCisJcmV0dXJuIDE7CisKKwllcnJvcjoKKworCVg1MDlfcG9saWN5X3RyZWVfZnJlZSh0cmVlKTsKKworCXJldHVybiAwOworCisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3RhYnRlc3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdGFidGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDZlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3RhYnRlc3QuYwpAQCAtMCwwICsxLDg4IEBACisvKiB0YWJ0ZXN0LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qIFNpbXBsZSBwcm9ncmFtIHRvIGNoZWNrIHRoZSBleHRfZGF0LmggaXMgY29ycmVjdCBhbmQgcHJpbnQgb3V0CisgKiBwcm9ibGVtcyBpZiBpdCBpcyBub3QuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaW5jbHVkZSAiZXh0X2RhdC5oIgorCittYWluKCkKK3sKKwlpbnQgaSwgcHJldiA9IC0xLCBiYWQgPSAwOworCVg1MDlWM19FWFRfTUVUSE9EICoqdG1wOworCWkgPSBzaXplb2Yoc3RhbmRhcmRfZXh0cykgLyBzaXplb2YoWDUwOVYzX0VYVF9NRVRIT0QgKik7CisJaWYoaSAhPSBTVEFOREFSRF9FWFRFTlNJT05fQ09VTlQpCisJCWZwcmludGYoc3RkZXJyLCAiRXh0ZW5zaW9uIG51bWJlciBpbnZhbGlkIGV4cGVjdGluZyAlZFxuIiwgaSk7CisJdG1wID0gc3RhbmRhcmRfZXh0czsKKwlmb3IoaSA9IDA7IGkgPCBTVEFOREFSRF9FWFRFTlNJT05fQ09VTlQ7IGkrKywgdG1wKyspIHsKKwkJaWYoKCp0bXApLT5leHRfbmlkIDwgcHJldikgYmFkID0gMTsKKwkJcHJldiA9ICgqdG1wKS0+ZXh0X25pZDsKKwkJCisJfQorCWlmKGJhZCkgeworCQl0bXAgPSBzdGFuZGFyZF9leHRzOworCQlmcHJpbnRmKHN0ZGVyciwgIkV4dGVuc2lvbnMgb3V0IG9mIG9yZGVyIVxuIik7CisJCWZvcihpID0gMDsgaSA8IFNUQU5EQVJEX0VYVEVOU0lPTl9DT1VOVDsgaSsrLCB0bXArKykKKwkJcHJpbnRmKCIlZCA6ICVzXG4iLCAoKnRtcCktPmV4dF9uaWQsIE9CSl9uaWQyc24oKCp0bXApLT5leHRfbmlkKSk7CisJfSBlbHNlIGZwcmludGYoc3RkZXJyLCAiT3JkZXIgT0tcbiIpOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19hZGRyLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2FkZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDg3ZDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19hZGRyLmMKQEAgLTAsMCArMSwxMjg3IEBACisvKgorICogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCBieSB0aGUgQW1lcmljYW4gUmVnaXN0cnkgZm9yCisgKiBJbnRlcm5ldCBOdW1iZXJzICgiQVJJTiIpLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKi8KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIFJGQyAzNzc5IHNlY3Rpb24gMi4yLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkZDMzc3OQorCisvKgorICogT3BlblNTTCBBU04uMSB0ZW1wbGF0ZSB0cmFuc2xhdGlvbiBvZiBSRkMgMzc3OSAyLjIuMy4KKyAqLworCitBU04xX1NFUVVFTkNFKElQQWRkcmVzc1JhbmdlKSA9IHsKKyAgQVNOMV9TSU1QTEUoSVBBZGRyZXNzUmFuZ2UsIG1pbiwgQVNOMV9CSVRfU1RSSU5HKSwKKyAgQVNOMV9TSU1QTEUoSVBBZGRyZXNzUmFuZ2UsIG1heCwgQVNOMV9CSVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORChJUEFkZHJlc3NSYW5nZSkKKworQVNOMV9DSE9JQ0UoSVBBZGRyZXNzT3JSYW5nZSkgPSB7CisgIEFTTjFfU0lNUExFKElQQWRkcmVzc09yUmFuZ2UsIHUuYWRkcmVzc1ByZWZpeCwgQVNOMV9CSVRfU1RSSU5HKSwKKyAgQVNOMV9TSU1QTEUoSVBBZGRyZXNzT3JSYW5nZSwgdS5hZGRyZXNzUmFuZ2UsICBJUEFkZHJlc3NSYW5nZSkKK30gQVNOMV9DSE9JQ0VfRU5EKElQQWRkcmVzc09yUmFuZ2UpCisKK0FTTjFfQ0hPSUNFKElQQWRkcmVzc0Nob2ljZSkgPSB7CisgIEFTTjFfU0lNUExFKElQQWRkcmVzc0Nob2ljZSwgICAgICB1LmluaGVyaXQsICAgICAgICAgICBBU04xX05VTEwpLAorICBBU04xX1NFUVVFTkNFX09GKElQQWRkcmVzc0Nob2ljZSwgdS5hZGRyZXNzZXNPclJhbmdlcywgSVBBZGRyZXNzT3JSYW5nZSkKK30gQVNOMV9DSE9JQ0VfRU5EKElQQWRkcmVzc0Nob2ljZSkKKworQVNOMV9TRVFVRU5DRShJUEFkZHJlc3NGYW1pbHkpID0geworICBBU04xX1NJTVBMRShJUEFkZHJlc3NGYW1pbHksIGFkZHJlc3NGYW1pbHksICAgQVNOMV9PQ1RFVF9TVFJJTkcpLAorICBBU04xX1NJTVBMRShJUEFkZHJlc3NGYW1pbHksIGlwQWRkcmVzc0Nob2ljZSwgSVBBZGRyZXNzQ2hvaWNlKQorfSBBU04xX1NFUVVFTkNFX0VORChJUEFkZHJlc3NGYW1pbHkpCisKK0FTTjFfSVRFTV9URU1QTEFURShJUEFkZHJCbG9ja3MpID0gCisgIEFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsCisJCQlJUEFkZHJCbG9ja3MsIElQQWRkcmVzc0ZhbWlseSkKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoSVBBZGRyQmxvY2tzKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoSVBBZGRyZXNzUmFuZ2UpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoSVBBZGRyZXNzT3JSYW5nZSkKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhJUEFkZHJlc3NDaG9pY2UpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoSVBBZGRyZXNzRmFtaWx5KQorCisvKgorICogSG93IG11Y2ggYnVmZmVyIHNwYWNlIGRvIHdlIG5lZWQgZm9yIGEgcmF3IGFkZHJlc3M/CisgKi8KKyNkZWZpbmUgQUREUl9SQVdfQlVGX0xFTgkxNgorCisvKgorICogV2hhdCdzIHRoZSBhZGRyZXNzIGxlbmd0aCBhc3NvY2lhdGVkIHdpdGggdGhpcyBBRkk/CisgKi8KK3N0YXRpYyBpbnQgbGVuZ3RoX2Zyb21fYWZpKGNvbnN0IHVuc2lnbmVkIGFmaSkKK3sKKyAgc3dpdGNoIChhZmkpIHsKKyAgY2FzZSBJQU5BX0FGSV9JUFY0OgorICAgIHJldHVybiA0OworICBjYXNlIElBTkFfQUZJX0lQVjY6CisgICAgcmV0dXJuIDE2OworICBkZWZhdWx0OgorICAgIHJldHVybiAwOworICB9Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBBRkkgZnJvbSBhbiBJUEFkZHJlc3NGYW1pbHkuCisgKi8KK3Vuc2lnbmVkIGludCB2M19hZGRyX2dldF9hZmkoY29uc3QgSVBBZGRyZXNzRmFtaWx5ICpmKQoreworICByZXR1cm4gKChmICE9IE5VTEwgJiYKKwkgICBmLT5hZGRyZXNzRmFtaWx5ICE9IE5VTEwgJiYKKwkgICBmLT5hZGRyZXNzRmFtaWx5LT5kYXRhICE9IE5VTEwpCisJICA/ICgoZi0+YWRkcmVzc0ZhbWlseS0+ZGF0YVswXSA8PCA4KSB8CisJICAgICAoZi0+YWRkcmVzc0ZhbWlseS0+ZGF0YVsxXSkpCisJICA6IDApOworfQorCisvKgorICogRXhwYW5kIHRoZSBiaXRzdHJpbmcgZm9ybSBvZiBhbiBhZGRyZXNzIGludG8gYSByYXcgYnl0ZSBhcnJheS4KKyAqIEF0IHRoZSBtb21lbnQgdGhpcyBpcyBjb2RlZCBmb3Igc2ltcGxpY2l0eSwgbm90IHNwZWVkLgorICovCitzdGF0aWMgdm9pZCBhZGRyX2V4cGFuZCh1bnNpZ25lZCBjaGFyICphZGRyLAorCQkJY29uc3QgQVNOMV9CSVRfU1RSSU5HICpicywKKwkJCWNvbnN0IGludCBsZW5ndGgsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyIGZpbGwpCit7CisgIE9QRU5TU0xfYXNzZXJ0KGJzLT5sZW5ndGggPj0gMCAmJiBicy0+bGVuZ3RoIDw9IGxlbmd0aCk7CisgIGlmIChicy0+bGVuZ3RoID4gMCkgeworICAgIG1lbWNweShhZGRyLCBicy0+ZGF0YSwgYnMtPmxlbmd0aCk7CisgICAgaWYgKChicy0+ZmxhZ3MgJiA3KSAhPSAwKSB7CisgICAgICB1bnNpZ25lZCBjaGFyIG1hc2sgPSAweEZGID4+ICg4IC0gKGJzLT5mbGFncyAmIDcpKTsKKyAgICAgIGlmIChmaWxsID09IDApCisJYWRkclticy0+bGVuZ3RoIC0gMV0gJj0gfm1hc2s7CisgICAgICBlbHNlCisJYWRkclticy0+bGVuZ3RoIC0gMV0gfD0gbWFzazsKKyAgICB9CisgIH0KKyAgbWVtc2V0KGFkZHIgKyBicy0+bGVuZ3RoLCBmaWxsLCBsZW5ndGggLSBicy0+bGVuZ3RoKTsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIHByZWZpeCBsZW5ndGggZnJvbSBhIGJpdHN0cmluZy4KKyAqLworI2RlZmluZSBhZGRyX3ByZWZpeGxlbihicykgKChpbnQpICgoYnMpLT5sZW5ndGggKiA4IC0gKChicyktPmZsYWdzICYgNykpKQorCisvKgorICogaTJyIGhhbmRsZXIgZm9yIG9uZSBhZGRyZXNzIGJpdHN0cmluZy4KKyAqLworc3RhdGljIGludCBpMnJfYWRkcmVzcyhCSU8gKm91dCwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGFmaSwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmlsbCwKKwkJICAgICAgIGNvbnN0IEFTTjFfQklUX1NUUklORyAqYnMpCit7CisgIHVuc2lnbmVkIGNoYXIgYWRkcltBRERSX1JBV19CVUZfTEVOXTsKKyAgaW50IGksIG47CisKKyAgc3dpdGNoIChhZmkpIHsKKyAgY2FzZSBJQU5BX0FGSV9JUFY0OgorICAgIGFkZHJfZXhwYW5kKGFkZHIsIGJzLCA0LCBmaWxsKTsKKyAgICBCSU9fcHJpbnRmKG91dCwgIiVkLiVkLiVkLiVkIiwgYWRkclswXSwgYWRkclsxXSwgYWRkclsyXSwgYWRkclszXSk7CisgICAgYnJlYWs7CisgIGNhc2UgSUFOQV9BRklfSVBWNjoKKyAgICBhZGRyX2V4cGFuZChhZGRyLCBicywgMTYsIGZpbGwpOworICAgIGZvciAobiA9IDE2OyBuID4gMSAmJiBhZGRyW24tMV0gPT0gMHgwMCAmJiBhZGRyW24tMl0gPT0gMHgwMDsgbiAtPSAyKQorICAgICAgOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICs9IDIpCisgICAgICBCSU9fcHJpbnRmKG91dCwgIiV4JXMiLCAoYWRkcltpXSA8PCA4KSB8IGFkZHJbaSsxXSwgKGkgPCAxNCA/ICI6IiA6ICIiKSk7CisgICAgaWYgKGkgPCAxNikKKyAgICAgIEJJT19wdXRzKG91dCwgIjoiKTsKKyAgICBpZiAoaSA9PSAwKQorICAgICAgQklPX3B1dHMob3V0LCAiOiIpOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIGZvciAoaSA9IDA7IGkgPCBicy0+bGVuZ3RoOyBpKyspCisgICAgICBCSU9fcHJpbnRmKG91dCwgIiVzJTAyeCIsIChpID4gMCA/ICI6IiA6ICIiKSwgYnMtPmRhdGFbaV0pOworICAgIEJJT19wcmludGYob3V0LCAiWyVkXSIsIChpbnQpIChicy0+ZmxhZ3MgJiA3KSk7CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBpMnIgaGFuZGxlciBmb3IgYSBzZXF1ZW5jZSBvZiBhZGRyZXNzZXMgYW5kIHJhbmdlcy4KKyAqLworc3RhdGljIGludCBpMnJfSVBBZGRyZXNzT3JSYW5nZXMoQklPICpvdXQsCisJCQkJIGNvbnN0IGludCBpbmRlbnQsCisJCQkJIGNvbnN0IElQQWRkcmVzc09yUmFuZ2VzICphb3JzLAorCQkJCSBjb25zdCB1bnNpZ25lZCBhZmkpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2tfSVBBZGRyZXNzT3JSYW5nZV9udW0oYW9ycyk7IGkrKykgeworICAgIGNvbnN0IElQQWRkcmVzc09yUmFuZ2UgKmFvciA9IHNrX0lQQWRkcmVzc09yUmFuZ2VfdmFsdWUoYW9ycywgaSk7CisgICAgQklPX3ByaW50ZihvdXQsICIlKnMiLCBpbmRlbnQsICIiKTsKKyAgICBzd2l0Y2ggKGFvci0+dHlwZSkgeworICAgIGNhc2UgSVBBZGRyZXNzT3JSYW5nZV9hZGRyZXNzUHJlZml4OgorICAgICAgaWYgKCFpMnJfYWRkcmVzcyhvdXQsIGFmaSwgMHgwMCwgYW9yLT51LmFkZHJlc3NQcmVmaXgpKQorCXJldHVybiAwOworICAgICAgQklPX3ByaW50ZihvdXQsICIvJWRcbiIsIGFkZHJfcHJlZml4bGVuKGFvci0+dS5hZGRyZXNzUHJlZml4KSk7CisgICAgICBjb250aW51ZTsKKyAgICBjYXNlIElQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1JhbmdlOgorICAgICAgaWYgKCFpMnJfYWRkcmVzcyhvdXQsIGFmaSwgMHgwMCwgYW9yLT51LmFkZHJlc3NSYW5nZS0+bWluKSkKKwlyZXR1cm4gMDsKKyAgICAgIEJJT19wdXRzKG91dCwgIi0iKTsKKyAgICAgIGlmICghaTJyX2FkZHJlc3Mob3V0LCBhZmksIDB4RkYsIGFvci0+dS5hZGRyZXNzUmFuZ2UtPm1heCkpCisJcmV0dXJuIDA7CisgICAgICBCSU9fcHV0cyhvdXQsICJcbiIpOworICAgICAgY29udGludWU7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvKgorICogaTJyIGhhbmRsZXIgZm9yIGFuIElQQWRkckJsb2NrcyBleHRlbnNpb24uCisgKi8KK3N0YXRpYyBpbnQgaTJyX0lQQWRkckJsb2Nrcyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJICAgIHZvaWQgKmV4dCwKKwkJCSAgICBCSU8gKm91dCwKKwkJCSAgICBpbnQgaW5kZW50KQoreworICBjb25zdCBJUEFkZHJCbG9ja3MgKmFkZHIgPSBleHQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2tfSVBBZGRyZXNzRmFtaWx5X251bShhZGRyKTsgaSsrKSB7CisgICAgSVBBZGRyZXNzRmFtaWx5ICpmID0gc2tfSVBBZGRyZXNzRmFtaWx5X3ZhbHVlKGFkZHIsIGkpOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBhZmkgPSB2M19hZGRyX2dldF9hZmkoZik7CisgICAgc3dpdGNoIChhZmkpIHsKKyAgICBjYXNlIElBTkFfQUZJX0lQVjQ6CisgICAgICBCSU9fcHJpbnRmKG91dCwgIiUqc0lQdjQiLCBpbmRlbnQsICIiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSUFOQV9BRklfSVBWNjoKKyAgICAgIEJJT19wcmludGYob3V0LCAiJSpzSVB2NiIsIGluZGVudCwgIiIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIEJJT19wcmludGYob3V0LCAiJSpzVW5rbm93biBBRkkgJXUiLCBpbmRlbnQsICIiLCBhZmkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChmLT5hZGRyZXNzRmFtaWx5LT5sZW5ndGggPiAyKSB7CisgICAgICBzd2l0Y2ggKGYtPmFkZHJlc3NGYW1pbHktPmRhdGFbMl0pIHsKKyAgICAgIGNhc2UgICAxOgorCUJJT19wdXRzKG91dCwgIiAoVW5pY2FzdCkiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgICAyOgorCUJJT19wdXRzKG91dCwgIiAoTXVsdGljYXN0KSIpOworCWJyZWFrOworICAgICAgY2FzZSAgIDM6CisJQklPX3B1dHMob3V0LCAiIChVbmljYXN0L011bHRpY2FzdCkiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgICA0OgorCUJJT19wdXRzKG91dCwgIiAoTVBMUykiKTsKKwlicmVhazsKKyAgICAgIGNhc2UgIDY0OgorCUJJT19wdXRzKG91dCwgIiAoVHVubmVsKSIpOworCWJyZWFrOworICAgICAgY2FzZSAgNjU6CisJQklPX3B1dHMob3V0LCAiIChWUExTKSIpOworCWJyZWFrOworICAgICAgY2FzZSAgNjY6CisJQklPX3B1dHMob3V0LCAiIChCR1AgTURUKSIpOworCWJyZWFrOworICAgICAgY2FzZSAxMjg6CisJQklPX3B1dHMob3V0LCAiIChNUExTLWxhYmVsZWQgVlBOKSIpOworCWJyZWFrOworICAgICAgZGVmYXVsdDogIAorCUJJT19wcmludGYob3V0LCAiIChVbmtub3duIFNBRkkgJXUpIiwKKwkJICAgKHVuc2lnbmVkKSBmLT5hZGRyZXNzRmFtaWx5LT5kYXRhWzJdKTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChmLT5pcEFkZHJlc3NDaG9pY2UtPnR5cGUpIHsKKyAgICBjYXNlIElQQWRkcmVzc0Nob2ljZV9pbmhlcml0OgorICAgICAgQklPX3B1dHMob3V0LCAiOiBpbmhlcml0XG4iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSVBBZGRyZXNzQ2hvaWNlX2FkZHJlc3Nlc09yUmFuZ2VzOgorICAgICAgQklPX3B1dHMob3V0LCAiOlxuIik7CisgICAgICBpZiAoIWkycl9JUEFkZHJlc3NPclJhbmdlcyhvdXQsCisJCQkJIGluZGVudCArIDIsCisJCQkJIGYtPmlwQWRkcmVzc0Nob2ljZS0+dS5hZGRyZXNzZXNPclJhbmdlcywKKwkJCQkgYWZpKSkKKwlyZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLyoKKyAqIFNvcnQgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgYSBzZXF1ZW5jZSBvZiBJUEFkZHJlc3NPclJhbmdlCisgKiBlbGVtZW50cy4KKyAqLworc3RhdGljIGludCBJUEFkZHJlc3NPclJhbmdlX2NtcChjb25zdCBJUEFkZHJlc3NPclJhbmdlICphLAorCQkJCWNvbnN0IElQQWRkcmVzc09yUmFuZ2UgKmIsCisJCQkJY29uc3QgaW50IGxlbmd0aCkKK3sKKyAgdW5zaWduZWQgY2hhciBhZGRyX2FbQUREUl9SQVdfQlVGX0xFTl0sIGFkZHJfYltBRERSX1JBV19CVUZfTEVOXTsKKyAgaW50IHByZWZpeGxlbl9hID0gMCwgcHJlZml4bGVuX2IgPSAwOworICBpbnQgcjsKKworICBzd2l0Y2ggKGEtPnR5cGUpIHsKKyAgY2FzZSBJUEFkZHJlc3NPclJhbmdlX2FkZHJlc3NQcmVmaXg6CisgICAgYWRkcl9leHBhbmQoYWRkcl9hLCBhLT51LmFkZHJlc3NQcmVmaXgsIGxlbmd0aCwgMHgwMCk7CisgICAgcHJlZml4bGVuX2EgPSBhZGRyX3ByZWZpeGxlbihhLT51LmFkZHJlc3NQcmVmaXgpOworICAgIGJyZWFrOworICBjYXNlIElQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1JhbmdlOgorICAgIGFkZHJfZXhwYW5kKGFkZHJfYSwgYS0+dS5hZGRyZXNzUmFuZ2UtPm1pbiwgbGVuZ3RoLCAweDAwKTsKKyAgICBwcmVmaXhsZW5fYSA9IGxlbmd0aCAqIDg7CisgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKGItPnR5cGUpIHsKKyAgY2FzZSBJUEFkZHJlc3NPclJhbmdlX2FkZHJlc3NQcmVmaXg6CisgICAgYWRkcl9leHBhbmQoYWRkcl9iLCBiLT51LmFkZHJlc3NQcmVmaXgsIGxlbmd0aCwgMHgwMCk7CisgICAgcHJlZml4bGVuX2IgPSBhZGRyX3ByZWZpeGxlbihiLT51LmFkZHJlc3NQcmVmaXgpOworICAgIGJyZWFrOworICBjYXNlIElQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1JhbmdlOgorICAgIGFkZHJfZXhwYW5kKGFkZHJfYiwgYi0+dS5hZGRyZXNzUmFuZ2UtPm1pbiwgbGVuZ3RoLCAweDAwKTsKKyAgICBwcmVmaXhsZW5fYiA9IGxlbmd0aCAqIDg7CisgICAgYnJlYWs7CisgIH0KKworICBpZiAoKHIgPSBtZW1jbXAoYWRkcl9hLCBhZGRyX2IsIGxlbmd0aCkpICE9IDApCisgICAgcmV0dXJuIHI7CisgIGVsc2UKKyAgICByZXR1cm4gcHJlZml4bGVuX2EgLSBwcmVmaXhsZW5fYjsKK30KKworLyoKKyAqIElQdjQtc3BlY2lmaWMgY2xvc3VyZSBvdmVyIElQQWRkcmVzc09yUmFuZ2VfY21wLCBzaW5jZSBza19zb3J0KCkKKyAqIGNvbXBhcmlzaW9uIHJvdXRpbmVzIGFyZSBvbmx5IGFsbG93ZWQgdHdvIGFyZ3VtZW50cy4KKyAqLworc3RhdGljIGludCB2NElQQWRkcmVzc09yUmFuZ2VfY21wKGNvbnN0IElQQWRkcmVzc09yUmFuZ2UgKiBjb25zdCAqYSwKKwkJCQkgIGNvbnN0IElQQWRkcmVzc09yUmFuZ2UgKiBjb25zdCAqYikKK3sKKyAgcmV0dXJuIElQQWRkcmVzc09yUmFuZ2VfY21wKCphLCAqYiwgNCk7Cit9CisKKy8qCisgKiBJUHY2LXNwZWNpZmljIGNsb3N1cmUgb3ZlciBJUEFkZHJlc3NPclJhbmdlX2NtcCwgc2luY2Ugc2tfc29ydCgpCisgKiBjb21wYXJpc2lvbiByb3V0aW5lcyBhcmUgb25seSBhbGxvd2VkIHR3byBhcmd1bWVudHMuCisgKi8KK3N0YXRpYyBpbnQgdjZJUEFkZHJlc3NPclJhbmdlX2NtcChjb25zdCBJUEFkZHJlc3NPclJhbmdlICogY29uc3QgKmEsCisJCQkJICBjb25zdCBJUEFkZHJlc3NPclJhbmdlICogY29uc3QgKmIpCit7CisgIHJldHVybiBJUEFkZHJlc3NPclJhbmdlX2NtcCgqYSwgKmIsIDE2KTsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB3aGV0aGVyIGEgcmFuZ2UgY29sbGFwc2VzIHRvIGEgcHJlZml4LgorICogU2VlIGxhc3QgcGFyYWdyYXBoIG9mIFJGQyAzNzc5IDIuMi4zLjcuCisgKi8KK3N0YXRpYyBpbnQgcmFuZ2Vfc2hvdWxkX2JlX3ByZWZpeChjb25zdCB1bnNpZ25lZCBjaGFyICptaW4sCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICptYXgsCisJCQkJICBjb25zdCBpbnQgbGVuZ3RoKQoreworICB1bnNpZ25lZCBjaGFyIG1hc2s7CisgIGludCBpLCBqOworCisgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggJiYgbWluW2ldID09IG1heFtpXTsgaSsrKQorICAgIDsKKyAgZm9yIChqID0gbGVuZ3RoIC0gMTsgaiA+PSAwICYmIG1pbltqXSA9PSAweDAwICYmIG1heFtqXSA9PSAweEZGOyBqLS0pCisgICAgOworICBpZiAoaSA8IGopCisgICAgcmV0dXJuIC0xOworICBpZiAoaSA+IGopCisgICAgcmV0dXJuIGkgKiA4OworICBtYXNrID0gbWluW2ldIF4gbWF4W2ldOworICBzd2l0Y2ggKG1hc2spIHsKKyAgY2FzZSAweDAxOiBqID0gNzsgYnJlYWs7CisgIGNhc2UgMHgwMzogaiA9IDY7IGJyZWFrOworICBjYXNlIDB4MDc6IGogPSA1OyBicmVhazsKKyAgY2FzZSAweDBGOiBqID0gNDsgYnJlYWs7CisgIGNhc2UgMHgxRjogaiA9IDM7IGJyZWFrOworICBjYXNlIDB4M0Y6IGogPSAyOyBicmVhazsKKyAgY2FzZSAweDdGOiBqID0gMTsgYnJlYWs7CisgIGRlZmF1bHQ6ICAgcmV0dXJuIC0xOworICB9CisgIGlmICgobWluW2ldICYgbWFzaykgIT0gMCB8fCAobWF4W2ldICYgbWFzaykgIT0gbWFzaykKKyAgICByZXR1cm4gLTE7CisgIGVsc2UKKyAgICByZXR1cm4gaSAqIDggKyBqOworfQorCisvKgorICogQ29uc3RydWN0IGEgcHJlZml4LgorICovCitzdGF0aWMgaW50IG1ha2VfYWRkcmVzc1ByZWZpeChJUEFkZHJlc3NPclJhbmdlICoqcmVzdWx0LAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqYWRkciwKKwkJCSAgICAgIGNvbnN0IGludCBwcmVmaXhsZW4pCit7CisgIGludCBieXRlbGVuID0gKHByZWZpeGxlbiArIDcpIC8gOCwgYml0bGVuID0gcHJlZml4bGVuICUgODsKKyAgSVBBZGRyZXNzT3JSYW5nZSAqYW9yID0gSVBBZGRyZXNzT3JSYW5nZV9uZXcoKTsKKworICBpZiAoYW9yID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIGFvci0+dHlwZSA9IElQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1ByZWZpeDsKKyAgaWYgKGFvci0+dS5hZGRyZXNzUHJlZml4ID09IE5VTEwgJiYKKyAgICAgIChhb3ItPnUuYWRkcmVzc1ByZWZpeCA9IEFTTjFfQklUX1NUUklOR19uZXcoKSkgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFBU04xX0JJVF9TVFJJTkdfc2V0KGFvci0+dS5hZGRyZXNzUHJlZml4LCBhZGRyLCBieXRlbGVuKSkKKyAgICBnb3RvIGVycjsKKyAgYW9yLT51LmFkZHJlc3NQcmVmaXgtPmZsYWdzICY9IH43OworICBhb3ItPnUuYWRkcmVzc1ByZWZpeC0+ZmxhZ3MgfD0gQVNOMV9TVFJJTkdfRkxBR19CSVRTX0xFRlQ7CisgIGlmIChiaXRsZW4gPiAwKSB7CisgICAgYW9yLT51LmFkZHJlc3NQcmVmaXgtPmRhdGFbYnl0ZWxlbiAtIDFdICY9IH4oMHhGRiA+PiBiaXRsZW4pOworICAgIGFvci0+dS5hZGRyZXNzUHJlZml4LT5mbGFncyB8PSA4IC0gYml0bGVuOworICB9CisgIAorICAqcmVzdWx0ID0gYW9yOworICByZXR1cm4gMTsKKworIGVycjoKKyAgSVBBZGRyZXNzT3JSYW5nZV9mcmVlKGFvcik7CisgIHJldHVybiAwOworfQorCisvKgorICogQ29uc3RydWN0IGEgcmFuZ2UuICBJZiBpdCBjYW4gYmUgZXhwcmVzc2VkIGFzIGEgcHJlZml4LAorICogcmV0dXJuIGEgcHJlZml4IGluc3RlYWQuICBEb2luZyB0aGlzIGhlcmUgc2ltcGxpZmllcworICogdGhlIHJlc3Qgb2YgdGhlIGNvZGUgY29uc2lkZXJhYmx5LgorICovCitzdGF0aWMgaW50IG1ha2VfYWRkcmVzc1JhbmdlKElQQWRkcmVzc09yUmFuZ2UgKipyZXN1bHQsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKm1pbiwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqbWF4LAorCQkJICAgICBjb25zdCBpbnQgbGVuZ3RoKQoreworICBJUEFkZHJlc3NPclJhbmdlICphb3I7CisgIGludCBpLCBwcmVmaXhsZW47CisKKyAgaWYgKChwcmVmaXhsZW4gPSByYW5nZV9zaG91bGRfYmVfcHJlZml4KG1pbiwgbWF4LCBsZW5ndGgpKSA+PSAwKQorICAgIHJldHVybiBtYWtlX2FkZHJlc3NQcmVmaXgocmVzdWx0LCBtaW4sIHByZWZpeGxlbik7CisKKyAgaWYgKChhb3IgPSBJUEFkZHJlc3NPclJhbmdlX25ldygpKSA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBhb3ItPnR5cGUgPSBJUEFkZHJlc3NPclJhbmdlX2FkZHJlc3NSYW5nZTsKKyAgT1BFTlNTTF9hc3NlcnQoYW9yLT51LmFkZHJlc3NSYW5nZSA9PSBOVUxMKTsKKyAgaWYgKChhb3ItPnUuYWRkcmVzc1JhbmdlID0gSVBBZGRyZXNzUmFuZ2VfbmV3KCkpID09IE5VTEwpCisgICAgZ290byBlcnI7CisgIGlmIChhb3ItPnUuYWRkcmVzc1JhbmdlLT5taW4gPT0gTlVMTCAmJgorICAgICAgKGFvci0+dS5hZGRyZXNzUmFuZ2UtPm1pbiA9IEFTTjFfQklUX1NUUklOR19uZXcoKSkgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKyAgaWYgKGFvci0+dS5hZGRyZXNzUmFuZ2UtPm1heCA9PSBOVUxMICYmCisgICAgICAoYW9yLT51LmFkZHJlc3NSYW5nZS0+bWF4ID0gQVNOMV9CSVRfU1RSSU5HX25ldygpKSA9PSBOVUxMKQorICAgIGdvdG8gZXJyOworCisgIGZvciAoaSA9IGxlbmd0aDsgaSA+IDAgJiYgbWluW2kgLSAxXSA9PSAweDAwOyAtLWkpCisgICAgOworICBpZiAoIUFTTjFfQklUX1NUUklOR19zZXQoYW9yLT51LmFkZHJlc3NSYW5nZS0+bWluLCBtaW4sIGkpKQorICAgIGdvdG8gZXJyOworICBhb3ItPnUuYWRkcmVzc1JhbmdlLT5taW4tPmZsYWdzICY9IH43OworICBhb3ItPnUuYWRkcmVzc1JhbmdlLT5taW4tPmZsYWdzIHw9IEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUOworICBpZiAoaSA+IDApIHsKKyAgICB1bnNpZ25lZCBjaGFyIGIgPSBtaW5baSAtIDFdOworICAgIGludCBqID0gMTsKKyAgICB3aGlsZSAoKGIgJiAoMHhGRlUgPj4gaikpICE9IDApIAorICAgICAgKytqOworICAgIGFvci0+dS5hZGRyZXNzUmFuZ2UtPm1pbi0+ZmxhZ3MgfD0gOCAtIGo7CisgIH0KKworICBmb3IgKGkgPSBsZW5ndGg7IGkgPiAwICYmIG1heFtpIC0gMV0gPT0gMHhGRjsgLS1pKQorICAgIDsKKyAgaWYgKCFBU04xX0JJVF9TVFJJTkdfc2V0KGFvci0+dS5hZGRyZXNzUmFuZ2UtPm1heCwgbWF4LCBpKSkKKyAgICBnb3RvIGVycjsKKyAgYW9yLT51LmFkZHJlc3NSYW5nZS0+bWF4LT5mbGFncyAmPSB+NzsKKyAgYW9yLT51LmFkZHJlc3NSYW5nZS0+bWF4LT5mbGFncyB8PSBBU04xX1NUUklOR19GTEFHX0JJVFNfTEVGVDsKKyAgaWYgKGkgPiAwKSB7CisgICAgdW5zaWduZWQgY2hhciBiID0gbWF4W2kgLSAxXTsKKyAgICBpbnQgaiA9IDE7CisgICAgd2hpbGUgKChiICYgKDB4RkZVID4+IGopKSAhPSAoMHhGRlUgPj4gaikpCisgICAgICArK2o7CisgICAgYW9yLT51LmFkZHJlc3NSYW5nZS0+bWF4LT5mbGFncyB8PSA4IC0gajsKKyAgfQorCisgICpyZXN1bHQgPSBhb3I7CisgIHJldHVybiAxOworCisgZXJyOgorICBJUEFkZHJlc3NPclJhbmdlX2ZyZWUoYW9yKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb25zdHJ1Y3QgYSBuZXcgYWRkcmVzcyBmYW1pbHkgb3IgZmluZCBhbiBleGlzdGluZyBvbmUuCisgKi8KK3N0YXRpYyBJUEFkZHJlc3NGYW1pbHkgKm1ha2VfSVBBZGRyZXNzRmFtaWx5KElQQWRkckJsb2NrcyAqYWRkciwKKwkJCQkJICAgICBjb25zdCB1bnNpZ25lZCBhZmksCisJCQkJCSAgICAgY29uc3QgdW5zaWduZWQgKnNhZmkpCit7CisgIElQQWRkcmVzc0ZhbWlseSAqZjsKKyAgdW5zaWduZWQgY2hhciBrZXlbM107CisgIHVuc2lnbmVkIGtleWxlbjsKKyAgaW50IGk7CisKKyAga2V5WzBdID0gKGFmaSA+PiA4KSAmIDB4RkY7CisgIGtleVsxXSA9IGFmaSAmIDB4RkY7CisgIGlmIChzYWZpICE9IE5VTEwpIHsKKyAgICBrZXlbMl0gPSAqc2FmaSAmIDB4RkY7CisgICAga2V5bGVuID0gMzsKKyAgfSBlbHNlIHsKKyAgICBrZXlsZW4gPSAyOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHNrX0lQQWRkcmVzc0ZhbWlseV9udW0oYWRkcik7IGkrKykgeworICAgIGYgPSBza19JUEFkZHJlc3NGYW1pbHlfdmFsdWUoYWRkciwgaSk7CisgICAgT1BFTlNTTF9hc3NlcnQoZi0+YWRkcmVzc0ZhbWlseS0+ZGF0YSAhPSBOVUxMKTsKKyAgICBpZiAoZi0+YWRkcmVzc0ZhbWlseS0+bGVuZ3RoID09IGtleWxlbiAmJgorCSFtZW1jbXAoZi0+YWRkcmVzc0ZhbWlseS0+ZGF0YSwga2V5LCBrZXlsZW4pKQorICAgICAgcmV0dXJuIGY7CisgIH0KKworICBpZiAoKGYgPSBJUEFkZHJlc3NGYW1pbHlfbmV3KCkpID09IE5VTEwpCisgICAgZ290byBlcnI7CisgIGlmIChmLT5pcEFkZHJlc3NDaG9pY2UgPT0gTlVMTCAmJgorICAgICAgKGYtPmlwQWRkcmVzc0Nob2ljZSA9IElQQWRkcmVzc0Nob2ljZV9uZXcoKSkgPT0gTlVMTCkKKyAgICBnb3RvIGVycjsKKyAgaWYgKGYtPmFkZHJlc3NGYW1pbHkgPT0gTlVMTCAmJiAKKyAgICAgIChmLT5hZGRyZXNzRmFtaWx5ID0gQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpID09IE5VTEwpCisgICAgZ290byBlcnI7CisgIGlmICghQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KGYtPmFkZHJlc3NGYW1pbHksIGtleSwga2V5bGVuKSkKKyAgICBnb3RvIGVycjsKKyAgaWYgKCFza19JUEFkZHJlc3NGYW1pbHlfcHVzaChhZGRyLCBmKSkKKyAgICBnb3RvIGVycjsKKworICByZXR1cm4gZjsKKworIGVycjoKKyAgSVBBZGRyZXNzRmFtaWx5X2ZyZWUoZik7CisgIHJldHVybiBOVUxMOworfQorCisvKgorICogQWRkIGFuIGluaGVyaXRhbmNlIGVsZW1lbnQuCisgKi8KK2ludCB2M19hZGRyX2FkZF9pbmhlcml0KElQQWRkckJsb2NrcyAqYWRkciwKKwkJCWNvbnN0IHVuc2lnbmVkIGFmaSwKKwkJCWNvbnN0IHVuc2lnbmVkICpzYWZpKQoreworICBJUEFkZHJlc3NGYW1pbHkgKmYgPSBtYWtlX0lQQWRkcmVzc0ZhbWlseShhZGRyLCBhZmksIHNhZmkpOworICBpZiAoZiA9PSBOVUxMIHx8CisgICAgICBmLT5pcEFkZHJlc3NDaG9pY2UgPT0gTlVMTCB8fAorICAgICAgKGYtPmlwQWRkcmVzc0Nob2ljZS0+dHlwZSA9PSBJUEFkZHJlc3NDaG9pY2VfYWRkcmVzc2VzT3JSYW5nZXMgJiYKKyAgICAgICBmLT5pcEFkZHJlc3NDaG9pY2UtPnUuYWRkcmVzc2VzT3JSYW5nZXMgIT0gTlVMTCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChmLT5pcEFkZHJlc3NDaG9pY2UtPnR5cGUgPT0gSVBBZGRyZXNzQ2hvaWNlX2luaGVyaXQgJiYKKyAgICAgIGYtPmlwQWRkcmVzc0Nob2ljZS0+dS5pbmhlcml0ICE9IE5VTEwpCisgICAgcmV0dXJuIDE7CisgIGlmIChmLT5pcEFkZHJlc3NDaG9pY2UtPnUuaW5oZXJpdCA9PSBOVUxMICYmCisgICAgICAoZi0+aXBBZGRyZXNzQ2hvaWNlLT51LmluaGVyaXQgPSBBU04xX05VTExfbmV3KCkpID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIGYtPmlwQWRkcmVzc0Nob2ljZS0+dHlwZSA9IElQQWRkcmVzc0Nob2ljZV9pbmhlcml0OworICByZXR1cm4gMTsKK30KKworLyoKKyAqIENvbnN0cnVjdCBhbiBJUEFkZHJlc3NPclJhbmdlIHNlcXVlbmNlLCBvciByZXR1cm4gYW4gZXhpc3Rpbmcgb25lLgorICovCitzdGF0aWMgSVBBZGRyZXNzT3JSYW5nZXMgKm1ha2VfcHJlZml4X29yX3JhbmdlKElQQWRkckJsb2NrcyAqYWRkciwKKwkJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGFmaSwKKwkJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkICpzYWZpKQoreworICBJUEFkZHJlc3NGYW1pbHkgKmYgPSBtYWtlX0lQQWRkcmVzc0ZhbWlseShhZGRyLCBhZmksIHNhZmkpOworICBJUEFkZHJlc3NPclJhbmdlcyAqYW9ycyA9IE5VTEw7CisKKyAgaWYgKGYgPT0gTlVMTCB8fAorICAgICAgZi0+aXBBZGRyZXNzQ2hvaWNlID09IE5VTEwgfHwKKyAgICAgIChmLT5pcEFkZHJlc3NDaG9pY2UtPnR5cGUgPT0gSVBBZGRyZXNzQ2hvaWNlX2luaGVyaXQgJiYKKyAgICAgICBmLT5pcEFkZHJlc3NDaG9pY2UtPnUuaW5oZXJpdCAhPSBOVUxMKSkKKyAgICByZXR1cm4gTlVMTDsKKyAgaWYgKGYtPmlwQWRkcmVzc0Nob2ljZS0+dHlwZSA9PSBJUEFkZHJlc3NDaG9pY2VfYWRkcmVzc2VzT3JSYW5nZXMpCisgICAgYW9ycyA9IGYtPmlwQWRkcmVzc0Nob2ljZS0+dS5hZGRyZXNzZXNPclJhbmdlczsKKyAgaWYgKGFvcnMgIT0gTlVMTCkKKyAgICByZXR1cm4gYW9yczsKKyAgaWYgKChhb3JzID0gc2tfSVBBZGRyZXNzT3JSYW5nZV9uZXdfbnVsbCgpKSA9PSBOVUxMKQorICAgIHJldHVybiBOVUxMOworICBzd2l0Y2ggKGFmaSkgeworICBjYXNlIElBTkFfQUZJX0lQVjQ6CisgICAgc2tfSVBBZGRyZXNzT3JSYW5nZV9zZXRfY21wX2Z1bmMoYW9ycywgdjRJUEFkZHJlc3NPclJhbmdlX2NtcCk7CisgICAgYnJlYWs7CisgIGNhc2UgSUFOQV9BRklfSVBWNjoKKyAgICBza19JUEFkZHJlc3NPclJhbmdlX3NldF9jbXBfZnVuYyhhb3JzLCB2NklQQWRkcmVzc09yUmFuZ2VfY21wKTsKKyAgICBicmVhazsKKyAgfQorICBmLT5pcEFkZHJlc3NDaG9pY2UtPnR5cGUgPSBJUEFkZHJlc3NDaG9pY2VfYWRkcmVzc2VzT3JSYW5nZXM7CisgIGYtPmlwQWRkcmVzc0Nob2ljZS0+dS5hZGRyZXNzZXNPclJhbmdlcyA9IGFvcnM7CisgIHJldHVybiBhb3JzOworfQorCisvKgorICogQWRkIGEgcHJlZml4LgorICovCitpbnQgdjNfYWRkcl9hZGRfcHJlZml4KElQQWRkckJsb2NrcyAqYWRkciwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGFmaSwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkICpzYWZpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqYSwKKwkJICAgICAgIGNvbnN0IGludCBwcmVmaXhsZW4pCit7CisgIElQQWRkcmVzc09yUmFuZ2VzICphb3JzID0gbWFrZV9wcmVmaXhfb3JfcmFuZ2UoYWRkciwgYWZpLCBzYWZpKTsKKyAgSVBBZGRyZXNzT3JSYW5nZSAqYW9yOworICBpZiAoYW9ycyA9PSBOVUxMIHx8ICFtYWtlX2FkZHJlc3NQcmVmaXgoJmFvciwgYSwgcHJlZml4bGVuKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHNrX0lQQWRkcmVzc09yUmFuZ2VfcHVzaChhb3JzLCBhb3IpKQorICAgIHJldHVybiAxOworICBJUEFkZHJlc3NPclJhbmdlX2ZyZWUoYW9yKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgYSByYW5nZS4KKyAqLworaW50IHYzX2FkZHJfYWRkX3JhbmdlKElQQWRkckJsb2NrcyAqYWRkciwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgYWZpLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCAqc2FmaSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbWluLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICptYXgpCit7CisgIElQQWRkcmVzc09yUmFuZ2VzICphb3JzID0gbWFrZV9wcmVmaXhfb3JfcmFuZ2UoYWRkciwgYWZpLCBzYWZpKTsKKyAgSVBBZGRyZXNzT3JSYW5nZSAqYW9yOworICBpbnQgbGVuZ3RoID0gbGVuZ3RoX2Zyb21fYWZpKGFmaSk7CisgIGlmIChhb3JzID09IE5VTEwpCisgICAgcmV0dXJuIDA7CisgIGlmICghbWFrZV9hZGRyZXNzUmFuZ2UoJmFvciwgbWluLCBtYXgsIGxlbmd0aCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChza19JUEFkZHJlc3NPclJhbmdlX3B1c2goYW9ycywgYW9yKSkKKyAgICByZXR1cm4gMTsKKyAgSVBBZGRyZXNzT3JSYW5nZV9mcmVlKGFvcik7CisgIHJldHVybiAwOworfQorCisvKgorICogRXh0cmFjdCBtaW4gYW5kIG1heCB2YWx1ZXMgZnJvbSBhbiBJUEFkZHJlc3NPclJhbmdlLgorICovCitzdGF0aWMgdm9pZCBleHRyYWN0X21pbl9tYXgoSVBBZGRyZXNzT3JSYW5nZSAqYW9yLAorCQkJICAgIHVuc2lnbmVkIGNoYXIgKm1pbiwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICptYXgsCisJCQkgICAgaW50IGxlbmd0aCkKK3sKKyAgT1BFTlNTTF9hc3NlcnQoYW9yICE9IE5VTEwgJiYgbWluICE9IE5VTEwgJiYgbWF4ICE9IE5VTEwpOworICBzd2l0Y2ggKGFvci0+dHlwZSkgeworICBjYXNlIElQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1ByZWZpeDoKKyAgICBhZGRyX2V4cGFuZChtaW4sIGFvci0+dS5hZGRyZXNzUHJlZml4LCBsZW5ndGgsIDB4MDApOworICAgIGFkZHJfZXhwYW5kKG1heCwgYW9yLT51LmFkZHJlc3NQcmVmaXgsIGxlbmd0aCwgMHhGRik7CisgICAgcmV0dXJuOworICBjYXNlIElQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1JhbmdlOgorICAgIGFkZHJfZXhwYW5kKG1pbiwgYW9yLT51LmFkZHJlc3NSYW5nZS0+bWluLCBsZW5ndGgsIDB4MDApOworICAgIGFkZHJfZXhwYW5kKG1heCwgYW9yLT51LmFkZHJlc3NSYW5nZS0+bWF4LCBsZW5ndGgsIDB4RkYpOworICAgIHJldHVybjsKKyAgfQorfQorCisvKgorICogUHVibGljIHdyYXBwZXIgZm9yIGV4dHJhY3RfbWluX21heCgpLgorICovCitpbnQgdjNfYWRkcl9nZXRfcmFuZ2UoSVBBZGRyZXNzT3JSYW5nZSAqYW9yLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBhZmksCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm1pbiwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbWF4LAorCQkgICAgICBjb25zdCBpbnQgbGVuZ3RoKQoreworICBpbnQgYWZpX2xlbmd0aCA9IGxlbmd0aF9mcm9tX2FmaShhZmkpOworICBpZiAoYW9yID09IE5VTEwgfHwgbWluID09IE5VTEwgfHwgbWF4ID09IE5VTEwgfHwKKyAgICAgIGFmaV9sZW5ndGggPT0gMCB8fCBsZW5ndGggPCBhZmlfbGVuZ3RoIHx8CisgICAgICAoYW9yLT50eXBlICE9IElQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1ByZWZpeCAmJgorICAgICAgIGFvci0+dHlwZSAhPSBJUEFkZHJlc3NPclJhbmdlX2FkZHJlc3NSYW5nZSkpCisgICAgcmV0dXJuIDA7CisgIGV4dHJhY3RfbWluX21heChhb3IsIG1pbiwgbWF4LCBhZmlfbGVuZ3RoKTsKKyAgcmV0dXJuIGFmaV9sZW5ndGg7Cit9CisKKy8qCisgKiBTb3J0IGNvbXBhcmlzaW9uIGZ1bmN0aW9uIGZvciBhIHNlcXVlbmNlIG9mIElQQWRkcmVzc0ZhbWlseS4KKyAqCisgKiBUaGUgbGFzdCBwYXJhZ3JhcGggb2YgUkZDIDM3NzkgMi4yLjMuMyBpcyBzbGlnaHRseSBhbWJpZ3VvdXMgYWJvdXQKKyAqIHRoZSBvcmRlcmluZzogSSBjYW4gcmVhZCBpdCBhcyBtZWFuaW5nIHRoYXQgSVB2NiB3aXRob3V0IGEgU0FGSQorICogY29tZXMgYmVmb3JlIElQdjQgd2l0aCBhIFNBRkksIHdoaWNoIHNlZW1zIHByZXR0eSB3ZWlyZC4gIFRoZQorICogZXhhbXBsZXMgaW4gYXBwZW5kaXggQiBzdWdnZXN0IHRoYXQgdGhlIGF1dGhvciBpbnRlbmRlZCB0aGUKKyAqIG51bGwtU0FGSSBydWxlIHRvIGFwcGx5IG9ubHkgd2l0aGluIGEgc2luZ2xlIEFGSSwgd2hpY2ggaXMgd2hhdCBJCisgKiB3b3VsZCBoYXZlIGV4cGVjdGVkIGFuZCBpcyB3aGF0IHRoZSBmb2xsb3dpbmcgY29kZSBpbXBsZW1lbnRzLgorICovCitzdGF0aWMgaW50IElQQWRkcmVzc0ZhbWlseV9jbXAoY29uc3QgSVBBZGRyZXNzRmFtaWx5ICogY29uc3QgKmFfLAorCQkJICAgICAgIGNvbnN0IElQQWRkcmVzc0ZhbWlseSAqIGNvbnN0ICpiXykKK3sKKyAgY29uc3QgQVNOMV9PQ1RFVF9TVFJJTkcgKmEgPSAoKmFfKS0+YWRkcmVzc0ZhbWlseTsKKyAgY29uc3QgQVNOMV9PQ1RFVF9TVFJJTkcgKmIgPSAoKmJfKS0+YWRkcmVzc0ZhbWlseTsKKyAgaW50IGxlbiA9ICgoYS0+bGVuZ3RoIDw9IGItPmxlbmd0aCkgPyBhLT5sZW5ndGggOiBiLT5sZW5ndGgpOworICBpbnQgY21wID0gbWVtY21wKGEtPmRhdGEsIGItPmRhdGEsIGxlbik7CisgIHJldHVybiBjbXAgPyBjbXAgOiBhLT5sZW5ndGggLSBiLT5sZW5ndGg7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIGFuIElQQWRkckJMb2NrcyBpcyBpbiBjYW5vbmljYWwgZm9ybS4KKyAqLworaW50IHYzX2FkZHJfaXNfY2Fub25pY2FsKElQQWRkckJsb2NrcyAqYWRkcikKK3sKKyAgdW5zaWduZWQgY2hhciBhX21pbltBRERSX1JBV19CVUZfTEVOXSwgYV9tYXhbQUREUl9SQVdfQlVGX0xFTl07CisgIHVuc2lnbmVkIGNoYXIgYl9taW5bQUREUl9SQVdfQlVGX0xFTl0sIGJfbWF4W0FERFJfUkFXX0JVRl9MRU5dOworICBJUEFkZHJlc3NPclJhbmdlcyAqYW9yczsKKyAgaW50IGksIGosIGs7CisKKyAgLyoKKyAgICogRW1wdHkgZXh0ZW5zaW9uIGlzIGNhbm5vbmljYWwuCisgICAqLworICBpZiAoYWRkciA9PSBOVUxMKQorICAgIHJldHVybiAxOworCisgIC8qCisgICAqIENoZWNrIHdoZXRoZXIgdGhlIHRvcC1sZXZlbCBsaXN0IGlzIGluIG9yZGVyLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNrX0lQQWRkcmVzc0ZhbWlseV9udW0oYWRkcikgLSAxOyBpKyspIHsKKyAgICBjb25zdCBJUEFkZHJlc3NGYW1pbHkgKmEgPSBza19JUEFkZHJlc3NGYW1pbHlfdmFsdWUoYWRkciwgaSk7CisgICAgY29uc3QgSVBBZGRyZXNzRmFtaWx5ICpiID0gc2tfSVBBZGRyZXNzRmFtaWx5X3ZhbHVlKGFkZHIsIGkgKyAxKTsKKyAgICBpZiAoSVBBZGRyZXNzRmFtaWx5X2NtcCgmYSwgJmIpID49IDApCisgICAgICByZXR1cm4gMDsKKyAgfQorCisgIC8qCisgICAqIFRvcCBsZXZlbCdzIG9rLCBub3cgY2hlY2sgZWFjaCBhZGRyZXNzIGZhbWlseS4KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBza19JUEFkZHJlc3NGYW1pbHlfbnVtKGFkZHIpOyBpKyspIHsKKyAgICBJUEFkZHJlc3NGYW1pbHkgKmYgPSBza19JUEFkZHJlc3NGYW1pbHlfdmFsdWUoYWRkciwgaSk7CisgICAgaW50IGxlbmd0aCA9IGxlbmd0aF9mcm9tX2FmaSh2M19hZGRyX2dldF9hZmkoZikpOworCisgICAgLyoKKyAgICAgKiBJbmhlcml0YW5jZSBpcyBjYW5vbmljYWwuICBBbnl0aGluZyBvdGhlciB0aGFuIGluaGVyaXRhbmNlIG9yCisgICAgICogYSBTRVFVRU5DRSBPRiBJUEFkZHJlc3NPclJhbmdlIGlzIGFuIEFTTi4xIGVycm9yIG9yIHNvbWV0aGluZy4KKyAgICAgKi8KKyAgICBpZiAoZiA9PSBOVUxMIHx8IGYtPmlwQWRkcmVzc0Nob2ljZSA9PSBOVUxMKQorICAgICAgcmV0dXJuIDA7CisgICAgc3dpdGNoIChmLT5pcEFkZHJlc3NDaG9pY2UtPnR5cGUpIHsKKyAgICBjYXNlIElQQWRkcmVzc0Nob2ljZV9pbmhlcml0OgorICAgICAgY29udGludWU7CisgICAgY2FzZSBJUEFkZHJlc3NDaG9pY2VfYWRkcmVzc2VzT3JSYW5nZXM6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJdCdzIGFuIElQQWRkcmVzc09yUmFuZ2VzIHNlcXVlbmNlLCBjaGVjayBpdC4KKyAgICAgKi8KKyAgICBhb3JzID0gZi0+aXBBZGRyZXNzQ2hvaWNlLT51LmFkZHJlc3Nlc09yUmFuZ2VzOworICAgIGlmIChza19JUEFkZHJlc3NPclJhbmdlX251bShhb3JzKSA9PSAwKQorICAgICAgcmV0dXJuIDA7CisgICAgZm9yIChqID0gMDsgaiA8IHNrX0lQQWRkcmVzc09yUmFuZ2VfbnVtKGFvcnMpIC0gMTsgaisrKSB7CisgICAgICBJUEFkZHJlc3NPclJhbmdlICphID0gc2tfSVBBZGRyZXNzT3JSYW5nZV92YWx1ZShhb3JzLCBqKTsKKyAgICAgIElQQWRkcmVzc09yUmFuZ2UgKmIgPSBza19JUEFkZHJlc3NPclJhbmdlX3ZhbHVlKGFvcnMsIGogKyAxKTsKKworICAgICAgZXh0cmFjdF9taW5fbWF4KGEsIGFfbWluLCBhX21heCwgbGVuZ3RoKTsKKyAgICAgIGV4dHJhY3RfbWluX21heChiLCBiX21pbiwgYl9tYXgsIGxlbmd0aCk7CisKKyAgICAgIC8qCisgICAgICAgKiBQdW50IG1pc29yZGVyZWQgbGlzdCwgb3ZlcmxhcHBpbmcgc3RhcnQsIG9yIGludmVydGVkIHJhbmdlLgorICAgICAgICovCisgICAgICBpZiAobWVtY21wKGFfbWluLCBiX21pbiwgbGVuZ3RoKSA+PSAwIHx8CisJICBtZW1jbXAoYV9taW4sIGFfbWF4LCBsZW5ndGgpID4gMCB8fAorCSAgbWVtY21wKGJfbWluLCBiX21heCwgbGVuZ3RoKSA+IDApCisJcmV0dXJuIDA7CisKKyAgICAgIC8qCisgICAgICAgKiBQdW50IGlmIGFkamFjZW50IG9yIG92ZXJsYXBwaW5nLiAgQ2hlY2sgZm9yIGFkamFjZW5jeSBieQorICAgICAgICogc3VidHJhY3Rpbmcgb25lIGZyb20gYl9taW4gZmlyc3QuCisgICAgICAgKi8KKyAgICAgIGZvciAoayA9IGxlbmd0aCAtIDE7IGsgPj0gMCAmJiBiX21pbltrXS0tID09IDB4MDA7IGstLSkKKwk7CisgICAgICBpZiAobWVtY21wKGFfbWF4LCBiX21pbiwgbGVuZ3RoKSA+PSAwKQorCXJldHVybiAwOworCisgICAgICAvKgorICAgICAgICogQ2hlY2sgZm9yIHJhbmdlIHRoYXQgc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyBhIHByZWZpeC4KKyAgICAgICAqLworICAgICAgaWYgKGEtPnR5cGUgPT0gSVBBZGRyZXNzT3JSYW5nZV9hZGRyZXNzUmFuZ2UgJiYKKwkgIHJhbmdlX3Nob3VsZF9iZV9wcmVmaXgoYV9taW4sIGFfbWF4LCBsZW5ndGgpID49IDApCisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBmaW5hbCByYW5nZSB0byBzZWUgaWYgaXQgc2hvdWxkIGJlIGEgcHJlZml4LgorICAgICAqLworICAgIGogPSBza19JUEFkZHJlc3NPclJhbmdlX251bShhb3JzKSAtIDE7CisgICAgeworICAgICAgSVBBZGRyZXNzT3JSYW5nZSAqYSA9IHNrX0lQQWRkcmVzc09yUmFuZ2VfdmFsdWUoYW9ycywgaik7CisgICAgICBpZiAoYS0+dHlwZSA9PSBJUEFkZHJlc3NPclJhbmdlX2FkZHJlc3NSYW5nZSkgeworCWV4dHJhY3RfbWluX21heChhLCBhX21pbiwgYV9tYXgsIGxlbmd0aCk7CisJaWYgKHJhbmdlX3Nob3VsZF9iZV9wcmVmaXgoYV9taW4sIGFfbWF4LCBsZW5ndGgpID49IDApCisJICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKgorICAgKiBJZiB3ZSBtYWRlIGl0IHRocm91Z2ggYWxsIHRoYXQsIHdlJ3JlIGhhcHB5LgorICAgKi8KKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBXaGFjayBhbiBJUEFkZHJlc3NPclJhbmdlcyBpbnRvIGNhbm9uaWNhbCBmb3JtLgorICovCitzdGF0aWMgaW50IElQQWRkcmVzc09yUmFuZ2VzX2Nhbm9uaXplKElQQWRkcmVzc09yUmFuZ2VzICphb3JzLAorCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGFmaSkKK3sKKyAgaW50IGksIGosIGxlbmd0aCA9IGxlbmd0aF9mcm9tX2FmaShhZmkpOworCisgIC8qCisgICAqIFNvcnQgdGhlIElQQWRkcmVzc09yUmFuZ2VzIHNlcXVlbmNlLgorICAgKi8KKyAgc2tfSVBBZGRyZXNzT3JSYW5nZV9zb3J0KGFvcnMpOworCisgIC8qCisgICAqIENsZWFuIHVwIHJlcHJlc2VudGF0aW9uIGlzc3VlcywgcHVudCBvbiBkdXBsaWNhdGVzIG9yIG92ZXJsYXBzLgorICAgKi8KKyAgZm9yIChpID0gMDsgaSA8IHNrX0lQQWRkcmVzc09yUmFuZ2VfbnVtKGFvcnMpIC0gMTsgaSsrKSB7CisgICAgSVBBZGRyZXNzT3JSYW5nZSAqYSA9IHNrX0lQQWRkcmVzc09yUmFuZ2VfdmFsdWUoYW9ycywgaSk7CisgICAgSVBBZGRyZXNzT3JSYW5nZSAqYiA9IHNrX0lQQWRkcmVzc09yUmFuZ2VfdmFsdWUoYW9ycywgaSArIDEpOworICAgIHVuc2lnbmVkIGNoYXIgYV9taW5bQUREUl9SQVdfQlVGX0xFTl0sIGFfbWF4W0FERFJfUkFXX0JVRl9MRU5dOworICAgIHVuc2lnbmVkIGNoYXIgYl9taW5bQUREUl9SQVdfQlVGX0xFTl0sIGJfbWF4W0FERFJfUkFXX0JVRl9MRU5dOworCisgICAgZXh0cmFjdF9taW5fbWF4KGEsIGFfbWluLCBhX21heCwgbGVuZ3RoKTsKKyAgICBleHRyYWN0X21pbl9tYXgoYiwgYl9taW4sIGJfbWF4LCBsZW5ndGgpOworCisgICAgLyoKKyAgICAgKiBQdW50IG92ZXJsYXBzLgorICAgICAqLworICAgIGlmIChtZW1jbXAoYV9tYXgsIGJfbWluLCBsZW5ndGgpID49IDApCisgICAgICByZXR1cm4gMDsKKworICAgIC8qCisgICAgICogTWVyZ2UgaWYgYSBhbmQgYiBhcmUgYWRqYWNlbnQuICBXZSBjaGVjayBmb3IKKyAgICAgKiBhZGphY2VuY3kgYnkgc3VidHJhY3Rpbmcgb25lIGZyb20gYl9taW4gZmlyc3QuCisgICAgICovCisgICAgZm9yIChqID0gbGVuZ3RoIC0gMTsgaiA+PSAwICYmIGJfbWluW2pdLS0gPT0gMHgwMDsgai0tKQorICAgICAgOworICAgIGlmIChtZW1jbXAoYV9tYXgsIGJfbWluLCBsZW5ndGgpID09IDApIHsKKyAgICAgIElQQWRkcmVzc09yUmFuZ2UgKm1lcmdlZDsKKyAgICAgIGlmICghbWFrZV9hZGRyZXNzUmFuZ2UoJm1lcmdlZCwgYV9taW4sIGJfbWF4LCBsZW5ndGgpKQorCXJldHVybiAwOworICAgICAgc2tfSVBBZGRyZXNzT3JSYW5nZV9zZXQoYW9ycywgaSwgbWVyZ2VkKTsKKyAgICAgIHNrX0lQQWRkcmVzc09yUmFuZ2VfZGVsZXRlKGFvcnMsIGkgKyAxKTsKKyAgICAgIElQQWRkcmVzc09yUmFuZ2VfZnJlZShhKTsKKyAgICAgIElQQWRkcmVzc09yUmFuZ2VfZnJlZShiKTsKKyAgICAgIC0taTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiAxOworfQorCisvKgorICogV2hhY2sgYW4gSVBBZGRyQmxvY2tzIGV4dGVuc2lvbiBpbnRvIGNhbm9uaWNhbCBmb3JtLgorICovCitpbnQgdjNfYWRkcl9jYW5vbml6ZShJUEFkZHJCbG9ja3MgKmFkZHIpCit7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgc2tfSVBBZGRyZXNzRmFtaWx5X251bShhZGRyKTsgaSsrKSB7CisgICAgSVBBZGRyZXNzRmFtaWx5ICpmID0gc2tfSVBBZGRyZXNzRmFtaWx5X3ZhbHVlKGFkZHIsIGkpOworICAgIGlmIChmLT5pcEFkZHJlc3NDaG9pY2UtPnR5cGUgPT0gSVBBZGRyZXNzQ2hvaWNlX2FkZHJlc3Nlc09yUmFuZ2VzICYmCisJIUlQQWRkcmVzc09yUmFuZ2VzX2Nhbm9uaXplKGYtPmlwQWRkcmVzc0Nob2ljZS0+dS5hZGRyZXNzZXNPclJhbmdlcywKKwkJCQkgICAgdjNfYWRkcl9nZXRfYWZpKGYpKSkKKyAgICAgIHJldHVybiAwOworICB9CisgIHNrX0lQQWRkcmVzc0ZhbWlseV9zZXRfY21wX2Z1bmMoYWRkciwgSVBBZGRyZXNzRmFtaWx5X2NtcCk7CisgIHNrX0lQQWRkcmVzc0ZhbWlseV9zb3J0KGFkZHIpOworICBPUEVOU1NMX2Fzc2VydCh2M19hZGRyX2lzX2Nhbm9uaWNhbChhZGRyKSk7CisgIHJldHVybiAxOworfQorCisvKgorICogdjJpIGhhbmRsZXIgZm9yIHRoZSBJUEFkZHJCbG9ja3MgZXh0ZW5zaW9uLgorICovCitzdGF0aWMgdm9pZCAqdjJpX0lQQWRkckJsb2Nrcyhjb25zdCBzdHJ1Y3QgdjNfZXh0X21ldGhvZCAqbWV0aG9kLAorCQkJICAgICAgc3RydWN0IHYzX2V4dF9jdHggKmN0eCwKKwkJCSAgICAgIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXMpCit7CisgIHN0YXRpYyBjb25zdCBjaGFyIHY0YWRkcl9jaGFyc1tdID0gIjAxMjM0NTY3ODkuIjsKKyAgc3RhdGljIGNvbnN0IGNoYXIgdjZhZGRyX2NoYXJzW10gPSAiMDEyMzQ1Njc4OS46YWJjZGVmQUJDREVGIjsKKyAgSVBBZGRyQmxvY2tzICphZGRyID0gTlVMTDsKKyAgY2hhciAqcyA9IE5VTEwsICp0OworICBpbnQgaTsKKyAgCisgIGlmICgoYWRkciA9IHNrX0lQQWRkcmVzc0ZhbWlseV9uZXcoSVBBZGRyZXNzRmFtaWx5X2NtcCkpID09IE5VTEwpIHsKKyAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0lQQUREUkJMT0NLUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHVlcyk7IGkrKykgeworICAgIENPTkZfVkFMVUUgKnZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUodmFsdWVzLCBpKTsKKyAgICB1bnNpZ25lZCBjaGFyIG1pbltBRERSX1JBV19CVUZfTEVOXSwgbWF4W0FERFJfUkFXX0JVRl9MRU5dOworICAgIHVuc2lnbmVkIGFmaSwgKnNhZmkgPSBOVUxMLCBzYWZpXzsKKyAgICBjb25zdCBjaGFyICphZGRyX2NoYXJzOworICAgIGludCBwcmVmaXhsZW4sIGkxLCBpMiwgZGVsaW0sIGxlbmd0aDsKKworICAgIGlmICggICAgICAgIW5hbWVfY21wKHZhbC0+bmFtZSwgIklQdjQiKSkgeworICAgICAgYWZpID0gSUFOQV9BRklfSVBWNDsKKyAgICB9IGVsc2UgaWYgKCFuYW1lX2NtcCh2YWwtPm5hbWUsICJJUHY2IikpIHsKKyAgICAgIGFmaSA9IElBTkFfQUZJX0lQVjY7CisgICAgfSBlbHNlIGlmICghbmFtZV9jbXAodmFsLT5uYW1lLCAiSVB2NC1TQUZJIikpIHsKKyAgICAgIGFmaSA9IElBTkFfQUZJX0lQVjQ7CisgICAgICBzYWZpID0gJnNhZmlfOworICAgIH0gZWxzZSBpZiAoIW5hbWVfY21wKHZhbC0+bmFtZSwgIklQdjYtU0FGSSIpKSB7CisgICAgICBhZmkgPSBJQU5BX0FGSV9JUFY2OworICAgICAgc2FmaSA9ICZzYWZpXzsKKyAgICB9IGVsc2UgeworICAgICAgWDUwOVYzZXJyKFg1MDlWM19GX1YySV9JUEFERFJCTE9DS1MsIFg1MDlWM19SX0VYVEVOU0lPTl9OQU1FX0VSUk9SKTsKKyAgICAgIFg1MDlWM19jb25mX2Vycih2YWwpOworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgc3dpdGNoIChhZmkpIHsKKyAgICBjYXNlIElBTkFfQUZJX0lQVjQ6CisgICAgICBhZGRyX2NoYXJzID0gdjRhZGRyX2NoYXJzOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJQU5BX0FGSV9JUFY2OgorICAgICAgYWRkcl9jaGFycyA9IHY2YWRkcl9jaGFyczsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGxlbmd0aCA9IGxlbmd0aF9mcm9tX2FmaShhZmkpOworCisgICAgLyoKKyAgICAgKiBIYW5kbGUgU0FGSSwgaWYgYW55LCBhbmQgQlVGX3N0cmR1cCgpIHNvIHdlIGNhbiBudWxsLXRlcm1pbmF0ZQorICAgICAqIHRoZSBvdGhlciBpbnB1dCB2YWx1ZXMuCisgICAgICovCisgICAgaWYgKHNhZmkgIT0gTlVMTCkgeworICAgICAgKnNhZmkgPSBzdHJ0b3VsKHZhbC0+dmFsdWUsICZ0LCAwKTsKKyAgICAgIHQgKz0gc3Ryc3BuKHQsICIgXHQiKTsKKyAgICAgIGlmICgqc2FmaSA+IDB4RkYgfHwgKnQrKyAhPSAnOicpIHsKKwlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0lQQUREUkJMT0NLUywgWDUwOVYzX1JfSU5WQUxJRF9TQUZJKTsKKwlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwlnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIHQgKz0gc3Ryc3BuKHQsICIgXHQiKTsKKyAgICAgIHMgPSBCVUZfc3RyZHVwKHQpOworICAgIH0gZWxzZSB7CisgICAgICBzID0gQlVGX3N0cmR1cCh2YWwtPnZhbHVlKTsKKyAgICB9CisgICAgaWYgKHMgPT0gTlVMTCkgeworICAgICAgWDUwOVYzZXJyKFg1MDlWM19GX1YySV9JUEFERFJCTE9DS1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKyAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGluaGVyaXRhbmNlLiAgTm90IHdvcnRoIGFkZGl0aW9uYWwgY29tcGxleGl0eSB0bworICAgICAqIG9wdGltaXplIHRoaXMgKHNlbGRvbS11c2VkKSBjYXNlLgorICAgICAqLworICAgIGlmICghc3RyY21wKHMsICJpbmhlcml0IikpIHsKKyAgICAgIGlmICghdjNfYWRkcl9hZGRfaW5oZXJpdChhZGRyLCBhZmksIHNhZmkpKSB7CisJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9JUEFERFJCTE9DS1MsIFg1MDlWM19SX0lOVkFMSURfSU5IRVJJVEFOQ0UpOworCVg1MDlWM19jb25mX2Vycih2YWwpOworCWdvdG8gZXJyOworICAgICAgfQorICAgICAgT1BFTlNTTF9mcmVlKHMpOworICAgICAgcyA9IE5VTEw7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpMSA9IHN0cnNwbihzLCBhZGRyX2NoYXJzKTsKKyAgICBpMiA9IGkxICsgc3Ryc3BuKHMgKyBpMSwgIiBcdCIpOworICAgIGRlbGltID0gc1tpMisrXTsKKyAgICBzW2kxXSA9ICdcMCc7CisKKyAgICBpZiAoYTJpX2lwYWRkKG1pbiwgcykgIT0gbGVuZ3RoKSB7CisgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0lQQUREUkJMT0NLUywgWDUwOVYzX1JfSU5WQUxJRF9JUEFERFJFU1MpOworICAgICAgWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGRlbGltKSB7CisgICAgY2FzZSAnLyc6CisgICAgICBwcmVmaXhsZW4gPSAoaW50KSBzdHJ0b3VsKHMgKyBpMiwgJnQsIDEwKTsKKyAgICAgIGlmICh0ID09IHMgKyBpMiB8fCAqdCAhPSAnXDAnKSB7CisJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9JUEFERFJCTE9DS1MsIFg1MDlWM19SX0VYVEVOU0lPTl9WQUxVRV9FUlJPUik7CisJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJZ290byBlcnI7CisgICAgICB9CisgICAgICBpZiAoIXYzX2FkZHJfYWRkX3ByZWZpeChhZGRyLCBhZmksIHNhZmksIG1pbiwgcHJlZml4bGVuKSkgeworCVg1MDlWM2VycihYNTA5VjNfRl9WMklfSVBBRERSQkxPQ0tTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJZ290byBlcnI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlICctJzoKKyAgICAgIGkxID0gaTIgKyBzdHJzcG4ocyArIGkyLCAiIFx0Iik7CisgICAgICBpMiA9IGkxICsgc3Ryc3BuKHMgKyBpMSwgYWRkcl9jaGFycyk7CisgICAgICBpZiAoaTEgPT0gaTIgfHwgc1tpMl0gIT0gJ1wwJykgeworCVg1MDlWM2VycihYNTA5VjNfRl9WMklfSVBBRERSQkxPQ0tTLCBYNTA5VjNfUl9FWFRFTlNJT05fVkFMVUVfRVJST1IpOworCVg1MDlWM19jb25mX2Vycih2YWwpOworCWdvdG8gZXJyOworICAgICAgfQorICAgICAgaWYgKGEyaV9pcGFkZChtYXgsIHMgKyBpMSkgIT0gbGVuZ3RoKSB7CisJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9JUEFERFJCTE9DS1MsIFg1MDlWM19SX0lOVkFMSURfSVBBRERSRVNTKTsKKwlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwlnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGlmICghdjNfYWRkcl9hZGRfcmFuZ2UoYWRkciwgYWZpLCBzYWZpLCBtaW4sIG1heCkpIHsKKwlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0lQQUREUkJMT0NLUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCWdvdG8gZXJyOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAnXDAnOgorICAgICAgaWYgKCF2M19hZGRyX2FkZF9wcmVmaXgoYWRkciwgYWZpLCBzYWZpLCBtaW4sIGxlbmd0aCAqIDgpKSB7CisJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9JUEFERFJCTE9DS1MsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlnb3RvIGVycjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0lQQUREUkJMT0NLUywgWDUwOVYzX1JfRVhURU5TSU9OX1ZBTFVFX0VSUk9SKTsKKyAgICAgIFg1MDlWM19jb25mX2Vycih2YWwpOworICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgT1BFTlNTTF9mcmVlKHMpOworICAgIHMgPSBOVUxMOworICB9CisKKyAgLyoKKyAgICogQ2Fub25pemUgdGhlIHJlc3VsdCwgdGhlbiB3ZSdyZSBkb25lLgorICAgKi8KKyAgaWYgKCF2M19hZGRyX2Nhbm9uaXplKGFkZHIpKQorICAgIGdvdG8gZXJyOyAgICAKKyAgcmV0dXJuIGFkZHI7CisKKyBlcnI6CisgIE9QRU5TU0xfZnJlZShzKTsKKyAgc2tfSVBBZGRyZXNzRmFtaWx5X3BvcF9mcmVlKGFkZHIsIElQQWRkcmVzc0ZhbWlseV9mcmVlKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBPcGVuU1NMIGRpc3BhdGNoCisgKi8KK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2FkZHIgPSB7CisgIE5JRF9zYmdwX2lwQWRkckJsb2NrLAkJLyogbmlkICovCisgIDAsCQkJCS8qIGZsYWdzICovCisgIEFTTjFfSVRFTV9yZWYoSVBBZGRyQmxvY2tzKSwJLyogdGVtcGxhdGUgKi8KKyAgMCwgMCwgMCwgMCwJCQkvKiBvbGQgZnVuY3Rpb25zLCBpZ25vcmVkICovCisgIDAsCQkJCS8qIGkycyAqLworICAwLAkJCQkvKiBzMmkgKi8KKyAgMCwJCQkJLyogaTJ2ICovCisgIHYyaV9JUEFkZHJCbG9ja3MsCQkvKiB2MmkgKi8KKyAgaTJyX0lQQWRkckJsb2NrcywJCS8qIGkyciAqLworICAwLAkJCQkvKiByMmkgKi8KKyAgTlVMTAkJCQkvKiBleHRlbnNpb24tc3BlY2lmaWMgZGF0YSAqLworfTsKKworLyoKKyAqIEZpZ3VyZSBvdXQgd2hldGhlciBleHRlbnNpb24gc3VlcyBpbmhlcml0YW5jZS4KKyAqLworaW50IHYzX2FkZHJfaW5oZXJpdHMoSVBBZGRyQmxvY2tzICphZGRyKQoreworICBpbnQgaTsKKyAgaWYgKGFkZHIgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgZm9yIChpID0gMDsgaSA8IHNrX0lQQWRkcmVzc0ZhbWlseV9udW0oYWRkcik7IGkrKykgeworICAgIElQQWRkcmVzc0ZhbWlseSAqZiA9IHNrX0lQQWRkcmVzc0ZhbWlseV92YWx1ZShhZGRyLCBpKTsKKyAgICBpZiAoZi0+aXBBZGRyZXNzQ2hvaWNlLT50eXBlID09IElQQWRkcmVzc0Nob2ljZV9pbmhlcml0KQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaWd1cmUgb3V0IHdoZXRoZXIgcGFyZW50IGNvbnRhaW5zIGNoaWxkLgorICovCitzdGF0aWMgaW50IGFkZHJfY29udGFpbnMoSVBBZGRyZXNzT3JSYW5nZXMgKnBhcmVudCwKKwkJCSBJUEFkZHJlc3NPclJhbmdlcyAqY2hpbGQsCisJCQkgaW50IGxlbmd0aCkKK3sKKyAgdW5zaWduZWQgY2hhciBwX21pbltBRERSX1JBV19CVUZfTEVOXSwgcF9tYXhbQUREUl9SQVdfQlVGX0xFTl07CisgIHVuc2lnbmVkIGNoYXIgY19taW5bQUREUl9SQVdfQlVGX0xFTl0sIGNfbWF4W0FERFJfUkFXX0JVRl9MRU5dOworICBpbnQgcCwgYzsKKworICBpZiAoY2hpbGQgPT0gTlVMTCB8fCBwYXJlbnQgPT0gY2hpbGQpCisgICAgcmV0dXJuIDE7CisgIGlmIChwYXJlbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBwID0gMDsKKyAgZm9yIChjID0gMDsgYyA8IHNrX0lQQWRkcmVzc09yUmFuZ2VfbnVtKGNoaWxkKTsgYysrKSB7CisgICAgZXh0cmFjdF9taW5fbWF4KHNrX0lQQWRkcmVzc09yUmFuZ2VfdmFsdWUoY2hpbGQsIGMpLAorCQkgICAgY19taW4sIGNfbWF4LCBsZW5ndGgpOworICAgIGZvciAoOzsgcCsrKSB7CisgICAgICBpZiAocCA+PSBza19JUEFkZHJlc3NPclJhbmdlX251bShwYXJlbnQpKQorCXJldHVybiAwOworICAgICAgZXh0cmFjdF9taW5fbWF4KHNrX0lQQWRkcmVzc09yUmFuZ2VfdmFsdWUocGFyZW50LCBwKSwKKwkJICAgICAgcF9taW4sIHBfbWF4LCBsZW5ndGgpOworICAgICAgaWYgKG1lbWNtcChwX21heCwgY19tYXgsIGxlbmd0aCkgPCAwKQorCWNvbnRpbnVlOworICAgICAgaWYgKG1lbWNtcChwX21pbiwgY19taW4sIGxlbmd0aCkgPiAwKQorCXJldHVybiAwOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgYSBpcyBhIHN1YnNldCBvZiBiLgorICovCitpbnQgdjNfYWRkcl9zdWJzZXQoSVBBZGRyQmxvY2tzICphLCBJUEFkZHJCbG9ja3MgKmIpCit7CisgIGludCBpOworICBpZiAoYSA9PSBOVUxMIHx8IGEgPT0gYikKKyAgICByZXR1cm4gMTsKKyAgaWYgKGIgPT0gTlVMTCB8fCB2M19hZGRyX2luaGVyaXRzKGEpIHx8IHYzX2FkZHJfaW5oZXJpdHMoYikpCisgICAgcmV0dXJuIDA7CisgIHNrX0lQQWRkcmVzc0ZhbWlseV9zZXRfY21wX2Z1bmMoYiwgSVBBZGRyZXNzRmFtaWx5X2NtcCk7CisgIGZvciAoaSA9IDA7IGkgPCBza19JUEFkZHJlc3NGYW1pbHlfbnVtKGEpOyBpKyspIHsKKyAgICBJUEFkZHJlc3NGYW1pbHkgKmZhID0gc2tfSVBBZGRyZXNzRmFtaWx5X3ZhbHVlKGEsIGkpOworICAgIGludCBqID0gc2tfSVBBZGRyZXNzRmFtaWx5X2ZpbmQoYiwgZmEpOworICAgIElQQWRkcmVzc0ZhbWlseSAqZmI7CisgICAgZmIgPSBza19JUEFkZHJlc3NGYW1pbHlfdmFsdWUoYiwgaik7CisgICAgaWYgKGZiID09IE5VTEwpCisgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFhZGRyX2NvbnRhaW5zKGZiLT5pcEFkZHJlc3NDaG9pY2UtPnUuYWRkcmVzc2VzT3JSYW5nZXMsIAorCQkgICAgICAgZmEtPmlwQWRkcmVzc0Nob2ljZS0+dS5hZGRyZXNzZXNPclJhbmdlcywKKwkJICAgICAgIGxlbmd0aF9mcm9tX2FmaSh2M19hZGRyX2dldF9hZmkoZmIpKSkpCisgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLyoKKyAqIFZhbGlkYXRpb24gZXJyb3IgaGFuZGxpbmcgdmlhIGNhbGxiYWNrLgorICovCisjZGVmaW5lIHZhbGlkYXRpb25fZXJyKF9lcnJfKQkJXAorICBkbyB7CQkJCQlcCisgICAgaWYgKGN0eCAhPSBOVUxMKSB7CQkJXAorICAgICAgY3R4LT5lcnJvciA9IF9lcnJfOwkJXAorICAgICAgY3R4LT5lcnJvcl9kZXB0aCA9IGk7CQlcCisgICAgICBjdHgtPmN1cnJlbnRfY2VydCA9IHg7CQlcCisgICAgICByZXQgPSBjdHgtPnZlcmlmeV9jYigwLCBjdHgpOwlcCisgICAgfSBlbHNlIHsJCQkJXAorICAgICAgcmV0ID0gMDsJCQkJXAorICAgIH0JCQkJCVwKKyAgICBpZiAoIXJldCkJCQkJXAorICAgICAgZ290byBkb25lOwkJCVwKKyAgfSB3aGlsZSAoMCkKKworLyoKKyAqIENvcmUgY29kZSBmb3IgUkZDIDM3NzkgMi4zIHBhdGggdmFsaWRhdGlvbi4KKyAqLworc3RhdGljIGludCB2M19hZGRyX3ZhbGlkYXRlX3BhdGhfaW50ZXJuYWwoWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCQkJICBTVEFDS19PRihYNTA5KSAqY2hhaW4sCisJCQkJCSAgSVBBZGRyQmxvY2tzICpleHQpCit7CisgIElQQWRkckJsb2NrcyAqY2hpbGQgPSBOVUxMOworICBpbnQgaSwgaiwgcmV0ID0gMTsKKyAgWDUwOSAqeDsKKworICBPUEVOU1NMX2Fzc2VydChjaGFpbiAhPSBOVUxMICYmIHNrX1g1MDlfbnVtKGNoYWluKSA+IDApOworICBPUEVOU1NMX2Fzc2VydChjdHggIT0gTlVMTCB8fCBleHQgIT0gTlVMTCk7CisgIE9QRU5TU0xfYXNzZXJ0KGN0eCA9PSBOVUxMIHx8IGN0eC0+dmVyaWZ5X2NiICE9IE5VTEwpOworCisgIC8qCisgICAqIEZpZ3VyZSBvdXQgd2hlcmUgdG8gc3RhcnQuICBJZiB3ZSBkb24ndCBoYXZlIGFuIGV4dGVuc2lvbiB0bworICAgKiBjaGVjaywgd2UncmUgZG9uZS4gIE90aGVyd2lzZSwgY2hlY2sgY2Fub25pY2FsIGZvcm0gYW5kCisgICAqIHNldCB1cCBmb3Igd2Fsa2luZyB1cCB0aGUgY2hhaW4uCisgICAqLworICBpZiAoZXh0ICE9IE5VTEwpIHsKKyAgICBpID0gLTE7CisgICAgeCA9IE5VTEw7CisgIH0gZWxzZSB7CisgICAgaSA9IDA7CisgICAgeCA9IHNrX1g1MDlfdmFsdWUoY2hhaW4sIGkpOworICAgIE9QRU5TU0xfYXNzZXJ0KHggIT0gTlVMTCk7CisgICAgaWYgKChleHQgPSB4LT5yZmMzNzc5X2FkZHIpID09IE5VTEwpCisgICAgICBnb3RvIGRvbmU7CisgIH0KKyAgaWYgKCF2M19hZGRyX2lzX2Nhbm9uaWNhbChleHQpKQorICAgIHZhbGlkYXRpb25fZXJyKFg1MDlfVl9FUlJfSU5WQUxJRF9FWFRFTlNJT04pOworICBza19JUEFkZHJlc3NGYW1pbHlfc2V0X2NtcF9mdW5jKGV4dCwgSVBBZGRyZXNzRmFtaWx5X2NtcCk7CisgIGlmICgoY2hpbGQgPSBza19JUEFkZHJlc3NGYW1pbHlfZHVwKGV4dCkpID09IE5VTEwpIHsKKyAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfVjNfQUREUl9WQUxJREFURV9QQVRIX0lOVEVSTkFMLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgcmV0ID0gMDsKKyAgICBnb3RvIGRvbmU7CisgIH0KKworICAvKgorICAgKiBOb3cgd2FsayB1cCB0aGUgY2hhaW4uICBObyBjZXJ0IG1heSBsaXN0IHJlc291cmNlcyB0aGF0IGl0cworICAgKiBwYXJlbnQgZG9lc24ndCBsaXN0LgorICAgKi8KKyAgZm9yIChpKys7IGkgPCBza19YNTA5X251bShjaGFpbik7IGkrKykgeworICAgIHggPSBza19YNTA5X3ZhbHVlKGNoYWluLCBpKTsKKyAgICBPUEVOU1NMX2Fzc2VydCh4ICE9IE5VTEwpOworICAgIGlmICghdjNfYWRkcl9pc19jYW5vbmljYWwoeC0+cmZjMzc3OV9hZGRyKSkKKyAgICAgIHZhbGlkYXRpb25fZXJyKFg1MDlfVl9FUlJfSU5WQUxJRF9FWFRFTlNJT04pOworICAgIGlmICh4LT5yZmMzNzc5X2FkZHIgPT0gTlVMTCkgeworICAgICAgZm9yIChqID0gMDsgaiA8IHNrX0lQQWRkcmVzc0ZhbWlseV9udW0oY2hpbGQpOyBqKyspIHsKKwlJUEFkZHJlc3NGYW1pbHkgKmZjID0gc2tfSVBBZGRyZXNzRmFtaWx5X3ZhbHVlKGNoaWxkLCBqKTsKKwlpZiAoZmMtPmlwQWRkcmVzc0Nob2ljZS0+dHlwZSAhPSBJUEFkZHJlc3NDaG9pY2VfaW5oZXJpdCkgeworCSAgdmFsaWRhdGlvbl9lcnIoWDUwOV9WX0VSUl9VTk5FU1RFRF9SRVNPVVJDRSk7CisJICBicmVhazsKKwl9CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc2tfSVBBZGRyZXNzRmFtaWx5X3NldF9jbXBfZnVuYyh4LT5yZmMzNzc5X2FkZHIsIElQQWRkcmVzc0ZhbWlseV9jbXApOworICAgIGZvciAoaiA9IDA7IGogPCBza19JUEFkZHJlc3NGYW1pbHlfbnVtKGNoaWxkKTsgaisrKSB7CisgICAgICBJUEFkZHJlc3NGYW1pbHkgKmZjID0gc2tfSVBBZGRyZXNzRmFtaWx5X3ZhbHVlKGNoaWxkLCBqKTsKKyAgICAgIGludCBrID0gc2tfSVBBZGRyZXNzRmFtaWx5X2ZpbmQoeC0+cmZjMzc3OV9hZGRyLCBmYyk7CisgICAgICBJUEFkZHJlc3NGYW1pbHkgKmZwID0gc2tfSVBBZGRyZXNzRmFtaWx5X3ZhbHVlKHgtPnJmYzM3NzlfYWRkciwgayk7CisgICAgICBpZiAoZnAgPT0gTlVMTCkgeworCWlmIChmYy0+aXBBZGRyZXNzQ2hvaWNlLT50eXBlID09IElQQWRkcmVzc0Nob2ljZV9hZGRyZXNzZXNPclJhbmdlcykgeworCSAgdmFsaWRhdGlvbl9lcnIoWDUwOV9WX0VSUl9VTk5FU1RFRF9SRVNPVVJDRSk7CisJICBicmVhazsKKwl9CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoZnAtPmlwQWRkcmVzc0Nob2ljZS0+dHlwZSA9PSBJUEFkZHJlc3NDaG9pY2VfYWRkcmVzc2VzT3JSYW5nZXMpIHsKKwlpZiAoZmMtPmlwQWRkcmVzc0Nob2ljZS0+dHlwZSA9PSBJUEFkZHJlc3NDaG9pY2VfaW5oZXJpdCB8fAorCSAgICBhZGRyX2NvbnRhaW5zKGZwLT5pcEFkZHJlc3NDaG9pY2UtPnUuYWRkcmVzc2VzT3JSYW5nZXMsIAorCQkJICBmYy0+aXBBZGRyZXNzQ2hvaWNlLT51LmFkZHJlc3Nlc09yUmFuZ2VzLAorCQkJICBsZW5ndGhfZnJvbV9hZmkodjNfYWRkcl9nZXRfYWZpKGZjKSkpKQorCSAgc2tfSVBBZGRyZXNzRmFtaWx5X3NldChjaGlsZCwgaiwgZnApOworCWVsc2UKKwkgIHZhbGlkYXRpb25fZXJyKFg1MDlfVl9FUlJfVU5ORVNURURfUkVTT1VSQ0UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qCisgICAqIFRydXN0IGFuY2hvciBjYW4ndCBpbmhlcml0LgorICAgKi8KKyAgT1BFTlNTTF9hc3NlcnQoeCAhPSBOVUxMKTsKKyAgaWYgKHgtPnJmYzM3NzlfYWRkciAhPSBOVUxMKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHNrX0lQQWRkcmVzc0ZhbWlseV9udW0oeC0+cmZjMzc3OV9hZGRyKTsgaisrKSB7CisgICAgICBJUEFkZHJlc3NGYW1pbHkgKmZwID0gc2tfSVBBZGRyZXNzRmFtaWx5X3ZhbHVlKHgtPnJmYzM3NzlfYWRkciwgaik7CisgICAgICBpZiAoZnAtPmlwQWRkcmVzc0Nob2ljZS0+dHlwZSA9PSBJUEFkZHJlc3NDaG9pY2VfaW5oZXJpdCAmJgorCSAgc2tfSVBBZGRyZXNzRmFtaWx5X2ZpbmQoY2hpbGQsIGZwKSA+PSAwKQorCXZhbGlkYXRpb25fZXJyKFg1MDlfVl9FUlJfVU5ORVNURURfUkVTT1VSQ0UpOworICAgIH0KKyAgfQorCisgZG9uZToKKyAgc2tfSVBBZGRyZXNzRmFtaWx5X2ZyZWUoY2hpbGQpOworICByZXR1cm4gcmV0OworfQorCisjdW5kZWYgdmFsaWRhdGlvbl9lcnIKKworLyoKKyAqIFJGQyAzNzc5IDIuMyBwYXRoIHZhbGlkYXRpb24gLS0gY2FsbGVkIGZyb20gWDUwOV92ZXJpZnlfY2VydCgpLgorICovCitpbnQgdjNfYWRkcl92YWxpZGF0ZV9wYXRoKFg1MDlfU1RPUkVfQ1RYICpjdHgpCit7CisgIHJldHVybiB2M19hZGRyX3ZhbGlkYXRlX3BhdGhfaW50ZXJuYWwoY3R4LCBjdHgtPmNoYWluLCBOVUxMKTsKK30KKworLyoKKyAqIFJGQyAzNzc5IDIuMyBwYXRoIHZhbGlkYXRpb24gb2YgYW4gZXh0ZW5zaW9uLgorICogVGVzdCB3aGV0aGVyIGNoYWluIGNvdmVycyBleHRlbnNpb24uCisgKi8KK2ludCB2M19hZGRyX3ZhbGlkYXRlX3Jlc291cmNlX3NldChTVEFDS19PRihYNTA5KSAqY2hhaW4sCisJCQkJICBJUEFkZHJCbG9ja3MgKmV4dCwKKwkJCQkgIGludCBhbGxvd19pbmhlcml0YW5jZSkKK3sKKyAgaWYgKGV4dCA9PSBOVUxMKQorICAgIHJldHVybiAxOworICBpZiAoY2hhaW4gPT0gTlVMTCB8fCBza19YNTA5X251bShjaGFpbikgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFhbGxvd19pbmhlcml0YW5jZSAmJiB2M19hZGRyX2luaGVyaXRzKGV4dCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiB2M19hZGRyX3ZhbGlkYXRlX3BhdGhfaW50ZXJuYWwoTlVMTCwgY2hhaW4sIGV4dCk7Cit9CisKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1JGQzM3NzkgKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYWtleS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19ha2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiNjhlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYWtleS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKiB2M19ha2V5LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0FVVEhPUklUWV9LRVlJRChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJQVVUSE9SSVRZX0tFWUlEICpha2V5aWQsIFNUQUNLX09GKENPTkZfVkFMVUUpICpleHRsaXN0KTsKK3N0YXRpYyBBVVRIT1JJVFlfS0VZSUQgKnYyaV9BVVRIT1JJVFlfS0VZSUQoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCVg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnZhbHVlcyk7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2FrZXlfaWQgPQorCXsKKwlOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyLAorCVg1MDlWM19FWFRfTVVMVElMSU5FLCBBU04xX0lURU1fcmVmKEFVVEhPUklUWV9LRVlJRCksCisJMCwwLDAsMCwKKwkwLDAsCisJKFg1MDlWM19FWFRfSTJWKWkydl9BVVRIT1JJVFlfS0VZSUQsCisJKFg1MDlWM19FWFRfVjJJKXYyaV9BVVRIT1JJVFlfS0VZSUQsCisJMCwwLAorCU5VTEwKKwl9OworCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmkydl9BVVRIT1JJVFlfS0VZSUQoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIEFVVEhPUklUWV9LRVlJRCAqYWtleWlkLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCkKK3sKKwljaGFyICp0bXA7CisJaWYoYWtleWlkLT5rZXlpZCkgeworCQl0bXAgPSBoZXhfdG9fc3RyaW5nKGFrZXlpZC0+a2V5aWQtPmRhdGEsIGFrZXlpZC0+a2V5aWQtPmxlbmd0aCk7CisJCVg1MDlWM19hZGRfdmFsdWUoImtleWlkIiwgdG1wLCAmZXh0bGlzdCk7CisJCU9QRU5TU0xfZnJlZSh0bXApOworCX0KKwlpZihha2V5aWQtPmlzc3VlcikgCisJCWV4dGxpc3QgPSBpMnZfR0VORVJBTF9OQU1FUyhOVUxMLCBha2V5aWQtPmlzc3VlciwgZXh0bGlzdCk7CisJaWYoYWtleWlkLT5zZXJpYWwpIHsKKwkJdG1wID0gaGV4X3RvX3N0cmluZyhha2V5aWQtPnNlcmlhbC0+ZGF0YSwKKwkJCQkJCSBha2V5aWQtPnNlcmlhbC0+bGVuZ3RoKTsKKwkJWDUwOVYzX2FkZF92YWx1ZSgic2VyaWFsIiwgdG1wLCAmZXh0bGlzdCk7CisJCU9QRU5TU0xfZnJlZSh0bXApOworCX0KKwlyZXR1cm4gZXh0bGlzdDsKK30KKworLyogQ3VycmVudGx5IHR3byBvcHRpb25zOgorICoga2V5aWQ6IHVzZSB0aGUgaXNzdWVycyBzdWJqZWN0IGtleWlkLCB0aGUgdmFsdWUgJ2Fsd2F5cycgbWVhbnMgaXRzIGlzCisgKiBhbiBlcnJvciBpZiB0aGUgaXNzdWVyIGNlcnRpZmljYXRlIGRvZXNuJ3QgaGF2ZSBhIGtleSBpZC4KKyAqIGlzc3VlcjogdXNlIHRoZSBpc3N1ZXJzIGNlcnQgaXNzdWVyIGFuZCBzZXJpYWwgbnVtYmVyLiBUaGUgZGVmYXVsdCBpcworICogdG8gb25seSB1c2UgdGhpcyBpZiBrZXlpZCBpcyBub3QgcHJlc2VudC4gV2l0aCB0aGUgb3B0aW9uICdhbHdheXMnCisgKiB0aGlzIGlzIGFsd2F5cyBpbmNsdWRlZC4KKyAqLworCitzdGF0aWMgQVVUSE9SSVRZX0tFWUlEICp2MmlfQVVUSE9SSVRZX0tFWUlEKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJICAgICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXMpCisJeworCWNoYXIga2V5aWQ9MCwgaXNzdWVyPTA7CisJaW50IGk7CisJQ09ORl9WQUxVRSAqY25mOworCUFTTjFfT0NURVRfU1RSSU5HICppa2V5aWQgPSBOVUxMOworCVg1MDlfTkFNRSAqaXNuYW1lID0gTlVMTDsKKwlHRU5FUkFMX05BTUVTICogZ2VucyA9IE5VTEw7CisJR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworCUFTTjFfSU5URUdFUiAqc2VyaWFsID0gTlVMTDsKKwlYNTA5X0VYVEVOU0lPTiAqZXh0OworCVg1MDkgKmNlcnQ7CisJQVVUSE9SSVRZX0tFWUlEICpha2V5aWQ7CisKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWx1ZXMpOyBpKyspCisJCXsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWx1ZXMsIGkpOworCQlpZighc3RyY21wKGNuZi0+bmFtZSwgImtleWlkIikpCisJCQl7CisJCQlrZXlpZCA9IDE7CisJCQlpZihjbmYtPnZhbHVlICYmICFzdHJjbXAoY25mLT52YWx1ZSwgImFsd2F5cyIpKQorCQkJCWtleWlkID0gMjsKKwkJCX0KKwkJZWxzZSBpZighc3RyY21wKGNuZi0+bmFtZSwgImlzc3VlciIpKQorCQkJeworCQkJaXNzdWVyID0gMTsKKwkJCWlmKGNuZi0+dmFsdWUgJiYgIXN0cmNtcChjbmYtPnZhbHVlLCAiYWx3YXlzIikpCisJCQkJaXNzdWVyID0gMjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9BVVRIT1JJVFlfS0VZSUQsWDUwOVYzX1JfVU5LTk9XTl9PUFRJT04pOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJuYW1lPSIsIGNuZi0+bmFtZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJaWYoIWN0eCB8fCAhY3R4LT5pc3N1ZXJfY2VydCkKKwkJeworCQlpZihjdHggJiYgKGN0eC0+ZmxhZ3M9PUNUWF9URVNUKSkKKwkJCXJldHVybiBBVVRIT1JJVFlfS0VZSURfbmV3KCk7CisJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQVVUSE9SSVRZX0tFWUlELFg1MDlWM19SX05PX0lTU1VFUl9DRVJUSUZJQ0FURSk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwljZXJ0ID0gY3R4LT5pc3N1ZXJfY2VydDsKKworCWlmKGtleWlkKQorCQl7CisJCWkgPSBYNTA5X2dldF9leHRfYnlfTklEKGNlcnQsIE5JRF9zdWJqZWN0X2tleV9pZGVudGlmaWVyLCAtMSk7CisJCWlmKChpID49IDApICAmJiAoZXh0ID0gWDUwOV9nZXRfZXh0KGNlcnQsIGkpKSkKKwkJCWlrZXlpZCA9IFg1MDlWM19FWFRfZDJpKGV4dCk7CisJCWlmKGtleWlkPT0yICYmICFpa2V5aWQpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0FVVEhPUklUWV9LRVlJRCxYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9LRVlJRCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJaWYoKGlzc3VlciAmJiAhaWtleWlkKSB8fCAoaXNzdWVyID09IDIpKQorCQl7CisJCWlzbmFtZSA9IFg1MDlfTkFNRV9kdXAoWDUwOV9nZXRfaXNzdWVyX25hbWUoY2VydCkpOworCQlzZXJpYWwgPSBNX0FTTjFfSU5URUdFUl9kdXAoWDUwOV9nZXRfc2VyaWFsTnVtYmVyKGNlcnQpKTsKKwkJaWYoIWlzbmFtZSB8fCAhc2VyaWFsKQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9BVVRIT1JJVFlfS0VZSUQsWDUwOVYzX1JfVU5BQkxFX1RPX0dFVF9JU1NVRVJfREVUQUlMUyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJaWYoIShha2V5aWQgPSBBVVRIT1JJVFlfS0VZSURfbmV3KCkpKSBnb3RvIGVycjsKKworCWlmKGlzbmFtZSkKKwkJeworCQlpZighKGdlbnMgPSBza19HRU5FUkFMX05BTUVfbmV3X251bGwoKSkKKwkJCXx8ICEoZ2VuID0gR0VORVJBTF9OQU1FX25ldygpKQorCQkJfHwgIXNrX0dFTkVSQUxfTkFNRV9wdXNoKGdlbnMsIGdlbikpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0FVVEhPUklUWV9LRVlJRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJZ2VuLT50eXBlID0gR0VOX0RJUk5BTUU7CisJCWdlbi0+ZC5kaXJuID0gaXNuYW1lOworCQl9CisKKwlha2V5aWQtPmlzc3VlciA9IGdlbnM7CisJYWtleWlkLT5zZXJpYWwgPSBzZXJpYWw7CisJYWtleWlkLT5rZXlpZCA9IGlrZXlpZDsKKworCXJldHVybiBha2V5aWQ7CisKKyBlcnI6CisJWDUwOV9OQU1FX2ZyZWUoaXNuYW1lKTsKKwlNX0FTTjFfSU5URUdFUl9mcmVlKHNlcmlhbCk7CisJTV9BU04xX09DVEVUX1NUUklOR19mcmVlKGlrZXlpZCk7CisJcmV0dXJuIE5VTEw7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19ha2V5YS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19ha2V5YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNTBmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2FrZXlhLmMKQEAgLTAsMCArMSw3MiBAQAorLyogdjNfYWtleV9hc24xLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK0FTTjFfU0VRVUVOQ0UoQVVUSE9SSVRZX0tFWUlEKSA9IHsKKwlBU04xX0lNUF9PUFQoQVVUSE9SSVRZX0tFWUlELCBrZXlpZCwgQVNOMV9PQ1RFVF9TVFJJTkcsIDApLAorCUFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChBVVRIT1JJVFlfS0VZSUQsIGlzc3VlciwgR0VORVJBTF9OQU1FLCAxKSwKKwlBU04xX0lNUF9PUFQoQVVUSE9SSVRZX0tFWUlELCBzZXJpYWwsIEFTTjFfSU5URUdFUiwgMikKK30gQVNOMV9TRVFVRU5DRV9FTkQoQVVUSE9SSVRZX0tFWUlEKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVVUSE9SSVRZX0tFWUlEKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19hbHQuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5ZDk0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYWx0LmMKQEAgLTAsMCArMSw2MTQgQEAKKy8qIHYzX2FsdC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK3N0YXRpYyBHRU5FUkFMX05BTUVTICp2Mmlfc3ViamVjdF9hbHQoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCk7CitzdGF0aWMgR0VORVJBTF9OQU1FUyAqdjJpX2lzc3Vlcl9hbHQoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCk7CitzdGF0aWMgaW50IGNvcHlfZW1haWwoWDUwOVYzX0NUWCAqY3R4LCBHRU5FUkFMX05BTUVTICpnZW5zLCBpbnQgbW92ZV9wKTsKK3N0YXRpYyBpbnQgY29weV9pc3N1ZXIoWDUwOVYzX0NUWCAqY3R4LCBHRU5FUkFMX05BTUVTICpnZW5zKTsKK3N0YXRpYyBpbnQgZG9fb3RoZXJuYW1lKEdFTkVSQUxfTkFNRSAqZ2VuLCBjaGFyICp2YWx1ZSwgWDUwOVYzX0NUWCAqY3R4KTsKK3N0YXRpYyBpbnQgZG9fZGlybmFtZShHRU5FUkFMX05BTUUgKmdlbiwgY2hhciAqdmFsdWUsIFg1MDlWM19DVFggKmN0eCk7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2FsdFtdID0geworeyBOSURfc3ViamVjdF9hbHRfbmFtZSwgMCwgQVNOMV9JVEVNX3JlZihHRU5FUkFMX05BTUVTKSwKKzAsMCwwLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlYpaTJ2X0dFTkVSQUxfTkFNRVMsCisoWDUwOVYzX0VYVF9WMkkpdjJpX3N1YmplY3RfYWx0LAorTlVMTCwgTlVMTCwgTlVMTH0sCisKK3sgTklEX2lzc3Vlcl9hbHRfbmFtZSwgMCwgQVNOMV9JVEVNX3JlZihHRU5FUkFMX05BTUVTKSwKKzAsMCwwLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlYpaTJ2X0dFTkVSQUxfTkFNRVMsCisoWDUwOVYzX0VYVF9WMkkpdjJpX2lzc3Vlcl9hbHQsCitOVUxMLCBOVUxMLCBOVUxMfSwKKworeyBOSURfY2VydGlmaWNhdGVfaXNzdWVyLCAwLCBBU04xX0lURU1fcmVmKEdFTkVSQUxfTkFNRVMpLAorMCwwLDAsMCwKKzAsMCwKKyhYNTA5VjNfRVhUX0kyVilpMnZfR0VORVJBTF9OQU1FUywKK05VTEwsIE5VTEwsIE5VTEwsIE5VTEx9LAorfTsKKworU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmkydl9HRU5FUkFMX05BTUVTKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCUdFTkVSQUxfTkFNRVMgKmdlbnMsIFNUQUNLX09GKENPTkZfVkFMVUUpICpyZXQpCit7CisJaW50IGk7CisJR0VORVJBTF9OQU1FICpnZW47CisJZm9yKGkgPSAwOyBpIDwgc2tfR0VORVJBTF9OQU1FX251bShnZW5zKTsgaSsrKSB7CisJCWdlbiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShnZW5zLCBpKTsKKwkJcmV0ID0gaTJ2X0dFTkVSQUxfTkFNRShtZXRob2QsIGdlbiwgcmV0KTsKKwl9CisJaWYoIXJldCkgcmV0dXJuIHNrX0NPTkZfVkFMVUVfbmV3X251bGwoKTsKKwlyZXR1cm4gcmV0OworfQorCitTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0dFTkVSQUxfTkFNRShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCUdFTkVSQUxfTkFNRSAqZ2VuLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqcmV0KQoreworCXVuc2lnbmVkIGNoYXIgKnA7CisJY2hhciBvbGluZVsyNTZdLCBodG1wWzVdOworCWludCBpOworCXN3aXRjaCAoZ2VuLT50eXBlKQorCXsKKwkJY2FzZSBHRU5fT1RIRVJOQU1FOgorCQlYNTA5VjNfYWRkX3ZhbHVlKCJvdGhlcm5hbWUiLCI8dW5zdXBwb3J0ZWQ+IiwgJnJldCk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX1g0MDA6CisJCVg1MDlWM19hZGRfdmFsdWUoIlg0MDBOYW1lIiwiPHVuc3VwcG9ydGVkPiIsICZyZXQpOworCQlicmVhazsKKworCQljYXNlIEdFTl9FRElQQVJUWToKKwkJWDUwOVYzX2FkZF92YWx1ZSgiRWRpUGFydHlOYW1lIiwiPHVuc3VwcG9ydGVkPiIsICZyZXQpOworCQlicmVhazsKKworCQljYXNlIEdFTl9FTUFJTDoKKwkJWDUwOVYzX2FkZF92YWx1ZV91Y2hhcigiZW1haWwiLGdlbi0+ZC5pYTUtPmRhdGEsICZyZXQpOworCQlicmVhazsKKworCQljYXNlIEdFTl9ETlM6CisJCVg1MDlWM19hZGRfdmFsdWVfdWNoYXIoIkROUyIsZ2VuLT5kLmlhNS0+ZGF0YSwgJnJldCk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX1VSSToKKwkJWDUwOVYzX2FkZF92YWx1ZV91Y2hhcigiVVJJIixnZW4tPmQuaWE1LT5kYXRhLCAmcmV0KTsKKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fRElSTkFNRToKKwkJWDUwOV9OQU1FX29uZWxpbmUoZ2VuLT5kLmRpcm4sIG9saW5lLCAyNTYpOworCQlYNTA5VjNfYWRkX3ZhbHVlKCJEaXJOYW1lIixvbGluZSwgJnJldCk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0lQQUREOgorCQlwID0gZ2VuLT5kLmlwLT5kYXRhOworCQlpZihnZW4tPmQuaXAtPmxlbmd0aCA9PSA0KQorCQkJQklPX3NucHJpbnRmKG9saW5lLCBzaXplb2Ygb2xpbmUsCisJCQkJICAgICAiJWQuJWQuJWQuJWQiLCBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdKTsKKwkJZWxzZSBpZihnZW4tPmQuaXAtPmxlbmd0aCA9PSAxNikKKwkJCXsKKwkJCW9saW5lWzBdID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQkJeworCQkJCUJJT19zbnByaW50ZihodG1wLCBzaXplb2YgaHRtcCwKKwkJCQkJICAgICAiJVgiLCBwWzBdIDw8IDggfCBwWzFdKTsKKwkJCQlwICs9IDI7CisJCQkJc3RyY2F0KG9saW5lLCBodG1wKTsKKwkJCQlpZiAoaSAhPSA3KQorCQkJCQlzdHJjYXQob2xpbmUsICI6Iik7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQl7CisJCQlYNTA5VjNfYWRkX3ZhbHVlKCJJUCBBZGRyZXNzIiwiPGludmFsaWQ+IiwgJnJldCk7CisJCQlicmVhazsKKwkJCX0KKwkJWDUwOVYzX2FkZF92YWx1ZSgiSVAgQWRkcmVzcyIsb2xpbmUsICZyZXQpOworCQlicmVhazsKKworCQljYXNlIEdFTl9SSUQ6CisJCWkydF9BU04xX09CSkVDVChvbGluZSwgMjU2LCBnZW4tPmQucmlkKTsKKwkJWDUwOVYzX2FkZF92YWx1ZSgiUmVnaXN0ZXJlZCBJRCIsb2xpbmUsICZyZXQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IEdFTkVSQUxfTkFNRV9wcmludChCSU8gKm91dCwgR0VORVJBTF9OQU1FICpnZW4pCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaTsKKwlzd2l0Y2ggKGdlbi0+dHlwZSkKKwl7CisJCWNhc2UgR0VOX09USEVSTkFNRToKKwkJQklPX3ByaW50ZihvdXQsICJvdGhlcm5hbWU6PHVuc3VwcG9ydGVkPiIpOworCQlicmVhazsKKworCQljYXNlIEdFTl9YNDAwOgorCQlCSU9fcHJpbnRmKG91dCwgIlg0MDBOYW1lOjx1bnN1cHBvcnRlZD4iKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fRURJUEFSVFk6CisJCS8qIE1heWJlIGZpeCB0aGlzOiBpdCBpcyBzdXBwb3J0ZWQgbm93ICovCisJCUJJT19wcmludGYob3V0LCAiRWRpUGFydHlOYW1lOjx1bnN1cHBvcnRlZD4iKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fRU1BSUw6CisJCUJJT19wcmludGYob3V0LCAiZW1haWw6JXMiLGdlbi0+ZC5pYTUtPmRhdGEpOworCQlicmVhazsKKworCQljYXNlIEdFTl9ETlM6CisJCUJJT19wcmludGYob3V0LCAiRE5TOiVzIixnZW4tPmQuaWE1LT5kYXRhKTsKKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fVVJJOgorCQlCSU9fcHJpbnRmKG91dCwgIlVSSTolcyIsZ2VuLT5kLmlhNS0+ZGF0YSk7CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0RJUk5BTUU6CisJCUJJT19wcmludGYob3V0LCAiRGlyTmFtZTogIik7CisJCVg1MDlfTkFNRV9wcmludF9leChvdXQsIGdlbi0+ZC5kaXJuLCAwLCBYTl9GTEFHX09ORUxJTkUpOworCQlicmVhazsKKworCQljYXNlIEdFTl9JUEFERDoKKwkJcCA9IGdlbi0+ZC5pcC0+ZGF0YTsKKwkJaWYoZ2VuLT5kLmlwLT5sZW5ndGggPT0gNCkKKwkJCUJJT19wcmludGYob3V0LCAiSVAgQWRkcmVzczolZC4lZC4lZC4lZCIsCisJCQkJCQlwWzBdLCBwWzFdLCBwWzJdLCBwWzNdKTsKKwkJZWxzZSBpZihnZW4tPmQuaXAtPmxlbmd0aCA9PSAxNikKKwkJCXsKKwkJCUJJT19wcmludGYob3V0LCAiSVAgQWRkcmVzcyIpOworCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCQl7CisJCQkJQklPX3ByaW50ZihvdXQsICI6JVgiLCBwWzBdIDw8IDggfCBwWzFdKTsKKwkJCQlwICs9IDI7CisJCQkJfQorCQkJQklPX3B1dHMob3V0LCAiXG4iKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJQklPX3ByaW50ZihvdXQsIklQIEFkZHJlc3M6PGludmFsaWQ+Iik7CisJCQlicmVhazsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fUklEOgorCQlCSU9fcHJpbnRmKG91dCwgIlJlZ2lzdGVyZWQgSUQiKTsKKwkJaTJhX0FTTjFfT0JKRUNUKG91dCwgZ2VuLT5kLnJpZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIEdFTkVSQUxfTkFNRVMgKnYyaV9pc3N1ZXJfYWx0KFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpCit7CisJR0VORVJBTF9OQU1FUyAqZ2VucyA9IE5VTEw7CisJQ09ORl9WQUxVRSAqY25mOworCWludCBpOworCWlmKCEoZ2VucyA9IHNrX0dFTkVSQUxfTkFNRV9uZXdfbnVsbCgpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0lTU1VFUl9BTFQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykgeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQlpZighbmFtZV9jbXAoY25mLT5uYW1lLCAiaXNzdWVyIikgJiYgY25mLT52YWx1ZSAmJgorCQkJCQkJIXN0cmNtcChjbmYtPnZhbHVlLCAiY29weSIpKSB7CisJCQlpZighY29weV9pc3N1ZXIoY3R4LCBnZW5zKSkgZ290byBlcnI7CisJCX0gZWxzZSB7CisJCQlHRU5FUkFMX05BTUUgKmdlbjsKKwkJCWlmKCEoZ2VuID0gdjJpX0dFTkVSQUxfTkFNRShtZXRob2QsIGN0eCwgY25mKSkpCisJCQkJCQkJCSBnb3RvIGVycjsgCisJCQlza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pOworCQl9CisJfQorCXJldHVybiBnZW5zOworCWVycjoKKwlza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoZ2VucywgR0VORVJBTF9OQU1FX2ZyZWUpOworCXJldHVybiBOVUxMOworfQorCisvKiBBcHBlbmQgc3ViamVjdCBhbHRuYW1lIG9mIGlzc3VlciB0byBpc3N1ZXIgYWx0IG5hbWUgb2Ygc3ViamVjdCAqLworCitzdGF0aWMgaW50IGNvcHlfaXNzdWVyKFg1MDlWM19DVFggKmN0eCwgR0VORVJBTF9OQU1FUyAqZ2VucykKK3sKKwlHRU5FUkFMX05BTUVTICppYWx0OworCUdFTkVSQUxfTkFNRSAqZ2VuOworCVg1MDlfRVhURU5TSU9OICpleHQ7CisJaW50IGk7CisJaWYoY3R4ICYmIChjdHgtPmZsYWdzID09IENUWF9URVNUKSkgcmV0dXJuIDE7CisJaWYoIWN0eCB8fCAhY3R4LT5pc3N1ZXJfY2VydCkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfQ09QWV9JU1NVRVIsWDUwOVYzX1JfTk9fSVNTVUVSX0RFVEFJTFMpOworCQlnb3RvIGVycjsKKwl9CisgICAgICAgIGkgPSBYNTA5X2dldF9leHRfYnlfTklEKGN0eC0+aXNzdWVyX2NlcnQsIE5JRF9zdWJqZWN0X2FsdF9uYW1lLCAtMSk7CisJaWYoaSA8IDApIHJldHVybiAxOworICAgICAgICBpZighKGV4dCA9IFg1MDlfZ2V0X2V4dChjdHgtPmlzc3Vlcl9jZXJ0LCBpKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICEoaWFsdCA9IFg1MDlWM19FWFRfZDJpKGV4dCkpICkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfQ09QWV9JU1NVRVIsWDUwOVYzX1JfSVNTVUVSX0RFQ09ERV9FUlJPUik7CisJCWdvdG8gZXJyOworCX0KKworCWZvcihpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oaWFsdCk7IGkrKykgeworCQlnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUoaWFsdCwgaSk7CisJCWlmKCFza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pKSB7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfQ09QWV9JU1NVRVIsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisJc2tfR0VORVJBTF9OQU1FX2ZyZWUoaWFsdCk7CisKKwlyZXR1cm4gMTsKKwkJCisJZXJyOgorCXJldHVybiAwOworCQorfQorCitzdGF0aWMgR0VORVJBTF9OQU1FUyAqdjJpX3N1YmplY3RfYWx0KFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpCit7CisJR0VORVJBTF9OQU1FUyAqZ2VucyA9IE5VTEw7CisJQ09ORl9WQUxVRSAqY25mOworCWludCBpOworCWlmKCEoZ2VucyA9IHNrX0dFTkVSQUxfTkFNRV9uZXdfbnVsbCgpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX1NVQkpFQ1RfQUxULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZShudmFsLCBpKTsKKwkJaWYoIW5hbWVfY21wKGNuZi0+bmFtZSwgImVtYWlsIikgJiYgY25mLT52YWx1ZSAmJgorCQkJCQkJIXN0cmNtcChjbmYtPnZhbHVlLCAiY29weSIpKSB7CisJCQlpZighY29weV9lbWFpbChjdHgsIGdlbnMsIDApKSBnb3RvIGVycjsKKwkJfSBlbHNlIGlmKCFuYW1lX2NtcChjbmYtPm5hbWUsICJlbWFpbCIpICYmIGNuZi0+dmFsdWUgJiYKKwkJCQkJCSFzdHJjbXAoY25mLT52YWx1ZSwgIm1vdmUiKSkgeworCQkJaWYoIWNvcHlfZW1haWwoY3R4LCBnZW5zLCAxKSkgZ290byBlcnI7CisJCX0gZWxzZSB7CisJCQlHRU5FUkFMX05BTUUgKmdlbjsKKwkJCWlmKCEoZ2VuID0gdjJpX0dFTkVSQUxfTkFNRShtZXRob2QsIGN0eCwgY25mKSkpCisJCQkJCQkJCSBnb3RvIGVycjsgCisJCQlza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pOworCQl9CisJfQorCXJldHVybiBnZW5zOworCWVycjoKKwlza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoZ2VucywgR0VORVJBTF9OQU1FX2ZyZWUpOworCXJldHVybiBOVUxMOworfQorCisvKiBDb3B5IGFueSBlbWFpbCBhZGRyZXNzZXMgaW4gYSBjZXJ0aWZpY2F0ZSBvciByZXF1ZXN0IHRvIAorICogR0VORVJBTF9OQU1FUworICovCisKK3N0YXRpYyBpbnQgY29weV9lbWFpbChYNTA5VjNfQ1RYICpjdHgsIEdFTkVSQUxfTkFNRVMgKmdlbnMsIGludCBtb3ZlX3ApCit7CisJWDUwOV9OQU1FICpubTsKKwlBU04xX0lBNVNUUklORyAqZW1haWwgPSBOVUxMOworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJR0VORVJBTF9OQU1FICpnZW4gPSBOVUxMOworCWludCBpOworCWlmKGN0eCAhPSBOVUxMICYmIGN0eC0+ZmxhZ3MgPT0gQ1RYX1RFU1QpCisJCXJldHVybiAxOworCWlmKCFjdHggfHwgKCFjdHgtPnN1YmplY3RfY2VydCAmJiAhY3R4LT5zdWJqZWN0X3JlcSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX0NPUFlfRU1BSUwsWDUwOVYzX1JfTk9fU1VCSkVDVF9ERVRBSUxTKTsKKwkJZ290byBlcnI7CisJfQorCS8qIEZpbmQgdGhlIHN1YmplY3QgbmFtZSAqLworCWlmKGN0eC0+c3ViamVjdF9jZXJ0KSBubSA9IFg1MDlfZ2V0X3N1YmplY3RfbmFtZShjdHgtPnN1YmplY3RfY2VydCk7CisJZWxzZSBubSA9IFg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUoY3R4LT5zdWJqZWN0X3JlcSk7CisKKwkvKiBOb3cgYWRkIGFueSBlbWFpbCBhZGRyZXNzKGVzKSB0byBTVEFDSyAqLworCWkgPSAtMTsKKwl3aGlsZSgoaSA9IFg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKG5tLAorCQkJCQkgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywgaSkpID49IDApIHsKKwkJbmUgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5tLCBpKTsKKwkJZW1haWwgPSBNX0FTTjFfSUE1U1RSSU5HX2R1cChYNTA5X05BTUVfRU5UUllfZ2V0X2RhdGEobmUpKTsKKyAgICAgICAgICAgICAgICBpZiAobW92ZV9wKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgWDUwOV9OQU1FX2RlbGV0ZV9lbnRyeShubSwgaSk7CisJCQlYNTA5X05BTUVfRU5UUllfZnJlZShuZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCWlmKCFlbWFpbCB8fCAhKGdlbiA9IEdFTkVSQUxfTkFNRV9uZXcoKSkpIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9DT1BZX0VNQUlMLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWdlbi0+ZC5pYTUgPSBlbWFpbDsKKwkJZW1haWwgPSBOVUxMOworCQlnZW4tPnR5cGUgPSBHRU5fRU1BSUw7CisJCWlmKCFza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pKSB7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfQ09QWV9FTUFJTCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlnZW4gPSBOVUxMOworCX0KKworCQorCXJldHVybiAxOworCQkKKwllcnI6CisJR0VORVJBTF9OQU1FX2ZyZWUoZ2VuKTsKKwlNX0FTTjFfSUE1U1RSSU5HX2ZyZWUoZW1haWwpOworCXJldHVybiAwOworCQorfQorCitHRU5FUkFMX05BTUVTICp2MmlfR0VORVJBTF9OQU1FUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQoreworCUdFTkVSQUxfTkFNRSAqZ2VuOworCUdFTkVSQUxfTkFNRVMgKmdlbnMgPSBOVUxMOworCUNPTkZfVkFMVUUgKmNuZjsKKwlpbnQgaTsKKwlpZighKGdlbnMgPSBza19HRU5FUkFMX05BTUVfbmV3X251bGwoKSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9HRU5FUkFMX05BTUVTLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZShudmFsLCBpKTsKKwkJaWYoIShnZW4gPSB2MmlfR0VORVJBTF9OQU1FKG1ldGhvZCwgY3R4LCBjbmYpKSkgZ290byBlcnI7IAorCQlza19HRU5FUkFMX05BTUVfcHVzaChnZW5zLCBnZW4pOworCX0KKwlyZXR1cm4gZ2VuczsKKwllcnI6CisJc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKGdlbnMsIEdFTkVSQUxfTkFNRV9mcmVlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworR0VORVJBTF9OQU1FICp2MmlfR0VORVJBTF9OQU1FKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICAgICBDT05GX1ZBTFVFICpjbmYpCisJeworCXJldHVybiB2MmlfR0VORVJBTF9OQU1FX2V4KE5VTEwsIG1ldGhvZCwgY3R4LCBjbmYsIDApOworCX0KKworR0VORVJBTF9OQU1FICphMmlfR0VORVJBTF9OQU1FKEdFTkVSQUxfTkFNRSAqb3V0LAorCQkJICAgICAgIGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICAgICBpbnQgZ2VuX3R5cGUsIGNoYXIgKnZhbHVlLCBpbnQgaXNfbmMpCisJeworCWNoYXIgaXNfc3RyaW5nID0gMDsKKwlHRU5FUkFMX05BTUUgKmdlbiA9IE5VTEw7CisKKwlpZighdmFsdWUpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX0EySV9HRU5FUkFMX05BTUUsWDUwOVYzX1JfTUlTU0lOR19WQUxVRSk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwlpZiAob3V0KQorCQlnZW4gPSBvdXQ7CisJZWxzZQorCQl7CisJCWdlbiA9IEdFTkVSQUxfTkFNRV9uZXcoKTsKKwkJaWYoZ2VuID09IE5VTEwpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfQTJJX0dFTkVSQUxfTkFNRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJc3dpdGNoIChnZW5fdHlwZSkKKwkJeworCQljYXNlIEdFTl9VUkk6CisJCWNhc2UgR0VOX0VNQUlMOgorCQljYXNlIEdFTl9ETlM6CisJCWlzX3N0cmluZyA9IDE7CisJCWJyZWFrOworCQkKKwkJY2FzZSBHRU5fUklEOgorCQl7CisJCUFTTjFfT0JKRUNUICpvYmo7CisJCWlmKCEob2JqID0gT0JKX3R4dDJvYmoodmFsdWUsMCkpKQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX0EySV9HRU5FUkFMX05BTUUsWDUwOVYzX1JfQkFEX09CSkVDVCk7CisJCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInZhbHVlPSIsIHZhbHVlKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlnZW4tPmQucmlkID0gb2JqOworCQl9CisJCWJyZWFrOworCisJCWNhc2UgR0VOX0lQQUREOgorCQlpZiAoaXNfbmMpCisJCQlnZW4tPmQuaXAgPSBhMmlfSVBBRERSRVNTX05DKHZhbHVlKTsKKwkJZWxzZQorCQkJZ2VuLT5kLmlwID0gYTJpX0lQQUREUkVTUyh2YWx1ZSk7CisJCWlmKGdlbi0+ZC5pcCA9PSBOVUxMKQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX0EySV9HRU5FUkFMX05BTUUsWDUwOVYzX1JfQkFEX0lQX0FERFJFU1MpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ2YWx1ZT0iLCB2YWx1ZSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJYnJlYWs7CisKKwkJY2FzZSBHRU5fRElSTkFNRToKKwkJaWYgKCFkb19kaXJuYW1lKGdlbiwgdmFsdWUsIGN0eCkpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfQTJJX0dFTkVSQUxfTkFNRSxYNTA5VjNfUl9ESVJOQU1FX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlicmVhazsKKworCQljYXNlIEdFTl9PVEhFUk5BTUU6CisJCWlmICghZG9fb3RoZXJuYW1lKGdlbiwgdmFsdWUsIGN0eCkpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfQTJJX0dFTkVSQUxfTkFNRSxYNTA5VjNfUl9PVEhFUk5BTUVfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQlYNTA5VjNlcnIoWDUwOVYzX0ZfQTJJX0dFTkVSQUxfTkFNRSxYNTA5VjNfUl9VTlNVUFBPUlRFRF9UWVBFKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmKGlzX3N0cmluZykKKwkJeworCQlpZighKGdlbi0+ZC5pYTUgPSBNX0FTTjFfSUE1U1RSSU5HX25ldygpKSB8fAorCQkJICAgICAgIUFTTjFfU1RSSU5HX3NldChnZW4tPmQuaWE1LCAodW5zaWduZWQgY2hhciopdmFsdWUsCisJCQkJCSAgICAgICBzdHJsZW4odmFsdWUpKSkKKwkJCXsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9BMklfR0VORVJBTF9OQU1FLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwlnZW4tPnR5cGUgPSBnZW5fdHlwZTsKKworCXJldHVybiBnZW47CisKKwllcnI6CisJaWYgKCFvdXQpCisJCUdFTkVSQUxfTkFNRV9mcmVlKGdlbik7CisJcmV0dXJuIE5VTEw7CisJfQorCitHRU5FUkFMX05BTUUgKnYyaV9HRU5FUkFMX05BTUVfZXgoR0VORVJBTF9OQU1FICpvdXQsCisJCQkJICBjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSAgWDUwOVYzX0NUWCAqY3R4LCBDT05GX1ZBTFVFICpjbmYsIGludCBpc19uYykKKwl7CisJaW50IHR5cGU7CisKKwljaGFyICpuYW1lLCAqdmFsdWU7CisKKwluYW1lID0gY25mLT5uYW1lOworCXZhbHVlID0gY25mLT52YWx1ZTsKKworCWlmKCF2YWx1ZSkKKwkJeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0dFTkVSQUxfTkFNRV9FWCxYNTA5VjNfUl9NSVNTSU5HX1ZBTFVFKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCWlmKCFuYW1lX2NtcChuYW1lLCAiZW1haWwiKSkKKwkJdHlwZSA9IEdFTl9FTUFJTDsKKwllbHNlIGlmKCFuYW1lX2NtcChuYW1lLCAiVVJJIikpCisJCXR5cGUgPSBHRU5fVVJJOworCWVsc2UgaWYoIW5hbWVfY21wKG5hbWUsICJETlMiKSkKKwkJdHlwZSA9IEdFTl9ETlM7CisJZWxzZSBpZighbmFtZV9jbXAobmFtZSwgIlJJRCIpKQorCQl0eXBlID0gR0VOX1JJRDsKKwllbHNlIGlmKCFuYW1lX2NtcChuYW1lLCAiSVAiKSkKKwkJdHlwZSA9IEdFTl9JUEFERDsKKwllbHNlIGlmKCFuYW1lX2NtcChuYW1lLCAiZGlyTmFtZSIpKQorCQl0eXBlID0gR0VOX0RJUk5BTUU7CisJZWxzZSBpZighbmFtZV9jbXAobmFtZSwgIm90aGVyTmFtZSIpKQorCQl0eXBlID0gR0VOX09USEVSTkFNRTsKKwllbHNlCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9HRU5FUkFMX05BTUVfRVgsWDUwOVYzX1JfVU5TVVBQT1JURURfT1BUSU9OKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJuYW1lPSIsIG5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJcmV0dXJuIGEyaV9HRU5FUkFMX05BTUUob3V0LCBtZXRob2QsIGN0eCwgdHlwZSwgdmFsdWUsIGlzX25jKTsKKworCX0KKworc3RhdGljIGludCBkb19vdGhlcm5hbWUoR0VORVJBTF9OQU1FICpnZW4sIGNoYXIgKnZhbHVlLCBYNTA5VjNfQ1RYICpjdHgpCisJeworCWNoYXIgKm9ianRtcCA9IE5VTEwsICpwOworCWludCBvYmpsZW47CisJaWYgKCEocCA9IHN0cmNocih2YWx1ZSwgJzsnKSkpCisJCXJldHVybiAwOworCWlmICghKGdlbi0+ZC5vdGhlck5hbWUgPSBPVEhFUk5BTUVfbmV3KCkpKQorCQlyZXR1cm4gMDsKKwkvKiBGcmVlIHRoaXMgdXAgYmVjYXVzZSB3ZSB3aWxsIG92ZXJ3cml0ZSBpdC4KKwkgKiBubyBuZWVkIHRvIGZyZWUgdHlwZV9pZCBiZWNhdXNlIGl0IGlzIHN0YXRpYworCSAqLworCUFTTjFfVFlQRV9mcmVlKGdlbi0+ZC5vdGhlck5hbWUtPnZhbHVlKTsKKwlpZiAoIShnZW4tPmQub3RoZXJOYW1lLT52YWx1ZSA9IEFTTjFfZ2VuZXJhdGVfdjMocCArIDEsIGN0eCkpKQorCQlyZXR1cm4gMDsKKwlvYmpsZW4gPSBwIC0gdmFsdWU7CisJb2JqdG1wID0gT1BFTlNTTF9tYWxsb2Mob2JqbGVuICsgMSk7CisJc3RybmNweShvYmp0bXAsIHZhbHVlLCBvYmpsZW4pOworCW9ianRtcFtvYmpsZW5dID0gMDsKKwlnZW4tPmQub3RoZXJOYW1lLT50eXBlX2lkID0gT0JKX3R4dDJvYmoob2JqdG1wLCAwKTsKKwlPUEVOU1NMX2ZyZWUob2JqdG1wKTsJCisJaWYgKCFnZW4tPmQub3RoZXJOYW1lLT50eXBlX2lkKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgZG9fZGlybmFtZShHRU5FUkFMX05BTUUgKmdlbiwgY2hhciAqdmFsdWUsIFg1MDlWM19DVFggKmN0eCkKKwl7CisJaW50IHJldDsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqc2s7CisJWDUwOV9OQU1FICpubTsKKwlpZiAoIShubSA9IFg1MDlfTkFNRV9uZXcoKSkpCisJCXJldHVybiAwOworCXNrID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgdmFsdWUpOworCWlmICghc2spCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX0RPX0RJUk5BTUUsWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoMiwgInNlY3Rpb249IiwgdmFsdWUpOworCQlYNTA5X05BTUVfZnJlZShubSk7CisJCXJldHVybiAwOworCQl9CisJLyogRklYTUU6IHNob3VsZCBhbGxvdyBvdGhlciBjaGFyYWN0ZXIgdHlwZXMuLi4gKi8KKwlyZXQgPSBYNTA5VjNfTkFNRV9mcm9tX3NlY3Rpb24obm0sIHNrLCBNQlNUUklOR19BU0MpOworCWlmICghcmV0KQorCQlYNTA5X05BTUVfZnJlZShubSk7CisJZ2VuLT5kLmRpcm4gPSBubTsKKwlYNTA5VjNfc2VjdGlvbl9mcmVlKGN0eCwgc2spOworCQkKKwlyZXR1cm4gcmV0OworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYXNpZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19hc2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3MDJmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYXNpZC5jCkBAIC0wLDAgKzEsODQ0IEBACisvKgorICogQ29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgUHJvamVjdCBieSB0aGUgQW1lcmljYW4gUmVnaXN0cnkgZm9yCisgKiBJbnRlcm5ldCBOdW1iZXJzICgiQVJJTiIpLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKi8KKworLyoKKyAqIEltcGxlbWVudGF0aW9uIG9mIFJGQyAzNzc5IHNlY3Rpb24gMy4yLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkZDMzc3OQorCisvKgorICogT3BlblNTTCBBU04uMSB0ZW1wbGF0ZSB0cmFuc2xhdGlvbiBvZiBSRkMgMzc3OSAzLjIuMy4KKyAqLworCitBU04xX1NFUVVFTkNFKEFTUmFuZ2UpID0geworICBBU04xX1NJTVBMRShBU1JhbmdlLCBtaW4sIEFTTjFfSU5URUdFUiksCisgIEFTTjFfU0lNUExFKEFTUmFuZ2UsIG1heCwgQVNOMV9JTlRFR0VSKQorfSBBU04xX1NFUVVFTkNFX0VORChBU1JhbmdlKQorCitBU04xX0NIT0lDRShBU0lkT3JSYW5nZSkgPSB7CisgIEFTTjFfU0lNUExFKEFTSWRPclJhbmdlLCB1LmlkLCAgICBBU04xX0lOVEVHRVIpLAorICBBU04xX1NJTVBMRShBU0lkT3JSYW5nZSwgdS5yYW5nZSwgQVNSYW5nZSkKK30gQVNOMV9DSE9JQ0VfRU5EKEFTSWRPclJhbmdlKQorCitBU04xX0NIT0lDRShBU0lkZW50aWZpZXJDaG9pY2UpID0geworICBBU04xX1NJTVBMRShBU0lkZW50aWZpZXJDaG9pY2UsICAgICAgdS5pbmhlcml0LCAgICAgICBBU04xX05VTEwpLAorICBBU04xX1NFUVVFTkNFX09GKEFTSWRlbnRpZmllckNob2ljZSwgdS5hc0lkc09yUmFuZ2VzLCBBU0lkT3JSYW5nZSkKK30gQVNOMV9DSE9JQ0VfRU5EKEFTSWRlbnRpZmllckNob2ljZSkKKworQVNOMV9TRVFVRU5DRShBU0lkZW50aWZpZXJzKSA9IHsKKyAgQVNOMV9FWFBfT1BUKEFTSWRlbnRpZmllcnMsIGFzbnVtLCBBU0lkZW50aWZpZXJDaG9pY2UsIDApLAorICBBU04xX0VYUF9PUFQoQVNJZGVudGlmaWVycywgcmRpLCAgIEFTSWRlbnRpZmllckNob2ljZSwgMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoQVNJZGVudGlmaWVycykKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTUmFuZ2UpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNJZE9yUmFuZ2UpCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQVNJZGVudGlmaWVyQ2hvaWNlKQorSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEFTSWRlbnRpZmllcnMpCisKKy8qCisgKiBpMnIgbWV0aG9kIGZvciBhbiBBU0lkZW50aWZpZXJDaG9pY2UuCisgKi8KK3N0YXRpYyBpbnQgaTJyX0FTSWRlbnRpZmllckNob2ljZShCSU8gKm91dCwKKwkJCQkgIEFTSWRlbnRpZmllckNob2ljZSAqY2hvaWNlLAorCQkJCSAgaW50IGluZGVudCwKKwkJCQkgIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgaW50IGk7CisgIGNoYXIgKnM7CisgIGlmIChjaG9pY2UgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKyAgQklPX3ByaW50ZihvdXQsICIlKnMlczpcbiIsIGluZGVudCwgIiIsIG1zZyk7CisgIHN3aXRjaCAoY2hvaWNlLT50eXBlKSB7CisgIGNhc2UgQVNJZGVudGlmaWVyQ2hvaWNlX2luaGVyaXQ6CisgICAgQklPX3ByaW50ZihvdXQsICIlKnNpbmhlcml0XG4iLCBpbmRlbnQgKyAyLCAiIik7CisgICAgYnJlYWs7CisgIGNhc2UgQVNJZGVudGlmaWVyQ2hvaWNlX2FzSWRzT3JSYW5nZXM6CisgICAgZm9yIChpID0gMDsgaSA8IHNrX0FTSWRPclJhbmdlX251bShjaG9pY2UtPnUuYXNJZHNPclJhbmdlcyk7IGkrKykgeworICAgICAgQVNJZE9yUmFuZ2UgKmFvciA9IHNrX0FTSWRPclJhbmdlX3ZhbHVlKGNob2ljZS0+dS5hc0lkc09yUmFuZ2VzLCBpKTsKKyAgICAgIHN3aXRjaCAoYW9yLT50eXBlKSB7CisgICAgICBjYXNlIEFTSWRPclJhbmdlX2lkOgorCWlmICgocyA9IGkyc19BU04xX0lOVEVHRVIoTlVMTCwgYW9yLT51LmlkKSkgPT0gTlVMTCkKKwkgIHJldHVybiAwOworCUJJT19wcmludGYob3V0LCAiJSpzJXNcbiIsIGluZGVudCArIDIsICIiLCBzKTsKKwlPUEVOU1NMX2ZyZWUocyk7CisJYnJlYWs7CisgICAgICBjYXNlIEFTSWRPclJhbmdlX3JhbmdlOgorCWlmICgocyA9IGkyc19BU04xX0lOVEVHRVIoTlVMTCwgYW9yLT51LnJhbmdlLT5taW4pKSA9PSBOVUxMKQorCSAgcmV0dXJuIDA7CisJQklPX3ByaW50ZihvdXQsICIlKnMlcy0iLCBpbmRlbnQgKyAyLCAiIiwgcyk7CisJT1BFTlNTTF9mcmVlKHMpOworCWlmICgocyA9IGkyc19BU04xX0lOVEVHRVIoTlVMTCwgYW9yLT51LnJhbmdlLT5tYXgpKSA9PSBOVUxMKQorCSAgcmV0dXJuIDA7CisJQklPX3ByaW50ZihvdXQsICIlc1xuIiwgcyk7CisJT1BFTlNTTF9mcmVlKHMpOworCWJyZWFrOworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiBpMnIgbWV0aG9kIGZvciBhbiBBU0lkZW50aWZpZXIgZXh0ZW5zaW9uLgorICovCitzdGF0aWMgaW50IGkycl9BU0lkZW50aWZpZXJzKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkgICAgIHZvaWQgKmV4dCwKKwkJCSAgICAgQklPICpvdXQsCisJCQkgICAgIGludCBpbmRlbnQpCit7CisgIEFTSWRlbnRpZmllcnMgKmFzaWQgPSBleHQ7CisgIHJldHVybiAoaTJyX0FTSWRlbnRpZmllckNob2ljZShvdXQsIGFzaWQtPmFzbnVtLCBpbmRlbnQsCisJCQkJICJBdXRvbm9tb3VzIFN5c3RlbSBOdW1iZXJzIikgJiYKKwkgIGkycl9BU0lkZW50aWZpZXJDaG9pY2Uob3V0LCBhc2lkLT5yZGksIGluZGVudCwKKwkJCQkgIlJvdXRpbmcgRG9tYWluIElkZW50aWZpZXJzIikpOworfQorCisvKgorICogU29ydCBjb21wYXJpc2lvbiBmdW5jdGlvbiBmb3IgYSBzZXF1ZW5jZSBvZiBBU0lkT3JSYW5nZSBlbGVtZW50cy4KKyAqLworc3RhdGljIGludCBBU0lkT3JSYW5nZV9jbXAoY29uc3QgQVNJZE9yUmFuZ2UgKiBjb25zdCAqYV8sCisJCQkgICBjb25zdCBBU0lkT3JSYW5nZSAqIGNvbnN0ICpiXykKK3sKKyAgY29uc3QgQVNJZE9yUmFuZ2UgKmEgPSAqYV8sICpiID0gKmJfOworCisgIGFzc2VydCgoYS0+dHlwZSA9PSBBU0lkT3JSYW5nZV9pZCAmJiBhLT51LmlkICE9IE5VTEwpIHx8CisJIChhLT50eXBlID09IEFTSWRPclJhbmdlX3JhbmdlICYmIGEtPnUucmFuZ2UgIT0gTlVMTCAmJgorCSAgYS0+dS5yYW5nZS0+bWluICE9IE5VTEwgJiYgYS0+dS5yYW5nZS0+bWF4ICE9IE5VTEwpKTsKKworICBhc3NlcnQoKGItPnR5cGUgPT0gQVNJZE9yUmFuZ2VfaWQgJiYgYi0+dS5pZCAhPSBOVUxMKSB8fAorCSAoYi0+dHlwZSA9PSBBU0lkT3JSYW5nZV9yYW5nZSAmJiBiLT51LnJhbmdlICE9IE5VTEwgJiYKKwkgIGItPnUucmFuZ2UtPm1pbiAhPSBOVUxMICYmIGItPnUucmFuZ2UtPm1heCAhPSBOVUxMKSk7CisKKyAgaWYgKGEtPnR5cGUgPT0gQVNJZE9yUmFuZ2VfaWQgJiYgYi0+dHlwZSA9PSBBU0lkT3JSYW5nZV9pZCkKKyAgICByZXR1cm4gQVNOMV9JTlRFR0VSX2NtcChhLT51LmlkLCBiLT51LmlkKTsKKworICBpZiAoYS0+dHlwZSA9PSBBU0lkT3JSYW5nZV9yYW5nZSAmJiBiLT50eXBlID09IEFTSWRPclJhbmdlX3JhbmdlKSB7CisgICAgaW50IHIgPSBBU04xX0lOVEVHRVJfY21wKGEtPnUucmFuZ2UtPm1pbiwgYi0+dS5yYW5nZS0+bWluKTsKKyAgICByZXR1cm4gciAhPSAwID8gciA6IEFTTjFfSU5URUdFUl9jbXAoYS0+dS5yYW5nZS0+bWF4LCBiLT51LnJhbmdlLT5tYXgpOworICB9CisKKyAgaWYgKGEtPnR5cGUgPT0gQVNJZE9yUmFuZ2VfaWQpCisgICAgcmV0dXJuIEFTTjFfSU5URUdFUl9jbXAoYS0+dS5pZCwgYi0+dS5yYW5nZS0+bWluKTsKKyAgZWxzZQorICAgIHJldHVybiBBU04xX0lOVEVHRVJfY21wKGEtPnUucmFuZ2UtPm1pbiwgYi0+dS5pZCk7Cit9CisKKy8qCisgKiBBZGQgYW4gaW5oZXJpdCBlbGVtZW50LgorICovCitpbnQgdjNfYXNpZF9hZGRfaW5oZXJpdChBU0lkZW50aWZpZXJzICphc2lkLCBpbnQgd2hpY2gpCit7CisgIEFTSWRlbnRpZmllckNob2ljZSAqKmNob2ljZTsKKyAgaWYgKGFzaWQgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgc3dpdGNoICh3aGljaCkgeworICBjYXNlIFYzX0FTSURfQVNOVU06CisgICAgY2hvaWNlID0gJmFzaWQtPmFzbnVtOworICAgIGJyZWFrOworICBjYXNlIFYzX0FTSURfUkRJOgorICAgIGNob2ljZSA9ICZhc2lkLT5yZGk7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCpjaG9pY2UgPT0gTlVMTCkgeworICAgIGlmICgoKmNob2ljZSA9IEFTSWRlbnRpZmllckNob2ljZV9uZXcoKSkgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworICAgIGFzc2VydCgoKmNob2ljZSktPnUuaW5oZXJpdCA9PSBOVUxMKTsKKyAgICBpZiAoKCgqY2hvaWNlKS0+dS5pbmhlcml0ID0gQVNOMV9OVUxMX25ldygpKSA9PSBOVUxMKQorICAgICAgcmV0dXJuIDA7CisgICAgKCpjaG9pY2UpLT50eXBlID0gQVNJZGVudGlmaWVyQ2hvaWNlX2luaGVyaXQ7CisgIH0KKyAgcmV0dXJuICgqY2hvaWNlKS0+dHlwZSA9PSBBU0lkZW50aWZpZXJDaG9pY2VfaW5oZXJpdDsKK30KKworLyoKKyAqIEFkZCBhbiBJRCBvciByYW5nZSB0byBhbiBBU0lkZW50aWZpZXJDaG9pY2UuCisgKi8KK2ludCB2M19hc2lkX2FkZF9pZF9vcl9yYW5nZShBU0lkZW50aWZpZXJzICphc2lkLAorCQkJICAgIGludCB3aGljaCwKKwkJCSAgICBBU04xX0lOVEVHRVIgKm1pbiwKKwkJCSAgICBBU04xX0lOVEVHRVIgKm1heCkKK3sKKyAgQVNJZGVudGlmaWVyQ2hvaWNlICoqY2hvaWNlOworICBBU0lkT3JSYW5nZSAqYW9yOworICBpZiAoYXNpZCA9PSBOVUxMKQorICAgIHJldHVybiAwOworICBzd2l0Y2ggKHdoaWNoKSB7CisgIGNhc2UgVjNfQVNJRF9BU05VTToKKyAgICBjaG9pY2UgPSAmYXNpZC0+YXNudW07CisgICAgYnJlYWs7CisgIGNhc2UgVjNfQVNJRF9SREk6CisgICAgY2hvaWNlID0gJmFzaWQtPnJkaTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoKmNob2ljZSAhPSBOVUxMICYmICgqY2hvaWNlKS0+dHlwZSA9PSBBU0lkZW50aWZpZXJDaG9pY2VfaW5oZXJpdCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCpjaG9pY2UgPT0gTlVMTCkgeworICAgIGlmICgoKmNob2ljZSA9IEFTSWRlbnRpZmllckNob2ljZV9uZXcoKSkgPT0gTlVMTCkKKyAgICAgIHJldHVybiAwOworICAgIGFzc2VydCgoKmNob2ljZSktPnUuYXNJZHNPclJhbmdlcyA9PSBOVUxMKTsKKyAgICAoKmNob2ljZSktPnUuYXNJZHNPclJhbmdlcyA9IHNrX0FTSWRPclJhbmdlX25ldyhBU0lkT3JSYW5nZV9jbXApOworICAgIGlmICgoKmNob2ljZSktPnUuYXNJZHNPclJhbmdlcyA9PSBOVUxMKQorICAgICAgcmV0dXJuIDA7CisgICAgKCpjaG9pY2UpLT50eXBlID0gQVNJZGVudGlmaWVyQ2hvaWNlX2FzSWRzT3JSYW5nZXM7CisgIH0KKyAgaWYgKChhb3IgPSBBU0lkT3JSYW5nZV9uZXcoKSkgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKG1heCA9PSBOVUxMKSB7CisgICAgYW9yLT50eXBlID0gQVNJZE9yUmFuZ2VfaWQ7CisgICAgYW9yLT51LmlkID0gbWluOworICB9IGVsc2UgeworICAgIGFvci0+dHlwZSA9IEFTSWRPclJhbmdlX3JhbmdlOworICAgIGlmICgoYW9yLT51LnJhbmdlID0gQVNSYW5nZV9uZXcoKSkgPT0gTlVMTCkKKyAgICAgIGdvdG8gZXJyOworICAgIEFTTjFfSU5URUdFUl9mcmVlKGFvci0+dS5yYW5nZS0+bWluKTsKKyAgICBhb3ItPnUucmFuZ2UtPm1pbiA9IG1pbjsKKyAgICBBU04xX0lOVEVHRVJfZnJlZShhb3ItPnUucmFuZ2UtPm1heCk7CisgICAgYW9yLT51LnJhbmdlLT5tYXggPSBtYXg7CisgIH0KKyAgaWYgKCEoc2tfQVNJZE9yUmFuZ2VfcHVzaCgoKmNob2ljZSktPnUuYXNJZHNPclJhbmdlcywgYW9yKSkpCisgICAgZ290byBlcnI7CisgIHJldHVybiAxOworCisgZXJyOgorICBBU0lkT3JSYW5nZV9mcmVlKGFvcik7CisgIHJldHVybiAwOworfQorCisvKgorICogRXh0cmFjdCBtaW4gYW5kIG1heCB2YWx1ZXMgZnJvbSBhbiBBU0lkT3JSYW5nZS4KKyAqLworc3RhdGljIHZvaWQgZXh0cmFjdF9taW5fbWF4KEFTSWRPclJhbmdlICphb3IsCisJCQkgICAgQVNOMV9JTlRFR0VSICoqbWluLAorCQkJICAgIEFTTjFfSU5URUdFUiAqKm1heCkKK3sKKyAgYXNzZXJ0KGFvciAhPSBOVUxMICYmIG1pbiAhPSBOVUxMICYmIG1heCAhPSBOVUxMKTsKKyAgc3dpdGNoIChhb3ItPnR5cGUpIHsKKyAgY2FzZSBBU0lkT3JSYW5nZV9pZDoKKyAgICAqbWluID0gYW9yLT51LmlkOworICAgICptYXggPSBhb3ItPnUuaWQ7CisgICAgcmV0dXJuOworICBjYXNlIEFTSWRPclJhbmdlX3JhbmdlOgorICAgICptaW4gPSBhb3ItPnUucmFuZ2UtPm1pbjsKKyAgICAqbWF4ID0gYW9yLT51LnJhbmdlLT5tYXg7CisgICAgcmV0dXJuOworICB9Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIGFuIEFTSWRlbnRpZmllckNob2ljZSBpcyBpbiBjYW5vbmljYWwgZm9ybS4KKyAqLworc3RhdGljIGludCBBU0lkZW50aWZpZXJDaG9pY2VfaXNfY2Fub25pY2FsKEFTSWRlbnRpZmllckNob2ljZSAqY2hvaWNlKQoreworICBBU04xX0lOVEVHRVIgKmFfbWF4X3BsdXNfb25lID0gTlVMTDsKKyAgQklHTlVNICpibiA9IE5VTEw7CisgIGludCBpLCByZXQgPSAwOworCisgIC8qCisgICAqIEVtcHR5IGVsZW1lbnQgb3IgaW5oZXJpdGFuY2UgaXMgY2Fub25pY2FsLgorICAgKi8KKyAgaWYgKGNob2ljZSA9PSBOVUxMIHx8IGNob2ljZS0+dHlwZSA9PSBBU0lkZW50aWZpZXJDaG9pY2VfaW5oZXJpdCkKKyAgICByZXR1cm4gMTsKKworICAvKgorICAgKiBJZiBub3QgYSBsaXN0LCBvciBpZiBlbXB0eSBsaXN0LCBpdCdzIGJyb2tlbi4KKyAgICovCisgIGlmIChjaG9pY2UtPnR5cGUgIT0gQVNJZGVudGlmaWVyQ2hvaWNlX2FzSWRzT3JSYW5nZXMgfHwKKyAgICAgIHNrX0FTSWRPclJhbmdlX251bShjaG9pY2UtPnUuYXNJZHNPclJhbmdlcykgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICAvKgorICAgKiBJdCdzIGEgbGlzdCwgY2hlY2sgaXQuCisgICAqLworICBmb3IgKGkgPSAwOyBpIDwgc2tfQVNJZE9yUmFuZ2VfbnVtKGNob2ljZS0+dS5hc0lkc09yUmFuZ2VzKSAtIDE7IGkrKykgeworICAgIEFTSWRPclJhbmdlICphID0gc2tfQVNJZE9yUmFuZ2VfdmFsdWUoY2hvaWNlLT51LmFzSWRzT3JSYW5nZXMsIGkpOworICAgIEFTSWRPclJhbmdlICpiID0gc2tfQVNJZE9yUmFuZ2VfdmFsdWUoY2hvaWNlLT51LmFzSWRzT3JSYW5nZXMsIGkgKyAxKTsKKyAgICBBU04xX0lOVEVHRVIgKmFfbWluLCAqYV9tYXgsICpiX21pbiwgKmJfbWF4OworCisgICAgZXh0cmFjdF9taW5fbWF4KGEsICZhX21pbiwgJmFfbWF4KTsKKyAgICBleHRyYWN0X21pbl9tYXgoYiwgJmJfbWluLCAmYl9tYXgpOworCisgICAgLyoKKyAgICAgKiBQdW50IG1pc29yZGVyZWQgbGlzdCwgb3ZlcmxhcHBpbmcgc3RhcnQsIG9yIGludmVydGVkIHJhbmdlLgorICAgICAqLworICAgIGlmIChBU04xX0lOVEVHRVJfY21wKGFfbWluLCBiX21pbikgPj0gMCB8fAorCUFTTjFfSU5URUdFUl9jbXAoYV9taW4sIGFfbWF4KSA+IDAgfHwKKwlBU04xX0lOVEVHRVJfY21wKGJfbWluLCBiX21heCkgPiAwKQorICAgICAgZ290byBkb25lOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgYV9tYXggKyAxIHRvIGNoZWNrIGZvciBhZGphY2VuY3kuCisgICAgICovCisgICAgaWYgKChibiA9PSBOVUxMICYmIChibiA9IEJOX25ldygpKSA9PSBOVUxMKSB8fAorCUFTTjFfSU5URUdFUl90b19CTihhX21heCwgYm4pID09IE5VTEwgfHwKKwkhQk5fYWRkX3dvcmQoYm4sIDEpIHx8CisJKGFfbWF4X3BsdXNfb25lID0gQk5fdG9fQVNOMV9JTlRFR0VSKGJuLCBhX21heF9wbHVzX29uZSkpID09IE5VTEwpIHsKKyAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9BU0lERU5USUZJRVJDSE9JQ0VfSVNfQ0FOT05JQ0FMLAorCQlFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogUHVudCBpZiBhZGphY2VudCBvciBvdmVybGFwcGluZy4KKyAgICAgKi8KKyAgICBpZiAoQVNOMV9JTlRFR0VSX2NtcChhX21heF9wbHVzX29uZSwgYl9taW4pID49IDApCisgICAgICBnb3RvIGRvbmU7CisgIH0KKworICByZXQgPSAxOworCisgZG9uZToKKyAgQVNOMV9JTlRFR0VSX2ZyZWUoYV9tYXhfcGx1c19vbmUpOworICBCTl9mcmVlKGJuKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENoZWNrIHdoZXRoZXIgYW4gQVNJZGVudGlmaWVyIGV4dGVuc2lvbiBpcyBpbiBjYW5vbmljYWwgZm9ybS4KKyAqLworaW50IHYzX2FzaWRfaXNfY2Fub25pY2FsKEFTSWRlbnRpZmllcnMgKmFzaWQpCit7CisgIHJldHVybiAoYXNpZCA9PSBOVUxMIHx8CisJICAoQVNJZGVudGlmaWVyQ2hvaWNlX2lzX2Nhbm9uaWNhbChhc2lkLT5hc251bSkgfHwKKwkgICBBU0lkZW50aWZpZXJDaG9pY2VfaXNfY2Fub25pY2FsKGFzaWQtPnJkaSkpKTsKK30KKworLyoKKyAqIFdoYWNrIGFuIEFTSWRlbnRpZmllckNob2ljZSBpbnRvIGNhbm9uaWNhbCBmb3JtLgorICovCitzdGF0aWMgaW50IEFTSWRlbnRpZmllckNob2ljZV9jYW5vbml6ZShBU0lkZW50aWZpZXJDaG9pY2UgKmNob2ljZSkKK3sKKyAgQVNOMV9JTlRFR0VSICphX21heF9wbHVzX29uZSA9IE5VTEw7CisgIEJJR05VTSAqYm4gPSBOVUxMOworICBpbnQgaSwgcmV0ID0gMDsKKworICAvKgorICAgKiBOb3RoaW5nIHRvIGRvIGZvciBlbXB0eSBlbGVtZW50IG9yIGluaGVyaXRhbmNlLgorICAgKi8KKyAgaWYgKGNob2ljZSA9PSBOVUxMIHx8IGNob2ljZS0+dHlwZSA9PSBBU0lkZW50aWZpZXJDaG9pY2VfaW5oZXJpdCkKKyAgICByZXR1cm4gMTsKKworICAvKgorICAgKiBXZSBoYXZlIGEgbGlzdC4gIFNvcnQgaXQuCisgICAqLworICBhc3NlcnQoY2hvaWNlLT50eXBlID09IEFTSWRlbnRpZmllckNob2ljZV9hc0lkc09yUmFuZ2VzKTsKKyAgc2tfQVNJZE9yUmFuZ2Vfc29ydChjaG9pY2UtPnUuYXNJZHNPclJhbmdlcyk7CisKKyAgLyoKKyAgICogTm93IGNoZWNrIGZvciBlcnJvcnMgYW5kIHN1Ym9wdGltYWwgZW5jb2RpbmcsIHJlamVjdGluZyB0aGUKKyAgICogZm9ybWVyIGFuZCBmaXhpbmcgdGhlIGxhdHRlci4KKyAgICovCisgIGZvciAoaSA9IDA7IGkgPCBza19BU0lkT3JSYW5nZV9udW0oY2hvaWNlLT51LmFzSWRzT3JSYW5nZXMpIC0gMTsgaSsrKSB7CisgICAgQVNJZE9yUmFuZ2UgKmEgPSBza19BU0lkT3JSYW5nZV92YWx1ZShjaG9pY2UtPnUuYXNJZHNPclJhbmdlcywgaSk7CisgICAgQVNJZE9yUmFuZ2UgKmIgPSBza19BU0lkT3JSYW5nZV92YWx1ZShjaG9pY2UtPnUuYXNJZHNPclJhbmdlcywgaSArIDEpOworICAgIEFTTjFfSU5URUdFUiAqYV9taW4sICphX21heCwgKmJfbWluLCAqYl9tYXg7CisKKyAgICBleHRyYWN0X21pbl9tYXgoYSwgJmFfbWluLCAmYV9tYXgpOworICAgIGV4dHJhY3RfbWluX21heChiLCAmYl9taW4sICZiX21heCk7CisKKyAgICAvKgorICAgICAqIE1ha2Ugc3VyZSB3ZSdyZSBwcm9wZXJseSBzb3J0ZWQgKHBhcmFub2lhKS4KKyAgICAgKi8KKyAgICBhc3NlcnQoQVNOMV9JTlRFR0VSX2NtcChhX21pbiwgYl9taW4pIDw9IDApOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3Igb3ZlcmxhcHMuCisgICAgICovCisgICAgaWYgKEFTTjFfSU5URUdFUl9jbXAoYV9tYXgsIGJfbWluKSA+PSAwKSB7CisgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfQVNJREVOVElGSUVSQ0hPSUNFX0NBTk9OSVpFLAorCQlYNTA5VjNfUl9FWFRFTlNJT05fVkFMVUVfRVJST1IpOworICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIGFfbWF4ICsgMSB0byBjaGVjayBmb3IgYWRqYWNlbmN5LgorICAgICAqLworICAgIGlmICgoYm4gPT0gTlVMTCAmJiAoYm4gPSBCTl9uZXcoKSkgPT0gTlVMTCkgfHwKKwlBU04xX0lOVEVHRVJfdG9fQk4oYV9tYXgsIGJuKSA9PSBOVUxMIHx8CisJIUJOX2FkZF93b3JkKGJuLCAxKSB8fAorCShhX21heF9wbHVzX29uZSA9IEJOX3RvX0FTTjFfSU5URUdFUihibiwgYV9tYXhfcGx1c19vbmUpKSA9PSBOVUxMKSB7CisgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfQVNJREVOVElGSUVSQ0hPSUNFX0NBTk9OSVpFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGRvbmU7CisgICAgfQorICAgIAorICAgIC8qCisgICAgICogSWYgYSBhbmQgYiBhcmUgYWRqYWNlbnQsIG1lcmdlIHRoZW0uCisgICAgICovCisgICAgaWYgKEFTTjFfSU5URUdFUl9jbXAoYV9tYXhfcGx1c19vbmUsIGJfbWluKSA9PSAwKSB7CisgICAgICBBU1JhbmdlICpyOworICAgICAgc3dpdGNoIChhLT50eXBlKSB7CisgICAgICBjYXNlIEFTSWRPclJhbmdlX2lkOgorCWlmICgociA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihBU1JhbmdlKSkpID09IE5VTEwpIHsKKwkgIFg1MDlWM2VycihYNTA5VjNfRl9BU0lERU5USUZJRVJDSE9JQ0VfQ0FOT05JWkUsCisJCSAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJICBnb3RvIGRvbmU7CisJfQorCXItPm1pbiA9IGFfbWluOworCXItPm1heCA9IGJfbWF4OworCWEtPnR5cGUgPSBBU0lkT3JSYW5nZV9yYW5nZTsKKwlhLT51LnJhbmdlID0gcjsKKwlicmVhazsKKyAgICAgIGNhc2UgQVNJZE9yUmFuZ2VfcmFuZ2U6CisJQVNOMV9JTlRFR0VSX2ZyZWUoYS0+dS5yYW5nZS0+bWF4KTsKKwlhLT51LnJhbmdlLT5tYXggPSBiX21heDsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCAoYi0+dHlwZSkgeworICAgICAgY2FzZSBBU0lkT3JSYW5nZV9pZDoKKwliLT51LmlkID0gTlVMTDsKKwlicmVhazsKKyAgICAgIGNhc2UgQVNJZE9yUmFuZ2VfcmFuZ2U6CisJYi0+dS5yYW5nZS0+bWF4ID0gTlVMTDsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIEFTSWRPclJhbmdlX2ZyZWUoYik7CisgICAgICBza19BU0lkT3JSYW5nZV9kZWxldGUoY2hvaWNlLT51LmFzSWRzT3JSYW5nZXMsIGkgKyAxKTsKKyAgICAgIGktLTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgfQorCisgIGFzc2VydChBU0lkZW50aWZpZXJDaG9pY2VfaXNfY2Fub25pY2FsKGNob2ljZSkpOyAvKiBQYXJhbm9pYSAqLworCisgIHJldCA9IDE7CisKKyBkb25lOgorICBBU04xX0lOVEVHRVJfZnJlZShhX21heF9wbHVzX29uZSk7CisgIEJOX2ZyZWUoYm4pOworICByZXR1cm4gcmV0OworfQorCisvKgorICogV2hhY2sgYW4gQVNJZGVudGlmaWVyIGV4dGVuc2lvbiBpbnRvIGNhbm9uaWNhbCBmb3JtLgorICovCitpbnQgdjNfYXNpZF9jYW5vbml6ZShBU0lkZW50aWZpZXJzICphc2lkKQoreworICByZXR1cm4gKGFzaWQgPT0gTlVMTCB8fAorCSAgKEFTSWRlbnRpZmllckNob2ljZV9jYW5vbml6ZShhc2lkLT5hc251bSkgJiYKKwkgICBBU0lkZW50aWZpZXJDaG9pY2VfY2Fub25pemUoYXNpZC0+cmRpKSkpOworfQorCisvKgorICogdjJpIG1ldGhvZCBmb3IgYW4gQVNJZGVudGlmaWVyIGV4dGVuc2lvbi4KKyAqLworc3RhdGljIHZvaWQgKnYyaV9BU0lkZW50aWZpZXJzKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsCisJCQkgICAgICAgc3RydWN0IHYzX2V4dF9jdHggKmN0eCwKKwkJCSAgICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzKQoreworICBBU0lkZW50aWZpZXJzICphc2lkID0gTlVMTDsKKyAgaW50IGk7CisKKyAgaWYgKChhc2lkID0gQVNJZGVudGlmaWVyc19uZXcoKSkgPT0gTlVMTCkgeworICAgIFg1MDlWM2VycihYNTA5VjNfRl9WMklfQVNJREVOVElGSUVSUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHVlcyk7IGkrKykgeworICAgIENPTkZfVkFMVUUgKnZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUodmFsdWVzLCBpKTsKKyAgICBBU04xX0lOVEVHRVIgKm1pbiA9IE5VTEwsICptYXggPSBOVUxMOworICAgIGludCBpMSwgaTIsIGkzLCBpc19yYW5nZSwgd2hpY2g7CisKKyAgICAvKgorICAgICAqIEZpZ3VyZSBvdXQgd2hldGhlciB0aGlzIGlzIGFuIEFTIG9yIGFuIFJESS4KKyAgICAgKi8KKyAgICBpZiAoICAgICAgICFuYW1lX2NtcCh2YWwtPm5hbWUsICJBUyIpKSB7CisgICAgICB3aGljaCA9IFYzX0FTSURfQVNOVU07CisgICAgfSBlbHNlIGlmICghbmFtZV9jbXAodmFsLT5uYW1lLCAiUkRJIikpIHsKKyAgICAgIHdoaWNoID0gVjNfQVNJRF9SREk7CisgICAgfSBlbHNlIHsKKyAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9WMklfQVNJREVOVElGSUVSUywgWDUwOVYzX1JfRVhURU5TSU9OX05BTUVfRVJST1IpOworICAgICAgWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEhhbmRsZSBpbmhlcml0YW5jZS4KKyAgICAgKi8KKyAgICBpZiAoIXN0cmNtcCh2YWwtPnZhbHVlLCAiaW5oZXJpdCIpKSB7CisgICAgICBpZiAodjNfYXNpZF9hZGRfaW5oZXJpdChhc2lkLCB3aGljaCkpCisJY29udGludWU7CisgICAgICBYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0FTSURFTlRJRklFUlMsIFg1MDlWM19SX0lOVkFMSURfSU5IRVJJVEFOQ0UpOworICAgICAgWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICAvKgorICAgICAqIE51bWJlciwgcmFuZ2UsIG9yIG1pc3Rha2UsIHBpY2sgaXQgYXBhcnQgYW5kIGZpZ3VyZSBvdXQgd2hpY2guCisgICAgICovCisgICAgaTEgPSBzdHJzcG4odmFsLT52YWx1ZSwgIjAxMjM0NTY3ODkiKTsKKyAgICBpZiAodmFsLT52YWx1ZVtpMV0gPT0gJ1wwJykgeworICAgICAgaXNfcmFuZ2UgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpc19yYW5nZSA9IDE7CisgICAgICBpMiA9IGkxICsgc3Ryc3BuKHZhbC0+dmFsdWUgKyBpMSwgIiBcdCIpOworICAgICAgaWYgKHZhbC0+dmFsdWVbaTJdICE9ICctJykgeworCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQVNJREVOVElGSUVSUywgWDUwOVYzX1JfSU5WQUxJRF9BU05VTUJFUik7CisJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJZ290byBlcnI7CisgICAgICB9CisgICAgICBpMisrOworICAgICAgaTIgPSBpMiArIHN0cnNwbih2YWwtPnZhbHVlICsgaTIsICIgXHQiKTsKKyAgICAgIGkzID0gaTIgKyBzdHJzcG4odmFsLT52YWx1ZSArIGkyLCAiMDEyMzQ1Njc4OSIpOworICAgICAgaWYgKHZhbC0+dmFsdWVbaTNdICE9ICdcMCcpIHsKKwlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0FTSURFTlRJRklFUlMsIFg1MDlWM19SX0lOVkFMSURfQVNSQU5HRSk7CisJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJZ290byBlcnI7CisgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTeW50YXggaXMgb2ssIHJlYWQgYW5kIGFkZCBpdC4KKyAgICAgKi8KKyAgICBpZiAoIWlzX3JhbmdlKSB7CisgICAgICBpZiAoIVg1MDlWM19nZXRfdmFsdWVfaW50KHZhbCwgJm1pbikpIHsKKwlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0FTSURFTlRJRklFUlMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlnb3RvIGVycjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgY2hhciAqcyA9IEJVRl9zdHJkdXAodmFsLT52YWx1ZSk7CisgICAgICBpZiAocyA9PSBOVUxMKSB7CisJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9BU0lERU5USUZJRVJTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJZ290byBlcnI7CisgICAgICB9CisgICAgICBzW2kxXSA9ICdcMCc7CisgICAgICBtaW4gPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIHMpOworICAgICAgbWF4ID0gczJpX0FTTjFfSU5URUdFUihOVUxMLCBzICsgaTIpOworICAgICAgT1BFTlNTTF9mcmVlKHMpOworICAgICAgaWYgKG1pbiA9PSBOVUxMIHx8IG1heCA9PSBOVUxMKSB7CisJQVNOMV9JTlRFR0VSX2ZyZWUobWluKTsKKwlBU04xX0lOVEVHRVJfZnJlZShtYXgpOworCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQVNJREVOVElGSUVSUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCWdvdG8gZXJyOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIXYzX2FzaWRfYWRkX2lkX29yX3JhbmdlKGFzaWQsIHdoaWNoLCBtaW4sIG1heCkpIHsKKyAgICAgIEFTTjFfSU5URUdFUl9mcmVlKG1pbik7CisgICAgICBBU04xX0lOVEVHRVJfZnJlZShtYXgpOworICAgICAgWDUwOVYzZXJyKFg1MDlWM19GX1YySV9BU0lERU5USUZJRVJTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisgICAgICBnb3RvIGVycjsKKyAgICB9CisgIH0KKworICAvKgorICAgKiBDYW5vbml6ZSB0aGUgcmVzdWx0LCB0aGVuIHdlJ3JlIGRvbmUuCisgICAqLworICBpZiAoIXYzX2FzaWRfY2Fub25pemUoYXNpZCkpCisgICAgZ290byBlcnI7CisgIHJldHVybiBhc2lkOworCisgZXJyOgorICBBU0lkZW50aWZpZXJzX2ZyZWUoYXNpZCk7CisgIHJldHVybiBOVUxMOworfQorCisvKgorICogT3BlblNTTCBkaXNwYXRjaC4KKyAqLworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfYXNpZCA9IHsKKyAgTklEX3NiZ3BfYXV0b25vbW91c1N5c051bSwJLyogbmlkICovCisgIDAsCQkJCS8qIGZsYWdzICovCisgIEFTTjFfSVRFTV9yZWYoQVNJZGVudGlmaWVycyksCS8qIHRlbXBsYXRlICovCisgIDAsIDAsIDAsIDAsCQkJLyogb2xkIGZ1bmN0aW9ucywgaWdub3JlZCAqLworICAwLAkJCQkvKiBpMnMgKi8KKyAgMCwJCQkJLyogczJpICovCisgIDAsCQkJCS8qIGkydiAqLworICB2MmlfQVNJZGVudGlmaWVycywJCS8qIHYyaSAqLworICBpMnJfQVNJZGVudGlmaWVycywJCS8qIGkyciAqLworICAwLAkJCQkvKiByMmkgKi8KKyAgTlVMTAkJCQkvKiBleHRlbnNpb24tc3BlY2lmaWMgZGF0YSAqLworfTsKKworLyoKKyAqIEZpZ3VyZSBvdXQgd2hldGhlciBleHRlbnNpb24gdXNlcyBpbmhlcml0YW5jZS4KKyAqLworaW50IHYzX2FzaWRfaW5oZXJpdHMoQVNJZGVudGlmaWVycyAqYXNpZCkKK3sKKyAgcmV0dXJuIChhc2lkICE9IE5VTEwgJiYKKwkgICgoYXNpZC0+YXNudW0gIT0gTlVMTCAmJgorCSAgICBhc2lkLT5hc251bS0+dHlwZSA9PSBBU0lkZW50aWZpZXJDaG9pY2VfaW5oZXJpdCkgfHwKKwkgICAoYXNpZC0+cmRpICE9IE5VTEwgJiYKKwkgICAgYXNpZC0+cmRpLT50eXBlID09IEFTSWRlbnRpZmllckNob2ljZV9pbmhlcml0KSkpOworfQorCisvKgorICogRmlndXJlIG91dCB3aGV0aGVyIHBhcmVudCBjb250YWlucyBjaGlsZC4KKyAqLworc3RhdGljIGludCBhc2lkX2NvbnRhaW5zKEFTSWRPclJhbmdlcyAqcGFyZW50LCBBU0lkT3JSYW5nZXMgKmNoaWxkKQoreworICBBU04xX0lOVEVHRVIgKnBfbWluLCAqcF9tYXgsICpjX21pbiwgKmNfbWF4OworICBpbnQgcCwgYzsKKworICBpZiAoY2hpbGQgPT0gTlVMTCB8fCBwYXJlbnQgPT0gY2hpbGQpCisgICAgcmV0dXJuIDE7CisgIGlmIChwYXJlbnQgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBwID0gMDsKKyAgZm9yIChjID0gMDsgYyA8IHNrX0FTSWRPclJhbmdlX251bShjaGlsZCk7IGMrKykgeworICAgIGV4dHJhY3RfbWluX21heChza19BU0lkT3JSYW5nZV92YWx1ZShjaGlsZCwgYyksICZjX21pbiwgJmNfbWF4KTsKKyAgICBmb3IgKDs7IHArKykgeworICAgICAgaWYgKHAgPj0gc2tfQVNJZE9yUmFuZ2VfbnVtKHBhcmVudCkpCisJcmV0dXJuIDA7CisgICAgICBleHRyYWN0X21pbl9tYXgoc2tfQVNJZE9yUmFuZ2VfdmFsdWUocGFyZW50LCBwKSwgJnBfbWluLCAmcF9tYXgpOworICAgICAgaWYgKEFTTjFfSU5URUdFUl9jbXAocF9tYXgsIGNfbWF4KSA8IDApCisJY29udGludWU7CisgICAgICBpZiAoQVNOMV9JTlRFR0VSX2NtcChwX21pbiwgY19taW4pID4gMCkKKwlyZXR1cm4gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiAxOworfQorCisvKgorICogVGVzdCB3aGV0aGVyIGEgaXMgYSBzdWJldCBvZiBiLgorICovCitpbnQgdjNfYXNpZF9zdWJzZXQoQVNJZGVudGlmaWVycyAqYSwgQVNJZGVudGlmaWVycyAqYikKK3sKKyAgcmV0dXJuIChhID09IE5VTEwgfHwKKwkgIGEgPT0gYiB8fAorCSAgKGIgIT0gTlVMTCAmJgorCSAgICF2M19hc2lkX2luaGVyaXRzKGEpICYmCisJICAgIXYzX2FzaWRfaW5oZXJpdHMoYikgJiYKKwkgICBhc2lkX2NvbnRhaW5zKGItPmFzbnVtLT51LmFzSWRzT3JSYW5nZXMsCisJCQkgYS0+YXNudW0tPnUuYXNJZHNPclJhbmdlcykgJiYKKwkgICBhc2lkX2NvbnRhaW5zKGItPnJkaS0+dS5hc0lkc09yUmFuZ2VzLAorCQkJIGEtPnJkaS0+dS5hc0lkc09yUmFuZ2VzKSkpOworfQorCisvKgorICogVmFsaWRhdGlvbiBlcnJvciBoYW5kbGluZyB2aWEgY2FsbGJhY2suCisgKi8KKyNkZWZpbmUgdmFsaWRhdGlvbl9lcnIoX2Vycl8pCQlcCisgIGRvIHsJCQkJCVwKKyAgICBpZiAoY3R4ICE9IE5VTEwpIHsJCQlcCisgICAgICBjdHgtPmVycm9yID0gX2Vycl87CQlcCisgICAgICBjdHgtPmVycm9yX2RlcHRoID0gaTsJCVwKKyAgICAgIGN0eC0+Y3VycmVudF9jZXJ0ID0geDsJCVwKKyAgICAgIHJldCA9IGN0eC0+dmVyaWZ5X2NiKDAsIGN0eCk7CVwKKyAgICB9IGVsc2UgewkJCQlcCisgICAgICByZXQgPSAwOwkJCQlcCisgICAgfQkJCQkJXAorICAgIGlmICghcmV0KQkJCQlcCisgICAgICBnb3RvIGRvbmU7CQkJXAorICB9IHdoaWxlICgwKQorCisvKgorICogQ29yZSBjb2RlIGZvciBSRkMgMzc3OSAzLjMgcGF0aCB2YWxpZGF0aW9uLgorICovCitzdGF0aWMgaW50IHYzX2FzaWRfdmFsaWRhdGVfcGF0aF9pbnRlcm5hbChYNTA5X1NUT1JFX0NUWCAqY3R4LAorCQkJCQkgIFNUQUNLX09GKFg1MDkpICpjaGFpbiwKKwkJCQkJICBBU0lkZW50aWZpZXJzICpleHQpCit7CisgIEFTSWRPclJhbmdlcyAqY2hpbGRfYXMgPSBOVUxMLCAqY2hpbGRfcmRpID0gTlVMTDsKKyAgaW50IGksIHJldCA9IDEsIGluaGVyaXRfYXMgPSAwLCBpbmhlcml0X3JkaSA9IDA7CisgIFg1MDkgKng7CisKKyAgYXNzZXJ0KGNoYWluICE9IE5VTEwgJiYgc2tfWDUwOV9udW0oY2hhaW4pID4gMCk7CisgIGFzc2VydChjdHggIT0gTlVMTCB8fCBleHQgIT0gTlVMTCk7CisgIGFzc2VydChjdHggPT0gTlVMTCB8fCBjdHgtPnZlcmlmeV9jYiAhPSBOVUxMKTsKKworICAvKgorICAgKiBGaWd1cmUgb3V0IHdoZXJlIHRvIHN0YXJ0LiAgSWYgd2UgZG9uJ3QgaGF2ZSBhbiBleHRlbnNpb24gdG8KKyAgICogY2hlY2ssIHdlJ3JlIGRvbmUuICBPdGhlcndpc2UsIGNoZWNrIGNhbm9uaWNhbCBmb3JtIGFuZAorICAgKiBzZXQgdXAgZm9yIHdhbGtpbmcgdXAgdGhlIGNoYWluLgorICAgKi8KKyAgaWYgKGV4dCAhPSBOVUxMKSB7CisgICAgaSA9IC0xOworICAgIHggPSBOVUxMOworICB9IGVsc2UgeworICAgIGkgPSAwOworICAgIHggPSBza19YNTA5X3ZhbHVlKGNoYWluLCBpKTsKKyAgICBhc3NlcnQoeCAhPSBOVUxMKTsKKyAgICBpZiAoKGV4dCA9IHgtPnJmYzM3NzlfYXNpZCkgPT0gTlVMTCkKKyAgICAgIGdvdG8gZG9uZTsKKyAgfQorICBpZiAoIXYzX2FzaWRfaXNfY2Fub25pY2FsKGV4dCkpCisgICAgdmFsaWRhdGlvbl9lcnIoWDUwOV9WX0VSUl9JTlZBTElEX0VYVEVOU0lPTik7CisgIGlmIChleHQtPmFzbnVtICE9IE5VTEwpICB7CisgICAgc3dpdGNoIChleHQtPmFzbnVtLT50eXBlKSB7CisgICAgY2FzZSBBU0lkZW50aWZpZXJDaG9pY2VfaW5oZXJpdDoKKyAgICAgIGluaGVyaXRfYXMgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSBBU0lkZW50aWZpZXJDaG9pY2VfYXNJZHNPclJhbmdlczoKKyAgICAgIGNoaWxkX2FzID0gZXh0LT5hc251bS0+dS5hc0lkc09yUmFuZ2VzOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChleHQtPnJkaSAhPSBOVUxMKSB7CisgICAgc3dpdGNoIChleHQtPnJkaS0+dHlwZSkgeworICAgIGNhc2UgQVNJZGVudGlmaWVyQ2hvaWNlX2luaGVyaXQ6CisgICAgICBpbmhlcml0X3JkaSA9IDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFTSWRlbnRpZmllckNob2ljZV9hc0lkc09yUmFuZ2VzOgorICAgICAgY2hpbGRfcmRpID0gZXh0LT5yZGktPnUuYXNJZHNPclJhbmdlczsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8qCisgICAqIE5vdyB3YWxrIHVwIHRoZSBjaGFpbi4gIEV4dGVuc2lvbnMgbXVzdCBiZSBpbiBjYW5vbmljYWwgZm9ybSwgbm8KKyAgICogY2VydCBtYXkgbGlzdCByZXNvdXJjZXMgdGhhdCBpdHMgcGFyZW50IGRvZXNuJ3QgbGlzdC4KKyAgICovCisgIGZvciAoaSsrOyBpIDwgc2tfWDUwOV9udW0oY2hhaW4pOyBpKyspIHsKKyAgICB4ID0gc2tfWDUwOV92YWx1ZShjaGFpbiwgaSk7CisgICAgYXNzZXJ0KHggIT0gTlVMTCk7CisgICAgaWYgKHgtPnJmYzM3NzlfYXNpZCA9PSBOVUxMKSB7CisgICAgICBpZiAoY2hpbGRfYXMgIT0gTlVMTCB8fCBjaGlsZF9yZGkgIT0gTlVMTCkKKwl2YWxpZGF0aW9uX2VycihYNTA5X1ZfRVJSX1VOTkVTVEVEX1JFU09VUkNFKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIXYzX2FzaWRfaXNfY2Fub25pY2FsKHgtPnJmYzM3NzlfYXNpZCkpCisgICAgICB2YWxpZGF0aW9uX2VycihYNTA5X1ZfRVJSX0lOVkFMSURfRVhURU5TSU9OKTsKKyAgICBpZiAoeC0+cmZjMzc3OV9hc2lkLT5hc251bSA9PSBOVUxMICYmIGNoaWxkX2FzICE9IE5VTEwpIHsKKyAgICAgIHZhbGlkYXRpb25fZXJyKFg1MDlfVl9FUlJfVU5ORVNURURfUkVTT1VSQ0UpOworICAgICAgY2hpbGRfYXMgPSBOVUxMOworICAgICAgaW5oZXJpdF9hcyA9IDA7CisgICAgfQorICAgIGlmICh4LT5yZmMzNzc5X2FzaWQtPmFzbnVtICE9IE5VTEwgJiYKKwl4LT5yZmMzNzc5X2FzaWQtPmFzbnVtLT50eXBlID09IEFTSWRlbnRpZmllckNob2ljZV9hc0lkc09yUmFuZ2VzKSB7CisgICAgICBpZiAoaW5oZXJpdF9hcyB8fAorCSAgYXNpZF9jb250YWlucyh4LT5yZmMzNzc5X2FzaWQtPmFzbnVtLT51LmFzSWRzT3JSYW5nZXMsIGNoaWxkX2FzKSkgeworCWNoaWxkX2FzID0geC0+cmZjMzc3OV9hc2lkLT5hc251bS0+dS5hc0lkc09yUmFuZ2VzOworCWluaGVyaXRfYXMgPSAwOworICAgICAgfSBlbHNlIHsKKwl2YWxpZGF0aW9uX2VycihYNTA5X1ZfRVJSX1VOTkVTVEVEX1JFU09VUkNFKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHgtPnJmYzM3NzlfYXNpZC0+cmRpID09IE5VTEwgJiYgY2hpbGRfcmRpICE9IE5VTEwpIHsKKyAgICAgIHZhbGlkYXRpb25fZXJyKFg1MDlfVl9FUlJfVU5ORVNURURfUkVTT1VSQ0UpOworICAgICAgY2hpbGRfcmRpID0gTlVMTDsKKyAgICAgIGluaGVyaXRfcmRpID0gMDsKKyAgICB9CisgICAgaWYgKHgtPnJmYzM3NzlfYXNpZC0+cmRpICE9IE5VTEwgJiYKKwl4LT5yZmMzNzc5X2FzaWQtPnJkaS0+dHlwZSA9PSBBU0lkZW50aWZpZXJDaG9pY2VfYXNJZHNPclJhbmdlcykgeworICAgICAgaWYgKGluaGVyaXRfcmRpIHx8CisJICBhc2lkX2NvbnRhaW5zKHgtPnJmYzM3NzlfYXNpZC0+cmRpLT51LmFzSWRzT3JSYW5nZXMsIGNoaWxkX3JkaSkpIHsKKwljaGlsZF9yZGkgPSB4LT5yZmMzNzc5X2FzaWQtPnJkaS0+dS5hc0lkc09yUmFuZ2VzOworCWluaGVyaXRfcmRpID0gMDsKKyAgICAgIH0gZWxzZSB7CisJdmFsaWRhdGlvbl9lcnIoWDUwOV9WX0VSUl9VTk5FU1RFRF9SRVNPVVJDRSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoKKyAgICogVHJ1c3QgYW5jaG9yIGNhbid0IGluaGVyaXQuCisgICAqLworICBhc3NlcnQoeCAhPSBOVUxMKTsKKyAgaWYgKHgtPnJmYzM3NzlfYXNpZCAhPSBOVUxMKSB7CisgICAgaWYgKHgtPnJmYzM3NzlfYXNpZC0+YXNudW0gIT0gTlVMTCAmJgorCXgtPnJmYzM3NzlfYXNpZC0+YXNudW0tPnR5cGUgPT0gQVNJZGVudGlmaWVyQ2hvaWNlX2luaGVyaXQpCisgICAgICB2YWxpZGF0aW9uX2VycihYNTA5X1ZfRVJSX1VOTkVTVEVEX1JFU09VUkNFKTsKKyAgICBpZiAoeC0+cmZjMzc3OV9hc2lkLT5yZGkgIT0gTlVMTCAmJgorCXgtPnJmYzM3NzlfYXNpZC0+cmRpLT50eXBlID09IEFTSWRlbnRpZmllckNob2ljZV9pbmhlcml0KQorICAgICAgdmFsaWRhdGlvbl9lcnIoWDUwOV9WX0VSUl9VTk5FU1RFRF9SRVNPVVJDRSk7CisgIH0KKworIGRvbmU6CisgIHJldHVybiByZXQ7Cit9CisKKyN1bmRlZiB2YWxpZGF0aW9uX2VycgorCisvKgorICogUkZDIDM3NzkgMy4zIHBhdGggdmFsaWRhdGlvbiAtLSBjYWxsZWQgZnJvbSBYNTA5X3ZlcmlmeV9jZXJ0KCkuCisgKi8KK2ludCB2M19hc2lkX3ZhbGlkYXRlX3BhdGgoWDUwOV9TVE9SRV9DVFggKmN0eCkKK3sKKyAgcmV0dXJuIHYzX2FzaWRfdmFsaWRhdGVfcGF0aF9pbnRlcm5hbChjdHgsIGN0eC0+Y2hhaW4sIE5VTEwpOworfQorCisvKgorICogUkZDIDM3NzkgMy4zIHBhdGggdmFsaWRhdGlvbiBvZiBhbiBleHRlbnNpb24uCisgKiBUZXN0IHdoZXRoZXIgY2hhaW4gY292ZXJzIGV4dGVuc2lvbi4KKyAqLworaW50IHYzX2FzaWRfdmFsaWRhdGVfcmVzb3VyY2Vfc2V0KFNUQUNLX09GKFg1MDkpICpjaGFpbiwKKwkJCQkgIEFTSWRlbnRpZmllcnMgKmV4dCwKKwkJCQkgIGludCBhbGxvd19pbmhlcml0YW5jZSkKK3sKKyAgaWYgKGV4dCA9PSBOVUxMKQorICAgIHJldHVybiAxOworICBpZiAoY2hhaW4gPT0gTlVMTCB8fCBza19YNTA5X251bShjaGFpbikgPT0gMCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCFhbGxvd19pbmhlcml0YW5jZSAmJiB2M19hc2lkX2luaGVyaXRzKGV4dCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiB2M19hc2lkX3ZhbGlkYXRlX3BhdGhfaW50ZXJuYWwoTlVMTCwgY2hhaW4sIGV4dCk7Cit9CisKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1JGQzM3NzkgKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYmNvbnMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYmNvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmFhNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19iY29ucy5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiB2M19iY29ucy5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0JBU0lDX0NPTlNUUkFJTlRTKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIEJBU0lDX0NPTlNUUkFJTlRTICpiY29ucywgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dGxpc3QpOworc3RhdGljIEJBU0lDX0NPTlNUUkFJTlRTICp2MmlfQkFTSUNfQ09OU1RSQUlOVFMoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfYmNvbnMgPSB7CitOSURfYmFzaWNfY29uc3RyYWludHMsIDAsCitBU04xX0lURU1fcmVmKEJBU0lDX0NPTlNUUkFJTlRTKSwKKzAsMCwwLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlYpaTJ2X0JBU0lDX0NPTlNUUkFJTlRTLAorKFg1MDlWM19FWFRfVjJJKXYyaV9CQVNJQ19DT05TVFJBSU5UUywKK05VTEwsTlVMTCwKK05VTEwKK307CisKK0FTTjFfU0VRVUVOQ0UoQkFTSUNfQ09OU1RSQUlOVFMpID0geworCUFTTjFfT1BUKEJBU0lDX0NPTlNUUkFJTlRTLCBjYSwgQVNOMV9GQk9PTEVBTiksCisJQVNOMV9PUFQoQkFTSUNfQ09OU1RSQUlOVFMsIHBhdGhsZW4sIEFTTjFfSU5URUdFUikKK30gQVNOMV9TRVFVRU5DRV9FTkQoQkFTSUNfQ09OU1RSQUlOVFMpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhCQVNJQ19DT05TVFJBSU5UUykKKworCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmkydl9CQVNJQ19DT05TVFJBSU5UUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgQkFTSUNfQ09OU1RSQUlOVFMgKmJjb25zLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCkKK3sKKwlYNTA5VjNfYWRkX3ZhbHVlX2Jvb2woIkNBIiwgYmNvbnMtPmNhLCAmZXh0bGlzdCk7CisJWDUwOVYzX2FkZF92YWx1ZV9pbnQoInBhdGhsZW4iLCBiY29ucy0+cGF0aGxlbiwgJmV4dGxpc3QpOworCXJldHVybiBleHRsaXN0OworfQorCitzdGF0aWMgQkFTSUNfQ09OU1RSQUlOVFMgKnYyaV9CQVNJQ19DT05TVFJBSU5UUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzKQoreworCUJBU0lDX0NPTlNUUkFJTlRTICpiY29ucz1OVUxMOworCUNPTkZfVkFMVUUgKnZhbDsKKwlpbnQgaTsKKwlpZighKGJjb25zID0gQkFTSUNfQ09OU1RSQUlOVFNfbmV3KCkpKSB7CisJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQkFTSUNfQ09OU1RSQUlOVFMsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHVlcyk7IGkrKykgeworCQl2YWwgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHZhbHVlcywgaSk7CisJCWlmKCFzdHJjbXAodmFsLT5uYW1lLCAiQ0EiKSkgeworCQkJaWYoIVg1MDlWM19nZXRfdmFsdWVfYm9vbCh2YWwsICZiY29ucy0+Y2EpKSBnb3RvIGVycjsKKwkJfSBlbHNlIGlmKCFzdHJjbXAodmFsLT5uYW1lLCAicGF0aGxlbiIpKSB7CisJCQlpZighWDUwOVYzX2dldF92YWx1ZV9pbnQodmFsLCAmYmNvbnMtPnBhdGhsZW4pKSBnb3RvIGVycjsKKwkJfSBlbHNlIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQkFTSUNfQ09OU1RSQUlOVFMsIFg1MDlWM19SX0lOVkFMSURfTkFNRSk7CisJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCXJldHVybiBiY29uczsKKwllcnI6CisJQkFTSUNfQ09OU1RSQUlOVFNfZnJlZShiY29ucyk7CisJcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYml0c3QuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfYml0c3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNThkMGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19iaXRzdC5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiB2M19iaXRzdC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK3N0YXRpYyBCSVRfU1RSSU5HX0JJVE5BTUUgbnNfY2VydF90eXBlX3RhYmxlW10gPSB7Cit7MCwgIlNTTCBDbGllbnQiLCAiY2xpZW50In0sCit7MSwgIlNTTCBTZXJ2ZXIiLCAic2VydmVyIn0sCit7MiwgIlMvTUlNRSIsICJlbWFpbCJ9LAorezMsICJPYmplY3QgU2lnbmluZyIsICJvYmpzaWduIn0sCit7NCwgIlVudXNlZCIsICJyZXNlcnZlZCJ9LAorezUsICJTU0wgQ0EiLCAic3NsQ0EifSwKK3s2LCAiUy9NSU1FIENBIiwgImVtYWlsQ0EifSwKK3s3LCAiT2JqZWN0IFNpZ25pbmcgQ0EiLCAib2JqQ0EifSwKK3stMSwgTlVMTCwgTlVMTH0KK307CisKK3N0YXRpYyBCSVRfU1RSSU5HX0JJVE5BTUUga2V5X3VzYWdlX3R5cGVfdGFibGVbXSA9IHsKK3swLCAiRGlnaXRhbCBTaWduYXR1cmUiLCAiZGlnaXRhbFNpZ25hdHVyZSJ9LAorezEsICJOb24gUmVwdWRpYXRpb24iLCAibm9uUmVwdWRpYXRpb24ifSwKK3syLCAiS2V5IEVuY2lwaGVybWVudCIsICJrZXlFbmNpcGhlcm1lbnQifSwKK3szLCAiRGF0YSBFbmNpcGhlcm1lbnQiLCAiZGF0YUVuY2lwaGVybWVudCJ9LAorezQsICJLZXkgQWdyZWVtZW50IiwgImtleUFncmVlbWVudCJ9LAorezUsICJDZXJ0aWZpY2F0ZSBTaWduIiwgImtleUNlcnRTaWduIn0sCit7NiwgIkNSTCBTaWduIiwgImNSTFNpZ24ifSwKK3s3LCAiRW5jaXBoZXIgT25seSIsICJlbmNpcGhlck9ubHkifSwKK3s4LCAiRGVjaXBoZXIgT25seSIsICJkZWNpcGhlck9ubHkifSwKK3stMSwgTlVMTCwgTlVMTH0KK307CisKKworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19uc2NlcnQgPSBFWFRfQklUU1RSSU5HKE5JRF9uZXRzY2FwZV9jZXJ0X3R5cGUsIG5zX2NlcnRfdHlwZV90YWJsZSk7Citjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19rZXlfdXNhZ2UgPSBFWFRfQklUU1RSSU5HKE5JRF9rZXlfdXNhZ2UsIGtleV91c2FnZV90eXBlX3RhYmxlKTsKKworU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmkydl9BU04xX0JJVF9TVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIEFTTjFfQklUX1NUUklORyAqYml0cywgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnJldCkKK3sKKwlCSVRfU1RSSU5HX0JJVE5BTUUgKmJuYW07CisJZm9yKGJuYW0gPW1ldGhvZC0+dXNyX2RhdGE7IGJuYW0tPmxuYW1lOyBibmFtKyspIHsKKwkJaWYoQVNOMV9CSVRfU1RSSU5HX2dldF9iaXQoYml0cywgYm5hbS0+Yml0bnVtKSkgCisJCQlYNTA5VjNfYWRkX3ZhbHVlKGJuYW0tPmxuYW1lLCBOVUxMLCAmcmV0KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwkKK0FTTjFfQklUX1NUUklORyAqdjJpX0FTTjFfQklUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCkKK3sKKwlDT05GX1ZBTFVFICp2YWw7CisJQVNOMV9CSVRfU1RSSU5HICpiczsKKwlpbnQgaTsKKwlCSVRfU1RSSU5HX0JJVE5BTUUgKmJuYW07CisJaWYoIShicyA9IE1fQVNOMV9CSVRfU1RSSU5HX25ldygpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0FTTjFfQklUX1NUUklORyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CisJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCWZvcihibmFtID0gbWV0aG9kLT51c3JfZGF0YTsgYm5hbS0+bG5hbWU7IGJuYW0rKykgeworCQkJaWYoIXN0cmNtcChibmFtLT5zbmFtZSwgdmFsLT5uYW1lKSB8fAorCQkJCSFzdHJjbXAoYm5hbS0+bG5hbWUsIHZhbC0+bmFtZSkgKSB7CisJCQkJaWYoIUFTTjFfQklUX1NUUklOR19zZXRfYml0KGJzLCBibmFtLT5iaXRudW0sIDEpKSB7CisJCQkJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQVNOMV9CSVRfU1RSSU5HLAorCQkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCQlNX0FTTjFfQklUX1NUUklOR19mcmVlKGJzKTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmKCFibmFtLT5sbmFtZSkgeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9BU04xX0JJVF9TVFJJTkcsCisJCQkJCVg1MDlWM19SX1VOS05PV05fQklUX1NUUklOR19BUkdVTUVOVCk7CisJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCU1fQVNOMV9CSVRfU1RSSU5HX2ZyZWUoYnMpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIGJzOworfQorCQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2NvbmYuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfY29uZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzBmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2NvbmYuYwpAQCAtMCwwICsxLDUyNSBAQAorLyogdjNfY29uZi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiBleHRlbnNpb24gY3JlYXRpb24gdXRpbGl0aWVzICovCisKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIGludCB2M19jaGVja19jcml0aWNhbChjaGFyICoqdmFsdWUpOworc3RhdGljIGludCB2M19jaGVja19nZW5lcmljKGNoYXIgKip2YWx1ZSk7CitzdGF0aWMgWDUwOV9FWFRFTlNJT04gKmRvX2V4dF9uY29uZihDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGludCBleHRfbmlkLCBpbnQgY3JpdCwgY2hhciAqdmFsdWUpOworc3RhdGljIFg1MDlfRVhURU5TSU9OICp2M19nZW5lcmljX2V4dGVuc2lvbihjb25zdCBjaGFyICpleHQsIGNoYXIgKnZhbHVlLCBpbnQgY3JpdCwgaW50IHR5cGUsIFg1MDlWM19DVFggKmN0eCk7CitzdGF0aWMgY2hhciAqY29uZl9saGFzaF9nZXRfc3RyaW5nKHZvaWQgKmRiLCBjaGFyICpzZWN0aW9uLCBjaGFyICp2YWx1ZSk7CitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmNvbmZfbGhhc2hfZ2V0X3NlY3Rpb24odm9pZCAqZGIsIGNoYXIgKnNlY3Rpb24pOworc3RhdGljIFg1MDlfRVhURU5TSU9OICpkb19leHRfaTJkKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIGludCBleHRfbmlkLAorCQkJCSAgaW50IGNyaXQsIHZvaWQgKmV4dF9zdHJ1Yyk7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqZ2VuZXJpY19hc24xKGNoYXIgKnZhbHVlLCBYNTA5VjNfQ1RYICpjdHgsIGxvbmcgKmV4dF9sZW4pOworLyogQ09ORiAqY29uZjogIENvbmZpZyBmaWxlICAgICovCisvKiBjaGFyICpuYW1lOiAgTmFtZSAgICAqLworLyogY2hhciAqdmFsdWU6ICBWYWx1ZSAgICAqLworWDUwOV9FWFRFTlNJT04gKlg1MDlWM19FWFRfbmNvbmYoQ09ORiAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpuYW1lLAorCQkJCSBjaGFyICp2YWx1ZSkKKwl7CisJaW50IGNyaXQ7CisJaW50IGV4dF90eXBlOworCVg1MDlfRVhURU5TSU9OICpyZXQ7CisJY3JpdCA9IHYzX2NoZWNrX2NyaXRpY2FsKCZ2YWx1ZSk7CisJaWYgKChleHRfdHlwZSA9IHYzX2NoZWNrX2dlbmVyaWMoJnZhbHVlKSkpIAorCQlyZXR1cm4gdjNfZ2VuZXJpY19leHRlbnNpb24obmFtZSwgdmFsdWUsIGNyaXQsIGV4dF90eXBlLCBjdHgpOworCXJldCA9IGRvX2V4dF9uY29uZihjb25mLCBjdHgsIE9CSl9zbjJuaWQobmFtZSksIGNyaXQsIHZhbHVlKTsKKwlpZiAoIXJldCkKKwkJeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfWDUwOVYzX0VYVF9OQ09ORixYNTA5VjNfUl9FUlJPUl9JTl9FWFRFTlNJT04pOworCQlFUlJfYWRkX2Vycm9yX2RhdGEoNCwibmFtZT0iLCBuYW1lLCAiLCB2YWx1ZT0iLCB2YWx1ZSk7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworLyogQ09ORiAqY29uZjogIENvbmZpZyBmaWxlICAgICovCisvKiBjaGFyICp2YWx1ZTogIFZhbHVlICAgICovCitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9uY29uZl9uaWQoQ09ORiAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LCBpbnQgZXh0X25pZCwKKwkJCQkgICAgIGNoYXIgKnZhbHVlKQorCXsKKwlpbnQgY3JpdDsKKwlpbnQgZXh0X3R5cGU7CisJY3JpdCA9IHYzX2NoZWNrX2NyaXRpY2FsKCZ2YWx1ZSk7CisJaWYgKChleHRfdHlwZSA9IHYzX2NoZWNrX2dlbmVyaWMoJnZhbHVlKSkpIAorCQlyZXR1cm4gdjNfZ2VuZXJpY19leHRlbnNpb24oT0JKX25pZDJzbihleHRfbmlkKSwKKwkJCQkJCSB2YWx1ZSwgY3JpdCwgZXh0X3R5cGUsIGN0eCk7CisJcmV0dXJuIGRvX2V4dF9uY29uZihjb25mLCBjdHgsIGV4dF9uaWQsIGNyaXQsIHZhbHVlKTsKKwl9CisKKy8qIENPTkYgKmNvbmY6ICBDb25maWcgZmlsZSAgICAqLworLyogY2hhciAqdmFsdWU6ICBWYWx1ZSAgICAqLworc3RhdGljIFg1MDlfRVhURU5TSU9OICpkb19leHRfbmNvbmYoQ09ORiAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LCBpbnQgZXh0X25pZCwKKwkJCQkgICAgaW50IGNyaXQsIGNoYXIgKnZhbHVlKQorCXsKKwljb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kOworCVg1MDlfRVhURU5TSU9OICpleHQ7CisJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWw7CisJdm9pZCAqZXh0X3N0cnVjOworCWlmIChleHRfbmlkID09IE5JRF91bmRlZikKKwkJeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfRE9fRVhUX05DT05GLFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OX05BTUUpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmICghKG1ldGhvZCA9IFg1MDlWM19FWFRfZ2V0X25pZChleHRfbmlkKSkpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX0RPX0VYVF9OQ09ORixYNTA5VjNfUl9VTktOT1dOX0VYVEVOU0lPTik7CisJCXJldHVybiBOVUxMOworCQl9CisJLyogTm93IGdldCBpbnRlcm5hbCBleHRlbnNpb24gcmVwcmVzZW50YXRpb24gYmFzZWQgb24gdHlwZSAqLworCWlmIChtZXRob2QtPnYyaSkKKwkJeworCQlpZigqdmFsdWUgPT0gJ0AnKSBudmFsID0gTkNPTkZfZ2V0X3NlY3Rpb24oY29uZiwgdmFsdWUgKyAxKTsKKwkJZWxzZSBudmFsID0gWDUwOVYzX3BhcnNlX2xpc3QodmFsdWUpOworCQlpZihza19DT05GX1ZBTFVFX251bShudmFsKSA8PSAwKQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX0RPX0VYVF9OQ09ORixYNTA5VjNfUl9JTlZBTElEX0VYVEVOU0lPTl9TVFJJTkcpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDQsICJuYW1lPSIsIE9CSl9uaWQyc24oZXh0X25pZCksICIsc2VjdGlvbj0iLCB2YWx1ZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJZXh0X3N0cnVjID0gbWV0aG9kLT52MmkobWV0aG9kLCBjdHgsIG52YWwpOworCQlpZigqdmFsdWUgIT0gJ0AnKSBza19DT05GX1ZBTFVFX3BvcF9mcmVlKG52YWwsCisJCQkJCQkJIFg1MDlWM19jb25mX2ZyZWUpOworCQlpZighZXh0X3N0cnVjKSByZXR1cm4gTlVMTDsKKwkJfQorCWVsc2UgaWYobWV0aG9kLT5zMmkpCisJCXsKKwkJaWYoIShleHRfc3RydWMgPSBtZXRob2QtPnMyaShtZXRob2QsIGN0eCwgdmFsdWUpKSkgcmV0dXJuIE5VTEw7CisJCX0KKwllbHNlIGlmKG1ldGhvZC0+cjJpKQorCQl7CisJCWlmKCFjdHgtPmRiIHx8ICFjdHgtPmRiX21ldGgpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfRE9fRVhUX05DT05GLFg1MDlWM19SX05PX0NPTkZJR19EQVRBQkFTRSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJaWYoIShleHRfc3RydWMgPSBtZXRob2QtPnIyaShtZXRob2QsIGN0eCwgdmFsdWUpKSkgcmV0dXJuIE5VTEw7CisJCX0KKwllbHNlCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX0RPX0VYVF9OQ09ORixYNTA5VjNfUl9FWFRFTlNJT05fU0VUVElOR19OT1RfU1VQUE9SVEVEKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJuYW1lPSIsIE9CSl9uaWQyc24oZXh0X25pZCkpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJZXh0ICA9IGRvX2V4dF9pMmQobWV0aG9kLCBleHRfbmlkLCBjcml0LCBleHRfc3RydWMpOworCWlmKG1ldGhvZC0+aXQpIEFTTjFfaXRlbV9mcmVlKGV4dF9zdHJ1YywgQVNOMV9JVEVNX3B0cihtZXRob2QtPml0KSk7CisJZWxzZSBtZXRob2QtPmV4dF9mcmVlKGV4dF9zdHJ1Yyk7CisJcmV0dXJuIGV4dDsKKworCX0KKworc3RhdGljIFg1MDlfRVhURU5TSU9OICpkb19leHRfaTJkKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIGludCBleHRfbmlkLAorCQkJCSAgaW50IGNyaXQsIHZvaWQgKmV4dF9zdHJ1YykKKwl7CisJdW5zaWduZWQgY2hhciAqZXh0X2RlcjsKKwlpbnQgZXh0X2xlbjsKKwlBU04xX09DVEVUX1NUUklORyAqZXh0X29jdDsKKwlYNTA5X0VYVEVOU0lPTiAqZXh0OworCS8qIENvbnZlcnQgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gREVSICovCisJaWYgKG1ldGhvZC0+aXQpCisJCXsKKwkJZXh0X2RlciA9IE5VTEw7CisJCWV4dF9sZW4gPSBBU04xX2l0ZW1faTJkKGV4dF9zdHJ1YywgJmV4dF9kZXIsIEFTTjFfSVRFTV9wdHIobWV0aG9kLT5pdCkpOworCQlpZiAoZXh0X2xlbiA8IDApIGdvdG8gbWVycjsKKwkJfQorCSBlbHNlCisJCXsKKwkJdW5zaWduZWQgY2hhciAqcDsKKwkJZXh0X2xlbiA9IG1ldGhvZC0+aTJkKGV4dF9zdHJ1YywgTlVMTCk7CisJCWlmKCEoZXh0X2RlciA9IE9QRU5TU0xfbWFsbG9jKGV4dF9sZW4pKSkgZ290byBtZXJyOworCQlwID0gZXh0X2RlcjsKKwkJbWV0aG9kLT5pMmQoZXh0X3N0cnVjLCAmcCk7CisJCX0KKwlpZiAoIShleHRfb2N0ID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcoKSkpIGdvdG8gbWVycjsKKwlleHRfb2N0LT5kYXRhID0gZXh0X2RlcjsKKwlleHRfb2N0LT5sZW5ndGggPSBleHRfbGVuOworCisJZXh0ID0gWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X05JRChOVUxMLCBleHRfbmlkLCBjcml0LCBleHRfb2N0KTsKKwlpZiAoIWV4dCkgZ290byBtZXJyOworCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShleHRfb2N0KTsKKworCXJldHVybiBleHQ7CisKKwltZXJyOgorCVg1MDlWM2VycihYNTA5VjNfRl9ET19FWFRfSTJELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlyZXR1cm4gTlVMTDsKKworCX0KKworLyogR2l2ZW4gYW4gaW50ZXJuYWwgc3RydWN0dXJlLCBuaWQgYW5kIGNyaXRpY2FsIGZsYWcgY3JlYXRlIGFuIGV4dGVuc2lvbiAqLworCitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9pMmQoaW50IGV4dF9uaWQsIGludCBjcml0LCB2b2lkICpleHRfc3RydWMpCisJeworCWNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2Q7CisJaWYgKCEobWV0aG9kID0gWDUwOVYzX0VYVF9nZXRfbmlkKGV4dF9uaWQpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfWDUwOVYzX0VYVF9JMkQsWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT04pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGRvX2V4dF9pMmQobWV0aG9kLCBleHRfbmlkLCBjcml0LCBleHRfc3RydWMpOworfQorCisvKiBDaGVjayB0aGUgZXh0ZW5zaW9uIHN0cmluZyBmb3IgY3JpdGljYWwgZmxhZyAqLworc3RhdGljIGludCB2M19jaGVja19jcml0aWNhbChjaGFyICoqdmFsdWUpCit7CisJY2hhciAqcCA9ICp2YWx1ZTsKKwlpZiAoKHN0cmxlbihwKSA8IDkpIHx8IHN0cm5jbXAocCwgImNyaXRpY2FsLCIsIDkpKSByZXR1cm4gMDsKKwlwKz05OworCXdoaWxlKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKnApKSBwKys7CisJKnZhbHVlID0gcDsKKwlyZXR1cm4gMTsKK30KKworLyogQ2hlY2sgZXh0ZW5zaW9uIHN0cmluZyBmb3IgZ2VuZXJpYyBleHRlbnNpb24gYW5kIHJldHVybiB0aGUgdHlwZSAqLworc3RhdGljIGludCB2M19jaGVja19nZW5lcmljKGNoYXIgKip2YWx1ZSkKK3sKKwlpbnQgZ2VuX3R5cGUgPSAwOworCWNoYXIgKnAgPSAqdmFsdWU7CisJaWYgKChzdHJsZW4ocCkgPj0gNCkgJiYgIXN0cm5jbXAocCwgIkRFUjoiLCA0KSkKKwkJeworCQlwKz00OworCQlnZW5fdHlwZSA9IDE7CisJCX0KKwllbHNlIGlmICgoc3RybGVuKHApID49IDUpICYmICFzdHJuY21wKHAsICJBU04xOiIsIDUpKQorCQl7CisJCXArPTU7CisJCWdlbl90eXBlID0gMjsKKwkJfQorCWVsc2UKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcCkpIHArKzsKKwkqdmFsdWUgPSBwOworCXJldHVybiBnZW5fdHlwZTsKK30KKworLyogQ3JlYXRlIGEgZ2VuZXJpYyBleHRlbnNpb246IGZvciBub3cganVzdCBoYW5kbGUgREVSIHR5cGUgKi8KK3N0YXRpYyBYNTA5X0VYVEVOU0lPTiAqdjNfZ2VuZXJpY19leHRlbnNpb24oY29uc3QgY2hhciAqZXh0LCBjaGFyICp2YWx1ZSwKKwkJCQkJICAgIGludCBjcml0LCBpbnQgZ2VuX3R5cGUsCisJCQkJCSAgICBYNTA5VjNfQ1RYICpjdHgpCisJeworCXVuc2lnbmVkIGNoYXIgKmV4dF9kZXI9TlVMTDsKKwlsb25nIGV4dF9sZW47CisJQVNOMV9PQkpFQ1QgKm9iaj1OVUxMOworCUFTTjFfT0NURVRfU1RSSU5HICpvY3Q9TlVMTDsKKwlYNTA5X0VYVEVOU0lPTiAqZXh0ZW5zaW9uPU5VTEw7CisJaWYgKCEob2JqID0gT0JKX3R4dDJvYmooZXh0LCAwKSkpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1YzX0dFTkVSSUNfRVhURU5TSU9OLFg1MDlWM19SX0VYVEVOU0lPTl9OQU1FX0VSUk9SKTsKKwkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJuYW1lPSIsIGV4dCk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoZ2VuX3R5cGUgPT0gMSkKKwkJZXh0X2RlciA9IHN0cmluZ190b19oZXgodmFsdWUsICZleHRfbGVuKTsKKwllbHNlIGlmIChnZW5fdHlwZSA9PSAyKQorCQlleHRfZGVyID0gZ2VuZXJpY19hc24xKHZhbHVlLCBjdHgsICZleHRfbGVuKTsKKworCWlmIChleHRfZGVyID09IE5VTEwpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1YzX0dFTkVSSUNfRVhURU5TSU9OLFg1MDlWM19SX0VYVEVOU0lPTl9WQUxVRV9FUlJPUik7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgyLCAidmFsdWU9IiwgdmFsdWUpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKCEob2N0ID0gTV9BU04xX09DVEVUX1NUUklOR19uZXcoKSkpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1YzX0dFTkVSSUNfRVhURU5TSU9OLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCW9jdC0+ZGF0YSA9IGV4dF9kZXI7CisJb2N0LT5sZW5ndGggPSBleHRfbGVuOworCWV4dF9kZXIgPSBOVUxMOworCisJZXh0ZW5zaW9uID0gWDUwOV9FWFRFTlNJT05fY3JlYXRlX2J5X09CSihOVUxMLCBvYmosIGNyaXQsIG9jdCk7CisKKwllcnI6CisJQVNOMV9PQkpFQ1RfZnJlZShvYmopOworCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvY3QpOworCWlmKGV4dF9kZXIpIE9QRU5TU0xfZnJlZShleHRfZGVyKTsKKwlyZXR1cm4gZXh0ZW5zaW9uOworCisJfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciAqZ2VuZXJpY19hc24xKGNoYXIgKnZhbHVlLCBYNTA5VjNfQ1RYICpjdHgsIGxvbmcgKmV4dF9sZW4pCisJeworCUFTTjFfVFlQRSAqdHlwOworCXVuc2lnbmVkIGNoYXIgKmV4dF9kZXIgPSBOVUxMOworCXR5cCA9IEFTTjFfZ2VuZXJhdGVfdjModmFsdWUsIGN0eCk7CisJaWYgKHR5cCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwkqZXh0X2xlbiA9IGkyZF9BU04xX1RZUEUodHlwLCAmZXh0X2Rlcik7CisJQVNOMV9UWVBFX2ZyZWUodHlwKTsKKwlyZXR1cm4gZXh0X2RlcjsKKwl9CisKKy8qIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb246IGFkZCBhIGJ1bmNoIG9mIGV4dGVuc2lvbnMgYmFzZWQgb24gYSBjb25maWcgZmlsZQorICogc2VjdGlvbiB0byBhbiBleHRlbnNpb24gU1RBQ0suCisgKi8KKworCitpbnQgWDUwOVYzX0VYVF9hZGRfbmNvbmZfc2soQ09ORiAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzZWN0aW9uLAorCQkJICAgIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKnNrKQorCXsKKwlYNTA5X0VYVEVOU0lPTiAqZXh0OworCVNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsOworCUNPTkZfVkFMVUUgKnZhbDsJCisJaW50IGk7CisJaWYgKCEobnZhbCA9IE5DT05GX2dldF9zZWN0aW9uKGNvbmYsIHNlY3Rpb24pKSkgcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspCisJCXsKKwkJdmFsID0gc2tfQ09ORl9WQUxVRV92YWx1ZShudmFsLCBpKTsKKwkJaWYgKCEoZXh0ID0gWDUwOVYzX0VYVF9uY29uZihjb25mLCBjdHgsIHZhbC0+bmFtZSwgdmFsLT52YWx1ZSkpKQorCQkJCQkJCQlyZXR1cm4gMDsKKwkJaWYgKHNrKSBYNTA5djNfYWRkX2V4dChzaywgZXh0LCAtMSk7CisJCVg1MDlfRVhURU5TSU9OX2ZyZWUoZXh0KTsKKwkJfQorCXJldHVybiAxOworCX0KKworLyogQ29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGFkZCBleHRlbnNpb25zIHRvIGEgY2VydGlmaWNhdGUsIENSTCBhbmQgcmVxdWVzdCAqLworCitpbnQgWDUwOVYzX0VYVF9hZGRfbmNvbmYoQ09ORiAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzZWN0aW9uLAorCQkJIFg1MDkgKmNlcnQpCisJeworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKnNrID0gTlVMTDsKKwlpZiAoY2VydCkKKwkJc2sgPSAmY2VydC0+Y2VydF9pbmZvLT5leHRlbnNpb25zOworCXJldHVybiBYNTA5VjNfRVhUX2FkZF9uY29uZl9zayhjb25mLCBjdHgsIHNlY3Rpb24sIHNrKTsKKwl9CisKKy8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciBhIENSTCAqLworCitpbnQgWDUwOVYzX0VYVF9DUkxfYWRkX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwKKwkJCSAgICAgWDUwOV9DUkwgKmNybCkKKwl7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICoqc2sgPSBOVUxMOworCWlmIChjcmwpCisJCXNrID0gJmNybC0+Y3JsLT5leHRlbnNpb25zOworCXJldHVybiBYNTA5VjNfRVhUX2FkZF9uY29uZl9zayhjb25mLCBjdHgsIHNlY3Rpb24sIHNrKTsKKwl9CisKKy8qIEFkZCBleHRlbnNpb25zIHRvIGNlcnRpZmljYXRlIHJlcXVlc3QgKi8KKworaW50IFg1MDlWM19FWFRfUkVRX2FkZF9uY29uZihDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnNlY3Rpb24sCisJICAgICBYNTA5X1JFUSAqcmVxKQorCXsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dGxpc3QgPSBOVUxMLCAqKnNrID0gTlVMTDsKKwlpbnQgaTsKKwlpZiAocmVxKQorCQlzayA9ICZleHRsaXN0OworCWkgPSBYNTA5VjNfRVhUX2FkZF9uY29uZl9zayhjb25mLCBjdHgsIHNlY3Rpb24sIHNrKTsKKwlpZiAoIWkgfHwgIXNrKQorCQlyZXR1cm4gaTsKKwlpID0gWDUwOV9SRVFfYWRkX2V4dGVuc2lvbnMocmVxLCBleHRsaXN0KTsKKwlza19YNTA5X0VYVEVOU0lPTl9wb3BfZnJlZShleHRsaXN0LCBYNTA5X0VYVEVOU0lPTl9mcmVlKTsKKwlyZXR1cm4gaTsKKwl9CisKKy8qIENvbmZpZyBkYXRhYmFzZSBmdW5jdGlvbnMgKi8KKworY2hhciAqIFg1MDlWM19nZXRfc3RyaW5nKFg1MDlWM19DVFggKmN0eCwgY2hhciAqbmFtZSwgY2hhciAqc2VjdGlvbikKKwl7CisJaWYoIWN0eC0+ZGIgfHwgIWN0eC0+ZGJfbWV0aCB8fCAhY3R4LT5kYl9tZXRoLT5nZXRfc3RyaW5nKQorCQl7CisJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfR0VUX1NUUklORyxYNTA5VjNfUl9PUEVSQVRJT05fTk9UX0RFRklORUQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmIChjdHgtPmRiX21ldGgtPmdldF9zdHJpbmcpCisJCQlyZXR1cm4gY3R4LT5kYl9tZXRoLT5nZXRfc3RyaW5nKGN0eC0+ZGIsIG5hbWUsIHNlY3Rpb24pOworCXJldHVybiBOVUxMOworCX0KKworU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKiBYNTA5VjNfZ2V0X3NlY3Rpb24oWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzZWN0aW9uKQorCXsKKwlpZighY3R4LT5kYiB8fCAhY3R4LT5kYl9tZXRoIHx8ICFjdHgtPmRiX21ldGgtPmdldF9zZWN0aW9uKQorCQl7CisJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfR0VUX1NFQ1RJT04sWDUwOVYzX1JfT1BFUkFUSU9OX05PVF9ERUZJTkVEKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlpZiAoY3R4LT5kYl9tZXRoLT5nZXRfc2VjdGlvbikKKwkJCXJldHVybiBjdHgtPmRiX21ldGgtPmdldF9zZWN0aW9uKGN0eC0+ZGIsIHNlY3Rpb24pOworCXJldHVybiBOVUxMOworCX0KKwordm9pZCBYNTA5VjNfc3RyaW5nX2ZyZWUoWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzdHIpCisJeworCWlmICghc3RyKSByZXR1cm47CisJaWYgKGN0eC0+ZGJfbWV0aC0+ZnJlZV9zdHJpbmcpCisJCQljdHgtPmRiX21ldGgtPmZyZWVfc3RyaW5nKGN0eC0+ZGIsIHN0cik7CisJfQorCit2b2lkIFg1MDlWM19zZWN0aW9uX2ZyZWUoWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqc2VjdGlvbikKKwl7CisJaWYgKCFzZWN0aW9uKSByZXR1cm47CisJaWYgKGN0eC0+ZGJfbWV0aC0+ZnJlZV9zZWN0aW9uKQorCQkJY3R4LT5kYl9tZXRoLT5mcmVlX3NlY3Rpb24oY3R4LT5kYiwgc2VjdGlvbik7CisJfQorCitzdGF0aWMgY2hhciAqbmNvbmZfZ2V0X3N0cmluZyh2b2lkICpkYiwgY2hhciAqc2VjdGlvbiwgY2hhciAqdmFsdWUpCisJeworCXJldHVybiBOQ09ORl9nZXRfc3RyaW5nKGRiLCBzZWN0aW9uLCB2YWx1ZSk7CisJfQorCitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm5jb25mX2dldF9zZWN0aW9uKHZvaWQgKmRiLCBjaGFyICpzZWN0aW9uKQorCXsKKwlyZXR1cm4gTkNPTkZfZ2V0X3NlY3Rpb24oZGIsIHNlY3Rpb24pOworCX0KKworc3RhdGljIFg1MDlWM19DT05GX01FVEhPRCBuY29uZl9tZXRob2QgPSB7CituY29uZl9nZXRfc3RyaW5nLAorbmNvbmZfZ2V0X3NlY3Rpb24sCitOVUxMLAorTlVMTAorfTsKKwordm9pZCBYNTA5VjNfc2V0X25jb25mKFg1MDlWM19DVFggKmN0eCwgQ09ORiAqY29uZikKKwl7CisJY3R4LT5kYl9tZXRoID0gJm5jb25mX21ldGhvZDsKKwljdHgtPmRiID0gY29uZjsKKwl9CisKK3ZvaWQgWDUwOVYzX3NldF9jdHgoWDUwOVYzX0NUWCAqY3R4LCBYNTA5ICppc3N1ZXIsIFg1MDkgKnN1YmosIFg1MDlfUkVRICpyZXEsCisJCSAgICBYNTA5X0NSTCAqY3JsLCBpbnQgZmxhZ3MpCisJeworCWN0eC0+aXNzdWVyX2NlcnQgPSBpc3N1ZXI7CisJY3R4LT5zdWJqZWN0X2NlcnQgPSBzdWJqOworCWN0eC0+Y3JsID0gY3JsOworCWN0eC0+c3ViamVjdF9yZXEgPSByZXE7CisJY3R4LT5mbGFncyA9IGZsYWdzOworCX0KKworLyogT2xkIGNvbmYgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgKi8KKworWDUwOV9FWFRFTlNJT04gKlg1MDlWM19FWFRfY29uZihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LAorCQkJCWNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKQorCXsKKwlDT05GIGN0bXA7CisJQ09ORl9zZXRfbmNvbmYoJmN0bXAsIGNvbmYpOworCXJldHVybiBYNTA5VjNfRVhUX25jb25mKCZjdG1wLCBjdHgsIG5hbWUsIHZhbHVlKTsKKwl9CisKKy8qIExIQVNIICpjb25mOiAgQ29uZmlnIGZpbGUgICAgKi8KKy8qIGNoYXIgKnZhbHVlOiAgVmFsdWUgICAgKi8KK1g1MDlfRVhURU5TSU9OICpYNTA5VjNfRVhUX2NvbmZfbmlkKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkJICAgIGludCBleHRfbmlkLCBjaGFyICp2YWx1ZSkKKwl7CisJQ09ORiBjdG1wOworCUNPTkZfc2V0X25jb25mKCZjdG1wLCBjb25mKTsKKwlyZXR1cm4gWDUwOVYzX0VYVF9uY29uZl9uaWQoJmN0bXAsIGN0eCwgZXh0X25pZCwgdmFsdWUpOworCX0KKworc3RhdGljIGNoYXIgKmNvbmZfbGhhc2hfZ2V0X3N0cmluZyh2b2lkICpkYiwgY2hhciAqc2VjdGlvbiwgY2hhciAqdmFsdWUpCisJeworCXJldHVybiBDT05GX2dldF9zdHJpbmcoZGIsIHNlY3Rpb24sIHZhbHVlKTsKKwl9CisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqY29uZl9saGFzaF9nZXRfc2VjdGlvbih2b2lkICpkYiwgY2hhciAqc2VjdGlvbikKKwl7CisJcmV0dXJuIENPTkZfZ2V0X3NlY3Rpb24oZGIsIHNlY3Rpb24pOworCX0KKworc3RhdGljIFg1MDlWM19DT05GX01FVEhPRCBjb25mX2xoYXNoX21ldGhvZCA9IHsKK2NvbmZfbGhhc2hfZ2V0X3N0cmluZywKK2NvbmZfbGhhc2hfZ2V0X3NlY3Rpb24sCitOVUxMLAorTlVMTAorfTsKKwordm9pZCBYNTA5VjNfc2V0X2NvbmZfbGhhc2goWDUwOVYzX0NUWCAqY3R4LCBMSEFTSF9PRihDT05GX1ZBTFVFKSAqbGhhc2gpCisJeworCWN0eC0+ZGJfbWV0aCA9ICZjb25mX2xoYXNoX21ldGhvZDsKKwljdHgtPmRiID0gbGhhc2g7CisJfQorCitpbnQgWDUwOVYzX0VYVF9hZGRfY29uZihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LAorCQkJY2hhciAqc2VjdGlvbiwgWDUwOSAqY2VydCkKKwl7CisJQ09ORiBjdG1wOworCUNPTkZfc2V0X25jb25mKCZjdG1wLCBjb25mKTsKKwlyZXR1cm4gWDUwOVYzX0VYVF9hZGRfbmNvbmYoJmN0bXAsIGN0eCwgc2VjdGlvbiwgY2VydCk7CisJfQorCisvKiBTYW1lIGFzIGFib3ZlIGJ1dCBmb3IgYSBDUkwgKi8KKworaW50IFg1MDlWM19FWFRfQ1JMX2FkZF9jb25mKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkgICAgY2hhciAqc2VjdGlvbiwgWDUwOV9DUkwgKmNybCkKKwl7CisJQ09ORiBjdG1wOworCUNPTkZfc2V0X25jb25mKCZjdG1wLCBjb25mKTsKKwlyZXR1cm4gWDUwOVYzX0VYVF9DUkxfYWRkX25jb25mKCZjdG1wLCBjdHgsIHNlY3Rpb24sIGNybCk7CisJfQorCisvKiBBZGQgZXh0ZW5zaW9ucyB0byBjZXJ0aWZpY2F0ZSByZXF1ZXN0ICovCisKK2ludCBYNTA5VjNfRVhUX1JFUV9hZGRfY29uZihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgIGNoYXIgKnNlY3Rpb24sIFg1MDlfUkVRICpyZXEpCisJeworCUNPTkYgY3RtcDsKKwlDT05GX3NldF9uY29uZigmY3RtcCwgY29uZik7CisJcmV0dXJuIFg1MDlWM19FWFRfUkVRX2FkZF9uY29uZigmY3RtcCwgY3R4LCBzZWN0aW9uLCByZXEpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfY3BvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjA3OThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19jcG9scy5jCkBAIC0wLDAgKzEsNDU3IEBACisvKiB2M19jcG9scy5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA0IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKyNpbmNsdWRlICJwY3lfaW50LmgiCisKKy8qIENlcnRpZmljYXRlIHBvbGljaWVzIGV4dGVuc2lvbiBzdXBwb3J0OiB0aGlzIG9uZSBpcyBhIGJpdCBjb21wbGV4Li4uICovCisKK3N0YXRpYyBpbnQgaTJyX2NlcnRwb2woWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgU1RBQ0tfT0YoUE9MSUNZSU5GTykgKnBvbCwgQklPICpvdXQsIGludCBpbmRlbnQpOworc3RhdGljIFNUQUNLX09GKFBPTElDWUlORk8pICpyMmlfY2VydHBvbChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnZhbHVlKTsKK3N0YXRpYyB2b2lkIHByaW50X3F1YWxpZmllcnMoQklPICpvdXQsIFNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqcXVhbHMsIGludCBpbmRlbnQpOworc3RhdGljIHZvaWQgcHJpbnRfbm90aWNlKEJJTyAqb3V0LCBVU0VSTk9USUNFICpub3RpY2UsIGludCBpbmRlbnQpOworc3RhdGljIFBPTElDWUlORk8gKnBvbGljeV9zZWN0aW9uKFg1MDlWM19DVFggKmN0eCwKKwkJCQkgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnBvbHN0cnMsIGludCBpYTVvcmcpOworc3RhdGljIFBPTElDWVFVQUxJTkZPICpub3RpY2Vfc2VjdGlvbihYNTA5VjNfQ1RYICpjdHgsCisJCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICp1bm90LCBpbnQgaWE1b3JnKTsKK3N0YXRpYyBpbnQgbnJlZl9ub3MoU1RBQ0tfT0YoQVNOMV9JTlRFR0VSKSAqbm51bXMsIFNUQUNLX09GKENPTkZfVkFMVUUpICpub3MpOworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19jcG9scyA9IHsKK05JRF9jZXJ0aWZpY2F0ZV9wb2xpY2llcywgMCxBU04xX0lURU1fcmVmKENFUlRJRklDQVRFUE9MSUNJRVMpLAorMCwwLDAsMCwKKzAsMCwKKzAsMCwKKyhYNTA5VjNfRVhUX0kyUilpMnJfY2VydHBvbCwKKyhYNTA5VjNfRVhUX1IySSlyMmlfY2VydHBvbCwKK05VTEwKK307CisKK0FTTjFfSVRFTV9URU1QTEFURShDRVJUSUZJQ0FURVBPTElDSUVTKSA9IAorCUFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIENFUlRJRklDQVRFUE9MSUNJRVMsIFBPTElDWUlORk8pCitBU04xX0lURU1fVEVNUExBVEVfRU5EKENFUlRJRklDQVRFUE9MSUNJRVMpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhDRVJUSUZJQ0FURVBPTElDSUVTKQorCitBU04xX1NFUVVFTkNFKFBPTElDWUlORk8pID0geworCUFTTjFfU0lNUExFKFBPTElDWUlORk8sIHBvbGljeWlkLCBBU04xX09CSkVDVCksCisJQVNOMV9TRVFVRU5DRV9PRl9PUFQoUE9MSUNZSU5GTywgcXVhbGlmaWVycywgUE9MSUNZUVVBTElORk8pCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBPTElDWUlORk8pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQT0xJQ1lJTkZPKQorCitBU04xX0FEQl9URU1QTEFURShwb2xpY3lkZWZhdWx0KSA9IEFTTjFfU0lNUExFKFBPTElDWVFVQUxJTkZPLCBkLm90aGVyLCBBU04xX0FOWSk7CisKK0FTTjFfQURCKFBPTElDWVFVQUxJTkZPKSA9IHsKKwlBREJfRU5UUlkoTklEX2lkX3F0X2NwcywgQVNOMV9TSU1QTEUoUE9MSUNZUVVBTElORk8sIGQuY3BzdXJpLCBBU04xX0lBNVNUUklORykpLAorCUFEQl9FTlRSWShOSURfaWRfcXRfdW5vdGljZSwgQVNOMV9TSU1QTEUoUE9MSUNZUVVBTElORk8sIGQudXNlcm5vdGljZSwgVVNFUk5PVElDRSkpCit9IEFTTjFfQURCX0VORChQT0xJQ1lRVUFMSU5GTywgMCwgcHF1YWxpZCwgMCwgJnBvbGljeWRlZmF1bHRfdHQsIE5VTEwpOworCitBU04xX1NFUVVFTkNFKFBPTElDWVFVQUxJTkZPKSA9IHsKKwlBU04xX1NJTVBMRShQT0xJQ1lRVUFMSU5GTywgcHF1YWxpZCwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfQURCX09CSkVDVChQT0xJQ1lRVUFMSU5GTykKK30gQVNOMV9TRVFVRU5DRV9FTkQoUE9MSUNZUVVBTElORk8pCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQT0xJQ1lRVUFMSU5GTykKKworQVNOMV9TRVFVRU5DRShVU0VSTk9USUNFKSA9IHsKKwlBU04xX09QVChVU0VSTk9USUNFLCBub3RpY2VyZWYsIE5PVElDRVJFRiksCisJQVNOMV9PUFQoVVNFUk5PVElDRSwgZXhwdGV4dCwgRElTUExBWVRFWFQpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFVTRVJOT1RJQ0UpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhVU0VSTk9USUNFKQorCitBU04xX1NFUVVFTkNFKE5PVElDRVJFRikgPSB7CisJQVNOMV9TSU1QTEUoTk9USUNFUkVGLCBvcmdhbml6YXRpb24sIERJU1BMQVlURVhUKSwKKwlBU04xX1NFUVVFTkNFX09GKE5PVElDRVJFRiwgbm90aWNlbm9zLCBBU04xX0lOVEVHRVIpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE5PVElDRVJFRikKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKE5PVElDRVJFRikKKworc3RhdGljIFNUQUNLX09GKFBPTElDWUlORk8pICpyMmlfY2VydHBvbChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQlYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnZhbHVlKQoreworCVNUQUNLX09GKFBPTElDWUlORk8pICpwb2xzID0gTlVMTDsKKwljaGFyICpwc3RyOworCVBPTElDWUlORk8gKnBvbDsKKwlBU04xX09CSkVDVCAqcG9iajsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsczsKKwlDT05GX1ZBTFVFICpjbmY7CisJaW50IGksIGlhNW9yZzsKKwlwb2xzID0gc2tfUE9MSUNZSU5GT19uZXdfbnVsbCgpOworCWlmIChwb2xzID09IE5VTEwpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9DRVJUUE9MLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwl2YWxzID0gIFg1MDlWM19wYXJzZV9saXN0KHZhbHVlKTsKKwlpZiAodmFscyA9PSBOVUxMKSB7CisJCVg1MDlWM2VycihYNTA5VjNfRl9SMklfQ0VSVFBPTCwgRVJSX1JfWDUwOVYzX0xJQik7CisJCWdvdG8gZXJyOworCX0KKwlpYTVvcmcgPSAwOworCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKHZhbHMpOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZSh2YWxzLCBpKTsKKwkJaWYoY25mLT52YWx1ZSB8fCAhY25mLT5uYW1lICkgeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9DRVJUUE9MLFg1MDlWM19SX0lOVkFMSURfUE9MSUNZX0lERU5USUZJRVIpOworCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CisJCQlnb3RvIGVycjsKKwkJfQorCQlwc3RyID0gY25mLT5uYW1lOworCQlpZighc3RyY21wKHBzdHIsImlhNW9yZyIpKSB7CisJCQlpYTVvcmcgPSAxOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZigqcHN0ciA9PSAnQCcpIHsKKwkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpwb2xzZWN0OworCQkJcG9sc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIHBzdHIgKyAxKTsKKwkJCWlmKCFwb2xzZWN0KSB7CisJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9DRVJUUE9MLFg1MDlWM19SX0lOVkFMSURfU0VDVElPTik7CisKKwkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXBvbCA9IHBvbGljeV9zZWN0aW9uKGN0eCwgcG9sc2VjdCwgaWE1b3JnKTsKKwkJCVg1MDlWM19zZWN0aW9uX2ZyZWUoY3R4LCBwb2xzZWN0KTsKKwkJCWlmKCFwb2wpIGdvdG8gZXJyOworCQl9IGVsc2UgeworCQkJaWYoIShwb2JqID0gT0JKX3R4dDJvYmooY25mLT5uYW1lLCAwKSkpIHsKKwkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX0NFUlRQT0wsWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlwb2wgPSBQT0xJQ1lJTkZPX25ldygpOworCQkJcG9sLT5wb2xpY3lpZCA9IHBvYmo7CisJCX0KKwkJaWYgKCFza19QT0xJQ1lJTkZPX3B1c2gocG9scywgcG9sKSl7CisJCQlQT0xJQ1lJTkZPX2ZyZWUocG9sKTsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9SMklfQ0VSVFBPTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisJc2tfQ09ORl9WQUxVRV9wb3BfZnJlZSh2YWxzLCBYNTA5VjNfY29uZl9mcmVlKTsKKwlyZXR1cm4gcG9sczsKKwllcnI6CisJc2tfQ09ORl9WQUxVRV9wb3BfZnJlZSh2YWxzLCBYNTA5VjNfY29uZl9mcmVlKTsKKwlza19QT0xJQ1lJTkZPX3BvcF9mcmVlKHBvbHMsIFBPTElDWUlORk9fZnJlZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBQT0xJQ1lJTkZPICpwb2xpY3lfc2VjdGlvbihYNTA5VjNfQ1RYICpjdHgsCisJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnBvbHN0cnMsIGludCBpYTVvcmcpCit7CisJaW50IGk7CisJQ09ORl9WQUxVRSAqY25mOworCVBPTElDWUlORk8gKnBvbDsKKwlQT0xJQ1lRVUFMSU5GTyAqcXVhbDsKKwlpZighKHBvbCA9IFBPTElDWUlORk9fbmV3KCkpKSBnb3RvIG1lcnI7CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0ocG9sc3Rycyk7IGkrKykgeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHBvbHN0cnMsIGkpOworCQlpZighc3RyY21wKGNuZi0+bmFtZSwgInBvbGljeUlkZW50aWZpZXIiKSkgeworCQkJQVNOMV9PQkpFQ1QgKnBvYmo7CisJCQlpZighKHBvYmogPSBPQkpfdHh0Mm9iaihjbmYtPnZhbHVlLCAwKSkpIHsKKwkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUE9MSUNZX1NFQ1RJT04sWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlwb2wtPnBvbGljeWlkID0gcG9iajsKKworCQl9IGVsc2UgaWYoIW5hbWVfY21wKGNuZi0+bmFtZSwgIkNQUyIpKSB7CisJCQlpZighcG9sLT5xdWFsaWZpZXJzKSBwb2wtPnF1YWxpZmllcnMgPQorCQkJCQkJIHNrX1BPTElDWVFVQUxJTkZPX25ld19udWxsKCk7CisJCQlpZighKHF1YWwgPSBQT0xJQ1lRVUFMSU5GT19uZXcoKSkpIGdvdG8gbWVycjsKKwkJCWlmKCFza19QT0xJQ1lRVUFMSU5GT19wdXNoKHBvbC0+cXVhbGlmaWVycywgcXVhbCkpCisJCQkJCQkJCSBnb3RvIG1lcnI7CisJCQlxdWFsLT5wcXVhbGlkID0gT0JKX25pZDJvYmooTklEX2lkX3F0X2Nwcyk7CisJCQlxdWFsLT5kLmNwc3VyaSA9IE1fQVNOMV9JQTVTVFJJTkdfbmV3KCk7CisJCQlpZighQVNOMV9TVFJJTkdfc2V0KHF1YWwtPmQuY3BzdXJpLCBjbmYtPnZhbHVlLAorCQkJCQkJIHN0cmxlbihjbmYtPnZhbHVlKSkpIGdvdG8gbWVycjsKKwkJfSBlbHNlIGlmKCFuYW1lX2NtcChjbmYtPm5hbWUsICJ1c2VyTm90aWNlIikpIHsKKwkJCVNUQUNLX09GKENPTkZfVkFMVUUpICp1bm90OworCQkJaWYoKmNuZi0+dmFsdWUgIT0gJ0AnKSB7CisJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BPTElDWV9TRUNUSU9OLFg1MDlWM19SX0VYUEVDVEVEX0FfU0VDVElPTl9OQU1FKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXVub3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPnZhbHVlICsgMSk7CisJCQlpZighdW5vdCkgeworCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QT0xJQ1lfU0VDVElPTixYNTA5VjNfUl9JTlZBTElEX1NFQ1RJT04pOworCisJCQkJWDUwOVYzX2NvbmZfZXJyKGNuZik7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlxdWFsID0gbm90aWNlX3NlY3Rpb24oY3R4LCB1bm90LCBpYTVvcmcpOworCQkJWDUwOVYzX3NlY3Rpb25fZnJlZShjdHgsIHVub3QpOworCQkJaWYoIXF1YWwpIGdvdG8gZXJyOworCQkJaWYoIXBvbC0+cXVhbGlmaWVycykgcG9sLT5xdWFsaWZpZXJzID0KKwkJCQkJCSBza19QT0xJQ1lRVUFMSU5GT19uZXdfbnVsbCgpOworCQkJaWYoIXNrX1BPTElDWVFVQUxJTkZPX3B1c2gocG9sLT5xdWFsaWZpZXJzLCBxdWFsKSkKKwkJCQkJCQkJIGdvdG8gbWVycjsKKwkJfSBlbHNlIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9QT0xJQ1lfU0VDVElPTixYNTA5VjNfUl9JTlZBTElEX09QVElPTik7CisKKwkJCVg1MDlWM19jb25mX2VycihjbmYpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisJaWYoIXBvbC0+cG9saWN5aWQpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1BPTElDWV9TRUNUSU9OLFg1MDlWM19SX05PX1BPTElDWV9JREVOVElGSUVSKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHBvbDsKKworCW1lcnI6CisJWDUwOVYzZXJyKFg1MDlWM19GX1BPTElDWV9TRUNUSU9OLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKworCWVycjoKKwlQT0xJQ1lJTkZPX2ZyZWUocG9sKTsKKwlyZXR1cm4gTlVMTDsKKwkKKwkKK30KKworc3RhdGljIFBPTElDWVFVQUxJTkZPICpub3RpY2Vfc2VjdGlvbihYNTA5VjNfQ1RYICpjdHgsCisJCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICp1bm90LCBpbnQgaWE1b3JnKQoreworCWludCBpLCByZXQ7CisJQ09ORl9WQUxVRSAqY25mOworCVVTRVJOT1RJQ0UgKm5vdDsKKwlQT0xJQ1lRVUFMSU5GTyAqcXVhbDsKKwlpZighKHF1YWwgPSBQT0xJQ1lRVUFMSU5GT19uZXcoKSkpIGdvdG8gbWVycjsKKwlxdWFsLT5wcXVhbGlkID0gT0JKX25pZDJvYmooTklEX2lkX3F0X3Vub3RpY2UpOworCWlmKCEobm90ID0gVVNFUk5PVElDRV9uZXcoKSkpIGdvdG8gbWVycjsKKwlxdWFsLT5kLnVzZXJub3RpY2UgPSBub3Q7CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0odW5vdCk7IGkrKykgeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKHVub3QsIGkpOworCQlpZighc3RyY21wKGNuZi0+bmFtZSwgImV4cGxpY2l0VGV4dCIpKSB7CisJCQlub3QtPmV4cHRleHQgPSBNX0FTTjFfVklTSUJMRVNUUklOR19uZXcoKTsKKwkJCWlmKCFBU04xX1NUUklOR19zZXQobm90LT5leHB0ZXh0LCBjbmYtPnZhbHVlLAorCQkJCQkJIHN0cmxlbihjbmYtPnZhbHVlKSkpIGdvdG8gbWVycjsKKwkJfSBlbHNlIGlmKCFzdHJjbXAoY25mLT5uYW1lLCAib3JnYW5pemF0aW9uIikpIHsKKwkJCU5PVElDRVJFRiAqbnJlZjsKKwkJCWlmKCFub3QtPm5vdGljZXJlZikgeworCQkJCWlmKCEobnJlZiA9IE5PVElDRVJFRl9uZXcoKSkpIGdvdG8gbWVycjsKKwkJCQlub3QtPm5vdGljZXJlZiA9IG5yZWY7CisJCQl9IGVsc2UgbnJlZiA9IG5vdC0+bm90aWNlcmVmOworCQkJaWYoaWE1b3JnKSBucmVmLT5vcmdhbml6YXRpb24tPnR5cGUgPSBWX0FTTjFfSUE1U1RSSU5HOworCQkJZWxzZSBucmVmLT5vcmdhbml6YXRpb24tPnR5cGUgPSBWX0FTTjFfVklTSUJMRVNUUklORzsKKwkJCWlmKCFBU04xX1NUUklOR19zZXQobnJlZi0+b3JnYW5pemF0aW9uLCBjbmYtPnZhbHVlLAorCQkJCQkJIHN0cmxlbihjbmYtPnZhbHVlKSkpIGdvdG8gbWVycjsKKwkJfSBlbHNlIGlmKCFzdHJjbXAoY25mLT5uYW1lLCAibm90aWNlTnVtYmVycyIpKSB7CisJCQlOT1RJQ0VSRUYgKm5yZWY7CisJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqbm9zOworCQkJaWYoIW5vdC0+bm90aWNlcmVmKSB7CisJCQkJaWYoIShucmVmID0gTk9USUNFUkVGX25ldygpKSkgZ290byBtZXJyOworCQkJCW5vdC0+bm90aWNlcmVmID0gbnJlZjsKKwkJCX0gZWxzZSBucmVmID0gbm90LT5ub3RpY2VyZWY7CisJCQlub3MgPSBYNTA5VjNfcGFyc2VfbGlzdChjbmYtPnZhbHVlKTsKKwkJCWlmKCFub3MgfHwgIXNrX0NPTkZfVkFMVUVfbnVtKG5vcykpIHsKKwkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfTk9USUNFX1NFQ1RJT04sWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVJTKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXJldCA9IG5yZWZfbm9zKG5yZWYtPm5vdGljZW5vcywgbm9zKTsKKwkJCXNrX0NPTkZfVkFMVUVfcG9wX2ZyZWUobm9zLCBYNTA5VjNfY29uZl9mcmVlKTsKKwkJCWlmICghcmV0KQorCQkJCWdvdG8gZXJyOworCQl9IGVsc2UgeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX05PVElDRV9TRUNUSU9OLFg1MDlWM19SX0lOVkFMSURfT1BUSU9OKTsKKwkJCVg1MDlWM19jb25mX2VycihjbmYpOworCQkJZ290byBlcnI7CisJCX0KKwl9CisKKwlpZihub3QtPm5vdGljZXJlZiAmJiAKKwkgICAgICAoIW5vdC0+bm90aWNlcmVmLT5ub3RpY2Vub3MgfHwgIW5vdC0+bm90aWNlcmVmLT5vcmdhbml6YXRpb24pKSB7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfTk9USUNFX1NFQ1RJT04sWDUwOVYzX1JfTkVFRF9PUkdBTklaQVRJT05fQU5EX05VTUJFUlMpOworCQkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIHF1YWw7CisKKwltZXJyOgorCVg1MDlWM2VycihYNTA5VjNfRl9OT1RJQ0VfU0VDVElPTixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisKKwllcnI6CisJUE9MSUNZUVVBTElORk9fZnJlZShxdWFsKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBucmVmX25vcyhTVEFDS19PRihBU04xX0lOVEVHRVIpICpubnVtcywgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm5vcykKK3sKKwlDT05GX1ZBTFVFICpjbmY7CisJQVNOMV9JTlRFR0VSICphaW50OworCisJaW50IGk7CisKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShub3MpOyBpKyspIHsKKwkJY25mID0gc2tfQ09ORl9WQUxVRV92YWx1ZShub3MsIGkpOworCQlpZighKGFpbnQgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIGNuZi0+bmFtZSkpKSB7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfTlJFRl9OT1MsWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVIpOworCQkJZ290byBlcnI7CisJCX0KKwkJaWYoIXNrX0FTTjFfSU5URUdFUl9wdXNoKG5udW1zLCBhaW50KSkgZ290byBtZXJyOworCX0KKwlyZXR1cm4gMTsKKworCW1lcnI6CisJWDUwOVYzZXJyKFg1MDlWM19GX05SRUZfTk9TLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKworCWVycjoKKwlza19BU04xX0lOVEVHRVJfcG9wX2ZyZWUobm51bXMsIEFTTjFfU1RSSU5HX2ZyZWUpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgaTJyX2NlcnRwb2woWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgU1RBQ0tfT0YoUE9MSUNZSU5GTykgKnBvbCwKKwkJQklPICpvdXQsIGludCBpbmRlbnQpCit7CisJaW50IGk7CisJUE9MSUNZSU5GTyAqcGluZm87CisJLyogRmlyc3QgcHJpbnQgb3V0IHRoZSBwb2xpY3kgT0lEcyAqLworCWZvcihpID0gMDsgaSA8IHNrX1BPTElDWUlORk9fbnVtKHBvbCk7IGkrKykgeworCQlwaW5mbyA9IHNrX1BPTElDWUlORk9fdmFsdWUocG9sLCBpKTsKKwkJQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3k6ICIsIGluZGVudCwgIiIpOworCQlpMmFfQVNOMV9PQkpFQ1Qob3V0LCBwaW5mby0+cG9saWN5aWQpOworCQlCSU9fcHV0cyhvdXQsICJcbiIpOworCQlpZihwaW5mby0+cXVhbGlmaWVycykKKwkJCSBwcmludF9xdWFsaWZpZXJzKG91dCwgcGluZm8tPnF1YWxpZmllcnMsIGluZGVudCArIDIpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcXVhbGlmaWVycyhCSU8gKm91dCwgU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICpxdWFscywKKwkJaW50IGluZGVudCkKK3sKKwlQT0xJQ1lRVUFMSU5GTyAqcXVhbGluZm87CisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgc2tfUE9MSUNZUVVBTElORk9fbnVtKHF1YWxzKTsgaSsrKSB7CisJCXF1YWxpbmZvID0gc2tfUE9MSUNZUVVBTElORk9fdmFsdWUocXVhbHMsIGkpOworCQlzd2l0Y2goT0JKX29iajJuaWQocXVhbGluZm8tPnBxdWFsaWQpKQorCQl7CisJCQljYXNlIE5JRF9pZF9xdF9jcHM6CisJCQlCSU9fcHJpbnRmKG91dCwgIiUqc0NQUzogJXNcbiIsIGluZGVudCwgIiIsCisJCQkJCQlxdWFsaW5mby0+ZC5jcHN1cmktPmRhdGEpOworCQkJYnJlYWs7CisJCQorCQkJY2FzZSBOSURfaWRfcXRfdW5vdGljZToKKwkJCUJJT19wcmludGYob3V0LCAiJSpzVXNlciBOb3RpY2U6XG4iLCBpbmRlbnQsICIiKTsKKwkJCXByaW50X25vdGljZShvdXQsIHF1YWxpbmZvLT5kLnVzZXJub3RpY2UsIGluZGVudCArIDIpOworCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQlCSU9fcHJpbnRmKG91dCwgIiUqc1Vua25vd24gUXVhbGlmaWVyOiAiLAorCQkJCQkJCSBpbmRlbnQgKyAyLCAiIik7CisJCQkKKwkJCWkyYV9BU04xX09CSkVDVChvdXQsIHF1YWxpbmZvLT5wcXVhbGlkKTsKKwkJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfbm90aWNlKEJJTyAqb3V0LCBVU0VSTk9USUNFICpub3RpY2UsIGludCBpbmRlbnQpCit7CisJaW50IGk7CisJaWYobm90aWNlLT5ub3RpY2VyZWYpIHsKKwkJTk9USUNFUkVGICpyZWY7CisJCXJlZiA9IG5vdGljZS0+bm90aWNlcmVmOworCQlCSU9fcHJpbnRmKG91dCwgIiUqc09yZ2FuaXphdGlvbjogJXNcbiIsIGluZGVudCwgIiIsCisJCQkJCQkgcmVmLT5vcmdhbml6YXRpb24tPmRhdGEpOworCQlCSU9fcHJpbnRmKG91dCwgIiUqc051bWJlciVzOiAiLCBpbmRlbnQsICIiLAorCQkJICAgc2tfQVNOMV9JTlRFR0VSX251bShyZWYtPm5vdGljZW5vcykgPiAxID8gInMiIDogIiIpOworCQlmb3IoaSA9IDA7IGkgPCBza19BU04xX0lOVEVHRVJfbnVtKHJlZi0+bm90aWNlbm9zKTsgaSsrKSB7CisJCQlBU04xX0lOVEVHRVIgKm51bTsKKwkJCWNoYXIgKnRtcDsKKwkJCW51bSA9IHNrX0FTTjFfSU5URUdFUl92YWx1ZShyZWYtPm5vdGljZW5vcywgaSk7CisJCQlpZihpKSBCSU9fcHV0cyhvdXQsICIsICIpOworCQkJdG1wID0gaTJzX0FTTjFfSU5URUdFUihOVUxMLCBudW0pOworCQkJQklPX3B1dHMob3V0LCB0bXApOworCQkJT1BFTlNTTF9mcmVlKHRtcCk7CisJCX0KKwkJQklPX3B1dHMob3V0LCAiXG4iKTsKKwl9CisJaWYobm90aWNlLT5leHB0ZXh0KQorCQlCSU9fcHJpbnRmKG91dCwgIiUqc0V4cGxpY2l0IFRleHQ6ICVzXG4iLCBpbmRlbnQsICIiLAorCQkJCQkJCSBub3RpY2UtPmV4cHRleHQtPmRhdGEpOworfQorCit2b2lkIFg1MDlfUE9MSUNZX05PREVfcHJpbnQoQklPICpvdXQsIFg1MDlfUE9MSUNZX05PREUgKm5vZGUsIGludCBpbmRlbnQpCisJeworCWNvbnN0IFg1MDlfUE9MSUNZX0RBVEEgKmRhdCA9IG5vZGUtPmRhdGE7CisKKwlCSU9fcHJpbnRmKG91dCwgIiUqc1BvbGljeTogIiwgaW5kZW50LCAiIik7CisJCQkKKwlpMmFfQVNOMV9PQkpFQ1Qob3V0LCBkYXQtPnZhbGlkX3BvbGljeSk7CisJQklPX3B1dHMob3V0LCAiXG4iKTsKKwlCSU9fcHJpbnRmKG91dCwgIiUqcyVzXG4iLCBpbmRlbnQgKyAyLCAiIiwKKwkJbm9kZV9kYXRhX2NyaXRpY2FsKGRhdCkgPyAiQ3JpdGljYWwiIDogIk5vbiBDcml0aWNhbCIpOworCWlmIChkYXQtPnF1YWxpZmllcl9zZXQpCisJCXByaW50X3F1YWxpZmllcnMob3V0LCBkYXQtPnF1YWxpZmllcl9zZXQsIGluZGVudCArIDIpOworCWVsc2UKKwkJQklPX3ByaW50ZihvdXQsICIlKnNObyBRdWFsaWZpZXJzXG4iLCBpbmRlbnQgKyAyLCAiIik7CisJfQorCisKK0lNUExFTUVOVF9TVEFDS19PRihYNTA5X1BPTElDWV9OT0RFKQorSU1QTEVNRU5UX1NUQUNLX09GKFg1MDlfUE9MSUNZX0RBVEEpCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfY3JsZC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19jcmxkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwYTZkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfY3JsZC5jCkBAIC0wLDAgKzEsNjE2IEBACisvKiB2M19jcmxkLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDggVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIHZvaWQgKnYyaV9jcmxkKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCSAgICAgIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpOworc3RhdGljIGludCBpMnJfY3JsZHAoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqcGNybGRwLCBCSU8gKm91dCwKKwkJICAgICBpbnQgaW5kZW50KTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfY3JsZCA9CisJeworCU5JRF9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cywgMCwgQVNOMV9JVEVNX3JlZihDUkxfRElTVF9QT0lOVFMpLAorCTAsMCwwLDAsCisJMCwwLAorCTAsCisJdjJpX2NybGQsCisJaTJyX2NybGRwLDAsCisJTlVMTAorCX07CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2ZyZXNoZXN0X2NybCA9CisJeworCU5JRF9mcmVzaGVzdF9jcmwsIDAsIEFTTjFfSVRFTV9yZWYoQ1JMX0RJU1RfUE9JTlRTKSwKKwkwLDAsMCwwLAorCTAsMCwKKwkwLAorCXYyaV9jcmxkLAorCWkycl9jcmxkcCwwLAorCU5VTEwKKwl9OworCitzdGF0aWMgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqZ25hbWVzX2Zyb21fc2VjdG5hbWUoWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzZWN0KQorCXsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqZ25zZWN0OworCVNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKmdlbnM7CisJaWYgKCpzZWN0ID09ICdAJykKKwkJZ25zZWN0ID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgc2VjdCArIDEpOworCWVsc2UKKwkJZ25zZWN0ID0gWDUwOVYzX3BhcnNlX2xpc3Qoc2VjdCk7CisJaWYgKCFnbnNlY3QpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX0dOQU1FU19GUk9NX1NFQ1ROQU1FLAorCQkJCQkJWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWdlbnMgPSB2MmlfR0VORVJBTF9OQU1FUyhOVUxMLCBjdHgsIGduc2VjdCk7CisJaWYgKCpzZWN0ID09ICdAJykKKwkJWDUwOVYzX3NlY3Rpb25fZnJlZShjdHgsIGduc2VjdCk7CisJZWxzZQorCQlza19DT05GX1ZBTFVFX3BvcF9mcmVlKGduc2VjdCwgWDUwOVYzX2NvbmZfZnJlZSk7CisJcmV0dXJuIGdlbnM7CisJfQorCitzdGF0aWMgaW50IHNldF9kaXN0X3BvaW50X25hbWUoRElTVF9QT0lOVF9OQU1FICoqcGRwLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkJCQkJQ09ORl9WQUxVRSAqY25mKQorCXsKKwlTVEFDS19PRihHRU5FUkFMX05BTUUpICpmbm0gPSBOVUxMOworCVNUQUNLX09GKFg1MDlfTkFNRV9FTlRSWSkgKnJubSA9IE5VTEw7CisJaWYgKCFzdHJuY21wKGNuZi0+bmFtZSwgImZ1bGxuYW1lIiwgOSkpCisJCXsKKwkJZm5tID0gZ25hbWVzX2Zyb21fc2VjdG5hbWUoY3R4LCBjbmYtPnZhbHVlKTsKKwkJaWYgKCFmbm0pCisJCQlnb3RvIGVycjsKKwkJfQorCWVsc2UgaWYgKCFzdHJjbXAoY25mLT5uYW1lLCAicmVsYXRpdmVuYW1lIikpCisJCXsKKwkJaW50IHJldDsKKwkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmRuc2VjdDsKKwkJWDUwOV9OQU1FICpubTsKKwkJbm0gPSBYNTA5X05BTUVfbmV3KCk7CisJCWlmICghbm0pCisJCQlyZXR1cm4gLTE7CisJCWRuc2VjdCA9IFg1MDlWM19nZXRfc2VjdGlvbihjdHgsIGNuZi0+dmFsdWUpOworCQlpZiAoIWRuc2VjdCkKKwkJCXsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9TRVRfRElTVF9QT0lOVF9OQU1FLAorCQkJCQkJWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlyZXQgPSBYNTA5VjNfTkFNRV9mcm9tX3NlY3Rpb24obm0sIGRuc2VjdCwgTUJTVFJJTkdfQVNDKTsKKwkJWDUwOVYzX3NlY3Rpb25fZnJlZShjdHgsIGRuc2VjdCk7CisJCXJubSA9IG5tLT5lbnRyaWVzOworCQlubS0+ZW50cmllcyA9IE5VTEw7CisJCVg1MDlfTkFNRV9mcmVlKG5tKTsKKwkJaWYgKCFyZXQgfHwgc2tfWDUwOV9OQU1FX0VOVFJZX251bShybm0pIDw9IDApCisJCQlnb3RvIGVycjsKKwkJLyogU2luY2UgaXRzIGEgbmFtZSBmcmFnbWVudCBjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUKKwkJICogUkROU2VxdWVuY2UKKwkJICovCisJCWlmIChza19YNTA5X05BTUVfRU5UUllfdmFsdWUocm5tLAorCQkJCXNrX1g1MDlfTkFNRV9FTlRSWV9udW0ocm5tKSAtIDEpLT5zZXQpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfU0VUX0RJU1RfUE9JTlRfTkFNRSwKKwkJCQkJCVg1MDlWM19SX0lOVkFMSURfTVVMVElQTEVfUkROUyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoKnBkcCkKKwkJeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfU0VUX0RJU1RfUE9JTlRfTkFNRSwKKwkJCQkJCVg1MDlWM19SX0RJU1RQT0lOVF9BTFJFQURZX1NFVCk7CisJCWdvdG8gZXJyOworCQl9CisKKwkqcGRwID0gRElTVF9QT0lOVF9OQU1FX25ldygpOworCWlmICghKnBkcCkKKwkJZ290byBlcnI7CisJaWYgKGZubSkKKwkJeworCQkoKnBkcCktPnR5cGUgPSAwOworCQkoKnBkcCktPm5hbWUuZnVsbG5hbWUgPSBmbm07CisJCX0KKwllbHNlCisJCXsKKwkJKCpwZHApLT50eXBlID0gMTsKKwkJKCpwZHApLT5uYW1lLnJlbGF0aXZlbmFtZSA9IHJubTsKKwkJfQorCisJcmV0dXJuIDE7CisJCQorCWVycjoKKwlpZiAoZm5tKQorCQlza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoZm5tLCBHRU5FUkFMX05BTUVfZnJlZSk7CisJaWYgKHJubSkKKwkJc2tfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKHJubSwgWDUwOV9OQU1FX0VOVFJZX2ZyZWUpOworCXJldHVybiAtMTsKKwl9CisKK3N0YXRpYyBjb25zdCBCSVRfU1RSSU5HX0JJVE5BTUUgcmVhc29uX2ZsYWdzW10gPSB7Cit7MCwgIlVudXNlZCIsICJ1bnVzZWQifSwKK3sxLCAiS2V5IENvbXByb21pc2UiLCAia2V5Q29tcHJvbWlzZSJ9LAorezIsICJDQSBDb21wcm9taXNlIiwgIkNBQ29tcHJvbWlzZSJ9LAorezMsICJBZmZpbGlhdGlvbiBDaGFuZ2VkIiwgImFmZmlsaWF0aW9uQ2hhbmdlZCJ9LAorezQsICJTdXBlcnNlZGVkIiwgInN1cGVyc2VkZWQifSwKK3s1LCAiQ2Vzc2F0aW9uIE9mIE9wZXJhdGlvbiIsICJjZXNzYXRpb25PZk9wZXJhdGlvbiJ9LAorezYsICJDZXJ0aWZpY2F0ZSBIb2xkIiwgImNlcnRpZmljYXRlSG9sZCJ9LAorezcsICJQcml2aWxlZ2UgV2l0aGRyYXduIiwgInByaXZpbGVnZVdpdGhkcmF3biJ9LAorezgsICJBQSBDb21wcm9taXNlIiwgIkFBQ29tcHJvbWlzZSJ9LAorey0xLCBOVUxMLCBOVUxMfQorfTsKKworc3RhdGljIGludCBzZXRfcmVhc29ucyhBU04xX0JJVF9TVFJJTkcgKipwcmVhcywgY2hhciAqdmFsdWUpCisJeworCVNUQUNLX09GKENPTkZfVkFMVUUpICpyc2sgPSBOVUxMOworCWNvbnN0IEJJVF9TVFJJTkdfQklUTkFNRSAqcGJuOworCWNvbnN0IGNoYXIgKmJuYW07CisJaW50IGksIHJldCA9IDA7CisJcnNrID0gWDUwOVYzX3BhcnNlX2xpc3QodmFsdWUpOworCWlmICghcnNrKQorCQlyZXR1cm4gMDsKKwlpZiAoKnByZWFzKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0ocnNrKTsgaSsrKQorCQl7CisJCWJuYW0gPSBza19DT05GX1ZBTFVFX3ZhbHVlKHJzaywgaSktPm5hbWU7CisJCWlmICghKnByZWFzKQorCQkJeworCQkJKnByZWFzID0gQVNOMV9CSVRfU1RSSU5HX25ldygpOworCQkJaWYgKCEqcHJlYXMpCisJCQkJZ290byBlcnI7CisJCQl9CisJCWZvciAocGJuID0gcmVhc29uX2ZsYWdzOyBwYm4tPmxuYW1lOyBwYm4rKykKKwkJCXsKKwkJCWlmICghc3RyY21wKHBibi0+c25hbWUsIGJuYW0pKQorCQkJCXsKKwkJCQlpZiAoIUFTTjFfQklUX1NUUklOR19zZXRfYml0KCpwcmVhcywKKwkJCQkJCQlwYm4tPmJpdG51bSwgMSkpCisJCQkJCWdvdG8gZXJyOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJaWYgKCFwYm4tPmxuYW1lKQorCQkJZ290byBlcnI7CisJCX0KKwlyZXQgPSAxOworCisJZXJyOgorCXNrX0NPTkZfVkFMVUVfcG9wX2ZyZWUocnNrLCBYNTA5VjNfY29uZl9mcmVlKTsKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIGludCBwcmludF9yZWFzb25zKEJJTyAqb3V0LCBjb25zdCBjaGFyICpybmFtZSwKKwkJCUFTTjFfQklUX1NUUklORyAqcmZsYWdzLCBpbnQgaW5kZW50KQorCXsKKwlpbnQgZmlyc3QgPSAxOworCWNvbnN0IEJJVF9TVFJJTkdfQklUTkFNRSAqcGJuOworCUJJT19wcmludGYob3V0LCAiJSpzJXM6XG4lKnMiLCBpbmRlbnQsICIiLCBybmFtZSwgaW5kZW50ICsgMiwgIiIpOworCWZvciAocGJuID0gcmVhc29uX2ZsYWdzOyBwYm4tPmxuYW1lOyBwYm4rKykKKwkJeworCQlpZiAoQVNOMV9CSVRfU1RSSU5HX2dldF9iaXQocmZsYWdzLCBwYm4tPmJpdG51bSkpCisJCQl7CisJCQlpZiAoZmlyc3QpCisJCQkJZmlyc3QgPSAwOworCQkJZWxzZQorCQkJCUJJT19wdXRzKG91dCwgIiwgIik7CisJCQlCSU9fcHV0cyhvdXQsIHBibi0+bG5hbWUpOworCQkJfQorCQl9CisJaWYgKGZpcnN0KQorCQlCSU9fcHV0cyhvdXQsICI8RU1QVFk+XG4iKTsKKwllbHNlCisJCUJJT19wdXRzKG91dCwgIlxuIik7CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgRElTVF9QT0lOVCAqY3JsZHBfZnJvbV9zZWN0aW9uKFg1MDlWM19DVFggKmN0eCwKKwkJCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQorCXsKKwlpbnQgaTsKKwlDT05GX1ZBTFVFICpjbmY7CisJRElTVF9QT0lOVCAqcG9pbnQgPSBOVUxMOworCXBvaW50ID0gRElTVF9QT0lOVF9uZXcoKTsKKwlpZiAoIXBvaW50KQorCQlnb3RvIGVycjsKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKQorCQl7CisJCWludCByZXQ7CisJCWNuZiA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCXJldCA9IHNldF9kaXN0X3BvaW50X25hbWUoJnBvaW50LT5kaXN0cG9pbnQsIGN0eCwgY25mKTsKKwkJaWYgKHJldCA+IDApCisJCQljb250aW51ZTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKwkJaWYgKCFzdHJjbXAoY25mLT5uYW1lLCAicmVhc29ucyIpKQorCQkJeworCQkJaWYgKCFzZXRfcmVhc29ucygmcG9pbnQtPnJlYXNvbnMsIGNuZi0+dmFsdWUpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKGNuZi0+bmFtZSwgIkNSTGlzc3VlciIpKQorCQkJeworCQkJcG9pbnQtPkNSTGlzc3VlciA9CisJCQkJZ25hbWVzX2Zyb21fc2VjdG5hbWUoY3R4LCBjbmYtPnZhbHVlKTsKKwkJCWlmICghcG9pbnQtPkNSTGlzc3VlcikKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJcmV0dXJuIHBvaW50OworCQkJCisKKwllcnI6CisJaWYgKHBvaW50KQorCQlESVNUX1BPSU5UX2ZyZWUocG9pbnQpOworCXJldHVybiBOVUxMOworCX0KKworc3RhdGljIHZvaWQgKnYyaV9jcmxkKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCSAgICAgIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpCisJeworCVNUQUNLX09GKERJU1RfUE9JTlQpICpjcmxkID0gTlVMTDsKKwlHRU5FUkFMX05BTUVTICpnZW5zID0gTlVMTDsKKwlHRU5FUkFMX05BTUUgKmdlbiA9IE5VTEw7CisJQ09ORl9WQUxVRSAqY25mOworCWludCBpOworCWlmKCEoY3JsZCA9IHNrX0RJU1RfUE9JTlRfbmV3X251bGwoKSkpIGdvdG8gbWVycjsKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CisJCURJU1RfUE9JTlQgKnBvaW50OworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQlpZiAoIWNuZi0+dmFsdWUpCisJCQl7CisJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqZHBzZWN0OworCQkJZHBzZWN0ID0gWDUwOVYzX2dldF9zZWN0aW9uKGN0eCwgY25mLT5uYW1lKTsKKwkJCWlmICghZHBzZWN0KQorCQkJCWdvdG8gZXJyOworCQkJcG9pbnQgPSBjcmxkcF9mcm9tX3NlY3Rpb24oY3R4LCBkcHNlY3QpOworCQkJWDUwOVYzX3NlY3Rpb25fZnJlZShjdHgsIGRwc2VjdCk7CisJCQlpZiAoIXBvaW50KQorCQkJCWdvdG8gZXJyOworCQkJaWYoIXNrX0RJU1RfUE9JTlRfcHVzaChjcmxkLCBwb2ludCkpCisJCQkJeworCQkJCURJU1RfUE9JTlRfZnJlZShwb2ludCk7CisJCQkJZ290byBtZXJyOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYoIShnZW4gPSB2MmlfR0VORVJBTF9OQU1FKG1ldGhvZCwgY3R4LCBjbmYpKSkKKwkJCQlnb3RvIGVycjsgCisJCQlpZighKGdlbnMgPSBHRU5FUkFMX05BTUVTX25ldygpKSkKKwkJCQlnb3RvIG1lcnI7CisJCQlpZighc2tfR0VORVJBTF9OQU1FX3B1c2goZ2VucywgZ2VuKSkKKwkJCQlnb3RvIG1lcnI7CisJCQlnZW4gPSBOVUxMOworCQkJaWYoIShwb2ludCA9IERJU1RfUE9JTlRfbmV3KCkpKQorCQkJCWdvdG8gbWVycjsKKwkJCWlmKCFza19ESVNUX1BPSU5UX3B1c2goY3JsZCwgcG9pbnQpKQorCQkJCXsKKwkJCQlESVNUX1BPSU5UX2ZyZWUocG9pbnQpOworCQkJCWdvdG8gbWVycjsKKwkJCQl9CisJCQlpZighKHBvaW50LT5kaXN0cG9pbnQgPSBESVNUX1BPSU5UX05BTUVfbmV3KCkpKQorCQkJCWdvdG8gbWVycjsKKwkJCXBvaW50LT5kaXN0cG9pbnQtPm5hbWUuZnVsbG5hbWUgPSBnZW5zOworCQkJcG9pbnQtPmRpc3Rwb2ludC0+dHlwZSA9IDA7CisJCQlnZW5zID0gTlVMTDsKKwkJCX0KKwl9CisJcmV0dXJuIGNybGQ7CisKKwltZXJyOgorCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQ1JMRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJZXJyOgorCUdFTkVSQUxfTkFNRV9mcmVlKGdlbik7CisJR0VORVJBTF9OQU1FU19mcmVlKGdlbnMpOworCXNrX0RJU1RfUE9JTlRfcG9wX2ZyZWUoY3JsZCwgRElTVF9QT0lOVF9mcmVlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworSU1QTEVNRU5UX1NUQUNLX09GKERJU1RfUE9JTlQpCitJTVBMRU1FTlRfQVNOMV9TRVRfT0YoRElTVF9QT0lOVCkKKworc3RhdGljIGludCBkcG5fY2IoaW50IG9wZXJhdGlvbiwgQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQsCisJCQkJCQkJCXZvaWQgKmV4YXJnKQorCXsKKwlESVNUX1BPSU5UX05BTUUgKmRwbiA9IChESVNUX1BPSU5UX05BTUUgKikqcHZhbDsKKworCXN3aXRjaChvcGVyYXRpb24pCisJCXsKKwkJY2FzZSBBU04xX09QX05FV19QT1NUOgorCQlkcG4tPmRwbmFtZSA9IE5VTEw7CisJCWJyZWFrOworCisJCWNhc2UgQVNOMV9PUF9GUkVFX1BPU1Q6CisJCWlmIChkcG4tPmRwbmFtZSkKKwkJCVg1MDlfTkFNRV9mcmVlKGRwbi0+ZHBuYW1lKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKworQVNOMV9DSE9JQ0VfY2IoRElTVF9QT0lOVF9OQU1FLCBkcG5fY2IpID0geworCUFTTjFfSU1QX1NFUVVFTkNFX09GKERJU1RfUE9JTlRfTkFNRSwgbmFtZS5mdWxsbmFtZSwgR0VORVJBTF9OQU1FLCAwKSwKKwlBU04xX0lNUF9TRVRfT0YoRElTVF9QT0lOVF9OQU1FLCBuYW1lLnJlbGF0aXZlbmFtZSwgWDUwOV9OQU1FX0VOVFJZLCAxKQorfSBBU04xX0NIT0lDRV9FTkRfY2IoRElTVF9QT0lOVF9OQU1FLCBESVNUX1BPSU5UX05BTUUsIHR5cGUpCisKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKERJU1RfUE9JTlRfTkFNRSkKKworQVNOMV9TRVFVRU5DRShESVNUX1BPSU5UKSA9IHsKKwlBU04xX0VYUF9PUFQoRElTVF9QT0lOVCwgZGlzdHBvaW50LCBESVNUX1BPSU5UX05BTUUsIDApLAorCUFTTjFfSU1QX09QVChESVNUX1BPSU5ULCByZWFzb25zLCBBU04xX0JJVF9TVFJJTkcsIDEpLAorCUFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChESVNUX1BPSU5ULCBDUkxpc3N1ZXIsIEdFTkVSQUxfTkFNRSwgMikKK30gQVNOMV9TRVFVRU5DRV9FTkQoRElTVF9QT0lOVCkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKERJU1RfUE9JTlQpCisKK0FTTjFfSVRFTV9URU1QTEFURShDUkxfRElTVF9QT0lOVFMpID0gCisJQVNOMV9FWF9URU1QTEFURV9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRiwgMCwgQ1JMRGlzdHJpYnV0aW9uUG9pbnRzLCBESVNUX1BPSU5UKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChDUkxfRElTVF9QT0lOVFMpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhDUkxfRElTVF9QT0lOVFMpCisKK0FTTjFfU0VRVUVOQ0UoSVNTVUlOR19ESVNUX1BPSU5UKSA9IHsKKwlBU04xX0VYUF9PUFQoSVNTVUlOR19ESVNUX1BPSU5ULCBkaXN0cG9pbnQsIERJU1RfUE9JTlRfTkFNRSwgMCksCisJQVNOMV9JTVBfT1BUKElTU1VJTkdfRElTVF9QT0lOVCwgb25seXVzZXIsIEFTTjFfRkJPT0xFQU4sIDEpLAorCUFTTjFfSU1QX09QVChJU1NVSU5HX0RJU1RfUE9JTlQsIG9ubHlDQSwgQVNOMV9GQk9PTEVBTiwgMiksCisJQVNOMV9JTVBfT1BUKElTU1VJTkdfRElTVF9QT0lOVCwgb25seXNvbWVyZWFzb25zLCBBU04xX0JJVF9TVFJJTkcsIDMpLAorCUFTTjFfSU1QX09QVChJU1NVSU5HX0RJU1RfUE9JTlQsIGluZGlyZWN0Q1JMLCBBU04xX0ZCT09MRUFOLCA0KSwKKwlBU04xX0lNUF9PUFQoSVNTVUlOR19ESVNUX1BPSU5ULCBvbmx5YXR0ciwgQVNOMV9GQk9PTEVBTiwgNSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoSVNTVUlOR19ESVNUX1BPSU5UKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoSVNTVUlOR19ESVNUX1BPSU5UKQorCitzdGF0aWMgaW50IGkycl9pZHAoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqcGlkcCwgQklPICpvdXQsCisJCSAgIGludCBpbmRlbnQpOworc3RhdGljIHZvaWQgKnYyaV9pZHAoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkgICAgIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfaWRwID0KKwl7CisJTklEX2lzc3VpbmdfZGlzdHJpYnV0aW9uX3BvaW50LCBYNTA5VjNfRVhUX01VTFRJTElORSwKKwlBU04xX0lURU1fcmVmKElTU1VJTkdfRElTVF9QT0lOVCksCisJMCwwLDAsMCwKKwkwLDAsCisJMCwKKwl2MmlfaWRwLAorCWkycl9pZHAsMCwKKwlOVUxMCisJfTsKKworc3RhdGljIHZvaWQgKnYyaV9pZHAoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkgICAgIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQorCXsKKwlJU1NVSU5HX0RJU1RfUE9JTlQgKmlkcCA9IE5VTEw7CisJQ09ORl9WQUxVRSAqY25mOworCWNoYXIgKm5hbWUsICp2YWw7CisJaW50IGksIHJldDsKKwlpZHAgPSBJU1NVSU5HX0RJU1RfUE9JTlRfbmV3KCk7CisJaWYgKCFpZHApCisJCWdvdG8gbWVycjsKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKQorCQl7CisJCWNuZiA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCW5hbWUgPSBjbmYtPm5hbWU7CisJCXZhbCA9IGNuZi0+dmFsdWU7CisJCXJldCA9IHNldF9kaXN0X3BvaW50X25hbWUoJmlkcC0+ZGlzdHBvaW50LCBjdHgsIGNuZik7CisJCWlmIChyZXQgPiAwKQorCQkJY29udGludWU7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJCWlmICghc3RyY21wKG5hbWUsICJvbmx5dXNlciIpKQorCQkJeworCQkJaWYgKCFYNTA5VjNfZ2V0X3ZhbHVlX2Jvb2woY25mLCAmaWRwLT5vbmx5dXNlcikpCisJCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIm9ubHlDQSIpKQorCQkJeworCQkJaWYgKCFYNTA5VjNfZ2V0X3ZhbHVlX2Jvb2woY25mLCAmaWRwLT5vbmx5Q0EpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJvbmx5QUEiKSkKKwkJCXsKKwkJCWlmICghWDUwOVYzX2dldF92YWx1ZV9ib29sKGNuZiwgJmlkcC0+b25seWF0dHIpKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlIGlmICghc3RyY21wKG5hbWUsICJpbmRpcmVjdENSTCIpKQorCQkJeworCQkJaWYgKCFYNTA5VjNfZ2V0X3ZhbHVlX2Jvb2woY25mLCAmaWRwLT5pbmRpcmVjdENSTCkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIm9ubHlzb21lcmVhc29ucyIpKQorCQkJeworCQkJaWYgKCFzZXRfcmVhc29ucygmaWRwLT5vbmx5c29tZXJlYXNvbnMsIHZhbCkpCisJCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIFg1MDlWM2VycihYNTA5VjNfRl9WMklfSURQLCBYNTA5VjNfUl9JTlZBTElEX05BTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgWDUwOVYzX2NvbmZfZXJyKGNuZik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKwkJCX0KKwkJfQorCXJldHVybiBpZHA7CisKKwltZXJyOgorCVg1MDlWM2VycihYNTA5VjNfRl9WMklfSURQLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwllcnI6CisJSVNTVUlOR19ESVNUX1BPSU5UX2ZyZWUoaWRwKTsKKwlyZXR1cm4gTlVMTDsKKwl9CisKK3N0YXRpYyBpbnQgcHJpbnRfZ2VucyhCSU8gKm91dCwgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSAqZ2VucywgaW50IGluZGVudCkKKwl7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZ2Vucyk7IGkrKykKKwkJeworCQlCSU9fcHJpbnRmKG91dCwgIiUqcyIsIGluZGVudCArIDIsICIiKTsKKwkJR0VORVJBTF9OQU1FX3ByaW50KG91dCwgc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGdlbnMsIGkpKTsKKwkJQklPX3B1dHMob3V0LCAiXG4iKTsKKwkJfQorCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBwcmludF9kaXN0cG9pbnQoQklPICpvdXQsIERJU1RfUE9JTlRfTkFNRSAqZHBuLCBpbnQgaW5kZW50KQorCXsKKwlpZiAoZHBuLT50eXBlID09IDApCisJCXsKKwkJQklPX3ByaW50ZihvdXQsICIlKnNGdWxsIE5hbWU6XG4iLCBpbmRlbnQsICIiKTsKKwkJcHJpbnRfZ2VucyhvdXQsIGRwbi0+bmFtZS5mdWxsbmFtZSwgaW5kZW50KTsKKwkJfQorCWVsc2UKKwkJeworCQlYNTA5X05BTUUgbnRtcDsKKwkJbnRtcC5lbnRyaWVzID0gZHBuLT5uYW1lLnJlbGF0aXZlbmFtZTsKKwkJQklPX3ByaW50ZihvdXQsICIlKnNSZWxhdGl2ZSBOYW1lOlxuJSpzIiwKKwkJCQkJCWluZGVudCwgIiIsIGluZGVudCArIDIsICIiKTsKKwkJWDUwOV9OQU1FX3ByaW50X2V4KG91dCwgJm50bXAsIDAsIFhOX0ZMQUdfT05FTElORSk7CisJCUJJT19wdXRzKG91dCwgIlxuIik7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgaTJyX2lkcChjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICpwaWRwLCBCSU8gKm91dCwKKwkJICAgaW50IGluZGVudCkKKwl7CisJSVNTVUlOR19ESVNUX1BPSU5UICppZHAgPSBwaWRwOworCWlmIChpZHAtPmRpc3Rwb2ludCkKKwkJcHJpbnRfZGlzdHBvaW50KG91dCwgaWRwLT5kaXN0cG9pbnQsIGluZGVudCk7CisJaWYgKGlkcC0+b25seXVzZXIgPiAwKQorCQlCSU9fcHJpbnRmKG91dCwgIiUqc09ubHkgVXNlciBDZXJ0aWZpY2F0ZXNcbiIsIGluZGVudCwgIiIpOworCWlmIChpZHAtPm9ubHlDQSA+IDApCisJCUJJT19wcmludGYob3V0LCAiJSpzT25seSBDQSBDZXJ0aWZpY2F0ZXNcbiIsIGluZGVudCwgIiIpOworCWlmIChpZHAtPmluZGlyZWN0Q1JMID4gMCkKKwkJQklPX3ByaW50ZihvdXQsICIlKnNJbmRpcmVjdCBDUkxcbiIsIGluZGVudCwgIiIpOworCWlmIChpZHAtPm9ubHlzb21lcmVhc29ucykKKwkJcHJpbnRfcmVhc29ucyhvdXQsICJPbmx5IFNvbWUgUmVhc29ucyIsIAorCQkJCWlkcC0+b25seXNvbWVyZWFzb25zLCBpbmRlbnQpOworCWlmIChpZHAtPm9ubHlhdHRyID4gMCkKKwkJQklPX3ByaW50ZihvdXQsICIlKnNPbmx5IEF0dHJpYnV0ZSBDZXJ0aWZpY2F0ZXNcbiIsIGluZGVudCwgIiIpOworCWlmICghaWRwLT5kaXN0cG9pbnQgJiYgKGlkcC0+b25seXVzZXIgPD0gMCkgJiYgKGlkcC0+b25seUNBIDw9IDApCisJCSYmIChpZHAtPmluZGlyZWN0Q1JMIDw9IDApICYmICFpZHAtPm9ubHlzb21lcmVhc29ucworCQkmJiAoaWRwLT5vbmx5YXR0ciA8PSAwKSkKKwkJQklPX3ByaW50ZihvdXQsICIlKnM8RU1QVFk+XG4iLCBpbmRlbnQsICIiKTsKKwkJCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGkycl9jcmxkcChjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICpwY3JsZHAsIEJJTyAqb3V0LAorCQkgICAgIGludCBpbmRlbnQpCisJeworCVNUQUNLX09GKERJU1RfUE9JTlQpICpjcmxkID0gcGNybGRwOworCURJU1RfUE9JTlQgKnBvaW50OworCWludCBpOworCWZvcihpID0gMDsgaSA8IHNrX0RJU1RfUE9JTlRfbnVtKGNybGQpOyBpKyspCisJCXsKKwkJQklPX3B1dHMob3V0LCAiXG4iKTsKKwkJcG9pbnQgPSBza19ESVNUX1BPSU5UX3ZhbHVlKGNybGQsIGkpOworCQlpZihwb2ludC0+ZGlzdHBvaW50KQorCQkJcHJpbnRfZGlzdHBvaW50KG91dCwgcG9pbnQtPmRpc3Rwb2ludCwgaW5kZW50KTsKKwkJaWYocG9pbnQtPnJlYXNvbnMpIAorCQkJcHJpbnRfcmVhc29ucyhvdXQsICJSZWFzb25zIiwgcG9pbnQtPnJlYXNvbnMsCisJCQkJCQkJCWluZGVudCk7CisJCWlmKHBvaW50LT5DUkxpc3N1ZXIpCisJCQl7CisJCQlCSU9fcHJpbnRmKG91dCwgIiUqc0NSTCBJc3N1ZXI6XG4iLCBpbmRlbnQsICIiKTsKKwkJCXByaW50X2dlbnMob3V0LCBwb2ludC0+Q1JMaXNzdWVyLCBpbmRlbnQpOworCQkJfQorCQl9CisJcmV0dXJuIDE7CisJfQorCitpbnQgRElTVF9QT0lOVF9zZXRfZHBuYW1lKERJU1RfUE9JTlRfTkFNRSAqZHBuLCBYNTA5X05BTUUgKmluYW1lKQorCXsKKwlpbnQgaTsKKwlTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICpmcmFnOworCVg1MDlfTkFNRV9FTlRSWSAqbmU7CisJaWYgKCFkcG4gfHwgKGRwbi0+dHlwZSAhPSAxKSkKKwkJcmV0dXJuIDE7CisJZnJhZyA9IGRwbi0+bmFtZS5yZWxhdGl2ZW5hbWU7CisJZHBuLT5kcG5hbWUgPSBYNTA5X05BTUVfZHVwKGluYW1lKTsKKwlpZiAoIWRwbi0+ZHBuYW1lKQorCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfWDUwOV9OQU1FX0VOVFJZX251bShmcmFnKTsgaSsrKQorCQl7CisJCW5lID0gc2tfWDUwOV9OQU1FX0VOVFJZX3ZhbHVlKGZyYWcsIGkpOworCQlpZiAoIVg1MDlfTkFNRV9hZGRfZW50cnkoZHBuLT5kcG5hbWUsIG5lLCAtMSwgaSA/IDAgOiAxKSkKKwkJCXsKKwkJCVg1MDlfTkFNRV9mcmVlKGRwbi0+ZHBuYW1lKTsKKwkJCWRwbi0+ZHBuYW1lID0gTlVMTDsKKwkJCXJldHVybiAwOworCQkJfQorCQl9CisJLyogZ2VuZXJhdGUgY2FjaGVkIGVuY29kaW5nIG9mIG5hbWUgKi8KKwlpZiAoaTJkX1g1MDlfTkFNRShkcG4tPmRwbmFtZSwgTlVMTCkgPCAwKQorCQl7CisJCVg1MDlfTkFNRV9mcmVlKGRwbi0+ZHBuYW1lKTsKKwkJZHBuLT5kcG5hbWUgPSBOVUxMOworCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfZW51bS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19lbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1NzVlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfZW51bS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qIHYzX2VudW0uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCitzdGF0aWMgRU5VTUVSQVRFRF9OQU1FUyBjcmxfcmVhc29uc1tdID0gewore0NSTF9SRUFTT05fVU5TUEVDSUZJRUQsIAkgIlVuc3BlY2lmaWVkIiwgInVuc3BlY2lmaWVkIn0sCit7Q1JMX1JFQVNPTl9LRVlfQ09NUFJPTUlTRSwJICJLZXkgQ29tcHJvbWlzZSIsICJrZXlDb21wcm9taXNlIn0sCit7Q1JMX1JFQVNPTl9DQV9DT01QUk9NSVNFLAkgIkNBIENvbXByb21pc2UiLCAiQ0FDb21wcm9taXNlIn0sCit7Q1JMX1JFQVNPTl9BRkZJTElBVElPTl9DSEFOR0VELCAiQWZmaWxpYXRpb24gQ2hhbmdlZCIsICJhZmZpbGlhdGlvbkNoYW5nZWQifSwKK3tDUkxfUkVBU09OX1NVUEVSU0VERUQsIAkgIlN1cGVyc2VkZWQiLCAic3VwZXJzZWRlZCJ9LAore0NSTF9SRUFTT05fQ0VTU0FUSU9OX09GX09QRVJBVElPTiwKKwkJCSJDZXNzYXRpb24gT2YgT3BlcmF0aW9uIiwgImNlc3NhdGlvbk9mT3BlcmF0aW9uIn0sCit7Q1JMX1JFQVNPTl9DRVJUSUZJQ0FURV9IT0xELAkgIkNlcnRpZmljYXRlIEhvbGQiLCAiY2VydGlmaWNhdGVIb2xkIn0sCit7Q1JMX1JFQVNPTl9SRU1PVkVfRlJPTV9DUkwsCSAiUmVtb3ZlIEZyb20gQ1JMIiwgInJlbW92ZUZyb21DUkwifSwKK3tDUkxfUkVBU09OX1BSSVZJTEVHRV9XSVRIRFJBV04sICJQcml2aWxlZ2UgV2l0aGRyYXduIiwgInByaXZpbGVnZVdpdGhkcmF3biJ9LAore0NSTF9SRUFTT05fQUFfQ09NUFJPTUlTRSwJICJBQSBDb21wcm9taXNlIiwgIkFBQ29tcHJvbWlzZSJ9LAorey0xLCBOVUxMLCBOVUxMfQorfTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfY3JsX3JlYXNvbiA9IHsgCitOSURfY3JsX3JlYXNvbiwgMCwgQVNOMV9JVEVNX3JlZihBU04xX0VOVU1FUkFURUQpLAorMCwwLDAsMCwKKyhYNTA5VjNfRVhUX0kyUylpMnNfQVNOMV9FTlVNRVJBVEVEX1RBQkxFLAorMCwKKzAsMCwwLDAsCitjcmxfcmVhc29uc307CisKKworY2hhciAqaTJzX0FTTjFfRU5VTUVSQVRFRF9UQUJMRShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgQVNOMV9FTlVNRVJBVEVEICplKQoreworCUVOVU1FUkFURURfTkFNRVMgKmVuYW07CisJbG9uZyBzdHJ2YWw7CisJc3RydmFsID0gQVNOMV9FTlVNRVJBVEVEX2dldChlKTsKKwlmb3IoZW5hbSA9IG1ldGhvZC0+dXNyX2RhdGE7IGVuYW0tPmxuYW1lOyBlbmFtKyspIHsKKwkJaWYoc3RydmFsID09IGVuYW0tPmJpdG51bSkgcmV0dXJuIEJVRl9zdHJkdXAoZW5hbS0+bG5hbWUpOworCX0KKwlyZXR1cm4gaTJzX0FTTjFfRU5VTUVSQVRFRChtZXRob2QsIGUpOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19leHRrdS5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19leHRrdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjY1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2V4dGt1LmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qIHYzX2V4dGt1LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIHZvaWQgKnYyaV9FWFRFTkRFRF9LRVlfVVNBR0UoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCQkgICAgWDUwOVYzX0NUWCAqY3R4LAorCQkJCSAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCk7CitzdGF0aWMgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmkydl9FWFRFTkRFRF9LRVlfVVNBR0UoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJdm9pZCAqZWt1LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCk7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2V4dF9rdSA9IHsKKwlOSURfZXh0X2tleV91c2FnZSwgMCwKKwlBU04xX0lURU1fcmVmKEVYVEVOREVEX0tFWV9VU0FHRSksCisJMCwwLDAsMCwKKwkwLDAsCisJaTJ2X0VYVEVOREVEX0tFWV9VU0FHRSwKKwl2MmlfRVhURU5ERURfS0VZX1VTQUdFLAorCTAsMCwKKwlOVUxMCit9OworCisvKiBOQiBPQ1NQIGFjY2VwdGFibGUgcmVzcG9uc2VzIGFsc28gaXMgYSBTRVFVRU5DRSBPRiBPQkpFQ1QgKi8KK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX29jc3BfYWNjcmVzcCA9IHsKKwlOSURfaWRfcGtpeF9PQ1NQX2FjY2VwdGFibGVSZXNwb25zZXMsIDAsCisJQVNOMV9JVEVNX3JlZihFWFRFTkRFRF9LRVlfVVNBR0UpLAorCTAsMCwwLDAsCisJMCwwLAorCWkydl9FWFRFTkRFRF9LRVlfVVNBR0UsCisJdjJpX0VYVEVOREVEX0tFWV9VU0FHRSwKKwkwLDAsCisJTlVMTAorfTsKKworQVNOMV9JVEVNX1RFTVBMQVRFKEVYVEVOREVEX0tFWV9VU0FHRSkgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBFWFRFTkRFRF9LRVlfVVNBR0UsIEFTTjFfT0JKRUNUKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChFWFRFTkRFRF9LRVlfVVNBR0UpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhFWFRFTkRFRF9LRVlfVVNBR0UpCisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqCisgIGkydl9FWFRFTkRFRF9LRVlfVVNBR0UoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqYSwKKwkJCSBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0X2xpc3QpCit7CisJRVhURU5ERURfS0VZX1VTQUdFICpla3UgPSBhOworCWludCBpOworCUFTTjFfT0JKRUNUICpvYmo7CisJY2hhciBvYmpfdG1wWzgwXTsKKwlmb3IoaSA9IDA7IGkgPCBza19BU04xX09CSkVDVF9udW0oZWt1KTsgaSsrKSB7CisJCW9iaiA9IHNrX0FTTjFfT0JKRUNUX3ZhbHVlKGVrdSwgaSk7CisJCWkydF9BU04xX09CSkVDVChvYmpfdG1wLCA4MCwgb2JqKTsKKwkJWDUwOVYzX2FkZF92YWx1ZShOVUxMLCBvYmpfdG1wLCAmZXh0X2xpc3QpOworCX0KKwlyZXR1cm4gZXh0X2xpc3Q7Cit9CisKK3N0YXRpYyB2b2lkICp2MmlfRVhURU5ERURfS0VZX1VTQUdFKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICAgIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpCit7CisJRVhURU5ERURfS0VZX1VTQUdFICpleHRrdTsKKwljaGFyICpleHR2YWw7CisJQVNOMV9PQkpFQ1QgKm9ianRtcDsKKwlDT05GX1ZBTFVFICp2YWw7CisJaW50IGk7CisKKwlpZighKGV4dGt1ID0gc2tfQVNOMV9PQkpFQ1RfbmV3X251bGwoKSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9FWFRFTkRFRF9LRVlfVVNBR0UsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CisJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCWlmKHZhbC0+dmFsdWUpIGV4dHZhbCA9IHZhbC0+dmFsdWU7CisJCWVsc2UgZXh0dmFsID0gdmFsLT5uYW1lOworCQlpZighKG9ianRtcCA9IE9CSl90eHQyb2JqKGV4dHZhbCwgMCkpKSB7CisJCQlza19BU04xX09CSkVDVF9wb3BfZnJlZShleHRrdSwgQVNOMV9PQkpFQ1RfZnJlZSk7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0VYVEVOREVEX0tFWV9VU0FHRSxYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJc2tfQVNOMV9PQkpFQ1RfcHVzaChleHRrdSwgb2JqdG1wKTsKKwl9CisJcmV0dXJuIGV4dGt1OworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19nZW5uLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2dlbm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjI4MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19nZW5uLmMKQEAgLTAsMCArMSwyNTIgQEAKKy8qIHYzX2dlbm4uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwOCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK0FTTjFfU0VRVUVOQ0UoT1RIRVJOQU1FKSA9IHsKKwlBU04xX1NJTVBMRShPVEhFUk5BTUUsIHR5cGVfaWQsIEFTTjFfT0JKRUNUKSwKKwkvKiBNYXliZSBoYXZlIGEgdHJ1ZSBBTlkgREVGSU5FRCBCWSBsYXRlciAqLworCUFTTjFfRVhQKE9USEVSTkFNRSwgdmFsdWUsIEFTTjFfQU5ZLCAwKQorfSBBU04xX1NFUVVFTkNFX0VORChPVEhFUk5BTUUpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhPVEhFUk5BTUUpCisKK0FTTjFfU0VRVUVOQ0UoRURJUEFSVFlOQU1FKSA9IHsKKwlBU04xX0lNUF9PUFQoRURJUEFSVFlOQU1FLCBuYW1lQXNzaWduZXIsIERJUkVDVE9SWVNUUklORywgMCksCisJQVNOMV9JTVBfT1BUKEVESVBBUlRZTkFNRSwgcGFydHlOYW1lLCBESVJFQ1RPUllTVFJJTkcsIDEpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKEVESVBBUlRZTkFNRSkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEVESVBBUlRZTkFNRSkKKworQVNOMV9DSE9JQ0UoR0VORVJBTF9OQU1FKSA9IHsKKwlBU04xX0lNUChHRU5FUkFMX05BTUUsIGQub3RoZXJOYW1lLCBPVEhFUk5BTUUsIEdFTl9PVEhFUk5BTUUpLAorCUFTTjFfSU1QKEdFTkVSQUxfTkFNRSwgZC5yZmM4MjJOYW1lLCBBU04xX0lBNVNUUklORywgR0VOX0VNQUlMKSwKKwlBU04xX0lNUChHRU5FUkFMX05BTUUsIGQuZE5TTmFtZSwgQVNOMV9JQTVTVFJJTkcsIEdFTl9ETlMpLAorCS8qIERvbid0IGRlY29kZSB0aGlzICovCisJQVNOMV9JTVAoR0VORVJBTF9OQU1FLCBkLng0MDBBZGRyZXNzLCBBU04xX1NFUVVFTkNFLCBHRU5fWDQwMCksCisJLyogWDUwOV9OQU1FIGlzIGEgQ0hPSUNFIHR5cGUgc28gdXNlIEVYUExJQ0lUICovCisJQVNOMV9FWFAoR0VORVJBTF9OQU1FLCBkLmRpcmVjdG9yeU5hbWUsIFg1MDlfTkFNRSwgR0VOX0RJUk5BTUUpLAorCUFTTjFfSU1QKEdFTkVSQUxfTkFNRSwgZC5lZGlQYXJ0eU5hbWUsIEVESVBBUlRZTkFNRSwgR0VOX0VESVBBUlRZKSwKKwlBU04xX0lNUChHRU5FUkFMX05BTUUsIGQudW5pZm9ybVJlc291cmNlSWRlbnRpZmllciwgQVNOMV9JQTVTVFJJTkcsIEdFTl9VUkkpLAorCUFTTjFfSU1QKEdFTkVSQUxfTkFNRSwgZC5pUEFkZHJlc3MsIEFTTjFfT0NURVRfU1RSSU5HLCBHRU5fSVBBREQpLAorCUFTTjFfSU1QKEdFTkVSQUxfTkFNRSwgZC5yZWdpc3RlcmVkSUQsIEFTTjFfT0JKRUNULCBHRU5fUklEKQorfSBBU04xX0NIT0lDRV9FTkQoR0VORVJBTF9OQU1FKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoR0VORVJBTF9OQU1FKQorCitBU04xX0lURU1fVEVNUExBVEUoR0VORVJBTF9OQU1FUykgPSAKKwlBU04xX0VYX1RFTVBMQVRFX1RZUEUoQVNOMV9URkxHX1NFUVVFTkNFX09GLCAwLCBHZW5lcmFsTmFtZXMsIEdFTkVSQUxfTkFNRSkKK0FTTjFfSVRFTV9URU1QTEFURV9FTkQoR0VORVJBTF9OQU1FUykKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKEdFTkVSQUxfTkFNRVMpCisKK0dFTkVSQUxfTkFNRSAqR0VORVJBTF9OQU1FX2R1cChHRU5FUkFMX05BTUUgKmEpCisJeworCXJldHVybiAoR0VORVJBTF9OQU1FICopIEFTTjFfZHVwKChpMmRfb2Zfdm9pZCAqKSBpMmRfR0VORVJBTF9OQU1FLAorCQkJCQkgKGQyaV9vZl92b2lkICopIGQyaV9HRU5FUkFMX05BTUUsCisJCQkJCSAoY2hhciAqKSBhKTsKKwl9CisKKy8qIFJldHVybnMgMCBpZiB0aGV5IGFyZSBlcXVhbCwgIT0gMCBvdGhlcndpc2UuICovCitpbnQgR0VORVJBTF9OQU1FX2NtcChHRU5FUkFMX05BTUUgKmEsIEdFTkVSQUxfTkFNRSAqYikKKwl7CisJaW50IHJlc3VsdCA9IC0xOworCisJaWYgKCFhIHx8ICFiIHx8IGEtPnR5cGUgIT0gYi0+dHlwZSkgcmV0dXJuIC0xOworCXN3aXRjaChhLT50eXBlKQorCQl7CisJY2FzZSBHRU5fWDQwMDoKKwljYXNlIEdFTl9FRElQQVJUWToKKwkJcmVzdWx0ID0gQVNOMV9UWVBFX2NtcChhLT5kLm90aGVyLCBiLT5kLm90aGVyKTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9PVEhFUk5BTUU6CisJCXJlc3VsdCA9IE9USEVSTkFNRV9jbXAoYS0+ZC5vdGhlck5hbWUsIGItPmQub3RoZXJOYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9FTUFJTDoKKwljYXNlIEdFTl9ETlM6CisJY2FzZSBHRU5fVVJJOgorCQlyZXN1bHQgPSBBU04xX1NUUklOR19jbXAoYS0+ZC5pYTUsIGItPmQuaWE1KTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9ESVJOQU1FOgorCQlyZXN1bHQgPSBYNTA5X05BTUVfY21wKGEtPmQuZGlybiwgYi0+ZC5kaXJuKTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9JUEFERDoKKwkJcmVzdWx0ID0gQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGEtPmQuaXAsIGItPmQuaXApOworCQlicmVhazsKKwkKKwljYXNlIEdFTl9SSUQ6CisJCXJlc3VsdCA9IE9CSl9jbXAoYS0+ZC5yaWQsIGItPmQucmlkKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4gcmVzdWx0OworCX0KKworLyogUmV0dXJucyAwIGlmIHRoZXkgYXJlIGVxdWFsLCAhPSAwIG90aGVyd2lzZS4gKi8KK2ludCBPVEhFUk5BTUVfY21wKE9USEVSTkFNRSAqYSwgT1RIRVJOQU1FICpiKQorCXsKKwlpbnQgcmVzdWx0ID0gLTE7CisKKwlpZiAoIWEgfHwgIWIpIHJldHVybiAtMTsKKwkvKiBDaGVjayB0aGVpciB0eXBlIGZpcnN0LiAqLworCWlmICgocmVzdWx0ID0gT0JKX2NtcChhLT50eXBlX2lkLCBiLT50eXBlX2lkKSkgIT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKwkvKiBDaGVjayB0aGUgdmFsdWUuICovCisJcmVzdWx0ID0gQVNOMV9UWVBFX2NtcChhLT52YWx1ZSwgYi0+dmFsdWUpOworCXJldHVybiByZXN1bHQ7CisJfQorCit2b2lkIEdFTkVSQUxfTkFNRV9zZXQwX3ZhbHVlKEdFTkVSQUxfTkFNRSAqYSwgaW50IHR5cGUsIHZvaWQgKnZhbHVlKQorCXsKKwlzd2l0Y2godHlwZSkKKwkJeworCWNhc2UgR0VOX1g0MDA6CisJY2FzZSBHRU5fRURJUEFSVFk6CisJCWEtPmQub3RoZXIgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9PVEhFUk5BTUU6CisJCWEtPmQub3RoZXJOYW1lID0gdmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBHRU5fRU1BSUw6CisJY2FzZSBHRU5fRE5TOgorCWNhc2UgR0VOX1VSSToKKwkJYS0+ZC5pYTUgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9ESVJOQU1FOgorCQlhLT5kLmRpcm4gPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIEdFTl9JUEFERDoKKwkJYS0+ZC5pcCA9IHZhbHVlOworCQlicmVhazsKKwkKKwljYXNlIEdFTl9SSUQ6CisJCWEtPmQucmlkID0gdmFsdWU7CisJCWJyZWFrOworCQl9CisJYS0+dHlwZSA9IHR5cGU7CisJfQorCit2b2lkICpHRU5FUkFMX05BTUVfZ2V0MF92YWx1ZShHRU5FUkFMX05BTUUgKmEsIGludCAqcHR5cGUpCisJeworCWlmIChwdHlwZSkKKwkJKnB0eXBlID0gYS0+dHlwZTsKKwlzd2l0Y2goYS0+dHlwZSkKKwkJeworCWNhc2UgR0VOX1g0MDA6CisJY2FzZSBHRU5fRURJUEFSVFk6CisJCXJldHVybiBhLT5kLm90aGVyOworCisJY2FzZSBHRU5fT1RIRVJOQU1FOgorCQlyZXR1cm4gYS0+ZC5vdGhlck5hbWU7CisKKwljYXNlIEdFTl9FTUFJTDoKKwljYXNlIEdFTl9ETlM6CisJY2FzZSBHRU5fVVJJOgorCQlyZXR1cm4gYS0+ZC5pYTU7CisKKwljYXNlIEdFTl9ESVJOQU1FOgorCQlyZXR1cm4gYS0+ZC5kaXJuOworCisJY2FzZSBHRU5fSVBBREQ6CisJCXJldHVybiBhLT5kLmlwOworCQorCWNhc2UgR0VOX1JJRDoKKwkJcmV0dXJuIGEtPmQucmlkOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKK2ludCBHRU5FUkFMX05BTUVfc2V0MF9vdGhlcm5hbWUoR0VORVJBTF9OQU1FICpnZW4sCisJCQkJQVNOMV9PQkpFQ1QgKm9pZCwgQVNOMV9UWVBFICp2YWx1ZSkKKwl7CisJT1RIRVJOQU1FICpvdGg7CisJb3RoID0gT1RIRVJOQU1FX25ldygpOworCWlmICghb3RoKQorCQlyZXR1cm4gMDsKKwlvdGgtPnR5cGVfaWQgPSBvaWQ7CisJb3RoLT52YWx1ZSA9IHZhbHVlOworCUdFTkVSQUxfTkFNRV9zZXQwX3ZhbHVlKGdlbiwgR0VOX09USEVSTkFNRSwgb3RoKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBHRU5FUkFMX05BTUVfZ2V0MF9vdGhlck5hbWUoR0VORVJBTF9OQU1FICpnZW4sIAorCQkJCUFTTjFfT0JKRUNUICoqcG9pZCwgQVNOMV9UWVBFICoqcHZhbHVlKQorCXsKKwlpZiAoZ2VuLT50eXBlICE9IEdFTl9PVEhFUk5BTUUpCisJCXJldHVybiAwOworCWlmIChwb2lkKQorCQkqcG9pZCA9IGdlbi0+ZC5vdGhlck5hbWUtPnR5cGVfaWQ7CisJaWYgKHB2YWx1ZSkKKwkJKnB2YWx1ZSA9IGdlbi0+ZC5vdGhlck5hbWUtPnZhbHVlOworCXJldHVybiAxOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19pYTUuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfaWE1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZmMTJiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfaWE1LmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qIHYzX2lhNS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIGNoYXIgKmkyc19BU04xX0lBNVNUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBBU04xX0lBNVNUUklORyAqaWE1KTsKK3N0YXRpYyBBU04xX0lBNVNUUklORyAqczJpX0FTTjFfSUE1U1RSSU5HKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc3RyKTsKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX25zX2lhNV9saXN0W10gPSB7IAorRVhUX0lBNVNUUklORyhOSURfbmV0c2NhcGVfYmFzZV91cmwpLAorRVhUX0lBNVNUUklORyhOSURfbmV0c2NhcGVfcmV2b2NhdGlvbl91cmwpLAorRVhUX0lBNVNUUklORyhOSURfbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwpLAorRVhUX0lBNVNUUklORyhOSURfbmV0c2NhcGVfcmVuZXdhbF91cmwpLAorRVhUX0lBNVNUUklORyhOSURfbmV0c2NhcGVfY2FfcG9saWN5X3VybCksCitFWFRfSUE1U1RSSU5HKE5JRF9uZXRzY2FwZV9zc2xfc2VydmVyX25hbWUpLAorRVhUX0lBNVNUUklORyhOSURfbmV0c2NhcGVfY29tbWVudCksCitFWFRfRU5ECit9OworCisKK3N0YXRpYyBjaGFyICppMnNfQVNOMV9JQTVTVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIEFTTjFfSUE1U1RSSU5HICppYTUpCit7CisJY2hhciAqdG1wOworCWlmKCFpYTUgfHwgIWlhNS0+bGVuZ3RoKSByZXR1cm4gTlVMTDsKKwlpZighKHRtcCA9IE9QRU5TU0xfbWFsbG9jKGlhNS0+bGVuZ3RoICsgMSkpKSB7CisJCVg1MDlWM2VycihYNTA5VjNfRl9JMlNfQVNOMV9JQTVTVFJJTkcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KHRtcCwgaWE1LT5kYXRhLCBpYTUtPmxlbmd0aCk7CisJdG1wW2lhNS0+bGVuZ3RoXSA9IDA7CisJcmV0dXJuIHRtcDsKK30KKworc3RhdGljIEFTTjFfSUE1U1RSSU5HICpzMmlfQVNOMV9JQTVTVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc3RyKQoreworCUFTTjFfSUE1U1RSSU5HICppYTU7CisJaWYoIXN0cikgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUzJJX0FTTjFfSUE1U1RSSU5HLFg1MDlWM19SX0lOVkFMSURfTlVMTF9BUkdVTUVOVCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZighKGlhNSA9IE1fQVNOMV9JQTVTVFJJTkdfbmV3KCkpKSBnb3RvIGVycjsKKwlpZighQVNOMV9TVFJJTkdfc2V0KChBU04xX1NUUklORyAqKWlhNSwgKHVuc2lnbmVkIGNoYXIqKXN0ciwKKwkJCSAgICBzdHJsZW4oc3RyKSkpIHsKKwkJTV9BU04xX0lBNVNUUklOR19mcmVlKGlhNSk7CisJCWdvdG8gZXJyOworCX0KKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworICAgICAgICBlYmNkaWMyYXNjaWkoaWE1LT5kYXRhLCBpYTUtPmRhdGEsIGlhNS0+bGVuZ3RoKTsKKyNlbmRpZiAvKkNIQVJTRVRfRUJDRElDKi8KKwlyZXR1cm4gaWE1OworCWVycjoKKwlYNTA5VjNlcnIoWDUwOVYzX0ZfUzJJX0FTTjFfSUE1U1RSSU5HLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19pbmZvLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWI4Njk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19pbmZvLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qIHYzX2luZm8uYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIFNUQUNLX09GKENPTkZfVkFMVUUpICppMnZfQVVUSE9SSVRZX0lORk9fQUNDRVNTKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJQVVUSE9SSVRZX0lORk9fQUNDRVNTICphaW5mbywKKwkJCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpyZXQpOworc3RhdGljIEFVVEhPUklUWV9JTkZPX0FDQ0VTUyAqdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfaW5mbyA9Cit7IE5JRF9pbmZvX2FjY2VzcywgWDUwOVYzX0VYVF9NVUxUSUxJTkUsIEFTTjFfSVRFTV9yZWYoQVVUSE9SSVRZX0lORk9fQUNDRVNTKSwKKzAsMCwwLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlYpaTJ2X0FVVEhPUklUWV9JTkZPX0FDQ0VTUywKKyhYNTA5VjNfRVhUX1YySSl2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTLAorMCwwLAorTlVMTH07CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX3NpbmZvID0KK3sgTklEX3NpbmZvX2FjY2VzcywgWDUwOVYzX0VYVF9NVUxUSUxJTkUsIEFTTjFfSVRFTV9yZWYoQVVUSE9SSVRZX0lORk9fQUNDRVNTKSwKKzAsMCwwLDAsCiswLDAsCisoWDUwOVYzX0VYVF9JMlYpaTJ2X0FVVEhPUklUWV9JTkZPX0FDQ0VTUywKKyhYNTA5VjNfRVhUX1YySSl2MmlfQVVUSE9SSVRZX0lORk9fQUNDRVNTLAorMCwwLAorTlVMTH07CisKK0FTTjFfU0VRVUVOQ0UoQUNDRVNTX0RFU0NSSVBUSU9OKSA9IHsKKwlBU04xX1NJTVBMRShBQ0NFU1NfREVTQ1JJUFRJT04sIG1ldGhvZCwgQVNOMV9PQkpFQ1QpLAorCUFTTjFfU0lNUExFKEFDQ0VTU19ERVNDUklQVElPTiwgbG9jYXRpb24sIEdFTkVSQUxfTkFNRSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoQUNDRVNTX0RFU0NSSVBUSU9OKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoQUNDRVNTX0RFU0NSSVBUSU9OKQorCitBU04xX0lURU1fVEVNUExBVEUoQVVUSE9SSVRZX0lORk9fQUNDRVNTKSA9IAorCUFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIEdlbmVyYWxOYW1lcywgQUNDRVNTX0RFU0NSSVBUSU9OKQorQVNOMV9JVEVNX1RFTVBMQVRFX0VORChBVVRIT1JJVFlfSU5GT19BQ0NFU1MpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhBVVRIT1JJVFlfSU5GT19BQ0NFU1MpCisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0FVVEhPUklUWV9JTkZPX0FDQ0VTUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCUFVVEhPUklUWV9JTkZPX0FDQ0VTUyAqYWluZm8sCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqcmV0KQoreworCUFDQ0VTU19ERVNDUklQVElPTiAqZGVzYzsKKwlpbnQgaSxubGVuOworCWNoYXIgb2JqdG1wWzgwXSwgKm50bXA7CisJQ09ORl9WQUxVRSAqdnRtcDsKKwlmb3IoaSA9IDA7IGkgPCBza19BQ0NFU1NfREVTQ1JJUFRJT05fbnVtKGFpbmZvKTsgaSsrKSB7CisJCWRlc2MgPSBza19BQ0NFU1NfREVTQ1JJUFRJT05fdmFsdWUoYWluZm8sIGkpOworCQlyZXQgPSBpMnZfR0VORVJBTF9OQU1FKG1ldGhvZCwgZGVzYy0+bG9jYXRpb24sIHJldCk7CisJCWlmKCFyZXQpIGJyZWFrOworCQl2dG1wID0gc2tfQ09ORl9WQUxVRV92YWx1ZShyZXQsIGkpOworCQlpMnRfQVNOMV9PQkpFQ1Qob2JqdG1wLCBzaXplb2Ygb2JqdG1wLCBkZXNjLT5tZXRob2QpOworCQlubGVuID0gc3RybGVuKG9ianRtcCkgKyBzdHJsZW4odnRtcC0+bmFtZSkgKyA1OworCQludG1wID0gT1BFTlNTTF9tYWxsb2Mobmxlbik7CisJCWlmKCFudG1wKSB7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfSTJWX0FVVEhPUklUWV9JTkZPX0FDQ0VTUywKKwkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJQlVGX3N0cmxjcHkobnRtcCwgb2JqdG1wLCBubGVuKTsKKwkJQlVGX3N0cmxjYXQobnRtcCwgIiAtICIsIG5sZW4pOworCQlCVUZfc3RybGNhdChudG1wLCB2dG1wLT5uYW1lLCBubGVuKTsKKwkJT1BFTlNTTF9mcmVlKHZ0bXAtPm5hbWUpOworCQl2dG1wLT5uYW1lID0gbnRtcDsKKwkJCisJfQorCWlmKCFyZXQpIHJldHVybiBza19DT05GX1ZBTFVFX25ld19udWxsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIEFVVEhPUklUWV9JTkZPX0FDQ0VTUyAqdjJpX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQoreworCUFVVEhPUklUWV9JTkZPX0FDQ0VTUyAqYWluZm8gPSBOVUxMOworCUNPTkZfVkFMVUUgKmNuZiwgY3RtcDsKKwlBQ0NFU1NfREVTQ1JJUFRJT04gKmFjYzsKKwlpbnQgaSwgb2JqbGVuOworCWNoYXIgKm9ianRtcCwgKnB0bXA7CisJaWYoIShhaW5mbyA9IHNrX0FDQ0VTU19ERVNDUklQVElPTl9uZXdfbnVsbCgpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKSB7CisJCWNuZiA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCWlmKCEoYWNjID0gQUNDRVNTX0RFU0NSSVBUSU9OX25ldygpKQorCQkJfHwgIXNrX0FDQ0VTU19ERVNDUklQVElPTl9wdXNoKGFpbmZvLCBhY2MpKSB7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlwdG1wID0gc3RyY2hyKGNuZi0+bmFtZSwgJzsnKTsKKwkJaWYoIXB0bXApIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQVVUSE9SSVRZX0lORk9fQUNDRVNTLFg1MDlWM19SX0lOVkFMSURfU1lOVEFYKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCW9iamxlbiA9IHB0bXAgLSBjbmYtPm5hbWU7CisJCWN0bXAubmFtZSA9IHB0bXAgKyAxOworCQljdG1wLnZhbHVlID0gY25mLT52YWx1ZTsKKwkJaWYoIXYyaV9HRU5FUkFMX05BTUVfZXgoYWNjLT5sb2NhdGlvbiwgbWV0aG9kLCBjdHgsICZjdG1wLCAwKSkKKwkJCQkJCQkJIGdvdG8gZXJyOyAKKwkJaWYoIShvYmp0bXAgPSBPUEVOU1NMX21hbGxvYyhvYmpsZW4gKyAxKSkpIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQVVUSE9SSVRZX0lORk9fQUNDRVNTLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXN0cm5jcHkob2JqdG1wLCBjbmYtPm5hbWUsIG9iamxlbik7CisJCW9ianRtcFtvYmpsZW5dID0gMDsKKwkJYWNjLT5tZXRob2QgPSBPQkpfdHh0Mm9iaihvYmp0bXAsIDApOworCQlpZighYWNjLT5tZXRob2QpIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfQVVUSE9SSVRZX0lORk9fQUNDRVNTLFg1MDlWM19SX0JBRF9PQkpFQ1QpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsICJ2YWx1ZT0iLCBvYmp0bXApOworCQkJT1BFTlNTTF9mcmVlKG9ianRtcCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlPUEVOU1NMX2ZyZWUob2JqdG1wKTsKKworCX0KKwlyZXR1cm4gYWluZm87CisJZXJyOgorCXNrX0FDQ0VTU19ERVNDUklQVElPTl9wb3BfZnJlZShhaW5mbywgQUNDRVNTX0RFU0NSSVBUSU9OX2ZyZWUpOworCXJldHVybiBOVUxMOworfQorCitpbnQgaTJhX0FDQ0VTU19ERVNDUklQVElPTihCSU8gKmJwLCBBQ0NFU1NfREVTQ1JJUFRJT04qIGEpCisgICAgICAgIHsKKwlpMmFfQVNOMV9PQkpFQ1QoYnAsIGEtPm1ldGhvZCk7CisjaWZkZWYgVU5ERUYKKwlpMmFfR0VORVJBTF9OQU1FKGJwLCBhLT5sb2NhdGlvbik7CisjZW5kaWYKKwlyZXR1cm4gMjsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX2ludC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmZkMTRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19pbnQuYwpAQCAtMCwwICsxLDg5IEBACisvKiB2M19pbnQuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2NybF9udW0gPSB7IAorCU5JRF9jcmxfbnVtYmVyLCAwLCBBU04xX0lURU1fcmVmKEFTTjFfSU5URUdFUiksCisJMCwwLDAsMCwKKwkoWDUwOVYzX0VYVF9JMlMpaTJzX0FTTjFfSU5URUdFUiwKKwkwLAorCTAsMCwwLDAsIE5VTEx9OworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19kZWx0YV9jcmwgPSB7IAorCU5JRF9kZWx0YV9jcmwsIDAsIEFTTjFfSVRFTV9yZWYoQVNOMV9JTlRFR0VSKSwKKwkwLDAsMCwwLAorCShYNTA5VjNfRVhUX0kyUylpMnNfQVNOMV9JTlRFR0VSLAorCTAsCisJMCwwLDAsMCwgTlVMTH07CisKK3N0YXRpYyB2b2lkICogczJpX2FzbjFfaW50KFg1MDlWM19FWFRfTUVUSE9EICptZXRoLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnZhbHVlKQorCXsKKwlyZXR1cm4gczJpX0FTTjFfSU5URUdFUihtZXRoLCB2YWx1ZSk7CisJfQorCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19pbmhpYml0X2FueXAgPSB7IAorCU5JRF9pbmhpYml0X2FueV9wb2xpY3ksIDAsIEFTTjFfSVRFTV9yZWYoQVNOMV9JTlRFR0VSKSwKKwkwLDAsMCwwLAorCShYNTA5VjNfRVhUX0kyUylpMnNfQVNOMV9JTlRFR0VSLAorCShYNTA5VjNfRVhUX1MySSlzMmlfYXNuMV9pbnQsCisJMCwwLDAsMCwgTlVMTH07CisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19saWIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxZTFkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfbGliLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qIHYzX2xpYi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogWDUwOSB2MyBleHRlbnNpb24gdXRpbGl0aWVzICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworI2luY2x1ZGUgImV4dF9kYXQuaCIKKworc3RhdGljIFNUQUNLX09GKFg1MDlWM19FWFRfTUVUSE9EKSAqZXh0X2xpc3QgPSBOVUxMOworCitzdGF0aWMgaW50IGV4dF9jbXAoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKiBjb25zdCAqYSwKKwkJY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKiBjb25zdCAqYik7CitzdGF0aWMgdm9pZCBleHRfbGlzdF9mcmVlKFg1MDlWM19FWFRfTUVUSE9EICpleHQpOworCitpbnQgWDUwOVYzX0VYVF9hZGQoWDUwOVYzX0VYVF9NRVRIT0QgKmV4dCkKK3sKKwlpZighZXh0X2xpc3QgJiYgIShleHRfbGlzdCA9IHNrX1g1MDlWM19FWFRfTUVUSE9EX25ldyhleHRfY21wKSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1g1MDlWM19FWFRfQURELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmKCFza19YNTA5VjNfRVhUX01FVEhPRF9wdXNoKGV4dF9saXN0LCBleHQpKSB7CisJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfRVhUX0FERCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHRfY21wKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICogY29uc3QgKmEsCisJCSAgIGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICogY29uc3QgKmIpCit7CisJcmV0dXJuICgoKmEpLT5leHRfbmlkIC0gKCpiKS0+ZXh0X25pZCk7Cit9CisKK0RFQ0xBUkVfT0JKX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICosIGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICosCisJCQkgICBleHQpOworSU1QTEVNRU5UX09CSl9CU0VBUkNIX0NNUF9GTihjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqLAorCQkJICAgICBjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqLCBleHQpOworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqWDUwOVYzX0VYVF9nZXRfbmlkKGludCBuaWQpCit7CisJWDUwOVYzX0VYVF9NRVRIT0QgdG1wOworCWNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICp0ID0gJnRtcCwgKiBjb25zdCAqcmV0OworCWludCBpZHg7CisJaWYobmlkIDwgMCkgcmV0dXJuIE5VTEw7CisJdG1wLmV4dF9uaWQgPSBuaWQ7CisJcmV0ID0gT0JKX2JzZWFyY2hfZXh0KCZ0LCBzdGFuZGFyZF9leHRzLCBTVEFOREFSRF9FWFRFTlNJT05fQ09VTlQpOworCWlmKHJldCkgcmV0dXJuICpyZXQ7CisJaWYoIWV4dF9saXN0KSByZXR1cm4gTlVMTDsKKwlpZHggPSBza19YNTA5VjNfRVhUX01FVEhPRF9maW5kKGV4dF9saXN0LCAmdG1wKTsKKwlpZihpZHggPT0gLTEpIHJldHVybiBOVUxMOworCXJldHVybiBza19YNTA5VjNfRVhUX01FVEhPRF92YWx1ZShleHRfbGlzdCwgaWR4KTsKK30KKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKlg1MDlWM19FWFRfZ2V0KFg1MDlfRVhURU5TSU9OICpleHQpCit7CisJaW50IG5pZDsKKwlpZigobmlkID0gT0JKX29iajJuaWQoZXh0LT5vYmplY3QpKSA9PSBOSURfdW5kZWYpIHJldHVybiBOVUxMOworCXJldHVybiBYNTA5VjNfRVhUX2dldF9uaWQobmlkKTsKK30KKworCitpbnQgWDUwOVYzX0VYVF9hZGRfbGlzdChYNTA5VjNfRVhUX01FVEhPRCAqZXh0bGlzdCkKK3sKKwlmb3IoO2V4dGxpc3QtPmV4dF9uaWQhPS0xO2V4dGxpc3QrKykgCisJCQlpZighWDUwOVYzX0VYVF9hZGQoZXh0bGlzdCkpIHJldHVybiAwOworCXJldHVybiAxOworfQorCitpbnQgWDUwOVYzX0VYVF9hZGRfYWxpYXMoaW50IG5pZF90bywgaW50IG5pZF9mcm9tKQoreworCWNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICpleHQ7CisJWDUwOVYzX0VYVF9NRVRIT0QgKnRtcGV4dDsKKworCWlmKCEoZXh0ID0gWDUwOVYzX0VYVF9nZXRfbmlkKG5pZF9mcm9tKSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1g1MDlWM19FWFRfQUREX0FMSUFTLFg1MDlWM19SX0VYVEVOU0lPTl9OT1RfRk9VTkQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYoISh0bXBleHQgPSAoWDUwOVYzX0VYVF9NRVRIT0QgKilPUEVOU1NMX21hbGxvYyhzaXplb2YoWDUwOVYzX0VYVF9NRVRIT0QpKSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1g1MDlWM19FWFRfQUREX0FMSUFTLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIDA7CisJfQorCSp0bXBleHQgPSAqZXh0OworCXRtcGV4dC0+ZXh0X25pZCA9IG5pZF90bzsKKwl0bXBleHQtPmV4dF9mbGFncyB8PSBYNTA5VjNfRVhUX0RZTkFNSUM7CisJcmV0dXJuIFg1MDlWM19FWFRfYWRkKHRtcGV4dCk7Cit9CisKK3ZvaWQgWDUwOVYzX0VYVF9jbGVhbnVwKHZvaWQpCit7CisJc2tfWDUwOVYzX0VYVF9NRVRIT0RfcG9wX2ZyZWUoZXh0X2xpc3QsIGV4dF9saXN0X2ZyZWUpOworCWV4dF9saXN0ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZXh0X2xpc3RfZnJlZShYNTA5VjNfRVhUX01FVEhPRCAqZXh0KQoreworCWlmKGV4dC0+ZXh0X2ZsYWdzICYgWDUwOVYzX0VYVF9EWU5BTUlDKSBPUEVOU1NMX2ZyZWUoZXh0KTsKK30KKworLyogTGVnYWN5IGZ1bmN0aW9uOiB3ZSBkb24ndCBuZWVkIHRvIGFkZCBzdGFuZGFyZCBleHRlbnNpb25zCisgKiBhbnkgbW9yZSBiZWNhdXNlIHRoZXkgYXJlIG5vdyBrZXB0IGluIGV4dF9kYXQuaC4KKyAqLworCitpbnQgWDUwOVYzX2FkZF9zdGFuZGFyZF9leHRlbnNpb25zKHZvaWQpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qIFJldHVybiBhbiBleHRlbnNpb24gaW50ZXJuYWwgc3RydWN0dXJlICovCisKK3ZvaWQgKlg1MDlWM19FWFRfZDJpKFg1MDlfRVhURU5TSU9OICpleHQpCit7CisJY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCisJaWYoIShtZXRob2QgPSBYNTA5VjNfRVhUX2dldChleHQpKSkgcmV0dXJuIE5VTEw7CisJcCA9IGV4dC0+dmFsdWUtPmRhdGE7CisJaWYobWV0aG9kLT5pdCkgcmV0dXJuIEFTTjFfaXRlbV9kMmkoTlVMTCwgJnAsIGV4dC0+dmFsdWUtPmxlbmd0aCwgQVNOMV9JVEVNX3B0cihtZXRob2QtPml0KSk7CisJcmV0dXJuIG1ldGhvZC0+ZDJpKE5VTEwsICZwLCBleHQtPnZhbHVlLT5sZW5ndGgpOworfQorCisvKiBHZXQgY3JpdGljYWwgZmxhZyBhbmQgZGVjb2RlZCB2ZXJzaW9uIG9mIGV4dGVuc2lvbiBmcm9tIGEgTklELgorICogVGhlICJpZHgiIHZhcmlhYmxlIHJldHVybnMgdGhlIGxhc3QgZm91bmQgZXh0ZW5zaW9uIGFuZCBjYW4KKyAqIGJlIHVzZWQgdG8gcmV0cmlldmUgbXVsdGlwbGUgZXh0ZW5zaW9ucyBvZiB0aGUgc2FtZSBOSUQuCisgKiBIb3dldmVyIG11bHRpcGxlIGV4dGVuc2lvbnMgd2l0aCB0aGUgc2FtZSBOSUQgaXMgdXN1YWxseQorICogZHVlIHRvIGEgYmFkbHkgZW5jb2RlZCBjZXJ0aWZpY2F0ZSBzbyBpZiBpZHggaXMgTlVMTCB3ZQorICogY2hva2UgaWYgbXVsdGlwbGUgZXh0ZW5zaW9ucyBleGlzdC4KKyAqIFRoZSAiY3JpdCIgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBjcml0aWNhbCB2YWx1ZS4KKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGRlY29kZWQgZXh0ZW5zaW9uIG9yIE5VTEwgb24KKyAqIGVycm9yLiBUaGUgYWN0dWFsIGVycm9yIGNhbiBoYXZlIHNldmVyYWwgZGlmZmVyZW50IGNhdXNlcywKKyAqIHRoZSB2YWx1ZSBvZiAqY3JpdCByZWZsZWN0cyB0aGUgY2F1c2U6CisgKiA+PSAwLCBleHRlbnNpb24gZm91bmQgYnV0IG5vdCBkZWNvZGVkIChyZWZsZWN0cyBjcml0aWNhbCB2YWx1ZSkuCisgKiAtMSBleHRlbnNpb24gbm90IGZvdW5kLgorICogLTIgZXh0ZW5zaW9uIG9jY3VycyBtb3JlIHRoYW4gb25jZS4KKyAqLworCit2b2lkICpYNTA5VjNfZ2V0X2QyaShTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpCit7CisJaW50IGxhc3Rwb3MsIGk7CisJWDUwOV9FWFRFTlNJT04gKmV4LCAqZm91bmRfZXggPSBOVUxMOworCWlmKCF4KSB7CisJCWlmKGlkeCkgKmlkeCA9IC0xOworCQlpZihjcml0KSAqY3JpdCA9IC0xOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYoaWR4KSBsYXN0cG9zID0gKmlkeCArIDE7CisJZWxzZSBsYXN0cG9zID0gMDsKKwlpZihsYXN0cG9zIDwgMCkgbGFzdHBvcyA9IDA7CisJZm9yKGkgPSBsYXN0cG9zOyBpIDwgc2tfWDUwOV9FWFRFTlNJT05fbnVtKHgpOyBpKyspCisJeworCQlleCA9IHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKHgsIGkpOworCQlpZihPQkpfb2JqMm5pZChleC0+b2JqZWN0KSA9PSBuaWQpIHsKKwkJCWlmKGlkeCkgeworCQkJCSppZHggPSBpOworCQkJCWZvdW5kX2V4ID0gZXg7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYoZm91bmRfZXgpIHsKKwkJCQkvKiBGb3VuZCBtb3JlIHRoYW4gb25lICovCisJCQkJaWYoY3JpdCkgKmNyaXQgPSAtMjsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWZvdW5kX2V4ID0gZXg7CisJCX0KKwl9CisJaWYoZm91bmRfZXgpIHsKKwkJLyogRm91bmQgaXQgKi8KKwkJaWYoY3JpdCkgKmNyaXQgPSBYNTA5X0VYVEVOU0lPTl9nZXRfY3JpdGljYWwoZm91bmRfZXgpOworCQlyZXR1cm4gWDUwOVYzX0VYVF9kMmkoZm91bmRfZXgpOworCX0KKworCS8qIEV4dGVuc2lvbiBub3QgZm91bmQgKi8KKwlpZihpZHgpICppZHggPSAtMTsKKwlpZihjcml0KSAqY3JpdCA9IC0xOworCXJldHVybiBOVUxMOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGEgZ2VuZXJhbCBleHRlbnNpb24gYXBwZW5kLCByZXBsYWNlIGFuZCBkZWxldGUgdXRpbGl0eS4KKyAqIFRoZSBwcmVjaXNlIG9wZXJhdGlvbiBpcyBnb3Zlcm5lZCBieSB0aGUgJ2ZsYWdzJyB2YWx1ZS4gVGhlICdjcml0JyBhbmQKKyAqICd2YWx1ZScgYXJndW1lbnRzIChpZiByZWxldmFudCkgYXJlIHRoZSBleHRlbnNpb25zIGludGVybmFsIHN0cnVjdHVyZS4KKyAqLworCitpbnQgWDUwOVYzX2FkZDFfaTJkKFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKngsIGludCBuaWQsIHZvaWQgKnZhbHVlLAorCQkJCQlpbnQgY3JpdCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpbnQgZXh0aWR4ID0gLTE7CisJaW50IGVycmNvZGU7CisJWDUwOV9FWFRFTlNJT04gKmV4dCwgKmV4dG1wOworCXVuc2lnbmVkIGxvbmcgZXh0X29wID0gZmxhZ3MgJiBYNTA5VjNfQUREX09QX01BU0s7CisKKwkvKiBJZiBhcHBlbmRpbmcgd2UgZG9uJ3QgY2FyZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZQorCSAqIGxvb2sgZm9yIGV4aXN0aW5nIGV4dGVuc2lvbi4KKwkgKi8KKwlpZihleHRfb3AgIT0gWDUwOVYzX0FERF9BUFBFTkQpCisJCWV4dGlkeCA9IFg1MDl2M19nZXRfZXh0X2J5X05JRCgqeCwgbmlkLCAtMSk7CisKKwkvKiBTZWUgaWYgZXh0ZW5zaW9uIGV4aXN0cyAqLworCWlmKGV4dGlkeCA+PSAwKSB7CisJCS8qIElmIGtlZXAgZXhpc3RpbmcsIG5vdGhpbmcgdG8gZG8gKi8KKwkJaWYoZXh0X29wID09IFg1MDlWM19BRERfS0VFUF9FWElTVElORykKKwkJCXJldHVybiAxOworCQkvKiBJZiBkZWZhdWx0IHRoZW4gaXRzIGFuIGVycm9yICovCisJCWlmKGV4dF9vcCA9PSBYNTA5VjNfQUREX0RFRkFVTFQpIHsKKwkJCWVycmNvZGUgPSBYNTA5VjNfUl9FWFRFTlNJT05fRVhJU1RTOworCQkJZ290byBlcnI7CisJCX0KKwkJLyogSWYgZGVsZXRlLCBqdXN0IGRlbGV0ZSBpdCAqLworCQlpZihleHRfb3AgPT0gWDUwOVYzX0FERF9ERUxFVEUpIHsKKwkJCWlmKCFza19YNTA5X0VYVEVOU0lPTl9kZWxldGUoKngsIGV4dGlkeCkpIHJldHVybiAtMTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgcmVwbGFjZSBleGlzdGluZyBvciBkZWxldGUsIGVycm9yIHNpbmNlIAorCQkgKiBleHRlbnNpb24gbXVzdCBleGlzdAorCQkgKi8KKwkJaWYoKGV4dF9vcCA9PSBYNTA5VjNfQUREX1JFUExBQ0VfRVhJU1RJTkcpIHx8CisJCSAgIChleHRfb3AgPT0gWDUwOVYzX0FERF9ERUxFVEUpKSB7CisJCQllcnJjb2RlID0gWDUwOVYzX1JfRVhURU5TSU9OX05PVF9GT1VORDsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJLyogSWYgd2UgZ2V0IHRoaXMgZmFyIHRoZW4gd2UgaGF2ZSB0byBjcmVhdGUgYW4gZXh0ZW5zaW9uOgorCSAqIGNvdWxkIGhhdmUgc29tZSBmbGFncyBmb3IgYWx0ZXJuYXRpdmUgZW5jb2Rpbmcgc2NoZW1lcy4uLgorCSAqLworCisJZXh0ID0gWDUwOVYzX0VYVF9pMmQobmlkLCBjcml0LCB2YWx1ZSk7CisKKwlpZighZXh0KSB7CisJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfQUREMV9JMkQsIFg1MDlWM19SX0VSUk9SX0NSRUFUSU5HX0VYVEVOU0lPTik7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIGV4dGVuc2lvbiBleGlzdHMgcmVwbGFjZSBpdC4uICovCisJaWYoZXh0aWR4ID49IDApIHsKKwkJZXh0bXAgPSBza19YNTA5X0VYVEVOU0lPTl92YWx1ZSgqeCwgZXh0aWR4KTsKKwkJWDUwOV9FWFRFTlNJT05fZnJlZShleHRtcCk7CisJCWlmKCFza19YNTA5X0VYVEVOU0lPTl9zZXQoKngsIGV4dGlkeCwgZXh0KSkgcmV0dXJuIC0xOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZighKnggJiYgISgqeCA9IHNrX1g1MDlfRVhURU5TSU9OX25ld19udWxsKCkpKSByZXR1cm4gLTE7CisJaWYoIXNrX1g1MDlfRVhURU5TSU9OX3B1c2goKngsIGV4dCkpIHJldHVybiAtMTsKKworCXJldHVybiAxOworCisJZXJyOgorCWlmKCEoZmxhZ3MgJiBYNTA5VjNfQUREX1NJTEVOVCkpCisJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfQUREMV9JMkQsIGVycmNvZGUpOworCXJldHVybiAwOworfQorCitJTVBMRU1FTlRfU1RBQ0tfT0YoWDUwOVYzX0VYVF9NRVRIT0QpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX25jb25zLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX25jb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg5ZGY0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfbmNvbnMuYwpAQCAtMCwwICsxLDUwNiBAQAorLyogdjNfbmNvbnMuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIHZvaWQgKnYyaV9OQU1FX0NPTlNUUkFJTlRTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKK3N0YXRpYyBpbnQgaTJyX05BTUVfQ09OU1RSQUlOVFMoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgCisJCQkJdm9pZCAqYSwgQklPICpicCwgaW50IGluZCk7CitzdGF0aWMgaW50IGRvX2kycl9uYW1lX2NvbnN0cmFpbnRzKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICAgU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqdHJlZXMsCisJCQkJICAgQklPICpicCwgaW50IGluZCwgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IHByaW50X25jX2lwYWRkKEJJTyAqYnAsIEFTTjFfT0NURVRfU1RSSU5HICppcCk7CisKK3N0YXRpYyBpbnQgbmNfbWF0Y2goR0VORVJBTF9OQU1FICpnZW4sIE5BTUVfQ09OU1RSQUlOVFMgKm5jKTsKK3N0YXRpYyBpbnQgbmNfbWF0Y2hfc2luZ2xlKEdFTkVSQUxfTkFNRSAqc3ViLCBHRU5FUkFMX05BTUUgKmdlbik7CitzdGF0aWMgaW50IG5jX2RuKFg1MDlfTkFNRSAqc3ViLCBYNTA5X05BTUUgKm5tKTsKK3N0YXRpYyBpbnQgbmNfZG5zKEFTTjFfSUE1U1RSSU5HICpzdWIsIEFTTjFfSUE1U1RSSU5HICpkbnMpOworc3RhdGljIGludCBuY19lbWFpbChBU04xX0lBNVNUUklORyAqc3ViLCBBU04xX0lBNVNUUklORyAqZW1sKTsKK3N0YXRpYyBpbnQgbmNfdXJpKEFTTjFfSUE1U1RSSU5HICp1cmksIEFTTjFfSUE1U1RSSU5HICpiYXNlKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfbmFtZV9jb25zdHJhaW50cyA9IHsKKwlOSURfbmFtZV9jb25zdHJhaW50cywgMCwKKwlBU04xX0lURU1fcmVmKE5BTUVfQ09OU1RSQUlOVFMpLAorCTAsMCwwLDAsCisJMCwwLAorCTAsIHYyaV9OQU1FX0NPTlNUUkFJTlRTLAorCWkycl9OQU1FX0NPTlNUUkFJTlRTLDAsCisJTlVMTAorfTsKKworQVNOMV9TRVFVRU5DRShHRU5FUkFMX1NVQlRSRUUpID0geworCUFTTjFfU0lNUExFKEdFTkVSQUxfU1VCVFJFRSwgYmFzZSwgR0VORVJBTF9OQU1FKSwKKwlBU04xX0lNUF9PUFQoR0VORVJBTF9TVUJUUkVFLCBtaW5pbXVtLCBBU04xX0lOVEVHRVIsIDApLAorCUFTTjFfSU1QX09QVChHRU5FUkFMX1NVQlRSRUUsIG1heGltdW0sIEFTTjFfSU5URUdFUiwgMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoR0VORVJBTF9TVUJUUkVFKQorCitBU04xX1NFUVVFTkNFKE5BTUVfQ09OU1RSQUlOVFMpID0geworCUFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChOQU1FX0NPTlNUUkFJTlRTLCBwZXJtaXR0ZWRTdWJ0cmVlcywKKwkJCQkJCQlHRU5FUkFMX1NVQlRSRUUsIDApLAorCUFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChOQU1FX0NPTlNUUkFJTlRTLCBleGNsdWRlZFN1YnRyZWVzLAorCQkJCQkJCUdFTkVSQUxfU1VCVFJFRSwgMSksCit9IEFTTjFfU0VRVUVOQ0VfRU5EKE5BTUVfQ09OU1RSQUlOVFMpCisJCisKK0lNUExFTUVOVF9BU04xX0FMTE9DX0ZVTkNUSU9OUyhHRU5FUkFMX1NVQlRSRUUpCitJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlMoTkFNRV9DT05TVFJBSU5UUykKKworc3RhdGljIHZvaWQgKnYyaV9OQU1FX0NPTlNUUkFJTlRTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJICBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQorCXsKKwlpbnQgaTsKKwlDT05GX1ZBTFVFIHR2YWwsICp2YWw7CisJU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqKnB0cmVlID0gTlVMTDsKKwlOQU1FX0NPTlNUUkFJTlRTICpuY29ucyA9IE5VTEw7CisJR0VORVJBTF9TVUJUUkVFICpzdWIgPSBOVUxMOworCW5jb25zID0gTkFNRV9DT05TVFJBSU5UU19uZXcoKTsKKwlpZiAoIW5jb25zKQorCQlnb3RvIG1lbWVycjsKKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bShudmFsKTsgaSsrKQorCQl7CisJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUobnZhbCwgaSk7CisJCWlmICghc3RybmNtcCh2YWwtPm5hbWUsICJwZXJtaXR0ZWQiLCA5KSAmJiB2YWwtPm5hbWVbOV0pCisJCQl7CisJCQlwdHJlZSA9ICZuY29ucy0+cGVybWl0dGVkU3VidHJlZXM7CisJCQl0dmFsLm5hbWUgPSB2YWwtPm5hbWUgKyAxMDsKKwkJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAodmFsLT5uYW1lLCAiZXhjbHVkZWQiLCA4KSAmJiB2YWwtPm5hbWVbOF0pCisJCQl7CisJCQlwdHJlZSA9ICZuY29ucy0+ZXhjbHVkZWRTdWJ0cmVlczsKKwkJCXR2YWwubmFtZSA9IHZhbC0+bmFtZSArIDk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfTkFNRV9DT05TVFJBSU5UUywgWDUwOVYzX1JfSU5WQUxJRF9TWU5UQVgpOworCQkJZ290byBlcnI7CisJCQl9CisJCXR2YWwudmFsdWUgPSB2YWwtPnZhbHVlOworCQlzdWIgPSBHRU5FUkFMX1NVQlRSRUVfbmV3KCk7CisJCWlmICghdjJpX0dFTkVSQUxfTkFNRV9leChzdWItPmJhc2UsIG1ldGhvZCwgY3R4LCAmdHZhbCwgMSkpCisJCQlnb3RvIGVycjsKKwkJaWYgKCEqcHRyZWUpCisJCQkqcHRyZWUgPSBza19HRU5FUkFMX1NVQlRSRUVfbmV3X251bGwoKTsKKwkJaWYgKCEqcHRyZWUgfHwgIXNrX0dFTkVSQUxfU1VCVFJFRV9wdXNoKCpwdHJlZSwgc3ViKSkKKwkJCWdvdG8gbWVtZXJyOworCQlzdWIgPSBOVUxMOworCQl9CisKKwlyZXR1cm4gbmNvbnM7CisKKwltZW1lcnI6CisJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9OQU1FX0NPTlNUUkFJTlRTLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJZXJyOgorCWlmIChuY29ucykKKwkJTkFNRV9DT05TVFJBSU5UU19mcmVlKG5jb25zKTsKKwlpZiAoc3ViKQorCQlHRU5FUkFMX1NVQlRSRUVfZnJlZShzdWIpOworCisJcmV0dXJuIE5VTEw7CisJfQorCQkJCisKKwkKKworc3RhdGljIGludCBpMnJfTkFNRV9DT05TVFJBSU5UUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICphLAorCQkJCUJJTyAqYnAsIGludCBpbmQpCisJeworCU5BTUVfQ09OU1RSQUlOVFMgKm5jb25zID0gYTsKKwlkb19pMnJfbmFtZV9jb25zdHJhaW50cyhtZXRob2QsIG5jb25zLT5wZXJtaXR0ZWRTdWJ0cmVlcywKKwkJCQkJYnAsIGluZCwgIlBlcm1pdHRlZCIpOworCWRvX2kycl9uYW1lX2NvbnN0cmFpbnRzKG1ldGhvZCwgbmNvbnMtPmV4Y2x1ZGVkU3VidHJlZXMsCisJCQkJCWJwLCBpbmQsICJFeGNsdWRlZCIpOworCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBkb19pMnJfbmFtZV9jb25zdHJhaW50cyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSAgIFNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKnRyZWVzLAorCQkJCSAgIEJJTyAqYnAsIGludCBpbmQsIGNoYXIgKm5hbWUpCisJeworCUdFTkVSQUxfU1VCVFJFRSAqdHJlZTsKKwlpbnQgaTsKKwlpZiAoc2tfR0VORVJBTF9TVUJUUkVFX251bSh0cmVlcykgPiAwKQorCQlCSU9fcHJpbnRmKGJwLCAiJSpzJXM6XG4iLCBpbmQsICIiLCBuYW1lKTsKKwlmb3IoaSA9IDA7IGkgPCBza19HRU5FUkFMX1NVQlRSRUVfbnVtKHRyZWVzKTsgaSsrKQorCQl7CisJCXRyZWUgPSBza19HRU5FUkFMX1NVQlRSRUVfdmFsdWUodHJlZXMsIGkpOworCQlCSU9fcHJpbnRmKGJwLCAiJSpzIiwgaW5kICsgMiwgIiIpOworCQlpZiAodHJlZS0+YmFzZS0+dHlwZSA9PSBHRU5fSVBBREQpCisJCQlwcmludF9uY19pcGFkZChicCwgdHJlZS0+YmFzZS0+ZC5pcCk7CisJCWVsc2UKKwkJCUdFTkVSQUxfTkFNRV9wcmludChicCwgdHJlZS0+YmFzZSk7CisJCXRyZWUgPSBza19HRU5FUkFMX1NVQlRSRUVfdmFsdWUodHJlZXMsIGkpOworCQlCSU9fcHV0cyhicCwgIlxuIik7CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcHJpbnRfbmNfaXBhZGQoQklPICpicCwgQVNOMV9PQ1RFVF9TVFJJTkcgKmlwKQorCXsKKwlpbnQgaSwgbGVuOworCXVuc2lnbmVkIGNoYXIgKnA7CisJcCA9IGlwLT5kYXRhOworCWxlbiA9IGlwLT5sZW5ndGg7CisJQklPX3B1dHMoYnAsICJJUDoiKTsKKwlpZihsZW4gPT0gOCkKKwkJeworCQlCSU9fcHJpbnRmKGJwLCAiJWQuJWQuJWQuJWQvJWQuJWQuJWQuJWQiLAorCQkJCXBbMF0sIHBbMV0sIHBbMl0sIHBbM10sCisJCQkJcFs0XSwgcFs1XSwgcFs2XSwgcFs3XSk7CisJCX0KKwllbHNlIGlmKGxlbiA9PSAzMikKKwkJeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCXsKKwkJCUJJT19wcmludGYoYnAsICIlWCIsIHBbMF0gPDwgOCB8IHBbMV0pOworCQkJcCArPSAyOworCQkJaWYgKGkgPT0gNykKKwkJCQlCSU9fcHV0cyhicCwgIi8iKTsKKwkJCWVsc2UgaWYgKGkgIT0gMTUpCisJCQkJQklPX3B1dHMoYnAsICI6Iik7CisJCQl9CisJCX0KKwllbHNlCisJCUJJT19wcmludGYoYnAsICJJUCBBZGRyZXNzOjxpbnZhbGlkPiIpOworCXJldHVybiAxOworCX0KKworLyogQ2hlY2sgYSBjZXJ0aWZpY2F0ZSBjb25mb3JtcyB0byBhIHNwZWNpZmllZCBzZXQgb2YgY29uc3RyYWludHMuCisgKiBSZXR1cm4gdmFsdWVzOgorICogIFg1MDlfVl9PSzogQWxsIGNvbnN0cmFpbnRzIG9iZXllZC4KKyAqICBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT046IFBlcm1pdHRlZCBzdWJ0cmVlIHZpb2xhdGlvbi4KKyAqICBYNTA5X1ZfRVJSX0VYQ0xVREVEX1ZJT0xBVElPTjogRXhjbHVkZWQgc3VidHJlZSB2aW9sYXRpb24uCisgKiAgWDUwOV9WX0VSUl9TVUJUUkVFX01JTk1BWDogTWluIG9yIG1heCB2YWx1ZXMgcHJlc2VudCBhbmQgbWF0Y2hpbmcgdHlwZS4KKyAqICBYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX0NPTlNUUkFJTlRfVFlQRTogIFVuc3VwcG9ydGVkIGNvbnN0cmFpbnQgdHlwZS4KKyAqICBYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX0NPTlNUUkFJTlRfU1lOVEFYOiBiYWQgdW5zdXBwb3J0ZWQgY29uc3RyYWludCBzeW50YXguCisgKiAgWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9OQU1FX1NZTlRBWDogYmFkIG9yIHVuc3VwcG9ydGVkIHN5bnRheCBvZiBuYW1lCisKKyAqLworCitpbnQgTkFNRV9DT05TVFJBSU5UU19jaGVjayhYNTA5ICp4LCBOQU1FX0NPTlNUUkFJTlRTICpuYykKKwl7CisJaW50IHIsIGk7CisJWDUwOV9OQU1FICpubTsKKworCW5tID0gWDUwOV9nZXRfc3ViamVjdF9uYW1lKHgpOworCisJaWYgKFg1MDlfTkFNRV9lbnRyeV9jb3VudChubSkgPiAwKQorCQl7CisJCUdFTkVSQUxfTkFNRSBnbnRtcDsKKwkJZ250bXAudHlwZSA9IEdFTl9ESVJOQU1FOworCQlnbnRtcC5kLmRpcmVjdG9yeU5hbWUgPSBubTsKKworCQlyID0gbmNfbWF0Y2goJmdudG1wLCBuYyk7CisKKwkJaWYgKHIgIT0gWDUwOV9WX09LKQorCQkJcmV0dXJuIHI7CisKKwkJZ250bXAudHlwZSA9IEdFTl9FTUFJTDsKKworCisJCS8qIFByb2Nlc3MgYW55IGVtYWlsIGFkZHJlc3MgYXR0cmlidXRlcyBpbiBzdWJqZWN0IG5hbWUgKi8KKworCQlmb3IgKGkgPSAtMTs7KQorCQkJeworCQkJWDUwOV9OQU1FX0VOVFJZICpuZTsKKwkJCWkgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChubSwKKwkJCQkJCSAgICAgICBOSURfcGtjczlfZW1haWxBZGRyZXNzLAorCQkJCQkJICAgICAgIGkpOworCQkJaWYgKGkgPT0gLTEpCisJCQkJYnJlYWs7CisJCQluZSA9IFg1MDlfTkFNRV9nZXRfZW50cnkobm0sIGkpOworCQkJZ250bXAuZC5yZmM4MjJOYW1lID0gWDUwOV9OQU1FX0VOVFJZX2dldF9kYXRhKG5lKTsKKwkJCWlmIChnbnRtcC5kLnJmYzgyMk5hbWUtPnR5cGUgIT0gVl9BU04xX0lBNVNUUklORykKKwkJCQlyZXR1cm4gWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9OQU1FX1NZTlRBWDsKKworCQkJciA9IG5jX21hdGNoKCZnbnRtcCwgbmMpOworCisJCQlpZiAociAhPSBYNTA5X1ZfT0spCisJCQkJcmV0dXJuIHI7CisJCQl9CisJCQorCQl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfR0VORVJBTF9OQU1FX251bSh4LT5hbHRuYW1lKTsgaSsrKQorCQl7CisJCUdFTkVSQUxfTkFNRSAqZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKHgtPmFsdG5hbWUsIGkpOworCQlyID0gbmNfbWF0Y2goZ2VuLCBuYyk7CisJCWlmIChyICE9IFg1MDlfVl9PSykKKwkJCXJldHVybiByOworCQl9CisKKwlyZXR1cm4gWDUwOV9WX09LOworCisJfQorCitzdGF0aWMgaW50IG5jX21hdGNoKEdFTkVSQUxfTkFNRSAqZ2VuLCBOQU1FX0NPTlNUUkFJTlRTICpuYykKKwl7CisJR0VORVJBTF9TVUJUUkVFICpzdWI7CisJaW50IGksIHIsIG1hdGNoID0gMDsKKworCS8qIFBlcm1pdHRlZCBzdWJ0cmVlczogaWYgYW55IHN1YnRyZWVzIGV4aXN0IG9mIG1hdGNoaW5nIHRoZSB0eXBlCisJICogYXQgbGVhc3Qgb25lIHN1YnRyZWUgbXVzdCBtYXRjaC4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBza19HRU5FUkFMX1NVQlRSRUVfbnVtKG5jLT5wZXJtaXR0ZWRTdWJ0cmVlcyk7IGkrKykKKwkJeworCQlzdWIgPSBza19HRU5FUkFMX1NVQlRSRUVfdmFsdWUobmMtPnBlcm1pdHRlZFN1YnRyZWVzLCBpKTsKKwkJaWYgKGdlbi0+dHlwZSAhPSBzdWItPmJhc2UtPnR5cGUpCisJCQljb250aW51ZTsKKwkJaWYgKHN1Yi0+bWluaW11bSB8fCBzdWItPm1heGltdW0pCisJCQlyZXR1cm4gWDUwOV9WX0VSUl9TVUJUUkVFX01JTk1BWDsKKwkJLyogSWYgd2UgYWxyZWFkeSBoYXZlIGEgbWF0Y2ggZG9uJ3QgYm90aGVyIHRyeWluZyBhbnkgbW9yZSAqLworCQlpZiAobWF0Y2ggPT0gMikKKwkJCWNvbnRpbnVlOworCQlpZiAobWF0Y2ggPT0gMCkKKwkJCW1hdGNoID0gMTsKKwkJciA9IG5jX21hdGNoX3NpbmdsZShnZW4sIHN1Yi0+YmFzZSk7CisJCWlmIChyID09IFg1MDlfVl9PSykKKwkJCW1hdGNoID0gMjsKKwkJZWxzZSBpZiAociAhPSBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT04pCisJCQlyZXR1cm4gcjsKKwkJfQorCisJaWYgKG1hdGNoID09IDEpCisJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisKKwkvKiBFeGNsdWRlZCBzdWJ0cmVlczogbXVzdCBub3QgbWF0Y2ggYW55IG9mIHRoZXNlICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc2tfR0VORVJBTF9TVUJUUkVFX251bShuYy0+ZXhjbHVkZWRTdWJ0cmVlcyk7IGkrKykKKwkJeworCQlzdWIgPSBza19HRU5FUkFMX1NVQlRSRUVfdmFsdWUobmMtPmV4Y2x1ZGVkU3VidHJlZXMsIGkpOworCQlpZiAoZ2VuLT50eXBlICE9IHN1Yi0+YmFzZS0+dHlwZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3ViLT5taW5pbXVtIHx8IHN1Yi0+bWF4aW11bSkKKwkJCXJldHVybiBYNTA5X1ZfRVJSX1NVQlRSRUVfTUlOTUFYOworCisJCXIgPSBuY19tYXRjaF9zaW5nbGUoZ2VuLCBzdWItPmJhc2UpOworCQlpZiAociA9PSBYNTA5X1ZfT0spCisJCQlyZXR1cm4gWDUwOV9WX0VSUl9FWENMVURFRF9WSU9MQVRJT047CisJCWVsc2UgaWYgKHIgIT0gWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OKQorCQkJcmV0dXJuIHI7CisKKwkJfQorCisJcmV0dXJuIFg1MDlfVl9PSzsKKworCX0KKworc3RhdGljIGludCBuY19tYXRjaF9zaW5nbGUoR0VORVJBTF9OQU1FICpnZW4sIEdFTkVSQUxfTkFNRSAqYmFzZSkKKwl7CisJc3dpdGNoKGJhc2UtPnR5cGUpCisJCXsKKwkJY2FzZSBHRU5fRElSTkFNRToKKwkJcmV0dXJuIG5jX2RuKGdlbi0+ZC5kaXJlY3RvcnlOYW1lLCBiYXNlLT5kLmRpcmVjdG9yeU5hbWUpOworCisJCWNhc2UgR0VOX0ROUzoKKwkJcmV0dXJuIG5jX2RucyhnZW4tPmQuZE5TTmFtZSwgYmFzZS0+ZC5kTlNOYW1lKTsKKworCQljYXNlIEdFTl9FTUFJTDoKKwkJcmV0dXJuIG5jX2VtYWlsKGdlbi0+ZC5yZmM4MjJOYW1lLCBiYXNlLT5kLnJmYzgyMk5hbWUpOworCisJCWNhc2UgR0VOX1VSSToKKwkJcmV0dXJuIG5jX3VyaShnZW4tPmQudW5pZm9ybVJlc291cmNlSWRlbnRpZmllciwKKwkJCQkJYmFzZS0+ZC51bmlmb3JtUmVzb3VyY2VJZGVudGlmaWVyKTsKKworCQlkZWZhdWx0OgorCQlyZXR1cm4gWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9DT05TVFJBSU5UX1RZUEU7CisJCX0KKworCX0KKworLyogZGlyZWN0b3J5TmFtZSBuYW1lIGNvbnN0cmFpbnQgbWF0Y2hpbmcuCisgKiBUaGUgY2Fub25pY2FsIGVuY29kaW5nIG9mIFg1MDlfTkFNRSBtYWtlcyB0aGlzIGNvbXBhcmlzb24gZWFzeS4gSXQgaXMKKyAqIG1hdGNoZWQgaWYgdGhlIHN1YnRyZWUgaXMgYSBzdWJzZXQgb2YgdGhlIG5hbWUuCisgKi8KKworc3RhdGljIGludCBuY19kbihYNTA5X05BTUUgKm5tLCBYNTA5X05BTUUgKmJhc2UpCisJeworCS8qIEVuc3VyZSBjYW5vbmljYWwgZW5jb2RpbmdzIGFyZSB1cCB0byBkYXRlLiAgKi8KKwlpZiAobm0tPm1vZGlmaWVkICYmIGkyZF9YNTA5X05BTUUobm0sIE5VTEwpIDwgMCkKKwkJcmV0dXJuIFg1MDlfVl9FUlJfT1VUX09GX01FTTsKKwlpZiAoYmFzZS0+bW9kaWZpZWQgJiYgaTJkX1g1MDlfTkFNRShiYXNlLCBOVUxMKSA8IDApCisJCXJldHVybiBYNTA5X1ZfRVJSX09VVF9PRl9NRU07CisJaWYgKGJhc2UtPmNhbm9uX2VuY2xlbiA+IG5tLT5jYW5vbl9lbmNsZW4pCisJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisJaWYgKG1lbWNtcChiYXNlLT5jYW5vbl9lbmMsIG5tLT5jYW5vbl9lbmMsIGJhc2UtPmNhbm9uX2VuY2xlbikpCisJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisJcmV0dXJuIFg1MDlfVl9PSzsKKwl9CisKK3N0YXRpYyBpbnQgbmNfZG5zKEFTTjFfSUE1U1RSSU5HICpkbnMsIEFTTjFfSUE1U1RSSU5HICpiYXNlKQorCXsKKwljaGFyICpiYXNlcHRyID0gKGNoYXIgKiliYXNlLT5kYXRhOworCWNoYXIgKmRuc3B0ciA9IChjaGFyICopZG5zLT5kYXRhOworCS8qIEVtcHR5IG1hdGNoZXMgZXZlcnl0aGluZyAqLworCWlmICghKmJhc2VwdHIpCisJCXJldHVybiBYNTA5X1ZfT0s7CisJLyogT3RoZXJ3aXNlIGNhbiBhZGQgemVybyBvciBtb3JlIGNvbXBvbmVudHMgb24gdGhlIGxlZnQgc28KKwkgKiBjb21wYXJlIFJIUyBhbmQgaWYgZG5zIGlzIGxvbmdlciBhbmQgZXhwZWN0ICcuJyBhcyBwcmVjZWRpbmcKKwkgKiBjaGFyYWN0ZXIuCisJICovCisJaWYgKGRucy0+bGVuZ3RoID4gYmFzZS0+bGVuZ3RoKQorCQl7CisJCWRuc3B0ciArPSBkbnMtPmxlbmd0aCAtIGJhc2UtPmxlbmd0aDsKKwkJaWYgKGRuc3B0clstMV0gIT0gJy4nKQorCQkJcmV0dXJuIFg1MDlfVl9FUlJfUEVSTUlUVEVEX1ZJT0xBVElPTjsKKwkJfQorCisJaWYgKHN0cmNhc2VjbXAoYmFzZXB0ciwgZG5zcHRyKSkKKwkJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisKKwlyZXR1cm4gWDUwOV9WX09LOworCisJfQorCitzdGF0aWMgaW50IG5jX2VtYWlsKEFTTjFfSUE1U1RSSU5HICplbWwsIEFTTjFfSUE1U1RSSU5HICpiYXNlKQorCXsKKwljb25zdCBjaGFyICpiYXNlcHRyID0gKGNoYXIgKiliYXNlLT5kYXRhOworCWNvbnN0IGNoYXIgKmVtbHB0ciA9IChjaGFyICopZW1sLT5kYXRhOworCisJY29uc3QgY2hhciAqYmFzZWF0ID0gc3RyY2hyKGJhc2VwdHIsICdAJyk7CisJY29uc3QgY2hhciAqZW1sYXQgPSBzdHJjaHIoZW1scHRyLCAnQCcpOworCWlmICghZW1sYXQpCisJCXJldHVybiBYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX05BTUVfU1lOVEFYOworCS8qIFNwZWNpYWwgY2FzZTogaW5pdGFsICcuJyBpcyBSSFMgbWF0Y2ggKi8KKwlpZiAoIWJhc2VhdCAmJiAoKmJhc2VwdHIgPT0gJy4nKSkKKwkJeworCQlpZiAoZW1sLT5sZW5ndGggPiBiYXNlLT5sZW5ndGgpCisJCQl7CisJCQllbWxwdHIgKz0gZW1sLT5sZW5ndGggLSBiYXNlLT5sZW5ndGg7CisJCQlpZiAoIXN0cmNhc2VjbXAoYmFzZXB0ciwgZW1scHRyKSkKKwkJCQlyZXR1cm4gWDUwOV9WX09LOworCQkJfQorCQlyZXR1cm4gWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OOworCQl9CisKKwkvKiBJZiB3ZSBoYXZlIGFueXRoaW5nIGJlZm9yZSAnQCcgbWF0Y2ggbG9jYWwgcGFydCAqLworCisJaWYgKGJhc2VhdCkKKwkJeworCQlpZiAoYmFzZWF0ICE9IGJhc2VwdHIpCisJCQl7CisJCQlpZiAoKGJhc2VhdCAtIGJhc2VwdHIpICE9IChlbWxhdCAtIGVtbHB0cikpCisJCQkJcmV0dXJuIFg1MDlfVl9FUlJfUEVSTUlUVEVEX1ZJT0xBVElPTjsKKwkJCS8qIENhc2Ugc2Vuc2l0aXZlIG1hdGNoIG9mIGxvY2FsIHBhcnQgKi8KKwkJCWlmIChzdHJuY21wKGJhc2VwdHIsIGVtbHB0ciwgZW1sYXQgLSBlbWxwdHIpKQorCQkJCXJldHVybiBYNTA5X1ZfRVJSX1BFUk1JVFRFRF9WSU9MQVRJT047CisJCQl9CisJCS8qIFBvc2l0aW9uIGJhc2UgYWZ0ZXIgJ0AnICovCisJCWJhc2VwdHIgPSBiYXNlYXQgKyAxOworCQl9CisJZW1scHRyID0gZW1sYXQgKyAxOworCS8qIEp1c3QgaGF2ZSBob3N0bmFtZSBsZWZ0IHRvIG1hdGNoOiBjYXNlIGluc2Vuc2l0aXZlICovCisJaWYgKHN0cmNhc2VjbXAoYmFzZXB0ciwgZW1scHRyKSkKKwkJcmV0dXJuIFg1MDlfVl9FUlJfUEVSTUlUVEVEX1ZJT0xBVElPTjsKKworCXJldHVybiBYNTA5X1ZfT0s7CisKKwl9CisKK3N0YXRpYyBpbnQgbmNfdXJpKEFTTjFfSUE1U1RSSU5HICp1cmksIEFTTjFfSUE1U1RSSU5HICpiYXNlKQorCXsKKwljb25zdCBjaGFyICpiYXNlcHRyID0gKGNoYXIgKiliYXNlLT5kYXRhOworCWNvbnN0IGNoYXIgKmhvc3RwdHIgPSAoY2hhciAqKXVyaS0+ZGF0YTsKKwljb25zdCBjaGFyICpwID0gc3RyY2hyKGhvc3RwdHIsICc6Jyk7CisJaW50IGhvc3RsZW47CisJLyogQ2hlY2sgZm9yIGZvbzovLyBhbmQgc2tpcCBwYXN0IGl0ICovCisJaWYgKCFwIHx8IChwWzFdICE9ICcvJykgfHwgKHBbMl0gIT0gJy8nKSkKKwkJcmV0dXJuIFg1MDlfVl9FUlJfVU5TVVBQT1JURURfTkFNRV9TWU5UQVg7CisJaG9zdHB0ciA9IHAgKyAzOworCisJLyogRGV0ZXJtaW5lIGxlbmd0aCBvZiBob3N0bmFtZSBwYXJ0IG9mIFVSSSAqLworCisJLyogTG9vayBmb3IgYSBwb3J0IGluZGljYXRvciBhcyBlbmQgb2YgaG9zdG5hbWUgZmlyc3QgKi8KKworCXAgPSBzdHJjaHIoaG9zdHB0ciwgJzonKTsKKwkvKiBPdGhlcndpc2UgbG9vayBmb3IgdHJhaWxpbmcgc2xhc2ggKi8KKwlpZiAoIXApCisJCXAgPSBzdHJjaHIoaG9zdHB0ciwgJy8nKTsKKworCWlmICghcCkKKwkJaG9zdGxlbiA9IHN0cmxlbihob3N0cHRyKTsKKwllbHNlCisJCWhvc3RsZW4gPSBwIC0gaG9zdHB0cjsKKworCWlmIChob3N0bGVuID09IDApCisJCXJldHVybiBYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX05BTUVfU1lOVEFYOworCisJLyogU3BlY2lhbCBjYXNlOiBpbml0YWwgJy4nIGlzIFJIUyBtYXRjaCAqLworCWlmICgqYmFzZXB0ciA9PSAnLicpCisJCXsKKwkJaWYgKGhvc3RsZW4gPiBiYXNlLT5sZW5ndGgpCisJCQl7CisJCQlwID0gaG9zdHB0ciArIGhvc3RsZW4gLSBiYXNlLT5sZW5ndGg7CisJCQlpZiAoIXN0cm5jYXNlY21wKHAsIGJhc2VwdHIsIGJhc2UtPmxlbmd0aCkpCisJCQkJcmV0dXJuIFg1MDlfVl9PSzsKKwkJCX0KKwkJcmV0dXJuIFg1MDlfVl9FUlJfUEVSTUlUVEVEX1ZJT0xBVElPTjsKKwkJfQorCisJaWYgKChiYXNlLT5sZW5ndGggIT0gKGludClob3N0bGVuKSB8fCBzdHJuY2FzZWNtcChob3N0cHRyLCBiYXNlcHRyLCBob3N0bGVuKSkKKwkJcmV0dXJuIFg1MDlfVl9FUlJfUEVSTUlUVEVEX1ZJT0xBVElPTjsKKworCXJldHVybiBYNTA5X1ZfT0s7CisKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX29jc3AuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfb2NzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTY1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX29jc3AuYwpAQCAtMCwwICsxLDI4OSBAQAorLyogdjNfb2NzcC5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fT0NTUAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2NzcC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKy8qIE9DU1AgZXh0ZW5zaW9ucyBhbmQgYSBjb3VwbGUgb2YgQ1JMIGVudHJ5IGV4dGVuc2lvbnMKKyAqLworCitzdGF0aWMgaW50IGkycl9vY3NwX2NybGlkKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKm5vbmNlLAorCQkJICBCSU8gKm91dCwgaW50IGluZGVudCk7CitzdGF0aWMgaW50IGkycl9vY3NwX2FjdXRvZmYoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqbm9uY2UsCisJCQkgICAgQklPICpvdXQsIGludCBpbmRlbnQpOworc3RhdGljIGludCBpMnJfb2JqZWN0KGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKm9iaiwgQklPICpvdXQsCisJCSAgICAgIGludCBpbmRlbnQpOworCitzdGF0aWMgdm9pZCAqb2NzcF9ub25jZV9uZXcodm9pZCk7CitzdGF0aWMgaW50IGkyZF9vY3NwX25vbmNlKHZvaWQgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCk7CitzdGF0aWMgdm9pZCAqZDJpX29jc3Bfbm9uY2Uodm9pZCAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCk7CitzdGF0aWMgdm9pZCBvY3NwX25vbmNlX2ZyZWUodm9pZCAqYSk7CitzdGF0aWMgaW50IGkycl9vY3NwX25vbmNlKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKm5vbmNlLAorCQkJICBCSU8gKm91dCwgaW50IGluZGVudCk7CisKK3N0YXRpYyBpbnQgaTJyX29jc3Bfbm9jaGVjayhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJICAgIHZvaWQgKm5vY2hlY2ssIEJJTyAqb3V0LCBpbnQgaW5kZW50KTsKK3N0YXRpYyB2b2lkICpzMmlfb2NzcF9ub2NoZWNrKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgaW50IGkycl9vY3NwX3NlcnZpY2Vsb2MoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqaW4sCisJCQkgICAgICAgQklPICpicCwgaW50IGluZCk7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX29jc3BfY3JsaWQgPSB7CisJTklEX2lkX3BraXhfT0NTUF9DcmxJRCwgMCwgQVNOMV9JVEVNX3JlZihPQ1NQX0NSTElEKSwKKwkwLDAsMCwwLAorCTAsMCwKKwkwLDAsCisJaTJyX29jc3BfY3JsaWQsMCwKKwlOVUxMCit9OworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19vY3NwX2FjdXRvZmYgPSB7CisJTklEX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmLCAwLCBBU04xX0lURU1fcmVmKEFTTjFfR0VORVJBTElaRURUSU1FKSwKKwkwLDAsMCwwLAorCTAsMCwKKwkwLDAsCisJaTJyX29jc3BfYWN1dG9mZiwwLAorCU5VTEwKK307CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX2NybF9pbnZkYXRlID0geworCU5JRF9pbnZhbGlkaXR5X2RhdGUsIDAsIEFTTjFfSVRFTV9yZWYoQVNOMV9HRU5FUkFMSVpFRFRJTUUpLAorCTAsMCwwLDAsCisJMCwwLAorCTAsMCwKKwlpMnJfb2NzcF9hY3V0b2ZmLDAsCisJTlVMTAorfTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgdjNfY3JsX2hvbGQgPSB7CisJTklEX2hvbGRfaW5zdHJ1Y3Rpb25fY29kZSwgMCwgQVNOMV9JVEVNX3JlZihBU04xX09CSkVDVCksCisJMCwwLDAsMCwKKwkwLDAsCisJMCwwLAorCWkycl9vYmplY3QsMCwKKwlOVUxMCit9OworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19vY3NwX25vbmNlID0geworCU5JRF9pZF9wa2l4X09DU1BfTm9uY2UsIDAsIE5VTEwsCisJb2NzcF9ub25jZV9uZXcsCisJb2NzcF9ub25jZV9mcmVlLAorCWQyaV9vY3NwX25vbmNlLAorCWkyZF9vY3NwX25vbmNlLAorCTAsMCwKKwkwLDAsCisJaTJyX29jc3Bfbm9uY2UsMCwKKwlOVUxMCit9OworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19vY3NwX25vY2hlY2sgPSB7CisJTklEX2lkX3BraXhfT0NTUF9ub0NoZWNrLCAwLCBBU04xX0lURU1fcmVmKEFTTjFfTlVMTCksCisJMCwwLDAsMCwKKwkwLHMyaV9vY3NwX25vY2hlY2ssCisJMCwwLAorCWkycl9vY3NwX25vY2hlY2ssMCwKKwlOVUxMCit9OworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19vY3NwX3NlcnZpY2Vsb2MgPSB7CisJTklEX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvciwgMCwgQVNOMV9JVEVNX3JlZihPQ1NQX1NFUlZJQ0VMT0MpLAorCTAsMCwwLDAsCisJMCwwLAorCTAsMCwKKwlpMnJfb2NzcF9zZXJ2aWNlbG9jLDAsCisJTlVMTAorfTsKKworc3RhdGljIGludCBpMnJfb2NzcF9jcmxpZChjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICppbiwgQklPICpicCwKKwkJCSAgaW50IGluZCkKK3sKKwlPQ1NQX0NSTElEICphID0gaW47CisJaWYgKGEtPmNybFVybCkKKwkgICAgICAgIHsKKwkJaWYgKEJJT19wcmludGYoYnAsICIlKnNjcmxVcmw6ICIsIGluZCwgIiIpIDw9IDApIGdvdG8gZXJyOworCQlpZiAoIUFTTjFfU1RSSU5HX3ByaW50KGJwLCAoQVNOMV9TVFJJTkcqKWEtPmNybFVybCkpIGdvdG8gZXJyOworCQlpZiAoQklPX3dyaXRlKGJwLCAiXG4iLCAxKSA8PSAwKSBnb3RvIGVycjsKKwkJfQorCWlmIChhLT5jcmxOdW0pCisJICAgICAgICB7CisJCWlmIChCSU9fcHJpbnRmKGJwLCAiJSpzY3JsTnVtOiAiLCBpbmQsICIiKSA8PSAwKSBnb3RvIGVycjsKKwkJaWYgKGkyYV9BU04xX0lOVEVHRVIoYnAsIGEtPmNybE51bSkgPD0gMCkgZ290byBlcnI7CisJCWlmIChCSU9fd3JpdGUoYnAsICJcbiIsIDEpIDw9IDApIGdvdG8gZXJyOworCQl9CisJaWYgKGEtPmNybFRpbWUpCisJICAgICAgICB7CisJCWlmIChCSU9fcHJpbnRmKGJwLCAiJSpzY3JsVGltZTogIiwgaW5kLCAiIikgPD0gMCkgZ290byBlcnI7CisJCWlmICghQVNOMV9HRU5FUkFMSVpFRFRJTUVfcHJpbnQoYnAsIGEtPmNybFRpbWUpKSBnb3RvIGVycjsKKwkJaWYgKEJJT193cml0ZShicCwgIlxuIiwgMSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlyZXR1cm4gMTsKKwllcnI6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJyX29jc3BfYWN1dG9mZihjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICpjdXRvZmYsCisJCQkgICAgQklPICpicCwgaW50IGluZCkKK3sKKwlpZiAoQklPX3ByaW50ZihicCwgIiUqcyIsIGluZCwgIiIpIDw9IDApIHJldHVybiAwOworCWlmKCFBU04xX0dFTkVSQUxJWkVEVElNRV9wcmludChicCwgY3V0b2ZmKSkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBpMnJfb2JqZWN0KGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKm9pZCwgQklPICpicCwKKwkJICAgICAgaW50IGluZCkKK3sKKwlpZiAoQklPX3ByaW50ZihicCwgIiUqcyIsIGluZCwgIiIpIDw9IDApIHJldHVybiAwOworCWlmKGkyYV9BU04xX09CSkVDVChicCwgb2lkKSA8PSAwKSByZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyogT0NTUCBub25jZS4gVGhpcyBpcyBuZWVkcyBzcGVjaWFsIHRyZWF0bWVudCBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZQorICogYW4gQVNOMSBlbmNvZGluZyBhdCBhbGw6IGl0IGp1c3QgY29udGFpbnMgYXJiaXRyYXJ5IGRhdGEuCisgKi8KKworc3RhdGljIHZvaWQgKm9jc3Bfbm9uY2VfbmV3KHZvaWQpCit7CisJcmV0dXJuIEFTTjFfT0NURVRfU1RSSU5HX25ldygpOworfQorCitzdGF0aWMgaW50IGkyZF9vY3NwX25vbmNlKHZvaWQgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCkKK3sKKwlBU04xX09DVEVUX1NUUklORyAqb3MgPSBhOworCWlmKHBwKSB7CisJCW1lbWNweSgqcHAsIG9zLT5kYXRhLCBvcy0+bGVuZ3RoKTsKKwkJKnBwICs9IG9zLT5sZW5ndGg7CisJfQorCXJldHVybiBvcy0+bGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCAqZDJpX29jc3Bfbm9uY2Uodm9pZCAqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCkKK3sKKwlBU04xX09DVEVUX1NUUklORyAqb3MsICoqcG9zOworCXBvcyA9IGE7CisJaWYoIXBvcyB8fCAhKnBvcykgb3MgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwllbHNlIG9zID0gKnBvczsKKwlpZighQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KG9zLCAqcHAsIGxlbmd0aCkpIGdvdG8gZXJyOworCisJKnBwICs9IGxlbmd0aDsKKworCWlmKHBvcykgKnBvcyA9IG9zOworCXJldHVybiBvczsKKworCWVycjoKKwlpZihvcyAmJiAoIXBvcyB8fCAoKnBvcyAhPSBvcykpKSBNX0FTTjFfT0NURVRfU1RSSU5HX2ZyZWUob3MpOworCU9DU1BlcnIoT0NTUF9GX0QySV9PQ1NQX05PTkNFLCBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG9jc3Bfbm9uY2VfZnJlZSh2b2lkICphKQoreworCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShhKTsKK30KKworc3RhdGljIGludCBpMnJfb2NzcF9ub25jZShjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICpub25jZSwKKwkJCSAgQklPICpvdXQsIGludCBpbmRlbnQpCit7CisJaWYoQklPX3ByaW50ZihvdXQsICIlKnMiLCBpbmRlbnQsICIiKSA8PSAwKSByZXR1cm4gMDsKKwlpZihpMmFfQVNOMV9TVFJJTkcob3V0LCBub25jZSwgVl9BU04xX09DVEVUX1NUUklORykgPD0gMCkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIE5vY2hlY2sgaXMganVzdCBhIHNpbmdsZSBOVUxMLiBEb24ndCBwcmludCBhbnl0aGluZyBhbmQgYWx3YXlzIHNldCBpdCAqLworCitzdGF0aWMgaW50IGkycl9vY3NwX25vY2hlY2soY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqbm9jaGVjaywKKwkJCSAgICBCSU8gKm91dCwgaW50IGluZGVudCkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgKnMyaV9vY3NwX25vY2hlY2soY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgICAgY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiBBU04xX05VTExfbmV3KCk7Cit9CisKK3N0YXRpYyBpbnQgaTJyX29jc3Bfc2VydmljZWxvYyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCB2b2lkICppbiwKKwkJCSAgICAgICBCSU8gKmJwLCBpbnQgaW5kKQorICAgICAgICB7CisJaW50IGk7CisJT0NTUF9TRVJWSUNFTE9DICphID0gaW47CisJQUNDRVNTX0RFU0NSSVBUSU9OICphZDsKKworICAgICAgICBpZiAoQklPX3ByaW50ZihicCwgIiUqc0lzc3VlcjogIiwgaW5kLCAiIikgPD0gMCkgZ290byBlcnI7CisgICAgICAgIGlmIChYNTA5X05BTUVfcHJpbnRfZXgoYnAsIGEtPmlzc3VlciwgMCwgWE5fRkxBR19PTkVMSU5FKSA8PSAwKSBnb3RvIGVycjsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX251bShhLT5sb2NhdG9yKTsgaSsrKQorCSAgICAgICAgeworCQkJCWFkID0gc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3ZhbHVlKGEtPmxvY2F0b3IsaSk7CisJCQkJaWYgKEJJT19wcmludGYoYnAsICJcbiUqcyIsICgyKmluZCksICIiKSA8PSAwKSAKKwkJCQkJZ290byBlcnI7CisJCQkJaWYoaTJhX0FTTjFfT0JKRUNUKGJwLCBhZC0+bWV0aG9kKSA8PSAwKSBnb3RvIGVycjsKKwkJCQlpZihCSU9fcHV0cyhicCwgIiAtICIpIDw9IDApIGdvdG8gZXJyOworCQkJCWlmKEdFTkVSQUxfTkFNRV9wcmludChicCwgYWQtPmxvY2F0aW9uKSA8PSAwKSBnb3RvIGVycjsKKwkJfQorCXJldHVybiAxOworZXJyOgorCXJldHVybiAwOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19wY2kuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjZmEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGNpLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qIHYzX3BjaS5jIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBDb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBQcm9qZWN0IDIwMDQKKyAqIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykKKyAqLworLyogQ29weXJpZ2h0IChjKSAyMDA0IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgorICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKK3N0YXRpYyBpbnQgaTJyX3BjaShYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpleHQsCisJQklPICpvdXQsIGludCBpbmRlbnQpOworc3RhdGljIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnIyaV9wY2koWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwlYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX3BjaSA9CisJeyBOSURfcHJveHlDZXJ0SW5mbywgMCwgQVNOMV9JVEVNX3JlZihQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OKSwKKwkgIDAsMCwwLDAsCisJICAwLDAsCisJICBOVUxMLCBOVUxMLAorCSAgKFg1MDlWM19FWFRfSTJSKWkycl9wY2ksCisJICAoWDUwOVYzX0VYVF9SMkkpcjJpX3BjaSwKKwkgIE5VTEwsCisJfTsKKworc3RhdGljIGludCBpMnJfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04gKnBjaSwKKwlCSU8gKm91dCwgaW50IGluZGVudCkKKwl7CisJQklPX3ByaW50ZihvdXQsICIlKnNQYXRoIExlbmd0aCBDb25zdHJhaW50OiAiLCBpbmRlbnQsICIiKTsKKwlpZiAocGNpLT5wY1BhdGhMZW5ndGhDb25zdHJhaW50KQorCSAgaTJhX0FTTjFfSU5URUdFUihvdXQsIHBjaS0+cGNQYXRoTGVuZ3RoQ29uc3RyYWludCk7CisJZWxzZQorCSAgQklPX3ByaW50ZihvdXQsICJpbmZpbml0ZSIpOworCUJJT19wdXRzKG91dCwgIlxuIik7CisJQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3kgTGFuZ3VhZ2U6ICIsIGluZGVudCwgIiIpOworCWkyYV9BU04xX09CSkVDVChvdXQsIHBjaS0+cHJveHlQb2xpY3ktPnBvbGljeUxhbmd1YWdlKTsKKwlCSU9fcHV0cyhvdXQsICJcbiIpOworCWlmIChwY2ktPnByb3h5UG9saWN5LT5wb2xpY3kgJiYgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5LT5kYXRhKQorCSAgQklPX3ByaW50ZihvdXQsICIlKnNQb2xpY3kgVGV4dDogJXNcbiIsIGluZGVudCwgIiIsCisJCSAgICAgcGNpLT5wcm94eVBvbGljeS0+cG9saWN5LT5kYXRhKTsKKwlyZXR1cm4gMTsKKwl9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19wY2lfdmFsdWUoQ09ORl9WQUxVRSAqdmFsLAorCUFTTjFfT0JKRUNUICoqbGFuZ3VhZ2UsIEFTTjFfSU5URUdFUiAqKnBhdGhsZW4sCisJQVNOMV9PQ1RFVF9TVFJJTkcgKipwb2xpY3kpCisJeworCWludCBmcmVlX3BvbGljeSA9IDA7CisKKwlpZiAoc3RyY21wKHZhbC0+bmFtZSwgImxhbmd1YWdlIikgPT0gMCkKKwkJeworCQlpZiAoKmxhbmd1YWdlKQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX1BPTElDWV9MQU5HVUFHRV9BTFJFQURZX0RFRklORUQpOworCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJaWYgKCEoKmxhbmd1YWdlID0gT0JKX3R4dDJvYmoodmFsLT52YWx1ZSwgMCkpKQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX0lOVkFMSURfT0JKRUNUX0lERU5USUZJRVIpOworCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCWVsc2UgaWYgKHN0cmNtcCh2YWwtPm5hbWUsICJwYXRobGVuIikgPT0gMCkKKwkJeworCQlpZiAoKnBhdGhsZW4pCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFlfREVGSU5FRCk7CisJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlpZiAoIVg1MDlWM19nZXRfdmFsdWVfaW50KHZhbCwgcGF0aGxlbikpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwllbHNlIGlmIChzdHJjbXAodmFsLT5uYW1lLCAicG9saWN5IikgPT0gMCkKKwkJeworCQl1bnNpZ25lZCBjaGFyICp0bXBfZGF0YSA9IE5VTEw7CisJCWxvbmcgdmFsX2xlbjsKKwkJaWYgKCEqcG9saWN5KQorCQkJeworCQkJKnBvbGljeSA9IEFTTjFfT0NURVRfU1RSSU5HX25ldygpOworCQkJaWYgKCEqcG9saWN5KQorCQkJCXsKKwkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWZyZWVfcG9saWN5ID0gMTsKKwkJCX0KKwkJaWYgKHN0cm5jbXAodmFsLT52YWx1ZSwgImhleDoiLCA0KSA9PSAwKQorCQkJeworCQkJdW5zaWduZWQgY2hhciAqdG1wX2RhdGEyID0KKwkJCQlzdHJpbmdfdG9faGV4KHZhbC0+dmFsdWUgKyA0LCAmdmFsX2xlbik7CisKKwkJCWlmICghdG1wX2RhdGEyKSAKKwkJCQl7CisJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX0lMTEVHQUxfSEVYX0RJR0lUKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCXRtcF9kYXRhID0gT1BFTlNTTF9yZWFsbG9jKCgqcG9saWN5KS0+ZGF0YSwKKwkJCQkoKnBvbGljeSktPmxlbmd0aCArIHZhbF9sZW4gKyAxKTsKKwkJCWlmICh0bXBfZGF0YSkKKwkJCQl7CisJCQkJKCpwb2xpY3kpLT5kYXRhID0gdG1wX2RhdGE7CisJCQkJbWVtY3B5KCYoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdLAorCQkJCQl0bXBfZGF0YTIsIHZhbF9sZW4pOworCQkJCSgqcG9saWN5KS0+bGVuZ3RoICs9IHZhbF9sZW47CisJCQkJKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSA9ICdcMCc7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlPUEVOU1NMX2ZyZWUodG1wX2RhdGEyKTsKKwkJCQkvKiByZWFsbG9jIGZhaWx1cmUgaW1wbGllcyB0aGUgb3JpZ2luYWwgZGF0YSBzcGFjZSBpcyBiMHJrZWQgdG9vISAqLworCQkJCSgqcG9saWN5KS0+ZGF0YSA9IE5VTEw7CisJCQkJKCpwb2xpY3kpLT5sZW5ndGggPSAwOworCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJT1BFTlNTTF9mcmVlKHRtcF9kYXRhMik7CisJCQl9CisJCWVsc2UgaWYgKHN0cm5jbXAodmFsLT52YWx1ZSwgImZpbGU6IiwgNSkgPT0gMCkKKwkJCXsKKwkJCXVuc2lnbmVkIGNoYXIgYnVmWzIwNDhdOworCQkJaW50IG47CisJCQlCSU8gKmIgPSBCSU9fbmV3X2ZpbGUodmFsLT52YWx1ZSArIDUsICJyIik7CisJCQlpZiAoIWIpCisJCQkJeworCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxFUlJfUl9CSU9fTElCKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl3aGlsZSgobiA9IEJJT19yZWFkKGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA+IDAKKwkJCQl8fCAobiA9PSAwICYmIEJJT19zaG91bGRfcmV0cnkoYikpKQorCQkJCXsKKwkJCQlpZiAoIW4pIGNvbnRpbnVlOworCisJCQkJdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAorCQkJCQkoKnBvbGljeSktPmxlbmd0aCArIG4gKyAxKTsKKworCQkJCWlmICghdG1wX2RhdGEpCisJCQkJCWJyZWFrOworCisJCQkJKCpwb2xpY3kpLT5kYXRhID0gdG1wX2RhdGE7CisJCQkJbWVtY3B5KCYoKnBvbGljeSktPmRhdGFbKCpwb2xpY3kpLT5sZW5ndGhdLAorCQkJCQlidWYsIG4pOworCQkJCSgqcG9saWN5KS0+bGVuZ3RoICs9IG47CisJCQkJKCpwb2xpY3kpLT5kYXRhWygqcG9saWN5KS0+bGVuZ3RoXSA9ICdcMCc7CisJCQkJfQorCQkJQklPX2ZyZWVfYWxsKGIpOworCisJCQlpZiAobiA8IDApCisJCQkJeworCQkJCVg1MDlWM2VycihYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRSxFUlJfUl9CSU9fTElCKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKHN0cm5jbXAodmFsLT52YWx1ZSwgInRleHQ6IiwgNSkgPT0gMCkKKwkJCXsKKwkJCXZhbF9sZW4gPSBzdHJsZW4odmFsLT52YWx1ZSArIDUpOworCQkJdG1wX2RhdGEgPSBPUEVOU1NMX3JlYWxsb2MoKCpwb2xpY3kpLT5kYXRhLAorCQkJCSgqcG9saWN5KS0+bGVuZ3RoICsgdmFsX2xlbiArIDEpOworCQkJaWYgKHRtcF9kYXRhKQorCQkJCXsKKwkJCQkoKnBvbGljeSktPmRhdGEgPSB0bXBfZGF0YTsKKwkJCQltZW1jcHkoJigqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0sCisJCQkJCXZhbC0+dmFsdWUgKyA1LCB2YWxfbGVuKTsKKwkJCQkoKnBvbGljeSktPmxlbmd0aCArPSB2YWxfbGVuOworCQkJCSgqcG9saWN5KS0+ZGF0YVsoKnBvbGljeSktPmxlbmd0aF0gPSAnXDAnOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJLyogcmVhbGxvYyBmYWlsdXJlIGltcGxpZXMgdGhlIG9yaWdpbmFsIGRhdGEgc3BhY2UgaXMgYjBya2VkIHRvbyEgKi8KKwkJCQkoKnBvbGljeSktPmRhdGEgPSBOVUxMOworCQkJCSgqcG9saWN5KS0+bGVuZ3RoID0gMDsKKwkJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUFJPQ0VTU19QQ0lfVkFMVUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLFg1MDlWM19SX0lOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBRyk7CisJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoIXRtcF9kYXRhKQorCQkJeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlyZXR1cm4gMTsKK2VycjoKKwlpZiAoZnJlZV9wb2xpY3kpCisJCXsKKwkJQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZSgqcG9saWN5KTsKKwkJKnBvbGljeSA9IE5VTEw7CisJCX0KKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OICpyMmlfcGNpKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJWDUwOVYzX0NUWCAqY3R4LCBjaGFyICp2YWx1ZSkKKwl7CisJUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcGNpID0gTlVMTDsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsczsKKwlBU04xX09CSkVDVCAqbGFuZ3VhZ2UgPSBOVUxMOworCUFTTjFfSU5URUdFUiAqcGF0aGxlbiA9IE5VTEw7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKnBvbGljeSA9IE5VTEw7CisJaW50IGksIGo7CisKKwl2YWxzID0gWDUwOVYzX3BhcnNlX2xpc3QodmFsdWUpOworCWZvciAoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWxzKTsgaSsrKQorCQl7CisJCUNPTkZfVkFMVUUgKmNuZiA9IHNrX0NPTkZfVkFMVUVfdmFsdWUodmFscywgaSk7CisJCWlmICghY25mLT5uYW1lIHx8ICgqY25mLT5uYW1lICE9ICdAJyAmJiAhY25mLT52YWx1ZSkpCisJCQl7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUjJJX1BDSSxYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HKTsKKwkJCVg1MDlWM19jb25mX2VycihjbmYpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmICgqY25mLT5uYW1lID09ICdAJykKKwkJCXsKKwkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0OworCQkJaW50IHN1Y2Nlc3NfcCA9IDE7CisKKwkJCXNlY3QgPSBYNTA5VjNfZ2V0X3NlY3Rpb24oY3R4LCBjbmYtPm5hbWUgKyAxKTsKKwkJCWlmICghc2VjdCkKKwkJCQl7CisJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksWDUwOVYzX1JfSU5WQUxJRF9TRUNUSU9OKTsKKwkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlmb3IgKGogPSAwOyBzdWNjZXNzX3AgJiYgaiA8IHNrX0NPTkZfVkFMVUVfbnVtKHNlY3QpOyBqKyspCisJCQkJeworCQkJCXN1Y2Nlc3NfcCA9CisJCQkJCXByb2Nlc3NfcGNpX3ZhbHVlKHNrX0NPTkZfVkFMVUVfdmFsdWUoc2VjdCwgaiksCisJCQkJCQkmbGFuZ3VhZ2UsICZwYXRobGVuLCAmcG9saWN5KTsKKwkJCQl9CisJCQlYNTA5VjNfc2VjdGlvbl9mcmVlKGN0eCwgc2VjdCk7CisJCQlpZiAoIXN1Y2Nlc3NfcCkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKCFwcm9jZXNzX3BjaV92YWx1ZShjbmYsCisJCQkJCSZsYW5ndWFnZSwgJnBhdGhsZW4sICZwb2xpY3kpKQorCQkJCXsKKwkJCQlYNTA5VjNfY29uZl9lcnIoY25mKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCX0KKworCS8qIExhbmd1YWdlIGlzIG1hbmRhdG9yeSAqLworCWlmICghbGFuZ3VhZ2UpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCk7CisJCWdvdG8gZXJyOworCQl9CisJaSA9IE9CSl9vYmoybmlkKGxhbmd1YWdlKTsKKwlpZiAoKGkgPT0gTklEX0luZGVwZW5kZW50IHx8IGkgPT0gTklEX2lkX3BwbF9pbmhlcml0QWxsKSAmJiBwb2xpY3kpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksWDUwOVYzX1JfUE9MSUNZX1dIRU5fUFJPWFlfTEFOR1VBR0VfUkVRVUlSRVNfTk9fUE9MSUNZKTsKKwkJZ290byBlcnI7CisJCX0KKworCXBjaSA9IFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT05fbmV3KCk7CisJaWYgKCFwY2kpCisJCXsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1IySV9QQ0ksRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJcGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UgPSBsYW5ndWFnZTsgbGFuZ3VhZ2UgPSBOVUxMOworCXBjaS0+cHJveHlQb2xpY3ktPnBvbGljeSA9IHBvbGljeTsgcG9saWN5ID0gTlVMTDsKKwlwY2ktPnBjUGF0aExlbmd0aENvbnN0cmFpbnQgPSBwYXRobGVuOyBwYXRobGVuID0gTlVMTDsKKwlnb3RvIGVuZDsKK2VycjoKKwlpZiAobGFuZ3VhZ2UpIHsgQVNOMV9PQkpFQ1RfZnJlZShsYW5ndWFnZSk7IGxhbmd1YWdlID0gTlVMTDsgfQorCWlmIChwYXRobGVuKSB7IEFTTjFfSU5URUdFUl9mcmVlKHBhdGhsZW4pOyBwYXRobGVuID0gTlVMTDsgfQorCWlmIChwb2xpY3kpIHsgQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShwb2xpY3kpOyBwb2xpY3kgPSBOVUxMOyB9CisJaWYgKHBjaSkgeyBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX2ZyZWUocGNpKTsgcGNpID0gTlVMTDsgfQorZW5kOgorCXNrX0NPTkZfVkFMVUVfcG9wX2ZyZWUodmFscywgWDUwOVYzX2NvbmZfZnJlZSk7CisJcmV0dXJuIHBjaTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3BjaWEuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGNpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzYyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3BjaWEuYwpAQCAtMCwwICsxLDU1IEBACisvKiB2M19wY2lhLmMgLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIENvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIFByb2plY3QgMjAwNAorICogYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKQorICovCisvKiBDb3B5cmlnaHQgKGMpIDIwMDQgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCisgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworQVNOMV9TRVFVRU5DRShQUk9YWV9QT0xJQ1kpID0KKwl7CisJQVNOMV9TSU1QTEUoUFJPWFlfUE9MSUNZLHBvbGljeUxhbmd1YWdlLEFTTjFfT0JKRUNUKSwKKwlBU04xX09QVChQUk9YWV9QT0xJQ1kscG9saWN5LEFTTjFfT0NURVRfU1RSSU5HKQorfSBBU04xX1NFUVVFTkNFX0VORChQUk9YWV9QT0xJQ1kpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhQUk9YWV9QT0xJQ1kpCisKK0FTTjFfU0VRVUVOQ0UoUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTikgPQorCXsKKwlBU04xX09QVChQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OLHBjUGF0aExlbmd0aENvbnN0cmFpbnQsQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NJTVBMRShQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OLHByb3h5UG9saWN5LFBST1hZX1BPTElDWSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTikKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT04pCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3Bjb25zLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3Bjb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjYTY1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGNvbnMuYwpAQCAtMCwwICsxLDE0MCBAQAorLyogdjNfcGNvbnMuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjF0Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIFNUQUNLX09GKENPTkZfVkFMVUUpICoKK2kydl9QT0xJQ1lfQ09OU1RSQUlOVFMoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgdm9pZCAqYmNvbnMsCisJCSAgICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCk7CitzdGF0aWMgdm9pZCAqdjJpX1BPTElDWV9DT05TVFJBSU5UUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSAgICBYNTA5VjNfQ1RYICpjdHgsCisJCQkJICAgIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXMpOworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19wb2xpY3lfY29uc3RyYWludHMgPSB7CitOSURfcG9saWN5X2NvbnN0cmFpbnRzLCAwLAorQVNOMV9JVEVNX3JlZihQT0xJQ1lfQ09OU1RSQUlOVFMpLAorMCwwLDAsMCwKKzAsMCwKK2kydl9QT0xJQ1lfQ09OU1RSQUlOVFMsCit2MmlfUE9MSUNZX0NPTlNUUkFJTlRTLAorTlVMTCxOVUxMLAorTlVMTAorfTsKKworQVNOMV9TRVFVRU5DRShQT0xJQ1lfQ09OU1RSQUlOVFMpID0geworCUFTTjFfSU1QX09QVChQT0xJQ1lfQ09OU1RSQUlOVFMsIHJlcXVpcmVFeHBsaWNpdFBvbGljeSwgQVNOMV9JTlRFR0VSLDApLAorCUFTTjFfSU1QX09QVChQT0xJQ1lfQ09OU1RSQUlOVFMsIGluaGliaXRQb2xpY3lNYXBwaW5nLCBBU04xX0lOVEVHRVIsMSkKK30gQVNOMV9TRVFVRU5DRV9FTkQoUE9MSUNZX0NPTlNUUkFJTlRTKQorCitJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlMoUE9MSUNZX0NPTlNUUkFJTlRTKQorCisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqCitpMnZfUE9MSUNZX0NPTlNUUkFJTlRTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKmEsCisJCSAgICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCkKK3sKKwlQT0xJQ1lfQ09OU1RSQUlOVFMgKnBjb25zID0gYTsKKwlYNTA5VjNfYWRkX3ZhbHVlX2ludCgiUmVxdWlyZSBFeHBsaWNpdCBQb2xpY3kiLAorCQkJcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeSwgJmV4dGxpc3QpOworCVg1MDlWM19hZGRfdmFsdWVfaW50KCJJbmhpYml0IFBvbGljeSBNYXBwaW5nIiwKKwkJCXBjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZywgJmV4dGxpc3QpOworCXJldHVybiBleHRsaXN0OworfQorCitzdGF0aWMgdm9pZCAqdjJpX1BPTElDWV9DT05TVFJBSU5UUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSAgICBYNTA5VjNfQ1RYICpjdHgsCisJCQkJICAgIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXMpCit7CisJUE9MSUNZX0NPTlNUUkFJTlRTICpwY29ucz1OVUxMOworCUNPTkZfVkFMVUUgKnZhbDsKKwlpbnQgaTsKKwlpZighKHBjb25zID0gUE9MSUNZX0NPTlNUUkFJTlRTX25ldygpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX1BPTElDWV9DT05TVFJBSU5UUywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0odmFsdWVzKTsgaSsrKSB7CisJCXZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUodmFsdWVzLCBpKTsKKwkJaWYoIXN0cmNtcCh2YWwtPm5hbWUsICJyZXF1aXJlRXhwbGljaXRQb2xpY3kiKSkgeworCQkJaWYoIVg1MDlWM19nZXRfdmFsdWVfaW50KHZhbCwKKwkJCQkmcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeSkpIGdvdG8gZXJyOworCQl9IGVsc2UgaWYoIXN0cmNtcCh2YWwtPm5hbWUsICJpbmhpYml0UG9saWN5TWFwcGluZyIpKSB7CisJCQlpZighWDUwOVYzX2dldF92YWx1ZV9pbnQodmFsLAorCQkJCSZwY29ucy0+aW5oaWJpdFBvbGljeU1hcHBpbmcpKSBnb3RvIGVycjsKKwkJfSBlbHNlIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfUE9MSUNZX0NPTlNUUkFJTlRTLCBYNTA5VjNfUl9JTlZBTElEX05BTUUpOworCQkJWDUwOVYzX2NvbmZfZXJyKHZhbCk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKwlpZiAoIXBjb25zLT5pbmhpYml0UG9saWN5TWFwcGluZyAmJiAhcGNvbnMtPnJlcXVpcmVFeHBsaWNpdFBvbGljeSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX1BPTElDWV9DT05TVFJBSU5UUywgWDUwOVYzX1JfSUxMRUdBTF9FTVBUWV9FWFRFTlNJT04pOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gcGNvbnM7CisJZXJyOgorCVBPTElDWV9DT05TVFJBSU5UU19mcmVlKHBjb25zKTsKKwlyZXR1cm4gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19wa3UuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGt1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2ZjNmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcGt1LmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIHYzX3BrdS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCitzdGF0aWMgaW50IGkycl9QS0VZX1VTQUdFX1BFUklPRChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBQS0VZX1VTQUdFX1BFUklPRCAqdXNhZ2UsIEJJTyAqb3V0LCBpbnQgaW5kZW50KTsKKy8qCitzdGF0aWMgUEtFWV9VU0FHRV9QRVJJT0QgKnYyaV9QS0VZX1VTQUdFX1BFUklPRChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXMpOworKi8KK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX3BrZXlfdXNhZ2VfcGVyaW9kID0geworTklEX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZCwgMCwgQVNOMV9JVEVNX3JlZihQS0VZX1VTQUdFX1BFUklPRCksCiswLDAsMCwwLAorMCwwLDAsMCwKKyhYNTA5VjNfRVhUX0kyUilpMnJfUEtFWV9VU0FHRV9QRVJJT0QsIE5VTEwsCitOVUxMCit9OworCitBU04xX1NFUVVFTkNFKFBLRVlfVVNBR0VfUEVSSU9EKSA9IHsKKwlBU04xX0lNUF9PUFQoUEtFWV9VU0FHRV9QRVJJT0QsIG5vdEJlZm9yZSwgQVNOMV9HRU5FUkFMSVpFRFRJTUUsIDApLAorCUFTTjFfSU1QX09QVChQS0VZX1VTQUdFX1BFUklPRCwgbm90QWZ0ZXIsIEFTTjFfR0VORVJBTElaRURUSU1FLCAxKQorfSBBU04xX1NFUVVFTkNFX0VORChQS0VZX1VTQUdFX1BFUklPRCkKKworSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TKFBLRVlfVVNBR0VfUEVSSU9EKQorCitzdGF0aWMgaW50IGkycl9QS0VZX1VTQUdFX1BFUklPRChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCSAgICAgUEtFWV9VU0FHRV9QRVJJT0QgKnVzYWdlLCBCSU8gKm91dCwgaW50IGluZGVudCkKK3sKKwlCSU9fcHJpbnRmKG91dCwgIiUqcyIsIGluZGVudCwgIiIpOworCWlmKHVzYWdlLT5ub3RCZWZvcmUpIHsKKwkJQklPX3dyaXRlKG91dCwgIk5vdCBCZWZvcmU6ICIsIDEyKTsKKwkJQVNOMV9HRU5FUkFMSVpFRFRJTUVfcHJpbnQob3V0LCB1c2FnZS0+bm90QmVmb3JlKTsKKwkJaWYodXNhZ2UtPm5vdEFmdGVyKSBCSU9fd3JpdGUob3V0LCAiLCAiLCAyKTsKKwl9CisJaWYodXNhZ2UtPm5vdEFmdGVyKSB7CisJCUJJT193cml0ZShvdXQsICJOb3QgQWZ0ZXI6ICIsIDExKTsKKwkJQVNOMV9HRU5FUkFMSVpFRFRJTUVfcHJpbnQob3V0LCB1c2FnZS0+bm90QWZ0ZXIpOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKK3N0YXRpYyBQS0VZX1VTQUdFX1BFUklPRCAqdjJpX1BLRVlfVVNBR0VfUEVSSU9EKG1ldGhvZCwgY3R4LCB2YWx1ZXMpCitYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kOworWDUwOVYzX0NUWCAqY3R4OworU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnZhbHVlczsKK3sKK3JldHVybiBOVUxMOworfQorKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcG1hcHMuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcG1hcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjViY2QzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19wbWFwcy5jCkBAIC0wLDAgKzEsMTU1IEBACisvKiB2M19wbWFwcy5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMXQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorCitzdGF0aWMgdm9pZCAqdjJpX1BPTElDWV9NQVBQSU5HUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqCitpMnZfUE9MSUNZX01BUFBJTkdTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKnBtcHMsCisJCSAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCk7CisKK2NvbnN0IFg1MDlWM19FWFRfTUVUSE9EIHYzX3BvbGljeV9tYXBwaW5ncyA9IHsKKwlOSURfcG9saWN5X21hcHBpbmdzLCAwLAorCUFTTjFfSVRFTV9yZWYoUE9MSUNZX01BUFBJTkdTKSwKKwkwLDAsMCwwLAorCTAsMCwKKwlpMnZfUE9MSUNZX01BUFBJTkdTLAorCXYyaV9QT0xJQ1lfTUFQUElOR1MsCisJMCwwLAorCU5VTEwKK307CisKK0FTTjFfU0VRVUVOQ0UoUE9MSUNZX01BUFBJTkcpID0geworCUFTTjFfU0lNUExFKFBPTElDWV9NQVBQSU5HLCBpc3N1ZXJEb21haW5Qb2xpY3ksIEFTTjFfT0JKRUNUKSwKKwlBU04xX1NJTVBMRShQT0xJQ1lfTUFQUElORywgc3ViamVjdERvbWFpblBvbGljeSwgQVNOMV9PQkpFQ1QpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFBPTElDWV9NQVBQSU5HKQorCitBU04xX0lURU1fVEVNUExBVEUoUE9MSUNZX01BUFBJTkdTKSA9IAorCUFTTjFfRVhfVEVNUExBVEVfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIFBPTElDWV9NQVBQSU5HUywKKwkJCQkJCQkJUE9MSUNZX01BUFBJTkcpCitBU04xX0lURU1fVEVNUExBVEVfRU5EKFBPTElDWV9NQVBQSU5HUykKKworSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TKFBPTElDWV9NQVBQSU5HKQorCisKK3N0YXRpYyBTVEFDS19PRihDT05GX1ZBTFVFKSAqCitpMnZfUE9MSUNZX01BUFBJTkdTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIHZvaWQgKmEsCisJCSAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0X2xpc3QpCit7CisJUE9MSUNZX01BUFBJTkdTICpwbWFwcyA9IGE7CisJUE9MSUNZX01BUFBJTkcgKnBtYXA7CisJaW50IGk7CisJY2hhciBvYmpfdG1wMVs4MF07CisJY2hhciBvYmpfdG1wMls4MF07CisJZm9yKGkgPSAwOyBpIDwgc2tfUE9MSUNZX01BUFBJTkdfbnVtKHBtYXBzKTsgaSsrKSB7CisJCXBtYXAgPSBza19QT0xJQ1lfTUFQUElOR192YWx1ZShwbWFwcywgaSk7CisJCWkydF9BU04xX09CSkVDVChvYmpfdG1wMSwgODAsIHBtYXAtPmlzc3VlckRvbWFpblBvbGljeSk7CisJCWkydF9BU04xX09CSkVDVChvYmpfdG1wMiwgODAsIHBtYXAtPnN1YmplY3REb21haW5Qb2xpY3kpOworCQlYNTA5VjNfYWRkX3ZhbHVlKG9ial90bXAxLCBvYmpfdG1wMiwgJmV4dF9saXN0KTsKKwl9CisJcmV0dXJuIGV4dF9saXN0OworfQorCitzdGF0aWMgdm9pZCAqdjJpX1BPTElDWV9NQVBQSU5HUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKQoreworCVBPTElDWV9NQVBQSU5HUyAqcG1hcHM7CisJUE9MSUNZX01BUFBJTkcgKnBtYXA7CisJQVNOMV9PQkpFQ1QgKm9iajEsICpvYmoyOworCUNPTkZfVkFMVUUgKnZhbDsKKwlpbnQgaTsKKworCWlmKCEocG1hcHMgPSBza19QT0xJQ1lfTUFQUElOR19uZXdfbnVsbCgpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX1BPTElDWV9NQVBQSU5HUyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvcihpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKG52YWwpOyBpKyspIHsKKwkJdmFsID0gc2tfQ09ORl9WQUxVRV92YWx1ZShudmFsLCBpKTsKKwkJaWYoIXZhbC0+dmFsdWUgfHwgIXZhbC0+bmFtZSkgeworCQkJc2tfUE9MSUNZX01BUFBJTkdfcG9wX2ZyZWUocG1hcHMsIFBPTElDWV9NQVBQSU5HX2ZyZWUpOworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1YySV9QT0xJQ1lfTUFQUElOR1MsWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUik7CisJCQlYNTA5VjNfY29uZl9lcnIodmFsKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCW9iajEgPSBPQkpfdHh0Mm9iaih2YWwtPm5hbWUsIDApOworCQlvYmoyID0gT0JKX3R4dDJvYmoodmFsLT52YWx1ZSwgMCk7CisJCWlmKCFvYmoxIHx8ICFvYmoyKSB7CisJCQlza19QT0xJQ1lfTUFQUElOR19wb3BfZnJlZShwbWFwcywgUE9MSUNZX01BUFBJTkdfZnJlZSk7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfVjJJX1BPTElDWV9NQVBQSU5HUyxYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKTsKKwkJCVg1MDlWM19jb25mX2Vycih2YWwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcG1hcCA9IFBPTElDWV9NQVBQSU5HX25ldygpOworCQlpZiAoIXBtYXApIHsKKwkJCXNrX1BPTElDWV9NQVBQSU5HX3BvcF9mcmVlKHBtYXBzLCBQT0xJQ1lfTUFQUElOR19mcmVlKTsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9WMklfUE9MSUNZX01BUFBJTkdTLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXBtYXAtPmlzc3VlckRvbWFpblBvbGljeSA9IG9iajE7CisJCXBtYXAtPnN1YmplY3REb21haW5Qb2xpY3kgPSBvYmoyOworCQlza19QT0xJQ1lfTUFQUElOR19wdXNoKHBtYXBzLCBwbWFwKTsKKwl9CisJcmV0dXJuIHBtYXBzOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19wcm4uYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcHJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0NjIxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcHJuLmMKQEAgLTAsMCArMSwyMzQgQEAKKy8qIHYzX3Bybi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogWDUwOSB2MyBleHRlbnNpb24gdXRpbGl0aWVzICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworLyogRXh0ZW5zaW9uIHByaW50aW5nIHJvdXRpbmVzICovCisKK3N0YXRpYyBpbnQgdW5rbm93bl9leHRfcHJpbnQoQklPICpvdXQsIFg1MDlfRVhURU5TSU9OICpleHQsIHVuc2lnbmVkIGxvbmcgZmxhZywgaW50IGluZGVudCwgaW50IHN1cHBvcnRlZCk7CisKKy8qIFByaW50IG91dCBhIG5hbWUrdmFsdWUgc3RhY2sgKi8KKwordm9pZCBYNTA5VjNfRVhUX3ZhbF9wcm4oQklPICpvdXQsIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWwsIGludCBpbmRlbnQsIGludCBtbCkKK3sKKwlpbnQgaTsKKwlDT05GX1ZBTFVFICpudmFsOworCWlmKCF2YWwpIHJldHVybjsKKwlpZighbWwgfHwgIXNrX0NPTkZfVkFMVUVfbnVtKHZhbCkpIHsKKwkJQklPX3ByaW50ZihvdXQsICIlKnMiLCBpbmRlbnQsICIiKTsKKwkJaWYoIXNrX0NPTkZfVkFMVUVfbnVtKHZhbCkpIEJJT19wdXRzKG91dCwgIjxFTVBUWT5cbiIpOworCX0KKwlmb3IoaSA9IDA7IGkgPCBza19DT05GX1ZBTFVFX251bSh2YWwpOyBpKyspIHsKKwkJaWYobWwpIEJJT19wcmludGYob3V0LCAiJSpzIiwgaW5kZW50LCAiIik7CisJCWVsc2UgaWYoaSA+IDApIEJJT19wcmludGYob3V0LCAiLCAiKTsKKwkJbnZhbCA9IHNrX0NPTkZfVkFMVUVfdmFsdWUodmFsLCBpKTsKKwkJaWYoIW52YWwtPm5hbWUpIEJJT19wdXRzKG91dCwgbnZhbC0+dmFsdWUpOworCQllbHNlIGlmKCFudmFsLT52YWx1ZSkgQklPX3B1dHMob3V0LCBudmFsLT5uYW1lKTsKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJZWxzZSBCSU9fcHJpbnRmKG91dCwgIiVzOiVzIiwgbnZhbC0+bmFtZSwgbnZhbC0+dmFsdWUpOworI2Vsc2UKKwkJZWxzZSB7CisJCQlpbnQgbGVuOworCQkJY2hhciAqdG1wOworCQkJbGVuID0gc3RybGVuKG52YWwtPnZhbHVlKSsxOworCQkJdG1wID0gT1BFTlNTTF9tYWxsb2MobGVuKTsKKwkJCWlmICh0bXApCisJCQl7CisJCQkJYXNjaWkyZWJjZGljKHRtcCwgbnZhbC0+dmFsdWUsIGxlbik7CisJCQkJQklPX3ByaW50ZihvdXQsICIlczolcyIsIG52YWwtPm5hbWUsIHRtcCk7CisJCQkJT1BFTlNTTF9mcmVlKHRtcCk7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZihtbCkgQklPX3B1dHMob3V0LCAiXG4iKTsKKwl9Cit9CisKKy8qIE1haW4gcm91dGluZTogcHJpbnQgb3V0IGEgZ2VuZXJhbCBleHRlbnNpb24gKi8KKworaW50IFg1MDlWM19FWFRfcHJpbnQoQklPICpvdXQsIFg1MDlfRVhURU5TSU9OICpleHQsIHVuc2lnbmVkIGxvbmcgZmxhZywgaW50IGluZGVudCkKK3sKKwl2b2lkICpleHRfc3RyID0gTlVMTDsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwljb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kOwkKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCA9IE5VTEw7CisJaW50IG9rID0gMTsKKworCWlmKCEobWV0aG9kID0gWDUwOVYzX0VYVF9nZXQoZXh0KSkpCisJCXJldHVybiB1bmtub3duX2V4dF9wcmludChvdXQsIGV4dCwgZmxhZywgaW5kZW50LCAwKTsKKwlwID0gZXh0LT52YWx1ZS0+ZGF0YTsKKwlpZihtZXRob2QtPml0KSBleHRfc3RyID0gQVNOMV9pdGVtX2QyaShOVUxMLCAmcCwgZXh0LT52YWx1ZS0+bGVuZ3RoLCBBU04xX0lURU1fcHRyKG1ldGhvZC0+aXQpKTsKKwllbHNlIGV4dF9zdHIgPSBtZXRob2QtPmQyaShOVUxMLCAmcCwgZXh0LT52YWx1ZS0+bGVuZ3RoKTsKKworCWlmKCFleHRfc3RyKSByZXR1cm4gdW5rbm93bl9leHRfcHJpbnQob3V0LCBleHQsIGZsYWcsIGluZGVudCwgMSk7CisKKwlpZihtZXRob2QtPmkycykgeworCQlpZighKHZhbHVlID0gbWV0aG9kLT5pMnMobWV0aG9kLCBleHRfc3RyKSkpIHsKKwkJCW9rID0gMDsKKwkJCWdvdG8gZXJyOworCQl9CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCUJJT19wcmludGYob3V0LCAiJSpzJXMiLCBpbmRlbnQsICIiLCB2YWx1ZSk7CisjZWxzZQorCQl7CisJCQlpbnQgbGVuOworCQkJY2hhciAqdG1wOworCQkJbGVuID0gc3RybGVuKHZhbHVlKSsxOworCQkJdG1wID0gT1BFTlNTTF9tYWxsb2MobGVuKTsKKwkJCWlmICh0bXApCisJCQl7CisJCQkJYXNjaWkyZWJjZGljKHRtcCwgdmFsdWUsIGxlbik7CisJCQkJQklPX3ByaW50ZihvdXQsICIlKnMlcyIsIGluZGVudCwgIiIsIHRtcCk7CisJCQkJT1BFTlNTTF9mcmVlKHRtcCk7CisJCQl9CisJCX0KKyNlbmRpZgorCX0gZWxzZSBpZihtZXRob2QtPmkydikgeworCQlpZighKG52YWwgPSBtZXRob2QtPmkydihtZXRob2QsIGV4dF9zdHIsIE5VTEwpKSkgeworCQkJb2sgPSAwOworCQkJZ290byBlcnI7CisJCX0KKwkJWDUwOVYzX0VYVF92YWxfcHJuKG91dCwgbnZhbCwgaW5kZW50LAorCQkJCSBtZXRob2QtPmV4dF9mbGFncyAmIFg1MDlWM19FWFRfTVVMVElMSU5FKTsKKwl9IGVsc2UgaWYobWV0aG9kLT5pMnIpIHsKKwkJaWYoIW1ldGhvZC0+aTJyKG1ldGhvZCwgZXh0X3N0ciwgb3V0LCBpbmRlbnQpKSBvayA9IDA7CisJfSBlbHNlIG9rID0gMDsKKworCWVycjoKKwkJc2tfQ09ORl9WQUxVRV9wb3BfZnJlZShudmFsLCBYNTA5VjNfY29uZl9mcmVlKTsKKwkJaWYodmFsdWUpIE9QRU5TU0xfZnJlZSh2YWx1ZSk7CisJCWlmKG1ldGhvZC0+aXQpIEFTTjFfaXRlbV9mcmVlKGV4dF9zdHIsIEFTTjFfSVRFTV9wdHIobWV0aG9kLT5pdCkpOworCQllbHNlIG1ldGhvZC0+ZXh0X2ZyZWUoZXh0X3N0cik7CisJCXJldHVybiBvazsKK30KKworaW50IFg1MDlWM19leHRlbnNpb25zX3ByaW50KEJJTyAqYnAsIGNoYXIgKnRpdGxlLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHMsIHVuc2lnbmVkIGxvbmcgZmxhZywgaW50IGluZGVudCkKK3sKKwlpbnQgaSwgajsKKworCWlmKHNrX1g1MDlfRVhURU5TSU9OX251bShleHRzKSA8PSAwKSByZXR1cm4gMTsKKworCWlmKHRpdGxlKSAKKwkJeworCQlCSU9fcHJpbnRmKGJwLCIlKnMlczpcbiIsaW5kZW50LCAiIiwgdGl0bGUpOworCQlpbmRlbnQgKz0gNDsKKwkJfQorCisJZm9yIChpPTA7IGk8c2tfWDUwOV9FWFRFTlNJT05fbnVtKGV4dHMpOyBpKyspCisJCXsKKwkJQVNOMV9PQkpFQ1QgKm9iajsKKwkJWDUwOV9FWFRFTlNJT04gKmV4OworCQlleD1za19YNTA5X0VYVEVOU0lPTl92YWx1ZShleHRzLCBpKTsKKwkJaWYgKGluZGVudCAmJiBCSU9fcHJpbnRmKGJwLCIlKnMiLGluZGVudCwgIiIpIDw9IDApIHJldHVybiAwOworCQlvYmo9WDUwOV9FWFRFTlNJT05fZ2V0X29iamVjdChleCk7CisJCWkyYV9BU04xX09CSkVDVChicCxvYmopOworCQlqPVg1MDlfRVhURU5TSU9OX2dldF9jcml0aWNhbChleCk7CisJCWlmIChCSU9fcHJpbnRmKGJwLCI6ICVzXG4iLGo/ImNyaXRpY2FsIjoiIikgPD0gMCkKKwkJCXJldHVybiAwOworCQlpZighWDUwOVYzX0VYVF9wcmludChicCwgZXgsIGZsYWcsIGluZGVudCArIDQpKQorCQkJeworCQkJQklPX3ByaW50ZihicCwgIiUqcyIsIGluZGVudCArIDQsICIiKTsKKwkJCU1fQVNOMV9PQ1RFVF9TVFJJTkdfcHJpbnQoYnAsZXgtPnZhbHVlKTsKKwkJCX0KKwkJaWYgKEJJT193cml0ZShicCwiXG4iLDEpIDw9IDApIHJldHVybiAwOworCQl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdW5rbm93bl9leHRfcHJpbnQoQklPICpvdXQsIFg1MDlfRVhURU5TSU9OICpleHQsIHVuc2lnbmVkIGxvbmcgZmxhZywgaW50IGluZGVudCwgaW50IHN1cHBvcnRlZCkKK3sKKwlzd2l0Y2goZmxhZyAmIFg1MDlWM19FWFRfVU5LTk9XTl9NQVNLKSB7CisKKwkJY2FzZSBYNTA5VjNfRVhUX0RFRkFVTFQ6CisJCXJldHVybiAwOworCisJCWNhc2UgWDUwOVYzX0VYVF9FUlJPUl9VTktOT1dOOgorCQlpZihzdXBwb3J0ZWQpCisJCQlCSU9fcHJpbnRmKG91dCwgIiUqczxQYXJzZSBFcnJvcj4iLCBpbmRlbnQsICIiKTsKKwkJZWxzZQorCQkJQklPX3ByaW50ZihvdXQsICIlKnM8Tm90IFN1cHBvcnRlZD4iLCBpbmRlbnQsICIiKTsKKwkJcmV0dXJuIDE7CisKKwkJY2FzZSBYNTA5VjNfRVhUX1BBUlNFX1VOS05PV046CisJCQlyZXR1cm4gQVNOMV9wYXJzZV9kdW1wKG91dCwKKwkJCQlleHQtPnZhbHVlLT5kYXRhLCBleHQtPnZhbHVlLT5sZW5ndGgsIGluZGVudCwgLTEpOworCQljYXNlIFg1MDlWM19FWFRfRFVNUF9VTktOT1dOOgorCQkJcmV0dXJuIEJJT19kdW1wX2luZGVudChvdXQsIChjaGFyICopZXh0LT52YWx1ZS0+ZGF0YSwgZXh0LT52YWx1ZS0+bGVuZ3RoLCBpbmRlbnQpOworCisJCWRlZmF1bHQ6CisJCXJldHVybiAxOworCX0KK30KKwkKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IFg1MDlWM19FWFRfcHJpbnRfZnAoRklMRSAqZnAsIFg1MDlfRVhURU5TSU9OICpleHQsIGludCBmbGFnLCBpbnQgaW5kZW50KQoreworCUJJTyAqYmlvX3RtcDsKKwlpbnQgcmV0OworCWlmKCEoYmlvX3RtcCA9IEJJT19uZXdfZnAoZnAsIEJJT19OT0NMT1NFKSkpIHJldHVybiAwOworCXJldCA9IFg1MDlWM19FWFRfcHJpbnQoYmlvX3RtcCwgZXh0LCBmbGFnLCBpbmRlbnQpOworCUJJT19mcmVlKGJpb190bXApOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcHVycC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19wdXJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgxYmQzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfcHVycC5jCkBAIC0wLDAgKzEsNzY3IEBACisvKiB2M19wdXJwLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAxLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAiY3J5cHRsaWIuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOV92ZnkuaD4KKworc3RhdGljIHZvaWQgeDUwOXYzX2NhY2hlX2V4dGVuc2lvbnMoWDUwOSAqeCk7CisKK3N0YXRpYyBpbnQgY2hlY2tfc3NsX2NhKGNvbnN0IFg1MDkgKngpOworc3RhdGljIGludCBjaGVja19wdXJwb3NlX3NzbF9jbGllbnQoY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKTsKK3N0YXRpYyBpbnQgY2hlY2tfcHVycG9zZV9zc2xfc2VydmVyKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSk7CitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2VfbnNfc3NsX3NlcnZlcihjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpOworc3RhdGljIGludCBwdXJwb3NlX3NtaW1lKGNvbnN0IFg1MDkgKngsIGludCBjYSk7CitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2Vfc21pbWVfc2lnbihjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpOworc3RhdGljIGludCBjaGVja19wdXJwb3NlX3NtaW1lX2VuY3J5cHQoY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKTsKK3N0YXRpYyBpbnQgY2hlY2tfcHVycG9zZV9jcmxfc2lnbihjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpOworc3RhdGljIGludCBjaGVja19wdXJwb3NlX3RpbWVzdGFtcF9zaWduKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSk7CitzdGF0aWMgaW50IG5vX2NoZWNrKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSk7CitzdGF0aWMgaW50IG9jc3BfaGVscGVyKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSk7CisKK3N0YXRpYyBpbnQgeHBfY21wKGNvbnN0IFg1MDlfUFVSUE9TRSAqIGNvbnN0ICphLAorCQljb25zdCBYNTA5X1BVUlBPU0UgKiBjb25zdCAqYik7CitzdGF0aWMgdm9pZCB4cHRhYmxlX2ZyZWUoWDUwOV9QVVJQT1NFICpwKTsKKworc3RhdGljIFg1MDlfUFVSUE9TRSB4c3RhbmRhcmRbXSA9IHsKKwl7WDUwOV9QVVJQT1NFX1NTTF9DTElFTlQsIFg1MDlfVFJVU1RfU1NMX0NMSUVOVCwgMCwgY2hlY2tfcHVycG9zZV9zc2xfY2xpZW50LCAiU1NMIGNsaWVudCIsICJzc2xjbGllbnQiLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX1NTTF9TRVJWRVIsIFg1MDlfVFJVU1RfU1NMX1NFUlZFUiwgMCwgY2hlY2tfcHVycG9zZV9zc2xfc2VydmVyLCAiU1NMIHNlcnZlciIsICJzc2xzZXJ2ZXIiLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX05TX1NTTF9TRVJWRVIsIFg1MDlfVFJVU1RfU1NMX1NFUlZFUiwgMCwgY2hlY2tfcHVycG9zZV9uc19zc2xfc2VydmVyLCAiTmV0c2NhcGUgU1NMIHNlcnZlciIsICJuc3NzbHNlcnZlciIsIE5VTEx9LAorCXtYNTA5X1BVUlBPU0VfU01JTUVfU0lHTiwgWDUwOV9UUlVTVF9FTUFJTCwgMCwgY2hlY2tfcHVycG9zZV9zbWltZV9zaWduLCAiUy9NSU1FIHNpZ25pbmciLCAic21pbWVzaWduIiwgTlVMTH0sCisJe1g1MDlfUFVSUE9TRV9TTUlNRV9FTkNSWVBULCBYNTA5X1RSVVNUX0VNQUlMLCAwLCBjaGVja19wdXJwb3NlX3NtaW1lX2VuY3J5cHQsICJTL01JTUUgZW5jcnlwdGlvbiIsICJzbWltZWVuY3J5cHQiLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX0NSTF9TSUdOLCBYNTA5X1RSVVNUX0NPTVBBVCwgMCwgY2hlY2tfcHVycG9zZV9jcmxfc2lnbiwgIkNSTCBzaWduaW5nIiwgImNybHNpZ24iLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX0FOWSwgWDUwOV9UUlVTVF9ERUZBVUxULCAwLCBub19jaGVjaywgIkFueSBQdXJwb3NlIiwgImFueSIsIE5VTEx9LAorCXtYNTA5X1BVUlBPU0VfT0NTUF9IRUxQRVIsIFg1MDlfVFJVU1RfQ09NUEFULCAwLCBvY3NwX2hlbHBlciwgIk9DU1AgaGVscGVyIiwgIm9jc3BoZWxwZXIiLCBOVUxMfSwKKwl7WDUwOV9QVVJQT1NFX1RJTUVTVEFNUF9TSUdOLCBYNTA5X1RSVVNUX1RTQSwgMCwgY2hlY2tfcHVycG9zZV90aW1lc3RhbXBfc2lnbiwgIlRpbWUgU3RhbXAgc2lnbmluZyIsICJ0aW1lc3RhbXBzaWduIiwgTlVMTH0sCit9OworCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9DT1VOVCAoc2l6ZW9mKHhzdGFuZGFyZCkvc2l6ZW9mKFg1MDlfUFVSUE9TRSkpCisKK0lNUExFTUVOVF9TVEFDS19PRihYNTA5X1BVUlBPU0UpCisKK3N0YXRpYyBTVEFDS19PRihYNTA5X1BVUlBPU0UpICp4cHRhYmxlID0gTlVMTDsKKworc3RhdGljIGludCB4cF9jbXAoY29uc3QgWDUwOV9QVVJQT1NFICogY29uc3QgKmEsCisJCWNvbnN0IFg1MDlfUFVSUE9TRSAqIGNvbnN0ICpiKQoreworCXJldHVybiAoKmEpLT5wdXJwb3NlIC0gKCpiKS0+cHVycG9zZTsKK30KKworLyogQXMgbXVjaCBhcyBJJ2QgbGlrZSB0byBtYWtlIFg1MDlfY2hlY2tfcHVycG9zZSB1c2UgYSAiY29uc3QiIFg1MDkqCisgKiBJIHJlYWxseSBjYW4ndCBiZWNhdXNlIGl0IGRvZXMgcmVjYWxjdWxhdGUgaGFzaGVzIGFuZCBkbyBvdGhlciBub24tY29uc3QKKyAqIHRoaW5ncy4gKi8KK2ludCBYNTA5X2NoZWNrX3B1cnBvc2UoWDUwOSAqeCwgaW50IGlkLCBpbnQgY2EpCit7CisJaW50IGlkeDsKKwljb25zdCBYNTA5X1BVUlBPU0UgKnB0OworCWlmKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfU0VUKSkgeworCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1g1MDkpOworCQl4NTA5djNfY2FjaGVfZXh0ZW5zaW9ucyh4KTsKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1g1MDkpOworCX0KKwlpZihpZCA9PSAtMSkgcmV0dXJuIDE7CisJaWR4ID0gWDUwOV9QVVJQT1NFX2dldF9ieV9pZChpZCk7CisJaWYoaWR4ID09IC0xKSByZXR1cm4gLTE7CisJcHQgPSBYNTA5X1BVUlBPU0VfZ2V0MChpZHgpOworCXJldHVybiBwdC0+Y2hlY2tfcHVycG9zZShwdCwgeCwgY2EpOworfQorCitpbnQgWDUwOV9QVVJQT1NFX3NldChpbnQgKnAsIGludCBwdXJwb3NlKQoreworCWlmKFg1MDlfUFVSUE9TRV9nZXRfYnlfaWQocHVycG9zZSkgPT0gLTEpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1g1MDlfUFVSUE9TRV9TRVQsIFg1MDlWM19SX0lOVkFMSURfUFVSUE9TRSk7CisJCXJldHVybiAwOworCX0KKwkqcCA9IHB1cnBvc2U7CisJcmV0dXJuIDE7Cit9CisKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2NvdW50KHZvaWQpCit7CisJaWYoIXhwdGFibGUpIHJldHVybiBYNTA5X1BVUlBPU0VfQ09VTlQ7CisJcmV0dXJuIHNrX1g1MDlfUFVSUE9TRV9udW0oeHB0YWJsZSkgKyBYNTA5X1BVUlBPU0VfQ09VTlQ7Cit9CisKK1g1MDlfUFVSUE9TRSAqIFg1MDlfUFVSUE9TRV9nZXQwKGludCBpZHgpCit7CisJaWYoaWR4IDwgMCkgcmV0dXJuIE5VTEw7CisJaWYoaWR4IDwgKGludClYNTA5X1BVUlBPU0VfQ09VTlQpIHJldHVybiB4c3RhbmRhcmQgKyBpZHg7CisJcmV0dXJuIHNrX1g1MDlfUFVSUE9TRV92YWx1ZSh4cHRhYmxlLCBpZHggLSBYNTA5X1BVUlBPU0VfQ09VTlQpOworfQorCitpbnQgWDUwOV9QVVJQT1NFX2dldF9ieV9zbmFtZShjaGFyICpzbmFtZSkKK3sKKwlpbnQgaTsKKwlYNTA5X1BVUlBPU0UgKnhwdG1wOworCWZvcihpID0gMDsgaSA8IFg1MDlfUFVSUE9TRV9nZXRfY291bnQoKTsgaSsrKSB7CisJCXhwdG1wID0gWDUwOV9QVVJQT1NFX2dldDAoaSk7CisJCWlmKCFzdHJjbXAoeHB0bXAtPnNuYW1lLCBzbmFtZSkpIHJldHVybiBpOworCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2J5X2lkKGludCBwdXJwb3NlKQoreworCVg1MDlfUFVSUE9TRSB0bXA7CisJaW50IGlkeDsKKwlpZigocHVycG9zZSA+PSBYNTA5X1BVUlBPU0VfTUlOKSAmJiAocHVycG9zZSA8PSBYNTA5X1BVUlBPU0VfTUFYKSkKKwkJcmV0dXJuIHB1cnBvc2UgLSBYNTA5X1BVUlBPU0VfTUlOOworCXRtcC5wdXJwb3NlID0gcHVycG9zZTsKKwlpZigheHB0YWJsZSkgcmV0dXJuIC0xOworCWlkeCA9IHNrX1g1MDlfUFVSUE9TRV9maW5kKHhwdGFibGUsICZ0bXApOworCWlmKGlkeCA9PSAtMSkgcmV0dXJuIC0xOworCXJldHVybiBpZHggKyBYNTA5X1BVUlBPU0VfQ09VTlQ7Cit9CisKK2ludCBYNTA5X1BVUlBPU0VfYWRkKGludCBpZCwgaW50IHRydXN0LCBpbnQgZmxhZ3MsCisJCQlpbnQgKCpjaykoY29uc3QgWDUwOV9QVVJQT1NFICosIGNvbnN0IFg1MDkgKiwgaW50KSwKKwkJCQkJY2hhciAqbmFtZSwgY2hhciAqc25hbWUsIHZvaWQgKmFyZykKK3sKKwlpbnQgaWR4OworCVg1MDlfUFVSUE9TRSAqcHRtcDsKKwkvKiBUaGlzIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hhdCB3ZSBjaGFuZ2U6IGFwcGxpY2F0aW9uIGNhbid0IHNldCBpdCAqLworCWZsYWdzICY9IH5YNTA5X1BVUlBPU0VfRFlOQU1JQzsKKwkvKiBUaGlzIHdpbGwgYWx3YXlzIGJlIHNldCBmb3IgYXBwbGljYXRpb24gbW9kaWZpZWQgdHJ1c3QgZW50cmllcyAqLworCWZsYWdzIHw9IFg1MDlfUFVSUE9TRV9EWU5BTUlDX05BTUU7CisJLyogR2V0IGV4aXN0aW5nIGVudHJ5IGlmIGFueSAqLworCWlkeCA9IFg1MDlfUFVSUE9TRV9nZXRfYnlfaWQoaWQpOworCS8qIE5lZWQgYSBuZXcgZW50cnkgKi8KKwlpZihpZHggPT0gLTEpIHsKKwkJaWYoIShwdG1wID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFg1MDlfUFVSUE9TRSkpKSkgeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1g1MDlfUFVSUE9TRV9BREQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHRtcC0+ZmxhZ3MgPSBYNTA5X1BVUlBPU0VfRFlOQU1JQzsKKwl9IGVsc2UgcHRtcCA9IFg1MDlfUFVSUE9TRV9nZXQwKGlkeCk7CisKKwkvKiBPUEVOU1NMX2ZyZWUgZXhpc3RpbmcgbmFtZSBpZiBkeW5hbWljICovCisJaWYocHRtcC0+ZmxhZ3MgJiBYNTA5X1BVUlBPU0VfRFlOQU1JQ19OQU1FKSB7CisJCU9QRU5TU0xfZnJlZShwdG1wLT5uYW1lKTsKKwkJT1BFTlNTTF9mcmVlKHB0bXAtPnNuYW1lKTsKKwl9CisJLyogZHVwIHN1cHBsaWVkIG5hbWUgKi8KKwlwdG1wLT5uYW1lID0gQlVGX3N0cmR1cChuYW1lKTsKKwlwdG1wLT5zbmFtZSA9IEJVRl9zdHJkdXAoc25hbWUpOworCWlmKCFwdG1wLT5uYW1lIHx8ICFwdG1wLT5zbmFtZSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfWDUwOV9QVVJQT1NFX0FERCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybiAwOworCX0KKwkvKiBLZWVwIHRoZSBkeW5hbWljIGZsYWcgb2YgZXhpc3RpbmcgZW50cnkgKi8KKwlwdG1wLT5mbGFncyAmPSBYNTA5X1BVUlBPU0VfRFlOQU1JQzsKKwkvKiBTZXQgYWxsIG90aGVyIGZsYWdzICovCisJcHRtcC0+ZmxhZ3MgfD0gZmxhZ3M7CisKKwlwdG1wLT5wdXJwb3NlID0gaWQ7CisJcHRtcC0+dHJ1c3QgPSB0cnVzdDsKKwlwdG1wLT5jaGVja19wdXJwb3NlID0gY2s7CisJcHRtcC0+dXNyX2RhdGEgPSBhcmc7CisKKwkvKiBJZiBpdHMgYSBuZXcgZW50cnkgbWFuYWdlIHRoZSBkeW5hbWljIHRhYmxlICovCisJaWYoaWR4ID09IC0xKSB7CisJCWlmKCF4cHRhYmxlICYmICEoeHB0YWJsZSA9IHNrX1g1MDlfUFVSUE9TRV9uZXcoeHBfY21wKSkpIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5X1BVUlBPU0VfQURELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmICghc2tfWDUwOV9QVVJQT1NFX3B1c2goeHB0YWJsZSwgcHRtcCkpIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5X1BVUlBPU0VfQURELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCB4cHRhYmxlX2ZyZWUoWDUwOV9QVVJQT1NFICpwKQorCXsKKwlpZighcCkgcmV0dXJuOworCWlmIChwLT5mbGFncyAmIFg1MDlfUFVSUE9TRV9EWU5BTUlDKSAKKwkJeworCQlpZiAocC0+ZmxhZ3MgJiBYNTA5X1BVUlBPU0VfRFlOQU1JQ19OQU1FKSB7CisJCQlPUEVOU1NMX2ZyZWUocC0+bmFtZSk7CisJCQlPUEVOU1NMX2ZyZWUocC0+c25hbWUpOworCQl9CisJCU9QRU5TU0xfZnJlZShwKTsKKwkJfQorCX0KKwordm9pZCBYNTA5X1BVUlBPU0VfY2xlYW51cCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCXNrX1g1MDlfUFVSUE9TRV9wb3BfZnJlZSh4cHRhYmxlLCB4cHRhYmxlX2ZyZWUpOworCWZvcihpID0gMDsgaSA8IFg1MDlfUFVSUE9TRV9DT1VOVDsgaSsrKSB4cHRhYmxlX2ZyZWUoeHN0YW5kYXJkICsgaSk7CisJeHB0YWJsZSA9IE5VTEw7Cit9CisKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2lkKFg1MDlfUFVSUE9TRSAqeHApCit7CisJcmV0dXJuIHhwLT5wdXJwb3NlOworfQorCitjaGFyICpYNTA5X1BVUlBPU0VfZ2V0MF9uYW1lKFg1MDlfUFVSUE9TRSAqeHApCit7CisJcmV0dXJuIHhwLT5uYW1lOworfQorCitjaGFyICpYNTA5X1BVUlBPU0VfZ2V0MF9zbmFtZShYNTA5X1BVUlBPU0UgKnhwKQoreworCXJldHVybiB4cC0+c25hbWU7Cit9CisKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X3RydXN0KFg1MDlfUFVSUE9TRSAqeHApCit7CisJcmV0dXJuIHhwLT50cnVzdDsKK30KKworc3RhdGljIGludCBuaWRfY21wKGNvbnN0IGludCAqYSwgY29uc3QgaW50ICpiKQorCXsKKwlyZXR1cm4gKmEgLSAqYjsKKwl9CisKK0RFQ0xBUkVfT0JKX0JTRUFSQ0hfQ01QX0ZOKGludCwgaW50LCBuaWQpOworSU1QTEVNRU5UX09CSl9CU0VBUkNIX0NNUF9GTihpbnQsIGludCwgbmlkKTsKKworaW50IFg1MDlfc3VwcG9ydGVkX2V4dGVuc2lvbihYNTA5X0VYVEVOU0lPTiAqZXgpCisJeworCS8qIFRoaXMgdGFibGUgaXMgYSBsaXN0IG9mIHRoZSBOSURzIG9mIHN1cHBvcnRlZCBleHRlbnNpb25zOgorCSAqIHRoYXQgaXMgdGhvc2Ugd2hpY2ggYXJlIHVzZWQgYnkgdGhlIHZlcmlmeSBwcm9jZXNzLiBJZgorCSAqIGFuIGV4dGVuc2lvbiBpcyBjcml0aWNhbCBhbmQgZG9lc24ndCBhcHBlYXIgaW4gdGhpcyBsaXN0CisJICogdGhlbiB0aGUgdmVyaWZ5IHByb2Nlc3Mgd2lsbCBub3JtYWxseSByZWplY3QgdGhlIGNlcnRpZmljYXRlLgorCSAqIFRoZSBsaXN0IG11c3QgYmUga2VwdCBpbiBudW1lcmljYWwgb3JkZXIgYmVjYXVzZSBpdCB3aWxsIGJlCisJICogc2VhcmNoZWQgdXNpbmcgYnNlYXJjaC4KKwkgKi8KKworCXN0YXRpYyBjb25zdCBpbnQgc3VwcG9ydGVkX25pZHNbXSA9IHsKKwkJTklEX25ldHNjYXBlX2NlcnRfdHlwZSwgLyogNzEgKi8KKyAgICAgICAgCU5JRF9rZXlfdXNhZ2UsCQkvKiA4MyAqLworCQlOSURfc3ViamVjdF9hbHRfbmFtZSwJLyogODUgKi8KKwkJTklEX2Jhc2ljX2NvbnN0cmFpbnRzLAkvKiA4NyAqLworCQlOSURfY2VydGlmaWNhdGVfcG9saWNpZXMsIC8qIDg5ICovCisgICAgICAgIAlOSURfZXh0X2tleV91c2FnZSwJLyogMTI2ICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUkZDMzc3OQorCQlOSURfc2JncF9pcEFkZHJCbG9jaywJLyogMjkwICovCisJCU5JRF9zYmdwX2F1dG9ub21vdXNTeXNOdW0sIC8qIDI5MSAqLworI2VuZGlmCisJCU5JRF9wb2xpY3lfY29uc3RyYWludHMsCS8qIDQwMSAqLworCQlOSURfcHJveHlDZXJ0SW5mbywJLyogNjYzICovCisJCU5JRF9uYW1lX2NvbnN0cmFpbnRzLAkvKiA2NjYgKi8KKwkJTklEX3BvbGljeV9tYXBwaW5ncywJLyogNzQ3ICovCisJCU5JRF9pbmhpYml0X2FueV9wb2xpY3kJLyogNzQ4ICovCisJfTsKKworCWludCBleF9uaWQgPSBPQkpfb2JqMm5pZChYNTA5X0VYVEVOU0lPTl9nZXRfb2JqZWN0KGV4KSk7CisKKwlpZiAoZXhfbmlkID09IE5JRF91bmRlZikgCisJCXJldHVybiAwOworCisJaWYgKE9CSl9ic2VhcmNoX25pZCgmZXhfbmlkLCBzdXBwb3J0ZWRfbmlkcywKKwkJCXNpemVvZihzdXBwb3J0ZWRfbmlkcykvc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKKwl9CisKK3N0YXRpYyB2b2lkIHNldHVwX2RwKFg1MDkgKngsIERJU1RfUE9JTlQgKmRwKQorCXsKKwlYNTA5X05BTUUgKmluYW1lID0gTlVMTDsKKwlpbnQgaTsKKwlpZiAoZHAtPnJlYXNvbnMpCisJCXsKKwkJaWYgKGRwLT5yZWFzb25zLT5sZW5ndGggPiAwKQorCQkJZHAtPmRwX3JlYXNvbnMgPSBkcC0+cmVhc29ucy0+ZGF0YVswXTsKKwkJaWYgKGRwLT5yZWFzb25zLT5sZW5ndGggPiAxKQorCQkJZHAtPmRwX3JlYXNvbnMgfD0gKGRwLT5yZWFzb25zLT5kYXRhWzFdIDw8IDgpOworCQlkcC0+ZHBfcmVhc29ucyAmPSBDUkxEUF9BTExfUkVBU09OUzsKKwkJfQorCWVsc2UKKwkJZHAtPmRwX3JlYXNvbnMgPSBDUkxEUF9BTExfUkVBU09OUzsKKwlpZiAoIWRwLT5kaXN0cG9pbnQgfHwgKGRwLT5kaXN0cG9pbnQtPnR5cGUgIT0gMSkpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgc2tfR0VORVJBTF9OQU1FX251bShkcC0+Q1JMaXNzdWVyKTsgaSsrKQorCQl7CisJCUdFTkVSQUxfTkFNRSAqZ2VuID0gc2tfR0VORVJBTF9OQU1FX3ZhbHVlKGRwLT5DUkxpc3N1ZXIsIGkpOworCQlpZiAoZ2VuLT50eXBlID09IEdFTl9ESVJOQU1FKQorCQkJeworCQkJaW5hbWUgPSBnZW4tPmQuZGlyZWN0b3J5TmFtZTsKKwkJCWJyZWFrOworCQkJfQorCQl9CisJaWYgKCFpbmFtZSkKKwkJaW5hbWUgPSBYNTA5X2dldF9pc3N1ZXJfbmFtZSh4KTsKKworCURJU1RfUE9JTlRfc2V0X2RwbmFtZShkcC0+ZGlzdHBvaW50LCBpbmFtZSk7CisKKwl9CisKK3N0YXRpYyB2b2lkIHNldHVwX2NybGRwKFg1MDkgKngpCisJeworCWludCBpOworCXgtPmNybGRwID0gWDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMsIE5VTEwsIE5VTEwpOworCWZvciAoaSA9IDA7IGkgPCBza19ESVNUX1BPSU5UX251bSh4LT5jcmxkcCk7IGkrKykKKwkJc2V0dXBfZHAoeCwgc2tfRElTVF9QT0lOVF92YWx1ZSh4LT5jcmxkcCwgaSkpOworCX0KKworc3RhdGljIHZvaWQgeDUwOXYzX2NhY2hlX2V4dGVuc2lvbnMoWDUwOSAqeCkKK3sKKwlCQVNJQ19DT05TVFJBSU5UUyAqYnM7CisJUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcGNpOworCUFTTjFfQklUX1NUUklORyAqdXNhZ2U7CisJQVNOMV9CSVRfU1RSSU5HICpuczsKKwlFWFRFTkRFRF9LRVlfVVNBR0UgKmV4dHVzYWdlOworCVg1MDlfRVhURU5TSU9OICpleDsKKwkKKwlpbnQgaTsKKwlpZih4LT5leF9mbGFncyAmIEVYRkxBR19TRVQpIHJldHVybjsKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKwlYNTA5X2RpZ2VzdCh4LCBFVlBfc2hhMSgpLCB4LT5zaGExX2hhc2gsIE5VTEwpOworI2VuZGlmCisJLyogRG9lcyBzdWJqZWN0IG5hbWUgbWF0Y2ggaXNzdWVyID8gKi8KKwlpZighWDUwOV9OQU1FX2NtcChYNTA5X2dldF9zdWJqZWN0X25hbWUoeCksIFg1MDlfZ2V0X2lzc3Vlcl9uYW1lKHgpKSkKKwkJCSB4LT5leF9mbGFncyB8PSBFWEZMQUdfU0k7CisJLyogVjEgc2hvdWxkIG1lYW4gbm8gZXh0ZW5zaW9ucyAuLi4gKi8KKwlpZighWDUwOV9nZXRfdmVyc2lvbih4KSkgeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX1YxOworCS8qIEhhbmRsZSBiYXNpYyBjb25zdHJhaW50cyAqLworCWlmKChicz1YNTA5X2dldF9leHRfZDJpKHgsIE5JRF9iYXNpY19jb25zdHJhaW50cywgTlVMTCwgTlVMTCkpKSB7CisJCWlmKGJzLT5jYSkgeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX0NBOworCQlpZihicy0+cGF0aGxlbikgeworCQkJaWYoKGJzLT5wYXRobGVuLT50eXBlID09IFZfQVNOMV9ORUdfSU5URUdFUikKKwkJCQkJCXx8ICFicy0+Y2EpIHsKKwkJCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfSU5WQUxJRDsKKwkJCQl4LT5leF9wYXRobGVuID0gMDsKKwkJCX0gZWxzZSB4LT5leF9wYXRobGVuID0gQVNOMV9JTlRFR0VSX2dldChicy0+cGF0aGxlbik7CisJCX0gZWxzZSB4LT5leF9wYXRobGVuID0gLTE7CisJCUJBU0lDX0NPTlNUUkFJTlRTX2ZyZWUoYnMpOworCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfQkNPTlM7CisJfQorCS8qIEhhbmRsZSBwcm94eSBjZXJ0aWZpY2F0ZXMgKi8KKwlpZigocGNpPVg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX3Byb3h5Q2VydEluZm8sIE5VTEwsIE5VTEwpKSkgeworCQlpZiAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQ0EKKwkJICAgIHx8IFg1MDlfZ2V0X2V4dF9ieV9OSUQoeCwgTklEX3N1YmplY3RfYWx0X25hbWUsIDApID49IDAKKwkJICAgIHx8IFg1MDlfZ2V0X2V4dF9ieV9OSUQoeCwgTklEX2lzc3Vlcl9hbHRfbmFtZSwgMCkgPj0gMCkgeworCQkJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX0lOVkFMSUQ7CisJCX0KKwkJaWYgKHBjaS0+cGNQYXRoTGVuZ3RoQ29uc3RyYWludCkgeworCQkJeC0+ZXhfcGNwYXRobGVuID0KKwkJCQlBU04xX0lOVEVHRVJfZ2V0KHBjaS0+cGNQYXRoTGVuZ3RoQ29uc3RyYWludCk7CisJCX0gZWxzZSB4LT5leF9wY3BhdGhsZW4gPSAtMTsKKwkJUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTl9mcmVlKHBjaSk7CisJCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19QUk9YWTsKKwl9CisJLyogSGFuZGxlIGtleSB1c2FnZSAqLworCWlmKCh1c2FnZT1YNTA5X2dldF9leHRfZDJpKHgsIE5JRF9rZXlfdXNhZ2UsIE5VTEwsIE5VTEwpKSkgeworCQlpZih1c2FnZS0+bGVuZ3RoID4gMCkgeworCQkJeC0+ZXhfa3VzYWdlID0gdXNhZ2UtPmRhdGFbMF07CisJCQlpZih1c2FnZS0+bGVuZ3RoID4gMSkgCisJCQkJeC0+ZXhfa3VzYWdlIHw9IHVzYWdlLT5kYXRhWzFdIDw8IDg7CisJCX0gZWxzZSB4LT5leF9rdXNhZ2UgPSAwOworCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfS1VTQUdFOworCQlBU04xX0JJVF9TVFJJTkdfZnJlZSh1c2FnZSk7CisJfQorCXgtPmV4X3hrdXNhZ2UgPSAwOworCWlmKChleHR1c2FnZT1YNTA5X2dldF9leHRfZDJpKHgsIE5JRF9leHRfa2V5X3VzYWdlLCBOVUxMLCBOVUxMKSkpIHsKKwkJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX1hLVVNBR0U7CisJCWZvcihpID0gMDsgaSA8IHNrX0FTTjFfT0JKRUNUX251bShleHR1c2FnZSk7IGkrKykgeworCQkJc3dpdGNoKE9CSl9vYmoybmlkKHNrX0FTTjFfT0JKRUNUX3ZhbHVlKGV4dHVzYWdlLGkpKSkgeworCQkJCWNhc2UgTklEX3NlcnZlcl9hdXRoOgorCQkJCXgtPmV4X3hrdXNhZ2UgfD0gWEtVX1NTTF9TRVJWRVI7CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIE5JRF9jbGllbnRfYXV0aDoKKwkJCQl4LT5leF94a3VzYWdlIHw9IFhLVV9TU0xfQ0xJRU5UOworCQkJCWJyZWFrOworCisJCQkJY2FzZSBOSURfZW1haWxfcHJvdGVjdDoKKwkJCQl4LT5leF94a3VzYWdlIHw9IFhLVV9TTUlNRTsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgTklEX2NvZGVfc2lnbjoKKwkJCQl4LT5leF94a3VzYWdlIHw9IFhLVV9DT0RFX1NJR047CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIE5JRF9tc19zZ2M6CisJCQkJY2FzZSBOSURfbnNfc2djOgorCQkJCXgtPmV4X3hrdXNhZ2UgfD0gWEtVX1NHQzsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgTklEX09DU1Bfc2lnbjoKKwkJCQl4LT5leF94a3VzYWdlIHw9IFhLVV9PQ1NQX1NJR047CisJCQkJYnJlYWs7CisKKwkJCQljYXNlIE5JRF90aW1lX3N0YW1wOgorCQkJCXgtPmV4X3hrdXNhZ2UgfD0gWEtVX1RJTUVTVEFNUDsKKwkJCQlicmVhazsKKworCQkJCWNhc2UgTklEX2R2Y3M6CisJCQkJeC0+ZXhfeGt1c2FnZSB8PSBYS1VfRFZDUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlza19BU04xX09CSkVDVF9wb3BfZnJlZShleHR1c2FnZSwgQVNOMV9PQkpFQ1RfZnJlZSk7CisJfQorCisJaWYoKG5zPVg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX25ldHNjYXBlX2NlcnRfdHlwZSwgTlVMTCwgTlVMTCkpKSB7CisJCWlmKG5zLT5sZW5ndGggPiAwKSB4LT5leF9uc2NlcnQgPSBucy0+ZGF0YVswXTsKKwkJZWxzZSB4LT5leF9uc2NlcnQgPSAwOworCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfTlNDRVJUOworCQlBU04xX0JJVF9TVFJJTkdfZnJlZShucyk7CisJfQorCXgtPnNraWQgPVg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIsIE5VTEwsIE5VTEwpOworCXgtPmFraWQgPVg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllciwgTlVMTCwgTlVMTCk7CisJeC0+YWx0bmFtZSA9IFg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX3N1YmplY3RfYWx0X25hbWUsIE5VTEwsIE5VTEwpOworCXgtPm5jID0gWDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfbmFtZV9jb25zdHJhaW50cywgJmksIE5VTEwpOworCWlmICgheC0+bmMgJiYgKGkgIT0gLTEpKQorCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfSU5WQUxJRDsKKwlzZXR1cF9jcmxkcCh4KTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1JGQzM3NzkKKyAJeC0+cmZjMzc3OV9hZGRyID1YNTA5X2dldF9leHRfZDJpKHgsIE5JRF9zYmdwX2lwQWRkckJsb2NrLCBOVUxMLCBOVUxMKTsKKyAJeC0+cmZjMzc3OV9hc2lkID1YNTA5X2dldF9leHRfZDJpKHgsIE5JRF9zYmdwX2F1dG9ub21vdXNTeXNOdW0sCisgCQkJCQkgIE5VTEwsIE5VTEwpOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IFg1MDlfZ2V0X2V4dF9jb3VudCh4KTsgaSsrKQorCQl7CisJCWV4ID0gWDUwOV9nZXRfZXh0KHgsIGkpOworCQlpZiAoIVg1MDlfRVhURU5TSU9OX2dldF9jcml0aWNhbChleCkpCisJCQljb250aW51ZTsKKwkJaWYgKE9CSl9vYmoybmlkKFg1MDlfRVhURU5TSU9OX2dldF9vYmplY3QoZXgpKQorCQkJCQk9PSBOSURfZnJlc2hlc3RfY3JsKQorCQkJeC0+ZXhfZmxhZ3MgfD0gRVhGTEFHX0ZSRVNIRVNUOworCQlpZiAoIVg1MDlfc3VwcG9ydGVkX2V4dGVuc2lvbihleCkpCisJCQl7CisJCQl4LT5leF9mbGFncyB8PSBFWEZMQUdfQ1JJVElDQUw7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCXgtPmV4X2ZsYWdzIHw9IEVYRkxBR19TRVQ7Cit9CisKKy8qIENBIGNoZWNrcyBjb21tb24gdG8gYWxsIHB1cnBvc2VzCisgKiByZXR1cm4gY29kZXM6CisgKiAwIG5vdCBhIENBCisgKiAxIGlzIGEgQ0EKKyAqIDIgYmFzaWNDb25zdHJhaW50cyBhYnNlbnQgc28gIm1heWJlIiBhIENBCisgKiAzIGJhc2ljQ29uc3RyYWludHMgYWJzZW50IGJ1dCBzZWxmIHNpZ25lZCBWMS4KKyAqIDQgYmFzaWNDb25zdHJhaW50cyBhYnNlbnQgYnV0IGtleVVzYWdlIHByZXNlbnQgYW5kIGtleUNlcnRTaWduIGFzc2VydGVkLgorICovCisKKyNkZWZpbmUgVjFfUk9PVCAoRVhGTEFHX1YxfEVYRkxBR19TUykKKyNkZWZpbmUga3VfcmVqZWN0KHgsIHVzYWdlKSBcCisJKCgoeCktPmV4X2ZsYWdzICYgRVhGTEFHX0tVU0FHRSkgJiYgISgoeCktPmV4X2t1c2FnZSAmICh1c2FnZSkpKQorI2RlZmluZSB4a3VfcmVqZWN0KHgsIHVzYWdlKSBcCisJKCgoeCktPmV4X2ZsYWdzICYgRVhGTEFHX1hLVVNBR0UpICYmICEoKHgpLT5leF94a3VzYWdlICYgKHVzYWdlKSkpCisjZGVmaW5lIG5zX3JlamVjdCh4LCB1c2FnZSkgXAorCSgoKHgpLT5leF9mbGFncyAmIEVYRkxBR19OU0NFUlQpICYmICEoKHgpLT5leF9uc2NlcnQgJiAodXNhZ2UpKSkKKworc3RhdGljIGludCBjaGVja19jYShjb25zdCBYNTA5ICp4KQoreworCS8qIGtleVVzYWdlIGlmIHByZXNlbnQgc2hvdWxkIGFsbG93IGNlcnQgc2lnbmluZyAqLworCWlmKGt1X3JlamVjdCh4LCBLVV9LRVlfQ0VSVF9TSUdOKSkgcmV0dXJuIDA7CisJaWYoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQkNPTlMpIHsKKwkJaWYoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfQ0EpIHJldHVybiAxOworCQkvKiBJZiBiYXNpY0NvbnN0cmFpbnRzIHNheXMgbm90IGEgQ0EgdGhlbiBzYXkgc28gKi8KKwkJZWxzZSByZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKiB3ZSBzdXBwb3J0IFYxIHJvb3RzIGZvci4uLiAgdWgsIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2h5LiAqLworCQlpZigoeC0+ZXhfZmxhZ3MgJiBWMV9ST09UKSA9PSBWMV9ST09UKSByZXR1cm4gMzsKKwkJLyogSWYga2V5IHVzYWdlIHByZXNlbnQgaXQgbXVzdCBoYXZlIGNlcnRTaWduIHNvIHRvbGVyYXRlIGl0ICovCisJCWVsc2UgaWYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX0tVU0FHRSkgcmV0dXJuIDQ7CisJCS8qIE9sZGVyIGNlcnRpZmljYXRlcyBjb3VsZCBoYXZlIE5ldHNjYXBlLXNwZWNpZmljIENBIHR5cGVzICovCisJCWVsc2UgaWYgKHgtPmV4X2ZsYWdzICYgRVhGTEFHX05TQ0VSVAorCQkJICYmIHgtPmV4X25zY2VydCAmIE5TX0FOWV9DQSkgcmV0dXJuIDU7CisJCS8qIGNhbiB0aGlzIHN0aWxsIGJlIHJlZ2FyZGVkIGEgQ0EgY2VydGlmaWNhdGU/ICBJIGRvdWJ0IGl0ICovCisJCXJldHVybiAwOworCX0KK30KKworaW50IFg1MDlfY2hlY2tfY2EoWDUwOSAqeCkKK3sKKwlpZighKHgtPmV4X2ZsYWdzICYgRVhGTEFHX1NFVCkpIHsKKwkJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19YNTA5KTsKKwkJeDUwOXYzX2NhY2hlX2V4dGVuc2lvbnMoeCk7CisJCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19YNTA5KTsKKwl9CisKKwlyZXR1cm4gY2hlY2tfY2EoeCk7Cit9CisKKy8qIENoZWNrIFNTTCBDQTogY29tbW9uIGNoZWNrcyBmb3IgU1NMIGNsaWVudCBhbmQgc2VydmVyICovCitzdGF0aWMgaW50IGNoZWNrX3NzbF9jYShjb25zdCBYNTA5ICp4KQoreworCWludCBjYV9yZXQ7CisJY2FfcmV0ID0gY2hlY2tfY2EoeCk7CisJaWYoIWNhX3JldCkgcmV0dXJuIDA7CisJLyogY2hlY2sgbnNDZXJ0VHlwZSBpZiBwcmVzZW50ICovCisJaWYoY2FfcmV0ICE9IDUgfHwgeC0+ZXhfbnNjZXJ0ICYgTlNfU1NMX0NBKSByZXR1cm4gY2FfcmV0OworCWVsc2UgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjaGVja19wdXJwb3NlX3NzbF9jbGllbnQoY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKQoreworCWlmKHhrdV9yZWplY3QoeCxYS1VfU1NMX0NMSUVOVCkpIHJldHVybiAwOworCWlmKGNhKSByZXR1cm4gY2hlY2tfc3NsX2NhKHgpOworCS8qIFdlIG5lZWQgdG8gZG8gZGlnaXRhbCBzaWduYXR1cmVzIHdpdGggaXQgKi8KKwlpZihrdV9yZWplY3QoeCxLVV9ESUdJVEFMX1NJR05BVFVSRSkpIHJldHVybiAwOworCS8qIG5zQ2VydFR5cGUgaWYgcHJlc2VudCBzaG91bGQgYWxsb3cgU1NMIGNsaWVudCB1c2UgKi8JCisJaWYobnNfcmVqZWN0KHgsIE5TX1NTTF9DTElFTlQpKSByZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGVja19wdXJwb3NlX3NzbF9zZXJ2ZXIoY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKQoreworCWlmKHhrdV9yZWplY3QoeCxYS1VfU1NMX1NFUlZFUnxYS1VfU0dDKSkgcmV0dXJuIDA7CisJaWYoY2EpIHJldHVybiBjaGVja19zc2xfY2EoeCk7CisKKwlpZihuc19yZWplY3QoeCwgTlNfU1NMX1NFUlZFUikpIHJldHVybiAwOworCS8qIE5vdyBhcyBmb3Iga2V5VXNhZ2U6IHdlJ2xsIGF0IGxlYXN0IG5lZWQgdG8gc2lnbiBPUiBlbmNpcGhlciAqLworCWlmKGt1X3JlamVjdCh4LCBLVV9ESUdJVEFMX1NJR05BVFVSRXxLVV9LRVlfRU5DSVBIRVJNRU5UKSkgcmV0dXJuIDA7CisJCisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIGludCBjaGVja19wdXJwb3NlX25zX3NzbF9zZXJ2ZXIoY29uc3QgWDUwOV9QVVJQT1NFICp4cCwgY29uc3QgWDUwOSAqeCwgaW50IGNhKQoreworCWludCByZXQ7CisJcmV0ID0gY2hlY2tfcHVycG9zZV9zc2xfc2VydmVyKHhwLCB4LCBjYSk7CisJaWYoIXJldCB8fCBjYSkgcmV0dXJuIHJldDsKKwkvKiBXZSBuZWVkIHRvIGVuY2lwaGVyIG9yIE5ldHNjYXBlIGNvbXBsYWlucyAqLworCWlmKGt1X3JlamVjdCh4LCBLVV9LRVlfRU5DSVBIRVJNRU5UKSkgcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKK30KKworLyogY29tbW9uIFMvTUlNRSBjaGVja3MgKi8KK3N0YXRpYyBpbnQgcHVycG9zZV9zbWltZShjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJaWYoeGt1X3JlamVjdCh4LFhLVV9TTUlNRSkpIHJldHVybiAwOworCWlmKGNhKSB7CisJCWludCBjYV9yZXQ7CisJCWNhX3JldCA9IGNoZWNrX2NhKHgpOworCQlpZighY2FfcmV0KSByZXR1cm4gMDsKKwkJLyogY2hlY2sgbnNDZXJ0VHlwZSBpZiBwcmVzZW50ICovCisJCWlmKGNhX3JldCAhPSA1IHx8IHgtPmV4X25zY2VydCAmIE5TX1NNSU1FX0NBKSByZXR1cm4gY2FfcmV0OworCQllbHNlIHJldHVybiAwOworCX0KKwlpZih4LT5leF9mbGFncyAmIEVYRkxBR19OU0NFUlQpIHsKKwkJaWYoeC0+ZXhfbnNjZXJ0ICYgTlNfU01JTUUpIHJldHVybiAxOworCQkvKiBXb3JrYXJvdW5kIGZvciBzb21lIGJ1Z2d5IGNlcnRpZmljYXRlcyAqLworCQlpZih4LT5leF9uc2NlcnQgJiBOU19TU0xfQ0xJRU5UKSByZXR1cm4gMjsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2Vfc21pbWVfc2lnbihjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJaW50IHJldDsKKwlyZXQgPSBwdXJwb3NlX3NtaW1lKHgsIGNhKTsKKwlpZighcmV0IHx8IGNhKSByZXR1cm4gcmV0OworCWlmKGt1X3JlamVjdCh4LCBLVV9ESUdJVEFMX1NJR05BVFVSRXxLVV9OT05fUkVQVURJQVRJT04pKSByZXR1cm4gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNoZWNrX3B1cnBvc2Vfc21pbWVfZW5jcnlwdChjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJaW50IHJldDsKKwlyZXQgPSBwdXJwb3NlX3NtaW1lKHgsIGNhKTsKKwlpZighcmV0IHx8IGNhKSByZXR1cm4gcmV0OworCWlmKGt1X3JlamVjdCh4LCBLVV9LRVlfRU5DSVBIRVJNRU5UKSkgcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaGVja19wdXJwb3NlX2NybF9zaWduKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSkKK3sKKwlpZihjYSkgeworCQlpbnQgY2FfcmV0OworCQlpZigoY2FfcmV0ID0gY2hlY2tfY2EoeCkpICE9IDIpIHJldHVybiBjYV9yZXQ7CisJCWVsc2UgcmV0dXJuIDA7CisJfQorCWlmKGt1X3JlamVjdCh4LCBLVV9DUkxfU0lHTikpIHJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBPQ1NQIGhlbHBlcjogdGhpcyBpcyAqbm90KiBhIGZ1bGwgT0NTUCBjaGVjay4gSXQganVzdCBjaGVja3MgdGhhdAorICogZWFjaCBDQSBpcyB2YWxpZC4gQWRkaXRpb25hbCBjaGVja3MgbXVzdCBiZSBtYWRlIG9uIHRoZSBjaGFpbi4KKyAqLworCitzdGF0aWMgaW50IG9jc3BfaGVscGVyKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsIGludCBjYSkKK3sKKwkvKiBNdXN0IGJlIGEgdmFsaWQgQ0EuICBTaG91bGQgd2UgcmVhbGx5IHN1cHBvcnQgdGhlICJJIGRvbid0IGtub3ciCisJICAgdmFsdWUgKDIpPyAqLworCWlmKGNhKSByZXR1cm4gY2hlY2tfY2EoeCk7CisJLyogbGVhZiBjZXJ0aWZpY2F0ZSBpcyBjaGVja2VkIGluIE9DU1BfdmVyaWZ5KCkgKi8KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGVja19wdXJwb3NlX3RpbWVzdGFtcF9zaWduKGNvbnN0IFg1MDlfUFVSUE9TRSAqeHAsIGNvbnN0IFg1MDkgKngsCisJCQkJCWludCBjYSkKK3sKKwlpbnQgaV9leHQ7CisKKwkvKiBJZiBjYSBpcyB0cnVlIHdlIG11c3QgcmV0dXJuIGlmIHRoaXMgaXMgYSB2YWxpZCBDQSBjZXJ0aWZpY2F0ZS4gKi8KKwlpZiAoY2EpIHJldHVybiBjaGVja19jYSh4KTsKKworCS8qIAorCSAqIENoZWNrIHRoZSBvcHRpb25hbCBrZXkgdXNhZ2UgZmllbGQ6CisJICogaWYgS2V5IFVzYWdlIGlzIHByZXNlbnQsIGl0IG11c3QgYmUgb25lIG9mIGRpZ2l0YWxTaWduYXR1cmUgCisJICogYW5kL29yIG5vblJlcHVkaWF0aW9uIChvdGhlciB2YWx1ZXMgYXJlIG5vdCBjb25zaXN0ZW50IGFuZCBzaGFsbAorCSAqIGJlIHJlamVjdGVkKS4KKwkgKi8KKwlpZiAoKHgtPmV4X2ZsYWdzICYgRVhGTEFHX0tVU0FHRSkKKwkgICAgJiYgKCh4LT5leF9rdXNhZ2UgJiB+KEtVX05PTl9SRVBVRElBVElPTiB8IEtVX0RJR0lUQUxfU0lHTkFUVVJFKSkgfHwKKwkJISh4LT5leF9rdXNhZ2UgJiAoS1VfTk9OX1JFUFVESUFUSU9OIHwgS1VfRElHSVRBTF9TSUdOQVRVUkUpKSkpCisJCXJldHVybiAwOworCisJLyogT25seSB0aW1lIHN0YW1wIGtleSB1c2FnZSBpcyBwZXJtaXR0ZWQgYW5kIGl0J3MgcmVxdWlyZWQuICovCisJaWYgKCEoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfWEtVU0FHRSkgfHwgeC0+ZXhfeGt1c2FnZSAhPSBYS1VfVElNRVNUQU1QKQorCQlyZXR1cm4gMDsKKworCS8qIEV4dGVuZGVkIEtleSBVc2FnZSBNVVNUIGJlIGNyaXRpY2FsICovCisJaV9leHQgPSBYNTA5X2dldF9leHRfYnlfTklEKChYNTA5ICopIHgsIE5JRF9leHRfa2V5X3VzYWdlLCAwKTsKKwlpZiAoaV9leHQgPj0gMCkKKwkJeworCQlYNTA5X0VYVEVOU0lPTiAqZXh0ID0gWDUwOV9nZXRfZXh0KChYNTA5ICopIHgsIGlfZXh0KTsKKwkJaWYgKCFYNTA5X0VYVEVOU0lPTl9nZXRfY3JpdGljYWwoZXh0KSkKKwkJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBub19jaGVjayhjb25zdCBYNTA5X1BVUlBPU0UgKnhwLCBjb25zdCBYNTA5ICp4LCBpbnQgY2EpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qIFZhcmlvdXMgY2hlY2tzIHRvIHNlZSBpZiBvbmUgY2VydGlmaWNhdGUgaXNzdWVkIHRoZSBzZWNvbmQuCisgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIHBydW5lIGEgc2V0IG9mIHBvc3NpYmxlIGlzc3VlciBjZXJ0aWZpY2F0ZXMKKyAqIHdoaWNoIGhhdmUgYmVlbiBsb29rZWQgdXAgdXNpbmcgc29tZSBzaW1wbGUgbWV0aG9kIHN1Y2ggYXMgYnkKKyAqIHN1YmplY3QgbmFtZS4KKyAqIFRoZXNlIGFyZToKKyAqIDEuIENoZWNrIGlzc3Vlcl9uYW1lKHN1YmplY3QpID09IHN1YmplY3RfbmFtZShpc3N1ZXIpCisgKiAyLiBJZiBha2lkKHN1YmplY3QpIGV4aXN0cyBjaGVjayBpdCBtYXRjaGVzIGlzc3VlcgorICogMy4gSWYga2V5X3VzYWdlKGlzc3VlcikgZXhpc3RzIGNoZWNrIGl0IHN1cHBvcnRzIGNlcnRpZmljYXRlIHNpZ25pbmcKKyAqIHJldHVybnMgMCBmb3IgT0ssIHBvc2l0aXZlIGZvciByZWFzb24gZm9yIG1pc21hdGNoLCByZWFzb25zIG1hdGNoCisgKiBjb2RlcyBmb3IgWDUwOV92ZXJpZnlfY2VydCgpCisgKi8KKworaW50IFg1MDlfY2hlY2tfaXNzdWVkKFg1MDkgKmlzc3VlciwgWDUwOSAqc3ViamVjdCkKK3sKKwlpZihYNTA5X05BTUVfY21wKFg1MDlfZ2V0X3N1YmplY3RfbmFtZShpc3N1ZXIpLAorCQkJWDUwOV9nZXRfaXNzdWVyX25hbWUoc3ViamVjdCkpKQorCQkJCXJldHVybiBYNTA5X1ZfRVJSX1NVQkpFQ1RfSVNTVUVSX01JU01BVENIOworCXg1MDl2M19jYWNoZV9leHRlbnNpb25zKGlzc3Vlcik7CisJeDUwOXYzX2NhY2hlX2V4dGVuc2lvbnMoc3ViamVjdCk7CisKKwlpZihzdWJqZWN0LT5ha2lkKQorCQl7CisJCWludCByZXQgPSBYNTA5X2NoZWNrX2FraWQoaXNzdWVyLCBzdWJqZWN0LT5ha2lkKTsKKwkJaWYgKHJldCAhPSBYNTA5X1ZfT0spCisJCQlyZXR1cm4gcmV0OworCQl9CisKKwlpZihzdWJqZWN0LT5leF9mbGFncyAmIEVYRkxBR19QUk9YWSkKKwkJeworCQlpZihrdV9yZWplY3QoaXNzdWVyLCBLVV9ESUdJVEFMX1NJR05BVFVSRSkpCisJCQlyZXR1cm4gWDUwOV9WX0VSUl9LRVlVU0FHRV9OT19ESUdJVEFMX1NJR05BVFVSRTsKKwkJfQorCWVsc2UgaWYoa3VfcmVqZWN0KGlzc3VlciwgS1VfS0VZX0NFUlRfU0lHTikpCisJCXJldHVybiBYNTA5X1ZfRVJSX0tFWVVTQUdFX05PX0NFUlRTSUdOOworCXJldHVybiBYNTA5X1ZfT0s7Cit9CisKK2ludCBYNTA5X2NoZWNrX2FraWQoWDUwOSAqaXNzdWVyLCBBVVRIT1JJVFlfS0VZSUQgKmFraWQpCisJeworCisJaWYoIWFraWQpCisJCXJldHVybiBYNTA5X1ZfT0s7CisKKwkvKiBDaGVjayBrZXkgaWRzIChpZiBwcmVzZW50KSAqLworCWlmKGFraWQtPmtleWlkICYmIGlzc3Vlci0+c2tpZCAmJgorCQkgQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGFraWQtPmtleWlkLCBpc3N1ZXItPnNraWQpICkKKwkJCQlyZXR1cm4gWDUwOV9WX0VSUl9BS0lEX1NLSURfTUlTTUFUQ0g7CisJLyogQ2hlY2sgc2VyaWFsIG51bWJlciAqLworCWlmKGFraWQtPnNlcmlhbCAmJgorCQlBU04xX0lOVEVHRVJfY21wKFg1MDlfZ2V0X3NlcmlhbE51bWJlcihpc3N1ZXIpLCBha2lkLT5zZXJpYWwpKQorCQkJCXJldHVybiBYNTA5X1ZfRVJSX0FLSURfSVNTVUVSX1NFUklBTF9NSVNNQVRDSDsKKwkvKiBDaGVjayBpc3N1ZXIgbmFtZSAqLworCWlmKGFraWQtPmlzc3VlcikKKwkJeworCQkvKiBVZ2gsIGZvciBzb21lIHBlY3VsaWFyIHJlYXNvbiBBS0lEIGluY2x1ZGVzCisJCSAqIFNFUVVFTkNFIE9GIEdlbmVyYWxOYW1lLiBTbyBsb29rIGZvciBhIERpck5hbWUuCisJCSAqIFRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGJ1dCB3ZSBvbmx5IHRha2UgYW55CisJCSAqIG5vdGljZSBvZiB0aGUgZmlyc3QuCisJCSAqLworCQlHRU5FUkFMX05BTUVTICpnZW5zOworCQlHRU5FUkFMX05BTUUgKmdlbjsKKwkJWDUwOV9OQU1FICpubSA9IE5VTEw7CisJCWludCBpOworCQlnZW5zID0gYWtpZC0+aXNzdWVyOworCQlmb3IoaSA9IDA7IGkgPCBza19HRU5FUkFMX05BTUVfbnVtKGdlbnMpOyBpKyspCisJCQl7CisJCQlnZW4gPSBza19HRU5FUkFMX05BTUVfdmFsdWUoZ2VucywgaSk7CisJCQlpZihnZW4tPnR5cGUgPT0gR0VOX0RJUk5BTUUpCisJCQkJeworCQkJCW5tID0gZ2VuLT5kLmRpcm47CisJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQlpZihubSAmJiBYNTA5X05BTUVfY21wKG5tLCBYNTA5X2dldF9pc3N1ZXJfbmFtZShpc3N1ZXIpKSkKKwkJCXJldHVybiBYNTA5X1ZfRVJSX0FLSURfSVNTVUVSX1NFUklBTF9NSVNNQVRDSDsKKwkJfQorCXJldHVybiBYNTA5X1ZfT0s7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3NrZXkuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNfc2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMmM5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3NrZXkuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogdjNfc2tleS5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworc3RhdGljIEFTTjFfT0NURVRfU1RSSU5HICpzMmlfc2tleV9pZChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7Citjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19za2V5X2lkID0geyAKK05JRF9zdWJqZWN0X2tleV9pZGVudGlmaWVyLCAwLCBBU04xX0lURU1fcmVmKEFTTjFfT0NURVRfU1RSSU5HKSwKKzAsMCwwLDAsCisoWDUwOVYzX0VYVF9JMlMpaTJzX0FTTjFfT0NURVRfU1RSSU5HLAorKFg1MDlWM19FWFRfUzJJKXMyaV9za2V5X2lkLAorMCwwLDAsMCwKK05VTEx9OworCitjaGFyICppMnNfQVNOMV9PQ1RFVF9TVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIEFTTjFfT0NURVRfU1RSSU5HICpvY3QpCit7CisJcmV0dXJuIGhleF90b19zdHJpbmcob2N0LT5kYXRhLCBvY3QtPmxlbmd0aCk7Cit9CisKK0FTTjFfT0NURVRfU1RSSU5HICpzMmlfQVNOMV9PQ1RFVF9TVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkgICAgIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc3RyKQoreworCUFTTjFfT0NURVRfU1RSSU5HICpvY3Q7CisJbG9uZyBsZW5ndGg7CisKKwlpZighKG9jdCA9IE1fQVNOMV9PQ1RFVF9TVFJJTkdfbmV3KCkpKSB7CisJCVg1MDlWM2VycihYNTA5VjNfRl9TMklfQVNOMV9PQ1RFVF9TVFJJTkcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZighKG9jdC0+ZGF0YSA9IHN0cmluZ190b19oZXgoc3RyLCAmbGVuZ3RoKSkpIHsKKwkJTV9BU04xX09DVEVUX1NUUklOR19mcmVlKG9jdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCW9jdC0+bGVuZ3RoID0gbGVuZ3RoOworCisJcmV0dXJuIG9jdDsKKworfQorCitzdGF0aWMgQVNOMV9PQ1RFVF9TVFJJTkcgKnMyaV9za2V5X2lkKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJICAgICBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cikKK3sKKwlBU04xX09DVEVUX1NUUklORyAqb2N0OworCUFTTjFfQklUX1NUUklORyAqcGs7CisJdW5zaWduZWQgY2hhciBwa2V5X2RpZ1tFVlBfTUFYX01EX1NJWkVdOworCXVuc2lnbmVkIGludCBkaWdsZW47CisKKwlpZihzdHJjbXAoc3RyLCAiaGFzaCIpKSByZXR1cm4gczJpX0FTTjFfT0NURVRfU1RSSU5HKG1ldGhvZCwgY3R4LCBzdHIpOworCisJaWYoIShvY3QgPSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUzJJX1NLRVlfSUQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZihjdHggJiYgKGN0eC0+ZmxhZ3MgPT0gQ1RYX1RFU1QpKSByZXR1cm4gb2N0OworCisJaWYoIWN0eCB8fCAoIWN0eC0+c3ViamVjdF9yZXEgJiYgIWN0eC0+c3ViamVjdF9jZXJ0KSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUzJJX1NLRVlfSUQsWDUwOVYzX1JfTk9fUFVCTElDX0tFWSk7CisJCWdvdG8gZXJyOworCX0KKworCWlmKGN0eC0+c3ViamVjdF9yZXEpIAorCQlwayA9IGN0eC0+c3ViamVjdF9yZXEtPnJlcV9pbmZvLT5wdWJrZXktPnB1YmxpY19rZXk7CisJZWxzZSBwayA9IGN0eC0+c3ViamVjdF9jZXJ0LT5jZXJ0X2luZm8tPmtleS0+cHVibGljX2tleTsKKworCWlmKCFwaykgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUzJJX1NLRVlfSUQsWDUwOVYzX1JfTk9fUFVCTElDX0tFWSk7CisJCWdvdG8gZXJyOworCX0KKworCUVWUF9EaWdlc3QocGstPmRhdGEsIHBrLT5sZW5ndGgsIHBrZXlfZGlnLCAmZGlnbGVuLCBFVlBfc2hhMSgpLCBOVUxMKTsKKworCWlmKCFNX0FTTjFfT0NURVRfU1RSSU5HX3NldChvY3QsIHBrZXlfZGlnLCBkaWdsZW4pKSB7CisJCVg1MDlWM2VycihYNTA5VjNfRl9TMklfU0tFWV9JRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiBvY3Q7CisJCisJZXJyOgorCU1fQVNOMV9PQ1RFVF9TVFJJTkdfZnJlZShvY3QpOworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19zeG5ldC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M19zeG5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmJmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3N4bmV0LmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qIHYzX3N4bmV0LmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xdC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKy8qIFN1cHBvcnQgZm9yIFRoYXd0ZSBzdHJvbmcgZXh0cmFuZXQgZXh0ZW5zaW9uICovCisKKyNkZWZpbmUgU1hORVRfVEVTVAorCitzdGF0aWMgaW50IHN4bmV0X2kycihYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBTWE5FVCAqc3gsIEJJTyAqb3V0LCBpbnQgaW5kZW50KTsKKyNpZmRlZiBTWE5FVF9URVNUCitzdGF0aWMgU1hORVQgKiBzeG5ldF92MmkoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpOworI2VuZGlmCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCB2M19zeG5ldCA9IHsKK05JRF9zeG5ldCwgWDUwOVYzX0VYVF9NVUxUSUxJTkUsIEFTTjFfSVRFTV9yZWYoU1hORVQpLAorMCwwLDAsMCwKKzAsMCwKKzAsIAorI2lmZGVmIFNYTkVUX1RFU1QKKyhYNTA5VjNfRVhUX1YySSlzeG5ldF92MmksCisjZWxzZQorMCwKKyNlbmRpZgorKFg1MDlWM19FWFRfSTJSKXN4bmV0X2kyciwKKzAsCitOVUxMCit9OworCitBU04xX1NFUVVFTkNFKFNYTkVUSUQpID0geworCUFTTjFfU0lNUExFKFNYTkVUSUQsIHpvbmUsIEFTTjFfSU5URUdFUiksCisJQVNOMV9TSU1QTEUoU1hORVRJRCwgdXNlciwgQVNOMV9PQ1RFVF9TVFJJTkcpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFNYTkVUSUQpCisKK0lNUExFTUVOVF9BU04xX0ZVTkNUSU9OUyhTWE5FVElEKQorCitBU04xX1NFUVVFTkNFKFNYTkVUKSA9IHsKKwlBU04xX1NJTVBMRShTWE5FVCwgdmVyc2lvbiwgQVNOMV9JTlRFR0VSKSwKKwlBU04xX1NFUVVFTkNFX09GKFNYTkVULCBpZHMsIFNYTkVUSUQpCit9IEFTTjFfU0VRVUVOQ0VfRU5EKFNYTkVUKQorCitJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoU1hORVQpCisKK3N0YXRpYyBpbnQgc3huZXRfaTJyKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFNYTkVUICpzeCwgQklPICpvdXQsCisJICAgICBpbnQgaW5kZW50KQoreworCWxvbmcgdjsKKwljaGFyICp0bXA7CisJU1hORVRJRCAqaWQ7CisJaW50IGk7CisJdiA9IEFTTjFfSU5URUdFUl9nZXQoc3gtPnZlcnNpb24pOworCUJJT19wcmludGYob3V0LCAiJSpzVmVyc2lvbjogJWxkICgweCVsWCkiLCBpbmRlbnQsICIiLCB2ICsgMSwgdik7CisJZm9yKGkgPSAwOyBpIDwgc2tfU1hORVRJRF9udW0oc3gtPmlkcyk7IGkrKykgeworCQlpZCA9IHNrX1NYTkVUSURfdmFsdWUoc3gtPmlkcywgaSk7CisJCXRtcCA9IGkyc19BU04xX0lOVEVHRVIoTlVMTCwgaWQtPnpvbmUpOworCQlCSU9fcHJpbnRmKG91dCwgIlxuJSpzWm9uZTogJXMsIFVzZXI6ICIsIGluZGVudCwgIiIsIHRtcCk7CisJCU9QRU5TU0xfZnJlZSh0bXApOworCQlNX0FTTjFfT0NURVRfU1RSSU5HX3ByaW50KG91dCwgaWQtPnVzZXIpOworCX0KKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIFNYTkVUX1RFU1QKKworLyogTkJCOiB0aGlzIGlzIHVzZWQgZm9yIHRlc3Rpbmcgb25seS4gSXQgc2hvdWxkICpub3QqIGJlIHVzZWQgZm9yIGFueXRoaW5nCisgKiBlbHNlIGJlY2F1c2UgaXQgd2lsbCBqdXN0IHRha2Ugc3RhdGljIElEcyBmcm9tIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kCisgKiB0aGV5IHNob3VsZCByZWFsbHkgYmUgc2VwYXJhdGUgdmFsdWVzIGZvciBlYWNoIHVzZXIuCisgKi8KKworCitzdGF0aWMgU1hORVQgKiBzeG5ldF92MmkoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCSAgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpCit7CisJQ09ORl9WQUxVRSAqY25mOworCVNYTkVUICpzeCA9IE5VTEw7CisJaW50IGk7CisJZm9yKGkgPSAwOyBpIDwgc2tfQ09ORl9WQUxVRV9udW0obnZhbCk7IGkrKykgeworCQljbmYgPSBza19DT05GX1ZBTFVFX3ZhbHVlKG52YWwsIGkpOworCQlpZighU1hORVRfYWRkX2lkX2FzYygmc3gsIGNuZi0+bmFtZSwgY25mLT52YWx1ZSwgLTEpKQorCQkJCQkJCQkgcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBzeDsKK30KKwkJCisJCisjZW5kaWYKKworLyogU3Ryb25nIEV4dHJhbmV0IHV0aWxpdHkgZnVuY3Rpb25zICovCisKKy8qIEFkZCBhbiBpZCBnaXZlbiB0aGUgem9uZSBhcyBhbiBBU0NJSSBudW1iZXIgKi8KKworaW50IFNYTkVUX2FkZF9pZF9hc2MoU1hORVQgKipwc3gsIGNoYXIgKnpvbmUsIGNoYXIgKnVzZXIsCisJICAgICBpbnQgdXNlcmxlbikKK3sKKwlBU04xX0lOVEVHRVIgKml6b25lID0gTlVMTDsKKwlpZighKGl6b25lID0gczJpX0FTTjFfSU5URUdFUihOVUxMLCB6b25lKSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1NYTkVUX0FERF9JRF9BU0MsWDUwOVYzX1JfRVJST1JfQ09OVkVSVElOR19aT05FKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBTWE5FVF9hZGRfaWRfSU5URUdFUihwc3gsIGl6b25lLCB1c2VyLCB1c2VybGVuKTsKK30KKworLyogQWRkIGFuIGlkIGdpdmVuIHRoZSB6b25lIGFzIGFuIHVuc2lnbmVkIGxvbmcgKi8KKworaW50IFNYTkVUX2FkZF9pZF91bG9uZyhTWE5FVCAqKnBzeCwgdW5zaWduZWQgbG9uZyBsem9uZSwgY2hhciAqdXNlciwKKwkgICAgIGludCB1c2VybGVuKQoreworCUFTTjFfSU5URUdFUiAqaXpvbmUgPSBOVUxMOworCWlmKCEoaXpvbmUgPSBNX0FTTjFfSU5URUdFUl9uZXcoKSkgfHwgIUFTTjFfSU5URUdFUl9zZXQoaXpvbmUsIGx6b25lKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfU1hORVRfQUREX0lEX1VMT05HLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJTV9BU04xX0lOVEVHRVJfZnJlZShpem9uZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gU1hORVRfYWRkX2lkX0lOVEVHRVIocHN4LCBpem9uZSwgdXNlciwgdXNlcmxlbik7CisJCit9CisKKy8qIEFkZCBhbiBpZCBnaXZlbiB0aGUgem9uZSBhcyBhbiBBU04xX0lOVEVHRVIuCisgKiBOb3RlIHRoaXMgdmVyc2lvbiB1c2VzIHRoZSBwYXNzZWQgaW50ZWdlciBhbmQgZG9lc24ndCBtYWtlIGEgY29weSBzbyBkb24ndAorICogZnJlZSBpdCB1cCBhZnRlcndhcmRzLgorICovCisKK2ludCBTWE5FVF9hZGRfaWRfSU5URUdFUihTWE5FVCAqKnBzeCwgQVNOMV9JTlRFR0VSICp6b25lLCBjaGFyICp1c2VyLAorCSAgICAgaW50IHVzZXJsZW4pCit7CisJU1hORVQgKnN4ID0gTlVMTDsKKwlTWE5FVElEICppZCA9IE5VTEw7CisJaWYoIXBzeCB8fCAhem9uZSB8fCAhdXNlcikgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfU1hORVRfQUREX0lEX0lOVEVHRVIsWDUwOVYzX1JfSU5WQUxJRF9OVUxMX0FSR1VNRU5UKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmKHVzZXJsZW4gPT0gLTEpIHVzZXJsZW4gPSBzdHJsZW4odXNlcik7CisJaWYodXNlcmxlbiA+IDY0KSB7CisJCVg1MDlWM2VycihYNTA5VjNfRl9TWE5FVF9BRERfSURfSU5URUdFUixYNTA5VjNfUl9VU0VSX1RPT19MT05HKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmKCEqcHN4KSB7CisJCWlmKCEoc3ggPSBTWE5FVF9uZXcoKSkpIGdvdG8gZXJyOworCQlpZighQVNOMV9JTlRFR0VSX3NldChzeC0+dmVyc2lvbiwgMCkpIGdvdG8gZXJyOworCQkqcHN4ID0gc3g7CisJfSBlbHNlIHN4ID0gKnBzeDsKKwlpZihTWE5FVF9nZXRfaWRfSU5URUdFUihzeCwgem9uZSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX1NYTkVUX0FERF9JRF9JTlRFR0VSLFg1MDlWM19SX0RVUExJQ0FURV9aT05FX0lEKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYoIShpZCA9IFNYTkVUSURfbmV3KCkpKSBnb3RvIGVycjsKKwlpZih1c2VybGVuID09IC0xKSB1c2VybGVuID0gc3RybGVuKHVzZXIpOworCQkKKwlpZighTV9BU04xX09DVEVUX1NUUklOR19zZXQoaWQtPnVzZXIsIHVzZXIsIHVzZXJsZW4pKSBnb3RvIGVycjsKKwlpZighc2tfU1hORVRJRF9wdXNoKHN4LT5pZHMsIGlkKSkgZ290byBlcnI7CisJaWQtPnpvbmUgPSB6b25lOworCXJldHVybiAxOworCQorCWVycjoKKwlYNTA5VjNlcnIoWDUwOVYzX0ZfU1hORVRfQUREX0lEX0lOVEVHRVIsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCVNYTkVUSURfZnJlZShpZCk7CisJU1hORVRfZnJlZShzeCk7CisJKnBzeCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK0FTTjFfT0NURVRfU1RSSU5HICpTWE5FVF9nZXRfaWRfYXNjKFNYTkVUICpzeCwgY2hhciAqem9uZSkKK3sKKwlBU04xX0lOVEVHRVIgKml6b25lID0gTlVMTDsKKwlBU04xX09DVEVUX1NUUklORyAqb2N0OworCWlmKCEoaXpvbmUgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIHpvbmUpKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfU1hORVRfR0VUX0lEX0FTQyxYNTA5VjNfUl9FUlJPUl9DT05WRVJUSU5HX1pPTkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJb2N0ID0gU1hORVRfZ2V0X2lkX0lOVEVHRVIoc3gsIGl6b25lKTsKKwlNX0FTTjFfSU5URUdFUl9mcmVlKGl6b25lKTsKKwlyZXR1cm4gb2N0OworfQorCitBU04xX09DVEVUX1NUUklORyAqU1hORVRfZ2V0X2lkX3Vsb25nKFNYTkVUICpzeCwgdW5zaWduZWQgbG9uZyBsem9uZSkKK3sKKwlBU04xX0lOVEVHRVIgKml6b25lID0gTlVMTDsKKwlBU04xX09DVEVUX1NUUklORyAqb2N0OworCWlmKCEoaXpvbmUgPSBNX0FTTjFfSU5URUdFUl9uZXcoKSkgfHwgIUFTTjFfSU5URUdFUl9zZXQoaXpvbmUsIGx6b25lKSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfU1hORVRfR0VUX0lEX1VMT05HLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJTV9BU04xX0lOVEVHRVJfZnJlZShpem9uZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlvY3QgPSBTWE5FVF9nZXRfaWRfSU5URUdFUihzeCwgaXpvbmUpOworCU1fQVNOMV9JTlRFR0VSX2ZyZWUoaXpvbmUpOworCXJldHVybiBvY3Q7Cit9CisKK0FTTjFfT0NURVRfU1RSSU5HICpTWE5FVF9nZXRfaWRfSU5URUdFUihTWE5FVCAqc3gsIEFTTjFfSU5URUdFUiAqem9uZSkKK3sKKwlTWE5FVElEICppZDsKKwlpbnQgaTsKKwlmb3IoaSA9IDA7IGkgPCBza19TWE5FVElEX251bShzeC0+aWRzKTsgaSsrKSB7CisJCWlkID0gc2tfU1hORVRJRF92YWx1ZShzeC0+aWRzLCBpKTsKKwkJaWYoIU1fQVNOMV9JTlRFR0VSX2NtcChpZC0+em9uZSwgem9uZSkpIHJldHVybiBpZC0+dXNlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK0lNUExFTUVOVF9TVEFDS19PRihTWE5FVElEKQorSU1QTEVNRU5UX0FTTjFfU0VUX09GKFNYTkVUSUQpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzX3V0bC5jIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M191dGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDMwMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M191dGwuYwpAQCAtMCwwICsxLDg3NCBAQAorLyogdjNfdXRsLmMgKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAzIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiBYNTA5IHYzIGV4dGVuc2lvbiB1dGlsaXRpZXMgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgImNyeXB0bGliLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisKK3N0YXRpYyBjaGFyICpzdHJpcF9zcGFjZXMoY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IHNrX3N0cmNtcChjb25zdCBjaGFyICogY29uc3QgKmEsIGNvbnN0IGNoYXIgKiBjb25zdCAqYik7CitzdGF0aWMgU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpnZXRfZW1haWwoWDUwOV9OQU1FICpuYW1lLCBHRU5FUkFMX05BTUVTICpnZW5zKTsKK3N0YXRpYyB2b2lkIHN0cl9mcmVlKE9QRU5TU0xfU1RSSU5HIHN0cik7CitzdGF0aWMgaW50IGFwcGVuZF9pYTUoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICoqc2ssIEFTTjFfSUE1U1RSSU5HICplbWFpbCk7CisKK3N0YXRpYyBpbnQgaXB2NF9mcm9tX2FzYyh1bnNpZ25lZCBjaGFyICp2NCwgY29uc3QgY2hhciAqaW4pOworc3RhdGljIGludCBpcHY2X2Zyb21fYXNjKHVuc2lnbmVkIGNoYXIgKnY2LCBjb25zdCBjaGFyICppbik7CitzdGF0aWMgaW50IGlwdjZfY2IoY29uc3QgY2hhciAqZWxlbSwgaW50IGxlbiwgdm9pZCAqdXNyKTsKK3N0YXRpYyBpbnQgaXB2Nl9oZXgodW5zaWduZWQgY2hhciAqb3V0LCBjb25zdCBjaGFyICppbiwgaW50IGlubGVuKTsKKworLyogQWRkIGEgQ09ORl9WQUxVRSBuYW1lIHZhbHVlIHBhaXIgdG8gc3RhY2sgKi8KKworaW50IFg1MDlWM19hZGRfdmFsdWUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpCit7CisJQ09ORl9WQUxVRSAqdnRtcCA9IE5VTEw7CisJY2hhciAqdG5hbWUgPSBOVUxMLCAqdHZhbHVlID0gTlVMTDsKKwlpZihuYW1lICYmICEodG5hbWUgPSBCVUZfc3RyZHVwKG5hbWUpKSkgZ290byBlcnI7CisJaWYodmFsdWUgJiYgISh0dmFsdWUgPSBCVUZfc3RyZHVwKHZhbHVlKSkpIGdvdG8gZXJyOworCWlmKCEodnRtcCA9IChDT05GX1ZBTFVFICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENPTkZfVkFMVUUpKSkpIGdvdG8gZXJyOworCWlmKCEqZXh0bGlzdCAmJiAhKCpleHRsaXN0ID0gc2tfQ09ORl9WQUxVRV9uZXdfbnVsbCgpKSkgZ290byBlcnI7CisJdnRtcC0+c2VjdGlvbiA9IE5VTEw7CisJdnRtcC0+bmFtZSA9IHRuYW1lOworCXZ0bXAtPnZhbHVlID0gdHZhbHVlOworCWlmKCFza19DT05GX1ZBTFVFX3B1c2goKmV4dGxpc3QsIHZ0bXApKSBnb3RvIGVycjsKKwlyZXR1cm4gMTsKKwllcnI6CisJWDUwOVYzZXJyKFg1MDlWM19GX1g1MDlWM19BRERfVkFMVUUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCWlmKHZ0bXApIE9QRU5TU0xfZnJlZSh2dG1wKTsKKwlpZih0bmFtZSkgT1BFTlNTTF9mcmVlKHRuYW1lKTsKKwlpZih0dmFsdWUpIE9QRU5TU0xfZnJlZSh0dmFsdWUpOworCXJldHVybiAwOworfQorCitpbnQgWDUwOVYzX2FkZF92YWx1ZV91Y2hhcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICp2YWx1ZSwKKwkJCSAgIFNUQUNLX09GKENPTkZfVkFMVUUpICoqZXh0bGlzdCkKKyAgICB7CisgICAgcmV0dXJuIFg1MDlWM19hZGRfdmFsdWUobmFtZSwoY29uc3QgY2hhciAqKXZhbHVlLGV4dGxpc3QpOworICAgIH0KKworLyogRnJlZSBmdW5jdGlvbiBmb3IgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKi8KKwordm9pZCBYNTA5VjNfY29uZl9mcmVlKENPTkZfVkFMVUUgKmNvbmYpCit7CisJaWYoIWNvbmYpIHJldHVybjsKKwlpZihjb25mLT5uYW1lKSBPUEVOU1NMX2ZyZWUoY29uZi0+bmFtZSk7CisJaWYoY29uZi0+dmFsdWUpIE9QRU5TU0xfZnJlZShjb25mLT52YWx1ZSk7CisJaWYoY29uZi0+c2VjdGlvbikgT1BFTlNTTF9mcmVlKGNvbmYtPnNlY3Rpb24pOworCU9QRU5TU0xfZnJlZShjb25mKTsKK30KKworaW50IFg1MDlWM19hZGRfdmFsdWVfYm9vbChjb25zdCBjaGFyICpuYW1lLCBpbnQgYXNuMV9ib29sLAorCQkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KQoreworCWlmKGFzbjFfYm9vbCkgcmV0dXJuIFg1MDlWM19hZGRfdmFsdWUobmFtZSwgIlRSVUUiLCBleHRsaXN0KTsKKwlyZXR1cm4gWDUwOVYzX2FkZF92YWx1ZShuYW1lLCAiRkFMU0UiLCBleHRsaXN0KTsKK30KKworaW50IFg1MDlWM19hZGRfdmFsdWVfYm9vbF9uZihjaGFyICpuYW1lLCBpbnQgYXNuMV9ib29sLAorCQkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KQoreworCWlmKGFzbjFfYm9vbCkgcmV0dXJuIFg1MDlWM19hZGRfdmFsdWUobmFtZSwgIlRSVUUiLCBleHRsaXN0KTsKKwlyZXR1cm4gMTsKK30KKworCitjaGFyICppMnNfQVNOMV9FTlVNRVJBVEVEKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIEFTTjFfRU5VTUVSQVRFRCAqYSkKK3sKKwlCSUdOVU0gKmJudG1wID0gTlVMTDsKKwljaGFyICpzdHJ0bXAgPSBOVUxMOworCWlmKCFhKSByZXR1cm4gTlVMTDsKKwlpZighKGJudG1wID0gQVNOMV9FTlVNRVJBVEVEX3RvX0JOKGEsIE5VTEwpKSB8fAorCSAgICAhKHN0cnRtcCA9IEJOX2JuMmRlYyhibnRtcCkpICkKKwkJWDUwOVYzZXJyKFg1MDlWM19GX0kyU19BU04xX0VOVU1FUkFURUQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCUJOX2ZyZWUoYm50bXApOworCXJldHVybiBzdHJ0bXA7Cit9CisKK2NoYXIgKmkyc19BU04xX0lOVEVHRVIoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgQVNOMV9JTlRFR0VSICphKQoreworCUJJR05VTSAqYm50bXAgPSBOVUxMOworCWNoYXIgKnN0cnRtcCA9IE5VTEw7CisJaWYoIWEpIHJldHVybiBOVUxMOworCWlmKCEoYm50bXAgPSBBU04xX0lOVEVHRVJfdG9fQk4oYSwgTlVMTCkpIHx8CisJICAgICEoc3RydG1wID0gQk5fYm4yZGVjKGJudG1wKSkgKQorCQlYNTA5VjNlcnIoWDUwOVYzX0ZfSTJTX0FTTjFfSU5URUdFUixFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJQk5fZnJlZShibnRtcCk7CisJcmV0dXJuIHN0cnRtcDsKK30KKworQVNOMV9JTlRFR0VSICpzMmlfQVNOMV9JTlRFR0VSKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIGNoYXIgKnZhbHVlKQoreworCUJJR05VTSAqYm4gPSBOVUxMOworCUFTTjFfSU5URUdFUiAqYWludDsKKwlpbnQgaXNuZWcsIGlzaGV4OworCWludCByZXQ7CisJaWYgKCF2YWx1ZSkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUzJJX0FTTjFfSU5URUdFUixYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOworCQlyZXR1cm4gMDsKKwl9CisJYm4gPSBCTl9uZXcoKTsKKwlpZiAodmFsdWVbMF0gPT0gJy0nKSB7CisJCXZhbHVlKys7CisJCWlzbmVnID0gMTsKKwl9IGVsc2UgaXNuZWcgPSAwOworCisJaWYgKHZhbHVlWzBdID09ICcwJyAmJiAoKHZhbHVlWzFdID09ICd4JykgfHwgKHZhbHVlWzFdID09ICdYJykpKSB7CisJCXZhbHVlICs9IDI7CisJCWlzaGV4ID0gMTsKKwl9IGVsc2UgaXNoZXggPSAwOworCisJaWYgKGlzaGV4KSByZXQgPSBCTl9oZXgyYm4oJmJuLCB2YWx1ZSk7CisJZWxzZSByZXQgPSBCTl9kZWMyYm4oJmJuLCB2YWx1ZSk7CisKKwlpZiAoIXJldCB8fCB2YWx1ZVtyZXRdKSB7CisJCUJOX2ZyZWUoYm4pOworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUzJJX0FTTjFfSU5URUdFUixYNTA5VjNfUl9CTl9ERUMyQk5fRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXNuZWcgJiYgQk5faXNfemVybyhibikpIGlzbmVnID0gMDsKKworCWFpbnQgPSBCTl90b19BU04xX0lOVEVHRVIoYm4sIE5VTEwpOworCUJOX2ZyZWUoYm4pOworCWlmICghYWludCkgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfUzJJX0FTTjFfSU5URUdFUixYNTA5VjNfUl9CTl9UT19BU04xX0lOVEVHRVJfRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGlzbmVnKSBhaW50LT50eXBlIHw9IFZfQVNOMV9ORUc7CisJcmV0dXJuIGFpbnQ7Cit9CisKK2ludCBYNTA5VjNfYWRkX3ZhbHVlX2ludChjb25zdCBjaGFyICpuYW1lLCBBU04xX0lOVEVHRVIgKmFpbnQsCisJICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpCit7CisJY2hhciAqc3RydG1wOworCWludCByZXQ7CisJaWYoIWFpbnQpIHJldHVybiAxOworCWlmKCEoc3RydG1wID0gaTJzX0FTTjFfSU5URUdFUihOVUxMLCBhaW50KSkpIHJldHVybiAwOworCXJldCA9IFg1MDlWM19hZGRfdmFsdWUobmFtZSwgc3RydG1wLCBleHRsaXN0KTsKKwlPUEVOU1NMX2ZyZWUoc3RydG1wKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgWDUwOVYzX2dldF92YWx1ZV9ib29sKENPTkZfVkFMVUUgKnZhbHVlLCBpbnQgKmFzbjFfYm9vbCkKK3sKKwljaGFyICpidG1wOworCWlmKCEoYnRtcCA9IHZhbHVlLT52YWx1ZSkpIGdvdG8gZXJyOworCWlmKCFzdHJjbXAoYnRtcCwgIlRSVUUiKSB8fCAhc3RyY21wKGJ0bXAsICJ0cnVlIikKKwkJIHx8ICFzdHJjbXAoYnRtcCwgIlkiKSB8fCAhc3RyY21wKGJ0bXAsICJ5IikKKwkJfHwgIXN0cmNtcChidG1wLCAiWUVTIikgfHwgIXN0cmNtcChidG1wLCAieWVzIikpIHsKKwkJKmFzbjFfYm9vbCA9IDB4ZmY7CisJCXJldHVybiAxOworCX0gZWxzZSBpZighc3RyY21wKGJ0bXAsICJGQUxTRSIpIHx8ICFzdHJjbXAoYnRtcCwgImZhbHNlIikKKwkJIHx8ICFzdHJjbXAoYnRtcCwgIk4iKSB8fCAhc3RyY21wKGJ0bXAsICJuIikKKwkJfHwgIXN0cmNtcChidG1wLCAiTk8iKSB8fCAhc3RyY21wKGJ0bXAsICJubyIpKSB7CisJCSphc24xX2Jvb2wgPSAwOworCQlyZXR1cm4gMTsKKwl9CisJZXJyOgorCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfR0VUX1ZBTFVFX0JPT0wsWDUwOVYzX1JfSU5WQUxJRF9CT09MRUFOX1NUUklORyk7CisJWDUwOVYzX2NvbmZfZXJyKHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IFg1MDlWM19nZXRfdmFsdWVfaW50KENPTkZfVkFMVUUgKnZhbHVlLCBBU04xX0lOVEVHRVIgKiphaW50KQoreworCUFTTjFfSU5URUdFUiAqaXRtcDsKKwlpZighKGl0bXAgPSBzMmlfQVNOMV9JTlRFR0VSKE5VTEwsIHZhbHVlLT52YWx1ZSkpKSB7CisJCVg1MDlWM19jb25mX2Vycih2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwkqYWludCA9IGl0bXA7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgSERSX05BTUUJMQorI2RlZmluZSBIRFJfVkFMVUUJMgorCisvKiNkZWZpbmUgREVCVUcqLworCitTVEFDS19PRihDT05GX1ZBTFVFKSAqWDUwOVYzX3BhcnNlX2xpc3QoY29uc3QgY2hhciAqbGluZSkKK3sKKwljaGFyICpwLCAqcSwgYzsKKwljaGFyICpudG1wLCAqdnRtcDsKKwlTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsdWVzID0gTlVMTDsKKwljaGFyICpsaW5lYnVmOworCWludCBzdGF0ZTsKKwkvKiBXZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBsaW5lIHNvIGNvcHkgaXQgZmlyc3QgKi8KKwlsaW5lYnVmID0gQlVGX3N0cmR1cChsaW5lKTsKKwlzdGF0ZSA9IEhEUl9OQU1FOworCW50bXAgPSBOVUxMOworCS8qIEdvIHRocm91Z2ggYWxsIGNoYXJhY3RlcnMgKi8KKwlmb3IocCA9IGxpbmVidWYsIHEgPSBsaW5lYnVmOyAoYyA9ICpwKSAmJiAoYyE9J1xyJykgJiYgKGMhPSdcbicpOyBwKyspIHsKKworCQlzd2l0Y2goc3RhdGUpIHsKKwkJCWNhc2UgSERSX05BTUU6CisJCQlpZihjID09ICc6JykgeworCQkJCXN0YXRlID0gSERSX1ZBTFVFOworCQkJCSpwID0gMDsKKwkJCQludG1wID0gc3RyaXBfc3BhY2VzKHEpOworCQkJCWlmKCFudG1wKSB7CisJCQkJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfUEFSU0VfTElTVCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOworCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkJcSA9IHAgKyAxOworCQkJfSBlbHNlIGlmKGMgPT0gJywnKSB7CisJCQkJKnAgPSAwOworCQkJCW50bXAgPSBzdHJpcF9zcGFjZXMocSk7CisJCQkJcSA9IHAgKyAxOworI2lmIDAKKwkJCQlwcmludGYoIiVzXG4iLCBudG1wKTsKKyNlbmRpZgorCQkJCWlmKCFudG1wKSB7CisJCQkJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfUEFSU0VfTElTVCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX05BTUUpOworCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCBOVUxMLCAmdmFsdWVzKTsKKwkJCX0KKwkJCWJyZWFrIDsKKworCQkJY2FzZSBIRFJfVkFMVUU6CisJCQlpZihjID09ICcsJykgeworCQkJCXN0YXRlID0gSERSX05BTUU7CisJCQkJKnAgPSAwOworCQkJCXZ0bXAgPSBzdHJpcF9zcGFjZXMocSk7CisjaWYgMAorCQkJCXByaW50ZigiJXNcbiIsIG50bXApOworI2VuZGlmCisJCQkJaWYoIXZ0bXApIHsKKwkJCQkJWDUwOVYzZXJyKFg1MDlWM19GX1g1MDlWM19QQVJTRV9MSVNULCBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUpOworCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkJWDUwOVYzX2FkZF92YWx1ZShudG1wLCB2dG1wLCAmdmFsdWVzKTsKKwkJCQludG1wID0gTlVMTDsKKwkJCQlxID0gcCArIDE7CisJCQl9CisKKwkJfQorCX0KKworCWlmKHN0YXRlID09IEhEUl9WQUxVRSkgeworCQl2dG1wID0gc3RyaXBfc3BhY2VzKHEpOworI2lmIDAKKwkJcHJpbnRmKCIlcz0lc1xuIiwgbnRtcCwgdnRtcCk7CisjZW5kaWYKKwkJaWYoIXZ0bXApIHsKKwkJCVg1MDlWM2VycihYNTA5VjNfRl9YNTA5VjNfUEFSU0VfTElTVCwgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCVg1MDlWM19hZGRfdmFsdWUobnRtcCwgdnRtcCwgJnZhbHVlcyk7CisJfSBlbHNlIHsKKwkJbnRtcCA9IHN0cmlwX3NwYWNlcyhxKTsKKyNpZiAwCisJCXByaW50ZigiJXNcbiIsIG50bXApOworI2VuZGlmCisJCWlmKCFudG1wKSB7CisJCQlYNTA5VjNlcnIoWDUwOVYzX0ZfWDUwOVYzX1BBUlNFX0xJU1QsIFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCVg1MDlWM19hZGRfdmFsdWUobnRtcCwgTlVMTCwgJnZhbHVlcyk7CisJfQorT1BFTlNTTF9mcmVlKGxpbmVidWYpOworcmV0dXJuIHZhbHVlczsKKworZXJyOgorT1BFTlNTTF9mcmVlKGxpbmVidWYpOworc2tfQ09ORl9WQUxVRV9wb3BfZnJlZSh2YWx1ZXMsIFg1MDlWM19jb25mX2ZyZWUpOworcmV0dXJuIE5VTEw7CisKK30KKworLyogRGVsZXRlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBmcm9tIGEgc3RyaW5nICovCitzdGF0aWMgY2hhciAqc3RyaXBfc3BhY2VzKGNoYXIgKm5hbWUpCit7CisJY2hhciAqcCwgKnE7CisJLyogU2tpcCBvdmVyIGxlYWRpbmcgc3BhY2VzICovCisJcCA9IG5hbWU7CisJd2hpbGUoKnAgJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikqcCkpIHArKzsKKwlpZighKnApIHJldHVybiBOVUxMOworCXEgPSBwICsgc3RybGVuKHApIC0gMTsKKwl3aGlsZSgocSAhPSBwKSAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSpxKSkgcS0tOworCWlmKHAgIT0gcSkgcVsxXSA9IDA7CisJaWYoISpwKSByZXR1cm4gTlVMTDsKKwlyZXR1cm4gcDsKK30KKworLyogaGV4IHN0cmluZyB1dGlsaXRpZXMgKi8KKworLyogR2l2ZW4gYSBidWZmZXIgb2YgbGVuZ3RoICdsZW4nIHJldHVybiBhIE9QRU5TU0xfbWFsbG9jJ2VkIHN0cmluZyB3aXRoIGl0cworICogaGV4IHJlcHJlc2VudGF0aW9uCisgKiBAQEAgKENvbnRlbnRzIG9mIGJ1ZmZlciBhcmUgYWx3YXlzIGtlcHQgaW4gQVNDSUksIGFsc28gb24gRUJDRElDIG1hY2hpbmVzKQorICovCisKK2NoYXIgKmhleF90b19zdHJpbmcoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBsb25nIGxlbikKK3sKKwljaGFyICp0bXAsICpxOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGk7CisJY29uc3Qgc3RhdGljIGNoYXIgaGV4ZGlnW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisJaWYoIWJ1ZmZlciB8fCAhbGVuKSByZXR1cm4gTlVMTDsKKwlpZighKHRtcCA9IE9QRU5TU0xfbWFsbG9jKGxlbiAqIDMgKyAxKSkpIHsKKwkJWDUwOVYzZXJyKFg1MDlWM19GX0hFWF9UT19TVFJJTkcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcSA9IHRtcDsKKwlmb3IoaSA9IDAsIHAgPSBidWZmZXI7IGkgPCBsZW47IGkrKyxwKyspIHsKKwkJKnErKyA9IGhleGRpZ1soKnAgPj4gNCkgJiAweGZdOworCQkqcSsrID0gaGV4ZGlnWypwICYgMHhmXTsKKwkJKnErKyA9ICc6JzsKKwl9CisJcVstMV0gPSAwOworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJZWJjZGljMmFzY2lpKHRtcCwgdG1wLCBxIC0gdG1wIC0gMSk7CisjZW5kaWYKKworCXJldHVybiB0bXA7Cit9CisKKy8qIEdpdmUgYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyBjb252ZXJ0IHRvCisgKiBhIGJ1ZmZlcgorICovCisKK3Vuc2lnbmVkIGNoYXIgKnN0cmluZ190b19oZXgoY29uc3QgY2hhciAqc3RyLCBsb25nICpsZW4pCit7CisJdW5zaWduZWQgY2hhciAqaGV4YnVmLCAqcTsKKwl1bnNpZ25lZCBjaGFyIGNoLCBjbCwgKnA7CisJaWYoIXN0cikgeworCQlYNTA5VjNlcnIoWDUwOVYzX0ZfU1RSSU5HX1RPX0hFWCxYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYoIShoZXhidWYgPSBPUEVOU1NMX21hbGxvYyhzdHJsZW4oc3RyKSA+PiAxKSkpIGdvdG8gZXJyOworCWZvcihwID0gKHVuc2lnbmVkIGNoYXIgKilzdHIsIHEgPSBoZXhidWY7ICpwOykgeworCQljaCA9ICpwKys7CisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKwkJY2ggPSBvc190b2ViY2RpY1tjaF07CisjZW5kaWYKKwkJaWYoY2ggPT0gJzonKSBjb250aW51ZTsKKwkJY2wgPSAqcCsrOworI2lmZGVmIENIQVJTRVRfRUJDRElDCisJCWNsID0gb3NfdG9lYmNkaWNbY2xdOworI2VuZGlmCisJCWlmKCFjbCkgeworCQkJWDUwOVYzZXJyKFg1MDlWM19GX1NUUklOR19UT19IRVgsWDUwOVYzX1JfT0REX05VTUJFUl9PRl9ESUdJVFMpOworCQkJT1BFTlNTTF9mcmVlKGhleGJ1Zik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZihpc3VwcGVyKGNoKSkgY2ggPSB0b2xvd2VyKGNoKTsKKwkJaWYoaXN1cHBlcihjbCkpIGNsID0gdG9sb3dlcihjbCk7CisKKwkJaWYoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIGNoIC09ICcwJzsKKwkJZWxzZSBpZiAoKGNoID49ICdhJykgJiYgKGNoIDw9ICdmJykpIGNoIC09ICdhJyAtIDEwOworCQllbHNlIGdvdG8gYmFkaGV4OworCisJCWlmKChjbCA+PSAnMCcpICYmIChjbCA8PSAnOScpKSBjbCAtPSAnMCc7CisJCWVsc2UgaWYgKChjbCA+PSAnYScpICYmIChjbCA8PSAnZicpKSBjbCAtPSAnYScgLSAxMDsKKwkJZWxzZSBnb3RvIGJhZGhleDsKKworCQkqcSsrID0gKGNoIDw8IDQpIHwgY2w7CisJfQorCisJaWYobGVuKSAqbGVuID0gcSAtIGhleGJ1ZjsKKworCXJldHVybiBoZXhidWY7CisKKwllcnI6CisJaWYoaGV4YnVmKSBPUEVOU1NMX2ZyZWUoaGV4YnVmKTsKKwlYNTA5VjNlcnIoWDUwOVYzX0ZfU1RSSU5HX1RPX0hFWCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJcmV0dXJuIE5VTEw7CisKKwliYWRoZXg6CisJT1BFTlNTTF9mcmVlKGhleGJ1Zik7CisJWDUwOVYzZXJyKFg1MDlWM19GX1NUUklOR19UT19IRVgsWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQpOworCXJldHVybiBOVUxMOworCit9CisKKy8qIFYySSBuYW1lIGNvbXBhcmlzb24gZnVuY3Rpb246IHJldHVybnMgemVybyBpZiAnbmFtZScgbWF0Y2hlcworICogY21wIG9yIGNtcC4qCisgKi8KKworaW50IG5hbWVfY21wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNtcCkKK3sKKwlpbnQgbGVuLCByZXQ7CisJY2hhciBjOworCWxlbiA9IHN0cmxlbihjbXApOworCWlmKChyZXQgPSBzdHJuY21wKG5hbWUsIGNtcCwgbGVuKSkpIHJldHVybiByZXQ7CisJYyA9IG5hbWVbbGVuXTsKKwlpZighYyB8fCAoYz09Jy4nKSkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2tfc3RyY21wKGNvbnN0IGNoYXIgKiBjb25zdCAqYSwgY29uc3QgY2hhciAqIGNvbnN0ICpiKQoreworCXJldHVybiBzdHJjbXAoKmEsICpiKTsKK30KKworU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpYNTA5X2dldDFfZW1haWwoWDUwOSAqeCkKK3sKKwlHRU5FUkFMX05BTUVTICpnZW5zOworCVNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqcmV0OworCisJZ2VucyA9IFg1MDlfZ2V0X2V4dF9kMmkoeCwgTklEX3N1YmplY3RfYWx0X25hbWUsIE5VTEwsIE5VTEwpOworCXJldCA9IGdldF9lbWFpbChYNTA5X2dldF9zdWJqZWN0X25hbWUoeCksIGdlbnMpOworCXNrX0dFTkVSQUxfTkFNRV9wb3BfZnJlZShnZW5zLCBHRU5FUkFMX05BTUVfZnJlZSk7CisJcmV0dXJuIHJldDsKK30KKworU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpYNTA5X2dldDFfb2NzcChYNTA5ICp4KQoreworCUFVVEhPUklUWV9JTkZPX0FDQ0VTUyAqaW5mbzsKKwlTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnJldCA9IE5VTEw7CisJaW50IGk7CisKKwlpbmZvID0gWDUwOV9nZXRfZXh0X2QyaSh4LCBOSURfaW5mb19hY2Nlc3MsIE5VTEwsIE5VTEwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIE5VTEw7CisJZm9yIChpID0gMDsgaSA8IHNrX0FDQ0VTU19ERVNDUklQVElPTl9udW0oaW5mbyk7IGkrKykKKwkJeworCQlBQ0NFU1NfREVTQ1JJUFRJT04gKmFkID0gc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3ZhbHVlKGluZm8sIGkpOworCQlpZiAoT0JKX29iajJuaWQoYWQtPm1ldGhvZCkgPT0gTklEX2FkX09DU1ApCisJCQl7CisJCQlpZiAoYWQtPmxvY2F0aW9uLT50eXBlID09IEdFTl9VUkkpCisJCQkJeworCQkJCWlmICghYXBwZW5kX2lhNSgmcmV0LCBhZC0+bG9jYXRpb24tPmQudW5pZm9ybVJlc291cmNlSWRlbnRpZmllcikpCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCUFVVEhPUklUWV9JTkZPX0FDQ0VTU19mcmVlKGluZm8pOworCXJldHVybiByZXQ7Cit9CisKK1NUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqWDUwOV9SRVFfZ2V0MV9lbWFpbChYNTA5X1JFUSAqeCkKK3sKKwlHRU5FUkFMX05BTUVTICpnZW5zOworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0czsKKwlTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnJldDsKKworCWV4dHMgPSBYNTA5X1JFUV9nZXRfZXh0ZW5zaW9ucyh4KTsKKwlnZW5zID0gWDUwOVYzX2dldF9kMmkoZXh0cywgTklEX3N1YmplY3RfYWx0X25hbWUsIE5VTEwsIE5VTEwpOworCXJldCA9IGdldF9lbWFpbChYNTA5X1JFUV9nZXRfc3ViamVjdF9uYW1lKHgpLCBnZW5zKTsKKwlza19HRU5FUkFMX05BTUVfcG9wX2ZyZWUoZ2VucywgR0VORVJBTF9OQU1FX2ZyZWUpOworCXNrX1g1MDlfRVhURU5TSU9OX3BvcF9mcmVlKGV4dHMsIFg1MDlfRVhURU5TSU9OX2ZyZWUpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqZ2V0X2VtYWlsKFg1MDlfTkFNRSAqbmFtZSwgR0VORVJBTF9OQU1FUyAqZ2VucykKK3sKKwlTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnJldCA9IE5VTEw7CisJWDUwOV9OQU1FX0VOVFJZICpuZTsKKwlBU04xX0lBNVNUUklORyAqZW1haWw7CisJR0VORVJBTF9OQU1FICpnZW47CisJaW50IGk7CisJLyogTm93IGFkZCBhbnkgZW1haWwgYWRkcmVzcyhlcykgdG8gU1RBQ0sgKi8KKwlpID0gLTE7CisJLyogRmlyc3Qgc3VwcGxpZWQgWDUwOV9OQU1FICovCisJd2hpbGUoKGkgPSBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRChuYW1lLAorCQkJCQkgTklEX3BrY3M5X2VtYWlsQWRkcmVzcywgaSkpID49IDApIHsKKwkJbmUgPSBYNTA5X05BTUVfZ2V0X2VudHJ5KG5hbWUsIGkpOworCQllbWFpbCA9IFg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShuZSk7CisJCWlmKCFhcHBlbmRfaWE1KCZyZXQsIGVtYWlsKSkgcmV0dXJuIE5VTEw7CisJfQorCWZvcihpID0gMDsgaSA8IHNrX0dFTkVSQUxfTkFNRV9udW0oZ2Vucyk7IGkrKykKKwl7CisJCWdlbiA9IHNrX0dFTkVSQUxfTkFNRV92YWx1ZShnZW5zLCBpKTsKKwkJaWYoZ2VuLT50eXBlICE9IEdFTl9FTUFJTCkgY29udGludWU7CisJCWlmKCFhcHBlbmRfaWE1KCZyZXQsIGdlbi0+ZC5pYTUpKSByZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc3RyX2ZyZWUoT1BFTlNTTF9TVFJJTkcgc3RyKQoreworCU9QRU5TU0xfZnJlZShzdHIpOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9pYTUoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICoqc2ssIEFTTjFfSUE1U1RSSU5HICplbWFpbCkKK3sKKwljaGFyICplbXRtcDsKKwkvKiBGaXJzdCBzb21lIHNhbml0eSBjaGVja3MgKi8KKwlpZihlbWFpbC0+dHlwZSAhPSBWX0FTTjFfSUE1U1RSSU5HKSByZXR1cm4gMTsKKwlpZighZW1haWwtPmRhdGEgfHwgIWVtYWlsLT5sZW5ndGgpIHJldHVybiAxOworCWlmKCEqc2spICpzayA9IHNrX09QRU5TU0xfU1RSSU5HX25ldyhza19zdHJjbXApOworCWlmKCEqc2spIHJldHVybiAwOworCS8qIERvbid0IGFkZCBkdXBsaWNhdGVzICovCisJaWYoc2tfT1BFTlNTTF9TVFJJTkdfZmluZCgqc2ssIChjaGFyICopZW1haWwtPmRhdGEpICE9IC0xKSByZXR1cm4gMTsKKwllbXRtcCA9IEJVRl9zdHJkdXAoKGNoYXIgKillbWFpbC0+ZGF0YSk7CisJaWYoIWVtdG1wIHx8ICFza19PUEVOU1NMX1NUUklOR19wdXNoKCpzaywgZW10bXApKSB7CisJCVg1MDlfZW1haWxfZnJlZSgqc2spOworCQkqc2sgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQgWDUwOV9lbWFpbF9mcmVlKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqc2spCit7CisJc2tfT1BFTlNTTF9TVFJJTkdfcG9wX2ZyZWUoc2ssIHN0cl9mcmVlKTsKK30KKworLyogQ29udmVydCBJUCBhZGRyZXNzZXMgYm90aCBJUHY0IGFuZCBJUHY2IGludG8gYW4gCisgKiBPQ1RFVCBTVFJJTkcgY29tcGF0aWJsZSB3aXRoIFJGQzMyODAuCisgKi8KKworQVNOMV9PQ1RFVF9TVFJJTkcgKmEyaV9JUEFERFJFU1MoY29uc3QgY2hhciAqaXBhc2MpCisJeworCXVuc2lnbmVkIGNoYXIgaXBvdXRbMTZdOworCUFTTjFfT0NURVRfU1RSSU5HICpyZXQ7CisJaW50IGlwbGVuOworCisJLyogSWYgc3RyaW5nIGNvbnRhaW5zIGEgJzonIGFzc3VtZSBJUHY2ICovCisKKwlpcGxlbiA9IGEyaV9pcGFkZChpcG91dCwgaXBhc2MpOworCisJaWYgKCFpcGxlbikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFBU04xX09DVEVUX1NUUklOR19zZXQocmV0LCBpcG91dCwgaXBsZW4pKQorCQl7CisJCUFTTjFfT0NURVRfU1RSSU5HX2ZyZWUocmV0KTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworQVNOMV9PQ1RFVF9TVFJJTkcgKmEyaV9JUEFERFJFU1NfTkMoY29uc3QgY2hhciAqaXBhc2MpCisJeworCUFTTjFfT0NURVRfU1RSSU5HICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgaXBvdXRbMzJdOworCWNoYXIgKmlwdG1wID0gTlVMTCwgKnA7CisJaW50IGlwbGVuMSwgaXBsZW4yOworCXAgPSBzdHJjaHIoaXBhc2MsJy8nKTsKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCWlwdG1wID0gQlVGX3N0cmR1cChpcGFzYyk7CisJaWYgKCFpcHRtcCkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IGlwdG1wICsgKHAgLSBpcGFzYyk7CisJKnArKyA9IDA7CisKKwlpcGxlbjEgPSBhMmlfaXBhZGQoaXBvdXQsIGlwdG1wKTsKKworCWlmICghaXBsZW4xKQorCQlnb3RvIGVycjsKKworCWlwbGVuMiA9IGEyaV9pcGFkZChpcG91dCArIGlwbGVuMSwgcCk7CisKKwlPUEVOU1NMX2ZyZWUoaXB0bXApOworCWlwdG1wID0gTlVMTDsKKworCWlmICghaXBsZW4yIHx8IChpcGxlbjEgIT0gaXBsZW4yKSkKKwkJZ290byBlcnI7CisKKwlyZXQgPSBBU04xX09DVEVUX1NUUklOR19uZXcoKTsKKwlpZiAoIXJldCkKKwkJZ290byBlcnI7CisJaWYgKCFBU04xX09DVEVUX1NUUklOR19zZXQocmV0LCBpcG91dCwgaXBsZW4xICsgaXBsZW4yKSkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gcmV0OworCisJZXJyOgorCWlmIChpcHRtcCkKKwkJT1BFTlNTTF9mcmVlKGlwdG1wKTsKKwlpZiAocmV0KQorCQlBU04xX09DVEVUX1NUUklOR19mcmVlKHJldCk7CisJcmV0dXJuIE5VTEw7CisJfQorCQorCitpbnQgYTJpX2lwYWRkKHVuc2lnbmVkIGNoYXIgKmlwb3V0LCBjb25zdCBjaGFyICppcGFzYykKKwl7CisJLyogSWYgc3RyaW5nIGNvbnRhaW5zIGEgJzonIGFzc3VtZSBJUHY2ICovCisKKwlpZiAoc3RyY2hyKGlwYXNjLCAnOicpKQorCQl7CisJCWlmICghaXB2Nl9mcm9tX2FzYyhpcG91dCwgaXBhc2MpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAxNjsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIWlwdjRfZnJvbV9hc2MoaXBvdXQsIGlwYXNjKSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gNDsKKwkJfQorCX0KKworc3RhdGljIGludCBpcHY0X2Zyb21fYXNjKHVuc2lnbmVkIGNoYXIgKnY0LCBjb25zdCBjaGFyICppbikKKwl7CisJaW50IGEwLCBhMSwgYTIsIGEzOworCWlmIChzc2NhbmYoaW4sICIlZC4lZC4lZC4lZCIsICZhMCwgJmExLCAmYTIsICZhMykgIT0gNCkKKwkJcmV0dXJuIDA7CisJaWYgKChhMCA8IDApIHx8IChhMCA+IDI1NSkgfHwgKGExIDwgMCkgfHwgKGExID4gMjU1KQorCQl8fCAoYTIgPCAwKSB8fCAoYTIgPiAyNTUpIHx8IChhMyA8IDApIHx8IChhMyA+IDI1NSkpCisJCXJldHVybiAwOworCXY0WzBdID0gYTA7CisJdjRbMV0gPSBhMTsKKwl2NFsyXSA9IGEyOworCXY0WzNdID0gYTM7CisJcmV0dXJuIDE7CisJfQorCit0eXBlZGVmIHN0cnVjdCB7CisJCS8qIFRlbXBvcmFyeSBzdG9yZSBmb3IgSVBWNiBvdXRwdXQgKi8KKwkJdW5zaWduZWQgY2hhciB0bXBbMTZdOworCQkvKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdG1wICovCisJCWludCB0b3RhbDsKKwkJLyogVGhlIHBvc2l0aW9uIG9mIGEgemVybyAoY29ycmVzcG9uZGluZyB0byAnOjonKSAqLworCQlpbnQgemVyb19wb3M7CisJCS8qIE51bWJlciBvZiB6ZXJvZXMgKi8KKwkJaW50IHplcm9fY250OworCX0gSVBWNl9TVEFUOworCisKK3N0YXRpYyBpbnQgaXB2Nl9mcm9tX2FzYyh1bnNpZ25lZCBjaGFyICp2NiwgY29uc3QgY2hhciAqaW4pCisJeworCUlQVjZfU1RBVCB2NnN0YXQ7CisJdjZzdGF0LnRvdGFsID0gMDsKKwl2NnN0YXQuemVyb19wb3MgPSAtMTsKKwl2NnN0YXQuemVyb19jbnQgPSAwOworCS8qIFRyZWF0IHRoZSBJUHY2IHJlcHJlc2VudGF0aW9uIGFzIGEgbGlzdCBvZiB2YWx1ZXMKKwkgKiBzZXBhcmF0ZWQgYnkgJzonLiBUaGUgcHJlc2VuY2Ugb2YgYSAnOjonIHdpbGwgcGFyc2UKKyAJICogYXMgb25lLCB0d28gb3IgdGhyZWUgemVybyBsZW5ndGggZWxlbWVudHMuCisJICovCisJaWYgKCFDT05GX3BhcnNlX2xpc3QoaW4sICc6JywgMCwgaXB2Nl9jYiwgJnY2c3RhdCkpCisJCXJldHVybiAwOworCisJLyogTm93IGZvciBzb21lIHNhbml0eSBjaGVja3MgKi8KKworCWlmICh2NnN0YXQuemVyb19wb3MgPT0gLTEpCisJCXsKKwkJLyogSWYgbm8gJzo6JyBtdXN0IGhhdmUgZXhhY3RseSAxNiBieXRlcyAqLworCQlpZiAodjZzdGF0LnRvdGFsICE9IDE2KQorCQkJcmV0dXJuIDA7CisJCX0KKwllbHNlIAorCQl7CisJCS8qIElmICc6OicgbXVzdCBoYXZlIGxlc3MgdGhhbiAxNiBieXRlcyAqLworCQlpZiAodjZzdGF0LnRvdGFsID09IDE2KQorCQkJcmV0dXJuIDA7CisJCS8qIE1vcmUgdGhhbiB0aHJlZSB6ZXJvZXMgaXMgYW4gZXJyb3IgKi8KKwkJaWYgKHY2c3RhdC56ZXJvX2NudCA+IDMpCisJCQlyZXR1cm4gMDsKKwkJLyogQ2FuIG9ubHkgaGF2ZSB0aHJlZSB6ZXJvZXMgaWYgbm90aGluZyBlbHNlIHByZXNlbnQgKi8KKwkJZWxzZSBpZiAodjZzdGF0Lnplcm9fY250ID09IDMpCisJCQl7CisJCQlpZiAodjZzdGF0LnRvdGFsID4gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJLyogQ2FuIG9ubHkgaGF2ZSB0d28gemVyb2VzIGlmIGF0IHN0YXJ0IG9yIGVuZCAqLworCQllbHNlIGlmICh2NnN0YXQuemVyb19jbnQgPT0gMikKKwkJCXsKKwkJCWlmICgodjZzdGF0Lnplcm9fcG9zICE9IDApCisJCQkJJiYgKHY2c3RhdC56ZXJvX3BvcyAhPSB2NnN0YXQudG90YWwpKQorCQkJCXJldHVybiAwOworCQkJfQorCQllbHNlIAorCQkvKiBDYW4gb25seSBoYXZlIG9uZSB6ZXJvIGlmICpub3QqIHN0YXJ0IG9yIGVuZCAqLworCQkJeworCQkJaWYgKCh2NnN0YXQuemVyb19wb3MgPT0gMCkKKwkJCQl8fCAodjZzdGF0Lnplcm9fcG9zID09IHY2c3RhdC50b3RhbCkpCisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKworCS8qIEZvcm1hdCByZXN1bHQgKi8KKworCWlmICh2NnN0YXQuemVyb19wb3MgPj0gMCkKKwkJeworCQkvKiBDb3B5IGluaXRpYWwgcGFydCAqLworCQltZW1jcHkodjYsIHY2c3RhdC50bXAsIHY2c3RhdC56ZXJvX3Bvcyk7CisJCS8qIFplcm8gbWlkZGxlICovCisJCW1lbXNldCh2NiArIHY2c3RhdC56ZXJvX3BvcywgMCwgMTYgLSB2NnN0YXQudG90YWwpOworCQkvKiBDb3B5IGZpbmFsIHBhcnQgKi8KKwkJaWYgKHY2c3RhdC50b3RhbCAhPSB2NnN0YXQuemVyb19wb3MpCisJCQltZW1jcHkodjYgKyB2NnN0YXQuemVyb19wb3MgKyAxNiAtIHY2c3RhdC50b3RhbCwKKwkJCQl2NnN0YXQudG1wICsgdjZzdGF0Lnplcm9fcG9zLAorCQkJCXY2c3RhdC50b3RhbCAtIHY2c3RhdC56ZXJvX3Bvcyk7CisJCX0KKwllbHNlCisJCW1lbWNweSh2NiwgdjZzdGF0LnRtcCwgMTYpOworCisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IGlwdjZfY2IoY29uc3QgY2hhciAqZWxlbSwgaW50IGxlbiwgdm9pZCAqdXNyKQorCXsKKwlJUFY2X1NUQVQgKnMgPSB1c3I7CisJLyogRXJyb3IgaWYgMTYgYnl0ZXMgd3JpdHRlbiAqLworCWlmIChzLT50b3RhbCA9PSAxNikKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA9PSAwKQorCQl7CisJCS8qIFplcm8gbGVuZ3RoIGVsZW1lbnQsIGNvcnJlc3BvbmRzIHRvICc6OicgKi8KKwkJaWYgKHMtPnplcm9fcG9zID09IC0xKQorCQkJcy0+emVyb19wb3MgPSBzLT50b3RhbDsKKwkJLyogSWYgd2UndmUgYWxyZWFkeSBnb3QgYSA6OiBpdHMgYW4gZXJyb3IgKi8KKwkJZWxzZSBpZiAocy0+emVyb19wb3MgIT0gcy0+dG90YWwpCisJCQlyZXR1cm4gMDsKKwkJcy0+emVyb19jbnQrKzsKKwkJfQorCWVsc2UgCisJCXsKKwkJLyogSWYgbW9yZSB0aGFuIDQgY2hhcmFjdGVycyBjb3VsZCBiZSBmaW5hbCBhLmIuYy5kIGZvcm0gKi8KKwkJaWYgKGxlbiA+IDQpCisJCQl7CisJCQkvKiBOZWVkIGF0IGxlYXN0IDQgYnl0ZXMgbGVmdCAqLworCQkJaWYgKHMtPnRvdGFsID4gMTIpCisJCQkJcmV0dXJuIDA7CisJCQkvKiBNdXN0IGJlIGVuZCBvZiBzdHJpbmcgKi8KKwkJCWlmIChlbGVtW2xlbl0pCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoIWlwdjRfZnJvbV9hc2Mocy0+dG1wICsgcy0+dG90YWwsIGVsZW0pKQorCQkJCXJldHVybiAwOworCQkJcy0+dG90YWwgKz0gNDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJaWYgKCFpcHY2X2hleChzLT50bXAgKyBzLT50b3RhbCwgZWxlbSwgbGVuKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXMtPnRvdGFsICs9IDI7CisJCQl9CisJCX0KKwlyZXR1cm4gMTsKKwl9CisKKy8qIENvbnZlcnQgYSBzdHJpbmcgb2YgdXAgdG8gNCBoZXggZGlnaXRzIGludG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAqIElQdjYgZm9ybS4KKyAqLworCitzdGF0aWMgaW50IGlwdjZfaGV4KHVuc2lnbmVkIGNoYXIgKm91dCwgY29uc3QgY2hhciAqaW4sIGludCBpbmxlbikKKwl7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGludCBudW0gPSAwOworCWlmIChpbmxlbiA+IDQpCisJCXJldHVybiAwOworCXdoaWxlKGlubGVuLS0pCisJCXsKKwkJYyA9ICppbisrOworCQludW0gPDw9IDQ7CisJCWlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpCisJCQludW0gfD0gYyAtICcwJzsKKwkJZWxzZSBpZiAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnRicpKQorCQkJbnVtIHw9IGMgLSAnQScgKyAxMDsKKwkJZWxzZSBpZiAoKGMgPj0gJ2EnKSAmJiAoYyA8PSAnZicpKQorCQkJbnVtIHw9ICBjIC0gJ2EnICsgMTA7CisJCWVsc2UKKwkJCXJldHVybiAwOworCQl9CisJb3V0WzBdID0gbnVtID4+IDg7CisJb3V0WzFdID0gbnVtICYgMHhmZjsKKwlyZXR1cm4gMTsKKwl9CisKKworaW50IFg1MDlWM19OQU1FX2Zyb21fc2VjdGlvbihYNTA5X05BTUUgKm5tLCBTVEFDS19PRihDT05GX1ZBTFVFKSpkbl9zaywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgY2h0eXBlKQorCXsKKwlDT05GX1ZBTFVFICp2OworCWludCBpLCBtdmFsOworCWNoYXIgKnAsICp0eXBlOworCWlmICghbm0pCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IHNrX0NPTkZfVkFMVUVfbnVtKGRuX3NrKTsgaSsrKQorCQl7CisJCXY9c2tfQ09ORl9WQUxVRV92YWx1ZShkbl9zayxpKTsKKwkJdHlwZT12LT5uYW1lOworCQkvKiBTa2lwIHBhc3QgYW55IGxlYWRpbmcgWC4gWDogWCwgZXRjIHRvIGFsbG93IGZvcgorCQkgKiBtdWx0aXBsZSBpbnN0YW5jZXMgCisJCSAqLworCQlmb3IocCA9IHR5cGU7ICpwIDsgcCsrKSAKKyNpZm5kZWYgQ0hBUlNFVF9FQkNESUMKKwkJCWlmICgoKnAgPT0gJzonKSB8fCAoKnAgPT0gJywnKSB8fCAoKnAgPT0gJy4nKSkKKyNlbHNlCisJCQlpZiAoKCpwID09IG9zX3RvYXNjaWlbJzonXSkgfHwgKCpwID09IG9zX3RvYXNjaWlbJywnXSkgfHwgKCpwID09IG9zX3RvYXNjaWlbJy4nXSkpCisjZW5kaWYKKwkJCQl7CisJCQkJcCsrOworCQkJCWlmKCpwKSB0eXBlID0gcDsKKwkJCQlicmVhazsKKwkJCQl9CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCWlmICgqdHlwZSA9PSAnKycpCisjZWxzZQorCQlpZiAoKnR5cGUgPT0gb3NfdG9hc2NpaVsnKyddKQorI2VuZGlmCisJCQl7CisJCQltdmFsID0gLTE7CisJCQl0eXBlKys7CisJCQl9CisJCWVsc2UKKwkJCW12YWwgPSAwOworCQlpZiAoIVg1MDlfTkFNRV9hZGRfZW50cnlfYnlfdHh0KG5tLHR5cGUsIGNodHlwZSwKKwkJCQkodW5zaWduZWQgY2hhciAqKSB2LT52YWx1ZSwtMSwtMSxtdmFsKSkKKwkJCQkJcmV0dXJuIDA7CisKKwkJfQorCXJldHVybiAxOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNjb25mLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzY29uZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTZjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzY29uZi5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiB2M2NvbmYuYyAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJjcnlwdGxpYi5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOXYzLmg+CisKKy8qIFRlc3QgYXBwbGljYXRpb24gdG8gYWRkIGV4dGVuc2lvbnMgZnJvbSBhIGNvbmZpZyBmaWxlICovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlMSEFTSCAqY29uZjsKKwlYNTA5ICpjZXJ0OworCUZJTEUgKmluZjsKKwljaGFyICpjb25mX2ZpbGU7CisJaW50IGk7CisJaW50IGNvdW50OworCVg1MDlfRVhURU5TSU9OICpleHQ7CisJWDUwOVYzX2FkZF9zdGFuZGFyZF9leHRlbnNpb25zKCk7CisJRVJSX2xvYWRfY3J5cHRvX3N0cmluZ3MoKTsKKwlpZighYXJndlsxXSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiB2M2NvbmYgY2VydC5wZW0gW2ZpbGUuY25mXVxuIik7CisJCWV4aXQoMSk7CisJfQorCWNvbmZfZmlsZSA9IGFyZ3ZbMl07CisJaWYoIWNvbmZfZmlsZSkgY29uZl9maWxlID0gInRlc3QuY25mIjsKKwljb25mID0gQ09ORl9sb2FkKE5VTEwsICJ0ZXN0LmNuZiIsIE5VTEwpOworCWlmKCFjb25mKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBDb25maWcgZmlsZSAlc1xuIiwgY29uZl9maWxlKTsKKwkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCQlleGl0KDEpOworCX0KKworCWluZiA9IGZvcGVuKGFyZ3ZbMV0sICJyIik7CisJaWYoIWluZikgeworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gY2VydGlmaWNhdGUgZmlsZSAlc1xuIiwgYXJndlsxXSk7CisJCWV4aXQoMSk7CisJfQorCWNlcnQgPSBQRU1fcmVhZF9YNTA5KGluZiwgTlVMTCwgTlVMTCk7CisJaWYoIWNlcnQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciByZWFkaW5nIGNlcnRpZmljYXRlIGZpbGUgJXNcbiIsIGFyZ3ZbMV0pOworCQlleGl0KDEpOworCX0KKwlmY2xvc2UoaW5mKTsKKworCXNrX3BvcF9mcmVlKGNlcnQtPmNlcnRfaW5mby0+ZXh0ZW5zaW9ucywgWDUwOV9FWFRFTlNJT05fZnJlZSk7CisJY2VydC0+Y2VydF9pbmZvLT5leHRlbnNpb25zID0gTlVMTDsKKworCWlmKCFYNTA5VjNfRVhUX2FkZF9jb25mKGNvbmYsIE5VTEwsICJ0ZXN0X3NlY3Rpb24iLCBjZXJ0KSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGFkZGluZyBleHRlbnNpb25zXG4iKTsKKwkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCQlleGl0KDEpOworCX0KKworCWNvdW50ID0gWDUwOV9nZXRfZXh0X2NvdW50KGNlcnQpOworCXByaW50ZigiJWQgZXh0ZW5zaW9uc1xuIiwgY291bnQpOworCWZvcihpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJZXh0ID0gWDUwOV9nZXRfZXh0KGNlcnQsIGkpOworCQlwcmludGYoIiVzIiwgT0JKX25pZDJsbihPQkpfb2JqMm5pZChleHQtPm9iamVjdCkpKTsKKwkJaWYoZXh0LT5jcml0aWNhbCkgcHJpbnRmKCIsY3JpdGljYWw6XG4iKTsKKwkJZWxzZSBwcmludGYoIjpcbiIpOworCQlYNTA5VjNfRVhUX3ByaW50X2ZwKHN0ZG91dCwgZXh0LCAwLCAwKTsKKwkJcHJpbnRmKCJcbiIpOworCQkKKwl9CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNlcnIuYyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNlcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWY2ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My92M2Vyci5jCkBAIC0wLDAgKzEsMjI2IEBACisvKiBjcnlwdG8veDUwOXYzL3YzZXJyLmMgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisvKiBOT1RFOiB0aGlzIGZpbGUgd2FzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBta2Vyci5wbCBzY3JpcHQ6IGFueSBjaGFuZ2VzCisgKiBtYWRlIHRvIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IG5leHQgdXBkYXRlcyB0aGlzIGZpbGUsCisgKiBvbmx5IHJlYXNvbiBzdHJpbmdzIHdpbGwgYmUgcHJlc2VydmVkLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworI2RlZmluZSBFUlJfRlVOQyhmdW5jKSBFUlJfUEFDSyhFUlJfTElCX1g1MDlWMyxmdW5jLDApCisjZGVmaW5lIEVSUl9SRUFTT04ocmVhc29uKSBFUlJfUEFDSyhFUlJfTElCX1g1MDlWMywwLHJlYXNvbikKKworc3RhdGljIEVSUl9TVFJJTkdfREFUQSBYNTA5VjNfc3RyX2Z1bmN0c1tdPQorCXsKK3tFUlJfRlVOQyhYNTA5VjNfRl9BMklfR0VORVJBTF9OQU1FKSwJIkEySV9HRU5FUkFMX05BTUUifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9BU0lERU5USUZJRVJDSE9JQ0VfQ0FOT05JWkUpLAkiQVNJREVOVElGSUVSQ0hPSUNFX0NBTk9OSVpFIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfQVNJREVOVElGSUVSQ0hPSUNFX0lTX0NBTk9OSUNBTCksCSJBU0lERU5USUZJRVJDSE9JQ0VfSVNfQ0FOT05JQ0FMIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfQ09QWV9FTUFJTCksCSJDT1BZX0VNQUlMIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfQ09QWV9JU1NVRVIpLAkiQ09QWV9JU1NVRVIifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9ET19ESVJOQU1FKSwJIkRPX0RJUk5BTUUifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9ET19FWFRfQ09ORiksCSJET19FWFRfQ09ORiJ9LAore0VSUl9GVU5DKFg1MDlWM19GX0RPX0VYVF9JMkQpLAkiRE9fRVhUX0kyRCJ9LAore0VSUl9GVU5DKFg1MDlWM19GX0RPX0VYVF9OQ09ORiksCSJET19FWFRfTkNPTkYifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9ET19JMlZfTkFNRV9DT05TVFJBSU5UUyksCSJET19JMlZfTkFNRV9DT05TVFJBSU5UUyJ9LAore0VSUl9GVU5DKFg1MDlWM19GX0dOQU1FU19GUk9NX1NFQ1ROQU1FKSwJIkdOQU1FU19GUk9NX1NFQ1ROQU1FIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfSEVYX1RPX1NUUklORyksCSJoZXhfdG9fc3RyaW5nIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfSTJTX0FTTjFfRU5VTUVSQVRFRCksCSJpMnNfQVNOMV9FTlVNRVJBVEVEIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfSTJTX0FTTjFfSUE1U1RSSU5HKSwJIkkyU19BU04xX0lBNVNUUklORyJ9LAore0VSUl9GVU5DKFg1MDlWM19GX0kyU19BU04xX0lOVEVHRVIpLAkiaTJzX0FTTjFfSU5URUdFUiJ9LAore0VSUl9GVU5DKFg1MDlWM19GX0kyVl9BVVRIT1JJVFlfSU5GT19BQ0NFU1MpLAkiSTJWX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyJ9LAore0VSUl9GVU5DKFg1MDlWM19GX05PVElDRV9TRUNUSU9OKSwJIk5PVElDRV9TRUNUSU9OIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfTlJFRl9OT1MpLAkiTlJFRl9OT1MifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9QT0xJQ1lfU0VDVElPTiksCSJQT0xJQ1lfU0VDVElPTiJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFKSwJIlBST0NFU1NfUENJX1ZBTFVFIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfUjJJX0NFUlRQT0wpLAkiUjJJX0NFUlRQT0wifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9SMklfUENJKSwJIlIySV9QQ0kifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9TMklfQVNOMV9JQTVTVFJJTkcpLAkiUzJJX0FTTjFfSUE1U1RSSU5HIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfUzJJX0FTTjFfSU5URUdFUiksCSJzMmlfQVNOMV9JTlRFR0VSIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfUzJJX0FTTjFfT0NURVRfU1RSSU5HKSwJInMyaV9BU04xX09DVEVUX1NUUklORyJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1MySV9BU04xX1NLRVlfSUQpLAkiUzJJX0FTTjFfU0tFWV9JRCJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1MySV9TS0VZX0lEKSwJIlMySV9TS0VZX0lEIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfU0VUX0RJU1RfUE9JTlRfTkFNRSksCSJTRVRfRElTVF9QT0lOVF9OQU1FIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfU1RSSU5HX1RPX0hFWCksCSJzdHJpbmdfdG9faGV4In0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfU1hORVRfQUREX0lEX0FTQyksCSJTWE5FVF9hZGRfaWRfYXNjIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfU1hORVRfQUREX0lEX0lOVEVHRVIpLAkiU1hORVRfYWRkX2lkX0lOVEVHRVIifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9TWE5FVF9BRERfSURfVUxPTkcpLAkiU1hORVRfYWRkX2lkX3Vsb25nIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfU1hORVRfR0VUX0lEX0FTQyksCSJTWE5FVF9nZXRfaWRfYXNjIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfU1hORVRfR0VUX0lEX1VMT05HKSwJIlNYTkVUX2dldF9pZF91bG9uZyJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1YySV9BU0lERU5USUZJRVJTKSwJIlYySV9BU0lERU5USUZJRVJTIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX0FTTjFfQklUX1NUUklORyksCSJ2MmlfQVNOMV9CSVRfU1RSSU5HIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX0FVVEhPUklUWV9JTkZPX0FDQ0VTUyksCSJWMklfQVVUSE9SSVRZX0lORk9fQUNDRVNTIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX0FVVEhPUklUWV9LRVlJRCksCSJWMklfQVVUSE9SSVRZX0tFWUlEIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX0JBU0lDX0NPTlNUUkFJTlRTKSwJIlYySV9CQVNJQ19DT05TVFJBSU5UUyJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1YySV9DUkxEKSwJIlYySV9DUkxEIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX0VYVEVOREVEX0tFWV9VU0FHRSksCSJWMklfRVhURU5ERURfS0VZX1VTQUdFIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX0dFTkVSQUxfTkFNRVMpLAkidjJpX0dFTkVSQUxfTkFNRVMifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9WMklfR0VORVJBTF9OQU1FX0VYKSwJInYyaV9HRU5FUkFMX05BTUVfZXgifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9WMklfSURQKSwJIlYySV9JRFAifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9WMklfSVBBRERSQkxPQ0tTKSwJIlYySV9JUEFERFJCTE9DS1MifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9WMklfSVNTVUVSX0FMVCksCSJWMklfSVNTVUVSX0FMVCJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1YySV9OQU1FX0NPTlNUUkFJTlRTKSwJIlYySV9OQU1FX0NPTlNUUkFJTlRTIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX1BPTElDWV9DT05TVFJBSU5UUyksCSJWMklfUE9MSUNZX0NPTlNUUkFJTlRTIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX1BPTElDWV9NQVBQSU5HUyksCSJWMklfUE9MSUNZX01BUFBJTkdTIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfVjJJX1NVQkpFQ1RfQUxUKSwJIlYySV9TVUJKRUNUX0FMVCJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1YzX0FERFJfVkFMSURBVEVfUEFUSF9JTlRFUk5BTCksCSJWM19BRERSX1ZBTElEQVRFX1BBVEhfSU5URVJOQUwifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9WM19HRU5FUklDX0VYVEVOU0lPTiksCSJWM19HRU5FUklDX0VYVEVOU0lPTiJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1g1MDlWM19BREQxX0kyRCksCSJYNTA5VjNfYWRkMV9pMmQifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9YNTA5VjNfQUREX1ZBTFVFKSwJIlg1MDlWM19hZGRfdmFsdWUifSwKK3tFUlJfRlVOQyhYNTA5VjNfRl9YNTA5VjNfRVhUX0FERCksCSJYNTA5VjNfRVhUX2FkZCJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1g1MDlWM19FWFRfQUREX0FMSUFTKSwJIlg1MDlWM19FWFRfYWRkX2FsaWFzIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfWDUwOVYzX0VYVF9DT05GKSwJIlg1MDlWM19FWFRfY29uZiJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1g1MDlWM19FWFRfSTJEKSwJIlg1MDlWM19FWFRfaTJkIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfWDUwOVYzX0VYVF9OQ09ORiksCSJYNTA5VjNfRVhUX25jb25mIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfWDUwOVYzX0dFVF9TRUNUSU9OKSwJIlg1MDlWM19nZXRfc2VjdGlvbiJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1g1MDlWM19HRVRfU1RSSU5HKSwJIlg1MDlWM19nZXRfc3RyaW5nIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfWDUwOVYzX0dFVF9WQUxVRV9CT09MKSwJIlg1MDlWM19nZXRfdmFsdWVfYm9vbCJ9LAore0VSUl9GVU5DKFg1MDlWM19GX1g1MDlWM19QQVJTRV9MSVNUKSwJIlg1MDlWM19wYXJzZV9saXN0In0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfWDUwOV9QVVJQT1NFX0FERCksCSJYNTA5X1BVUlBPU0VfYWRkIn0sCit7RVJSX0ZVTkMoWDUwOVYzX0ZfWDUwOV9QVVJQT1NFX1NFVCksCSJYNTA5X1BVUlBPU0Vfc2V0In0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgWDUwOVYzX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oWDUwOVYzX1JfQkFEX0lQX0FERFJFU1MpICAgICAsImJhZCBpcCBhZGRyZXNzIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9CQURfT0JKRUNUKSAgICAgICAgICwiYmFkIG9iamVjdCJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfQk5fREVDMkJOX0VSUk9SKSAgICAsImJuIGRlYzJibiBlcnJvciJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfQk5fVE9fQVNOMV9JTlRFR0VSX0VSUk9SKSwiYm4gdG8gYXNuMSBpbnRlZ2VyIGVycm9yIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9ESVJOQU1FX0VSUk9SKSAgICAgICwiZGlybmFtZSBlcnJvciJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfRElTVFBPSU5UX0FMUkVBRFlfU0VUKSwiZGlzdHBvaW50IGFscmVhZHkgc2V0In0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9EVVBMSUNBVEVfWk9ORV9JRCkgICwiZHVwbGljYXRlIHpvbmUgaWQifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0VSUk9SX0NPTlZFUlRJTkdfWk9ORSksImVycm9yIGNvbnZlcnRpbmcgem9uZSJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfRVJST1JfQ1JFQVRJTkdfRVhURU5TSU9OKSwiZXJyb3IgY3JlYXRpbmcgZXh0ZW5zaW9uIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9FUlJPUl9JTl9FWFRFTlNJT04pICwiZXJyb3IgaW4gZXh0ZW5zaW9uIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9FWFBFQ1RFRF9BX1NFQ1RJT05fTkFNRSksImV4cGVjdGVkIGEgc2VjdGlvbiBuYW1lIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9FWFRFTlNJT05fRVhJU1RTKSAgICwiZXh0ZW5zaW9uIGV4aXN0cyJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfRVhURU5TSU9OX05BTUVfRVJST1IpLCJleHRlbnNpb24gbmFtZSBlcnJvciJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfRVhURU5TSU9OX05PVF9GT1VORCksImV4dGVuc2lvbiBub3QgZm91bmQifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0VYVEVOU0lPTl9TRVRUSU5HX05PVF9TVVBQT1JURUQpLCJleHRlbnNpb24gc2V0dGluZyBub3Qgc3VwcG9ydGVkIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9FWFRFTlNJT05fVkFMVUVfRVJST1IpLCJleHRlbnNpb24gdmFsdWUgZXJyb3IifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0lMTEVHQUxfRU1QVFlfRVhURU5TSU9OKSwiaWxsZWdhbCBlbXB0eSBleHRlbnNpb24ifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0lMTEVHQUxfSEVYX0RJR0lUKSAgLCJpbGxlZ2FsIGhleCBkaWdpdCJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfSU5DT1JSRUNUX1BPTElDWV9TWU5UQVhfVEFHKSwiaW5jb3JyZWN0IHBvbGljeSBzeW50YXggdGFnIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX01VTFRJUExFX1JETlMpLCJpbnZhbGlkIG11bHRpcGxlIHJkbnMifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0lOVkFMSURfQVNOVU1CRVIpICAgLCJpbnZhbGlkIGFzbnVtYmVyIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX0FTUkFOR0UpICAgICwiaW52YWxpZCBhc3JhbmdlIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX0JPT0xFQU5fU1RSSU5HKSwiaW52YWxpZCBib29sZWFuIHN0cmluZyJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfSU5WQUxJRF9FWFRFTlNJT05fU1RSSU5HKSwiaW52YWxpZCBleHRlbnNpb24gc3RyaW5nIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX0lOSEVSSVRBTkNFKSwiaW52YWxpZCBpbmhlcml0YW5jZSJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfSU5WQUxJRF9JUEFERFJFU1MpICAsImludmFsaWQgaXBhZGRyZXNzIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX05BTUUpICAgICAgICwiaW52YWxpZCBuYW1lIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQpLCJpbnZhbGlkIG51bGwgYXJndW1lbnQifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FKSAgLCJpbnZhbGlkIG51bGwgbmFtZSJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFKSAsImludmFsaWQgbnVsbCB2YWx1ZSJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVIpICAgICAsImludmFsaWQgbnVtYmVyIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX05VTUJFUlMpICAgICwiaW52YWxpZCBudW1iZXJzIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSKSwiaW52YWxpZCBvYmplY3QgaWRlbnRpZmllciJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfSU5WQUxJRF9PUFRJT04pICAgICAsImludmFsaWQgb3B0aW9uIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9JTlZBTElEX1BPTElDWV9JREVOVElGSUVSKSwiaW52YWxpZCBwb2xpY3kgaWRlbnRpZmllciJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfSU5WQUxJRF9QUk9YWV9QT0xJQ1lfU0VUVElORyksImludmFsaWQgcHJveHkgcG9saWN5IHNldHRpbmcifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0lOVkFMSURfUFVSUE9TRSkgICAgLCJpbnZhbGlkIHB1cnBvc2UifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0lOVkFMSURfU0FGSSkgICAgICAgLCJpbnZhbGlkIHNhZmkifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0lOVkFMSURfU0VDVElPTikgICAgLCJpbnZhbGlkIHNlY3Rpb24ifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX0lOVkFMSURfU1lOVEFYKSAgICAgLCJpbnZhbGlkIHN5bnRheCJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfSVNTVUVSX0RFQ09ERV9FUlJPUiksImlzc3VlciBkZWNvZGUgZXJyb3IifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX01JU1NJTkdfVkFMVUUpICAgICAgLCJtaXNzaW5nIHZhbHVlIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9ORUVEX09SR0FOSVpBVElPTl9BTkRfTlVNQkVSUyksIm5lZWQgb3JnYW5pemF0aW9uIGFuZCBudW1iZXJzIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9OT19DT05GSUdfREFUQUJBU0UpICwibm8gY29uZmlnIGRhdGFiYXNlIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9OT19JU1NVRVJfQ0VSVElGSUNBVEUpLCJubyBpc3N1ZXIgY2VydGlmaWNhdGUifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX05PX0lTU1VFUl9ERVRBSUxTKSAgLCJubyBpc3N1ZXIgZGV0YWlscyJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfTk9fUE9MSUNZX0lERU5USUZJRVIpLCJubyBwb2xpY3kgaWRlbnRpZmllciJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRCksIm5vIHByb3h5IGNlcnQgcG9saWN5IGxhbmd1YWdlIGRlZmluZWQifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX05PX1BVQkxJQ19LRVkpICAgICAgLCJubyBwdWJsaWMga2V5In0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9OT19TVUJKRUNUX0RFVEFJTFMpICwibm8gc3ViamVjdCBkZXRhaWxzIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9PRERfTlVNQkVSX09GX0RJR0lUUyksIm9kZCBudW1iZXIgb2YgZGlnaXRzIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9PUEVSQVRJT05fTk9UX0RFRklORUQpLCJvcGVyYXRpb24gbm90IGRlZmluZWQifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX09USEVSTkFNRV9FUlJPUikgICAgLCJvdGhlcm5hbWUgZXJyb3IifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX1BPTElDWV9MQU5HVUFHRV9BTFJFQURZX0RFRklORUQpLCJwb2xpY3kgbGFuZ3VhZ2UgYWxyZWFkeSBkZWZpbmVkIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEgpICwicG9saWN5IHBhdGggbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEhfQUxSRUFEWV9ERUZJTkVEKSwicG9saWN5IHBhdGggbGVuZ3RoIGFscmVhZHkgZGVmaW5lZCJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfUE9MSUNZX1NZTlRBWF9OT1RfQ1VSUkVOVExZX1NVUFBPUlRFRCksInBvbGljeSBzeW50YXggbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX1BPTElDWV9XSEVOX1BST1hZX0xBTkdVQUdFX1JFUVVJUkVTX05PX1BPTElDWSksInBvbGljeSB3aGVuIHByb3h5IGxhbmd1YWdlIHJlcXVpcmVzIG5vIHBvbGljeSJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQpICAsInNlY3Rpb24gbm90IGZvdW5kIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9ERVRBSUxTKSwidW5hYmxlIHRvIGdldCBpc3N1ZXIgZGV0YWlscyJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfVU5BQkxFX1RPX0dFVF9JU1NVRVJfS0VZSUQpLCJ1bmFibGUgdG8gZ2V0IGlzc3VlciBrZXlpZCJ9LAore0VSUl9SRUFTT04oWDUwOVYzX1JfVU5LTk9XTl9CSVRfU1RSSU5HX0FSR1VNRU5UKSwidW5rbm93biBiaXQgc3RyaW5nIGFyZ3VtZW50In0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9VTktOT1dOX0VYVEVOU0lPTikgICwidW5rbm93biBleHRlbnNpb24ifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OX05BTUUpLCJ1bmtub3duIGV4dGVuc2lvbiBuYW1lIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9VTktOT1dOX09QVElPTikgICAgICwidW5rbm93biBvcHRpb24ifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX1VOU1VQUE9SVEVEX09QVElPTikgLCJ1bnN1cHBvcnRlZCBvcHRpb24ifSwKK3tFUlJfUkVBU09OKFg1MDlWM19SX1VOU1VQUE9SVEVEX1RZUEUpICAgLCJ1bnN1cHBvcnRlZCB0eXBlIn0sCit7RVJSX1JFQVNPTihYNTA5VjNfUl9VU0VSX1RPT19MT05HKSAgICAgICwidXNlciB0b28gbG9uZyJ9LAorezAsTlVMTH0KKwl9OworCisjZW5kaWYKKwordm9pZCBFUlJfbG9hZF9YNTA5VjNfc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKworCWlmIChFUlJfZnVuY19lcnJvcl9zdHJpbmcoWDUwOVYzX3N0cl9mdW5jdHNbMF0uZXJyb3IpID09IE5VTEwpCisJCXsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLFg1MDlWM19zdHJfZnVuY3RzKTsKKwkJRVJSX2xvYWRfc3RyaW5ncygwLFg1MDlWM19zdHJfcmVhc29ucyk7CisJCX0KKyNlbmRpZgorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMvdjNwcmluLmMgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzcHJpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmYyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9jcnlwdG8veDUwOXYzL3YzcHJpbi5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qIHYzcHJpbi5jICovCisvKiBXcml0dGVuIGJ5IERyIFN0ZXBoZW4gTiBIZW5zb24gKHN0ZXZlQG9wZW5zc2wub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMTk5OS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCVg1MDkgKmNlcnQ7CisJRklMRSAqaW5mOworCWludCBpLCBjb3VudDsKKwlYNTA5X0VYVEVOU0lPTiAqZXh0OworCVg1MDlWM19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucygpOworCUVSUl9sb2FkX2NyeXB0b19zdHJpbmdzKCk7CisJaWYoIWFyZ3ZbMV0pIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZSB2M3ByaW4gY2VydC5wZW1cbiIpOworCQlleGl0KDEpOworCX0KKwlpZighKGluZiA9IGZvcGVuKGFyZ3ZbMV0sICJyIikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiAlc1xuIiwgYXJndlsxXSk7CisJCWV4aXQoMSk7CisJfQorCWlmKCEoY2VydCA9IFBFTV9yZWFkX1g1MDkoaW5mLCBOVUxMLCBOVUxMKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJDYW4ndCByZWFkIGNlcnRpZmljYXRlICVzXG4iLCBhcmd2WzFdKTsKKwkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCQlleGl0KDEpOworCX0KKwlmY2xvc2UoaW5mKTsKKwljb3VudCA9IFg1MDlfZ2V0X2V4dF9jb3VudChjZXJ0KTsKKwlwcmludGYoIiVkIGV4dGVuc2lvbnNcbiIsIGNvdW50KTsKKwlmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWV4dCA9IFg1MDlfZ2V0X2V4dChjZXJ0LCBpKTsKKwkJcHJpbnRmKCIlc1xuIiwgT0JKX25pZDJsbihPQkpfb2JqMm5pZChleHQtPm9iamVjdCkpKTsKKwkJaWYoIVg1MDlWM19FWFRfcHJpbnRfZnAoc3Rkb3V0LCBleHQsIDAsIDApKSBFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisJCXByaW50ZigiXG4iKTsKKwkJCisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvY3J5cHRvL3g1MDl2My94NTA5djMuaCBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMveDUwOXYzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwOGFiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94NTA5djMveDUwOXYzLmgKQEAgLTAsMCArMSwxMDA3IEBACisvKiB4NTA5djMuaCAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2lmbmRlZiBIRUFERVJfWDUwOVYzX0gKKyNkZWZpbmUgSEVBREVSX1g1MDlWM19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEZvcndhcmQgcmVmZXJlbmNlICovCitzdHJ1Y3QgdjNfZXh0X21ldGhvZDsKK3N0cnVjdCB2M19leHRfY3R4OworCisvKiBVc2VmdWwgdHlwZWRlZnMgKi8KKwordHlwZWRlZiB2b2lkICogKCpYNTA5VjNfRVhUX05FVykodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCpYNTA5VjNfRVhUX0ZSRUUpKHZvaWQgKik7Cit0eXBlZGVmIHZvaWQgKiAoKlg1MDlWM19FWFRfRDJJKSh2b2lkICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiogLCBsb25nKTsKK3R5cGVkZWYgaW50ICgqWDUwOVYzX0VYVF9JMkQpKHZvaWQgKiwgdW5zaWduZWQgY2hhciAqKik7Cit0eXBlZGVmIFNUQUNLX09GKENPTkZfVkFMVUUpICoKKyAgKCpYNTA5VjNfRVhUX0kyVikoY29uc3Qgc3RydWN0IHYzX2V4dF9tZXRob2QgKm1ldGhvZCwgdm9pZCAqZXh0LAorCQkgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmV4dGxpc3QpOwordHlwZWRlZiB2b2lkICogKCpYNTA5VjNfRVhUX1YySSkoY29uc3Qgc3RydWN0IHYzX2V4dF9tZXRob2QgKm1ldGhvZCwKKwkJCQkgc3RydWN0IHYzX2V4dF9jdHggKmN0eCwKKwkJCQkgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnZhbHVlcyk7Cit0eXBlZGVmIGNoYXIgKiAoKlg1MDlWM19FWFRfSTJTKShjb25zdCBzdHJ1Y3QgdjNfZXh0X21ldGhvZCAqbWV0aG9kLCB2b2lkICpleHQpOwordHlwZWRlZiB2b2lkICogKCpYNTA5VjNfRVhUX1MySSkoY29uc3Qgc3RydWN0IHYzX2V4dF9tZXRob2QgKm1ldGhvZCwKKwkJCQkgc3RydWN0IHYzX2V4dF9jdHggKmN0eCwgY29uc3QgY2hhciAqc3RyKTsKK3R5cGVkZWYgaW50ICgqWDUwOVYzX0VYVF9JMlIpKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsIHZvaWQgKmV4dCwKKwkJCSAgICAgIEJJTyAqb3V0LCBpbnQgaW5kZW50KTsKK3R5cGVkZWYgdm9pZCAqICgqWDUwOVYzX0VYVF9SMkkpKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsCisJCQkJIHN0cnVjdCB2M19leHRfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKnN0cik7CisKKy8qIFYzIGV4dGVuc2lvbiBzdHJ1Y3R1cmUgKi8KKworc3RydWN0IHYzX2V4dF9tZXRob2QgeworaW50IGV4dF9uaWQ7CitpbnQgZXh0X2ZsYWdzOworLyogSWYgdGhpcyBpcyBzZXQgdGhlIGZvbGxvd2luZyBmb3VyIGZpZWxkcyBhcmUgaWdub3JlZCAqLworQVNOMV9JVEVNX0VYUCAqaXQ7CisvKiBPbGQgc3R5bGUgQVNOMSBjYWxscyAqLworWDUwOVYzX0VYVF9ORVcgZXh0X25ldzsKK1g1MDlWM19FWFRfRlJFRSBleHRfZnJlZTsKK1g1MDlWM19FWFRfRDJJIGQyaTsKK1g1MDlWM19FWFRfSTJEIGkyZDsKKworLyogVGhlIGZvbGxvd2luZyBwYWlyIGlzIHVzZWQgZm9yIHN0cmluZyBleHRlbnNpb25zICovCitYNTA5VjNfRVhUX0kyUyBpMnM7CitYNTA5VjNfRVhUX1MySSBzMmk7CisKKy8qIFRoZSBmb2xsb3dpbmcgcGFpciBpcyB1c2VkIGZvciBtdWx0aS12YWx1ZWQgZXh0ZW5zaW9ucyAqLworWDUwOVYzX0VYVF9JMlYgaTJ2OworWDUwOVYzX0VYVF9WMkkgdjJpOworCisvKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciByYXcgZXh0ZW5zaW9ucyAqLworWDUwOVYzX0VYVF9JMlIgaTJyOworWDUwOVYzX0VYVF9SMkkgcjJpOworCit2b2lkICp1c3JfZGF0YTsJLyogQW55IGV4dGVuc2lvbiBzcGVjaWZpYyBkYXRhICovCit9OworCit0eXBlZGVmIHN0cnVjdCBYNTA5VjNfQ09ORl9NRVRIT0Rfc3QgeworY2hhciAqICgqZ2V0X3N0cmluZykodm9pZCAqZGIsIGNoYXIgKnNlY3Rpb24sIGNoYXIgKnZhbHVlKTsKK1NUQUNLX09GKENPTkZfVkFMVUUpICogKCpnZXRfc2VjdGlvbikodm9pZCAqZGIsIGNoYXIgKnNlY3Rpb24pOwordm9pZCAoKmZyZWVfc3RyaW5nKSh2b2lkICpkYiwgY2hhciAqIHN0cmluZyk7Cit2b2lkICgqZnJlZV9zZWN0aW9uKSh2b2lkICpkYiwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNlY3Rpb24pOworfSBYNTA5VjNfQ09ORl9NRVRIT0Q7CisKKy8qIENvbnRleHQgc3BlY2lmaWMgaW5mbyAqLworc3RydWN0IHYzX2V4dF9jdHggeworI2RlZmluZSBDVFhfVEVTVCAweDEKK2ludCBmbGFnczsKK1g1MDkgKmlzc3Vlcl9jZXJ0OworWDUwOSAqc3ViamVjdF9jZXJ0OworWDUwOV9SRVEgKnN1YmplY3RfcmVxOworWDUwOV9DUkwgKmNybDsKK1g1MDlWM19DT05GX01FVEhPRCAqZGJfbWV0aDsKK3ZvaWQgKmRiOworLyogTWF5YmUgbW9yZSBoZXJlICovCit9OworCit0eXBlZGVmIHN0cnVjdCB2M19leHRfbWV0aG9kIFg1MDlWM19FWFRfTUVUSE9EOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlWM19FWFRfTUVUSE9EKQorCisvKiBleHRfZmxhZ3MgdmFsdWVzICovCisjZGVmaW5lIFg1MDlWM19FWFRfRFlOQU1JQwkweDEKKyNkZWZpbmUgWDUwOVYzX0VYVF9DVFhfREVQCTB4MgorI2RlZmluZSBYNTA5VjNfRVhUX01VTFRJTElORQkweDQKKwordHlwZWRlZiBCSVRfU1RSSU5HX0JJVE5BTUUgRU5VTUVSQVRFRF9OQU1FUzsKKwordHlwZWRlZiBzdHJ1Y3QgQkFTSUNfQ09OU1RSQUlOVFNfc3QgeworaW50IGNhOworQVNOMV9JTlRFR0VSICpwYXRobGVuOworfSBCQVNJQ19DT05TVFJBSU5UUzsKKworCit0eXBlZGVmIHN0cnVjdCBQS0VZX1VTQUdFX1BFUklPRF9zdCB7CitBU04xX0dFTkVSQUxJWkVEVElNRSAqbm90QmVmb3JlOworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKm5vdEFmdGVyOworfSBQS0VZX1VTQUdFX1BFUklPRDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3RoZXJOYW1lX3N0IHsKK0FTTjFfT0JKRUNUICp0eXBlX2lkOworQVNOMV9UWVBFICp2YWx1ZTsKK30gT1RIRVJOQU1FOworCit0eXBlZGVmIHN0cnVjdCBFRElQYXJ0eU5hbWVfc3QgeworCUFTTjFfU1RSSU5HICpuYW1lQXNzaWduZXI7CisJQVNOMV9TVFJJTkcgKnBhcnR5TmFtZTsKK30gRURJUEFSVFlOQU1FOworCit0eXBlZGVmIHN0cnVjdCBHRU5FUkFMX05BTUVfc3QgeworCisjZGVmaW5lIEdFTl9PVEhFUk5BTUUJMAorI2RlZmluZSBHRU5fRU1BSUwJMQorI2RlZmluZSBHRU5fRE5TCQkyCisjZGVmaW5lIEdFTl9YNDAwCTMKKyNkZWZpbmUgR0VOX0RJUk5BTUUJNAorI2RlZmluZSBHRU5fRURJUEFSVFkJNQorI2RlZmluZSBHRU5fVVJJCQk2CisjZGVmaW5lIEdFTl9JUEFERAk3CisjZGVmaW5lIEdFTl9SSUQJCTgKKworaW50IHR5cGU7Cit1bmlvbiB7CisJY2hhciAqcHRyOworCU9USEVSTkFNRSAqb3RoZXJOYW1lOyAvKiBvdGhlck5hbWUgKi8KKwlBU04xX0lBNVNUUklORyAqcmZjODIyTmFtZTsKKwlBU04xX0lBNVNUUklORyAqZE5TTmFtZTsKKwlBU04xX1RZUEUgKng0MDBBZGRyZXNzOworCVg1MDlfTkFNRSAqZGlyZWN0b3J5TmFtZTsKKwlFRElQQVJUWU5BTUUgKmVkaVBhcnR5TmFtZTsKKwlBU04xX0lBNVNUUklORyAqdW5pZm9ybVJlc291cmNlSWRlbnRpZmllcjsKKwlBU04xX09DVEVUX1NUUklORyAqaVBBZGRyZXNzOworCUFTTjFfT0JKRUNUICpyZWdpc3RlcmVkSUQ7CisKKwkvKiBPbGQgbmFtZXMgKi8KKwlBU04xX09DVEVUX1NUUklORyAqaXA7IC8qIGlQQWRkcmVzcyAqLworCVg1MDlfTkFNRSAqZGlybjsJCS8qIGRpcm4gKi8KKwlBU04xX0lBNVNUUklORyAqaWE1Oy8qIHJmYzgyMk5hbWUsIGROU05hbWUsIHVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXIgKi8KKwlBU04xX09CSkVDVCAqcmlkOyAvKiByZWdpc3RlcmVkSUQgKi8KKwlBU04xX1RZUEUgKm90aGVyOyAvKiB4NDAwQWRkcmVzcyAqLworfSBkOworfSBHRU5FUkFMX05BTUU7CisKK3R5cGVkZWYgU1RBQ0tfT0YoR0VORVJBTF9OQU1FKSBHRU5FUkFMX05BTUVTOworCit0eXBlZGVmIHN0cnVjdCBBQ0NFU1NfREVTQ1JJUFRJT05fc3QgeworCUFTTjFfT0JKRUNUICptZXRob2Q7CisJR0VORVJBTF9OQU1FICpsb2NhdGlvbjsKK30gQUNDRVNTX0RFU0NSSVBUSU9OOworCit0eXBlZGVmIFNUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikgQVVUSE9SSVRZX0lORk9fQUNDRVNTOworCit0eXBlZGVmIFNUQUNLX09GKEFTTjFfT0JKRUNUKSBFWFRFTkRFRF9LRVlfVVNBR0U7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoR0VORVJBTF9OQU1FKQorREVDTEFSRV9BU04xX1NFVF9PRihHRU5FUkFMX05BTUUpCisKK0RFQ0xBUkVfU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKQorREVDTEFSRV9BU04xX1NFVF9PRihBQ0NFU1NfREVTQ1JJUFRJT04pCisKK3R5cGVkZWYgc3RydWN0IERJU1RfUE9JTlRfTkFNRV9zdCB7CitpbnQgdHlwZTsKK3VuaW9uIHsKKwlHRU5FUkFMX05BTUVTICpmdWxsbmFtZTsKKwlTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICpyZWxhdGl2ZW5hbWU7Cit9IG5hbWU7CisvKiBJZiByZWxhdGl2ZW5hbWUgdGhlbiB0aGlzIGNvbnRhaW5zIHRoZSBmdWxsIGRpc3RyaWJ1dGlvbiBwb2ludCBuYW1lICovCitYNTA5X05BTUUgKmRwbmFtZTsKK30gRElTVF9QT0lOVF9OQU1FOworLyogQWxsIGV4aXN0aW5nIHJlYXNvbnMgKi8KKyNkZWZpbmUgQ1JMRFBfQUxMX1JFQVNPTlMJMHg4MDdmCisKKyNkZWZpbmUgQ1JMX1JFQVNPTl9OT05FCQkJCS0xCisjZGVmaW5lIENSTF9SRUFTT05fVU5TUEVDSUZJRUQJCQkwCisjZGVmaW5lIENSTF9SRUFTT05fS0VZX0NPTVBST01JU0UJCTEKKyNkZWZpbmUgQ1JMX1JFQVNPTl9DQV9DT01QUk9NSVNFCQkyCisjZGVmaW5lIENSTF9SRUFTT05fQUZGSUxJQVRJT05fQ0hBTkdFRAkJMworI2RlZmluZSBDUkxfUkVBU09OX1NVUEVSU0VERUQJCQk0CisjZGVmaW5lIENSTF9SRUFTT05fQ0VTU0FUSU9OX09GX09QRVJBVElPTgk1CisjZGVmaW5lIENSTF9SRUFTT05fQ0VSVElGSUNBVEVfSE9MRAkJNgorI2RlZmluZSBDUkxfUkVBU09OX1JFTU9WRV9GUk9NX0NSTAkJOAorI2RlZmluZSBDUkxfUkVBU09OX1BSSVZJTEVHRV9XSVRIRFJBV04JCTkKKyNkZWZpbmUgQ1JMX1JFQVNPTl9BQV9DT01QUk9NSVNFCQkxMAorCitzdHJ1Y3QgRElTVF9QT0lOVF9zdCB7CitESVNUX1BPSU5UX05BTUUJKmRpc3Rwb2ludDsKK0FTTjFfQklUX1NUUklORyAqcmVhc29uczsKK0dFTkVSQUxfTkFNRVMgKkNSTGlzc3VlcjsKK2ludCBkcF9yZWFzb25zOworfTsKKwordHlwZWRlZiBTVEFDS19PRihESVNUX1BPSU5UKSBDUkxfRElTVF9QT0lOVFM7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoRElTVF9QT0lOVCkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoRElTVF9QT0lOVCkKKworc3RydWN0IEFVVEhPUklUWV9LRVlJRF9zdCB7CitBU04xX09DVEVUX1NUUklORyAqa2V5aWQ7CitHRU5FUkFMX05BTUVTICppc3N1ZXI7CitBU04xX0lOVEVHRVIgKnNlcmlhbDsKK307CisKKy8qIFN0cm9uZyBleHRyYW5ldCBzdHJ1Y3R1cmVzICovCisKK3R5cGVkZWYgc3RydWN0IFNYTkVUX0lEX3N0IHsKKwlBU04xX0lOVEVHRVIgKnpvbmU7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKnVzZXI7Cit9IFNYTkVUSUQ7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoU1hORVRJRCkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoU1hORVRJRCkKKwordHlwZWRlZiBzdHJ1Y3QgU1hORVRfc3QgeworCUFTTjFfSU5URUdFUiAqdmVyc2lvbjsKKwlTVEFDS19PRihTWE5FVElEKSAqaWRzOworfSBTWE5FVDsKKwordHlwZWRlZiBzdHJ1Y3QgTk9USUNFUkVGX3N0IHsKKwlBU04xX1NUUklORyAqb3JnYW5pemF0aW9uOworCVNUQUNLX09GKEFTTjFfSU5URUdFUikgKm5vdGljZW5vczsKK30gTk9USUNFUkVGOworCit0eXBlZGVmIHN0cnVjdCBVU0VSTk9USUNFX3N0IHsKKwlOT1RJQ0VSRUYgKm5vdGljZXJlZjsKKwlBU04xX1NUUklORyAqZXhwdGV4dDsKK30gVVNFUk5PVElDRTsKKwordHlwZWRlZiBzdHJ1Y3QgUE9MSUNZUVVBTElORk9fc3QgeworCUFTTjFfT0JKRUNUICpwcXVhbGlkOworCXVuaW9uIHsKKwkJQVNOMV9JQTVTVFJJTkcgKmNwc3VyaTsKKwkJVVNFUk5PVElDRSAqdXNlcm5vdGljZTsKKwkJQVNOMV9UWVBFICpvdGhlcjsKKwl9IGQ7Cit9IFBPTElDWVFVQUxJTkZPOworCitERUNMQVJFX1NUQUNLX09GKFBPTElDWVFVQUxJTkZPKQorREVDTEFSRV9BU04xX1NFVF9PRihQT0xJQ1lRVUFMSU5GTykKKwordHlwZWRlZiBzdHJ1Y3QgUE9MSUNZSU5GT19zdCB7CisJQVNOMV9PQkpFQ1QgKnBvbGljeWlkOworCVNUQUNLX09GKFBPTElDWVFVQUxJTkZPKSAqcXVhbGlmaWVyczsKK30gUE9MSUNZSU5GTzsKKwordHlwZWRlZiBTVEFDS19PRihQT0xJQ1lJTkZPKSBDRVJUSUZJQ0FURVBPTElDSUVTOworCitERUNMQVJFX1NUQUNLX09GKFBPTElDWUlORk8pCitERUNMQVJFX0FTTjFfU0VUX09GKFBPTElDWUlORk8pCisKK3R5cGVkZWYgc3RydWN0IFBPTElDWV9NQVBQSU5HX3N0IHsKKwlBU04xX09CSkVDVCAqaXNzdWVyRG9tYWluUG9saWN5OworCUFTTjFfT0JKRUNUICpzdWJqZWN0RG9tYWluUG9saWN5OworfSBQT0xJQ1lfTUFQUElORzsKKworREVDTEFSRV9TVEFDS19PRihQT0xJQ1lfTUFQUElORykKKwordHlwZWRlZiBTVEFDS19PRihQT0xJQ1lfTUFQUElORykgUE9MSUNZX01BUFBJTkdTOworCit0eXBlZGVmIHN0cnVjdCBHRU5FUkFMX1NVQlRSRUVfc3QgeworCUdFTkVSQUxfTkFNRSAqYmFzZTsKKwlBU04xX0lOVEVHRVIgKm1pbmltdW07CisJQVNOMV9JTlRFR0VSICptYXhpbXVtOworfSBHRU5FUkFMX1NVQlRSRUU7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKQorCitzdHJ1Y3QgTkFNRV9DT05TVFJBSU5UU19zdCB7CisJU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqcGVybWl0dGVkU3VidHJlZXM7CisJU1RBQ0tfT0YoR0VORVJBTF9TVUJUUkVFKSAqZXhjbHVkZWRTdWJ0cmVlczsKK307CisKK3R5cGVkZWYgc3RydWN0IFBPTElDWV9DT05TVFJBSU5UU19zdCB7CisJQVNOMV9JTlRFR0VSICpyZXF1aXJlRXhwbGljaXRQb2xpY3k7CisJQVNOMV9JTlRFR0VSICppbmhpYml0UG9saWN5TWFwcGluZzsKK30gUE9MSUNZX0NPTlNUUkFJTlRTOworCisvKiBQcm94eSBjZXJ0aWZpY2F0ZSBzdHJ1Y3R1cmVzLCBzZWUgUkZDIDM4MjAgKi8KK3R5cGVkZWYgc3RydWN0IFBST1hZX1BPTElDWV9zdAorCXsKKwlBU04xX09CSkVDVCAqcG9saWN5TGFuZ3VhZ2U7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKnBvbGljeTsKKwl9IFBST1hZX1BPTElDWTsKKwordHlwZWRlZiBzdHJ1Y3QgUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTl9zdAorCXsKKwlBU04xX0lOVEVHRVIgKnBjUGF0aExlbmd0aENvbnN0cmFpbnQ7CisJUFJPWFlfUE9MSUNZICpwcm94eVBvbGljeTsKKwl9IFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT047CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUFJPWFlfUE9MSUNZKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OKQorCitzdHJ1Y3QgSVNTVUlOR19ESVNUX1BPSU5UX3N0CisJeworCURJU1RfUE9JTlRfTkFNRSAqZGlzdHBvaW50OworCWludCBvbmx5dXNlcjsKKwlpbnQgb25seUNBOworCUFTTjFfQklUX1NUUklORyAqb25seXNvbWVyZWFzb25zOworCWludCBpbmRpcmVjdENSTDsKKwlpbnQgb25seWF0dHI7CisJfTsKKworLyogVmFsdWVzIGluIGlkcF9mbGFncyBmaWVsZCAqLworLyogSURQIHByZXNlbnQgKi8KKyNkZWZpbmUJSURQX1BSRVNFTlQJMHgxCisvKiBJRFAgdmFsdWVzIGluY29uc2lzdGVudCAqLworI2RlZmluZSBJRFBfSU5WQUxJRAkweDIKKy8qIG9ubHl1c2VyIHRydWUgKi8KKyNkZWZpbmUJSURQX09OTFlVU0VSCTB4NAorLyogb25seUNBIHRydWUgKi8KKyNkZWZpbmUJSURQX09OTFlDQQkweDgKKy8qIG9ubHlhdHRyIHRydWUgKi8KKyNkZWZpbmUgSURQX09OTFlBVFRSCTB4MTAKKy8qIGluZGlyZWN0Q1JMIHRydWUgKi8KKyNkZWZpbmUgSURQX0lORElSRUNUCTB4MjAKKy8qIG9ubHlzb21lcmVhc29ucyBwcmVzZW50ICovCisjZGVmaW5lIElEUF9SRUFTT05TCTB4NDAKKworI2RlZmluZSBYNTA5VjNfY29uZl9lcnIodmFsKSBFUlJfYWRkX2Vycm9yX2RhdGEoNiwgInNlY3Rpb246IiwgdmFsLT5zZWN0aW9uLCBcCisiLG5hbWU6IiwgdmFsLT5uYW1lLCAiLHZhbHVlOiIsIHZhbC0+dmFsdWUpOworCisjZGVmaW5lIFg1MDlWM19zZXRfY3R4X3Rlc3QoY3R4KSBcCisJCQlYNTA5VjNfc2V0X2N0eChjdHgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIENUWF9URVNUKQorI2RlZmluZSBYNTA5VjNfc2V0X2N0eF9ub2RiKGN0eCkgKGN0eCktPmRiID0gTlVMTDsKKworI2RlZmluZSBFWFRfQklUU1RSSU5HKG5pZCwgdGFibGUpIHsgbmlkLCAwLCBBU04xX0lURU1fcmVmKEFTTjFfQklUX1NUUklORyksIFwKKwkJCTAsMCwwLDAsIFwKKwkJCTAsMCwgXAorCQkJKFg1MDlWM19FWFRfSTJWKWkydl9BU04xX0JJVF9TVFJJTkcsIFwKKwkJCShYNTA5VjNfRVhUX1YySSl2MmlfQVNOMV9CSVRfU1RSSU5HLCBcCisJCQlOVUxMLCBOVUxMLCBcCisJCQl0YWJsZX0KKworI2RlZmluZSBFWFRfSUE1U1RSSU5HKG5pZCkgeyBuaWQsIDAsIEFTTjFfSVRFTV9yZWYoQVNOMV9JQTVTVFJJTkcpLCBcCisJCQkwLDAsMCwwLCBcCisJCQkoWDUwOVYzX0VYVF9JMlMpaTJzX0FTTjFfSUE1U1RSSU5HLCBcCisJCQkoWDUwOVYzX0VYVF9TMkkpczJpX0FTTjFfSUE1U1RSSU5HLCBcCisJCQkwLDAsMCwwLCBcCisJCQlOVUxMfQorCisjZGVmaW5lIEVYVF9FTkQgeyAtMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKworCisvKiBYNTA5X1BVUlBPU0Ugc3R1ZmYgKi8KKworI2RlZmluZSBFWEZMQUdfQkNPTlMJCTB4MQorI2RlZmluZSBFWEZMQUdfS1VTQUdFCQkweDIKKyNkZWZpbmUgRVhGTEFHX1hLVVNBR0UJCTB4NAorI2RlZmluZSBFWEZMQUdfTlNDRVJUCQkweDgKKworI2RlZmluZSBFWEZMQUdfQ0EJCTB4MTAKKy8qIFJlYWxseSBzZWxmIGlzc3VlZCBub3QgbmVjZXNzYXJpbHkgc2VsZiBzaWduZWQgKi8KKyNkZWZpbmUgRVhGTEFHX1NJCQkweDIwCisjZGVmaW5lIEVYRkxBR19TUwkJMHgyMAorI2RlZmluZSBFWEZMQUdfVjEJCTB4NDAKKyNkZWZpbmUgRVhGTEFHX0lOVkFMSUQJCTB4ODAKKyNkZWZpbmUgRVhGTEFHX1NFVAkJMHgxMDAKKyNkZWZpbmUgRVhGTEFHX0NSSVRJQ0FMCQkweDIwMAorI2RlZmluZSBFWEZMQUdfUFJPWFkJCTB4NDAwCisKKyNkZWZpbmUgRVhGTEFHX0lOVkFMSURfUE9MSUNZCTB4ODAwCisjZGVmaW5lIEVYRkxBR19GUkVTSEVTVAkJMHgxMDAwCisKKyNkZWZpbmUgS1VfRElHSVRBTF9TSUdOQVRVUkUJMHgwMDgwCisjZGVmaW5lIEtVX05PTl9SRVBVRElBVElPTgkweDAwNDAKKyNkZWZpbmUgS1VfS0VZX0VOQ0lQSEVSTUVOVAkweDAwMjAKKyNkZWZpbmUgS1VfREFUQV9FTkNJUEhFUk1FTlQJMHgwMDEwCisjZGVmaW5lIEtVX0tFWV9BR1JFRU1FTlQJMHgwMDA4CisjZGVmaW5lIEtVX0tFWV9DRVJUX1NJR04JMHgwMDA0CisjZGVmaW5lIEtVX0NSTF9TSUdOCQkweDAwMDIKKyNkZWZpbmUgS1VfRU5DSVBIRVJfT05MWQkweDAwMDEKKyNkZWZpbmUgS1VfREVDSVBIRVJfT05MWQkweDgwMDAKKworI2RlZmluZSBOU19TU0xfQ0xJRU5UCQkweDgwCisjZGVmaW5lIE5TX1NTTF9TRVJWRVIJCTB4NDAKKyNkZWZpbmUgTlNfU01JTUUJCTB4MjAKKyNkZWZpbmUgTlNfT0JKU0lHTgkJMHgxMAorI2RlZmluZSBOU19TU0xfQ0EJCTB4MDQKKyNkZWZpbmUgTlNfU01JTUVfQ0EJCTB4MDIKKyNkZWZpbmUgTlNfT0JKU0lHTl9DQQkJMHgwMQorI2RlZmluZSBOU19BTllfQ0EJCShOU19TU0xfQ0F8TlNfU01JTUVfQ0F8TlNfT0JKU0lHTl9DQSkKKworI2RlZmluZSBYS1VfU1NMX1NFUlZFUgkJMHgxCQorI2RlZmluZSBYS1VfU1NMX0NMSUVOVAkJMHgyCisjZGVmaW5lIFhLVV9TTUlNRQkJMHg0CisjZGVmaW5lIFhLVV9DT0RFX1NJR04JCTB4OAorI2RlZmluZSBYS1VfU0dDCQkJMHgxMAorI2RlZmluZSBYS1VfT0NTUF9TSUdOCQkweDIwCisjZGVmaW5lIFhLVV9USU1FU1RBTVAJCTB4NDAKKyNkZWZpbmUgWEtVX0RWQ1MJCTB4ODAKKworI2RlZmluZSBYNTA5X1BVUlBPU0VfRFlOQU1JQwkweDEKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX0RZTkFNSUNfTkFNRQkweDIKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9wdXJwb3NlX3N0IHsKKwlpbnQgcHVycG9zZTsKKwlpbnQgdHJ1c3Q7CQkvKiBEZWZhdWx0IHRydXN0IElEICovCisJaW50IGZsYWdzOworCWludCAoKmNoZWNrX3B1cnBvc2UpKGNvbnN0IHN0cnVjdCB4NTA5X3B1cnBvc2Vfc3QgKiwKKwkJCQljb25zdCBYNTA5ICosIGludCk7CisJY2hhciAqbmFtZTsKKwljaGFyICpzbmFtZTsKKwl2b2lkICp1c3JfZGF0YTsKK30gWDUwOV9QVVJQT1NFOworCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9TU0xfQ0xJRU5UCQkxCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9TU0xfU0VSVkVSCQkyCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9OU19TU0xfU0VSVkVSCTMKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX1NNSU1FX1NJR04JCTQKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX1NNSU1FX0VOQ1JZUFQJNQorI2RlZmluZSBYNTA5X1BVUlBPU0VfQ1JMX1NJR04JCTYKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX0FOWQkJNworI2RlZmluZSBYNTA5X1BVUlBPU0VfT0NTUF9IRUxQRVIJOAorI2RlZmluZSBYNTA5X1BVUlBPU0VfVElNRVNUQU1QX1NJR04JOQorCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9NSU4JCTEKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX01BWAkJOQorCisvKiBGbGFncyBmb3IgWDUwOVYzX0VYVF9wcmludCgpICovCisKKyNkZWZpbmUgWDUwOVYzX0VYVF9VTktOT1dOX01BU0sJCSgweGZMIDw8IDE2KQorLyogUmV0dXJuIGVycm9yIGZvciB1bmtub3duIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDUwOVYzX0VYVF9ERUZBVUxUCQkwCisvKiBQcmludCBlcnJvciBmb3IgdW5rbm93biBleHRlbnNpb25zICovCisjZGVmaW5lIFg1MDlWM19FWFRfRVJST1JfVU5LTk9XTgkoMUwgPDwgMTYpCisvKiBBU04xIHBhcnNlIHVua25vd24gZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYNTA5VjNfRVhUX1BBUlNFX1VOS05PV04JKDJMIDw8IDE2KQorLyogQklPX2R1bXAgdW5rbm93biBleHRlbnNpb25zICovCisjZGVmaW5lIFg1MDlWM19FWFRfRFVNUF9VTktOT1dOCQkoM0wgPDwgMTYpCisKKy8qIEZsYWdzIGZvciBYNTA5VjNfYWRkMV9pMmQgKi8KKworI2RlZmluZSBYNTA5VjNfQUREX09QX01BU0sJCTB4ZkwKKyNkZWZpbmUgWDUwOVYzX0FERF9ERUZBVUxUCQkwTAorI2RlZmluZSBYNTA5VjNfQUREX0FQUEVORAkJMUwKKyNkZWZpbmUgWDUwOVYzX0FERF9SRVBMQUNFCQkyTAorI2RlZmluZSBYNTA5VjNfQUREX1JFUExBQ0VfRVhJU1RJTkcJM0wKKyNkZWZpbmUgWDUwOVYzX0FERF9LRUVQX0VYSVNUSU5HCTRMCisjZGVmaW5lIFg1MDlWM19BRERfREVMRVRFCQk1TAorI2RlZmluZSBYNTA5VjNfQUREX1NJTEVOVAkJMHgxMAorCitERUNMQVJFX1NUQUNLX09GKFg1MDlfUFVSUE9TRSkKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhCQVNJQ19DT05TVFJBSU5UUykKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhTWE5FVCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoU1hORVRJRCkKKworaW50IFNYTkVUX2FkZF9pZF9hc2MoU1hORVQgKipwc3gsIGNoYXIgKnpvbmUsIGNoYXIgKnVzZXIsIGludCB1c2VybGVuKTsgCitpbnQgU1hORVRfYWRkX2lkX3Vsb25nKFNYTkVUICoqcHN4LCB1bnNpZ25lZCBsb25nIGx6b25lLCBjaGFyICp1c2VyLCBpbnQgdXNlcmxlbik7IAoraW50IFNYTkVUX2FkZF9pZF9JTlRFR0VSKFNYTkVUICoqcHN4LCBBU04xX0lOVEVHRVIgKml6b25lLCBjaGFyICp1c2VyLCBpbnQgdXNlcmxlbik7IAorCitBU04xX09DVEVUX1NUUklORyAqU1hORVRfZ2V0X2lkX2FzYyhTWE5FVCAqc3gsIGNoYXIgKnpvbmUpOworQVNOMV9PQ1RFVF9TVFJJTkcgKlNYTkVUX2dldF9pZF91bG9uZyhTWE5FVCAqc3gsIHVuc2lnbmVkIGxvbmcgbHpvbmUpOworQVNOMV9PQ1RFVF9TVFJJTkcgKlNYTkVUX2dldF9pZF9JTlRFR0VSKFNYTkVUICpzeCwgQVNOMV9JTlRFR0VSICp6b25lKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBVVRIT1JJVFlfS0VZSUQpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtFWV9VU0FHRV9QRVJJT0QpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoR0VORVJBTF9OQU1FKQorR0VORVJBTF9OQU1FICpHRU5FUkFMX05BTUVfZHVwKEdFTkVSQUxfTkFNRSAqYSk7CitpbnQgR0VORVJBTF9OQU1FX2NtcChHRU5FUkFMX05BTUUgKmEsIEdFTkVSQUxfTkFNRSAqYik7CisKKworCitBU04xX0JJVF9TVFJJTkcgKnYyaV9BU04xX0JJVF9TVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCQlYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKK1NUQUNLX09GKENPTkZfVkFMVUUpICppMnZfQVNOMV9CSVRfU1RSSU5HKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJQVNOMV9CSVRfU1RSSU5HICpiaXRzLAorCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICpleHRsaXN0KTsKKworU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKmkydl9HRU5FUkFMX05BTUUoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgR0VORVJBTF9OQU1FICpnZW4sIFNUQUNLX09GKENPTkZfVkFMVUUpICpyZXQpOworaW50IEdFTkVSQUxfTkFNRV9wcmludChCSU8gKm91dCwgR0VORVJBTF9OQU1FICpnZW4pOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEdFTkVSQUxfTkFNRVMpCisKK1NUQUNLX09GKENPTkZfVkFMVUUpICppMnZfR0VORVJBTF9OQU1FUyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQlHRU5FUkFMX05BTUVTICpnZW4sIFNUQUNLX09GKENPTkZfVkFMVUUpICpleHRsaXN0KTsKK0dFTkVSQUxfTkFNRVMgKnYyaV9HRU5FUkFMX05BTUVTKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKm52YWwpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9USEVSTkFNRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoRURJUEFSVFlOQU1FKQoraW50IE9USEVSTkFNRV9jbXAoT1RIRVJOQU1FICphLCBPVEhFUk5BTUUgKmIpOwordm9pZCBHRU5FUkFMX05BTUVfc2V0MF92YWx1ZShHRU5FUkFMX05BTUUgKmEsIGludCB0eXBlLCB2b2lkICp2YWx1ZSk7Cit2b2lkICpHRU5FUkFMX05BTUVfZ2V0MF92YWx1ZShHRU5FUkFMX05BTUUgKmEsIGludCAqcHR5cGUpOworaW50IEdFTkVSQUxfTkFNRV9zZXQwX290aGVybmFtZShHRU5FUkFMX05BTUUgKmdlbiwKKwkJCQlBU04xX09CSkVDVCAqb2lkLCBBU04xX1RZUEUgKnZhbHVlKTsKK2ludCBHRU5FUkFMX05BTUVfZ2V0MF9vdGhlck5hbWUoR0VORVJBTF9OQU1FICpnZW4sIAorCQkJCUFTTjFfT0JKRUNUICoqcG9pZCwgQVNOMV9UWVBFICoqcHZhbHVlKTsKKworY2hhciAqaTJzX0FTTjFfT0NURVRfU1RSSU5HKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIEFTTjFfT0NURVRfU1RSSU5HICppYTUpOworQVNOMV9PQ1RFVF9TVFJJTkcgKnMyaV9BU04xX09DVEVUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoRVhURU5ERURfS0VZX1VTQUdFKQoraW50IGkyYV9BQ0NFU1NfREVTQ1JJUFRJT04oQklPICpicCwgQUNDRVNTX0RFU0NSSVBUSU9OKiBhKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhDRVJUSUZJQ0FURVBPTElDSUVTKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQT0xJQ1lJTkZPKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQT0xJQ1lRVUFMSU5GTykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoVVNFUk5PVElDRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoTk9USUNFUkVGKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKENSTF9ESVNUX1BPSU5UUykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoRElTVF9QT0lOVCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoRElTVF9QT0lOVF9OQU1FKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhJU1NVSU5HX0RJU1RfUE9JTlQpCisKK2ludCBESVNUX1BPSU5UX3NldF9kcG5hbWUoRElTVF9QT0lOVF9OQU1FICpkcG4sIFg1MDlfTkFNRSAqaW5hbWUpOworCitpbnQgTkFNRV9DT05TVFJBSU5UU19jaGVjayhYNTA5ICp4LCBOQU1FX0NPTlNUUkFJTlRTICpuYyk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQUNDRVNTX0RFU0NSSVBUSU9OKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBVVRIT1JJVFlfSU5GT19BQ0NFU1MpCisKK0RFQ0xBUkVfQVNOMV9JVEVNKFBPTElDWV9NQVBQSU5HKQorREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OUyhQT0xJQ1lfTUFQUElORykKK0RFQ0xBUkVfQVNOMV9JVEVNKFBPTElDWV9NQVBQSU5HUykKKworREVDTEFSRV9BU04xX0lURU0oR0VORVJBTF9TVUJUUkVFKQorREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OUyhHRU5FUkFMX1NVQlRSRUUpCisKK0RFQ0xBUkVfQVNOMV9JVEVNKE5BTUVfQ09OU1RSQUlOVFMpCitERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TKE5BTUVfQ09OU1RSQUlOVFMpCisKK0RFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlMoUE9MSUNZX0NPTlNUUkFJTlRTKQorREVDTEFSRV9BU04xX0lURU0oUE9MSUNZX0NPTlNUUkFJTlRTKQorCitHRU5FUkFMX05BTUUgKmEyaV9HRU5FUkFMX05BTUUoR0VORVJBTF9OQU1FICpvdXQsCisJCQkgICAgICAgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgICAgIGludCBnZW5fdHlwZSwgY2hhciAqdmFsdWUsIGludCBpc19uYyk7CisKKyNpZmRlZiBIRUFERVJfQ09ORl9ICitHRU5FUkFMX05BTUUgKnYyaV9HRU5FUkFMX05BTUUoY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgICAgIENPTkZfVkFMVUUgKmNuZik7CitHRU5FUkFMX05BTUUgKnYyaV9HRU5FUkFMX05BTUVfZXgoR0VORVJBTF9OQU1FICpvdXQsCisJCQkJICBjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSAgWDUwOVYzX0NUWCAqY3R4LCBDT05GX1ZBTFVFICpjbmYsIGludCBpc19uYyk7Cit2b2lkIFg1MDlWM19jb25mX2ZyZWUoQ09ORl9WQUxVRSAqdmFsKTsKKworWDUwOV9FWFRFTlNJT04gKlg1MDlWM19FWFRfbmNvbmZfbmlkKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgaW50IGV4dF9uaWQsIGNoYXIgKnZhbHVlKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5VjNfRVhUX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOworaW50IFg1MDlWM19FWFRfYWRkX25jb25mX3NrKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICoqc2spOworaW50IFg1MDlWM19FWFRfYWRkX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwgWDUwOSAqY2VydCk7CitpbnQgWDUwOVYzX0VYVF9SRVFfYWRkX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwgWDUwOV9SRVEgKnJlcSk7CitpbnQgWDUwOVYzX0VYVF9DUkxfYWRkX25jb25mKENPTkYgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbiwgWDUwOV9DUkwgKmNybCk7CisKK1g1MDlfRVhURU5TSU9OICpYNTA5VjNfRVhUX2NvbmZfbmlkKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkJICAgIGludCBleHRfbmlkLCBjaGFyICp2YWx1ZSk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9jb25mKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkJY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOworaW50IFg1MDlWM19FWFRfYWRkX2NvbmYoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwKKwkJCWNoYXIgKnNlY3Rpb24sIFg1MDkgKmNlcnQpOworaW50IFg1MDlWM19FWFRfUkVRX2FkZF9jb25mKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkgICAgY2hhciAqc2VjdGlvbiwgWDUwOV9SRVEgKnJlcSk7CitpbnQgWDUwOVYzX0VYVF9DUkxfYWRkX2NvbmYoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICBjaGFyICpzZWN0aW9uLCBYNTA5X0NSTCAqY3JsKTsKKworaW50IFg1MDlWM19hZGRfdmFsdWVfYm9vbF9uZihjaGFyICpuYW1lLCBpbnQgYXNuMV9ib29sLAorCQkJICAgICBTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworaW50IFg1MDlWM19nZXRfdmFsdWVfYm9vbChDT05GX1ZBTFVFICp2YWx1ZSwgaW50ICphc24xX2Jvb2wpOworaW50IFg1MDlWM19nZXRfdmFsdWVfaW50KENPTkZfVkFMVUUgKnZhbHVlLCBBU04xX0lOVEVHRVIgKiphaW50KTsKK3ZvaWQgWDUwOVYzX3NldF9uY29uZihYNTA5VjNfQ1RYICpjdHgsIENPTkYgKmNvbmYpOwordm9pZCBYNTA5VjNfc2V0X2NvbmZfbGhhc2goWDUwOVYzX0NUWCAqY3R4LCBMSEFTSF9PRihDT05GX1ZBTFVFKSAqbGhhc2gpOworI2VuZGlmCisKK2NoYXIgKiBYNTA5VjNfZ2V0X3N0cmluZyhYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKm5hbWUsIGNoYXIgKnNlY3Rpb24pOworU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKiBYNTA5VjNfZ2V0X3NlY3Rpb24oWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzZWN0aW9uKTsKK3ZvaWQgWDUwOVYzX3N0cmluZ19mcmVlKFg1MDlWM19DVFggKmN0eCwgY2hhciAqc3RyKTsKK3ZvaWQgWDUwOVYzX3NlY3Rpb25fZnJlZSggWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqc2VjdGlvbik7Cit2b2lkIFg1MDlWM19zZXRfY3R4KFg1MDlWM19DVFggKmN0eCwgWDUwOSAqaXNzdWVyLCBYNTA5ICpzdWJqZWN0LAorCQkJCSBYNTA5X1JFUSAqcmVxLCBYNTA5X0NSTCAqY3JsLCBpbnQgZmxhZ3MpOworCitpbnQgWDUwOVYzX2FkZF92YWx1ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwKKwkJCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICoqZXh0bGlzdCk7CitpbnQgWDUwOVYzX2FkZF92YWx1ZV91Y2hhcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICp2YWx1ZSwKKwkJCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICoqZXh0bGlzdCk7CitpbnQgWDUwOVYzX2FkZF92YWx1ZV9ib29sKGNvbnN0IGNoYXIgKm5hbWUsIGludCBhc24xX2Jvb2wsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworaW50IFg1MDlWM19hZGRfdmFsdWVfaW50KGNvbnN0IGNoYXIgKm5hbWUsIEFTTjFfSU5URUdFUiAqYWludCwKKwkJCQkJCVNUQUNLX09GKENPTkZfVkFMVUUpICoqZXh0bGlzdCk7CitjaGFyICogaTJzX0FTTjFfSU5URUdFUihYNTA5VjNfRVhUX01FVEhPRCAqbWV0aCwgQVNOMV9JTlRFR0VSICphaW50KTsKK0FTTjFfSU5URUdFUiAqIHMyaV9BU04xX0lOVEVHRVIoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGgsIGNoYXIgKnZhbHVlKTsKK2NoYXIgKiBpMnNfQVNOMV9FTlVNRVJBVEVEKFg1MDlWM19FWFRfTUVUSE9EICptZXRoLCBBU04xX0VOVU1FUkFURUQgKmFpbnQpOworY2hhciAqIGkyc19BU04xX0VOVU1FUkFURURfVEFCTEUoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGgsIEFTTjFfRU5VTUVSQVRFRCAqYWludCk7CitpbnQgWDUwOVYzX0VYVF9hZGQoWDUwOVYzX0VYVF9NRVRIT0QgKmV4dCk7CitpbnQgWDUwOVYzX0VYVF9hZGRfbGlzdChYNTA5VjNfRVhUX01FVEhPRCAqZXh0bGlzdCk7CitpbnQgWDUwOVYzX0VYVF9hZGRfYWxpYXMoaW50IG5pZF90bywgaW50IG5pZF9mcm9tKTsKK3ZvaWQgWDUwOVYzX0VYVF9jbGVhbnVwKHZvaWQpOworCitjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqWDUwOVYzX0VYVF9nZXQoWDUwOV9FWFRFTlNJT04gKmV4dCk7Citjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqWDUwOVYzX0VYVF9nZXRfbmlkKGludCBuaWQpOworaW50IFg1MDlWM19hZGRfc3RhbmRhcmRfZXh0ZW5zaW9ucyh2b2lkKTsKK1NUQUNLX09GKENPTkZfVkFMVUUpICpYNTA5VjNfcGFyc2VfbGlzdChjb25zdCBjaGFyICpsaW5lKTsKK3ZvaWQgKlg1MDlWM19FWFRfZDJpKFg1MDlfRVhURU5TSU9OICpleHQpOwordm9pZCAqWDUwOVYzX2dldF9kMmkoU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4LCBpbnQgbmlkLCBpbnQgKmNyaXQsIGludCAqaWR4KTsKKworCitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9pMmQoaW50IGV4dF9uaWQsIGludCBjcml0LCB2b2lkICpleHRfc3RydWMpOworaW50IFg1MDlWM19hZGQxX2kyZChTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKip4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitjaGFyICpoZXhfdG9fc3RyaW5nKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgbG9uZyBsZW4pOwordW5zaWduZWQgY2hhciAqc3RyaW5nX3RvX2hleChjb25zdCBjaGFyICpzdHIsIGxvbmcgKmxlbik7CitpbnQgbmFtZV9jbXAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqY21wKTsKKwordm9pZCBYNTA5VjNfRVhUX3ZhbF9wcm4oQklPICpvdXQsIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWwsIGludCBpbmRlbnQsCisJCQkJCQkJCSBpbnQgbWwpOworaW50IFg1MDlWM19FWFRfcHJpbnQoQklPICpvdXQsIFg1MDlfRVhURU5TSU9OICpleHQsIHVuc2lnbmVkIGxvbmcgZmxhZywgaW50IGluZGVudCk7CitpbnQgWDUwOVYzX0VYVF9wcmludF9mcChGSUxFICpvdXQsIFg1MDlfRVhURU5TSU9OICpleHQsIGludCBmbGFnLCBpbnQgaW5kZW50KTsKKworaW50IFg1MDlWM19leHRlbnNpb25zX3ByaW50KEJJTyAqb3V0LCBjaGFyICp0aXRsZSwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRzLCB1bnNpZ25lZCBsb25nIGZsYWcsIGludCBpbmRlbnQpOworCitpbnQgWDUwOV9jaGVja19jYShYNTA5ICp4KTsKK2ludCBYNTA5X2NoZWNrX3B1cnBvc2UoWDUwOSAqeCwgaW50IGlkLCBpbnQgY2EpOworaW50IFg1MDlfc3VwcG9ydGVkX2V4dGVuc2lvbihYNTA5X0VYVEVOU0lPTiAqZXgpOworaW50IFg1MDlfUFVSUE9TRV9zZXQoaW50ICpwLCBpbnQgcHVycG9zZSk7CitpbnQgWDUwOV9jaGVja19pc3N1ZWQoWDUwOSAqaXNzdWVyLCBYNTA5ICpzdWJqZWN0KTsKK2ludCBYNTA5X2NoZWNrX2FraWQoWDUwOSAqaXNzdWVyLCBBVVRIT1JJVFlfS0VZSUQgKmFraWQpOworaW50IFg1MDlfUFVSUE9TRV9nZXRfY291bnQodm9pZCk7CitYNTA5X1BVUlBPU0UgKiBYNTA5X1BVUlBPU0VfZ2V0MChpbnQgaWR4KTsKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2J5X3NuYW1lKGNoYXIgKnNuYW1lKTsKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2J5X2lkKGludCBpZCk7CitpbnQgWDUwOV9QVVJQT1NFX2FkZChpbnQgaWQsIGludCB0cnVzdCwgaW50IGZsYWdzLAorCQkJaW50ICgqY2spKGNvbnN0IFg1MDlfUFVSUE9TRSAqLCBjb25zdCBYNTA5ICosIGludCksCisJCQkJY2hhciAqbmFtZSwgY2hhciAqc25hbWUsIHZvaWQgKmFyZyk7CitjaGFyICpYNTA5X1BVUlBPU0VfZ2V0MF9uYW1lKFg1MDlfUFVSUE9TRSAqeHApOworY2hhciAqWDUwOV9QVVJQT1NFX2dldDBfc25hbWUoWDUwOV9QVVJQT1NFICp4cCk7CitpbnQgWDUwOV9QVVJQT1NFX2dldF90cnVzdChYNTA5X1BVUlBPU0UgKnhwKTsKK3ZvaWQgWDUwOV9QVVJQT1NFX2NsZWFudXAodm9pZCk7CitpbnQgWDUwOV9QVVJQT1NFX2dldF9pZChYNTA5X1BVUlBPU0UgKik7CisKK1NUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqWDUwOV9nZXQxX2VtYWlsKFg1MDkgKngpOworU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpYNTA5X1JFUV9nZXQxX2VtYWlsKFg1MDlfUkVRICp4KTsKK3ZvaWQgWDUwOV9lbWFpbF9mcmVlKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqc2spOworU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICpYNTA5X2dldDFfb2NzcChYNTA5ICp4KTsKKworQVNOMV9PQ1RFVF9TVFJJTkcgKmEyaV9JUEFERFJFU1MoY29uc3QgY2hhciAqaXBhc2MpOworQVNOMV9PQ1RFVF9TVFJJTkcgKmEyaV9JUEFERFJFU1NfTkMoY29uc3QgY2hhciAqaXBhc2MpOworaW50IGEyaV9pcGFkZCh1bnNpZ25lZCBjaGFyICppcG91dCwgY29uc3QgY2hhciAqaXBhc2MpOworaW50IFg1MDlWM19OQU1FX2Zyb21fc2VjdGlvbihYNTA5X05BTUUgKm5tLCBTVEFDS19PRihDT05GX1ZBTFVFKSpkbl9zaywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgY2h0eXBlKTsKKwordm9pZCBYNTA5X1BPTElDWV9OT0RFX3ByaW50KEJJTyAqb3V0LCBYNTA5X1BPTElDWV9OT0RFICpub2RlLCBpbnQgaW5kZW50KTsKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9QT0xJQ1lfTk9ERSkKKworI2lmbmRlZiBPUEVOU1NMX05PX1JGQzM3NzkKKwordHlwZWRlZiBzdHJ1Y3QgQVNSYW5nZV9zdCB7CisgIEFTTjFfSU5URUdFUiAqbWluLCAqbWF4OworfSBBU1JhbmdlOworCisjZGVmaW5lCUFTSWRPclJhbmdlX2lkCQkwCisjZGVmaW5lCUFTSWRPclJhbmdlX3JhbmdlCTEKKwordHlwZWRlZiBzdHJ1Y3QgQVNJZE9yUmFuZ2Vfc3QgeworICBpbnQgdHlwZTsKKyAgdW5pb24geworICAgIEFTTjFfSU5URUdFUiAqaWQ7CisgICAgQVNSYW5nZSAgICAgICpyYW5nZTsKKyAgfSB1OworfSBBU0lkT3JSYW5nZTsKKwordHlwZWRlZiBTVEFDS19PRihBU0lkT3JSYW5nZSkgQVNJZE9yUmFuZ2VzOworREVDTEFSRV9TVEFDS19PRihBU0lkT3JSYW5nZSkKKworI2RlZmluZQlBU0lkZW50aWZpZXJDaG9pY2VfaW5oZXJpdAkJMAorI2RlZmluZQlBU0lkZW50aWZpZXJDaG9pY2VfYXNJZHNPclJhbmdlcwkxCisKK3R5cGVkZWYgc3RydWN0IEFTSWRlbnRpZmllckNob2ljZV9zdCB7CisgIGludCB0eXBlOworICB1bmlvbiB7CisgICAgQVNOMV9OVUxMICAgICppbmhlcml0OworICAgIEFTSWRPclJhbmdlcyAqYXNJZHNPclJhbmdlczsKKyAgfSB1OworfSBBU0lkZW50aWZpZXJDaG9pY2U7CisKK3R5cGVkZWYgc3RydWN0IEFTSWRlbnRpZmllcnNfc3QgeworICBBU0lkZW50aWZpZXJDaG9pY2UgKmFzbnVtLCAqcmRpOworfSBBU0lkZW50aWZpZXJzOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTUmFuZ2UpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTSWRPclJhbmdlKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU0lkZW50aWZpZXJDaG9pY2UpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTSWRlbnRpZmllcnMpCisKKwordHlwZWRlZiBzdHJ1Y3QgSVBBZGRyZXNzUmFuZ2Vfc3QgeworICBBU04xX0JJVF9TVFJJTkcJKm1pbiwgKm1heDsKK30gSVBBZGRyZXNzUmFuZ2U7CisKKyNkZWZpbmUJSVBBZGRyZXNzT3JSYW5nZV9hZGRyZXNzUHJlZml4CTAKKyNkZWZpbmUJSVBBZGRyZXNzT3JSYW5nZV9hZGRyZXNzUmFuZ2UJMQorCit0eXBlZGVmIHN0cnVjdCBJUEFkZHJlc3NPclJhbmdlX3N0IHsKKyAgaW50IHR5cGU7CisgIHVuaW9uIHsKKyAgICBBU04xX0JJVF9TVFJJTkcJKmFkZHJlc3NQcmVmaXg7CisgICAgSVBBZGRyZXNzUmFuZ2UJKmFkZHJlc3NSYW5nZTsKKyAgfSB1OworfSBJUEFkZHJlc3NPclJhbmdlOworCit0eXBlZGVmIFNUQUNLX09GKElQQWRkcmVzc09yUmFuZ2UpIElQQWRkcmVzc09yUmFuZ2VzOworREVDTEFSRV9TVEFDS19PRihJUEFkZHJlc3NPclJhbmdlKQorCisjZGVmaW5lCUlQQWRkcmVzc0Nob2ljZV9pbmhlcml0CQkJMAorI2RlZmluZQlJUEFkZHJlc3NDaG9pY2VfYWRkcmVzc2VzT3JSYW5nZXMJMQorCit0eXBlZGVmIHN0cnVjdCBJUEFkZHJlc3NDaG9pY2Vfc3QgeworICBpbnQgdHlwZTsKKyAgdW5pb24geworICAgIEFTTjFfTlVMTAkJKmluaGVyaXQ7CisgICAgSVBBZGRyZXNzT3JSYW5nZXMJKmFkZHJlc3Nlc09yUmFuZ2VzOworICB9IHU7Cit9IElQQWRkcmVzc0Nob2ljZTsKKwordHlwZWRlZiBzdHJ1Y3QgSVBBZGRyZXNzRmFtaWx5X3N0IHsKKyAgQVNOMV9PQ1RFVF9TVFJJTkcJKmFkZHJlc3NGYW1pbHk7CisgIElQQWRkcmVzc0Nob2ljZQkqaXBBZGRyZXNzQ2hvaWNlOworfSBJUEFkZHJlc3NGYW1pbHk7CisKK3R5cGVkZWYgU1RBQ0tfT0YoSVBBZGRyZXNzRmFtaWx5KSBJUEFkZHJCbG9ja3M7CitERUNMQVJFX1NUQUNLX09GKElQQWRkcmVzc0ZhbWlseSkKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhJUEFkZHJlc3NSYW5nZSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoSVBBZGRyZXNzT3JSYW5nZSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoSVBBZGRyZXNzQ2hvaWNlKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhJUEFkZHJlc3NGYW1pbHkpCisKKy8qCisgKiBBUEkgdGFnIGZvciBlbGVtZW50cyBvZiB0aGUgQVNJZGVudGlmZXIgU0VRVUVOQ0UuCisgKi8KKyNkZWZpbmUJVjNfQVNJRF9BU05VTQkwCisjZGVmaW5lCVYzX0FTSURfUkRJCTEKKworLyoKKyAqIEFGSSB2YWx1ZXMsIGFzc2lnbmVkIGJ5IElBTkEuICBJdCdkIGJlIG5pY2UgdG8gbWFrZSB0aGUgQUZJCisgKiBoYW5kbGluZyBjb2RlIHRvdGFsbHkgZ2VuZXJpYywgYnV0IHRoZXJlIGFyZSB0b28gbWFueSBsaXR0bGUgdGhpbmdzCisgKiB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgZGVmaW5lZCBmb3Igb3RoZXIgYWRkcmVzcyBmYW1pbGllcyBmb3IgaXQgdG8KKyAqIGJlIHdvcnRoIHRoZSB0cm91YmxlLgorICovCisjZGVmaW5lCUlBTkFfQUZJX0lQVjQJMQorI2RlZmluZQlJQU5BX0FGSV9JUFY2CTIKKworLyoKKyAqIFV0aWxpdGllcyB0byBjb25zdHJ1Y3QgYW5kIGV4dHJhY3QgdmFsdWVzIGZyb20gUkZDMzc3OSBleHRlbnNpb25zLAorICogc2luY2Ugc29tZSBvZiB0aGUgZW5jb2RpbmdzIChwYXJ0aWN1bGFybHkgZm9yIElQIGFkZHJlc3MgcHJlZml4ZXMKKyAqIGFuZCByYW5nZXMpIGFyZSBhIGJpdCB0ZWRpb3VzIHRvIHdvcmsgd2l0aCBkaXJlY3RseS4KKyAqLworaW50IHYzX2FzaWRfYWRkX2luaGVyaXQoQVNJZGVudGlmaWVycyAqYXNpZCwgaW50IHdoaWNoKTsKK2ludCB2M19hc2lkX2FkZF9pZF9vcl9yYW5nZShBU0lkZW50aWZpZXJzICphc2lkLCBpbnQgd2hpY2gsCisJCQkgICAgQVNOMV9JTlRFR0VSICptaW4sIEFTTjFfSU5URUdFUiAqbWF4KTsKK2ludCB2M19hZGRyX2FkZF9pbmhlcml0KElQQWRkckJsb2NrcyAqYWRkciwKKwkJCWNvbnN0IHVuc2lnbmVkIGFmaSwgY29uc3QgdW5zaWduZWQgKnNhZmkpOworaW50IHYzX2FkZHJfYWRkX3ByZWZpeChJUEFkZHJCbG9ja3MgKmFkZHIsCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBhZmksIGNvbnN0IHVuc2lnbmVkICpzYWZpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqYSwgY29uc3QgaW50IHByZWZpeGxlbik7CitpbnQgdjNfYWRkcl9hZGRfcmFuZ2UoSVBBZGRyQmxvY2tzICphZGRyLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBhZmksIGNvbnN0IHVuc2lnbmVkICpzYWZpLAorCQkgICAgICB1bnNpZ25lZCBjaGFyICptaW4sIHVuc2lnbmVkIGNoYXIgKm1heCk7Cit1bnNpZ25lZCB2M19hZGRyX2dldF9hZmkoY29uc3QgSVBBZGRyZXNzRmFtaWx5ICpmKTsKK2ludCB2M19hZGRyX2dldF9yYW5nZShJUEFkZHJlc3NPclJhbmdlICphb3IsIGNvbnN0IHVuc2lnbmVkIGFmaSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbWluLCB1bnNpZ25lZCBjaGFyICptYXgsCisJCSAgICAgIGNvbnN0IGludCBsZW5ndGgpOworCisvKgorICogQ2Fub25pY2FsIGZvcm1zLgorICovCitpbnQgdjNfYXNpZF9pc19jYW5vbmljYWwoQVNJZGVudGlmaWVycyAqYXNpZCk7CitpbnQgdjNfYWRkcl9pc19jYW5vbmljYWwoSVBBZGRyQmxvY2tzICphZGRyKTsKK2ludCB2M19hc2lkX2Nhbm9uaXplKEFTSWRlbnRpZmllcnMgKmFzaWQpOworaW50IHYzX2FkZHJfY2Fub25pemUoSVBBZGRyQmxvY2tzICphZGRyKTsKKworLyoKKyAqIFRlc3RzIGZvciBpbmhlcml0YW5jZSBhbmQgY29udGFpbm1lbnQuCisgKi8KK2ludCB2M19hc2lkX2luaGVyaXRzKEFTSWRlbnRpZmllcnMgKmFzaWQpOworaW50IHYzX2FkZHJfaW5oZXJpdHMoSVBBZGRyQmxvY2tzICphZGRyKTsKK2ludCB2M19hc2lkX3N1YnNldChBU0lkZW50aWZpZXJzICphLCBBU0lkZW50aWZpZXJzICpiKTsKK2ludCB2M19hZGRyX3N1YnNldChJUEFkZHJCbG9ja3MgKmEsIElQQWRkckJsb2NrcyAqYik7CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIFJGQyAzNzc5IGV4dGVuc2lvbnMgbmVzdCBwcm9wZXJseSBpbiBjaGFpbnMuCisgKi8KK2ludCB2M19hc2lkX3ZhbGlkYXRlX3BhdGgoWDUwOV9TVE9SRV9DVFggKik7CitpbnQgdjNfYWRkcl92YWxpZGF0ZV9wYXRoKFg1MDlfU1RPUkVfQ1RYICopOworaW50IHYzX2FzaWRfdmFsaWRhdGVfcmVzb3VyY2Vfc2V0KFNUQUNLX09GKFg1MDkpICpjaGFpbiwKKwkJCQkgIEFTSWRlbnRpZmllcnMgKmV4dCwKKwkJCQkgIGludCBhbGxvd19pbmhlcml0YW5jZSk7CitpbnQgdjNfYWRkcl92YWxpZGF0ZV9yZXNvdXJjZV9zZXQoU1RBQ0tfT0YoWDUwOSkgKmNoYWluLAorCQkJCSAgSVBBZGRyQmxvY2tzICpleHQsCisJCQkJICBpbnQgYWxsb3dfaW5oZXJpdGFuY2UpOworCisjZW5kaWYgLyogT1BFTlNTTF9OT19SRkMzNzc5ICovCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfWDUwOVYzX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgWDUwOVYzIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFg1MDlWM19GX0EySV9HRU5FUkFMX05BTUUJCQkgMTY0CisjZGVmaW5lIFg1MDlWM19GX0FTSURFTlRJRklFUkNIT0lDRV9DQU5PTklaRQkJIDE2MQorI2RlZmluZSBYNTA5VjNfRl9BU0lERU5USUZJRVJDSE9JQ0VfSVNfQ0FOT05JQ0FMCSAxNjIKKyNkZWZpbmUgWDUwOVYzX0ZfQ09QWV9FTUFJTAkJCQkgMTIyCisjZGVmaW5lIFg1MDlWM19GX0NPUFlfSVNTVUVSCQkJCSAxMjMKKyNkZWZpbmUgWDUwOVYzX0ZfRE9fRElSTkFNRQkJCQkgMTQ0CisjZGVmaW5lIFg1MDlWM19GX0RPX0VYVF9DT05GCQkJCSAxMjQKKyNkZWZpbmUgWDUwOVYzX0ZfRE9fRVhUX0kyRAkJCQkgMTM1CisjZGVmaW5lIFg1MDlWM19GX0RPX0VYVF9OQ09ORgkJCQkgMTUxCisjZGVmaW5lIFg1MDlWM19GX0RPX0kyVl9OQU1FX0NPTlNUUkFJTlRTCQkgMTQ4CisjZGVmaW5lIFg1MDlWM19GX0dOQU1FU19GUk9NX1NFQ1ROQU1FCQkJIDE1NgorI2RlZmluZSBYNTA5VjNfRl9IRVhfVE9fU1RSSU5HCQkJCSAxMTEKKyNkZWZpbmUgWDUwOVYzX0ZfSTJTX0FTTjFfRU5VTUVSQVRFRAkJCSAxMjEKKyNkZWZpbmUgWDUwOVYzX0ZfSTJTX0FTTjFfSUE1U1RSSU5HCQkJIDE0OQorI2RlZmluZSBYNTA5VjNfRl9JMlNfQVNOMV9JTlRFR0VSCQkJIDEyMAorI2RlZmluZSBYNTA5VjNfRl9JMlZfQVVUSE9SSVRZX0lORk9fQUNDRVNTCQkgMTM4CisjZGVmaW5lIFg1MDlWM19GX05PVElDRV9TRUNUSU9OCQkJCSAxMzIKKyNkZWZpbmUgWDUwOVYzX0ZfTlJFRl9OT1MJCQkJIDEzMworI2RlZmluZSBYNTA5VjNfRl9QT0xJQ1lfU0VDVElPTgkJCQkgMTMxCisjZGVmaW5lIFg1MDlWM19GX1BST0NFU1NfUENJX1ZBTFVFCQkJIDE1MAorI2RlZmluZSBYNTA5VjNfRl9SMklfQ0VSVFBPTAkJCQkgMTMwCisjZGVmaW5lIFg1MDlWM19GX1IySV9QQ0kJCQkJIDE1NQorI2RlZmluZSBYNTA5VjNfRl9TMklfQVNOMV9JQTVTVFJJTkcJCQkgMTAwCisjZGVmaW5lIFg1MDlWM19GX1MySV9BU04xX0lOVEVHRVIJCQkgMTA4CisjZGVmaW5lIFg1MDlWM19GX1MySV9BU04xX09DVEVUX1NUUklORwkJCSAxMTIKKyNkZWZpbmUgWDUwOVYzX0ZfUzJJX0FTTjFfU0tFWV9JRAkJCSAxMTQKKyNkZWZpbmUgWDUwOVYzX0ZfUzJJX1NLRVlfSUQJCQkJIDExNQorI2RlZmluZSBYNTA5VjNfRl9TRVRfRElTVF9QT0lOVF9OQU1FCQkJIDE1OAorI2RlZmluZSBYNTA5VjNfRl9TVFJJTkdfVE9fSEVYCQkJCSAxMTMKKyNkZWZpbmUgWDUwOVYzX0ZfU1hORVRfQUREX0lEX0FTQwkJCSAxMjUKKyNkZWZpbmUgWDUwOVYzX0ZfU1hORVRfQUREX0lEX0lOVEVHRVIJCQkgMTI2CisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX0FERF9JRF9VTE9ORwkJCSAxMjcKKyNkZWZpbmUgWDUwOVYzX0ZfU1hORVRfR0VUX0lEX0FTQwkJCSAxMjgKKyNkZWZpbmUgWDUwOVYzX0ZfU1hORVRfR0VUX0lEX1VMT05HCQkJIDEyOQorI2RlZmluZSBYNTA5VjNfRl9WMklfQVNJREVOVElGSUVSUwkJCSAxNjMKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0FTTjFfQklUX1NUUklORwkJCSAxMDEKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0FVVEhPUklUWV9JTkZPX0FDQ0VTUwkJIDEzOQorI2RlZmluZSBYNTA5VjNfRl9WMklfQVVUSE9SSVRZX0tFWUlECQkJIDExOQorI2RlZmluZSBYNTA5VjNfRl9WMklfQkFTSUNfQ09OU1RSQUlOVFMJCQkgMTAyCisjZGVmaW5lIFg1MDlWM19GX1YySV9DUkxECQkJCSAxMzQKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0VYVEVOREVEX0tFWV9VU0FHRQkJCSAxMDMKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0dFTkVSQUxfTkFNRVMJCQkgMTE4CisjZGVmaW5lIFg1MDlWM19GX1YySV9HRU5FUkFMX05BTUVfRVgJCQkgMTE3CisjZGVmaW5lIFg1MDlWM19GX1YySV9JRFAJCQkJIDE1NworI2RlZmluZSBYNTA5VjNfRl9WMklfSVBBRERSQkxPQ0tTCQkJIDE1OQorI2RlZmluZSBYNTA5VjNfRl9WMklfSVNTVUVSX0FMVAkJCQkgMTUzCisjZGVmaW5lIFg1MDlWM19GX1YySV9OQU1FX0NPTlNUUkFJTlRTCQkJIDE0NworI2RlZmluZSBYNTA5VjNfRl9WMklfUE9MSUNZX0NPTlNUUkFJTlRTCQkJIDE0NgorI2RlZmluZSBYNTA5VjNfRl9WMklfUE9MSUNZX01BUFBJTkdTCQkJIDE0NQorI2RlZmluZSBYNTA5VjNfRl9WMklfU1VCSkVDVF9BTFQJCQkgMTU0CisjZGVmaW5lIFg1MDlWM19GX1YzX0FERFJfVkFMSURBVEVfUEFUSF9JTlRFUk5BTAkJIDE2MAorI2RlZmluZSBYNTA5VjNfRl9WM19HRU5FUklDX0VYVEVOU0lPTgkJCSAxMTYKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0FERDFfSTJECQkJIDE0MAorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfQUREX1ZBTFVFCQkJIDEwNQorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfRVhUX0FERAkJCQkgMTA0CisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19FWFRfQUREX0FMSUFTCQkJIDEwNgorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfRVhUX0NPTkYJCQkgMTA3CisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19FWFRfSTJECQkJCSAxMzYKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0VYVF9OQ09ORgkJCSAxNTIKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0dFVF9TRUNUSU9OCQkJIDE0MgorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfR0VUX1NUUklORwkJCSAxNDMKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0dFVF9WQUxVRV9CT09MCQkJIDExMAorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfUEFSU0VfTElTVAkJCSAxMDkKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOV9QVVJQT1NFX0FERAkJCSAxMzcKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOV9QVVJQT1NFX1NFVAkJCSAxNDEKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBYNTA5VjNfUl9CQURfSVBfQUREUkVTUwkJCQkgMTE4CisjZGVmaW5lIFg1MDlWM19SX0JBRF9PQkpFQ1QJCQkJIDExOQorI2RlZmluZSBYNTA5VjNfUl9CTl9ERUMyQk5fRVJST1IJCQkgMTAwCisjZGVmaW5lIFg1MDlWM19SX0JOX1RPX0FTTjFfSU5URUdFUl9FUlJPUgkJIDEwMQorI2RlZmluZSBYNTA5VjNfUl9ESVJOQU1FX0VSUk9SCQkJCSAxNDkKKyNkZWZpbmUgWDUwOVYzX1JfRElTVFBPSU5UX0FMUkVBRFlfU0VUCQkJIDE2MAorI2RlZmluZSBYNTA5VjNfUl9EVVBMSUNBVEVfWk9ORV9JRAkJCSAxMzMKKyNkZWZpbmUgWDUwOVYzX1JfRVJST1JfQ09OVkVSVElOR19aT05FCQkJIDEzMQorI2RlZmluZSBYNTA5VjNfUl9FUlJPUl9DUkVBVElOR19FWFRFTlNJT04JCSAxNDQKKyNkZWZpbmUgWDUwOVYzX1JfRVJST1JfSU5fRVhURU5TSU9OCQkJIDEyOAorI2RlZmluZSBYNTA5VjNfUl9FWFBFQ1RFRF9BX1NFQ1RJT05fTkFNRQkJIDEzNworI2RlZmluZSBYNTA5VjNfUl9FWFRFTlNJT05fRVhJU1RTCQkJIDE0NQorI2RlZmluZSBYNTA5VjNfUl9FWFRFTlNJT05fTkFNRV9FUlJPUgkJCSAxMTUKKyNkZWZpbmUgWDUwOVYzX1JfRVhURU5TSU9OX05PVF9GT1VORAkJCSAxMDIKKyNkZWZpbmUgWDUwOVYzX1JfRVhURU5TSU9OX1NFVFRJTkdfTk9UX1NVUFBPUlRFRAkgMTAzCisjZGVmaW5lIFg1MDlWM19SX0VYVEVOU0lPTl9WQUxVRV9FUlJPUgkJCSAxMTYKKyNkZWZpbmUgWDUwOVYzX1JfSUxMRUdBTF9FTVBUWV9FWFRFTlNJT04JCSAxNTEKKyNkZWZpbmUgWDUwOVYzX1JfSUxMRUdBTF9IRVhfRElHSVQJCQkgMTEzCisjZGVmaW5lIFg1MDlWM19SX0lOQ09SUkVDVF9QT0xJQ1lfU1lOVEFYX1RBRwkJIDE1MgorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX01VTFRJUExFX1JETlMJCQkgMTYxCisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfQVNOVU1CRVIJCQkgMTYyCisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfQVNSQU5HRQkJCSAxNjMKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9CT09MRUFOX1NUUklORwkJCSAxMDQKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9FWFRFTlNJT05fU1RSSU5HCQkgMTA1CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfSU5IRVJJVEFOQ0UJCQkgMTY1CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfSVBBRERSRVNTCQkJIDE2NgorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX05BTUUJCQkJIDEwNgorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX05VTExfQVJHVU1FTlQJCQkgMTA3CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfTlVMTF9OQU1FCQkJIDEwOAorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX05VTExfVkFMVUUJCQkgMTA5CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfTlVNQkVSCQkJCSAxNDAKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9OVU1CRVJTCQkJIDE0MQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX09CSkVDVF9JREVOVElGSUVSCQkgMTEwCisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfT1BUSU9OCQkJCSAxMzgKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9QT0xJQ1lfSURFTlRJRklFUgkJIDEzNAorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX1BST1hZX1BPTElDWV9TRVRUSU5HCQkgMTUzCisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfUFVSUE9TRQkJCSAxNDYKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9TQUZJCQkJCSAxNjQKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9TRUNUSU9OCQkJIDEzNQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX1NZTlRBWAkJCQkgMTQzCisjZGVmaW5lIFg1MDlWM19SX0lTU1VFUl9ERUNPREVfRVJST1IJCQkgMTI2CisjZGVmaW5lIFg1MDlWM19SX01JU1NJTkdfVkFMVUUJCQkJIDEyNAorI2RlZmluZSBYNTA5VjNfUl9ORUVEX09SR0FOSVpBVElPTl9BTkRfTlVNQkVSUwkJIDE0MgorI2RlZmluZSBYNTA5VjNfUl9OT19DT05GSUdfREFUQUJBU0UJCQkgMTM2CisjZGVmaW5lIFg1MDlWM19SX05PX0lTU1VFUl9DRVJUSUZJQ0FURQkJCSAxMjEKKyNkZWZpbmUgWDUwOVYzX1JfTk9fSVNTVUVSX0RFVEFJTFMJCQkgMTI3CisjZGVmaW5lIFg1MDlWM19SX05PX1BPTElDWV9JREVOVElGSUVSCQkJIDEzOQorI2RlZmluZSBYNTA5VjNfUl9OT19QUk9YWV9DRVJUX1BPTElDWV9MQU5HVUFHRV9ERUZJTkVECSAxNTQKKyNkZWZpbmUgWDUwOVYzX1JfTk9fUFVCTElDX0tFWQkJCQkgMTE0CisjZGVmaW5lIFg1MDlWM19SX05PX1NVQkpFQ1RfREVUQUlMUwkJCSAxMjUKKyNkZWZpbmUgWDUwOVYzX1JfT0REX05VTUJFUl9PRl9ESUdJVFMJCQkgMTEyCisjZGVmaW5lIFg1MDlWM19SX09QRVJBVElPTl9OT1RfREVGSU5FRAkJCSAxNDgKKyNkZWZpbmUgWDUwOVYzX1JfT1RIRVJOQU1FX0VSUk9SCQkJIDE0NworI2RlZmluZSBYNTA5VjNfUl9QT0xJQ1lfTEFOR1VBR0VfQUxSRUFEWV9ERUZJTkVECSAxNTUKKyNkZWZpbmUgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RICQkJIDE1NgorI2RlZmluZSBYNTA5VjNfUl9QT0xJQ1lfUEFUSF9MRU5HVEhfQUxSRUFEWV9ERUZJTkVECSAxNTcKKyNkZWZpbmUgWDUwOVYzX1JfUE9MSUNZX1NZTlRBWF9OT1RfQ1VSUkVOVExZX1NVUFBPUlRFRAkgMTU4CisjZGVmaW5lIFg1MDlWM19SX1BPTElDWV9XSEVOX1BST1hZX0xBTkdVQUdFX1JFUVVJUkVTX05PX1BPTElDWSAxNTkKKyNkZWZpbmUgWDUwOVYzX1JfU0VDVElPTl9OT1RfRk9VTkQJCQkgMTUwCisjZGVmaW5lIFg1MDlWM19SX1VOQUJMRV9UT19HRVRfSVNTVUVSX0RFVEFJTFMJCSAxMjIKKyNkZWZpbmUgWDUwOVYzX1JfVU5BQkxFX1RPX0dFVF9JU1NVRVJfS0VZSUQJCSAxMjMKKyNkZWZpbmUgWDUwOVYzX1JfVU5LTk9XTl9CSVRfU1RSSU5HX0FSR1VNRU5UCQkgMTExCisjZGVmaW5lIFg1MDlWM19SX1VOS05PV05fRVhURU5TSU9OCQkJIDEyOQorI2RlZmluZSBYNTA5VjNfUl9VTktOT1dOX0VYVEVOU0lPTl9OQU1FCQkJIDEzMAorI2RlZmluZSBYNTA5VjNfUl9VTktOT1dOX09QVElPTgkJCQkgMTIwCisjZGVmaW5lIFg1MDlWM19SX1VOU1VQUE9SVEVEX09QVElPTgkJCSAxMTcKKyNkZWZpbmUgWDUwOVYzX1JfVU5TVVBQT1JURURfVFlQRQkJCSAxNjcKKyNkZWZpbmUgWDUwOVYzX1JfVVNFUl9UT09fTE9ORwkJCQkgMTMyCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDg2XzY0Y3B1aWQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8veDg2XzY0Y3B1aWQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2ODIxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94ODZfNjRjcHVpZC5wbApAQCAtMCwwICsxLDIzMiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCiskZmxhdm91ciA9IHNoaWZ0OworJG91dHB1dCAgPSBzaGlmdDsKK2lmICgkZmxhdm91ciA9fiAvXC4vKSB7ICRvdXRwdXQgPSAkZmxhdm91cjsgdW5kZWYgJGZsYXZvdXI7IH0KKworJHdpbjY0PTA7ICR3aW42ND0xIGlmICgkZmxhdm91ciA9fiAvW25tXWFzbXxtaW5ndzY0LyB8fCAkb3V0cHV0ID1+IC9cLmFzbSQvKTsKKworJDAgPX4gbS8oLipbXC9cXF0pW15cL1xcXSskLzsgJGRpcj0kMTsKK29wZW4gU1RET1VULCJ8ICReWCAke2Rpcn1wZXJsYXNtL3g4Nl82NC14bGF0ZS5wbCAkZmxhdm91ciAkb3V0cHV0IjsKKworaWYgKCR3aW42NCkJeyAkYXJnMT0iJXJjeCI7ICRhcmcyPSIlcmR4IjsgfQorZWxzZQkJeyAkYXJnMT0iJXJkaSI7ICRhcmcyPSIlcnNpIjsgfQorcHJpbnQ8PF9fXzsKKy5leHRlcm4JCU9QRU5TU0xfY3B1aWRfc2V0dXAKKy5zZWN0aW9uCS5pbml0CisJY2FsbAlPUEVOU1NMX2NwdWlkX3NldHVwCisKKy50ZXh0CisKKy5nbG9ibAlPUEVOU1NMX2F0b21pY19hZGQKKy50eXBlCU9QRU5TU0xfYXRvbWljX2FkZCxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK09QRU5TU0xfYXRvbWljX2FkZDoKKwltb3ZsCSgkYXJnMSksJWVheAorLkxzcGluOglsZWFxCSgkYXJnMiwlcmF4KSwlcjgKKwkuYnl0ZQkweGYwCQkjIGxvY2sKKwljbXB4Y2hnbAklcjhkLCgkYXJnMSkKKwlqbmUJLkxzcGluCisJbW92bAklcjhkLCVlYXgKKwkuYnl0ZQkweDQ4LDB4OTgJIyBjbHRxL2NkcWUKKwlyZXQKKy5zaXplCU9QRU5TU0xfYXRvbWljX2FkZCwuLU9QRU5TU0xfYXRvbWljX2FkZAorCisuZ2xvYmwJT1BFTlNTTF9yZHRzYworLnR5cGUJT1BFTlNTTF9yZHRzYyxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK09QRU5TU0xfcmR0c2M6CisJcmR0c2MKKwlzaGwJXCQzMiwlcmR4CisJb3IJJXJkeCwlcmF4CisJcmV0Cisuc2l6ZQlPUEVOU1NMX3JkdHNjLC4tT1BFTlNTTF9yZHRzYworCisuZ2xvYmwJT1BFTlNTTF9pYTMyX2NwdWlkCisudHlwZQlPUEVOU1NMX2lhMzJfY3B1aWQsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitPUEVOU1NMX2lhMzJfY3B1aWQ6CisJbW92CSVyYngsJXI4CisKKwl4b3IJJWVheCwlZWF4CisJY3B1aWQKKwltb3YJJWVheCwlcjExZAkJIyBtYXggdmFsdWUgZm9yIHN0YW5kYXJkIHF1ZXJ5IGxldmVsCisKKwl4b3IJJWVheCwlZWF4CisJY21wCVwkMHg3NTZlNjU0NywlZWJ4CSMgIkdlbnUiCisJc2V0bmUJJWFsCisJbW92CSVlYXgsJXI5ZAorCWNtcAlcJDB4NDk2NTZlNjksJWVkeAkjICJpbmVJIgorCXNldG5lCSVhbAorCW9yCSVlYXgsJXI5ZAorCWNtcAlcJDB4NmM2NTc0NmUsJWVjeAkjICJudGVsIgorCXNldG5lCSVhbAorCW9yCSVlYXgsJXI5ZAkJIyAwIGluZGljYXRlcyBJbnRlbCBDUFUKKwlqegkuTGludGVsCisKKwljbXAJXCQweDY4NzQ3NTQxLCVlYngJIyAiQXV0aCIKKwlzZXRuZQklYWwKKwltb3YJJWVheCwlcjEwZAorCWNtcAlcJDB4Njk3NDZFNjUsJWVkeAkjICJlbnRpIgorCXNldG5lCSVhbAorCW9yCSVlYXgsJXIxMGQKKwljbXAJXCQweDQ0NEQ0MTYzLCVlY3gJIyAiY0FNRCIKKwlzZXRuZQklYWwKKwlvcgklZWF4LCVyMTBkCQkjIDAgaW5kaWNhdGVzIEFNRCBDUFUKKwlqbnoJLkxpbnRlbAorCisJIyBBTUQgc3BlY2lmaWMKKwltb3YJXCQweDgwMDAwMDAwLCVlYXgKKwljcHVpZAorCWNtcAlcJDB4ODAwMDAwMDgsJWVheAorCWpiCS5MaW50ZWwKKworCW1vdglcJDB4ODAwMDAwMDgsJWVheAorCWNwdWlkCisJbW92emIJJWNsLCVyMTAJCSMgbnVtYmVyIG9mIGNvcmVzIC0gMQorCWluYwklcjEwCQkJIyBudW1iZXIgb2YgY29yZXMKKworCW1vdglcJDEsJWVheAorCWNwdWlkCisJYnQJXCQyOCwlZWR4CQkjIHRlc3QgaHlwZXItdGhyZWFkaW5nIGJpdAorCWpuYwkuTGRvbmUKKwlzaHIJXCQxNiwlZWJ4CQkjIG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMKKwljbXAJJXIxMGIsJWJsCisJamEJLkxkb25lCisJYW5kCVwkMHhlZmZmZmZmZiwlZWR4CSMgfigxPDwyOCkKKwlqbXAJLkxkb25lCisKKy5MaW50ZWw6CisJY21wCVwkNCwlcjExZAorCW1vdglcJC0xLCVyMTBkCisJamIJLkxub2NhY2hlaW5mbworCisJbW92CVwkNCwlZWF4CisJbW92CVwkMCwlZWN4CQkjIHF1ZXJ5IEwxRAorCWNwdWlkCisJbW92CSVlYXgsJXIxMGQKKwlzaHIJXCQxNCwlcjEwZAorCWFuZAlcJDB4ZmZmLCVyMTBkCQkjIG51bWJlciBvZiBjb3JlcyAtMSBwZXIgTDFECisKKy5Mbm9jYWNoZWluZm86CisJbW92CVwkMSwlZWF4CisJY3B1aWQKKwljbXAJXCQwLCVyOWQKKwlqbmUJLkxub3RpbnRlbAorCW9yCVwkMHgwMDEwMDAwMCwlZWR4CSMgdXNlIHJlc2VydmVkIDIwdGggYml0IHRvIGVuZ2FnZSBSQzRfQ0hBUgorCWFuZAlcJDE1LCVhaAorCWNtcAlcJDE1LCVhaAkJIyBleGFtaW5lIEZhbWlseSBJRAorCWplCS5Mbm90aW50ZWwKKwlvcglcJDB4NDAwMDAwMDAsJWVkeAkjIHVzZSByZXNlcnZlZCBiaXQgdG8gc2tpcCB1bnJvbGxlZCBsb29wCisuTG5vdGludGVsOgorCWJ0CVwkMjgsJWVkeAkJIyB0ZXN0IGh5cGVyLXRocmVhZGluZyBiaXQKKwlqbmMJLkxkb25lCisJYW5kCVwkMHhlZmZmZmZmZiwlZWR4CSMgfigxPDwyOCkKKwljbXAJXCQwLCVyMTBkCisJamUJLkxkb25lCisKKwlvcglcJDB4MTAwMDAwMDAsJWVkeAkjIDE8PDI4CisJc2hyCVwkMTYsJWVieAorCWNtcAlcJDEsJWJsCQkJIyBzZWUgaWYgY2FjaGUgaXMgc2hhcmVkCisJamEJLkxkb25lCisJYW5kCVwkMHhlZmZmZmZmZiwlZWR4CSMgfigxPDwyOCkKKy5MZG9uZToKKwlzaGwJXCQzMiwlcmN4CisJbW92CSVlZHgsJWVheAorCW1vdgklcjgsJXJieAorCW9yCSVyY3gsJXJheAorCXJldAorLnNpemUJT1BFTlNTTF9pYTMyX2NwdWlkLC4tT1BFTlNTTF9pYTMyX2NwdWlkCisKKy5nbG9ibCAgT1BFTlNTTF9jbGVhbnNlCisudHlwZSAgIE9QRU5TU0xfY2xlYW5zZSxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24gIDE2CitPUEVOU1NMX2NsZWFuc2U6CisJeG9yCSVyYXgsJXJheAorCWNtcAlcJDE1LCRhcmcyCisJamFlCS5Mb3QKKwljbXAJXCQwLCRhcmcyCisJamUJLkxyZXQKKy5MaXR0bGU6CisJbW92CSVhbCwoJGFyZzEpCisJc3ViCVwkMSwkYXJnMgorCWxlYQkxKCRhcmcxKSwkYXJnMQorCWpuegkuTGl0dGxlCisuTHJldDoKKwlyZXQKKy5hbGlnbgkxNgorLkxvdDoKKwl0ZXN0CVwkNywkYXJnMQorCWp6CS5MYWxpZ25lZAorCW1vdgklYWwsKCRhcmcxKQorCWxlYQktMSgkYXJnMiksJGFyZzIKKwlsZWEJMSgkYXJnMSksJGFyZzEKKwlqbXAJLkxvdAorLkxhbGlnbmVkOgorCW1vdgklcmF4LCgkYXJnMSkKKwlsZWEJLTgoJGFyZzIpLCRhcmcyCisJdGVzdAlcJC04LCRhcmcyCisJbGVhCTgoJGFyZzEpLCRhcmcxCisJam56CS5MYWxpZ25lZAorCWNtcAlcJDAsJGFyZzIKKwlqbmUJLkxpdHRsZQorCXJldAorLnNpemUJT1BFTlNTTF9jbGVhbnNlLC4tT1BFTlNTTF9jbGVhbnNlCitfX18KKworcHJpbnQ8PF9fXyBpZiAoISR3aW42NCk7CisuZ2xvYmwJT1BFTlNTTF93aXBlX2NwdQorLnR5cGUJT1BFTlNTTF93aXBlX2NwdSxcQGFiaS1vbW5pcG90ZW50CisuYWxpZ24JMTYKK09QRU5TU0xfd2lwZV9jcHU6CisJcHhvcgkleG1tMCwleG1tMAorCXB4b3IJJXhtbTEsJXhtbTEKKwlweG9yCSV4bW0yLCV4bW0yCisJcHhvcgkleG1tMywleG1tMworCXB4b3IJJXhtbTQsJXhtbTQKKwlweG9yCSV4bW01LCV4bW01CisJcHhvcgkleG1tNiwleG1tNgorCXB4b3IJJXhtbTcsJXhtbTcKKwlweG9yCSV4bW04LCV4bW04CisJcHhvcgkleG1tOSwleG1tOQorCXB4b3IJJXhtbTEwLCV4bW0xMAorCXB4b3IJJXhtbTExLCV4bW0xMQorCXB4b3IJJXhtbTEyLCV4bW0xMgorCXB4b3IJJXhtbTEzLCV4bW0xMworCXB4b3IJJXhtbTE0LCV4bW0xNAorCXB4b3IJJXhtbTE1LCV4bW0xNQorCXhvcnEJJXJjeCwlcmN4CisJeG9ycQklcmR4LCVyZHgKKwl4b3JxCSVyc2ksJXJzaQorCXhvcnEJJXJkaSwlcmRpCisJeG9ycQklcjgsJXI4CisJeG9ycQklcjksJXI5CisJeG9ycQklcjEwLCVyMTAKKwl4b3JxCSVyMTEsJXIxMQorCWxlYXEJOCglcnNwKSwlcmF4CisJcmV0Cisuc2l6ZQlPUEVOU1NMX3dpcGVfY3B1LC4tT1BFTlNTTF93aXBlX2NwdQorX19fCitwcmludDw8X19fIGlmICgkd2luNjQpOworLmdsb2JsCU9QRU5TU0xfd2lwZV9jcHUKKy50eXBlCU9QRU5TU0xfd2lwZV9jcHUsXEBhYmktb21uaXBvdGVudAorLmFsaWduCTE2CitPUEVOU1NMX3dpcGVfY3B1OgorCXB4b3IJJXhtbTAsJXhtbTAKKwlweG9yCSV4bW0xLCV4bW0xCisJcHhvcgkleG1tMiwleG1tMgorCXB4b3IJJXhtbTMsJXhtbTMKKwlweG9yCSV4bW00LCV4bW00CisJcHhvcgkleG1tNSwleG1tNQorCXhvcnEJJXJjeCwlcmN4CisJeG9ycQklcmR4LCVyZHgKKwl4b3JxCSVyOCwlcjgKKwl4b3JxCSVyOSwlcjkKKwl4b3JxCSVyMTAsJXIxMAorCXhvcnEJJXIxMSwlcjExCisJbGVhcQk4KCVyc3ApLCVyYXgKKwlyZXQKKy5zaXplCU9QRU5TU0xfd2lwZV9jcHUsLi1PUEVOU1NMX3dpcGVfY3B1CitfX18KKworY2xvc2UgU1RET1VUOwkjIGZsdXNoCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9jcnlwdG8veDg2Y3B1aWQucGwgYi9saWIvb3BlbnNzbC9jcnlwdG8veDg2Y3B1aWQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0NjRhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2NyeXB0by94ODZjcHVpZC5wbApAQCAtMCwwICsxLDMxMiBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworcHVzaChASU5DLCAiJHtkaXJ9cGVybGFzbSIsICJwZXJsYXNtIik7CityZXF1aXJlICJ4ODZhc20ucGwiOworCismYXNtX2luaXQoJEFSR1ZbMF0sIng4NmNwdWlkIik7CisKK2ZvciAoQEFSR1YpIHsgJHNzZTI9MSBpZiAoLy1ET1BFTlNTTF9JQTMyX1NTRTIvKTsgfQorCismZnVuY3Rpb25fYmVnaW4oIk9QRU5TU0xfaWEzMl9jcHVpZCIpOworCSZ4b3IJKCJlZHgiLCJlZHgiKTsKKwkmcHVzaGYJKCk7CisJJnBvcAkoImVheCIpOworCSZtb3YJKCJlY3giLCJlYXgiKTsKKwkmeG9yCSgiZWF4IiwxPDwyMSk7CisJJnB1c2gJKCJlYXgiKTsKKwkmcG9wZgkoKTsKKwkmcHVzaGYJKCk7CisJJnBvcAkoImVheCIpOworCSZ4b3IJKCJlY3giLCJlYXgiKTsKKwkmYnQJKCJlY3giLDIxKTsKKwkmam5jCSgmbGFiZWwoImRvbmUiKSk7CisJJnhvcgkoImVheCIsImVheCIpOworCSZjcHVpZAkoKTsKKwkmbW92CSgiZWRpIiwiZWF4Iik7CQkjIG1heCB2YWx1ZSBmb3Igc3RhbmRhcmQgcXVlcnkgbGV2ZWwKKworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmY21wCSgiZWJ4IiwweDc1NmU2NTQ3KTsJIyAiR2VudSIKKwkmc2V0bmUJKCZMQigiZWF4IikpOworCSZtb3YJKCJlYnAiLCJlYXgiKTsKKwkmY21wCSgiZWR4IiwweDQ5NjU2ZTY5KTsJIyAiaW5lSSIKKwkmc2V0bmUJKCZMQigiZWF4IikpOworCSZvcgkoImVicCIsImVheCIpOworCSZjbXAJKCJlY3giLDB4NmM2NTc0NmUpOwkjICJudGVsIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm9yCSgiZWJwIiwiZWF4Iik7CQkjIDAgaW5kaWNhdGVzIEludGVsIENQVQorCSZqegkoJmxhYmVsKCJpbnRlbCIpKTsKKworCSZjbXAJKCJlYngiLDB4Njg3NDc1NDEpOwkjICJBdXRoIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm1vdgkoImVzaSIsImVheCIpOworCSZjbXAJKCJlZHgiLDB4Njk3NDZFNjUpOwkjICJlbnRpIgorCSZzZXRuZQkoJkxCKCJlYXgiKSk7CisJJm9yCSgiZXNpIiwiZWF4Iik7CisJJmNtcAkoImVjeCIsMHg0NDRENDE2Myk7CSMgImNBTUQiCisJJnNldG5lCSgmTEIoImVheCIpKTsKKwkmb3IJKCJlc2kiLCJlYXgiKTsJCSMgMCBpbmRpY2F0ZXMgQU1EIENQVQorCSZqbnoJKCZsYWJlbCgiaW50ZWwiKSk7CisKKwkjIEFNRCBzcGVjaWZpYworCSZtb3YJKCJlYXgiLDB4ODAwMDAwMDApOworCSZjcHVpZAkoKTsKKwkmY21wCSgiZWF4IiwweDgwMDAwMDA4KTsKKwkmamIJKCZsYWJlbCgiaW50ZWwiKSk7CisKKwkmbW92CSgiZWF4IiwweDgwMDAwMDA4KTsKKwkmY3B1aWQJKCk7CisJJm1vdnoJKCJlc2kiLCZMQigiZWN4IikpOwkjIG51bWJlciBvZiBjb3JlcyAtIDEKKwkmaW5jCSgiZXNpIik7CQkjIG51bWJlciBvZiBjb3JlcworCisJJm1vdgkoImVheCIsMSk7CisJJmNwdWlkCSgpOworCSZidAkoImVkeCIsMjgpOworCSZqbmMJKCZsYWJlbCgiZG9uZSIpKTsKKwkmc2hyCSgiZWJ4IiwxNik7CisJJmFuZAkoImVieCIsMHhmZik7CisJJmNtcAkoImVieCIsImVzaSIpOworCSZqYQkoJmxhYmVsKCJkb25lIikpOworCSZhbmQJKCJlZHgiLDB4ZWZmZmZmZmYpOwkjIGNsZWFyIGh5cGVyLXRocmVhZGluZyBiaXQKKwkmam1wCSgmbGFiZWwoImRvbmUiKSk7CisJCismc2V0X2xhYmVsKCJpbnRlbCIpOworCSZjbXAJKCJlZGkiLDQpOworCSZtb3YJKCJlZGkiLC0xKTsKKwkmamIJKCZsYWJlbCgibm9jYWNoZWluZm8iKSk7CisKKwkmbW92CSgiZWF4Iiw0KTsKKwkmbW92CSgiZWN4IiwwKTsJCSMgcXVlcnkgTDFECisJJmNwdWlkCSgpOworCSZtb3YJKCJlZGkiLCJlYXgiKTsKKwkmc2hyCSgiZWRpIiwxNCk7CisJJmFuZAkoImVkaSIsMHhmZmYpOwkJIyBudW1iZXIgb2YgY29yZXMgLTEgcGVyIEwxRAorCismc2V0X2xhYmVsKCJub2NhY2hlaW5mbyIpOworCSZtb3YJKCJlYXgiLDEpOworCSZjcHVpZAkoKTsKKwkmY21wCSgiZWJwIiwwKTsKKwkmam5lCSgmbGFiZWwoIm5vdFA0IikpOworCSZhbmQJKCZIQigiZWF4IiksMTUpOwkjIGZhbWlsaXkgSUQKKwkmY21wCSgmSEIoImVheCIpLDE1KTsJIyBQND8KKwkmam5lCSgmbGFiZWwoIm5vdFA0IikpOworCSZvcgkoImVkeCIsMTw8MjApOwkJIyB1c2UgcmVzZXJ2ZWQgYml0IHRvIGVuZ2FnZSBSQzRfQ0hBUgorJnNldF9sYWJlbCgibm90UDQiKTsKKwkmYnQJKCJlZHgiLDI4KTsJCSMgdGVzdCBoeXBlci10aHJlYWRpbmcgYml0CisJJmpuYwkoJmxhYmVsKCJkb25lIikpOworCSZhbmQJKCJlZHgiLDB4ZWZmZmZmZmYpOworCSZjbXAJKCJlZGkiLDApOworCSZqZQkoJmxhYmVsKCJkb25lIikpOworCisJJm9yCSgiZWR4IiwweDEwMDAwMDAwKTsKKwkmc2hyCSgiZWJ4IiwxNik7CisJJmNtcAkoJkxCKCJlYngiKSwxKTsKKwkmamEJKCZsYWJlbCgiZG9uZSIpKTsKKwkmYW5kCSgiZWR4IiwweGVmZmZmZmZmKTsJIyBjbGVhciBoeXBlci10aHJlYWRpbmcgYml0IGlmIG5vdAorJnNldF9sYWJlbCgiZG9uZSIpOworCSZtb3YJKCJlYXgiLCJlZHgiKTsKKwkmbW92CSgiZWR4IiwiZWN4Iik7CismZnVuY3Rpb25fZW5kKCJPUEVOU1NMX2lhMzJfY3B1aWQiKTsKKworJmV4dGVybmFsX2xhYmVsKCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCismZnVuY3Rpb25fYmVnaW5fQigiT1BFTlNTTF9yZHRzYyIsIkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiKTsKKwkmeG9yCSgiZWF4IiwiZWF4Iik7CisJJnhvcgkoImVkeCIsImVkeCIpOworCSZwaWNtZXVwKCJlY3giLCJPUEVOU1NMX2lhMzJjYXBfUCIpOworCSZidAkoJkRXUCgwLCJlY3giKSw0KTsKKwkmam5jCSgmbGFiZWwoIm5vdHNjIikpOworCSZyZHRzYwkoKTsKKyZzZXRfbGFiZWwoIm5vdHNjIik7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiT1BFTlNTTF9yZHRzYyIpOworCisjIFRoaXMgd29ya3MgaW4gUmluZyAwIG9ubHkgW3JlYWQgREpHUFArTVMtRE9TK3ByaXZpbGVnZWQgRFBNSSBob3N0XSwKKyMgYnV0IGl0J3Mgc2FmZSB0byBjYWxsIGl0IG9uIGFueSBbc3VwcG9ydGVkXSAzMi1iaXQgcGxhdGZvcm0uLi4KKyMgSnVzdCBjaGVjayBmb3IgW25vbi1demVybyByZXR1cm4gdmFsdWUuLi4KKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2luc3RydW1lbnRfaGFsdCIsIkVYVFJOXHRfT1BFTlNTTF9pYTMyY2FwX1A6RFdPUkQiKTsKKwkmcGljbWV1cCgiZWN4IiwiT1BFTlNTTF9pYTMyY2FwX1AiKTsKKwkmYnQJKCZEV1AoMCwiZWN4IiksNCk7CisJJmpuYwkoJmxhYmVsKCJub2hhbHQiKSk7CSMgbm8gVFNDCisKKwkmZGF0YV93b3JkKDB4OTA1ODkwMGUpOwkJIyBwdXNoICVjczsgcG9wICVlYXgKKwkmYW5kCSgiZWF4IiwzKTsKKwkmam56CSgmbGFiZWwoIm5vaGFsdCIpKTsJIyBub3QgZW5vdWdoIHByaXZpbGVnZXMKKworCSZwdXNoZgkoKTsKKwkmcG9wCSgiZWF4IikKKwkmYnQJKCJlYXgiLDkpOworCSZqbmMJKCZsYWJlbCgibm9oYWx0IikpOwkjIGludGVycnVwdHMgYXJlIGRpc2FibGVkCisKKwkmcmR0c2MJKCk7CisJJnB1c2gJKCJlZHgiKTsKKwkmcHVzaAkoImVheCIpOworCSZoYWx0CSgpOworCSZyZHRzYwkoKTsKKworCSZzdWIJKCJlYXgiLCZEV1AoMCwiZXNwIikpOworCSZzYmIJKCJlZHgiLCZEV1AoNCwiZXNwIikpOworCSZhZGQJKCJlc3AiLDgpOworCSZyZXQJKCk7CisKKyZzZXRfbGFiZWwoIm5vaGFsdCIpOworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmeG9yCSgiZWR4IiwiZWR4Iik7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiT1BFTlNTTF9pbnN0cnVtZW50X2hhbHQiKTsKKworIyBFc3NlbnRpYWxseSB0aGVyZSBpcyBvbmx5IG9uZSB1c2UgZm9yIHRoaXMgZnVuY3Rpb24uIFVuZGVyIERKR1BQOgorIworIwkjaW5jbHVkZSA8Z28zMi5oPgorIwkuLi4KKyMJaT1PUEVOU1NMX2Zhcl9zcGluKF9kb3NfZHMsMHg0NmMpOworIwkuLi4KKyMgdG8gb2J0YWluIHRoZSBudW1iZXIgb2Ygc3BpbnMgdGlsbCBjbG9zZXN0IHRpbWVyIGludGVycnVwdC4KKworJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfZmFyX3NwaW4iKTsKKwkmcHVzaGYJKCk7CisJJnBvcAkoImVheCIpCisJJmJ0CSgiZWF4Iiw5KTsKKwkmam5jCSgmbGFiZWwoIm5vc3BpbiIpKTsJIyBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZAorCisJJm1vdgkoImVheCIsJkRXUCg0LCJlc3AiKSk7CisJJm1vdgkoImVjeCIsJkRXUCg4LCJlc3AiKSk7CisJJmRhdGFfd29yZCAoMHg5MGQ4OGUxZSk7CSMgcHVzaCAlZHMsIG1vdiAlZWF4LCVkcworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmbW92CSgiZWR4IiwmRFdQKDAsImVjeCIpKTsKKwkmam1wCSgmbGFiZWwoInNwaW4iKSk7CisKKwkmYWxpZ24JKDE2KTsKKyZzZXRfbGFiZWwoInNwaW4iKTsKKwkmaW5jCSgiZWF4Iik7CisJJmNtcAkoImVkeCIsJkRXUCgwLCJlY3giKSk7CisJJmplCSgmbGFiZWwoInNwaW4iKSk7CisKKwkmZGF0YV93b3JkICgweDFmOTA5MDkwKTsJIyBwb3AJJWRzCisJJnJldAkoKTsKKworJnNldF9sYWJlbCgibm9zcGluIik7CisJJnhvcgkoImVheCIsImVheCIpOworCSZ4b3IJKCJlZHgiLCJlZHgiKTsKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJPUEVOU1NMX2Zhcl9zcGluIik7CisKKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX3dpcGVfY3B1IiwiRVhUUk5cdF9PUEVOU1NMX2lhMzJjYXBfUDpEV09SRCIpOworCSZ4b3IJKCJlYXgiLCJlYXgiKTsKKwkmeG9yCSgiZWR4IiwiZWR4Iik7CisJJnBpY21ldXAoImVjeCIsIk9QRU5TU0xfaWEzMmNhcF9QIik7CisJJm1vdgkoImVjeCIsJkRXUCgwLCJlY3giKSk7CisJJmJ0CSgmRFdQKDAsImVjeCIpLDEpOworCSZqbmMJKCZsYWJlbCgibm9feDg3IikpOworCWlmICgkc3NlMikgeworCQkmYnQJKCZEV1AoMCwiZWN4IiksMjYpOworCQkmam5jCSgmbGFiZWwoIm5vX3NzZTIiKSk7CisJCSZweG9yCSgieG1tMCIsInhtbTAiKTsKKwkJJnB4b3IJKCJ4bW0xIiwieG1tMSIpOworCQkmcHhvcgkoInhtbTIiLCJ4bW0yIik7CisJCSZweG9yCSgieG1tMyIsInhtbTMiKTsKKwkJJnB4b3IJKCJ4bW00IiwieG1tNCIpOworCQkmcHhvcgkoInhtbTUiLCJ4bW01Iik7CisJCSZweG9yCSgieG1tNiIsInhtbTYiKTsKKwkJJnB4b3IJKCJ4bW03IiwieG1tNyIpOworCSZzZXRfbGFiZWwoIm5vX3NzZTIiKTsKKwl9CisJIyBqdXN0IGEgYnVuY2ggb2YgZmxkeiB0byB6YXAgdGhlIGZwL21tIGJhbmsgZm9sbG93ZWQgYnkgZmluaXQuLi4KKwkmZGF0YV93b3JkKDB4ZWVkOWVlZDksMHhlZWQ5ZWVkOSwweGVlZDllZWQ5LDB4ZWVkOWVlZDksMHg5MGUzZGI5Yik7Cismc2V0X2xhYmVsKCJub194ODciKTsKKwkmbGVhCSgiZWF4IiwmRFdQKDQsImVzcCIpKTsKKwkmcmV0CSgpOworJmZ1bmN0aW9uX2VuZF9CKCJPUEVOU1NMX3dpcGVfY3B1Iik7CisKKyZmdW5jdGlvbl9iZWdpbl9CKCJPUEVOU1NMX2F0b21pY19hZGQiKTsKKwkmbW92CSgiZWR4IiwmRFdQKDQsImVzcCIpKTsJIyBmZXRjaCB0aGUgcG9pbnRlciwgMXN0IGFyZworCSZtb3YJKCJlY3giLCZEV1AoOCwiZXNwIikpOwkjIGZldGNoIHRoZSBpbmNyZW1lbnQsIDJuZCBhcmcKKwkmcHVzaAkoImVieCIpOworCSZub3AJKCk7CisJJm1vdgkoImVheCIsJkRXUCgwLCJlZHgiKSk7Cismc2V0X2xhYmVsKCJzcGluIik7CisJJmxlYQkoImVieCIsJkRXUCgwLCJlYXgiLCJlY3giKSk7CisJJm5vcAkoKTsKKwkmZGF0YV93b3JkKDB4MWFiMTBmZjApOwkjIGxvY2s7CWNtcHhjaGcJJWVieCwoJWVkeCkJIyAlZWF4IGlzIGVudm9sdmVkIGFuZCBpcyBhbHdheXMgcmVsb2FkZWQKKwkmam5lCSgmbGFiZWwoInNwaW4iKSk7CisJJm1vdgkoImVheCIsImVieCIpOwkjIE9wZW5TU0wgZXhwZWN0cyB0aGUgbmV3IHZhbHVlCisJJnBvcAkoImVieCIpOworCSZyZXQJKCk7CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfYXRvbWljX2FkZCIpOworCisjIFRoaXMgZnVuY3Rpb24gY2FuIGJlY29tZSBoYW5keSB1bmRlciBXaW4zMiBpbiBzaXR1YXRpb25zIHdoZW4KKyMgd2UgZG9uJ3Qga25vdyB3aGljaCBjYWxsaW5nIGNvbnZlbnRpb24sIF9fc3RkY2FsbCBvciBfX2NkZWNsKCopLAorIyBpbmRpcmVjdCBjYWxsZWUgaXMgdXNpbmcuIEluIEMgaXQgY2FuIGJlIGRlcGxveWVkIGFzCisjCisjaWZkZWYgT1BFTlNTTF9DUFVJRF9PQkoKKyMJdHlwZSBPUEVOU1NMX2luZGlyZWN0X2NhbGwodm9pZCAqZiwuLi4pOworIwkuLi4KKyMJT1BFTlNTTF9pbmRpcmVjdF9jYWxsKGZ1bmMsW3VwIHRvICRtYXggYXJndW1lbnRzXSk7CisjZW5kaWYKKyMKKyMgKCopCWl0J3MgZGVzaWduZWQgdG8gd29yayBldmVuIGZvciBfX2Zhc3RjYWxsIGlmIG51bWJlciBvZgorIwlhcmd1bWVudHMgaXMgMSBvciAyIQorJmZ1bmN0aW9uX2JlZ2luX0IoIk9QRU5TU0xfaW5kaXJlY3RfY2FsbCIpOworCXsKKwlteSAkaSwkbWF4PTc7CQkjICRtYXggaGFzIHRvIGJlIGNob3NlbiBhcyA0Km4tMQorCQkJCSMgaW4gb3JkZXIgdG8gcHJlc2VydmUgZXZlbnR1YWwKKwkJCQkjIHN0YWNrIGFsaWdubWVudAorCSZwdXNoCSgiZWJwIik7CisJJm1vdgkoImVicCIsImVzcCIpOworCSZzdWIJKCJlc3AiLCRtYXgqNCk7CisJJm1vdgkoImVjeCIsJkRXUCgxMiwiZWJwIikpOworCSZtb3YJKCZEV1AoMCwiZXNwIiksImVjeCIpOworCSZtb3YJKCJlZHgiLCZEV1AoMTYsImVicCIpKTsKKwkmbW92CSgmRFdQKDQsImVzcCIpLCJlZHgiKTsKKwlmb3IoJGk9MjskaTwkbWF4OyRpKyspCisJCXsKKwkJIyBTb21lIGNvcGllcyB3aWxsIGJlIHJlZHVuZGFudC9ib2d1cy4uLgorCQkmbW92CSgiZWF4IiwmRFdQKDEyKyRpKjQsImVicCIpKTsKKwkJJm1vdgkoJkRXUCgwKyRpKjQsImVzcCIpLCJlYXgiKTsKKwkJfQorCSZjYWxsX3B0cgkoJkRXUCg4LCJlYnAiKSk7IyBtYWtlIHRoZSBjYWxsLi4uCisJJm1vdgkoImVzcCIsImVicCIpOwkjIC4uLiBhbmQganVzdCByZXN0b3JlIHRoZSBzdGFjayBwb2ludGVyCisJCQkJIyB3aXRob3V0IHBheWluZyBhdHRlbnRpb24gdG8gd2hhdCB3ZSBjYWxsZWQsCisJCQkJIyAoX19jZGVjbCAqZnVuYykgb3IgKF9fc3RkY2FsbCAqb25lKS4KKwkmcG9wCSgiZWJwIik7CisJJnJldAkoKTsKKwl9CismZnVuY3Rpb25fZW5kX0IoIk9QRU5TU0xfaW5kaXJlY3RfY2FsbCIpOworCismZnVuY3Rpb25fYmVnaW5fQigiT1BFTlNTTF9jbGVhbnNlIik7CisJJm1vdgkoImVkeCIsJndwYXJhbSgwKSk7CisJJm1vdgkoImVjeCIsJndwYXJhbSgxKSk7CisJJnhvcgkoImVheCIsImVheCIpOworCSZjbXAJKCJlY3giLDcpOworCSZqYWUJKCZsYWJlbCgibG90IikpOworCSZjbXAJKCJlY3giLDApOworCSZqZQkoJmxhYmVsKCJyZXQiKSk7Cismc2V0X2xhYmVsKCJsaXR0bGUiKTsKKwkmbW92CSgmQlAoMCwiZWR4IiksImFsIik7CisJJnN1YgkoImVjeCIsMSk7CisJJmxlYQkoImVkeCIsJkRXUCgxLCJlZHgiKSk7CisJJmpuegkoJmxhYmVsKCJsaXR0bGUiKSk7Cismc2V0X2xhYmVsKCJyZXQiKTsKKwkmcmV0CSgpOworCismc2V0X2xhYmVsKCJsb3QiLDE2KTsKKwkmdGVzdAkoImVkeCIsMyk7CisJJmp6CSgmbGFiZWwoImFsaWduZWQiKSk7CisJJm1vdgkoJkJQKDAsImVkeCIpLCJhbCIpOworCSZsZWEJKCJlY3giLCZEV1AoLTEsImVjeCIpKTsKKwkmbGVhCSgiZWR4IiwmRFdQKDEsImVkeCIpKTsKKwkmam1wCSgmbGFiZWwoImxvdCIpKTsKKyZzZXRfbGFiZWwoImFsaWduZWQiKTsKKwkmbW92CSgmRFdQKDAsImVkeCIpLCJlYXgiKTsKKwkmbGVhCSgiZWN4IiwmRFdQKC00LCJlY3giKSk7CisJJnRlc3QJKCJlY3giLC00KTsKKwkmbGVhCSgiZWR4IiwmRFdQKDQsImVkeCIpKTsKKwkmam56CSgmbGFiZWwoImFsaWduZWQiKSk7CisJJmNtcAkoImVjeCIsMCk7CisJJmpuZQkoJmxhYmVsKCJsaXR0bGUiKSk7CisJJnJldAkoKTsKKyZmdW5jdGlvbl9lbmRfQigiT1BFTlNTTF9jbGVhbnNlIik7CisKKyZpbml0c2VnKCJPUEVOU1NMX2NwdWlkX3NldHVwIik7CisKKyZhc21fZmluaXNoKCk7CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9lX29zLmggYi9saWIvb3BlbnNzbC9lX29zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlZWVlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2Vfb3MuaApAQCAtMCwwICsxLDc0NiBAQAorLyogZV9vcy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX0VfT1NfSAorI2RlZmluZSBIRUFERVJfRV9PU19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisvKiA8b3BlbnNzbC9lX29zMi5oPiBjb250YWlucyB3aGF0IHdlIGNhbiBqdXN0aWZ5IHRvIG1ha2UgdmlzaWJsZQorICogdG8gdGhlIG91dHNpZGU7IHRoaXMgZmlsZSBlX29zLmggaXMgbm90IHBhcnQgb2YgdGhlIGV4cG9ydGVkCisgKiBpbnRlcmZhY2UuICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFVzZWQgdG8gY2hlY2tpbmcgcmVmZXJlbmNlIGNvdW50cywgbW9zdCB3aGlsZSBkb2luZyBwZXJsNSBzdHVmZiA6LSkgKi8KKyNpZmRlZiBSRUZfUFJJTlQKKyN1bmRlZiBSRUZfUFJJTlQKKyNkZWZpbmUgUkVGX1BSSU5UKGEsYikJZnByaW50ZihzdGRlcnIsIiUwOFg6JTRkOiVzXG4iLChpbnQpYixiLT5yZWZlcmVuY2VzLGEpCisjZW5kaWYKKworI2lmbmRlZiBERVZSQU5ET00KKy8qIHNldCB0aGlzIHRvIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgJ3JhbmRvbScgZGV2aWNlIGZpbGVzIHRvIHRyeSBvdXQuCisgKiBNeSBkZWZhdWx0LCB3ZSB3aWxsIHRyeSB0byByZWFkIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBmaWxlcyAqLworI2RlZmluZSBERVZSQU5ET00gIi9kZXYvdXJhbmRvbSIsIi9kZXYvcmFuZG9tIiwiL2Rldi9zcmFuZG9tIgorI2VuZGlmCisjaWZuZGVmIERFVlJBTkRPTV9FR0QKKy8qIHNldCB0aGlzIHRvIGEgY29tbWEtc2VwZXJhdGVkIGxpc3Qgb2YgJ2VnZCcgc29ja2V0cyB0byB0cnkgb3V0LiBUaGVzZQorICogc29ja2V0cyB3aWxsIGJlIHRyaWVkIGluIHRoZSBvcmRlciBsaXN0ZWQgaW4gY2FzZSBhY2Nlc3NpbmcgdGhlIGRldmljZSBmaWxlcworICogbGlzdGVkIGluIERFVlJBTkRPTSBkaWQgbm90IHJldHVybiBlbm91Z2ggZW50cm9weS4gKi8KKyNkZWZpbmUgREVWUkFORE9NX0VHRCAiL3Zhci9ydW4vZWdkLXBvb2wiLCIvZGV2L2VnZC1wb29sIiwiL2V0Yy9lZ2QtcG9vbCIsIi9ldGMvZW50cm9weSIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WWFdPUktTKQorIyAgZGVmaW5lIE5PX1NZU19QQVJBTV9ICisjICBkZWZpbmUgTk9fQ0hNT0QKKyMgIGRlZmluZSBOT19TWVNMT0cKKyNlbmRpZgorICAKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01BQ0lOVE9TSF9DTEFTU0lDKQorIyBpZiBtYWNpbnRvc2g9PTEKKyMgIGlmbmRlZiBNQUNfT1NfR1VTSV9TT1VSQ0UKKyMgICAgZGVmaW5lIE1BQ19PU19wcmVfWAorIyAgICBkZWZpbmUgTk9fU1lTX1RZUEVTX0gKKyAgICAgdHlwZWRlZiBsb25nIHNzaXplX3Q7CisjICBlbmRpZgorIyAgZGVmaW5lIE5PX1NZU19QQVJBTV9ICisjICBkZWZpbmUgTk9fQ0hNT0QKKyMgIGRlZmluZSBOT19TWVNMT0cKKyMgIHVuZGVmICBERVZSQU5ET00KKyMgIGRlZmluZSBHRVRQSURfSVNfTUVBTklOR0xFU1MKKyMgZW5kaWYKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBUaGUgTWljcm9zb2Z0IHNlY3Rpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCBiZWNhdXNlIG9mIHRoZSBzbWFsbCBzdGFjayBpbiBzb21lCisgKiBNaWNyb3NvZnQgb3BlcmF0aW5nIHN5c3RlbXMgKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfV0lOMzIpCisjICBkZWZpbmUgTVNfU1RBVElDCXN0YXRpYworI2Vsc2UKKyMgIGRlZmluZSBNU19TVEFUSUMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikgJiYgIWRlZmluZWQoV0lOMzIpCisjICBkZWZpbmUgV0lOMzIKKyNlbmRpZgorI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgJiYgIWRlZmluZWQoV0lORE9XUykKKyMgIGRlZmluZSBXSU5ET1dTCisjZW5kaWYKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChNU0RPUykKKyMgIGRlZmluZSBNU0RPUworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE1TRE9TKSAmJiAhZGVmaW5lZChHRVRQSURfSVNfTUVBTklOR0xFU1MpCisjICBkZWZpbmUgR0VUUElEX0lTX01FQU5JTkdMRVNTCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjZGVmaW5lIGdldF9sYXN0X3N5c19lcnJvcigpCUdldExhc3RFcnJvcigpCisjZGVmaW5lIGNsZWFyX3N5c19lcnJvcigpCVNldExhc3RFcnJvcigwKQorI2lmICFkZWZpbmVkKFdJTk5UKQorI2RlZmluZSBXSU5fQ09OU09MRV9CVUcKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgZ2V0X2xhc3Rfc3lzX2Vycm9yKCkJZXJybm8KKyNkZWZpbmUgY2xlYXJfc3lzX2Vycm9yKCkJZXJybm89MAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdJTkRPV1MpCisjZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpCVdTQUdldExhc3RFcnJvcigpCisjZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpCVdTQVNldExhc3RFcnJvcigwKQorI2RlZmluZSByZWFkc29ja2V0KHMsYixuKQlyZWN2KChzKSwoYiksKG4pLDApCisjZGVmaW5lIHdyaXRlc29ja2V0KHMsYixuKQlzZW5kKChzKSwoYiksKG4pLDApCisjZWxpZiBkZWZpbmVkKF9fREpHUFBfXykKKyNkZWZpbmUgV0FUVDMyCisjZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpCWVycm5vCisjZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpCWVycm5vPTAKKyNkZWZpbmUgY2xvc2Vzb2NrZXQocykJCWNsb3NlX3MocykKKyNkZWZpbmUgcmVhZHNvY2tldChzLGIsbikJcmVhZF9zKHMsYixuKQorI2RlZmluZSB3cml0ZXNvY2tldChzLGIsbikJc2VuZChzLGIsbiwwKQorI2VsaWYgZGVmaW5lZChNQUNfT1NfcHJlX1gpCisjZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpCWVycm5vCisjZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpCWVycm5vPTAKKyNkZWZpbmUgY2xvc2Vzb2NrZXQocykJCU1hY1NvY2tldF9jbG9zZShzKQorI2RlZmluZSByZWFkc29ja2V0KHMsYixuKQlNYWNTb2NrZXRfcmVjdigocyksKGIpLChuKSx0cnVlKQorI2RlZmluZSB3cml0ZXNvY2tldChzLGIsbikJTWFjU29ja2V0X3NlbmQoKHMpLChiKSwobikpCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZNUykKKyNkZWZpbmUgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkgZXJybm8KKyNkZWZpbmUgY2xlYXJfc29ja2V0X2Vycm9yKCkgICAgZXJybm89MAorI2RlZmluZSBpb2N0bHNvY2tldChhLGIsYykgICAgICBpb2N0bChhLGIsYykKKyNkZWZpbmUgY2xvc2Vzb2NrZXQocykgICAgICAgICAgY2xvc2UocykKKyNkZWZpbmUgcmVhZHNvY2tldChzLGIsbikgICAgICAgcmVjdigocyksKGIpLChuKSwwKQorI2RlZmluZSB3cml0ZXNvY2tldChzLGIsbikgICAgICBzZW5kKChzKSwoYiksKG4pLDApCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1ZYV09SS1MpCisjZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpCWVycm5vCisjZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpCWVycm5vPTAKKyNkZWZpbmUgaW9jdGxzb2NrZXQoYSxiLGMpCSAgICBpb2N0bCgoYSksKGIpLChpbnQpKGMpKQorI2RlZmluZSBjbG9zZXNvY2tldChzKQkJICAgIGNsb3NlKHMpCisjZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pCSAgICByZWFkKChzKSwoYiksKG4pKQorI2RlZmluZSB3cml0ZXNvY2tldChzLGIsbikJICAgIHdyaXRlKChzKSwoY2hhciAqKShiKSwobikpCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0JFT1NfUjUpCisjZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpIGVycm5vCisjZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpICAgIGVycm5vPTAKKyNkZWZpbmUgRklPTkJJTyBTT19OT05CTE9DSworI2RlZmluZSBpb2N0bHNvY2tldChhLGIsYykJCSAgc2V0c29ja29wdCgoYSksU09MX1NPQ0tFVCwoYiksKGMpLHNpemVvZigqKGMpKSkKKyNkZWZpbmUgcmVhZHNvY2tldChzLGIsbikgICAgICAgcmVjdigocyksKGIpLChuKSwwKQorI2RlZmluZSB3cml0ZXNvY2tldChzLGIsbikgICAgICBzZW5kKChzKSwoYiksKG4pLDApCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisjaWYgZGVmaW5lZChORVRXQVJFX0JTRFNPQ0spCisjZGVmaW5lIGdldF9sYXN0X3NvY2tldF9lcnJvcigpIGVycm5vCisjZGVmaW5lIGNsZWFyX3NvY2tldF9lcnJvcigpICAgIGVycm5vPTAKKyNkZWZpbmUgY2xvc2Vzb2NrZXQocykgICAgICAgICAgY2xvc2UocykKKyNkZWZpbmUgaW9jdGxzb2NrZXQoYSxiLGMpICAgICAgaW9jdGwoYSxiLGMpCisjaWYgZGVmaW5lZChORVRXQVJFX0xJQkMpCisjZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pICAgICAgIHJlY3YoKHMpLChiKSwobiksMCkKKyNkZWZpbmUgd3JpdGVzb2NrZXQocyxiLG4pICAgICAgc2VuZCgocyksKGIpLChuKSwwKQorI2Vsc2UKKyNkZWZpbmUgcmVhZHNvY2tldChzLGIsbikgICAgICAgcmVjdigocyksKGNoYXIqKShiKSwobiksMCkKKyNkZWZpbmUgd3JpdGVzb2NrZXQocyxiLG4pICAgICAgc2VuZCgocyksKGNoYXIqKShiKSwobiksMCkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgZ2V0X2xhc3Rfc29ja2V0X2Vycm9yKCkJV1NBR2V0TGFzdEVycm9yKCkKKyNkZWZpbmUgY2xlYXJfc29ja2V0X2Vycm9yKCkJV1NBU2V0TGFzdEVycm9yKDApCisjZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pCQlyZWN2KChzKSwoYiksKG4pLDApCisjZGVmaW5lIHdyaXRlc29ja2V0KHMsYixuKQkJc2VuZCgocyksKGIpLChuKSwwKQorI2VuZGlmCisjZWxzZQorI2RlZmluZSBnZXRfbGFzdF9zb2NrZXRfZXJyb3IoKQllcnJubworI2RlZmluZSBjbGVhcl9zb2NrZXRfZXJyb3IoKQllcnJubz0wCisjZGVmaW5lIGlvY3Rsc29ja2V0KGEsYixjKQlpb2N0bChhLGIsYykKKyNkZWZpbmUgY2xvc2Vzb2NrZXQocykJCWNsb3NlKHMpCisjZGVmaW5lIHJlYWRzb2NrZXQocyxiLG4pCXJlYWQoKHMpLChiKSwobikpCisjZGVmaW5lIHdyaXRlc29ja2V0KHMsYixuKQl3cml0ZSgocyksKGIpLChuKSkKKyNlbmRpZgorCisjaWZkZWYgV0lOMTYgLyogbmV2ZXIgdGhlIGNhc2UgKi8KKyMgIGRlZmluZSBNU19DQUxMQkFDSwlfZmFyIF9sb2FkZHMKKyMgIGRlZmluZSBNU19GQVIJX2ZhcgorI2Vsc2UKKyMgIGRlZmluZSBNU19DQUxMQkFDSworIyAgZGVmaW5lIE1TX0ZBUgorI2VuZGlmCisKKyNpZmRlZiBPUEVOU1NMX05PX1NURElPCisjICB1bmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorIyAgZGVmaW5lIE9QRU5TU0xfTk9fRlBfQVBJCisjZW5kaWYKKworI2lmIChkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoTVNET1MpKQorCisjICBpZmRlZiBfX0RKR1BQX18KKyMgICAgaW5jbHVkZSA8dW5pc3RkLmg+CisjICAgIGluY2x1ZGUgPHN5cy9zdGF0Lmg+CisjICAgIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgICAgaW5jbHVkZSA8dGNwLmg+CisjICAgIGluY2x1ZGUgPG5ldGRiLmg+CisjICAgIGRlZmluZSBfc2V0bW9kZSBzZXRtb2RlCisjICAgIGRlZmluZSBfT19URVhUIE9fVEVYVAorIyAgICBkZWZpbmUgX09fQklOQVJZIE9fQklOQVJZCisjICAgIHVuZGVmIERFVlJBTkRPTQorIyAgICBkZWZpbmUgREVWUkFORE9NICIvZGV2L3VyYW5kb21ceDI0IgorIyAgZW5kaWYgLyogX19ESkdQUF9fICovCisKKyMgIGlmbmRlZiBTX0lGRElSCisjICAgIGRlZmluZSBTX0lGRElSCV9TX0lGRElSCisjICBlbmRpZgorCisjICBpZm5kZWYgU19JRk1UCisjICAgIGRlZmluZSBTX0lGTVQJX1NfSUZNVAorIyAgZW5kaWYKKworIyAgaWYgIWRlZmluZWQoV0lOTlQpICYmICFkZWZpbmVkKF9fREpHUFBfXykKKyMgICAgZGVmaW5lIE5PX1NZU0xPRworIyAgZW5kaWYKKyMgIGRlZmluZSBOT19ESVJFTlQKKworIyAgaWZkZWYgV0lORE9XUworIyAgICBpZiAhZGVmaW5lZChfV0lOMzJfV0NFKSAmJiAhZGVmaW5lZChfV0lOMzJfV0lOTlQpCisgICAgICAgLyoKKwkqIERlZmluaW5nIF9XSU4zMl9XSU5OVCBoZXJlIGluIGVfb3MuaCBpbXBsaWVzIGNlcnRhaW4gImRpc2NpcGxpbmUuIgorCSogTW9zdCBub3RhYmx5IHdlIG91Z2h0IHRvIGNoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgZWFjaCBzcGVjaWZpYworCSogcm91dGluZSB3aXRoIEdldFByb2NBZGRyZXNzKCkgYW5kL29yIGd1YXJkIE5ULXNwZWNpZmljIGNhbGxzIHdpdGgKKwkqIEdldFZlcnNpb24oKSA8IDB4ODAwMDAwMDAuIE9uZSBjYW4gYXJndWUgdGhhdCBpbiBsYXR0ZXIgIm9yIiBjYXNlCisJKiB3ZSBvdWdodCB0byAvREVMQVlMT0FEIHNvbWUgLkRMTHMgaW4gb3JkZXIgdG8gcHJvdGVjdCBvdXJzZWx2ZXMKKwkqIGFnYWluc3QgcnVuLXRpbWUgbGluayBlcnJvcnMuIFRoaXMgZG9lc24ndCBzZWVtIHRvIGJlIG5lY2Vzc2FyeSwKKwkqIGJlY2F1c2UgaXQgdHVybmVkIG91dCB0aGF0IGFscmVhZHkgV2luZG93cyA5NSwgZmlyc3Qgbm9uLU5UIFdpbjMyCisJKiBpbXBsZW1lbnRhdGlvbiwgaXMgZXF1aXBwZWQgd2l0aCBhdCBsZWFzdCBOVCAzLjUxIHN0dWJzLCBkdW1teQorCSogcm91dGluZXMgd2l0aCBzYW1lIG5hbWUsIGJ1dCB3aGljaCBkbyBub3RoaW5nLiBNZWFuaW5nIHRoYXQgaXQncworCSogYXBwYXJlbnRseSBzdWZmaWNpZW50IHRvIGd1YXJkICJ2YW5pbGxhIiBOVCBjYWxscyB3aXRoIEdldFZlcnNpb24KKwkqIGFsb25lLCB3aGlsZSBOVCA0LjAgYW5kIGFib3ZlIGludGVyZmFjZXMgb3VnaHQgdG8gYmUgbGlua2VkIHdpdGgKKwkqIEdldFByb2NBZGRyZXNzIGF0IHJ1bi10aW1lLgorCSovCisjICAgICAgZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA0MDAKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TT0NLKSAmJiBkZWZpbmVkKF9XSU4zMl9XSU5OVCkKKyAgICAgICAvKgorICAgICAgICAqIEp1c3QgbGlrZSBkZWZpbmluZyBfV0lOMzJfV0lOTlQgaW5jbHVkaW5nIHdpbnNvY2syLmggaW1wbGllcworICAgICAgICAqIGNlcnRhaW4gImRpc2NpcGxpbmUiIGZvciBtYWludGFpbmluZyBbYnJvYWRdIGJpbmFyeSBjb21wYXRpYmlsaXR5LgorICAgICAgICAqIEFzIGxvbmcgYXMgc3RydWN0dXJlcyBhcmUgaW52YXJpYW50IGFtb25nIFdpbnNvY2sgdmVyc2lvbnMsCisgICAgICAgICogaXQncyBzdWZmaWNpZW50IHRvIGNoZWNrIGZvciBzcGVjaWZpYyBXaW5zb2NrMiBBUEkgYXZhaWxhYmlsaXR5CisgICAgICAgICogYXQgcnVuLXRpbWUgW0RTT19nbG9iYWxfbG9va3VwIGlzIHJlY29tbWVuZGVkXS4uLgorICAgICAgICAqLworIyAgICAgIGluY2x1ZGUgPHdpbnNvY2syLmg+CisjICAgICAgaW5jbHVkZSA8d3MydGNwaXAuaD4KKyAgICAgICAvKiB5ZXMsIHRoZXkgaGF2ZSB0byBiZSAjaW5jbHVkZWQgcHJpb3IgdG8gPHdpbmRvd3MuaD4gKi8KKyMgICAgZW5kaWYKKyMgICAgaW5jbHVkZSA8d2luZG93cy5oPgorIyAgICBpbmNsdWRlIDxzdGRpby5oPgorIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4KKyMgICAgaW5jbHVkZSA8ZXJybm8uaD4KKyMgICAgaW5jbHVkZSA8c3RyaW5nLmg+CisjICAgIGlmZGVmIF9XSU42NAorIyAgICAgIGRlZmluZSBzdHJsZW4ocykgX3N0cmxlbjMxKHMpCisvKiBjdXQgc3RyaW5ncyB0byAyR0IgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX3N0cmxlbjMxKGNvbnN0IGNoYXIgKnN0cikKKwl7CisJdW5zaWduZWQgaW50IGxlbj0wOworCXdoaWxlICgqc3RyICYmIGxlbjwweDgwMDAwMDAwVSkgc3RyKyssIGxlbisrOworCXJldHVybiBsZW4mMHg3RkZGRkZGRjsKKwl9CisjICAgIGVuZGlmCisjICAgIGluY2x1ZGUgPG1hbGxvYy5oPgorIyAgICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUjw9MTIwMCAmJiBkZWZpbmVkKF9NVCkgJiYgZGVmaW5lZChpc3NwYWNlKQorICAgICAgIC8qIGNvbXBlbnNhdGUgZm9yIGJ1ZyBpbiBWQzYgY3R5cGUuaCAqLworIyAgICAgIHVuZGVmIGlzc3BhY2UKKyMgICAgICB1bmRlZiBpc2RpZ2l0CisjICAgICAgdW5kZWYgaXNhbG51bQorIyAgICAgIHVuZGVmIGlzdXBwZXIKKyMgICAgICB1bmRlZiBpc3hkaWdpdAorIyAgICBlbmRpZgorIyAgICBpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfRExMKSAmJiBkZWZpbmVkKHN0ZGluKQorIyAgICAgIGlmIF9NU0NfVkVSPj0xMzAwCisjICAgICAgICB1bmRlZiBzdGRpbgorIyAgICAgICAgdW5kZWYgc3Rkb3V0CisjICAgICAgICB1bmRlZiBzdGRlcnIKKyAgICAgICAgIEZJTEUgKl9faW9iX2Z1bmMoKTsKKyMgICAgICAgIGRlZmluZSBzdGRpbiAgKCZfX2lvYl9mdW5jKClbMF0pCisjICAgICAgICBkZWZpbmUgc3Rkb3V0ICgmX19pb2JfZnVuYygpWzFdKQorIyAgICAgICAgZGVmaW5lIHN0ZGVyciAoJl9faW9iX2Z1bmMoKVsyXSkKKyMgICAgICBlbGlmIGRlZmluZWQoSV9DQU5fTElWRV9XSVRIX0xOSzQwNDkpCisjICAgICAgICB1bmRlZiBzdGRpbgorIyAgICAgICAgdW5kZWYgc3Rkb3V0CisjICAgICAgICB1bmRlZiBzdGRlcnIKKyAgICAgICAgIC8qIHByZS0xMzAwIGhhcyBfX3BfX2lvYigpLCBidXQgaXQncyBhdmFpbGFibGUgb25seSBpbiBtc3ZjcnQubGliLAorICAgICAgICAgICogb3IgaW4gb3RoZXIgd29yZHMgd2l0aCAvTUQuIERlY2xhcmluZyBpbXBsaWNpdCBpbXBvcnQsIGkuZS4KKyAgICAgICAgICAqIHdpdGggX2ltcF8gcHJlZml4LCB3b3JrcyBjb3JyZWN0bHkgd2l0aCBhbGwgY29tcGlsZXIgb3B0aW9ucywKKwkgICogYnV0IHdpdGhvdXQgL01EIHJlc3VsdHMgaW4gTElOSyB3YXJuaW5nIExOSzQwNDk6CisJICAqICdsb2NhbGx5IGRlZmluZWQgc3ltYm9sICJfX2lvYiIgaW1wb3J0ZWQnLgorICAgICAgICAgICovCisgICAgICAgICBleHRlcm4gRklMRSAqX2ltcF9fX2lvYjsKKyMgICAgICAgIGRlZmluZSBzdGRpbiAgKCZfaW1wX19faW9iWzBdKQorIyAgICAgICAgZGVmaW5lIHN0ZG91dCAoJl9pbXBfX19pb2JbMV0pCisjICAgICAgICBkZWZpbmUgc3RkZXJyICgmX2ltcF9fX2lvYlsyXSkKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGluY2x1ZGUgPGlvLmg+CisjICBpbmNsdWRlIDxmY250bC5oPgorCisjICBpZmRlZiBPUEVOU1NMX1NZU19XSU5DRQorIyAgICBkZWZpbmUgT1BFTlNTTF9OT19QT1NJWF9JTworIyAgZW5kaWYKKworIyAgZGVmaW5lIHNzaXplX3QgbG9uZworCisjICBpZiBkZWZpbmVkIChfX0JPUkxBTkRDX18pCisjICAgIGRlZmluZSBfc2V0bW9kZSBzZXRtb2RlCisjICAgIGRlZmluZSBfT19URVhUIE9fVEVYVAorIyAgICBkZWZpbmUgX09fQklOQVJZIE9fQklOQVJZCisjICAgIGRlZmluZSBfaW50NjQgX19pbnQ2NAorIyAgICBkZWZpbmUgX2tiaGl0IGtiaGl0CisjICBlbmRpZgorCisjICBkZWZpbmUgRVhJVChuKSBleGl0KG4pCisjICBkZWZpbmUgTElTVF9TRVBBUkFUT1JfQ0hBUiAnOycKKyMgIGlmbmRlZiBYX09LCisjICAgIGRlZmluZSBYX09LCTAKKyMgIGVuZGlmCisjICBpZm5kZWYgV19PSworIyAgICBkZWZpbmUgV19PSwkyCisjICBlbmRpZgorIyAgaWZuZGVmIFJfT0sKKyMgICAgZGVmaW5lIFJfT0sJNAorIyAgZW5kaWYKKyMgIGRlZmluZSBPUEVOU1NMX0NPTkYJIm9wZW5zc2wuY25mIgorIyAgZGVmaW5lIFNTTEVBWV9DT05GCU9QRU5TU0xfQ09ORgorIyAgZGVmaW5lIE5VTF9ERVYJIm51bCIKKyMgIGRlZmluZSBSRklMRQkJIi5ybmQiCisjICBpZmRlZiBPUEVOU1NMX1NZU19XSU5DRQorIyAgICBkZWZpbmUgREVGQVVMVF9IT01FICAiIgorIyAgZWxzZQorIyAgICBkZWZpbmUgREVGQVVMVF9IT01FICAiQzoiCisjICBlbmRpZgorCisjZWxzZSAvKiBUaGUgbm9uLW1pY3Jvc29mdCB3b3JsZCAqLworCisjICBpZmRlZiBPUEVOU1NMX1NZU19WTVMKKyMgICAgZGVmaW5lIFZNUyAxCisgIC8qIHNvbWUgcHJvZ3JhbXMgZG9uJ3QgaW5jbHVkZSBzdGRsaWIsIHNvIGV4aXQoKSBhbmQgb3RoZXJzIGdpdmUgaW1wbGljaXQgCisgICAgIGZ1bmN0aW9uIHdhcm5pbmdzICovCisjICAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorIyAgICBpZiBkZWZpbmVkKF9fREVDQykKKyMgICAgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgPHVuaXhsaWIuaD4KKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIE9QRU5TU0xfQ09ORgkib3BlbnNzbC5jbmYiCisjICAgIGRlZmluZSBTU0xFQVlfQ09ORgkJT1BFTlNTTF9DT05GCisjICAgIGRlZmluZSBSRklMRQkJIi5ybmQiCisjICAgIGRlZmluZSBMSVNUX1NFUEFSQVRPUl9DSEFSICcsJworIyAgICBkZWZpbmUgTlVMX0RFVgkJIk5MQTA6IgorICAvKiBXZSBkb24ndCBoYXZlIGFueSB3ZWxsLWRlZmluZWQgcmFuZG9tIGRldmljZXMgb24gVk1TLCB5ZXQuLi4gKi8KKyMgICAgdW5kZWYgREVWUkFORE9NCisgIC8qIFdlIG5lZWQgdG8gZG8gdGhpcyBzaW5jZSBWTVMgaGFzIHRoZSBmb2xsb3dpbmcgY29kaW5nIG9uIHN0YXR1cyBjb2RlczoKKworICAgICBCaXRzIDAtMjogc3RhdHVzIHR5cGU6IDAgPSB3YXJuaW5nLCAxID0gc3VjY2VzcywgMiA9IGVycm9yLCAzID0gaW5mbyAuLi4KKyAgICAgICAgICAgICAgIFRoZSBpbXBvcnRhbnQgdGhpbmcgdG8ga25vdyBpcyB0aGF0IG9kZCBudW1iZXJzIGFyZSBjb25zaWRlcmVkCisJICAgICAgIGdvb2QsIHdoaWxlIGV2ZW4gb25lcyBhcmUgY29uc2lkZXJlZCBlcnJvcnMuCisgICAgIEJpdHMgMy0xNTogYWN0dWFsIHN0YXR1cyBudW1iZXIKKyAgICAgQml0cyAxNi0yNzogZmFjaWxpdHkgbnVtYmVyLiAgMCBpcyBjb25zaWRlcmVkICJ1bmtub3duIgorICAgICBCaXRzIDI4LTMxOiBjb250cm9sIGJpdHMuICBJZiBiaXQgMjggaXMgc2V0LCB0aGUgc2hlbGwgd29uJ3QgdHJ5IHRvCisgICAgICAgICAgICAgICAgIG91dHB1dCB0aGUgbWVzc2FnZSAod2hpY2gsIGZvciByYW5kb20gY29kZXMsIGp1c3QgbG9va3MgdWdseSkKKworICAgICBTbywgd2hhdCB3ZSBkbyBoZXJlIGlzIHRvIGNoYW5nZSAwIHRvIDEgdG8gZ2V0IHRoZSBkZWZhdWx0IHN1Y2Nlc3Mgc3RhdHVzLAorICAgICBhbmQgZXZlcnl0aGluZyBlbHNlIGlzIHNoaWZ0ZWQgdXAgdG8gZml0IGludG8gdGhlIHN0YXR1cyBudW1iZXIgZmllbGQsIGFuZAorICAgICB0aGUgc3RhdHVzIGlzIHRhZ2dlZCBhcyBhbiBlcnJvciwgd2hpY2ggSSBiZWxpZXZlIGlzIHdoYXQgaXMgd2FudGVkIGhlcmUuCisgICAgIC0tIFJpY2hhcmQgTGV2aXR0ZQorICAqLworIyAgICBkZWZpbmUgRVhJVChuKQkJZG8geyBpbnQgX19WTVNfRVhJVCA9IG47IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19WTVNfRVhJVCA9PSAwKSBcCisJCQkJICAgICAgIF9fVk1TX0VYSVQgPSAxOyBcCisJCQkJICAgICBlbHNlIFwKKwkJCQkgICAgICAgX19WTVNfRVhJVCA9IChuIDw8IDMpIHwgMjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fVk1TX0VYSVQgfD0gMHgxMDAwMDAwMDsgXAorCQkJCSAgICAgZXhpdChfX1ZNU19FWElUKTsgfSB3aGlsZSgwKQorIyAgICBkZWZpbmUgTk9fU1lTX1BBUkFNX0gKKworIyAgZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisjICAgIGluY2x1ZGUgPGZjbnRsLmg+CisjICAgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgICBkZWZpbmUgTk9fU1lTX1RZUEVTX0gKKyMgICAgdW5kZWYgIERFVlJBTkRPTQorIyAgICBpZmRlZiBORVRXQVJFX0NMSUIKKyMgICAgICBkZWZpbmUgZ2V0cGlkIEdldFRocmVhZElECisgICAgICAgZXh0ZXJuIGludCBHZXRUaHJlYWRJRCh2b2lkKTsKKy8qICMgICAgICBpbmNsdWRlIDxjb25pby5oPiAqLworICAgICAgIGV4dGVybiBpbnQga2JoaXQodm9pZCk7CisjICAgIGVsc2UKKyMgICAgICBpbmNsdWRlIDxzY3JlZW4uaD4KKyMgICAgZW5kaWYKKyMgICAgZGVmaW5lIE5PX1NZU0xPRworIyAgICBkZWZpbmUgX3NldG1vZGUgc2V0bW9kZQorIyAgICBkZWZpbmUgX2tiaGl0IGtiaGl0CisjICAgIGRlZmluZSBfT19URVhUIE9fVEVYVAorIyAgICBkZWZpbmUgX09fQklOQVJZIE9fQklOQVJZCisjICAgIGRlZmluZSBPUEVOU1NMX0NPTkYgICAib3BlbnNzbC5jbmYiCisjICAgIGRlZmluZSBTU0xFQVlfQ09ORiAgICBPUEVOU1NMX0NPTkYKKyMgICAgZGVmaW5lIFJGSUxFICAgICIucm5kIgorIyAgICBkZWZpbmUgTElTVF9TRVBBUkFUT1JfQ0hBUiAnOycKKyMgICAgZGVmaW5lIEVYSVQobikgIHsgaWYgKG4pIHByaW50ZigiRVJST1I6ICVkXG4iLCAoaW50KW4pOyBleGl0KG4pOyB9CisKKyMgIGVsc2UKKyAgICAgLyogIWRlZmluZWQgVk1TICovCisjICAgIGlmZGVmIE9QRU5TU0xfU1lTX01QRQorIyAgICAgIGRlZmluZSBOT19TWVNfUEFSQU1fSAorIyAgICBlbmRpZgorIyAgICBpZmRlZiBPUEVOU1NMX1VOSVNURAorIyAgICAgIGluY2x1ZGUgT1BFTlNTTF9VTklTVEQKKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyAgICBlbmRpZgorIyAgICBpZm5kZWYgTk9fU1lTX1RZUEVTX0gKKyMgICAgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgICAgZW5kaWYKKyMgICAgaWYgZGVmaW5lZChOZVhUKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX05FV1M0KQorIyAgICAgIGRlZmluZSBwaWRfdCBpbnQgLyogcGlkX3QgaXMgbWlzc2luZyBvbiBORVhUU1RFUC9PUEVOU1RFUAorICAgICAgICAgICAgICAgICAgICAgICAgICogKHVubGVzcyB3aGVuIGNvbXBpbGluZyB3aXRoIC1EX1BPU0lYX1NPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIGRvZXNuJ3Qgd29yayBmb3IgdXMpICovCisjICAgIGVuZGlmCisjICAgIGlmIGRlZmluZWQoTmVYVCkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19ORVdTNCkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19TVU5PUykKKyMgICAgICBkZWZpbmUgc3NpemVfdCBpbnQgLyogZGl0dG8gKi8KKyMgICAgZW5kaWYKKyMgICAgaWZkZWYgT1BFTlNTTF9TWVNfTkVXUzQgLyogc2V0dmJ1ZiBpcyBtaXNzaW5nIG9uIG1pcHMtc29ueS1ic2QgKi8KKyMgICAgICBkZWZpbmUgc2V0dmJ1ZihhLCBiLCBjLCBkKSBzZXRidWZmZXIoKGEpLCAoYiksIChkKSkKKyAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgY2xvY2tfdDsKKyMgICAgZW5kaWYKKyMgICAgaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzJfQ1lHV0lOCisjICAgICAgaW5jbHVkZSA8aW8uaD4KKyMgICAgICBpbmNsdWRlIDxmY250bC5oPgorIyAgICBlbmRpZgorCisjICAgIGRlZmluZSBPUEVOU1NMX0NPTkYJIm9wZW5zc2wuY25mIgorIyAgICBkZWZpbmUgU1NMRUFZX0NPTkYJCU9QRU5TU0xfQ09ORgorIyAgICBkZWZpbmUgUkZJTEUJCSIucm5kIgorIyAgICBkZWZpbmUgTElTVF9TRVBBUkFUT1JfQ0hBUiAnOicKKyMgICAgZGVmaW5lIE5VTF9ERVYJCSIvZGV2L251bGwiCisjICAgIGRlZmluZSBFWElUKG4pCQlleGl0KG4pCisjICBlbmRpZgorCisjICBkZWZpbmUgU1NMZWF5X2dldHBpZCgpCWdldHBpZCgpCisKKyNlbmRpZgorCisKKy8qKioqKioqKioqKioqLworCisjaWZkZWYgVVNFX1NPQ0tFVFMKKyMgIGlmIGRlZmluZWQoV0lORE9XUykgfHwgZGVmaW5lZChNU0RPUykKKyAgICAgIC8qIHdpbmRvd3Mgd29ybGQgKi8KKworIyAgICBpZmRlZiBPUEVOU1NMX05PX1NPQ0sKKyMgICAgICBkZWZpbmUgU1NMZWF5X1dyaXRlKGEsYixjKQkoLTEpCisjICAgICAgZGVmaW5lIFNTTGVheV9SZWFkKGEsYixjKQkoLTEpCisjICAgICAgZGVmaW5lIFNIVVRET1dOKGZkKQkJY2xvc2UoZmQpCisjICAgICAgZGVmaW5lIFNIVVRET1dOMihmZCkJCWNsb3NlKGZkKQorIyAgICBlbGlmICFkZWZpbmVkKF9fREpHUFBfXykKKyMgICAgICBpZiBkZWZpbmVkKF9XSU4zMl9XQ0UpICYmIF9XSU4zMl9XQ0U8NDEwCisjICAgICAgICBkZWZpbmUgZ2V0c2VydmJ5bmFtZSBfbWFza2VkX2RlY2xhcmF0aW9uX2dldHNlcnZieW5hbWUKKyMgICAgICBlbmRpZgorIyAgICAgIGlmICFkZWZpbmVkKElQUFJPVE9fSVApCisgICAgICAgICAvKiB3aW5zb2NrWzJdLmggd2FzIGluY2x1ZGVkIGFscmVhZHk/ICovCisjICAgICAgICBpbmNsdWRlIDx3aW5zb2NrLmg+CisjICAgICAgZW5kaWYKKyMgICAgICBpZmRlZiBnZXRzZXJ2YnluYW1lCisjICAgICAgICB1bmRlZiBnZXRzZXJ2YnluYW1lCisgICAgICAgICAvKiB0aGlzIGlzIHVzZWQgdG8gYmUgd2NlY29tcGF0L2luY2x1ZGUvd2luc29ja19leHRyYXMuaCAqLworICAgICAgICAgc3RydWN0IHNlcnZlbnQqIFBBU0NBTCBnZXRzZXJ2YnluYW1lKGNvbnN0IGNoYXIqLGNvbnN0IGNoYXIqKTsKKyMgICAgICBlbmRpZgorCisjICAgICAgaWZkZWYgX1dJTjY0CisvKgorICogRXZlbiB0aG91Z2ggc2l6ZW9mKFNPQ0tFVCkgaXMgOCwgaXQncyBzYWZlIHRvIGNhc3QgaXQgdG8gaW50LCBiZWNhdXNlCisgKiB0aGUgdmFsdWUgY29uc3RpdHV0ZXMgYW4gaW5kZXggaW4gcGVyLXByb2Nlc3MgdGFibGUgb2YgbGltaXRlZCBzaXplCisgKiBhbmQgbm90IGEgcmVhbCBwb2ludGVyLgorICovCisjICAgICAgICBkZWZpbmUgc29ja2V0KGQsdCxwKQkoKGludClzb2NrZXQoZCx0LHApKQorIyAgICAgICAgZGVmaW5lIGFjY2VwdChzLGYsbCkJKChpbnQpYWNjZXB0KHMsZixsKSkKKyMgICAgICBlbmRpZgorIyAgICAgIGRlZmluZSBTU0xlYXlfV3JpdGUoYSxiLGMpCXNlbmQoKGEpLChiKSwoYyksMCkKKyMgICAgICBkZWZpbmUgU1NMZWF5X1JlYWQoYSxiLGMpCXJlY3YoKGEpLChiKSwoYyksMCkKKyMgICAgICBkZWZpbmUgU0hVVERPV04oZmQpCQl7IHNodXRkb3duKChmZCksMCk7IGNsb3Nlc29ja2V0KGZkKTsgfQorIyAgICAgIGRlZmluZSBTSFVURE9XTjIoZmQpCQl7IHNodXRkb3duKChmZCksMik7IGNsb3Nlc29ja2V0KGZkKTsgfQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIFNTTGVheV9Xcml0ZShhLGIsYykJd3JpdGVfcyhhLGIsYywwKQorIyAgICAgIGRlZmluZSBTU0xlYXlfUmVhZChhLGIsYykJcmVhZF9zKGEsYixjKQorIyAgICAgIGRlZmluZSBTSFVURE9XTihmZCkJCWNsb3NlX3MoZmQpCisjICAgICAgZGVmaW5lIFNIVVRET1dOMihmZCkJCWNsb3NlX3MoZmQpCisjICAgIGVuZGlmCisKKyMgIGVsaWYgZGVmaW5lZChNQUNfT1NfcHJlX1gpCisKKyMgICAgaW5jbHVkZSAiTWFjU29ja2V0LmgiCisjICAgIGRlZmluZSBTU0xlYXlfV3JpdGUoYSxiLGMpCQlNYWNTb2NrZXRfc2VuZCgoYSksKGIpLChjKSkKKyMgICAgZGVmaW5lIFNTTGVheV9SZWFkKGEsYixjKQkJTWFjU29ja2V0X3JlY3YoKGEpLChiKSwoYyksdHJ1ZSkKKyMgICAgZGVmaW5lIFNIVVRET1dOKGZkKQkJTWFjU29ja2V0X2Nsb3NlKGZkKQorIyAgICBkZWZpbmUgU0hVVERPV04yKGZkKQkJTWFjU29ja2V0X2Nsb3NlKGZkKQorCisjICBlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkKKyAgICAgICAgIC8qIE5ldFdhcmUgdXNlcyB0aGUgV2luU29jazIgaW50ZXJmYWNlcyBieSBkZWZhdWx0LCBidXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIEJTRAorICAgICAgICAgKi8KKyMgICAgICBpZiBkZWZpbmVkKE5FVFdBUkVfQlNEU09DSykKKyMgICAgICAgIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgICAgICAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICAgICAgIGluY2x1ZGUgPHN5cy90aW1lLmg+CisjICAgICAgICBpZiBkZWZpbmVkKE5FVFdBUkVfQ0xJQikKKyMgICAgICAgICAgaW5jbHVkZSA8c3lzL2JzZHNrdC5oPgorIyAgICAgICAgZWxzZQorIyAgICAgICAgICBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjICAgICAgICBlbmRpZgorIyAgICAgICAgZGVmaW5lIElOVkFMSURfU09DS0VUIChpbnQpKH4wKQorIyAgICAgIGVsc2UKKyMgICAgICAgIGluY2x1ZGUgPG5vdnNvY2syLmg+CisjICAgICAgZW5kaWYKKyMgICAgICBkZWZpbmUgU1NMZWF5X1dyaXRlKGEsYixjKSAgIHNlbmQoKGEpLChiKSwoYyksMCkKKyMgICAgICBkZWZpbmUgU1NMZWF5X1JlYWQoYSxiLGMpIHJlY3YoKGEpLChiKSwoYyksMCkKKyMgICAgICBkZWZpbmUgU0hVVERPV04oZmQpICAgIHsgc2h1dGRvd24oKGZkKSwwKTsgY2xvc2Vzb2NrZXQoZmQpOyB9CisjICAgICAgZGVmaW5lIFNIVVRET1dOMihmZCkgICAgICB7IHNodXRkb3duKChmZCksMik7IGNsb3Nlc29ja2V0KGZkKTsgfQorCisjICBlbHNlCisKKyMgICAgaWZuZGVmIE5PX1NZU19QQVJBTV9ICisjICAgICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjICAgIGVuZGlmCisjICAgIGlmZGVmIE9QRU5TU0xfU1lTX1ZYV09SS1MKKyMgICAgICBpbmNsdWRlIDx0aW1lLmg+IAorIyAgICBlbGlmICFkZWZpbmVkKE9QRU5TU0xfU1lTX01QRSkKKyMgICAgICBpbmNsdWRlIDxzeXMvdGltZS5oPiAvKiBOZWVkZWQgdW5kZXIgbGludXggZm9yIEZEX1hYWCAqLworIyAgICBlbmRpZgorCisjICAgIGluY2x1ZGUgPG5ldGRiLmg+CisjICAgIGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TX05PREVDQykKKyMgICAgICBpbmNsdWRlIDxzb2NrZXQuaD4KKyMgICAgICBpbmNsdWRlIDxpbi5oPgorIyAgICAgIGluY2x1ZGUgPGluZXQuaD4KKyMgICAgZWxzZQorIyAgICAgIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgICAgICBpZmRlZiBGSUxJT19ICisjICAgICAgICBpbmNsdWRlIDxzeXMvZmlsaW8uaD4gLyogQWRkZWQgZm9yIEZJT05CSU8gdW5kZXIgdW5peHdhcmUgKi8KKyMgICAgICBlbmRpZgorIyAgICAgIGluY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyMgICAgICBpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19CRU9TX1I1KQorIyAgICAgIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorIyAgICBlbmRpZgorIyAgICBlbmRpZgorCisjICAgIGlmIGRlZmluZWQoTmVYVCkgfHwgZGVmaW5lZChfTkVYVF9TT1VSQ0UpCisjICAgICAgaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjICAgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICAgIGVuZGlmCisKKyMgICAgaWZkZWYgT1BFTlNTTF9TWVNfQUlYCisjICAgICAgaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorIyAgICBlbmRpZgorCisjICAgIGlmZGVmIF9fUU5YX18KKyMgICAgICBpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjICAgIGVuZGlmCisKKyMgICAgaWYgZGVmaW5lZChzdW4pCisjICAgICAgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CisjICAgIGVsc2UKKyMgICAgICBpZm5kZWYgVk1TCisjICAgICAgICBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyMgICAgICBlbHNlCisJIC8qIGlvY3RsIGlzIG9ubHkgaW4gVk1TID4gNy4wIGFuZCB3aGVuIHNvY2tldHNociBpcyBub3QgdXNlZCAqLworIyAgICAgICAgaWYgIWRlZmluZWQoVENQSVBfVFlQRV9TT0NLRVRTSFIpICYmIGRlZmluZWQoX19WTVNfVkVSKSAmJiAoX19WTVNfVkVSID4gNzAwMDAwMDApCisjICAgICAgICAgIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyAgICAgICAgZW5kaWYKKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorCisjICAgIGlmZGVmIFZNUworIyAgICAgIGluY2x1ZGUgPHVuaXhpby5oPgorIyAgICAgIGlmIGRlZmluZWQoVENQSVBfVFlQRV9TT0NLRVRTSFIpCisjICAgICAgICBpbmNsdWRlIDxzb2NrZXRzaHIuaD4KKyMgICAgICBlbmRpZgorIyAgICBlbmRpZgorCisjICAgIGRlZmluZSBTU0xlYXlfUmVhZChhLGIsYykgICAgIHJlYWQoKGEpLChiKSwoYykpCisjICAgIGRlZmluZSBTU0xlYXlfV3JpdGUoYSxiLGMpICAgIHdyaXRlKChhKSwoYiksKGMpKQorIyAgICBkZWZpbmUgU0hVVERPV04oZmQpICAgIHsgc2h1dGRvd24oKGZkKSwwKTsgY2xvc2Vzb2NrZXQoKGZkKSk7IH0KKyMgICAgZGVmaW5lIFNIVVRET1dOMihmZCkgICB7IHNodXRkb3duKChmZCksMik7IGNsb3Nlc29ja2V0KChmZCkpOyB9CisjICAgIGlmbmRlZiBJTlZBTElEX1NPQ0tFVAorIyAgICBkZWZpbmUgSU5WQUxJRF9TT0NLRVQJKC0xKQorIyAgICBlbmRpZiAvKiBJTlZBTElEX1NPQ0tFVCAqLworIyAgZW5kaWYKKworLyogU29tZSBJUHY2IGltcGxlbWVudGF0aW9ucyBhcmUgYnJva2VuLCBkaXNhYmxlIHRoZW0gaW4ga25vd24gYmFkCisgKiB2ZXJzaW9ucy4KKyAqLworIyAgaWYgIWRlZmluZWQoT1BFTlNTTF9VU0VfSVBWNikKKyMgICAgaWYgZGVmaW5lZChBRl9JTkVUNikgJiYgIWRlZmluZWQoT1BFTlNTTF9TWVNfQkVPU19CT05FKSAmJiAhZGVmaW5lZChORVRXQVJFX0NMSUIpCisjICAgICAgZGVmaW5lIE9QRU5TU0xfVVNFX0lQVjYgMQorIyAgICBlbHNlCisjICAgICAgZGVmaW5lIE9QRU5TU0xfVVNFX0lQVjYgMAorIyAgICBlbmRpZgorIyAgZW5kaWYKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fdWx0cml4KQorIyAgaWZuZGVmIHNzaXplX3QKKyMgICAgZGVmaW5lIHNzaXplX3QgaW50IAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChzdW4pICYmICFkZWZpbmVkKF9fc3ZyNF9fKSAmJiAhZGVmaW5lZChfX1NWUjQpCisgIC8qIGluY2x1ZGUgaGVhZGVycyBmaXJzdCwgc28gb3VyIGRlZmluZXMgZG9uJ3QgYnJlYWsgaXQgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyAgLyogYmNvcHkgY2FuIGhhbmRsZSBvdmVybGFwcGluZyBtb3ZlcyBhY2NvcmRpbmcgdG8gU3VuT1MgNC4xLjQgbWFucGFnZSAqLworIyBkZWZpbmUgbWVtbW92ZShzMSxzMixuKSBiY29weSgoczIpLChzMSksKG4pKQorIyBkZWZpbmUgc3RydG91bChzLGUsYikgKCh1bnNpZ25lZCBsb25nIGludClzdHJ0b2woKHMpLChlKSwoYikpKQorZXh0ZXJuIGNoYXIgKnN5c19lcnJsaXN0W107IGV4dGVybiBpbnQgc3lzX25lcnI7CisjIGRlZmluZSBzdHJlcnJvcihlcnJudW0pIFwKKwkoKChlcnJudW0pPDAgfHwgKGVycm51bSk+PXN5c19uZXJyKSA/IE5VTEwgOiBzeXNfZXJybGlzdFtlcnJudW1dKQorICAvKiBCZWluZyBzaWduZWQgU3VuT1MgNC54IG1lbWNweSBicmVha3MgQVNOMV9PQkpFQ1QgdGFibGUgbG9va3VwICovCisjaW5jbHVkZSAiY3J5cHRvL29fc3RyLmgiCisjIGRlZmluZSBtZW1jbXAgT1BFTlNTTF9tZW1jbXAKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfRVhJVAorIyBpZiBkZWZpbmVkKE1PTk9MSVRIKSAmJiAhZGVmaW5lZChPUEVOU1NMX0MpCisjICBkZWZpbmUgT1BFTlNTTF9FWElUKG4pIHJldHVybihuKQorIyBlbHNlCisjICBkZWZpbmUgT1BFTlNTTF9FWElUKG4pIGRvIHsgRVhJVChuKTsgcmV0dXJuKG4pOyB9IHdoaWxlKDApCisjIGVuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERHX0dDQ19CVUcJLyogZ2NjIDwgMi42LjMgb24gREdVWCAqLworCisjaWZkZWYgc2dpCisjZGVmaW5lIElSSVhfQ0NfQlVHCS8qIGFsbCB2ZXJzaW9uIG9mIElSSVggSSd2ZSB0ZXN0ZWQgKDQuKiA1LiopICovCisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX1NZU19TTkkKKyNkZWZpbmUgSVJJWF9DQ19CVUcJLyogQ0RTKysgdXAgdG8gVjIuMEJzb21ldGhpbmcgc3VmZmVyZWQgZnJvbSB0aGUgc2FtZSBidWcuKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKQorIyAgZGVmaW5lIHN0cmNhc2VjbXAgX3N0cmljbXAKKyMgIGRlZmluZSBzdHJuY2FzZWNtcCBfc3RybmljbXAKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorLyogVk1TIGJlbG93IHZlcnNpb24gNy4wIGRvZXNuJ3QgaGF2ZSBzdHJjYXNlY21wKCkgKi8KKyMgIGluY2x1ZGUgIm9fc3RyLmgiCisjICBkZWZpbmUgc3RyY2FzZWNtcCBPUEVOU1NMX3N0cmNhc2VjbXAKKyMgIGRlZmluZSBzdHJuY2FzZWNtcCBPUEVOU1NMX3N0cm5jYXNlY21wCisjICBkZWZpbmUgT1BFTlNTTF9JTVBMRU1FTlRTX3N0cm5jYXNlY21wCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX09TMikgJiYgZGVmaW5lZChfX0VNWF9fKQorIyAgZGVmaW5lIHN0cmNhc2VjbXAgc3RyaWNtcAorIyAgZGVmaW5lIHN0cm5jYXNlY21wIHN0cm5pY21wCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisjICBpbmNsdWRlIDxzdHJpbmcuaD4KKyMgIGlmIGRlZmluZWQoTkVUV0FSRV9DTElCKQorIyAgICBkZWZpbmUgc3RyY2FzZWNtcCBzdHJpY21wCisjICAgIGRlZmluZSBzdHJuY2FzZWNtcCBzdHJuaWNtcAorIyAgZW5kaWYgLyogTkVUV0FSRV9DTElCICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfT1MyKSAmJiBkZWZpbmVkKF9fRU1YX18pCisjIGluY2x1ZGUgPGlvLmg+CisjIGluY2x1ZGUgPGZjbnRsLmg+CisjIGRlZmluZSBOT19TWVNMT0cKKyNlbmRpZgorCisvKiB2eHdvcmtzICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WWFdPUktTKQorI2luY2x1ZGUgPGlvTGliLmg+CisjaW5jbHVkZSA8dGlja0xpYi5oPgorI2luY2x1ZGUgPHN5c0xpYi5oPgorCisjZGVmaW5lIFRUWV9TVFJVQ1QgaW50CisKKyNkZWZpbmUgc2xlZXAoYSkgdGFza0RlbGF5KChhKSAqIHN5c0Nsa1JhdGVHZXQoKSkKKworI2luY2x1ZGUgPHZ4V29ya3MuaD4KKyNpbmNsdWRlIDxzb2NrTGliLmg+CisjaW5jbHVkZSA8dGFza0xpYi5oPgorCisjZGVmaW5lIGdldHBpZCB0YXNrSWRTZWxmCisKKy8qIE5PVEU6IHRoZXNlIGFyZSBpbXBsZW1lbnRlZCBieSBoZWxwZXJzIGluIGRhdGFiYXNlIGFwcCEKKyAqIGlmIHRoZSBkYXRhYmFzZSBpcyBub3QgbGlua2VkLCB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGVtCisgKiBlbHN3aGVyZSAqLworc3RydWN0IGhvc3RlbnQgKmdldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSk7CitzdHJ1Y3QgaG9zdGVudCAqZ2V0aG9zdGJ5YWRkcihjb25zdCBjaGFyICphZGRyLCBpbnQgbGVuZ3RoLCBpbnQgdHlwZSk7CitzdHJ1Y3Qgc2VydmVudCAqZ2V0c2VydmJ5bmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwcm90byk7CisKKyNlbmRpZgorLyogZW5kIHZ4d29ya3MgKi8KKworLyogYmVvcyAqLworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfQkVPU19SNSkKKyNkZWZpbmUgU09fRVJST1IgMAorI2RlZmluZSBOT19TWVNfVU4KKyNkZWZpbmUgSVBQUk9UT19JUCAwCisjaW5jbHVkZSA8T1MuaD4KKyNlbmRpZgorCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvZV9vczIuaCBiL2xpYi9vcGVuc3NsL2Vfb3MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3ODVjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2Vfb3MyLmgKQEAgLTAsMCArMSwyODkgQEAKKy8qIGVfb3MyLmggKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZuZGVmIEhFQURFUl9FX09TMl9ICisjZGVmaW5lIEhFQURFUl9FX09TMl9ICisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIERldGVjdCBvcGVyYXRpbmcgc3lzdGVtcy4gIFRoaXMgcHJvYmFibHkgbmVlZHMgY29tcGxldGluZy4KKyAqIFRoZSByZXN1bHQgaXMgdGhhdCBhdCBsZWFzdCBvbmUgT1BFTlNTTF9TWVNfb3MgbWFjcm8gc2hvdWxkIGJlIGRlZmluZWQuCisgKiBIb3dldmVyLCBpZiBub25lIGlzIGRlZmluZWQsIFVuaXggaXMgYXNzdW1lZC4KKyAqKi8KKworI2RlZmluZSBPUEVOU1NMX1NZU19VTklYCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY2ludG9zaCwgYmVmb3JlIE1hY09TIFggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIGRlZmluZWQobWFjaW50b3NoKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTTkFNRV9NQUMpCisjIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX01BQ0lOVE9TSF9DTEFTU0lDCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTmV0V2FyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoTkVUV0FSRSkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfTkVUV0FSRSkKKyMgdW5kZWYgT1BFTlNTTF9TWVNfVU5JWAorIyBkZWZpbmUgT1BFTlNTTF9TWVNfTkVUV0FSRQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWljcm9zb2Z0IG9wZXJhdGluZyBzeXN0ZW1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTm90ZSB0aGF0IE1TRE9TIGFjdHVhbGx5IGRlbm90ZXMgMzItYml0IGVudmlyb25tZW50cyBydW5uaW5nIG9uIHRvcCBvZgorICAgTVMtRE9TLCBzdWNoIGFzIERKR1BQIG9uZS4gKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTTkFNRV9NU0RPUykKKyMgdW5kZWYgT1BFTlNTTF9TWVNfVU5JWAorIyBkZWZpbmUgT1BFTlNTTF9TWVNfTVNET1MKKyNlbmRpZgorCisvKiBGb3IgMzIgYml0IGVudmlyb25tZW50LCB0aGVyZSBzZWVtcyB0byBiZSB0aGUgQ3lnV2luIGVudmlyb25tZW50IGFuZCB0aGVuCisgICBhbGwgdGhlIG90aGVycyB0aGF0IHRyeSB0byBkbyB0aGUgc2FtZSB0aGluZyBNaWNyb3NvZnQgZG9lcy4uLiAqLworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX1VXSU4pCisjIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX1dJTjMyX1VXSU4KKyNlbHNlCisjIGlmIGRlZmluZWQoX19DWUdXSU4zMl9fKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTTkFNRV9DWUdXSU4zMikKKyMgIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19XSU4zMl9DWUdXSU4KKyMgZWxzZQorIyAgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX1dJTjMyKQorIyAgIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgICBkZWZpbmUgT1BFTlNTTF9TWVNfV0lOMzIKKyMgIGVuZGlmCisjICBpZiBkZWZpbmVkKE9QRU5TU0xfU1lTTkFNRV9XSU5OVCkKKyMgICB1bmRlZiBPUEVOU1NMX1NZU19VTklYCisjICAgZGVmaW5lIE9QRU5TU0xfU1lTX1dJTk5UCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfV0lOQ0UpCisjICAgdW5kZWYgT1BFTlNTTF9TWVNfVU5JWAorIyAgIGRlZmluZSBPUEVOU1NMX1NZU19XSU5DRQorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBBbnl0aGluZyB0aGF0IHRyaWVzIHRvIGxvb2sgbGlrZSBNaWNyb3NvZnQgaXMgIldpbmRvd3MiICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5OVCkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5DRSkKKyMgdW5kZWYgT1BFTlNTTF9TWVNfVU5JWAorIyBkZWZpbmUgT1BFTlNTTF9TWVNfV0lORE9XUworIyBpZm5kZWYgT1BFTlNTTF9TWVNfTVNET1MKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19NU0RPUworIyBlbmRpZgorI2VuZGlmCisKKy8qIERMTCBzZXR0aW5ncy4gIFRoaXMgcGFydCBpcyBhIGJpdCB0b3VnaCwgYmVjYXVzZSBpdCdzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbgorICAgaW1wbGVtZW50b3IgaG93IGhlIG9yIHNoZSB3aWxsIGxpbmsgdGhlIGFwcGxpY2F0aW9uLCBzbyBpdCByZXF1aXJlcyBzb21lCisgICBtYWNybyB0byBiZSB1c2VkLiAqLworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTkRPV1MKKyMgaWZuZGVmIE9QRU5TU0xfT1BUX1dJTkRMTAorIyAgaWYgZGVmaW5lZChfV0lORExMKSAvKiBUaGlzIGlzIHVzZWQgd2hlbiBidWlsZGluZyBPcGVuU1NMIHRvIGluZGljYXRlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRExMIGxpbmthZ2Ugc2hvdWxkIGJlIHVzZWQgKi8KKyMgICBkZWZpbmUgT1BFTlNTTF9PUFRfV0lORExMCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wZW5WTVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKF9fVk1TKSB8fCBkZWZpbmVkKFZNUykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfVk1TKQorIyB1bmRlZiBPUEVOU1NMX1NZU19VTklYCisjIGRlZmluZSBPUEVOU1NMX1NZU19WTVMKKyMgaWYgZGVmaW5lZChfX0RFQ0MpCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfVk1TX0RFQ0MKKyMgZWxpZiBkZWZpbmVkKF9fREVDQ1hYKQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX1ZNU19ERUNDCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfVk1TX0RFQ0NYWAorIyBlbHNlCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfVk1TX05PREVDQworIyBlbmRpZgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPUy8yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKF9fRU1YX18pIHx8IGRlZmluZWQoX19PUzJfXykKKyMgdW5kZWYgT1BFTlNTTF9TWVNfVU5JWAorIyBkZWZpbmUgT1BFTlNTTF9TWVNfT1MyCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVuaXggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChfX2xpbnV4X18pIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX0xJTlVYKQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX0xJTlVYCisjIGVuZGlmCisjIGlmZGVmIE9QRU5TU0xfU1lTTkFNRV9NUEUKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19NUEUKKyMgZW5kaWYKKyMgaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1NOSQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX1NOSQorIyBlbmRpZgorIyBpZmRlZiBPUEVOU1NMX1NZU05BTUVfVUxUUkFTUEFSQworIyAgZGVmaW5lIE9QRU5TU0xfU1lTX1VMVFJBU1BBUkMKKyMgZW5kaWYKKyMgaWZkZWYgT1BFTlNTTF9TWVNOQU1FX05FV1M0CisjICBkZWZpbmUgT1BFTlNTTF9TWVNfTkVXUzQKKyMgZW5kaWYKKyMgaWZkZWYgT1BFTlNTTF9TWVNOQU1FX01BQ09TWAorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX01BQ09TWAorIyBlbmRpZgorIyBpZmRlZiBPUEVOU1NMX1NZU05BTUVfTUFDT1NYX1JIQVBTT0RZCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfTUFDT1NYX1JIQVBTT0RZCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfTUFDT1NYCisjIGVuZGlmCisjIGlmZGVmIE9QRU5TU0xfU1lTTkFNRV9TVU5PUworIyAgZGVmaW5lIE9QRU5TU0xfU1lTX1NVTk9TCisjZW5kaWYKKyMgaWYgZGVmaW5lZChfQ1JBWSkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfQ1JBWSkKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19DUkFZCisjIGVuZGlmCisjIGlmIGRlZmluZWQoX0FJWCkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfQUlYKQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX0FJWAorIyBlbmRpZgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWT1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBPUEVOU1NMX1NZU05BTUVfVk9TCisjIGRlZmluZSBPUEVOU1NMX1NZU19WT1MKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZ4V29ya3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1ZYV09SS1MKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX1ZYV09SS1MKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQmVPUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChfX0JFT1NfXykKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX0JFT1MKKyMgaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorIyBpZiBkZWZpbmVkKEJPTkVfVkVSU0lPTikKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19CRU9TX0JPTkUKKyMgZWxzZQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX0JFT1NfUjUKKyMgZW5kaWYKKyNlbmRpZgorCisvKioKKyAqIFRoYXQncyBpdCBmb3IgT1Mtc3BlY2lmaWMgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBTcGVjaWFscyBmb3IgSS9PIGFuIGV4aXQgKi8KKyNpZmRlZiBPUEVOU1NMX1NZU19NU0RPUworIyBkZWZpbmUgT1BFTlNTTF9VTklTVERfSU8gPGlvLmg+CisjIGRlZmluZSBPUEVOU1NMX0RFQ0xBUkVfRVhJVCBleHRlcm4gdm9pZCBleGl0KGludCk7CisjZWxzZQorIyBkZWZpbmUgT1BFTlNTTF9VTklTVERfSU8gT1BFTlNTTF9VTklTVEQKKyMgZGVmaW5lIE9QRU5TU0xfREVDTEFSRV9FWElUIC8qIGRlY2xhcmVkIGluIHVuaXN0ZC5oICovCisjZW5kaWYKKworLyogRGVmaW5pdGlvbnMgb2YgT1BFTlNTTF9HTE9CQUwgYW5kIE9QRU5TU0xfRVhURVJOLCB0byBkZWZpbmUgYW5kIGRlY2xhcmUKKyAgIGNlcnRhaW4gZ2xvYmFsIHN5bWJvbHMgdGhhdCwgd2l0aCBzb21lIGNvbXBpbGVycyB1bmRlciBWTVMsIGhhdmUgdG8gYmUKKyAgIGRlZmluZWQgYW5kIGRlY2xhcmVkIGV4cGxpY2l0ZWx5IHdpdGggZ2xvYmFsZGVmIGFuZCBnbG9iYWxyZWYuCisgICBEZWZpbml0aW9ucyBvZiBPUEVOU1NMX0VYUE9SVCBhbmQgT1BFTlNTTF9JTVBPUlQsIHRvIGRlZmluZSBhbmQgZGVjbGFyZQorICAgRExMIGV4cG9ydHMgYW5kIGltcG9ydHMgZm9yIGNvbXBpbGVycyB1bmRlciBXaW4zMi4gIFRoZXNlIGFyZSBhIGxpdHRsZQorICAgbW9yZSBjb21wbGljYXRlZCB0byB1c2UuICBCYXNpY2FsbHksIGZvciBhbnkgbGlicmFyeSB0aGF0IGV4cG9ydHMgc29tZQorICAgZ2xvYmFsIHZhcmlhYmxlcywgdGhlIGZvbGxvd2luZyBjb2RlIG11c3QgYmUgcHJlc2VudCBpbiB0aGUgaGVhZGVyIGZpbGUKKyAgIHRoYXQgZGVjbGFyZXMgdGhlbSwgYmVmb3JlIE9QRU5TU0xfRVhURVJOIGlzIHVzZWQ6CisKKyAgICNpZmRlZiBTT01FX0JVSUxEX0ZMQUdfTUFDUk8KKyAgICMgdW5kZWYgT1BFTlNTTF9FWFRFUk4KKyAgICMgZGVmaW5lIE9QRU5TU0xfRVhURVJOIE9QRU5TU0xfRVhQT1JUCisgICAjZW5kaWYKKworICAgVGhlIGRlZmF1bHQgaXMgdG8gaGF2ZSBPUEVOU1NMX0VYUE9SVCwgT1BFTlNTTF9JTVBPUlQgYW5kIE9QRU5TU0xfR0xPQkFMCisgICBoYXZlIHNvbWUgZ2VuZXJhbGx5IHNlbnNpYmxlIHZhbHVlcywgYW5kIGZvciBPUEVOU1NMX0VYVEVSTiB0byBoYXZlIHRoZQorICAgdmFsdWUgT1BFTlNTTF9JTVBPUlQuCisqLworCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVNfTk9ERUNDKQorIyBkZWZpbmUgT1BFTlNTTF9FWFBPUlQgZ2xvYmFscmVmCisjIGRlZmluZSBPUEVOU1NMX0lNUE9SVCBnbG9iYWxyZWYKKyMgZGVmaW5lIE9QRU5TU0xfR0xPQkFMIGdsb2JhbGRlZgorI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSAmJiBkZWZpbmVkKE9QRU5TU0xfT1BUX1dJTkRMTCkKKyMgZGVmaW5lIE9QRU5TU0xfRVhQT1JUIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgZGVmaW5lIE9QRU5TU0xfSU1QT1JUIGV4dGVybiBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgZGVmaW5lIE9QRU5TU0xfR0xPQkFMCisjZWxzZQorIyBkZWZpbmUgT1BFTlNTTF9FWFBPUlQgZXh0ZXJuCisjIGRlZmluZSBPUEVOU1NMX0lNUE9SVCBleHRlcm4KKyMgZGVmaW5lIE9QRU5TU0xfR0xPQkFMCisjZW5kaWYKKyNkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9JTVBPUlQKKworLyogTWFjcm9zIHRvIGFsbG93IGdsb2JhbCB2YXJpYWJsZXMgdG8gYmUgcmVhY2hlZCB0aHJvdWdoIGZ1bmN0aW9uIGNhbGxzIHdoZW4KKyAgIHJlcXVpcmVkIChpZiBhIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gcmVxdWlyZXMgaXQsIGZvciBleGFtcGxlLgorICAgVGhlIHdheSBpdCdzIGRvbmUgYWxsb3dzIGRlZmluaXRpb25zIGxpa2UgdGhpczoKKworCS8vIGluIGZvb2Jhci5jCisJT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKGludCxmb29iYXIsMCkKKwkvLyBpbiBmb29iYXIuaAorCU9QRU5TU0xfREVDTEFSRV9HTE9CQUwoaW50LGZvb2Jhcik7CisJI2RlZmluZSBmb29iYXIgT1BFTlNTTF9HTE9CQUxfUkVGKGZvb2JhcikKKyovCisjaWZkZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisjIGRlZmluZSBPUEVOU1NMX0lNUExFTUVOVF9HTE9CQUwodHlwZSxuYW1lLHZhbHVlKQkJCVwKKwl0eXBlICpfc2hhZG93XyMjbmFtZSh2b2lkKQkJCQkJXAorCXsgc3RhdGljIHR5cGUgX2hpZGVfIyNuYW1lPXZhbHVlOyByZXR1cm4gJl9oaWRlXyMjbmFtZTsgfQorIyBkZWZpbmUgT1BFTlNTTF9ERUNMQVJFX0dMT0JBTCh0eXBlLG5hbWUpIHR5cGUgKl9zaGFkb3dfIyNuYW1lKHZvaWQpCisjIGRlZmluZSBPUEVOU1NMX0dMT0JBTF9SRUYobmFtZSkgKCooX3NoYWRvd18jI25hbWUoKSkpCisjZWxzZQorIyBkZWZpbmUgT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKHR5cGUsbmFtZSx2YWx1ZSkgT1BFTlNTTF9HTE9CQUwgdHlwZSBfc2hhZG93XyMjbmFtZT12YWx1ZTsKKyMgZGVmaW5lIE9QRU5TU0xfREVDTEFSRV9HTE9CQUwodHlwZSxuYW1lKSBPUEVOU1NMX0VYUE9SVCB0eXBlIF9zaGFkb3dfIyNuYW1lCisjIGRlZmluZSBPUEVOU1NMX0dMT0JBTF9SRUYobmFtZSkgX3NoYWRvd18jI25hbWUKKyNlbmRpZgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW1wb3J0X29wZW5zc2wuc2ggYi9saWIvb3BlbnNzbC9pbXBvcnRfb3BlbnNzbC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjYwMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW1wb3J0X29wZW5zc2wuc2gKQEAgLTAsMCArMSwyNjggQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjCisjIFRoaXMgc2NyaXB0IGltcG9ydHMgbmV3IHZlcnNpb25zIG9mIE9wZW5TU0wgKGh0dHA6Ly9vcGVuc3NsLm9yZy9zb3VyY2UpIGludG8gdGhlCisjIEFuZHJvaWQgc291cmNlIHRyZWUuICBUbyBydW4sICgxKSBmZXRjaCB0aGUgYXBwcm9wcmlhdGUgdGFyYmFsbCBmcm9tIHRoZSBPcGVuU1NMIHJlcG9zaXRvcnksCisjICgyKSBjaGVjayB0aGUgZ3BnL3BncCBzaWduYXR1cmUsIGFuZCB0aGVuICgzKSBydW46CisjICAgLi9pbXBvcnRfb3BlbnNzbC5zaCBpbXBvcnQgb3BlbnNzbC0qLnRhci5negorIworIyBJTVBPUlRBTlQ6IFNlZSBSRUFETUUuYW5kcm9pZCBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorCisjIHR1cm4gb24gZXhpdCBvbiBlcnJvciBhcyB3ZWxsIGFzIGEgd2FybmluZyB3aGVuIGl0IGhhcHBlbnMKK3NldCAtZQordHJhcCAgImVjaG8gV0FSTklORzogRXhpdGluZyBvbiBub24temVybyBzdWJwcm9jZXNzIGV4aXQgY29kZSIgRVJSOworCitmdW5jdGlvbiBkaWUoKSB7CisgIGRlY2xhcmUgLXIgbWVzc2FnZT0kMQorCisgIGVjaG8gJG1lc3NhZ2UKKyAgZXhpdCAxCit9CisKK2Z1bmN0aW9uIHVzYWdlKCkgeworICBkZWNsYXJlIC1yIG1lc3NhZ2U9JDEKKworICBpZiBbICEgIiRtZXNzYWdlIiA9ICIiIF07IHRoZW4KKyAgICBlY2hvICRtZXNzYWdlCisgIGZpCisgIGVjaG8gIlVzYWdlOiIKKyAgZWNobyAiICAuL2ltcG9ydF9vcGVuc3NsLnNoIGltcG9ydCA8L3BhdGgvdG8vb3BlbnNzbC0qLnRhci5nej4iCisgIGVjaG8gIiAgLi9pbXBvcnRfb3BlbnNzbC5zaCByZWdlbmVyYXRlIDxwYXRjaC8qLnBhdGNoPiIKKyAgZWNobyAiICAuL2ltcG9ydF9vcGVuc3NsLnNoIGdlbmVyYXRlIDxwYXRjaC8qLnBhdGNoPiA8L3BhdGgvdG8vb3BlbnNzbC0qLnRhci5nej4iCisgIGV4aXQgMQorfQorCitmdW5jdGlvbiBtYWluKCkgeworICBpZiBbICEgLWQgcGF0Y2hlcyBdOyB0aGVuCisgICAgZGllICJPcGVuU1NMIHBhdGNoIGRpcmVjdG9yeSBwYXRjaGVzLyBub3QgZm91bmQiCisgIGZpCisKKyAgaWYgWyAhIC1mIG9wZW5zc2wudmVyc2lvbiBdOyB0aGVuCisgICAgZGllICJvcGVuc3NsLnZlcnNpb24gbm90IGZvdW5kIgorICBmaQorCisgIHNvdXJjZSBvcGVuc3NsLnZlcnNpb24KKyAgaWYgWyAiJE9QRU5TU0xfVkVSU0lPTiIgPT0gIiIgXTsgdGhlbgorICAgIGRpZSAiSW52YWxpZCBvcGVuc3NsLnZlcnNpb247IHNlZSBSRUFETUUuYW5kcm9pZCBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKKyAgZmkKKworICBPUEVOU1NMX0RJUj1vcGVuc3NsLSRPUEVOU1NMX1ZFUlNJT04KKyAgT1BFTlNTTF9ESVJfT1JJRz0kT1BFTlNTTF9ESVIub3JpZworCisgIGlmIFsgISAtZiBvcGVuc3NsLmNvbmZpZyBdOyB0aGVuCisgICAgZGllICJvcGVuc3NsLmNvbmZpZyBub3QgZm91bmQiCisgIGZpCisKKyAgc291cmNlIG9wZW5zc2wuY29uZmlnCisgIGlmIFsgIiRDT05GSUdVUkVfQVJHUyIgPT0gIiIgLW8gIiRVTk5FRURFRF9TT1VSQ0VTIiA9PSAiIiAtbyAiJE5FRURFRF9TT1VSQ0VTIiA9PSAiIiBdOyB0aGVuCisgICAgZGllICJJbnZhbGlkIG9wZW5zc2wuY29uZmlnOyBzZWUgUkVBRE1FLmFuZHJvaWQgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgIGZpCisKKyAgZGVjbGFyZSAtciBjb21tYW5kPSQxCisgIHNoaWZ0IHx8IHVzYWdlICJObyBjb21tYW5kIHNwZWNpZmllZC4gVHJ5IGltcG9ydCwgcmVnZW5lcmF0ZSwgb3IgZ2VuZXJhdGUuIgorICBpZiBbICIkY29tbWFuZCIgPSAiaW1wb3J0IiBdOyB0aGVuCisgICAgZGVjbGFyZSAtciB0YXI9JDEKKyAgICBzaGlmdCB8fCB1c2FnZSAiTm8gdGFyIGZpbGUgc3BlY2lmaWVkLiIKKyAgICBpbXBvcnQgJHRhcgorICBlbGlmIFsgIiRjb21tYW5kIiA9ICJyZWdlbmVyYXRlIiBdOyB0aGVuCisgICAgZGVjbGFyZSAtciBwYXRjaD0kMQorICAgIHNoaWZ0IHx8IHVzYWdlICJObyBwYXRjaCBmaWxlIHNwZWNpZmllZC4iCisgICAgWyAtZCAkT1BFTlNTTF9ESVIgXSB8fCB1c2FnZSAiJE9QRU5TU0xfRElSIG5vdCBmb3VuZCwgZGlkIHlvdSBtZWFuIHRvIHVzZSBnZW5lcmF0ZT8iCisgICAgWyAtZCAkT1BFTlNTTF9ESVJfT1JJR19PUklHIF0gfHwgdXNhZ2UgIiRPUEVOU1NMX0RJUl9PUklHIG5vdCBmb3VuZCwgZGlkIHlvdSBtZWFuIHRvIHVzZSBnZW5lcmF0ZT8iCisgICAgcmVnZW5lcmF0ZSAkcGF0Y2gKKyAgZWxpZiBbICIkY29tbWFuZCIgPSAiZ2VuZXJhdGUiIF07IHRoZW4KKyAgICBkZWNsYXJlIC1yIHBhdGNoPSQxCisgICAgc2hpZnQgfHwgdXNhZ2UgIk5vIHBhdGNoIGZpbGUgc3BlY2lmaWVkLiIKKyAgICBkZWNsYXJlIC1yIHRhcj0kMQorICAgIHNoaWZ0IHx8IHVzYWdlICJObyB0YXIgZmlsZSBzcGVjaWZpZWQuIgorICAgIGdlbmVyYXRlICRwYXRjaCAkdGFyCisgIGVsc2UKKyAgICB1c2FnZSAiVW5rbm93biBjb21tYW5kIHNwZWNpZmllZCAkY29tbWFuZC4gVHJ5IGltcG9ydCwgcmVnZW5lcmF0ZSwgb3IgZ2VuZXJhdGUuIgorICBmaQorfQorCitmdW5jdGlvbiBpbXBvcnQoKSB7CisgIGRlY2xhcmUgLXIgT1BFTlNTTF9TT1VSQ0U9JDEKKworICB1bnRhciAkT1BFTlNTTF9TT1VSQ0UgcmVhZG9ubHkKKyAgYXBwbHlwYXRjaGVzICRPUEVOU1NMX0RJUgorCisgIGNkICRPUEVOU1NMX0RJUgorCisgICMgQ29uZmlndXJlIHNvdXJjZSAoYW5kIHByaW50IE1ha2VmaWxlIGRlZmluZXMgZm9yIHJldmlldywgc2VlIFJFQURNRS5hbmRyb2lkKQorICAuL0NvbmZpZ3VyZSAkQ09ORklHVVJFX0FSR1MKKyAgcm0gLWYgYXBwcy9DQS5wbC5iYWsgY3J5cHRvL29wZW5zc2xjb25mLmguYmFrCisgIGVjaG8KKyAgZWNobyBCRUdJTiBNYWtlZmlsZSBkZWZpbmVzIHRvIGNvbXBhcmUgd2l0aCBhbmRyb2lkLWNvbmZpZy5taworICBlY2hvCisgIGdyZXAgLWUgLUQgTWFrZWZpbGUgfCBncmVwIC12IENPTkZJR1VSRV9BUkdTPSB8IGdyZXAgLXYgT1BUSU9OUz0gfCBncmVwIC12IC1lIC1ET1BFTlNTTF9OT19ERVBSRUNBVEVECisgIGVjaG8KKyAgZWNobyBFTkQgTWFrZWZpbGUgZGVmaW5lcyB0byBjb21wYXJlIHdpdGggYW5kcm9pZC1jb25maWcubWsKKyAgZWNobworCisgICMgVE9ETygpOiBGaXh1cCBhbmRyb2lkLWNvbmZpZy5taworCisgIGNwIC1mIExJQ0VOU0UgLi4vTk9USUNFCisgIHRvdWNoIC4uL01PRFVMRV9MSUNFTlNFX0JTRF9MSUtFCisKKyAgIyBBdm9pZCBjaGVja2luZyBpbiBzeW1saW5rcworICBmb3IgaSBpbiBgZmluZCBpbmNsdWRlL29wZW5zc2wgLXR5cGUgbGA7IGRvCisgICAgdGFyZ2V0PWByZWFkbGluayAkaWAKKyAgICBybSAtZiAkaQorICAgIGlmIFsgLWYgaW5jbHVkZS9vcGVuc3NsLyR0YXJnZXQgXTsgdGhlbgorICAgICAgY3AgaW5jbHVkZS9vcGVuc3NsLyR0YXJnZXQgJGkKKyAgICBmaQorICBkb25lCisKKyAgIyBDb3B5IE1ha2VmaWxlcworICBjcCAuLi9wYXRjaGVzL2FwcHNfQW5kcm9pZC5tayBhcHBzL0FuZHJvaWQubWsKKyAgY3AgLi4vcGF0Y2hlcy9jcnlwdG9fQW5kcm9pZC5tayBjcnlwdG8vQW5kcm9pZC5taworICBjcCAuLi9wYXRjaGVzL3NzbF9BbmRyb2lkLm1rIHNzbC9BbmRyb2lkLm1rCisKKyAgIyBHZW5lcmF0ZSBhc20KKyAgcGVybCBjcnlwdG8vYWVzL2FzbS9hZXMtYXJtdjQucGwgICAgICAgICA+IGNyeXB0by9hZXMvYXNtL2Flcy1hcm12NC5zCisgIHBlcmwgY3J5cHRvL2JuL2FzbS9hcm12NC1tb250LnBsICAgICAgICAgPiBjcnlwdG8vYm4vYXNtL2FybXY0LW1vbnQucworICBwZXJsIGNyeXB0by9zaGEvYXNtL3NoYTEtYXJtdjQtbGFyZ2UucGwgID4gY3J5cHRvL3NoYS9hc20vc2hhMS1hcm12NC1sYXJnZS5zCisgIHBlcmwgY3J5cHRvL3NoYS9hc20vc2hhMjU2LWFybXY0LnBsICAgICAgPiBjcnlwdG8vc2hhL2FzbS9zaGEyNTYtYXJtdjQucworICBwZXJsIGNyeXB0by9zaGEvYXNtL3NoYTUxMi1hcm12NC5wbCAgICAgID4gY3J5cHRvL3NoYS9hc20vc2hhNTEyLWFybXY0LnMKKworICAjIFNldHVwIGFuZHJvaWQudGVzdHNzbCBkaXJlY3RvcnkKKyAgbWtkaXIgYW5kcm9pZC50ZXN0c3NsCisgIGNhdCB0ZXN0L3Rlc3Rzc2wgfCBcCisgICAgc2VkICdzIy4uL3V0aWwvc2hsaWJfd3JhcC5zaCAuL3NzbHRlc3QjYWRiIHNoZWxsIC9zeXN0ZW0vYmluL3NzbHRlc3QjJyB8IFwKKyAgICBzZWQgJ3MjLi4vdXRpbC9zaGxpYl93cmFwLnNoIC4uL2FwcHMvb3BlbnNzbCNhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCMnIHwgXAorICAgIHNlZCAncyNhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCBuby1kaCNbIGBhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCBuby1kaGAgPSBuby1kaCBdIycgfCBcCisgICAgc2VkICdzI2FkYiBzaGVsbCAvc3lzdGVtL2Jpbi9vcGVuc3NsIG5vLXJzYSNbIGBhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCBuby1yc2FgID0gbm8tZGggXSMnIHwgXAorICAgIHNlZCAncyMuLi9hcHBzL3NlcnZlcjIucGVtIy9zZGNhcmQvYW5kcm9pZC50ZXN0c3NsL3NlcnZlcjIucGVtIycgfCBcCisgICAgY2F0ID4gXAorICAgIGFuZHJvaWQudGVzdHNzbC90ZXN0c3NsCisgIGNobW9kICt4IGFuZHJvaWQudGVzdHNzbC90ZXN0c3NsCisgIGNhdCB0ZXN0L1Vzcy5jbmYgfCBzZWQgJ3MjLi8ucm5kIy9zZGNhcmQvYW5kcm9pZC50ZXN0c3NsLy5ybmQjJyA+PiBhbmRyb2lkLnRlc3Rzc2wvVXNzLmNuZgorICBjYXQgdGVzdC9DQXNzLmNuZiB8IHNlZCAncyMuLy5ybmQjL3NkY2FyZC9hbmRyb2lkLnRlc3Rzc2wvLnJuZCMnID4+IGFuZHJvaWQudGVzdHNzbC9DQXNzLmNuZgorICBjcCBhcHBzL3NlcnZlcjIucGVtIGFuZHJvaWQudGVzdHNzbC8KKyAgY3AgLi4vcGF0Y2hlcy90ZXN0c3NsLnNoIGFuZHJvaWQudGVzdHNzbC8KKworICBjZCAuLgorCisgICMgUHJ1bmUgdW5uZWNlc3Nhcnkgc291cmNlcworICBwcnVuZQorCisgIE5FRURFRF9TT1VSQ0VTPSIkTkVFREVEX1NPVVJDRVMgYW5kcm9pZC50ZXN0c3NsIgorICBmb3IgaSBpbiAkTkVFREVEX1NPVVJDRVM7IGRvCisgICAgZWNobyAiVXBkYXRpbmcgJGkiCisgICAgcm0gLXIgJGkKKyAgICBtdiAkT1BFTlNTTF9ESVIvJGkgLgorICBkb25lCisKKyAgY2xlYW50YXIKK30KKworZnVuY3Rpb24gcmVnZW5lcmF0ZSgpIHsKKyAgZGVjbGFyZSAtciBwYXRjaD0kMQorCisgIGdlbmVyYXRlcGF0Y2ggJHBhdGNoCit9CisKK2Z1bmN0aW9uIGdlbmVyYXRlKCkgeworICBkZWNsYXJlIC1yIHBhdGNoPSQxCisgIGRlY2xhcmUgLXIgT1BFTlNTTF9TT1VSQ0U9JDIKKworICB1bnRhciAkT1BFTlNTTF9TT1VSQ0UKKyAgYXBwbHlwYXRjaGVzICRPUEVOU1NMX0RJUl9PUklHICRwYXRjaAorICBwcnVuZQorCisgIGZvciBpIGluICRORUVERURfU09VUkNFUzsgZG8KKyAgICBlY2hvICJSZXN0b3JpbmcgJGkiCisgICAgcm0gLXIgJE9QRU5TU0xfRElSLyRpCisgICAgY3AgLXJmICRpICRPUEVOU1NMX0RJUi8kaQorICBkb25lCisKKyAgZ2VuZXJhdGVwYXRjaCAkcGF0Y2gKKyAgY2xlYW50YXIKK30KKworZnVuY3Rpb24gdW50YXIoKSB7CisgIGRlY2xhcmUgLXIgT1BFTlNTTF9TT1VSQ0U9JDEKKyAgZGVjbGFyZSAtciByZWFkb25seT0kMgorCisgICMgUmVtb3ZlIG9sZCBzb3VyY2UKKyAgY2xlYW50YXIKKworICAjIFByb2Nlc3MgbmV3IHNvdXJjZQorICB0YXIgLXp4ZiAkT1BFTlNTTF9TT1VSQ0UKKyAgbXYgJE9QRU5TU0xfRElSICRPUEVOU1NMX0RJUl9PUklHCisgIGlmIFsgISAteiAkcmVhZG9ubHkgXTsgdGhlbgorICAgIGZpbmQgJE9QRU5TU0xfRElSX09SSUcgLXR5cGUgZiAtcHJpbnQwIHwgeGFyZ3MgLTAgY2htb2QgYS13CisgIGZpCisgIHRhciAtenhmICRPUEVOU1NMX1NPVVJDRQorfQorCitmdW5jdGlvbiBwcnVuZSgpIHsKKyAgZWNobyAiUmVtb3ZpbmcgJFVOTkVFREVEX1NPVVJDRVMiCisgIChjZCAkT1BFTlNTTF9ESVJfT1JJRyAmJiBybSAtcmYgJFVOTkVFREVEX1NPVVJDRVMpCisgIChjZCAkT1BFTlNTTF9ESVIgICAgICAmJiBybSAtciAgJFVOTkVFREVEX1NPVVJDRVMpCit9CisKK2Z1bmN0aW9uIGNsZWFudGFyKCkgeworICBybSAtcmYgJE9QRU5TU0xfRElSX09SSUcKKyAgcm0gLXJmICRPUEVOU1NMX0RJUgorfQorCitmdW5jdGlvbiBhcHBseXBhdGNoZXMgKCkgeworICBkZWNsYXJlIC1yIGRpcj0kMQorICBkZWNsYXJlIC1yIHNraXBfcGF0Y2g9JDIKKworICBjZCAkZGlyCisKKyAgIyBBcHBseSBhcHByb3ByaWF0ZSBwYXRjaGVzCisgIGZvciBpIGluICRPUEVOU1NMX1BBVENIRVM7IGRvCisgICAgaWYgWyAhICIkc2tpcF9wYXRjaCIgPSAicGF0Y2hlcy8kaSIgXTsgdGhlbgorICAgICAgZWNobyAiQXBwbHlpbmcgcGF0Y2ggJGkiCisgICAgICBwYXRjaCAtcDEgPCAuLi9wYXRjaGVzLyRpIHx8IGRpZSAiQ291bGQgbm90IGFwcGx5IHBhdGNoZXMvJGkuIEZpeCBzb3VyY2UgYW5kIHJ1bjogJDAgcmVnZW5lcmF0ZSBwYXRjaGVzLyRpIgorICAgIGVsc2UKKyAgICAgIGVjaG8gIlNraXBpbmcgcGF0Y2ggJGkiCisgICAgZmkKKworICBkb25lCisKKyAgIyBDbGVhbnVwIHBhdGNoIG91dHB1dAorICBmaW5kIC4gLXR5cGUgZiAtbmFtZSAiKi5vcmlnIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKworICBjZCAuLgorfQorCitmdW5jdGlvbiBnZW5lcmF0ZXBhdGNoKCkgeworICBkZWNsYXJlIC1yIHBhdGNoPSQxCisKKyAgIyBDbGVhbnVwIHN0cmF5IGZpbGVzIGJlZm9yZSBnZW5lcmF0aW5nIHBhdGNoCisgIGZpbmQgJEJPVU5DWUNBU1RMRV9ESVIgLXR5cGUgZiAtbmFtZSAiKi5vcmlnIiAtcHJpbnQwIHwgeGFyZ3MgLTAgcm0gLWYKKyAgZmluZCAkQk9VTkNZQ0FTVExFX0RJUiAtdHlwZSBmIC1uYW1lICIqfiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mCisKKyAgZGVjbGFyZSAtciB2YXJpYWJsZV9uYW1lPU9QRU5TU0xfUEFUQ0hFU19gYmFzZW5hbWUgJHBhdGNoIC5wYXRjaCB8IHNlZCBzLy0vXy9gX1NPVVJDRVMKKyAgIyBodHRwOi8vdGxkcC5vcmcvTERQL2Ficy9odG1sL2l2ci5odG1sCisgIGV2YWwgZGVjbGFyZSAtciBzb3VyY2VzPVwkJHZhcmlhYmxlX25hbWUKKyAgcm0gLWYgJHBhdGNoCisgIHRvdWNoICRwYXRjaAorICBmb3IgaSBpbiAkc291cmNlczsgZG8KKyAgICBMQ19BTEw9QyBUWj1VVEMwIGRpZmYgLWF1cCAkT1BFTlNTTF9ESVJfT1JJRy8kaSAkT1BFTlNTTF9ESVIvJGkgPj4gJHBhdGNoICYmIGRpZSAiRVJST1I6IE5vIGRpZmYgZm9yIHBhdGNoICRwYXRoIGluIGZpbGUgJGkiCisgIGRvbmUKKyAgZWNobyAiR2VuZXJhdGVkIHBhdGNoICRwYXRjaCIKKyAgZWNobyAiTk9URSBUbyBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vdCB1bndhbnRlZCBjaGFuZ2VzIGZyb20gY29uZmxpY3RpbmcgcGF0Y2hlcywgYmUgc3VyZSB0byByZXZpZXcgdGhlIGdlbmVyYXRlZCBwYXRjaC4iCit9CisKK21haW4gJEAKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9hZXMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9hZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmM5OTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2Flcy5oCkBAIC0wLDAgKzEsMTQyIEBACisvKiBjcnlwdG8vYWVzL2Flcy5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX0FFU19ICisjZGVmaW5lIEhFQURFUl9BRVNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19BRVMKKyNlcnJvciBBRVMgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIEFFU19FTkNSWVBUCTEKKyNkZWZpbmUgQUVTX0RFQ1JZUFQJMAorCisvKiBCZWNhdXNlIGFycmF5IHNpemUgY2FuJ3QgYmUgYSBjb25zdCBpbiBDLCB0aGUgZm9sbG93aW5nIHR3byBhcmUgbWFjcm9zLgorICAgQm90aCBzaXplcyBhcmUgaW4gYnl0ZXMuICovCisjZGVmaW5lIEFFU19NQVhOUiAxNAorI2RlZmluZSBBRVNfQkxPQ0tfU0laRSAxNgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGlzIHNob3VsZCBiZSBhIGhpZGRlbiB0eXBlLCBidXQgRVZQIHJlcXVpcmVzIHRoYXQgdGhlIHNpemUgYmUga25vd24gKi8KK3N0cnVjdCBhZXNfa2V5X3N0IHsKKyNpZmRlZiBBRVNfTE9ORworICAgIHVuc2lnbmVkIGxvbmcgcmRfa2V5WzQgKihBRVNfTUFYTlIgKyAxKV07CisjZWxzZQorICAgIHVuc2lnbmVkIGludCByZF9rZXlbNCAqKEFFU19NQVhOUiArIDEpXTsKKyNlbmRpZgorICAgIGludCByb3VuZHM7Cit9OwordHlwZWRlZiBzdHJ1Y3QgYWVzX2tleV9zdCBBRVNfS0VZOworCitjb25zdCBjaGFyICpBRVNfb3B0aW9ucyh2b2lkKTsKKworaW50IEFFU19zZXRfZW5jcnlwdF9rZXkoY29uc3QgdW5zaWduZWQgY2hhciAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisJQUVTX0tFWSAqa2V5KTsKK2ludCBBRVNfc2V0X2RlY3J5cHRfa2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzZXJLZXksIGNvbnN0IGludCBiaXRzLAorCUFFU19LRVkgKmtleSk7CisKK3ZvaWQgQUVTX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwljb25zdCBBRVNfS0VZICprZXkpOwordm9pZCBBRVNfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCWNvbnN0IEFFU19LRVkgKmtleSk7CisKK3ZvaWQgQUVTX2VjYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJY29uc3QgQUVTX0tFWSAqa2V5LCBjb25zdCBpbnQgZW5jKTsKK3ZvaWQgQUVTX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJc2l6ZV90IGxlbmd0aCwgY29uc3QgQUVTX0tFWSAqa2V5LAorCXVuc2lnbmVkIGNoYXIgKml2ZWMsIGNvbnN0IGludCBlbmMpOwordm9pZCBBRVNfY2ZiMTI4X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwlzaXplX3QgbGVuZ3RoLCBjb25zdCBBRVNfS0VZICprZXksCisJdW5zaWduZWQgY2hhciAqaXZlYywgaW50ICpudW0sIGNvbnN0IGludCBlbmMpOwordm9pZCBBRVNfY2ZiMV9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJc2l6ZV90IGxlbmd0aCwgY29uc3QgQUVTX0tFWSAqa2V5LAorCXVuc2lnbmVkIGNoYXIgKml2ZWMsIGludCAqbnVtLCBjb25zdCBpbnQgZW5jKTsKK3ZvaWQgQUVTX2NmYjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwl1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSwgY29uc3QgaW50IGVuYyk7Cit2b2lkIEFFU19vZmIxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwl1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSk7Cit2b2lkIEFFU19jdHIxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwl1bnNpZ25lZCBjaGFyIGl2ZWNbQUVTX0JMT0NLX1NJWkVdLAorCXVuc2lnbmVkIGNoYXIgZWNvdW50X2J1ZltBRVNfQkxPQ0tfU0laRV0sCisJdW5zaWduZWQgaW50ICpudW0pOworLyogTkI6IHRoZSBJViBpcyBfdHdvXyBibG9ja3MgbG9uZyAqLwordm9pZCBBRVNfaWdlX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJICAgICBzaXplX3QgbGVuZ3RoLCBjb25zdCBBRVNfS0VZICprZXksCisJCSAgICAgdW5zaWduZWQgY2hhciAqaXZlYywgY29uc3QgaW50IGVuYyk7CisvKiBOQjogdGhlIElWIGlzIF9mb3VyXyBibG9ja3MgbG9uZyAqLwordm9pZCBBRVNfYmlfaWdlX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW5ndGgsIGNvbnN0IEFFU19LRVkgKmtleSwKKwkJCWNvbnN0IEFFU19LRVkgKmtleTIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2ZWMsCisJCQljb25zdCBpbnQgZW5jKTsKKworaW50IEFFU193cmFwX2tleShBRVNfS0VZICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LAorCQl1bnNpZ25lZCBjaGFyICpvdXQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBpbnQgaW5sZW4pOworaW50IEFFU191bndyYXBfa2V5KEFFU19LRVkgKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsCisJCXVuc2lnbmVkIGNoYXIgKm91dCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGludCBpbmxlbik7CisKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhSEVBREVSX0FFU19IICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2FzbjEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzcxOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2FzbjEuaApAQCAtMCwwICsxLDE0MDIgQEAKKy8qIGNyeXB0by9hc24xL2FzbjEuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9BU04xX0gKKyNkZWZpbmUgSEVBREVSX0FTTjFfSAorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc2FmZXN0YWNrLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTworIyB1bmRlZiBPUEVOU1NMX0VYVEVSTgorIyBkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9FWFBPUlQKKyNlbmRpZgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFZfQVNOMV9VTklWRVJTQUwJCTB4MDAKKyNkZWZpbmUJVl9BU04xX0FQUExJQ0FUSU9OCQkweDQwCisjZGVmaW5lIFZfQVNOMV9DT05URVhUX1NQRUNJRklDCQkweDgwCisjZGVmaW5lIFZfQVNOMV9QUklWQVRFCQkJMHhjMAorCisjZGVmaW5lIFZfQVNOMV9DT05TVFJVQ1RFRAkJMHgyMAorI2RlZmluZSBWX0FTTjFfUFJJTUlUSVZFX1RBRwkJMHgxZgorI2RlZmluZSBWX0FTTjFfUFJJTUFUSVZFX1RBRwkJMHgxZgorCisjZGVmaW5lIFZfQVNOMV9BUFBfQ0hPT1NFCQktMgkvKiBsZXQgdGhlIHJlY2lwaWVudCBjaG9vc2UgKi8KKyNkZWZpbmUgVl9BU04xX09USEVSCQkJLTMJLyogdXNlZCBpbiBBU04xX1RZUEUgKi8KKyNkZWZpbmUgVl9BU04xX0FOWQkJCS00CS8qIHVzZWQgaW4gQVNOMSB0ZW1wbGF0ZSBjb2RlICovCisKKyNkZWZpbmUgVl9BU04xX05FRwkJCTB4MTAwCS8qIG5lZ2F0aXZlIGZsYWcgKi8KKworI2RlZmluZSBWX0FTTjFfVU5ERUYJCQktMQorI2RlZmluZSBWX0FTTjFfRU9DCQkJMAorI2RlZmluZSBWX0FTTjFfQk9PTEVBTgkJCTEJLyoqLworI2RlZmluZSBWX0FTTjFfSU5URUdFUgkJCTIKKyNkZWZpbmUgVl9BU04xX05FR19JTlRFR0VSCQkoMiB8IFZfQVNOMV9ORUcpCisjZGVmaW5lIFZfQVNOMV9CSVRfU1RSSU5HCQkzCisjZGVmaW5lIFZfQVNOMV9PQ1RFVF9TVFJJTkcJCTQKKyNkZWZpbmUgVl9BU04xX05VTEwJCQk1CisjZGVmaW5lIFZfQVNOMV9PQkpFQ1QJCQk2CisjZGVmaW5lIFZfQVNOMV9PQkpFQ1RfREVTQ1JJUFRPUgk3CisjZGVmaW5lIFZfQVNOMV9FWFRFUk5BTAkJCTgKKyNkZWZpbmUgVl9BU04xX1JFQUwJCQk5CisjZGVmaW5lIFZfQVNOMV9FTlVNRVJBVEVECQkxMAorI2RlZmluZSBWX0FTTjFfTkVHX0VOVU1FUkFURUQJCSgxMCB8IFZfQVNOMV9ORUcpCisjZGVmaW5lIFZfQVNOMV9VVEY4U1RSSU5HCQkxMgorI2RlZmluZSBWX0FTTjFfU0VRVUVOQ0UJCQkxNgorI2RlZmluZSBWX0FTTjFfU0VUCQkJMTcKKyNkZWZpbmUgVl9BU04xX05VTUVSSUNTVFJJTkcJCTE4CS8qKi8KKyNkZWZpbmUgVl9BU04xX1BSSU5UQUJMRVNUUklORwkJMTkKKyNkZWZpbmUgVl9BU04xX1Q2MVNUUklORwkJMjAKKyNkZWZpbmUgVl9BU04xX1RFTEVURVhTVFJJTkcJCTIwCS8qIGFsaWFzICovCisjZGVmaW5lIFZfQVNOMV9WSURFT1RFWFNUUklORwkJMjEJLyoqLworI2RlZmluZSBWX0FTTjFfSUE1U1RSSU5HCQkyMgorI2RlZmluZSBWX0FTTjFfVVRDVElNRQkJCTIzCisjZGVmaW5lIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUJCTI0CS8qKi8KKyNkZWZpbmUgVl9BU04xX0dSQVBISUNTVFJJTkcJCTI1CS8qKi8KKyNkZWZpbmUgVl9BU04xX0lTTzY0U1RSSU5HCQkyNgkvKiovCisjZGVmaW5lIFZfQVNOMV9WSVNJQkxFU1RSSU5HCQkyNgkvKiBhbGlhcyAqLworI2RlZmluZSBWX0FTTjFfR0VORVJBTFNUUklORwkJMjcJLyoqLworI2RlZmluZSBWX0FTTjFfVU5JVkVSU0FMU1RSSU5HCQkyOAkvKiovCisjZGVmaW5lIFZfQVNOMV9CTVBTVFJJTkcJCTMwCisKKy8qIEZvciB1c2Ugd2l0aCBkMmlfQVNOMV90eXBlX2J5dGVzKCkgKi8KKyNkZWZpbmUgQl9BU04xX05VTUVSSUNTVFJJTkcJMHgwMDAxCisjZGVmaW5lIEJfQVNOMV9QUklOVEFCTEVTVFJJTkcJMHgwMDAyCisjZGVmaW5lIEJfQVNOMV9UNjFTVFJJTkcJMHgwMDA0CisjZGVmaW5lIEJfQVNOMV9URUxFVEVYU1RSSU5HCTB4MDAwNAorI2RlZmluZSBCX0FTTjFfVklERU9URVhTVFJJTkcJMHgwMDA4CisjZGVmaW5lIEJfQVNOMV9JQTVTVFJJTkcJMHgwMDEwCisjZGVmaW5lIEJfQVNOMV9HUkFQSElDU1RSSU5HCTB4MDAyMAorI2RlZmluZSBCX0FTTjFfSVNPNjRTVFJJTkcJMHgwMDQwCisjZGVmaW5lIEJfQVNOMV9WSVNJQkxFU1RSSU5HCTB4MDA0MAorI2RlZmluZSBCX0FTTjFfR0VORVJBTFNUUklORwkweDAwODAKKyNkZWZpbmUgQl9BU04xX1VOSVZFUlNBTFNUUklORwkweDAxMDAKKyNkZWZpbmUgQl9BU04xX09DVEVUX1NUUklORwkweDAyMDAKKyNkZWZpbmUgQl9BU04xX0JJVF9TVFJJTkcJMHgwNDAwCisjZGVmaW5lIEJfQVNOMV9CTVBTVFJJTkcJMHgwODAwCisjZGVmaW5lIEJfQVNOMV9VTktOT1dOCQkweDEwMDAKKyNkZWZpbmUgQl9BU04xX1VURjhTVFJJTkcJMHgyMDAwCisjZGVmaW5lIEJfQVNOMV9VVENUSU1FCQkweDQwMDAKKyNkZWZpbmUgQl9BU04xX0dFTkVSQUxJWkVEVElNRQkweDgwMDAKKyNkZWZpbmUgQl9BU04xX1NFUVVFTkNFCQkweDEwMDAwCisKKy8qIEZvciB1c2Ugd2l0aCBBU04xX21ic3RyaW5nX2NvcHkoKSAqLworI2RlZmluZSBNQlNUUklOR19GTEFHCQkweDEwMDAKKyNkZWZpbmUgTUJTVFJJTkdfVVRGOAkJKE1CU1RSSU5HX0ZMQUcpCisjZGVmaW5lIE1CU1RSSU5HX0FTQwkJKE1CU1RSSU5HX0ZMQUd8MSkKKyNkZWZpbmUgTUJTVFJJTkdfQk1QCQkoTUJTVFJJTkdfRkxBR3wyKQorI2RlZmluZSBNQlNUUklOR19VTklWCQkoTUJTVFJJTkdfRkxBR3w0KQorCisjZGVmaW5lIFNNSU1FX09MRE1JTUUJCTB4NDAwCisjZGVmaW5lIFNNSU1FX0NSTEZFT0wJCTB4ODAwCisjZGVmaW5lIFNNSU1FX1NUUkVBTQkJMHgxMDAwCisKK3N0cnVjdCBYNTA5X2FsZ29yX3N0OworREVDTEFSRV9TVEFDS19PRihYNTA5X0FMR09SKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9TRVRfT0YodHlwZSkgLyogZmlsbGVkIGluIGJ5IG1rc3RhY2sucGwgKi8KKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfU0VUX09GKHR5cGUpIC8qIG5vdGhpbmcsIG5vIGxvbmdlciBuZWVkZWQgKi8KKworLyogV2UgTVVTVCBtYWtlIHN1cmUgdGhhdCwgZXhjZXB0IGZvciBjb25zdG5lc3MsIGFzbjFfY3R4X3N0IGFuZAorICAgYXNuMV9jb25zdF9jdHggYXJlIGV4YWN0bHkgdGhlIHNhbWUuICBGb3J0dW5hdGVseSwgYXMgc29vbiBhcworICAgdGhlIG9sZCBBU04xIHBhcnNpbmcgbWFjcm9zIGFyZSBnb25lLCB3ZSBjYW4gdGhyb3cgdGhpcyBhd2F5CisgICBhcyB3ZWxsLi4uICovCit0eXBlZGVmIHN0cnVjdCBhc24xX2N0eF9zdAorCXsKKwl1bnNpZ25lZCBjaGFyICpwOy8qIHdvcmsgY2hhciBwb2ludGVyICovCisJaW50IGVvczsJLyogZW5kIG9mIHNlcXVlbmNlIHJlYWQgZm9yIGluZGVmaW5pdGUgZW5jb2RpbmcgKi8KKwlpbnQgZXJyb3I7CS8qIGVycm9yIGNvZGUgdG8gdXNlIHdoZW4gcmV0dXJuaW5nIGFuIGVycm9yICovCisJaW50IGluZjsJLyogY29uc3RydWN0ZWQgaWYgMHgyMCwgaW5kZWZpbml0ZSBpcyAweDIxICovCisJaW50IHRhZzsJLyogdGFnIGZyb20gbGFzdCAnZ2V0IG9iamVjdCcgKi8KKwlpbnQgeGNsYXNzOwkvKiBjbGFzcyBmcm9tIGxhc3QgJ2dldCBvYmplY3QnICovCisJbG9uZyBzbGVuOwkvKiBsZW5ndGggb2YgbGFzdCAnZ2V0IG9iamVjdCcgKi8KKwl1bnNpZ25lZCBjaGFyICptYXg7IC8qIGxhcmdlc3QgdmFsdWUgb2YgcCBhbGxvd2VkICovCisJdW5zaWduZWQgY2hhciAqcTsvKiB0ZW1wb3JhcnkgdmFyaWFibGUgKi8KKwl1bnNpZ25lZCBjaGFyICoqcHA7LyogdmFyaWFibGUgKi8KKwlpbnQgbGluZTsJLyogdXNlZCBpbiBlcnJvciBwcm9jZXNzaW5nICovCisJfSBBU04xX0NUWDsKKwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9jb25zdF9jdHhfc3QKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsvKiB3b3JrIGNoYXIgcG9pbnRlciAqLworCWludCBlb3M7CS8qIGVuZCBvZiBzZXF1ZW5jZSByZWFkIGZvciBpbmRlZmluaXRlIGVuY29kaW5nICovCisJaW50IGVycm9yOwkvKiBlcnJvciBjb2RlIHRvIHVzZSB3aGVuIHJldHVybmluZyBhbiBlcnJvciAqLworCWludCBpbmY7CS8qIGNvbnN0cnVjdGVkIGlmIDB4MjAsIGluZGVmaW5pdGUgaXMgMHgyMSAqLworCWludCB0YWc7CS8qIHRhZyBmcm9tIGxhc3QgJ2dldCBvYmplY3QnICovCisJaW50IHhjbGFzczsJLyogY2xhc3MgZnJvbSBsYXN0ICdnZXQgb2JqZWN0JyAqLworCWxvbmcgc2xlbjsJLyogbGVuZ3RoIG9mIGxhc3QgJ2dldCBvYmplY3QnICovCisJY29uc3QgdW5zaWduZWQgY2hhciAqbWF4OyAvKiBsYXJnZXN0IHZhbHVlIG9mIHAgYWxsb3dlZCAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnE7LyogdGVtcG9yYXJ5IHZhcmlhYmxlICovCisJY29uc3QgdW5zaWduZWQgY2hhciAqKnBwOy8qIHZhcmlhYmxlICovCisJaW50IGxpbmU7CS8qIHVzZWQgaW4gZXJyb3IgcHJvY2Vzc2luZyAqLworCX0gQVNOMV9jb25zdF9DVFg7CisKKy8qIFRoZXNlIGFyZSB1c2VkIGludGVybmFsbHkgaW4gdGhlIEFTTjFfT0JKRUNUIHRvIGtlZXAgdHJhY2sgb2YKKyAqIHdoZXRoZXIgdGhlIG5hbWVzIGFuZCBkYXRhIG5lZWQgdG8gYmUgZnJlZSgpZWQgKi8KKyNkZWZpbmUgQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDCSAweDAxCS8qIGludGVybmFsIHVzZSAqLworI2RlZmluZSBBU04xX09CSkVDVF9GTEFHX0NSSVRJQ0FMCSAweDAyCS8qIGNyaXRpY2FsIHg1MDl2MyBvYmplY3QgaWQgKi8KKyNkZWZpbmUgQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX1NUUklOR1MgMHgwNAkvKiBpbnRlcm5hbCB1c2UgKi8KKyNkZWZpbmUgQVNOMV9PQkpFQ1RfRkxBR19EWU5BTUlDX0RBVEEgCSAweDA4CS8qIGludGVybmFsIHVzZSAqLwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9vYmplY3Rfc3QKKwl7CisJY29uc3QgY2hhciAqc24sKmxuOworCWludCBuaWQ7CisJaW50IGxlbmd0aDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwkvKiBkYXRhIHJlbWFpbnMgY29uc3QgYWZ0ZXIgaW5pdCAqLworCWludCBmbGFnczsJLyogU2hvdWxkIHdlIGZyZWUgdGhpcyBvbmUgKi8KKwl9IEFTTjFfT0JKRUNUOworCisjZGVmaW5lIEFTTjFfU1RSSU5HX0ZMQUdfQklUU19MRUZUIDB4MDggLyogU2V0IGlmIDB4MDcgaGFzIGJpdHMgbGVmdCB2YWx1ZSAqLworLyogVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgQVNOMV9TVFJJTkcgaXMgbm90IGEgcmVhbCB2YWx1ZSBidXQganVzdCBhIHBsYWNlCisgKiBob2xkZXIgZm9yIHRoZSBsb2NhdGlvbiB3aGVyZSBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBkYXRhIHNob3VsZAorICogYmUgaW5zZXJ0ZWQgaW4gdGhlIG1lbW9yeSBidWZmZXIgCisgKi8KKyNkZWZpbmUgQVNOMV9TVFJJTkdfRkxBR19OREVGIDB4MDEwIAorCisvKiBUaGlzIGZsYWcgaXMgdXNlZCBieSB0aGUgQ01TIGNvZGUgdG8gaW5kaWNhdGUgdGhhdCBhIHN0cmluZyBpcyBub3QKKyAqIGNvbXBsZXRlIGFuZCBpcyBhIHBsYWNlIGhvbGRlciBmb3IgY29udGVudCB3aGVuIGl0IGhhZCBhbGwgYmVlbiAKKyAqIGFjY2Vzc2VkLiBUaGUgZmxhZyB3aWxsIGJlIHJlc2V0IHdoZW4gY29udGVudCBoYXMgYmVlbiB3cml0dGVuIHRvIGl0LgorICovCisKKyNkZWZpbmUgQVNOMV9TVFJJTkdfRkxBR19DT05UIDB4MDIwIAorLyogVGhpcyBmbGFnIGlzIHVzZWQgYnkgQVNOMSBjb2RlIHRvIGluZGljYXRlIGFuIEFTTjFfU1RSSU5HIGlzIGFuIE1TVFJJTkcKKyAqIHR5cGUuCisgKi8KKyNkZWZpbmUgQVNOMV9TVFJJTkdfRkxBR19NU1RSSU5HIDB4MDQwIAorLyogVGhpcyBpcyB0aGUgYmFzZSB0eXBlIHRoYXQgaG9sZHMganVzdCBhYm91dCBldmVyeXRoaW5nIDotKSAqLwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QKKwl7CisJaW50IGxlbmd0aDsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCS8qIFRoZSB2YWx1ZSBvZiB0aGUgZm9sbG93aW5nIGZpZWxkIGRlcGVuZHMgb24gdGhlIHR5cGUgYmVpbmcKKwkgKiBoZWxkLiAgSXQgaXMgbW9zdGx5IGJlaW5nIHVzZWQgZm9yIEJJVF9TVFJJTkcgc28gaWYgdGhlCisJICogaW5wdXQgZGF0YSBoYXMgYSBub24temVybyAndW51c2VkIGJpdHMnIHZhbHVlLCBpdCB3aWxsIGJlCisJICogaGFuZGxlZCBjb3JyZWN0bHkgKi8KKwlsb25nIGZsYWdzOworCX0gQVNOMV9TVFJJTkc7CisKKy8qIEFTTjFfRU5DT0RJTkcgc3RydWN0dXJlOiB0aGlzIGlzIHVzZWQgdG8gc2F2ZSB0aGUgcmVjZWl2ZWQKKyAqIGVuY29kaW5nIG9mIGFuIEFTTjEgdHlwZS4gVGhpcyBpcyB1c2VmdWwgdG8gZ2V0IHJvdW5kCisgKiBwcm9ibGVtcyB3aXRoIGludmFsaWQgZW5jb2RpbmdzIHdoaWNoIGNhbiBicmVhayBzaWduYXR1cmVzLgorICovCisKK3R5cGVkZWYgc3RydWN0IEFTTjFfRU5DT0RJTkdfc3QKKwl7CisJdW5zaWduZWQgY2hhciAqZW5jOwkvKiBERVIgZW5jb2RpbmcgKi8KKwlsb25nIGxlbjsJCS8qIExlbmd0aCBvZiBlbmNvZGluZyAqLworCWludCBtb2RpZmllZDsJCSAvKiBzZXQgdG8gMSBpZiAnZW5jJyBpcyBpbnZhbGlkICovCisJfSBBU04xX0VOQ09ESU5HOworCisvKiBVc2VkIHdpdGggQVNOMSBMT05HIHR5cGU6IGlmIGEgbG9uZyBpcyBzZXQgdG8gdGhpcyBpdCBpcyBvbWl0dGVkICovCisjZGVmaW5lIEFTTjFfTE9OR19VTkRFRgkweDdmZmZmZmZmTAorCisjZGVmaW5lIFNUQUJMRV9GTEFHU19NQUxMT0MJMHgwMQorI2RlZmluZSBTVEFCTEVfTk9fTUFTSwkJMHgwMgorI2RlZmluZSBESVJTVFJJTkdfVFlQRQlcCisgKEJfQVNOMV9QUklOVEFCTEVTVFJJTkd8Ql9BU04xX1Q2MVNUUklOR3xCX0FTTjFfQk1QU1RSSU5HfEJfQVNOMV9VVEY4U1RSSU5HKQorI2RlZmluZSBQS0NTOVNUUklOR19UWVBFIChESVJTVFJJTkdfVFlQRXxCX0FTTjFfSUE1U1RSSU5HKQorCit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ190YWJsZV9zdCB7CisJaW50IG5pZDsKKwlsb25nIG1pbnNpemU7CisJbG9uZyBtYXhzaXplOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworfSBBU04xX1NUUklOR19UQUJMRTsKKworREVDTEFSRV9TVEFDS19PRihBU04xX1NUUklOR19UQUJMRSkKKworLyogc2l6ZSBsaW1pdHM6IHRoaXMgc3R1ZmYgaXMgdGFrZW4gc3RyYWlnaHQgZnJvbSBSRkMyNDU5ICovCisKKyNkZWZpbmUgdWJfbmFtZQkJCQkzMjc2OAorI2RlZmluZSB1Yl9jb21tb25fbmFtZQkJCTY0CisjZGVmaW5lIHViX2xvY2FsaXR5X25hbWUJCTEyOAorI2RlZmluZSB1Yl9zdGF0ZV9uYW1lCQkJMTI4CisjZGVmaW5lIHViX29yZ2FuaXphdGlvbl9uYW1lCQk2NAorI2RlZmluZSB1Yl9vcmdhbml6YXRpb25fdW5pdF9uYW1lCTY0CisjZGVmaW5lIHViX3RpdGxlCQkJNjQKKyNkZWZpbmUgdWJfZW1haWxfYWRkcmVzcwkJMTI4CisKKy8qIERlY2xhcmF0aW9ucyBmb3IgdGVtcGxhdGUgc3RydWN0dXJlczogZm9yIGZ1bGwgZGVmaW5pdGlvbnMKKyAqIHNlZSBhc24xdC5oCisgKi8KK3R5cGVkZWYgc3RydWN0IEFTTjFfVEVNUExBVEVfc3QgQVNOMV9URU1QTEFURTsKK3R5cGVkZWYgc3RydWN0IEFTTjFfSVRFTV9zdCBBU04xX0lURU07Cit0eXBlZGVmIHN0cnVjdCBBU04xX1RMQ19zdCBBU04xX1RMQzsKKy8qIFRoaXMgaXMganVzdCBhbiBvcGFxdWUgcG9pbnRlciAqLwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9WQUxVRV9zdCBBU04xX1ZBTFVFOworCisvKiBEZWNsYXJlIEFTTjEgZnVuY3Rpb25zOiB0aGUgaW1wbGVtZW50IG1hY3JvIGluIGluIGFzbjF0LmggKi8KKworI2RlZmluZSBERUNMQVJFX0FTTjFfRlVOQ1RJT05TKHR5cGUpIERFQ0xBUkVfQVNOMV9GVU5DVElPTlNfbmFtZSh0eXBlLCB0eXBlKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlModHlwZSkgXAorCURFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlNfbmFtZSh0eXBlLCB0eXBlKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9GVU5DVElPTlNfbmFtZSh0eXBlLCBuYW1lKSBcCisJREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OU19uYW1lKHR5cGUsIG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OUyh0eXBlLCBuYW1lLCBuYW1lKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9GVU5DVElPTlNfZm5hbWUodHlwZSwgaXRuYW1lLCBuYW1lKSBcCisJREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OU19uYW1lKHR5cGUsIG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OUyh0eXBlLCBpdG5hbWUsIG5hbWUpCisKKyNkZWZpbmUJREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlModHlwZSwgaXRuYW1lLCBuYW1lKSBcCisJdHlwZSAqZDJpXyMjbmFtZSh0eXBlICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7IFwKKwlpbnQgaTJkXyMjbmFtZSh0eXBlICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KTsgXAorCURFQ0xBUkVfQVNOMV9JVEVNKGl0bmFtZSkKKworI2RlZmluZQlERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdCh0eXBlLCBuYW1lKSBcCisJdHlwZSAqZDJpXyMjbmFtZSh0eXBlICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7IFwKKwlpbnQgaTJkXyMjbmFtZShjb25zdCB0eXBlICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KTsgXAorCURFQ0xBUkVfQVNOMV9JVEVNKG5hbWUpCisKKyNkZWZpbmUJREVDTEFSRV9BU04xX05ERUZfRlVOQ1RJT04obmFtZSkgXAorCWludCBpMmRfIyNuYW1lIyNfTkRFRihuYW1lICphLCB1bnNpZ25lZCBjaGFyICoqb3V0KTsKKworI2RlZmluZSBERUNMQVJFX0FTTjFfRlVOQ1RJT05TX2NvbnN0KG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TKG5hbWUpIFwKKwlERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChuYW1lLCBuYW1lKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlNfbmFtZSh0eXBlLCBuYW1lKSBcCisJdHlwZSAqbmFtZSMjX25ldyh2b2lkKTsgXAorCXZvaWQgbmFtZSMjX2ZyZWUodHlwZSAqYSk7CisKKyNkZWZpbmUgREVDTEFSRV9BU04xX1BSSU5UX0ZVTkNUSU9OKHN0bmFtZSkgXAorCURFQ0xBUkVfQVNOMV9QUklOVF9GVU5DVElPTl9mbmFtZShzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBERUNMQVJFX0FTTjFfUFJJTlRfRlVOQ1RJT05fZm5hbWUoc3RuYW1lLCBmbmFtZSkgXAorCWludCBmbmFtZSMjX3ByaW50X2N0eChCSU8gKm91dCwgc3RuYW1lICp4LCBpbnQgaW5kZW50LCBcCisJCQkJCSBjb25zdCBBU04xX1BDVFggKnBjdHgpOworCisjZGVmaW5lIEQySV9PRih0eXBlKSB0eXBlICooKikodHlwZSAqKixjb25zdCB1bnNpZ25lZCBjaGFyICoqLGxvbmcpCisjZGVmaW5lIEkyRF9PRih0eXBlKSBpbnQgKCopKHR5cGUgKix1bnNpZ25lZCBjaGFyICoqKQorI2RlZmluZSBJMkRfT0ZfY29uc3QodHlwZSkgaW50ICgqKShjb25zdCB0eXBlICosdW5zaWduZWQgY2hhciAqKikKKworI2RlZmluZSBDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpIFwKKyAgICAoKGQyaV9vZl92b2lkKikgKDEgPyBkMmkgOiAoKEQySV9PRih0eXBlKSkwKSkpCisjZGVmaW5lIENIRUNLRURfSTJEX09GKHR5cGUsIGkyZCkgXAorICAgICgoaTJkX29mX3ZvaWQqKSAoMSA/IGkyZCA6ICgoSTJEX09GKHR5cGUpKTApKSkKKyNkZWZpbmUgQ0hFQ0tFRF9ORVdfT0YodHlwZSwgeG5ldykgXAorICAgICgodm9pZCAqKCopKHZvaWQpKSAoMSA/IHhuZXcgOiAoKHR5cGUgKigqKSh2b2lkKSkwKSkpCisjZGVmaW5lIENIRUNLRURfUFRSX09GKHR5cGUsIHApIFwKKyAgICAoKHZvaWQqKSAoMSA/IHAgOiAodHlwZSopMCkpCisjZGVmaW5lIENIRUNLRURfUFBUUl9PRih0eXBlLCBwKSBcCisgICAgKCh2b2lkKiopICgxID8gcCA6ICh0eXBlKiopMCkpCisKKyNkZWZpbmUgVFlQRURFRl9EMklfT0YodHlwZSkgdHlwZWRlZiB0eXBlICpkMmlfb2ZfIyN0eXBlKHR5cGUgKiosY29uc3QgdW5zaWduZWQgY2hhciAqKixsb25nKQorI2RlZmluZSBUWVBFREVGX0kyRF9PRih0eXBlKSB0eXBlZGVmIGludCBpMmRfb2ZfIyN0eXBlKHR5cGUgKix1bnNpZ25lZCBjaGFyICoqKQorI2RlZmluZSBUWVBFREVGX0QySTJEX09GKHR5cGUpIFRZUEVERUZfRDJJX09GKHR5cGUpOyBUWVBFREVGX0kyRF9PRih0eXBlKQorCitUWVBFREVGX0QySTJEX09GKHZvaWQpOworCisvKiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhbmQgdHlwZWRlZnMgYWxsb3cgYW4gQVNOMV9JVEVNCisgKiB0byBiZSBlbWJlZGRlZCBpbiBhIHN0cnVjdHVyZSBhbmQgcmVmZXJlbmNlZC4gU2luY2UKKyAqIHRoZSBBU04xX0lURU0gcG9pbnRlcnMgbmVlZCB0byBiZSBnbG9iYWxseSBhY2Nlc3NpYmxlCisgKiAocG9zc2libHkgZnJvbSBzaGFyZWQgbGlicmFyaWVzKSB0aGV5IG1heSBleGlzdCBpbgorICogZGlmZmVyZW50IGZvcm1zLiBPbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGl0IHRoZQorICogQVNOMV9JVEVNIHN0cnVjdHVyZSBpdHNlbGYgd2lsbCBiZSBnbG9iYWxseSBleHBvcnRlZC4KKyAqIE90aGVyIHBsYXRmb3JtcyB3aWxsIGV4cG9ydCBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucworICogYW4gQVNOMV9JVEVNIHBvaW50ZXIuCisgKgorICogVG8gaGFuZGxlIGJvdGggY2FzZXMgdHJhbnNwYXJlbnRseSB0aGUgbWFjcm9zIGJlbG93CisgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIGhhcmQgY29kaW5nIGFuIEFTTjFfSVRFTQorICogcG9pbnRlciBpbiBhIHN0cnVjdHVyZS4KKyAqCisgKiBUaGUgc3RydWN0dXJlIHdpbGwgbG9vayBsaWtlIHRoaXM6CisgKgorICogdHlwZWRlZiBzdHJ1Y3QgU09NRVRISU5HX3N0IHsKKyAqICAgICAgLi4uCisgKiAgICAgIEFTTjFfSVRFTV9FWFAgKmlwdHI7CisgKiAgICAgIC4uLgorICogfSBTT01FVEhJTkc7IAorICoKKyAqIEl0IHdvdWxkIGJlIGluaXRpYWxpc2VkIGFzIGUuZy46CisgKgorICogU09NRVRISU5HIHNvbWV2YXIgPSB7Li4uLEFTTjFfSVRFTV9yZWYoWDUwOSksLi4ufTsKKyAqCisgKiBhbmQgdGhlIGFjdHVhbCBwb2ludGVyIGV4dHJhY3RlZCB3aXRoOgorICoKKyAqIGNvbnN0IEFTTjFfSVRFTSAqaXQgPSBBU04xX0lURU1fcHRyKHNvbWV2YXIuaXB0cik7CisgKgorICogRmluYWxseSBhbiBBU04xX0lURU0gcG9pbnRlciBjYW4gYmUgZXh0cmFjdGVkIGZyb20gYW4KKyAqIGFwcHJvcHJpYXRlIHJlZmVyZW5jZSB3aXRoOiBBU04xX0lURU1fcnB0cihYNTA5KS4gVGhpcworICogd291bGQgYmUgdXNlZCB3aGVuIGEgZnVuY3Rpb24gdGFrZXMgYW4gQVNOMV9JVEVNICogYXJndW1lbnQuCisgKgorICovCisKKyNpZm5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKy8qIEFTTjFfSVRFTSBwb2ludGVyIGV4cG9ydGVkIHR5cGUgKi8KK3R5cGVkZWYgY29uc3QgQVNOMV9JVEVNIEFTTjFfSVRFTV9FWFA7CisKKy8qIE1hY3JvIHRvIG9idGFpbiBBU04xX0lURU0gcG9pbnRlciBmcm9tIGV4cG9ydGVkIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9JVEVNX3B0cihpcHRyKSAoaXB0cikKKworLyogTWFjcm8gdG8gaW5jbHVkZSBBU04xX0lURU0gcG9pbnRlciBmcm9tIGJhc2UgdHlwZSAqLworI2RlZmluZSBBU04xX0lURU1fcmVmKGlwdHIpICgmKGlwdHIjI19pdCkpCisKKyNkZWZpbmUgQVNOMV9JVEVNX3JwdHIocmVmKSAoJihyZWYjI19pdCkpCisKKyNkZWZpbmUgREVDTEFSRV9BU04xX0lURU0obmFtZSkgXAorCU9QRU5TU0xfRVhURVJOIGNvbnN0IEFTTjFfSVRFTSBuYW1lIyNfaXQ7CisKKyNlbHNlCisKKy8qIFBsYXRmb3JtcyB0aGF0IGNhbid0IGVhc2lseSBoYW5kbGUgc2hhcmVkIGdsb2JhbCB2YXJpYWJsZXMgYXJlIGRlY2xhcmVkCisgKiBhcyBmdW5jdGlvbnMgcmV0dXJuaW5nIEFTTjFfSVRFTSBwb2ludGVycy4KKyAqLworCisvKiBBU04xX0lURU0gcG9pbnRlciBleHBvcnRlZCB0eXBlICovCit0eXBlZGVmIGNvbnN0IEFTTjFfSVRFTSAqIEFTTjFfSVRFTV9FWFAodm9pZCk7CisKKy8qIE1hY3JvIHRvIG9idGFpbiBBU04xX0lURU0gcG9pbnRlciBmcm9tIGV4cG9ydGVkIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9JVEVNX3B0cihpcHRyKSAoaXB0cigpKQorCisvKiBNYWNybyB0byBpbmNsdWRlIEFTTjFfSVRFTSBwb2ludGVyIGZyb20gYmFzZSB0eXBlICovCisjZGVmaW5lIEFTTjFfSVRFTV9yZWYoaXB0cikgKGlwdHIjI19pdCkKKworI2RlZmluZSBBU04xX0lURU1fcnB0cihyZWYpIChyZWYjI19pdCgpKQorCisjZGVmaW5lIERFQ0xBUkVfQVNOMV9JVEVNKG5hbWUpIFwKKwljb25zdCBBU04xX0lURU0gKiBuYW1lIyNfaXQodm9pZCk7CisKKyNlbmRpZgorCisvKiBQYXJhbWV0ZXJzIHVzZWQgYnkgQVNOMV9TVFJJTkdfcHJpbnRfZXgoKSAqLworCisvKiBUaGVzZSBkZXRlcm1pbmUgd2hpY2ggY2hhcmFjdGVycyB0byBlc2NhcGU6CisgKiBSRkMyMjUzIHNwZWNpYWwgY2hhcmFjdGVycywgY29udHJvbCBjaGFyYWN0ZXJzIGFuZAorICogTVNCIHNldCBjaGFyYWN0ZXJzCisgKi8KKworI2RlZmluZSBBU04xX1NUUkZMR1NfRVNDXzIyNTMJCTEKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX0VTQ19DVFJMCQkyCisjZGVmaW5lIEFTTjFfU1RSRkxHU19FU0NfTVNCCQk0CisKKworLyogVGhpcyBmbGFnIGRldGVybWluZXMgaG93IHdlIGRvIGVzY2FwaW5nOiBub3JtYWxseQorICogUkMyMjUzIGJhY2tzbGFzaCBvbmx5LCBzZXQgdGhpcyB0byB1c2UgYmFja3NsYXNoIGFuZAorICogcXVvdGUuCisgKi8KKworI2RlZmluZSBBU04xX1NUUkZMR1NfRVNDX1FVT1RFCQk4CisKKworLyogVGhlc2UgdGhyZWUgZmxhZ3MgYXJlIGludGVybmFsIHVzZSBvbmx5LiAqLworCisvKiBDaGFyYWN0ZXIgaXMgYSB2YWxpZCBQcmludGFibGVTdHJpbmcgY2hhcmFjdGVyICovCisjZGVmaW5lIENIQVJUWVBFX1BSSU5UQUJMRVNUUklORwkweDEwCisvKiBDaGFyYWN0ZXIgbmVlZHMgZXNjYXBpbmcgaWYgaXQgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciAqLworI2RlZmluZSBDSEFSVFlQRV9GSVJTVF9FU0NfMjI1MwkJMHgyMAorLyogQ2hhcmFjdGVyIG5lZWRzIGVzY2FwaW5nIGlmIGl0IGlzIHRoZSBsYXN0IGNoYXJhY3RlciAqLworI2RlZmluZSBDSEFSVFlQRV9MQVNUX0VTQ18yMjUzCQkweDQwCisKKy8qIE5CIHRoZSBpbnRlcm5hbCBmbGFncyBhcmUgc2FmZWx5IHJldXNlZCBiZWxvdyBieSBmbGFncworICogaGFuZGxlZCBhdCB0aGUgdG9wIGxldmVsLgorICovCisKKy8qIElmIHRoaXMgaXMgc2V0IHdlIGNvbnZlcnQgYWxsIGNoYXJhY3RlciBzdHJpbmdzCisgKiB0byBVVEY4IGZpcnN0IAorICovCisKKyNkZWZpbmUgQVNOMV9TVFJGTEdTX1VURjhfQ09OVkVSVAkweDEwCisKKy8qIElmIHRoaXMgaXMgc2V0IHdlIGRvbid0IGF0dGVtcHQgdG8gaW50ZXJwcmV0IGNvbnRlbnQ6CisgKiBqdXN0IGFzc3VtZSBhbGwgc3RyaW5ncyBhcmUgMSBieXRlIHBlciBjaGFyYWN0ZXIuIFRoaXMKKyAqIHdpbGwgcHJvZHVjZSBzb21lIHByZXR0eSBvZGQgbG9va2luZyBvdXRwdXQhCisgKi8KKworI2RlZmluZSBBU04xX1NUUkZMR1NfSUdOT1JFX1RZUEUJMHgyMAorCisvKiBJZiB0aGlzIGlzIHNldCB3ZSBpbmNsdWRlIHRoZSBzdHJpbmcgdHlwZSBpbiB0aGUgb3V0cHV0ICovCisjZGVmaW5lIEFTTjFfU1RSRkxHU19TSE9XX1RZUEUJCTB4NDAKKworLyogVGhpcyBkZXRlcm1pbmVzIHdoaWNoIHN0cmluZ3MgdG8gZGlzcGxheSBhbmQgd2hpY2ggdG8KKyAqICdkdW1wJyAoaGV4IGR1bXAgb2YgY29udGVudCBvY3RldHMgb3IgREVSIGVuY29kaW5nKS4gV2UgY2FuCisgKiBvbmx5IGR1bXAgbm9uIGNoYXJhY3RlciBzdHJpbmdzIG9yIGV2ZXJ5dGhpbmcuIElmIHdlCisgKiBkb24ndCBkdW1wICd1bmtub3duJyB0aGV5IGFyZSBpbnRlcnByZXRlZCBhcyBjaGFyYWN0ZXIKKyAqIHN0cmluZ3Mgd2l0aCAxIG9jdGV0IHBlciBjaGFyYWN0ZXIgYW5kIGFyZSBzdWJqZWN0IHRvCisgKiB0aGUgdXN1YWwgZXNjYXBpbmcgb3B0aW9ucy4KKyAqLworCisjZGVmaW5lIEFTTjFfU1RSRkxHU19EVU1QX0FMTAkJMHg4MAorI2RlZmluZSBBU04xX1NUUkZMR1NfRFVNUF9VTktOT1dOCTB4MTAwCisKKy8qIFRoZXNlIGRldGVybWluZSB3aGF0ICdkdW1waW5nJyBkb2VzLCB3ZSBjYW4gZHVtcCB0aGUKKyAqIGNvbnRlbnQgb2N0ZXRzIG9yIHRoZSBERVIgZW5jb2Rpbmc6IGJvdGggdXNlIHRoZQorICogUkZDMjI1MyAjWFhYWFggbm90YXRpb24uCisgKi8KKworI2RlZmluZSBBU04xX1NUUkZMR1NfRFVNUF9ERVIJCTB4MjAwCisKKy8qIEFsbCB0aGUgc3RyaW5nIGZsYWdzIGNvbnNpc3RlbnQgd2l0aCBSRkMyMjUzLAorICogZXNjYXBpbmcgY29udHJvbCBjaGFyYWN0ZXJzIGlzbid0IGVzc2VudGlhbCBpbgorICogUkZDMjI1MyBidXQgaXQgaXMgYWR2aXNhYmxlIGFueXdheS4KKyAqLworCisjZGVmaW5lIEFTTjFfU1RSRkxHU19SRkMyMjUzCShBU04xX1NUUkZMR1NfRVNDXzIyNTMgfCBcCisJCQkJQVNOMV9TVFJGTEdTX0VTQ19DVFJMIHwgXAorCQkJCUFTTjFfU1RSRkxHU19FU0NfTVNCIHwgXAorCQkJCUFTTjFfU1RSRkxHU19VVEY4X0NPTlZFUlQgfCBcCisJCQkJQVNOMV9TVFJGTEdTX0RVTVBfVU5LTk9XTiB8IFwKKwkJCQlBU04xX1NUUkZMR1NfRFVNUF9ERVIpCisKK0RFQ0xBUkVfU1RBQ0tfT0YoQVNOMV9JTlRFR0VSKQorREVDTEFSRV9BU04xX1NFVF9PRihBU04xX0lOVEVHRVIpCisKK0RFQ0xBUkVfU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKQorCit0eXBlZGVmIHN0cnVjdCBhc24xX3R5cGVfc3QKKwl7CisJaW50IHR5cGU7CisJdW5pb24JeworCQljaGFyICpwdHI7CisJCUFTTjFfQk9PTEVBTgkJYm9vbGVhbjsKKwkJQVNOMV9TVFJJTkcgKgkJYXNuMV9zdHJpbmc7CisJCUFTTjFfT0JKRUNUICoJCW9iamVjdDsKKwkJQVNOMV9JTlRFR0VSICoJCWludGVnZXI7CisJCUFTTjFfRU5VTUVSQVRFRCAqCWVudW1lcmF0ZWQ7CisJCUFTTjFfQklUX1NUUklORyAqCWJpdF9zdHJpbmc7CisJCUFTTjFfT0NURVRfU1RSSU5HICoJb2N0ZXRfc3RyaW5nOworCQlBU04xX1BSSU5UQUJMRVNUUklORyAqCXByaW50YWJsZXN0cmluZzsKKwkJQVNOMV9UNjFTVFJJTkcgKgl0NjFzdHJpbmc7CisJCUFTTjFfSUE1U1RSSU5HICoJaWE1c3RyaW5nOworCQlBU04xX0dFTkVSQUxTVFJJTkcgKglnZW5lcmFsc3RyaW5nOworCQlBU04xX0JNUFNUUklORyAqCWJtcHN0cmluZzsKKwkJQVNOMV9VTklWRVJTQUxTVFJJTkcgKgl1bml2ZXJzYWxzdHJpbmc7CisJCUFTTjFfVVRDVElNRSAqCQl1dGN0aW1lOworCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqCWdlbmVyYWxpemVkdGltZTsKKwkJQVNOMV9WSVNJQkxFU1RSSU5HICoJdmlzaWJsZXN0cmluZzsKKwkJQVNOMV9VVEY4U1RSSU5HICoJdXRmOHN0cmluZzsKKwkJLyogc2V0IGFuZCBzZXF1ZW5jZSBhcmUgbGVmdCBjb21wbGV0ZSBhbmQgc3RpbGwKKwkJICogY29udGFpbiB0aGUgc2V0IG9yIHNlcXVlbmNlIGJ5dGVzICovCisJCUFTTjFfU1RSSU5HICoJCXNldDsKKwkJQVNOMV9TVFJJTkcgKgkJc2VxdWVuY2U7CisJCUFTTjFfVkFMVUUgKgkJYXNuMV92YWx1ZTsKKwkJfSB2YWx1ZTsKKwl9IEFTTjFfVFlQRTsKKworREVDTEFSRV9TVEFDS19PRihBU04xX1RZUEUpCitERUNMQVJFX0FTTjFfU0VUX09GKEFTTjFfVFlQRSkKKwordHlwZWRlZiBTVEFDS19PRihBU04xX1RZUEUpIEFTTjFfU0VRVUVOQ0VfQU5ZOworCitERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChBU04xX1NFUVVFTkNFX0FOWSwgQVNOMV9TRVFVRU5DRV9BTlkpCitERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChBU04xX1NFUVVFTkNFX0FOWSwgQVNOMV9TRVRfQU5ZKQorCit0eXBlZGVmIHN0cnVjdCBORVRTQ0FQRV9YNTA5X3N0CisJeworCUFTTjFfT0NURVRfU1RSSU5HICpoZWFkZXI7CisJWDUwOSAqY2VydDsKKwl9IE5FVFNDQVBFX1g1MDk7CisKKy8qIFRoaXMgaXMgdXNlZCB0byBjb250YWluIGEgbGlzdCBvZiBiaXQgbmFtZXMgKi8KK3R5cGVkZWYgc3RydWN0IEJJVF9TVFJJTkdfQklUTkFNRV9zdCB7CisJaW50IGJpdG51bTsKKwljb25zdCBjaGFyICpsbmFtZTsKKwljb25zdCBjaGFyICpzbmFtZTsKK30gQklUX1NUUklOR19CSVROQU1FOworCisKKyNkZWZpbmUgTV9BU04xX1NUUklOR19sZW5ndGgoeCkJKCh4KS0+bGVuZ3RoKQorI2RlZmluZSBNX0FTTjFfU1RSSU5HX2xlbmd0aF9zZXQoeCwgbikJKCh4KS0+bGVuZ3RoID0gKG4pKQorI2RlZmluZSBNX0FTTjFfU1RSSU5HX3R5cGUoeCkJKCh4KS0+dHlwZSkKKyNkZWZpbmUgTV9BU04xX1NUUklOR19kYXRhKHgpCSgoeCktPmRhdGEpCisKKy8qIE1hY3JvcyBmb3Igc3RyaW5nIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgTV9BU04xX0JJVF9TVFJJTkdfbmV3KCkJKEFTTjFfQklUX1NUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0JJVF9TVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9CSVRfU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfQklUX1NUUklOR19kdXAoYSkgKEFTTjFfQklUX1NUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9CSVRfU1RSSU5HX2NtcChhLGIpIEFTTjFfU1RSSU5HX2NtcChcCisJCShjb25zdCBBU04xX1NUUklORyAqKWEsKGNvbnN0IEFTTjFfU1RSSU5HICopYikKKyNkZWZpbmUgTV9BU04xX0JJVF9TVFJJTkdfc2V0KGEsYixjKSBBU04xX1NUUklOR19zZXQoKEFTTjFfU1RSSU5HICopYSxiLGMpCisKKyNkZWZpbmUgTV9BU04xX0lOVEVHRVJfbmV3KCkJKEFTTjFfSU5URUdFUiAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0lOVEVHRVIpCisjZGVmaW5lIE1fQVNOMV9JTlRFR0VSX2ZyZWUoYSkJCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX0lOVEVHRVJfZHVwKGEpIChBU04xX0lOVEVHRVIgKilcCisJCUFTTjFfU1RSSU5HX2R1cCgoY29uc3QgQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfSU5URUdFUl9jbXAoYSxiKQlBU04xX1NUUklOR19jbXAoXAorCQkoY29uc3QgQVNOMV9TVFJJTkcgKilhLChjb25zdCBBU04xX1NUUklORyAqKWIpCisKKyNkZWZpbmUgTV9BU04xX0VOVU1FUkFURURfbmV3KCkJKEFTTjFfRU5VTUVSQVRFRCAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0VOVU1FUkFURUQpCisjZGVmaW5lIE1fQVNOMV9FTlVNRVJBVEVEX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX0FTTjFfRU5VTUVSQVRFRF9kdXAoYSkgKEFTTjFfRU5VTUVSQVRFRCAqKVwKKwkJQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9FTlVNRVJBVEVEX2NtcChhLGIpCUFTTjFfU1RSSU5HX2NtcChcCisJCShjb25zdCBBU04xX1NUUklORyAqKWEsKGNvbnN0IEFTTjFfU1RSSU5HICopYikKKworI2RlZmluZSBNX0FTTjFfT0NURVRfU1RSSU5HX25ldygpCShBU04xX09DVEVUX1NUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX09DVEVUX1NUUklORykKKyNkZWZpbmUgTV9BU04xX09DVEVUX1NUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX09DVEVUX1NUUklOR19kdXAoYSkgKEFTTjFfT0NURVRfU1RSSU5HICopXAorCQlBU04xX1NUUklOR19kdXAoKGNvbnN0IEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX09DVEVUX1NUUklOR19jbXAoYSxiKSBBU04xX1NUUklOR19jbXAoXAorCQkoY29uc3QgQVNOMV9TVFJJTkcgKilhLChjb25zdCBBU04xX1NUUklORyAqKWIpCisjZGVmaW5lIE1fQVNOMV9PQ1RFVF9TVFJJTkdfc2V0KGEsYixjKQlBU04xX1NUUklOR19zZXQoKEFTTjFfU1RSSU5HICopYSxiLGMpCisjZGVmaW5lIE1fQVNOMV9PQ1RFVF9TVFJJTkdfcHJpbnQoYSxiKQlBU04xX1NUUklOR19wcmludChhLChBU04xX1NUUklORyAqKWIpCisjZGVmaW5lIE1faTJkX0FTTjFfT0NURVRfU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfT0NURVRfU1RSSU5HLFwKKwkJVl9BU04xX1VOSVZFUlNBTCkKKworI2RlZmluZSBCX0FTTjFfVElNRSBcCisJCQlCX0FTTjFfVVRDVElNRSB8IFwKKwkJCUJfQVNOMV9HRU5FUkFMSVpFRFRJTUUKKworI2RlZmluZSBCX0FTTjFfUFJJTlRBQkxFIFwKKwkJCUJfQVNOMV9OVU1FUklDU1RSSU5HfCBcCisJCQlCX0FTTjFfUFJJTlRBQkxFU1RSSU5HfCBcCisJCQlCX0FTTjFfVDYxU1RSSU5HfCBcCisJCQlCX0FTTjFfSUE1U1RSSU5HfCBcCisJCQlCX0FTTjFfQklUX1NUUklOR3wgXAorCQkJQl9BU04xX1VOSVZFUlNBTFNUUklOR3xcCisJCQlCX0FTTjFfQk1QU1RSSU5HfFwKKwkJCUJfQVNOMV9VVEY4U1RSSU5HfFwKKwkJCUJfQVNOMV9TRVFVRU5DRXxcCisJCQlCX0FTTjFfVU5LTk9XTgorCisjZGVmaW5lIEJfQVNOMV9ESVJFQ1RPUllTVFJJTkcgXAorCQkJQl9BU04xX1BSSU5UQUJMRVNUUklOR3wgXAorCQkJQl9BU04xX1RFTEVURVhTVFJJTkd8XAorCQkJQl9BU04xX0JNUFNUUklOR3xcCisJCQlCX0FTTjFfVU5JVkVSU0FMU1RSSU5HfFwKKwkJCUJfQVNOMV9VVEY4U1RSSU5HCisKKyNkZWZpbmUgQl9BU04xX0RJU1BMQVlURVhUIFwKKwkJCUJfQVNOMV9JQTVTVFJJTkd8IFwKKwkJCUJfQVNOMV9WSVNJQkxFU1RSSU5HfCBcCisJCQlCX0FTTjFfQk1QU1RSSU5HfFwKKwkJCUJfQVNOMV9VVEY4U1RSSU5HCisKKyNkZWZpbmUgTV9BU04xX1BSSU5UQUJMRV9uZXcoKQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVDYxU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfUFJJTlRBQkxFX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX1BSSU5UQUJMRShhLHBwKSBpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLFwKKwkJcHAsYS0+dHlwZSxWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX1BSSU5UQUJMRShhLHBwLGwpIFwKKwkJZDJpX0FTTjFfdHlwZV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsLCBcCisJCQlCX0FTTjFfUFJJTlRBQkxFKQorCisjZGVmaW5lIE1fRElSRUNUT1JZU1RSSU5HX25ldygpIEFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9QUklOVEFCTEVTVFJJTkcpCisjZGVmaW5lIE1fRElSRUNUT1JZU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9ESVJFQ1RPUllTVFJJTkcoYSxwcCkgaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxcCisJCQkJCQlwcCxhLT50eXBlLFZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0RJUkVDVE9SWVNUUklORyhhLHBwLGwpIFwKKwkJZDJpX0FTTjFfdHlwZV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsLCBcCisJCQlCX0FTTjFfRElSRUNUT1JZU1RSSU5HKQorCisjZGVmaW5lIE1fRElTUExBWVRFWFRfbmV3KCkgQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX1ZJU0lCTEVTVFJJTkcpCisjZGVmaW5lIE1fRElTUExBWVRFWFRfZnJlZShhKSBBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0RJU1BMQVlURVhUKGEscHApIGkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEsXAorCQkJCQkJcHAsYS0+dHlwZSxWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9ESVNQTEFZVEVYVChhLHBwLGwpIFwKKwkJZDJpX0FTTjFfdHlwZV9ieXRlcygoQVNOMV9TVFJJTkcgKiopYSxwcCxsLCBcCisJCQlCX0FTTjFfRElTUExBWVRFWFQpCisKKyNkZWZpbmUgTV9BU04xX1BSSU5UQUJMRVNUUklOR19uZXcoKSAoQVNOMV9QUklOVEFCTEVTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9QUklOVEFCTEVTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9QUklOVEFCTEVTVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0FTTjFfUFJJTlRBQkxFU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfUFJJTlRBQkxFU1RSSU5HLFwKKwkJVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9QUklOVEFCTEVTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX1BSSU5UQUJMRVNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9QUklOVEFCTEVTVFJJTkcpCisKKyNkZWZpbmUgTV9BU04xX1Q2MVNUUklOR19uZXcoKQkoQVNOMV9UNjFTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9UNjFTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9UNjFTVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0FTTjFfVDYxU1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfVDYxU1RSSU5HLFwKKwkJVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9UNjFTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX1Q2MVNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9UNjFTVFJJTkcpCisKKyNkZWZpbmUgTV9BU04xX0lBNVNUUklOR19uZXcoKQkoQVNOMV9JQTVTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9JQTVTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9JQTVTVFJJTkdfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9JQTVTVFJJTkdfZHVwKGEpCVwKKwkJKEFTTjFfSUE1U1RSSU5HICopQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1faTJkX0FTTjFfSUE1U1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfSUE1U1RSSU5HLFwKKwkJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfSUE1U1RSSU5HKGEscHAsbCkgXAorCQkoQVNOMV9JQTVTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzKChBU04xX1NUUklORyAqKilhLHBwLGwsXAorCQkJQl9BU04xX0lBNVNUUklORykKKworI2RlZmluZSBNX0FTTjFfVVRDVElNRV9uZXcoKQkoQVNOMV9VVENUSU1FICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVVRDVElNRSkKKyNkZWZpbmUgTV9BU04xX1VUQ1RJTUVfZnJlZShhKQlBU04xX1NUUklOR19mcmVlKChBU04xX1NUUklORyAqKWEpCisjZGVmaW5lIE1fQVNOMV9VVENUSU1FX2R1cChhKSAoQVNOMV9VVENUSU1FICopXAorCQlBU04xX1NUUklOR19kdXAoKGNvbnN0IEFTTjFfU1RSSU5HICopYSkKKworI2RlZmluZSBNX0FTTjFfR0VORVJBTElaRURUSU1FX25ldygpCShBU04xX0dFTkVSQUxJWkVEVElNRSAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0dFTkVSQUxJWkVEVElNRSkKKyNkZWZpbmUgTV9BU04xX0dFTkVSQUxJWkVEVElNRV9mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX0dFTkVSQUxJWkVEVElNRV9kdXAoYSkgKEFTTjFfR0VORVJBTElaRURUSU1FICopQVNOMV9TVFJJTkdfZHVwKFwKKwkoY29uc3QgQVNOMV9TVFJJTkcgKilhKQorCisjZGVmaW5lIE1fQVNOMV9USU1FX25ldygpCShBU04xX1RJTUUgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9VVENUSU1FKQorI2RlZmluZSBNX0FTTjFfVElNRV9mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9BU04xX1RJTUVfZHVwKGEpIChBU04xX1RJTUUgKilcCisJQVNOMV9TVFJJTkdfZHVwKChjb25zdCBBU04xX1NUUklORyAqKWEpCisKKyNkZWZpbmUgTV9BU04xX0dFTkVSQUxTVFJJTkdfbmV3KCkJKEFTTjFfR0VORVJBTFNUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0dFTkVSQUxTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9HRU5FUkFMU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX0dFTkVSQUxTVFJJTkcoYSxwcCkgXAorCQlpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLFZfQVNOMV9HRU5FUkFMU1RSSU5HLFwKKwkJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfR0VORVJBTFNUUklORyhhLHBwLGwpIFwKKwkJKEFTTjFfR0VORVJBTFNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9HRU5FUkFMU1RSSU5HKQorCisjZGVmaW5lIE1fQVNOMV9VTklWRVJTQUxTVFJJTkdfbmV3KCkJKEFTTjFfVU5JVkVSU0FMU1RSSU5HICopXAorCQlBU04xX1NUUklOR190eXBlX25ldyhWX0FTTjFfVU5JVkVSU0FMU1RSSU5HKQorI2RlZmluZSBNX0FTTjFfVU5JVkVSU0FMU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX1VOSVZFUlNBTFNUUklORyhhLHBwKSBcCisJCWkyZF9BU04xX2J5dGVzKChBU04xX1NUUklORyAqKWEscHAsVl9BU04xX1VOSVZFUlNBTFNUUklORyxcCisJCQlWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX1VOSVZFUlNBTFNUUklORyhhLHBwLGwpIFwKKwkJKEFTTjFfVU5JVkVSU0FMU1RSSU5HICopZDJpX0FTTjFfdHlwZV9ieXRlc1wKKwkJKChBU04xX1NUUklORyAqKilhLHBwLGwsQl9BU04xX1VOSVZFUlNBTFNUUklORykKKworI2RlZmluZSBNX0FTTjFfQk1QU1RSSU5HX25ldygpCShBU04xX0JNUFNUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX0JNUFNUUklORykKKyNkZWZpbmUgTV9BU04xX0JNUFNUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfQVNOMV9CTVBTVFJJTkcoYSxwcCkgXAorCQlpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLFZfQVNOMV9CTVBTVFJJTkcsXAorCQkJVl9BU04xX1VOSVZFUlNBTCkKKyNkZWZpbmUgTV9kMmlfQVNOMV9CTVBTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX0JNUFNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9CTVBTVFJJTkcpCisKKyNkZWZpbmUgTV9BU04xX1ZJU0lCTEVTVFJJTkdfbmV3KCkJKEFTTjFfVklTSUJMRVNUUklORyAqKVwKKwkJQVNOMV9TVFJJTkdfdHlwZV9uZXcoVl9BU04xX1ZJU0lCTEVTVFJJTkcpCisjZGVmaW5lIE1fQVNOMV9WSVNJQkxFU1RSSU5HX2ZyZWUoYSkJQVNOMV9TVFJJTkdfZnJlZSgoQVNOMV9TVFJJTkcgKilhKQorI2RlZmluZSBNX2kyZF9BU04xX1ZJU0lCTEVTVFJJTkcoYSxwcCkgXAorCQlpMmRfQVNOMV9ieXRlcygoQVNOMV9TVFJJTkcgKilhLHBwLFZfQVNOMV9WSVNJQkxFU1RSSU5HLFwKKwkJCVZfQVNOMV9VTklWRVJTQUwpCisjZGVmaW5lIE1fZDJpX0FTTjFfVklTSUJMRVNUUklORyhhLHBwLGwpIFwKKwkJKEFTTjFfVklTSUJMRVNUUklORyAqKWQyaV9BU04xX3R5cGVfYnl0ZXNcCisJCSgoQVNOMV9TVFJJTkcgKiopYSxwcCxsLEJfQVNOMV9WSVNJQkxFU1RSSU5HKQorCisjZGVmaW5lIE1fQVNOMV9VVEY4U1RSSU5HX25ldygpCShBU04xX1VURjhTVFJJTkcgKilcCisJCUFTTjFfU1RSSU5HX3R5cGVfbmV3KFZfQVNOMV9VVEY4U1RSSU5HKQorI2RlZmluZSBNX0FTTjFfVVRGOFNUUklOR19mcmVlKGEpCUFTTjFfU1RSSU5HX2ZyZWUoKEFTTjFfU1RSSU5HICopYSkKKyNkZWZpbmUgTV9pMmRfQVNOMV9VVEY4U1RSSU5HKGEscHApIFwKKwkJaTJkX0FTTjFfYnl0ZXMoKEFTTjFfU1RSSU5HICopYSxwcCxWX0FTTjFfVVRGOFNUUklORyxcCisJCQlWX0FTTjFfVU5JVkVSU0FMKQorI2RlZmluZSBNX2QyaV9BU04xX1VURjhTVFJJTkcoYSxwcCxsKSBcCisJCShBU04xX1VURjhTVFJJTkcgKilkMmlfQVNOMV90eXBlX2J5dGVzXAorCQkoKEFTTjFfU1RSSU5HICoqKWEscHAsbCxCX0FTTjFfVVRGOFNUUklORykKKworICAvKiBmb3IgdGhlIGlzX3NldCBwYXJhbWV0ZXIgdG8gaTJkX0FTTjFfU0VUICovCisjZGVmaW5lIElTX1NFUVVFTkNFCTAKKyNkZWZpbmUgSVNfU0VUCQkxCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlNfZm5hbWUoQVNOMV9UWVBFLCBBU04xX0FOWSwgQVNOMV9UWVBFKQorCitpbnQgQVNOMV9UWVBFX2dldChBU04xX1RZUEUgKmEpOwordm9pZCBBU04xX1RZUEVfc2V0KEFTTjFfVFlQRSAqYSwgaW50IHR5cGUsIHZvaWQgKnZhbHVlKTsKK2ludCBBU04xX1RZUEVfc2V0MShBU04xX1RZUEUgKmEsIGludCB0eXBlLCBjb25zdCB2b2lkICp2YWx1ZSk7CitpbnQgICAgICAgICAgICBBU04xX1RZUEVfY21wKEFTTjFfVFlQRSAqYSwgQVNOMV9UWVBFICpiKTsKKworQVNOMV9PQkpFQ1QgKglBU04xX09CSkVDVF9uZXcodm9pZCApOwordm9pZAkJQVNOMV9PQkpFQ1RfZnJlZShBU04xX09CSkVDVCAqYSk7CitpbnQJCWkyZF9BU04xX09CSkVDVChBU04xX09CSkVDVCAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworQVNOMV9PQkpFQ1QgKgljMmlfQVNOMV9PQkpFQ1QoQVNOMV9PQkpFQ1QgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKK0FTTjFfT0JKRUNUICoJZDJpX0FTTjFfT0JKRUNUKEFTTjFfT0JKRUNUICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CisKK0RFQ0xBUkVfQVNOMV9JVEVNKEFTTjFfT0JKRUNUKQorCitERUNMQVJFX1NUQUNLX09GKEFTTjFfT0JKRUNUKQorREVDTEFSRV9BU04xX1NFVF9PRihBU04xX09CSkVDVCkKKworQVNOMV9TVFJJTkcgKglBU04xX1NUUklOR19uZXcodm9pZCk7Cit2b2lkCQlBU04xX1NUUklOR19mcmVlKEFTTjFfU1RSSU5HICphKTsKK2ludAkJQVNOMV9TVFJJTkdfY29weShBU04xX1NUUklORyAqZHN0LCBjb25zdCBBU04xX1NUUklORyAqc3RyKTsKK0FTTjFfU1RSSU5HICoJQVNOMV9TVFJJTkdfZHVwKGNvbnN0IEFTTjFfU1RSSU5HICphKTsKK0FTTjFfU1RSSU5HICoJQVNOMV9TVFJJTkdfdHlwZV9uZXcoaW50IHR5cGUgKTsKK2ludCAJCUFTTjFfU1RSSU5HX2NtcChjb25zdCBBU04xX1NUUklORyAqYSwgY29uc3QgQVNOMV9TVFJJTkcgKmIpOworICAvKiBTaW5jZSB0aGlzIGlzIHVzZWQgdG8gc3RvcmUgYWxsIHNvcnRzIG9mIHRoaW5ncywgdmlhIG1hY3JvcywgZm9yIG5vdywgbWFrZQorICAgICBpdHMgZGF0YSB2b2lkICogKi8KK2ludCAJCUFTTjFfU1RSSU5HX3NldChBU04xX1NUUklORyAqc3RyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK3ZvaWQJCUFTTjFfU1RSSU5HX3NldDAoQVNOMV9TVFJJTkcgKnN0ciwgdm9pZCAqZGF0YSwgaW50IGxlbik7CitpbnQgQVNOMV9TVFJJTkdfbGVuZ3RoKGNvbnN0IEFTTjFfU1RSSU5HICp4KTsKK3ZvaWQgQVNOMV9TVFJJTkdfbGVuZ3RoX3NldChBU04xX1NUUklORyAqeCwgaW50IG4pOworaW50IEFTTjFfU1RSSU5HX3R5cGUoQVNOMV9TVFJJTkcgKngpOwordW5zaWduZWQgY2hhciAqIEFTTjFfU1RSSU5HX2RhdGEoQVNOMV9TVFJJTkcgKngpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfQklUX1NUUklORykKK2ludAkJaTJjX0FTTjFfQklUX1NUUklORyhBU04xX0JJVF9TVFJJTkcgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK0FTTjFfQklUX1NUUklORyAqYzJpX0FTTjFfQklUX1NUUklORyhBU04xX0JJVF9TVFJJTkcgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKK2ludAkJQVNOMV9CSVRfU1RSSU5HX3NldChBU04xX0JJVF9TVFJJTkcgKmEsIHVuc2lnbmVkIGNoYXIgKmQsCisJCQlpbnQgbGVuZ3RoICk7CitpbnQJCUFTTjFfQklUX1NUUklOR19zZXRfYml0KEFTTjFfQklUX1NUUklORyAqYSwgaW50IG4sIGludCB2YWx1ZSk7CitpbnQJCUFTTjFfQklUX1NUUklOR19nZXRfYml0KEFTTjFfQklUX1NUUklORyAqYSwgaW50IG4pOworaW50ICAgICAgICAgICAgQVNOMV9CSVRfU1RSSU5HX2NoZWNrKEFTTjFfQklUX1NUUklORyAqYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpmbGFncywgaW50IGZsYWdzX2xlbik7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludCBBU04xX0JJVF9TVFJJTkdfbmFtZV9wcmludChCSU8gKm91dCwgQVNOMV9CSVRfU1RSSU5HICpicywKKwkJCQlCSVRfU1RSSU5HX0JJVE5BTUUgKnRibCwgaW50IGluZGVudCk7CisjZW5kaWYKK2ludCBBU04xX0JJVF9TVFJJTkdfbnVtX2FzYyhjaGFyICpuYW1lLCBCSVRfU1RSSU5HX0JJVE5BTUUgKnRibCk7CitpbnQgQVNOMV9CSVRfU1RSSU5HX3NldF9hc2MoQVNOMV9CSVRfU1RSSU5HICpicywgY2hhciAqbmFtZSwgaW50IHZhbHVlLAorCQkJCUJJVF9TVFJJTkdfQklUTkFNRSAqdGJsKTsKKworaW50CQlpMmRfQVNOMV9CT09MRUFOKGludCBhLHVuc2lnbmVkIGNoYXIgKipwcCk7CitpbnQgCQlkMmlfQVNOMV9CT09MRUFOKGludCAqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsbG9uZyBsZW5ndGgpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfSU5URUdFUikKK2ludAkJaTJjX0FTTjFfSU5URUdFUihBU04xX0lOVEVHRVIgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK0FTTjFfSU5URUdFUiAqYzJpX0FTTjFfSU5URUdFUihBU04xX0lOVEVHRVIgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKK0FTTjFfSU5URUdFUiAqZDJpX0FTTjFfVUlOVEVHRVIoQVNOMV9JTlRFR0VSICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CitBU04xX0lOVEVHRVIgKglBU04xX0lOVEVHRVJfZHVwKGNvbnN0IEFTTjFfSU5URUdFUiAqeCk7CitpbnQgQVNOMV9JTlRFR0VSX2NtcChjb25zdCBBU04xX0lOVEVHRVIgKngsIGNvbnN0IEFTTjFfSU5URUdFUiAqeSk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9FTlVNRVJBVEVEKQorCitpbnQgQVNOMV9VVENUSU1FX2NoZWNrKEFTTjFfVVRDVElNRSAqYSk7CitBU04xX1VUQ1RJTUUgKkFTTjFfVVRDVElNRV9zZXQoQVNOMV9VVENUSU1FICpzLHRpbWVfdCB0KTsKK0FTTjFfVVRDVElNRSAqQVNOMV9VVENUSU1FX2FkaihBU04xX1VUQ1RJTUUgKnMsIHRpbWVfdCB0LAorCQkJCWludCBvZmZzZXRfZGF5LCBsb25nIG9mZnNldF9zZWMpOworaW50IEFTTjFfVVRDVElNRV9zZXRfc3RyaW5nKEFTTjFfVVRDVElNRSAqcywgY29uc3QgY2hhciAqc3RyKTsKK2ludCBBU04xX1VUQ1RJTUVfY21wX3RpbWVfdChjb25zdCBBU04xX1VUQ1RJTUUgKnMsIHRpbWVfdCB0KTsKKyNpZiAwCit0aW1lX3QgQVNOMV9VVENUSU1FX2dldChjb25zdCBBU04xX1VUQ1RJTUUgKnMpOworI2VuZGlmCisKK2ludCBBU04xX0dFTkVSQUxJWkVEVElNRV9jaGVjayhBU04xX0dFTkVSQUxJWkVEVElNRSAqYSk7CitBU04xX0dFTkVSQUxJWkVEVElNRSAqQVNOMV9HRU5FUkFMSVpFRFRJTUVfc2V0KEFTTjFfR0VORVJBTElaRURUSU1FICpzLHRpbWVfdCB0KTsKK0FTTjFfR0VORVJBTElaRURUSU1FICpBU04xX0dFTkVSQUxJWkVEVElNRV9hZGooQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnMsCisJICAgICB0aW1lX3QgdCwgaW50IG9mZnNldF9kYXksIGxvbmcgb2Zmc2V0X3NlYyk7CitpbnQgQVNOMV9HRU5FUkFMSVpFRFRJTUVfc2V0X3N0cmluZyhBU04xX0dFTkVSQUxJWkVEVElNRSAqcywgY29uc3QgY2hhciAqc3RyKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX09DVEVUX1NUUklORykKK0FTTjFfT0NURVRfU1RSSU5HICoJQVNOMV9PQ1RFVF9TVFJJTkdfZHVwKGNvbnN0IEFTTjFfT0NURVRfU1RSSU5HICphKTsKK2ludCAJQVNOMV9PQ1RFVF9TVFJJTkdfY21wKGNvbnN0IEFTTjFfT0NURVRfU1RSSU5HICphLCBjb25zdCBBU04xX09DVEVUX1NUUklORyAqYik7CitpbnQgCUFTTjFfT0NURVRfU1RSSU5HX3NldChBU04xX09DVEVUX1NUUklORyAqc3RyLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX1ZJU0lCTEVTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfVU5JVkVSU0FMU1RSSU5HKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX1VURjhTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfTlVMTCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9CTVBTVFJJTkcpCisKK2ludCBVVEY4X2dldGMoY29uc3QgdW5zaWduZWQgY2hhciAqc3RyLCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nICp2YWwpOworaW50IFVURjhfcHV0Yyh1bnNpZ25lZCBjaGFyICpzdHIsIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX25hbWUoQVNOMV9TVFJJTkcsIEFTTjFfUFJJTlRBQkxFKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TX25hbWUoQVNOMV9TVFJJTkcsIERJUkVDVE9SWVNUUklORykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlNfbmFtZShBU04xX1NUUklORywgRElTUExBWVRFWFQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfUFJJTlRBQkxFU1RSSU5HKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX1Q2MVNUUklORykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9JQTVTVFJJTkcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFTTjFfR0VORVJBTFNUUklORykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9VVENUSU1FKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU04xX0dFTkVSQUxJWkVEVElNRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNOMV9USU1FKQorCitERUNMQVJFX0FTTjFfSVRFTShBU04xX09DVEVUX1NUUklOR19OREVGKQorCitBU04xX1RJTUUgKkFTTjFfVElNRV9zZXQoQVNOMV9USU1FICpzLHRpbWVfdCB0KTsKK0FTTjFfVElNRSAqQVNOMV9USU1FX2FkaihBU04xX1RJTUUgKnMsdGltZV90IHQsCisJCQkJaW50IG9mZnNldF9kYXksIGxvbmcgb2Zmc2V0X3NlYyk7CitpbnQgQVNOMV9USU1FX2NoZWNrKEFTTjFfVElNRSAqdCk7CitBU04xX0dFTkVSQUxJWkVEVElNRSAqQVNOMV9USU1FX3RvX2dlbmVyYWxpemVkdGltZShBU04xX1RJTUUgKnQsIEFTTjFfR0VORVJBTElaRURUSU1FICoqb3V0KTsKK2ludCBBU04xX1RJTUVfc2V0X3N0cmluZyhBU04xX1RJTUUgKnMsIGNvbnN0IGNoYXIgKnN0cik7CisKK2ludCBpMmRfQVNOMV9TRVQoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJIGkyZF9vZl92b2lkICppMmQsIGludCBleF90YWcsIGludCBleF9jbGFzcywKKwkJIGludCBpc19zZXQpOworU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKmQyaV9BU04xX1NFVChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKmEsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQkgICAgICBsb25nIGxlbmd0aCwgZDJpX29mX3ZvaWQgKmQyaSwKKwkJCSAgICAgIHZvaWQgKCpmcmVlX2Z1bmMpKE9QRU5TU0xfQkxPQ0spLCBpbnQgZXhfdGFnLAorCQkJICAgICAgaW50IGV4X2NsYXNzKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworaW50IGkyYV9BU04xX0lOVEVHRVIoQklPICpicCwgQVNOMV9JTlRFR0VSICphKTsKK2ludCBhMmlfQVNOMV9JTlRFR0VSKEJJTyAqYnAsQVNOMV9JTlRFR0VSICpicyxjaGFyICpidWYsaW50IHNpemUpOworaW50IGkyYV9BU04xX0VOVU1FUkFURUQoQklPICpicCwgQVNOMV9FTlVNRVJBVEVEICphKTsKK2ludCBhMmlfQVNOMV9FTlVNRVJBVEVEKEJJTyAqYnAsQVNOMV9FTlVNRVJBVEVEICpicyxjaGFyICpidWYsaW50IHNpemUpOworaW50IGkyYV9BU04xX09CSkVDVChCSU8gKmJwLEFTTjFfT0JKRUNUICphKTsKK2ludCBhMmlfQVNOMV9TVFJJTkcoQklPICpicCxBU04xX1NUUklORyAqYnMsY2hhciAqYnVmLGludCBzaXplKTsKK2ludCBpMmFfQVNOMV9TVFJJTkcoQklPICpicCwgQVNOMV9TVFJJTkcgKmEsIGludCB0eXBlKTsKKyNlbmRpZgoraW50IGkydF9BU04xX09CSkVDVChjaGFyICpidWYsaW50IGJ1Zl9sZW4sQVNOMV9PQkpFQ1QgKmEpOworCitpbnQgYTJkX0FTTjFfT0JKRUNUKHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgb2xlbiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtKTsKK0FTTjFfT0JKRUNUICpBU04xX09CSkVDVF9jcmVhdGUoaW50IG5pZCwgdW5zaWduZWQgY2hhciAqZGF0YSxpbnQgbGVuLAorCWNvbnN0IGNoYXIgKnNuLCBjb25zdCBjaGFyICpsbik7CisKK2ludCBBU04xX0lOVEVHRVJfc2V0KEFTTjFfSU5URUdFUiAqYSwgbG9uZyB2KTsKK2xvbmcgQVNOMV9JTlRFR0VSX2dldChjb25zdCBBU04xX0lOVEVHRVIgKmEpOworQVNOMV9JTlRFR0VSICpCTl90b19BU04xX0lOVEVHRVIoY29uc3QgQklHTlVNICpibiwgQVNOMV9JTlRFR0VSICphaSk7CitCSUdOVU0gKkFTTjFfSU5URUdFUl90b19CTihjb25zdCBBU04xX0lOVEVHRVIgKmFpLEJJR05VTSAqYm4pOworCitpbnQgQVNOMV9FTlVNRVJBVEVEX3NldChBU04xX0VOVU1FUkFURUQgKmEsIGxvbmcgdik7Citsb25nIEFTTjFfRU5VTUVSQVRFRF9nZXQoQVNOMV9FTlVNRVJBVEVEICphKTsKK0FTTjFfRU5VTUVSQVRFRCAqQk5fdG9fQVNOMV9FTlVNRVJBVEVEKEJJR05VTSAqYm4sIEFTTjFfRU5VTUVSQVRFRCAqYWkpOworQklHTlVNICpBU04xX0VOVU1FUkFURURfdG9fQk4oQVNOMV9FTlVNRVJBVEVEICphaSxCSUdOVU0gKmJuKTsKKworLyogR2VuZXJhbCAqLworLyogZ2l2ZW4gYSBzdHJpbmcsIHJldHVybiB0aGUgY29ycmVjdCB0eXBlLCBtYXggaXMgdGhlIG1heGltdW0gbGVuZ3RoICovCitpbnQgQVNOMV9QUklOVEFCTEVfdHlwZShjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBpbnQgbWF4KTsKKworaW50IGkyZF9BU04xX2J5dGVzKEFTTjFfU1RSSU5HICphLCB1bnNpZ25lZCBjaGFyICoqcHAsIGludCB0YWcsIGludCB4Y2xhc3MpOworQVNOMV9TVFJJTkcgKmQyaV9BU04xX2J5dGVzKEFTTjFfU1RSSU5HICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCWxvbmcgbGVuZ3RoLCBpbnQgUHRhZywgaW50IFBjbGFzcyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfdGFnMmJpdChpbnQgdGFnKTsKKy8qIHR5cGUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIEJfQVNOMV8gdmFsdWVzLiAqLworQVNOMV9TVFJJTkcgKmQyaV9BU04xX3R5cGVfYnl0ZXMoQVNOMV9TVFJJTkcgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJbG9uZyBsZW5ndGgsaW50IHR5cGUpOworCisvKiBQQVJTSU5HICovCitpbnQgYXNuMV9GaW5pc2goQVNOMV9DVFggKmMpOworaW50IGFzbjFfY29uc3RfRmluaXNoKEFTTjFfY29uc3RfQ1RYICpjKTsKKworLyogU1BFQ0lBTFMgKi8KK2ludCBBU04xX2dldF9vYmplY3QoY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nICpwbGVuZ3RoLCBpbnQgKnB0YWcsCisJaW50ICpwY2xhc3MsIGxvbmcgb21heCk7CitpbnQgQVNOMV9jaGVja19pbmZpbml0ZV9lbmQodW5zaWduZWQgY2hhciAqKnAsbG9uZyBsZW4pOworaW50IEFTTjFfY29uc3RfY2hlY2tfaW5maW5pdGVfZW5kKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwLGxvbmcgbGVuKTsKK3ZvaWQgQVNOMV9wdXRfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKipwcCwgaW50IGNvbnN0cnVjdGVkLCBpbnQgbGVuZ3RoLAorCWludCB0YWcsIGludCB4Y2xhc3MpOworaW50IEFTTjFfcHV0X2VvYyh1bnNpZ25lZCBjaGFyICoqcHApOworaW50IEFTTjFfb2JqZWN0X3NpemUoaW50IGNvbnN0cnVjdGVkLCBpbnQgbGVuZ3RoLCBpbnQgdGFnKTsKKworLyogVXNlZCB0byBpbXBsZW1lbnQgb3RoZXIgZnVuY3Rpb25zICovCit2b2lkICpBU04xX2R1cChpMmRfb2Zfdm9pZCAqaTJkLCBkMmlfb2Zfdm9pZCAqZDJpLCB2b2lkICp4KTsKKworI2RlZmluZSBBU04xX2R1cF9vZih0eXBlLGkyZCxkMmkseCkgXAorICAgICgodHlwZSopQVNOMV9kdXAoQ0hFQ0tFRF9JMkRfT0YodHlwZSwgaTJkKSwgXAorCQkgICAgIENIRUNLRURfRDJJX09GKHR5cGUsIGQyaSksIFwKKwkJICAgICBDSEVDS0VEX1BUUl9PRih0eXBlLCB4KSkpCisKKyNkZWZpbmUgQVNOMV9kdXBfb2ZfY29uc3QodHlwZSxpMmQsZDJpLHgpIFwKKyAgICAoKHR5cGUqKUFTTjFfZHVwKENIRUNLRURfSTJEX09GKGNvbnN0IHR5cGUsIGkyZCksIFwKKwkJICAgICBDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpLCBcCisJCSAgICAgQ0hFQ0tFRF9QVFJfT0YoY29uc3QgdHlwZSwgeCkpKQorCit2b2lkICpBU04xX2l0ZW1fZHVwKGNvbnN0IEFTTjFfSVRFTSAqaXQsIHZvaWQgKngpOworCisvKiBBU04xIGFsbG9jL2ZyZWUgbWFjcm9zIGZvciB3aGVuIGEgdHlwZSBpcyBvbmx5IHVzZWQgaW50ZXJuYWxseSAqLworCisjZGVmaW5lIE1fQVNOMV9uZXdfb2YodHlwZSkgKHR5cGUgKilBU04xX2l0ZW1fbmV3KEFTTjFfSVRFTV9ycHRyKHR5cGUpKQorI2RlZmluZSBNX0FTTjFfZnJlZV9vZih4LCB0eXBlKSBcCisJCUFTTjFfaXRlbV9mcmVlKENIRUNLRURfUFRSX09GKHR5cGUsIHgpLCBBU04xX0lURU1fcnB0cih0eXBlKSkKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQordm9pZCAqQVNOMV9kMmlfZnAodm9pZCAqKCp4bmV3KSh2b2lkKSwgZDJpX29mX3ZvaWQgKmQyaSwgRklMRSAqaW4sIHZvaWQgKip4KTsKKworI2RlZmluZSBBU04xX2QyaV9mcF9vZih0eXBlLHhuZXcsZDJpLGluLHgpIFwKKyAgICAoKHR5cGUqKUFTTjFfZDJpX2ZwKENIRUNLRURfTkVXX09GKHR5cGUsIHhuZXcpLCBcCisJCQlDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpLCBcCisJCQlpbiwgXAorCQkJQ0hFQ0tFRF9QUFRSX09GKHR5cGUsIHgpKSkKKwordm9pZCAqQVNOMV9pdGVtX2QyaV9mcChjb25zdCBBU04xX0lURU0gKml0LCBGSUxFICppbiwgdm9pZCAqeCk7CitpbnQgQVNOMV9pMmRfZnAoaTJkX29mX3ZvaWQgKmkyZCxGSUxFICpvdXQsdm9pZCAqeCk7CisKKyNkZWZpbmUgQVNOMV9pMmRfZnBfb2YodHlwZSxpMmQsb3V0LHgpIFwKKyAgICAoQVNOMV9pMmRfZnAoQ0hFQ0tFRF9JMkRfT0YodHlwZSwgaTJkKSwgXAorCQkgb3V0LCBcCisJCSBDSEVDS0VEX1BUUl9PRih0eXBlLCB4KSkpCisKKyNkZWZpbmUgQVNOMV9pMmRfZnBfb2ZfY29uc3QodHlwZSxpMmQsb3V0LHgpIFwKKyAgICAoQVNOMV9pMmRfZnAoQ0hFQ0tFRF9JMkRfT0YoY29uc3QgdHlwZSwgaTJkKSwgXAorCQkgb3V0LCBcCisJCSBDSEVDS0VEX1BUUl9PRihjb25zdCB0eXBlLCB4KSkpCisKK2ludCBBU04xX2l0ZW1faTJkX2ZwKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEZJTEUgKm91dCwgdm9pZCAqeCk7CitpbnQgQVNOMV9TVFJJTkdfcHJpbnRfZXhfZnAoRklMRSAqZnAsIEFTTjFfU1RSSU5HICpzdHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworI2VuZGlmCisKK2ludCBBU04xX1NUUklOR190b19VVEY4KHVuc2lnbmVkIGNoYXIgKipvdXQsIEFTTjFfU1RSSU5HICppbik7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK3ZvaWQgKkFTTjFfZDJpX2Jpbyh2b2lkICooKnhuZXcpKHZvaWQpLCBkMmlfb2Zfdm9pZCAqZDJpLCBCSU8gKmluLCB2b2lkICoqeCk7CisKKyNkZWZpbmUgQVNOMV9kMmlfYmlvX29mKHR5cGUseG5ldyxkMmksaW4seCkgXAorICAgICgodHlwZSopQVNOMV9kMmlfYmlvKCBDSEVDS0VEX05FV19PRih0eXBlLCB4bmV3KSwgXAorCQkJICBDSEVDS0VEX0QySV9PRih0eXBlLCBkMmkpLCBcCisJCQkgIGluLCBcCisJCQkgIENIRUNLRURfUFBUUl9PRih0eXBlLCB4KSkpCisKK3ZvaWQgKkFTTjFfaXRlbV9kMmlfYmlvKGNvbnN0IEFTTjFfSVRFTSAqaXQsIEJJTyAqaW4sIHZvaWQgKngpOworaW50IEFTTjFfaTJkX2JpbyhpMmRfb2Zfdm9pZCAqaTJkLEJJTyAqb3V0LCB1bnNpZ25lZCBjaGFyICp4KTsKKworI2RlZmluZSBBU04xX2kyZF9iaW9fb2YodHlwZSxpMmQsb3V0LHgpIFwKKyAgICAoQVNOMV9pMmRfYmlvKENIRUNLRURfSTJEX09GKHR5cGUsIGkyZCksIFwKKwkJICBvdXQsIFwKKwkJICBDSEVDS0VEX1BUUl9PRih0eXBlLCB4KSkpCisKKyNkZWZpbmUgQVNOMV9pMmRfYmlvX29mX2NvbnN0KHR5cGUsaTJkLG91dCx4KSBcCisgICAgKEFTTjFfaTJkX2JpbyhDSEVDS0VEX0kyRF9PRihjb25zdCB0eXBlLCBpMmQpLCBcCisJCSAgb3V0LCBcCisJCSAgQ0hFQ0tFRF9QVFJfT0YoY29uc3QgdHlwZSwgeCkpKQorCitpbnQgQVNOMV9pdGVtX2kyZF9iaW8oY29uc3QgQVNOMV9JVEVNICppdCwgQklPICpvdXQsIHZvaWQgKngpOworaW50IEFTTjFfVVRDVElNRV9wcmludChCSU8gKmZwLCBjb25zdCBBU04xX1VUQ1RJTUUgKmEpOworaW50IEFTTjFfR0VORVJBTElaRURUSU1FX3ByaW50KEJJTyAqZnAsIGNvbnN0IEFTTjFfR0VORVJBTElaRURUSU1FICphKTsKK2ludCBBU04xX1RJTUVfcHJpbnQoQklPICpmcCwgY29uc3QgQVNOMV9USU1FICphKTsKK2ludCBBU04xX1NUUklOR19wcmludChCSU8gKmJwLCBjb25zdCBBU04xX1NUUklORyAqdik7CitpbnQgQVNOMV9TVFJJTkdfcHJpbnRfZXgoQklPICpvdXQsIEFTTjFfU1RSSU5HICpzdHIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50IEFTTjFfYm5fcHJpbnQoQklPICpicCwgY29uc3QgY2hhciAqbnVtYmVyLCBjb25zdCBCSUdOVU0gKm51bSwKKwkJCQl1bnNpZ25lZCBjaGFyICpidWYsIGludCBvZmYpOworaW50IEFTTjFfcGFyc2UoQklPICpicCxjb25zdCB1bnNpZ25lZCBjaGFyICpwcCxsb25nIGxlbixpbnQgaW5kZW50KTsKK2ludCBBU04xX3BhcnNlX2R1bXAoQklPICpicCxjb25zdCB1bnNpZ25lZCBjaGFyICpwcCxsb25nIGxlbixpbnQgaW5kZW50LGludCBkdW1wKTsKKyNlbmRpZgorY29uc3QgY2hhciAqQVNOMV90YWcyc3RyKGludCB0YWcpOworCisvKiBVc2VkIHRvIGxvYWQgYW5kIHdyaXRlIG5ldHNjYXBlIGZvcm1hdCBjZXJ0ICovCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoTkVUU0NBUEVfWDUwOSkKKworaW50IEFTTjFfVU5JVkVSU0FMU1RSSU5HX3RvX3N0cmluZyhBU04xX1VOSVZFUlNBTFNUUklORyAqcyk7CisKK2ludCBBU04xX1RZUEVfc2V0X29jdGV0c3RyaW5nKEFTTjFfVFlQRSAqYSwKKwl1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKK2ludCBBU04xX1RZUEVfZ2V0X29jdGV0c3RyaW5nKEFTTjFfVFlQRSAqYSwKKwl1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbWF4X2xlbik7CitpbnQgQVNOMV9UWVBFX3NldF9pbnRfb2N0ZXRzdHJpbmcoQVNOMV9UWVBFICphLCBsb25nIG51bSwKKwl1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKTsKK2ludCBBU04xX1RZUEVfZ2V0X2ludF9vY3RldHN0cmluZyhBU04xX1RZUEUgKmEsbG9uZyAqbnVtLAorCXVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBtYXhfbGVuKTsKKworU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKkFTTjFfc2VxX3VucGFjayhjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sCisJCQkJIGQyaV9vZl92b2lkICpkMmksIHZvaWQgKCpmcmVlX2Z1bmMpKE9QRU5TU0xfQkxPQ0spKTsKK3Vuc2lnbmVkIGNoYXIgKkFTTjFfc2VxX3BhY2soU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKnNhZmVzLCBpMmRfb2Zfdm9pZCAqaTJkLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICoqYnVmLCBpbnQgKmxlbiApOwordm9pZCAqQVNOMV91bnBhY2tfc3RyaW5nKEFTTjFfU1RSSU5HICpvY3QsIGQyaV9vZl92b2lkICpkMmkpOwordm9pZCAqQVNOMV9pdGVtX3VucGFjayhBU04xX1NUUklORyAqb2N0LCBjb25zdCBBU04xX0lURU0gKml0KTsKK0FTTjFfU1RSSU5HICpBU04xX3BhY2tfc3RyaW5nKHZvaWQgKm9iaiwgaTJkX29mX3ZvaWQgKmkyZCwKKwkJCSAgICAgIEFTTjFfT0NURVRfU1RSSU5HICoqb2N0KTsKKworI2RlZmluZSBBU04xX3BhY2tfc3RyaW5nX29mKHR5cGUsb2JqLGkyZCxvY3QpIFwKKyAgICAoQVNOMV9wYWNrX3N0cmluZyhDSEVDS0VEX1BUUl9PRih0eXBlLCBvYmopLCBcCisJCSAgICAgIENIRUNLRURfSTJEX09GKHR5cGUsIGkyZCksIFwKKwkJICAgICAgb2N0KSkKKworQVNOMV9TVFJJTkcgKkFTTjFfaXRlbV9wYWNrKHZvaWQgKm9iaiwgY29uc3QgQVNOMV9JVEVNICppdCwgQVNOMV9PQ1RFVF9TVFJJTkcgKipvY3QpOworCit2b2lkIEFTTjFfU1RSSU5HX3NldF9kZWZhdWx0X21hc2sodW5zaWduZWQgbG9uZyBtYXNrKTsKK2ludCBBU04xX1NUUklOR19zZXRfZGVmYXVsdF9tYXNrX2FzYyhjaGFyICpwKTsKK3Vuc2lnbmVkIGxvbmcgQVNOMV9TVFJJTkdfZ2V0X2RlZmF1bHRfbWFzayh2b2lkKTsKK2ludCBBU04xX21ic3RyaW5nX2NvcHkoQVNOMV9TVFJJTkcgKipvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbGVuLAorCQkJCQlpbnQgaW5mb3JtLCB1bnNpZ25lZCBsb25nIG1hc2spOworaW50IEFTTjFfbWJzdHJpbmdfbmNvcHkoQVNOMV9TVFJJTkcgKipvdXQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbGVuLAorCQkJCQlpbnQgaW5mb3JtLCB1bnNpZ25lZCBsb25nIG1hc2ssIAorCQkJCQlsb25nIG1pbnNpemUsIGxvbmcgbWF4c2l6ZSk7CisKK0FTTjFfU1RSSU5HICpBU04xX1NUUklOR19zZXRfYnlfTklEKEFTTjFfU1RSSU5HICoqb3V0LCAKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmxlbiwgaW50IGluZm9ybSwgaW50IG5pZCk7CitBU04xX1NUUklOR19UQUJMRSAqQVNOMV9TVFJJTkdfVEFCTEVfZ2V0KGludCBuaWQpOworaW50IEFTTjFfU1RSSU5HX1RBQkxFX2FkZChpbnQsIGxvbmcsIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwordm9pZCBBU04xX1NUUklOR19UQUJMRV9jbGVhbnVwKHZvaWQpOworCisvKiBBU04xIHRlbXBsYXRlIGZ1bmN0aW9ucyAqLworCisvKiBPbGQgQVBJIGNvbXBhdGlibGUgZnVuY3Rpb25zICovCitBU04xX1ZBTFVFICpBU04xX2l0ZW1fbmV3KGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordm9pZCBBU04xX2l0ZW1fZnJlZShBU04xX1ZBTFVFICp2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworQVNOMV9WQUxVRSAqIEFTTjFfaXRlbV9kMmkoQVNOMV9WQUxVRSAqKnZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbiwgY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgQVNOMV9pdGVtX2kyZChBU04xX1ZBTFVFICp2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworaW50IEFTTjFfaXRlbV9uZGVmX2kyZChBU04xX1ZBTFVFICp2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCit2b2lkIEFTTjFfYWRkX29pZF9tb2R1bGUodm9pZCk7CisKK0FTTjFfVFlQRSAqQVNOMV9nZW5lcmF0ZV9uY29uZihjaGFyICpzdHIsIENPTkYgKm5jb25mKTsKK0FTTjFfVFlQRSAqQVNOMV9nZW5lcmF0ZV92MyhjaGFyICpzdHIsIFg1MDlWM19DVFggKmNuZik7CisKKy8qIEFTTjEgUHJpbnQgZmxhZ3MgKi8KKworLyogSW5kaWNhdGUgbWlzc2luZyBPUFRJT05BTCBmaWVsZHMgKi8KKyNkZWZpbmUgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfQUJTRU5UCQkweDAwMQkKKy8qIE1hcmsgc3RhcnQgYW5kIGVuZCBvZiBTRVFVRU5DRSAqLworI2RlZmluZSBBU04xX1BDVFhfRkxBR1NfU0hPV19TRVFVRU5DRQkJMHgwMDIKKy8qIE1hcmsgc3RhcnQgYW5kIGVuZCBvZiBTRVFVRU5DRS9TRVQgT0YgKi8KKyNkZWZpbmUgQVNOMV9QQ1RYX0ZMQUdTX1NIT1dfU1NPRgkJMHgwMDQKKy8qIFNob3cgdGhlIEFTTjEgdHlwZSBvZiBwcmltaXRpdmVzICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19TSE9XX1RZUEUJCTB4MDA4CisvKiBEb24ndCBzaG93IEFTTjEgdHlwZSBvZiBBTlkgKi8KKyNkZWZpbmUgQVNOMV9QQ1RYX0ZMQUdTX05PX0FOWV9UWVBFCQkweDAxMAorLyogRG9uJ3Qgc2hvdyBBU04xIHR5cGUgb2YgTVNUUklOR3MgKi8KKyNkZWZpbmUgQVNOMV9QQ1RYX0ZMQUdTX05PX01TVFJJTkdfVFlQRQkJMHgwMjAKKy8qIERvbid0IHNob3cgZmllbGQgbmFtZXMgaW4gU0VRVUVOQ0UgKi8KKyNkZWZpbmUgQVNOMV9QQ1RYX0ZMQUdTX05PX0ZJRUxEX05BTUUJCTB4MDQwCisvKiBTaG93IHN0cnVjdHVyZSBuYW1lcyBvZiBlYWNoIFNFUVVFTkNFIGZpZWxkICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19TSE9XX0ZJRUxEX1NUUlVDVF9OQU1FCTB4MDgwCisvKiBEb24ndCBzaG93IHN0cnVjdHVyZSBuYW1lIGV2ZW4gYXQgdG9wIGxldmVsICovCisjZGVmaW5lIEFTTjFfUENUWF9GTEFHU19OT19TVFJVQ1RfTkFNRQkJMHgxMDAKKworaW50IEFTTjFfaXRlbV9wcmludChCSU8gKm91dCwgQVNOMV9WQUxVRSAqaWZsZCwgaW50IGluZGVudCwKKwkJCQljb25zdCBBU04xX0lURU0gKml0LCBjb25zdCBBU04xX1BDVFggKnBjdHgpOworQVNOMV9QQ1RYICpBU04xX1BDVFhfbmV3KHZvaWQpOwordm9pZCBBU04xX1BDVFhfZnJlZShBU04xX1BDVFggKnApOwordW5zaWduZWQgbG9uZyBBU04xX1BDVFhfZ2V0X2ZsYWdzKEFTTjFfUENUWCAqcCk7Cit2b2lkIEFTTjFfUENUWF9zZXRfZmxhZ3MoQVNOMV9QQ1RYICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9ubV9mbGFncyhBU04xX1BDVFggKnApOwordm9pZCBBU04xX1BDVFhfc2V0X25tX2ZsYWdzKEFTTjFfUENUWCAqcCwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIEFTTjFfUENUWF9nZXRfY2VydF9mbGFncyhBU04xX1BDVFggKnApOwordm9pZCBBU04xX1BDVFhfc2V0X2NlcnRfZmxhZ3MoQVNOMV9QQ1RYICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9vaWRfZmxhZ3MoQVNOMV9QQ1RYICpwKTsKK3ZvaWQgQVNOMV9QQ1RYX3NldF9vaWRfZmxhZ3MoQVNOMV9QQ1RYICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3Vuc2lnbmVkIGxvbmcgQVNOMV9QQ1RYX2dldF9zdHJfZmxhZ3MoQVNOMV9QQ1RYICpwKTsKK3ZvaWQgQVNOMV9QQ1RYX3NldF9zdHJfZmxhZ3MoQVNOMV9QQ1RYICpwLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworQklPX01FVEhPRCAqQklPX2ZfYXNuMSh2b2lkKTsKKworQklPICpCSU9fbmV3X05ERUYoQklPICpvdXQsIEFTTjFfVkFMVUUgKnZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK2ludCBpMmRfQVNOMV9iaW9fc3RyZWFtKEJJTyAqb3V0LCBBU04xX1ZBTFVFICp2YWwsIEJJTyAqaW4sIGludCBmbGFncywKKwkJCQljb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBQRU1fd3JpdGVfYmlvX0FTTjFfc3RyZWFtKEJJTyAqb3V0LCBBU04xX1ZBTFVFICp2YWwsIEJJTyAqaW4sIGludCBmbGFncywKKwkJCQljb25zdCBjaGFyICpoZHIsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgU01JTUVfd3JpdGVfQVNOMShCSU8gKmJpbywgQVNOMV9WQUxVRSAqdmFsLCBCSU8gKmRhdGEsIGludCBmbGFncywKKwkJCQlpbnQgY3R5cGVfbmlkLCBpbnQgZWNvbnRfbmlkLAorCQkJCVNUQUNLX09GKFg1MDlfQUxHT1IpICptZGFsZ3MsCisJCQkJY29uc3QgQVNOMV9JVEVNICppdCk7CitBU04xX1ZBTFVFICpTTUlNRV9yZWFkX0FTTjEoQklPICpiaW8sIEJJTyAqKmJjb250LCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBTTUlNRV9jcmxmX2NvcHkoQklPICppbiwgQklPICpvdXQsIGludCBmbGFncyk7CitpbnQgU01JTUVfdGV4dChCSU8gKmluLCBCSU8gKm91dCk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfQVNOMV9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIEFTTjEgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQVNOMV9GX0EyRF9BU04xX09CSkVDVAkJCQkgMTAwCisjZGVmaW5lIEFTTjFfRl9BMklfQVNOMV9FTlVNRVJBVEVECQkJIDEwMQorI2RlZmluZSBBU04xX0ZfQTJJX0FTTjFfSU5URUdFUgkJCQkgMTAyCisjZGVmaW5lIEFTTjFfRl9BMklfQVNOMV9TVFJJTkcJCQkJIDEwMworI2RlZmluZSBBU04xX0ZfQVBQRU5EX0VYUAkJCQkgMTc2CisjZGVmaW5lIEFTTjFfRl9BU04xX0JJVF9TVFJJTkdfU0VUX0JJVAkJCSAxODMKKyNkZWZpbmUgQVNOMV9GX0FTTjFfQ0IJCQkJCSAxNzcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfQ0hFQ0tfVExFTgkJCQkgMTA0CisjZGVmaW5lIEFTTjFfRl9BU04xX0NPTExBVEVfUFJJTUlUSVZFCQkJIDEwNQorI2RlZmluZSBBU04xX0ZfQVNOMV9DT0xMRUNUCQkJCSAxMDYKKyNkZWZpbmUgQVNOMV9GX0FTTjFfRDJJX0VYX1BSSU1JVElWRQkJCSAxMDgKKyNkZWZpbmUgQVNOMV9GX0FTTjFfRDJJX0ZQCQkJCSAxMDkKKyNkZWZpbmUgQVNOMV9GX0FTTjFfRDJJX1JFQURfQklPCQkJIDEwNworI2RlZmluZSBBU04xX0ZfQVNOMV9ESUdFU1QJCQkJIDE4NAorI2RlZmluZSBBU04xX0ZfQVNOMV9ET19BREIJCQkJIDExMAorI2RlZmluZSBBU04xX0ZfQVNOMV9EVVAJCQkJCSAxMTEKKyNkZWZpbmUgQVNOMV9GX0FTTjFfRU5VTUVSQVRFRF9TRVQJCQkgMTEyCisjZGVmaW5lIEFTTjFfRl9BU04xX0VOVU1FUkFURURfVE9fQk4JCQkgMTEzCisjZGVmaW5lIEFTTjFfRl9BU04xX0VYX0MySQkJCQkgMjA0CisjZGVmaW5lIEFTTjFfRl9BU04xX0ZJTkRfRU5ECQkJCSAxOTAKKyNkZWZpbmUgQVNOMV9GX0FTTjFfR0VORVJBTElaRURUSU1FX0FESgkJCSAyMTYKKyNkZWZpbmUgQVNOMV9GX0FTTjFfR0VORVJBTElaRURUSU1FX1NFVAkJCSAxODUKKyNkZWZpbmUgQVNOMV9GX0FTTjFfR0VORVJBVEVfVjMJCQkJIDE3OAorI2RlZmluZSBBU04xX0ZfQVNOMV9HRVRfT0JKRUNUCQkJCSAxMTQKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSEVBREVSX05FVwkJCQkgMTE1CisjZGVmaW5lIEFTTjFfRl9BU04xX0kyRF9CSU8JCQkJIDExNgorI2RlZmluZSBBU04xX0ZfQVNOMV9JMkRfRlAJCQkJIDExNworI2RlZmluZSBBU04xX0ZfQVNOMV9JTlRFR0VSX1NFVAkJCQkgMTE4CisjZGVmaW5lIEFTTjFfRl9BU04xX0lOVEVHRVJfVE9fQk4JCQkgMTE5CisjZGVmaW5lIEFTTjFfRl9BU04xX0lURU1fRDJJX0ZQCQkJCSAyMDYKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSVRFTV9EVVAJCQkJIDE5MQorI2RlZmluZSBBU04xX0ZfQVNOMV9JVEVNX0VYX0NPTUJJTkVfTkVXCQkJIDEyMQorI2RlZmluZSBBU04xX0ZfQVNOMV9JVEVNX0VYX0QySQkJCQkgMTIwCisjZGVmaW5lIEFTTjFfRl9BU04xX0lURU1fSTJEX0JJTwkJCSAxOTIKKyNkZWZpbmUgQVNOMV9GX0FTTjFfSVRFTV9JMkRfRlAJCQkJIDE5MworI2RlZmluZSBBU04xX0ZfQVNOMV9JVEVNX1BBQ0sJCQkJIDE5OAorI2RlZmluZSBBU04xX0ZfQVNOMV9JVEVNX1NJR04JCQkJIDE5NQorI2RlZmluZSBBU04xX0ZfQVNOMV9JVEVNX1VOUEFDSwkJCQkgMTk5CisjZGVmaW5lIEFTTjFfRl9BU04xX0lURU1fVkVSSUZZCQkJCSAxOTcKKyNkZWZpbmUgQVNOMV9GX0FTTjFfTUJTVFJJTkdfTkNPUFkJCQkgMTIyCisjZGVmaW5lIEFTTjFfRl9BU04xX09CSkVDVF9ORVcJCQkJIDEyMworI2RlZmluZSBBU04xX0ZfQVNOMV9PVVRQVVRfREFUQQkJCQkgMjE0CisjZGVmaW5lIEFTTjFfRl9BU04xX1BBQ0tfU1RSSU5HCQkJCSAxMjQKKyNkZWZpbmUgQVNOMV9GX0FTTjFfUENUWF9ORVcJCQkJIDIwNQorI2RlZmluZSBBU04xX0ZfQVNOMV9QS0NTNV9QQkVfU0VUCQkJIDEyNQorI2RlZmluZSBBU04xX0ZfQVNOMV9TRVFfUEFDSwkJCQkgMTI2CisjZGVmaW5lIEFTTjFfRl9BU04xX1NFUV9VTlBBQ0sJCQkJIDEyNworI2RlZmluZSBBU04xX0ZfQVNOMV9TSUdOCQkJCSAxMjgKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU1RSMlRZUEUJCQkJIDE3OQorI2RlZmluZSBBU04xX0ZfQVNOMV9TVFJJTkdfU0VUCQkJCSAxODYKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU1RSSU5HX1RBQkxFX0FERAkJCSAxMjkKKyNkZWZpbmUgQVNOMV9GX0FTTjFfU1RSSU5HX1RZUEVfTkVXCQkJIDEzMAorI2RlZmluZSBBU04xX0ZfQVNOMV9URU1QTEFURV9FWF9EMkkJCQkgMTMyCisjZGVmaW5lIEFTTjFfRl9BU04xX1RFTVBMQVRFX05FVwkJCSAxMzMKKyNkZWZpbmUgQVNOMV9GX0FTTjFfVEVNUExBVEVfTk9FWFBfRDJJCQkJIDEzMQorI2RlZmluZSBBU04xX0ZfQVNOMV9USU1FX0FESgkJCQkgMjE3CisjZGVmaW5lIEFTTjFfRl9BU04xX1RJTUVfU0VUCQkJCSAxNzUKKyNkZWZpbmUgQVNOMV9GX0FTTjFfVFlQRV9HRVRfSU5UX09DVEVUU1RSSU5HCQkgMTM0CisjZGVmaW5lIEFTTjFfRl9BU04xX1RZUEVfR0VUX09DVEVUU1RSSU5HCQkgMTM1CisjZGVmaW5lIEFTTjFfRl9BU04xX1VOUEFDS19TVFJJTkcJCQkgMTM2CisjZGVmaW5lIEFTTjFfRl9BU04xX1VUQ1RJTUVfQURKCQkJCSAyMTgKKyNkZWZpbmUgQVNOMV9GX0FTTjFfVVRDVElNRV9TRVQJCQkJIDE4NworI2RlZmluZSBBU04xX0ZfQVNOMV9WRVJJRlkJCQkJIDEzNworI2RlZmluZSBBU04xX0ZfQjY0X1JFQURfQVNOMQkJCQkgMjA5CisjZGVmaW5lIEFTTjFfRl9CNjRfV1JJVEVfQVNOMQkJCQkgMjEwCisjZGVmaW5lIEFTTjFfRl9CSU9fTkVXX05ERUYJCQkJIDIwOAorI2RlZmluZSBBU04xX0ZfQklUU1RSX0NCCQkJCSAxODAKKyNkZWZpbmUgQVNOMV9GX0JOX1RPX0FTTjFfRU5VTUVSQVRFRAkJCSAxMzgKKyNkZWZpbmUgQVNOMV9GX0JOX1RPX0FTTjFfSU5URUdFUgkJCSAxMzkKKyNkZWZpbmUgQVNOMV9GX0MySV9BU04xX0JJVF9TVFJJTkcJCQkgMTg5CisjZGVmaW5lIEFTTjFfRl9DMklfQVNOMV9JTlRFR0VSCQkJCSAxOTQKKyNkZWZpbmUgQVNOMV9GX0MySV9BU04xX09CSkVDVAkJCQkgMTk2CisjZGVmaW5lIEFTTjFfRl9DT0xMRUNUX0RBVEEJCQkJIDE0MAorI2RlZmluZSBBU04xX0ZfRDJJX0FTTjFfQklUX1NUUklORwkJCSAxNDEKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX0JPT0xFQU4JCQkJIDE0MgorI2RlZmluZSBBU04xX0ZfRDJJX0FTTjFfQllURVMJCQkJIDE0MworI2RlZmluZSBBU04xX0ZfRDJJX0FTTjFfR0VORVJBTElaRURUSU1FCQkJIDE0NAorI2RlZmluZSBBU04xX0ZfRDJJX0FTTjFfSEVBREVSCQkJCSAxNDUKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX0lOVEVHRVIJCQkJIDE0NgorI2RlZmluZSBBU04xX0ZfRDJJX0FTTjFfT0JKRUNUCQkJCSAxNDcKKyNkZWZpbmUgQVNOMV9GX0QySV9BU04xX1NFVAkJCQkgMTQ4CisjZGVmaW5lIEFTTjFfRl9EMklfQVNOMV9UWVBFX0JZVEVTCQkJIDE0OQorI2RlZmluZSBBU04xX0ZfRDJJX0FTTjFfVUlOVEVHRVIJCQkgMTUwCisjZGVmaW5lIEFTTjFfRl9EMklfQVNOMV9VVENUSU1FCQkJCSAxNTEKKyNkZWZpbmUgQVNOMV9GX0QySV9BVVRPUFJJVkFURUtFWQkJCSAyMDcKKyNkZWZpbmUgQVNOMV9GX0QySV9ORVRTQ0FQRV9SU0EJCQkJIDE1MgorI2RlZmluZSBBU04xX0ZfRDJJX05FVFNDQVBFX1JTQV8yCQkJIDE1MworI2RlZmluZSBBU04xX0ZfRDJJX1BSSVZBVEVLRVkJCQkJIDE1NAorI2RlZmluZSBBU04xX0ZfRDJJX1BVQkxJQ0tFWQkJCQkgMTU1CisjZGVmaW5lIEFTTjFfRl9EMklfUlNBX05FVAkJCQkgMjAwCisjZGVmaW5lIEFTTjFfRl9EMklfUlNBX05FVF8yCQkJCSAyMDEKKyNkZWZpbmUgQVNOMV9GX0QySV9YNTA5CQkJCQkgMTU2CisjZGVmaW5lIEFTTjFfRl9EMklfWDUwOV9DSU5GCQkJCSAxNTcKKyNkZWZpbmUgQVNOMV9GX0QySV9YNTA5X1BLRVkJCQkJIDE1OQorI2RlZmluZSBBU04xX0ZfSTJEX0FTTjFfQklPX1NUUkVBTQkJCSAyMTEKKyNkZWZpbmUgQVNOMV9GX0kyRF9BU04xX1NFVAkJCQkgMTg4CisjZGVmaW5lIEFTTjFfRl9JMkRfQVNOMV9USU1FCQkJCSAxNjAKKyNkZWZpbmUgQVNOMV9GX0kyRF9EU0FfUFVCS0VZCQkJCSAxNjEKKyNkZWZpbmUgQVNOMV9GX0kyRF9FQ19QVUJLRVkJCQkJIDE4MQorI2RlZmluZSBBU04xX0ZfSTJEX1BSSVZBVEVLRVkJCQkJIDE2MworI2RlZmluZSBBU04xX0ZfSTJEX1BVQkxJQ0tFWQkJCQkgMTY0CisjZGVmaW5lIEFTTjFfRl9JMkRfUlNBX05FVAkJCQkgMTYyCisjZGVmaW5lIEFTTjFfRl9JMkRfUlNBX1BVQktFWQkJCQkgMTY1CisjZGVmaW5lIEFTTjFfRl9MT05HX0MySQkJCQkJIDE2NgorI2RlZmluZSBBU04xX0ZfT0lEX01PRFVMRV9JTklUCQkJCSAxNzQKKyNkZWZpbmUgQVNOMV9GX1BBUlNFX1RBR0dJTkcJCQkJIDE4MgorI2RlZmluZSBBU04xX0ZfUEtDUzVfUEJFMl9TRVRfSVYJCQkgMTY3CisjZGVmaW5lIEFTTjFfRl9QS0NTNV9QQkVfU0VUCQkJCSAyMDIKKyNkZWZpbmUgQVNOMV9GX1BLQ1M1X1BCRV9TRVQwX0FMR09SCQkJIDIxNQorI2RlZmluZSBBU04xX0ZfU01JTUVfUkVBRF9BU04xCQkJCSAyMTIKKyNkZWZpbmUgQVNOMV9GX1NNSU1FX1RFWFQJCQkJIDIxMworI2RlZmluZSBBU04xX0ZfWDUwOV9DSU5GX05FVwkJCQkgMTY4CisjZGVmaW5lIEFTTjFfRl9YNTA5X0NSTF9BREQwX1JFVk9LRUQJCQkgMTY5CisjZGVmaW5lIEFTTjFfRl9YNTA5X0lORk9fTkVXCQkJCSAxNzAKKyNkZWZpbmUgQVNOMV9GX1g1MDlfTkFNRV9FTkNPREUJCQkJIDIwMworI2RlZmluZSBBU04xX0ZfWDUwOV9OQU1FX0VYX0QySQkJCQkgMTU4CisjZGVmaW5lIEFTTjFfRl9YNTA5X05BTUVfRVhfTkVXCQkJCSAxNzEKKyNkZWZpbmUgQVNOMV9GX1g1MDlfTkVXCQkJCQkgMTcyCisjZGVmaW5lIEFTTjFfRl9YNTA5X1BLRVlfTkVXCQkJCSAxNzMKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBBU04xX1JfQURESU5HX09CSkVDVAkJCQkgMTcxCisjZGVmaW5lIEFTTjFfUl9BU04xX1BBUlNFX0VSUk9SCQkJCSAyMDMKKyNkZWZpbmUgQVNOMV9SX0FTTjFfU0lHX1BBUlNFX0VSUk9SCQkJIDIwNAorI2RlZmluZSBBU04xX1JfQVVYX0VSUk9SCQkJCSAxMDAKKyNkZWZpbmUgQVNOMV9SX0JBRF9DTEFTUwkJCQkgMTAxCisjZGVmaW5lIEFTTjFfUl9CQURfT0JKRUNUX0hFQURFUgkJCSAxMDIKKyNkZWZpbmUgQVNOMV9SX0JBRF9QQVNTV09SRF9SRUFECQkJIDEwMworI2RlZmluZSBBU04xX1JfQkFEX1RBRwkJCQkJIDEwNAorI2RlZmluZSBBU04xX1JfQk1QU1RSSU5HX0lTX1dST05HX0xFTkdUSAkJIDIxNAorI2RlZmluZSBBU04xX1JfQk5fTElCCQkJCQkgMTA1CisjZGVmaW5lIEFTTjFfUl9CT09MRUFOX0lTX1dST05HX0xFTkdUSAkJCSAxMDYKKyNkZWZpbmUgQVNOMV9SX0JVRkZFUl9UT09fU01BTEwJCQkJIDEwNworI2RlZmluZSBBU04xX1JfQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUgkJIDEwOAorI2RlZmluZSBBU04xX1JfREFUQV9JU19XUk9ORwkJCQkgMTA5CisjZGVmaW5lIEFTTjFfUl9ERUNPREVfRVJST1IJCQkJIDExMAorI2RlZmluZSBBU04xX1JfREVDT0RJTkdfRVJST1IJCQkJIDExMQorI2RlZmluZSBBU04xX1JfREVQVEhfRVhDRUVERUQJCQkJIDE3NAorI2RlZmluZSBBU04xX1JfRElHRVNUX0FORF9LRVlfVFlQRV9OT1RfU1VQUE9SVEVECSAxOTgKKyNkZWZpbmUgQVNOMV9SX0VOQ09ERV9FUlJPUgkJCQkgMTEyCisjZGVmaW5lIEFTTjFfUl9FUlJPUl9HRVRUSU5HX1RJTUUJCQkgMTczCisjZGVmaW5lIEFTTjFfUl9FUlJPUl9MT0FESU5HX1NFQ1RJT04JCQkgMTcyCisjZGVmaW5lIEFTTjFfUl9FUlJPUl9QQVJTSU5HX1NFVF9FTEVNRU5UCQkgMTEzCisjZGVmaW5lIEFTTjFfUl9FUlJPUl9TRVRUSU5HX0NJUEhFUl9QQVJBTVMJCSAxMTQKKyNkZWZpbmUgQVNOMV9SX0VYUEVDVElOR19BTl9JTlRFR0VSCQkJIDExNQorI2RlZmluZSBBU04xX1JfRVhQRUNUSU5HX0FOX09CSkVDVAkJCSAxMTYKKyNkZWZpbmUgQVNOMV9SX0VYUEVDVElOR19BX0JPT0xFQU4JCQkgMTE3CisjZGVmaW5lIEFTTjFfUl9FWFBFQ1RJTkdfQV9USU1FCQkJCSAxMTgKKyNkZWZpbmUgQVNOMV9SX0VYUExJQ0lUX0xFTkdUSF9NSVNNQVRDSAkJCSAxMTkKKyNkZWZpbmUgQVNOMV9SX0VYUExJQ0lUX1RBR19OT1RfQ09OU1RSVUNURUQJCSAxMjAKKyNkZWZpbmUgQVNOMV9SX0ZJRUxEX01JU1NJTkcJCQkJIDEyMQorI2RlZmluZSBBU04xX1JfRklSU1RfTlVNX1RPT19MQVJHRQkJCSAxMjIKKyNkZWZpbmUgQVNOMV9SX0hFQURFUl9UT09fTE9ORwkJCQkgMTIzCisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX0JJVFNUUklOR19GT1JNQVQJCQkgMTc1CisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX0JPT0xFQU4JCQkJIDE3NgorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9DSEFSQUNURVJTCQkJIDEyNAorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9GT1JNQVQJCQkJIDE3NworI2RlZmluZSBBU04xX1JfSUxMRUdBTF9IRVgJCQkJIDE3OAorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9JTVBMSUNJVF9UQUcJCQkgMTc5CisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX0lOVEVHRVIJCQkJIDE4MAorI2RlZmluZSBBU04xX1JfSUxMRUdBTF9ORVNURURfVEFHR0lORwkJCSAxODEKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfTlVMTAkJCQkgMTI1CisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX05VTExfVkFMVUUJCQkgMTgyCisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX09CSkVDVAkJCQkgMTgzCisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX09QVElPTkFMX0FOWQkJCSAxMjYKKyNkZWZpbmUgQVNOMV9SX0lMTEVHQUxfT1BUSU9OU19PTl9JVEVNX1RFTVBMQVRFCQkgMTcwCisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX1RBR0dFRF9BTlkJCQkgMTI3CisjZGVmaW5lIEFTTjFfUl9JTExFR0FMX1RJTUVfVkFMVUUJCQkgMTg0CisjZGVmaW5lIEFTTjFfUl9JTlRFR0VSX05PVF9BU0NJSV9GT1JNQVQJCQkgMTg1CisjZGVmaW5lIEFTTjFfUl9JTlRFR0VSX1RPT19MQVJHRV9GT1JfTE9ORwkJIDEyOAorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9CTVBTVFJJTkdfTEVOR1RICQkJIDEyOQorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9ESUdJVAkJCQkgMTMwCisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX01JTUVfVFlQRQkJCSAyMDUKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfTU9ESUZJRVIJCQkJIDE4NgorI2RlZmluZSBBU04xX1JfSU5WQUxJRF9OVU1CRVIJCQkJIDE4NworI2RlZmluZSBBU04xX1JfSU5WQUxJRF9PQkpFQ1RfRU5DT0RJTkcJCQkgMjE2CisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX1NFUEFSQVRPUgkJCSAxMzEKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfVElNRV9GT1JNQVQJCQkgMTMyCisjZGVmaW5lIEFTTjFfUl9JTlZBTElEX1VOSVZFUlNBTFNUUklOR19MRU5HVEgJCSAxMzMKKyNkZWZpbmUgQVNOMV9SX0lOVkFMSURfVVRGOFNUUklORwkJCSAxMzQKKyNkZWZpbmUgQVNOMV9SX0lWX1RPT19MQVJHRQkJCQkgMTM1CisjZGVmaW5lIEFTTjFfUl9MRU5HVEhfRVJST1IJCQkJIDEzNgorI2RlZmluZSBBU04xX1JfTElTVF9FUlJPUgkJCQkgMTg4CisjZGVmaW5lIEFTTjFfUl9NSU1FX05PX0NPTlRFTlRfVFlQRQkJCSAyMDYKKyNkZWZpbmUgQVNOMV9SX01JTUVfUEFSU0VfRVJST1IJCQkJIDIwNworI2RlZmluZSBBU04xX1JfTUlNRV9TSUdfUEFSU0VfRVJST1IJCQkgMjA4CisjZGVmaW5lIEFTTjFfUl9NSVNTSU5HX0VPQwkJCQkgMTM3CisjZGVmaW5lIEFTTjFfUl9NSVNTSU5HX1NFQ09ORF9OVU1CRVIJCQkgMTM4CisjZGVmaW5lIEFTTjFfUl9NSVNTSU5HX1ZBTFVFCQkJCSAxODkKKyNkZWZpbmUgQVNOMV9SX01TVFJJTkdfTk9UX1VOSVZFUlNBTAkJCSAxMzkKKyNkZWZpbmUgQVNOMV9SX01TVFJJTkdfV1JPTkdfVEFHCQkJIDE0MAorI2RlZmluZSBBU04xX1JfTkVTVEVEX0FTTjFfU1RSSU5HCQkJIDE5NworI2RlZmluZSBBU04xX1JfTk9OX0hFWF9DSEFSQUNURVJTCQkJIDE0MQorI2RlZmluZSBBU04xX1JfTk9UX0FTQ0lJX0ZPUk1BVAkJCQkgMTkwCisjZGVmaW5lIEFTTjFfUl9OT1RfRU5PVUdIX0RBVEEJCQkJIDE0MgorI2RlZmluZSBBU04xX1JfTk9fQ09OVEVOVF9UWVBFCQkJCSAyMDkKKyNkZWZpbmUgQVNOMV9SX05PX0RFRkFVTFRfRElHRVNUCQkJIDIwMQorI2RlZmluZSBBU04xX1JfTk9fTUFUQ0hJTkdfQ0hPSUNFX1RZUEUJCQkgMTQzCisjZGVmaW5lIEFTTjFfUl9OT19NVUxUSVBBUlRfQk9EWV9GQUlMVVJFCQkgMjEwCisjZGVmaW5lIEFTTjFfUl9OT19NVUxUSVBBUlRfQk9VTkRBUlkJCQkgMjExCisjZGVmaW5lIEFTTjFfUl9OT19TSUdfQ09OVEVOVF9UWVBFCQkJIDIxMgorI2RlZmluZSBBU04xX1JfTlVMTF9JU19XUk9OR19MRU5HVEgJCQkgMTQ0CisjZGVmaW5lIEFTTjFfUl9PQkpFQ1RfTk9UX0FTQ0lJX0ZPUk1BVAkJCSAxOTEKKyNkZWZpbmUgQVNOMV9SX09ERF9OVU1CRVJfT0ZfQ0hBUlMJCQkgMTQ1CisjZGVmaW5lIEFTTjFfUl9QUklWQVRFX0tFWV9IRUFERVJfTUlTU0lORwkJIDE0NgorI2RlZmluZSBBU04xX1JfU0VDT05EX05VTUJFUl9UT09fTEFSR0UJCQkgMTQ3CisjZGVmaW5lIEFTTjFfUl9TRVFVRU5DRV9MRU5HVEhfTUlTTUFUQ0gJCQkgMTQ4CisjZGVmaW5lIEFTTjFfUl9TRVFVRU5DRV9OT1RfQ09OU1RSVUNURUQJCQkgMTQ5CisjZGVmaW5lIEFTTjFfUl9TRVFVRU5DRV9PUl9TRVRfTkVFRFNfQ09ORklHCQkgMTkyCisjZGVmaW5lIEFTTjFfUl9TSE9SVF9MSU5FCQkJCSAxNTAKKyNkZWZpbmUgQVNOMV9SX1NJR19JTlZBTElEX01JTUVfVFlQRQkJCSAyMTMKKyNkZWZpbmUgQVNOMV9SX1NUUkVBTUlOR19OT1RfU1VQUE9SVEVECQkJIDIwMgorI2RlZmluZSBBU04xX1JfU1RSSU5HX1RPT19MT05HCQkJCSAxNTEKKyNkZWZpbmUgQVNOMV9SX1NUUklOR19UT09fU0hPUlQJCQkJIDE1MgorI2RlZmluZSBBU04xX1JfVEFHX1ZBTFVFX1RPT19ISUdICQkJIDE1MworI2RlZmluZSBBU04xX1JfVEhFX0FTTjFfT0JKRUNUX0lERU5USUZJRVJfSVNfTk9UX0tOT1dOX0ZPUl9USElTX01EIDE1NAorI2RlZmluZSBBU04xX1JfVElNRV9OT1RfQVNDSUlfRk9STUFUCQkJIDE5MworI2RlZmluZSBBU04xX1JfVE9PX0xPTkcJCQkJCSAxNTUKKyNkZWZpbmUgQVNOMV9SX1RZUEVfTk9UX0NPTlNUUlVDVEVECQkJIDE1NgorI2RlZmluZSBBU04xX1JfVU5BQkxFX1RPX0RFQ09ERV9SU0FfS0VZCQkJIDE1NworI2RlZmluZSBBU04xX1JfVU5BQkxFX1RPX0RFQ09ERV9SU0FfUFJJVkFURV9LRVkJCSAxNTgKKyNkZWZpbmUgQVNOMV9SX1VORVhQRUNURURfRU9DCQkJCSAxNTkKKyNkZWZpbmUgQVNOMV9SX1VOSVZFUlNBTFNUUklOR19JU19XUk9OR19MRU5HVEgJCSAyMTUKKyNkZWZpbmUgQVNOMV9SX1VOS05PV05fRk9STUFUCQkJCSAxNjAKKyNkZWZpbmUgQVNOMV9SX1VOS05PV05fTUVTU0FHRV9ESUdFU1RfQUxHT1JJVEhNCQkgMTYxCisjZGVmaW5lIEFTTjFfUl9VTktOT1dOX09CSkVDVF9UWVBFCQkJIDE2MgorI2RlZmluZSBBU04xX1JfVU5LTk9XTl9QVUJMSUNfS0VZX1RZUEUJCQkgMTYzCisjZGVmaW5lIEFTTjFfUl9VTktOT1dOX1NJR05BVFVSRV9BTEdPUklUSE0JCSAxOTkKKyNkZWZpbmUgQVNOMV9SX1VOS05PV05fVEFHCQkJCSAxOTQKKyNkZWZpbmUgQVNOMV9SX1VOS09XTl9GT1JNQVQJCQkJIDE5NQorI2RlZmluZSBBU04xX1JfVU5TVVBQT1JURURfQU5ZX0RFRklORURfQllfVFlQRQkJIDE2NAorI2RlZmluZSBBU04xX1JfVU5TVVBQT1JURURfQ0lQSEVSCQkJIDE2NQorI2RlZmluZSBBU04xX1JfVU5TVVBQT1JURURfRU5DUllQVElPTl9BTEdPUklUSE0JCSAxNjYKKyNkZWZpbmUgQVNOMV9SX1VOU1VQUE9SVEVEX1BVQkxJQ19LRVlfVFlQRQkJIDE2NworI2RlZmluZSBBU04xX1JfVU5TVVBQT1JURURfVFlQRQkJCQkgMTk2CisjZGVmaW5lIEFTTjFfUl9XUk9OR19QVUJMSUNfS0VZX1RZUEUJCQkgMjAwCisjZGVmaW5lIEFTTjFfUl9XUk9OR19UQUcJCQkJIDE2OAorI2RlZmluZSBBU04xX1JfV1JPTkdfVFlQRQkJCQkgMTY5CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYXNuMV9tYWMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9hc24xX21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmQwZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYXNuMV9tYWMuaApAQCAtMCwwICsxLDU3OCBAQAorLyogY3J5cHRvL2FzbjEvYXNuMV9tYWMuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9BU04xX01BQ19ICisjZGVmaW5lIEhFQURFUl9BU04xX01BQ19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBBU04xX01BQ19FUlJfTElCCisjZGVmaW5lIEFTTjFfTUFDX0VSUl9MSUIJRVJSX0xJQl9BU04xCisjZW5kaWYgCisKKyNkZWZpbmUgQVNOMV9NQUNfSF9lcnIoZixyLGxpbmUpIFwKKwlFUlJfUFVUX2Vycm9yKEFTTjFfTUFDX0VSUl9MSUIsKGYpLChyKSxfX0ZJTEVfXywobGluZSkpCisKKyNkZWZpbmUgTV9BU04xX0QySV92YXJzKGEsdHlwZSxmdW5jKSBcCisJQVNOMV9jb25zdF9DVFggYzsgXAorCXR5cGUgcmV0PU5VTEw7IFwKKwlcCisJYy5wcD0oY29uc3QgdW5zaWduZWQgY2hhciAqKilwcDsgXAorCWMucT0gKihjb25zdCB1bnNpZ25lZCBjaGFyICoqKXBwOyBcCisJYy5lcnJvcj1FUlJfUl9ORVNURURfQVNOMV9FUlJPUjsgXAorCWlmICgoYSA9PSBOVUxMKSB8fCAoKCphKSA9PSBOVUxMKSkgXAorCQl7IGlmICgocmV0PSh0eXBlKWZ1bmMoKSkgPT0gTlVMTCkgXAorCQkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IH0gXAorCWVsc2UJcmV0PSgqYSk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9Jbml0KCkgXAorCWMucD0gKihjb25zdCB1bnNpZ25lZCBjaGFyICoqKXBwOyBcCisJYy5tYXg9KGxlbmd0aCA9PSAwKT8wOihjLnArbGVuZ3RoKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX0ZpbmlzaF8yKGEpIFwKKwlpZiAoIWFzbjFfY29uc3RfRmluaXNoKCZjKSkgXAorCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCSooY29uc3QgdW5zaWduZWQgY2hhciAqKilwcD1jLnA7IFwKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsgXAorCXJldHVybihyZXQpOworCisjZGVmaW5lIE1fQVNOMV9EMklfRmluaXNoKGEsZnVuYyxlKSBcCisJTV9BU04xX0QySV9GaW5pc2hfMihhKTsgXAorZXJyOlwKKwlBU04xX01BQ19IX2VycigoZSksYy5lcnJvcixjLmxpbmUpOyBcCisJYXNuMV9hZGRfZXJyb3IoKihjb25zdCB1bnNpZ25lZCBjaGFyICoqKXBwLChpbnQpKGMucS0gKnBwKSk7IFwKKwlpZiAoKHJldCAhPSBOVUxMKSAmJiAoKGEgPT0gTlVMTCkgfHwgKCphICE9IHJldCkpKSBmdW5jKHJldCk7IFwKKwlyZXR1cm4oTlVMTCkKKworI2RlZmluZSBNX0FTTjFfRDJJX3N0YXJ0X3NlcXVlbmNlKCkgXAorCWlmICghYXNuMV9HZXRTZXF1ZW5jZSgmYywmbGVuZ3RoKSkgXAorCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0KKy8qIEJlZ2luIHJlYWRpbmcgQVNOMSB3aXRob3V0IGEgc3Vycm91bmRpbmcgc2VxdWVuY2UgKi8KKyNkZWZpbmUgTV9BU04xX0QySV9iZWdpbigpIFwKKwljLnNsZW4gPSBsZW5ndGg7CisKKy8qIEVuZCByZWFkaW5nIEFTTjEgd2l0aCBubyBjaGVjayBvbiBsZW5ndGggKi8KKyNkZWZpbmUgTV9BU04xX0QySV9GaW5pc2hfbm9sZW4oYSwgZnVuYywgZSkgXAorCSpwcD1jLnA7IFwKKwlpZiAoYSAhPSBOVUxMKSAoKmEpPXJldDsgXAorCXJldHVybihyZXQpOyBcCitlcnI6XAorCUFTTjFfTUFDX0hfZXJyKChlKSxjLmVycm9yLGMubGluZSk7IFwKKwlhc24xX2FkZF9lcnJvcigqcHAsKGludCkoYy5xLSAqcHApKTsgXAorCWlmICgocmV0ICE9IE5VTEwpICYmICgoYSA9PSBOVUxMKSB8fCAoKmEgIT0gcmV0KSkpIGZ1bmMocmV0KTsgXAorCXJldHVybihOVUxMKQorCisjZGVmaW5lIE1fQVNOMV9EMklfZW5kX3NlcXVlbmNlKCkgXAorCSgoKGMuaW5mJjEpID09IDApPyhjLnNsZW4gPD0gMCk6IFwKKwkJKGMuZW9zPUFTTjFfY29uc3RfY2hlY2tfaW5maW5pdGVfZW5kKCZjLnAsYy5zbGVuKSkpCisKKy8qIERvbid0IHVzZSB0aGlzIHdpdGggZDJpX0FTTjFfQk9PTEVBTigpICovCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0KGIsIGZ1bmMpIFwKKwljLnE9Yy5wOyBcCisJaWYgKGZ1bmMoJihiKSwmYy5wLGMuc2xlbikgPT0gTlVMTCkgXAorCQl7Yy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJYy5zbGVuLT0oYy5wLWMucSk7CisKKy8qIERvbid0IHVzZSB0aGlzIHdpdGggZDJpX0FTTjFfQk9PTEVBTigpICovCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3godHlwZSxiLGZ1bmMpIFwKKwljLnE9Yy5wOyBcCisJaWYgKCgoRDJJX09GKHR5cGUpKWZ1bmMpKCYoYiksJmMucCxjLnNsZW4pID09IE5VTEwpIFwKKwkJe2MubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCWMuc2xlbi09KGMucC1jLnEpOworCisvKiB1c2UgdGhpcyBpbnN0ZWFkICgpICovCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X2ludChiLGZ1bmMpIFwKKwljLnE9Yy5wOyBcCisJaWYgKGZ1bmMoJihiKSwmYy5wLGMuc2xlbikgPCAwKSBcCisJCXtjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwljLnNsZW4tPShjLnAtYy5xKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9vcHQoYixmdW5jLHR5cGUpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiAoKE1fQVNOMV9uZXh0ICYgKH5WX0FTTjFfQ09OU1RSVUNURUQpKSBcCisJCT09IChWX0FTTjFfVU5JVkVSU0FMfCh0eXBlKSkpKSBcCisJCXsgXAorCQlNX0FTTjFfRDJJX2dldChiLGZ1bmMpOyBcCisJCX0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9pbnRfb3B0KGIsZnVuYyx0eXBlKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKChNX0FTTjFfbmV4dCAmICh+Vl9BU04xX0NPTlNUUlVDVEVEKSkgXAorCQk9PSAoVl9BU04xX1VOSVZFUlNBTHwodHlwZSkpKSkgXAorCQl7IFwKKwkJTV9BU04xX0QySV9nZXRfaW50KGIsZnVuYyk7IFwKKwkJfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X2ltcChiLGZ1bmMsIHR5cGUpIFwKKwlNX0FTTjFfbmV4dD0oX3RtcCYgVl9BU04xX0NPTlNUUlVDVEVEKXx0eXBlOyBcCisJYy5xPWMucDsgXAorCWlmIChmdW5jKCYoYiksJmMucCxjLnNsZW4pID09IE5VTEwpIFwKKwkJe2MubGluZT1fX0xJTkVfXzsgTV9BU04xX25leHRfcHJldiA9IF90bXA7IGdvdG8gZXJyOyB9IFwKKwljLnNsZW4tPShjLnAtYy5xKTtcCisJTV9BU04xX25leHRfcHJldj1fdG1wOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X0lNUF9vcHQoYixmdW5jLHRhZyx0eXBlKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKChNX0FTTjFfbmV4dCAmICh+Vl9BU04xX0NPTlNUUlVDVEVEKSkgPT0gXAorCQkoVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUN8KHRhZykpKSkgXAorCQl7IFwKKwkJdW5zaWduZWQgY2hhciBfdG1wID0gTV9BU04xX25leHQ7IFwKKwkJTV9BU04xX0QySV9nZXRfaW1wKGIsZnVuYywgdHlwZSk7XAorCQl9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2V0KHIsZnVuYyxmcmVlX2Z1bmMpIFwKKwkJTV9BU04xX0QySV9nZXRfaW1wX3NldChyLGZ1bmMsZnJlZV9mdW5jLCBcCisJCQlWX0FTTjFfU0VULFZfQVNOMV9VTklWRVJTQUwpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NldF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYykgXAorCQlNX0FTTjFfRDJJX2dldF9pbXBfc2V0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jLCBcCisJCQlWX0FTTjFfU0VULFZfQVNOMV9VTklWRVJTQUwpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NldF9vcHQocixmdW5jLGZyZWVfZnVuYykgXAorCWlmICgoYy5zbGVuICE9IDApICYmIChNX0FTTjFfbmV4dCA9PSAoVl9BU04xX1VOSVZFUlNBTHwgXAorCQlWX0FTTjFfQ09OU1RSVUNURUR8Vl9BU04xX1NFVCkpKVwKKwkJeyBNX0FTTjFfRDJJX2dldF9zZXQocixmdW5jLGZyZWVfZnVuYyk7IH0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9zZXRfb3B0X3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKE1fQVNOMV9uZXh0ID09IChWX0FTTjFfVU5JVkVSU0FMfCBcCisJCVZfQVNOMV9DT05TVFJVQ1RFRHxWX0FTTjFfU0VUKSkpXAorCQl7IE1fQVNOMV9EMklfZ2V0X3NldF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYyk7IH0KKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVRfb3B0KGEsZikgXAorCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCU1fQVNOMV9JMkRfbGVuX1NFVChhLGYpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X1NFVF9vcHQoYSxmKSBcCisJaWYgKChhICE9IE5VTEwpICYmIChza19udW0oYSkgIT0gMCkpIFwKKwkJTV9BU04xX0kyRF9wdXRfU0VUKGEsZik7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0Vfb3B0KGEsZikgXAorCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCU1fQVNOMV9JMkRfcHV0X1NFUVVFTkNFKGEsZik7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfU0VRVUVOQ0Vfb3B0X3R5cGUodHlwZSxhLGYpIFwKKwlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQlNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRV90eXBlKHR5cGUsYSxmKTsKKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9JTVBfc2V0X29wdChiLGZ1bmMsZnJlZV9mdW5jLHRhZykgXAorCWlmICgoYy5zbGVuICE9IDApICYmIFwKKwkJKE1fQVNOMV9uZXh0ID09IFwKKwkJKFZfQVNOMV9DT05URVhUX1NQRUNJRklDfFZfQVNOMV9DT05TVFJVQ1RFRHwodGFnKSkpKVwKKwkJeyBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcF9zZXQoYixmdW5jLGZyZWVfZnVuYyxcCisJCQl0YWcsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMpOyBcCisJCX0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9JTVBfc2V0X29wdF90eXBlKHR5cGUsYixmdW5jLGZyZWVfZnVuYyx0YWcpIFwKKwlpZiAoKGMuc2xlbiAhPSAwKSAmJiBcCisJCShNX0FTTjFfbmV4dCA9PSBcCisJCShWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQ3xWX0FTTjFfQ09OU1RSVUNURUR8KHRhZykpKSlcCisJCXsgXAorCQlNX0FTTjFfRDJJX2dldF9pbXBfc2V0X3R5cGUodHlwZSxiLGZ1bmMsZnJlZV9mdW5jLFwKKwkJCXRhZyxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7IFwKKwkJfQorCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X3NlcShyLGZ1bmMsZnJlZV9mdW5jKSBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcF9zZXQocixmdW5jLGZyZWVfZnVuYyxcCisJCQlWX0FTTjFfU0VRVUVOQ0UsVl9BU04xX1VOSVZFUlNBTCk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2VxX3R5cGUodHlwZSxyLGZ1bmMsZnJlZV9mdW5jKSBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcF9zZXRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMsXAorCQkJCQkgICAgVl9BU04xX1NFUVVFTkNFLFZfQVNOMV9VTklWRVJTQUwpCisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2VxX29wdChyLGZ1bmMsZnJlZV9mdW5jKSBcCisJaWYgKChjLnNsZW4gIT0gMCkgJiYgKE1fQVNOMV9uZXh0ID09IChWX0FTTjFfVU5JVkVSU0FMfCBcCisJCVZfQVNOMV9DT05TVFJVQ1RFRHxWX0FTTjFfU0VRVUVOQ0UpKSlcCisJCXsgTV9BU04xX0QySV9nZXRfc2VxKHIsZnVuYyxmcmVlX2Z1bmMpOyB9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2VxX29wdF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYykgXAorCWlmICgoYy5zbGVuICE9IDApICYmIChNX0FTTjFfbmV4dCA9PSAoVl9BU04xX1VOSVZFUlNBTHwgXAorCQlWX0FTTjFfQ09OU1RSVUNURUR8Vl9BU04xX1NFUVVFTkNFKSkpXAorCQl7IE1fQVNOMV9EMklfZ2V0X3NlcV90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYyk7IH0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9JTVBfc2V0KHIsZnVuYyxmcmVlX2Z1bmMseCkgXAorCQlNX0FTTjFfRDJJX2dldF9pbXBfc2V0KHIsZnVuYyxmcmVlX2Z1bmMsXAorCQkJeCxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfSU1QX3NldF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYyx4KSBcCisJCU1fQVNOMV9EMklfZ2V0X2ltcF9zZXRfdHlwZSh0eXBlLHIsZnVuYyxmcmVlX2Z1bmMsXAorCQkJeCxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfaW1wX3NldChyLGZ1bmMsZnJlZV9mdW5jLGEsYikgXAorCWMucT1jLnA7IFwKKwlpZiAoZDJpX0FTTjFfU0VUKCYociksJmMucCxjLnNsZW4sKGNoYXIgKigqKSgpKWZ1bmMsXAorCQkodm9pZCAoKikoKSlmcmVlX2Z1bmMsYSxiKSA9PSBOVUxMKSBcCisJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJYy5zbGVuLT0oYy5wLWMucSk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfaW1wX3NldF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYyxhLGIpIFwKKwljLnE9Yy5wOyBcCisJaWYgKGQyaV9BU04xX1NFVF9PRl8jI3R5cGUoJihyKSwmYy5wLGMuc2xlbixmdW5jLFwKKwkJCQkgICBmcmVlX2Z1bmMsYSxiKSA9PSBOVUxMKSBcCisJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJYy5zbGVuLT0oYy5wLWMucSk7CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfc2V0X3N0cmluZ3MocixmdW5jLGEsYikgXAorCWMucT1jLnA7IFwKKwlpZiAoZDJpX0FTTjFfU1RSSU5HX1NFVCgmKHIpLCZjLnAsYy5zbGVuLGEsYikgPT0gTlVMTCkgXAorCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCWMuc2xlbi09KGMucC1jLnEpOworCisjZGVmaW5lIE1fQVNOMV9EMklfZ2V0X0VYUF9vcHQocixmdW5jLHRhZykgXAorCWlmICgoYy5zbGVuICE9IDBMKSAmJiAoTV9BU04xX25leHQgPT0gXAorCQkoVl9BU04xX0NPTlNUUlVDVEVEfFZfQVNOMV9DT05URVhUX1NQRUNJRklDfHRhZykpKSBcCisJCXsgXAorCQlpbnQgVGluZixUdGFnLFRjbGFzczsgXAorCQlsb25nIFRsZW47IFwKKwkJXAorCQljLnE9Yy5wOyBcCisJCVRpbmY9QVNOMV9nZXRfb2JqZWN0KCZjLnAsJlRsZW4sJlR0YWcsJlRjbGFzcyxjLnNsZW4pOyBcCisJCWlmIChUaW5mICYgMHg4MCkgXAorCQkJeyBjLmVycm9yPUVSUl9SX0JBRF9BU04xX09CSkVDVF9IRUFERVI7IFwKKwkJCWMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQlpZiAoVGluZiA9PSAoVl9BU04xX0NPTlNUUlVDVEVEKzEpKSBcCisJCQkJCVRsZW4gPSBjLnNsZW4gLSAoYy5wIC0gYy5xKSAtIDI7IFwKKwkJaWYgKGZ1bmMoJihyKSwmYy5wLFRsZW4pID09IE5VTEwpIFwKKwkJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJCWlmIChUaW5mID09IChWX0FTTjFfQ09OU1RSVUNURUQrMSkpIHsgXAorCQkJVGxlbiA9IGMuc2xlbiAtIChjLnAgLSBjLnEpOyBcCisJCQlpZighQVNOMV9jb25zdF9jaGVja19pbmZpbml0ZV9lbmQoJmMucCwgVGxlbikpIFwKKwkJCQl7IGMuZXJyb3I9RVJSX1JfTUlTU0lOR19BU04xX0VPUzsgXAorCQkJCWMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQl9XAorCQljLnNsZW4tPShjLnAtYy5xKTsgXAorCQl9CisKKyNkZWZpbmUgTV9BU04xX0QySV9nZXRfRVhQX3NldF9vcHQocixmdW5jLGZyZWVfZnVuYyx0YWcsYikgXAorCWlmICgoYy5zbGVuICE9IDApICYmIChNX0FTTjFfbmV4dCA9PSBcCisJCShWX0FTTjFfQ09OU1RSVUNURUR8Vl9BU04xX0NPTlRFWFRfU1BFQ0lGSUN8dGFnKSkpIFwKKwkJeyBcCisJCWludCBUaW5mLFR0YWcsVGNsYXNzOyBcCisJCWxvbmcgVGxlbjsgXAorCQlcCisJCWMucT1jLnA7IFwKKwkJVGluZj1BU04xX2dldF9vYmplY3QoJmMucCwmVGxlbiwmVHRhZywmVGNsYXNzLGMuc2xlbik7IFwKKwkJaWYgKFRpbmYgJiAweDgwKSBcCisJCQl7IGMuZXJyb3I9RVJSX1JfQkFEX0FTTjFfT0JKRUNUX0hFQURFUjsgXAorCQkJYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJCWlmIChUaW5mID09IChWX0FTTjFfQ09OU1RSVUNURUQrMSkpIFwKKwkJCQkJVGxlbiA9IGMuc2xlbiAtIChjLnAgLSBjLnEpIC0gMjsgXAorCQlpZiAoZDJpX0FTTjFfU0VUKCYociksJmMucCxUbGVuLChjaGFyICooKikoKSlmdW5jLCBcCisJCQkodm9pZCAoKikoKSlmcmVlX2Z1bmMsIFwKKwkJCWIsVl9BU04xX1VOSVZFUlNBTCkgPT0gTlVMTCkgXAorCQkJeyBjLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkJaWYgKFRpbmYgPT0gKFZfQVNOMV9DT05TVFJVQ1RFRCsxKSkgeyBcCisJCQlUbGVuID0gYy5zbGVuIC0gKGMucCAtIGMucSk7IFwKKwkJCWlmKCFBU04xX2NoZWNrX2luZmluaXRlX2VuZCgmYy5wLCBUbGVuKSkgXAorCQkJCXsgYy5lcnJvcj1FUlJfUl9NSVNTSU5HX0FTTjFfRU9TOyBcCisJCQkJYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJCX1cCisJCWMuc2xlbi09KGMucC1jLnEpOyBcCisJCX0KKworI2RlZmluZSBNX0FTTjFfRDJJX2dldF9FWFBfc2V0X29wdF90eXBlKHR5cGUscixmdW5jLGZyZWVfZnVuYyx0YWcsYikgXAorCWlmICgoYy5zbGVuICE9IDApICYmIChNX0FTTjFfbmV4dCA9PSBcCisJCShWX0FTTjFfQ09OU1RSVUNURUR8Vl9BU04xX0NPTlRFWFRfU1BFQ0lGSUN8dGFnKSkpIFwKKwkJeyBcCisJCWludCBUaW5mLFR0YWcsVGNsYXNzOyBcCisJCWxvbmcgVGxlbjsgXAorCQlcCisJCWMucT1jLnA7IFwKKwkJVGluZj1BU04xX2dldF9vYmplY3QoJmMucCwmVGxlbiwmVHRhZywmVGNsYXNzLGMuc2xlbik7IFwKKwkJaWYgKFRpbmYgJiAweDgwKSBcCisJCQl7IGMuZXJyb3I9RVJSX1JfQkFEX0FTTjFfT0JKRUNUX0hFQURFUjsgXAorCQkJYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjsgfSBcCisJCWlmIChUaW5mID09IChWX0FTTjFfQ09OU1RSVUNURUQrMSkpIFwKKwkJCQkJVGxlbiA9IGMuc2xlbiAtIChjLnAgLSBjLnEpIC0gMjsgXAorCQlpZiAoZDJpX0FTTjFfU0VUX09GXyMjdHlwZSgmKHIpLCZjLnAsVGxlbixmdW5jLCBcCisJCQlmcmVlX2Z1bmMsYixWX0FTTjFfVU5JVkVSU0FMKSA9PSBOVUxMKSBcCisJCQl7IGMubGluZT1fX0xJTkVfXzsgZ290byBlcnI7IH0gXAorCQlpZiAoVGluZiA9PSAoVl9BU04xX0NPTlNUUlVDVEVEKzEpKSB7IFwKKwkJCVRsZW4gPSBjLnNsZW4gLSAoYy5wIC0gYy5xKTsgXAorCQkJaWYoIUFTTjFfY2hlY2tfaW5maW5pdGVfZW5kKCZjLnAsIFRsZW4pKSBcCisJCQkJeyBjLmVycm9yPUVSUl9SX01JU1NJTkdfQVNOMV9FT1M7IFwKKwkJCQljLmxpbmU9X19MSU5FX187IGdvdG8gZXJyOyB9IFwKKwkJfVwKKwkJYy5zbGVuLT0oYy5wLWMucSk7IFwKKwkJfQorCisvKiBOZXcgbWFjcm9zICovCisjZGVmaW5lIE1fQVNOMV9OZXdfTWFsbG9jKHJldCx0eXBlKSBcCisJaWYgKChyZXQ9KHR5cGUgKilPUEVOU1NMX21hbGxvYyhzaXplb2YodHlwZSkpKSA9PSBOVUxMKSBcCisJCXsgYy5saW5lPV9fTElORV9fOyBnb3RvIGVycjI7IH0KKworI2RlZmluZSBNX0FTTjFfTmV3KGFyZyxmdW5jKSBcCisJaWYgKCgoYXJnKT1mdW5jKCkpID09IE5VTEwpIHJldHVybihOVUxMKQorCisjZGVmaW5lIE1fQVNOMV9OZXdfRXJyb3IoYSkgXAorLyoJZXJyOglBU04xX01BQ19IX2VycigoYSksRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IsYy5saW5lKTsgXAorCQlyZXR1cm4oTlVMTCk7Ki8gXAorCWVycjI6CUFTTjFfTUFDX0hfZXJyKChhKSxFUlJfUl9NQUxMT0NfRkFJTFVSRSxjLmxpbmUpOyBcCisJCXJldHVybihOVUxMKQorCisKKy8qIEJJRyBVR0xZIFdBUk5JTkchICBUaGlzIGlzIHNvIGRhbW4gdWdseSBJIHdhbm5hIHB1a2UuICBVbmZvcnR1bmF0ZWx5LAorICAgc29tZSBtYWNyb3MgdGhhdCB1c2UgQVNOMV9jb25zdF9DVFggc3RpbGwgaW5zaXN0IG9uIHdyaXRpbmcgaW4gdGhlIGlucHV0CisgICBzdHJlYW0uICBBUkdIISAgQVJHSCEgIEFSR0ghICBMZXQncyBnZXQgcmlkIG9mIHRoaXMgbWFjcm8gcGFja2FnZS4KKyAgIFBsZWFzZT8JCQkJCQktLSBSaWNoYXJkIExldml0dGUgKi8KKyNkZWZpbmUgTV9BU04xX25leHQJCSgqKCh1bnNpZ25lZCBjaGFyICopKGMucCkpKQorI2RlZmluZSBNX0FTTjFfbmV4dF9wcmV2CSgqKCh1bnNpZ25lZCBjaGFyICopKGMucSkpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNX0FTTjFfSTJEX3ZhcnMoYSkJaW50IHI9MCxyZXQ9MDsgXAorCQkJCXVuc2lnbmVkIGNoYXIgKnA7IFwKKwkJCQlpZiAoYSA9PSBOVUxMKSByZXR1cm4oMCkKKworLyogTGVuZ3RoIE1hY3JvcyAqLworI2RlZmluZSBNX0FTTjFfSTJEX2xlbihhLGYpCXJldCs9ZihhLE5VTEwpCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0lNUF9vcHQoYSxmKQlpZiAoYSAhPSBOVUxMKSBNX0FTTjFfSTJEX2xlbihhLGYpCisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fU0VUKGEsZikgXAorCQlyZXQrPWkyZF9BU04xX1NFVChhLE5VTEwsZixWX0FTTjFfU0VULFZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVRfdHlwZSh0eXBlLGEsZikgXAorCQlyZXQrPWkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSxOVUxMLGYsVl9BU04xX1NFVCwgXAorCQkJCQkgICAgVl9BU04xX1VOSVZFUlNBTCxJU19TRVQpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX1NFUVVFTkNFKGEsZikgXAorCQlyZXQrPWkyZF9BU04xX1NFVChhLE5VTEwsZixWX0FTTjFfU0VRVUVOQ0UsVl9BU04xX1VOSVZFUlNBTCwgXAorCQkJCSAgSVNfU0VRVUVOQ0UpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX1NFUVVFTkNFX3R5cGUodHlwZSxhLGYpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsTlVMTCxmLFZfQVNOMV9TRVFVRU5DRSwgXAorCQkJCQkgICAgVl9BU04xX1VOSVZFUlNBTCxJU19TRVFVRU5DRSkKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRV9vcHQoYSxmKSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQlNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRShhLGYpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmKSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfIyN0eXBlIyNfbnVtKGEpICE9IDApKSBcCisJCQlNX0FTTjFfSTJEX2xlbl9TRVFVRU5DRV90eXBlKHR5cGUsYSxmKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9JTVBfU0VUKGEsZix4KSBcCisJCXJldCs9aTJkX0FTTjFfU0VUKGEsTlVMTCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsSVNfU0VUKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9JTVBfU0VUX3R5cGUodHlwZSxhLGYseCkgXAorCQlyZXQrPWkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSxOVUxMLGYseCwgXAorCQkJCQkgICAgVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsSVNfU0VUKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9JTVBfU0VUX29wdChhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrX251bShhKSAhPSAwKSkgXAorCQkJcmV0Kz1pMmRfQVNOMV9TRVQoYSxOVUxMLGYseCxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQywgXAorCQkJCQkgIElTX1NFVCk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFVF9vcHRfdHlwZSh0eXBlLGEsZix4KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfIyN0eXBlIyNfbnVtKGEpICE9IDApKSBcCisJCQlyZXQrPWkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSxOVUxMLGYseCwgXAorCQkJCQkgICAgICAgVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsSVNfU0VUKTsKKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9JTVBfU0VRVUVOQ0UoYSxmLHgpIFwKKwkJcmV0Kz1pMmRfQVNOMV9TRVQoYSxOVUxMLGYseCxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQywgXAorCQkJCSAgSVNfU0VRVUVOQ0UpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0lNUF9TRVFVRU5DRV9vcHQoYSxmLHgpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza19udW0oYSkgIT0gMCkpIFwKKwkJCXJldCs9aTJkX0FTTjFfU0VUKGEsTlVMTCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkJICBJU19TRVFVRU5DRSk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fSU1QX1NFUVVFTkNFX29wdF90eXBlKHR5cGUsYSxmLHgpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza18jI3R5cGUjI19udW0oYSkgIT0gMCkpIFwKKwkJCXJldCs9aTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLE5VTEwsZix4LCBcCisJCQkJCQkgICAgVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkJCSAgICBJU19TRVFVRU5DRSk7CisKKyNkZWZpbmUgTV9BU04xX0kyRF9sZW5fRVhQX29wdChhLGYsbXRhZyx2KSBcCisJCWlmIChhICE9IE5VTEwpXAorCQkJeyBcCisJCQl2PWYoYSxOVUxMKTsgXAorCQkJcmV0Kz1BU04xX29iamVjdF9zaXplKDEsdixtdGFnKTsgXAorCQkJfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0VYUF9TRVRfb3B0KGEsZixtdGFnLHRhZyx2KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKVwKKwkJCXsgXAorCQkJdj1pMmRfQVNOMV9TRVQoYSxOVUxMLGYsdGFnLFZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKTsgXAorCQkJcmV0Kz1BU04xX29iamVjdF9zaXplKDEsdixtdGFnKTsgXAorCQkJfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfbGVuX0VYUF9TRVFVRU5DRV9vcHQoYSxmLG10YWcsdGFnLHYpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza19udW0oYSkgIT0gMCkpXAorCQkJeyBcCisJCQl2PWkyZF9BU04xX1NFVChhLE5VTEwsZix0YWcsVl9BU04xX1VOSVZFUlNBTCwgXAorCQkJCSAgICAgICBJU19TRVFVRU5DRSk7IFwKKwkJCXJldCs9QVNOMV9vYmplY3Rfc2l6ZSgxLHYsbXRhZyk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX2xlbl9FWFBfU0VRVUVOQ0Vfb3B0X3R5cGUodHlwZSxhLGYsbXRhZyx0YWcsdikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSlcCisJCQl7IFwKKwkJCXY9aTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLE5VTEwsZix0YWcsIFwKKwkJCQkJCSBWX0FTTjFfVU5JVkVSU0FMLCBcCisJCQkJCQkgSVNfU0VRVUVOQ0UpOyBcCisJCQlyZXQrPUFTTjFfb2JqZWN0X3NpemUoMSx2LG10YWcpOyBcCisJCQl9CisKKy8qIFB1dCBNYWNyb3MgKi8KKyNkZWZpbmUgTV9BU04xX0kyRF9wdXQoYSxmKQlmKGEsJnApCisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfSU1QX29wdChhLGYsdCkJXAorCQlpZiAoYSAhPSBOVUxMKSBcCisJCQl7IFwKKwkJCXVuc2lnbmVkIGNoYXIgKnE9cDsgXAorCQkJZihhLCZwKTsgXAorCQkJKnE9KFZfQVNOMV9DT05URVhUX1NQRUNJRklDfHR8KCpxJlZfQVNOMV9DT05TVFJVQ1RFRCkpO1wKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVQoYSxmKSBpMmRfQVNOMV9TRVQoYSwmcCxmLFZfQVNOMV9TRVQsXAorCQkJVl9BU04xX1VOSVZFUlNBTCxJU19TRVQpCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X1NFVF90eXBlKHR5cGUsYSxmKSBcCisgICAgIGkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSwmcCxmLFZfQVNOMV9TRVQsVl9BU04xX1VOSVZFUlNBTCxJU19TRVQpCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0lNUF9TRVQoYSxmLHgpIGkyZF9BU04xX1NFVChhLCZwLGYseCxcCisJCQlWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyxJU19TRVQpCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0lNUF9TRVRfdHlwZSh0eXBlLGEsZix4KSBcCisgICAgIGkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSwmcCxmLHgsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsSVNfU0VUKQorI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VRVUVOQ0UoYSxmLHgpIGkyZF9BU04xX1NFVChhLCZwLGYseCxcCisJCQlWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyxJU19TRVFVRU5DRSkKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRShhLGYpIGkyZF9BU04xX1NFVChhLCZwLGYsVl9BU04xX1NFUVVFTkNFLFwKKwkJCQkJICAgICBWX0FTTjFfVU5JVkVSU0FMLElTX1NFUVVFTkNFKQorCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X1NFUVVFTkNFX3R5cGUodHlwZSxhLGYpIFwKKyAgICAgaTJkX0FTTjFfU0VUX09GXyMjdHlwZShhLCZwLGYsVl9BU04xX1NFUVVFTkNFLFZfQVNOMV9VTklWRVJTQUwsIFwKKwkJCSAgICBJU19TRVFVRU5DRSkKKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRV9vcHQoYSxmKSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQlNX0FTTjFfSTJEX3B1dF9TRVFVRU5DRShhLGYpOworCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0lNUF9TRVRfb3B0KGEsZix4KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQl7IGkyZF9BU04xX1NFVChhLCZwLGYseCxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQywgXAorCQkJCSAgICAgICBJU19TRVQpOyB9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9wdXRfSU1QX1NFVF9vcHRfdHlwZSh0eXBlLGEsZix4KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfIyN0eXBlIyNfbnVtKGEpICE9IDApKSBcCisJCQl7IGkyZF9BU04xX1NFVF9PRl8jI3R5cGUoYSwmcCxmLHgsIFwKKwkJCQkJCSBWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQywgXAorCQkJCQkJIElTX1NFVCk7IH0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VRVUVOQ0Vfb3B0KGEsZix4KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQl7IGkyZF9BU04xX1NFVChhLCZwLGYseCxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQywgXAorCQkJCSAgICAgICBJU19TRVFVRU5DRSk7IH0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9JTVBfU0VRVUVOQ0Vfb3B0X3R5cGUodHlwZSxhLGYseCkgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQkJeyBpMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsJnAsZix4LCBcCisJCQkJCQkgVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMsIFwKKwkJCQkJCSBJU19TRVFVRU5DRSk7IH0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9FWFBfb3B0KGEsZix0YWcsdikgXAorCQlpZiAoYSAhPSBOVUxMKSBcCisJCQl7IFwKKwkJCUFTTjFfcHV0X29iamVjdCgmcCwxLHYsdGFnLFZfQVNOMV9DT05URVhUX1NQRUNJRklDKTsgXAorCQkJZihhLCZwKTsgXAorCQkJfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0VYUF9TRVRfb3B0KGEsZixtdGFnLHRhZyx2KSBcCisJCWlmICgoYSAhPSBOVUxMKSAmJiAoc2tfbnVtKGEpICE9IDApKSBcCisJCQl7IFwKKwkJCUFTTjFfcHV0X29iamVjdCgmcCwxLHYsbXRhZyxWX0FTTjFfQ09OVEVYVF9TUEVDSUZJQyk7IFwKKwkJCWkyZF9BU04xX1NFVChhLCZwLGYsdGFnLFZfQVNOMV9VTklWRVJTQUwsSVNfU0VUKTsgXAorCQkJfQorCisjZGVmaW5lIE1fQVNOMV9JMkRfcHV0X0VYUF9TRVFVRU5DRV9vcHQoYSxmLG10YWcsdGFnLHYpIFwKKwkJaWYgKChhICE9IE5VTEwpICYmIChza19udW0oYSkgIT0gMCkpIFwKKwkJCXsgXAorCQkJQVNOMV9wdXRfb2JqZWN0KCZwLDEsdixtdGFnLFZfQVNOMV9DT05URVhUX1NQRUNJRklDKTsgXAorCQkJaTJkX0FTTjFfU0VUKGEsJnAsZix0YWcsVl9BU04xX1VOSVZFUlNBTCxJU19TRVFVRU5DRSk7IFwKKwkJCX0KKworI2RlZmluZSBNX0FTTjFfSTJEX3B1dF9FWFBfU0VRVUVOQ0Vfb3B0X3R5cGUodHlwZSxhLGYsbXRhZyx0YWcsdikgXAorCQlpZiAoKGEgIT0gTlVMTCkgJiYgKHNrXyMjdHlwZSMjX251bShhKSAhPSAwKSkgXAorCQkJeyBcCisJCQlBU04xX3B1dF9vYmplY3QoJnAsMSx2LG10YWcsVl9BU04xX0NPTlRFWFRfU1BFQ0lGSUMpOyBcCisJCQlpMmRfQVNOMV9TRVRfT0ZfIyN0eXBlKGEsJnAsZix0YWcsVl9BU04xX1VOSVZFUlNBTCwgXAorCQkJCQkgICAgICAgSVNfU0VRVUVOQ0UpOyBcCisJCQl9CisKKyNkZWZpbmUgTV9BU04xX0kyRF9zZXFfdG90YWwoKSBcCisJCXI9QVNOMV9vYmplY3Rfc2l6ZSgxLHJldCxWX0FTTjFfU0VRVUVOQ0UpOyBcCisJCWlmIChwcCA9PSBOVUxMKSByZXR1cm4ocik7IFwKKwkJcD0gKnBwOyBcCisJCUFTTjFfcHV0X29iamVjdCgmcCwxLHJldCxWX0FTTjFfU0VRVUVOQ0UsVl9BU04xX1VOSVZFUlNBTCkKKworI2RlZmluZSBNX0FTTjFfSTJEX0lORl9zZXFfc3RhcnQodGFnLGN0eCkgXAorCQkqKHArKyk9KFZfQVNOMV9DT05TVFJVQ1RFRHwodGFnKXwoY3R4KSk7IFwKKwkJKihwKyspPTB4ODAKKworI2RlZmluZSBNX0FTTjFfSTJEX0lORl9zZXFfZW5kKCkgKihwKyspPTB4MDA7ICoocCsrKT0weDAwCisKKyNkZWZpbmUgTV9BU04xX0kyRF9maW5pc2goKQkqcHA9cDsgXAorCQkJCXJldHVybihyKTsKKworaW50IGFzbjFfR2V0U2VxdWVuY2UoQVNOMV9jb25zdF9DVFggKmMsIGxvbmcgKmxlbmd0aCk7Cit2b2lkIGFzbjFfYWRkX2Vycm9yKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MsaW50IG9mZnNldCk7CisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYXNuMXQuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9hc24xdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzBlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYXNuMXQuaApAQCAtMCwwICsxLDk2MCBAQAorLyogYXNuMXQuaCAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2lmbmRlZiBIRUFERVJfQVNOMVRfSAorI2RlZmluZSBIRUFERVJfQVNOMVRfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaWZkZWYgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTworIyB1bmRlZiBPUEVOU1NMX0VYVEVSTgorIyBkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9FWFBPUlQKKyNlbmRpZgorCisvKiBBU04xIHRlbXBsYXRlIGRlZmluZXMsIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKyNpZm5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKy8qIE1hY3JvIHRvIG9idGFpbiBBU04xX0FEQiBwb2ludGVyIGZyb20gYSB0eXBlIChvbmx5IHVzZWQgaW50ZXJuYWxseSkgKi8KKyNkZWZpbmUgQVNOMV9BREJfcHRyKGlwdHIpICgoY29uc3QgQVNOMV9BREIgKikoaXB0cikpCisKKworLyogTWFjcm9zIGZvciBzdGFydCBhbmQgZW5kIG9mIEFTTjFfSVRFTSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX3N0YXJ0KGl0bmFtZSkgXAorCU9QRU5TU0xfR0xPQkFMIGNvbnN0IEFTTjFfSVRFTSBpdG5hbWUjI19pdCA9IHsKKworI2RlZmluZSBBU04xX0lURU1fZW5kKGl0bmFtZSkgXAorCQl9OworCisjZWxzZQorCisvKiBNYWNybyB0byBvYnRhaW4gQVNOMV9BREIgcG9pbnRlciBmcm9tIGEgdHlwZSAob25seSB1c2VkIGludGVybmFsbHkpICovCisjZGVmaW5lIEFTTjFfQURCX3B0cihpcHRyKSAoKGNvbnN0IEFTTjFfQURCICopKGlwdHIoKSkpCisKKworLyogTWFjcm9zIGZvciBzdGFydCBhbmQgZW5kIG9mIEFTTjFfSVRFTSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX3N0YXJ0KGl0bmFtZSkgXAorCWNvbnN0IEFTTjFfSVRFTSAqIGl0bmFtZSMjX2l0KHZvaWQpIFwKKwl7IFwKKwkJc3RhdGljIGNvbnN0IEFTTjFfSVRFTSBsb2NhbF9pdCA9IHsgCisKKyNkZWZpbmUgQVNOMV9JVEVNX2VuZChpdG5hbWUpIFwKKwkJfTsgXAorCXJldHVybiAmbG9jYWxfaXQ7IFwKKwl9CisKKyNlbmRpZgorCisKKy8qIE1hY3JvcyB0byBhaWQgQVNOMSB0ZW1wbGF0ZSB3cml0aW5nICovCisKKyNkZWZpbmUgQVNOMV9JVEVNX1RFTVBMQVRFKHRuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfVEVNUExBVEUgdG5hbWUjI19pdGVtX3R0IAorCisjZGVmaW5lIEFTTjFfSVRFTV9URU1QTEFURV9FTkQodG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1BSSU1JVElWRSxcCisJCS0xLFwKKwkJJnRuYW1lIyNfaXRlbV90dCxcCisJCTAsXAorCQlOVUxMLFwKKwkJMCxcCisJCSN0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworCisvKiBUaGlzIGlzIGEgQVNOMSB0eXBlIHdoaWNoIGp1c3QgZW1iZWRzIGEgdGVtcGxhdGUgKi8KKyAKKy8qIFRoaXMgcGFpciBoZWxwcyBkZWNsYXJlIGEgU0VRVUVOQ0UuIFdlIGNhbiBkbzoKKyAqCisgKiAJQVNOMV9TRVFVRU5DRShzdG5hbWUpID0geworICogCQkuLi4gU0VRVUVOQ0UgY29tcG9uZW50cyAuLi4KKyAqIAl9IEFTTjFfU0VRVUVOQ0VfRU5EKHN0bmFtZSkKKyAqCisgKiAJVGhpcyB3aWxsIHByb2R1Y2UgYW4gQVNOMV9JVEVNIGNhbGxlZCBzdG5hbWVfaXQKKyAqCWZvciBhIHN0cnVjdHVyZSBjYWxsZWQgc3RuYW1lLgorICoKKyAqIAlJZiB5b3Ugd2FudCB0aGUgc2FtZSBzdHJ1Y3R1cmUgYnV0IGEgZGlmZmVyZW50CisgKgluYW1lIHRoZW4gdXNlOgorICoKKyAqIAlBU04xX1NFUVVFTkNFKGl0bmFtZSkgPSB7CisgKiAJCS4uLiBTRVFVRU5DRSBjb21wb25lbnRzIC4uLgorICogCX0gQVNOMV9TRVFVRU5DRV9FTkRfbmFtZShzdG5hbWUsIGl0bmFtZSkKKyAqCisgKglUaGlzIHdpbGwgY3JlYXRlIGFuIGl0ZW0gY2FsbGVkIGl0bmFtZV9pdCB1c2luZworICoJYSBzdHJ1Y3R1cmUgY2FsbGVkIHN0bmFtZS4KKyAqLworCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0UodG5hbWUpIFwKKwlzdGF0aWMgY29uc3QgQVNOMV9URU1QTEFURSB0bmFtZSMjX3NlcV90dFtdIAorCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfRU5EKHN0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfbmFtZShzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX0VORF9uYW1lKHN0bmFtZSwgdG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1NFUVVFTkNFLFwKKwkJVl9BU04xX1NFUVVFTkNFLFwKKwkJdG5hbWUjI19zZXFfdHQsXAorCQlzaXplb2YodG5hbWUjI19zZXFfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJTlVMTCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworI2RlZmluZSBBU04xX05ERUZfU0VRVUVOQ0UodG5hbWUpIFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfTkRFRl9TRVFVRU5DRV9jYih0bmFtZSwgY2IpIFwKKwlBU04xX1NFUVVFTkNFX2NiKHRuYW1lLCBjYikKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX2NiKHRuYW1lLCBjYikgXAorCXN0YXRpYyBjb25zdCBBU04xX0FVWCB0bmFtZSMjX2F1eCA9IHtOVUxMLCAwLCAwLCAwLCBjYiwgMH07IFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfQlJPS0VOX1NFUVVFTkNFKHRuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQVVYIHRuYW1lIyNfYXV4ID0ge05VTEwsIEFTTjFfQUZMR19CUk9LRU4sIDAsIDAsIDAsIDB9OyBcCisJQVNOMV9TRVFVRU5DRSh0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX3JlZih0bmFtZSwgY2IsIGxjaykgXAorCXN0YXRpYyBjb25zdCBBU04xX0FVWCB0bmFtZSMjX2F1eCA9IHtOVUxMLCBBU04xX0FGTEdfUkVGQ09VTlQsIG9mZnNldG9mKHRuYW1lLCByZWZlcmVuY2VzKSwgbGNrLCBjYiwgMH07IFwKKwlBU04xX1NFUVVFTkNFKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfZW5jKHRuYW1lLCBlbmMsIGNiKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQVVYIHRuYW1lIyNfYXV4ID0ge05VTEwsIEFTTjFfQUZMR19FTkNPRElORywgMCwgMCwgY2IsIG9mZnNldG9mKHRuYW1lLCBlbmMpfTsgXAorCUFTTjFfU0VRVUVOQ0UodG5hbWUpCisKKyNkZWZpbmUgQVNOMV9OREVGX1NFUVVFTkNFX0VORCh0bmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfTkRFRl9TRVFVRU5DRSxcCisJCVZfQVNOMV9TRVFVRU5DRSxcCisJCXRuYW1lIyNfc2VxX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfc2VxX3R0KSAvIHNpemVvZihBU04xX1RFTVBMQVRFKSxcCisJCU5VTEwsXAorCQlzaXplb2YodG5hbWUpLFwKKwkJI3RuYW1lIFwKKwlBU04xX0lURU1fZW5kKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfQlJPS0VOX1NFUVVFTkNFX0VORChzdG5hbWUpIEFTTjFfU0VRVUVOQ0VfRU5EX3JlZihzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBBU04xX1NFUVVFTkNFX0VORF9lbmMoc3RuYW1lLCB0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSkgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9FTkRfcmVmKHN0bmFtZSwgdG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX1NFUVVFTkNFLFwKKwkJVl9BU04xX1NFUVVFTkNFLFwKKwkJdG5hbWUjI19zZXFfdHQsXAorCQlzaXplb2YodG5hbWUjI19zZXFfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJJnRuYW1lIyNfYXV4LFwKKwkJc2l6ZW9mKHN0bmFtZSksXAorCQkjc3RuYW1lIFwKKwlBU04xX0lURU1fZW5kKHRuYW1lKQorCisjZGVmaW5lIEFTTjFfTkRFRl9TRVFVRU5DRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfTkRFRl9TRVFVRU5DRSxcCisJCVZfQVNOMV9TRVFVRU5DRSxcCisJCXRuYW1lIyNfc2VxX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfc2VxX3R0KSAvIHNpemVvZihBU04xX1RFTVBMQVRFKSxcCisJCSZ0bmFtZSMjX2F1eCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworCisvKiBUaGlzIHBhaXIgaGVscHMgZGVjbGFyZSBhIENIT0lDRSB0eXBlLiBXZSBjYW4gZG86CisgKgorICogCUFTTjFfQ0hPSUNFKGNobmFtZSkgPSB7CisgKiAJCS4uLiBDSE9JQ0Ugb3B0aW9ucyAuLi4KKyAqIAlBU04xX0NIT0lDRV9FTkQoY2huYW1lKQorICoKKyAqIAlUaGlzIHdpbGwgcHJvZHVjZSBhbiBBU04xX0lURU0gY2FsbGVkIGNobmFtZV9pdAorICoJZm9yIGEgc3RydWN0dXJlIGNhbGxlZCBjaG5hbWUuIFRoZSBzdHJ1Y3R1cmUKKyAqCWRlZmluaXRpb24gbXVzdCBsb29rIGxpa2UgdGhpczoKKyAqCXR5cGVkZWYgc3RydWN0IHsKKyAqCQlpbnQgdHlwZTsKKyAqCQl1bmlvbiB7CisgKgkJCUFTTjFfU09NRVRISU5HICpvcHQxOworICoJCQlBU04xX1NPTUVPVEhFUiAqb3B0MjsKKyAqCQl9IHZhbHVlOworICoJfSBjaG5hbWU7CisgKgkKKyAqCXRoZSBuYW1lIG9mIHRoZSBzZWxlY3RvciBtdXN0IGJlICd0eXBlJy4KKyAqIAl0byB1c2UgYW4gYWx0ZXJuYXRpdmUgc2VsZWN0b3IgbmFtZSB1c2UgdGhlCisgKiAgICAgIEFTTjFfQ0hPSUNFX0VORF9zZWxlY3RvcigpIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBBU04xX0NIT0lDRSh0bmFtZSkgXAorCXN0YXRpYyBjb25zdCBBU04xX1RFTVBMQVRFIHRuYW1lIyNfY2hfdHRbXSAKKworI2RlZmluZSBBU04xX0NIT0lDRV9jYih0bmFtZSwgY2IpIFwKKwlzdGF0aWMgY29uc3QgQVNOMV9BVVggdG5hbWUjI19hdXggPSB7TlVMTCwgMCwgMCwgMCwgY2IsIDB9OyBcCisJQVNOMV9DSE9JQ0UodG5hbWUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EKHN0bmFtZSkgQVNOMV9DSE9JQ0VfRU5EX25hbWUoc3RuYW1lLCBzdG5hbWUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EX25hbWUoc3RuYW1lLCB0bmFtZSkgQVNOMV9DSE9JQ0VfRU5EX3NlbGVjdG9yKHN0bmFtZSwgdG5hbWUsIHR5cGUpCisKKyNkZWZpbmUgQVNOMV9DSE9JQ0VfRU5EX3NlbGVjdG9yKHN0bmFtZSwgdG5hbWUsIHNlbG5hbWUpIFwKKwk7XAorCUFTTjFfSVRFTV9zdGFydCh0bmFtZSkgXAorCQlBU04xX0lUWVBFX0NIT0lDRSxcCisJCW9mZnNldG9mKHN0bmFtZSxzZWxuYW1lKSAsXAorCQl0bmFtZSMjX2NoX3R0LFwKKwkJc2l6ZW9mKHRuYW1lIyNfY2hfdHQpIC8gc2l6ZW9mKEFTTjFfVEVNUExBVEUpLFwKKwkJTlVMTCxcCisJCXNpemVvZihzdG5hbWUpLFwKKwkJI3N0bmFtZSBcCisJQVNOMV9JVEVNX2VuZCh0bmFtZSkKKworI2RlZmluZSBBU04xX0NIT0lDRV9FTkRfY2Ioc3RuYW1lLCB0bmFtZSwgc2VsbmFtZSkgXAorCTtcCisJQVNOMV9JVEVNX3N0YXJ0KHRuYW1lKSBcCisJCUFTTjFfSVRZUEVfQ0hPSUNFLFwKKwkJb2Zmc2V0b2Yoc3RuYW1lLHNlbG5hbWUpICxcCisJCXRuYW1lIyNfY2hfdHQsXAorCQlzaXplb2YodG5hbWUjI19jaF90dCkgLyBzaXplb2YoQVNOMV9URU1QTEFURSksXAorCQkmdG5hbWUjI19hdXgsXAorCQlzaXplb2Yoc3RuYW1lKSxcCisJCSNzdG5hbWUgXAorCUFTTjFfSVRFTV9lbmQodG5hbWUpCisKKy8qIFRoaXMgaGVscHMgd2l0aCB0aGUgdGVtcGxhdGUgd3JhcHBlciBmb3JtIG9mIEFTTjFfSVRFTSAqLworCisjZGVmaW5lIEFTTjFfRVhfVEVNUExBVEVfVFlQRShmbGFncywgdGFnLCBuYW1lLCB0eXBlKSB7IFwKKwkoZmxhZ3MpLCAodGFnKSwgMCxcCisJI25hbWUsIEFTTjFfSVRFTV9yZWYodHlwZSkgfQorCisvKiBUaGVzZSBoZWxwIHdpdGggU0VRVUVOQ0Ugb3IgQ0hPSUNFIGNvbXBvbmVudHMgKi8KKworLyogdXNlZCB0byBkZWNsYXJlIG90aGVyIHR5cGVzICovCisKKyNkZWZpbmUgQVNOMV9FWF9UWVBFKGZsYWdzLCB0YWcsIHN0bmFtZSwgZmllbGQsIHR5cGUpIHsgXAorCShmbGFncyksICh0YWcpLCBvZmZzZXRvZihzdG5hbWUsIGZpZWxkKSxcCisJI2ZpZWxkLCBBU04xX0lURU1fcmVmKHR5cGUpIH0KKworLyogdXNlZCB3aGVuIHRoZSBzdHJ1Y3R1cmUgaXMgY29tYmluZWQgd2l0aCB0aGUgcGFyZW50ICovCisKKyNkZWZpbmUgQVNOMV9FWF9DT01CSU5FKGZsYWdzLCB0YWcsIHR5cGUpIHsgXAorCShmbGFncyl8QVNOMV9URkxHX0NPTUJJTkUsICh0YWcpLCAwLCBOVUxMLCBBU04xX0lURU1fcmVmKHR5cGUpIH0KKworLyogaW1wbGljaXQgYW5kIGV4cGxpY2l0IGhlbHBlciBtYWNyb3MgKi8KKworI2RlZmluZSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIGV4KSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfSU1QTElDSVQgfCBleCwgdGFnLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisjZGVmaW5lIEFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgZXgpIFwKKwkJQVNOMV9FWF9UWVBFKEFTTjFfVEZMR19FWFBMSUNJVCB8IGV4LCB0YWcsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIEFueSBkZWZpbmVkIGJ5IG1hY3JvczogdGhlIGZpZWxkIHVzZWQgaXMgaW4gdGhlIHRhYmxlIGl0c2VsZiAqLworCisjaWZuZGVmIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTgorI2RlZmluZSBBU04xX0FEQl9PQkpFQ1QodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX09JRCwgLTEsIDAsICN0YmxuYW1lLCAoY29uc3QgQVNOMV9JVEVNICopJih0YmxuYW1lIyNfYWRiKSB9CisjZGVmaW5lIEFTTjFfQURCX0lOVEVHRVIodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX0lOVCwgLTEsIDAsICN0YmxuYW1lLCAoY29uc3QgQVNOMV9JVEVNICopJih0YmxuYW1lIyNfYWRiKSB9CisjZWxzZQorI2RlZmluZSBBU04xX0FEQl9PQkpFQ1QodGJsbmFtZSkgeyBBU04xX1RGTEdfQURCX09JRCwgLTEsIDAsICN0YmxuYW1lLCB0YmxuYW1lIyNfYWRiIH0KKyNkZWZpbmUgQVNOMV9BREJfSU5URUdFUih0YmxuYW1lKSB7IEFTTjFfVEZMR19BREJfSU5ULCAtMSwgMCwgI3RibG5hbWUsIHRibG5hbWUjI19hZGIgfQorI2VuZGlmCisvKiBQbGFpbiBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX1NJTVBMRShzdG5hbWUsIGZpZWxkLCB0eXBlKSBBU04xX0VYX1RZUEUoMCwwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisvKiBPUFRJT05BTCBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlKSBBU04xX0VYX1RZUEUoQVNOMV9URkxHX09QVElPTkFMLCAwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisvKiBJTVBMSUNJVCB0YWdnZWQgc2ltcGxlIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9JTVAoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnKSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIDApCisKKy8qIElNUExJQ0lUIHRhZ2dlZCBPUFRJT05BTCBzaW1wbGUgdHlwZSAqLworI2RlZmluZSBBU04xX0lNUF9PUFQoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnKSBBU04xX0lNUF9FWChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcsIEFTTjFfVEZMR19PUFRJT05BTCkKKworLyogU2FtZSBhcyBhYm92ZSBidXQgRVhQTElDSVQgKi8KKworI2RlZmluZSBBU04xX0VYUChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIEFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgMCkKKyNkZWZpbmUgQVNOMV9FWFBfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfT1BUSU9OQUwpCisKKy8qIFNFUVVFTkNFIE9GIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VRVUVOQ0VfT0YsIDAsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIE9QVElPTkFMIFNFUVVFTkNFIE9GICovCisjZGVmaW5lIEFTTjFfU0VRVUVOQ0VfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUpIFwKKwkJQVNOMV9FWF9UWVBFKEFTTjFfVEZMR19TRVFVRU5DRV9PRnxBU04xX1RGTEdfT1BUSU9OQUwsIDAsIHN0bmFtZSwgZmllbGQsIHR5cGUpCisKKy8qIFNhbWUgYXMgYWJvdmUgYnV0IGZvciBTRVQgT0YgKi8KKworI2RlZmluZSBBU04xX1NFVF9PRihzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VUX09GLCAwLCBzdG5hbWUsIGZpZWxkLCB0eXBlKQorCisjZGVmaW5lIEFTTjFfU0VUX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlKSBcCisJCUFTTjFfRVhfVFlQRShBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCwgMCwgc3RuYW1lLCBmaWVsZCwgdHlwZSkKKworLyogRmluYWxseSBjb21wb3VuZCB0eXBlcyBvZiBTRVFVRU5DRSwgU0VULCBJTVBMSUNJVCwgRVhQTElDSVQgYW5kIE9QVElPTkFMICovCisKKyNkZWZpbmUgQVNOMV9JTVBfU0VUX09GKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9JTVBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GKQorCisjZGVmaW5lIEFTTjFfRVhQX1NFVF9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFVF9PRikKKworI2RlZmluZSBBU04xX0lNUF9TRVRfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9JTVBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0VYUF9TRVRfT0ZfT1BUKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfU0VUX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0lNUF9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfSU1QX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GKQorCisjZGVmaW5lIEFTTjFfSU1QX1NFUVVFTkNFX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfSU1QX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworI2RlZmluZSBBU04xX0VYUF9TRVFVRU5DRV9PRihzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GKQorCisjZGVmaW5lIEFTTjFfRVhQX1NFUVVFTkNFX09GX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX1NFUVVFTkNFX09GfEFTTjFfVEZMR19PUFRJT05BTCkKKworLyogRVhQTElDSVQgdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZm9ybSAqLworI2RlZmluZSBBU04xX05ERUZfRVhQKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZykgXAorCQkJQVNOMV9FWFBfRVgoc3RuYW1lLCBmaWVsZCwgdHlwZSwgdGFnLCBBU04xX1RGTEdfTkRFRikKKworLyogRVhQTElDSVQgT1BUSU9OQUwgdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgZm9ybSAqLworI2RlZmluZSBBU04xX05ERUZfRVhQX09QVChzdG5hbWUsIGZpZWxkLCB0eXBlLCB0YWcpIFwKKwkJCUFTTjFfRVhQX0VYKHN0bmFtZSwgZmllbGQsIHR5cGUsIHRhZywgQVNOMV9URkxHX09QVElPTkFMfEFTTjFfVEZMR19OREVGKQorCisvKiBNYWNyb3MgZm9yIHRoZSBBU04xX0FEQiBzdHJ1Y3R1cmUgKi8KKworI2RlZmluZSBBU04xX0FEQihuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfQURCX1RBQkxFIG5hbWUjI19hZGJ0YmxbXSAKKworI2lmbmRlZiBPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04KKworI2RlZmluZSBBU04xX0FEQl9FTkQobmFtZSwgZmxhZ3MsIGZpZWxkLCBhcHBfdGFibGUsIGRlZiwgbm9uZSkgXAorCTtcCisJc3RhdGljIGNvbnN0IEFTTjFfQURCIG5hbWUjI19hZGIgPSB7XAorCQlmbGFncyxcCisJCW9mZnNldG9mKG5hbWUsIGZpZWxkKSxcCisJCWFwcF90YWJsZSxcCisJCW5hbWUjI19hZGJ0YmwsXAorCQlzaXplb2YobmFtZSMjX2FkYnRibCkgLyBzaXplb2YoQVNOMV9BREJfVEFCTEUpLFwKKwkJZGVmLFwKKwkJbm9uZVwKKwl9CisKKyNlbHNlCisKKyNkZWZpbmUgQVNOMV9BREJfRU5EKG5hbWUsIGZsYWdzLCBmaWVsZCwgYXBwX3RhYmxlLCBkZWYsIG5vbmUpIFwKKwk7XAorCXN0YXRpYyBjb25zdCBBU04xX0lURU0gKm5hbWUjI19hZGIodm9pZCkgXAorCXsgXAorCXN0YXRpYyBjb25zdCBBU04xX0FEQiBpbnRlcm5hbF9hZGIgPSBcCisJCXtcCisJCWZsYWdzLFwKKwkJb2Zmc2V0b2YobmFtZSwgZmllbGQpLFwKKwkJYXBwX3RhYmxlLFwKKwkJbmFtZSMjX2FkYnRibCxcCisJCXNpemVvZihuYW1lIyNfYWRidGJsKSAvIHNpemVvZihBU04xX0FEQl9UQUJMRSksXAorCQlkZWYsXAorCQlub25lXAorCQl9OyBcCisJCXJldHVybiAoY29uc3QgQVNOMV9JVEVNICopICZpbnRlcm5hbF9hZGI7IFwKKwl9IFwKKwl2b2lkIGR1bW15X2Z1bmN0aW9uKHZvaWQpCisKKyNlbmRpZgorCisjZGVmaW5lIEFEQl9FTlRSWSh2YWwsIHRlbXBsYXRlKSB7dmFsLCB0ZW1wbGF0ZX0KKworI2RlZmluZSBBU04xX0FEQl9URU1QTEFURShuYW1lKSBcCisJc3RhdGljIGNvbnN0IEFTTjFfVEVNUExBVEUgbmFtZSMjX3R0IAorCisvKiBUaGlzIGlzIHRoZSBBU04xIHRlbXBsYXRlIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMKKyAqIGEgd3JhcHBlciByb3VuZCB0aGUgYWN0dWFsIHR5cGUuIEl0IGRldGVybWluZXMgdGhlCisgKiBhY3R1YWwgcG9zaXRpb24gb2YgdGhlIGZpZWxkIGluIHRoZSB2YWx1ZSBzdHJ1Y3R1cmUsCisgKiB2YXJpb3VzIGZsYWdzIHN1Y2ggYXMgT1BUSU9OQUwgYW5kIHRoZSBmaWVsZCBuYW1lLgorICovCisKK3N0cnVjdCBBU04xX1RFTVBMQVRFX3N0IHsKK3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBWYXJpb3VzIGZsYWdzICovCitsb25nIHRhZzsJCQkvKiB0YWcsIG5vdCB1c2VkIGlmIG5vIHRhZ2dpbmcgKi8KK3Vuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyogT2Zmc2V0IG9mIHRoaXMgZmllbGQgaW4gc3RydWN0dXJlICovCisjaWZuZGVmIE5PX0FTTjFfRklFTERfTkFNRVMKK2NvbnN0IGNoYXIgKmZpZWxkX25hbWU7CQkvKiBGaWVsZCBuYW1lICovCisjZW5kaWYKK0FTTjFfSVRFTV9FWFAgKml0ZW07CQkvKiBSZWxldmFudCBBU04xX0lURU0gb3IgQVNOMV9BREIgKi8KK307CisKKy8qIE1hY3JvIHRvIGV4dHJhY3QgQVNOMV9JVEVNIGFuZCBBU04xX0FEQiBwb2ludGVyIGZyb20gQVNOMV9URU1QTEFURSAqLworCisjZGVmaW5lIEFTTjFfVEVNUExBVEVfaXRlbSh0KSAodC0+aXRlbV9wdHIpCisjZGVmaW5lIEFTTjFfVEVNUExBVEVfYWRiKHQpICh0LT5pdGVtX3B0cikKKwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9BREJfVEFCTEVfc3QgQVNOMV9BREJfVEFCTEU7Cit0eXBlZGVmIHN0cnVjdCBBU04xX0FEQl9zdCBBU04xX0FEQjsKKworc3RydWN0IEFTTjFfQURCX3N0IHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBWYXJpb3VzIGZsYWdzICovCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBvZiBzZWxlY3RvciBmaWVsZCAqLworCVNUQUNLX09GKEFTTjFfQURCX1RBQkxFKSAqKmFwcF9pdGVtczsgLyogQXBwbGljYXRpb24gZGVmaW5lZCBpdGVtcyAqLworCWNvbnN0IEFTTjFfQURCX1RBQkxFICp0Ymw7CS8qIFRhYmxlIG9mIHBvc3NpYmxlIHR5cGVzICovCisJbG9uZyB0Ymxjb3VudDsJCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRibCAqLworCWNvbnN0IEFTTjFfVEVNUExBVEUgKmRlZmF1bHRfdHQ7ICAvKiBUeXBlIHRvIHVzZSBpZiBubyBtYXRjaCAqLworCWNvbnN0IEFTTjFfVEVNUExBVEUgKm51bGxfdHQ7ICAvKiBUeXBlIHRvIHVzZSBpZiBzZWxlY3RvciBpcyBOVUxMICovCit9OworCitzdHJ1Y3QgQVNOMV9BREJfVEFCTEVfc3QgeworCWxvbmcgdmFsdWU7CQkvKiBOSUQgZm9yIGFuIG9iamVjdCBvciB2YWx1ZSBmb3IgYW4gaW50ICovCisJY29uc3QgQVNOMV9URU1QTEFURSB0dDsJCS8qIGl0ZW0gZm9yIHRoaXMgdmFsdWUgKi8KK307CisKKy8qIHRlbXBsYXRlIGZsYWdzICovCisKKy8qIEZpZWxkIGlzIG9wdGlvbmFsICovCisjZGVmaW5lIEFTTjFfVEZMR19PUFRJT05BTAkoMHgxKQorCisvKiBGaWVsZCBpcyBhIFNFVCBPRiAqLworI2RlZmluZSBBU04xX1RGTEdfU0VUX09GCSgweDEgPDwgMSkKKworLyogRmllbGQgaXMgYSBTRVFVRU5DRSBPRiAqLworI2RlZmluZSBBU04xX1RGTEdfU0VRVUVOQ0VfT0YJKDB4MiA8PCAxKQorCisvKiBTcGVjaWFsIGNhc2U6IHRoaXMgcmVmZXJzIHRvIGEgU0VUIE9GIHRoYXQKKyAqIHdpbGwgYmUgc29ydGVkIGludG8gREVSIG9yZGVyIHdoZW4gZW5jb2RlZCAqYW5kKgorICogdGhlIGNvcnJlc3BvbmRpbmcgU1RBQ0sgd2lsbCBiZSBtb2RpZmllZCB0byBtYXRjaAorICogdGhlIG5ldyBvcmRlci4KKyAqLworI2RlZmluZSBBU04xX1RGTEdfU0VUX09SREVSCSgweDMgPDwgMSkKKworLyogTWFzayBmb3IgU0VUIE9GIG9yIFNFUVVFTkNFIE9GICovCisjZGVmaW5lIEFTTjFfVEZMR19TS19NQVNLCSgweDMgPDwgMSkKKworLyogVGhlc2UgZmxhZ3MgbWVhbiB0aGUgdGFnIHNob3VsZCBiZSB0YWtlbiBmcm9tIHRoZQorICogdGFnIGZpZWxkLiBJZiBFWFBMSUNJVCB0aGVuIHRoZSB1bmRlcmx5aW5nIHR5cGUKKyAqIGlzIHVzZWQgZm9yIHRoZSBpbm5lciB0YWcuCisgKi8KKworLyogSU1QTElDSVQgdGFnZ2luZyAqLworI2RlZmluZSBBU04xX1RGTEdfSU1QVEFHCSgweDEgPDwgMykKKworCisvKiBFWFBMSUNJVCB0YWdnaW5nLCBpbm5lciB0YWcgZnJvbSB1bmRlcmx5aW5nIHR5cGUgKi8KKyNkZWZpbmUgQVNOMV9URkxHX0VYUFRBRwkoMHgyIDw8IDMpCisKKyNkZWZpbmUgQVNOMV9URkxHX1RBR19NQVNLCSgweDMgPDwgMykKKworLyogY29udGV4dCBzcGVjaWZpYyBJTVBMSUNJVCAqLworI2RlZmluZSBBU04xX1RGTEdfSU1QTElDSVQJQVNOMV9URkxHX0lNUFRBR3xBU04xX1RGTEdfQ09OVEVYVAorCisvKiBjb250ZXh0IHNwZWNpZmljIEVYUExJQ0lUICovCisjZGVmaW5lIEFTTjFfVEZMR19FWFBMSUNJVAlBU04xX1RGTEdfRVhQVEFHfEFTTjFfVEZMR19DT05URVhUCisKKy8qIElmIHRhZ2dpbmcgaXMgaW4gZm9yY2UgdGhlc2UgZGV0ZXJtaW5lIHRoZQorICogdHlwZSBvZiB0YWcgdG8gdXNlLiBPdGhlcndpc2UgdGhlIHRhZyBpcworICogZGV0ZXJtaW5lZCBieSB0aGUgdW5kZXJseWluZyB0eXBlLiBUaGVzZSAKKyAqIHZhbHVlcyByZWZsZWN0IHRoZSBhY3R1YWwgb2N0ZXQgZm9ybWF0LgorICovCisKKy8qIFVuaXZlcnNhbCB0YWcgKi8gCisjZGVmaW5lIEFTTjFfVEZMR19VTklWRVJTQUwJKDB4MDw8NikKKy8qIEFwcGxpY2F0aW9uIHRhZyAqLyAKKyNkZWZpbmUgQVNOMV9URkxHX0FQUExJQ0FUSU9OCSgweDE8PDYpCisvKiBDb250ZXh0IHNwZWNpZmljIHRhZyAqLyAKKyNkZWZpbmUgQVNOMV9URkxHX0NPTlRFWFQJKDB4Mjw8NikKKy8qIFByaXZhdGUgdGFnICovIAorI2RlZmluZSBBU04xX1RGTEdfUFJJVkFURQkoMHgzPDw2KQorCisjZGVmaW5lIEFTTjFfVEZMR19UQUdfQ0xBU1MJKDB4Mzw8NikKKworLyogVGhlc2UgYXJlIGZvciBBTlkgREVGSU5FRCBCWSB0eXBlLiBJbiB0aGlzIGNhc2UKKyAqIHRoZSAnaXRlbScgZmllbGQgcG9pbnRzIHRvIGFuIEFTTjFfQURCIHN0cnVjdHVyZQorICogd2hpY2ggY29udGFpbnMgYSB0YWJsZSBvZiB2YWx1ZXMgdG8gZGVjb2RlIHRoZQorICogcmVsZXZhbnQgdHlwZQorICovCisKKyNkZWZpbmUgQVNOMV9URkxHX0FEQl9NQVNLCSgweDM8PDgpCisKKyNkZWZpbmUgQVNOMV9URkxHX0FEQl9PSUQJKDB4MTw8OCkKKworI2RlZmluZSBBU04xX1RGTEdfQURCX0lOVAkoMHgxPDw5KQorCisvKiBUaGlzIGZsYWcgbWVhbnMgYSBwYXJlbnQgc3RydWN0dXJlIGlzIHBhc3NlZAorICogaW5zdGVhZCBvZiB0aGUgZmllbGQ6IHRoaXMgaXMgdXNlZnVsIGlzIGEKKyAqIFNFUVVFTkNFIGlzIGJlaW5nIGNvbWJpbmVkIHdpdGggYSBDSE9JQ0UgZm9yCisgKiBleGFtcGxlLiBTaW5jZSB0aGlzIG1lYW5zIHRoZSBzdHJ1Y3R1cmUgYW5kCisgKiBpdGVtIG5hbWUgd2lsbCBkaWZmZXIgd2UgbmVlZCB0byB1c2UgdGhlCisgKiBBU04xX0NIT0lDRV9FTkRfbmFtZSgpIG1hY3JvIGZvciBleGFtcGxlLgorICovCisKKyNkZWZpbmUgQVNOMV9URkxHX0NPTUJJTkUJKDB4MTw8MTApCisKKy8qIFRoaXMgZmxhZyB3aGVuIHByZXNlbnQgaW4gYSBTRVFVRU5DRSBPRiwgU0VUIE9GCisgKiBvciBFWFBMSUNJVCBjYXVzZXMgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQKKyAqIGVuY29kaW5nIHRvIGJlIHVzZWQgaWYgcmVxdWlyZWQuCisgKi8KKworI2RlZmluZSBBU04xX1RGTEdfTkRFRgkJKDB4MTw8MTEpCisKKy8qIFRoaXMgaXMgdGhlIGFjdHVhbCBBU04xIGl0ZW0gaXRzZWxmICovCisKK3N0cnVjdCBBU04xX0lURU1fc3QgeworY2hhciBpdHlwZTsJCQkvKiBUaGUgaXRlbSB0eXBlLCBwcmltaXRpdmUsIFNFUVVFTkNFLCBDSE9JQ0Ugb3IgZXh0ZXJuICovCitsb25nIHV0eXBlOwkJCS8qIHVuZGVybHlpbmcgdHlwZSAqLworY29uc3QgQVNOMV9URU1QTEFURSAqdGVtcGxhdGVzOwkvKiBJZiBTRVFVRU5DRSBvciBDSE9JQ0UgdGhpcyBjb250YWlucyB0aGUgY29udGVudHMgKi8KK2xvbmcgdGNvdW50OwkJCS8qIE51bWJlciBvZiB0ZW1wbGF0ZXMgaWYgU0VRVUVOQ0Ugb3IgQ0hPSUNFICovCitjb25zdCB2b2lkICpmdW5jczsJCS8qIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZSB0aGlzIHR5cGUgKi8KK2xvbmcgc2l6ZTsJCQkvKiBTdHJ1Y3R1cmUgc2l6ZSAodXN1YWxseSkqLworI2lmbmRlZiBOT19BU04xX0ZJRUxEX05BTUVTCitjb25zdCBjaGFyICpzbmFtZTsJCS8qIFN0cnVjdHVyZSBuYW1lICovCisjZW5kaWYKK307CisKKy8qIFRoZXNlIGFyZSB2YWx1ZXMgZm9yIHRoZSBpdHlwZSBmaWVsZCBhbmQKKyAqIGRldGVybWluZSBob3cgdGhlIHR5cGUgaXMgaW50ZXJwcmV0ZWQuCisgKgorICogRm9yIFBSSU1JVElWRSB0eXBlcyB0aGUgdW5kZXJseWluZyB0eXBlCisgKiBkZXRlcm1pbmVzIHRoZSBiZWhhdmlvdXIgaWYgaXRlbXMgaXMgTlVMTC4KKyAqCisgKiBPdGhlcndpc2UgdGVtcGxhdGVzIG11c3QgY29udGFpbiBhIHNpbmdsZSAKKyAqIHRlbXBsYXRlIGFuZCB0aGUgdHlwZSBpcyB0cmVhdGVkIGluIHRoZQorICogc2FtZSB3YXkgYXMgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSB0ZW1wbGF0ZS4KKyAqCisgKiBGb3IgU0VRVUVOQ0UgdHlwZXMgdGhlIHRlbXBsYXRlcyBmaWVsZCBwb2ludHMKKyAqIHRvIHRoZSBtZW1iZXJzLCB0aGUgc2l6ZSBmaWVsZCBpcyB0aGUKKyAqIHN0cnVjdHVyZSBzaXplLgorICoKKyAqIEZvciBDSE9JQ0UgdHlwZXMgdGhlIHRlbXBsYXRlcyBmaWVsZCBwb2ludHMKKyAqIHRvIGVhY2ggcG9zc2libGUgbWVtYmVyICh0eXBpY2FsbHkgYSB1bmlvbikKKyAqIGFuZCB0aGUgJ3NpemUnIGZpZWxkIGlzIHRoZSBvZmZzZXQgb2YgdGhlCisgKiBzZWxlY3Rvci4KKyAqCisgKiBUaGUgJ2Z1bmNzJyBmaWVsZCBpcyB1c2VkIGZvciBhcHBsaWNhdGlvbgorICogc3BlY2lmaWMgZnVuY3Rpb25zLiAKKyAqCisgKiBGb3IgQ09NUEFUIHR5cGVzIHRoZSBmdW5jcyBmaWVsZCBnaXZlcyBhCisgKiBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHRoaXMgdHlwZSwgdGhpcworICogc3VwcG9ydHMgdGhlIG9sZCBkMmksIGkyZCBjb252ZW50aW9uLgorICoKKyAqIFRoZSBFWFRFUk4gdHlwZSB1c2VzIGEgbmV3IHN0eWxlIGQyaS9pMmQuCisgKiBUaGUgbmV3IHN0eWxlIHNob3VsZCBiZSB1c2VkIHdoZXJlIHBvc3NpYmxlCisgKiBiZWNhdXNlIGl0IGF2b2lkcyB0aGluZ3MgbGlrZSB0aGUgZDJpIElNUExJQ0lUCisgKiBoYWNrLgorICoKKyAqIE1TVFJJTkcgaXMgYSBtdWx0aXBsZSBzdHJpbmcgdHlwZSwgaXQgaXMgdXNlZAorICogZm9yIGEgQ0hPSUNFIG9mIGNoYXJhY3RlciBzdHJpbmdzIHdoZXJlIHRoZQorICogYWN0dWFsIHN0cmluZ3MgYWxsIG9jY3VweSBhbiBBU04xX1NUUklORworICogc3RydWN0dXJlLiBJbiB0aGlzIGNhc2UgdGhlICd1dHlwZScgZmllbGQKKyAqIGhhcyBhIHNwZWNpYWwgbWVhbmluZywgaXQgaXMgdXNlZCBhcyBhIG1hc2sKKyAqIG9mIGFjY2VwdGFibGUgdHlwZXMgdXNpbmcgdGhlIEJfQVNOMSBjb25zdGFudHMuCisgKgorICogTkRFRl9TRVFVRU5DRSBpcyB0aGUgc2FtZSBhcyBTRVFVRU5DRSBleGNlcHQKKyAqIHRoYXQgaXQgd2lsbCB1c2UgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQKKyAqIGVuY29kaW5nIGlmIHJlcXVlc3RlZC4KKyAqCisgKi8KKworI2RlZmluZSBBU04xX0lUWVBFX1BSSU1JVElWRQkJMHgwCisKKyNkZWZpbmUgQVNOMV9JVFlQRV9TRVFVRU5DRQkJMHgxCisKKyNkZWZpbmUgQVNOMV9JVFlQRV9DSE9JQ0UJCTB4MgorCisjZGVmaW5lIEFTTjFfSVRZUEVfQ09NUEFUCQkweDMKKworI2RlZmluZSBBU04xX0lUWVBFX0VYVEVSTgkJMHg0CisKKyNkZWZpbmUgQVNOMV9JVFlQRV9NU1RSSU5HCQkweDUKKworI2RlZmluZSBBU04xX0lUWVBFX05ERUZfU0VRVUVOQ0UJMHg2CisKKy8qIENhY2hlIGZvciBBU04xIHRhZyBhbmQgbGVuZ3RoLCBzbyB3ZQorICogZG9uJ3Qga2VlcCByZS1yZWFkaW5nIGl0IGZvciB0aGluZ3MKKyAqIGxpa2UgQ0hPSUNFCisgKi8KKworc3RydWN0IEFTTjFfVExDX3N0eworCWNoYXIgdmFsaWQ7CS8qIFZhbHVlcyBiZWxvdyBhcmUgdmFsaWQgKi8KKwlpbnQgcmV0OwkvKiByZXR1cm4gdmFsdWUgKi8KKwlsb25nIHBsZW47CS8qIGxlbmd0aCAqLworCWludCBwdGFnOwkvKiBjbGFzcyB2YWx1ZSAqLworCWludCBwY2xhc3M7CS8qIGNsYXNzIHZhbHVlICovCisJaW50IGhkcmxlbjsJLyogaGVhZGVyIGxlbmd0aCAqLworfTsKKworLyogVHlwZWRlZnMgZm9yIEFTTjEgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKwordHlwZWRlZiBBU04xX1ZBTFVFICogQVNOMV9uZXdfZnVuYyh2b2lkKTsKK3R5cGVkZWYgdm9pZCBBU04xX2ZyZWVfZnVuYyhBU04xX1ZBTFVFICphKTsKK3R5cGVkZWYgQVNOMV9WQUxVRSAqIEFTTjFfZDJpX2Z1bmMoQVNOMV9WQUxVRSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiogaW4sIGxvbmcgbGVuZ3RoKTsKK3R5cGVkZWYgaW50IEFTTjFfaTJkX2Z1bmMoQVNOMV9WQUxVRSAqIGEsIHVuc2lnbmVkIGNoYXIgKippbik7CisKK3R5cGVkZWYgaW50IEFTTjFfZXhfZDJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCQlpbnQgdGFnLCBpbnQgYWNsYXNzLCBjaGFyIG9wdCwgQVNOMV9UTEMgKmN0eCk7CisKK3R5cGVkZWYgaW50IEFTTjFfZXhfaTJkKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX0lURU0gKml0LCBpbnQgdGFnLCBpbnQgYWNsYXNzKTsKK3R5cGVkZWYgaW50IEFTTjFfZXhfbmV3X2Z1bmMoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordHlwZWRlZiB2b2lkIEFTTjFfZXhfZnJlZV9mdW5jKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKKwordHlwZWRlZiBpbnQgQVNOMV9leF9wcmludF9mdW5jKEJJTyAqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwgCisJCQkJCQlpbnQgaW5kZW50LCBjb25zdCBjaGFyICpmbmFtZSwgCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpOworCit0eXBlZGVmIGludCBBU04xX3ByaW1pdGl2ZV9pMmMoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCAqcHV0eXBlLCBjb25zdCBBU04xX0lURU0gKml0KTsKK3R5cGVkZWYgaW50IEFTTjFfcHJpbWl0aXZlX2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordHlwZWRlZiBpbnQgQVNOMV9wcmltaXRpdmVfcHJpbnQoQklPICpvdXQsIEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0LCBpbnQgaW5kZW50LCBjb25zdCBBU04xX1BDVFggKnBjdHgpOworCit0eXBlZGVmIHN0cnVjdCBBU04xX0NPTVBBVF9GVU5DU19zdCB7CisJQVNOMV9uZXdfZnVuYyAqYXNuMV9uZXc7CisJQVNOMV9mcmVlX2Z1bmMgKmFzbjFfZnJlZTsKKwlBU04xX2QyaV9mdW5jICphc24xX2QyaTsKKwlBU04xX2kyZF9mdW5jICphc24xX2kyZDsKK30gQVNOMV9DT01QQVRfRlVOQ1M7CisKK3R5cGVkZWYgc3RydWN0IEFTTjFfRVhURVJOX0ZVTkNTX3N0IHsKKwl2b2lkICphcHBfZGF0YTsKKwlBU04xX2V4X25ld19mdW5jICphc24xX2V4X25ldzsKKwlBU04xX2V4X2ZyZWVfZnVuYyAqYXNuMV9leF9mcmVlOworCUFTTjFfZXhfZnJlZV9mdW5jICphc24xX2V4X2NsZWFyOworCUFTTjFfZXhfZDJpICphc24xX2V4X2QyaTsKKwlBU04xX2V4X2kyZCAqYXNuMV9leF9pMmQ7CisJQVNOMV9leF9wcmludF9mdW5jICphc24xX2V4X3ByaW50OworfSBBU04xX0VYVEVSTl9GVU5DUzsKKwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9QUklNSVRJVkVfRlVOQ1Nfc3QgeworCXZvaWQgKmFwcF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJQVNOMV9leF9uZXdfZnVuYyAqcHJpbV9uZXc7CisJQVNOMV9leF9mcmVlX2Z1bmMgKnByaW1fZnJlZTsKKwlBU04xX2V4X2ZyZWVfZnVuYyAqcHJpbV9jbGVhcjsKKwlBU04xX3ByaW1pdGl2ZV9jMmkgKnByaW1fYzJpOworCUFTTjFfcHJpbWl0aXZlX2kyYyAqcHJpbV9pMmM7CisJQVNOMV9wcmltaXRpdmVfcHJpbnQgKnByaW1fcHJpbnQ7Cit9IEFTTjFfUFJJTUlUSVZFX0ZVTkNTOworCisvKiBUaGlzIGlzIHRoZSBBU04xX0FVWCBzdHJ1Y3R1cmU6IGl0IGhhbmRsZXMgdmFyaW91cworICogbWlzY2VsbGFuZW91cyByZXF1aXJlbWVudHMuIEZvciBleGFtcGxlIHRoZSB1c2Ugb2YKKyAqIHJlZmVyZW5jZSBjb3VudHMgYW5kIGFuIGluZm9ybWF0aW9uYWwgY2FsbGJhY2suCisgKgorICogVGhlICJpbmZvcm1hdGlvbmFsIGNhbGxiYWNrIiBpcyBjYWxsZWQgYXQgdmFyaW91cworICogcG9pbnRzIGR1cmluZyB0aGUgQVNOMSBlbmNvZGluZyBhbmQgZGVjb2RpbmcuIEl0IGNhbgorICogYmUgdXNlZCB0byBwcm92aWRlIG1pbm9yIGN1c3RvbWlzYXRpb24gb2YgdGhlIHN0cnVjdHVyZXMKKyAqIHVzZWQuIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlcmUgdGhlIHN1cHBsaWVkIHJvdXRpbmVzCisgKiAqYWxtb3N0KiBkbyB0aGUgcmlnaHQgdGhpbmcgYnV0IG5lZWQgc29tZSBleHRyYSBoZWxwCisgKiBhdCBhIGZldyBwb2ludHMuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zIHplcm8gdGhlbgorICogaXQgaXMgYXNzdW1lZCBhIGZhdGFsIGVycm9yIGhhcyBvY2N1cnJlZCBhbmQgdGhlIAorICogbWFpbiBvcGVyYXRpb24gc2hvdWxkIGJlIGFiYW5kb25lZC4KKyAqCisgKiBJZiBtYWpvciBjaGFuZ2VzIGluIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBhcmUgcmVxdWlyZWQKKyAqIHRoZW4gYW4gZXh0ZXJuYWwgdHlwZSBpcyBtb3JlIGFwcHJvcHJpYXRlLgorICovCisKK3R5cGVkZWYgaW50IEFTTjFfYXV4X2NiKGludCBvcGVyYXRpb24sIEFTTjFfVkFMVUUgKippbiwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQl2b2lkICpleGFyZyk7CisKK3R5cGVkZWYgc3RydWN0IEFTTjFfQVVYX3N0IHsKKwl2b2lkICphcHBfZGF0YTsKKwlpbnQgZmxhZ3M7CisJaW50IHJlZl9vZmZzZXQ7CQkvKiBPZmZzZXQgb2YgcmVmZXJlbmNlIHZhbHVlICovCisJaW50IHJlZl9sb2NrOwkJLyogTG9jayB0eXBlIHRvIHVzZSAqLworCUFTTjFfYXV4X2NiICphc24xX2NiOworCWludCBlbmNfb2Zmc2V0OwkJLyogT2Zmc2V0IG9mIEFTTjFfRU5DT0RJTkcgc3RydWN0dXJlICovCit9IEFTTjFfQVVYOworCisvKiBGb3IgcHJpbnQgcmVsYXRlZCBjYWxsYmFja3MgZXhhcmcgcG9pbnRzIHRvIHRoaXMgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBBU04xX1BSSU5UX0FSR19zdCB7CisJQklPICpvdXQ7CisJaW50IGluZGVudDsKKwljb25zdCBBU04xX1BDVFggKnBjdHg7Cit9IEFTTjFfUFJJTlRfQVJHOworCisvKiBGb3Igc3RyZWFtaW5nIHJlbGF0ZWQgY2FsbGJhY2tzIGV4YXJnIHBvaW50cyB0byB0aGlzIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgQVNOMV9TVFJFQU1fQVJHX3N0IHsKKwkvKiBCSU8gdG8gc3RyZWFtIHRocm91Z2ggKi8KKwlCSU8gKm91dDsKKwkvKiBCSU8gd2l0aCBmaWx0ZXJzIGFwcGVuZGVkICovCisJQklPICpuZGVmX2JpbzsKKwkvKiBTdHJlYW1pbmcgSS9PIGJvdW5kYXJ5ICovCisJdW5zaWduZWQgY2hhciAqKmJvdW5kYXJ5OworfSBBU04xX1NUUkVBTV9BUkc7CisKKy8qIEZsYWdzIGluIEFTTjFfQVVYICovCisKKy8qIFVzZSBhIHJlZmVyZW5jZSBjb3VudCAqLworI2RlZmluZSBBU04xX0FGTEdfUkVGQ09VTlQJMQorLyogU2F2ZSB0aGUgZW5jb2Rpbmcgb2Ygc3RydWN0dXJlICh1c2VmdWwgZm9yIHNpZ25hdHVyZXMpICovCisjZGVmaW5lIEFTTjFfQUZMR19FTkNPRElORwkyCisvKiBUaGUgU2VxdWVuY2UgbGVuZ3RoIGlzIGludmFsaWQgKi8KKyNkZWZpbmUgQVNOMV9BRkxHX0JST0tFTgk0CisKKy8qIG9wZXJhdGlvbiB2YWx1ZXMgZm9yIGFzbjFfY2IgKi8KKworI2RlZmluZSBBU04xX09QX05FV19QUkUJCTAKKyNkZWZpbmUgQVNOMV9PUF9ORVdfUE9TVAkxCisjZGVmaW5lIEFTTjFfT1BfRlJFRV9QUkUJMgorI2RlZmluZSBBU04xX09QX0ZSRUVfUE9TVAkzCisjZGVmaW5lIEFTTjFfT1BfRDJJX1BSRQkJNAorI2RlZmluZSBBU04xX09QX0QySV9QT1NUCTUKKyNkZWZpbmUgQVNOMV9PUF9JMkRfUFJFCQk2CisjZGVmaW5lIEFTTjFfT1BfSTJEX1BPU1QJNworI2RlZmluZSBBU04xX09QX1BSSU5UX1BSRQk4CisjZGVmaW5lIEFTTjFfT1BfUFJJTlRfUE9TVAk5CisjZGVmaW5lIEFTTjFfT1BfU1RSRUFNX1BSRQkxMAorI2RlZmluZSBBU04xX09QX1NUUkVBTV9QT1NUCTExCisjZGVmaW5lIEFTTjFfT1BfREVUQUNIRURfUFJFCTEyCisjZGVmaW5lIEFTTjFfT1BfREVUQUNIRURfUE9TVAkxMworCisvKiBNYWNybyB0byBpbXBsZW1lbnQgYSBwcmltaXRpdmUgdHlwZSAqLworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9UWVBFKHN0bmFtZSkgSU1QTEVNRU5UX0FTTjFfVFlQRV9leChzdG5hbWUsIHN0bmFtZSwgMCkKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfVFlQRV9leChpdG5hbWUsIHZuYW1lLCBleCkgXAorCQkJCUFTTjFfSVRFTV9zdGFydChpdG5hbWUpIFwKKwkJCQkJQVNOMV9JVFlQRV9QUklNSVRJVkUsIFZfIyN2bmFtZSwgTlVMTCwgMCwgTlVMTCwgZXgsICNpdG5hbWUgXAorCQkJCUFTTjFfSVRFTV9lbmQoaXRuYW1lKQorCisvKiBNYWNybyB0byBpbXBsZW1lbnQgYSBtdWx0aSBzdHJpbmcgdHlwZSAqLworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9NU1RSSU5HKGl0bmFtZSwgbWFzaykgXAorCQkJCUFTTjFfSVRFTV9zdGFydChpdG5hbWUpIFwKKwkJCQkJQVNOMV9JVFlQRV9NU1RSSU5HLCBtYXNrLCBOVUxMLCAwLCBOVUxMLCBzaXplb2YoQVNOMV9TVFJJTkcpLCAjaXRuYW1lIFwKKwkJCQlBU04xX0lURU1fZW5kKGl0bmFtZSkKKworLyogTWFjcm8gdG8gaW1wbGVtZW50IGFuIEFTTjFfSVRFTSBpbiB0ZXJtcyBvZiBvbGQgc3R5bGUgZnVuY3MgKi8KKworI2RlZmluZSBJTVBMRU1FTlRfQ09NUEFUX0FTTjEoc25hbWUpIElNUExFTUVOVF9DT01QQVRfQVNOMV90eXBlKHNuYW1lLCBWX0FTTjFfU0VRVUVOQ0UpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0NPTVBBVF9BU04xX3R5cGUoc25hbWUsIHRhZykgXAorCXN0YXRpYyBjb25zdCBBU04xX0NPTVBBVF9GVU5DUyBzbmFtZSMjX2ZmID0geyBcCisJCShBU04xX25ld19mdW5jICopc25hbWUjI19uZXcsIFwKKwkJKEFTTjFfZnJlZV9mdW5jICopc25hbWUjI19mcmVlLCBcCisJCShBU04xX2QyaV9mdW5jICopZDJpXyMjc25hbWUsIFwKKwkJKEFTTjFfaTJkX2Z1bmMgKilpMmRfIyNzbmFtZSwgXAorCX07IFwKKwlBU04xX0lURU1fc3RhcnQoc25hbWUpIFwKKwkJQVNOMV9JVFlQRV9DT01QQVQsIFwKKwkJdGFnLCBcCisJCU5VTEwsIFwKKwkJMCwgXAorCQkmc25hbWUjI19mZiwgXAorCQkwLCBcCisJCSNzbmFtZSBcCisJQVNOMV9JVEVNX2VuZChzbmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfRVhURVJOX0FTTjEoc25hbWUsIHRhZywgZnB0cnMpIFwKKwlBU04xX0lURU1fc3RhcnQoc25hbWUpIFwKKwkJQVNOMV9JVFlQRV9FWFRFUk4sIFwKKwkJdGFnLCBcCisJCU5VTEwsIFwKKwkJMCwgXAorCQkmZnB0cnMsIFwKKwkJMCwgXAorCQkjc25hbWUgXAorCUFTTjFfSVRFTV9lbmQoc25hbWUpCisKKy8qIE1hY3JvIHRvIGltcGxlbWVudCBzdGFuZGFyZCBmdW5jdGlvbnMgaW4gdGVybXMgb2YgQVNOMV9JVEVNIHN0cnVjdHVyZXMgKi8KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlMoc3RuYW1lKSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfbmFtZShzdG5hbWUsIGl0bmFtZSkgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBpdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX0VOQ09ERV9uYW1lKHN0bmFtZSwgaXRuYW1lKSBcCisJCQlJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfRU5DT0RFX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBpdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX1NUQVRJQ19BU04xX0FMTE9DX0ZVTkNUSU9OUyhzdG5hbWUpIFwKKwkJSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX3BmbmFtZShzdGF0aWMsIHN0bmFtZSwgc3RuYW1lLCBzdG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TKHN0bmFtZSkgXAorCQlJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBzdG5hbWUsIHN0bmFtZSkKKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfcGZuYW1lKHByZSwgc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJcHJlIHN0bmFtZSAqZm5hbWUjI19uZXcodm9pZCkgXAorCXsgXAorCQlyZXR1cm4gKHN0bmFtZSAqKUFTTjFfaXRlbV9uZXcoQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9IFwKKwlwcmUgdm9pZCBmbmFtZSMjX2ZyZWUoc3RuYW1lICphKSBcCisJeyBcCisJCUFTTjFfaXRlbV9mcmVlKChBU04xX1ZBTFVFICopYSwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9CisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCXN0bmFtZSAqZm5hbWUjI19uZXcodm9pZCkgXAorCXsgXAorCQlyZXR1cm4gKHN0bmFtZSAqKUFTTjFfaXRlbV9uZXcoQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7IFwKKwl9IFwKKwl2b2lkIGZuYW1lIyNfZnJlZShzdG5hbWUgKmEpIFwKKwl7IFwKKwkJQVNOMV9pdGVtX2ZyZWUoKEFTTjFfVkFMVUUgKilhLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTsgXAorCX0KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJSU1QTEVNRU5UX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19mbmFtZShzdG5hbWUsIGl0bmFtZSwgZm5hbWUpIFwKKwlJTVBMRU1FTlRfQVNOMV9BTExPQ19GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKQorCisjZGVmaW5lIElNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJc3RuYW1lICpkMmlfIyNmbmFtZShzdG5hbWUgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKSBcCisJeyBcCisJCXJldHVybiAoc3RuYW1lICopQVNOMV9pdGVtX2QyaSgoQVNOMV9WQUxVRSAqKilhLCBpbiwgbGVuLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTtcCisJfSBcCisJaW50IGkyZF8jI2ZuYW1lKHN0bmFtZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCkgXAorCXsgXAorCQlyZXR1cm4gQVNOMV9pdGVtX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7XAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfTkRFRl9GVU5DVElPTihzdG5hbWUpIFwKKwlpbnQgaTJkXyMjc3RuYW1lIyNfTkRFRihzdG5hbWUgKmEsIHVuc2lnbmVkIGNoYXIgKipvdXQpIFwKKwl7IFwKKwkJcmV0dXJuIEFTTjFfaXRlbV9uZGVmX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoc3RuYW1lKSk7XAorCX0gCisKKy8qIFRoaXMgaW5jbHVkZXMgZXZpbCBjYXN0cyB0byByZW1vdmUgY29uc3Q6IHRoZXkgd2lsbCBnbyBhd2F5IHdoZW4gZnVsbAorICogQVNOMSBjb25zdGlmaWNhdGlvbiBpcyBkb25lLgorICovCisjZGVmaW5lIElNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJc3RuYW1lICpkMmlfIyNmbmFtZShzdG5hbWUgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuKSBcCisJeyBcCisJCXJldHVybiAoc3RuYW1lICopQVNOMV9pdGVtX2QyaSgoQVNOMV9WQUxVRSAqKilhLCBpbiwgbGVuLCBBU04xX0lURU1fcnB0cihpdG5hbWUpKTtcCisJfSBcCisJaW50IGkyZF8jI2ZuYW1lKGNvbnN0IHN0bmFtZSAqYSwgdW5zaWduZWQgY2hhciAqKm91dCkgXAorCXsgXAorCQlyZXR1cm4gQVNOMV9pdGVtX2kyZCgoQVNOMV9WQUxVRSAqKWEsIG91dCwgQVNOMV9JVEVNX3JwdHIoaXRuYW1lKSk7XAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRFVQX0ZVTkNUSU9OKHN0bmFtZSkgXAorCXN0bmFtZSAqIHN0bmFtZSMjX2R1cChzdG5hbWUgKngpIFwKKyAgICAgICAgeyBcCisgICAgICAgIHJldHVybiBBU04xX2l0ZW1fZHVwKEFTTjFfSVRFTV9ycHRyKHN0bmFtZSksIHgpOyBcCisgICAgICAgIH0KKworI2RlZmluZSBJTVBMRU1FTlRfQVNOMV9QUklOVF9GVU5DVElPTihzdG5hbWUpIFwKKwlJTVBMRU1FTlRfQVNOMV9QUklOVF9GVU5DVElPTl9mbmFtZShzdG5hbWUsIHN0bmFtZSwgc3RuYW1lKQorCisjZGVmaW5lIElNUExFTUVOVF9BU04xX1BSSU5UX0ZVTkNUSU9OX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCWludCBmbmFtZSMjX3ByaW50X2N0eChCSU8gKm91dCwgc3RuYW1lICp4LCBpbnQgaW5kZW50LCBcCisJCQkJCQljb25zdCBBU04xX1BDVFggKnBjdHgpIFwKKwl7IFwKKwkJcmV0dXJuIEFTTjFfaXRlbV9wcmludChvdXQsIChBU04xX1ZBTFVFICopeCwgaW5kZW50LCBcCisJCQlBU04xX0lURU1fcnB0cihpdG5hbWUpLCBwY3R4KTsgXAorCX0gCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0KG5hbWUpIFwKKwkJSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKG5hbWUsIG5hbWUsIG5hbWUpCisKKyNkZWZpbmUgSU1QTEVNRU5UX0FTTjFfRlVOQ1RJT05TX2NvbnN0X2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkgXAorCUlNUExFTUVOVF9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3RfZm5hbWUoc3RuYW1lLCBpdG5hbWUsIGZuYW1lKSBcCisJSU1QTEVNRU5UX0FTTjFfQUxMT0NfRlVOQ1RJT05TX2ZuYW1lKHN0bmFtZSwgaXRuYW1lLCBmbmFtZSkKKworLyogZXh0ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIHByaW1pdGl2ZSB0eXBlcyAqLworCitERUNMQVJFX0FTTjFfSVRFTShBU04xX0JPT0xFQU4pCitERUNMQVJFX0FTTjFfSVRFTShBU04xX1RCT09MRUFOKQorREVDTEFSRV9BU04xX0lURU0oQVNOMV9GQk9PTEVBTikKK0RFQ0xBUkVfQVNOMV9JVEVNKEFTTjFfU0VRVUVOQ0UpCitERUNMQVJFX0FTTjFfSVRFTShDQklHTlVNKQorREVDTEFSRV9BU04xX0lURU0oQklHTlVNKQorREVDTEFSRV9BU04xX0lURU0oTE9ORykKK0RFQ0xBUkVfQVNOMV9JVEVNKFpMT05HKQorCitERUNMQVJFX1NUQUNLX09GKEFTTjFfVkFMVUUpCisKKy8qIEZ1bmN0aW9ucyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEFTTjEgY29kZSAqLworCitpbnQgQVNOMV9pdGVtX2V4X25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7Cit2b2lkIEFTTjFfaXRlbV9leF9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBBU04xX3RlbXBsYXRlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9URU1QTEFURSAqdHQpOworaW50IEFTTjFfcHJpbWl0aXZlX25ldyhBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK3ZvaWQgQVNOMV90ZW1wbGF0ZV9mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7CitpbnQgQVNOMV90ZW1wbGF0ZV9kMmkoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4sIGNvbnN0IEFTTjFfVEVNUExBVEUgKnR0KTsKK2ludCBBU04xX2l0ZW1fZXhfZDJpKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuLCBjb25zdCBBU04xX0lURU0gKml0LAorCQkJCWludCB0YWcsIGludCBhY2xhc3MsIGNoYXIgb3B0LCBBU04xX1RMQyAqY3R4KTsKKworaW50IEFTTjFfaXRlbV9leF9pMmQoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKipvdXQsIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCB0YWcsIGludCBhY2xhc3MpOworaW50IEFTTjFfdGVtcGxhdGVfaTJkKEFTTjFfVkFMVUUgKipwdmFsLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7Cit2b2lkIEFTTjFfcHJpbWl0aXZlX2ZyZWUoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitpbnQgYXNuMV9leF9pMmMoQVNOMV9WQUxVRSAqKnB2YWwsIHVuc2lnbmVkIGNoYXIgKmNvbnQsIGludCAqcHV0eXBlLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX2V4X2MyaShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqY29udCwgaW50IGxlbiwgaW50IHV0eXBlLCBjaGFyICpmcmVlX2NvbnQsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCitpbnQgYXNuMV9nZXRfY2hvaWNlX3NlbGVjdG9yKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX3NldF9jaG9pY2Vfc2VsZWN0b3IoQVNOMV9WQUxVRSAqKnB2YWwsIGludCB2YWx1ZSwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKK0FTTjFfVkFMVUUgKiogYXNuMV9nZXRfZmllbGRfcHRyKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCk7CisKK2NvbnN0IEFTTjFfVEVNUExBVEUgKmFzbjFfZG9fYWRiKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX1RFTVBMQVRFICp0dCwgaW50IG51bGxlcnIpOworCitpbnQgYXNuMV9kb19sb2NrKEFTTjFfVkFMVUUgKipwdmFsLCBpbnQgb3AsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOworCit2b2lkIGFzbjFfZW5jX2luaXQoQVNOMV9WQUxVRSAqKnB2YWwsIGNvbnN0IEFTTjFfSVRFTSAqaXQpOwordm9pZCBhc24xX2VuY19mcmVlKEFTTjFfVkFMVUUgKipwdmFsLCBjb25zdCBBU04xX0lURU0gKml0KTsKK2ludCBhc24xX2VuY19yZXN0b3JlKGludCAqbGVuLCB1bnNpZ25lZCBjaGFyICoqb3V0LCBBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgQVNOMV9JVEVNICppdCk7CitpbnQgYXNuMV9lbmNfc2F2ZShBU04xX1ZBTFVFICoqcHZhbCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmxlbiwgY29uc3QgQVNOMV9JVEVNICppdCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYmlvLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYmlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyODAyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9iaW8uaApAQCAtMCwwICsxLDc3MCBAQAorLyogY3J5cHRvL2Jpby9iaW8uaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9CSU9fSAorI2RlZmluZSBIRUFERVJfQklPX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQorIyBpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2NyeXB0by5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGVzZSBhcmUgdGhlICd0eXBlcycgb2YgQklPcyAqLworI2RlZmluZSBCSU9fVFlQRV9OT05FCQkwCisjZGVmaW5lIEJJT19UWVBFX01FTQkJKDF8MHgwNDAwKQorI2RlZmluZSBCSU9fVFlQRV9GSUxFCQkoMnwweDA0MDApCisKKyNkZWZpbmUgQklPX1RZUEVfRkQJCSg0fDB4MDQwMHwweDAxMDApCisjZGVmaW5lIEJJT19UWVBFX1NPQ0tFVAkJKDV8MHgwNDAwfDB4MDEwMCkKKyNkZWZpbmUgQklPX1RZUEVfTlVMTAkJKDZ8MHgwNDAwKQorI2RlZmluZSBCSU9fVFlQRV9TU0wJCSg3fDB4MDIwMCkKKyNkZWZpbmUgQklPX1RZUEVfTUQJCSg4fDB4MDIwMCkJCS8qIHBhc3NpdmUgZmlsdGVyICovCisjZGVmaW5lIEJJT19UWVBFX0JVRkZFUgkJKDl8MHgwMjAwKQkJLyogZmlsdGVyICovCisjZGVmaW5lIEJJT19UWVBFX0NJUEhFUgkJKDEwfDB4MDIwMCkJCS8qIGZpbHRlciAqLworI2RlZmluZSBCSU9fVFlQRV9CQVNFNjQJCSgxMXwweDAyMDApCQkvKiBmaWx0ZXIgKi8KKyNkZWZpbmUgQklPX1RZUEVfQ09OTkVDVAkoMTJ8MHgwNDAwfDB4MDEwMCkJLyogc29ja2V0IC0gY29ubmVjdCAqLworI2RlZmluZSBCSU9fVFlQRV9BQ0NFUFQJCSgxM3wweDA0MDB8MHgwMTAwKQkvKiBzb2NrZXQgZm9yIGFjY2VwdCAqLworI2RlZmluZSBCSU9fVFlQRV9QUk9YWV9DTElFTlQJKDE0fDB4MDIwMCkJCS8qIGNsaWVudCBwcm94eSBCSU8gKi8KKyNkZWZpbmUgQklPX1RZUEVfUFJPWFlfU0VSVkVSCSgxNXwweDAyMDApCQkvKiBzZXJ2ZXIgcHJveHkgQklPICovCisjZGVmaW5lIEJJT19UWVBFX05CSU9fVEVTVAkoMTZ8MHgwMjAwKQkJLyogc2VydmVyIHByb3h5IEJJTyAqLworI2RlZmluZSBCSU9fVFlQRV9OVUxMX0ZJTFRFUgkoMTd8MHgwMjAwKQorI2RlZmluZSBCSU9fVFlQRV9CRVIJCSgxOHwweDAyMDApCQkvKiBCRVIgLT4gYmluIGZpbHRlciAqLworI2RlZmluZSBCSU9fVFlQRV9CSU8JCSgxOXwweDA0MDApCQkvKiAoaGFsZiBhKSBCSU8gcGFpciAqLworI2RlZmluZSBCSU9fVFlQRV9MSU5FQlVGRkVSCSgyMHwweDAyMDApCQkvKiBmaWx0ZXIgKi8KKyNkZWZpbmUgQklPX1RZUEVfREdSQU0JCSgyMXwweDA0MDB8MHgwMTAwKQorI2RlZmluZSBCSU9fVFlQRV9BU04xIAkJKDIyfDB4MDIwMCkJCS8qIGZpbHRlciAqLworI2RlZmluZSBCSU9fVFlQRV9DT01QIAkJKDIzfDB4MDIwMCkJCS8qIGZpbHRlciAqLworCisjZGVmaW5lIEJJT19UWVBFX0RFU0NSSVBUT1IJMHgwMTAwCS8qIHNvY2tldCwgZmQsIGNvbm5lY3Qgb3IgYWNjZXB0ICovCisjZGVmaW5lIEJJT19UWVBFX0ZJTFRFUgkJMHgwMjAwCisjZGVmaW5lIEJJT19UWVBFX1NPVVJDRV9TSU5LCTB4MDQwMAorCisvKiBCSU9fRklMRU5BTUVfUkVBRHxCSU9fQ0xPU0UgdG8gb3BlbiBvciBjbG9zZSBvbiBmcmVlLgorICogQklPX3NldF9mcChpbixzdGRpbixCSU9fTk9DTE9TRSk7ICovCisjZGVmaW5lIEJJT19OT0NMT1NFCQkweDAwCisjZGVmaW5lIEJJT19DTE9TRQkJMHgwMQorCisvKiBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIG1hY3JvcyBhbmQgYXJlIHBhc3NlZCB0bworICogQklPX2N0cmwoKSAqLworI2RlZmluZSBCSU9fQ1RSTF9SRVNFVAkJMSAgLyogb3B0IC0gcmV3aW5kL3plcm8gZXRjICovCisjZGVmaW5lIEJJT19DVFJMX0VPRgkJMiAgLyogb3B0IC0gYXJlIHdlIGF0IHRoZSBlb2YgKi8KKyNkZWZpbmUgQklPX0NUUkxfSU5GTwkJMyAgLyogb3B0IC0gZXh0cmEgdGl0LWJpdHMgKi8KKyNkZWZpbmUgQklPX0NUUkxfU0VUCQk0ICAvKiBtYW4gLSBzZXQgdGhlICdJTycgdHlwZSAqLworI2RlZmluZSBCSU9fQ1RSTF9HRVQJCTUgIC8qIG1hbiAtIGdldCB0aGUgJ0lPJyB0eXBlICovCisjZGVmaW5lIEJJT19DVFJMX1BVU0gJCTYgIC8qIG9wdCAtIGludGVybmFsLCB1c2VkIHRvIHNpZ25pZnkgY2hhbmdlICovCisjZGVmaW5lIEJJT19DVFJMX1BPUAkJNyAgLyogb3B0IC0gaW50ZXJuYWwsIHVzZWQgdG8gc2lnbmlmeSBjaGFuZ2UgKi8KKyNkZWZpbmUgQklPX0NUUkxfR0VUX0NMT1NFCTggIC8qIG1hbiAtIHNldCB0aGUgJ2Nsb3NlJyBvbiBmcmVlICovCisjZGVmaW5lIEJJT19DVFJMX1NFVF9DTE9TRQk5ICAvKiBtYW4gLSBzZXQgdGhlICdjbG9zZScgb24gZnJlZSAqLworI2RlZmluZSBCSU9fQ1RSTF9QRU5ESU5HCTEwICAvKiBvcHQgLSBpcyB0aGVpciBtb3JlIGRhdGEgYnVmZmVyZWQgKi8KKyNkZWZpbmUgQklPX0NUUkxfRkxVU0gJCTExICAvKiBvcHQgLSAnZmx1c2gnIGJ1ZmZlcmVkIG91dHB1dCAqLworI2RlZmluZSBCSU9fQ1RSTF9EVVAJCTEyICAvKiBtYW4gLSBleHRyYSBzdHVmZiBmb3IgJ2R1cGVkJyBCSU8gKi8KKyNkZWZpbmUgQklPX0NUUkxfV1BFTkRJTkcJMTMgIC8qIG9wdCAtIG51bWJlciBvZiBieXRlcyBzdGlsbCB0byB3cml0ZSAqLworLyogY2FsbGJhY2sgaXMgaW50IGNiKEJJTyAqYmlvLHN0YXRlLHJldCk7ICovCisjZGVmaW5lIEJJT19DVFJMX1NFVF9DQUxMQkFDSwkxNCAgLyogb3B0IC0gc2V0IGNhbGxiYWNrIGZ1bmN0aW9uICovCisjZGVmaW5lIEJJT19DVFJMX0dFVF9DQUxMQkFDSwkxNSAgLyogb3B0IC0gc2V0IGNhbGxiYWNrIGZ1bmN0aW9uICovCisKKyNkZWZpbmUgQklPX0NUUkxfU0VUX0ZJTEVOQU1FCTMwCS8qIEJJT19zX2ZpbGUgc3BlY2lhbCAqLworCisvKiBkZ3JhbSBCSU8gc3R1ZmYgKi8KKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fQ09OTkVDVCAgICAgICAzMSAgLyogQklPIGRncmFtIHNwZWNpYWwgKi8KKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fU0VUX0NPTk5FQ1RFRCAzMiAgLyogYWxsb3cgZm9yIGFuIGV4dGVybmFsbHkKKwkJCQkJICAqIGNvbm5lY3RlZCBzb2NrZXQgdG8gYmUKKwkJCQkJICAqIHBhc3NlZCBpbiAqLyAKKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fU0VUX1JFQ1ZfVElNRU9VVCAzMyAvKiBzZXRzb2Nrb3B0LCBlc3NlbnRpYWxseSAqLworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9HRVRfUkVDVl9USU1FT1VUIDM0IC8qIGdldHNvY2tvcHQsIGVzc2VudGlhbGx5ICovCisjZGVmaW5lIEJJT19DVFJMX0RHUkFNX1NFVF9TRU5EX1RJTUVPVVQgMzUgLyogc2V0c29ja29wdCwgZXNzZW50aWFsbHkgKi8KKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fR0VUX1NFTkRfVElNRU9VVCAzNiAvKiBnZXRzb2Nrb3B0LCBlc3NlbnRpYWxseSAqLworCisjZGVmaW5lIEJJT19DVFJMX0RHUkFNX0dFVF9SRUNWX1RJTUVSX0VYUCAzNyAvKiBmbGFnIHdoZXRoZXIgdGhlIGxhc3QgKi8KKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fR0VUX1NFTkRfVElNRVJfRVhQIDM4IC8qIEkvTyBvcGVyYXRpb24gdGllbWQgb3V0ICovCisJCQkJCQorLyogI2lmZGVmIElQX01UVV9ESVNDT1ZFUiAqLworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9NVFVfRElTQ09WRVIgICAgICAgMzkgLyogc2V0IERGIGJpdCBvbiBlZ3Jlc3MgcGFja2V0cyAqLworLyogI2VuZGlmICovCisKKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fUVVFUllfTVRVICAgICAgICAgIDQwIC8qIGFzIGtlcm5lbCBmb3IgY3VycmVudCBNVFUgKi8KKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fR0VUX01UVSAgICAgICAgICAgIDQxIC8qIGdldCBjYWNoZWQgdmFsdWUgZm9yIE1UVSAqLworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9TRVRfTVRVICAgICAgICAgICAgNDIgLyogc2V0IGNhY2hlZCB2YWx1ZSBmb3IKKwkJCQkJICAgICAgKiBNVFUuIHdhbnQgdG8gdXNlIHRoaXMKKwkJCQkJICAgICAgKiBpZiBhc2tpbmcgdGhlIGtlcm5lbAorCQkJCQkgICAgICAqIGZhaWxzICovCisKKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fTVRVX0VYQ0VFREVEICAgICAgIDQzIC8qIGNoZWNrIHdoZXRoZXIgdGhlIE1UVQorCQkJCQkgICAgICAqIHdhcyBleGNlZWQgaW4gdGhlCisJCQkJCSAgICAgICogcHJldmlvdXMgd3JpdGUKKwkJCQkJICAgICAgKiBvcGVyYXRpb24gKi8KKworI2RlZmluZSBCSU9fQ1RSTF9ER1JBTV9HRVRfUEVFUiAgICAgICAgICAgNDYKKyNkZWZpbmUgQklPX0NUUkxfREdSQU1fU0VUX1BFRVIgICAgICAgICAgIDQ0IC8qIERlc3RpbmF0aW9uIGZvciB0aGUgZGF0YSAqLworCisjZGVmaW5lIEJJT19DVFJMX0RHUkFNX1NFVF9ORVhUX1RJTUVPVVQgICA0NSAvKiBOZXh0IERUTFMgaGFuZHNoYWtlIHRpbWVvdXQgdG8KKwkJCQkJCQkJCQkJICAqIGFkanVzdCBzb2NrZXQgdGltZW91dHMgKi8KKworLyogbW9kaWZpZXJzICovCisjZGVmaW5lIEJJT19GUF9SRUFECQkweDAyCisjZGVmaW5lIEJJT19GUF9XUklURQkJMHgwNAorI2RlZmluZSBCSU9fRlBfQVBQRU5ECQkweDA4CisjZGVmaW5lIEJJT19GUF9URVhUCQkweDEwCisKKyNkZWZpbmUgQklPX0ZMQUdTX1JFQUQJCTB4MDEKKyNkZWZpbmUgQklPX0ZMQUdTX1dSSVRFCQkweDAyCisjZGVmaW5lIEJJT19GTEFHU19JT19TUEVDSUFMCTB4MDQKKyNkZWZpbmUgQklPX0ZMQUdTX1JXUyAoQklPX0ZMQUdTX1JFQUR8QklPX0ZMQUdTX1dSSVRFfEJJT19GTEFHU19JT19TUEVDSUFMKQorI2RlZmluZSBCSU9fRkxBR1NfU0hPVUxEX1JFVFJZCTB4MDgKKyNpZm5kZWYJQklPX0ZMQUdTX1VQTElOSworLyogIlVQTElOSyIgZmxhZyBkZW5vdGVzIGZpbGUgZGVzY3JpcHRvcnMgcHJvdmlkZWQgYnkgYXBwbGljYXRpb24uCisgICBJdCBkZWZhdWx0cyB0byAwLCBhcyBtb3N0IHBsYXRmb3JtcyBkb24ndCByZXF1aXJlIFVQTElOSyBpbnRlcmZhY2UuICovCisjZGVmaW5lCUJJT19GTEFHU19VUExJTksJMAorI2VuZGlmCisKKy8qIFVzZWQgaW4gQklPX2dldGhvc3RieW5hbWUoKSAqLworI2RlZmluZSBCSU9fR0hCTl9DVFJMX0hJVFMJCTEKKyNkZWZpbmUgQklPX0dIQk5fQ1RSTF9NSVNTRVMJCTIKKyNkZWZpbmUgQklPX0dIQk5fQ1RSTF9DQUNIRV9TSVpFCTMKKyNkZWZpbmUgQklPX0dIQk5fQ1RSTF9HRVRfRU5UUlkJCTQKKyNkZWZpbmUgQklPX0dIQk5fQ1RSTF9GTFVTSAkJNQorCisvKiBNb3N0bHkgdXNlZCBpbiB0aGUgU1NMIEJJTyAqLworLyogTm90IHVzZWQgYW55bW9yZQorICogI2RlZmluZSBCSU9fRkxBR1NfUFJPVE9DT0xfREVMQVlFRF9SRUFEIDB4MTAKKyAqICNkZWZpbmUgQklPX0ZMQUdTX1BST1RPQ09MX0RFTEFZRURfV1JJVEUgMHgyMAorICogI2RlZmluZSBCSU9fRkxBR1NfUFJPVE9DT0xfU1RBUlRVUAkweDQwCisgKi8KKworI2RlZmluZSBCSU9fRkxBR1NfQkFTRTY0X05PX05MCTB4MTAwCisKKy8qIFRoaXMgaXMgdXNlZCB3aXRoIG1lbW9yeSBCSU9zOiBpdCBtZWFucyB3ZSBzaG91bGRuJ3QgZnJlZSB1cCBvciBjaGFuZ2UgdGhlCisgKiBkYXRhIGluIGFueSB3YXkuCisgKi8KKyNkZWZpbmUgQklPX0ZMQUdTX01FTV9SRE9OTFkJMHgyMDAKKwordHlwZWRlZiBzdHJ1Y3QgYmlvX3N0IEJJTzsKKwordm9pZCBCSU9fc2V0X2ZsYWdzKEJJTyAqYiwgaW50IGZsYWdzKTsKK2ludCAgQklPX3Rlc3RfZmxhZ3MoY29uc3QgQklPICpiLCBpbnQgZmxhZ3MpOwordm9pZCBCSU9fY2xlYXJfZmxhZ3MoQklPICpiLCBpbnQgZmxhZ3MpOworCisjZGVmaW5lIEJJT19nZXRfZmxhZ3MoYikgQklPX3Rlc3RfZmxhZ3MoYiwgfigweDApKQorI2RlZmluZSBCSU9fc2V0X3JldHJ5X3NwZWNpYWwoYikgXAorCQlCSU9fc2V0X2ZsYWdzKGIsIChCSU9fRkxBR1NfSU9fU1BFQ0lBTHxCSU9fRkxBR1NfU0hPVUxEX1JFVFJZKSkKKyNkZWZpbmUgQklPX3NldF9yZXRyeV9yZWFkKGIpIFwKKwkJQklPX3NldF9mbGFncyhiLCAoQklPX0ZMQUdTX1JFQUR8QklPX0ZMQUdTX1NIT1VMRF9SRVRSWSkpCisjZGVmaW5lIEJJT19zZXRfcmV0cnlfd3JpdGUoYikgXAorCQlCSU9fc2V0X2ZsYWdzKGIsIChCSU9fRkxBR1NfV1JJVEV8QklPX0ZMQUdTX1NIT1VMRF9SRVRSWSkpCisKKy8qIFRoZXNlIGFyZSBub3JtYWxseSB1c2VkIGludGVybmFsbHkgaW4gQklPcyAqLworI2RlZmluZSBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYikgXAorCQlCSU9fY2xlYXJfZmxhZ3MoYiwgKEJJT19GTEFHU19SV1N8QklPX0ZMQUdTX1NIT1VMRF9SRVRSWSkpCisjZGVmaW5lIEJJT19nZXRfcmV0cnlfZmxhZ3MoYikgXAorCQlCSU9fdGVzdF9mbGFncyhiLCAoQklPX0ZMQUdTX1JXU3xCSU9fRkxBR1NfU0hPVUxEX1JFVFJZKSkKKworLyogVGhlc2Ugc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRvIHRlbGwgd2h5IHdlIHNob3VsZCByZXRyeSAqLworI2RlZmluZSBCSU9fc2hvdWxkX3JlYWQoYSkJCUJJT190ZXN0X2ZsYWdzKGEsIEJJT19GTEFHU19SRUFEKQorI2RlZmluZSBCSU9fc2hvdWxkX3dyaXRlKGEpCQlCSU9fdGVzdF9mbGFncyhhLCBCSU9fRkxBR1NfV1JJVEUpCisjZGVmaW5lIEJJT19zaG91bGRfaW9fc3BlY2lhbChhKQlCSU9fdGVzdF9mbGFncyhhLCBCSU9fRkxBR1NfSU9fU1BFQ0lBTCkKKyNkZWZpbmUgQklPX3JldHJ5X3R5cGUoYSkJCUJJT190ZXN0X2ZsYWdzKGEsIEJJT19GTEFHU19SV1MpCisjZGVmaW5lIEJJT19zaG91bGRfcmV0cnkoYSkJCUJJT190ZXN0X2ZsYWdzKGEsIEJJT19GTEFHU19TSE9VTERfUkVUUlkpCisKKy8qIFRoZSBuZXh0IHRocmVlIGFyZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisgKiBCSU9fc2hvdWxkX2lvX3NwZWNpYWwoKSBjb25kaXRpb24uICBBZnRlciB0aGlzIHJldHVybnMgdHJ1ZSwKKyAqIEJJTyAqQklPX2dldF9yZXRyeV9CSU8oQklPICpiaW8sIGludCAqcmVhc29uKTsgd2lsbCB3YWxrIHRoZSBCSU8gCisgKiBzdGFjayBhbmQgcmV0dXJuIHRoZSAncmVhc29uJyBmb3IgdGhlIHNwZWNpYWwgYW5kIHRoZSBvZmZlbmRpbmcgQklPLgorICogR2l2ZW4gYSBCSU8sIEJJT19nZXRfcmV0cnlfcmVhc29uKGJpbykgd2lsbCByZXR1cm4gdGhlIGNvZGUuICovCisvKiBSZXR1cm5lZCBmcm9tIHRoZSBTU0wgYmlvIHdoZW4gdGhlIGNlcnRpZmljYXRlIHJldHJpZXZhbCBjb2RlIGhhZCBhbiBlcnJvciAqLworI2RlZmluZSBCSU9fUlJfU1NMX1g1MDlfTE9PS1VQCQkweDAxCisvKiBSZXR1cm5lZCBmcm9tIHRoZSBjb25uZWN0IEJJTyB3aGVuIGEgY29ubmVjdCB3b3VsZCBoYXZlIGJsb2NrZWQgKi8KKyNkZWZpbmUgQklPX1JSX0NPTk5FQ1QJCQkweDAyCisvKiBSZXR1cm5lZCBmcm9tIHRoZSBhY2NlcHQgQklPIHdoZW4gYW4gYWNjZXB0IHdvdWxkIGhhdmUgYmxvY2tlZCAqLworI2RlZmluZSBCSU9fUlJfQUNDRVBUCQkJMHgwMworCisvKiBUaGVzZSBhcmUgcGFzc2VkIGJ5IHRoZSBCSU8gY2FsbGJhY2sgKi8KKyNkZWZpbmUgQklPX0NCX0ZSRUUJMHgwMQorI2RlZmluZSBCSU9fQ0JfUkVBRAkweDAyCisjZGVmaW5lIEJJT19DQl9XUklURQkweDAzCisjZGVmaW5lIEJJT19DQl9QVVRTCTB4MDQKKyNkZWZpbmUgQklPX0NCX0dFVFMJMHgwNQorI2RlZmluZSBCSU9fQ0JfQ1RSTAkweDA2CisKKy8qIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgdW5kZXJsaW5nIG9wZXJhdGlvbiwKKyAqIFRoZSBCSU9fQ0JfUkVUVVJOIGZsYWcgaW5kaWNhdGVzIGlmIGl0IGlzIGFmdGVyIHRoZSBjYWxsICovCisjZGVmaW5lIEJJT19DQl9SRVRVUk4JMHg4MAorI2RlZmluZSBCSU9fQ0JfcmV0dXJuKGEpICgoYSl8QklPX0NCX1JFVFVSTikpCisjZGVmaW5lIEJJT19jYl9wcmUoYSkJKCEoKGEpJkJJT19DQl9SRVRVUk4pKQorI2RlZmluZSBCSU9fY2JfcG9zdChhKQkoKGEpJkJJT19DQl9SRVRVUk4pCisKK2xvbmcgKCpCSU9fZ2V0X2NhbGxiYWNrKGNvbnN0IEJJTyAqYikpIChzdHJ1Y3QgYmlvX3N0ICosaW50LGNvbnN0IGNoYXIgKixpbnQsIGxvbmcsbG9uZyk7Cit2b2lkIEJJT19zZXRfY2FsbGJhY2soQklPICpiLCAKKwlsb25nICgqY2FsbGJhY2spKHN0cnVjdCBiaW9fc3QgKixpbnQsY29uc3QgY2hhciAqLGludCwgbG9uZyxsb25nKSk7CitjaGFyICpCSU9fZ2V0X2NhbGxiYWNrX2FyZyhjb25zdCBCSU8gKmIpOwordm9pZCBCSU9fc2V0X2NhbGxiYWNrX2FyZyhCSU8gKmIsIGNoYXIgKmFyZyk7CisKK2NvbnN0IGNoYXIgKiBCSU9fbWV0aG9kX25hbWUoY29uc3QgQklPICpiKTsKK2ludCBCSU9fbWV0aG9kX3R5cGUoY29uc3QgQklPICpiKTsKKwordHlwZWRlZiB2b2lkIGJpb19pbmZvX2NiKHN0cnVjdCBiaW9fc3QgKiwgaW50LCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZyk7CisKK3R5cGVkZWYgc3RydWN0IGJpb19tZXRob2Rfc3QKKwl7CisJaW50IHR5cGU7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpid3JpdGUpKEJJTyAqLCBjb25zdCBjaGFyICosIGludCk7CisJaW50ICgqYnJlYWQpKEJJTyAqLCBjaGFyICosIGludCk7CisJaW50ICgqYnB1dHMpKEJJTyAqLCBjb25zdCBjaGFyICopOworCWludCAoKmJnZXRzKShCSU8gKiwgY2hhciAqLCBpbnQpOworCWxvbmcgKCpjdHJsKShCSU8gKiwgaW50LCBsb25nLCB2b2lkICopOworCWludCAoKmNyZWF0ZSkoQklPICopOworCWludCAoKmRlc3Ryb3kpKEJJTyAqKTsKKyAgICAgICAgbG9uZyAoKmNhbGxiYWNrX2N0cmwpKEJJTyAqLCBpbnQsIGJpb19pbmZvX2NiICopOworCX0gQklPX01FVEhPRDsKKworc3RydWN0IGJpb19zdAorCXsKKwlCSU9fTUVUSE9EICptZXRob2Q7CisJLyogYmlvLCBtb2RlLCBhcmdwLCBhcmdpLCBhcmdsLCByZXQgKi8KKwlsb25nICgqY2FsbGJhY2spKHN0cnVjdCBiaW9fc3QgKixpbnQsY29uc3QgY2hhciAqLGludCwgbG9uZyxsb25nKTsKKwljaGFyICpjYl9hcmc7IC8qIGZpcnN0IGFyZ3VtZW50IGZvciB0aGUgY2FsbGJhY2sgKi8KKworCWludCBpbml0OworCWludCBzaHV0ZG93bjsKKwlpbnQgZmxhZ3M7CS8qIGV4dHJhIHN0b3JhZ2UgKi8KKwlpbnQgcmV0cnlfcmVhc29uOworCWludCBudW07CisJdm9pZCAqcHRyOworCXN0cnVjdCBiaW9fc3QgKm5leHRfYmlvOwkvKiB1c2VkIGJ5IGZpbHRlciBCSU9zICovCisJc3RydWN0IGJpb19zdCAqcHJldl9iaW87CS8qIHVzZWQgYnkgZmlsdGVyIEJJT3MgKi8KKwlpbnQgcmVmZXJlbmNlczsKKwl1bnNpZ25lZCBsb25nIG51bV9yZWFkOworCXVuc2lnbmVkIGxvbmcgbnVtX3dyaXRlOworCisJQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKwl9OworCitERUNMQVJFX1NUQUNLX09GKEJJTykKKwordHlwZWRlZiBzdHJ1Y3QgYmlvX2ZfYnVmZmVyX2N0eF9zdHJ1Y3QKKwl7CisJLyogQklPICpiaW87ICovIC8qIHRoaXMgaXMgbm93IGluIHRoZSBCSU8gc3RydWN0ICovCisJaW50IGlidWZfc2l6ZTsJLyogaG93IGJpZyBpcyB0aGUgaW5wdXQgYnVmZmVyICovCisJaW50IG9idWZfc2l6ZTsJLyogaG93IGJpZyBpcyB0aGUgb3V0cHV0IGJ1ZmZlciAqLworCisJY2hhciAqaWJ1ZjsJCS8qIHRoZSBjaGFyIGFycmF5ICovCisJaW50IGlidWZfbGVuOwkJLyogaG93IG1hbnkgYnl0ZXMgYXJlIGluIGl0ICovCisJaW50IGlidWZfb2ZmOwkJLyogd3JpdGUvcmVhZCBvZmZzZXQgKi8KKworCWNoYXIgKm9idWY7CQkvKiB0aGUgY2hhciBhcnJheSAqLworCWludCBvYnVmX2xlbjsJCS8qIGhvdyBtYW55IGJ5dGVzIGFyZSBpbiBpdCAqLworCWludCBvYnVmX29mZjsJCS8qIHdyaXRlL3JlYWQgb2Zmc2V0ICovCisJfSBCSU9fRl9CVUZGRVJfQ1RYOworCisvKiBQcmVmaXggYW5kIHN1ZmZpeCBjYWxsYmFjayBpbiBBU04xIEJJTyAqLwordHlwZWRlZiBpbnQgYXNuMV9wc19mdW5jKEJJTyAqYiwgdW5zaWduZWQgY2hhciAqKnBidWYsIGludCAqcGxlbiwgdm9pZCAqcGFyZyk7CisKKy8qIGNvbm5lY3QgQklPIHN0dWZmICovCisjZGVmaW5lIEJJT19DT05OX1NfQkVGT1JFCQkxCisjZGVmaW5lIEJJT19DT05OX1NfR0VUX0lQCQkyCisjZGVmaW5lIEJJT19DT05OX1NfR0VUX1BPUlQJCTMKKyNkZWZpbmUgQklPX0NPTk5fU19DUkVBVEVfU09DS0VUCTQKKyNkZWZpbmUgQklPX0NPTk5fU19DT05ORUNUCQk1CisjZGVmaW5lIEJJT19DT05OX1NfT0sJCQk2CisjZGVmaW5lIEJJT19DT05OX1NfQkxPQ0tFRF9DT05ORUNUCTcKKyNkZWZpbmUgQklPX0NPTk5fU19OQklPCQkJOAorLyojZGVmaW5lIEJJT19DT05OX2dldF9wYXJhbV9ob3N0bmFtZQlCSU9fY3RybCAqLworCisjZGVmaW5lIEJJT19DX1NFVF9DT05ORUNUCQkJMTAwCisjZGVmaW5lIEJJT19DX0RPX1NUQVRFX01BQ0hJTkUJCQkxMDEKKyNkZWZpbmUgQklPX0NfU0VUX05CSU8JCQkJMTAyCisjZGVmaW5lIEJJT19DX1NFVF9QUk9YWV9QQVJBTQkJCTEwMworI2RlZmluZSBCSU9fQ19TRVRfRkQJCQkJMTA0CisjZGVmaW5lIEJJT19DX0dFVF9GRAkJCQkxMDUKKyNkZWZpbmUgQklPX0NfU0VUX0ZJTEVfUFRSCQkJMTA2CisjZGVmaW5lIEJJT19DX0dFVF9GSUxFX1BUUgkJCTEwNworI2RlZmluZSBCSU9fQ19TRVRfRklMRU5BTUUJCQkxMDgKKyNkZWZpbmUgQklPX0NfU0VUX1NTTAkJCQkxMDkKKyNkZWZpbmUgQklPX0NfR0VUX1NTTAkJCQkxMTAKKyNkZWZpbmUgQklPX0NfU0VUX01ECQkJCTExMQorI2RlZmluZSBCSU9fQ19HRVRfTUQJCQkJMTEyCisjZGVmaW5lIEJJT19DX0dFVF9DSVBIRVJfU1RBVFVTCQkJMTEzCisjZGVmaW5lIEJJT19DX1NFVF9CVUZfTUVNCQkJMTE0CisjZGVmaW5lIEJJT19DX0dFVF9CVUZfTUVNX1BUUgkJCTExNQorI2RlZmluZSBCSU9fQ19HRVRfQlVGRl9OVU1fTElORVMJCTExNgorI2RlZmluZSBCSU9fQ19TRVRfQlVGRl9TSVpFCQkJMTE3CisjZGVmaW5lIEJJT19DX1NFVF9BQ0NFUFQJCQkxMTgKKyNkZWZpbmUgQklPX0NfU1NMX01PREUJCQkJMTE5CisjZGVmaW5lIEJJT19DX0dFVF9NRF9DVFgJCQkxMjAKKyNkZWZpbmUgQklPX0NfR0VUX1BST1hZX1BBUkFNCQkJMTIxCisjZGVmaW5lIEJJT19DX1NFVF9CVUZGX1JFQURfREFUQQkJMTIyIC8qIGRhdGEgdG8gcmVhZCBmaXJzdCAqLworI2RlZmluZSBCSU9fQ19HRVRfQ09OTkVDVAkJCTEyMworI2RlZmluZSBCSU9fQ19HRVRfQUNDRVBUCQkJMTI0CisjZGVmaW5lIEJJT19DX1NFVF9TU0xfUkVORUdPVElBVEVfQllURVMJCTEyNQorI2RlZmluZSBCSU9fQ19HRVRfU1NMX05VTV9SRU5FR09USUFURVMJCTEyNgorI2RlZmluZSBCSU9fQ19TRVRfU1NMX1JFTkVHT1RJQVRFX1RJTUVPVVQJMTI3CisjZGVmaW5lIEJJT19DX0ZJTEVfU0VFSwkJCQkxMjgKKyNkZWZpbmUgQklPX0NfR0VUX0NJUEhFUl9DVFgJCQkxMjkKKyNkZWZpbmUgQklPX0NfU0VUX0JVRl9NRU1fRU9GX1JFVFVSTgkJMTMwLypyZXR1cm4gZW5kIG9mIGlucHV0IHZhbHVlKi8KKyNkZWZpbmUgQklPX0NfU0VUX0JJTkRfTU9ERQkJCTEzMQorI2RlZmluZSBCSU9fQ19HRVRfQklORF9NT0RFCQkJMTMyCisjZGVmaW5lIEJJT19DX0ZJTEVfVEVMTAkJCQkxMzMKKyNkZWZpbmUgQklPX0NfR0VUX1NPQ0tTCQkJCTEzNAorI2RlZmluZSBCSU9fQ19TRVRfU09DS1MJCQkJMTM1CisKKyNkZWZpbmUgQklPX0NfU0VUX1dSSVRFX0JVRl9TSVpFCQkxMzYvKiBmb3IgQklPX3NfYmlvICovCisjZGVmaW5lIEJJT19DX0dFVF9XUklURV9CVUZfU0laRQkJMTM3CisjZGVmaW5lIEJJT19DX01BS0VfQklPX1BBSVIJCQkxMzgKKyNkZWZpbmUgQklPX0NfREVTVFJPWV9CSU9fUEFJUgkJCTEzOQorI2RlZmluZSBCSU9fQ19HRVRfV1JJVEVfR1VBUkFOVEVFCQkxNDAKKyNkZWZpbmUgQklPX0NfR0VUX1JFQURfUkVRVUVTVAkJCTE0MQorI2RlZmluZSBCSU9fQ19TSFVURE9XTl9XUgkJCTE0MgorI2RlZmluZSBCSU9fQ19OUkVBRDAJCQkJMTQzCisjZGVmaW5lIEJJT19DX05SRUFECQkJCTE0NAorI2RlZmluZSBCSU9fQ19OV1JJVEUwCQkJCTE0NQorI2RlZmluZSBCSU9fQ19OV1JJVEUJCQkJMTQ2CisjZGVmaW5lIEJJT19DX1JFU0VUX1JFQURfUkVRVUVTVAkJMTQ3CisjZGVmaW5lIEJJT19DX1NFVF9NRF9DVFgJCQkxNDgKKworI2RlZmluZSBCSU9fQ19TRVRfUFJFRklYCQkJMTQ5CisjZGVmaW5lIEJJT19DX0dFVF9QUkVGSVgJCQkxNTAKKyNkZWZpbmUgQklPX0NfU0VUX1NVRkZJWAkJCTE1MQorI2RlZmluZSBCSU9fQ19HRVRfU1VGRklYCQkJMTUyCisKKyNkZWZpbmUgQklPX0NfU0VUX0VYX0FSRwkJCTE1MworI2RlZmluZSBCSU9fQ19HRVRfRVhfQVJHCQkJMTU0CisKKyNkZWZpbmUgQklPX3NldF9hcHBfZGF0YShzLGFyZykJCUJJT19zZXRfZXhfZGF0YShzLDAsYXJnKQorI2RlZmluZSBCSU9fZ2V0X2FwcF9kYXRhKHMpCQlCSU9fZ2V0X2V4X2RhdGEocywwKQorCisvKiBCSU9fc19jb25uZWN0KCkgYW5kIEJJT19zX3NvY2tzNGFfY29ubmVjdCgpICovCisjZGVmaW5lIEJJT19zZXRfY29ubl9ob3N0bmFtZShiLG5hbWUpIEJJT19jdHJsKGIsQklPX0NfU0VUX0NPTk5FQ1QsMCwoY2hhciAqKW5hbWUpCisjZGVmaW5lIEJJT19zZXRfY29ubl9wb3J0KGIscG9ydCkgQklPX2N0cmwoYixCSU9fQ19TRVRfQ09OTkVDVCwxLChjaGFyICopcG9ydCkKKyNkZWZpbmUgQklPX3NldF9jb25uX2lwKGIsaXApCSAgQklPX2N0cmwoYixCSU9fQ19TRVRfQ09OTkVDVCwyLChjaGFyICopaXApCisjZGVmaW5lIEJJT19zZXRfY29ubl9pbnRfcG9ydChiLHBvcnQpIEJJT19jdHJsKGIsQklPX0NfU0VUX0NPTk5FQ1QsMywoY2hhciAqKXBvcnQpCisjZGVmaW5lIEJJT19nZXRfY29ubl9ob3N0bmFtZShiKSAgQklPX3B0cl9jdHJsKGIsQklPX0NfR0VUX0NPTk5FQ1QsMCkKKyNkZWZpbmUgQklPX2dldF9jb25uX3BvcnQoYikgICAgICBCSU9fcHRyX2N0cmwoYixCSU9fQ19HRVRfQ09OTkVDVCwxKQorI2RlZmluZSBCSU9fZ2V0X2Nvbm5faXAoYikgCQkgQklPX3B0cl9jdHJsKGIsQklPX0NfR0VUX0NPTk5FQ1QsMikKKyNkZWZpbmUgQklPX2dldF9jb25uX2ludF9wb3J0KGIpIEJJT19pbnRfY3RybChiLEJJT19DX0dFVF9DT05ORUNULDMsMCkKKworCisjZGVmaW5lIEJJT19zZXRfbmJpbyhiLG4pCUJJT19jdHJsKGIsQklPX0NfU0VUX05CSU8sKG4pLE5VTEwpCisKKy8qIEJJT19zX2FjY2VwdF9zb2NrZXQoKSAqLworI2RlZmluZSBCSU9fc2V0X2FjY2VwdF9wb3J0KGIsbmFtZSkgQklPX2N0cmwoYixCSU9fQ19TRVRfQUNDRVBULDAsKGNoYXIgKiluYW1lKQorI2RlZmluZSBCSU9fZ2V0X2FjY2VwdF9wb3J0KGIpCUJJT19wdHJfY3RybChiLEJJT19DX0dFVF9BQ0NFUFQsMCkKKy8qICNkZWZpbmUgQklPX3NldF9uYmlvKGIsbikJQklPX2N0cmwoYixCSU9fQ19TRVRfTkJJTywobiksTlVMTCkgKi8KKyNkZWZpbmUgQklPX3NldF9uYmlvX2FjY2VwdChiLG4pIEJJT19jdHJsKGIsQklPX0NfU0VUX0FDQ0VQVCwxLChuKT8odm9pZCAqKSJhIjpOVUxMKQorI2RlZmluZSBCSU9fc2V0X2FjY2VwdF9iaW9zKGIsYmlvKSBCSU9fY3RybChiLEJJT19DX1NFVF9BQ0NFUFQsMiwoY2hhciAqKWJpbykKKworI2RlZmluZSBCSU9fQklORF9OT1JNQUwJCQkwCisjZGVmaW5lIEJJT19CSU5EX1JFVVNFQUREUl9JRl9VTlVTRUQJMQorI2RlZmluZSBCSU9fQklORF9SRVVTRUFERFIJCTIKKyNkZWZpbmUgQklPX3NldF9iaW5kX21vZGUoYixtb2RlKSBCSU9fY3RybChiLEJJT19DX1NFVF9CSU5EX01PREUsbW9kZSxOVUxMKQorI2RlZmluZSBCSU9fZ2V0X2JpbmRfbW9kZShiLG1vZGUpIEJJT19jdHJsKGIsQklPX0NfR0VUX0JJTkRfTU9ERSwwLE5VTEwpCisKKyNkZWZpbmUgQklPX2RvX2Nvbm5lY3QoYikJQklPX2RvX2hhbmRzaGFrZShiKQorI2RlZmluZSBCSU9fZG9fYWNjZXB0KGIpCUJJT19kb19oYW5kc2hha2UoYikKKyNkZWZpbmUgQklPX2RvX2hhbmRzaGFrZShiKQlCSU9fY3RybChiLEJJT19DX0RPX1NUQVRFX01BQ0hJTkUsMCxOVUxMKQorCisvKiBCSU9fc19wcm94eV9jbGllbnQoKSAqLworI2RlZmluZSBCSU9fc2V0X3VybChiLHVybCkJQklPX2N0cmwoYixCSU9fQ19TRVRfUFJPWFlfUEFSQU0sMCwoY2hhciAqKSh1cmwpKQorI2RlZmluZSBCSU9fc2V0X3Byb3hpZXMoYixwKQlCSU9fY3RybChiLEJJT19DX1NFVF9QUk9YWV9QQVJBTSwxLChjaGFyICopKHApKQorLyogQklPX3NldF9uYmlvKGIsbikgKi8KKyNkZWZpbmUgQklPX3NldF9maWx0ZXJfYmlvKGIscykgQklPX2N0cmwoYixCSU9fQ19TRVRfUFJPWFlfUEFSQU0sMiwoY2hhciAqKShzKSkKKy8qIEJJTyAqQklPX2dldF9maWx0ZXJfYmlvKEJJTyAqYmlvKTsgKi8KKyNkZWZpbmUgQklPX3NldF9wcm94eV9jYihiLGNiKSBCSU9fY2FsbGJhY2tfY3RybChiLEJJT19DX1NFVF9QUk9YWV9QQVJBTSwzLCh2b2lkICooKmNiKSgpKSkKKyNkZWZpbmUgQklPX3NldF9wcm94eV9oZWFkZXIoYixzaykgQklPX2N0cmwoYixCSU9fQ19TRVRfUFJPWFlfUEFSQU0sNCwoY2hhciAqKXNrKQorI2RlZmluZSBCSU9fc2V0X25vX2Nvbm5lY3RfcmV0dXJuKGIsYm9vbCkgQklPX2ludF9jdHJsKGIsQklPX0NfU0VUX1BST1hZX1BBUkFNLDUsYm9vbCkKKworI2RlZmluZSBCSU9fZ2V0X3Byb3h5X2hlYWRlcihiLHNrcCkgQklPX2N0cmwoYixCSU9fQ19HRVRfUFJPWFlfUEFSQU0sMCwoY2hhciAqKXNrcCkKKyNkZWZpbmUgQklPX2dldF9wcm94aWVzKGIscHh5X3ApIEJJT19jdHJsKGIsQklPX0NfR0VUX1BST1hZX1BBUkFNLDEsKGNoYXIgKikocHh5X3ApKQorI2RlZmluZSBCSU9fZ2V0X3VybChiLHVybCkJQklPX2N0cmwoYixCSU9fQ19HRVRfUFJPWFlfUEFSQU0sMiwoY2hhciAqKSh1cmwpKQorI2RlZmluZSBCSU9fZ2V0X25vX2Nvbm5lY3RfcmV0dXJuKGIpCUJJT19jdHJsKGIsQklPX0NfR0VUX1BST1hZX1BBUkFNLDUsTlVMTCkKKworI2RlZmluZSBCSU9fc2V0X2ZkKGIsZmQsYykJQklPX2ludF9jdHJsKGIsQklPX0NfU0VUX0ZELGMsZmQpCisjZGVmaW5lIEJJT19nZXRfZmQoYixjKQkJQklPX2N0cmwoYixCSU9fQ19HRVRfRkQsMCwoY2hhciAqKWMpCisKKyNkZWZpbmUgQklPX3NldF9mcChiLGZwLGMpCUJJT19jdHJsKGIsQklPX0NfU0VUX0ZJTEVfUFRSLGMsKGNoYXIgKilmcCkKKyNkZWZpbmUgQklPX2dldF9mcChiLGZwcCkJQklPX2N0cmwoYixCSU9fQ19HRVRfRklMRV9QVFIsMCwoY2hhciAqKWZwcCkKKworI2RlZmluZSBCSU9fc2VlayhiLG9mcykJKGludClCSU9fY3RybChiLEJJT19DX0ZJTEVfU0VFSyxvZnMsTlVMTCkKKyNkZWZpbmUgQklPX3RlbGwoYikJKGludClCSU9fY3RybChiLEJJT19DX0ZJTEVfVEVMTCwwLE5VTEwpCisKKy8qIG5hbWUgaXMgY2FzdCB0byBsb3NlIGNvbnN0LCBidXQgbWlnaHQgYmUgYmV0dGVyIHRvIHJvdXRlIHRocm91Z2ggYSBmdW5jdGlvbgorICAgc28gd2UgY2FuIGRvIGl0IHNhZmVseSAqLworI2lmZGVmIENPTlNUX1NUUklDVAorLyogSWYgeW91IGFyZSB3b25kZXJpbmcgd2h5IHRoaXMgaXNuJ3QgZGVmaW5lZCwgaXRzIGJlY2F1c2UgQ09OU1RfU1RSSUNUIGlzCisgKiBwdXJlbHkgYSBjb21waWxlLXRpbWUga2x1ZGdlIHRvIGFsbG93IGNvbnN0IHRvIGJlIGNoZWNrZWQuCisgKi8KK2ludCBCSU9fcmVhZF9maWxlbmFtZShCSU8gKmIsY29uc3QgY2hhciAqbmFtZSk7CisjZWxzZQorI2RlZmluZSBCSU9fcmVhZF9maWxlbmFtZShiLG5hbWUpIEJJT19jdHJsKGIsQklPX0NfU0VUX0ZJTEVOQU1FLCBcCisJCUJJT19DTE9TRXxCSU9fRlBfUkVBRCwoY2hhciAqKW5hbWUpCisjZW5kaWYKKyNkZWZpbmUgQklPX3dyaXRlX2ZpbGVuYW1lKGIsbmFtZSkgQklPX2N0cmwoYixCSU9fQ19TRVRfRklMRU5BTUUsIFwKKwkJQklPX0NMT1NFfEJJT19GUF9XUklURSxuYW1lKQorI2RlZmluZSBCSU9fYXBwZW5kX2ZpbGVuYW1lKGIsbmFtZSkgQklPX2N0cmwoYixCSU9fQ19TRVRfRklMRU5BTUUsIFwKKwkJQklPX0NMT1NFfEJJT19GUF9BUFBFTkQsbmFtZSkKKyNkZWZpbmUgQklPX3J3X2ZpbGVuYW1lKGIsbmFtZSkgQklPX2N0cmwoYixCSU9fQ19TRVRfRklMRU5BTUUsIFwKKwkJQklPX0NMT1NFfEJJT19GUF9SRUFEfEJJT19GUF9XUklURSxuYW1lKQorCisvKiBXQVJOSU5HIFdBUk5JTkcsIHRoaXMgdXBzIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIHJlYWQgYmlvIG9mIHRoZQorICogU1NMIHN0cnVjdHVyZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgc3NsIHJlYWQgQklPIGlzIG5vdyBwb2ludGVkIHRvIGJ5CisgKiB0aGUgbmV4dF9iaW8gZmllbGQgaW4gdGhlIGJpby4gIFNvIHdoZW4geW91IGZyZWUgdGhlIEJJTywgbWFrZSBzdXJlCisgKiB5b3UgYXJlIGRvaW5nIGEgQklPX2ZyZWVfYWxsKCkgdG8gY2F0Y2ggdGhlIHVuZGVybHlpbmcgQklPLiAqLworI2RlZmluZSBCSU9fc2V0X3NzbChiLHNzbCxjKQlCSU9fY3RybChiLEJJT19DX1NFVF9TU0wsYywoY2hhciAqKXNzbCkKKyNkZWZpbmUgQklPX2dldF9zc2woYixzc2xwKQlCSU9fY3RybChiLEJJT19DX0dFVF9TU0wsMCwoY2hhciAqKXNzbHApCisjZGVmaW5lIEJJT19zZXRfc3NsX21vZGUoYixjbGllbnQpCUJJT19jdHJsKGIsQklPX0NfU1NMX01PREUsY2xpZW50LE5VTEwpCisjZGVmaW5lIEJJT19zZXRfc3NsX3JlbmVnb3RpYXRlX2J5dGVzKGIsbnVtKSBcCisJQklPX2N0cmwoYixCSU9fQ19TRVRfU1NMX1JFTkVHT1RJQVRFX0JZVEVTLG51bSxOVUxMKTsKKyNkZWZpbmUgQklPX2dldF9udW1fcmVuZWdvdGlhdGVzKGIpIFwKKwlCSU9fY3RybChiLEJJT19DX0dFVF9TU0xfTlVNX1JFTkVHT1RJQVRFUywwLE5VTEwpOworI2RlZmluZSBCSU9fc2V0X3NzbF9yZW5lZ290aWF0ZV90aW1lb3V0KGIsc2Vjb25kcykgXAorCUJJT19jdHJsKGIsQklPX0NfU0VUX1NTTF9SRU5FR09USUFURV9USU1FT1VULHNlY29uZHMsTlVMTCk7CisKKy8qIGRlZmluZWQgaW4gZXZwLmggKi8KKy8qICNkZWZpbmUgQklPX3NldF9tZChiLG1kKQlCSU9fY3RybChiLEJJT19DX1NFVF9NRCwxLChjaGFyICopbWQpICovCisKKyNkZWZpbmUgQklPX2dldF9tZW1fZGF0YShiLHBwKQlCSU9fY3RybChiLEJJT19DVFJMX0lORk8sMCwoY2hhciAqKXBwKQorI2RlZmluZSBCSU9fc2V0X21lbV9idWYoYixibSxjKQlCSU9fY3RybChiLEJJT19DX1NFVF9CVUZfTUVNLGMsKGNoYXIgKilibSkKKyNkZWZpbmUgQklPX2dldF9tZW1fcHRyKGIscHApCUJJT19jdHJsKGIsQklPX0NfR0VUX0JVRl9NRU1fUFRSLDAsKGNoYXIgKilwcCkKKyNkZWZpbmUgQklPX3NldF9tZW1fZW9mX3JldHVybihiLHYpIFwKKwkJCQlCSU9fY3RybChiLEJJT19DX1NFVF9CVUZfTUVNX0VPRl9SRVRVUk4sdixOVUxMKQorCisvKiBGb3IgdGhlIEJJT19mX2J1ZmZlcigpIHR5cGUgKi8KKyNkZWZpbmUgQklPX2dldF9idWZmZXJfbnVtX2xpbmVzKGIpCUJJT19jdHJsKGIsQklPX0NfR0VUX0JVRkZfTlVNX0xJTkVTLDAsTlVMTCkKKyNkZWZpbmUgQklPX3NldF9idWZmZXJfc2l6ZShiLHNpemUpCUJJT19jdHJsKGIsQklPX0NfU0VUX0JVRkZfU0laRSxzaXplLE5VTEwpCisjZGVmaW5lIEJJT19zZXRfcmVhZF9idWZmZXJfc2l6ZShiLHNpemUpIEJJT19pbnRfY3RybChiLEJJT19DX1NFVF9CVUZGX1NJWkUsc2l6ZSwwKQorI2RlZmluZSBCSU9fc2V0X3dyaXRlX2J1ZmZlcl9zaXplKGIsc2l6ZSkgQklPX2ludF9jdHJsKGIsQklPX0NfU0VUX0JVRkZfU0laRSxzaXplLDEpCisjZGVmaW5lIEJJT19zZXRfYnVmZmVyX3JlYWRfZGF0YShiLGJ1ZixudW0pIEJJT19jdHJsKGIsQklPX0NfU0VUX0JVRkZfUkVBRF9EQVRBLG51bSxidWYpCisKKy8qIERvbid0IHVzZSB0aGUgbmV4dCBvbmUgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyA6LSkgKi8KKyNkZWZpbmUgQklPX2R1cF9zdGF0ZShiLHJldCkJQklPX2N0cmwoYixCSU9fQ1RSTF9EVVAsMCwoY2hhciAqKShyZXQpKQorCisjZGVmaW5lIEJJT19yZXNldChiKQkJKGludClCSU9fY3RybChiLEJJT19DVFJMX1JFU0VULDAsTlVMTCkKKyNkZWZpbmUgQklPX2VvZihiKQkJKGludClCSU9fY3RybChiLEJJT19DVFJMX0VPRiwwLE5VTEwpCisjZGVmaW5lIEJJT19zZXRfY2xvc2UoYixjKQkoaW50KUJJT19jdHJsKGIsQklPX0NUUkxfU0VUX0NMT1NFLChjKSxOVUxMKQorI2RlZmluZSBCSU9fZ2V0X2Nsb3NlKGIpCShpbnQpQklPX2N0cmwoYixCSU9fQ1RSTF9HRVRfQ0xPU0UsMCxOVUxMKQorI2RlZmluZSBCSU9fcGVuZGluZyhiKQkJKGludClCSU9fY3RybChiLEJJT19DVFJMX1BFTkRJTkcsMCxOVUxMKQorI2RlZmluZSBCSU9fd3BlbmRpbmcoYikJCShpbnQpQklPX2N0cmwoYixCSU9fQ1RSTF9XUEVORElORywwLE5VTEwpCisvKiAuLi5wZW5kaW5nIG1hY3JvcyBoYXZlIGluYXBwcm9wcmlhdGUgcmV0dXJuIHR5cGUgKi8KK3NpemVfdCBCSU9fY3RybF9wZW5kaW5nKEJJTyAqYik7CitzaXplX3QgQklPX2N0cmxfd3BlbmRpbmcoQklPICpiKTsKKyNkZWZpbmUgQklPX2ZsdXNoKGIpCQkoaW50KUJJT19jdHJsKGIsQklPX0NUUkxfRkxVU0gsMCxOVUxMKQorI2RlZmluZSBCSU9fZ2V0X2luZm9fY2FsbGJhY2soYixjYnApIChpbnQpQklPX2N0cmwoYixCSU9fQ1RSTF9HRVRfQ0FMTEJBQ0ssMCwgXAorCQkJCQkJICAgY2JwKQorI2RlZmluZSBCSU9fc2V0X2luZm9fY2FsbGJhY2soYixjYikgKGludClCSU9fY2FsbGJhY2tfY3RybChiLEJJT19DVFJMX1NFVF9DQUxMQkFDSyxjYikKKworLyogRm9yIHRoZSBCSU9fZl9idWZmZXIoKSB0eXBlICovCisjZGVmaW5lIEJJT19idWZmZXJfZ2V0X251bV9saW5lcyhiKSBCSU9fY3RybChiLEJJT19DVFJMX0dFVCwwLE5VTEwpCisKKy8qIEZvciBCSU9fc19iaW8oKSAqLworI2RlZmluZSBCSU9fc2V0X3dyaXRlX2J1Zl9zaXplKGIsc2l6ZSkgKGludClCSU9fY3RybChiLEJJT19DX1NFVF9XUklURV9CVUZfU0laRSxzaXplLE5VTEwpCisjZGVmaW5lIEJJT19nZXRfd3JpdGVfYnVmX3NpemUoYixzaXplKSAoc2l6ZV90KUJJT19jdHJsKGIsQklPX0NfR0VUX1dSSVRFX0JVRl9TSVpFLHNpemUsTlVMTCkKKyNkZWZpbmUgQklPX21ha2VfYmlvX3BhaXIoYjEsYjIpICAgKGludClCSU9fY3RybChiMSxCSU9fQ19NQUtFX0JJT19QQUlSLDAsYjIpCisjZGVmaW5lIEJJT19kZXN0cm95X2Jpb19wYWlyKGIpICAgIChpbnQpQklPX2N0cmwoYixCSU9fQ19ERVNUUk9ZX0JJT19QQUlSLDAsTlVMTCkKKyNkZWZpbmUgQklPX3NodXRkb3duX3dyKGIpIChpbnQpQklPX2N0cmwoYiwgQklPX0NfU0hVVERPV05fV1IsIDAsIE5VTEwpCisvKiBtYWNyb3Mgd2l0aCBpbmFwcHJvcHJpYXRlIHR5cGUgLS0gYnV0IC4uLnBlbmRpbmcgbWFjcm9zIHVzZSBpbnQgdG9vOiAqLworI2RlZmluZSBCSU9fZ2V0X3dyaXRlX2d1YXJhbnRlZShiKSAoaW50KUJJT19jdHJsKGIsQklPX0NfR0VUX1dSSVRFX0dVQVJBTlRFRSwwLE5VTEwpCisjZGVmaW5lIEJJT19nZXRfcmVhZF9yZXF1ZXN0KGIpICAgIChpbnQpQklPX2N0cmwoYixCSU9fQ19HRVRfUkVBRF9SRVFVRVNULDAsTlVMTCkKK3NpemVfdCBCSU9fY3RybF9nZXRfd3JpdGVfZ3VhcmFudGVlKEJJTyAqYik7CitzaXplX3QgQklPX2N0cmxfZ2V0X3JlYWRfcmVxdWVzdChCSU8gKmIpOworaW50IEJJT19jdHJsX3Jlc2V0X3JlYWRfcmVxdWVzdChCSU8gKmIpOworCisvKiBjdHJsIG1hY3JvcyBmb3IgZGdyYW0gKi8KKyNkZWZpbmUgQklPX2N0cmxfZGdyYW1fY29ubmVjdChiLHBlZXIpICBcCisgICAgICAgICAgICAgICAgICAgICAoaW50KUJJT19jdHJsKGIsQklPX0NUUkxfREdSQU1fQ09OTkVDVCwwLCAoY2hhciAqKXBlZXIpCisjZGVmaW5lIEJJT19jdHJsX3NldF9jb25uZWN0ZWQoYiwgc3RhdGUsIHBlZXIpIFwKKyAgICAgICAgIChpbnQpQklPX2N0cmwoYiwgQklPX0NUUkxfREdSQU1fU0VUX0NPTk5FQ1RFRCwgc3RhdGUsIChjaGFyICopcGVlcikKKyNkZWZpbmUgQklPX2RncmFtX3JlY3ZfdGltZWRvdXQoYikgXAorICAgICAgICAgKGludClCSU9fY3RybChiLCBCSU9fQ1RSTF9ER1JBTV9HRVRfUkVDVl9USU1FUl9FWFAsIDAsIE5VTEwpCisjZGVmaW5lIEJJT19kZ3JhbV9zZW5kX3RpbWVkb3V0KGIpIFwKKyAgICAgICAgIChpbnQpQklPX2N0cmwoYiwgQklPX0NUUkxfREdSQU1fR0VUX1NFTkRfVElNRVJfRVhQLCAwLCBOVUxMKQorI2RlZmluZSBCSU9fZGdyYW1fZ2V0X3BlZXIoYixwZWVyKSBcCisgICAgICAgICAoaW50KUJJT19jdHJsKGIsIEJJT19DVFJMX0RHUkFNX0dFVF9QRUVSLCAwLCAoY2hhciAqKXBlZXIpCisjZGVmaW5lIEJJT19kZ3JhbV9zZXRfcGVlcihiLHBlZXIpIFwKKyAgICAgICAgIChpbnQpQklPX2N0cmwoYiwgQklPX0NUUkxfREdSQU1fU0VUX1BFRVIsIDAsIChjaGFyICopcGVlcikKKworLyogVGhlc2UgdHdvIGFyZW4ndCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKi8KKy8qIGludCBCSU9fZ2V0X2V4X251bShCSU8gKmJpbyk7ICovCisvKiB2b2lkIEJJT19zZXRfZXhfZnJlZV9mdW5jKEJJTyAqYmlvLGludCBpZHgsdm9pZCAoKmNiKSgpKTsgKi8KK2ludCBCSU9fc2V0X2V4X2RhdGEoQklPICpiaW8saW50IGlkeCx2b2lkICpkYXRhKTsKK3ZvaWQgKkJJT19nZXRfZXhfZGF0YShCSU8gKmJpbyxpbnQgaWR4KTsKK2ludCBCSU9fZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCUNSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK3Vuc2lnbmVkIGxvbmcgQklPX251bWJlcl9yZWFkKEJJTyAqYmlvKTsKK3Vuc2lnbmVkIGxvbmcgQklPX251bWJlcl93cml0dGVuKEJJTyAqYmlvKTsKKworLyogRm9yIEJJT19mX2FzbjEoKSAqLworaW50IEJJT19hc24xX3NldF9wcmVmaXgoQklPICpiLCBhc24xX3BzX2Z1bmMgKnByZWZpeCwKKwkJCQkJYXNuMV9wc19mdW5jICpwcmVmaXhfZnJlZSk7CitpbnQgQklPX2FzbjFfZ2V0X3ByZWZpeChCSU8gKmIsIGFzbjFfcHNfZnVuYyAqKnBwcmVmaXgsCisJCQkJCWFzbjFfcHNfZnVuYyAqKnBwcmVmaXhfZnJlZSk7CitpbnQgQklPX2FzbjFfc2V0X3N1ZmZpeChCSU8gKmIsIGFzbjFfcHNfZnVuYyAqc3VmZml4LAorCQkJCQlhc24xX3BzX2Z1bmMgKnN1ZmZpeF9mcmVlKTsKK2ludCBCSU9fYXNuMV9nZXRfc3VmZml4KEJJTyAqYiwgYXNuMV9wc19mdW5jICoqcHN1ZmZpeCwKKwkJCQkJYXNuMV9wc19mdW5jICoqcHN1ZmZpeF9mcmVlKTsKKworIyBpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK0JJT19NRVRIT0QgKkJJT19zX2ZpbGUodm9pZCApOworQklPICpCSU9fbmV3X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm1vZGUpOworQklPICpCSU9fbmV3X2ZwKEZJTEUgKnN0cmVhbSwgaW50IGNsb3NlX2ZsYWcpOworIyBkZWZpbmUgQklPX3NfZmlsZV9pbnRlcm5hbAlCSU9fc19maWxlCisjIGVuZGlmCitCSU8gKglCSU9fbmV3KEJJT19NRVRIT0QgKnR5cGUpOworaW50CUJJT19zZXQoQklPICphLEJJT19NRVRIT0QgKnR5cGUpOworaW50CUJJT19mcmVlKEJJTyAqYSk7Cit2b2lkCUJJT192ZnJlZShCSU8gKmEpOworaW50CUJJT19yZWFkKEJJTyAqYiwgdm9pZCAqZGF0YSwgaW50IGxlbik7CitpbnQJQklPX2dldHMoQklPICpicCxjaGFyICpidWYsIGludCBzaXplKTsKK2ludAlCSU9fd3JpdGUoQklPICpiLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK2ludAlCSU9fcHV0cyhCSU8gKmJwLGNvbnN0IGNoYXIgKmJ1Zik7CitpbnQJQklPX2luZGVudChCSU8gKmIsaW50IGluZGVudCxpbnQgbWF4KTsKK2xvbmcJQklPX2N0cmwoQklPICpicCxpbnQgY21kLGxvbmcgbGFyZyx2b2lkICpwYXJnKTsKK2xvbmcgQklPX2NhbGxiYWNrX2N0cmwoQklPICpiLCBpbnQgY21kLCB2b2lkICgqZnApKHN0cnVjdCBiaW9fc3QgKiwgaW50LCBjb25zdCBjaGFyICosIGludCwgbG9uZywgbG9uZykpOworY2hhciAqCUJJT19wdHJfY3RybChCSU8gKmJwLGludCBjbWQsbG9uZyBsYXJnKTsKK2xvbmcJQklPX2ludF9jdHJsKEJJTyAqYnAsaW50IGNtZCxsb25nIGxhcmcsaW50IGlhcmcpOworQklPICoJQklPX3B1c2goQklPICpiLEJJTyAqYXBwZW5kKTsKK0JJTyAqCUJJT19wb3AoQklPICpiKTsKK3ZvaWQJQklPX2ZyZWVfYWxsKEJJTyAqYSk7CitCSU8gKglCSU9fZmluZF90eXBlKEJJTyAqYixpbnQgYmlvX3R5cGUpOworQklPICoJQklPX25leHQoQklPICpiKTsKK0JJTyAqCUJJT19nZXRfcmV0cnlfQklPKEJJTyAqYmlvLCBpbnQgKnJlYXNvbik7CitpbnQJQklPX2dldF9yZXRyeV9yZWFzb24oQklPICpiaW8pOworQklPICoJQklPX2R1cF9jaGFpbihCSU8gKmluKTsKKworaW50IEJJT19ucmVhZDAoQklPICpiaW8sIGNoYXIgKipidWYpOworaW50IEJJT19ucmVhZChCSU8gKmJpbywgY2hhciAqKmJ1ZiwgaW50IG51bSk7CitpbnQgQklPX253cml0ZTAoQklPICpiaW8sIGNoYXIgKipidWYpOworaW50IEJJT19ud3JpdGUoQklPICpiaW8sIGNoYXIgKipidWYsIGludCBudW0pOworCitsb25nIEJJT19kZWJ1Z19jYWxsYmFjayhCSU8gKmJpbyxpbnQgY21kLGNvbnN0IGNoYXIgKmFyZ3AsaW50IGFyZ2ksCisJbG9uZyBhcmdsLGxvbmcgcmV0KTsKKworQklPX01FVEhPRCAqQklPX3NfbWVtKHZvaWQpOworQklPICpCSU9fbmV3X21lbV9idWYodm9pZCAqYnVmLCBpbnQgbGVuKTsKK0JJT19NRVRIT0QgKkJJT19zX3NvY2tldCh2b2lkKTsKK0JJT19NRVRIT0QgKkJJT19zX2Nvbm5lY3Qodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fc19hY2NlcHQodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fc19mZCh2b2lkKTsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfT1MyCitCSU9fTUVUSE9EICpCSU9fc19sb2codm9pZCk7CisjZW5kaWYKK0JJT19NRVRIT0QgKkJJT19zX2Jpbyh2b2lkKTsKK0JJT19NRVRIT0QgKkJJT19zX251bGwodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fZl9udWxsKHZvaWQpOworQklPX01FVEhPRCAqQklPX2ZfYnVmZmVyKHZvaWQpOworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworQklPX01FVEhPRCAqQklPX2ZfbGluZWJ1ZmZlcih2b2lkKTsKKyNlbmRpZgorQklPX01FVEhPRCAqQklPX2ZfbmJpb190ZXN0KHZvaWQpOworI2lmbmRlZiBPUEVOU1NMX05PX0RHUkFNCitCSU9fTUVUSE9EICpCSU9fc19kYXRhZ3JhbSh2b2lkKTsKKyNlbmRpZgorCisvKiBCSU9fTUVUSE9EICpCSU9fZl9iZXIodm9pZCk7ICovCisKK2ludCBCSU9fc29ja19zaG91bGRfcmV0cnkoaW50IGkpOworaW50IEJJT19zb2NrX25vbl9mYXRhbF9lcnJvcihpbnQgZXJyb3IpOworaW50IEJJT19kZ3JhbV9ub25fZmF0YWxfZXJyb3IoaW50IGVycm9yKTsKKworaW50IEJJT19mZF9zaG91bGRfcmV0cnkoaW50IGkpOworaW50IEJJT19mZF9ub25fZmF0YWxfZXJyb3IoaW50IGVycm9yKTsKK2ludCBCSU9fZHVtcF9jYihpbnQgKCpjYikoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgdm9pZCAqdSksCisJCXZvaWQgKnUsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4pOworaW50IEJJT19kdW1wX2luZGVudF9jYihpbnQgKCpjYikoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwgdm9pZCAqdSksCisJCSAgICAgICB2b2lkICp1LCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaW5kZW50KTsKK2ludCBCSU9fZHVtcChCSU8gKmIsY29uc3QgY2hhciAqYnl0ZXMsaW50IGxlbik7CitpbnQgQklPX2R1bXBfaW5kZW50KEJJTyAqYixjb25zdCBjaGFyICpieXRlcyxpbnQgbGVuLGludCBpbmRlbnQpOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IEJJT19kdW1wX2ZwKEZJTEUgKmZwLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuKTsKK2ludCBCSU9fZHVtcF9pbmRlbnRfZnAoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4sIGludCBpbmRlbnQpOworI2VuZGlmCitzdHJ1Y3QgaG9zdGVudCAqQklPX2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSk7CisvKiBXZSBtaWdodCB3YW50IGEgdGhyZWFkLXNhZmUgaW50ZXJmYWNlIHRvbzoKKyAqIHN0cnVjdCBob3N0ZW50ICpCSU9fZ2V0aG9zdGJ5bmFtZV9yKGNvbnN0IGNoYXIgKm5hbWUsCisgKiAgICAgc3RydWN0IGhvc3RlbnQgKnJlc3VsdCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmbGVuKTsKKyAqIG9yIHNvbWV0aGluZyBzaW1pbGFyIChjYWxsZXIgYWxsb2NhdGVzIGEgc3RydWN0IGhvc3RlbnQsCisgKiBwb2ludGVkIHRvIGJ5ICJyZXN1bHQiLCBhbmQgYWRkaXRpb25hbCBidWZmZXIgc3BhY2UgZm9yIHRoZSB2YXJpb3VzCisgKiBzdWJzdHJ1Y3R1cmVzOyBpZiB0aGUgYnVmZmVyIGRvZXMgbm90IHN1ZmZpY2UsIE5VTEwgaXMgcmV0dXJuZWQKKyAqIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIGlzIHNldCkuCisgKi8KK2ludCBCSU9fc29ja19lcnJvcihpbnQgc29jayk7CitpbnQgQklPX3NvY2tldF9pb2N0bChpbnQgZmQsIGxvbmcgdHlwZSwgdm9pZCAqYXJnKTsKK2ludCBCSU9fc29ja2V0X25iaW8oaW50IGZkLGludCBtb2RlKTsKK2ludCBCSU9fZ2V0X3BvcnQoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBzaG9ydCAqcG9ydF9wdHIpOworaW50IEJJT19nZXRfaG9zdF9pcChjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGNoYXIgKmlwKTsKK2ludCBCSU9fZ2V0X2FjY2VwdF9zb2NrZXQoY2hhciAqaG9zdF9wb3J0LGludCBtb2RlKTsKK2ludCBCSU9fYWNjZXB0KGludCBzb2NrLGNoYXIgKippcF9wb3J0KTsKK2ludCBCSU9fc29ja19pbml0KHZvaWQgKTsKK3ZvaWQgQklPX3NvY2tfY2xlYW51cCh2b2lkKTsKK2ludCBCSU9fc2V0X3RjcF9uZGVsYXkoaW50IHNvY2ssaW50IHR1cm5fb24pOworCitCSU8gKkJJT19uZXdfc29ja2V0KGludCBzb2NrLCBpbnQgY2xvc2VfZmxhZyk7CitCSU8gKkJJT19uZXdfZGdyYW0oaW50IGZkLCBpbnQgY2xvc2VfZmxhZyk7CitCSU8gKkJJT19uZXdfZmQoaW50IGZkLCBpbnQgY2xvc2VfZmxhZyk7CitCSU8gKkJJT19uZXdfY29ubmVjdChjaGFyICpob3N0X3BvcnQpOworQklPICpCSU9fbmV3X2FjY2VwdChjaGFyICpob3N0X3BvcnQpOworCitpbnQgQklPX25ld19iaW9fcGFpcihCSU8gKipiaW8xLCBzaXplX3Qgd3JpdGVidWYxLAorCUJJTyAqKmJpbzIsIHNpemVfdCB3cml0ZWJ1ZjIpOworLyogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyAxIGFuZCBpbiAqYmlvMSwgKmJpbzIgdHdvIEJJTyBwYWlyIGVuZHBvaW50cy4KKyAqIE90aGVyd2lzZSByZXR1cm5zIDAgYW5kIHNldHMgKmJpbzEgYW5kICpiaW8yIHRvIE5VTEwuCisgKiBTaXplIDAgdXNlcyBkZWZhdWx0IHZhbHVlLgorICovCisKK3ZvaWQgQklPX2NvcHlfbmV4dF9yZXRyeShCSU8gKmIpOworCisvKmxvbmcgQklPX2doYm5fY3RybChpbnQgY21kLGludCBpYXJnLGNoYXIgKnBhcmcpOyovCisKKyNpZmRlZiBfX0dOVUNfXworIyAgZGVmaW5lIF9fYmlvX2hfX2F0dHJfXyBfX2F0dHJpYnV0ZV9fCisjZWxzZQorIyAgZGVmaW5lIF9fYmlvX2hfX2F0dHJfXyh4KQorI2VuZGlmCitpbnQgQklPX3ByaW50ZihCSU8gKmJpbywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJX19iaW9faF9fYXR0cl9fKChfX2Zvcm1hdF9fKF9fcHJpbnRmX18sMiwzKSkpOworaW50IEJJT192cHJpbnRmKEJJTyAqYmlvLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKKwlfX2Jpb19oX19hdHRyX18oKF9fZm9ybWF0X18oX19wcmludGZfXywyLDApKSk7CitpbnQgQklPX3NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCV9fYmlvX2hfX2F0dHJfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLDMsNCkpKTsKK2ludCBCSU9fdnNucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcmdzKQorCV9fYmlvX2hfX2F0dHJfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLDMsMCkpKTsKKyN1bmRlZiBfX2Jpb19oX19hdHRyX18KKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9CSU9fc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBCSU8gZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQklPX0ZfQUNQVF9TVEFURQkJCQkgMTAwCisjZGVmaW5lIEJJT19GX0JJT19BQ0NFUFQJCQkJIDEwMQorI2RlZmluZSBCSU9fRl9CSU9fQkVSX0dFVF9IRUFERVIJCQkgMTAyCisjZGVmaW5lIEJJT19GX0JJT19DQUxMQkFDS19DVFJMCQkJCSAxMzEKKyNkZWZpbmUgQklPX0ZfQklPX0NUUkwJCQkJCSAxMDMKKyNkZWZpbmUgQklPX0ZfQklPX0dFVEhPU1RCWU5BTUUJCQkJIDEyMAorI2RlZmluZSBCSU9fRl9CSU9fR0VUUwkJCQkJIDEwNAorI2RlZmluZSBCSU9fRl9CSU9fR0VUX0FDQ0VQVF9TT0NLRVQJCQkgMTA1CisjZGVmaW5lIEJJT19GX0JJT19HRVRfSE9TVF9JUAkJCQkgMTA2CisjZGVmaW5lIEJJT19GX0JJT19HRVRfUE9SVAkJCQkgMTA3CisjZGVmaW5lIEJJT19GX0JJT19NQUtFX1BBSVIJCQkJIDEyMQorI2RlZmluZSBCSU9fRl9CSU9fTkVXCQkJCQkgMTA4CisjZGVmaW5lIEJJT19GX0JJT19ORVdfRklMRQkJCQkgMTA5CisjZGVmaW5lIEJJT19GX0JJT19ORVdfTUVNX0JVRgkJCQkgMTI2CisjZGVmaW5lIEJJT19GX0JJT19OUkVBRAkJCQkJIDEyMworI2RlZmluZSBCSU9fRl9CSU9fTlJFQUQwCQkJCSAxMjQKKyNkZWZpbmUgQklPX0ZfQklPX05XUklURQkJCQkgMTI1CisjZGVmaW5lIEJJT19GX0JJT19OV1JJVEUwCQkJCSAxMjIKKyNkZWZpbmUgQklPX0ZfQklPX1BVVFMJCQkJCSAxMTAKKyNkZWZpbmUgQklPX0ZfQklPX1JFQUQJCQkJCSAxMTEKKyNkZWZpbmUgQklPX0ZfQklPX1NPQ0tfSU5JVAkJCQkgMTEyCisjZGVmaW5lIEJJT19GX0JJT19XUklURQkJCQkJIDExMworI2RlZmluZSBCSU9fRl9CVUZGRVJfQ1RSTAkJCQkgMTE0CisjZGVmaW5lIEJJT19GX0NPTk5fQ1RSTAkJCQkJIDEyNworI2RlZmluZSBCSU9fRl9DT05OX1NUQVRFCQkJCSAxMTUKKyNkZWZpbmUgQklPX0ZfRklMRV9DVFJMCQkJCQkgMTE2CisjZGVmaW5lIEJJT19GX0ZJTEVfUkVBRAkJCQkJIDEzMAorI2RlZmluZSBCSU9fRl9MSU5FQlVGRkVSX0NUUkwJCQkJIDEyOQorI2RlZmluZSBCSU9fRl9NRU1fUkVBRAkJCQkJIDEyOAorI2RlZmluZSBCSU9fRl9NRU1fV1JJVEUJCQkJCSAxMTcKKyNkZWZpbmUgQklPX0ZfU1NMX05FVwkJCQkJIDExOAorI2RlZmluZSBCSU9fRl9XU0FTVEFSVFVQCQkJCSAxMTkKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBCSU9fUl9BQ0NFUFRfRVJST1IJCQkJIDEwMAorI2RlZmluZSBCSU9fUl9CQURfRk9QRU5fTU9ERQkJCQkgMTAxCisjZGVmaW5lIEJJT19SX0JBRF9IT1NUTkFNRV9MT09LVVAJCQkgMTAyCisjZGVmaW5lIEJJT19SX0JST0tFTl9QSVBFCQkJCSAxMjQKKyNkZWZpbmUgQklPX1JfQ09OTkVDVF9FUlJPUgkJCQkgMTAzCisjZGVmaW5lIEJJT19SX0VPRl9PTl9NRU1PUllfQklPCQkJCSAxMjcKKyNkZWZpbmUgQklPX1JfRVJST1JfU0VUVElOR19OQklPCQkJIDEwNAorI2RlZmluZSBCSU9fUl9FUlJPUl9TRVRUSU5HX05CSU9fT05fQUNDRVBURURfU09DS0VUCSAxMDUKKyNkZWZpbmUgQklPX1JfRVJST1JfU0VUVElOR19OQklPX09OX0FDQ0VQVF9TT0NLRVQJIDEwNgorI2RlZmluZSBCSU9fUl9HRVRIT1NUQllOQU1FX0FERFJfSVNfTk9UX0FGX0lORVQJCSAxMDcKKyNkZWZpbmUgQklPX1JfSU5WQUxJRF9BUkdVTUVOVAkJCQkgMTI1CisjZGVmaW5lIEJJT19SX0lOVkFMSURfSVBfQUREUkVTUwkJCSAxMDgKKyNkZWZpbmUgQklPX1JfSU5fVVNFCQkJCQkgMTIzCisjZGVmaW5lIEJJT19SX0tFRVBBTElWRQkJCQkJIDEwOQorI2RlZmluZSBCSU9fUl9OQklPX0NPTk5FQ1RfRVJST1IJCQkgMTEwCisjZGVmaW5lIEJJT19SX05PX0FDQ0VQVF9QT1JUX1NQRUNJRklFRAkJCSAxMTEKKyNkZWZpbmUgQklPX1JfTk9fSE9TVE5BTUVfU1BFQ0lGSUVECQkJIDExMgorI2RlZmluZSBCSU9fUl9OT19QT1JUX0RFRklORUQJCQkJIDExMworI2RlZmluZSBCSU9fUl9OT19QT1JUX1NQRUNJRklFRAkJCQkgMTE0CisjZGVmaW5lIEJJT19SX05PX1NVQ0hfRklMRQkJCQkgMTI4CisjZGVmaW5lIEJJT19SX05VTExfUEFSQU1FVEVSCQkJCSAxMTUKKyNkZWZpbmUgQklPX1JfVEFHX01JU01BVENICQkJCSAxMTYKKyNkZWZpbmUgQklPX1JfVU5BQkxFX1RPX0JJTkRfU09DS0VUCQkJIDExNworI2RlZmluZSBCSU9fUl9VTkFCTEVfVE9fQ1JFQVRFX1NPQ0tFVAkJCSAxMTgKKyNkZWZpbmUgQklPX1JfVU5BQkxFX1RPX0xJU1RFTl9TT0NLRVQJCQkgMTE5CisjZGVmaW5lIEJJT19SX1VOSU5JVElBTElaRUQJCQkJIDEyMAorI2RlZmluZSBCSU9fUl9VTlNVUFBPUlRFRF9NRVRIT0QJCQkgMTIxCisjZGVmaW5lIEJJT19SX1dSSVRFX1RPX1JFQURfT05MWV9CSU8JCQkgMTI2CisjZGVmaW5lIEJJT19SX1dTQVNUQVJUVVAJCQkJIDEyMgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2Jsb3dmaXNoLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYmxvd2Zpc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTdlNzZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2Jsb3dmaXNoLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qIGNyeXB0by9iZi9ibG93ZmlzaC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX0JMT1dGSVNIX0gKKyNkZWZpbmUgSEVBREVSX0JMT1dGSVNIX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfTk9fQkYKKyNlcnJvciBCRiBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjZGVmaW5lIEJGX0VOQ1JZUFQJMQorI2RlZmluZSBCRl9ERUNSWVBUCTAKKworLyoKKyAqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqICEgQkZfTE9ORyBoYXMgdG8gYmUgYXQgbGVhc3QgMzIgYml0cyB3aWRlLiBJZiBpdCdzIHdpZGVyLCB0aGVuICEKKyAqICEgQkZfTE9OR19MT0cyIGhhcyB0byBiZSBkZWZpbmVkIGFsb25nLiAgICAgICAgICAgICAgICAgICAgICAgICEKKyAqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqLworCisjaWYgZGVmaW5lZChfX0xQMzJfXykKKyNkZWZpbmUgQkZfTE9ORyB1bnNpZ25lZCBsb25nCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0NSQVkpIHx8IGRlZmluZWQoX19JTFA2NF9fKQorI2RlZmluZSBCRl9MT05HIHVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgQkZfTE9OR19MT0cyIDMKKy8qCisgKiBfQ1JBWSBub3RlLiBJIGNvdWxkIGRlY2xhcmUgc2hvcnQsIGJ1dCBJIGhhdmUgbm8gaWRlYSB3aGF0IGltcGFjdAorICogZG9lcyBpdCBoYXZlIG9uIHBlcmZvcm1hbmNlIG9uIG5vbmUtVDNFIG1hY2hpbmVzLiBJIGNvdWxkIGRlY2xhcmUKKyAqIGludCwgYnV0IGF0IGxlYXN0IG9uIEM5MCBzaXplb2YoaW50KSBjYW4gYmUgY2hvc2VuIGF0IGNvbXBpbGUgdGltZS4KKyAqIFNvIEkndmUgY2hvc2VuIGxvbmcuLi4KKyAqCQkJCQk8YXBwcm9AZnkuY2hhbG1lcnMuc2U+CisgKi8KKyNlbHNlCisjZGVmaW5lIEJGX0xPTkcgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSBCRl9ST1VORFMJMTYKKyNkZWZpbmUgQkZfQkxPQ0sJOAorCit0eXBlZGVmIHN0cnVjdCBiZl9rZXlfc3QKKwl7CisJQkZfTE9ORyBQW0JGX1JPVU5EUysyXTsKKwlCRl9MT05HIFNbNCoyNTZdOworCX0gQkZfS0VZOworCisgCit2b2lkIEJGX3NldF9rZXkoQkZfS0VZICprZXksIGludCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpOworCit2b2lkIEJGX2VuY3J5cHQoQkZfTE9ORyAqZGF0YSxjb25zdCBCRl9LRVkgKmtleSk7Cit2b2lkIEJGX2RlY3J5cHQoQkZfTE9ORyAqZGF0YSxjb25zdCBCRl9LRVkgKmtleSk7CisKK3ZvaWQgQkZfZWNiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwljb25zdCBCRl9LRVkgKmtleSwgaW50IGVuYyk7Cit2b2lkIEJGX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCWNvbnN0IEJGX0tFWSAqc2NoZWR1bGUsIHVuc2lnbmVkIGNoYXIgKml2ZWMsIGludCBlbmMpOwordm9pZCBCRl9jZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCWNvbnN0IEJGX0tFWSAqc2NoZWR1bGUsIHVuc2lnbmVkIGNoYXIgKml2ZWMsIGludCAqbnVtLCBpbnQgZW5jKTsKK3ZvaWQgQkZfb2ZiNjRfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwljb25zdCBCRl9LRVkgKnNjaGVkdWxlLCB1bnNpZ25lZCBjaGFyICppdmVjLCBpbnQgKm51bSk7Citjb25zdCBjaGFyICpCRl9vcHRpb25zKHZvaWQpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYm4uaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9ibi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ODRiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYm4uaApAQCAtMCwwICsxLDg1OCBAQAorLyogY3J5cHRvL2JuL2JuLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIEVyaWMgWW91bmcgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMgc29mdHdhcmUgaXMgb3JpZ2luYWxseSB3cml0dGVuIGJ5IAorICogU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhIG9mIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9CTl9ICisjZGVmaW5lIEhFQURFUl9CTl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisjaW5jbHVkZSA8c3RkaW8uaD4gLyogRklMRSAqLworI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFRoZXNlIHByZXByb2Nlc3NvciBzeW1ib2xzIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBiaWdudW0gaGVhZGVycyBhbmQKKyAqIGxpYnJhcnkgY29kZS4gVGhleSdyZSBub3QgZGVmaW5lZCBieSBhbnkgIm5vcm1hbCIgY29uZmlndXJhdGlvbiwgYXMgdGhleSBhcmUKKyAqIGludGVuZGVkIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyBwdXJwb3Nlcy4gTkI6IGRlZmluaW5nIGFsbCB0aHJlZSBjYW4gYmUKKyAqIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFwcGxpY2F0aW9uIGNvZGUgYXMgd2VsbCBhcyBvcGVuc3NsIGl0c2VsZi4KKyAqCisgKiBCTl9ERUJVRyAtIHR1cm4gb24gdmFyaW91cyBkZWJ1Z2dpbmcgYWx0ZXJhdGlvbnMgdG8gdGhlIGJpZ251bSBjb2RlCisgKiBCTl9ERUJVR19SQU5EIC0gdXNlcyByYW5kb20gcG9pc29uaW5nIG9mIHVudXNlZCB3b3JkcyB0byB0cmlwIHVwCisgKiBtaXNtYW5hZ2VtZW50IG9mIGJpZ251bSBpbnRlcm5hbHMuIFlvdSBtdXN0IGFsc28gZGVmaW5lIEJOX0RFQlVHLgorICovCisvKiAjZGVmaW5lIEJOX0RFQlVHICovCisvKiAjZGVmaW5lIEJOX0RFQlVHX1JBTkQgKi8KKworI2lmbmRlZiBPUEVOU1NMX1NNQUxMX0ZPT1RQUklOVAorI2RlZmluZSBCTl9NVUxfQ09NQkEKKyNkZWZpbmUgQk5fU1FSX0NPTUJBCisjZGVmaW5lIEJOX1JFQ1VSU0lPTgorI2VuZGlmCisKKy8qIFRoaXMgbmV4dCBvcHRpb24gdXNlcyB0aGUgQyBsaWJyYXJpZXMgKDIgd29yZCkvKDEgd29yZCkgZnVuY3Rpb24uCisgKiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgSSB1c2UgbXkgQyB2ZXJzaW9uICh3aGljaCBpcyBzbG93ZXIpLgorICogVGhlIHJlYXNvbiBmb3IgdGhpcyBmbGFnIGlzIHRoYXQgd2hlbiB0aGUgcGFydGljdWxhciBDIGNvbXBpbGVyCisgKiBsaWJyYXJ5IHJvdXRpbmUgaXMgdXNlZCwgYW5kIHRoZSBsaWJyYXJ5IGlzIGxpbmtlZCB3aXRoIGEgZGlmZmVyZW50CisgKiBjb21waWxlciwgdGhlIGxpYnJhcnkgaXMgbWlzc2luZy4gIFRoaXMgbW9zdGx5IGhhcHBlbnMgd2hlbiB0aGUKKyAqIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCBnY2MgYW5kIHRoZW4gbGlua2VkIHVzaW5nIG5vcm1hbCBjYy4gIFRoaXMgd291bGQKKyAqIGJlIGEgY29tbW9uIG9jY3VycmVuY2UgYmVjYXVzZSBnY2Mgbm9ybWFsbHkgcHJvZHVjZXMgY29kZSB0aGF0IGlzCisgKiAyIHRpbWVzIGZhc3RlciB0aGFuIHN5c3RlbSBjb21waWxlcnMgZm9yIHRoZSBiaWcgbnVtYmVyIHN0dWZmLgorICogRm9yIG1hY2hpbmVzIHdpdGggb25seSBvbmUgY29tcGlsZXIgKG9yIHNoYXJlZCBsaWJyYXJpZXMpLCB0aGlzIHNob3VsZAorICogYmUgb24uICBBZ2FpbiB0aGlzIGluIG9ubHkgcmVhbGx5IGEgcHJvYmxlbSBvbiBtYWNoaW5lcworICogdXNpbmcgImxvbmcgbG9uZydzIiwgYXJlIDMyYml0LCBhbmQgYXJlIG5vdCB1c2luZyBteSBhc3NlbWJsZXIgY29kZS4gKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpIHx8IFwKKyAgICBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKSB8fCBkZWZpbmVkKGxpbnV4KQorIyBpZm5kZWYgQk5fRElWMlcKKyMgIGRlZmluZSBCTl9ESVYyVworIyBlbmRpZgorI2VuZGlmCisKKy8qIGFzc3VtaW5nIGxvbmcgaXMgNjRiaXQgLSB0aGlzIGlzIHRoZSBERUMgQWxwaGEKKyAqIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyBvbmx5IDY0IGJpdHMgOi0oLCBkb24ndCBkZWZpbmUKKyAqIEJOX0xMT05HIGZvciB0aGUgREVDIEFscGhhICovCisjaWZkZWYgU0lYVFlfRk9VUl9CSVRfTE9ORworI2RlZmluZSBCTl9VTExPTkcJdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIEJOX1VMT05HCXVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgQk5fTE9ORwkJbG9uZworI2RlZmluZSBCTl9CSVRTCQkxMjgKKyNkZWZpbmUgQk5fQllURVMJOAorI2RlZmluZSBCTl9CSVRTMgk2NAorI2RlZmluZSBCTl9CSVRTNAkzMgorI2RlZmluZSBCTl9NQVNLCQkoMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkxMKQorI2RlZmluZSBCTl9NQVNLMgkoMHhmZmZmZmZmZmZmZmZmZmZmTCkKKyNkZWZpbmUgQk5fTUFTSzJsCSgweGZmZmZmZmZmTCkKKyNkZWZpbmUgQk5fTUFTSzJoCSgweGZmZmZmZmZmMDAwMDAwMDBMKQorI2RlZmluZSBCTl9NQVNLMmgxCSgweGZmZmZmZmZmODAwMDAwMDBMKQorI2RlZmluZSBCTl9UQklUCQkoMHg4MDAwMDAwMDAwMDAwMDAwTCkKKyNkZWZpbmUgQk5fREVDX0NPTlYJKDEwMDAwMDAwMDAwMDAwMDAwMDAwVUwpCisjZGVmaW5lIEJOX0RFQ19GTVQxCSIlbHUiCisjZGVmaW5lIEJOX0RFQ19GTVQyCSIlMDE5bHUiCisjZGVmaW5lIEJOX0RFQ19OVU0JMTkKKyNkZWZpbmUgQk5fSEVYX0ZNVDEJIiVsWCIKKyNkZWZpbmUgQk5fSEVYX0ZNVDIJIiUwMTZsWCIKKyNlbmRpZgorCisvKiBUaGlzIGlzIHdoZXJlIHRoZSBsb25nIGxvbmcgZGF0YSB0eXBlIGlzIDY0IGJpdHMsIGJ1dCBsb25nIGlzIDMyLgorICogRm9yIG1hY2hpbmVzIHdoZXJlIHRoZXJlIGFyZSA2NGJpdCByZWdpc3RlcnMsIHRoaXMgaXMgdGhlIG1vZGUgdG8gdXNlLgorICogSVJJWCwgb24gUjQwMDAgYW5kIGFib3ZlIHNob3VsZCB1c2UgdGhpcyBtb2RlLCBhbG9uZyB3aXRoIHRoZSByZWxldmFudAorICogYXNzZW1ibGVyIGNvZGUgOi0pLiAgRG8gTk9UIGRlZmluZSBCTl9MTE9ORy4KKyAqLworI2lmZGVmIFNJWFRZX0ZPVVJfQklUCisjdW5kZWYgQk5fTExPTkcKKyN1bmRlZiBCTl9VTExPTkcKKyNkZWZpbmUgQk5fVUxPTkcJdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIEJOX0xPTkcJCWxvbmcgbG9uZworI2RlZmluZSBCTl9CSVRTCQkxMjgKKyNkZWZpbmUgQk5fQllURVMJOAorI2RlZmluZSBCTl9CSVRTMgk2NAorI2RlZmluZSBCTl9CSVRTNAkzMgorI2RlZmluZSBCTl9NQVNLMgkoMHhmZmZmZmZmZmZmZmZmZmZmTEwpCisjZGVmaW5lIEJOX01BU0sybAkoMHhmZmZmZmZmZkwpCisjZGVmaW5lIEJOX01BU0syaAkoMHhmZmZmZmZmZjAwMDAwMDAwTEwpCisjZGVmaW5lIEJOX01BU0syaDEJKDB4ZmZmZmZmZmY4MDAwMDAwMExMKQorI2RlZmluZSBCTl9UQklUCQkoMHg4MDAwMDAwMDAwMDAwMDAwTEwpCisjZGVmaW5lIEJOX0RFQ19DT05WCSgxMDAwMDAwMDAwMDAwMDAwMDAwMFVMTCkKKyNkZWZpbmUgQk5fREVDX0ZNVDEJIiVsbHUiCisjZGVmaW5lIEJOX0RFQ19GTVQyCSIlMDE5bGx1IgorI2RlZmluZSBCTl9ERUNfTlVNCTE5CisjZGVmaW5lIEJOX0hFWF9GTVQxCSIlbGxYIgorI2RlZmluZSBCTl9IRVhfRk1UMgkiJTAxNmxsWCIKKyNlbmRpZgorCisjaWZkZWYgVEhJUlRZX1RXT19CSVQKKyNpZmRlZiBCTl9MTE9ORworIyBpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19HTlVDX18pCisjICBkZWZpbmUgQk5fVUxMT05HCXVuc2lnbmVkIF9faW50NjQKKyMgIGRlZmluZSBCTl9NQVNLCSgweGZmZmZmZmZmZmZmZmZmZmZJNjQpCisjIGVsc2UKKyMgIGRlZmluZSBCTl9VTExPTkcJdW5zaWduZWQgbG9uZyBsb25nCisjICBkZWZpbmUgQk5fTUFTSwkoMHhmZmZmZmZmZmZmZmZmZmZmTEwpCisjIGVuZGlmCisjZW5kaWYKKyNkZWZpbmUgQk5fVUxPTkcJdW5zaWduZWQgaW50CisjZGVmaW5lIEJOX0xPTkcJCWludAorI2RlZmluZSBCTl9CSVRTCQk2NAorI2RlZmluZSBCTl9CWVRFUwk0CisjZGVmaW5lIEJOX0JJVFMyCTMyCisjZGVmaW5lIEJOX0JJVFM0CTE2CisjZGVmaW5lIEJOX01BU0syCSgweGZmZmZmZmZmTCkKKyNkZWZpbmUgQk5fTUFTSzJsCSgweGZmZmYpCisjZGVmaW5lIEJOX01BU0syaDEJKDB4ZmZmZjgwMDBMKQorI2RlZmluZSBCTl9NQVNLMmgJKDB4ZmZmZjAwMDBMKQorI2RlZmluZSBCTl9UQklUCQkoMHg4MDAwMDAwMEwpCisjZGVmaW5lIEJOX0RFQ19DT05WCSgxMDAwMDAwMDAwTCkKKyNkZWZpbmUgQk5fREVDX0ZNVDEJIiV1IgorI2RlZmluZSBCTl9ERUNfRk1UMgkiJTA5dSIKKyNkZWZpbmUgQk5fREVDX05VTQk5CisjZGVmaW5lIEJOX0hFWF9GTVQxCSIlWCIKKyNkZWZpbmUgQk5fSEVYX0ZNVDIJIiUwOFgiCisjZW5kaWYKKworI2RlZmluZSBCTl9ERUZBVUxUX0JJVFMJMTI4MAorCisjZGVmaW5lIEJOX0ZMR19NQUxMT0NFRAkJMHgwMQorI2RlZmluZSBCTl9GTEdfU1RBVElDX0RBVEEJMHgwMgorI2RlZmluZSBCTl9GTEdfQ09OU1RUSU1FCTB4MDQgLyogYXZvaWQgbGVha2luZyBleHBvbmVudCBpbmZvcm1hdGlvbiB0aHJvdWdoIHRpbWluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCTl9tb2RfZXhwX21vbnQoKSB3aWxsIGNhbGwgQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCTl9kaXYoKSB3aWxsIGNhbGwgQk5fZGl2X25vX2JyYW5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBCTl9tb2RfaW52ZXJzZSgpIHdpbGwgY2FsbCBCTl9tb2RfaW52ZXJzZV9ub19icmFuY2guCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjZGVmaW5lIEJOX0ZMR19FWFBfQ09OU1RUSU1FIEJOX0ZMR19DT05TVFRJTUUgLyogZGVwcmVjYXRlZCBuYW1lIGZvciB0aGUgZmxhZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhdm9pZCBsZWFraW5nIGV4cG9uZW50IGluZm9ybWF0aW9uIHRocm91Z2ggdGltaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChCTl9tb2RfZXhwX21vbnQoKSB3aWxsIGNhbGwgQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSkgKi8KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2RlZmluZSBCTl9GTEdfRlJFRQkJMHg4MDAwCS8qIHVzZWQgZm9yIGRlYnVnaW5nICovCisjZW5kaWYKKyNkZWZpbmUgQk5fc2V0X2ZsYWdzKGIsbikJKChiKS0+ZmxhZ3N8PShuKSkKKyNkZWZpbmUgQk5fZ2V0X2ZsYWdzKGIsbikJKChiKS0+ZmxhZ3MmKG4pKQorCisvKiBnZXQgYSBjbG9uZSBvZiBhIEJJR05VTSB3aXRoIGNoYW5nZWQgZmxhZ3MsIGZvciAqdGVtcG9yYXJ5KiB1c2Ugb25seQorICogKHRoZSB0d28gQklHTlVNcyBjYW5ub3Qgbm90IGJlIHVzZWQgaW4gcGFyYWxsZWwhKSAqLworI2RlZmluZSBCTl93aXRoX2ZsYWdzKGRlc3QsYixuKSAgKChkZXN0KS0+ZD0oYiktPmQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzdCktPnRvcD0oYiktPnRvcCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXN0KS0+ZG1heD0oYiktPmRtYXgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzdCktPm5lZz0oYiktPm5lZywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXN0KS0+ZmxhZ3M9KCgoZGVzdCktPmZsYWdzICYgQk5fRkxHX01BTExPQ0VEKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgKChiKS0+ZmxhZ3MgJiB+Qk5fRkxHX01BTExPQ0VEKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgQk5fRkxHX1NUQVRJQ19EQVRBIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAobikpKQorCisvKiBBbHJlYWR5IGRlY2xhcmVkIGluIG9zc2xfdHlwLmggKi8KKyNpZiAwCit0eXBlZGVmIHN0cnVjdCBiaWdudW1fc3QgQklHTlVNOworLyogVXNlZCBmb3IgdGVtcCB2YXJpYWJsZXMgKGRlY2xhcmF0aW9uIGhpZGRlbiBpbiBibl9sY2wuaCkgKi8KK3R5cGVkZWYgc3RydWN0IGJpZ251bV9jdHggQk5fQ1RYOwordHlwZWRlZiBzdHJ1Y3QgYm5fYmxpbmRpbmdfc3QgQk5fQkxJTkRJTkc7Cit0eXBlZGVmIHN0cnVjdCBibl9tb250X2N0eF9zdCBCTl9NT05UX0NUWDsKK3R5cGVkZWYgc3RydWN0IGJuX3JlY3BfY3R4X3N0IEJOX1JFQ1BfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgYm5fZ2VuY2Jfc3QgQk5fR0VOQ0I7CisjZW5kaWYKKworc3RydWN0IGJpZ251bV9zdAorCXsKKwlCTl9VTE9ORyAqZDsJLyogUG9pbnRlciB0byBhbiBhcnJheSBvZiAnQk5fQklUUzInIGJpdCBjaHVua3MuICovCisJaW50IHRvcDsJLyogSW5kZXggb2YgbGFzdCB1c2VkIGQgKzEuICovCisJLyogVGhlIG5leHQgYXJlIGludGVybmFsIGJvb2sga2VlcGluZyBmb3IgYm5fZXhwYW5kLiAqLworCWludCBkbWF4OwkvKiBTaXplIG9mIHRoZSBkIGFycmF5LiAqLworCWludCBuZWc7CS8qIG9uZSBpZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlICovCisJaW50IGZsYWdzOworCX07CisKKy8qIFVzZWQgZm9yIG1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24gKi8KK3N0cnVjdCBibl9tb250X2N0eF9zdAorCXsKKwlpbnQgcmk7ICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiBSICovCisJQklHTlVNIFJSOyAgICAgLyogdXNlZCB0byBjb252ZXJ0IHRvIG1vbnRnb21lcnkgZm9ybSAqLworCUJJR05VTSBOOyAgICAgIC8qIFRoZSBtb2R1bHVzICovCisJQklHTlVNIE5pOyAgICAgLyogUiooMS9SIG1vZCBOKSAtIE4qTmkgPSAxCisJICAgICAgICAgICAgICAgICogKE5pIGlzIG9ubHkgc3RvcmVkIGZvciBiaWdudW0gYWxnb3JpdGhtKSAqLworCUJOX1VMT05HIG4wWzJdOy8qIGxlYXN0IHNpZ25pZmljYW50IHdvcmQocykgb2YgTmk7CisJICAgICAgICAgICAgICAgICAgKHR5cGUgY2hhbmdlZCB3aXRoIDAuOS45LCB3YXMgIkJOX1VMT05HIG4wOyIgYmVmb3JlKSAqLworCWludCBmbGFnczsKKwl9OworCisvKiBVc2VkIGZvciByZWNpcHJvY2FsIGRpdmlzaW9uL21vZCBmdW5jdGlvbnMKKyAqIEl0IGNhbm5vdCBiZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzCisgKi8KK3N0cnVjdCBibl9yZWNwX2N0eF9zdAorCXsKKwlCSUdOVU0gTjsJLyogdGhlIGRpdmlzb3IgKi8KKwlCSUdOVU0gTnI7CS8qIHRoZSByZWNpcHJvY2FsICovCisJaW50IG51bV9iaXRzOworCWludCBzaGlmdDsKKwlpbnQgZmxhZ3M7CisJfTsKKworLyogVXNlZCBmb3Igc2xvdyAiZ2VuZXJhdGlvbiIgZnVuY3Rpb25zLiAqLworc3RydWN0IGJuX2dlbmNiX3N0CisJeworCXVuc2lnbmVkIGludCB2ZXI7CS8qIFRvIGhhbmRsZSBiaW5hcnkgKGluKWNvbXBhdGliaWxpdHkgKi8KKwl2b2lkICphcmc7CQkvKiBjYWxsYmFjay1zcGVjaWZpYyBkYXRhICovCisJdW5pb24KKwkJeworCQkvKiBpZih2ZXI9PTEpIC0gaGFuZGxlcyBvbGQgc3R5bGUgY2FsbGJhY2tzICovCisJCXZvaWQgKCpjYl8xKShpbnQsIGludCwgdm9pZCAqKTsKKwkJLyogaWYodmVyPT0yKSAtIG5ldyBjYWxsYmFjayBzdHlsZSAqLworCQlpbnQgKCpjYl8yKShpbnQsIGludCwgQk5fR0VOQ0IgKik7CisJCX0gY2I7CisJfTsKKy8qIFdyYXBwZXIgZnVuY3Rpb24gdG8gbWFrZSB1c2luZyBCTl9HRU5DQiBlYXNpZXIsICAqLworaW50IEJOX0dFTkNCX2NhbGwoQk5fR0VOQ0IgKmNiLCBpbnQgYSwgaW50IGIpOworLyogTWFjcm8gdG8gcG9wdWxhdGUgYSBCTl9HRU5DQiBzdHJ1Y3R1cmUgd2l0aCBhbiAib2xkIi1zdHlsZSBjYWxsYmFjayAqLworI2RlZmluZSBCTl9HRU5DQl9zZXRfb2xkKGdlbmNiLCBjYWxsYmFjaywgY2JfYXJnKSB7IFwKKwkJQk5fR0VOQ0IgKnRtcF9nZW5jYiA9IChnZW5jYik7IFwKKwkJdG1wX2dlbmNiLT52ZXIgPSAxOyBcCisJCXRtcF9nZW5jYi0+YXJnID0gKGNiX2FyZyk7IFwKKwkJdG1wX2dlbmNiLT5jYi5jYl8xID0gKGNhbGxiYWNrKTsgfQorLyogTWFjcm8gdG8gcG9wdWxhdGUgYSBCTl9HRU5DQiBzdHJ1Y3R1cmUgd2l0aCBhICJuZXciLXN0eWxlIGNhbGxiYWNrICovCisjZGVmaW5lIEJOX0dFTkNCX3NldChnZW5jYiwgY2FsbGJhY2ssIGNiX2FyZykgeyBcCisJCUJOX0dFTkNCICp0bXBfZ2VuY2IgPSAoZ2VuY2IpOyBcCisJCXRtcF9nZW5jYi0+dmVyID0gMjsgXAorCQl0bXBfZ2VuY2ItPmFyZyA9IChjYl9hcmcpOyBcCisJCXRtcF9nZW5jYi0+Y2IuY2JfMiA9IChjYWxsYmFjayk7IH0KKworI2RlZmluZSBCTl9wcmltZV9jaGVja3MgMCAvKiBkZWZhdWx0OiBzZWxlY3QgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKwkJCSAgICAgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIG51bWJlciAqLworCisvKiBudW1iZXIgb2YgTWlsbGVyLVJhYmluIGl0ZXJhdGlvbnMgZm9yIGFuIGVycm9yIHJhdGUgIG9mIGxlc3MgdGhhbiAyXi04MAorICogZm9yIHJhbmRvbSAnYictYml0IGlucHV0LCBiID49IDEwMCAodGFrZW4gZnJvbSB0YWJsZSA0LjQgaW4gdGhlIEhhbmRib29rCisgKiBvZiBBcHBsaWVkIENyeXB0b2dyYXBoeSBbTWVuZXplcywgdmFuIE9vcnNjaG90LCBWYW5zdG9uZTsgQ1JDIFByZXNzIDE5OTZdOworICogb3JpZ2luYWwgcGFwZXI6IERhbWdhYXJkLCBMYW5kcm9jaywgUG9tZXJhbmNlOiBBdmVyYWdlIGNhc2UgZXJyb3IgZXN0aW1hdGVzCisgKiBmb3IgdGhlIHN0cm9uZyBwcm9iYWJsZSBwcmltZSB0ZXN0LiAtLSBNYXRoLiBDb21wLiA2MSAoMTk5MykgMTc3LTE5NCkgKi8KKyNkZWZpbmUgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplKGIpICgoYikgPj0gMTMwMCA/ICAyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDg1MCA/ICAzIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDY1MCA/ICA0IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDU1MCA/ICA1IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDQ1MCA/ICA2IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDQwMCA/ICA3IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDM1MCA/ICA4IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDMwMCA/ICA5IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDI1MCA/IDEyIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDIwMCA/IDE1IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYikgPj0gIDE1MCA/IDE4IDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiID49IDEwMCAqLyAyNykKKworI2RlZmluZSBCTl9udW1fYnl0ZXMoYSkJKChCTl9udW1fYml0cyhhKSs3KS84KQorCisvKiBOb3RlIHRoYXQgQk5fYWJzX2lzX3dvcmQgZGlkbid0IHdvcmsgcmVsaWFibHkgZm9yIHcgPT0gMCB1bnRpbCAwLjkuOCAqLworI2RlZmluZSBCTl9hYnNfaXNfd29yZChhLHcpICgoKChhKS0+dG9wID09IDEpICYmICgoYSktPmRbMF0gPT0gKEJOX1VMT05HKSh3KSkpIHx8IFwKKwkJCQkoKCh3KSA9PSAwKSAmJiAoKGEpLT50b3AgPT0gMCkpKQorI2RlZmluZSBCTl9pc196ZXJvKGEpICAgICAgICgoYSktPnRvcCA9PSAwKQorI2RlZmluZSBCTl9pc19vbmUoYSkgICAgICAgIChCTl9hYnNfaXNfd29yZCgoYSksMSkgJiYgIShhKS0+bmVnKQorI2RlZmluZSBCTl9pc193b3JkKGEsdykgICAgIChCTl9hYnNfaXNfd29yZCgoYSksKHcpKSAmJiAoISh3KSB8fCAhKGEpLT5uZWcpKQorI2RlZmluZSBCTl9pc19vZGQoYSkJICAgICgoKGEpLT50b3AgPiAwKSAmJiAoKGEpLT5kWzBdICYgMSkpCisKKyNkZWZpbmUgQk5fb25lKGEpCShCTl9zZXRfd29yZCgoYSksMSkpCisjZGVmaW5lIEJOX3plcm9fZXgoYSkgXAorCWRvIHsgXAorCQlCSUdOVU0gKl90bXBfYm4gPSAoYSk7IFwKKwkJX3RtcF9ibi0+dG9wID0gMDsgXAorCQlfdG1wX2JuLT5uZWcgPSAwOyBcCisJfSB3aGlsZSgwKQorI2lmZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2RlZmluZSBCTl96ZXJvKGEpCUJOX3plcm9fZXgoYSkKKyNlbHNlCisjZGVmaW5lIEJOX3plcm8oYSkJKEJOX3NldF93b3JkKChhKSwwKSkKKyNlbmRpZgorCitjb25zdCBCSUdOVU0gKkJOX3ZhbHVlX29uZSh2b2lkKTsKK2NoYXIgKglCTl9vcHRpb25zKHZvaWQpOworQk5fQ1RYICpCTl9DVFhfbmV3KHZvaWQpOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK3ZvaWQJQk5fQ1RYX2luaXQoQk5fQ1RYICpjKTsKKyNlbmRpZgordm9pZAlCTl9DVFhfZnJlZShCTl9DVFggKmMpOwordm9pZAlCTl9DVFhfc3RhcnQoQk5fQ1RYICpjdHgpOworQklHTlVNICpCTl9DVFhfZ2V0KEJOX0NUWCAqY3R4KTsKK3ZvaWQJQk5fQ1RYX2VuZChCTl9DVFggKmN0eCk7CitpbnQgICAgIEJOX3JhbmQoQklHTlVNICpybmQsIGludCBiaXRzLCBpbnQgdG9wLGludCBib3R0b20pOworaW50ICAgICBCTl9wc2V1ZG9fcmFuZChCSUdOVU0gKnJuZCwgaW50IGJpdHMsIGludCB0b3AsaW50IGJvdHRvbSk7CitpbnQJQk5fcmFuZF9yYW5nZShCSUdOVU0gKnJuZCwgY29uc3QgQklHTlVNICpyYW5nZSk7CitpbnQJQk5fcHNldWRvX3JhbmRfcmFuZ2UoQklHTlVNICpybmQsIGNvbnN0IEJJR05VTSAqcmFuZ2UpOworaW50CUJOX251bV9iaXRzKGNvbnN0IEJJR05VTSAqYSk7CitpbnQJQk5fbnVtX2JpdHNfd29yZChCTl9VTE9ORyk7CitCSUdOVU0gKkJOX25ldyh2b2lkKTsKK3ZvaWQJQk5faW5pdChCSUdOVU0gKik7Cit2b2lkCUJOX2NsZWFyX2ZyZWUoQklHTlVNICphKTsKK0JJR05VTSAqQk5fY29weShCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYik7Cit2b2lkCUJOX3N3YXAoQklHTlVNICphLCBCSUdOVU0gKmIpOworQklHTlVNICpCTl9iaW4yYm4oY29uc3QgdW5zaWduZWQgY2hhciAqcyxpbnQgbGVuLEJJR05VTSAqcmV0KTsKK2ludAlCTl9ibjJiaW4oY29uc3QgQklHTlVNICphLCB1bnNpZ25lZCBjaGFyICp0byk7CitCSUdOVU0gKkJOX21waTJibihjb25zdCB1bnNpZ25lZCBjaGFyICpzLGludCBsZW4sQklHTlVNICpyZXQpOworaW50CUJOX2JuMm1waShjb25zdCBCSUdOVU0gKmEsIHVuc2lnbmVkIGNoYXIgKnRvKTsKK2ludAlCTl9zdWIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYik7CitpbnQJQk5fdXN1YihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKK2ludAlCTl91YWRkKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpOworaW50CUJOX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKK2ludAlCTl9tdWwoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpOworaW50CUJOX3NxcihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSxCTl9DVFggKmN0eCk7CisvKiogQk5fc2V0X25lZ2F0aXZlIHNldHMgc2lnbiBvZiBhIEJJR05VTQorICogXHBhcmFtICBiICBwb2ludGVyIHRvIHRoZSBCSUdOVU0gb2JqZWN0CisgKiBccGFyYW0gIG4gIDAgaWYgdGhlIEJJR05VTSBiIHNob3VsZCBiZSBwb3NpdGl2ZSBhbmQgYSB2YWx1ZSAhPSAwIG90aGVyd2lzZSAKKyAqLwordm9pZAlCTl9zZXRfbmVnYXRpdmUoQklHTlVNICpiLCBpbnQgbik7CisvKiogQk5faXNfbmVnYXRpdmUgcmV0dXJucyAxIGlmIHRoZSBCSUdOVU0gaXMgbmVnYXRpdmUKKyAqIFxwYXJhbSAgYSAgcG9pbnRlciB0byB0aGUgQklHTlVNIG9iamVjdAorICogXHJldHVybiAxIGlmIGEgPCAwIGFuZCAwIG90aGVyd2lzZQorICovCisjZGVmaW5lIEJOX2lzX25lZ2F0aXZlKGEpICgoYSktPm5lZyAhPSAwKQorCitpbnQJQk5fZGl2KEJJR05VTSAqZHYsIEJJR05VTSAqcmVtLCBjb25zdCBCSUdOVU0gKm0sIGNvbnN0IEJJR05VTSAqZCwKKwlCTl9DVFggKmN0eCk7CisjZGVmaW5lIEJOX21vZChyZW0sbSxkLGN0eCkgQk5fZGl2KE5VTEwsKHJlbSksKG0pLChkKSwoY3R4KSkKK2ludAlCTl9ubm1vZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqbSwgY29uc3QgQklHTlVNICpkLCBCTl9DVFggKmN0eCk7CitpbnQJQk5fbW9kX2FkZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9tb2RfYWRkX3F1aWNrKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqbSk7CitpbnQJQk5fbW9kX3N1YihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9tb2Rfc3ViX3F1aWNrKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IEJJR05VTSAqbSk7CitpbnQJQk5fbW9kX211bChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCWNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpOworaW50CUJOX21vZF9zcXIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgpOworaW50CUJOX21vZF9sc2hpZnQxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9tb2RfbHNoaWZ0MV9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICptKTsKK2ludAlCTl9tb2RfbHNoaWZ0KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBpbnQgbiwgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCk7CitpbnQJQk5fbW9kX2xzaGlmdF9xdWljayhCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgaW50IG4sIGNvbnN0IEJJR05VTSAqbSk7CisKK0JOX1VMT05HIEJOX21vZF93b3JkKGNvbnN0IEJJR05VTSAqYSwgQk5fVUxPTkcgdyk7CitCTl9VTE9ORyBCTl9kaXZfd29yZChCSUdOVU0gKmEsIEJOX1VMT05HIHcpOworaW50CUJOX211bF93b3JkKEJJR05VTSAqYSwgQk5fVUxPTkcgdyk7CitpbnQJQk5fYWRkX3dvcmQoQklHTlVNICphLCBCTl9VTE9ORyB3KTsKK2ludAlCTl9zdWJfd29yZChCSUdOVU0gKmEsIEJOX1VMT05HIHcpOworaW50CUJOX3NldF93b3JkKEJJR05VTSAqYSwgQk5fVUxPTkcgdyk7CitCTl9VTE9ORyBCTl9nZXRfd29yZChjb25zdCBCSUdOVU0gKmEpOworCitpbnQJQk5fY21wKGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiKTsKK3ZvaWQJQk5fZnJlZShCSUdOVU0gKmEpOworaW50CUJOX2lzX2JpdF9zZXQoY29uc3QgQklHTlVNICphLCBpbnQgbik7CitpbnQJQk5fbHNoaWZ0KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBpbnQgbik7CitpbnQJQk5fbHNoaWZ0MShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSk7CitpbnQJQk5fZXhwKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsQk5fQ1RYICpjdHgpOworCitpbnQJQk5fbW9kX2V4cChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCWNvbnN0IEJJR05VTSAqbSxCTl9DVFggKmN0eCk7CitpbnQJQk5fbW9kX2V4cF9tb250KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisJY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwgQk5fTU9OVF9DVFggKm1fY3R4KTsKK2ludCBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKEJJR05VTSAqcnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCWNvbnN0IEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsIEJOX01PTlRfQ1RYICppbl9tb250KTsKK2ludAlCTl9tb2RfZXhwX21vbnRfd29yZChCSUdOVU0gKnIsIEJOX1VMT05HIGEsIGNvbnN0IEJJR05VTSAqcCwKKwljb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpOworaW50CUJOX21vZF9leHAyX21vbnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmExLCBjb25zdCBCSUdOVU0gKnAxLAorCWNvbnN0IEJJR05VTSAqYTIsIGNvbnN0IEJJR05VTSAqcDIsY29uc3QgQklHTlVNICptLAorCUJOX0NUWCAqY3R4LEJOX01PTlRfQ1RYICptX2N0eCk7CitpbnQJQk5fbW9kX2V4cF9zaW1wbGUoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwljb25zdCBCSUdOVU0gKm0sQk5fQ1RYICpjdHgpOworCitpbnQJQk5fbWFza19iaXRzKEJJR05VTSAqYSxpbnQgbik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQJQk5fcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IEJJR05VTSAqYSk7CisjZW5kaWYKKyNpZmRlZiBIRUFERVJfQklPX0gKK2ludAlCTl9wcmludChCSU8gKmZwLCBjb25zdCBCSUdOVU0gKmEpOworI2Vsc2UKK2ludAlCTl9wcmludCh2b2lkICpmcCwgY29uc3QgQklHTlVNICphKTsKKyNlbmRpZgoraW50CUJOX3JlY2lwcm9jYWwoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKm0sIGludCBsZW4sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9yc2hpZnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGludCBuKTsKK2ludAlCTl9yc2hpZnQxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphKTsKK3ZvaWQJQk5fY2xlYXIoQklHTlVNICphKTsKK0JJR05VTSAqQk5fZHVwKGNvbnN0IEJJR05VTSAqYSk7CitpbnQJQk5fdWNtcChjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYik7CitpbnQJQk5fc2V0X2JpdChCSUdOVU0gKmEsIGludCBuKTsKK2ludAlCTl9jbGVhcl9iaXQoQklHTlVNICphLCBpbnQgbik7CitjaGFyICoJQk5fYm4yaGV4KGNvbnN0IEJJR05VTSAqYSk7CitjaGFyICoJQk5fYm4yZGVjKGNvbnN0IEJJR05VTSAqYSk7CitpbnQgCUJOX2hleDJibihCSUdOVU0gKiphLCBjb25zdCBjaGFyICpzdHIpOworaW50IAlCTl9kZWMyYm4oQklHTlVNICoqYSwgY29uc3QgY2hhciAqc3RyKTsKK2ludAlCTl9hc2MyYm4oQklHTlVNICoqYSwgY29uc3QgY2hhciAqc3RyKTsKK2ludAlCTl9nY2QoQklHTlVNICpyLGNvbnN0IEJJR05VTSAqYSxjb25zdCBCSUdOVU0gKmIsQk5fQ1RYICpjdHgpOworaW50CUJOX2tyb25lY2tlcihjb25zdCBCSUdOVU0gKmEsY29uc3QgQklHTlVNICpiLEJOX0NUWCAqY3R4KTsgLyogcmV0dXJucyAtMiBmb3IgZXJyb3IgKi8KK0JJR05VTSAqQk5fbW9kX2ludmVyc2UoQklHTlVNICpyZXQsCisJY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKm4sQk5fQ1RYICpjdHgpOworQklHTlVNICpCTl9tb2Rfc3FydChCSUdOVU0gKnJldCwKKwljb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqbixCTl9DVFggKmN0eCk7CisKKy8qIERlcHJlY2F0ZWQgdmVyc2lvbnMgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitCSUdOVU0gKkJOX2dlbmVyYXRlX3ByaW1lKEJJR05VTSAqcmV0LGludCBiaXRzLGludCBzYWZlLAorCWNvbnN0IEJJR05VTSAqYWRkLCBjb25zdCBCSUdOVU0gKnJlbSwKKwl2b2lkICgqY2FsbGJhY2spKGludCxpbnQsdm9pZCAqKSx2b2lkICpjYl9hcmcpOworaW50CUJOX2lzX3ByaW1lKGNvbnN0IEJJR05VTSAqcCxpbnQgbmNoZWNrcywKKwl2b2lkICgqY2FsbGJhY2spKGludCxpbnQsdm9pZCAqKSwKKwlCTl9DVFggKmN0eCx2b2lkICpjYl9hcmcpOworaW50CUJOX2lzX3ByaW1lX2Zhc3R0ZXN0KGNvbnN0IEJJR05VTSAqcCxpbnQgbmNoZWNrcywKKwl2b2lkICgqY2FsbGJhY2spKGludCxpbnQsdm9pZCAqKSxCTl9DVFggKmN0eCx2b2lkICpjYl9hcmcsCisJaW50IGRvX3RyaWFsX2RpdmlzaW9uKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0RFUFJFQ0FURUQpICovCisKKy8qIE5ld2VyIHZlcnNpb25zICovCitpbnQJQk5fZ2VuZXJhdGVfcHJpbWVfZXgoQklHTlVNICpyZXQsaW50IGJpdHMsaW50IHNhZmUsIGNvbnN0IEJJR05VTSAqYWRkLAorCQljb25zdCBCSUdOVU0gKnJlbSwgQk5fR0VOQ0IgKmNiKTsKK2ludAlCTl9pc19wcmltZV9leChjb25zdCBCSUdOVU0gKnAsaW50IG5jaGVja3MsIEJOX0NUWCAqY3R4LCBCTl9HRU5DQiAqY2IpOworaW50CUJOX2lzX3ByaW1lX2Zhc3R0ZXN0X2V4KGNvbnN0IEJJR05VTSAqcCxpbnQgbmNoZWNrcywgQk5fQ1RYICpjdHgsCisJCWludCBkb190cmlhbF9kaXZpc2lvbiwgQk5fR0VOQ0IgKmNiKTsKKworQk5fTU9OVF9DVFggKkJOX01PTlRfQ1RYX25ldyh2b2lkICk7Cit2b2lkIEJOX01PTlRfQ1RYX2luaXQoQk5fTU9OVF9DVFggKmN0eCk7CitpbnQgQk5fbW9kX211bF9tb250Z29tZXJ5KEJJR05VTSAqcixjb25zdCBCSUdOVU0gKmEsY29uc3QgQklHTlVNICpiLAorCUJOX01PTlRfQ1RYICptb250LCBCTl9DVFggKmN0eCk7CisjZGVmaW5lIEJOX3RvX21vbnRnb21lcnkocixhLG1vbnQsY3R4KQlCTl9tb2RfbXVsX21vbnRnb21lcnkoXAorCShyKSwoYSksJigobW9udCktPlJSKSwobW9udCksKGN0eCkpCitpbnQgQk5fZnJvbV9tb250Z29tZXJ5KEJJR05VTSAqcixjb25zdCBCSUdOVU0gKmEsCisJQk5fTU9OVF9DVFggKm1vbnQsIEJOX0NUWCAqY3R4KTsKK3ZvaWQgQk5fTU9OVF9DVFhfZnJlZShCTl9NT05UX0NUWCAqbW9udCk7CitpbnQgQk5fTU9OVF9DVFhfc2V0KEJOX01PTlRfQ1RYICptb250LGNvbnN0IEJJR05VTSAqbW9kLEJOX0NUWCAqY3R4KTsKK0JOX01PTlRfQ1RYICpCTl9NT05UX0NUWF9jb3B5KEJOX01PTlRfQ1RYICp0byxCTl9NT05UX0NUWCAqZnJvbSk7CitCTl9NT05UX0NUWCAqQk5fTU9OVF9DVFhfc2V0X2xvY2tlZChCTl9NT05UX0NUWCAqKnBtb250LCBpbnQgbG9jaywKKwkJCQkJY29uc3QgQklHTlVNICptb2QsIEJOX0NUWCAqY3R4KTsKKworLyogQk5fQkxJTkRJTkcgZmxhZ3MgKi8KKyNkZWZpbmUJQk5fQkxJTkRJTkdfTk9fVVBEQVRFCTB4MDAwMDAwMDEKKyNkZWZpbmUJQk5fQkxJTkRJTkdfTk9fUkVDUkVBVEUJMHgwMDAwMDAwMgorCitCTl9CTElORElORyAqQk5fQkxJTkRJTkdfbmV3KGNvbnN0IEJJR05VTSAqQSwgY29uc3QgQklHTlVNICpBaSwgQklHTlVNICptb2QpOwordm9pZCBCTl9CTElORElOR19mcmVlKEJOX0JMSU5ESU5HICpiKTsKK2ludCBCTl9CTElORElOR191cGRhdGUoQk5fQkxJTkRJTkcgKmIsQk5fQ1RYICpjdHgpOworaW50IEJOX0JMSU5ESU5HX2NvbnZlcnQoQklHTlVNICpuLCBCTl9CTElORElORyAqYiwgQk5fQ1RYICpjdHgpOworaW50IEJOX0JMSU5ESU5HX2ludmVydChCSUdOVU0gKm4sIEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fQkxJTkRJTkdfY29udmVydF9leChCSUdOVU0gKm4sIEJJR05VTSAqciwgQk5fQkxJTkRJTkcgKmIsIEJOX0NUWCAqKTsKK2ludCBCTl9CTElORElOR19pbnZlcnRfZXgoQklHTlVNICpuLCBjb25zdCBCSUdOVU0gKnIsIEJOX0JMSU5ESU5HICpiLCBCTl9DVFggKik7CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAordW5zaWduZWQgbG9uZyBCTl9CTElORElOR19nZXRfdGhyZWFkX2lkKGNvbnN0IEJOX0JMSU5ESU5HICopOwordm9pZCBCTl9CTElORElOR19zZXRfdGhyZWFkX2lkKEJOX0JMSU5ESU5HICosIHVuc2lnbmVkIGxvbmcpOworI2VuZGlmCitDUllQVE9fVEhSRUFESUQgKkJOX0JMSU5ESU5HX3RocmVhZF9pZChCTl9CTElORElORyAqKTsKK3Vuc2lnbmVkIGxvbmcgQk5fQkxJTkRJTkdfZ2V0X2ZsYWdzKGNvbnN0IEJOX0JMSU5ESU5HICopOwordm9pZCBCTl9CTElORElOR19zZXRfZmxhZ3MoQk5fQkxJTkRJTkcgKiwgdW5zaWduZWQgbG9uZyk7CitCTl9CTElORElORyAqQk5fQkxJTkRJTkdfY3JlYXRlX3BhcmFtKEJOX0JMSU5ESU5HICpiLAorCWNvbnN0IEJJR05VTSAqZSwgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKwlpbnQgKCpibl9tb2RfZXhwKShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCQkJICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LCBCTl9NT05UX0NUWCAqbV9jdHgpLAorCUJOX01PTlRfQ1RYICptX2N0eCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECit2b2lkIEJOX3NldF9wYXJhbXMoaW50IG11bCxpbnQgaGlnaCxpbnQgbG93LGludCBtb250KTsKK2ludCBCTl9nZXRfcGFyYW1zKGludCB3aGljaCk7IC8qIDAsIG11bCwgMSBoaWdoLCAyIGxvdywgMyBtb250ICovCisjZW5kaWYKKwordm9pZAlCTl9SRUNQX0NUWF9pbml0KEJOX1JFQ1BfQ1RYICpyZWNwKTsKK0JOX1JFQ1BfQ1RYICpCTl9SRUNQX0NUWF9uZXcodm9pZCk7Cit2b2lkCUJOX1JFQ1BfQ1RYX2ZyZWUoQk5fUkVDUF9DVFggKnJlY3ApOworaW50CUJOX1JFQ1BfQ1RYX3NldChCTl9SRUNQX0NUWCAqcmVjcCxjb25zdCBCSUdOVU0gKnJkaXYsQk5fQ1RYICpjdHgpOworaW50CUJOX21vZF9tdWxfcmVjaXByb2NhbChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LAorCUJOX1JFQ1BfQ1RYICpyZWNwLEJOX0NUWCAqY3R4KTsKK2ludAlCTl9tb2RfZXhwX3JlY3AoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwljb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKK2ludAlCTl9kaXZfcmVjcChCSUdOVU0gKmR2LCBCSUdOVU0gKnJlbSwgY29uc3QgQklHTlVNICptLAorCUJOX1JFQ1BfQ1RYICpyZWNwLCBCTl9DVFggKmN0eCk7CisKKy8qIEZ1bmN0aW9ucyBmb3IgYXJpdGhtZXRpYyBvdmVyIGJpbmFyeSBwb2x5bm9taWFscyByZXByZXNlbnRlZCBieSBCSUdOVU1zLiAKKyAqCisgKiBUaGUgQklHTlVNOjpuZWcgcHJvcGVydHkgb2YgQklHTlVNcyByZXByZXNlbnRpbmcgYmluYXJ5IHBvbHlub21pYWxzIGlzCisgKiBpZ25vcmVkLgorICoKKyAqIE5vdGUgdGhhdCBpbnB1dCBhcmd1bWVudHMgYXJlIG5vdCBjb25zdCBzbyB0aGF0IHRoZWlyIGJpdCBhcnJheXMgY2FuCisgKiBiZSBleHBhbmRlZCB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZSBpZiBuZWVkZWQuCisgKi8KKworaW50CUJOX0dGMm1fYWRkKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIpOyAvKnIgPSBhICsgYiovCisjZGVmaW5lIEJOX0dGMm1fc3ViKHIsIGEsIGIpIEJOX0dGMm1fYWRkKHIsIGEsIGIpCitpbnQJQk5fR0YybV9tb2QoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCk7IC8qcj1hIG1vZCBwKi8KK2ludAlCTl9HRjJtX21vZF9tdWwoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwKKwljb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KTsgLyogciA9IChhICogYikgbW9kIHAgKi8KK2ludAlCTl9HRjJtX21vZF9zcXIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwlCTl9DVFggKmN0eCk7IC8qIHIgPSAoYSAqIGEpIG1vZCBwICovCitpbnQJQk5fR0YybV9tb2RfaW52KEJJR05VTSAqciwgY29uc3QgQklHTlVNICpiLCBjb25zdCBCSUdOVU0gKnAsCisJQk5fQ1RYICpjdHgpOyAvKiByID0gKDEgLyBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX2RpdihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCWNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpOyAvKiByID0gKGEgLyBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX2V4cChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCWNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpOyAvKiByID0gKGEgXiBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX3NxcnQoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwKKwlCTl9DVFggKmN0eCk7IC8qIHIgPSBzcXJ0KGEpIG1vZCBwICovCitpbnQJQk5fR0YybV9tb2Rfc29sdmVfcXVhZChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCUJOX0NUWCAqY3R4KTsgLyogcl4yICsgciA9IGEgbW9kIHAgKi8KKyNkZWZpbmUgQk5fR0YybV9jbXAoYSwgYikgQk5fdWNtcCgoYSksIChiKSkKKy8qIFNvbWUgZnVuY3Rpb25zIGFsbG93IGZvciByZXByZXNlbnRhdGlvbiBvZiB0aGUgaXJyZWR1Y2libGUgcG9seW5vbWlhbHMKKyAqIGFzIGFuIHVuc2lnbmVkIGludFtdLCBzYXkgcC4gIFRoZSBpcnJlZHVjaWJsZSBmKHQpIGlzIHRoZW4gb2YgdGhlIGZvcm06CisgKiAgICAgdF5wWzBdICsgdF5wWzFdICsgLi4uICsgdF5wW2tdCisgKiB3aGVyZSBtID0gcFswXSA+IHBbMV0gPiAuLi4gPiBwW2tdID0gMC4KKyAqLworaW50CUJOX0dGMm1fbW9kX2FycihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgaW50IHBbXSk7CisJLyogciA9IGEgbW9kIHAgKi8KK2ludAlCTl9HRjJtX21vZF9tdWxfYXJyKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsCisJY29uc3QgaW50IHBbXSwgQk5fQ1RYICpjdHgpOyAvKiByID0gKGEgKiBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX3Nxcl9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IGludCBwW10sCisJQk5fQ1RYICpjdHgpOyAvKiByID0gKGEgKiBhKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX2ludl9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmIsIGNvbnN0IGludCBwW10sCisJQk5fQ1RYICpjdHgpOyAvKiByID0gKDEgLyBiKSBtb2QgcCAqLworaW50CUJOX0dGMm1fbW9kX2Rpdl9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwKKwljb25zdCBpbnQgcFtdLCBCTl9DVFggKmN0eCk7IC8qIHIgPSAoYSAvIGIpIG1vZCBwICovCitpbnQJQk5fR0YybV9tb2RfZXhwX2FycihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLAorCWNvbnN0IGludCBwW10sIEJOX0NUWCAqY3R4KTsgLyogciA9IChhIF4gYikgbW9kIHAgKi8KK2ludAlCTl9HRjJtX21vZF9zcXJ0X2FycihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwKKwljb25zdCBpbnQgcFtdLCBCTl9DVFggKmN0eCk7IC8qIHIgPSBzcXJ0KGEpIG1vZCBwICovCitpbnQJQk5fR0YybV9tb2Rfc29sdmVfcXVhZF9hcnIoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsCisJY29uc3QgaW50IHBbXSwgQk5fQ1RYICpjdHgpOyAvKiByXjIgKyByID0gYSBtb2QgcCAqLworaW50CUJOX0dGMm1fcG9seTJhcnIoY29uc3QgQklHTlVNICphLCBpbnQgcFtdLCBpbnQgbWF4KTsKK2ludAlCTl9HRjJtX2FycjJwb2x5KGNvbnN0IGludCBwW10sIEJJR05VTSAqYSk7CisKKy8qIGZhc3RlciBtb2QgZnVuY3Rpb25zIGZvciB0aGUgJ05JU1QgcHJpbWVzJyAKKyAqIDAgPD0gYSA8IHBeMiAqLworaW50IEJOX25pc3RfbW9kXzE5MihCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fbmlzdF9tb2RfMjI0KEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KTsKK2ludCBCTl9uaXN0X21vZF8yNTYoQklHTlVNICpyLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqcCwgQk5fQ1RYICpjdHgpOworaW50IEJOX25pc3RfbW9kXzM4NChCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLCBCTl9DVFggKmN0eCk7CitpbnQgQk5fbmlzdF9tb2RfNTIxKEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsIEJOX0NUWCAqY3R4KTsKKworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMTkyKHZvaWQpOworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMjI0KHZvaWQpOworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMjU2KHZvaWQpOworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfMzg0KHZvaWQpOworY29uc3QgQklHTlVNICpCTl9nZXQwX25pc3RfcHJpbWVfNTIxKHZvaWQpOworCisvKiBsaWJyYXJ5IGludGVybmFsIGZ1bmN0aW9ucyAqLworCisjZGVmaW5lIGJuX2V4cGFuZChhLGJpdHMpICgoKCgoKGJpdHMrQk5fQklUUzItMSkpL0JOX0JJVFMyKSkgPD0gKGEpLT5kbWF4KT9cCisJKGEpOmJuX2V4cGFuZDIoKGEpLChiaXRzK0JOX0JJVFMyLTEpL0JOX0JJVFMyKSkKKyNkZWZpbmUgYm5fd2V4cGFuZChhLHdvcmRzKSAoKCh3b3JkcykgPD0gKGEpLT5kbWF4KT8oYSk6Ym5fZXhwYW5kMigoYSksKHdvcmRzKSkpCitCSUdOVU0gKmJuX2V4cGFuZDIoQklHTlVNICphLCBpbnQgd29yZHMpOworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK0JJR05VTSAqYm5fZHVwX2V4cGFuZChjb25zdCBCSUdOVU0gKmEsIGludCB3b3Jkcyk7IC8qIHVudXNlZCAqLworI2VuZGlmCisKKy8qIEJpZ251bSBjb25zaXN0ZW5jeSBtYWNyb3MKKyAqIFRoZXJlIGlzIG9uZSAiQVBJIiBtYWNybywgYm5fZml4X3RvcCgpLCBmb3Igc3RyaXBwaW5nIGxlYWRpbmcgemVyb2VzIGZyb20KKyAqIGJpZ251bSBkYXRhIGFmdGVyIGRpcmVjdCBtYW5pcHVsYXRpb25zIG9uIHRoZSBkYXRhLiBUaGVyZSBpcyBhbHNvIGFuCisgKiAiaW50ZXJuYWwiIG1hY3JvLCBibl9jaGVja190b3AoKSwgZm9yIHZlcmlmeWluZyB0aGF0IHRoZXJlIGFyZSBubyBsZWFkaW5nCisgKiB6ZXJvZXMuIFVuZm9ydHVuYXRlbHksIHNvbWUgYXVkaXRpbmcgaXMgcmVxdWlyZWQgZHVlIHRvIHRoZSBmYWN0IHRoYXQKKyAqIGJuX2ZpeF90b3AoKSBoYXMgYmVjb21lIGFuIG92ZXJhYnVzZWQgZHVjdC10YXBlIGJlY2F1c2UgYmlnbnVtIGRhdGEgaXMKKyAqIG9jY2FzaW9uYWxseSBwYXNzZWQgYXJvdW5kIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gU28gdGhlIGZvbGxvd2luZworICogY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byBzb3J0IHRoaXMgb3V0OworICogLSBibl9maXhfdG9wKClzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIG1vdmVkIHRvIGJuX2NvcnJlY3RfdG9wKCkKKyAqIC0gaWYgQk5fREVCVUcgaXNuJ3QgZGVmaW5lZCwgYm5fZml4X3RvcCgpIG1hcHMgdG8gYm5fY29ycmVjdF90b3AoKSwgYW5kCisgKiAgIGJuX2NoZWNrX3RvcCgpIGlzIGFzIGJlZm9yZS4KKyAqIC0gaWYgQk5fREVCVUcgKmlzKiBkZWZpbmVkOworICogICAtIGJuX2NoZWNrX3RvcCgpIHRyaWVzIHRvIHBvbGx1dGUgdW51c2VkIHdvcmRzIGV2ZW4gaWYgdGhlIGJpZ251bSAndG9wJyBpcworICogICAgIGNvbnNpc3RlbnQuIChlZDogb25seSBpZiBCTl9ERUJVR19SQU5EIGlzIGRlZmluZWQpCisgKiAgIC0gYm5fZml4X3RvcCgpIG1hcHMgdG8gYm5fY2hlY2tfdG9wKCkgcmF0aGVyIHRoYW4gImZpeGluZyIgYW55dGhpbmcuCisgKiBUaGUgaWRlYSBpcyB0byBoYXZlIGRlYnVnIGJ1aWxkcyBmbGFnIHVwIGluY29uc2lzdGVudCBiaWdudW1zIHdoZW4gdGhleQorICogb2NjdXIuIElmIHRoYXQgb2NjdXJzIGluIGEgYm5fZml4X3RvcCgpLCB3ZSBleGFtaW5lIHRoZSBjb2RlIGluIHF1ZXN0aW9uOyBpZgorICogdGhlIHVzZSBvZiBibl9maXhfdG9wKCkgd2FzIGFwcHJvcHJpYXRlIChpZS4gaXQgZm9sbG93cyBkaXJlY3RseSBhZnRlciBjb2RlCisgKiB0aGF0IG1hbmlwdWxhdGVzIHRoZSBiaWdudW0pIGl0IGlzIGNvbnZlcnRlZCB0byBibl9jb3JyZWN0X3RvcCgpLCBhbmQgaWYgaXQKKyAqIHdhcyBub3QgYXBwcm9wcmlhdGUsIHdlIGNvbnZlcnQgaXQgcGVybWFuZW50bHkgdG8gYm5fY2hlY2tfdG9wKCkgYW5kIHRyYWNrCisgKiBkb3duIHRoZSBjYXVzZSBvZiB0aGUgYnVnLiBFdmVudHVhbGx5LCBubyBpbnRlcm5hbCBjb2RlIHNob3VsZCBiZSB1c2luZyB0aGUKKyAqIGJuX2ZpeF90b3AoKSBtYWNyby4gRXh0ZXJuYWwgYXBwbGljYXRpb25zIGFuZCBsaWJyYXJpZXMgc2hvdWxkIHRyeSB0aGlzIHdpdGgKKyAqIHRoZWlyIG93biBjb2RlIHRvbywgYm90aCBpbiB0ZXJtcyBvZiBidWlsZGluZyBhZ2FpbnN0IHRoZSBvcGVuc3NsIGhlYWRlcnMKKyAqIHdpdGggQk5fREVCVUcgZGVmaW5lZCAqYW5kKiBsaW5raW5nIHdpdGggYSB2ZXJzaW9uIG9mIE9wZW5TU0wgYnVpbHQgd2l0aCBpdAorICogZGVmaW5lZC4gVGhpcyBub3Qgb25seSBpbXByb3ZlcyBleHRlcm5hbCBjb2RlLCBpdCBwcm92aWRlcyBtb3JlIHRlc3QKKyAqIGNvdmVyYWdlIGZvciBvcGVuc3NsJ3Mgb3duIGNvZGUuCisgKi8KKworI2lmZGVmIEJOX0RFQlVHCisKKy8qIFdlIG9ubHkgbmVlZCBhc3NlcnQoKSB3aGVuIGRlYnVnZ2luZyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZkZWYgQk5fREVCVUdfUkFORAorLyogVG8gYXZvaWQgIm1ha2UgdXBkYXRlIiBjdnMgd2FycyBkdWUgdG8gQk5fREVCVUcsIHVzZSBzb21lIHRyaWNrcyAqLworI2lmbmRlZiBSQU5EX3BzZXVkb19ieXRlcworaW50IFJBTkRfcHNldWRvX2J5dGVzKHVuc2lnbmVkIGNoYXIgKmJ1ZixpbnQgbnVtKTsKKyNkZWZpbmUgQk5fREVCVUdfVFJJWAorI2VuZGlmCisjZGVmaW5lIGJuX3BvbGx1dGUoYSkgXAorCWRvIHsgXAorCQljb25zdCBCSUdOVU0gKl9ibnVtMSA9IChhKTsgXAorCQlpZihfYm51bTEtPnRvcCA8IF9ibnVtMS0+ZG1heCkgeyBcCisJCQl1bnNpZ25lZCBjaGFyIF90bXBfY2hhcjsgXAorCQkJLyogV2UgY2FzdCBhd2F5IGNvbnN0IHdpdGhvdXQgdGhlIGNvbXBpbGVyIGtub3dpbmcsIGFueSBcCisJCQkgKiAqZ2VudWluZWx5KiBjb25zdGFudCB2YXJpYWJsZXMgdGhhdCBhcmVuJ3QgbXV0YWJsZSBcCisJCQkgKiB3b3VsZG4ndCBiZSBjb25zdHJ1Y3RlZCB3aXRoIHRvcCE9ZG1heC4gKi8gXAorCQkJQk5fVUxPTkcgKl9ub3RfY29uc3Q7IFwKKwkJCW1lbWNweSgmX25vdF9jb25zdCwgJl9ibnVtMS0+ZCwgc2l6ZW9mKEJOX1VMT05HKikpOyBcCisJCQlSQU5EX3BzZXVkb19ieXRlcygmX3RtcF9jaGFyLCAxKTsgXAorCQkJbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopKF9ub3RfY29uc3QgKyBfYm51bTEtPnRvcCksIF90bXBfY2hhciwgXAorCQkJCShfYm51bTEtPmRtYXggLSBfYm51bTEtPnRvcCkgKiBzaXplb2YoQk5fVUxPTkcpKTsgXAorCQl9IFwKKwl9IHdoaWxlKDApCisjaWZkZWYgQk5fREVCVUdfVFJJWAorI3VuZGVmIFJBTkRfcHNldWRvX2J5dGVzCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIGJuX3BvbGx1dGUoYSkKKyNlbmRpZgorI2RlZmluZSBibl9jaGVja190b3AoYSkgXAorCWRvIHsgXAorCQljb25zdCBCSUdOVU0gKl9ibnVtMiA9IChhKTsgXAorCQlpZiAoX2JudW0yICE9IE5VTEwpIHsgXAorCQkJYXNzZXJ0KChfYm51bTItPnRvcCA9PSAwKSB8fCBcCisJCQkJKF9ibnVtMi0+ZFtfYm51bTItPnRvcCAtIDFdICE9IDApKTsgXAorCQkJYm5fcG9sbHV0ZShfYm51bTIpOyBcCisJCX0gXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBibl9maXhfdG9wKGEpCQlibl9jaGVja190b3AoYSkKKworI2Vsc2UgLyogIUJOX0RFQlVHICovCisKKyNkZWZpbmUgYm5fcG9sbHV0ZShhKQorI2RlZmluZSBibl9jaGVja190b3AoYSkKKyNkZWZpbmUgYm5fZml4X3RvcChhKQkJYm5fY29ycmVjdF90b3AoYSkKKworI2VuZGlmCisKKyNkZWZpbmUgYm5fY29ycmVjdF90b3AoYSkgXAorICAgICAgICB7IFwKKyAgICAgICAgQk5fVUxPTkcgKmZ0bDsgXAorCWludCB0bXBfdG9wID0gKGEpLT50b3A7IFwKKwlpZiAodG1wX3RvcCA+IDApIFwKKwkJeyBcCisJCWZvciAoZnRsPSAmKChhKS0+ZFt0bXBfdG9wLTFdKTsgdG1wX3RvcCA+IDA7IHRtcF90b3AtLSkgXAorCQkJaWYgKCooZnRsLS0pKSBicmVhazsgXAorCQkoYSktPnRvcCA9IHRtcF90b3A7IFwKKwkJfSBcCisJYm5fcG9sbHV0ZShhKTsgXAorCX0KKworQk5fVUxPTkcgYm5fbXVsX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgaW50IG51bSwgQk5fVUxPTkcgdyk7CitCTl9VTE9ORyBibl9tdWxfd29yZHMoQk5fVUxPTkcgKnJwLCBjb25zdCBCTl9VTE9ORyAqYXAsIGludCBudW0sIEJOX1VMT05HIHcpOwordm9pZCAgICAgYm5fc3FyX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBpbnQgbnVtKTsKK0JOX1VMT05HIGJuX2Rpdl93b3JkcyhCTl9VTE9ORyBoLCBCTl9VTE9ORyBsLCBCTl9VTE9ORyBkKTsKK0JOX1VMT05HIGJuX2FkZF93b3JkcyhCTl9VTE9ORyAqcnAsIGNvbnN0IEJOX1VMT05HICphcCwgY29uc3QgQk5fVUxPTkcgKmJwLGludCBudW0pOworQk5fVUxPTkcgYm5fc3ViX3dvcmRzKEJOX1VMT05HICpycCwgY29uc3QgQk5fVUxPTkcgKmFwLCBjb25zdCBCTl9VTE9ORyAqYnAsaW50IG51bSk7CisKKy8qIFByaW1lcyBmcm9tIFJGQyAyNDA5ICovCitCSUdOVU0gKmdldF9yZmMyNDA5X3ByaW1lXzc2OChCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzI0MDlfcHJpbWVfMTAyNChCSUdOVU0gKmJuKTsKKworLyogUHJpbWVzIGZyb20gUkZDIDM1MjYgKi8KK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfMTUzNihCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfMjA0OChCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfMzA3MihCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfNDA5NihCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfNjE0NChCSUdOVU0gKmJuKTsKK0JJR05VTSAqZ2V0X3JmYzM1MjZfcHJpbWVfODE5MihCSUdOVU0gKmJuKTsKKworaW50IEJOX2JudGVzdF9yYW5kKEJJR05VTSAqcm5kLCBpbnQgYml0cywgaW50IHRvcCxpbnQgYm90dG9tKTsKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9CTl9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIEJOIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIEJOX0ZfQk5SQU5ECQkJCQkgMTI3CisjZGVmaW5lIEJOX0ZfQk5fQkxJTkRJTkdfQ09OVkVSVF9FWAkJCSAxMDAKKyNkZWZpbmUgQk5fRl9CTl9CTElORElOR19DUkVBVEVfUEFSQU0JCQkgMTI4CisjZGVmaW5lIEJOX0ZfQk5fQkxJTkRJTkdfSU5WRVJUX0VYCQkJIDEwMQorI2RlZmluZSBCTl9GX0JOX0JMSU5ESU5HX05FVwkJCQkgMTAyCisjZGVmaW5lIEJOX0ZfQk5fQkxJTkRJTkdfVVBEQVRFCQkJCSAxMDMKKyNkZWZpbmUgQk5fRl9CTl9CTjJERUMJCQkJCSAxMDQKKyNkZWZpbmUgQk5fRl9CTl9CTjJIRVgJCQkJCSAxMDUKKyNkZWZpbmUgQk5fRl9CTl9DVFhfR0VUCQkJCQkgMTE2CisjZGVmaW5lIEJOX0ZfQk5fQ1RYX05FVwkJCQkJIDEwNgorI2RlZmluZSBCTl9GX0JOX0NUWF9TVEFSVAkJCQkgMTI5CisjZGVmaW5lIEJOX0ZfQk5fRElWCQkJCQkgMTA3CisjZGVmaW5lIEJOX0ZfQk5fRElWX05PX0JSQU5DSAkJCQkgMTM4CisjZGVmaW5lIEJOX0ZfQk5fRElWX1JFQ1AJCQkJIDEzMAorI2RlZmluZSBCTl9GX0JOX0VYUAkJCQkJIDEyMworI2RlZmluZSBCTl9GX0JOX0VYUEFORDIJCQkJCSAxMDgKKyNkZWZpbmUgQk5fRl9CTl9FWFBBTkRfSU5URVJOQUwJCQkJIDEyMAorI2RlZmluZSBCTl9GX0JOX0dGMk1fTU9ECQkJCSAxMzEKKyNkZWZpbmUgQk5fRl9CTl9HRjJNX01PRF9FWFAJCQkJIDEzMgorI2RlZmluZSBCTl9GX0JOX0dGMk1fTU9EX01VTAkJCQkgMTMzCisjZGVmaW5lIEJOX0ZfQk5fR0YyTV9NT0RfU09MVkVfUVVBRAkJCSAxMzQKKyNkZWZpbmUgQk5fRl9CTl9HRjJNX01PRF9TT0xWRV9RVUFEX0FSUgkJCSAxMzUKKyNkZWZpbmUgQk5fRl9CTl9HRjJNX01PRF9TUVIJCQkJIDEzNgorI2RlZmluZSBCTl9GX0JOX0dGMk1fTU9EX1NRUlQJCQkJIDEzNworI2RlZmluZSBCTl9GX0JOX01PRF9FWFAyX01PTlQJCQkJIDExOAorI2RlZmluZSBCTl9GX0JOX01PRF9FWFBfTU9OVAkJCQkgMTA5CisjZGVmaW5lIEJOX0ZfQk5fTU9EX0VYUF9NT05UX0NPTlNUVElNRQkJCSAxMjQKKyNkZWZpbmUgQk5fRl9CTl9NT0RfRVhQX01PTlRfV09SRAkJCSAxMTcKKyNkZWZpbmUgQk5fRl9CTl9NT0RfRVhQX1JFQ1AJCQkJIDEyNQorI2RlZmluZSBCTl9GX0JOX01PRF9FWFBfU0lNUExFCQkJCSAxMjYKKyNkZWZpbmUgQk5fRl9CTl9NT0RfSU5WRVJTRQkJCQkgMTEwCisjZGVmaW5lIEJOX0ZfQk5fTU9EX0lOVkVSU0VfTk9fQlJBTkNICQkJIDEzOQorI2RlZmluZSBCTl9GX0JOX01PRF9MU0hJRlRfUVVJQ0sJCQkgMTE5CisjZGVmaW5lIEJOX0ZfQk5fTU9EX01VTF9SRUNJUFJPQ0FMCQkJIDExMQorI2RlZmluZSBCTl9GX0JOX01PRF9TUVJUCQkJCSAxMjEKKyNkZWZpbmUgQk5fRl9CTl9NUEkyQk4JCQkJCSAxMTIKKyNkZWZpbmUgQk5fRl9CTl9ORVcJCQkJCSAxMTMKKyNkZWZpbmUgQk5fRl9CTl9SQU5ECQkJCQkgMTE0CisjZGVmaW5lIEJOX0ZfQk5fUkFORF9SQU5HRQkJCQkgMTIyCisjZGVmaW5lIEJOX0ZfQk5fVVNVQgkJCQkJIDExNQorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIEJOX1JfQVJHMl9MVF9BUkczCQkJCSAxMDAKKyNkZWZpbmUgQk5fUl9CQURfUkVDSVBST0NBTAkJCQkgMTAxCisjZGVmaW5lIEJOX1JfQklHTlVNX1RPT19MT05HCQkJCSAxMTQKKyNkZWZpbmUgQk5fUl9DQUxMRURfV0lUSF9FVkVOX01PRFVMVVMJCQkgMTAyCisjZGVmaW5lIEJOX1JfRElWX0JZX1pFUk8JCQkJIDEwMworI2RlZmluZSBCTl9SX0VOQ09ESU5HX0VSUk9SCQkJCSAxMDQKKyNkZWZpbmUgQk5fUl9FWFBBTkRfT05fU1RBVElDX0JJR05VTV9EQVRBCQkgMTA1CisjZGVmaW5lIEJOX1JfSU5QVVRfTk9UX1JFRFVDRUQJCQkJIDExMAorI2RlZmluZSBCTl9SX0lOVkFMSURfTEVOR1RICQkJCSAxMDYKKyNkZWZpbmUgQk5fUl9JTlZBTElEX1JBTkdFCQkJCSAxMTUKKyNkZWZpbmUgQk5fUl9OT1RfQV9TUVVBUkUJCQkJIDExMQorI2RlZmluZSBCTl9SX05PVF9JTklUSUFMSVpFRAkJCQkgMTA3CisjZGVmaW5lIEJOX1JfTk9fSU5WRVJTRQkJCQkJIDEwOAorI2RlZmluZSBCTl9SX05PX1NPTFVUSU9OCQkJCSAxMTYKKyNkZWZpbmUgQk5fUl9QX0lTX05PVF9QUklNRQkJCQkgMTEyCisjZGVmaW5lIEJOX1JfVE9PX01BTllfSVRFUkFUSU9OUwkJCSAxMTMKKyNkZWZpbmUgQk5fUl9UT09fTUFOWV9URU1QT1JBUllfVkFSSUFCTEVTCQkgMTA5CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4ZTQxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaApAQCAtMCwwICsxLDExOSBAQAorLyogY3J5cHRvL2J1ZmZlci9idWZmZXIuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9CVUZGRVJfSAorI2RlZmluZSBIRUFERVJfQlVGRkVSX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaWYgIWRlZmluZWQoTk9fU1lTX1RZUEVTX0gpCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKworLyogQWxyZWFkeSBkZWNsYXJlZCBpbiBvc3NsX3R5cC5oICovCisvKiB0eXBlZGVmIHN0cnVjdCBidWZfbWVtX3N0IEJVRl9NRU07ICovCisKK3N0cnVjdCBidWZfbWVtX3N0CisJeworCXNpemVfdCBsZW5ndGg7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzICovCisJY2hhciAqZGF0YTsKKwlzaXplX3QgbWF4OwkvKiBzaXplIG9mIGJ1ZmZlciAqLworCX07CisKK0JVRl9NRU0gKkJVRl9NRU1fbmV3KHZvaWQpOwordm9pZAlCVUZfTUVNX2ZyZWUoQlVGX01FTSAqYSk7CitpbnQJQlVGX01FTV9ncm93KEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbik7CitpbnQJQlVGX01FTV9ncm93X2NsZWFuKEJVRl9NRU0gKnN0ciwgc2l6ZV90IGxlbik7CitjaGFyICoJQlVGX3N0cmR1cChjb25zdCBjaGFyICpzdHIpOworY2hhciAqCUJVRl9zdHJuZHVwKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IHNpeik7Cit2b2lkICoJQlVGX21lbWR1cChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6KTsKK3ZvaWQJQlVGX3JldmVyc2UodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IHNpeik7CisKKy8qIHNhZmUgc3RyaW5nIGZ1bmN0aW9ucyAqLworc2l6ZV90IEJVRl9zdHJsY3B5KGNoYXIgKmRzdCxjb25zdCBjaGFyICpzcmMsc2l6ZV90IHNpeik7CitzaXplX3QgQlVGX3N0cmxjYXQoY2hhciAqZHN0LGNvbnN0IGNoYXIgKnNyYyxzaXplX3Qgc2l6KTsKKworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0JVRl9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIEJVRiBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBCVUZfRl9CVUZfTUVNRFVQCQkJCSAxMDMKKyNkZWZpbmUgQlVGX0ZfQlVGX01FTV9HUk9XCQkJCSAxMDAKKyNkZWZpbmUgQlVGX0ZfQlVGX01FTV9HUk9XX0NMRUFOCQkJIDEwNQorI2RlZmluZSBCVUZfRl9CVUZfTUVNX05FVwkJCQkgMTAxCisjZGVmaW5lIEJVRl9GX0JVRl9TVFJEVVAJCQkJIDEwMgorI2RlZmluZSBCVUZfRl9CVUZfU1RSTkRVUAkJCQkgMTA0CisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9jb21wLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvY29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDA1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvY29tcC5oCkBAIC0wLDAgKzEsODAgQEAKKworI2lmbmRlZiBIRUFERVJfQ09NUF9ICisjZGVmaW5lIEhFQURFUl9DT01QX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGNvbXBfY3R4X3N0IENPTVBfQ1RYOworCit0eXBlZGVmIHN0cnVjdCBjb21wX21ldGhvZF9zdAorCXsKKwlpbnQgdHlwZTsJCS8qIE5JRCBmb3IgY29tcHJlc3Npb24gbGlicmFyeSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CS8qIEEgdGV4dCBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGxpYnJhcnkgKi8KKwlpbnQgKCppbml0KShDT01QX0NUWCAqY3R4KTsKKwl2b2lkICgqZmluaXNoKShDT01QX0NUWCAqY3R4KTsKKwlpbnQgKCpjb21wcmVzcykoQ09NUF9DVFggKmN0eCwKKwkJCXVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgaW50IG9sZW4sCisJCQl1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgaW50IGlsZW4pOworCWludCAoKmV4cGFuZCkoQ09NUF9DVFggKmN0eCwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBpbnQgb2xlbiwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGludCBpbGVuKTsKKwkvKiBUaGUgZm9sbG93aW5nIHR3byBkbyBOT1RISU5HLCBidXQgYXJlIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKwlsb25nICgqY3RybCkodm9pZCk7CisJbG9uZyAoKmNhbGxiYWNrX2N0cmwpKHZvaWQpOworCX0gQ09NUF9NRVRIT0Q7CisKK3N0cnVjdCBjb21wX2N0eF9zdAorCXsKKwlDT01QX01FVEhPRCAqbWV0aDsKKwl1bnNpZ25lZCBsb25nIGNvbXByZXNzX2luOworCXVuc2lnbmVkIGxvbmcgY29tcHJlc3Nfb3V0OworCXVuc2lnbmVkIGxvbmcgZXhwYW5kX2luOworCXVuc2lnbmVkIGxvbmcgZXhwYW5kX291dDsKKworCUNSWVBUT19FWF9EQVRBCWV4X2RhdGE7CisJfTsKKworCitDT01QX0NUWCAqQ09NUF9DVFhfbmV3KENPTVBfTUVUSE9EICptZXRoKTsKK3ZvaWQgQ09NUF9DVFhfZnJlZShDT01QX0NUWCAqY3R4KTsKK2ludCBDT01QX2NvbXByZXNzX2Jsb2NrKENPTVBfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IG9sZW4sCisJdW5zaWduZWQgY2hhciAqaW4sIGludCBpbGVuKTsKK2ludCBDT01QX2V4cGFuZF9ibG9jayhDT01QX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBvbGVuLAorCXVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaWxlbik7CitDT01QX01FVEhPRCAqQ09NUF9ybGUodm9pZCApOworQ09NUF9NRVRIT0QgKkNPTVBfemxpYih2b2lkICk7Cit2b2lkIENPTVBfemxpYl9jbGVhbnVwKHZvaWQpOworCisjaWZkZWYgSEVBREVSX0JJT19ICisjaWZkZWYgWkxJQgorQklPX01FVEhPRCAqQklPX2ZfemxpYih2b2lkKTsKKyNlbmRpZgorI2VuZGlmCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfQ09NUF9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIENPTVAgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQ09NUF9GX0JJT19aTElCX0ZMVVNICQkJCSA5OQorI2RlZmluZSBDT01QX0ZfQklPX1pMSUJfTkVXCQkJCSAxMDAKKyNkZWZpbmUgQ09NUF9GX0JJT19aTElCX1JFQUQJCQkJIDEwMQorI2RlZmluZSBDT01QX0ZfQklPX1pMSUJfV1JJVEUJCQkJIDEwMgorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIENPTVBfUl9aTElCX0RFRkxBVEVfRVJST1IJCQkgOTkKKyNkZWZpbmUgQ09NUF9SX1pMSUJfSU5GTEFURV9FUlJPUgkJCSAxMDAKKyNkZWZpbmUgQ09NUF9SX1pMSUJfTk9UX1NVUFBPUlRFRAkJCSAxMDEKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9jb25mLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTk5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvY29uZi5oCkBAIC0wLDAgKzEsMjYzIEBACisvKiBjcnlwdG8vY29uZi9jb25mLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiAgSEVBREVSX0NPTkZfSAorI2RlZmluZSBIRUFERVJfQ09ORl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zYWZlc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0CisJeworCWNoYXIgKnNlY3Rpb247CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZTsKKwl9IENPTkZfVkFMVUU7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoQ09ORl9WQUxVRSkKK0RFQ0xBUkVfTEhBU0hfT0YoQ09ORl9WQUxVRSk7CisKK3N0cnVjdCBjb25mX3N0Oworc3RydWN0IGNvbmZfbWV0aG9kX3N0OwordHlwZWRlZiBzdHJ1Y3QgY29uZl9tZXRob2Rfc3QgQ09ORl9NRVRIT0Q7CisKK3N0cnVjdCBjb25mX21ldGhvZF9zdAorCXsKKwljb25zdCBjaGFyICpuYW1lOworCUNPTkYgKigqY3JlYXRlKShDT05GX01FVEhPRCAqbWV0aCk7CisJaW50ICgqaW5pdCkoQ09ORiAqY29uZik7CisJaW50ICgqZGVzdHJveSkoQ09ORiAqY29uZik7CisJaW50ICgqZGVzdHJveV9kYXRhKShDT05GICpjb25mKTsKKwlpbnQgKCpsb2FkX2JpbykoQ09ORiAqY29uZiwgQklPICpicCwgbG9uZyAqZWxpbmUpOworCWludCAoKmR1bXApKGNvbnN0IENPTkYgKmNvbmYsIEJJTyAqYnApOworCWludCAoKmlzX251bWJlcikoY29uc3QgQ09ORiAqY29uZiwgY2hhciBjKTsKKwlpbnQgKCp0b19pbnQpKGNvbnN0IENPTkYgKmNvbmYsIGNoYXIgYyk7CisJaW50ICgqbG9hZCkoQ09ORiAqY29uZiwgY29uc3QgY2hhciAqbmFtZSwgbG9uZyAqZWxpbmUpOworCX07CisKKy8qIE1vZHVsZSBkZWZpbml0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCBjb25mX2ltb2R1bGVfc3QgQ09ORl9JTU9EVUxFOwordHlwZWRlZiBzdHJ1Y3QgY29uZl9tb2R1bGVfc3QgQ09ORl9NT0RVTEU7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoQ09ORl9NT0RVTEUpCitERUNMQVJFX1NUQUNLX09GKENPTkZfSU1PRFVMRSkKKworLyogRFNPIG1vZHVsZSBmdW5jdGlvbiB0eXBlZGVmcyAqLwordHlwZWRlZiBpbnQgY29uZl9pbml0X2Z1bmMoQ09ORl9JTU9EVUxFICptZCwgY29uc3QgQ09ORiAqY25mKTsKK3R5cGVkZWYgdm9pZCBjb25mX2ZpbmlzaF9mdW5jKENPTkZfSU1PRFVMRSAqbWQpOworCisjZGVmaW5lCUNPTkZfTUZMQUdTX0lHTk9SRV9FUlJPUlMJMHgxCisjZGVmaW5lIENPTkZfTUZMQUdTX0lHTk9SRV9SRVRVUk5fQ09ERVMJMHgyCisjZGVmaW5lIENPTkZfTUZMQUdTX1NJTEVOVAkJMHg0CisjZGVmaW5lIENPTkZfTUZMQUdTX05PX0RTTwkJMHg4CisjZGVmaW5lIENPTkZfTUZMQUdTX0lHTk9SRV9NSVNTSU5HX0ZJTEUJMHgxMAorI2RlZmluZSBDT05GX01GTEFHU19ERUZBVUxUX1NFQ1RJT04JMHgyMAorCitpbnQgQ09ORl9zZXRfZGVmYXVsdF9tZXRob2QoQ09ORl9NRVRIT0QgKm1ldGgpOwordm9pZCBDT05GX3NldF9uY29uZihDT05GICpjb25mLExIQVNIX09GKENPTkZfVkFMVUUpICpoYXNoKTsKK0xIQVNIX09GKENPTkZfVkFMVUUpICpDT05GX2xvYWQoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsY29uc3QgY2hhciAqZmlsZSwKKwkJCQlsb25nICplbGluZSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitMSEFTSF9PRihDT05GX1ZBTFVFKSAqQ09ORl9sb2FkX2ZwKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBGSUxFICpmcCwKKwkJCQkgICBsb25nICplbGluZSk7CisjZW5kaWYKK0xIQVNIX09GKENPTkZfVkFMVUUpICpDT05GX2xvYWRfYmlvKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBCSU8gKmJwLGxvbmcgKmVsaW5lKTsKK1NUQUNLX09GKENPTkZfVkFMVUUpICpDT05GX2dldF9zZWN0aW9uKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uKTsKK2NoYXIgKkNPTkZfZ2V0X3N0cmluZyhMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZixjb25zdCBjaGFyICpncm91cCwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSk7Citsb25nIENPTkZfZ2V0X251bWJlcihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZixjb25zdCBjaGFyICpncm91cCwKKwkJICAgICBjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgQ09ORl9mcmVlKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mKTsKK2ludCBDT05GX2R1bXBfZnAoTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmNvbmYsIEZJTEUgKm91dCk7CitpbnQgQ09ORl9kdW1wX2JpbyhMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgQklPICpvdXQpOworCit2b2lkIE9QRU5TU0xfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19uYW1lKTsKK3ZvaWQgT1BFTlNTTF9ub19jb25maWcodm9pZCk7CisKKy8qIE5ldyBjb25mIGNvZGUuICBUaGUgc2VtYW50aWNzIGFyZSBkaWZmZXJlbnQgZnJvbSB0aGUgZnVuY3Rpb25zIGFib3ZlLgorICAgSWYgdGhhdCB3YXNuJ3QgdGhlIGNhc2UsIHRoZSBhYm92ZSBmdW5jdGlvbnMgd291bGQgaGF2ZSBiZWVuIHJlcGxhY2VkICovCisKK3N0cnVjdCBjb25mX3N0CisJeworCUNPTkZfTUVUSE9EICptZXRoOworCXZvaWQgKm1ldGhfZGF0YTsKKwlMSEFTSF9PRihDT05GX1ZBTFVFKSAqZGF0YTsKKwl9OworCitDT05GICpOQ09ORl9uZXcoQ09ORl9NRVRIT0QgKm1ldGgpOworQ09ORl9NRVRIT0QgKk5DT05GX2RlZmF1bHQodm9pZCk7CitDT05GX01FVEhPRCAqTkNPTkZfV0lOMzIodm9pZCk7CisjaWYgMCAvKiBKdXN0IHRvIGdpdmUgeW91IGFuIGlkZWEgb2Ygd2hhdCBJIGhhdmUgaW4gbWluZCAqLworQ09ORl9NRVRIT0QgKk5DT05GX1hNTCh2b2lkKTsKKyNlbmRpZgordm9pZCBOQ09ORl9mcmVlKENPTkYgKmNvbmYpOwordm9pZCBOQ09ORl9mcmVlX2RhdGEoQ09ORiAqY29uZik7CisKK2ludCBOQ09ORl9sb2FkKENPTkYgKmNvbmYsY29uc3QgY2hhciAqZmlsZSxsb25nICplbGluZSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgTkNPTkZfbG9hZF9mcChDT05GICpjb25mLCBGSUxFICpmcCxsb25nICplbGluZSk7CisjZW5kaWYKK2ludCBOQ09ORl9sb2FkX2JpbyhDT05GICpjb25mLCBCSU8gKmJwLGxvbmcgKmVsaW5lKTsKK1NUQUNLX09GKENPTkZfVkFMVUUpICpOQ09ORl9nZXRfc2VjdGlvbihjb25zdCBDT05GICpjb25mLGNvbnN0IGNoYXIgKnNlY3Rpb24pOworY2hhciAqTkNPTkZfZ2V0X3N0cmluZyhjb25zdCBDT05GICpjb25mLGNvbnN0IGNoYXIgKmdyb3VwLGNvbnN0IGNoYXIgKm5hbWUpOworaW50IE5DT05GX2dldF9udW1iZXJfZShjb25zdCBDT05GICpjb25mLGNvbnN0IGNoYXIgKmdyb3VwLGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBsb25nICpyZXN1bHQpOworaW50IE5DT05GX2R1bXBfZnAoY29uc3QgQ09ORiAqY29uZiwgRklMRSAqb3V0KTsKK2ludCBOQ09ORl9kdW1wX2Jpbyhjb25zdCBDT05GICpjb25mLCBCSU8gKm91dCk7CisKKyNpZiAwIC8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaGFzIG5vIGVycm9yIGNoZWNraW5nLAorCSBhbmQgc2hvdWxkIHRoZXJlZm9yZSBiZSBhdm9pZGVkICovCitsb25nIE5DT05GX2dldF9udW1iZXIoQ09ORiAqY29uZixjaGFyICpncm91cCxjaGFyICpuYW1lKTsKKyNlbHNlCisjZGVmaW5lIE5DT05GX2dldF9udW1iZXIoYyxnLG4scikgTkNPTkZfZ2V0X251bWJlcl9lKGMsZyxuLHIpCisjZW5kaWYKKyAgCisvKiBNb2R1bGUgZnVuY3Rpb25zICovCisKK2ludCBDT05GX21vZHVsZXNfbG9hZChjb25zdCBDT05GICpjbmYsIGNvbnN0IGNoYXIgKmFwcG5hbWUsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50IENPTkZfbW9kdWxlc19sb2FkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmFwcG5hbWUsCisJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK3ZvaWQgQ09ORl9tb2R1bGVzX3VubG9hZChpbnQgYWxsKTsKK3ZvaWQgQ09ORl9tb2R1bGVzX2ZpbmlzaCh2b2lkKTsKK3ZvaWQgQ09ORl9tb2R1bGVzX2ZyZWUodm9pZCk7CitpbnQgQ09ORl9tb2R1bGVfYWRkKGNvbnN0IGNoYXIgKm5hbWUsIGNvbmZfaW5pdF9mdW5jICppZnVuYywKKwkJICAgIGNvbmZfZmluaXNoX2Z1bmMgKmZmdW5jKTsKKworY29uc3QgY2hhciAqQ09ORl9pbW9kdWxlX2dldF9uYW1lKGNvbnN0IENPTkZfSU1PRFVMRSAqbWQpOworY29uc3QgY2hhciAqQ09ORl9pbW9kdWxlX2dldF92YWx1ZShjb25zdCBDT05GX0lNT0RVTEUgKm1kKTsKK3ZvaWQgKkNPTkZfaW1vZHVsZV9nZXRfdXNyX2RhdGEoY29uc3QgQ09ORl9JTU9EVUxFICptZCk7Cit2b2lkIENPTkZfaW1vZHVsZV9zZXRfdXNyX2RhdGEoQ09ORl9JTU9EVUxFICptZCwgdm9pZCAqdXNyX2RhdGEpOworQ09ORl9NT0RVTEUgKkNPTkZfaW1vZHVsZV9nZXRfbW9kdWxlKGNvbnN0IENPTkZfSU1PRFVMRSAqbWQpOwordW5zaWduZWQgbG9uZyBDT05GX2ltb2R1bGVfZ2V0X2ZsYWdzKGNvbnN0IENPTkZfSU1PRFVMRSAqbWQpOwordm9pZCBDT05GX2ltb2R1bGVfc2V0X2ZsYWdzKENPTkZfSU1PRFVMRSAqbWQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordm9pZCAqQ09ORl9tb2R1bGVfZ2V0X3Vzcl9kYXRhKENPTkZfTU9EVUxFICpwbW9kKTsKK3ZvaWQgQ09ORl9tb2R1bGVfc2V0X3Vzcl9kYXRhKENPTkZfTU9EVUxFICpwbW9kLCB2b2lkICp1c3JfZGF0YSk7CisKK2NoYXIgKkNPTkZfZ2V0MV9kZWZhdWx0X2NvbmZpZ19maWxlKHZvaWQpOworCitpbnQgQ09ORl9wYXJzZV9saXN0KGNvbnN0IGNoYXIgKmxpc3QsIGludCBzZXAsIGludCBub3NwYywKKwlpbnQgKCpsaXN0X2NiKShjb25zdCBjaGFyICplbGVtLCBpbnQgbGVuLCB2b2lkICp1c3IpLCB2b2lkICphcmcpOworCit2b2lkIE9QRU5TU0xfbG9hZF9idWlsdGluX21vZHVsZXModm9pZCk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfQ09ORl9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIENPTkYgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQ09ORl9GX0NPTkZfRFVNUF9GUAkJCQkgMTA0CisjZGVmaW5lIENPTkZfRl9DT05GX0xPQUQJCQkJIDEwMAorI2RlZmluZSBDT05GX0ZfQ09ORl9MT0FEX0JJTwkJCQkgMTAyCisjZGVmaW5lIENPTkZfRl9DT05GX0xPQURfRlAJCQkJIDEwMworI2RlZmluZSBDT05GX0ZfQ09ORl9NT0RVTEVTX0xPQUQJCQkgMTE2CisjZGVmaW5lIENPTkZfRl9DT05GX1BBUlNFX0xJU1QJCQkJIDExOQorI2RlZmluZSBDT05GX0ZfREVGX0xPQUQJCQkJCSAxMjAKKyNkZWZpbmUgQ09ORl9GX0RFRl9MT0FEX0JJTwkJCQkgMTIxCisjZGVmaW5lIENPTkZfRl9NT0RVTEVfSU5JVAkJCQkgMTE1CisjZGVmaW5lIENPTkZfRl9NT0RVTEVfTE9BRF9EU08JCQkJIDExNworI2RlZmluZSBDT05GX0ZfTU9EVUxFX1JVTgkJCQkgMTE4CisjZGVmaW5lIENPTkZfRl9OQ09ORl9EVU1QX0JJTwkJCQkgMTA1CisjZGVmaW5lIENPTkZfRl9OQ09ORl9EVU1QX0ZQCQkJCSAxMDYKKyNkZWZpbmUgQ09ORl9GX05DT05GX0dFVF9OVU1CRVIJCQkJIDEwNworI2RlZmluZSBDT05GX0ZfTkNPTkZfR0VUX05VTUJFUl9FCQkJIDExMgorI2RlZmluZSBDT05GX0ZfTkNPTkZfR0VUX1NFQ1RJT04JCQkgMTA4CisjZGVmaW5lIENPTkZfRl9OQ09ORl9HRVRfU1RSSU5HCQkJCSAxMDkKKyNkZWZpbmUgQ09ORl9GX05DT05GX0xPQUQJCQkJIDExMworI2RlZmluZSBDT05GX0ZfTkNPTkZfTE9BRF9CSU8JCQkJIDExMAorI2RlZmluZSBDT05GX0ZfTkNPTkZfTE9BRF9GUAkJCQkgMTE0CisjZGVmaW5lIENPTkZfRl9OQ09ORl9ORVcJCQkJIDExMQorI2RlZmluZSBDT05GX0ZfU1RSX0NPUFkJCQkJCSAxMDEKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBDT05GX1JfRVJST1JfTE9BRElOR19EU08JCQkgMTEwCisjZGVmaW5lIENPTkZfUl9MSVNUX0NBTk5PVF9CRV9OVUxMCQkJIDExNQorI2RlZmluZSBDT05GX1JfTUlTU0lOR19DTE9TRV9TUVVBUkVfQlJBQ0tFVAkJIDEwMAorI2RlZmluZSBDT05GX1JfTUlTU0lOR19FUVVBTF9TSUdOCQkJIDEwMQorI2RlZmluZSBDT05GX1JfTUlTU0lOR19GSU5JU0hfRlVOQ1RJT04JCQkgMTExCisjZGVmaW5lIENPTkZfUl9NSVNTSU5HX0lOSVRfRlVOQ1RJT04JCQkgMTEyCisjZGVmaW5lIENPTkZfUl9NT0RVTEVfSU5JVElBTElaQVRJT05fRVJST1IJCSAxMDkKKyNkZWZpbmUgQ09ORl9SX05PX0NMT1NFX0JSQUNFCQkJCSAxMDIKKyNkZWZpbmUgQ09ORl9SX05PX0NPTkYJCQkJCSAxMDUKKyNkZWZpbmUgQ09ORl9SX05PX0NPTkZfT1JfRU5WSVJPTk1FTlRfVkFSSUFCTEUJCSAxMDYKKyNkZWZpbmUgQ09ORl9SX05PX1NFQ1RJT04JCQkJIDEwNworI2RlZmluZSBDT05GX1JfTk9fU1VDSF9GSUxFCQkJCSAxMTQKKyNkZWZpbmUgQ09ORl9SX05PX1ZBTFVFCQkJCQkgMTA4CisjZGVmaW5lIENPTkZfUl9VTkFCTEVfVE9fQ1JFQVRFX05FV19TRUNUSU9OCQkgMTAzCisjZGVmaW5lIENPTkZfUl9VTktOT1dOX01PRFVMRV9OQU1FCQkJIDExMworI2RlZmluZSBDT05GX1JfVkFSSUFCTEVfSEFTX05PX1ZBTFVFCQkJIDEwNAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2NvbmZfYXBpLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvY29uZl9hcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2E5NTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2NvbmZfYXBpLmgKQEAgLTAsMCArMSw4OSBAQAorLyogY29uZl9hcGkuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmICBIRUFERVJfQ09ORl9BUElfSAorI2RlZmluZSBIRUFERVJfQ09ORl9BUElfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY29uZi5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBVcCB1bnRpbCBPcGVuU1NMIDAuOS41YSwgdGhpcyB3YXMgbmV3X3NlY3Rpb24gKi8KK0NPTkZfVkFMVUUgKl9DT05GX25ld19zZWN0aW9uKENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKnNlY3Rpb24pOworLyogVXAgdW50aWwgT3BlblNTTCAwLjkuNWEsIHRoaXMgd2FzIGdldF9zZWN0aW9uICovCitDT05GX1ZBTFVFICpfQ09ORl9nZXRfc2VjdGlvbihjb25zdCBDT05GICpjb25mLCBjb25zdCBjaGFyICpzZWN0aW9uKTsKKy8qIFVwIHVudGlsIE9wZW5TU0wgMC45LjVhLCB0aGlzIHdhcyBDT05GX2dldF9zZWN0aW9uICovCitTVEFDS19PRihDT05GX1ZBTFVFKSAqX0NPTkZfZ2V0X3NlY3Rpb25fdmFsdWVzKGNvbnN0IENPTkYgKmNvbmYsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uKTsKKworaW50IF9DT05GX2FkZF9zdHJpbmcoQ09ORiAqY29uZiwgQ09ORl9WQUxVRSAqc2VjdGlvbiwgQ09ORl9WQUxVRSAqdmFsdWUpOworY2hhciAqX0NPTkZfZ2V0X3N0cmluZyhjb25zdCBDT05GICpjb25mLCBjb25zdCBjaGFyICpzZWN0aW9uLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSk7Citsb25nIF9DT05GX2dldF9udW1iZXIoY29uc3QgQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqbmFtZSk7CisKK2ludCBfQ09ORl9uZXdfZGF0YShDT05GICpjb25mKTsKK3ZvaWQgX0NPTkZfZnJlZV9kYXRhKENPTkYgKmNvbmYpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzNjBjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaApAQCAtMCwwICsxLDU3NSBAQAorLyogY3J5cHRvL2NyeXB0by5oICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBFQ0RIIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisKKyNpZm5kZWYgSEVBREVSX0NSWVBUT19ICisjZGVmaW5lIEhFQURFUl9DUllQVE9fSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zYWZlc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2x2Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorCisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKyNpbmNsdWRlIDxvcGVuc3NsL2ViY2RpYy5oPgorI2VuZGlmCisKKy8qIFJlc29sdmUgcHJvYmxlbXMgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcyB3aXRoIHN5bWJvbCBuYW1lcyB0aGF0IGNsYXNoCisgICBvbmUgd2F5IG9yIGFub3RoZXIgKi8KKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gU1NMZWF5ICovCisvKiBUaGlzIGlzIG1vcmUgdG8gYmUgdXNlZCB0byBjaGVjayB0aGUgY29ycmVjdCBETEwgaXMgYmVpbmcgdXNlZAorICogaW4gdGhlIE1TIHdvcmxkLiAqLworI2RlZmluZSBTU0xFQVlfVkVSU0lPTl9OVU1CRVIJT1BFTlNTTF9WRVJTSU9OX05VTUJFUgorI2RlZmluZSBTU0xFQVlfVkVSU0lPTgkJMAorLyogI2RlZmluZSBTU0xFQVlfT1BUSU9OUwkxIG5vIGxvbmdlciBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1NMRUFZX0NGTEFHUwkJMgorI2RlZmluZSBTU0xFQVlfQlVJTFRfT04JCTMKKyNkZWZpbmUgU1NMRUFZX1BMQVRGT1JNCQk0CisjZGVmaW5lIFNTTEVBWV9ESVIJCTUKKworLyogQWxyZWFkeSBkZWNsYXJlZCBpbiBvc3NsX3R5cC5oICovCisjaWYgMAordHlwZWRlZiBzdHJ1Y3QgY3J5cHRvX2V4X2RhdGFfc3QgQ1JZUFRPX0VYX0RBVEE7CisvKiBDYWxsZWQgd2hlbiBhIG5ldyBvYmplY3QgaXMgY3JlYXRlZCAqLwordHlwZWRlZiBpbnQgQ1JZUFRPX0VYX25ldyh2b2lkICpwYXJlbnQsIHZvaWQgKnB0ciwgQ1JZUFRPX0VYX0RBVEEgKmFkLAorCQkJCQlpbnQgaWR4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApOworLyogQ2FsbGVkIHdoZW4gYW4gb2JqZWN0IGlzIGZyZWUoKWVkICovCit0eXBlZGVmIHZvaWQgQ1JZUFRPX0VYX2ZyZWUodm9pZCAqcGFyZW50LCB2b2lkICpwdHIsIENSWVBUT19FWF9EQVRBICphZCwKKwkJCQkJaW50IGlkeCwgbG9uZyBhcmdsLCB2b2lkICphcmdwKTsKKy8qIENhbGxlZCB3aGVuIHdlIG5lZWQgdG8gZHVwIGFuIG9iamVjdCAqLwordHlwZWRlZiBpbnQgQ1JZUFRPX0VYX2R1cChDUllQVE9fRVhfREFUQSAqdG8sIENSWVBUT19FWF9EQVRBICpmcm9tLCB2b2lkICpmcm9tX2QsIAorCQkJCQlpbnQgaWR4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApOworI2VuZGlmCisKKy8qIEEgZ2VuZXJpYyBzdHJ1Y3R1cmUgdG8gcGFzcyBhc3NvcnRlZCBkYXRhIGluIGEgZXhwYW5kYWJsZSB3YXkgKi8KK3R5cGVkZWYgc3RydWN0IG9wZW5zc2xfaXRlbV9zdAorCXsKKwlpbnQgY29kZTsKKwl2b2lkICp2YWx1ZTsJCS8qIE5vdCB1c2VkIGZvciBmbGFnIGF0dHJpYnV0ZXMgKi8KKwlzaXplX3QgdmFsdWVfc2l6ZTsJLyogTWF4IHNpemUgb2YgdmFsdWUgZm9yIG91dHB1dCwgbGVuZ3RoIGZvciBpbnB1dCAqLworCXNpemVfdCAqdmFsdWVfbGVuZ3RoOwkvKiBSZXR1cm5lZCBsZW5ndGggb2YgdmFsdWUgZm9yIG91dHB1dCAqLworCX0gT1BFTlNTTF9JVEVNOworCisKKy8qIFdoZW4gY2hhbmdpbmcgdGhlIENSWVBUT19MT0NLXyogbGlzdCwgYmUgc3VyZSB0byBtYWludGluIHRoZSB0ZXh0IGxvY2sKKyAqIG5hbWVzIGluIGNyeXB0bGliLmMKKyAqLworCisjZGVmaW5lCUNSWVBUT19MT0NLX0VSUgkJCTEKKyNkZWZpbmUJQ1JZUFRPX0xPQ0tfRVhfREFUQQkJMgorI2RlZmluZQlDUllQVE9fTE9DS19YNTA5CQkzCisjZGVmaW5lCUNSWVBUT19MT0NLX1g1MDlfSU5GTwkJNAorI2RlZmluZQlDUllQVE9fTE9DS19YNTA5X1BLRVkJCTUKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfWDUwOV9DUkwJCTYKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfWDUwOV9SRVEJCTcKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRFNBCQkJOAorI2RlZmluZSBDUllQVE9fTE9DS19SU0EJCQk5CisjZGVmaW5lIENSWVBUT19MT0NLX0VWUF9QS0VZCQkxMAorI2RlZmluZSBDUllQVE9fTE9DS19YNTA5X1NUT1JFCQkxMQorI2RlZmluZSBDUllQVE9fTE9DS19TU0xfQ1RYCQkxMgorI2RlZmluZSBDUllQVE9fTE9DS19TU0xfQ0VSVAkJMTMKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfU1NMX1NFU1NJT04JCTE0CisjZGVmaW5lIENSWVBUT19MT0NLX1NTTF9TRVNTX0NFUlQJMTUKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfU1NMCQkJMTYKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfU1NMX01FVEhPRAkJMTcKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfUkFORAkJMTgKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfUkFORDIJCTE5CisjZGVmaW5lIENSWVBUT19MT0NLX01BTExPQwkJMjAKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfQklPCQkJMjEKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfR0VUSE9TVEJZTkFNRQkyMgorI2RlZmluZSBDUllQVE9fTE9DS19HRVRTRVJWQllOQU1FCTIzCisjZGVmaW5lIENSWVBUT19MT0NLX1JFQURESVIJCTI0CisjZGVmaW5lIENSWVBUT19MT0NLX1JTQV9CTElORElORwkyNQorI2RlZmluZSBDUllQVE9fTE9DS19ESAkJCTI2CisjZGVmaW5lIENSWVBUT19MT0NLX01BTExPQzIJCTI3CisjZGVmaW5lIENSWVBUT19MT0NLX0RTTwkJCTI4CisjZGVmaW5lIENSWVBUT19MT0NLX0RZTkxPQ0sJCTI5CisjZGVmaW5lIENSWVBUT19MT0NLX0VOR0lORQkJMzAKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfVUkJCQkzMQorI2RlZmluZSBDUllQVE9fTE9DS19FQ0RTQSAgICAgICAgICAgICAgIDMyCisjZGVmaW5lIENSWVBUT19MT0NLX0VDCQkJMzMKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRUNESAkJMzQKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfQk4gIAkJMzUKKyNkZWZpbmUgQ1JZUFRPX0xPQ0tfRUNfUFJFX0NPTVAJCTM2CisjZGVmaW5lIENSWVBUT19MT0NLX1NUT1JFCQkzNworI2RlZmluZSBDUllQVE9fTE9DS19DT01QCQkzOAorI2RlZmluZSBDUllQVE9fTE9DS19GSVBTCQkzOQorI2RlZmluZSBDUllQVE9fTE9DS19GSVBTMgkJNDAKKyNkZWZpbmUgQ1JZUFRPX05VTV9MT0NLUwkJNDEKKworI2RlZmluZSBDUllQVE9fTE9DSwkJMQorI2RlZmluZSBDUllQVE9fVU5MT0NLCQkyCisjZGVmaW5lIENSWVBUT19SRUFECQk0CisjZGVmaW5lIENSWVBUT19XUklURQkJOAorCisjaWZuZGVmIE9QRU5TU0xfTk9fTE9DS0lORworI2lmbmRlZiBDUllQVE9fd19sb2NrCisjZGVmaW5lIENSWVBUT193X2xvY2sodHlwZSkJXAorCUNSWVBUT19sb2NrKENSWVBUT19MT0NLfENSWVBUT19XUklURSx0eXBlLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBDUllQVE9fd191bmxvY2sodHlwZSkJXAorCUNSWVBUT19sb2NrKENSWVBUT19VTkxPQ0t8Q1JZUFRPX1dSSVRFLHR5cGUsX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIENSWVBUT19yX2xvY2sodHlwZSkJXAorCUNSWVBUT19sb2NrKENSWVBUT19MT0NLfENSWVBUT19SRUFELHR5cGUsX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIENSWVBUT19yX3VubG9jayh0eXBlKQlcCisJQ1JZUFRPX2xvY2soQ1JZUFRPX1VOTE9DS3xDUllQVE9fUkVBRCx0eXBlLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBDUllQVE9fYWRkKGFkZHIsYW1vdW50LHR5cGUpCVwKKwlDUllQVE9fYWRkX2xvY2soYWRkcixhbW91bnQsdHlwZSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgQ1JZUFRPX3dfbG9jayhhKQorI2RlZmluZSBDUllQVE9fd191bmxvY2soYSkKKyNkZWZpbmUgQ1JZUFRPX3JfbG9jayhhKQorI2RlZmluZSBDUllQVE9fcl91bmxvY2soYSkKKyNkZWZpbmUgQ1JZUFRPX2FkZChhLGIsYykJKCgqKGEpKSs9KGIpKQorI2VuZGlmCisKKy8qIFNvbWUgYXBwbGljYXRpb25zIGFzIHdlbGwgYXMgc29tZSBwYXJ0cyBvZiBPcGVuU1NMIG5lZWQgdG8gYWxsb2NhdGUKKyAgIGFuZCBkZWFsbG9jYXRlIGxvY2tzIGluIGEgZHluYW1pYyBmYXNoaW9uLiAgVGhlIGZvbGxvd2luZyB0eXBlZGVmCisgICBtYWtlcyB0aGlzIHBvc3NpYmxlIGluIGEgdHlwZS1zYWZlIG1hbm5lci4gICovCisvKiBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgaGFzIHRvIGJlIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAqLwordHlwZWRlZiBzdHJ1Y3QKKwl7CisJaW50IHJlZmVyZW5jZXM7CisJc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpkYXRhOworCX0gQ1JZUFRPX2R5bmxvY2s7CisKKworLyogVGhlIGZvbGxvd2luZyBjYW4gYmUgdXNlZCB0byBkZXRlY3QgbWVtb3J5IGxlYWtzIGluIHRoZSBTU0xlYXkgbGlicmFyeS4KKyAqIEl0IHVzZWQsIGl0IHR1cm5zIG9uIG1hbGxvYyBjaGVja2luZyAqLworCisjZGVmaW5lIENSWVBUT19NRU1fQ0hFQ0tfT0ZGCTB4MAkvKiBhbiBlbnVtZSAqLworI2RlZmluZSBDUllQVE9fTUVNX0NIRUNLX09OCTB4MQkvKiBhIGJpdCAqLworI2RlZmluZSBDUllQVE9fTUVNX0NIRUNLX0VOQUJMRQkweDIJLyogYSBiaXQgKi8KKyNkZWZpbmUgQ1JZUFRPX01FTV9DSEVDS19ESVNBQkxFIDB4MwkvKiBhbiBlbnVtZSAqLworCisvKiBUaGUgZm9sbG93aW5nIGFyZSBiaXQgdmFsdWVzIHRvIHR1cm4gb24gb3Igb2ZmIG9wdGlvbnMgY29ubmVjdGVkIHRvIHRoZQorICogbWFsbG9jIGNoZWNraW5nIGZ1bmN0aW9uYWxpdHkgKi8KKworLyogQWRkcyB0aW1lIHRvIHRoZSBtZW1vcnkgY2hlY2tpbmcgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVl9DUllQVE9fTURFQlVHX1RJTUUJMHgxIC8qIGEgYml0ICovCisvKiBBZGRzIHRocmVhZCBudW1iZXIgdG8gdGhlIG1lbW9yeSBjaGVja2luZyBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBWX0NSWVBUT19NREVCVUdfVEhSRUFECTB4MiAvKiBhIGJpdCAqLworCisjZGVmaW5lIFZfQ1JZUFRPX01ERUJVR19BTEwgKFZfQ1JZUFRPX01ERUJVR19USU1FIHwgVl9DUllQVE9fTURFQlVHX1RIUkVBRCkKKworCisvKiBwcmVkZWMgb2YgdGhlIEJJTyB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBiaW9fc3QgQklPX2R1bW15OworCitzdHJ1Y3QgY3J5cHRvX2V4X2RhdGFfc3QKKwl7CisJU1RBQ0tfT0Yodm9pZCkgKnNrOworCWludCBkdW1teTsgLyogZ2NjIGlzIHNjcmV3aW5nIHVwIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgOi0oICovCisJfTsKK0RFQ0xBUkVfU1RBQ0tfT0Yodm9pZCkKKworLyogVGhpcyBzdHVmZiBpcyBiYXNpY2FsbHkgY2xhc3MgY2FsbGJhY2sgZnVuY3Rpb25zCisgKiBUaGUgY3VycmVudCBjbGFzc2VzIGFyZSBTU0xfQ1RYLCBTU0wsIFNTTF9TRVNTSU9OLCBhbmQgYSBmZXcgbW9yZSAqLworCit0eXBlZGVmIHN0cnVjdCBjcnlwdG9fZXhfZGF0YV9mdW5jX3N0CisJeworCWxvbmcgYXJnbDsJLyogQXJiaXRhcnkgbG9uZyAqLworCXZvaWQgKmFyZ3A7CS8qIEFyYml0YXJ5IHZvaWQgKiAqLworCUNSWVBUT19FWF9uZXcgKm5ld19mdW5jOworCUNSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmM7CisJQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmM7CisJfSBDUllQVE9fRVhfREFUQV9GVU5DUzsKKworREVDTEFSRV9TVEFDS19PRihDUllQVE9fRVhfREFUQV9GVU5DUykKKworLyogUGVyIGNsYXNzLCB3ZSBoYXZlIGEgU1RBQ0sgb2YgQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgZm9yIGVhY2ggQ1JZUFRPX0VYX0RBVEEKKyAqIGVudHJ5LgorICovCisKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX0JJTwkJMAorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfU1NMCQkxCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9TU0xfQ1RYCQkyCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9TU0xfU0VTU0lPTgkzCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9YNTA5X1NUT1JFCTQKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1g1MDlfU1RPUkVfQ1RYCTUKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX1JTQQkJNgorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfRFNBCQk3CisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9ESAkJOAorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfRU5HSU5FCQk5CisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9YNTA5CQkxMAorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfVUkJCTExCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9FQ0RTQQkJMTIKKyNkZWZpbmUgQ1JZUFRPX0VYX0lOREVYX0VDREgJCTEzCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9DT01QCQkxNAorI2RlZmluZSBDUllQVE9fRVhfSU5ERVhfU1RPUkUJCTE1CisKKy8qIER5bmFtaWNhbGx5IGFzc2lnbmVkIGluZGV4ZXMgc3RhcnQgZnJvbSB0aGlzIHZhbHVlIChkb24ndCB1c2UgZGlyZWN0bHksIHVzZQorICogdmlhIENSWVBUT19leF9kYXRhX25ld19jbGFzcykuICovCisjZGVmaW5lIENSWVBUT19FWF9JTkRFWF9VU0VSCQkxMDAKKworCisvKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGNhbGxiYWNrcywgYnV0IHdlIGNhbiBoYXZlIG90aGVycyBhcyB3ZWxsOgorICogdGhpcyBpcyBuZWVkZWQgaW4gV2luMzIgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIG1hbGxvYyBhbmQgdGhlCisgKiBsaWJyYXJ5IG1hbGxvYyBtYXkgbm90IGJlIHRoZSBzYW1lLgorICovCisjZGVmaW5lIENSWVBUT19tYWxsb2NfaW5pdCgpCUNSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyhcCisJbWFsbG9jLCByZWFsbG9jLCBmcmVlKQorCisjaWYgZGVmaW5lZCBDUllQVE9fTURFQlVHX0FMTCB8fCBkZWZpbmVkIENSWVBUT19NREVCVUdfVElNRSB8fCBkZWZpbmVkIENSWVBUT19NREVCVUdfVEhSRUFECisjIGlmbmRlZiBDUllQVE9fTURFQlVHIC8qIGF2b2lkIGR1cGxpY2F0ZSAjZGVmaW5lICovCisjICBkZWZpbmUgQ1JZUFRPX01ERUJVRworIyBlbmRpZgorI2VuZGlmCisKKy8qIFNldCBzdGFuZGFyZCBkZWJ1Z2dpbmcgZnVuY3Rpb25zIChub3QgZG9uZSBieSBkZWZhdWx0CisgKiB1bmxlc3MgQ1JZUFRPX01ERUJVRyBpcyBkZWZpbmVkKSAqLworI2RlZmluZSBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKQlkbyB7XAorCUNSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucyhcCisJCUNSWVBUT19kYmdfbWFsbG9jLFwKKwkJQ1JZUFRPX2RiZ19yZWFsbG9jLFwKKwkJQ1JZUFRPX2RiZ19mcmVlLFwKKwkJQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyxcCisJCUNSWVBUT19kYmdfZ2V0X29wdGlvbnMpO1wKKwl9IHdoaWxlKDApCisKK2ludCBDUllQVE9fbWVtX2N0cmwoaW50IG1vZGUpOworaW50IENSWVBUT19pc19tZW1fY2hlY2tfb24odm9pZCk7CisKKy8qIGZvciBhcHBsaWNhdGlvbnMgKi8KKyNkZWZpbmUgTWVtQ2hlY2tfc3RhcnQoKSBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PTikKKyNkZWZpbmUgTWVtQ2hlY2tfc3RvcCgpCUNSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX09GRikKKworLyogZm9yIGxpYnJhcnktaW50ZXJuYWwgdXNlICovCisjZGVmaW5lIE1lbUNoZWNrX29uKCkJQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfRU5BQkxFKQorI2RlZmluZSBNZW1DaGVja19vZmYoKQlDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19ESVNBQkxFKQorI2RlZmluZSBpc19NZW1DaGVja19vbigpIENSWVBUT19pc19tZW1fY2hlY2tfb24oKQorCisjZGVmaW5lIE9QRU5TU0xfbWFsbG9jKG51bSkJQ1JZUFRPX21hbGxvYygoaW50KW51bSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgT1BFTlNTTF9zdHJkdXAoc3RyKQlDUllQVE9fc3RyZHVwKChzdHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBPUEVOU1NMX3JlYWxsb2MoYWRkcixudW0pIFwKKwlDUllQVE9fcmVhbGxvYygoY2hhciAqKWFkZHIsKGludCludW0sX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIE9QRU5TU0xfcmVhbGxvY19jbGVhbihhZGRyLG9sZF9udW0sbnVtKSBcCisJQ1JZUFRPX3JlYWxsb2NfY2xlYW4oYWRkcixvbGRfbnVtLG51bSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgT1BFTlNTTF9yZW1hbGxvYyhhZGRyLG51bSkgXAorCUNSWVBUT19yZW1hbGxvYygoY2hhciAqKilhZGRyLChpbnQpbnVtLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBPUEVOU1NMX2ZyZWVGdW5jCUNSWVBUT19mcmVlCisjZGVmaW5lIE9QRU5TU0xfZnJlZShhZGRyKQlDUllQVE9fZnJlZShhZGRyKQorCisjZGVmaW5lIE9QRU5TU0xfbWFsbG9jX2xvY2tlZChudW0pIFwKKwlDUllQVE9fbWFsbG9jX2xvY2tlZCgoaW50KW51bSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgT1BFTlNTTF9mcmVlX2xvY2tlZChhZGRyKSBDUllQVE9fZnJlZV9sb2NrZWQoYWRkcikKKworCitjb25zdCBjaGFyICpTU0xlYXlfdmVyc2lvbihpbnQgdHlwZSk7Cit1bnNpZ25lZCBsb25nIFNTTGVheSh2b2lkKTsKKworaW50IE9QRU5TU0xfaXNzZXR1Z2lkKHZvaWQpOworCisvKiBBbiBvcGFxdWUgdHlwZSByZXByZXNlbnRpbmcgYW4gaW1wbGVtZW50YXRpb24gb2YgImV4X2RhdGEiIHN1cHBvcnQgKi8KK3R5cGVkZWYgc3RydWN0IHN0X0NSWVBUT19FWF9EQVRBX0lNUEwJQ1JZUFRPX0VYX0RBVEFfSU1QTDsKKy8qIFJldHVybiBhbiBvcGFxdWUgcG9pbnRlciB0byB0aGUgY3VycmVudCAiZXhfZGF0YSIgaW1wbGVtZW50YXRpb24gKi8KK2NvbnN0IENSWVBUT19FWF9EQVRBX0lNUEwgKkNSWVBUT19nZXRfZXhfZGF0YV9pbXBsZW1lbnRhdGlvbih2b2lkKTsKKy8qIFNldHMgdGhlICJleF9kYXRhIiBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIChpZiBpdCdzIG5vdCB0b28gbGF0ZSkgKi8KK2ludCBDUllQVE9fc2V0X2V4X2RhdGFfaW1wbGVtZW50YXRpb24oY29uc3QgQ1JZUFRPX0VYX0RBVEFfSU1QTCAqaSk7CisvKiBHZXQgYSBuZXcgImV4X2RhdGEiIGNsYXNzLCBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nICJjbGFzc19pbmRleCIgKi8KK2ludCBDUllQVE9fZXhfZGF0YV9uZXdfY2xhc3Modm9pZCk7CisvKiBXaXRoaW4gYSBnaXZlbiBjbGFzcywgZ2V0L3JlZ2lzdGVyIGEgbmV3IGluZGV4ICovCitpbnQgQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoaW50IGNsYXNzX2luZGV4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsCisJCUNSWVBUT19FWF9uZXcgKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywKKwkJQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CisvKiBJbml0aWFsaXNlL2R1cGxpY2F0ZS9mcmVlIENSWVBUT19FWF9EQVRBIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KKyAqIGNsYXNzIChpbnZva2VzIHdoYXRldmVyIHBlci1jbGFzcyBjYWxsYmFja3MgYXJlIGFwcGxpY2FibGUpICovCitpbnQgQ1JZUFRPX25ld19leF9kYXRhKGludCBjbGFzc19pbmRleCwgdm9pZCAqb2JqLCBDUllQVE9fRVhfREFUQSAqYWQpOworaW50IENSWVBUT19kdXBfZXhfZGF0YShpbnQgY2xhc3NfaW5kZXgsIENSWVBUT19FWF9EQVRBICp0bywKKwkJQ1JZUFRPX0VYX0RBVEEgKmZyb20pOwordm9pZCBDUllQVE9fZnJlZV9leF9kYXRhKGludCBjbGFzc19pbmRleCwgdm9pZCAqb2JqLCBDUllQVE9fRVhfREFUQSAqYWQpOworLyogR2V0L3NldCBkYXRhIGluIGEgQ1JZUFRPX0VYX0RBVEEgdmFyaWFibGUgY29ycmVzcG9uZGluZyB0byBhIHBhcnRpY3VsYXIgaW5kZXgKKyAqIChyZWxhdGl2ZSB0byB0aGUgY2xhc3MgdHlwZSBpbnZvbHZlZCkgKi8KK2ludCBDUllQVE9fc2V0X2V4X2RhdGEoQ1JZUFRPX0VYX0RBVEEgKmFkLCBpbnQgaWR4LCB2b2lkICp2YWwpOwordm9pZCAqQ1JZUFRPX2dldF9leF9kYXRhKGNvbnN0IENSWVBUT19FWF9EQVRBICphZCxpbnQgaWR4KTsKKy8qIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVwIGFsbCAiZXhfZGF0YSIgc3RhdGUuIEl0IG11c3RuJ3QgYmUgY2FsbGVkIHVuZGVyCisgKiBwb3RlbnRpYWwgcmFjZS1jb25kaXRpb25zLiAqLwordm9pZCBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSh2b2lkKTsKKworaW50IENSWVBUT19nZXRfbmV3X2xvY2tpZChjaGFyICpuYW1lKTsKKworaW50IENSWVBUT19udW1fbG9ja3Modm9pZCk7IC8qIHJldHVybiBDUllQVE9fTlVNX0xPQ0tTIChzaGFyZWQgbGlicyEpICovCit2b2lkIENSWVBUT19sb2NrKGludCBtb2RlLCBpbnQgdHlwZSxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKTsKK3ZvaWQgQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKHZvaWQgKCpmdW5jKShpbnQgbW9kZSxpbnQgdHlwZSwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSkpOwordm9pZCAoKkNSWVBUT19nZXRfbG9ja2luZ19jYWxsYmFjayh2b2lkKSkoaW50IG1vZGUsaW50IHR5cGUsY29uc3QgY2hhciAqZmlsZSwKKwkJaW50IGxpbmUpOwordm9pZCBDUllQVE9fc2V0X2FkZF9sb2NrX2NhbGxiYWNrKGludCAoKmZ1bmMpKGludCAqbnVtLGludCBtb3VudCxpbnQgdHlwZSwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpKTsKK2ludCAoKkNSWVBUT19nZXRfYWRkX2xvY2tfY2FsbGJhY2sodm9pZCkpKGludCAqbnVtLGludCBtb3VudCxpbnQgdHlwZSwKKwkJCQkJICBjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKTsKKworLyogRG9uJ3QgdXNlIHRoaXMgc3RydWN0dXJlIGRpcmVjdGx5LiAqLwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRvX3RocmVhZGlkX3N0CisJeworCXZvaWQgKnB0cjsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwl9IENSWVBUT19USFJFQURJRDsKKy8qIE9ubHkgdXNlIENSWVBUT19USFJFQURJRF9zZXRfW251bWVyaWN8cG9pbnRlcl0oKSB3aXRoaW4gY2FsbGJhY2tzICovCit2b2lkIENSWVBUT19USFJFQURJRF9zZXRfbnVtZXJpYyhDUllQVE9fVEhSRUFESUQgKmlkLCB1bnNpZ25lZCBsb25nIHZhbCk7Cit2b2lkIENSWVBUT19USFJFQURJRF9zZXRfcG9pbnRlcihDUllQVE9fVEhSRUFESUQgKmlkLCB2b2lkICpwdHIpOworaW50IENSWVBUT19USFJFQURJRF9zZXRfY2FsbGJhY2sodm9pZCAoKnRocmVhZGlkX2Z1bmMpKENSWVBUT19USFJFQURJRCAqKSk7Cit2b2lkICgqQ1JZUFRPX1RIUkVBRElEX2dldF9jYWxsYmFjayh2b2lkKSkoQ1JZUFRPX1RIUkVBRElEICopOwordm9pZCBDUllQVE9fVEhSRUFESURfY3VycmVudChDUllQVE9fVEhSRUFESUQgKmlkKTsKK2ludCBDUllQVE9fVEhSRUFESURfY21wKGNvbnN0IENSWVBUT19USFJFQURJRCAqYSwgY29uc3QgQ1JZUFRPX1RIUkVBRElEICpiKTsKK3ZvaWQgQ1JZUFRPX1RIUkVBRElEX2NweShDUllQVE9fVEhSRUFESUQgKmRlc3QsIGNvbnN0IENSWVBUT19USFJFQURJRCAqc3JjKTsKK3Vuc2lnbmVkIGxvbmcgQ1JZUFRPX1RIUkVBRElEX2hhc2goY29uc3QgQ1JZUFRPX1RIUkVBRElEICppZCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAordm9pZCBDUllQVE9fc2V0X2lkX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgKCpmdW5jKSh2b2lkKSk7Cit1bnNpZ25lZCBsb25nICgqQ1JZUFRPX2dldF9pZF9jYWxsYmFjayh2b2lkKSkodm9pZCk7Cit1bnNpZ25lZCBsb25nIENSWVBUT190aHJlYWRfaWQodm9pZCk7CisjZW5kaWYKKworY29uc3QgY2hhciAqQ1JZUFRPX2dldF9sb2NrX25hbWUoaW50IHR5cGUpOworaW50IENSWVBUT19hZGRfbG9jayhpbnQgKnBvaW50ZXIsaW50IGFtb3VudCxpbnQgdHlwZSwgY29uc3QgY2hhciAqZmlsZSwKKwkJICAgIGludCBsaW5lKTsKKworaW50IENSWVBUT19nZXRfbmV3X2R5bmxvY2tpZCh2b2lkKTsKK3ZvaWQgQ1JZUFRPX2Rlc3Ryb3lfZHlubG9ja2lkKGludCBpKTsKK3N0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqQ1JZUFRPX2dldF9keW5sb2NrX3ZhbHVlKGludCBpKTsKK3ZvaWQgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKigqZHluX2NyZWF0ZV9mdW5jdGlvbikoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpKTsKK3ZvaWQgQ1JZUFRPX3NldF9keW5sb2NrX2xvY2tfY2FsbGJhY2sodm9pZCAoKmR5bl9sb2NrX2Z1bmN0aW9uKShpbnQgbW9kZSwgc3RydWN0IENSWVBUT19keW5sb2NrX3ZhbHVlICpsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSkpOwordm9pZCBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYWxsYmFjayh2b2lkICgqZHluX2Rlc3Ryb3lfZnVuY3Rpb24pKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpKTsKK3N0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqKCpDUllQVE9fZ2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrKHZvaWQpKShjb25zdCBjaGFyICpmaWxlLGludCBsaW5lKTsKK3ZvaWQgKCpDUllQVE9fZ2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayh2b2lkKSkoaW50IG1vZGUsIHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7Cit2b2lkICgqQ1JZUFRPX2dldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sodm9pZCkpKHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqbCwgY29uc3QgY2hhciAqZmlsZSxpbnQgbGluZSk7CisKKy8qIENSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyBpbmNsdWRlcyBDUllQVE9fc2V0X2xvY2tlZF9tZW1fZnVuY3Rpb25zIC0tCisgKiBjYWxsIHRoZSBsYXR0ZXIgbGFzdCBpZiB5b3UgbmVlZCBkaWZmZXJlbnQgZnVuY3Rpb25zICovCitpbnQgQ1JZUFRPX3NldF9tZW1fZnVuY3Rpb25zKHZvaWQgKigqbSkoc2l6ZV90KSx2b2lkICooKnIpKHZvaWQgKixzaXplX3QpLCB2b2lkICgqZikodm9pZCAqKSk7CitpbnQgQ1JZUFRPX3NldF9sb2NrZWRfbWVtX2Z1bmN0aW9ucyh2b2lkICooKm0pKHNpemVfdCksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKikpOworaW50IENSWVBUT19zZXRfbWVtX2V4X2Z1bmN0aW9ucyh2b2lkICooKm0pKHNpemVfdCxjb25zdCBjaGFyICosaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKCpyKSh2b2lkICosc2l6ZV90LGNvbnN0IGNoYXIgKixpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZikodm9pZCAqKSk7CitpbnQgQ1JZUFRPX3NldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucyh2b2lkICooKm0pKHNpemVfdCxjb25zdCBjaGFyICosaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKikpOworaW50IENSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucyh2b2lkICgqbSkodm9pZCAqLGludCxjb25zdCBjaGFyICosaW50LGludCksCisJCQkJICAgdm9pZCAoKnIpKHZvaWQgKix2b2lkICosaW50LGNvbnN0IGNoYXIgKixpbnQsaW50KSwKKwkJCQkgICB2b2lkICgqZikodm9pZCAqLGludCksCisJCQkJICAgdm9pZCAoKnNvKShsb25nKSwKKwkJCQkgICBsb25nICgqZ28pKHZvaWQpKTsKK3ZvaWQgQ1JZUFRPX2dldF9tZW1fZnVuY3Rpb25zKHZvaWQgKigqKm0pKHNpemVfdCksdm9pZCAqKCoqcikodm9pZCAqLCBzaXplX3QpLCB2b2lkICgqKmYpKHZvaWQgKikpOwordm9pZCBDUllQVE9fZ2V0X2xvY2tlZF9tZW1fZnVuY3Rpb25zKHZvaWQgKigqKm0pKHNpemVfdCksIHZvaWQgKCoqZikodm9pZCAqKSk7Cit2b2lkIENSWVBUT19nZXRfbWVtX2V4X2Z1bmN0aW9ucyh2b2lkICooKiptKShzaXplX3QsY29uc3QgY2hhciAqLGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICooKipyKSh2b2lkICosIHNpemVfdCxjb25zdCBjaGFyICosaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCoqZikodm9pZCAqKSk7Cit2b2lkIENSWVBUT19nZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnModm9pZCAqKCoqbSkoc2l6ZV90LGNvbnN0IGNoYXIgKixpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCoqZikodm9pZCAqKSk7Cit2b2lkIENSWVBUT19nZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucyh2b2lkICgqKm0pKHZvaWQgKixpbnQsY29uc3QgY2hhciAqLGludCxpbnQpLAorCQkJCSAgICB2b2lkICgqKnIpKHZvaWQgKix2b2lkICosaW50LGNvbnN0IGNoYXIgKixpbnQsaW50KSwKKwkJCQkgICAgdm9pZCAoKipmKSh2b2lkICosaW50KSwKKwkJCQkgICAgdm9pZCAoKipzbykobG9uZyksCisJCQkJICAgIGxvbmcgKCoqZ28pKHZvaWQpKTsKKwordm9pZCAqQ1JZUFRPX21hbGxvY19sb2NrZWQoaW50IG51bSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwordm9pZCBDUllQVE9fZnJlZV9sb2NrZWQodm9pZCAqKTsKK3ZvaWQgKkNSWVBUT19tYWxsb2MoaW50IG51bSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworY2hhciAqQ1JZUFRPX3N0cmR1cChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK3ZvaWQgQ1JZUFRPX2ZyZWUodm9pZCAqKTsKK3ZvaWQgKkNSWVBUT19yZWFsbG9jKHZvaWQgKmFkZHIsaW50IG51bSwgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwordm9pZCAqQ1JZUFRPX3JlYWxsb2NfY2xlYW4odm9pZCAqYWRkcixpbnQgb2xkX251bSxpbnQgbnVtLGNvbnN0IGNoYXIgKmZpbGUsCisJCQkgICBpbnQgbGluZSk7Cit2b2lkICpDUllQVE9fcmVtYWxsb2Modm9pZCAqYWRkcixpbnQgbnVtLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CisKK3ZvaWQgT1BFTlNTTF9jbGVhbnNlKHZvaWQgKnB0ciwgc2l6ZV90IGxlbik7CisKK3ZvaWQgQ1JZUFRPX3NldF9tZW1fZGVidWdfb3B0aW9ucyhsb25nIGJpdHMpOworbG9uZyBDUllQVE9fZ2V0X21lbV9kZWJ1Z19vcHRpb25zKHZvaWQpOworCisjZGVmaW5lIENSWVBUT19wdXNoX2luZm8oaW5mbykgXAorICAgICAgICBDUllQVE9fcHVzaF9pbmZvXyhpbmZvLCBfX0ZJTEVfXywgX19MSU5FX18pOworaW50IENSWVBUT19wdXNoX2luZm9fKGNvbnN0IGNoYXIgKmluZm8sIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKTsKK2ludCBDUllQVE9fcG9wX2luZm8odm9pZCk7CitpbnQgQ1JZUFRPX3JlbW92ZV9hbGxfaW5mbyh2b2lkKTsKKworCisvKiBEZWZhdWx0IGRlYnVnZ2luZyBmdW5jdGlvbnMgKGVuYWJsZWQgYnkgQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCkgbWFjcm87CisgKiB1c2VkIGFzIGRlZmF1bHQgaW4gQ1JZUFRPX01ERUJVRyBjb21waWxhdGlvbnMpOiAqLworLyogVGhlIGxhc3QgYXJndW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgc2lnbmlmaWNhbmNlOgorICoKKyAqIDA6CWNhbGxlZCBiZWZvcmUgdGhlIGFjdHVhbCBtZW1vcnkgYWxsb2NhdGlvbiBoYXMgdGFrZW4gcGxhY2UKKyAqIDE6CWNhbGxlZCBhZnRlciB0aGUgYWN0dWFsIG1lbW9yeSBhbGxvY2F0aW9uIGhhcyB0YWtlbiBwbGFjZQorICovCit2b2lkIENSWVBUT19kYmdfbWFsbG9jKHZvaWQgKmFkZHIsaW50IG51bSxjb25zdCBjaGFyICpmaWxlLGludCBsaW5lLGludCBiZWZvcmVfcCk7Cit2b2lkIENSWVBUT19kYmdfcmVhbGxvYyh2b2lkICphZGRyMSx2b2lkICphZGRyMixpbnQgbnVtLGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUsaW50IGJlZm9yZV9wKTsKK3ZvaWQgQ1JZUFRPX2RiZ19mcmVlKHZvaWQgKmFkZHIsaW50IGJlZm9yZV9wKTsKKy8qIFRlbGwgdGhlIGRlYnVnZ2luZyBjb2RlIGFib3V0IG9wdGlvbnMuICBCeSBkZWZhdWx0LCB0aGUgZm9sbG93aW5nIHZhbHVlcworICogYXBwbHk6CisgKgorICogMDogICAgICAgICAgICAgICAgICAgICAgICAgICBDbGVhciBhbGwgb3B0aW9ucy4KKyAqIFZfQ1JZUFRPX01ERUJVR19USU1FICgxKTogICAgU2V0IHRoZSAiU2hvdyBUaW1lIiBvcHRpb24uCisgKiBWX0NSWVBUT19NREVCVUdfVEhSRUFEICgyKTogIFNldCB0aGUgIlNob3cgVGhyZWFkIE51bWJlciIgb3B0aW9uLgorICogVl9DUllQVE9fTURFQlVHX0FMTCAoMyk6ICAgICAxICsgMgorICovCit2b2lkIENSWVBUT19kYmdfc2V0X29wdGlvbnMobG9uZyBiaXRzKTsKK2xvbmcgQ1JZUFRPX2RiZ19nZXRfb3B0aW9ucyh2b2lkKTsKKworCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCit2b2lkIENSWVBUT19tZW1fbGVha3NfZnAoRklMRSAqKTsKKyNlbmRpZgordm9pZCBDUllQVE9fbWVtX2xlYWtzKHN0cnVjdCBiaW9fc3QgKmJpbyk7CisvKiB1bnNpZ25lZCBsb25nIG9yZGVyLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IG51bV9ieXRlcywgY2hhciAqYWRkciAqLwordHlwZWRlZiB2b2lkICpDUllQVE9fTUVNX0xFQUtfQ0IodW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqLCBpbnQsIGludCwgdm9pZCAqKTsKK3ZvaWQgQ1JZUFRPX21lbV9sZWFrc19jYihDUllQVE9fTUVNX0xFQUtfQ0IgKmNiKTsKKworLyogZGllIGlmIHdlIGhhdmUgdG8gKi8KK3ZvaWQgT3BlblNTTERpZShjb25zdCBjaGFyICpmaWxlLGludCBsaW5lLGNvbnN0IGNoYXIgKmFzc2VydGlvbik7CisjZGVmaW5lIE9QRU5TU0xfYXNzZXJ0KGUpICAgICAgICh2b2lkKSgoZSkgPyAwIDogKE9wZW5TU0xEaWUoX19GSUxFX18sIF9fTElORV9fLCAjZSksMSkpCisKK3Vuc2lnbmVkIGxvbmcgKk9QRU5TU0xfaWEzMmNhcF9sb2Modm9pZCk7CisjZGVmaW5lIE9QRU5TU0xfaWEzMmNhcCAoKihPUEVOU1NMX2lhMzJjYXBfbG9jKCkpKQoraW50IE9QRU5TU0xfaXNzZXJ2aWNlKHZvaWQpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0NSWVBUT19zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIENSWVBUTyBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBDUllQVE9fRl9DUllQVE9fR0VUX0VYX05FV19JTkRFWAkJIDEwMAorI2RlZmluZSBDUllQVE9fRl9DUllQVE9fR0VUX05FV19EWU5MT0NLSUQJCSAxMDMKKyNkZWZpbmUgQ1JZUFRPX0ZfQ1JZUFRPX0dFVF9ORVdfTE9DS0lECQkJIDEwMQorI2RlZmluZSBDUllQVE9fRl9DUllQVE9fU0VUX0VYX0RBVEEJCQkgMTAyCisjZGVmaW5lIENSWVBUT19GX0RFRl9BRERfSU5ERVgJCQkJIDEwNAorI2RlZmluZSBDUllQVE9fRl9ERUZfR0VUX0NMQVNTCQkJCSAxMDUKKyNkZWZpbmUgQ1JZUFRPX0ZfSU5UX0RVUF9FWF9EQVRBCQkJIDEwNgorI2RlZmluZSBDUllQVE9fRl9JTlRfRlJFRV9FWF9EQVRBCQkJIDEwNworI2RlZmluZSBDUllQVE9fRl9JTlRfTkVXX0VYX0RBVEEJCQkgMTA4CisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgQ1JZUFRPX1JfTk9fRFlOTE9DS19DUkVBVEVfQ0FMTEJBQ0sJCSAxMDAKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9kZXMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmI2NjYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2Rlcy5oCkBAIC0wLDAgKzEsMjQ1IEBACisvKiBjcnlwdG8vZGVzL2Rlcy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX05FV19ERVNfSAorI2RlZmluZSBIRUFERVJfTkVXX0RFU19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CS8qIE9QRU5TU0xfRVhURVJOLCBPUEVOU1NMX05PX0RFUywKKwkJCQkgICBERVNfTE9ORyAodmlhIG9wZW5zc2wvb3BlbnNzbGNvbmYuaCAqLworCisjaWZkZWYgT1BFTlNTTF9OT19ERVMKKyNlcnJvciBERVMgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfQlVJTERfU0hMSUJDUllQVE8KKyMgdW5kZWYgT1BFTlNTTF9FWFRFUk4KKyMgZGVmaW5lIE9QRU5TU0xfRVhURVJOIE9QRU5TU0xfRVhQT1JUCisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIERFU19jYmxvY2tbOF07Cit0eXBlZGVmIC8qIGNvbnN0ICovIHVuc2lnbmVkIGNoYXIgY29uc3RfREVTX2NibG9ja1s4XTsKKy8qIFdpdGggImNvbnN0IiwgZ2NjIDIuOC4xIG9uIFNvbGFyaXMgdGhpbmtzIHRoYXQgREVTX2NibG9jayAqCisgKiBhbmQgY29uc3RfREVTX2NibG9jayAqIGFyZSBpbmNvbXBhdGlibGUgcG9pbnRlciB0eXBlcy4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgREVTX2tzCisgICAgeworICAgIHVuaW9uCisJeworCURFU19jYmxvY2sgY2Jsb2NrOworCS8qIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIGNvcnJlY3Qgc2l6ZSBvbiBtYWNoaW5lcyB3aXRoCisJICogOCBieXRlIGxvbmdzICovCisJREVTX0xPTkcgZGVzbG9uZ1syXTsKKwl9IGtzWzE2XTsKKyAgICB9IERFU19rZXlfc2NoZWR1bGU7CisKKyNpZm5kZWYgT1BFTlNTTF9ESVNBQkxFX09MRF9ERVNfU1VQUE9SVAorIyBpZm5kZWYgT1BFTlNTTF9FTkFCTEVfT0xEX0RFU19TVVBQT1JUCisjICBkZWZpbmUgT1BFTlNTTF9FTkFCTEVfT0xEX0RFU19TVVBQT1JUCisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfRU5BQkxFX09MRF9ERVNfU1VQUE9SVAorIyBpbmNsdWRlIDxvcGVuc3NsL2Rlc19vbGQuaD4KKyNlbmRpZgorCisjZGVmaW5lIERFU19LRVlfU1ogCShzaXplb2YoREVTX2NibG9jaykpCisjZGVmaW5lIERFU19TQ0hFRFVMRV9TWiAoc2l6ZW9mKERFU19rZXlfc2NoZWR1bGUpKQorCisjZGVmaW5lIERFU19FTkNSWVBUCTEKKyNkZWZpbmUgREVTX0RFQ1JZUFQJMAorCisjZGVmaW5lIERFU19DQkNfTU9ERQkwCisjZGVmaW5lIERFU19QQ0JDX01PREUJMQorCisjZGVmaW5lIERFU19lY2IyX2VuY3J5cHQoaSxvLGsxLGsyLGUpIFwKKwlERVNfZWNiM19lbmNyeXB0KChpKSwobyksKGsxKSwoazIpLChrMSksKGUpKQorCisjZGVmaW5lIERFU19lZGUyX2NiY19lbmNyeXB0KGksbyxsLGsxLGsyLGl2LGUpIFwKKwlERVNfZWRlM19jYmNfZW5jcnlwdCgoaSksKG8pLChsKSwoazEpLChrMiksKGsxKSwoaXYpLChlKSkKKworI2RlZmluZSBERVNfZWRlMl9jZmI2NF9lbmNyeXB0KGksbyxsLGsxLGsyLGl2LG4sZSkgXAorCURFU19lZGUzX2NmYjY0X2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMSksKGl2KSwobiksKGUpKQorCisjZGVmaW5lIERFU19lZGUyX29mYjY0X2VuY3J5cHQoaSxvLGwsazEsazIsaXYsbikgXAorCURFU19lZGUzX29mYjY0X2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMSksKGl2KSwobikpCisKK09QRU5TU0xfREVDTEFSRV9HTE9CQUwoaW50LERFU19jaGVja19rZXkpOwkvKiBkZWZhdWx0cyB0byBmYWxzZSAqLworI2RlZmluZSBERVNfY2hlY2tfa2V5IE9QRU5TU0xfR0xPQkFMX1JFRihERVNfY2hlY2tfa2V5KQorT1BFTlNTTF9ERUNMQVJFX0dMT0JBTChpbnQsREVTX3J3X21vZGUpOwkvKiBkZWZhdWx0cyB0byBERVNfUENCQ19NT0RFICovCisjZGVmaW5lIERFU19yd19tb2RlIE9QRU5TU0xfR0xPQkFMX1JFRihERVNfcndfbW9kZSkKKworY29uc3QgY2hhciAqREVTX29wdGlvbnModm9pZCk7Cit2b2lkIERFU19lY2IzX2VuY3J5cHQoY29uc3RfREVTX2NibG9jayAqaW5wdXQsIERFU19jYmxvY2sgKm91dHB1dCwKKwkJICAgICAgREVTX2tleV9zY2hlZHVsZSAqa3MxLERFU19rZXlfc2NoZWR1bGUgKmtzMiwKKwkJICAgICAgREVTX2tleV9zY2hlZHVsZSAqa3MzLCBpbnQgZW5jKTsKK0RFU19MT05HIERFU19jYmNfY2tzdW0oY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsREVTX2NibG9jayAqb3V0cHV0LAorCQkgICAgICAgbG9uZyBsZW5ndGgsREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUsCisJCSAgICAgICBjb25zdF9ERVNfY2Jsb2NrICppdmVjKTsKKy8qIERFU19jYmNfZW5jcnlwdCBkb2VzIG5vdCB1cGRhdGUgdGhlIElWISAgVXNlIERFU19uY2JjX2VuY3J5cHQgaW5zdGVhZC4gKi8KK3ZvaWQgREVTX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LHVuc2lnbmVkIGNoYXIgKm91dHB1dCwKKwkJICAgICBsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSxERVNfY2Jsb2NrICppdmVjLAorCQkgICAgIGludCBlbmMpOwordm9pZCBERVNfbmNiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LHVuc2lnbmVkIGNoYXIgKm91dHB1dCwKKwkJICAgICAgbG9uZyBsZW5ndGgsREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUsREVTX2NibG9jayAqaXZlYywKKwkJICAgICAgaW50IGVuYyk7Cit2b2lkIERFU194Y2JjX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsdW5zaWduZWQgY2hhciAqb3V0cHV0LAorCQkgICAgICBsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSxERVNfY2Jsb2NrICppdmVjLAorCQkgICAgICBjb25zdF9ERVNfY2Jsb2NrICppbncsY29uc3RfREVTX2NibG9jayAqb3V0dyxpbnQgZW5jKTsKK3ZvaWQgREVTX2NmYl9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgbnVtYml0cywKKwkJICAgICBsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSxERVNfY2Jsb2NrICppdmVjLAorCQkgICAgIGludCBlbmMpOwordm9pZCBERVNfZWNiX2VuY3J5cHQoY29uc3RfREVTX2NibG9jayAqaW5wdXQsREVTX2NibG9jayAqb3V0cHV0LAorCQkgICAgIERFU19rZXlfc2NoZWR1bGUgKmtzLGludCBlbmMpOworCisvKiAJVGhpcyBpcyB0aGUgREVTIGVuY3J5cHRpb24gZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBieSBqdXN0IGFib3V0CisJZXZlcnkgb3RoZXIgREVTIHJvdXRpbmUgaW4gdGhlIGxpYnJhcnkuICBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcworCWZ1bmN0aW9uIGV4Y2VwdCB0byBpbXBsZW1lbnQgJ21vZGVzJyBvZiBERVMuICBJIHNheSB0aGlzIGJlY2F1c2UgdGhlCisJZnVuY3Rpb25zIHRoYXQgY2FsbCB0aGlzIHJvdXRpbmUgZG8gdGhlIGNvbnZlcnNpb24gZnJvbSAnY2hhciAqJyB0bworCWxvbmcsIGFuZCB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgdG8gbWFrZSBzdXJlICdub24tYWxpZ25lZCcgbWVtb3J5CisJYWNjZXNzIGRvIG5vdCBvY2N1ci4gIFRoZSBjaGFyYWN0ZXJzIGFyZSBsb2FkZWQgJ2xpdHRsZSBlbmRpYW4nLgorCURhdGEgaXMgYSBwb2ludGVyIHRvIDIgdW5zaWduZWQgbG9uZydzIGFuZCBrcyBpcyB0aGUKKwlERVNfa2V5X3NjaGVkdWxlIHRvIHVzZS4gIGVuYywgaXMgbm9uIHplcm8gc3BlY2lmaWVzIGVuY3J5cHRpb24sCisJemVybyBpZiBkZWNyeXB0aW9uLiAqLwordm9pZCBERVNfZW5jcnlwdDEoREVTX0xPTkcgKmRhdGEsREVTX2tleV9zY2hlZHVsZSAqa3MsIGludCBlbmMpOworCisvKiAJVGhpcyBmdW5jdGlvbnMgaXMgdGhlIHNhbWUgYXMgREVTX2VuY3J5cHQxKCkgZXhjZXB0IHRoYXQgdGhlIERFUworCWluaXRpYWwgcGVybXV0YXRpb24gKElQKSBhbmQgZmluYWwgcGVybXV0YXRpb24gKEZQKSBoYXZlIGJlZW4gbGVmdAorCW91dC4gIEFzIGZvciBERVNfZW5jcnlwdDEoKSwgeW91IHNob3VsZCBub3QgdXNlIHRoaXMgZnVuY3Rpb24uCisJSXQgaXMgdXNlZCBieSB0aGUgcm91dGluZXMgaW4gdGhlIGxpYnJhcnkgdGhhdCBpbXBsZW1lbnQgdHJpcGxlIERFUy4KKwlJUCgpIERFU19lbmNyeXB0MigpIERFU19lbmNyeXB0MigpIERFU19lbmNyeXB0MigpIEZQKCkgaXMgdGhlIHNhbWUKKwlhcyBERVNfZW5jcnlwdDEoKSBERVNfZW5jcnlwdDEoKSBERVNfZW5jcnlwdDEoKSBleGNlcHQgZmFzdGVyIDotKS4gKi8KK3ZvaWQgREVTX2VuY3J5cHQyKERFU19MT05HICpkYXRhLERFU19rZXlfc2NoZWR1bGUgKmtzLCBpbnQgZW5jKTsKKwordm9pZCBERVNfZW5jcnlwdDMoREVTX0xPTkcgKmRhdGEsIERFU19rZXlfc2NoZWR1bGUgKmtzMSwKKwkJICBERVNfa2V5X3NjaGVkdWxlICprczIsIERFU19rZXlfc2NoZWR1bGUgKmtzMyk7Cit2b2lkIERFU19kZWNyeXB0MyhERVNfTE9ORyAqZGF0YSwgREVTX2tleV9zY2hlZHVsZSAqa3MxLAorCQkgIERFU19rZXlfc2NoZWR1bGUgKmtzMiwgREVTX2tleV9zY2hlZHVsZSAqa3MzKTsKK3ZvaWQgREVTX2VkZTNfY2JjX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsdW5zaWduZWQgY2hhciAqb3V0cHV0LCAKKwkJCSAgbG9uZyBsZW5ndGgsCisJCQkgIERFU19rZXlfc2NoZWR1bGUgKmtzMSxERVNfa2V5X3NjaGVkdWxlICprczIsCisJCQkgIERFU19rZXlfc2NoZWR1bGUgKmtzMyxERVNfY2Jsb2NrICppdmVjLGludCBlbmMpOwordm9pZCBERVNfZWRlM19jYmNtX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgbG9uZyBsZW5ndGgsCisJCQkgICBERVNfa2V5X3NjaGVkdWxlICprczEsREVTX2tleV9zY2hlZHVsZSAqa3MyLAorCQkJICAgREVTX2tleV9zY2hlZHVsZSAqa3MzLAorCQkJICAgREVTX2NibG9jayAqaXZlYzEsREVTX2NibG9jayAqaXZlYzIsCisJCQkgICBpbnQgZW5jKTsKK3ZvaWQgREVTX2VkZTNfY2ZiNjRfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsCisJCQkgICAgbG9uZyBsZW5ndGgsREVTX2tleV9zY2hlZHVsZSAqa3MxLAorCQkJICAgIERFU19rZXlfc2NoZWR1bGUgKmtzMixERVNfa2V5X3NjaGVkdWxlICprczMsCisJCQkgICAgREVTX2NibG9jayAqaXZlYyxpbnQgKm51bSxpbnQgZW5jKTsKK3ZvaWQgREVTX2VkZTNfY2ZiX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICBpbnQgbnVtYml0cyxsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICprczEsCisJCQkgIERFU19rZXlfc2NoZWR1bGUgKmtzMixERVNfa2V5X3NjaGVkdWxlICprczMsCisJCQkgIERFU19jYmxvY2sgKml2ZWMsaW50IGVuYyk7Cit2b2lkIERFU19lZGUzX29mYjY0X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sdW5zaWduZWQgY2hhciAqb3V0LAorCQkJICAgIGxvbmcgbGVuZ3RoLERFU19rZXlfc2NoZWR1bGUgKmtzMSwKKwkJCSAgICBERVNfa2V5X3NjaGVkdWxlICprczIsREVTX2tleV9zY2hlZHVsZSAqa3MzLAorCQkJICAgIERFU19jYmxvY2sgKml2ZWMsaW50ICpudW0pOworI2lmIDAKK3ZvaWQgREVTX3h3aGl0ZV9pbjJvdXQoY29uc3RfREVTX2NibG9jayAqREVTX2tleSxjb25zdF9ERVNfY2Jsb2NrICppbl93aGl0ZSwKKwkJICAgICAgIERFU19jYmxvY2sgKm91dF93aGl0ZSk7CisjZW5kaWYKKworaW50IERFU19lbmNfcmVhZChpbnQgZmQsdm9pZCAqYnVmLGludCBsZW4sREVTX2tleV9zY2hlZHVsZSAqc2NoZWQsCisJCSBERVNfY2Jsb2NrICppdik7CitpbnQgREVTX2VuY193cml0ZShpbnQgZmQsY29uc3Qgdm9pZCAqYnVmLGludCBsZW4sREVTX2tleV9zY2hlZHVsZSAqc2NoZWQsCisJCSAgREVTX2NibG9jayAqaXYpOworY2hhciAqREVTX2ZjcnlwdChjb25zdCBjaGFyICpidWYsY29uc3QgY2hhciAqc2FsdCwgY2hhciAqcmV0KTsKK2NoYXIgKkRFU19jcnlwdChjb25zdCBjaGFyICpidWYsY29uc3QgY2hhciAqc2FsdCk7Cit2b2lkIERFU19vZmJfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsaW50IG51bWJpdHMsCisJCSAgICAgbG9uZyBsZW5ndGgsREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUsREVTX2NibG9jayAqaXZlYyk7Cit2b2lkIERFU19wY2JjX2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsdW5zaWduZWQgY2hhciAqb3V0cHV0LAorCQkgICAgICBsb25nIGxlbmd0aCxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSxERVNfY2Jsb2NrICppdmVjLAorCQkgICAgICBpbnQgZW5jKTsKK0RFU19MT05HIERFU19xdWFkX2Nrc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LERFU19jYmxvY2sgb3V0cHV0W10sCisJCQlsb25nIGxlbmd0aCxpbnQgb3V0X2NvdW50LERFU19jYmxvY2sgKnNlZWQpOworaW50IERFU19yYW5kb21fa2V5KERFU19jYmxvY2sgKnJldCk7Cit2b2lkIERFU19zZXRfb2RkX3Bhcml0eShERVNfY2Jsb2NrICprZXkpOworaW50IERFU19jaGVja19rZXlfcGFyaXR5KGNvbnN0X0RFU19jYmxvY2sgKmtleSk7CitpbnQgREVTX2lzX3dlYWtfa2V5KGNvbnN0X0RFU19jYmxvY2sgKmtleSk7CisvKiBERVNfc2V0X2tleSAoPSBzZXRfa2V5ID0gREVTX2tleV9zY2hlZCA9IGtleV9zY2hlZCkgY2FsbHMKKyAqIERFU19zZXRfa2V5X2NoZWNrZWQgaWYgZ2xvYmFsIHZhcmlhYmxlIERFU19jaGVja19rZXkgaXMgc2V0LAorICogREVTX3NldF9rZXlfdW5jaGVja2VkIG90aGVyd2lzZS4gKi8KK2ludCBERVNfc2V0X2tleShjb25zdF9ERVNfY2Jsb2NrICprZXksREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUpOworaW50IERFU19rZXlfc2NoZWQoY29uc3RfREVTX2NibG9jayAqa2V5LERFU19rZXlfc2NoZWR1bGUgKnNjaGVkdWxlKTsKK2ludCBERVNfc2V0X2tleV9jaGVja2VkKGNvbnN0X0RFU19jYmxvY2sgKmtleSxERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSk7Cit2b2lkIERFU19zZXRfa2V5X3VuY2hlY2tlZChjb25zdF9ERVNfY2Jsb2NrICprZXksREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUpOwordm9pZCBERVNfc3RyaW5nX3RvX2tleShjb25zdCBjaGFyICpzdHIsREVTX2NibG9jayAqa2V5KTsKK3ZvaWQgREVTX3N0cmluZ190b18ya2V5cyhjb25zdCBjaGFyICpzdHIsREVTX2NibG9jayAqa2V5MSxERVNfY2Jsb2NrICprZXkyKTsKK3ZvaWQgREVTX2NmYjY0X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sdW5zaWduZWQgY2hhciAqb3V0LGxvbmcgbGVuZ3RoLAorCQkgICAgICAgREVTX2tleV9zY2hlZHVsZSAqc2NoZWR1bGUsREVTX2NibG9jayAqaXZlYyxpbnQgKm51bSwKKwkJICAgICAgIGludCBlbmMpOwordm9pZCBERVNfb2ZiNjRfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsbG9uZyBsZW5ndGgsCisJCSAgICAgICBERVNfa2V5X3NjaGVkdWxlICpzY2hlZHVsZSxERVNfY2Jsb2NrICppdmVjLGludCAqbnVtKTsKKworaW50IERFU19yZWFkX3Bhc3N3b3JkKERFU19jYmxvY2sgKmtleSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgdmVyaWZ5KTsKK2ludCBERVNfcmVhZF8ycGFzc3dvcmRzKERFU19jYmxvY2sgKmtleTEsIERFU19jYmxvY2sgKmtleTIsIGNvbnN0IGNoYXIgKnByb21wdCwKKwlpbnQgdmVyaWZ5KTsKKworI2RlZmluZSBERVNfZml4dXBfa2V5X3Bhcml0eSBERVNfc2V0X29kZF9wYXJpdHkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2Rlc19vbGQuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9kZXNfb2xkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyYzM3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9kZXNfb2xkLmgKQEAgLTAsMCArMSw0NDYgQEAKKy8qIGNyeXB0by9kZXMvZGVzX29sZC5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisKKy8qIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORworICoKKyAqIFRoZSBmdW5jdGlvbiBuYW1lcyBpbiBoZXJlIGFyZSBkZXByZWNhdGVkIGFuZCBhcmUgb25seSBwcmVzZW50IHRvCisgKiBwcm92aWRlIGFuIGludGVyZmFjZSBjb21wYXRpYmxlIHdpdGggb3BlbnNzbCAwLjkuNiBhbmQgb2xkZXIgYXMKKyAqIHdlbGwgYXMgbGliZGVzLiAgT3BlblNTTCBub3cgcHJvdmlkZXMgZnVuY3Rpb25zIHdoZXJlICJkZXNfIiBoYXMKKyAqIGJlZW4gcmVwbGFjZWQgd2l0aCAiREVTXyIgaW4gdGhlIG5hbWVzLCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvCisgKiBtYWtlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRoYXQgYXJlIG5lZWRlZCBmb3IgQyB0eXBlIHNlY3VyaXR5IGFuZAorICogb3RoZXIgc3R1ZmYuCisgKgorICogVGhpcyBpbmNsdWRlIGZpbGVzIGhhcyB0d28gY29tcGF0aWJpbGl0eSBtb2RlczoKKyAqCisgKiAgIC0gSWYgT1BFTlNTTF9ERVNfTElCREVTX0NPTVBBVElCSUxJVFkgaXMgZGVmaW5lZCwgeW91IGdldCBhbiBBUEkKKyAqICAgICB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aCBsaWJkZXMgYW5kIFNTTGVheS4KKyAqICAgLSBJZiBPUEVOU1NMX0RFU19MSUJERVNfQ09NUEFUSUJJTElUWSBpc24ndCBkZWZpbmVkLCB5b3UgZ2V0IGFuCisgKiAgICAgQVBJIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIE9wZW5TU0wgMC45LjV4IHRvIDAuOS42eC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2UgbW9kZXMgYnJlYWsgZWFybGllciBzbmFwc2hvdHMgb2YgT3BlblNTTCwgd2hlcmUKKyAqIGxpYmRlcyBjb21wYXRpYmlsaXR5IHdhcyB0aGUgb25seSBhdmFpbGFibGUgbW9kZSBvciAobGF0ZXIgb24pIHRoZQorICogcHJlZmVyZWQgY29tcGF0aWJpbGl0eSBtb2RlLiAgSG93ZXZlciwgYWZ0ZXIgbXVjaCBjb25zaWRlcmF0aW9uCisgKiAoYW5kIG1vcmUgb3IgbGVzcyB2aW9sZW50IGRpc2N1c3Npb25zIHdpdGggZXh0ZXJuYWwgcGFydGllcyksIGl0CisgKiB3YXMgY29uY2x1ZGVkIHRoYXQgT3BlblNTTCBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMKKyAqIG9mIGl0c2VsZiBiZWZvcmUgYW55dGhpbmcgZWxzZS4gIEFsc28sIGluIGFsbCBob25lc3R5LCBsaWJkZXMgaXMKKyAqIGFuIG9sZCBiZWFzdCB0aGF0IHNob3VsZG4ndCByZWFsbHkgYmUgdXNlZCBhbnkgbW9yZS4KKyAqCisgKiBQbGVhc2UgY29uc2lkZXIgc3RhcnRpbmcgdG8gdXNlIHRoZSBERVNfIGZ1bmN0aW9ucyByYXRoZXIgdGhhbiB0aGUKKyAqIGRlc18gb25lcy4gIFRoZSBkZXNfIGZ1bmN0aW9ucyB3aWxsIGRpc2FwcGVhciBjb21wbGV0ZWx5IGJlZm9yZQorICogT3BlblNTTCAxLjAhCisgKgorICogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgV0FSTklORyBXQVJOSU5HCisgKi8KKworLyogV3JpdHRlbiBieSBSaWNoYXJkIExldml0dGUgKHJpY2hhcmRAbGV2aXR0ZS5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAxLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfREVTX0gKKyNkZWZpbmUgSEVBREVSX0RFU19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CS8qIE9QRU5TU0xfRVhURVJOLCBPUEVOU1NMX05PX0RFUywgREVTX0xPTkcgKi8KKworI2lmZGVmIE9QRU5TU0xfTk9fREVTCisjZXJyb3IgREVTIGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpZm5kZWYgSEVBREVSX05FV19ERVNfSAorI2Vycm9yIFlvdSBtdXN0IGluY2x1ZGUgZGVzLmgsIG5vdCBkZXNfb2xkLmggZGlyZWN0bHkuCisjZW5kaWYKKworI2lmZGVmIF9LRVJCRVJPU19ERVNfSAorI2Vycm9yIDxvcGVuc3NsL2Rlc19vbGQuaD4gcmVwbGFjZXMgPGtlcmJlcm9zL2Rlcy5oPi4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9zeW1oYWNrcy5oPgorCisjaWZkZWYgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTworIyB1bmRlZiBPUEVOU1NMX0VYVEVSTgorIyBkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9FWFBPUlQKKyNlbmRpZgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgXworI3VuZGVmIF8KKyNlbmRpZgorCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgX29zc2xfb2xkX2Rlc19jYmxvY2tbOF07Cit0eXBlZGVmIHN0cnVjdCBfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdAorCXsKKwl1bmlvbgl7CisJCV9vc3NsX29sZF9kZXNfY2Jsb2NrIF87CisJCS8qIG1ha2Ugc3VyZSB0aGluZ3MgYXJlIGNvcnJlY3Qgc2l6ZSBvbiBtYWNoaW5lcyB3aXRoCisJCSAqIDggYnl0ZSBsb25ncyAqLworCQlERVNfTE9ORyBwYWRbMl07CisJCX0ga3M7CisJfSBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZVsxNl07CisKKyNpZm5kZWYgT1BFTlNTTF9ERVNfTElCREVTX0NPTVBBVElCSUxJVFkKKyNkZWZpbmUgZGVzX2NibG9jayBERVNfY2Jsb2NrCisjZGVmaW5lIGNvbnN0X2Rlc19jYmxvY2sgY29uc3RfREVTX2NibG9jaworI2RlZmluZSBkZXNfa2V5X3NjaGVkdWxlIERFU19rZXlfc2NoZWR1bGUKKyNkZWZpbmUgZGVzX2VjYjNfZW5jcnlwdChpLG8sazEsazIsazMsZSlcCisJREVTX2VjYjNfZW5jcnlwdCgoaSksKG8pLCYoazEpLCYoazIpLCYoazMpLChlKSkKKyNkZWZpbmUgZGVzX2VkZTNfY2JjX2VuY3J5cHQoaSxvLGwsazEsazIsazMsaXYsZSlcCisJREVTX2VkZTNfY2JjX2VuY3J5cHQoKGkpLChvKSwobCksJihrMSksJihrMiksJihrMyksKGl2KSwoZSkpCisjZGVmaW5lIGRlc19lZGUzX2NiY21fZW5jcnlwdChpLG8sbCxrMSxrMixrMyxpdjEsaXYyLGUpXAorCURFU19lZGUzX2NiY21fZW5jcnlwdCgoaSksKG8pLChsKSwmKGsxKSwmKGsyKSwmKGszKSwoaXYxKSwoaXYyKSwoZSkpCisjZGVmaW5lIGRlc19lZGUzX2NmYjY0X2VuY3J5cHQoaSxvLGwsazEsazIsazMsaXYsbixlKVwKKwlERVNfZWRlM19jZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLCYoazEpLCYoazIpLCYoazMpLChpdiksKG4pLChlKSkKKyNkZWZpbmUgZGVzX2VkZTNfb2ZiNjRfZW5jcnlwdChpLG8sbCxrMSxrMixrMyxpdixuKVwKKwlERVNfZWRlM19vZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLCYoazEpLCYoazIpLCYoazMpLChpdiksKG4pKQorI2RlZmluZSBkZXNfb3B0aW9ucygpXAorCURFU19vcHRpb25zKCkKKyNkZWZpbmUgZGVzX2NiY19ja3N1bShpLG8sbCxrLGl2KVwKKwlERVNfY2JjX2Nrc3VtKChpKSwobyksKGwpLCYoayksKGl2KSkKKyNkZWZpbmUgZGVzX2NiY19lbmNyeXB0KGksbyxsLGssaXYsZSlcCisJREVTX2NiY19lbmNyeXB0KChpKSwobyksKGwpLCYoayksKGl2KSwoZSkpCisjZGVmaW5lIGRlc19uY2JjX2VuY3J5cHQoaSxvLGwsayxpdixlKVwKKwlERVNfbmNiY19lbmNyeXB0KChpKSwobyksKGwpLCYoayksKGl2KSwoZSkpCisjZGVmaW5lIGRlc194Y2JjX2VuY3J5cHQoaSxvLGwsayxpdixpbncsb3V0dyxlKVwKKwlERVNfeGNiY19lbmNyeXB0KChpKSwobyksKGwpLCYoayksKGl2KSwoaW53KSwob3V0dyksKGUpKQorI2RlZmluZSBkZXNfY2ZiX2VuY3J5cHQoaSxvLG4sbCxrLGl2LGUpXAorCURFU19jZmJfZW5jcnlwdCgoaSksKG8pLChuKSwobCksJihrKSwoaXYpLChlKSkKKyNkZWZpbmUgZGVzX2VjYl9lbmNyeXB0KGksbyxrLGUpXAorCURFU19lY2JfZW5jcnlwdCgoaSksKG8pLCYoayksKGUpKQorI2RlZmluZSBkZXNfZW5jcnlwdDEoZCxrLGUpXAorCURFU19lbmNyeXB0MSgoZCksJihrKSwoZSkpCisjZGVmaW5lIGRlc19lbmNyeXB0MihkLGssZSlcCisJREVTX2VuY3J5cHQyKChkKSwmKGspLChlKSkKKyNkZWZpbmUgZGVzX2VuY3J5cHQzKGQsazEsazIsazMpXAorCURFU19lbmNyeXB0MygoZCksJihrMSksJihrMiksJihrMykpCisjZGVmaW5lIGRlc19kZWNyeXB0MyhkLGsxLGsyLGszKVwKKwlERVNfZGVjcnlwdDMoKGQpLCYoazEpLCYoazIpLCYoazMpKQorI2RlZmluZSBkZXNfeHdoaXRlX2luMm91dChrLGksbylcCisJREVTX3h3aGl0ZV9pbjJvdXQoKGspLChpKSwobykpCisjZGVmaW5lIGRlc19lbmNfcmVhZChmLGIsbCxrLGl2KVwKKwlERVNfZW5jX3JlYWQoKGYpLChiKSwobCksJihrKSwoaXYpKQorI2RlZmluZSBkZXNfZW5jX3dyaXRlKGYsYixsLGssaXYpXAorCURFU19lbmNfd3JpdGUoKGYpLChiKSwobCksJihrKSwoaXYpKQorI2RlZmluZSBkZXNfZmNyeXB0KGIscyxyKVwKKwlERVNfZmNyeXB0KChiKSwocyksKHIpKQorI2lmIDAKKyNkZWZpbmUgZGVzX2NyeXB0KGIscylcCisJREVTX2NyeXB0KChiKSwocykpCisjaWYgIWRlZmluZWQoUEVSTDUpICYmICFkZWZpbmVkKF9fRnJlZUJTRF9fKSAmJiAhZGVmaW5lZChOZVhUKSAmJiAhZGVmaW5lZChfX09wZW5CU0RfXykKKyNkZWZpbmUgY3J5cHQoYixzKVwKKwlERVNfY3J5cHQoKGIpLChzKSkKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIGRlc19vZmJfZW5jcnlwdChpLG8sbixsLGssaXYpXAorCURFU19vZmJfZW5jcnlwdCgoaSksKG8pLChuKSwobCksJihrKSwoaXYpKQorI2RlZmluZSBkZXNfcGNiY19lbmNyeXB0KGksbyxsLGssaXYsZSlcCisJREVTX3BjYmNfZW5jcnlwdCgoaSksKG8pLChsKSwmKGspLChpdiksKGUpKQorI2RlZmluZSBkZXNfcXVhZF9ja3N1bShpLG8sbCxjLHMpXAorCURFU19xdWFkX2Nrc3VtKChpKSwobyksKGwpLChjKSwocykpCisjZGVmaW5lIGRlc19yYW5kb21fc2VlZChrKVwKKwlfb3NzbF8wOTZfZGVzX3JhbmRvbV9zZWVkKChrKSkKKyNkZWZpbmUgZGVzX3JhbmRvbV9rZXkocilcCisJREVTX3JhbmRvbV9rZXkoKHIpKQorI2RlZmluZSBkZXNfcmVhZF9wYXNzd29yZChrLHAsdikgXAorCURFU19yZWFkX3Bhc3N3b3JkKChrKSwocCksKHYpKQorI2RlZmluZSBkZXNfcmVhZF8ycGFzc3dvcmRzKGsxLGsyLHAsdikgXAorCURFU19yZWFkXzJwYXNzd29yZHMoKGsxKSwoazIpLChwKSwodikpCisjZGVmaW5lIGRlc19zZXRfb2RkX3Bhcml0eShrKVwKKwlERVNfc2V0X29kZF9wYXJpdHkoKGspKQorI2RlZmluZSBkZXNfY2hlY2tfa2V5X3Bhcml0eShrKVwKKwlERVNfY2hlY2tfa2V5X3Bhcml0eSgoaykpCisjZGVmaW5lIGRlc19pc193ZWFrX2tleShrKVwKKwlERVNfaXNfd2Vha19rZXkoKGspKQorI2RlZmluZSBkZXNfc2V0X2tleShrLGtzKVwKKwlERVNfc2V0X2tleSgoayksJihrcykpCisjZGVmaW5lIGRlc19rZXlfc2NoZWQoayxrcylcCisJREVTX2tleV9zY2hlZCgoayksJihrcykpCisjZGVmaW5lIGRlc19zZXRfa2V5X2NoZWNrZWQoayxrcylcCisJREVTX3NldF9rZXlfY2hlY2tlZCgoayksJihrcykpCisjZGVmaW5lIGRlc19zZXRfa2V5X3VuY2hlY2tlZChrLGtzKVwKKwlERVNfc2V0X2tleV91bmNoZWNrZWQoKGspLCYoa3MpKQorI2RlZmluZSBkZXNfc3RyaW5nX3RvX2tleShzLGspXAorCURFU19zdHJpbmdfdG9fa2V5KChzKSwoaykpCisjZGVmaW5lIGRlc19zdHJpbmdfdG9fMmtleXMocyxrMSxrMilcCisJREVTX3N0cmluZ190b18ya2V5cygocyksKGsxKSwoazIpKQorI2RlZmluZSBkZXNfY2ZiNjRfZW5jcnlwdChpLG8sbCxrcyxpdixuLGUpXAorCURFU19jZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLCYoa3MpLChpdiksKG4pLChlKSkKKyNkZWZpbmUgZGVzX29mYjY0X2VuY3J5cHQoaSxvLGwsa3MsaXYsbilcCisJREVTX29mYjY0X2VuY3J5cHQoKGkpLChvKSwobCksJihrcyksKGl2KSwobikpCisJCQorCisjZGVmaW5lIGRlc19lY2IyX2VuY3J5cHQoaSxvLGsxLGsyLGUpIFwKKwlkZXNfZWNiM19lbmNyeXB0KChpKSwobyksKGsxKSwoazIpLChrMSksKGUpKQorCisjZGVmaW5lIGRlc19lZGUyX2NiY19lbmNyeXB0KGksbyxsLGsxLGsyLGl2LGUpIFwKKwlkZXNfZWRlM19jYmNfZW5jcnlwdCgoaSksKG8pLChsKSwoazEpLChrMiksKGsxKSwoaXYpLChlKSkKKworI2RlZmluZSBkZXNfZWRlMl9jZmI2NF9lbmNyeXB0KGksbyxsLGsxLGsyLGl2LG4sZSkgXAorCWRlc19lZGUzX2NmYjY0X2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMSksKGl2KSwobiksKGUpKQorCisjZGVmaW5lIGRlc19lZGUyX29mYjY0X2VuY3J5cHQoaSxvLGwsazEsazIsaXYsbikgXAorCWRlc19lZGUzX29mYjY0X2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMSksKGl2KSwobikpCisKKyNkZWZpbmUgZGVzX2NoZWNrX2tleSBERVNfY2hlY2tfa2V5CisjZGVmaW5lIGRlc19yd19tb2RlIERFU19yd19tb2RlCisjZWxzZSAvKiBsaWJkZXMgY29tcGF0aWJpbGl0eSAqLworLyogTWFwIGFsbCBzeW1ib2wgbmFtZXMgdG8gX29zc2xfb2xkX2Rlc18qIGZvcm0sIHNvIHdlIGF2b2lkIGFsbAorICAgY2xhc2hlcyB3aXRoIGxpYmRlcyAqLworI2RlZmluZSBkZXNfY2Jsb2NrIF9vc3NsX29sZF9kZXNfY2Jsb2NrCisjZGVmaW5lIGRlc19rZXlfc2NoZWR1bGUgX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUKKyNkZWZpbmUgZGVzX2VjYjNfZW5jcnlwdChpLG8sazEsazIsazMsZSlcCisJX29zc2xfb2xkX2Rlc19lY2IzX2VuY3J5cHQoKGkpLChvKSwoazEpLChrMiksKGszKSwoZSkpCisjZGVmaW5lIGRlc19lZGUzX2NiY19lbmNyeXB0KGksbyxsLGsxLGsyLGszLGl2LGUpXAorCV9vc3NsX29sZF9kZXNfZWRlM19jYmNfZW5jcnlwdCgoaSksKG8pLChsKSwoazEpLChrMiksKGszKSwoaXYpLChlKSkKKyNkZWZpbmUgZGVzX2VkZTNfY2ZiNjRfZW5jcnlwdChpLG8sbCxrMSxrMixrMyxpdixuLGUpXAorCV9vc3NsX29sZF9kZXNfZWRlM19jZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLChrMSksKGsyKSwoazMpLChpdiksKG4pLChlKSkKKyNkZWZpbmUgZGVzX2VkZTNfb2ZiNjRfZW5jcnlwdChpLG8sbCxrMSxrMixrMyxpdixuKVwKKwlfb3NzbF9vbGRfZGVzX2VkZTNfb2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwoazEpLChrMiksKGszKSwoaXYpLChuKSkKKyNkZWZpbmUgZGVzX29wdGlvbnMoKVwKKwlfb3NzbF9vbGRfZGVzX29wdGlvbnMoKQorI2RlZmluZSBkZXNfY2JjX2Nrc3VtKGksbyxsLGssaXYpXAorCV9vc3NsX29sZF9kZXNfY2JjX2Nrc3VtKChpKSwobyksKGwpLChrKSwoaXYpKQorI2RlZmluZSBkZXNfY2JjX2VuY3J5cHQoaSxvLGwsayxpdixlKVwKKwlfb3NzbF9vbGRfZGVzX2NiY19lbmNyeXB0KChpKSwobyksKGwpLChrKSwoaXYpLChlKSkKKyNkZWZpbmUgZGVzX25jYmNfZW5jcnlwdChpLG8sbCxrLGl2LGUpXAorCV9vc3NsX29sZF9kZXNfbmNiY19lbmNyeXB0KChpKSwobyksKGwpLChrKSwoaXYpLChlKSkKKyNkZWZpbmUgZGVzX3hjYmNfZW5jcnlwdChpLG8sbCxrLGl2LGludyxvdXR3LGUpXAorCV9vc3NsX29sZF9kZXNfeGNiY19lbmNyeXB0KChpKSwobyksKGwpLChrKSwoaXYpLChpbncpLChvdXR3KSwoZSkpCisjZGVmaW5lIGRlc19jZmJfZW5jcnlwdChpLG8sbixsLGssaXYsZSlcCisJX29zc2xfb2xkX2Rlc19jZmJfZW5jcnlwdCgoaSksKG8pLChuKSwobCksKGspLChpdiksKGUpKQorI2RlZmluZSBkZXNfZWNiX2VuY3J5cHQoaSxvLGssZSlcCisJX29zc2xfb2xkX2Rlc19lY2JfZW5jcnlwdCgoaSksKG8pLChrKSwoZSkpCisjZGVmaW5lIGRlc19lbmNyeXB0KGQsayxlKVwKKwlfb3NzbF9vbGRfZGVzX2VuY3J5cHQoKGQpLChrKSwoZSkpCisjZGVmaW5lIGRlc19lbmNyeXB0MihkLGssZSlcCisJX29zc2xfb2xkX2Rlc19lbmNyeXB0MigoZCksKGspLChlKSkKKyNkZWZpbmUgZGVzX2VuY3J5cHQzKGQsazEsazIsazMpXAorCV9vc3NsX29sZF9kZXNfZW5jcnlwdDMoKGQpLChrMSksKGsyKSwoazMpKQorI2RlZmluZSBkZXNfZGVjcnlwdDMoZCxrMSxrMixrMylcCisJX29zc2xfb2xkX2Rlc19kZWNyeXB0MygoZCksKGsxKSwoazIpLChrMykpCisjZGVmaW5lIGRlc194d2hpdGVfaW4yb3V0KGssaSxvKVwKKwlfb3NzbF9vbGRfZGVzX3h3aGl0ZV9pbjJvdXQoKGspLChpKSwobykpCisjZGVmaW5lIGRlc19lbmNfcmVhZChmLGIsbCxrLGl2KVwKKwlfb3NzbF9vbGRfZGVzX2VuY19yZWFkKChmKSwoYiksKGwpLChrKSwoaXYpKQorI2RlZmluZSBkZXNfZW5jX3dyaXRlKGYsYixsLGssaXYpXAorCV9vc3NsX29sZF9kZXNfZW5jX3dyaXRlKChmKSwoYiksKGwpLChrKSwoaXYpKQorI2RlZmluZSBkZXNfZmNyeXB0KGIscyxyKVwKKwlfb3NzbF9vbGRfZGVzX2ZjcnlwdCgoYiksKHMpLChyKSkKKyNkZWZpbmUgZGVzX2NyeXB0KGIscylcCisJX29zc2xfb2xkX2Rlc19jcnlwdCgoYiksKHMpKQorI2lmIDAKKyNkZWZpbmUgY3J5cHQoYixzKVwKKwlfb3NzbF9vbGRfY3J5cHQoKGIpLChzKSkKKyNlbmRpZgorI2RlZmluZSBkZXNfb2ZiX2VuY3J5cHQoaSxvLG4sbCxrLGl2KVwKKwlfb3NzbF9vbGRfZGVzX29mYl9lbmNyeXB0KChpKSwobyksKG4pLChsKSwoayksKGl2KSkKKyNkZWZpbmUgZGVzX3BjYmNfZW5jcnlwdChpLG8sbCxrLGl2LGUpXAorCV9vc3NsX29sZF9kZXNfcGNiY19lbmNyeXB0KChpKSwobyksKGwpLChrKSwoaXYpLChlKSkKKyNkZWZpbmUgZGVzX3F1YWRfY2tzdW0oaSxvLGwsYyxzKVwKKwlfb3NzbF9vbGRfZGVzX3F1YWRfY2tzdW0oKGkpLChvKSwobCksKGMpLChzKSkKKyNkZWZpbmUgZGVzX3JhbmRvbV9zZWVkKGspXAorCV9vc3NsX29sZF9kZXNfcmFuZG9tX3NlZWQoKGspKQorI2RlZmluZSBkZXNfcmFuZG9tX2tleShyKVwKKwlfb3NzbF9vbGRfZGVzX3JhbmRvbV9rZXkoKHIpKQorI2RlZmluZSBkZXNfcmVhZF9wYXNzd29yZChrLHAsdikgXAorCV9vc3NsX29sZF9kZXNfcmVhZF9wYXNzd29yZCgoayksKHApLCh2KSkKKyNkZWZpbmUgZGVzX3JlYWRfMnBhc3N3b3JkcyhrMSxrMixwLHYpIFwKKwlfb3NzbF9vbGRfZGVzX3JlYWRfMnBhc3N3b3JkcygoazEpLChrMiksKHApLCh2KSkKKyNkZWZpbmUgZGVzX3NldF9vZGRfcGFyaXR5KGspXAorCV9vc3NsX29sZF9kZXNfc2V0X29kZF9wYXJpdHkoKGspKQorI2RlZmluZSBkZXNfaXNfd2Vha19rZXkoaylcCisJX29zc2xfb2xkX2Rlc19pc193ZWFrX2tleSgoaykpCisjZGVmaW5lIGRlc19zZXRfa2V5KGssa3MpXAorCV9vc3NsX29sZF9kZXNfc2V0X2tleSgoayksKGtzKSkKKyNkZWZpbmUgZGVzX2tleV9zY2hlZChrLGtzKVwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZCgoayksKGtzKSkKKyNkZWZpbmUgZGVzX3N0cmluZ190b19rZXkocyxrKVwKKwlfb3NzbF9vbGRfZGVzX3N0cmluZ190b19rZXkoKHMpLChrKSkKKyNkZWZpbmUgZGVzX3N0cmluZ190b18ya2V5cyhzLGsxLGsyKVwKKwlfb3NzbF9vbGRfZGVzX3N0cmluZ190b18ya2V5cygocyksKGsxKSwoazIpKQorI2RlZmluZSBkZXNfY2ZiNjRfZW5jcnlwdChpLG8sbCxrcyxpdixuLGUpXAorCV9vc3NsX29sZF9kZXNfY2ZiNjRfZW5jcnlwdCgoaSksKG8pLChsKSwoa3MpLChpdiksKG4pLChlKSkKKyNkZWZpbmUgZGVzX29mYjY0X2VuY3J5cHQoaSxvLGwsa3MsaXYsbilcCisJX29zc2xfb2xkX2Rlc19vZmI2NF9lbmNyeXB0KChpKSwobyksKGwpLChrcyksKGl2KSwobikpCisJCQorCisjZGVmaW5lIGRlc19lY2IyX2VuY3J5cHQoaSxvLGsxLGsyLGUpIFwKKwlkZXNfZWNiM19lbmNyeXB0KChpKSwobyksKGsxKSwoazIpLChrMSksKGUpKQorCisjZGVmaW5lIGRlc19lZGUyX2NiY19lbmNyeXB0KGksbyxsLGsxLGsyLGl2LGUpIFwKKwlkZXNfZWRlM19jYmNfZW5jcnlwdCgoaSksKG8pLChsKSwoazEpLChrMiksKGsxKSwoaXYpLChlKSkKKworI2RlZmluZSBkZXNfZWRlMl9jZmI2NF9lbmNyeXB0KGksbyxsLGsxLGsyLGl2LG4sZSkgXAorCWRlc19lZGUzX2NmYjY0X2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMSksKGl2KSwobiksKGUpKQorCisjZGVmaW5lIGRlc19lZGUyX29mYjY0X2VuY3J5cHQoaSxvLGwsazEsazIsaXYsbikgXAorCWRlc19lZGUzX29mYjY0X2VuY3J5cHQoKGkpLChvKSwobCksKGsxKSwoazIpLChrMSksKGl2KSwobikpCisKKyNkZWZpbmUgZGVzX2NoZWNrX2tleSBERVNfY2hlY2tfa2V5CisjZGVmaW5lIGRlc19yd19tb2RlIERFU19yd19tb2RlCisjZW5kaWYKKworY29uc3QgY2hhciAqX29zc2xfb2xkX2Rlc19vcHRpb25zKHZvaWQpOwordm9pZCBfb3NzbF9vbGRfZGVzX2VjYjNfZW5jcnlwdChfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczEsX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MyLAorCV9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMywgaW50IGVuYyk7CitERVNfTE9ORyBfb3NzbF9vbGRfZGVzX2NiY19ja3N1bShfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCwKKwlsb25nIGxlbmd0aCxfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSxfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfY2JjX2VuY3J5cHQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmlucHV0LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXRwdXQsbG9uZyBsZW5ndGgsCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc2NoZWR1bGUsX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsaW50IGVuYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfbmNiY19lbmNyeXB0KF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LGxvbmcgbGVuZ3RoLAorCV9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlLF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLGludCBlbmMpOwordm9pZCBfb3NzbF9vbGRfZGVzX3hjYmNfZW5jcnlwdChfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCxsb25nIGxlbmd0aCwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSxfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYywKKwlfb3NzbF9vbGRfZGVzX2NibG9jayAqaW53LF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXR3LGludCBlbmMpOwordm9pZCBfb3NzbF9vbGRfZGVzX2NmYl9lbmNyeXB0KHVuc2lnbmVkIGNoYXIgKmluLHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgbnVtYml0cywKKwlsb25nIGxlbmd0aCxfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSxfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYyxpbnQgZW5jKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc19lY2JfZW5jcnlwdChfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKm91dHB1dCwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrcyxpbnQgZW5jKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc19lbmNyeXB0KERFU19MT05HICpkYXRhLF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzLCBpbnQgZW5jKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc19lbmNyeXB0MihERVNfTE9ORyAqZGF0YSxfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrcywgaW50IGVuYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfZW5jcnlwdDMoREVTX0xPTkcgKmRhdGEsIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMSwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczIsIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfZGVjcnlwdDMoREVTX0xPTkcgKmRhdGEsIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMSwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczIsIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfZWRlM19jYmNfZW5jcnlwdChfb3NzbF9vbGRfZGVzX2NibG9jayAqaW5wdXQsIF9vc3NsX29sZF9kZXNfY2Jsb2NrICpvdXRwdXQsIAorCWxvbmcgbGVuZ3RoLCBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczEsIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMiwgCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MzLCBfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYywgaW50IGVuYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfZWRlM19jZmI2NF9lbmNyeXB0KHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJbG9uZyBsZW5ndGgsIF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMSwgX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MyLAorCV9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIGtzMywgX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsIGludCAqbnVtLCBpbnQgZW5jKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc19lZGUzX29mYjY0X2VuY3J5cHQodW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwlsb25nIGxlbmd0aCwgX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MxLCBfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBrczIsCisJX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUga3MzLCBfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYywgaW50ICpudW0pOworI2lmIDAKK3ZvaWQgX29zc2xfb2xkX2Rlc194d2hpdGVfaW4yb3V0KF9vc3NsX29sZF9kZXNfY2Jsb2NrICgqZGVzX2tleSksIF9vc3NsX29sZF9kZXNfY2Jsb2NrICgqaW5fd2hpdGUpLAorCV9vc3NsX29sZF9kZXNfY2Jsb2NrICgqb3V0X3doaXRlKSk7CisjZW5kaWYKKworaW50IF9vc3NsX29sZF9kZXNfZW5jX3JlYWQoaW50IGZkLGNoYXIgKmJ1ZixpbnQgbGVuLF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIHNjaGVkLAorCV9vc3NsX29sZF9kZXNfY2Jsb2NrICppdik7CitpbnQgX29zc2xfb2xkX2Rlc19lbmNfd3JpdGUoaW50IGZkLGNoYXIgKmJ1ZixpbnQgbGVuLF9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIHNjaGVkLAorCV9vc3NsX29sZF9kZXNfY2Jsb2NrICppdik7CitjaGFyICpfb3NzbF9vbGRfZGVzX2ZjcnlwdChjb25zdCBjaGFyICpidWYsY29uc3QgY2hhciAqc2FsdCwgY2hhciAqcmV0KTsKK2NoYXIgKl9vc3NsX29sZF9kZXNfY3J5cHQoY29uc3QgY2hhciAqYnVmLGNvbnN0IGNoYXIgKnNhbHQpOworI2lmICFkZWZpbmVkKFBFUkw1KSAmJiAhZGVmaW5lZChOZVhUKQorY2hhciAqX29zc2xfb2xkX2NyeXB0KGNvbnN0IGNoYXIgKmJ1Zixjb25zdCBjaGFyICpzYWx0KTsKKyNlbmRpZgordm9pZCBfb3NzbF9vbGRfZGVzX29mYl9lbmNyeXB0KHVuc2lnbmVkIGNoYXIgKmluLHVuc2lnbmVkIGNoYXIgKm91dCwKKwlpbnQgbnVtYml0cyxsb25nIGxlbmd0aCxfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSxfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYyk7Cit2b2lkIF9vc3NsX29sZF9kZXNfcGNiY19lbmNyeXB0KF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LGxvbmcgbGVuZ3RoLAorCV9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlLF9vc3NsX29sZF9kZXNfY2Jsb2NrICppdmVjLGludCBlbmMpOworREVTX0xPTkcgX29zc2xfb2xkX2Rlc19xdWFkX2Nrc3VtKF9vc3NsX29sZF9kZXNfY2Jsb2NrICppbnB1dCxfb3NzbF9vbGRfZGVzX2NibG9jayAqb3V0cHV0LAorCWxvbmcgbGVuZ3RoLGludCBvdXRfY291bnQsX29zc2xfb2xkX2Rlc19jYmxvY2sgKnNlZWQpOwordm9pZCBfb3NzbF9vbGRfZGVzX3JhbmRvbV9zZWVkKF9vc3NsX29sZF9kZXNfY2Jsb2NrIGtleSk7Cit2b2lkIF9vc3NsX29sZF9kZXNfcmFuZG9tX2tleShfb3NzbF9vbGRfZGVzX2NibG9jayByZXQpOworaW50IF9vc3NsX29sZF9kZXNfcmVhZF9wYXNzd29yZChfb3NzbF9vbGRfZGVzX2NibG9jayAqa2V5LGNvbnN0IGNoYXIgKnByb21wdCxpbnQgdmVyaWZ5KTsKK2ludCBfb3NzbF9vbGRfZGVzX3JlYWRfMnBhc3N3b3Jkcyhfb3NzbF9vbGRfZGVzX2NibG9jayAqa2V5MSxfb3NzbF9vbGRfZGVzX2NibG9jayAqa2V5MiwKKwljb25zdCBjaGFyICpwcm9tcHQsaW50IHZlcmlmeSk7Cit2b2lkIF9vc3NsX29sZF9kZXNfc2V0X29kZF9wYXJpdHkoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSk7CitpbnQgX29zc2xfb2xkX2Rlc19pc193ZWFrX2tleShfb3NzbF9vbGRfZGVzX2NibG9jayAqa2V5KTsKK2ludCBfb3NzbF9vbGRfZGVzX3NldF9rZXkoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSxfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSk7CitpbnQgX29zc2xfb2xkX2Rlc19rZXlfc2NoZWQoX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSxfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSk7Cit2b2lkIF9vc3NsX29sZF9kZXNfc3RyaW5nX3RvX2tleShjaGFyICpzdHIsX29zc2xfb2xkX2Rlc19jYmxvY2sgKmtleSk7Cit2b2lkIF9vc3NsX29sZF9kZXNfc3RyaW5nX3RvXzJrZXlzKGNoYXIgKnN0cixfb3NzbF9vbGRfZGVzX2NibG9jayAqa2V5MSxfb3NzbF9vbGRfZGVzX2NibG9jayAqa2V5Mik7Cit2b2lkIF9vc3NsX29sZF9kZXNfY2ZiNjRfZW5jcnlwdCh1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LCBsb25nIGxlbmd0aCwKKwlfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZSBzY2hlZHVsZSwgX29zc2xfb2xkX2Rlc19jYmxvY2sgKml2ZWMsIGludCAqbnVtLCBpbnQgZW5jKTsKK3ZvaWQgX29zc2xfb2xkX2Rlc19vZmI2NF9lbmNyeXB0KHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCV9vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlIHNjaGVkdWxlLCBfb3NzbF9vbGRfZGVzX2NibG9jayAqaXZlYywgaW50ICpudW0pOworCit2b2lkIF9vc3NsXzA5Nl9kZXNfcmFuZG9tX3NlZWQoZGVzX2NibG9jayAqa2V5KTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBwcm92aWRlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTUlUIEtlcmJlcm9zCisgKiBsaWJyYXJ5LiBUaGUgX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgc3RydWN0dXJlIGlzIG5vdCBiaW5hcnkgY29tcGF0aWJsZS4gKi8KKworI2RlZmluZSBfS0VSQkVST1NfREVTX0gKKworI2RlZmluZSBLUkJERVNfRU5DUllQVCBERVNfRU5DUllQVAorI2RlZmluZSBLUkJERVNfREVDUllQVCBERVNfREVDUllQVAorCisjaWZkZWYgS0VSQkVST1MKKyMgIGRlZmluZSBFTkNSWVBUIERFU19FTkNSWVBUCisjICBkZWZpbmUgREVDUllQVCBERVNfREVDUllQVAorI2VuZGlmCisKKyNpZm5kZWYgTkNPTVBBVAorIyAgZGVmaW5lIENfQmxvY2sgZGVzX2NibG9jaworIyAgZGVmaW5lIEtleV9zY2hlZHVsZSBkZXNfa2V5X3NjaGVkdWxlCisjICBkZWZpbmUgS0VZX1NaIERFU19LRVlfU1oKKyMgIGRlZmluZSBzdHJpbmdfdG9fa2V5IGRlc19zdHJpbmdfdG9fa2V5CisjICBkZWZpbmUgcmVhZF9wd19zdHJpbmcgZGVzX3JlYWRfcHdfc3RyaW5nCisjICBkZWZpbmUgcmFuZG9tX2tleSBkZXNfcmFuZG9tX2tleQorIyAgZGVmaW5lIHBjYmNfZW5jcnlwdCBkZXNfcGNiY19lbmNyeXB0CisjICBkZWZpbmUgc2V0X2tleSBkZXNfc2V0X2tleQorIyAgZGVmaW5lIGtleV9zY2hlZCBkZXNfa2V5X3NjaGVkCisjICBkZWZpbmUgZWNiX2VuY3J5cHQgZGVzX2VjYl9lbmNyeXB0CisjICBkZWZpbmUgY2JjX2VuY3J5cHQgZGVzX2NiY19lbmNyeXB0CisjICBkZWZpbmUgbmNiY19lbmNyeXB0IGRlc19uY2JjX2VuY3J5cHQKKyMgIGRlZmluZSB4Y2JjX2VuY3J5cHQgZGVzX3hjYmNfZW5jcnlwdAorIyAgZGVmaW5lIGNiY19ja3N1bSBkZXNfY2JjX2Nrc3VtCisjICBkZWZpbmUgcXVhZF9ja3N1bSBkZXNfcXVhZF9ja3N1bQorIyAgZGVmaW5lIGNoZWNrX3Bhcml0eSBkZXNfY2hlY2tfa2V5X3Bhcml0eQorI2VuZGlmCisKKyNkZWZpbmUgZGVzX2ZpeHVwX2tleV9wYXJpdHkgREVTX2ZpeHVwX2tleV9wYXJpdHkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8qIGZvciBERVNfcmVhZF9wd19zdHJpbmcgZXQgYWwgKi8KKyNpbmNsdWRlIDxvcGVuc3NsL3VpX2NvbXBhdC5oPgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9kaC5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2RoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5MzA5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9kaC5oCkBAIC0wLDAgKzEsMjYwIEBACisvKiBjcnlwdG8vZGgvZGguaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9ESF9ICisjZGVmaW5lIEhFQURFUl9ESF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX0RICisjZXJyb3IgREggaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNlbmRpZgorCQorI2lmbmRlZiBPUEVOU1NMX0RIX01BWF9NT0RVTFVTX0JJVFMKKyMgZGVmaW5lIE9QRU5TU0xfREhfTUFYX01PRFVMVVNfQklUUwkxMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgREhfRkxBR19DQUNIRV9NT05UX1AgICAgIDB4MDEKKyNkZWZpbmUgREhfRkxBR19OT19FWFBfQ09OU1RUSU1FIDB4MDIgLyogbmV3IHdpdGggMC45LjdoOyB0aGUgYnVpbHQtaW4gREgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1wbGVtZW50YXRpb24gbm93IHVzZXMgY29uc3RhbnQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtb2R1bGFyIGV4cG9uZW50aWF0aW9uIGZvciBzZWNyZXQgZXhwb25lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ5IGRlZmF1bHQuIFRoaXMgZmxhZyBjYXVzZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZhc3RlciB2YXJpYWJsZSBzbGlkaW5nIHdpbmRvdyBtZXRob2QgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgdXNlZCBmb3IgYWxsIGV4cG9uZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEFscmVhZHkgZGVmaW5lZCBpbiBvc3NsX3R5cC5oICovCisvKiB0eXBlZGVmIHN0cnVjdCBkaF9zdCBESDsgKi8KKy8qIHR5cGVkZWYgc3RydWN0IGRoX21ldGhvZCBESF9NRVRIT0Q7ICovCisKK3N0cnVjdCBkaF9tZXRob2QKKwl7CisJY29uc3QgY2hhciAqbmFtZTsKKwkvKiBNZXRob2RzIGhlcmUgKi8KKwlpbnQgKCpnZW5lcmF0ZV9rZXkpKERIICpkaCk7CisJaW50ICgqY29tcHV0ZV9rZXkpKHVuc2lnbmVkIGNoYXIgKmtleSxjb25zdCBCSUdOVU0gKnB1Yl9rZXksREggKmRoKTsKKwlpbnQgKCpibl9tb2RfZXhwKShjb25zdCBESCAqZGgsIEJJR05VTSAqciwgY29uc3QgQklHTlVNICphLAorCQkJCWNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKwkJCQlCTl9NT05UX0NUWCAqbV9jdHgpOyAvKiBDYW4gYmUgbnVsbCAqLworCisJaW50ICgqaW5pdCkoREggKmRoKTsKKwlpbnQgKCpmaW5pc2gpKERIICpkaCk7CisJaW50IGZsYWdzOworCWNoYXIgKmFwcF9kYXRhOworCS8qIElmIHRoaXMgaXMgbm9uLU5VTEwsIGl0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBwYXJhbWV0ZXJzICovCisJaW50ICgqZ2VuZXJhdGVfcGFyYW1zKShESCAqZGgsIGludCBwcmltZV9sZW4sIGludCBnZW5lcmF0b3IsIEJOX0dFTkNCICpjYik7CisJfTsKKworc3RydWN0IGRoX3N0CisJeworCS8qIFRoaXMgZmlyc3QgYXJndW1lbnQgaXMgdXNlZCB0byBwaWNrIHVwIGVycm9ycyB3aGVuCisJICogYSBESCBpcyBwYXNzZWQgaW5zdGVhZCBvZiBhIEVWUF9QS0VZICovCisJaW50IHBhZDsKKwlpbnQgdmVyc2lvbjsKKwlCSUdOVU0gKnA7CisJQklHTlVNICpnOworCWxvbmcgbGVuZ3RoOyAvKiBvcHRpb25hbCAqLworCUJJR05VTSAqcHViX2tleTsJLyogZ154ICovCisJQklHTlVNICpwcml2X2tleTsJLyogeCAqLworCisJaW50IGZsYWdzOworCUJOX01PTlRfQ1RYICptZXRob2RfbW9udF9wOworCS8qIFBsYWNlIGhvbGRlcnMgaWYgd2Ugd2FudCB0byBkbyBYOS40MiBESCAqLworCUJJR05VTSAqcTsKKwlCSUdOVU0gKmo7CisJdW5zaWduZWQgY2hhciAqc2VlZDsKKwlpbnQgc2VlZGxlbjsKKwlCSUdOVU0gKmNvdW50ZXI7CisKKwlpbnQgcmVmZXJlbmNlczsKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCWNvbnN0IERIX01FVEhPRCAqbWV0aDsKKwlFTkdJTkUgKmVuZ2luZTsKKwl9OworCisjZGVmaW5lIERIX0dFTkVSQVRPUl8yCQkyCisvKiAjZGVmaW5lIERIX0dFTkVSQVRPUl8zCTMgKi8KKyNkZWZpbmUgREhfR0VORVJBVE9SXzUJCTUKKworLyogREhfY2hlY2sgZXJyb3IgY29kZXMgKi8KKyNkZWZpbmUgREhfQ0hFQ0tfUF9OT1RfUFJJTUUJCTB4MDEKKyNkZWZpbmUgREhfQ0hFQ0tfUF9OT1RfU0FGRV9QUklNRQkweDAyCisjZGVmaW5lIERIX1VOQUJMRV9UT19DSEVDS19HRU5FUkFUT1IJMHgwNAorI2RlZmluZSBESF9OT1RfU1VJVEFCTEVfR0VORVJBVE9SCTB4MDgKKworLyogREhfY2hlY2tfcHViX2tleSBlcnJvciBjb2RlcyAqLworI2RlZmluZSBESF9DSEVDS19QVUJLRVlfVE9PX1NNQUxMCTB4MDEKKyNkZWZpbmUgREhfQ0hFQ0tfUFVCS0VZX1RPT19MQVJHRQkweDAyCisKKy8qIHByaW1lcyBwIHdoZXJlIChwLTEpLzIgaXMgcHJpbWUgdG9vIGFyZSBjYWxsZWQgInNhZmUiOyB3ZSBkZWZpbmUKKyAgIHRoaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6ICovCisjZGVmaW5lIERIX0NIRUNLX1BfTk9UX1NUUk9OR19QUklNRQlESF9DSEVDS19QX05PVF9TQUZFX1BSSU1FCisKKyNkZWZpbmUgZDJpX0RIcGFyYW1zX2ZwKGZwLHgpIChESCAqKUFTTjFfZDJpX2ZwKChjaGFyICooKikoKSlESF9uZXcsIFwKKwkJKGNoYXIgKigqKSgpKWQyaV9ESHBhcmFtcywoZnApLCh1bnNpZ25lZCBjaGFyICoqKSh4KSkKKyNkZWZpbmUgaTJkX0RIcGFyYW1zX2ZwKGZwLHgpIEFTTjFfaTJkX2ZwKGkyZF9ESHBhcmFtcywoZnApLCBcCisJCSh1bnNpZ25lZCBjaGFyICopKHgpKQorI2RlZmluZSBkMmlfREhwYXJhbXNfYmlvKGJwLHgpIEFTTjFfZDJpX2Jpb19vZihESCxESF9uZXcsZDJpX0RIcGFyYW1zLGJwLHgpCisjZGVmaW5lIGkyZF9ESHBhcmFtc19iaW8oYnAseCkgQVNOMV9pMmRfYmlvX29mX2NvbnN0KERILGkyZF9ESHBhcmFtcyxicCx4KQorCitESCAqREhwYXJhbXNfZHVwKERIICopOworCitjb25zdCBESF9NRVRIT0QgKkRIX09wZW5TU0wodm9pZCk7CisKK3ZvaWQgREhfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IERIX01FVEhPRCAqbWV0aCk7Citjb25zdCBESF9NRVRIT0QgKkRIX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKTsKK2ludCBESF9zZXRfbWV0aG9kKERIICpkaCwgY29uc3QgREhfTUVUSE9EICptZXRoKTsKK0RIICpESF9uZXdfbWV0aG9kKEVOR0lORSAqZW5naW5lKTsKKworREggKglESF9uZXcodm9pZCk7Cit2b2lkCURIX2ZyZWUoREggKmRoKTsKK2ludAlESF91cF9yZWYoREggKmRoKTsKK2ludAlESF9zaXplKGNvbnN0IERIICpkaCk7CitpbnQgREhfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCSAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworaW50IERIX3NldF9leF9kYXRhKERIICpkLCBpbnQgaWR4LCB2b2lkICphcmcpOwordm9pZCAqREhfZ2V0X2V4X2RhdGEoREggKmQsIGludCBpZHgpOworCisvKiBEZXByZWNhdGVkIHZlcnNpb24gKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitESCAqCURIX2dlbmVyYXRlX3BhcmFtZXRlcnMoaW50IHByaW1lX2xlbixpbnQgZ2VuZXJhdG9yLAorCQl2b2lkICgqY2FsbGJhY2spKGludCxpbnQsdm9pZCAqKSx2b2lkICpjYl9hcmcpOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fREVQUkVDQVRFRCkgKi8KKworLyogTmV3IHZlcnNpb24gKi8KK2ludAlESF9nZW5lcmF0ZV9wYXJhbWV0ZXJzX2V4KERIICpkaCwgaW50IHByaW1lX2xlbixpbnQgZ2VuZXJhdG9yLCBCTl9HRU5DQiAqY2IpOworCitpbnQJREhfY2hlY2soY29uc3QgREggKmRoLGludCAqY29kZXMpOworaW50CURIX2NoZWNrX3B1Yl9rZXkoY29uc3QgREggKmRoLGNvbnN0IEJJR05VTSAqcHViX2tleSwgaW50ICpjb2Rlcyk7CitpbnQJREhfZ2VuZXJhdGVfa2V5KERIICpkaCk7CitpbnQJREhfY29tcHV0ZV9rZXkodW5zaWduZWQgY2hhciAqa2V5LGNvbnN0IEJJR05VTSAqcHViX2tleSxESCAqZGgpOworREggKglkMmlfREhwYXJhbXMoREggKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpOworaW50CWkyZF9ESHBhcmFtcyhjb25zdCBESCAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50CURIcGFyYW1zX3ByaW50X2ZwKEZJTEUgKmZwLCBjb25zdCBESCAqeCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludAlESHBhcmFtc19wcmludChCSU8gKmJwLCBjb25zdCBESCAqeCk7CisjZWxzZQoraW50CURIcGFyYW1zX3ByaW50KGNoYXIgKmJwLCBjb25zdCBESCAqeCk7CisjZW5kaWYKKworI2RlZmluZSBFVlBfUEtFWV9DVFhfc2V0X2RoX3BhcmFtZ2VuX3ByaW1lX2xlbihjdHgsIGxlbikgXAorCUVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfREgsIEVWUF9QS0VZX09QX1BBUkFNR0VOLCBcCisJCQlFVlBfUEtFWV9DVFJMX0RIX1BBUkFNR0VOX1BSSU1FX0xFTiwgbGVuLCBOVUxMKQorCisjZGVmaW5lIEVWUF9QS0VZX0NUWF9zZXRfZGhfcGFyYW1nZW5fZ2VuZXJhdG9yKGN0eCwgZ2VuKSBcCisJRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCBFVlBfUEtFWV9ESCwgRVZQX1BLRVlfT1BfUEFSQU1HRU4sIFwKKwkJCUVWUF9QS0VZX0NUUkxfREhfUEFSQU1HRU5fR0VORVJBVE9SLCBnZW4sIE5VTEwpCisKKyNkZWZpbmUJRVZQX1BLRVlfQ1RSTF9ESF9QQVJBTUdFTl9QUklNRV9MRU4JKEVWUF9QS0VZX0FMR19DVFJMICsgMSkKKyNkZWZpbmUJRVZQX1BLRVlfQ1RSTF9ESF9QQVJBTUdFTl9HRU5FUkFUT1IJKEVWUF9QS0VZX0FMR19DVFJMICsgMikKKwkJCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfREhfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBESCBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBESF9GX0NPTVBVVEVfS0VZCQkJCSAxMDIKKyNkZWZpbmUgREhfRl9ESFBBUkFNU19QUklOVF9GUAkJCQkgMTAxCisjZGVmaW5lIERIX0ZfREhfQlVJTFRJTl9HRU5QQVJBTVMJCQkgMTA2CisjZGVmaW5lIERIX0ZfREhfTkVXX01FVEhPRAkJCQkgMTA1CisjZGVmaW5lIERIX0ZfREhfUEFSQU1fREVDT0RFCQkJCSAxMDcKKyNkZWZpbmUgREhfRl9ESF9QUklWX0RFQ09ERQkJCQkgMTEwCisjZGVmaW5lIERIX0ZfREhfUFJJVl9FTkNPREUJCQkJIDExMQorI2RlZmluZSBESF9GX0RIX1BVQl9ERUNPREUJCQkJIDEwOAorI2RlZmluZSBESF9GX0RIX1BVQl9FTkNPREUJCQkJIDEwOQorI2RlZmluZSBESF9GX0RPX0RIX1BSSU5UCQkJCSAxMDAKKyNkZWZpbmUgREhfRl9HRU5FUkFURV9LRVkJCQkJIDEwMworI2RlZmluZSBESF9GX0dFTkVSQVRFX1BBUkFNRVRFUlMJCQkgMTA0CisjZGVmaW5lIERIX0ZfUEtFWV9ESF9ERVJJVkUJCQkJIDExMgorI2RlZmluZSBESF9GX1BLRVlfREhfS0VZR0VOCQkJCSAxMTMKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBESF9SX0JBRF9HRU5FUkFUT1IJCQkJIDEwMQorI2RlZmluZSBESF9SX0JOX0RFQ09ERV9FUlJPUgkJCQkgMTA5CisjZGVmaW5lIERIX1JfQk5fRVJST1IJCQkJCSAxMDYKKyNkZWZpbmUgREhfUl9ERUNPREVfRVJST1IJCQkJIDEwNAorI2RlZmluZSBESF9SX0lOVkFMSURfUFVCS0VZCQkJCSAxMDIKKyNkZWZpbmUgREhfUl9LRVlTX05PVF9TRVQJCQkJIDEwOAorI2RlZmluZSBESF9SX01PRFVMVVNfVE9PX0xBUkdFCQkJCSAxMDMKKyNkZWZpbmUgREhfUl9OT19QQVJBTUVURVJTX1NFVAkJCQkgMTA3CisjZGVmaW5lIERIX1JfTk9fUFJJVkFURV9WQUxVRQkJCQkgMTAwCisjZGVmaW5lIERIX1JfUEFSQU1FVEVSX0VOQ09ESU5HX0VSUk9SCQkJIDEwNQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2RzYS5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2RzYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTBhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZHNhLmgKQEAgLTAsMCArMSwzMDcgQEAKKy8qIGNyeXB0by9kc2EvZHNhLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyoKKyAqIFRoZSBEU1Mgcm91dGluZXMgYXJlIGJhc2VkIG9uIHBhdGNoZXMgc3VwcGxpZWQgYnkKKyAqIFN0ZXZlbiBTY2hvY2ggPHNjaG9jaEBzaGViYS5hcmMubmFzYS5nb3Y+LiAgSGUgYmFzaWNhbGx5IGRpZCB0aGUKKyAqIHdvcmsgYW5kIEkgaGF2ZSBqdXN0IHR3ZWFrZWQgdGhlbSBhIGxpdHRsZSB0byBmaXQgaW50byBteQorICogc3R5bGlzdGljIHZpc2lvbiBmb3IgU1NMZWF5IDotKSAqLworCisjaWZuZGVmIEhFQURFUl9EU0FfSAorI2RlZmluZSBIRUFERVJfRFNBX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworI2lmZGVmIE9QRU5TU0xfTk9fRFNBCisjZXJyb3IgRFNBIGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjIGluY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9EU0FfTUFYX01PRFVMVVNfQklUUworIyBkZWZpbmUgT1BFTlNTTF9EU0FfTUFYX01PRFVMVVNfQklUUwkxMDAwMAorI2VuZGlmCisKKyNkZWZpbmUgRFNBX0ZMQUdfQ0FDSEVfTU9OVF9QCTB4MDEKKyNkZWZpbmUgRFNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSAgICAgICAweDAyIC8qIG5ldyB3aXRoIDAuOS43aDsgdGhlIGJ1aWx0LWluIERTQQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1wbGVtZW50YXRpb24gbm93IHVzZXMgY29uc3RhbnQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbW9kdWxhciBleHBvbmVudGlhdGlvbiBmb3Igc2VjcmV0IGV4cG9uZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnkgZGVmYXVsdC4gVGhpcyBmbGFnIGNhdXNlcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZhc3RlciB2YXJpYWJsZSBzbGlkaW5nIHdpbmRvdyBtZXRob2QgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIHVzZWQgZm9yIGFsbCBleHBvbmVudHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQWxyZWFkeSBkZWZpbmVkIGluIG9zc2xfdHlwLmggKi8KKy8qIHR5cGVkZWYgc3RydWN0IGRzYV9zdCBEU0E7ICovCisvKiB0eXBlZGVmIHN0cnVjdCBkc2FfbWV0aG9kIERTQV9NRVRIT0Q7ICovCisKK3R5cGVkZWYgc3RydWN0IERTQV9TSUdfc3QKKwl7CisJQklHTlVNICpyOworCUJJR05VTSAqczsKKwl9IERTQV9TSUc7CisKK3N0cnVjdCBkc2FfbWV0aG9kCisJeworCWNvbnN0IGNoYXIgKm5hbWU7CisJRFNBX1NJRyAqICgqZHNhX2RvX3NpZ24pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkbGVuLCBEU0EgKmRzYSk7CisJaW50ICgqZHNhX3NpZ25fc2V0dXApKERTQSAqZHNhLCBCTl9DVFggKmN0eF9pbiwgQklHTlVNICoqa2ludnAsCisJCQkJCQkJCUJJR05VTSAqKnJwKTsKKwlpbnQgKCpkc2FfZG9fdmVyaWZ5KShjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sCisJCQkgICAgIERTQV9TSUcgKnNpZywgRFNBICpkc2EpOworCWludCAoKmRzYV9tb2RfZXhwKShEU0EgKmRzYSwgQklHTlVNICpyciwgQklHTlVNICphMSwgQklHTlVNICpwMSwKKwkJCUJJR05VTSAqYTIsIEJJR05VTSAqcDIsIEJJR05VTSAqbSwgQk5fQ1RYICpjdHgsCisJCQlCTl9NT05UX0NUWCAqaW5fbW9udCk7CisJaW50ICgqYm5fbW9kX2V4cCkoRFNBICpkc2EsIEJJR05VTSAqciwgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKnAsCisJCQkJY29uc3QgQklHTlVNICptLCBCTl9DVFggKmN0eCwKKwkJCQlCTl9NT05UX0NUWCAqbV9jdHgpOyAvKiBDYW4gYmUgbnVsbCAqLworCWludCAoKmluaXQpKERTQSAqZHNhKTsKKwlpbnQgKCpmaW5pc2gpKERTQSAqZHNhKTsKKwlpbnQgZmxhZ3M7CisJY2hhciAqYXBwX2RhdGE7CisJLyogSWYgdGhpcyBpcyBub24tTlVMTCwgaXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBEU0EgcGFyYW1ldGVycyAqLworCWludCAoKmRzYV9wYXJhbWdlbikoRFNBICpkc2EsIGludCBiaXRzLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VlZCwgaW50IHNlZWRfbGVuLAorCQkJaW50ICpjb3VudGVyX3JldCwgdW5zaWduZWQgbG9uZyAqaF9yZXQsCisJCQlCTl9HRU5DQiAqY2IpOworCS8qIElmIHRoaXMgaXMgbm9uLU5VTEwsIGl0IGlzIHVzZWQgdG8gZ2VuZXJhdGUgRFNBIGtleXMgKi8KKwlpbnQgKCpkc2Ffa2V5Z2VuKShEU0EgKmRzYSk7CisJfTsKKworc3RydWN0IGRzYV9zdAorCXsKKwkvKiBUaGlzIGZpcnN0IHZhcmlhYmxlIGlzIHVzZWQgdG8gcGljayB1cCBlcnJvcnMgd2hlcmUKKwkgKiBhIERTQSBpcyBwYXNzZWQgaW5zdGVhZCBvZiBvZiBhIEVWUF9QS0VZICovCisJaW50IHBhZDsKKwlsb25nIHZlcnNpb247CisJaW50IHdyaXRlX3BhcmFtczsKKwlCSUdOVU0gKnA7CisJQklHTlVNICpxOwkvKiA9PSAyMCAqLworCUJJR05VTSAqZzsKKworCUJJR05VTSAqcHViX2tleTsgIC8qIHkgcHVibGljIGtleSAqLworCUJJR05VTSAqcHJpdl9rZXk7IC8qIHggcHJpdmF0ZSBrZXkgKi8KKworCUJJR05VTSAqa2ludjsJLyogU2lnbmluZyBwcmUtY2FsYyAqLworCUJJR05VTSAqcjsJLyogU2lnbmluZyBwcmUtY2FsYyAqLworCisJaW50IGZsYWdzOworCS8qIE5vcm1hbGx5IHVzZWQgdG8gY2FjaGUgbW9udGdvbWVyeSB2YWx1ZXMgKi8KKwlCTl9NT05UX0NUWCAqbWV0aG9kX21vbnRfcDsKKwlpbnQgcmVmZXJlbmNlczsKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCWNvbnN0IERTQV9NRVRIT0QgKm1ldGg7CisJLyogZnVuY3Rpb25hbCByZWZlcmVuY2UgaWYgJ21ldGgnIGlzIEVOR0lORS1wcm92aWRlZCAqLworCUVOR0lORSAqZW5naW5lOworCX07CisKKyNkZWZpbmUgZDJpX0RTQXBhcmFtc19mcChmcCx4KSAoRFNBICopQVNOMV9kMmlfZnAoKGNoYXIgKigqKSgpKURTQV9uZXcsIFwKKwkJKGNoYXIgKigqKSgpKWQyaV9EU0FwYXJhbXMsKGZwKSwodW5zaWduZWQgY2hhciAqKikoeCkpCisjZGVmaW5lIGkyZF9EU0FwYXJhbXNfZnAoZnAseCkgQVNOMV9pMmRfZnAoaTJkX0RTQXBhcmFtcywoZnApLCBcCisJCSh1bnNpZ25lZCBjaGFyICopKHgpKQorI2RlZmluZSBkMmlfRFNBcGFyYW1zX2JpbyhicCx4KSBBU04xX2QyaV9iaW9fb2YoRFNBLERTQV9uZXcsZDJpX0RTQXBhcmFtcyxicCx4KQorI2RlZmluZSBpMmRfRFNBcGFyYW1zX2JpbyhicCx4KSBBU04xX2kyZF9iaW9fb2ZfY29uc3QoRFNBLGkyZF9EU0FwYXJhbXMsYnAseCkKKworCitEU0EgKkRTQXBhcmFtc19kdXAoRFNBICp4KTsKK0RTQV9TSUcgKiBEU0FfU0lHX25ldyh2b2lkKTsKK3ZvaWQJRFNBX1NJR19mcmVlKERTQV9TSUcgKmEpOworaW50CWkyZF9EU0FfU0lHKGNvbnN0IERTQV9TSUcgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCk7CitEU0FfU0lHICogZDJpX0RTQV9TSUcoRFNBX1NJRyAqKnYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpOworCitEU0FfU0lHICogRFNBX2RvX3NpZ24oY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCxpbnQgZGxlbixEU0EgKmRzYSk7CitpbnQJRFNBX2RvX3ZlcmlmeShjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LGludCBkZ3N0X2xlbiwKKwkJICAgICAgRFNBX1NJRyAqc2lnLERTQSAqZHNhKTsKKworY29uc3QgRFNBX01FVEhPRCAqRFNBX09wZW5TU0wodm9pZCk7CisKK3ZvaWQJRFNBX3NldF9kZWZhdWx0X21ldGhvZChjb25zdCBEU0FfTUVUSE9EICopOworY29uc3QgRFNBX01FVEhPRCAqRFNBX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKTsKK2ludAlEU0Ffc2V0X21ldGhvZChEU0EgKmRzYSwgY29uc3QgRFNBX01FVEhPRCAqKTsKKworRFNBICoJRFNBX25ldyh2b2lkKTsKK0RTQSAqCURTQV9uZXdfbWV0aG9kKEVOR0lORSAqZW5naW5lKTsKK3ZvaWQJRFNBX2ZyZWUgKERTQSAqcik7CisvKiAidXAiIHRoZSBEU0Egb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50ICovCitpbnQJRFNBX3VwX3JlZihEU0EgKnIpOworaW50CURTQV9zaXplKGNvbnN0IERTQSAqKTsKKwkvKiBuZXh0IDQgcmV0dXJuIC0xIG9uIGVycm9yICovCitpbnQJRFNBX3NpZ25fc2V0dXAoIERTQSAqZHNhLEJOX0NUWCAqY3R4X2luLEJJR05VTSAqKmtpbnZwLEJJR05VTSAqKnJwKTsKK2ludAlEU0Ffc2lnbihpbnQgdHlwZSxjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LGludCBkbGVuLAorCQl1bnNpZ25lZCBjaGFyICpzaWcsIHVuc2lnbmVkIGludCAqc2lnbGVuLCBEU0EgKmRzYSk7CitpbnQJRFNBX3ZlcmlmeShpbnQgdHlwZSxjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LGludCBkZ3N0X2xlbiwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLCBpbnQgc2lnbGVuLCBEU0EgKmRzYSk7CitpbnQgRFNBX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKK2ludCBEU0Ffc2V0X2V4X2RhdGEoRFNBICpkLCBpbnQgaWR4LCB2b2lkICphcmcpOwordm9pZCAqRFNBX2dldF9leF9kYXRhKERTQSAqZCwgaW50IGlkeCk7CisKK0RTQSAqCWQyaV9EU0FQdWJsaWNLZXkoRFNBICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCk7CitEU0EgKglkMmlfRFNBUHJpdmF0ZUtleShEU0EgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoKTsKK0RTQSAqIAlkMmlfRFNBcGFyYW1zKERTQSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpOworCisvKiBEZXByZWNhdGVkIHZlcnNpb24gKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECitEU0EgKglEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyhpbnQgYml0cywKKwkJdW5zaWduZWQgY2hhciAqc2VlZCxpbnQgc2VlZF9sZW4sCisJCWludCAqY291bnRlcl9yZXQsIHVuc2lnbmVkIGxvbmcgKmhfcmV0LHZvaWQKKwkJKCpjYWxsYmFjaykoaW50LCBpbnQsIHZvaWQgKiksdm9pZCAqY2JfYXJnKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChPUEVOU1NMX05PX0RFUFJFQ0FURUQpICovCisKKy8qIE5ldyB2ZXJzaW9uICovCitpbnQJRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnNfZXgoRFNBICpkc2EsIGludCBiaXRzLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWVkLGludCBzZWVkX2xlbiwKKwkJaW50ICpjb3VudGVyX3JldCwgdW5zaWduZWQgbG9uZyAqaF9yZXQsIEJOX0dFTkNCICpjYik7CisKK2ludAlEU0FfZ2VuZXJhdGVfa2V5KERTQSAqYSk7CitpbnQJaTJkX0RTQVB1YmxpY0tleShjb25zdCBEU0EgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCk7CitpbnQgCWkyZF9EU0FQcml2YXRlS2V5KGNvbnN0IERTQSAqYSwgdW5zaWduZWQgY2hhciAqKnBwKTsKK2ludAlpMmRfRFNBcGFyYW1zKGNvbnN0IERTQSAqYSx1bnNpZ25lZCBjaGFyICoqcHApOworCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCitpbnQJRFNBcGFyYW1zX3ByaW50KEJJTyAqYnAsIGNvbnN0IERTQSAqeCk7CitpbnQJRFNBX3ByaW50KEJJTyAqYnAsIGNvbnN0IERTQSAqeCwgaW50IG9mZik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludAlEU0FwYXJhbXNfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IERTQSAqeCk7CitpbnQJRFNBX3ByaW50X2ZwKEZJTEUgKmJwLCBjb25zdCBEU0EgKngsIGludCBvZmYpOworI2VuZGlmCisKKyNkZWZpbmUgRFNTX3ByaW1lX2NoZWNrcyA1MAorLyogUHJpbWFsaXR5IHRlc3QgYWNjb3JkaW5nIHRvIEZJUFMgUFVCIDE4NlstMV0sIEFwcGVuZGl4IDIuMToKKyAqIDUwIHJvdW5kcyBvZiBSYWJpbi1NaWxsZXIgKi8KKyNkZWZpbmUgRFNBX2lzX3ByaW1lKG4sIGNhbGxiYWNrLCBjYl9hcmcpIFwKKwlCTl9pc19wcmltZShuLCBEU1NfcHJpbWVfY2hlY2tzLCBjYWxsYmFjaywgTlVMTCwgY2JfYXJnKQorCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKy8qIENvbnZlcnQgRFNBIHN0cnVjdHVyZSAoa2V5IG9yIGp1c3QgcGFyYW1ldGVycykgaW50byBESCBzdHJ1Y3R1cmUKKyAqIChiZSBjYXJlZnVsIHRvIGF2b2lkIHNtYWxsIHN1Ymdyb3VwIGF0dGFja3Mgd2hlbiB1c2luZyB0aGlzISkgKi8KK0RIICpEU0FfZHVwX0RIKGNvbnN0IERTQSAqcik7CisjZW5kaWYKKworI2RlZmluZSBFVlBfUEtFWV9DVFhfc2V0X2RzYV9wYXJhbWdlbl9iaXRzKGN0eCwgbmJpdHMpIFwKKwlFVlBfUEtFWV9DVFhfY3RybChjdHgsIEVWUF9QS0VZX0RTQSwgRVZQX1BLRVlfT1BfUEFSQU1HRU4sIFwKKwkJCQlFVlBfUEtFWV9DVFJMX0RTQV9QQVJBTUdFTl9CSVRTLCBuYml0cywgTlVMTCkKKworI2RlZmluZQlFVlBfUEtFWV9DVFJMX0RTQV9QQVJBTUdFTl9CSVRTCQkoRVZQX1BLRVlfQUxHX0NUUkwgKyAxKQorI2RlZmluZQlFVlBfUEtFWV9DVFJMX0RTQV9QQVJBTUdFTl9RX0JJVFMJKEVWUF9QS0VZX0FMR19DVFJMICsgMikKKyNkZWZpbmUJRVZQX1BLRVlfQ1RSTF9EU0FfUEFSQU1HRU5fTUQJCShFVlBfUEtFWV9BTEdfQ1RSTCArIDMpCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfRFNBX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRFNBIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIERTQV9GX0QySV9EU0FfU0lHCQkJCSAxMTAKKyNkZWZpbmUgRFNBX0ZfRE9fRFNBX1BSSU5UCQkJCSAxMDQKKyNkZWZpbmUgRFNBX0ZfRFNBUEFSQU1TX1BSSU5UCQkJCSAxMDAKKyNkZWZpbmUgRFNBX0ZfRFNBUEFSQU1TX1BSSU5UX0ZQCQkJIDEwMQorI2RlZmluZSBEU0FfRl9EU0FfRE9fU0lHTgkJCQkgMTEyCisjZGVmaW5lIERTQV9GX0RTQV9ET19WRVJJRlkJCQkJIDExMworI2RlZmluZSBEU0FfRl9EU0FfTkVXX01FVEhPRAkJCQkgMTAzCisjZGVmaW5lIERTQV9GX0RTQV9QQVJBTV9ERUNPREUJCQkJIDExOQorI2RlZmluZSBEU0FfRl9EU0FfUFJJTlRfRlAJCQkJIDEwNQorI2RlZmluZSBEU0FfRl9EU0FfUFJJVl9ERUNPREUJCQkJIDExNQorI2RlZmluZSBEU0FfRl9EU0FfUFJJVl9FTkNPREUJCQkJIDExNgorI2RlZmluZSBEU0FfRl9EU0FfUFVCX0RFQ09ERQkJCQkgMTE3CisjZGVmaW5lIERTQV9GX0RTQV9QVUJfRU5DT0RFCQkJCSAxMTgKKyNkZWZpbmUgRFNBX0ZfRFNBX1NJR04JCQkJCSAxMDYKKyNkZWZpbmUgRFNBX0ZfRFNBX1NJR05fU0VUVVAJCQkJIDEwNworI2RlZmluZSBEU0FfRl9EU0FfU0lHX05FVwkJCQkgMTA5CisjZGVmaW5lIERTQV9GX0RTQV9WRVJJRlkJCQkJIDEwOAorI2RlZmluZSBEU0FfRl9JMkRfRFNBX1NJRwkJCQkgMTExCisjZGVmaW5lIERTQV9GX09MRF9EU0FfUFJJVl9ERUNPREUJCQkgMTIyCisjZGVmaW5lIERTQV9GX1BLRVlfRFNBX0NUUkwJCQkJIDEyMAorI2RlZmluZSBEU0FfRl9QS0VZX0RTQV9LRVlHRU4JCQkJIDEyMQorI2RlZmluZSBEU0FfRl9TSUdfQ0IJCQkJCSAxMTQKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBEU0FfUl9CQURfUV9WQUxVRQkJCQkgMTAyCisjZGVmaW5lIERTQV9SX0JOX0RFQ09ERV9FUlJPUgkJCQkgMTA4CisjZGVmaW5lIERTQV9SX0JOX0VSUk9SCQkJCQkgMTA5CisjZGVmaW5lIERTQV9SX0RBVEFfVE9PX0xBUkdFX0ZPUl9LRVlfU0laRQkJIDEwMAorI2RlZmluZSBEU0FfUl9ERUNPREVfRVJST1IJCQkJIDEwNAorI2RlZmluZSBEU0FfUl9JTlZBTElEX0RJR0VTVF9UWVBFCQkJIDEwNgorI2RlZmluZSBEU0FfUl9NSVNTSU5HX1BBUkFNRVRFUlMJCQkgMTAxCisjZGVmaW5lIERTQV9SX01PRFVMVVNfVE9PX0xBUkdFCQkJCSAxMDMKKyNkZWZpbmUgRFNBX1JfTk9fUEFSQU1FVEVSU19TRVQJCQkJIDEwNworI2RlZmluZSBEU0FfUl9QQVJBTUVURVJfRU5DT0RJTkdfRVJST1IJCQkgMTA1CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZHNvLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZHNvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5ZjJlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9kc28uaApAQCAtMCwwICsxLDQwOSBAQAorLyogZHNvLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgR2VvZmYgVGhvcnBlIChnZW9mZkBnZW9mZnRob3JwZS5uZXQpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX0RTT19ICisjZGVmaW5lIEhFQURFUl9EU09fSAorCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgYXMgY29tbWFuZHMgdG8gRFNPX2N0cmwoKSAqLworI2RlZmluZSBEU09fQ1RSTF9HRVRfRkxBR1MJMQorI2RlZmluZSBEU09fQ1RSTF9TRVRfRkxBR1MJMgorI2RlZmluZSBEU09fQ1RSTF9PUl9GTEFHUwkzCisKKy8qIEJ5IGRlZmF1bHQsIERTT19sb2FkKCkgd2lsbCB0cmFuc2xhdGUgdGhlIHByb3ZpZGVkIGZpbGVuYW1lIGludG8gYSBmb3JtCisgKiB0eXBpY2FsIGZvciB0aGUgcGxhdGZvcm0gKG1vcmUgc3BlY2lmaWNhbGx5IHRoZSBEU09fTUVUSE9EKSB1c2luZyB0aGUKKyAqIGRzb19uYW1lX2NvbnZlcnRlciBmdW5jdGlvbiBvZiB0aGUgbWV0aG9kLiBFZy4gd2luMzIgd2lsbCB0cmFuc2Zvcm0gImJsYWgiCisgKiBpbnRvICJibGFoLmRsbCIsIGFuZCBkbGZjbiB3aWxsIHRyYW5zZm9ybSBpdCBpbnRvICJsaWJibGFoLnNvIi4gVGhlCisgKiBiZWhhdmlvdXIgY2FuIGJlIG92ZXJyaWRlbiBieSBzZXR0aW5nIHRoZSBuYW1lX2NvbnZlcnRlciBjYWxsYmFjayBpbiB0aGUgRFNPCisgKiBvYmplY3QgKHVzaW5nIERTT19zZXRfbmFtZV9jb252ZXJ0ZXIoKSkuIFRoaXMgY2FsbGJhY2sgY291bGQgZXZlbiB1dGlsaXNlCisgKiB0aGUgRFNPX01FVEhPRCdzIGNvbnZlcnRlciB0b28gaWYgaXQgb25seSB3YW50cyB0byBvdmVycmlkZSBiZWhhdmlvdXIgZm9yCisgKiBvbmUgb3IgdHdvIHBvc3NpYmxlIERTTyBtZXRob2RzLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIGZsYWcgY2FuIGJlIHNldCBpbiBhCisgKiBEU08gdG8gcHJldmVudCAqYW55KiBuYXRpdmUgbmFtZS10cmFuc2xhdGlvbiBhdCBhbGwgLSBlZy4gaWYgdGhlIGNhbGxlciBoYXMKKyAqIHByb21wdGVkIHRoZSB1c2VyIGZvciBhIHBhdGggdG8gYSBkcml2ZXIgbGlicmFyeSBzbyB0aGUgZmlsZW5hbWUgc2hvdWxkIGJlCisgKiBpbnRlcnByZXRlZCBhcy1pcy4gKi8KKyNkZWZpbmUgRFNPX0ZMQUdfTk9fTkFNRV9UUkFOU0xBVElPTgkJMHgwMQorLyogQW4gZXh0cmEgZmxhZyB0byBnaXZlIGlmIG9ubHkgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgYWRkZWQgYXMKKyAqIHRyYW5zbGF0aW9uLiAgVGhpcyBpcyBvYnZpb3VzbHkgb25seSBvZiBpbXBvcnRhbmNlIG9uIFVuaXggYW5kCisgKiBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyB3aGVyZSB0aGUgdHJhbnNsYXRpb24gYWxzbyBtYXkgcHJlZml4CisgKiB0aGUgbmFtZSB3aXRoIHNvbWV0aGluZywgbGlrZSAnbGliJywgYW5kIGlnbm9yZWQgZXZlcnl3aGVyZSBlbHNlLgorICogVGhpcyBmbGFnIGlzIGFsc28gaWdub3JlZCBpZiBEU09fRkxBR19OT19OQU1FX1RSQU5TTEFUSU9OIGlzIHVzZWQKKyAqIGF0IHRoZSBzYW1lIHRpbWUuICovCisjZGVmaW5lIERTT19GTEFHX05BTUVfVFJBTlNMQVRJT05fRVhUX09OTFkJMHgwMgorCisvKiBUaGUgZm9sbG93aW5nIGZsYWcgY29udHJvbHMgdGhlIHRyYW5zbGF0aW9uIG9mIHN5bWJvbCBuYW1lcyB0byB1cHBlcgorICogY2FzZS4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgYmVpbmcgaW1wbGVtZW50ZWQgZm9yIE9wZW5WTVMuCisgKi8KKyNkZWZpbmUgRFNPX0ZMQUdfVVBDQVNFX1NZTUJPTAkJCTB4MTAKKworLyogVGhpcyBmbGFnIGxvYWRzIHRoZSBsaWJyYXJ5IHdpdGggcHVibGljIHN5bWJvbHMuCisgKiBNZWFuaW5nOiBUaGUgZXhwb3J0ZWQgc3ltYm9scyBvZiB0aGlzIGxpYnJhcnkgYXJlIHB1YmxpYworICogdG8gYWxsIGxpYnJhcmllcyBsb2FkZWQgYWZ0ZXIgdGhpcyBsaWJyYXJ5LgorICogQXQgdGhlIG1vbWVudCBvbmx5IGltcGxlbWVudGVkIGluIHVuaXguCisgKi8KKyNkZWZpbmUgRFNPX0ZMQUdfR0xPQkFMX1NZTUJPTFMJCQkweDIwCisKKwordHlwZWRlZiB2b2lkICgqRFNPX0ZVTkNfVFlQRSkodm9pZCk7CisKK3R5cGVkZWYgc3RydWN0IGRzb19zdCBEU087CisKKy8qIFRoZSBmdW5jdGlvbiBwcm90b3R5cGUgdXNlZCBmb3IgbWV0aG9kIGZ1bmN0aW9ucyAob3IgY2FsbGVyLXByb3ZpZGVkCisgKiBjYWxsYmFja3MpIHRoYXQgdHJhbnNmb3JtIGZpbGVuYW1lcy4gVGhleSBhcmUgcGFzc2VkIGEgRFNPIHN0cnVjdHVyZSBwb2ludGVyCisgKiAob3IgTlVMTCBpZiB0aGV5IGFyZSB0byBiZSB1c2VkIGluZGVwZW5kYW50bHkgb2YgYSBEU08gb2JqZWN0KSBhbmQgYQorICogZmlsZW5hbWUgdG8gdHJhbnNmb3JtLiBUaGV5IHNob3VsZCBlaXRoZXIgcmV0dXJuIE5VTEwgKGlmIHRoZXJlIGlzIGFuIGVycm9yCisgKiBjb25kaXRpb24pIG9yIGEgbmV3bHkgYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIHRoZSB0cmFuc2Zvcm1lZCBmb3JtIHRoYXQKKyAqIHRoZSBjYWxsZXIgd2lsbCBuZWVkIHRvIGZyZWUgd2l0aCBPUEVOU1NMX2ZyZWUoKSB3aGVuIGRvbmUuICovCit0eXBlZGVmIGNoYXIqICgqRFNPX05BTUVfQ09OVkVSVEVSX0ZVTkMpKERTTyAqLCBjb25zdCBjaGFyICopOworLyogVGhlIGZ1bmN0aW9uIHByb3RvdHlwZSB1c2VkIGZvciBtZXRob2QgZnVuY3Rpb25zIChvciBjYWxsZXItcHJvdmlkZWQKKyAqIGNhbGxiYWNrcykgdGhhdCBtZXJnZSB0d28gZmlsZSBzcGVjaWZpY2F0aW9ucy4gVGhleSBhcmUgcGFzc2VkIGEKKyAqIERTTyBzdHJ1Y3R1cmUgcG9pbnRlciAob3IgTlVMTCBpZiB0aGV5IGFyZSB0byBiZSB1c2VkIGluZGVwZW5kYW50bHkgb2YKKyAqIGEgRFNPIG9iamVjdCkgYW5kIHR3byBmaWxlIHNwZWNpZmljYXRpb25zIHRvIG1lcmdlLiBUaGV5IHNob3VsZAorICogZWl0aGVyIHJldHVybiBOVUxMIChpZiB0aGVyZSBpcyBhbiBlcnJvciBjb25kaXRpb24pIG9yIGEgbmV3bHkgYWxsb2NhdGVkCisgKiBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIG1lcmdpbmcgdGhhdCB0aGUgY2FsbGVyIHdpbGwgbmVlZAorICogdG8gZnJlZSB3aXRoIE9QRU5TU0xfZnJlZSgpIHdoZW4gZG9uZS4KKyAqIEhlcmUsIG1lcmdpbmcgbWVhbnMgdGhhdCBiaXRzIGFuZCBwaWVjZXMgYXJlIHRha2VuIGZyb20gZWFjaCBvZiB0aGUKKyAqIGZpbGUgc3BlY2lmaWNhdGlvbnMgYW5kIGFkZGVkIHRvZ2V0aGVyIGluIHdoYXRldmVyIGZhc2hpb24gdGhhdCBpcworICogc2Vuc2libGUgZm9yIHRoZSBEU08gbWV0aG9kIGluIHF1ZXN0aW9uLiAgVGhlIG9ubHkgcnVsZSB0aGF0IHJlYWxseQorICogYXBwbGllcyBpcyB0aGF0IGlmIHRoZSB0d28gc3BlY2lmaWNhdGlvbiBjb250YWluIHBpZWNlcyBvZiB0aGUgc2FtZQorICogdHlwZSwgdGhlIGNvcHkgZnJvbSB0aGUgZmlyc3Qgc3RyaW5nIHRha2VzIHByaW9yaXR5LiAgT25lIGNvdWxkIHNlZQorICogaXQgYXMgdGhlIGZpcnN0IHNwZWNpZmljYXRpb24gaXMgdGhlIG9uZSBnaXZlbiBieSB0aGUgdXNlciBhbmQgdGhlCisgKiBzZWNvbmQgYmVpbmcgYSBidW5jaCBvZiBkZWZhdWx0cyB0byBhZGQgb24gaWYgdGhleSdyZSBtaXNzaW5nIGluIHRoZQorICogZmlyc3QuICovCit0eXBlZGVmIGNoYXIqICgqRFNPX01FUkdFUl9GVU5DKShEU08gKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCit0eXBlZGVmIHN0cnVjdCBkc29fbWV0aF9zdAorCXsKKwljb25zdCBjaGFyICpuYW1lOworCS8qIExvYWRzIGEgc2hhcmVkIGxpYnJhcnksIE5COiBuZXcgRFNPX01FVEhPRHMgbXVzdCBlbnN1cmUgdGhhdCBhCisJICogc3VjY2Vzc2Z1bCBsb2FkIHBvcHVsYXRlcyB0aGUgbG9hZGVkX2ZpbGVuYW1lIGZpZWxkLCBhbmQgbGlrZXdpc2UgYQorCSAqIHN1Y2Nlc3NmdWwgdW5sb2FkIE9QRU5TU0xfZnJlZXMgYW5kIE5VTExzIGl0IG91dC4gKi8KKwlpbnQgKCpkc29fbG9hZCkoRFNPICpkc28pOworCS8qIFVubG9hZHMgYSBzaGFyZWQgbGlicmFyeSAqLworCWludCAoKmRzb191bmxvYWQpKERTTyAqZHNvKTsKKwkvKiBCaW5kcyBhIHZhcmlhYmxlICovCisJdm9pZCAqKCpkc29fYmluZF92YXIpKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKTsKKwkvKiBCaW5kcyBhIGZ1bmN0aW9uIC0gYXNzdW1lcyBhIHJldHVybiB0eXBlIG9mIERTT19GVU5DX1RZUEUuCisJICogVGhpcyBzaG91bGQgYmUgY2FzdCB0byB0aGUgcmVhbCBmdW5jdGlvbiBwcm90b3R5cGUgYnkgdGhlCisJICogY2FsbGVyLiBQbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIGNvbXBhdGlibGUgcmVwcmVzZW50YXRpb25zCisJICogZm9yIGRpZmZlcmVudCBwcm90b3R5cGVzICh0aGlzIGlzIHBvc3NpYmxlIHdpdGhpbiBBTlNJIEMpCisJICogYXJlIGhpZ2hseSB1bmxpa2VseSB0byBoYXZlIHNoYXJlZCBsaWJyYXJpZXMgYXQgYWxsLCBsZXQKKwkgKiBhbG9uZSBhIERTT19NRVRIT0QgaW1wbGVtZW50ZWQgZm9yIHRoZW0uICovCisJRFNPX0ZVTkNfVFlQRSAoKmRzb19iaW5kX2Z1bmMpKERTTyAqZHNvLCBjb25zdCBjaGFyICpzeW1uYW1lKTsKKworLyogSSBkb24ndCB0aGluayB0aGlzIHdvdWxkIGFjdHVhbGx5IGJlIHVzZWQgaW4gYW55IGNpcmN1bXN0YW5jZXMuICovCisjaWYgMAorCS8qIFVuYmluZHMgYSB2YXJpYWJsZSAqLworCWludCAoKmRzb191bmJpbmRfdmFyKShEU08gKmRzbywgY2hhciAqc3ltbmFtZSwgdm9pZCAqc3ltcHRyKTsKKwkvKiBVbmJpbmRzIGEgZnVuY3Rpb24gKi8KKwlpbnQgKCpkc29fdW5iaW5kX2Z1bmMpKERTTyAqZHNvLCBjaGFyICpzeW1uYW1lLCBEU09fRlVOQ19UWVBFIHN5bXB0cik7CisjZW5kaWYKKwkvKiBUaGUgZ2VuZXJpYyAoeXVjaykgImN0cmwoKSIgZnVuY3Rpb24uIE5COiBOZWdhdGl2ZSByZXR1cm4KKwkgKiB2YWx1ZXMgKHJhdGhlciB0aGFuIHplcm8pIGluZGljYXRlIGVycm9ycy4gKi8KKwlsb25nICgqZHNvX2N0cmwpKERTTyAqZHNvLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOworCS8qIFRoZSBkZWZhdWx0IERTT19NRVRIT0Qtc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgZmlsZW5hbWVzIHRvCisJICogYSBjYW5vbmljYWwgbmF0aXZlIGZvcm0uICovCisJRFNPX05BTUVfQ09OVkVSVEVSX0ZVTkMgZHNvX25hbWVfY29udmVydGVyOworCS8qIFRoZSBkZWZhdWx0IERTT19NRVRIT0Qtc3BlY2lmaWMgZnVuY3Rpb24gZm9yIGNvbnZlcnRpbmcgZmlsZW5hbWVzIHRvCisJICogYSBjYW5vbmljYWwgbmF0aXZlIGZvcm0uICovCisJRFNPX01FUkdFUl9GVU5DIGRzb19tZXJnZXI7CisKKwkvKiBbRGVdSW5pdGlhbGlzYXRpb24gaGFuZGxlcnMuICovCisJaW50ICgqaW5pdCkoRFNPICpkc28pOworCWludCAoKmZpbmlzaCkoRFNPICpkc28pOworCisJLyogUmV0dXJuIHBhdGhuYW1lIG9mIHRoZSBtb2R1bGUgY29udGFpbmluZyBsb2NhdGlvbiAqLworCWludCAoKnBhdGhieWFkZHIpKHZvaWQgKmFkZHIsY2hhciAqcGF0aCxpbnQgc3opOworCS8qIFBlcmZvcm0gZ2xvYmFsIHN5bWJvbCBsb29rdXAsIGkuZS4gYW1vbmcgKmFsbCogbW9kdWxlcyAqLworCXZvaWQgKigqZ2xvYmFsbG9va3VwKShjb25zdCBjaGFyICpzeW1uYW1lKTsKKwl9IERTT19NRVRIT0Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogVGhlIGxvdy1sZXZlbCBoYW5kbGUgdHlwZSB1c2VkIHRvIHJlZmVyIHRvIGEgbG9hZGVkIHNoYXJlZCBsaWJyYXJ5ICovCisKK3N0cnVjdCBkc29fc3QKKwl7CisJRFNPX01FVEhPRCAqbWV0aDsKKwkvKiBTdGFuZGFyZCBkbG9wZW4gdXNlcyBhICh2b2lkICopLiBXaW4zMiB1c2VzIGEgSEFORExFLiBWTVMKKwkgKiBkb2Vzbid0IHVzZSBhbnl0aGluZyBidXQgd2lsbCBuZWVkIHRvIGNhY2hlIHRoZSBmaWxlbmFtZQorCSAqIGZvciB1c2UgaW4gdGhlIGRzb19iaW5kIGhhbmRsZXIuIEFsbCBpbiBhbGwsIGxldCBlYWNoCisJICogbWV0aG9kIGNvbnRyb2wgaXRzIG93biBkZXN0aW55LiAiSGFuZGxlcyIgYW5kIHN1Y2ggZ28gaW4KKwkgKiBhIFNUQUNLLiAqLworCVNUQUNLX09GKHZvaWQpICptZXRoX2RhdGE7CisJaW50IHJlZmVyZW5jZXM7CisJaW50IGZsYWdzOworCS8qIEZvciB1c2UgYnkgYXBwbGljYXRpb25zIGV0YyAuLi4gdXNlIHRoaXMgZm9yIHlvdXIgYml0cyduJ3BpZWNlcywKKwkgKiBkb24ndCB0b3VjaCBtZXRoX2RhdGEhICovCisJQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKwkvKiBJZiB0aGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgaXMgc2V0IHRvIG5vbi1OVUxMLCB0aGVuIGl0IHdpbGwKKwkgKiBiZSB1c2VkIGluIERTT19sb2FkKCkgaW4gcGxhY2Ugb2YgbWV0aC0+ZHNvX25hbWVfY29udmVydGVyLiBOQjogVGhpcworCSAqIHNob3VsZCBub3JtYWxseSBzZXQgdXNpbmcgRFNPX3NldF9uYW1lX2NvbnZlcnRlcigpLiAqLworCURTT19OQU1FX0NPTlZFUlRFUl9GVU5DIG5hbWVfY29udmVydGVyOworCS8qIElmIHRoaXMgY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlciBpcyBzZXQgdG8gbm9uLU5VTEwsIHRoZW4gaXQgd2lsbAorCSAqIGJlIHVzZWQgaW4gRFNPX2xvYWQoKSBpbiBwbGFjZSBvZiBtZXRoLT5kc29fbWVyZ2VyLiBOQjogVGhpcworCSAqIHNob3VsZCBub3JtYWxseSBzZXQgdXNpbmcgRFNPX3NldF9tZXJnZXIoKS4gKi8KKwlEU09fTUVSR0VSX0ZVTkMgbWVyZ2VyOworCS8qIFRoaXMgaXMgcG9wdWxhdGVkIHdpdGggKGEgY29weSBvZikgdGhlIHBsYXRmb3JtLWluZGVwZW5kYW50CisJICogZmlsZW5hbWUgdXNlZCBmb3IgdGhpcyBEU08uICovCisJY2hhciAqZmlsZW5hbWU7CisJLyogVGhpcyBpcyBwb3B1bGF0ZWQgd2l0aCAoYSBjb3B5IG9mKSB0aGUgdHJhbnNsYXRlZCBmaWxlbmFtZSBieSB3aGljaAorCSAqIHRoZSBEU08gd2FzIGFjdHVhbGx5IGxvYWRlZC4gSXQgaXMgTlVMTCBpZmYgdGhlIERTTyBpcyBub3QgY3VycmVudGx5CisJICogbG9hZGVkLiBOQjogVGhpcyBpcyBoZXJlIGJlY2F1c2UgdGhlIGZpbGVuYW1lIHRyYW5zbGF0aW9uIHByb2Nlc3MKKwkgKiBtYXkgaW52b2x2ZSBhIGNhbGxiYWNrIGJlaW5nIGludm9rZWQgbW9yZSB0aGFuIG9uY2Ugbm90IG9ubHkgdG8KKwkgKiBjb252ZXJ0IHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgZm9ybSwgYnV0IGFsc28gdG8gdHJ5IGRpZmZlcmVudAorCSAqIGZpbGVuYW1lcyBpbiB0aGUgcHJvY2VzcyBvZiB0cnlpbmcgdG8gcGVyZm9ybSBhIGxvYWQuIEFzIHN1Y2gsIHRoaXMKKwkgKiB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSAoYSkgd2hldGhlciB0aGlzIERTTyBzdHJ1Y3R1cmUKKwkgKiBjb3JyZXNwb25kcyB0byBhIGxvYWRlZCBsaWJyYXJ5IG9yIG5vdCwgYW5kIChiKSB0aGUgZmlsZW5hbWUgd2l0aAorCSAqIHdoaWNoIGl0IHdhcyBhY3R1YWxseSBsb2FkZWQuICovCisJY2hhciAqbG9hZGVkX2ZpbGVuYW1lOworCX07CisKKworRFNPICoJRFNPX25ldyh2b2lkKTsKK0RTTyAqCURTT19uZXdfbWV0aG9kKERTT19NRVRIT0QgKm1ldGhvZCk7CitpbnQJRFNPX2ZyZWUoRFNPICpkc28pOworaW50CURTT19mbGFncyhEU08gKmRzbyk7CitpbnQJRFNPX3VwX3JlZihEU08gKmRzbyk7Citsb25nCURTT19jdHJsKERTTyAqZHNvLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOworCisvKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIERTTydzIG5hbWVfY29udmVydGVyIGNhbGxiYWNrLiBJZiBpdCBpcyBub24tTlVMTCwKKyAqIHRoZW4gaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFzc29jaWF0ZWQgRFNPX01FVEhPRCdzIGZ1bmN0aW9uLiBJZgorICogb2xkY2IgaXMgbm9uLU5VTEwgdGhlbiBpdCBpcyBzZXQgdG8gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdmFsdWUgYmVpbmcKKyAqIHJlcGxhY2VkLiBSZXR1cm4gdmFsdWUgaXMgbm9uLXplcm8gZm9yIHN1Y2Nlc3MuICovCitpbnQJRFNPX3NldF9uYW1lX2NvbnZlcnRlcihEU08gKmRzbywgRFNPX05BTUVfQ09OVkVSVEVSX0ZVTkMgY2IsCisJCQkJRFNPX05BTUVfQ09OVkVSVEVSX0ZVTkMgKm9sZGNiKTsKKy8qIFRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBnZXQvc2V0IHRoZSBwbGF0Zm9ybS1pbmRlcGVuZGFudCBmaWxlbmFtZQorICogdXNlZCBmb3IgYSBEU08uIE5COiBzZXQgd2lsbCBmYWlsIGlmIHRoZSBEU08gaXMgYWxyZWFkeSBsb2FkZWQuICovCitjb25zdCBjaGFyICpEU09fZ2V0X2ZpbGVuYW1lKERTTyAqZHNvKTsKK2ludAlEU09fc2V0X2ZpbGVuYW1lKERTTyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSk7CisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW52b2tlIHRoZSBEU08ncyBuYW1lX2NvbnZlcnRlciBjYWxsYmFjayB0byB0cmFuc2xhdGUgYQorICogZmlsZW5hbWUsIG9yIGlmIHRoZSBjYWxsYmFjayBpc24ndCBzZXQgaXQgd2lsbCBpbnN0ZWFkIHVzZSB0aGUgRFNPX01FVEhPRCdzCisgKiBjb252ZXJ0ZXIuIElmICJmaWxlbmFtZSIgaXMgTlVMTCwgdGhlICJmaWxlbmFtZSIgaW4gdGhlIERTTyBpdHNlbGYgd2lsbCBiZQorICogdXNlZC4gSWYgdGhlIERTT19GTEFHX05PX05BTUVfVFJBTlNMQVRJT04gZmxhZyBpcyBzZXQsIHRoZW4gdGhlIGZpbGVuYW1lIGlzCisgKiBzaW1wbHkgZHVwbGljYXRlZC4gTkI6IFRoaXMgZnVuY3Rpb24gaXMgdXN1YWxseSBjYWxsZWQgZnJvbSB3aXRoaW4gYQorICogRFNPX01FVEhPRCBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgYSBEU09fbG9hZCgpIGNhbGwsIGFuZCBpcyBleHBvc2VkIHNvIHRoYXQKKyAqIGNhbGxlci1jcmVhdGVkIERTT19NRVRIT0RzIGNhbiBkbyB0aGUgc2FtZSB0aGluZy4gQSBub24tTlVMTCByZXR1cm4gdmFsdWUKKyAqIHdpbGwgbmVlZCB0byBiZSBPUEVOU1NMX2ZyZWUoKSdkLiAqLworY2hhcgkqRFNPX2NvbnZlcnRfZmlsZW5hbWUoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBpbnZva2UgdGhlIERTTydzIG1lcmdlciBjYWxsYmFjayB0byBtZXJnZSB0d28gZmlsZQorICogc3BlY2lmaWNhdGlvbnMsIG9yIGlmIHRoZSBjYWxsYmFjayBpc24ndCBzZXQgaXQgd2lsbCBpbnN0ZWFkIHVzZSB0aGUKKyAqIERTT19NRVRIT0QncyBtZXJnZXIuICBBIG5vbi1OVUxMIHJldHVybiB2YWx1ZSB3aWxsIG5lZWQgdG8gYmUKKyAqIE9QRU5TU0xfZnJlZSgpJ2QuICovCitjaGFyCSpEU09fbWVyZ2UoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVzcGVjMSwgY29uc3QgY2hhciAqZmlsZXNwZWMyKTsKKy8qIElmIHRoZSBEU08gaXMgY3VycmVudGx5IGxvYWRlZCwgdGhpcyByZXR1cm5zIHRoZSBmaWxlbmFtZSB0aGF0IGl0IHdhcyBsb2FkZWQKKyAqIHVuZGVyLCBvdGhlcndpc2UgaXQgcmV0dXJucyBOVUxMLiBTbyBpdCBpcyBhbHNvIHVzZWZ1bCBhcyBhIHRlc3QgYXMgdG8KKyAqIHdoZXRoZXIgdGhlIERTTyBpcyBjdXJyZW50bHkgbG9hZGVkLiBOQjogVGhpcyB3aWxsIG5vdCBuZWNlc3NhcmlseSByZXR1cm4KKyAqIHRoZSBzYW1lIHZhbHVlIGFzIERTT19jb252ZXJ0X2ZpbGVuYW1lKGRzbywgZHNvLT5maWxlbmFtZSksIGJlY2F1c2UgdGhlCisgKiBEU09fTUVUSE9EJ3MgbG9hZCBmdW5jdGlvbiBtYXkgaGF2ZSB0cmllZCBhIHZhcmlldHkgb2YgZmlsZW5hbWVzICh3aXRoCisgKiBhbmQvb3Igd2l0aG91dCB0aGUgYWlkIG9mIHRoZSBjb252ZXJ0ZXJzKSBiZWZvcmUgc2V0dGxpbmcgb24gdGhlIG9uZSBpdAorICogYWN0dWFsbHkgbG9hZGVkLiAqLworY29uc3QgY2hhciAqRFNPX2dldF9sb2FkZWRfZmlsZW5hbWUoRFNPICpkc28pOworCit2b2lkCURTT19zZXRfZGVmYXVsdF9tZXRob2QoRFNPX01FVEhPRCAqbWV0aCk7CitEU09fTUVUSE9EICpEU09fZ2V0X2RlZmF1bHRfbWV0aG9kKHZvaWQpOworRFNPX01FVEhPRCAqRFNPX2dldF9tZXRob2QoRFNPICpkc28pOworRFNPX01FVEhPRCAqRFNPX3NldF9tZXRob2QoRFNPICpkc28sIERTT19NRVRIT0QgKm1ldGgpOworCisvKiBUaGUgYWxsLXNpbmdpbmcgYWxsLWRhbmNpbmcgbG9hZCBmdW5jdGlvbiwgeW91IG5vcm1hbGx5IHBhc3MgTlVMTAorICogZm9yIHRoZSBmaXJzdCBhbmQgdGhpcmQgcGFyYW1ldGVycy4gVXNlIERTT191cCBhbmQgRFNPX2ZyZWUgZm9yCisgKiBzdWJzZXF1ZW50IHJlZmVyZW5jZSBjb3VudCBoYW5kbGluZy4gQW55IGZsYWdzIHBhc3NlZCBpbiB3aWxsIGJlIHNldAorICogaW4gdGhlIGNvbnN0cnVjdGVkIERTTyBhZnRlciBpdHMgaW5pdCgpIGZ1bmN0aW9uIGJ1dCBiZWZvcmUgdGhlCisgKiBsb2FkIG9wZXJhdGlvbi4gSWYgJ2RzbycgaXMgbm9uLU5VTEwsICdmbGFncycgaXMgaWdub3JlZC4gKi8KK0RTTyAqRFNPX2xvYWQoRFNPICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBEU09fTUVUSE9EICptZXRoLCBpbnQgZmxhZ3MpOworCisvKiBUaGlzIGZ1bmN0aW9uIGJpbmRzIHRvIGEgdmFyaWFibGUgaW5zaWRlIGEgc2hhcmVkIGxpYnJhcnkuICovCit2b2lkICpEU09fYmluZF92YXIoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworCisvKiBUaGlzIGZ1bmN0aW9uIGJpbmRzIHRvIGEgZnVuY3Rpb24gaW5zaWRlIGEgc2hhcmVkIGxpYnJhcnkuICovCitEU09fRlVOQ19UWVBFIERTT19iaW5kX2Z1bmMoRFNPICpkc28sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworCisvKiBUaGlzIG1ldGhvZCBpcyB0aGUgZGVmYXVsdCwgYnV0IHdpbGwgYmVnLCBib3Jyb3csIG9yIHN0ZWFsIHdoYXRldmVyCisgKiBtZXRob2Qgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IG9uIGFueSBwYXJ0aWN1bGFyIHBsYXRmb3JtIChpbmNsdWRpbmcKKyAqIERTT19NRVRIX251bGwoKSBpZiBuZWNlc3NhcnkpLiAqLworRFNPX01FVEhPRCAqRFNPX01FVEhPRF9vcGVuc3NsKHZvaWQpOworCisvKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGZvciBhbGwgcGxhdGZvcm1zIC0gaWYgYSBwbGF0Zm9ybSBoYXMgbm8KKyAqIERTTyBzdXBwb3J0IHRoZW4gdGhpcyB3aWxsIGJlIHRoZSBvbmx5IG1ldGhvZCEgKi8KK0RTT19NRVRIT0QgKkRTT19NRVRIT0RfbnVsbCh2b2lkKTsKKworLyogSWYgRFNPX0RMRkNOIGlzIGRlZmluZWQsIHRoZSBzdGFuZGFyZCBkbGZjbi5oLXN0eWxlIGZ1bmN0aW9ucworICogKGRsb3BlbiwgZGxjbG9zZSwgZGxzeW0sIGV0Yykgd2lsbCBiZSB1c2VkIGFuZCBpbmNvcnBvcmF0ZWQgaW50bworICogdGhpcyBtZXRob2QuIElmIG5vdCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gTlVMTC4gKi8KK0RTT19NRVRIT0QgKkRTT19NRVRIT0RfZGxmY24odm9pZCk7CisKKy8qIElmIERTT19ETCBpcyBkZWZpbmVkLCB0aGUgc3RhbmRhcmQgZGwuaC1zdHlsZSBmdW5jdGlvbnMgKHNobF9sb2FkLCAKKyAqIHNobF91bmxvYWQsIHNobF9maW5kc3ltLCBldGMpIHdpbGwgYmUgdXNlZCBhbmQgaW5jb3Jwb3JhdGVkIGludG8KKyAqIHRoaXMgbWV0aG9kLiBJZiBub3QsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIE5VTEwuICovCitEU09fTUVUSE9EICpEU09fTUVUSE9EX2RsKHZvaWQpOworCisvKiBJZiBXSU4zMiBpcyBkZWZpbmVkLCB1c2UgRExMcy4gSWYgbm90LCByZXR1cm4gTlVMTC4gKi8KK0RTT19NRVRIT0QgKkRTT19NRVRIT0Rfd2luMzIodm9pZCk7CisKKy8qIElmIFZNUyBpcyBkZWZpbmVkLCB1c2Ugc2hhcmVkIGltYWdlcy4gSWYgbm90LCByZXR1cm4gTlVMTC4gKi8KK0RTT19NRVRIT0QgKkRTT19NRVRIT0Rfdm1zKHZvaWQpOworCisvKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBudWxsLXRlcm1pbmF0ZWQgcGF0aG5hbWUgb2YgRFNPIG1vZHVsZQorICogY29udGFpbmluZyAnYWRkcicgaW50byAnc3onIGxhcmdlIGNhbGxlci1wcm92aWRlZCAncGF0aCcgYW5kCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBbaW5jbHVkaW5nIHRyYWlsaW5nIHplcm9dCisgKiB3cml0dGVuIHRvIGl0LiBJZiAnc3onIGlzIDAgb3IgbmVnYXRpdmUsICdwYXRoJyBpcyBpZ25vcmVkIGFuZAorICogcmVxdWlyZWQgYW1vdW50IG9mIGNoYXJhY2hlcnMgW2luY2x1ZGluZyB0cmFpbGluZyB6ZXJvXSB0bworICogYWNjb21vZGF0ZSBwYXRobmFtZSBpcyByZXR1cm5lZC4gSWYgJ2FkZHInIGlzIE5VTEwsIHRoZW4KKyAqIHBhdGhuYW1lIG9mIGNyeXB0b2xpYiBpdHNlbGYgaXMgcmV0dXJuZWQuIE5lZ2F0aXZlIG9yIHplcm8KKyAqIHJldHVybiB2YWx1ZSBkZW5vdGVzIGVycm9yLgorICovCitpbnQgRFNPX3BhdGhieWFkZHIodm9pZCAqYWRkcixjaGFyICpwYXRoLGludCBzeik7CisKKy8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgd2l0aCBjYXV0aW9uISBJdCBsb29rcyB1cCBzeW1ib2xzIGluCisgKiAqYWxsKiBsb2FkZWQgbW9kdWxlcyBhbmQgaWYgbW9kdWxlIGdldHMgdW5sb2FkZWQgYnkgc29tZWJvZHkgZWxzZQorICogYXR0ZW1wdCB0byBkZXJlZmVyZW5jZSB0aGUgcG9pbnRlciBpcyBkb29tZWQgdG8gaGF2ZSBmYXRhbAorICogY29uc2VxdWVuY2VzLiBQcmltYXJ5IHVzYWdlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIHRvIHByb2JlICpjb3JlKgorICogc3lzdGVtIGZ1bmN0aW9uYWxpdHksIGUuZy4gY2hlY2sgaWYgZ2V0bmFtZWluZm8oMykgaXMgYXZhaWxhYmxlCisgKiBhdCBydW4tdGltZSB3aXRob3V0IGJvdGhlcmluZyBhYm91dCBPUy1zcGVjaWZpYyBkZXRhaWxzIHN1Y2ggYXMKKyAqIGxpYmMuc28udmVyc2lvbmluZyBvciB3aGVyZSBkb2VzIGl0IGFjdHVhbGx5IHJlc2lkZTogaW4gbGliYworICogaXRzZWxmIG9yIGxpYnNvY2tldC4gKi8KK3ZvaWQgKkRTT19nbG9iYWxfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBJZiBCZU9TIGlzIGRlZmluZWQsIHVzZSBzaGFyZWQgaW1hZ2VzLiBJZiBub3QsIHJldHVybiBOVUxMLiAqLworRFNPX01FVEhPRCAqRFNPX01FVEhPRF9iZW9zKHZvaWQpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0RTT19zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIERTTyBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBEU09fRl9CRU9TX0JJTkRfRlVOQwkJCQkgMTQ0CisjZGVmaW5lIERTT19GX0JFT1NfQklORF9WQVIJCQkJIDE0NQorI2RlZmluZSBEU09fRl9CRU9TX0xPQUQJCQkJCSAxNDYKKyNkZWZpbmUgRFNPX0ZfQkVPU19OQU1FX0NPTlZFUlRFUgkJCSAxNDcKKyNkZWZpbmUgRFNPX0ZfQkVPU19VTkxPQUQJCQkJIDE0OAorI2RlZmluZSBEU09fRl9ETEZDTl9CSU5EX0ZVTkMJCQkJIDEwMAorI2RlZmluZSBEU09fRl9ETEZDTl9CSU5EX1ZBUgkJCQkgMTAxCisjZGVmaW5lIERTT19GX0RMRkNOX0xPQUQJCQkJIDEwMgorI2RlZmluZSBEU09fRl9ETEZDTl9NRVJHRVIJCQkJIDEzMAorI2RlZmluZSBEU09fRl9ETEZDTl9OQU1FX0NPTlZFUlRFUgkJCSAxMjMKKyNkZWZpbmUgRFNPX0ZfRExGQ05fVU5MT0FECQkJCSAxMDMKKyNkZWZpbmUgRFNPX0ZfRExfQklORF9GVU5DCQkJCSAxMDQKKyNkZWZpbmUgRFNPX0ZfRExfQklORF9WQVIJCQkJIDEwNQorI2RlZmluZSBEU09fRl9ETF9MT0FECQkJCQkgMTA2CisjZGVmaW5lIERTT19GX0RMX01FUkdFUgkJCQkJIDEzMQorI2RlZmluZSBEU09fRl9ETF9OQU1FX0NPTlZFUlRFUgkJCQkgMTI0CisjZGVmaW5lIERTT19GX0RMX1VOTE9BRAkJCQkJIDEwNworI2RlZmluZSBEU09fRl9EU09fQklORF9GVU5DCQkJCSAxMDgKKyNkZWZpbmUgRFNPX0ZfRFNPX0JJTkRfVkFSCQkJCSAxMDkKKyNkZWZpbmUgRFNPX0ZfRFNPX0NPTlZFUlRfRklMRU5BTUUJCQkgMTI2CisjZGVmaW5lIERTT19GX0RTT19DVFJMCQkJCQkgMTEwCisjZGVmaW5lIERTT19GX0RTT19GUkVFCQkJCQkgMTExCisjZGVmaW5lIERTT19GX0RTT19HRVRfRklMRU5BTUUJCQkJIDEyNworI2RlZmluZSBEU09fRl9EU09fR0VUX0xPQURFRF9GSUxFTkFNRQkJCSAxMjgKKyNkZWZpbmUgRFNPX0ZfRFNPX0dMT0JBTF9MT09LVVAJCQkJIDEzOQorI2RlZmluZSBEU09fRl9EU09fTE9BRAkJCQkJIDExMgorI2RlZmluZSBEU09fRl9EU09fTUVSR0UJCQkJCSAxMzIKKyNkZWZpbmUgRFNPX0ZfRFNPX05FV19NRVRIT0QJCQkJIDExMworI2RlZmluZSBEU09fRl9EU09fUEFUSEJZQUREUgkJCQkgMTQwCisjZGVmaW5lIERTT19GX0RTT19TRVRfRklMRU5BTUUJCQkJIDEyOQorI2RlZmluZSBEU09fRl9EU09fU0VUX05BTUVfQ09OVkVSVEVSCQkJIDEyMgorI2RlZmluZSBEU09fRl9EU09fVVBfUkVGCQkJCSAxMTQKKyNkZWZpbmUgRFNPX0ZfR0xPQkFMX0xPT0tVUF9GVU5DCQkJIDEzOAorI2RlZmluZSBEU09fRl9QQVRIQllBRERSCQkJCSAxMzcKKyNkZWZpbmUgRFNPX0ZfVk1TX0JJTkRfU1lNCQkJCSAxMTUKKyNkZWZpbmUgRFNPX0ZfVk1TX0xPQUQJCQkJCSAxMTYKKyNkZWZpbmUgRFNPX0ZfVk1TX01FUkdFUgkJCQkgMTMzCisjZGVmaW5lIERTT19GX1ZNU19VTkxPQUQJCQkJIDExNworI2RlZmluZSBEU09fRl9XSU4zMl9CSU5EX0ZVTkMJCQkJIDExOAorI2RlZmluZSBEU09fRl9XSU4zMl9CSU5EX1ZBUgkJCQkgMTE5CisjZGVmaW5lIERTT19GX1dJTjMyX0dMT0JBTExPT0tVUAkJCSAxNDIKKyNkZWZpbmUgRFNPX0ZfV0lOMzJfR0xPQkFMTE9PS1VQX0ZVTkMJCQkgMTQzCisjZGVmaW5lIERTT19GX1dJTjMyX0pPSU5FUgkJCQkgMTM1CisjZGVmaW5lIERTT19GX1dJTjMyX0xPQUQJCQkJIDEyMAorI2RlZmluZSBEU09fRl9XSU4zMl9NRVJHRVIJCQkJIDEzNAorI2RlZmluZSBEU09fRl9XSU4zMl9OQU1FX0NPTlZFUlRFUgkJCSAxMjUKKyNkZWZpbmUgRFNPX0ZfV0lOMzJfUEFUSEJZQUREUgkJCQkgMTQxCisjZGVmaW5lIERTT19GX1dJTjMyX1NQTElUVEVSCQkJCSAxMzYKKyNkZWZpbmUgRFNPX0ZfV0lOMzJfVU5MT0FECQkJCSAxMjEKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBEU09fUl9DVFJMX0ZBSUxFRAkJCQkgMTAwCisjZGVmaW5lIERTT19SX0RTT19BTFJFQURZX0xPQURFRAkJCSAxMTAKKyNkZWZpbmUgRFNPX1JfRU1QVFlfRklMRV9TVFJVQ1RVUkUJCQkgMTEzCisjZGVmaW5lIERTT19SX0ZBSUxVUkUJCQkJCSAxMTQKKyNkZWZpbmUgRFNPX1JfRklMRU5BTUVfVE9PX0JJRwkJCQkgMTAxCisjZGVmaW5lIERTT19SX0ZJTklTSF9GQUlMRUQJCQkJIDEwMgorI2RlZmluZSBEU09fUl9JTkNPUlJFQ1RfRklMRV9TWU5UQVgJCQkgMTE1CisjZGVmaW5lIERTT19SX0xPQURfRkFJTEVECQkJCSAxMDMKKyNkZWZpbmUgRFNPX1JfTkFNRV9UUkFOU0xBVElPTl9GQUlMRUQJCQkgMTA5CisjZGVmaW5lIERTT19SX05PX0ZJTEVOQU1FCQkJCSAxMTEKKyNkZWZpbmUgRFNPX1JfTk9fRklMRV9TUEVDSUZJQ0FUSU9OCQkJIDExNgorI2RlZmluZSBEU09fUl9OVUxMX0hBTkRMRQkJCQkgMTA0CisjZGVmaW5lIERTT19SX1NFVF9GSUxFTkFNRV9GQUlMRUQJCQkgMTEyCisjZGVmaW5lIERTT19SX1NUQUNLX0VSUk9SCQkJCSAxMDUKKyNkZWZpbmUgRFNPX1JfU1lNX0ZBSUxVUkUJCQkJIDEwNgorI2RlZmluZSBEU09fUl9VTkxPQURfRkFJTEVECQkJCSAxMDcKKyNkZWZpbmUgRFNPX1JfVU5TVVBQT1JURUQJCQkJIDEwOAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZHRsczEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAwZDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmgKQEAgLTAsMCArMSwyNjcgQEAKKy8qIHNzbC9kdGxzMS5oICovCisvKiAKKyAqIERUTFMgaW1wbGVtZW50YXRpb24gd3JpdHRlbiBieSBOYWdlbmRyYSBNb2RhZHVndQorICogKG5hZ2VuZHJhQGNzLnN0YW5mb3JkLmVkdSkgZm9yIHRoZSBPcGVuU1NMIHByb2plY3QgMjAwNS4gIAorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDUgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfRFRMUzFfSCAKKyNkZWZpbmUgSEVBREVSX0RUTFMxX0ggCisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcHF1ZXVlLmg+CisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisjaW5jbHVkZSA8cmVzb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNlbmRpZgorI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjMyCisvKiBOZWVkZWQgZm9yIHN0cnVjdCB0aW1ldmFsICovCisjaW5jbHVkZSA8d2luc29jay5oPgorI2VsaWYgZGVmaW5lZChPUEVOU1NMX1NZU19ORVRXQVJFKSAmJiAhZGVmaW5lZChfV0lOU09DSzJBUElfKQorI2luY2x1ZGUgPHN5cy90aW1ldmFsLmg+CisjZWxzZQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBEVExTMV9WRVJTSU9OCQkJMHhGRUZGCisjZGVmaW5lIERUTFMxX0JBRF9WRVIJCQkweDAxMDAKKworI2lmIDAKKy8qIHRoaXMgYWxlcnQgZGVzY3JpcHRpb24gaXMgbm90IHNwZWNpZmllZCBhbnl3aGVyZS4uLiAqLworI2RlZmluZSBEVExTMV9BRF9NSVNTSU5HX0hBTkRTSEFLRV9NRVNTQUdFICAgIDExMAorI2VuZGlmCisKKy8qIGxlbmd0aHMgb2YgbWVzc2FnZXMgKi8KKyNkZWZpbmUgRFRMUzFfQ09PS0lFX0xFTkdUSCAgICAgICAgICAgICAgICAgICAgIDI1NgorCisjZGVmaW5lIERUTFMxX1JUX0hFQURFUl9MRU5HVEggICAgICAgICAgICAgICAgICAxMworCisjZGVmaW5lIERUTFMxX0hNX0hFQURFUl9MRU5HVEggICAgICAgICAgICAgICAgICAxMgorCisjZGVmaW5lIERUTFMxX0hNX0JBRF9GUkFHTUVOVCAgICAgICAgICAgICAgICAgICAtMgorI2RlZmluZSBEVExTMV9ITV9GUkFHTUVOVF9SRVRSWSAgICAgICAgICAgICAgICAgLTMKKworI2RlZmluZSBEVExTMV9DQ1NfSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgICAgIDEKKworI2lmZGVmIERUTFMxX0FEX01JU1NJTkdfSEFORFNIQUtFX01FU1NBR0UKKyNkZWZpbmUgRFRMUzFfQUxfSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICA3CisjZWxzZQorI2RlZmluZSBEVExTMV9BTF9IRUFERVJfTEVOR1RIICAgICAgICAgICAgICAgICAgIDIKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IGR0bHMxX2JpdG1hcF9zdAorCXsKKwl1bnNpZ25lZCBsb25nIG1hcDsJCS8qIHRyYWNrIDMyIHBhY2tldHMgb24gMzItYml0IHN5c3RlbXMKKwkJCQkJICAgYW5kIDY0IC0gb24gNjQtYml0IHN5c3RlbXMgKi8KKwl1bnNpZ25lZCBjaGFyIG1heF9zZXFfbnVtWzhdOwkvKiBtYXggcmVjb3JkIG51bWJlciBzZWVuIHNvIGZhciwKKwkJCQkJICAgNjQtYml0IHZhbHVlIGluIGJpZy1lbmRpYW4KKwkJCQkJICAgZW5jb2RpbmcgKi8KKwl9IERUTFMxX0JJVE1BUDsKKworc3RydWN0IGR0bHMxX3JldHJhbnNtaXRfc3RhdGUKKwl7CisJRVZQX0NJUEhFUl9DVFggKmVuY193cml0ZV9jdHg7CS8qIGNyeXB0b2dyYXBoaWMgc3RhdGUgKi8KKwlFVlBfTURfQ1RYICp3cml0ZV9oYXNoOwkJCS8qIHVzZWQgZm9yIG1hYyBnZW5lcmF0aW9uICovCisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCUNPTVBfQ1RYICpjb21wcmVzczsJCQkJLyogY29tcHJlc3Npb24gKi8KKyNlbHNlCisJY2hhciAqY29tcHJlc3M7CQorI2VuZGlmCisJU1NMX1NFU1NJT04gKnNlc3Npb247CisJdW5zaWduZWQgc2hvcnQgZXBvY2g7CisJfTsKKworc3RydWN0IGhtX2hlYWRlcl9zdAorCXsKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgbG9uZyBtc2dfbGVuOworCXVuc2lnbmVkIHNob3J0IHNlcTsKKwl1bnNpZ25lZCBsb25nIGZyYWdfb2ZmOworCXVuc2lnbmVkIGxvbmcgZnJhZ19sZW47CisJdW5zaWduZWQgaW50IGlzX2NjczsKKwlzdHJ1Y3QgZHRsczFfcmV0cmFuc21pdF9zdGF0ZSBzYXZlZF9yZXRyYW5zbWl0X3N0YXRlOworCX07CisKK3N0cnVjdCBjY3NfaGVhZGVyX3N0CisJeworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBzZXE7CisJfTsKKworc3RydWN0IGR0bHMxX3RpbWVvdXRfc3QKKwl7CisJLyogTnVtYmVyIG9mIHJlYWQgdGltZW91dHMgc28gZmFyICovCisJdW5zaWduZWQgaW50IHJlYWRfdGltZW91dHM7CisJCisJLyogTnVtYmVyIG9mIHdyaXRlIHRpbWVvdXRzIHNvIGZhciAqLworCXVuc2lnbmVkIGludCB3cml0ZV90aW1lb3V0czsKKwkKKwkvKiBOdW1iZXIgb2YgYWxlcnRzIHJlY2VpdmVkIHNvIGZhciAqLworCXVuc2lnbmVkIGludCBudW1fYWxlcnRzOworCX07CisKK3R5cGVkZWYgc3RydWN0IHJlY29yZF9wcXVldWVfc3QKKwl7CisJdW5zaWduZWQgc2hvcnQgZXBvY2g7CisJcHF1ZXVlIHE7CisJfSByZWNvcmRfcHF1ZXVlOworCit0eXBlZGVmIHN0cnVjdCBobV9mcmFnbWVudF9zdAorCXsKKwlzdHJ1Y3QgaG1faGVhZGVyX3N0IG1zZ19oZWFkZXI7CisJdW5zaWduZWQgY2hhciAqZnJhZ21lbnQ7CisJdW5zaWduZWQgY2hhciAqcmVhc3NlbWJseTsKKwl9IGhtX2ZyYWdtZW50OworCit0eXBlZGVmIHN0cnVjdCBkdGxzMV9zdGF0ZV9zdAorCXsKKwl1bnNpZ25lZCBpbnQgc2VuZF9jb29raWU7CisJdW5zaWduZWQgY2hhciBjb29raWVbRFRMUzFfQ09PS0lFX0xFTkdUSF07CisJdW5zaWduZWQgY2hhciByY3ZkX2Nvb2tpZVtEVExTMV9DT09LSUVfTEVOR1RIXTsKKwl1bnNpZ25lZCBpbnQgY29va2llX2xlbjsKKworCS8qIAorCSAqIFRoZSBjdXJyZW50IGRhdGEgYW5kIGhhbmRzaGFrZSBlcG9jaC4gIFRoaXMgaXMgaW5pdGlhbGx5CisJICogdW5kZWZpbmVkLCBhbmQgc3RhcnRzIGF0IHplcm8gb25jZSB0aGUgaW5pdGlhbCBoYW5kc2hha2UgaXMKKwkgKiBjb21wbGV0ZWQgCisJICovCisJdW5zaWduZWQgc2hvcnQgcl9lcG9jaDsKKwl1bnNpZ25lZCBzaG9ydCB3X2Vwb2NoOworCisJLyogcmVjb3JkcyBiZWluZyByZWNlaXZlZCBpbiB0aGUgY3VycmVudCBlcG9jaCAqLworCURUTFMxX0JJVE1BUCBiaXRtYXA7CisKKwkvKiByZW5lZ290aWF0aW9uIHN0YXJ0cyBhIG5ldyBzZXQgb2Ygc2VxdWVuY2UgbnVtYmVycyAqLworCURUTFMxX0JJVE1BUCBuZXh0X2JpdG1hcDsKKworCS8qIGhhbmRzaGFrZSBtZXNzYWdlIG51bWJlcnMgKi8KKwl1bnNpZ25lZCBzaG9ydCBoYW5kc2hha2Vfd3JpdGVfc2VxOworCXVuc2lnbmVkIHNob3J0IG5leHRfaGFuZHNoYWtlX3dyaXRlX3NlcTsKKworCXVuc2lnbmVkIHNob3J0IGhhbmRzaGFrZV9yZWFkX3NlcTsKKworCS8qIHNhdmUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgZm9yIHJldHJhbnNtaXNzaW9ucyAqLworCXVuc2lnbmVkIGNoYXIgbGFzdF93cml0ZV9zZXF1ZW5jZVs4XTsKKworCS8qIFJlY2VpdmVkIGhhbmRzaGFrZSByZWNvcmRzIChwcm9jZXNzZWQgYW5kIHVucHJvY2Vzc2VkKSAqLworCXJlY29yZF9wcXVldWUgdW5wcm9jZXNzZWRfcmNkczsKKwlyZWNvcmRfcHF1ZXVlIHByb2Nlc3NlZF9yY2RzOworCisJLyogQnVmZmVyZWQgaGFuZHNoYWtlIG1lc3NhZ2VzICovCisJcHF1ZXVlIGJ1ZmZlcmVkX21lc3NhZ2VzOworCisJLyogQnVmZmVyZWQgKHNlbnQpIGhhbmRzaGFrZSByZWNvcmRzICovCisJcHF1ZXVlIHNlbnRfbWVzc2FnZXM7CisKKwkvKiBCdWZmZXJlZCBhcHBsaWNhdGlvbiByZWNvcmRzLgorCSAqIE9ubHkgZm9yIHJlY29yZHMgYmV0d2VlbiBDQ1MgYW5kIEZpbmlzaGVkCisJICogdG8gcHJldmVudCBlaXRoZXIgcHJvdG9jb2wgdmlvbGF0aW9uIG9yCisJICogdW5uZWNlc3NhcnkgbWVzc2FnZSBsb3NzLgorCSAqLworCXJlY29yZF9wcXVldWUgYnVmZmVyZWRfYXBwX2RhdGE7CisKKwkvKiBJcyBzZXQgd2hlbiBsaXN0ZW5pbmcgZm9yIG5ldyBjb25uZWN0aW9ucyB3aXRoIGR0bHMxX2xpc3RlbigpICovCisJdW5zaWduZWQgaW50IGxpc3RlbjsKKworCXVuc2lnbmVkIGludCBtdHU7IC8qIG1heCBEVExTIHBhY2tldCBzaXplICovCisKKwlzdHJ1Y3QgaG1faGVhZGVyX3N0IHdfbXNnX2hkcjsKKwlzdHJ1Y3QgaG1faGVhZGVyX3N0IHJfbXNnX2hkcjsKKworCXN0cnVjdCBkdGxzMV90aW1lb3V0X3N0IHRpbWVvdXQ7CisKKwkvKiBJbmRpY2F0ZXMgd2hlbiB0aGUgbGFzdCBoYW5kc2hha2UgbXNnIHNlbnQgd2lsbCB0aW1lb3V0ICovCisJc3RydWN0IHRpbWV2YWwgbmV4dF90aW1lb3V0OworCisJLyogVGltZW91dCBkdXJhdGlvbiAqLworCXVuc2lnbmVkIHNob3J0IHRpbWVvdXRfZHVyYXRpb247CisKKwkvKiBzdG9yYWdlIGZvciBBbGVydC9IYW5kc2hha2UgcHJvdG9jb2wgZGF0YSByZWNlaXZlZCBidXQgbm90CisJICogeWV0IHByb2Nlc3NlZCBieSBzc2wzX3JlYWRfYnl0ZXM6ICovCisJdW5zaWduZWQgY2hhciBhbGVydF9mcmFnbWVudFtEVExTMV9BTF9IRUFERVJfTEVOR1RIXTsKKwl1bnNpZ25lZCBpbnQgYWxlcnRfZnJhZ21lbnRfbGVuOworCXVuc2lnbmVkIGNoYXIgaGFuZHNoYWtlX2ZyYWdtZW50W0RUTFMxX0hNX0hFQURFUl9MRU5HVEhdOworCXVuc2lnbmVkIGludCBoYW5kc2hha2VfZnJhZ21lbnRfbGVuOworCisJdW5zaWduZWQgaW50IHJldHJhbnNtaXR0aW5nOworCXVuc2lnbmVkIGludCBjaGFuZ2VfY2lwaGVyX3NwZWNfb2s7CisKKwl9IERUTFMxX1NUQVRFOworCit0eXBlZGVmIHN0cnVjdCBkdGxzMV9yZWNvcmRfZGF0YV9zdAorCXsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQ7CisJdW5zaWduZWQgaW50ICAgcGFja2V0X2xlbmd0aDsKKwlTU0wzX0JVRkZFUiAgICByYnVmOworCVNTTDNfUkVDT1JEICAgIHJyZWM7CisJfSBEVExTMV9SRUNPUkRfREFUQTsKKworCisvKiBUaW1lb3V0IG11bHRpcGxpZXJzICh0aW1lb3V0IHNsaWNlIGlzIGRlZmluZWQgaW4gYXBwcy90aW1lb3V0cy5oICovCisjZGVmaW5lIERUTFMxX1RNT19SRUFEX0NPVU5UICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRFRMUzFfVE1PX1dSSVRFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIERUTFMxX1RNT19BTEVSVF9DT1VOVCAgICAgICAgICAgICAgICAgICAgIDEyCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM3ODVjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCkBAIC0wLDAgKzEsMjg5IEBACisvKiBlX29zMi5oICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKworI2lmbmRlZiBIRUFERVJfRV9PUzJfSAorI2RlZmluZSBIRUFERVJfRV9PUzJfSAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBEZXRlY3Qgb3BlcmF0aW5nIHN5c3RlbXMuICBUaGlzIHByb2JhYmx5IG5lZWRzIGNvbXBsZXRpbmcuCisgKiBUaGUgcmVzdWx0IGlzIHRoYXQgYXQgbGVhc3Qgb25lIE9QRU5TU0xfU1lTX29zIG1hY3JvIHNob3VsZCBiZSBkZWZpbmVkLgorICogSG93ZXZlciwgaWYgbm9uZSBpcyBkZWZpbmVkLCBVbml4IGlzIGFzc3VtZWQuCisgKiovCisKKyNkZWZpbmUgT1BFTlNTTF9TWVNfVU5JWAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNYWNpbnRvc2gsIGJlZm9yZSBNYWNPUyBYIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChfX01XRVJLU19fKSAmJiBkZWZpbmVkKG1hY2ludG9zaCkgfHwgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfTUFDKQorIyB1bmRlZiBPUEVOU1NMX1NZU19VTklYCisjIGRlZmluZSBPUEVOU1NMX1NZU19NQUNJTlRPU0hfQ0xBU1NJQworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE5ldFdhcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBkZWZpbmVkKE5FVFdBUkUpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX05FVFdBUkUpCisjIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX05FVFdBUkUKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1pY3Jvc29mdCBvcGVyYXRpbmcgc3lzdGVtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIE5vdGUgdGhhdCBNU0RPUyBhY3R1YWxseSBkZW5vdGVzIDMyLWJpdCBlbnZpcm9ubWVudHMgcnVubmluZyBvbiB0b3Agb2YKKyAgIE1TLURPUywgc3VjaCBhcyBESkdQUCBvbmUuICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfTVNET1MpCisjIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX01TRE9TCisjZW5kaWYKKworLyogRm9yIDMyIGJpdCBlbnZpcm9ubWVudCwgdGhlcmUgc2VlbXMgdG8gYmUgdGhlIEN5Z1dpbiBlbnZpcm9ubWVudCBhbmQgdGhlbgorICAgYWxsIHRoZSBvdGhlcnMgdGhhdCB0cnkgdG8gZG8gdGhlIHNhbWUgdGhpbmcgTWljcm9zb2Z0IGRvZXMuLi4gKi8KKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTTkFNRV9VV0lOKQorIyB1bmRlZiBPUEVOU1NMX1NZU19VTklYCisjIGRlZmluZSBPUEVOU1NMX1NZU19XSU4zMl9VV0lOCisjZWxzZQorIyBpZiBkZWZpbmVkKF9fQ1lHV0lOMzJfXykgfHwgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfQ1lHV0lOMzIpCisjICB1bmRlZiBPUEVOU1NMX1NZU19VTklYCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfV0lOMzJfQ1lHV0lOCisjIGVsc2UKKyMgIGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTTkFNRV9XSU4zMikKKyMgICB1bmRlZiBPUEVOU1NMX1NZU19VTklYCisjICAgZGVmaW5lIE9QRU5TU0xfU1lTX1dJTjMyCisjICBlbmRpZgorIyAgaWYgZGVmaW5lZChPUEVOU1NMX1NZU05BTUVfV0lOTlQpCisjICAgdW5kZWYgT1BFTlNTTF9TWVNfVU5JWAorIyAgIGRlZmluZSBPUEVOU1NMX1NZU19XSU5OVAorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX1dJTkNFKQorIyAgIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgICBkZWZpbmUgT1BFTlNTTF9TWVNfV0lOQ0UKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyogQW55dGhpbmcgdGhhdCB0cmllcyB0byBsb29rIGxpa2UgTWljcm9zb2Z0IGlzICJXaW5kb3dzIiAqLworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOTlQpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOQ0UpCisjIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX1dJTkRPV1MKKyMgaWZuZGVmIE9QRU5TU0xfU1lTX01TRE9TCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfTVNET1MKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBETEwgc2V0dGluZ3MuICBUaGlzIHBhcnQgaXMgYSBiaXQgdG91Z2gsIGJlY2F1c2UgaXQncyB1cCB0byB0aGUgYXBwbGljYXRpb24KKyAgIGltcGxlbWVudG9yIGhvdyBoZSBvciBzaGUgd2lsbCBsaW5rIHRoZSBhcHBsaWNhdGlvbiwgc28gaXQgcmVxdWlyZXMgc29tZQorICAgbWFjcm8gdG8gYmUgdXNlZC4gKi8KKyNpZmRlZiBPUEVOU1NMX1NZU19XSU5ET1dTCisjIGlmbmRlZiBPUEVOU1NMX09QVF9XSU5ETEwKKyMgIGlmIGRlZmluZWQoX1dJTkRMTCkgLyogVGhpcyBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgT3BlblNTTCB0byBpbmRpY2F0ZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgIERMTCBsaW5rYWdlIHNob3VsZCBiZSB1c2VkICovCisjICAgZGVmaW5lIE9QRU5TU0xfT1BUX1dJTkRMTAorIyAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcGVuVk1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChfX1ZNUykgfHwgZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX1ZNUykKKyMgdW5kZWYgT1BFTlNTTF9TWVNfVU5JWAorIyBkZWZpbmUgT1BFTlNTTF9TWVNfVk1TCisjIGlmIGRlZmluZWQoX19ERUNDKQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX1ZNU19ERUNDCisjIGVsaWYgZGVmaW5lZChfX0RFQ0NYWCkKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19WTVNfREVDQworIyAgZGVmaW5lIE9QRU5TU0xfU1lTX1ZNU19ERUNDWFgKKyMgZWxzZQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX1ZNU19OT0RFQ0MKKyMgZW5kaWYKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1MvMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWYgZGVmaW5lZChfX0VNWF9fKSB8fCBkZWZpbmVkKF9fT1MyX18pCisjIHVuZGVmIE9QRU5TU0xfU1lTX1VOSVgKKyMgZGVmaW5lIE9QRU5TU0xfU1lTX09TMgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVbml4IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZmRlZiBPUEVOU1NMX1NZU19VTklYCisjIGlmIGRlZmluZWQobGludXgpIHx8IGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKE9QRU5TU0xfU1lTTkFNRV9MSU5VWCkKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19MSU5VWAorIyBlbmRpZgorIyBpZmRlZiBPUEVOU1NMX1NZU05BTUVfTVBFCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfTVBFCisjIGVuZGlmCisjIGlmZGVmIE9QRU5TU0xfU1lTTkFNRV9TTkkKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19TTkkKKyMgZW5kaWYKKyMgaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1VMVFJBU1BBUkMKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19VTFRSQVNQQVJDCisjIGVuZGlmCisjIGlmZGVmIE9QRU5TU0xfU1lTTkFNRV9ORVdTNAorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX05FV1M0CisjIGVuZGlmCisjIGlmZGVmIE9QRU5TU0xfU1lTTkFNRV9NQUNPU1gKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19NQUNPU1gKKyMgZW5kaWYKKyMgaWZkZWYgT1BFTlNTTF9TWVNOQU1FX01BQ09TWF9SSEFQU09EWQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX01BQ09TWF9SSEFQU09EWQorIyAgZGVmaW5lIE9QRU5TU0xfU1lTX01BQ09TWAorIyBlbmRpZgorIyBpZmRlZiBPUEVOU1NMX1NZU05BTUVfU1VOT1MKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19TVU5PUworI2VuZGlmCisjIGlmIGRlZmluZWQoX0NSQVkpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX0NSQVkpCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfQ1JBWQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKF9BSVgpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNOQU1FX0FJWCkKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19BSVgKKyMgZW5kaWYKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVk9TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgT1BFTlNTTF9TWVNOQU1FX1ZPUworIyBkZWZpbmUgT1BFTlNTTF9TWVNfVk9TCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWeFdvcmtzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIE9QRU5TU0xfU1lTTkFNRV9WWFdPUktTCisjIGRlZmluZSBPUEVOU1NMX1NZU19WWFdPUktTCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJlT1MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmIGRlZmluZWQoX19CRU9TX18pCisjIGRlZmluZSBPUEVOU1NMX1NZU19CRU9TCisjIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyMgaWYgZGVmaW5lZChCT05FX1ZFUlNJT04pCisjICBkZWZpbmUgT1BFTlNTTF9TWVNfQkVPU19CT05FCisjIGVsc2UKKyMgIGRlZmluZSBPUEVOU1NMX1NZU19CRU9TX1I1CisjIGVuZGlmCisjZW5kaWYKKworLyoqCisgKiBUaGF0J3MgaXQgZm9yIE9TLXNwZWNpZmljIHN0dWZmCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogU3BlY2lhbHMgZm9yIEkvTyBhbiBleGl0ICovCisjaWZkZWYgT1BFTlNTTF9TWVNfTVNET1MKKyMgZGVmaW5lIE9QRU5TU0xfVU5JU1REX0lPIDxpby5oPgorIyBkZWZpbmUgT1BFTlNTTF9ERUNMQVJFX0VYSVQgZXh0ZXJuIHZvaWQgZXhpdChpbnQpOworI2Vsc2UKKyMgZGVmaW5lIE9QRU5TU0xfVU5JU1REX0lPIE9QRU5TU0xfVU5JU1RECisjIGRlZmluZSBPUEVOU1NMX0RFQ0xBUkVfRVhJVCAvKiBkZWNsYXJlZCBpbiB1bmlzdGQuaCAqLworI2VuZGlmCisKKy8qIERlZmluaXRpb25zIG9mIE9QRU5TU0xfR0xPQkFMIGFuZCBPUEVOU1NMX0VYVEVSTiwgdG8gZGVmaW5lIGFuZCBkZWNsYXJlCisgICBjZXJ0YWluIGdsb2JhbCBzeW1ib2xzIHRoYXQsIHdpdGggc29tZSBjb21waWxlcnMgdW5kZXIgVk1TLCBoYXZlIHRvIGJlCisgICBkZWZpbmVkIGFuZCBkZWNsYXJlZCBleHBsaWNpdGVseSB3aXRoIGdsb2JhbGRlZiBhbmQgZ2xvYmFscmVmLgorICAgRGVmaW5pdGlvbnMgb2YgT1BFTlNTTF9FWFBPUlQgYW5kIE9QRU5TU0xfSU1QT1JULCB0byBkZWZpbmUgYW5kIGRlY2xhcmUKKyAgIERMTCBleHBvcnRzIGFuZCBpbXBvcnRzIGZvciBjb21waWxlcnMgdW5kZXIgV2luMzIuICBUaGVzZSBhcmUgYSBsaXR0bGUKKyAgIG1vcmUgY29tcGxpY2F0ZWQgdG8gdXNlLiAgQmFzaWNhbGx5LCBmb3IgYW55IGxpYnJhcnkgdGhhdCBleHBvcnRzIHNvbWUKKyAgIGdsb2JhbCB2YXJpYWJsZXMsIHRoZSBmb2xsb3dpbmcgY29kZSBtdXN0IGJlIHByZXNlbnQgaW4gdGhlIGhlYWRlciBmaWxlCisgICB0aGF0IGRlY2xhcmVzIHRoZW0sIGJlZm9yZSBPUEVOU1NMX0VYVEVSTiBpcyB1c2VkOgorCisgICAjaWZkZWYgU09NRV9CVUlMRF9GTEFHX01BQ1JPCisgICAjIHVuZGVmIE9QRU5TU0xfRVhURVJOCisgICAjIGRlZmluZSBPUEVOU1NMX0VYVEVSTiBPUEVOU1NMX0VYUE9SVAorICAgI2VuZGlmCisKKyAgIFRoZSBkZWZhdWx0IGlzIHRvIGhhdmUgT1BFTlNTTF9FWFBPUlQsIE9QRU5TU0xfSU1QT1JUIGFuZCBPUEVOU1NMX0dMT0JBTAorICAgaGF2ZSBzb21lIGdlbmVyYWxseSBzZW5zaWJsZSB2YWx1ZXMsIGFuZCBmb3IgT1BFTlNTTF9FWFRFUk4gdG8gaGF2ZSB0aGUKKyAgIHZhbHVlIE9QRU5TU0xfSU1QT1JULgorKi8KKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TX05PREVDQykKKyMgZGVmaW5lIE9QRU5TU0xfRVhQT1JUIGdsb2JhbHJlZgorIyBkZWZpbmUgT1BFTlNTTF9JTVBPUlQgZ2xvYmFscmVmCisjIGRlZmluZSBPUEVOU1NMX0dMT0JBTCBnbG9iYWxkZWYKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lORE9XUykgJiYgZGVmaW5lZChPUEVOU1NMX09QVF9XSU5ETEwpCisjIGRlZmluZSBPUEVOU1NMX0VYUE9SVCBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpCisjIGRlZmluZSBPUEVOU1NMX0lNUE9SVCBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjIGRlZmluZSBPUEVOU1NMX0dMT0JBTAorI2Vsc2UKKyMgZGVmaW5lIE9QRU5TU0xfRVhQT1JUIGV4dGVybgorIyBkZWZpbmUgT1BFTlNTTF9JTVBPUlQgZXh0ZXJuCisjIGRlZmluZSBPUEVOU1NMX0dMT0JBTAorI2VuZGlmCisjZGVmaW5lIE9QRU5TU0xfRVhURVJOIE9QRU5TU0xfSU1QT1JUCisKKy8qIE1hY3JvcyB0byBhbGxvdyBnbG9iYWwgdmFyaWFibGVzIHRvIGJlIHJlYWNoZWQgdGhyb3VnaCBmdW5jdGlvbiBjYWxscyB3aGVuCisgICByZXF1aXJlZCAoaWYgYSBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIHJlcXVpcmVzIGl0LCBmb3IgZXhhbXBsZS4KKyAgIFRoZSB3YXkgaXQncyBkb25lIGFsbG93cyBkZWZpbml0aW9ucyBsaWtlIHRoaXM6CisKKwkvLyBpbiBmb29iYXIuYworCU9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTChpbnQsZm9vYmFyLDApCisJLy8gaW4gZm9vYmFyLmgKKwlPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKGludCxmb29iYXIpOworCSNkZWZpbmUgZm9vYmFyIE9QRU5TU0xfR0xPQkFMX1JFRihmb29iYXIpCisqLworI2lmZGVmIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTgorIyBkZWZpbmUgT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKHR5cGUsbmFtZSx2YWx1ZSkJCQlcCisJdHlwZSAqX3NoYWRvd18jI25hbWUodm9pZCkJCQkJCVwKKwl7IHN0YXRpYyB0eXBlIF9oaWRlXyMjbmFtZT12YWx1ZTsgcmV0dXJuICZfaGlkZV8jI25hbWU7IH0KKyMgZGVmaW5lIE9QRU5TU0xfREVDTEFSRV9HTE9CQUwodHlwZSxuYW1lKSB0eXBlICpfc2hhZG93XyMjbmFtZSh2b2lkKQorIyBkZWZpbmUgT1BFTlNTTF9HTE9CQUxfUkVGKG5hbWUpICgqKF9zaGFkb3dfIyNuYW1lKCkpKQorI2Vsc2UKKyMgZGVmaW5lIE9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTCh0eXBlLG5hbWUsdmFsdWUpIE9QRU5TU0xfR0xPQkFMIHR5cGUgX3NoYWRvd18jI25hbWU9dmFsdWU7CisjIGRlZmluZSBPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKHR5cGUsbmFtZSkgT1BFTlNTTF9FWFBPUlQgdHlwZSBfc2hhZG93XyMjbmFtZQorIyBkZWZpbmUgT1BFTlNTTF9HTE9CQUxfUkVGKG5hbWUpIF9zaGFkb3dfIyNuYW1lCisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lYmNkaWMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lYmNkaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY1YWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2ViY2RpYy5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qIGNyeXB0by9lYmNkaWMuaCAqLworCisjaWZuZGVmIEhFQURFUl9FQkNESUNfSAorI2RlZmluZSBIRUFERVJfRUJDRElDX0gKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiBBdm9pZCBuYW1lIGNsYXNoZXMgd2l0aCBvdGhlciBhcHBsaWNhdGlvbnMgKi8KKyNkZWZpbmUgb3NfdG9hc2NpaSAgIF9vcGVuc3NsX29zX3RvYXNjaWkKKyNkZWZpbmUgb3NfdG9lYmNkaWMgIF9vcGVuc3NsX29zX3RvZWJjZGljCisjZGVmaW5lIGViY2RpYzJhc2NpaSBfb3BlbnNzbF9lYmNkaWMyYXNjaWkKKyNkZWZpbmUgYXNjaWkyZWJjZGljIF9vcGVuc3NsX2FzY2lpMmViY2RpYworCitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBvc190b2FzY2lpWzI1Nl07CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBvc190b2ViY2RpY1syNTZdOwordm9pZCAqZWJjZGljMmFzY2lpKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyY2UsIHNpemVfdCBjb3VudCk7Cit2b2lkICphc2NpaTJlYmNkaWModm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjZSwgc2l6ZV90IGNvdW50KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZWMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNzA3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZWMuaApAQCAtMCwwICsxLDExMDAgQEAKKy8qIGNyeXB0by9lYy9lYy5oICovCisvKgorICogT3JpZ2luYWxseSB3cml0dGVuIGJ5IEJvZG8gTW9lbGxlciBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyoqCisgKiBcZmlsZSBjcnlwdG8vZWMvZWMuaCBJbmNsdWRlIGZpbGUgZm9yIHRoZSBPcGVuU1NMIEVDIGZ1bmN0aW9ucworICogXGF1dGhvciBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQm9kbyBNb2VsbGVyIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0CisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogVGhlIGVsbGlwdGljIGN1cnZlIGJpbmFyeSBwb2x5bm9taWFsIHNvZnR3YXJlIGlzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSAKKyAqIFNoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYSBvZiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfRUNfSAorI2RlZmluZSBIRUFERVJfRUNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19FQworI2Vycm9yIEVDIGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2FzbjEuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNlbmRpZgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbGlmIGRlZmluZWQoX19TVU5QUk9fQykKKyMgaWYgX19TVU5QUk9fQyA+PSAweDUyMAorIyBwcmFnbWEgZXJyb3JfbWVzc2FnZXMgKG9mZixFX0FSUkFZX09GX0lOQ09NUExFVEVfTk9OQU1FLEVfQVJSQVlfT0ZfSU5DT01QTEVURSkKKyMgZW5kaWYKKyNlbmRpZgorCisgIAorI2lmbmRlZiBPUEVOU1NMX0VDQ19NQVhfRklFTERfQklUUworIyBkZWZpbmUgT1BFTlNTTF9FQ0NfTUFYX0ZJRUxEX0JJVFMgNjYxCisjZW5kaWYKKworLyoqIEVudW0gZm9yIHRoZSBwb2ludCBjb252ZXJzaW9uIGZvcm0gYXMgZGVmaW5lZCBpbiBYOS42MiAoRUNEU0EpCisgKiAgZm9yIHRoZSBlbmNvZGluZyBvZiBhIGVsbGlwdGljIGN1cnZlIHBvaW50ICh4LHkpICovCit0eXBlZGVmIGVudW0geworCS8qKiB0aGUgcG9pbnQgaXMgZW5jb2RlZCBhcyB6fHx4LCB3aGVyZSB0aGUgb2N0ZXQgeiBzcGVjaWZpZXMgCisJICogIHdoaWNoIHNvbHV0aW9uIG9mIHRoZSBxdWFkcmF0aWMgZXF1YXRpb24geSBpcyAgKi8KKwlQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQgPSAyLAorCS8qKiB0aGUgcG9pbnQgaXMgZW5jb2RlZCBhcyB6fHx4fHx5LCB3aGVyZSB6IGlzIHRoZSBvY3RldCAweDAyICAqLworCVBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VEID0gNCwKKwkvKiogdGhlIHBvaW50IGlzIGVuY29kZWQgYXMgenx8eHx8eSwgd2hlcmUgdGhlIG9jdGV0IHogc3BlY2lmaWVzCisgICAgICAgICAqICB3aGljaCBzb2x1dGlvbiBvZiB0aGUgcXVhZHJhdGljIGVxdWF0aW9uIHkgaXMgICovCisJUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQgPSA2Cit9IHBvaW50X2NvbnZlcnNpb25fZm9ybV90OworCisKK3R5cGVkZWYgc3RydWN0IGVjX21ldGhvZF9zdCBFQ19NRVRIT0Q7CisKK3R5cGVkZWYgc3RydWN0IGVjX2dyb3VwX3N0CisJLyoKKwkgRUNfTUVUSE9EICptZXRoOworCSAtLSBmaWVsZCBkZWZpbml0aW9uCisJIC0tIGN1cnZlIGNvZWZmaWNpZW50cworCSAtLSBvcHRpb25hbCBnZW5lcmF0b3Igd2l0aCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIChvcmRlciwgY29mYWN0b3IpCisJIC0tIG9wdGlvbmFsIGV4dHJhIGRhdGEgKHByZWNvbXB1dGVkIHRhYmxlIGZvciBmYXN0IGNvbXB1dGF0aW9uIG9mIG11bHRpcGxlcyBvZiBnZW5lcmF0b3IpCisJIC0tIEFTTjEgc3R1ZmYKKwkqLworCUVDX0dST1VQOworCit0eXBlZGVmIHN0cnVjdCBlY19wb2ludF9zdCBFQ19QT0lOVDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgIEVDX01FVEhPRHMgZm9yIGN1cnZlcyBvdmVyIEdGKHApICAgICAgICAgICAgICAgICAgICovICAgICAgIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogUmV0dXJucyB0aGUgYmFzaWMgR0ZwIGVjIG1ldGhvZHMgd2hpY2ggcHJvdmlkZXMgdGhlIGJhc2lzIGZvciB0aGUKKyAqICBvcHRpbWl6ZWQgbWV0aG9kcy4gCisgKiAgXHJldHVybiAgRUNfTUVUSE9EIG9iamVjdAorICovCitjb25zdCBFQ19NRVRIT0QgKkVDX0dGcF9zaW1wbGVfbWV0aG9kKHZvaWQpOworCisvKiogUmV0dXJucyBHRnAgbWV0aG9kcyB1c2luZyBtb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uLgorICogIFxyZXR1cm4gIEVDX01FVEhPRCBvYmplY3QKKyAqLworY29uc3QgRUNfTUVUSE9EICpFQ19HRnBfbW9udF9tZXRob2Qodm9pZCk7CisKKy8qKiBSZXR1cm5zIEdGcCBtZXRob2RzIHVzaW5nIG9wdGltaXplZCBtZXRob2RzIGZvciBOSVNUIHJlY29tbWVuZGVkIGN1cnZlcworICogIFxyZXR1cm4gIEVDX01FVEhPRCBvYmplY3QKKyAqLworY29uc3QgRUNfTUVUSE9EICpFQ19HRnBfbmlzdF9tZXRob2Qodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAKKy8qICAgICAgICAgICBFQ19NRVRIT0QgZm9yIGN1cnZlcyBvdmVyIEdGKDJebSkgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFJldHVybnMgdGhlIGJhc2ljIEdGMm0gZWMgbWV0aG9kIAorICogIFxyZXR1cm4gIEVDX01FVEhPRCBvYmplY3QKKyAqLworY29uc3QgRUNfTUVUSE9EICpFQ19HRjJtX3NpbXBsZV9tZXRob2Qodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgRUNfR1JPVVAgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQ3JlYXRlcyBhIG5ldyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gICBtZXRoICBFQ19NRVRIT0QgdG8gdXNlCisgKiAgXHJldHVybiAgbmV3bHkgY3JlYXRlZCBFQ19HUk9VUCBvYmplY3Qgb3IgTlVMTCBpbiBjYXNlIG9mIGFuIGVycm9yLgorICovCitFQ19HUk9VUCAqRUNfR1JPVVBfbmV3KGNvbnN0IEVDX01FVEhPRCAqbWV0aCk7CisKKy8qKiBGcmVlcyBhIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIG9iamVjdCB0byBiZSBmcmVlZC4KKyAqLwordm9pZCBFQ19HUk9VUF9mcmVlKEVDX0dST1VQICpncm91cCk7CisKKy8qKiBDbGVhcnMgYW5kIGZyZWVzIGEgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0IHRvIGJlIGNsZWFyZWQgYW5kIGZyZWVkLgorICovCit2b2lkIEVDX0dST1VQX2NsZWFyX2ZyZWUoRUNfR1JPVVAgKmdyb3VwKTsKKworLyoqIENvcGllcyBFQ19HUk9VUCBvYmplY3RzLiBOb3RlOiBib3RoIEVDX0dST1VQcyBtdXN0IHVzZSB0aGUgc2FtZSBFQ19NRVRIT0QuCisgKiAgXHBhcmFtICBkc3QgIGRlc3RpbmF0aW9uIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgc3JjICBzb3VyY2UgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK2ludCBFQ19HUk9VUF9jb3B5KEVDX0dST1VQICpkc3QsIGNvbnN0IEVDX0dST1VQICpzcmMpOworCisvKiogQ3JlYXRlcyBhIG5ldyBFQ19HUk9VUCBvYmplY3QgYW5kIGNvcGllcyB0aGUgY29waWVzIHRoZSBjb250ZW50CisgKiAgZm9ybSBzcmMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgRUNfS0VZIG9iamVjdAorICogIFxwYXJhbSAgc3JjICBzb3VyY2UgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHJldHVybiBuZXdseSBjcmVhdGVkIEVDX0dST1VQIG9iamVjdCBvciBOVUxMIGluIGNhc2Ugb2YgYW4gZXJyb3IuCisgKi8KK0VDX0dST1VQICpFQ19HUk9VUF9kdXAoY29uc3QgRUNfR1JPVVAgKnNyYyk7CisKKy8qKiBSZXR1cm5zIHRoZSBFQ19NRVRIT0Qgb2YgdGhlIEVDX0dST1VQIG9iamVjdC4KKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QgCisgKiAgXHJldHVybiBFQ19NRVRIT0QgdXNlZCBpbiB0aGlzIEVDX0dST1VQIG9iamVjdC4KKyAqLworY29uc3QgRUNfTUVUSE9EICpFQ19HUk9VUF9tZXRob2Rfb2YoY29uc3QgRUNfR1JPVVAgKmdyb3VwKTsKKworLyoqIFJldHVybnMgdGhlIGZpZWxkIHR5cGUgb2YgdGhlIEVDX01FVEhPRC4KKyAqICBccGFyYW0gIG1ldGggIEVDX01FVEhPRCBvYmplY3QKKyAqICBccmV0dXJuIE5JRCBvZiB0aGUgdW5kZXJseWluZyBmaWVsZCB0eXBlIE9JRC4KKyAqLworaW50IEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZShjb25zdCBFQ19NRVRIT0QgKm1ldGgpOworCisvKiogU2V0cyB0aGUgZ2VuZXJhdG9yIGFuZCBpdCdzIG9yZGVyL2NvZmFjdG9yIG9mIGEgRUNfR1JPVVAgb2JqZWN0LgorICogIFxwYXJhbSAgZ3JvdXAgICAgICBFQ19HUk9VUCBvYmplY3QgCisgKiAgXHBhcmFtICBnZW5lcmF0b3IgIEVDX1BPSU5UIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0b3IuCisgKiAgXHBhcmFtICBvcmRlciAgICAgIHRoZSBvcmRlciBvZiB0aGUgZ3JvdXAgZ2VuZXJhdGVkIGJ5IHRoZSBnZW5lcmF0b3IuCisgKiAgXHBhcmFtICBjb2ZhY3RvciAgIHRoZSBpbmRleCBvZiB0aGUgc3ViLWdyb3VwIGdlbmVyYXRlZCBieSB0aGUgZ2VuZXJhdG9yCisgKiAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBncm91cCBvZiBhbGwgcG9pbnRzIG9uIHRoZSBlbGxpcHRpYyBjdXJ2ZS4KKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19HUk9VUF9zZXRfZ2VuZXJhdG9yKEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKmdlbmVyYXRvciwgY29uc3QgQklHTlVNICpvcmRlciwgY29uc3QgQklHTlVNICpjb2ZhY3Rvcik7CisKKy8qKiBSZXR1cm5zIHRoZSBnZW5lcmF0b3Igb2YgYSBFQ19HUk9VUCBvYmplY3QuCisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHJldHVybiB0aGUgY3VycmVudGx5IHVzZWQgZ2VuZXJhdG9yIChwb3NzaWJseSBOVUxMKS4KKyAqLworY29uc3QgRUNfUE9JTlQgKkVDX0dST1VQX2dldDBfZ2VuZXJhdG9yKGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKy8qKiBHZXRzIHRoZSBvcmRlciBvZiBhIEVDX0dST1VQCisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBvcmRlciAgQklHTlVNIHRvIHdoaWNoIHRoZSBvcmRlciBpcyBjb3BpZWQKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19HUk9VUF9nZXRfb3JkZXIoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKm9yZGVyLCBCTl9DVFggKmN0eCk7CisKKy8qKiBHZXRzIHRoZSBjb2ZhY3RvciBvZiBhIEVDX0dST1VQCisgKiAgXHBhcmFtICBncm91cCAgICAgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBjb2ZhY3RvciAgQklHTlVNIHRvIHdoaWNoIHRoZSBjb2ZhY3RvciBpcyBjb3BpZWQKKyAqICBccGFyYW0gIGN0eCAgICAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19HUk9VUF9nZXRfY29mYWN0b3IoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKmNvZmFjdG9yLCBCTl9DVFggKmN0eCk7CisKKy8qKiBTZXRzIHRoZSBuYW1lIG9mIGEgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBuaWQgICAgTklEIG9mIHRoZSBjdXJ2ZSBuYW1lIE9JRAorICovCit2b2lkIEVDX0dST1VQX3NldF9jdXJ2ZV9uYW1lKEVDX0dST1VQICpncm91cCwgaW50IG5pZCk7CisKKy8qKiBSZXR1cm5zIHRoZSBjdXJ2ZSBuYW1lIG9mIGEgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHJldHVybiBOSUQgb2YgdGhlIGN1cnZlIG5hbWUgT0lEIG9yIDAgaWYgbm90IHNldC4KKyAqLworaW50IEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKK3ZvaWQgRUNfR1JPVVBfc2V0X2FzbjFfZmxhZyhFQ19HUk9VUCAqZ3JvdXAsIGludCBmbGFnKTsKK2ludCBFQ19HUk9VUF9nZXRfYXNuMV9mbGFnKGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKK3ZvaWQgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybShFQ19HUk9VUCAqLCBwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCk7Citwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtKGNvbnN0IEVDX0dST1VQICopOworCit1bnNpZ25lZCBjaGFyICpFQ19HUk9VUF9nZXQwX3NlZWQoY29uc3QgRUNfR1JPVVAgKik7CitzaXplX3QgRUNfR1JPVVBfZ2V0X3NlZWRfbGVuKGNvbnN0IEVDX0dST1VQICopOworc2l6ZV90IEVDX0dST1VQX3NldF9zZWVkKEVDX0dST1VQICosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90IGxlbik7CisKKy8qKiBTZXRzIHRoZSBwYXJhbWV0ZXIgb2YgYSBlYyBvdmVyIEdGcCBkZWZpbmVkIGJ5IHleMiA9IHheMyArIGEqeCArIGIKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBCSUdOVU0gd2l0aCB0aGUgcHJpbWUgbnVtYmVyCisgKiAgXHBhcmFtICBhICAgICAgQklHTlVNIHdpdGggcGFyYW1ldGVyIGEgb2YgdGhlIGVxdWF0aW9uCisgKiAgXHBhcmFtICBiICAgICAgQklHTlVNIHdpdGggcGFyYW1ldGVyIGIgb2YgdGhlIGVxdWF0aW9uCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfR1JPVVBfc2V0X2N1cnZlX0dGcChFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEJJR05VTSAqcCwgY29uc3QgQklHTlVNICphLCBjb25zdCBCSUdOVU0gKmIsIEJOX0NUWCAqY3R4KTsKKworLyoqIEdldHMgdGhlIHBhcmFtZXRlciBvZiB0aGUgZWMgb3ZlciBHRnAgZGVmaW5lZCBieSB5XjIgPSB4XjMgKyBhKnggKyBiCisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwICAgICAgQklHTlVNIGZvciB0aGUgcHJpbWUgbnVtYmVyCisgKiAgXHBhcmFtICBhICAgICAgQklHTlVNIGZvciBwYXJhbWV0ZXIgYSBvZiB0aGUgZXF1YXRpb24KKyAqICBccGFyYW0gIGIgICAgICBCSUdOVU0gZm9yIHBhcmFtZXRlciBiIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX0dST1VQX2dldF9jdXJ2ZV9HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBCSUdOVU0gKnAsIEJJR05VTSAqYSwgQklHTlVNICpiLCBCTl9DVFggKmN0eCk7CisKKy8qKiBTZXRzIHRoZSBwYXJhbWV0ZXIgb2YgYSBlYyBvdmVyIEdGMm0gZGVmaW5lZCBieSB5XjIgKyB4KnkgPSB4XjMgKyBhKnheMiArIGIKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBCSUdOVU0gd2l0aCB0aGUgcG9seW5vbWlhbCBkZWZpbmluZyB0aGUgdW5kZXJseWluZyBmaWVsZAorICogIFxwYXJhbSAgYSAgICAgIEJJR05VTSB3aXRoIHBhcmFtZXRlciBhIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgYiAgICAgIEJJR05VTSB3aXRoIHBhcmFtZXRlciBiIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX0dST1VQX3NldF9jdXJ2ZV9HRjJtKEVDX0dST1VQICpncm91cCwgY29uc3QgQklHTlVNICpwLCBjb25zdCBCSUdOVU0gKmEsIGNvbnN0IEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpOworCisvKiogR2V0cyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBlYyBvdmVyIEdGMm0gZGVmaW5lZCBieSB5XjIgKyB4KnkgPSB4XjMgKyBhKnheMiArIGIKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBCSUdOVU0gZm9yIHRoZSBwb2x5bm9taWFsIGRlZmluaW5nIHRoZSB1bmRlcmx5aW5nIGZpZWxkCisgKiAgXHBhcmFtICBhICAgICAgQklHTlVNIGZvciBwYXJhbWV0ZXIgYSBvZiB0aGUgZXF1YXRpb24KKyAqICBccGFyYW0gIGIgICAgICBCSUdOVU0gZm9yIHBhcmFtZXRlciBiIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX0dST1VQX2dldF9jdXJ2ZV9HRjJtKGNvbnN0IEVDX0dST1VQICpncm91cCwgQklHTlVNICpwLCBCSUdOVU0gKmEsIEJJR05VTSAqYiwgQk5fQ1RYICpjdHgpOworCisvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCBhIGZpZWxkIGVsZW1lbnQgCisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHJldHVybiBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gcmVwcmVzZW50IGEgZmllbGQgZWxlbWVudAorICovCitpbnQgRUNfR1JPVVBfZ2V0X2RlZ3JlZShjb25zdCBFQ19HUk9VUCAqZ3JvdXApOworCisvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhcmFtZXRlciBpbiB0aGUgRUNfR1JPVVAgZGVmaW5lIGEgdmFsaWQgZWMgZ3JvdXAKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgaWYgZ3JvdXAgaXMgYSB2YWxpZCBlYyBncm91cCBhbmQgMCBvdGhlcndpc2UKKyAqLworaW50IEVDX0dST1VQX2NoZWNrKGNvbnN0IEVDX0dST1VQICpncm91cCwgQk5fQ1RYICpjdHgpOworCisvKiogQ2hlY2tzIHdoZXRoZXIgdGhlIGRpc2NyaW1pbmFudCBvZiB0aGUgZWxsaXB0aWMgY3VydmUgaXMgemVybyBvciBub3QKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgaWYgdGhlIGRpc2NyaW1pbmFudCBpcyBub3QgemVybyBhbmQgMCBvdGhlcndpc2UKKyAqLworaW50IEVDX0dST1VQX2NoZWNrX2Rpc2NyaW1pbmFudChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEJOX0NUWCAqY3R4KTsKKworLyoqIENvbXBhcmVzIHR3byBFQ19HUk9VUCBvYmplY3RzCisgKiAgXHBhcmFtICBhICAgIGZpcnN0IEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgYiAgICBzZWNvbmQgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBjdHggIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMCBpZiBib3RoIGdyb3VwcyBhcmUgZXF1YWwgYW5kIDEgb3RoZXJ3aXNlCisgKi8KK2ludCBFQ19HUk9VUF9jbXAoY29uc3QgRUNfR1JPVVAgKmEsIGNvbnN0IEVDX0dST1VQICpiLCBCTl9DVFggKmN0eCk7CisKKy8qIEVDX0dST1VQX25ld19HRiooKSBjYWxscyBFQ19HUk9VUF9uZXcoKSBhbmQgRUNfR1JPVVBfc2V0X0dGKigpCisgKiBhZnRlciBjaG9vc2luZyBhbiBhcHByb3ByaWF0ZSBFQ19NRVRIT0QgKi8KKworLyoqIENyZWF0ZXMgYSBuZXcgRUNfR1JPVVAgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGRlZmluZWQKKyAqICBvdmVyIEdGcCAoZGVmaW5lZCBieSB0aGUgZXF1YXRpb24geV4yID0geF4zICsgYSp4ICsgYikKKyAqICBccGFyYW0gIHAgICAgQklHTlVNIHdpdGggdGhlIHByaW1lIG51bWJlcgorICogIFxwYXJhbSAgYSAgICBCSUdOVU0gd2l0aCB0aGUgcGFyYW1ldGVyIGEgb2YgdGhlIGVxdWF0aW9uCisgKiAgXHBhcmFtICBiICAgIEJJR05VTSB3aXRoIHRoZSBwYXJhbWV0ZXIgYiBvZiB0aGUgZXF1YXRpb24KKyAqICBccGFyYW0gIGN0eCAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiBuZXdseSBjcmVhdGVkIEVDX0dST1VQIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycworICovCitFQ19HUk9VUCAqRUNfR1JPVVBfbmV3X2N1cnZlX0dGcChjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCk7CisKKy8qKiBDcmVhdGVzIGEgbmV3IEVDX0dST1VQIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBkZWZpbmVkCisgKiAgb3ZlciBHRjJtIChkZWZpbmVkIGJ5IHRoZSBlcXVhdGlvbiB5XjIgKyB4KnkgPSB4XjMgKyBhKnheMiArIGIpCisgKiAgXHBhcmFtICBwICAgIEJJR05VTSB3aXRoIHRoZSBwb2x5bm9taWFsIGRlZmluaW5nIHRoZSB1bmRlcmx5aW5nIGZpZWxkCisgKiAgXHBhcmFtICBhICAgIEJJR05VTSB3aXRoIHRoZSBwYXJhbWV0ZXIgYSBvZiB0aGUgZXF1YXRpb24KKyAqICBccGFyYW0gIGIgICAgQklHTlVNIHdpdGggdGhlIHBhcmFtZXRlciBiIG9mIHRoZSBlcXVhdGlvbgorICogIFxwYXJhbSAgY3R4ICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIG5ld2x5IGNyZWF0ZWQgRUNfR1JPVVAgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgKi8KK0VDX0dST1VQICpFQ19HUk9VUF9uZXdfY3VydmVfR0YybShjb25zdCBCSUdOVU0gKnAsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpiLCBCTl9DVFggKmN0eCk7CisKKy8qKiBDcmVhdGVzIGEgRUNfR1JPVVAgb2JqZWN0IHdpdGggYSBjdXJ2ZSBzcGVjaWZpZWQgYnkgYSBOSUQKKyAqICBccGFyYW0gIG5pZCAgTklEIG9mIHRoZSBPSUQgb2YgdGhlIGN1cnZlIG5hbWUKKyAqICBccmV0dXJuIG5ld2x5IGNyZWF0ZWQgRUNfR1JPVVAgb2JqZWN0IHdpdGggc3BlY2lmaWVkIGN1cnZlIG9yIE5VTEwKKyAqICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK0VDX0dST1VQICpFQ19HUk9VUF9uZXdfYnlfY3VydmVfbmFtZShpbnQgbmlkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgIGhhbmRsaW5nIG9mIGludGVybmFsIGN1cnZlcyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsgCisJaW50IG5pZDsKKwljb25zdCBjaGFyICpjb21tZW50OworCX0gRUNfYnVpbHRpbl9jdXJ2ZTsKKworLyogRUNfYnVpbHRpbl9jdXJ2ZXMoRUNfYnVpbHRpbl9jdXJ2ZSAqciwgc2l6ZV90IHNpemUpIHJldHVybnMgbnVtYmVyIAorICogb2YgYWxsIGF2YWlsYWJsZSBjdXJ2ZXMgb3IgemVybyBpZiBhIGVycm9yIG9jY3VycmVkLiAKKyAqIEluIGNhc2UgciBpc3Qgbm90IHplcm8gbml0ZW1zIEVDX2J1aWx0aW5fY3VydmUgc3RydWN0dXJlcyAKKyAqIGFyZSBmaWxsZWQgd2l0aCB0aGUgZGF0YSBvZiB0aGUgZmlyc3Qgbml0ZW1zIGludGVybmFsIGdyb3VwcyAqLworc2l6ZV90IEVDX2dldF9idWlsdGluX2N1cnZlcyhFQ19idWlsdGluX2N1cnZlICpyLCBzaXplX3Qgbml0ZW1zKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgRUNfUE9JTlQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBDcmVhdGVzIGEgbmV3IEVDX1BPSU5UIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBFQ19HUk9VUAorICogIFxwYXJhbSAgZ3JvdXAgIEVDX0dST1VQIHRoZSB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxyZXR1cm4gbmV3bHkgY3JlYXRlZCBFQ19QT0lOVCBvYmplY3Qgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitFQ19QT0lOVCAqRUNfUE9JTlRfbmV3KGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKy8qKiBGcmVlcyBhIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgcG9pbnQgIEVDX1BPSU5UIG9iamVjdCB0byBiZSBmcmVlZAorICovCit2b2lkIEVDX1BPSU5UX2ZyZWUoRUNfUE9JTlQgKnBvaW50KTsKKworLyoqIENsZWFycyBhbmQgZnJlZXMgYSBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIHBvaW50ICBFQ19QT0lOVCBvYmplY3QgdG8gYmUgY2xlYXJlZCBhbmQgZnJlZWQKKyAqLwordm9pZCBFQ19QT0lOVF9jbGVhcl9mcmVlKEVDX1BPSU5UICpwb2ludCk7CisKKy8qKiBDb3BpZXMgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICBkc3QgIGRlc3RpbmF0aW9uIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgc3JjICBzb3VyY2UgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfY29weShFQ19QT0lOVCAqZHN0LCBjb25zdCBFQ19QT0lOVCAqc3JjKTsKKworLyoqIENyZWF0ZXMgYSBuZXcgRUNfUE9JTlQgb2JqZWN0IGFuZCBjb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHN1cHBsaWVkCisgKiAgRUNfUE9JTlQKKyAqICBccGFyYW0gIHNyYyAgICBzb3VyY2UgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyB0aGUgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHJldHVybiBuZXdseSBjcmVhdGVkIEVDX1BPSU5UIG9iamVjdCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkIAorICovCitFQ19QT0lOVCAqRUNfUE9JTlRfZHVwKGNvbnN0IEVDX1BPSU5UICpzcmMsIGNvbnN0IEVDX0dST1VQICpncm91cCk7CisgCisvKiogUmV0dXJucyB0aGUgRUNfTUVUSE9EIHVzZWQgaW4gRUNfUE9JTlQgb2JqZWN0IAorICogIFxwYXJhbSAgcG9pbnQgIEVDX1BPSU5UIG9iamVjdAorICogIFxyZXR1cm4gdGhlIEVDX01FVEhPRCB1c2VkCisgKi8KK2NvbnN0IEVDX01FVEhPRCAqRUNfUE9JTlRfbWV0aG9kX29mKGNvbnN0IEVDX1BPSU5UICpwb2ludCk7CisKKy8qKiBTZXRzIGEgcG9pbnQgdG8gaW5maW5pdHkgKG5ldXRyYWwgZWxlbWVudCkKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcG9pbnQgIEVDX1BPSU5UIHRvIHNldCB0byBpbmZpbml0eQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5UX3NldF90b19pbmZpbml0eShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwb2ludCk7CisKKy8qKiBTZXRzIHRoZSBqYWNvYmlhbiBwcm9qZWN0aXZlIGNvb3JkaW5hdGVzIG9mIGEgRUNfUE9JTlQgb3ZlciBHRnAKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgeCAgICAgIEJJR05VTSB3aXRoIHRoZSB4LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIHkgICAgICBCSUdOVU0gd2l0aCB0aGUgeS1jb29yZGluYXRlCisgKiAgXHBhcmFtICB6ICAgICAgQklHTlVNIHdpdGggdGhlIHotY29vcmRpbmF0ZQorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5UX3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcCwKKwljb25zdCBCSUdOVU0gKngsIGNvbnN0IEJJR05VTSAqeSwgY29uc3QgQklHTlVNICp6LCBCTl9DVFggKmN0eCk7CisKKy8qKiBHZXRzIHRoZSBqYWNvYmlhbiBwcm9qZWN0aXZlIGNvb3JkaW5hdGVzIG9mIGEgRUNfUE9JTlQgb3ZlciBHRnAKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgeCAgICAgIEJJR05VTSBmb3IgdGhlIHgtY29vcmRpbmF0ZQorICogIFxwYXJhbSAgeSAgICAgIEJJR05VTSBmb3IgdGhlIHktY29vcmRpbmF0ZQorICogIFxwYXJhbSAgeiAgICAgIEJJR05VTSBmb3IgdGhlIHotY29vcmRpbmF0ZQorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5UX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorCWNvbnN0IEVDX1BPSU5UICpwLCBCSUdOVU0gKngsIEJJR05VTSAqeSwgQklHTlVNICp6LCBCTl9DVFggKmN0eCk7CisKKy8qKiBTZXRzIHRoZSBhZmZpbmUgY29vcmRpbmF0ZXMgb2YgYSBFQ19QT0lOVCBvdmVyIEdGcAorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwICAgICAgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICB4ICAgICAgQklHTlVNIHdpdGggdGhlIHgtY29vcmRpbmF0ZQorICogIFxwYXJhbSAgeSAgICAgIEJJR05VTSB3aXRoIHRoZSB5LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwLAorCWNvbnN0IEJJR05VTSAqeCwgY29uc3QgQklHTlVNICp5LCBCTl9DVFggKmN0eCk7CisKKy8qKiBHZXRzIHRoZSBhZmZpbmUgY29vcmRpbmF0ZXMgb2YgYSBFQ19QT0lOVCBvdmVyIEdGcAorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwICAgICAgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICB4ICAgICAgQklHTlVNIGZvciB0aGUgeC1jb29yZGluYXRlCisgKiAgXHBhcmFtICB5ICAgICAgQklHTlVNIGZvciB0aGUgeS1jb29yZGluYXRlCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAoY29uc3QgRUNfR1JPVVAgKmdyb3VwLAorCWNvbnN0IEVDX1BPSU5UICpwLCBCSUdOVU0gKngsIEJJR05VTSAqeSwgQk5fQ1RYICpjdHgpOworCisvKiogU2V0cyB0aGUgeDkuNjIgY29tcHJlc3NlZCBjb29yZGluYXRlcyBvZiBhIEVDX1BPSU5UIG92ZXIgR0ZwCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIHggICAgICBCSUdOVU0gd2l0aCB4LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIHlfYml0ICBpbnRlZ2VyIHdpdGggdGhlIHktQml0IChlaXRoZXIgMCBvciAxKQorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwLAorCWNvbnN0IEJJR05VTSAqeCwgaW50IHlfYml0LCBCTl9DVFggKmN0eCk7CisKKy8qKiBTZXRzIHRoZSBhZmZpbmUgY29vcmRpbmF0ZXMgb2YgYSBFQ19QT0lOVCBvdmVyIEdGMm0KKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgeCAgICAgIEJJR05VTSB3aXRoIHRoZSB4LWNvb3JkaW5hdGUKKyAqICBccGFyYW0gIHkgICAgICBCSUdOVU0gd2l0aCB0aGUgeS1jb29yZGluYXRlCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnAsCisJY29uc3QgQklHTlVNICp4LCBjb25zdCBCSUdOVU0gKnksIEJOX0NUWCAqY3R4KTsKKworLyoqIEdldHMgdGhlIGFmZmluZSBjb29yZGluYXRlcyBvZiBhIEVDX1BPSU5UIG92ZXIgR0YybQorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICBwICAgICAgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICB4ICAgICAgQklHTlVNIGZvciB0aGUgeC1jb29yZGluYXRlCisgKiAgXHBhcmFtICB5ICAgICAgQklHTlVNIGZvciB0aGUgeS1jb29yZGluYXRlCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRjJtKGNvbnN0IEVDX0dST1VQICpncm91cCwKKwljb25zdCBFQ19QT0lOVCAqcCwgQklHTlVNICp4LCBCSUdOVU0gKnksIEJOX0NUWCAqY3R4KTsKKworLyoqIFNldHMgdGhlIHg5LjYyIGNvbXByZXNzZWQgY29vcmRpbmF0ZXMgb2YgYSBFQ19QT0lOVCBvdmVyIEdGMm0KKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgcCAgICAgIEVDX1BPSU5UIG9iamVjdAorICogIFxwYXJhbSAgeCAgICAgIEJJR05VTSB3aXRoIHgtY29vcmRpbmF0ZQorICogIFxwYXJhbSAgeV9iaXQgIGludGVnZXIgd2l0aCB0aGUgeS1CaXQgKGVpdGhlciAwIG9yIDEpCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0YybShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpwLAorCWNvbnN0IEJJR05VTSAqeCwgaW50IHlfYml0LCBCTl9DVFggKmN0eCk7CisKKy8qKiBFbmNvZGVzIGEgRUNfUE9JTlQgb2JqZWN0IHRvIGEgb2N0ZXQgc3RyaW5nCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIGZvcm0gICBwb2ludCBjb252ZXJzaW9uIGZvcm0KKyAqICBccGFyYW0gIGJ1ZiAgICBtZW1vcnkgYnVmZmVyIGZvciB0aGUgcmVzdWx0LiBJZiBOVUxMIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgKiAgICAgICAgICAgICAgICAgcmVxdWlyZWQgYnVmZmVyIHNpemUuCisgKiAgXHBhcmFtICBsZW4gICAgbGVuZ3RoIG9mIHRoZSBtZW1vcnkgYnVmZmVyCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIG9jdGV0IHN0cmluZyBvciAwIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK3NpemVfdCBFQ19QT0lOVF9wb2ludDJvY3QoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcCwKKwlwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtLAorICAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIHNpemVfdCBsZW4sIEJOX0NUWCAqY3R4KTsKKworLyoqIERlY29kZXMgYSBFQ19QT0lOVCBmcm9tIGEgb2N0ZXQgc3RyaW5nCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIGJ1ZiAgICBtZW1vcnkgYnVmZmVyIHdpdGggdGhlIGVuY29kZWQgZWMgcG9pbnQKKyAqICBccGFyYW0gIGxlbiAgICBsZW5ndGggb2YgdGhlIGVuY29kZWQgZWMgcG9pbnQKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVF9vY3QycG9pbnQoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBFQ19QT0lOVCAqcCwKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBzaXplX3QgbGVuLCBCTl9DVFggKmN0eCk7CisKKy8qIG90aGVyIGludGVyZmFjZXMgdG8gcG9pbnQyb2N0L29jdDJwb2ludDogKi8KK0JJR05VTSAqRUNfUE9JTlRfcG9pbnQyYm4oY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgRUNfUE9JTlQgKiwKKwlwb2ludF9jb252ZXJzaW9uX2Zvcm1fdCBmb3JtLCBCSUdOVU0gKiwgQk5fQ1RYICopOworRUNfUE9JTlQgKkVDX1BPSU5UX2JuMnBvaW50KGNvbnN0IEVDX0dST1VQICosIGNvbnN0IEJJR05VTSAqLAorCUVDX1BPSU5UICosIEJOX0NUWCAqKTsKK2NoYXIgKkVDX1BPSU5UX3BvaW50MmhleChjb25zdCBFQ19HUk9VUCAqLCBjb25zdCBFQ19QT0lOVCAqLAorCXBvaW50X2NvbnZlcnNpb25fZm9ybV90IGZvcm0sIEJOX0NUWCAqKTsKK0VDX1BPSU5UICpFQ19QT0lOVF9oZXgycG9pbnQoY29uc3QgRUNfR1JPVVAgKiwgY29uc3QgY2hhciAqLAorCUVDX1BPSU5UICosIEJOX0NUWCAqKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgIGZ1bmN0aW9ucyBmb3IgZG9pbmcgRUNfUE9JTlQgYXJpdGhtZXRpYyAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBDb21wdXRlcyB0aGUgc3VtIG9mIHR3byBFQ19QT0lOVCAKKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgciAgICAgIEVDX1BPSU5UIG9iamVjdCBmb3IgdGhlIHJlc3VsdCAociA9IGEgKyBiKQorICogIFxwYXJhbSAgYSAgICAgIEVDX1BPSU5UIG9iamVjdCB3aXRoIHRoZSBmaXJzdCBzdW1tYW5kCisgKiAgXHBhcmFtICBiICAgICAgRUNfUE9JTlQgb2JqZWN0IHdpdGggdGhlIHNlY29uZCBzdW1tYW5kCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfYWRkKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBjb25zdCBFQ19QT0lOVCAqYiwgQk5fQ1RYICpjdHgpOworCisvKiogQ29tcHV0ZXMgdGhlIGRvdWJsZSBvZiBhIEVDX1BPSU5UCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHIgICAgICBFQ19QT0lOVCBvYmplY3QgZm9yIHRoZSByZXN1bHQgKHIgPSAyICogYSkKKyAqICBccGFyYW0gIGEgICAgICBFQ19QT0lOVCBvYmplY3QgCisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJlZAorICovCitpbnQgRUNfUE9JTlRfZGJsKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEVDX1BPSU5UICphLCBCTl9DVFggKmN0eCk7CisKKy8qKiBDb21wdXRlcyB0aGUgaW52ZXJzZSBvZiBhIEVDX1BPSU5UCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGEgICAgICBFQ19QT0lOVCBvYmplY3QgdG8gYmUgaW52ZXJ0ZWQgKGl0J3MgdXNlZCBmb3IgdGhlIHJlc3VsdCBhcyB3ZWxsKQorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5UX2ludmVydChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICphLCBCTl9DVFggKmN0eCk7CisKKy8qKiBDaGVja3Mgd2hldGhlciB0aGUgcG9pbnQgaXMgdGhlIG5ldXRyYWwgZWxlbWVudCBvZiB0aGUgZ3JvdXAKKyAqICBccGFyYW0gIGdyb3VwICB0aGUgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHAgICAgICBFQ19QT0lOVCBvYmplY3QKKyAqICBccmV0dXJuIDEgaWYgdGhlIHBvaW50IGlzIHRoZSBuZXV0cmFsIGVsZW1lbnQgYW5kIDAgb3RoZXJ3aXNlCisgKi8KK2ludCBFQ19QT0lOVF9pc19hdF9pbmZpbml0eShjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIGNvbnN0IEVDX1BPSU5UICpwKTsKKworLyoqIENoZWNrcyB3aGV0aGVyIHRoZSBwb2ludCBpcyBvbiB0aGUgY3VydmUgCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIHBvaW50ICBFQ19QT0lOVCBvYmplY3QgdG8gY2hlY2sKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgaWYgcG9pbnQgaWYgb24gdGhlIGN1cnZlIGFuZCAwIG90aGVyd2lzZQorICovCitpbnQgRUNfUE9JTlRfaXNfb25fY3VydmUoY29uc3QgRUNfR1JPVVAgKmdyb3VwLCBjb25zdCBFQ19QT0lOVCAqcG9pbnQsIEJOX0NUWCAqY3R4KTsKKworLyoqIENvbXBhcmVzIHR3byBFQ19QT0lOVHMgCisgKiAgXHBhcmFtICBncm91cCAgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGEgICAgICBmaXJzdCBFQ19QT0lOVCBvYmplY3QKKyAqICBccGFyYW0gIGIgICAgICBzZWNvbmQgRUNfUE9JTlQgb2JqZWN0CisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHJldHVybiAwIGlmIGJvdGggcG9pbnRzIGFyZSBlcXVhbCBhbmQgYSB2YWx1ZSAhPSAwIG90aGVyd2lzZQorICovCitpbnQgRUNfUE9JTlRfY21wKGNvbnN0IEVDX0dST1VQICpncm91cCwgY29uc3QgRUNfUE9JTlQgKmEsIGNvbnN0IEVDX1BPSU5UICpiLCBCTl9DVFggKmN0eCk7CisKK2ludCBFQ19QT0lOVF9tYWtlX2FmZmluZShjb25zdCBFQ19HUk9VUCAqLCBFQ19QT0lOVCAqLCBCTl9DVFggKik7CitpbnQgRUNfUE9JTlRzX21ha2VfYWZmaW5lKGNvbnN0IEVDX0dST1VQICosIHNpemVfdCBudW0sIEVDX1BPSU5UICpbXSwgQk5fQ1RYICopOworCisvKiogQ29tcHV0ZXMgciA9IGdlbmVyYXRvciAqIG4gc3VtX3tpPTB9Xm51bSBwW2ldICogbVtpXQorICogIFxwYXJhbSAgZ3JvdXAgIHVuZGVybHlpbmcgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHBhcmFtICByICAgICAgRUNfUE9JTlQgb2JqZWN0IGZvciB0aGUgcmVzdWx0CisgKiAgXHBhcmFtICBuICAgICAgQklHTlVNIHdpdGggdGhlIG11bHRpcGxpZXIgZm9yIHRoZSBncm91cCBnZW5lcmF0b3IgKG9wdGlvbmFsKQorICogIFxwYXJhbSAgbnVtICAgIG51bWJlciBmdXRoZXIgc3VtbWFuZHMKKyAqICBccGFyYW0gIHAgICAgICBhcnJheSBvZiBzaXplIG51bSBvZiBFQ19QT0lOVCBvYmplY3RzCisgKiAgXHBhcmFtICBtICAgICAgYXJyYXkgb2Ygc2l6ZSBudW0gb2YgQklHTlVNIG9iamVjdHMKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19QT0lOVHNfbXVsKGNvbnN0IEVDX0dST1VQICpncm91cCwgRUNfUE9JTlQgKnIsIGNvbnN0IEJJR05VTSAqbiwgc2l6ZV90IG51bSwgY29uc3QgRUNfUE9JTlQgKnBbXSwgY29uc3QgQklHTlVNICptW10sIEJOX0NUWCAqY3R4KTsKKworLyoqIENvbXB1dGVzIHIgPSBnZW5lcmF0b3IgKiBuICsgcSAqIG0KKyAqICBccGFyYW0gIGdyb3VwICB1bmRlcmx5aW5nIEVDX0dST1VQIG9iamVjdAorICogIFxwYXJhbSAgciAgICAgIEVDX1BPSU5UIG9iamVjdCBmb3IgdGhlIHJlc3VsdAorICogIFxwYXJhbSAgbiAgICAgIEJJR05VTSB3aXRoIHRoZSBtdWx0aXBsaWVyIGZvciB0aGUgZ3JvdXAgZ2VuZXJhdG9yIChvcHRpb25hbCkKKyAqICBccGFyYW0gIHEgICAgICBFQ19QT0lOVCBvYmplY3Qgd2l0aCB0aGUgZmlyc3QgZmFjdG9yIG9mIHRoZSBzZWNvbmQgc3VtbWFuZAorICogIFxwYXJhbSAgbSAgICAgIEJJR05VTSB3aXRoIHRoZSBzZWNvbmQgZmFjdG9yIG9mIHRoZSBzZWNvbmQgc3VtbWFuZAorICogIFxwYXJhbSAgY3R4ICAgIEJOX0NUWCBvYmplY3QgKG9wdGlvbmFsKQorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VyZWQKKyAqLworaW50IEVDX1BPSU5UX211bChjb25zdCBFQ19HUk9VUCAqZ3JvdXAsIEVDX1BPSU5UICpyLCBjb25zdCBCSUdOVU0gKm4sIGNvbnN0IEVDX1BPSU5UICpxLCBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4KTsKKworLyoqIFN0b3JlcyBtdWx0aXBsZXMgb2YgZ2VuZXJhdG9yIGZvciBmYXN0ZXIgcG9pbnQgbXVsdGlwbGljYXRpb24KKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCBvYmplY3QKKyAqICBccGFyYW0gIGN0eCAgICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cmVkCisgKi8KK2ludCBFQ19HUk9VUF9wcmVjb21wdXRlX211bHQoRUNfR1JPVVAgKmdyb3VwLCBCTl9DVFggKmN0eCk7CisKKy8qKiBSZXBvcnRzIHdoZXRoZXIgYSBwcmVjb21wdXRhdGlvbiBoYXMgYmVlbiBkb25lCisgKiAgXHBhcmFtICBncm91cCAgRUNfR1JPVVAgb2JqZWN0CisgKiAgXHJldHVybiAxIGlmIGEgcHJlLWNvbXB1dGF0aW9uIGhhcyBiZWVuIGRvbmUgYW5kIDAgb3RoZXJ3aXNlCisgKi8KK2ludCBFQ19HUk9VUF9oYXZlX3ByZWNvbXB1dGVfbXVsdChjb25zdCBFQ19HUk9VUCAqZ3JvdXApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICBBU04xIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRUNfR1JPVVBfZ2V0X2Jhc2lzX3R5cGUoKSByZXR1cm5zIHRoZSBOSUQgb2YgdGhlIGJhc2lzIHR5cGUKKyAqIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmaWVsZCBlbGVtZW50cyAqLworaW50IEVDX0dST1VQX2dldF9iYXNpc190eXBlKGNvbnN0IEVDX0dST1VQICopOworaW50IEVDX0dST1VQX2dldF90cmlub21pYWxfYmFzaXMoY29uc3QgRUNfR1JPVVAgKiwgdW5zaWduZWQgaW50ICprKTsKK2ludCBFQ19HUk9VUF9nZXRfcGVudGFub21pYWxfYmFzaXMoY29uc3QgRUNfR1JPVVAgKiwgdW5zaWduZWQgaW50ICprMSwgCisJdW5zaWduZWQgaW50ICprMiwgdW5zaWduZWQgaW50ICprMyk7CisKKyNkZWZpbmUgT1BFTlNTTF9FQ19OQU1FRF9DVVJWRQkweDAwMQorCit0eXBlZGVmIHN0cnVjdCBlY3BrX3BhcmFtZXRlcnNfc3QgRUNQS1BBUkFNRVRFUlM7CisKK0VDX0dST1VQICpkMmlfRUNQS1BhcmFtZXRlcnMoRUNfR1JPVVAgKiosIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4pOworaW50IGkyZF9FQ1BLUGFyYW1ldGVycyhjb25zdCBFQ19HUk9VUCAqLCB1bnNpZ25lZCBjaGFyICoqb3V0KTsKKworI2RlZmluZSBkMmlfRUNQS1BhcmFtZXRlcnNfYmlvKGJwLHgpIEFTTjFfZDJpX2Jpb19vZihFQ19HUk9VUCxOVUxMLGQyaV9FQ1BLUGFyYW1ldGVycyxicCx4KQorI2RlZmluZSBpMmRfRUNQS1BhcmFtZXRlcnNfYmlvKGJwLHgpIEFTTjFfaTJkX2Jpb19vZl9jb25zdChFQ19HUk9VUCxpMmRfRUNQS1BhcmFtZXRlcnMsYnAseCkKKyNkZWZpbmUgZDJpX0VDUEtQYXJhbWV0ZXJzX2ZwKGZwLHgpIChFQ19HUk9VUCAqKUFTTjFfZDJpX2ZwKE5VTEwsIFwKKyAgICAgICAgICAgICAgICAoY2hhciAqKCopKCkpZDJpX0VDUEtQYXJhbWV0ZXJzLChmcCksKHVuc2lnbmVkIGNoYXIgKiopKHgpKQorI2RlZmluZSBpMmRfRUNQS1BhcmFtZXRlcnNfZnAoZnAseCkgQVNOMV9pMmRfZnAoaTJkX0VDUEtQYXJhbWV0ZXJzLChmcCksIFwKKwkJKHVuc2lnbmVkIGNoYXIgKikoeCkpCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludCAgICAgRUNQS1BhcmFtZXRlcnNfcHJpbnQoQklPICpicCwgY29uc3QgRUNfR1JPVVAgKngsIGludCBvZmYpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQgICAgIEVDUEtQYXJhbWV0ZXJzX3ByaW50X2ZwKEZJTEUgKmZwLCBjb25zdCBFQ19HUk9VUCAqeCwgaW50IG9mZik7CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICBFQ19LRVkgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IGVjX2tleV9zdCBFQ19LRVk7CisKKy8qIHNvbWUgdmFsdWVzIGZvciB0aGUgZW5jb2RpbmdfZmxhZyAqLworI2RlZmluZSBFQ19QS0VZX05PX1BBUkFNRVRFUlMJMHgwMDEKKyNkZWZpbmUgRUNfUEtFWV9OT19QVUJLRVkJMHgwMDIKKworLyoqIENyZWF0ZXMgYSBuZXcgRUNfS0VZIG9iamVjdC4KKyAqICBccmV0dXJuIEVDX0tFWSBvYmplY3Qgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworRUNfS0VZICpFQ19LRVlfbmV3KHZvaWQpOworCisvKiogQ3JlYXRlcyBhIG5ldyBFQ19LRVkgb2JqZWN0IHVzaW5nIGEgbmFtZWQgY3VydmUgYXMgdW5kZXJseWluZworICogIEVDX0dST1VQIG9iamVjdC4KKyAqICBccGFyYW0gIG5pZCAgTklEIG9mIHRoZSBuYW1lZCBjdXJ2ZS4KKyAqICBccmV0dXJuIEVDX0tFWSBvYmplY3Qgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4gCisgKi8KK0VDX0tFWSAqRUNfS0VZX25ld19ieV9jdXJ2ZV9uYW1lKGludCBuaWQpOworCisvKiogRnJlZXMgYSBFQ19LRVkgb2JqZWN0LgorICogIFxwYXJhbSAga2V5ICBFQ19LRVkgb2JqZWN0IHRvIGJlIGZyZWVkLgorICovCit2b2lkIEVDX0tFWV9mcmVlKEVDX0tFWSAqa2V5KTsKKworLyoqIENvcGllcyBhIEVDX0tFWSBvYmplY3QuCisgKiAgXHBhcmFtICBkc3QgIGRlc3RpbmF0aW9uIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIHNyYyAgc3JjIEVDX0tFWSBvYmplY3QKKyAqICBccmV0dXJuIGRzdCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitFQ19LRVkgKkVDX0tFWV9jb3B5KEVDX0tFWSAqZHN0LCBjb25zdCBFQ19LRVkgKnNyYyk7CisKKy8qKiBDcmVhdGVzIGEgbmV3IEVDX0tFWSBvYmplY3QgYW5kIGNvcGllcyB0aGUgY29udGVudCBmcm9tIHNyYyB0byBpdC4KKyAqICBccGFyYW0gIHNyYyAgdGhlIHNvdXJjZSBFQ19LRVkgb2JqZWN0CisgKiAgXHJldHVybiBuZXdseSBjcmVhdGVkIEVDX0tFWSBvYmplY3Qgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworRUNfS0VZICpFQ19LRVlfZHVwKGNvbnN0IEVDX0tFWSAqc3JjKTsKKworLyoqIEluY3JlYXNlcyB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlIGNvdW50IG9mIGEgRUNfS0VZIG9iamVjdC4KKyAqICBccGFyYW0gIGtleSAgRUNfS0VZIG9iamVjdAorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgRUNfS0VZX3VwX3JlZihFQ19LRVkgKmtleSk7CisKKy8qKiBSZXR1cm5zIHRoZSBFQ19HUk9VUCBvYmplY3Qgb2YgYSBFQ19LRVkgb2JqZWN0CisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccmV0dXJuIHRoZSBFQ19HUk9VUCBvYmplY3QgKHBvc3NpYmx5IE5VTEwpLgorICovCitjb25zdCBFQ19HUk9VUCAqRUNfS0VZX2dldDBfZ3JvdXAoY29uc3QgRUNfS0VZICprZXkpOworCisvKiogU2V0cyB0aGUgRUNfR1JPVVAgb2YgYSBFQ19LRVkgb2JqZWN0LgorICogIFxwYXJhbSAga2V5ICAgIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIGdyb3VwICBFQ19HUk9VUCB0byB1c2UgaW4gdGhlIEVDX0tFWSBvYmplY3QgKG5vdGU6IHRoZSBFQ19LRVkKKyAqICAgICAgICAgICAgICAgICBvYmplY3Qgd2lsbCB1c2UgYW4gb3duIGNvcHkgb2YgdGhlIEVDX0dST1VQKS4KKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IEVDX0tFWV9zZXRfZ3JvdXAoRUNfS0VZICprZXksIGNvbnN0IEVDX0dST1VQICpncm91cCk7CisKKy8qKiBSZXR1cm5zIHRoZSBwcml2YXRlIGtleSBvZiBhIEVDX0tFWSBvYmplY3QuCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccmV0dXJuIGEgQklHTlVNIHdpdGggdGhlIHByaXZhdGUga2V5IChwb3NzaWJseSBOVUxMKS4KKyAqLworY29uc3QgQklHTlVNICpFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShjb25zdCBFQ19LRVkgKmtleSk7CisKKy8qKiBTZXRzIHRoZSBwcml2YXRlIGtleSBvZiBhIEVDX0tFWSBvYmplY3QuCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIHBydiAgQklHTlVNIHdpdGggdGhlIHByaXZhdGUga2V5IChub3RlOiB0aGUgRUNfS0VZIG9iamVjdAorICogICAgICAgICAgICAgICB3aWxsIHVzZSBhbiBvd24gY29weSBvZiB0aGUgQklHTlVNKS4KKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IEVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkoRUNfS0VZICprZXksIGNvbnN0IEJJR05VTSAqcHJ2KTsKKworLyoqIFJldHVybnMgdGhlIHB1YmxpYyBrZXkgb2YgYSBFQ19LRVkgb2JqZWN0LgorICogIFxwYXJhbSAga2V5ICB0aGUgRUNfS0VZIG9iamVjdAorICogIFxyZXR1cm4gYSBFQ19QT0lOVCBvYmplY3Qgd2l0aCB0aGUgcHVibGljIGtleSAocG9zc2libHkgTlVMTCkKKyAqLworY29uc3QgRUNfUE9JTlQgKkVDX0tFWV9nZXQwX3B1YmxpY19rZXkoY29uc3QgRUNfS0VZICprZXkpOworCisvKiogU2V0cyB0aGUgcHVibGljIGtleSBvZiBhIEVDX0tFWSBvYmplY3QuCisgKiAgXHBhcmFtICBrZXkgIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIHB1YiAgRUNfUE9JTlQgb2JqZWN0IHdpdGggdGhlIHB1YmxpYyBrZXkgKG5vdGU6IHRoZSBFQ19LRVkgb2JqZWN0CisgKiAgICAgICAgICAgICAgIHdpbGwgdXNlIGFuIG93biBjb3B5IG9mIHRoZSBFQ19QT0lOVCBvYmplY3QpLgorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICovCitpbnQgRUNfS0VZX3NldF9wdWJsaWNfa2V5KEVDX0tFWSAqa2V5LCBjb25zdCBFQ19QT0lOVCAqcHViKTsKKwordW5zaWduZWQgRUNfS0VZX2dldF9lbmNfZmxhZ3MoY29uc3QgRUNfS0VZICprZXkpOwordm9pZCBFQ19LRVlfc2V0X2VuY19mbGFncyhFQ19LRVkgKiwgdW5zaWduZWQgaW50KTsKK3BvaW50X2NvbnZlcnNpb25fZm9ybV90IEVDX0tFWV9nZXRfY29udl9mb3JtKGNvbnN0IEVDX0tFWSAqKTsKK3ZvaWQgRUNfS0VZX3NldF9jb252X2Zvcm0oRUNfS0VZICosIHBvaW50X2NvbnZlcnNpb25fZm9ybV90KTsKKy8qIGZ1bmN0aW9ucyB0byBzZXQvZ2V0IG1ldGhvZCBzcGVjaWZpYyBkYXRhICAqLwordm9pZCAqRUNfS0VZX2dldF9rZXlfbWV0aG9kX2RhdGEoRUNfS0VZICosIAorCXZvaWQgKigqZHVwX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKiksIHZvaWQgKCpjbGVhcl9mcmVlX2Z1bmMpKHZvaWQgKikpOwordm9pZCBFQ19LRVlfaW5zZXJ0X2tleV9tZXRob2RfZGF0YShFQ19LRVkgKiwgdm9pZCAqZGF0YSwKKwl2b2lkICooKmR1cF9mdW5jKSh2b2lkICopLCB2b2lkICgqZnJlZV9mdW5jKSh2b2lkICopLCB2b2lkICgqY2xlYXJfZnJlZV9mdW5jKSh2b2lkICopKTsKKy8qIHdyYXBwZXIgZnVuY3Rpb25zIGZvciB0aGUgdW5kZXJseWluZyBFQ19HUk9VUCBvYmplY3QgKi8KK3ZvaWQgRUNfS0VZX3NldF9hc24xX2ZsYWcoRUNfS0VZICosIGludCk7CisKKy8qKiBDcmVhdGVzIGEgdGFibGUgb2YgcHJlLWNvbXB1dGVkIG11bHRpcGxlcyBvZiB0aGUgZ2VuZXJhdG9yIHRvIAorICogIGFjY2VsZXJhdGUgZnVydGhlciBFQ19LRVkgb3BlcmF0aW9ucy4KKyAqICBccGFyYW0gIGtleSAgRUNfS0VZIG9iamVjdAorICogIFxwYXJhbSAgY3R4ICBCTl9DVFggb2JqZWN0IChvcHRpb25hbCkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IEVDX0tFWV9wcmVjb21wdXRlX211bHQoRUNfS0VZICprZXksIEJOX0NUWCAqY3R4KTsKKworLyoqIENyZWF0ZXMgYSBuZXcgZWMgcHJpdmF0ZSAoYW5kIG9wdGlvbmFsIGEgbmV3IHB1YmxpYykga2V5LgorICogIFxwYXJhbSAga2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK2ludCBFQ19LRVlfZ2VuZXJhdGVfa2V5KEVDX0tFWSAqa2V5KTsKKworLyoqIFZlcmlmaWVzIHRoYXQgYSBwcml2YXRlIGFuZC9vciBwdWJsaWMga2V5IGlzIHZhbGlkLgorICogIFxwYXJhbSAga2V5ICB0aGUgRUNfS0VZIG9iamVjdAorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIG90aGVyd2lzZS4KKyAqLworaW50IEVDX0tFWV9jaGVja19rZXkoY29uc3QgRUNfS0VZICprZXkpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICBkZS0gYW5kIGVuY29kaW5nIGZ1bmN0aW9ucyBmb3IgU0VDMSBFQ1ByaXZhdGVLZXkgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIERlY29kZXMgYSBwcml2YXRlIGtleSBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KKyAqICBccGFyYW0gIGtleSAgYSBwb2ludGVyIHRvIGEgRUNfS0VZIG9iamVjdCB3aGljaCBzaG91bGQgYmUgdXNlZCAob3IgTlVMTCkKKyAqICBccGFyYW0gIGluICAgcG9pbnRlciB0byBtZW1vcnkgd2l0aCB0aGUgREVSIGVuY29kZWQgcHJpdmF0ZSBrZXkKKyAqICBccGFyYW0gIGxlbiAgbGVuZ3RoIG9mIHRoZSBERVIgZW5jb2RlZCBwcml2YXRlIGtleQorICogIFxyZXR1cm4gdGhlIGRlY29kZWQgcHJpdmF0ZSBrZXkgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworRUNfS0VZICpkMmlfRUNQcml2YXRlS2V5KEVDX0tFWSAqKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7CisKKy8qKiBFbmNvZGVzIGEgcHJpdmF0ZSBrZXkgb2JqZWN0IGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBhIGJ1ZmZlci4KKyAqICBccGFyYW0gIGtleSAgdGhlIEVDX0tFWSBvYmplY3QgdG8gZW5jb2RlCisgKiAgXHBhcmFtICBvdXQgIHRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQgKGlmIE5VTEwgdGhlIGZ1bmN0aW9uIHJldHVybnMgbnVtYmVyCisgKiAgICAgICAgICAgICAgIG9mIGJ5dGVzIG5lZWRlZCkuCisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK2ludCBpMmRfRUNQcml2YXRlS2V5KEVDX0tFWSAqa2V5LCB1bnNpZ25lZCBjaGFyICoqb3V0KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgZGUtIGFuZCBlbmNvZGluZyBmdW5jdGlvbnMgZm9yIEVDIHBhcmFtZXRlcnMgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKiBEZWNvZGVzIGVjIHBhcmFtZXRlciBmcm9tIGEgbWVtb3J5IGJ1ZmZlci4KKyAqICBccGFyYW0gIGtleSAgYSBwb2ludGVyIHRvIGEgRUNfS0VZIG9iamVjdCB3aGljaCBzaG91bGQgYmUgdXNlZCAob3IgTlVMTCkKKyAqICBccGFyYW0gIGluICAgcG9pbnRlciB0byBtZW1vcnkgd2l0aCB0aGUgREVSIGVuY29kZWQgZWMgcGFyYW1ldGVycworICogIFxwYXJhbSAgbGVuICBsZW5ndGggb2YgdGhlIERFUiBlbmNvZGVkIGVjIHBhcmFtZXRlcnMKKyAqICBccmV0dXJuIGEgRUNfS0VZIG9iamVjdCB3aXRoIHRoZSBkZWNvZGVkIHBhcmFtZXRlcnMgb3IgTlVMTCBpZiBhbiBlcnJvcgorICogICAgICAgICAgb2NjdXJyZWQuCisgKi8KK0VDX0tFWSAqZDJpX0VDUGFyYW1ldGVycyhFQ19LRVkgKiprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKippbiwgbG9uZyBsZW4pOworCisvKiogRW5jb2RlcyBlYyBwYXJhbWV0ZXIgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIGEgYnVmZmVyLgorICogIFxwYXJhbSAga2V5ICB0aGUgRUNfS0VZIG9iamVjdCB3aXRoIGVjIHBhcmFtdGVycyB0byBlbmNvZGUKKyAqICBccGFyYW0gIG91dCAgdGhlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCAoaWYgTlVMTCB0aGUgZnVuY3Rpb24gcmV0dXJucyBudW1iZXIKKyAqICAgICAgICAgICAgICAgb2YgYnl0ZXMgbmVlZGVkKS4KKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqLworaW50IGkyZF9FQ1BhcmFtZXRlcnMoRUNfS0VZICprZXksIHVuc2lnbmVkIGNoYXIgKipvdXQpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgZGUtIGFuZCBlbmNvZGluZyBmdW5jdGlvbnMgZm9yIEVDIHB1YmxpYyBrZXkgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgKG9jdGV0IHN0cmluZywgbm90IERFUiAtLSBoZW5jZSAnbzJpJyBhbmQgJ2kybycpICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIERlY29kZXMgYSBlYyBwdWJsaWMga2V5IGZyb20gYSBvY3RldCBzdHJpbmcuCisgKiAgXHBhcmFtICBrZXkgIGEgcG9pbnRlciB0byBhIEVDX0tFWSBvYmplY3Qgd2hpY2ggc2hvdWxkIGJlIHVzZWQKKyAqICBccGFyYW0gIGluICAgbWVtb3J5IGJ1ZmZlciB3aXRoIHRoZSBlbmNvZGVkIHB1YmxpYyBrZXkKKyAqICBccGFyYW0gIGxlbiAgbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIHB1YmxpYyBrZXkKKyAqICBccmV0dXJuIEVDX0tFWSBvYmplY3Qgd2l0aCBkZWNvZGVkIHB1YmxpYyBrZXkgb3IgTlVMTCBpZiBhbiBlcnJvcgorICogICAgICAgICAgb2NjdXJyZWQuCisgKi8KK0VDX0tFWSAqbzJpX0VDUHVibGljS2V5KEVDX0tFWSAqKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7CisKKy8qKiBFbmNvZGVzIGEgZWMgcHVibGljIGtleSBpbiBhbiBvY3RldCBzdHJpbmcuCisgKiAgXHBhcmFtICBrZXkgIHRoZSBFQ19LRVkgb2JqZWN0IHdpdGggdGhlIHB1YmxpYyBrZXkKKyAqICBccGFyYW0gIG91dCAgdGhlIGJ1ZmZlciBmb3IgdGhlIHJlc3VsdCAoaWYgTlVMTCB0aGUgZnVuY3Rpb24gcmV0dXJucyBudW1iZXIKKyAqICAgICAgICAgICAgICAgb2YgYnl0ZXMgbmVlZGVkKS4KKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitpbnQgaTJvX0VDUHVibGljS2V5KEVDX0tFWSAqa2V5LCB1bnNpZ25lZCBjaGFyICoqb3V0KTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworLyoqIFByaW50cyBvdXQgdGhlIGVjIHBhcmFtZXRlcnMgb24gaHVtYW4gcmVhZGFibGUgZm9ybS4KKyAqICBccGFyYW0gIGJwICAgQklPIG9iamVjdCB0byB3aGljaCB0aGUgaW5mb3JtYXRpb24gaXMgcHJpbnRlZAorICogIFxwYXJhbSAga2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworaW50CUVDUGFyYW1ldGVyc19wcmludChCSU8gKmJwLCBjb25zdCBFQ19LRVkgKmtleSk7CisKKy8qKiBQcmludHMgb3V0IHRoZSBjb250ZW50cyBvZiBhIEVDX0tFWSBvYmplY3QKKyAqICBccGFyYW0gIGJwICAgQklPIG9iamVjdCB0byB3aGljaCB0aGUgaW5mb3JtYXRpb24gaXMgcHJpbnRlZAorICogIFxwYXJhbSAga2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHBhcmFtICBvZmYgIGxpbmUgb2Zmc2V0IAorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK2ludAlFQ19LRVlfcHJpbnQoQklPICpicCwgY29uc3QgRUNfS0VZICprZXksIGludCBvZmYpOworCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKy8qKiBQcmludHMgb3V0IHRoZSBlYyBwYXJhbWV0ZXJzIG9uIGh1bWFuIHJlYWRhYmxlIGZvcm0uCisgKiAgXHBhcmFtICBmcCAgIGZpbGUgZGVzY3JpcHRvciB0byB3aGljaCB0aGUgaW5mb3JtYXRpb24gaXMgcHJpbnRlZAorICogIFxwYXJhbSAga2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworaW50CUVDUGFyYW1ldGVyc19wcmludF9mcChGSUxFICpmcCwgY29uc3QgRUNfS0VZICprZXkpOworCisvKiogUHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgYSBFQ19LRVkgb2JqZWN0CisgKiAgXHBhcmFtICBmcCAgIGZpbGUgZGVzY3JpcHRvciB0byB3aGljaCB0aGUgaW5mb3JtYXRpb24gaXMgcHJpbnRlZAorICogIFxwYXJhbSAga2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHBhcmFtICBvZmYgIGxpbmUgb2Zmc2V0IAorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIGlmIGFuIGVycm9yIG9jY3VycmVkCisgKi8KK2ludAlFQ19LRVlfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IEVDX0tFWSAqa2V5LCBpbnQgb2ZmKTsKKworI2VuZGlmCisKKyNkZWZpbmUgRUNQYXJhbWV0ZXJzX2R1cCh4KSBBU04xX2R1cF9vZihFQ19LRVksaTJkX0VDUGFyYW1ldGVycyxkMmlfRUNQYXJhbWV0ZXJzLHgpCisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNpZiBkZWZpbmVkKF9fU1VOUFJPX0MpCisjICBpZiBfX1NVTlBST19DID49IDB4NTIwCisjIHByYWdtYSBlcnJvcl9tZXNzYWdlcyAoZGVmYXVsdCxFX0FSUkFZX09GX0lOQ09NUExFVEVfTk9OQU1FLEVfQVJSQVlfT0ZfSU5DT01QTEVURSkKKyMgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworI2RlZmluZSBFVlBfUEtFWV9DVFhfc2V0X2VjX3BhcmFtZ2VuX2N1cnZlX25pZChjdHgsIG5pZCkgXAorCUVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfRUMsIEVWUF9QS0VZX09QX1BBUkFNR0VOLCBcCisJCQkJRVZQX1BLRVlfQ1RSTF9FQ19QQVJBTUdFTl9DVVJWRV9OSUQsIG5pZCwgTlVMTCkKKworCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfRUNfUEFSQU1HRU5fQ1VSVkVfTklECQkoRVZQX1BLRVlfQUxHX0NUUkwgKyAxKQorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0VDX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRUMgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgRUNfRl9DT01QVVRFX1dOQUYJCQkJIDE0MworI2RlZmluZSBFQ19GX0QySV9FQ1BBUkFNRVRFUlMJCQkJIDE0NAorI2RlZmluZSBFQ19GX0QySV9FQ1BLUEFSQU1FVEVSUwkJCQkgMTQ1CisjZGVmaW5lIEVDX0ZfRDJJX0VDUFJJVkFURUtFWQkJCQkgMTQ2CisjZGVmaW5lIEVDX0ZfRE9fRUNfS0VZX1BSSU5UCQkJCSAyMjEKKyNkZWZpbmUgRUNfRl9FQ0tFWV9QQVJBTTJUWVBFCQkJCSAyMjMKKyNkZWZpbmUgRUNfRl9FQ0tFWV9QQVJBTV9ERUNPREUJCQkJIDIxMgorI2RlZmluZSBFQ19GX0VDS0VZX1BSSVZfREVDT0RFCQkJCSAyMTMKKyNkZWZpbmUgRUNfRl9FQ0tFWV9QUklWX0VOQ09ERQkJCQkgMjE0CisjZGVmaW5lIEVDX0ZfRUNLRVlfUFVCX0RFQ09ERQkJCQkgMjE1CisjZGVmaW5lIEVDX0ZfRUNLRVlfUFVCX0VOQ09ERQkJCQkgMjE2CisjZGVmaW5lIEVDX0ZfRUNLRVlfVFlQRTJQQVJBTQkJCQkgMjIwCisjZGVmaW5lIEVDX0ZfRUNQQVJBTUVURVJTX1BSSU5UCQkJCSAxNDcKKyNkZWZpbmUgRUNfRl9FQ1BBUkFNRVRFUlNfUFJJTlRfRlAJCQkgMTQ4CisjZGVmaW5lIEVDX0ZfRUNQS1BBUkFNRVRFUlNfUFJJTlQJCQkgMTQ5CisjZGVmaW5lIEVDX0ZfRUNQS1BBUkFNRVRFUlNfUFJJTlRfRlAJCQkgMTUwCisjZGVmaW5lIEVDX0ZfRUNQX05JU1RfTU9EXzE5MgkJCQkgMjAzCisjZGVmaW5lIEVDX0ZfRUNQX05JU1RfTU9EXzIyNAkJCQkgMjA0CisjZGVmaW5lIEVDX0ZfRUNQX05JU1RfTU9EXzI1NgkJCQkgMjA1CisjZGVmaW5lIEVDX0ZfRUNQX05JU1RfTU9EXzUyMQkJCQkgMjA2CisjZGVmaW5lIEVDX0ZfRUNfQVNOMV9HUk9VUDJDVVJWRQkJCSAxNTMKKyNkZWZpbmUgRUNfRl9FQ19BU04xX0dST1VQMkZJRUxESUQJCQkgMTU0CisjZGVmaW5lIEVDX0ZfRUNfQVNOMV9HUk9VUDJQQVJBTUVURVJTCQkJIDE1NQorI2RlZmluZSBFQ19GX0VDX0FTTjFfR1JPVVAyUEtQQVJBTUVURVJTCQkJIDE1NgorI2RlZmluZSBFQ19GX0VDX0FTTjFfUEFSQU1FVEVSUzJHUk9VUAkJCSAxNTcKKyNkZWZpbmUgRUNfRl9FQ19BU04xX1BLUEFSQU1FVEVSUzJHUk9VUAkJCSAxNTgKKyNkZWZpbmUgRUNfRl9FQ19FWF9EQVRBX1NFVF9EQVRBCQkJIDIxMQorI2RlZmluZSBFQ19GX0VDX0dGMk1fTU9OVEdPTUVSWV9QT0lOVF9NVUxUSVBMWQkJIDIwOAorI2RlZmluZSBFQ19GX0VDX0dGMk1fU0lNUExFX0dST1VQX0NIRUNLX0RJU0NSSU1JTkFOVAkgMTU5CisjZGVmaW5lIEVDX0ZfRUNfR0YyTV9TSU1QTEVfR1JPVVBfU0VUX0NVUlZFCQkgMTk1CisjZGVmaW5lIEVDX0ZfRUNfR0YyTV9TSU1QTEVfT0NUMlBPSU5UCQkJIDE2MAorI2RlZmluZSBFQ19GX0VDX0dGMk1fU0lNUExFX1BPSU5UMk9DVAkJCSAxNjEKKyNkZWZpbmUgRUNfRl9FQ19HRjJNX1NJTVBMRV9QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTIDE2MgorI2RlZmluZSBFQ19GX0VDX0dGMk1fU0lNUExFX1BPSU5UX1NFVF9BRkZJTkVfQ09PUkRJTkFURVMgMTYzCisjZGVmaW5lIEVDX0ZfRUNfR0YyTV9TSU1QTEVfU0VUX0NPTVBSRVNTRURfQ09PUkRJTkFURVMJIDE2NAorI2RlZmluZSBFQ19GX0VDX0dGUF9NT05UX0ZJRUxEX0RFQ09ERQkJCSAxMzMKKyNkZWZpbmUgRUNfRl9FQ19HRlBfTU9OVF9GSUVMRF9FTkNPREUJCQkgMTM0CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX01PTlRfRklFTERfTVVMCQkJIDEzMQorI2RlZmluZSBFQ19GX0VDX0dGUF9NT05UX0ZJRUxEX1NFVF9UT19PTkUJCSAyMDkKKyNkZWZpbmUgRUNfRl9FQ19HRlBfTU9OVF9GSUVMRF9TUVIJCQkgMTMyCisjZGVmaW5lIEVDX0ZfRUNfR0ZQX01PTlRfR1JPVVBfU0VUX0NVUlZFCQkgMTg5CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX01PTlRfR1JPVVBfU0VUX0NVUlZFX0dGUAkJIDEzNQorI2RlZmluZSBFQ19GX0VDX0dGUF9OSVNUX0ZJRUxEX01VTAkJCSAyMDAKKyNkZWZpbmUgRUNfRl9FQ19HRlBfTklTVF9GSUVMRF9TUVIJCQkgMjAxCisjZGVmaW5lIEVDX0ZfRUNfR0ZQX05JU1RfR1JPVVBfU0VUX0NVUlZFCQkgMjAyCisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9HUk9VUF9DSEVDS19ESVNDUklNSU5BTlQJIDE2NQorI2RlZmluZSBFQ19GX0VDX0dGUF9TSU1QTEVfR1JPVVBfU0VUX0NVUlZFCQkgMTY2CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9HUk9VUF9TRVRfQ1VSVkVfR0ZQCQkgMTAwCisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9HUk9VUF9TRVRfR0VORVJBVE9SCQkgMTAxCisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9NQUtFX0FGRklORQkJCSAxMDIKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX09DVDJQT0lOVAkJCSAxMDMKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX1BPSU5UMk9DVAkJCSAxMDQKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX1BPSU5UU19NQUtFX0FGRklORQkJIDEzNworI2RlZmluZSBFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlRfR0VUX0FGRklORV9DT09SRElOQVRFUwkgMTY3CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUCAxMDUKKyNkZWZpbmUgRUNfRl9FQ19HRlBfU0lNUExFX1BPSU5UX1NFVF9BRkZJTkVfQ09PUkRJTkFURVMJIDE2OAorI2RlZmluZSBFQ19GX0VDX0dGUF9TSU1QTEVfUE9JTlRfU0VUX0FGRklORV9DT09SRElOQVRFU19HRlAgMTI4CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9TRVRfQ09NUFJFU1NFRF9DT09SRElOQVRFUwkgMTY5CisjZGVmaW5lIEVDX0ZfRUNfR0ZQX1NJTVBMRV9TRVRfQ09NUFJFU1NFRF9DT09SRElOQVRFU19HRlAgMTI5CisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfQ0hFQ0sJCQkJIDE3MAorI2RlZmluZSBFQ19GX0VDX0dST1VQX0NIRUNLX0RJU0NSSU1JTkFOVAkJIDE3MQorI2RlZmluZSBFQ19GX0VDX0dST1VQX0NPUFkJCQkJIDEwNgorI2RlZmluZSBFQ19GX0VDX0dST1VQX0dFVDBfR0VORVJBVE9SCQkJIDEzOQorI2RlZmluZSBFQ19GX0VDX0dST1VQX0dFVF9DT0ZBQ1RPUgkJCSAxNDAKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9HRVRfQ1VSVkVfR0YyTQkJCSAxNzIKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9HRVRfQ1VSVkVfR0ZQCQkJIDEzMAorI2RlZmluZSBFQ19GX0VDX0dST1VQX0dFVF9ERUdSRUUJCQkgMTczCisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfR0VUX09SREVSCQkJCSAxNDEKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9HRVRfUEVOVEFOT01JQUxfQkFTSVMJCSAxOTMKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9HRVRfVFJJTk9NSUFMX0JBU0lTCQkgMTk0CisjZGVmaW5lIEVDX0ZfRUNfR1JPVVBfTkVXCQkJCSAxMDgKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9ORVdfQllfQ1VSVkVfTkFNRQkJCSAxNzQKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9ORVdfRlJPTV9EQVRBCQkJIDE3NQorI2RlZmluZSBFQ19GX0VDX0dST1VQX1BSRUNPTVBVVEVfTVVMVAkJCSAxNDIKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9TRVRfQ1VSVkVfR0YyTQkJCSAxNzYKKyNkZWZpbmUgRUNfRl9FQ19HUk9VUF9TRVRfQ1VSVkVfR0ZQCQkJIDEwOQorI2RlZmluZSBFQ19GX0VDX0dST1VQX1NFVF9FWFRSQV9EQVRBCQkJIDExMAorI2RlZmluZSBFQ19GX0VDX0dST1VQX1NFVF9HRU5FUkFUT1IJCQkgMTExCisjZGVmaW5lIEVDX0ZfRUNfS0VZX0NIRUNLX0tFWQkJCQkgMTc3CisjZGVmaW5lIEVDX0ZfRUNfS0VZX0NPUFkJCQkJIDE3OAorI2RlZmluZSBFQ19GX0VDX0tFWV9HRU5FUkFURV9LRVkJCQkgMTc5CisjZGVmaW5lIEVDX0ZfRUNfS0VZX05FVwkJCQkJIDE4MgorI2RlZmluZSBFQ19GX0VDX0tFWV9QUklOVAkJCQkgMTgwCisjZGVmaW5lIEVDX0ZfRUNfS0VZX1BSSU5UX0ZQCQkJCSAxODEKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVFNfTUFLRV9BRkZJTkUJCQkgMTM2CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfQURECQkJCSAxMTIKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9DTVAJCQkJIDExMworI2RlZmluZSBFQ19GX0VDX1BPSU5UX0NPUFkJCQkJIDExNAorI2RlZmluZSBFQ19GX0VDX1BPSU5UX0RCTAkJCQkgMTE1CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfR0VUX0FGRklORV9DT09SRElOQVRFU19HRjJNCSAxODMKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9HRVRfQUZGSU5FX0NPT1JESU5BVEVTX0dGUAkgMTE2CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfR0VUX0pQUk9KRUNUSVZFX0NPT1JESU5BVEVTX0dGUAkgMTE3CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfSU5WRVJUCQkJCSAyMTAKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9JU19BVF9JTkZJTklUWQkJCSAxMTgKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9JU19PTl9DVVJWRQkJCSAxMTkKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9NQUtFX0FGRklORQkJCSAxMjAKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9NVUwJCQkJIDE4NAorI2RlZmluZSBFQ19GX0VDX1BPSU5UX05FVwkJCQkgMTIxCisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfT0NUMlBPSU5UCQkJCSAxMjIKKyNkZWZpbmUgRUNfRl9FQ19QT0lOVF9QT0lOVDJPQ1QJCQkJIDEyMworI2RlZmluZSBFQ19GX0VDX1BPSU5UX1NFVF9BRkZJTkVfQ09PUkRJTkFURVNfR0YyTQkgMTg1CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfU0VUX0FGRklORV9DT09SRElOQVRFU19HRlAJIDEyNAorI2RlZmluZSBFQ19GX0VDX1BPSU5UX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTX0dGMk0JIDE4NgorI2RlZmluZSBFQ19GX0VDX1BPSU5UX1NFVF9DT01QUkVTU0VEX0NPT1JESU5BVEVTX0dGUAkgMTI1CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfU0VUX0pQUk9KRUNUSVZFX0NPT1JESU5BVEVTX0dGUAkgMTI2CisjZGVmaW5lIEVDX0ZfRUNfUE9JTlRfU0VUX1RPX0lORklOSVRZCQkJIDEyNworI2RlZmluZSBFQ19GX0VDX1BSRV9DT01QX0RVUAkJCQkgMjA3CisjZGVmaW5lIEVDX0ZfRUNfUFJFX0NPTVBfTkVXCQkJCSAxOTYKKyNkZWZpbmUgRUNfRl9FQ19XTkFGX01VTAkJCQkgMTg3CisjZGVmaW5lIEVDX0ZfRUNfV05BRl9QUkVDT01QVVRFX01VTFQJCQkgMTg4CisjZGVmaW5lIEVDX0ZfSTJEX0VDUEFSQU1FVEVSUwkJCQkgMTkwCisjZGVmaW5lIEVDX0ZfSTJEX0VDUEtQQVJBTUVURVJTCQkJCSAxOTEKKyNkZWZpbmUgRUNfRl9JMkRfRUNQUklWQVRFS0VZCQkJCSAxOTIKKyNkZWZpbmUgRUNfRl9JMk9fRUNQVUJMSUNLRVkJCQkJIDE1MQorI2RlZmluZSBFQ19GX08ySV9FQ1BVQkxJQ0tFWQkJCQkgMTUyCisjZGVmaW5lIEVDX0ZfT0xEX0VDX1BSSVZfREVDT0RFCQkJCSAyMjIKKyNkZWZpbmUgRUNfRl9QS0VZX0VDX0NUUkwJCQkJIDE5NworI2RlZmluZSBFQ19GX1BLRVlfRUNfQ1RSTF9TVFIJCQkJIDE5OAorI2RlZmluZSBFQ19GX1BLRVlfRUNfREVSSVZFCQkJCSAyMTcKKyNkZWZpbmUgRUNfRl9QS0VZX0VDX0tFWUdFTgkJCQkgMTk5CisjZGVmaW5lIEVDX0ZfUEtFWV9FQ19QQVJBTUdFTgkJCQkgMjE5CisjZGVmaW5lIEVDX0ZfUEtFWV9FQ19TSUdOCQkJCSAyMTgKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBFQ19SX0FTTjFfRVJST1IJCQkJCSAxMTUKKyNkZWZpbmUgRUNfUl9BU04xX1VOS05PV05fRklFTEQJCQkJIDExNgorI2RlZmluZSBFQ19SX0JVRkZFUl9UT09fU01BTEwJCQkJIDEwMAorI2RlZmluZSBFQ19SX0QySV9FQ1BLUEFSQU1FVEVSU19GQUlMVVJFCQkJIDExNworI2RlZmluZSBFQ19SX0RFQ09ERV9FUlJPUgkJCQkgMTQyCisjZGVmaW5lIEVDX1JfRElTQ1JJTUlOQU5UX0lTX1pFUk8JCQkgMTE4CisjZGVmaW5lIEVDX1JfRUNfR1JPVVBfTkVXX0JZX05BTUVfRkFJTFVSRQkJIDExOQorI2RlZmluZSBFQ19SX0ZJRUxEX1RPT19MQVJHRQkJCQkgMTQzCisjZGVmaW5lIEVDX1JfR1JPVVAyUEtQQVJBTUVURVJTX0ZBSUxVUkUJCQkgMTIwCisjZGVmaW5lIEVDX1JfSTJEX0VDUEtQQVJBTUVURVJTX0ZBSUxVUkUJCQkgMTIxCisjZGVmaW5lIEVDX1JfSU5DT01QQVRJQkxFX09CSkVDVFMJCQkgMTAxCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9BUkdVTUVOVAkJCQkgMTEyCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9DT01QUkVTU0VEX1BPSU5UCQkJIDExMAorI2RlZmluZSBFQ19SX0lOVkFMSURfQ09NUFJFU1NJT05fQklUCQkJIDEwOQorI2RlZmluZSBFQ19SX0lOVkFMSURfQ1VSVkUJCQkJIDE0MQorI2RlZmluZSBFQ19SX0lOVkFMSURfRElHRVNUX1RZUEUJCQkgMTM4CisjZGVmaW5lIEVDX1JfSU5WQUxJRF9FTkNPRElORwkJCQkgMTAyCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9GSUVMRAkJCQkgMTAzCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9GT1JNCQkJCSAxMDQKKyNkZWZpbmUgRUNfUl9JTlZBTElEX0dST1VQX09SREVSCQkJIDEyMgorI2RlZmluZSBFQ19SX0lOVkFMSURfUEVOVEFOT01JQUxfQkFTSVMJCQkgMTMyCisjZGVmaW5lIEVDX1JfSU5WQUxJRF9QUklWQVRFX0tFWQkJCSAxMjMKKyNkZWZpbmUgRUNfUl9JTlZBTElEX1RSSU5PTUlBTF9CQVNJUwkJCSAxMzcKKyNkZWZpbmUgRUNfUl9LRVlTX05PVF9TRVQJCQkJIDE0MAorI2RlZmluZSBFQ19SX01JU1NJTkdfUEFSQU1FVEVSUwkJCQkgMTI0CisjZGVmaW5lIEVDX1JfTUlTU0lOR19QUklWQVRFX0tFWQkJCSAxMjUKKyNkZWZpbmUgRUNfUl9OT1RfQV9OSVNUX1BSSU1FCQkJCSAxMzUKKyNkZWZpbmUgRUNfUl9OT1RfQV9TVVBQT1JURURfTklTVF9QUklNRQkJCSAxMzYKKyNkZWZpbmUgRUNfUl9OT1RfSU1QTEVNRU5URUQJCQkJIDEyNgorI2RlZmluZSBFQ19SX05PVF9JTklUSUFMSVpFRAkJCQkgMTExCisjZGVmaW5lIEVDX1JfTk9fRklFTERfTU9ECQkJCSAxMzMKKyNkZWZpbmUgRUNfUl9OT19QQVJBTUVURVJTX1NFVAkJCQkgMTM5CisjZGVmaW5lIEVDX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSCQkJIDEzNAorI2RlZmluZSBFQ19SX1BLUEFSQU1FVEVSUzJHUk9VUF9GQUlMVVJFCQkJIDEyNworI2RlZmluZSBFQ19SX1BPSU5UX0FUX0lORklOSVRZCQkJCSAxMDYKKyNkZWZpbmUgRUNfUl9QT0lOVF9JU19OT1RfT05fQ1VSVkUJCQkgMTA3CisjZGVmaW5lIEVDX1JfU0xPVF9GVUxMCQkJCQkgMTA4CisjZGVmaW5lIEVDX1JfVU5ERUZJTkVEX0dFTkVSQVRPUgkJCSAxMTMKKyNkZWZpbmUgRUNfUl9VTkRFRklORURfT1JERVIJCQkJIDEyOAorI2RlZmluZSBFQ19SX1VOS05PV05fR1JPVVAJCQkJIDEyOQorI2RlZmluZSBFQ19SX1VOS05PV05fT1JERVIJCQkJIDExNAorI2RlZmluZSBFQ19SX1VOU1VQUE9SVEVEX0ZJRUxECQkJCSAxMzEKKyNkZWZpbmUgRUNfUl9XUk9OR19PUkRFUgkJCQkgMTMwCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZWNkaC5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2VjZGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI1OGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2VjZGguaApAQCAtMCwwICsxLDEyMyBAQAorLyogY3J5cHRvL2VjZGgvZWNkaC5oICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFRoZSBFbGxpcHRpYyBDdXJ2ZSBQdWJsaWMtS2V5IENyeXB0byBMaWJyYXJ5IChFQ0MgQ29kZSkgaW5jbHVkZWQKKyAqIGhlcmVpbiBpcyBkZXZlbG9wZWQgYnkgU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGlzIGNvbnRyaWJ1dGVkCisgKiB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBFQ0MgQ29kZSBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBiZWxvdy4KKyAqCisgKiBUaGUgRUNESCBzb2Z0d2FyZSBpcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRG91Z2xhcyBTdGViaWxhIG9mCisgKiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2lmbmRlZiBIRUFERVJfRUNESF9ICisjZGVmaW5lIEhFQURFUl9FQ0RIX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKworI2lmZGVmIE9QRU5TU0xfTk9fRUNESAorI2Vycm9yIEVDREggaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2NvbnN0IEVDREhfTUVUSE9EICpFQ0RIX09wZW5TU0wodm9pZCk7CisKK3ZvaWQJICBFQ0RIX3NldF9kZWZhdWx0X21ldGhvZChjb25zdCBFQ0RIX01FVEhPRCAqKTsKK2NvbnN0IEVDREhfTUVUSE9EICpFQ0RIX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKTsKK2ludCAJICBFQ0RIX3NldF9tZXRob2QoRUNfS0VZICosIGNvbnN0IEVDREhfTUVUSE9EICopOworCitpbnQgRUNESF9jb21wdXRlX2tleSh2b2lkICpvdXQsIHNpemVfdCBvdXRsZW4sIGNvbnN0IEVDX1BPSU5UICpwdWJfa2V5LCBFQ19LRVkgKmVjZGgsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICooKktERikoY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBpbmxlbiwgdm9pZCAqb3V0LCBzaXplX3QgKm91dGxlbikpOworCitpbnQgCSAgRUNESF9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAKKwkJKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgCSAgRUNESF9zZXRfZXhfZGF0YShFQ19LRVkgKmQsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkIAkgICpFQ0RIX2dldF9leF9kYXRhKEVDX0tFWSAqZCwgaW50IGlkeCk7CisKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9FQ0RIX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRUNESCBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBFQ0RIX0ZfRUNESF9DT01QVVRFX0tFWQkJCQkgMTAwCisjZGVmaW5lIEVDREhfRl9FQ0RIX0RBVEFfTkVXX01FVEhPRAkJCSAxMDEKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBFQ0RIX1JfS0RGX0ZBSUxFRAkJCQkgMTAyCisjZGVmaW5lIEVDREhfUl9OT19QUklWQVRFX1ZBTFVFCQkJCSAxMDAKKyNkZWZpbmUgRUNESF9SX1BPSU5UX0FSSVRITUVUSUNfRkFJTFVSRQkJCSAxMDEKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxYzUzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oCkBAIC0wLDAgKzEsMjU4IEBACisvKiBjcnlwdG8vZWNkc2EvZWNkc2EuaCAqLworLyoqCisgKiBcZmlsZSAgIGNyeXB0by9lY2RzYS9lY2RzYS5oIEluY2x1ZGUgZmlsZSBmb3IgdGhlIE9wZW5TU0wgRUNEU0EgZnVuY3Rpb25zCisgKiBcYXV0aG9yIFdyaXR0ZW4gYnkgTmlscyBMYXJzY2ggZm9yIHRoZSBPcGVuU1NMIHByb2plY3QKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisjaWZuZGVmIEhFQURFUl9FQ0RTQV9ICisjZGVmaW5lIEhFQURFUl9FQ0RTQV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX0VDRFNBCisjZXJyb3IgRUNEU0EgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvZWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IEVDRFNBX1NJR19zdAorCXsKKwlCSUdOVU0gKnI7CisJQklHTlVNICpzOworCX0gRUNEU0FfU0lHOworCisvKiogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplIGEgRUNEU0FfU0lHIHN0cnVjdHVyZQorICogIFxyZXR1cm4gcG9pbnRlciB0byBhIEVDRFNBX1NJRyBzdHJ1Y3R1cmUgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICovCitFQ0RTQV9TSUcgKkVDRFNBX1NJR19uZXcodm9pZCk7CisKKy8qKiBmcmVlcyBhIEVDRFNBX1NJRyBzdHJ1Y3R1cmUKKyAqICBccGFyYW0gIHNpZyAgcG9pbnRlciB0byB0aGUgRUNEU0FfU0lHIHN0cnVjdHVyZQorICovCit2b2lkCSAgRUNEU0FfU0lHX2ZyZWUoRUNEU0FfU0lHICpzaWcpOworCisvKiogREVSIGVuY29kZSBjb250ZW50IG9mIEVDRFNBX1NJRyBvYmplY3QgKG5vdGU6IHRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgKnBwCisgKiAgKCpwcCArPSBsZW5ndGggb2YgdGhlIERFUiBlbmNvZGVkIHNpZ25hdHVyZSkpLgorICogIFxwYXJhbSAgc2lnICBwb2ludGVyIHRvIHRoZSBFQ0RTQV9TSUcgb2JqZWN0CisgKiAgXHBhcmFtICBwcCAgIHBvaW50ZXIgdG8gYSB1bnNpZ25lZCBjaGFyIHBvaW50ZXIgZm9yIHRoZSBvdXRwdXQgb3IgTlVMTAorICogIFxyZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgREVSIGVuY29kZWQgRUNEU0FfU0lHIG9iamVjdCBvciAwIAorICovCitpbnQJICBpMmRfRUNEU0FfU0lHKGNvbnN0IEVDRFNBX1NJRyAqc2lnLCB1bnNpZ25lZCBjaGFyICoqcHApOworCisvKiogRGVjb2RlcyBhIERFUiBlbmNvZGVkIEVDRFNBIHNpZ25hdHVyZSAobm90ZTogdGhpcyBmdW5jdGlvbiBjaGFuZ2VzICpwcAorICogICgqcHAgKz0gbGVuKSkuIAorICogIFxwYXJhbSAgc2lnICBwb2ludGVyIHRvIEVDRFNBX1NJRyBwb2ludGVyIChtYXkgYmUgTlVMTCkKKyAqICBccGFyYW0gIHBwICAgbWVtb3J5IGJ1ZmZlciB3aXRoIHRoZSBERVIgZW5jb2RlZCBzaWduYXR1cmUKKyAqICBccGFyYW0gIGxlbiAgbGVuZ3RoIG9mIHRoZSBidWZmZXIKKyAqICBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIGRlY29kZWQgRUNEU0FfU0lHIHN0cnVjdHVyZSAob3IgTlVMTCkKKyAqLworRUNEU0FfU0lHICpkMmlfRUNEU0FfU0lHKEVDRFNBX1NJRyAqKnNpZywgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbik7CisKKy8qKiBDb21wdXRlcyB0aGUgRUNEU0Egc2lnbmF0dXJlIG9mIHRoZSBnaXZlbiBoYXNoIHZhbHVlIHVzaW5nCisgKiAgdGhlIHN1cHBsaWVkIHByaXZhdGUga2V5IGFuZCByZXR1cm5zIHRoZSBjcmVhdGVkIHNpZ25hdHVyZS4KKyAqICBccGFyYW0gIGRnc3QgICAgICBwb2ludGVyIHRvIHRoZSBoYXNoIHZhbHVlCisgKiAgXHBhcmFtICBkZ3N0X2xlbiAgbGVuZ3RoIG9mIHRoZSBoYXNoIHZhbHVlCisgKiAgXHBhcmFtICBlY2tleSAgICAgRUNfS0VZIG9iamVjdCBjb250YWluaW5nIGEgcHJpdmF0ZSBFQyBrZXkKKyAqICBccmV0dXJuIHBvaW50ZXIgdG8gYSBFQ0RTQV9TSUcgc3RydWN0dXJlIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworRUNEU0FfU0lHICpFQ0RTQV9kb19zaWduKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsaW50IGRnc3RfbGVuLEVDX0tFWSAqZWNrZXkpOworCisvKiogQ29tcHV0ZXMgRUNEU0Egc2lnbmF0dXJlIG9mIGEgZ2l2ZW4gaGFzaCB2YWx1ZSB1c2luZyB0aGUgc3VwcGxpZWQKKyAqICBwcml2YXRlIGtleSAobm90ZTogc2lnIG11c3QgcG9pbnQgdG8gRUNEU0Ffc2l6ZShlY2tleSkgYnl0ZXMgb2YgbWVtb3J5KS4KKyAqICBccGFyYW0gIGRnc3QgICAgIHBvaW50ZXIgdG8gdGhlIGhhc2ggdmFsdWUgdG8gc2lnbgorICogIFxwYXJhbSAgZGdzdGxlbiAgbGVuZ3RoIG9mIHRoZSBoYXNoIHZhbHVlCisgKiAgXHBhcmFtICBraW52ICAgICBCSUdOVU0gd2l0aCBhIHByZS1jb21wdXRlZCBpbnZlcnNlIGsgKG9wdGlvbmFsKQorICogIFxwYXJhbSAgcnAgICAgICAgQklHTlVNIHdpdGggYSBwcmUtY29tcHV0ZWQgcnAgdmFsdWUgKG9wdGlvYW5sKSwgCisgKiAgICAgICAgICAgICAgICAgICBzZWUgRUNEU0Ffc2lnbl9zZXR1cAorICogIFxwYXJhbSAgZWNrZXkgICAgRUNfS0VZIG9iamVjdCBjb250YWluaW5nIGEgcHJpdmF0ZSBFQyBrZXkKKyAqICBccmV0dXJuIHBvaW50ZXIgdG8gYSBFQ0RTQV9TSUcgc3RydWN0dXJlIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworRUNEU0FfU0lHICpFQ0RTQV9kb19zaWduX2V4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkZ3N0bGVuLCAKKwkJY29uc3QgQklHTlVNICpraW52LCBjb25zdCBCSUdOVU0gKnJwLCBFQ19LRVkgKmVja2V5KTsKKworLyoqIFZlcmlmaWVzIHRoYXQgdGhlIHN1cHBsaWVkIHNpZ25hdHVyZSBpcyBhIHZhbGlkIEVDRFNBCisgKiAgc2lnbmF0dXJlIG9mIHRoZSBzdXBwbGllZCBoYXNoIHZhbHVlIHVzaW5nIHRoZSBzdXBwbGllZCBwdWJsaWMga2V5LgorICogIFxwYXJhbSAgZGdzdCAgICAgIHBvaW50ZXIgdG8gdGhlIGhhc2ggdmFsdWUKKyAqICBccGFyYW0gIGRnc3RfbGVuICBsZW5ndGggb2YgdGhlIGhhc2ggdmFsdWUKKyAqICBccGFyYW0gIHNpZyAgICAgICBFQ0RTQV9TSUcgc3RydWN0dXJlCisgKiAgXHBhcmFtICBlY2tleSAgICAgRUNfS0VZIG9iamVjdCBjb250YWluaW5nIGEgcHVibGljIEVDIGtleQorICogIFxyZXR1cm4gMSBpZiB0aGUgc2lnbmF0dXJlIGlzIHZhbGlkLCAwIGlmIHRoZSBzaWduYXR1cmUgaXMgaW52YWxpZAorICogICAgICAgICAgYW5kIC0xIG9uIGVycm9yCisgKi8KK2ludAkgIEVDRFNBX2RvX3ZlcmlmeShjb25zdCB1bnNpZ25lZCBjaGFyICpkZ3N0LCBpbnQgZGdzdF9sZW4sCisJCWNvbnN0IEVDRFNBX1NJRyAqc2lnLCBFQ19LRVkqIGVja2V5KTsKKworY29uc3QgRUNEU0FfTUVUSE9EICpFQ0RTQV9PcGVuU1NMKHZvaWQpOworCisvKiogU2V0cyB0aGUgZGVmYXVsdCBFQ0RTQSBtZXRob2QKKyAqICBccGFyYW0gIG1ldGggIG5ldyBkZWZhdWx0IEVDRFNBX01FVEhPRAorICovCit2b2lkCSAgRUNEU0Ffc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IEVDRFNBX01FVEhPRCAqbWV0aCk7CisKKy8qKiBSZXR1cm5zIHRoZSBkZWZhdWx0IEVDRFNBIG1ldGhvZAorICogIFxyZXR1cm4gcG9pbnRlciB0byBFQ0RTQV9NRVRIT0Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgbWV0aG9kCisgKi8KK2NvbnN0IEVDRFNBX01FVEhPRCAqRUNEU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKHZvaWQpOworCisvKiogU2V0cyBtZXRob2QgdG8gYmUgdXNlZCBmb3IgdGhlIEVDRFNBIG9wZXJhdGlvbnMKKyAqICBccGFyYW0gIGVja2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHBhcmFtICBtZXRoICAgbmV3IG1ldGhvZAorICogIFxyZXR1cm4gMSBvbiBzdWNjZXNzIGFuZCAwIG90aGVyd2lzZSAKKyAqLworaW50IAkgIEVDRFNBX3NldF9tZXRob2QoRUNfS0VZICplY2tleSwgY29uc3QgRUNEU0FfTUVUSE9EICptZXRoKTsKKworLyoqIFJldHVybnMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBERVIgZW5jb2RlZCBzaWduYXR1cmUKKyAqICBccGFyYW0gIGVja2V5ICBFQ19LRVkgb2JqZWN0CisgKiAgXHJldHVybiBudW1iZXJzIG9mIGJ5dGVzIHJlcXVpcmVkIGZvciB0aGUgREVSIGVuY29kZWQgc2lnbmF0dXJlCisgKi8KK2ludAkgIEVDRFNBX3NpemUoY29uc3QgRUNfS0VZICplY2tleSk7CisKKy8qKiBQcmVjb21wdXRlIHBhcnRzIG9mIHRoZSBzaWduaW5nIG9wZXJhdGlvbgorICogIFxwYXJhbSAgZWNrZXkgIEVDX0tFWSBvYmplY3QgY29udGFpbmluZyBhIHByaXZhdGUgRUMga2V5CisgKiAgXHBhcmFtICBjdHggICAgQk5fQ1RYIG9iamVjdCAob3B0aW9uYWwpCisgKiAgXHBhcmFtICBraW52ICAgQklHTlVNIHBvaW50ZXIgZm9yIHRoZSBpbnZlcnNlIG9mIGsKKyAqICBccGFyYW0gIHJwICAgICBCSUdOVU0gcG9pbnRlciBmb3IgeCBjb29yZGluYXRlIG9mIGsgKiBnZW5lcmF0b3IKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBvdGhlcndpc2UKKyAqLworaW50IAkgIEVDRFNBX3NpZ25fc2V0dXAoRUNfS0VZICplY2tleSwgQk5fQ1RYICpjdHgsIEJJR05VTSAqKmtpbnYsIAorCQlCSUdOVU0gKipycCk7CisKKy8qKiBDb21wdXRlcyBFQ0RTQSBzaWduYXR1cmUgb2YgYSBnaXZlbiBoYXNoIHZhbHVlIHVzaW5nIHRoZSBzdXBwbGllZAorICogIHByaXZhdGUga2V5IChub3RlOiBzaWcgbXVzdCBwb2ludCB0byBFQ0RTQV9zaXplKGVja2V5KSBieXRlcyBvZiBtZW1vcnkpLgorICogIFxwYXJhbSAgdHlwZSAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZAorICogIFxwYXJhbSAgZGdzdCAgICAgcG9pbnRlciB0byB0aGUgaGFzaCB2YWx1ZSB0byBzaWduCisgKiAgXHBhcmFtICBkZ3N0bGVuICBsZW5ndGggb2YgdGhlIGhhc2ggdmFsdWUKKyAqICBccGFyYW0gIHNpZyAgICAgIG1lbW9yeSBmb3IgdGhlIERFUiBlbmNvZGVkIGNyZWF0ZWQgc2lnbmF0dXJlCisgKiAgXHBhcmFtICBzaWdsZW4gICBwb2ludGVyIHRvIHRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIHNpZ25hdHVyZQorICogIFxwYXJhbSAgZWNrZXkgICAgRUNfS0VZIG9iamVjdCBjb250YWluaW5nIGEgcHJpdmF0ZSBFQyBrZXkKKyAqICBccmV0dXJuIDEgb24gc3VjY2VzcyBhbmQgMCBvdGhlcndpc2UKKyAqLworaW50CSAgRUNEU0Ffc2lnbihpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwgaW50IGRnc3RsZW4sIAorCQl1bnNpZ25lZCBjaGFyICpzaWcsIHVuc2lnbmVkIGludCAqc2lnbGVuLCBFQ19LRVkgKmVja2V5KTsKKworCisvKiogQ29tcHV0ZXMgRUNEU0Egc2lnbmF0dXJlIG9mIGEgZ2l2ZW4gaGFzaCB2YWx1ZSB1c2luZyB0aGUgc3VwcGxpZWQKKyAqICBwcml2YXRlIGtleSAobm90ZTogc2lnIG11c3QgcG9pbnQgdG8gRUNEU0Ffc2l6ZShlY2tleSkgYnl0ZXMgb2YgbWVtb3J5KS4KKyAqICBccGFyYW0gIHR5cGUgICAgIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQKKyAqICBccGFyYW0gIGRnc3QgICAgIHBvaW50ZXIgdG8gdGhlIGhhc2ggdmFsdWUgdG8gc2lnbgorICogIFxwYXJhbSAgZGdzdGxlbiAgbGVuZ3RoIG9mIHRoZSBoYXNoIHZhbHVlCisgKiAgXHBhcmFtICBzaWcgICAgICBidWZmZXIgdG8gaG9sZCB0aGUgREVSIGVuY29kZWQgc2lnbmF0dXJlCisgKiAgXHBhcmFtICBzaWdsZW4gICBwb2ludGVyIHRvIHRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIHNpZ25hdHVyZQorICogIFxwYXJhbSAga2ludiAgICAgQklHTlVNIHdpdGggYSBwcmUtY29tcHV0ZWQgaW52ZXJzZSBrIChvcHRpb25hbCkKKyAqICBccGFyYW0gIHJwICAgICAgIEJJR05VTSB3aXRoIGEgcHJlLWNvbXB1dGVkIHJwIHZhbHVlIChvcHRpb2FubCksIAorICogICAgICAgICAgICAgICAgICAgc2VlIEVDRFNBX3NpZ25fc2V0dXAKKyAqICBccGFyYW0gIGVja2V5ICAgIEVDX0tFWSBvYmplY3QgY29udGFpbmluZyBhIHByaXZhdGUgRUMga2V5CisgKiAgXHJldHVybiAxIG9uIHN1Y2Nlc3MgYW5kIDAgb3RoZXJ3aXNlCisgKi8KK2ludAkgIEVDRFNBX3NpZ25fZXgoaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRnc3QsIGludCBkZ3N0bGVuLCAKKwkJdW5zaWduZWQgY2hhciAqc2lnLCB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgY29uc3QgQklHTlVNICpraW52LAorCQljb25zdCBCSUdOVU0gKnJwLCBFQ19LRVkgKmVja2V5KTsKKworLyoqIFZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIHNpZ25hdHVyZSBpcyB2YWxpZCBFQ0RTQSBzaWduYXR1cmUKKyAqICBvZiB0aGUgc3VwcGxpZWQgaGFzaCB2YWx1ZSB1c2luZyB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXkuCisgKiAgXHBhcmFtICB0eXBlICAgICB0aGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkCisgKiAgXHBhcmFtICBkZ3N0ICAgICBwb2ludGVyIHRvIHRoZSBoYXNoIHZhbHVlIAorICogIFxwYXJhbSAgZGdzdGxlbiAgbGVuZ3RoIG9mIHRoZSBoYXNoIHZhbHVlCisgKiAgXHBhcmFtICBzaWcgICAgICBwb2ludGVyIHRvIHRoZSBERVIgZW5jb2RlZCBzaWduYXR1cmUKKyAqICBccGFyYW0gIHNpZ2xlbiAgIGxlbmd0aCBvZiB0aGUgREVSIGVuY29kZWQgc2lnbmF0dXJlCisgKiAgXHBhcmFtICBlY2tleSAgICBFQ19LRVkgb2JqZWN0IGNvbnRhaW5pbmcgYSBwdWJsaWMgRUMga2V5CisgKiAgXHJldHVybiAxIGlmIHRoZSBzaWduYXR1cmUgaXMgdmFsaWQsIDAgaWYgdGhlIHNpZ25hdHVyZSBpcyBpbnZhbGlkCisgKiAgICAgICAgICBhbmQgLTEgb24gZXJyb3IKKyAqLworaW50IAkgIEVDRFNBX3ZlcmlmeShpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZGdzdCwgaW50IGRnc3RsZW4sIAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIGludCBzaWdsZW4sIEVDX0tFWSAqZWNrZXkpOworCisvKiB0aGUgc3RhbmRhcmQgZXhfZGF0YSBmdW5jdGlvbnMgKi8KK2ludCAJICBFQ0RTQV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAKKwkJKm5ld19mdW5jLCBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgCSAgRUNEU0Ffc2V0X2V4X2RhdGEoRUNfS0VZICpkLCBpbnQgaWR4LCB2b2lkICphcmcpOwordm9pZCAJICAqRUNEU0FfZ2V0X2V4X2RhdGEoRUNfS0VZICpkLCBpbnQgaWR4KTsKKworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX0VDRFNBX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRUNEU0EgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgRUNEU0FfRl9FQ0RTQV9EQVRBX05FV19NRVRIT0QJCQkgMTAwCisjZGVmaW5lIEVDRFNBX0ZfRUNEU0FfRE9fU0lHTgkJCQkgMTAxCisjZGVmaW5lIEVDRFNBX0ZfRUNEU0FfRE9fVkVSSUZZCQkJCSAxMDIKKyNkZWZpbmUgRUNEU0FfRl9FQ0RTQV9TSUdOX1NFVFVQCQkJIDEwMworCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIEVDRFNBX1JfQkFEX1NJR05BVFVSRQkJCQkgMTAwCisjZGVmaW5lIEVDRFNBX1JfREFUQV9UT09fTEFSR0VfRk9SX0tFWV9TSVpFCQkgMTAxCisjZGVmaW5lIEVDRFNBX1JfRVJSX0VDX0xJQgkJCQkgMTAyCisjZGVmaW5lIEVDRFNBX1JfTUlTU0lOR19QQVJBTUVURVJTCQkJIDEwMworI2RlZmluZSBFQ0RTQV9SX05FRURfTkVXX1NFVFVQX1ZBTFVFUwkJCSAxMDYKKyNkZWZpbmUgRUNEU0FfUl9SQU5ET01fTlVNQkVSX0dFTkVSQVRJT05fRkFJTEVECQkgMTA0CisjZGVmaW5lIEVDRFNBX1JfU0lHTkFUVVJFX01BTExPQ19GQUlMRUQJCQkgMTA1CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZW5naW5lLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZDk1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lbmdpbmUuaApAQCAtMCwwICsxLDgzMCBAQAorLyogb3BlbnNzbC9lbmdpbmUuaCAqLworLyogV3JpdHRlbiBieSBHZW9mZiBUaG9ycGUgKGdlb2ZmQGdlb2ZmdGhvcnBlLm5ldCkgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDAuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIEVDREggc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKworI2lmbmRlZiBIRUFERVJfRU5HSU5FX0gKKyNkZWZpbmUgSEVBREVSX0VOR0lORV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpZmRlZiBPUEVOU1NMX05PX0VOR0lORQorI2Vycm9yIEVOR0lORSBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKyNpbmNsdWRlIDxvcGVuc3NsL3JzYS5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisjaW5jbHVkZSA8b3BlbnNzbC9kc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorI2luY2x1ZGUgPG9wZW5zc2wvZWNkaC5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKyNpbmNsdWRlIDxvcGVuc3NsL2VjZHNhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3VpLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3ltaGFja3MuaD4KKworI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB0byBjb250cm9sIGNvbWJpbmF0aW9ucyBvZiBhbGdvcml0aG0gKG1ldGhvZHMpCisgKiBieSBiaXR3aXNlICJPUiJpbmcuICovCisjZGVmaW5lIEVOR0lORV9NRVRIT0RfUlNBCQkodW5zaWduZWQgaW50KTB4MDAwMQorI2RlZmluZSBFTkdJTkVfTUVUSE9EX0RTQQkJKHVuc2lnbmVkIGludCkweDAwMDIKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9ESAkJKHVuc2lnbmVkIGludCkweDAwMDQKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9SQU5ECQkodW5zaWduZWQgaW50KTB4MDAwOAorI2RlZmluZSBFTkdJTkVfTUVUSE9EX0VDREgJCSh1bnNpZ25lZCBpbnQpMHgwMDEwCisjZGVmaW5lIEVOR0lORV9NRVRIT0RfRUNEU0EJCSh1bnNpZ25lZCBpbnQpMHgwMDIwCisjZGVmaW5lIEVOR0lORV9NRVRIT0RfQ0lQSEVSUwkJKHVuc2lnbmVkIGludCkweDAwNDAKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9ESUdFU1RTCQkodW5zaWduZWQgaW50KTB4MDA4MAorI2RlZmluZSBFTkdJTkVfTUVUSE9EX1NUT1JFCQkodW5zaWduZWQgaW50KTB4MDEwMAorI2RlZmluZSBFTkdJTkVfTUVUSE9EX1BLRVlfTUVUSFMJKHVuc2lnbmVkIGludCkweDAyMDAKKyNkZWZpbmUgRU5HSU5FX01FVEhPRF9QS0VZX0FTTjFfTUVUSFMJKHVuc2lnbmVkIGludCkweDA0MDAKKy8qIE9idmlvdXMgYWxsLW9yLW5vdGhpbmcgY2FzZXMuICovCisjZGVmaW5lIEVOR0lORV9NRVRIT0RfQUxMCQkodW5zaWduZWQgaW50KTB4RkZGRgorI2RlZmluZSBFTkdJTkVfTUVUSE9EX05PTkUJCSh1bnNpZ25lZCBpbnQpMHgwMDAwCisKKy8qIFRoaXMoZXNlKSBmbGFnKHMpIGNvbnRyb2xzIGJlaGF2aW91ciBvZiB0aGUgRU5HSU5FX1RBQkxFIG1lY2hhbmlzbSB1c2VkCisgKiBpbnRlcm5hbGx5IHRvIGNvbnRyb2wgcmVnaXN0cmF0aW9uIG9mIEVOR0lORSBpbXBsZW1lbnRhdGlvbnMsIGFuZCBjYW4gYmUgc2V0CisgKiBieSBFTkdJTkVfc2V0X3RhYmxlX2ZsYWdzKCkuIFRoZSAiTk9JTklUIiBmbGFnIHByZXZlbnRzIGF0dGVtcHRzIHRvCisgKiBpbml0aWFsaXNlIHJlZ2lzdGVyZWQgRU5HSU5FcyBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXNlZC4gKi8KKyNkZWZpbmUgRU5HSU5FX1RBQkxFX0ZMQUdfTk9JTklUCSh1bnNpZ25lZCBpbnQpMHgwMDAxCisKKy8qIEVOR0lORSBmbGFncyB0aGF0IGNhbiBiZSBzZXQgYnkgRU5HSU5FX3NldF9mbGFncygpLiAqLworLyogI2RlZmluZSBFTkdJTkVfRkxBR1NfTUFMTE9DRUQJMHgwMDAxICovIC8qIE5vdCB1c2VkICovCisKKy8qIFRoaXMgZmxhZyBpcyBmb3IgRU5HSU5FcyB0aGF0IHdpc2ggdG8gaGFuZGxlIHRoZSB2YXJpb3VzICdDTUQnLXJlbGF0ZWQKKyAqIGNvbnRyb2wgY29tbWFuZHMgb24gdGhlaXIgb3duLiBXaXRob3V0IHRoaXMgZmxhZywgRU5HSU5FX2N0cmwoKSBoYW5kbGVzIHRoZXNlCisgKiBjb250cm9sIGNvbW1hbmRzIG9uIGJlaGFsZiBvZiB0aGUgRU5HSU5FIHVzaW5nIHRoZWlyICJjbWRfZGVmbnMiIGRhdGEuICovCisjZGVmaW5lIEVOR0lORV9GTEFHU19NQU5VQUxfQ01EX0NUUkwJKGludCkweDAwMDIKKworLyogVGhpcyBmbGFnIGlzIGZvciBFTkdJTkVzIHdobyByZXR1cm4gbmV3IGR1cGxpY2F0ZSBzdHJ1Y3R1cmVzIHdoZW4gZm91bmQgdmlhCisgKiAiRU5HSU5FX2J5X2lkKCkiLiBXaGVuIGFuIEVOR0lORSBtdXN0IHN0b3JlIHN0YXRlIChlZy4gaWYgRU5HSU5FX2N0cmwoKQorICogY29tbWFuZHMgYXJlIGNhbGxlZCBpbiBzZXF1ZW5jZSBhcyBwYXJ0IG9mIHNvbWUgc3RhdGVmdWwgcHJvY2VzcyBsaWtlCisgKiBrZXktZ2VuZXJhdGlvbiBzZXR1cCBhbmQgZXhlY3V0aW9uKSwgaXQgY2FuIHNldCB0aGlzIGZsYWcgLSB0aGVuIGVhY2ggYXR0ZW1wdAorICogdG8gb2J0YWluIHRoZSBFTkdJTkUgd2lsbCByZXN1bHQgaW4gaXQgYmVpbmcgY29waWVkIGludG8gYSBuZXcgc3RydWN0dXJlLgorICogTm9ybWFsbHksIEVOR0lORXMgZG9uJ3QgZGVjbGFyZSB0aGlzIGZsYWcgc28gRU5HSU5FX2J5X2lkKCkganVzdCBpbmNyZW1lbnRzCisgKiB0aGUgZXhpc3RpbmcgRU5HSU5FJ3Mgc3RydWN0dXJhbCByZWZlcmVuY2UgY291bnQuICovCisjZGVmaW5lIEVOR0lORV9GTEFHU19CWV9JRF9DT1BZCQkoaW50KTB4MDAwNAorCisvKiBFTkdJTkVzIGNhbiBzdXBwb3J0IHRoZWlyIG93biBjb21tYW5kIHR5cGVzLCBhbmQgdGhlc2UgZmxhZ3MgYXJlIHVzZWQgaW4KKyAqIEVOR0lORV9DVFJMX0dFVF9DTURfRkxBR1MgdG8gaW5kaWNhdGUgdG8gdGhlIGNhbGxlciB3aGF0IGtpbmQgb2YgaW5wdXQgZWFjaAorICogY29tbWFuZCBleHBlY3RzLiBDdXJyZW50bHkgb25seSBudW1lcmljIGFuZCBzdHJpbmcgaW5wdXQgaXMgc3VwcG9ydGVkLiBJZiBhCisgKiBjb250cm9sIGNvbW1hbmQgc3VwcG9ydHMgbm9uZSBvZiB0aGUgX05VTUVSSUMsIF9TVFJJTkcsIG9yIF9OT19JTlBVVCBvcHRpb25zLAorICogdGhlbiBpdCBpcyByZWdhcmRlZCBhcyBhbiAiaW50ZXJuYWwiIGNvbnRyb2wgY29tbWFuZCAtIGFuZCBub3QgZm9yIHVzZSBpbgorICogY29uZmlnIHNldHRpbmcgc2l0dWF0aW9ucy4gQXMgc3VjaCwgdGhleSdyZSBub3QgYXZhaWxhYmxlIHRvIHRoZQorICogRU5HSU5FX2N0cmxfY21kX3N0cmluZygpIGZ1bmN0aW9uLCBvbmx5IHJhdyBFTkdJTkVfY3RybCgpIGFjY2Vzcy4gQ2hhbmdlcyB0bworICogdGhpcyBsaXN0IG9mICdjb21tYW5kIHR5cGVzJyBzaG91bGQgYmUgcmVmbGVjdGVkIGNhcmVmdWxseSBpbgorICogRU5HSU5FX2NtZF9pc19leGVjdXRhYmxlKCkgYW5kIEVOR0lORV9jdHJsX2NtZF9zdHJpbmcoKS4gKi8KKworLyogYWNjZXB0cyBhICdsb25nJyBpbnB1dCB2YWx1ZSAoM3JkIHBhcmFtZXRlciB0byBFTkdJTkVfY3RybCkgKi8KKyNkZWZpbmUgRU5HSU5FX0NNRF9GTEFHX05VTUVSSUMJCSh1bnNpZ25lZCBpbnQpMHgwMDAxCisvKiBhY2NlcHRzIHN0cmluZyBpbnB1dCAoY2FzdCBmcm9tICd2b2lkKicgdG8gJ2NvbnN0IGNoYXIgKicsIDR0aCBwYXJhbWV0ZXIgdG8KKyAqIEVOR0lORV9jdHJsKSAqLworI2RlZmluZSBFTkdJTkVfQ01EX0ZMQUdfU1RSSU5HCQkodW5zaWduZWQgaW50KTB4MDAwMgorLyogSW5kaWNhdGVzIHRoYXQgdGhlIGNvbnRyb2wgY29tbWFuZCB0YWtlcyAqbm8qIGlucHV0LiBJZS4gdGhlIGNvbnRyb2wgY29tbWFuZAorICogaXMgdW5wYXJhbWV0ZXJpc2VkLiAqLworI2RlZmluZSBFTkdJTkVfQ01EX0ZMQUdfTk9fSU5QVVQJKHVuc2lnbmVkIGludCkweDAwMDQKKy8qIEluZGljYXRlcyB0aGF0IHRoZSBjb250cm9sIGNvbW1hbmQgaXMgaW50ZXJuYWwuIFRoaXMgY29udHJvbCBjb21tYW5kIHdvbid0CisgKiBiZSBzaG93biBpbiBhbnkgb3V0cHV0LCBhbmQgaXMgb25seSB1c2FibGUgdGhyb3VnaCB0aGUgRU5HSU5FX2N0cmxfY21kKCkKKyAqIGZ1bmN0aW9uLiAqLworI2RlZmluZSBFTkdJTkVfQ01EX0ZMQUdfSU5URVJOQUwJKHVuc2lnbmVkIGludCkweDAwMDgKKworLyogTkI6IFRoZXNlIDMgY29udHJvbCBjb21tYW5kcyBhcmUgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiBFTkdJTkVzCisgKiByZWx5aW5nIG9uIHRoZXNlIGNvbW1hbmRzIHNob3VsZCBjb21waWxlIGNvbmRpdGlvbmFsIHN1cHBvcnQgZm9yCisgKiBjb21wYXRpYmlsaXR5IChlZy4gaWYgdGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCkgYnV0IHNob3VsZCBhbHNvIG1pZ3JhdGUgdGhlCisgKiBzYW1lIGZ1bmN0aW9uYWxpdHkgdG8gdGhlaXIgb3duIEVOR0lORS1zcGVjaWZpYyBjb250cm9sIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZQorICogImRpc2NvdmVyZWQiIGJ5IGNhbGxpbmcgYXBwbGljYXRpb25zLiBUaGUgZmFjdCB0aGVzZSBjb250cm9sIGNvbW1hbmRzCisgKiB3b3VsZG4ndCBiZSAiZXhlY3V0YWJsZSIgKGllLiB1c2FibGUgYnkgdGV4dC1iYXNlZCBjb25maWcpIGRvZXNuJ3QgY2hhbmdlIHRoZQorICogZmFjdCB0aGF0IGFwcGxpY2F0aW9uIGNvZGUgY2FuIGZpbmQgYW5kIHVzZSB0aGVtIHdpdGhvdXQgcmVxdWlyaW5nIHBlci1FTkdJTkUKKyAqIGhhY2tpbmcuICovCisKKy8qIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHRvIHRlbGwgdGhlIGN0cmwgZnVuY3Rpb24gd2hhdCBzaG91bGQgYmUgZG9uZS4KKyAqIEFsbCBjb21tYW5kIG51bWJlcnMgYXJlIHNoYXJlZCBiZXR3ZWVuIGFsbCBlbmdpbmVzLCBldmVuIGlmIHNvbWUgZG9uJ3QKKyAqIG1ha2Ugc2Vuc2UgdG8gc29tZSBlbmdpbmVzLiAgSW4gc3VjaCBhIGNhc2UsIHRoZXkgZG8gbm90aGluZyBidXQgcmV0dXJuCisgKiB0aGUgZXJyb3IgRU5HSU5FX1JfQ1RSTF9DT01NQU5EX05PVF9JTVBMRU1FTlRFRC4gKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfU0VUX0xPR1NUUkVBTQkJMQorI2RlZmluZSBFTkdJTkVfQ1RSTF9TRVRfUEFTU1dPUkRfQ0FMTEJBQ0sJMgorI2RlZmluZSBFTkdJTkVfQ1RSTF9IVVAJCQkJMyAvKiBDbG9zZSBhbmQgcmVpbml0aWFsaXNlIGFueQorCQkJCQkJICAgICBoYW5kbGVzL2Nvbm5lY3Rpb25zIGV0Yy4gKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfU0VUX1VTRVJfSU5URVJGQUNFICAgICAgICAgIDQgLyogQWx0ZXJuYXRpdmUgdG8gY2FsbGJhY2sgKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfU0VUX0NBTExCQUNLX0RBVEEgICAgICAgICAgIDUgLyogVXNlci1zcGVjaWZpYyBkYXRhLCB1c2VkCisJCQkJCQkgICAgIHdoZW4gY2FsbGluZyB0aGUgcGFzc3dvcmQKKwkJCQkJCSAgICAgY2FsbGJhY2sgYW5kIHRoZSB1c2VyCisJCQkJCQkgICAgIGludGVyZmFjZSAqLworI2RlZmluZSBFTkdJTkVfQ1RSTF9MT0FEX0NPTkZJR1VSQVRJT04JCTYgLyogTG9hZCBhIGNvbmZpZ3VyYXRpb24sIGdpdmVuCisJCQkJCQkgICAgIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhCisJCQkJCQkgICAgIGZpbGUgbmFtZSBvciBzbyAqLworI2RlZmluZSBFTkdJTkVfQ1RSTF9MT0FEX1NFQ1RJT04JCTcgLyogTG9hZCBkYXRhIGZyb20gYSBnaXZlbgorCQkJCQkJICAgICBzZWN0aW9uIGluIHRoZSBhbHJlYWR5IGxvYWRlZAorCQkJCQkJICAgICBjb25maWd1cmF0aW9uICovCisKKy8qIFRoZXNlIGNvbnRyb2wgY29tbWFuZHMgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZGVhbCB3aXRoIGFuIGFyYml0cmFyeSBlbmdpbmUKKyAqIGluIGEgZHluYW1pYyB3YXkuIFdhcm46IE5lZ2F0aXZlIHJldHVybiB2YWx1ZXMgaW5kaWNhdGUgZXJyb3JzIEZPUiBUSEVTRQorICogQ09NTUFORFMgYmVjYXVzZSB6ZXJvIGlzIHVzZWQgdG8gaW5kaWNhdGUgJ2VuZC1vZi1saXN0Jy4gT3RoZXIgY29tbWFuZHMsCisgKiBpbmNsdWRpbmcgRU5HSU5FLXNwZWNpZmljIGNvbW1hbmQgdHlwZXMsIHJldHVybiB6ZXJvIGZvciBhbiBlcnJvci4KKyAqCisgKiBBbiBFTkdJTkUgY2FuIGNob29zZSB0byBpbXBsZW1lbnQgdGhlc2UgY3RybCBmdW5jdGlvbnMsIGFuZCBjYW4gaW50ZXJuYWxseQorICogbWFuYWdlIHRoaW5ncyBob3dldmVyIGl0IGNob29zZXMgLSBpdCBkb2VzIHNvIGJ5IHNldHRpbmcgdGhlCisgKiBFTkdJTkVfRkxBR1NfTUFOVUFMX0NNRF9DVFJMIGZsYWcgKHVzaW5nIEVOR0lORV9zZXRfZmxhZ3MoKSkuIE90aGVyd2lzZSB0aGUKKyAqIEVOR0lORV9jdHJsKCkgY29kZSBoYW5kbGVzIHRoaXMgb24gdGhlIEVOR0lORSdzIGJlaGFsZiB1c2luZyB0aGUgY21kX2RlZm5zCisgKiBkYXRhIChzZXQgdXNpbmcgRU5HSU5FX3NldF9jbWRfZGVmbnMoKSkuIFRoaXMgbWVhbnMgYW4gRU5HSU5FJ3MgY3RybCgpCisgKiBoYW5kbGVyIG5lZWQgb25seSBpbXBsZW1lbnQgaXRzIG93biBjb21tYW5kcyAtIHRoZSBhYm92ZSAibWV0YSIgY29tbWFuZHMgd2lsbAorICogYmUgdGFrZW4gY2FyZSBvZi4gKi8KKworLyogUmV0dXJucyBub24temVybyBpZiB0aGUgc3VwcGxpZWQgRU5HSU5FIGhhcyBhIGN0cmwoKSBoYW5kbGVyLiBJZiAibm90IiwgdGhlbgorICogYWxsIHRoZSByZW1haW5pbmcgY29udHJvbCBjb21tYW5kcyB3aWxsIHJldHVybiBmYWlsdXJlLCBzbyBpdCBpcyB3b3J0aAorICogY2hlY2tpbmcgdGhpcyBmaXJzdCBpZiB0aGUgY2FsbGVyIGlzIHRyeWluZyB0byAiZGlzY292ZXIiIHRoZSBlbmdpbmUncworICogY2FwYWJpbGl0aWVzIGFuZCBkb2Vzbid0IHdhbnQgZXJyb3JzIGdlbmVyYXRlZCB1bm5lY2Vzc2FyaWx5LiAqLworI2RlZmluZSBFTkdJTkVfQ1RSTF9IQVNfQ1RSTF9GVU5DVElPTgkJMTAKKy8qIFJldHVybnMgYSBwb3NpdGl2ZSBjb21tYW5kIG51bWJlciBmb3IgdGhlIGZpcnN0IGNvbW1hbmQgc3VwcG9ydGVkIGJ5IHRoZQorICogZW5naW5lLiBSZXR1cm5zIHplcm8gaWYgbm8gY3RybCBjb21tYW5kcyBhcmUgc3VwcG9ydGVkLiAqLworI2RlZmluZSBFTkdJTkVfQ1RSTF9HRVRfRklSU1RfQ01EX1RZUEUJCTExCisvKiBUaGUgJ2xvbmcnIGFyZ3VtZW50IHNwZWNpZmllcyBhIGNvbW1hbmQgaW1wbGVtZW50ZWQgYnkgdGhlIGVuZ2luZSwgYW5kIHRoZQorICogcmV0dXJuIHZhbHVlIGlzIHRoZSBuZXh0IGNvbW1hbmQgc3VwcG9ydGVkLCBvciB6ZXJvIGlmIHRoZXJlIGFyZSBubyBtb3JlLiAqLworI2RlZmluZSBFTkdJTkVfQ1RSTF9HRVRfTkVYVF9DTURfVFlQRQkJMTIKKy8qIFRoZSAndm9pZConIGFyZ3VtZW50IGlzIGEgY29tbWFuZCBuYW1lIChjYXN0IGZyb20gJ2NvbnN0IGNoYXIgKicpLCBhbmQgdGhlCisgKiByZXR1cm4gdmFsdWUgaXMgdGhlIGNvbW1hbmQgdGhhdCBjb3JyZXNwb25kcyB0byBpdC4gKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfR0VUX0NNRF9GUk9NX05BTUUJCTEzCisvKiBUaGUgbmV4dCB0d28gYWxsb3cgYSBjb21tYW5kIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGl0cyBjb3JyZXNwb25kaW5nIHN0cmluZworICogZm9ybS4gSW4gZWFjaCBjYXNlLCB0aGUgJ2xvbmcnIGFyZ3VtZW50IHN1cHBsaWVzIHRoZSBjb21tYW5kLiBJbiB0aGUgTkFNRV9MRU4KKyAqIGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgY29tbWFuZCBuYW1lIChub3QgY291bnRpbmcgYQorICogdHJhaWxpbmcgRU9MKS4gSW4gdGhlIE5BTUUgY2FzZSwgdGhlICd2b2lkKicgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBidWZmZXIKKyAqIGxhcmdlIGVub3VnaCwgYW5kIGl0IHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgKFdJVEggYQorICogdHJhaWxpbmcgRU9MKS4gKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfR0VUX05BTUVfTEVOX0ZST01fQ01ECTE0CisjZGVmaW5lIEVOR0lORV9DVFJMX0dFVF9OQU1FX0ZST01fQ01ECQkxNQorLyogVGhlIG5leHQgdHdvIGFyZSBzaW1pbGFyIGJ1dCBnaXZlIGEgInNob3J0IGRlc2NyaXB0aW9uIiBvZiBhIGNvbW1hbmQuICovCisjZGVmaW5lIEVOR0lORV9DVFJMX0dFVF9ERVNDX0xFTl9GUk9NX0NNRAkxNgorI2RlZmluZSBFTkdJTkVfQ1RSTF9HRVRfREVTQ19GUk9NX0NNRAkJMTcKKy8qIFdpdGggdGhpcyBjb21tYW5kLCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBPUidkIGNvbWJpbmF0aW9uIG9mCisgKiBFTkdJTkVfQ01EX0ZMQUdfKioqIHZhbHVlcyB0aGF0IGluZGljYXRlIHdoYXQga2luZCBvZiBpbnB1dCBhIGdpdmVuCisgKiBlbmdpbmUtc3BlY2lmaWMgY3RybCBjb21tYW5kIGV4cGVjdHMuICovCisjZGVmaW5lIEVOR0lORV9DVFJMX0dFVF9DTURfRkxBR1MJCTE4CisKKy8qIEVOR0lORSBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN0YXJ0IHRoZSBudW1iZXJpbmcgb2YgdGhlaXIgb3duIGNvbnRyb2wKKyAqIGNvbW1hbmRzIGZyb20gdGhpcyB2YWx1ZS4gKGllLiBFTkdJTkVfQ01EX0JBU0UsIEVOR0lORV9DTURfQkFTRSArIDEsIGV0YykuICovCisjZGVmaW5lIEVOR0lORV9DTURfQkFTRQkJCQkyMDAKKworLyogTkI6IFRoZXNlIDIgbkNpcGhlciAiY2hpbCIgY29udHJvbCBjb21tYW5kcyBhcmUgZGVwcmVjYXRlZCwgYW5kIHRoZWlyCisgKiBmdW5jdGlvbmFsaXR5IGlzIG5vdyBhdmFpbGFibGUgdGhyb3VnaCBFTkdJTkUtc3BlY2lmaWMgY29udHJvbCBjb21tYW5kcworICogKGV4cG9zZWQgdGhyb3VnaCB0aGUgYWJvdmUtbWVudGlvbmVkICdDTUQnLWhhbmRsaW5nKS4gQ29kZSB1c2luZyB0aGVzZSAyCisgKiBjb21tYW5kcyBzaG91bGQgYmUgbWlncmF0ZWQgdG8gdGhlIG1vcmUgZ2VuZXJhbCBjb21tYW5kIGhhbmRsaW5nIGJlZm9yZSB0aGVzZQorICogYXJlIHJlbW92ZWQuICovCisKKy8qIEZsYWdzIHNwZWNpZmljIHRvIHRoZSBuQ2lwaGVyICJjaGlsIiBlbmdpbmUgKi8KKyNkZWZpbmUgRU5HSU5FX0NUUkxfQ0hJTF9TRVRfRk9SS0NIRUNLCQkxMDAKKwkvKiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSAobG9uZylpIGFyZ3VtZW50LCB0aGlzIHNldHMgb3IKKwkgKiB1bnNldHMgdGhlIFNpbXBsZUZvcmtDaGVjayBmbGFnIGluIHRoZSBDSElMIEFQSSB0byBlbmFibGUgb3IKKwkgKiBkaXNhYmxlIGNoZWNraW5nIGFuZCB3b3JrYXJvdW5kcyBmb3IgYXBwbGljYXRpb25zIHRoYXQgZm9yaygpLgorCSAqLworI2RlZmluZSBFTkdJTkVfQ1RSTF9DSElMX05PX0xPQ0tJTkcJCTEwMQorCS8qIFRoaXMgcHJldmVudHMgdGhlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZyb20gcHJvdmlkaW5nIG11dGV4CisJICogY2FsbGJhY2tzIHRvIHRoZSBuQ2lwaGVyIGxpYnJhcnkuICovCisKKy8qIElmIGFuIEVOR0lORSBzdXBwb3J0cyBpdHMgb3duIHNwZWNpZmljIGNvbnRyb2wgY29tbWFuZHMgYW5kIHdpc2hlcyB0aGUKKyAqIGZyYW1ld29yayB0byBoYW5kbGUgdGhlIGFib3ZlICdFTkdJTkVfQ01EXyoqKictbWFuaXB1bGF0aW9uIGNvbW1hbmRzIG9uIGl0cworICogYmVoYWxmLCBpdCBzaG91bGQgc3VwcGx5IGEgbnVsbC10ZXJtaW5hdGVkIGFycmF5IG9mIEVOR0lORV9DTURfREVGTiBlbnRyaWVzCisgKiB0byBFTkdJTkVfc2V0X2NtZF9kZWZucygpLiBJdCBzaG91bGQgYWxzbyBpbXBsZW1lbnQgYSBjdHJsKCkgaGFuZGxlciB0aGF0CisgKiBzdXBwb3J0cyB0aGUgc3RhdGVkIGNvbW1hbmRzIChpZS4gdGhlICJjbWRfbnVtIiBlbnRyaWVzIGFzIGRlc2NyaWJlZCBieSB0aGUKKyAqIGFycmF5KS4gTkI6IFRoZSBhcnJheSBtdXN0IGJlIG9yZGVyZWQgaW4gaW5jcmVhc2luZyBvcmRlciBvZiBjbWRfbnVtLgorICogIm51bGwtdGVybWluYXRlZCIgbWVhbnMgdGhhdCB0aGUgbGFzdCBFTkdJTkVfQ01EX0RFRk4gZWxlbWVudCBoYXMgY21kX251bSBzZXQKKyAqIHRvIHplcm8gYW5kL29yIGNtZF9uYW1lIHNldCB0byBOVUxMLiAqLwordHlwZWRlZiBzdHJ1Y3QgRU5HSU5FX0NNRF9ERUZOX3N0CisJeworCXVuc2lnbmVkIGludCBjbWRfbnVtOyAvKiBUaGUgY29tbWFuZCBudW1iZXIgKi8KKwljb25zdCBjaGFyICpjbWRfbmFtZTsgLyogVGhlIGNvbW1hbmQgbmFtZSBpdHNlbGYgKi8KKwljb25zdCBjaGFyICpjbWRfZGVzYzsgLyogQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZCAqLworCXVuc2lnbmVkIGludCBjbWRfZmxhZ3M7IC8qIFRoZSBpbnB1dCB0aGUgY29tbWFuZCBleHBlY3RzICovCisJfSBFTkdJTkVfQ01EX0RFRk47CisKKy8qIEdlbmVyaWMgZnVuY3Rpb24gcG9pbnRlciAqLwordHlwZWRlZiBpbnQgKCpFTkdJTkVfR0VOX0ZVTkNfUFRSKSh2b2lkKTsKKy8qIEdlbmVyaWMgZnVuY3Rpb24gcG9pbnRlciB0YWtpbmcgbm8gYXJndW1lbnRzICovCit0eXBlZGVmIGludCAoKkVOR0lORV9HRU5fSU5UX0ZVTkNfUFRSKShFTkdJTkUgKik7CisvKiBTcGVjaWZpYyBjb250cm9sIGZ1bmN0aW9uIHBvaW50ZXIgKi8KK3R5cGVkZWYgaW50ICgqRU5HSU5FX0NUUkxfRlVOQ19QVFIpKEVOR0lORSAqLCBpbnQsIGxvbmcsIHZvaWQgKiwgdm9pZCAoKmYpKHZvaWQpKTsKKy8qIEdlbmVyaWMgbG9hZF9rZXkgZnVuY3Rpb24gcG9pbnRlciAqLwordHlwZWRlZiBFVlBfUEtFWSAqICgqRU5HSU5FX0xPQURfS0VZX1BUUikoRU5HSU5FICosIGNvbnN0IGNoYXIgKiwKKwlVSV9NRVRIT0QgKnVpX21ldGhvZCwgdm9pZCAqY2FsbGJhY2tfZGF0YSk7Cit0eXBlZGVmIGludCAoKkVOR0lORV9TU0xfQ0xJRU5UX0NFUlRfUFRSKShFTkdJTkUgKiwgU1NMICpzc2wsCisJU1RBQ0tfT0YoWDUwOV9OQU1FKSAqY2FfZG4sIFg1MDkgKipwY2VydCwgRVZQX1BLRVkgKipwa2V5LAorCVNUQUNLX09GKFg1MDkpICoqcG90aGVyLCBVSV9NRVRIT0QgKnVpX21ldGhvZCwgdm9pZCAqY2FsbGJhY2tfZGF0YSk7CisvKiBUaGVzZSBjYWxsYmFjayB0eXBlcyBhcmUgZm9yIGFuIEVOR0lORSdzIGhhbmRsZXIgZm9yIGNpcGhlciBhbmQgZGlnZXN0IGxvZ2ljLgorICogVGhlc2UgaGFuZGxlcnMgaGF2ZSB0aGVzZSBwcm90b3R5cGVzOworICogICBpbnQgZm9vKEVOR0lORSAqZSwgY29uc3QgRVZQX0NJUEhFUiAqKmNpcGhlciwgY29uc3QgaW50ICoqbmlkcywgaW50IG5pZCk7CisgKiAgIGludCBmb28oRU5HSU5FICplLCBjb25zdCBFVlBfTUQgKipkaWdlc3QsIGNvbnN0IGludCAqKm5pZHMsIGludCBuaWQpOworICogTG9va2luZyBhdCBob3cgdG8gaW1wbGVtZW50IHRoZXNlIGhhbmRsZXJzIGluIHRoZSBjYXNlIG9mIGNpcGhlciBzdXBwb3J0LCBpZgorICogdGhlIGZyYW1ld29yayB3YW50cyB0aGUgRVZQX0NJUEhFUiBmb3IgJ25pZCcsIGl0IHdpbGwgY2FsbDsKKyAqICAgZm9vKGUsICZwX2V2cF9jaXBoZXIsIE5VTEwsIG5pZCk7ICAgIChyZXR1cm4gemVybyBmb3IgZmFpbHVyZSkKKyAqIElmIHRoZSBmcmFtZXdvcmsgd2FudHMgYSBsaXN0IG9mIHN1cHBvcnRlZCAnbmlkJ3MsIGl0IHdpbGwgY2FsbDsKKyAqICAgZm9vKGUsIE5VTEwsICZwX25pZHMsIDApOyAocmV0dXJucyBudW1iZXIgb2YgJ25pZHMnIG9yIC0xIGZvciBlcnJvcikKKyAqLworLyogUmV0dXJucyB0byBhIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIHN1cHBvcnRlZCBjaXBoZXIgJ25pZCdzLiBJZiB0aGUgc2Vjb25kCisgKiBwYXJhbWV0ZXIgaXMgbm9uLU5VTEwgaXQgaXMgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBhcnJheS4gKi8KK3R5cGVkZWYgaW50ICgqRU5HSU5FX0NJUEhFUlNfUFRSKShFTkdJTkUgKiwgY29uc3QgRVZQX0NJUEhFUiAqKiwgY29uc3QgaW50ICoqLCBpbnQpOwordHlwZWRlZiBpbnQgKCpFTkdJTkVfRElHRVNUU19QVFIpKEVOR0lORSAqLCBjb25zdCBFVlBfTUQgKiosIGNvbnN0IGludCAqKiwgaW50KTsKK3R5cGVkZWYgaW50ICgqRU5HSU5FX1BLRVlfTUVUSFNfUFRSKShFTkdJTkUgKiwgRVZQX1BLRVlfTUVUSE9EICoqLCBjb25zdCBpbnQgKiosIGludCk7Cit0eXBlZGVmIGludCAoKkVOR0lORV9QS0VZX0FTTjFfTUVUSFNfUFRSKShFTkdJTkUgKiwgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKiosIGNvbnN0IGludCAqKiwgaW50KTsKKy8qIFNUUlVDVFVSRSBmdW5jdGlvbnMgLi4uIGFsbCBvZiB0aGVzZSBmdW5jdGlvbnMgZGVhbCB3aXRoIHBvaW50ZXJzIHRvIEVOR0lORQorICogc3RydWN0dXJlcyB3aGVyZSB0aGUgcG9pbnRlcnMgaGF2ZSBhICJzdHJ1Y3R1cmFsIHJlZmVyZW5jZSIuIFRoaXMgbWVhbnMgdGhhdAorICogdGhlaXIgcmVmZXJlbmNlIGlzIHRvIGFsbG93ZWQgYWNjZXNzIHRvIHRoZSBzdHJ1Y3R1cmUgYnV0IGl0IGRvZXMgbm90IGltcGx5CisgKiB0aGF0IHRoZSBzdHJ1Y3R1cmUgaXMgZnVuY3Rpb25hbC4gVG8gc2ltcGx5IGluY3JlbWVudCBvciBkZWNyZW1lbnQgdGhlCisgKiBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSBjb3VudCwgdXNlIEVOR0lORV9ieV9pZCBhbmQgRU5HSU5FX2ZyZWUuIE5COiBUaGlzIGlzIG5vdAorICogcmVxdWlyZWQgd2hlbiBpdGVyYXRpbmcgdXNpbmcgRU5HSU5FX2dldF9uZXh0IGFzIGl0IHdpbGwgYXV0b21hdGljYWxseQorICogZGVjcmVtZW50IHRoZSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgImN1cnJlbnQiIEVOR0lORSBhbmQKKyAqIGluY3JlbWVudCB0aGUgc3RydWN0dXJhbCByZWZlcmVuY2UgY291bnQgb2YgdGhlIEVOR0lORSBpdCByZXR1cm5zICh1bmxlc3MgaXQKKyAqIGlzIE5VTEwpLiAqLworCisvKiBHZXQgdGhlIGZpcnN0L2xhc3QgIkVOR0lORSIgdHlwZSBhdmFpbGFibGUuICovCitFTkdJTkUgKkVOR0lORV9nZXRfZmlyc3Qodm9pZCk7CitFTkdJTkUgKkVOR0lORV9nZXRfbGFzdCh2b2lkKTsKKy8qIEl0ZXJhdGUgdG8gdGhlIG5leHQvcHJldmlvdXMgIkVOR0lORSIgdHlwZSAoTlVMTCA9IGVuZCBvZiB0aGUgbGlzdCkuICovCitFTkdJTkUgKkVOR0lORV9nZXRfbmV4dChFTkdJTkUgKmUpOworRU5HSU5FICpFTkdJTkVfZ2V0X3ByZXYoRU5HSU5FICplKTsKKy8qIEFkZCBhbm90aGVyICJFTkdJTkUiIHR5cGUgaW50byB0aGUgYXJyYXkuICovCitpbnQgRU5HSU5FX2FkZChFTkdJTkUgKmUpOworLyogUmVtb3ZlIGFuIGV4aXN0aW5nICJFTkdJTkUiIHR5cGUgZnJvbSB0aGUgYXJyYXkuICovCitpbnQgRU5HSU5FX3JlbW92ZShFTkdJTkUgKmUpOworLyogUmV0cmlldmUgYW4gZW5naW5lIGZyb20gdGhlIGxpc3QgYnkgaXRzIHVuaXF1ZSAiaWQiIHZhbHVlLiAqLworRU5HSU5FICpFTkdJTkVfYnlfaWQoY29uc3QgY2hhciAqaWQpOworLyogQWRkIGFsbCB0aGUgYnVpbHQtaW4gZW5naW5lcy4gKi8KK3ZvaWQgRU5HSU5FX2xvYWRfb3BlbnNzbCh2b2lkKTsKK3ZvaWQgRU5HSU5FX2xvYWRfZHluYW1pYyh2b2lkKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19TVEFUSUNfRU5HSU5FCit2b2lkIEVOR0lORV9sb2FkXzQ3NThjY2Eodm9pZCk7Cit2b2lkIEVOR0lORV9sb2FkX2FlcCh2b2lkKTsKK3ZvaWQgRU5HSU5FX2xvYWRfYXRhbGxhKHZvaWQpOwordm9pZCBFTkdJTkVfbG9hZF9jaGlsKHZvaWQpOwordm9pZCBFTkdJTkVfbG9hZF9jc3dpZnQodm9pZCk7Cit2b2lkIEVOR0lORV9sb2FkX251cm9uKHZvaWQpOwordm9pZCBFTkdJTkVfbG9hZF9zdXJld2FyZSh2b2lkKTsKK3ZvaWQgRU5HSU5FX2xvYWRfdWJzZWModm9pZCk7Cit2b2lkIEVOR0lORV9sb2FkX3BhZGxvY2sodm9pZCk7Cit2b2lkIEVOR0lORV9sb2FkX2NhcGkodm9pZCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fR01QCit2b2lkIEVOR0lORV9sb2FkX2dtcCh2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0dPU1QKK3ZvaWQgRU5HSU5FX2xvYWRfZ29zdCh2b2lkKTsKKyNlbmRpZgorI2VuZGlmCit2b2lkIEVOR0lORV9sb2FkX2NyeXB0b2Rldih2b2lkKTsKK3ZvaWQgRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKHZvaWQpOworCisvKiBHZXQgYW5kIHNldCBnbG9iYWwgZmxhZ3MgKEVOR0lORV9UQUJMRV9GTEFHXyoqKikgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbgorICogInJlZ2lzdHJ5IiBoYW5kbGluZy4gKi8KK3Vuc2lnbmVkIGludCBFTkdJTkVfZ2V0X3RhYmxlX2ZsYWdzKHZvaWQpOwordm9pZCBFTkdJTkVfc2V0X3RhYmxlX2ZsYWdzKHVuc2lnbmVkIGludCBmbGFncyk7CisKKy8qIE1hbmFnZSByZWdpc3RyYXRpb24gb2YgRU5HSU5FcyBwZXIgInRhYmxlIi4gRm9yIGVhY2ggdHlwZSwgdGhlcmUgYXJlIDMKKyAqIGZ1bmN0aW9uczsKKyAqICAgRU5HSU5FX3JlZ2lzdGVyXyoqKihlKSAtIHJlZ2lzdGVycyB0aGUgaW1wbGVtZW50YXRpb24gZnJvbSAnZScgKGlmIGl0IGhhcyBvbmUpCisgKiAgIEVOR0lORV91bnJlZ2lzdGVyXyoqKihlKSAtIHVucmVnaXN0ZXIgdGhlIGltcGxlbWVudGF0aW9uIGZyb20gJ2UnCisgKiAgIEVOR0lORV9yZWdpc3Rlcl9hbGxfKioqKCkgLSBjYWxsIEVOR0lORV9yZWdpc3Rlcl8qKiooKSBmb3IgZWFjaCAnZScgaW4gdGhlIGxpc3QKKyAqIENsZWFudXAgaXMgYXV0b21hdGljYWxseSByZWdpc3RlcmVkIGZyb20gZWFjaCB0YWJsZSB3aGVuIHJlcXVpcmVkLCBzbworICogRU5HSU5FX2NsZWFudXAoKSB3aWxsIHJldmVyc2UgYW55ICJyZWdpc3RlciIgb3BlcmF0aW9ucy4gKi8KKworaW50IEVOR0lORV9yZWdpc3Rlcl9SU0EoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfUlNBKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfUlNBKHZvaWQpOworCitpbnQgRU5HSU5FX3JlZ2lzdGVyX0RTQShFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9EU0EoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9EU0Eodm9pZCk7CisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfRUNESChFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9FQ0RIKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfRUNESCh2b2lkKTsKKworaW50IEVOR0lORV9yZWdpc3Rlcl9FQ0RTQShFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9FQ0RTQShFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX0VDRFNBKHZvaWQpOworCitpbnQgRU5HSU5FX3JlZ2lzdGVyX0RIKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV91bnJlZ2lzdGVyX0RIKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfREgodm9pZCk7CisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfUkFORChFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9SQU5EKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfUkFORCh2b2lkKTsKKworaW50IEVOR0lORV9yZWdpc3Rlcl9TVE9SRShFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9TVE9SRShFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX1NUT1JFKHZvaWQpOworCitpbnQgRU5HSU5FX3JlZ2lzdGVyX2NpcGhlcnMoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3VucmVnaXN0ZXJfY2lwaGVycyhFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfcmVnaXN0ZXJfYWxsX2NpcGhlcnModm9pZCk7CisKK2ludCBFTkdJTkVfcmVnaXN0ZXJfZGlnZXN0cyhFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9kaWdlc3RzKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV9yZWdpc3Rlcl9hbGxfZGlnZXN0cyh2b2lkKTsKKworaW50IEVOR0lORV9yZWdpc3Rlcl9wa2V5X21ldGhzKEVOR0lORSAqZSk7Cit2b2lkIEVOR0lORV91bnJlZ2lzdGVyX3BrZXlfbWV0aHMoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9wa2V5X21ldGhzKHZvaWQpOworCitpbnQgRU5HSU5FX3JlZ2lzdGVyX3BrZXlfYXNuMV9tZXRocyhFTkdJTkUgKmUpOwordm9pZCBFTkdJTkVfdW5yZWdpc3Rlcl9wa2V5X2FzbjFfbWV0aHMoRU5HSU5FICplKTsKK3ZvaWQgRU5HSU5FX3JlZ2lzdGVyX2FsbF9wa2V5X2FzbjFfbWV0aHModm9pZCk7CisKKy8qIFRoZXNlIGZ1bmN0aW9ucyByZWdpc3RlciBhbGwgc3VwcG9ydCBmcm9tIHRoZSBhYm92ZSBjYXRlZ29yaWVzLiBOb3RlLCB1c2Ugb2YKKyAqIHRoZXNlIGZ1bmN0aW9ucyBjYW4gcmVzdWx0IGluIHN0YXRpYyBsaW5rYWdlIG9mIGNvZGUgeW91ciBhcHBsaWNhdGlvbiBtYXkgbm90CisgKiBuZWVkLiBJZiB5b3Ugb25seSBuZWVkIGEgc3Vic2V0IG9mIGZ1bmN0aW9uYWxpdHksIGNvbnNpZGVyIHVzaW5nIG1vcmUKKyAqIHNlbGVjdGl2ZSBpbml0aWFsaXNhdGlvbi4gKi8KK2ludCBFTkdJTkVfcmVnaXN0ZXJfY29tcGxldGUoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfcmVnaXN0ZXJfYWxsX2NvbXBsZXRlKHZvaWQpOworCisvKiBTZW5kIHBhcmFtZXRyaXNlZCBjb250cm9sIGNvbW1hbmRzIHRvIHRoZSBlbmdpbmUuIFRoZSBwb3NzaWJpbGl0aWVzIHRvIHNlbmQKKyAqIGRvd24gYW4gaW50ZWdlciwgYSBwb2ludGVyIHRvIGRhdGEgb3IgYSBmdW5jdGlvbiBwb2ludGVyIGFyZSBwcm92aWRlZC4gQW55IG9mCisgKiB0aGUgcGFyYW1ldGVycyBtYXkgb3IgbWF5IG5vdCBiZSBOVUxMLCBkZXBlbmRpbmcgb24gdGhlIGNvbW1hbmQgbnVtYmVyLiBJbgorICogYWN0dWFsaXR5LCB0aGlzIGZ1bmN0aW9uIG9ubHkgcmVxdWlyZXMgYSBzdHJ1Y3R1cmFsIChyYXRoZXIgdGhhbiBmdW5jdGlvbmFsKQorICogcmVmZXJlbmNlIHRvIGFuIGVuZ2luZSwgYnV0IG1hbnkgY29udHJvbCBjb21tYW5kcyBtYXkgcmVxdWlyZSB0aGUgZW5naW5lIGJlCisgKiBmdW5jdGlvbmFsLiBUaGUgY2FsbGVyIHNob3VsZCBiZSBhd2FyZSBvZiB0cnlpbmcgY29tbWFuZHMgdGhhdCByZXF1aXJlIGFuCisgKiBvcGVyYXRpb25hbCBFTkdJTkUsIGFuZCBvbmx5IHVzZSBmdW5jdGlvbmFsIHJlZmVyZW5jZXMgaW4gc3VjaCBzaXR1YXRpb25zLiAqLworaW50IEVOR0lORV9jdHJsKEVOR0lORSAqZSwgaW50IGNtZCwgbG9uZyBpLCB2b2lkICpwLCB2b2lkICgqZikodm9pZCkpOworCisvKiBUaGlzIGZ1bmN0aW9uIHRlc3RzIGlmIGFuIEVOR0lORS1zcGVjaWZpYyBjb21tYW5kIGlzIHVzYWJsZSBhcyBhICJzZXR0aW5nIi4KKyAqIEVnLiBpbiBhbiBhcHBsaWNhdGlvbidzIGNvbmZpZyBmaWxlIHRoYXQgZ2V0cyBwcm9jZXNzZWQgdGhyb3VnaAorICogRU5HSU5FX2N0cmxfY21kX3N0cmluZygpLiBJZiB0aGlzIHJldHVybnMgemVybywgaXQgaXMgbm90IGF2YWlsYWJsZSB0bworICogRU5HSU5FX2N0cmxfY21kX3N0cmluZygpLCBvbmx5IEVOR0lORV9jdHJsKCkuICovCitpbnQgRU5HSU5FX2NtZF9pc19leGVjdXRhYmxlKEVOR0lORSAqZSwgaW50IGNtZCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gd29ya3MgbGlrZSBFTkdJTkVfY3RybCgpIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0YWtpbmcgYQorICogY29tbWFuZCBuYW1lIGluc3RlYWQgb2YgYSBjb21tYW5kIG51bWJlciwgYW5kIGNhbiBoYW5kbGUgb3B0aW9uYWwgY29tbWFuZHMuCisgKiBTZWUgdGhlIGNvbW1lbnQgb24gRU5HSU5FX2N0cmxfY21kX3N0cmluZygpIGZvciBhbiBleHBsYW5hdGlvbiBvbiBob3cgdG8KKyAqIHVzZSB0aGUgY21kX25hbWUgYW5kIGNtZF9vcHRpb25hbC4gKi8KK2ludCBFTkdJTkVfY3RybF9jbWQoRU5HSU5FICplLCBjb25zdCBjaGFyICpjbWRfbmFtZSwKKyAgICAgICAgbG9uZyBpLCB2b2lkICpwLCB2b2lkICgqZikodm9pZCksIGludCBjbWRfb3B0aW9uYWwpOworCisvKiBUaGlzIGZ1bmN0aW9uIHBhc3NlcyBhIGNvbW1hbmQtbmFtZSBhbmQgYXJndW1lbnQgdG8gYW4gRU5HSU5FLiBUaGUgY21kX25hbWUKKyAqIGlzIGNvbnZlcnRlZCB0byBhIGNvbW1hbmQgbnVtYmVyIGFuZCB0aGUgY29udHJvbCBjb21tYW5kIGlzIGNhbGxlZCB1c2luZworICogJ2FyZycgYXMgYW4gYXJndW1lbnQgKHVubGVzcyB0aGUgRU5HSU5FIGRvZXNuJ3Qgc3VwcG9ydCBzdWNoIGEgY29tbWFuZCwgaW4KKyAqIHdoaWNoIGNhc2Ugbm8gY29udHJvbCBjb21tYW5kIGlzIGNhbGxlZCkuIFRoZSBjb21tYW5kIGlzIGNoZWNrZWQgZm9yIGlucHV0CisgKiBmbGFncywgYW5kIGlmIG5lY2Vzc2FyeSB0aGUgYXJndW1lbnQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBudW1lcmljIHZhbHVlLiBJZgorICogY21kX29wdGlvbmFsIGlzIG5vbi16ZXJvLCB0aGVuIGlmIHRoZSBFTkdJTkUgZG9lc24ndCBzdXBwb3J0IHRoZSBnaXZlbgorICogY21kX25hbWUgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHN1Y2Nlc3MgYW55d2F5LiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkCisgKiBmb3IgYXBwbGljYXRpb25zIHRvIHVzZSBzbyB0aGF0IHVzZXJzIChvciBjb25maWcgZmlsZXMpIGNhbiBzdXBwbHkKKyAqIGVuZ2luZS1zcGVjaWZpYyBjb25maWcgZGF0YSB0byB0aGUgRU5HSU5FIGF0IHJ1bi10aW1lIHRvIGNvbnRyb2wgYmVoYXZpb3VyIG9mCisgKiBzcGVjaWZpYyBlbmdpbmVzLiBBcyBzdWNoLCBpdCBzaG91bGRuJ3QgYmUgdXNlZCBmb3IgY2FsbGluZyBFTkdJTkVfY3RybCgpCisgKiBmdW5jdGlvbnMgdGhhdCByZXR1cm4gZGF0YSwgZGVhbCB3aXRoIGJpbmFyeSBkYXRhLCBvciB0aGF0IGFyZSBvdGhlcndpc2UKKyAqIHN1cHBvc2VkIHRvIGJlIHVzZWQgZGlyZWN0bHkgdGhyb3VnaCBFTkdJTkVfY3RybCgpIGluIGFwcGxpY2F0aW9uIGNvZGUuIEFueQorICogInJldHVybiIgZGF0YSBmcm9tIGFuIEVOR0lORV9jdHJsKCkgb3BlcmF0aW9uIGluIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBsb3N0IC0KKyAqIHRoZSByZXR1cm4gdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgZmFpbHVyZSBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHplcm8sCisgKiBzdWNjZXNzIG90aGVyd2lzZSwgYW5kIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgYXMgYSByZXN1bHQuIEluCisgKiBvdGhlciB3b3JkcywgdmVuZG9ycyBvZiAnRU5HSU5FJy1lbmFibGVkIGRldmljZXMgc2hvdWxkIHdyaXRlIEVOR0lORQorICogaW1wbGVtZW50YXRpb25zIHdpdGggcGFyYW1ldGVyaXNhdGlvbnMgdGhhdCB3b3JrIGluIHRoaXMgc2NoZW1lLCBzbyB0aGF0CisgKiBjb21wbGlhbnQgRU5HSU5FLWJhc2VkIGFwcGxpY2F0aW9ucyBjYW4gd29yayBjb25zaXN0ZW50bHkgd2l0aCB0aGUgc2FtZQorICogY29uZmlndXJhdGlvbiBmb3IgdGhlIHNhbWUgRU5HSU5FLWVuYWJsZWQgZGV2aWNlcywgYWNyb3NzIGFwcGxpY2F0aW9ucy4gKi8KK2ludCBFTkdJTkVfY3RybF9jbWRfc3RyaW5nKEVOR0lORSAqZSwgY29uc3QgY2hhciAqY21kX25hbWUsIGNvbnN0IGNoYXIgKmFyZywKKwkJCQlpbnQgY21kX29wdGlvbmFsKTsKKworLyogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VmdWwgZm9yIG1hbnVmYWN0dXJpbmcgbmV3IEVOR0lORSBzdHJ1Y3R1cmVzLiBUaGV5CisgKiBkb24ndCBhZGRyZXNzIHJlZmVyZW5jZSBjb3VudGluZyBhdCBhbGwgLSBvbmUgdXNlcyB0aGVtIHRvIHBvcHVsYXRlIGFuIEVOR0lORQorICogc3RydWN0dXJlIHdpdGggcGVyc29uYWxpc2VkIGltcGxlbWVudGF0aW9ucyBvZiB0aGluZ3MgcHJpb3IgdG8gdXNpbmcgaXQKKyAqIGRpcmVjdGx5IG9yIGFkZGluZyBpdCB0byB0aGUgYnVpbHRpbiBFTkdJTkUgbGlzdCBpbiBPcGVuU1NMLiBUaGVzZSBhcmUgYWxzbworICogaGVyZSBzbyB0aGF0IHRoZSBFTkdJTkUgc3RydWN0dXJlIGRvZXNuJ3QgaGF2ZSB0byBiZSBleHBvc2VkIGFuZCBicmVhayBiaW5hcnkKKyAqIGNvbXBhdGliaWxpdHkhICovCitFTkdJTkUgKkVOR0lORV9uZXcodm9pZCk7CitpbnQgRU5HSU5FX2ZyZWUoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfdXBfcmVmKEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX3NldF9pZChFTkdJTkUgKmUsIGNvbnN0IGNoYXIgKmlkKTsKK2ludCBFTkdJTkVfc2V0X25hbWUoRU5HSU5FICplLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBFTkdJTkVfc2V0X1JTQShFTkdJTkUgKmUsIGNvbnN0IFJTQV9NRVRIT0QgKnJzYV9tZXRoKTsKK2ludCBFTkdJTkVfc2V0X0RTQShFTkdJTkUgKmUsIGNvbnN0IERTQV9NRVRIT0QgKmRzYV9tZXRoKTsKK2ludCBFTkdJTkVfc2V0X0VDREgoRU5HSU5FICplLCBjb25zdCBFQ0RIX01FVEhPRCAqZWNkaF9tZXRoKTsKK2ludCBFTkdJTkVfc2V0X0VDRFNBKEVOR0lORSAqZSwgY29uc3QgRUNEU0FfTUVUSE9EICplY2RzYV9tZXRoKTsKK2ludCBFTkdJTkVfc2V0X0RIKEVOR0lORSAqZSwgY29uc3QgREhfTUVUSE9EICpkaF9tZXRoKTsKK2ludCBFTkdJTkVfc2V0X1JBTkQoRU5HSU5FICplLCBjb25zdCBSQU5EX01FVEhPRCAqcmFuZF9tZXRoKTsKK2ludCBFTkdJTkVfc2V0X1NUT1JFKEVOR0lORSAqZSwgY29uc3QgU1RPUkVfTUVUSE9EICpzdG9yZV9tZXRoKTsKK2ludCBFTkdJTkVfc2V0X2Rlc3Ryb3lfZnVuY3Rpb24oRU5HSU5FICplLCBFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUiBkZXN0cm95X2YpOworaW50IEVOR0lORV9zZXRfaW5pdF9mdW5jdGlvbihFTkdJTkUgKmUsIEVOR0lORV9HRU5fSU5UX0ZVTkNfUFRSIGluaXRfZik7CitpbnQgRU5HSU5FX3NldF9maW5pc2hfZnVuY3Rpb24oRU5HSU5FICplLCBFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUiBmaW5pc2hfZik7CitpbnQgRU5HSU5FX3NldF9jdHJsX2Z1bmN0aW9uKEVOR0lORSAqZSwgRU5HSU5FX0NUUkxfRlVOQ19QVFIgY3RybF9mKTsKK2ludCBFTkdJTkVfc2V0X2xvYWRfcHJpdmtleV9mdW5jdGlvbihFTkdJTkUgKmUsIEVOR0lORV9MT0FEX0tFWV9QVFIgbG9hZHByaXZfZik7CitpbnQgRU5HSU5FX3NldF9sb2FkX3B1YmtleV9mdW5jdGlvbihFTkdJTkUgKmUsIEVOR0lORV9MT0FEX0tFWV9QVFIgbG9hZHB1Yl9mKTsKK2ludCBFTkdJTkVfc2V0X2xvYWRfc3NsX2NsaWVudF9jZXJ0X2Z1bmN0aW9uKEVOR0lORSAqZSwKKwkJCQlFTkdJTkVfU1NMX0NMSUVOVF9DRVJUX1BUUiBsb2Fkc3NsX2YpOworaW50IEVOR0lORV9zZXRfY2lwaGVycyhFTkdJTkUgKmUsIEVOR0lORV9DSVBIRVJTX1BUUiBmKTsKK2ludCBFTkdJTkVfc2V0X2RpZ2VzdHMoRU5HSU5FICplLCBFTkdJTkVfRElHRVNUU19QVFIgZik7CitpbnQgRU5HSU5FX3NldF9wa2V5X21ldGhzKEVOR0lORSAqZSwgRU5HSU5FX1BLRVlfTUVUSFNfUFRSIGYpOworaW50IEVOR0lORV9zZXRfcGtleV9hc24xX21ldGhzKEVOR0lORSAqZSwgRU5HSU5FX1BLRVlfQVNOMV9NRVRIU19QVFIgZik7CitpbnQgRU5HSU5FX3NldF9mbGFncyhFTkdJTkUgKmUsIGludCBmbGFncyk7CitpbnQgRU5HSU5FX3NldF9jbWRfZGVmbnMoRU5HSU5FICplLCBjb25zdCBFTkdJTkVfQ01EX0RFRk4gKmRlZm5zKTsKKy8qIFRoZXNlIGZ1bmN0aW9ucyBhbGxvdyBjb250cm9sIG92ZXIgYW55IHBlci1zdHJ1Y3R1cmUgRU5HSU5FIGRhdGEuICovCitpbnQgRU5HSU5FX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkJQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworaW50IEVOR0lORV9zZXRfZXhfZGF0YShFTkdJTkUgKmUsIGludCBpZHgsIHZvaWQgKmFyZyk7Cit2b2lkICpFTkdJTkVfZ2V0X2V4X2RhdGEoY29uc3QgRU5HSU5FICplLCBpbnQgaWR4KTsKKworLyogVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgYW55dGhpbmcgdGhhdCBuZWVkcyBpdC4gRWcuIHRoZSBFTkdJTkVfYWRkKCkgZnVuY3Rpb24KKyAqIGF1dG9tYXRpY2FsbHkgZW5zdXJlcyB0aGUgbGlzdCBjbGVhbnVwIGZ1bmN0aW9uIGlzIHJlZ2lzdGVyZWQgdG8gYmUgY2FsbGVkCisgKiBmcm9tIEVOR0lORV9jbGVhbnVwKCkuIFNpbWlsYXJseSwgYWxsIEVOR0lORV9yZWdpc3Rlcl8qKiogZnVuY3Rpb25zIGVuc3VyZQorICogRU5HSU5FX2NsZWFudXAoKSB3aWxsIGNsZWFuIHVwIGFmdGVyIHRoZW0uICovCit2b2lkIEVOR0lORV9jbGVhbnVwKHZvaWQpOworCisvKiBUaGVzZSByZXR1cm4gdmFsdWVzIGZyb20gd2l0aGluIHRoZSBFTkdJTkUgc3RydWN0dXJlLiBUaGVzZSBjYW4gYmUgdXNlZnVsCisgKiB3aXRoIGZ1bmN0aW9uYWwgcmVmZXJlbmNlcyBhcyB3ZWxsIGFzIHN0cnVjdHVyYWwgcmVmZXJlbmNlcyAtIGl0IGRlcGVuZHMKKyAqIHdoaWNoIHlvdSBvYnRhaW5lZC4gVXNpbmcgdGhlIHJlc3VsdCBmb3IgZnVuY3Rpb25hbCBwdXJwb3NlcyBpZiB5b3Ugb25seQorICogb2J0YWluZWQgYSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSBtYXkgYmUgcHJvYmxlbWF0aWMhICovCitjb25zdCBjaGFyICpFTkdJTkVfZ2V0X2lkKGNvbnN0IEVOR0lORSAqZSk7Citjb25zdCBjaGFyICpFTkdJTkVfZ2V0X25hbWUoY29uc3QgRU5HSU5FICplKTsKK2NvbnN0IFJTQV9NRVRIT0QgKkVOR0lORV9nZXRfUlNBKGNvbnN0IEVOR0lORSAqZSk7Citjb25zdCBEU0FfTUVUSE9EICpFTkdJTkVfZ2V0X0RTQShjb25zdCBFTkdJTkUgKmUpOworY29uc3QgRUNESF9NRVRIT0QgKkVOR0lORV9nZXRfRUNESChjb25zdCBFTkdJTkUgKmUpOworY29uc3QgRUNEU0FfTUVUSE9EICpFTkdJTkVfZ2V0X0VDRFNBKGNvbnN0IEVOR0lORSAqZSk7Citjb25zdCBESF9NRVRIT0QgKkVOR0lORV9nZXRfREgoY29uc3QgRU5HSU5FICplKTsKK2NvbnN0IFJBTkRfTUVUSE9EICpFTkdJTkVfZ2V0X1JBTkQoY29uc3QgRU5HSU5FICplKTsKK2NvbnN0IFNUT1JFX01FVEhPRCAqRU5HSU5FX2dldF9TVE9SRShjb25zdCBFTkdJTkUgKmUpOworRU5HSU5FX0dFTl9JTlRfRlVOQ19QVFIgRU5HSU5FX2dldF9kZXN0cm95X2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfR0VOX0lOVF9GVU5DX1BUUiBFTkdJTkVfZ2V0X2luaXRfZnVuY3Rpb24oY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9HRU5fSU5UX0ZVTkNfUFRSIEVOR0lORV9nZXRfZmluaXNoX2Z1bmN0aW9uKGNvbnN0IEVOR0lORSAqZSk7CitFTkdJTkVfQ1RSTF9GVU5DX1BUUiBFTkdJTkVfZ2V0X2N0cmxfZnVuY3Rpb24oY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9MT0FEX0tFWV9QVFIgRU5HSU5FX2dldF9sb2FkX3ByaXZrZXlfZnVuY3Rpb24oY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9MT0FEX0tFWV9QVFIgRU5HSU5FX2dldF9sb2FkX3B1YmtleV9mdW5jdGlvbihjb25zdCBFTkdJTkUgKmUpOworRU5HSU5FX1NTTF9DTElFTlRfQ0VSVF9QVFIgRU5HSU5FX2dldF9zc2xfY2xpZW50X2NlcnRfZnVuY3Rpb24oY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9DSVBIRVJTX1BUUiBFTkdJTkVfZ2V0X2NpcGhlcnMoY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9ESUdFU1RTX1BUUiBFTkdJTkVfZ2V0X2RpZ2VzdHMoY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9QS0VZX01FVEhTX1BUUiBFTkdJTkVfZ2V0X3BrZXlfbWV0aHMoY29uc3QgRU5HSU5FICplKTsKK0VOR0lORV9QS0VZX0FTTjFfTUVUSFNfUFRSIEVOR0lORV9nZXRfcGtleV9hc24xX21ldGhzKGNvbnN0IEVOR0lORSAqZSk7Citjb25zdCBFVlBfQ0lQSEVSICpFTkdJTkVfZ2V0X2NpcGhlcihFTkdJTkUgKmUsIGludCBuaWQpOworY29uc3QgRVZQX01EICpFTkdJTkVfZ2V0X2RpZ2VzdChFTkdJTkUgKmUsIGludCBuaWQpOworY29uc3QgRVZQX1BLRVlfTUVUSE9EICpFTkdJTkVfZ2V0X3BrZXlfbWV0aChFTkdJTkUgKmUsIGludCBuaWQpOworY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKkVOR0lORV9nZXRfcGtleV9hc24xX21ldGgoRU5HSU5FICplLCBpbnQgbmlkKTsKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICpFTkdJTkVfZ2V0X3BrZXlfYXNuMV9tZXRoX3N0cihFTkdJTkUgKmUsCisJCQkJCWNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbik7Citjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRU5HSU5FX3BrZXlfYXNuMV9maW5kX3N0cihFTkdJTkUgKipwZSwKKwkJCQkJY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKTsKK2NvbnN0IEVOR0lORV9DTURfREVGTiAqRU5HSU5FX2dldF9jbWRfZGVmbnMoY29uc3QgRU5HSU5FICplKTsKK2ludCBFTkdJTkVfZ2V0X2ZsYWdzKGNvbnN0IEVOR0lORSAqZSk7CisKKy8qIEZVTkNUSU9OQUwgZnVuY3Rpb25zLiBUaGVzZSBmdW5jdGlvbnMgZGVhbCB3aXRoIEVOR0lORSBzdHJ1Y3R1cmVzCisgKiB0aGF0IGhhdmUgKG9yIHdpbGwpIGJlIGluaXRpYWxpc2VkIGZvciB1c2UuIEJyb2FkbHkgc3BlYWtpbmcsIHRoZQorICogc3RydWN0dXJhbCBmdW5jdGlvbnMgYXJlIHVzZWZ1bCBmb3IgaXRlcmF0aW5nIHRoZSBsaXN0IG9mIGF2YWlsYWJsZQorICogZW5naW5lIHR5cGVzLCBjcmVhdGluZyBuZXcgZW5naW5lIHR5cGVzLCBhbmQgb3RoZXIgImxpc3QiIG9wZXJhdGlvbnMuCisgKiBUaGVzZSBmdW5jdGlvbnMgYWN0dWFsbHkgZGVhbCB3aXRoIEVOR0lORXMgdGhhdCBhcmUgdG8gYmUgdXNlZC4gQXMKKyAqIHN1Y2ggdGhlc2UgZnVuY3Rpb25zIGNhbiBmYWlsIChpZiBhcHBsaWNhYmxlKSB3aGVuIHBhcnRpY3VsYXIKKyAqIGVuZ2luZXMgYXJlIHVuYXZhaWxhYmxlIC0gZWcuIGlmIGEgaGFyZHdhcmUgYWNjZWxlcmF0b3IgaXMgbm90CisgKiBhdHRhY2hlZCBvciBub3QgZnVuY3Rpb25pbmcgY29ycmVjdGx5LiBFYWNoIEVOR0lORSBoYXMgMiByZWZlcmVuY2UKKyAqIGNvdW50czsgc3RydWN0dXJhbCBhbmQgZnVuY3Rpb25hbC4gRXZlcnkgdGltZSBhIGZ1bmN0aW9uYWwgcmVmZXJlbmNlCisgKiBpcyBvYnRhaW5lZCBvciByZWxlYXNlZCwgYSBjb3JyZXNwb25kaW5nIHN0cnVjdHVyYWwgcmVmZXJlbmNlIGlzCisgKiBhdXRvbWF0aWNhbGx5IG9idGFpbmVkIG9yIHJlbGVhc2VkIHRvby4gKi8KKworLyogSW5pdGlhbGlzZSBhIGVuZ2luZSB0eXBlIGZvciB1c2UgKG9yIHVwIGl0cyByZWZlcmVuY2UgY291bnQgaWYgaXQncworICogYWxyZWFkeSBpbiB1c2UpLiBUaGlzIHdpbGwgZmFpbCBpZiB0aGUgZW5naW5lIGlzIG5vdCBjdXJyZW50bHkKKyAqIG9wZXJhdGlvbmFsIGFuZCBjYW5ub3QgaW5pdGlhbGlzZS4gKi8KK2ludCBFTkdJTkVfaW5pdChFTkdJTkUgKmUpOworLyogRnJlZSBhIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIHRvIGEgZW5naW5lIHR5cGUuIFRoaXMgZG9lcyBub3QgcmVxdWlyZQorICogYSBjb3JyZXNwb25kaW5nIGNhbGwgdG8gRU5HSU5FX2ZyZWUgYXMgaXQgYWxzbyByZWxlYXNlcyBhIHN0cnVjdHVyYWwKKyAqIHJlZmVyZW5jZS4gKi8KK2ludCBFTkdJTkVfZmluaXNoKEVOR0lORSAqZSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGhhbmRsZSBrZXlzIHRoYXQgYXJlIHN0b3JlZCBpbiBzb21lIHNlY29uZGFyeQorICogbG9jYXRpb24sIGhhbmRsZWQgYnkgdGhlIGVuZ2luZS4gIFRoZSBzdG9yYWdlIG1heSBiZSBvbiBhIGNhcmQgb3IKKyAqIHdoYXRldmVyLiAqLworRVZQX1BLRVkgKkVOR0lORV9sb2FkX3ByaXZhdGVfa2V5KEVOR0lORSAqZSwgY29uc3QgY2hhciAqa2V5X2lkLAorCVVJX01FVEhPRCAqdWlfbWV0aG9kLCB2b2lkICpjYWxsYmFja19kYXRhKTsKK0VWUF9QS0VZICpFTkdJTkVfbG9hZF9wdWJsaWNfa2V5KEVOR0lORSAqZSwgY29uc3QgY2hhciAqa2V5X2lkLAorCVVJX01FVEhPRCAqdWlfbWV0aG9kLCB2b2lkICpjYWxsYmFja19kYXRhKTsKK2ludCBFTkdJTkVfbG9hZF9zc2xfY2xpZW50X2NlcnQoRU5HSU5FICplLCBTU0wgKnMsCisJU1RBQ0tfT0YoWDUwOV9OQU1FKSAqY2FfZG4sIFg1MDkgKipwY2VydCwgRVZQX1BLRVkgKipwcGtleSwKKwlTVEFDS19PRihYNTA5KSAqKnBvdGhlciwKKwlVSV9NRVRIT0QgKnVpX21ldGhvZCwgdm9pZCAqY2FsbGJhY2tfZGF0YSk7CisKKy8qIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgZm9yIHRoZSBjdXJyZW50IEVOR0lORSBzdHJ1Y3R1cmUgdGhhdAorICogaXMgKGJ5IGRlZmF1bHQpIHBlcmZvcm1pbmcgYW55IFJTQSBvcGVyYXRpb25zLiBUaGUgdmFsdWUgcmV0dXJuZWQKKyAqIGlzIGFuIGluY3JlbWVudGVkIHJlZmVyZW5jZSwgc28gaXQgc2hvdWxkIGJlIGZyZWUnZCAoRU5HSU5FX2ZpbmlzaCkKKyAqIGJlZm9yZSBpdCBpcyBkaXNjYXJkZWQuICovCitFTkdJTkUgKkVOR0lORV9nZXRfZGVmYXVsdF9SU0Eodm9pZCk7CisvKiBTYW1lIGZvciB0aGUgb3RoZXIgIm1ldGhvZHMiICovCitFTkdJTkUgKkVOR0lORV9nZXRfZGVmYXVsdF9EU0Eodm9pZCk7CitFTkdJTkUgKkVOR0lORV9nZXRfZGVmYXVsdF9FQ0RIKHZvaWQpOworRU5HSU5FICpFTkdJTkVfZ2V0X2RlZmF1bHRfRUNEU0Eodm9pZCk7CitFTkdJTkUgKkVOR0lORV9nZXRfZGVmYXVsdF9ESCh2b2lkKTsKK0VOR0lORSAqRU5HSU5FX2dldF9kZWZhdWx0X1JBTkQodm9pZCk7CisvKiBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gZ2V0IGEgZnVuY3Rpb25hbCByZWZlcmVuY2UgdG8gcGVyZm9ybQorICogY2lwaGVyaW5nIG9yIGRpZ2VzdGluZyBjb3JyZXNwb25kaW5nIHRvICJuaWQiLiAqLworRU5HSU5FICpFTkdJTkVfZ2V0X2NpcGhlcl9lbmdpbmUoaW50IG5pZCk7CitFTkdJTkUgKkVOR0lORV9nZXRfZGlnZXN0X2VuZ2luZShpbnQgbmlkKTsKK0VOR0lORSAqRU5HSU5FX2dldF9wa2V5X21ldGhfZW5naW5lKGludCBuaWQpOworRU5HSU5FICpFTkdJTkVfZ2V0X3BrZXlfYXNuMV9tZXRoX2VuZ2luZShpbnQgbmlkKTsKKworLyogVGhpcyBzZXRzIGEgbmV3IGRlZmF1bHQgRU5HSU5FIHN0cnVjdHVyZSBmb3IgcGVyZm9ybWluZyBSU0EKKyAqIG9wZXJhdGlvbnMuIElmIHRoZSByZXN1bHQgaXMgbm9uLXplcm8gKHN1Y2Nlc3MpIHRoZW4gdGhlIEVOR0lORQorICogc3RydWN0dXJlIHdpbGwgaGF2ZSBoYWQgaXRzIHJlZmVyZW5jZSBjb3VudCB1cCdkIHNvIHRoZSBjYWxsZXIKKyAqIHNob3VsZCBzdGlsbCBmcmVlIHRoZWlyIG93biByZWZlcmVuY2UgJ2UnLiAqLworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9SU0EoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfc3RyaW5nKEVOR0lORSAqZSwgY29uc3QgY2hhciAqZGVmX2xpc3QpOworLyogU2FtZSBmb3IgdGhlIG90aGVyICJtZXRob2RzIiAqLworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9EU0EoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfRUNESChFTkdJTkUgKmUpOworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9FQ0RTQShFTkdJTkUgKmUpOworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9ESChFTkdJTkUgKmUpOworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9SQU5EKEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX3NldF9kZWZhdWx0X2NpcGhlcnMoRU5HSU5FICplKTsKK2ludCBFTkdJTkVfc2V0X2RlZmF1bHRfZGlnZXN0cyhFTkdJTkUgKmUpOworaW50IEVOR0lORV9zZXRfZGVmYXVsdF9wa2V5X21ldGhzKEVOR0lORSAqZSk7CitpbnQgRU5HSU5FX3NldF9kZWZhdWx0X3BrZXlfYXNuMV9tZXRocyhFTkdJTkUgKmUpOworCisvKiBUaGUgY29tYmluYXRpb24gInNldCIgLSB0aGUgZmxhZ3MgYXJlIGJpdHdpc2UgIk9SImQgZnJvbSB0aGUKKyAqIEVOR0lORV9NRVRIT0RfKioqIGRlZmluZXMgYWJvdmUuIEFzIHdpdGggdGhlICJFTkdJTkVfcmVnaXN0ZXJfY29tcGxldGUoKSIKKyAqIGZ1bmN0aW9uLCB0aGlzIGZ1bmN0aW9uIGNhbiByZXN1bHQgaW4gdW5uZWNlc3Nhcnkgc3RhdGljIGxpbmthZ2UuIElmIHlvdXIKKyAqIGFwcGxpY2F0aW9uIHJlcXVpcmVzIG9ubHkgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSwgY29uc2lkZXIgdXNpbmcgbW9yZQorICogc2VsZWN0aXZlIGZ1bmN0aW9ucy4gKi8KK2ludCBFTkdJTkVfc2V0X2RlZmF1bHQoRU5HSU5FICplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCit2b2lkIEVOR0lORV9hZGRfY29uZl9tb2R1bGUodm9pZCk7CisKKy8qIERlcHJlY2F0ZWQgZnVuY3Rpb25zIC4uLiAqLworLyogaW50IEVOR0lORV9jbGVhcl9kZWZhdWx0cyh2b2lkKTsgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRFlOQU1JQyBFTkdJTkUgU1VQUE9SVCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBCaW5hcnkvYmVoYXZpb3VyIGNvbXBhdGliaWxpdHkgbGV2ZWxzICovCisjZGVmaW5lIE9TU0xfRFlOQU1JQ19WRVJTSU9OCQkodW5zaWduZWQgbG9uZykweDAwMDIwMDAwCisvKiBCaW5hcnkgdmVyc2lvbnMgb2xkZXIgdGhhbiB0aGlzIGFyZSB0b28gb2xkIGZvciB1cyAod2hldGhlciB3ZSdyZSBhIGxvYWRlciBvcgorICogYSBsb2FkZWUpICovCisjZGVmaW5lIE9TU0xfRFlOQU1JQ19PTERFU1QJCSh1bnNpZ25lZCBsb25nKTB4MDAwMjAwMDAKKworLyogV2hlbiBjb21waWxpbmcgYW4gRU5HSU5FIGVudGlyZWx5IGFzIGFuIGV4dGVybmFsIHNoYXJlZCBsaWJyYXJ5LCBsb2FkYWJsZSBieQorICogdGhlICJkeW5hbWljIiBFTkdJTkUsIHRoZXNlIHR5cGVzIGFyZSBuZWVkZWQuIFRoZSAnZHluYW1pY19mbnMnIHN0cnVjdHVyZQorICogdHlwZSBwcm92aWRlcyB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbidzIChvciBsaWJyYXJ5J3MpIGVycm9yIGZ1bmN0aW9uYWxpdHkKKyAqIGFuZCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbiBwb2ludGVycyB0byB0aGUgbG9hZGVkIGxpYnJhcnkuIFRoZXNlIHNob3VsZAorICogYmUgdXNlZC9zZXQgaW4gdGhlIGxvYWRlZCBsaWJyYXJ5IGNvZGUgc28gdGhhdCB0aGUgbG9hZGluZyBhcHBsaWNhdGlvbidzCisgKiAnc3RhdGUnIHdpbGwgYmUgdXNlZC9jaGFuZ2VkIGluIGFsbCBvcGVyYXRpb25zLiBUaGUgJ3N0YXRpY19zdGF0ZScgcG9pbnRlcgorICogYWxsb3dzIHRoZSBsb2FkZWQgbGlicmFyeSB0byBrbm93IGlmIGl0IHNoYXJlcyB0aGUgc2FtZSBzdGF0aWMgZGF0YSBhcyB0aGUKKyAqIGNhbGxpbmcgYXBwbGljYXRpb24gKG9yIGxpYnJhcnkpLCBhbmQgdGh1cyB3aGV0aGVyIHRoZXNlIGNhbGxiYWNrcyBuZWVkIHRvIGJlCisgKiBzZXQgb3Igbm90LiAqLwordHlwZWRlZiB2b2lkICooKmR5bl9NRU1fbWFsbG9jX2NiKShzaXplX3QpOwordHlwZWRlZiB2b2lkICooKmR5bl9NRU1fcmVhbGxvY19jYikodm9pZCAqLCBzaXplX3QpOwordHlwZWRlZiB2b2lkICgqZHluX01FTV9mcmVlX2NiKSh2b2lkICopOwordHlwZWRlZiBzdHJ1Y3Qgc3RfZHluYW1pY19NRU1fZm5zIHsKKwlkeW5fTUVNX21hbGxvY19jYgkJCW1hbGxvY19jYjsKKwlkeW5fTUVNX3JlYWxsb2NfY2IJCQlyZWFsbG9jX2NiOworCWR5bl9NRU1fZnJlZV9jYgkJCQlmcmVlX2NiOworCX0gZHluYW1pY19NRU1fZm5zOworLyogRklYTUU6IFBlcmhhcHMgdGhlIG1lbW9yeSBhbmQgbG9ja2luZyBjb2RlIChjcnlwdG8uaCkgc2hvdWxkIGRlY2xhcmUgYW5kIHVzZQorICogdGhlc2UgdHlwZXMgc28gd2UgKGFuZCBhbnkgb3RoZXIgZGVwZW5kYW50IGNvZGUpIGNhbiBzaW1wbGlmeSBhIGJpdD8/ICovCit0eXBlZGVmIHZvaWQgKCpkeW5fbG9ja19sb2NraW5nX2NiKShpbnQsaW50LGNvbnN0IGNoYXIgKixpbnQpOwordHlwZWRlZiBpbnQgKCpkeW5fbG9ja19hZGRfbG9ja19jYikoaW50KixpbnQsaW50LGNvbnN0IGNoYXIgKixpbnQpOwordHlwZWRlZiBzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKigqZHluX2R5bmxvY2tfY3JlYXRlX2NiKSgKKwkJCQkJCWNvbnN0IGNoYXIgKixpbnQpOwordHlwZWRlZiB2b2lkICgqZHluX2R5bmxvY2tfbG9ja19jYikoaW50LHN0cnVjdCBDUllQVE9fZHlubG9ja192YWx1ZSAqLAorCQkJCQkJY29uc3QgY2hhciAqLGludCk7Cit0eXBlZGVmIHZvaWQgKCpkeW5fZHlubG9ja19kZXN0cm95X2NiKShzdHJ1Y3QgQ1JZUFRPX2R5bmxvY2tfdmFsdWUgKiwKKwkJCQkJCWNvbnN0IGNoYXIgKixpbnQpOwordHlwZWRlZiBzdHJ1Y3Qgc3RfZHluYW1pY19MT0NLX2ZucyB7CisJZHluX2xvY2tfbG9ja2luZ19jYgkJCWxvY2tfbG9ja2luZ19jYjsKKwlkeW5fbG9ja19hZGRfbG9ja19jYgkJCWxvY2tfYWRkX2xvY2tfY2I7CisJZHluX2R5bmxvY2tfY3JlYXRlX2NiCQkJZHlubG9ja19jcmVhdGVfY2I7CisJZHluX2R5bmxvY2tfbG9ja19jYgkJCWR5bmxvY2tfbG9ja19jYjsKKwlkeW5fZHlubG9ja19kZXN0cm95X2NiCQkJZHlubG9ja19kZXN0cm95X2NiOworCX0gZHluYW1pY19MT0NLX2ZuczsKKy8qIFRoZSB0b3AtbGV2ZWwgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzdF9keW5hbWljX2ZucyB7CisJdm9pZCAJCQkJCSpzdGF0aWNfc3RhdGU7CisJY29uc3QgRVJSX0ZOUwkJCQkqZXJyX2ZuczsKKwljb25zdCBDUllQVE9fRVhfREFUQV9JTVBMCQkqZXhfZGF0YV9mbnM7CisJZHluYW1pY19NRU1fZm5zCQkJCW1lbV9mbnM7CisJZHluYW1pY19MT0NLX2ZucwkJCWxvY2tfZm5zOworCX0gZHluYW1pY19mbnM7CisKKy8qIFRoZSB2ZXJzaW9uIGNoZWNraW5nIGZ1bmN0aW9uIHNob3VsZCBiZSBvZiB0aGlzIHByb3RvdHlwZS4gTkI6IFRoZQorICogb3NzbF92ZXJzaW9uIHZhbHVlIHBhc3NlZCBpbiBpcyB0aGUgT1NTTF9EWU5BTUlDX1ZFUlNJT04gb2YgdGhlIGxvYWRpbmcgY29kZS4KKyAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvLCBpdCBpbmRpY2F0ZXMgYSAocG90ZW50aWFsKSB2ZXJzaW9uCisgKiBpbmNvbXBhdGliaWxpdHkgYW5kIHRoZSBsb2FkZWQgbGlicmFyeSBkb2Vzbid0IGJlbGlldmUgaXQgY2FuIHByb2NlZWQuCisgKiBPdGhlcndpc2UsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgKGxhdGVzdCkgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlCisgKiBsb2FkaW5nIGxpYnJhcnkuIFRoZSBsb2FkZXIgbWF5IHN0aWxsIGRlY2lkZSB0aGF0IHRoZSBsb2FkZWQgY29kZSdzIHZlcnNpb24KKyAqIGlzIHVuc2F0aXNmYWN0b3J5IGFuZCBjb3VsZCB2ZXRvIHRoZSBsb2FkLiBUaGUgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8KKyAqIGJlIGltcGxlbWVudGVkIHdpdGggdGhlIHN5bWJvbCBuYW1lICJ2X2NoZWNrIiwgYW5kIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICogY2FuIGJlIGZ1bGx5IGluc3RhbnRpYXRlZCB3aXRoIElNUExFTUVOVF9EWU5BTUlDX0NIRUNLX0ZOKCkuICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgKCpkeW5hbWljX3ZfY2hlY2tfZm4pKHVuc2lnbmVkIGxvbmcgb3NzbF92ZXJzaW9uKTsKKyNkZWZpbmUgSU1QTEVNRU5UX0RZTkFNSUNfQ0hFQ0tfRk4oKSBcCisJT1BFTlNTTF9FWFBPUlQgdW5zaWduZWQgbG9uZyB2X2NoZWNrKHVuc2lnbmVkIGxvbmcgdikgeyBcCisJCWlmKHYgPj0gT1NTTF9EWU5BTUlDX09MREVTVCkgcmV0dXJuIE9TU0xfRFlOQU1JQ19WRVJTSU9OOyBcCisJCXJldHVybiAwOyB9CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBFTkdJTkUgc3RydWN0dXJlIHRvIGluaXRpYWxpc2Ugd2l0aCBpdHMgb3duCisgKiBmdW5jdGlvbiBhbmQgY29tbWFuZCBzZXR0aW5ncy4gSXQgc2hvdWxkIG5vdCBhZGp1c3QgdGhlIHN0cnVjdHVyYWwgb3IKKyAqIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGNvdW50cy4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8sIChhKSB0aGUgbG9hZCB3aWxsCisgKiBiZSBhYm9ydGVkLCAoYikgdGhlIHByZXZpb3VzIEVOR0lORSBzdGF0ZSB3aWxsIGJlIG1lbWNweSdkIGJhY2sgb250byB0aGUKKyAqIHN0cnVjdHVyZSwgYW5kIChjKSB0aGUgc2hhcmVkIGxpYnJhcnkgd2lsbCBiZSB1bmxvYWRlZC4gU28gaW1wbGVtZW50YXRpb25zCisgKiBzaG91bGQgZG8gdGhlaXIgb3duIGludGVybmFsIGNsZWFudXAgaW4gZmFpbHVyZSBjaXJjdW1zdGFuY2VzIG90aGVyd2lzZSB0aGV5CisgKiBjb3VsZCBsZWFrLiBUaGUgJ2lkJyBwYXJhbWV0ZXIsIGlmIG5vbi1OVUxMLCByZXByZXNlbnRzIHRoZSBFTkdJTkUgaWQgdGhhdAorICogdGhlIGxvYWRlciBpcyBsb29raW5nIGZvci4gSWYgdGhpcyBpcyBOVUxMLCB0aGUgc2hhcmVkIGxpYnJhcnkgY2FuIGNob29zZSB0bworICogcmV0dXJuIGZhaWx1cmUgb3IgdG8gaW5pdGlhbGlzZSBhICdkZWZhdWx0JyBFTkdJTkUuIElmIG5vbi1OVUxMLCB0aGUgc2hhcmVkCisgKiBsaWJyYXJ5IG11c3QgaW5pdGlhbGlzZSBvbmx5IGFuIEVOR0lORSBtYXRjaGluZyB0aGUgcGFzc2VkICdpZCcuIFRoZSBmdW5jdGlvbgorICogaXMgZXhwZWN0ZWQgdG8gYmUgaW1wbGVtZW50ZWQgd2l0aCB0aGUgc3ltYm9sIG5hbWUgImJpbmRfZW5naW5lIi4gQSBzdGFuZGFyZAorICogaW1wbGVtZW50YXRpb24gY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIElNUExFTUVOVF9EWU5BTUlDX0JJTkRfRk4oZm4pIHdoZXJlCisgKiB0aGUgcGFyYW1ldGVyICdmbicgaXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHBvcHVsYXRlcyB0aGUgRU5HSU5FIHN0cnVjdHVyZQorICogYW5kIHJldHVybnMgYW4gaW50IHZhbHVlICh6ZXJvIGZvciBmYWlsdXJlKS4gJ2ZuJyBzaG91bGQgaGF2ZSBwcm90b3R5cGU7CisgKiAgICBbc3RhdGljXSBpbnQgZm4oRU5HSU5FICplLCBjb25zdCBjaGFyICppZCk7ICovCit0eXBlZGVmIGludCAoKmR5bmFtaWNfYmluZF9lbmdpbmUpKEVOR0lORSAqZSwgY29uc3QgY2hhciAqaWQsCisJCQkJY29uc3QgZHluYW1pY19mbnMgKmZucyk7CisjZGVmaW5lIElNUExFTUVOVF9EWU5BTUlDX0JJTkRfRk4oZm4pIFwKKwlPUEVOU1NMX0VYUE9SVCBcCisJaW50IGJpbmRfZW5naW5lKEVOR0lORSAqZSwgY29uc3QgY2hhciAqaWQsIGNvbnN0IGR5bmFtaWNfZm5zICpmbnMpIHsgXAorCQlpZihFTkdJTkVfZ2V0X3N0YXRpY19zdGF0ZSgpID09IGZucy0+c3RhdGljX3N0YXRlKSBnb3RvIHNraXBfY2JzOyBcCisJCWlmKCFDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMoZm5zLT5tZW1fZm5zLm1hbGxvY19jYiwgXAorCQkJZm5zLT5tZW1fZm5zLnJlYWxsb2NfY2IsIGZucy0+bWVtX2Zucy5mcmVlX2NiKSkgXAorCQkJcmV0dXJuIDA7IFwKKwkJQ1JZUFRPX3NldF9sb2NraW5nX2NhbGxiYWNrKGZucy0+bG9ja19mbnMubG9ja19sb2NraW5nX2NiKTsgXAorCQlDUllQVE9fc2V0X2FkZF9sb2NrX2NhbGxiYWNrKGZucy0+bG9ja19mbnMubG9ja19hZGRfbG9ja19jYik7IFwKKwkJQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayhmbnMtPmxvY2tfZm5zLmR5bmxvY2tfY3JlYXRlX2NiKTsgXAorCQlDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjayhmbnMtPmxvY2tfZm5zLmR5bmxvY2tfbG9ja19jYik7IFwKKwkJQ1JZUFRPX3NldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2soZm5zLT5sb2NrX2Zucy5keW5sb2NrX2Rlc3Ryb3lfY2IpOyBcCisJCWlmKCFDUllQVE9fc2V0X2V4X2RhdGFfaW1wbGVtZW50YXRpb24oZm5zLT5leF9kYXRhX2ZucykpIFwKKwkJCXJldHVybiAwOyBcCisJCWlmKCFFUlJfc2V0X2ltcGxlbWVudGF0aW9uKGZucy0+ZXJyX2ZucykpIHJldHVybiAwOyBcCisJc2tpcF9jYnM6IFwKKwkJaWYoIWZuKGUsaWQpKSByZXR1cm4gMDsgXAorCQlyZXR1cm4gMTsgfQorCisvKiBJZiB0aGUgbG9hZGluZyBhcHBsaWNhdGlvbiAob3IgbGlicmFyeSkgYW5kIHRoZSBsb2FkZWQgRU5HSU5FIGxpYnJhcnkgc2hhcmUKKyAqIHRoZSBzYW1lIHN0YXRpYyBkYXRhIChlZy4gdGhleSdyZSBib3RoIGR5bmFtaWNhbGx5IGxpbmtlZCB0byB0aGUgc2FtZQorICogbGliY3J5cHRvLnNvKSB3ZSBuZWVkIGEgd2F5IHRvIGF2b2lkIHRyeWluZyB0byBzZXQgc3lzdGVtIGNhbGxiYWNrcyAtIHRoaXMKKyAqIHdvdWxkIGZhaWwsIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uIHRoYXQgaXQncyB1bm5lY2Vzc2FyeSB0byB0cnkuIElmIHRoZQorICogbG9hZGVkIEVOR0lORSBoYXMgKG9yIGdldHMgZnJvbSB0aHJvdWdoIHRoZSBsb2FkZXIpIGl0cyBvd24gY29weSBvZiB0aGUKKyAqIGxpYmNyeXB0byBzdGF0aWMgZGF0YSwgd2Ugd2lsbCBuZWVkIHRvIHNldCB0aGUgY2FsbGJhY2tzLiBUaGUgZWFzaWVzdCB3YXkgdG8KKyAqIGRldGVjdCB0aGlzIGlzIHRvIGhhdmUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwb2ludGVyIHRvIHNvbWUgc3RhdGljIGRhdGEKKyAqIGFuZCBsZXQgdGhlIGxvYWRpbmcgYXBwbGljYXRpb24gYW5kIGxvYWRlZCBFTkdJTkUgY29tcGFyZSB0aGVpciByZXNwZWN0aXZlCisgKiB2YWx1ZXMuICovCit2b2lkICpFTkdJTkVfZ2V0X3N0YXRpY19zdGF0ZSh2b2lkKTsKKworI2lmIGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoSEFWRV9DUllQVE9ERVYpCit2b2lkIEVOR0lORV9zZXR1cF9ic2RfY3J5cHRvZGV2KHZvaWQpOworI2VuZGlmCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfRU5HSU5FX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRU5HSU5FIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIEVOR0lORV9GX0RZTkFNSUNfQ1RSTAkJCQkgMTgwCisjZGVmaW5lIEVOR0lORV9GX0RZTkFNSUNfR0VUX0RBVEFfQ1RYCQkJIDE4MQorI2RlZmluZSBFTkdJTkVfRl9EWU5BTUlDX0xPQUQJCQkJIDE4MgorI2RlZmluZSBFTkdJTkVfRl9EWU5BTUlDX1NFVF9EQVRBX0NUWAkJCSAxODMKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0FERAkJCQkgMTA1CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9CWV9JRAkJCQkgMTA2CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9DTURfSVNfRVhFQ1VUQUJMRQkJIDE3MAorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfQ1RSTAkJCQkgMTQyCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9DVFJMX0NNRAkJCSAxNzgKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0NUUkxfQ01EX1NUUklORwkJCSAxNzEKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0ZJTklTSAkJCQkgMTA3CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9GUkVFX1VUSUwJCQkgMTA4CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9HRVRfQ0lQSEVSCQkJIDE4NQorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfR0VUX0RFRkFVTFRfVFlQRQkJIDE3NworI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfR0VUX0RJR0VTVAkJCSAxODYKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0dFVF9ORVhUCQkJIDExNQorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfR0VUX1BLRVlfQVNOMV9NRVRICQkgMTkzCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9HRVRfUEtFWV9NRVRICQkJIDE5MgorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfR0VUX1BSRVYJCQkgMTE2CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9JTklUCQkJCSAxMTkKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX0xJU1RfQURECQkJIDEyMAorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfTElTVF9SRU1PVkUJCQkgMTIxCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9MT0FEX1BSSVZBVEVfS0VZCQkgMTUwCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9MT0FEX1BVQkxJQ19LRVkJCQkgMTUxCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9MT0FEX1NTTF9DTElFTlRfQ0VSVAkJIDE5NAorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfTkVXCQkJCSAxMjIKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX1JFTU9WRQkJCQkgMTIzCisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9TRVRfREVGQVVMVF9TVFJJTkcJCSAxODkKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX1NFVF9ERUZBVUxUX1RZUEUJCSAxMjYKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX1NFVF9JRAkJCQkgMTI5CisjZGVmaW5lIEVOR0lORV9GX0VOR0lORV9TRVRfTkFNRQkJCSAxMzAKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX1RBQkxFX1JFR0lTVEVSCQkJIDE4NAorI2RlZmluZSBFTkdJTkVfRl9FTkdJTkVfVU5MT0FEX0tFWQkJCSAxNTIKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX1VOTE9DS0VEX0ZJTklTSAkJCSAxOTEKKyNkZWZpbmUgRU5HSU5FX0ZfRU5HSU5FX1VQX1JFRgkJCQkgMTkwCisjZGVmaW5lIEVOR0lORV9GX0lOVF9DVFJMX0hFTFBFUgkJCSAxNzIKKyNkZWZpbmUgRU5HSU5FX0ZfSU5UX0VOR0lORV9DT05GSUdVUkUJCQkgMTg4CisjZGVmaW5lIEVOR0lORV9GX0lOVF9FTkdJTkVfTU9EVUxFX0lOSVQJCQkgMTg3CisjZGVmaW5lIEVOR0lORV9GX0xPR19NRVNTQUdFCQkJCSAxNDEKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBFTkdJTkVfUl9BTFJFQURZX0xPQURFRAkJCQkgMTAwCisjZGVmaW5lIEVOR0lORV9SX0FSR1VNRU5UX0lTX05PVF9BX05VTUJFUgkJIDEzMworI2RlZmluZSBFTkdJTkVfUl9DTURfTk9UX0VYRUNVVEFCTEUJCQkgMTM0CisjZGVmaW5lIEVOR0lORV9SX0NPTU1BTkRfVEFLRVNfSU5QVVQJCQkgMTM1CisjZGVmaW5lIEVOR0lORV9SX0NPTU1BTkRfVEFLRVNfTk9fSU5QVVQJCQkgMTM2CisjZGVmaW5lIEVOR0lORV9SX0NPTkZMSUNUSU5HX0VOR0lORV9JRAkJCSAxMDMKKyNkZWZpbmUgRU5HSU5FX1JfQ1RSTF9DT01NQU5EX05PVF9JTVBMRU1FTlRFRAkJIDExOQorI2RlZmluZSBFTkdJTkVfUl9ESF9OT1RfSU1QTEVNRU5URUQJCQkgMTM5CisjZGVmaW5lIEVOR0lORV9SX0RTQV9OT1RfSU1QTEVNRU5URUQJCQkgMTQwCisjZGVmaW5lIEVOR0lORV9SX0RTT19GQUlMVVJFCQkJCSAxMDQKKyNkZWZpbmUgRU5HSU5FX1JfRFNPX05PVF9GT1VORAkJCQkgMTMyCisjZGVmaW5lIEVOR0lORV9SX0VOR0lORVNfU0VDVElPTl9FUlJPUgkJCSAxNDgKKyNkZWZpbmUgRU5HSU5FX1JfRU5HSU5FX0NPTkZJR1VSQVRJT05fRVJST1IJCSAxMDIKKyNkZWZpbmUgRU5HSU5FX1JfRU5HSU5FX0lTX05PVF9JTl9MSVNUCQkJIDEwNQorI2RlZmluZSBFTkdJTkVfUl9FTkdJTkVfU0VDVElPTl9FUlJPUgkJCSAxNDkKKyNkZWZpbmUgRU5HSU5FX1JfRkFJTEVEX0xPQURJTkdfUFJJVkFURV9LRVkJCSAxMjgKKyNkZWZpbmUgRU5HSU5FX1JfRkFJTEVEX0xPQURJTkdfUFVCTElDX0tFWQkJIDEyOQorI2RlZmluZSBFTkdJTkVfUl9GSU5JU0hfRkFJTEVECQkJCSAxMDYKKyNkZWZpbmUgRU5HSU5FX1JfR0VUX0hBTkRMRV9GQUlMRUQJCQkgMTA3CisjZGVmaW5lIEVOR0lORV9SX0lEX09SX05BTUVfTUlTU0lORwkJCSAxMDgKKyNkZWZpbmUgRU5HSU5FX1JfSU5JVF9GQUlMRUQJCQkJIDEwOQorI2RlZmluZSBFTkdJTkVfUl9JTlRFUk5BTF9MSVNUX0VSUk9SCQkJIDExMAorI2RlZmluZSBFTkdJTkVfUl9JTlZBTElEX0FSR1VNRU5UCQkJIDE0MworI2RlZmluZSBFTkdJTkVfUl9JTlZBTElEX0NNRF9OQU1FCQkJIDEzNworI2RlZmluZSBFTkdJTkVfUl9JTlZBTElEX0NNRF9OVU1CRVIJCQkgMTM4CisjZGVmaW5lIEVOR0lORV9SX0lOVkFMSURfSU5JVF9WQUxVRQkJCSAxNTEKKyNkZWZpbmUgRU5HSU5FX1JfSU5WQUxJRF9TVFJJTkcJCQkJIDE1MAorI2RlZmluZSBFTkdJTkVfUl9OT1RfSU5JVElBTElTRUQJCQkgMTE3CisjZGVmaW5lIEVOR0lORV9SX05PVF9MT0FERUQJCQkJIDExMgorI2RlZmluZSBFTkdJTkVfUl9OT19DT05UUk9MX0ZVTkNUSU9OCQkJIDEyMAorI2RlZmluZSBFTkdJTkVfUl9OT19JTkRFWAkJCQkgMTQ0CisjZGVmaW5lIEVOR0lORV9SX05PX0xPQURfRlVOQ1RJT04JCQkgMTI1CisjZGVmaW5lIEVOR0lORV9SX05PX1JFRkVSRU5DRQkJCQkgMTMwCisjZGVmaW5lIEVOR0lORV9SX05PX1NVQ0hfRU5HSU5FCQkJCSAxMTYKKyNkZWZpbmUgRU5HSU5FX1JfTk9fVU5MT0FEX0ZVTkNUSU9OCQkJIDEyNgorI2RlZmluZSBFTkdJTkVfUl9QUk9WSURFX1BBUkFNRVRFUlMJCQkgMTEzCisjZGVmaW5lIEVOR0lORV9SX1JTQV9OT1RfSU1QTEVNRU5URUQJCQkgMTQxCisjZGVmaW5lIEVOR0lORV9SX1VOSU1QTEVNRU5URURfQ0lQSEVSCQkJIDE0NgorI2RlZmluZSBFTkdJTkVfUl9VTklNUExFTUVOVEVEX0RJR0VTVAkJCSAxNDcKKyNkZWZpbmUgRU5HSU5FX1JfVU5JTVBMRU1FTlRFRF9QVUJMSUNfS0VZX01FVEhPRAkgMTAxCisjZGVmaW5lIEVOR0lORV9SX1ZFUlNJT05fSU5DT01QQVRJQklMSVRZCQkgMTQ1CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZXJyLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvZXJyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmOGMxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9lcnIuaApAQCAtMCwwICsxLDM4NSBAQAorLyogY3J5cHRvL2Vyci9lcnIuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX0VSUl9ICisjZGVmaW5lIEhFQURFUl9FUlJfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19MSEFTSAorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNlbmRpZgorCisjaWZkZWYJX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKyNkZWZpbmUgRVJSX1BVVF9lcnJvcihhLGIsYyxkLGUpCUVSUl9wdXRfZXJyb3IoYSxiLGMsZCxlKQorI2Vsc2UKKyNkZWZpbmUgRVJSX1BVVF9lcnJvcihhLGIsYyxkLGUpCUVSUl9wdXRfZXJyb3IoYSxiLGMsTlVMTCwwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjZGVmaW5lIEVSUl9UWFRfTUFMTE9DRUQJMHgwMQorI2RlZmluZSBFUlJfVFhUX1NUUklORwkJMHgwMgorCisjZGVmaW5lIEVSUl9GTEFHX01BUksJCTB4MDEKKworI2RlZmluZSBFUlJfTlVNX0VSUk9SUwkxNgordHlwZWRlZiBzdHJ1Y3QgZXJyX3N0YXRlX3N0CisJeworCUNSWVBUT19USFJFQURJRCB0aWQ7CisJaW50IGVycl9mbGFnc1tFUlJfTlVNX0VSUk9SU107CisJdW5zaWduZWQgbG9uZyBlcnJfYnVmZmVyW0VSUl9OVU1fRVJST1JTXTsKKwljaGFyICplcnJfZGF0YVtFUlJfTlVNX0VSUk9SU107CisJaW50IGVycl9kYXRhX2ZsYWdzW0VSUl9OVU1fRVJST1JTXTsKKwljb25zdCBjaGFyICplcnJfZmlsZVtFUlJfTlVNX0VSUk9SU107CisJaW50IGVycl9saW5lW0VSUl9OVU1fRVJST1JTXTsKKwlpbnQgdG9wLGJvdHRvbTsKKwl9IEVSUl9TVEFURTsKKworLyogbGlicmFyeSAqLworI2RlZmluZSBFUlJfTElCX05PTkUJCTEKKyNkZWZpbmUgRVJSX0xJQl9TWVMJCTIKKyNkZWZpbmUgRVJSX0xJQl9CTgkJMworI2RlZmluZSBFUlJfTElCX1JTQQkJNAorI2RlZmluZSBFUlJfTElCX0RICQk1CisjZGVmaW5lIEVSUl9MSUJfRVZQCQk2CisjZGVmaW5lIEVSUl9MSUJfQlVGCQk3CisjZGVmaW5lIEVSUl9MSUJfT0JKCQk4CisjZGVmaW5lIEVSUl9MSUJfUEVNCQk5CisjZGVmaW5lIEVSUl9MSUJfRFNBCQkxMAorI2RlZmluZSBFUlJfTElCX1g1MDkJCTExCisvKiAjZGVmaW5lIEVSUl9MSUJfTUVUSCAgICAgICAgIDEyICovCisjZGVmaW5lIEVSUl9MSUJfQVNOMQkJMTMKKyNkZWZpbmUgRVJSX0xJQl9DT05GCQkxNAorI2RlZmluZSBFUlJfTElCX0NSWVBUTwkJMTUKKyNkZWZpbmUgRVJSX0xJQl9FQwkJMTYKKyNkZWZpbmUgRVJSX0xJQl9TU0wJCTIwCisvKiAjZGVmaW5lIEVSUl9MSUJfU1NMMjMgICAgICAgIDIxICovCisvKiAjZGVmaW5lIEVSUl9MSUJfU1NMMiAgICAgICAgIDIyICovCisvKiAjZGVmaW5lIEVSUl9MSUJfU1NMMyAgICAgICAgIDIzICovCisvKiAjZGVmaW5lIEVSUl9MSUJfUlNBUkVGICAgICAgIDMwICovCisvKiAjZGVmaW5lIEVSUl9MSUJfUFJPWFkgICAgICAgIDMxICovCisjZGVmaW5lIEVSUl9MSUJfQklPCQkzMgorI2RlZmluZSBFUlJfTElCX1BLQ1M3CQkzMworI2RlZmluZSBFUlJfTElCX1g1MDlWMwkJMzQKKyNkZWZpbmUgRVJSX0xJQl9QS0NTMTIJCTM1CisjZGVmaW5lIEVSUl9MSUJfUkFORAkJMzYKKyNkZWZpbmUgRVJSX0xJQl9EU08JCTM3CisjZGVmaW5lIEVSUl9MSUJfRU5HSU5FCQkzOAorI2RlZmluZSBFUlJfTElCX09DU1AgICAgICAgICAgICAzOQorI2RlZmluZSBFUlJfTElCX1VJICAgICAgICAgICAgICA0MAorI2RlZmluZSBFUlJfTElCX0NPTVAgICAgICAgICAgICA0MQorI2RlZmluZSBFUlJfTElCX0VDRFNBCQk0MgorI2RlZmluZSBFUlJfTElCX0VDREgJCTQzCisjZGVmaW5lIEVSUl9MSUJfU1RPUkUgICAgICAgICAgIDQ0CisjZGVmaW5lIEVSUl9MSUJfRklQUwkJNDUKKyNkZWZpbmUgRVJSX0xJQl9DTVMJCTQ2CisjZGVmaW5lIEVSUl9MSUJfVFMJCTQ3CisjZGVmaW5lIEVSUl9MSUJfSE1BQwkJNDgKKyNkZWZpbmUgRVJSX0xJQl9KUEFLRQkJNDkKKworI2RlZmluZSBFUlJfTElCX1VTRVIJCTEyOAorCisjZGVmaW5lIFNZU2VycihmLHIpICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfU1lTLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIEJOZXJyKGYscikgICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfQk4sKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgUlNBZXJyKGYscikgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9SU0EsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgREhlcnIoZixyKSAgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9ESCwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBFVlBlcnIoZixyKSAgRVJSX1BVVF9lcnJvcihFUlJfTElCX0VWUCwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBCVUZlcnIoZixyKSAgRVJSX1BVVF9lcnJvcihFUlJfTElCX0JVRiwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBPQkplcnIoZixyKSAgRVJSX1BVVF9lcnJvcihFUlJfTElCX09CSiwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBQRU1lcnIoZixyKSAgRVJSX1BVVF9lcnJvcihFUlJfTElCX1BFTSwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBEU0FlcnIoZixyKSAgRVJSX1BVVF9lcnJvcihFUlJfTElCX0RTQSwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBYNTA5ZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX1g1MDksKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgQVNOMWVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9BU04xLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIENPTkZlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfQ09ORiwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBDUllQVE9lcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfQ1JZUFRPLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIEVDZXJyKGYscikgICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfRUMsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgU1NMZXJyKGYscikgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9TU0wsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgQklPZXJyKGYscikgIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9CSU8sKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgUEtDUzdlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfUEtDUzcsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgWDUwOVYzZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX1g1MDlWMywoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBQS0NTMTJlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfUEtDUzEyLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIFJBTkRlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfUkFORCwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBEU09lcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfRFNPLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIEVOR0lORWVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9FTkdJTkUsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgT0NTUGVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9PQ1NQLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIFVJZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX1VJLChmKSwociksX19GSUxFX18sX19MSU5FX18pCisjZGVmaW5lIENPTVBlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfQ09NUCwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBFQ0RTQWVycihmLHIpICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfRUNEU0EsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgRUNESGVycihmLHIpICBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfRUNESCwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBTVE9SRWVycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9TVE9SRSwoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBGSVBTZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX0ZJUFMsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgQ01TZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX0NNUywoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBUU2VycihmLHIpIEVSUl9QVVRfZXJyb3IoRVJSX0xJQl9UUywoZiksKHIpLF9fRklMRV9fLF9fTElORV9fKQorI2RlZmluZSBITUFDZXJyKGYscikgRVJSX1BVVF9lcnJvcihFUlJfTElCX0hNQUMsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKyNkZWZpbmUgSlBBS0VlcnIoZixyKSBFUlJfUFVUX2Vycm9yKEVSUl9MSUJfSlBBS0UsKGYpLChyKSxfX0ZJTEVfXyxfX0xJTkVfXykKKworLyogQm9ybGFuZCBDIHNlZW1zIHRvbyBzdHVwaWQgdG8gYmUgYWJsZSB0byBzaGlmdCBhbmQgZG8gbG9uZ3MgaW4KKyAqIHRoZSBwcmUtcHJvY2Vzc29yIDotKCAqLworI2RlZmluZSBFUlJfUEFDSyhsLGYscikJCSgoKCgodW5zaWduZWQgbG9uZylsKSYweGZmTCkqMHgxMDAwMDAwKXwgXAorCQkJCSgoKCh1bnNpZ25lZCBsb25nKWYpJjB4ZmZmTCkqMHgxMDAwKXwgXAorCQkJCSgoKCh1bnNpZ25lZCBsb25nKXIpJjB4ZmZmTCkpKQorI2RlZmluZSBFUlJfR0VUX0xJQihsKQkJKGludCkoKCgodW5zaWduZWQgbG9uZylsKT4+MjRMKSYweGZmTCkKKyNkZWZpbmUgRVJSX0dFVF9GVU5DKGwpCQkoaW50KSgoKCh1bnNpZ25lZCBsb25nKWwpPj4xMkwpJjB4ZmZmTCkKKyNkZWZpbmUgRVJSX0dFVF9SRUFTT04obCkJKGludCkoKGwpJjB4ZmZmTCkKKyNkZWZpbmUgRVJSX0ZBVEFMX0VSUk9SKGwpCShpbnQpKChsKSZFUlJfUl9GQVRBTCkKKworCisvKiBPUyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgU1lTX0ZfRk9QRU4JCTEKKyNkZWZpbmUgU1lTX0ZfQ09OTkVDVAkJMgorI2RlZmluZSBTWVNfRl9HRVRTRVJWQllOQU1FCTMKKyNkZWZpbmUgU1lTX0ZfU09DS0VUCQk0CisjZGVmaW5lIFNZU19GX0lPQ1RMU09DS0VUCTUKKyNkZWZpbmUgU1lTX0ZfQklORAkJNgorI2RlZmluZSBTWVNfRl9MSVNURU4JCTcKKyNkZWZpbmUgU1lTX0ZfQUNDRVBUCQk4CisjZGVmaW5lIFNZU19GX1dTQVNUQVJUVVAJOSAvKiBXaW5zb2NrIHN0dWZmICovCisjZGVmaW5lIFNZU19GX09QRU5ESVIJCTEwCisjZGVmaW5lIFNZU19GX0ZSRUFECQkxMQorCisKKy8qIHJlYXNvbnMgKi8KKyNkZWZpbmUgRVJSX1JfU1lTX0xJQglFUlJfTElCX1NZUyAgICAgICAvKiAyICovCisjZGVmaW5lIEVSUl9SX0JOX0xJQglFUlJfTElCX0JOICAgICAgICAvKiAzICovCisjZGVmaW5lIEVSUl9SX1JTQV9MSUIJRVJSX0xJQl9SU0EgICAgICAgLyogNCAqLworI2RlZmluZSBFUlJfUl9ESF9MSUIJRVJSX0xJQl9ESCAgICAgICAgLyogNSAqLworI2RlZmluZSBFUlJfUl9FVlBfTElCCUVSUl9MSUJfRVZQICAgICAgIC8qIDYgKi8KKyNkZWZpbmUgRVJSX1JfQlVGX0xJQglFUlJfTElCX0JVRiAgICAgICAvKiA3ICovCisjZGVmaW5lIEVSUl9SX09CSl9MSUIJRVJSX0xJQl9PQkogICAgICAgLyogOCAqLworI2RlZmluZSBFUlJfUl9QRU1fTElCCUVSUl9MSUJfUEVNICAgICAgIC8qIDkgKi8KKyNkZWZpbmUgRVJSX1JfRFNBX0xJQglFUlJfTElCX0RTQSAgICAgIC8qIDEwICovCisjZGVmaW5lIEVSUl9SX1g1MDlfTElCCUVSUl9MSUJfWDUwOSAgICAgLyogMTEgKi8KKyNkZWZpbmUgRVJSX1JfQVNOMV9MSUIJRVJSX0xJQl9BU04xICAgICAvKiAxMyAqLworI2RlZmluZSBFUlJfUl9DT05GX0xJQglFUlJfTElCX0NPTkYgICAgIC8qIDE0ICovCisjZGVmaW5lIEVSUl9SX0NSWVBUT19MSUIgRVJSX0xJQl9DUllQVE8gIC8qIDE1ICovCisjZGVmaW5lIEVSUl9SX0VDX0xJQglFUlJfTElCX0VDICAgICAgIC8qIDE2ICovCisjZGVmaW5lIEVSUl9SX1NTTF9MSUIJRVJSX0xJQl9TU0wgICAgICAvKiAyMCAqLworI2RlZmluZSBFUlJfUl9CSU9fTElCCUVSUl9MSUJfQklPICAgICAgLyogMzIgKi8KKyNkZWZpbmUgRVJSX1JfUEtDUzdfTElCCUVSUl9MSUJfUEtDUzcgICAgLyogMzMgKi8KKyNkZWZpbmUgRVJSX1JfWDUwOVYzX0xJQiBFUlJfTElCX1g1MDlWMyAgLyogMzQgKi8KKyNkZWZpbmUgRVJSX1JfUEtDUzEyX0xJQiBFUlJfTElCX1BLQ1MxMiAgLyogMzUgKi8KKyNkZWZpbmUgRVJSX1JfUkFORF9MSUIJRVJSX0xJQl9SQU5EICAgICAvKiAzNiAqLworI2RlZmluZSBFUlJfUl9EU09fTElCCUVSUl9MSUJfRFNPICAgICAgLyogMzcgKi8KKyNkZWZpbmUgRVJSX1JfRU5HSU5FX0xJQiBFUlJfTElCX0VOR0lORSAgLyogMzggKi8KKyNkZWZpbmUgRVJSX1JfT0NTUF9MSUIgIEVSUl9MSUJfT0NTUCAgICAgLyogMzkgKi8KKyNkZWZpbmUgRVJSX1JfVUlfTElCICAgIEVSUl9MSUJfVUkgICAgICAgLyogNDAgKi8KKyNkZWZpbmUgRVJSX1JfQ09NUF9MSUIJRVJSX0xJQl9DT01QICAgICAvKiA0MSAqLworI2RlZmluZSBFUlJfUl9FQ0RTQV9MSUIgRVJSX0xJQl9FQ0RTQQkgLyogNDIgKi8KKyNkZWZpbmUgRVJSX1JfRUNESF9MSUIgIEVSUl9MSUJfRUNESAkgLyogNDMgKi8KKyNkZWZpbmUgRVJSX1JfU1RPUkVfTElCIEVSUl9MSUJfU1RPUkUgICAgLyogNDQgKi8KKyNkZWZpbmUgRVJSX1JfVFNfTElCCUVSUl9MSUJfVFMgICAgICAgLyogNDUgKi8KKworI2RlZmluZSBFUlJfUl9ORVNURURfQVNOMV9FUlJPUgkJCTU4CisjZGVmaW5lIEVSUl9SX0JBRF9BU04xX09CSkVDVF9IRUFERVIJCTU5CisjZGVmaW5lIEVSUl9SX0JBRF9HRVRfQVNOMV9PQkpFQ1RfQ0FMTAkJNjAKKyNkZWZpbmUgRVJSX1JfRVhQRUNUSU5HX0FOX0FTTjFfU0VRVUVOQ0UJNjEKKyNkZWZpbmUgRVJSX1JfQVNOMV9MRU5HVEhfTUlTTUFUQ0gJCTYyCisjZGVmaW5lIEVSUl9SX01JU1NJTkdfQVNOMV9FT1MJCQk2MworCisvKiBmYXRhbCBlcnJvciAqLworI2RlZmluZSBFUlJfUl9GQVRBTAkJCQk2NAorI2RlZmluZQlFUlJfUl9NQUxMT0NfRkFJTFVSRQkJCSgxfEVSUl9SX0ZBVEFMKQorI2RlZmluZQlFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQJKDJ8RVJSX1JfRkFUQUwpCisjZGVmaW5lCUVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUgkJKDN8RVJSX1JfRkFUQUwpCisjZGVmaW5lCUVSUl9SX0lOVEVSTkFMX0VSUk9SCQkJKDR8RVJSX1JfRkFUQUwpCisjZGVmaW5lCUVSUl9SX0RJU0FCTEVECQkJCSg1fEVSUl9SX0ZBVEFMKQorCisvKiA5OSBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBFUlJfUl8uLi4gY29kZSwgaGlnaGVyIHZhbHVlcworICogYXJlIHJlc2VydmVkIGZvciB0aGUgaW5kaXZpZHVhbCBsaWJyYXJpZXMgKi8KKworCit0eXBlZGVmIHN0cnVjdCBFUlJfc3RyaW5nX2RhdGFfc3QKKwl7CisJdW5zaWduZWQgbG9uZyBlcnJvcjsKKwljb25zdCBjaGFyICpzdHJpbmc7CisJfSBFUlJfU1RSSU5HX0RBVEE7CisKK3ZvaWQgRVJSX3B1dF9lcnJvcihpbnQgbGliLCBpbnQgZnVuYyxpbnQgcmVhc29uLGNvbnN0IGNoYXIgKmZpbGUsaW50IGxpbmUpOwordm9pZCBFUlJfc2V0X2Vycm9yX2RhdGEoY2hhciAqZGF0YSxpbnQgZmxhZ3MpOworCit1bnNpZ25lZCBsb25nIEVSUl9nZXRfZXJyb3Iodm9pZCk7Cit1bnNpZ25lZCBsb25nIEVSUl9nZXRfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSxpbnQgKmxpbmUpOwordW5zaWduZWQgbG9uZyBFUlJfZ2V0X2Vycm9yX2xpbmVfZGF0YShjb25zdCBjaGFyICoqZmlsZSxpbnQgKmxpbmUsCisJCQkJICAgICAgY29uc3QgY2hhciAqKmRhdGEsIGludCAqZmxhZ3MpOwordW5zaWduZWQgbG9uZyBFUlJfcGVla19lcnJvcih2b2lkKTsKK3Vuc2lnbmVkIGxvbmcgRVJSX3BlZWtfZXJyb3JfbGluZShjb25zdCBjaGFyICoqZmlsZSxpbnQgKmxpbmUpOwordW5zaWduZWQgbG9uZyBFUlJfcGVla19lcnJvcl9saW5lX2RhdGEoY29uc3QgY2hhciAqKmZpbGUsaW50ICpsaW5lLAorCQkJCSAgICAgICBjb25zdCBjaGFyICoqZGF0YSxpbnQgKmZsYWdzKTsKK3Vuc2lnbmVkIGxvbmcgRVJSX3BlZWtfbGFzdF9lcnJvcih2b2lkKTsKK3Vuc2lnbmVkIGxvbmcgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lKGNvbnN0IGNoYXIgKipmaWxlLGludCAqbGluZSk7Cit1bnNpZ25lZCBsb25nIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZV9kYXRhKGNvbnN0IGNoYXIgKipmaWxlLGludCAqbGluZSwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqKmRhdGEsaW50ICpmbGFncyk7Cit2b2lkIEVSUl9jbGVhcl9lcnJvcih2b2lkICk7CitjaGFyICpFUlJfZXJyb3Jfc3RyaW5nKHVuc2lnbmVkIGxvbmcgZSxjaGFyICpidWYpOwordm9pZCBFUlJfZXJyb3Jfc3RyaW5nX24odW5zaWduZWQgbG9uZyBlLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworY29uc3QgY2hhciAqRVJSX2xpYl9lcnJvcl9zdHJpbmcodW5zaWduZWQgbG9uZyBlKTsKK2NvbnN0IGNoYXIgKkVSUl9mdW5jX2Vycm9yX3N0cmluZyh1bnNpZ25lZCBsb25nIGUpOworY29uc3QgY2hhciAqRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcodW5zaWduZWQgbG9uZyBlKTsKK3ZvaWQgRVJSX3ByaW50X2Vycm9yc19jYihpbnQgKCpjYikoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLCB2b2lkICp1KSwKKwkJCSB2b2lkICp1KTsKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK3ZvaWQgRVJSX3ByaW50X2Vycm9yc19mcChGSUxFICpmcCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK3ZvaWQgRVJSX3ByaW50X2Vycm9ycyhCSU8gKmJwKTsKK3ZvaWQgRVJSX2FkZF9lcnJvcl9kYXRhKGludCBudW0sIC4uLik7CisjZW5kaWYKK3ZvaWQgRVJSX2xvYWRfc3RyaW5ncyhpbnQgbGliLEVSUl9TVFJJTkdfREFUQSBzdHJbXSk7Cit2b2lkIEVSUl91bmxvYWRfc3RyaW5ncyhpbnQgbGliLEVSUl9TVFJJTkdfREFUQSBzdHJbXSk7Cit2b2lkIEVSUl9sb2FkX0VSUl9zdHJpbmdzKHZvaWQpOwordm9pZCBFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncyh2b2lkKTsKK3ZvaWQgRVJSX2ZyZWVfc3RyaW5ncyh2b2lkKTsKKwordm9pZCBFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShjb25zdCBDUllQVE9fVEhSRUFESUQgKnRpZCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAordm9pZCBFUlJfcmVtb3ZlX3N0YXRlKHVuc2lnbmVkIGxvbmcgcGlkKTsgLyogaWYgemVybyB3ZSBsb29rIGl0IHVwICovCisjZW5kaWYKK0VSUl9TVEFURSAqRVJSX2dldF9zdGF0ZSh2b2lkKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0xIQVNICitMSEFTSF9PRihFUlJfU1RSSU5HX0RBVEEpICpFUlJfZ2V0X3N0cmluZ190YWJsZSh2b2lkKTsKK0xIQVNIX09GKEVSUl9TVEFURSkgKkVSUl9nZXRfZXJyX3N0YXRlX3RhYmxlKHZvaWQpOwordm9pZCBFUlJfcmVsZWFzZV9lcnJfc3RhdGVfdGFibGUoTEhBU0hfT0YoRVJSX1NUQVRFKSAqKmhhc2gpOworI2VuZGlmCisKK2ludCBFUlJfZ2V0X25leHRfZXJyb3JfbGlicmFyeSh2b2lkKTsKKworaW50IEVSUl9zZXRfbWFyayh2b2lkKTsKK2ludCBFUlJfcG9wX3RvX21hcmsodm9pZCk7CisKKy8qIEFscmVhZHkgZGVmaW5lZCBpbiBvc3NsX3R5cC5oICovCisvKiB0eXBlZGVmIHN0cnVjdCBzdF9FUlJfRk5TIEVSUl9GTlM7ICovCisvKiBBbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gYW5kIHByb3ZpZGUgdGhlIHJldHVybiB2YWx1ZSB0byBsb2FkZWQKKyAqIG1vZHVsZXMgdGhhdCBzaG91bGQgdXNlIHRoZSBhcHBsaWNhdGlvbidzIEVSUiBzdGF0ZS9mdW5jdGlvbmFsaXR5ICovCitjb25zdCBFUlJfRk5TICpFUlJfZ2V0X2ltcGxlbWVudGF0aW9uKHZvaWQpOworLyogQSBsb2FkZWQgbW9kdWxlIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gcHJpb3IgdG8gYW55IEVSUiBvcGVyYXRpb25zIHVzaW5nCisgKiB0aGUgYXBwbGljYXRpb24ncyAiRVJSX0ZOUyIuICovCitpbnQgRVJSX3NldF9pbXBsZW1lbnRhdGlvbihjb25zdCBFUlJfRk5TICpmbnMpOworCisjaWZkZWYJX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9ldnAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjk3OTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2V2cC5oCkBAIC0wLDAgKzEsMTMyNCBAQAorLyogY3J5cHRvL2V2cC9ldnAuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9FTlZFTE9QRV9ICisjZGVmaW5lIEhFQURFUl9FTlZFTE9QRV9ICisKKyNpZmRlZiBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCisjIGluY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNlbHNlCisjIGRlZmluZSBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCisjIGluY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyMgdW5kZWYgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUworI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisKKy8qCisjZGVmaW5lIEVWUF9SQzJfS0VZX1NJWkUJCTE2CisjZGVmaW5lIEVWUF9SQzRfS0VZX1NJWkUJCTE2CisjZGVmaW5lIEVWUF9CTE9XRklTSF9LRVlfU0laRQkJMTYKKyNkZWZpbmUgRVZQX0NBU1Q1X0tFWV9TSVpFCQkxNgorI2RlZmluZSBFVlBfUkM1XzMyXzEyXzE2X0tFWV9TSVpFCTE2CisqLworI2RlZmluZSBFVlBfTUFYX01EX1NJWkUJCQk2NAkvKiBsb25nZXN0IGtub3duIGlzIFNIQTUxMiAqLworI2RlZmluZSBFVlBfTUFYX0tFWV9MRU5HVEgJCTMyCisjZGVmaW5lIEVWUF9NQVhfSVZfTEVOR1RICQkxNgorI2RlZmluZSBFVlBfTUFYX0JMT0NLX0xFTkdUSAkJMzIKKworI2RlZmluZSBQS0NTNV9TQUxUX0xFTgkJCTgKKy8qIERlZmF1bHQgUEtDUyM1IGl0ZXJhdGlvbiBjb3VudCAqLworI2RlZmluZSBQS0NTNV9ERUZBVUxUX0lURVIJCTIwNDgKKworI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorCisjZGVmaW5lIEVWUF9QS19SU0EJMHgwMDAxCisjZGVmaW5lIEVWUF9QS19EU0EJMHgwMDAyCisjZGVmaW5lIEVWUF9QS19ESAkweDAwMDQKKyNkZWZpbmUgRVZQX1BLX0VDCTB4MDAwOAorI2RlZmluZSBFVlBfUEtUX1NJR04JMHgwMDEwCisjZGVmaW5lIEVWUF9QS1RfRU5DCTB4MDAyMAorI2RlZmluZSBFVlBfUEtUX0VYQ0gJMHgwMDQwCisjZGVmaW5lIEVWUF9QS1NfUlNBCTB4MDEwMAorI2RlZmluZSBFVlBfUEtTX0RTQQkweDAyMDAKKyNkZWZpbmUgRVZQX1BLU19FQwkweDA0MDAKKyNkZWZpbmUgRVZQX1BLVF9FWFAJMHgxMDAwIC8qIDw9IDUxMiBiaXQga2V5ICovCisKKyNkZWZpbmUgRVZQX1BLRVlfTk9ORQlOSURfdW5kZWYKKyNkZWZpbmUgRVZQX1BLRVlfUlNBCU5JRF9yc2FFbmNyeXB0aW9uCisjZGVmaW5lIEVWUF9QS0VZX1JTQTIJTklEX3JzYQorI2RlZmluZSBFVlBfUEtFWV9EU0EJTklEX2RzYQorI2RlZmluZSBFVlBfUEtFWV9EU0ExCU5JRF9kc2FfMgorI2RlZmluZSBFVlBfUEtFWV9EU0EyCU5JRF9kc2FXaXRoU0hBCisjZGVmaW5lIEVWUF9QS0VZX0RTQTMJTklEX2RzYVdpdGhTSEExCisjZGVmaW5lIEVWUF9QS0VZX0RTQTQJTklEX2RzYVdpdGhTSEExXzIKKyNkZWZpbmUgRVZQX1BLRVlfREgJTklEX2RoS2V5QWdyZWVtZW50CisjZGVmaW5lIEVWUF9QS0VZX0VDCU5JRF9YOV82Ml9pZF9lY1B1YmxpY0tleQorI2RlZmluZSBFVlBfUEtFWV9ITUFDCU5JRF9obWFjCisKKyNpZmRlZglfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVHlwZSBuZWVkcyB0byBiZSBhIGJpdCBmaWVsZAorICogU3ViLXR5cGUgbmVlZHMgdG8gYmUgZm9yIHZhcmlhdGlvbnMgb24gdGhlIG1ldGhvZCwgYXMgaW4sIGNhbiBpdCBkbworICogYXJiaXRyYXJ5IGVuY3J5cHRpb24uLi4uICovCitzdHJ1Y3QgZXZwX3BrZXlfc3QKKwl7CisJaW50IHR5cGU7CisJaW50IHNhdmVfdHlwZTsKKwlpbnQgcmVmZXJlbmNlczsKKwljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGg7CisJRU5HSU5FICplbmdpbmU7CisJdW5pb24JeworCQljaGFyICpwdHI7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCXN0cnVjdCByc2Ffc3QgKnJzYTsJLyogUlNBICovCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkJc3RydWN0IGRzYV9zdCAqZHNhOwkvKiBEU0EgKi8KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCXN0cnVjdCBkaF9zdCAqZGg7CS8qIERIICovCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCQlzdHJ1Y3QgZWNfa2V5X3N0ICplYzsJLyogRUNDICovCisjZW5kaWYKKwkJfSBwa2V5OworCWludCBzYXZlX3BhcmFtZXRlcnM7CisJU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICphdHRyaWJ1dGVzOyAvKiBbIDAgXSAqLworCX0gLyogRVZQX1BLRVkgKi87CisKKyNkZWZpbmUgRVZQX1BLRVlfTU9fU0lHTgkweDAwMDEKKyNkZWZpbmUgRVZQX1BLRVlfTU9fVkVSSUZZCTB4MDAwMgorI2RlZmluZSBFVlBfUEtFWV9NT19FTkNSWVBUCTB4MDAwNAorI2RlZmluZSBFVlBfUEtFWV9NT19ERUNSWVBUCTB4MDAwOAorCisjaWZuZGVmIEVWUF9NRAorc3RydWN0IGVudl9tZF9zdAorCXsKKwlpbnQgdHlwZTsKKwlpbnQgcGtleV90eXBlOworCWludCBtZF9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50ICgqaW5pdCkoRVZQX01EX0NUWCAqY3R4KTsKKwlpbnQgKCp1cGRhdGUpKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCk7CisJaW50ICgqZmluYWwpKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCk7CisJaW50ICgqY29weSkoRVZQX01EX0NUWCAqdG8sY29uc3QgRVZQX01EX0NUWCAqZnJvbSk7CisJaW50ICgqY2xlYW51cCkoRVZQX01EX0NUWCAqY3R4KTsKKworCS8qIEZJWE1FOiBwcm90b3R5cGUgdGhlc2Ugc29tZSBkYXkgKi8KKwlpbnQgKCpzaWduKShpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqbSwgdW5zaWduZWQgaW50IG1fbGVuZ3RoLAorCQkgICAgdW5zaWduZWQgY2hhciAqc2lncmV0LCB1bnNpZ25lZCBpbnQgKnNpZ2xlbiwgdm9pZCAqa2V5KTsKKwlpbnQgKCp2ZXJpZnkpKGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICptLCB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsCisJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZ2J1ZiwgdW5zaWduZWQgaW50IHNpZ2xlbiwKKwkJICAgICAgdm9pZCAqa2V5KTsKKwlpbnQgcmVxdWlyZWRfcGtleV90eXBlWzVdOyAvKkVWUF9QS0VZX3h4eCAqLworCWludCBibG9ja19zaXplOworCWludCBjdHhfc2l6ZTsgLyogaG93IGJpZyBkb2VzIHRoZSBjdHgtPm1kX2RhdGEgbmVlZCB0byBiZSAqLworCS8qIGNvbnRyb2wgZnVuY3Rpb24gKi8KKwlpbnQgKCptZF9jdHJsKShFVlBfTURfQ1RYICpjdHgsIGludCBjbWQsIGludCBwMSwgdm9pZCAqcDIpOworCX0gLyogRVZQX01EICovOworCit0eXBlZGVmIGludCBldnBfc2lnbl9tZXRob2QoaW50IHR5cGUsY29uc3QgdW5zaWduZWQgY2hhciAqbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsdW5zaWduZWQgY2hhciAqc2lncmV0LAorCQkJICAgIHVuc2lnbmVkIGludCAqc2lnbGVuLCB2b2lkICprZXkpOwordHlwZWRlZiBpbnQgZXZwX3ZlcmlmeV9tZXRob2QoaW50IHR5cGUsY29uc3QgdW5zaWduZWQgY2hhciAqbSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLAorCQkJICAgIHVuc2lnbmVkIGludCBzaWdsZW4sIHZvaWQgKmtleSk7CisKKyNkZWZpbmUgRVZQX01EX0ZMQUdfT05FU0hPVAkweDAwMDEgLyogZGlnZXN0IGNhbiBvbmx5IGhhbmRsZSBhIHNpbmdsZQorCQkJCQkqIGJsb2NrICovCisKKyNkZWZpbmUgRVZQX01EX0ZMQUdfUEtFWV9ESUdFU1QJMHgwMDAyIC8qIGRpZ2VzdCBpcyBhICJjbG9uZSIgZGlnZXN0IHVzZWQKKwkJCQkJKiB3aGljaCBpcyBhIGNvcHkgb2YgYW4gZXhpc3RpbmcKKwkJCQkJKiBvbmUgZm9yIGEgc3BlY2lmaWMgcHVibGljIGtleSB0eXBlLgorCQkJCQkqIEVWUF9kc3MxKCkgZXRjICovCisKKy8qIERpZ2VzdCB1c2VzIEVWUF9QS0VZX01FVEhPRCBmb3Igc2lnbmluZyBpbnN0ZWFkIG9mIE1EIHNwZWNpZmljIHNpZ25pbmcgKi8KKworI2RlZmluZSBFVlBfTURfRkxBR19QS0VZX01FVEhPRF9TSUdOQVRVUkUJMHgwMDA0CisKKy8qIERpZ2VzdEFsZ29yaXRobUlkZW50aWZpZXIgZmxhZ3MuLi4gKi8KKworI2RlZmluZSBFVlBfTURfRkxBR19ESUdBTEdJRF9NQVNLCQkweDAwMTgKKworLyogTlVMTCBvciBhYnNlbnQgcGFyYW1ldGVyIGFjY2VwdGVkLiBVc2UgTlVMTCAqLworCisjZGVmaW5lIEVWUF9NRF9GTEFHX0RJR0FMR0lEX05VTEwJCTB4MDAwMAorCisvKiBOVUxMIG9yIGFic2VudCBwYXJhbWV0ZXIgYWNjZXB0ZWQuIFVzZSBOVUxMIGZvciBQS0NTIzEgb3RoZXJ3aXNlIGFic2VudCAqLworCisjZGVmaW5lIEVWUF9NRF9GTEFHX0RJR0FMR0lEX0FCU0VOVAkJMHgwMDA4CisKKy8qIEN1c3RvbSBoYW5kbGluZyB2aWEgY3RybCAqLworCisjZGVmaW5lIEVWUF9NRF9GTEFHX0RJR0FMR0lEX0NVU1RPTQkJMHgwMDE4CisKKy8qIERpZ2VzdCBjdHJscyAqLworCisjZGVmaW5lCUVWUF9NRF9DVFJMX0RJR0FMR0lECQkJMHgxCisjZGVmaW5lCUVWUF9NRF9DVFJMX01JQ0FMRwkJCTB4MgorCisvKiBNaW5pbXVtIEFsZ29yaXRobSBzcGVjaWZpYyBjdHJsIHZhbHVlICovCisKKyNkZWZpbmUJRVZQX01EX0NUUkxfQUxHX0NUUkwJCQkweDEwMDAKKworI2RlZmluZSBFVlBfUEtFWV9OVUxMX21ldGhvZAlOVUxMLE5VTEwsezAsMCwwLDB9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKyNkZWZpbmUgRVZQX1BLRVlfRFNBX21ldGhvZAkoZXZwX3NpZ25fbWV0aG9kICopRFNBX3NpZ24sIFwKKwkJCQkoZXZwX3ZlcmlmeV9tZXRob2QgKilEU0FfdmVyaWZ5LCBcCisJCQkJe0VWUF9QS0VZX0RTQSxFVlBfUEtFWV9EU0EyLEVWUF9QS0VZX0RTQTMsIFwKKwkJCQkJRVZQX1BLRVlfRFNBNCwwfQorI2Vsc2UKKyNkZWZpbmUgRVZQX1BLRVlfRFNBX21ldGhvZAlFVlBfUEtFWV9OVUxMX21ldGhvZAorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorI2RlZmluZSBFVlBfUEtFWV9FQ0RTQV9tZXRob2QgICAoZXZwX3NpZ25fbWV0aG9kICopRUNEU0Ffc2lnbiwgXAorCQkJCShldnBfdmVyaWZ5X21ldGhvZCAqKUVDRFNBX3ZlcmlmeSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0VWUF9QS0VZX0VDLDAsMCwwfQorI2Vsc2UgICAKKyNkZWZpbmUgRVZQX1BLRVlfRUNEU0FfbWV0aG9kICAgRVZQX1BLRVlfTlVMTF9tZXRob2QKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjZGVmaW5lIEVWUF9QS0VZX1JTQV9tZXRob2QJKGV2cF9zaWduX21ldGhvZCAqKVJTQV9zaWduLCBcCisJCQkJKGV2cF92ZXJpZnlfbWV0aG9kICopUlNBX3ZlcmlmeSwgXAorCQkJCXtFVlBfUEtFWV9SU0EsRVZQX1BLRVlfUlNBMiwwLDB9CisjZGVmaW5lIEVWUF9QS0VZX1JTQV9BU04xX09DVEVUX1NUUklOR19tZXRob2QgXAorCQkJCShldnBfc2lnbl9tZXRob2QgKilSU0Ffc2lnbl9BU04xX09DVEVUX1NUUklORywgXAorCQkJCShldnBfdmVyaWZ5X21ldGhvZCAqKVJTQV92ZXJpZnlfQVNOMV9PQ1RFVF9TVFJJTkcsIFwKKwkJCQl7RVZQX1BLRVlfUlNBLEVWUF9QS0VZX1JTQTIsMCwwfQorI2Vsc2UKKyNkZWZpbmUgRVZQX1BLRVlfUlNBX21ldGhvZAlFVlBfUEtFWV9OVUxMX21ldGhvZAorI2RlZmluZSBFVlBfUEtFWV9SU0FfQVNOMV9PQ1RFVF9TVFJJTkdfbWV0aG9kIEVWUF9QS0VZX05VTExfbWV0aG9kCisjZW5kaWYKKworI2VuZGlmIC8qICFFVlBfTUQgKi8KKworc3RydWN0IGVudl9tZF9jdHhfc3QKKwl7CisJY29uc3QgRVZQX01EICpkaWdlc3Q7CisJRU5HSU5FICplbmdpbmU7IC8qIGZ1bmN0aW9uYWwgcmVmZXJlbmNlIGlmICdkaWdlc3QnIGlzIEVOR0lORS1wcm92aWRlZCAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCAqbWRfZGF0YTsKKwkvKiBQdWJsaWMga2V5IGNvbnRleHQgZm9yIHNpZ24vdmVyaWZ5ICovCisJRVZQX1BLRVlfQ1RYICpwY3R4OworCS8qIFVwZGF0ZSBmdW5jdGlvbjogdXN1YWxseSBjb3BpZWQgZnJvbSBFVlBfTUQgKi8KKwlpbnQgKCp1cGRhdGUpKEVWUF9NRF9DVFggKmN0eCxjb25zdCB2b2lkICpkYXRhLHNpemVfdCBjb3VudCk7CisJfSAvKiBFVlBfTURfQ1RYICovOworCisvKiB2YWx1ZXMgZm9yIEVWUF9NRF9DVFggZmxhZ3MgKi8KKworI2RlZmluZSBFVlBfTURfQ1RYX0ZMQUdfT05FU0hPVAkJMHgwMDAxIC8qIGRpZ2VzdCB1cGRhdGUgd2lsbCBiZSBjYWxsZWQKKwkJCQkJCSogb25jZSBvbmx5ICovCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19DTEVBTkVECQkweDAwMDIgLyogY29udGV4dCBoYXMgYWxyZWFkeSBiZWVuCisJCQkJCQkqIGNsZWFuZWQgKi8KKyNkZWZpbmUgRVZQX01EX0NUWF9GTEFHX1JFVVNFCQkweDAwMDQgLyogRG9uJ3QgZnJlZSB1cCBjdHgtPm1kX2RhdGEKKwkJCQkJCSogaW4gRVZQX01EX0NUWF9jbGVhbnVwICovCisvKiBGSVBTIGFuZCBwYWQgb3B0aW9ucyBhcmUgaWdub3JlZCBpbiAxLjAuMCwgZGVmaW5pdGlvbnMgYXJlIGhlcmUKKyAqIHNvIHdlIGRvbid0IGFjY2lkZW50YWxseSByZXVzZSB0aGUgdmFsdWVzIGZvciBvdGhlciBwdXJwb3Nlcy4KKyAqLworCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19OT05fRklQU19BTExPVwkweDAwMDgJLyogQWxsb3cgdXNlIG9mIG5vbiBGSVBTIGRpZ2VzdAorCQkJCQkJICogaW4gRklQUyBtb2RlICovCisKKy8qIFRoZSBmb2xsb3dpbmcgUEFEIG9wdGlvbnMgYXJlIGFsc28gY3VycmVudGx5IGlnbm9yZWQgaW4gMS4wLjAsIGRpZ2VzdAorICogcGFyYW1ldGVycyBhcmUgaGFuZGxlZCB0aHJvdWdoIEVWUF9EaWdlc3RTaWduKigpIGFuZCBFVlBfRGlnZXN0VmVyaWZ5KigpCisgKiBpbnN0ZWFkLgorICovCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19QQURfTUFTSwkweEYwCS8qIFJTQSBtb2RlIHRvIHVzZSAqLworI2RlZmluZSBFVlBfTURfQ1RYX0ZMQUdfUEFEX1BLQ1MxCTB4MDAJLyogUEtDUyMxIHYxLjUgbW9kZSAqLworI2RlZmluZSBFVlBfTURfQ1RYX0ZMQUdfUEFEX1g5MzEJMHgxMAkvKiBYOS4zMSBtb2RlICovCisjZGVmaW5lIEVWUF9NRF9DVFhfRkxBR19QQURfUFNTCQkweDIwCS8qIFBTUyBtb2RlICovCisKKyNkZWZpbmUgRVZQX01EX0NUWF9GTEFHX05PX0lOSVQJCTB4MDEwMCAvKiBEb24ndCBpbml0aWFsaXplIG1kX2RhdGEgKi8KKworc3RydWN0IGV2cF9jaXBoZXJfc3QKKwl7CisJaW50IG5pZDsKKwlpbnQgYmxvY2tfc2l6ZTsKKwlpbnQga2V5X2xlbjsJCS8qIERlZmF1bHQgdmFsdWUgZm9yIHZhcmlhYmxlIGxlbmd0aCBjaXBoZXJzICovCisJaW50IGl2X2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBWYXJpb3VzIGZsYWdzICovCisJaW50ICgqaW5pdCkoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAorCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaXYsIGludCBlbmMpOwkvKiBpbml0IGtleSAqLworCWludCAoKmRvX2NpcGhlcikoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sKTsvKiBlbmNyeXB0L2RlY3J5cHQgZGF0YSAqLworCWludCAoKmNsZWFudXApKEVWUF9DSVBIRVJfQ1RYICopOyAvKiBjbGVhbnVwIGN0eCAqLworCWludCBjdHhfc2l6ZTsJCS8qIGhvdyBiaWcgY3R4LT5jaXBoZXJfZGF0YSBuZWVkcyB0byBiZSAqLworCWludCAoKnNldF9hc24xX3BhcmFtZXRlcnMpKEVWUF9DSVBIRVJfQ1RYICosIEFTTjFfVFlQRSAqKTsgLyogUG9wdWxhdGUgYSBBU04xX1RZUEUgd2l0aCBwYXJhbWV0ZXJzICovCisJaW50ICgqZ2V0X2FzbjFfcGFyYW1ldGVycykoRVZQX0NJUEhFUl9DVFggKiwgQVNOMV9UWVBFICopOyAvKiBHZXQgcGFyYW1ldGVycyBmcm9tIGEgQVNOMV9UWVBFICovCisJaW50ICgqY3RybCkoRVZQX0NJUEhFUl9DVFggKiwgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cik7IC8qIE1pc2NlbGxhbmVvdXMgb3BlcmF0aW9ucyAqLworCXZvaWQgKmFwcF9kYXRhOwkJLyogQXBwbGljYXRpb24gZGF0YSAqLworCX0gLyogRVZQX0NJUEhFUiAqLzsKKworLyogVmFsdWVzIGZvciBjaXBoZXIgZmxhZ3MgKi8KKworLyogTW9kZXMgZm9yIGNpcGhlcnMgKi8KKworI2RlZmluZQkJRVZQX0NJUEhfU1RSRUFNX0NJUEhFUgkJMHgwCisjZGVmaW5lCQlFVlBfQ0lQSF9FQ0JfTU9ERQkJMHgxCisjZGVmaW5lCQlFVlBfQ0lQSF9DQkNfTU9ERQkJMHgyCisjZGVmaW5lCQlFVlBfQ0lQSF9DRkJfTU9ERQkJMHgzCisjZGVmaW5lCQlFVlBfQ0lQSF9PRkJfTU9ERQkJMHg0CisjZGVmaW5lIAlFVlBfQ0lQSF9NT0RFCQkJMHhGMDAwNworLyogU2V0IGlmIHZhcmlhYmxlIGxlbmd0aCBjaXBoZXIgKi8KKyNkZWZpbmUgCUVWUF9DSVBIX1ZBUklBQkxFX0xFTkdUSAkweDgKKy8qIFNldCBpZiB0aGUgaXYgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUgYnkgdGhlIGNpcGhlciBpdHNlbGYgKi8KKyNkZWZpbmUgCUVWUF9DSVBIX0NVU1RPTV9JVgkJMHgxMAorLyogU2V0IGlmIHRoZSBjaXBoZXIncyBpbml0KCkgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBpZiBrZXkgaXMgTlVMTCAqLworI2RlZmluZSAJRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVAkweDIwCisvKiBDYWxsIGN0cmwoKSB0byBpbml0IGNpcGhlciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIAlFVlBfQ0lQSF9DVFJMX0lOSVQJCTB4NDAKKy8qIERvbid0IHVzZSBzdGFuZGFyZCBrZXkgbGVuZ3RoIGZ1bmN0aW9uICovCisjZGVmaW5lIAlFVlBfQ0lQSF9DVVNUT01fS0VZX0xFTkdUSAkweDgwCisvKiBEb24ndCB1c2Ugc3RhbmRhcmQgYmxvY2sgcGFkZGluZyAqLworI2RlZmluZSAJRVZQX0NJUEhfTk9fUEFERElORwkJMHgxMDAKKy8qIGNpcGhlciBoYW5kbGVzIHJhbmRvbSBrZXkgZ2VuZXJhdGlvbiAqLworI2RlZmluZSAJRVZQX0NJUEhfUkFORF9LRVkJCTB4MjAwCisvKiBjaXBoZXIgaGFzIGl0cyBvd24gYWRkaXRpb25hbCBjb3B5aW5nIGxvZ2ljICovCisjZGVmaW5lIAlFVlBfQ0lQSF9DVVNUT01fQ09QWQkJMHg0MDAKKy8qIEFsbG93IHVzZSBkZWZhdWx0IEFTTjEgZ2V0L3NldCBpdiAqLworI2RlZmluZQkJRVZQX0NJUEhfRkxBR19ERUZBVUxUX0FTTjEJMHgxMDAwCisvKiBCdWZmZXIgbGVuZ3RoIGluIGJpdHMgbm90IGJ5dGVzOiBDRkIxIG1vZGUgb25seSAqLworI2RlZmluZQkJRVZQX0NJUEhfRkxBR19MRU5HVEhfQklUUwkweDIwMDAKKworLyogY3RybCgpIHZhbHVlcyAqLworCisjZGVmaW5lCQlFVlBfQ1RSTF9JTklUCQkJMHgwCisjZGVmaW5lIAlFVlBfQ1RSTF9TRVRfS0VZX0xFTkdUSAkJMHgxCisjZGVmaW5lIAlFVlBfQ1RSTF9HRVRfUkMyX0tFWV9CSVRTCTB4MgorI2RlZmluZSAJRVZQX0NUUkxfU0VUX1JDMl9LRVlfQklUUwkweDMKKyNkZWZpbmUgCUVWUF9DVFJMX0dFVF9SQzVfUk9VTkRTCQkweDQKKyNkZWZpbmUgCUVWUF9DVFJMX1NFVF9SQzVfUk9VTkRTCQkweDUKKyNkZWZpbmUgCUVWUF9DVFJMX1JBTkRfS0VZCQkweDYKKyNkZWZpbmUgCUVWUF9DVFJMX1BCRV9QUkZfTklECQkweDcKKyNkZWZpbmUgCUVWUF9DVFJMX0NPUFkJCQkweDgKKwordHlwZWRlZiBzdHJ1Y3QgZXZwX2NpcGhlcl9pbmZvX3N0CisJeworCWNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcjsKKwl1bnNpZ25lZCBjaGFyIGl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKKwl9IEVWUF9DSVBIRVJfSU5GTzsKKworc3RydWN0IGV2cF9jaXBoZXJfY3R4X3N0CisJeworCWNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcjsKKwlFTkdJTkUgKmVuZ2luZTsJLyogZnVuY3Rpb25hbCByZWZlcmVuY2UgaWYgJ2NpcGhlcicgaXMgRU5HSU5FLXByb3ZpZGVkICovCisJaW50IGVuY3J5cHQ7CQkvKiBlbmNyeXB0IG9yIGRlY3J5cHQgKi8KKwlpbnQgYnVmX2xlbjsJCS8qIG51bWJlciB3ZSBoYXZlIGxlZnQgKi8KKworCXVuc2lnbmVkIGNoYXIgIG9pdltFVlBfTUFYX0lWX0xFTkdUSF07CS8qIG9yaWdpbmFsIGl2ICovCisJdW5zaWduZWQgY2hhciAgaXZbRVZQX01BWF9JVl9MRU5HVEhdOwkvKiB3b3JraW5nIGl2ICovCisJdW5zaWduZWQgY2hhciBidWZbRVZQX01BWF9CTE9DS19MRU5HVEhdOy8qIHNhdmVkIHBhcnRpYWwgYmxvY2sgKi8KKwlpbnQgbnVtOwkJCQkvKiB1c2VkIGJ5IGNmYi9vZmIgbW9kZSAqLworCisJdm9pZCAqYXBwX2RhdGE7CQkvKiBhcHBsaWNhdGlvbiBzdHVmZiAqLworCWludCBrZXlfbGVuOwkJLyogTWF5IGNoYW5nZSBmb3IgdmFyaWFibGUgbGVuZ3RoIGNpcGhlciAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIFZhcmlvdXMgZmxhZ3MgKi8KKwl2b2lkICpjaXBoZXJfZGF0YTsgLyogcGVyIEVWUCBkYXRhICovCisJaW50IGZpbmFsX3VzZWQ7CisJaW50IGJsb2NrX21hc2s7CisJdW5zaWduZWQgY2hhciBmaW5hbFtFVlBfTUFYX0JMT0NLX0xFTkdUSF07LyogcG9zc2libGUgZmluYWwgYmxvY2sgKi8KKwl9IC8qIEVWUF9DSVBIRVJfQ1RYICovOworCit0eXBlZGVmIHN0cnVjdCBldnBfRW5jb2RlX0N0eF9zdAorCXsKKwlpbnQgbnVtOwkvKiBudW1iZXIgc2F2ZWQgaW4gYSBwYXJ0aWFsIGVuY29kZS9kZWNvZGUgKi8KKwlpbnQgbGVuZ3RoOwkvKiBUaGUgbGVuZ3RoIGlzIGVpdGhlciB0aGUgb3V0cHV0IGxpbmUgbGVuZ3RoCisJCQkgKiAoaW4gaW5wdXQgYnl0ZXMpIG9yIHRoZSBzaG9ydGVzdCBpbnB1dCBsaW5lCisJCQkgKiBsZW5ndGggdGhhdCBpcyBvay4gIE9uY2UgZGVjb2RpbmcgYmVnaW5zLAorCQkJICogdGhlIGxlbmd0aCBpcyBhZGp1c3RlZCB1cCBlYWNoIHRpbWUgYSBsb25nZXIKKwkJCSAqIGxpbmUgaXMgZGVjb2RlZCAqLworCXVuc2lnbmVkIGNoYXIgZW5jX2RhdGFbODBdOwkvKiBkYXRhIHRvIGVuY29kZSAqLworCWludCBsaW5lX251bTsJLyogbnVtYmVyIHJlYWQgb24gY3VycmVudCBsaW5lICovCisJaW50IGV4cGVjdF9ubDsKKwl9IEVWUF9FTkNPREVfQ1RYOworCisvKiBQYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIGZ1bmN0aW9uICovCit0eXBlZGVmIGludCAoRVZQX1BCRV9LRVlHRU4pKEVWUF9DSVBIRVJfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCQlBU04xX1RZUEUgKnBhcmFtLCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsCisgICAgICAgICAgICAgICAgY29uc3QgRVZQX01EICptZCwgaW50IGVuX2RlKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2RlZmluZSBFVlBfUEtFWV9hc3NpZ25fUlNBKHBrZXkscnNhKSBFVlBfUEtFWV9hc3NpZ24oKHBrZXkpLEVWUF9QS0VZX1JTQSxcCisJCQkJCShjaGFyICopKHJzYSkpCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2RlZmluZSBFVlBfUEtFWV9hc3NpZ25fRFNBKHBrZXksZHNhKSBFVlBfUEtFWV9hc3NpZ24oKHBrZXkpLEVWUF9QS0VZX0RTQSxcCisJCQkJCShjaGFyICopKGRzYSkpCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisjZGVmaW5lIEVWUF9QS0VZX2Fzc2lnbl9ESChwa2V5LGRoKSBFVlBfUEtFWV9hc3NpZ24oKHBrZXkpLEVWUF9QS0VZX0RILFwKKwkJCQkJKGNoYXIgKikoZGgpKQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworI2RlZmluZSBFVlBfUEtFWV9hc3NpZ25fRUNfS0VZKHBrZXksZWNrZXkpIEVWUF9QS0VZX2Fzc2lnbigocGtleSksRVZQX1BLRVlfRUMsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopKGVja2V5KSkKKyNlbmRpZgorCisvKiBBZGQgc29tZSBleHRyYSBjb21iaW5hdGlvbnMgKi8KKyNkZWZpbmUgRVZQX2dldF9kaWdlc3RieW5pZChhKSBFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShPQkpfbmlkMnNuKGEpKQorI2RlZmluZSBFVlBfZ2V0X2RpZ2VzdGJ5b2JqKGEpIEVWUF9nZXRfZGlnZXN0YnluaWQoT0JKX29iajJuaWQoYSkpCisjZGVmaW5lIEVWUF9nZXRfY2lwaGVyYnluaWQoYSkgRVZQX2dldF9jaXBoZXJieW5hbWUoT0JKX25pZDJzbihhKSkKKyNkZWZpbmUgRVZQX2dldF9jaXBoZXJieW9iaihhKSBFVlBfZ2V0X2NpcGhlcmJ5bmlkKE9CSl9vYmoybmlkKGEpKQorCitpbnQgRVZQX01EX3R5cGUoY29uc3QgRVZQX01EICptZCk7CisjZGVmaW5lIEVWUF9NRF9uaWQoZSkJCQlFVlBfTURfdHlwZShlKQorI2RlZmluZSBFVlBfTURfbmFtZShlKQkJCU9CSl9uaWQyc24oRVZQX01EX25pZChlKSkKK2ludCBFVlBfTURfcGtleV90eXBlKGNvbnN0IEVWUF9NRCAqbWQpOwkKK2ludCBFVlBfTURfc2l6ZShjb25zdCBFVlBfTUQgKm1kKTsKK2ludCBFVlBfTURfYmxvY2tfc2l6ZShjb25zdCBFVlBfTUQgKm1kKTsKK3Vuc2lnbmVkIGxvbmcgRVZQX01EX2ZsYWdzKGNvbnN0IEVWUF9NRCAqbWQpOworCitjb25zdCBFVlBfTUQgKkVWUF9NRF9DVFhfbWQoY29uc3QgRVZQX01EX0NUWCAqY3R4KTsKKyNkZWZpbmUgRVZQX01EX0NUWF9zaXplKGUpCQlFVlBfTURfc2l6ZShFVlBfTURfQ1RYX21kKGUpKQorI2RlZmluZSBFVlBfTURfQ1RYX2Jsb2NrX3NpemUoZSkJRVZQX01EX2Jsb2NrX3NpemUoRVZQX01EX0NUWF9tZChlKSkKKyNkZWZpbmUgRVZQX01EX0NUWF90eXBlKGUpCQlFVlBfTURfdHlwZShFVlBfTURfQ1RYX21kKGUpKQorCitpbnQgRVZQX0NJUEhFUl9uaWQoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKKyNkZWZpbmUgRVZQX0NJUEhFUl9uYW1lKGUpCQlPQkpfbmlkMnNuKEVWUF9DSVBIRVJfbmlkKGUpKQoraW50IEVWUF9DSVBIRVJfYmxvY2tfc2l6ZShjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpOworaW50IEVWUF9DSVBIRVJfa2V5X2xlbmd0aChjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIpOworaW50IEVWUF9DSVBIRVJfaXZfbGVuZ3RoKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlcik7Cit1bnNpZ25lZCBsb25nIEVWUF9DSVBIRVJfZmxhZ3MoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKKyNkZWZpbmUgRVZQX0NJUEhFUl9tb2RlKGUpCQkoRVZQX0NJUEhFUl9mbGFncyhlKSAmIEVWUF9DSVBIX01PREUpCisKK2NvbnN0IEVWUF9DSVBIRVIgKiBFVlBfQ0lQSEVSX0NUWF9jaXBoZXIoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CitpbnQgRVZQX0NJUEhFUl9DVFhfbmlkKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgpOworaW50IEVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CitpbnQgRVZQX0NJUEhFUl9DVFhfa2V5X2xlbmd0aChjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KTsKK2ludCBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CitpbnQgRVZQX0NJUEhFUl9DVFhfY29weShFVlBfQ0lQSEVSX0NUWCAqb3V0LCBjb25zdCBFVlBfQ0lQSEVSX0NUWCAqaW4pOwordm9pZCAqIEVWUF9DSVBIRVJfQ1RYX2dldF9hcHBfZGF0YShjb25zdCBFVlBfQ0lQSEVSX0NUWCAqY3R4KTsKK3ZvaWQgRVZQX0NJUEhFUl9DVFhfc2V0X2FwcF9kYXRhKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHZvaWQgKmRhdGEpOworI2RlZmluZSBFVlBfQ0lQSEVSX0NUWF90eXBlKGMpICAgICAgICAgRVZQX0NJUEhFUl90eXBlKEVWUF9DSVBIRVJfQ1RYX2NpcGhlcihjKSkKK3Vuc2lnbmVkIGxvbmcgRVZQX0NJUEhFUl9DVFhfZmxhZ3MoY29uc3QgRVZQX0NJUEhFUl9DVFggKmN0eCk7CisjZGVmaW5lIEVWUF9DSVBIRVJfQ1RYX21vZGUoZSkJCShFVlBfQ0lQSEVSX0NUWF9mbGFncyhlKSAmIEVWUF9DSVBIX01PREUpCisKKyNkZWZpbmUgRVZQX0VOQ09ERV9MRU5HVEgobCkJKCgobCsyKS8zKjQpKyhsLzQ4KzEpKjIrODApCisjZGVmaW5lIEVWUF9ERUNPREVfTEVOR1RIKGwpCSgobCszKS80KjMrODApCisKKyNkZWZpbmUgRVZQX1NpZ25Jbml0X2V4KGEsYixjKQkJRVZQX0RpZ2VzdEluaXRfZXgoYSxiLGMpCisjZGVmaW5lIEVWUF9TaWduSW5pdChhLGIpCQlFVlBfRGlnZXN0SW5pdChhLGIpCisjZGVmaW5lIEVWUF9TaWduVXBkYXRlKGEsYixjKQkJRVZQX0RpZ2VzdFVwZGF0ZShhLGIsYykKKyNkZWZpbmUJRVZQX1ZlcmlmeUluaXRfZXgoYSxiLGMpCUVWUF9EaWdlc3RJbml0X2V4KGEsYixjKQorI2RlZmluZQlFVlBfVmVyaWZ5SW5pdChhLGIpCQlFVlBfRGlnZXN0SW5pdChhLGIpCisjZGVmaW5lCUVWUF9WZXJpZnlVcGRhdGUoYSxiLGMpCQlFVlBfRGlnZXN0VXBkYXRlKGEsYixjKQorI2RlZmluZSBFVlBfT3BlblVwZGF0ZShhLGIsYyxkLGUpCUVWUF9EZWNyeXB0VXBkYXRlKGEsYixjLGQsZSkKKyNkZWZpbmUgRVZQX1NlYWxVcGRhdGUoYSxiLGMsZCxlKQlFVlBfRW5jcnlwdFVwZGF0ZShhLGIsYyxkLGUpCQorI2RlZmluZSBFVlBfRGlnZXN0U2lnblVwZGF0ZShhLGIsYykJRVZQX0RpZ2VzdFVwZGF0ZShhLGIsYykKKyNkZWZpbmUgRVZQX0RpZ2VzdFZlcmlmeVVwZGF0ZShhLGIsYykJRVZQX0RpZ2VzdFVwZGF0ZShhLGIsYykKKworI2lmZGVmIENPTlNUX1NUUklDVAordm9pZCBCSU9fc2V0X21kKEJJTyAqLGNvbnN0IEVWUF9NRCAqbWQpOworI2Vsc2UKKyMgZGVmaW5lIEJJT19zZXRfbWQoYixtZCkJCUJJT19jdHJsKGIsQklPX0NfU0VUX01ELDAsKGNoYXIgKiltZCkKKyNlbmRpZgorI2RlZmluZSBCSU9fZ2V0X21kKGIsbWRwKQkJQklPX2N0cmwoYixCSU9fQ19HRVRfTUQsMCwoY2hhciAqKW1kcCkKKyNkZWZpbmUgQklPX2dldF9tZF9jdHgoYixtZGNwKSAgICAgQklPX2N0cmwoYixCSU9fQ19HRVRfTURfQ1RYLDAsKGNoYXIgKiltZGNwKQorI2RlZmluZSBCSU9fc2V0X21kX2N0eChiLG1kY3ApICAgICBCSU9fY3RybChiLEJJT19DX1NFVF9NRF9DVFgsMCwoY2hhciAqKW1kY3ApCisjZGVmaW5lIEJJT19nZXRfY2lwaGVyX3N0YXR1cyhiKQlCSU9fY3RybChiLEJJT19DX0dFVF9DSVBIRVJfU1RBVFVTLDAsTlVMTCkKKyNkZWZpbmUgQklPX2dldF9jaXBoZXJfY3R4KGIsY19wcCkJQklPX2N0cmwoYixCSU9fQ19HRVRfQ0lQSEVSX0NUWCwwLChjaGFyICopY19wcCkKKworaW50IEVWUF9DaXBoZXIoRVZQX0NJUEhFUl9DVFggKmMsCisJCXVuc2lnbmVkIGNoYXIgKm91dCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sCisJCXVuc2lnbmVkIGludCBpbmwpOworCisjZGVmaW5lIEVWUF9hZGRfY2lwaGVyX2FsaWFzKG4sYWxpYXMpIFwKKwlPQkpfTkFNRV9hZGQoKGFsaWFzKSxPQkpfTkFNRV9UWVBFX0NJUEhFUl9NRVRIfE9CSl9OQU1FX0FMSUFTLChuKSkKKyNkZWZpbmUgRVZQX2FkZF9kaWdlc3RfYWxpYXMobixhbGlhcykgXAorCU9CSl9OQU1FX2FkZCgoYWxpYXMpLE9CSl9OQU1FX1RZUEVfTURfTUVUSHxPQkpfTkFNRV9BTElBUywobikpCisjZGVmaW5lIEVWUF9kZWxldGVfY2lwaGVyX2FsaWFzKGFsaWFzKSBcCisJT0JKX05BTUVfcmVtb3ZlKGFsaWFzLE9CSl9OQU1FX1RZUEVfQ0lQSEVSX01FVEh8T0JKX05BTUVfQUxJQVMpOworI2RlZmluZSBFVlBfZGVsZXRlX2RpZ2VzdF9hbGlhcyhhbGlhcykgXAorCU9CSl9OQU1FX3JlbW92ZShhbGlhcyxPQkpfTkFNRV9UWVBFX01EX01FVEh8T0JKX05BTUVfQUxJQVMpOworCit2b2lkCUVWUF9NRF9DVFhfaW5pdChFVlBfTURfQ1RYICpjdHgpOworaW50CUVWUF9NRF9DVFhfY2xlYW51cChFVlBfTURfQ1RYICpjdHgpOworRVZQX01EX0NUWCAqRVZQX01EX0NUWF9jcmVhdGUodm9pZCk7Cit2b2lkCUVWUF9NRF9DVFhfZGVzdHJveShFVlBfTURfQ1RYICpjdHgpOworaW50ICAgICBFVlBfTURfQ1RYX2NvcHlfZXgoRVZQX01EX0NUWCAqb3V0LGNvbnN0IEVWUF9NRF9DVFggKmluKTsgIAordm9pZAlFVlBfTURfQ1RYX3NldF9mbGFncyhFVlBfTURfQ1RYICpjdHgsIGludCBmbGFncyk7Cit2b2lkCUVWUF9NRF9DVFhfY2xlYXJfZmxhZ3MoRVZQX01EX0NUWCAqY3R4LCBpbnQgZmxhZ3MpOworaW50IAlFVlBfTURfQ1RYX3Rlc3RfZmxhZ3MoY29uc3QgRVZQX01EX0NUWCAqY3R4LGludCBmbGFncyk7CitpbnQJRVZQX0RpZ2VzdEluaXRfZXgoRVZQX01EX0NUWCAqY3R4LCBjb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqaW1wbCk7CitpbnQJRVZQX0RpZ2VzdFVwZGF0ZShFVlBfTURfQ1RYICpjdHgsY29uc3Qgdm9pZCAqZCwKKwkJCSBzaXplX3QgY250KTsKK2ludAlFVlBfRGlnZXN0RmluYWxfZXgoRVZQX01EX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm1kLHVuc2lnbmVkIGludCAqcyk7CitpbnQJRVZQX0RpZ2VzdChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQsCisJCXVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKnNpemUsIGNvbnN0IEVWUF9NRCAqdHlwZSwgRU5HSU5FICppbXBsKTsKKworaW50ICAgICBFVlBfTURfQ1RYX2NvcHkoRVZQX01EX0NUWCAqb3V0LGNvbnN0IEVWUF9NRF9DVFggKmluKTsgIAoraW50CUVWUF9EaWdlc3RJbml0KEVWUF9NRF9DVFggKmN0eCwgY29uc3QgRVZQX01EICp0eXBlKTsKK2ludAlFVlBfRGlnZXN0RmluYWwoRVZQX01EX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm1kLHVuc2lnbmVkIGludCAqcyk7CisKK2ludAlFVlBfcmVhZF9wd19zdHJpbmcoY2hhciAqYnVmLGludCBsZW5ndGgsY29uc3QgY2hhciAqcHJvbXB0LGludCB2ZXJpZnkpOworaW50CUVWUF9yZWFkX3B3X3N0cmluZ19taW4oY2hhciAqYnVmLGludCBtaW5sZW4saW50IG1heGxlbixjb25zdCBjaGFyICpwcm9tcHQsaW50IHZlcmlmeSk7Cit2b2lkCUVWUF9zZXRfcHdfcHJvbXB0KGNvbnN0IGNoYXIgKnByb21wdCk7CitjaGFyICoJRVZQX2dldF9wd19wcm9tcHQodm9pZCk7CisKK2ludAlFVlBfQnl0ZXNUb0tleShjb25zdCBFVlBfQ0lQSEVSICp0eXBlLGNvbnN0IEVWUF9NRCAqbWQsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCWludCBkYXRhbCwgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICprZXksdW5zaWduZWQgY2hhciAqaXYpOworCit2b2lkCUVWUF9DSVBIRVJfQ1RYX3NldF9mbGFncyhFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgZmxhZ3MpOwordm9pZAlFVlBfQ0lQSEVSX0NUWF9jbGVhcl9mbGFncyhFVlBfQ0lQSEVSX0NUWCAqY3R4LCBpbnQgZmxhZ3MpOworaW50IAlFVlBfQ0lQSEVSX0NUWF90ZXN0X2ZsYWdzKGNvbnN0IEVWUF9DSVBIRVJfQ1RYICpjdHgsaW50IGZsYWdzKTsKKworaW50CUVWUF9FbmNyeXB0SW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICppdik7CitpbnQJRVZQX0VuY3J5cHRJbml0X2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBFTkdJTkUgKmltcGwsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqaXYpOworaW50CUVWUF9FbmNyeXB0VXBkYXRlKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJaW50ICpvdXRsLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGlubCk7CitpbnQJRVZQX0VuY3J5cHRGaW5hbF9leChFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCk7CitpbnQJRVZQX0VuY3J5cHRGaW5hbChFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCk7CisKK2ludAlFVlBfRGVjcnlwdEluaXQoRVZQX0NJUEhFUl9DVFggKmN0eCxjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgY29uc3QgdW5zaWduZWQgY2hhciAqaXYpOworaW50CUVWUF9EZWNyeXB0SW5pdF9leChFVlBfQ0lQSEVSX0NUWCAqY3R4LGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwgRU5HSU5FICppbXBsLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICprZXksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2KTsKK2ludAlFVlBfRGVjcnlwdFVwZGF0ZShFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCWludCAqb3V0bCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmwpOworaW50CUVWUF9EZWNyeXB0RmluYWwoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqb3V0bSwgaW50ICpvdXRsKTsKK2ludAlFVlBfRGVjcnlwdEZpbmFsX2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dG0sIGludCAqb3V0bCk7CisKK2ludAlFVlBfQ2lwaGVySW5pdChFVlBfQ0lQSEVSX0NUWCAqY3R4LGNvbnN0IEVWUF9DSVBIRVIgKmNpcGhlciwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSxjb25zdCB1bnNpZ25lZCBjaGFyICppdiwKKwkJICAgICAgIGludCBlbmMpOworaW50CUVWUF9DaXBoZXJJbml0X2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBFTkdJTkUgKmltcGwsCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksY29uc3QgdW5zaWduZWQgY2hhciAqaXYsCisJCSAgICAgICBpbnQgZW5jKTsKK2ludAlFVlBfQ2lwaGVyVXBkYXRlKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJaW50ICpvdXRsLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgaW50IGlubCk7CitpbnQJRVZQX0NpcGhlckZpbmFsKEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dG0sIGludCAqb3V0bCk7CitpbnQJRVZQX0NpcGhlckZpbmFsX2V4KEVWUF9DSVBIRVJfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dG0sIGludCAqb3V0bCk7CisKK2ludAlFVlBfU2lnbkZpbmFsKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICptZCx1bnNpZ25lZCBpbnQgKnMsCisJCUVWUF9QS0VZICpwa2V5KTsKKworaW50CUVWUF9WZXJpZnlGaW5hbChFVlBfTURfQ1RYICpjdHgsY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLAorCQl1bnNpZ25lZCBpbnQgc2lnbGVuLEVWUF9QS0VZICpwa2V5KTsKKworaW50CUVWUF9EaWdlc3RTaWduSW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqKnBjdHgsCisJCQljb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqZSwgRVZQX1BLRVkgKnBrZXkpOworaW50CUVWUF9EaWdlc3RTaWduRmluYWwoRVZQX01EX0NUWCAqY3R4LAorCQkJdW5zaWduZWQgY2hhciAqc2lncmV0LCBzaXplX3QgKnNpZ2xlbik7CisKK2ludAlFVlBfRGlnZXN0VmVyaWZ5SW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9QS0VZX0NUWCAqKnBjdHgsCisJCQljb25zdCBFVlBfTUQgKnR5cGUsIEVOR0lORSAqZSwgRVZQX1BLRVkgKnBrZXkpOworaW50CUVWUF9EaWdlc3RWZXJpZnlGaW5hbChFVlBfTURfQ1RYICpjdHgsCisJCQl1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCBzaWdsZW4pOworCitpbnQJRVZQX09wZW5Jbml0KEVWUF9DSVBIRVJfQ1RYICpjdHgsY29uc3QgRVZQX0NJUEhFUiAqdHlwZSwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqZWssIGludCBla2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKml2LAorCQlFVlBfUEtFWSAqcHJpdik7CitpbnQJRVZQX09wZW5GaW5hbChFVlBfQ0lQSEVSX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCk7CisKK2ludAlFVlBfU2VhbEluaXQoRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgRVZQX0NJUEhFUiAqdHlwZSwKKwkJIHVuc2lnbmVkIGNoYXIgKiplaywgaW50ICpla2wsIHVuc2lnbmVkIGNoYXIgKml2LAorCQlFVlBfUEtFWSAqKnB1YmssIGludCBucHViayk7CitpbnQJRVZQX1NlYWxGaW5hbChFVlBfQ0lQSEVSX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgKm91dGwpOworCit2b2lkCUVWUF9FbmNvZGVJbml0KEVWUF9FTkNPREVfQ1RYICpjdHgpOwordm9pZAlFVlBfRW5jb2RlVXBkYXRlKEVWUF9FTkNPREVfQ1RYICpjdHgsdW5zaWduZWQgY2hhciAqb3V0LGludCAqb3V0bCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4saW50IGlubCk7Cit2b2lkCUVWUF9FbmNvZGVGaW5hbChFVlBfRU5DT0RFX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgKm91dGwpOworaW50CUVWUF9FbmNvZGVCbG9jayh1bnNpZ25lZCBjaGFyICp0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpmLCBpbnQgbik7CisKK3ZvaWQJRVZQX0RlY29kZUluaXQoRVZQX0VOQ09ERV9DVFggKmN0eCk7CitpbnQJRVZQX0RlY29kZVVwZGF0ZShFVlBfRU5DT0RFX0NUWCAqY3R4LHVuc2lnbmVkIGNoYXIgKm91dCxpbnQgKm91dGwsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgaW5sKTsKK2ludAlFVlBfRGVjb2RlRmluYWwoRVZQX0VOQ09ERV9DVFggKmN0eCwgdW5zaWduZWQKKwkJY2hhciAqb3V0LCBpbnQgKm91dGwpOworaW50CUVWUF9EZWNvZGVCbG9jayh1bnNpZ25lZCBjaGFyICp0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpmLCBpbnQgbik7CisKK3ZvaWQgRVZQX0NJUEhFUl9DVFhfaW5pdChFVlBfQ0lQSEVSX0NUWCAqYSk7CitpbnQgRVZQX0NJUEhFUl9DVFhfY2xlYW51cChFVlBfQ0lQSEVSX0NUWCAqYSk7CitFVlBfQ0lQSEVSX0NUWCAqRVZQX0NJUEhFUl9DVFhfbmV3KHZvaWQpOwordm9pZCBFVlBfQ0lQSEVSX0NUWF9mcmVlKEVWUF9DSVBIRVJfQ1RYICphKTsKK2ludCBFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aChFVlBfQ0lQSEVSX0NUWCAqeCwgaW50IGtleWxlbik7CitpbnQgRVZQX0NJUEhFUl9DVFhfc2V0X3BhZGRpbmcoRVZQX0NJUEhFUl9DVFggKmMsIGludCBwYWQpOworaW50IEVWUF9DSVBIRVJfQ1RYX2N0cmwoRVZQX0NJUEhFUl9DVFggKmN0eCwgaW50IHR5cGUsIGludCBhcmcsIHZvaWQgKnB0cik7CitpbnQgRVZQX0NJUEhFUl9DVFhfcmFuZF9rZXkoRVZQX0NJUEhFUl9DVFggKmN0eCwgdW5zaWduZWQgY2hhciAqa2V5KTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworQklPX01FVEhPRCAqQklPX2ZfbWQodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fZl9iYXNlNjQodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fZl9jaXBoZXIodm9pZCk7CitCSU9fTUVUSE9EICpCSU9fZl9yZWxpYWJsZSh2b2lkKTsKK3ZvaWQgQklPX3NldF9jaXBoZXIoQklPICpiLGNvbnN0IEVWUF9DSVBIRVIgKmMsY29uc3QgdW5zaWduZWQgY2hhciAqaywKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaSwgaW50IGVuYyk7CisjZW5kaWYKKworY29uc3QgRVZQX01EICpFVlBfbWRfbnVsbCh2b2lkKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDIKK2NvbnN0IEVWUF9NRCAqRVZQX21kMih2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX01ENAorY29uc3QgRVZQX01EICpFVlBfbWQ0KHZvaWQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1Citjb25zdCBFVlBfTUQgKkVWUF9tZDUodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYSh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTEodm9pZCk7Citjb25zdCBFVlBfTUQgKkVWUF9kc3Modm9pZCk7Citjb25zdCBFVlBfTUQgKkVWUF9kc3MxKHZvaWQpOworY29uc3QgRVZQX01EICpFVlBfZWNkc2Eodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEyNTYKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTIyNCh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX3NoYTI1Nih2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NIQTUxMgorY29uc3QgRVZQX01EICpFVlBfc2hhMzg0KHZvaWQpOworY29uc3QgRVZQX01EICpFVlBfc2hhNTEyKHZvaWQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fTURDMgorY29uc3QgRVZQX01EICpFVlBfbWRjMih2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JJUEVNRAorY29uc3QgRVZQX01EICpFVlBfcmlwZW1kMTYwKHZvaWQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fV0hJUkxQT09MCitjb25zdCBFVlBfTUQgKkVWUF93aGlybHBvb2wodm9pZCk7CisjZW5kaWYKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9lbmNfbnVsbCh2b2lkKTsJCS8qIGRvZXMgbm90aGluZyA6LSkgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19ERVMKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGUodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZV9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19jZmI2NCh2b2lkKTsKKyMgZGVmaW5lIEVWUF9kZXNfY2ZiIEVWUF9kZXNfY2ZiNjQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfY2ZiMSh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfY2ZiOCh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlX2NmYjY0KHZvaWQpOworIyBkZWZpbmUgRVZQX2Rlc19lZGVfY2ZiIEVWUF9kZXNfZWRlX2NmYjY0CisjaWYgMAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19lZGVfY2ZiMSh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlX2NmYjgodm9pZCk7CisjZW5kaWYKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlM19jZmI2NCh2b2lkKTsKKyMgZGVmaW5lIEVWUF9kZXNfZWRlM19jZmIgRVZQX2Rlc19lZGUzX2NmYjY0Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfY2ZiMSh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXNfZWRlM19jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19vZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZV9vZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfb2ZiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc19jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZV9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfZGVzX2VkZTNfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Rlc3hfY2JjKHZvaWQpOworLyogVGhpcyBzaG91bGQgbm93IGJlIHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBkZXZfY3J5cHRvIEVOR0lORS4gQnV0IGFsc28sIHdoeSBhcmUKKyAqIHJjNCBhbmQgbWQ1IGRlY2xhcmF0aW9ucyBtYWRlIGhlcmUgaW5zaWRlIGEgIk5PX0RFUyIgcHJlY29tcGlsZXIgYnJhbmNoPyAqLworI2lmIDAKKyMgaWZkZWYgT1BFTlNTTF9PUEVOQlNEX0RFVl9DUllQVE8KK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXZfY3J5cHRvX2Rlc19lZGUzX2NiYyh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9kZXZfY3J5cHRvX3JjNCh2b2lkKTsKK2NvbnN0IEVWUF9NRCAqRVZQX2Rldl9jcnlwdG9fbWQ1KHZvaWQpOworIyBlbmRpZgorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzQodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmM0XzQwKHZvaWQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2lkZWFfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2lkZWFfY2ZiNjQodm9pZCk7CisjIGRlZmluZSBFVlBfaWRlYV9jZmIgRVZQX2lkZWFfY2ZiNjQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9pZGVhX29mYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9pZGVhX2NiYyh2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1JDMgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmMyX2NiYyh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzJfNDBfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl82NF9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmMyX2NmYjY0KHZvaWQpOworIyBkZWZpbmUgRVZQX3JjMl9jZmIgRVZQX3JjMl9jZmI2NAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjMl9vZmIodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CRgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2JmX2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9iZl9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYmZfY2ZiNjQodm9pZCk7CisjIGRlZmluZSBFVlBfYmZfY2ZiIEVWUF9iZl9jZmI2NAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2JmX29mYih2b2lkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYXN0NV9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfY2FzdDVfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Nhc3Q1X2NmYjY0KHZvaWQpOworIyBkZWZpbmUgRVZQX2Nhc3Q1X2NmYiBFVlBfY2FzdDVfY2ZiNjQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYXN0NV9vZmIodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9yYzVfMzJfMTJfMTZfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjNV8zMl8xMl8xNl9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfcmM1XzMyXzEyXzE2X2NmYjY0KHZvaWQpOworIyBkZWZpbmUgRVZQX3JjNV8zMl8xMl8xNl9jZmIgRVZQX3JjNV8zMl8xMl8xNl9jZmI2NAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX3JjNV8zMl8xMl8xNl9vZmIodm9pZCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTI4X2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTI4X2NiYyh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTI4X2NmYjEodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzEyOF9jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfY2ZiMTI4KHZvaWQpOworIyBkZWZpbmUgRVZQX2Flc18xMjhfY2ZiIEVWUF9hZXNfMTI4X2NmYjEyOAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xMjhfb2ZiKHZvaWQpOworI2lmIDAKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTI4X2N0cih2b2lkKTsKKyNlbmRpZgorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xOTJfZWNiKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xOTJfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xOTJfY2ZiMSh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMTkyX2NmYjgodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzE5Ml9jZmIxMjgodm9pZCk7CisjIGRlZmluZSBFVlBfYWVzXzE5Ml9jZmIgRVZQX2Flc18xOTJfY2ZiMTI4Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzE5Ml9vZmIodm9pZCk7CisjaWYgMAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18xOTJfY3RyKHZvaWQpOworI2VuZGlmCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9lY2Iodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jYmModm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jZmIxKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2Flc18yNTZfY2ZiOCh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMjU2X2NmYjEyOCh2b2lkKTsKKyMgZGVmaW5lIEVWUF9hZXNfMjU2X2NmYiBFVlBfYWVzXzI1Nl9jZmIxMjgKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9hZXNfMjU2X29mYih2b2lkKTsKKyNpZiAwCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfYWVzXzI1Nl9jdHIodm9pZCk7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCitjb25zdCBFVlBfQ0lQSEVSICpFVlBfY2FtZWxsaWFfMTI4X2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYW1lbGxpYV8xMjhfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzEyOF9jZmIxKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzEyOF9jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzEyOF9jZmIxMjgodm9pZCk7CisjIGRlZmluZSBFVlBfY2FtZWxsaWFfMTI4X2NmYiBFVlBfY2FtZWxsaWFfMTI4X2NmYjEyOAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzEyOF9vZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfY2FtZWxsaWFfMTkyX2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYW1lbGxpYV8xOTJfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzE5Ml9jZmIxKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzE5Ml9jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzE5Ml9jZmIxMjgodm9pZCk7CisjIGRlZmluZSBFVlBfY2FtZWxsaWFfMTkyX2NmYiBFVlBfY2FtZWxsaWFfMTkyX2NmYjEyOAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzE5Ml9vZmIodm9pZCk7Citjb25zdCBFVlBfQ0lQSEVSICpFVlBfY2FtZWxsaWFfMjU2X2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9jYW1lbGxpYV8yNTZfY2JjKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzI1Nl9jZmIxKHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzI1Nl9jZmI4KHZvaWQpOworY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzI1Nl9jZmIxMjgodm9pZCk7CisjIGRlZmluZSBFVlBfY2FtZWxsaWFfMjU2X2NmYiBFVlBfY2FtZWxsaWFfMjU2X2NmYjEyOAorY29uc3QgRVZQX0NJUEhFUiAqRVZQX2NhbWVsbGlhXzI1Nl9vZmIodm9pZCk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX2VjYih2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX2NiYyh2b2lkKTsKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX2NmYjEyOCh2b2lkKTsKKyMgZGVmaW5lIEVWUF9zZWVkX2NmYiBFVlBfc2VlZF9jZmIxMjgKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9zZWVkX29mYih2b2lkKTsKKyNlbmRpZgorCit2b2lkIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX25vY29uZih2b2lkKTsKK3ZvaWQgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfY29uZih2b2lkKTsKKworI2lmZGVmIE9QRU5TU0xfTE9BRF9DT05GCisjZGVmaW5lIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgXAorCQlPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19jb25mKCkKKyNlbHNlCisjZGVmaW5lIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgXAorCQlPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYoKQorI2VuZGlmCisKK3ZvaWQgT3BlblNTTF9hZGRfYWxsX2NpcGhlcnModm9pZCk7Cit2b2lkIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKHZvaWQpOworI2RlZmluZSBTU0xlYXlfYWRkX2FsbF9hbGdvcml0aG1zKCkgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKQorI2RlZmluZSBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgT3BlblNTTF9hZGRfYWxsX2NpcGhlcnMoKQorI2RlZmluZSBTU0xlYXlfYWRkX2FsbF9kaWdlc3RzKCkgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKQorCitpbnQgRVZQX2FkZF9jaXBoZXIoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKK2ludCBFVlBfYWRkX2RpZ2VzdChjb25zdCBFVlBfTUQgKmRpZ2VzdCk7CisKK2NvbnN0IEVWUF9DSVBIRVIgKkVWUF9nZXRfY2lwaGVyYnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworY29uc3QgRVZQX01EICpFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgRVZQX2NsZWFudXAodm9pZCk7CisKK3ZvaWQgRVZQX0NJUEhFUl9kb19hbGwodm9pZCAoKmZuKShjb25zdCBFVlBfQ0lQSEVSICpjaXBoLAorCQljb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywgdm9pZCAqeCksIHZvaWQgKmFyZyk7Cit2b2lkIEVWUF9DSVBIRVJfZG9fYWxsX3NvcnRlZCh2b2lkICgqZm4pKGNvbnN0IEVWUF9DSVBIRVIgKmNpcGgsCisJCWNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvLCB2b2lkICp4KSwgdm9pZCAqYXJnKTsKKwordm9pZCBFVlBfTURfZG9fYWxsKHZvaWQgKCpmbikoY29uc3QgRVZQX01EICpjaXBoLAorCQljb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywgdm9pZCAqeCksIHZvaWQgKmFyZyk7Cit2b2lkIEVWUF9NRF9kb19hbGxfc29ydGVkKHZvaWQgKCpmbikoY29uc3QgRVZQX01EICpjaXBoLAorCQljb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bywgdm9pZCAqeCksIHZvaWQgKmFyZyk7CisKK2ludAkJRVZQX1BLRVlfZGVjcnlwdF9vbGQodW5zaWduZWQgY2hhciAqZGVjX2tleSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuY19rZXksaW50IGVuY19rZXlfbGVuLAorCQkJRVZQX1BLRVkgKnByaXZhdGVfa2V5KTsKK2ludAkJRVZQX1BLRVlfZW5jcnlwdF9vbGQodW5zaWduZWQgY2hhciAqZW5jX2tleSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSxpbnQga2V5X2xlbiwKKwkJCUVWUF9QS0VZICpwdWJfa2V5KTsKK2ludAkJRVZQX1BLRVlfdHlwZShpbnQgdHlwZSk7CitpbnQJCUVWUF9QS0VZX2lkKGNvbnN0IEVWUF9QS0VZICpwa2V5KTsKK2ludAkJRVZQX1BLRVlfYmFzZV9pZChjb25zdCBFVlBfUEtFWSAqcGtleSk7CitpbnQJCUVWUF9QS0VZX2JpdHMoRVZQX1BLRVkgKnBrZXkpOworaW50CQlFVlBfUEtFWV9zaXplKEVWUF9QS0VZICpwa2V5KTsKK2ludCAJCUVWUF9QS0VZX3NldF90eXBlKEVWUF9QS0VZICpwa2V5LGludCB0eXBlKTsKK2ludAkJRVZQX1BLRVlfc2V0X3R5cGVfc3RyKEVWUF9QS0VZICpwa2V5LCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4pOworaW50IAkJRVZQX1BLRVlfYXNzaWduKEVWUF9QS0VZICpwa2V5LGludCB0eXBlLHZvaWQgKmtleSk7Cit2b2lkICoJCUVWUF9QS0VZX2dldDAoRVZQX1BLRVkgKnBrZXkpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitzdHJ1Y3QgcnNhX3N0OworaW50IEVWUF9QS0VZX3NldDFfUlNBKEVWUF9QS0VZICpwa2V5LHN0cnVjdCByc2Ffc3QgKmtleSk7CitzdHJ1Y3QgcnNhX3N0ICpFVlBfUEtFWV9nZXQxX1JTQShFVlBfUEtFWSAqcGtleSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKK3N0cnVjdCBkc2Ffc3Q7CitpbnQgRVZQX1BLRVlfc2V0MV9EU0EoRVZQX1BLRVkgKnBrZXksc3RydWN0IGRzYV9zdCAqa2V5KTsKK3N0cnVjdCBkc2Ffc3QgKkVWUF9QS0VZX2dldDFfRFNBKEVWUF9QS0VZICpwa2V5KTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICitzdHJ1Y3QgZGhfc3Q7CitpbnQgRVZQX1BLRVlfc2V0MV9ESChFVlBfUEtFWSAqcGtleSxzdHJ1Y3QgZGhfc3QgKmtleSk7CitzdHJ1Y3QgZGhfc3QgKkVWUF9QS0VZX2dldDFfREgoRVZQX1BLRVkgKnBrZXkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKK3N0cnVjdCBlY19rZXlfc3Q7CitpbnQgRVZQX1BLRVlfc2V0MV9FQ19LRVkoRVZQX1BLRVkgKnBrZXksc3RydWN0IGVjX2tleV9zdCAqa2V5KTsKK3N0cnVjdCBlY19rZXlfc3QgKkVWUF9QS0VZX2dldDFfRUNfS0VZKEVWUF9QS0VZICpwa2V5KTsKKyNlbmRpZgorCitFVlBfUEtFWSAqCUVWUF9QS0VZX25ldyh2b2lkKTsKK3ZvaWQJCUVWUF9QS0VZX2ZyZWUoRVZQX1BLRVkgKnBrZXkpOworCitFVlBfUEtFWSAqCWQyaV9QdWJsaWNLZXkoaW50IHR5cGUsRVZQX1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CitpbnQJCWkyZF9QdWJsaWNLZXkoRVZQX1BLRVkgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCk7CisKK0VWUF9QS0VZICoJZDJpX1ByaXZhdGVLZXkoaW50IHR5cGUsRVZQX1BLRVkgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CitFVlBfUEtFWSAqCWQyaV9BdXRvUHJpdmF0ZUtleShFVlBfUEtFWSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKK2ludAkJaTJkX1ByaXZhdGVLZXkoRVZQX1BLRVkgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCk7CisKK2ludCBFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMoRVZQX1BLRVkgKnRvLCBjb25zdCBFVlBfUEtFWSAqZnJvbSk7CitpbnQgRVZQX1BLRVlfbWlzc2luZ19wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICpwa2V5KTsKK2ludCBFVlBfUEtFWV9zYXZlX3BhcmFtZXRlcnMoRVZQX1BLRVkgKnBrZXksaW50IG1vZGUpOworaW50IEVWUF9QS0VZX2NtcF9wYXJhbWV0ZXJzKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYik7CisKK2ludCBFVlBfUEtFWV9jbXAoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKTsKKworaW50IEVWUF9QS0VZX3ByaW50X3B1YmxpYyhCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksCisJCQkJaW50IGluZGVudCwgQVNOMV9QQ1RYICpwY3R4KTsKK2ludCBFVlBfUEtFWV9wcmludF9wcml2YXRlKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwKKwkJCQlpbnQgaW5kZW50LCBBU04xX1BDVFggKnBjdHgpOworaW50IEVWUF9QS0VZX3ByaW50X3BhcmFtcyhCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksCisJCQkJaW50IGluZGVudCwgQVNOMV9QQ1RYICpwY3R4KTsKKworaW50IEVWUF9QS0VZX2dldF9kZWZhdWx0X2RpZ2VzdF9uaWQoRVZQX1BLRVkgKnBrZXksIGludCAqcG5pZCk7CisKK2ludCBFVlBfQ0lQSEVSX3R5cGUoY29uc3QgRVZQX0NJUEhFUiAqY3R4KTsKKworLyogY2FsbHMgbWV0aG9kcyAqLworaW50IEVWUF9DSVBIRVJfcGFyYW1fdG9fYXNuMShFVlBfQ0lQSEVSX0NUWCAqYywgQVNOMV9UWVBFICp0eXBlKTsKK2ludCBFVlBfQ0lQSEVSX2FzbjFfdG9fcGFyYW0oRVZQX0NJUEhFUl9DVFggKmMsIEFTTjFfVFlQRSAqdHlwZSk7CisKKy8qIFRoZXNlIGFyZSB1c2VkIGJ5IEVWUF9DSVBIRVIgbWV0aG9kcyAqLworaW50IEVWUF9DSVBIRVJfc2V0X2FzbjFfaXYoRVZQX0NJUEhFUl9DVFggKmMsQVNOMV9UWVBFICp0eXBlKTsKK2ludCBFVlBfQ0lQSEVSX2dldF9hc24xX2l2KEVWUF9DSVBIRVJfQ1RYICpjLEFTTjFfVFlQRSAqdHlwZSk7CisKKy8qIFBLQ1M1IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gKi8KK2ludCBQS0NTNV9QQkVfa2V5aXZnZW4oRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkgQVNOMV9UWVBFICpwYXJhbSwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBFVlBfTUQgKm1kLAorCQkJIGludCBlbl9kZSk7CitpbnQgUEtDUzVfUEJLREYyX0hNQUNfU0hBMShjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLCBpbnQgaXRlciwKKwkJCSAgIGludCBrZXlsZW4sIHVuc2lnbmVkIGNoYXIgKm91dCk7CitpbnQgUEtDUzVfUEJLREYyX0hNQUMoY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbiwgaW50IGl0ZXIsCisJCQkgICBjb25zdCBFVlBfTUQgKmRpZ2VzdCwKKwkJICAgICAgaW50IGtleWxlbiwgdW5zaWduZWQgY2hhciAqb3V0KTsKK2ludCBQS0NTNV92Ml9QQkVfa2V5aXZnZW4oRVZQX0NJUEhFUl9DVFggKmN0eCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkgQVNOMV9UWVBFICpwYXJhbSwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBjb25zdCBFVlBfTUQgKm1kLAorCQkJIGludCBlbl9kZSk7CisKK3ZvaWQgUEtDUzVfUEJFX2FkZCh2b2lkKTsKKworaW50IEVWUF9QQkVfQ2lwaGVySW5pdCAoQVNOMV9PQkpFQ1QgKnBiZV9vYmosIGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCSAgICAgQVNOMV9UWVBFICpwYXJhbSwgRVZQX0NJUEhFUl9DVFggKmN0eCwgaW50IGVuX2RlKTsKKworLyogUEJFIHR5cGUgKi8KKworLyogQ2FuIGFwcGVhciBhcyB0aGUgb3V0ZXJtb3N0IEFsZ29yaXRobUlkZW50aWZpZXIgKi8KKyNkZWZpbmUgRVZQX1BCRV9UWVBFX09VVEVSCTB4MAorLyogSXMgYW4gUFJGIHR5cGUgT0lEICovCisjZGVmaW5lIEVWUF9QQkVfVFlQRV9QUkYJMHgxCisKK2ludCBFVlBfUEJFX2FsZ19hZGRfdHlwZShpbnQgcGJlX3R5cGUsIGludCBwYmVfbmlkLCBpbnQgY2lwaGVyX25pZCwgaW50IG1kX25pZCwKKwkgICAgIEVWUF9QQkVfS0VZR0VOICprZXlnZW4pOworaW50IEVWUF9QQkVfYWxnX2FkZChpbnQgbmlkLCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIGNvbnN0IEVWUF9NRCAqbWQsCisJCSAgICBFVlBfUEJFX0tFWUdFTiAqa2V5Z2VuKTsKK2ludCBFVlBfUEJFX2ZpbmQoaW50IHR5cGUsIGludCBwYmVfbmlkLAorCQkJaW50ICpwY25pZCwgaW50ICpwbW5pZCwgRVZQX1BCRV9LRVlHRU4gKipwa2V5Z2VuKTsKK3ZvaWQgRVZQX1BCRV9jbGVhbnVwKHZvaWQpOworCisjZGVmaW5lIEFTTjFfUEtFWV9BTElBUwkJMHgxCisjZGVmaW5lIEFTTjFfUEtFWV9EWU5BTUlDCTB4MgorI2RlZmluZSBBU04xX1BLRVlfU0lHUEFSQU1fTlVMTAkweDQKKworI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9QS0NTN19TSUdOCTB4MQorI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9QS0NTN19FTkNSWVBUCTB4MgorI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9ERUZBVUxUX01EX05JRAkweDMKKyNkZWZpbmUgQVNOMV9QS0VZX0NUUkxfQ01TX1NJR04JCTB4NQorI2RlZmluZSBBU04xX1BLRVlfQ1RSTF9DTVNfRU5WRUxPUEUJMHg3CisKK2ludCBFVlBfUEtFWV9hc24xX2dldF9jb3VudCh2b2lkKTsKK2NvbnN0IEVWUF9QS0VZX0FTTjFfTUVUSE9EICpFVlBfUEtFWV9hc24xX2dldDAoaW50IGlkeCk7Citjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRVZQX1BLRVlfYXNuMV9maW5kKEVOR0lORSAqKnBlLCBpbnQgdHlwZSk7Citjb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqRVZQX1BLRVlfYXNuMV9maW5kX3N0cihFTkdJTkUgKipwZSwKKwkJCQkJY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKTsKK2ludCBFVlBfUEtFWV9hc24xX2FkZDAoY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoKTsKK2ludCBFVlBfUEtFWV9hc24xX2FkZF9hbGlhcyhpbnQgdG8sIGludCBmcm9tKTsKK2ludCBFVlBfUEtFWV9hc24xX2dldDBfaW5mbyhpbnQgKnBwa2V5X2lkLCBpbnQgKnBrZXlfYmFzZV9pZCwgaW50ICpwcGtleV9mbGFncywKKwkJCQljb25zdCBjaGFyICoqcGluZm8sIGNvbnN0IGNoYXIgKipwcGVtX3N0ciwKKwkJCQkJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoKTsKKworY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QqIEVWUF9QS0VZX2dldDBfYXNuMShFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWV9BU04xX01FVEhPRCogRVZQX1BLRVlfYXNuMV9uZXcoaW50IGlkLCBpbnQgZmxhZ3MsCisJCQkJCWNvbnN0IGNoYXIgKnBlbV9zdHIsIGNvbnN0IGNoYXIgKmluZm8pOwordm9pZCBFVlBfUEtFWV9hc24xX2NvcHkoRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmRzdCwgCisJCQljb25zdCBFVlBfUEtFWV9BU04xX01FVEhPRCAqc3JjKTsKK3ZvaWQgRVZQX1BLRVlfYXNuMV9mcmVlKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCk7Cit2b2lkIEVWUF9QS0VZX2FzbjFfc2V0X3B1YmxpYyhFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGgsCisJCWludCAoKnB1Yl9kZWNvZGUpKEVWUF9QS0VZICpwaywgWDUwOV9QVUJLRVkgKnB1YiksCisJCWludCAoKnB1Yl9lbmNvZGUpKFg1MDlfUFVCS0VZICpwdWIsIGNvbnN0IEVWUF9QS0VZICpwayksCisJCWludCAoKnB1Yl9jbXApKGNvbnN0IEVWUF9QS0VZICphLCBjb25zdCBFVlBfUEtFWSAqYiksCisJCWludCAoKnB1Yl9wcmludCkoQklPICpvdXQsIGNvbnN0IEVWUF9QS0VZICpwa2V5LCBpbnQgaW5kZW50LAorCQkJCQkJCUFTTjFfUENUWCAqcGN0eCksCisJCWludCAoKnBrZXlfc2l6ZSkoY29uc3QgRVZQX1BLRVkgKnBrKSwKKwkJaW50ICgqcGtleV9iaXRzKShjb25zdCBFVlBfUEtFWSAqcGspKTsKK3ZvaWQgRVZQX1BLRVlfYXNuMV9zZXRfcHJpdmF0ZShFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGgsCisJCWludCAoKnByaXZfZGVjb2RlKShFVlBfUEtFWSAqcGssIFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKSwKKwkJaW50ICgqcHJpdl9lbmNvZGUpKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4LCBjb25zdCBFVlBfUEtFWSAqcGspLAorCQlpbnQgKCpwcml2X3ByaW50KShCSU8gKm91dCwgY29uc3QgRVZQX1BLRVkgKnBrZXksIGludCBpbmRlbnQsCisJCQkJCQkJQVNOMV9QQ1RYICpwY3R4KSk7Cit2b2lkIEVWUF9QS0VZX2FzbjFfc2V0X3BhcmFtKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJaW50ICgqcGFyYW1fZGVjb2RlKShFVlBfUEtFWSAqcGtleSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGRlciwgaW50IGRlcmxlbiksCisJCWludCAoKnBhcmFtX2VuY29kZSkoY29uc3QgRVZQX1BLRVkgKnBrZXksIHVuc2lnbmVkIGNoYXIgKipwZGVyKSwKKwkJaW50ICgqcGFyYW1fbWlzc2luZykoY29uc3QgRVZQX1BLRVkgKnBrKSwKKwkJaW50ICgqcGFyYW1fY29weSkoRVZQX1BLRVkgKnRvLCBjb25zdCBFVlBfUEtFWSAqZnJvbSksCisJCWludCAoKnBhcmFtX2NtcCkoY29uc3QgRVZQX1BLRVkgKmEsIGNvbnN0IEVWUF9QS0VZICpiKSwKKwkJaW50ICgqcGFyYW1fcHJpbnQpKEJJTyAqb3V0LCBjb25zdCBFVlBfUEtFWSAqcGtleSwgaW50IGluZGVudCwKKwkJCQkJCQlBU04xX1BDVFggKnBjdHgpKTsKKwordm9pZCBFVlBfUEtFWV9hc24xX3NldF9mcmVlKEVWUF9QS0VZX0FTTjFfTUVUSE9EICphbWV0aCwKKwkJdm9pZCAoKnBrZXlfZnJlZSkoRVZQX1BLRVkgKnBrZXkpKTsKK3ZvaWQgRVZQX1BLRVlfYXNuMV9zZXRfY3RybChFVlBfUEtFWV9BU04xX01FVEhPRCAqYW1ldGgsCisJCWludCAoKnBrZXlfY3RybCkoRVZQX1BLRVkgKnBrZXksIGludCBvcCwKKwkJCQkJCQlsb25nIGFyZzEsIHZvaWQgKmFyZzIpKTsKKworCisjZGVmaW5lIEVWUF9QS0VZX09QX1VOREVGSU5FRAkJMAorI2RlZmluZSBFVlBfUEtFWV9PUF9QQVJBTUdFTgkJKDE8PDEpCisjZGVmaW5lIEVWUF9QS0VZX09QX0tFWUdFTgkJKDE8PDIpCisjZGVmaW5lIEVWUF9QS0VZX09QX1NJR04JCSgxPDwzKQorI2RlZmluZSBFVlBfUEtFWV9PUF9WRVJJRlkJCSgxPDw0KQorI2RlZmluZSBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSCSgxPDw1KQorI2RlZmluZSBFVlBfUEtFWV9PUF9TSUdOQ1RYCQkoMTw8NikKKyNkZWZpbmUgRVZQX1BLRVlfT1BfVkVSSUZZQ1RYCQkoMTw8NykKKyNkZWZpbmUgRVZQX1BLRVlfT1BfRU5DUllQVAkJKDE8PDgpCisjZGVmaW5lIEVWUF9QS0VZX09QX0RFQ1JZUFQJCSgxPDw5KQorI2RlZmluZSBFVlBfUEtFWV9PUF9ERVJJVkUJCSgxPDwxMCkKKworI2RlZmluZSBFVlBfUEtFWV9PUF9UWVBFX1NJRwlcCisJKEVWUF9QS0VZX09QX1NJR04gfCBFVlBfUEtFWV9PUF9WRVJJRlkgfCBFVlBfUEtFWV9PUF9WRVJJRllSRUNPVkVSIFwKKwkJfCBFVlBfUEtFWV9PUF9TSUdOQ1RYIHwgRVZQX1BLRVlfT1BfVkVSSUZZQ1RYKQorCisjZGVmaW5lIEVWUF9QS0VZX09QX1RZUEVfQ1JZUFQgXAorCShFVlBfUEtFWV9PUF9FTkNSWVBUIHwgRVZQX1BLRVlfT1BfREVDUllQVCkKKworI2RlZmluZSBFVlBfUEtFWV9PUF9UWVBFX05PR0VOIFwKKwkoRVZQX1BLRVlfT1BfU0lHIHwgRVZQX1BLRVlfT1BfQ1JZUFQgfCBFVlBfUEtFWV9PUF9ERVJJVkUpCisKKyNkZWZpbmUgRVZQX1BLRVlfT1BfVFlQRV9HRU4gXAorCQkoRVZQX1BLRVlfT1BfUEFSQU1HRU4gfCBFVlBfUEtFWV9PUF9LRVlHRU4pCisKKyNkZWZpbmUJIEVWUF9QS0VZX0NUWF9zZXRfc2lnbmF0dXJlX21kKGN0eCwgbWQpCVwKKwkJRVZQX1BLRVlfQ1RYX2N0cmwoY3R4LCAtMSwgRVZQX1BLRVlfT1BfVFlQRV9TSUcsICBcCisJCQkJCUVWUF9QS0VZX0NUUkxfTUQsIDAsICh2b2lkICopbWQpCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9NRAkJMQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX1BFRVJfS0VZCQkyCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9QS0NTN19FTkNSWVBUCTMKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9QS0NTN19ERUNSWVBUCTQKKworI2RlZmluZSBFVlBfUEtFWV9DVFJMX1BLQ1M3X1NJR04JNQorCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfU0VUX01BQ19LRVkJNgorCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfRElHRVNUSU5JVAk3CisKKy8qIFVzZWQgYnkgR09TVCBrZXkgZW5jcnlwdGlvbiBpbiBUTFMgKi8KKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9TRVRfSVYgCQk4CisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9DTVNfRU5DUllQVAk5CisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfQ01TX0RFQ1JZUFQJMTAKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9DTVNfU0lHTgkJMTEKKworI2RlZmluZSBFVlBfUEtFWV9BTEdfQ1RSTAkJMHgxMDAwCisKKworI2RlZmluZSBFVlBfUEtFWV9GTEFHX0FVVE9BUkdMRU4JMgorCitjb25zdCBFVlBfUEtFWV9NRVRIT0QgKkVWUF9QS0VZX21ldGhfZmluZChpbnQgdHlwZSk7CitFVlBfUEtFWV9NRVRIT0QqIEVWUF9QS0VZX21ldGhfbmV3KGludCBpZCwgaW50IGZsYWdzKTsKK3ZvaWQgRVZQX1BLRVlfbWV0aF9mcmVlKEVWUF9QS0VZX01FVEhPRCAqcG1ldGgpOworaW50IEVWUF9QS0VZX21ldGhfYWRkMChjb25zdCBFVlBfUEtFWV9NRVRIT0QgKnBtZXRoKTsKKworRVZQX1BLRVlfQ1RYICpFVlBfUEtFWV9DVFhfbmV3KEVWUF9QS0VZICpwa2V5LCBFTkdJTkUgKmUpOworRVZQX1BLRVlfQ1RYICpFVlBfUEtFWV9DVFhfbmV3X2lkKGludCBpZCwgRU5HSU5FICplKTsKK0VWUF9QS0VZX0NUWCAqRVZQX1BLRVlfQ1RYX2R1cChFVlBfUEtFWV9DVFggKmN0eCk7Cit2b2lkIEVWUF9QS0VZX0NUWF9mcmVlKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworaW50IEVWUF9QS0VZX0NUWF9jdHJsKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQga2V5dHlwZSwgaW50IG9wdHlwZSwKKwkJCQlpbnQgY21kLCBpbnQgcDEsIHZvaWQgKnAyKTsKK2ludCBFVlBfUEtFWV9DVFhfY3RybF9zdHIoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKnR5cGUsCisJCQkJCQljb25zdCBjaGFyICp2YWx1ZSk7CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X29wZXJhdGlvbihFVlBfUEtFWV9DVFggKmN0eCk7Cit2b2lkIEVWUF9QS0VZX0NUWF9zZXQwX2tleWdlbl9pbmZvKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgKmRhdCwgaW50IGRhdGxlbik7CisKK0VWUF9QS0VZICpFVlBfUEtFWV9uZXdfbWFjX2tleShpbnQgdHlwZSwgRU5HSU5FICplLAorCQkJCXVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleWxlbik7CisKK3ZvaWQgRVZQX1BLRVlfQ1RYX3NldF9kYXRhKEVWUF9QS0VZX0NUWCAqY3R4LCB2b2lkICpkYXRhKTsKK3ZvaWQgKkVWUF9QS0VZX0NUWF9nZXRfZGF0YShFVlBfUEtFWV9DVFggKmN0eCk7CitFVlBfUEtFWSAqRVZQX1BLRVlfQ1RYX2dldDBfcGtleShFVlBfUEtFWV9DVFggKmN0eCk7CisKK0VWUF9QS0VZICpFVlBfUEtFWV9DVFhfZ2V0MF9wZWVya2V5KEVWUF9QS0VZX0NUWCAqY3R4KTsKKwordm9pZCBFVlBfUEtFWV9DVFhfc2V0X2FwcF9kYXRhKEVWUF9QS0VZX0NUWCAqY3R4LCB2b2lkICpkYXRhKTsKK3ZvaWQgKkVWUF9QS0VZX0NUWF9nZXRfYXBwX2RhdGEoRVZQX1BLRVlfQ1RYICpjdHgpOworCitpbnQgRVZQX1BLRVlfc2lnbl9pbml0KEVWUF9QS0VZX0NUWCAqY3R4KTsKK2ludCBFVlBfUEtFWV9zaWduKEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJdW5zaWduZWQgY2hhciAqc2lnLCBzaXplX3QgKnNpZ2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbik7CitpbnQgRVZQX1BLRVlfdmVyaWZ5X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworaW50IEVWUF9QS0VZX3ZlcmlmeShFVlBfUEtFWV9DVFggKmN0eCwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnRicywgc2l6ZV90IHRic2xlbik7CitpbnQgRVZQX1BLRVlfdmVyaWZ5X3JlY292ZXJfaW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CitpbnQgRVZQX1BLRVlfdmVyaWZ5X3JlY292ZXIoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQl1bnNpZ25lZCBjaGFyICpyb3V0LCBzaXplX3QgKnJvdXRsZW4sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCBzaWdsZW4pOworaW50IEVWUF9QS0VZX2VuY3J5cHRfaW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CitpbnQgRVZQX1BLRVlfZW5jcnlwdChFVlBfUEtFWV9DVFggKmN0eCwKKwkJCXVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICppbiwgc2l6ZV90IGlubGVuKTsKK2ludCBFVlBfUEtFWV9kZWNyeXB0X2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworaW50IEVWUF9QS0VZX2RlY3J5cHQoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQl1bnNpZ25lZCBjaGFyICpvdXQsIHNpemVfdCAqb3V0bGVuLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbmxlbik7CisKK2ludCBFVlBfUEtFWV9kZXJpdmVfaW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CitpbnQgRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqcGVlcik7CitpbnQgRVZQX1BLRVlfZGVyaXZlKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICprZXksIHNpemVfdCAqa2V5bGVuKTsKKwordHlwZWRlZiBpbnQgRVZQX1BLRVlfZ2VuX2NiKEVWUF9QS0VZX0NUWCAqY3R4KTsKKworaW50IEVWUF9QS0VZX3BhcmFtZ2VuX2luaXQoRVZQX1BLRVlfQ1RYICpjdHgpOworaW50IEVWUF9QS0VZX3BhcmFtZ2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqKnBwa2V5KTsKK2ludCBFVlBfUEtFWV9rZXlnZW5faW5pdChFVlBfUEtFWV9DVFggKmN0eCk7CitpbnQgRVZQX1BLRVlfa2V5Z2VuKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWSAqKnBwa2V5KTsKKwordm9pZCBFVlBfUEtFWV9DVFhfc2V0X2NiKEVWUF9QS0VZX0NUWCAqY3R4LCBFVlBfUEtFWV9nZW5fY2IgKmNiKTsKK0VWUF9QS0VZX2dlbl9jYiAqRVZQX1BLRVlfQ1RYX2dldF9jYihFVlBfUEtFWV9DVFggKmN0eCk7CisKK2ludCBFVlBfUEtFWV9DVFhfZ2V0X2tleWdlbl9pbmZvKEVWUF9QS0VZX0NUWCAqY3R4LCBpbnQgaWR4KTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9pbml0KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9jb3B5KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqY29weSkoRVZQX1BLRVlfQ1RYICpkc3QsIEVWUF9QS0VZX0NUWCAqc3JjKSk7CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfY2xlYW51cChFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCXZvaWQgKCpjbGVhbnVwKShFVlBfUEtFWV9DVFggKmN0eCkpOworCit2b2lkIEVWUF9QS0VZX21ldGhfc2V0X3BhcmFtZ2VuKEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqcGFyYW1nZW5faW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKnBhcmFtZ2VuKShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9rZXlnZW4oRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCprZXlnZW5faW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKmtleWdlbikoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KSk7CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfc2lnbihFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKnNpZ25faW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKnNpZ24pKEVWUF9QS0VZX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCAqc2lnbGVuLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF92ZXJpZnkoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCp2ZXJpZnlfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKnZlcmlmeSkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90IHNpZ2xlbiwKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqdGJzLCBzaXplX3QgdGJzbGVuKSk7CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfdmVyaWZ5X3JlY292ZXIoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCp2ZXJpZnlfcmVjb3Zlcl9pbml0KShFVlBfUEtFWV9DVFggKmN0eCksCisJaW50ICgqdmVyaWZ5X3JlY292ZXIpKEVWUF9QS0VZX0NUWCAqY3R4LAorCQkJCQl1bnNpZ25lZCBjaGFyICpzaWcsIHNpemVfdCAqc2lnbGVuLAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICp0YnMsIHNpemVfdCB0YnNsZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9zaWduY3R4KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqc2lnbmN0eF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCwgRVZQX01EX0NUWCAqbWN0eCksCisJaW50ICgqc2lnbmN0eCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKnNpZywgc2l6ZV90ICpzaWdsZW4sCisJCQkJCUVWUF9NRF9DVFggKm1jdHgpKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF92ZXJpZnljdHgoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCp2ZXJpZnljdHhfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgsIEVWUF9NRF9DVFggKm1jdHgpLAorCWludCAoKnZlcmlmeWN0eCkoRVZQX1BLRVlfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZyxpbnQgc2lnbGVuLAorCQkJCQlFVlBfTURfQ1RYICptY3R4KSk7CisKK3ZvaWQgRVZQX1BLRVlfbWV0aF9zZXRfZW5jcnlwdChFVlBfUEtFWV9NRVRIT0QgKnBtZXRoLAorCWludCAoKmVuY3J5cHRfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKmVuY3J5cHRmbikoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9kZWNyeXB0KEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqZGVjcnlwdF9pbml0KShFVlBfUEtFWV9DVFggKmN0eCksCisJaW50ICgqZGVjcnlwdCkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRsZW4sCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5sZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9kZXJpdmUoRVZQX1BLRVlfTUVUSE9EICpwbWV0aCwKKwlpbnQgKCpkZXJpdmVfaW5pdCkoRVZQX1BLRVlfQ1RYICpjdHgpLAorCWludCAoKmRlcml2ZSkoRVZQX1BLRVlfQ1RYICpjdHgsIHVuc2lnbmVkIGNoYXIgKmtleSwgc2l6ZV90ICprZXlsZW4pKTsKKwordm9pZCBFVlBfUEtFWV9tZXRoX3NldF9jdHJsKEVWUF9QS0VZX01FVEhPRCAqcG1ldGgsCisJaW50ICgqY3RybCkoRVZQX1BLRVlfQ1RYICpjdHgsIGludCB0eXBlLCBpbnQgcDEsIHZvaWQgKnAyKSwKKwlpbnQgKCpjdHJsX3N0cikoRVZQX1BLRVlfQ1RYICpjdHgsCisJCQkJCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKnZhbHVlKSk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfRVZQX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgRVZQIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIEVWUF9GX0FFU19JTklUX0tFWQkJCQkgMTMzCisjZGVmaW5lIEVWUF9GX0NBTUVMTElBX0lOSVRfS0VZCQkJCSAxNTkKKyNkZWZpbmUgRVZQX0ZfRDJJX1BLRVkJCQkJCSAxMDAKKyNkZWZpbmUgRVZQX0ZfRE9fU0lHVkVSX0lOSVQJCQkJIDE2MQorI2RlZmluZSBFVlBfRl9EU0FQS0VZMlBLQ1M4CQkJCSAxMzQKKyNkZWZpbmUgRVZQX0ZfRFNBX1BLRVkyUEtDUzgJCQkJIDEzNQorI2RlZmluZSBFVlBfRl9FQ0RTQV9QS0VZMlBLQ1M4CQkJCSAxMjkKKyNkZWZpbmUgRVZQX0ZfRUNLRVlfUEtFWTJQS0NTOAkJCQkgMTMyCisjZGVmaW5lIEVWUF9GX0VWUF9DSVBIRVJJTklUX0VYCQkJCSAxMjMKKyNkZWZpbmUgRVZQX0ZfRVZQX0NJUEhFUl9DVFhfQ09QWQkJCSAxNjMKKyNkZWZpbmUgRVZQX0ZfRVZQX0NJUEhFUl9DVFhfQ1RSTAkJCSAxMjQKKyNkZWZpbmUgRVZQX0ZfRVZQX0NJUEhFUl9DVFhfU0VUX0tFWV9MRU5HVEgJCSAxMjIKKyNkZWZpbmUgRVZQX0ZfRVZQX0RFQ1JZUFRGSU5BTF9FWAkJCSAxMDEKKyNkZWZpbmUgRVZQX0ZfRVZQX0RJR0VTVElOSVRfRVgJCQkJIDEyOAorI2RlZmluZSBFVlBfRl9FVlBfRU5DUllQVEZJTkFMX0VYCQkJIDEyNworI2RlZmluZSBFVlBfRl9FVlBfTURfQ1RYX0NPUFlfRVgJCQkgMTEwCisjZGVmaW5lIEVWUF9GX0VWUF9NRF9TSVpFCQkJCSAxNjIKKyNkZWZpbmUgRVZQX0ZfRVZQX09QRU5JTklUCQkJCSAxMDIKKyNkZWZpbmUgRVZQX0ZfRVZQX1BCRV9BTEdfQURECQkJCSAxMTUKKyNkZWZpbmUgRVZQX0ZfRVZQX1BCRV9BTEdfQUREX1RZUEUJCQkgMTYwCisjZGVmaW5lIEVWUF9GX0VWUF9QQkVfQ0lQSEVSSU5JVAkJCSAxMTYKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLQ1M4MlBLRVkJCQkJIDExMQorI2RlZmluZSBFVlBfRl9FVlBfUEtDUzgyUEtFWV9CUk9LRU4JCQkgMTM2CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZMlBLQ1M4X0JST0tFTgkJCSAxMTMKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfQ09QWV9QQVJBTUVURVJTCQkJIDEwMworI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9DVFhfQ1RSTAkJCQkgMTM3CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0NUWF9DVFJMX1NUUgkJCSAxNTAKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfQ1RYX0RVUAkJCQkgMTU2CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0RFQ1JZUFQJCQkJIDEwNAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9ERUNSWVBUX0lOSVQJCQkgMTM4CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0RFQ1JZUFRfT0xECQkJIDE1MQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9ERVJJVkUJCQkJIDE1MworI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9ERVJJVkVfSU5JVAkJCSAxNTQKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfREVSSVZFX1NFVF9QRUVSCQkJIDE1NQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9FTkNSWVBUCQkJCSAxMDUKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfRU5DUllQVF9JTklUCQkJIDEzOQorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9FTkNSWVBUX09MRAkJCSAxNTIKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfR0VUMV9ESAkJCQkgMTE5CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0dFVDFfRFNBCQkJCSAxMjAKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfR0VUMV9FQ0RTQQkJCSAxMzAKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfR0VUMV9FQ19LRVkJCQkgMTMxCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX0dFVDFfUlNBCQkJCSAxMjEKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfS0VZR0VOCQkJCSAxNDYKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfS0VZR0VOX0lOSVQJCQkgMTQ3CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX05FVwkJCQkgMTA2CisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX1BBUkFNR0VOCQkJCSAxNDgKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfUEFSQU1HRU5fSU5JVAkJCSAxNDkKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfU0lHTgkJCQkgMTQwCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX1NJR05fSU5JVAkJCSAxNDEKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfVkVSSUZZCQkJCSAxNDIKKyNkZWZpbmUgRVZQX0ZfRVZQX1BLRVlfVkVSSUZZX0lOSVQJCQkgMTQzCisjZGVmaW5lIEVWUF9GX0VWUF9QS0VZX1ZFUklGWV9SRUNPVkVSCQkJIDE0NAorI2RlZmluZSBFVlBfRl9FVlBfUEtFWV9WRVJJRllfUkVDT1ZFUl9JTklUCQkgMTQ1CisjZGVmaW5lIEVWUF9GX0VWUF9SSUpOREFFTAkJCQkgMTI2CisjZGVmaW5lIEVWUF9GX0VWUF9TSUdORklOQUwJCQkJIDEwNworI2RlZmluZSBFVlBfRl9FVlBfVkVSSUZZRklOQUwJCQkJIDEwOAorI2RlZmluZSBFVlBfRl9JTlRfQ1RYX05FVwkJCQkgMTU3CisjZGVmaW5lIEVWUF9GX1BLQ1M1X1BCRV9LRVlJVkdFTgkJCSAxMTcKKyNkZWZpbmUgRVZQX0ZfUEtDUzVfVjJfUEJFX0tFWUlWR0VOCQkJIDExOAorI2RlZmluZSBFVlBfRl9QS0NTOF9TRVRfQlJPS0VOCQkJCSAxMTIKKyNkZWZpbmUgRVZQX0ZfUEtFWV9TRVRfVFlQRQkJCQkgMTU4CisjZGVmaW5lIEVWUF9GX1JDMl9NQUdJQ19UT19NRVRICQkJCSAxMDkKKyNkZWZpbmUgRVZQX0ZfUkM1X0NUUkwJCQkJCSAxMjUKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBFVlBfUl9BRVNfS0VZX1NFVFVQX0ZBSUxFRAkJCSAxNDMKKyNkZWZpbmUgRVZQX1JfQVNOMV9MSUIJCQkJCSAxNDAKKyNkZWZpbmUgRVZQX1JfQkFEX0JMT0NLX0xFTkdUSAkJCQkgMTM2CisjZGVmaW5lIEVWUF9SX0JBRF9ERUNSWVBUCQkJCSAxMDAKKyNkZWZpbmUgRVZQX1JfQkFEX0tFWV9MRU5HVEgJCQkJIDEzNworI2RlZmluZSBFVlBfUl9CTl9ERUNPREVfRVJST1IJCQkJIDExMgorI2RlZmluZSBFVlBfUl9CTl9QVUJLRVlfRVJST1IJCQkJIDExMworI2RlZmluZSBFVlBfUl9CVUZGRVJfVE9PX1NNQUxMCQkJCSAxNTUKKyNkZWZpbmUgRVZQX1JfQ0FNRUxMSUFfS0VZX1NFVFVQX0ZBSUxFRAkJCSAxNTcKKyNkZWZpbmUgRVZQX1JfQ0lQSEVSX1BBUkFNRVRFUl9FUlJPUgkJCSAxMjIKKyNkZWZpbmUgRVZQX1JfQ09NTUFORF9OT1RfU1VQUE9SVEVECQkJIDE0NworI2RlZmluZSBFVlBfUl9DVFJMX05PVF9JTVBMRU1FTlRFRAkJCSAxMzIKKyNkZWZpbmUgRVZQX1JfQ1RSTF9PUEVSQVRJT05fTk9UX0lNUExFTUVOVEVECQkgMTMzCisjZGVmaW5lIEVWUF9SX0RBVEFfTk9UX01VTFRJUExFX09GX0JMT0NLX0xFTkdUSAkJIDEzOAorI2RlZmluZSBFVlBfUl9ERUNPREVfRVJST1IJCQkJIDExNAorI2RlZmluZSBFVlBfUl9ESUZGRVJFTlRfS0VZX1RZUEVTCQkJIDEwMQorI2RlZmluZSBFVlBfUl9ESUZGRVJFTlRfUEFSQU1FVEVSUwkJCSAxNTMKKyNkZWZpbmUgRVZQX1JfRU5DT0RFX0VSUk9SCQkJCSAxMTUKKyNkZWZpbmUgRVZQX1JfRVZQX1BCRV9DSVBIRVJJTklUX0VSUk9SCQkJIDExOQorI2RlZmluZSBFVlBfUl9FWFBFQ1RJTkdfQU5fUlNBX0tFWQkJCSAxMjcKKyNkZWZpbmUgRVZQX1JfRVhQRUNUSU5HX0FfREhfS0VZCQkJIDEyOAorI2RlZmluZSBFVlBfUl9FWFBFQ1RJTkdfQV9EU0FfS0VZCQkJIDEyOQorI2RlZmluZSBFVlBfUl9FWFBFQ1RJTkdfQV9FQ0RTQV9LRVkJCQkgMTQxCisjZGVmaW5lIEVWUF9SX0VYUEVDVElOR19BX0VDX0tFWQkJCSAxNDIKKyNkZWZpbmUgRVZQX1JfSU5JVElBTElaQVRJT05fRVJST1IJCQkgMTM0CisjZGVmaW5lIEVWUF9SX0lOUFVUX05PVF9JTklUSUFMSVpFRAkJCSAxMTEKKyNkZWZpbmUgRVZQX1JfSU5WQUxJRF9ESUdFU1QJCQkJIDE1MgorI2RlZmluZSBFVlBfUl9JTlZBTElEX0tFWV9MRU5HVEgJCQkgMTMwCisjZGVmaW5lIEVWUF9SX0lOVkFMSURfT1BFUkFUSU9OCQkJCSAxNDgKKyNkZWZpbmUgRVZQX1JfSVZfVE9PX0xBUkdFCQkJCSAxMDIKKyNkZWZpbmUgRVZQX1JfS0VZR0VOX0ZBSUxVUkUJCQkJIDEyMAorI2RlZmluZSBFVlBfUl9NRVNTQUdFX0RJR0VTVF9JU19OVUxMCQkJIDE1OQorI2RlZmluZSBFVlBfUl9NRVRIT0RfTk9UX1NVUFBPUlRFRAkJCSAxNDQKKyNkZWZpbmUgRVZQX1JfTUlTU0lOR19QQVJBTUVURVJTCQkJIDEwMworI2RlZmluZSBFVlBfUl9OT19DSVBIRVJfU0VUCQkJCSAxMzEKKyNkZWZpbmUgRVZQX1JfTk9fREVGQVVMVF9ESUdFU1QJCQkJIDE1OAorI2RlZmluZSBFVlBfUl9OT19ESUdFU1RfU0VUCQkJCSAxMzkKKyNkZWZpbmUgRVZQX1JfTk9fRFNBX1BBUkFNRVRFUlMJCQkJIDExNgorI2RlZmluZSBFVlBfUl9OT19LRVlfU0VUCQkJCSAxNTQKKyNkZWZpbmUgRVZQX1JfTk9fT1BFUkFUSU9OX1NFVAkJCQkgMTQ5CisjZGVmaW5lIEVWUF9SX05PX1NJR05fRlVOQ1RJT05fQ09ORklHVVJFRAkJIDEwNAorI2RlZmluZSBFVlBfUl9OT19WRVJJRllfRlVOQ1RJT05fQ09ORklHVVJFRAkJIDEwNQorI2RlZmluZSBFVlBfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFCSAxNTAKKyNkZWZpbmUgRVZQX1JfT1BFUkFUT05fTk9UX0lOSVRJQUxJWkVECQkJIDE1MQorI2RlZmluZSBFVlBfUl9QS0NTOF9VTktOT1dOX0JST0tFTl9UWVBFCQkJIDExNworI2RlZmluZSBFVlBfUl9QUklWQVRFX0tFWV9ERUNPREVfRVJST1IJCQkgMTQ1CisjZGVmaW5lIEVWUF9SX1BSSVZBVEVfS0VZX0VOQ09ERV9FUlJPUgkJCSAxNDYKKyNkZWZpbmUgRVZQX1JfUFVCTElDX0tFWV9OT1RfUlNBCQkJIDEwNgorI2RlZmluZSBFVlBfUl9VTktOT1dOX0NJUEhFUgkJCQkgMTYwCisjZGVmaW5lIEVWUF9SX1VOS05PV05fRElHRVNUCQkJCSAxNjEKKyNkZWZpbmUgRVZQX1JfVU5LTk9XTl9QQkVfQUxHT1JJVEhNCQkJIDEyMQorI2RlZmluZSBFVlBfUl9VTlNVUE9SVEVEX05VTUJFUl9PRl9ST1VORFMJCSAxMzUKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfQUxHT1JJVEhNCQkJIDE1NgorI2RlZmluZSBFVlBfUl9VTlNVUFBPUlRFRF9DSVBIRVIJCQkgMTA3CisjZGVmaW5lIEVWUF9SX1VOU1VQUE9SVEVEX0tFWUxFTkdUSAkJCSAxMjMKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfS0VZX0RFUklWQVRJT05fRlVOQ1RJT04JIDEyNAorI2RlZmluZSBFVlBfUl9VTlNVUFBPUlRFRF9LRVlfU0laRQkJCSAxMDgKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfUFJGCQkJCSAxMjUKKyNkZWZpbmUgRVZQX1JfVU5TVVBQT1JURURfUFJJVkFURV9LRVlfQUxHT1JJVEhNCQkgMTE4CisjZGVmaW5lIEVWUF9SX1VOU1VQUE9SVEVEX1NBTFRfVFlQRQkJCSAxMjYKKyNkZWZpbmUgRVZQX1JfV1JPTkdfRklOQUxfQkxPQ0tfTEVOR1RICQkJIDEwOQorI2RlZmluZSBFVlBfUl9XUk9OR19QVUJMSUNfS0VZX1RZUEUJCQkgMTEwCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvaG1hYy5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2htYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUwMDIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2htYWMuaApAQCAtMCwwICsxLDExMCBAQAorLyogY3J5cHRvL2htYWMvaG1hYy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisjaWZuZGVmIEhFQURFUl9ITUFDX0gKKyNkZWZpbmUgSEVBREVSX0hNQUNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorCisjaWZkZWYgT1BFTlNTTF9OT19ITUFDCisjZXJyb3IgSE1BQyBpcyBkaXNhYmxlZC4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworI2RlZmluZSBITUFDX01BWF9NRF9DQkxPQ0sJMTI4CS8qIGxhcmdlc3Qga25vd24gaXMgU0hBNTEyICovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGhtYWNfY3R4X3N0CisJeworCWNvbnN0IEVWUF9NRCAqbWQ7CisJRVZQX01EX0NUWCBtZF9jdHg7CisJRVZQX01EX0NUWCBpX2N0eDsKKwlFVlBfTURfQ1RYIG9fY3R4OworCXVuc2lnbmVkIGludCBrZXlfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIga2V5W0hNQUNfTUFYX01EX0NCTE9DS107CisJfSBITUFDX0NUWDsKKworI2RlZmluZSBITUFDX3NpemUoZSkJKEVWUF9NRF9zaXplKChlKS0+bWQpKQorCisKK3ZvaWQgSE1BQ19DVFhfaW5pdChITUFDX0NUWCAqY3R4KTsKK3ZvaWQgSE1BQ19DVFhfY2xlYW51cChITUFDX0NUWCAqY3R4KTsKKworI2RlZmluZSBITUFDX2NsZWFudXAoY3R4KSBITUFDX0NUWF9jbGVhbnVwKGN0eCkgLyogZGVwcmVjYXRlZCAqLworCitpbnQgSE1BQ19Jbml0KEhNQUNfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmtleSwgaW50IGxlbiwKKwkgICAgICAgY29uc3QgRVZQX01EICptZCk7IC8qIGRlcHJlY2F0ZWQgKi8KK2ludCBITUFDX0luaXRfZXgoSE1BQ19DVFggKmN0eCwgY29uc3Qgdm9pZCAqa2V5LCBpbnQgbGVuLAorCQkgIGNvbnN0IEVWUF9NRCAqbWQsIEVOR0lORSAqaW1wbCk7CitpbnQgSE1BQ19VcGRhdGUoSE1BQ19DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgSE1BQ19GaW5hbChITUFDX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pOwordW5zaWduZWQgY2hhciAqSE1BQyhjb25zdCBFVlBfTUQgKmV2cF9tZCwgY29uc3Qgdm9pZCAqa2V5LCBpbnQga2V5X2xlbiwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIHNpemVfdCBuLCB1bnNpZ25lZCBjaGFyICptZCwKKwkJICAgIHVuc2lnbmVkIGludCAqbWRfbGVuKTsKK2ludCBITUFDX0NUWF9jb3B5KEhNQUNfQ1RYICpkY3R4LCBITUFDX0NUWCAqc2N0eCk7CisKK3ZvaWQgSE1BQ19DVFhfc2V0X2ZsYWdzKEhNQUNfQ1RYICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wva3JiNV9hc24uaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9rcmI1X2Fzbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzI1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wva3JiNV9hc24uaApAQCAtMCwwICsxLDI1NiBAQAorLyoga3JiNV9hc24uaCAqLworLyogV3JpdHRlbiBieSBWZXJuIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+IGZvciB0aGUgT3BlblNTTCBwcm9qZWN0LAorKiogdXNpbmcgb2NzcC97Ki5oLCphc24qLmN9IGFzIGEgc3RhcnRpbmcgcG9pbnQKKyovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9LUkI1X0FTTl9ICisjZGVmaW5lIEhFQURFUl9LUkI1X0FTTl9ICisKKy8qCisjaW5jbHVkZSA8a3JiNS5oPgorKi8KKyNpbmNsdWRlIDxvcGVuc3NsL3NhZmVzdGFjay5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qCUFTTi4xIGZyb20gS2VyYmVyb3MgUkZDIDE1MTAKKyovCisKKy8qCUVuY3J5cHRlZERhdGEgOjo9ICAgU0VRVUVOQ0UgeworKioJCWV0eXBlWzBdICAgICAgICAgICAgICAgICAgICAgIElOVEVHRVIsIC0tIEVuY3J5cHRpb25UeXBlCisqKgkJa3Zub1sxXSAgICAgICAgICAgICAgICAgICAgICAgSU5URUdFUiBPUFRJT05BTCwKKyoqCQljaXBoZXJbMl0gICAgICAgICAgICAgICAgICAgICBPQ1RFVCBTVFJJTkcgLS0gY2lwaGVydGV4dAorKioJfQorKi8KK3R5cGVkZWYJc3RydWN0CWtyYjVfZW5jZGF0YV9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqZXR5cGU7CisJQVNOMV9JTlRFR0VSCQkJKmt2bm87CisJQVNOMV9PQ1RFVF9TVFJJTkcJCSpjaXBoZXI7CisJfQlLUkI1X0VOQ0RBVEE7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoS1JCNV9FTkNEQVRBKQorCisvKglQcmluY2lwYWxOYW1lIDo6PSAgIFNFUVVFTkNFIHsKKyoqCQluYW1lLXR5cGVbMF0gICAgICAgICAgICAgICAgICBJTlRFR0VSLAorKioJCW5hbWUtc3RyaW5nWzFdICAgICAgICAgICAgICAgIFNFUVVFTkNFIE9GIEdlbmVyYWxTdHJpbmcKKyoqCX0KKyovCit0eXBlZGVmCXN0cnVjdAlrcmI1X3ByaW5jbmFtZV9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqbmFtZXR5cGU7CisJU1RBQ0tfT0YoQVNOMV9HRU5FUkFMU1RSSU5HKQkqbmFtZXN0cmluZzsKKwl9CUtSQjVfUFJJTkNOQU1FOworCitERUNMQVJFX1NUQUNLX09GKEtSQjVfUFJJTkNOQU1FKQorCisKKy8qCVRpY2tldCA6Oj0JW0FQUExJQ0FUSU9OIDFdIFNFUVVFTkNFIHsKKyoqCQl0a3Qtdm5vWzBdICAgICAgICAgICAgICAgICAgICBJTlRFR0VSLAorKioJCXJlYWxtWzFdICAgICAgICAgICAgICAgICAgICAgIFJlYWxtLAorKioJCXNuYW1lWzJdICAgICAgICAgICAgICAgICAgICAgIFByaW5jaXBhbE5hbWUsCisqKgkJZW5jLXBhcnRbM10gICAgICAgICAgICAgICAgICAgRW5jcnlwdGVkRGF0YQorKioJfQorKi8KK3R5cGVkZWYJc3RydWN0CWtyYjVfdGt0Ym9keV9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqdGt0dm5vOworCUFTTjFfR0VORVJBTFNUUklORwkJKnJlYWxtOworCUtSQjVfUFJJTkNOQU1FCQkJKnNuYW1lOworCUtSQjVfRU5DREFUQQkJCSplbmNkYXRhOworCX0JS1JCNV9US1RCT0RZOworCit0eXBlZGVmIFNUQUNLX09GKEtSQjVfVEtUQk9EWSkgS1JCNV9USUNLRVQ7CitERUNMQVJFX1NUQUNLX09GKEtSQjVfVEtUQk9EWSkKKworCisvKglBUC1SRVEgOjo9ICAgICAgW0FQUExJQ0FUSU9OIDE0XSBTRVFVRU5DRSB7CisqKgkJcHZub1swXSAgICAgICAgICAgICAgICAgICAgICAgSU5URUdFUiwKKyoqCQltc2ctdHlwZVsxXSAgICAgICAgICAgICAgICAgICBJTlRFR0VSLAorKioJCWFwLW9wdGlvbnNbMl0gICAgICAgICAgICAgICAgIEFQT3B0aW9ucywKKyoqCQl0aWNrZXRbM10gICAgICAgICAgICAgICAgICAgICBUaWNrZXQsCisqKgkJYXV0aGVudGljYXRvcls0XSAgICAgICAgICAgICAgRW5jcnlwdGVkRGF0YQorKioJfQorKioKKyoqCUFQT3B0aW9ucyA6Oj0gICBCSVQgU1RSSU5HIHsKKyoqCQlyZXNlcnZlZCgwKSwgdXNlLXNlc3Npb24ta2V5KDEpLCBtdXR1YWwtcmVxdWlyZWQoMikgfQorKi8KK3R5cGVkZWYJc3RydWN0CWtyYjVfYXBfcmVxX3N0CisJeworCUFTTjFfSU5URUdFUgkJCSpwdm5vOworCUFTTjFfSU5URUdFUgkJCSptc2d0eXBlOworCUFTTjFfQklUX1NUUklORwkJCSphcG9wdGlvbnM7CisJS1JCNV9USUNLRVQJCQkqdGlja2V0OworCUtSQjVfRU5DREFUQQkJCSphdXRoZW50aWNhdG9yOworCX0JS1JCNV9BUFJFUUJPRFk7CisKK3R5cGVkZWYgU1RBQ0tfT0YoS1JCNV9BUFJFUUJPRFkpIEtSQjVfQVBSRVE7CitERUNMQVJFX1NUQUNLX09GKEtSQjVfQVBSRVFCT0RZKQorCisKKy8qCUF1dGhlbnRpY2F0b3IgU3R1ZmYJKi8KKworCisvKglDaGVja3N1bSA6Oj0gICBTRVFVRU5DRSB7CisqKgkJY2tzdW10eXBlWzBdICAgICAgICAgICAgICAgICAgSU5URUdFUiwKKyoqCQljaGVja3N1bVsxXSAgICAgICAgICAgICAgICAgICBPQ1RFVCBTVFJJTkcKKyoqCX0KKyovCit0eXBlZGVmCXN0cnVjdAlrcmI1X2NoZWNrc3VtX3N0CisJeworCUFTTjFfSU5URUdFUgkJCSpjdHlwZTsKKwlBU04xX09DVEVUX1NUUklORwkJKmNoZWNrc3VtOworCX0JS1JCNV9DSEVDS1NVTTsKKworREVDTEFSRV9TVEFDS19PRihLUkI1X0NIRUNLU1VNKQorCisKKy8qCUVuY3J5cHRpb25LZXkgOjo9ICAgU0VRVUVOQ0UgeworKioJCWtleXR5cGVbMF0gICAgICAgICAgICAgICAgICAgIElOVEVHRVIsCisqKgkJa2V5dmFsdWVbMV0gICAgICAgICAgICAgICAgICAgT0NURVQgU1RSSU5HCisqKgl9CisqLwordHlwZWRlZiBzdHJ1Y3QgIGtyYjVfZW5jcnlwdGlvbmtleV9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqa3R5cGU7CisJQVNOMV9PQ1RFVF9TVFJJTkcJCSprZXl2YWx1ZTsKKwl9CUtSQjVfRU5DS0VZOworCitERUNMQVJFX1NUQUNLX09GKEtSQjVfRU5DS0VZKQorCisKKy8qCUF1dGhvcml6YXRpb25EYXRhIDo6PSAgIFNFUVVFTkNFIE9GIFNFUVVFTkNFIHsKKyoqCQlhZC10eXBlWzBdICAgICAgICAgICAgICAgICAgICBJTlRFR0VSLAorKiogICAgICAgICAgICAgIGFkLWRhdGFbMV0gICAgICAgICAgICAgICAgICAgIE9DVEVUIFNUUklORworKioJfQorKi8KK3R5cGVkZWYgc3RydWN0CWtyYjVfYXV0aG9yaXphdGlvbl9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqYWR0eXBlOworCUFTTjFfT0NURVRfU1RSSU5HCQkqYWRkYXRhOworCX0JS1JCNV9BVVRIREFUQTsKKworREVDTEFSRV9TVEFDS19PRihLUkI1X0FVVEhEQVRBKQorCisJCQkKKy8qCS0tIFVuZW5jcnlwdGVkIGF1dGhlbnRpY2F0b3IKKyoqCUF1dGhlbnRpY2F0b3IgOjo9ICAgIFtBUFBMSUNBVElPTiAyXSBTRVFVRU5DRSAgICB7CisqKgkJYXV0aGVudGljYXRvci12bm9bMF0gICAgICAgICAgSU5URUdFUiwKKyoqCQljcmVhbG1bMV0gICAgICAgICAgICAgICAgICAgICBSZWFsbSwKKyoqCQljbmFtZVsyXSAgICAgICAgICAgICAgICAgICAgICBQcmluY2lwYWxOYW1lLAorKioJCWNrc3VtWzNdICAgICAgICAgICAgICAgICAgICAgIENoZWNrc3VtIE9QVElPTkFMLAorKioJCWN1c2VjWzRdICAgICAgICAgICAgICAgICAgICAgIElOVEVHRVIsCisqKgkJY3RpbWVbNV0gICAgICAgICAgICAgICAgICAgICAgS2VyYmVyb3NUaW1lLAorKioJCXN1YmtleVs2XSAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb25LZXkgT1BUSU9OQUwsCisqKgkJc2VxLW51bWJlcls3XSAgICAgICAgICAgICAgICAgSU5URUdFUiBPUFRJT05BTCwKKyoqCQlhdXRob3JpemF0aW9uLWRhdGFbOF0gICAgICAgICBBdXRob3JpemF0aW9uRGF0YSBPUFRJT05BTAorKioJfQorKi8KK3R5cGVkZWYgc3RydWN0CWtyYjVfYXV0aGVudGljYXRvcl9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqYXZubzsKKwlBU04xX0dFTkVSQUxTVFJJTkcJCSpjcmVhbG07CisJS1JCNV9QUklOQ05BTUUJCQkqY25hbWU7CisJS1JCNV9DSEVDS1NVTQkJCSpja3N1bTsKKwlBU04xX0lOVEVHRVIJCQkqY3VzZWM7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUJCSpjdGltZTsKKwlLUkI1X0VOQ0tFWQkJCSpzdWJrZXk7CisJQVNOMV9JTlRFR0VSCQkJKnNlcW51bTsKKwlLUkI1X0FVVEhEQVRBCQkJKmF1dGhvcml6YXRpb247CisJfQlLUkI1X0FVVEhFTlRCT0RZOworCit0eXBlZGVmIFNUQUNLX09GKEtSQjVfQVVUSEVOVEJPRFkpIEtSQjVfQVVUSEVOVDsKK0RFQ0xBUkVfU1RBQ0tfT0YoS1JCNV9BVVRIRU5UQk9EWSkKKworCisvKiAgREVDTEFSRV9BU04xX0ZVTkNUSU9OUyh0eXBlKSA9IERFQ0xBUkVfQVNOMV9GVU5DVElPTlNfbmFtZSh0eXBlLCB0eXBlKSA9CisqKgl0eXBlICpuYW1lIyNfbmV3KHZvaWQpOworKioJdm9pZCBuYW1lIyNfZnJlZSh0eXBlICphKTsKKyoqCURFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TKHR5cGUsIG5hbWUsIG5hbWUpID0KKyoqCSBERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OUyh0eXBlLCBpdG5hbWUsIG5hbWUpID0KKyoqCSAgdHlwZSAqZDJpXyMjbmFtZSh0eXBlICoqYSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbik7CisqKgkgIGludCBpMmRfIyNuYW1lKHR5cGUgKmEsIHVuc2lnbmVkIGNoYXIgKipvdXQpOworKioJICBERUNMQVJFX0FTTjFfSVRFTShpdG5hbWUpID0gT1BFTlNTTF9FWFRFUk4gY29uc3QgQVNOMV9JVEVNIGl0bmFtZSMjX2l0CisqLworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfRU5DREFUQSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoS1JCNV9QUklOQ05BTUUpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfVEtUQk9EWSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoS1JCNV9BUFJFUUJPRFkpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfVElDS0VUKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhLUkI1X0FQUkVRKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfQ0hFQ0tTVU0pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEtSQjVfRU5DS0VZKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhLUkI1X0FVVEhEQVRBKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhLUkI1X0FVVEhFTlRCT0RZKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhLUkI1X0FVVEhFTlQpCisKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wva3NzbC5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2tzc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QyMGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2tzc2wuaApAQCAtMCwwICsxLDE3OSBAQAorLyogc3NsL2tzc2wuaCAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgVmVybiBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDAwLgorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qCisqKgkxOTk5MDcwMQlWUlMgCVN0YXJ0ZWQuCisqLworCisjaWZuZGVmCUtTU0xfSAorI2RlZmluZQlLU1NMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKworI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxrcmI1Lmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKglEZXBlbmRpbmcgb24gd2hpY2ggS1JCNSBpbXBsZW1lbnRhdGlvbiB1c2VkLCBzb21lIHR5cGVzIGZyb20KKyoqCXRoZSBvdGhlciBtYXkgYmUgbWlzc2luZy4gIFJlc29sdmUgdGhhdCBoZXJlIGFuZCBub3cKKyovCisjaWZkZWYgS1JCNV9IRUlNREFMCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIga3JiNV9vY3RldDsKKyNkZWZpbmUgRkFSCisjZWxzZQorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIKKyNlbmRpZgorCisjZW5kaWYKKworLyoJVW5jb21tZW50IHRoaXMgdG8gZGVidWcga3NzbCBwcm9ibGVtcyBvcgorKioJdG8gdHJhY2UgdXNhZ2Ugb2YgdGhlIEtlcmJlcm9zIHNlc3Npb24ga2V5CisqKgorKioJI2RlZmluZQkJS1NTTF9ERUJVRworKi8KKworI2lmbmRlZglLUkI1U1ZDCisjZGVmaW5lIEtSQjVTVkMJImhvc3QiCisjZW5kaWYKKworI2lmbmRlZglLUkI1S0VZVEFCCisjZGVmaW5lIEtSQjVLRVlUQUIJIi9ldGMva3JiNS5rZXl0YWIiCisjZW5kaWYKKworI2lmbmRlZiBLUkI1U0VOREFVVEgKKyNkZWZpbmUgS1JCNVNFTkRBVVRICTEKKyNlbmRpZgorCisjaWZuZGVmIEtSQjVDSEVDS0FVVEgKKyNkZWZpbmUgS1JCNUNIRUNLQVVUSAkxCisjZW5kaWYKKworI2lmbmRlZiBLU1NMX0NMT0NLU0tFVworI2RlZmluZQlLU1NMX0NMT0NLU0tFVwkzMDA7CisjZW5kaWYKKworI2RlZmluZQlLU1NMX0VSUl9NQVgJMjU1Cit0eXBlZGVmIHN0cnVjdCBrc3NsX2Vycl9zdCAgeworCWludCAgcmVhc29uOworCWNoYXIgdGV4dFtLU1NMX0VSUl9NQVgrMV07CisJfSBLU1NMX0VSUjsKKworCisvKglDb250ZXh0IGZvciBwYXNzaW5nCisqKgkJKDEpIEtlcmJlcm9zIHNlc3Npb24ga2V5IHRvIFNTTCwgYW5kCisqKgkJKDIpCUNvbmZpZyBkYXRhIGJldHdlZW4gYXBwbGljYXRpb24gYW5kIFNTTCBsaWIKKyovCit0eXBlZGVmIHN0cnVjdCBrc3NsX2N0eF9zdAorICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCXVzZWQgYnk6ICAgIGRpc3Bvc2l0aW9uOiAgICAgICAgICAgICovCisJY2hhciAqc2VydmljZV9uYW1lOwkvKglDLFMJICAgIGRlZmF1bHQgb2sgKGtzc2wpICAgICAgICovCisJY2hhciAqc2VydmljZV9ob3N0OwkvKglDCSAgICBpbnB1dCwgUkVRVUlSRUQgICAgICAgICAqLworCWNoYXIgKmNsaWVudF9wcmluYzsJLyoJUwkgICAgb3V0cHV0IGZyb20ga3JiNSB0aWNrZXQgKi8KKwljaGFyICprZXl0YWJfZmlsZTsJLyogICAgICBTCSAgICBOVUxMICgvZXRjL2tyYjUua2V5dGFiKSAqLworCWNoYXIgKmNyZWRfY2FjaGU7CS8qCUMJICAgIE5VTEwgKGRlZmF1bHQpICAgICAgICAgICovCisJa3JiNV9lbmN0eXBlIGVuY3R5cGU7CisJaW50IGxlbmd0aDsKKwlrcmI1X29jdGV0IEZBUiAqa2V5OworCX0gS1NTTF9DVFg7CisKKyNkZWZpbmUJS1NTTF9DTElFTlQgCTEKKyNkZWZpbmUgS1NTTF9TRVJWRVIgCTIKKyNkZWZpbmUJS1NTTF9TRVJWSUNFCTMKKyNkZWZpbmUJS1NTTF9LRVlUQUIgCTQKKworI2RlZmluZSBLU1NMX0NUWF9PSyAJMAorI2RlZmluZSBLU1NMX0NUWF9FUlIJMQorI2RlZmluZSBLU1NMX05PTUVNCTIKKworLyogUHVibGljIChmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBPcGVuU1NMIHdpdGggS2VyYmVyb3MgNSBzdXBwb3J0ICovCitrcmI1X2Vycm9yX2NvZGUga3NzbF9jdHhfc2V0c3RyaW5nKEtTU0xfQ1RYICprc3NsX2N0eCwgaW50IHdoaWNoLCBjaGFyICp0ZXh0KTsKK0tTU0xfQ1RYICprc3NsX2N0eF9uZXcodm9pZCk7CitLU1NMX0NUWCAqa3NzbF9jdHhfZnJlZShLU1NMX0NUWCAqa3NzbF9jdHgpOwordm9pZCBrc3NsX2N0eF9zaG93KEtTU0xfQ1RYICprc3NsX2N0eCk7CitrcmI1X2Vycm9yX2NvZGUga3NzbF9jdHhfc2V0cHJpbmMoS1NTTF9DVFggKmtzc2xfY3R4LCBpbnQgd2hpY2gsCisgICAgICAgIGtyYjVfZGF0YSAqcmVhbG0sIGtyYjVfZGF0YSAqZW50aXR5LCBpbnQgbmVudGl0aWVzKTsKK2tyYjVfZXJyb3JfY29kZQlrc3NsX2NnZXRfdGt0KEtTU0xfQ1RYICprc3NsX2N0eCwgIGtyYjVfZGF0YSAqKmVuY190a3RwLAorICAgICAgICBrcmI1X2RhdGEgKmF1dGhlbnAsIEtTU0xfRVJSICprc3NsX2Vycik7CitrcmI1X2Vycm9yX2NvZGUJa3NzbF9zZ2V0X3RrdChLU1NMX0NUWCAqa3NzbF9jdHgsICBrcmI1X2RhdGEgKmluZGF0YSwKKyAgICAgICAga3JiNV90aWNrZXRfdGltZXMgKnR0aW1lcywgS1NTTF9FUlIgKmtzc2xfZXJyKTsKK2tyYjVfZXJyb3JfY29kZSBrc3NsX2N0eF9zZXRrZXkoS1NTTF9DVFggKmtzc2xfY3R4LCBrcmI1X2tleWJsb2NrICpzZXNzaW9uKTsKK3ZvaWQJa3NzbF9lcnJfc2V0KEtTU0xfRVJSICprc3NsX2VyciwgaW50IHJlYXNvbiwgY2hhciAqdGV4dCk7Cit2b2lkIGtzc2xfa3JiNV9mcmVlX2RhdGFfY29udGVudHMoa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfZGF0YSAqZGF0YSk7CitrcmI1X2Vycm9yX2NvZGUgIGtzc2xfYnVpbGRfcHJpbmNpcGFsXzIoa3JiNV9jb250ZXh0IGNvbnRleHQsCisJCQlrcmI1X3ByaW5jaXBhbCAqcHJpbmMsIGludCBybGVuLCBjb25zdCBjaGFyICpyZWFsbSwKKwkJCWludCBzbGVuLCBjb25zdCBjaGFyICpzdmMsIGludCBobGVuLCBjb25zdCBjaGFyICpob3N0KTsKK2tyYjVfZXJyb3JfY29kZSAga3NzbF92YWxpZGF0ZV90aW1lcyhrcmI1X3RpbWVzdGFtcCBhdGltZSwKKwkJCQkJa3JiNV90aWNrZXRfdGltZXMgKnR0aW1lcyk7CitrcmI1X2Vycm9yX2NvZGUgIGtzc2xfY2hlY2tfYXV0aGVudChLU1NMX0NUWCAqa3NzbF9jdHgsIGtyYjVfZGF0YSAqYXV0aGVudHAsCisJCQkgICAgICAgICAgICBrcmI1X3RpbWVzdGFtcCAqYXRpbWVwLCBLU1NMX0VSUiAqa3NzbF9lcnIpOwordW5zaWduZWQgY2hhcgkqa3NzbF9za2lwX2NvbmZvdW5kKGtyYjVfZW5jdHlwZSBlbmN0eXBlLCB1bnNpZ25lZCBjaGFyICphdXRobik7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCS8qIE9QRU5TU0xfTk9fS1JCNQkqLworI2VuZGlmCS8qIEtTU0xfSCAJKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkODc2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCkBAIC0wLDAgKzEsMjQxIEBACisvKiBjcnlwdG8vbGhhc2gvbGhhc2guaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisvKiBIZWFkZXIgZm9yIGR5bmFtaWMgaGFzaCB0YWJsZSByb3V0aW5lcworICogQXV0aG9yIC0gRXJpYyBZb3VuZworICovCisKKyNpZm5kZWYgSEVBREVSX0xIQVNIX0gKKyNkZWZpbmUgSEVBREVSX0xIQVNIX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKKyNpbmNsdWRlIDxzdGRpby5oPgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGxoYXNoX25vZGVfc3QKKwl7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgbGhhc2hfbm9kZV9zdCAqbmV4dDsKKyNpZm5kZWYgT1BFTlNTTF9OT19IQVNIX0NPTVAKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisjZW5kaWYKKwl9IExIQVNIX05PREU7CisKK3R5cGVkZWYgaW50ICgqTEhBU0hfQ09NUF9GTl9UWVBFKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgKCpMSEFTSF9IQVNIX0ZOX1RZUEUpKGNvbnN0IHZvaWQgKik7Cit0eXBlZGVmIHZvaWQgKCpMSEFTSF9ET0FMTF9GTl9UWVBFKSh2b2lkICopOwordHlwZWRlZiB2b2lkICgqTEhBU0hfRE9BTExfQVJHX0ZOX1RZUEUpKHZvaWQgKiwgdm9pZCAqKTsKKworLyogTWFjcm9zIGZvciBkZWNsYXJpbmcgYW5kIGltcGxlbWVudGluZyB0eXBlLXNhZmUgd3JhcHBlcnMgZm9yIExIQVNIIGNhbGxiYWNrcy4KKyAqIFRoaXMgd2F5LCBjYWxsYmFja3MgY2FuIGJlIHByb3ZpZGVkIHRvIExIQVNIIHN0cnVjdHVyZXMgd2l0aG91dCBmdW5jdGlvbgorICogcG9pbnRlciBjYXN0aW5nIGFuZCB0aGUgbWFjcm8tZGVmaW5lZCBjYWxsYmFja3MgcHJvdmlkZSBwZXItdmFyaWFibGUgY2FzdGluZworICogYmVmb3JlIGRlZmVycmluZyB0byB0aGUgdW5kZXJseWluZyB0eXBlLXNwZWNpZmljIGNhbGxiYWNrcy4gTkI6IEl0IGlzCisgKiBwb3NzaWJsZSB0byBwbGFjZSBhICJzdGF0aWMiIGluIGZyb250IG9mIGJvdGggdGhlIERFQ0xBUkUgYW5kIElNUExFTUVOVAorICogbWFjcm9zIGlmIHRoZSBmdW5jdGlvbnMgYXJlIHN0cmljdGx5IGludGVybmFsLiAqLworCisvKiBGaXJzdDogImhhc2giIGZ1bmN0aW9ucyAqLworI2RlZmluZSBERUNMQVJFX0xIQVNIX0hBU0hfRk4obmFtZSwgb190eXBlKSBcCisJdW5zaWduZWQgbG9uZyBuYW1lIyNfTEhBU0hfSEFTSChjb25zdCB2b2lkICopOworI2RlZmluZSBJTVBMRU1FTlRfTEhBU0hfSEFTSF9GTihuYW1lLCBvX3R5cGUpIFwKKwl1bnNpZ25lZCBsb25nIG5hbWUjI19MSEFTSF9IQVNIKGNvbnN0IHZvaWQgKmFyZykgeyBcCisJCWNvbnN0IG9fdHlwZSAqYSA9IGFyZzsgXAorCQlyZXR1cm4gbmFtZSMjX2hhc2goYSk7IH0KKyNkZWZpbmUgTEhBU0hfSEFTSF9GTihuYW1lKSBuYW1lIyNfTEhBU0hfSEFTSAorCisvKiBTZWNvbmQ6ICJjb21wYXJlIiBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgREVDTEFSRV9MSEFTSF9DT01QX0ZOKG5hbWUsIG9fdHlwZSkgXAorCWludCBuYW1lIyNfTEhBU0hfQ09NUChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CisjZGVmaW5lIElNUExFTUVOVF9MSEFTSF9DT01QX0ZOKG5hbWUsIG9fdHlwZSkgXAorCWludCBuYW1lIyNfTEhBU0hfQ09NUChjb25zdCB2b2lkICphcmcxLCBjb25zdCB2b2lkICphcmcyKSB7IFwKKwkJY29uc3Qgb190eXBlICphID0gYXJnMTsJCSAgICBcCisJCWNvbnN0IG9fdHlwZSAqYiA9IGFyZzI7IFwKKwkJcmV0dXJuIG5hbWUjI19jbXAoYSxiKTsgfQorI2RlZmluZSBMSEFTSF9DT01QX0ZOKG5hbWUpIG5hbWUjI19MSEFTSF9DT01QCisKKy8qIFRoaXJkOiAiZG9hbGwiIGZ1bmN0aW9ucyAqLworI2RlZmluZSBERUNMQVJFX0xIQVNIX0RPQUxMX0ZOKG5hbWUsIG9fdHlwZSkgXAorCXZvaWQgbmFtZSMjX0xIQVNIX0RPQUxMKHZvaWQgKik7CisjZGVmaW5lIElNUExFTUVOVF9MSEFTSF9ET0FMTF9GTihuYW1lLCBvX3R5cGUpIFwKKwl2b2lkIG5hbWUjI19MSEFTSF9ET0FMTCh2b2lkICphcmcpIHsgXAorCQlvX3R5cGUgKmEgPSBhcmc7IFwKKwkJbmFtZSMjX2RvYWxsKGEpOyB9CisjZGVmaW5lIExIQVNIX0RPQUxMX0ZOKG5hbWUpIG5hbWUjI19MSEFTSF9ET0FMTAorCisvKiBGb3VydGg6ICJkb2FsbF9hcmciIGZ1bmN0aW9ucyAqLworI2RlZmluZSBERUNMQVJFX0xIQVNIX0RPQUxMX0FSR19GTihuYW1lLCBvX3R5cGUsIGFfdHlwZSkgXAorCXZvaWQgbmFtZSMjX0xIQVNIX0RPQUxMX0FSRyh2b2lkICosIHZvaWQgKik7CisjZGVmaW5lIElNUExFTUVOVF9MSEFTSF9ET0FMTF9BUkdfRk4obmFtZSwgb190eXBlLCBhX3R5cGUpIFwKKwl2b2lkIG5hbWUjI19MSEFTSF9ET0FMTF9BUkcodm9pZCAqYXJnMSwgdm9pZCAqYXJnMikgeyBcCisJCW9fdHlwZSAqYSA9IGFyZzE7IFwKKwkJYV90eXBlICpiID0gYXJnMjsgXAorCQluYW1lIyNfZG9hbGxfYXJnKGEsIGIpOyB9CisjZGVmaW5lIExIQVNIX0RPQUxMX0FSR19GTihuYW1lKSBuYW1lIyNfTEhBU0hfRE9BTExfQVJHCisKK3R5cGVkZWYgc3RydWN0IGxoYXNoX3N0CisJeworCUxIQVNIX05PREUgKipiOworCUxIQVNIX0NPTVBfRk5fVFlQRSBjb21wOworCUxIQVNIX0hBU0hfRk5fVFlQRSBoYXNoOworCXVuc2lnbmVkIGludCBudW1fbm9kZXM7CisJdW5zaWduZWQgaW50IG51bV9hbGxvY19ub2RlczsKKwl1bnNpZ25lZCBpbnQgcDsKKwl1bnNpZ25lZCBpbnQgcG1heDsKKwl1bnNpZ25lZCBsb25nIHVwX2xvYWQ7IC8qIGxvYWQgdGltZXMgMjU2ICovCisJdW5zaWduZWQgbG9uZyBkb3duX2xvYWQ7IC8qIGxvYWQgdGltZXMgMjU2ICovCisJdW5zaWduZWQgbG9uZyBudW1faXRlbXM7CisKKwl1bnNpZ25lZCBsb25nIG51bV9leHBhbmRzOworCXVuc2lnbmVkIGxvbmcgbnVtX2V4cGFuZF9yZWFsbG9jczsKKwl1bnNpZ25lZCBsb25nIG51bV9jb250cmFjdHM7CisJdW5zaWduZWQgbG9uZyBudW1fY29udHJhY3RfcmVhbGxvY3M7CisJdW5zaWduZWQgbG9uZyBudW1faGFzaF9jYWxsczsKKwl1bnNpZ25lZCBsb25nIG51bV9jb21wX2NhbGxzOworCXVuc2lnbmVkIGxvbmcgbnVtX2luc2VydDsKKwl1bnNpZ25lZCBsb25nIG51bV9yZXBsYWNlOworCXVuc2lnbmVkIGxvbmcgbnVtX2RlbGV0ZTsKKwl1bnNpZ25lZCBsb25nIG51bV9ub19kZWxldGU7CisJdW5zaWduZWQgbG9uZyBudW1fcmV0cmlldmU7CisJdW5zaWduZWQgbG9uZyBudW1fcmV0cmlldmVfbWlzczsKKwl1bnNpZ25lZCBsb25nIG51bV9oYXNoX2NvbXBzOworCisJaW50IGVycm9yOworCX0gX0xIQVNIOwkvKiBEbyBub3QgdXNlIF9MSEFTSCBkaXJlY3RseSwgdXNlIExIQVNIX09GCisJCQkgKiBhbmQgZnJpZW5kcyAqLworCisjZGVmaW5lIExIX0xPQURfTVVMVAkyNTYKKworLyogSW5kaWNhdGVzIGEgbWFsbG9jKCkgZXJyb3IgaW4gdGhlIGxhc3QgY2FsbCwgdGhpcyBpcyBvbmx5IGJhZAorICogaW4gbGhfaW5zZXJ0KCkuICovCisjZGVmaW5lIGxoX2Vycm9yKGxoKQkoKGxoKS0+ZXJyb3IpCisKK19MSEFTSCAqbGhfbmV3KExIQVNIX0hBU0hfRk5fVFlQRSBoLCBMSEFTSF9DT01QX0ZOX1RZUEUgYyk7Cit2b2lkIGxoX2ZyZWUoX0xIQVNIICpsaCk7Cit2b2lkICpsaF9pbnNlcnQoX0xIQVNIICpsaCwgdm9pZCAqZGF0YSk7Cit2b2lkICpsaF9kZWxldGUoX0xIQVNIICpsaCwgY29uc3Qgdm9pZCAqZGF0YSk7Cit2b2lkICpsaF9yZXRyaWV2ZShfTEhBU0ggKmxoLCBjb25zdCB2b2lkICpkYXRhKTsKK3ZvaWQgbGhfZG9hbGwoX0xIQVNIICpsaCwgTEhBU0hfRE9BTExfRk5fVFlQRSBmdW5jKTsKK3ZvaWQgbGhfZG9hbGxfYXJnKF9MSEFTSCAqbGgsIExIQVNIX0RPQUxMX0FSR19GTl9UWVBFIGZ1bmMsIHZvaWQgKmFyZyk7Cit1bnNpZ25lZCBsb25nIGxoX3N0cmhhc2goY29uc3QgY2hhciAqYyk7Cit1bnNpZ25lZCBsb25nIGxoX251bV9pdGVtcyhjb25zdCBfTEhBU0ggKmxoKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQordm9pZCBsaF9zdGF0cyhjb25zdCBfTEhBU0ggKmxoLCBGSUxFICpvdXQpOwordm9pZCBsaF9ub2RlX3N0YXRzKGNvbnN0IF9MSEFTSCAqbGgsIEZJTEUgKm91dCk7Cit2b2lkIGxoX25vZGVfdXNhZ2Vfc3RhdHMoY29uc3QgX0xIQVNIICpsaCwgRklMRSAqb3V0KTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCit2b2lkIGxoX3N0YXRzX2Jpbyhjb25zdCBfTEhBU0ggKmxoLCBCSU8gKm91dCk7Cit2b2lkIGxoX25vZGVfc3RhdHNfYmlvKGNvbnN0IF9MSEFTSCAqbGgsIEJJTyAqb3V0KTsKK3ZvaWQgbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oY29uc3QgX0xIQVNIICpsaCwgQklPICpvdXQpOworI2VuZGlmCisKKy8qIFR5cGUgY2hlY2tpbmcuLi4gKi8KKworI2RlZmluZSBMSEFTSF9PRih0eXBlKSBzdHJ1Y3QgbGhhc2hfc3RfIyN0eXBlCisKKyNkZWZpbmUgREVDTEFSRV9MSEFTSF9PRih0eXBlKSBMSEFTSF9PRih0eXBlKSB7IGludCBkdW1teTsgfQorCisjZGVmaW5lIENIRUNLRURfTEhBU0hfT0YodHlwZSxsaCkgXAorICAoKF9MSEFTSCAqKUNIRUNLRURfUFRSX09GKExIQVNIX09GKHR5cGUpLGxoKSkKKworLyogRGVmaW5lIHdyYXBwZXIgZnVuY3Rpb25zLiAqLworI2RlZmluZSBMSE1fbGhfbmV3KHR5cGUsIG5hbWUpIFwKKyAgKChMSEFTSF9PRih0eXBlKSAqKWxoX25ldyhMSEFTSF9IQVNIX0ZOKG5hbWUpLCBMSEFTSF9DT01QX0ZOKG5hbWUpKSkKKyNkZWZpbmUgTEhNX2xoX2Vycm9yKHR5cGUsIGxoKSBcCisgIGxoX2Vycm9yKENIRUNLRURfTEhBU0hfT0YodHlwZSxsaCkpCisjZGVmaW5lIExITV9saF9pbnNlcnQodHlwZSwgbGgsIGluc3QpIFwKKyAgKCh0eXBlICopbGhfaW5zZXJ0KENIRUNLRURfTEhBU0hfT0YodHlwZSwgbGgpLCBcCisJCSAgICAgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgaW5zdCkpKQorI2RlZmluZSBMSE1fbGhfcmV0cmlldmUodHlwZSwgbGgsIGluc3QpIFwKKyAgKCh0eXBlICopbGhfcmV0cmlldmUoQ0hFQ0tFRF9MSEFTSF9PRih0eXBlLCBsaCksIFwKKwkJICAgICAgIENIRUNLRURfUFRSX09GKHR5cGUsIGluc3QpKSkKKyNkZWZpbmUgTEhNX2xoX2RlbGV0ZSh0eXBlLCBsaCwgaW5zdCkgXAorICAoKHR5cGUgKilsaF9kZWxldGUoQ0hFQ0tFRF9MSEFTSF9PRih0eXBlLCBsaCksCQkJXAorCQkgICAgIENIRUNLRURfUFRSX09GKHR5cGUsIGluc3QpKSkKKyNkZWZpbmUgTEhNX2xoX2RvYWxsKHR5cGUsIGxoLGZuKSBsaF9kb2FsbChDSEVDS0VEX0xIQVNIX09GKHR5cGUsIGxoKSwgZm4pCisjZGVmaW5lIExITV9saF9kb2FsbF9hcmcodHlwZSwgbGgsIGZuLCBhcmdfdHlwZSwgYXJnKSBcCisgIGxoX2RvYWxsX2FyZyhDSEVDS0VEX0xIQVNIX09GKHR5cGUsIGxoKSwgZm4sIENIRUNLRURfUFRSX09GKGFyZ190eXBlLCBhcmcpKQorI2RlZmluZSBMSE1fbGhfbnVtX2l0ZW1zKHR5cGUsIGxoKSBsaF9udW1faXRlbXMoQ0hFQ0tFRF9MSEFTSF9PRih0eXBlLCBsaCkpCisjZGVmaW5lIExITV9saF9kb3duX2xvYWQodHlwZSwgbGgpIChDSEVDS0VEX0xIQVNIX09GKHR5cGUsIGxoKS0+ZG93bl9sb2FkKQorI2RlZmluZSBMSE1fbGhfbm9kZV9zdGF0c19iaW8odHlwZSwgbGgsIG91dCkgXAorICBsaF9ub2RlX3N0YXRzX2JpbyhDSEVDS0VEX0xIQVNIX09GKHR5cGUsIGxoKSwgb3V0KQorI2RlZmluZSBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8odHlwZSwgbGgsIG91dCkgXAorICBsaF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhDSEVDS0VEX0xIQVNIX09GKHR5cGUsIGxoKSwgb3V0KQorI2RlZmluZSBMSE1fbGhfc3RhdHNfYmlvKHR5cGUsIGxoLCBvdXQpIFwKKyAgbGhfc3RhdHNfYmlvKENIRUNLRURfTEhBU0hfT0YodHlwZSwgbGgpLCBvdXQpCisjZGVmaW5lIExITV9saF9mcmVlKHR5cGUsIGxoKSBsaF9mcmVlKENIRUNLRURfTEhBU0hfT0YodHlwZSwgbGgpKQorCitERUNMQVJFX0xIQVNIX09GKE9QRU5TU0xfU1RSSU5HKTsKK0RFQ0xBUkVfTEhBU0hfT0YoT1BFTlNTTF9DU1RSSU5HKTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvbWQ0LmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvbWQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlZDliMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9tZDQuaApAQCAtMCwwICsxLDExNyBAQAorLyogY3J5cHRvL21kNC9tZDQuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9NRDRfSAorI2RlZmluZSBIRUFERVJfTUQ0X0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfTk9fTUQ0CisjZXJyb3IgTUQ0IGlzIGRpc2FibGVkLgorI2VuZGlmCisKKy8qCisgKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICogISBNRDRfTE9ORyBoYXMgdG8gYmUgYXQgbGVhc3QgMzIgYml0cyB3aWRlLiBJZiBpdCdzIHdpZGVyLCB0aGVuICEKKyAqICEgTUQ0X0xPTkdfTE9HMiBoYXMgdG8gYmUgZGVmaW5lZCBhbG9uZy4JCQkgICAhCisgKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICovCisKKyNpZiBkZWZpbmVkKF9fTFAzMl9fKQorI2RlZmluZSBNRDRfTE9ORyB1bnNpZ25lZCBsb25nCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0NSQVkpIHx8IGRlZmluZWQoX19JTFA2NF9fKQorI2RlZmluZSBNRDRfTE9ORyB1bnNpZ25lZCBsb25nCisjZGVmaW5lIE1ENF9MT05HX0xPRzIgMworLyoKKyAqIF9DUkFZIG5vdGUuIEkgY291bGQgZGVjbGFyZSBzaG9ydCwgYnV0IEkgaGF2ZSBubyBpZGVhIHdoYXQgaW1wYWN0CisgKiBkb2VzIGl0IGhhdmUgb24gcGVyZm9ybWFuY2Ugb24gbm9uZS1UM0UgbWFjaGluZXMuIEkgY291bGQgZGVjbGFyZQorICogaW50LCBidXQgYXQgbGVhc3Qgb24gQzkwIHNpemVvZihpbnQpIGNhbiBiZSBjaG9zZW4gYXQgY29tcGlsZSB0aW1lLgorICogU28gSSd2ZSBjaG9zZW4gbG9uZy4uLgorICoJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKyAqLworI2Vsc2UKKyNkZWZpbmUgTUQ0X0xPTkcgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSBNRDRfQ0JMT0NLCTY0CisjZGVmaW5lIE1ENF9MQkxPQ0sJKE1ENF9DQkxPQ0svNCkKKyNkZWZpbmUgTUQ0X0RJR0VTVF9MRU5HVEggMTYKKwordHlwZWRlZiBzdHJ1Y3QgTUQ0c3RhdGVfc3QKKwl7CisJTUQ0X0xPTkcgQSxCLEMsRDsKKwlNRDRfTE9ORyBObCxOaDsKKwlNRDRfTE9ORyBkYXRhW01ENF9MQkxPQ0tdOworCXVuc2lnbmVkIGludCBudW07CisJfSBNRDRfQ1RYOworCitpbnQgTUQ0X0luaXQoTUQ0X0NUWCAqYyk7CitpbnQgTUQ0X1VwZGF0ZShNRDRfQ1RYICpjLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKK2ludCBNRDRfRmluYWwodW5zaWduZWQgY2hhciAqbWQsIE1ENF9DVFggKmMpOwordW5zaWduZWQgY2hhciAqTUQ0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIHNpemVfdCBuLCB1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIE1ENF9UcmFuc2Zvcm0oTUQ0X0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqYik7CisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvbWQ1LmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvbWQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiZjg0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9tZDUuaApAQCAtMCwwICsxLDExNyBAQAorLyogY3J5cHRvL21kNS9tZDUuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9NRDVfSAorI2RlZmluZSBIRUFERVJfTUQ1X0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfTk9fTUQ1CisjZXJyb3IgTUQ1IGlzIGRpc2FibGVkLgorI2VuZGlmCisKKy8qCisgKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICogISBNRDVfTE9ORyBoYXMgdG8gYmUgYXQgbGVhc3QgMzIgYml0cyB3aWRlLiBJZiBpdCdzIHdpZGVyLCB0aGVuICEKKyAqICEgTUQ1X0xPTkdfTE9HMiBoYXMgdG8gYmUgZGVmaW5lZCBhbG9uZy4JCQkgICAhCisgKiAhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICovCisKKyNpZiBkZWZpbmVkKF9fTFAzMl9fKQorI2RlZmluZSBNRDVfTE9ORyB1bnNpZ25lZCBsb25nCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0NSQVkpIHx8IGRlZmluZWQoX19JTFA2NF9fKQorI2RlZmluZSBNRDVfTE9ORyB1bnNpZ25lZCBsb25nCisjZGVmaW5lIE1ENV9MT05HX0xPRzIgMworLyoKKyAqIF9DUkFZIG5vdGUuIEkgY291bGQgZGVjbGFyZSBzaG9ydCwgYnV0IEkgaGF2ZSBubyBpZGVhIHdoYXQgaW1wYWN0CisgKiBkb2VzIGl0IGhhdmUgb24gcGVyZm9ybWFuY2Ugb24gbm9uZS1UM0UgbWFjaGluZXMuIEkgY291bGQgZGVjbGFyZQorICogaW50LCBidXQgYXQgbGVhc3Qgb24gQzkwIHNpemVvZihpbnQpIGNhbiBiZSBjaG9zZW4gYXQgY29tcGlsZSB0aW1lLgorICogU28gSSd2ZSBjaG9zZW4gbG9uZy4uLgorICoJCQkJCTxhcHByb0BmeS5jaGFsbWVycy5zZT4KKyAqLworI2Vsc2UKKyNkZWZpbmUgTUQ1X0xPTkcgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSBNRDVfQ0JMT0NLCTY0CisjZGVmaW5lIE1ENV9MQkxPQ0sJKE1ENV9DQkxPQ0svNCkKKyNkZWZpbmUgTUQ1X0RJR0VTVF9MRU5HVEggMTYKKwordHlwZWRlZiBzdHJ1Y3QgTUQ1c3RhdGVfc3QKKwl7CisJTUQ1X0xPTkcgQSxCLEMsRDsKKwlNRDVfTE9ORyBObCxOaDsKKwlNRDVfTE9ORyBkYXRhW01ENV9MQkxPQ0tdOworCXVuc2lnbmVkIGludCBudW07CisJfSBNRDVfQ1RYOworCitpbnQgTUQ1X0luaXQoTUQ1X0NUWCAqYyk7CitpbnQgTUQ1X1VwZGF0ZShNRDVfQ1RYICpjLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKK2ludCBNRDVfRmluYWwodW5zaWduZWQgY2hhciAqbWQsIE1ENV9DVFggKmMpOwordW5zaWduZWQgY2hhciAqTUQ1KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIHNpemVfdCBuLCB1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIE1ENV9UcmFuc2Zvcm0oTUQ1X0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqYik7CisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvbW9kZXMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9tb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGQ5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvbW9kZXMuaApAQCAtMCwwICsxLDU5IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBPcGVuU1NMIFByb2plY3QuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmlnaHRzIGZvciByZWRpc3RyaWJ1dGlvbiBhbmQgdXNhZ2UgaW4gc291cmNlIGFuZCBiaW5hcnkKKyAqIGZvcm1zIGFyZSBncmFudGVkIGFjY29yZGluZyB0byB0aGUgT3BlblNTTCBsaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwordHlwZWRlZiB2b2lkICgqYmxvY2sxMjhfZikoY29uc3QgdW5zaWduZWQgY2hhciBpblsxNl0sCisJCQl1bnNpZ25lZCBjaGFyIG91dFsxNl0sCisJCQljb25zdCB2b2lkICprZXkpOworCit0eXBlZGVmIHZvaWQgKCpjYmMxMjhfZikoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGludCBlbmMpOworCit2b2lkIENSWVBUT19jYmMxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqa2V5LAorCQkJdW5zaWduZWQgY2hhciBpdmVjWzE2XSwgYmxvY2sxMjhfZiBibG9jayk7Cit2b2lkIENSWVBUT19jYmMxMjhfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqa2V5LAorCQkJdW5zaWduZWQgY2hhciBpdmVjWzE2XSwgYmxvY2sxMjhfZiBibG9jayk7CisKK3ZvaWQgQ1JZUFRPX2N0cjEyOF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCQlzaXplX3QgbGVuLCBjb25zdCB2b2lkICprZXksCisJCQl1bnNpZ25lZCBjaGFyIGl2ZWNbMTZdLCB1bnNpZ25lZCBjaGFyIGVjb3VudF9idWZbMTZdLAorCQkJdW5zaWduZWQgaW50ICpudW0sIGJsb2NrMTI4X2YgYmxvY2spOworCit2b2lkIENSWVBUT19vZmIxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqa2V5LAorCQkJdW5zaWduZWQgY2hhciBpdmVjWzE2XSwgaW50ICpudW0sCisJCQlibG9jazEyOF9mIGJsb2NrKTsKKwordm9pZCBDUllQVE9fY2ZiMTI4X2VuY3J5cHQoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGludCAqbnVtLAorCQkJaW50IGVuYywgYmxvY2sxMjhfZiBibG9jayk7Cit2b2lkIENSWVBUT19jZmIxMjhfOF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCQlzaXplX3QgbGVuZ3RoLCBjb25zdCB2b2lkICprZXksCisJCQl1bnNpZ25lZCBjaGFyIGl2ZWNbMTZdLCBpbnQgKm51bSwKKwkJCWludCBlbmMsIGJsb2NrMTI4X2YgYmxvY2spOwordm9pZCBDUllQVE9fY2ZiMTI4XzFfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJc2l6ZV90IGJpdHMsIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGludCAqbnVtLAorCQkJaW50IGVuYywgYmxvY2sxMjhfZiBibG9jayk7CisKK3NpemVfdCBDUllQVE9fY3RzMTI4X2VuY3J5cHRfYmxvY2soY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGJsb2NrMTI4X2YgYmxvY2spOworc2l6ZV90IENSWVBUT19jdHMxMjhfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqa2V5LAorCQkJdW5zaWduZWQgY2hhciBpdmVjWzE2XSwgY2JjMTI4X2YgY2JjKTsKK3NpemVfdCBDUllQVE9fY3RzMTI4X2RlY3J5cHRfYmxvY2soY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCwKKwkJCXNpemVfdCBsZW4sIGNvbnN0IHZvaWQgKmtleSwKKwkJCXVuc2lnbmVkIGNoYXIgaXZlY1sxNl0sIGJsb2NrMTI4X2YgYmxvY2spOworc2l6ZV90IENSWVBUT19jdHMxMjhfZGVjcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqb3V0LAorCQkJc2l6ZV90IGxlbiwgY29uc3Qgdm9pZCAqa2V5LAorCQkJdW5zaWduZWQgY2hhciBpdmVjWzE2XSwgY2JjMTI4X2YgY2JjKTsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MmYxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCkBAIC0wLDAgKzEsMzkxNCBAQAorLyogY3J5cHRvL29iamVjdHMvb2JqX21hYy5oICovCisKKy8qIFRISVMgRklMRSBJUyBHRU5FUkFURUQgRlJPTSBvYmplY3RzLnR4dCBieSBvYmplY3RzLnBsIHZpYSB0aGUKKyAqIGZvbGxvd2luZyBjb21tYW5kOgorICogcGVybCBvYmplY3RzLnBsIG9iamVjdHMudHh0IG9ial9tYWMubnVtIG9ial9tYWMuaAorICovCisKKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2RlZmluZSBTTl91bmRlZgkJCSJVTkRFRiIKKyNkZWZpbmUgTE5fdW5kZWYJCQkidW5kZWZpbmVkIgorI2RlZmluZSBOSURfdW5kZWYJCQkwCisjZGVmaW5lIE9CSl91bmRlZgkJCTBMCisKKyNkZWZpbmUgU05faXR1X3QJCSJJVFUtVCIKKyNkZWZpbmUgTE5faXR1X3QJCSJpdHUtdCIKKyNkZWZpbmUgTklEX2l0dV90CQk2NDUKKyNkZWZpbmUgT0JKX2l0dV90CQkwTAorCisjZGVmaW5lIE5JRF9jY2l0dAkJNDA0CisjZGVmaW5lIE9CSl9jY2l0dAkJT0JKX2l0dV90CisKKyNkZWZpbmUgU05faXNvCQkiSVNPIgorI2RlZmluZSBMTl9pc28JCSJpc28iCisjZGVmaW5lIE5JRF9pc28JCTE4MQorI2RlZmluZSBPQkpfaXNvCQkxTAorCisjZGVmaW5lIFNOX2pvaW50X2lzb19pdHVfdAkJIkpPSU5ULUlTTy1JVFUtVCIKKyNkZWZpbmUgTE5fam9pbnRfaXNvX2l0dV90CQkiam9pbnQtaXNvLWl0dS10IgorI2RlZmluZSBOSURfam9pbnRfaXNvX2l0dV90CQk2NDYKKyNkZWZpbmUgT0JKX2pvaW50X2lzb19pdHVfdAkJMkwKKworI2RlZmluZSBOSURfam9pbnRfaXNvX2NjaXR0CQkzOTMKKyNkZWZpbmUgT0JKX2pvaW50X2lzb19jY2l0dAkJT0JKX2pvaW50X2lzb19pdHVfdAorCisjZGVmaW5lIFNOX21lbWJlcl9ib2R5CQkibWVtYmVyLWJvZHkiCisjZGVmaW5lIExOX21lbWJlcl9ib2R5CQkiSVNPIE1lbWJlciBCb2R5IgorI2RlZmluZSBOSURfbWVtYmVyX2JvZHkJCTE4MgorI2RlZmluZSBPQkpfbWVtYmVyX2JvZHkJCU9CSl9pc28sMkwKKworI2RlZmluZSBTTl9pZGVudGlmaWVkX29yZ2FuaXphdGlvbgkJImlkZW50aWZpZWQtb3JnYW5pemF0aW9uIgorI2RlZmluZSBOSURfaWRlbnRpZmllZF9vcmdhbml6YXRpb24JCTY3NgorI2RlZmluZSBPQkpfaWRlbnRpZmllZF9vcmdhbml6YXRpb24JCU9CSl9pc28sM0wKKworI2RlZmluZSBTTl9obWFjX21kNQkJIkhNQUMtTUQ1IgorI2RlZmluZSBMTl9obWFjX21kNQkJImhtYWMtbWQ1IgorI2RlZmluZSBOSURfaG1hY19tZDUJCTc4MAorI2RlZmluZSBPQkpfaG1hY19tZDUJCU9CSl9pZGVudGlmaWVkX29yZ2FuaXphdGlvbiw2TCwxTCw1TCw1TCw4TCwxTCwxTAorCisjZGVmaW5lIFNOX2htYWNfc2hhMQkJIkhNQUMtU0hBMSIKKyNkZWZpbmUgTE5faG1hY19zaGExCQkiaG1hYy1zaGExIgorI2RlZmluZSBOSURfaG1hY19zaGExCQk3ODEKKyNkZWZpbmUgT0JKX2htYWNfc2hhMQkJT0JKX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uLDZMLDFMLDVMLDVMLDhMLDFMLDJMCisKKyNkZWZpbmUgU05fY2VydGljb21fYXJjCQkiY2VydGljb20tYXJjIgorI2RlZmluZSBOSURfY2VydGljb21fYXJjCQk2NzcKKyNkZWZpbmUgT0JKX2NlcnRpY29tX2FyYwkJT0JKX2lkZW50aWZpZWRfb3JnYW5pemF0aW9uLDEzMkwKKworI2RlZmluZSBTTl9pbnRlcm5hdGlvbmFsX29yZ2FuaXphdGlvbnMJCSJpbnRlcm5hdGlvbmFsLW9yZ2FuaXphdGlvbnMiCisjZGVmaW5lIExOX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucwkJIkludGVybmF0aW9uYWwgT3JnYW5pemF0aW9ucyIKKyNkZWZpbmUgTklEX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucwkJNjQ3CisjZGVmaW5lIE9CSl9pbnRlcm5hdGlvbmFsX29yZ2FuaXphdGlvbnMJCU9CSl9qb2ludF9pc29faXR1X3QsMjNMCisKKyNkZWZpbmUgU05fd2FwCQkid2FwIgorI2RlZmluZSBOSURfd2FwCQk2NzgKKyNkZWZpbmUgT0JKX3dhcAkJT0JKX2ludGVybmF0aW9uYWxfb3JnYW5pemF0aW9ucyw0M0wKKworI2RlZmluZSBTTl93YXBfd3NnCQkid2FwLXdzZyIKKyNkZWZpbmUgTklEX3dhcF93c2cJCTY3OQorI2RlZmluZSBPQkpfd2FwX3dzZwkJT0JKX3dhcCwxTAorCisjZGVmaW5lIFNOX3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcwkJInNlbGVjdGVkLWF0dHJpYnV0ZS10eXBlcyIKKyNkZWZpbmUgTE5fc2VsZWN0ZWRfYXR0cmlidXRlX3R5cGVzCQkiU2VsZWN0ZWQgQXR0cmlidXRlIFR5cGVzIgorI2RlZmluZSBOSURfc2VsZWN0ZWRfYXR0cmlidXRlX3R5cGVzCQkzOTQKKyNkZWZpbmUgT0JKX3NlbGVjdGVkX2F0dHJpYnV0ZV90eXBlcwkJT0JKX2pvaW50X2lzb19pdHVfdCw1TCwxTCw1TAorCisjZGVmaW5lIFNOX2NsZWFyYW5jZQkJImNsZWFyYW5jZSIKKyNkZWZpbmUgTklEX2NsZWFyYW5jZQkJMzk1CisjZGVmaW5lIE9CSl9jbGVhcmFuY2UJCU9CSl9zZWxlY3RlZF9hdHRyaWJ1dGVfdHlwZXMsNTVMCisKKyNkZWZpbmUgU05fSVNPX1VTCQkiSVNPLVVTIgorI2RlZmluZSBMTl9JU09fVVMJCSJJU08gVVMgTWVtYmVyIEJvZHkiCisjZGVmaW5lIE5JRF9JU09fVVMJCTE4MworI2RlZmluZSBPQkpfSVNPX1VTCQlPQkpfbWVtYmVyX2JvZHksODQwTAorCisjZGVmaW5lIFNOX1g5XzU3CQkiWDktNTciCisjZGVmaW5lIExOX1g5XzU3CQkiWDkuNTciCisjZGVmaW5lIE5JRF9YOV81NwkJMTg0CisjZGVmaW5lIE9CSl9YOV81NwkJT0JKX0lTT19VUywxMDA0MEwKKworI2RlZmluZSBTTl9YOWNtCQkiWDljbSIKKyNkZWZpbmUgTE5fWDljbQkJIlg5LjU3IENNID8iCisjZGVmaW5lIE5JRF9YOWNtCQkxODUKKyNkZWZpbmUgT0JKX1g5Y20JCU9CSl9YOV81Nyw0TAorCisjZGVmaW5lIFNOX2RzYQkJIkRTQSIKKyNkZWZpbmUgTE5fZHNhCQkiZHNhRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX2RzYQkJMTE2CisjZGVmaW5lIE9CSl9kc2EJCU9CSl9YOWNtLDFMCisKKyNkZWZpbmUgU05fZHNhV2l0aFNIQTEJCSJEU0EtU0hBMSIKKyNkZWZpbmUgTE5fZHNhV2l0aFNIQTEJCSJkc2FXaXRoU0hBMSIKKyNkZWZpbmUgTklEX2RzYVdpdGhTSEExCQkxMTMKKyNkZWZpbmUgT0JKX2RzYVdpdGhTSEExCQlPQkpfWDljbSwzTAorCisjZGVmaW5lIFNOX2Fuc2lfWDlfNjIJCSJhbnNpLVg5LTYyIgorI2RlZmluZSBMTl9hbnNpX1g5XzYyCQkiQU5TSSBYOS42MiIKKyNkZWZpbmUgTklEX2Fuc2lfWDlfNjIJCTQwNQorI2RlZmluZSBPQkpfYW5zaV9YOV82MgkJT0JKX0lTT19VUywxMDA0NUwKKworI2RlZmluZSBPQkpfWDlfNjJfaWRfZmllbGRUeXBlCQlPQkpfYW5zaV9YOV82MiwxTAorCisjZGVmaW5lIFNOX1g5XzYyX3ByaW1lX2ZpZWxkCQkicHJpbWUtZmllbGQiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZV9maWVsZAkJNDA2CisjZGVmaW5lIE9CSl9YOV82Ml9wcmltZV9maWVsZAkJT0JKX1g5XzYyX2lkX2ZpZWxkVHlwZSwxTAorCisjZGVmaW5lIFNOX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZAkJImNoYXJhY3RlcmlzdGljLXR3by1maWVsZCIKKyNkZWZpbmUgTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZAkJNDA3CisjZGVmaW5lIE9CSl9YOV82Ml9jaGFyYWN0ZXJpc3RpY190d29fZmllbGQJCU9CSl9YOV82Ml9pZF9maWVsZFR5cGUsMkwKKworI2RlZmluZSBTTl9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMJCSJpZC1jaGFyYWN0ZXJpc3RpYy10d28tYmFzaXMiCisjZGVmaW5lIE5JRF9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMJCTY4MAorI2RlZmluZSBPQkpfWDlfNjJfaWRfY2hhcmFjdGVyaXN0aWNfdHdvX2Jhc2lzCQlPQkpfWDlfNjJfY2hhcmFjdGVyaXN0aWNfdHdvX2ZpZWxkLDNMCisKKyNkZWZpbmUgU05fWDlfNjJfb25CYXNpcwkJIm9uQmFzaXMiCisjZGVmaW5lIE5JRF9YOV82Ml9vbkJhc2lzCQk2ODEKKyNkZWZpbmUgT0JKX1g5XzYyX29uQmFzaXMJCU9CSl9YOV82Ml9pZF9jaGFyYWN0ZXJpc3RpY190d29fYmFzaXMsMUwKKworI2RlZmluZSBTTl9YOV82Ml90cEJhc2lzCQkidHBCYXNpcyIKKyNkZWZpbmUgTklEX1g5XzYyX3RwQmFzaXMJCTY4MgorI2RlZmluZSBPQkpfWDlfNjJfdHBCYXNpcwkJT0JKX1g5XzYyX2lkX2NoYXJhY3RlcmlzdGljX3R3b19iYXNpcywyTAorCisjZGVmaW5lIFNOX1g5XzYyX3BwQmFzaXMJCSJwcEJhc2lzIgorI2RlZmluZSBOSURfWDlfNjJfcHBCYXNpcwkJNjgzCisjZGVmaW5lIE9CSl9YOV82Ml9wcEJhc2lzCQlPQkpfWDlfNjJfaWRfY2hhcmFjdGVyaXN0aWNfdHdvX2Jhc2lzLDNMCisKKyNkZWZpbmUgT0JKX1g5XzYyX2lkX3B1YmxpY0tleVR5cGUJCU9CSl9hbnNpX1g5XzYyLDJMCisKKyNkZWZpbmUgU05fWDlfNjJfaWRfZWNQdWJsaWNLZXkJCSJpZC1lY1B1YmxpY0tleSIKKyNkZWZpbmUgTklEX1g5XzYyX2lkX2VjUHVibGljS2V5CQk0MDgKKyNkZWZpbmUgT0JKX1g5XzYyX2lkX2VjUHVibGljS2V5CQlPQkpfWDlfNjJfaWRfcHVibGljS2V5VHlwZSwxTAorCisjZGVmaW5lIE9CSl9YOV82Ml9lbGxpcHRpY0N1cnZlCQlPQkpfYW5zaV9YOV82MiwzTAorCisjZGVmaW5lIE9CSl9YOV82Ml9jX1R3b0N1cnZlCQlPQkpfWDlfNjJfZWxsaXB0aWNDdXJ2ZSwwTAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMTYzdjEJCSJjMnBuYjE2M3YxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIxNjN2MQkJNjg0CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjE2M3YxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxTAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMTYzdjIJCSJjMnBuYjE2M3YyIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIxNjN2MgkJNjg1CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjE2M3YyCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwyTAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMTYzdjMJCSJjMnBuYjE2M3YzIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIxNjN2MwkJNjg2CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjE2M3YzCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwzTAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMTc2djEJCSJjMnBuYjE3NnYxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIxNzZ2MQkJNjg3CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjE3NnYxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw0TAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMTkxdjEJCSJjMnRuYjE5MXYxIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIxOTF2MQkJNjg4CisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjE5MXYxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw1TAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMTkxdjIJCSJjMnRuYjE5MXYyIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIxOTF2MgkJNjg5CisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjE5MXYyCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw2TAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMTkxdjMJCSJjMnRuYjE5MXYzIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIxOTF2MwkJNjkwCisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjE5MXYzCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw3TAorCisjZGVmaW5lIFNOX1g5XzYyX2Myb25iMTkxdjQJCSJjMm9uYjE5MXY0IgorI2RlZmluZSBOSURfWDlfNjJfYzJvbmIxOTF2NAkJNjkxCisjZGVmaW5lIE9CSl9YOV82Ml9jMm9uYjE5MXY0CQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw4TAorCisjZGVmaW5lIFNOX1g5XzYyX2Myb25iMTkxdjUJCSJjMm9uYjE5MXY1IgorI2RlZmluZSBOSURfWDlfNjJfYzJvbmIxOTF2NQkJNjkyCisjZGVmaW5lIE9CSl9YOV82Ml9jMm9uYjE5MXY1CQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSw5TAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMjA4dzEJCSJjMnBuYjIwOHcxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIyMDh3MQkJNjkzCisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjIwOHcxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxMEwKKworI2RlZmluZSBTTl9YOV82Ml9jMnRuYjIzOXYxCQkiYzJ0bmIyMzl2MSIKKyNkZWZpbmUgTklEX1g5XzYyX2MydG5iMjM5djEJCTY5NAorI2RlZmluZSBPQkpfWDlfNjJfYzJ0bmIyMzl2MQkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMTFMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJ0bmIyMzl2MgkJImMydG5iMjM5djIiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnRuYjIzOXYyCQk2OTUKKyNkZWZpbmUgT0JKX1g5XzYyX2MydG5iMjM5djIJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDEyTAorCisjZGVmaW5lIFNOX1g5XzYyX2MydG5iMjM5djMJCSJjMnRuYjIzOXYzIgorI2RlZmluZSBOSURfWDlfNjJfYzJ0bmIyMzl2MwkJNjk2CisjZGVmaW5lIE9CSl9YOV82Ml9jMnRuYjIzOXYzCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxM0wKKworI2RlZmluZSBTTl9YOV82Ml9jMm9uYjIzOXY0CQkiYzJvbmIyMzl2NCIKKyNkZWZpbmUgTklEX1g5XzYyX2Myb25iMjM5djQJCTY5NworI2RlZmluZSBPQkpfWDlfNjJfYzJvbmIyMzl2NAkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMTRMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJvbmIyMzl2NQkJImMyb25iMjM5djUiCisjZGVmaW5lIE5JRF9YOV82Ml9jMm9uYjIzOXY1CQk2OTgKKyNkZWZpbmUgT0JKX1g5XzYyX2Myb25iMjM5djUJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDE1TAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMjcydzEJCSJjMnBuYjI3MncxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIyNzJ3MQkJNjk5CisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjI3MncxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxNkwKKworI2RlZmluZSBTTl9YOV82Ml9jMnBuYjMwNHcxCQkiYzJwbmIzMDR3MSIKKyNkZWZpbmUgTklEX1g5XzYyX2MycG5iMzA0dzEJCTcwMAorI2RlZmluZSBPQkpfWDlfNjJfYzJwbmIzMDR3MQkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMTdMCisKKyNkZWZpbmUgU05fWDlfNjJfYzJ0bmIzNTl2MQkJImMydG5iMzU5djEiCisjZGVmaW5lIE5JRF9YOV82Ml9jMnRuYjM1OXYxCQk3MDEKKyNkZWZpbmUgT0JKX1g5XzYyX2MydG5iMzU5djEJCU9CSl9YOV82Ml9jX1R3b0N1cnZlLDE4TAorCisjZGVmaW5lIFNOX1g5XzYyX2MycG5iMzY4dzEJCSJjMnBuYjM2OHcxIgorI2RlZmluZSBOSURfWDlfNjJfYzJwbmIzNjh3MQkJNzAyCisjZGVmaW5lIE9CSl9YOV82Ml9jMnBuYjM2OHcxCQlPQkpfWDlfNjJfY19Ud29DdXJ2ZSwxOUwKKworI2RlZmluZSBTTl9YOV82Ml9jMnRuYjQzMXIxCQkiYzJ0bmI0MzFyMSIKKyNkZWZpbmUgTklEX1g5XzYyX2MydG5iNDMxcjEJCTcwMworI2RlZmluZSBPQkpfWDlfNjJfYzJ0bmI0MzFyMQkJT0JKX1g5XzYyX2NfVHdvQ3VydmUsMjBMCisKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lQ3VydmUJCU9CSl9YOV82Ml9lbGxpcHRpY0N1cnZlLDFMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUxOTJ2MQkJInByaW1lMTkydjEiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTE5MnYxCQk0MDkKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMTkydjEJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDFMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUxOTJ2MgkJInByaW1lMTkydjIiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTE5MnYyCQk0MTAKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMTkydjIJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDJMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUxOTJ2MwkJInByaW1lMTkydjMiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTE5MnYzCQk0MTEKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMTkydjMJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDNMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUyMzl2MQkJInByaW1lMjM5djEiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTIzOXYxCQk0MTIKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMjM5djEJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDRMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUyMzl2MgkJInByaW1lMjM5djIiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTIzOXYyCQk0MTMKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMjM5djIJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDVMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUyMzl2MwkJInByaW1lMjM5djMiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTIzOXYzCQk0MTQKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMjM5djMJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDZMCisKKyNkZWZpbmUgU05fWDlfNjJfcHJpbWUyNTZ2MQkJInByaW1lMjU2djEiCisjZGVmaW5lIE5JRF9YOV82Ml9wcmltZTI1NnYxCQk0MTUKKyNkZWZpbmUgT0JKX1g5XzYyX3ByaW1lMjU2djEJCU9CSl9YOV82Ml9wcmltZUN1cnZlLDdMCisKKyNkZWZpbmUgT0JKX1g5XzYyX2lkX2VjU2lnVHlwZQkJT0JKX2Fuc2lfWDlfNjIsNEwKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NIQTEJCSJlY2RzYS13aXRoLVNIQTEiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1NIQTEJCTQxNgorI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TSEExCQlPQkpfWDlfNjJfaWRfZWNTaWdUeXBlLDFMCisKKyNkZWZpbmUgU05fZWNkc2Ffd2l0aF9SZWNvbW1lbmRlZAkJImVjZHNhLXdpdGgtUmVjb21tZW5kZWQiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1JlY29tbWVuZGVkCQk3OTEKKyNkZWZpbmUgT0JKX2VjZHNhX3dpdGhfUmVjb21tZW5kZWQJCU9CSl9YOV82Ml9pZF9lY1NpZ1R5cGUsMkwKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NwZWNpZmllZAkJImVjZHNhLXdpdGgtU3BlY2lmaWVkIgorI2RlZmluZSBOSURfZWNkc2Ffd2l0aF9TcGVjaWZpZWQJCTc5MgorI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TcGVjaWZpZWQJCU9CSl9YOV82Ml9pZF9lY1NpZ1R5cGUsM0wKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NIQTIyNAkJImVjZHNhLXdpdGgtU0hBMjI0IgorI2RlZmluZSBOSURfZWNkc2Ffd2l0aF9TSEEyMjQJCTc5MworI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TSEEyMjQJCU9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCwxTAorCisjZGVmaW5lIFNOX2VjZHNhX3dpdGhfU0hBMjU2CQkiZWNkc2Etd2l0aC1TSEEyNTYiCisjZGVmaW5lIE5JRF9lY2RzYV93aXRoX1NIQTI1NgkJNzk0CisjZGVmaW5lIE9CSl9lY2RzYV93aXRoX1NIQTI1NgkJT0JKX2VjZHNhX3dpdGhfU3BlY2lmaWVkLDJMCisKKyNkZWZpbmUgU05fZWNkc2Ffd2l0aF9TSEEzODQJCSJlY2RzYS13aXRoLVNIQTM4NCIKKyNkZWZpbmUgTklEX2VjZHNhX3dpdGhfU0hBMzg0CQk3OTUKKyNkZWZpbmUgT0JKX2VjZHNhX3dpdGhfU0hBMzg0CQlPQkpfZWNkc2Ffd2l0aF9TcGVjaWZpZWQsM0wKKworI2RlZmluZSBTTl9lY2RzYV93aXRoX1NIQTUxMgkJImVjZHNhLXdpdGgtU0hBNTEyIgorI2RlZmluZSBOSURfZWNkc2Ffd2l0aF9TSEE1MTIJCTc5NgorI2RlZmluZSBPQkpfZWNkc2Ffd2l0aF9TSEE1MTIJCU9CSl9lY2RzYV93aXRoX1NwZWNpZmllZCw0TAorCisjZGVmaW5lIE9CSl9zZWNnX2VsbGlwdGljQ3VydmUJCU9CSl9jZXJ0aWNvbV9hcmMsMEwKKworI2RlZmluZSBTTl9zZWNwMTEycjEJCSJzZWNwMTEycjEiCisjZGVmaW5lIE5JRF9zZWNwMTEycjEJCTcwNAorI2RlZmluZSBPQkpfc2VjcDExMnIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDZMCisKKyNkZWZpbmUgU05fc2VjcDExMnIyCQkic2VjcDExMnIyIgorI2RlZmluZSBOSURfc2VjcDExMnIyCQk3MDUKKyNkZWZpbmUgT0JKX3NlY3AxMTJyMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSw3TAorCisjZGVmaW5lIFNOX3NlY3AxMjhyMQkJInNlY3AxMjhyMSIKKyNkZWZpbmUgTklEX3NlY3AxMjhyMQkJNzA2CisjZGVmaW5lIE9CSl9zZWNwMTI4cjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjhMCisKKyNkZWZpbmUgU05fc2VjcDEyOHIyCQkic2VjcDEyOHIyIgorI2RlZmluZSBOSURfc2VjcDEyOHIyCQk3MDcKKyNkZWZpbmUgT0JKX3NlY3AxMjhyMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyOUwKKworI2RlZmluZSBTTl9zZWNwMTYwazEJCSJzZWNwMTYwazEiCisjZGVmaW5lIE5JRF9zZWNwMTYwazEJCTcwOAorI2RlZmluZSBPQkpfc2VjcDE2MGsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDlMCisKKyNkZWZpbmUgU05fc2VjcDE2MHIxCQkic2VjcDE2MHIxIgorI2RlZmluZSBOSURfc2VjcDE2MHIxCQk3MDkKKyNkZWZpbmUgT0JKX3NlY3AxNjByMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSw4TAorCisjZGVmaW5lIFNOX3NlY3AxNjByMgkJInNlY3AxNjByMiIKKyNkZWZpbmUgTklEX3NlY3AxNjByMgkJNzEwCisjZGVmaW5lIE9CSl9zZWNwMTYwcjIJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzBMCisKKyNkZWZpbmUgU05fc2VjcDE5MmsxCQkic2VjcDE5MmsxIgorI2RlZmluZSBOSURfc2VjcDE5MmsxCQk3MTEKKyNkZWZpbmUgT0JKX3NlY3AxOTJrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzMUwKKworI2RlZmluZSBTTl9zZWNwMjI0azEJCSJzZWNwMjI0azEiCisjZGVmaW5lIE5JRF9zZWNwMjI0azEJCTcxMgorI2RlZmluZSBPQkpfc2VjcDIyNGsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDMyTAorCisjZGVmaW5lIFNOX3NlY3AyMjRyMQkJInNlY3AyMjRyMSIKKyNkZWZpbmUgTklEX3NlY3AyMjRyMQkJNzEzCisjZGVmaW5lIE9CSl9zZWNwMjI0cjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzNMCisKKyNkZWZpbmUgU05fc2VjcDI1NmsxCQkic2VjcDI1NmsxIgorI2RlZmluZSBOSURfc2VjcDI1NmsxCQk3MTQKKyNkZWZpbmUgT0JKX3NlY3AyNTZrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwxMEwKKworI2RlZmluZSBTTl9zZWNwMzg0cjEJCSJzZWNwMzg0cjEiCisjZGVmaW5lIE5JRF9zZWNwMzg0cjEJCTcxNQorI2RlZmluZSBPQkpfc2VjcDM4NHIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDM0TAorCisjZGVmaW5lIFNOX3NlY3A1MjFyMQkJInNlY3A1MjFyMSIKKyNkZWZpbmUgTklEX3NlY3A1MjFyMQkJNzE2CisjZGVmaW5lIE9CSl9zZWNwNTIxcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzVMCisKKyNkZWZpbmUgU05fc2VjdDExM3IxCQkic2VjdDExM3IxIgorI2RlZmluZSBOSURfc2VjdDExM3IxCQk3MTcKKyNkZWZpbmUgT0JKX3NlY3QxMTNyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSw0TAorCisjZGVmaW5lIFNOX3NlY3QxMTNyMgkJInNlY3QxMTNyMiIKKyNkZWZpbmUgTklEX3NlY3QxMTNyMgkJNzE4CisjZGVmaW5lIE9CSl9zZWN0MTEzcjIJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsNUwKKworI2RlZmluZSBTTl9zZWN0MTMxcjEJCSJzZWN0MTMxcjEiCisjZGVmaW5lIE5JRF9zZWN0MTMxcjEJCTcxOQorI2RlZmluZSBPQkpfc2VjdDEzMXIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDIyTAorCisjZGVmaW5lIFNOX3NlY3QxMzFyMgkJInNlY3QxMzFyMiIKKyNkZWZpbmUgTklEX3NlY3QxMzFyMgkJNzIwCisjZGVmaW5lIE9CSl9zZWN0MTMxcjIJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjNMCisKKyNkZWZpbmUgU05fc2VjdDE2M2sxCQkic2VjdDE2M2sxIgorI2RlZmluZSBOSURfc2VjdDE2M2sxCQk3MjEKKyNkZWZpbmUgT0JKX3NlY3QxNjNrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwxTAorCisjZGVmaW5lIFNOX3NlY3QxNjNyMQkJInNlY3QxNjNyMSIKKyNkZWZpbmUgTklEX3NlY3QxNjNyMQkJNzIyCisjZGVmaW5lIE9CSl9zZWN0MTYzcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMkwKKworI2RlZmluZSBTTl9zZWN0MTYzcjIJCSJzZWN0MTYzcjIiCisjZGVmaW5lIE5JRF9zZWN0MTYzcjIJCTcyMworI2RlZmluZSBPQkpfc2VjdDE2M3IyCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDE1TAorCisjZGVmaW5lIFNOX3NlY3QxOTNyMQkJInNlY3QxOTNyMSIKKyNkZWZpbmUgTklEX3NlY3QxOTNyMQkJNzI0CisjZGVmaW5lIE9CSl9zZWN0MTkzcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjRMCisKKyNkZWZpbmUgU05fc2VjdDE5M3IyCQkic2VjdDE5M3IyIgorI2RlZmluZSBOSURfc2VjdDE5M3IyCQk3MjUKKyNkZWZpbmUgT0JKX3NlY3QxOTNyMgkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwyNUwKKworI2RlZmluZSBTTl9zZWN0MjMzazEJCSJzZWN0MjMzazEiCisjZGVmaW5lIE5JRF9zZWN0MjMzazEJCTcyNgorI2RlZmluZSBPQkpfc2VjdDIzM2sxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDI2TAorCisjZGVmaW5lIFNOX3NlY3QyMzNyMQkJInNlY3QyMzNyMSIKKyNkZWZpbmUgTklEX3NlY3QyMzNyMQkJNzI3CisjZGVmaW5lIE9CSl9zZWN0MjMzcjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMjdMCisKKyNkZWZpbmUgU05fc2VjdDIzOWsxCQkic2VjdDIzOWsxIgorI2RlZmluZSBOSURfc2VjdDIzOWsxCQk3MjgKKyNkZWZpbmUgT0JKX3NlY3QyMzlrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzTAorCisjZGVmaW5lIFNOX3NlY3QyODNrMQkJInNlY3QyODNrMSIKKyNkZWZpbmUgTklEX3NlY3QyODNrMQkJNzI5CisjZGVmaW5lIE9CSl9zZWN0MjgzazEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMTZMCisKKyNkZWZpbmUgU05fc2VjdDI4M3IxCQkic2VjdDI4M3IxIgorI2RlZmluZSBOSURfc2VjdDI4M3IxCQk3MzAKKyNkZWZpbmUgT0JKX3NlY3QyODNyMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwxN0wKKworI2RlZmluZSBTTl9zZWN0NDA5azEJCSJzZWN0NDA5azEiCisjZGVmaW5lIE5JRF9zZWN0NDA5azEJCTczMQorI2RlZmluZSBPQkpfc2VjdDQwOWsxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDM2TAorCisjZGVmaW5lIFNOX3NlY3Q0MDlyMQkJInNlY3Q0MDlyMSIKKyNkZWZpbmUgTklEX3NlY3Q0MDlyMQkJNzMyCisjZGVmaW5lIE9CSl9zZWN0NDA5cjEJCU9CSl9zZWNnX2VsbGlwdGljQ3VydmUsMzdMCisKKyNkZWZpbmUgU05fc2VjdDU3MWsxCQkic2VjdDU3MWsxIgorI2RlZmluZSBOSURfc2VjdDU3MWsxCQk3MzMKKyNkZWZpbmUgT0JKX3NlY3Q1NzFrMQkJT0JKX3NlY2dfZWxsaXB0aWNDdXJ2ZSwzOEwKKworI2RlZmluZSBTTl9zZWN0NTcxcjEJCSJzZWN0NTcxcjEiCisjZGVmaW5lIE5JRF9zZWN0NTcxcjEJCTczNAorI2RlZmluZSBPQkpfc2VjdDU3MXIxCQlPQkpfc2VjZ19lbGxpcHRpY0N1cnZlLDM5TAorCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkCQlPQkpfd2FwX3dzZyw0TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczEJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxIgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzMQkJNzM1CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxCQlPQkpfd2FwX3dzZ19pZG1fZWNpZCwxTAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczMJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMzIgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzMwkJNzM2CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMzCQlPQkpfd2FwX3dzZ19pZG1fZWNpZCwzTAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczQJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM0IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzNAkJNzM3CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM0CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw0TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczUJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM1IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzNQkJNzM4CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM1CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw1TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczYJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM2IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzNgkJNzM5CisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM2CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw2TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczcJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM3IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzNwkJNzQwCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM3CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw3TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczgJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM4IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzOAkJNzQxCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM4CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw4TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczkJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHM5IgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzOQkJNzQyCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHM5CQlPQkpfd2FwX3dzZ19pZG1fZWNpZCw5TAorCisjZGVmaW5lIFNOX3dhcF93c2dfaWRtX2VjaWRfd3RsczEwCQkid2FwLXdzZy1pZG0tZWNpZC13dGxzMTAiCisjZGVmaW5lIE5JRF93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMAkJNzQzCisjZGVmaW5lIE9CSl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMAkJT0JKX3dhcF93c2dfaWRtX2VjaWQsMTBMCisKKyNkZWZpbmUgU05fd2FwX3dzZ19pZG1fZWNpZF93dGxzMTEJCSJ3YXAtd3NnLWlkbS1lY2lkLXd0bHMxMSIKKyNkZWZpbmUgTklEX3dhcF93c2dfaWRtX2VjaWRfd3RsczExCQk3NDQKKyNkZWZpbmUgT0JKX3dhcF93c2dfaWRtX2VjaWRfd3RsczExCQlPQkpfd2FwX3dzZ19pZG1fZWNpZCwxMUwKKworI2RlZmluZSBTTl93YXBfd3NnX2lkbV9lY2lkX3d0bHMxMgkJIndhcC13c2ctaWRtLWVjaWQtd3RsczEyIgorI2RlZmluZSBOSURfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTIJCTc0NQorI2RlZmluZSBPQkpfd2FwX3dzZ19pZG1fZWNpZF93dGxzMTIJCU9CSl93YXBfd3NnX2lkbV9lY2lkLDEyTAorCisjZGVmaW5lIFNOX2Nhc3Q1X2NiYwkJIkNBU1Q1LUNCQyIKKyNkZWZpbmUgTE5fY2FzdDVfY2JjCQkiY2FzdDUtY2JjIgorI2RlZmluZSBOSURfY2FzdDVfY2JjCQkxMDgKKyNkZWZpbmUgT0JKX2Nhc3Q1X2NiYwkJT0JKX0lTT19VUywxMTM1MzNMLDdMLDY2TCwxMEwKKworI2RlZmluZSBTTl9jYXN0NV9lY2IJCSJDQVNUNS1FQ0IiCisjZGVmaW5lIExOX2Nhc3Q1X2VjYgkJImNhc3Q1LWVjYiIKKyNkZWZpbmUgTklEX2Nhc3Q1X2VjYgkJMTA5CisKKyNkZWZpbmUgU05fY2FzdDVfY2ZiNjQJCSJDQVNUNS1DRkIiCisjZGVmaW5lIExOX2Nhc3Q1X2NmYjY0CQkiY2FzdDUtY2ZiIgorI2RlZmluZSBOSURfY2FzdDVfY2ZiNjQJCTExMAorCisjZGVmaW5lIFNOX2Nhc3Q1X29mYjY0CQkiQ0FTVDUtT0ZCIgorI2RlZmluZSBMTl9jYXN0NV9vZmI2NAkJImNhc3Q1LW9mYiIKKyNkZWZpbmUgTklEX2Nhc3Q1X29mYjY0CQkxMTEKKworI2RlZmluZSBMTl9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDCQkicGJlV2l0aE1ENUFuZENhc3Q1Q0JDIgorI2RlZmluZSBOSURfcGJlV2l0aE1ENUFuZENhc3Q1X0NCQwkJMTEyCisjZGVmaW5lIE9CSl9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDCQlPQkpfSVNPX1VTLDExMzUzM0wsN0wsNjZMLDEyTAorCisjZGVmaW5lIFNOX2lkX1Bhc3N3b3JkQmFzZWRNQUMJCSJpZC1QYXNzd29yZEJhc2VkTUFDIgorI2RlZmluZSBMTl9pZF9QYXNzd29yZEJhc2VkTUFDCQkicGFzc3dvcmQgYmFzZWQgTUFDIgorI2RlZmluZSBOSURfaWRfUGFzc3dvcmRCYXNlZE1BQwkJNzgyCisjZGVmaW5lIE9CSl9pZF9QYXNzd29yZEJhc2VkTUFDCQlPQkpfSVNPX1VTLDExMzUzM0wsN0wsNjZMLDEzTAorCisjZGVmaW5lIFNOX2lkX0RIQmFzZWRNYWMJCSJpZC1ESEJhc2VkTWFjIgorI2RlZmluZSBMTl9pZF9ESEJhc2VkTWFjCQkiRGlmZmllLUhlbGxtYW4gYmFzZWQgTUFDIgorI2RlZmluZSBOSURfaWRfREhCYXNlZE1hYwkJNzgzCisjZGVmaW5lIE9CSl9pZF9ESEJhc2VkTWFjCQlPQkpfSVNPX1VTLDExMzUzM0wsN0wsNjZMLDMwTAorCisjZGVmaW5lIFNOX3JzYWRzaQkJInJzYWRzaSIKKyNkZWZpbmUgTE5fcnNhZHNpCQkiUlNBIERhdGEgU2VjdXJpdHksIEluYy4iCisjZGVmaW5lIE5JRF9yc2Fkc2kJCTEKKyNkZWZpbmUgT0JKX3JzYWRzaQkJT0JKX0lTT19VUywxMTM1NDlMCisKKyNkZWZpbmUgU05fcGtjcwkJInBrY3MiCisjZGVmaW5lIExOX3BrY3MJCSJSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBQS0NTIgorI2RlZmluZSBOSURfcGtjcwkJMgorI2RlZmluZSBPQkpfcGtjcwkJT0JKX3JzYWRzaSwxTAorCisjZGVmaW5lIFNOX3BrY3MxCQkicGtjczEiCisjZGVmaW5lIE5JRF9wa2NzMQkJMTg2CisjZGVmaW5lIE9CSl9wa2NzMQkJT0JKX3BrY3MsMUwKKworI2RlZmluZSBMTl9yc2FFbmNyeXB0aW9uCQkicnNhRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3JzYUVuY3J5cHRpb24JCTYKKyNkZWZpbmUgT0JKX3JzYUVuY3J5cHRpb24JCU9CSl9wa2NzMSwxTAorCisjZGVmaW5lIFNOX21kMldpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLU1EMiIKKyNkZWZpbmUgTE5fbWQyV2l0aFJTQUVuY3J5cHRpb24JCSJtZDJXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX21kMldpdGhSU0FFbmNyeXB0aW9uCQk3CisjZGVmaW5lIE9CSl9tZDJXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDJMCisKKyNkZWZpbmUgU05fbWQ0V2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtTUQ0IgorI2RlZmluZSBMTl9tZDRXaXRoUlNBRW5jcnlwdGlvbgkJIm1kNFdpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfbWQ0V2l0aFJTQUVuY3J5cHRpb24JCTM5NgorI2RlZmluZSBPQkpfbWQ0V2l0aFJTQUVuY3J5cHRpb24JCU9CSl9wa2NzMSwzTAorCisjZGVmaW5lIFNOX21kNVdpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLU1ENSIKKyNkZWZpbmUgTE5fbWQ1V2l0aFJTQUVuY3J5cHRpb24JCSJtZDVXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX21kNVdpdGhSU0FFbmNyeXB0aW9uCQk4CisjZGVmaW5lIE9CSl9tZDVXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDRMCisKKyNkZWZpbmUgU05fc2hhMVdpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLVNIQTEiCisjZGVmaW5lIExOX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgkJInNoYTFXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgkJNjUKKyNkZWZpbmUgT0JKX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDVMCisKKyNkZWZpbmUgU05fc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtU0hBMjU2IgorI2RlZmluZSBMTl9zaGEyNTZXaXRoUlNBRW5jcnlwdGlvbgkJInNoYTI1NldpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24JCTY2OAorI2RlZmluZSBPQkpfc2hhMjU2V2l0aFJTQUVuY3J5cHRpb24JCU9CSl9wa2NzMSwxMUwKKworI2RlZmluZSBTTl9zaGEzODRXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1TSEEzODQiCisjZGVmaW5lIExOX3NoYTM4NFdpdGhSU0FFbmNyeXB0aW9uCQkic2hhMzg0V2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGEzODRXaXRoUlNBRW5jcnlwdGlvbgkJNjY5CisjZGVmaW5lIE9CSl9zaGEzODRXaXRoUlNBRW5jcnlwdGlvbgkJT0JKX3BrY3MxLDEyTAorCisjZGVmaW5lIFNOX3NoYTUxMldpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLVNIQTUxMiIKKyNkZWZpbmUgTE5fc2hhNTEyV2l0aFJTQUVuY3J5cHRpb24JCSJzaGE1MTJXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX3NoYTUxMldpdGhSU0FFbmNyeXB0aW9uCQk2NzAKKyNkZWZpbmUgT0JKX3NoYTUxMldpdGhSU0FFbmNyeXB0aW9uCQlPQkpfcGtjczEsMTNMCisKKyNkZWZpbmUgU05fc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24JCSJSU0EtU0hBMjI0IgorI2RlZmluZSBMTl9zaGEyMjRXaXRoUlNBRW5jcnlwdGlvbgkJInNoYTIyNFdpdGhSU0FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24JCTY3MQorI2RlZmluZSBPQkpfc2hhMjI0V2l0aFJTQUVuY3J5cHRpb24JCU9CSl9wa2NzMSwxNEwKKworI2RlZmluZSBTTl9wa2NzMwkJInBrY3MzIgorI2RlZmluZSBOSURfcGtjczMJCTI3CisjZGVmaW5lIE9CSl9wa2NzMwkJT0JKX3BrY3MsM0wKKworI2RlZmluZSBMTl9kaEtleUFncmVlbWVudAkJImRoS2V5QWdyZWVtZW50IgorI2RlZmluZSBOSURfZGhLZXlBZ3JlZW1lbnQJCTI4CisjZGVmaW5lIE9CSl9kaEtleUFncmVlbWVudAkJT0JKX3BrY3MzLDFMCisKKyNkZWZpbmUgU05fcGtjczUJCSJwa2NzNSIKKyNkZWZpbmUgTklEX3BrY3M1CQkxODcKKyNkZWZpbmUgT0JKX3BrY3M1CQlPQkpfcGtjcyw1TAorCisjZGVmaW5lIFNOX3BiZVdpdGhNRDJBbmRERVNfQ0JDCQkiUEJFLU1EMi1ERVMiCisjZGVmaW5lIExOX3BiZVdpdGhNRDJBbmRERVNfQ0JDCQkicGJlV2l0aE1EMkFuZERFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQyQW5kREVTX0NCQwkJOQorI2RlZmluZSBPQkpfcGJlV2l0aE1EMkFuZERFU19DQkMJCU9CSl9wa2NzNSwxTAorCisjZGVmaW5lIFNOX3BiZVdpdGhNRDVBbmRERVNfQ0JDCQkiUEJFLU1ENS1ERVMiCisjZGVmaW5lIExOX3BiZVdpdGhNRDVBbmRERVNfQ0JDCQkicGJlV2l0aE1ENUFuZERFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQ1QW5kREVTX0NCQwkJMTAKKyNkZWZpbmUgT0JKX3BiZVdpdGhNRDVBbmRERVNfQ0JDCQlPQkpfcGtjczUsM0wKKworI2RlZmluZSBTTl9wYmVXaXRoTUQyQW5kUkMyX0NCQwkJIlBCRS1NRDItUkMyLTY0IgorI2RlZmluZSBMTl9wYmVXaXRoTUQyQW5kUkMyX0NCQwkJInBiZVdpdGhNRDJBbmRSQzItQ0JDIgorI2RlZmluZSBOSURfcGJlV2l0aE1EMkFuZFJDMl9DQkMJCTE2OAorI2RlZmluZSBPQkpfcGJlV2l0aE1EMkFuZFJDMl9DQkMJCU9CSl9wa2NzNSw0TAorCisjZGVmaW5lIFNOX3BiZVdpdGhNRDVBbmRSQzJfQ0JDCQkiUEJFLU1ENS1SQzItNjQiCisjZGVmaW5lIExOX3BiZVdpdGhNRDVBbmRSQzJfQ0JDCQkicGJlV2l0aE1ENUFuZFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoTUQ1QW5kUkMyX0NCQwkJMTY5CisjZGVmaW5lIE9CSl9wYmVXaXRoTUQ1QW5kUkMyX0NCQwkJT0JKX3BrY3M1LDZMCisKKyNkZWZpbmUgU05fcGJlV2l0aFNIQTFBbmRERVNfQ0JDCQkiUEJFLVNIQTEtREVTIgorI2RlZmluZSBMTl9wYmVXaXRoU0hBMUFuZERFU19DQkMJCSJwYmVXaXRoU0hBMUFuZERFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoU0hBMUFuZERFU19DQkMJCTE3MAorI2RlZmluZSBPQkpfcGJlV2l0aFNIQTFBbmRERVNfQ0JDCQlPQkpfcGtjczUsMTBMCisKKyNkZWZpbmUgU05fcGJlV2l0aFNIQTFBbmRSQzJfQ0JDCQkiUEJFLVNIQTEtUkMyLTY0IgorI2RlZmluZSBMTl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMJCSJwYmVXaXRoU0hBMUFuZFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoU0hBMUFuZFJDMl9DQkMJCTY4CisjZGVmaW5lIE9CSl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMJCU9CSl9wa2NzNSwxMUwKKworI2RlZmluZSBMTl9pZF9wYmtkZjIJCSJQQktERjIiCisjZGVmaW5lIE5JRF9pZF9wYmtkZjIJCTY5CisjZGVmaW5lIE9CSl9pZF9wYmtkZjIJCU9CSl9wa2NzNSwxMkwKKworI2RlZmluZSBMTl9wYmVzMgkJIlBCRVMyIgorI2RlZmluZSBOSURfcGJlczIJCTE2MQorI2RlZmluZSBPQkpfcGJlczIJCU9CSl9wa2NzNSwxM0wKKworI2RlZmluZSBMTl9wYm1hYzEJCSJQQk1BQzEiCisjZGVmaW5lIE5JRF9wYm1hYzEJCTE2MgorI2RlZmluZSBPQkpfcGJtYWMxCQlPQkpfcGtjczUsMTRMCisKKyNkZWZpbmUgU05fcGtjczcJCSJwa2NzNyIKKyNkZWZpbmUgTklEX3BrY3M3CQkyMAorI2RlZmluZSBPQkpfcGtjczcJCU9CSl9wa2NzLDdMCisKKyNkZWZpbmUgTE5fcGtjczdfZGF0YQkJInBrY3M3LWRhdGEiCisjZGVmaW5lIE5JRF9wa2NzN19kYXRhCQkyMQorI2RlZmluZSBPQkpfcGtjczdfZGF0YQkJT0JKX3BrY3M3LDFMCisKKyNkZWZpbmUgTE5fcGtjczdfc2lnbmVkCQkicGtjczctc2lnbmVkRGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X3NpZ25lZAkJMjIKKyNkZWZpbmUgT0JKX3BrY3M3X3NpZ25lZAkJT0JKX3BrY3M3LDJMCisKKyNkZWZpbmUgTE5fcGtjczdfZW52ZWxvcGVkCQkicGtjczctZW52ZWxvcGVkRGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X2VudmVsb3BlZAkJMjMKKyNkZWZpbmUgT0JKX3BrY3M3X2VudmVsb3BlZAkJT0JKX3BrY3M3LDNMCisKKyNkZWZpbmUgTE5fcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkCQkicGtjczctc2lnbmVkQW5kRW52ZWxvcGVkRGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZAkJMjQKKyNkZWZpbmUgT0JKX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZAkJT0JKX3BrY3M3LDRMCisKKyNkZWZpbmUgTE5fcGtjczdfZGlnZXN0CQkicGtjczctZGlnZXN0RGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X2RpZ2VzdAkJMjUKKyNkZWZpbmUgT0JKX3BrY3M3X2RpZ2VzdAkJT0JKX3BrY3M3LDVMCisKKyNkZWZpbmUgTE5fcGtjczdfZW5jcnlwdGVkCQkicGtjczctZW5jcnlwdGVkRGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X2VuY3J5cHRlZAkJMjYKKyNkZWZpbmUgT0JKX3BrY3M3X2VuY3J5cHRlZAkJT0JKX3BrY3M3LDZMCisKKyNkZWZpbmUgU05fcGtjczkJCSJwa2NzOSIKKyNkZWZpbmUgTklEX3BrY3M5CQk0NworI2RlZmluZSBPQkpfcGtjczkJCU9CSl9wa2NzLDlMCisKKyNkZWZpbmUgTE5fcGtjczlfZW1haWxBZGRyZXNzCQkiZW1haWxBZGRyZXNzIgorI2RlZmluZSBOSURfcGtjczlfZW1haWxBZGRyZXNzCQk0OAorI2RlZmluZSBPQkpfcGtjczlfZW1haWxBZGRyZXNzCQlPQkpfcGtjczksMUwKKworI2RlZmluZSBMTl9wa2NzOV91bnN0cnVjdHVyZWROYW1lCQkidW5zdHJ1Y3R1cmVkTmFtZSIKKyNkZWZpbmUgTklEX3BrY3M5X3Vuc3RydWN0dXJlZE5hbWUJCTQ5CisjZGVmaW5lIE9CSl9wa2NzOV91bnN0cnVjdHVyZWROYW1lCQlPQkpfcGtjczksMkwKKworI2RlZmluZSBMTl9wa2NzOV9jb250ZW50VHlwZQkJImNvbnRlbnRUeXBlIgorI2RlZmluZSBOSURfcGtjczlfY29udGVudFR5cGUJCTUwCisjZGVmaW5lIE9CSl9wa2NzOV9jb250ZW50VHlwZQkJT0JKX3BrY3M5LDNMCisKKyNkZWZpbmUgTE5fcGtjczlfbWVzc2FnZURpZ2VzdAkJIm1lc3NhZ2VEaWdlc3QiCisjZGVmaW5lIE5JRF9wa2NzOV9tZXNzYWdlRGlnZXN0CQk1MQorI2RlZmluZSBPQkpfcGtjczlfbWVzc2FnZURpZ2VzdAkJT0JKX3BrY3M5LDRMCisKKyNkZWZpbmUgTE5fcGtjczlfc2lnbmluZ1RpbWUJCSJzaWduaW5nVGltZSIKKyNkZWZpbmUgTklEX3BrY3M5X3NpZ25pbmdUaW1lCQk1MgorI2RlZmluZSBPQkpfcGtjczlfc2lnbmluZ1RpbWUJCU9CSl9wa2NzOSw1TAorCisjZGVmaW5lIExOX3BrY3M5X2NvdW50ZXJzaWduYXR1cmUJCSJjb3VudGVyc2lnbmF0dXJlIgorI2RlZmluZSBOSURfcGtjczlfY291bnRlcnNpZ25hdHVyZQkJNTMKKyNkZWZpbmUgT0JKX3BrY3M5X2NvdW50ZXJzaWduYXR1cmUJCU9CSl9wa2NzOSw2TAorCisjZGVmaW5lIExOX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkCQkiY2hhbGxlbmdlUGFzc3dvcmQiCisjZGVmaW5lIE5JRF9wa2NzOV9jaGFsbGVuZ2VQYXNzd29yZAkJNTQKKyNkZWZpbmUgT0JKX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkCQlPQkpfcGtjczksN0wKKworI2RlZmluZSBMTl9wa2NzOV91bnN0cnVjdHVyZWRBZGRyZXNzCQkidW5zdHJ1Y3R1cmVkQWRkcmVzcyIKKyNkZWZpbmUgTklEX3BrY3M5X3Vuc3RydWN0dXJlZEFkZHJlc3MJCTU1CisjZGVmaW5lIE9CSl9wa2NzOV91bnN0cnVjdHVyZWRBZGRyZXNzCQlPQkpfcGtjczksOEwKKworI2RlZmluZSBMTl9wa2NzOV9leHRDZXJ0QXR0cmlidXRlcwkJImV4dGVuZGVkQ2VydGlmaWNhdGVBdHRyaWJ1dGVzIgorI2RlZmluZSBOSURfcGtjczlfZXh0Q2VydEF0dHJpYnV0ZXMJCTU2CisjZGVmaW5lIE9CSl9wa2NzOV9leHRDZXJ0QXR0cmlidXRlcwkJT0JKX3BrY3M5LDlMCisKKyNkZWZpbmUgU05fZXh0X3JlcQkJImV4dFJlcSIKKyNkZWZpbmUgTE5fZXh0X3JlcQkJIkV4dGVuc2lvbiBSZXF1ZXN0IgorI2RlZmluZSBOSURfZXh0X3JlcQkJMTcyCisjZGVmaW5lIE9CSl9leHRfcmVxCQlPQkpfcGtjczksMTRMCisKKyNkZWZpbmUgU05fU01JTUVDYXBhYmlsaXRpZXMJCSJTTUlNRS1DQVBTIgorI2RlZmluZSBMTl9TTUlNRUNhcGFiaWxpdGllcwkJIlMvTUlNRSBDYXBhYmlsaXRpZXMiCisjZGVmaW5lIE5JRF9TTUlNRUNhcGFiaWxpdGllcwkJMTY3CisjZGVmaW5lIE9CSl9TTUlNRUNhcGFiaWxpdGllcwkJT0JKX3BrY3M5LDE1TAorCisjZGVmaW5lIFNOX1NNSU1FCQkiU01JTUUiCisjZGVmaW5lIExOX1NNSU1FCQkiUy9NSU1FIgorI2RlZmluZSBOSURfU01JTUUJCTE4OAorI2RlZmluZSBPQkpfU01JTUUJCU9CSl9wa2NzOSwxNkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9tb2QJCSJpZC1zbWltZS1tb2QiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9tb2QJCTE4OQorI2RlZmluZSBPQkpfaWRfc21pbWVfbW9kCQlPQkpfU01JTUUsMEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdAkJImlkLXNtaW1lLWN0IgorI2RlZmluZSBOSURfaWRfc21pbWVfY3QJCTE5MAorI2RlZmluZSBPQkpfaWRfc21pbWVfY3QJCU9CSl9TTUlNRSwxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhCQkiaWQtc21pbWUtYWEiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYQkJMTkxCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYQkJT0JKX1NNSU1FLDJMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnCQkiaWQtc21pbWUtYWxnIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWxnCQkxOTIKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZwkJT0JKX1NNSU1FLDNMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY2QJCSJpZC1zbWltZS1jZCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2NkCQkxOTMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2NkCQlPQkpfU01JTUUsNEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9zcHEJCSJpZC1zbWltZS1zcHEiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9zcHEJCTE5NAorI2RlZmluZSBPQkpfaWRfc21pbWVfc3BxCQlPQkpfU01JTUUsNUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdGkJCSJpZC1zbWltZS1jdGkiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdGkJCTE5NQorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RpCQlPQkpfU01JTUUsNkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9tb2RfY21zCQkiaWQtc21pbWUtbW9kLWNtcyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZF9jbXMJCTE5NgorI2RlZmluZSBPQkpfaWRfc21pbWVfbW9kX2NtcwkJT0JKX2lkX3NtaW1lX21vZCwxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9lc3MJCSJpZC1zbWltZS1tb2QtZXNzIgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX2VzcwkJMTk3CisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfZXNzCQlPQkpfaWRfc21pbWVfbW9kLDJMCisKKyNkZWZpbmUgU05faWRfc21pbWVfbW9kX29pZAkJImlkLXNtaW1lLW1vZC1vaWQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9tb2Rfb2lkCQkxOTgKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX21vZF9vaWQJCU9CSl9pZF9zbWltZV9tb2QsM0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9tb2RfbXNnX3YzCQkiaWQtc21pbWUtbW9kLW1zZy12MyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZF9tc2dfdjMJCTE5OQorI2RlZmluZSBPQkpfaWRfc21pbWVfbW9kX21zZ192MwkJT0JKX2lkX3NtaW1lX21vZCw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV84OAkJImlkLXNtaW1lLW1vZC1ldHMtZVNpZ25hdHVyZS04OCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZF9ldHNfZVNpZ25hdHVyZV84OAkJMjAwCisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfODgJCU9CSl9pZF9zbWltZV9tb2QsNUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfOTcJCSJpZC1zbWltZS1tb2QtZXRzLWVTaWduYXR1cmUtOTciCisjZGVmaW5lIE5JRF9pZF9zbWltZV9tb2RfZXRzX2VTaWduYXR1cmVfOTcJCTIwMQorI2RlZmluZSBPQkpfaWRfc21pbWVfbW9kX2V0c19lU2lnbmF0dXJlXzk3CQlPQkpfaWRfc21pbWVfbW9kLDZMCisKKyNkZWZpbmUgU05faWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzg4CQkiaWQtc21pbWUtbW9kLWV0cy1lU2lnUG9saWN5LTg4IgorI2RlZmluZSBOSURfaWRfc21pbWVfbW9kX2V0c19lU2lnUG9saWN5Xzg4CQkyMDIKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV84OAkJT0JKX2lkX3NtaW1lX21vZCw3TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV85NwkJImlkLXNtaW1lLW1vZC1ldHMtZVNpZ1BvbGljeS05NyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX21vZF9ldHNfZVNpZ1BvbGljeV85NwkJMjAzCisjZGVmaW5lIE9CSl9pZF9zbWltZV9tb2RfZXRzX2VTaWdQb2xpY3lfOTcJCU9CSl9pZF9zbWltZV9tb2QsOEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9yZWNlaXB0CQkiaWQtc21pbWUtY3QtcmVjZWlwdCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0X3JlY2VpcHQJCTIwNAorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfcmVjZWlwdAkJT0JKX2lkX3NtaW1lX2N0LDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RfYXV0aERhdGEJCSJpZC1zbWltZS1jdC1hdXRoRGF0YSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0X2F1dGhEYXRhCQkyMDUKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0X2F1dGhEYXRhCQlPQkpfaWRfc21pbWVfY3QsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9wdWJsaXNoQ2VydAkJImlkLXNtaW1lLWN0LXB1Ymxpc2hDZXJ0IgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfcHVibGlzaENlcnQJCTIwNgorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfcHVibGlzaENlcnQJCU9CSl9pZF9zbWltZV9jdCwzTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0X1RTVEluZm8JCSJpZC1zbWltZS1jdC1UU1RJbmZvIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RfVFNUSW5mbwkJMjA3CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdF9UU1RJbmZvCQlPQkpfaWRfc21pbWVfY3QsNEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9URFRJbmZvCQkiaWQtc21pbWUtY3QtVERUSW5mbyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0X1REVEluZm8JCTIwOAorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfVERUSW5mbwkJT0JKX2lkX3NtaW1lX2N0LDVMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RfY29udGVudEluZm8JCSJpZC1zbWltZS1jdC1jb250ZW50SW5mbyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0X2NvbnRlbnRJbmZvCQkyMDkKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0X2NvbnRlbnRJbmZvCQlPQkpfaWRfc21pbWVfY3QsNkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9EVkNTUmVxdWVzdERhdGEJCSJpZC1zbWltZS1jdC1EVkNTUmVxdWVzdERhdGEiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdF9EVkNTUmVxdWVzdERhdGEJCTIxMAorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfRFZDU1JlcXVlc3REYXRhCQlPQkpfaWRfc21pbWVfY3QsN0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9jdF9EVkNTUmVzcG9uc2VEYXRhCQkiaWQtc21pbWUtY3QtRFZDU1Jlc3BvbnNlRGF0YSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0X0RWQ1NSZXNwb25zZURhdGEJCTIxMQorI2RlZmluZSBPQkpfaWRfc21pbWVfY3RfRFZDU1Jlc3BvbnNlRGF0YQkJT0JKX2lkX3NtaW1lX2N0LDhMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RfY29tcHJlc3NlZERhdGEJCSJpZC1zbWltZS1jdC1jb21wcmVzc2VkRGF0YSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0X2NvbXByZXNzZWREYXRhCQk3ODYKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0X2NvbXByZXNzZWREYXRhCQlPQkpfaWRfc21pbWVfY3QsOUwKKworI2RlZmluZSBTTl9pZF9jdF9hc2NpaVRleHRXaXRoQ1JMRgkJImlkLWN0LWFzY2lpVGV4dFdpdGhDUkxGIgorI2RlZmluZSBOSURfaWRfY3RfYXNjaWlUZXh0V2l0aENSTEYJCTc4NworI2RlZmluZSBPQkpfaWRfY3RfYXNjaWlUZXh0V2l0aENSTEYJCU9CSl9pZF9zbWltZV9jdCwyN0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9yZWNlaXB0UmVxdWVzdAkJImlkLXNtaW1lLWFhLXJlY2VpcHRSZXF1ZXN0IgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfcmVjZWlwdFJlcXVlc3QJCTIxMgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfcmVjZWlwdFJlcXVlc3QJCU9CSl9pZF9zbWltZV9hYSwxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX3NlY3VyaXR5TGFiZWwJCSJpZC1zbWltZS1hYS1zZWN1cml0eUxhYmVsIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfc2VjdXJpdHlMYWJlbAkJMjEzCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9zZWN1cml0eUxhYmVsCQlPQkpfaWRfc21pbWVfYWEsMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9tbEV4cGFuZEhpc3RvcnkJCSJpZC1zbWltZS1hYS1tbEV4cGFuZEhpc3RvcnkiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9tbEV4cGFuZEhpc3RvcnkJCTIxNAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfbWxFeHBhbmRIaXN0b3J5CQlPQkpfaWRfc21pbWVfYWEsM0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9jb250ZW50SGludAkJImlkLXNtaW1lLWFhLWNvbnRlbnRIaW50IgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfY29udGVudEhpbnQJCTIxNQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfY29udGVudEhpbnQJCU9CSl9pZF9zbWltZV9hYSw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX21zZ1NpZ0RpZ2VzdAkJImlkLXNtaW1lLWFhLW1zZ1NpZ0RpZ2VzdCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX21zZ1NpZ0RpZ2VzdAkJMjE2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9tc2dTaWdEaWdlc3QJCU9CSl9pZF9zbWltZV9hYSw1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2VuY2FwQ29udGVudFR5cGUJCSJpZC1zbWltZS1hYS1lbmNhcENvbnRlbnRUeXBlIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZW5jYXBDb250ZW50VHlwZQkJMjE3CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9lbmNhcENvbnRlbnRUeXBlCQlPQkpfaWRfc21pbWVfYWEsNkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9jb250ZW50SWRlbnRpZmllcgkJImlkLXNtaW1lLWFhLWNvbnRlbnRJZGVudGlmaWVyIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfY29udGVudElkZW50aWZpZXIJCTIxOAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfY29udGVudElkZW50aWZpZXIJCU9CSl9pZF9zbWltZV9hYSw3TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX21hY1ZhbHVlCQkiaWQtc21pbWUtYWEtbWFjVmFsdWUiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9tYWNWYWx1ZQkJMjE5CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9tYWNWYWx1ZQkJT0JKX2lkX3NtaW1lX2FhLDhMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXF1aXZhbGVudExhYmVscwkJImlkLXNtaW1lLWFhLWVxdWl2YWxlbnRMYWJlbHMiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9lcXVpdmFsZW50TGFiZWxzCQkyMjAKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2VxdWl2YWxlbnRMYWJlbHMJCU9CSl9pZF9zbWltZV9hYSw5TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2NvbnRlbnRSZWZlcmVuY2UJCSJpZC1zbWltZS1hYS1jb250ZW50UmVmZXJlbmNlIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfY29udGVudFJlZmVyZW5jZQkJMjIxCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9jb250ZW50UmVmZXJlbmNlCQlPQkpfaWRfc21pbWVfYWEsMTBMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZW5jcnlwS2V5UHJlZgkJImlkLXNtaW1lLWFhLWVuY3J5cEtleVByZWYiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9lbmNyeXBLZXlQcmVmCQkyMjIKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2VuY3J5cEtleVByZWYJCU9CSl9pZF9zbWltZV9hYSwxMUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9zaWduaW5nQ2VydGlmaWNhdGUJCSJpZC1zbWltZS1hYS1zaWduaW5nQ2VydGlmaWNhdGUiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9zaWduaW5nQ2VydGlmaWNhdGUJCTIyMworI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfc2lnbmluZ0NlcnRpZmljYXRlCQlPQkpfaWRfc21pbWVfYWEsMTJMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfc21pbWVFbmNyeXB0Q2VydHMJCSJpZC1zbWltZS1hYS1zbWltZUVuY3J5cHRDZXJ0cyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX3NtaW1lRW5jcnlwdENlcnRzCQkyMjQKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX3NtaW1lRW5jcnlwdENlcnRzCQlPQkpfaWRfc21pbWVfYWEsMTNMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfdGltZVN0YW1wVG9rZW4JCSJpZC1zbWltZS1hYS10aW1lU3RhbXBUb2tlbiIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX3RpbWVTdGFtcFRva2VuCQkyMjUKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX3RpbWVTdGFtcFRva2VuCQlPQkpfaWRfc21pbWVfYWEsMTRMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX3NpZ1BvbGljeUlkCQkiaWQtc21pbWUtYWEtZXRzLXNpZ1BvbGljeUlkIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX3NpZ1BvbGljeUlkCQkyMjYKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19zaWdQb2xpY3lJZAkJT0JKX2lkX3NtaW1lX2FhLDE1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19jb21taXRtZW50VHlwZQkJImlkLXNtaW1lLWFhLWV0cy1jb21taXRtZW50VHlwZSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19jb21taXRtZW50VHlwZQkJMjI3CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfY29tbWl0bWVudFR5cGUJCU9CSl9pZF9zbWltZV9hYSwxNkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfc2lnbmVyTG9jYXRpb24JCSJpZC1zbWltZS1hYS1ldHMtc2lnbmVyTG9jYXRpb24iCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfc2lnbmVyTG9jYXRpb24JCTIyOAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX3NpZ25lckxvY2F0aW9uCQlPQkpfaWRfc21pbWVfYWEsMTdMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX3NpZ25lckF0dHIJCSJpZC1zbWltZS1hYS1ldHMtc2lnbmVyQXR0ciIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19zaWduZXJBdHRyCQkyMjkKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19zaWduZXJBdHRyCQlPQkpfaWRfc21pbWVfYWEsMThMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZXRzX290aGVyU2lnQ2VydAkJImlkLXNtaW1lLWFhLWV0cy1vdGhlclNpZ0NlcnQiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfb3RoZXJTaWdDZXJ0CQkyMzAKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2V0c19vdGhlclNpZ0NlcnQJCU9CSl9pZF9zbWltZV9hYSwxOUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfY29udGVudFRpbWVzdGFtcAkJImlkLXNtaW1lLWFhLWV0cy1jb250ZW50VGltZXN0YW1wIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX2NvbnRlbnRUaW1lc3RhbXAJCTIzMQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX2NvbnRlbnRUaW1lc3RhbXAJCU9CSl9pZF9zbWltZV9hYSwyMEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfQ2VydGlmaWNhdGVSZWZzCQkiaWQtc21pbWUtYWEtZXRzLUNlcnRpZmljYXRlUmVmcyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19DZXJ0aWZpY2F0ZVJlZnMJCTIzMgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX0NlcnRpZmljYXRlUmVmcwkJT0JKX2lkX3NtaW1lX2FhLDIxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19SZXZvY2F0aW9uUmVmcwkJImlkLXNtaW1lLWFhLWV0cy1SZXZvY2F0aW9uUmVmcyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19SZXZvY2F0aW9uUmVmcwkJMjMzCisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfUmV2b2NhdGlvblJlZnMJCU9CSl9pZF9zbWltZV9hYSwyMkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfY2VydFZhbHVlcwkJImlkLXNtaW1lLWFhLWV0cy1jZXJ0VmFsdWVzIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX2NlcnRWYWx1ZXMJCTIzNAorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX2NlcnRWYWx1ZXMJCU9CSl9pZF9zbWltZV9hYSwyM0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfcmV2b2NhdGlvblZhbHVlcwkJImlkLXNtaW1lLWFhLWV0cy1yZXZvY2F0aW9uVmFsdWVzIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfZXRzX3Jldm9jYXRpb25WYWx1ZXMJCTIzNQorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX3Jldm9jYXRpb25WYWx1ZXMJCU9CSl9pZF9zbWltZV9hYSwyNEwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hYV9ldHNfZXNjVGltZVN0YW1wCQkiaWQtc21pbWUtYWEtZXRzLWVzY1RpbWVTdGFtcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2V0c19lc2NUaW1lU3RhbXAJCTIzNgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWFfZXRzX2VzY1RpbWVTdGFtcAkJT0JKX2lkX3NtaW1lX2FhLDI1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19jZXJ0Q1JMVGltZXN0YW1wCQkiaWQtc21pbWUtYWEtZXRzLWNlcnRDUkxUaW1lc3RhbXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfY2VydENSTFRpbWVzdGFtcAkJMjM3CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfY2VydENSTFRpbWVzdGFtcAkJT0JKX2lkX3NtaW1lX2FhLDI2TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX2V0c19hcmNoaXZlVGltZVN0YW1wCQkiaWQtc21pbWUtYWEtZXRzLWFyY2hpdmVUaW1lU3RhbXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hYV9ldHNfYXJjaGl2ZVRpbWVTdGFtcAkJMjM4CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9ldHNfYXJjaGl2ZVRpbWVTdGFtcAkJT0JKX2lkX3NtaW1lX2FhLDI3TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FhX3NpZ25hdHVyZVR5cGUJCSJpZC1zbWltZS1hYS1zaWduYXR1cmVUeXBlIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWFfc2lnbmF0dXJlVHlwZQkJMjM5CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hYV9zaWduYXR1cmVUeXBlCQlPQkpfaWRfc21pbWVfYWEsMjhMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWFfZHZjc19kdmMJCSJpZC1zbWltZS1hYS1kdmNzLWR2YyIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FhX2R2Y3NfZHZjCQkyNDAKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FhX2R2Y3NfZHZjCQlPQkpfaWRfc21pbWVfYWEsMjlMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnX0VTREh3aXRoM0RFUwkJImlkLXNtaW1lLWFsZy1FU0RId2l0aDNERVMiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGdfRVNESHdpdGgzREVTCQkyNDEKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZ19FU0RId2l0aDNERVMJCU9CSl9pZF9zbWltZV9hbGcsMUwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIJCSJpZC1zbWltZS1hbGctRVNESHdpdGhSQzIiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGdfRVNESHdpdGhSQzIJCTI0MgorI2RlZmluZSBPQkpfaWRfc21pbWVfYWxnX0VTREh3aXRoUkMyCQlPQkpfaWRfc21pbWVfYWxnLDJMCisKKyNkZWZpbmUgU05faWRfc21pbWVfYWxnXzNERVN3cmFwCQkiaWQtc21pbWUtYWxnLTNERVN3cmFwIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWxnXzNERVN3cmFwCQkyNDMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2FsZ18zREVTd3JhcAkJT0JKX2lkX3NtaW1lX2FsZywzTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FsZ19SQzJ3cmFwCQkiaWQtc21pbWUtYWxnLVJDMndyYXAiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGdfUkMyd3JhcAkJMjQ0CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hbGdfUkMyd3JhcAkJT0JKX2lkX3NtaW1lX2FsZyw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FsZ19FU0RICQkiaWQtc21pbWUtYWxnLUVTREgiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9hbGdfRVNESAkJMjQ1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hbGdfRVNESAkJT0JKX2lkX3NtaW1lX2FsZyw1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2FsZ19DTVMzREVTd3JhcAkJImlkLXNtaW1lLWFsZy1DTVMzREVTd3JhcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2FsZ19DTVMzREVTd3JhcAkJMjQ2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9hbGdfQ01TM0RFU3dyYXAJCU9CSl9pZF9zbWltZV9hbGcsNkwKKworI2RlZmluZSBTTl9pZF9zbWltZV9hbGdfQ01TUkMyd3JhcAkJImlkLXNtaW1lLWFsZy1DTVNSQzJ3cmFwIgorI2RlZmluZSBOSURfaWRfc21pbWVfYWxnX0NNU1JDMndyYXAJCTI0NworI2RlZmluZSBPQkpfaWRfc21pbWVfYWxnX0NNU1JDMndyYXAJCU9CSl9pZF9zbWltZV9hbGcsN0wKKworI2RlZmluZSBTTl9pZF9zbWltZV9jZF9sZGFwCQkiaWQtc21pbWUtY2QtbGRhcCIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2NkX2xkYXAJCTI0OAorI2RlZmluZSBPQkpfaWRfc21pbWVfY2RfbGRhcAkJT0JKX2lkX3NtaW1lX2NkLDFMCisKKyNkZWZpbmUgU05faWRfc21pbWVfc3BxX2V0c19zcXRfdXJpCQkiaWQtc21pbWUtc3BxLWV0cy1zcXQtdXJpIgorI2RlZmluZSBOSURfaWRfc21pbWVfc3BxX2V0c19zcXRfdXJpCQkyNDkKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX3NwcV9ldHNfc3F0X3VyaQkJT0JKX2lkX3NtaW1lX3NwcSwxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX3NwcV9ldHNfc3F0X3Vub3RpY2UJCSJpZC1zbWltZS1zcHEtZXRzLXNxdC11bm90aWNlIgorI2RlZmluZSBOSURfaWRfc21pbWVfc3BxX2V0c19zcXRfdW5vdGljZQkJMjUwCisjZGVmaW5lIE9CSl9pZF9zbWltZV9zcHFfZXRzX3NxdF91bm90aWNlCQlPQkpfaWRfc21pbWVfc3BxLDJMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mT3JpZ2luCQkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mT3JpZ2luIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mT3JpZ2luCQkyNTEKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZk9yaWdpbgkJT0JKX2lkX3NtaW1lX2N0aSwxTAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZlJlY2VpcHQJCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZSZWNlaXB0IgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mUmVjZWlwdAkJMjUyCisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZSZWNlaXB0CQlPQkpfaWRfc21pbWVfY3RpLDJMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mRGVsaXZlcnkJCSJpZC1zbWltZS1jdGktZXRzLXByb29mT2ZEZWxpdmVyeSIKKyNkZWZpbmUgTklEX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkRlbGl2ZXJ5CQkyNTMKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkRlbGl2ZXJ5CQlPQkpfaWRfc21pbWVfY3RpLDNMCisKKyNkZWZpbmUgU05faWRfc21pbWVfY3RpX2V0c19wcm9vZk9mU2VuZGVyCQkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mU2VuZGVyIgorI2RlZmluZSBOSURfaWRfc21pbWVfY3RpX2V0c19wcm9vZk9mU2VuZGVyCQkyNTQKKyNkZWZpbmUgT0JKX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZlNlbmRlcgkJT0JKX2lkX3NtaW1lX2N0aSw0TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkFwcHJvdmFsCQkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQXBwcm92YWwiCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZBcHByb3ZhbAkJMjU1CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZBcHByb3ZhbAkJT0JKX2lkX3NtaW1lX2N0aSw1TAorCisjZGVmaW5lIFNOX2lkX3NtaW1lX2N0aV9ldHNfcHJvb2ZPZkNyZWF0aW9uCQkiaWQtc21pbWUtY3RpLWV0cy1wcm9vZk9mQ3JlYXRpb24iCisjZGVmaW5lIE5JRF9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZDcmVhdGlvbgkJMjU2CisjZGVmaW5lIE9CSl9pZF9zbWltZV9jdGlfZXRzX3Byb29mT2ZDcmVhdGlvbgkJT0JKX2lkX3NtaW1lX2N0aSw2TAorCisjZGVmaW5lIExOX2ZyaWVuZGx5TmFtZQkJImZyaWVuZGx5TmFtZSIKKyNkZWZpbmUgTklEX2ZyaWVuZGx5TmFtZQkJMTU2CisjZGVmaW5lIE9CSl9mcmllbmRseU5hbWUJCU9CSl9wa2NzOSwyMEwKKworI2RlZmluZSBMTl9sb2NhbEtleUlECQkibG9jYWxLZXlJRCIKKyNkZWZpbmUgTklEX2xvY2FsS2V5SUQJCTE1NworI2RlZmluZSBPQkpfbG9jYWxLZXlJRAkJT0JKX3BrY3M5LDIxTAorCisjZGVmaW5lIFNOX21zX2NzcF9uYW1lCQkiQ1NQTmFtZSIKKyNkZWZpbmUgTE5fbXNfY3NwX25hbWUJCSJNaWNyb3NvZnQgQ1NQIE5hbWUiCisjZGVmaW5lIE5JRF9tc19jc3BfbmFtZQkJNDE3CisjZGVmaW5lIE9CSl9tc19jc3BfbmFtZQkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwxN0wsMUwKKworI2RlZmluZSBTTl9Mb2NhbEtleVNldAkJIkxvY2FsS2V5U2V0IgorI2RlZmluZSBMTl9Mb2NhbEtleVNldAkJIk1pY3Jvc29mdCBMb2NhbCBLZXkgc2V0IgorI2RlZmluZSBOSURfTG9jYWxLZXlTZXQJCTg1NgorI2RlZmluZSBPQkpfTG9jYWxLZXlTZXQJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMTdMLDJMCisKKyNkZWZpbmUgT0JKX2NlcnRUeXBlcwkJT0JKX3BrY3M5LDIyTAorCisjZGVmaW5lIExOX3g1MDlDZXJ0aWZpY2F0ZQkJIng1MDlDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUgTklEX3g1MDlDZXJ0aWZpY2F0ZQkJMTU4CisjZGVmaW5lIE9CSl94NTA5Q2VydGlmaWNhdGUJCU9CSl9jZXJ0VHlwZXMsMUwKKworI2RlZmluZSBMTl9zZHNpQ2VydGlmaWNhdGUJCSJzZHNpQ2VydGlmaWNhdGUiCisjZGVmaW5lIE5JRF9zZHNpQ2VydGlmaWNhdGUJCTE1OQorI2RlZmluZSBPQkpfc2RzaUNlcnRpZmljYXRlCQlPQkpfY2VydFR5cGVzLDJMCisKKyNkZWZpbmUgT0JKX2NybFR5cGVzCQlPQkpfcGtjczksMjNMCisKKyNkZWZpbmUgTE5feDUwOUNybAkJIng1MDlDcmwiCisjZGVmaW5lIE5JRF94NTA5Q3JsCQkxNjAKKyNkZWZpbmUgT0JKX3g1MDlDcmwJCU9CSl9jcmxUeXBlcywxTAorCisjZGVmaW5lIE9CSl9wa2NzMTIJCU9CSl9wa2NzLDEyTAorCisjZGVmaW5lIE9CSl9wa2NzMTJfcGJlaWRzCQlPQkpfcGtjczEyLDFMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CQkiUEJFLVNIQTEtUkM0LTEyOCIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CQkicGJlV2l0aFNIQTFBbmQxMjhCaXRSQzQiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJCTE0NAorI2RlZmluZSBPQkpfcGJlX1dpdGhTSEExQW5kMTI4Qml0UkM0CQlPQkpfcGtjczEyX3BiZWlkcywxTAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDQwQml0UkM0CQkiUEJFLVNIQTEtUkM0LTQwIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkJInBiZVdpdGhTSEExQW5kNDBCaXRSQzQiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkJMTQ1CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkJT0JKX3BrY3MxMl9wYmVpZHMsMkwKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCQkiUEJFLVNIQTEtM0RFUyIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQwkJInBiZVdpdGhTSEExQW5kMy1LZXlUcmlwbGVERVMtQ0JDIgorI2RlZmluZSBOSURfcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQwkJMTQ2CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQzX0tleV9UcmlwbGVERVNfQ0JDCQlPQkpfcGtjczEyX3BiZWlkcywzTAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJCSJQQkUtU0hBMS0yREVTIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQyX0tleV9UcmlwbGVERVNfQ0JDCQkicGJlV2l0aFNIQTFBbmQyLUtleVRyaXBsZURFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQyX0tleV9UcmlwbGVERVNfQ0JDCQkxNDcKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDJfS2V5X1RyaXBsZURFU19DQkMJCU9CSl9wa2NzMTJfcGJlaWRzLDRMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwkJIlBCRS1TSEExLVJDMi0xMjgiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMJCSJwYmVXaXRoU0hBMUFuZDEyOEJpdFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDCQkxNDgKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMJCU9CSl9wa2NzMTJfcGJlaWRzLDVMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDCQkiUEJFLVNIQTEtUkMyLTQwIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJCSJwYmVXaXRoU0hBMUFuZDQwQml0UkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQwkJMTQ5CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJCU9CSl9wa2NzMTJfcGJlaWRzLDZMCisKKyNkZWZpbmUgT0JKX3BrY3MxMl9WZXJzaW9uMQkJT0JKX3BrY3MxMiwxMEwKKworI2RlZmluZSBPQkpfcGtjczEyX0JhZ0lkcwkJT0JKX3BrY3MxMl9WZXJzaW9uMSwxTAorCisjZGVmaW5lIExOX2tleUJhZwkJImtleUJhZyIKKyNkZWZpbmUgTklEX2tleUJhZwkJMTUwCisjZGVmaW5lIE9CSl9rZXlCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDFMCisKKyNkZWZpbmUgTE5fcGtjczhTaHJvdWRlZEtleUJhZwkJInBrY3M4U2hyb3VkZWRLZXlCYWciCisjZGVmaW5lIE5JRF9wa2NzOFNocm91ZGVkS2V5QmFnCQkxNTEKKyNkZWZpbmUgT0JKX3BrY3M4U2hyb3VkZWRLZXlCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDJMCisKKyNkZWZpbmUgTE5fY2VydEJhZwkJImNlcnRCYWciCisjZGVmaW5lIE5JRF9jZXJ0QmFnCQkxNTIKKyNkZWZpbmUgT0JKX2NlcnRCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDNMCisKKyNkZWZpbmUgTE5fY3JsQmFnCQkiY3JsQmFnIgorI2RlZmluZSBOSURfY3JsQmFnCQkxNTMKKyNkZWZpbmUgT0JKX2NybEJhZwkJT0JKX3BrY3MxMl9CYWdJZHMsNEwKKworI2RlZmluZSBMTl9zZWNyZXRCYWcJCSJzZWNyZXRCYWciCisjZGVmaW5lIE5JRF9zZWNyZXRCYWcJCTE1NAorI2RlZmluZSBPQkpfc2VjcmV0QmFnCQlPQkpfcGtjczEyX0JhZ0lkcyw1TAorCisjZGVmaW5lIExOX3NhZmVDb250ZW50c0JhZwkJInNhZmVDb250ZW50c0JhZyIKKyNkZWZpbmUgTklEX3NhZmVDb250ZW50c0JhZwkJMTU1CisjZGVmaW5lIE9CSl9zYWZlQ29udGVudHNCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLDZMCisKKyNkZWZpbmUgU05fbWQyCQkiTUQyIgorI2RlZmluZSBMTl9tZDIJCSJtZDIiCisjZGVmaW5lIE5JRF9tZDIJCTMKKyNkZWZpbmUgT0JKX21kMgkJT0JKX3JzYWRzaSwyTCwyTAorCisjZGVmaW5lIFNOX21kNAkJIk1ENCIKKyNkZWZpbmUgTE5fbWQ0CQkibWQ0IgorI2RlZmluZSBOSURfbWQ0CQkyNTcKKyNkZWZpbmUgT0JKX21kNAkJT0JKX3JzYWRzaSwyTCw0TAorCisjZGVmaW5lIFNOX21kNQkJIk1ENSIKKyNkZWZpbmUgTE5fbWQ1CQkibWQ1IgorI2RlZmluZSBOSURfbWQ1CQk0CisjZGVmaW5lIE9CSl9tZDUJCU9CSl9yc2Fkc2ksMkwsNUwKKworI2RlZmluZSBTTl9tZDVfc2hhMQkJIk1ENS1TSEExIgorI2RlZmluZSBMTl9tZDVfc2hhMQkJIm1kNS1zaGExIgorI2RlZmluZSBOSURfbWQ1X3NoYTEJCTExNAorCisjZGVmaW5lIExOX2htYWNXaXRoTUQ1CQkiaG1hY1dpdGhNRDUiCisjZGVmaW5lIE5JRF9obWFjV2l0aE1ENQkJNzk3CisjZGVmaW5lIE9CSl9obWFjV2l0aE1ENQkJT0JKX3JzYWRzaSwyTCw2TAorCisjZGVmaW5lIExOX2htYWNXaXRoU0hBMQkJImhtYWNXaXRoU0hBMSIKKyNkZWZpbmUgTklEX2htYWNXaXRoU0hBMQkJMTYzCisjZGVmaW5lIE9CSl9obWFjV2l0aFNIQTEJCU9CSl9yc2Fkc2ksMkwsN0wKKworI2RlZmluZSBMTl9obWFjV2l0aFNIQTIyNAkJImhtYWNXaXRoU0hBMjI0IgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEEyMjQJCTc5OAorI2RlZmluZSBPQkpfaG1hY1dpdGhTSEEyMjQJCU9CSl9yc2Fkc2ksMkwsOEwKKworI2RlZmluZSBMTl9obWFjV2l0aFNIQTI1NgkJImhtYWNXaXRoU0hBMjU2IgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEEyNTYJCTc5OQorI2RlZmluZSBPQkpfaG1hY1dpdGhTSEEyNTYJCU9CSl9yc2Fkc2ksMkwsOUwKKworI2RlZmluZSBMTl9obWFjV2l0aFNIQTM4NAkJImhtYWNXaXRoU0hBMzg0IgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEEzODQJCTgwMAorI2RlZmluZSBPQkpfaG1hY1dpdGhTSEEzODQJCU9CSl9yc2Fkc2ksMkwsMTBMCisKKyNkZWZpbmUgTE5faG1hY1dpdGhTSEE1MTIJCSJobWFjV2l0aFNIQTUxMiIKKyNkZWZpbmUgTklEX2htYWNXaXRoU0hBNTEyCQk4MDEKKyNkZWZpbmUgT0JKX2htYWNXaXRoU0hBNTEyCQlPQkpfcnNhZHNpLDJMLDExTAorCisjZGVmaW5lIFNOX3JjMl9jYmMJCSJSQzItQ0JDIgorI2RlZmluZSBMTl9yYzJfY2JjCQkicmMyLWNiYyIKKyNkZWZpbmUgTklEX3JjMl9jYmMJCTM3CisjZGVmaW5lIE9CSl9yYzJfY2JjCQlPQkpfcnNhZHNpLDNMLDJMCisKKyNkZWZpbmUgU05fcmMyX2VjYgkJIlJDMi1FQ0IiCisjZGVmaW5lIExOX3JjMl9lY2IJCSJyYzItZWNiIgorI2RlZmluZSBOSURfcmMyX2VjYgkJMzgKKworI2RlZmluZSBTTl9yYzJfY2ZiNjQJCSJSQzItQ0ZCIgorI2RlZmluZSBMTl9yYzJfY2ZiNjQJCSJyYzItY2ZiIgorI2RlZmluZSBOSURfcmMyX2NmYjY0CQkzOQorCisjZGVmaW5lIFNOX3JjMl9vZmI2NAkJIlJDMi1PRkIiCisjZGVmaW5lIExOX3JjMl9vZmI2NAkJInJjMi1vZmIiCisjZGVmaW5lIE5JRF9yYzJfb2ZiNjQJCTQwCisKKyNkZWZpbmUgU05fcmMyXzQwX2NiYwkJIlJDMi00MC1DQkMiCisjZGVmaW5lIExOX3JjMl80MF9jYmMJCSJyYzItNDAtY2JjIgorI2RlZmluZSBOSURfcmMyXzQwX2NiYwkJOTgKKworI2RlZmluZSBTTl9yYzJfNjRfY2JjCQkiUkMyLTY0LUNCQyIKKyNkZWZpbmUgTE5fcmMyXzY0X2NiYwkJInJjMi02NC1jYmMiCisjZGVmaW5lIE5JRF9yYzJfNjRfY2JjCQkxNjYKKworI2RlZmluZSBTTl9yYzQJCSJSQzQiCisjZGVmaW5lIExOX3JjNAkJInJjNCIKKyNkZWZpbmUgTklEX3JjNAkJNQorI2RlZmluZSBPQkpfcmM0CQlPQkpfcnNhZHNpLDNMLDRMCisKKyNkZWZpbmUgU05fcmM0XzQwCQkiUkM0LTQwIgorI2RlZmluZSBMTl9yYzRfNDAJCSJyYzQtNDAiCisjZGVmaW5lIE5JRF9yYzRfNDAJCTk3CisKKyNkZWZpbmUgU05fZGVzX2VkZTNfY2JjCQkiREVTLUVERTMtQ0JDIgorI2RlZmluZSBMTl9kZXNfZWRlM19jYmMJCSJkZXMtZWRlMy1jYmMiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19jYmMJCTQ0CisjZGVmaW5lIE9CSl9kZXNfZWRlM19jYmMJCU9CSl9yc2Fkc2ksM0wsN0wKKworI2RlZmluZSBTTl9yYzVfY2JjCQkiUkM1LUNCQyIKKyNkZWZpbmUgTE5fcmM1X2NiYwkJInJjNS1jYmMiCisjZGVmaW5lIE5JRF9yYzVfY2JjCQkxMjAKKyNkZWZpbmUgT0JKX3JjNV9jYmMJCU9CSl9yc2Fkc2ksM0wsOEwKKworI2RlZmluZSBTTl9yYzVfZWNiCQkiUkM1LUVDQiIKKyNkZWZpbmUgTE5fcmM1X2VjYgkJInJjNS1lY2IiCisjZGVmaW5lIE5JRF9yYzVfZWNiCQkxMjEKKworI2RlZmluZSBTTl9yYzVfY2ZiNjQJCSJSQzUtQ0ZCIgorI2RlZmluZSBMTl9yYzVfY2ZiNjQJCSJyYzUtY2ZiIgorI2RlZmluZSBOSURfcmM1X2NmYjY0CQkxMjIKKworI2RlZmluZSBTTl9yYzVfb2ZiNjQJCSJSQzUtT0ZCIgorI2RlZmluZSBMTl9yYzVfb2ZiNjQJCSJyYzUtb2ZiIgorI2RlZmluZSBOSURfcmM1X29mYjY0CQkxMjMKKworI2RlZmluZSBTTl9tc19leHRfcmVxCQkibXNFeHRSZXEiCisjZGVmaW5lIExOX21zX2V4dF9yZXEJCSJNaWNyb3NvZnQgRXh0ZW5zaW9uIFJlcXVlc3QiCisjZGVmaW5lIE5JRF9tc19leHRfcmVxCQkxNzEKKyNkZWZpbmUgT0JKX21zX2V4dF9yZXEJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMTRMCisKKyNkZWZpbmUgU05fbXNfY29kZV9pbmQJCSJtc0NvZGVJbmQiCisjZGVmaW5lIExOX21zX2NvZGVfaW5kCQkiTWljcm9zb2Z0IEluZGl2aWR1YWwgQ29kZSBTaWduaW5nIgorI2RlZmluZSBOSURfbXNfY29kZV9pbmQJCTEzNAorI2RlZmluZSBPQkpfbXNfY29kZV9pbmQJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMjFMCisKKyNkZWZpbmUgU05fbXNfY29kZV9jb20JCSJtc0NvZGVDb20iCisjZGVmaW5lIExOX21zX2NvZGVfY29tCQkiTWljcm9zb2Z0IENvbW1lcmNpYWwgQ29kZSBTaWduaW5nIgorI2RlZmluZSBOSURfbXNfY29kZV9jb20JCTEzNQorI2RlZmluZSBPQkpfbXNfY29kZV9jb20JCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMjJMCisKKyNkZWZpbmUgU05fbXNfY3RsX3NpZ24JCSJtc0NUTFNpZ24iCisjZGVmaW5lIExOX21zX2N0bF9zaWduCQkiTWljcm9zb2Z0IFRydXN0IExpc3QgU2lnbmluZyIKKyNkZWZpbmUgTklEX21zX2N0bF9zaWduCQkxMzYKKyNkZWZpbmUgT0JKX21zX2N0bF9zaWduCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDEwTCwzTCwxTAorCisjZGVmaW5lIFNOX21zX3NnYwkJIm1zU0dDIgorI2RlZmluZSBMTl9tc19zZ2MJCSJNaWNyb3NvZnQgU2VydmVyIEdhdGVkIENyeXB0byIKKyNkZWZpbmUgTklEX21zX3NnYwkJMTM3CisjZGVmaW5lIE9CSl9tc19zZ2MJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMTBMLDNMLDNMCisKKyNkZWZpbmUgU05fbXNfZWZzCQkibXNFRlMiCisjZGVmaW5lIExOX21zX2VmcwkJIk1pY3Jvc29mdCBFbmNyeXB0ZWQgRmlsZSBTeXN0ZW0iCisjZGVmaW5lIE5JRF9tc19lZnMJCTEzOAorI2RlZmluZSBPQkpfbXNfZWZzCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDEwTCwzTCw0TAorCisjZGVmaW5lIFNOX21zX3NtYXJ0Y2FyZF9sb2dpbgkJIm1zU21hcnRjYXJkTG9naW4iCisjZGVmaW5lIExOX21zX3NtYXJ0Y2FyZF9sb2dpbgkJIk1pY3Jvc29mdCBTbWFydGNhcmRsb2dpbiIKKyNkZWZpbmUgTklEX21zX3NtYXJ0Y2FyZF9sb2dpbgkJNjQ4CisjZGVmaW5lIE9CSl9tc19zbWFydGNhcmRfbG9naW4JCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMjBMLDJMLDJMCisKKyNkZWZpbmUgU05fbXNfdXBuCQkibXNVUE4iCisjZGVmaW5lIExOX21zX3VwbgkJIk1pY3Jvc29mdCBVbml2ZXJzYWwgUHJpbmNpcGFsIE5hbWUiCisjZGVmaW5lIE5JRF9tc191cG4JCTY0OQorI2RlZmluZSBPQkpfbXNfdXBuCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDIwTCwyTCwzTAorCisjZGVmaW5lIFNOX2lkZWFfY2JjCQkiSURFQS1DQkMiCisjZGVmaW5lIExOX2lkZWFfY2JjCQkiaWRlYS1jYmMiCisjZGVmaW5lIE5JRF9pZGVhX2NiYwkJMzQKKyNkZWZpbmUgT0JKX2lkZWFfY2JjCQkxTCwzTCw2TCwxTCw0TCwxTCwxODhMLDdMLDFMLDFMLDJMCisKKyNkZWZpbmUgU05faWRlYV9lY2IJCSJJREVBLUVDQiIKKyNkZWZpbmUgTE5faWRlYV9lY2IJCSJpZGVhLWVjYiIKKyNkZWZpbmUgTklEX2lkZWFfZWNiCQkzNgorCisjZGVmaW5lIFNOX2lkZWFfY2ZiNjQJCSJJREVBLUNGQiIKKyNkZWZpbmUgTE5faWRlYV9jZmI2NAkJImlkZWEtY2ZiIgorI2RlZmluZSBOSURfaWRlYV9jZmI2NAkJMzUKKworI2RlZmluZSBTTl9pZGVhX29mYjY0CQkiSURFQS1PRkIiCisjZGVmaW5lIExOX2lkZWFfb2ZiNjQJCSJpZGVhLW9mYiIKKyNkZWZpbmUgTklEX2lkZWFfb2ZiNjQJCTQ2CisKKyNkZWZpbmUgU05fYmZfY2JjCQkiQkYtQ0JDIgorI2RlZmluZSBMTl9iZl9jYmMJCSJiZi1jYmMiCisjZGVmaW5lIE5JRF9iZl9jYmMJCTkxCisjZGVmaW5lIE9CSl9iZl9jYmMJCTFMLDNMLDZMLDFMLDRMLDFMLDMwMjlMLDFMLDJMCisKKyNkZWZpbmUgU05fYmZfZWNiCQkiQkYtRUNCIgorI2RlZmluZSBMTl9iZl9lY2IJCSJiZi1lY2IiCisjZGVmaW5lIE5JRF9iZl9lY2IJCTkyCisKKyNkZWZpbmUgU05fYmZfY2ZiNjQJCSJCRi1DRkIiCisjZGVmaW5lIExOX2JmX2NmYjY0CQkiYmYtY2ZiIgorI2RlZmluZSBOSURfYmZfY2ZiNjQJCTkzCisKKyNkZWZpbmUgU05fYmZfb2ZiNjQJCSJCRi1PRkIiCisjZGVmaW5lIExOX2JmX29mYjY0CQkiYmYtb2ZiIgorI2RlZmluZSBOSURfYmZfb2ZiNjQJCTk0CisKKyNkZWZpbmUgU05faWRfcGtpeAkJIlBLSVgiCisjZGVmaW5lIE5JRF9pZF9wa2l4CQkxMjcKKyNkZWZpbmUgT0JKX2lkX3BraXgJCTFMLDNMLDZMLDFMLDVMLDVMLDdMCisKKyNkZWZpbmUgU05faWRfcGtpeF9tb2QJCSJpZC1wa2l4LW1vZCIKKyNkZWZpbmUgTklEX2lkX3BraXhfbW9kCQkyNTgKKyNkZWZpbmUgT0JKX2lkX3BraXhfbW9kCQlPQkpfaWRfcGtpeCwwTAorCisjZGVmaW5lIFNOX2lkX3BlCQkiaWQtcGUiCisjZGVmaW5lIE5JRF9pZF9wZQkJMTc1CisjZGVmaW5lIE9CSl9pZF9wZQkJT0JKX2lkX3BraXgsMUwKKworI2RlZmluZSBTTl9pZF9xdAkJImlkLXF0IgorI2RlZmluZSBOSURfaWRfcXQJCTI1OQorI2RlZmluZSBPQkpfaWRfcXQJCU9CSl9pZF9wa2l4LDJMCisKKyNkZWZpbmUgU05faWRfa3AJCSJpZC1rcCIKKyNkZWZpbmUgTklEX2lkX2twCQkxMjgKKyNkZWZpbmUgT0JKX2lkX2twCQlPQkpfaWRfcGtpeCwzTAorCisjZGVmaW5lIFNOX2lkX2l0CQkiaWQtaXQiCisjZGVmaW5lIE5JRF9pZF9pdAkJMjYwCisjZGVmaW5lIE9CSl9pZF9pdAkJT0JKX2lkX3BraXgsNEwKKworI2RlZmluZSBTTl9pZF9wa2lwCQkiaWQtcGtpcCIKKyNkZWZpbmUgTklEX2lkX3BraXAJCTI2MQorI2RlZmluZSBPQkpfaWRfcGtpcAkJT0JKX2lkX3BraXgsNUwKKworI2RlZmluZSBTTl9pZF9hbGcJCSJpZC1hbGciCisjZGVmaW5lIE5JRF9pZF9hbGcJCTI2MgorI2RlZmluZSBPQkpfaWRfYWxnCQlPQkpfaWRfcGtpeCw2TAorCisjZGVmaW5lIFNOX2lkX2NtYwkJImlkLWNtYyIKKyNkZWZpbmUgTklEX2lkX2NtYwkJMjYzCisjZGVmaW5lIE9CSl9pZF9jbWMJCU9CSl9pZF9wa2l4LDdMCisKKyNkZWZpbmUgU05faWRfb24JCSJpZC1vbiIKKyNkZWZpbmUgTklEX2lkX29uCQkyNjQKKyNkZWZpbmUgT0JKX2lkX29uCQlPQkpfaWRfcGtpeCw4TAorCisjZGVmaW5lIFNOX2lkX3BkYQkJImlkLXBkYSIKKyNkZWZpbmUgTklEX2lkX3BkYQkJMjY1CisjZGVmaW5lIE9CSl9pZF9wZGEJCU9CSl9pZF9wa2l4LDlMCisKKyNkZWZpbmUgU05faWRfYWNhCQkiaWQtYWNhIgorI2RlZmluZSBOSURfaWRfYWNhCQkyNjYKKyNkZWZpbmUgT0JKX2lkX2FjYQkJT0JKX2lkX3BraXgsMTBMCisKKyNkZWZpbmUgU05faWRfcWNzCQkiaWQtcWNzIgorI2RlZmluZSBOSURfaWRfcWNzCQkyNjcKKyNkZWZpbmUgT0JKX2lkX3FjcwkJT0JKX2lkX3BraXgsMTFMCisKKyNkZWZpbmUgU05faWRfY2N0CQkiaWQtY2N0IgorI2RlZmluZSBOSURfaWRfY2N0CQkyNjgKKyNkZWZpbmUgT0JKX2lkX2NjdAkJT0JKX2lkX3BraXgsMTJMCisKKyNkZWZpbmUgU05faWRfcHBsCQkiaWQtcHBsIgorI2RlZmluZSBOSURfaWRfcHBsCQk2NjIKKyNkZWZpbmUgT0JKX2lkX3BwbAkJT0JKX2lkX3BraXgsMjFMCisKKyNkZWZpbmUgU05faWRfYWQJCSJpZC1hZCIKKyNkZWZpbmUgTklEX2lkX2FkCQkxNzYKKyNkZWZpbmUgT0JKX2lkX2FkCQlPQkpfaWRfcGtpeCw0OEwKKworI2RlZmluZSBTTl9pZF9wa2l4MV9leHBsaWNpdF84OAkJImlkLXBraXgxLWV4cGxpY2l0LTg4IgorI2RlZmluZSBOSURfaWRfcGtpeDFfZXhwbGljaXRfODgJCTI2OQorI2RlZmluZSBPQkpfaWRfcGtpeDFfZXhwbGljaXRfODgJCU9CSl9pZF9wa2l4X21vZCwxTAorCisjZGVmaW5lIFNOX2lkX3BraXgxX2ltcGxpY2l0Xzg4CQkiaWQtcGtpeDEtaW1wbGljaXQtODgiCisjZGVmaW5lIE5JRF9pZF9wa2l4MV9pbXBsaWNpdF84OAkJMjcwCisjZGVmaW5lIE9CSl9pZF9wa2l4MV9pbXBsaWNpdF84OAkJT0JKX2lkX3BraXhfbW9kLDJMCisKKyNkZWZpbmUgU05faWRfcGtpeDFfZXhwbGljaXRfOTMJCSJpZC1wa2l4MS1leHBsaWNpdC05MyIKKyNkZWZpbmUgTklEX2lkX3BraXgxX2V4cGxpY2l0XzkzCQkyNzEKKyNkZWZpbmUgT0JKX2lkX3BraXgxX2V4cGxpY2l0XzkzCQlPQkpfaWRfcGtpeF9tb2QsM0wKKworI2RlZmluZSBTTl9pZF9wa2l4MV9pbXBsaWNpdF85MwkJImlkLXBraXgxLWltcGxpY2l0LTkzIgorI2RlZmluZSBOSURfaWRfcGtpeDFfaW1wbGljaXRfOTMJCTI3MgorI2RlZmluZSBPQkpfaWRfcGtpeDFfaW1wbGljaXRfOTMJCU9CSl9pZF9wa2l4X21vZCw0TAorCisjZGVmaW5lIFNOX2lkX21vZF9jcm1mCQkiaWQtbW9kLWNybWYiCisjZGVmaW5lIE5JRF9pZF9tb2RfY3JtZgkJMjczCisjZGVmaW5lIE9CSl9pZF9tb2RfY3JtZgkJT0JKX2lkX3BraXhfbW9kLDVMCisKKyNkZWZpbmUgU05faWRfbW9kX2NtYwkJImlkLW1vZC1jbWMiCisjZGVmaW5lIE5JRF9pZF9tb2RfY21jCQkyNzQKKyNkZWZpbmUgT0JKX2lkX21vZF9jbWMJCU9CSl9pZF9wa2l4X21vZCw2TAorCisjZGVmaW5lIFNOX2lkX21vZF9rZWFfcHJvZmlsZV84OAkJImlkLW1vZC1rZWEtcHJvZmlsZS04OCIKKyNkZWZpbmUgTklEX2lkX21vZF9rZWFfcHJvZmlsZV84OAkJMjc1CisjZGVmaW5lIE9CSl9pZF9tb2Rfa2VhX3Byb2ZpbGVfODgJCU9CSl9pZF9wa2l4X21vZCw3TAorCisjZGVmaW5lIFNOX2lkX21vZF9rZWFfcHJvZmlsZV85MwkJImlkLW1vZC1rZWEtcHJvZmlsZS05MyIKKyNkZWZpbmUgTklEX2lkX21vZF9rZWFfcHJvZmlsZV85MwkJMjc2CisjZGVmaW5lIE9CSl9pZF9tb2Rfa2VhX3Byb2ZpbGVfOTMJCU9CSl9pZF9wa2l4X21vZCw4TAorCisjZGVmaW5lIFNOX2lkX21vZF9jbXAJCSJpZC1tb2QtY21wIgorI2RlZmluZSBOSURfaWRfbW9kX2NtcAkJMjc3CisjZGVmaW5lIE9CSl9pZF9tb2RfY21wCQlPQkpfaWRfcGtpeF9tb2QsOUwKKworI2RlZmluZSBTTl9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfODgJCSJpZC1tb2QtcXVhbGlmaWVkLWNlcnQtODgiCisjZGVmaW5lIE5JRF9pZF9tb2RfcXVhbGlmaWVkX2NlcnRfODgJCTI3OAorI2RlZmluZSBPQkpfaWRfbW9kX3F1YWxpZmllZF9jZXJ0Xzg4CQlPQkpfaWRfcGtpeF9tb2QsMTBMCisKKyNkZWZpbmUgU05faWRfbW9kX3F1YWxpZmllZF9jZXJ0XzkzCQkiaWQtbW9kLXF1YWxpZmllZC1jZXJ0LTkzIgorI2RlZmluZSBOSURfaWRfbW9kX3F1YWxpZmllZF9jZXJ0XzkzCQkyNzkKKyNkZWZpbmUgT0JKX2lkX21vZF9xdWFsaWZpZWRfY2VydF85MwkJT0JKX2lkX3BraXhfbW9kLDExTAorCisjZGVmaW5lIFNOX2lkX21vZF9hdHRyaWJ1dGVfY2VydAkJImlkLW1vZC1hdHRyaWJ1dGUtY2VydCIKKyNkZWZpbmUgTklEX2lkX21vZF9hdHRyaWJ1dGVfY2VydAkJMjgwCisjZGVmaW5lIE9CSl9pZF9tb2RfYXR0cmlidXRlX2NlcnQJCU9CSl9pZF9wa2l4X21vZCwxMkwKKworI2RlZmluZSBTTl9pZF9tb2RfdGltZXN0YW1wX3Byb3RvY29sCQkiaWQtbW9kLXRpbWVzdGFtcC1wcm90b2NvbCIKKyNkZWZpbmUgTklEX2lkX21vZF90aW1lc3RhbXBfcHJvdG9jb2wJCTI4MQorI2RlZmluZSBPQkpfaWRfbW9kX3RpbWVzdGFtcF9wcm90b2NvbAkJT0JKX2lkX3BraXhfbW9kLDEzTAorCisjZGVmaW5lIFNOX2lkX21vZF9vY3NwCQkiaWQtbW9kLW9jc3AiCisjZGVmaW5lIE5JRF9pZF9tb2Rfb2NzcAkJMjgyCisjZGVmaW5lIE9CSl9pZF9tb2Rfb2NzcAkJT0JKX2lkX3BraXhfbW9kLDE0TAorCisjZGVmaW5lIFNOX2lkX21vZF9kdmNzCQkiaWQtbW9kLWR2Y3MiCisjZGVmaW5lIE5JRF9pZF9tb2RfZHZjcwkJMjgzCisjZGVmaW5lIE9CSl9pZF9tb2RfZHZjcwkJT0JKX2lkX3BraXhfbW9kLDE1TAorCisjZGVmaW5lIFNOX2lkX21vZF9jbXAyMDAwCQkiaWQtbW9kLWNtcDIwMDAiCisjZGVmaW5lIE5JRF9pZF9tb2RfY21wMjAwMAkJMjg0CisjZGVmaW5lIE9CSl9pZF9tb2RfY21wMjAwMAkJT0JKX2lkX3BraXhfbW9kLDE2TAorCisjZGVmaW5lIFNOX2luZm9fYWNjZXNzCQkiYXV0aG9yaXR5SW5mb0FjY2VzcyIKKyNkZWZpbmUgTE5faW5mb19hY2Nlc3MJCSJBdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzIgorI2RlZmluZSBOSURfaW5mb19hY2Nlc3MJCTE3NworI2RlZmluZSBPQkpfaW5mb19hY2Nlc3MJCU9CSl9pZF9wZSwxTAorCisjZGVmaW5lIFNOX2Jpb21ldHJpY0luZm8JCSJiaW9tZXRyaWNJbmZvIgorI2RlZmluZSBMTl9iaW9tZXRyaWNJbmZvCQkiQmlvbWV0cmljIEluZm8iCisjZGVmaW5lIE5JRF9iaW9tZXRyaWNJbmZvCQkyODUKKyNkZWZpbmUgT0JKX2Jpb21ldHJpY0luZm8JCU9CSl9pZF9wZSwyTAorCisjZGVmaW5lIFNOX3FjU3RhdGVtZW50cwkJInFjU3RhdGVtZW50cyIKKyNkZWZpbmUgTklEX3FjU3RhdGVtZW50cwkJMjg2CisjZGVmaW5lIE9CSl9xY1N0YXRlbWVudHMJCU9CSl9pZF9wZSwzTAorCisjZGVmaW5lIFNOX2FjX2F1ZGl0RW50aXR5CQkiYWMtYXVkaXRFbnRpdHkiCisjZGVmaW5lIE5JRF9hY19hdWRpdEVudGl0eQkJMjg3CisjZGVmaW5lIE9CSl9hY19hdWRpdEVudGl0eQkJT0JKX2lkX3BlLDRMCisKKyNkZWZpbmUgU05fYWNfdGFyZ2V0aW5nCQkiYWMtdGFyZ2V0aW5nIgorI2RlZmluZSBOSURfYWNfdGFyZ2V0aW5nCQkyODgKKyNkZWZpbmUgT0JKX2FjX3RhcmdldGluZwkJT0JKX2lkX3BlLDVMCisKKyNkZWZpbmUgU05fYWFDb250cm9scwkJImFhQ29udHJvbHMiCisjZGVmaW5lIE5JRF9hYUNvbnRyb2xzCQkyODkKKyNkZWZpbmUgT0JKX2FhQ29udHJvbHMJCU9CSl9pZF9wZSw2TAorCisjZGVmaW5lIFNOX3NiZ3BfaXBBZGRyQmxvY2sJCSJzYmdwLWlwQWRkckJsb2NrIgorI2RlZmluZSBOSURfc2JncF9pcEFkZHJCbG9jawkJMjkwCisjZGVmaW5lIE9CSl9zYmdwX2lwQWRkckJsb2NrCQlPQkpfaWRfcGUsN0wKKworI2RlZmluZSBTTl9zYmdwX2F1dG9ub21vdXNTeXNOdW0JCSJzYmdwLWF1dG9ub21vdXNTeXNOdW0iCisjZGVmaW5lIE5JRF9zYmdwX2F1dG9ub21vdXNTeXNOdW0JCTI5MQorI2RlZmluZSBPQkpfc2JncF9hdXRvbm9tb3VzU3lzTnVtCQlPQkpfaWRfcGUsOEwKKworI2RlZmluZSBTTl9zYmdwX3JvdXRlcklkZW50aWZpZXIJCSJzYmdwLXJvdXRlcklkZW50aWZpZXIiCisjZGVmaW5lIE5JRF9zYmdwX3JvdXRlcklkZW50aWZpZXIJCTI5MgorI2RlZmluZSBPQkpfc2JncF9yb3V0ZXJJZGVudGlmaWVyCQlPQkpfaWRfcGUsOUwKKworI2RlZmluZSBTTl9hY19wcm94eWluZwkJImFjLXByb3h5aW5nIgorI2RlZmluZSBOSURfYWNfcHJveHlpbmcJCTM5NworI2RlZmluZSBPQkpfYWNfcHJveHlpbmcJCU9CSl9pZF9wZSwxMEwKKworI2RlZmluZSBTTl9zaW5mb19hY2Nlc3MJCSJzdWJqZWN0SW5mb0FjY2VzcyIKKyNkZWZpbmUgTE5fc2luZm9fYWNjZXNzCQkiU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MiCisjZGVmaW5lIE5JRF9zaW5mb19hY2Nlc3MJCTM5OAorI2RlZmluZSBPQkpfc2luZm9fYWNjZXNzCQlPQkpfaWRfcGUsMTFMCisKKyNkZWZpbmUgU05fcHJveHlDZXJ0SW5mbwkJInByb3h5Q2VydEluZm8iCisjZGVmaW5lIExOX3Byb3h5Q2VydEluZm8JCSJQcm94eSBDZXJ0aWZpY2F0ZSBJbmZvcm1hdGlvbiIKKyNkZWZpbmUgTklEX3Byb3h5Q2VydEluZm8JCTY2MworI2RlZmluZSBPQkpfcHJveHlDZXJ0SW5mbwkJT0JKX2lkX3BlLDE0TAorCisjZGVmaW5lIFNOX2lkX3F0X2NwcwkJImlkLXF0LWNwcyIKKyNkZWZpbmUgTE5faWRfcXRfY3BzCQkiUG9saWN5IFF1YWxpZmllciBDUFMiCisjZGVmaW5lIE5JRF9pZF9xdF9jcHMJCTE2NAorI2RlZmluZSBPQkpfaWRfcXRfY3BzCQlPQkpfaWRfcXQsMUwKKworI2RlZmluZSBTTl9pZF9xdF91bm90aWNlCQkiaWQtcXQtdW5vdGljZSIKKyNkZWZpbmUgTE5faWRfcXRfdW5vdGljZQkJIlBvbGljeSBRdWFsaWZpZXIgVXNlciBOb3RpY2UiCisjZGVmaW5lIE5JRF9pZF9xdF91bm90aWNlCQkxNjUKKyNkZWZpbmUgT0JKX2lkX3F0X3Vub3RpY2UJCU9CSl9pZF9xdCwyTAorCisjZGVmaW5lIFNOX3RleHROb3RpY2UJCSJ0ZXh0Tm90aWNlIgorI2RlZmluZSBOSURfdGV4dE5vdGljZQkJMjkzCisjZGVmaW5lIE9CSl90ZXh0Tm90aWNlCQlPQkpfaWRfcXQsM0wKKworI2RlZmluZSBTTl9zZXJ2ZXJfYXV0aAkJInNlcnZlckF1dGgiCisjZGVmaW5lIExOX3NlcnZlcl9hdXRoCQkiVExTIFdlYiBTZXJ2ZXIgQXV0aGVudGljYXRpb24iCisjZGVmaW5lIE5JRF9zZXJ2ZXJfYXV0aAkJMTI5CisjZGVmaW5lIE9CSl9zZXJ2ZXJfYXV0aAkJT0JKX2lkX2twLDFMCisKKyNkZWZpbmUgU05fY2xpZW50X2F1dGgJCSJjbGllbnRBdXRoIgorI2RlZmluZSBMTl9jbGllbnRfYXV0aAkJIlRMUyBXZWIgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIgorI2RlZmluZSBOSURfY2xpZW50X2F1dGgJCTEzMAorI2RlZmluZSBPQkpfY2xpZW50X2F1dGgJCU9CSl9pZF9rcCwyTAorCisjZGVmaW5lIFNOX2NvZGVfc2lnbgkJImNvZGVTaWduaW5nIgorI2RlZmluZSBMTl9jb2RlX3NpZ24JCSJDb2RlIFNpZ25pbmciCisjZGVmaW5lIE5JRF9jb2RlX3NpZ24JCTEzMQorI2RlZmluZSBPQkpfY29kZV9zaWduCQlPQkpfaWRfa3AsM0wKKworI2RlZmluZSBTTl9lbWFpbF9wcm90ZWN0CQkiZW1haWxQcm90ZWN0aW9uIgorI2RlZmluZSBMTl9lbWFpbF9wcm90ZWN0CQkiRS1tYWlsIFByb3RlY3Rpb24iCisjZGVmaW5lIE5JRF9lbWFpbF9wcm90ZWN0CQkxMzIKKyNkZWZpbmUgT0JKX2VtYWlsX3Byb3RlY3QJCU9CSl9pZF9rcCw0TAorCisjZGVmaW5lIFNOX2lwc2VjRW5kU3lzdGVtCQkiaXBzZWNFbmRTeXN0ZW0iCisjZGVmaW5lIExOX2lwc2VjRW5kU3lzdGVtCQkiSVBTZWMgRW5kIFN5c3RlbSIKKyNkZWZpbmUgTklEX2lwc2VjRW5kU3lzdGVtCQkyOTQKKyNkZWZpbmUgT0JKX2lwc2VjRW5kU3lzdGVtCQlPQkpfaWRfa3AsNUwKKworI2RlZmluZSBTTl9pcHNlY1R1bm5lbAkJImlwc2VjVHVubmVsIgorI2RlZmluZSBMTl9pcHNlY1R1bm5lbAkJIklQU2VjIFR1bm5lbCIKKyNkZWZpbmUgTklEX2lwc2VjVHVubmVsCQkyOTUKKyNkZWZpbmUgT0JKX2lwc2VjVHVubmVsCQlPQkpfaWRfa3AsNkwKKworI2RlZmluZSBTTl9pcHNlY1VzZXIJCSJpcHNlY1VzZXIiCisjZGVmaW5lIExOX2lwc2VjVXNlcgkJIklQU2VjIFVzZXIiCisjZGVmaW5lIE5JRF9pcHNlY1VzZXIJCTI5NgorI2RlZmluZSBPQkpfaXBzZWNVc2VyCQlPQkpfaWRfa3AsN0wKKworI2RlZmluZSBTTl90aW1lX3N0YW1wCQkidGltZVN0YW1waW5nIgorI2RlZmluZSBMTl90aW1lX3N0YW1wCQkiVGltZSBTdGFtcGluZyIKKyNkZWZpbmUgTklEX3RpbWVfc3RhbXAJCTEzMworI2RlZmluZSBPQkpfdGltZV9zdGFtcAkJT0JKX2lkX2twLDhMCisKKyNkZWZpbmUgU05fT0NTUF9zaWduCQkiT0NTUFNpZ25pbmciCisjZGVmaW5lIExOX09DU1Bfc2lnbgkJIk9DU1AgU2lnbmluZyIKKyNkZWZpbmUgTklEX09DU1Bfc2lnbgkJMTgwCisjZGVmaW5lIE9CSl9PQ1NQX3NpZ24JCU9CSl9pZF9rcCw5TAorCisjZGVmaW5lIFNOX2R2Y3MJCSJEVkNTIgorI2RlZmluZSBMTl9kdmNzCQkiZHZjcyIKKyNkZWZpbmUgTklEX2R2Y3MJCTI5NworI2RlZmluZSBPQkpfZHZjcwkJT0JKX2lkX2twLDEwTAorCisjZGVmaW5lIFNOX2lkX2l0X2NhUHJvdEVuY0NlcnQJCSJpZC1pdC1jYVByb3RFbmNDZXJ0IgorI2RlZmluZSBOSURfaWRfaXRfY2FQcm90RW5jQ2VydAkJMjk4CisjZGVmaW5lIE9CSl9pZF9pdF9jYVByb3RFbmNDZXJ0CQlPQkpfaWRfaXQsMUwKKworI2RlZmluZSBTTl9pZF9pdF9zaWduS2V5UGFpclR5cGVzCQkiaWQtaXQtc2lnbktleVBhaXJUeXBlcyIKKyNkZWZpbmUgTklEX2lkX2l0X3NpZ25LZXlQYWlyVHlwZXMJCTI5OQorI2RlZmluZSBPQkpfaWRfaXRfc2lnbktleVBhaXJUeXBlcwkJT0JKX2lkX2l0LDJMCisKKyNkZWZpbmUgU05faWRfaXRfZW5jS2V5UGFpclR5cGVzCQkiaWQtaXQtZW5jS2V5UGFpclR5cGVzIgorI2RlZmluZSBOSURfaWRfaXRfZW5jS2V5UGFpclR5cGVzCQkzMDAKKyNkZWZpbmUgT0JKX2lkX2l0X2VuY0tleVBhaXJUeXBlcwkJT0JKX2lkX2l0LDNMCisKKyNkZWZpbmUgU05faWRfaXRfcHJlZmVycmVkU3ltbUFsZwkJImlkLWl0LXByZWZlcnJlZFN5bW1BbGciCisjZGVmaW5lIE5JRF9pZF9pdF9wcmVmZXJyZWRTeW1tQWxnCQkzMDEKKyNkZWZpbmUgT0JKX2lkX2l0X3ByZWZlcnJlZFN5bW1BbGcJCU9CSl9pZF9pdCw0TAorCisjZGVmaW5lIFNOX2lkX2l0X2NhS2V5VXBkYXRlSW5mbwkJImlkLWl0LWNhS2V5VXBkYXRlSW5mbyIKKyNkZWZpbmUgTklEX2lkX2l0X2NhS2V5VXBkYXRlSW5mbwkJMzAyCisjZGVmaW5lIE9CSl9pZF9pdF9jYUtleVVwZGF0ZUluZm8JCU9CSl9pZF9pdCw1TAorCisjZGVmaW5lIFNOX2lkX2l0X2N1cnJlbnRDUkwJCSJpZC1pdC1jdXJyZW50Q1JMIgorI2RlZmluZSBOSURfaWRfaXRfY3VycmVudENSTAkJMzAzCisjZGVmaW5lIE9CSl9pZF9pdF9jdXJyZW50Q1JMCQlPQkpfaWRfaXQsNkwKKworI2RlZmluZSBTTl9pZF9pdF91bnN1cHBvcnRlZE9JRHMJCSJpZC1pdC11bnN1cHBvcnRlZE9JRHMiCisjZGVmaW5lIE5JRF9pZF9pdF91bnN1cHBvcnRlZE9JRHMJCTMwNAorI2RlZmluZSBPQkpfaWRfaXRfdW5zdXBwb3J0ZWRPSURzCQlPQkpfaWRfaXQsN0wKKworI2RlZmluZSBTTl9pZF9pdF9zdWJzY3JpcHRpb25SZXF1ZXN0CQkiaWQtaXQtc3Vic2NyaXB0aW9uUmVxdWVzdCIKKyNkZWZpbmUgTklEX2lkX2l0X3N1YnNjcmlwdGlvblJlcXVlc3QJCTMwNQorI2RlZmluZSBPQkpfaWRfaXRfc3Vic2NyaXB0aW9uUmVxdWVzdAkJT0JKX2lkX2l0LDhMCisKKyNkZWZpbmUgU05faWRfaXRfc3Vic2NyaXB0aW9uUmVzcG9uc2UJCSJpZC1pdC1zdWJzY3JpcHRpb25SZXNwb25zZSIKKyNkZWZpbmUgTklEX2lkX2l0X3N1YnNjcmlwdGlvblJlc3BvbnNlCQkzMDYKKyNkZWZpbmUgT0JKX2lkX2l0X3N1YnNjcmlwdGlvblJlc3BvbnNlCQlPQkpfaWRfaXQsOUwKKworI2RlZmluZSBTTl9pZF9pdF9rZXlQYWlyUGFyYW1SZXEJCSJpZC1pdC1rZXlQYWlyUGFyYW1SZXEiCisjZGVmaW5lIE5JRF9pZF9pdF9rZXlQYWlyUGFyYW1SZXEJCTMwNworI2RlZmluZSBPQkpfaWRfaXRfa2V5UGFpclBhcmFtUmVxCQlPQkpfaWRfaXQsMTBMCisKKyNkZWZpbmUgU05faWRfaXRfa2V5UGFpclBhcmFtUmVwCQkiaWQtaXQta2V5UGFpclBhcmFtUmVwIgorI2RlZmluZSBOSURfaWRfaXRfa2V5UGFpclBhcmFtUmVwCQkzMDgKKyNkZWZpbmUgT0JKX2lkX2l0X2tleVBhaXJQYXJhbVJlcAkJT0JKX2lkX2l0LDExTAorCisjZGVmaW5lIFNOX2lkX2l0X3JldlBhc3NwaHJhc2UJCSJpZC1pdC1yZXZQYXNzcGhyYXNlIgorI2RlZmluZSBOSURfaWRfaXRfcmV2UGFzc3BocmFzZQkJMzA5CisjZGVmaW5lIE9CSl9pZF9pdF9yZXZQYXNzcGhyYXNlCQlPQkpfaWRfaXQsMTJMCisKKyNkZWZpbmUgU05faWRfaXRfaW1wbGljaXRDb25maXJtCQkiaWQtaXQtaW1wbGljaXRDb25maXJtIgorI2RlZmluZSBOSURfaWRfaXRfaW1wbGljaXRDb25maXJtCQkzMTAKKyNkZWZpbmUgT0JKX2lkX2l0X2ltcGxpY2l0Q29uZmlybQkJT0JKX2lkX2l0LDEzTAorCisjZGVmaW5lIFNOX2lkX2l0X2NvbmZpcm1XYWl0VGltZQkJImlkLWl0LWNvbmZpcm1XYWl0VGltZSIKKyNkZWZpbmUgTklEX2lkX2l0X2NvbmZpcm1XYWl0VGltZQkJMzExCisjZGVmaW5lIE9CSl9pZF9pdF9jb25maXJtV2FpdFRpbWUJCU9CSl9pZF9pdCwxNEwKKworI2RlZmluZSBTTl9pZF9pdF9vcmlnUEtJTWVzc2FnZQkJImlkLWl0LW9yaWdQS0lNZXNzYWdlIgorI2RlZmluZSBOSURfaWRfaXRfb3JpZ1BLSU1lc3NhZ2UJCTMxMgorI2RlZmluZSBPQkpfaWRfaXRfb3JpZ1BLSU1lc3NhZ2UJCU9CSl9pZF9pdCwxNUwKKworI2RlZmluZSBTTl9pZF9pdF9zdXBwTGFuZ1RhZ3MJCSJpZC1pdC1zdXBwTGFuZ1RhZ3MiCisjZGVmaW5lIE5JRF9pZF9pdF9zdXBwTGFuZ1RhZ3MJCTc4NAorI2RlZmluZSBPQkpfaWRfaXRfc3VwcExhbmdUYWdzCQlPQkpfaWRfaXQsMTZMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybAkJImlkLXJlZ0N0cmwiCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsCQkzMTMKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmwJCU9CSl9pZF9wa2lwLDFMCisKKyNkZWZpbmUgU05faWRfcmVnSW5mbwkJImlkLXJlZ0luZm8iCisjZGVmaW5lIE5JRF9pZF9yZWdJbmZvCQkzMTQKKyNkZWZpbmUgT0JKX2lkX3JlZ0luZm8JCU9CSl9pZF9wa2lwLDJMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9yZWdUb2tlbgkJImlkLXJlZ0N0cmwtcmVnVG9rZW4iCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsX3JlZ1Rva2VuCQkzMTUKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfcmVnVG9rZW4JCU9CSl9pZF9yZWdDdHJsLDFMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9hdXRoZW50aWNhdG9yCQkiaWQtcmVnQ3RybC1hdXRoZW50aWNhdG9yIgorI2RlZmluZSBOSURfaWRfcmVnQ3RybF9hdXRoZW50aWNhdG9yCQkzMTYKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfYXV0aGVudGljYXRvcgkJT0JKX2lkX3JlZ0N0cmwsMkwKKworI2RlZmluZSBTTl9pZF9yZWdDdHJsX3BraVB1YmxpY2F0aW9uSW5mbwkJImlkLXJlZ0N0cmwtcGtpUHVibGljYXRpb25JbmZvIgorI2RlZmluZSBOSURfaWRfcmVnQ3RybF9wa2lQdWJsaWNhdGlvbkluZm8JCTMxNworI2RlZmluZSBPQkpfaWRfcmVnQ3RybF9wa2lQdWJsaWNhdGlvbkluZm8JCU9CSl9pZF9yZWdDdHJsLDNMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9wa2lBcmNoaXZlT3B0aW9ucwkJImlkLXJlZ0N0cmwtcGtpQXJjaGl2ZU9wdGlvbnMiCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsX3BraUFyY2hpdmVPcHRpb25zCQkzMTgKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfcGtpQXJjaGl2ZU9wdGlvbnMJCU9CSl9pZF9yZWdDdHJsLDRMCisKKyNkZWZpbmUgU05faWRfcmVnQ3RybF9vbGRDZXJ0SUQJCSJpZC1yZWdDdHJsLW9sZENlcnRJRCIKKyNkZWZpbmUgTklEX2lkX3JlZ0N0cmxfb2xkQ2VydElECQkzMTkKKyNkZWZpbmUgT0JKX2lkX3JlZ0N0cmxfb2xkQ2VydElECQlPQkpfaWRfcmVnQ3RybCw1TAorCisjZGVmaW5lIFNOX2lkX3JlZ0N0cmxfcHJvdG9jb2xFbmNyS2V5CQkiaWQtcmVnQ3RybC1wcm90b2NvbEVuY3JLZXkiCisjZGVmaW5lIE5JRF9pZF9yZWdDdHJsX3Byb3RvY29sRW5jcktleQkJMzIwCisjZGVmaW5lIE9CSl9pZF9yZWdDdHJsX3Byb3RvY29sRW5jcktleQkJT0JKX2lkX3JlZ0N0cmwsNkwKKworI2RlZmluZSBTTl9pZF9yZWdJbmZvX3V0ZjhQYWlycwkJImlkLXJlZ0luZm8tdXRmOFBhaXJzIgorI2RlZmluZSBOSURfaWRfcmVnSW5mb191dGY4UGFpcnMJCTMyMQorI2RlZmluZSBPQkpfaWRfcmVnSW5mb191dGY4UGFpcnMJCU9CSl9pZF9yZWdJbmZvLDFMCisKKyNkZWZpbmUgU05faWRfcmVnSW5mb19jZXJ0UmVxCQkiaWQtcmVnSW5mby1jZXJ0UmVxIgorI2RlZmluZSBOSURfaWRfcmVnSW5mb19jZXJ0UmVxCQkzMjIKKyNkZWZpbmUgT0JKX2lkX3JlZ0luZm9fY2VydFJlcQkJT0JKX2lkX3JlZ0luZm8sMkwKKworI2RlZmluZSBTTl9pZF9hbGdfZGVzNDAJCSJpZC1hbGctZGVzNDAiCisjZGVmaW5lIE5JRF9pZF9hbGdfZGVzNDAJCTMyMworI2RlZmluZSBPQkpfaWRfYWxnX2RlczQwCQlPQkpfaWRfYWxnLDFMCisKKyNkZWZpbmUgU05faWRfYWxnX25vU2lnbmF0dXJlCQkiaWQtYWxnLW5vU2lnbmF0dXJlIgorI2RlZmluZSBOSURfaWRfYWxnX25vU2lnbmF0dXJlCQkzMjQKKyNkZWZpbmUgT0JKX2lkX2FsZ19ub1NpZ25hdHVyZQkJT0JKX2lkX2FsZywyTAorCisjZGVmaW5lIFNOX2lkX2FsZ19kaF9zaWdfaG1hY19zaGExCQkiaWQtYWxnLWRoLXNpZy1obWFjLXNoYTEiCisjZGVmaW5lIE5JRF9pZF9hbGdfZGhfc2lnX2htYWNfc2hhMQkJMzI1CisjZGVmaW5lIE9CSl9pZF9hbGdfZGhfc2lnX2htYWNfc2hhMQkJT0JKX2lkX2FsZywzTAorCisjZGVmaW5lIFNOX2lkX2FsZ19kaF9wb3AJCSJpZC1hbGctZGgtcG9wIgorI2RlZmluZSBOSURfaWRfYWxnX2RoX3BvcAkJMzI2CisjZGVmaW5lIE9CSl9pZF9hbGdfZGhfcG9wCQlPQkpfaWRfYWxnLDRMCisKKyNkZWZpbmUgU05faWRfY21jX3N0YXR1c0luZm8JCSJpZC1jbWMtc3RhdHVzSW5mbyIKKyNkZWZpbmUgTklEX2lkX2NtY19zdGF0dXNJbmZvCQkzMjcKKyNkZWZpbmUgT0JKX2lkX2NtY19zdGF0dXNJbmZvCQlPQkpfaWRfY21jLDFMCisKKyNkZWZpbmUgU05faWRfY21jX2lkZW50aWZpY2F0aW9uCQkiaWQtY21jLWlkZW50aWZpY2F0aW9uIgorI2RlZmluZSBOSURfaWRfY21jX2lkZW50aWZpY2F0aW9uCQkzMjgKKyNkZWZpbmUgT0JKX2lkX2NtY19pZGVudGlmaWNhdGlvbgkJT0JKX2lkX2NtYywyTAorCisjZGVmaW5lIFNOX2lkX2NtY19pZGVudGl0eVByb29mCQkiaWQtY21jLWlkZW50aXR5UHJvb2YiCisjZGVmaW5lIE5JRF9pZF9jbWNfaWRlbnRpdHlQcm9vZgkJMzI5CisjZGVmaW5lIE9CSl9pZF9jbWNfaWRlbnRpdHlQcm9vZgkJT0JKX2lkX2NtYywzTAorCisjZGVmaW5lIFNOX2lkX2NtY19kYXRhUmV0dXJuCQkiaWQtY21jLWRhdGFSZXR1cm4iCisjZGVmaW5lIE5JRF9pZF9jbWNfZGF0YVJldHVybgkJMzMwCisjZGVmaW5lIE9CSl9pZF9jbWNfZGF0YVJldHVybgkJT0JKX2lkX2NtYyw0TAorCisjZGVmaW5lIFNOX2lkX2NtY190cmFuc2FjdGlvbklkCQkiaWQtY21jLXRyYW5zYWN0aW9uSWQiCisjZGVmaW5lIE5JRF9pZF9jbWNfdHJhbnNhY3Rpb25JZAkJMzMxCisjZGVmaW5lIE9CSl9pZF9jbWNfdHJhbnNhY3Rpb25JZAkJT0JKX2lkX2NtYyw1TAorCisjZGVmaW5lIFNOX2lkX2NtY19zZW5kZXJOb25jZQkJImlkLWNtYy1zZW5kZXJOb25jZSIKKyNkZWZpbmUgTklEX2lkX2NtY19zZW5kZXJOb25jZQkJMzMyCisjZGVmaW5lIE9CSl9pZF9jbWNfc2VuZGVyTm9uY2UJCU9CSl9pZF9jbWMsNkwKKworI2RlZmluZSBTTl9pZF9jbWNfcmVjaXBpZW50Tm9uY2UJCSJpZC1jbWMtcmVjaXBpZW50Tm9uY2UiCisjZGVmaW5lIE5JRF9pZF9jbWNfcmVjaXBpZW50Tm9uY2UJCTMzMworI2RlZmluZSBPQkpfaWRfY21jX3JlY2lwaWVudE5vbmNlCQlPQkpfaWRfY21jLDdMCisKKyNkZWZpbmUgU05faWRfY21jX2FkZEV4dGVuc2lvbnMJCSJpZC1jbWMtYWRkRXh0ZW5zaW9ucyIKKyNkZWZpbmUgTklEX2lkX2NtY19hZGRFeHRlbnNpb25zCQkzMzQKKyNkZWZpbmUgT0JKX2lkX2NtY19hZGRFeHRlbnNpb25zCQlPQkpfaWRfY21jLDhMCisKKyNkZWZpbmUgU05faWRfY21jX2VuY3J5cHRlZFBPUAkJImlkLWNtYy1lbmNyeXB0ZWRQT1AiCisjZGVmaW5lIE5JRF9pZF9jbWNfZW5jcnlwdGVkUE9QCQkzMzUKKyNkZWZpbmUgT0JKX2lkX2NtY19lbmNyeXB0ZWRQT1AJCU9CSl9pZF9jbWMsOUwKKworI2RlZmluZSBTTl9pZF9jbWNfZGVjcnlwdGVkUE9QCQkiaWQtY21jLWRlY3J5cHRlZFBPUCIKKyNkZWZpbmUgTklEX2lkX2NtY19kZWNyeXB0ZWRQT1AJCTMzNgorI2RlZmluZSBPQkpfaWRfY21jX2RlY3J5cHRlZFBPUAkJT0JKX2lkX2NtYywxMEwKKworI2RlZmluZSBTTl9pZF9jbWNfbHJhUE9QV2l0bmVzcwkJImlkLWNtYy1scmFQT1BXaXRuZXNzIgorI2RlZmluZSBOSURfaWRfY21jX2xyYVBPUFdpdG5lc3MJCTMzNworI2RlZmluZSBPQkpfaWRfY21jX2xyYVBPUFdpdG5lc3MJCU9CSl9pZF9jbWMsMTFMCisKKyNkZWZpbmUgU05faWRfY21jX2dldENlcnQJCSJpZC1jbWMtZ2V0Q2VydCIKKyNkZWZpbmUgTklEX2lkX2NtY19nZXRDZXJ0CQkzMzgKKyNkZWZpbmUgT0JKX2lkX2NtY19nZXRDZXJ0CQlPQkpfaWRfY21jLDE1TAorCisjZGVmaW5lIFNOX2lkX2NtY19nZXRDUkwJCSJpZC1jbWMtZ2V0Q1JMIgorI2RlZmluZSBOSURfaWRfY21jX2dldENSTAkJMzM5CisjZGVmaW5lIE9CSl9pZF9jbWNfZ2V0Q1JMCQlPQkpfaWRfY21jLDE2TAorCisjZGVmaW5lIFNOX2lkX2NtY19yZXZva2VSZXF1ZXN0CQkiaWQtY21jLXJldm9rZVJlcXVlc3QiCisjZGVmaW5lIE5JRF9pZF9jbWNfcmV2b2tlUmVxdWVzdAkJMzQwCisjZGVmaW5lIE9CSl9pZF9jbWNfcmV2b2tlUmVxdWVzdAkJT0JKX2lkX2NtYywxN0wKKworI2RlZmluZSBTTl9pZF9jbWNfcmVnSW5mbwkJImlkLWNtYy1yZWdJbmZvIgorI2RlZmluZSBOSURfaWRfY21jX3JlZ0luZm8JCTM0MQorI2RlZmluZSBPQkpfaWRfY21jX3JlZ0luZm8JCU9CSl9pZF9jbWMsMThMCisKKyNkZWZpbmUgU05faWRfY21jX3Jlc3BvbnNlSW5mbwkJImlkLWNtYy1yZXNwb25zZUluZm8iCisjZGVmaW5lIE5JRF9pZF9jbWNfcmVzcG9uc2VJbmZvCQkzNDIKKyNkZWZpbmUgT0JKX2lkX2NtY19yZXNwb25zZUluZm8JCU9CSl9pZF9jbWMsMTlMCisKKyNkZWZpbmUgU05faWRfY21jX3F1ZXJ5UGVuZGluZwkJImlkLWNtYy1xdWVyeVBlbmRpbmciCisjZGVmaW5lIE5JRF9pZF9jbWNfcXVlcnlQZW5kaW5nCQkzNDMKKyNkZWZpbmUgT0JKX2lkX2NtY19xdWVyeVBlbmRpbmcJCU9CSl9pZF9jbWMsMjFMCisKKyNkZWZpbmUgU05faWRfY21jX3BvcExpbmtSYW5kb20JCSJpZC1jbWMtcG9wTGlua1JhbmRvbSIKKyNkZWZpbmUgTklEX2lkX2NtY19wb3BMaW5rUmFuZG9tCQkzNDQKKyNkZWZpbmUgT0JKX2lkX2NtY19wb3BMaW5rUmFuZG9tCQlPQkpfaWRfY21jLDIyTAorCisjZGVmaW5lIFNOX2lkX2NtY19wb3BMaW5rV2l0bmVzcwkJImlkLWNtYy1wb3BMaW5rV2l0bmVzcyIKKyNkZWZpbmUgTklEX2lkX2NtY19wb3BMaW5rV2l0bmVzcwkJMzQ1CisjZGVmaW5lIE9CSl9pZF9jbWNfcG9wTGlua1dpdG5lc3MJCU9CSl9pZF9jbWMsMjNMCisKKyNkZWZpbmUgU05faWRfY21jX2NvbmZpcm1DZXJ0QWNjZXB0YW5jZQkJImlkLWNtYy1jb25maXJtQ2VydEFjY2VwdGFuY2UiCisjZGVmaW5lIE5JRF9pZF9jbWNfY29uZmlybUNlcnRBY2NlcHRhbmNlCQkzNDYKKyNkZWZpbmUgT0JKX2lkX2NtY19jb25maXJtQ2VydEFjY2VwdGFuY2UJCU9CSl9pZF9jbWMsMjRMCisKKyNkZWZpbmUgU05faWRfb25fcGVyc29uYWxEYXRhCQkiaWQtb24tcGVyc29uYWxEYXRhIgorI2RlZmluZSBOSURfaWRfb25fcGVyc29uYWxEYXRhCQkzNDcKKyNkZWZpbmUgT0JKX2lkX29uX3BlcnNvbmFsRGF0YQkJT0JKX2lkX29uLDFMCisKKyNkZWZpbmUgU05faWRfb25fcGVybWFuZW50SWRlbnRpZmllcgkJImlkLW9uLXBlcm1hbmVudElkZW50aWZpZXIiCisjZGVmaW5lIExOX2lkX29uX3Blcm1hbmVudElkZW50aWZpZXIJCSJQZXJtYW5lbnQgSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX2lkX29uX3Blcm1hbmVudElkZW50aWZpZXIJCTg1OAorI2RlZmluZSBPQkpfaWRfb25fcGVybWFuZW50SWRlbnRpZmllcgkJT0JKX2lkX29uLDNMCisKKyNkZWZpbmUgU05faWRfcGRhX2RhdGVPZkJpcnRoCQkiaWQtcGRhLWRhdGVPZkJpcnRoIgorI2RlZmluZSBOSURfaWRfcGRhX2RhdGVPZkJpcnRoCQkzNDgKKyNkZWZpbmUgT0JKX2lkX3BkYV9kYXRlT2ZCaXJ0aAkJT0JKX2lkX3BkYSwxTAorCisjZGVmaW5lIFNOX2lkX3BkYV9wbGFjZU9mQmlydGgJCSJpZC1wZGEtcGxhY2VPZkJpcnRoIgorI2RlZmluZSBOSURfaWRfcGRhX3BsYWNlT2ZCaXJ0aAkJMzQ5CisjZGVmaW5lIE9CSl9pZF9wZGFfcGxhY2VPZkJpcnRoCQlPQkpfaWRfcGRhLDJMCisKKyNkZWZpbmUgU05faWRfcGRhX2dlbmRlcgkJImlkLXBkYS1nZW5kZXIiCisjZGVmaW5lIE5JRF9pZF9wZGFfZ2VuZGVyCQkzNTEKKyNkZWZpbmUgT0JKX2lkX3BkYV9nZW5kZXIJCU9CSl9pZF9wZGEsM0wKKworI2RlZmluZSBTTl9pZF9wZGFfY291bnRyeU9mQ2l0aXplbnNoaXAJCSJpZC1wZGEtY291bnRyeU9mQ2l0aXplbnNoaXAiCisjZGVmaW5lIE5JRF9pZF9wZGFfY291bnRyeU9mQ2l0aXplbnNoaXAJCTM1MgorI2RlZmluZSBPQkpfaWRfcGRhX2NvdW50cnlPZkNpdGl6ZW5zaGlwCQlPQkpfaWRfcGRhLDRMCisKKyNkZWZpbmUgU05faWRfcGRhX2NvdW50cnlPZlJlc2lkZW5jZQkJImlkLXBkYS1jb3VudHJ5T2ZSZXNpZGVuY2UiCisjZGVmaW5lIE5JRF9pZF9wZGFfY291bnRyeU9mUmVzaWRlbmNlCQkzNTMKKyNkZWZpbmUgT0JKX2lkX3BkYV9jb3VudHJ5T2ZSZXNpZGVuY2UJCU9CSl9pZF9wZGEsNUwKKworI2RlZmluZSBTTl9pZF9hY2FfYXV0aGVudGljYXRpb25JbmZvCQkiaWQtYWNhLWF1dGhlbnRpY2F0aW9uSW5mbyIKKyNkZWZpbmUgTklEX2lkX2FjYV9hdXRoZW50aWNhdGlvbkluZm8JCTM1NAorI2RlZmluZSBPQkpfaWRfYWNhX2F1dGhlbnRpY2F0aW9uSW5mbwkJT0JKX2lkX2FjYSwxTAorCisjZGVmaW5lIFNOX2lkX2FjYV9hY2Nlc3NJZGVudGl0eQkJImlkLWFjYS1hY2Nlc3NJZGVudGl0eSIKKyNkZWZpbmUgTklEX2lkX2FjYV9hY2Nlc3NJZGVudGl0eQkJMzU1CisjZGVmaW5lIE9CSl9pZF9hY2FfYWNjZXNzSWRlbnRpdHkJCU9CSl9pZF9hY2EsMkwKKworI2RlZmluZSBTTl9pZF9hY2FfY2hhcmdpbmdJZGVudGl0eQkJImlkLWFjYS1jaGFyZ2luZ0lkZW50aXR5IgorI2RlZmluZSBOSURfaWRfYWNhX2NoYXJnaW5nSWRlbnRpdHkJCTM1NgorI2RlZmluZSBPQkpfaWRfYWNhX2NoYXJnaW5nSWRlbnRpdHkJCU9CSl9pZF9hY2EsM0wKKworI2RlZmluZSBTTl9pZF9hY2FfZ3JvdXAJCSJpZC1hY2EtZ3JvdXAiCisjZGVmaW5lIE5JRF9pZF9hY2FfZ3JvdXAJCTM1NworI2RlZmluZSBPQkpfaWRfYWNhX2dyb3VwCQlPQkpfaWRfYWNhLDRMCisKKyNkZWZpbmUgU05faWRfYWNhX3JvbGUJCSJpZC1hY2Etcm9sZSIKKyNkZWZpbmUgTklEX2lkX2FjYV9yb2xlCQkzNTgKKyNkZWZpbmUgT0JKX2lkX2FjYV9yb2xlCQlPQkpfaWRfYWNhLDVMCisKKyNkZWZpbmUgU05faWRfYWNhX2VuY0F0dHJzCQkiaWQtYWNhLWVuY0F0dHJzIgorI2RlZmluZSBOSURfaWRfYWNhX2VuY0F0dHJzCQkzOTkKKyNkZWZpbmUgT0JKX2lkX2FjYV9lbmNBdHRycwkJT0JKX2lkX2FjYSw2TAorCisjZGVmaW5lIFNOX2lkX3Fjc19wa2l4UUNTeW50YXhfdjEJCSJpZC1xY3MtcGtpeFFDU3ludGF4LXYxIgorI2RlZmluZSBOSURfaWRfcWNzX3BraXhRQ1N5bnRheF92MQkJMzU5CisjZGVmaW5lIE9CSl9pZF9xY3NfcGtpeFFDU3ludGF4X3YxCQlPQkpfaWRfcWNzLDFMCisKKyNkZWZpbmUgU05faWRfY2N0X2NycwkJImlkLWNjdC1jcnMiCisjZGVmaW5lIE5JRF9pZF9jY3RfY3JzCQkzNjAKKyNkZWZpbmUgT0JKX2lkX2NjdF9jcnMJCU9CSl9pZF9jY3QsMUwKKworI2RlZmluZSBTTl9pZF9jY3RfUEtJRGF0YQkJImlkLWNjdC1QS0lEYXRhIgorI2RlZmluZSBOSURfaWRfY2N0X1BLSURhdGEJCTM2MQorI2RlZmluZSBPQkpfaWRfY2N0X1BLSURhdGEJCU9CSl9pZF9jY3QsMkwKKworI2RlZmluZSBTTl9pZF9jY3RfUEtJUmVzcG9uc2UJCSJpZC1jY3QtUEtJUmVzcG9uc2UiCisjZGVmaW5lIE5JRF9pZF9jY3RfUEtJUmVzcG9uc2UJCTM2MgorI2RlZmluZSBPQkpfaWRfY2N0X1BLSVJlc3BvbnNlCQlPQkpfaWRfY2N0LDNMCisKKyNkZWZpbmUgU05faWRfcHBsX2FueUxhbmd1YWdlCQkiaWQtcHBsLWFueUxhbmd1YWdlIgorI2RlZmluZSBMTl9pZF9wcGxfYW55TGFuZ3VhZ2UJCSJBbnkgbGFuZ3VhZ2UiCisjZGVmaW5lIE5JRF9pZF9wcGxfYW55TGFuZ3VhZ2UJCTY2NAorI2RlZmluZSBPQkpfaWRfcHBsX2FueUxhbmd1YWdlCQlPQkpfaWRfcHBsLDBMCisKKyNkZWZpbmUgU05faWRfcHBsX2luaGVyaXRBbGwJCSJpZC1wcGwtaW5oZXJpdEFsbCIKKyNkZWZpbmUgTE5faWRfcHBsX2luaGVyaXRBbGwJCSJJbmhlcml0IGFsbCIKKyNkZWZpbmUgTklEX2lkX3BwbF9pbmhlcml0QWxsCQk2NjUKKyNkZWZpbmUgT0JKX2lkX3BwbF9pbmhlcml0QWxsCQlPQkpfaWRfcHBsLDFMCisKKyNkZWZpbmUgU05fSW5kZXBlbmRlbnQJCSJpZC1wcGwtaW5kZXBlbmRlbnQiCisjZGVmaW5lIExOX0luZGVwZW5kZW50CQkiSW5kZXBlbmRlbnQiCisjZGVmaW5lIE5JRF9JbmRlcGVuZGVudAkJNjY3CisjZGVmaW5lIE9CSl9JbmRlcGVuZGVudAkJT0JKX2lkX3BwbCwyTAorCisjZGVmaW5lIFNOX2FkX09DU1AJCSJPQ1NQIgorI2RlZmluZSBMTl9hZF9PQ1NQCQkiT0NTUCIKKyNkZWZpbmUgTklEX2FkX09DU1AJCTE3OAorI2RlZmluZSBPQkpfYWRfT0NTUAkJT0JKX2lkX2FkLDFMCisKKyNkZWZpbmUgU05fYWRfY2FfaXNzdWVycwkJImNhSXNzdWVycyIKKyNkZWZpbmUgTE5fYWRfY2FfaXNzdWVycwkJIkNBIElzc3VlcnMiCisjZGVmaW5lIE5JRF9hZF9jYV9pc3N1ZXJzCQkxNzkKKyNkZWZpbmUgT0JKX2FkX2NhX2lzc3VlcnMJCU9CSl9pZF9hZCwyTAorCisjZGVmaW5lIFNOX2FkX3RpbWVTdGFtcGluZwkJImFkX3RpbWVzdGFtcGluZyIKKyNkZWZpbmUgTE5fYWRfdGltZVN0YW1waW5nCQkiQUQgVGltZSBTdGFtcGluZyIKKyNkZWZpbmUgTklEX2FkX3RpbWVTdGFtcGluZwkJMzYzCisjZGVmaW5lIE9CSl9hZF90aW1lU3RhbXBpbmcJCU9CSl9pZF9hZCwzTAorCisjZGVmaW5lIFNOX2FkX2R2Y3MJCSJBRF9EVkNTIgorI2RlZmluZSBMTl9hZF9kdmNzCQkiYWQgZHZjcyIKKyNkZWZpbmUgTklEX2FkX2R2Y3MJCTM2NAorI2RlZmluZSBPQkpfYWRfZHZjcwkJT0JKX2lkX2FkLDRMCisKKyNkZWZpbmUgU05fY2FSZXBvc2l0b3J5CQkiY2FSZXBvc2l0b3J5IgorI2RlZmluZSBMTl9jYVJlcG9zaXRvcnkJCSJDQSBSZXBvc2l0b3J5IgorI2RlZmluZSBOSURfY2FSZXBvc2l0b3J5CQk3ODUKKyNkZWZpbmUgT0JKX2NhUmVwb3NpdG9yeQkJT0JKX2lkX2FkLDVMCisKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUAkJT0JKX2FkX09DU1AKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfYmFzaWMJCSJiYXNpY09DU1BSZXNwb25zZSIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX2Jhc2ljCQkiQmFzaWMgT0NTUCBSZXNwb25zZSIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9iYXNpYwkJMzY1CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfYmFzaWMJCU9CSl9pZF9wa2l4X09DU1AsMUwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfTm9uY2UJCSJOb25jZSIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX05vbmNlCQkiT0NTUCBOb25jZSIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9Ob25jZQkJMzY2CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfTm9uY2UJCU9CSl9pZF9wa2l4X09DU1AsMkwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfQ3JsSUQJCSJDcmxJRCIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX0NybElECQkiT0NTUCBDUkwgSUQiCisjZGVmaW5lIE5JRF9pZF9wa2l4X09DU1BfQ3JsSUQJCTM2NworI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQX0NybElECQlPQkpfaWRfcGtpeF9PQ1NQLDNMCisKKyNkZWZpbmUgU05faWRfcGtpeF9PQ1NQX2FjY2VwdGFibGVSZXNwb25zZXMJCSJhY2NlcHRhYmxlUmVzcG9uc2VzIgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcwkJIkFjY2VwdGFibGUgT0NTUCBSZXNwb25zZXMiCisjZGVmaW5lIE5JRF9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcwkJMzY4CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfYWNjZXB0YWJsZVJlc3BvbnNlcwkJT0JKX2lkX3BraXhfT0NTUCw0TAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9ub0NoZWNrCQkibm9DaGVjayIKKyNkZWZpbmUgTE5faWRfcGtpeF9PQ1NQX25vQ2hlY2sJCSJPQ1NQIE5vIENoZWNrIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX25vQ2hlY2sJCTM2OQorI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQX25vQ2hlY2sJCU9CSl9pZF9wa2l4X09DU1AsNUwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfYXJjaGl2ZUN1dG9mZgkJImFyY2hpdmVDdXRvZmYiCisjZGVmaW5lIExOX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmCQkiT0NTUCBBcmNoaXZlIEN1dG9mZiIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmCQkzNzAKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9hcmNoaXZlQ3V0b2ZmCQlPQkpfaWRfcGtpeF9PQ1NQLDZMCisKKyNkZWZpbmUgU05faWRfcGtpeF9PQ1NQX3NlcnZpY2VMb2NhdG9yCQkic2VydmljZUxvY2F0b3IiCisjZGVmaW5lIExOX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvcgkJIk9DU1AgU2VydmljZSBMb2NhdG9yIgorI2RlZmluZSBOSURfaWRfcGtpeF9PQ1NQX3NlcnZpY2VMb2NhdG9yCQkzNzEKKyNkZWZpbmUgT0JKX2lkX3BraXhfT0NTUF9zZXJ2aWNlTG9jYXRvcgkJT0JKX2lkX3BraXhfT0NTUCw3TAorCisjZGVmaW5lIFNOX2lkX3BraXhfT0NTUF9leHRlbmRlZFN0YXR1cwkJImV4dGVuZGVkU3RhdHVzIgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMJCSJFeHRlbmRlZCBPQ1NQIFN0YXR1cyIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF9leHRlbmRlZFN0YXR1cwkJMzcyCisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfZXh0ZW5kZWRTdGF0dXMJCU9CSl9pZF9wa2l4X09DU1AsOEwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfdmFsaWQJCSJ2YWxpZCIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF92YWxpZAkJMzczCisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfdmFsaWQJCU9CSl9pZF9wa2l4X09DU1AsOUwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfcGF0aAkJInBhdGgiCisjZGVmaW5lIE5JRF9pZF9wa2l4X09DU1BfcGF0aAkJMzc0CisjZGVmaW5lIE9CSl9pZF9wa2l4X09DU1BfcGF0aAkJT0JKX2lkX3BraXhfT0NTUCwxMEwKKworI2RlZmluZSBTTl9pZF9wa2l4X09DU1BfdHJ1c3RSb290CQkidHJ1c3RSb290IgorI2RlZmluZSBMTl9pZF9wa2l4X09DU1BfdHJ1c3RSb290CQkiVHJ1c3QgUm9vdCIKKyNkZWZpbmUgTklEX2lkX3BraXhfT0NTUF90cnVzdFJvb3QJCTM3NQorI2RlZmluZSBPQkpfaWRfcGtpeF9PQ1NQX3RydXN0Um9vdAkJT0JKX2lkX3BraXhfT0NTUCwxMUwKKworI2RlZmluZSBTTl9hbGdvcml0aG0JCSJhbGdvcml0aG0iCisjZGVmaW5lIExOX2FsZ29yaXRobQkJImFsZ29yaXRobSIKKyNkZWZpbmUgTklEX2FsZ29yaXRobQkJMzc2CisjZGVmaW5lIE9CSl9hbGdvcml0aG0JCTFMLDNMLDE0TCwzTCwyTAorCisjZGVmaW5lIFNOX21kNVdpdGhSU0EJCSJSU0EtTlAtTUQ1IgorI2RlZmluZSBMTl9tZDVXaXRoUlNBCQkibWQ1V2l0aFJTQSIKKyNkZWZpbmUgTklEX21kNVdpdGhSU0EJCTEwNAorI2RlZmluZSBPQkpfbWQ1V2l0aFJTQQkJT0JKX2FsZ29yaXRobSwzTAorCisjZGVmaW5lIFNOX2Rlc19lY2IJCSJERVMtRUNCIgorI2RlZmluZSBMTl9kZXNfZWNiCQkiZGVzLWVjYiIKKyNkZWZpbmUgTklEX2Rlc19lY2IJCTI5CisjZGVmaW5lIE9CSl9kZXNfZWNiCQlPQkpfYWxnb3JpdGhtLDZMCisKKyNkZWZpbmUgU05fZGVzX2NiYwkJIkRFUy1DQkMiCisjZGVmaW5lIExOX2Rlc19jYmMJCSJkZXMtY2JjIgorI2RlZmluZSBOSURfZGVzX2NiYwkJMzEKKyNkZWZpbmUgT0JKX2Rlc19jYmMJCU9CSl9hbGdvcml0aG0sN0wKKworI2RlZmluZSBTTl9kZXNfb2ZiNjQJCSJERVMtT0ZCIgorI2RlZmluZSBMTl9kZXNfb2ZiNjQJCSJkZXMtb2ZiIgorI2RlZmluZSBOSURfZGVzX29mYjY0CQk0NQorI2RlZmluZSBPQkpfZGVzX29mYjY0CQlPQkpfYWxnb3JpdGhtLDhMCisKKyNkZWZpbmUgU05fZGVzX2NmYjY0CQkiREVTLUNGQiIKKyNkZWZpbmUgTE5fZGVzX2NmYjY0CQkiZGVzLWNmYiIKKyNkZWZpbmUgTklEX2Rlc19jZmI2NAkJMzAKKyNkZWZpbmUgT0JKX2Rlc19jZmI2NAkJT0JKX2FsZ29yaXRobSw5TAorCisjZGVmaW5lIFNOX3JzYVNpZ25hdHVyZQkJInJzYVNpZ25hdHVyZSIKKyNkZWZpbmUgTklEX3JzYVNpZ25hdHVyZQkJMzc3CisjZGVmaW5lIE9CSl9yc2FTaWduYXR1cmUJCU9CSl9hbGdvcml0aG0sMTFMCisKKyNkZWZpbmUgU05fZHNhXzIJCSJEU0Etb2xkIgorI2RlZmluZSBMTl9kc2FfMgkJImRzYUVuY3J5cHRpb24tb2xkIgorI2RlZmluZSBOSURfZHNhXzIJCTY3CisjZGVmaW5lIE9CSl9kc2FfMgkJT0JKX2FsZ29yaXRobSwxMkwKKworI2RlZmluZSBTTl9kc2FXaXRoU0hBCQkiRFNBLVNIQSIKKyNkZWZpbmUgTE5fZHNhV2l0aFNIQQkJImRzYVdpdGhTSEEiCisjZGVmaW5lIE5JRF9kc2FXaXRoU0hBCQk2NgorI2RlZmluZSBPQkpfZHNhV2l0aFNIQQkJT0JKX2FsZ29yaXRobSwxM0wKKworI2RlZmluZSBTTl9zaGFXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1TSEEiCisjZGVmaW5lIExOX3NoYVdpdGhSU0FFbmNyeXB0aW9uCQkic2hhV2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGFXaXRoUlNBRW5jcnlwdGlvbgkJNDIKKyNkZWZpbmUgT0JKX3NoYVdpdGhSU0FFbmNyeXB0aW9uCQlPQkpfYWxnb3JpdGhtLDE1TAorCisjZGVmaW5lIFNOX2Rlc19lZGVfZWNiCQkiREVTLUVERSIKKyNkZWZpbmUgTE5fZGVzX2VkZV9lY2IJCSJkZXMtZWRlIgorI2RlZmluZSBOSURfZGVzX2VkZV9lY2IJCTMyCisjZGVmaW5lIE9CSl9kZXNfZWRlX2VjYgkJT0JKX2FsZ29yaXRobSwxN0wKKworI2RlZmluZSBTTl9kZXNfZWRlM19lY2IJCSJERVMtRURFMyIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfZWNiCQkiZGVzLWVkZTMiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19lY2IJCTMzCisKKyNkZWZpbmUgU05fZGVzX2VkZV9jYmMJCSJERVMtRURFLUNCQyIKKyNkZWZpbmUgTE5fZGVzX2VkZV9jYmMJCSJkZXMtZWRlLWNiYyIKKyNkZWZpbmUgTklEX2Rlc19lZGVfY2JjCQk0MworCisjZGVmaW5lIFNOX2Rlc19lZGVfY2ZiNjQJCSJERVMtRURFLUNGQiIKKyNkZWZpbmUgTE5fZGVzX2VkZV9jZmI2NAkJImRlcy1lZGUtY2ZiIgorI2RlZmluZSBOSURfZGVzX2VkZV9jZmI2NAkJNjAKKworI2RlZmluZSBTTl9kZXNfZWRlM19jZmI2NAkJIkRFUy1FREUzLUNGQiIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfY2ZiNjQJCSJkZXMtZWRlMy1jZmIiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19jZmI2NAkJNjEKKworI2RlZmluZSBTTl9kZXNfZWRlX29mYjY0CQkiREVTLUVERS1PRkIiCisjZGVmaW5lIExOX2Rlc19lZGVfb2ZiNjQJCSJkZXMtZWRlLW9mYiIKKyNkZWZpbmUgTklEX2Rlc19lZGVfb2ZiNjQJCTYyCisKKyNkZWZpbmUgU05fZGVzX2VkZTNfb2ZiNjQJCSJERVMtRURFMy1PRkIiCisjZGVmaW5lIExOX2Rlc19lZGUzX29mYjY0CQkiZGVzLWVkZTMtb2ZiIgorI2RlZmluZSBOSURfZGVzX2VkZTNfb2ZiNjQJCTYzCisKKyNkZWZpbmUgU05fZGVzeF9jYmMJCSJERVNYLUNCQyIKKyNkZWZpbmUgTE5fZGVzeF9jYmMJCSJkZXN4LWNiYyIKKyNkZWZpbmUgTklEX2Rlc3hfY2JjCQk4MAorCisjZGVmaW5lIFNOX3NoYQkJIlNIQSIKKyNkZWZpbmUgTE5fc2hhCQkic2hhIgorI2RlZmluZSBOSURfc2hhCQk0MQorI2RlZmluZSBPQkpfc2hhCQlPQkpfYWxnb3JpdGhtLDE4TAorCisjZGVmaW5lIFNOX3NoYTEJCSJTSEExIgorI2RlZmluZSBMTl9zaGExCQkic2hhMSIKKyNkZWZpbmUgTklEX3NoYTEJCTY0CisjZGVmaW5lIE9CSl9zaGExCQlPQkpfYWxnb3JpdGhtLDI2TAorCisjZGVmaW5lIFNOX2RzYVdpdGhTSEExXzIJCSJEU0EtU0hBMS1vbGQiCisjZGVmaW5lIExOX2RzYVdpdGhTSEExXzIJCSJkc2FXaXRoU0hBMS1vbGQiCisjZGVmaW5lIE5JRF9kc2FXaXRoU0hBMV8yCQk3MAorI2RlZmluZSBPQkpfZHNhV2l0aFNIQTFfMgkJT0JKX2FsZ29yaXRobSwyN0wKKworI2RlZmluZSBTTl9zaGExV2l0aFJTQQkJIlJTQS1TSEExLTIiCisjZGVmaW5lIExOX3NoYTFXaXRoUlNBCQkic2hhMVdpdGhSU0EiCisjZGVmaW5lIE5JRF9zaGExV2l0aFJTQQkJMTE1CisjZGVmaW5lIE9CSl9zaGExV2l0aFJTQQkJT0JKX2FsZ29yaXRobSwyOUwKKworI2RlZmluZSBTTl9yaXBlbWQxNjAJCSJSSVBFTUQxNjAiCisjZGVmaW5lIExOX3JpcGVtZDE2MAkJInJpcGVtZDE2MCIKKyNkZWZpbmUgTklEX3JpcGVtZDE2MAkJMTE3CisjZGVmaW5lIE9CSl9yaXBlbWQxNjAJCTFMLDNMLDM2TCwzTCwyTCwxTAorCisjZGVmaW5lIFNOX3JpcGVtZDE2MFdpdGhSU0EJCSJSU0EtUklQRU1EMTYwIgorI2RlZmluZSBMTl9yaXBlbWQxNjBXaXRoUlNBCQkicmlwZW1kMTYwV2l0aFJTQSIKKyNkZWZpbmUgTklEX3JpcGVtZDE2MFdpdGhSU0EJCTExOQorI2RlZmluZSBPQkpfcmlwZW1kMTYwV2l0aFJTQQkJMUwsM0wsMzZMLDNMLDNMLDFMLDJMCisKKyNkZWZpbmUgU05fc3huZXQJCSJTWE5ldElEIgorI2RlZmluZSBMTl9zeG5ldAkJIlN0cm9uZyBFeHRyYW5ldCBJRCIKKyNkZWZpbmUgTklEX3N4bmV0CQkxNDMKKyNkZWZpbmUgT0JKX3N4bmV0CQkxTCwzTCwxMDFMLDFMLDRMLDFMCisKKyNkZWZpbmUgU05fWDUwMAkJIlg1MDAiCisjZGVmaW5lIExOX1g1MDAJCSJkaXJlY3Rvcnkgc2VydmljZXMgKFguNTAwKSIKKyNkZWZpbmUgTklEX1g1MDAJCTExCisjZGVmaW5lIE9CSl9YNTAwCQkyTCw1TAorCisjZGVmaW5lIFNOX1g1MDkJCSJYNTA5IgorI2RlZmluZSBOSURfWDUwOQkJMTIKKyNkZWZpbmUgT0JKX1g1MDkJCU9CSl9YNTAwLDRMCisKKyNkZWZpbmUgU05fY29tbW9uTmFtZQkJIkNOIgorI2RlZmluZSBMTl9jb21tb25OYW1lCQkiY29tbW9uTmFtZSIKKyNkZWZpbmUgTklEX2NvbW1vbk5hbWUJCTEzCisjZGVmaW5lIE9CSl9jb21tb25OYW1lCQlPQkpfWDUwOSwzTAorCisjZGVmaW5lIFNOX3N1cm5hbWUJCSJTTiIKKyNkZWZpbmUgTE5fc3VybmFtZQkJInN1cm5hbWUiCisjZGVmaW5lIE5JRF9zdXJuYW1lCQkxMDAKKyNkZWZpbmUgT0JKX3N1cm5hbWUJCU9CSl9YNTA5LDRMCisKKyNkZWZpbmUgTE5fc2VyaWFsTnVtYmVyCQkic2VyaWFsTnVtYmVyIgorI2RlZmluZSBOSURfc2VyaWFsTnVtYmVyCQkxMDUKKyNkZWZpbmUgT0JKX3NlcmlhbE51bWJlcgkJT0JKX1g1MDksNUwKKworI2RlZmluZSBTTl9jb3VudHJ5TmFtZQkJIkMiCisjZGVmaW5lIExOX2NvdW50cnlOYW1lCQkiY291bnRyeU5hbWUiCisjZGVmaW5lIE5JRF9jb3VudHJ5TmFtZQkJMTQKKyNkZWZpbmUgT0JKX2NvdW50cnlOYW1lCQlPQkpfWDUwOSw2TAorCisjZGVmaW5lIFNOX2xvY2FsaXR5TmFtZQkJIkwiCisjZGVmaW5lIExOX2xvY2FsaXR5TmFtZQkJImxvY2FsaXR5TmFtZSIKKyNkZWZpbmUgTklEX2xvY2FsaXR5TmFtZQkJMTUKKyNkZWZpbmUgT0JKX2xvY2FsaXR5TmFtZQkJT0JKX1g1MDksN0wKKworI2RlZmluZSBTTl9zdGF0ZU9yUHJvdmluY2VOYW1lCQkiU1QiCisjZGVmaW5lIExOX3N0YXRlT3JQcm92aW5jZU5hbWUJCSJzdGF0ZU9yUHJvdmluY2VOYW1lIgorI2RlZmluZSBOSURfc3RhdGVPclByb3ZpbmNlTmFtZQkJMTYKKyNkZWZpbmUgT0JKX3N0YXRlT3JQcm92aW5jZU5hbWUJCU9CSl9YNTA5LDhMCisKKyNkZWZpbmUgU05fc3RyZWV0QWRkcmVzcwkJInN0cmVldCIKKyNkZWZpbmUgTE5fc3RyZWV0QWRkcmVzcwkJInN0cmVldEFkZHJlc3MiCisjZGVmaW5lIE5JRF9zdHJlZXRBZGRyZXNzCQk2NjAKKyNkZWZpbmUgT0JKX3N0cmVldEFkZHJlc3MJCU9CSl9YNTA5LDlMCisKKyNkZWZpbmUgU05fb3JnYW5pemF0aW9uTmFtZQkJIk8iCisjZGVmaW5lIExOX29yZ2FuaXphdGlvbk5hbWUJCSJvcmdhbml6YXRpb25OYW1lIgorI2RlZmluZSBOSURfb3JnYW5pemF0aW9uTmFtZQkJMTcKKyNkZWZpbmUgT0JKX29yZ2FuaXphdGlvbk5hbWUJCU9CSl9YNTA5LDEwTAorCisjZGVmaW5lIFNOX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJCSJPVSIKKyNkZWZpbmUgTE5fb3JnYW5pemF0aW9uYWxVbml0TmFtZQkJIm9yZ2FuaXphdGlvbmFsVW5pdE5hbWUiCisjZGVmaW5lIE5JRF9vcmdhbml6YXRpb25hbFVuaXROYW1lCQkxOAorI2RlZmluZSBPQkpfb3JnYW5pemF0aW9uYWxVbml0TmFtZQkJT0JKX1g1MDksMTFMCisKKyNkZWZpbmUgU05fdGl0bGUJCSJ0aXRsZSIKKyNkZWZpbmUgTE5fdGl0bGUJCSJ0aXRsZSIKKyNkZWZpbmUgTklEX3RpdGxlCQkxMDYKKyNkZWZpbmUgT0JKX3RpdGxlCQlPQkpfWDUwOSwxMkwKKworI2RlZmluZSBMTl9kZXNjcmlwdGlvbgkJImRlc2NyaXB0aW9uIgorI2RlZmluZSBOSURfZGVzY3JpcHRpb24JCTEwNworI2RlZmluZSBPQkpfZGVzY3JpcHRpb24JCU9CSl9YNTA5LDEzTAorCisjZGVmaW5lIExOX3NlYXJjaEd1aWRlCQkic2VhcmNoR3VpZGUiCisjZGVmaW5lIE5JRF9zZWFyY2hHdWlkZQkJODU5CisjZGVmaW5lIE9CSl9zZWFyY2hHdWlkZQkJT0JKX1g1MDksMTRMCisKKyNkZWZpbmUgTE5fYnVzaW5lc3NDYXRlZ29yeQkJImJ1c2luZXNzQ2F0ZWdvcnkiCisjZGVmaW5lIE5JRF9idXNpbmVzc0NhdGVnb3J5CQk4NjAKKyNkZWZpbmUgT0JKX2J1c2luZXNzQ2F0ZWdvcnkJCU9CSl9YNTA5LDE1TAorCisjZGVmaW5lIExOX3Bvc3RhbEFkZHJlc3MJCSJwb3N0YWxBZGRyZXNzIgorI2RlZmluZSBOSURfcG9zdGFsQWRkcmVzcwkJODYxCisjZGVmaW5lIE9CSl9wb3N0YWxBZGRyZXNzCQlPQkpfWDUwOSwxNkwKKworI2RlZmluZSBMTl9wb3N0YWxDb2RlCQkicG9zdGFsQ29kZSIKKyNkZWZpbmUgTklEX3Bvc3RhbENvZGUJCTY2MQorI2RlZmluZSBPQkpfcG9zdGFsQ29kZQkJT0JKX1g1MDksMTdMCisKKyNkZWZpbmUgTE5fcG9zdE9mZmljZUJveAkJInBvc3RPZmZpY2VCb3giCisjZGVmaW5lIE5JRF9wb3N0T2ZmaWNlQm94CQk4NjIKKyNkZWZpbmUgT0JKX3Bvc3RPZmZpY2VCb3gJCU9CSl9YNTA5LDE4TAorCisjZGVmaW5lIExOX3BoeXNpY2FsRGVsaXZlcnlPZmZpY2VOYW1lCQkicGh5c2ljYWxEZWxpdmVyeU9mZmljZU5hbWUiCisjZGVmaW5lIE5JRF9waHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZQkJODYzCisjZGVmaW5lIE9CSl9waHlzaWNhbERlbGl2ZXJ5T2ZmaWNlTmFtZQkJT0JKX1g1MDksMTlMCisKKyNkZWZpbmUgTE5fdGVsZXBob25lTnVtYmVyCQkidGVsZXBob25lTnVtYmVyIgorI2RlZmluZSBOSURfdGVsZXBob25lTnVtYmVyCQk4NjQKKyNkZWZpbmUgT0JKX3RlbGVwaG9uZU51bWJlcgkJT0JKX1g1MDksMjBMCisKKyNkZWZpbmUgTE5fdGVsZXhOdW1iZXIJCSJ0ZWxleE51bWJlciIKKyNkZWZpbmUgTklEX3RlbGV4TnVtYmVyCQk4NjUKKyNkZWZpbmUgT0JKX3RlbGV4TnVtYmVyCQlPQkpfWDUwOSwyMUwKKworI2RlZmluZSBMTl90ZWxldGV4VGVybWluYWxJZGVudGlmaWVyCQkidGVsZXRleFRlcm1pbmFsSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3RlbGV0ZXhUZXJtaW5hbElkZW50aWZpZXIJCTg2NgorI2RlZmluZSBPQkpfdGVsZXRleFRlcm1pbmFsSWRlbnRpZmllcgkJT0JKX1g1MDksMjJMCisKKyNkZWZpbmUgTE5fZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyCQkiZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyIgorI2RlZmluZSBOSURfZmFjc2ltaWxlVGVsZXBob25lTnVtYmVyCQk4NjcKKyNkZWZpbmUgT0JKX2ZhY3NpbWlsZVRlbGVwaG9uZU51bWJlcgkJT0JKX1g1MDksMjNMCisKKyNkZWZpbmUgTE5feDEyMUFkZHJlc3MJCSJ4MTIxQWRkcmVzcyIKKyNkZWZpbmUgTklEX3gxMjFBZGRyZXNzCQk4NjgKKyNkZWZpbmUgT0JKX3gxMjFBZGRyZXNzCQlPQkpfWDUwOSwyNEwKKworI2RlZmluZSBMTl9pbnRlcm5hdGlvbmFsaVNETk51bWJlcgkJImludGVybmF0aW9uYWxpU0ROTnVtYmVyIgorI2RlZmluZSBOSURfaW50ZXJuYXRpb25hbGlTRE5OdW1iZXIJCTg2OQorI2RlZmluZSBPQkpfaW50ZXJuYXRpb25hbGlTRE5OdW1iZXIJCU9CSl9YNTA5LDI1TAorCisjZGVmaW5lIExOX3JlZ2lzdGVyZWRBZGRyZXNzCQkicmVnaXN0ZXJlZEFkZHJlc3MiCisjZGVmaW5lIE5JRF9yZWdpc3RlcmVkQWRkcmVzcwkJODcwCisjZGVmaW5lIE9CSl9yZWdpc3RlcmVkQWRkcmVzcwkJT0JKX1g1MDksMjZMCisKKyNkZWZpbmUgTE5fZGVzdGluYXRpb25JbmRpY2F0b3IJCSJkZXN0aW5hdGlvbkluZGljYXRvciIKKyNkZWZpbmUgTklEX2Rlc3RpbmF0aW9uSW5kaWNhdG9yCQk4NzEKKyNkZWZpbmUgT0JKX2Rlc3RpbmF0aW9uSW5kaWNhdG9yCQlPQkpfWDUwOSwyN0wKKworI2RlZmluZSBMTl9wcmVmZXJyZWREZWxpdmVyeU1ldGhvZAkJInByZWZlcnJlZERlbGl2ZXJ5TWV0aG9kIgorI2RlZmluZSBOSURfcHJlZmVycmVkRGVsaXZlcnlNZXRob2QJCTg3MgorI2RlZmluZSBPQkpfcHJlZmVycmVkRGVsaXZlcnlNZXRob2QJCU9CSl9YNTA5LDI4TAorCisjZGVmaW5lIExOX3ByZXNlbnRhdGlvbkFkZHJlc3MJCSJwcmVzZW50YXRpb25BZGRyZXNzIgorI2RlZmluZSBOSURfcHJlc2VudGF0aW9uQWRkcmVzcwkJODczCisjZGVmaW5lIE9CSl9wcmVzZW50YXRpb25BZGRyZXNzCQlPQkpfWDUwOSwyOUwKKworI2RlZmluZSBMTl9zdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQJCSJzdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQiCisjZGVmaW5lIE5JRF9zdXBwb3J0ZWRBcHBsaWNhdGlvbkNvbnRleHQJCTg3NAorI2RlZmluZSBPQkpfc3VwcG9ydGVkQXBwbGljYXRpb25Db250ZXh0CQlPQkpfWDUwOSwzMEwKKworI2RlZmluZSBTTl9tZW1iZXIJCSJtZW1iZXIiCisjZGVmaW5lIE5JRF9tZW1iZXIJCTg3NQorI2RlZmluZSBPQkpfbWVtYmVyCQlPQkpfWDUwOSwzMUwKKworI2RlZmluZSBTTl9vd25lcgkJIm93bmVyIgorI2RlZmluZSBOSURfb3duZXIJCTg3NgorI2RlZmluZSBPQkpfb3duZXIJCU9CSl9YNTA5LDMyTAorCisjZGVmaW5lIExOX3JvbGVPY2N1cGFudAkJInJvbGVPY2N1cGFudCIKKyNkZWZpbmUgTklEX3JvbGVPY2N1cGFudAkJODc3CisjZGVmaW5lIE9CSl9yb2xlT2NjdXBhbnQJCU9CSl9YNTA5LDMzTAorCisjZGVmaW5lIFNOX3NlZUFsc28JCSJzZWVBbHNvIgorI2RlZmluZSBOSURfc2VlQWxzbwkJODc4CisjZGVmaW5lIE9CSl9zZWVBbHNvCQlPQkpfWDUwOSwzNEwKKworI2RlZmluZSBMTl91c2VyUGFzc3dvcmQJCSJ1c2VyUGFzc3dvcmQiCisjZGVmaW5lIE5JRF91c2VyUGFzc3dvcmQJCTg3OQorI2RlZmluZSBPQkpfdXNlclBhc3N3b3JkCQlPQkpfWDUwOSwzNUwKKworI2RlZmluZSBMTl91c2VyQ2VydGlmaWNhdGUJCSJ1c2VyQ2VydGlmaWNhdGUiCisjZGVmaW5lIE5JRF91c2VyQ2VydGlmaWNhdGUJCTg4MAorI2RlZmluZSBPQkpfdXNlckNlcnRpZmljYXRlCQlPQkpfWDUwOSwzNkwKKworI2RlZmluZSBMTl9jQUNlcnRpZmljYXRlCQkiY0FDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUgTklEX2NBQ2VydGlmaWNhdGUJCTg4MQorI2RlZmluZSBPQkpfY0FDZXJ0aWZpY2F0ZQkJT0JKX1g1MDksMzdMCisKKyNkZWZpbmUgTE5fYXV0aG9yaXR5UmV2b2NhdGlvbkxpc3QJCSJhdXRob3JpdHlSZXZvY2F0aW9uTGlzdCIKKyNkZWZpbmUgTklEX2F1dGhvcml0eVJldm9jYXRpb25MaXN0CQk4ODIKKyNkZWZpbmUgT0JKX2F1dGhvcml0eVJldm9jYXRpb25MaXN0CQlPQkpfWDUwOSwzOEwKKworI2RlZmluZSBMTl9jZXJ0aWZpY2F0ZVJldm9jYXRpb25MaXN0CQkiY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdCIKKyNkZWZpbmUgTklEX2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3QJCTg4MworI2RlZmluZSBPQkpfY2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdAkJT0JKX1g1MDksMzlMCisKKyNkZWZpbmUgTE5fY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIJCSJjcm9zc0NlcnRpZmljYXRlUGFpciIKKyNkZWZpbmUgTklEX2Nyb3NzQ2VydGlmaWNhdGVQYWlyCQk4ODQKKyNkZWZpbmUgT0JKX2Nyb3NzQ2VydGlmaWNhdGVQYWlyCQlPQkpfWDUwOSw0MEwKKworI2RlZmluZSBTTl9uYW1lCQkibmFtZSIKKyNkZWZpbmUgTE5fbmFtZQkJIm5hbWUiCisjZGVmaW5lIE5JRF9uYW1lCQkxNzMKKyNkZWZpbmUgT0JKX25hbWUJCU9CSl9YNTA5LDQxTAorCisjZGVmaW5lIFNOX2dpdmVuTmFtZQkJIkdOIgorI2RlZmluZSBMTl9naXZlbk5hbWUJCSJnaXZlbk5hbWUiCisjZGVmaW5lIE5JRF9naXZlbk5hbWUJCTk5CisjZGVmaW5lIE9CSl9naXZlbk5hbWUJCU9CSl9YNTA5LDQyTAorCisjZGVmaW5lIFNOX2luaXRpYWxzCQkiaW5pdGlhbHMiCisjZGVmaW5lIExOX2luaXRpYWxzCQkiaW5pdGlhbHMiCisjZGVmaW5lIE5JRF9pbml0aWFscwkJMTAxCisjZGVmaW5lIE9CSl9pbml0aWFscwkJT0JKX1g1MDksNDNMCisKKyNkZWZpbmUgTE5fZ2VuZXJhdGlvblF1YWxpZmllcgkJImdlbmVyYXRpb25RdWFsaWZpZXIiCisjZGVmaW5lIE5JRF9nZW5lcmF0aW9uUXVhbGlmaWVyCQk1MDkKKyNkZWZpbmUgT0JKX2dlbmVyYXRpb25RdWFsaWZpZXIJCU9CSl9YNTA5LDQ0TAorCisjZGVmaW5lIExOX3g1MDBVbmlxdWVJZGVudGlmaWVyCQkieDUwMFVuaXF1ZUlkZW50aWZpZXIiCisjZGVmaW5lIE5JRF94NTAwVW5pcXVlSWRlbnRpZmllcgkJNTAzCisjZGVmaW5lIE9CSl94NTAwVW5pcXVlSWRlbnRpZmllcgkJT0JKX1g1MDksNDVMCisKKyNkZWZpbmUgU05fZG5RdWFsaWZpZXIJCSJkblF1YWxpZmllciIKKyNkZWZpbmUgTE5fZG5RdWFsaWZpZXIJCSJkblF1YWxpZmllciIKKyNkZWZpbmUgTklEX2RuUXVhbGlmaWVyCQkxNzQKKyNkZWZpbmUgT0JKX2RuUXVhbGlmaWVyCQlPQkpfWDUwOSw0NkwKKworI2RlZmluZSBMTl9lbmhhbmNlZFNlYXJjaEd1aWRlCQkiZW5oYW5jZWRTZWFyY2hHdWlkZSIKKyNkZWZpbmUgTklEX2VuaGFuY2VkU2VhcmNoR3VpZGUJCTg4NQorI2RlZmluZSBPQkpfZW5oYW5jZWRTZWFyY2hHdWlkZQkJT0JKX1g1MDksNDdMCisKKyNkZWZpbmUgTE5fcHJvdG9jb2xJbmZvcm1hdGlvbgkJInByb3RvY29sSW5mb3JtYXRpb24iCisjZGVmaW5lIE5JRF9wcm90b2NvbEluZm9ybWF0aW9uCQk4ODYKKyNkZWZpbmUgT0JKX3Byb3RvY29sSW5mb3JtYXRpb24JCU9CSl9YNTA5LDQ4TAorCisjZGVmaW5lIExOX2Rpc3Rpbmd1aXNoZWROYW1lCQkiZGlzdGluZ3Vpc2hlZE5hbWUiCisjZGVmaW5lIE5JRF9kaXN0aW5ndWlzaGVkTmFtZQkJODg3CisjZGVmaW5lIE9CSl9kaXN0aW5ndWlzaGVkTmFtZQkJT0JKX1g1MDksNDlMCisKKyNkZWZpbmUgTE5fdW5pcXVlTWVtYmVyCQkidW5pcXVlTWVtYmVyIgorI2RlZmluZSBOSURfdW5pcXVlTWVtYmVyCQk4ODgKKyNkZWZpbmUgT0JKX3VuaXF1ZU1lbWJlcgkJT0JKX1g1MDksNTBMCisKKyNkZWZpbmUgTE5faG91c2VJZGVudGlmaWVyCQkiaG91c2VJZGVudGlmaWVyIgorI2RlZmluZSBOSURfaG91c2VJZGVudGlmaWVyCQk4ODkKKyNkZWZpbmUgT0JKX2hvdXNlSWRlbnRpZmllcgkJT0JKX1g1MDksNTFMCisKKyNkZWZpbmUgTE5fc3VwcG9ydGVkQWxnb3JpdGhtcwkJInN1cHBvcnRlZEFsZ29yaXRobXMiCisjZGVmaW5lIE5JRF9zdXBwb3J0ZWRBbGdvcml0aG1zCQk4OTAKKyNkZWZpbmUgT0JKX3N1cHBvcnRlZEFsZ29yaXRobXMJCU9CSl9YNTA5LDUyTAorCisjZGVmaW5lIExOX2RlbHRhUmV2b2NhdGlvbkxpc3QJCSJkZWx0YVJldm9jYXRpb25MaXN0IgorI2RlZmluZSBOSURfZGVsdGFSZXZvY2F0aW9uTGlzdAkJODkxCisjZGVmaW5lIE9CSl9kZWx0YVJldm9jYXRpb25MaXN0CQlPQkpfWDUwOSw1M0wKKworI2RlZmluZSBTTl9kbWROYW1lCQkiZG1kTmFtZSIKKyNkZWZpbmUgTklEX2RtZE5hbWUJCTg5MgorI2RlZmluZSBPQkpfZG1kTmFtZQkJT0JKX1g1MDksNTRMCisKKyNkZWZpbmUgTE5fcHNldWRvbnltCQkicHNldWRvbnltIgorI2RlZmluZSBOSURfcHNldWRvbnltCQk1MTAKKyNkZWZpbmUgT0JKX3BzZXVkb255bQkJT0JKX1g1MDksNjVMCisKKyNkZWZpbmUgU05fcm9sZQkJInJvbGUiCisjZGVmaW5lIExOX3JvbGUJCSJyb2xlIgorI2RlZmluZSBOSURfcm9sZQkJNDAwCisjZGVmaW5lIE9CSl9yb2xlCQlPQkpfWDUwOSw3MkwKKworI2RlZmluZSBTTl9YNTAwYWxnb3JpdGhtcwkJIlg1MDBhbGdvcml0aG1zIgorI2RlZmluZSBMTl9YNTAwYWxnb3JpdGhtcwkJImRpcmVjdG9yeSBzZXJ2aWNlcyAtIGFsZ29yaXRobXMiCisjZGVmaW5lIE5JRF9YNTAwYWxnb3JpdGhtcwkJMzc4CisjZGVmaW5lIE9CSl9YNTAwYWxnb3JpdGhtcwkJT0JKX1g1MDAsOEwKKworI2RlZmluZSBTTl9yc2EJCSJSU0EiCisjZGVmaW5lIExOX3JzYQkJInJzYSIKKyNkZWZpbmUgTklEX3JzYQkJMTkKKyNkZWZpbmUgT0JKX3JzYQkJT0JKX1g1MDBhbGdvcml0aG1zLDFMLDFMCisKKyNkZWZpbmUgU05fbWRjMldpdGhSU0EJCSJSU0EtTURDMiIKKyNkZWZpbmUgTE5fbWRjMldpdGhSU0EJCSJtZGMyV2l0aFJTQSIKKyNkZWZpbmUgTklEX21kYzJXaXRoUlNBCQk5NgorI2RlZmluZSBPQkpfbWRjMldpdGhSU0EJCU9CSl9YNTAwYWxnb3JpdGhtcywzTCwxMDBMCisKKyNkZWZpbmUgU05fbWRjMgkJIk1EQzIiCisjZGVmaW5lIExOX21kYzIJCSJtZGMyIgorI2RlZmluZSBOSURfbWRjMgkJOTUKKyNkZWZpbmUgT0JKX21kYzIJCU9CSl9YNTAwYWxnb3JpdGhtcywzTCwxMDFMCisKKyNkZWZpbmUgU05faWRfY2UJCSJpZC1jZSIKKyNkZWZpbmUgTklEX2lkX2NlCQk4MQorI2RlZmluZSBPQkpfaWRfY2UJCU9CSl9YNTAwLDI5TAorCisjZGVmaW5lIFNOX3N1YmplY3RfZGlyZWN0b3J5X2F0dHJpYnV0ZXMJCSJzdWJqZWN0RGlyZWN0b3J5QXR0cmlidXRlcyIKKyNkZWZpbmUgTE5fc3ViamVjdF9kaXJlY3RvcnlfYXR0cmlidXRlcwkJIlg1MDl2MyBTdWJqZWN0IERpcmVjdG9yeSBBdHRyaWJ1dGVzIgorI2RlZmluZSBOSURfc3ViamVjdF9kaXJlY3RvcnlfYXR0cmlidXRlcwkJNzY5CisjZGVmaW5lIE9CSl9zdWJqZWN0X2RpcmVjdG9yeV9hdHRyaWJ1dGVzCQlPQkpfaWRfY2UsOUwKKworI2RlZmluZSBTTl9zdWJqZWN0X2tleV9pZGVudGlmaWVyCQkic3ViamVjdEtleUlkZW50aWZpZXIiCisjZGVmaW5lIExOX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJCSJYNTA5djMgU3ViamVjdCBLZXkgSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJCTgyCisjZGVmaW5lIE9CSl9zdWJqZWN0X2tleV9pZGVudGlmaWVyCQlPQkpfaWRfY2UsMTRMCisKKyNkZWZpbmUgU05fa2V5X3VzYWdlCQkia2V5VXNhZ2UiCisjZGVmaW5lIExOX2tleV91c2FnZQkJIlg1MDl2MyBLZXkgVXNhZ2UiCisjZGVmaW5lIE5JRF9rZXlfdXNhZ2UJCTgzCisjZGVmaW5lIE9CSl9rZXlfdXNhZ2UJCU9CSl9pZF9jZSwxNUwKKworI2RlZmluZSBTTl9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QJCSJwcml2YXRlS2V5VXNhZ2VQZXJpb2QiCisjZGVmaW5lIExOX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAkJIlg1MDl2MyBQcml2YXRlIEtleSBVc2FnZSBQZXJpb2QiCisjZGVmaW5lIE5JRF9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QJCTg0CisjZGVmaW5lIE9CSl9wcml2YXRlX2tleV91c2FnZV9wZXJpb2QJCU9CSl9pZF9jZSwxNkwKKworI2RlZmluZSBTTl9zdWJqZWN0X2FsdF9uYW1lCQkic3ViamVjdEFsdE5hbWUiCisjZGVmaW5lIExOX3N1YmplY3RfYWx0X25hbWUJCSJYNTA5djMgU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lIgorI2RlZmluZSBOSURfc3ViamVjdF9hbHRfbmFtZQkJODUKKyNkZWZpbmUgT0JKX3N1YmplY3RfYWx0X25hbWUJCU9CSl9pZF9jZSwxN0wKKworI2RlZmluZSBTTl9pc3N1ZXJfYWx0X25hbWUJCSJpc3N1ZXJBbHROYW1lIgorI2RlZmluZSBMTl9pc3N1ZXJfYWx0X25hbWUJCSJYNTA5djMgSXNzdWVyIEFsdGVybmF0aXZlIE5hbWUiCisjZGVmaW5lIE5JRF9pc3N1ZXJfYWx0X25hbWUJCTg2CisjZGVmaW5lIE9CSl9pc3N1ZXJfYWx0X25hbWUJCU9CSl9pZF9jZSwxOEwKKworI2RlZmluZSBTTl9iYXNpY19jb25zdHJhaW50cwkJImJhc2ljQ29uc3RyYWludHMiCisjZGVmaW5lIExOX2Jhc2ljX2NvbnN0cmFpbnRzCQkiWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzIgorI2RlZmluZSBOSURfYmFzaWNfY29uc3RyYWludHMJCTg3CisjZGVmaW5lIE9CSl9iYXNpY19jb25zdHJhaW50cwkJT0JKX2lkX2NlLDE5TAorCisjZGVmaW5lIFNOX2NybF9udW1iZXIJCSJjcmxOdW1iZXIiCisjZGVmaW5lIExOX2NybF9udW1iZXIJCSJYNTA5djMgQ1JMIE51bWJlciIKKyNkZWZpbmUgTklEX2NybF9udW1iZXIJCTg4CisjZGVmaW5lIE9CSl9jcmxfbnVtYmVyCQlPQkpfaWRfY2UsMjBMCisKKyNkZWZpbmUgU05fY3JsX3JlYXNvbgkJIkNSTFJlYXNvbiIKKyNkZWZpbmUgTE5fY3JsX3JlYXNvbgkJIlg1MDl2MyBDUkwgUmVhc29uIENvZGUiCisjZGVmaW5lIE5JRF9jcmxfcmVhc29uCQkxNDEKKyNkZWZpbmUgT0JKX2NybF9yZWFzb24JCU9CSl9pZF9jZSwyMUwKKworI2RlZmluZSBTTl9pbnZhbGlkaXR5X2RhdGUJCSJpbnZhbGlkaXR5RGF0ZSIKKyNkZWZpbmUgTE5faW52YWxpZGl0eV9kYXRlCQkiSW52YWxpZGl0eSBEYXRlIgorI2RlZmluZSBOSURfaW52YWxpZGl0eV9kYXRlCQkxNDIKKyNkZWZpbmUgT0JKX2ludmFsaWRpdHlfZGF0ZQkJT0JKX2lkX2NlLDI0TAorCisjZGVmaW5lIFNOX2RlbHRhX2NybAkJImRlbHRhQ1JMIgorI2RlZmluZSBMTl9kZWx0YV9jcmwJCSJYNTA5djMgRGVsdGEgQ1JMIEluZGljYXRvciIKKyNkZWZpbmUgTklEX2RlbHRhX2NybAkJMTQwCisjZGVmaW5lIE9CSl9kZWx0YV9jcmwJCU9CSl9pZF9jZSwyN0wKKworI2RlZmluZSBTTl9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludAkJImlzc3VpbmdEaXN0cmlidXRpb25Qb2ludCIKKyNkZWZpbmUgTE5faXNzdWluZ19kaXN0cmlidXRpb25fcG9pbnQJCSJYNTA5djMgSXNzdWluZyBEaXN0cnVidXRpb24gUG9pbnQiCisjZGVmaW5lIE5JRF9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludAkJNzcwCisjZGVmaW5lIE9CSl9pc3N1aW5nX2Rpc3RyaWJ1dGlvbl9wb2ludAkJT0JKX2lkX2NlLDI4TAorCisjZGVmaW5lIFNOX2NlcnRpZmljYXRlX2lzc3VlcgkJImNlcnRpZmljYXRlSXNzdWVyIgorI2RlZmluZSBMTl9jZXJ0aWZpY2F0ZV9pc3N1ZXIJCSJYNTA5djMgQ2VydGlmaWNhdGUgSXNzdWVyIgorI2RlZmluZSBOSURfY2VydGlmaWNhdGVfaXNzdWVyCQk3NzEKKyNkZWZpbmUgT0JKX2NlcnRpZmljYXRlX2lzc3VlcgkJT0JKX2lkX2NlLDI5TAorCisjZGVmaW5lIFNOX25hbWVfY29uc3RyYWludHMJCSJuYW1lQ29uc3RyYWludHMiCisjZGVmaW5lIExOX25hbWVfY29uc3RyYWludHMJCSJYNTA5djMgTmFtZSBDb25zdHJhaW50cyIKKyNkZWZpbmUgTklEX25hbWVfY29uc3RyYWludHMJCTY2NgorI2RlZmluZSBPQkpfbmFtZV9jb25zdHJhaW50cwkJT0JKX2lkX2NlLDMwTAorCisjZGVmaW5lIFNOX2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQkiY3JsRGlzdHJpYnV0aW9uUG9pbnRzIgorI2RlZmluZSBMTl9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cwkJIlg1MDl2MyBDUkwgRGlzdHJpYnV0aW9uIFBvaW50cyIKKyNkZWZpbmUgTklEX2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQkxMDMKKyNkZWZpbmUgT0JKX2NybF9kaXN0cmlidXRpb25fcG9pbnRzCQlPQkpfaWRfY2UsMzFMCisKKyNkZWZpbmUgU05fY2VydGlmaWNhdGVfcG9saWNpZXMJCSJjZXJ0aWZpY2F0ZVBvbGljaWVzIgorI2RlZmluZSBMTl9jZXJ0aWZpY2F0ZV9wb2xpY2llcwkJIlg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llcyIKKyNkZWZpbmUgTklEX2NlcnRpZmljYXRlX3BvbGljaWVzCQk4OQorI2RlZmluZSBPQkpfY2VydGlmaWNhdGVfcG9saWNpZXMJCU9CSl9pZF9jZSwzMkwKKworI2RlZmluZSBTTl9hbnlfcG9saWN5CQkiYW55UG9saWN5IgorI2RlZmluZSBMTl9hbnlfcG9saWN5CQkiWDUwOXYzIEFueSBQb2xpY3kiCisjZGVmaW5lIE5JRF9hbnlfcG9saWN5CQk3NDYKKyNkZWZpbmUgT0JKX2FueV9wb2xpY3kJCU9CSl9jZXJ0aWZpY2F0ZV9wb2xpY2llcywwTAorCisjZGVmaW5lIFNOX3BvbGljeV9tYXBwaW5ncwkJInBvbGljeU1hcHBpbmdzIgorI2RlZmluZSBMTl9wb2xpY3lfbWFwcGluZ3MJCSJYNTA5djMgUG9saWN5IE1hcHBpbmdzIgorI2RlZmluZSBOSURfcG9saWN5X21hcHBpbmdzCQk3NDcKKyNkZWZpbmUgT0JKX3BvbGljeV9tYXBwaW5ncwkJT0JKX2lkX2NlLDMzTAorCisjZGVmaW5lIFNOX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkJImF1dGhvcml0eUtleUlkZW50aWZpZXIiCisjZGVmaW5lIExOX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkJIlg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXIiCisjZGVmaW5lIE5JRF9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIJCTkwCisjZGVmaW5lIE9CSl9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIJCU9CSl9pZF9jZSwzNUwKKworI2RlZmluZSBTTl9wb2xpY3lfY29uc3RyYWludHMJCSJwb2xpY3lDb25zdHJhaW50cyIKKyNkZWZpbmUgTE5fcG9saWN5X2NvbnN0cmFpbnRzCQkiWDUwOXYzIFBvbGljeSBDb25zdHJhaW50cyIKKyNkZWZpbmUgTklEX3BvbGljeV9jb25zdHJhaW50cwkJNDAxCisjZGVmaW5lIE9CSl9wb2xpY3lfY29uc3RyYWludHMJCU9CSl9pZF9jZSwzNkwKKworI2RlZmluZSBTTl9leHRfa2V5X3VzYWdlCQkiZXh0ZW5kZWRLZXlVc2FnZSIKKyNkZWZpbmUgTE5fZXh0X2tleV91c2FnZQkJIlg1MDl2MyBFeHRlbmRlZCBLZXkgVXNhZ2UiCisjZGVmaW5lIE5JRF9leHRfa2V5X3VzYWdlCQkxMjYKKyNkZWZpbmUgT0JKX2V4dF9rZXlfdXNhZ2UJCU9CSl9pZF9jZSwzN0wKKworI2RlZmluZSBTTl9mcmVzaGVzdF9jcmwJCSJmcmVzaGVzdENSTCIKKyNkZWZpbmUgTE5fZnJlc2hlc3RfY3JsCQkiWDUwOXYzIEZyZXNoZXN0IENSTCIKKyNkZWZpbmUgTklEX2ZyZXNoZXN0X2NybAkJODU3CisjZGVmaW5lIE9CSl9mcmVzaGVzdF9jcmwJCU9CSl9pZF9jZSw0NkwKKworI2RlZmluZSBTTl9pbmhpYml0X2FueV9wb2xpY3kJCSJpbmhpYml0QW55UG9saWN5IgorI2RlZmluZSBMTl9pbmhpYml0X2FueV9wb2xpY3kJCSJYNTA5djMgSW5oaWJpdCBBbnkgUG9saWN5IgorI2RlZmluZSBOSURfaW5oaWJpdF9hbnlfcG9saWN5CQk3NDgKKyNkZWZpbmUgT0JKX2luaGliaXRfYW55X3BvbGljeQkJT0JKX2lkX2NlLDU0TAorCisjZGVmaW5lIFNOX3RhcmdldF9pbmZvcm1hdGlvbgkJInRhcmdldEluZm9ybWF0aW9uIgorI2RlZmluZSBMTl90YXJnZXRfaW5mb3JtYXRpb24JCSJYNTA5djMgQUMgVGFyZ2V0aW5nIgorI2RlZmluZSBOSURfdGFyZ2V0X2luZm9ybWF0aW9uCQk0MDIKKyNkZWZpbmUgT0JKX3RhcmdldF9pbmZvcm1hdGlvbgkJT0JKX2lkX2NlLDU1TAorCisjZGVmaW5lIFNOX25vX3Jldl9hdmFpbAkJIm5vUmV2QXZhaWwiCisjZGVmaW5lIExOX25vX3Jldl9hdmFpbAkJIlg1MDl2MyBObyBSZXZvY2F0aW9uIEF2YWlsYWJsZSIKKyNkZWZpbmUgTklEX25vX3Jldl9hdmFpbAkJNDAzCisjZGVmaW5lIE9CSl9ub19yZXZfYXZhaWwJCU9CSl9pZF9jZSw1NkwKKworI2RlZmluZSBTTl9uZXRzY2FwZQkJIk5ldHNjYXBlIgorI2RlZmluZSBMTl9uZXRzY2FwZQkJIk5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnAuIgorI2RlZmluZSBOSURfbmV0c2NhcGUJCTU3CisjZGVmaW5lIE9CSl9uZXRzY2FwZQkJMkwsMTZMLDg0MEwsMUwsMTEzNzMwTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uCQkibnNDZXJ0RXh0IgorI2RlZmluZSBMTl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbgkJIk5ldHNjYXBlIENlcnRpZmljYXRlIEV4dGVuc2lvbiIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uCQk1OAorI2RlZmluZSBPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24JCU9CSl9uZXRzY2FwZSwxTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2RhdGFfdHlwZQkJIm5zRGF0YVR5cGUiCisjZGVmaW5lIExOX25ldHNjYXBlX2RhdGFfdHlwZQkJIk5ldHNjYXBlIERhdGEgVHlwZSIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2RhdGFfdHlwZQkJNTkKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2RhdGFfdHlwZQkJT0JKX25ldHNjYXBlLDJMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2VydF90eXBlCQkibnNDZXJ0VHlwZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2VydF90eXBlCQkiTmV0c2NhcGUgQ2VydCBUeXBlIgorI2RlZmluZSBOSURfbmV0c2NhcGVfY2VydF90eXBlCQk3MQorI2RlZmluZSBPQkpfbmV0c2NhcGVfY2VydF90eXBlCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sMUwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9iYXNlX3VybAkJIm5zQmFzZVVybCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfYmFzZV91cmwJCSJOZXRzY2FwZSBCYXNlIFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2Jhc2VfdXJsCQk3MgorI2RlZmluZSBPQkpfbmV0c2NhcGVfYmFzZV91cmwJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiwyTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsCQkibnNSZXZvY2F0aW9uVXJsIgorI2RlZmluZSBMTl9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybAkJIk5ldHNjYXBlIFJldm9jYXRpb24gVXJsIgorI2RlZmluZSBOSURfbmV0c2NhcGVfcmV2b2NhdGlvbl91cmwJCTczCisjZGVmaW5lIE9CSl9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybAkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDNMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwJCSJuc0NhUmV2b2NhdGlvblVybCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwJCSJOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsCQk3NAorI2RlZmluZSBPQkpfbmV0c2NhcGVfY2FfcmV2b2NhdGlvbl91cmwJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiw0TAorCisjZGVmaW5lIFNOX25ldHNjYXBlX3JlbmV3YWxfdXJsCQkibnNSZW5ld2FsVXJsIgorI2RlZmluZSBMTl9uZXRzY2FwZV9yZW5ld2FsX3VybAkJIk5ldHNjYXBlIFJlbmV3YWwgVXJsIgorI2RlZmluZSBOSURfbmV0c2NhcGVfcmVuZXdhbF91cmwJCTc1CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9yZW5ld2FsX3VybAkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDdMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2FfcG9saWN5X3VybAkJIm5zQ2FQb2xpY3lVcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX2NhX3BvbGljeV91cmwJCSJOZXRzY2FwZSBDQSBQb2xpY3kgVXJsIgorI2RlZmluZSBOSURfbmV0c2NhcGVfY2FfcG9saWN5X3VybAkJNzYKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NhX3BvbGljeV91cmwJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiw4TAorCisjZGVmaW5lIFNOX25ldHNjYXBlX3NzbF9zZXJ2ZXJfbmFtZQkJIm5zU3NsU2VydmVyTmFtZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCQkiTmV0c2NhcGUgU1NMIFNlcnZlciBOYW1lIgorI2RlZmluZSBOSURfbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCQk3NworI2RlZmluZSBPQkpfbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sMTJMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY29tbWVudAkJIm5zQ29tbWVudCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY29tbWVudAkJIk5ldHNjYXBlIENvbW1lbnQiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jb21tZW50CQk3OAorI2RlZmluZSBPQkpfbmV0c2NhcGVfY29tbWVudAkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDEzTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UJCSJuc0NlcnRTZXF1ZW5jZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2VydF9zZXF1ZW5jZQkJIk5ldHNjYXBlIENlcnRpZmljYXRlIFNlcXVlbmNlIgorI2RlZmluZSBOSURfbmV0c2NhcGVfY2VydF9zZXF1ZW5jZQkJNzkKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UJCU9CSl9uZXRzY2FwZV9kYXRhX3R5cGUsNUwKKworI2RlZmluZSBTTl9uc19zZ2MJCSJuc1NHQyIKKyNkZWZpbmUgTE5fbnNfc2djCQkiTmV0c2NhcGUgU2VydmVyIEdhdGVkIENyeXB0byIKKyNkZWZpbmUgTklEX25zX3NnYwkJMTM5CisjZGVmaW5lIE9CSl9uc19zZ2MJCU9CSl9uZXRzY2FwZSw0TCwxTAorCisjZGVmaW5lIFNOX29yZwkJIk9SRyIKKyNkZWZpbmUgTE5fb3JnCQkib3JnIgorI2RlZmluZSBOSURfb3JnCQkzNzkKKyNkZWZpbmUgT0JKX29yZwkJT0JKX2lzbywzTAorCisjZGVmaW5lIFNOX2RvZAkJIkRPRCIKKyNkZWZpbmUgTE5fZG9kCQkiZG9kIgorI2RlZmluZSBOSURfZG9kCQkzODAKKyNkZWZpbmUgT0JKX2RvZAkJT0JKX29yZyw2TAorCisjZGVmaW5lIFNOX2lhbmEJCSJJQU5BIgorI2RlZmluZSBMTl9pYW5hCQkiaWFuYSIKKyNkZWZpbmUgTklEX2lhbmEJCTM4MQorI2RlZmluZSBPQkpfaWFuYQkJT0JKX2RvZCwxTAorCisjZGVmaW5lIE9CSl9pbnRlcm5ldAkJT0JKX2lhbmEKKworI2RlZmluZSBTTl9EaXJlY3RvcnkJCSJkaXJlY3RvcnkiCisjZGVmaW5lIExOX0RpcmVjdG9yeQkJIkRpcmVjdG9yeSIKKyNkZWZpbmUgTklEX0RpcmVjdG9yeQkJMzgyCisjZGVmaW5lIE9CSl9EaXJlY3RvcnkJCU9CSl9pbnRlcm5ldCwxTAorCisjZGVmaW5lIFNOX01hbmFnZW1lbnQJCSJtZ210IgorI2RlZmluZSBMTl9NYW5hZ2VtZW50CQkiTWFuYWdlbWVudCIKKyNkZWZpbmUgTklEX01hbmFnZW1lbnQJCTM4MworI2RlZmluZSBPQkpfTWFuYWdlbWVudAkJT0JKX2ludGVybmV0LDJMCisKKyNkZWZpbmUgU05fRXhwZXJpbWVudGFsCQkiZXhwZXJpbWVudGFsIgorI2RlZmluZSBMTl9FeHBlcmltZW50YWwJCSJFeHBlcmltZW50YWwiCisjZGVmaW5lIE5JRF9FeHBlcmltZW50YWwJCTM4NAorI2RlZmluZSBPQkpfRXhwZXJpbWVudGFsCQlPQkpfaW50ZXJuZXQsM0wKKworI2RlZmluZSBTTl9Qcml2YXRlCQkicHJpdmF0ZSIKKyNkZWZpbmUgTE5fUHJpdmF0ZQkJIlByaXZhdGUiCisjZGVmaW5lIE5JRF9Qcml2YXRlCQkzODUKKyNkZWZpbmUgT0JKX1ByaXZhdGUJCU9CSl9pbnRlcm5ldCw0TAorCisjZGVmaW5lIFNOX1NlY3VyaXR5CQkic2VjdXJpdHkiCisjZGVmaW5lIExOX1NlY3VyaXR5CQkiU2VjdXJpdHkiCisjZGVmaW5lIE5JRF9TZWN1cml0eQkJMzg2CisjZGVmaW5lIE9CSl9TZWN1cml0eQkJT0JKX2ludGVybmV0LDVMCisKKyNkZWZpbmUgU05fU05NUHYyCQkic25tcHYyIgorI2RlZmluZSBMTl9TTk1QdjIJCSJTTk1QdjIiCisjZGVmaW5lIE5JRF9TTk1QdjIJCTM4NworI2RlZmluZSBPQkpfU05NUHYyCQlPQkpfaW50ZXJuZXQsNkwKKworI2RlZmluZSBMTl9NYWlsCQkiTWFpbCIKKyNkZWZpbmUgTklEX01haWwJCTM4OAorI2RlZmluZSBPQkpfTWFpbAkJT0JKX2ludGVybmV0LDdMCisKKyNkZWZpbmUgU05fRW50ZXJwcmlzZXMJCSJlbnRlcnByaXNlcyIKKyNkZWZpbmUgTE5fRW50ZXJwcmlzZXMJCSJFbnRlcnByaXNlcyIKKyNkZWZpbmUgTklEX0VudGVycHJpc2VzCQkzODkKKyNkZWZpbmUgT0JKX0VudGVycHJpc2VzCQlPQkpfUHJpdmF0ZSwxTAorCisjZGVmaW5lIFNOX2RjT2JqZWN0CQkiZGNvYmplY3QiCisjZGVmaW5lIExOX2RjT2JqZWN0CQkiZGNPYmplY3QiCisjZGVmaW5lIE5JRF9kY09iamVjdAkJMzkwCisjZGVmaW5lIE9CSl9kY09iamVjdAkJT0JKX0VudGVycHJpc2VzLDE0NjZMLDM0NEwKKworI2RlZmluZSBTTl9taW1lX21ocwkJIm1pbWUtbWhzIgorI2RlZmluZSBMTl9taW1lX21ocwkJIk1JTUUgTUhTIgorI2RlZmluZSBOSURfbWltZV9taHMJCTUwNAorI2RlZmluZSBPQkpfbWltZV9taHMJCU9CSl9NYWlsLDFMCisKKyNkZWZpbmUgU05fbWltZV9taHNfaGVhZGluZ3MJCSJtaW1lLW1ocy1oZWFkaW5ncyIKKyNkZWZpbmUgTE5fbWltZV9taHNfaGVhZGluZ3MJCSJtaW1lLW1ocy1oZWFkaW5ncyIKKyNkZWZpbmUgTklEX21pbWVfbWhzX2hlYWRpbmdzCQk1MDUKKyNkZWZpbmUgT0JKX21pbWVfbWhzX2hlYWRpbmdzCQlPQkpfbWltZV9taHMsMUwKKworI2RlZmluZSBTTl9taW1lX21oc19ib2RpZXMJCSJtaW1lLW1ocy1ib2RpZXMiCisjZGVmaW5lIExOX21pbWVfbWhzX2JvZGllcwkJIm1pbWUtbWhzLWJvZGllcyIKKyNkZWZpbmUgTklEX21pbWVfbWhzX2JvZGllcwkJNTA2CisjZGVmaW5lIE9CSl9taW1lX21oc19ib2RpZXMJCU9CSl9taW1lX21ocywyTAorCisjZGVmaW5lIFNOX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UJCSJpZC1oZXgtcGFydGlhbC1tZXNzYWdlIgorI2RlZmluZSBMTl9pZF9oZXhfcGFydGlhbF9tZXNzYWdlCQkiaWQtaGV4LXBhcnRpYWwtbWVzc2FnZSIKKyNkZWZpbmUgTklEX2lkX2hleF9wYXJ0aWFsX21lc3NhZ2UJCTUwNworI2RlZmluZSBPQkpfaWRfaGV4X3BhcnRpYWxfbWVzc2FnZQkJT0JKX21pbWVfbWhzX2hlYWRpbmdzLDFMCisKKyNkZWZpbmUgU05faWRfaGV4X211bHRpcGFydF9tZXNzYWdlCQkiaWQtaGV4LW11bHRpcGFydC1tZXNzYWdlIgorI2RlZmluZSBMTl9pZF9oZXhfbXVsdGlwYXJ0X21lc3NhZ2UJCSJpZC1oZXgtbXVsdGlwYXJ0LW1lc3NhZ2UiCisjZGVmaW5lIE5JRF9pZF9oZXhfbXVsdGlwYXJ0X21lc3NhZ2UJCTUwOAorI2RlZmluZSBPQkpfaWRfaGV4X211bHRpcGFydF9tZXNzYWdlCQlPQkpfbWltZV9taHNfaGVhZGluZ3MsMkwKKworI2RlZmluZSBTTl9ybGVfY29tcHJlc3Npb24JCSJSTEUiCisjZGVmaW5lIExOX3JsZV9jb21wcmVzc2lvbgkJInJ1biBsZW5ndGggY29tcHJlc3Npb24iCisjZGVmaW5lIE5JRF9ybGVfY29tcHJlc3Npb24JCTEyNAorI2RlZmluZSBPQkpfcmxlX2NvbXByZXNzaW9uCQkxTCwxTCwxTCwxTCw2NjZMLDFMCisKKyNkZWZpbmUgU05femxpYl9jb21wcmVzc2lvbgkJIlpMSUIiCisjZGVmaW5lIExOX3psaWJfY29tcHJlc3Npb24JCSJ6bGliIGNvbXByZXNzaW9uIgorI2RlZmluZSBOSURfemxpYl9jb21wcmVzc2lvbgkJMTI1CisjZGVmaW5lIE9CSl96bGliX2NvbXByZXNzaW9uCQlPQkpfaWRfc21pbWVfYWxnLDhMCisKKyNkZWZpbmUgT0JKX2Nzb3IJCTJMLDE2TCw4NDBMLDFMLDEwMUwsM0wKKworI2RlZmluZSBPQkpfbmlzdEFsZ29yaXRobXMJCU9CSl9jc29yLDRMCisKKyNkZWZpbmUgT0JKX2FlcwkJT0JKX25pc3RBbGdvcml0aG1zLDFMCisKKyNkZWZpbmUgU05fYWVzXzEyOF9lY2IJCSJBRVMtMTI4LUVDQiIKKyNkZWZpbmUgTE5fYWVzXzEyOF9lY2IJCSJhZXMtMTI4LWVjYiIKKyNkZWZpbmUgTklEX2Flc18xMjhfZWNiCQk0MTgKKyNkZWZpbmUgT0JKX2Flc18xMjhfZWNiCQlPQkpfYWVzLDFMCisKKyNkZWZpbmUgU05fYWVzXzEyOF9jYmMJCSJBRVMtMTI4LUNCQyIKKyNkZWZpbmUgTE5fYWVzXzEyOF9jYmMJCSJhZXMtMTI4LWNiYyIKKyNkZWZpbmUgTklEX2Flc18xMjhfY2JjCQk0MTkKKyNkZWZpbmUgT0JKX2Flc18xMjhfY2JjCQlPQkpfYWVzLDJMCisKKyNkZWZpbmUgU05fYWVzXzEyOF9vZmIxMjgJCSJBRVMtMTI4LU9GQiIKKyNkZWZpbmUgTE5fYWVzXzEyOF9vZmIxMjgJCSJhZXMtMTI4LW9mYiIKKyNkZWZpbmUgTklEX2Flc18xMjhfb2ZiMTI4CQk0MjAKKyNkZWZpbmUgT0JKX2Flc18xMjhfb2ZiMTI4CQlPQkpfYWVzLDNMCisKKyNkZWZpbmUgU05fYWVzXzEyOF9jZmIxMjgJCSJBRVMtMTI4LUNGQiIKKyNkZWZpbmUgTE5fYWVzXzEyOF9jZmIxMjgJCSJhZXMtMTI4LWNmYiIKKyNkZWZpbmUgTklEX2Flc18xMjhfY2ZiMTI4CQk0MjEKKyNkZWZpbmUgT0JKX2Flc18xMjhfY2ZiMTI4CQlPQkpfYWVzLDRMCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9lY2IJCSJBRVMtMTkyLUVDQiIKKyNkZWZpbmUgTE5fYWVzXzE5Ml9lY2IJCSJhZXMtMTkyLWVjYiIKKyNkZWZpbmUgTklEX2Flc18xOTJfZWNiCQk0MjIKKyNkZWZpbmUgT0JKX2Flc18xOTJfZWNiCQlPQkpfYWVzLDIxTAorCisjZGVmaW5lIFNOX2Flc18xOTJfY2JjCQkiQUVTLTE5Mi1DQkMiCisjZGVmaW5lIExOX2Flc18xOTJfY2JjCQkiYWVzLTE5Mi1jYmMiCisjZGVmaW5lIE5JRF9hZXNfMTkyX2NiYwkJNDIzCisjZGVmaW5lIE9CSl9hZXNfMTkyX2NiYwkJT0JKX2FlcywyMkwKKworI2RlZmluZSBTTl9hZXNfMTkyX29mYjEyOAkJIkFFUy0xOTItT0ZCIgorI2RlZmluZSBMTl9hZXNfMTkyX29mYjEyOAkJImFlcy0xOTItb2ZiIgorI2RlZmluZSBOSURfYWVzXzE5Ml9vZmIxMjgJCTQyNAorI2RlZmluZSBPQkpfYWVzXzE5Ml9vZmIxMjgJCU9CSl9hZXMsMjNMCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9jZmIxMjgJCSJBRVMtMTkyLUNGQiIKKyNkZWZpbmUgTE5fYWVzXzE5Ml9jZmIxMjgJCSJhZXMtMTkyLWNmYiIKKyNkZWZpbmUgTklEX2Flc18xOTJfY2ZiMTI4CQk0MjUKKyNkZWZpbmUgT0JKX2Flc18xOTJfY2ZiMTI4CQlPQkpfYWVzLDI0TAorCisjZGVmaW5lIFNOX2Flc18yNTZfZWNiCQkiQUVTLTI1Ni1FQ0IiCisjZGVmaW5lIExOX2Flc18yNTZfZWNiCQkiYWVzLTI1Ni1lY2IiCisjZGVmaW5lIE5JRF9hZXNfMjU2X2VjYgkJNDI2CisjZGVmaW5lIE9CSl9hZXNfMjU2X2VjYgkJT0JKX2Flcyw0MUwKKworI2RlZmluZSBTTl9hZXNfMjU2X2NiYwkJIkFFUy0yNTYtQ0JDIgorI2RlZmluZSBMTl9hZXNfMjU2X2NiYwkJImFlcy0yNTYtY2JjIgorI2RlZmluZSBOSURfYWVzXzI1Nl9jYmMJCTQyNworI2RlZmluZSBPQkpfYWVzXzI1Nl9jYmMJCU9CSl9hZXMsNDJMCisKKyNkZWZpbmUgU05fYWVzXzI1Nl9vZmIxMjgJCSJBRVMtMjU2LU9GQiIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9vZmIxMjgJCSJhZXMtMjU2LW9mYiIKKyNkZWZpbmUgTklEX2Flc18yNTZfb2ZiMTI4CQk0MjgKKyNkZWZpbmUgT0JKX2Flc18yNTZfb2ZiMTI4CQlPQkpfYWVzLDQzTAorCisjZGVmaW5lIFNOX2Flc18yNTZfY2ZiMTI4CQkiQUVTLTI1Ni1DRkIiCisjZGVmaW5lIExOX2Flc18yNTZfY2ZiMTI4CQkiYWVzLTI1Ni1jZmIiCisjZGVmaW5lIE5JRF9hZXNfMjU2X2NmYjEyOAkJNDI5CisjZGVmaW5lIE9CSl9hZXNfMjU2X2NmYjEyOAkJT0JKX2Flcyw0NEwKKworI2RlZmluZSBTTl9hZXNfMTI4X2NmYjEJCSJBRVMtMTI4LUNGQjEiCisjZGVmaW5lIExOX2Flc18xMjhfY2ZiMQkJImFlcy0xMjgtY2ZiMSIKKyNkZWZpbmUgTklEX2Flc18xMjhfY2ZiMQkJNjUwCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9jZmIxCQkiQUVTLTE5Mi1DRkIxIgorI2RlZmluZSBMTl9hZXNfMTkyX2NmYjEJCSJhZXMtMTkyLWNmYjEiCisjZGVmaW5lIE5JRF9hZXNfMTkyX2NmYjEJCTY1MQorCisjZGVmaW5lIFNOX2Flc18yNTZfY2ZiMQkJIkFFUy0yNTYtQ0ZCMSIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9jZmIxCQkiYWVzLTI1Ni1jZmIxIgorI2RlZmluZSBOSURfYWVzXzI1Nl9jZmIxCQk2NTIKKworI2RlZmluZSBTTl9hZXNfMTI4X2NmYjgJCSJBRVMtMTI4LUNGQjgiCisjZGVmaW5lIExOX2Flc18xMjhfY2ZiOAkJImFlcy0xMjgtY2ZiOCIKKyNkZWZpbmUgTklEX2Flc18xMjhfY2ZiOAkJNjUzCisKKyNkZWZpbmUgU05fYWVzXzE5Ml9jZmI4CQkiQUVTLTE5Mi1DRkI4IgorI2RlZmluZSBMTl9hZXNfMTkyX2NmYjgJCSJhZXMtMTkyLWNmYjgiCisjZGVmaW5lIE5JRF9hZXNfMTkyX2NmYjgJCTY1NAorCisjZGVmaW5lIFNOX2Flc18yNTZfY2ZiOAkJIkFFUy0yNTYtQ0ZCOCIKKyNkZWZpbmUgTE5fYWVzXzI1Nl9jZmI4CQkiYWVzLTI1Ni1jZmI4IgorI2RlZmluZSBOSURfYWVzXzI1Nl9jZmI4CQk2NTUKKworI2RlZmluZSBTTl9kZXNfY2ZiMQkJIkRFUy1DRkIxIgorI2RlZmluZSBMTl9kZXNfY2ZiMQkJImRlcy1jZmIxIgorI2RlZmluZSBOSURfZGVzX2NmYjEJCTY1NgorCisjZGVmaW5lIFNOX2Rlc19jZmI4CQkiREVTLUNGQjgiCisjZGVmaW5lIExOX2Rlc19jZmI4CQkiZGVzLWNmYjgiCisjZGVmaW5lIE5JRF9kZXNfY2ZiOAkJNjU3CisKKyNkZWZpbmUgU05fZGVzX2VkZTNfY2ZiMQkJIkRFUy1FREUzLUNGQjEiCisjZGVmaW5lIExOX2Rlc19lZGUzX2NmYjEJCSJkZXMtZWRlMy1jZmIxIgorI2RlZmluZSBOSURfZGVzX2VkZTNfY2ZiMQkJNjU4CisKKyNkZWZpbmUgU05fZGVzX2VkZTNfY2ZiOAkJIkRFUy1FREUzLUNGQjgiCisjZGVmaW5lIExOX2Rlc19lZGUzX2NmYjgJCSJkZXMtZWRlMy1jZmI4IgorI2RlZmluZSBOSURfZGVzX2VkZTNfY2ZiOAkJNjU5CisKKyNkZWZpbmUgU05faWRfYWVzMTI4X3dyYXAJCSJpZC1hZXMxMjgtd3JhcCIKKyNkZWZpbmUgTklEX2lkX2FlczEyOF93cmFwCQk3ODgKKyNkZWZpbmUgT0JKX2lkX2FlczEyOF93cmFwCQlPQkpfYWVzLDVMCisKKyNkZWZpbmUgU05faWRfYWVzMTkyX3dyYXAJCSJpZC1hZXMxOTItd3JhcCIKKyNkZWZpbmUgTklEX2lkX2FlczE5Ml93cmFwCQk3ODkKKyNkZWZpbmUgT0JKX2lkX2FlczE5Ml93cmFwCQlPQkpfYWVzLDI1TAorCisjZGVmaW5lIFNOX2lkX2FlczI1Nl93cmFwCQkiaWQtYWVzMjU2LXdyYXAiCisjZGVmaW5lIE5JRF9pZF9hZXMyNTZfd3JhcAkJNzkwCisjZGVmaW5lIE9CSl9pZF9hZXMyNTZfd3JhcAkJT0JKX2Flcyw0NUwKKworI2RlZmluZSBPQkpfbmlzdF9oYXNoYWxncwkJT0JKX25pc3RBbGdvcml0aG1zLDJMCisKKyNkZWZpbmUgU05fc2hhMjU2CQkiU0hBMjU2IgorI2RlZmluZSBMTl9zaGEyNTYJCSJzaGEyNTYiCisjZGVmaW5lIE5JRF9zaGEyNTYJCTY3MgorI2RlZmluZSBPQkpfc2hhMjU2CQlPQkpfbmlzdF9oYXNoYWxncywxTAorCisjZGVmaW5lIFNOX3NoYTM4NAkJIlNIQTM4NCIKKyNkZWZpbmUgTE5fc2hhMzg0CQkic2hhMzg0IgorI2RlZmluZSBOSURfc2hhMzg0CQk2NzMKKyNkZWZpbmUgT0JKX3NoYTM4NAkJT0JKX25pc3RfaGFzaGFsZ3MsMkwKKworI2RlZmluZSBTTl9zaGE1MTIJCSJTSEE1MTIiCisjZGVmaW5lIExOX3NoYTUxMgkJInNoYTUxMiIKKyNkZWZpbmUgTklEX3NoYTUxMgkJNjc0CisjZGVmaW5lIE9CSl9zaGE1MTIJCU9CSl9uaXN0X2hhc2hhbGdzLDNMCisKKyNkZWZpbmUgU05fc2hhMjI0CQkiU0hBMjI0IgorI2RlZmluZSBMTl9zaGEyMjQJCSJzaGEyMjQiCisjZGVmaW5lIE5JRF9zaGEyMjQJCTY3NQorI2RlZmluZSBPQkpfc2hhMjI0CQlPQkpfbmlzdF9oYXNoYWxncyw0TAorCisjZGVmaW5lIE9CSl9kc2Ffd2l0aF9zaGEyCQlPQkpfbmlzdEFsZ29yaXRobXMsM0wKKworI2RlZmluZSBTTl9kc2Ffd2l0aF9TSEEyMjQJCSJkc2Ffd2l0aF9TSEEyMjQiCisjZGVmaW5lIE5JRF9kc2Ffd2l0aF9TSEEyMjQJCTgwMgorI2RlZmluZSBPQkpfZHNhX3dpdGhfU0hBMjI0CQlPQkpfZHNhX3dpdGhfc2hhMiwxTAorCisjZGVmaW5lIFNOX2RzYV93aXRoX1NIQTI1NgkJImRzYV93aXRoX1NIQTI1NiIKKyNkZWZpbmUgTklEX2RzYV93aXRoX1NIQTI1NgkJODAzCisjZGVmaW5lIE9CSl9kc2Ffd2l0aF9TSEEyNTYJCU9CSl9kc2Ffd2l0aF9zaGEyLDJMCisKKyNkZWZpbmUgU05faG9sZF9pbnN0cnVjdGlvbl9jb2RlCQkiaG9sZEluc3RydWN0aW9uQ29kZSIKKyNkZWZpbmUgTE5faG9sZF9pbnN0cnVjdGlvbl9jb2RlCQkiSG9sZCBJbnN0cnVjdGlvbiBDb2RlIgorI2RlZmluZSBOSURfaG9sZF9pbnN0cnVjdGlvbl9jb2RlCQk0MzAKKyNkZWZpbmUgT0JKX2hvbGRfaW5zdHJ1Y3Rpb25fY29kZQkJT0JKX2lkX2NlLDIzTAorCisjZGVmaW5lIE9CSl9ob2xkSW5zdHJ1Y3Rpb24JCU9CSl9YOV81NywyTAorCisjZGVmaW5lIFNOX2hvbGRfaW5zdHJ1Y3Rpb25fbm9uZQkJImhvbGRJbnN0cnVjdGlvbk5vbmUiCisjZGVmaW5lIExOX2hvbGRfaW5zdHJ1Y3Rpb25fbm9uZQkJIkhvbGQgSW5zdHJ1Y3Rpb24gTm9uZSIKKyNkZWZpbmUgTklEX2hvbGRfaW5zdHJ1Y3Rpb25fbm9uZQkJNDMxCisjZGVmaW5lIE9CSl9ob2xkX2luc3RydWN0aW9uX25vbmUJCU9CSl9ob2xkSW5zdHJ1Y3Rpb24sMUwKKworI2RlZmluZSBTTl9ob2xkX2luc3RydWN0aW9uX2NhbGxfaXNzdWVyCQkiaG9sZEluc3RydWN0aW9uQ2FsbElzc3VlciIKKyNkZWZpbmUgTE5faG9sZF9pbnN0cnVjdGlvbl9jYWxsX2lzc3VlcgkJIkhvbGQgSW5zdHJ1Y3Rpb24gQ2FsbCBJc3N1ZXIiCisjZGVmaW5lIE5JRF9ob2xkX2luc3RydWN0aW9uX2NhbGxfaXNzdWVyCQk0MzIKKyNkZWZpbmUgT0JKX2hvbGRfaW5zdHJ1Y3Rpb25fY2FsbF9pc3N1ZXIJCU9CSl9ob2xkSW5zdHJ1Y3Rpb24sMkwKKworI2RlZmluZSBTTl9ob2xkX2luc3RydWN0aW9uX3JlamVjdAkJImhvbGRJbnN0cnVjdGlvblJlamVjdCIKKyNkZWZpbmUgTE5faG9sZF9pbnN0cnVjdGlvbl9yZWplY3QJCSJIb2xkIEluc3RydWN0aW9uIFJlamVjdCIKKyNkZWZpbmUgTklEX2hvbGRfaW5zdHJ1Y3Rpb25fcmVqZWN0CQk0MzMKKyNkZWZpbmUgT0JKX2hvbGRfaW5zdHJ1Y3Rpb25fcmVqZWN0CQlPQkpfaG9sZEluc3RydWN0aW9uLDNMCisKKyNkZWZpbmUgU05fZGF0YQkJImRhdGEiCisjZGVmaW5lIE5JRF9kYXRhCQk0MzQKKyNkZWZpbmUgT0JKX2RhdGEJCU9CSl9pdHVfdCw5TAorCisjZGVmaW5lIFNOX3BzcwkJInBzcyIKKyNkZWZpbmUgTklEX3BzcwkJNDM1CisjZGVmaW5lIE9CSl9wc3MJCU9CSl9kYXRhLDIzNDJMCisKKyNkZWZpbmUgU05fdWNsCQkidWNsIgorI2RlZmluZSBOSURfdWNsCQk0MzYKKyNkZWZpbmUgT0JKX3VjbAkJT0JKX3BzcywxOTIwMDMwMEwKKworI2RlZmluZSBTTl9waWxvdAkJInBpbG90IgorI2RlZmluZSBOSURfcGlsb3QJCTQzNworI2RlZmluZSBPQkpfcGlsb3QJCU9CSl91Y2wsMTAwTAorCisjZGVmaW5lIExOX3BpbG90QXR0cmlidXRlVHlwZQkJInBpbG90QXR0cmlidXRlVHlwZSIKKyNkZWZpbmUgTklEX3BpbG90QXR0cmlidXRlVHlwZQkJNDM4CisjZGVmaW5lIE9CSl9waWxvdEF0dHJpYnV0ZVR5cGUJCU9CSl9waWxvdCwxTAorCisjZGVmaW5lIExOX3BpbG90QXR0cmlidXRlU3ludGF4CQkicGlsb3RBdHRyaWJ1dGVTeW50YXgiCisjZGVmaW5lIE5JRF9waWxvdEF0dHJpYnV0ZVN5bnRheAkJNDM5CisjZGVmaW5lIE9CSl9waWxvdEF0dHJpYnV0ZVN5bnRheAkJT0JKX3BpbG90LDNMCisKKyNkZWZpbmUgTE5fcGlsb3RPYmplY3RDbGFzcwkJInBpbG90T2JqZWN0Q2xhc3MiCisjZGVmaW5lIE5JRF9waWxvdE9iamVjdENsYXNzCQk0NDAKKyNkZWZpbmUgT0JKX3BpbG90T2JqZWN0Q2xhc3MJCU9CSl9waWxvdCw0TAorCisjZGVmaW5lIExOX3BpbG90R3JvdXBzCQkicGlsb3RHcm91cHMiCisjZGVmaW5lIE5JRF9waWxvdEdyb3VwcwkJNDQxCisjZGVmaW5lIE9CSl9waWxvdEdyb3VwcwkJT0JKX3BpbG90LDEwTAorCisjZGVmaW5lIExOX2lBNVN0cmluZ1N5bnRheAkJImlBNVN0cmluZ1N5bnRheCIKKyNkZWZpbmUgTklEX2lBNVN0cmluZ1N5bnRheAkJNDQyCisjZGVmaW5lIE9CSl9pQTVTdHJpbmdTeW50YXgJCU9CSl9waWxvdEF0dHJpYnV0ZVN5bnRheCw0TAorCisjZGVmaW5lIExOX2Nhc2VJZ25vcmVJQTVTdHJpbmdTeW50YXgJCSJjYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4IgorI2RlZmluZSBOSURfY2FzZUlnbm9yZUlBNVN0cmluZ1N5bnRheAkJNDQzCisjZGVmaW5lIE9CSl9jYXNlSWdub3JlSUE1U3RyaW5nU3ludGF4CQlPQkpfcGlsb3RBdHRyaWJ1dGVTeW50YXgsNUwKKworI2RlZmluZSBMTl9waWxvdE9iamVjdAkJInBpbG90T2JqZWN0IgorI2RlZmluZSBOSURfcGlsb3RPYmplY3QJCTQ0NAorI2RlZmluZSBPQkpfcGlsb3RPYmplY3QJCU9CSl9waWxvdE9iamVjdENsYXNzLDNMCisKKyNkZWZpbmUgTE5fcGlsb3RQZXJzb24JCSJwaWxvdFBlcnNvbiIKKyNkZWZpbmUgTklEX3BpbG90UGVyc29uCQk0NDUKKyNkZWZpbmUgT0JKX3BpbG90UGVyc29uCQlPQkpfcGlsb3RPYmplY3RDbGFzcyw0TAorCisjZGVmaW5lIFNOX2FjY291bnQJCSJhY2NvdW50IgorI2RlZmluZSBOSURfYWNjb3VudAkJNDQ2CisjZGVmaW5lIE9CSl9hY2NvdW50CQlPQkpfcGlsb3RPYmplY3RDbGFzcyw1TAorCisjZGVmaW5lIFNOX2RvY3VtZW50CQkiZG9jdW1lbnQiCisjZGVmaW5lIE5JRF9kb2N1bWVudAkJNDQ3CisjZGVmaW5lIE9CSl9kb2N1bWVudAkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsNkwKKworI2RlZmluZSBTTl9yb29tCQkicm9vbSIKKyNkZWZpbmUgTklEX3Jvb20JCTQ0OAorI2RlZmluZSBPQkpfcm9vbQkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsN0wKKworI2RlZmluZSBMTl9kb2N1bWVudFNlcmllcwkJImRvY3VtZW50U2VyaWVzIgorI2RlZmluZSBOSURfZG9jdW1lbnRTZXJpZXMJCTQ0OQorI2RlZmluZSBPQkpfZG9jdW1lbnRTZXJpZXMJCU9CSl9waWxvdE9iamVjdENsYXNzLDlMCisKKyNkZWZpbmUgU05fRG9tYWluCQkiZG9tYWluIgorI2RlZmluZSBMTl9Eb21haW4JCSJEb21haW4iCisjZGVmaW5lIE5JRF9Eb21haW4JCTM5MgorI2RlZmluZSBPQkpfRG9tYWluCQlPQkpfcGlsb3RPYmplY3RDbGFzcywxM0wKKworI2RlZmluZSBMTl9yRkM4MjJsb2NhbFBhcnQJCSJyRkM4MjJsb2NhbFBhcnQiCisjZGVmaW5lIE5JRF9yRkM4MjJsb2NhbFBhcnQJCTQ1MAorI2RlZmluZSBPQkpfckZDODIybG9jYWxQYXJ0CQlPQkpfcGlsb3RPYmplY3RDbGFzcywxNEwKKworI2RlZmluZSBMTl9kTlNEb21haW4JCSJkTlNEb21haW4iCisjZGVmaW5lIE5JRF9kTlNEb21haW4JCTQ1MQorI2RlZmluZSBPQkpfZE5TRG9tYWluCQlPQkpfcGlsb3RPYmplY3RDbGFzcywxNUwKKworI2RlZmluZSBMTl9kb21haW5SZWxhdGVkT2JqZWN0CQkiZG9tYWluUmVsYXRlZE9iamVjdCIKKyNkZWZpbmUgTklEX2RvbWFpblJlbGF0ZWRPYmplY3QJCTQ1MgorI2RlZmluZSBPQkpfZG9tYWluUmVsYXRlZE9iamVjdAkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsMTdMCisKKyNkZWZpbmUgTE5fZnJpZW5kbHlDb3VudHJ5CQkiZnJpZW5kbHlDb3VudHJ5IgorI2RlZmluZSBOSURfZnJpZW5kbHlDb3VudHJ5CQk0NTMKKyNkZWZpbmUgT0JKX2ZyaWVuZGx5Q291bnRyeQkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsMThMCisKKyNkZWZpbmUgTE5fc2ltcGxlU2VjdXJpdHlPYmplY3QJCSJzaW1wbGVTZWN1cml0eU9iamVjdCIKKyNkZWZpbmUgTklEX3NpbXBsZVNlY3VyaXR5T2JqZWN0CQk0NTQKKyNkZWZpbmUgT0JKX3NpbXBsZVNlY3VyaXR5T2JqZWN0CQlPQkpfcGlsb3RPYmplY3RDbGFzcywxOUwKKworI2RlZmluZSBMTl9waWxvdE9yZ2FuaXphdGlvbgkJInBpbG90T3JnYW5pemF0aW9uIgorI2RlZmluZSBOSURfcGlsb3RPcmdhbml6YXRpb24JCTQ1NQorI2RlZmluZSBPQkpfcGlsb3RPcmdhbml6YXRpb24JCU9CSl9waWxvdE9iamVjdENsYXNzLDIwTAorCisjZGVmaW5lIExOX3BpbG90RFNBCQkicGlsb3REU0EiCisjZGVmaW5lIE5JRF9waWxvdERTQQkJNDU2CisjZGVmaW5lIE9CSl9waWxvdERTQQkJT0JKX3BpbG90T2JqZWN0Q2xhc3MsMjFMCisKKyNkZWZpbmUgTE5fcXVhbGl0eUxhYmVsbGVkRGF0YQkJInF1YWxpdHlMYWJlbGxlZERhdGEiCisjZGVmaW5lIE5JRF9xdWFsaXR5TGFiZWxsZWREYXRhCQk0NTcKKyNkZWZpbmUgT0JKX3F1YWxpdHlMYWJlbGxlZERhdGEJCU9CSl9waWxvdE9iamVjdENsYXNzLDIyTAorCisjZGVmaW5lIFNOX3VzZXJJZAkJIlVJRCIKKyNkZWZpbmUgTE5fdXNlcklkCQkidXNlcklkIgorI2RlZmluZSBOSURfdXNlcklkCQk0NTgKKyNkZWZpbmUgT0JKX3VzZXJJZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwxTAorCisjZGVmaW5lIExOX3RleHRFbmNvZGVkT1JBZGRyZXNzCQkidGV4dEVuY29kZWRPUkFkZHJlc3MiCisjZGVmaW5lIE5JRF90ZXh0RW5jb2RlZE9SQWRkcmVzcwkJNDU5CisjZGVmaW5lIE9CSl90ZXh0RW5jb2RlZE9SQWRkcmVzcwkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyTAorCisjZGVmaW5lIFNOX3JmYzgyMk1haWxib3gJCSJtYWlsIgorI2RlZmluZSBMTl9yZmM4MjJNYWlsYm94CQkicmZjODIyTWFpbGJveCIKKyNkZWZpbmUgTklEX3JmYzgyMk1haWxib3gJCTQ2MAorI2RlZmluZSBPQkpfcmZjODIyTWFpbGJveAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwzTAorCisjZGVmaW5lIFNOX2luZm8JCSJpbmZvIgorI2RlZmluZSBOSURfaW5mbwkJNDYxCisjZGVmaW5lIE9CSl9pbmZvCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDRMCisKKyNkZWZpbmUgTE5fZmF2b3VyaXRlRHJpbmsJCSJmYXZvdXJpdGVEcmluayIKKyNkZWZpbmUgTklEX2Zhdm91cml0ZURyaW5rCQk0NjIKKyNkZWZpbmUgT0JKX2Zhdm91cml0ZURyaW5rCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDVMCisKKyNkZWZpbmUgTE5fcm9vbU51bWJlcgkJInJvb21OdW1iZXIiCisjZGVmaW5lIE5JRF9yb29tTnVtYmVyCQk0NjMKKyNkZWZpbmUgT0JKX3Jvb21OdW1iZXIJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNkwKKworI2RlZmluZSBTTl9waG90bwkJInBob3RvIgorI2RlZmluZSBOSURfcGhvdG8JCTQ2NAorI2RlZmluZSBPQkpfcGhvdG8JCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsN0wKKworI2RlZmluZSBMTl91c2VyQ2xhc3MJCSJ1c2VyQ2xhc3MiCisjZGVmaW5lIE5JRF91c2VyQ2xhc3MJCTQ2NQorI2RlZmluZSBPQkpfdXNlckNsYXNzCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDhMCisKKyNkZWZpbmUgU05faG9zdAkJImhvc3QiCisjZGVmaW5lIE5JRF9ob3N0CQk0NjYKKyNkZWZpbmUgT0JKX2hvc3QJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsOUwKKworI2RlZmluZSBTTl9tYW5hZ2VyCQkibWFuYWdlciIKKyNkZWZpbmUgTklEX21hbmFnZXIJCTQ2NworI2RlZmluZSBPQkpfbWFuYWdlcgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwxMEwKKworI2RlZmluZSBMTl9kb2N1bWVudElkZW50aWZpZXIJCSJkb2N1bWVudElkZW50aWZpZXIiCisjZGVmaW5lIE5JRF9kb2N1bWVudElkZW50aWZpZXIJCTQ2OAorI2RlZmluZSBPQkpfZG9jdW1lbnRJZGVudGlmaWVyCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDExTAorCisjZGVmaW5lIExOX2RvY3VtZW50VGl0bGUJCSJkb2N1bWVudFRpdGxlIgorI2RlZmluZSBOSURfZG9jdW1lbnRUaXRsZQkJNDY5CisjZGVmaW5lIE9CSl9kb2N1bWVudFRpdGxlCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDEyTAorCisjZGVmaW5lIExOX2RvY3VtZW50VmVyc2lvbgkJImRvY3VtZW50VmVyc2lvbiIKKyNkZWZpbmUgTklEX2RvY3VtZW50VmVyc2lvbgkJNDcwCisjZGVmaW5lIE9CSl9kb2N1bWVudFZlcnNpb24JCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMTNMCisKKyNkZWZpbmUgTE5fZG9jdW1lbnRBdXRob3IJCSJkb2N1bWVudEF1dGhvciIKKyNkZWZpbmUgTklEX2RvY3VtZW50QXV0aG9yCQk0NzEKKyNkZWZpbmUgT0JKX2RvY3VtZW50QXV0aG9yCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDE0TAorCisjZGVmaW5lIExOX2RvY3VtZW50TG9jYXRpb24JCSJkb2N1bWVudExvY2F0aW9uIgorI2RlZmluZSBOSURfZG9jdW1lbnRMb2NhdGlvbgkJNDcyCisjZGVmaW5lIE9CSl9kb2N1bWVudExvY2F0aW9uCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDE1TAorCisjZGVmaW5lIExOX2hvbWVUZWxlcGhvbmVOdW1iZXIJCSJob21lVGVsZXBob25lTnVtYmVyIgorI2RlZmluZSBOSURfaG9tZVRlbGVwaG9uZU51bWJlcgkJNDczCisjZGVmaW5lIE9CSl9ob21lVGVsZXBob25lTnVtYmVyCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDIwTAorCisjZGVmaW5lIFNOX3NlY3JldGFyeQkJInNlY3JldGFyeSIKKyNkZWZpbmUgTklEX3NlY3JldGFyeQkJNDc0CisjZGVmaW5lIE9CSl9zZWNyZXRhcnkJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjFMCisKKyNkZWZpbmUgTE5fb3RoZXJNYWlsYm94CQkib3RoZXJNYWlsYm94IgorI2RlZmluZSBOSURfb3RoZXJNYWlsYm94CQk0NzUKKyNkZWZpbmUgT0JKX290aGVyTWFpbGJveAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyMkwKKworI2RlZmluZSBMTl9sYXN0TW9kaWZpZWRUaW1lCQkibGFzdE1vZGlmaWVkVGltZSIKKyNkZWZpbmUgTklEX2xhc3RNb2RpZmllZFRpbWUJCTQ3NgorI2RlZmluZSBPQkpfbGFzdE1vZGlmaWVkVGltZQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyM0wKKworI2RlZmluZSBMTl9sYXN0TW9kaWZpZWRCeQkJImxhc3RNb2RpZmllZEJ5IgorI2RlZmluZSBOSURfbGFzdE1vZGlmaWVkQnkJCTQ3NworI2RlZmluZSBPQkpfbGFzdE1vZGlmaWVkQnkJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjRMCisKKyNkZWZpbmUgU05fZG9tYWluQ29tcG9uZW50CQkiREMiCisjZGVmaW5lIExOX2RvbWFpbkNvbXBvbmVudAkJImRvbWFpbkNvbXBvbmVudCIKKyNkZWZpbmUgTklEX2RvbWFpbkNvbXBvbmVudAkJMzkxCisjZGVmaW5lIE9CSl9kb21haW5Db21wb25lbnQJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjVMCisKKyNkZWZpbmUgTE5fYVJlY29yZAkJImFSZWNvcmQiCisjZGVmaW5lIE5JRF9hUmVjb3JkCQk0NzgKKyNkZWZpbmUgT0JKX2FSZWNvcmQJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjZMCisKKyNkZWZpbmUgTE5fcGlsb3RBdHRyaWJ1dGVUeXBlMjcJCSJwaWxvdEF0dHJpYnV0ZVR5cGUyNyIKKyNkZWZpbmUgTklEX3BpbG90QXR0cmlidXRlVHlwZTI3CQk0NzkKKyNkZWZpbmUgT0JKX3BpbG90QXR0cmlidXRlVHlwZTI3CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDI3TAorCisjZGVmaW5lIExOX21YUmVjb3JkCQkibVhSZWNvcmQiCisjZGVmaW5lIE5JRF9tWFJlY29yZAkJNDgwCisjZGVmaW5lIE9CSl9tWFJlY29yZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwyOEwKKworI2RlZmluZSBMTl9uU1JlY29yZAkJIm5TUmVjb3JkIgorI2RlZmluZSBOSURfblNSZWNvcmQJCTQ4MQorI2RlZmluZSBPQkpfblNSZWNvcmQJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMjlMCisKKyNkZWZpbmUgTE5fc09BUmVjb3JkCQkic09BUmVjb3JkIgorI2RlZmluZSBOSURfc09BUmVjb3JkCQk0ODIKKyNkZWZpbmUgT0JKX3NPQVJlY29yZAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwzMEwKKworI2RlZmluZSBMTl9jTkFNRVJlY29yZAkJImNOQU1FUmVjb3JkIgorI2RlZmluZSBOSURfY05BTUVSZWNvcmQJCTQ4MworI2RlZmluZSBPQkpfY05BTUVSZWNvcmQJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMzFMCisKKyNkZWZpbmUgTE5fYXNzb2NpYXRlZERvbWFpbgkJImFzc29jaWF0ZWREb21haW4iCisjZGVmaW5lIE5JRF9hc3NvY2lhdGVkRG9tYWluCQk0ODQKKyNkZWZpbmUgT0JKX2Fzc29jaWF0ZWREb21haW4JCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsMzdMCisKKyNkZWZpbmUgTE5fYXNzb2NpYXRlZE5hbWUJCSJhc3NvY2lhdGVkTmFtZSIKKyNkZWZpbmUgTklEX2Fzc29jaWF0ZWROYW1lCQk0ODUKKyNkZWZpbmUgT0JKX2Fzc29jaWF0ZWROYW1lCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDM4TAorCisjZGVmaW5lIExOX2hvbWVQb3N0YWxBZGRyZXNzCQkiaG9tZVBvc3RhbEFkZHJlc3MiCisjZGVmaW5lIE5JRF9ob21lUG9zdGFsQWRkcmVzcwkJNDg2CisjZGVmaW5lIE9CSl9ob21lUG9zdGFsQWRkcmVzcwkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSwzOUwKKworI2RlZmluZSBMTl9wZXJzb25hbFRpdGxlCQkicGVyc29uYWxUaXRsZSIKKyNkZWZpbmUgTklEX3BlcnNvbmFsVGl0bGUJCTQ4NworI2RlZmluZSBPQkpfcGVyc29uYWxUaXRsZQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0MEwKKworI2RlZmluZSBMTl9tb2JpbGVUZWxlcGhvbmVOdW1iZXIJCSJtb2JpbGVUZWxlcGhvbmVOdW1iZXIiCisjZGVmaW5lIE5JRF9tb2JpbGVUZWxlcGhvbmVOdW1iZXIJCTQ4OAorI2RlZmluZSBPQkpfbW9iaWxlVGVsZXBob25lTnVtYmVyCQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDQxTAorCisjZGVmaW5lIExOX3BhZ2VyVGVsZXBob25lTnVtYmVyCQkicGFnZXJUZWxlcGhvbmVOdW1iZXIiCisjZGVmaW5lIE5JRF9wYWdlclRlbGVwaG9uZU51bWJlcgkJNDg5CisjZGVmaW5lIE9CSl9wYWdlclRlbGVwaG9uZU51bWJlcgkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0MkwKKworI2RlZmluZSBMTl9mcmllbmRseUNvdW50cnlOYW1lCQkiZnJpZW5kbHlDb3VudHJ5TmFtZSIKKyNkZWZpbmUgTklEX2ZyaWVuZGx5Q291bnRyeU5hbWUJCTQ5MAorI2RlZmluZSBPQkpfZnJpZW5kbHlDb3VudHJ5TmFtZQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0M0wKKworI2RlZmluZSBMTl9vcmdhbml6YXRpb25hbFN0YXR1cwkJIm9yZ2FuaXphdGlvbmFsU3RhdHVzIgorI2RlZmluZSBOSURfb3JnYW5pemF0aW9uYWxTdGF0dXMJCTQ5MQorI2RlZmluZSBPQkpfb3JnYW5pemF0aW9uYWxTdGF0dXMJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNDVMCisKKyNkZWZpbmUgTE5famFuZXRNYWlsYm94CQkiamFuZXRNYWlsYm94IgorI2RlZmluZSBOSURfamFuZXRNYWlsYm94CQk0OTIKKyNkZWZpbmUgT0JKX2phbmV0TWFpbGJveAkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0NkwKKworI2RlZmluZSBMTl9tYWlsUHJlZmVyZW5jZU9wdGlvbgkJIm1haWxQcmVmZXJlbmNlT3B0aW9uIgorI2RlZmluZSBOSURfbWFpbFByZWZlcmVuY2VPcHRpb24JCTQ5MworI2RlZmluZSBPQkpfbWFpbFByZWZlcmVuY2VPcHRpb24JCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNDdMCisKKyNkZWZpbmUgTE5fYnVpbGRpbmdOYW1lCQkiYnVpbGRpbmdOYW1lIgorI2RlZmluZSBOSURfYnVpbGRpbmdOYW1lCQk0OTQKKyNkZWZpbmUgT0JKX2J1aWxkaW5nTmFtZQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0OEwKKworI2RlZmluZSBMTl9kU0FRdWFsaXR5CQkiZFNBUXVhbGl0eSIKKyNkZWZpbmUgTklEX2RTQVF1YWxpdHkJCTQ5NQorI2RlZmluZSBPQkpfZFNBUXVhbGl0eQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw0OUwKKworI2RlZmluZSBMTl9zaW5nbGVMZXZlbFF1YWxpdHkJCSJzaW5nbGVMZXZlbFF1YWxpdHkiCisjZGVmaW5lIE5JRF9zaW5nbGVMZXZlbFF1YWxpdHkJCTQ5NgorI2RlZmluZSBPQkpfc2luZ2xlTGV2ZWxRdWFsaXR5CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDUwTAorCisjZGVmaW5lIExOX3N1YnRyZWVNaW5pbXVtUXVhbGl0eQkJInN1YnRyZWVNaW5pbXVtUXVhbGl0eSIKKyNkZWZpbmUgTklEX3N1YnRyZWVNaW5pbXVtUXVhbGl0eQkJNDk3CisjZGVmaW5lIE9CSl9zdWJ0cmVlTWluaW11bVF1YWxpdHkJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNTFMCisKKyNkZWZpbmUgTE5fc3VidHJlZU1heGltdW1RdWFsaXR5CQkic3VidHJlZU1heGltdW1RdWFsaXR5IgorI2RlZmluZSBOSURfc3VidHJlZU1heGltdW1RdWFsaXR5CQk0OTgKKyNkZWZpbmUgT0JKX3N1YnRyZWVNYXhpbXVtUXVhbGl0eQkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw1MkwKKworI2RlZmluZSBMTl9wZXJzb25hbFNpZ25hdHVyZQkJInBlcnNvbmFsU2lnbmF0dXJlIgorI2RlZmluZSBOSURfcGVyc29uYWxTaWduYXR1cmUJCTQ5OQorI2RlZmluZSBPQkpfcGVyc29uYWxTaWduYXR1cmUJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNTNMCisKKyNkZWZpbmUgTE5fZElUUmVkaXJlY3QJCSJkSVRSZWRpcmVjdCIKKyNkZWZpbmUgTklEX2RJVFJlZGlyZWN0CQk1MDAKKyNkZWZpbmUgT0JKX2RJVFJlZGlyZWN0CQlPQkpfcGlsb3RBdHRyaWJ1dGVUeXBlLDU0TAorCisjZGVmaW5lIFNOX2F1ZGlvCQkiYXVkaW8iCisjZGVmaW5lIE5JRF9hdWRpbwkJNTAxCisjZGVmaW5lIE9CSl9hdWRpbwkJT0JKX3BpbG90QXR0cmlidXRlVHlwZSw1NUwKKworI2RlZmluZSBMTl9kb2N1bWVudFB1Ymxpc2hlcgkJImRvY3VtZW50UHVibGlzaGVyIgorI2RlZmluZSBOSURfZG9jdW1lbnRQdWJsaXNoZXIJCTUwMgorI2RlZmluZSBPQkpfZG9jdW1lbnRQdWJsaXNoZXIJCU9CSl9waWxvdEF0dHJpYnV0ZVR5cGUsNTZMCisKKyNkZWZpbmUgU05faWRfc2V0CQkiaWQtc2V0IgorI2RlZmluZSBMTl9pZF9zZXQJCSJTZWN1cmUgRWxlY3Ryb25pYyBUcmFuc2FjdGlvbnMiCisjZGVmaW5lIE5JRF9pZF9zZXQJCTUxMgorI2RlZmluZSBPQkpfaWRfc2V0CQlPQkpfaW50ZXJuYXRpb25hbF9vcmdhbml6YXRpb25zLDQyTAorCisjZGVmaW5lIFNOX3NldF9jdHlwZQkJInNldC1jdHlwZSIKKyNkZWZpbmUgTE5fc2V0X2N0eXBlCQkiY29udGVudCB0eXBlcyIKKyNkZWZpbmUgTklEX3NldF9jdHlwZQkJNTEzCisjZGVmaW5lIE9CSl9zZXRfY3R5cGUJCU9CSl9pZF9zZXQsMEwKKworI2RlZmluZSBTTl9zZXRfbXNnRXh0CQkic2V0LW1zZ0V4dCIKKyNkZWZpbmUgTE5fc2V0X21zZ0V4dAkJIm1lc3NhZ2UgZXh0ZW5zaW9ucyIKKyNkZWZpbmUgTklEX3NldF9tc2dFeHQJCTUxNAorI2RlZmluZSBPQkpfc2V0X21zZ0V4dAkJT0JKX2lkX3NldCwxTAorCisjZGVmaW5lIFNOX3NldF9hdHRyCQkic2V0LWF0dHIiCisjZGVmaW5lIE5JRF9zZXRfYXR0cgkJNTE1CisjZGVmaW5lIE9CSl9zZXRfYXR0cgkJT0JKX2lkX3NldCwzTAorCisjZGVmaW5lIFNOX3NldF9wb2xpY3kJCSJzZXQtcG9saWN5IgorI2RlZmluZSBOSURfc2V0X3BvbGljeQkJNTE2CisjZGVmaW5lIE9CSl9zZXRfcG9saWN5CQlPQkpfaWRfc2V0LDVMCisKKyNkZWZpbmUgU05fc2V0X2NlcnRFeHQJCSJzZXQtY2VydEV4dCIKKyNkZWZpbmUgTE5fc2V0X2NlcnRFeHQJCSJjZXJ0aWZpY2F0ZSBleHRlbnNpb25zIgorI2RlZmluZSBOSURfc2V0X2NlcnRFeHQJCTUxNworI2RlZmluZSBPQkpfc2V0X2NlcnRFeHQJCU9CSl9pZF9zZXQsN0wKKworI2RlZmluZSBTTl9zZXRfYnJhbmQJCSJzZXQtYnJhbmQiCisjZGVmaW5lIE5JRF9zZXRfYnJhbmQJCTUxOAorI2RlZmluZSBPQkpfc2V0X2JyYW5kCQlPQkpfaWRfc2V0LDhMCisKKyNkZWZpbmUgU05fc2V0Y3RfUEFORGF0YQkJInNldGN0LVBBTkRhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9QQU5EYXRhCQk1MTkKKyNkZWZpbmUgT0JKX3NldGN0X1BBTkRhdGEJCU9CSl9zZXRfY3R5cGUsMEwKKworI2RlZmluZSBTTl9zZXRjdF9QQU5Ub2tlbgkJInNldGN0LVBBTlRva2VuIgorI2RlZmluZSBOSURfc2V0Y3RfUEFOVG9rZW4JCTUyMAorI2RlZmluZSBPQkpfc2V0Y3RfUEFOVG9rZW4JCU9CSl9zZXRfY3R5cGUsMUwKKworI2RlZmluZSBTTl9zZXRjdF9QQU5Pbmx5CQkic2V0Y3QtUEFOT25seSIKKyNkZWZpbmUgTklEX3NldGN0X1BBTk9ubHkJCTUyMQorI2RlZmluZSBPQkpfc2V0Y3RfUEFOT25seQkJT0JKX3NldF9jdHlwZSwyTAorCisjZGVmaW5lIFNOX3NldGN0X09JRGF0YQkJInNldGN0LU9JRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X09JRGF0YQkJNTIyCisjZGVmaW5lIE9CSl9zZXRjdF9PSURhdGEJCU9CSl9zZXRfY3R5cGUsM0wKKworI2RlZmluZSBTTl9zZXRjdF9QSQkJInNldGN0LVBJIgorI2RlZmluZSBOSURfc2V0Y3RfUEkJCTUyMworI2RlZmluZSBPQkpfc2V0Y3RfUEkJCU9CSl9zZXRfY3R5cGUsNEwKKworI2RlZmluZSBTTl9zZXRjdF9QSURhdGEJCSJzZXRjdC1QSURhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9QSURhdGEJCTUyNAorI2RlZmluZSBPQkpfc2V0Y3RfUElEYXRhCQlPQkpfc2V0X2N0eXBlLDVMCisKKyNkZWZpbmUgU05fc2V0Y3RfUElEYXRhVW5zaWduZWQJCSJzZXRjdC1QSURhdGFVbnNpZ25lZCIKKyNkZWZpbmUgTklEX3NldGN0X1BJRGF0YVVuc2lnbmVkCQk1MjUKKyNkZWZpbmUgT0JKX3NldGN0X1BJRGF0YVVuc2lnbmVkCQlPQkpfc2V0X2N0eXBlLDZMCisKKyNkZWZpbmUgU05fc2V0Y3RfSE9ESW5wdXQJCSJzZXRjdC1IT0RJbnB1dCIKKyNkZWZpbmUgTklEX3NldGN0X0hPRElucHV0CQk1MjYKKyNkZWZpbmUgT0JKX3NldGN0X0hPRElucHV0CQlPQkpfc2V0X2N0eXBlLDdMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJlc0JhZ2dhZ2UJCSJzZXRjdC1BdXRoUmVzQmFnZ2FnZSIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXNCYWdnYWdlCQk1MjcKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXNCYWdnYWdlCQlPQkpfc2V0X2N0eXBlLDhMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJldlJlcUJhZ2dhZ2UJCSJzZXRjdC1BdXRoUmV2UmVxQmFnZ2FnZSIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXZSZXFCYWdnYWdlCQk1MjgKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXZSZXFCYWdnYWdlCQlPQkpfc2V0X2N0eXBlLDlMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJldlJlc0JhZ2dhZ2UJCSJzZXRjdC1BdXRoUmV2UmVzQmFnZ2FnZSIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXZSZXNCYWdnYWdlCQk1MjkKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXZSZXNCYWdnYWdlCQlPQkpfc2V0X2N0eXBlLDEwTAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFRva2VuU2VxCQkic2V0Y3QtQ2FwVG9rZW5TZXEiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBUb2tlblNlcQkJNTMwCisjZGVmaW5lIE9CSl9zZXRjdF9DYXBUb2tlblNlcQkJT0JKX3NldF9jdHlwZSwxMUwKKworI2RlZmluZSBTTl9zZXRjdF9QSW5pdFJlc0RhdGEJCSJzZXRjdC1QSW5pdFJlc0RhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9QSW5pdFJlc0RhdGEJCTUzMQorI2RlZmluZSBPQkpfc2V0Y3RfUEluaXRSZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDEyTAorCisjZGVmaW5lIFNOX3NldGN0X1BJX1RCUwkJInNldGN0LVBJLVRCUyIKKyNkZWZpbmUgTklEX3NldGN0X1BJX1RCUwkJNTMyCisjZGVmaW5lIE9CSl9zZXRjdF9QSV9UQlMJCU9CSl9zZXRfY3R5cGUsMTNMCisKKyNkZWZpbmUgU05fc2V0Y3RfUFJlc0RhdGEJCSJzZXRjdC1QUmVzRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X1BSZXNEYXRhCQk1MzMKKyNkZWZpbmUgT0JKX3NldGN0X1BSZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDE0TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXFUQlMJCSJzZXRjdC1BdXRoUmVxVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJlcVRCUwkJNTM0CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmVxVEJTCQlPQkpfc2V0X2N0eXBlLDE2TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXNUQlMJCSJzZXRjdC1BdXRoUmVzVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJlc1RCUwkJNTM1CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmVzVEJTCQlPQkpfc2V0X2N0eXBlLDE3TAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXNUQlNYCQkic2V0Y3QtQXV0aFJlc1RCU1giCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVzVEJTWAkJNTM2CisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmVzVEJTWAkJT0JKX3NldF9jdHlwZSwxOEwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoVG9rZW5UQlMJCSJzZXRjdC1BdXRoVG9rZW5UQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoVG9rZW5UQlMJCTUzNworI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFRva2VuVEJTCQlPQkpfc2V0X2N0eXBlLDE5TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFRva2VuRGF0YQkJInNldGN0LUNhcFRva2VuRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFRva2VuRGF0YQkJNTM4CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBUb2tlbkRhdGEJCU9CSl9zZXRfY3R5cGUsMjBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwVG9rZW5UQlMJCSJzZXRjdC1DYXBUb2tlblRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFRva2VuVEJTCQk1MzkKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFRva2VuVEJTCQlPQkpfc2V0X2N0eXBlLDIxTAorCisjZGVmaW5lIFNOX3NldGN0X0FjcUNhcmRDb2RlTXNnCQkic2V0Y3QtQWNxQ2FyZENvZGVNc2ciCisjZGVmaW5lIE5JRF9zZXRjdF9BY3FDYXJkQ29kZU1zZwkJNTQwCisjZGVmaW5lIE9CSl9zZXRjdF9BY3FDYXJkQ29kZU1zZwkJT0JKX3NldF9jdHlwZSwyMkwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVxVEJTCQkic2V0Y3QtQXV0aFJldlJlcVRCUyIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXZSZXFUQlMJCTU0MQorI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlcVRCUwkJT0JKX3NldF9jdHlwZSwyM0wKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVzRGF0YQkJInNldGN0LUF1dGhSZXZSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlc0RhdGEJCTU0MgorI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsMjRMCisKKyNkZWZpbmUgU05fc2V0Y3RfQXV0aFJldlJlc1RCUwkJInNldGN0LUF1dGhSZXZSZXNUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmV2UmVzVEJTCQk1NDMKKyNkZWZpbmUgT0JKX3NldGN0X0F1dGhSZXZSZXNUQlMJCU9CSl9zZXRfY3R5cGUsMjVMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmVxVEJTCQkic2V0Y3QtQ2FwUmVxVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmVxVEJTCQk1NDQKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJlcVRCUwkJT0JKX3NldF9jdHlwZSwyNkwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXFUQlNYCQkic2V0Y3QtQ2FwUmVxVEJTWCIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJlcVRCU1gJCTU0NQorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmVxVEJTWAkJT0JKX3NldF9jdHlwZSwyN0wKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXNEYXRhCQkic2V0Y3QtQ2FwUmVzRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJlc0RhdGEJCTU0NgorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmVzRGF0YQkJT0JKX3NldF9jdHlwZSwyOEwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXZSZXFUQlMJCSJzZXRjdC1DYXBSZXZSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXZSZXFUQlMJCTU0NworI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmV2UmVxVEJTCQlPQkpfc2V0X2N0eXBlLDI5TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJldlJlcVRCU1gJCSJzZXRjdC1DYXBSZXZSZXFUQlNYIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmV2UmVxVEJTWAkJNTQ4CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXZSZXFUQlNYCQlPQkpfc2V0X2N0eXBlLDMwTAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJldlJlc0RhdGEJCSJzZXRjdC1DYXBSZXZSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmV2UmVzRGF0YQkJNTQ5CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXZSZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDMxTAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXFUQlMJCSJzZXRjdC1DcmVkUmVxVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJlcVRCUwkJNTUwCisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmVxVEJTCQlPQkpfc2V0X2N0eXBlLDMyTAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXFUQlNYCQkic2V0Y3QtQ3JlZFJlcVRCU1giCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmVxVEJTWAkJNTUxCisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmVxVEJTWAkJT0JKX3NldF9jdHlwZSwzM0wKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmVzRGF0YQkJInNldGN0LUNyZWRSZXNEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJlc0RhdGEJCTU1MgorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJlc0RhdGEJCU9CSl9zZXRfY3R5cGUsMzRMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJldlJlcVRCUwkJInNldGN0LUNyZWRSZXZSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmV2UmVxVEJTCQk1NTMKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXZSZXFUQlMJCU9CSl9zZXRfY3R5cGUsMzVMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJldlJlcVRCU1gJCSJzZXRjdC1DcmVkUmV2UmVxVEJTWCIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXZSZXFUQlNYCQk1NTQKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXZSZXFUQlNYCQlPQkpfc2V0X2N0eXBlLDM2TAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXZSZXNEYXRhCQkic2V0Y3QtQ3JlZFJldlJlc0RhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmV2UmVzRGF0YQkJNTU1CisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmV2UmVzRGF0YQkJT0JKX3NldF9jdHlwZSwzN0wKKworI2RlZmluZSBTTl9zZXRjdF9QQ2VydFJlcURhdGEJCSJzZXRjdC1QQ2VydFJlcURhdGEiCisjZGVmaW5lIE5JRF9zZXRjdF9QQ2VydFJlcURhdGEJCTU1NgorI2RlZmluZSBPQkpfc2V0Y3RfUENlcnRSZXFEYXRhCQlPQkpfc2V0X2N0eXBlLDM4TAorCisjZGVmaW5lIFNOX3NldGN0X1BDZXJ0UmVzVEJTCQkic2V0Y3QtUENlcnRSZXNUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9QQ2VydFJlc1RCUwkJNTU3CisjZGVmaW5lIE9CSl9zZXRjdF9QQ2VydFJlc1RCUwkJT0JKX3NldF9jdHlwZSwzOUwKKworI2RlZmluZSBTTl9zZXRjdF9CYXRjaEFkbWluUmVxRGF0YQkJInNldGN0LUJhdGNoQWRtaW5SZXFEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQmF0Y2hBZG1pblJlcURhdGEJCTU1OAorI2RlZmluZSBPQkpfc2V0Y3RfQmF0Y2hBZG1pblJlcURhdGEJCU9CSl9zZXRfY3R5cGUsNDBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQmF0Y2hBZG1pblJlc0RhdGEJCSJzZXRjdC1CYXRjaEFkbWluUmVzRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X0JhdGNoQWRtaW5SZXNEYXRhCQk1NTkKKyNkZWZpbmUgT0JKX3NldGN0X0JhdGNoQWRtaW5SZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDQxTAorCisjZGVmaW5lIFNOX3NldGN0X0NhcmRDSW5pdFJlc1RCUwkJInNldGN0LUNhcmRDSW5pdFJlc1RCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NhcmRDSW5pdFJlc1RCUwkJNTYwCisjZGVmaW5lIE9CSl9zZXRjdF9DYXJkQ0luaXRSZXNUQlMJCU9CSl9zZXRfY3R5cGUsNDJMCisKKyNkZWZpbmUgU05fc2V0Y3RfTWVBcUNJbml0UmVzVEJTCQkic2V0Y3QtTWVBcUNJbml0UmVzVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfTWVBcUNJbml0UmVzVEJTCQk1NjEKKyNkZWZpbmUgT0JKX3NldGN0X01lQXFDSW5pdFJlc1RCUwkJT0JKX3NldF9jdHlwZSw0M0wKKworI2RlZmluZSBTTl9zZXRjdF9SZWdGb3JtUmVzVEJTCQkic2V0Y3QtUmVnRm9ybVJlc1RCUyIKKyNkZWZpbmUgTklEX3NldGN0X1JlZ0Zvcm1SZXNUQlMJCTU2MgorI2RlZmluZSBPQkpfc2V0Y3RfUmVnRm9ybVJlc1RCUwkJT0JKX3NldF9jdHlwZSw0NEwKKworI2RlZmluZSBTTl9zZXRjdF9DZXJ0UmVxRGF0YQkJInNldGN0LUNlcnRSZXFEYXRhIgorI2RlZmluZSBOSURfc2V0Y3RfQ2VydFJlcURhdGEJCTU2MworI2RlZmluZSBPQkpfc2V0Y3RfQ2VydFJlcURhdGEJCU9CSl9zZXRfY3R5cGUsNDVMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2VydFJlcVRCUwkJInNldGN0LUNlcnRSZXFUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DZXJ0UmVxVEJTCQk1NjQKKyNkZWZpbmUgT0JKX3NldGN0X0NlcnRSZXFUQlMJCU9CSl9zZXRfY3R5cGUsNDZMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2VydFJlc0RhdGEJCSJzZXRjdC1DZXJ0UmVzRGF0YSIKKyNkZWZpbmUgTklEX3NldGN0X0NlcnRSZXNEYXRhCQk1NjUKKyNkZWZpbmUgT0JKX3NldGN0X0NlcnRSZXNEYXRhCQlPQkpfc2V0X2N0eXBlLDQ3TAorCisjZGVmaW5lIFNOX3NldGN0X0NlcnRJbnFSZXFUQlMJCSJzZXRjdC1DZXJ0SW5xUmVxVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQ2VydElucVJlcVRCUwkJNTY2CisjZGVmaW5lIE9CSl9zZXRjdF9DZXJ0SW5xUmVxVEJTCQlPQkpfc2V0X2N0eXBlLDQ4TAorCisjZGVmaW5lIFNOX3NldGN0X0Vycm9yVEJTCQkic2V0Y3QtRXJyb3JUQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9FcnJvclRCUwkJNTY3CisjZGVmaW5lIE9CSl9zZXRjdF9FcnJvclRCUwkJT0JKX3NldF9jdHlwZSw0OUwKKworI2RlZmluZSBTTl9zZXRjdF9QSUR1YWxTaWduZWRUQkUJCSJzZXRjdC1QSUR1YWxTaWduZWRUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9QSUR1YWxTaWduZWRUQkUJCTU2OAorI2RlZmluZSBPQkpfc2V0Y3RfUElEdWFsU2lnbmVkVEJFCQlPQkpfc2V0X2N0eXBlLDUwTAorCisjZGVmaW5lIFNOX3NldGN0X1BJVW5zaWduZWRUQkUJCSJzZXRjdC1QSVVuc2lnbmVkVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfUElVbnNpZ25lZFRCRQkJNTY5CisjZGVmaW5lIE9CSl9zZXRjdF9QSVVuc2lnbmVkVEJFCQlPQkpfc2V0X2N0eXBlLDUxTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXFUQkUJCSJzZXRjdC1BdXRoUmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJlcVRCRQkJNTcwCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmVxVEJFCQlPQkpfc2V0X2N0eXBlLDUyTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXNUQkUJCSJzZXRjdC1BdXRoUmVzVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJlc1RCRQkJNTcxCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmVzVEJFCQlPQkpfc2V0X2N0eXBlLDUzTAorCisjZGVmaW5lIFNOX3NldGN0X0F1dGhSZXNUQkVYCQkic2V0Y3QtQXV0aFJlc1RCRVgiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoUmVzVEJFWAkJNTcyCisjZGVmaW5lIE9CSl9zZXRjdF9BdXRoUmVzVEJFWAkJT0JKX3NldF9jdHlwZSw1NEwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoVG9rZW5UQkUJCSJzZXRjdC1BdXRoVG9rZW5UQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9BdXRoVG9rZW5UQkUJCTU3MworI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFRva2VuVEJFCQlPQkpfc2V0X2N0eXBlLDU1TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFRva2VuVEJFCQkic2V0Y3QtQ2FwVG9rZW5UQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBUb2tlblRCRQkJNTc0CisjZGVmaW5lIE9CSl9zZXRjdF9DYXBUb2tlblRCRQkJT0JKX3NldF9jdHlwZSw1NkwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBUb2tlblRCRVgJCSJzZXRjdC1DYXBUb2tlblRCRVgiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBUb2tlblRCRVgJCTU3NQorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwVG9rZW5UQkVYCQlPQkpfc2V0X2N0eXBlLDU3TAorCisjZGVmaW5lIFNOX3NldGN0X0FjcUNhcmRDb2RlTXNnVEJFCQkic2V0Y3QtQWNxQ2FyZENvZGVNc2dUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9BY3FDYXJkQ29kZU1zZ1RCRQkJNTc2CisjZGVmaW5lIE9CSl9zZXRjdF9BY3FDYXJkQ29kZU1zZ1RCRQkJT0JKX3NldF9jdHlwZSw1OEwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVxVEJFCQkic2V0Y3QtQXV0aFJldlJlcVRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXZSZXFUQkUJCTU3NworI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlcVRCRQkJT0JKX3NldF9jdHlwZSw1OUwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVzVEJFCQkic2V0Y3QtQXV0aFJldlJlc1RCRSIKKyNkZWZpbmUgTklEX3NldGN0X0F1dGhSZXZSZXNUQkUJCTU3OAorI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCRQkJT0JKX3NldF9jdHlwZSw2MEwKKworI2RlZmluZSBTTl9zZXRjdF9BdXRoUmV2UmVzVEJFQgkJInNldGN0LUF1dGhSZXZSZXNUQkVCIgorI2RlZmluZSBOSURfc2V0Y3RfQXV0aFJldlJlc1RCRUIJCTU3OQorI2RlZmluZSBPQkpfc2V0Y3RfQXV0aFJldlJlc1RCRUIJCU9CSl9zZXRfY3R5cGUsNjFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmVxVEJFCQkic2V0Y3QtQ2FwUmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmVxVEJFCQk1ODAKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJlcVRCRQkJT0JKX3NldF9jdHlwZSw2MkwKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXFUQkVYCQkic2V0Y3QtQ2FwUmVxVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJlcVRCRVgJCTU4MQorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmVxVEJFWAkJT0JKX3NldF9jdHlwZSw2M0wKKworI2RlZmluZSBTTl9zZXRjdF9DYXBSZXNUQkUJCSJzZXRjdC1DYXBSZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXNUQkUJCTU4MgorI2RlZmluZSBPQkpfc2V0Y3RfQ2FwUmVzVEJFCQlPQkpfc2V0X2N0eXBlLDY0TAorCisjZGVmaW5lIFNOX3NldGN0X0NhcFJldlJlcVRCRQkJInNldGN0LUNhcFJldlJlcVRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NhcFJldlJlcVRCRQkJNTgzCisjZGVmaW5lIE9CSl9zZXRjdF9DYXBSZXZSZXFUQkUJCU9CSl9zZXRfY3R5cGUsNjVMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmV2UmVxVEJFWAkJInNldGN0LUNhcFJldlJlcVRCRVgiCisjZGVmaW5lIE5JRF9zZXRjdF9DYXBSZXZSZXFUQkVYCQk1ODQKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJldlJlcVRCRVgJCU9CSl9zZXRfY3R5cGUsNjZMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ2FwUmV2UmVzVEJFCQkic2V0Y3QtQ2FwUmV2UmVzVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ2FwUmV2UmVzVEJFCQk1ODUKKyNkZWZpbmUgT0JKX3NldGN0X0NhcFJldlJlc1RCRQkJT0JKX3NldF9jdHlwZSw2N0wKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmVxVEJFCQkic2V0Y3QtQ3JlZFJlcVRCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXFUQkUJCTU4NgorI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJlcVRCRQkJT0JKX3NldF9jdHlwZSw2OEwKKworI2RlZmluZSBTTl9zZXRjdF9DcmVkUmVxVEJFWAkJInNldGN0LUNyZWRSZXFUQkVYIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJlcVRCRVgJCTU4NworI2RlZmluZSBPQkpfc2V0Y3RfQ3JlZFJlcVRCRVgJCU9CSl9zZXRfY3R5cGUsNjlMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJlc1RCRQkJInNldGN0LUNyZWRSZXNUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmVzVEJFCQk1ODgKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXNUQkUJCU9CSl9zZXRfY3R5cGUsNzBMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJldlJlcVRCRQkJInNldGN0LUNyZWRSZXZSZXFUQkUiCisjZGVmaW5lIE5JRF9zZXRjdF9DcmVkUmV2UmVxVEJFCQk1ODkKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXZSZXFUQkUJCU9CSl9zZXRfY3R5cGUsNzFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQ3JlZFJldlJlcVRCRVgJCSJzZXRjdC1DcmVkUmV2UmVxVEJFWCIKKyNkZWZpbmUgTklEX3NldGN0X0NyZWRSZXZSZXFUQkVYCQk1OTAKKyNkZWZpbmUgT0JKX3NldGN0X0NyZWRSZXZSZXFUQkVYCQlPQkpfc2V0X2N0eXBlLDcyTAorCisjZGVmaW5lIFNOX3NldGN0X0NyZWRSZXZSZXNUQkUJCSJzZXRjdC1DcmVkUmV2UmVzVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ3JlZFJldlJlc1RCRQkJNTkxCisjZGVmaW5lIE9CSl9zZXRjdF9DcmVkUmV2UmVzVEJFCQlPQkpfc2V0X2N0eXBlLDczTAorCisjZGVmaW5lIFNOX3NldGN0X0JhdGNoQWRtaW5SZXFUQkUJCSJzZXRjdC1CYXRjaEFkbWluUmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQmF0Y2hBZG1pblJlcVRCRQkJNTkyCisjZGVmaW5lIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVxVEJFCQlPQkpfc2V0X2N0eXBlLDc0TAorCisjZGVmaW5lIFNOX3NldGN0X0JhdGNoQWRtaW5SZXNUQkUJCSJzZXRjdC1CYXRjaEFkbWluUmVzVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQmF0Y2hBZG1pblJlc1RCRQkJNTkzCisjZGVmaW5lIE9CSl9zZXRjdF9CYXRjaEFkbWluUmVzVEJFCQlPQkpfc2V0X2N0eXBlLDc1TAorCisjZGVmaW5lIFNOX3NldGN0X1JlZ0Zvcm1SZXFUQkUJCSJzZXRjdC1SZWdGb3JtUmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfUmVnRm9ybVJlcVRCRQkJNTk0CisjZGVmaW5lIE9CSl9zZXRjdF9SZWdGb3JtUmVxVEJFCQlPQkpfc2V0X2N0eXBlLDc2TAorCisjZGVmaW5lIFNOX3NldGN0X0NlcnRSZXFUQkUJCSJzZXRjdC1DZXJ0UmVxVEJFIgorI2RlZmluZSBOSURfc2V0Y3RfQ2VydFJlcVRCRQkJNTk1CisjZGVmaW5lIE9CSl9zZXRjdF9DZXJ0UmVxVEJFCQlPQkpfc2V0X2N0eXBlLDc3TAorCisjZGVmaW5lIFNOX3NldGN0X0NlcnRSZXFUQkVYCQkic2V0Y3QtQ2VydFJlcVRCRVgiCisjZGVmaW5lIE5JRF9zZXRjdF9DZXJ0UmVxVEJFWAkJNTk2CisjZGVmaW5lIE9CSl9zZXRjdF9DZXJ0UmVxVEJFWAkJT0JKX3NldF9jdHlwZSw3OEwKKworI2RlZmluZSBTTl9zZXRjdF9DZXJ0UmVzVEJFCQkic2V0Y3QtQ2VydFJlc1RCRSIKKyNkZWZpbmUgTklEX3NldGN0X0NlcnRSZXNUQkUJCTU5NworI2RlZmluZSBPQkpfc2V0Y3RfQ2VydFJlc1RCRQkJT0JKX3NldF9jdHlwZSw3OUwKKworI2RlZmluZSBTTl9zZXRjdF9DUkxOb3RpZmljYXRpb25UQlMJCSJzZXRjdC1DUkxOb3RpZmljYXRpb25UQlMiCisjZGVmaW5lIE5JRF9zZXRjdF9DUkxOb3RpZmljYXRpb25UQlMJCTU5OAorI2RlZmluZSBPQkpfc2V0Y3RfQ1JMTm90aWZpY2F0aW9uVEJTCQlPQkpfc2V0X2N0eXBlLDgwTAorCisjZGVmaW5lIFNOX3NldGN0X0NSTE5vdGlmaWNhdGlvblJlc1RCUwkJInNldGN0LUNSTE5vdGlmaWNhdGlvblJlc1RCUyIKKyNkZWZpbmUgTklEX3NldGN0X0NSTE5vdGlmaWNhdGlvblJlc1RCUwkJNTk5CisjZGVmaW5lIE9CSl9zZXRjdF9DUkxOb3RpZmljYXRpb25SZXNUQlMJCU9CSl9zZXRfY3R5cGUsODFMCisKKyNkZWZpbmUgU05fc2V0Y3RfQkNJRGlzdHJpYnV0aW9uVEJTCQkic2V0Y3QtQkNJRGlzdHJpYnV0aW9uVEJTIgorI2RlZmluZSBOSURfc2V0Y3RfQkNJRGlzdHJpYnV0aW9uVEJTCQk2MDAKKyNkZWZpbmUgT0JKX3NldGN0X0JDSURpc3RyaWJ1dGlvblRCUwkJT0JKX3NldF9jdHlwZSw4MkwKKworI2RlZmluZSBTTl9zZXRleHRfZ2VuQ3J5cHQJCSJzZXRleHQtZ2VuQ3J5cHQiCisjZGVmaW5lIExOX3NldGV4dF9nZW5DcnlwdAkJImdlbmVyaWMgY3J5cHRvZ3JhbSIKKyNkZWZpbmUgTklEX3NldGV4dF9nZW5DcnlwdAkJNjAxCisjZGVmaW5lIE9CSl9zZXRleHRfZ2VuQ3J5cHQJCU9CSl9zZXRfbXNnRXh0LDFMCisKKyNkZWZpbmUgU05fc2V0ZXh0X21pQXV0aAkJInNldGV4dC1taUF1dGgiCisjZGVmaW5lIExOX3NldGV4dF9taUF1dGgJCSJtZXJjaGFudCBpbml0aWF0ZWQgYXV0aCIKKyNkZWZpbmUgTklEX3NldGV4dF9taUF1dGgJCTYwMgorI2RlZmluZSBPQkpfc2V0ZXh0X21pQXV0aAkJT0JKX3NldF9tc2dFeHQsM0wKKworI2RlZmluZSBTTl9zZXRleHRfcGluU2VjdXJlCQkic2V0ZXh0LXBpblNlY3VyZSIKKyNkZWZpbmUgTklEX3NldGV4dF9waW5TZWN1cmUJCTYwMworI2RlZmluZSBPQkpfc2V0ZXh0X3BpblNlY3VyZQkJT0JKX3NldF9tc2dFeHQsNEwKKworI2RlZmluZSBTTl9zZXRleHRfcGluQW55CQkic2V0ZXh0LXBpbkFueSIKKyNkZWZpbmUgTklEX3NldGV4dF9waW5BbnkJCTYwNAorI2RlZmluZSBPQkpfc2V0ZXh0X3BpbkFueQkJT0JKX3NldF9tc2dFeHQsNUwKKworI2RlZmluZSBTTl9zZXRleHRfdHJhY2syCQkic2V0ZXh0LXRyYWNrMiIKKyNkZWZpbmUgTklEX3NldGV4dF90cmFjazIJCTYwNQorI2RlZmluZSBPQkpfc2V0ZXh0X3RyYWNrMgkJT0JKX3NldF9tc2dFeHQsN0wKKworI2RlZmluZSBTTl9zZXRleHRfY3YJCSJzZXRleHQtY3YiCisjZGVmaW5lIExOX3NldGV4dF9jdgkJImFkZGl0aW9uYWwgdmVyaWZpY2F0aW9uIgorI2RlZmluZSBOSURfc2V0ZXh0X2N2CQk2MDYKKyNkZWZpbmUgT0JKX3NldGV4dF9jdgkJT0JKX3NldF9tc2dFeHQsOEwKKworI2RlZmluZSBTTl9zZXRfcG9saWN5X3Jvb3QJCSJzZXQtcG9saWN5LXJvb3QiCisjZGVmaW5lIE5JRF9zZXRfcG9saWN5X3Jvb3QJCTYwNworI2RlZmluZSBPQkpfc2V0X3BvbGljeV9yb290CQlPQkpfc2V0X3BvbGljeSwwTAorCisjZGVmaW5lIFNOX3NldENleHRfaGFzaGVkUm9vdAkJInNldENleHQtaGFzaGVkUm9vdCIKKyNkZWZpbmUgTklEX3NldENleHRfaGFzaGVkUm9vdAkJNjA4CisjZGVmaW5lIE9CSl9zZXRDZXh0X2hhc2hlZFJvb3QJCU9CSl9zZXRfY2VydEV4dCwwTAorCisjZGVmaW5lIFNOX3NldENleHRfY2VydFR5cGUJCSJzZXRDZXh0LWNlcnRUeXBlIgorI2RlZmluZSBOSURfc2V0Q2V4dF9jZXJ0VHlwZQkJNjA5CisjZGVmaW5lIE9CSl9zZXRDZXh0X2NlcnRUeXBlCQlPQkpfc2V0X2NlcnRFeHQsMUwKKworI2RlZmluZSBTTl9zZXRDZXh0X21lcmNoRGF0YQkJInNldENleHQtbWVyY2hEYXRhIgorI2RlZmluZSBOSURfc2V0Q2V4dF9tZXJjaERhdGEJCTYxMAorI2RlZmluZSBPQkpfc2V0Q2V4dF9tZXJjaERhdGEJCU9CSl9zZXRfY2VydEV4dCwyTAorCisjZGVmaW5lIFNOX3NldENleHRfY0NlcnRSZXF1aXJlZAkJInNldENleHQtY0NlcnRSZXF1aXJlZCIKKyNkZWZpbmUgTklEX3NldENleHRfY0NlcnRSZXF1aXJlZAkJNjExCisjZGVmaW5lIE9CSl9zZXRDZXh0X2NDZXJ0UmVxdWlyZWQJCU9CSl9zZXRfY2VydEV4dCwzTAorCisjZGVmaW5lIFNOX3NldENleHRfdHVubmVsaW5nCQkic2V0Q2V4dC10dW5uZWxpbmciCisjZGVmaW5lIE5JRF9zZXRDZXh0X3R1bm5lbGluZwkJNjEyCisjZGVmaW5lIE9CSl9zZXRDZXh0X3R1bm5lbGluZwkJT0JKX3NldF9jZXJ0RXh0LDRMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9zZXRFeHQJCSJzZXRDZXh0LXNldEV4dCIKKyNkZWZpbmUgTklEX3NldENleHRfc2V0RXh0CQk2MTMKKyNkZWZpbmUgT0JKX3NldENleHRfc2V0RXh0CQlPQkpfc2V0X2NlcnRFeHQsNUwKKworI2RlZmluZSBTTl9zZXRDZXh0X3NldFF1YWxmCQkic2V0Q2V4dC1zZXRRdWFsZiIKKyNkZWZpbmUgTklEX3NldENleHRfc2V0UXVhbGYJCTYxNAorI2RlZmluZSBPQkpfc2V0Q2V4dF9zZXRRdWFsZgkJT0JKX3NldF9jZXJ0RXh0LDZMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9QR1dZY2FwYWJpbGl0aWVzCQkic2V0Q2V4dC1QR1dZY2FwYWJpbGl0aWVzIgorI2RlZmluZSBOSURfc2V0Q2V4dF9QR1dZY2FwYWJpbGl0aWVzCQk2MTUKKyNkZWZpbmUgT0JKX3NldENleHRfUEdXWWNhcGFiaWxpdGllcwkJT0JKX3NldF9jZXJ0RXh0LDdMCisKKyNkZWZpbmUgU05fc2V0Q2V4dF9Ub2tlbklkZW50aWZpZXIJCSJzZXRDZXh0LVRva2VuSWRlbnRpZmllciIKKyNkZWZpbmUgTklEX3NldENleHRfVG9rZW5JZGVudGlmaWVyCQk2MTYKKyNkZWZpbmUgT0JKX3NldENleHRfVG9rZW5JZGVudGlmaWVyCQlPQkpfc2V0X2NlcnRFeHQsOEwKKworI2RlZmluZSBTTl9zZXRDZXh0X1RyYWNrMkRhdGEJCSJzZXRDZXh0LVRyYWNrMkRhdGEiCisjZGVmaW5lIE5JRF9zZXRDZXh0X1RyYWNrMkRhdGEJCTYxNworI2RlZmluZSBPQkpfc2V0Q2V4dF9UcmFjazJEYXRhCQlPQkpfc2V0X2NlcnRFeHQsOUwKKworI2RlZmluZSBTTl9zZXRDZXh0X1Rva2VuVHlwZQkJInNldENleHQtVG9rZW5UeXBlIgorI2RlZmluZSBOSURfc2V0Q2V4dF9Ub2tlblR5cGUJCTYxOAorI2RlZmluZSBPQkpfc2V0Q2V4dF9Ub2tlblR5cGUJCU9CSl9zZXRfY2VydEV4dCwxMEwKKworI2RlZmluZSBTTl9zZXRDZXh0X0lzc3VlckNhcGFiaWxpdGllcwkJInNldENleHQtSXNzdWVyQ2FwYWJpbGl0aWVzIgorI2RlZmluZSBOSURfc2V0Q2V4dF9Jc3N1ZXJDYXBhYmlsaXRpZXMJCTYxOQorI2RlZmluZSBPQkpfc2V0Q2V4dF9Jc3N1ZXJDYXBhYmlsaXRpZXMJCU9CSl9zZXRfY2VydEV4dCwxMUwKKworI2RlZmluZSBTTl9zZXRBdHRyX0NlcnQJCSJzZXRBdHRyLUNlcnQiCisjZGVmaW5lIE5JRF9zZXRBdHRyX0NlcnQJCTYyMAorI2RlZmluZSBPQkpfc2V0QXR0cl9DZXJ0CQlPQkpfc2V0X2F0dHIsMEwKKworI2RlZmluZSBTTl9zZXRBdHRyX1BHV1ljYXAJCSJzZXRBdHRyLVBHV1ljYXAiCisjZGVmaW5lIExOX3NldEF0dHJfUEdXWWNhcAkJInBheW1lbnQgZ2F0ZXdheSBjYXBhYmlsaXRpZXMiCisjZGVmaW5lIE5JRF9zZXRBdHRyX1BHV1ljYXAJCTYyMQorI2RlZmluZSBPQkpfc2V0QXR0cl9QR1dZY2FwCQlPQkpfc2V0X2F0dHIsMUwKKworI2RlZmluZSBTTl9zZXRBdHRyX1Rva2VuVHlwZQkJInNldEF0dHItVG9rZW5UeXBlIgorI2RlZmluZSBOSURfc2V0QXR0cl9Ub2tlblR5cGUJCTYyMgorI2RlZmluZSBPQkpfc2V0QXR0cl9Ub2tlblR5cGUJCU9CSl9zZXRfYXR0ciwyTAorCisjZGVmaW5lIFNOX3NldEF0dHJfSXNzQ2FwCQkic2V0QXR0ci1Jc3NDYXAiCisjZGVmaW5lIExOX3NldEF0dHJfSXNzQ2FwCQkiaXNzdWVyIGNhcGFiaWxpdGllcyIKKyNkZWZpbmUgTklEX3NldEF0dHJfSXNzQ2FwCQk2MjMKKyNkZWZpbmUgT0JKX3NldEF0dHJfSXNzQ2FwCQlPQkpfc2V0X2F0dHIsM0wKKworI2RlZmluZSBTTl9zZXRfcm9vdEtleVRodW1iCQkic2V0LXJvb3RLZXlUaHVtYiIKKyNkZWZpbmUgTklEX3NldF9yb290S2V5VGh1bWIJCTYyNAorI2RlZmluZSBPQkpfc2V0X3Jvb3RLZXlUaHVtYgkJT0JKX3NldEF0dHJfQ2VydCwwTAorCisjZGVmaW5lIFNOX3NldF9hZGRQb2xpY3kJCSJzZXQtYWRkUG9saWN5IgorI2RlZmluZSBOSURfc2V0X2FkZFBvbGljeQkJNjI1CisjZGVmaW5lIE9CSl9zZXRfYWRkUG9saWN5CQlPQkpfc2V0QXR0cl9DZXJ0LDFMCisKKyNkZWZpbmUgU05fc2V0QXR0cl9Ub2tlbl9FTVYJCSJzZXRBdHRyLVRva2VuLUVNViIKKyNkZWZpbmUgTklEX3NldEF0dHJfVG9rZW5fRU1WCQk2MjYKKyNkZWZpbmUgT0JKX3NldEF0dHJfVG9rZW5fRU1WCQlPQkpfc2V0QXR0cl9Ub2tlblR5cGUsMUwKKworI2RlZmluZSBTTl9zZXRBdHRyX1Rva2VuX0IwUHJpbWUJCSJzZXRBdHRyLVRva2VuLUIwUHJpbWUiCisjZGVmaW5lIE5JRF9zZXRBdHRyX1Rva2VuX0IwUHJpbWUJCTYyNworI2RlZmluZSBPQkpfc2V0QXR0cl9Ub2tlbl9CMFByaW1lCQlPQkpfc2V0QXR0cl9Ub2tlblR5cGUsMkwKKworI2RlZmluZSBTTl9zZXRBdHRyX0lzc0NhcF9DVk0JCSJzZXRBdHRyLUlzc0NhcC1DVk0iCisjZGVmaW5lIE5JRF9zZXRBdHRyX0lzc0NhcF9DVk0JCTYyOAorI2RlZmluZSBPQkpfc2V0QXR0cl9Jc3NDYXBfQ1ZNCQlPQkpfc2V0QXR0cl9Jc3NDYXAsM0wKKworI2RlZmluZSBTTl9zZXRBdHRyX0lzc0NhcF9UMgkJInNldEF0dHItSXNzQ2FwLVQyIgorI2RlZmluZSBOSURfc2V0QXR0cl9Jc3NDYXBfVDIJCTYyOQorI2RlZmluZSBPQkpfc2V0QXR0cl9Jc3NDYXBfVDIJCU9CSl9zZXRBdHRyX0lzc0NhcCw0TAorCisjZGVmaW5lIFNOX3NldEF0dHJfSXNzQ2FwX1NpZwkJInNldEF0dHItSXNzQ2FwLVNpZyIKKyNkZWZpbmUgTklEX3NldEF0dHJfSXNzQ2FwX1NpZwkJNjMwCisjZGVmaW5lIE9CSl9zZXRBdHRyX0lzc0NhcF9TaWcJCU9CSl9zZXRBdHRyX0lzc0NhcCw1TAorCisjZGVmaW5lIFNOX3NldEF0dHJfR2VuQ3J5cHRncm0JCSJzZXRBdHRyLUdlbkNyeXB0Z3JtIgorI2RlZmluZSBMTl9zZXRBdHRyX0dlbkNyeXB0Z3JtCQkiZ2VuZXJhdGUgY3J5cHRvZ3JhbSIKKyNkZWZpbmUgTklEX3NldEF0dHJfR2VuQ3J5cHRncm0JCTYzMQorI2RlZmluZSBPQkpfc2V0QXR0cl9HZW5DcnlwdGdybQkJT0JKX3NldEF0dHJfSXNzQ2FwX0NWTSwxTAorCisjZGVmaW5lIFNOX3NldEF0dHJfVDJFbmMJCSJzZXRBdHRyLVQyRW5jIgorI2RlZmluZSBMTl9zZXRBdHRyX1QyRW5jCQkiZW5jcnlwdGVkIHRyYWNrIDIiCisjZGVmaW5lIE5JRF9zZXRBdHRyX1QyRW5jCQk2MzIKKyNkZWZpbmUgT0JKX3NldEF0dHJfVDJFbmMJCU9CSl9zZXRBdHRyX0lzc0NhcF9UMiwxTAorCisjZGVmaW5lIFNOX3NldEF0dHJfVDJjbGVhcnR4dAkJInNldEF0dHItVDJjbGVhcnR4dCIKKyNkZWZpbmUgTE5fc2V0QXR0cl9UMmNsZWFydHh0CQkiY2xlYXJ0ZXh0IHRyYWNrIDIiCisjZGVmaW5lIE5JRF9zZXRBdHRyX1QyY2xlYXJ0eHQJCTYzMworI2RlZmluZSBPQkpfc2V0QXR0cl9UMmNsZWFydHh0CQlPQkpfc2V0QXR0cl9Jc3NDYXBfVDIsMkwKKworI2RlZmluZSBTTl9zZXRBdHRyX1Rva0lDQ3NpZwkJInNldEF0dHItVG9rSUNDc2lnIgorI2RlZmluZSBMTl9zZXRBdHRyX1Rva0lDQ3NpZwkJIklDQyBvciB0b2tlbiBzaWduYXR1cmUiCisjZGVmaW5lIE5JRF9zZXRBdHRyX1Rva0lDQ3NpZwkJNjM0CisjZGVmaW5lIE9CSl9zZXRBdHRyX1Rva0lDQ3NpZwkJT0JKX3NldEF0dHJfSXNzQ2FwX1NpZywxTAorCisjZGVmaW5lIFNOX3NldEF0dHJfU2VjRGV2U2lnCQkic2V0QXR0ci1TZWNEZXZTaWciCisjZGVmaW5lIExOX3NldEF0dHJfU2VjRGV2U2lnCQkic2VjdXJlIGRldmljZSBzaWduYXR1cmUiCisjZGVmaW5lIE5JRF9zZXRBdHRyX1NlY0RldlNpZwkJNjM1CisjZGVmaW5lIE9CSl9zZXRBdHRyX1NlY0RldlNpZwkJT0JKX3NldEF0dHJfSXNzQ2FwX1NpZywyTAorCisjZGVmaW5lIFNOX3NldF9icmFuZF9JQVRBX0FUQQkJInNldC1icmFuZC1JQVRBLUFUQSIKKyNkZWZpbmUgTklEX3NldF9icmFuZF9JQVRBX0FUQQkJNjM2CisjZGVmaW5lIE9CSl9zZXRfYnJhbmRfSUFUQV9BVEEJCU9CSl9zZXRfYnJhbmQsMUwKKworI2RlZmluZSBTTl9zZXRfYnJhbmRfRGluZXJzCQkic2V0LWJyYW5kLURpbmVycyIKKyNkZWZpbmUgTklEX3NldF9icmFuZF9EaW5lcnMJCTYzNworI2RlZmluZSBPQkpfc2V0X2JyYW5kX0RpbmVycwkJT0JKX3NldF9icmFuZCwzMEwKKworI2RlZmluZSBTTl9zZXRfYnJhbmRfQW1lcmljYW5FeHByZXNzCQkic2V0LWJyYW5kLUFtZXJpY2FuRXhwcmVzcyIKKyNkZWZpbmUgTklEX3NldF9icmFuZF9BbWVyaWNhbkV4cHJlc3MJCTYzOAorI2RlZmluZSBPQkpfc2V0X2JyYW5kX0FtZXJpY2FuRXhwcmVzcwkJT0JKX3NldF9icmFuZCwzNEwKKworI2RlZmluZSBTTl9zZXRfYnJhbmRfSkNCCQkic2V0LWJyYW5kLUpDQiIKKyNkZWZpbmUgTklEX3NldF9icmFuZF9KQ0IJCTYzOQorI2RlZmluZSBPQkpfc2V0X2JyYW5kX0pDQgkJT0JKX3NldF9icmFuZCwzNUwKKworI2RlZmluZSBTTl9zZXRfYnJhbmRfVmlzYQkJInNldC1icmFuZC1WaXNhIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX1Zpc2EJCTY0MAorI2RlZmluZSBPQkpfc2V0X2JyYW5kX1Zpc2EJCU9CSl9zZXRfYnJhbmQsNEwKKworI2RlZmluZSBTTl9zZXRfYnJhbmRfTWFzdGVyQ2FyZAkJInNldC1icmFuZC1NYXN0ZXJDYXJkIgorI2RlZmluZSBOSURfc2V0X2JyYW5kX01hc3RlckNhcmQJCTY0MQorI2RlZmluZSBPQkpfc2V0X2JyYW5kX01hc3RlckNhcmQJCU9CSl9zZXRfYnJhbmQsNUwKKworI2RlZmluZSBTTl9zZXRfYnJhbmRfTm92dXMJCSJzZXQtYnJhbmQtTm92dXMiCisjZGVmaW5lIE5JRF9zZXRfYnJhbmRfTm92dXMJCTY0MgorI2RlZmluZSBPQkpfc2V0X2JyYW5kX05vdnVzCQlPQkpfc2V0X2JyYW5kLDYwMTFMCisKKyNkZWZpbmUgU05fZGVzX2NkbWYJCSJERVMtQ0RNRiIKKyNkZWZpbmUgTE5fZGVzX2NkbWYJCSJkZXMtY2RtZiIKKyNkZWZpbmUgTklEX2Rlc19jZG1mCQk2NDMKKyNkZWZpbmUgT0JKX2Rlc19jZG1mCQlPQkpfcnNhZHNpLDNMLDEwTAorCisjZGVmaW5lIFNOX3JzYU9BRVBFbmNyeXB0aW9uU0VUCQkicnNhT0FFUEVuY3J5cHRpb25TRVQiCisjZGVmaW5lIE5JRF9yc2FPQUVQRW5jcnlwdGlvblNFVAkJNjQ0CisjZGVmaW5lIE9CSl9yc2FPQUVQRW5jcnlwdGlvblNFVAkJT0JKX3JzYWRzaSwxTCwxTCw2TAorCisjZGVmaW5lIFNOX2lwc2VjMwkJIk9ha2xleS1FQzJOLTMiCisjZGVmaW5lIExOX2lwc2VjMwkJImlwc2VjMyIKKyNkZWZpbmUgTklEX2lwc2VjMwkJNzQ5CisKKyNkZWZpbmUgU05faXBzZWM0CQkiT2FrbGV5LUVDMk4tNCIKKyNkZWZpbmUgTE5faXBzZWM0CQkiaXBzZWM0IgorI2RlZmluZSBOSURfaXBzZWM0CQk3NTAKKworI2RlZmluZSBTTl93aGlybHBvb2wJCSJ3aGlybHBvb2wiCisjZGVmaW5lIE5JRF93aGlybHBvb2wJCTgwNAorI2RlZmluZSBPQkpfd2hpcmxwb29sCQlPQkpfaXNvLDBMLDEwMTE4TCwzTCwwTCw1NUwKKworI2RlZmluZSBTTl9jcnlwdG9wcm8JCSJjcnlwdG9wcm8iCisjZGVmaW5lIE5JRF9jcnlwdG9wcm8JCTgwNQorI2RlZmluZSBPQkpfY3J5cHRvcHJvCQlPQkpfbWVtYmVyX2JvZHksNjQzTCwyTCwyTAorCisjZGVmaW5lIFNOX2NyeXB0b2NvbQkJImNyeXB0b2NvbSIKKyNkZWZpbmUgTklEX2NyeXB0b2NvbQkJODA2CisjZGVmaW5lIE9CSl9jcnlwdG9jb20JCU9CSl9tZW1iZXJfYm9keSw2NDNMLDJMLDlMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDEJCSJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtMjAwMSIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDEJCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxCQk4MDcKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF8yMDAxCQlPQkpfY3J5cHRvcHJvLDNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0CQkiaWQtR29zdFIzNDExLTk0LXdpdGgtR29zdFIzNDEwLTk0IgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTQJCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtOTQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTQJCTgwOAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0CQlPQkpfY3J5cHRvcHJvLDRMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0CQkibWRfZ29zdDk0IgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTFfOTQJCSJHT1NUIFIgMzQuMTEtOTQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTFfOTQJCTgwOQorI2RlZmluZSBPQkpfaWRfR29zdFIzNDExXzk0CQlPQkpfY3J5cHRvcHJvLDlMCisKKyNkZWZpbmUgU05faWRfSE1BQ0dvc3RSMzQxMV85NAkJImlkLUhNQUNHb3N0UjM0MTEtOTQiCisjZGVmaW5lIExOX2lkX0hNQUNHb3N0UjM0MTFfOTQJCSJITUFDIEdPU1QgMzQuMTEtOTQiCisjZGVmaW5lIE5JRF9pZF9ITUFDR29zdFIzNDExXzk0CQk4MTAKKyNkZWZpbmUgT0JKX2lkX0hNQUNHb3N0UjM0MTFfOTQJCU9CSl9jcnlwdG9wcm8sMTBMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDEJCSJnb3N0MjAwMSIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDEwXzIwMDEJCSJHT1NUIFIgMzQuMTAtMjAwMSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF8yMDAxCQk4MTEKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF8yMDAxCQlPQkpfY3J5cHRvcHJvLDE5TAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NAkJImdvc3Q5NCIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDEwXzk0CQkiR09TVCBSIDM0LjEwLTk0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0CQk4MTIKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NAkJT0JKX2NyeXB0b3BybywyMEwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODkJCSJnb3N0ODkiCisjZGVmaW5lIExOX2lkX0dvc3QyODE0N184OQkJIkdPU1QgMjgxNDctODkiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODkJCTgxMworI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5CQlPQkpfY3J5cHRvcHJvLDIxTAorCisjZGVmaW5lIFNOX2dvc3Q4OV9jbnQJCSJnb3N0ODktY250IgorI2RlZmluZSBOSURfZ29zdDg5X2NudAkJODE0CisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X01BQwkJImdvc3QtbWFjIgorI2RlZmluZSBMTl9pZF9Hb3N0MjgxNDdfODlfTUFDCQkiR09TVCAyODE0Ny04OSBNQUMiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfTUFDCQk4MTUKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9NQUMJCU9CSl9jcnlwdG9wcm8sMjJMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0X3ByZgkJInByZi1nb3N0cjM0MTEtOTQiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMV85NF9wcmYJCSJHT1NUIFIgMzQuMTEtOTQgUFJGIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDExXzk0X3ByZgkJODE2CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTRfcHJmCQlPQkpfY3J5cHRvcHJvLDIzTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF8yMDAxREgJCSJpZC1Hb3N0UjM0MTAtMjAwMURIIgorI2RlZmluZSBMTl9pZF9Hb3N0UjM0MTBfMjAwMURICQkiR09TVCBSIDM0LjEwLTIwMDEgREgiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMURICQk4MTcKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF8yMDAxREgJCU9CSl9jcnlwdG9wcm8sOThMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0REgJCSJpZC1Hb3N0UjM0MTAtOTRESCIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDEwXzk0REgJCSJHT1NUIFIgMzQuMTAtOTQgREgiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRESAkJODE4CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRESAkJT0JKX2NyeXB0b3Bybyw5OUwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0tleU1lc2hpbmcJCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUtleU1lc2hpbmciCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0tleU1lc2hpbmcJCTgxOQorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19LZXlNZXNoaW5nCQlPQkpfY3J5cHRvcHJvLDE0TCwxTAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9Ob25lX0tleU1lc2hpbmcJCSJpZC1Hb3N0MjgxNDctODktTm9uZS1LZXlNZXNoaW5nIgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X05vbmVfS2V5TWVzaGluZwkJODIwCisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfTm9uZV9LZXlNZXNoaW5nCQlPQkpfY3J5cHRvcHJvLDE0TCwwTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMV85NF9UZXN0UGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTEtOTQtVGVzdFBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDExXzk0X1Rlc3RQYXJhbVNldAkJODIxCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTRfVGVzdFBhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMwTCwwTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldAkJImlkLUdvc3RSMzQxMS05NC1DcnlwdG9Qcm9QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMV85NF9DcnlwdG9Qcm9QYXJhbVNldAkJODIyCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTRfQ3J5cHRvUHJvUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzBMLDFMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X1Rlc3RQYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1UZXN0UGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfVGVzdFBhcmFtU2V0CQk4MjMKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9UZXN0UGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDBMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19BX1BhcmFtU2V0CQkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1BLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19BX1BhcmFtU2V0CQk4MjQKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMUwsMUwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLUItUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCTgyNQorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19CX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMxTCwyTAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tQy1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJODI2CisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDNMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19EX1BhcmFtU2V0CQkiaWQtR29zdDI4MTQ3LTg5LUNyeXB0b1Byby1ELVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19EX1BhcmFtU2V0CQk4MjcKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fRF9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMUwsNEwKKworI2RlZmluZSBTTl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX09zY2FyXzFfMV9QYXJhbVNldAkJImlkLUdvc3QyODE0Ny04OS1DcnlwdG9Qcm8tT3NjYXItMS0xLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19Pc2Nhcl8xXzFfUGFyYW1TZXQJCTgyOAorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19Pc2Nhcl8xXzFfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzFMLDVMCisKKyNkZWZpbmUgU05faWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19Pc2Nhcl8xXzBfUGFyYW1TZXQJCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLU9zY2FyLTEtMC1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8wX1BhcmFtU2V0CQk4MjkKKyNkZWZpbmUgT0JKX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fT3NjYXJfMV8wX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMxTCw2TAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9DcnlwdG9Qcm9fUklDXzFfUGFyYW1TZXQJCSJpZC1Hb3N0MjgxNDctODktQ3J5cHRvUHJvLVJJQy0xLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdDI4MTQ3Xzg5X0NyeXB0b1Byb19SSUNfMV9QYXJhbVNldAkJODMwCisjZGVmaW5lIE9CSl9pZF9Hb3N0MjgxNDdfODlfQ3J5cHRvUHJvX1JJQ18xX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMxTCw3TAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9UZXN0UGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtOTQtVGVzdFBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X1Rlc3RQYXJhbVNldAkJODMxCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfVGVzdFBhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMyTCwwTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tQS1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJODMyCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0FfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzJMLDJMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19CX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1CLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19CX1BhcmFtU2V0CQk4MzMKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fQl9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzMkwsM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLUMtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0NfUGFyYW1TZXQJCTgzNAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19DX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMyTCw0TAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fRF9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tRC1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fRF9QYXJhbVNldAkJODM1CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX0RfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzJMLDVMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTk0LUNyeXB0b1Byby1YY2hBLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hBX1BhcmFtU2V0CQk4MzYKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzM0wsMUwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtOTQtQ3J5cHRvUHJvLVhjaEItUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCTgzNworI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzk0X0NyeXB0b1Byb19YY2hCX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDMzTCwyTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQ19QYXJhbVNldAkJImlkLUdvc3RSMzQxMC05NC1DcnlwdG9Qcm8tWGNoQy1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF85NF9DcnlwdG9Qcm9fWGNoQ19QYXJhbVNldAkJODM4CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfQ3J5cHRvUHJvX1hjaENfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzNMLDNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfVGVzdFBhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTIwMDEtVGVzdFBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfVGVzdFBhcmFtU2V0CQk4MzkKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF8yMDAxX1Rlc3RQYXJhbVNldAkJT0JKX2NyeXB0b3BybywzNUwsMEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQV9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1BLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0FfUGFyYW1TZXQJCTg0MAorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0FfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzVMLDFMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX0JfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tQi1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19CX1BhcmFtU2V0CQk4NDEKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19CX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDM1TCwyTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19DX1BhcmFtU2V0CQkiaWQtR29zdFIzNDEwLTIwMDEtQ3J5cHRvUHJvLUMtUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJODQyCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fQ19QYXJhbVNldAkJT0JKX2NyeXB0b3BybywzNUwsM0wKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTBfMjAwMV9DcnlwdG9Qcm9fWGNoQV9QYXJhbVNldAkJImlkLUdvc3RSMzQxMC0yMDAxLUNyeXB0b1Byby1YY2hBLVBhcmFtU2V0IgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX1hjaEFfUGFyYW1TZXQJCTg0MworI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX1hjaEFfUGFyYW1TZXQJCU9CSl9jcnlwdG9wcm8sMzZMLDBMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzIwMDFfQ3J5cHRvUHJvX1hjaEJfUGFyYW1TZXQJCSJpZC1Hb3N0UjM0MTAtMjAwMS1DcnlwdG9Qcm8tWGNoQi1QYXJhbVNldCIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hCX1BhcmFtU2V0CQk4NDQKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF8yMDAxX0NyeXB0b1Byb19YY2hCX1BhcmFtU2V0CQlPQkpfY3J5cHRvcHJvLDM2TCwxTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9hCQkiaWQtR29zdFIzNDEwLTk0LWEiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfYQkJODQ1CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfYQkJT0JKX2lkX0dvc3RSMzQxMF85NCwxTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9hQmlzCQkiaWQtR29zdFIzNDEwLTk0LWFCaXMiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfYUJpcwkJODQ2CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfYUJpcwkJT0JKX2lkX0dvc3RSMzQxMF85NCwyTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9iCQkiaWQtR29zdFIzNDEwLTk0LWIiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfYgkJODQ3CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfYgkJT0JKX2lkX0dvc3RSMzQxMF85NCwzTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF85NF9iQmlzCQkiaWQtR29zdFIzNDEwLTk0LWJCaXMiCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTBfOTRfYkJpcwkJODQ4CisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTBfOTRfYkJpcwkJT0JKX2lkX0dvc3RSMzQxMF85NCw0TAorCisjZGVmaW5lIFNOX2lkX0dvc3QyODE0N184OV9jYwkJImlkLUdvc3QyODE0Ny04OS1jYyIKKyNkZWZpbmUgTE5faWRfR29zdDI4MTQ3Xzg5X2NjCQkiR09TVCAyODE0Ny04OSBDcnlwdG9jb20gUGFyYW1TZXQiCisjZGVmaW5lIE5JRF9pZF9Hb3N0MjgxNDdfODlfY2MJCTg0OQorI2RlZmluZSBPQkpfaWRfR29zdDI4MTQ3Xzg5X2NjCQlPQkpfY3J5cHRvY29tLDFMLDZMLDFMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDEwXzk0X2NjCQkiZ29zdDk0Y2MiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMF85NF9jYwkJIkdPU1QgMzQuMTAtOTQgQ3J5cHRvY29tIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzk0X2NjCQk4NTAKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF85NF9jYwkJT0JKX2NyeXB0b2NvbSwxTCw1TCwzTAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF8yMDAxX2NjCQkiZ29zdDIwMDFjYyIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDEwXzIwMDFfY2MJCSJHT1NUIDM0LjEwLTIwMDEgQ3J5cHRvY29tIgorI2RlZmluZSBOSURfaWRfR29zdFIzNDEwXzIwMDFfY2MJCTg1MQorI2RlZmluZSBPQkpfaWRfR29zdFIzNDEwXzIwMDFfY2MJCU9CSl9jcnlwdG9jb20sMUwsNUwsNEwKKworI2RlZmluZSBTTl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTRfY2MJCSJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtOTQtY2MiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMV85NF93aXRoX0dvc3RSMzQxMF85NF9jYwkJIkdPU1QgUiAzNC4xMS05NCB3aXRoIEdPU1QgUiAzNC4xMC05NCBDcnlwdG9jb20iCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfOTRfY2MJCTg1MgorI2RlZmluZSBPQkpfaWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzk0X2NjCQlPQkpfY3J5cHRvY29tLDFMLDNMLDNMCisKKyNkZWZpbmUgU05faWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDFfY2MJCSJpZC1Hb3N0UjM0MTEtOTQtd2l0aC1Hb3N0UjM0MTAtMjAwMS1jYyIKKyNkZWZpbmUgTE5faWRfR29zdFIzNDExXzk0X3dpdGhfR29zdFIzNDEwXzIwMDFfY2MJCSJHT1NUIFIgMzQuMTEtOTQgd2l0aCBHT1NUIFIgMzQuMTAtMjAwMSBDcnlwdG9jb20iCisjZGVmaW5lIE5JRF9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYwkJODUzCisjZGVmaW5lIE9CSl9pZF9Hb3N0UjM0MTFfOTRfd2l0aF9Hb3N0UjM0MTBfMjAwMV9jYwkJT0JKX2NyeXB0b2NvbSwxTCwzTCw0TAorCisjZGVmaW5lIFNOX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjCQkiaWQtR29zdFIzNDEwLTIwMDEtUGFyYW1TZXQtY2MiCisjZGVmaW5lIExOX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjCQkiR09TVCBSIDM0MTAtMjAwMSBQYXJhbWV0ZXIgU2V0IENyeXB0b2NvbSIKKyNkZWZpbmUgTklEX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjCQk4NTQKKyNkZWZpbmUgT0JKX2lkX0dvc3RSMzQxMF8yMDAxX1BhcmFtU2V0X2NjCQlPQkpfY3J5cHRvY29tLDFMLDhMLDFMCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTI4X2NiYwkJIkNBTUVMTElBLTEyOC1DQkMiCisjZGVmaW5lIExOX2NhbWVsbGlhXzEyOF9jYmMJCSJjYW1lbGxpYS0xMjgtY2JjIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMTI4X2NiYwkJNzUxCisjZGVmaW5lIE9CSl9jYW1lbGxpYV8xMjhfY2JjCQkxTCwyTCwzOTJMLDIwMDAxMUwsNjFMLDFMLDFMLDFMLDJMCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTkyX2NiYwkJIkNBTUVMTElBLTE5Mi1DQkMiCisjZGVmaW5lIExOX2NhbWVsbGlhXzE5Ml9jYmMJCSJjYW1lbGxpYS0xOTItY2JjIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMTkyX2NiYwkJNzUyCisjZGVmaW5lIE9CSl9jYW1lbGxpYV8xOTJfY2JjCQkxTCwyTCwzOTJMLDIwMDAxMUwsNjFMLDFMLDFMLDFMLDNMCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMjU2X2NiYwkJIkNBTUVMTElBLTI1Ni1DQkMiCisjZGVmaW5lIExOX2NhbWVsbGlhXzI1Nl9jYmMJCSJjYW1lbGxpYS0yNTYtY2JjIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMjU2X2NiYwkJNzUzCisjZGVmaW5lIE9CSl9jYW1lbGxpYV8yNTZfY2JjCQkxTCwyTCwzOTJMLDIwMDAxMUwsNjFMLDFMLDFMLDFMLDRMCisKKyNkZWZpbmUgT0JKX250dF9kcwkJMEwsM0wsNDQwMUwsNUwKKworI2RlZmluZSBPQkpfY2FtZWxsaWEJCU9CSl9udHRfZHMsM0wsMUwsOUwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xMjhfZWNiCQkiQ0FNRUxMSUEtMTI4LUVDQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTI4X2VjYgkJImNhbWVsbGlhLTEyOC1lY2IiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xMjhfZWNiCQk3NTQKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzEyOF9lY2IJCU9CSl9jYW1lbGxpYSwxTAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzEyOF9vZmIxMjgJCSJDQU1FTExJQS0xMjgtT0ZCIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xMjhfb2ZiMTI4CQkiY2FtZWxsaWEtMTI4LW9mYiIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzEyOF9vZmIxMjgJCTc2NgorI2RlZmluZSBPQkpfY2FtZWxsaWFfMTI4X29mYjEyOAkJT0JKX2NhbWVsbGlhLDNMCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMTI4X2NmYjEyOAkJIkNBTUVMTElBLTEyOC1DRkIiCisjZGVmaW5lIExOX2NhbWVsbGlhXzEyOF9jZmIxMjgJCSJjYW1lbGxpYS0xMjgtY2ZiIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMTI4X2NmYjEyOAkJNzU3CisjZGVmaW5lIE9CSl9jYW1lbGxpYV8xMjhfY2ZiMTI4CQlPQkpfY2FtZWxsaWEsNEwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xOTJfZWNiCQkiQ0FNRUxMSUEtMTkyLUVDQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX2VjYgkJImNhbWVsbGlhLTE5Mi1lY2IiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xOTJfZWNiCQk3NTUKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzE5Ml9lY2IJCU9CSl9jYW1lbGxpYSwyMUwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xOTJfb2ZiMTI4CQkiQ0FNRUxMSUEtMTkyLU9GQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX29mYjEyOAkJImNhbWVsbGlhLTE5Mi1vZmIiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xOTJfb2ZiMTI4CQk3NjcKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzE5Ml9vZmIxMjgJCU9CSl9jYW1lbGxpYSwyM0wKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xOTJfY2ZiMTI4CQkiQ0FNRUxMSUEtMTkyLUNGQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMTkyX2NmYjEyOAkJImNhbWVsbGlhLTE5Mi1jZmIiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xOTJfY2ZiMTI4CQk3NTgKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzE5Ml9jZmIxMjgJCU9CSl9jYW1lbGxpYSwyNEwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfZWNiCQkiQ0FNRUxMSUEtMjU2LUVDQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMjU2X2VjYgkJImNhbWVsbGlhLTI1Ni1lY2IiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8yNTZfZWNiCQk3NTYKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzI1Nl9lY2IJCU9CSl9jYW1lbGxpYSw0MUwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfb2ZiMTI4CQkiQ0FNRUxMSUEtMjU2LU9GQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMjU2X29mYjEyOAkJImNhbWVsbGlhLTI1Ni1vZmIiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8yNTZfb2ZiMTI4CQk3NjgKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzI1Nl9vZmIxMjgJCU9CSl9jYW1lbGxpYSw0M0wKKworI2RlZmluZSBTTl9jYW1lbGxpYV8yNTZfY2ZiMTI4CQkiQ0FNRUxMSUEtMjU2LUNGQiIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMjU2X2NmYjEyOAkJImNhbWVsbGlhLTI1Ni1jZmIiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8yNTZfY2ZiMTI4CQk3NTkKKyNkZWZpbmUgT0JKX2NhbWVsbGlhXzI1Nl9jZmIxMjgJCU9CSl9jYW1lbGxpYSw0NEwKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xMjhfY2ZiMQkJIkNBTUVMTElBLTEyOC1DRkIxIgorI2RlZmluZSBMTl9jYW1lbGxpYV8xMjhfY2ZiMQkJImNhbWVsbGlhLTEyOC1jZmIxIgorI2RlZmluZSBOSURfY2FtZWxsaWFfMTI4X2NmYjEJCTc2MAorCisjZGVmaW5lIFNOX2NhbWVsbGlhXzE5Ml9jZmIxCQkiQ0FNRUxMSUEtMTkyLUNGQjEiCisjZGVmaW5lIExOX2NhbWVsbGlhXzE5Ml9jZmIxCQkiY2FtZWxsaWEtMTkyLWNmYjEiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xOTJfY2ZiMQkJNzYxCisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMjU2X2NmYjEJCSJDQU1FTExJQS0yNTYtQ0ZCMSIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMjU2X2NmYjEJCSJjYW1lbGxpYS0yNTYtY2ZiMSIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzI1Nl9jZmIxCQk3NjIKKworI2RlZmluZSBTTl9jYW1lbGxpYV8xMjhfY2ZiOAkJIkNBTUVMTElBLTEyOC1DRkI4IgorI2RlZmluZSBMTl9jYW1lbGxpYV8xMjhfY2ZiOAkJImNhbWVsbGlhLTEyOC1jZmI4IgorI2RlZmluZSBOSURfY2FtZWxsaWFfMTI4X2NmYjgJCTc2MworCisjZGVmaW5lIFNOX2NhbWVsbGlhXzE5Ml9jZmI4CQkiQ0FNRUxMSUEtMTkyLUNGQjgiCisjZGVmaW5lIExOX2NhbWVsbGlhXzE5Ml9jZmI4CQkiY2FtZWxsaWEtMTkyLWNmYjgiCisjZGVmaW5lIE5JRF9jYW1lbGxpYV8xOTJfY2ZiOAkJNzY0CisKKyNkZWZpbmUgU05fY2FtZWxsaWFfMjU2X2NmYjgJCSJDQU1FTExJQS0yNTYtQ0ZCOCIKKyNkZWZpbmUgTE5fY2FtZWxsaWFfMjU2X2NmYjgJCSJjYW1lbGxpYS0yNTYtY2ZiOCIKKyNkZWZpbmUgTklEX2NhbWVsbGlhXzI1Nl9jZmI4CQk3NjUKKworI2RlZmluZSBTTl9raXNhCQkiS0lTQSIKKyNkZWZpbmUgTE5fa2lzYQkJImtpc2EiCisjZGVmaW5lIE5JRF9raXNhCQk3NzMKKyNkZWZpbmUgT0JKX2tpc2EJCU9CSl9tZW1iZXJfYm9keSw0MTBMLDIwMDAwNEwKKworI2RlZmluZSBTTl9zZWVkX2VjYgkJIlNFRUQtRUNCIgorI2RlZmluZSBMTl9zZWVkX2VjYgkJInNlZWQtZWNiIgorI2RlZmluZSBOSURfc2VlZF9lY2IJCTc3NgorI2RlZmluZSBPQkpfc2VlZF9lY2IJCU9CSl9raXNhLDFMLDNMCisKKyNkZWZpbmUgU05fc2VlZF9jYmMJCSJTRUVELUNCQyIKKyNkZWZpbmUgTE5fc2VlZF9jYmMJCSJzZWVkLWNiYyIKKyNkZWZpbmUgTklEX3NlZWRfY2JjCQk3NzcKKyNkZWZpbmUgT0JKX3NlZWRfY2JjCQlPQkpfa2lzYSwxTCw0TAorCisjZGVmaW5lIFNOX3NlZWRfY2ZiMTI4CQkiU0VFRC1DRkIiCisjZGVmaW5lIExOX3NlZWRfY2ZiMTI4CQkic2VlZC1jZmIiCisjZGVmaW5lIE5JRF9zZWVkX2NmYjEyOAkJNzc5CisjZGVmaW5lIE9CSl9zZWVkX2NmYjEyOAkJT0JKX2tpc2EsMUwsNUwKKworI2RlZmluZSBTTl9zZWVkX29mYjEyOAkJIlNFRUQtT0ZCIgorI2RlZmluZSBMTl9zZWVkX29mYjEyOAkJInNlZWQtb2ZiIgorI2RlZmluZSBOSURfc2VlZF9vZmIxMjgJCTc3OAorI2RlZmluZSBPQkpfc2VlZF9vZmIxMjgJCU9CSl9raXNhLDFMLDZMCisKKyNkZWZpbmUgU05faG1hYwkJIkhNQUMiCisjZGVmaW5lIExOX2htYWMJCSJobWFjIgorI2RlZmluZSBOSURfaG1hYwkJODU1CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMGVlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCkBAIC0wLDAgKzEsMTEzOCBAQAorLyogY3J5cHRvL29iamVjdHMvb2JqZWN0cy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX09CSkVDVFNfSAorI2RlZmluZSBIRUFERVJfT0JKRUNUU19ICisKKyNkZWZpbmUgVVNFX09CSl9NQUMKKworI2lmZGVmIFVTRV9PQkpfTUFDCisjaW5jbHVkZSA8b3BlbnNzbC9vYmpfbWFjLmg+CisjZWxzZQorI2RlZmluZSBTTl91bmRlZgkJCSJVTkRFRiIKKyNkZWZpbmUgTE5fdW5kZWYJCQkidW5kZWZpbmVkIgorI2RlZmluZSBOSURfdW5kZWYJCQkwCisjZGVmaW5lIE9CSl91bmRlZgkJCTBMCisKKyNkZWZpbmUgU05fQWxnb3JpdGhtCQkJIkFsZ29yaXRobSIKKyNkZWZpbmUgTE5fYWxnb3JpdGhtCQkJImFsZ29yaXRobSIKKyNkZWZpbmUgTklEX2FsZ29yaXRobQkJCTM4CisjZGVmaW5lIE9CSl9hbGdvcml0aG0JCQkxTCwzTCwxNEwsM0wsMkwKKworI2RlZmluZSBMTl9yc2Fkc2kJCQkicnNhZHNpIgorI2RlZmluZSBOSURfcnNhZHNpCQkJMQorI2RlZmluZSBPQkpfcnNhZHNpCQkJMUwsMkwsODQwTCwxMTM1NDlMCisKKyNkZWZpbmUgTE5fcGtjcwkJCQkicGtjcyIKKyNkZWZpbmUgTklEX3BrY3MJCQkyCisjZGVmaW5lIE9CSl9wa2NzCQkJT0JKX3JzYWRzaSwxTAorCisjZGVmaW5lIFNOX21kMgkJCQkiTUQyIgorI2RlZmluZSBMTl9tZDIJCQkJIm1kMiIKKyNkZWZpbmUgTklEX21kMgkJCQkzCisjZGVmaW5lIE9CSl9tZDIJCQkJT0JKX3JzYWRzaSwyTCwyTAorCisjZGVmaW5lIFNOX21kNQkJCQkiTUQ1IgorI2RlZmluZSBMTl9tZDUJCQkJIm1kNSIKKyNkZWZpbmUgTklEX21kNQkJCQk0CisjZGVmaW5lIE9CSl9tZDUJCQkJT0JKX3JzYWRzaSwyTCw1TAorCisjZGVmaW5lIFNOX3JjNAkJCQkiUkM0IgorI2RlZmluZSBMTl9yYzQJCQkJInJjNCIKKyNkZWZpbmUgTklEX3JjNAkJCQk1CisjZGVmaW5lIE9CSl9yYzQJCQkJT0JKX3JzYWRzaSwzTCw0TAorCisjZGVmaW5lIExOX3JzYUVuY3J5cHRpb24JCSJyc2FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfcnNhRW5jcnlwdGlvbgkJNgorI2RlZmluZSBPQkpfcnNhRW5jcnlwdGlvbgkJT0JKX3BrY3MsMUwsMUwKKworI2RlZmluZSBTTl9tZDJXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1NRDIiCisjZGVmaW5lIExOX21kMldpdGhSU0FFbmNyeXB0aW9uCQkibWQyV2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9tZDJXaXRoUlNBRW5jcnlwdGlvbgk3CisjZGVmaW5lIE9CSl9tZDJXaXRoUlNBRW5jcnlwdGlvbglPQkpfcGtjcywxTCwyTAorCisjZGVmaW5lIFNOX21kNVdpdGhSU0FFbmNyeXB0aW9uCQkiUlNBLU1ENSIKKyNkZWZpbmUgTE5fbWQ1V2l0aFJTQUVuY3J5cHRpb24JCSJtZDVXaXRoUlNBRW5jcnlwdGlvbiIKKyNkZWZpbmUgTklEX21kNVdpdGhSU0FFbmNyeXB0aW9uCTgKKyNkZWZpbmUgT0JKX21kNVdpdGhSU0FFbmNyeXB0aW9uCU9CSl9wa2NzLDFMLDRMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1EMkFuZERFU19DQkMJCSJQQkUtTUQyLURFUyIKKyNkZWZpbmUgTE5fcGJlV2l0aE1EMkFuZERFU19DQkMJCSJwYmVXaXRoTUQyQW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDJBbmRERVNfQ0JDCTkKKyNkZWZpbmUgT0JKX3BiZVdpdGhNRDJBbmRERVNfQ0JDCU9CSl9wa2NzLDVMLDFMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1ENUFuZERFU19DQkMJCSJQQkUtTUQ1LURFUyIKKyNkZWZpbmUgTE5fcGJlV2l0aE1ENUFuZERFU19DQkMJCSJwYmVXaXRoTUQ1QW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDVBbmRERVNfQ0JDCTEwCisjZGVmaW5lIE9CSl9wYmVXaXRoTUQ1QW5kREVTX0NCQwlPQkpfcGtjcyw1TCwzTAorCisjZGVmaW5lIExOX1g1MDAJCQkJIlg1MDAiCisjZGVmaW5lIE5JRF9YNTAwCQkJMTEKKyNkZWZpbmUgT0JKX1g1MDAJCQkyTCw1TAorCisjZGVmaW5lIExOX1g1MDkJCQkJIlg1MDkiCisjZGVmaW5lIE5JRF9YNTA5CQkJMTIKKyNkZWZpbmUgT0JKX1g1MDkJCQlPQkpfWDUwMCw0TAorCisjZGVmaW5lIFNOX2NvbW1vbk5hbWUJCQkiQ04iCisjZGVmaW5lIExOX2NvbW1vbk5hbWUJCQkiY29tbW9uTmFtZSIKKyNkZWZpbmUgTklEX2NvbW1vbk5hbWUJCQkxMworI2RlZmluZSBPQkpfY29tbW9uTmFtZQkJCU9CSl9YNTA5LDNMCisKKyNkZWZpbmUgU05fY291bnRyeU5hbWUJCQkiQyIKKyNkZWZpbmUgTE5fY291bnRyeU5hbWUJCQkiY291bnRyeU5hbWUiCisjZGVmaW5lIE5JRF9jb3VudHJ5TmFtZQkJCTE0CisjZGVmaW5lIE9CSl9jb3VudHJ5TmFtZQkJCU9CSl9YNTA5LDZMCisKKyNkZWZpbmUgU05fbG9jYWxpdHlOYW1lCQkJIkwiCisjZGVmaW5lIExOX2xvY2FsaXR5TmFtZQkJCSJsb2NhbGl0eU5hbWUiCisjZGVmaW5lIE5JRF9sb2NhbGl0eU5hbWUJCTE1CisjZGVmaW5lIE9CSl9sb2NhbGl0eU5hbWUJCU9CSl9YNTA5LDdMCisKKy8qIFBvc3RhbCBBZGRyZXNzPyBQQSAqLworCisvKiBzaG91bGQgYmUgIlNUIiAocmZjMTMyNykgYnV0IE1TIHVzZXMgJ1MnICovCisjZGVmaW5lIFNOX3N0YXRlT3JQcm92aW5jZU5hbWUJCSJTVCIKKyNkZWZpbmUgTE5fc3RhdGVPclByb3ZpbmNlTmFtZQkJInN0YXRlT3JQcm92aW5jZU5hbWUiCisjZGVmaW5lIE5JRF9zdGF0ZU9yUHJvdmluY2VOYW1lCQkxNgorI2RlZmluZSBPQkpfc3RhdGVPclByb3ZpbmNlTmFtZQkJT0JKX1g1MDksOEwKKworI2RlZmluZSBTTl9vcmdhbml6YXRpb25OYW1lCQkiTyIKKyNkZWZpbmUgTE5fb3JnYW5pemF0aW9uTmFtZQkJIm9yZ2FuaXphdGlvbk5hbWUiCisjZGVmaW5lIE5JRF9vcmdhbml6YXRpb25OYW1lCQkxNworI2RlZmluZSBPQkpfb3JnYW5pemF0aW9uTmFtZQkJT0JKX1g1MDksMTBMCisKKyNkZWZpbmUgU05fb3JnYW5pemF0aW9uYWxVbml0TmFtZQkiT1UiCisjZGVmaW5lIExOX29yZ2FuaXphdGlvbmFsVW5pdE5hbWUJIm9yZ2FuaXphdGlvbmFsVW5pdE5hbWUiCisjZGVmaW5lIE5JRF9vcmdhbml6YXRpb25hbFVuaXROYW1lCTE4CisjZGVmaW5lIE9CSl9vcmdhbml6YXRpb25hbFVuaXROYW1lCU9CSl9YNTA5LDExTAorCisjZGVmaW5lIFNOX3JzYQkJCQkiUlNBIgorI2RlZmluZSBMTl9yc2EJCQkJInJzYSIKKyNkZWZpbmUgTklEX3JzYQkJCQkxOQorI2RlZmluZSBPQkpfcnNhCQkJCU9CSl9YNTAwLDhMLDFMLDFMCisKKyNkZWZpbmUgTE5fcGtjczcJCQkicGtjczciCisjZGVmaW5lIE5JRF9wa2NzNwkJCTIwCisjZGVmaW5lIE9CSl9wa2NzNwkJCU9CSl9wa2NzLDdMCisKKyNkZWZpbmUgTE5fcGtjczdfZGF0YQkJCSJwa2NzNy1kYXRhIgorI2RlZmluZSBOSURfcGtjczdfZGF0YQkJCTIxCisjZGVmaW5lIE9CSl9wa2NzN19kYXRhCQkJT0JKX3BrY3M3LDFMCisKKyNkZWZpbmUgTE5fcGtjczdfc2lnbmVkCQkJInBrY3M3LXNpZ25lZERhdGEiCisjZGVmaW5lIE5JRF9wa2NzN19zaWduZWQJCTIyCisjZGVmaW5lIE9CSl9wa2NzN19zaWduZWQJCU9CSl9wa2NzNywyTAorCisjZGVmaW5lIExOX3BrY3M3X2VudmVsb3BlZAkJInBrY3M3LWVudmVsb3BlZERhdGEiCisjZGVmaW5lIE5JRF9wa2NzN19lbnZlbG9wZWQJCTIzCisjZGVmaW5lIE9CSl9wa2NzN19lbnZlbG9wZWQJCU9CSl9wa2NzNywzTAorCisjZGVmaW5lIExOX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZAkicGtjczctc2lnbmVkQW5kRW52ZWxvcGVkRGF0YSIKKyNkZWZpbmUgTklEX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZAkyNAorI2RlZmluZSBPQkpfcGtjczdfc2lnbmVkQW5kRW52ZWxvcGVkCU9CSl9wa2NzNyw0TAorCisjZGVmaW5lIExOX3BrY3M3X2RpZ2VzdAkJCSJwa2NzNy1kaWdlc3REYXRhIgorI2RlZmluZSBOSURfcGtjczdfZGlnZXN0CQkyNQorI2RlZmluZSBPQkpfcGtjczdfZGlnZXN0CQlPQkpfcGtjczcsNUwKKworI2RlZmluZSBMTl9wa2NzN19lbmNyeXB0ZWQJCSJwa2NzNy1lbmNyeXB0ZWREYXRhIgorI2RlZmluZSBOSURfcGtjczdfZW5jcnlwdGVkCQkyNgorI2RlZmluZSBPQkpfcGtjczdfZW5jcnlwdGVkCQlPQkpfcGtjczcsNkwKKworI2RlZmluZSBMTl9wa2NzMwkJCSJwa2NzMyIKKyNkZWZpbmUgTklEX3BrY3MzCQkJMjcKKyNkZWZpbmUgT0JKX3BrY3MzCQkJT0JKX3BrY3MsM0wKKworI2RlZmluZSBMTl9kaEtleUFncmVlbWVudAkJImRoS2V5QWdyZWVtZW50IgorI2RlZmluZSBOSURfZGhLZXlBZ3JlZW1lbnQJCTI4CisjZGVmaW5lIE9CSl9kaEtleUFncmVlbWVudAkJT0JKX3BrY3MzLDFMCisKKyNkZWZpbmUgU05fZGVzX2VjYgkJCSJERVMtRUNCIgorI2RlZmluZSBMTl9kZXNfZWNiCQkJImRlcy1lY2IiCisjZGVmaW5lIE5JRF9kZXNfZWNiCQkJMjkKKyNkZWZpbmUgT0JKX2Rlc19lY2IJCQlPQkpfYWxnb3JpdGhtLDZMCisKKyNkZWZpbmUgU05fZGVzX2NmYjY0CQkJIkRFUy1DRkIiCisjZGVmaW5lIExOX2Rlc19jZmI2NAkJCSJkZXMtY2ZiIgorI2RlZmluZSBOSURfZGVzX2NmYjY0CQkJMzAKKy8qIElWICsgbnVtICovCisjZGVmaW5lIE9CSl9kZXNfY2ZiNjQJCQlPQkpfYWxnb3JpdGhtLDlMCisKKyNkZWZpbmUgU05fZGVzX2NiYwkJCSJERVMtQ0JDIgorI2RlZmluZSBMTl9kZXNfY2JjCQkJImRlcy1jYmMiCisjZGVmaW5lIE5JRF9kZXNfY2JjCQkJMzEKKy8qIElWICovCisjZGVmaW5lIE9CSl9kZXNfY2JjCQkJT0JKX2FsZ29yaXRobSw3TAorCisjZGVmaW5lIFNOX2Rlc19lZGUJCQkiREVTLUVERSIKKyNkZWZpbmUgTE5fZGVzX2VkZQkJCSJkZXMtZWRlIgorI2RlZmluZSBOSURfZGVzX2VkZQkJCTMyCisvKiA/PyAqLworI2RlZmluZSBPQkpfZGVzX2VkZQkJCU9CSl9hbGdvcml0aG0sMTdMCisKKyNkZWZpbmUgU05fZGVzX2VkZTMJCQkiREVTLUVERTMiCisjZGVmaW5lIExOX2Rlc19lZGUzCQkJImRlcy1lZGUzIgorI2RlZmluZSBOSURfZGVzX2VkZTMJCQkzMworCisjZGVmaW5lIFNOX2lkZWFfY2JjCQkJIklERUEtQ0JDIgorI2RlZmluZSBMTl9pZGVhX2NiYwkJCSJpZGVhLWNiYyIKKyNkZWZpbmUgTklEX2lkZWFfY2JjCQkJMzQKKyNkZWZpbmUgT0JKX2lkZWFfY2JjCQkJMUwsM0wsNkwsMUwsNEwsMUwsMTg4TCw3TCwxTCwxTCwyTAorCisjZGVmaW5lIFNOX2lkZWFfY2ZiNjQJCQkiSURFQS1DRkIiCisjZGVmaW5lIExOX2lkZWFfY2ZiNjQJCQkiaWRlYS1jZmIiCisjZGVmaW5lIE5JRF9pZGVhX2NmYjY0CQkJMzUKKworI2RlZmluZSBTTl9pZGVhX2VjYgkJCSJJREVBLUVDQiIKKyNkZWZpbmUgTE5faWRlYV9lY2IJCQkiaWRlYS1lY2IiCisjZGVmaW5lIE5JRF9pZGVhX2VjYgkJCTM2CisKKyNkZWZpbmUgU05fcmMyX2NiYwkJCSJSQzItQ0JDIgorI2RlZmluZSBMTl9yYzJfY2JjCQkJInJjMi1jYmMiCisjZGVmaW5lIE5JRF9yYzJfY2JjCQkJMzcKKyNkZWZpbmUgT0JKX3JjMl9jYmMJCQlPQkpfcnNhZHNpLDNMLDJMCisKKyNkZWZpbmUgU05fcmMyX2VjYgkJCSJSQzItRUNCIgorI2RlZmluZSBMTl9yYzJfZWNiCQkJInJjMi1lY2IiCisjZGVmaW5lIE5JRF9yYzJfZWNiCQkJMzgKKworI2RlZmluZSBTTl9yYzJfY2ZiNjQJCQkiUkMyLUNGQiIKKyNkZWZpbmUgTE5fcmMyX2NmYjY0CQkJInJjMi1jZmIiCisjZGVmaW5lIE5JRF9yYzJfY2ZiNjQJCQkzOQorCisjZGVmaW5lIFNOX3JjMl9vZmI2NAkJCSJSQzItT0ZCIgorI2RlZmluZSBMTl9yYzJfb2ZiNjQJCQkicmMyLW9mYiIKKyNkZWZpbmUgTklEX3JjMl9vZmI2NAkJCTQwCisKKyNkZWZpbmUgU05fc2hhCQkJCSJTSEEiCisjZGVmaW5lIExOX3NoYQkJCQkic2hhIgorI2RlZmluZSBOSURfc2hhCQkJCTQxCisjZGVmaW5lIE9CSl9zaGEJCQkJT0JKX2FsZ29yaXRobSwxOEwKKworI2RlZmluZSBTTl9zaGFXaXRoUlNBRW5jcnlwdGlvbgkJIlJTQS1TSEEiCisjZGVmaW5lIExOX3NoYVdpdGhSU0FFbmNyeXB0aW9uCQkic2hhV2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGFXaXRoUlNBRW5jcnlwdGlvbgk0MgorI2RlZmluZSBPQkpfc2hhV2l0aFJTQUVuY3J5cHRpb24JT0JKX2FsZ29yaXRobSwxNUwKKworI2RlZmluZSBTTl9kZXNfZWRlX2NiYwkJCSJERVMtRURFLUNCQyIKKyNkZWZpbmUgTE5fZGVzX2VkZV9jYmMJCQkiZGVzLWVkZS1jYmMiCisjZGVmaW5lIE5JRF9kZXNfZWRlX2NiYwkJCTQzCisKKyNkZWZpbmUgU05fZGVzX2VkZTNfY2JjCQkJIkRFUy1FREUzLUNCQyIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfY2JjCQkJImRlcy1lZGUzLWNiYyIKKyNkZWZpbmUgTklEX2Rlc19lZGUzX2NiYwkJNDQKKyNkZWZpbmUgT0JKX2Rlc19lZGUzX2NiYwkJT0JKX3JzYWRzaSwzTCw3TAorCisjZGVmaW5lIFNOX2Rlc19vZmI2NAkJCSJERVMtT0ZCIgorI2RlZmluZSBMTl9kZXNfb2ZiNjQJCQkiZGVzLW9mYiIKKyNkZWZpbmUgTklEX2Rlc19vZmI2NAkJCTQ1CisjZGVmaW5lIE9CSl9kZXNfb2ZiNjQJCQlPQkpfYWxnb3JpdGhtLDhMCisKKyNkZWZpbmUgU05faWRlYV9vZmI2NAkJCSJJREVBLU9GQiIKKyNkZWZpbmUgTE5faWRlYV9vZmI2NAkJCSJpZGVhLW9mYiIKKyNkZWZpbmUgTklEX2lkZWFfb2ZiNjQJCQk0NgorCisjZGVmaW5lIExOX3BrY3M5CQkJInBrY3M5IgorI2RlZmluZSBOSURfcGtjczkJCQk0NworI2RlZmluZSBPQkpfcGtjczkJCQlPQkpfcGtjcyw5TAorCisjZGVmaW5lIFNOX3BrY3M5X2VtYWlsQWRkcmVzcwkJIkVtYWlsIgorI2RlZmluZSBMTl9wa2NzOV9lbWFpbEFkZHJlc3MJCSJlbWFpbEFkZHJlc3MiCisjZGVmaW5lIE5JRF9wa2NzOV9lbWFpbEFkZHJlc3MJCTQ4CisjZGVmaW5lIE9CSl9wa2NzOV9lbWFpbEFkZHJlc3MJCU9CSl9wa2NzOSwxTAorCisjZGVmaW5lIExOX3BrY3M5X3Vuc3RydWN0dXJlZE5hbWUJInVuc3RydWN0dXJlZE5hbWUiCisjZGVmaW5lIE5JRF9wa2NzOV91bnN0cnVjdHVyZWROYW1lCTQ5CisjZGVmaW5lIE9CSl9wa2NzOV91bnN0cnVjdHVyZWROYW1lCU9CSl9wa2NzOSwyTAorCisjZGVmaW5lIExOX3BrY3M5X2NvbnRlbnRUeXBlCQkiY29udGVudFR5cGUiCisjZGVmaW5lIE5JRF9wa2NzOV9jb250ZW50VHlwZQkJNTAKKyNkZWZpbmUgT0JKX3BrY3M5X2NvbnRlbnRUeXBlCQlPQkpfcGtjczksM0wKKworI2RlZmluZSBMTl9wa2NzOV9tZXNzYWdlRGlnZXN0CQkibWVzc2FnZURpZ2VzdCIKKyNkZWZpbmUgTklEX3BrY3M5X21lc3NhZ2VEaWdlc3QJCTUxCisjZGVmaW5lIE9CSl9wa2NzOV9tZXNzYWdlRGlnZXN0CQlPQkpfcGtjczksNEwKKworI2RlZmluZSBMTl9wa2NzOV9zaWduaW5nVGltZQkJInNpZ25pbmdUaW1lIgorI2RlZmluZSBOSURfcGtjczlfc2lnbmluZ1RpbWUJCTUyCisjZGVmaW5lIE9CSl9wa2NzOV9zaWduaW5nVGltZQkJT0JKX3BrY3M5LDVMCisKKyNkZWZpbmUgTE5fcGtjczlfY291bnRlcnNpZ25hdHVyZQkiY291bnRlcnNpZ25hdHVyZSIKKyNkZWZpbmUgTklEX3BrY3M5X2NvdW50ZXJzaWduYXR1cmUJNTMKKyNkZWZpbmUgT0JKX3BrY3M5X2NvdW50ZXJzaWduYXR1cmUJT0JKX3BrY3M5LDZMCisKKyNkZWZpbmUgTE5fcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQJImNoYWxsZW5nZVBhc3N3b3JkIgorI2RlZmluZSBOSURfcGtjczlfY2hhbGxlbmdlUGFzc3dvcmQJNTQKKyNkZWZpbmUgT0JKX3BrY3M5X2NoYWxsZW5nZVBhc3N3b3JkCU9CSl9wa2NzOSw3TAorCisjZGVmaW5lIExOX3BrY3M5X3Vuc3RydWN0dXJlZEFkZHJlc3MJInVuc3RydWN0dXJlZEFkZHJlc3MiCisjZGVmaW5lIE5JRF9wa2NzOV91bnN0cnVjdHVyZWRBZGRyZXNzCTU1CisjZGVmaW5lIE9CSl9wa2NzOV91bnN0cnVjdHVyZWRBZGRyZXNzCU9CSl9wa2NzOSw4TAorCisjZGVmaW5lIExOX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzCSJleHRlbmRlZENlcnRpZmljYXRlQXR0cmlidXRlcyIKKyNkZWZpbmUgTklEX3BrY3M5X2V4dENlcnRBdHRyaWJ1dGVzCTU2CisjZGVmaW5lIE9CSl9wa2NzOV9leHRDZXJ0QXR0cmlidXRlcwlPQkpfcGtjczksOUwKKworI2RlZmluZSBTTl9uZXRzY2FwZQkJCSJOZXRzY2FwZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGUJCQkiTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycC4iCisjZGVmaW5lIE5JRF9uZXRzY2FwZQkJCTU3CisjZGVmaW5lIE9CSl9uZXRzY2FwZQkJCTJMLDE2TCw4NDBMLDFMLDExMzczMEwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbgkibnNDZXJ0RXh0IgorI2RlZmluZSBMTl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbgkiTmV0c2NhcGUgQ2VydGlmaWNhdGUgRXh0ZW5zaW9uIgorI2RlZmluZSBOSURfbmV0c2NhcGVfY2VydF9leHRlbnNpb24JNTgKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uCU9CSl9uZXRzY2FwZSwxTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2RhdGFfdHlwZQkJIm5zRGF0YVR5cGUiCisjZGVmaW5lIExOX25ldHNjYXBlX2RhdGFfdHlwZQkJIk5ldHNjYXBlIERhdGEgVHlwZSIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2RhdGFfdHlwZQkJNTkKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2RhdGFfdHlwZQkJT0JKX25ldHNjYXBlLDJMCisKKyNkZWZpbmUgU05fZGVzX2VkZV9jZmI2NAkJIkRFUy1FREUtQ0ZCIgorI2RlZmluZSBMTl9kZXNfZWRlX2NmYjY0CQkiZGVzLWVkZS1jZmIiCisjZGVmaW5lIE5JRF9kZXNfZWRlX2NmYjY0CQk2MAorCisjZGVmaW5lIFNOX2Rlc19lZGUzX2NmYjY0CQkiREVTLUVERTMtQ0ZCIgorI2RlZmluZSBMTl9kZXNfZWRlM19jZmI2NAkJImRlcy1lZGUzLWNmYiIKKyNkZWZpbmUgTklEX2Rlc19lZGUzX2NmYjY0CQk2MQorCisjZGVmaW5lIFNOX2Rlc19lZGVfb2ZiNjQJCSJERVMtRURFLU9GQiIKKyNkZWZpbmUgTE5fZGVzX2VkZV9vZmI2NAkJImRlcy1lZGUtb2ZiIgorI2RlZmluZSBOSURfZGVzX2VkZV9vZmI2NAkJNjIKKworI2RlZmluZSBTTl9kZXNfZWRlM19vZmI2NAkJIkRFUy1FREUzLU9GQiIKKyNkZWZpbmUgTE5fZGVzX2VkZTNfb2ZiNjQJCSJkZXMtZWRlMy1vZmIiCisjZGVmaW5lIE5JRF9kZXNfZWRlM19vZmI2NAkJNjMKKworLyogSSdtIG5vdCBzdXJlIGFib3V0IHRoZSBvYmplY3QgSUQgKi8KKyNkZWZpbmUgU05fc2hhMQkJCQkiU0hBMSIKKyNkZWZpbmUgTE5fc2hhMQkJCQkic2hhMSIKKyNkZWZpbmUgTklEX3NoYTEJCQk2NAorI2RlZmluZSBPQkpfc2hhMQkJCU9CSl9hbGdvcml0aG0sMjZMCisvKiAyOCBKdW4gMTk5NiAtIGVheSAqLworLyogI2RlZmluZSBPQkpfc2hhMQkJCTFMLDNMLDE0TCwyTCwyNkwsMDVMIDwtIHdyb25nICovCisKKyNkZWZpbmUgU05fc2hhMVdpdGhSU0FFbmNyeXB0aW9uCSJSU0EtU0hBMSIKKyNkZWZpbmUgTE5fc2hhMVdpdGhSU0FFbmNyeXB0aW9uCSJzaGExV2l0aFJTQUVuY3J5cHRpb24iCisjZGVmaW5lIE5JRF9zaGExV2l0aFJTQUVuY3J5cHRpb24JNjUKKyNkZWZpbmUgT0JKX3NoYTFXaXRoUlNBRW5jcnlwdGlvbglPQkpfcGtjcywxTCw1TAorCisjZGVmaW5lIFNOX2RzYVdpdGhTSEEJCQkiRFNBLVNIQSIKKyNkZWZpbmUgTE5fZHNhV2l0aFNIQQkJCSJkc2FXaXRoU0hBIgorI2RlZmluZSBOSURfZHNhV2l0aFNIQQkJCTY2CisjZGVmaW5lIE9CSl9kc2FXaXRoU0hBCQkJT0JKX2FsZ29yaXRobSwxM0wKKworI2RlZmluZSBTTl9kc2FfMgkJCSJEU0Etb2xkIgorI2RlZmluZSBMTl9kc2FfMgkJCSJkc2FFbmNyeXB0aW9uLW9sZCIKKyNkZWZpbmUgTklEX2RzYV8yCQkJNjcKKyNkZWZpbmUgT0JKX2RzYV8yCQkJT0JKX2FsZ29yaXRobSwxMkwKKworLyogcHJvcG9zZWQgYnkgbWljcm9zb2Z0IHRvIFJTQSAqLworI2RlZmluZSBTTl9wYmVXaXRoU0hBMUFuZFJDMl9DQkMJIlBCRS1TSEExLVJDMi02NCIKKyNkZWZpbmUgTE5fcGJlV2l0aFNIQTFBbmRSQzJfQ0JDCSJwYmVXaXRoU0hBMUFuZFJDMi1DQkMiCisjZGVmaW5lIE5JRF9wYmVXaXRoU0hBMUFuZFJDMl9DQkMJNjgKKyNkZWZpbmUgT0JKX3BiZVdpdGhTSEExQW5kUkMyX0NCQwlPQkpfcGtjcyw1TCwxMUwgCisKKy8qIHByb3Bvc2VkIGJ5IG1pY3Jvc29mdCB0byBSU0EgYXMgcGJlV2l0aFNIQTFBbmRSQzQ6IGl0IGlzIG5vdworICogZGVmaW5lZCBleHBsaWNpdGx5IGluIFBLQ1MjNSB2Mi4wIGFzIGlkLVBCS0RGMiB3aGljaCBpcyBzb21ldGhpbmcKKyAqIGNvbXBsZXRlbHkgZGlmZmVyZW50LgorICovCisjZGVmaW5lIExOX2lkX3Bia2RmMgkJCSJQQktERjIiCisjZGVmaW5lIE5JRF9pZF9wYmtkZjIJCQk2OQorI2RlZmluZSBPQkpfaWRfcGJrZGYyCQkJT0JKX3BrY3MsNUwsMTJMIAorCisjZGVmaW5lIFNOX2RzYVdpdGhTSEExXzIJCSJEU0EtU0hBMS1vbGQiCisjZGVmaW5lIExOX2RzYVdpdGhTSEExXzIJCSJkc2FXaXRoU0hBMS1vbGQiCisjZGVmaW5lIE5JRF9kc2FXaXRoU0hBMV8yCQk3MAorLyogR290IHRoaXMgb25lIGZyb20gJ3NkbjcwNnIyMC5wZGYnIHdoaWNoIGlzIGFjdHVhbGx5IGFuIE5TQSBkb2N1bWVudCA6LSkgKi8KKyNkZWZpbmUgT0JKX2RzYVdpdGhTSEExXzIJCU9CSl9hbGdvcml0aG0sMjdMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY2VydF90eXBlCQkibnNDZXJ0VHlwZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY2VydF90eXBlCQkiTmV0c2NhcGUgQ2VydCBUeXBlIgorI2RlZmluZSBOSURfbmV0c2NhcGVfY2VydF90eXBlCQk3MQorI2RlZmluZSBPQkpfbmV0c2NhcGVfY2VydF90eXBlCQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sMUwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9iYXNlX3VybAkJIm5zQmFzZVVybCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfYmFzZV91cmwJCSJOZXRzY2FwZSBCYXNlIFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2Jhc2VfdXJsCQk3MgorI2RlZmluZSBPQkpfbmV0c2NhcGVfYmFzZV91cmwJCU9CSl9uZXRzY2FwZV9jZXJ0X2V4dGVuc2lvbiwyTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsCSJuc1Jldm9jYXRpb25VcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsCSJOZXRzY2FwZSBSZXZvY2F0aW9uIFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX3Jldm9jYXRpb25fdXJsCTczCisjZGVmaW5lIE9CSl9uZXRzY2FwZV9yZXZvY2F0aW9uX3VybAlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sM0wKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybAkibnNDYVJldm9jYXRpb25VcmwiCisjZGVmaW5lIExOX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsCSJOZXRzY2FwZSBDQSBSZXZvY2F0aW9uIFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NhX3Jldm9jYXRpb25fdXJsCTc0CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9jYV9yZXZvY2F0aW9uX3VybAlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sNEwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9yZW5ld2FsX3VybAkJIm5zUmVuZXdhbFVybCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfcmVuZXdhbF91cmwJCSJOZXRzY2FwZSBSZW5ld2FsIFVybCIKKyNkZWZpbmUgTklEX25ldHNjYXBlX3JlbmV3YWxfdXJsCTc1CisjZGVmaW5lIE9CSl9uZXRzY2FwZV9yZW5ld2FsX3VybAlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sN0wKKworI2RlZmluZSBTTl9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsCSJuc0NhUG9saWN5VXJsIgorI2RlZmluZSBMTl9uZXRzY2FwZV9jYV9wb2xpY3lfdXJsCSJOZXRzY2FwZSBDQSBQb2xpY3kgVXJsIgorI2RlZmluZSBOSURfbmV0c2NhcGVfY2FfcG9saWN5X3VybAk3NgorI2RlZmluZSBPQkpfbmV0c2NhcGVfY2FfcG9saWN5X3VybAlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sOEwKKworI2RlZmluZSBTTl9uZXRzY2FwZV9zc2xfc2VydmVyX25hbWUJIm5zU3NsU2VydmVyTmFtZSIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfc3NsX3NlcnZlcl9uYW1lCSJOZXRzY2FwZSBTU0wgU2VydmVyIE5hbWUiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9zc2xfc2VydmVyX25hbWUJNzcKKyNkZWZpbmUgT0JKX25ldHNjYXBlX3NzbF9zZXJ2ZXJfbmFtZQlPQkpfbmV0c2NhcGVfY2VydF9leHRlbnNpb24sMTJMCisKKyNkZWZpbmUgU05fbmV0c2NhcGVfY29tbWVudAkJIm5zQ29tbWVudCIKKyNkZWZpbmUgTE5fbmV0c2NhcGVfY29tbWVudAkJIk5ldHNjYXBlIENvbW1lbnQiCisjZGVmaW5lIE5JRF9uZXRzY2FwZV9jb21tZW50CQk3OAorI2RlZmluZSBPQkpfbmV0c2NhcGVfY29tbWVudAkJT0JKX25ldHNjYXBlX2NlcnRfZXh0ZW5zaW9uLDEzTAorCisjZGVmaW5lIFNOX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UJIm5zQ2VydFNlcXVlbmNlIgorI2RlZmluZSBMTl9uZXRzY2FwZV9jZXJ0X3NlcXVlbmNlCSJOZXRzY2FwZSBDZXJ0aWZpY2F0ZSBTZXF1ZW5jZSIKKyNkZWZpbmUgTklEX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UJNzkKKyNkZWZpbmUgT0JKX25ldHNjYXBlX2NlcnRfc2VxdWVuY2UJT0JKX25ldHNjYXBlX2RhdGFfdHlwZSw1TAorCisjZGVmaW5lIFNOX2Rlc3hfY2JjCQkJIkRFU1gtQ0JDIgorI2RlZmluZSBMTl9kZXN4X2NiYwkJCSJkZXN4LWNiYyIKKyNkZWZpbmUgTklEX2Rlc3hfY2JjCQkJODAKKworI2RlZmluZSBTTl9pZF9jZQkJCSJpZC1jZSIKKyNkZWZpbmUgTklEX2lkX2NlCQkJODEKKyNkZWZpbmUgT0JKX2lkX2NlCQkJMkwsNUwsMjlMCisKKyNkZWZpbmUgU05fc3ViamVjdF9rZXlfaWRlbnRpZmllcgkic3ViamVjdEtleUlkZW50aWZpZXIiCisjZGVmaW5lIExOX3N1YmplY3Rfa2V5X2lkZW50aWZpZXIJIlg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyIgorI2RlZmluZSBOSURfc3ViamVjdF9rZXlfaWRlbnRpZmllcgk4MgorI2RlZmluZSBPQkpfc3ViamVjdF9rZXlfaWRlbnRpZmllcglPQkpfaWRfY2UsMTRMCisKKyNkZWZpbmUgU05fa2V5X3VzYWdlCQkJImtleVVzYWdlIgorI2RlZmluZSBMTl9rZXlfdXNhZ2UJCQkiWDUwOXYzIEtleSBVc2FnZSIKKyNkZWZpbmUgTklEX2tleV91c2FnZQkJCTgzCisjZGVmaW5lIE9CSl9rZXlfdXNhZ2UJCQlPQkpfaWRfY2UsMTVMCisKKyNkZWZpbmUgU05fcHJpdmF0ZV9rZXlfdXNhZ2VfcGVyaW9kCSJwcml2YXRlS2V5VXNhZ2VQZXJpb2QiCisjZGVmaW5lIExOX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAkiWDUwOXYzIFByaXZhdGUgS2V5IFVzYWdlIFBlcmlvZCIKKyNkZWZpbmUgTklEX3ByaXZhdGVfa2V5X3VzYWdlX3BlcmlvZAk4NAorI2RlZmluZSBPQkpfcHJpdmF0ZV9rZXlfdXNhZ2VfcGVyaW9kCU9CSl9pZF9jZSwxNkwKKworI2RlZmluZSBTTl9zdWJqZWN0X2FsdF9uYW1lCQkic3ViamVjdEFsdE5hbWUiCisjZGVmaW5lIExOX3N1YmplY3RfYWx0X25hbWUJCSJYNTA5djMgU3ViamVjdCBBbHRlcm5hdGl2ZSBOYW1lIgorI2RlZmluZSBOSURfc3ViamVjdF9hbHRfbmFtZQkJODUKKyNkZWZpbmUgT0JKX3N1YmplY3RfYWx0X25hbWUJCU9CSl9pZF9jZSwxN0wKKworI2RlZmluZSBTTl9pc3N1ZXJfYWx0X25hbWUJCSJpc3N1ZXJBbHROYW1lIgorI2RlZmluZSBMTl9pc3N1ZXJfYWx0X25hbWUJCSJYNTA5djMgSXNzdWVyIEFsdGVybmF0aXZlIE5hbWUiCisjZGVmaW5lIE5JRF9pc3N1ZXJfYWx0X25hbWUJCTg2CisjZGVmaW5lIE9CSl9pc3N1ZXJfYWx0X25hbWUJCU9CSl9pZF9jZSwxOEwKKworI2RlZmluZSBTTl9iYXNpY19jb25zdHJhaW50cwkJImJhc2ljQ29uc3RyYWludHMiCisjZGVmaW5lIExOX2Jhc2ljX2NvbnN0cmFpbnRzCQkiWDUwOXYzIEJhc2ljIENvbnN0cmFpbnRzIgorI2RlZmluZSBOSURfYmFzaWNfY29uc3RyYWludHMJCTg3CisjZGVmaW5lIE9CSl9iYXNpY19jb25zdHJhaW50cwkJT0JKX2lkX2NlLDE5TAorCisjZGVmaW5lIFNOX2NybF9udW1iZXIJCQkiY3JsTnVtYmVyIgorI2RlZmluZSBMTl9jcmxfbnVtYmVyCQkJIlg1MDl2MyBDUkwgTnVtYmVyIgorI2RlZmluZSBOSURfY3JsX251bWJlcgkJCTg4CisjZGVmaW5lIE9CSl9jcmxfbnVtYmVyCQkJT0JKX2lkX2NlLDIwTAorCisjZGVmaW5lIFNOX2NlcnRpZmljYXRlX3BvbGljaWVzCQkiY2VydGlmaWNhdGVQb2xpY2llcyIKKyNkZWZpbmUgTE5fY2VydGlmaWNhdGVfcG9saWNpZXMJCSJYNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXMiCisjZGVmaW5lIE5JRF9jZXJ0aWZpY2F0ZV9wb2xpY2llcwk4OQorI2RlZmluZSBPQkpfY2VydGlmaWNhdGVfcG9saWNpZXMJT0JKX2lkX2NlLDMyTAorCisjZGVmaW5lIFNOX2F1dGhvcml0eV9rZXlfaWRlbnRpZmllcgkiYXV0aG9yaXR5S2V5SWRlbnRpZmllciIKKyNkZWZpbmUgTE5fYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyCSJYNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyIgorI2RlZmluZSBOSURfYXV0aG9yaXR5X2tleV9pZGVudGlmaWVyCTkwCisjZGVmaW5lIE9CSl9hdXRob3JpdHlfa2V5X2lkZW50aWZpZXIJT0JKX2lkX2NlLDM1TAorCisjZGVmaW5lIFNOX2JmX2NiYwkJCSJCRi1DQkMiCisjZGVmaW5lIExOX2JmX2NiYwkJCSJiZi1jYmMiCisjZGVmaW5lIE5JRF9iZl9jYmMJCQk5MQorI2RlZmluZSBPQkpfYmZfY2JjCQkJMUwsM0wsNkwsMUwsNEwsMUwsMzAyOUwsMUwsMkwKKworI2RlZmluZSBTTl9iZl9lY2IJCQkiQkYtRUNCIgorI2RlZmluZSBMTl9iZl9lY2IJCQkiYmYtZWNiIgorI2RlZmluZSBOSURfYmZfZWNiCQkJOTIKKworI2RlZmluZSBTTl9iZl9jZmI2NAkJCSJCRi1DRkIiCisjZGVmaW5lIExOX2JmX2NmYjY0CQkJImJmLWNmYiIKKyNkZWZpbmUgTklEX2JmX2NmYjY0CQkJOTMKKworI2RlZmluZSBTTl9iZl9vZmI2NAkJCSJCRi1PRkIiCisjZGVmaW5lIExOX2JmX29mYjY0CQkJImJmLW9mYiIKKyNkZWZpbmUgTklEX2JmX29mYjY0CQkJOTQKKworI2RlZmluZSBTTl9tZGMyCQkJCSJNREMyIgorI2RlZmluZSBMTl9tZGMyCQkJCSJtZGMyIgorI2RlZmluZSBOSURfbWRjMgkJCTk1CisjZGVmaW5lIE9CSl9tZGMyCQkJMkwsNUwsOEwsM0wsMTAxTAorLyogQW4gYWx0ZXJuYXRpdmU/CQkJMUwsM0wsMTRMLDNMLDJMLDE5TCAqLworCisjZGVmaW5lIFNOX21kYzJXaXRoUlNBCQkJIlJTQS1NREMyIgorI2RlZmluZSBMTl9tZGMyV2l0aFJTQQkJCSJtZGMyd2l0aFJTQSIKKyNkZWZpbmUgTklEX21kYzJXaXRoUlNBCQkJOTYKKyNkZWZpbmUgT0JKX21kYzJXaXRoUlNBCQkJMkwsNUwsOEwsM0wsMTAwTAorCisjZGVmaW5lIFNOX3JjNF80MAkJCSJSQzQtNDAiCisjZGVmaW5lIExOX3JjNF80MAkJCSJyYzQtNDAiCisjZGVmaW5lIE5JRF9yYzRfNDAJCQk5NworCisjZGVmaW5lIFNOX3JjMl80MF9jYmMJCQkiUkMyLTQwLUNCQyIKKyNkZWZpbmUgTE5fcmMyXzQwX2NiYwkJCSJyYzItNDAtY2JjIgorI2RlZmluZSBOSURfcmMyXzQwX2NiYwkJCTk4CisKKyNkZWZpbmUgU05fZ2l2ZW5OYW1lCQkJIkciCisjZGVmaW5lIExOX2dpdmVuTmFtZQkJCSJnaXZlbk5hbWUiCisjZGVmaW5lIE5JRF9naXZlbk5hbWUJCQk5OQorI2RlZmluZSBPQkpfZ2l2ZW5OYW1lCQkJT0JKX1g1MDksNDJMCisKKyNkZWZpbmUgU05fc3VybmFtZQkJCSJTIgorI2RlZmluZSBMTl9zdXJuYW1lCQkJInN1cm5hbWUiCisjZGVmaW5lIE5JRF9zdXJuYW1lCQkJMTAwCisjZGVmaW5lIE9CSl9zdXJuYW1lCQkJT0JKX1g1MDksNEwKKworI2RlZmluZSBTTl9pbml0aWFscwkJCSJJIgorI2RlZmluZSBMTl9pbml0aWFscwkJCSJpbml0aWFscyIKKyNkZWZpbmUgTklEX2luaXRpYWxzCQkJMTAxCisjZGVmaW5lIE9CSl9pbml0aWFscwkJCU9CSl9YNTA5LDQzTAorCisjZGVmaW5lIFNOX3VuaXF1ZUlkZW50aWZpZXIJCSJVSUQiCisjZGVmaW5lIExOX3VuaXF1ZUlkZW50aWZpZXIJCSJ1bmlxdWVJZGVudGlmaWVyIgorI2RlZmluZSBOSURfdW5pcXVlSWRlbnRpZmllcgkJMTAyCisjZGVmaW5lIE9CSl91bmlxdWVJZGVudGlmaWVyCQlPQkpfWDUwOSw0NUwKKworI2RlZmluZSBTTl9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cwkiY3JsRGlzdHJpYnV0aW9uUG9pbnRzIgorI2RlZmluZSBMTl9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cwkiWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzIgorI2RlZmluZSBOSURfY3JsX2Rpc3RyaWJ1dGlvbl9wb2ludHMJMTAzCisjZGVmaW5lIE9CSl9jcmxfZGlzdHJpYnV0aW9uX3BvaW50cwlPQkpfaWRfY2UsMzFMCisKKyNkZWZpbmUgU05fbWQ1V2l0aFJTQQkJCSJSU0EtTlAtTUQ1IgorI2RlZmluZSBMTl9tZDVXaXRoUlNBCQkJIm1kNVdpdGhSU0EiCisjZGVmaW5lIE5JRF9tZDVXaXRoUlNBCQkJMTA0CisjZGVmaW5lIE9CSl9tZDVXaXRoUlNBCQkJT0JKX2FsZ29yaXRobSwzTAorCisjZGVmaW5lIFNOX3NlcmlhbE51bWJlcgkJCSJTTiIKKyNkZWZpbmUgTE5fc2VyaWFsTnVtYmVyCQkJInNlcmlhbE51bWJlciIKKyNkZWZpbmUgTklEX3NlcmlhbE51bWJlcgkJMTA1CisjZGVmaW5lIE9CSl9zZXJpYWxOdW1iZXIJCU9CSl9YNTA5LDVMCisKKyNkZWZpbmUgU05fdGl0bGUJCQkiVCIKKyNkZWZpbmUgTE5fdGl0bGUJCQkidGl0bGUiCisjZGVmaW5lIE5JRF90aXRsZQkJCTEwNgorI2RlZmluZSBPQkpfdGl0bGUJCQlPQkpfWDUwOSwxMkwKKworI2RlZmluZSBTTl9kZXNjcmlwdGlvbgkJCSJEIgorI2RlZmluZSBMTl9kZXNjcmlwdGlvbgkJCSJkZXNjcmlwdGlvbiIKKyNkZWZpbmUgTklEX2Rlc2NyaXB0aW9uCQkJMTA3CisjZGVmaW5lIE9CSl9kZXNjcmlwdGlvbgkJCU9CSl9YNTA5LDEzTAorCisvKiBDQVNUNSBpcyBDQVNULTEyOCwgSSdtIGp1c3Qgc3RpY2tpbmcgd2l0aCB0aGUgZG9jdW1lbnRhdGlvbiAqLworI2RlZmluZSBTTl9jYXN0NV9jYmMJCQkiQ0FTVDUtQ0JDIgorI2RlZmluZSBMTl9jYXN0NV9jYmMJCQkiY2FzdDUtY2JjIgorI2RlZmluZSBOSURfY2FzdDVfY2JjCQkJMTA4CisjZGVmaW5lIE9CSl9jYXN0NV9jYmMJCQkxTCwyTCw4NDBMLDExMzUzM0wsN0wsNjZMLDEwTAorCisjZGVmaW5lIFNOX2Nhc3Q1X2VjYgkJCSJDQVNUNS1FQ0IiCisjZGVmaW5lIExOX2Nhc3Q1X2VjYgkJCSJjYXN0NS1lY2IiCisjZGVmaW5lIE5JRF9jYXN0NV9lY2IJCQkxMDkKKworI2RlZmluZSBTTl9jYXN0NV9jZmI2NAkJCSJDQVNUNS1DRkIiCisjZGVmaW5lIExOX2Nhc3Q1X2NmYjY0CQkJImNhc3Q1LWNmYiIKKyNkZWZpbmUgTklEX2Nhc3Q1X2NmYjY0CQkJMTEwCisKKyNkZWZpbmUgU05fY2FzdDVfb2ZiNjQJCQkiQ0FTVDUtT0ZCIgorI2RlZmluZSBMTl9jYXN0NV9vZmI2NAkJCSJjYXN0NS1vZmIiCisjZGVmaW5lIE5JRF9jYXN0NV9vZmI2NAkJCTExMQorCisjZGVmaW5lIExOX3BiZVdpdGhNRDVBbmRDYXN0NV9DQkMJInBiZVdpdGhNRDVBbmRDYXN0NUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDVBbmRDYXN0NV9DQkMJMTEyCisjZGVmaW5lIE9CSl9wYmVXaXRoTUQ1QW5kQ2FzdDVfQ0JDCTFMLDJMLDg0MEwsMTEzNTMzTCw3TCw2NkwsMTJMCisKKy8qIFRoaXMgaXMgb25lIHN1biB3aWxsIHNvb24gYmUgdXNpbmcgOi0oCisgKiBpZC1kc2Etd2l0aC1zaGExIElEICA6Oj0geworICogICBpc28oMSkgbWVtYmVyLWJvZHkoMikgdXMoODQwKSB4OS01NyAoMTAwNDApIHg5Y20oNCkgMyB9CisgKi8KKyNkZWZpbmUgU05fZHNhV2l0aFNIQTEJCQkiRFNBLVNIQTEiCisjZGVmaW5lIExOX2RzYVdpdGhTSEExCQkJImRzYVdpdGhTSEExIgorI2RlZmluZSBOSURfZHNhV2l0aFNIQTEJCQkxMTMKKyNkZWZpbmUgT0JKX2RzYVdpdGhTSEExCQkJMUwsMkwsODQwTCwxMDA0MEwsNEwsM0wKKworI2RlZmluZSBOSURfbWQ1X3NoYTEJCQkxMTQKKyNkZWZpbmUgU05fbWQ1X3NoYTEJCQkiTUQ1LVNIQTEiCisjZGVmaW5lIExOX21kNV9zaGExCQkJIm1kNS1zaGExIgorCisjZGVmaW5lIFNOX3NoYTFXaXRoUlNBCQkJIlJTQS1TSEExLTIiCisjZGVmaW5lIExOX3NoYTFXaXRoUlNBCQkJInNoYTFXaXRoUlNBIgorI2RlZmluZSBOSURfc2hhMVdpdGhSU0EJCQkxMTUKKyNkZWZpbmUgT0JKX3NoYTFXaXRoUlNBCQkJT0JKX2FsZ29yaXRobSwyOUwKKworI2RlZmluZSBTTl9kc2EJCQkJIkRTQSIKKyNkZWZpbmUgTE5fZHNhCQkJCSJkc2FFbmNyeXB0aW9uIgorI2RlZmluZSBOSURfZHNhCQkJCTExNgorI2RlZmluZSBPQkpfZHNhCQkJCTFMLDJMLDg0MEwsMTAwNDBMLDRMLDFMCisKKyNkZWZpbmUgU05fcmlwZW1kMTYwCQkJIlJJUEVNRDE2MCIKKyNkZWZpbmUgTE5fcmlwZW1kMTYwCQkJInJpcGVtZDE2MCIKKyNkZWZpbmUgTklEX3JpcGVtZDE2MAkJCTExNworI2RlZmluZSBPQkpfcmlwZW1kMTYwCQkJMUwsM0wsMzZMLDNMLDJMLDFMCisKKy8qIFRoZSBuYW1lIHNob3VsZCBhY3R1YWxseSBiZSByc2FTaWduYXR1cmVXaXRocmlwZW1kMTYwLCBidXQgSSdtIGdvaW5nCisgKiB0byBjb250aW51ZSB1c2luZyB0aGUgY29udmVudGlvbiBJJ20gdXNpbmcgd2l0aCB0aGUgb3RoZXIgY2lwaGVycyAqLworI2RlZmluZSBTTl9yaXBlbWQxNjBXaXRoUlNBCQkiUlNBLVJJUEVNRDE2MCIKKyNkZWZpbmUgTE5fcmlwZW1kMTYwV2l0aFJTQQkJInJpcGVtZDE2MFdpdGhSU0EiCisjZGVmaW5lIE5JRF9yaXBlbWQxNjBXaXRoUlNBCQkxMTkKKyNkZWZpbmUgT0JKX3JpcGVtZDE2MFdpdGhSU0EJCTFMLDNMLDM2TCwzTCwzTCwxTCwyTAorCisvKiBUYWtlbiBmcm9tIHJmYzIwNDAKKyAqICBSQzVfQ0JDX1BhcmFtZXRlcnMgOjo9IFNFUVVFTkNFIHsKKyAqCXZlcnNpb24gICAgICAgICAgIElOVEVHRVIgKHYxXzAoMTYpKSwKKyAqCXJvdW5kcyAgICAgICAgICAgIElOVEVHRVIgKDguLjEyNyksCisgKglibG9ja1NpemVJbkJpdHMgICBJTlRFR0VSICg2NCwgMTI4KSwKKyAqCWl2ICAgICAgICAgICAgICAgIE9DVEVUIFNUUklORyBPUFRJT05BTAorICoJfQorICovCisjZGVmaW5lIFNOX3JjNV9jYmMJCQkiUkM1LUNCQyIKKyNkZWZpbmUgTE5fcmM1X2NiYwkJCSJyYzUtY2JjIgorI2RlZmluZSBOSURfcmM1X2NiYwkJCTEyMAorI2RlZmluZSBPQkpfcmM1X2NiYwkJCU9CSl9yc2Fkc2ksM0wsOEwKKworI2RlZmluZSBTTl9yYzVfZWNiCQkJIlJDNS1FQ0IiCisjZGVmaW5lIExOX3JjNV9lY2IJCQkicmM1LWVjYiIKKyNkZWZpbmUgTklEX3JjNV9lY2IJCQkxMjEKKworI2RlZmluZSBTTl9yYzVfY2ZiNjQJCQkiUkM1LUNGQiIKKyNkZWZpbmUgTE5fcmM1X2NmYjY0CQkJInJjNS1jZmIiCisjZGVmaW5lIE5JRF9yYzVfY2ZiNjQJCQkxMjIKKworI2RlZmluZSBTTl9yYzVfb2ZiNjQJCQkiUkM1LU9GQiIKKyNkZWZpbmUgTE5fcmM1X29mYjY0CQkJInJjNS1vZmIiCisjZGVmaW5lIE5JRF9yYzVfb2ZiNjQJCQkxMjMKKworI2RlZmluZSBTTl9ybGVfY29tcHJlc3Npb24JCSJSTEUiCisjZGVmaW5lIExOX3JsZV9jb21wcmVzc2lvbgkJInJ1biBsZW5ndGggY29tcHJlc3Npb24iCisjZGVmaW5lIE5JRF9ybGVfY29tcHJlc3Npb24JCTEyNAorI2RlZmluZSBPQkpfcmxlX2NvbXByZXNzaW9uCQkxTCwxTCwxTCwxTCw2NjZMLDFMCisKKyNkZWZpbmUgU05femxpYl9jb21wcmVzc2lvbgkJIlpMSUIiCisjZGVmaW5lIExOX3psaWJfY29tcHJlc3Npb24JCSJ6bGliIGNvbXByZXNzaW9uIgorI2RlZmluZSBOSURfemxpYl9jb21wcmVzc2lvbgkJMTI1CisjZGVmaW5lIE9CSl96bGliX2NvbXByZXNzaW9uCQkxTCwxTCwxTCwxTCw2NjZMLDJMCisKKyNkZWZpbmUgU05fZXh0X2tleV91c2FnZQkJImV4dGVuZGVkS2V5VXNhZ2UiCisjZGVmaW5lIExOX2V4dF9rZXlfdXNhZ2UJCSJYNTA5djMgRXh0ZW5kZWQgS2V5IFVzYWdlIgorI2RlZmluZSBOSURfZXh0X2tleV91c2FnZQkJMTI2CisjZGVmaW5lIE9CSl9leHRfa2V5X3VzYWdlCQlPQkpfaWRfY2UsMzcKKworI2RlZmluZSBTTl9pZF9wa2l4CQkJIlBLSVgiCisjZGVmaW5lIE5JRF9pZF9wa2l4CQkJMTI3CisjZGVmaW5lIE9CSl9pZF9wa2l4CQkJMUwsM0wsNkwsMUwsNUwsNUwsN0wKKworI2RlZmluZSBTTl9pZF9rcAkJCSJpZC1rcCIKKyNkZWZpbmUgTklEX2lkX2twCQkJMTI4CisjZGVmaW5lIE9CSl9pZF9rcAkJCU9CSl9pZF9wa2l4LDNMCisKKy8qIFBLSVggZXh0ZW5kZWQga2V5IHVzYWdlIE9JRHMgKi8KKworI2RlZmluZSBTTl9zZXJ2ZXJfYXV0aAkJCSJzZXJ2ZXJBdXRoIgorI2RlZmluZSBMTl9zZXJ2ZXJfYXV0aAkJCSJUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiIKKyNkZWZpbmUgTklEX3NlcnZlcl9hdXRoCQkJMTI5CisjZGVmaW5lIE9CSl9zZXJ2ZXJfYXV0aAkJCU9CSl9pZF9rcCwxTAorCisjZGVmaW5lIFNOX2NsaWVudF9hdXRoCQkJImNsaWVudEF1dGgiCisjZGVmaW5lIExOX2NsaWVudF9hdXRoCQkJIlRMUyBXZWIgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIgorI2RlZmluZSBOSURfY2xpZW50X2F1dGgJCQkxMzAKKyNkZWZpbmUgT0JKX2NsaWVudF9hdXRoCQkJT0JKX2lkX2twLDJMCisKKyNkZWZpbmUgU05fY29kZV9zaWduCQkJImNvZGVTaWduaW5nIgorI2RlZmluZSBMTl9jb2RlX3NpZ24JCQkiQ29kZSBTaWduaW5nIgorI2RlZmluZSBOSURfY29kZV9zaWduCQkJMTMxCisjZGVmaW5lIE9CSl9jb2RlX3NpZ24JCQlPQkpfaWRfa3AsM0wKKworI2RlZmluZSBTTl9lbWFpbF9wcm90ZWN0CQkiZW1haWxQcm90ZWN0aW9uIgorI2RlZmluZSBMTl9lbWFpbF9wcm90ZWN0CQkiRS1tYWlsIFByb3RlY3Rpb24iCisjZGVmaW5lIE5JRF9lbWFpbF9wcm90ZWN0CQkxMzIKKyNkZWZpbmUgT0JKX2VtYWlsX3Byb3RlY3QJCU9CSl9pZF9rcCw0TAorCisjZGVmaW5lIFNOX3RpbWVfc3RhbXAJCQkidGltZVN0YW1waW5nIgorI2RlZmluZSBMTl90aW1lX3N0YW1wCQkJIlRpbWUgU3RhbXBpbmciCisjZGVmaW5lIE5JRF90aW1lX3N0YW1wCQkJMTMzCisjZGVmaW5lIE9CSl90aW1lX3N0YW1wCQkJT0JKX2lkX2twLDhMCisKKy8qIEFkZGl0aW9uYWwgZXh0ZW5kZWQga2V5IHVzYWdlIE9JRHM6IE1pY3Jvc29mdCAqLworCisjZGVmaW5lIFNOX21zX2NvZGVfaW5kCQkJIm1zQ29kZUluZCIKKyNkZWZpbmUgTE5fbXNfY29kZV9pbmQJCQkiTWljcm9zb2Z0IEluZGl2aWR1YWwgQ29kZSBTaWduaW5nIgorI2RlZmluZSBOSURfbXNfY29kZV9pbmQJCQkxMzQKKyNkZWZpbmUgT0JKX21zX2NvZGVfaW5kCQkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwyTCwxTCwyMUwKKworI2RlZmluZSBTTl9tc19jb2RlX2NvbQkJCSJtc0NvZGVDb20iCisjZGVmaW5lIExOX21zX2NvZGVfY29tCQkJIk1pY3Jvc29mdCBDb21tZXJjaWFsIENvZGUgU2lnbmluZyIKKyNkZWZpbmUgTklEX21zX2NvZGVfY29tCQkJMTM1CisjZGVmaW5lIE9CSl9tc19jb2RlX2NvbQkJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMjJMCisKKyNkZWZpbmUgU05fbXNfY3RsX3NpZ24JCQkibXNDVExTaWduIgorI2RlZmluZSBMTl9tc19jdGxfc2lnbgkJCSJNaWNyb3NvZnQgVHJ1c3QgTGlzdCBTaWduaW5nIgorI2RlZmluZSBOSURfbXNfY3RsX3NpZ24JCQkxMzYKKyNkZWZpbmUgT0JKX21zX2N0bF9zaWduCQkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwxMEwsM0wsMUwKKworI2RlZmluZSBTTl9tc19zZ2MJCQkibXNTR0MiCisjZGVmaW5lIExOX21zX3NnYwkJCSJNaWNyb3NvZnQgU2VydmVyIEdhdGVkIENyeXB0byIKKyNkZWZpbmUgTklEX21zX3NnYwkJCTEzNworI2RlZmluZSBPQkpfbXNfc2djCQkJMUwsM0wsNkwsMUwsNEwsMUwsMzExTCwxMEwsM0wsM0wKKworI2RlZmluZSBTTl9tc19lZnMJCQkibXNFRlMiCisjZGVmaW5lIExOX21zX2VmcwkJCSJNaWNyb3NvZnQgRW5jcnlwdGVkIEZpbGUgU3lzdGVtIgorI2RlZmluZSBOSURfbXNfZWZzCQkJMTM4CisjZGVmaW5lIE9CSl9tc19lZnMJCQkxTCwzTCw2TCwxTCw0TCwxTCwzMTFMLDEwTCwzTCw0TAorCisvKiBBZGRpdGlvbmFsIHVzYWdlOiBOZXRzY2FwZSAqLworCisjZGVmaW5lIFNOX25zX3NnYwkJCSJuc1NHQyIKKyNkZWZpbmUgTE5fbnNfc2djCQkJIk5ldHNjYXBlIFNlcnZlciBHYXRlZCBDcnlwdG8iCisjZGVmaW5lIE5JRF9uc19zZ2MJCQkxMzkKKyNkZWZpbmUgT0JKX25zX3NnYwkJCU9CSl9uZXRzY2FwZSw0TCwxTAorCisjZGVmaW5lIFNOX2RlbHRhX2NybAkJCSJkZWx0YUNSTCIKKyNkZWZpbmUgTE5fZGVsdGFfY3JsCQkJIlg1MDl2MyBEZWx0YSBDUkwgSW5kaWNhdG9yIgorI2RlZmluZSBOSURfZGVsdGFfY3JsCQkJMTQwCisjZGVmaW5lIE9CSl9kZWx0YV9jcmwJCQlPQkpfaWRfY2UsMjdMCisKKyNkZWZpbmUgU05fY3JsX3JlYXNvbgkJCSJDUkxSZWFzb24iCisjZGVmaW5lIExOX2NybF9yZWFzb24JCQkiQ1JMIFJlYXNvbiBDb2RlIgorI2RlZmluZSBOSURfY3JsX3JlYXNvbgkJCTE0MQorI2RlZmluZSBPQkpfY3JsX3JlYXNvbgkJCU9CSl9pZF9jZSwyMUwKKworI2RlZmluZSBTTl9pbnZhbGlkaXR5X2RhdGUJCSJpbnZhbGlkaXR5RGF0ZSIKKyNkZWZpbmUgTE5faW52YWxpZGl0eV9kYXRlCQkiSW52YWxpZGl0eSBEYXRlIgorI2RlZmluZSBOSURfaW52YWxpZGl0eV9kYXRlCQkxNDIKKyNkZWZpbmUgT0JKX2ludmFsaWRpdHlfZGF0ZQkJT0JKX2lkX2NlLDI0TAorCisjZGVmaW5lIFNOX3N4bmV0CQkJIlNYTmV0SUQiCisjZGVmaW5lIExOX3N4bmV0CQkJIlN0cm9uZyBFeHRyYW5ldCBJRCIKKyNkZWZpbmUgTklEX3N4bmV0CQkJMTQzCisjZGVmaW5lIE9CSl9zeG5ldAkJCTFMLDNMLDEwMUwsMUwsNEwsMUwKKworLyogUEtDUzEyIGFuZCByZWxhdGVkIE9CSkVDVCBJREVOVElGSUVSUyAqLworCisjZGVmaW5lIE9CSl9wa2NzMTIJCQlPQkpfcGtjcywxMkwKKyNkZWZpbmUgT0JKX3BrY3MxMl9wYmVpZHMJCU9CSl9wa2NzMTIsIDEKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJIlBCRS1TSEExLVJDNC0xMjgiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDNAkicGJlV2l0aFNIQTFBbmQxMjhCaXRSQzQiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJMTQ0CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzQJT0JKX3BrY3MxMl9wYmVpZHMsIDFMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQJIlBCRS1TSEExLVJDNC00MCIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kNDBCaXRSQzQJInBiZVdpdGhTSEExQW5kNDBCaXRSQzQiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDNAkxNDUKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDQwQml0UkM0CU9CSl9wa2NzMTJfcGJlaWRzLCAyTAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMJIlBCRS1TSEExLTNERVMiCisjZGVmaW5lIExOX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMJInBiZVdpdGhTSEExQW5kMy1LZXlUcmlwbGVERVMtQ0JDIgorI2RlZmluZSBOSURfcGJlX1dpdGhTSEExQW5kM19LZXlfVHJpcGxlREVTX0NCQwkxNDYKKyNkZWZpbmUgT0JKX3BiZV9XaXRoU0hBMUFuZDNfS2V5X1RyaXBsZURFU19DQkMJT0JKX3BrY3MxMl9wYmVpZHMsIDNMCisKKyNkZWZpbmUgU05fcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQwkiUEJFLVNIQTEtMkRFUyIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQwkicGJlV2l0aFNIQTFBbmQyLUtleVRyaXBsZURFUy1DQkMiCisjZGVmaW5lIE5JRF9wYmVfV2l0aFNIQTFBbmQyX0tleV9UcmlwbGVERVNfQ0JDCTE0NworI2RlZmluZSBPQkpfcGJlX1dpdGhTSEExQW5kMl9LZXlfVHJpcGxlREVTX0NCQwlPQkpfcGtjczEyX3BiZWlkcywgNEwKKworI2RlZmluZSBTTl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDCQkiUEJFLVNIQTEtUkMyLTEyOCIKKyNkZWZpbmUgTE5fcGJlX1dpdGhTSEExQW5kMTI4Qml0UkMyX0NCQwkJInBiZVdpdGhTSEExQW5kMTI4Qml0UkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZV9XaXRoU0hBMUFuZDEyOEJpdFJDMl9DQkMJMTQ4CisjZGVmaW5lIE9CSl9wYmVfV2l0aFNIQTFBbmQxMjhCaXRSQzJfQ0JDCU9CSl9wa2NzMTJfcGJlaWRzLCA1TAorCisjZGVmaW5lIFNOX3BiZV9XaXRoU0hBMUFuZDQwQml0UkMyX0NCQwkiUEJFLVNIQTEtUkMyLTQwIgorI2RlZmluZSBMTl9wYmVfV2l0aFNIQTFBbmQ0MEJpdFJDMl9DQkMJInBiZVdpdGhTSEExQW5kNDBCaXRSQzItQ0JDIgorI2RlZmluZSBOSURfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDCTE0OQorI2RlZmluZSBPQkpfcGJlX1dpdGhTSEExQW5kNDBCaXRSQzJfQ0JDCU9CSl9wa2NzMTJfcGJlaWRzLCA2TAorCisjZGVmaW5lIE9CSl9wa2NzMTJfVmVyc2lvbjEJT0JKX3BrY3MxMiwgMTBMCisKKyNkZWZpbmUgT0JKX3BrY3MxMl9CYWdJZHMJT0JKX3BrY3MxMl9WZXJzaW9uMSwgMUwKKworI2RlZmluZSBMTl9rZXlCYWcJCSJrZXlCYWciCisjZGVmaW5lIE5JRF9rZXlCYWcJCTE1MAorI2RlZmluZSBPQkpfa2V5QmFnCQlPQkpfcGtjczEyX0JhZ0lkcywgMUwKKworI2RlZmluZSBMTl9wa2NzOFNocm91ZGVkS2V5QmFnCSJwa2NzOFNocm91ZGVkS2V5QmFnIgorI2RlZmluZSBOSURfcGtjczhTaHJvdWRlZEtleUJhZwkxNTEKKyNkZWZpbmUgT0JKX3BrY3M4U2hyb3VkZWRLZXlCYWcJT0JKX3BrY3MxMl9CYWdJZHMsIDJMCisKKyNkZWZpbmUgTE5fY2VydEJhZwkJImNlcnRCYWciCisjZGVmaW5lIE5JRF9jZXJ0QmFnCQkxNTIKKyNkZWZpbmUgT0JKX2NlcnRCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLCAzTAorCisjZGVmaW5lIExOX2NybEJhZwkJImNybEJhZyIKKyNkZWZpbmUgTklEX2NybEJhZwkJMTUzCisjZGVmaW5lIE9CSl9jcmxCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLCA0TAorCisjZGVmaW5lIExOX3NlY3JldEJhZwkJInNlY3JldEJhZyIKKyNkZWZpbmUgTklEX3NlY3JldEJhZwkJMTU0CisjZGVmaW5lIE9CSl9zZWNyZXRCYWcJCU9CSl9wa2NzMTJfQmFnSWRzLCA1TAorCisjZGVmaW5lIExOX3NhZmVDb250ZW50c0JhZwkic2FmZUNvbnRlbnRzQmFnIgorI2RlZmluZSBOSURfc2FmZUNvbnRlbnRzQmFnCTE1NQorI2RlZmluZSBPQkpfc2FmZUNvbnRlbnRzQmFnCU9CSl9wa2NzMTJfQmFnSWRzLCA2TAorCisjZGVmaW5lIExOX2ZyaWVuZGx5TmFtZQkJImZyaWVuZGx5TmFtZSIKKyNkZWZpbmUJTklEX2ZyaWVuZGx5TmFtZQkxNTYKKyNkZWZpbmUgT0JKX2ZyaWVuZGx5TmFtZQlPQkpfcGtjczksIDIwTAorCisjZGVmaW5lIExOX2xvY2FsS2V5SUQJCSJsb2NhbEtleUlEIgorI2RlZmluZQlOSURfbG9jYWxLZXlJRAkJMTU3CisjZGVmaW5lIE9CSl9sb2NhbEtleUlECQlPQkpfcGtjczksIDIxTAorCisjZGVmaW5lIE9CSl9jZXJ0VHlwZXMJCU9CSl9wa2NzOSwgMjJMCisKKyNkZWZpbmUgTE5feDUwOUNlcnRpZmljYXRlCSJ4NTA5Q2VydGlmaWNhdGUiCisjZGVmaW5lCU5JRF94NTA5Q2VydGlmaWNhdGUJMTU4CisjZGVmaW5lIE9CSl94NTA5Q2VydGlmaWNhdGUJT0JKX2NlcnRUeXBlcywgMUwKKworI2RlZmluZSBMTl9zZHNpQ2VydGlmaWNhdGUJInNkc2lDZXJ0aWZpY2F0ZSIKKyNkZWZpbmUJTklEX3Nkc2lDZXJ0aWZpY2F0ZQkxNTkKKyNkZWZpbmUgT0JKX3Nkc2lDZXJ0aWZpY2F0ZQlPQkpfY2VydFR5cGVzLCAyTAorCisjZGVmaW5lIE9CSl9jcmxUeXBlcwkJT0JKX3BrY3M5LCAyM0wKKworI2RlZmluZSBMTl94NTA5Q3JsCQkieDUwOUNybCIKKyNkZWZpbmUJTklEX3g1MDlDcmwJCTE2MAorI2RlZmluZSBPQkpfeDUwOUNybAkJT0JKX2NybFR5cGVzLCAxTAorCisvKiBQS0NTIzUgdjIgT0lEcyAqLworCisjZGVmaW5lIExOX3BiZXMyCQkiUEJFUzIiCisjZGVmaW5lIE5JRF9wYmVzMgkJMTYxCisjZGVmaW5lIE9CSl9wYmVzMgkJT0JKX3BrY3MsNUwsMTNMCisKKyNkZWZpbmUgTE5fcGJtYWMxCQkiUEJNQUMxIgorI2RlZmluZSBOSURfcGJtYWMxCQkxNjIKKyNkZWZpbmUgT0JKX3BibWFjMQkJT0JKX3BrY3MsNUwsMTRMCisKKyNkZWZpbmUgTE5faG1hY1dpdGhTSEExCQkiaG1hY1dpdGhTSEExIgorI2RlZmluZSBOSURfaG1hY1dpdGhTSEExCTE2MworI2RlZmluZSBPQkpfaG1hY1dpdGhTSEExCU9CSl9yc2Fkc2ksMkwsN0wKKworLyogUG9saWN5IFF1YWxpZmllciBJZHMgKi8KKworI2RlZmluZSBMTl9pZF9xdF9jcHMJCSJQb2xpY3kgUXVhbGlmaWVyIENQUyIKKyNkZWZpbmUgU05faWRfcXRfY3BzCQkiaWQtcXQtY3BzIgorI2RlZmluZSBOSURfaWRfcXRfY3BzCQkxNjQKKyNkZWZpbmUgT0JKX2lkX3F0X2NwcwkJT0JKX2lkX3BraXgsMkwsMUwKKworI2RlZmluZSBMTl9pZF9xdF91bm90aWNlCSJQb2xpY3kgUXVhbGlmaWVyIFVzZXIgTm90aWNlIgorI2RlZmluZSBTTl9pZF9xdF91bm90aWNlCSJpZC1xdC11bm90aWNlIgorI2RlZmluZSBOSURfaWRfcXRfdW5vdGljZQkxNjUKKyNkZWZpbmUgT0JKX2lkX3F0X3Vub3RpY2UJT0JKX2lkX3BraXgsMkwsMkwKKworI2RlZmluZSBTTl9yYzJfNjRfY2JjCQkJIlJDMi02NC1DQkMiCisjZGVmaW5lIExOX3JjMl82NF9jYmMJCQkicmMyLTY0LWNiYyIKKyNkZWZpbmUgTklEX3JjMl82NF9jYmMJCQkxNjYKKworI2RlZmluZSBTTl9TTUlNRUNhcGFiaWxpdGllcwkJIlNNSU1FLUNBUFMiCisjZGVmaW5lIExOX1NNSU1FQ2FwYWJpbGl0aWVzCQkiUy9NSU1FIENhcGFiaWxpdGllcyIKKyNkZWZpbmUgTklEX1NNSU1FQ2FwYWJpbGl0aWVzCQkxNjcKKyNkZWZpbmUgT0JKX1NNSU1FQ2FwYWJpbGl0aWVzCQlPQkpfcGtjczksMTVMCisKKyNkZWZpbmUgU05fcGJlV2l0aE1EMkFuZFJDMl9DQkMJCSJQQkUtTUQyLVJDMi02NCIKKyNkZWZpbmUgTE5fcGJlV2l0aE1EMkFuZFJDMl9DQkMJCSJwYmVXaXRoTUQyQW5kUkMyLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhNRDJBbmRSQzJfQ0JDCTE2OAorI2RlZmluZSBPQkpfcGJlV2l0aE1EMkFuZFJDMl9DQkMJT0JKX3BrY3MsNUwsNEwKKworI2RlZmluZSBTTl9wYmVXaXRoTUQ1QW5kUkMyX0NCQwkJIlBCRS1NRDUtUkMyLTY0IgorI2RlZmluZSBMTl9wYmVXaXRoTUQ1QW5kUkMyX0NCQwkJInBiZVdpdGhNRDVBbmRSQzItQ0JDIgorI2RlZmluZSBOSURfcGJlV2l0aE1ENUFuZFJDMl9DQkMJMTY5CisjZGVmaW5lIE9CSl9wYmVXaXRoTUQ1QW5kUkMyX0NCQwlPQkpfcGtjcyw1TCw2TAorCisjZGVmaW5lIFNOX3BiZVdpdGhTSEExQW5kREVTX0NCQwkiUEJFLVNIQTEtREVTIgorI2RlZmluZSBMTl9wYmVXaXRoU0hBMUFuZERFU19DQkMJInBiZVdpdGhTSEExQW5kREVTLUNCQyIKKyNkZWZpbmUgTklEX3BiZVdpdGhTSEExQW5kREVTX0NCQwkxNzAKKyNkZWZpbmUgT0JKX3BiZVdpdGhTSEExQW5kREVTX0NCQwlPQkpfcGtjcyw1TCwxMEwKKworLyogRXh0ZW5zaW9uIHJlcXVlc3QgT0lEcyAqLworCisjZGVmaW5lIExOX21zX2V4dF9yZXEJCQkiTWljcm9zb2Z0IEV4dGVuc2lvbiBSZXF1ZXN0IgorI2RlZmluZSBTTl9tc19leHRfcmVxCQkJIm1zRXh0UmVxIgorI2RlZmluZSBOSURfbXNfZXh0X3JlcQkJCTE3MQorI2RlZmluZSBPQkpfbXNfZXh0X3JlcQkJCTFMLDNMLDZMLDFMLDRMLDFMLDMxMUwsMkwsMUwsMTRMCisKKyNkZWZpbmUgTE5fZXh0X3JlcQkJCSJFeHRlbnNpb24gUmVxdWVzdCIKKyNkZWZpbmUgU05fZXh0X3JlcQkJCSJleHRSZXEiCisjZGVmaW5lIE5JRF9leHRfcmVxCQkJMTcyCisjZGVmaW5lIE9CSl9leHRfcmVxCQkJT0JKX3BrY3M5LDE0TAorCisjZGVmaW5lIFNOX25hbWUJCQkJIm5hbWUiCisjZGVmaW5lIExOX25hbWUJCQkJIm5hbWUiCisjZGVmaW5lIE5JRF9uYW1lCQkJMTczCisjZGVmaW5lIE9CSl9uYW1lCQkJT0JKX1g1MDksNDFMCisKKyNkZWZpbmUgU05fZG5RdWFsaWZpZXIJCQkiZG5RdWFsaWZpZXIiCisjZGVmaW5lIExOX2RuUXVhbGlmaWVyCQkJImRuUXVhbGlmaWVyIgorI2RlZmluZSBOSURfZG5RdWFsaWZpZXIJCQkxNzQKKyNkZWZpbmUgT0JKX2RuUXVhbGlmaWVyCQkJT0JKX1g1MDksNDZMCisKKyNkZWZpbmUgU05faWRfcGUJCQkiaWQtcGUiCisjZGVmaW5lIE5JRF9pZF9wZQkJCTE3NQorI2RlZmluZSBPQkpfaWRfcGUJCQlPQkpfaWRfcGtpeCwxTAorCisjZGVmaW5lIFNOX2lkX2FkCQkJImlkLWFkIgorI2RlZmluZSBOSURfaWRfYWQJCQkxNzYKKyNkZWZpbmUgT0JKX2lkX2FkCQkJT0JKX2lkX3BraXgsNDhMCisKKyNkZWZpbmUgU05faW5mb19hY2Nlc3MJCQkiYXV0aG9yaXR5SW5mb0FjY2VzcyIKKyNkZWZpbmUgTE5faW5mb19hY2Nlc3MJCQkiQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzcyIKKyNkZWZpbmUgTklEX2luZm9fYWNjZXNzCQkJMTc3CisjZGVmaW5lIE9CSl9pbmZvX2FjY2VzcwkJCU9CSl9pZF9wZSwxTAorCisjZGVmaW5lIFNOX2FkX09DU1AJCQkiT0NTUCIKKyNkZWZpbmUgTE5fYWRfT0NTUAkJCSJPQ1NQIgorI2RlZmluZSBOSURfYWRfT0NTUAkJCTE3OAorI2RlZmluZSBPQkpfYWRfT0NTUAkJCU9CSl9pZF9hZCwxTAorCisjZGVmaW5lIFNOX2FkX2NhX2lzc3VlcnMJCSJjYUlzc3VlcnMiCisjZGVmaW5lIExOX2FkX2NhX2lzc3VlcnMJCSJDQSBJc3N1ZXJzIgorI2RlZmluZSBOSURfYWRfY2FfaXNzdWVycwkJMTc5CisjZGVmaW5lIE9CSl9hZF9jYV9pc3N1ZXJzCQlPQkpfaWRfYWQsMkwKKworI2RlZmluZSBTTl9PQ1NQX3NpZ24JCQkiT0NTUFNpZ25pbmciCisjZGVmaW5lIExOX09DU1Bfc2lnbgkJCSJPQ1NQIFNpZ25pbmciCisjZGVmaW5lIE5JRF9PQ1NQX3NpZ24JCQkxODAKKyNkZWZpbmUgT0JKX09DU1Bfc2lnbgkJCU9CSl9pZF9rcCw5TAorI2VuZGlmIC8qIFVTRV9PQkpfTUFDICovCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjZGVmaW5lCU9CSl9OQU1FX1RZUEVfVU5ERUYJCTB4MDAKKyNkZWZpbmUJT0JKX05BTUVfVFlQRV9NRF9NRVRICQkweDAxCisjZGVmaW5lCU9CSl9OQU1FX1RZUEVfQ0lQSEVSX01FVEgJMHgwMgorI2RlZmluZQlPQkpfTkFNRV9UWVBFX1BLRVlfTUVUSAkJMHgwMworI2RlZmluZQlPQkpfTkFNRV9UWVBFX0NPTVBfTUVUSAkJMHgwNAorI2RlZmluZQlPQkpfTkFNRV9UWVBFX05VTQkJMHgwNQorCisjZGVmaW5lCU9CSl9OQU1FX0FMSUFTCQkJMHg4MDAwCisKKyNkZWZpbmUgT0JKX0JTRUFSQ0hfVkFMVUVfT05fTk9NQVRDSAkJMHgwMQorI2RlZmluZSBPQkpfQlNFQVJDSF9GSVJTVF9WQUxVRV9PTl9NQVRDSAkweDAyCisKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgb2JqX25hbWVfc3QKKwl7CisJaW50IHR5cGU7CisJaW50IGFsaWFzOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZGF0YTsKKwl9IE9CSl9OQU1FOworCisjZGVmaW5lCQlPQkpfY3JlYXRlX2FuZF9hZGRfb2JqZWN0KGEsYixjKSBPQkpfY3JlYXRlKGEsYixjKQorCisKK2ludCBPQkpfTkFNRV9pbml0KHZvaWQpOworaW50IE9CSl9OQU1FX25ld19pbmRleCh1bnNpZ25lZCBsb25nICgqaGFzaF9mdW5jKShjb25zdCBjaGFyICopLAorCQkgICAgICAgaW50ICgqY21wX2Z1bmMpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSwKKwkJICAgICAgIHZvaWQgKCpmcmVlX2Z1bmMpKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKK2NvbnN0IGNoYXIgKk9CSl9OQU1FX2dldChjb25zdCBjaGFyICpuYW1lLGludCB0eXBlKTsKK2ludCBPQkpfTkFNRV9hZGQoY29uc3QgY2hhciAqbmFtZSxpbnQgdHlwZSxjb25zdCBjaGFyICpkYXRhKTsKK2ludCBPQkpfTkFNRV9yZW1vdmUoY29uc3QgY2hhciAqbmFtZSxpbnQgdHlwZSk7Cit2b2lkIE9CSl9OQU1FX2NsZWFudXAoaW50IHR5cGUpOyAvKiAtMSBmb3IgZXZlcnl0aGluZyAqLwordm9pZCBPQkpfTkFNRV9kb19hbGwoaW50IHR5cGUsdm9pZCAoKmZuKShjb25zdCBPQkpfTkFNRSAqLHZvaWQgKmFyZyksCisJCSAgICAgdm9pZCAqYXJnKTsKK3ZvaWQgT0JKX05BTUVfZG9fYWxsX3NvcnRlZChpbnQgdHlwZSx2b2lkICgqZm4pKGNvbnN0IE9CSl9OQU1FICosdm9pZCAqYXJnKSwKKwkJCSAgICB2b2lkICphcmcpOworCitBU04xX09CSkVDVCAqCU9CSl9kdXAoY29uc3QgQVNOMV9PQkpFQ1QgKm8pOworQVNOMV9PQkpFQ1QgKglPQkpfbmlkMm9iaihpbnQgbik7Citjb25zdCBjaGFyICoJT0JKX25pZDJsbihpbnQgbik7Citjb25zdCBjaGFyICoJT0JKX25pZDJzbihpbnQgbik7CitpbnQJCU9CSl9vYmoybmlkKGNvbnN0IEFTTjFfT0JKRUNUICpvKTsKK0FTTjFfT0JKRUNUICoJT0JKX3R4dDJvYmooY29uc3QgY2hhciAqcywgaW50IG5vX25hbWUpOworaW50CU9CSl9vYmoydHh0KGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGNvbnN0IEFTTjFfT0JKRUNUICphLCBpbnQgbm9fbmFtZSk7CitpbnQJCU9CSl90eHQybmlkKGNvbnN0IGNoYXIgKnMpOworaW50CQlPQkpfbG4ybmlkKGNvbnN0IGNoYXIgKnMpOworaW50CQlPQkpfc24ybmlkKGNvbnN0IGNoYXIgKnMpOworaW50CQlPQkpfY21wKGNvbnN0IEFTTjFfT0JKRUNUICphLGNvbnN0IEFTTjFfT0JKRUNUICpiKTsKK2NvbnN0IHZvaWQgKglPQkpfYnNlYXJjaF8oY29uc3Qgdm9pZCAqa2V5LGNvbnN0IHZvaWQgKmJhc2UsaW50IG51bSxpbnQgc2l6ZSwKKwkJCSAgICAgaW50ICgqY21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworY29uc3Qgdm9pZCAqCU9CSl9ic2VhcmNoX2V4Xyhjb25zdCB2b2lkICprZXksY29uc3Qgdm9pZCAqYmFzZSxpbnQgbnVtLAorCQkJCWludCBzaXplLAorCQkJCWludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopLAorCQkJCWludCBmbGFncyk7CisKKyNkZWZpbmUgX0RFQ0xBUkVfT0JKX0JTRUFSQ0hfQ01QX0ZOKHNjb3BlLCB0eXBlMSwgdHlwZTIsIG5tKQlcCisgIHN0YXRpYyBpbnQgbm0jI19jbXBfQlNFQVJDSF9DTVBfRk4oY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOyBcCisgIHN0YXRpYyBpbnQgbm0jI19jbXAodHlwZTEgY29uc3QgKiwgdHlwZTIgY29uc3QgKik7IFwKKyAgc2NvcGUgdHlwZTIgKiBPQkpfYnNlYXJjaF8jI25tKHR5cGUxICprZXksIHR5cGUyIGNvbnN0ICpiYXNlLCBpbnQgbnVtKQorCisjZGVmaW5lIERFQ0xBUkVfT0JKX0JTRUFSQ0hfQ01QX0ZOKHR5cGUxLCB0eXBlMiwgY21wKQlcCisgIF9ERUNMQVJFX09CSl9CU0VBUkNIX0NNUF9GTihzdGF0aWMsIHR5cGUxLCB0eXBlMiwgY21wKQorI2RlZmluZSBERUNMQVJFX09CSl9CU0VBUkNIX0dMT0JBTF9DTVBfRk4odHlwZTEsIHR5cGUyLCBubSkJXAorICB0eXBlMiAqIE9CSl9ic2VhcmNoXyMjbm0odHlwZTEgKmtleSwgdHlwZTIgY29uc3QgKmJhc2UsIGludCBudW0pCisKKy8qCisgKiBVbnNvbHZlZCBwcm9ibGVtOiBpZiBhIHR5cGUgaXMgYWN0dWFsbHkgYSBwb2ludGVyIHR5cGUsIGxpa2UKKyAqIG5pZF90cmlwbGUgaXMsIHRoZW4gaXRzIGltcG9zc2libGUgdG8gZ2V0IGEgY29uc3Qgd2hlcmUgeW91IG5lZWQKKyAqIGl0LiBDb25zaWRlcjoKKyAqCisgKiB0eXBlZGVmIGludCBuaWRfdHJpcGxlWzNdOworICogY29uc3Qgdm9pZCAqYV87CisgKiBjb25zdCBuaWRfdHJpcGxlIGNvbnN0ICphID0gYV87CisgKgorICogVGhlIGFzc2lnbmVtZW50IGRpc2NhcmRzIGEgY29uc3QgYmVjYXVzZSB3aGF0IHlvdSByZWFsbHkgd2FudCBpczoKKyAqCisgKiBjb25zdCBpbnQgY29uc3QgKiBjb25zdCAqYSA9IGFfOworICoKKyAqIEJ1dCBpZiB5b3UgZG8gdGhhdCwgeW91IGxvc2UgdGhlIGZhY3QgdGhhdCBhIGlzIGFuIGFycmF5IG9mIDMgaW50cywKKyAqIHdoaWNoIGJyZWFrcyBjb21wYXJpc29uIGZ1bmN0aW9ucy4KKyAqCisgKiBUaHVzIHdlIGVuZCB1cCBoYXZpbmcgdG8gY2FzdCwgc2FkbHksIG9yIHVucGFjayB0aGUKKyAqIGRlY2xhcmF0aW9ucy4gT3IsIGFzIEkgZmluYWxseSBkaWQgaW4gdGhpcyBjYXNlLCBkZWxjYXJlIG5pZF90cmlwbGUKKyAqIHRvIGJlIGEgc3RydWN0LCB3aGljaCBpdCBzaG91bGQgaGF2ZSBiZWVuIGluIHRoZSBmaXJzdCBwbGFjZS4KKyAqCisgKiBCZW4sIEF1Z3VzdCAyMDA4LgorICoKKyAqIEFsc28sIHN0cmljdGx5IHNwZWFraW5nIG5vdCBhbGwgdHlwZXMgbmVlZCBiZSBjb25zdCwgYnV0IGhhbmRsaW5nCisgKiB0aGUgbm9uLWNvbnN0bmVzcyBtZWFucyBhIGxvdCBvZiBjb21wbGljYXRpb24sIGFuZCBpbiBwcmFjdGljZQorICogY29tcGFyaXNvbiByb3V0aW5lcyBkbyBhbHdheXMgbm90IHRvdWNoIHRoZWlyIGFyZ3VtZW50cy4KKyAqLworCisjZGVmaW5lIElNUExFTUVOVF9PQkpfQlNFQVJDSF9DTVBfRk4odHlwZTEsIHR5cGUyLCBubSkJXAorICBzdGF0aWMgaW50IG5tIyNfY21wX0JTRUFSQ0hfQ01QX0ZOKGNvbnN0IHZvaWQgKmFfLCBjb25zdCB2b2lkICpiXykJXAorICAgICAgeyBcCisgICAgICB0eXBlMSBjb25zdCAqYSA9IGFfOyBcCisgICAgICB0eXBlMiBjb25zdCAqYiA9IGJfOyBcCisgICAgICByZXR1cm4gbm0jI19jbXAoYSxiKTsgXAorICAgICAgfSBcCisgIHN0YXRpYyB0eXBlMiAqT0JKX2JzZWFyY2hfIyNubSh0eXBlMSAqa2V5LCB0eXBlMiBjb25zdCAqYmFzZSwgaW50IG51bSkgXAorICAgICAgeyBcCisgICAgICByZXR1cm4gKHR5cGUyICopT0JKX2JzZWFyY2hfKGtleSwgYmFzZSwgbnVtLCBzaXplb2YodHlwZTIpLCBcCisJCQkJCW5tIyNfY21wX0JTRUFSQ0hfQ01QX0ZOKTsgXAorICAgICAgfSBcCisgICAgICBleHRlcm4gdm9pZCBkdW1teV9wcm90b3R5cGUodm9pZCkKKworI2RlZmluZSBJTVBMRU1FTlRfT0JKX0JTRUFSQ0hfR0xPQkFMX0NNUF9GTih0eXBlMSwgdHlwZTIsIG5tKQlcCisgIHN0YXRpYyBpbnQgbm0jI19jbXBfQlNFQVJDSF9DTVBfRk4oY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQlcCisgICAgICB7IFwKKyAgICAgIHR5cGUxIGNvbnN0ICphID0gYV87IFwKKyAgICAgIHR5cGUyIGNvbnN0ICpiID0gYl87IFwKKyAgICAgIHJldHVybiBubSMjX2NtcChhLGIpOyBcCisgICAgICB9IFwKKyAgdHlwZTIgKk9CSl9ic2VhcmNoXyMjbm0odHlwZTEgKmtleSwgdHlwZTIgY29uc3QgKmJhc2UsIGludCBudW0pIFwKKyAgICAgIHsgXAorICAgICAgcmV0dXJuICh0eXBlMiAqKU9CSl9ic2VhcmNoXyhrZXksIGJhc2UsIG51bSwgc2l6ZW9mKHR5cGUyKSwgXAorCQkJCQlubSMjX2NtcF9CU0VBUkNIX0NNUF9GTik7IFwKKyAgICAgIH0gXAorICAgICAgZXh0ZXJuIHZvaWQgZHVtbXlfcHJvdG90eXBlKHZvaWQpCisKKyNkZWZpbmUgT0JKX2JzZWFyY2godHlwZTEsa2V5LHR5cGUyLGJhc2UsbnVtLGNtcCkJCQkgICAgICAgXAorICAoKHR5cGUyICopT0JKX2JzZWFyY2hfKENIRUNLRURfUFRSX09GKHR5cGUxLGtleSksQ0hFQ0tFRF9QVFJfT0YodHlwZTIsYmFzZSksIFwKKwkJCSBudW0sc2l6ZW9mKHR5cGUyKSwJCQkJXAorCQkJICgodm9pZClDSEVDS0VEX1BUUl9PRih0eXBlMSxjbXAjI190eXBlXzEpLAlcCisJCQkgICh2b2lkKUNIRUNLRURfUFRSX09GKHR5cGUyLGNtcCMjX3R5cGVfMiksCVwKKwkJCSAgY21wIyNfQlNFQVJDSF9DTVBfRk4pKSkKKworI2RlZmluZSBPQkpfYnNlYXJjaF9leCh0eXBlMSxrZXksdHlwZTIsYmFzZSxudW0sY21wLGZsYWdzKQkJCVwKKyAgKCh0eXBlMiAqKU9CSl9ic2VhcmNoX2V4XyhDSEVDS0VEX1BUUl9PRih0eXBlMSxrZXkpLENIRUNLRURfUFRSX09GKHR5cGUyLGJhc2UpLCBcCisJCQkgbnVtLHNpemVvZih0eXBlMiksCQkJCVwKKwkJCSAoKHZvaWQpQ0hFQ0tFRF9QVFJfT0YodHlwZTEsY21wIyNfdHlwZV8xKSwJXAorCQkJICAodm9pZCl0eXBlXzI9Q0hFQ0tFRF9QVFJfT0YodHlwZTIsY21wIyNfdHlwZV8yKSwgXAorCQkJICBjbXAjI19CU0VBUkNIX0NNUF9GTikpLGZsYWdzKQorCitpbnQJCU9CSl9uZXdfbmlkKGludCBudW0pOworaW50CQlPQkpfYWRkX29iamVjdChjb25zdCBBU04xX09CSkVDVCAqb2JqKTsKK2ludAkJT0JKX2NyZWF0ZShjb25zdCBjaGFyICpvaWQsY29uc3QgY2hhciAqc24sY29uc3QgY2hhciAqbG4pOwordm9pZAkJT0JKX2NsZWFudXAodm9pZCApOworaW50CQlPQkpfY3JlYXRlX29iamVjdHMoQklPICppbik7CisKK2ludCBPQkpfZmluZF9zaWdpZF9hbGdzKGludCBzaWduaWQsIGludCAqcGRpZ19uaWQsIGludCAqcHBrZXlfbmlkKTsKK2ludCBPQkpfZmluZF9zaWdpZF9ieV9hbGdzKGludCAqcHNpZ25pZCwgaW50IGRpZ19uaWQsIGludCBwa2V5X25pZCk7CitpbnQgT0JKX2FkZF9zaWdpZChpbnQgc2lnbmlkLCBpbnQgZGlnX2lkLCBpbnQgcGtleV9pZCk7Cit2b2lkIE9CSl9zaWdpZF9mcmVlKHZvaWQpOworCitleHRlcm4gaW50IG9ial9jbGVhbnVwX2RlZmVyOwordm9pZCBjaGVja19kZWZlcihpbnQgbmlkKTsKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9PQkpfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBPQkogZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgT0JKX0ZfT0JKX0FERF9PQkpFQ1QJCQkJIDEwNQorI2RlZmluZSBPQkpfRl9PQkpfQ1JFQVRFCQkJCSAxMDAKKyNkZWZpbmUgT0JKX0ZfT0JKX0RVUAkJCQkJIDEwMQorI2RlZmluZSBPQkpfRl9PQkpfTkFNRV9ORVdfSU5ERVgJCQkgMTA2CisjZGVmaW5lIE9CSl9GX09CSl9OSUQyTE4JCQkJIDEwMgorI2RlZmluZSBPQkpfRl9PQkpfTklEMk9CSgkJCQkgMTAzCisjZGVmaW5lIE9CSl9GX09CSl9OSUQyU04JCQkJIDEwNAorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIE9CSl9SX01BTExPQ19GQUlMVVJFCQkJCSAxMDAKKyNkZWZpbmUgT0JKX1JfVU5LTk9XTl9OSUQJCQkJIDEwMQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL29jc3AuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9vY3NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlNDU3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9vY3NwLmgKQEAgLTAsMCArMSw2MjMgQEAKKy8qIG9jc3AuaCAqLworLyogV3JpdHRlbiBieSBUb20gVGl0Y2hlbmVyIDxUb21fVGl0Y2hlbmVyQGdyb292ZS5uZXQ+IGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdC4gKi8KKworLyogSGlzdG9yeToKKyAgIFRoaXMgZmlsZSB3YXMgdHJhbnNmZXJlZCB0byBSaWNoYXJkIExldml0dGUgZnJvbSBDZXJ0Q28gYnkgS2F0aHkKKyAgIFdlaW5ob2xkIGluIG1pZC1zcHJpbmcgMjAwMCB0byBiZSBpbmNsdWRlZCBpbiBPcGVuU1NMIG9yIHJlbGVhc2VkCisgICBhcyBhIHBhdGNoIGtpdC4gKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX09DU1BfSAorI2RlZmluZSBIRUFERVJfT0NTUF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NhZmVzdGFjay5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBWYXJpb3VzIGZsYWdzIGFuZCB2YWx1ZXMgKi8KKworI2RlZmluZSBPQ1NQX0RFRkFVTFRfTk9OQ0VfTEVOR1RICTE2CisKKyNkZWZpbmUgT0NTUF9OT0NFUlRTCQkJMHgxCisjZGVmaW5lIE9DU1BfTk9JTlRFUk4JCQkweDIKKyNkZWZpbmUgT0NTUF9OT1NJR1MJCQkweDQKKyNkZWZpbmUgT0NTUF9OT0NIQUlOCQkJMHg4CisjZGVmaW5lIE9DU1BfTk9WRVJJRlkJCQkweDEwCisjZGVmaW5lIE9DU1BfTk9FWFBMSUNJVAkJCTB4MjAKKyNkZWZpbmUgT0NTUF9OT0NBU0lHTgkJCTB4NDAKKyNkZWZpbmUgT0NTUF9OT0RFTEVHQVRFRAkJMHg4MAorI2RlZmluZSBPQ1NQX05PQ0hFQ0tTCQkJMHgxMDAKKyNkZWZpbmUgT0NTUF9UUlVTVE9USEVSCQkJMHgyMDAKKyNkZWZpbmUgT0NTUF9SRVNQSURfS0VZCQkJMHg0MDAKKyNkZWZpbmUgT0NTUF9OT1RJTUUJCQkweDgwMAorCisvKiAgIENlcnRJRCA6Oj0gU0VRVUVOQ0UgeworICogICAgICAgaGFzaEFsZ29yaXRobSAgICAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisgKiAgICAgICBpc3N1ZXJOYW1lSGFzaCAgICAgT0NURVQgU1RSSU5HLCAtLSBIYXNoIG9mIElzc3VlcidzIEROCisgKiAgICAgICBpc3N1ZXJLZXlIYXNoICAgICAgT0NURVQgU1RSSU5HLCAtLSBIYXNoIG9mIElzc3VlcnMgcHVibGljIGtleSAoZXhjbHVkaW5nIHRoZSB0YWcgJiBsZW5ndGggZmllbGRzKQorICogICAgICAgc2VyaWFsTnVtYmVyICAgICAgIENlcnRpZmljYXRlU2VyaWFsTnVtYmVyIH0KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9jZXJ0X2lkX3N0CisJeworCVg1MDlfQUxHT1IgKmhhc2hBbGdvcml0aG07CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmlzc3Vlck5hbWVIYXNoOworCUFTTjFfT0NURVRfU1RSSU5HICppc3N1ZXJLZXlIYXNoOworCUFTTjFfSU5URUdFUiAqc2VyaWFsTnVtYmVyOworCX0gT0NTUF9DRVJUSUQ7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoT0NTUF9DRVJUSUQpCisKKy8qICAgUmVxdWVzdCA6Oj0gICAgIFNFUVVFTkNFIHsKKyAqICAgICAgIHJlcUNlcnQgICAgICAgICAgICAgICAgICAgIENlcnRJRCwKKyAqICAgICAgIHNpbmdsZVJlcXVlc3RFeHRlbnNpb25zICAgIFswXSBFWFBMSUNJVCBFeHRlbnNpb25zIE9QVElPTkFMIH0KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9vbmVfcmVxdWVzdF9zdAorCXsKKwlPQ1NQX0NFUlRJRCAqcmVxQ2VydDsKKwlTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKnNpbmdsZVJlcXVlc3RFeHRlbnNpb25zOworCX0gT0NTUF9PTkVSRVE7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoT0NTUF9PTkVSRVEpCitERUNMQVJFX0FTTjFfU0VUX09GKE9DU1BfT05FUkVRKQorCisKKy8qICAgVEJTUmVxdWVzdCAgICAgIDo6PSAgICAgU0VRVUVOQ0UgeworICogICAgICAgdmVyc2lvbiAgICAgICAgICAgICBbMF0gRVhQTElDSVQgVmVyc2lvbiBERUZBVUxUIHYxLAorICogICAgICAgcmVxdWVzdG9yTmFtZSAgICAgICBbMV0gRVhQTElDSVQgR2VuZXJhbE5hbWUgT1BUSU9OQUwsCisgKiAgICAgICByZXF1ZXN0TGlzdCAgICAgICAgICAgICBTRVFVRU5DRSBPRiBSZXF1ZXN0LAorICogICAgICAgcmVxdWVzdEV4dGVuc2lvbnMgICBbMl0gRVhQTElDSVQgRXh0ZW5zaW9ucyBPUFRJT05BTCB9CisgKi8KK3R5cGVkZWYgc3RydWN0IG9jc3BfcmVxX2luZm9fc3QKKwl7CisJQVNOMV9JTlRFR0VSICp2ZXJzaW9uOworCUdFTkVSQUxfTkFNRSAqcmVxdWVzdG9yTmFtZTsKKwlTVEFDS19PRihPQ1NQX09ORVJFUSkgKnJlcXVlc3RMaXN0OworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqcmVxdWVzdEV4dGVuc2lvbnM7CisJfSBPQ1NQX1JFUUlORk87CisKKy8qICAgU2lnbmF0dXJlICAgICAgIDo6PSAgICAgU0VRVUVOQ0UgeworICogICAgICAgc2lnbmF0dXJlQWxnb3JpdGhtICAgQWxnb3JpdGhtSWRlbnRpZmllciwKKyAqICAgICAgIHNpZ25hdHVyZSAgICAgICAgICAgIEJJVCBTVFJJTkcsCisgKiAgICAgICBjZXJ0cyAgICAgICAgICAgICAgICBbMF0gRVhQTElDSVQgU0VRVUVOQ0UgT0YgQ2VydGlmaWNhdGUgT1BUSU9OQUwgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX3NpZ25hdHVyZV9zdAorCXsKKwlYNTA5X0FMR09SICpzaWduYXR1cmVBbGdvcml0aG07CisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmU7CisJU1RBQ0tfT0YoWDUwOSkgKmNlcnRzOworCX0gT0NTUF9TSUdOQVRVUkU7CisKKy8qICAgT0NTUFJlcXVlc3QgICAgIDo6PSAgICAgU0VRVUVOQ0UgeworICogICAgICAgdGJzUmVxdWVzdCAgICAgICAgICAgICAgICAgIFRCU1JlcXVlc3QsCisgKiAgICAgICBvcHRpb25hbFNpZ25hdHVyZSAgIFswXSAgICAgRVhQTElDSVQgU2lnbmF0dXJlIE9QVElPTkFMIH0KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9yZXF1ZXN0X3N0CisJeworCU9DU1BfUkVRSU5GTyAqdGJzUmVxdWVzdDsKKwlPQ1NQX1NJR05BVFVSRSAqb3B0aW9uYWxTaWduYXR1cmU7IC8qIE9QVElPTkFMICovCisJfSBPQ1NQX1JFUVVFU1Q7CisKKy8qICAgT0NTUFJlc3BvbnNlU3RhdHVzIDo6PSBFTlVNRVJBVEVEIHsKKyAqICAgICAgIHN1Y2Nlc3NmdWwgICAgICAgICAgICAoMCksICAgICAgLS1SZXNwb25zZSBoYXMgdmFsaWQgY29uZmlybWF0aW9ucworICogICAgICAgbWFsZm9ybWVkUmVxdWVzdCAgICAgICgxKSwgICAgICAtLUlsbGVnYWwgY29uZmlybWF0aW9uIHJlcXVlc3QKKyAqICAgICAgIGludGVybmFsRXJyb3IgICAgICAgICAoMiksICAgICAgLS1JbnRlcm5hbCBlcnJvciBpbiBpc3N1ZXIKKyAqICAgICAgIHRyeUxhdGVyICAgICAgICAgICAgICAoMyksICAgICAgLS1UcnkgYWdhaW4gbGF0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0oNCkgaXMgbm90IHVzZWQKKyAqICAgICAgIHNpZ1JlcXVpcmVkICAgICAgICAgICAoNSksICAgICAgLS1NdXN0IHNpZ24gdGhlIHJlcXVlc3QKKyAqICAgICAgIHVuYXV0aG9yaXplZCAgICAgICAgICAoNikgICAgICAgLS1SZXF1ZXN0IHVuYXV0aG9yaXplZAorICogICB9CisgKi8KKyNkZWZpbmUgT0NTUF9SRVNQT05TRV9TVEFUVVNfU1VDQ0VTU0ZVTCAgICAgICAgICAwCisjZGVmaW5lIE9DU1BfUkVTUE9OU0VfU1RBVFVTX01BTEZPUk1FRFJFUVVFU1QgICAgIDEKKyNkZWZpbmUgT0NTUF9SRVNQT05TRV9TVEFUVVNfSU5URVJOQUxFUlJPUiAgICAgICAgMgorI2RlZmluZSBPQ1NQX1JFU1BPTlNFX1NUQVRVU19UUllMQVRFUiAgICAgICAgICAgICAzCisjZGVmaW5lIE9DU1BfUkVTUE9OU0VfU1RBVFVTX1NJR1JFUVVJUkVEICAgICAgICAgIDUKKyNkZWZpbmUgT0NTUF9SRVNQT05TRV9TVEFUVVNfVU5BVVRIT1JJWkVEICAgICAgICAgNgorCisvKiAgIFJlc3BvbnNlQnl0ZXMgOjo9ICAgICAgIFNFUVVFTkNFIHsKKyAqICAgICAgIHJlc3BvbnNlVHlwZSAgIE9CSkVDVCBJREVOVElGSUVSLAorICogICAgICAgcmVzcG9uc2UgICAgICAgT0NURVQgU1RSSU5HIH0KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9yZXNwX2J5dGVzX3N0CisJeworCUFTTjFfT0JKRUNUICpyZXNwb25zZVR5cGU7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKnJlc3BvbnNlOworCX0gT0NTUF9SRVNQQllURVM7CisKKy8qICAgT0NTUFJlc3BvbnNlIDo6PSBTRVFVRU5DRSB7CisgKiAgICAgIHJlc3BvbnNlU3RhdHVzICAgICAgICAgT0NTUFJlc3BvbnNlU3RhdHVzLAorICogICAgICByZXNwb25zZUJ5dGVzICAgICAgICAgIFswXSBFWFBMSUNJVCBSZXNwb25zZUJ5dGVzIE9QVElPTkFMIH0KKyAqLworc3RydWN0IG9jc3BfcmVzcG9uc2Vfc3QKKwl7CisJQVNOMV9FTlVNRVJBVEVEICpyZXNwb25zZVN0YXR1czsKKwlPQ1NQX1JFU1BCWVRFUyAgKnJlc3BvbnNlQnl0ZXM7CisJfTsKKworLyogICBSZXNwb25kZXJJRCA6Oj0gQ0hPSUNFIHsKKyAqICAgICAgYnlOYW1lICAgWzFdIE5hbWUsCisgKiAgICAgIGJ5S2V5ICAgIFsyXSBLZXlIYXNoIH0KKyAqLworI2RlZmluZSBWX09DU1BfUkVTUElEX05BTUUgMAorI2RlZmluZSBWX09DU1BfUkVTUElEX0tFWSAgMQorc3RydWN0IG9jc3BfcmVzcG9uZGVyX2lkX3N0CisJeworCWludCB0eXBlOworCXVuaW9uICAgeworCQlYNTA5X05BTUUqIGJ5TmFtZTsKKyAgICAgICAgCUFTTjFfT0NURVRfU1RSSU5HICpieUtleTsKKwkJfSB2YWx1ZTsKKwl9OworCitERUNMQVJFX1NUQUNLX09GKE9DU1BfUkVTUElEKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX1JFU1BJRCkKKworLyogICBLZXlIYXNoIDo6PSBPQ1RFVCBTVFJJTkcgLS1TSEEtMSBoYXNoIG9mIHJlc3BvbmRlcidzIHB1YmxpYyBrZXkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tKGV4Y2x1ZGluZyB0aGUgdGFnIGFuZCBsZW5ndGggZmllbGRzKQorICovCisKKy8qICAgUmV2b2tlZEluZm8gOjo9IFNFUVVFTkNFIHsKKyAqICAgICAgIHJldm9jYXRpb25UaW1lICAgICAgICAgICAgICBHZW5lcmFsaXplZFRpbWUsCisgKiAgICAgICByZXZvY2F0aW9uUmVhc29uICAgIFswXSAgICAgRVhQTElDSVQgQ1JMUmVhc29uIE9QVElPTkFMIH0KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9yZXZva2VkX2luZm9fc3QKKwl7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnJldm9jYXRpb25UaW1lOworCUFTTjFfRU5VTUVSQVRFRCAqcmV2b2NhdGlvblJlYXNvbjsKKwl9IE9DU1BfUkVWT0tFRElORk87CisKKy8qICAgQ2VydFN0YXR1cyA6Oj0gQ0hPSUNFIHsKKyAqICAgICAgIGdvb2QgICAgICAgICAgICAgICAgWzBdICAgICBJTVBMSUNJVCBOVUxMLAorICogICAgICAgcmV2b2tlZCAgICAgICAgICAgICBbMV0gICAgIElNUExJQ0lUIFJldm9rZWRJbmZvLAorICogICAgICAgdW5rbm93biAgICAgICAgICAgICBbMl0gICAgIElNUExJQ0lUIFVua25vd25JbmZvIH0KKyAqLworI2RlZmluZSBWX09DU1BfQ0VSVFNUQVRVU19HT09EICAgIDAKKyNkZWZpbmUgVl9PQ1NQX0NFUlRTVEFUVVNfUkVWT0tFRCAxCisjZGVmaW5lIFZfT0NTUF9DRVJUU1RBVFVTX1VOS05PV04gMgordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9jZXJ0X3N0YXR1c19zdAorCXsKKwlpbnQgdHlwZTsKKwl1bmlvbgl7CisJCUFTTjFfTlVMTCAqZ29vZDsKKwkJT0NTUF9SRVZPS0VESU5GTyAqcmV2b2tlZDsKKwkJQVNOMV9OVUxMICp1bmtub3duOworCQl9IHZhbHVlOworCX0gT0NTUF9DRVJUU1RBVFVTOworCisvKiAgIFNpbmdsZVJlc3BvbnNlIDo6PSBTRVFVRU5DRSB7CisgKiAgICAgIGNlcnRJRCAgICAgICAgICAgICAgICAgICAgICAgQ2VydElELAorICogICAgICBjZXJ0U3RhdHVzICAgICAgICAgICAgICAgICAgIENlcnRTdGF0dXMsCisgKiAgICAgIHRoaXNVcGRhdGUgICAgICAgICAgICAgICAgICAgR2VuZXJhbGl6ZWRUaW1lLAorICogICAgICBuZXh0VXBkYXRlICAgICAgICAgICBbMF0gICAgIEVYUExJQ0lUIEdlbmVyYWxpemVkVGltZSBPUFRJT05BTCwKKyAqICAgICAgc2luZ2xlRXh0ZW5zaW9ucyAgICAgWzFdICAgICBFWFBMSUNJVCBFeHRlbnNpb25zIE9QVElPTkFMIH0KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9zaW5nbGVfcmVzcG9uc2Vfc3QKKwl7CisJT0NTUF9DRVJUSUQgKmNlcnRJZDsKKwlPQ1NQX0NFUlRTVEFUVVMgKmNlcnRTdGF0dXM7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnRoaXNVcGRhdGU7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKm5leHRVcGRhdGU7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpzaW5nbGVFeHRlbnNpb25zOworCX0gT0NTUF9TSU5HTEVSRVNQOworCitERUNMQVJFX1NUQUNLX09GKE9DU1BfU0lOR0xFUkVTUCkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoT0NTUF9TSU5HTEVSRVNQKQorCisvKiAgIFJlc3BvbnNlRGF0YSA6Oj0gU0VRVUVOQ0UgeworICogICAgICB2ZXJzaW9uICAgICAgICAgICAgICBbMF0gRVhQTElDSVQgVmVyc2lvbiBERUZBVUxUIHYxLAorICogICAgICByZXNwb25kZXJJRCAgICAgICAgICAgICAgUmVzcG9uZGVySUQsCisgKiAgICAgIHByb2R1Y2VkQXQgICAgICAgICAgICAgICBHZW5lcmFsaXplZFRpbWUsCisgKiAgICAgIHJlc3BvbnNlcyAgICAgICAgICAgICAgICBTRVFVRU5DRSBPRiBTaW5nbGVSZXNwb25zZSwKKyAqICAgICAgcmVzcG9uc2VFeHRlbnNpb25zICAgWzFdIEVYUExJQ0lUIEV4dGVuc2lvbnMgT1BUSU9OQUwgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX3Jlc3BvbnNlX2RhdGFfc3QKKwl7CisJQVNOMV9JTlRFR0VSICp2ZXJzaW9uOworCU9DU1BfUkVTUElEICAqcmVzcG9uZGVySWQ7CisJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnByb2R1Y2VkQXQ7CisJU1RBQ0tfT0YoT0NTUF9TSU5HTEVSRVNQKSAqcmVzcG9uc2VzOworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqcmVzcG9uc2VFeHRlbnNpb25zOworCX0gT0NTUF9SRVNQREFUQTsKKworLyogICBCYXNpY09DU1BSZXNwb25zZSAgICAgICA6Oj0gU0VRVUVOQ0UgeworICogICAgICB0YnNSZXNwb25zZURhdGEgICAgICBSZXNwb25zZURhdGEsCisgKiAgICAgIHNpZ25hdHVyZUFsZ29yaXRobSAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisgKiAgICAgIHNpZ25hdHVyZSAgICAgICAgICAgIEJJVCBTVFJJTkcsCisgKiAgICAgIGNlcnRzICAgICAgICAgICAgICAgIFswXSBFWFBMSUNJVCBTRVFVRU5DRSBPRiBDZXJ0aWZpY2F0ZSBPUFRJT05BTCB9CisgKi8KKyAgLyogTm90ZSAxOgorICAgICBUaGUgdmFsdWUgZm9yICJzaWduYXR1cmUiIGlzIHNwZWNpZmllZCBpbiB0aGUgT0NTUCByZmMyNTYwIGFzIGZvbGxvd3M6CisgICAgICJUaGUgdmFsdWUgZm9yIHRoZSBzaWduYXR1cmUgU0hBTEwgYmUgY29tcHV0ZWQgb24gdGhlIGhhc2ggb2YgdGhlIERFUgorICAgICBlbmNvZGluZyBSZXNwb25zZURhdGEuIiAgVGhpcyBtZWFucyB0aGF0IHlvdSBtdXN0IGhhc2ggdGhlIERFUi1lbmNvZGVkCisgICAgIHRic1Jlc3BvbnNlRGF0YSwgYW5kIHRoZW4gcnVuIGl0IHRocm91Z2ggYSBjcnlwdG8tc2lnbmluZyBmdW5jdGlvbiwgd2hpY2gKKyAgICAgd2lsbCAoYXQgbGVhc3Qgdy9SU0EpIGRvIGEgaGFzaC0nbictcHJpdmF0ZS1lbmNyeXB0IG9wZXJhdGlvbi4gIFRoaXMgc2VlbXMKKyAgICAgYSBiaXQgb2RkLCBidXQgdGhhdCdzIHRoZSBzcGVjLiAgQWxzbyBub3RlIHRoYXQgdGhlIGRhdGEgc3RydWN0dXJlcyBkbyBub3QKKyAgICAgbGVhdmUgYW55d2hlcmUgdG8gaW5kZXBlbmRlbnRseSBzcGVjaWZ5IHRoZSBhbGdvcml0aG0gdXNlZCBmb3IgdGhlIGluaXRpYWwKKyAgICAgaGFzaC4gU28sIHdlIGxvb2sgYXQgdGhlIHNpZ25hdHVyZS1zcGVjaWZpY2F0aW9uIGFsZ29yaXRobSwgYW5kIHRyeSB0byBkbworICAgICBzb21ldGhpbmcgaW50ZWxsaWdlbnQuCS0tIEthdGh5IFdlaW5ob2xkLCBDZXJ0Q28gKi8KKyAgLyogTm90ZSAyOgorICAgICBJdCBzZWVtcyB0aGF0IHRoZSBtZW50aW9uZWQgcGFzc2FnZSBmcm9tIFJGQyAyNTYwIChzZWN0aW9uIDQuMi4xKSBpcyBvcGVuCisgICAgIGZvciBpbnRlcnByZXRhdGlvbi4gIEkndmUgZG9uZSB0ZXN0cyBhZ2FpbnN0IGFub3RoZXIgcmVzcG9uZGVyLCBhbmQgZm91bmQKKyAgICAgdGhhdCBpdCBkb2Vzbid0IGRvIHRoZSBkb3VibGUgaGFzaGluZyB0aGF0IHRoZSBSRkMgc2VlbXMgdG8gc2F5IG9uZQorICAgICBzaG91bGQuICBUaGVyZWZvcmUsIGFsbCByZWxldmFudCBmdW5jdGlvbnMgdGFrZSBhIGZsYWcgc2F5aW5nIHdoaWNoCisgICAgIHZhcmlhbnQgc2hvdWxkIGJlIHVzZWQuCS0tIFJpY2hhcmQgTGV2aXR0ZSwgT3BlblNTTCB0ZWFtIGFuZCBDZWxvQ29tICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX2Jhc2ljX3Jlc3BvbnNlX3N0CisJeworCU9DU1BfUkVTUERBVEEgKnRic1Jlc3BvbnNlRGF0YTsKKwlYNTA5X0FMR09SICpzaWduYXR1cmVBbGdvcml0aG07CisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmU7CisJU1RBQ0tfT0YoWDUwOSkgKmNlcnRzOworCX0gT0NTUF9CQVNJQ1JFU1A7CisKKy8qCisgKiAgIENSTFJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisgKiAgICAgICAgdW5zcGVjaWZpZWQgICAgICAgICAgICAgKDApLAorICogICAgICAgIGtleUNvbXByb21pc2UgICAgICAgICAgICgxKSwKKyAqICAgICAgICBjQUNvbXByb21pc2UgICAgICAgICAgICAoMiksCisgKiAgICAgICAgYWZmaWxpYXRpb25DaGFuZ2VkICAgICAgKDMpLAorICogICAgICAgIHN1cGVyc2VkZWQgICAgICAgICAgICAgICg0KSwKKyAqICAgICAgICBjZXNzYXRpb25PZk9wZXJhdGlvbiAgICAoNSksCisgKiAgICAgICAgY2VydGlmaWNhdGVIb2xkICAgICAgICAgKDYpLAorICogICAgICAgIHJlbW92ZUZyb21DUkwgICAgICAgICAgICg4KSB9CisgKi8KKyNkZWZpbmUgT0NTUF9SRVZPS0VEX1NUQVRVU19OT1NUQVRVUyAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIE9DU1BfUkVWT0tFRF9TVEFUVVNfVU5TUEVDSUZJRUQgICAgICAgICAgICAgMAorI2RlZmluZSBPQ1NQX1JFVk9LRURfU1RBVFVTX0tFWUNPTVBST01JU0UgICAgICAgICAgIDEKKyNkZWZpbmUgT0NTUF9SRVZPS0VEX1NUQVRVU19DQUNPTVBST01JU0UgICAgICAgICAgICAyCisjZGVmaW5lIE9DU1BfUkVWT0tFRF9TVEFUVVNfQUZGSUxJQVRJT05DSEFOR0VEICAgICAgMworI2RlZmluZSBPQ1NQX1JFVk9LRURfU1RBVFVTX1NVUEVSU0VERUQgICAgICAgICAgICAgIDQKKyNkZWZpbmUgT0NTUF9SRVZPS0VEX1NUQVRVU19DRVNTQVRJT05PRk9QRVJBVElPTiAgICA1CisjZGVmaW5lIE9DU1BfUkVWT0tFRF9TVEFUVVNfQ0VSVElGSUNBVEVIT0xEICAgICAgICAgNgorI2RlZmluZSBPQ1NQX1JFVk9LRURfU1RBVFVTX1JFTU9WRUZST01DUkwgICAgICAgICAgIDgKKworLyogQ3JsSUQgOjo9IFNFUVVFTkNFIHsKKyAqICAgICBjcmxVcmwgICAgICAgICAgICAgICBbMF0gICAgIEVYUExJQ0lUIElBNVN0cmluZyBPUFRJT05BTCwKKyAqICAgICBjcmxOdW0gICAgICAgICAgICAgICBbMV0gICAgIEVYUExJQ0lUIElOVEVHRVIgT1BUSU9OQUwsCisgKiAgICAgY3JsVGltZSAgICAgICAgICAgICAgWzJdICAgICBFWFBMSUNJVCBHZW5lcmFsaXplZFRpbWUgT1BUSU9OQUwgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX2NybF9pZF9zdAorICAgICAgICB7CisJQVNOMV9JQTVTVFJJTkcgKmNybFVybDsKKwlBU04xX0lOVEVHRVIgKmNybE51bTsKKwlBU04xX0dFTkVSQUxJWkVEVElNRSAqY3JsVGltZTsKKyAgICAgICAgfSBPQ1NQX0NSTElEOworCisvKiBTZXJ2aWNlTG9jYXRvciA6Oj0gU0VRVUVOQ0UgeworICogICAgICBpc3N1ZXIgICAgTmFtZSwKKyAqICAgICAgbG9jYXRvciAgIEF1dGhvcml0eUluZm9BY2Nlc3NTeW50YXggT1BUSU9OQUwgfQorICovCit0eXBlZGVmIHN0cnVjdCBvY3NwX3NlcnZpY2VfbG9jYXRvcl9zdAorICAgICAgICB7CisJWDUwOV9OQU1FKiBpc3N1ZXI7CisJU1RBQ0tfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqbG9jYXRvcjsKKyAgICAgICAgfSBPQ1NQX1NFUlZJQ0VMT0M7CisgCisjZGVmaW5lIFBFTV9TVFJJTkdfT0NTUF9SRVFVRVNUCSJPQ1NQIFJFUVVFU1QiCisjZGVmaW5lIFBFTV9TVFJJTkdfT0NTUF9SRVNQT05TRSAiT0NTUCBSRVNQT05TRSIKKworI2RlZmluZSBkMmlfT0NTUF9SRVFVRVNUX2JpbyhicCxwKSBBU04xX2QyaV9iaW9fb2YoT0NTUF9SRVFVRVNULE9DU1BfUkVRVUVTVF9uZXcsZDJpX09DU1BfUkVRVUVTVCxicCxwKQorCisjZGVmaW5lIGQyaV9PQ1NQX1JFU1BPTlNFX2JpbyhicCxwKSBBU04xX2QyaV9iaW9fb2YoT0NTUF9SRVNQT05TRSxPQ1NQX1JFU1BPTlNFX25ldyxkMmlfT0NTUF9SRVNQT05TRSxicCxwKQorCisjZGVmaW5lCVBFTV9yZWFkX2Jpb19PQ1NQX1JFUVVFU1QoYnAseCxjYikgKE9DU1BfUkVRVUVTVCAqKVBFTV9BU04xX3JlYWRfYmlvKCBcCisgICAgIChjaGFyICooKikoKSlkMmlfT0NTUF9SRVFVRVNULFBFTV9TVFJJTkdfT0NTUF9SRVFVRVNULGJwLChjaGFyICoqKXgsY2IsTlVMTCkKKworI2RlZmluZQlQRU1fcmVhZF9iaW9fT0NTUF9SRVNQT05TRShicCx4LGNiKShPQ1NQX1JFU1BPTlNFICopUEVNX0FTTjFfcmVhZF9iaW8oXAorICAgICAoY2hhciAqKCopKCkpZDJpX09DU1BfUkVTUE9OU0UsUEVNX1NUUklOR19PQ1NQX1JFU1BPTlNFLGJwLChjaGFyICoqKXgsY2IsTlVMTCkKKworI2RlZmluZSBQRU1fd3JpdGVfYmlvX09DU1BfUkVRVUVTVChicCxvKSBcCisgICAgUEVNX0FTTjFfd3JpdGVfYmlvKChpbnQgKCopKCkpaTJkX09DU1BfUkVRVUVTVCxQRU1fU1RSSU5HX09DU1BfUkVRVUVTVCxcCisJCQlicCwoY2hhciAqKW8sIE5VTEwsTlVMTCwwLE5VTEwsTlVMTCkKKworI2RlZmluZSBQRU1fd3JpdGVfYmlvX09DU1BfUkVTUE9OU0UoYnAsbykgXAorICAgIFBFTV9BU04xX3dyaXRlX2JpbygoaW50ICgqKSgpKWkyZF9PQ1NQX1JFU1BPTlNFLFBFTV9TVFJJTkdfT0NTUF9SRVNQT05TRSxcCisJCQlicCwoY2hhciAqKW8sIE5VTEwsTlVMTCwwLE5VTEwsTlVMTCkKKworI2RlZmluZSBpMmRfT0NTUF9SRVNQT05TRV9iaW8oYnAsbykgQVNOMV9pMmRfYmlvX29mKE9DU1BfUkVTUE9OU0UsaTJkX09DU1BfUkVTUE9OU0UsYnAsbykKKworI2RlZmluZSBpMmRfT0NTUF9SRVFVRVNUX2JpbyhicCxvKSBBU04xX2kyZF9iaW9fb2YoT0NTUF9SRVFVRVNULGkyZF9PQ1NQX1JFUVVFU1QsYnAsbykKKworI2RlZmluZSBPQ1NQX1JFUVVFU1Rfc2lnbihvLHBrZXksbWQpIFwKKwlBU04xX2l0ZW1fc2lnbihBU04xX0lURU1fcnB0cihPQ1NQX1JFUUlORk8pLFwKKwkJby0+b3B0aW9uYWxTaWduYXR1cmUtPnNpZ25hdHVyZUFsZ29yaXRobSxOVUxMLFwKKwkgICAgICAgIG8tPm9wdGlvbmFsU2lnbmF0dXJlLT5zaWduYXR1cmUsby0+dGJzUmVxdWVzdCxwa2V5LG1kKQorCisjZGVmaW5lIE9DU1BfQkFTSUNSRVNQX3NpZ24obyxwa2V5LG1kLGQpIFwKKwlBU04xX2l0ZW1fc2lnbihBU04xX0lURU1fcnB0cihPQ1NQX1JFU1BEQVRBKSxvLT5zaWduYXR1cmVBbGdvcml0aG0sTlVMTCxcCisJCW8tPnNpZ25hdHVyZSxvLT50YnNSZXNwb25zZURhdGEscGtleSxtZCkKKworI2RlZmluZSBPQ1NQX1JFUVVFU1RfdmVyaWZ5KGEscikgQVNOMV9pdGVtX3ZlcmlmeShBU04xX0lURU1fcnB0cihPQ1NQX1JFUUlORk8pLFwKKyAgICAgICAgYS0+b3B0aW9uYWxTaWduYXR1cmUtPnNpZ25hdHVyZUFsZ29yaXRobSxcCisJYS0+b3B0aW9uYWxTaWduYXR1cmUtPnNpZ25hdHVyZSxhLT50YnNSZXF1ZXN0LHIpCisKKyNkZWZpbmUgT0NTUF9CQVNJQ1JFU1BfdmVyaWZ5KGEscixkKSBBU04xX2l0ZW1fdmVyaWZ5KEFTTjFfSVRFTV9ycHRyKE9DU1BfUkVTUERBVEEpLFwKKwlhLT5zaWduYXR1cmVBbGdvcml0aG0sYS0+c2lnbmF0dXJlLGEtPnRic1Jlc3BvbnNlRGF0YSxyKQorCisjZGVmaW5lIEFTTjFfQklUX1NUUklOR19kaWdlc3QoZGF0YSx0eXBlLG1kLGxlbikgXAorCUFTTjFfaXRlbV9kaWdlc3QoQVNOMV9JVEVNX3JwdHIoQVNOMV9CSVRfU1RSSU5HKSx0eXBlLGRhdGEsbWQsbGVuKQorCisjZGVmaW5lIE9DU1BfQ0VSVFNUQVRVU19kdXAoY3MpXAorICAgICAgICAgICAgICAgIChPQ1NQX0NFUlRTVEFUVVMqKUFTTjFfZHVwKChpbnQoKikoKSlpMmRfT0NTUF9DRVJUU1RBVFVTLFwKKwkJKGNoYXIgKigqKSgpKWQyaV9PQ1NQX0NFUlRTVEFUVVMsKGNoYXIgKikoY3MpKQorCitPQ1NQX0NFUlRJRCAqT0NTUF9DRVJUSURfZHVwKE9DU1BfQ0VSVElEICppZCk7CisKK09DU1BfUkVTUE9OU0UgKk9DU1Bfc2VuZHJlcV9iaW8oQklPICpiLCBjaGFyICpwYXRoLCBPQ1NQX1JFUVVFU1QgKnJlcSk7CitPQ1NQX1JFUV9DVFggKk9DU1Bfc2VuZHJlcV9uZXcoQklPICppbywgY2hhciAqcGF0aCwgT0NTUF9SRVFVRVNUICpyZXEsCisJCQkJCQkJCWludCBtYXhsaW5lKTsKK2ludCBPQ1NQX3NlbmRyZXFfbmJpbyhPQ1NQX1JFU1BPTlNFICoqcHJlc3AsIE9DU1BfUkVRX0NUWCAqcmN0eCk7Cit2b2lkIE9DU1BfUkVRX0NUWF9mcmVlKE9DU1BfUkVRX0NUWCAqcmN0eCk7CitpbnQgT0NTUF9SRVFfQ1RYX3NldDFfcmVxKE9DU1BfUkVRX0NUWCAqcmN0eCwgT0NTUF9SRVFVRVNUICpyZXEpOworaW50IE9DU1BfUkVRX0NUWF9hZGQxX2hlYWRlcihPQ1NQX1JFUV9DVFggKnJjdHgsCisJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKTsKKworT0NTUF9DRVJUSUQgKk9DU1BfY2VydF90b19pZChjb25zdCBFVlBfTUQgKmRnc3QsIFg1MDkgKnN1YmplY3QsIFg1MDkgKmlzc3Vlcik7CisKK09DU1BfQ0VSVElEICpPQ1NQX2NlcnRfaWRfbmV3KGNvbnN0IEVWUF9NRCAqZGdzdCwgCisJCQkgICAgICBYNTA5X05BTUUgKmlzc3Vlck5hbWUsIAorCQkJICAgICAgQVNOMV9CSVRfU1RSSU5HKiBpc3N1ZXJLZXksIAorCQkJICAgICAgQVNOMV9JTlRFR0VSICpzZXJpYWxOdW1iZXIpOworCitPQ1NQX09ORVJFUSAqT0NTUF9yZXF1ZXN0X2FkZDBfaWQoT0NTUF9SRVFVRVNUICpyZXEsIE9DU1BfQ0VSVElEICpjaWQpOworCitpbnQgT0NTUF9yZXF1ZXN0X2FkZDFfbm9uY2UoT0NTUF9SRVFVRVNUICpyZXEsIHVuc2lnbmVkIGNoYXIgKnZhbCwgaW50IGxlbik7CitpbnQgT0NTUF9iYXNpY19hZGQxX25vbmNlKE9DU1BfQkFTSUNSRVNQICpyZXNwLCB1bnNpZ25lZCBjaGFyICp2YWwsIGludCBsZW4pOworaW50IE9DU1BfY2hlY2tfbm9uY2UoT0NTUF9SRVFVRVNUICpyZXEsIE9DU1BfQkFTSUNSRVNQICpicyk7CitpbnQgT0NTUF9jb3B5X25vbmNlKE9DU1BfQkFTSUNSRVNQICpyZXNwLCBPQ1NQX1JFUVVFU1QgKnJlcSk7CisKK2ludCBPQ1NQX3JlcXVlc3Rfc2V0MV9uYW1lKE9DU1BfUkVRVUVTVCAqcmVxLCBYNTA5X05BTUUgKm5tKTsKK2ludCBPQ1NQX3JlcXVlc3RfYWRkMV9jZXJ0KE9DU1BfUkVRVUVTVCAqcmVxLCBYNTA5ICpjZXJ0KTsKKworaW50IE9DU1BfcmVxdWVzdF9zaWduKE9DU1BfUkVRVUVTVCAgICpyZXEsCisJCSAgICAgIFg1MDkgICAgICAgICAgICpzaWduZXIsCisJCSAgICAgIEVWUF9QS0VZICAgICAgICprZXksCisJCSAgICAgIGNvbnN0IEVWUF9NRCAgICpkZ3N0LAorCQkgICAgICBTVEFDS19PRihYNTA5KSAqY2VydHMsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitpbnQgT0NTUF9yZXNwb25zZV9zdGF0dXMoT0NTUF9SRVNQT05TRSAqcmVzcCk7CitPQ1NQX0JBU0lDUkVTUCAqT0NTUF9yZXNwb25zZV9nZXQxX2Jhc2ljKE9DU1BfUkVTUE9OU0UgKnJlc3ApOworCitpbnQgT0NTUF9yZXNwX2NvdW50KE9DU1BfQkFTSUNSRVNQICpicyk7CitPQ1NQX1NJTkdMRVJFU1AgKk9DU1BfcmVzcF9nZXQwKE9DU1BfQkFTSUNSRVNQICpicywgaW50IGlkeCk7CitpbnQgT0NTUF9yZXNwX2ZpbmQoT0NTUF9CQVNJQ1JFU1AgKmJzLCBPQ1NQX0NFUlRJRCAqaWQsIGludCBsYXN0KTsKK2ludCBPQ1NQX3NpbmdsZV9nZXQwX3N0YXR1cyhPQ1NQX1NJTkdMRVJFU1AgKnNpbmdsZSwgaW50ICpyZWFzb24sCisJCQkJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKipyZXZ0aW1lLAorCQkJCUFTTjFfR0VORVJBTElaRURUSU1FICoqdGhpc3VwZCwKKwkJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqKm5leHR1cGQpOworaW50IE9DU1BfcmVzcF9maW5kX3N0YXR1cyhPQ1NQX0JBU0lDUkVTUCAqYnMsIE9DU1BfQ0VSVElEICppZCwgaW50ICpzdGF0dXMsCisJCQkJaW50ICpyZWFzb24sCisJCQkJQVNOMV9HRU5FUkFMSVpFRFRJTUUgKipyZXZ0aW1lLAorCQkJCUFTTjFfR0VORVJBTElaRURUSU1FICoqdGhpc3VwZCwKKwkJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqKm5leHR1cGQpOworaW50IE9DU1BfY2hlY2tfdmFsaWRpdHkoQVNOMV9HRU5FUkFMSVpFRFRJTUUgKnRoaXN1cGQsCisJCQlBU04xX0dFTkVSQUxJWkVEVElNRSAqbmV4dHVwZCwKKwkJCWxvbmcgc2VjLCBsb25nIG1heHNlYyk7CisKK2ludCBPQ1NQX3JlcXVlc3RfdmVyaWZ5KE9DU1BfUkVRVUVTVCAqcmVxLCBTVEFDS19PRihYNTA5KSAqY2VydHMsIFg1MDlfU1RPUkUgKnN0b3JlLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworaW50IE9DU1BfcGFyc2VfdXJsKGNoYXIgKnVybCwgY2hhciAqKnBob3N0LCBjaGFyICoqcHBvcnQsIGNoYXIgKipwcGF0aCwgaW50ICpwc3NsKTsKKworaW50IE9DU1BfaWRfaXNzdWVyX2NtcChPQ1NQX0NFUlRJRCAqYSwgT0NTUF9DRVJUSUQgKmIpOworaW50IE9DU1BfaWRfY21wKE9DU1BfQ0VSVElEICphLCBPQ1NQX0NFUlRJRCAqYik7CisKK2ludCBPQ1NQX3JlcXVlc3Rfb25lcmVxX2NvdW50KE9DU1BfUkVRVUVTVCAqcmVxKTsKK09DU1BfT05FUkVRICpPQ1NQX3JlcXVlc3Rfb25lcmVxX2dldDAoT0NTUF9SRVFVRVNUICpyZXEsIGludCBpKTsKK09DU1BfQ0VSVElEICpPQ1NQX29uZXJlcV9nZXQwX2lkKE9DU1BfT05FUkVRICpvbmUpOworaW50IE9DU1BfaWRfZ2V0MF9pbmZvKEFTTjFfT0NURVRfU1RSSU5HICoqcGlOYW1lSGFzaCwgQVNOMV9PQkpFQ1QgKipwbWQsCisJCQlBU04xX09DVEVUX1NUUklORyAqKnBpa2V5SGFzaCwKKwkJCUFTTjFfSU5URUdFUiAqKnBzZXJpYWwsIE9DU1BfQ0VSVElEICpjaWQpOworaW50IE9DU1BfcmVxdWVzdF9pc19zaWduZWQoT0NTUF9SRVFVRVNUICpyZXEpOworT0NTUF9SRVNQT05TRSAqT0NTUF9yZXNwb25zZV9jcmVhdGUoaW50IHN0YXR1cywgT0NTUF9CQVNJQ1JFU1AgKmJzKTsKK09DU1BfU0lOR0xFUkVTUCAqT0NTUF9iYXNpY19hZGQxX3N0YXR1cyhPQ1NQX0JBU0lDUkVTUCAqcnNwLAorCQkJCQkJT0NTUF9DRVJUSUQgKmNpZCwKKwkJCQkJCWludCBzdGF0dXMsIGludCByZWFzb24sCisJCQkJCQlBU04xX1RJTUUgKnJldnRpbWUsCisJCQkJCUFTTjFfVElNRSAqdGhpc3VwZCwgQVNOMV9USU1FICpuZXh0dXBkKTsKK2ludCBPQ1NQX2Jhc2ljX2FkZDFfY2VydChPQ1NQX0JBU0lDUkVTUCAqcmVzcCwgWDUwOSAqY2VydCk7CitpbnQgT0NTUF9iYXNpY19zaWduKE9DU1BfQkFTSUNSRVNQICpicnNwLCAKKwkJCVg1MDkgKnNpZ25lciwgRVZQX1BLRVkgKmtleSwgY29uc3QgRVZQX01EICpkZ3N0LAorCQkJU1RBQ0tfT0YoWDUwOSkgKmNlcnRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworWDUwOV9FWFRFTlNJT04gKk9DU1BfY3JsSURfbmV3KGNoYXIgKnVybCwgbG9uZyAqbiwgY2hhciAqdGltKTsKKworWDUwOV9FWFRFTlNJT04gKk9DU1BfYWNjZXB0X3Jlc3BvbnNlc19uZXcoY2hhciAqKm9pZHMpOworCitYNTA5X0VYVEVOU0lPTiAqT0NTUF9hcmNoaXZlX2N1dG9mZl9uZXcoY2hhciogdGltKTsKKworWDUwOV9FWFRFTlNJT04gKk9DU1BfdXJsX3N2Y2xvY19uZXcoWDUwOV9OQU1FKiBpc3N1ZXIsIGNoYXIgKip1cmxzKTsKKworaW50IE9DU1BfUkVRVUVTVF9nZXRfZXh0X2NvdW50KE9DU1BfUkVRVUVTVCAqeCk7CitpbnQgT0NTUF9SRVFVRVNUX2dldF9leHRfYnlfTklEKE9DU1BfUkVRVUVTVCAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50IE9DU1BfUkVRVUVTVF9nZXRfZXh0X2J5X09CSihPQ1NQX1JFUVVFU1QgKngsIEFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zKTsKK2ludCBPQ1NQX1JFUVVFU1RfZ2V0X2V4dF9ieV9jcml0aWNhbChPQ1NQX1JFUVVFU1QgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcyk7CitYNTA5X0VYVEVOU0lPTiAqT0NTUF9SRVFVRVNUX2dldF9leHQoT0NTUF9SRVFVRVNUICp4LCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpPQ1NQX1JFUVVFU1RfZGVsZXRlX2V4dChPQ1NQX1JFUVVFU1QgKngsIGludCBsb2MpOwordm9pZCAqT0NTUF9SRVFVRVNUX2dldDFfZXh0X2QyaShPQ1NQX1JFUVVFU1QgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpOworaW50IE9DU1BfUkVRVUVTVF9hZGQxX2V4dF9pMmQoT0NTUF9SRVFVRVNUICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CitpbnQgT0NTUF9SRVFVRVNUX2FkZF9leHQoT0NTUF9SRVFVRVNUICp4LCBYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBsb2MpOworCitpbnQgT0NTUF9PTkVSRVFfZ2V0X2V4dF9jb3VudChPQ1NQX09ORVJFUSAqeCk7CitpbnQgT0NTUF9PTkVSRVFfZ2V0X2V4dF9ieV9OSUQoT0NTUF9PTkVSRVEgKngsIGludCBuaWQsIGludCBsYXN0cG9zKTsKK2ludCBPQ1NQX09ORVJFUV9nZXRfZXh0X2J5X09CSihPQ1NQX09ORVJFUSAqeCwgQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGxhc3Rwb3MpOworaW50IE9DU1BfT05FUkVRX2dldF9leHRfYnlfY3JpdGljYWwoT0NTUF9PTkVSRVEgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcyk7CitYNTA5X0VYVEVOU0lPTiAqT0NTUF9PTkVSRVFfZ2V0X2V4dChPQ1NQX09ORVJFUSAqeCwgaW50IGxvYyk7CitYNTA5X0VYVEVOU0lPTiAqT0NTUF9PTkVSRVFfZGVsZXRlX2V4dChPQ1NQX09ORVJFUSAqeCwgaW50IGxvYyk7Cit2b2lkICpPQ1NQX09ORVJFUV9nZXQxX2V4dF9kMmkoT0NTUF9PTkVSRVEgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpOworaW50IE9DU1BfT05FUkVRX2FkZDFfZXh0X2kyZChPQ1NQX09ORVJFUSAqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50IE9DU1BfT05FUkVRX2FkZF9leHQoT0NTUF9PTkVSRVEgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7CisKK2ludCBPQ1NQX0JBU0lDUkVTUF9nZXRfZXh0X2NvdW50KE9DU1BfQkFTSUNSRVNQICp4KTsKK2ludCBPQ1NQX0JBU0lDUkVTUF9nZXRfZXh0X2J5X05JRChPQ1NQX0JBU0lDUkVTUCAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50IE9DU1BfQkFTSUNSRVNQX2dldF9leHRfYnlfT0JKKE9DU1BfQkFTSUNSRVNQICp4LCBBU04xX09CSkVDVCAqb2JqLCBpbnQgbGFzdHBvcyk7CitpbnQgT0NTUF9CQVNJQ1JFU1BfZ2V0X2V4dF9ieV9jcml0aWNhbChPQ1NQX0JBU0lDUkVTUCAqeCwgaW50IGNyaXQsIGludCBsYXN0cG9zKTsKK1g1MDlfRVhURU5TSU9OICpPQ1NQX0JBU0lDUkVTUF9nZXRfZXh0KE9DU1BfQkFTSUNSRVNQICp4LCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpPQ1NQX0JBU0lDUkVTUF9kZWxldGVfZXh0KE9DU1BfQkFTSUNSRVNQICp4LCBpbnQgbG9jKTsKK3ZvaWQgKk9DU1BfQkFTSUNSRVNQX2dldDFfZXh0X2QyaShPQ1NQX0JBU0lDUkVTUCAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CitpbnQgT0NTUF9CQVNJQ1JFU1BfYWRkMV9leHRfaTJkKE9DU1BfQkFTSUNSRVNQICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CitpbnQgT0NTUF9CQVNJQ1JFU1BfYWRkX2V4dChPQ1NQX0JBU0lDUkVTUCAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKTsKKworaW50IE9DU1BfU0lOR0xFUkVTUF9nZXRfZXh0X2NvdW50KE9DU1BfU0lOR0xFUkVTUCAqeCk7CitpbnQgT0NTUF9TSU5HTEVSRVNQX2dldF9leHRfYnlfTklEKE9DU1BfU0lOR0xFUkVTUCAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50IE9DU1BfU0lOR0xFUkVTUF9nZXRfZXh0X2J5X09CSihPQ1NQX1NJTkdMRVJFU1AgKngsIEFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zKTsKK2ludCBPQ1NQX1NJTkdMRVJFU1BfZ2V0X2V4dF9ieV9jcml0aWNhbChPQ1NQX1NJTkdMRVJFU1AgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcyk7CitYNTA5X0VYVEVOU0lPTiAqT0NTUF9TSU5HTEVSRVNQX2dldF9leHQoT0NTUF9TSU5HTEVSRVNQICp4LCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpPQ1NQX1NJTkdMRVJFU1BfZGVsZXRlX2V4dChPQ1NQX1NJTkdMRVJFU1AgKngsIGludCBsb2MpOwordm9pZCAqT0NTUF9TSU5HTEVSRVNQX2dldDFfZXh0X2QyaShPQ1NQX1NJTkdMRVJFU1AgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpOworaW50IE9DU1BfU0lOR0xFUkVTUF9hZGQxX2V4dF9pMmQoT0NTUF9TSU5HTEVSRVNQICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CitpbnQgT0NTUF9TSU5HTEVSRVNQX2FkZF9leHQoT0NTUF9TSU5HTEVSRVNQICp4LCBYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBsb2MpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfU0lOR0xFUkVTUCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9DRVJUU1RBVFVTKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX1JFVk9LRURJTkZPKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX0JBU0lDUkVTUCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVNQREFUQSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9SRVNQSUQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfUkVTUE9OU0UpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfUkVTUEJZVEVTKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPQ1NQX09ORVJFUSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9DRVJUSUQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfUkVRVUVTVCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9TSUdOQVRVUkUpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE9DU1BfUkVRSU5GTykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9DUkxJRCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoT0NTUF9TRVJWSUNFTE9DKQorCitjb25zdCBjaGFyICpPQ1NQX3Jlc3BvbnNlX3N0YXR1c19zdHIobG9uZyBzKTsKK2NvbnN0IGNoYXIgKk9DU1BfY2VydF9zdGF0dXNfc3RyKGxvbmcgcyk7Citjb25zdCBjaGFyICpPQ1NQX2NybF9yZWFzb25fc3RyKGxvbmcgcyk7CisKK2ludCBPQ1NQX1JFUVVFU1RfcHJpbnQoQklPICpicCwgT0NTUF9SRVFVRVNUKiBhLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBPQ1NQX1JFU1BPTlNFX3ByaW50KEJJTyAqYnAsIE9DU1BfUkVTUE9OU0UqIG8sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitpbnQgT0NTUF9iYXNpY192ZXJpZnkoT0NTUF9CQVNJQ1JFU1AgKmJzLCBTVEFDS19PRihYNTA5KSAqY2VydHMsCisJCQkJWDUwOV9TVE9SRSAqc3QsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX09DU1Bfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBPQ1NQIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIE9DU1BfRl9BU04xX1NUUklOR19FTkNPREUJCQkgMTAwCisjZGVmaW5lIE9DU1BfRl9EMklfT0NTUF9OT05DRQkJCQkgMTAyCisjZGVmaW5lIE9DU1BfRl9PQ1NQX0JBU0lDX0FERDFfU1RBVFVTCQkJIDEwMworI2RlZmluZSBPQ1NQX0ZfT0NTUF9CQVNJQ19TSUdOCQkJCSAxMDQKKyNkZWZpbmUgT0NTUF9GX09DU1BfQkFTSUNfVkVSSUZZCQkJIDEwNQorI2RlZmluZSBPQ1NQX0ZfT0NTUF9DRVJUX0lEX05FVwkJCQkgMTAxCisjZGVmaW5lIE9DU1BfRl9PQ1NQX0NIRUNLX0RFTEVHQVRFRAkJCSAxMDYKKyNkZWZpbmUgT0NTUF9GX09DU1BfQ0hFQ0tfSURTCQkJCSAxMDcKKyNkZWZpbmUgT0NTUF9GX09DU1BfQ0hFQ0tfSVNTVUVSCQkJIDEwOAorI2RlZmluZSBPQ1NQX0ZfT0NTUF9DSEVDS19WQUxJRElUWQkJCSAxMTUKKyNkZWZpbmUgT0NTUF9GX09DU1BfTUFUQ0hfSVNTVUVSSUQJCQkgMTA5CisjZGVmaW5lIE9DU1BfRl9PQ1NQX1BBUlNFX1VSTAkJCQkgMTE0CisjZGVmaW5lIE9DU1BfRl9PQ1NQX1JFUVVFU1RfU0lHTgkJCSAxMTAKKyNkZWZpbmUgT0NTUF9GX09DU1BfUkVRVUVTVF9WRVJJRlkJCQkgMTE2CisjZGVmaW5lIE9DU1BfRl9PQ1NQX1JFU1BPTlNFX0dFVDFfQkFTSUMJCQkgMTExCisjZGVmaW5lIE9DU1BfRl9PQ1NQX1NFTkRSRVFfQklPCQkJCSAxMTIKKyNkZWZpbmUgT0NTUF9GX09DU1BfU0VORFJFUV9OQklPCQkJIDExNworI2RlZmluZSBPQ1NQX0ZfUEFSU0VfSFRUUF9MSU5FMQkJCQkgMTE4CisjZGVmaW5lIE9DU1BfRl9SRVFVRVNUX1ZFUklGWQkJCQkgMTEzCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgT0NTUF9SX0JBRF9EQVRBCQkJCQkgMTAwCisjZGVmaW5lIE9DU1BfUl9DRVJUSUZJQ0FURV9WRVJJRllfRVJST1IJCQkgMTAxCisjZGVmaW5lIE9DU1BfUl9ESUdFU1RfRVJSCQkJCSAxMDIKKyNkZWZpbmUgT0NTUF9SX0VSUk9SX0lOX05FWFRVUERBVEVfRklFTEQJCSAxMjIKKyNkZWZpbmUgT0NTUF9SX0VSUk9SX0lOX1RISVNVUERBVEVfRklFTEQJCSAxMjMKKyNkZWZpbmUgT0NTUF9SX0VSUk9SX1BBUlNJTkdfVVJMCQkJIDEyMQorI2RlZmluZSBPQ1NQX1JfTUlTU0lOR19PQ1NQU0lHTklOR19VU0FHRQkJIDEwMworI2RlZmluZSBPQ1NQX1JfTkVYVFVQREFURV9CRUZPUkVfVEhJU1VQREFURQkJIDEyNAorI2RlZmluZSBPQ1NQX1JfTk9UX0JBU0lDX1JFU1BPTlNFCQkJIDEwNAorI2RlZmluZSBPQ1NQX1JfTk9fQ0VSVElGSUNBVEVTX0lOX0NIQUlOCQkJIDEwNQorI2RlZmluZSBPQ1NQX1JfTk9fQ09OVEVOVAkJCQkgMTA2CisjZGVmaW5lIE9DU1BfUl9OT19QVUJMSUNfS0VZCQkJCSAxMDcKKyNkZWZpbmUgT0NTUF9SX05PX1JFU1BPTlNFX0RBVEEJCQkJIDEwOAorI2RlZmluZSBPQ1NQX1JfTk9fUkVWT0tFRF9USU1FCQkJCSAxMDkKKyNkZWZpbmUgT0NTUF9SX1BSSVZBVEVfS0VZX0RPRVNfTk9UX01BVENIX0NFUlRJRklDQVRFCSAxMTAKKyNkZWZpbmUgT0NTUF9SX1JFUVVFU1RfTk9UX1NJR05FRAkJCSAxMjgKKyNkZWZpbmUgT0NTUF9SX1JFU1BPTlNFX0NPTlRBSU5TX05PX1JFVk9DQVRJT05fREFUQQkgMTExCisjZGVmaW5lIE9DU1BfUl9ST09UX0NBX05PVF9UUlVTVEVECQkJIDExMgorI2RlZmluZSBPQ1NQX1JfU0VSVkVSX1JFQURfRVJST1IJCQkgMTEzCisjZGVmaW5lIE9DU1BfUl9TRVJWRVJfUkVTUE9OU0VfRVJST1IJCQkgMTE0CisjZGVmaW5lIE9DU1BfUl9TRVJWRVJfUkVTUE9OU0VfUEFSU0VfRVJST1IJCSAxMTUKKyNkZWZpbmUgT0NTUF9SX1NFUlZFUl9XUklURV9FUlJPUgkJCSAxMTYKKyNkZWZpbmUgT0NTUF9SX1NJR05BVFVSRV9GQUlMVVJFCQkJIDExNworI2RlZmluZSBPQ1NQX1JfU0lHTkVSX0NFUlRJRklDQVRFX05PVF9GT1VORAkJIDExOAorI2RlZmluZSBPQ1NQX1JfU1RBVFVTX0VYUElSRUQJCQkJIDEyNQorI2RlZmluZSBPQ1NQX1JfU1RBVFVTX05PVF9ZRVRfVkFMSUQJCQkgMTI2CisjZGVmaW5lIE9DU1BfUl9TVEFUVVNfVE9PX09MRAkJCQkgMTI3CisjZGVmaW5lIE9DU1BfUl9VTktOT1dOX01FU1NBR0VfRElHRVNUCQkJIDExOQorI2RlZmluZSBPQ1NQX1JfVU5LTk9XTl9OSUQJCQkJIDEyMAorI2RlZmluZSBPQ1NQX1JfVU5TVVBQT1JURURfUkVRVUVTVE9STkFNRV9UWVBFCQkgMTI5CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YWM2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaApAQCAtMCwwICsxLDI1MCBAQAorLyogb3BlbnNzbGNvbmYuaCAqLworLyogV0FSTklORzogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBvcGVuc3NsY29uZi5oLmluIGJ5IENvbmZpZ3VyZS4gKi8KKworLyogT3BlblNTTCB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogKi8KKyNpZm5kZWYgT1BFTlNTTF9ET0lOR19NQUtFREVQRU5ECisKKworI2lmbmRlZiBPUEVOU1NMX05PX0NBU1QKKyMgZGVmaW5lIE9QRU5TU0xfTk9fQ0FTVAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fR01QCisjIGRlZmluZSBPUEVOU1NMX05PX0dNUAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fSURFQQorIyBkZWZpbmUgT1BFTlNTTF9OT19JREVBCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19KUEFLRQorIyBkZWZpbmUgT1BFTlNTTF9OT19KUEFLRQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorIyBkZWZpbmUgT1BFTlNTTF9OT19LUkI1CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDIKKyMgZGVmaW5lIE9QRU5TU0xfTk9fTUQyCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SQzUKKyMgZGVmaW5lIE9QRU5TU0xfTk9fUkM1CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CisjIGRlZmluZSBPUEVOU1NMX05PX1JGQzM3NzkKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKKyMgZGVmaW5lIE9QRU5TU0xfTk9fU0VFRAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBMAorIyBkZWZpbmUgT1BFTlNTTF9OT19TSEEwCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TVE9SRQorIyBkZWZpbmUgT1BFTlNTTF9OT19TVE9SRQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fV0hSTFBPT0wKKyMgZGVmaW5lIE9QRU5TU0xfTk9fV0hSTFBPT0wKKyNlbmRpZgorCisjZW5kaWYgLyogT1BFTlNTTF9ET0lOR19NQUtFREVQRU5EICovCisKKyNpZm5kZWYgT1BFTlNTTF9USFJFQURTCisjIGRlZmluZSBPUEVOU1NMX1RIUkVBRFMKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RZTkFNSUNfRU5HSU5FCisjIGRlZmluZSBPUEVOU1NMX05PX0RZTkFNSUNfRU5HSU5FCisjZW5kaWYKKworLyogVGhlIE9QRU5TU0xfTk9fKiBtYWNyb3MgYXJlIGFsc28gZGVmaW5lZCBhcyBOT18qIGlmIHRoZSBhcHBsaWNhdGlvbgorICAgYXNrcyBmb3IgaXQuICBUaGlzIGlzIGEgdHJhbnNpZW50IGZlYXR1cmUgdGhhdCBpcyBwcm92aWRlZCBmb3IgdGhvc2UKKyAgIHdobyBoYXZlbid0IGhhZCB0aGUgdGltZSB0byBkbyB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBpbiB0aGVpcgorICAgYXBwbGljYXRpb25zLiAgKi8KKyNpZmRlZiBPUEVOU1NMX0FMR09SSVRITV9ERUZJTkVTCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19DQVNUKSAmJiAhZGVmaW5lZChOT19DQVNUKQorIyAgZGVmaW5lIE5PX0NBU1QKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0dNUCkgJiYgIWRlZmluZWQoTk9fR01QKQorIyAgZGVmaW5lIE5PX0dNUAorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fSURFQSkgJiYgIWRlZmluZWQoTk9fSURFQSkKKyMgIGRlZmluZSBOT19JREVBCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19KUEFLRSkgJiYgIWRlZmluZWQoTk9fSlBBS0UpCisjICBkZWZpbmUgTk9fSlBBS0UKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX0tSQjUpICYmICFkZWZpbmVkKE5PX0tSQjUpCisjICBkZWZpbmUgTk9fS1JCNQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fTUQyKSAmJiAhZGVmaW5lZChOT19NRDIpCisjICBkZWZpbmUgTk9fTUQyCisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19SQzUpICYmICFkZWZpbmVkKE5PX1JDNSkKKyMgIGRlZmluZSBOT19SQzUKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1JGQzM3NzkpICYmICFkZWZpbmVkKE5PX1JGQzM3NzkpCisjICBkZWZpbmUgTk9fUkZDMzc3OQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fU0VFRCkgJiYgIWRlZmluZWQoTk9fU0VFRCkKKyMgIGRlZmluZSBOT19TRUVECisjIGVuZGlmCisjIGlmIGRlZmluZWQoT1BFTlNTTF9OT19TSEEwKSAmJiAhZGVmaW5lZChOT19TSEEwKQorIyAgZGVmaW5lIE5PX1NIQTAKKyMgZW5kaWYKKyMgaWYgZGVmaW5lZChPUEVOU1NMX05PX1NUT1JFKSAmJiAhZGVmaW5lZChOT19TVE9SRSkKKyMgIGRlZmluZSBOT19TVE9SRQorIyBlbmRpZgorIyBpZiBkZWZpbmVkKE9QRU5TU0xfTk9fV0hSTFBPT0wpICYmICFkZWZpbmVkKE5PX1dIUkxQT09MKQorIyAgZGVmaW5lIE5PX1dIUkxQT09MCisjIGVuZGlmCisjZW5kaWYKKworLyogY3J5cHRvL29wZW5zc2xjb25mLmguaW4gKi8KKworLyogR2VuZXJhdGUgODAzODYgY29kZT8gKi8KKyN1bmRlZiBJMzg2X09OTFkKKworI2lmICEoZGVmaW5lZChWTVMpIHx8IGRlZmluZWQoX19WTVMpKSAvKiBWTVMgdXNlcyBsb2dpY2FsIG5hbWVzIGluc3RlYWQgKi8KKyNpZiBkZWZpbmVkKEhFQURFUl9DUllQVExJQl9IKSAmJiAhZGVmaW5lZChPUEVOU1NMRElSKQorI2RlZmluZSBFTkdJTkVTRElSICIvdXNyL2xvY2FsL3NzbC9saWIvZW5naW5lcyIKKyNkZWZpbmUgT1BFTlNTTERJUiAiL3Vzci9sb2NhbC9zc2wiCisjZW5kaWYKKyNlbmRpZgorCisjdW5kZWYgT1BFTlNTTF9VTklTVEQKKyNkZWZpbmUgT1BFTlNTTF9VTklTVEQgPHVuaXN0ZC5oPgorCisjdW5kZWYgT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OCisKKyNpZiBkZWZpbmVkKEhFQURFUl9JREVBX0gpICYmICFkZWZpbmVkKElERUFfSU5UKQorI2RlZmluZSBJREVBX0lOVCB1bnNpZ25lZCBpbnQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfTUQyX0gpICYmICFkZWZpbmVkKE1EMl9JTlQpCisjZGVmaW5lIE1EMl9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDMl9IKSAmJiAhZGVmaW5lZChSQzJfSU5UKQorLyogSSBuZWVkIHRvIHB1dCBpbiBhIG1vZCBmb3IgdGhlIGFscGhhIC0gZWF5ICovCisjZGVmaW5lIFJDMl9JTlQgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX1JDNF9IKQorI2lmICFkZWZpbmVkKFJDNF9JTlQpCisvKiB1c2luZyBpbnQgdHlwZXMgbWFrZSB0aGUgc3RydWN0dXJlIGxhcmdlciBidXQgbWFrZSB0aGUgY29kZSBmYXN0ZXIKKyAqIG9uIG1vc3QgYm94ZXMgSSBoYXZlIHRlc3RlZCAtIHVwIHRvICUyMCBmYXN0ZXIuICovCisvKgorICogSSBkb24ndCBrbm93IHdoYXQgZG9lcyAibW9zdCIgbWVhbiwgYnV0IGRlY2xhcmluZyAiaW50IiBpcyBhIG11c3Qgb246CisgKiAtIEludGVsIFA2IGJlY2F1c2UgcGFydGlhbCByZWdpc3RlciBzdGFsbHMgYXJlIHZlcnkgZXhwZW5zaXZlOworICogLSBlbGRlciBBbHBoYSBiZWNhdXNlIGl0IGxhY2tzIGJ5dGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnM7CisgKi8KKyNkZWZpbmUgUkM0X0lOVCB1bnNpZ25lZCBjaGFyCisjZW5kaWYKKyNpZiAhZGVmaW5lZChSQzRfQ0hVTkspCisvKgorICogVGhpcyBlbmFibGVzIGNvZGUgaGFuZGxpbmcgZGF0YSBhbGlnbmVkIGF0IG5hdHVyYWwgQ1BVIHdvcmQKKyAqIGJvdW5kYXJ5LiBTZWUgY3J5cHRvL3JjNC9yYzRfZW5jLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAqLworI2RlZmluZSBSQzRfQ0hVTksgdW5zaWduZWQgbG9uZworI2VuZGlmCisjZW5kaWYKKworI2lmIChkZWZpbmVkKEhFQURFUl9ORVdfREVTX0gpIHx8IGRlZmluZWQoSEVBREVSX0RFU19IKSkgJiYgIWRlZmluZWQoREVTX0xPTkcpCisvKiBJZiB0aGlzIGlzIHNldCB0byAndW5zaWduZWQgaW50JyBvbiBhIERFQyBBbHBoYSwgdGhpcyBnaXZlcyBhYm91dCBhCisgKiAlMjAgc3BlZWQgdXAgKGxvbmdzIGFyZSA4IGJ5dGVzLCBpbnQncyBhcmUgNCkuICovCisjaWZuZGVmIERFU19MT05HCisjZGVmaW5lIERFU19MT05HIHVuc2lnbmVkIGludAorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoSEVBREVSX0JOX0gpICYmICFkZWZpbmVkKENPTkZJR19IRUFERVJfQk5fSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9CTl9ICisjZGVmaW5lIEJOX0xMT05HCisKKy8qIFNob3VsZCB3ZSBkZWZpbmUgQk5fRElWMlcgaGVyZT8gKi8KKworLyogT25seSBvbmUgZm9yIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGRlZmluZWQgKi8KKyN1bmRlZiBTSVhUWV9GT1VSX0JJVF9MT05HCisjdW5kZWYgU0lYVFlfRk9VUl9CSVQKKyNkZWZpbmUgVEhJUlRZX1RXT19CSVQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfUkM0X0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9SQzRfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX1JDNF9MT0NMX0gKKy8qIGlmIHRoaXMgaXMgZGVmaW5lZCBkYXRhW2ldIGlzIHVzZWQgaW5zdGVhZCBvZiAqZGF0YSwgdGhpcyBpcyBhICUyMAorICogc3BlZWR1cCBvbiB4ODYgKi8KKyN1bmRlZiBSQzRfSU5ERVgKKyNlbmRpZgorCisjaWYgZGVmaW5lZChIRUFERVJfQkZfTE9DTF9IKSAmJiAhZGVmaW5lZChDT05GSUdfSEVBREVSX0JGX0xPQ0xfSCkKKyNkZWZpbmUgQ09ORklHX0hFQURFUl9CRl9MT0NMX0gKKyNkZWZpbmUgQkZfUFRSCisjZW5kaWYgLyogSEVBREVSX0JGX0xPQ0xfSCAqLworCisjaWYgZGVmaW5lZChIRUFERVJfREVTX0xPQ0xfSCkgJiYgIWRlZmluZWQoQ09ORklHX0hFQURFUl9ERVNfTE9DTF9IKQorI2RlZmluZSBDT05GSUdfSEVBREVSX0RFU19MT0NMX0gKKyNpZm5kZWYgREVTX0RFRkFVTFRfT1BUSU9OUworLyogdGhlIGZvbGxvd2luZyBpcyB0d2Vha2VkIGZyb20gYSBjb25maWcgc2NyaXB0LCB0aGF0IGlzIHdoeSBpdCBpcyBhCisgKiBwcm90ZWN0ZWQgdW5kZWYvZGVmaW5lICovCisjaWZuZGVmIERFU19QVFIKKyN1bmRlZiBERVNfUFRSCisjZW5kaWYKKworLyogVGhpcyBoZWxwcyBDIGNvbXBpbGVyIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGNvZGUgZm9yIG11bHRpcGxlIGZ1bmN0aW9uYWwKKyAqIHVuaXRzLiAgSXQgcmVkdWNlcyByZWdpc3RlciBkZXBlbmRhbmNpZXMgYXQgdGhlIGV4cGVuc2Ugb2YgMiBtb3JlCisgKiByZWdpc3RlcnMgKi8KKyNpZm5kZWYgREVTX1JJU0MxCisjdW5kZWYgREVTX1JJU0MxCisjZW5kaWYKKworI2lmbmRlZiBERVNfUklTQzIKKyN1bmRlZiBERVNfUklTQzIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChERVNfUklTQzEpICYmIGRlZmluZWQoREVTX1JJU0MyKQorWU9VIFNIT1VMRCBOT1QgSEFWRSBCT1RIIERFU19SSVNDMSBBTkQgREVTX1JJU0MyIERFRklORUQhISEhIQorI2VuZGlmCisKKy8qIFVucm9sbCB0aGUgaW5uZXIgbG9vcCwgdGhpcyBzb21ldGltZXMgaGVscHMsIHNvbWV0aW1lcyBoaW5kZXJzLgorICogVmVyeSBtdWN5IENQVSBkZXBlbmRhbnQgKi8KKyNpZm5kZWYgREVTX1VOUk9MTAorI2RlZmluZSBERVNfVU5ST0xMCisjZW5kaWYKKworLyogVGhlc2UgZGVmYXVsdCB2YWx1ZXMgd2VyZSBzdXBwbGllZCBieQorICogUGV0ZXIgR3V0bWFuIDxwZ3V0MDAxQGNzLmF1Y2tsYW5kLmFjLm56PgorICogVGhleSBhcmUgb25seSB1c2VkIGlmIG5vdGhpbmcgZWxzZSBoYXMgYmVlbiBkZWZpbmVkICovCisjaWYgIWRlZmluZWQoREVTX1BUUikgJiYgIWRlZmluZWQoREVTX1JJU0MxKSAmJiAhZGVmaW5lZChERVNfUklTQzIpICYmICFkZWZpbmVkKERFU19VTlJPTEwpCisvKiBTcGVjaWFsIGRlZmluZXMgd2hpY2ggY2hhbmdlIHRoZSB3YXkgdGhlIGNvZGUgaXMgYnVpbHQgZGVwZW5kaW5nIG9uIHRoZQorICAgQ1BVIGFuZCBPUy4gIEZvciBTR0kgbWFjaGluZXMgeW91IGNhbiB1c2UgX01JUFNfU1pMT05HICgzMiBvciA2NCkgdG8gZmluZAorICAgZXZlbiBuZXdlciBNSVBTIENQVSdzLCBidXQgYXQgdGhlIG1vbWVudCBvbmUgc2l6ZSBmaXRzIGFsbCBmb3IKKyAgIG9wdGltaXphdGlvbiBvcHRpb25zLiAgT2xkZXIgU3BhcmMncyB3b3JrIGJldHRlciB3aXRoIG9ubHkgVU5ST0xMLCBidXQKKyAgIHRoZXJlJ3Mgbm8gd2F5IHRvIHRlbGwgYXQgY29tcGlsZSB0aW1lIHdoYXQgaXQgaXMgeW91J3JlIHJ1bm5pbmcgb24gKi8KKyAKKyNpZiBkZWZpbmVkKCBzdW4gKQkJLyogTmV3ZXIgU3BhcmMncyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzEKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKCBfX3VsdHJpeCApCS8qIE9sZGVyIE1JUFMgKi8KKyMgIGRlZmluZSBERVNfUFRSCisjICBkZWZpbmUgREVTX1JJU0MyCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZCggX19vc2YxX18gKQkvKiBBbHBoYSAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzIKKyNlbGlmIGRlZmluZWQgKCBfQUlYICkJCS8qIFJTNjAwMCAqLworICAvKiBVbmtub3duICovCisjZWxpZiBkZWZpbmVkKCBfX2hwdXggKQkJLyogSFAtUEEgKi8KKyAgLyogVW5rbm93biAqLworI2VsaWYgZGVmaW5lZCggX19hdXggKQkJLyogNjhLICovCisgIC8qIFVua25vd24gKi8KKyNlbGlmIGRlZmluZWQoIF9fZGd1eCApCQkvKiA4OEsgKGJ1dCBQNiBpbiBsYXRlc3QgYm94ZXMpICovCisjICBkZWZpbmUgREVTX1VOUk9MTAorI2VsaWYgZGVmaW5lZCggX19zZ2kgKQkJLyogTmV3ZXIgTUlQUyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzIKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZWxpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX19pMzg2X18pCS8qIHg4NiBib3hlcywgc2hvdWxkIGJlIGdjYyAqLworIyAgZGVmaW5lIERFU19QVFIKKyMgIGRlZmluZSBERVNfUklTQzEKKyMgIGRlZmluZSBERVNfVU5ST0xMCisjZW5kaWYgLyogU3lzdGVtcy1zcGVjaWZpYyBzcGVlZCBkZWZpbmVzICovCisjZW5kaWYKKworI2VuZGlmIC8qIERFU19ERUZBVUxUX09QVElPTlMgKi8KKyNlbmRpZiAvKiBIRUFERVJfREVTX0xPQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmIxMTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKQEAgLTAsMCArMSw4OSBAQAorI2lmbmRlZiBIRUFERVJfT1BFTlNTTFZfSAorI2RlZmluZSBIRUFERVJfT1BFTlNTTFZfSAorCisvKiBOdW1lcmljIHJlbGVhc2UgdmVyc2lvbiBpZGVudGlmaWVyOgorICogTU5ORkZQUFM6IG1ham9yIG1pbm9yIGZpeCBwYXRjaCBzdGF0dXMKKyAqIFRoZSBzdGF0dXMgbmliYmxlIGhhcyBvbmUgb2YgdGhlIHZhbHVlcyAwIGZvciBkZXZlbG9wbWVudCwgMSB0byBlIGZvciBiZXRhcworICogMSB0byAxNCwgYW5kIGYgZm9yIHJlbGVhc2UuICBUaGUgcGF0Y2ggbGV2ZWwgaXMgZXhhY3RseSB0aGF0LgorICogRm9yIGV4YW1wbGU6CisgKiAwLjkuMy1kZXYJICAweDAwOTAzMDAwCisgKiAwLjkuMy1iZXRhMQkgIDB4MDA5MDMwMDEKKyAqIDAuOS4zLWJldGEyLWRldiAweDAwOTAzMDAyCisgKiAwLjkuMy1iZXRhMiAgICAweDAwOTAzMDAyIChzYW1lIGFzIC4uLmJldGEyLWRldikKKyAqIDAuOS4zCSAgMHgwMDkwMzAwZgorICogMC45LjNhCSAgMHgwMDkwMzAxZgorICogMC45LjQgCSAgMHgwMDkwNDAwZgorICogMS4yLjN6CSAgMHgxMDIwMzFhZgorICoKKyAqIEZvciBjb250aW51aXR5IHJlYXNvbnMgKGJlY2F1c2UgMC45LjUgaXMgYWxyZWFkeSBvdXQsIGFuZCBpcyBjb2RlZAorICogMHgwMDkwNTEwMCksIGJldHdlZW4gMC45LjUgYW5kIDAuOS42IHRoZSBjb2Rpbmcgb2YgdGhlIHBhdGNoIGxldmVsCisgKiBwYXJ0IGlzIHNsaWdodGx5IGRpZmZlcmVudCwgYnkgc2V0dGluZyB0aGUgaGlnaGVzdCBiaXQuICBUaGlzIG1lYW5zCisgKiB0aGF0IDAuOS41YSBsb29rcyBsaWtlIHRoaXM6IDB4MDA5MDU4MWYuICBBdCAwLjkuNiwgd2UgY2FuIHN0YXJ0CisgKiB3aXRoIDB4MDA5MDYwMFMuLi4KKyAqCisgKiAoUHJpb3IgdG8gMC45LjMtZGV2IGEgZGlmZmVyZW50IHNjaGVtZSB3YXMgdXNlZDogMC45LjJiIGlzIDB4MDkyMi4pCisgKiAoUHJpb3IgdG8gMC45LjVhIGJldGExLCBhIGRpZmZlcmVudCBzY2hlbWUgd2FzIHVzZWQ6IE1NTk5GRlJCQiBmb3IKKyAqICBtYWpvciBtaW5vciBmaXggZmluYWwgcGF0Y2gvYmV0YSkKKyAqLworI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSCTB4MTAwMDAwMWZMCisjaWZkZWYgT1BFTlNTTF9GSVBTCisjZGVmaW5lIE9QRU5TU0xfVkVSU0lPTl9URVhUCSJPcGVuU1NMIDEuMC4wYS1maXBzIDEgSnVuIDIwMTAiCisjZWxzZQorI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fVEVYVAkiT3BlblNTTCAxLjAuMGEgMSBKdW4gMjAxMCIKKyNlbmRpZgorI2RlZmluZSBPUEVOU1NMX1ZFUlNJT05fUFRFWFQJIiBwYXJ0IG9mICIgT1BFTlNTTF9WRVJTSU9OX1RFWFQKKworCisvKiBUaGUgbWFjcm9zIGJlbG93IGFyZSB0byBiZSB1c2VkIGZvciBzaGFyZWQgbGlicmFyeSAoLnNvLCAuZGxsLCAuLi4pCisgKiB2ZXJzaW9uaW5nLiAgVGhhdCBraW5kIG9mIHZlcnNpb25pbmcgd29ya3MgYSBiaXQgZGlmZmVyZW50bHkgYmV0d2VlbgorICogb3BlcmF0aW5nIHN5c3RlbXMuICBUaGUgbW9zdCB1c3VhbCBzY2hlbWUgaXMgdG8gc2V0IGEgbWFqb3IgYW5kIGEgbWlub3IKKyAqIG51bWJlciwgYW5kIGhhdmUgdGhlIHJ1bnRpbWUgbG9hZGVyIGNoZWNrIHRoYXQgdGhlIG1ham9yIG51bWJlciBpcyBlcXVhbAorICogdG8gd2hhdCBpdCB3YXMgYXQgYXBwbGljYXRpb24gbGluayB0aW1lLCB3aGlsZSB0aGUgbWlub3IgbnVtYmVyIGhhcyB0bworICogYmUgZ3JlYXRlciBvciBlcXVhbCB0byB3aGF0IGl0IHdhcyBhdCBhcHBsaWNhdGlvbiBsaW5rIHRpbWUuICBXaXRoIHRoaXMKKyAqIHNjaGVtZSwgdGhlIHZlcnNpb24gbnVtYmVyIGlzIHVzdWFsbHkgcGFydCBvZiB0aGUgZmlsZSBuYW1lLCBsaWtlIHRoaXM6CisgKgorICoJbGliY3J5cHRvLnNvLjAuOQorICoKKyAqIFNvbWUgdW5peGVuIGFsc28gbWFrZSBhIHNvZnRsaW5rIHdpdGggdGhlIG1ham9yIHZlcnNvbiBudW1iZXIgb25seToKKyAqCisgKglsaWJjcnlwdG8uc28uMAorICoKKyAqIE9uIFRydTY0IGFuZCBJUklYIDYueCBpdCB3b3JrcyBhIGxpdHRsZSBiaXQgZGlmZmVyZW50bHkuICBUaGVyZSwgdGhlCisgKiBzaGFyZWQgbGlicmFyeSB2ZXJzaW9uIGlzIHN0b3JlZCBpbiB0aGUgZmlsZSwgYW5kIGlzIGFjdHVhbGx5IGEgc2VyaWVzCisgKiBvZiB2ZXJzaW9ucywgc2VwYXJhdGVkIGJ5IGNvbG9ucy4gIFRoZSByaWdodG1vc3QgdmVyc2lvbiBwcmVzZW50IGluIHRoZQorICogbGlicmFyeSB3aGVuIGxpbmtpbmcgYW4gYXBwbGljYXRpb24gaXMgc3RvcmVkIGluIHRoZSBhcHBsaWNhdGlvbiB0byBiZQorICogbWF0Y2hlZCBhdCBydW4gdGltZS4gIFdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIHJ1biwgYSBjaGVjayBpcyBkb25lIHRvCisgKiBzZWUgaWYgdGhlIGxpYnJhcnkgdmVyc2lvbiBzdG9yZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG1hdGNoZXMgYW55IG9mIHRoZQorICogdmVyc2lvbnMgaW4gdGhlIHZlcnNpb24gc3RyaW5nIG9mIHRoZSBsaWJyYXJ5IGl0c2VsZi4KKyAqIFRoaXMgdmVyc2lvbiBzdHJpbmcgY2FuIGJlIGNvbnN0cnVjdGVkIGluIGFueSB3YXksIGRlcGVuZGluZyBvbiB3aGF0CisgKiBraW5kIG9mIG1hdGNoaW5nIGlzIGRlc2lyZWQuICBIb3dldmVyLCB0byBpbXBsZW1lbnQgdGhlIHNhbWUgc2NoZW1lIGFzCisgKiB0aGUgb25lIHVzZWQgaW4gdGhlIG90aGVyIHVuaXhlbiwgYWxsIGNvbXBhdGlibGUgdmVyc2lvbnMsIGZyb20gbG93ZXN0CisgKiB0byBoaWdoZXN0LCBzaG91bGQgYmUgcGFydCBvZiB0aGUgc3RyaW5nLiAgQ29uc2VjdXRpdmUgYnVpbGRzIHdvdWxkCisgKiBnaXZlIHRoZSBmb2xsb3dpbmcgdmVyc2lvbnMgc3RyaW5nczoKKyAqCisgKgkzLjAKKyAqCTMuMDozLjEKKyAqCTMuMDozLjE6My4yCisgKgk0LjAKKyAqCTQuMDo0LjEKKyAqCisgKiBOb3RpY2UgaG93IHZlcnNpb24gNCBpcyBjb21wbGV0ZWx5IGluY29tcGF0aWJsZSB3aXRoIHZlcnNpb24sIGFuZAorICogdGhlcmVmb3JlIGdpdmUgdGhlIGJyZWFjaCB5b3UgY2FuIHNlZS4KKyAqCisgKiBUaGVyZSBtYXkgYmUgb3RoZXIgc2NoZW1lcyBhcyB3ZWxsIHRoYXQgSSBoYXZlbid0IHlldCBkaXNjb3ZlcmVkLgorICoKKyAqIFNvLCBoZXJlJ3MgdGhlIHdheSBpdCB3b3JrcyBoZXJlOiBmaXJzdCBvZiBhbGwsIHRoZSBsaWJyYXJ5IHZlcnNpb24KKyAqIG51bWJlciBkb2Vzbid0IG5lZWQgYXQgYWxsIHRvIG1hdGNoIHRoZSBvdmVyYWxsIE9wZW5TU0wgdmVyc2lvbi4KKyAqIEhvd2V2ZXIsIGl0J3MgbmljZSBhbmQgbW9yZSB1bmRlcnN0YW5kYWJsZSBpZiBpdCBhY3R1YWxseSBkb2VzLgorICogVGhlIGN1cnJlbnQgbGlicmFyeSB2ZXJzaW9uIGlzIHN0b3JlZCBpbiB0aGUgbWFjcm8gU0hMSUJfVkVSU0lPTl9OVU1CRVIsCisgKiB3aGljaCBpcyBqdXN0IGEgcGllY2Ugb2YgdGV4dCBpbiB0aGUgZm9ybWF0ICJNLm0uZSIgKE1ham9yLCBtaW5vciwgZWRpdCkuCisgKiBGb3IgdGhlIHNha2Ugb2YgVHJ1NjQsIElSSVgsIGFuZCBhbnkgb3RoZXIgT1MgdGhhdCBiZWhhdmVzIGluIHNpbWlsYXIgd2F5cywKKyAqIHdlIG5lZWQgdG8ga2VlcCBhIGhpc3Rvcnkgb2YgdmVyc2lvbiBudW1iZXJzLCB3aGljaCBpcyBkb25lIGluIHRoZQorICogbWFjcm8gU0hMSUJfVkVSU0lPTl9ISVNUT1JZLiAgVGhlIG51bWJlcnMgYXJlIHNlcGFyYXRlZCBieSBjb2xvbnMgYW5kCisgKiBzaG91bGQgb25seSBrZWVwIHRoZSB2ZXJzaW9ucyB0aGF0IGFyZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50LgorICovCisjZGVmaW5lIFNITElCX1ZFUlNJT05fSElTVE9SWSAiIgorI2RlZmluZSBTSExJQl9WRVJTSU9OX05VTUJFUiAiMS4wLjAiCisKKworI2VuZGlmIC8qIEhFQURFUl9PUEVOU1NMVl9IICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYmQ3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaApAQCAtMCwwICsxLDIwMCBAQAorLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX09QRU5TU0xfVFlQRVNfSAorI2RlZmluZSBIRUFERVJfT1BFTlNTTF9UWVBFU19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisKKyNpZmRlZiBOT19BU04xX1RZUEVERUZTCisjZGVmaW5lIEFTTjFfSU5URUdFUgkJQVNOMV9TVFJJTkcKKyNkZWZpbmUgQVNOMV9FTlVNRVJBVEVECQlBU04xX1NUUklORworI2RlZmluZSBBU04xX0JJVF9TVFJJTkcJCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfT0NURVRfU1RSSU5HCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfUFJJTlRBQkxFU1RSSU5HCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfVDYxU1RSSU5HCQlBU04xX1NUUklORworI2RlZmluZSBBU04xX0lBNVNUUklORwkJQVNOMV9TVFJJTkcKKyNkZWZpbmUgQVNOMV9VVENUSU1FCQlBU04xX1NUUklORworI2RlZmluZSBBU04xX0dFTkVSQUxJWkVEVElNRQlBU04xX1NUUklORworI2RlZmluZSBBU04xX1RJTUUJCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfR0VORVJBTFNUUklORwlBU04xX1NUUklORworI2RlZmluZSBBU04xX1VOSVZFUlNBTFNUUklORwlBU04xX1NUUklORworI2RlZmluZSBBU04xX0JNUFNUUklORwkJQVNOMV9TVFJJTkcKKyNkZWZpbmUgQVNOMV9WSVNJQkxFU1RSSU5HCUFTTjFfU1RSSU5HCisjZGVmaW5lIEFTTjFfVVRGOFNUUklORwkJQVNOMV9TVFJJTkcKKyNkZWZpbmUgQVNOMV9CT09MRUFOCQlpbnQKKyNkZWZpbmUgQVNOMV9OVUxMCQlpbnQKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0lOVEVHRVI7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0VOVU1FUkFURUQ7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0JJVF9TVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX09DVEVUX1NUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfUFJJTlRBQkxFU1RSSU5HOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9UNjFTVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0lBNVNUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfR0VORVJBTFNUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfVU5JVkVSU0FMU1RSSU5HOwordHlwZWRlZiBzdHJ1Y3QgYXNuMV9zdHJpbmdfc3QgQVNOMV9CTVBTVFJJTkc7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX1VUQ1RJTUU7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX1RJTUU7Cit0eXBlZGVmIHN0cnVjdCBhc24xX3N0cmluZ19zdCBBU04xX0dFTkVSQUxJWkVEVElNRTsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfVklTSUJMRVNUUklORzsKK3R5cGVkZWYgc3RydWN0IGFzbjFfc3RyaW5nX3N0IEFTTjFfVVRGOFNUUklORzsKK3R5cGVkZWYgaW50IEFTTjFfQk9PTEVBTjsKK3R5cGVkZWYgaW50IEFTTjFfTlVMTDsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBhc24xX3BjdHhfc3QgQVNOMV9QQ1RYOworCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzIKKyN1bmRlZiBYNTA5X05BTUUKKyN1bmRlZiBYNTA5X0VYVEVOU0lPTlMKKyN1bmRlZiBYNTA5X0NFUlRfUEFJUgorI3VuZGVmIFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMCisjdW5kZWYgT0NTUF9SRVFVRVNUCisjdW5kZWYgT0NTUF9SRVNQT05TRQorI2VuZGlmCisKKyNpZmRlZiBCSUdOVU0KKyN1bmRlZiBCSUdOVU0KKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgYmlnbnVtX3N0IEJJR05VTTsKK3R5cGVkZWYgc3RydWN0IGJpZ251bV9jdHggQk5fQ1RYOwordHlwZWRlZiBzdHJ1Y3QgYm5fYmxpbmRpbmdfc3QgQk5fQkxJTkRJTkc7Cit0eXBlZGVmIHN0cnVjdCBibl9tb250X2N0eF9zdCBCTl9NT05UX0NUWDsKK3R5cGVkZWYgc3RydWN0IGJuX3JlY3BfY3R4X3N0IEJOX1JFQ1BfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgYm5fZ2VuY2Jfc3QgQk5fR0VOQ0I7CisKK3R5cGVkZWYgc3RydWN0IGJ1Zl9tZW1fc3QgQlVGX01FTTsKKwordHlwZWRlZiBzdHJ1Y3QgZXZwX2NpcGhlcl9zdCBFVlBfQ0lQSEVSOwordHlwZWRlZiBzdHJ1Y3QgZXZwX2NpcGhlcl9jdHhfc3QgRVZQX0NJUEhFUl9DVFg7Cit0eXBlZGVmIHN0cnVjdCBlbnZfbWRfc3QgRVZQX01EOwordHlwZWRlZiBzdHJ1Y3QgZW52X21kX2N0eF9zdCBFVlBfTURfQ1RYOwordHlwZWRlZiBzdHJ1Y3QgZXZwX3BrZXlfc3QgRVZQX1BLRVk7CisKK3R5cGVkZWYgc3RydWN0IGV2cF9wa2V5X2FzbjFfbWV0aG9kX3N0IEVWUF9QS0VZX0FTTjFfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBldnBfcGtleV9tZXRob2Rfc3QgRVZQX1BLRVlfTUVUSE9EOwordHlwZWRlZiBzdHJ1Y3QgZXZwX3BrZXlfY3R4X3N0IEVWUF9QS0VZX0NUWDsKKwordHlwZWRlZiBzdHJ1Y3QgZGhfc3QgREg7Cit0eXBlZGVmIHN0cnVjdCBkaF9tZXRob2QgREhfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBkc2Ffc3QgRFNBOwordHlwZWRlZiBzdHJ1Y3QgZHNhX21ldGhvZCBEU0FfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCByc2Ffc3QgUlNBOwordHlwZWRlZiBzdHJ1Y3QgcnNhX21ldGhfc3QgUlNBX01FVEhPRDsKKwordHlwZWRlZiBzdHJ1Y3QgcmFuZF9tZXRoX3N0IFJBTkRfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBlY2RoX21ldGhvZCBFQ0RIX01FVEhPRDsKK3R5cGVkZWYgc3RydWN0IGVjZHNhX21ldGhvZCBFQ0RTQV9NRVRIT0Q7CisKK3R5cGVkZWYgc3RydWN0IHg1MDlfc3QgWDUwOTsKK3R5cGVkZWYgc3RydWN0IFg1MDlfYWxnb3Jfc3QgWDUwOV9BTEdPUjsKK3R5cGVkZWYgc3RydWN0IFg1MDlfY3JsX3N0IFg1MDlfQ1JMOwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9jcmxfbWV0aG9kX3N0IFg1MDlfQ1JMX01FVEhPRDsKK3R5cGVkZWYgc3RydWN0IHg1MDlfcmV2b2tlZF9zdCBYNTA5X1JFVk9LRUQ7Cit0eXBlZGVmIHN0cnVjdCBYNTA5X25hbWVfc3QgWDUwOV9OQU1FOwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9wdWJrZXlfc3QgWDUwOV9QVUJLRVk7Cit0eXBlZGVmIHN0cnVjdCB4NTA5X3N0b3JlX3N0IFg1MDlfU1RPUkU7Cit0eXBlZGVmIHN0cnVjdCB4NTA5X3N0b3JlX2N0eF9zdCBYNTA5X1NUT1JFX0NUWDsKKwordHlwZWRlZiBzdHJ1Y3QgcGtjczhfcHJpdl9rZXlfaW5mb19zdCBQS0NTOF9QUklWX0tFWV9JTkZPOworCit0eXBlZGVmIHN0cnVjdCB2M19leHRfY3R4IFg1MDlWM19DVFg7Cit0eXBlZGVmIHN0cnVjdCBjb25mX3N0IENPTkY7CisKK3R5cGVkZWYgc3RydWN0IHN0b3JlX3N0IFNUT1JFOwordHlwZWRlZiBzdHJ1Y3Qgc3RvcmVfbWV0aG9kX3N0IFNUT1JFX01FVEhPRDsKKwordHlwZWRlZiBzdHJ1Y3QgdWlfc3QgVUk7Cit0eXBlZGVmIHN0cnVjdCB1aV9tZXRob2Rfc3QgVUlfTUVUSE9EOworCit0eXBlZGVmIHN0cnVjdCBzdF9FUlJfRk5TIEVSUl9GTlM7CisKK3R5cGVkZWYgc3RydWN0IGVuZ2luZV9zdCBFTkdJTkU7Cit0eXBlZGVmIHN0cnVjdCBzc2xfc3QgU1NMOwordHlwZWRlZiBzdHJ1Y3Qgc3NsX2N0eF9zdCBTU0xfQ1RYOworCit0eXBlZGVmIHN0cnVjdCBYNTA5X1BPTElDWV9OT0RFX3N0IFg1MDlfUE9MSUNZX05PREU7Cit0eXBlZGVmIHN0cnVjdCBYNTA5X1BPTElDWV9MRVZFTF9zdCBYNTA5X1BPTElDWV9MRVZFTDsKK3R5cGVkZWYgc3RydWN0IFg1MDlfUE9MSUNZX1RSRUVfc3QgWDUwOV9QT0xJQ1lfVFJFRTsKK3R5cGVkZWYgc3RydWN0IFg1MDlfUE9MSUNZX0NBQ0hFX3N0IFg1MDlfUE9MSUNZX0NBQ0hFOworCit0eXBlZGVmIHN0cnVjdCBBVVRIT1JJVFlfS0VZSURfc3QgQVVUSE9SSVRZX0tFWUlEOwordHlwZWRlZiBzdHJ1Y3QgRElTVF9QT0lOVF9zdCBESVNUX1BPSU5UOwordHlwZWRlZiBzdHJ1Y3QgSVNTVUlOR19ESVNUX1BPSU5UX3N0IElTU1VJTkdfRElTVF9QT0lOVDsKK3R5cGVkZWYgc3RydWN0IE5BTUVfQ09OU1RSQUlOVFNfc3QgTkFNRV9DT05TVFJBSU5UUzsKKworICAvKiBJZiBwbGFjZWQgaW4gcGtjczEyLmgsIHdlIGVuZCB1cCB3aXRoIGEgY2lyY3VsYXIgZGVwZW5jeSB3aXRoIHBrY3M3LmggKi8KKyNkZWZpbmUgREVDTEFSRV9QS0NTMTJfU1RBQ0tfT0YodHlwZSkgLyogTm90aGluZyAqLworI2RlZmluZSBJTVBMRU1FTlRfUEtDUzEyX1NUQUNLX09GKHR5cGUpIC8qIE5vdGhpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgY3J5cHRvX2V4X2RhdGFfc3QgQ1JZUFRPX0VYX0RBVEE7CisvKiBDYWxsYmFjayB0eXBlcyBmb3IgY3J5cHRvLmggKi8KK3R5cGVkZWYgaW50IENSWVBUT19FWF9uZXcodm9pZCAqcGFyZW50LCB2b2lkICpwdHIsIENSWVBUT19FWF9EQVRBICphZCwKKwkJCQkJaW50IGlkeCwgbG9uZyBhcmdsLCB2b2lkICphcmdwKTsKK3R5cGVkZWYgdm9pZCBDUllQVE9fRVhfZnJlZSh2b2lkICpwYXJlbnQsIHZvaWQgKnB0ciwgQ1JZUFRPX0VYX0RBVEEgKmFkLAorCQkJCQlpbnQgaWR4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApOwordHlwZWRlZiBpbnQgQ1JZUFRPX0VYX2R1cChDUllQVE9fRVhfREFUQSAqdG8sIENSWVBUT19FWF9EQVRBICpmcm9tLCB2b2lkICpmcm9tX2QsIAorCQkJCQlpbnQgaWR4LCBsb25nIGFyZ2wsIHZvaWQgKmFyZ3ApOworCit0eXBlZGVmIHN0cnVjdCBvY3NwX3JlcV9jdHhfc3QgT0NTUF9SRVFfQ1RYOwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9yZXNwb25zZV9zdCBPQ1NQX1JFU1BPTlNFOwordHlwZWRlZiBzdHJ1Y3Qgb2NzcF9yZXNwb25kZXJfaWRfc3QgT0NTUF9SRVNQSUQ7CisKKyNlbmRpZiAvKiBkZWYgSEVBREVSX09QRU5TU0xfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BlbS5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNmFiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcGVtLmgKQEAgLTAsMCArMSw2NDEgQEAKKy8qIGNyeXB0by9wZW0vcGVtLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfUEVNX0gKKyNkZWZpbmUgSEVBREVSX1BFTV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NUQUNLCisjaW5jbHVkZSA8b3BlbnNzbC9zdGFjay5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbTIuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBQRU1fQlVGU0laRQkJMTAyNAorCisjZGVmaW5lIFBFTV9PQkpfVU5ERUYJCTAKKyNkZWZpbmUgUEVNX09CSl9YNTA5CQkxCisjZGVmaW5lIFBFTV9PQkpfWDUwOV9SRVEJMgorI2RlZmluZSBQRU1fT0JKX0NSTAkJMworI2RlZmluZSBQRU1fT0JKX1NTTF9TRVNTSU9OCTQKKyNkZWZpbmUgUEVNX09CSl9QUklWX0tFWQkxMAorI2RlZmluZSBQRU1fT0JKX1BSSVZfUlNBCTExCisjZGVmaW5lIFBFTV9PQkpfUFJJVl9EU0EJMTIKKyNkZWZpbmUgUEVNX09CSl9QUklWX0RICQkxMworI2RlZmluZSBQRU1fT0JKX1BVQl9SU0EJCTE0CisjZGVmaW5lIFBFTV9PQkpfUFVCX0RTQQkJMTUKKyNkZWZpbmUgUEVNX09CSl9QVUJfREgJCTE2CisjZGVmaW5lIFBFTV9PQkpfREhQQVJBTVMJMTcKKyNkZWZpbmUgUEVNX09CSl9EU0FQQVJBTVMJMTgKKyNkZWZpbmUgUEVNX09CSl9QUklWX1JTQV9QVUJMSUMJMTkKKyNkZWZpbmUgUEVNX09CSl9QUklWX0VDRFNBCTIwCisjZGVmaW5lIFBFTV9PQkpfUFVCX0VDRFNBCTIxCisjZGVmaW5lIFBFTV9PQkpfRUNQQVJBTUVURVJTCTIyCisKKyNkZWZpbmUgUEVNX0VSUk9SCQkzMAorI2RlZmluZSBQRU1fREVLX0RFU19DQkMgICAgICAgICA0MAorI2RlZmluZSBQRU1fREVLX0lERUFfQ0JDICAgICAgICA0NQorI2RlZmluZSBQRU1fREVLX0RFU19FREUgICAgICAgICA1MAorI2RlZmluZSBQRU1fREVLX0RFU19FQ0IgICAgICAgICA2MAorI2RlZmluZSBQRU1fREVLX1JTQSAgICAgICAgICAgICA3MAorI2RlZmluZSBQRU1fREVLX1JTQV9NRDIgICAgICAgICA4MAorI2RlZmluZSBQRU1fREVLX1JTQV9NRDUgICAgICAgICA5MAorCisjZGVmaW5lIFBFTV9NRF9NRDIJCU5JRF9tZDIKKyNkZWZpbmUgUEVNX01EX01ENQkJTklEX21kNQorI2RlZmluZSBQRU1fTURfU0hBCQlOSURfc2hhCisjZGVmaW5lIFBFTV9NRF9NRDJfUlNBCQlOSURfbWQyV2l0aFJTQUVuY3J5cHRpb24KKyNkZWZpbmUgUEVNX01EX01ENV9SU0EJCU5JRF9tZDVXaXRoUlNBRW5jcnlwdGlvbgorI2RlZmluZSBQRU1fTURfU0hBX1JTQQkJTklEX3NoYTFXaXRoUlNBRW5jcnlwdGlvbgorCisjZGVmaW5lIFBFTV9TVFJJTkdfWDUwOV9PTEQJIlg1MDkgQ0VSVElGSUNBVEUiCisjZGVmaW5lIFBFTV9TVFJJTkdfWDUwOQkJIkNFUlRJRklDQVRFIgorI2RlZmluZSBQRU1fU1RSSU5HX1g1MDlfUEFJUgkiQ0VSVElGSUNBVEUgUEFJUiIKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5X1RSVVNURUQJIlRSVVNURUQgQ0VSVElGSUNBVEUiCisjZGVmaW5lIFBFTV9TVFJJTkdfWDUwOV9SRVFfT0xECSJORVcgQ0VSVElGSUNBVEUgUkVRVUVTVCIKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5X1JFUQkiQ0VSVElGSUNBVEUgUkVRVUVTVCIKKyNkZWZpbmUgUEVNX1NUUklOR19YNTA5X0NSTAkiWDUwOSBDUkwiCisjZGVmaW5lIFBFTV9TVFJJTkdfRVZQX1BLRVkJIkFOWSBQUklWQVRFIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19QVUJMSUMJIlBVQkxJQyBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfUlNBCQkiUlNBIFBSSVZBVEUgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX1JTQV9QVUJMSUMJIlJTQSBQVUJMSUMgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX0RTQQkJIkRTQSBQUklWQVRFIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19EU0FfUFVCTElDCSJEU0EgUFVCTElDIEtFWSIKKyNkZWZpbmUgUEVNX1NUUklOR19QS0NTNwkiUEtDUzciCisjZGVmaW5lIFBFTV9TVFJJTkdfUEtDUzdfU0lHTkVECSJQS0NTICM3IFNJR05FRCBEQVRBIgorI2RlZmluZSBQRU1fU1RSSU5HX1BLQ1M4CSJFTkNSWVBURUQgUFJJVkFURSBLRVkiCisjZGVmaW5lIFBFTV9TVFJJTkdfUEtDUzhJTkYJIlBSSVZBVEUgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX0RIUEFSQU1TCSJESCBQQVJBTUVURVJTIgorI2RlZmluZSBQRU1fU1RSSU5HX1NTTF9TRVNTSU9OCSJTU0wgU0VTU0lPTiBQQVJBTUVURVJTIgorI2RlZmluZSBQRU1fU1RSSU5HX0RTQVBBUkFNUwkiRFNBIFBBUkFNRVRFUlMiCisjZGVmaW5lIFBFTV9TVFJJTkdfRUNEU0FfUFVCTElDICJFQ0RTQSBQVUJMSUMgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX0VDUEFSQU1FVEVSUyAiRUMgUEFSQU1FVEVSUyIKKyNkZWZpbmUgUEVNX1NUUklOR19FQ1BSSVZBVEVLRVkJIkVDIFBSSVZBVEUgS0VZIgorI2RlZmluZSBQRU1fU1RSSU5HX1BBUkFNRVRFUlMJIlBBUkFNRVRFUlMiCisjZGVmaW5lIFBFTV9TVFJJTkdfQ01TCQkiQ01TIgorCisgIC8qIE5vdGUgdGhhdCB0aGlzIHN0cnVjdHVyZSBpcyBpbml0aWFsaXNlZCBieSBQRU1fU2VhbEluaXQgYW5kIGNsZWFuZWQgdXAKKyAgICAgYnkgUEVNX1NlYWxGaW5hbCAoYXQgbGVhc3QgZm9yIG5vdykgKi8KK3R5cGVkZWYgc3RydWN0IFBFTV9FbmNvZGVfU2VhbF9zdAorCXsKKwlFVlBfRU5DT0RFX0NUWCBlbmNvZGU7CisJRVZQX01EX0NUWCBtZDsKKwlFVlBfQ0lQSEVSX0NUWCBjaXBoZXI7CisJfSBQRU1fRU5DT0RFX1NFQUxfQ1RYOworCisvKiBlbmNfdHlwZSBpcyBvbmUgb2ZmICovCisjZGVmaW5lIFBFTV9UWVBFX0VOQ1JZUFRFRCAgICAgIDEwCisjZGVmaW5lIFBFTV9UWVBFX01JQ19PTkxZICAgICAgIDIwCisjZGVmaW5lIFBFTV9UWVBFX01JQ19DTEVBUiAgICAgIDMwCisjZGVmaW5lIFBFTV9UWVBFX0NMRUFSCQk0MAorCit0eXBlZGVmIHN0cnVjdCBwZW1fcmVjaXBfc3QKKwl7CisJY2hhciAqbmFtZTsKKwlYNTA5X05BTUUgKmRuOworCisJaW50IGNpcGhlcjsKKwlpbnQga2V5X2VuYzsKKwkvKgljaGFyIGl2WzhdOyB1bnVzZWQgYW5kIHdyb25nIHNpemUgKi8KKwl9IFBFTV9VU0VSOworCit0eXBlZGVmIHN0cnVjdCBwZW1fY3R4X3N0CisJeworCWludCB0eXBlOwkJLyogd2hhdCB0eXBlIG9mIG9iamVjdCAqLworCisJc3RydWN0CXsKKwkJaW50IHZlcnNpb247CQorCQlpbnQgbW9kZTsJCQorCQl9IHByb2NfdHlwZTsKKworCWNoYXIgKmRvbWFpbjsKKworCXN0cnVjdAl7CisJCWludCBjaXBoZXI7CisJLyogdW51c2VkLCBhbmQgd3Jvbmcgc2l6ZQorCSAgIHVuc2lnbmVkIGNoYXIgaXZbOF07ICovCisJCX0gREVLX2luZm87CisJCQorCVBFTV9VU0VSICpvcmlnaW5hdG9yOworCisJaW50IG51bV9yZWNpcGllbnQ7CisJUEVNX1VTRVIgKipyZWNpcGllbnQ7CisKKwkvKiBYWFgoYmVuKTogZG9uI3QgdGhpbmsgdGhpcyBpcyB1c2VkISAKKwkJU1RBQ0sgKng1MDlfY2hhaW47CS8gKiBjZXJ0aWZpY2F0ZSBjaGFpbiAqLworCUVWUF9NRCAqbWQ7CQkvKiBzaWduYXR1cmUgdHlwZSAqLworCisJaW50IG1kX2VuYzsJCS8qIGlzIHRoZSBtZCBlbmNyeXB0ZWQgb3Igbm90PyAqLworCWludCBtZF9sZW47CQkvKiBsZW5ndGggb2YgbWRfZGF0YSAqLworCWNoYXIgKm1kX2RhdGE7CQkvKiBtZXNzYWdlIGRpZ2VzdCwgY291bGQgYmUgcGtleSBlbmNyeXB0ZWQgKi8KKworCUVWUF9DSVBIRVIgKmRlYzsJLyogZGF0ZSBlbmNyeXB0aW9uIGNpcGhlciAqLworCWludCBrZXlfbGVuOwkJLyoga2V5IGxlbmd0aCAqLworCXVuc2lnbmVkIGNoYXIgKmtleTsJLyoga2V5ICovCisJLyogdW51c2VkLCBhbmQgd3Jvbmcgc2l6ZQorCSAgIHVuc2lnbmVkIGNoYXIgaXZbOF07ICovCisKKwkKKwlpbnQgIGRhdGFfZW5jOwkJLyogaXMgdGhlIGRhdGEgZW5jcnlwdGVkICovCisJaW50IGRhdGFfbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJfSBQRU1fQ1RYOworCisvKiBUaGVzZSBtYWNyb3MgbWFrZSB0aGUgUEVNX3JlYWQvUEVNX3dyaXRlIGZ1bmN0aW9ucyBlYXNpZXIgdG8gbWFpbnRhaW4gYW5kCisgKiB3cml0ZS4gTm93IHRoZXkgYXJlIGFsbCBpbXBsZW1lbnRlZCB3aXRoIGVpdGhlcjoKKyAqIElNUExFTUVOVF9QRU1fcncoLi4uKSBvciBJTVBMRU1FTlRfUEVNX3J3X2NiKC4uLikKKyAqLworCisjaWZkZWYgT1BFTlNTTF9OT19GUF9BUEkKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3JlYWRfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAvKiovCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAvKiovCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfZnBfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAvKiovCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY2JfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAvKiovCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY2JfZnBfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSAvKiovCisKKyNlbHNlCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV9yZWFkX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAordHlwZSAqUEVNX3JlYWRfIyNuYW1lKEZJTEUgKmZwLCB0eXBlICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSlcCit7IFwKK3JldHVybiBQRU1fQVNOMV9yZWFkKChkMmlfb2Zfdm9pZCAqKWQyaV8jI2FzbjEsIHN0cixmcCwodm9pZCAqKil4LGNiLHUpOyBcCit9IAorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCitpbnQgUEVNX3dyaXRlXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqeCkgXAoreyBcCityZXR1cm4gUEVNX0FTTjFfd3JpdGUoKGkyZF9vZl92b2lkICopaTJkXyMjYXNuMSxzdHIsZnAseCxOVUxMLE5VTEwsMCxOVUxMLE5VTEwpOyBcCit9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9mcF9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK2ludCBQRU1fd3JpdGVfIyNuYW1lKEZJTEUgKmZwLCBjb25zdCB0eXBlICp4KSBcCit7IFwKK3JldHVybiBQRU1fQVNOMV93cml0ZSgoaTJkX29mX3ZvaWQgKilpMmRfIyNhc24xLHN0cixmcCwodm9pZCAqKXgsTlVMTCxOVUxMLDAsTlVMTCxOVUxMKTsgXAorfQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY2JfZnAobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCitpbnQgUEVNX3dyaXRlXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLCBcCisJICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgXAorCQkgIHZvaWQgKnUpIFwKKwl7IFwKKwlyZXR1cm4gUEVNX0FTTjFfd3JpdGUoKGkyZF9vZl92b2lkICopaTJkXyMjYXNuMSxzdHIsZnAseCxlbmMsa3N0cixrbGVuLGNiLHUpOyBcCisJfQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfY2JfZnBfY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCitpbnQgUEVNX3dyaXRlXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLCBcCisJICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgXAorCQkgIHZvaWQgKnUpIFwKKwl7IFwKKwlyZXR1cm4gUEVNX0FTTjFfd3JpdGUoKGkyZF9vZl92b2lkICopaTJkXyMjYXNuMSxzdHIsZnAseCxlbmMsa3N0cixrbGVuLGNiLHUpOyBcCisJfQorCisjZW5kaWYKKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3JlYWRfYmlvKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAordHlwZSAqUEVNX3JlYWRfYmlvXyMjbmFtZShCSU8gKmJwLCB0eXBlICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSlcCit7IFwKK3JldHVybiBQRU1fQVNOMV9yZWFkX2JpbygoZDJpX29mX3ZvaWQgKilkMmlfIyNhc24xLCBzdHIsYnAsKHZvaWQgKiopeCxjYix1KTsgXAorfQorCisjZGVmaW5lIElNUExFTUVOVF9QRU1fd3JpdGVfYmlvKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAoraW50IFBFTV93cml0ZV9iaW9fIyNuYW1lKEJJTyAqYnAsIHR5cGUgKngpIFwKK3sgXAorcmV0dXJuIFBFTV9BU04xX3dyaXRlX2JpbygoaTJkX29mX3ZvaWQgKilpMmRfIyNhc24xLHN0cixicCx4LE5VTEwsTlVMTCwwLE5VTEwsTlVMTCk7IFwKK30KKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2Jpb19jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK2ludCBQRU1fd3JpdGVfYmlvXyMjbmFtZShCSU8gKmJwLCBjb25zdCB0eXBlICp4KSBcCit7IFwKK3JldHVybiBQRU1fQVNOMV93cml0ZV9iaW8oKGkyZF9vZl92b2lkICopaTJkXyMjYXNuMSxzdHIsYnAsKHZvaWQgKil4LE5VTEwsTlVMTCwwLE5VTEwsTlVMTCk7IFwKK30KKworI2RlZmluZSBJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2JpbyhuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKK2ludCBQRU1fd3JpdGVfYmlvXyMjbmFtZShCSU8gKmJwLCB0eXBlICp4LCBjb25zdCBFVlBfQ0lQSEVSICplbmMsIFwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmtzdHIsIGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KSBcCisJeyBcCisJcmV0dXJuIFBFTV9BU04xX3dyaXRlX2JpbygoaTJkX29mX3ZvaWQgKilpMmRfIyNhc24xLHN0cixicCx4LGVuYyxrc3RyLGtsZW4sY2IsdSk7IFwKKwl9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9iaW9fY29uc3QobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCitpbnQgUEVNX3dyaXRlX2Jpb18jI25hbWUoQklPICpicCwgdHlwZSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLCBcCisJICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSkgXAorCXsgXAorCXJldHVybiBQRU1fQVNOMV93cml0ZV9iaW8oKGkyZF9vZl92b2lkICopaTJkXyMjYXNuMSxzdHIsYnAsKHZvaWQgKil4LGVuYyxrc3RyLGtsZW4sY2IsdSk7IFwKKwl9CisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZShuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2JpbyhuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2Jpb19jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2ZwX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jYihuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2JpbyhuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV93cml0ZV9jYl9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2Jpb19jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3dyaXRlX2NiX2ZwX2NvbnN0KG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV9yZWFkKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgXAorCUlNUExFTUVOVF9QRU1fcmVhZF9iaW8obmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV9yZWFkX2ZwKG5hbWUsIHR5cGUsIHN0ciwgYXNuMSkgCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV9ydyhuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3JlYWQobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZShuYW1lLCB0eXBlLCBzdHIsIGFzbjEpCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV9yd19jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3JlYWQobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9jb25zdChuYW1lLCB0eXBlLCBzdHIsIGFzbjEpCisKKyNkZWZpbmUgSU1QTEVNRU5UX1BFTV9yd19jYihuYW1lLCB0eXBlLCBzdHIsIGFzbjEpIFwKKwlJTVBMRU1FTlRfUEVNX3JlYWQobmFtZSwgdHlwZSwgc3RyLCBhc24xKSBcCisJSU1QTEVNRU5UX1BFTV93cml0ZV9jYihuYW1lLCB0eXBlLCBzdHIsIGFzbjEpCisKKy8qIFRoZXNlIGFyZSB0aGUgc2FtZSBleGNlcHQgdGhleSBhcmUgZm9yIHRoZSBkZWNsYXJhdGlvbnMgKi8KKworI2lmIGRlZmluZWQoT1BFTlNTTF9OT19GUF9BUEkpCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fcmVhZF9mcChuYW1lLCB0eXBlKSAvKiovCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2ZwKG5hbWUsIHR5cGUpIC8qKi8KKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfY2JfZnAobmFtZSwgdHlwZSkgLyoqLworCisjZWxzZQorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3JlYWRfZnAobmFtZSwgdHlwZSkgXAorCXR5cGUgKlBFTV9yZWFkXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2ZwKG5hbWUsIHR5cGUpIFwKKwlpbnQgUEVNX3dyaXRlXyMjbmFtZShGSUxFICpmcCwgdHlwZSAqeCk7CisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfZnBfY29uc3QobmFtZSwgdHlwZSkgXAorCWludCBQRU1fd3JpdGVfIyNuYW1lKEZJTEUgKmZwLCBjb25zdCB0eXBlICp4KTsKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9jYl9mcChuYW1lLCB0eXBlKSBcCisJaW50IFBFTV93cml0ZV8jI25hbWUoRklMRSAqZnAsIHR5cGUgKngsIGNvbnN0IEVWUF9DSVBIRVIgKmVuYywgXAorCSAgICAgdW5zaWduZWQgY2hhciAqa3N0ciwgaW50IGtsZW4sIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2RlZmluZSBERUNMQVJFX1BFTV9yZWFkX2JpbyhuYW1lLCB0eXBlKSBcCisJdHlwZSAqUEVNX3JlYWRfYmlvXyMjbmFtZShCSU8gKmJwLCB0eXBlICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfYmlvKG5hbWUsIHR5cGUpIFwKKwlpbnQgUEVNX3dyaXRlX2Jpb18jI25hbWUoQklPICpicCwgdHlwZSAqeCk7CisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfYmlvX2NvbnN0KG5hbWUsIHR5cGUpIFwKKwlpbnQgUEVNX3dyaXRlX2Jpb18jI25hbWUoQklPICpicCwgY29uc3QgdHlwZSAqeCk7CisKKyNkZWZpbmUgREVDTEFSRV9QRU1fd3JpdGVfY2JfYmlvKG5hbWUsIHR5cGUpIFwKKwlpbnQgUEVNX3dyaXRlX2Jpb18jI25hbWUoQklPICpicCwgdHlwZSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLCBcCisJICAgICB1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisKKyNlbHNlCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fcmVhZF9iaW8obmFtZSwgdHlwZSkgLyoqLworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9iaW8obmFtZSwgdHlwZSkgLyoqLworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9iaW9fY29uc3QobmFtZSwgdHlwZSkgLyoqLworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9jYl9iaW8obmFtZSwgdHlwZSkgLyoqLworCisjZW5kaWYKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZShuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGVfYmlvKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZV9mcChuYW1lLCB0eXBlKSAKKworI2RlZmluZSBERUNMQVJFX1BFTV93cml0ZV9jb25zdChuYW1lLCB0eXBlKSBcCisJREVDTEFSRV9QRU1fd3JpdGVfYmlvX2NvbnN0KG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZV9mcF9jb25zdChuYW1lLCB0eXBlKQorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3dyaXRlX2NiKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV93cml0ZV9jYl9iaW8obmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlX2NiX2ZwKG5hbWUsIHR5cGUpIAorCisjZGVmaW5lIERFQ0xBUkVfUEVNX3JlYWQobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3JlYWRfYmlvKG5hbWUsIHR5cGUpIFwKKwlERUNMQVJFX1BFTV9yZWFkX2ZwKG5hbWUsIHR5cGUpCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fcncobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3JlYWQobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlKG5hbWUsIHR5cGUpCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fcndfY29uc3QobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3JlYWQobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlX2NvbnN0KG5hbWUsIHR5cGUpCisKKyNkZWZpbmUgREVDTEFSRV9QRU1fcndfY2IobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3JlYWQobmFtZSwgdHlwZSkgXAorCURFQ0xBUkVfUEVNX3dyaXRlX2NiKG5hbWUsIHR5cGUpCisKKyNpZiAxCisvKiAidXNlcmRhdGEiOiBuZXcgd2l0aCBPcGVuU1NMIDAuOS40ICovCit0eXBlZGVmIGludCBwZW1fcGFzc3dvcmRfY2IoY2hhciAqYnVmLCBpbnQgc2l6ZSwgaW50IHJ3ZmxhZywgdm9pZCAqdXNlcmRhdGEpOworI2Vsc2UKKy8qIE9wZW5TU0wgMC45LjMsIDAuOS4zYSAqLwordHlwZWRlZiBpbnQgcGVtX3Bhc3N3b3JkX2NiKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcpOworI2VuZGlmCisKK2ludAlQRU1fZ2V0X0VWUF9DSVBIRVJfSU5GTyhjaGFyICpoZWFkZXIsIEVWUF9DSVBIRVJfSU5GTyAqY2lwaGVyKTsKK2ludAlQRU1fZG9faGVhZGVyIChFVlBfQ0lQSEVSX0lORk8gKmNpcGhlciwgdW5zaWduZWQgY2hhciAqZGF0YSxsb25nICpsZW4sCisJcGVtX3Bhc3N3b3JkX2NiICpjYWxsYmFjayx2b2lkICp1KTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworaW50CVBFTV9yZWFkX2JpbyhCSU8gKmJwLCBjaGFyICoqbmFtZSwgY2hhciAqKmhlYWRlciwKKwkJdW5zaWduZWQgY2hhciAqKmRhdGEsbG9uZyAqbGVuKTsKK2ludAlQRU1fd3JpdGVfYmlvKEJJTyAqYnAsY29uc3QgY2hhciAqbmFtZSxjaGFyICpoZHIsdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJbG9uZyBsZW4pOworaW50IFBFTV9ieXRlc19yZWFkX2Jpbyh1bnNpZ25lZCBjaGFyICoqcGRhdGEsIGxvbmcgKnBsZW4sIGNoYXIgKipwbm0sIGNvbnN0IGNoYXIgKm5hbWUsIEJJTyAqYnAsCisJICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK3ZvaWQgKglQRU1fQVNOMV9yZWFkX2JpbyhkMmlfb2Zfdm9pZCAqZDJpLCBjb25zdCBjaGFyICpuYW1lLCBCSU8gKmJwLAorCQkJICB2b2lkICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CitpbnQJUEVNX0FTTjFfd3JpdGVfYmlvKGkyZF9vZl92b2lkICppMmQsY29uc3QgY2hhciAqbmFtZSxCSU8gKmJwLCB2b2lkICp4LAorCQkJICAgY29uc3QgRVZQX0NJUEhFUiAqZW5jLHVuc2lnbmVkIGNoYXIgKmtzdHIsaW50IGtsZW4sCisJCQkgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworU1RBQ0tfT0YoWDUwOV9JTkZPKSAqCVBFTV9YNTA5X0lORk9fcmVhZF9iaW8oQklPICpicCwgU1RBQ0tfT0YoWDUwOV9JTkZPKSAqc2ssIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworaW50CVBFTV9YNTA5X0lORk9fd3JpdGVfYmlvKEJJTyAqYnAsWDUwOV9JTkZPICp4aSwgRVZQX0NJUEhFUiAqZW5jLAorCQl1bnNpZ25lZCBjaGFyICprc3RyLCBpbnQga2xlbiwgcGVtX3Bhc3N3b3JkX2NiICpjZCwgdm9pZCAqdSk7CisjZW5kaWYKKworaW50CVBFTV9yZWFkKEZJTEUgKmZwLCBjaGFyICoqbmFtZSwgY2hhciAqKmhlYWRlciwKKwkJdW5zaWduZWQgY2hhciAqKmRhdGEsbG9uZyAqbGVuKTsKK2ludAlQRU1fd3JpdGUoRklMRSAqZnAsY2hhciAqbmFtZSxjaGFyICpoZHIsdW5zaWduZWQgY2hhciAqZGF0YSxsb25nIGxlbik7Cit2b2lkICogIFBFTV9BU04xX3JlYWQoZDJpX29mX3ZvaWQgKmQyaSwgY29uc3QgY2hhciAqbmFtZSwgRklMRSAqZnAsIHZvaWQgKip4LAorCQkgICAgICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK2ludAlQRU1fQVNOMV93cml0ZShpMmRfb2Zfdm9pZCAqaTJkLGNvbnN0IGNoYXIgKm5hbWUsRklMRSAqZnAsCisJCSAgICAgICB2b2lkICp4LGNvbnN0IEVWUF9DSVBIRVIgKmVuYyx1bnNpZ25lZCBjaGFyICprc3RyLAorCQkgICAgICAgaW50IGtsZW4scGVtX3Bhc3N3b3JkX2NiICpjYWxsYmFjaywgdm9pZCAqdSk7CitTVEFDS19PRihYNTA5X0lORk8pICoJUEVNX1g1MDlfSU5GT19yZWFkKEZJTEUgKmZwLCBTVEFDS19PRihYNTA5X0lORk8pICpzaywKKwlwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKKworaW50CVBFTV9TZWFsSW5pdChQRU1fRU5DT0RFX1NFQUxfQ1RYICpjdHgsIEVWUF9DSVBIRVIgKnR5cGUsCisJCUVWUF9NRCAqbWRfdHlwZSwgdW5zaWduZWQgY2hhciAqKmVrLCBpbnQgKmVrbCwKKwkJdW5zaWduZWQgY2hhciAqaXYsIEVWUF9QS0VZICoqcHViaywgaW50IG5wdWJrKTsKK3ZvaWQJUEVNX1NlYWxVcGRhdGUoUEVNX0VOQ09ERV9TRUFMX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCwKKwkJdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmwpOworaW50CVBFTV9TZWFsRmluYWwoUEVNX0VOQ09ERV9TRUFMX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWcsaW50ICpzaWdsLAorCQl1bnNpZ25lZCBjaGFyICpvdXQsIGludCAqb3V0bCwgRVZQX1BLRVkgKnByaXYpOworCit2b2lkICAgIFBFTV9TaWduSW5pdChFVlBfTURfQ1RYICpjdHgsIEVWUF9NRCAqdHlwZSk7Cit2b2lkICAgIFBFTV9TaWduVXBkYXRlKEVWUF9NRF9DVFggKmN0eCx1bnNpZ25lZCBjaGFyICpkLHVuc2lnbmVkIGludCBjbnQpOworaW50CVBFTV9TaWduRmluYWwoRVZQX01EX0NUWCAqY3R4LCB1bnNpZ25lZCBjaGFyICpzaWdyZXQsCisJCXVuc2lnbmVkIGludCAqc2lnbGVuLCBFVlBfUEtFWSAqcGtleSk7CisKK2ludAlQRU1fZGVmX2NhbGxiYWNrKGNoYXIgKmJ1ZiwgaW50IG51bSwgaW50IHcsIHZvaWQgKmtleSk7Cit2b2lkCVBFTV9wcm9jX3R5cGUoY2hhciAqYnVmLCBpbnQgdHlwZSk7Cit2b2lkCVBFTV9kZWtfaW5mbyhjaGFyICpidWYsIGNvbnN0IGNoYXIgKnR5cGUsIGludCBsZW4sIGNoYXIgKnN0cik7CisKKworI2luY2x1ZGUgPG9wZW5zc2wvc3ltaGFja3MuaD4KKworREVDTEFSRV9QRU1fcncoWDUwOSwgWDUwOSkKKworREVDTEFSRV9QRU1fcncoWDUwOV9BVVgsIFg1MDkpCisKK0RFQ0xBUkVfUEVNX3J3KFg1MDlfQ0VSVF9QQUlSLCBYNTA5X0NFUlRfUEFJUikKKworREVDTEFSRV9QRU1fcncoWDUwOV9SRVEsIFg1MDlfUkVRKQorREVDTEFSRV9QRU1fd3JpdGUoWDUwOV9SRVFfTkVXLCBYNTA5X1JFUSkKKworREVDTEFSRV9QRU1fcncoWDUwOV9DUkwsIFg1MDlfQ1JMKQorCitERUNMQVJFX1BFTV9ydyhQS0NTNywgUEtDUzcpCisKK0RFQ0xBUkVfUEVNX3J3KE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UsIE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UpCisKK0RFQ0xBUkVfUEVNX3J3KFBLQ1M4LCBYNTA5X1NJRykKKworREVDTEFSRV9QRU1fcncoUEtDUzhfUFJJVl9LRVlfSU5GTywgUEtDUzhfUFJJVl9LRVlfSU5GTykKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCitERUNMQVJFX1BFTV9yd19jYihSU0FQcml2YXRlS2V5LCBSU0EpCisKK0RFQ0xBUkVfUEVNX3J3X2NvbnN0KFJTQVB1YmxpY0tleSwgUlNBKQorREVDTEFSRV9QRU1fcncoUlNBX1BVQktFWSwgUlNBKQorCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCitERUNMQVJFX1BFTV9yd19jYihEU0FQcml2YXRlS2V5LCBEU0EpCisKK0RFQ0xBUkVfUEVNX3J3KERTQV9QVUJLRVksIERTQSkKKworREVDTEFSRV9QRU1fcndfY29uc3QoRFNBcGFyYW1zLCBEU0EpCisKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKK0RFQ0xBUkVfUEVNX3J3X2NvbnN0KEVDUEtQYXJhbWV0ZXJzLCBFQ19HUk9VUCkKK0RFQ0xBUkVfUEVNX3J3X2NiKEVDUHJpdmF0ZUtleSwgRUNfS0VZKQorREVDTEFSRV9QRU1fcncoRUNfUFVCS0VZLCBFQ19LRVkpCisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisKK0RFQ0xBUkVfUEVNX3J3X2NvbnN0KERIcGFyYW1zLCBESCkKKworI2VuZGlmCisKK0RFQ0xBUkVfUEVNX3J3X2NiKFByaXZhdGVLZXksIEVWUF9QS0VZKQorCitERUNMQVJFX1BFTV9ydyhQVUJLRVksIEVWUF9QS0VZKQorCitpbnQgUEVNX3dyaXRlX2Jpb19QS0NTOFByaXZhdGVLZXlfbmlkKEJJTyAqYnAsIEVWUF9QS0VZICp4LCBpbnQgbmlkLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK2ludCBQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdmF0ZUtleShCSU8gKiwgRVZQX1BLRVkgKiwgY29uc3QgRVZQX0NJUEhFUiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgaW50LCBwZW1fcGFzc3dvcmRfY2IgKiwgdm9pZCAqKTsKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5X25pZF9iaW8oQklPICpicCwgRVZQX1BLRVkgKngsIGludCBuaWQsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworRVZQX1BLRVkgKmQyaV9QS0NTOFByaXZhdGVLZXlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICoqeCwgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqeCwgY29uc3QgRVZQX0NJUEhFUiAqZW5jLAorCQkJCSAgY2hhciAqa3N0ciwgaW50IGtsZW4sCisJCQkJICBwZW1fcGFzc3dvcmRfY2IgKmNiLCB2b2lkICp1KTsKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5X25pZF9mcChGSUxFICpmcCwgRVZQX1BLRVkgKngsIGludCBuaWQsCisJCQkJICBjaGFyICprc3RyLCBpbnQga2xlbiwKKwkJCQkgIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworaW50IFBFTV93cml0ZV9QS0NTOFByaXZhdGVLZXlfbmlkKEZJTEUgKmZwLCBFVlBfUEtFWSAqeCwgaW50IG5pZCwKKwkJCQkgIGNoYXIgKmtzdHIsIGludCBrbGVuLAorCQkJCSAgcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisKK0VWUF9QS0VZICpkMmlfUEtDUzhQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqKngsIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworCitpbnQgUEVNX3dyaXRlX1BLQ1M4UHJpdmF0ZUtleShGSUxFICpmcCxFVlBfUEtFWSAqeCxjb25zdCBFVlBfQ0lQSEVSICplbmMsCisJCQkgICAgICBjaGFyICprc3RyLGludCBrbGVuLCBwZW1fcGFzc3dvcmRfY2IgKmNkLCB2b2lkICp1KTsKKworRVZQX1BLRVkgKlBFTV9yZWFkX2Jpb19QYXJhbWV0ZXJzKEJJTyAqYnAsIEVWUF9QS0VZICoqeCk7CitpbnQgUEVNX3dyaXRlX2Jpb19QYXJhbWV0ZXJzKEJJTyAqYnAsIEVWUF9QS0VZICp4KTsKKworCitFVlBfUEtFWSAqYjJpX1ByaXZhdGVLZXkoY29uc3QgdW5zaWduZWQgY2hhciAqKmluLCBsb25nIGxlbmd0aCk7CitFVlBfUEtFWSAqYjJpX1B1YmxpY0tleShjb25zdCB1bnNpZ25lZCBjaGFyICoqaW4sIGxvbmcgbGVuZ3RoKTsKK0VWUF9QS0VZICpiMmlfUHJpdmF0ZUtleV9iaW8oQklPICppbik7CitFVlBfUEtFWSAqYjJpX1B1YmxpY0tleV9iaW8oQklPICppbik7CitpbnQgaTJiX1ByaXZhdGVLZXlfYmlvKEJJTyAqb3V0LCBFVlBfUEtFWSAqcGspOworaW50IGkyYl9QdWJsaWNLZXlfYmlvKEJJTyAqb3V0LCBFVlBfUEtFWSAqcGspOworI2lmbmRlZiBPUEVOU1NMX05PX1JDNAorRVZQX1BLRVkgKmIyaV9QVktfYmlvKEJJTyAqaW4sIHBlbV9wYXNzd29yZF9jYiAqY2IsIHZvaWQgKnUpOworaW50IGkyYl9QVktfYmlvKEJJTyAqb3V0LCBFVlBfUEtFWSAqcGssIGludCBlbmNsZXZlbCwKKwkJcGVtX3Bhc3N3b3JkX2NiICpjYiwgdm9pZCAqdSk7CisjZW5kaWYKKworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1BFTV9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIFBFTSBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBQRU1fRl9CMklfRFNTCQkJCQkgMTI3CisjZGVmaW5lIFBFTV9GX0IySV9QVktfQklPCQkJCSAxMjgKKyNkZWZpbmUgUEVNX0ZfQjJJX1JTQQkJCQkJIDEyOQorI2RlZmluZSBQRU1fRl9DSEVDS19CSVRMRU5fRFNBCQkJCSAxMzAKKyNkZWZpbmUgUEVNX0ZfQ0hFQ0tfQklUTEVOX1JTQQkJCQkgMTMxCisjZGVmaW5lIFBFTV9GX0QySV9QS0NTOFBSSVZBVEVLRVlfQklPCQkJIDEyMAorI2RlZmluZSBQRU1fRl9EMklfUEtDUzhQUklWQVRFS0VZX0ZQCQkJIDEyMQorI2RlZmluZSBQRU1fRl9ET19CMkkJCQkJCSAxMzIKKyNkZWZpbmUgUEVNX0ZfRE9fQjJJX0JJTwkJCQkgMTMzCisjZGVmaW5lIFBFTV9GX0RPX0JMT0JfSEVBREVSCQkJCSAxMzQKKyNkZWZpbmUgUEVNX0ZfRE9fUEs4UEtFWQkJCQkgMTI2CisjZGVmaW5lIFBFTV9GX0RPX1BLOFBLRVlfRlAJCQkJIDEyNQorI2RlZmluZSBQRU1fRl9ET19QVktfQk9EWQkJCQkgMTM1CisjZGVmaW5lIFBFTV9GX0RPX1BWS19IRUFERVIJCQkJIDEzNgorI2RlZmluZSBQRU1fRl9JMkJfUFZLCQkJCQkgMTM3CisjZGVmaW5lIFBFTV9GX0kyQl9QVktfQklPCQkJCSAxMzgKKyNkZWZpbmUgUEVNX0ZfTE9BRF9JVgkJCQkJIDEwMQorI2RlZmluZSBQRU1fRl9QRU1fQVNOMV9SRUFECQkJCSAxMDIKKyNkZWZpbmUgUEVNX0ZfUEVNX0FTTjFfUkVBRF9CSU8JCQkJIDEwMworI2RlZmluZSBQRU1fRl9QRU1fQVNOMV9XUklURQkJCQkgMTA0CisjZGVmaW5lIFBFTV9GX1BFTV9BU04xX1dSSVRFX0JJTwkJCSAxMDUKKyNkZWZpbmUgUEVNX0ZfUEVNX0RFRl9DQUxMQkFDSwkJCQkgMTAwCisjZGVmaW5lIFBFTV9GX1BFTV9ET19IRUFERVIJCQkJIDEwNgorI2RlZmluZSBQRU1fRl9QRU1fRl9QRU1fV1JJVEVfUEtDUzhQUklWQVRFS0VZCQkgMTE4CisjZGVmaW5lIFBFTV9GX1BFTV9HRVRfRVZQX0NJUEhFUl9JTkZPCQkJIDEwNworI2RlZmluZSBQRU1fRl9QRU1fUEs4UEtFWQkJCQkgMTE5CisjZGVmaW5lIFBFTV9GX1BFTV9SRUFECQkJCQkgMTA4CisjZGVmaW5lIFBFTV9GX1BFTV9SRUFEX0JJTwkJCQkgMTA5CisjZGVmaW5lIFBFTV9GX1BFTV9SRUFEX0JJT19QQVJBTUVURVJTCQkJIDE0MAorI2RlZmluZSBQRU1fRl9QRU1fUkVBRF9CSU9fUFJJVkFURUtFWQkJCSAxMjMKKyNkZWZpbmUgUEVNX0ZfUEVNX1JFQURfUFJJVkFURUtFWQkJCSAxMjQKKyNkZWZpbmUgUEVNX0ZfUEVNX1NFQUxGSU5BTAkJCQkgMTEwCisjZGVmaW5lIFBFTV9GX1BFTV9TRUFMSU5JVAkJCQkgMTExCisjZGVmaW5lIFBFTV9GX1BFTV9TSUdORklOQUwJCQkJIDExMgorI2RlZmluZSBQRU1fRl9QRU1fV1JJVEUJCQkJCSAxMTMKKyNkZWZpbmUgUEVNX0ZfUEVNX1dSSVRFX0JJTwkJCQkgMTE0CisjZGVmaW5lIFBFTV9GX1BFTV9XUklURV9QUklWQVRFS0VZCQkJIDEzOQorI2RlZmluZSBQRU1fRl9QRU1fWDUwOV9JTkZPX1JFQUQJCQkgMTE1CisjZGVmaW5lIFBFTV9GX1BFTV9YNTA5X0lORk9fUkVBRF9CSU8JCQkgMTE2CisjZGVmaW5lIFBFTV9GX1BFTV9YNTA5X0lORk9fV1JJVEVfQklPCQkJIDExNworCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIFBFTV9SX0JBRF9CQVNFNjRfREVDT0RFCQkJCSAxMDAKKyNkZWZpbmUgUEVNX1JfQkFEX0RFQ1JZUFQJCQkJIDEwMQorI2RlZmluZSBQRU1fUl9CQURfRU5EX0xJTkUJCQkJIDEwMgorI2RlZmluZSBQRU1fUl9CQURfSVZfQ0hBUlMJCQkJIDEwMworI2RlZmluZSBQRU1fUl9CQURfTUFHSUNfTlVNQkVSCQkJCSAxMTYKKyNkZWZpbmUgUEVNX1JfQkFEX1BBU1NXT1JEX1JFQUQJCQkJIDEwNAorI2RlZmluZSBQRU1fUl9CQURfVkVSU0lPTl9OVU1CRVIJCQkgMTE3CisjZGVmaW5lIFBFTV9SX0JJT19XUklURV9GQUlMVVJFCQkJCSAxMTgKKyNkZWZpbmUgUEVNX1JfQ0lQSEVSX0lTX05VTEwJCQkJIDEyNworI2RlZmluZSBQRU1fUl9FUlJPUl9DT05WRVJUSU5HX1BSSVZBVEVfS0VZCQkgMTE1CisjZGVmaW5lIFBFTV9SX0VYUEVDVElOR19QUklWQVRFX0tFWV9CTE9CCQkgMTE5CisjZGVmaW5lIFBFTV9SX0VYUEVDVElOR19QVUJMSUNfS0VZX0JMT0IJCQkgMTIwCisjZGVmaW5lIFBFTV9SX0lOQ09OU0lTVEVOVF9IRUFERVIJCQkgMTIxCisjZGVmaW5lIFBFTV9SX0tFWUJMT0JfSEVBREVSX1BBUlNFX0VSUk9SCQkgMTIyCisjZGVmaW5lIFBFTV9SX0tFWUJMT0JfVE9PX1NIT1JUCQkJCSAxMjMKKyNkZWZpbmUgUEVNX1JfTk9UX0RFS19JTkZPCQkJCSAxMDUKKyNkZWZpbmUgUEVNX1JfTk9UX0VOQ1JZUFRFRAkJCQkgMTA2CisjZGVmaW5lIFBFTV9SX05PVF9QUk9DX1RZUEUJCQkJIDEwNworI2RlZmluZSBQRU1fUl9OT19TVEFSVF9MSU5FCQkJCSAxMDgKKyNkZWZpbmUgUEVNX1JfUFJPQkxFTVNfR0VUVElOR19QQVNTV09SRAkJCSAxMDkKKyNkZWZpbmUgUEVNX1JfUFVCTElDX0tFWV9OT19SU0EJCQkJIDExMAorI2RlZmluZSBQRU1fUl9QVktfREFUQV9UT09fU0hPUlQJCQkgMTI0CisjZGVmaW5lIFBFTV9SX1BWS19UT09fU0hPUlQJCQkJIDEyNQorI2RlZmluZSBQRU1fUl9SRUFEX0tFWQkJCQkJIDExMQorI2RlZmluZSBQRU1fUl9TSE9SVF9IRUFERVIJCQkJIDExMgorI2RlZmluZSBQRU1fUl9VTlNVUFBPUlRFRF9DSVBIRVIJCQkgMTEzCisjZGVmaW5lIFBFTV9SX1VOU1VQUE9SVEVEX0VOQ1JZUFRJT04JCQkgMTE0CisjZGVmaW5lIFBFTV9SX1VOU1VQUE9SVEVEX0tFWV9DT01QT05FTlRTCQkgMTI2CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BlbTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE3OTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BlbTIuaApAQCAtMCwwICsxLDcwIEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qCisgKiBUaGlzIGhlYWRlciBvbmx5IGV4aXN0cyB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBwZW0gYW5kIGVycgorICogQmVuIDMwIEphbiAxOTk5LgorICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmbmRlZiBIRUFERVJfUEVNX0gKK3ZvaWQgRVJSX2xvYWRfUEVNX3N0cmluZ3Modm9pZCk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9wa2NzMTIuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9wa2NzMTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTdlYjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BrY3MxMi5oCkBAIC0wLDAgKzEsMzMxIEBACisvKiBwa2NzMTIuaCAqLworLyogV3JpdHRlbiBieSBEciBTdGVwaGVuIE4gSGVuc29uIChzdGV2ZUBvcGVuc3NsLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDE5OTkuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfUEtDUzEyX0gKKyNkZWZpbmUgSEVBREVSX1BLQ1MxMl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgUEtDUzEyX0tFWV9JRAkxCisjZGVmaW5lIFBLQ1MxMl9JVl9JRAkyCisjZGVmaW5lIFBLQ1MxMl9NQUNfSUQJMworCisvKiBEZWZhdWx0IGl0ZXJhdGlvbiBjb3VudCAqLworI2lmbmRlZiBQS0NTMTJfREVGQVVMVF9JVEVSCisjZGVmaW5lIFBLQ1MxMl9ERUZBVUxUX0lURVIJUEtDUzVfREVGQVVMVF9JVEVSCisjZW5kaWYKKworI2RlZmluZSBQS0NTMTJfTUFDX0tFWV9MRU5HVEggMjAKKworI2RlZmluZSBQS0NTMTJfU0FMVF9MRU4JOAorCisvKiBVbmNvbW1lbnQgb3V0IG5leHQgbGluZSBmb3IgdW5pY29kZSBwYXNzd29yZCBhbmQgbmFtZXMsIG90aGVyd2lzZSBBU0NJSSAqLworCisvKiNkZWZpbmUgUEJFX1VOSUNPREUqLworCisjaWZkZWYgUEJFX1VOSUNPREUKKyNkZWZpbmUgUEtDUzEyX2tleV9nZW4gUEtDUzEyX2tleV9nZW5fdW5pCisjZGVmaW5lIFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lIFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX3VuaQorI2Vsc2UKKyNkZWZpbmUgUEtDUzEyX2tleV9nZW4gUEtDUzEyX2tleV9nZW5fYXNjCisjZGVmaW5lIFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lIFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX2FzYworI2VuZGlmCisKKy8qIE1TIGtleSB1c2FnZSBjb25zdGFudHMgKi8KKworI2RlZmluZSBLRVlfRVgJMHgxMAorI2RlZmluZSBLRVlfU0lHIDB4ODAKKwordHlwZWRlZiBzdHJ1Y3QgeworWDUwOV9TSUcgKmRpbmZvOworQVNOMV9PQ1RFVF9TVFJJTkcgKnNhbHQ7CitBU04xX0lOVEVHRVIgKml0ZXI7CS8qIGRlZmF1bHRzIHRvIDEgKi8KK30gUEtDUzEyX01BQ19EQVRBOworCit0eXBlZGVmIHN0cnVjdCB7CitBU04xX0lOVEVHRVIgKnZlcnNpb247CitQS0NTMTJfTUFDX0RBVEEgKm1hYzsKK1BLQ1M3ICphdXRoc2FmZXM7Cit9IFBLQ1MxMjsKKwordHlwZWRlZiBzdHJ1Y3QgeworQVNOMV9PQkpFQ1QgKnR5cGU7Cit1bmlvbiB7CisJc3RydWN0IHBrY3MxMl9iYWdfc3QgKmJhZzsgLyogc2VjcmV0LCBjcmwgYW5kIGNlcnRiYWcgKi8KKwlzdHJ1Y3QgcGtjczhfcHJpdl9rZXlfaW5mb19zdAkqa2V5YmFnOyAvKiBrZXliYWcgKi8KKwlYNTA5X1NJRyAqc2hrZXliYWc7IC8qIHNocm91ZGVkIGtleSBiYWcgKi8KKwlTVEFDS19PRihQS0NTMTJfU0FGRUJBRykgKnNhZmVzOworCUFTTjFfVFlQRSAqb3RoZXI7Cit9dmFsdWU7CitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKmF0dHJpYjsKK30gUEtDUzEyX1NBRkVCQUc7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpCitERUNMQVJFX0FTTjFfU0VUX09GKFBLQ1MxMl9TQUZFQkFHKQorREVDTEFSRV9QS0NTMTJfU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpCisKK3R5cGVkZWYgc3RydWN0IHBrY3MxMl9iYWdfc3QgeworQVNOMV9PQkpFQ1QgKnR5cGU7Cit1bmlvbiB7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKng1MDljZXJ0OworCUFTTjFfT0NURVRfU1RSSU5HICp4NTA5Y3JsOworCUFTTjFfT0NURVRfU1RSSU5HICpvY3RldDsKKwlBU04xX0lBNVNUUklORyAqc2RzaWNlcnQ7CisJQVNOMV9UWVBFICpvdGhlcjsgLyogU2VjcmV0IG9yIG90aGVyIGJhZyAqLworfXZhbHVlOworfSBQS0NTMTJfQkFHUzsKKworI2RlZmluZSBQS0NTMTJfRVJST1IJMAorI2RlZmluZSBQS0NTMTJfT0sJMQorCisvKiBDb21wYXRpYmlsaXR5IG1hY3JvcyAqLworCisjZGVmaW5lIE1fUEtDUzEyX3g1MDkyY2VydGJhZyBQS0NTMTJfeDUwOTJjZXJ0YmFnCisjZGVmaW5lIE1fUEtDUzEyX3g1MDljcmwyY2VydGJhZyBQS0NTMTJfeDUwOWNybDJjZXJ0YmFnCisKKyNkZWZpbmUgTV9QS0NTMTJfY2VydGJhZzJ4NTA5IFBLQ1MxMl9jZXJ0YmFnMng1MDkKKyNkZWZpbmUgTV9QS0NTMTJfY2VydGJhZzJ4NTA5Y3JsIFBLQ1MxMl9jZXJ0YmFnMng1MDljcmwgCisKKyNkZWZpbmUgTV9QS0NTMTJfdW5wYWNrX3A3ZGF0YSBQS0NTMTJfdW5wYWNrX3A3ZGF0YQorI2RlZmluZSBNX1BLQ1MxMl9wYWNrX2F1dGhzYWZlcyBQS0NTMTJfcGFja19hdXRoc2FmZXMKKyNkZWZpbmUgTV9QS0NTMTJfdW5wYWNrX2F1dGhzYWZlcyBQS0NTMTJfdW5wYWNrX2F1dGhzYWZlcworI2RlZmluZSBNX1BLQ1MxMl91bnBhY2tfcDdlbmNkYXRhIFBLQ1MxMl91bnBhY2tfcDdlbmNkYXRhCisKKyNkZWZpbmUgTV9QS0NTMTJfZGVjcnlwdF9za2V5IFBLQ1MxMl9kZWNyeXB0X3NrZXkKKyNkZWZpbmUgTV9QS0NTOF9kZWNyeXB0IFBLQ1M4X2RlY3J5cHQKKworI2RlZmluZSBNX1BLQ1MxMl9iYWdfdHlwZShiZykgT0JKX29iajJuaWQoKGJnKS0+dHlwZSkKKyNkZWZpbmUgTV9QS0NTMTJfY2VydF9iYWdfdHlwZShiZykgT0JKX29iajJuaWQoKGJnKS0+dmFsdWUuYmFnLT50eXBlKQorI2RlZmluZSBNX1BLQ1MxMl9jcmxfYmFnX3R5cGUgTV9QS0NTMTJfY2VydF9iYWdfdHlwZQorCisjZGVmaW5lIFBLQ1MxMl9nZXRfYXR0cihiYWcsIGF0dHJfbmlkKSBcCisJCQkgUEtDUzEyX2dldF9hdHRyX2dlbihiYWctPmF0dHJpYiwgYXR0cl9uaWQpCisKKyNkZWZpbmUgUEtDUzhfZ2V0X2F0dHIocDgsIGF0dHJfbmlkKSBcCisJCVBLQ1MxMl9nZXRfYXR0cl9nZW4ocDgtPmF0dHJpYnV0ZXMsIGF0dHJfbmlkKQorCisjZGVmaW5lIFBLQ1MxMl9tYWNfcHJlc2VudChwMTIpICgocDEyKS0+bWFjID8gMSA6IDApCisKKworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl94NTA5MmNlcnRiYWcoWDUwOSAqeDUwOSk7CitQS0NTMTJfU0FGRUJBRyAqUEtDUzEyX3g1MDljcmwyY2VydGJhZyhYNTA5X0NSTCAqY3JsKTsKK1g1MDkgKlBLQ1MxMl9jZXJ0YmFnMng1MDkoUEtDUzEyX1NBRkVCQUcgKmJhZyk7CitYNTA5X0NSTCAqUEtDUzEyX2NlcnRiYWcyeDUwOWNybChQS0NTMTJfU0FGRUJBRyAqYmFnKTsKKworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9pdGVtX3BhY2tfc2FmZWJhZyh2b2lkICpvYmosIGNvbnN0IEFTTjFfSVRFTSAqaXQsIGludCBuaWQxLAorCSAgICAgaW50IG5pZDIpOworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9NQUtFX0tFWUJBRyhQS0NTOF9QUklWX0tFWV9JTkZPICpwOCk7CitQS0NTOF9QUklWX0tFWV9JTkZPICpQS0NTOF9kZWNyeXB0KFg1MDlfU0lHICpwOCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4pOworUEtDUzhfUFJJVl9LRVlfSU5GTyAqUEtDUzEyX2RlY3J5cHRfc2tleShQS0NTMTJfU0FGRUJBRyAqYmFnLCBjb25zdCBjaGFyICpwYXNzLAorCQkJCQkJCQlpbnQgcGFzc2xlbik7CitYNTA5X1NJRyAqUEtDUzhfZW5jcnlwdChpbnQgcGJlX25pZCwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCAKKwkJCWNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLAorCQkJdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpdGVyLAorCQkJUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgpOworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9NQUtFX1NIS0VZQkFHKGludCBwYmVfbmlkLCBjb25zdCBjaGFyICpwYXNzLAorCQkJCSAgICAgaW50IHBhc3NsZW4sIHVuc2lnbmVkIGNoYXIgKnNhbHQsCisJCQkJICAgICBpbnQgc2FsdGxlbiwgaW50IGl0ZXIsCisJCQkJICAgICBQS0NTOF9QUklWX0tFWV9JTkZPICpwOCk7CitQS0NTNyAqUEtDUzEyX3BhY2tfcDdkYXRhKFNUQUNLX09GKFBLQ1MxMl9TQUZFQkFHKSAqc2spOworU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpQS0NTMTJfdW5wYWNrX3A3ZGF0YShQS0NTNyAqcDcpOworUEtDUzcgKlBLQ1MxMl9wYWNrX3A3ZW5jZGF0YShpbnQgcGJlX25pZCwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuLCBpbnQgaXRlciwKKwkJCSAgICAgU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzKTsKK1NUQUNLX09GKFBLQ1MxMl9TQUZFQkFHKSAqUEtDUzEyX3VucGFja19wN2VuY2RhdGEoUEtDUzcgKnA3LCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbik7CisKK2ludCBQS0NTMTJfcGFja19hdXRoc2FmZXMoUEtDUzEyICpwMTIsIFNUQUNLX09GKFBLQ1M3KSAqc2FmZXMpOworU1RBQ0tfT0YoUEtDUzcpICpQS0NTMTJfdW5wYWNrX2F1dGhzYWZlcyhQS0NTMTIgKnAxMik7CisKK2ludCBQS0NTMTJfYWRkX2xvY2Fsa2V5aWQoUEtDUzEyX1NBRkVCQUcgKmJhZywgdW5zaWduZWQgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworaW50IFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX2FzYyhQS0NTMTJfU0FGRUJBRyAqYmFnLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCWludCBuYW1lbGVuKTsKK2ludCBQS0NTMTJfYWRkX0NTUE5hbWVfYXNjKFBLQ1MxMl9TQUZFQkFHICpiYWcsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJaW50IG5hbWVsZW4pOworaW50IFBLQ1MxMl9hZGRfZnJpZW5kbHluYW1lX3VuaShQS0NTMTJfU0FGRUJBRyAqYmFnLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorCQkJCWludCBuYW1lbGVuKTsKK2ludCBQS0NTOF9hZGRfa2V5dXNhZ2UoUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDgsIGludCB1c2FnZSk7CitBU04xX1RZUEUgKlBLQ1MxMl9nZXRfYXR0cl9nZW4oU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICphdHRycywgaW50IGF0dHJfbmlkKTsKK2NoYXIgKlBLQ1MxMl9nZXRfZnJpZW5kbHluYW1lKFBLQ1MxMl9TQUZFQkFHICpiYWcpOwordW5zaWduZWQgY2hhciAqUEtDUzEyX3BiZV9jcnlwdChYNTA5X0FMR09SICphbGdvciwgY29uc3QgY2hhciAqcGFzcywKKwkJCQlpbnQgcGFzc2xlbiwgdW5zaWduZWQgY2hhciAqaW4sIGludCBpbmxlbiwKKwkJCQl1bnNpZ25lZCBjaGFyICoqZGF0YSwgaW50ICpkYXRhbGVuLCBpbnQgZW5fZGUpOwordm9pZCAqIFBLQ1MxMl9pdGVtX2RlY3J5cHRfZDJpKFg1MDlfQUxHT1IgKmFsZ29yLCBjb25zdCBBU04xX0lURU0gKml0LAorCSAgICAgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sIEFTTjFfT0NURVRfU1RSSU5HICpvY3QsIGludCB6YnVmKTsKK0FTTjFfT0NURVRfU1RSSU5HICpQS0NTMTJfaXRlbV9pMmRfZW5jcnlwdChYNTA5X0FMR09SICphbGdvciwgY29uc3QgQVNOMV9JVEVNICppdCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4sCisJCQkJICAgICAgIHZvaWQgKm9iaiwgaW50IHpidWYpOworUEtDUzEyICpQS0NTMTJfaW5pdChpbnQgbW9kZSk7CitpbnQgUEtDUzEyX2tleV9nZW5fYXNjKGNvbnN0IGNoYXIgKnBhc3MsIGludCBwYXNzbGVuLCB1bnNpZ25lZCBjaGFyICpzYWx0LAorCQkgICAgICAgaW50IHNhbHRsZW4sIGludCBpZCwgaW50IGl0ZXIsIGludCBuLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqb3V0LCBjb25zdCBFVlBfTUQgKm1kX3R5cGUpOworaW50IFBLQ1MxMl9rZXlfZ2VuX3VuaSh1bnNpZ25lZCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpZCwgaW50IGl0ZXIsIGludCBuLCB1bnNpZ25lZCBjaGFyICpvdXQsIGNvbnN0IEVWUF9NRCAqbWRfdHlwZSk7CitpbnQgUEtDUzEyX1BCRV9rZXlpdmdlbihFVlBfQ0lQSEVSX0NUWCAqY3R4LCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCSBBU04xX1RZUEUgKnBhcmFtLCBjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIGNvbnN0IEVWUF9NRCAqbWRfdHlwZSwKKwkJCSBpbnQgZW5fZGUpOworaW50IFBLQ1MxMl9nZW5fbWFjKFBLQ1MxMiAqcDEyLCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJCSB1bnNpZ25lZCBjaGFyICptYWMsIHVuc2lnbmVkIGludCAqbWFjbGVuKTsKK2ludCBQS0NTMTJfdmVyaWZ5X21hYyhQS0NTMTIgKnAxMiwgY29uc3QgY2hhciAqcGFzcywgaW50IHBhc3NsZW4pOworaW50IFBLQ1MxMl9zZXRfbWFjKFBLQ1MxMiAqcDEyLCBjb25zdCBjaGFyICpwYXNzLCBpbnQgcGFzc2xlbiwKKwkJICAgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sIGludCBpdGVyLAorCQkgICBjb25zdCBFVlBfTUQgKm1kX3R5cGUpOworaW50IFBLQ1MxMl9zZXR1cF9tYWMoUEtDUzEyICpwMTIsIGludCBpdGVyLCB1bnNpZ25lZCBjaGFyICpzYWx0LAorCQkJCQkgaW50IHNhbHRsZW4sIGNvbnN0IEVWUF9NRCAqbWRfdHlwZSk7Cit1bnNpZ25lZCBjaGFyICpPUEVOU1NMX2FzYzJ1bmkoY29uc3QgY2hhciAqYXNjLCBpbnQgYXNjbGVuLCB1bnNpZ25lZCBjaGFyICoqdW5pLCBpbnQgKnVuaWxlbik7CitjaGFyICpPUEVOU1NMX3VuaTJhc2ModW5zaWduZWQgY2hhciAqdW5pLCBpbnQgdW5pbGVuKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQS0NTMTIpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1MxMl9NQUNfREFUQSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzEyX1NBRkVCQUcpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1MxMl9CQUdTKQorCitERUNMQVJFX0FTTjFfSVRFTShQS0NTMTJfU0FGRUJBR1MpCitERUNMQVJFX0FTTjFfSVRFTShQS0NTMTJfQVVUSFNBRkVTKQorCit2b2lkIFBLQ1MxMl9QQkVfYWRkKHZvaWQpOworaW50IFBLQ1MxMl9wYXJzZShQS0NTMTIgKnAxMiwgY29uc3QgY2hhciAqcGFzcywgRVZQX1BLRVkgKipwa2V5LCBYNTA5ICoqY2VydCwKKwkJIFNUQUNLX09GKFg1MDkpICoqY2EpOworUEtDUzEyICpQS0NTMTJfY3JlYXRlKGNoYXIgKnBhc3MsIGNoYXIgKm5hbWUsIEVWUF9QS0VZICpwa2V5LCBYNTA5ICpjZXJ0LAorCQkJIFNUQUNLX09GKFg1MDkpICpjYSwgaW50IG5pZF9rZXksIGludCBuaWRfY2VydCwgaW50IGl0ZXIsCisJCQkJCQkgaW50IG1hY19pdGVyLCBpbnQga2V5dHlwZSk7CisKK1BLQ1MxMl9TQUZFQkFHICpQS0NTMTJfYWRkX2NlcnQoU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICoqcGJhZ3MsIFg1MDkgKmNlcnQpOworUEtDUzEyX1NBRkVCQUcgKlBLQ1MxMl9hZGRfa2V5KFNUQUNLX09GKFBLQ1MxMl9TQUZFQkFHKSAqKnBiYWdzLCBFVlBfUEtFWSAqa2V5LAorCQkJCQkJaW50IGtleV91c2FnZSwgaW50IGl0ZXIsCisJCQkJCQlpbnQga2V5X25pZCwgY2hhciAqcGFzcyk7CitpbnQgUEtDUzEyX2FkZF9zYWZlKFNUQUNLX09GKFBLQ1M3KSAqKnBzYWZlcywgU1RBQ0tfT0YoUEtDUzEyX1NBRkVCQUcpICpiYWdzLAorCQkJCQlpbnQgc2FmZV9uaWQsIGludCBpdGVyLCBjaGFyICpwYXNzKTsKK1BLQ1MxMiAqUEtDUzEyX2FkZF9zYWZlcyhTVEFDS19PRihQS0NTNykgKnNhZmVzLCBpbnQgcDdfbmlkKTsKKworaW50IGkyZF9QS0NTMTJfYmlvKEJJTyAqYnAsIFBLQ1MxMiAqcDEyKTsKK2ludCBpMmRfUEtDUzEyX2ZwKEZJTEUgKmZwLCBQS0NTMTIgKnAxMik7CitQS0NTMTIgKmQyaV9QS0NTMTJfYmlvKEJJTyAqYnAsIFBLQ1MxMiAqKnAxMik7CitQS0NTMTIgKmQyaV9QS0NTMTJfZnAoRklMRSAqZnAsIFBLQ1MxMiAqKnAxMik7CitpbnQgUEtDUzEyX25ld3Bhc3MoUEtDUzEyICpwMTIsIGNoYXIgKm9sZHBhc3MsIGNoYXIgKm5ld3Bhc3MpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1BLQ1MxMl9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIFBLQ1MxMiBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBQS0NTMTJfRl9QQVJTRV9CQUcJCQkJIDEyOQorI2RlZmluZSBQS0NTMTJfRl9QQVJTRV9CQUdTCQkJCSAxMDMKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0FERF9GUklFTkRMWU5BTUUJCSAxMDAKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0FERF9GUklFTkRMWU5BTUVfQVNDCQkgMTI3CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9BRERfRlJJRU5ETFlOQU1FX1VOSQkJIDEwMgorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfQUREX0xPQ0FMS0VZSUQJCQkgMTA0CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9DUkVBVEUJCQkJIDEwNQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfR0VOX01BQwkJCQkgMTA3CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9JTklUCQkJCSAxMDkKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0lURU1fREVDUllQVF9EMkkJCSAxMDYKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0lURU1fSTJEX0VOQ1JZUFQJCSAxMDgKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0lURU1fUEFDS19TQUZFQkFHCQkgMTE3CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9LRVlfR0VOX0FTQwkJCSAxMTAKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX0tFWV9HRU5fVU5JCQkJIDExMQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfTUFLRV9LRVlCQUcJCQkgMTEyCisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9NQUtFX1NIS0VZQkFHCQkJIDExMworI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfTkVXUEFTUwkJCQkgMTI4CisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9QQUNLX1A3REFUQQkJCSAxMTQKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzEyX1BBQ0tfUDdFTkNEQVRBCQkJIDExNQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfUEFSU0UJCQkJIDExOAorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfUEJFX0NSWVBUCQkJIDExOQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfUEJFX0tFWUlWR0VOCQkJIDEyMAorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfU0VUVVBfTUFDCQkJIDEyMgorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfU0VUX01BQwkJCQkgMTIzCisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9VTlBBQ0tfQVVUSFNBRkVTCQkgMTMwCisjZGVmaW5lIFBLQ1MxMl9GX1BLQ1MxMl9VTlBBQ0tfUDdEQVRBCQkJIDEzMQorI2RlZmluZSBQS0NTMTJfRl9QS0NTMTJfVkVSSUZZX01BQwkJCSAxMjYKKyNkZWZpbmUgUEtDUzEyX0ZfUEtDUzhfQUREX0tFWVVTQUdFCQkJIDEyNAorI2RlZmluZSBQS0NTMTJfRl9QS0NTOF9FTkNSWVBUCQkJCSAxMjUKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBQS0NTMTJfUl9DQU5UX1BBQ0tfU1RSVUNUVVJFCQkJIDEwMAorI2RlZmluZSBQS0NTMTJfUl9DT05URU5UX1RZUEVfTk9UX0RBVEEJCQkgMTIxCisjZGVmaW5lIFBLQ1MxMl9SX0RFQ09ERV9FUlJPUgkJCQkgMTAxCisjZGVmaW5lIFBLQ1MxMl9SX0VOQ09ERV9FUlJPUgkJCQkgMTAyCisjZGVmaW5lIFBLQ1MxMl9SX0VOQ1JZUFRfRVJST1IJCQkJIDEwMworI2RlZmluZSBQS0NTMTJfUl9FUlJPUl9TRVRUSU5HX0VOQ1JZUFRFRF9EQVRBX1RZUEUJIDEyMAorI2RlZmluZSBQS0NTMTJfUl9JTlZBTElEX05VTExfQVJHVU1FTlQJCQkgMTA0CisjZGVmaW5lIFBLQ1MxMl9SX0lOVkFMSURfTlVMTF9QS0NTMTJfUE9JTlRFUgkJIDEwNQorI2RlZmluZSBQS0NTMTJfUl9JVl9HRU5fRVJST1IJCQkJIDEwNgorI2RlZmluZSBQS0NTMTJfUl9LRVlfR0VOX0VSUk9SCQkJCSAxMDcKKyNkZWZpbmUgUEtDUzEyX1JfTUFDX0FCU0VOVAkJCQkgMTA4CisjZGVmaW5lIFBLQ1MxMl9SX01BQ19HRU5FUkFUSU9OX0VSUk9SCQkJIDEwOQorI2RlZmluZSBQS0NTMTJfUl9NQUNfU0VUVVBfRVJST1IJCQkgMTEwCisjZGVmaW5lIFBLQ1MxMl9SX01BQ19TVFJJTkdfU0VUX0VSUk9SCQkJIDExMQorI2RlZmluZSBQS0NTMTJfUl9NQUNfVkVSSUZZX0VSUk9SCQkJIDExMgorI2RlZmluZSBQS0NTMTJfUl9NQUNfVkVSSUZZX0ZBSUxVUkUJCQkgMTEzCisjZGVmaW5lIFBLQ1MxMl9SX1BBUlNFX0VSUk9SCQkJCSAxMTQKKyNkZWZpbmUgUEtDUzEyX1JfUEtDUzEyX0FMR09SX0NJUEhFUklOSVRfRVJST1IJCSAxMTUKKyNkZWZpbmUgUEtDUzEyX1JfUEtDUzEyX0NJUEhFUkZJTkFMX0VSUk9SCQkgMTE2CisjZGVmaW5lIFBLQ1MxMl9SX1BLQ1MxMl9QQkVfQ1JZUFRfRVJST1IJCQkgMTE3CisjZGVmaW5lIFBLQ1MxMl9SX1VOS05PV05fRElHRVNUX0FMR09SSVRITQkJIDExOAorI2RlZmluZSBQS0NTMTJfUl9VTlNVUFBPUlRFRF9QS0NTMTJfTU9ERQkJIDExOQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcGtjczcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQ0NDMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKQEAgLTAsMCArMSw0OTkgQEAKKy8qIGNyeXB0by9wa2NzNy9wa2NzNy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1BLQ1M3X0gKKyNkZWZpbmUgSEVBREVSX1BLQ1M3X0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9zeW1oYWNrcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb3NzbF90eXAuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjMyCisvKiBVbmRlciBXaW4zMiB0aGVzIGFyZSBkZWZpbmVkIGluIHdpbmNyeXB0LmggKi8KKyN1bmRlZiBQS0NTN19JU1NVRVJfQU5EX1NFUklBTAorI3VuZGVmIFBLQ1M3X1NJR05FUl9JTkZPCisjZW5kaWYKKworLyoKK0VuY3J5cHRpb25fSUQJCURFUy1DQkMKK0RpZ2VzdF9JRAkJTUQ1CitEaWdlc3RfRW5jcnlwdGlvbl9JRAlyc2FFbmNyeXB0aW9uCitLZXlfRW5jcnlwdGlvbl9JRAlyc2FFbmNyeXB0aW9uCisqLworCit0eXBlZGVmIHN0cnVjdCBwa2NzN19pc3N1ZXJfYW5kX3NlcmlhbF9zdAorCXsKKwlYNTA5X05BTUUgKmlzc3VlcjsKKwlBU04xX0lOVEVHRVIgKnNlcmlhbDsKKwl9IFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMOworCit0eXBlZGVmIHN0cnVjdCBwa2NzN19zaWduZXJfaW5mb19zdAorCXsKKwlBU04xX0lOVEVHRVIgCQkJKnZlcnNpb247CS8qIHZlcnNpb24gMSAqLworCVBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMCQkqaXNzdWVyX2FuZF9zZXJpYWw7CisJWDUwOV9BTEdPUgkJCSpkaWdlc3RfYWxnOworCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKQkqYXV0aF9hdHRyOwkvKiBbIDAgXSAqLworCVg1MDlfQUxHT1IJCQkqZGlnZXN0X2VuY19hbGc7CisJQVNOMV9PQ1RFVF9TVFJJTkcJCSplbmNfZGlnZXN0OworCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKQkqdW5hdXRoX2F0dHI7CS8qIFsgMSBdICovCisKKwkvKiBUaGUgcHJpdmF0ZSBrZXkgdG8gc2lnbiB3aXRoICovCisJRVZQX1BLRVkJCQkqcGtleTsKKwl9IFBLQ1M3X1NJR05FUl9JTkZPOworCitERUNMQVJFX1NUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKQorREVDTEFSRV9BU04xX1NFVF9PRihQS0NTN19TSUdORVJfSU5GTykKKwordHlwZWRlZiBzdHJ1Y3QgcGtjczdfcmVjaXBfaW5mb19zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqdmVyc2lvbjsJLyogdmVyc2lvbiAwICovCisJUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwJCSppc3N1ZXJfYW5kX3NlcmlhbDsKKwlYNTA5X0FMR09SCQkJKmtleV9lbmNfYWxnb3I7CisJQVNOMV9PQ1RFVF9TVFJJTkcJCSplbmNfa2V5OworCVg1MDkJCQkJKmNlcnQ7IC8qIGdldCB0aGUgcHViLWtleSBmcm9tIHRoaXMgKi8KKwl9IFBLQ1M3X1JFQ0lQX0lORk87CisKK0RFQ0xBUkVfU1RBQ0tfT0YoUEtDUzdfUkVDSVBfSU5GTykKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoUEtDUzdfUkVDSVBfSU5GTykKKwordHlwZWRlZiBzdHJ1Y3QgcGtjczdfc2lnbmVkX3N0CisJeworCUFTTjFfSU5URUdFUgkJCSp2ZXJzaW9uOwkvKiB2ZXJzaW9uIDEgKi8KKwlTVEFDS19PRihYNTA5X0FMR09SKQkJKm1kX2FsZ3M7CS8qIG1kIHVzZWQgKi8KKwlTVEFDS19PRihYNTA5KQkJCSpjZXJ0OwkJLyogWyAwIF0gKi8KKwlTVEFDS19PRihYNTA5X0NSTCkJCSpjcmw7CQkvKiBbIDEgXSAqLworCVNUQUNLX09GKFBLQ1M3X1NJR05FUl9JTkZPKQkqc2lnbmVyX2luZm87CisKKwlzdHJ1Y3QgcGtjczdfc3QJCQkqY29udGVudHM7CisJfSBQS0NTN19TSUdORUQ7CisvKiBUaGUgYWJvdmUgc3RydWN0dXJlIGlzIHZlcnkgdmVyeSBzaW1pbGFyIHRvIFBLQ1M3X1NJR05fRU5WRUxPUEUuCisgKiBIb3cgYWJvdXQgbWVyZ2luZyB0aGUgdHdvICovCisKK3R5cGVkZWYgc3RydWN0IHBrY3M3X2VuY19jb250ZW50X3N0CisJeworCUFTTjFfT0JKRUNUCQkJKmNvbnRlbnRfdHlwZTsKKwlYNTA5X0FMR09SCQkJKmFsZ29yaXRobTsKKwlBU04xX09DVEVUX1NUUklORwkJKmVuY19kYXRhOwkvKiBbIDAgXSAqLworCWNvbnN0IEVWUF9DSVBIRVIJCSpjaXBoZXI7CisJfSBQS0NTN19FTkNfQ09OVEVOVDsKKwordHlwZWRlZiBzdHJ1Y3QgcGtjczdfZW52ZWxvcGVkX3N0CisJeworCUFTTjFfSU5URUdFUgkJCSp2ZXJzaW9uOwkvKiB2ZXJzaW9uIDAgKi8KKwlTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKQkqcmVjaXBpZW50aW5mbzsKKwlQS0NTN19FTkNfQ09OVEVOVAkJKmVuY19kYXRhOworCX0gUEtDUzdfRU5WRUxPUEU7CisKK3R5cGVkZWYgc3RydWN0IHBrY3M3X3NpZ25lZGFuZGVudmVsb3BlZF9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqdmVyc2lvbjsJLyogdmVyc2lvbiAxICovCisJU1RBQ0tfT0YoWDUwOV9BTEdPUikJCSptZF9hbGdzOwkvKiBtZCB1c2VkICovCisJU1RBQ0tfT0YoWDUwOSkJCQkqY2VydDsJCS8qIFsgMCBdICovCisJU1RBQ0tfT0YoWDUwOV9DUkwpCQkqY3JsOwkJLyogWyAxIF0gKi8KKwlTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykJKnNpZ25lcl9pbmZvOworCisJUEtDUzdfRU5DX0NPTlRFTlQJCSplbmNfZGF0YTsKKwlTVEFDS19PRihQS0NTN19SRUNJUF9JTkZPKQkqcmVjaXBpZW50aW5mbzsKKwl9IFBLQ1M3X1NJR05fRU5WRUxPUEU7CisKK3R5cGVkZWYgc3RydWN0IHBrY3M3X2RpZ2VzdF9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqdmVyc2lvbjsJLyogdmVyc2lvbiAwICovCisJWDUwOV9BTEdPUgkJCSptZDsJCS8qIG1kIHVzZWQgKi8KKwlzdHJ1Y3QgcGtjczdfc3QgCQkqY29udGVudHM7CisJQVNOMV9PQ1RFVF9TVFJJTkcJCSpkaWdlc3Q7CisJfSBQS0NTN19ESUdFU1Q7CisKK3R5cGVkZWYgc3RydWN0IHBrY3M3X2VuY3J5cHRlZF9zdAorCXsKKwlBU04xX0lOVEVHRVIJCQkqdmVyc2lvbjsJLyogdmVyc2lvbiAwICovCisJUEtDUzdfRU5DX0NPTlRFTlQJCSplbmNfZGF0YTsKKwl9IFBLQ1M3X0VOQ1JZUFQ7CisKK3R5cGVkZWYgc3RydWN0IHBrY3M3X3N0CisJeworCS8qIFRoZSBmb2xsb3dpbmcgaXMgbm9uIE5VTEwgaWYgaXQgY29udGFpbnMgQVNOMSBlbmNvZGluZyBvZgorCSAqIHRoaXMgc3RydWN0dXJlICovCisJdW5zaWduZWQgY2hhciAqYXNuMTsKKwlsb25nIGxlbmd0aDsKKworI2RlZmluZSBQS0NTN19TX0hFQURFUgkwCisjZGVmaW5lIFBLQ1M3X1NfQk9EWQkxCisjZGVmaW5lIFBLQ1M3X1NfVEFJTAkyCisJaW50IHN0YXRlOyAvKiB1c2VkIGR1cmluZyBwcm9jZXNzaW5nICovCisKKwlpbnQgZGV0YWNoZWQ7CisKKwlBU04xX09CSkVDVCAqdHlwZTsKKwkvKiBjb250ZW50IGFzIGRlZmluZWQgYnkgdGhlIHR5cGUgKi8KKwkvKiBhbGwgZW5jcnlwdGlvbi9tZXNzYWdlIGRpZ2VzdHMgYXJlIGFwcGxpZWQgdG8gdGhlICdjb250ZW50cycsCisJICogbGVhdmluZyBvdXQgdGhlICd0eXBlJyBmaWVsZC4gKi8KKwl1bmlvbgl7CisJCWNoYXIgKnB0cjsKKworCQkvKiBOSURfcGtjczdfZGF0YSAqLworCQlBU04xX09DVEVUX1NUUklORyAqZGF0YTsKKworCQkvKiBOSURfcGtjczdfc2lnbmVkICovCisJCVBLQ1M3X1NJR05FRCAqc2lnbjsKKworCQkvKiBOSURfcGtjczdfZW52ZWxvcGVkICovCisJCVBLQ1M3X0VOVkVMT1BFICplbnZlbG9wZWQ7CisKKwkJLyogTklEX3BrY3M3X3NpZ25lZEFuZEVudmVsb3BlZCAqLworCQlQS0NTN19TSUdOX0VOVkVMT1BFICpzaWduZWRfYW5kX2VudmVsb3BlZDsKKworCQkvKiBOSURfcGtjczdfZGlnZXN0ICovCisJCVBLQ1M3X0RJR0VTVCAqZGlnZXN0OworCisJCS8qIE5JRF9wa2NzN19lbmNyeXB0ZWQgKi8KKwkJUEtDUzdfRU5DUllQVCAqZW5jcnlwdGVkOworCisJCS8qIEFueXRoaW5nIGVsc2UgKi8KKwkJQVNOMV9UWVBFICpvdGhlcjsKKwkJfSBkOworCX0gUEtDUzc7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoUEtDUzcpCitERUNMQVJFX0FTTjFfU0VUX09GKFBLQ1M3KQorREVDTEFSRV9QS0NTMTJfU1RBQ0tfT0YoUEtDUzcpCisKKyNkZWZpbmUgUEtDUzdfT1BfU0VUX0RFVEFDSEVEX1NJR05BVFVSRQkxCisjZGVmaW5lIFBLQ1M3X09QX0dFVF9ERVRBQ0hFRF9TSUdOQVRVUkUJMgorCisjZGVmaW5lIFBLQ1M3X2dldF9zaWduZWRfYXR0cmlidXRlcyhzaSkJKChzaSktPmF1dGhfYXR0cikKKyNkZWZpbmUgUEtDUzdfZ2V0X2F0dHJpYnV0ZXMoc2kpCSgoc2kpLT51bmF1dGhfYXR0cikKKworI2RlZmluZSBQS0NTN190eXBlX2lzX3NpZ25lZChhKSAoT0JKX29iajJuaWQoKGEpLT50eXBlKSA9PSBOSURfcGtjczdfc2lnbmVkKQorI2RlZmluZSBQS0NTN190eXBlX2lzX2VuY3J5cHRlZChhKSAoT0JKX29iajJuaWQoKGEpLT50eXBlKSA9PSBOSURfcGtjczdfZW5jcnlwdGVkKQorI2RlZmluZSBQS0NTN190eXBlX2lzX2VudmVsb3BlZChhKSAoT0JKX29iajJuaWQoKGEpLT50eXBlKSA9PSBOSURfcGtjczdfZW52ZWxvcGVkKQorI2RlZmluZSBQS0NTN190eXBlX2lzX3NpZ25lZEFuZEVudmVsb3BlZChhKSBcCisJCShPQkpfb2JqMm5pZCgoYSktPnR5cGUpID09IE5JRF9wa2NzN19zaWduZWRBbmRFbnZlbG9wZWQpCisjZGVmaW5lIFBLQ1M3X3R5cGVfaXNfZGF0YShhKSAgIChPQkpfb2JqMm5pZCgoYSktPnR5cGUpID09IE5JRF9wa2NzN19kYXRhKQorI2RlZmluZSBQS0NTN190eXBlX2lzX2RpZ2VzdChhKSAgIChPQkpfb2JqMm5pZCgoYSktPnR5cGUpID09IE5JRF9wa2NzN19kaWdlc3QpCisjZGVmaW5lIFBLQ1M3X3R5cGVfaXNfZW5jcnlwdGVkKGEpIFwKKwkJKE9CSl9vYmoybmlkKChhKS0+dHlwZSkgPT0gTklEX3BrY3M3X2VuY3J5cHRlZCkKKworI2RlZmluZSBQS0NTN190eXBlX2lzX2RpZ2VzdChhKSAgIChPQkpfb2JqMm5pZCgoYSktPnR5cGUpID09IE5JRF9wa2NzN19kaWdlc3QpCisKKyNkZWZpbmUgUEtDUzdfc2V0X2RldGFjaGVkKHAsdikgXAorCQlQS0NTN19jdHJsKHAsUEtDUzdfT1BfU0VUX0RFVEFDSEVEX1NJR05BVFVSRSx2LE5VTEwpCisjZGVmaW5lIFBLQ1M3X2dldF9kZXRhY2hlZChwKSBcCisJCVBLQ1M3X2N0cmwocCxQS0NTN19PUF9HRVRfREVUQUNIRURfU0lHTkFUVVJFLDAsTlVMTCkKKworI2RlZmluZSBQS0NTN19pc19kZXRhY2hlZChwNykgKFBLQ1M3X3R5cGVfaXNfc2lnbmVkKHA3KSAmJiBQS0NTN19nZXRfZGV0YWNoZWQocDcpKQorCisvKiBTL01JTUUgcmVsYXRlZCBmbGFncyAqLworCisjZGVmaW5lIFBLQ1M3X1RFWFQJCTB4MQorI2RlZmluZSBQS0NTN19OT0NFUlRTCQkweDIKKyNkZWZpbmUgUEtDUzdfTk9TSUdTCQkweDQKKyNkZWZpbmUgUEtDUzdfTk9DSEFJTgkJMHg4CisjZGVmaW5lIFBLQ1M3X05PSU5URVJOCQkweDEwCisjZGVmaW5lIFBLQ1M3X05PVkVSSUZZCQkweDIwCisjZGVmaW5lIFBLQ1M3X0RFVEFDSEVECQkweDQwCisjZGVmaW5lIFBLQ1M3X0JJTkFSWQkJMHg4MAorI2RlZmluZSBQS0NTN19OT0FUVFIJCTB4MTAwCisjZGVmaW5lCVBLQ1M3X05PU01JTUVDQVAJMHgyMDAKKyNkZWZpbmUgUEtDUzdfTk9PTERNSU1FVFlQRQkweDQwMAorI2RlZmluZSBQS0NTN19DUkxGRU9MCQkweDgwMAorI2RlZmluZSBQS0NTN19TVFJFQU0JCTB4MTAwMAorI2RlZmluZSBQS0NTN19OT0NSTAkJMHgyMDAwCisjZGVmaW5lIFBLQ1M3X1BBUlRJQUwJCTB4NDAwMAorI2RlZmluZSBQS0NTN19SRVVTRV9ESUdFU1QJMHg4MDAwCisKKy8qIEZsYWdzOiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGNvZGUgKi8KKworI2RlZmluZSBTTUlNRV9URVhUCVBLQ1M3X1RFWFQKKyNkZWZpbmUgU01JTUVfTk9DRVJUUwlQS0NTN19OT0NFUlRTCisjZGVmaW5lIFNNSU1FX05PU0lHUwlQS0NTN19OT1NJR1MKKyNkZWZpbmUgU01JTUVfTk9DSEFJTglQS0NTN19OT0NIQUlOCisjZGVmaW5lIFNNSU1FX05PSU5URVJOCVBLQ1M3X05PSU5URVJOCisjZGVmaW5lIFNNSU1FX05PVkVSSUZZCVBLQ1M3X05PVkVSSUZZCisjZGVmaW5lIFNNSU1FX0RFVEFDSEVECVBLQ1M3X0RFVEFDSEVECisjZGVmaW5lIFNNSU1FX0JJTkFSWQlQS0NTN19CSU5BUlkKKyNkZWZpbmUgU01JTUVfTk9BVFRSCVBLQ1M3X05PQVRUUgorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMKQorCitpbnQgUEtDUzdfSVNTVUVSX0FORF9TRVJJQUxfZGlnZXN0KFBLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMICpkYXRhLGNvbnN0IEVWUF9NRCAqdHlwZSwKKwl1bnNpZ25lZCBjaGFyICptZCx1bnNpZ25lZCBpbnQgKmxlbik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitQS0NTNyAqZDJpX1BLQ1M3X2ZwKEZJTEUgKmZwLFBLQ1M3ICoqcDcpOworaW50IGkyZF9QS0NTN19mcChGSUxFICpmcCxQS0NTNyAqcDcpOworI2VuZGlmCitQS0NTNyAqUEtDUzdfZHVwKFBLQ1M3ICpwNyk7CitQS0NTNyAqZDJpX1BLQ1M3X2JpbyhCSU8gKmJwLFBLQ1M3ICoqcDcpOworaW50IGkyZF9QS0NTN19iaW8oQklPICpicCxQS0NTNyAqcDcpOworaW50IGkyZF9QS0NTN19iaW9fc3RyZWFtKEJJTyAqb3V0LCBQS0NTNyAqcDcsIEJJTyAqaW4sIGludCBmbGFncyk7CitpbnQgUEVNX3dyaXRlX2Jpb19QS0NTN19zdHJlYW0oQklPICpvdXQsIFBLQ1M3ICpwNywgQklPICppbiwgaW50IGZsYWdzKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQS0NTN19TSUdORVJfSU5GTykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzdfUkVDSVBfSU5GTykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzdfU0lHTkVEKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQS0NTN19FTkNfQ09OVEVOVCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzdfRU5WRUxPUEUpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X1NJR05fRU5WRUxPUEUpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLQ1M3X0RJR0VTVCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzdfRU5DUllQVCkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzcpCisKK0RFQ0xBUkVfQVNOMV9JVEVNKFBLQ1M3X0FUVFJfU0lHTikKK0RFQ0xBUkVfQVNOMV9JVEVNKFBLQ1M3X0FUVFJfVkVSSUZZKQorCitERUNMQVJFX0FTTjFfTkRFRl9GVU5DVElPTihQS0NTNykKK0RFQ0xBUkVfQVNOMV9QUklOVF9GVU5DVElPTihQS0NTNykKKworbG9uZyBQS0NTN19jdHJsKFBLQ1M3ICpwNywgaW50IGNtZCwgbG9uZyBsYXJnLCBjaGFyICpwYXJnKTsKKworaW50IFBLQ1M3X3NldF90eXBlKFBLQ1M3ICpwNywgaW50IHR5cGUpOworaW50IFBLQ1M3X3NldDBfdHlwZV9vdGhlcihQS0NTNyAqcDcsIGludCB0eXBlLCBBU04xX1RZUEUgKm90aGVyKTsKK2ludCBQS0NTN19zZXRfY29udGVudChQS0NTNyAqcDcsIFBLQ1M3ICpwN19kYXRhKTsKK2ludCBQS0NTN19TSUdORVJfSU5GT19zZXQoUEtDUzdfU0lHTkVSX0lORk8gKnA3aSwgWDUwOSAqeDUwOSwgRVZQX1BLRVkgKnBrZXksCisJY29uc3QgRVZQX01EICpkZ3N0KTsKK2ludCBQS0NTN19TSUdORVJfSU5GT19zaWduKFBLQ1M3X1NJR05FUl9JTkZPICpzaSk7CitpbnQgUEtDUzdfYWRkX3NpZ25lcihQS0NTNyAqcDcsIFBLQ1M3X1NJR05FUl9JTkZPICpwN2kpOworaW50IFBLQ1M3X2FkZF9jZXJ0aWZpY2F0ZShQS0NTNyAqcDcsIFg1MDkgKng1MDkpOworaW50IFBLQ1M3X2FkZF9jcmwoUEtDUzcgKnA3LCBYNTA5X0NSTCAqeDUwOSk7CitpbnQgUEtDUzdfY29udGVudF9uZXcoUEtDUzcgKnA3LCBpbnQgbmlkKTsKK2ludCBQS0NTN19kYXRhVmVyaWZ5KFg1MDlfU1RPUkUgKmNlcnRfc3RvcmUsIFg1MDlfU1RPUkVfQ1RYICpjdHgsCisJQklPICpiaW8sIFBLQ1M3ICpwNywgUEtDUzdfU0lHTkVSX0lORk8gKnNpKTsgCitpbnQgUEtDUzdfc2lnbmF0dXJlVmVyaWZ5KEJJTyAqYmlvLCBQS0NTNyAqcDcsIFBLQ1M3X1NJR05FUl9JTkZPICpzaSwKKwkJCQkJCQkJWDUwOSAqeDUwOSk7CisKK0JJTyAqUEtDUzdfZGF0YUluaXQoUEtDUzcgKnA3LCBCSU8gKmJpbyk7CitpbnQgUEtDUzdfZGF0YUZpbmFsKFBLQ1M3ICpwNywgQklPICpiaW8pOworQklPICpQS0NTN19kYXRhRGVjb2RlKFBLQ1M3ICpwNywgRVZQX1BLRVkgKnBrZXksIEJJTyAqaW5fYmlvLCBYNTA5ICpwY2VydCk7CisKKworUEtDUzdfU0lHTkVSX0lORk8gKlBLQ1M3X2FkZF9zaWduYXR1cmUoUEtDUzcgKnA3LCBYNTA5ICp4NTA5LAorCUVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKmRnc3QpOworWDUwOSAqUEtDUzdfY2VydF9mcm9tX3NpZ25lcl9pbmZvKFBLQ1M3ICpwNywgUEtDUzdfU0lHTkVSX0lORk8gKnNpKTsKK2ludCBQS0NTN19zZXRfZGlnZXN0KFBLQ1M3ICpwNywgY29uc3QgRVZQX01EICptZCk7CitTVEFDS19PRihQS0NTN19TSUdORVJfSU5GTykgKlBLQ1M3X2dldF9zaWduZXJfaW5mbyhQS0NTNyAqcDcpOworCitQS0NTN19SRUNJUF9JTkZPICpQS0NTN19hZGRfcmVjaXBpZW50KFBLQ1M3ICpwNywgWDUwOSAqeDUwOSk7Cit2b2lkIFBLQ1M3X1NJR05FUl9JTkZPX2dldDBfYWxncyhQS0NTN19TSUdORVJfSU5GTyAqc2ksIEVWUF9QS0VZICoqcGssCisJCQkJCVg1MDlfQUxHT1IgKipwZGlnLCBYNTA5X0FMR09SICoqcHNpZyk7Cit2b2lkIFBLQ1M3X1JFQ0lQX0lORk9fZ2V0MF9hbGcoUEtDUzdfUkVDSVBfSU5GTyAqcmksIFg1MDlfQUxHT1IgKipwZW5jKTsKK2ludCBQS0NTN19hZGRfcmVjaXBpZW50X2luZm8oUEtDUzcgKnA3LCBQS0NTN19SRUNJUF9JTkZPICpyaSk7CitpbnQgUEtDUzdfUkVDSVBfSU5GT19zZXQoUEtDUzdfUkVDSVBfSU5GTyAqcDdpLCBYNTA5ICp4NTA5KTsKK2ludCBQS0NTN19zZXRfY2lwaGVyKFBLQ1M3ICpwNywgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyKTsKK2ludCBQS0NTN19zdHJlYW0odW5zaWduZWQgY2hhciAqKipib3VuZGFyeSwgUEtDUzcgKnA3KTsKKworUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwgKlBLQ1M3X2dldF9pc3N1ZXJfYW5kX3NlcmlhbChQS0NTNyAqcDcsIGludCBpZHgpOworQVNOMV9PQ1RFVF9TVFJJTkcgKlBLQ1M3X2RpZ2VzdF9mcm9tX2F0dHJpYnV0ZXMoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpzayk7CitpbnQgUEtDUzdfYWRkX3NpZ25lZF9hdHRyaWJ1dGUoUEtDUzdfU0lHTkVSX0lORk8gKnA3c2ksaW50IG5pZCxpbnQgdHlwZSwKKwl2b2lkICpkYXRhKTsKK2ludCBQS0NTN19hZGRfYXR0cmlidXRlIChQS0NTN19TSUdORVJfSU5GTyAqcDdzaSwgaW50IG5pZCwgaW50IGF0cnR5cGUsCisJdm9pZCAqdmFsdWUpOworQVNOMV9UWVBFICpQS0NTN19nZXRfYXR0cmlidXRlKFBLQ1M3X1NJR05FUl9JTkZPICpzaSwgaW50IG5pZCk7CitBU04xX1RZUEUgKlBLQ1M3X2dldF9zaWduZWRfYXR0cmlidXRlKFBLQ1M3X1NJR05FUl9JTkZPICpzaSwgaW50IG5pZCk7CitpbnQgUEtDUzdfc2V0X3NpZ25lZF9hdHRyaWJ1dGVzKFBLQ1M3X1NJR05FUl9JTkZPICpwN3NpLAorCQkJCVNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2spOworaW50IFBLQ1M3X3NldF9hdHRyaWJ1dGVzKFBLQ1M3X1NJR05FUl9JTkZPICpwN3NpLFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqc2spOworCisKK1BLQ1M3ICpQS0NTN19zaWduKFg1MDkgKnNpZ25jZXJ0LCBFVlBfUEtFWSAqcGtleSwgU1RBQ0tfT0YoWDUwOSkgKmNlcnRzLAorCQkJCQkJCUJJTyAqZGF0YSwgaW50IGZsYWdzKTsKKworUEtDUzdfU0lHTkVSX0lORk8gKlBLQ1M3X3NpZ25fYWRkX3NpZ25lcihQS0NTNyAqcDcsCisJCQlYNTA5ICpzaWduY2VydCwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQsCisJCQlpbnQgZmxhZ3MpOworCitpbnQgUEtDUzdfZmluYWwoUEtDUzcgKnA3LCBCSU8gKmRhdGEsIGludCBmbGFncyk7CitpbnQgUEtDUzdfdmVyaWZ5KFBLQ1M3ICpwNywgU1RBQ0tfT0YoWDUwOSkgKmNlcnRzLCBYNTA5X1NUT1JFICpzdG9yZSwKKwkJCQkJQklPICppbmRhdGEsIEJJTyAqb3V0LCBpbnQgZmxhZ3MpOworU1RBQ0tfT0YoWDUwOSkgKlBLQ1M3X2dldDBfc2lnbmVycyhQS0NTNyAqcDcsIFNUQUNLX09GKFg1MDkpICpjZXJ0cywgaW50IGZsYWdzKTsKK1BLQ1M3ICpQS0NTN19lbmNyeXB0KFNUQUNLX09GKFg1MDkpICpjZXJ0cywgQklPICppbiwgY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLAorCQkJCQkJCQlpbnQgZmxhZ3MpOworaW50IFBLQ1M3X2RlY3J5cHQoUEtDUzcgKnA3LCBFVlBfUEtFWSAqcGtleSwgWDUwOSAqY2VydCwgQklPICpkYXRhLCBpbnQgZmxhZ3MpOworCitpbnQgUEtDUzdfYWRkX2F0dHJpYl9zbWltZWNhcChQS0NTN19TSUdORVJfSU5GTyAqc2ksCisJCQkgICAgICBTVEFDS19PRihYNTA5X0FMR09SKSAqY2FwKTsKK1NUQUNLX09GKFg1MDlfQUxHT1IpICpQS0NTN19nZXRfc21pbWVjYXAoUEtDUzdfU0lHTkVSX0lORk8gKnNpKTsKK2ludCBQS0NTN19zaW1wbGVfc21pbWVjYXAoU1RBQ0tfT0YoWDUwOV9BTEdPUikgKnNrLCBpbnQgbmlkLCBpbnQgYXJnKTsKKworaW50IFBLQ1M3X2FkZF9hdHRyaWJfY29udGVudF90eXBlKFBLQ1M3X1NJR05FUl9JTkZPICpzaSwgQVNOMV9PQkpFQ1QgKmNvaWQpOworaW50IFBLQ1M3X2FkZDBfYXR0cmliX3NpZ25pbmdfdGltZShQS0NTN19TSUdORVJfSU5GTyAqc2ksIEFTTjFfVElNRSAqdCk7CitpbnQgUEtDUzdfYWRkMV9hdHRyaWJfZGlnZXN0KFBLQ1M3X1NJR05FUl9JTkZPICpzaSwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICptZCwgaW50IG1kbGVuKTsKKworaW50IFNNSU1FX3dyaXRlX1BLQ1M3KEJJTyAqYmlvLCBQS0NTNyAqcDcsIEJJTyAqZGF0YSwgaW50IGZsYWdzKTsKK1BLQ1M3ICpTTUlNRV9yZWFkX1BLQ1M3KEJJTyAqYmlvLCBCSU8gKipiY29udCk7CisKK0JJTyAqQklPX25ld19QS0NTNyhCSU8gKm91dCwgUEtDUzcgKnA3KTsKKworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1BLQ1M3X3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgUEtDUzcgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgUEtDUzdfRl9CNjRfUkVBRF9QS0NTNwkJCQkgMTIwCisjZGVmaW5lIFBLQ1M3X0ZfQjY0X1dSSVRFX1BLQ1M3CQkJCSAxMjEKKyNkZWZpbmUgUEtDUzdfRl9ET19QS0NTN19TSUdORURfQVRUUklCCQkJIDEzNgorI2RlZmluZSBQS0NTN19GX0kyRF9QS0NTN19CSU9fU1RSRUFNCQkJIDE0MAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0FERDBfQVRUUklCX1NJR05JTkdfVElNRQkJIDEzNQorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0FERF9BVFRSSUJfU01JTUVDQVAJCSAxMTgKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19BRERfQ0VSVElGSUNBVEUJCQkgMTAwCisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfQUREX0NSTAkJCQkgMTAxCisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfQUREX1JFQ0lQSUVOVF9JTkZPCQkgMTAyCisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfQUREX1NJR05BVFVSRQkJCSAxMzEKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19BRERfU0lHTkVSCQkJIDEwMworI2RlZmluZSBQS0NTN19GX1BLQ1M3X0JJT19BRERfRElHRVNUCQkJIDEyNQorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0NPUFlfRVhJU1RJTkdfRElHRVNUCQkgMTM4CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfQ1RSTAkJCQkgMTA0CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfREFUQURFQ09ERQkJCSAxMTIKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19EQVRBRklOQUwJCQkJIDEyOAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X0RBVEFJTklUCQkJCSAxMDUKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19EQVRBU0lHTgkJCQkgMTA2CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfREFUQVZFUklGWQkJCSAxMDcKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19ERUNSWVBUCQkJCSAxMTQKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19ERUNSWVBUX1JJTkZPCQkJIDEzMworI2RlZmluZSBQS0NTN19GX1BLQ1M3X0VOQ09ERV9SSU5GTwkJCSAxMzIKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19FTkNSWVBUCQkJCSAxMTUKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19GSU5BTAkJCQkgMTM0CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfRklORF9ESUdFU1QJCQkgMTI3CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfR0VUMF9TSUdORVJTCQkJIDEyNAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X1JFQ0lQX0lORk9fU0VUCQkJIDEzMAorI2RlZmluZSBQS0NTN19GX1BLQ1M3X1NFVF9DSVBIRVIJCQkgMTA4CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfU0VUX0NPTlRFTlQJCQkgMTA5CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfU0VUX0RJR0VTVAkJCSAxMjYKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19TRVRfVFlQRQkJCQkgMTEwCisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfU0lHTgkJCQkgMTE2CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfU0lHTkFUVVJFVkVSSUZZCQkJIDExMworI2RlZmluZSBQS0NTN19GX1BLQ1M3X1NJR05FUl9JTkZPX1NFVAkJCSAxMjkKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19TSUdORVJfSU5GT19TSUdOCQkJIDEzOQorI2RlZmluZSBQS0NTN19GX1BLQ1M3X1NJR05fQUREX1NJR05FUgkJCSAxMzcKKyNkZWZpbmUgUEtDUzdfRl9QS0NTN19TSU1QTEVfU01JTUVDQVAJCQkgMTE5CisjZGVmaW5lIFBLQ1M3X0ZfUEtDUzdfVkVSSUZZCQkJCSAxMTcKKyNkZWZpbmUgUEtDUzdfRl9TTUlNRV9SRUFEX1BLQ1M3CQkJIDEyMgorI2RlZmluZSBQS0NTN19GX1NNSU1FX1RFWFQJCQkJIDEyMworCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIFBLQ1M3X1JfQ0VSVElGSUNBVEVfVkVSSUZZX0VSUk9SCQkgMTE3CisjZGVmaW5lIFBLQ1M3X1JfQ0lQSEVSX0hBU19OT19PQkpFQ1RfSURFTlRJRklFUgkJIDE0NAorI2RlZmluZSBQS0NTN19SX0NJUEhFUl9OT1RfSU5JVElBTElaRUQJCQkgMTE2CisjZGVmaW5lIFBLQ1M3X1JfQ09OVEVOVF9BTkRfREFUQV9QUkVTRU5UCQkgMTE4CisjZGVmaW5lIFBLQ1M3X1JfQ1RSTF9FUlJPUgkJCQkgMTUyCisjZGVmaW5lIFBLQ1M3X1JfREVDT0RFX0VSUk9SCQkJCSAxMzAKKyNkZWZpbmUgUEtDUzdfUl9ERUNSWVBURURfS0VZX0lTX1dST05HX0xFTkdUSAkJIDEwMAorI2RlZmluZSBQS0NTN19SX0RFQ1JZUFRfRVJST1IJCQkJIDExOQorI2RlZmluZSBQS0NTN19SX0RJR0VTVF9GQUlMVVJFCQkJCSAxMDEKKyNkZWZpbmUgUEtDUzdfUl9FTkNSWVBUSU9OX0NUUkxfRkFJTFVSRQkJCSAxNDkKKyNkZWZpbmUgUEtDUzdfUl9FTkNSWVBUSU9OX05PVF9TVVBQT1JURURfRk9SX1RISVNfS0VZX1RZUEUgMTUwCisjZGVmaW5lIFBLQ1M3X1JfRVJST1JfQURESU5HX1JFQ0lQSUVOVAkJCSAxMjAKKyNkZWZpbmUgUEtDUzdfUl9FUlJPUl9TRVRUSU5HX0NJUEhFUgkJCSAxMjEKKyNkZWZpbmUgUEtDUzdfUl9JTlZBTElEX01JTUVfVFlQRQkJCSAxMzEKKyNkZWZpbmUgUEtDUzdfUl9JTlZBTElEX05VTExfUE9JTlRFUgkJCSAxNDMKKyNkZWZpbmUgUEtDUzdfUl9NSU1FX05PX0NPTlRFTlRfVFlQRQkJCSAxMzIKKyNkZWZpbmUgUEtDUzdfUl9NSU1FX1BBUlNFX0VSUk9SCQkJIDEzMworI2RlZmluZSBQS0NTN19SX01JTUVfU0lHX1BBUlNFX0VSUk9SCQkJIDEzNAorI2RlZmluZSBQS0NTN19SX01JU1NJTkdfQ0VSSVBFTkRfSU5GTwkJCSAxMDMKKyNkZWZpbmUgUEtDUzdfUl9OT19DT05URU5UCQkJCSAxMjIKKyNkZWZpbmUgUEtDUzdfUl9OT19DT05URU5UX1RZUEUJCQkJIDEzNQorI2RlZmluZSBQS0NTN19SX05PX0RFRkFVTFRfRElHRVNUCQkJIDE1MQorI2RlZmluZSBQS0NTN19SX05PX01BVENISU5HX0RJR0VTVF9UWVBFX0ZPVU5ECQkgMTU0CisjZGVmaW5lIFBLQ1M3X1JfTk9fTVVMVElQQVJUX0JPRFlfRkFJTFVSRQkJIDEzNgorI2RlZmluZSBQS0NTN19SX05PX01VTFRJUEFSVF9CT1VOREFSWQkJCSAxMzcKKyNkZWZpbmUgUEtDUzdfUl9OT19SRUNJUElFTlRfTUFUQ0hFU19DRVJUSUZJQ0FURQkgMTE1CisjZGVmaW5lIFBLQ1M3X1JfTk9fUkVDSVBJRU5UX01BVENIRVNfS0VZCQkgMTQ2CisjZGVmaW5lIFBLQ1M3X1JfTk9fU0lHTkFUVVJFU19PTl9EQVRBCQkJIDEyMworI2RlZmluZSBQS0NTN19SX05PX1NJR05FUlMJCQkJIDE0MgorI2RlZmluZSBQS0NTN19SX05PX1NJR19DT05URU5UX1RZUEUJCQkgMTM4CisjZGVmaW5lIFBLQ1M3X1JfT1BFUkFUSU9OX05PVF9TVVBQT1JURURfT05fVEhJU19UWVBFCSAxMDQKKyNkZWZpbmUgUEtDUzdfUl9QS0NTN19BRERfU0lHTkFUVVJFX0VSUk9SCQkgMTI0CisjZGVmaW5lIFBLQ1M3X1JfUEtDUzdfQUREX1NJR05FUl9FUlJPUgkJCSAxNTMKKyNkZWZpbmUgUEtDUzdfUl9QS0NTN19EQVRBRklOQUwJCQkJIDEyNgorI2RlZmluZSBQS0NTN19SX1BLQ1M3X0RBVEFGSU5BTF9FUlJPUgkJCSAxMjUKKyNkZWZpbmUgUEtDUzdfUl9QS0NTN19EQVRBU0lHTgkJCQkgMTQ1CisjZGVmaW5lIFBLQ1M3X1JfUEtDUzdfUEFSU0VfRVJST1IJCQkgMTM5CisjZGVmaW5lIFBLQ1M3X1JfUEtDUzdfU0lHX1BBUlNFX0VSUk9SCQkJIDE0MAorI2RlZmluZSBQS0NTN19SX1BSSVZBVEVfS0VZX0RPRVNfTk9UX01BVENIX0NFUlRJRklDQVRFCSAxMjcKKyNkZWZpbmUgUEtDUzdfUl9TSUdOQVRVUkVfRkFJTFVSRQkJCSAxMDUKKyNkZWZpbmUgUEtDUzdfUl9TSUdORVJfQ0VSVElGSUNBVEVfTk9UX0ZPVU5ECQkgMTI4CisjZGVmaW5lIFBLQ1M3X1JfU0lHTklOR19DVFJMX0ZBSUxVUkUJCQkgMTQ3CisjZGVmaW5lIFBLQ1M3X1JfU0lHTklOR19OT1RfU1VQUE9SVEVEX0ZPUl9USElTX0tFWV9UWVBFCSAxNDgKKyNkZWZpbmUgUEtDUzdfUl9TSUdfSU5WQUxJRF9NSU1FX1RZUEUJCQkgMTQxCisjZGVmaW5lIFBLQ1M3X1JfU01JTUVfVEVYVF9FUlJPUgkJCSAxMjkKKyNkZWZpbmUgUEtDUzdfUl9VTkFCTEVfVE9fRklORF9DRVJUSUZJQ0FURQkJIDEwNgorI2RlZmluZSBQS0NTN19SX1VOQUJMRV9UT19GSU5EX01FTV9CSU8JCQkgMTA3CisjZGVmaW5lIFBLQ1M3X1JfVU5BQkxFX1RPX0ZJTkRfTUVTU0FHRV9ESUdFU1QJCSAxMDgKKyNkZWZpbmUgUEtDUzdfUl9VTktOT1dOX0RJR0VTVF9UWVBFCQkJIDEwOQorI2RlZmluZSBQS0NTN19SX1VOS05PV05fT1BFUkFUSU9OCQkJIDExMAorI2RlZmluZSBQS0NTN19SX1VOU1VQUE9SVEVEX0NJUEhFUl9UWVBFCQkJIDExMQorI2RlZmluZSBQS0NTN19SX1VOU1VQUE9SVEVEX0NPTlRFTlRfVFlQRQkJIDExMgorI2RlZmluZSBQS0NTN19SX1dST05HX0NPTlRFTlRfVFlQRQkJCSAxMTMKKyNkZWZpbmUgUEtDUzdfUl9XUk9OR19QS0NTN19UWVBFCQkJIDExNAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmM5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmgKQEAgLTAsMCArMSw5NCBAQAorLyogY3J5cHRvL3BxdWV1ZS9wcXVldWUuaCAqLworLyogCisgKiBEVExTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgTmFnZW5kcmEgTW9kYWR1Z3UKKyAqIChuYWdlbmRyYUBjcy5zdGFuZm9yZC5lZHUpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0IDIwMDUuICAKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX1BRVUVVRV9ICisjZGVmaW5lIEhFQURFUl9QUVVFVUVfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiBzdHJ1Y3QgX3BxdWV1ZSAqcHF1ZXVlOworCit0eXBlZGVmIHN0cnVjdCBfcGl0ZW0KKwl7CisJdW5zaWduZWQgY2hhciBwcmlvcml0eVs4XTsgLyogNjQtYml0IHZhbHVlIGluIGJpZy1lbmRpYW4gZW5jb2RpbmcgKi8KKwl2b2lkICpkYXRhOworCXN0cnVjdCBfcGl0ZW0gKm5leHQ7CisJfSBwaXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgX3BpdGVtICpwaXRlcmF0b3I7CisKK3BpdGVtICpwaXRlbV9uZXcodW5zaWduZWQgY2hhciAqcHJpbzY0YmUsIHZvaWQgKmRhdGEpOwordm9pZCAgIHBpdGVtX2ZyZWUocGl0ZW0gKml0ZW0pOworCitwcXVldWUgcHF1ZXVlX25ldyh2b2lkKTsKK3ZvaWQgICBwcXVldWVfZnJlZShwcXVldWUgcHEpOworCitwaXRlbSAqcHF1ZXVlX2luc2VydChwcXVldWUgcHEsIHBpdGVtICppdGVtKTsKK3BpdGVtICpwcXVldWVfcGVlayhwcXVldWUgcHEpOworcGl0ZW0gKnBxdWV1ZV9wb3AocHF1ZXVlIHBxKTsKK3BpdGVtICpwcXVldWVfZmluZChwcXVldWUgcHEsIHVuc2lnbmVkIGNoYXIgKnByaW82NGJlKTsKK3BpdGVtICpwcXVldWVfaXRlcmF0b3IocHF1ZXVlIHBxKTsKK3BpdGVtICpwcXVldWVfbmV4dChwaXRlcmF0b3IgKml0ZXIpOworCit2b2lkICAgcHF1ZXVlX3ByaW50KHBxdWV1ZSBwcSk7CitpbnQgICAgcHF1ZXVlX3NpemUocHF1ZXVlIHBxKTsKKworI2VuZGlmIC8qICEgSEVBREVSX1BRVUVVRV9IICovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcmFuZC5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3JhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZjMDIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3JhbmQuaApAQCAtMCwwICsxLDE0MCBAQAorLyogY3J5cHRvL3JhbmQvcmFuZC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1JBTkRfSAorI2RlZmluZSBIRUFERVJfUkFORF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29zc2xfdHlwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbmRpZgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChPUEVOU1NMX0ZJUFMpCisjZGVmaW5lIEZJUFNfUkFORF9TSVpFX1Qgc2l6ZV90CisjZW5kaWYKKworLyogQWxyZWFkeSBkZWZpbmVkIGluIG9zc2xfdHlwLmggKi8KKy8qIHR5cGVkZWYgc3RydWN0IHJhbmRfbWV0aF9zdCBSQU5EX01FVEhPRDsgKi8KKworc3RydWN0IHJhbmRfbWV0aF9zdAorCXsKKwl2b2lkICgqc2VlZCkoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtKTsKKwlpbnQgKCpieXRlcykodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtKTsKKwl2b2lkICgqY2xlYW51cCkodm9pZCk7CisJdm9pZCAoKmFkZCkoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbnVtLCBkb3VibGUgZW50cm9weSk7CisJaW50ICgqcHNldWRvcmFuZCkodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtKTsKKwlpbnQgKCpzdGF0dXMpKHZvaWQpOworCX07CisKKyNpZmRlZiBCTl9ERUJVRworZXh0ZXJuIGludCByYW5kX3ByZWRpY3RhYmxlOworI2VuZGlmCisKK2ludCBSQU5EX3NldF9yYW5kX21ldGhvZChjb25zdCBSQU5EX01FVEhPRCAqbWV0aCk7Citjb25zdCBSQU5EX01FVEhPRCAqUkFORF9nZXRfcmFuZF9tZXRob2Qodm9pZCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCitpbnQgUkFORF9zZXRfcmFuZF9lbmdpbmUoRU5HSU5FICplbmdpbmUpOworI2VuZGlmCitSQU5EX01FVEhPRCAqUkFORF9TU0xlYXkodm9pZCk7Cit2b2lkIFJBTkRfY2xlYW51cCh2b2lkICk7CitpbnQgIFJBTkRfYnl0ZXModW5zaWduZWQgY2hhciAqYnVmLGludCBudW0pOworaW50ICBSQU5EX3BzZXVkb19ieXRlcyh1bnNpZ25lZCBjaGFyICpidWYsaW50IG51bSk7Cit2b2lkIFJBTkRfc2VlZChjb25zdCB2b2lkICpidWYsaW50IG51bSk7Cit2b2lkIFJBTkRfYWRkKGNvbnN0IHZvaWQgKmJ1ZixpbnQgbnVtLGRvdWJsZSBlbnRyb3B5KTsKK2ludCAgUkFORF9sb2FkX2ZpbGUoY29uc3QgY2hhciAqZmlsZSxsb25nIG1heF9ieXRlcyk7CitpbnQgIFJBTkRfd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlKTsKK2NvbnN0IGNoYXIgKlJBTkRfZmlsZV9uYW1lKGNoYXIgKmZpbGUsc2l6ZV90IG51bSk7CitpbnQgUkFORF9zdGF0dXModm9pZCk7CitpbnQgUkFORF9xdWVyeV9lZ2RfYnl0ZXMoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnl0ZXMpOworaW50IFJBTkRfZWdkKGNvbnN0IGNoYXIgKnBhdGgpOworaW50IFJBTkRfZWdkX2J5dGVzKGNvbnN0IGNoYXIgKnBhdGgsaW50IGJ5dGVzKTsKK2ludCBSQU5EX3BvbGwodm9pZCk7CisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpCisKK3ZvaWQgUkFORF9zY3JlZW4odm9pZCk7CitpbnQgUkFORF9ldmVudChVSU5ULCBXUEFSQU0sIExQQVJBTSk7CisKKyNlbmRpZgorCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1JBTkRfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBSQU5EIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFJBTkRfRl9SQU5EX0dFVF9SQU5EX01FVEhPRAkJCSAxMDEKKyNkZWZpbmUgUkFORF9GX1NTTEVBWV9SQU5EX0JZVEVTCQkJIDEwMAorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIFJBTkRfUl9QUk5HX05PVF9TRUVERUQJCQkJIDEwMAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3JjMi5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3JjMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzgzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcmMyLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qIGNyeXB0by9yYzIvcmMyLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfUkMyX0gKKyNkZWZpbmUgSEVBREVSX1JDMl9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+IC8qIE9QRU5TU0xfTk9fUkMyLCBSQzJfSU5UICovCisjaWZkZWYgT1BFTlNTTF9OT19SQzIKKyNlcnJvciBSQzIgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2RlZmluZSBSQzJfRU5DUllQVAkxCisjZGVmaW5lIFJDMl9ERUNSWVBUCTAKKworI2RlZmluZSBSQzJfQkxPQ0sJOAorI2RlZmluZSBSQzJfS0VZX0xFTkdUSAkxNgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCByYzJfa2V5X3N0CisJeworCVJDMl9JTlQgZGF0YVs2NF07CisJfSBSQzJfS0VZOworCisgCit2b2lkIFJDMl9zZXRfa2V5KFJDMl9LRVkgKmtleSwgaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSxpbnQgYml0cyk7Cit2b2lkIFJDMl9lY2JfZW5jcnlwdChjb25zdCB1bnNpZ25lZCBjaGFyICppbix1bnNpZ25lZCBjaGFyICpvdXQsUkMyX0tFWSAqa2V5LAorCQkgICAgIGludCBlbmMpOwordm9pZCBSQzJfZW5jcnlwdCh1bnNpZ25lZCBsb25nICpkYXRhLFJDMl9LRVkgKmtleSk7Cit2b2lkIFJDMl9kZWNyeXB0KHVuc2lnbmVkIGxvbmcgKmRhdGEsUkMyX0tFWSAqa2V5KTsKK3ZvaWQgUkMyX2NiY19lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgbGVuZ3RoLAorCVJDMl9LRVkgKmtzLCB1bnNpZ25lZCBjaGFyICppdiwgaW50IGVuYyk7Cit2b2lkIFJDMl9jZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgICBsb25nIGxlbmd0aCwgUkMyX0tFWSAqc2NoZWR1bGUsIHVuc2lnbmVkIGNoYXIgKml2ZWMsCisJCSAgICAgICBpbnQgKm51bSwgaW50IGVuYyk7Cit2b2lkIFJDMl9vZmI2NF9lbmNyeXB0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQsCisJCSAgICAgICBsb25nIGxlbmd0aCwgUkMyX0tFWSAqc2NoZWR1bGUsIHVuc2lnbmVkIGNoYXIgKml2ZWMsCisJCSAgICAgICBpbnQgKm51bSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9yYzQuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9yYzQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQxYWNjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9yYzQuaApAQCAtMCwwICsxLDg5IEBACisvKiBjcnlwdG8vcmM0L3JjNC5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1JDNF9ICisjZGVmaW5lIEhFQURFUl9SQzRfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPiAvKiBPUEVOU1NMX05PX1JDNCwgUkM0X0lOVCAqLworI2lmZGVmIE9QRU5TU0xfTk9fUkM0CisjZXJyb3IgUkM0IGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgcmM0X2tleV9zdAorCXsKKwlSQzRfSU5UIHgseTsKKwlSQzRfSU5UIGRhdGFbMjU2XTsKKwl9IFJDNF9LRVk7CisKKyAKK2NvbnN0IGNoYXIgKlJDNF9vcHRpb25zKHZvaWQpOwordm9pZCBSQzRfc2V0X2tleShSQzRfS0VZICprZXksIGludCBsZW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpOwordm9pZCBSQzQoUkM0X0tFWSAqa2V5LCBzaXplX3QgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICppbmRhdGEsCisJCXVuc2lnbmVkIGNoYXIgKm91dGRhdGEpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcmlwZW1kLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcmlwZW1kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0MmViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9yaXBlbWQuaApAQCAtMCwwICsxLDEwNCBAQAorLyogY3J5cHRvL3JpcGVtZC9yaXBlbWQuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9SSVBFTURfSAorI2RlZmluZSBIRUFERVJfUklQRU1EX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfTk9fUklQRU1ECisjZXJyb3IgUklQRU1EIGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTFAzMl9fKQorI2RlZmluZSBSSVBFTUQxNjBfTE9ORyB1bnNpZ25lZCBsb25nCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0NSQVkpIHx8IGRlZmluZWQoX19JTFA2NF9fKQorI2RlZmluZSBSSVBFTUQxNjBfTE9ORyB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFJJUEVNRDE2MF9MT05HX0xPRzIgMworI2Vsc2UKKyNkZWZpbmUgUklQRU1EMTYwX0xPTkcgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSBSSVBFTUQxNjBfQ0JMT0NLCTY0CisjZGVmaW5lIFJJUEVNRDE2MF9MQkxPQ0sJKFJJUEVNRDE2MF9DQkxPQ0svNCkKKyNkZWZpbmUgUklQRU1EMTYwX0RJR0VTVF9MRU5HVEgJMjAKKwordHlwZWRlZiBzdHJ1Y3QgUklQRU1EMTYwc3RhdGVfc3QKKwl7CisJUklQRU1EMTYwX0xPTkcgQSxCLEMsRCxFOworCVJJUEVNRDE2MF9MT05HIE5sLE5oOworCVJJUEVNRDE2MF9MT05HIGRhdGFbUklQRU1EMTYwX0xCTE9DS107CisJdW5zaWduZWQgaW50ICAgbnVtOworCX0gUklQRU1EMTYwX0NUWDsKKworaW50IFJJUEVNRDE2MF9Jbml0KFJJUEVNRDE2MF9DVFggKmMpOworaW50IFJJUEVNRDE2MF9VcGRhdGUoUklQRU1EMTYwX0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgUklQRU1EMTYwX0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBSSVBFTUQxNjBfQ1RYICpjKTsKK3Vuc2lnbmVkIGNoYXIgKlJJUEVNRDE2MChjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwKKwl1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIFJJUEVNRDE2MF9UcmFuc2Zvcm0oUklQRU1EMTYwX0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqYik7CisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcnNhLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvcnNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3NDM0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9yc2EuaApAQCAtMCwwICsxLDUwMyBAQAorLyogY3J5cHRvL3JzYS9yc2EuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9SU0FfSAorI2RlZmluZSBIRUFERVJfUlNBX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvYXNuMS5oPgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfTk9fUlNBCisjZXJyb3IgUlNBIGlzIGRpc2FibGVkLgorI2VuZGlmCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIERlY2xhcmVkIGFscmVhZHkgaW4gb3NzbF90eXAuaCAqLworLyogdHlwZWRlZiBzdHJ1Y3QgcnNhX3N0IFJTQTsgKi8KKy8qIHR5cGVkZWYgc3RydWN0IHJzYV9tZXRoX3N0IFJTQV9NRVRIT0Q7ICovCisKK3N0cnVjdCByc2FfbWV0aF9zdAorCXsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnJzYV9wdWJfZW5jKShpbnQgZmxlbixjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCQkJICAgdW5zaWduZWQgY2hhciAqdG8sCisJCQkgICBSU0EgKnJzYSxpbnQgcGFkZGluZyk7CisJaW50ICgqcnNhX3B1Yl9kZWMpKGludCBmbGVuLGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sCisJCQkgICB1bnNpZ25lZCBjaGFyICp0bywKKwkJCSAgIFJTQSAqcnNhLGludCBwYWRkaW5nKTsKKwlpbnQgKCpyc2FfcHJpdl9lbmMpKGludCBmbGVuLGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZyb20sCisJCQkgICAgdW5zaWduZWQgY2hhciAqdG8sCisJCQkgICAgUlNBICpyc2EsaW50IHBhZGRpbmcpOworCWludCAoKnJzYV9wcml2X2RlYykoaW50IGZsZW4sY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkJCSAgICB1bnNpZ25lZCBjaGFyICp0bywKKwkJCSAgICBSU0EgKnJzYSxpbnQgcGFkZGluZyk7CisJaW50ICgqcnNhX21vZF9leHApKEJJR05VTSAqcjAsY29uc3QgQklHTlVNICpJLFJTQSAqcnNhLEJOX0NUWCAqY3R4KTsgLyogQ2FuIGJlIG51bGwgKi8KKwlpbnQgKCpibl9tb2RfZXhwKShCSUdOVU0gKnIsIGNvbnN0IEJJR05VTSAqYSwgY29uc3QgQklHTlVNICpwLAorCQkJICBjb25zdCBCSUdOVU0gKm0sIEJOX0NUWCAqY3R4LAorCQkJICBCTl9NT05UX0NUWCAqbV9jdHgpOyAvKiBDYW4gYmUgbnVsbCAqLworCWludCAoKmluaXQpKFJTQSAqcnNhKTsJCS8qIGNhbGxlZCBhdCBuZXcgKi8KKwlpbnQgKCpmaW5pc2gpKFJTQSAqcnNhKTsJLyogY2FsbGVkIGF0IGZyZWUgKi8KKwlpbnQgZmxhZ3M7CQkJLyogUlNBX01FVEhPRF9GTEFHXyogdGhpbmdzICovCisJY2hhciAqYXBwX2RhdGE7CQkJLyogbWF5IGJlIG5lZWRlZCEgKi8KKy8qIE5ldyBzaWduIGFuZCB2ZXJpZnkgZnVuY3Rpb25zOiBzb21lIGxpYnJhcmllcyBkb24ndCBhbGxvdyBhcmJpdHJhcnkgZGF0YQorICogdG8gYmUgc2lnbmVkL3ZlcmlmaWVkOiB0aGlzIGFsbG93cyB0aGVtIHRvIGJlIHVzZWQuIE5vdGU6IGZvciB0aGlzIHRvIHdvcmsKKyAqIHRoZSBSU0FfcHVibGljX2RlY3J5cHQoKSBhbmQgUlNBX3ByaXZhdGVfZW5jcnlwdCgpIHNob3VsZCAqTk9UKiBiZSB1c2VkCisgKiBSU0Ffc2lnbigpLCBSU0FfdmVyaWZ5KCkgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4gTm90ZTogZm9yIGJhY2t3YXJkcworICogY29tcGF0aWJpbGl0eSB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSU0FfRkxBR19TSUdOX1ZFUgorICogb3B0aW9uIGlzIHNldCBpbiAnZmxhZ3MnLgorICovCisJaW50ICgqcnNhX3NpZ24pKGludCB0eXBlLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICptLCB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsCisJCXVuc2lnbmVkIGNoYXIgKnNpZ3JldCwgdW5zaWduZWQgaW50ICpzaWdsZW4sIGNvbnN0IFJTQSAqcnNhKTsKKwlpbnQgKCpyc2FfdmVyaWZ5KShpbnQgZHR5cGUsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm0sIHVuc2lnbmVkIGludCBtX2xlbmd0aCwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLCB1bnNpZ25lZCBpbnQgc2lnbGVuLAorCQkJCQkJCQljb25zdCBSU0EgKnJzYSk7CisvKiBJZiB0aGlzIGNhbGxiYWNrIGlzIE5VTEwsIHRoZSBidWlsdGluIHNvZnR3YXJlIFJTQSBrZXktZ2VuIHdpbGwgYmUgdXNlZC4gVGhpcworICogaXMgZm9yIGJlaGF2aW91cmFsIGNvbXBhdGliaWxpdHkgd2hpbHN0IHRoZSBjb2RlIGdldHMgcmV3aXJlZCwgYnV0IG9uZSBkYXkKKyAqIGl0IHdvdWxkIGJlIG5pY2UgdG8gYXNzdW1lIHRoZXJlIGFyZSBubyBzdWNoIHRoaW5ncyBhcyAiYnVpbHRpbiBzb2Z0d2FyZSIKKyAqIGltcGxlbWVudGF0aW9ucy4gKi8KKwlpbnQgKCpyc2Ffa2V5Z2VuKShSU0EgKnJzYSwgaW50IGJpdHMsIEJJR05VTSAqZSwgQk5fR0VOQ0IgKmNiKTsKKwl9OworCitzdHJ1Y3QgcnNhX3N0CisJeworCS8qIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdXNlZCB0byBwaWNrdXAgZXJyb3JzIHdoZXJlCisJICogdGhpcyBpcyBwYXNzZWQgaW5zdGVhZCBvZiBhRVZQX1BLRVksIGl0IGlzIHNldCB0byAwICovCisJaW50IHBhZDsKKwlsb25nIHZlcnNpb247CisJY29uc3QgUlNBX01FVEhPRCAqbWV0aDsKKwkvKiBmdW5jdGlvbmFsIHJlZmVyZW5jZSBpZiAnbWV0aCcgaXMgRU5HSU5FLXByb3ZpZGVkICovCisJRU5HSU5FICplbmdpbmU7CisJQklHTlVNICpuOworCUJJR05VTSAqZTsKKwlCSUdOVU0gKmQ7CisJQklHTlVNICpwOworCUJJR05VTSAqcTsKKwlCSUdOVU0gKmRtcDE7CisJQklHTlVNICpkbXExOworCUJJR05VTSAqaXFtcDsKKwkvKiBiZSBjYXJlZnVsIHVzaW5nIHRoaXMgaWYgdGhlIFJTQSBzdHJ1Y3R1cmUgaXMgc2hhcmVkICovCisJQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKwlpbnQgcmVmZXJlbmNlczsKKwlpbnQgZmxhZ3M7CisKKwkvKiBVc2VkIHRvIGNhY2hlIG1vbnRnb21lcnkgdmFsdWVzICovCisJQk5fTU9OVF9DVFggKl9tZXRob2RfbW9kX247CisJQk5fTU9OVF9DVFggKl9tZXRob2RfbW9kX3A7CisJQk5fTU9OVF9DVFggKl9tZXRob2RfbW9kX3E7CisKKwkvKiBhbGwgQklHTlVNIHZhbHVlcyBhcmUgYWN0dWFsbHkgaW4gdGhlIGZvbGxvd2luZyBkYXRhLCBpZiBpdCBpcyBub3QKKwkgKiBOVUxMICovCisJY2hhciAqYmlnbnVtX2RhdGE7CisJQk5fQkxJTkRJTkcgKmJsaW5kaW5nOworCUJOX0JMSU5ESU5HICptdF9ibGluZGluZzsKKwl9OworCisjaWZuZGVmIE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFMKKyMgZGVmaW5lIE9QRU5TU0xfUlNBX01BWF9NT0RVTFVTX0JJVFMJMTYzODQKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfUlNBX1NNQUxMX01PRFVMVVNfQklUUworIyBkZWZpbmUgT1BFTlNTTF9SU0FfU01BTExfTU9EVUxVU19CSVRTCTMwNzIKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX1JTQV9NQVhfUFVCRVhQX0JJVFMKKyMgZGVmaW5lIE9QRU5TU0xfUlNBX01BWF9QVUJFWFBfQklUUwk2NCAvKiBleHBvbmVudCBsaW1pdCBlbmZvcmNlZCBmb3IgImxhcmdlIiBtb2R1bHVzIG9ubHkgKi8KKyNlbmRpZgorCisjZGVmaW5lIFJTQV8zCTB4M0wKKyNkZWZpbmUgUlNBX0Y0CTB4MTAwMDFMCisKKyNkZWZpbmUgUlNBX01FVEhPRF9GTEFHX05PX0NIRUNLCTB4MDAwMSAvKiBkb24ndCBjaGVjayBwdWIvcHJpdmF0ZSBtYXRjaCAqLworCisjZGVmaW5lIFJTQV9GTEFHX0NBQ0hFX1BVQkxJQwkJMHgwMDAyCisjZGVmaW5lIFJTQV9GTEFHX0NBQ0hFX1BSSVZBVEUJCTB4MDAwNAorI2RlZmluZSBSU0FfRkxBR19CTElORElORwkJMHgwMDA4CisjZGVmaW5lIFJTQV9GTEFHX1RIUkVBRF9TQUZFCQkweDAwMTAKKy8qIFRoaXMgZmxhZyBtZWFucyB0aGUgcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucyB3aWxsIGJlIGhhbmRsZWQgYnkgcnNhX21vZF9leHAKKyAqIGFuZCB0aGF0IHRoZXkgZG8gbm90IGRlcGVuZCBvbiB0aGUgcHJpdmF0ZSBrZXkgY29tcG9uZW50cyBiZWluZyBwcmVzZW50OgorICogZm9yIGV4YW1wbGUgYSBrZXkgc3RvcmVkIGluIGV4dGVybmFsIGhhcmR3YXJlLiBXaXRob3V0IHRoaXMgZmxhZyBibl9tb2RfZXhwCisgKiBnZXRzIGNhbGxlZCB3aGVuIHByaXZhdGUga2V5IGNvbXBvbmVudHMgYXJlIGFic2VudC4KKyAqLworI2RlZmluZSBSU0FfRkxBR19FWFRfUEtFWQkJMHgwMDIwCisKKy8qIFRoaXMgZmxhZyBpbiB0aGUgUlNBX01FVEhPRCBlbmFibGVzIHRoZSBuZXcgcnNhX3NpZ24sIHJzYV92ZXJpZnkgZnVuY3Rpb25zLgorICovCisjZGVmaW5lIFJTQV9GTEFHX1NJR05fVkVSCQkweDAwNDAKKworI2RlZmluZSBSU0FfRkxBR19OT19CTElORElORwkJMHgwMDgwIC8qIG5ldyB3aXRoIDAuOS42aiBhbmQgMC45LjdiOyB0aGUgYnVpbHQtaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogUlNBIGltcGxlbWVudGF0aW9uIG5vdyB1c2VzIGJsaW5kaW5nIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlZmF1bHQgKGlnbm9yaW5nIFJTQV9GTEFHX0JMSU5ESU5HKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYnV0IG90aGVyIGVuZ2luZXMgbWlnaHQgbm90IG5lZWQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJTQV9GTEFHX05PX0NPTlNUVElNRQkJMHgwMTAwIC8qIG5ldyB3aXRoIDAuOS44ZjsgdGhlIGJ1aWx0LWluIFJTQQorCQkJCQkJKiBpbXBsZW1lbnRhdGlvbiBub3cgdXNlcyBjb25zdGFudCB0aW1lCisJCQkJCQkqIG9wZXJhdGlvbnMgYnkgZGVmYXVsdCBpbiBwcml2YXRlIGtleSBvcGVyYXRpb25zLAorCQkJCQkJKiBlLmcuLCBjb25zdGFudCB0aW1lIG1vZHVsYXIgZXhwb25lbnRpYXRpb24sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtb2R1bGFyIGludmVyc2Ugd2l0aG91dCBsZWFraW5nIGJyYW5jaGVzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZGl2aXNpb24gd2l0aG91dCBsZWFraW5nIGJyYW5jaGVzLiBUaGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBmbGFnIGRpc2FibGVzIHRoZXNlIGNvbnN0YW50IHRpbWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9wZXJhdGlvbnMgYW5kIHJlc3VsdHMgaW4gZmFzdGVyIFJTQSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAorI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKKyNkZWZpbmUgUlNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSBSU0FfRkxBR19OT19DT05TVFRJTUUgLyogZGVwcmVjYXRlZCBuYW1lIGZvciB0aGUgZmxhZyovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXcgd2l0aCAwLjkuN2g7IHRoZSBidWlsdC1pbiBSU0EKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW1wbGVtZW50YXRpb24gbm93IHVzZXMgY29uc3RhbnQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBtb2R1bGFyIGV4cG9uZW50aWF0aW9uIGZvciBzZWNyZXQgZXhwb25lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ5IGRlZmF1bHQuIFRoaXMgZmxhZyBjYXVzZXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZhc3RlciB2YXJpYWJsZSBzbGlkaW5nIHdpbmRvdyBtZXRob2QgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgdXNlZCBmb3IgYWxsIGV4cG9uZW50cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZW5kaWYKKworCisjZGVmaW5lIEVWUF9QS0VZX0NUWF9zZXRfcnNhX3BhZGRpbmcoY3R4LCBwYWQpIFwKKwlFVlBfUEtFWV9DVFhfY3RybChjdHgsIEVWUF9QS0VZX1JTQSwgLTEsIEVWUF9QS0VZX0NUUkxfUlNBX1BBRERJTkcsIFwKKwkJCQlwYWQsIE5VTEwpCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RYX3NldF9yc2FfcHNzX3NhbHRsZW4oY3R4LCBsZW4pIFwKKwlFVlBfUEtFWV9DVFhfY3RybChjdHgsIEVWUF9QS0VZX1JTQSwgXAorCQkJCShFVlBfUEtFWV9PUF9TSUdOfEVWUF9QS0VZX09QX1ZFUklGWSksIFwKKwkJCQlFVlBfUEtFWV9DVFJMX1JTQV9QU1NfU0FMVExFTiwgXAorCQkJCWxlbiwgTlVMTCkKKworI2RlZmluZSBFVlBfUEtFWV9DVFhfc2V0X3JzYV9rZXlnZW5fYml0cyhjdHgsIGJpdHMpIFwKKwlFVlBfUEtFWV9DVFhfY3RybChjdHgsIEVWUF9QS0VZX1JTQSwgRVZQX1BLRVlfT1BfS0VZR0VOLCBcCisJCQkJRVZQX1BLRVlfQ1RSTF9SU0FfS0VZR0VOX0JJVFMsIGJpdHMsIE5VTEwpCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RYX3NldF9yc2Ffa2V5Z2VuX3B1YmV4cChjdHgsIHB1YmV4cCkgXAorCUVWUF9QS0VZX0NUWF9jdHJsKGN0eCwgRVZQX1BLRVlfUlNBLCBFVlBfUEtFWV9PUF9LRVlHRU4sIFwKKwkJCQlFVlBfUEtFWV9DVFJMX1JTQV9LRVlHRU5fUFVCRVhQLCAwLCBwdWJleHApCisKKyNkZWZpbmUgRVZQX1BLRVlfQ1RSTF9SU0FfUEFERElORwkoRVZQX1BLRVlfQUxHX0NUUkwgKyAxKQorI2RlZmluZSBFVlBfUEtFWV9DVFJMX1JTQV9QU1NfU0FMVExFTgkoRVZQX1BLRVlfQUxHX0NUUkwgKyAyKQorCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfUlNBX0tFWUdFTl9CSVRTCShFVlBfUEtFWV9BTEdfQ1RSTCArIDMpCisjZGVmaW5lIEVWUF9QS0VZX0NUUkxfUlNBX0tFWUdFTl9QVUJFWFAJKEVWUF9QS0VZX0FMR19DVFJMICsgNCkKKworI2RlZmluZSBSU0FfUEtDUzFfUEFERElORwkxCisjZGVmaW5lIFJTQV9TU0xWMjNfUEFERElORwkyCisjZGVmaW5lIFJTQV9OT19QQURESU5HCQkzCisjZGVmaW5lIFJTQV9QS0NTMV9PQUVQX1BBRERJTkcJNAorI2RlZmluZSBSU0FfWDkzMV9QQURESU5HCTUKKy8qIEVWUF9QS0VZXyBvbmx5ICovCisjZGVmaW5lIFJTQV9QS0NTMV9QU1NfUEFERElORwk2CisKKyNkZWZpbmUgUlNBX1BLQ1MxX1BBRERJTkdfU0laRQkxMQorCisjZGVmaW5lIFJTQV9zZXRfYXBwX2RhdGEocyxhcmcpICAgICAgICAgUlNBX3NldF9leF9kYXRhKHMsMCxhcmcpCisjZGVmaW5lIFJTQV9nZXRfYXBwX2RhdGEocykgICAgICAgICAgICAgUlNBX2dldF9leF9kYXRhKHMsMCkKKworUlNBICoJUlNBX25ldyh2b2lkKTsKK1JTQSAqCVJTQV9uZXdfbWV0aG9kKEVOR0lORSAqZW5naW5lKTsKK2ludAlSU0Ffc2l6ZShjb25zdCBSU0EgKik7CisKKy8qIERlcHJlY2F0ZWQgdmVyc2lvbiAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RFUFJFQ0FURUQKK1JTQSAqCVJTQV9nZW5lcmF0ZV9rZXkoaW50IGJpdHMsIHVuc2lnbmVkIGxvbmcgZSx2b2lkCisJCSgqY2FsbGJhY2spKGludCxpbnQsdm9pZCAqKSx2b2lkICpjYl9hcmcpOworI2VuZGlmIC8qICFkZWZpbmVkKE9QRU5TU0xfTk9fREVQUkVDQVRFRCkgKi8KKworLyogTmV3IHZlcnNpb24gKi8KK2ludAlSU0FfZ2VuZXJhdGVfa2V5X2V4KFJTQSAqcnNhLCBpbnQgYml0cywgQklHTlVNICplLCBCTl9HRU5DQiAqY2IpOworCitpbnQJUlNBX2NoZWNrX2tleShjb25zdCBSU0EgKik7CisJLyogbmV4dCA0IHJldHVybiAtMSBvbiBlcnJvciAqLworaW50CVJTQV9wdWJsaWNfZW5jcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkJdW5zaWduZWQgY2hhciAqdG8sIFJTQSAqcnNhLGludCBwYWRkaW5nKTsKK2ludAlSU0FfcHJpdmF0ZV9lbmNyeXB0KGludCBmbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tLAorCQl1bnNpZ25lZCBjaGFyICp0bywgUlNBICpyc2EsaW50IHBhZGRpbmcpOworaW50CVJTQV9wdWJsaWNfZGVjcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgCisJCXVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSxpbnQgcGFkZGluZyk7CitpbnQJUlNBX3ByaXZhdGVfZGVjcnlwdChpbnQgZmxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgCisJCXVuc2lnbmVkIGNoYXIgKnRvLCBSU0EgKnJzYSxpbnQgcGFkZGluZyk7Cit2b2lkCVJTQV9mcmVlIChSU0EgKnIpOworLyogInVwIiB0aGUgUlNBIG9iamVjdCdzIHJlZmVyZW5jZSBjb3VudCAqLworaW50CVJTQV91cF9yZWYoUlNBICpyKTsKKworaW50CVJTQV9mbGFncyhjb25zdCBSU0EgKnIpOworCit2b2lkIFJTQV9zZXRfZGVmYXVsdF9tZXRob2QoY29uc3QgUlNBX01FVEhPRCAqbWV0aCk7Citjb25zdCBSU0FfTUVUSE9EICpSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKHZvaWQpOworY29uc3QgUlNBX01FVEhPRCAqUlNBX2dldF9tZXRob2QoY29uc3QgUlNBICpyc2EpOworaW50IFJTQV9zZXRfbWV0aG9kKFJTQSAqcnNhLCBjb25zdCBSU0FfTUVUSE9EICptZXRoKTsKKworLyogVGhpcyBmdW5jdGlvbiBuZWVkcyB0aGUgbWVtb3J5IGxvY2tpbmcgbWFsbG9jIGNhbGxiYWNrcyB0byBiZSBpbnN0YWxsZWQgKi8KK2ludCBSU0FfbWVtb3J5X2xvY2soUlNBICpyKTsKKworLyogdGhlc2UgYXJlIHRoZSBhY3R1YWwgU1NMZWF5IFJTQSBmdW5jdGlvbnMgKi8KK2NvbnN0IFJTQV9NRVRIT0QgKlJTQV9QS0NTMV9TU0xlYXkodm9pZCk7CisKK2NvbnN0IFJTQV9NRVRIT0QgKlJTQV9udWxsX21ldGhvZCh2b2lkKTsKKworREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlNfY29uc3QoUlNBLCBSU0FQdWJsaWNLZXkpCitERUNMQVJFX0FTTjFfRU5DT0RFX0ZVTkNUSU9OU19jb25zdChSU0EsIFJTQVByaXZhdGVLZXkpCisKKyNpZm5kZWYgT1BFTlNTTF9OT19GUF9BUEkKK2ludAlSU0FfcHJpbnRfZnAoRklMRSAqZnAsIGNvbnN0IFJTQSAqcixpbnQgb2Zmc2V0KTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCitpbnQJUlNBX3ByaW50KEJJTyAqYnAsIGNvbnN0IFJTQSAqcixpbnQgb2Zmc2V0KTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM0CitpbnQgaTJkX1JTQV9ORVQoY29uc3QgUlNBICphLCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCWludCAoKmNiKShjaGFyICpidWYsIGludCBsZW4sIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IHZlcmlmeSksCisJCWludCBzZ2NrZXkpOworUlNBICpkMmlfUlNBX05FVChSU0EgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoLAorCQkgaW50ICgqY2IpKGNoYXIgKmJ1ZiwgaW50IGxlbiwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgdmVyaWZ5KSwKKwkJIGludCBzZ2NrZXkpOworCitpbnQgaTJkX05ldHNjYXBlX1JTQShjb25zdCBSU0EgKmEsIHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJICAgICBpbnQgKCpjYikoY2hhciAqYnVmLCBpbnQgbGVuLCBjb25zdCBjaGFyICpwcm9tcHQsCisJCQkgICAgICAgaW50IHZlcmlmeSkpOworUlNBICpkMmlfTmV0c2NhcGVfUlNBKFJTQSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgsCisJCSAgICAgIGludCAoKmNiKShjaGFyICpidWYsIGludCBsZW4sIGNvbnN0IGNoYXIgKnByb21wdCwKKwkJCQlpbnQgdmVyaWZ5KSk7CisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyAyIGZ1bmN0aW9ucyBzaWduIGFuZCB2ZXJpZnkgYSBYNTA5X1NJRyBBU04xIG9iamVjdAorICogaW5zaWRlIFBLQ1MjMSBwYWRkZWQgUlNBIGVuY3J5cHRpb24gKi8KK2ludCBSU0Ffc2lnbihpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqbSwgdW5zaWduZWQgaW50IG1fbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKnNpZ3JldCwgdW5zaWduZWQgaW50ICpzaWdsZW4sIFJTQSAqcnNhKTsKK2ludCBSU0FfdmVyaWZ5KGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICptLCB1bnNpZ25lZCBpbnQgbV9sZW5ndGgsCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnYnVmLCB1bnNpZ25lZCBpbnQgc2lnbGVuLCBSU0EgKnJzYSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgMiBmdW5jdGlvbiBzaWduIGFuZCB2ZXJpZnkgYSBBU04xX09DVEVUX1NUUklORworICogb2JqZWN0IGluc2lkZSBQS0NTIzEgcGFkZGVkIFJTQSBlbmNyeXB0aW9uICovCitpbnQgUlNBX3NpZ25fQVNOMV9PQ1RFVF9TVFJJTkcoaW50IHR5cGUsCisJY29uc3QgdW5zaWduZWQgY2hhciAqbSwgdW5zaWduZWQgaW50IG1fbGVuZ3RoLAorCXVuc2lnbmVkIGNoYXIgKnNpZ3JldCwgdW5zaWduZWQgaW50ICpzaWdsZW4sIFJTQSAqcnNhKTsKK2ludCBSU0FfdmVyaWZ5X0FTTjFfT0NURVRfU1RSSU5HKGludCB0eXBlLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm0sIHVuc2lnbmVkIGludCBtX2xlbmd0aCwKKwl1bnNpZ25lZCBjaGFyICpzaWdidWYsIHVuc2lnbmVkIGludCBzaWdsZW4sIFJTQSAqcnNhKTsKKworaW50IFJTQV9ibGluZGluZ19vbihSU0EgKnJzYSwgQk5fQ1RYICpjdHgpOwordm9pZCBSU0FfYmxpbmRpbmdfb2ZmKFJTQSAqcnNhKTsKK0JOX0JMSU5ESU5HICpSU0Ffc2V0dXBfYmxpbmRpbmcoUlNBICpyc2EsIEJOX0NUWCAqY3R4KTsKKworaW50IFJTQV9wYWRkaW5nX2FkZF9QS0NTMV90eXBlXzEodW5zaWduZWQgY2hhciAqdG8saW50IHRsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqZixpbnQgZmwpOworaW50IFJTQV9wYWRkaW5nX2NoZWNrX1BLQ1MxX3R5cGVfMSh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCxpbnQgcnNhX2xlbik7CitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX3R5cGVfMih1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCk7CitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfdHlwZV8yKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsLGludCByc2FfbGVuKTsKK2ludCBQS0NTMV9NR0YxKHVuc2lnbmVkIGNoYXIgKm1hc2ssIGxvbmcgbGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlZWQsIGxvbmcgc2VlZGxlbiwgY29uc3QgRVZQX01EICpkZ3N0KTsKK2ludCBSU0FfcGFkZGluZ19hZGRfUEtDUzFfT0FFUCh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLGludCBwbCk7CitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUCh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCxpbnQgcnNhX2xlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLGludCBwbCk7CitpbnQgUlNBX3BhZGRpbmdfYWRkX1NTTHYyMyh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCk7CitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfU1NMdjIzKHVuc2lnbmVkIGNoYXIgKnRvLGludCB0bGVuLAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmYsaW50IGZsLGludCByc2FfbGVuKTsKK2ludCBSU0FfcGFkZGluZ19hZGRfbm9uZSh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCk7CitpbnQgUlNBX3BhZGRpbmdfY2hlY2tfbm9uZSh1bnNpZ25lZCBjaGFyICp0byxpbnQgdGxlbiwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpmLGludCBmbCxpbnQgcnNhX2xlbik7CitpbnQgUlNBX3BhZGRpbmdfYWRkX1g5MzEodW5zaWduZWQgY2hhciAqdG8saW50IHRsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqZixpbnQgZmwpOworaW50IFJTQV9wYWRkaW5nX2NoZWNrX1g5MzEodW5zaWduZWQgY2hhciAqdG8saW50IHRsZW4sCisJY29uc3QgdW5zaWduZWQgY2hhciAqZixpbnQgZmwsaW50IHJzYV9sZW4pOworaW50IFJTQV9YOTMxX2hhc2hfaWQoaW50IG5pZCk7CisKK2ludCBSU0FfdmVyaWZ5X1BLQ1MxX1BTUyhSU0EgKnJzYSwgY29uc3QgdW5zaWduZWQgY2hhciAqbUhhc2gsCisJCQljb25zdCBFVlBfTUQgKkhhc2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkVNLCBpbnQgc0xlbik7CitpbnQgUlNBX3BhZGRpbmdfYWRkX1BLQ1MxX1BTUyhSU0EgKnJzYSwgdW5zaWduZWQgY2hhciAqRU0sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICptSGFzaCwKKwkJCWNvbnN0IEVWUF9NRCAqSGFzaCwgaW50IHNMZW4pOworCitpbnQgUlNBX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwlDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgUlNBX3NldF9leF9kYXRhKFJTQSAqcixpbnQgaWR4LHZvaWQgKmFyZyk7Cit2b2lkICpSU0FfZ2V0X2V4X2RhdGEoY29uc3QgUlNBICpyLCBpbnQgaWR4KTsKKworUlNBICpSU0FQdWJsaWNLZXlfZHVwKFJTQSAqcnNhKTsKK1JTQSAqUlNBUHJpdmF0ZUtleV9kdXAoUlNBICpyc2EpOworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1JTQV9zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIFJTQSBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBSU0FfRl9DSEVDS19QQURESU5HX01ECQkJCSAxNDAKKyNkZWZpbmUgUlNBX0ZfRE9fUlNBX1BSSU5UCQkJCSAxNDYKKyNkZWZpbmUgUlNBX0ZfSU5UX1JTQV9WRVJJRlkJCQkJIDE0NQorI2RlZmluZSBSU0FfRl9NRU1PUllfTE9DSwkJCQkgMTAwCisjZGVmaW5lIFJTQV9GX09MRF9SU0FfUFJJVl9ERUNPREUJCQkgMTQ3CisjZGVmaW5lIFJTQV9GX1BLRVlfUlNBX0NUUkwJCQkJIDE0MworI2RlZmluZSBSU0FfRl9QS0VZX1JTQV9DVFJMX1NUUgkJCQkgMTQ0CisjZGVmaW5lIFJTQV9GX1BLRVlfUlNBX1NJR04JCQkJIDE0MgorI2RlZmluZSBSU0FfRl9QS0VZX1JTQV9WRVJJRllSRUNPVkVSCQkJIDE0MQorI2RlZmluZSBSU0FfRl9SU0FfQlVJTFRJTl9LRVlHRU4JCQkgMTI5CisjZGVmaW5lIFJTQV9GX1JTQV9DSEVDS19LRVkJCQkJIDEyMworI2RlZmluZSBSU0FfRl9SU0FfRUFZX1BSSVZBVEVfREVDUllQVAkJCSAxMDEKKyNkZWZpbmUgUlNBX0ZfUlNBX0VBWV9QUklWQVRFX0VOQ1JZUFQJCQkgMTAyCisjZGVmaW5lIFJTQV9GX1JTQV9FQVlfUFVCTElDX0RFQ1JZUFQJCQkgMTAzCisjZGVmaW5lIFJTQV9GX1JTQV9FQVlfUFVCTElDX0VOQ1JZUFQJCQkgMTA0CisjZGVmaW5lIFJTQV9GX1JTQV9HRU5FUkFURV9LRVkJCQkJIDEwNQorI2RlZmluZSBSU0FfRl9SU0FfTUVNT1JZX0xPQ0sJCQkJIDEzMAorI2RlZmluZSBSU0FfRl9SU0FfTkVXX01FVEhPRAkJCQkgMTA2CisjZGVmaW5lIFJTQV9GX1JTQV9OVUxMCQkJCQkgMTI0CisjZGVmaW5lIFJTQV9GX1JTQV9OVUxMX01PRF9FWFAJCQkJIDEzMQorI2RlZmluZSBSU0FfRl9SU0FfTlVMTF9QUklWQVRFX0RFQ1JZUFQJCQkgMTMyCisjZGVmaW5lIFJTQV9GX1JTQV9OVUxMX1BSSVZBVEVfRU5DUllQVAkJCSAxMzMKKyNkZWZpbmUgUlNBX0ZfUlNBX05VTExfUFVCTElDX0RFQ1JZUFQJCQkgMTM0CisjZGVmaW5lIFJTQV9GX1JTQV9OVUxMX1BVQkxJQ19FTkNSWVBUCQkJIDEzNQorI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19BRERfTk9ORQkJCSAxMDcKKyNkZWZpbmUgUlNBX0ZfUlNBX1BBRERJTkdfQUREX1BLQ1MxX09BRVAJCSAxMjEKKyNkZWZpbmUgUlNBX0ZfUlNBX1BBRERJTkdfQUREX1BLQ1MxX1BTUwkJCSAxMjUKKyNkZWZpbmUgUlNBX0ZfUlNBX1BBRERJTkdfQUREX1BLQ1MxX1RZUEVfMQkJIDEwOAorI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19BRERfUEtDUzFfVFlQRV8yCQkgMTA5CisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0FERF9TU0xWMjMJCQkgMTEwCisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0FERF9YOTMxCQkJIDEyNworI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19DSEVDS19OT05FCQkJIDExMQorI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19DSEVDS19QS0NTMV9PQUVQCQkgMTIyCisjZGVmaW5lIFJTQV9GX1JTQV9QQURESU5HX0NIRUNLX1BLQ1MxX1RZUEVfMQkJIDExMgorI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19DSEVDS19QS0NTMV9UWVBFXzIJCSAxMTMKKyNkZWZpbmUgUlNBX0ZfUlNBX1BBRERJTkdfQ0hFQ0tfU1NMVjIzCQkJIDExNAorI2RlZmluZSBSU0FfRl9SU0FfUEFERElOR19DSEVDS19YOTMxCQkJIDEyOAorI2RlZmluZSBSU0FfRl9SU0FfUFJJTlQJCQkJCSAxMTUKKyNkZWZpbmUgUlNBX0ZfUlNBX1BSSU5UX0ZQCQkJCSAxMTYKKyNkZWZpbmUgUlNBX0ZfUlNBX1BSSVZfREVDT0RFCQkJCSAxMzcKKyNkZWZpbmUgUlNBX0ZfUlNBX1BSSVZfRU5DT0RFCQkJCSAxMzgKKyNkZWZpbmUgUlNBX0ZfUlNBX1BVQl9ERUNPREUJCQkJIDEzOQorI2RlZmluZSBSU0FfRl9SU0FfU0VUVVBfQkxJTkRJTkcJCQkgMTM2CisjZGVmaW5lIFJTQV9GX1JTQV9TSUdOCQkJCQkgMTE3CisjZGVmaW5lIFJTQV9GX1JTQV9TSUdOX0FTTjFfT0NURVRfU1RSSU5HCQkgMTE4CisjZGVmaW5lIFJTQV9GX1JTQV9WRVJJRlkJCQkJIDExOQorI2RlZmluZSBSU0FfRl9SU0FfVkVSSUZZX0FTTjFfT0NURVRfU1RSSU5HCQkgMTIwCisjZGVmaW5lIFJTQV9GX1JTQV9WRVJJRllfUEtDUzFfUFNTCQkJIDEyNgorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIFJTQV9SX0FMR09SSVRITV9NSVNNQVRDSAkJCSAxMDAKKyNkZWZpbmUgUlNBX1JfQkFEX0VfVkFMVUUJCQkJIDEwMQorI2RlZmluZSBSU0FfUl9CQURfRklYRURfSEVBREVSX0RFQ1JZUFQJCQkgMTAyCisjZGVmaW5lIFJTQV9SX0JBRF9QQURfQllURV9DT1VOVAkJCSAxMDMKKyNkZWZpbmUgUlNBX1JfQkFEX1NJR05BVFVSRQkJCQkgMTA0CisjZGVmaW5lIFJTQV9SX0JMT0NLX1RZUEVfSVNfTk9UXzAxCQkJIDEwNgorI2RlZmluZSBSU0FfUl9CTE9DS19UWVBFX0lTX05PVF8wMgkJCSAxMDcKKyNkZWZpbmUgUlNBX1JfREFUQV9HUkVBVEVSX1RIQU5fTU9EX0xFTgkJCSAxMDgKKyNkZWZpbmUgUlNBX1JfREFUQV9UT09fTEFSR0UJCQkJIDEwOQorI2RlZmluZSBSU0FfUl9EQVRBX1RPT19MQVJHRV9GT1JfS0VZX1NJWkUJCSAxMTAKKyNkZWZpbmUgUlNBX1JfREFUQV9UT09fTEFSR0VfRk9SX01PRFVMVVMJCSAxMzIKKyNkZWZpbmUgUlNBX1JfREFUQV9UT09fU01BTEwJCQkJIDExMQorI2RlZmluZSBSU0FfUl9EQVRBX1RPT19TTUFMTF9GT1JfS0VZX1NJWkUJCSAxMjIKKyNkZWZpbmUgUlNBX1JfRElHRVNUX1RPT19CSUdfRk9SX1JTQV9LRVkJCSAxMTIKKyNkZWZpbmUgUlNBX1JfRE1QMV9OT1RfQ09OR1JVRU5UX1RPX0QJCQkgMTI0CisjZGVmaW5lIFJTQV9SX0RNUTFfTk9UX0NPTkdSVUVOVF9UT19ECQkJIDEyNQorI2RlZmluZSBSU0FfUl9EX0VfTk9UX0NPTkdSVUVOVF9UT18xCQkJIDEyMworI2RlZmluZSBSU0FfUl9GSVJTVF9PQ1RFVF9JTlZBTElECQkJIDEzMworI2RlZmluZSBSU0FfUl9JTExFR0FMX09SX1VOU1VQUE9SVEVEX1BBRERJTkdfTU9ERQkgMTQ0CisjZGVmaW5lIFJTQV9SX0lOVkFMSURfRElHRVNUX0xFTkdUSAkJCSAxNDMKKyNkZWZpbmUgUlNBX1JfSU5WQUxJRF9IRUFERVIJCQkJIDEzNworI2RlZmluZSBSU0FfUl9JTlZBTElEX0tFWUJJVFMJCQkJIDE0NQorI2RlZmluZSBSU0FfUl9JTlZBTElEX01FU1NBR0VfTEVOR1RICQkJIDEzMQorI2RlZmluZSBSU0FfUl9JTlZBTElEX1BBRERJTkcJCQkJIDEzOAorI2RlZmluZSBSU0FfUl9JTlZBTElEX1BBRERJTkdfTU9ERQkJCSAxNDEKKyNkZWZpbmUgUlNBX1JfSU5WQUxJRF9QU1NfU0FMVExFTgkJCSAxNDYKKyNkZWZpbmUgUlNBX1JfSU5WQUxJRF9UUkFJTEVSCQkJCSAxMzkKKyNkZWZpbmUgUlNBX1JfSU5WQUxJRF9YOTMxX0RJR0VTVAkJCSAxNDIKKyNkZWZpbmUgUlNBX1JfSVFNUF9OT1RfSU5WRVJTRV9PRl9RCQkJIDEyNgorI2RlZmluZSBSU0FfUl9LRVlfU0laRV9UT09fU01BTEwJCQkgMTIwCisjZGVmaW5lIFJTQV9SX0xBU1RfT0NURVRfSU5WQUxJRAkJCSAxMzQKKyNkZWZpbmUgUlNBX1JfTU9EVUxVU19UT09fTEFSR0UJCQkJIDEwNQorI2RlZmluZSBSU0FfUl9OT19QVUJMSUNfRVhQT05FTlQJCQkgMTQwCisjZGVmaW5lIFJTQV9SX05VTExfQkVGT1JFX0JMT0NLX01JU1NJTkcJCQkgMTEzCisjZGVmaW5lIFJTQV9SX05fRE9FU19OT1RfRVFVQUxfUF9RCQkJIDEyNworI2RlZmluZSBSU0FfUl9PQUVQX0RFQ09ESU5HX0VSUk9SCQkJIDEyMQorI2RlZmluZSBSU0FfUl9PUEVSQVRJT05fTk9UX1NVUFBPUlRFRF9GT1JfVEhJU19LRVlUWVBFCSAxNDgKKyNkZWZpbmUgUlNBX1JfUEFERElOR19DSEVDS19GQUlMRUQJCQkgMTE0CisjZGVmaW5lIFJTQV9SX1BfTk9UX1BSSU1FCQkJCSAxMjgKKyNkZWZpbmUgUlNBX1JfUV9OT1RfUFJJTUUJCQkJIDEyOQorI2RlZmluZSBSU0FfUl9SU0FfT1BFUkFUSU9OU19OT1RfU1VQUE9SVEVECQkgMTMwCisjZGVmaW5lIFJTQV9SX1NMRU5fQ0hFQ0tfRkFJTEVECQkJCSAxMzYKKyNkZWZpbmUgUlNBX1JfU0xFTl9SRUNPVkVSWV9GQUlMRUQJCQkgMTM1CisjZGVmaW5lIFJTQV9SX1NTTFYzX1JPTExCQUNLX0FUVEFDSwkJCSAxMTUKKyNkZWZpbmUgUlNBX1JfVEhFX0FTTjFfT0JKRUNUX0lERU5USUZJRVJfSVNfTk9UX0tOT1dOX0ZPUl9USElTX01EIDExNgorI2RlZmluZSBSU0FfUl9VTktOT1dOX0FMR09SSVRITV9UWVBFCQkJIDExNworI2RlZmluZSBSU0FfUl9VTktOT1dOX1BBRERJTkdfVFlQRQkJCSAxMTgKKyNkZWZpbmUgUlNBX1JfVkFMVUVfTUlTU0lORwkJCQkgMTQ3CisjZGVmaW5lIFJTQV9SX1dST05HX1NJR05BVFVSRV9MRU5HVEgJCQkgMTE5CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxY2I4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaApAQCAtMCwwICsxLDI1NzQgQEAKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfU0FGRVNUQUNLX0gKKyNkZWZpbmUgSEVBREVSX1NBRkVTVEFDS19ICisKKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisKKyNpZm5kZWYgQ0hFQ0tFRF9QVFJfT0YKKyNkZWZpbmUgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgcCkgXAorICAgICgodm9pZCopICgxID8gcCA6ICh0eXBlKikwKSkKKyNlbmRpZgorCisvKiBJbiBDKysgd2UgZ2V0IHByb2JsZW1zIGJlY2F1c2UgYW4gZXhwbGljaXQgY2FzdCBpcyBuZWVkZWQgZnJvbSAodm9pZCAqKQorICogd2UgdXNlIENIRUNLRURfU1RBQ0tfT0YgdG8gZW5zdXJlIHRoZSBjb3JyZWN0IHR5cGUgaXMgcGFzc2VkIGluIHRoZSBtYWNyb3MKKyAqIGJlbG93LiAKKyAqLworCisjZGVmaW5lIENIRUNLRURfU1RBQ0tfT0YodHlwZSwgcCkgXAorICAgICgoX1NUQUNLKikgKDEgPyBwIDogKFNUQUNLX09GKHR5cGUpKikwKSkKKworI2RlZmluZSBDSEVDS0VEX1NLX0ZSRUVfRlVOQyh0eXBlLCBwKSBcCisgICAgKCh2b2lkICgqKSh2b2lkICopKSAoKDEgPyBwIDogKHZvaWQgKCopKHR5cGUgKikpMCkpKQorCisjZGVmaW5lIENIRUNLRURfU0tfRlJFRV9GVU5DMih0eXBlLCBwKSBcCisgICAgKCh2b2lkICgqKSh2b2lkICopKSAoKDEgPyBwIDogKHZvaWQgKCopKHR5cGUpKTApKSkKKworI2RlZmluZSBDSEVDS0VEX1NLX0NNUF9GVU5DKHR5cGUsIHApIFwKKyAgICAoKGludCAoKikoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKSBcCisJKCgxID8gcCA6IChpbnQgKCopKGNvbnN0IHR5cGUgKiBjb25zdCAqLCBjb25zdCB0eXBlICogY29uc3QgKikpMCkpKQorCisjZGVmaW5lIFNUQUNLX09GKHR5cGUpIHN0cnVjdCBzdGFja19zdF8jI3R5cGUKKyNkZWZpbmUgUFJFREVDTEFSRV9TVEFDS19PRih0eXBlKSBTVEFDS19PRih0eXBlKTsKKworI2RlZmluZSBERUNMQVJFX1NUQUNLX09GKHR5cGUpIFwKK1NUQUNLX09GKHR5cGUpIFwKKyAgICB7IFwKKyAgICBfU1RBQ0sgc3RhY2s7IFwKKyAgICB9OworI2RlZmluZSBERUNMQVJFX1NQRUNJQUxfU1RBQ0tfT0YodHlwZSwgdHlwZTIpIFwKK1NUQUNLX09GKHR5cGUpIFwKKyAgICB7IFwKKyAgICBfU1RBQ0sgc3RhY2s7IFwKKyAgICB9OworCisjZGVmaW5lIElNUExFTUVOVF9TVEFDS19PRih0eXBlKSAvKiBuYWRhIChvYnNvbGV0ZSBpbiBuZXcgc2FmZXN0YWNrIGFwcHJvYWNoKSovCisKKworLyogU3RyaW5ncyBhcmUgc3BlY2lhbDogbm9ybWFsbHkgYW4gbGhhc2ggZW50cnkgd2lsbCBwb2ludCB0byBhIHNpbmdsZQorICogKHNvbWV3aGF0KSBtdXRhYmxlIG9iamVjdC4gSW4gdGhlIGNhc2Ugb2Ygc3RyaW5nczoKKyAqCisgKiBhKSBJbnN0ZWFkIG9mIGEgc2luZ2xlIGNoYXIsIHRoZXJlIGlzIGFuIGFycmF5IG9mIGNoYXJzLCBOVUwtdGVybWluYXRlZC4KKyAqIGIpIFRoZSBzdHJpbmcgbWF5IGhhdmUgYmUgaW1tdXRhYmxlLgorICoKKyAqIFNvLCB0aGV5IG5lZWQgdGhlaXIgb3duIGRlY2xhcmF0aW9ucy4gRXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yCisgKiB0eXBlLWNoZWNraW5nIHRvb2xzLCBzdWNoIGFzIERlcHV0eS4KKyAqCitvICogSW4gcHJhY3RpY2UsIGhvd2V2ZXIsIGl0IGFwcGVhcnMgdG8gYmUgaGFyZCB0byBoYXZlIGEgY29uc3QKKyAqIHN0cmluZy4gRm9yIG5vdywgSSdtIHNldHRsaW5nIGZvciBkZWFsaW5nIHdpdGggdGhlIGZhY3QgaXQgaXMgYQorICogc3RyaW5nIGF0IGFsbC4KKyAqLwordHlwZWRlZiBjaGFyICpPUEVOU1NMX1NUUklORzsKKwordHlwZWRlZiBjb25zdCBjaGFyICpPUEVOU1NMX0NTVFJJTkc7CisKKy8qIENvbmZ1c2luZ2x5LCBMSEFTSF9PRihTVFJJTkcpIGRlYWxzIHdpdGggY2hhciAqKiB0aHJvdWdob3V0LCBidXQKKyAqIFNUQUNLX09GKFNUUklORykgaXMgcmVhbGx5IG1vcmUgbGlrZSBTVEFDS19PRihjaGFyKSwgb25seSwgYXMKKyAqIG1lbnRpb25lZCBhYm92ZSwgaW5zdGVhZCBvZiBhIHNpbmdsZSBjaGFyIGVhY2ggZW50cnkgaXMgYQorICogTlVMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgY2hhcnMuIFNvLCB3ZSBoYXZlIHRvIGltcGxlbWVudCBTVFJJTkcKKyAqIHNwZWNpYWxseSBmb3IgU1RBQ0tfT0YuIFRoaXMgaXMgZGVhbHQgd2l0aCBpbiB0aGUgYXV0b2dlbmVyYXRlZAorICogbWFjcm9zIGJlbG93LgorICovCisKK0RFQ0xBUkVfU1BFQ0lBTF9TVEFDS19PRihPUEVOU1NMX1NUUklORywgY2hhcikKKworLyogU2ltaWxhcmx5LCB3ZSBzb21ldGltZXMgdXNlIGEgYmxvY2sgb2YgY2hhcmFjdGVycywgTk9UCisgKiBudWwtdGVybWluYXRlZC4gVGhlc2Ugc2hvdWxkIGFsc28gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tICJub3JtYWwiCisgKiBzdGFja3MuICovCisKK3R5cGVkZWYgdm9pZCAqT1BFTlNTTF9CTE9DSzsKK0RFQ0xBUkVfU1BFQ0lBTF9TVEFDS19PRihPUEVOU1NMX0JMT0NLLCB2b2lkKQorCisvKiBTS01fc2tfLi4uIHN0YWNrIG1hY3JvcyBhcmUgaW50ZXJuYWwgdG8gc2FmZXN0YWNrLmg6CisgKiBuZXZlciB1c2UgdGhlbSBkaXJlY3RseSwgdXNlIHNrXzx0eXBlPl8uLi4gaW5zdGVhZCAqLworI2RlZmluZSBTS01fc2tfbmV3KHR5cGUsIGNtcCkgXAorCSgoU1RBQ0tfT0YodHlwZSkgKilza19uZXcoQ0hFQ0tFRF9TS19DTVBfRlVOQyh0eXBlLCBjbXApKSkKKyNkZWZpbmUgU0tNX3NrX25ld19udWxsKHR5cGUpIFwKKwkoKFNUQUNLX09GKHR5cGUpICopc2tfbmV3X251bGwoKSkKKyNkZWZpbmUgU0tNX3NrX2ZyZWUodHlwZSwgc3QpIFwKKwlza19mcmVlKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfbnVtKHR5cGUsIHN0KSBcCisJc2tfbnVtKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfdmFsdWUodHlwZSwgc3QsaSkgXAorCSgodHlwZSAqKXNrX3ZhbHVlKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBpKSkKKyNkZWZpbmUgU0tNX3NrX3NldCh0eXBlLCBzdCxpLHZhbCkgXAorCXNrX3NldChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSwgaSwgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgdmFsKSkKKyNkZWZpbmUgU0tNX3NrX3plcm8odHlwZSwgc3QpIFwKKwlza196ZXJvKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfcHVzaCh0eXBlLCBzdCwgdmFsKSBcCisJc2tfcHVzaChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSwgQ0hFQ0tFRF9QVFJfT0YodHlwZSwgdmFsKSkKKyNkZWZpbmUgU0tNX3NrX3Vuc2hpZnQodHlwZSwgc3QsIHZhbCkgXAorCXNrX3Vuc2hpZnQoQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCksIENIRUNLRURfUFRSX09GKHR5cGUsIHZhbCkpCisjZGVmaW5lIFNLTV9za19maW5kKHR5cGUsIHN0LCB2YWwpIFwKKwlza19maW5kKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBDSEVDS0VEX1BUUl9PRih0eXBlLCB2YWwpKQorI2RlZmluZSBTS01fc2tfZmluZF9leCh0eXBlLCBzdCwgdmFsKSBcCisJc2tfZmluZF9leChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSwgXAorCQkgICBDSEVDS0VEX1BUUl9PRih0eXBlLCB2YWwpKQorI2RlZmluZSBTS01fc2tfZGVsZXRlKHR5cGUsIHN0LCBpKSBcCisJKHR5cGUgKilza19kZWxldGUoQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCksIGkpCisjZGVmaW5lIFNLTV9za19kZWxldGVfcHRyKHR5cGUsIHN0LCBwdHIpIFwKKwkodHlwZSAqKXNrX2RlbGV0ZV9wdHIoQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCksIENIRUNLRURfUFRSX09GKHR5cGUsIHB0cikpCisjZGVmaW5lIFNLTV9za19pbnNlcnQodHlwZSwgc3QsdmFsLCBpKSBcCisJc2tfaW5zZXJ0KENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBDSEVDS0VEX1BUUl9PRih0eXBlLCB2YWwpLCBpKQorI2RlZmluZSBTS01fc2tfc2V0X2NtcF9mdW5jKHR5cGUsIHN0LCBjbXApIFwKKwkoKGludCAoKikoY29uc3QgdHlwZSAqIGNvbnN0ICosY29uc3QgdHlwZSAqIGNvbnN0ICopKSBcCisJc2tfc2V0X2NtcF9mdW5jKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBDSEVDS0VEX1NLX0NNUF9GVU5DKHR5cGUsIGNtcCkpKQorI2RlZmluZSBTS01fc2tfZHVwKHR5cGUsIHN0KSBcCisJKFNUQUNLX09GKHR5cGUpICopc2tfZHVwKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfcG9wX2ZyZWUodHlwZSwgc3QsIGZyZWVfZnVuYykgXAorCXNrX3BvcF9mcmVlKENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBDSEVDS0VEX1NLX0ZSRUVfRlVOQyh0eXBlLCBmcmVlX2Z1bmMpKQorI2RlZmluZSBTS01fc2tfc2hpZnQodHlwZSwgc3QpIFwKKwkodHlwZSAqKXNrX3NoaWZ0KENIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpKQorI2RlZmluZSBTS01fc2tfcG9wKHR5cGUsIHN0KSBcCisJKHR5cGUgKilza19wb3AoQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCkpCisjZGVmaW5lIFNLTV9za19zb3J0KHR5cGUsIHN0KSBcCisJc2tfc29ydChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSkKKyNkZWZpbmUgU0tNX3NrX2lzX3NvcnRlZCh0eXBlLCBzdCkgXAorCXNrX2lzX3NvcnRlZChDSEVDS0VEX1NUQUNLX09GKHR5cGUsIHN0KSkKKworI2RlZmluZQlTS01fQVNOMV9TRVRfT0ZfZDJpKHR5cGUsIHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisgIChTVEFDS19PRih0eXBlKSAqKWQyaV9BU04xX1NFVCgoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSykgKiopQ0hFQ0tFRF9TVEFDS19PRih0eXBlLCBzdCksIFwKKwkJCQlwcCwgbGVuZ3RoLCBcCisJCQkJQ0hFQ0tFRF9EMklfT0YodHlwZSwgZDJpX2Z1bmMpLCBcCisJCQkJQ0hFQ0tFRF9TS19GUkVFX0ZVTkModHlwZSwgZnJlZV9mdW5jKSwgXAorCQkJCWV4X3RhZywgZXhfY2xhc3MpCisKKyNkZWZpbmUJU0tNX0FTTjFfU0VUX09GX2kyZCh0eXBlLCBzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKyAgaTJkX0FTTjFfU0VUKChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKUNIRUNLRURfU1RBQ0tfT0YodHlwZSwgc3QpLCBwcCwgXAorCQkJCUNIRUNLRURfSTJEX09GKHR5cGUsIGkyZF9mdW5jKSwgXAorCQkJCWV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkKKworI2RlZmluZQlTS01fQVNOMV9zZXFfcGFjayh0eXBlLCBzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJQVNOMV9zZXFfcGFjayhDSEVDS0VEX1BUUl9PRihTVEFDS19PRih0eXBlKSwgc3QpLCBcCisJCQlDSEVDS0VEX0kyRF9PRih0eXBlLCBpMmRfZnVuYyksIGJ1ZiwgbGVuKQorCisjZGVmaW5lCVNLTV9BU04xX3NlcV91bnBhY2sodHlwZSwgYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwkoU1RBQ0tfT0YodHlwZSkgKilBU04xX3NlcV91bnBhY2soYnVmLCBsZW4sIENIRUNLRURfRDJJX09GKHR5cGUsIGQyaV9mdW5jKSwgQ0hFQ0tFRF9TS19GUkVFX0ZVTkModHlwZSwgZnJlZV9mdW5jKSkKKworI2RlZmluZSBTS01fUEtDUzEyX2RlY3J5cHRfZDJpKHR5cGUsIGFsZ29yLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBwYXNzLCBwYXNzbGVuLCBvY3QsIHNlcSkgXAorCShTVEFDS19PRih0eXBlKSAqKVBLQ1MxMl9kZWNyeXB0X2QyaShhbGdvciwgXAorCQkJCUNIRUNLRURfRDJJX09GKHR5cGUsIGQyaV9mdW5jKSwgXAorCQkJCUNIRUNLRURfU0tfRlJFRV9GVU5DKHR5cGUsIGZyZWVfZnVuYyksIFwKKwkJCQlwYXNzLCBwYXNzbGVuLCBvY3QsIHNlcSkKKworLyogVGhpcyBibG9jayBvZiBkZWZpbmVzIGlzIHVwZGF0ZWQgYnkgdXRpbC9ta3N0YWNrLnBsLCBwbGVhc2UgZG8gbm90IHRvdWNoISAqLworI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fbmV3KGNtcCkgU0tNX3NrX25ldyhBQ0NFU1NfREVTQ1JJUFRJT04sIChjbXApKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQUNDRVNTX0RFU0NSSVBUSU9OKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fZnJlZShzdCkgU0tNX3NrX2ZyZWUoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fbnVtKHN0KSBTS01fc2tfbnVtKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSkKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl96ZXJvKHN0KSBTS01fc2tfemVybyhBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCksIChjbXApKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fZHVwKHN0KSBTS01fc2tfZHVwKEFDQ0VTU19ERVNDUklQVElPTiwgc3QpCisjZGVmaW5lIHNrX0FDQ0VTU19ERVNDUklQVElPTl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQUNDRVNTX0RFU0NSSVBUSU9OLCAoc3QpKQorI2RlZmluZSBza19BQ0NFU1NfREVTQ1JJUFRJT05fcG9wKHN0KSBTS01fc2tfcG9wKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSkKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX3NvcnQoc3QpIFNLTV9za19zb3J0KEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSkKKyNkZWZpbmUgc2tfQUNDRVNTX0RFU0NSSVBUSU9OX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCkpCisKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfbmV3KGNtcCkgU0tNX3NrX25ldyhBU0lkT3JSYW5nZSwgKGNtcCkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEFTSWRPclJhbmdlKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV9mcmVlKHN0KSBTS01fc2tfZnJlZShBU0lkT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfbnVtKHN0KSBTS01fc2tfbnVtKEFTSWRPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEFTSWRPclJhbmdlLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEFTSWRPclJhbmdlLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV96ZXJvKHN0KSBTS01fc2tfemVybyhBU0lkT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChBU0lkT3JSYW5nZSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQVNJZE9yUmFuZ2UsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTSWRPclJhbmdlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChBU0lkT3JSYW5nZSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShBU0lkT3JSYW5nZSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTSWRPclJhbmdlLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQVNJZE9yUmFuZ2UsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTSWRPclJhbmdlX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEFTSWRPclJhbmdlLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfZHVwKHN0KSBTS01fc2tfZHVwKEFTSWRPclJhbmdlLCBzdCkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEFTSWRPclJhbmdlLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2Vfc2hpZnQoc3QpIFNLTV9za19zaGlmdChBU0lkT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfcG9wKHN0KSBTS01fc2tfcG9wKEFTSWRPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19BU0lkT3JSYW5nZV9zb3J0KHN0KSBTS01fc2tfc29ydChBU0lkT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNJZE9yUmFuZ2VfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEFTSWRPclJhbmdlLCAoc3QpKQorCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19uZXcoY21wKSBTS01fc2tfbmV3KEFTTjFfR0VORVJBTFNUUklORywgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChBU04xX0dFTkVSQUxTVFJJTkcpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19mcmVlKHN0KSBTS01fc2tfZnJlZShBU04xX0dFTkVSQUxTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19udW0oc3QpIFNLTV9za19udW0oQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShBU04xX0dFTkVSQUxTVFJJTkcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEFTTjFfR0VORVJBTFNUUklORywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3plcm8oc3QpIFNLTV9za196ZXJvKEFTTjFfR0VORVJBTFNUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShBU04xX0dFTkVSQUxTVFJJTkcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEFTTjFfR0VORVJBTFNUUklORywgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEFTTjFfR0VORVJBTFNUUklORywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19kdXAoc3QpIFNLTV9za19kdXAoQVNOMV9HRU5FUkFMU1RSSU5HLCBzdCkKKyNkZWZpbmUgc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShBU04xX0dFTkVSQUxTVFJJTkcsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfc2hpZnQoc3QpIFNLTV9za19zaGlmdChBU04xX0dFTkVSQUxTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfR0VORVJBTFNUUklOR19wb3Aoc3QpIFNLTV9za19wb3AoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfc29ydChzdCkgU0tNX3NrX3NvcnQoQVNOMV9HRU5FUkFMU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19BU04xX0dFTkVSQUxTVFJJTkdfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEFTTjFfR0VORVJBTFNUUklORywgKHN0KSkKKworI2RlZmluZSBza19BU04xX0lOVEVHRVJfbmV3KGNtcCkgU0tNX3NrX25ldyhBU04xX0lOVEVHRVIsIChjbXApKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQVNOMV9JTlRFR0VSKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQVNOMV9JTlRFR0VSLCAoc3QpKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfbnVtKHN0KSBTS01fc2tfbnVtKEFTTjFfSU5URUdFUiwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQVNOMV9JTlRFR0VSLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChBU04xX0lOVEVHRVIsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl96ZXJvKHN0KSBTS01fc2tfemVybyhBU04xX0lOVEVHRVIsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEFTTjFfSU5URUdFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEFTTjFfSU5URUdFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTTjFfSU5URUdFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEFTTjFfSU5URUdFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQVNOMV9JTlRFR0VSLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTTjFfSU5URUdFUiwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChBU04xX0lOVEVHRVIsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhBU04xX0lOVEVHRVIsIChzdCksIChjbXApKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfZHVwKHN0KSBTS01fc2tfZHVwKEFTTjFfSU5URUdFUiwgc3QpCisjZGVmaW5lIHNrX0FTTjFfSU5URUdFUl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQVNOMV9JTlRFR0VSLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQVNOMV9JTlRFR0VSLCAoc3QpKQorI2RlZmluZSBza19BU04xX0lOVEVHRVJfcG9wKHN0KSBTS01fc2tfcG9wKEFTTjFfSU5URUdFUiwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX3NvcnQoc3QpIFNLTV9za19zb3J0KEFTTjFfSU5URUdFUiwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9JTlRFR0VSX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChBU04xX0lOVEVHRVIsIChzdCkpCisKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfbmV3KGNtcCkgU0tNX3NrX25ldyhBU04xX09CSkVDVCwgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEFTTjFfT0JKRUNUKQorI2RlZmluZSBza19BU04xX09CSkVDVF9mcmVlKHN0KSBTS01fc2tfZnJlZShBU04xX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfbnVtKHN0KSBTS01fc2tfbnVtKEFTTjFfT0JKRUNULCAoc3QpKQorI2RlZmluZSBza19BU04xX09CSkVDVF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEFTTjFfT0JKRUNULCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEFTTjFfT0JKRUNULCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19BU04xX09CSkVDVF96ZXJvKHN0KSBTS01fc2tfemVybyhBU04xX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChBU04xX09CSkVDVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQVNOMV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX09CSkVDVF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTTjFfT0JKRUNULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChBU04xX09CSkVDVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShBU04xX09CSkVDVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU04xX09CSkVDVF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTTjFfT0JKRUNULCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQVNOMV9PQkpFQ1QsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfT0JKRUNUX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEFTTjFfT0JKRUNULCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfZHVwKHN0KSBTS01fc2tfZHVwKEFTTjFfT0JKRUNULCBzdCkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEFTTjFfT0JKRUNULCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1Rfc2hpZnQoc3QpIFNLTV9za19zaGlmdChBU04xX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfcG9wKHN0KSBTS01fc2tfcG9wKEFTTjFfT0JKRUNULCAoc3QpKQorI2RlZmluZSBza19BU04xX09CSkVDVF9zb3J0KHN0KSBTS01fc2tfc29ydChBU04xX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9PQkpFQ1RfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEFTTjFfT0JKRUNULCAoc3QpKQorCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX25ldyhjbXApIFNLTV9za19uZXcoQVNOMV9TVFJJTkdfVEFCTEUsIChjbXApKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChBU04xX1NUUklOR19UQUJMRSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX251bShzdCkgU0tNX3NrX251bShBU04xX1NUUklOR19UQUJMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfemVybyhzdCkgU0tNX3NrX3plcm8oQVNOMV9TVFJJTkdfVEFCTEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQVNOMV9TVFJJTkdfVEFCTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEFTTjFfU1RSSU5HX1RBQkxFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEFTTjFfU1RSSU5HX1RBQkxFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19BU04xX1NUUklOR19UQUJMRV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2R1cChzdCkgU0tNX3NrX2R1cChBU04xX1NUUklOR19UQUJMRSwgc3QpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShBU04xX1NUUklOR19UQUJMRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX3BvcChzdCkgU0tNX3NrX3BvcChBU04xX1NUUklOR19UQUJMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9TVFJJTkdfVEFCTEVfc29ydChzdCkgU0tNX3NrX3NvcnQoQVNOMV9TVFJJTkdfVEFCTEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfU1RSSU5HX1RBQkxFX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChBU04xX1NUUklOR19UQUJMRSwgKHN0KSkKKworI2RlZmluZSBza19BU04xX1RZUEVfbmV3KGNtcCkgU0tNX3NrX25ldyhBU04xX1RZUEUsIChjbXApKQorI2RlZmluZSBza19BU04xX1RZUEVfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQVNOMV9UWVBFKQorI2RlZmluZSBza19BU04xX1RZUEVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQVNOMV9UWVBFLCAoc3QpKQorI2RlZmluZSBza19BU04xX1RZUEVfbnVtKHN0KSBTS01fc2tfbnVtKEFTTjFfVFlQRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQVNOMV9UWVBFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChBU04xX1RZUEUsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV96ZXJvKHN0KSBTS01fc2tfemVybyhBU04xX1RZUEUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEFTTjFfVFlQRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEFTTjFfVFlQRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTTjFfVFlQRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEFTTjFfVFlQRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQVNOMV9UWVBFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTTjFfVFlQRSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChBU04xX1RZUEUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhBU04xX1RZUEUsIChzdCksIChjbXApKQorI2RlZmluZSBza19BU04xX1RZUEVfZHVwKHN0KSBTS01fc2tfZHVwKEFTTjFfVFlQRSwgc3QpCisjZGVmaW5lIHNrX0FTTjFfVFlQRV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQVNOMV9UWVBFLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQVNOMV9UWVBFLCAoc3QpKQorI2RlZmluZSBza19BU04xX1RZUEVfcG9wKHN0KSBTS01fc2tfcG9wKEFTTjFfVFlQRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX3NvcnQoc3QpIFNLTV9za19zb3J0KEFTTjFfVFlQRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9UWVBFX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChBU04xX1RZUEUsIChzdCkpCisKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX25ldyhjbXApIFNLTV9za19uZXcoQVNOMV9VVEY4U1RSSU5HLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEFTTjFfVVRGOFNUUklORykKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX2ZyZWUoc3QpIFNLTV9za19mcmVlKEFTTjFfVVRGOFNUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX251bShzdCkgU0tNX3NrX251bShBU04xX1VURjhTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVVRGOFNUUklOR192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQVNOMV9VVEY4U1RSSU5HLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfemVybyhzdCkgU0tNX3NrX3plcm8oQVNOMV9VVEY4U1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChBU04xX1VURjhTVFJJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChBU04xX1VURjhTVFJJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChBU04xX1VURjhTVFJJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChBU04xX1VURjhTVFJJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKGkpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihBU04xX1VURjhTVFJJTkcsIChzdCksIChwdHIpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQVNOMV9VVEY4U1RSSU5HLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQVNOMV9VVEY4U1RSSU5HLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX2R1cChzdCkgU0tNX3NrX2R1cChBU04xX1VURjhTVFJJTkcsIHN0KQorI2RlZmluZSBza19BU04xX1VURjhTVFJJTkdfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0FTTjFfVVRGOFNUUklOR19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEFTTjFfVVRGOFNUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9VVEY4U1RSSU5HX3BvcChzdCkgU0tNX3NrX3BvcChBU04xX1VURjhTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVVRGOFNUUklOR19zb3J0KHN0KSBTS01fc2tfc29ydChBU04xX1VURjhTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVVRGOFNUUklOR19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQVNOMV9VVEY4U1RSSU5HLCAoc3QpKQorCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfbmV3KGNtcCkgU0tNX3NrX25ldyhBU04xX1ZBTFVFLCAoY21wKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChBU04xX1ZBTFVFKQorI2RlZmluZSBza19BU04xX1ZBTFVFX2ZyZWUoc3QpIFNLTV9za19mcmVlKEFTTjFfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfbnVtKHN0KSBTS01fc2tfbnVtKEFTTjFfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShBU04xX1ZBTFVFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQVNOMV9WQUxVRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV96ZXJvKHN0KSBTS01fc2tfemVybyhBU04xX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19BU04xX1ZBTFVFX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQVNOMV9WQUxVRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChBU04xX1ZBTFVFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEFTTjFfVkFMVUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19BU04xX1ZBTFVFX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQVNOMV9WQUxVRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEFTTjFfVkFMVUUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEFTTjFfVkFMVUUsIChzdCksIChwdHIpKQorI2RlZmluZSBza19BU04xX1ZBTFVFX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEFTTjFfVkFMVUUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQVNOMV9WQUxVRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfZHVwKHN0KSBTS01fc2tfZHVwKEFTTjFfVkFMVUUsIHN0KQorI2RlZmluZSBza19BU04xX1ZBTFVFX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShBU04xX1ZBTFVFLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEFTTjFfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfcG9wKHN0KSBTS01fc2tfcG9wKEFTTjFfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0FTTjFfVkFMVUVfc29ydChzdCkgU0tNX3NrX3NvcnQoQVNOMV9WQUxVRSwgKHN0KSkKKyNkZWZpbmUgc2tfQVNOMV9WQUxVRV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQVNOMV9WQUxVRSwgKHN0KSkKKworI2RlZmluZSBza19CSU9fbmV3KGNtcCkgU0tNX3NrX25ldyhCSU8sIChjbXApKQorI2RlZmluZSBza19CSU9fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQklPKQorI2RlZmluZSBza19CSU9fZnJlZShzdCkgU0tNX3NrX2ZyZWUoQklPLCAoc3QpKQorI2RlZmluZSBza19CSU9fbnVtKHN0KSBTS01fc2tfbnVtKEJJTywgKHN0KSkKKyNkZWZpbmUgc2tfQklPX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQklPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0JJT19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChCSU8sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT196ZXJvKHN0KSBTS01fc2tfemVybyhCSU8sIChzdCkpCisjZGVmaW5lIHNrX0JJT19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEJJTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEJJTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEJJTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEJJTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JJT19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQklPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0JJT19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEJJTywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0JJT19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChCSU8sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0JJT19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhCSU8sIChzdCksIChjbXApKQorI2RlZmluZSBza19CSU9fZHVwKHN0KSBTS01fc2tfZHVwKEJJTywgc3QpCisjZGVmaW5lIHNrX0JJT19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQklPLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQklPX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQklPLCAoc3QpKQorI2RlZmluZSBza19CSU9fcG9wKHN0KSBTS01fc2tfcG9wKEJJTywgKHN0KSkKKyNkZWZpbmUgc2tfQklPX3NvcnQoc3QpIFNLTV9za19zb3J0KEJJTywgKHN0KSkKKyNkZWZpbmUgc2tfQklPX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChCSU8sIChzdCkpCisKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX25ldyhjbXApIFNLTV9za19uZXcoQllfRElSX0VOVFJZLCAoY21wKSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEJZX0RJUl9FTlRSWSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX2ZyZWUoc3QpIFNLTV9za19mcmVlKEJZX0RJUl9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX251bShzdCkgU0tNX3NrX251bShCWV9ESVJfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEJZX0RJUl9FTlRSWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQllfRElSX0VOVFJZLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfemVybyhzdCkgU0tNX3NrX3plcm8oQllfRElSX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChCWV9ESVJfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChCWV9ESVJfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChCWV9ESVJfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChCWV9ESVJfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEJZX0RJUl9FTlRSWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihCWV9ESVJfRU5UUlksIChzdCksIChwdHIpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQllfRElSX0VOVFJZLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQllfRElSX0VOVFJZLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX2R1cChzdCkgU0tNX3NrX2R1cChCWV9ESVJfRU5UUlksIHN0KQorI2RlZmluZSBza19CWV9ESVJfRU5UUllfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEJZX0RJUl9FTlRSWSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEJZX0RJUl9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfQllfRElSX0VOVFJZX3BvcChzdCkgU0tNX3NrX3BvcChCWV9ESVJfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9zb3J0KHN0KSBTS01fc2tfc29ydChCWV9ESVJfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9FTlRSWV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQllfRElSX0VOVFJZLCAoc3QpKQorCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX25ldyhjbXApIFNLTV9za19uZXcoQllfRElSX0hBU0gsIChjbXApKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChCWV9ESVJfSEFTSCkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQllfRElSX0hBU0gsIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX251bShzdCkgU0tNX3NrX251bShCWV9ESVJfSEFTSCwgKHN0KSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShCWV9ESVJfSEFTSCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChCWV9ESVJfSEFTSCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfemVybyhzdCkgU0tNX3NrX3plcm8oQllfRElSX0hBU0gsIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQllfRElSX0hBU0gsIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEJZX0RJUl9IQVNILCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChCWV9ESVJfSEFTSCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQllfRElSX0hBU0gsIChzdCksICh2YWwpKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQllfRElSX0hBU0gsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihCWV9ESVJfSEFTSCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEJZX0RJUl9IQVNILCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19CWV9ESVJfSEFTSF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhCWV9ESVJfSEFTSCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2R1cChzdCkgU0tNX3NrX2R1cChCWV9ESVJfSEFTSCwgc3QpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShCWV9ESVJfSEFTSCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQllfRElSX0hBU0gsIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX3BvcChzdCkgU0tNX3NrX3BvcChCWV9ESVJfSEFTSCwgKHN0KSkKKyNkZWZpbmUgc2tfQllfRElSX0hBU0hfc29ydChzdCkgU0tNX3NrX3NvcnQoQllfRElSX0hBU0gsIChzdCkpCisjZGVmaW5lIHNrX0JZX0RJUl9IQVNIX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChCWV9ESVJfSEFTSCwgKHN0KSkKKworI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX25ldyhjbXApIFNLTV9za19uZXcoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKGNtcCkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcykKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19mcmVlKHN0KSBTS01fc2tfZnJlZShDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX251bShzdCkgU0tNX3NrX251bShDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKHN0KSwgKGkpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfemVybyhzdCkgU0tNX3NrX3plcm8oQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCksIChjbXApKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX2R1cChzdCkgU0tNX3NrX2R1cChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCBzdCkKKyNkZWZpbmUgc2tfQ01TX0NlcnRpZmljYXRlQ2hvaWNlc19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQ01TX0NlcnRpZmljYXRlQ2hvaWNlcywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfc2hpZnQoc3QpIFNLTV9za19zaGlmdChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3BvcChzdCkgU0tNX3NrX3BvcChDTVNfQ2VydGlmaWNhdGVDaG9pY2VzLCAoc3QpKQorI2RlZmluZSBza19DTVNfQ2VydGlmaWNhdGVDaG9pY2VzX3NvcnQoc3QpIFNLTV9za19zb3J0KENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCkpCisjZGVmaW5lIHNrX0NNU19DZXJ0aWZpY2F0ZUNob2ljZXNfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENNU19DZXJ0aWZpY2F0ZUNob2ljZXMsIChzdCkpCisKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fbmV3KGNtcCkgU0tNX3NrX25ldyhDTVNfUmVjaXBpZW50SW5mbywgKGNtcCkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKENNU19SZWNpcGllbnRJbmZvKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb19mcmVlKHN0KSBTS01fc2tfZnJlZShDTVNfUmVjaXBpZW50SW5mbywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fbnVtKHN0KSBTS01fc2tfbnVtKENNU19SZWNpcGllbnRJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb196ZXJvKHN0KSBTS01fc2tfemVybyhDTVNfUmVjaXBpZW50SW5mbywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChDTVNfUmVjaXBpZW50SW5mbywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ01TX1JlY2lwaWVudEluZm8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChDTVNfUmVjaXBpZW50SW5mbywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDTVNfUmVjaXBpZW50SW5mbywgKHN0KSwgKGkpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQ01TX1JlY2lwaWVudEluZm8sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0NNU19SZWNpcGllbnRJbmZvX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fZHVwKHN0KSBTS01fc2tfZHVwKENNU19SZWNpcGllbnRJbmZvLCBzdCkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKENNU19SZWNpcGllbnRJbmZvLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fc2hpZnQoc3QpIFNLTV9za19zaGlmdChDTVNfUmVjaXBpZW50SW5mbywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9fcG9wKHN0KSBTS01fc2tfcG9wKENNU19SZWNpcGllbnRJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmVjaXBpZW50SW5mb19zb3J0KHN0KSBTS01fc2tfc29ydChDTVNfUmVjaXBpZW50SW5mbywgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1JlY2lwaWVudEluZm9faXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENNU19SZWNpcGllbnRJbmZvLCAoc3QpKQorCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9uZXcoY21wKSBTS01fc2tfbmV3KENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKGNtcCkpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9mcmVlKHN0KSBTS01fc2tfZnJlZShDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCkpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9udW0oc3QpIFNLTV9za19udW0oQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmV2b2NhdGlvbkluZm9DaG9pY2VfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3plcm8oc3QpIFNLTV9za196ZXJvKENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9kdXAoc3QpIFNLTV9za19kdXAoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCBzdCkKKyNkZWZpbmUgc2tfQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19DTVNfUmV2b2NhdGlvbkluZm9DaG9pY2Vfc2hpZnQoc3QpIFNLTV9za19zaGlmdChDTVNfUmV2b2NhdGlvbkluZm9DaG9pY2UsIChzdCkpCisjZGVmaW5lIHNrX0NNU19SZXZvY2F0aW9uSW5mb0Nob2ljZV9wb3Aoc3QpIFNLTV9za19wb3AoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmV2b2NhdGlvbkluZm9DaG9pY2Vfc29ydChzdCkgU0tNX3NrX3NvcnQoQ01TX1Jldm9jYXRpb25JbmZvQ2hvaWNlLCAoc3QpKQorI2RlZmluZSBza19DTVNfUmV2b2NhdGlvbkluZm9DaG9pY2VfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENNU19SZXZvY2F0aW9uSW5mb0Nob2ljZSwgKHN0KSkKKworI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19uZXcoY21wKSBTS01fc2tfbmV3KENNU19TaWduZXJJbmZvLCAoY21wKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQ01TX1NpZ25lckluZm8pCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX2ZyZWUoc3QpIFNLTV9za19mcmVlKENNU19TaWduZXJJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19udW0oc3QpIFNLTV9za19udW0oQ01TX1NpZ25lckluZm8sIChzdCkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQ01TX1NpZ25lckluZm8sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQ01TX1NpZ25lckluZm8sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX3plcm8oc3QpIFNLTV9za196ZXJvKENNU19TaWduZXJJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKENNU19TaWduZXJJbmZvLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChDTVNfU2lnbmVySW5mbywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoQ01TX1NpZ25lckluZm8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KENNU19TaWduZXJJbmZvLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKENNU19TaWduZXJJbmZvLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoQ01TX1NpZ25lckluZm8sIChzdCksIChwdHIpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChDTVNfU2lnbmVySW5mbywgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfQ01TX1NpZ25lckluZm9fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQ01TX1NpZ25lckluZm8sIChzdCksIChjbXApKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19kdXAoc3QpIFNLTV9za19kdXAoQ01TX1NpZ25lckluZm8sIHN0KQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQ01TX1NpZ25lckluZm8sIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KENNU19TaWduZXJJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19wb3Aoc3QpIFNLTV9za19wb3AoQ01TX1NpZ25lckluZm8sIChzdCkpCisjZGVmaW5lIHNrX0NNU19TaWduZXJJbmZvX3NvcnQoc3QpIFNLTV9za19zb3J0KENNU19TaWduZXJJbmZvLCAoc3QpKQorI2RlZmluZSBza19DTVNfU2lnbmVySW5mb19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQ01TX1NpZ25lckluZm8sIChzdCkpCisKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX25ldyhjbXApIFNLTV9za19uZXcoQ09ORl9JTU9EVUxFLCAoY21wKSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKENPTkZfSU1PRFVMRSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX2ZyZWUoc3QpIFNLTV9za19mcmVlKENPTkZfSU1PRFVMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX251bShzdCkgU0tNX3NrX251bShDT05GX0lNT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfSU1PRFVMRV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKENPTkZfSU1PRFVMRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoQ09ORl9JTU9EVUxFLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfemVybyhzdCkgU0tNX3NrX3plcm8oQ09ORl9JTU9EVUxFLCAoc3QpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChDT05GX0lNT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChDT05GX0lNT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDT05GX0lNT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChDT05GX0lNT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKENPTkZfSU1PRFVMRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDT05GX0lNT0RVTEUsIChzdCksIChwdHIpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQ09ORl9JTU9EVUxFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoQ09ORl9JTU9EVUxFLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX2R1cChzdCkgU0tNX3NrX2R1cChDT05GX0lNT0RVTEUsIHN0KQorI2RlZmluZSBza19DT05GX0lNT0RVTEVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKENPTkZfSU1PRFVMRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NPTkZfSU1PRFVMRV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KENPTkZfSU1PRFVMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9JTU9EVUxFX3BvcChzdCkgU0tNX3NrX3BvcChDT05GX0lNT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfSU1PRFVMRV9zb3J0KHN0KSBTS01fc2tfc29ydChDT05GX0lNT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfSU1PRFVMRV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoQ09ORl9JTU9EVUxFLCAoc3QpKQorCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX25ldyhjbXApIFNLTV9za19uZXcoQ09ORl9NT0RVTEUsIChjbXApKQorI2RlZmluZSBza19DT05GX01PRFVMRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChDT05GX01PRFVMRSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQ09ORl9NT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX251bShzdCkgU0tNX3NrX251bShDT05GX01PRFVMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShDT05GX01PRFVMRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19DT05GX01PRFVMRV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChDT05GX01PRFVMRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfemVybyhzdCkgU0tNX3NrX3plcm8oQ09ORl9NT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQ09ORl9NT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX01PRFVMRV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KENPTkZfTU9EVUxFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDT05GX01PRFVMRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQ09ORl9NT0RVTEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX01PRFVMRV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQ09ORl9NT0RVTEUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDT05GX01PRFVMRSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KENPTkZfTU9EVUxFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DT05GX01PRFVMRV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhDT05GX01PRFVMRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX2R1cChzdCkgU0tNX3NrX2R1cChDT05GX01PRFVMRSwgc3QpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShDT05GX01PRFVMRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQ09ORl9NT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX3BvcChzdCkgU0tNX3NrX3BvcChDT05GX01PRFVMRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9NT0RVTEVfc29ydChzdCkgU0tNX3NrX3NvcnQoQ09ORl9NT0RVTEUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfTU9EVUxFX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChDT05GX01PRFVMRSwgKHN0KSkKKworI2RlZmluZSBza19DT05GX1ZBTFVFX25ldyhjbXApIFNLTV9za19uZXcoQ09ORl9WQUxVRSwgKGNtcCkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoQ09ORl9WQUxVRSkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9mcmVlKHN0KSBTS01fc2tfZnJlZShDT05GX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX251bShzdCkgU0tNX3NrX251bShDT05GX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoQ09ORl9WQUxVRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENPTkZfVkFMVUUsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfemVybyhzdCkgU0tNX3NrX3plcm8oQ09ORl9WQUxVRSwgKHN0KSkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKENPTkZfVkFMVUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ09ORl9WQUxVRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDT05GX1ZBTFVFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KENPTkZfVkFMVUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDT05GX1ZBTFVFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDT05GX1ZBTFVFLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChDT05GX1ZBTFVFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENPTkZfVkFMVUUsIChzdCksIChjbXApKQorI2RlZmluZSBza19DT05GX1ZBTFVFX2R1cChzdCkgU0tNX3NrX2R1cChDT05GX1ZBTFVFLCBzdCkKKyNkZWZpbmUgc2tfQ09ORl9WQUxVRV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoQ09ORl9WQUxVRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChDT05GX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3BvcChzdCkgU0tNX3NrX3BvcChDT05GX1ZBTFVFLCAoc3QpKQorI2RlZmluZSBza19DT05GX1ZBTFVFX3NvcnQoc3QpIFNLTV9za19zb3J0KENPTkZfVkFMVUUsIChzdCkpCisjZGVmaW5lIHNrX0NPTkZfVkFMVUVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENPTkZfVkFMVUUsIChzdCkpCisKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfbmV3KGNtcCkgU0tNX3NrX25ldyhDUllQVE9fRVhfREFUQV9GVU5DUywgKGNtcCkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKENSWVBUT19FWF9EQVRBX0ZVTkNTKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19mcmVlKHN0KSBTS01fc2tfZnJlZShDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfbnVtKHN0KSBTS01fc2tfbnVtKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU196ZXJvKHN0KSBTS01fc2tfemVybyhDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MsIChzdCksICh2YWwpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSwgKGkpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoQ1JZUFRPX0VYX0RBVEFfRlVOQ1MsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0NSWVBUT19FWF9EQVRBX0ZVTkNTX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfZHVwKHN0KSBTS01fc2tfZHVwKENSWVBUT19FWF9EQVRBX0ZVTkNTLCBzdCkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1Nfc2hpZnQoc3QpIFNLTV9za19zaGlmdChDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfcG9wKHN0KSBTS01fc2tfcG9wKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19DUllQVE9fRVhfREFUQV9GVU5DU19zb3J0KHN0KSBTS01fc2tfc29ydChDUllQVE9fRVhfREFUQV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX0VYX0RBVEFfRlVOQ1NfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKENSWVBUT19FWF9EQVRBX0ZVTkNTLCAoc3QpKQorCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX25ldyhjbXApIFNLTV9za19uZXcoQ1JZUFRPX2R5bmxvY2ssIChjbXApKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChDUllQVE9fZHlubG9jaykKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfZnJlZShzdCkgU0tNX3NrX2ZyZWUoQ1JZUFRPX2R5bmxvY2ssIChzdCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX251bShzdCkgU0tNX3NrX251bShDUllQVE9fZHlubG9jaywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShDUllQVE9fZHlubG9jaywgKHN0KSwgKGkpKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChDUllQVE9fZHlubG9jaywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfemVybyhzdCkgU0tNX3NrX3plcm8oQ1JZUFRPX2R5bmxvY2ssIChzdCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goQ1JZUFRPX2R5bmxvY2ssIChzdCksICh2YWwpKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KENSWVBUT19keW5sb2NrLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChDUllQVE9fZHlubG9jaywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoQ1JZUFRPX2R5bmxvY2ssIChzdCksICh2YWwpKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoQ1JZUFRPX2R5bmxvY2ssIChzdCksIChpKSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihDUllQVE9fZHlubG9jaywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KENSWVBUT19keW5sb2NrLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19DUllQVE9fZHlubG9ja19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhDUllQVE9fZHlubG9jaywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX2R1cChzdCkgU0tNX3NrX2R1cChDUllQVE9fZHlubG9jaywgc3QpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShDUllQVE9fZHlubG9jaywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoQ1JZUFRPX2R5bmxvY2ssIChzdCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX3BvcChzdCkgU0tNX3NrX3BvcChDUllQVE9fZHlubG9jaywgKHN0KSkKKyNkZWZpbmUgc2tfQ1JZUFRPX2R5bmxvY2tfc29ydChzdCkgU0tNX3NrX3NvcnQoQ1JZUFRPX2R5bmxvY2ssIChzdCkpCisjZGVmaW5lIHNrX0NSWVBUT19keW5sb2NrX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChDUllQVE9fZHlubG9jaywgKHN0KSkKKworI2RlZmluZSBza19ESVNUX1BPSU5UX25ldyhjbXApIFNLTV9za19uZXcoRElTVF9QT0lOVCwgKGNtcCkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoRElTVF9QT0lOVCkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9mcmVlKHN0KSBTS01fc2tfZnJlZShESVNUX1BPSU5ULCAoc3QpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX251bShzdCkgU0tNX3NrX251bShESVNUX1BPSU5ULCAoc3QpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoRElTVF9QT0lOVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KERJU1RfUE9JTlQsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfemVybyhzdCkgU0tNX3NrX3plcm8oRElTVF9QT0lOVCwgKHN0KSkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKERJU1RfUE9JTlQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoRElTVF9QT0lOVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChESVNUX1BPSU5ULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KERJU1RfUE9JTlQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShESVNUX1BPSU5ULCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihESVNUX1BPSU5ULCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChESVNUX1BPSU5ULCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKERJU1RfUE9JTlQsIChzdCksIChjbXApKQorI2RlZmluZSBza19ESVNUX1BPSU5UX2R1cChzdCkgU0tNX3NrX2R1cChESVNUX1BPSU5ULCBzdCkKKyNkZWZpbmUgc2tfRElTVF9QT0lOVF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoRElTVF9QT0lOVCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfc2hpZnQoc3QpIFNLTV9za19zaGlmdChESVNUX1BPSU5ULCAoc3QpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3BvcChzdCkgU0tNX3NrX3BvcChESVNUX1BPSU5ULCAoc3QpKQorI2RlZmluZSBza19ESVNUX1BPSU5UX3NvcnQoc3QpIFNLTV9za19zb3J0KERJU1RfUE9JTlQsIChzdCkpCisjZGVmaW5lIHNrX0RJU1RfUE9JTlRfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKERJU1RfUE9JTlQsIChzdCkpCisKKyNkZWZpbmUgc2tfRU5HSU5FX25ldyhjbXApIFNLTV9za19uZXcoRU5HSU5FLCAoY21wKSkKKyNkZWZpbmUgc2tfRU5HSU5FX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEVOR0lORSkKKyNkZWZpbmUgc2tfRU5HSU5FX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVOR0lORSwgKHN0KSkKKyNkZWZpbmUgc2tfRU5HSU5FX251bShzdCkgU0tNX3NrX251bShFTkdJTkUsIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEVOR0lORSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FTkdJTkVfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRU5HSU5FLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfemVybyhzdCkgU0tNX3NrX3plcm8oRU5HSU5FLCAoc3QpKQorI2RlZmluZSBza19FTkdJTkVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChFTkdJTkUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFTkdJTkUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChFTkdJTkUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChFTkdJTkUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVOR0lORSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FTkdJTkVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihFTkdJTkUsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FTkdJTkVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoRU5HSU5FLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19FTkdJTkVfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRU5HSU5FLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfRU5HSU5FX2R1cChzdCkgU0tNX3NrX2R1cChFTkdJTkUsIHN0KQorI2RlZmluZSBza19FTkdJTkVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEVOR0lORSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0VOR0lORV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVOR0lORSwgKHN0KSkKKyNkZWZpbmUgc2tfRU5HSU5FX3BvcChzdCkgU0tNX3NrX3BvcChFTkdJTkUsIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9zb3J0KHN0KSBTS01fc2tfc29ydChFTkdJTkUsIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRU5HSU5FLCAoc3QpKQorCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fbmV3KGNtcCkgU0tNX3NrX25ldyhFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoY21wKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChFTkdJTkVfQ0xFQU5VUF9JVEVNKQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fbnVtKHN0KSBTS01fc2tfbnVtKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV96ZXJvKHN0KSBTS01fc2tfemVybyhFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoc3QpKQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCksIChwdHIpKQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fZHVwKHN0KSBTS01fc2tfZHVwKEVOR0lORV9DTEVBTlVQX0lURU0sIHN0KQorI2RlZmluZSBza19FTkdJTkVfQ0xFQU5VUF9JVEVNX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShFTkdJTkVfQ0xFQU5VUF9JVEVNLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fcG9wKHN0KSBTS01fc2tfcG9wKEVOR0lORV9DTEVBTlVQX0lURU0sIChzdCkpCisjZGVmaW5lIHNrX0VOR0lORV9DTEVBTlVQX0lURU1fc29ydChzdCkgU0tNX3NrX3NvcnQoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSkKKyNkZWZpbmUgc2tfRU5HSU5FX0NMRUFOVVBfSVRFTV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRU5HSU5FX0NMRUFOVVBfSVRFTSwgKHN0KSkKKworI2RlZmluZSBza19FU1NfQ0VSVF9JRF9uZXcoY21wKSBTS01fc2tfbmV3KEVTU19DRVJUX0lELCAoY21wKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoRVNTX0NFUlRfSUQpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVTU19DRVJUX0lELCAoc3QpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9udW0oc3QpIFNLTV9za19udW0oRVNTX0NFUlRfSUQsIChzdCkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoRVNTX0NFUlRfSUQsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRVNTX0NFUlRfSUQsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX3plcm8oc3QpIFNLTV9za196ZXJvKEVTU19DRVJUX0lELCAoc3QpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEVTU19DRVJUX0lELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFU1NfQ0VSVF9JRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoRVNTX0NFUlRfSUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEVTU19DRVJUX0lELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVTU19DRVJUX0lELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoRVNTX0NFUlRfSUQsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChFU1NfQ0VSVF9JRCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfRVNTX0NFUlRfSURfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRVNTX0NFUlRfSUQsIChzdCksIChjbXApKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9kdXAoc3QpIFNLTV9za19kdXAoRVNTX0NFUlRfSUQsIHN0KQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoRVNTX0NFUlRfSUQsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVTU19DRVJUX0lELCAoc3QpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9wb3Aoc3QpIFNLTV9za19wb3AoRVNTX0NFUlRfSUQsIChzdCkpCisjZGVmaW5lIHNrX0VTU19DRVJUX0lEX3NvcnQoc3QpIFNLTV9za19zb3J0KEVTU19DRVJUX0lELCAoc3QpKQorI2RlZmluZSBza19FU1NfQ0VSVF9JRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRVNTX0NFUlRfSUQsIChzdCkpCisKKyNkZWZpbmUgc2tfRVZQX01EX25ldyhjbXApIFNLTV9za19uZXcoRVZQX01ELCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX01EX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEVWUF9NRCkKKyNkZWZpbmUgc2tfRVZQX01EX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVWUF9NRCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX01EX251bShzdCkgU0tNX3NrX251bShFVlBfTUQsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9NRF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEVWUF9NRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfTURfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRVZQX01ELCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfemVybyhzdCkgU0tNX3NrX3plcm8oRVZQX01ELCAoc3QpKQorI2RlZmluZSBza19FVlBfTURfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChFVlBfTUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFVlBfTUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChFVlBfTUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChFVlBfTUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfTURfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVWUF9NRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfTURfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihFVlBfTUQsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FVlBfTURfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoRVZQX01ELCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19FVlBfTURfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRVZQX01ELCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX01EX2R1cChzdCkgU0tNX3NrX2R1cChFVlBfTUQsIHN0KQorI2RlZmluZSBza19FVlBfTURfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEVWUF9NRCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0VWUF9NRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVWUF9NRCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX01EX3BvcChzdCkgU0tNX3NrX3BvcChFVlBfTUQsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9NRF9zb3J0KHN0KSBTS01fc2tfc29ydChFVlBfTUQsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9NRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRVZQX01ELCAoc3QpKQorCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX25ldyhjbXApIFNLTV9za19uZXcoRVZQX1BCRV9DVEwsIChjbXApKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChFVlBfUEJFX0NUTCkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfZnJlZShzdCkgU0tNX3NrX2ZyZWUoRVZQX1BCRV9DVEwsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX251bShzdCkgU0tNX3NrX251bShFVlBfUEJFX0NUTCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShFVlBfUEJFX0NUTCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChFVlBfUEJFX0NUTCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfemVybyhzdCkgU0tNX3NrX3plcm8oRVZQX1BCRV9DVEwsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goRVZQX1BCRV9DVEwsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEVWUF9QQkVfQ1RMLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChFVlBfUEJFX0NUTCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoRVZQX1BCRV9DVEwsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoRVZQX1BCRV9DVEwsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihFVlBfUEJFX0NUTCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEVWUF9QQkVfQ1RMLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19FVlBfUEJFX0NUTF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhFVlBfUEJFX0NUTCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX2R1cChzdCkgU0tNX3NrX2R1cChFVlBfUEJFX0NUTCwgc3QpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShFVlBfUEJFX0NUTCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoRVZQX1BCRV9DVEwsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX3BvcChzdCkgU0tNX3NrX3BvcChFVlBfUEJFX0NUTCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX1BCRV9DVExfc29ydChzdCkgU0tNX3NrX3NvcnQoRVZQX1BCRV9DVEwsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QQkVfQ1RMX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChFVlBfUEJFX0NUTCwgKHN0KSkKKworI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9uZXcoY21wKSBTS01fc2tfbmV3KEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0RfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoRVZQX1BLRVlfQVNOMV9NRVRIT0QpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9udW0oc3QpIFNLTV9za19udW0oRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0Rfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3plcm8oc3QpIFNLTV9za196ZXJvKEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0RfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFVlBfUEtFWV9BU04xX01FVEhPRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0RfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChFVlBfUEtFWV9BU04xX01FVEhPRCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfQVNOMV9NRVRIT0Rfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChjbXApKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9kdXAoc3QpIFNLTV9za19kdXAoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIHN0KQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9wb3Aoc3QpIFNLTV9za19wb3AoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX0FTTjFfTUVUSE9EX3NvcnQoc3QpIFNLTV9za19zb3J0KEVWUF9QS0VZX0FTTjFfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9BU04xX01FVEhPRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRVZQX1BLRVlfQVNOMV9NRVRIT0QsIChzdCkpCisKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX25ldyhjbXApIFNLTV9za19uZXcoRVZQX1BLRVlfTUVUSE9ELCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEVWUF9QS0VZX01FVEhPRCkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX2ZyZWUoc3QpIFNLTV9za19mcmVlKEVWUF9QS0VZX01FVEhPRCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX251bShzdCkgU0tNX3NrX251bShFVlBfUEtFWV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX01FVEhPRF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEVWUF9QS0VZX01FVEhPRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0Rfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoRVZQX1BLRVlfTUVUSE9ELCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfemVybyhzdCkgU0tNX3NrX3plcm8oRVZQX1BLRVlfTUVUSE9ELCAoc3QpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChFVlBfUEtFWV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChFVlBfUEtFWV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChFVlBfUEtFWV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChFVlBfUEtFWV9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEVWUF9QS0VZX01FVEhPRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihFVlBfUEtFWV9NRVRIT0QsIChzdCksIChwdHIpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoRVZQX1BLRVlfTUVUSE9ELCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0Rfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoRVZQX1BLRVlfTUVUSE9ELCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX2R1cChzdCkgU0tNX3NrX2R1cChFVlBfUEtFWV9NRVRIT0QsIHN0KQorI2RlZmluZSBza19FVlBfUEtFWV9NRVRIT0RfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEVWUF9QS0VZX01FVEhPRCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0VWUF9QS0VZX01FVEhPRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEVWUF9QS0VZX01FVEhPRCwgKHN0KSkKKyNkZWZpbmUgc2tfRVZQX1BLRVlfTUVUSE9EX3BvcChzdCkgU0tNX3NrX3BvcChFVlBfUEtFWV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX01FVEhPRF9zb3J0KHN0KSBTS01fc2tfc29ydChFVlBfUEtFWV9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX0VWUF9QS0VZX01FVEhPRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoRVZQX1BLRVlfTUVUSE9ELCAoc3QpKQorCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9uZXcoY21wKSBTS01fc2tfbmV3KEdFTkVSQUxfTkFNRSwgKGNtcCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChHRU5FUkFMX05BTUUpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9mcmVlKHN0KSBTS01fc2tfZnJlZShHRU5FUkFMX05BTUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9udW0oc3QpIFNLTV9za19udW0oR0VORVJBTF9OQU1FLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShHRU5FUkFMX05BTUUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEdFTkVSQUxfTkFNRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3plcm8oc3QpIFNLTV9za196ZXJvKEdFTkVSQUxfTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goR0VORVJBTF9OQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoR0VORVJBTF9OQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoR0VORVJBTF9OQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoR0VORVJBTF9OQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShHRU5FUkFMX05BTUUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoR0VORVJBTF9OQU1FLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEdFTkVSQUxfTkFNRSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEdFTkVSQUxfTkFNRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9kdXAoc3QpIFNLTV9za19kdXAoR0VORVJBTF9OQU1FLCBzdCkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShHRU5FUkFMX05BTUUsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChHRU5FUkFMX05BTUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRV9wb3Aoc3QpIFNLTV9za19wb3AoR0VORVJBTF9OQU1FLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVfc29ydChzdCkgU0tNX3NrX3NvcnQoR0VORVJBTF9OQU1FLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEdFTkVSQUxfTkFNRSwgKHN0KSkKKworI2RlZmluZSBza19HRU5FUkFMX05BTUVTX25ldyhjbXApIFNLTV9za19uZXcoR0VORVJBTF9OQU1FUywgKGNtcCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoR0VORVJBTF9OQU1FUykKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19mcmVlKHN0KSBTS01fc2tfZnJlZShHRU5FUkFMX05BTUVTLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX251bShzdCkgU0tNX3NrX251bShHRU5FUkFMX05BTUVTLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoR0VORVJBTF9OQU1FUywgKHN0KSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEdFTkVSQUxfTkFNRVMsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfemVybyhzdCkgU0tNX3NrX3plcm8oR0VORVJBTF9OQU1FUywgKHN0KSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEdFTkVSQUxfTkFNRVMsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoR0VORVJBTF9OQU1FUywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChHRU5FUkFMX05BTUVTLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEdFTkVSQUxfTkFNRVMsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShHRU5FUkFMX05BTUVTLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihHRU5FUkFMX05BTUVTLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChHRU5FUkFMX05BTUVTLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEdFTkVSQUxfTkFNRVMsIChzdCksIChjbXApKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX2R1cChzdCkgU0tNX3NrX2R1cChHRU5FUkFMX05BTUVTLCBzdCkKKyNkZWZpbmUgc2tfR0VORVJBTF9OQU1FU19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoR0VORVJBTF9OQU1FUywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfc2hpZnQoc3QpIFNLTV9za19zaGlmdChHRU5FUkFMX05BTUVTLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3BvcChzdCkgU0tNX3NrX3BvcChHRU5FUkFMX05BTUVTLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX05BTUVTX3NvcnQoc3QpIFNLTV9za19zb3J0KEdFTkVSQUxfTkFNRVMsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfTkFNRVNfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEdFTkVSQUxfTkFNRVMsIChzdCkpCisKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX25ldyhjbXApIFNLTV9za19uZXcoR0VORVJBTF9TVUJUUkVFLCAoY21wKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEdFTkVSQUxfU1VCVFJFRSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX2ZyZWUoc3QpIFNLTV9za19mcmVlKEdFTkVSQUxfU1VCVFJFRSwgKHN0KSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX251bShzdCkgU0tNX3NrX251bShHRU5FUkFMX1NVQlRSRUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEdFTkVSQUxfU1VCVFJFRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoR0VORVJBTF9TVUJUUkVFLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfemVybyhzdCkgU0tNX3NrX3plcm8oR0VORVJBTF9TVUJUUkVFLCAoc3QpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChHRU5FUkFMX1NVQlRSRUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChHRU5FUkFMX1NVQlRSRUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChHRU5FUkFMX1NVQlRSRUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChHRU5FUkFMX1NVQlRSRUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEdFTkVSQUxfU1VCVFJFRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihHRU5FUkFMX1NVQlRSRUUsIChzdCksIChwdHIpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoR0VORVJBTF9TVUJUUkVFLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoR0VORVJBTF9TVUJUUkVFLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX2R1cChzdCkgU0tNX3NrX2R1cChHRU5FUkFMX1NVQlRSRUUsIHN0KQorI2RlZmluZSBza19HRU5FUkFMX1NVQlRSRUVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEdFTkVSQUxfU1VCVFJFRSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEdFTkVSQUxfU1VCVFJFRSwgKHN0KSkKKyNkZWZpbmUgc2tfR0VORVJBTF9TVUJUUkVFX3BvcChzdCkgU0tNX3NrX3BvcChHRU5FUkFMX1NVQlRSRUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9zb3J0KHN0KSBTS01fc2tfc29ydChHRU5FUkFMX1NVQlRSRUUsIChzdCkpCisjZGVmaW5lIHNrX0dFTkVSQUxfU1VCVFJFRV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoR0VORVJBTF9TVUJUUkVFLCAoc3QpKQorCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9uZXcoY21wKSBTS01fc2tfbmV3KElQQWRkcmVzc0ZhbWlseSwgKGNtcCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChJUEFkZHJlc3NGYW1pbHkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9mcmVlKHN0KSBTS01fc2tfZnJlZShJUEFkZHJlc3NGYW1pbHksIChzdCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9udW0oc3QpIFNLTV9za19udW0oSVBBZGRyZXNzRmFtaWx5LCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NGYW1pbHlfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShJUEFkZHJlc3NGYW1pbHksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KElQQWRkcmVzc0ZhbWlseSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3plcm8oc3QpIFNLTV9za196ZXJvKElQQWRkcmVzc0ZhbWlseSwgKHN0KSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShJUEFkZHJlc3NGYW1pbHksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoSVBBZGRyZXNzRmFtaWx5LCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KElQQWRkcmVzc0ZhbWlseSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKElQQWRkcmVzc0ZhbWlseSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9kdXAoc3QpIFNLTV9za19kdXAoSVBBZGRyZXNzRmFtaWx5LCBzdCkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzRmFtaWx5X3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShJUEFkZHJlc3NGYW1pbHksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19JUEFkZHJlc3NGYW1pbHlfc2hpZnQoc3QpIFNLTV9za19zaGlmdChJUEFkZHJlc3NGYW1pbHksIChzdCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc0ZhbWlseV9wb3Aoc3QpIFNLTV9za19wb3AoSVBBZGRyZXNzRmFtaWx5LCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NGYW1pbHlfc29ydChzdCkgU0tNX3NrX3NvcnQoSVBBZGRyZXNzRmFtaWx5LCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NGYW1pbHlfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKElQQWRkcmVzc0ZhbWlseSwgKHN0KSkKKworI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX25ldyhjbXApIFNLTV9za19uZXcoSVBBZGRyZXNzT3JSYW5nZSwgKGNtcCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoSVBBZGRyZXNzT3JSYW5nZSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9mcmVlKHN0KSBTS01fc2tfZnJlZShJUEFkZHJlc3NPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX251bShzdCkgU0tNX3NrX251bShJUEFkZHJlc3NPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoSVBBZGRyZXNzT3JSYW5nZSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KElQQWRkcmVzc09yUmFuZ2UsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfemVybyhzdCkgU0tNX3NrX3plcm8oSVBBZGRyZXNzT3JSYW5nZSwgKHN0KSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKElQQWRkcmVzc09yUmFuZ2UsIChzdCksICh2YWwpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoSVBBZGRyZXNzT3JSYW5nZSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChJUEFkZHJlc3NPclJhbmdlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KElQQWRkcmVzc09yUmFuZ2UsIChzdCksICh2YWwpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShJUEFkZHJlc3NPclJhbmdlLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihJUEFkZHJlc3NPclJhbmdlLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChJUEFkZHJlc3NPclJhbmdlLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKElQQWRkcmVzc09yUmFuZ2UsIChzdCksIChjbXApKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX2R1cChzdCkgU0tNX3NrX2R1cChJUEFkZHJlc3NPclJhbmdlLCBzdCkKKyNkZWZpbmUgc2tfSVBBZGRyZXNzT3JSYW5nZV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoSVBBZGRyZXNzT3JSYW5nZSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2Vfc2hpZnQoc3QpIFNLTV9za19zaGlmdChJUEFkZHJlc3NPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3BvcChzdCkgU0tNX3NrX3BvcChJUEFkZHJlc3NPclJhbmdlLCAoc3QpKQorI2RlZmluZSBza19JUEFkZHJlc3NPclJhbmdlX3NvcnQoc3QpIFNLTV9za19zb3J0KElQQWRkcmVzc09yUmFuZ2UsIChzdCkpCisjZGVmaW5lIHNrX0lQQWRkcmVzc09yUmFuZ2VfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKElQQWRkcmVzc09yUmFuZ2UsIChzdCkpCisKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfbmV3KGNtcCkgU0tNX3NrX25ldyhLUkI1X0FQUkVRQk9EWSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEtSQjVfQVBSRVFCT0RZKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X0FQUkVRQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfbnVtKHN0KSBTS01fc2tfbnVtKEtSQjVfQVBSRVFCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV96ZXJvKHN0KSBTS01fc2tfemVybyhLUkI1X0FQUkVRQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChLUkI1X0FQUkVRQk9EWSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9BUFJFUUJPRFksIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChLUkI1X0FQUkVRQk9EWSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X0FQUkVRQk9EWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoS1JCNV9BUFJFUUJPRFksIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVBSRVFCT0RZX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfZHVwKHN0KSBTS01fc2tfZHVwKEtSQjVfQVBSRVFCT0RZLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEtSQjVfQVBSRVFCT0RZLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X0FQUkVRQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfcG9wKHN0KSBTS01fc2tfcG9wKEtSQjVfQVBSRVFCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FQUkVRQk9EWV9zb3J0KHN0KSBTS01fc2tfc29ydChLUkI1X0FQUkVRQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BUFJFUUJPRFlfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfQVBSRVFCT0RZLCAoc3QpKQorCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfbmV3KGNtcCkgU0tNX3NrX25ldyhLUkI1X0FVVEhEQVRBLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChLUkI1X0FVVEhEQVRBKQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX2ZyZWUoc3QpIFNLTV9za19mcmVlKEtSQjVfQVVUSERBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfbnVtKHN0KSBTS01fc2tfbnVtKEtSQjVfQVVUSERBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShLUkI1X0FVVEhEQVRBLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoS1JCNV9BVVRIREFUQSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV96ZXJvKHN0KSBTS01fc2tfemVybyhLUkI1X0FVVEhEQVRBLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goS1JCNV9BVVRIREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChLUkI1X0FVVEhEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEtSQjVfQVVUSERBVEEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoS1JCNV9BVVRIREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEtSQjVfQVVUSERBVEEsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEtSQjVfQVVUSERBVEEsIChzdCksIChwdHIpKQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEtSQjVfQVVUSERBVEEsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoS1JCNV9BVVRIREFUQSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfZHVwKHN0KSBTS01fc2tfZHVwKEtSQjVfQVVUSERBVEEsIHN0KQorI2RlZmluZSBza19LUkI1X0FVVEhEQVRBX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShLUkI1X0FVVEhEQVRBLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEtSQjVfQVVUSERBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfcG9wKHN0KSBTS01fc2tfcG9wKEtSQjVfQVVUSERBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSERBVEFfc29ydChzdCkgU0tNX3NrX3NvcnQoS1JCNV9BVVRIREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIREFUQV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoS1JCNV9BVVRIREFUQSwgKHN0KSkKKworI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX25ldyhjbXApIFNLTV9za19uZXcoS1JCNV9BVVRIRU5UQk9EWSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoS1JCNV9BVVRIRU5UQk9EWSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X0FVVEhFTlRCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX251bShzdCkgU0tNX3NrX251bShLUkI1X0FVVEhFTlRCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoS1JCNV9BVVRIRU5UQk9EWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfQVVUSEVOVEJPRFksIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfemVybyhzdCkgU0tNX3NrX3plcm8oS1JCNV9BVVRIRU5UQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEtSQjVfQVVUSEVOVEJPRFksIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9BVVRIRU5UQk9EWSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChLUkI1X0FVVEhFTlRCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEtSQjVfQVVUSEVOVEJPRFksIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X0FVVEhFTlRCT0RZLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihLUkI1X0FVVEhFTlRCT0RZLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChLUkI1X0FVVEhFTlRCT0RZLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfQVVUSEVOVEJPRFksIChzdCksIChjbXApKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX2R1cChzdCkgU0tNX3NrX2R1cChLUkI1X0FVVEhFTlRCT0RZLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9BVVRIRU5UQk9EWV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoS1JCNV9BVVRIRU5UQk9EWSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X0FVVEhFTlRCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3BvcChzdCkgU0tNX3NrX3BvcChLUkI1X0FVVEhFTlRCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0FVVEhFTlRCT0RZX3NvcnQoc3QpIFNLTV9za19zb3J0KEtSQjVfQVVUSEVOVEJPRFksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQVVUSEVOVEJPRFlfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfQVVUSEVOVEJPRFksIChzdCkpCisKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9uZXcoY21wKSBTS01fc2tfbmV3KEtSQjVfQ0hFQ0tTVU0sIChjbXApKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEtSQjVfQ0hFQ0tTVU0pCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1fZnJlZShzdCkgU0tNX3NrX2ZyZWUoS1JCNV9DSEVDS1NVTSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9udW0oc3QpIFNLTV9za19udW0oS1JCNV9DSEVDS1NVTSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEtSQjVfQ0hFQ0tTVU0sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChLUkI1X0NIRUNLU1VNLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX3plcm8oc3QpIFNLTV9za196ZXJvKEtSQjVfQ0hFQ0tTVU0sIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChLUkI1X0NIRUNLU1VNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KEtSQjVfQ0hFQ0tTVU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoS1JCNV9DSEVDS1NVTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChLUkI1X0NIRUNLU1VNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoS1JCNV9DSEVDS1NVTSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoS1JCNV9DSEVDS1NVTSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoS1JCNV9DSEVDS1NVTSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhLUkI1X0NIRUNLU1VNLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9kdXAoc3QpIFNLTV9za19kdXAoS1JCNV9DSEVDS1NVTSwgc3QpCisjZGVmaW5lIHNrX0tSQjVfQ0hFQ0tTVU1fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEtSQjVfQ0hFQ0tTVU0sIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoS1JCNV9DSEVDS1NVTSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9wb3Aoc3QpIFNLTV9za19wb3AoS1JCNV9DSEVDS1NVTSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9DSEVDS1NVTV9zb3J0KHN0KSBTS01fc2tfc29ydChLUkI1X0NIRUNLU1VNLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0NIRUNLU1VNX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChLUkI1X0NIRUNLU1VNLCAoc3QpKQorCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9uZXcoY21wKSBTS01fc2tfbmV3KEtSQjVfRU5DREFUQSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChLUkI1X0VOQ0RBVEEpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X0VOQ0RBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9udW0oc3QpIFNLTV9za19udW0oS1JCNV9FTkNEQVRBLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0RBVEFfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShLUkI1X0VOQ0RBVEEsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfRU5DREFUQSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3plcm8oc3QpIFNLTV9za196ZXJvKEtSQjVfRU5DREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goS1JCNV9FTkNEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9FTkNEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoS1JCNV9FTkNEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoS1JCNV9FTkNEQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X0VOQ0RBVEEsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoS1JCNV9FTkNEQVRBLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEtSQjVfRU5DREFUQSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfRU5DREFUQSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9kdXAoc3QpIFNLTV9za19kdXAoS1JCNV9FTkNEQVRBLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9FTkNEQVRBX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShLUkI1X0VOQ0RBVEEsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19LUkI1X0VOQ0RBVEFfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X0VOQ0RBVEEsIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DREFUQV9wb3Aoc3QpIFNLTV9za19wb3AoS1JCNV9FTkNEQVRBLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0RBVEFfc29ydChzdCkgU0tNX3NrX3NvcnQoS1JCNV9FTkNEQVRBLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0RBVEFfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfRU5DREFUQSwgKHN0KSkKKworI2RlZmluZSBza19LUkI1X0VOQ0tFWV9uZXcoY21wKSBTS01fc2tfbmV3KEtSQjVfRU5DS0VZLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoS1JCNV9FTkNLRVkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX2ZyZWUoc3QpIFNLTV9za19mcmVlKEtSQjVfRU5DS0VZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9udW0oc3QpIFNLTV9za19udW0oS1JCNV9FTkNLRVksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoS1JCNV9FTkNLRVksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoS1JCNV9FTkNLRVksIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX3plcm8oc3QpIFNLTV9za196ZXJvKEtSQjVfRU5DS0VZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKEtSQjVfRU5DS0VZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChLUkI1X0VOQ0tFWSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoS1JCNV9FTkNLRVksIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KEtSQjVfRU5DS0VZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKEtSQjVfRU5DS0VZLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoS1JCNV9FTkNLRVksIChzdCksIChwdHIpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChLUkI1X0VOQ0tFWSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9FTkNLRVlfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoS1JCNV9FTkNLRVksIChzdCksIChjbXApKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9kdXAoc3QpIFNLTV9za19kdXAoS1JCNV9FTkNLRVksIHN0KQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoS1JCNV9FTkNLRVksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KEtSQjVfRU5DS0VZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9wb3Aoc3QpIFNLTV9za19wb3AoS1JCNV9FTkNLRVksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfRU5DS0VZX3NvcnQoc3QpIFNLTV9za19zb3J0KEtSQjVfRU5DS0VZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X0VOQ0tFWV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoS1JCNV9FTkNLRVksIChzdCkpCisKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfbmV3KGNtcCkgU0tNX3NrX25ldyhLUkI1X1BSSU5DTkFNRSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKEtSQjVfUFJJTkNOQU1FKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X1BSSU5DTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfbnVtKHN0KSBTS01fc2tfbnVtKEtSQjVfUFJJTkNOQU1FLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV96ZXJvKHN0KSBTS01fc2tfemVybyhLUkI1X1BSSU5DTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChLUkI1X1BSSU5DTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9QUklOQ05BTUUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChLUkI1X1BSSU5DTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X1BSSU5DTkFNRSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoS1JCNV9QUklOQ05BTUUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX0tSQjVfUFJJTkNOQU1FX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfZHVwKHN0KSBTS01fc2tfZHVwKEtSQjVfUFJJTkNOQU1FLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKEtSQjVfUFJJTkNOQU1FLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X1BSSU5DTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfcG9wKHN0KSBTS01fc2tfcG9wKEtSQjVfUFJJTkNOQU1FLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1BSSU5DTkFNRV9zb3J0KHN0KSBTS01fc2tfc29ydChLUkI1X1BSSU5DTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9QUklOQ05BTUVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfUFJJTkNOQU1FLCAoc3QpKQorCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9uZXcoY21wKSBTS01fc2tfbmV3KEtSQjVfVEtUQk9EWSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChLUkI1X1RLVEJPRFkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9mcmVlKHN0KSBTS01fc2tfZnJlZShLUkI1X1RLVEJPRFksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9udW0oc3QpIFNLTV9za19udW0oS1JCNV9US1RCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1RLVEJPRFlfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShLUkI1X1RLVEJPRFksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KEtSQjVfVEtUQk9EWSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3plcm8oc3QpIFNLTV9za196ZXJvKEtSQjVfVEtUQk9EWSwgKHN0KSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goS1JCNV9US1RCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoS1JCNV9US1RCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoS1JCNV9US1RCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoS1JCNV9US1RCT0RZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShLUkI1X1RLVEJPRFksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoS1JCNV9US1RCT0RZLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KEtSQjVfVEtUQk9EWSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKEtSQjVfVEtUQk9EWSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9kdXAoc3QpIFNLTV9za19kdXAoS1JCNV9US1RCT0RZLCBzdCkKKyNkZWZpbmUgc2tfS1JCNV9US1RCT0RZX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShLUkI1X1RLVEJPRFksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19LUkI1X1RLVEJPRFlfc2hpZnQoc3QpIFNLTV9za19zaGlmdChLUkI1X1RLVEJPRFksIChzdCkpCisjZGVmaW5lIHNrX0tSQjVfVEtUQk9EWV9wb3Aoc3QpIFNLTV9za19wb3AoS1JCNV9US1RCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1RLVEJPRFlfc29ydChzdCkgU0tNX3NrX3NvcnQoS1JCNV9US1RCT0RZLCAoc3QpKQorI2RlZmluZSBza19LUkI1X1RLVEJPRFlfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKEtSQjVfVEtUQk9EWSwgKHN0KSkKKworI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfbmV3KGNtcCkgU0tNX3NrX25ldyhNRU1fT0JKRUNUX0RBVEEsIChjbXApKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoTUVNX09CSkVDVF9EQVRBKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfZnJlZShzdCkgU0tNX3NrX2ZyZWUoTUVNX09CSkVDVF9EQVRBLCAoc3QpKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfbnVtKHN0KSBTS01fc2tfbnVtKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfTUVNX09CSkVDVF9EQVRBX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoTUVNX09CSkVDVF9EQVRBLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChNRU1fT0JKRUNUX0RBVEEsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV96ZXJvKHN0KSBTS01fc2tfemVybyhNRU1fT0JKRUNUX0RBVEEsIChzdCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoTUVNX09CSkVDVF9EQVRBLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChNRU1fT0JKRUNUX0RBVEEsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhNRU1fT0JKRUNUX0RBVEEsIChzdCksIChjbXApKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfZHVwKHN0KSBTS01fc2tfZHVwKE1FTV9PQkpFQ1RfREFUQSwgc3QpCisjZGVmaW5lIHNrX01FTV9PQkpFQ1RfREFUQV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoTUVNX09CSkVDVF9EQVRBLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfTUVNX09CSkVDVF9EQVRBX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoTUVNX09CSkVDVF9EQVRBLCAoc3QpKQorI2RlZmluZSBza19NRU1fT0JKRUNUX0RBVEFfcG9wKHN0KSBTS01fc2tfcG9wKE1FTV9PQkpFQ1RfREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfTUVNX09CSkVDVF9EQVRBX3NvcnQoc3QpIFNLTV9za19zb3J0KE1FTV9PQkpFQ1RfREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfTUVNX09CSkVDVF9EQVRBX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChNRU1fT0JKRUNUX0RBVEEsIChzdCkpCisKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfbmV3KGNtcCkgU0tNX3NrX25ldyhNSU1FX0hFQURFUiwgKGNtcCkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKE1JTUVfSEVBREVSKQorI2RlZmluZSBza19NSU1FX0hFQURFUl9mcmVlKHN0KSBTS01fc2tfZnJlZShNSU1FX0hFQURFUiwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfbnVtKHN0KSBTS01fc2tfbnVtKE1JTUVfSEVBREVSLCAoc3QpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKE1JTUVfSEVBREVSLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KE1JTUVfSEVBREVSLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl96ZXJvKHN0KSBTS01fc2tfemVybyhNSU1FX0hFQURFUiwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChNSU1FX0hFQURFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoTUlNRV9IRUFERVIsIChzdCksICh2YWwpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKE1JTUVfSEVBREVSLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChNSU1FX0hFQURFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShNSU1FX0hFQURFUiwgKHN0KSwgKGkpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKE1JTUVfSEVBREVSLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoTUlNRV9IRUFERVIsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX01JTUVfSEVBREVSX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKE1JTUVfSEVBREVSLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfZHVwKHN0KSBTS01fc2tfZHVwKE1JTUVfSEVBREVSLCBzdCkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKE1JTUVfSEVBREVSLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfc2hpZnQoc3QpIFNLTV9za19zaGlmdChNSU1FX0hFQURFUiwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfcG9wKHN0KSBTS01fc2tfcG9wKE1JTUVfSEVBREVSLCAoc3QpKQorI2RlZmluZSBza19NSU1FX0hFQURFUl9zb3J0KHN0KSBTS01fc2tfc29ydChNSU1FX0hFQURFUiwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9IRUFERVJfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKE1JTUVfSEVBREVSLCAoc3QpKQorCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fbmV3KGNtcCkgU0tNX3NrX25ldyhNSU1FX1BBUkFNLCAoY21wKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChNSU1FX1BBUkFNKQorI2RlZmluZSBza19NSU1FX1BBUkFNX2ZyZWUoc3QpIFNLTV9za19mcmVlKE1JTUVfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fbnVtKHN0KSBTS01fc2tfbnVtKE1JTUVfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShNSU1FX1BBUkFNLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoTUlNRV9QQVJBTSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV96ZXJvKHN0KSBTS01fc2tfemVybyhNSU1FX1BBUkFNLCAoc3QpKQorI2RlZmluZSBza19NSU1FX1BBUkFNX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goTUlNRV9QQVJBTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChNSU1FX1BBUkFNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKE1JTUVfUEFSQU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19NSU1FX1BBUkFNX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoTUlNRV9QQVJBTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE1JTUVfUEFSQU0sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKE1JTUVfUEFSQU0sIChzdCksIChwdHIpKQorI2RlZmluZSBza19NSU1FX1BBUkFNX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KE1JTUVfUEFSQU0sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoTUlNRV9QQVJBTSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fZHVwKHN0KSBTS01fc2tfZHVwKE1JTUVfUEFSQU0sIHN0KQorI2RlZmluZSBza19NSU1FX1BBUkFNX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShNSU1FX1BBUkFNLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KE1JTUVfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fcG9wKHN0KSBTS01fc2tfcG9wKE1JTUVfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX01JTUVfUEFSQU1fc29ydChzdCkgU0tNX3NrX3NvcnQoTUlNRV9QQVJBTSwgKHN0KSkKKyNkZWZpbmUgc2tfTUlNRV9QQVJBTV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoTUlNRV9QQVJBTSwgKHN0KSkKKworI2RlZmluZSBza19OQU1FX0ZVTkNTX25ldyhjbXApIFNLTV9za19uZXcoTkFNRV9GVU5DUywgKGNtcCkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoTkFNRV9GVU5DUykKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19mcmVlKHN0KSBTS01fc2tfZnJlZShOQU1FX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX251bShzdCkgU0tNX3NrX251bShOQU1FX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoTkFNRV9GVU5DUywgKHN0KSwgKGkpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KE5BTUVfRlVOQ1MsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfemVybyhzdCkgU0tNX3NrX3plcm8oTkFNRV9GVU5DUywgKHN0KSkKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKE5BTUVfRlVOQ1MsIChzdCksICh2YWwpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoTkFNRV9GVU5DUywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChOQU1FX0ZVTkNTLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KE5BTUVfRlVOQ1MsIChzdCksICh2YWwpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShOQU1FX0ZVTkNTLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihOQU1FX0ZVTkNTLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChOQU1FX0ZVTkNTLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKE5BTUVfRlVOQ1MsIChzdCksIChjbXApKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX2R1cChzdCkgU0tNX3NrX2R1cChOQU1FX0ZVTkNTLCBzdCkKKyNkZWZpbmUgc2tfTkFNRV9GVU5DU19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoTkFNRV9GVU5DUywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1Nfc2hpZnQoc3QpIFNLTV9za19zaGlmdChOQU1FX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3BvcChzdCkgU0tNX3NrX3BvcChOQU1FX0ZVTkNTLCAoc3QpKQorI2RlZmluZSBza19OQU1FX0ZVTkNTX3NvcnQoc3QpIFNLTV9za19zb3J0KE5BTUVfRlVOQ1MsIChzdCkpCisjZGVmaW5lIHNrX05BTUVfRlVOQ1NfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKE5BTUVfRlVOQ1MsIChzdCkpCisKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfbmV3KGNtcCkgU0tNX3NrX25ldyhPQ1NQX0NFUlRJRCwgKGNtcCkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKE9DU1BfQ0VSVElEKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF9mcmVlKHN0KSBTS01fc2tfZnJlZShPQ1NQX0NFUlRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfbnVtKHN0KSBTS01fc2tfbnVtKE9DU1BfQ0VSVElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKE9DU1BfQ0VSVElELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KE9DU1BfQ0VSVElELCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF96ZXJvKHN0KSBTS01fc2tfemVybyhPQ1NQX0NFUlRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChPQ1NQX0NFUlRJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoT0NTUF9DRVJUSUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKE9DU1BfQ0VSVElELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChPQ1NQX0NFUlRJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShPQ1NQX0NFUlRJRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKE9DU1BfQ0VSVElELCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoT0NTUF9DRVJUSUQsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX09DU1BfQ0VSVElEX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKE9DU1BfQ0VSVElELCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfZHVwKHN0KSBTS01fc2tfZHVwKE9DU1BfQ0VSVElELCBzdCkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKE9DU1BfQ0VSVElELCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfc2hpZnQoc3QpIFNLTV9za19zaGlmdChPQ1NQX0NFUlRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfcG9wKHN0KSBTS01fc2tfcG9wKE9DU1BfQ0VSVElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX0NFUlRJRF9zb3J0KHN0KSBTS01fc2tfc29ydChPQ1NQX0NFUlRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9DRVJUSURfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKE9DU1BfQ0VSVElELCAoc3QpKQorCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX25ldyhjbXApIFNLTV9za19uZXcoT0NTUF9PTkVSRVEsIChjbXApKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChPQ1NQX09ORVJFUSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfZnJlZShzdCkgU0tNX3NrX2ZyZWUoT0NTUF9PTkVSRVEsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX251bShzdCkgU0tNX3NrX251bShPQ1NQX09ORVJFUSwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShPQ1NQX09ORVJFUSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChPQ1NQX09ORVJFUSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfemVybyhzdCkgU0tNX3NrX3plcm8oT0NTUF9PTkVSRVEsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goT0NTUF9PTkVSRVEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KE9DU1BfT05FUkVRLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChPQ1NQX09ORVJFUSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoT0NTUF9PTkVSRVEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoT0NTUF9PTkVSRVEsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihPQ1NQX09ORVJFUSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KE9DU1BfT05FUkVRLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19PQ1NQX09ORVJFUV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhPQ1NQX09ORVJFUSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX2R1cChzdCkgU0tNX3NrX2R1cChPQ1NQX09ORVJFUSwgc3QpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShPQ1NQX09ORVJFUSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoT0NTUF9PTkVSRVEsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX3BvcChzdCkgU0tNX3NrX3BvcChPQ1NQX09ORVJFUSwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9PTkVSRVFfc29ydChzdCkgU0tNX3NrX3NvcnQoT0NTUF9PTkVSRVEsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfT05FUkVRX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChPQ1NQX09ORVJFUSwgKHN0KSkKKworI2RlZmluZSBza19PQ1NQX1JFU1BJRF9uZXcoY21wKSBTS01fc2tfbmV3KE9DU1BfUkVTUElELCAoY21wKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoT0NTUF9SRVNQSUQpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX2ZyZWUoc3QpIFNLTV9za19mcmVlKE9DU1BfUkVTUElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9udW0oc3QpIFNLTV9za19udW0oT0NTUF9SRVNQSUQsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoT0NTUF9SRVNQSUQsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoT0NTUF9SRVNQSUQsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX3plcm8oc3QpIFNLTV9za196ZXJvKE9DU1BfUkVTUElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKE9DU1BfUkVTUElELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChPQ1NQX1JFU1BJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoT0NTUF9SRVNQSUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KE9DU1BfUkVTUElELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE9DU1BfUkVTUElELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoT0NTUF9SRVNQSUQsIChzdCksIChwdHIpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChPQ1NQX1JFU1BJRCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfT0NTUF9SRVNQSURfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoT0NTUF9SRVNQSUQsIChzdCksIChjbXApKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9kdXAoc3QpIFNLTV9za19kdXAoT0NTUF9SRVNQSUQsIHN0KQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoT0NTUF9SRVNQSUQsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KE9DU1BfUkVTUElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9wb3Aoc3QpIFNLTV9za19wb3AoT0NTUF9SRVNQSUQsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfUkVTUElEX3NvcnQoc3QpIFNLTV9za19zb3J0KE9DU1BfUkVTUElELCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1JFU1BJRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoT0NTUF9SRVNQSUQsIChzdCkpCisKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX25ldyhjbXApIFNLTV9za19uZXcoT0NTUF9TSU5HTEVSRVNQLCAoY21wKSkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKE9DU1BfU0lOR0xFUkVTUCkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX2ZyZWUoc3QpIFNLTV9za19mcmVlKE9DU1BfU0lOR0xFUkVTUCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX251bShzdCkgU0tNX3NrX251bShPQ1NQX1NJTkdMRVJFU1AsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfU0lOR0xFUkVTUF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKE9DU1BfU0lOR0xFUkVTUCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1Bfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoT0NTUF9TSU5HTEVSRVNQLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfemVybyhzdCkgU0tNX3NrX3plcm8oT0NTUF9TSU5HTEVSRVNQLCAoc3QpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChPQ1NQX1NJTkdMRVJFU1AsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChPQ1NQX1NJTkdMRVJFU1AsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChPQ1NQX1NJTkdMRVJFU1AsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChPQ1NQX1NJTkdMRVJFU1AsIChzdCksICh2YWwpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE9DU1BfU0lOR0xFUkVTUCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihPQ1NQX1NJTkdMRVJFU1AsIChzdCksIChwdHIpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoT0NTUF9TSU5HTEVSRVNQLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1Bfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoT0NTUF9TSU5HTEVSRVNQLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX2R1cChzdCkgU0tNX3NrX2R1cChPQ1NQX1NJTkdMRVJFU1AsIHN0KQorI2RlZmluZSBza19PQ1NQX1NJTkdMRVJFU1BfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKE9DU1BfU0lOR0xFUkVTUCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX09DU1BfU0lOR0xFUkVTUF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KE9DU1BfU0lOR0xFUkVTUCwgKHN0KSkKKyNkZWZpbmUgc2tfT0NTUF9TSU5HTEVSRVNQX3BvcChzdCkgU0tNX3NrX3BvcChPQ1NQX1NJTkdMRVJFU1AsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfU0lOR0xFUkVTUF9zb3J0KHN0KSBTS01fc2tfc29ydChPQ1NQX1NJTkdMRVJFU1AsIChzdCkpCisjZGVmaW5lIHNrX09DU1BfU0lOR0xFUkVTUF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoT0NTUF9TSU5HTEVSRVNQLCAoc3QpKQorCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX25ldyhjbXApIFNLTV9za19uZXcoUEtDUzEyX1NBRkVCQUcsIChjbXApKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChQS0NTMTJfU0FGRUJBRykKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfZnJlZShzdCkgU0tNX3NrX2ZyZWUoUEtDUzEyX1NBRkVCQUcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX251bShzdCkgU0tNX3NrX251bShQS0NTMTJfU0FGRUJBRywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfemVybyhzdCkgU0tNX3NrX3plcm8oUEtDUzEyX1NBRkVCQUcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goUEtDUzEyX1NBRkVCQUcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFBLQ1MxMl9TQUZFQkFHLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChQS0NTMTJfU0FGRUJBRywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoUEtDUzEyX1NBRkVCQUcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoUEtDUzEyX1NBRkVCQUcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihQS0NTMTJfU0FGRUJBRywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFBLQ1MxMl9TQUZFQkFHLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19QS0NTMTJfU0FGRUJBR19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX2R1cChzdCkgU0tNX3NrX2R1cChQS0NTMTJfU0FGRUJBRywgc3QpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoUEtDUzEyX1NBRkVCQUcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX3BvcChzdCkgU0tNX3NrX3BvcChQS0NTMTJfU0FGRUJBRywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzEyX1NBRkVCQUdfc29ydChzdCkgU0tNX3NrX3NvcnQoUEtDUzEyX1NBRkVCQUcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1MxMl9TQUZFQkFHX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChQS0NTMTJfU0FGRUJBRywgKHN0KSkKKworI2RlZmluZSBza19QS0NTN19uZXcoY21wKSBTS01fc2tfbmV3KFBLQ1M3LCAoY21wKSkKKyNkZWZpbmUgc2tfUEtDUzdfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoUEtDUzcpCisjZGVmaW5lIHNrX1BLQ1M3X2ZyZWUoc3QpIFNLTV9za19mcmVlKFBLQ1M3LCAoc3QpKQorI2RlZmluZSBza19QS0NTN19udW0oc3QpIFNLTV9za19udW0oUEtDUzcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoUEtDUzcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoUEtDUzcsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1M3X3plcm8oc3QpIFNLTV9za196ZXJvKFBLQ1M3LCAoc3QpKQorI2RlZmluZSBza19QS0NTN19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFBLQ1M3LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChQS0NTNywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1M3X2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoUEtDUzcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFBLQ1M3LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFBLQ1M3LCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1BLQ1M3X2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoUEtDUzcsIChzdCksIChwdHIpKQorI2RlZmluZSBza19QS0NTN19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChQS0NTNywgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoUEtDUzcsIChzdCksIChjbXApKQorI2RlZmluZSBza19QS0NTN19kdXAoc3QpIFNLTV9za19kdXAoUEtDUzcsIHN0KQorI2RlZmluZSBza19QS0NTN19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoUEtDUzcsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19QS0NTN19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFBLQ1M3LCAoc3QpKQorI2RlZmluZSBza19QS0NTN19wb3Aoc3QpIFNLTV9za19wb3AoUEtDUzcsIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X3NvcnQoc3QpIFNLTV9za19zb3J0KFBLQ1M3LCAoc3QpKQorI2RlZmluZSBza19QS0NTN19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoUEtDUzcsIChzdCkpCisKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19uZXcoY21wKSBTS01fc2tfbmV3KFBLQ1M3X1JFQ0lQX0lORk8sIChjbXApKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFBLQ1M3X1JFQ0lQX0lORk8pCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZnJlZShzdCkgU0tNX3NrX2ZyZWUoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19udW0oc3QpIFNLTV9za19udW0oUEtDUzdfUkVDSVBfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFBLQ1M3X1JFQ0lQX0lORk8sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3plcm8oc3QpIFNLTV9za196ZXJvKFBLQ1M3X1JFQ0lQX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFBLQ1M3X1JFQ0lQX0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19kdXAoc3QpIFNLTV9za19kdXAoUEtDUzdfUkVDSVBfSU5GTywgc3QpCisjZGVmaW5lIHNrX1BLQ1M3X1JFQ0lQX0lORk9fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFBLQ1M3X1JFQ0lQX0lORk8sIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19wb3Aoc3QpIFNLTV9za19wb3AoUEtDUzdfUkVDSVBfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfUkVDSVBfSU5GT19zb3J0KHN0KSBTS01fc2tfc29ydChQS0NTN19SRUNJUF9JTkZPLCAoc3QpKQorI2RlZmluZSBza19QS0NTN19SRUNJUF9JTkZPX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChQS0NTN19SRUNJUF9JTkZPLCAoc3QpKQorCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX25ldyhjbXApIFNLTV9za19uZXcoUEtDUzdfU0lHTkVSX0lORk8sIChjbXApKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChQS0NTN19TSUdORVJfSU5GTykKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fZnJlZShzdCkgU0tNX3NrX2ZyZWUoUEtDUzdfU0lHTkVSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX251bShzdCkgU0tNX3NrX251bShQS0NTN19TSUdORVJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9femVybyhzdCkgU0tNX3NrX3plcm8oUEtDUzdfU0lHTkVSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goUEtDUzdfU0lHTkVSX0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFBLQ1M3X1NJR05FUl9JTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoUEtDUzdfU0lHTkVSX0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoUEtDUzdfU0lHTkVSX0lORk8sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFBLQ1M3X1NJR05FUl9JTkZPLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19QS0NTN19TSUdORVJfSU5GT19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2R1cChzdCkgU0tNX3NrX2R1cChQS0NTN19TSUdORVJfSU5GTywgc3QpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShQS0NTN19TSUdORVJfSU5GTywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoUEtDUzdfU0lHTkVSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX3BvcChzdCkgU0tNX3NrX3BvcChQS0NTN19TSUdORVJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUEtDUzdfU0lHTkVSX0lORk9fc29ydChzdCkgU0tNX3NrX3NvcnQoUEtDUzdfU0lHTkVSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1BLQ1M3X1NJR05FUl9JTkZPX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChQS0NTN19TSUdORVJfSU5GTywgKHN0KSkKKworI2RlZmluZSBza19QT0xJQ1lJTkZPX25ldyhjbXApIFNLTV9za19uZXcoUE9MSUNZSU5GTywgKGNtcCkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoUE9MSUNZSU5GTykKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19mcmVlKHN0KSBTS01fc2tfZnJlZShQT0xJQ1lJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX251bShzdCkgU0tNX3NrX251bShQT0xJQ1lJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoUE9MSUNZSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFBPTElDWUlORk8sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9femVybyhzdCkgU0tNX3NrX3plcm8oUE9MSUNZSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFBPTElDWUlORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoUE9MSUNZSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9fZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChQT0xJQ1lJTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFBPTElDWUlORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShQT0xJQ1lJTkZPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9fZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihQT0xJQ1lJTkZPLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChQT0xJQ1lJTkZPLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFBPTElDWUlORk8sIChzdCksIChjbXApKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX2R1cChzdCkgU0tNX3NrX2R1cChQT0xJQ1lJTkZPLCBzdCkKKyNkZWZpbmUgc2tfUE9MSUNZSU5GT19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoUE9MSUNZSU5GTywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1BPTElDWUlORk9fc2hpZnQoc3QpIFNLTV9za19zaGlmdChQT0xJQ1lJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3BvcChzdCkgU0tNX3NrX3BvcChQT0xJQ1lJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lJTkZPX3NvcnQoc3QpIFNLTV9za19zb3J0KFBPTElDWUlORk8sIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWUlORk9faXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFBPTElDWUlORk8sIChzdCkpCisKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fbmV3KGNtcCkgU0tNX3NrX25ldyhQT0xJQ1lRVUFMSU5GTywgKGNtcCkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFBPTElDWVFVQUxJTkZPKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19mcmVlKHN0KSBTS01fc2tfZnJlZShQT0xJQ1lRVUFMSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fbnVtKHN0KSBTS01fc2tfbnVtKFBPTElDWVFVQUxJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT196ZXJvKHN0KSBTS01fc2tfemVybyhQT0xJQ1lRVUFMSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChQT0xJQ1lRVUFMSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoUE9MSUNZUVVBTElORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChQT0xJQ1lRVUFMSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShQT0xJQ1lRVUFMSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoUE9MSUNZUVVBTElORk8sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1BPTElDWVFVQUxJTkZPX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fZHVwKHN0KSBTS01fc2tfZHVwKFBPTElDWVFVQUxJTkZPLCBzdCkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fc2hpZnQoc3QpIFNLTV9za19zaGlmdChQT0xJQ1lRVUFMSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9fcG9wKHN0KSBTS01fc2tfcG9wKFBPTElDWVFVQUxJTkZPLCAoc3QpKQorI2RlZmluZSBza19QT0xJQ1lRVUFMSU5GT19zb3J0KHN0KSBTS01fc2tfc29ydChQT0xJQ1lRVUFMSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZUVVBTElORk9faXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFBPTElDWVFVQUxJTkZPLCAoc3QpKQorCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX25ldyhjbXApIFNLTV9za19uZXcoUE9MSUNZX01BUFBJTkcsIChjbXApKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChQT0xJQ1lfTUFQUElORykKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfZnJlZShzdCkgU0tNX3NrX2ZyZWUoUE9MSUNZX01BUFBJTkcsIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX251bShzdCkgU0tNX3NrX251bShQT0xJQ1lfTUFQUElORywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShQT0xJQ1lfTUFQUElORywgKHN0KSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChQT0xJQ1lfTUFQUElORywgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfemVybyhzdCkgU0tNX3NrX3plcm8oUE9MSUNZX01BUFBJTkcsIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goUE9MSUNZX01BUFBJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFBPTElDWV9NQVBQSU5HLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChQT0xJQ1lfTUFQUElORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoUE9MSUNZX01BUFBJTkcsIChzdCksICh2YWwpKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoUE9MSUNZX01BUFBJTkcsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihQT0xJQ1lfTUFQUElORywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFBPTElDWV9NQVBQSU5HLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19QT0xJQ1lfTUFQUElOR19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhQT0xJQ1lfTUFQUElORywgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2R1cChzdCkgU0tNX3NrX2R1cChQT0xJQ1lfTUFQUElORywgc3QpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShQT0xJQ1lfTUFQUElORywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoUE9MSUNZX01BUFBJTkcsIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX3BvcChzdCkgU0tNX3NrX3BvcChQT0xJQ1lfTUFQUElORywgKHN0KSkKKyNkZWZpbmUgc2tfUE9MSUNZX01BUFBJTkdfc29ydChzdCkgU0tNX3NrX3NvcnQoUE9MSUNZX01BUFBJTkcsIChzdCkpCisjZGVmaW5lIHNrX1BPTElDWV9NQVBQSU5HX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChQT0xJQ1lfTUFQUElORywgKHN0KSkKKworI2RlZmluZSBza19TU0xfQ0lQSEVSX25ldyhjbXApIFNLTV9za19uZXcoU1NMX0NJUEhFUiwgKGNtcCkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoU1NMX0NJUEhFUikKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9mcmVlKHN0KSBTS01fc2tfZnJlZShTU0xfQ0lQSEVSLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX251bShzdCkgU0tNX3NrX251bShTU0xfQ0lQSEVSLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoU1NMX0NJUEhFUiwgKHN0KSwgKGkpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFNTTF9DSVBIRVIsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfemVybyhzdCkgU0tNX3NrX3plcm8oU1NMX0NJUEhFUiwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFNTTF9DSVBIRVIsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoU1NMX0NJUEhFUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChTU0xfQ0lQSEVSLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFNTTF9DSVBIRVIsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShTU0xfQ0lQSEVSLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihTU0xfQ0lQSEVSLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChTU0xfQ0lQSEVSLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFNTTF9DSVBIRVIsIChzdCksIChjbXApKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX2R1cChzdCkgU0tNX3NrX2R1cChTU0xfQ0lQSEVSLCBzdCkKKyNkZWZpbmUgc2tfU1NMX0NJUEhFUl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoU1NMX0NJUEhFUiwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfc2hpZnQoc3QpIFNLTV9za19zaGlmdChTU0xfQ0lQSEVSLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3BvcChzdCkgU0tNX3NrX3BvcChTU0xfQ0lQSEVSLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ0lQSEVSX3NvcnQoc3QpIFNLTV9za19zb3J0KFNTTF9DSVBIRVIsIChzdCkpCisjZGVmaW5lIHNrX1NTTF9DSVBIRVJfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFNTTF9DSVBIRVIsIChzdCkpCisKKyNkZWZpbmUgc2tfU1NMX0NPTVBfbmV3KGNtcCkgU0tNX3NrX25ldyhTU0xfQ09NUCwgKGNtcCkpCisjZGVmaW5lIHNrX1NTTF9DT01QX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFNTTF9DT01QKQorI2RlZmluZSBza19TU0xfQ09NUF9mcmVlKHN0KSBTS01fc2tfZnJlZShTU0xfQ09NUCwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfbnVtKHN0KSBTS01fc2tfbnVtKFNTTF9DT01QLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ09NUF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFNTTF9DT01QLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NTTF9DT01QX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFNTTF9DT01QLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19TU0xfQ09NUF96ZXJvKHN0KSBTS01fc2tfemVybyhTU0xfQ09NUCwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChTU0xfQ09NUCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NTTF9DT01QX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoU1NMX0NPTVAsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TU0xfQ09NUF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFNTTF9DT01QLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChTU0xfQ09NUCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NTTF9DT01QX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShTU0xfQ09NUCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19TU0xfQ09NUF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFNTTF9DT01QLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoU1NMX0NPTVAsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1NTTF9DT01QX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFNTTF9DT01QLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfZHVwKHN0KSBTS01fc2tfZHVwKFNTTF9DT01QLCBzdCkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFNTTF9DT01QLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfc2hpZnQoc3QpIFNLTV9za19zaGlmdChTU0xfQ09NUCwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfcG9wKHN0KSBTS01fc2tfcG9wKFNTTF9DT01QLCAoc3QpKQorI2RlZmluZSBza19TU0xfQ09NUF9zb3J0KHN0KSBTS01fc2tfc29ydChTU0xfQ09NUCwgKHN0KSkKKyNkZWZpbmUgc2tfU1NMX0NPTVBfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFNTTF9DT01QLCAoc3QpKQorCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9uZXcoY21wKSBTS01fc2tfbmV3KFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKGNtcCkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChTVEFDS19PRl9YNTA5X05BTUVfRU5UUlkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9mcmVlKHN0KSBTS01fc2tfZnJlZShTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9udW0oc3QpIFNLTV9za19udW0oU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3plcm8oc3QpIFNLTV9za196ZXJvKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9kdXAoc3QpIFNLTV9za19kdXAoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCBzdCkKKyNkZWZpbmUgc2tfU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfc2hpZnQoc3QpIFNLTV9za19zaGlmdChTVEFDS19PRl9YNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1NUQUNLX09GX1g1MDlfTkFNRV9FTlRSWV9wb3Aoc3QpIFNLTV9za19wb3AoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfc29ydChzdCkgU0tNX3NrX3NvcnQoU1RBQ0tfT0ZfWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19TVEFDS19PRl9YNTA5X05BTUVfRU5UUllfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFNUQUNLX09GX1g1MDlfTkFNRV9FTlRSWSwgKHN0KSkKKworI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fbmV3KGNtcCkgU0tNX3NrX25ldyhTVE9SRV9BVFRSX0lORk8sIChjbXApKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoU1RPUkVfQVRUUl9JTkZPKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fZnJlZShzdCkgU0tNX3NrX2ZyZWUoU1RPUkVfQVRUUl9JTkZPLCAoc3QpKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fbnVtKHN0KSBTS01fc2tfbnVtKFNUT1JFX0FUVFJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfQVRUUl9JTkZPX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoU1RPUkVfQVRUUl9JTkZPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChTVE9SRV9BVFRSX0lORk8sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT196ZXJvKHN0KSBTS01fc2tfemVybyhTVE9SRV9BVFRSX0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoU1RPUkVfQVRUUl9JTkZPLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFNUT1JFX0FUVFJfSU5GTywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChTVE9SRV9BVFRSX0lORk8sIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhTVE9SRV9BVFRSX0lORk8sIChzdCksIChjbXApKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fZHVwKHN0KSBTS01fc2tfZHVwKFNUT1JFX0FUVFJfSU5GTywgc3QpCisjZGVmaW5lIHNrX1NUT1JFX0FUVFJfSU5GT19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoU1RPUkVfQVRUUl9JTkZPLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfU1RPUkVfQVRUUl9JTkZPX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoU1RPUkVfQVRUUl9JTkZPLCAoc3QpKQorI2RlZmluZSBza19TVE9SRV9BVFRSX0lORk9fcG9wKHN0KSBTS01fc2tfcG9wKFNUT1JFX0FUVFJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfQVRUUl9JTkZPX3NvcnQoc3QpIFNLTV9za19zb3J0KFNUT1JFX0FUVFJfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfQVRUUl9JTkZPX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChTVE9SRV9BVFRSX0lORk8sIChzdCkpCisKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX25ldyhjbXApIFNLTV9za19uZXcoU1RPUkVfT0JKRUNULCAoY21wKSkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFNUT1JFX09CSkVDVCkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX2ZyZWUoc3QpIFNLTV9za19mcmVlKFNUT1JFX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX251bShzdCkgU0tNX3NrX251bShTVE9SRV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1NUT1JFX09CSkVDVF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFNUT1JFX09CSkVDVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1Rfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoU1RPUkVfT0JKRUNULCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfemVybyhzdCkgU0tNX3NrX3plcm8oU1RPUkVfT0JKRUNULCAoc3QpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChTVE9SRV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChTVE9SRV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChTVE9SRV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChTVE9SRV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFNUT1JFX09CSkVDVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihTVE9SRV9PQkpFQ1QsIChzdCksIChwdHIpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoU1RPUkVfT0JKRUNULCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1Rfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoU1RPUkVfT0JKRUNULCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX2R1cChzdCkgU0tNX3NrX2R1cChTVE9SRV9PQkpFQ1QsIHN0KQorI2RlZmluZSBza19TVE9SRV9PQkpFQ1RfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFNUT1JFX09CSkVDVCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1NUT1JFX09CSkVDVF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFNUT1JFX09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfU1RPUkVfT0JKRUNUX3BvcChzdCkgU0tNX3NrX3BvcChTVE9SRV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1NUT1JFX09CSkVDVF9zb3J0KHN0KSBTS01fc2tfc29ydChTVE9SRV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1NUT1JFX09CSkVDVF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoU1RPUkVfT0JKRUNULCAoc3QpKQorCisjZGVmaW5lIHNrX1NYTkVUSURfbmV3KGNtcCkgU0tNX3NrX25ldyhTWE5FVElELCAoY21wKSkKKyNkZWZpbmUgc2tfU1hORVRJRF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChTWE5FVElEKQorI2RlZmluZSBza19TWE5FVElEX2ZyZWUoc3QpIFNLTV9za19mcmVlKFNYTkVUSUQsIChzdCkpCisjZGVmaW5lIHNrX1NYTkVUSURfbnVtKHN0KSBTS01fc2tfbnVtKFNYTkVUSUQsIChzdCkpCisjZGVmaW5lIHNrX1NYTkVUSURfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShTWE5FVElELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1NYTkVUSURfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoU1hORVRJRCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1hORVRJRF96ZXJvKHN0KSBTS01fc2tfemVybyhTWE5FVElELCAoc3QpKQorI2RlZmluZSBza19TWE5FVElEX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goU1hORVRJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NYTkVUSURfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChTWE5FVElELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfU1hORVRJRF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFNYTkVUSUQsIChzdCksICh2YWwpKQorI2RlZmluZSBza19TWE5FVElEX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoU1hORVRJRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1NYTkVUSURfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFNYTkVUSUQsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfU1hORVRJRF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFNYTkVUSUQsIChzdCksIChwdHIpKQorI2RlZmluZSBza19TWE5FVElEX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFNYTkVUSUQsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1NYTkVUSURfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoU1hORVRJRCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1NYTkVUSURfZHVwKHN0KSBTS01fc2tfZHVwKFNYTkVUSUQsIHN0KQorI2RlZmluZSBza19TWE5FVElEX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShTWE5FVElELCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfU1hORVRJRF9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFNYTkVUSUQsIChzdCkpCisjZGVmaW5lIHNrX1NYTkVUSURfcG9wKHN0KSBTS01fc2tfcG9wKFNYTkVUSUQsIChzdCkpCisjZGVmaW5lIHNrX1NYTkVUSURfc29ydChzdCkgU0tNX3NrX3NvcnQoU1hORVRJRCwgKHN0KSkKKyNkZWZpbmUgc2tfU1hORVRJRF9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoU1hORVRJRCwgKHN0KSkKKworI2RlZmluZSBza19VSV9TVFJJTkdfbmV3KGNtcCkgU0tNX3NrX25ldyhVSV9TVFJJTkcsIChjbXApKQorI2RlZmluZSBza19VSV9TVFJJTkdfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoVUlfU1RSSU5HKQorI2RlZmluZSBza19VSV9TVFJJTkdfZnJlZShzdCkgU0tNX3NrX2ZyZWUoVUlfU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19VSV9TVFJJTkdfbnVtKHN0KSBTS01fc2tfbnVtKFVJX1NUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfVUlfU1RSSU5HX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoVUlfU1RSSU5HLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChVSV9TVFJJTkcsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR196ZXJvKHN0KSBTS01fc2tfemVybyhVSV9TVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFVJX1NUUklORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR191bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFVJX1NUUklORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFVJX1NUUklORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFVJX1NUUklORywgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoVUlfU1RSSU5HLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFVJX1NUUklORywgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1VJX1NUUklOR19pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChVSV9TVFJJTkcsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1VJX1NUUklOR19zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhVSV9TVFJJTkcsIChzdCksIChjbXApKQorI2RlZmluZSBza19VSV9TVFJJTkdfZHVwKHN0KSBTS01fc2tfZHVwKFVJX1NUUklORywgc3QpCisjZGVmaW5lIHNrX1VJX1NUUklOR19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoVUlfU1RSSU5HLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfVUlfU1RSSU5HX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoVUlfU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19VSV9TVFJJTkdfcG9wKHN0KSBTS01fc2tfcG9wKFVJX1NUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfVUlfU1RSSU5HX3NvcnQoc3QpIFNLTV9za19zb3J0KFVJX1NUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfVUlfU1RSSU5HX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChVSV9TVFJJTkcsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDksIChjbXApKQorI2RlZmluZSBza19YNTA5X25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDkpCisjZGVmaW5lIHNrX1g1MDlfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9udW0oc3QpIFNLTV9za19udW0oWDUwOSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDksIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5LCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDksIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5LCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5LCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9kdXAoc3QpIFNLTV9za19kdXAoWDUwOSwgc3QpCisjZGVmaW5lIHNrX1g1MDlfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDksIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5LCAoc3QpKQorI2RlZmluZSBza19YNTA5X2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5LCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX25ldyhjbXApIFNLTV9za19uZXcoWDUwOVYzX0VYVF9NRVRIT0QsIChjbXApKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5VjNfRVhUX01FVEhPRCkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX251bShzdCkgU0tNX3NrX251bShYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOVYzX0VYVF9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOVYzX0VYVF9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlWM19FWFRfTUVUSE9ELCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0RfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlWM19FWFRfTUVUSE9ELCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5VjNfRVhUX01FVEhPRF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5VjNfRVhUX01FVEhPRCwgc3QpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOVYzX0VYVF9NRVRIT0Rfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOVYzX0VYVF9NRVRIT0QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlWM19FWFRfTUVUSE9EX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5VjNfRVhUX01FVEhPRCwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X0FMR09SX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9BTEdPUiwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9BTEdPUikKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9mcmVlKHN0KSBTS01fc2tfZnJlZShYNTA5X0FMR09SLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FMR09SX251bShzdCkgU0tNX3NrX251bShYNTA5X0FMR09SLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9BTEdPUiwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFg1MDlfQUxHT1IsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9BTEdPUiwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfQUxHT1IsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoWDUwOV9BTEdPUiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X0FMR09SLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfQUxHT1IsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0FMR09SX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShYNTA5X0FMR09SLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X0FMR09SLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X0FMR09SLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFg1MDlfQUxHT1IsIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X0FMR09SX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X0FMR09SLCBzdCkKKyNkZWZpbmUgc2tfWDUwOV9BTEdPUl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9BTEdPUiwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1Jfc2hpZnQoc3QpIFNLTV9za19zaGlmdChYNTA5X0FMR09SLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X0FMR09SLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FMR09SX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfQUxHT1IsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQUxHT1JfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFg1MDlfQUxHT1IsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfbmV3KGNtcCkgU0tNX3NrX25ldyhYNTA5X0FUVFJJQlVURSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfQVRUUklCVVRFKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9mcmVlKHN0KSBTS01fc2tfZnJlZShYNTA5X0FUVFJJQlVURSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfbnVtKHN0KSBTS01fc2tfbnVtKFg1MDlfQVRUUklCVVRFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV96ZXJvKHN0KSBTS01fc2tfemVybyhYNTA5X0FUVFJJQlVURSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X0FUVFJJQlVURSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoWDUwOV9BVFRSSUJVVEUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X0FUVFJJQlVURSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShYNTA5X0FUVFJJQlVURSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9BVFRSSUJVVEUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfQVRUUklCVVRFX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfZHVwKHN0KSBTS01fc2tfZHVwKFg1MDlfQVRUUklCVVRFLCBzdCkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChYNTA5X0FUVFJJQlVURSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfcG9wKHN0KSBTS01fc2tfcG9wKFg1MDlfQVRUUklCVVRFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0FUVFJJQlVURV9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X0FUVFJJQlVURSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9BVFRSSUJVVEVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFg1MDlfQVRUUklCVVRFLCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfQ1JMX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9DUkwsIChjbXApKQorI2RlZmluZSBza19YNTA5X0NSTF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X0NSTCkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9DUkwsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX251bShzdCkgU0tNX3NrX251bShYNTA5X0NSTCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X0NSTCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0NSTF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X0NSTCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9DUkwsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9DUkwsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0NSTF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfQ1JMLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X0NSTCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9DUkwsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0NSTF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9DUkwsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X0NSTCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfQ1JMLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X0NSTF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X0NSTCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X0NSTCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X0NSTCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9DUkwsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X0NSTCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9DUkxfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9DUkwsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfQ1JMX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X0NSTCwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDlfRVhURU5TSU9OLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9FWFRFTlNJT04pCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2ZyZWUoc3QpIFNLTV9za19mcmVlKFg1MDlfRVhURU5TSU9OLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9udW0oc3QpIFNLTV9za19udW0oWDUwOV9FWFRFTlNJT04sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9FWFRFTlNJT04sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoWDUwOV9FWFRFTlNJT04sIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDlfRVhURU5TSU9OLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfRVhURU5TSU9OLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChYNTA5X0VYVEVOU0lPTiwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOV9FWFRFTlNJT04sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfRVhURU5TSU9OLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFg1MDlfRVhURU5TSU9OLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOV9FWFRFTlNJT04sIChzdCksIChwdHIpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X0VYVEVOU0lPTiwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9FWFRFTlNJT05fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoWDUwOV9FWFRFTlNJT04sIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9kdXAoc3QpIFNLTV9za19kdXAoWDUwOV9FWFRFTlNJT04sIHN0KQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9FWFRFTlNJT04sIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFg1MDlfRVhURU5TSU9OLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOV9FWFRFTlNJT04sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfRVhURU5TSU9OX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfRVhURU5TSU9OLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0VYVEVOU0lPTl9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoWDUwOV9FWFRFTlNJT04sIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9JTkZPLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfSU5GTykKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX2ZyZWUoc3QpIFNLTV9za19mcmVlKFg1MDlfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX251bShzdCkgU0tNX3NrX251bShYNTA5X0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfSU5GT192YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0lORk9fc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoWDUwOV9JTkZPLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9femVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9JTkZPLCAoc3QpKQorI2RlZmluZSBza19YNTA5X0lORk9fcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9fdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChYNTA5X0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9fZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9fZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X0lORk8sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0lORk9fZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFg1MDlfSU5GTywgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0lORk9fZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X0lORk8sIChzdCksIChwdHIpKQorI2RlZmluZSBza19YNTA5X0lORk9faW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9JTkZPLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X0lORk9fc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoWDUwOV9JTkZPLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X0lORk8sIHN0KQorI2RlZmluZSBza19YNTA5X0lORk9fcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfSU5GTywgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfSU5GT19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFg1MDlfSU5GTywgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9JTkZPX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfSU5GT19zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X0lORk8sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfSU5GT19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoWDUwOV9JTkZPLCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9MT09LVVAsIChjbXApKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X0xPT0tVUCkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9MT09LVVAsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX251bShzdCkgU0tNX3NrX251bShYNTA5X0xPT0tVUCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X0xPT0tVUCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X0xPT0tVUCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9MT09LVVAsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9MT09LVVAsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfTE9PS1VQLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X0xPT0tVUCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9MT09LVVAsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9MT09LVVAsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X0xPT0tVUCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfTE9PS1VQLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X0xPT0tVUF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X0xPT0tVUCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X0xPT0tVUCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X0xPT0tVUCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9MT09LVVAsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X0xPT0tVUCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9MT09LVVBfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9MT09LVVAsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTE9PS1VQX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X0xPT0tVUCwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X05BTUVfbmV3KGNtcCkgU0tNX3NrX25ldyhYNTA5X05BTUUsIChjbXApKQorI2RlZmluZSBza19YNTA5X05BTUVfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9OQU1FKQorI2RlZmluZSBza19YNTA5X05BTUVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9OQU1FLCAoc3QpKQorI2RlZmluZSBza19YNTA5X05BTUVfbnVtKHN0KSBTS01fc2tfbnVtKFg1MDlfTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9OQU1FLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X05BTUUsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV96ZXJvKHN0KSBTS01fc2tfemVybyhYNTA5X05BTUUsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFg1MDlfTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfTkFNRSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9OQU1FLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFg1MDlfTkFNRSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X05BTUUsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X05BTUUsIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X05BTUVfZHVwKHN0KSBTS01fc2tfZHVwKFg1MDlfTkFNRSwgc3QpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9OQU1FLCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9OQU1FLCAoc3QpKQorI2RlZmluZSBza19YNTA5X05BTUVfcG9wKHN0KSBTS01fc2tfcG9wKFg1MDlfTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfTkFNRSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X05BTUUsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9OQU1FX0VOVFJZLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfTkFNRV9FTlRSWSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX2ZyZWUoc3QpIFNLTV9za19mcmVlKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX251bShzdCkgU0tNX3NrX251bShYNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfc2V0KHN0LCBpLCB2YWwpIFNLTV9za19zZXQoWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X05BTUVfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfdW5zaGlmdChzdCwgdmFsKSBTS01fc2tfdW5zaGlmdChYNTA5X05BTUVfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X05BTUVfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X05BTUVfRU5UUlksIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X05BTUVfRU5UUlksIChzdCksIChwdHIpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfc2V0X2NtcF9mdW5jKHN0LCBjbXApIFNLTV9za19zZXRfY21wX2Z1bmMoWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X05BTUVfRU5UUlksIHN0KQorI2RlZmluZSBza19YNTA5X05BTUVfRU5UUllfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KFg1MDlfTkFNRV9FTlRSWSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9OQU1FX0VOVFJZX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X05BTUVfRU5UUlksIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfTkFNRV9FTlRSWV9pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoWDUwOV9OQU1FX0VOVFJZLCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9PQkpFQ1QsIChjbXApKQorI2RlZmluZSBza19YNTA5X09CSkVDVF9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X09CSkVDVCkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX251bShzdCkgU0tNX3NrX251bShYNTA5X09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X09CSkVDVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X09CSkVDVF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X09CSkVDVCwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X09CSkVDVF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfT0JKRUNULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X09CSkVDVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9PQkpFQ1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X09CSkVDVF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9PQkpFQ1QsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1RfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X09CSkVDVCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfT0JKRUNULCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X09CSkVDVF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X09CSkVDVCwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X09CSkVDVCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X09CSkVDVCwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X09CSkVDVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9PQkpFQ1Rfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9PQkpFQ1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfT0JKRUNUX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X09CSkVDVCwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9QT0xJQ1lfREFUQSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9QT0xJQ1lfREFUQSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9mcmVlKHN0KSBTS01fc2tfZnJlZShYNTA5X1BPTElDWV9EQVRBLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX251bShzdCkgU0tNX3NrX251bShYNTA5X1BPTElDWV9EQVRBLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9QT0xJQ1lfREFUQSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFg1MDlfUE9MSUNZX0RBVEEsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfemVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9QT0xJQ1lfREFUQSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfUE9MSUNZX0RBVEEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoWDUwOV9QT0xJQ1lfREFUQSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X1BPTElDWV9EQVRBLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfUE9MSUNZX0RBVEEsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShYNTA5X1BPTElDWV9EQVRBLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X1BPTElDWV9EQVRBLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X1BPTElDWV9EQVRBLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFg1MDlfUE9MSUNZX0RBVEEsIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X1BPTElDWV9EQVRBLCBzdCkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfREFUQV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9QT0xJQ1lfREFUQSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfc2hpZnQoc3QpIFNLTV9za19zaGlmdChYNTA5X1BPTElDWV9EQVRBLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X1BPTElDWV9EQVRBLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9EQVRBX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfUE9MSUNZX0RBVEEsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX0RBVEFfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFg1MDlfUE9MSUNZX0RBVEEsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDlfUE9MSUNZX05PREUsIChjbXApKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfUE9MSUNZX05PREUpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9udW0oc3QpIFNLTV9za19udW0oWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfUE9MSUNZX05PREUsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X1BPTElDWV9OT0RFLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDlfUE9MSUNZX05PREUsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X1BPTElDWV9OT0RFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfUE9MSUNZX05PREUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X1BPTElDWV9OT0RFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X1BPTElDWV9OT0RFLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9kdXAoc3QpIFNLTV9za19kdXAoWDUwOV9QT0xJQ1lfTk9ERSwgc3QpCisjZGVmaW5lIHNrX1g1MDlfUE9MSUNZX05PREVfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfUE9MSUNZX05PREUsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOV9QT0xJQ1lfTk9ERSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QT0xJQ1lfTk9ERV9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X1BPTElDWV9OT0RFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BPTElDWV9OT0RFX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X1BPTElDWV9OT0RFLCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDlfUFVSUE9TRSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X1BVUlBPU0UpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9mcmVlKHN0KSBTS01fc2tfZnJlZShYNTA5X1BVUlBPU0UsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9udW0oc3QpIFNLTV9za19udW0oWDUwOV9QVVJQT1NFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BVUlBPU0VfdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X1BVUlBPU0UsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KFg1MDlfUFVSUE9TRSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDlfUFVSUE9TRSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9QVVJQT1NFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQoWDUwOV9QVVJQT1NFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOV9QVVJQT1NFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9QVVJQT1NFLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShYNTA5X1BVUlBPU0UsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOV9QVVJQT1NFLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfUFVSUE9TRSwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKFg1MDlfUFVSUE9TRSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9kdXAoc3QpIFNLTV9za19kdXAoWDUwOV9QVVJQT1NFLCBzdCkKKyNkZWZpbmUgc2tfWDUwOV9QVVJQT1NFX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X1BVUlBPU0UsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X1BVUlBPU0Vfc2hpZnQoc3QpIFNLTV9za19zaGlmdChYNTA5X1BVUlBPU0UsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUFVSUE9TRV9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOV9QVVJQT1NFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BVUlBPU0Vfc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9QVVJQT1NFLCAoc3QpKQorI2RlZmluZSBza19YNTA5X1BVUlBPU0VfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKFg1MDlfUFVSUE9TRSwgKHN0KSkKKworI2RlZmluZSBza19YNTA5X1JFVk9LRURfbmV3KGNtcCkgU0tNX3NrX25ldyhYNTA5X1JFVk9LRUQsIChjbXApKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwoWDUwOV9SRVZPS0VEKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9SRVZPS0VELCAoc3QpKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfbnVtKHN0KSBTS01fc2tfbnVtKFg1MDlfUkVWT0tFRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUoWDUwOV9SRVZPS0VELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X1JFVk9LRUQsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF96ZXJvKHN0KSBTS01fc2tfemVybyhYNTA5X1JFVk9LRUQsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKFg1MDlfUkVWT0tFRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfUkVWT0tFRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9maW5kKHN0LCB2YWwpIFNLTV9za19maW5kKFg1MDlfUkVWT0tFRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KFg1MDlfUkVWT0tFRCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9SRVZPS0VELCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9kZWxldGVfcHRyKHN0LCBwdHIpIFNLTV9za19kZWxldGVfcHRyKFg1MDlfUkVWT0tFRCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChYNTA5X1JFVk9LRUQsIChzdCksICh2YWwpLCAoaSkpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X1JFVk9LRUQsIChzdCksIChjbXApKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfZHVwKHN0KSBTS01fc2tfZHVwKFg1MDlfUkVWT0tFRCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfUkVWT0tFRF9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUoWDUwOV9SRVZPS0VELCAoc3QpLCAoZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9SRVZPS0VELCAoc3QpKQorI2RlZmluZSBza19YNTA5X1JFVk9LRURfcG9wKHN0KSBTS01fc2tfcG9wKFg1MDlfUkVWT0tFRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX3NvcnQoc3QpIFNLTV9za19zb3J0KFg1MDlfUkVWT0tFRCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9SRVZPS0VEX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X1JFVk9LRUQsIChzdCkpCisKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9uZXcoY21wKSBTS01fc2tfbmV3KFg1MDlfVFJVU1QsIChjbXApKQorI2RlZmluZSBza19YNTA5X1RSVVNUX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKFg1MDlfVFJVU1QpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9UUlVTVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9udW0oc3QpIFNLTV9za19udW0oWDUwOV9UUlVTVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKFg1MDlfVFJVU1QsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X1RSVVNULCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX3plcm8oc3QpIFNLTV9za196ZXJvKFg1MDlfVFJVU1QsIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaChYNTA5X1RSVVNULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfVFJVU1QsIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQoWDUwOV9UUlVTVCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leChYNTA5X1RSVVNULCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9UUlVTVCwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIoWDUwOV9UUlVTVCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQoWDUwOV9UUlVTVCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X1RSVVNULCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9kdXAoc3QpIFNLTV9za19kdXAoWDUwOV9UUlVTVCwgc3QpCisjZGVmaW5lIHNrX1g1MDlfVFJVU1RfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKFg1MDlfVFJVU1QsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9UUlVTVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9wb3Aoc3QpIFNLTV9za19wb3AoWDUwOV9UUlVTVCwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9UUlVTVF9zb3J0KHN0KSBTS01fc2tfc29ydChYNTA5X1RSVVNULCAoc3QpKQorI2RlZmluZSBza19YNTA5X1RSVVNUX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X1RSVVNULCAoc3QpKQorCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX25ldyhjbXApIFNLTV9za19uZXcoWDUwOV9WRVJJRllfUEFSQU0sIChjbXApKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9uZXdfbnVsbCgpIFNLTV9za19uZXdfbnVsbChYNTA5X1ZFUklGWV9QQVJBTSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fZnJlZShzdCkgU0tNX3NrX2ZyZWUoWDUwOV9WRVJJRllfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX251bShzdCkgU0tNX3NrX251bShYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fdmFsdWUoc3QsIGkpIFNLTV9za192YWx1ZShYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldChYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKGkpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1femVybyhzdCkgU0tNX3NrX3plcm8oWDUwOV9WRVJJRllfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3B1c2goc3QsIHZhbCkgU0tNX3NrX3B1c2goWDUwOV9WRVJJRllfUEFSQU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KFg1MDlfVkVSSUZZX1BBUkFNLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2ZpbmRfZXgoc3QsIHZhbCkgU0tNX3NrX2ZpbmRfZXgoWDUwOV9WRVJJRllfUEFSQU0sIChzdCksICh2YWwpKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUoWDUwOV9WRVJJRllfUEFSQU0sIChzdCksIChpKSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2luc2VydChzdCwgdmFsLCBpKSBTS01fc2tfaW5zZXJ0KFg1MDlfVkVSSUZZX1BBUkFNLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19YNTA5X1ZFUklGWV9QQVJBTV9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyhYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKGNtcCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2R1cChzdCkgU0tNX3NrX2R1cChYNTA5X1ZFUklGWV9QQVJBTSwgc3QpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIFNLTV9za19wb3BfZnJlZShYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQoWDUwOV9WRVJJRllfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX3BvcChzdCkgU0tNX3NrX3BvcChYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSkKKyNkZWZpbmUgc2tfWDUwOV9WRVJJRllfUEFSQU1fc29ydChzdCkgU0tNX3NrX3NvcnQoWDUwOV9WRVJJRllfUEFSQU0sIChzdCkpCisjZGVmaW5lIHNrX1g1MDlfVkVSSUZZX1BBUkFNX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChYNTA5X1ZFUklGWV9QQVJBTSwgKHN0KSkKKworI2RlZmluZSBza19uaWRfdHJpcGxlX25ldyhjbXApIFNLTV9za19uZXcobmlkX3RyaXBsZSwgKGNtcCkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfbmV3X251bGwoKSBTS01fc2tfbmV3X251bGwobmlkX3RyaXBsZSkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9mcmVlKHN0KSBTS01fc2tfZnJlZShuaWRfdHJpcGxlLCAoc3QpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX251bShzdCkgU0tNX3NrX251bShuaWRfdHJpcGxlLCAoc3QpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3ZhbHVlKHN0LCBpKSBTS01fc2tfdmFsdWUobmlkX3RyaXBsZSwgKHN0KSwgKGkpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3NldChzdCwgaSwgdmFsKSBTS01fc2tfc2V0KG5pZF90cmlwbGUsIChzdCksIChpKSwgKHZhbCkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfemVybyhzdCkgU0tNX3NrX3plcm8obmlkX3RyaXBsZSwgKHN0KSkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9wdXNoKHN0LCB2YWwpIFNLTV9za19wdXNoKG5pZF90cmlwbGUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3Vuc2hpZnQoc3QsIHZhbCkgU0tNX3NrX3Vuc2hpZnQobmlkX3RyaXBsZSwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfZmluZChzdCwgdmFsKSBTS01fc2tfZmluZChuaWRfdHJpcGxlLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9maW5kX2V4KHN0LCB2YWwpIFNLTV9za19maW5kX2V4KG5pZF90cmlwbGUsIChzdCksICh2YWwpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShuaWRfdHJpcGxlLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfZGVsZXRlX3B0cihzdCwgcHRyKSBTS01fc2tfZGVsZXRlX3B0cihuaWRfdHJpcGxlLCAoc3QpLCAocHRyKSkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9pbnNlcnQoc3QsIHZhbCwgaSkgU0tNX3NrX2luc2VydChuaWRfdHJpcGxlLCAoc3QpLCAodmFsKSwgKGkpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3NldF9jbXBfZnVuYyhzdCwgY21wKSBTS01fc2tfc2V0X2NtcF9mdW5jKG5pZF90cmlwbGUsIChzdCksIChjbXApKQorI2RlZmluZSBza19uaWRfdHJpcGxlX2R1cChzdCkgU0tNX3NrX2R1cChuaWRfdHJpcGxlLCBzdCkKKyNkZWZpbmUgc2tfbmlkX3RyaXBsZV9wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBTS01fc2tfcG9wX2ZyZWUobmlkX3RyaXBsZSwgKHN0KSwgKGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfc2hpZnQoc3QpIFNLTV9za19zaGlmdChuaWRfdHJpcGxlLCAoc3QpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3BvcChzdCkgU0tNX3NrX3BvcChuaWRfdHJpcGxlLCAoc3QpKQorI2RlZmluZSBza19uaWRfdHJpcGxlX3NvcnQoc3QpIFNLTV9za19zb3J0KG5pZF90cmlwbGUsIChzdCkpCisjZGVmaW5lIHNrX25pZF90cmlwbGVfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKG5pZF90cmlwbGUsIChzdCkpCisKKyNkZWZpbmUgc2tfdm9pZF9uZXcoY21wKSBTS01fc2tfbmV3KHZvaWQsIChjbXApKQorI2RlZmluZSBza192b2lkX25ld19udWxsKCkgU0tNX3NrX25ld19udWxsKHZvaWQpCisjZGVmaW5lIHNrX3ZvaWRfZnJlZShzdCkgU0tNX3NrX2ZyZWUodm9pZCwgKHN0KSkKKyNkZWZpbmUgc2tfdm9pZF9udW0oc3QpIFNLTV9za19udW0odm9pZCwgKHN0KSkKKyNkZWZpbmUgc2tfdm9pZF92YWx1ZShzdCwgaSkgU0tNX3NrX3ZhbHVlKHZvaWQsIChzdCksIChpKSkKKyNkZWZpbmUgc2tfdm9pZF9zZXQoc3QsIGksIHZhbCkgU0tNX3NrX3NldCh2b2lkLCAoc3QpLCAoaSksICh2YWwpKQorI2RlZmluZSBza192b2lkX3plcm8oc3QpIFNLTV9za196ZXJvKHZvaWQsIChzdCkpCisjZGVmaW5lIHNrX3ZvaWRfcHVzaChzdCwgdmFsKSBTS01fc2tfcHVzaCh2b2lkLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfdm9pZF91bnNoaWZ0KHN0LCB2YWwpIFNLTV9za191bnNoaWZ0KHZvaWQsIChzdCksICh2YWwpKQorI2RlZmluZSBza192b2lkX2ZpbmQoc3QsIHZhbCkgU0tNX3NrX2ZpbmQodm9pZCwgKHN0KSwgKHZhbCkpCisjZGVmaW5lIHNrX3ZvaWRfZmluZF9leChzdCwgdmFsKSBTS01fc2tfZmluZF9leCh2b2lkLCAoc3QpLCAodmFsKSkKKyNkZWZpbmUgc2tfdm9pZF9kZWxldGUoc3QsIGkpIFNLTV9za19kZWxldGUodm9pZCwgKHN0KSwgKGkpKQorI2RlZmluZSBza192b2lkX2RlbGV0ZV9wdHIoc3QsIHB0cikgU0tNX3NrX2RlbGV0ZV9wdHIodm9pZCwgKHN0KSwgKHB0cikpCisjZGVmaW5lIHNrX3ZvaWRfaW5zZXJ0KHN0LCB2YWwsIGkpIFNLTV9za19pbnNlcnQodm9pZCwgKHN0KSwgKHZhbCksIChpKSkKKyNkZWZpbmUgc2tfdm9pZF9zZXRfY21wX2Z1bmMoc3QsIGNtcCkgU0tNX3NrX3NldF9jbXBfZnVuYyh2b2lkLCAoc3QpLCAoY21wKSkKKyNkZWZpbmUgc2tfdm9pZF9kdXAoc3QpIFNLTV9za19kdXAodm9pZCwgc3QpCisjZGVmaW5lIHNrX3ZvaWRfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgU0tNX3NrX3BvcF9mcmVlKHZvaWQsIChzdCksIChmcmVlX2Z1bmMpKQorI2RlZmluZSBza192b2lkX3NoaWZ0KHN0KSBTS01fc2tfc2hpZnQodm9pZCwgKHN0KSkKKyNkZWZpbmUgc2tfdm9pZF9wb3Aoc3QpIFNLTV9za19wb3Aodm9pZCwgKHN0KSkKKyNkZWZpbmUgc2tfdm9pZF9zb3J0KHN0KSBTS01fc2tfc29ydCh2b2lkLCAoc3QpKQorI2RlZmluZSBza192b2lkX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZCh2b2lkLCAoc3QpKQorCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfbmV3KGNtcCkgKChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKXNrX25ldyhDSEVDS0VEX1NLX0NNUF9GVU5DKHZvaWQsIGNtcCkpKQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX25ld19udWxsKCkgKChTVEFDS19PRihPUEVOU1NMX0JMT0NLKSAqKXNrX25ld19udWxsKCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfcHVzaChzdCwgdmFsKSBza19wdXNoKENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIENIRUNLRURfUFRSX09GKHZvaWQsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfZmluZChzdCwgdmFsKSBza19maW5kKENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIENIRUNLRURfUFRSX09GKHZvaWQsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfdmFsdWUoc3QsIGkpICgoT1BFTlNTTF9CTE9DSylza192YWx1ZShDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX0JMT0NLKSwgc3QpLCBpKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19udW0oc3QpIFNLTV9za19udW0oT1BFTlNTTF9CTE9DSywgc3QpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfcG9wX2ZyZWUoc3QsIGZyZWVfZnVuYykgc2tfcG9wX2ZyZWUoQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSyksIHN0KSwgQ0hFQ0tFRF9TS19GUkVFX0ZVTkMyKE9QRU5TU0xfQkxPQ0ssIGZyZWVfZnVuYykpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfaW5zZXJ0KHN0LCB2YWwsIGkpIHNrX2luc2VydChDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX0JMT0NLKSwgc3QpLCBDSEVDS0VEX1BUUl9PRih2b2lkLCB2YWwpLCBpKQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX2ZyZWUoc3QpIFNLTV9za19mcmVlKE9QRU5TU0xfQkxPQ0ssIHN0KQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX3NldChzdCwgaSwgdmFsKSBza19zZXQoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIGksIENIRUNLRURfUFRSX09GKHZvaWQsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfemVybyhzdCkgU0tNX3NrX3plcm8oT1BFTlNTTF9CTE9DSywgKHN0KSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS191bnNoaWZ0KHN0LCB2YWwpIHNrX3Vuc2hpZnQoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIENIRUNLRURfUFRSX09GKHZvaWQsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfZmluZF9leChzdCwgdmFsKSBza19maW5kX2V4KChfU1RBQ0sgKilDSEVDS0VEX0NPTlNUX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX0JMT0NLKSwgc3QpLCBDSEVDS0VEX0NPTlNUX1BUUl9PRih2b2lkLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX2RlbGV0ZShzdCwgaSkgU0tNX3NrX2RlbGV0ZShPUEVOU1NMX0JMT0NLLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfZGVsZXRlX3B0cihzdCwgcHRyKSAoT1BFTlNTTF9CTE9DSyAqKXNrX2RlbGV0ZV9wdHIoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCksIENIRUNLRURfUFRSX09GKHZvaWQsIHB0cikpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc2V0X2NtcF9mdW5jKHN0LCBjbXApICBcCisJKChpbnQgKCopKGNvbnN0IHZvaWQgKiBjb25zdCAqLGNvbnN0IHZvaWQgKiBjb25zdCAqKSkgXAorCXNrX3NldF9jbXBfZnVuYygoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9CTE9DSyksIHN0KSwgQ0hFQ0tFRF9TS19DTVBfRlVOQyh2b2lkLCBjbXApKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19kdXAoc3QpIFNLTV9za19kdXAoT1BFTlNTTF9CTE9DSywgc3QpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc2hpZnQoc3QpIFNLTV9za19zaGlmdChPUEVOU1NMX0JMT0NLLCAoc3QpKQorI2RlZmluZSBza19PUEVOU1NMX0JMT0NLX3BvcChzdCkgKHZvaWQgKilza19wb3AoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfQkxPQ0spLCBzdCkpCisjZGVmaW5lIHNrX09QRU5TU0xfQkxPQ0tfc29ydChzdCkgU0tNX3NrX3NvcnQoT1BFTlNTTF9CTE9DSywgKHN0KSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9CTE9DS19pc19zb3J0ZWQoc3QpIFNLTV9za19pc19zb3J0ZWQoT1BFTlNTTF9CTE9DSywgKHN0KSkKKworCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19uZXcoY21wKSAoKFNUQUNLX09GKE9QRU5TU0xfUFNUUklORykgKilza19uZXcoQ0hFQ0tFRF9TS19DTVBfRlVOQyhPUEVOU1NMX1NUUklORywgY21wKSkpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19uZXdfbnVsbCgpICgoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSAqKXNrX25ld19udWxsKCkpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19wdXNoKHN0LCB2YWwpIHNrX3B1c2goQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1BUUl9PRihPUEVOU1NMX1NUUklORywgdmFsKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX2ZpbmQoc3QsIHZhbCkgc2tfZmluZChDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1BTVFJJTkcpLCBzdCksIENIRUNLRURfUFRSX09GKE9QRU5TU0xfU1RSSU5HLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfdmFsdWUoc3QsIGkpICgoT1BFTlNTTF9QU1RSSU5HKXNrX3ZhbHVlKENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfUFNUUklORyksIHN0KSwgaSkpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19udW0oc3QpIFNLTV9za19udW0oT1BFTlNTTF9QU1RSSU5HLCBzdCkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX3BvcF9mcmVlKHN0LCBmcmVlX2Z1bmMpIHNrX3BvcF9mcmVlKENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfUFNUUklORyksIHN0KSwgQ0hFQ0tFRF9TS19GUkVFX0ZVTkMyKE9QRU5TU0xfUFNUUklORywgZnJlZV9mdW5jKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX2luc2VydChzdCwgdmFsLCBpKSBza19pbnNlcnQoQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1BUUl9PRihPUEVOU1NMX1NUUklORywgdmFsKSwgaSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX2ZyZWUoc3QpIFNLTV9za19mcmVlKE9QRU5TU0xfUFNUUklORywgc3QpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19zZXQoc3QsIGksIHZhbCkgc2tfc2V0KChfU1RBQ0sgKilDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1BTVFJJTkcpLCBzdCksIGksIENIRUNLRURfUFRSX09GKE9QRU5TU0xfU1RSSU5HLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfemVybyhzdCkgU0tNX3NrX3plcm8oT1BFTlNTTF9QU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfdW5zaGlmdChzdCwgdmFsKSBza191bnNoaWZ0KChfU1RBQ0sgKilDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1BTVFJJTkcpLCBzdCksIENIRUNLRURfUFRSX09GKE9QRU5TU0xfU1RSSU5HLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfZmluZF9leChzdCwgdmFsKSBza19maW5kX2V4KChfU1RBQ0sgKilDSEVDS0VEX0NPTlNUX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1BTVFJJTkcpLCBzdCksIENIRUNLRURfQ09OU1RfUFRSX09GKE9QRU5TU0xfU1RSSU5HLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE9QRU5TU0xfUFNUUklORywgKHN0KSwgKGkpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfZGVsZXRlX3B0cihzdCwgcHRyKSAoT1BFTlNTTF9QU1RSSU5HICopc2tfZGVsZXRlX3B0cigoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1BUUl9PRihPUEVOU1NMX1NUUklORywgcHRyKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX3NldF9jbXBfZnVuYyhzdCwgY21wKSAgXAorCSgoaW50ICgqKShjb25zdCBPUEVOU1NMX1NUUklORyAqIGNvbnN0ICosY29uc3QgT1BFTlNTTF9TVFJJTkcgKiBjb25zdCAqKSkgXAorCXNrX3NldF9jbXBfZnVuYygoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1NLX0NNUF9GVU5DKE9QRU5TU0xfU1RSSU5HLCBjbXApKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9QU1RSSU5HX2R1cChzdCkgU0tNX3NrX2R1cChPUEVOU1NMX1BTVFJJTkcsIHN0KQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfc2hpZnQoc3QpIFNLTV9za19zaGlmdChPUEVOU1NMX1BTVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX09QRU5TU0xfUFNUUklOR19wb3Aoc3QpIChPUEVOU1NMX1NUUklORyAqKXNrX3BvcCgoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HKSwgc3QpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfc29ydChzdCkgU0tNX3NrX3NvcnQoT1BFTlNTTF9QU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19PUEVOU1NMX1BTVFJJTkdfaXNfc29ydGVkKHN0KSBTS01fc2tfaXNfc29ydGVkKE9QRU5TU0xfUFNUUklORywgKHN0KSkKKworCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX25ldyhjbXApICgoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpICopc2tfbmV3KENIRUNLRURfU0tfQ01QX0ZVTkMoY2hhciwgY21wKSkpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX25ld19udWxsKCkgKChTVEFDS19PRihPUEVOU1NMX1NUUklORykgKilza19uZXdfbnVsbCgpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19wdXNoKHN0LCB2YWwpIHNrX3B1c2goQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpLCBzdCksIENIRUNLRURfUFRSX09GKGNoYXIsIHZhbCkpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX2ZpbmQoc3QsIHZhbCkgc2tfZmluZChDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSwgQ0hFQ0tFRF9QVFJfT0YoY2hhciwgdmFsKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfdmFsdWUoc3QsIGkpICgoT1BFTlNTTF9TVFJJTkcpc2tfdmFsdWUoQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpLCBzdCksIGkpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19udW0oc3QpIFNLTV9za19udW0oT1BFTlNTTF9TVFJJTkcsIHN0KQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19wb3BfZnJlZShzdCwgZnJlZV9mdW5jKSBza19wb3BfZnJlZShDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSwgQ0hFQ0tFRF9TS19GUkVFX0ZVTkMyKE9QRU5TU0xfU1RSSU5HLCBmcmVlX2Z1bmMpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19pbnNlcnQoc3QsIHZhbCwgaSkgc2tfaW5zZXJ0KENIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1BUUl9PRihjaGFyLCB2YWwpLCBpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19mcmVlKHN0KSBTS01fc2tfZnJlZShPUEVOU1NMX1NUUklORywgc3QpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX3NldChzdCwgaSwgdmFsKSBza19zZXQoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSwgc3QpLCBpLCBDSEVDS0VEX1BUUl9PRihjaGFyLCB2YWwpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR196ZXJvKHN0KSBTS01fc2tfemVybyhPUEVOU1NMX1NUUklORywgKHN0KSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfdW5zaGlmdChzdCwgdmFsKSBza191bnNoaWZ0KChfU1RBQ0sgKilDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSwgQ0hFQ0tFRF9QVFJfT0YoY2hhciwgdmFsKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfZmluZF9leChzdCwgdmFsKSBza19maW5kX2V4KChfU1RBQ0sgKilDSEVDS0VEX0NPTlNUX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSwgQ0hFQ0tFRF9DT05TVF9QVFJfT0YoY2hhciwgdmFsKSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfZGVsZXRlKHN0LCBpKSBTS01fc2tfZGVsZXRlKE9QRU5TU0xfU1RSSU5HLCAoc3QpLCAoaSkpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX2RlbGV0ZV9wdHIoc3QsIHB0cikgKE9QRU5TU0xfU1RSSU5HICopc2tfZGVsZXRlX3B0cigoX1NUQUNLICopQ0hFQ0tFRF9QVFJfT0YoU1RBQ0tfT0YoT1BFTlNTTF9TVFJJTkcpLCBzdCksIENIRUNLRURfUFRSX09GKGNoYXIsIHB0cikpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX3NldF9jbXBfZnVuYyhzdCwgY21wKSAgXAorCSgoaW50ICgqKShjb25zdCBjaGFyICogY29uc3QgKixjb25zdCBjaGFyICogY29uc3QgKikpIFwKKwlza19zZXRfY21wX2Z1bmMoKF9TVEFDSyAqKUNIRUNLRURfUFRSX09GKFNUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSwgc3QpLCBDSEVDS0VEX1NLX0NNUF9GVU5DKGNoYXIsIGNtcCkpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19kdXAoc3QpIFNLTV9za19kdXAoT1BFTlNTTF9TVFJJTkcsIHN0KQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19zaGlmdChzdCkgU0tNX3NrX3NoaWZ0KE9QRU5TU0xfU1RSSU5HLCAoc3QpKQorI2RlZmluZSBza19PUEVOU1NMX1NUUklOR19wb3Aoc3QpIChjaGFyICopc2tfcG9wKChfU1RBQ0sgKilDSEVDS0VEX1BUUl9PRihTVEFDS19PRihPUEVOU1NMX1NUUklORyksIHN0KSkKKyNkZWZpbmUgc2tfT1BFTlNTTF9TVFJJTkdfc29ydChzdCkgU0tNX3NrX3NvcnQoT1BFTlNTTF9TVFJJTkcsIChzdCkpCisjZGVmaW5lIHNrX09QRU5TU0xfU1RSSU5HX2lzX3NvcnRlZChzdCkgU0tNX3NrX2lzX3NvcnRlZChPUEVOU1NMX1NUUklORywgKHN0KSkKKworCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9BQ0NFU1NfREVTQ1JJUFRJT04oc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9BQ0NFU1NfREVTQ1JJUFRJT04oc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChBQ0NFU1NfREVTQ1JJUFRJT04sIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19BQ0NFU1NfREVTQ1JJUFRJT04oc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKEFDQ0VTU19ERVNDUklQVElPTiwgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfQUNDRVNTX0RFU0NSSVBUSU9OKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhBQ0NFU1NfREVTQ1JJUFRJT04sIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX0FTTjFfSU5URUdFUihzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoQVNOMV9JTlRFR0VSLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX0FTTjFfSU5URUdFUihzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKEFTTjFfSU5URUdFUiwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX0FTTjFfSU5URUdFUihzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soQVNOMV9JTlRFR0VSLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19BU04xX0lOVEVHRVIoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKEFTTjFfSU5URUdFUiwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfQVNOMV9PQkpFQ1Qoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKEFTTjFfT0JKRUNULCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX0FTTjFfT0JKRUNUKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoQVNOMV9PQkpFQ1QsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19BU04xX09CSkVDVChzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soQVNOMV9PQkpFQ1QsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX0FTTjFfT0JKRUNUKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhBU04xX09CSkVDVCwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfQVNOMV9UWVBFKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShBU04xX1RZUEUsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfQVNOMV9UWVBFKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoQVNOMV9UWVBFLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfQVNOMV9UWVBFKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhBU04xX1RZUEUsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX0FTTjFfVFlQRShidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soQVNOMV9UWVBFLCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9BU04xX1VURjhTVFJJTkcoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9BU04xX1VURjhTVFJJTkcoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChBU04xX1VURjhTVFJJTkcsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19BU04xX1VURjhTVFJJTkcoc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKEFTTjFfVVRGOFNUUklORywgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfQVNOMV9VVEY4U1RSSU5HKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhBU04xX1VURjhTVFJJTkcsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX0RJU1RfUE9JTlQoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKERJU1RfUE9JTlQsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfRElTVF9QT0lOVChzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKERJU1RfUE9JTlQsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19ESVNUX1BPSU5UKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhESVNUX1BPSU5ULCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19ESVNUX1BPSU5UKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhESVNUX1BPSU5ULCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9FU1NfQ0VSVF9JRChzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoRVNTX0NFUlRfSUQsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfRVNTX0NFUlRfSUQoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChFU1NfQ0VSVF9JRCwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX0VTU19DRVJUX0lEKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhFU1NfQ0VSVF9JRCwgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfRVNTX0NFUlRfSUQoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKEVTU19DRVJUX0lELCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9FVlBfTUQoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKEVWUF9NRCwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9FVlBfTUQoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChFVlBfTUQsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19FVlBfTUQoc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKEVWUF9NRCwgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfRVZQX01EKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhFVlBfTUQsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX0dFTkVSQUxfTkFNRShzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoR0VORVJBTF9OQU1FLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX0dFTkVSQUxfTkFNRShzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKEdFTkVSQUxfTkFNRSwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX0dFTkVSQUxfTkFNRShzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soR0VORVJBTF9OQU1FLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19HRU5FUkFMX05BTUUoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKEdFTkVSQUxfTkFNRSwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfT0NTUF9PTkVSRVEoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKE9DU1BfT05FUkVRLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX09DU1BfT05FUkVRKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoT0NTUF9PTkVSRVEsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19PQ1NQX09ORVJFUShzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soT0NTUF9PTkVSRVEsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX09DU1BfT05FUkVRKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhPQ1NQX09ORVJFUSwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfT0NTUF9TSU5HTEVSRVNQKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShPQ1NQX1NJTkdMRVJFU1AsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfT0NTUF9TSU5HTEVSRVNQKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoT0NTUF9TSU5HTEVSRVNQLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfT0NTUF9TSU5HTEVSRVNQKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhPQ1NQX1NJTkdMRVJFU1AsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX09DU1BfU0lOR0xFUkVTUChidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soT0NTUF9TSU5HTEVSRVNQLCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9QS0NTMTJfU0FGRUJBRyhzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoUEtDUzEyX1NBRkVCQUcsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfUEtDUzEyX1NBRkVCQUcoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChQS0NTMTJfU0FGRUJBRywgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1BLQ1MxMl9TQUZFQkFHKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhQS0NTMTJfU0FGRUJBRywgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfUEtDUzEyX1NBRkVCQUcoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFBLQ1MxMl9TQUZFQkFHLCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9QS0NTNyhzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoUEtDUzcsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfUEtDUzcoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChQS0NTNywgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1BLQ1M3KHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhQS0NTNywgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfUEtDUzcoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFBLQ1M3LCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9QS0NTN19SRUNJUF9JTkZPKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1JFQ0lQX0lORk8oc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChQS0NTN19SRUNJUF9JTkZPLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfUEtDUzdfUkVDSVBfSU5GTyhzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soUEtDUzdfUkVDSVBfSU5GTywgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfUEtDUzdfUkVDSVBfSU5GTyhidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soUEtDUzdfUkVDSVBfSU5GTywgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfUEtDUzdfU0lHTkVSX0lORk8oc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKFBLQ1M3X1NJR05FUl9JTkZPLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1NJR05FUl9JTkZPKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoUEtDUzdfU0lHTkVSX0lORk8sIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19QS0NTN19TSUdORVJfSU5GTyhzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soUEtDUzdfU0lHTkVSX0lORk8sIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX1BLQ1M3X1NJR05FUl9JTkZPKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhQS0NTN19TSUdORVJfSU5GTywgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfUE9MSUNZSU5GTyhzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoUE9MSUNZSU5GTywgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9QT0xJQ1lJTkZPKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoUE9MSUNZSU5GTywgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1BPTElDWUlORk8oc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFBPTElDWUlORk8sIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX1BPTElDWUlORk8oYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFBPTElDWUlORk8sIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1BPTElDWVFVQUxJTkZPKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShQT0xJQ1lRVUFMSU5GTywgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9QT0xJQ1lRVUFMSU5GTyhzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfUE9MSUNZUVVBTElORk8oc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFBPTElDWVFVQUxJTkZPLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19QT0xJQ1lRVUFMSU5GTyhidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soUE9MSUNZUVVBTElORk8sIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1NYTkVUSUQoc3QsIHBwLCBsZW5ndGgsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MpIFwKKwlTS01fQVNOMV9TRVRfT0ZfZDJpKFNYTkVUSUQsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfU1hORVRJRChzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFNYTkVUSUQsIChzdCksIChwcCksIChpMmRfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpLCAoaXNfc2V0KSkKKyNkZWZpbmUgQVNOMV9zZXFfcGFja19TWE5FVElEKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhTWE5FVElELCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19TWE5FVElEKGJ1ZiwgbGVuLCBkMmlfZnVuYywgZnJlZV9mdW5jKSBcCisJU0tNX0FTTjFfc2VxX3VucGFjayhTWE5FVElELCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9YNTA5KHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5LCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1g1MDkoc3QsIHBwLCBpMmRfZnVuYywgZXhfdGFnLCBleF9jbGFzcywgaXNfc2V0KSBcCisJU0tNX0FTTjFfU0VUX09GX2kyZChYNTA5LCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOShzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soWDUwOSwgKHN0KSwgKGkyZF9mdW5jKSwgKGJ1ZiksIChsZW4pKQorI2RlZmluZSBBU04xX3NlcV91bnBhY2tfWDUwOShidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOSwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfWDUwOV9BTEdPUihzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoWDUwOV9BTEdPUiwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9YNTA5X0FMR09SKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoWDUwOV9BTEdPUiwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1g1MDlfQUxHT1Ioc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFg1MDlfQUxHT1IsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX1g1MDlfQUxHT1IoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFg1MDlfQUxHT1IsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1g1MDlfQVRUUklCVVRFKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5X0FUVFJJQlVURSwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9YNTA5X0FUVFJJQlVURShzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOV9BVFRSSUJVVEUoc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFg1MDlfQVRUUklCVVRFLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19YNTA5X0FUVFJJQlVURShidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOV9BVFRSSUJVVEUsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1g1MDlfQ1JMKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5X0NSTCwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9YNTA5X0NSTChzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFg1MDlfQ1JMLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOV9DUkwoc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFg1MDlfQ1JMLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19YNTA5X0NSTChidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOV9DUkwsIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1g1MDlfRVhURU5TSU9OKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5X0VYVEVOU0lPTiwgKHN0KSwgKHBwKSwgKGxlbmd0aCksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSkgCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9YNTA5X0VYVEVOU0lPTihzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFg1MDlfRVhURU5TSU9OLCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOV9FWFRFTlNJT04oc3QsIGkyZF9mdW5jLCBidWYsIGxlbikgXAorCVNLTV9BU04xX3NlcV9wYWNrKFg1MDlfRVhURU5TSU9OLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19YNTA5X0VYVEVOU0lPTihidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOV9FWFRFTlNJT04sIChidWYpLCAobGVuKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYykpCisKKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1g1MDlfTkFNRV9FTlRSWShzdCwgcHAsIGxlbmd0aCwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgZXhfdGFnLCBleF9jbGFzcykgXAorCVNLTV9BU04xX1NFVF9PRl9kMmkoWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAocHApLCAobGVuZ3RoKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChleF90YWcpLCAoZXhfY2xhc3MpKSAKKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1g1MDlfTkFNRV9FTlRSWShzdCwgcHAsIGkyZF9mdW5jLCBleF90YWcsIGV4X2NsYXNzLCBpc19zZXQpIFwKKwlTS01fQVNOMV9TRVRfT0ZfaTJkKFg1MDlfTkFNRV9FTlRSWSwgKHN0KSwgKHBwKSwgKGkyZF9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcyksIChpc19zZXQpKQorI2RlZmluZSBBU04xX3NlcV9wYWNrX1g1MDlfTkFNRV9FTlRSWShzdCwgaTJkX2Z1bmMsIGJ1ZiwgbGVuKSBcCisJU0tNX0FTTjFfc2VxX3BhY2soWDUwOV9OQU1FX0VOVFJZLCAoc3QpLCAoaTJkX2Z1bmMpLCAoYnVmKSwgKGxlbikpCisjZGVmaW5lIEFTTjFfc2VxX3VucGFja19YNTA5X05BTUVfRU5UUlkoYnVmLCBsZW4sIGQyaV9mdW5jLCBmcmVlX2Z1bmMpIFwKKwlTS01fQVNOMV9zZXFfdW5wYWNrKFg1MDlfTkFNRV9FTlRSWSwgKGJ1ZiksIChsZW4pLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSkKKworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfWDUwOV9SRVZPS0VEKHN0LCBwcCwgbGVuZ3RoLCBkMmlfZnVuYywgZnJlZV9mdW5jLCBleF90YWcsIGV4X2NsYXNzKSBcCisJU0tNX0FTTjFfU0VUX09GX2QyaShYNTA5X1JFVk9LRUQsIChzdCksIChwcCksIChsZW5ndGgpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKGV4X3RhZyksIChleF9jbGFzcykpIAorI2RlZmluZSBpMmRfQVNOMV9TRVRfT0ZfWDUwOV9SRVZPS0VEKHN0LCBwcCwgaTJkX2Z1bmMsIGV4X3RhZywgZXhfY2xhc3MsIGlzX3NldCkgXAorCVNLTV9BU04xX1NFVF9PRl9pMmQoWDUwOV9SRVZPS0VELCAoc3QpLCAocHApLCAoaTJkX2Z1bmMpLCAoZXhfdGFnKSwgKGV4X2NsYXNzKSwgKGlzX3NldCkpCisjZGVmaW5lIEFTTjFfc2VxX3BhY2tfWDUwOV9SRVZPS0VEKHN0LCBpMmRfZnVuYywgYnVmLCBsZW4pIFwKKwlTS01fQVNOMV9zZXFfcGFjayhYNTA5X1JFVk9LRUQsIChzdCksIChpMmRfZnVuYyksIChidWYpLCAobGVuKSkKKyNkZWZpbmUgQVNOMV9zZXFfdW5wYWNrX1g1MDlfUkVWT0tFRChidWYsIGxlbiwgZDJpX2Z1bmMsIGZyZWVfZnVuYykgXAorCVNLTV9BU04xX3NlcV91bnBhY2soWDUwOV9SRVZPS0VELCAoYnVmKSwgKGxlbiksIChkMmlfZnVuYyksIChmcmVlX2Z1bmMpKQorCisjZGVmaW5lIFBLQ1MxMl9kZWNyeXB0X2QyaV9QS0NTMTJfU0FGRUJBRyhhbGdvciwgZDJpX2Z1bmMsIGZyZWVfZnVuYywgcGFzcywgcGFzc2xlbiwgb2N0LCBzZXEpIFwKKwlTS01fUEtDUzEyX2RlY3J5cHRfZDJpKFBLQ1MxMl9TQUZFQkFHLCAoYWxnb3IpLCAoZDJpX2Z1bmMpLCAoZnJlZV9mdW5jKSwgKHBhc3MpLCAocGFzc2xlbiksIChvY3QpLCAoc2VxKSkKKworI2RlZmluZSBQS0NTMTJfZGVjcnlwdF9kMmlfUEtDUzcoYWxnb3IsIGQyaV9mdW5jLCBmcmVlX2Z1bmMsIHBhc3MsIHBhc3NsZW4sIG9jdCwgc2VxKSBcCisJU0tNX1BLQ1MxMl9kZWNyeXB0X2QyaShQS0NTNywgKGFsZ29yKSwgKGQyaV9mdW5jKSwgKGZyZWVfZnVuYyksIChwYXNzKSwgKHBhc3NsZW4pLCAob2N0KSwgKHNlcSkpCisKKyNkZWZpbmUgbGhfQURERURfT0JKX25ldygpIExITV9saF9uZXcoQURERURfT0JKLGFkZGVkX29iaikKKyNkZWZpbmUgbGhfQURERURfT0JKX2luc2VydChsaCxpbnN0KSBMSE1fbGhfaW5zZXJ0KEFEREVEX09CSixsaCxpbnN0KQorI2RlZmluZSBsaF9BRERFRF9PQkpfcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKEFEREVEX09CSixsaCxpbnN0KQorI2RlZmluZSBsaF9BRERFRF9PQkpfZGVsZXRlKGxoLGluc3QpIExITV9saF9kZWxldGUoQURERURfT0JKLGxoLGluc3QpCisjZGVmaW5lIGxoX0FEREVEX09CSl9kb2FsbChsaCxmbikgTEhNX2xoX2RvYWxsKEFEREVEX09CSixsaCxmbikKKyNkZWZpbmUgbGhfQURERURfT0JKX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhBRERFRF9PQkosbGgsZm4sYXJnX3R5cGUsYXJnKQorI2RlZmluZSBsaF9BRERFRF9PQkpfZXJyb3IobGgpIExITV9saF9lcnJvcihBRERFRF9PQkosbGgpCisjZGVmaW5lIGxoX0FEREVEX09CSl9udW1faXRlbXMobGgpIExITV9saF9udW1faXRlbXMoQURERURfT0JKLGxoKQorI2RlZmluZSBsaF9BRERFRF9PQkpfZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKEFEREVEX09CSixsaCkKKyNkZWZpbmUgbGhfQURERURfT0JKX25vZGVfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV9zdGF0c19iaW8oQURERURfT0JKLGxoLG91dCkKKyNkZWZpbmUgbGhfQURERURfT0JKX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oQURERURfT0JKLGxoLG91dCkKKyNkZWZpbmUgbGhfQURERURfT0JKX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhBRERFRF9PQkosbGgsb3V0KQorI2RlZmluZSBsaF9BRERFRF9PQkpfZnJlZShsaCkgTEhNX2xoX2ZyZWUoQURERURfT0JKLGxoKQorCisjZGVmaW5lIGxoX0FQUF9JTkZPX25ldygpIExITV9saF9uZXcoQVBQX0lORk8sYXBwX2luZm8pCisjZGVmaW5lIGxoX0FQUF9JTkZPX2luc2VydChsaCxpbnN0KSBMSE1fbGhfaW5zZXJ0KEFQUF9JTkZPLGxoLGluc3QpCisjZGVmaW5lIGxoX0FQUF9JTkZPX3JldHJpZXZlKGxoLGluc3QpIExITV9saF9yZXRyaWV2ZShBUFBfSU5GTyxsaCxpbnN0KQorI2RlZmluZSBsaF9BUFBfSU5GT19kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShBUFBfSU5GTyxsaCxpbnN0KQorI2RlZmluZSBsaF9BUFBfSU5GT19kb2FsbChsaCxmbikgTEhNX2xoX2RvYWxsKEFQUF9JTkZPLGxoLGZuKQorI2RlZmluZSBsaF9BUFBfSU5GT19kb2FsbF9hcmcobGgsZm4sYXJnX3R5cGUsYXJnKSBcCisgIExITV9saF9kb2FsbF9hcmcoQVBQX0lORk8sbGgsZm4sYXJnX3R5cGUsYXJnKQorI2RlZmluZSBsaF9BUFBfSU5GT19lcnJvcihsaCkgTEhNX2xoX2Vycm9yKEFQUF9JTkZPLGxoKQorI2RlZmluZSBsaF9BUFBfSU5GT19udW1faXRlbXMobGgpIExITV9saF9udW1faXRlbXMoQVBQX0lORk8sbGgpCisjZGVmaW5lIGxoX0FQUF9JTkZPX2Rvd25fbG9hZChsaCkgTEhNX2xoX2Rvd25fbG9hZChBUFBfSU5GTyxsaCkKKyNkZWZpbmUgbGhfQVBQX0lORk9fbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhBUFBfSU5GTyxsaCxvdXQpCisjZGVmaW5lIGxoX0FQUF9JTkZPX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oQVBQX0lORk8sbGgsb3V0KQorI2RlZmluZSBsaF9BUFBfSU5GT19zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9zdGF0c19iaW8oQVBQX0lORk8sbGgsb3V0KQorI2RlZmluZSBsaF9BUFBfSU5GT19mcmVlKGxoKSBMSE1fbGhfZnJlZShBUFBfSU5GTyxsaCkKKworI2RlZmluZSBsaF9DT05GX1ZBTFVFX25ldygpIExITV9saF9uZXcoQ09ORl9WQUxVRSxjb25mX3ZhbHVlKQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX2luc2VydChsaCxpbnN0KSBMSE1fbGhfaW5zZXJ0KENPTkZfVkFMVUUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9yZXRyaWV2ZShsaCxpbnN0KSBMSE1fbGhfcmV0cmlldmUoQ09ORl9WQUxVRSxsaCxpbnN0KQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKENPTkZfVkFMVUUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9kb2FsbChsaCxmbikgTEhNX2xoX2RvYWxsKENPTkZfVkFMVUUsbGgsZm4pCisjZGVmaW5lIGxoX0NPTkZfVkFMVUVfZG9hbGxfYXJnKGxoLGZuLGFyZ190eXBlLGFyZykgXAorICBMSE1fbGhfZG9hbGxfYXJnKENPTkZfVkFMVUUsbGgsZm4sYXJnX3R5cGUsYXJnKQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoQ09ORl9WQUxVRSxsaCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9udW1faXRlbXMobGgpIExITV9saF9udW1faXRlbXMoQ09ORl9WQUxVRSxsaCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9kb3duX2xvYWQobGgpIExITV9saF9kb3duX2xvYWQoQ09ORl9WQUxVRSxsaCkKKyNkZWZpbmUgbGhfQ09ORl9WQUxVRV9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKENPTkZfVkFMVUUsbGgsb3V0KQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oQ09ORl9WQUxVRSxsaCxvdXQpCisjZGVmaW5lIGxoX0NPTkZfVkFMVUVfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfc3RhdHNfYmlvKENPTkZfVkFMVUUsbGgsb3V0KQorI2RlZmluZSBsaF9DT05GX1ZBTFVFX2ZyZWUobGgpIExITV9saF9mcmVlKENPTkZfVkFMVUUsbGgpCisKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfbmV3KCkgTEhNX2xoX25ldyhFTkdJTkVfUElMRSxlbmdpbmVfcGlsZSkKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfaW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoRU5HSU5FX1BJTEUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKEVOR0lORV9QSUxFLGxoLGluc3QpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKEVOR0lORV9QSUxFLGxoLGluc3QpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoRU5HSU5FX1BJTEUsbGgsZm4pCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhFTkdJTkVfUElMRSxsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoRU5HSU5FX1BJTEUsbGgpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhFTkdJTkVfUElMRSxsaCkKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKEVOR0lORV9QSUxFLGxoKQorI2RlZmluZSBsaF9FTkdJTkVfUElMRV9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKEVOR0lORV9QSUxFLGxoLG91dCkKKyNkZWZpbmUgbGhfRU5HSU5FX1BJTEVfbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhFTkdJTkVfUElMRSxsaCxvdXQpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhFTkdJTkVfUElMRSxsaCxvdXQpCisjZGVmaW5lIGxoX0VOR0lORV9QSUxFX2ZyZWUobGgpIExITV9saF9mcmVlKEVOR0lORV9QSUxFLGxoKQorCisjZGVmaW5lIGxoX0VSUl9TVEFURV9uZXcoKSBMSE1fbGhfbmV3KEVSUl9TVEFURSxlcnJfc3RhdGUpCisjZGVmaW5lIGxoX0VSUl9TVEFURV9pbnNlcnQobGgsaW5zdCkgTEhNX2xoX2luc2VydChFUlJfU1RBVEUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX3JldHJpZXZlKGxoLGluc3QpIExITV9saF9yZXRyaWV2ZShFUlJfU1RBVEUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKEVSUl9TVEFURSxsaCxpbnN0KQorI2RlZmluZSBsaF9FUlJfU1RBVEVfZG9hbGwobGgsZm4pIExITV9saF9kb2FsbChFUlJfU1RBVEUsbGgsZm4pCisjZGVmaW5lIGxoX0VSUl9TVEFURV9kb2FsbF9hcmcobGgsZm4sYXJnX3R5cGUsYXJnKSBcCisgIExITV9saF9kb2FsbF9hcmcoRVJSX1NUQVRFLGxoLGZuLGFyZ190eXBlLGFyZykKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoRVJSX1NUQVRFLGxoKQorI2RlZmluZSBsaF9FUlJfU1RBVEVfbnVtX2l0ZW1zKGxoKSBMSE1fbGhfbnVtX2l0ZW1zKEVSUl9TVEFURSxsaCkKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2Rvd25fbG9hZChsaCkgTEhNX2xoX2Rvd25fbG9hZChFUlJfU1RBVEUsbGgpCisjZGVmaW5lIGxoX0VSUl9TVEFURV9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKEVSUl9TVEFURSxsaCxvdXQpCisjZGVmaW5lIGxoX0VSUl9TVEFURV9ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKEVSUl9TVEFURSxsaCxvdXQpCisjZGVmaW5lIGxoX0VSUl9TVEFURV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9zdGF0c19iaW8oRVJSX1NUQVRFLGxoLG91dCkKKyNkZWZpbmUgbGhfRVJSX1NUQVRFX2ZyZWUobGgpIExITV9saF9mcmVlKEVSUl9TVEFURSxsaCkKKworI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfbmV3KCkgTEhNX2xoX25ldyhFUlJfU1RSSU5HX0RBVEEsZXJyX3N0cmluZ19kYXRhKQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfaW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoRVJSX1NUUklOR19EQVRBLGxoLGluc3QpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9yZXRyaWV2ZShsaCxpbnN0KSBMSE1fbGhfcmV0cmlldmUoRVJSX1NUUklOR19EQVRBLGxoLGluc3QpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShFUlJfU1RSSU5HX0RBVEEsbGgsaW5zdCkKKyNkZWZpbmUgbGhfRVJSX1NUUklOR19EQVRBX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoRVJSX1NUUklOR19EQVRBLGxoLGZuKQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfZG9hbGxfYXJnKGxoLGZuLGFyZ190eXBlLGFyZykgXAorICBMSE1fbGhfZG9hbGxfYXJnKEVSUl9TVFJJTkdfREFUQSxsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9lcnJvcihsaCkgTEhNX2xoX2Vycm9yKEVSUl9TVFJJTkdfREFUQSxsaCkKKyNkZWZpbmUgbGhfRVJSX1NUUklOR19EQVRBX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhFUlJfU1RSSU5HX0RBVEEsbGgpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9kb3duX2xvYWQobGgpIExITV9saF9kb3duX2xvYWQoRVJSX1NUUklOR19EQVRBLGxoKQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhFUlJfU1RSSU5HX0RBVEEsbGgsb3V0KQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhFUlJfU1RSSU5HX0RBVEEsbGgsb3V0KQorI2RlZmluZSBsaF9FUlJfU1RSSU5HX0RBVEFfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfc3RhdHNfYmlvKEVSUl9TVFJJTkdfREFUQSxsaCxvdXQpCisjZGVmaW5lIGxoX0VSUl9TVFJJTkdfREFUQV9mcmVlKGxoKSBMSE1fbGhfZnJlZShFUlJfU1RSSU5HX0RBVEEsbGgpCisKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9uZXcoKSBMSE1fbGhfbmV3KEVYX0NMQVNTX0lURU0sZXhfY2xhc3NfaXRlbSkKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9pbnNlcnQobGgsaW5zdCkgTEhNX2xoX2luc2VydChFWF9DTEFTU19JVEVNLGxoLGluc3QpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKEVYX0NMQVNTX0lURU0sbGgsaW5zdCkKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShFWF9DTEFTU19JVEVNLGxoLGluc3QpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fZG9hbGwobGgsZm4pIExITV9saF9kb2FsbChFWF9DTEFTU19JVEVNLGxoLGZuKQorI2RlZmluZSBsaF9FWF9DTEFTU19JVEVNX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhFWF9DTEFTU19JVEVNLGxoLGZuLGFyZ190eXBlLGFyZykKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9lcnJvcihsaCkgTEhNX2xoX2Vycm9yKEVYX0NMQVNTX0lURU0sbGgpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fbnVtX2l0ZW1zKGxoKSBMSE1fbGhfbnVtX2l0ZW1zKEVYX0NMQVNTX0lURU0sbGgpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKEVYX0NMQVNTX0lURU0sbGgpCisjZGVmaW5lIGxoX0VYX0NMQVNTX0lURU1fbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhFWF9DTEFTU19JVEVNLGxoLG91dCkKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKEVYX0NMQVNTX0lURU0sbGgsb3V0KQorI2RlZmluZSBsaF9FWF9DTEFTU19JVEVNX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhFWF9DTEFTU19JVEVNLGxoLG91dCkKKyNkZWZpbmUgbGhfRVhfQ0xBU1NfSVRFTV9mcmVlKGxoKSBMSE1fbGhfZnJlZShFWF9DTEFTU19JVEVNLGxoKQorCisjZGVmaW5lIGxoX0ZVTkNUSU9OX25ldygpIExITV9saF9uZXcoRlVOQ1RJT04sZnVuY3Rpb24pCisjZGVmaW5lIGxoX0ZVTkNUSU9OX2luc2VydChsaCxpbnN0KSBMSE1fbGhfaW5zZXJ0KEZVTkNUSU9OLGxoLGluc3QpCisjZGVmaW5lIGxoX0ZVTkNUSU9OX3JldHJpZXZlKGxoLGluc3QpIExITV9saF9yZXRyaWV2ZShGVU5DVElPTixsaCxpbnN0KQorI2RlZmluZSBsaF9GVU5DVElPTl9kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShGVU5DVElPTixsaCxpbnN0KQorI2RlZmluZSBsaF9GVU5DVElPTl9kb2FsbChsaCxmbikgTEhNX2xoX2RvYWxsKEZVTkNUSU9OLGxoLGZuKQorI2RlZmluZSBsaF9GVU5DVElPTl9kb2FsbF9hcmcobGgsZm4sYXJnX3R5cGUsYXJnKSBcCisgIExITV9saF9kb2FsbF9hcmcoRlVOQ1RJT04sbGgsZm4sYXJnX3R5cGUsYXJnKQorI2RlZmluZSBsaF9GVU5DVElPTl9lcnJvcihsaCkgTEhNX2xoX2Vycm9yKEZVTkNUSU9OLGxoKQorI2RlZmluZSBsaF9GVU5DVElPTl9udW1faXRlbXMobGgpIExITV9saF9udW1faXRlbXMoRlVOQ1RJT04sbGgpCisjZGVmaW5lIGxoX0ZVTkNUSU9OX2Rvd25fbG9hZChsaCkgTEhNX2xoX2Rvd25fbG9hZChGVU5DVElPTixsaCkKKyNkZWZpbmUgbGhfRlVOQ1RJT05fbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhGVU5DVElPTixsaCxvdXQpCisjZGVmaW5lIGxoX0ZVTkNUSU9OX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV91c2FnZV9zdGF0c19iaW8oRlVOQ1RJT04sbGgsb3V0KQorI2RlZmluZSBsaF9GVU5DVElPTl9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9zdGF0c19iaW8oRlVOQ1RJT04sbGgsb3V0KQorI2RlZmluZSBsaF9GVU5DVElPTl9mcmVlKGxoKSBMSE1fbGhfZnJlZShGVU5DVElPTixsaCkKKworI2RlZmluZSBsaF9NRU1fbmV3KCkgTEhNX2xoX25ldyhNRU0sbWVtKQorI2RlZmluZSBsaF9NRU1faW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoTUVNLGxoLGluc3QpCisjZGVmaW5lIGxoX01FTV9yZXRyaWV2ZShsaCxpbnN0KSBMSE1fbGhfcmV0cmlldmUoTUVNLGxoLGluc3QpCisjZGVmaW5lIGxoX01FTV9kZWxldGUobGgsaW5zdCkgTEhNX2xoX2RlbGV0ZShNRU0sbGgsaW5zdCkKKyNkZWZpbmUgbGhfTUVNX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoTUVNLGxoLGZuKQorI2RlZmluZSBsaF9NRU1fZG9hbGxfYXJnKGxoLGZuLGFyZ190eXBlLGFyZykgXAorICBMSE1fbGhfZG9hbGxfYXJnKE1FTSxsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX01FTV9lcnJvcihsaCkgTEhNX2xoX2Vycm9yKE1FTSxsaCkKKyNkZWZpbmUgbGhfTUVNX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhNRU0sbGgpCisjZGVmaW5lIGxoX01FTV9kb3duX2xvYWQobGgpIExITV9saF9kb3duX2xvYWQoTUVNLGxoKQorI2RlZmluZSBsaF9NRU1fbm9kZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3N0YXRzX2JpbyhNRU0sbGgsb3V0KQorI2RlZmluZSBsaF9NRU1fbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhNRU0sbGgsb3V0KQorI2RlZmluZSBsaF9NRU1fc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfc3RhdHNfYmlvKE1FTSxsaCxvdXQpCisjZGVmaW5lIGxoX01FTV9mcmVlKGxoKSBMSE1fbGhfZnJlZShNRU0sbGgpCisKKyNkZWZpbmUgbGhfT0JKX05BTUVfbmV3KCkgTEhNX2xoX25ldyhPQkpfTkFNRSxvYmpfbmFtZSkKKyNkZWZpbmUgbGhfT0JKX05BTUVfaW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoT0JKX05BTUUsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT0JKX05BTUVfcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKE9CSl9OQU1FLGxoLGluc3QpCisjZGVmaW5lIGxoX09CSl9OQU1FX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKE9CSl9OQU1FLGxoLGluc3QpCisjZGVmaW5lIGxoX09CSl9OQU1FX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoT0JKX05BTUUsbGgsZm4pCisjZGVmaW5lIGxoX09CSl9OQU1FX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhPQkpfTkFNRSxsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX09CSl9OQU1FX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoT0JKX05BTUUsbGgpCisjZGVmaW5lIGxoX09CSl9OQU1FX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhPQkpfTkFNRSxsaCkKKyNkZWZpbmUgbGhfT0JKX05BTUVfZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKE9CSl9OQU1FLGxoKQorI2RlZmluZSBsaF9PQkpfTkFNRV9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKE9CSl9OQU1FLGxoLG91dCkKKyNkZWZpbmUgbGhfT0JKX05BTUVfbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhPQkpfTkFNRSxsaCxvdXQpCisjZGVmaW5lIGxoX09CSl9OQU1FX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhPQkpfTkFNRSxsaCxvdXQpCisjZGVmaW5lIGxoX09CSl9OQU1FX2ZyZWUobGgpIExITV9saF9mcmVlKE9CSl9OQU1FLGxoKQorCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19uZXcoKSBMSE1fbGhfbmV3KE9QRU5TU0xfQ1NUUklORyxvcGVuc3NsX2NzdHJpbmcpCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19pbnNlcnQobGgsaW5zdCkgTEhNX2xoX2luc2VydChPUEVOU1NMX0NTVFJJTkcsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX3JldHJpZXZlKGxoLGluc3QpIExITV9saF9yZXRyaWV2ZShPUEVOU1NMX0NTVFJJTkcsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKE9QRU5TU0xfQ1NUUklORyxsaCxpbnN0KQorI2RlZmluZSBsaF9PUEVOU1NMX0NTVFJJTkdfZG9hbGwobGgsZm4pIExITV9saF9kb2FsbChPUEVOU1NMX0NTVFJJTkcsbGgsZm4pCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19kb2FsbF9hcmcobGgsZm4sYXJnX3R5cGUsYXJnKSBcCisgIExITV9saF9kb2FsbF9hcmcoT1BFTlNTTF9DU1RSSU5HLGxoLGZuLGFyZ190eXBlLGFyZykKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoT1BFTlNTTF9DU1RSSU5HLGxoKQorI2RlZmluZSBsaF9PUEVOU1NMX0NTVFJJTkdfbnVtX2l0ZW1zKGxoKSBMSE1fbGhfbnVtX2l0ZW1zKE9QRU5TU0xfQ1NUUklORyxsaCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX2Rvd25fbG9hZChsaCkgTEhNX2xoX2Rvd25fbG9hZChPUEVOU1NMX0NTVFJJTkcsbGgpCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKE9QRU5TU0xfQ1NUUklORyxsaCxvdXQpCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKE9QRU5TU0xfQ1NUUklORyxsaCxvdXQpCisjZGVmaW5lIGxoX09QRU5TU0xfQ1NUUklOR19zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9zdGF0c19iaW8oT1BFTlNTTF9DU1RSSU5HLGxoLG91dCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9DU1RSSU5HX2ZyZWUobGgpIExITV9saF9mcmVlKE9QRU5TU0xfQ1NUUklORyxsaCkKKworI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19uZXcoKSBMSE1fbGhfbmV3KE9QRU5TU0xfU1RSSU5HLG9wZW5zc2xfc3RyaW5nKQorI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19pbnNlcnQobGgsaW5zdCkgTEhNX2xoX2luc2VydChPUEVOU1NMX1NUUklORyxsaCxpbnN0KQorI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19yZXRyaWV2ZShsaCxpbnN0KSBMSE1fbGhfcmV0cmlldmUoT1BFTlNTTF9TVFJJTkcsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZGVsZXRlKGxoLGluc3QpIExITV9saF9kZWxldGUoT1BFTlNTTF9TVFJJTkcsbGgsaW5zdCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZG9hbGwobGgsZm4pIExITV9saF9kb2FsbChPUEVOU1NMX1NUUklORyxsaCxmbikKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZG9hbGxfYXJnKGxoLGZuLGFyZ190eXBlLGFyZykgXAorICBMSE1fbGhfZG9hbGxfYXJnKE9QRU5TU0xfU1RSSU5HLGxoLGZuLGFyZ190eXBlLGFyZykKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZXJyb3IobGgpIExITV9saF9lcnJvcihPUEVOU1NMX1NUUklORyxsaCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfbnVtX2l0ZW1zKGxoKSBMSE1fbGhfbnVtX2l0ZW1zKE9QRU5TU0xfU1RSSU5HLGxoKQorI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19kb3duX2xvYWQobGgpIExITV9saF9kb3duX2xvYWQoT1BFTlNTTF9TVFJJTkcsbGgpCisjZGVmaW5lIGxoX09QRU5TU0xfU1RSSU5HX25vZGVfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfbm9kZV9zdGF0c19iaW8oT1BFTlNTTF9TVFJJTkcsbGgsb3V0KQorI2RlZmluZSBsaF9PUEVOU1NMX1NUUklOR19ub2RlX3VzYWdlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfdXNhZ2Vfc3RhdHNfYmlvKE9QRU5TU0xfU1RSSU5HLGxoLG91dCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfc3RhdHNfYmlvKGxoLG91dCkgXAorICBMSE1fbGhfc3RhdHNfYmlvKE9QRU5TU0xfU1RSSU5HLGxoLG91dCkKKyNkZWZpbmUgbGhfT1BFTlNTTF9TVFJJTkdfZnJlZShsaCkgTEhNX2xoX2ZyZWUoT1BFTlNTTF9TVFJJTkcsbGgpCisKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fbmV3KCkgTEhNX2xoX25ldyhTU0xfU0VTU0lPTixzc2xfc2Vzc2lvbikKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05faW5zZXJ0KGxoLGluc3QpIExITV9saF9pbnNlcnQoU1NMX1NFU1NJT04sbGgsaW5zdCkKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fcmV0cmlldmUobGgsaW5zdCkgTEhNX2xoX3JldHJpZXZlKFNTTF9TRVNTSU9OLGxoLGluc3QpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2RlbGV0ZShsaCxpbnN0KSBMSE1fbGhfZGVsZXRlKFNTTF9TRVNTSU9OLGxoLGluc3QpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2RvYWxsKGxoLGZuKSBMSE1fbGhfZG9hbGwoU1NMX1NFU1NJT04sbGgsZm4pCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2RvYWxsX2FyZyhsaCxmbixhcmdfdHlwZSxhcmcpIFwKKyAgTEhNX2xoX2RvYWxsX2FyZyhTU0xfU0VTU0lPTixsaCxmbixhcmdfdHlwZSxhcmcpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2Vycm9yKGxoKSBMSE1fbGhfZXJyb3IoU1NMX1NFU1NJT04sbGgpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX251bV9pdGVtcyhsaCkgTEhNX2xoX251bV9pdGVtcyhTU0xfU0VTU0lPTixsaCkKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fZG93bl9sb2FkKGxoKSBMSE1fbGhfZG93bl9sb2FkKFNTTF9TRVNTSU9OLGxoKQorI2RlZmluZSBsaF9TU0xfU0VTU0lPTl9ub2RlX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX25vZGVfc3RhdHNfYmlvKFNTTF9TRVNTSU9OLGxoLG91dCkKKyNkZWZpbmUgbGhfU1NMX1NFU1NJT05fbm9kZV91c2FnZV9zdGF0c19iaW8obGgsb3V0KSBcCisgIExITV9saF9ub2RlX3VzYWdlX3N0YXRzX2JpbyhTU0xfU0VTU0lPTixsaCxvdXQpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX3N0YXRzX2JpbyhsaCxvdXQpIFwKKyAgTEhNX2xoX3N0YXRzX2JpbyhTU0xfU0VTU0lPTixsaCxvdXQpCisjZGVmaW5lIGxoX1NTTF9TRVNTSU9OX2ZyZWUobGgpIExITV9saF9mcmVlKFNTTF9TRVNTSU9OLGxoKQorLyogRW5kIG9mIHV0aWwvbWtzdGFjay5wbCBibG9jaywgeW91IG1heSBub3cgZWRpdCA6LSkgKi8KKworI2VuZGlmIC8qICFkZWZpbmVkIEhFQURFUl9TQUZFU1RBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3NoYS5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3NoYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2FjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvc2hhLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8qIGNyeXB0by9zaGEvc2hhLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfU0hBX0gKKyNkZWZpbmUgSEVBREVSX1NIQV9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfTk9fU0hBKSB8fCAoZGVmaW5lZChPUEVOU1NMX05PX1NIQTApICYmIGRlZmluZWQoT1BFTlNTTF9OT19TSEExKSkKKyNlcnJvciBTSEEgaXMgZGlzYWJsZWQuCisjZW5kaWYKKworI2lmIGRlZmluZWQoT1BFTlNTTF9GSVBTKQorI2RlZmluZSBGSVBTX1NIQV9TSVpFX1Qgc2l6ZV90CisjZW5kaWYKKworLyoKKyAqICEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEKKyAqICEgU0hBX0xPTkcgaGFzIHRvIGJlIGF0IGxlYXN0IDMyIGJpdHMgd2lkZS4gSWYgaXQncyB3aWRlciwgdGhlbiAhCisgKiAhIFNIQV9MT05HX0xPRzIgaGFzIHRvIGJlIGRlZmluZWQgYWxvbmcuICAgICAgICAgICAgICAgICAgICAgICAgIQorICogISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhIQorICovCisKKyNpZiBkZWZpbmVkKF9fTFAzMl9fKQorI2RlZmluZSBTSEFfTE9ORyB1bnNpZ25lZCBsb25nCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX0NSQVkpIHx8IGRlZmluZWQoX19JTFA2NF9fKQorI2RlZmluZSBTSEFfTE9ORyB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFNIQV9MT05HX0xPRzIgMworI2Vsc2UKKyNkZWZpbmUgU0hBX0xPTkcgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSBTSEFfTEJMT0NLCTE2CisjZGVmaW5lIFNIQV9DQkxPQ0sJKFNIQV9MQkxPQ0sqNCkJLyogU0hBIHRyZWF0cyBpbnB1dCBkYXRhIGFzIGEKKwkJCQkJICogY29udGlndW91cyBhcnJheSBvZiAzMiBiaXQKKwkJCQkJICogd2lkZSBiaWctZW5kaWFuIHZhbHVlcy4gKi8KKyNkZWZpbmUgU0hBX0xBU1RfQkxPQ0sgIChTSEFfQ0JMT0NLLTgpCisjZGVmaW5lIFNIQV9ESUdFU1RfTEVOR1RIIDIwCisKK3R5cGVkZWYgc3RydWN0IFNIQXN0YXRlX3N0CisJeworCVNIQV9MT05HIGgwLGgxLGgyLGgzLGg0OworCVNIQV9MT05HIE5sLE5oOworCVNIQV9MT05HIGRhdGFbU0hBX0xCTE9DS107CisJdW5zaWduZWQgaW50IG51bTsKKwl9IFNIQV9DVFg7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEwCitpbnQgU0hBX0luaXQoU0hBX0NUWCAqYyk7CitpbnQgU0hBX1VwZGF0ZShTSEFfQ1RYICpjLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKTsKK2ludCBTSEFfRmluYWwodW5zaWduZWQgY2hhciAqbWQsIFNIQV9DVFggKmMpOwordW5zaWduZWQgY2hhciAqU0hBKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIHNpemVfdCBuLCB1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIFNIQV9UcmFuc2Zvcm0oU0hBX0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEExCitpbnQgU0hBMV9Jbml0KFNIQV9DVFggKmMpOworaW50IFNIQTFfVXBkYXRlKFNIQV9DVFggKmMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworaW50IFNIQTFfRmluYWwodW5zaWduZWQgY2hhciAqbWQsIFNIQV9DVFggKmMpOwordW5zaWduZWQgY2hhciAqU0hBMShjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3QgbiwgdW5zaWduZWQgY2hhciAqbWQpOwordm9pZCBTSEExX1RyYW5zZm9ybShTSEFfQ1RYICpjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKKyNlbmRpZgorCisjZGVmaW5lIFNIQTI1Nl9DQkxPQ0sJKFNIQV9MQkxPQ0sqNCkJLyogU0hBLTI1NiB0cmVhdHMgaW5wdXQgZGF0YSBhcyBhCisJCQkJCSAqIGNvbnRpZ3VvdXMgYXJyYXkgb2YgMzIgYml0CisJCQkJCSAqIHdpZGUgYmlnLWVuZGlhbiB2YWx1ZXMuICovCisjZGVmaW5lIFNIQTIyNF9ESUdFU1RfTEVOR1RICTI4CisjZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RICTMyCisKK3R5cGVkZWYgc3RydWN0IFNIQTI1NnN0YXRlX3N0CisJeworCVNIQV9MT05HIGhbOF07CisJU0hBX0xPTkcgTmwsTmg7CisJU0hBX0xPTkcgZGF0YVtTSEFfTEJMT0NLXTsKKwl1bnNpZ25lZCBpbnQgbnVtLG1kX2xlbjsKKwl9IFNIQTI1Nl9DVFg7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEyNTYKK2ludCBTSEEyMjRfSW5pdChTSEEyNTZfQ1RYICpjKTsKK2ludCBTSEEyMjRfVXBkYXRlKFNIQTI1Nl9DVFggKmMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworaW50IFNIQTIyNF9GaW5hbCh1bnNpZ25lZCBjaGFyICptZCwgU0hBMjU2X0NUWCAqYyk7Cit1bnNpZ25lZCBjaGFyICpTSEEyMjQoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sdW5zaWduZWQgY2hhciAqbWQpOworaW50IFNIQTI1Nl9Jbml0KFNIQTI1Nl9DVFggKmMpOworaW50IFNIQTI1Nl9VcGRhdGUoU0hBMjU2X0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgU0hBMjU2X0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBTSEEyNTZfQ1RYICpjKTsKK3Vuc2lnbmVkIGNoYXIgKlNIQTI1Nihjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3Qgbix1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIFNIQTI1Nl9UcmFuc2Zvcm0oU0hBMjU2X0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKworI2RlZmluZSBTSEEzODRfRElHRVNUX0xFTkdUSAk0OAorI2RlZmluZSBTSEE1MTJfRElHRVNUX0xFTkdUSAk2NAorCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBNTEyCisvKgorICogVW5saWtlIDMyLWJpdCBkaWdlc3QgYWxnb3JpdGhtcywgU0hBLTUxMiAqcmVsaWVzKiBvbiBTSEFfTE9ORzY0CisgKiBiZWluZyBleGFjdGx5IDY0LWJpdCB3aWRlLiBTZWUgSW1wbGVtZW50YXRpb24gTm90ZXMgaW4gc2hhNTEyLmMKKyAqIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgKi8KKyNkZWZpbmUgU0hBNTEyX0NCTE9DSwkoU0hBX0xCTE9DSyo4KQkvKiBTSEEtNTEyIHRyZWF0cyBpbnB1dCBkYXRhIGFzIGEKKwkJCQkJICogY29udGlndW91cyBhcnJheSBvZiA2NCBiaXQKKwkJCQkJICogd2lkZSBiaWctZW5kaWFuIHZhbHVlcy4gKi8KKyNpZiAoZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KSkgJiYgIWRlZmluZWQoX19NSU5HVzMyX18pCisjZGVmaW5lIFNIQV9MT05HNjQgdW5zaWduZWQgX19pbnQ2NAorI2RlZmluZSBVNjQoQykgICAgIEMjI1VJNjQKKyNlbGlmIGRlZmluZWQoX19hcmNoNjRfXykKKyNkZWZpbmUgU0hBX0xPTkc2NCB1bnNpZ25lZCBsb25nCisjZGVmaW5lIFU2NChDKSAgICAgQyMjVUwKKyNlbHNlCisjZGVmaW5lIFNIQV9MT05HNjQgdW5zaWduZWQgbG9uZyBsb25nCisjZGVmaW5lIFU2NChDKSAgICAgQyMjVUxMCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgU0hBNTEyc3RhdGVfc3QKKwl7CisJU0hBX0xPTkc2NCBoWzhdOworCVNIQV9MT05HNjQgTmwsTmg7CisJdW5pb24geworCQlTSEFfTE9ORzY0CWRbU0hBX0xCTE9DS107CisJCXVuc2lnbmVkIGNoYXIJcFtTSEE1MTJfQ0JMT0NLXTsKKwl9IHU7CisJdW5zaWduZWQgaW50IG51bSxtZF9sZW47CisJfSBTSEE1MTJfQ1RYOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEE1MTIKK2ludCBTSEEzODRfSW5pdChTSEE1MTJfQ1RYICpjKTsKK2ludCBTSEEzODRfVXBkYXRlKFNIQTUxMl9DVFggKmMsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pOworaW50IFNIQTM4NF9GaW5hbCh1bnNpZ25lZCBjaGFyICptZCwgU0hBNTEyX0NUWCAqYyk7Cit1bnNpZ25lZCBjaGFyICpTSEEzODQoY29uc3QgdW5zaWduZWQgY2hhciAqZCwgc2l6ZV90IG4sdW5zaWduZWQgY2hhciAqbWQpOworaW50IFNIQTUxMl9Jbml0KFNIQTUxMl9DVFggKmMpOworaW50IFNIQTUxMl9VcGRhdGUoU0hBNTEyX0NUWCAqYywgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitpbnQgU0hBNTEyX0ZpbmFsKHVuc2lnbmVkIGNoYXIgKm1kLCBTSEE1MTJfQ1RYICpjKTsKK3Vuc2lnbmVkIGNoYXIgKlNIQTUxMihjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBzaXplX3Qgbix1bnNpZ25lZCBjaGFyICptZCk7Cit2b2lkIFNIQTUxMl9UcmFuc2Zvcm0oU0hBNTEyX0NUWCAqYywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSk7CisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3NzbC5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3NzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MjBmNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvc3NsLmgKQEAgLTAsMCArMSwyMzIwIEBACisvKiBzc2wvc3NsLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIEVDQyBjaXBoZXIgc3VpdGUgc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNSBOb2tpYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgcG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgaXMgZGV2ZWxvcGVkIGJ5CisgKiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiwgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mCisgKiBOb2tpYSBDb3Jwb3JhdGlvbiwgY29uc2lzdHMgb2YgdGhlICJQU0siIChQcmUtU2hhcmVkIEtleSkgY2lwaGVyc3VpdGVzCisgKiBzdXBwb3J0IChzZWUgUkZDIDQyNzkpIHRvIE9wZW5TU0wuCisgKgorICogTm8gcGF0ZW50IGxpY2Vuc2VzIG9yIG90aGVyIHJpZ2h0cyBleGNlcHQgdGhvc2UgZXhwcmVzc2x5IHN0YXRlZCBpbgorICogdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UgbGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgZ3JhbnRlZCBvciByZWNlaXZlZAorICogZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwsIG9yIG90aGVyd2lzZS4KKyAqCisgKiBObyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBOb2tpYSB0aGF0IHRoZSBDb250cmlidXRpb24gZG9lcyBub3QKKyAqIGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgdGhpcmQKKyAqIHBhcnR5IG9yIHRoYXQgdGhlIGxpY2Vuc2UgcHJvdmlkZXMgeW91IHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgcmlnaHRzCisgKiB0byBtYWtlIHVzZSBvZiB0aGUgQ29udHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQuIElOCisgKiBBRERJVElPTiBUTyBUSEUgRElTQ0xBSU1FUlMgSU5DTFVERUQgSU4gVEhFIExJQ0VOU0UsIE5PS0lBCisgKiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgRk9SIENMQUlNUyBCUk9VR0hUIEJZIFlPVSBPUiBBTlkKKyAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgorICogT1RIRVJXSVNFLgorICovCisKKyNpZm5kZWYgSEVBREVSX1NTTF9IIAorI2RlZmluZSBIRUFERVJfU1NMX0ggCisKKyNpbmNsdWRlIDxvcGVuc3NsL2Vfb3MyLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisjaW5jbHVkZSA8b3BlbnNzbC9jb21wLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREVQUkVDQVRFRAorI2lmbmRlZiBPUEVOU1NMX05PX1g1MDkKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorCisjaW5jbHVkZSA8b3BlbnNzbC9rc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zYWZlc3RhY2suaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFNTTGVheSB2ZXJzaW9uIG51bWJlciBmb3IgQVNOLjEgZW5jb2Rpbmcgb2YgdGhlIHNlc3Npb24gaW5mb3JtYXRpb24gKi8KKy8qIFZlcnNpb24gMCAtIGluaXRpYWwgdmVyc2lvbgorICogVmVyc2lvbiAxIC0gYWRkZWQgdGhlIG9wdGlvbmFsIHBlZXIgY2VydGlmaWNhdGUKKyAqLworI2RlZmluZSBTU0xfU0VTU0lPTl9BU04xX1ZFUlNJT04gMHgwMDAxCisKKy8qIHRleHQgc3RyaW5ncyBmb3IgdGhlIGNpcGhlcnMgKi8KKyNkZWZpbmUgU1NMX1RYVF9OVUxMX1dJVEhfTUQ1CQlTU0wyX1RYVF9OVUxMX1dJVEhfTUQ1CQkJCisjZGVmaW5lIFNTTF9UWFRfUkM0XzEyOF9XSVRIX01ENQlTU0wyX1RYVF9SQzRfMTI4X1dJVEhfTUQ1CQkKKyNkZWZpbmUgU1NMX1RYVF9SQzRfMTI4X0VYUE9SVDQwX1dJVEhfTUQ1IFNTTDJfVFhUX1JDNF8xMjhfRVhQT1JUNDBfV0lUSF9NRDUJCisjZGVmaW5lIFNTTF9UWFRfUkMyXzEyOF9DQkNfV0lUSF9NRDUJU1NMMl9UWFRfUkMyXzEyOF9DQkNfV0lUSF9NRDUJCQorI2RlZmluZSBTU0xfVFhUX1JDMl8xMjhfQ0JDX0VYUE9SVDQwX1dJVEhfTUQ1IFNTTDJfVFhUX1JDMl8xMjhfQ0JDX0VYUE9SVDQwX1dJVEhfTUQ1CQorI2RlZmluZSBTU0xfVFhUX0lERUFfMTI4X0NCQ19XSVRIX01ENQlTU0wyX1RYVF9JREVBXzEyOF9DQkNfV0lUSF9NRDUJCQorI2RlZmluZSBTU0xfVFhUX0RFU182NF9DQkNfV0lUSF9NRDUJU1NMMl9UWFRfREVTXzY0X0NCQ19XSVRIX01ENQkJCisjZGVmaW5lIFNTTF9UWFRfREVTXzY0X0NCQ19XSVRIX1NIQQlTU0wyX1RYVF9ERVNfNjRfQ0JDX1dJVEhfU0hBCQkKKyNkZWZpbmUgU1NMX1RYVF9ERVNfMTkyX0VERTNfQ0JDX1dJVEhfTUQ1IFNTTDJfVFhUX0RFU18xOTJfRURFM19DQkNfV0lUSF9NRDUJCisjZGVmaW5lIFNTTF9UWFRfREVTXzE5Ml9FREUzX0NCQ19XSVRIX1NIQSBTU0wyX1RYVF9ERVNfMTkyX0VERTNfQ0JDX1dJVEhfU0hBCQorCisvKiAgICBWUlMgQWRkaXRpb25hbCBLZXJiZXJvczUgZW50cmllcworICovCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9ERVNfNjRfQ0JDX1NIQSAgIFNTTDNfVFhUX0tSQjVfREVTXzY0X0NCQ19TSEEKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19TSEEgU1NMM19UWFRfS1JCNV9ERVNfMTkyX0NCQzNfU0hBCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9SQzRfMTI4X1NIQSAgICAgIFNTTDNfVFhUX0tSQjVfUkM0XzEyOF9TSEEKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0lERUFfMTI4X0NCQ19TSEEgU1NMM19UWFRfS1JCNV9JREVBXzEyOF9DQkNfU0hBCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9ERVNfNjRfQ0JDX01ENSAgIFNTTDNfVFhUX0tSQjVfREVTXzY0X0NCQ19NRDUgICAgICAgCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9ERVNfMTkyX0NCQzNfTUQ1IFNTTDNfVFhUX0tSQjVfREVTXzE5Ml9DQkMzX01ENSAgICAgICAKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X1JDNF8xMjhfTUQ1ICAgICAgU1NMM19UWFRfS1JCNV9SQzRfMTI4X01ENQorI2RlZmluZSBTU0xfVFhUX0tSQjVfSURFQV8xMjhfQ0JDX01ENSBTU0wzX1RYVF9LUkI1X0lERUFfMTI4X0NCQ19NRDUgCisKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU180MF9DQkNfU0hBICAgU1NMM19UWFRfS1JCNV9ERVNfNDBfQ0JDX1NIQSAKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X1JDMl80MF9DQkNfU0hBICAgU1NMM19UWFRfS1JCNV9SQzJfNDBfQ0JDX1NIQSAKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X1JDNF80MF9TSEEJICAgICAgU1NMM19UWFRfS1JCNV9SQzRfNDBfU0hBCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9ERVNfNDBfQ0JDX01ENSAgIFNTTDNfVFhUX0tSQjVfREVTXzQwX0NCQ19NRDUgCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9SQzJfNDBfQ0JDX01ENSAgIFNTTDNfVFhUX0tSQjVfUkMyXzQwX0NCQ19NRDUgCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9SQzRfNDBfTUQ1CSAgICAgIFNTTDNfVFhUX0tSQjVfUkM0XzQwX01ENQorCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9ERVNfNDBfQ0JDX1NIQSAgIFNTTDNfVFhUX0tSQjVfREVTXzQwX0NCQ19TSEEKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU180MF9DQkNfTUQ1ICAgU1NMM19UWFRfS1JCNV9ERVNfNDBfQ0JDX01ENQorI2RlZmluZSBTU0xfVFhUX0tSQjVfREVTXzY0X0NCQ19TSEEgICBTU0wzX1RYVF9LUkI1X0RFU182NF9DQkNfU0hBCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9ERVNfNjRfQ0JDX01ENSAgIFNTTDNfVFhUX0tSQjVfREVTXzY0X0NCQ19NRDUKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19TSEEgU1NMM19UWFRfS1JCNV9ERVNfMTkyX0NCQzNfU0hBCisjZGVmaW5lIFNTTF9UWFRfS1JCNV9ERVNfMTkyX0NCQzNfTUQ1IFNTTDNfVFhUX0tSQjVfREVTXzE5Ml9DQkMzX01ENQorI2RlZmluZSBTU0xfTUFYX0tSQjVfUFJJTkNJUEFMX0xFTkdUSCAgMjU2CisKKyNkZWZpbmUgU1NMX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgJCTMyCisjZGVmaW5lIFNTTF9NQVhfU0lEX0NUWF9MRU5HVEgJCQkzMgorCisjZGVmaW5lIFNTTF9NSU5fUlNBX01PRFVMVVNfTEVOR1RIX0lOX0JZVEVTCSg1MTIvOCkKKyNkZWZpbmUgU1NMX01BWF9LRVlfQVJHX0xFTkdUSAkJCTgKKyNkZWZpbmUgU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSAkJNDgKKworCisvKiBUaGVzZSBhcmUgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIGNpcGhlcnMgdG8gdXNlIGFuZCBub3QgdG8gdXNlICovCisKKyNkZWZpbmUgU1NMX1RYVF9FWFA0MAkJIkVYUE9SVDQwIgorI2RlZmluZSBTU0xfVFhUX0VYUDU2CQkiRVhQT1JUNTYiCisjZGVmaW5lIFNTTF9UWFRfTE9XCQkiTE9XIgorI2RlZmluZSBTU0xfVFhUX01FRElVTQkJIk1FRElVTSIKKyNkZWZpbmUgU1NMX1RYVF9ISUdICQkiSElHSCIKKyNkZWZpbmUgU1NMX1RYVF9GSVBTCQkiRklQUyIKKworI2RlZmluZSBTU0xfVFhUX2tGWkEJCSJrRlpBIiAvKiB1bnVzZWQhICovCisjZGVmaW5lCVNTTF9UWFRfYUZaQQkJImFGWkEiIC8qIHVudXNlZCEgKi8KKyNkZWZpbmUgU1NMX1RYVF9lRlpBCQkiZUZaQSIgLyogdW51c2VkISAqLworI2RlZmluZSBTU0xfVFhUX0ZaQQkJIkZaQSIgIC8qIHVudXNlZCEgKi8KKworI2RlZmluZQlTU0xfVFhUX2FOVUxMCQkiYU5VTEwiCisjZGVmaW5lCVNTTF9UWFRfZU5VTEwJCSJlTlVMTCIKKyNkZWZpbmUJU1NMX1RYVF9OVUxMCQkiTlVMTCIKKworI2RlZmluZSBTU0xfVFhUX2tSU0EJCSJrUlNBIgorI2RlZmluZSBTU0xfVFhUX2tESHIJCSJrREhyIiAvKiBubyBzdWNoIGNpcGhlcnN1aXRlcyBzdXBwb3J0ZWQhICovCisjZGVmaW5lIFNTTF9UWFRfa0RIZAkJImtESGQiIC8qIG5vIHN1Y2ggY2lwaGVyc3VpdGVzIHN1cHBvcnRlZCEgKi8KKyNkZWZpbmUgU1NMX1RYVF9rREggCQkia0RIIiAgLyogbm8gc3VjaCBjaXBoZXJzdWl0ZXMgc3VwcG9ydGVkISAqLworI2RlZmluZSBTU0xfVFhUX2tFREgJCSJrRURIIgorI2RlZmluZSBTU0xfVFhUX2tLUkI1ICAgICAJImtLUkI1IgorI2RlZmluZSBTU0xfVFhUX2tFQ0RIcgkJImtFQ0RIciIKKyNkZWZpbmUgU1NMX1RYVF9rRUNESGUJCSJrRUNESGUiCisjZGVmaW5lIFNTTF9UWFRfa0VDREgJCSJrRUNESCIKKyNkZWZpbmUgU1NMX1RYVF9rRUVDREgJCSJrRUVDREgiCisjZGVmaW5lIFNTTF9UWFRfa1BTSyAgICAgICAgICAgICJrUFNLIgorI2RlZmluZSBTU0xfVFhUX2tHT1NUCQkia0dPU1QiCisKKyNkZWZpbmUJU1NMX1RYVF9hUlNBCQkiYVJTQSIKKyNkZWZpbmUJU1NMX1RYVF9hRFNTCQkiYURTUyIKKyNkZWZpbmUJU1NMX1RYVF9hREgJCSJhREgiIC8qIG5vIHN1Y2ggY2lwaGVyc3VpdGVzIHN1cHBvcnRlZCEgKi8KKyNkZWZpbmUJU1NMX1RYVF9hRUNESAkJImFFQ0RIIgorI2RlZmluZSBTU0xfVFhUX2FLUkI1ICAgICAJImFLUkI1IgorI2RlZmluZSBTU0xfVFhUX2FFQ0RTQQkJImFFQ0RTQSIKKyNkZWZpbmUgU1NMX1RYVF9hUFNLICAgICAgICAgICAgImFQU0siCisjZGVmaW5lIFNTTF9UWFRfYUdPU1Q5NAkiYUdPU1Q5NCIKKyNkZWZpbmUgU1NMX1RYVF9hR09TVDAxICJhR09TVDAxIgorI2RlZmluZSBTU0xfVFhUX2FHT1NUICAiYUdPU1QiCisKKyNkZWZpbmUJU1NMX1RYVF9EU1MJCSJEU1MiCisjZGVmaW5lIFNTTF9UWFRfREgJCSJESCIKKyNkZWZpbmUgU1NMX1RYVF9FREgJCSJFREgiIC8qIHNhbWUgYXMgImtFREg6LUFESCIgKi8KKyNkZWZpbmUgU1NMX1RYVF9BREgJCSJBREgiCisjZGVmaW5lIFNTTF9UWFRfUlNBCQkiUlNBIgorI2RlZmluZSBTU0xfVFhUX0VDREgJCSJFQ0RIIgorI2RlZmluZSBTU0xfVFhUX0VFQ0RICQkiRUVDREgiIC8qIHNhbWUgYXMgImtFRUNESDotQUVDREgiICovCisjZGVmaW5lIFNTTF9UWFRfQUVDREgJCSJBRUNESCIKKyNkZWZpbmUgU1NMX1RYVF9FQ0RTQQkJIkVDRFNBIgorI2RlZmluZSBTU0xfVFhUX0tSQjUgICAgICAJIktSQjUiCisjZGVmaW5lIFNTTF9UWFRfUFNLICAgICAgICAgICAgICJQU0siCisKKyNkZWZpbmUgU1NMX1RYVF9ERVMJCSJERVMiCisjZGVmaW5lIFNTTF9UWFRfM0RFUwkJIjNERVMiCisjZGVmaW5lIFNTTF9UWFRfUkM0CQkiUkM0IgorI2RlZmluZSBTU0xfVFhUX1JDMgkJIlJDMiIKKyNkZWZpbmUgU1NMX1RYVF9JREVBCQkiSURFQSIKKyNkZWZpbmUgU1NMX1RYVF9TRUVECQkiU0VFRCIKKyNkZWZpbmUgU1NMX1RYVF9BRVMxMjgJCSJBRVMxMjgiCisjZGVmaW5lIFNTTF9UWFRfQUVTMjU2CQkiQUVTMjU2IgorI2RlZmluZSBTU0xfVFhUX0FFUwkJIkFFUyIKKyNkZWZpbmUgU1NMX1RYVF9DQU1FTExJQTEyOAkiQ0FNRUxMSUExMjgiCisjZGVmaW5lIFNTTF9UWFRfQ0FNRUxMSUEyNTYJIkNBTUVMTElBMjU2IgorI2RlZmluZSBTU0xfVFhUX0NBTUVMTElBCSJDQU1FTExJQSIKKworI2RlZmluZSBTU0xfVFhUX01ENQkJIk1ENSIKKyNkZWZpbmUgU1NMX1RYVF9TSEExCQkiU0hBMSIKKyNkZWZpbmUgU1NMX1RYVF9TSEEJCSJTSEEiIC8qIHNhbWUgYXMgIlNIQTEiICovCisjZGVmaW5lIFNTTF9UWFRfR09TVDk0CQkiR09TVDk0IiAKKyNkZWZpbmUgU1NMX1RYVF9HT1NUODlNQUMJCSJHT1NUODlNQUMiIAorCisjZGVmaW5lIFNTTF9UWFRfU1NMVjIJCSJTU0x2MiIKKyNkZWZpbmUgU1NMX1RYVF9TU0xWMwkJIlNTTHYzIgorI2RlZmluZSBTU0xfVFhUX1RMU1YxCQkiVExTdjEiCisKKyNkZWZpbmUgU1NMX1RYVF9FWFAJCSJFWFAiCisjZGVmaW5lIFNTTF9UWFRfRVhQT1JUCQkiRVhQT1JUIgorCisjZGVmaW5lIFNTTF9UWFRfQUxMCQkiQUxMIgorCisvKgorICogQ09NUExFTUVOVE9GKiBkZWZpbml0aW9ucy4gVGhlc2UgaWRlbnRpZmllcnMgYXJlIHVzZWQgdG8gKGRlLXNlbGVjdCkKKyAqIGNpcGhlcnMgbm9ybWFsbHkgbm90IGJlaW5nIHVzZWQuCisgKiBFeGFtcGxlOiAiUkM0IiB3aWxsIGFjdGl2YXRlIGFsbCBjaXBoZXJzIHVzaW5nIFJDNCBpbmNsdWRpbmcgY2lwaGVycworICogd2l0aG91dCBhdXRoZW50aWNhdGlvbiwgd2hpY2ggd291bGQgbm9ybWFsbHkgZGlzYWJsZWQgYnkgREVGQVVMVCAoZHVlCisgKiB0aGUgIiFBREgiIGJlaW5nIHBhcnQgb2YgZGVmYXVsdCkuIFRoZXJlZm9yZSAiUkM0OiFDT01QTEVNRU5UT0ZERUZBVUxUIgorICogd2lsbCBtYWtlIHN1cmUgdGhhdCBpdCBpcyBhbHNvIGRpc2FibGVkIGluIHRoZSBzcGVjaWZpYyBzZWxlY3Rpb24uCisgKiBDT01QTEVNRU5UT0YqIGlkZW50aWZpZXJzIGFyZSBwb3J0YWJsZSBiZXR3ZWVuIHZlcnNpb24sIGFzIGFkanVzdG1lbnRzCisgKiB0byB0aGUgZGVmYXVsdCBjaXBoZXIgc2V0dXAgd2lsbCBhbHNvIGJlIGluY2x1ZGVkIGhlcmUuCisgKgorICogQ09NUExFTUVOVE9GREVGQVVMVCBkb2VzIG5vdCBleHBlcmllbmNlIHRoZSBzYW1lIHNwZWNpYWwgdHJlYXRtZW50IHRoYXQKKyAqIERFRkFVTFQgZ2V0cywgYXMgb25seSBzZWxlY3Rpb24gaXMgYmVpbmcgZG9uZSBhbmQgbm8gc29ydGluZyBhcyBuZWVkZWQKKyAqIGZvciBERUZBVUxULgorICovCisjZGVmaW5lIFNTTF9UWFRfQ01QQUxMCQkiQ09NUExFTUVOVE9GQUxMIgorI2RlZmluZSBTU0xfVFhUX0NNUERFRgkJIkNPTVBMRU1FTlRPRkRFRkFVTFQiCisKKy8qIFRoZSBmb2xsb3dpbmcgY2lwaGVyIGxpc3QgaXMgdXNlZCBieSBkZWZhdWx0LgorICogSXQgYWxzbyBpcyBzdWJzdGl0dXRlZCB3aGVuIGFuIGFwcGxpY2F0aW9uLWRlZmluZWQgY2lwaGVyIGxpc3Qgc3RyaW5nCisgKiBzdGFydHMgd2l0aCAnREVGQVVMVCcuICovCisjZGVmaW5lIFNTTF9ERUZBVUxUX0NJUEhFUl9MSVNUCSJBTEw6IWFOVUxMOiFlTlVMTDohU1NMdjIiCisvKiBBcyBvZiBPcGVuU1NMIDEuMC4wLCBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KCkgaW4gc3NsL3NzbF9jaXBoLmMgYWx3YXlzCisgKiBzdGFydHMgd2l0aCBhIHJlYXNvbmFibGUgb3JkZXIsIGFuZCBhbGwgd2UgaGF2ZSB0byBkbyBmb3IgREVGQVVMVCBpcworICogdGhyb3dpbmcgb3V0IGFub255bW91cyBhbmQgdW5lbmNyeXB0ZWQgY2lwaGVyc3VpdGVzIQorICogKFRoZSBsYXR0ZXIgYXJlIG5vdCBhY3R1YWxseSBlbmFibGVkIGJ5IEFMTCwgYnV0ICJBTEw6UlNBIiB3b3VsZCBlbmFibGUKKyAqIHNvbWUgb2YgdGhlbS4pCisgKi8KKworLyogVXNlZCBpbiBTU0xfc2V0X3NodXRkb3duKCkvU1NMX2dldF9zaHV0ZG93bigpOyAqLworI2RlZmluZSBTU0xfU0VOVF9TSFVURE9XTgkxCisjZGVmaW5lIFNTTF9SRUNFSVZFRF9TSFVURE9XTgkyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAoZGVmaW5lZChPUEVOU1NMX05PX1JTQSkgfHwgZGVmaW5lZChPUEVOU1NMX05PX01ENSkpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMikKKyNkZWZpbmUgT1BFTlNTTF9OT19TU0wyCisjZW5kaWYKKworI2RlZmluZSBTU0xfRklMRVRZUEVfQVNOMQlYNTA5X0ZJTEVUWVBFX0FTTjEKKyNkZWZpbmUgU1NMX0ZJTEVUWVBFX1BFTQlYNTA5X0ZJTEVUWVBFX1BFTQorCisvKiBUaGlzIGlzIG5lZWRlZCB0byBzdG9wIGNvbXBpbGVycyBjb21wbGFpbmluZyBhYm91dCB0aGUKKyAqICdzdHJ1Y3Qgc3NsX3N0IConIGZ1bmN0aW9uIHBhcmFtZXRlcnMgdXNlZCB0byBwcm90b3R5cGUgY2FsbGJhY2tzCisgKiBpbiBTU0xfQ1RYLiAqLwordHlwZWRlZiBzdHJ1Y3Qgc3NsX3N0ICpzc2xfY3JvY2tfc3Q7Cit0eXBlZGVmIHN0cnVjdCB0bHNfc2Vzc2lvbl90aWNrZXRfZXh0X3N0IFRMU19TRVNTSU9OX1RJQ0tFVF9FWFQ7CisKKy8qIHVzZWQgdG8gaG9sZCBpbmZvIG9uIHRoZSBwYXJ0aWN1bGFyIGNpcGhlcnMgdXNlZCAqLwordHlwZWRlZiBzdHJ1Y3Qgc3NsX2NpcGhlcl9zdAorCXsKKwlpbnQgdmFsaWQ7CisJY29uc3QgY2hhciAqbmFtZTsJCS8qIHRleHQgbmFtZSAqLworCXVuc2lnbmVkIGxvbmcgaWQ7CQkvKiBpZCwgNCBieXRlcywgZmlyc3QgaXMgdmVyc2lvbiAqLworCisJLyogY2hhbmdlZCBpbiAwLjkuOTogdGhlc2UgZm91ciB1c2VkIHRvIGJlIHBvcnRpb25zIG9mIGEgc2luZ2xlIHZhbHVlICdhbGdvcml0aG1zJyAqLworCXVuc2lnbmVkIGxvbmcgYWxnb3JpdGhtX21rZXk7CS8qIGtleSBleGNoYW5nZSBhbGdvcml0aG0gKi8KKwl1bnNpZ25lZCBsb25nIGFsZ29yaXRobV9hdXRoOwkvKiBzZXJ2ZXIgYXV0aGVudGljYXRpb24gKi8KKwl1bnNpZ25lZCBsb25nIGFsZ29yaXRobV9lbmM7CS8qIHN5bW1ldHJpYyBlbmNyeXB0aW9uICovCisJdW5zaWduZWQgbG9uZyBhbGdvcml0aG1fbWFjOwkvKiBzeW1tZXRyaWMgYXV0aGVudGljYXRpb24gKi8KKwl1bnNpZ25lZCBsb25nIGFsZ29yaXRobV9zc2w7CS8qIChtYWpvcikgcHJvdG9jb2wgdmVyc2lvbiAqLworCisJdW5zaWduZWQgbG9uZyBhbGdvX3N0cmVuZ3RoOwkvKiBzdHJlbmd0aCBhbmQgZXhwb3J0IGZsYWdzICovCisJdW5zaWduZWQgbG9uZyBhbGdvcml0aG0yOwkvKiBFeHRyYSBmbGFncyAqLworCWludCBzdHJlbmd0aF9iaXRzOwkJLyogTnVtYmVyIG9mIGJpdHMgcmVhbGx5IHVzZWQgKi8KKwlpbnQgYWxnX2JpdHM7CQkJLyogTnVtYmVyIG9mIGJpdHMgZm9yIGFsZ29yaXRobSAqLworCX0gU1NMX0NJUEhFUjsKKworREVDTEFSRV9TVEFDS19PRihTU0xfQ0lQSEVSKQorCit0eXBlZGVmIGludCAoKnRsc19zZXNzaW9uX3RpY2tldF9leHRfY2JfZm4pKFNTTCAqcywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwgdm9pZCAqYXJnKTsKK3R5cGVkZWYgaW50ICgqdGxzX3Nlc3Npb25fc2VjcmV0X2NiX2ZuKShTU0wgKnMsIHZvaWQgKnNlY3JldCwgaW50ICpzZWNyZXRfbGVuLCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqcGVlcl9jaXBoZXJzLCBTU0xfQ0lQSEVSICoqY2lwaGVyLCB2b2lkICphcmcpOworCisvKiBVc2VkIHRvIGhvbGQgZnVuY3Rpb25zIGZvciBTU0x2MiBvciBTU0x2My9UTFN2MSBmdW5jdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IHNzbF9tZXRob2Rfc3QKKwl7CisJaW50IHZlcnNpb247CisJaW50ICgqc3NsX25ldykoU1NMICpzKTsKKwl2b2lkICgqc3NsX2NsZWFyKShTU0wgKnMpOworCXZvaWQgKCpzc2xfZnJlZSkoU1NMICpzKTsKKwlpbnQgKCpzc2xfYWNjZXB0KShTU0wgKnMpOworCWludCAoKnNzbF9jb25uZWN0KShTU0wgKnMpOworCWludCAoKnNzbF9yZWFkKShTU0wgKnMsdm9pZCAqYnVmLGludCBsZW4pOworCWludCAoKnNzbF9wZWVrKShTU0wgKnMsdm9pZCAqYnVmLGludCBsZW4pOworCWludCAoKnNzbF93cml0ZSkoU1NMICpzLGNvbnN0IHZvaWQgKmJ1ZixpbnQgbGVuKTsKKwlpbnQgKCpzc2xfc2h1dGRvd24pKFNTTCAqcyk7CisJaW50ICgqc3NsX3JlbmVnb3RpYXRlKShTU0wgKnMpOworCWludCAoKnNzbF9yZW5lZ290aWF0ZV9jaGVjaykoU1NMICpzKTsKKwlsb25nICgqc3NsX2dldF9tZXNzYWdlKShTU0wgKnMsIGludCBzdDEsIGludCBzdG4sIGludCBtdCwgbG9uZworCQltYXgsIGludCAqb2spOworCWludCAoKnNzbF9yZWFkX2J5dGVzKShTU0wgKnMsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sIAorCQlpbnQgcGVlayk7CisJaW50ICgqc3NsX3dyaXRlX2J5dGVzKShTU0wgKnMsIGludCB0eXBlLCBjb25zdCB2b2lkICpidWZfLCBpbnQgbGVuKTsKKwlpbnQgKCpzc2xfZGlzcGF0Y2hfYWxlcnQpKFNTTCAqcyk7CisJbG9uZyAoKnNzbF9jdHJsKShTU0wgKnMsaW50IGNtZCxsb25nIGxhcmcsdm9pZCAqcGFyZyk7CisJbG9uZyAoKnNzbF9jdHhfY3RybCkoU1NMX0NUWCAqY3R4LGludCBjbWQsbG9uZyBsYXJnLHZvaWQgKnBhcmcpOworCWNvbnN0IFNTTF9DSVBIRVIgKigqZ2V0X2NpcGhlcl9ieV9jaGFyKShjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIpOworCWludCAoKnB1dF9jaXBoZXJfYnlfY2hhcikoY29uc3QgU1NMX0NJUEhFUiAqY2lwaGVyLHVuc2lnbmVkIGNoYXIgKnB0cik7CisJaW50ICgqc3NsX3BlbmRpbmcpKGNvbnN0IFNTTCAqcyk7CisJaW50ICgqbnVtX2NpcGhlcnMpKHZvaWQpOworCWNvbnN0IFNTTF9DSVBIRVIgKigqZ2V0X2NpcGhlcikodW5zaWduZWQgbmNpcGhlcik7CisJY29uc3Qgc3RydWN0IHNzbF9tZXRob2Rfc3QgKigqZ2V0X3NzbF9tZXRob2QpKGludCB2ZXJzaW9uKTsKKwlsb25nICgqZ2V0X3RpbWVvdXQpKHZvaWQpOworCXN0cnVjdCBzc2wzX2VuY19tZXRob2QgKnNzbDNfZW5jOyAvKiBFeHRyYSBTU0x2My9UTFMgc3R1ZmYgKi8KKwlpbnQgKCpzc2xfdmVyc2lvbikodm9pZCk7CisJbG9uZyAoKnNzbF9jYWxsYmFja19jdHJsKShTU0wgKnMsIGludCBjYl9pZCwgdm9pZCAoKmZwKSh2b2lkKSk7CisJbG9uZyAoKnNzbF9jdHhfY2FsbGJhY2tfY3RybCkoU1NMX0NUWCAqcywgaW50IGNiX2lkLCB2b2lkICgqZnApKHZvaWQpKTsKKwl9IFNTTF9NRVRIT0Q7CisKKy8qIExldHMgbWFrZSB0aGlzIGludG8gYW4gQVNOLjEgdHlwZSBzdHJ1Y3R1cmUgYXMgZm9sbG93cworICogU1NMX1NFU1NJT05fSUQgOjo9IFNFUVVFTkNFIHsKKyAqCXZlcnNpb24gCQlJTlRFR0VSLAktLSBzdHJ1Y3R1cmUgdmVyc2lvbiBudW1iZXIKKyAqCVNTTHZlcnNpb24gCQlJTlRFR0VSLAktLSBTU0wgdmVyc2lvbiBudW1iZXIKKyAqCUNpcGhlciAJCQlPQ1RFVCBTVFJJTkcsCS0tIHRoZSAzIGJ5dGUgY2lwaGVyIElECisgKglTZXNzaW9uX0lEIAkJT0NURVQgU1RSSU5HLAktLSB0aGUgU2Vzc2lvbiBJRAorICoJTWFzdGVyX2tleSAJCU9DVEVUIFNUUklORywJLS0gdGhlIG1hc3RlciBrZXkKKyAqCUtSQjVfcHJpbmNpcGFsCQlPQ1RFVCBTVFJJTkcJLS0gb3B0aW9uYWwgS2VyYmVyb3MgcHJpbmNpcGFsCisgKglLZXlfQXJnIFsgMCBdIElNUExJQ0lUCU9DVEVUIFNUUklORywJLS0gdGhlIG9wdGlvbmFsIEtleSBhcmd1bWVudAorICoJVGltZSBbIDEgXSBFWFBMSUNJVAlJTlRFR0VSLAktLSBvcHRpb25hbCBTdGFydCBUaW1lCisgKglUaW1lb3V0IFsgMiBdIEVYUExJQ0lUCUlOVEVHRVIsCS0tIG9wdGlvbmFsIFRpbWVvdXQgaW5zIHNlY29uZHMKKyAqCVBlZXIgWyAzIF0gRVhQTElDSVQJWDUwOSwJCS0tIG9wdGlvbmFsIFBlZXIgQ2VydGlmaWNhdGUKKyAqCVNlc3Npb25fSURfY29udGV4dCBbIDQgXSBFWFBMSUNJVCBPQ1RFVCBTVFJJTkcsICAgLS0gdGhlIFNlc3Npb24gSUQgY29udGV4dAorICoJVmVyaWZ5X3Jlc3VsdCBbIDUgXSBFWFBMSUNJVCBJTlRFR0VSLCAgIC0tIFg1MDlfVl8uLi4gY29kZSBmb3IgYFBlZXInCisgKglIb3N0TmFtZSBbIDYgXSBFWFBMSUNJVCBPQ1RFVCBTVFJJTkcsICAgLS0gb3B0aW9uYWwgSG9zdE5hbWUgZnJvbSBzZXJ2ZXJuYW1lIFRMUyBleHRlbnNpb24gCisgKglFQ1BvaW50Rm9ybWF0TGlzdCBbIDcgXSBPQ1RFVCBTVFJJTkcsICAgICAtLSBvcHRpb25hbCBFQyBwb2ludCBmb3JtYXQgbGlzdCBmcm9tIFRMUyBleHRlbnNpb24KKyAqCVBTS19pZGVudGl0eV9oaW50IFsgOCBdIEVYUExJQ0lUIE9DVEVUIFNUUklORywgLS0gb3B0aW9uYWwgUFNLIGlkZW50aXR5IGhpbnQKKyAqCVBTS19pZGVudGl0eSBbIDkgXSBFWFBMSUNJVCBPQ1RFVCBTVFJJTkcgLS0gb3B0aW9uYWwgUFNLIGlkZW50aXR5CisgKgl9CisgKiBMb29rIGluIHNzbC9zc2xfYXNuMS5jIGZvciBtb3JlIGRldGFpbHMKKyAqIEknbSB1c2luZyBFWFBMSUNJVCB0YWdzIHNvIEkgY2FuIHJlYWQgdGhlIGRhbW4gdGhpbmdzIHVzaW5nIGFzbjFwYXJzZSA6LSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHNzbF9zZXNzaW9uX3N0CisJeworCWludCBzc2xfdmVyc2lvbjsJLyogd2hhdCBzc2wgdmVyc2lvbiBzZXNzaW9uIGluZm8gaXMKKwkJCQkgKiBiZWluZyBrZXB0IGluIGhlcmU/ICovCisKKwkvKiBvbmx5IHJlYWxseSB1c2VkIGluIFNTTHYyICovCisJdW5zaWduZWQgaW50IGtleV9hcmdfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIga2V5X2FyZ1tTU0xfTUFYX0tFWV9BUkdfTEVOR1RIXTsKKwlpbnQgbWFzdGVyX2tleV9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBtYXN0ZXJfa2V5W1NTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEhdOworCS8qIHNlc3Npb25faWQgLSB2YWxpZD8gKi8KKwl1bnNpZ25lZCBpbnQgc2Vzc2lvbl9pZF9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBzZXNzaW9uX2lkW1NTTF9NQVhfU1NMX1NFU1NJT05fSURfTEVOR1RIXTsKKwkvKiB0aGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlc3Npb24gaXMgYmVpbmcgcmV1c2VkIGluCisJICogdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQuIEl0IGlzIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiB0byBzZXQgdGhpcywKKwkgKiB2aWEgU1NMX25ldyAqLworCXVuc2lnbmVkIGludCBzaWRfY3R4X2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHNpZF9jdHhbU1NMX01BWF9TSURfQ1RYX0xFTkdUSF07CisKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisgICAgICAgIHVuc2lnbmVkIGludCBrcmI1X2NsaWVudF9wcmluY19sZW47CisgICAgICAgIHVuc2lnbmVkIGNoYXIga3JiNV9jbGllbnRfcHJpbmNbU1NMX01BWF9LUkI1X1BSSU5DSVBBTF9MRU5HVEhdOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fS1JCNSAqLworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCWNoYXIgKnBza19pZGVudGl0eV9oaW50OworCWNoYXIgKnBza19pZGVudGl0eTsKKyNlbmRpZgorCWludCBub3RfcmVzdW1hYmxlOworCisJLyogVGhlIGNlcnQgaXMgdGhlIGNlcnRpZmljYXRlIHVzZWQgdG8gZXN0YWJsaXNoIHRoaXMgY29ubmVjdGlvbiAqLworCXN0cnVjdCBzZXNzX2NlcnRfc3QgLyogU0VTU19DRVJUICovICpzZXNzX2NlcnQ7CisKKwkvKiBUaGlzIGlzIHRoZSBjZXJ0IGZvciB0aGUgb3RoZXIgZW5kLgorCSAqIE9uIGNsaWVudHMsIGl0IHdpbGwgYmUgdGhlIHNhbWUgYXMgc2Vzc19jZXJ0LT5wZWVyX2tleS0+eDUwOQorCSAqICh0aGUgbGF0dGVyIGlzIG5vdCBlbm91Z2ggYXMgc2Vzc19jZXJ0IGlzIG5vdCByZXRhaW5lZAorCSAqIGluIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBzZXNzaW9ucywgc2VlIHNzbF9hc24xLmMpLiAqLworCVg1MDkgKnBlZXI7CisJLyogd2hlbiBhcHBfdmVyaWZ5X2NhbGxiYWNrIGFjY2VwdHMgYSBzZXNzaW9uIHdoZXJlIHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUKKwkgKiBpcyBub3Qgb2ssIHdlIG11c3QgcmVtZW1iZXIgdGhlIGVycm9yIGZvciBzZXNzaW9uIHJldXNlOiAqLworCWxvbmcgdmVyaWZ5X3Jlc3VsdDsgLyogb25seSBmb3Igc2VydmVycyAqLworCisJaW50IHJlZmVyZW5jZXM7CisJbG9uZyB0aW1lb3V0OworCWxvbmcgdGltZTsKKworCXVuc2lnbmVkIGludCBjb21wcmVzc19tZXRoOwkvKiBOZWVkIHRvIGxvb2t1cCB0aGUgbWV0aG9kICovCisKKwljb25zdCBTU0xfQ0lQSEVSICpjaXBoZXI7CisJdW5zaWduZWQgbG9uZyBjaXBoZXJfaWQ7CS8qIHdoZW4gQVNOLjEgbG9hZGVkLCB0aGlzCisJCQkJCSAqIG5lZWRzIHRvIGJlIHVzZWQgdG8gbG9hZAorCQkJCQkgKiB0aGUgJ2NpcGhlcicgc3RydWN0dXJlICovCisKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2lwaGVyczsgLyogc2hhcmVkIGNpcGhlcnM/ICovCisKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOyAvKiBhcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhICovCisKKwkvKiBUaGVzZSBhcmUgdXNlZCB0byBtYWtlIHJlbW92YWwgb2Ygc2Vzc2lvbi1pZHMgbW9yZQorCSAqIGVmZmljaWVudCBhbmQgdG8gaW1wbGVtZW50IGEgbWF4aW11bSBjYWNoZSBzaXplLiAqLworCXN0cnVjdCBzc2xfc2Vzc2lvbl9zdCAqcHJldiwqbmV4dDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwljaGFyICp0bHNleHRfaG9zdG5hbWU7CisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKwlzaXplX3QgdGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICp0bHNleHRfZWNwb2ludGZvcm1hdGxpc3Q7IC8qIHBlZXIncyBsaXN0ICovCisJc2l6ZV90IHRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGg7CisJdW5zaWduZWQgY2hhciAqdGxzZXh0X2VsbGlwdGljY3VydmVsaXN0OyAvKiBwZWVyJ3MgbGlzdCAqLworI2VuZGlmIC8qIE9QRU5TU0xfTk9fRUMgKi8KKwkvKiBSRkM0NTA3IGluZm8gKi8KKwl1bnNpZ25lZCBjaGFyICp0bHNleHRfdGljazsJLyogU2Vzc2lvbiB0aWNrZXQgKi8KKwlzaXplX3QJdGxzZXh0X3RpY2tsZW47CQkvKiBTZXNzaW9uIHRpY2tldCBsZW5ndGggKi8JCisJbG9uZyB0bHNleHRfdGlja19saWZldGltZV9oaW50OwkvKiBTZXNzaW9uIGxpZmV0aW1lIGhpbnQgaW4gc2Vjb25kcyAqLworI2VuZGlmCisJfSBTU0xfU0VTU0lPTjsKKworCisjZGVmaW5lIFNTTF9PUF9NSUNST1NPRlRfU0VTU19JRF9CVUcJCQkweDAwMDAwMDAxTAorI2RlZmluZSBTU0xfT1BfTkVUU0NBUEVfQ0hBTExFTkdFX0JVRwkJCTB4MDAwMDAwMDJMCisvKiBBbGxvdyBpbml0aWFsIGNvbm5lY3Rpb24gdG8gc2VydmVycyB0aGF0IGRvbid0IHN1cHBvcnQgUkkgKi8KKyNkZWZpbmUgU1NMX09QX0xFR0FDWV9TRVJWRVJfQ09OTkVDVAkJCTB4MDAwMDAwMDRMCisjZGVmaW5lIFNTTF9PUF9ORVRTQ0FQRV9SRVVTRV9DSVBIRVJfQ0hBTkdFX0JVRwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUgU1NMX09QX1NTTFJFRjJfUkVVU0VfQ0VSVF9UWVBFX0JVRwkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgU1NMX09QX01JQ1JPU09GVF9CSUdfU1NMVjNfQlVGRkVSCQkweDAwMDAwMDIwTAorI2RlZmluZSBTU0xfT1BfTVNJRV9TU0xWMl9SU0FfUEFERElORwkJCTB4MDAwMDAwNDBMIC8qIG5vIGVmZmVjdCBzaW5jZSAwLjkuN2ggYW5kIDAuOS44YiAqLworI2RlZmluZSBTU0xfT1BfU1NMRUFZXzA4MF9DTElFTlRfREhfQlVHCQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgU1NMX09QX1RMU19ENV9CVUcJCQkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgU1NMX09QX1RMU19CTE9DS19QQURESU5HX0JVRwkJCTB4MDAwMDAyMDBMCisKKy8qIERpc2FibGUgU1NMIDMuMC9UTFMgMS4wIENCQyB2dWxuZXJhYmlsaXR5IHdvcmthcm91bmQgdGhhdCB3YXMgYWRkZWQKKyAqIGluIE9wZW5TU0wgMC45LjZkLiAgVXN1YWxseSAoZGVwZW5kaW5nIG9uIHRoZSBhcHBsaWNhdGlvbiBwcm90b2NvbCkKKyAqIHRoZSB3b3JrYXJvdW5kIGlzIG5vdCBuZWVkZWQuICBVbmZvcnR1bmF0ZWx5IHNvbWUgYnJva2VuIFNTTC9UTFMKKyAqIGltcGxlbWVudGF0aW9ucyBjYW5ub3QgaGFuZGxlIGl0IGF0IGFsbCwgd2hpY2ggaXMgd2h5IHdlIGluY2x1ZGUKKyAqIGl0IGluIFNTTF9PUF9BTEwuICovCisjZGVmaW5lIFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMgICAgICAgICAgICAgIDB4MDAwMDA4MDBMIC8qIGFkZGVkIGluIDAuOS42ZSAqLworCisvKiBTU0xfT1BfQUxMOiB2YXJpb3VzIGJ1ZyB3b3JrYXJvdW5kcyB0aGF0IHNob3VsZCBiZSByYXRoZXIgaGFybWxlc3MuCisgKiAgICAgICAgICAgICBUaGlzIHVzZWQgdG8gYmUgMHgwMDBGRkZGRkwgYmVmb3JlIDAuOS43LiAqLworI2RlZmluZSBTU0xfT1BfQUxMCQkJCQkweDgwMDAwRkZGTAorCisvKiBEVExTIG9wdGlvbnMgKi8KKyNkZWZpbmUgU1NMX09QX05PX1FVRVJZX01UVSAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMEwKKy8qIFR1cm4gb24gQ29va2llIEV4Y2hhbmdlIChvbiByZWxldmFudCBmb3Igc2VydmVycykgKi8KKyNkZWZpbmUgU1NMX09QX0NPT0tJRV9FWENIQU5HRSAgICAgICAgICAgICAgMHgwMDAwMjAwMEwKKy8qIERvbid0IHVzZSBSRkM0NTA3IHRpY2tldCBleHRlbnNpb24gKi8KKyNkZWZpbmUgU1NMX09QX05PX1RJQ0tFVAkgICAgICAgICAgICAweDAwMDA0MDAwTAorLyogVXNlIENpc2NvJ3MgInNwZXNodWwiIHZlcnNpb24gb2YgRFRMU19CQURfVkVSIChhcyBjbGllbnQpICAqLworI2RlZmluZSBTU0xfT1BfQ0lTQ09fQU5ZQ09OTkVDVAkJICAgIDB4MDAwMDgwMDBMCisKKy8qIEFzIHNlcnZlciwgZGlzYWxsb3cgc2Vzc2lvbiByZXN1bXB0aW9uIG9uIHJlbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OCTB4MDAwMTAwMDBMCisvKiBEb24ndCB1c2UgY29tcHJlc3Npb24gZXZlbiBpZiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgU1NMX09QX05PX0NPTVBSRVNTSU9OCQkJCTB4MDAwMjAwMDBMCisvKiBQZXJtaXQgdW5zYWZlIGxlZ2FjeSByZW5lZ290aWF0aW9uICovCisjZGVmaW5lIFNTTF9PUF9BTExPV19VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT04JMHgwMDA0MDAwMEwKKy8qIElmIHNldCwgYWx3YXlzIGNyZWF0ZSBhIG5ldyBrZXkgd2hlbiB1c2luZyB0bXBfZWNkaCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFNTTF9PUF9TSU5HTEVfRUNESF9VU0UJCQkJMHgwMDA4MDAwMEwKKy8qIElmIHNldCwgYWx3YXlzIGNyZWF0ZSBhIG5ldyBrZXkgd2hlbiB1c2luZyB0bXBfZGggcGFyYW1ldGVycyAqLworI2RlZmluZSBTU0xfT1BfU0lOR0xFX0RIX1VTRQkJCQkweDAwMTAwMDAwTAorLyogU2V0IHRvIGFsd2F5cyB1c2UgdGhlIHRtcF9yc2Ega2V5IHdoZW4gZG9pbmcgUlNBIG9wZXJhdGlvbnMsCisgKiBldmVuIHdoZW4gdGhpcyB2aW9sYXRlcyBwcm90b2NvbCBzcGVjcyAqLworI2RlZmluZSBTU0xfT1BfRVBIRU1FUkFMX1JTQQkJCQkweDAwMjAwMDAwTAorLyogU2V0IG9uIHNlcnZlcnMgdG8gY2hvb3NlIHRoZSBjaXBoZXIgYWNjb3JkaW5nIHRvIHRoZSBzZXJ2ZXIncworICogcHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRQkJCTB4MDA0MDAwMDBMCisvKiBJZiBzZXQsIGEgc2VydmVyIHdpbGwgYWxsb3cgYSBjbGllbnQgdG8gaXNzdWUgYSBTU0x2My4wIHZlcnNpb24gbnVtYmVyCisgKiBhcyBsYXRlc3QgdmVyc2lvbiBzdXBwb3J0ZWQgaW4gdGhlIHByZW1hc3RlciBzZWNyZXQsIGV2ZW4gd2hlbiBUTFN2MS4wCisgKiAodmVyc2lvbiAzLjEpIHdhcyBhbm5vdW5jZWQgaW4gdGhlIGNsaWVudCBoZWxsby4gTm9ybWFsbHkgdGhpcyBpcworICogZm9yYmlkZGVuIHRvIHByZXZlbnQgdmVyc2lvbiByb2xsYmFjayBhdHRhY2tzLiAqLworI2RlZmluZSBTU0xfT1BfVExTX1JPTExCQUNLX0JVRwkJCQkweDAwODAwMDAwTAorCisjZGVmaW5lIFNTTF9PUF9OT19TU0x2MgkJCQkJMHgwMTAwMDAwMEwKKyNkZWZpbmUgU1NMX09QX05PX1NTTHYzCQkJCQkweDAyMDAwMDAwTAorI2RlZmluZSBTU0xfT1BfTk9fVExTdjEJCQkJCTB4MDQwMDAwMDBMCisKKy8qIFRoZSBuZXh0IGZsYWcgZGVsaWJlcmF0ZWx5IGNoYW5nZXMgdGhlIGNpcGhlcnRlc3QsIHRoaXMgaXMgYSBjaGVjaworICogZm9yIHRoZSBQS0NTIzEgYXR0YWNrICovCisjZGVmaW5lIFNTTF9PUF9QS0NTMV9DSEVDS18xCQkJCTB4MDgwMDAwMDBMCisjZGVmaW5lIFNTTF9PUF9QS0NTMV9DSEVDS18yCQkJCTB4MTAwMDAwMDBMCisjZGVmaW5lIFNTTF9PUF9ORVRTQ0FQRV9DQV9ETl9CVUcJCQkweDIwMDAwMDAwTAorI2RlZmluZSBTU0xfT1BfTkVUU0NBUEVfREVNT19DSVBIRVJfQ0hBTkdFX0JVRwkJMHg0MDAwMDAwMEwKKy8qIE1ha2Ugc2VydmVyIGFkZCBzZXJ2ZXItaGVsbG8gZXh0ZW5zaW9uIGZyb20gZWFybHkgdmVyc2lvbiBvZgorICogY3J5cHRvcHJvIGRyYWZ0LCB3aGVuIEdPU1QgY2lwaGVyc3VpdGUgaXMgbmVnb3RpYXRlZC4gCisgKiBSZXF1aXJlZCBmb3IgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIENyeXB0b1BybyBDU1AgMy54IAorICovCisjZGVmaW5lIFNTTF9PUF9DUllQVE9QUk9fVExTRVhUX0JVRwkJCTB4ODAwMDAwMDBMCisKKy8qIEFsbG93IFNTTF93cml0ZSguLi4sIG4pIHRvIHJldHVybiByIHdpdGggMCA8IHIgPCBuIChpLmUuIHJlcG9ydCBzdWNjZXNzCisgKiB3aGVuIGp1c3QgYSBzaW5nbGUgcmVjb3JkIGhhcyBiZWVuIHdyaXR0ZW4pOiAqLworI2RlZmluZSBTU0xfTU9ERV9FTkFCTEVfUEFSVElBTF9XUklURSAgICAgICAweDAwMDAwMDAxTAorLyogTWFrZSBpdCBwb3NzaWJsZSB0byByZXRyeSBTU0xfd3JpdGUoKSB3aXRoIGNoYW5nZWQgYnVmZmVyIGxvY2F0aW9uCisgKiAoYnVmZmVyIGNvbnRlbnRzIG11c3Qgc3RheSB0aGUgc2FtZSEpOyB0aGlzIGlzIG5vdCB0aGUgZGVmYXVsdCB0byBhdm9pZAorICogdGhlIG1pc2NvbmNlcHRpb24gdGhhdCBub24tYmxvY2tpbmcgU1NMX3dyaXRlKCkgYmVoYXZlcyBsaWtlCisgKiBub24tYmxvY2tpbmcgd3JpdGUoKTogKi8KKyNkZWZpbmUgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIgMHgwMDAwMDAwMkwKKy8qIE5ldmVyIGJvdGhlciB0aGUgYXBwbGljYXRpb24gd2l0aCByZXRyaWVzIGlmIHRoZSB0cmFuc3BvcnQKKyAqIGlzIGJsb2NraW5nOiAqLworI2RlZmluZSBTU0xfTU9ERV9BVVRPX1JFVFJZIDB4MDAwMDAwMDRMCisvKiBEb24ndCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgYnVpbGQgY2VydGlmaWNhdGUgY2hhaW4gKi8KKyNkZWZpbmUgU1NMX01PREVfTk9fQVVUT19DSEFJTiAweDAwMDAwMDA4TAorLyogU2F2ZSBSQU0gYnkgcmVsZWFzaW5nIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgd2hlbiB0aGV5J3JlIGVtcHR5LiAoU1NMMyBhbmQKKyAqIFRMUyBvbmx5LikgICJSZWxlYXNlZCIgYnVmZmVycyBhcmUgcHV0IG9udG8gYSBmcmVlLWxpc3QgaW4gdGhlIGNvbnRleHQKKyAqIG9yIGp1c3QgZnJlZWQgKGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCdzIHNldHRpbmcgZm9yIGZyZWVsaXN0X21heF9sZW4pLiAqLworI2RlZmluZSBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMgMHgwMDAwMDAxMEwKKy8qIFVzZSBzbWFsbCByZWFkIGFuZCB3cml0ZSBidWZmZXJzOiAoYSkgbGF6eSBhbGxvY2F0ZSByZWFkIGJ1ZmZlcnMgZm9yCisgKiBsYXJnZSBpbmNvbWluZyByZWNvcmRzLCBhbmQgKGIpIGxpbWl0IHRoZSBzaXplIG9mIG91dGdvaW5nIHJlY29yZHMuICovCisjZGVmaW5lIFNTTF9NT0RFX1NNQUxMX0JVRkZFUlMgMHgwMDAwMDAyMEwKKy8qIFdoZW4gc2V0LCBjbGllbnRzIG1heSBzZW5kIGFwcGxpY2F0aW9uIGRhdGEgYmVmb3JlIHJlY2VpcHQgb2YgQ0NTCisgKiBhbmQgRmluaXNoZWQuICBUaGlzIG1vZGUgZW5hYmxlcyBmdWxsLWhhbmRzaGFrZXMgdG8gJ2NvbXBsZXRlJyBpbgorICogb25lIFJUVC4gKi8KKyNkZWZpbmUgU1NMX01PREVfSEFORFNIQUtFX0NVVFRIUk9VR0ggMHgwMDAwMDA0MEwKKworLyogTm90ZTogU1NMW19DVFhdX3NldF97b3B0aW9ucyxtb2RlfSB1c2UgfD0gb3Agb24gdGhlIHByZXZpb3VzIHZhbHVlLAorICogdGhleSBjYW5ub3QgYmUgdXNlZCB0byBjbGVhciBiaXRzLiAqLworCisjZGVmaW5lIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4LG9wKSBcCisJU1NMX0NUWF9jdHJsKChjdHgpLFNTTF9DVFJMX09QVElPTlMsKG9wKSxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX2NsZWFyX29wdGlvbnMoY3R4LG9wKSBcCisJU1NMX0NUWF9jdHJsKChjdHgpLFNTTF9DVFJMX0NMRUFSX09QVElPTlMsKG9wKSxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX2dldF9vcHRpb25zKGN0eCkgXAorCVNTTF9DVFhfY3RybCgoY3R4KSxTU0xfQ1RSTF9PUFRJT05TLDAsTlVMTCkKKyNkZWZpbmUgU1NMX3NldF9vcHRpb25zKHNzbCxvcCkgXAorCVNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX09QVElPTlMsKG9wKSxOVUxMKQorI2RlZmluZSBTU0xfY2xlYXJfb3B0aW9ucyhzc2wsb3ApIFwKKwlTU0xfY3RybCgoc3NsKSxTU0xfQ1RSTF9DTEVBUl9PUFRJT05TLChvcCksTlVMTCkKKyNkZWZpbmUgU1NMX2dldF9vcHRpb25zKHNzbCkgXAorICAgICAgICBTU0xfY3RybCgoc3NsKSxTU0xfQ1RSTF9PUFRJT05TLDAsTlVMTCkKKworI2RlZmluZSBTU0xfQ1RYX3NldF9tb2RlKGN0eCxvcCkgXAorCVNTTF9DVFhfY3RybCgoY3R4KSxTU0xfQ1RSTF9NT0RFLChvcCksTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9jbGVhcl9tb2RlKGN0eCxvcCkgXAorCVNTTF9DVFhfY3RybCgoY3R4KSxTU0xfQ1RSTF9DTEVBUl9NT0RFLChvcCksTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9nZXRfbW9kZShjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoKGN0eCksU1NMX0NUUkxfTU9ERSwwLE5VTEwpCisjZGVmaW5lIFNTTF9jbGVhcl9tb2RlKHNzbCxvcCkgXAorCVNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX0NMRUFSX01PREUsKG9wKSxOVUxMKQorI2RlZmluZSBTU0xfc2V0X21vZGUoc3NsLG9wKSBcCisJU1NMX2N0cmwoKHNzbCksU1NMX0NUUkxfTU9ERSwob3ApLE5VTEwpCisjZGVmaW5lIFNTTF9nZXRfbW9kZShzc2wpIFwKKyAgICAgICAgU1NMX2N0cmwoKHNzbCksU1NMX0NUUkxfTU9ERSwwLE5VTEwpCisjZGVmaW5lIFNTTF9zZXRfbXR1KHNzbCwgbXR1KSBcCisgICAgICAgIFNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX1NFVF9NVFUsKG10dSksTlVMTCkKKworI2RlZmluZSBTU0xfZ2V0X3NlY3VyZV9yZW5lZ290aWF0aW9uX3N1cHBvcnQoc3NsKSBcCisJU1NMX2N0cmwoKHNzbCksIFNTTF9DVFJMX0dFVF9SSV9TVVBQT1JULCAwLCBOVUxMKQorCit2b2lkIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFjayhTU0xfQ1RYICpjdHgsIHZvaWQgKCpjYikoaW50IHdyaXRlX3AsIGludCB2ZXJzaW9uLCBpbnQgY29udGVudF90eXBlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIFNTTCAqc3NsLCB2b2lkICphcmcpKTsKK3ZvaWQgU1NMX3NldF9tc2dfY2FsbGJhY2soU1NMICpzc2wsIHZvaWQgKCpjYikoaW50IHdyaXRlX3AsIGludCB2ZXJzaW9uLCBpbnQgY29udGVudF90eXBlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIFNTTCAqc3NsLCB2b2lkICphcmcpKTsKKyNkZWZpbmUgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhjdHgsIGFyZykgU1NMX0NUWF9jdHJsKChjdHgpLCBTU0xfQ1RSTF9TRVRfTVNHX0NBTExCQUNLX0FSRywgMCwgKGFyZykpCisjZGVmaW5lIFNTTF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhzc2wsIGFyZykgU1NMX2N0cmwoKHNzbCksIFNTTF9DVFJMX1NFVF9NU0dfQ0FMTEJBQ0tfQVJHLCAwLCAoYXJnKSkKKworCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX01TRE9TKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikKKyNkZWZpbmUgU1NMX01BWF9DRVJUX0xJU1RfREVGQVVMVCAxMDI0KjMwIC8qIDMwayBtYXggY2VydCBsaXN0IDotKSAqLworI2Vsc2UKKyNkZWZpbmUgU1NMX01BWF9DRVJUX0xJU1RfREVGQVVMVCAxMDI0KjEwMCAvKiAxMDBrIG1heCBjZXJ0IGxpc3QgOi0pICovCisjZW5kaWYKKworI2RlZmluZSBTU0xfU0VTU0lPTl9DQUNIRV9NQVhfU0laRV9ERUZBVUxUCSgxMDI0KjIwKQorCisvKiBUaGlzIGNhbGxiYWNrIHR5cGUgaXMgdXNlZCBpbnNpZGUgU1NMX0NUWCwgU1NMLCBhbmQgaW4gdGhlIGZ1bmN0aW9ucyB0aGF0IHNldAorICogdGhlbS4gSXQgaXMgdXNlZCB0byBvdmVycmlkZSB0aGUgZ2VuZXJhdGlvbiBvZiBTU0wvVExTIHNlc3Npb24gSURzIGluIGEKKyAqIHNlcnZlci4gUmV0dXJuIHZhbHVlIHNob3VsZCBiZSB6ZXJvIG9uIGFuIGVycm9yLCBub24temVybyB0byBwcm9jZWVkLiBBbHNvLAorICogY2FsbGJhY2tzIHNob3VsZCB0aGVtc2VsdmVzIGNoZWNrIGlmIHRoZSBpZCB0aGV5IGdlbmVyYXRlIGlzIHVuaXF1ZSBvdGhlcndpc2UKKyAqIHRoZSBTU0wgaGFuZHNoYWtlIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIC0gY2FsbGJhY2tzIGNhbiBkbyB0aGlzIHVzaW5nIHRoZQorICogJ3NzbCcgdmFsdWUgdGhleSdyZSBwYXNzZWQgYnk7CisgKiAgICAgIFNTTF9oYXNfbWF0Y2hpbmdfc2Vzc2lvbl9pZChzc2wsIGlkLCAqaWRfbGVuKQorICogVGhlIGxlbmd0aCB2YWx1ZSBwYXNzZWQgaW4gaXMgc2V0IGF0IHRoZSBtYXhpbXVtIHNpemUgdGhlIHNlc3Npb24gSUQgY2FuIGJlLgorICogSW4gU1NMdjIgdGhpcyBpcyAxNiBieXRlcywgd2hlcmVhcyBTU0x2My9UTFN2MSBpdCBpcyAzMiBieXRlcy4gVGhlIGNhbGxiYWNrCisgKiBjYW4gYWx0ZXIgdGhpcyBsZW5ndGggdG8gYmUgbGVzcyBpZiBkZXNpcmVkLCBidXQgdW5kZXIgU1NMdjIgc2Vzc2lvbiBJRHMgYXJlCisgKiBzdXBwb3NlZCB0byBiZSBmaXhlZCBhdCAxNiBieXRlcyBzbyB0aGUgaWQgd2lsbCBiZSBwYWRkZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrCisgKiByZXR1cm5zIGluIHRoaXMgY2FzZS4gSXQgaXMgYWxzbyBhbiBlcnJvciBmb3IgdGhlIGNhbGxiYWNrIHRvIHNldCB0aGUgc2l6ZSB0bworICogemVyby4gKi8KK3R5cGVkZWYgaW50ICgqR0VOX1NFU1NJT05fQ0IpKGNvbnN0IFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICppZCwKKwkJCQl1bnNpZ25lZCBpbnQgKmlkX2xlbik7CisKK3R5cGVkZWYgc3RydWN0IHNzbF9jb21wX3N0CisJeworCWludCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwlDT01QX01FVEhPRCAqbWV0aG9kOworI2Vsc2UKKwljaGFyICptZXRob2Q7CisjZW5kaWYKKwl9IFNTTF9DT01QOworCitERUNMQVJFX1NUQUNLX09GKFNTTF9DT01QKQorREVDTEFSRV9MSEFTSF9PRihTU0xfU0VTU0lPTik7CisKK3N0cnVjdCBzc2xfY3R4X3N0CisJeworCWNvbnN0IFNTTF9NRVRIT0QgKm1ldGhvZDsKKworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJfbGlzdDsKKwkvKiBzYW1lIGFzIGFib3ZlIGJ1dCBzb3J0ZWQgZm9yIGxvb2t1cCAqLworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJfbGlzdF9ieV9pZDsKKworCXN0cnVjdCB4NTA5X3N0b3JlX3N0IC8qIFg1MDlfU1RPUkUgKi8gKmNlcnRfc3RvcmU7CisJTEhBU0hfT0YoU1NMX1NFU1NJT04pICpzZXNzaW9uczsKKwkvKiBNb3N0IHNlc3Npb24taWRzIHRoYXQgd2lsbCBiZSBjYWNoZWQsIGRlZmF1bHQgaXMKKwkgKiBTU0xfU0VTU0lPTl9DQUNIRV9NQVhfU0laRV9ERUZBVUxULiAwIGlzIHVubGltaXRlZC4gKi8KKwl1bnNpZ25lZCBsb25nIHNlc3Npb25fY2FjaGVfc2l6ZTsKKwlzdHJ1Y3Qgc3NsX3Nlc3Npb25fc3QgKnNlc3Npb25fY2FjaGVfaGVhZDsKKwlzdHJ1Y3Qgc3NsX3Nlc3Npb25fc3QgKnNlc3Npb25fY2FjaGVfdGFpbDsKKworCS8qIFRoaXMgY2FuIGhhdmUgb25lIG9mIDIgdmFsdWVzLCBvcmVkIHRvZ2V0aGVyLAorCSAqIFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCwKKwkgKiBTU0xfU0VTU19DQUNIRV9TRVJWRVIsCisJICogRGVmYXVsdCBpcyBTU0xfU0VTU0lPTl9DQUNIRV9TRVJWRVIsIHdoaWNoIG1lYW5zIG9ubHkKKwkgKiBTU0xfYWNjZXB0IHdoaWNoIGNhY2hlIFNTTF9TRVNTSU9OUy4gKi8KKwlpbnQgc2Vzc2lvbl9jYWNoZV9tb2RlOworCisJLyogSWYgdGltZW91dCBpcyBub3QgMCwgaXQgaXMgdGhlIGRlZmF1bHQgdGltZW91dCB2YWx1ZSBzZXQKKwkgKiB3aGVuIFNTTF9uZXcoKSBpcyBjYWxsZWQuICBUaGlzIGhhcyBiZWVuIHB1dCBpbiB0byBtYWtlCisJICogbGlmZSBlYXNpZXIgdG8gc2V0IHRoaW5ncyB1cCAqLworCWxvbmcgc2Vzc2lvbl90aW1lb3V0OworCisJLyogSWYgdGhpcyBjYWxsYmFjayBpcyBub3QgbnVsbCwgaXQgd2lsbCBiZSBjYWxsZWQgZWFjaAorCSAqIHRpbWUgYSBzZXNzaW9uIGlkIGlzIGFkZGVkIHRvIHRoZSBjYWNoZS4gIElmIHRoaXMgZnVuY3Rpb24KKwkgKiByZXR1cm5zIDEsIGl0IG1lYW5zIHRoYXQgdGhlIGNhbGxiYWNrIHdpbGwgZG8gYQorCSAqIFNTTF9TRVNTSU9OX2ZyZWUoKSB3aGVuIGl0IGhhcyBmaW5pc2hlZCB1c2luZyBpdC4gIE90aGVyd2lzZSwKKwkgKiBvbiAwLCBpdCBtZWFucyB0aGUgY2FsbGJhY2sgaGFzIGZpbmlzaGVkIHdpdGggaXQuCisJICogSWYgcmVtb3ZlX3Nlc3Npb25fY2IgaXMgbm90IG51bGwsIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4KKwkgKiBhIHNlc3Npb24taWQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZS4gIEFmdGVyIHRoZSBjYWxsLAorCSAqIE9wZW5TU0wgd2lsbCBTU0xfU0VTU0lPTl9mcmVlKCkgaXQuICovCisJaW50ICgqbmV3X3Nlc3Npb25fY2IpKHN0cnVjdCBzc2xfc3QgKnNzbCxTU0xfU0VTU0lPTiAqc2Vzcyk7CisJdm9pZCAoKnJlbW92ZV9zZXNzaW9uX2NiKShzdHJ1Y3Qgc3NsX2N0eF9zdCAqY3R4LFNTTF9TRVNTSU9OICpzZXNzKTsKKwlTU0xfU0VTU0lPTiAqKCpnZXRfc2Vzc2lvbl9jYikoc3RydWN0IHNzbF9zdCAqc3NsLAorCQl1bnNpZ25lZCBjaGFyICpkYXRhLGludCBsZW4saW50ICpjb3B5KTsKKworCXN0cnVjdAorCQl7CisJCWludCBzZXNzX2Nvbm5lY3Q7CS8qIFNTTCBuZXcgY29ubiAtIHN0YXJ0ZWQgKi8KKwkJaW50IHNlc3NfY29ubmVjdF9yZW5lZ290aWF0ZTsvKiBTU0wgcmVuZWcgLSByZXF1ZXN0ZWQgKi8KKwkJaW50IHNlc3NfY29ubmVjdF9nb29kOwkvKiBTU0wgbmV3IGNvbm5lL3JlbmVnIC0gZmluaXNoZWQgKi8KKwkJaW50IHNlc3NfYWNjZXB0OwkvKiBTU0wgbmV3IGFjY2VwdCAtIHN0YXJ0ZWQgKi8KKwkJaW50IHNlc3NfYWNjZXB0X3JlbmVnb3RpYXRlOy8qIFNTTCByZW5lZyAtIHJlcXVlc3RlZCAqLworCQlpbnQgc2Vzc19hY2NlcHRfZ29vZDsJLyogU1NMIGFjY2VwdC9yZW5lZyAtIGZpbmlzaGVkICovCisJCWludCBzZXNzX21pc3M7CQkvKiBzZXNzaW9uIGxvb2t1cCBtaXNzZXMgICovCisJCWludCBzZXNzX3RpbWVvdXQ7CS8qIHJldXNlIGF0dGVtcHQgb24gdGltZW91dGVkIHNlc3Npb24gKi8KKwkJaW50IHNlc3NfY2FjaGVfZnVsbDsJLyogc2Vzc2lvbiByZW1vdmVkIGR1ZSB0byBmdWxsIGNhY2hlICovCisJCWludCBzZXNzX2hpdDsJCS8qIHNlc3Npb24gcmV1c2UgYWN0dWFsbHkgZG9uZSAqLworCQlpbnQgc2Vzc19jYl9oaXQ7CS8qIHNlc3Npb24taWQgdGhhdCB3YXMgbm90CisJCQkJCSAqIGluIHRoZSBjYWNoZSB3YXMKKwkJCQkJICogcGFzc2VkIGJhY2sgdmlhIHRoZSBjYWxsYmFjay4gIFRoaXMKKwkJCQkJICogaW5kaWNhdGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzCisJCQkJCSAqIHN1cHBseWluZyBzZXNzaW9uLWlkJ3MgZnJvbSBvdGhlcgorCQkJCQkgKiBwcm9jZXNzZXMgLSBzcG9va3kgOi0pICovCisJCX0gc3RhdHM7CisKKwlpbnQgcmVmZXJlbmNlczsKKworCS8qIGlmIGRlZmluZWQsIHRoZXNlIG92ZXJyaWRlIHRoZSBYNTA5X3ZlcmlmeV9jZXJ0KCkgY2FsbHMgKi8KKwlpbnQgKCphcHBfdmVyaWZ5X2NhbGxiYWNrKShYNTA5X1NUT1JFX0NUWCAqLCB2b2lkICopOworCXZvaWQgKmFwcF92ZXJpZnlfYXJnOworCS8qIGJlZm9yZSBPcGVuU1NMIDAuOS43LCAnYXBwX3ZlcmlmeV9hcmcnIHdhcyBpZ25vcmVkCisJICogKCdhcHBfdmVyaWZ5X2NhbGxiYWNrJyB3YXMgY2FsbGVkIHdpdGgganVzdCBvbmUgYXJndW1lbnQpICovCisKKwkvKiBEZWZhdWx0IHBhc3N3b3JkIGNhbGxiYWNrLiAqLworCXBlbV9wYXNzd29yZF9jYiAqZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2s7CisKKwkvKiBEZWZhdWx0IHBhc3N3b3JkIGNhbGxiYWNrIHVzZXIgZGF0YS4gKi8KKwl2b2lkICpkZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YTsKKworCS8qIGdldCBjbGllbnQgY2VydCBjYWxsYmFjayAqLworCWludCAoKmNsaWVudF9jZXJ0X2NiKShTU0wgKnNzbCwgWDUwOSAqKng1MDksIEVWUF9QS0VZICoqcGtleSk7CisKKyAgICAvKiBjb29raWUgZ2VuZXJhdGUgY2FsbGJhY2sgKi8KKyAgICBpbnQgKCphcHBfZ2VuX2Nvb2tpZV9jYikoU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKmNvb2tpZSwgCisgICAgICAgIHVuc2lnbmVkIGludCAqY29va2llX2xlbik7CisKKyAgICAvKiB2ZXJpZnkgY29va2llIGNhbGxiYWNrICovCisgICAgaW50ICgqYXBwX3ZlcmlmeV9jb29raWVfY2IpKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICpjb29raWUsIAorICAgICAgICB1bnNpZ25lZCBpbnQgY29va2llX2xlbik7CisKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCisJY29uc3QgRVZQX01EICpyc2FfbWQ1Oy8qIEZvciBTU0x2MiAtIG5hbWUgaXMgJ3NzbDItbWQ1JyAqLworCWNvbnN0IEVWUF9NRCAqbWQ1OwkvKiBGb3IgU1NMdjMvVExTdjEgJ3NzbDMtbWQ1JyAqLworCWNvbnN0IEVWUF9NRCAqc2hhMTsgICAvKiBGb3IgU1NMdjMvVExTdjEgJ3NzbDMtPnNoYTEnICovCisKKwlTVEFDS19PRihYNTA5KSAqZXh0cmFfY2VydHM7CisJU1RBQ0tfT0YoU1NMX0NPTVApICpjb21wX21ldGhvZHM7IC8qIHN0YWNrIG9mIFNTTF9DT01QLCBTU0x2My9UTFN2MSAqLworCisKKwkvKiBEZWZhdWx0IHZhbHVlcyB1c2VkIHdoZW4gbm8gcGVyLVNTTCB2YWx1ZSBpcyBkZWZpbmVkIGZvbGxvdyAqLworCisJdm9pZCAoKmluZm9fY2FsbGJhY2spKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpOyAvKiB1c2VkIGlmIFNTTCdzIGluZm9fY2FsbGJhY2sgaXMgTlVMTCAqLworCisJLyogd2hhdCB3ZSBwdXQgaW4gY2xpZW50IGNlcnQgcmVxdWVzdHMgKi8KKwlTVEFDS19PRihYNTA5X05BTUUpICpjbGllbnRfQ0E7CisKKworCS8qIERlZmF1bHQgdmFsdWVzIHRvIHVzZSBpbiBTU0wgc3RydWN0dXJlcyBmb2xsb3cgKHRoZXNlIGFyZSBjb3BpZWQgYnkgU1NMX25ldykgKi8KKworCXVuc2lnbmVkIGxvbmcgb3B0aW9uczsKKwl1bnNpZ25lZCBsb25nIG1vZGU7CisJbG9uZyBtYXhfY2VydF9saXN0OworCisJc3RydWN0IGNlcnRfc3QgLyogQ0VSVCAqLyAqY2VydDsKKwlpbnQgcmVhZF9haGVhZDsKKworCS8qIGNhbGxiYWNrIHRoYXQgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBwZWVrIGF0IHByb3RvY29sIG1lc3NhZ2VzICovCisJdm9pZCAoKm1zZ19jYWxsYmFjaykoaW50IHdyaXRlX3AsIGludCB2ZXJzaW9uLCBpbnQgY29udGVudF90eXBlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIFNTTCAqc3NsLCB2b2lkICphcmcpOworCXZvaWQgKm1zZ19jYWxsYmFja19hcmc7CisKKwlpbnQgdmVyaWZ5X21vZGU7CisJdW5zaWduZWQgaW50IHNpZF9jdHhfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgc2lkX2N0eFtTU0xfTUFYX1NJRF9DVFhfTEVOR1RIXTsKKwlpbnQgKCpkZWZhdWx0X3ZlcmlmeV9jYWxsYmFjaykoaW50IG9rLFg1MDlfU1RPUkVfQ1RYICpjdHgpOyAvKiBjYWxsZWQgJ3ZlcmlmeV9jYWxsYmFjaycgaW4gdGhlIFNTTCAqLworCisJLyogRGVmYXVsdCBnZW5lcmF0ZSBzZXNzaW9uIElEIGNhbGxiYWNrLiAqLworCUdFTl9TRVNTSU9OX0NCIGdlbmVyYXRlX3Nlc3Npb25faWQ7CisKKwlYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07CisKKyNpZiAwCisJaW50IHB1cnBvc2U7CQkvKiBQdXJwb3NlIHNldHRpbmcgKi8KKwlpbnQgdHJ1c3Q7CQkvKiBUcnVzdCBzZXR0aW5nICovCisjZW5kaWYKKworCWludCBxdWlldF9zaHV0ZG93bjsKKworCS8qIE1heGltdW0gYW1vdW50IG9mIGRhdGEgdG8gc2VuZCBpbiBvbmUgZnJhZ21lbnQuCisJICogYWN0dWFsIHJlY29yZCBzaXplIGNhbiBiZSBtb3JlIHRoYW4gdGhpcyBkdWUgdG8KKwkgKiBwYWRkaW5nIGFuZCBNQUMgb3ZlcmhlYWRzLgorCSAqLworCXVuc2lnbmVkIGludCBtYXhfc2VuZF9mcmFnbWVudDsKKworI2lmbmRlZiBPUEVOU1NMX0VOR0lORQorCS8qIEVuZ2luZSB0byBwYXNzIHJlcXVlc3RzIGZvciBjbGllbnQgY2VydHMgdG8KKwkgKi8KKwlFTkdJTkUgKmNsaWVudF9jZXJ0X2VuZ2luZTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJLyogVExTIGV4dGVuc2lvbnMgc2VydmVybmFtZSBjYWxsYmFjayAqLworCWludCAoKnRsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKShTU0wqLCBpbnQgKiwgdm9pZCAqKTsKKwl2b2lkICp0bHNleHRfc2VydmVybmFtZV9hcmc7CisJLyogUkZDIDQ1MDcgc2Vzc2lvbiB0aWNrZXQga2V5cyAqLworCXVuc2lnbmVkIGNoYXIgdGxzZXh0X3RpY2tfa2V5X25hbWVbMTZdOworCXVuc2lnbmVkIGNoYXIgdGxzZXh0X3RpY2tfaG1hY19rZXlbMTZdOworCXVuc2lnbmVkIGNoYXIgdGxzZXh0X3RpY2tfYWVzX2tleVsxNl07CisJLyogQ2FsbGJhY2sgdG8gc3VwcG9ydCBjdXN0b21pc2F0aW9uIG9mIHRpY2tldCBrZXkgc2V0dGluZyAqLworCWludCAoKnRsc2V4dF90aWNrZXRfa2V5X2NiKShTU0wgKnNzbCwKKwkJCQkJdW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgY2hhciAqaXYsCisJCQkJCUVWUF9DSVBIRVJfQ1RYICplY3R4LAorIAkJCQkJSE1BQ19DVFggKmhjdHgsIGludCBlbmMpOworCisJLyogY2VydGlmaWNhdGUgc3RhdHVzIHJlcXVlc3QgaW5mbyAqLworCS8qIENhbGxiYWNrIGZvciBzdGF0dXMgcmVxdWVzdCAqLworCWludCAoKnRsc2V4dF9zdGF0dXNfY2IpKFNTTCAqc3NsLCB2b2lkICphcmcpOworCXZvaWQgKnRsc2V4dF9zdGF0dXNfYXJnOworCisJLyogZHJhZnQtcmVzY29ybGEtdGxzLW9wYXF1ZS1wcmYtaW5wdXQtMDAudHh0IGluZm9ybWF0aW9uICovCisJaW50ICgqdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2spKFNTTCAqLCB2b2lkICpwZWVyaW5wdXQsIHNpemVfdCBsZW4sIHZvaWQgKmFyZyk7CisJdm9pZCAqdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwljaGFyICpwc2tfaWRlbnRpdHlfaGludDsKKwl1bnNpZ25lZCBpbnQgKCpwc2tfY2xpZW50X2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaGludCwgY2hhciAqaWRlbnRpdHksCisJCXVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLCB1bnNpZ25lZCBjaGFyICpwc2ssCisJCXVuc2lnbmVkIGludCBtYXhfcHNrX2xlbik7CisJdW5zaWduZWQgaW50ICgqcHNrX3NlcnZlcl9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LAorCQl1bnNpZ25lZCBjaGFyICpwc2ssIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbik7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0JVRl9GUkVFTElTVFMKKyNkZWZpbmUgU1NMX01BWF9CVUZfRlJFRUxJU1RfTEVOX0RFRkFVTFQgMzIKKwl1bnNpZ25lZCBpbnQgZnJlZWxpc3RfbWF4X2xlbjsKKwlzdHJ1Y3Qgc3NsM19idWZfZnJlZWxpc3Rfc3QgKndidWZfZnJlZWxpc3Q7CisJc3RydWN0IHNzbDNfYnVmX2ZyZWVsaXN0X3N0ICpyYnVmX2ZyZWVsaXN0OworI2VuZGlmCisJfTsKKworI2RlZmluZSBTU0xfU0VTU19DQUNIRV9PRkYJCQkweDAwMDAKKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfQ0xJRU5UCQkJMHgwMDAxCisjZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX1NFUlZFUgkJCTB4MDAwMgorI2RlZmluZSBTU0xfU0VTU19DQUNIRV9CT1RICShTU0xfU0VTU19DQUNIRV9DTElFTlR8U1NMX1NFU1NfQ0FDSEVfU0VSVkVSKQorI2RlZmluZSBTU0xfU0VTU19DQUNIRV9OT19BVVRPX0NMRUFSCQkweDAwODAKKy8qIGVub3VnaCBjb21tZW50cyBhbHJlYWR5IC4uLiBzZWUgU1NMX0NUWF9zZXRfc2Vzc2lvbl9jYWNoZV9tb2RlKDMpICovCisjZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUAkweDAxMDAKKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUJMHgwMjAwCisjZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMIFwKKwkoU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQfFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX1NUT1JFKQorCitMSEFTSF9PRihTU0xfU0VTU0lPTikgKlNTTF9DVFhfc2Vzc2lvbnMoU1NMX0NUWCAqY3R4KTsKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX251bWJlcihjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfTlVNQkVSLDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX2Nvbm5lY3QoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVNTX0NPTk5FQ1QsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3Nlc3NfY29ubmVjdF9nb29kKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VTU19DT05ORUNUX0dPT0QsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3Nlc3NfY29ubmVjdF9yZW5lZ290aWF0ZShjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfQ09OTkVDVF9SRU5FR09USUFURSwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19hY2NlcHQoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVNTX0FDQ0VQVCwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19hY2NlcHRfcmVuZWdvdGlhdGUoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVNTX0FDQ0VQVF9SRU5FR09USUFURSwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19hY2NlcHRfZ29vZChjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfQUNDRVBUX0dPT0QsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3Nlc3NfaGl0cyhjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfSElULDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX2NiX2hpdHMoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVNTX0NCX0hJVCwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19taXNzZXMoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVNTX01JU1NFUywwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc190aW1lb3V0cyhjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfVElNRU9VVFMsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3Nlc3NfY2FjaGVfZnVsbChjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfQ0FDSEVfRlVMTCwwLE5VTEwpCisKK3ZvaWQgU1NMX0NUWF9zZXNzX3NldF9uZXdfY2IoU1NMX0NUWCAqY3R4LCBpbnQgKCpuZXdfc2Vzc2lvbl9jYikoc3RydWN0IHNzbF9zdCAqc3NsLFNTTF9TRVNTSU9OICpzZXNzKSk7CitpbnQgKCpTU0xfQ1RYX3Nlc3NfZ2V0X25ld19jYihTU0xfQ1RYICpjdHgpKShzdHJ1Y3Qgc3NsX3N0ICpzc2wsIFNTTF9TRVNTSU9OICpzZXNzKTsKK3ZvaWQgU1NMX0NUWF9zZXNzX3NldF9yZW1vdmVfY2IoU1NMX0NUWCAqY3R4LCB2b2lkICgqcmVtb3ZlX3Nlc3Npb25fY2IpKHN0cnVjdCBzc2xfY3R4X3N0ICpjdHgsU1NMX1NFU1NJT04gKnNlc3MpKTsKK3ZvaWQgKCpTU0xfQ1RYX3Nlc3NfZ2V0X3JlbW92ZV9jYihTU0xfQ1RYICpjdHgpKShzdHJ1Y3Qgc3NsX2N0eF9zdCAqY3R4LCBTU0xfU0VTU0lPTiAqc2Vzcyk7Cit2b2lkIFNTTF9DVFhfc2Vzc19zZXRfZ2V0X2NiKFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKigqZ2V0X3Nlc3Npb25fY2IpKHN0cnVjdCBzc2xfc3QgKnNzbCwgdW5zaWduZWQgY2hhciAqZGF0YSxpbnQgbGVuLGludCAqY29weSkpOworU1NMX1NFU1NJT04gKigqU1NMX0NUWF9zZXNzX2dldF9nZXRfY2IoU1NMX0NUWCAqY3R4KSkoc3RydWN0IHNzbF9zdCAqc3NsLCB1bnNpZ25lZCBjaGFyICpEYXRhLCBpbnQgbGVuLCBpbnQgKmNvcHkpOwordm9pZCBTU0xfQ1RYX3NldF9pbmZvX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwgdm9pZCAoKmNiKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKSk7Cit2b2lkICgqU1NMX0NUWF9nZXRfaW5mb19jYWxsYmFjayhTU0xfQ1RYICpjdHgpKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKTsKK3ZvaWQgU1NMX0NUWF9zZXRfY2xpZW50X2NlcnRfY2IoU1NMX0NUWCAqY3R4LCBpbnQgKCpjbGllbnRfY2VydF9jYikoU1NMICpzc2wsIFg1MDkgKip4NTA5LCBFVlBfUEtFWSAqKnBrZXkpKTsKK2ludCAoKlNTTF9DVFhfZ2V0X2NsaWVudF9jZXJ0X2NiKFNTTF9DVFggKmN0eCkpKFNTTCAqc3NsLCBYNTA5ICoqeDUwOSwgRVZQX1BLRVkgKipwa2V5KTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKK2ludCBTU0xfQ1RYX3NldF9jbGllbnRfY2VydF9lbmdpbmUoU1NMX0NUWCAqY3R4LCBFTkdJTkUgKmUpOworI2VuZGlmCit2b2lkIFNTTF9DVFhfc2V0X2Nvb2tpZV9nZW5lcmF0ZV9jYihTU0xfQ1RYICpjdHgsIGludCAoKmFwcF9nZW5fY29va2llX2NiKShTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqY29va2llLCB1bnNpZ25lZCBpbnQgKmNvb2tpZV9sZW4pKTsKK3ZvaWQgU1NMX0NUWF9zZXRfY29va2llX3ZlcmlmeV9jYihTU0xfQ1RYICpjdHgsIGludCAoKmFwcF92ZXJpZnlfY29va2llX2NiKShTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqY29va2llLCB1bnNpZ25lZCBpbnQgY29va2llX2xlbikpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisvKiB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBnaXZlbiB0byBjYWxsYmFja3MgY29udGFpbmluZyB0aGUKKyAqIHJlc3VsdGluZyBpZGVudGl0eS9wc2sgKi8KKyNkZWZpbmUgUFNLX01BWF9JREVOVElUWV9MRU4gMTI4CisjZGVmaW5lIFBTS19NQVhfUFNLX0xFTiAyNTYKK3ZvaWQgU1NMX0NUWF9zZXRfcHNrX2NsaWVudF9jYWxsYmFjayhTU0xfQ1RYICpjdHgsIAorCXVuc2lnbmVkIGludCAoKnBza19jbGllbnRfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LCAKKwkJY2hhciAqaWRlbnRpdHksIHVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLCB1bnNpZ25lZCBjaGFyICpwc2ssCisJCXVuc2lnbmVkIGludCBtYXhfcHNrX2xlbikpOwordm9pZCBTU0xfc2V0X3Bza19jbGllbnRfY2FsbGJhY2soU1NMICpzc2wsIAorCXVuc2lnbmVkIGludCAoKnBza19jbGllbnRfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LCAKKwkJY2hhciAqaWRlbnRpdHksIHVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLCB1bnNpZ25lZCBjaGFyICpwc2ssCisJCXVuc2lnbmVkIGludCBtYXhfcHNrX2xlbikpOwordm9pZCBTU0xfQ1RYX3NldF9wc2tfc2VydmVyX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwgCisJdW5zaWduZWQgaW50ICgqcHNrX3NlcnZlcl9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LAorCQl1bnNpZ25lZCBjaGFyICpwc2ssIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbikpOwordm9pZCBTU0xfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soU1NMICpzc2wsCisJdW5zaWduZWQgaW50ICgqcHNrX3NlcnZlcl9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LAorCQl1bnNpZ25lZCBjaGFyICpwc2ssIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbikpOworaW50IFNTTF9DVFhfdXNlX3Bza19pZGVudGl0eV9oaW50KFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqaWRlbnRpdHlfaGludCk7CitpbnQgU1NMX3VzZV9wc2tfaWRlbnRpdHlfaGludChTU0wgKnMsIGNvbnN0IGNoYXIgKmlkZW50aXR5X2hpbnQpOworY29uc3QgY2hhciAqU1NMX2dldF9wc2tfaWRlbnRpdHlfaGludChjb25zdCBTU0wgKnMpOworY29uc3QgY2hhciAqU1NMX2dldF9wc2tfaWRlbnRpdHkoY29uc3QgU1NMICpzKTsKKyNlbmRpZgorCisjZGVmaW5lIFNTTF9OT1RISU5HCTEKKyNkZWZpbmUgU1NMX1dSSVRJTkcJMgorI2RlZmluZSBTU0xfUkVBRElORwkzCisjZGVmaW5lIFNTTF9YNTA5X0xPT0tVUAk0CisKKy8qIFRoZXNlIHdpbGwgb25seSBiZSB1c2VkIHdoZW4gZG9pbmcgbm9uLWJsb2NraW5nIElPICovCisjZGVmaW5lIFNTTF93YW50X25vdGhpbmcocykJKFNTTF93YW50KHMpID09IFNTTF9OT1RISU5HKQorI2RlZmluZSBTU0xfd2FudF9yZWFkKHMpCShTU0xfd2FudChzKSA9PSBTU0xfUkVBRElORykKKyNkZWZpbmUgU1NMX3dhbnRfd3JpdGUocykJKFNTTF93YW50KHMpID09IFNTTF9XUklUSU5HKQorI2RlZmluZSBTU0xfd2FudF94NTA5X2xvb2t1cChzKQkoU1NMX3dhbnQocykgPT0gU1NMX1g1MDlfTE9PS1VQKQorCisjZGVmaW5lIFNTTF9NQUNfRkxBR19SRUFEX01BQ19TVFJFQU0gMQorI2RlZmluZSBTU0xfTUFDX0ZMQUdfV1JJVEVfTUFDX1NUUkVBTSAyCisKK3N0cnVjdCBzc2xfc3QKKwl7CisJLyogcHJvdG9jb2wgdmVyc2lvbgorCSAqIChvbmUgb2YgU1NMMl9WRVJTSU9OLCBTU0wzX1ZFUlNJT04sIFRMUzFfVkVSU0lPTiwgRFRMUzFfVkVSU0lPTikKKwkgKi8KKwlpbnQgdmVyc2lvbjsKKwlpbnQgdHlwZTsgLyogU1NMX1NUX0NPTk5FQ1Qgb3IgU1NMX1NUX0FDQ0VQVCAqLworCisJY29uc3QgU1NMX01FVEhPRCAqbWV0aG9kOyAvKiBTU0x2MyAqLworCisJLyogVGhlcmUgYXJlIDIgQklPJ3MgZXZlbiB0aG91Z2ggdGhleSBhcmUgbm9ybWFsbHkgYm90aCB0aGUKKwkgKiBzYW1lLiAgVGhpcyBpcyBzbyBkYXRhIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuIHRvIGRpZmZlcmVudAorCSAqIGhhbmRsZXJzICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KKwlCSU8gKnJiaW87IC8qIHVzZWQgYnkgU1NMX3JlYWQgKi8KKwlCSU8gKndiaW87IC8qIHVzZWQgYnkgU1NMX3dyaXRlICovCisJQklPICpiYmlvOyAvKiB1c2VkIGR1cmluZyBzZXNzaW9uLWlkIHJldXNlIHRvIGNvbmNhdGVuYXRlCisJCSAgICAqIG1lc3NhZ2VzICovCisjZWxzZQorCWNoYXIgKnJiaW87IC8qIHVzZWQgYnkgU1NMX3JlYWQgKi8KKwljaGFyICp3YmlvOyAvKiB1c2VkIGJ5IFNTTF93cml0ZSAqLworCWNoYXIgKmJiaW87CisjZW5kaWYKKwkvKiBUaGlzIGhvbGRzIGEgdmFyaWFibGUgdGhhdCBpbmRpY2F0ZXMgd2hhdCB3ZSB3ZXJlIGRvaW5nCisJICogd2hlbiBhIDAgb3IgLTEgaXMgcmV0dXJuZWQuICBUaGlzIGlzIG5lZWRlZCBmb3IKKwkgKiBub24tYmxvY2tpbmcgSU8gc28gd2Uga25vdyB3aGF0IHJlcXVlc3QgbmVlZHMgcmUtZG9pbmcgd2hlbgorCSAqIGluIFNTTF9hY2NlcHQgb3IgU1NMX2Nvbm5lY3QgKi8KKwlpbnQgcndzdGF0ZTsKKworCS8qIHRydWUgd2hlbiB3ZSBhcmUgYWN0dWFsbHkgaW4gU1NMX2FjY2VwdCgpIG9yIFNTTF9jb25uZWN0KCkgKi8KKwlpbnQgaW5faGFuZHNoYWtlOworCWludCAoKmhhbmRzaGFrZV9mdW5jKShTU0wgKik7CisKKwkvKiBJbWFnaW5lIHRoYXQgaGVyZSdzIGEgYm9vbGVhbiBtZW1iZXIgImluaXQiIHRoYXQgaXMKKwkgKiBzd2l0Y2hlZCBhcyBzb29uIGFzIFNTTF9zZXRfe2FjY2VwdC9jb25uZWN0fV9zdGF0ZQorCSAqIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIHNvIHRoYXQgInN0YXRlIiBhbmQKKwkgKiAiaGFuZHNoYWtlX2Z1bmMiIGFyZSBwcm9wZXJseSBpbml0aWFsaXplZC4gIEJ1dCBhcworCSAqIGhhbmRzaGFrZV9mdW5jIGlzID09IDAgdW50aWwgdGhlbiwgd2UgdXNlIHRoaXMKKwkgKiB0ZXN0IGluc3RlYWQgb2YgYW4gImluaXQiIG1lbWJlci4KKwkgKi8KKworCWludCBzZXJ2ZXI7CS8qIGFyZSB3ZSB0aGUgc2VydmVyIHNpZGU/IC0gbW9zdGx5IHVzZWQgYnkgU1NMX2NsZWFyKi8KKworCWludCBuZXdfc2Vzc2lvbjsvKiAxIGlmIHdlIGFyZSB0byB1c2UgYSBuZXcgc2Vzc2lvbi4KKwkgICAgICAgICAgICAgICAgICogMiBpZiB3ZSBhcmUgYSBzZXJ2ZXIgYW5kIGFyZSBpbnNpZGUgYSBoYW5kc2hha2UKKwkgICAgICAgICAgICAgICAgICogICAoaS5lLiBub3QganVzdCBzZW5kaW5nIGEgSGVsbG9SZXF1ZXN0KQorCSAgICAgICAgICAgICAgICAgKiBOQjogRm9yIHNlcnZlcnMsIHRoZSAnbmV3JyBzZXNzaW9uIG1heSBhY3R1YWxseSBiZSBhIHByZXZpb3VzbHkKKwkgICAgICAgICAgICAgICAgICogY2FjaGVkIHNlc3Npb24gb3IgZXZlbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiB1bmxlc3MKKwkgICAgICAgICAgICAgICAgICogU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OIGlzIHNldCAqLworCWludCBxdWlldF9zaHV0ZG93bjsvKiBkb24ndCBzZW5kIHNodXRkb3duIHBhY2tldHMgKi8KKwlpbnQgc2h1dGRvd247CS8qIHdlIGhhdmUgc2h1dCB0aGluZ3MgZG93biwgMHgwMSBzZW50LCAweDAyCisJCQkgKiBmb3IgcmVjZWl2ZWQgKi8KKwlpbnQgc3RhdGU7CS8qIHdoZXJlIHdlIGFyZSAqLworCWludCByc3RhdGU7CS8qIHdoZXJlIHdlIGFyZSB3aGVuIHJlYWRpbmcgKi8KKworCUJVRl9NRU0gKmluaXRfYnVmOwkvKiBidWZmZXIgdXNlZCBkdXJpbmcgaW5pdCAqLworCXZvaWQgKmluaXRfbXNnOyAgIAkvKiBwb2ludGVyIHRvIGhhbmRzaGFrZSBtZXNzYWdlIGJvZHksIHNldCBieSBzc2wzX2dldF9tZXNzYWdlKCkgKi8KKwlpbnQgaW5pdF9udW07CQkvKiBhbW91bnQgcmVhZC93cml0dGVuICovCisJaW50IGluaXRfb2ZmOwkJLyogYW1vdW50IHJlYWQvd3JpdHRlbiAqLworCisJLyogdXNlZCBpbnRlcm5hbGx5IHRvIHBvaW50IGF0IGEgcmF3IHBhY2tldCAqLworCXVuc2lnbmVkIGNoYXIgKnBhY2tldDsKKwl1bnNpZ25lZCBpbnQgcGFja2V0X2xlbmd0aDsKKworCXN0cnVjdCBzc2wyX3N0YXRlX3N0ICpzMjsgLyogU1NMdjIgdmFyaWFibGVzICovCisJc3RydWN0IHNzbDNfc3RhdGVfc3QgKnMzOyAvKiBTU0x2MyB2YXJpYWJsZXMgKi8KKwlzdHJ1Y3QgZHRsczFfc3RhdGVfc3QgKmQxOyAvKiBEVExTdjEgdmFyaWFibGVzICovCisKKwlpbnQgcmVhZF9haGVhZDsJCS8qIFJlYWQgYXMgbWFueSBpbnB1dCBieXRlcyBhcyBwb3NzaWJsZQorCSAgICAgICAgICAgICAgIAkgCSAqIChmb3Igbm9uLWJsb2NraW5nIHJlYWRzKSAqLworCisJLyogY2FsbGJhY2sgdGhhdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHBlZWsgYXQgcHJvdG9jb2wgbWVzc2FnZXMgKi8KKwl2b2lkICgqbXNnX2NhbGxiYWNrKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZyk7CisJdm9pZCAqbXNnX2NhbGxiYWNrX2FyZzsKKworCWludCBoaXQ7CQkvKiByZXVzaW5nIGEgcHJldmlvdXMgc2Vzc2lvbiAqLworCisJWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtOworCisjaWYgMAorCWludCBwdXJwb3NlOwkJLyogUHVycG9zZSBzZXR0aW5nICovCisJaW50IHRydXN0OwkJLyogVHJ1c3Qgc2V0dGluZyAqLworI2VuZGlmCisKKwkvKiBjcnlwdG8gKi8KKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2lwaGVyX2xpc3Q7CisJU1RBQ0tfT0YoU1NMX0NJUEhFUikgKmNpcGhlcl9saXN0X2J5X2lkOworCisJLyogVGhlc2UgYXJlIHRoZSBvbmVzIGJlaW5nIHVzZWQsIHRoZSBvbmVzIGluIFNTTF9TRVNTSU9OIGFyZQorCSAqIHRoZSBvbmVzIHRvIGJlICdjb3BpZWQnIGludG8gdGhlc2Ugb25lcyAqLworCWludCBtYWNfZmxhZ3M7IAorCUVWUF9DSVBIRVJfQ1RYICplbmNfcmVhZF9jdHg7CQkvKiBjcnlwdG9ncmFwaGljIHN0YXRlICovCisJRVZQX01EX0NUWCAqcmVhZF9oYXNoOwkJLyogdXNlZCBmb3IgbWFjIGdlbmVyYXRpb24gKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJQ09NUF9DVFggKmV4cGFuZDsJCQkvKiB1bmNvbXByZXNzICovCisjZWxzZQorCWNoYXIgKmV4cGFuZDsKKyNlbmRpZgorCisJRVZQX0NJUEhFUl9DVFggKmVuY193cml0ZV9jdHg7CQkvKiBjcnlwdG9ncmFwaGljIHN0YXRlICovCisJRVZQX01EX0NUWCAqd3JpdGVfaGFzaDsJCS8qIHVzZWQgZm9yIG1hYyBnZW5lcmF0aW9uICovCisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCUNPTVBfQ1RYICpjb21wcmVzczsJCQkvKiBjb21wcmVzc2lvbiAqLworI2Vsc2UKKwljaGFyICpjb21wcmVzczsJCisjZW5kaWYKKworCS8qIHNlc3Npb24gaW5mbyAqLworCisJLyogY2xpZW50IGNlcnQ/ICovCisJLyogVGhpcyBpcyB1c2VkIHRvIGhvbGQgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB1c2VkICovCisJc3RydWN0IGNlcnRfc3QgLyogQ0VSVCAqLyAqY2VydDsKKworCS8qIHRoZSBzZXNzaW9uX2lkX2NvbnRleHQgaXMgdXNlZCB0byBlbnN1cmUgc2Vzc2lvbnMgYXJlIG9ubHkgcmV1c2VkCisJICogaW4gdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQgKi8KKwl1bnNpZ25lZCBpbnQgc2lkX2N0eF9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBzaWRfY3R4W1NTTF9NQVhfU0lEX0NUWF9MRU5HVEhdOworCisJLyogVGhpcyBjYW4gYWxzbyBiZSBpbiB0aGUgc2Vzc2lvbiBvbmNlIGEgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZCAqLworCVNTTF9TRVNTSU9OICpzZXNzaW9uOworCisgICAgICAgIC8qIFRoaXMgY2FuIGJlIGRpc2FibGVkIHRvIHByZXZlbnQgdGhlIHVzZSBvZiB1bmNhY2hlZCBzZXNzaW9ucyAqLworCWludCBzZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQ7CisKKwkvKiBEZWZhdWx0IGdlbmVyYXRlIHNlc3Npb24gSUQgY2FsbGJhY2suICovCisJR0VOX1NFU1NJT05fQ0IgZ2VuZXJhdGVfc2Vzc2lvbl9pZDsKKworCS8qIFVzZWQgaW4gU1NMMiBhbmQgU1NMMyAqLworCWludCB2ZXJpZnlfbW9kZTsJLyogMCBkb24ndCBjYXJlIGFib3V0IHZlcmlmeSBmYWlsdXJlLgorCQkJCSAqIDEgZmFpbCBpZiB2ZXJpZnkgZmFpbHMgKi8KKwlpbnQgKCp2ZXJpZnlfY2FsbGJhY2spKGludCBvayxYNTA5X1NUT1JFX0NUWCAqY3R4KTsgLyogZmFpbCBpZiBjYWxsYmFjayByZXR1cm5zIDAgKi8KKworCXZvaWQgKCppbmZvX2NhbGxiYWNrKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKTsgLyogb3B0aW9uYWwgaW5mb3JtYXRpb25hbCBjYWxsYmFjayAqLworCisJaW50IGVycm9yOwkJLyogZXJyb3IgYnl0ZXMgdG8gYmUgd3JpdHRlbiAqLworCWludCBlcnJvcl9jb2RlOwkJLyogYWN0dWFsIGNvZGUgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwlLU1NMX0NUWCAqa3NzbF9jdHg7ICAgICAvKiBLZXJiZXJvcyA1IGNvbnRleHQgKi8KKyNlbmRpZgkvKiBPUEVOU1NMX05PX0tSQjUgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCXVuc2lnbmVkIGludCAoKnBza19jbGllbnRfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LCBjaGFyICppZGVudGl0eSwKKwkJdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sIHVuc2lnbmVkIGNoYXIgKnBzaywKKwkJdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKTsKKwl1bnNpZ25lZCBpbnQgKCpwc2tfc2VydmVyX2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCisJCXVuc2lnbmVkIGNoYXIgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKTsKKyNlbmRpZgorCisJU1NMX0NUWCAqY3R4OworCS8qIHNldCB0aGlzIGZsYWcgdG8gMSBhbmQgYSBzbGVlcCgxKSBpcyBwdXQgaW50byBhbGwgU1NMX3JlYWQoKQorCSAqIGFuZCBTU0xfd3JpdGUoKSBjYWxscywgZ29vZCBmb3IgbmJpbyBkZWJ1Z2luZyA6LSkgKi8KKwlpbnQgZGVidWc7CQorCisJLyogZXh0cmEgYXBwbGljYXRpb24gZGF0YSAqLworCWxvbmcgdmVyaWZ5X3Jlc3VsdDsKKwlDUllQVE9fRVhfREFUQSBleF9kYXRhOworCisJLyogZm9yIHNlcnZlciBzaWRlLCBrZWVwIHRoZSBsaXN0IG9mIENBX2RuIHdlIGNhbiB1c2UgKi8KKwlTVEFDS19PRihYNTA5X05BTUUpICpjbGllbnRfQ0E7CisKKwlpbnQgcmVmZXJlbmNlczsKKwl1bnNpZ25lZCBsb25nIG9wdGlvbnM7IC8qIHByb3RvY29sIGJlaGF2aW91ciAqLworCXVuc2lnbmVkIGxvbmcgbW9kZTsgLyogQVBJIGJlaGF2aW91ciAqLworCWxvbmcgbWF4X2NlcnRfbGlzdDsKKwlpbnQgZmlyc3RfcGFja2V0OworCWludCBjbGllbnRfdmVyc2lvbjsJLyogd2hhdCB3YXMgcGFzc2VkLCB1c2VkIGZvcgorCQkJCSAqIFNTTHYzL1RMUyByb2xsYmFjayBjaGVjayAqLworCXVuc2lnbmVkIGludCBtYXhfc2VuZF9mcmFnbWVudDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkvKiBUTFMgZXh0ZW5zaW9uIGRlYnVnIGNhbGxiYWNrICovCisJdm9pZCAoKnRsc2V4dF9kZWJ1Z19jYikoU1NMICpzLCBpbnQgY2xpZW50X3NlcnZlciwgaW50IHR5cGUsCisJCQkJCXVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4sCisJCQkJCXZvaWQgKmFyZyk7CisJdm9pZCAqdGxzZXh0X2RlYnVnX2FyZzsKKwljaGFyICp0bHNleHRfaG9zdG5hbWU7CisJaW50IHNlcnZlcm5hbWVfZG9uZTsgICAvKiBubyBmdXJ0aGVyIG1vZCBvZiBzZXJ2ZXJuYW1lIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IGNhbGwgdGhlIHNlcnZlcm5hbWUgZXh0ZW5zaW9uIGNhbGxiYWNrLgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgMSA6IHByZXBhcmUgMiwgYWxsb3cgbGFzdCBhY2sganVzdCBhZnRlciBpbiBzZXJ2ZXIgY2FsbGJhY2suCisJICAgICAgICAgICAgICAgICAgICAgICAgICAyIDogZG9uJ3QgY2FsbCBzZXJ2ZXJuYW1lIGNhbGxiYWNrLCBubyBhY2sgaW4gc2VydmVyIGhlbGxvCisJICAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIGNlcnRpZmljYXRlIHN0YXR1cyByZXF1ZXN0IGluZm8gKi8KKwkvKiBTdGF0dXMgdHlwZSBvciAtMSBpZiBubyBzdGF0dXMgdHlwZSAqLworCWludCB0bHNleHRfc3RhdHVzX3R5cGU7CisJLyogRXhwZWN0IE9DU1AgQ2VydGlmaWNhdGVTdGF0dXMgbWVzc2FnZSAqLworCWludCB0bHNleHRfc3RhdHVzX2V4cGVjdGVkOworCS8qIE9DU1Agc3RhdHVzIHJlcXVlc3Qgb25seSAqLworCVNUQUNLX09GKE9DU1BfUkVTUElEKSAqdGxzZXh0X29jc3BfaWRzOworCVg1MDlfRVhURU5TSU9OUyAqdGxzZXh0X29jc3BfZXh0czsKKwkvKiBPQ1NQIHJlc3BvbnNlIHJlY2VpdmVkIG9yIHRvIGJlIHNlbnQgKi8KKwl1bnNpZ25lZCBjaGFyICp0bHNleHRfb2NzcF9yZXNwOworCWludCB0bHNleHRfb2NzcF9yZXNwbGVuOworCisJLyogUkZDNDUwNyBzZXNzaW9uIHRpY2tldCBleHBlY3RlZCB0byBiZSByZWNlaXZlZCBvciBzZW50ICovCisJaW50IHRsc2V4dF90aWNrZXRfZXhwZWN0ZWQ7CisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKwlzaXplX3QgdGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICp0bHNleHRfZWNwb2ludGZvcm1hdGxpc3Q7IC8qIG91ciBsaXN0ICovCisJc2l6ZV90IHRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGg7CisJdW5zaWduZWQgY2hhciAqdGxzZXh0X2VsbGlwdGljY3VydmVsaXN0OyAvKiBvdXIgbGlzdCAqLworI2VuZGlmIC8qIE9QRU5TU0xfTk9fRUMgKi8KKworCS8qIGRyYWZ0LXJlc2NvcmxhLXRscy1vcGFxdWUtcHJmLWlucHV0LTAwLnR4dCBpbmZvcm1hdGlvbiB0byBiZSB1c2VkIGZvciBoYW5kc2hha2VzICovCisJdm9pZCAqdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQ7CisJc2l6ZV90IHRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2xlbjsKKworCS8qIFRMUyBTZXNzaW9uIFRpY2tldCBleHRlbnNpb24gb3ZlcnJpZGUgKi8KKwlUTFNfU0VTU0lPTl9USUNLRVRfRVhUICp0bHNleHRfc2Vzc2lvbl90aWNrZXQ7CisKKwkvKiBUTFMgU2Vzc2lvbiBUaWNrZXQgZXh0ZW5zaW9uIGNhbGxiYWNrICovCisJdGxzX3Nlc3Npb25fdGlja2V0X2V4dF9jYl9mbiB0bHNfc2Vzc2lvbl90aWNrZXRfZXh0X2NiOworCXZvaWQgKnRsc19zZXNzaW9uX3RpY2tldF9leHRfY2JfYXJnOworCisJLyogVExTIHByZS1zaGFyZWQgc2VjcmV0IHNlc3Npb24gcmVzdW1wdGlvbiAqLworCXRsc19zZXNzaW9uX3NlY3JldF9jYl9mbiB0bHNfc2Vzc2lvbl9zZWNyZXRfY2I7CisJdm9pZCAqdGxzX3Nlc3Npb25fc2VjcmV0X2NiX2FyZzsKKworCVNTTF9DVFggKiBpbml0aWFsX2N0eDsgLyogaW5pdGlhbCBjdHgsIHVzZWQgdG8gc3RvcmUgc2Vzc2lvbnMgKi8KKyNkZWZpbmUgc2Vzc2lvbl9jdHggaW5pdGlhbF9jdHgKKyNlbHNlCisjZGVmaW5lIHNlc3Npb25fY3R4IGN0eAorI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisJfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wvc3NsMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsMy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvdGxzMS5oPiAvKiBUaGlzIGlzIG1vc3RseSBzc2x2MyB3aXRoIGEgZmV3IHR3ZWFrcyAqLworI2luY2x1ZGUgPG9wZW5zc2wvZHRsczEuaD4gLyogRGF0YWdyYW0gVExTICovCisjaW5jbHVkZSA8b3BlbnNzbC9zc2wyMy5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFNTTF9zZXRfYXBwX2RhdGEocyxhcmcpCQkoU1NMX3NldF9leF9kYXRhKHMsMCwoY2hhciAqKWFyZykpCisjZGVmaW5lIFNTTF9nZXRfYXBwX2RhdGEocykJCShTU0xfZ2V0X2V4X2RhdGEocywwKSkKKyNkZWZpbmUgU1NMX1NFU1NJT05fc2V0X2FwcF9kYXRhKHMsYSkJKFNTTF9TRVNTSU9OX3NldF9leF9kYXRhKHMsMCwoY2hhciAqKWEpKQorI2RlZmluZSBTU0xfU0VTU0lPTl9nZXRfYXBwX2RhdGEocykJKFNTTF9TRVNTSU9OX2dldF9leF9kYXRhKHMsMCkpCisjZGVmaW5lIFNTTF9DVFhfZ2V0X2FwcF9kYXRhKGN0eCkJKFNTTF9DVFhfZ2V0X2V4X2RhdGEoY3R4LDApKQorI2RlZmluZSBTU0xfQ1RYX3NldF9hcHBfZGF0YShjdHgsYXJnKQkoU1NMX0NUWF9zZXRfZXhfZGF0YShjdHgsMCwoY2hhciAqKWFyZykpCisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgZm9yIHNzbC0+c3RhdGUgYXJlIGFyZQorICogdXNlZCB0byBpbmRpY2F0ZSB3aGVyZSB3ZSBhcmUgdXAgdG8gaW4gdGhlIFNTTCBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQuCisgKiBUaGUgbWFjcm9zIHRoYXQgZm9sbG93IGFyZSBhYm91dCB0aGUgb25seSB0aGluZ3MgeW91IHNob3VsZCBuZWVkIHRvIHVzZQorICogYW5kIGV2ZW4gdGhlbiwgb25seSB3aGVuIHVzaW5nIG5vbi1ibG9ja2luZyBJTy4KKyAqIEl0IGNhbiBhbHNvIGJlIHVzZWZ1bCB0byB3b3JrIG91dCB3aGVyZSB5b3Ugd2VyZSB3aGVuIHRoZSBjb25uZWN0aW9uCisgKiBmYWlsZWQgKi8KKworI2RlZmluZSBTU0xfU1RfQ09OTkVDVAkJCTB4MTAwMAorI2RlZmluZSBTU0xfU1RfQUNDRVBUCQkJMHgyMDAwCisjZGVmaW5lIFNTTF9TVF9NQVNLCQkJMHgwRkZGCisjZGVmaW5lIFNTTF9TVF9JTklUCQkJKFNTTF9TVF9DT05ORUNUfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTF9TVF9CRUZPUkUJCQkweDQwMDAKKyNkZWZpbmUgU1NMX1NUX09LCQkJMHgwMworI2RlZmluZSBTU0xfU1RfUkVORUdPVElBVEUJCSgweDA0fFNTTF9TVF9JTklUKQorCisjZGVmaW5lIFNTTF9DQl9MT09QCQkJMHgwMQorI2RlZmluZSBTU0xfQ0JfRVhJVAkJCTB4MDIKKyNkZWZpbmUgU1NMX0NCX1JFQUQJCQkweDA0CisjZGVmaW5lIFNTTF9DQl9XUklURQkJCTB4MDgKKyNkZWZpbmUgU1NMX0NCX0FMRVJUCQkJMHg0MDAwIC8qIHVzZWQgaW4gY2FsbGJhY2sgKi8KKyNkZWZpbmUgU1NMX0NCX1JFQURfQUxFUlQJCShTU0xfQ0JfQUxFUlR8U1NMX0NCX1JFQUQpCisjZGVmaW5lIFNTTF9DQl9XUklURV9BTEVSVAkJKFNTTF9DQl9BTEVSVHxTU0xfQ0JfV1JJVEUpCisjZGVmaW5lIFNTTF9DQl9BQ0NFUFRfTE9PUAkJKFNTTF9TVF9BQ0NFUFR8U1NMX0NCX0xPT1ApCisjZGVmaW5lIFNTTF9DQl9BQ0NFUFRfRVhJVAkJKFNTTF9TVF9BQ0NFUFR8U1NMX0NCX0VYSVQpCisjZGVmaW5lIFNTTF9DQl9DT05ORUNUX0xPT1AJCShTU0xfU1RfQ09OTkVDVHxTU0xfQ0JfTE9PUCkKKyNkZWZpbmUgU1NMX0NCX0NPTk5FQ1RfRVhJVAkJKFNTTF9TVF9DT05ORUNUfFNTTF9DQl9FWElUKQorI2RlZmluZSBTU0xfQ0JfSEFORFNIQUtFX1NUQVJUCQkweDEwCisjZGVmaW5lIFNTTF9DQl9IQU5EU0hBS0VfRE9ORQkJMHgyMAorCisvKiBJcyB0aGUgU1NMX2Nvbm5lY3Rpb24gZXN0YWJsaXNoZWQ/ICovCisjZGVmaW5lIFNTTF9nZXRfc3RhdGUoYSkJCVNTTF9zdGF0ZShhKQorI2RlZmluZSBTU0xfaXNfaW5pdF9maW5pc2hlZChhKQkJKFNTTF9zdGF0ZShhKSA9PSBTU0xfU1RfT0spCisjZGVmaW5lIFNTTF9pbl9pbml0KGEpCQkJKChTU0xfc3RhdGUoYSkmU1NMX1NUX0lOSVQpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhU1NMX2N1dHRocm91Z2hfY29tcGxldGUoYSkpCisjZGVmaW5lIFNTTF9pbl9iZWZvcmUoYSkJCShTU0xfc3RhdGUoYSkmU1NMX1NUX0JFRk9SRSkKKyNkZWZpbmUgU1NMX2luX2Nvbm5lY3RfaW5pdChhKQkJKFNTTF9zdGF0ZShhKSZTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMX2luX2FjY2VwdF9pbml0KGEpCQkoU1NMX3N0YXRlKGEpJlNTTF9TVF9BQ0NFUFQpCitpbnQgU1NMX2N1dHRocm91Z2hfY29tcGxldGUoY29uc3QgU1NMICpzKTsKKworLyogVGhlIGZvbGxvd2luZyAyIHN0YXRlcyBhcmUga2VwdCBpbiBzc2wtPnJzdGF0ZSB3aGVuIHJlYWRzIGZhaWwsCisgKiB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRoZXNlICovCisjZGVmaW5lIFNTTF9TVF9SRUFEX0hFQURFUgkJCTB4RjAKKyNkZWZpbmUgU1NMX1NUX1JFQURfQk9EWQkJCTB4RjEKKyNkZWZpbmUgU1NMX1NUX1JFQURfRE9ORQkJCTB4RjIKKworLyogT2J0YWluIGxhdGVzdCBGaW5pc2hlZCBtZXNzYWdlCisgKiAgIC0tIHRoYXQgd2Ugc2VudCAoU1NMX2dldF9maW5pc2hlZCkKKyAqICAgLS0gdGhhdCB3ZSBleHBlY3RlZCBmcm9tIHBlZXIgKFNTTF9nZXRfcGVlcl9maW5pc2hlZCkuCisgKiBSZXR1cm5zIGxlbmd0aCAoMCA9PSBubyBGaW5pc2hlZCBzbyBmYXIpLCBjb3BpZXMgdXAgdG8gJ2NvdW50JyBieXRlcy4gKi8KK3NpemVfdCBTU0xfZ2V0X2ZpbmlzaGVkKGNvbnN0IFNTTCAqcywgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOworc2l6ZV90IFNTTF9nZXRfcGVlcl9maW5pc2hlZChjb25zdCBTU0wgKnMsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKworLyogdXNlIGVpdGhlciBTU0xfVkVSSUZZX05PTkUgb3IgU1NMX1ZFUklGWV9QRUVSLCB0aGUgbGFzdCAyIG9wdGlvbnMKKyAqIGFyZSAnb3JlZCcgd2l0aCBTU0xfVkVSSUZZX1BFRVIgaWYgdGhleSBhcmUgZGVzaXJlZCAqLworI2RlZmluZSBTU0xfVkVSSUZZX05PTkUJCQkweDAwCisjZGVmaW5lIFNTTF9WRVJJRllfUEVFUgkJCTB4MDEKKyNkZWZpbmUgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVAkweDAyCisjZGVmaW5lIFNTTF9WRVJJRllfQ0xJRU5UX09OQ0UJCTB4MDQKKworI2RlZmluZSBPcGVuU1NMX2FkZF9zc2xfYWxnb3JpdGhtcygpCVNTTF9saWJyYXJ5X2luaXQoKQorI2RlZmluZSBTU0xlYXlfYWRkX3NzbF9hbGdvcml0aG1zKCkJU1NMX2xpYnJhcnlfaW5pdCgpCisKKy8qIHRoaXMgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNpZiAwIC8qIE5FV19TU0xFQVkgKi8KKyNkZWZpbmUgU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnkoYSxiLGMpIFNTTF9DVFhfc2V0X3ZlcmlmeShhLGIsYykKKyNkZWZpbmUgU1NMX3NldF9wcmVmX2NpcGhlcihjLG4pCVNTTF9zZXRfY2lwaGVyX2xpc3QoYyxuKQorI2RlZmluZSBTU0xfYWRkX3Nlc3Npb24oYSxiKSAgICAgICAgICAgIFNTTF9DVFhfYWRkX3Nlc3Npb24oKGEpLChiKSkKKyNkZWZpbmUgU1NMX3JlbW92ZV9zZXNzaW9uKGEsYikJCVNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24oKGEpLChiKSkKKyNkZWZpbmUgU1NMX2ZsdXNoX3Nlc3Npb25zKGEsYikJCVNTTF9DVFhfZmx1c2hfc2Vzc2lvbnMoKGEpLChiKSkKKyNlbmRpZgorLyogTW9yZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFNTTF9nZXRfY2lwaGVyKHMpIFwKKwkJU1NMX0NJUEhFUl9nZXRfbmFtZShTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHMpKQorI2RlZmluZSBTU0xfZ2V0X2NpcGhlcl9iaXRzKHMsbnApIFwKKwkJU1NMX0NJUEhFUl9nZXRfYml0cyhTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHMpLG5wKQorI2RlZmluZSBTU0xfZ2V0X2NpcGhlcl92ZXJzaW9uKHMpIFwKKwkJU1NMX0NJUEhFUl9nZXRfdmVyc2lvbihTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHMpKQorI2RlZmluZSBTU0xfZ2V0X2NpcGhlcl9uYW1lKHMpIFwKKwkJU1NMX0NJUEhFUl9nZXRfbmFtZShTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHMpKQorI2RlZmluZSBTU0xfZ2V0X3RpbWUoYSkJCVNTTF9TRVNTSU9OX2dldF90aW1lKGEpCisjZGVmaW5lIFNTTF9zZXRfdGltZShhLGIpCVNTTF9TRVNTSU9OX3NldF90aW1lKChhKSwoYikpCisjZGVmaW5lIFNTTF9nZXRfdGltZW91dChhKQlTU0xfU0VTU0lPTl9nZXRfdGltZW91dChhKQorI2RlZmluZSBTU0xfc2V0X3RpbWVvdXQoYSxiKQlTU0xfU0VTU0lPTl9zZXRfdGltZW91dCgoYSksKGIpKQorCisjZGVmaW5lIGQyaV9TU0xfU0VTU0lPTl9iaW8oYnAsc19pZCkgQVNOMV9kMmlfYmlvX29mKFNTTF9TRVNTSU9OLFNTTF9TRVNTSU9OX25ldyxkMmlfU1NMX1NFU1NJT04sYnAsc19pZCkKKyNkZWZpbmUgaTJkX1NTTF9TRVNTSU9OX2JpbyhicCxzX2lkKSBBU04xX2kyZF9iaW9fb2YoU1NMX1NFU1NJT04saTJkX1NTTF9TRVNTSU9OLGJwLHNfaWQpCisKK0RFQ0xBUkVfUEVNX3J3KFNTTF9TRVNTSU9OLCBTU0xfU0VTU0lPTikKKworI2RlZmluZSBTU0xfQURfUkVBU09OX09GRlNFVAkJMTAwMCAvKiBvZmZzZXQgdG8gZ2V0IFNTTF9SXy4uLiB2YWx1ZSBmcm9tIFNTTF9BRF8uLi4gKi8KKworLyogVGhlc2UgYWxlcnQgdHlwZXMgYXJlIGZvciBTU0x2MyBhbmQgVExTdjEgKi8KKyNkZWZpbmUgU1NMX0FEX0NMT1NFX05PVElGWQkJU1NMM19BRF9DTE9TRV9OT1RJRlkKKyNkZWZpbmUgU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRQlTU0wzX0FEX1VORVhQRUNURURfTUVTU0FHRSAvKiBmYXRhbCAqLworI2RlZmluZSBTU0xfQURfQkFEX1JFQ09SRF9NQUMJCVNTTDNfQURfQkFEX1JFQ09SRF9NQUMgICAgIC8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9ERUNSWVBUSU9OX0ZBSUxFRAlUTFMxX0FEX0RFQ1JZUFRJT05fRkFJTEVECisjZGVmaW5lIFNTTF9BRF9SRUNPUkRfT1ZFUkZMT1cJCVRMUzFfQURfUkVDT1JEX09WRVJGTE9XCisjZGVmaW5lIFNTTF9BRF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkUJU1NMM19BRF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkUvKiBmYXRhbCAqLworI2RlZmluZSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUJU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRS8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9OT19DRVJUSUZJQ0FURQkJU1NMM19BRF9OT19DRVJUSUZJQ0FURSAvKiBOb3QgZm9yIFRMUyAqLworI2RlZmluZSBTU0xfQURfQkFEX0NFUlRJRklDQVRFCQlTU0wzX0FEX0JBRF9DRVJUSUZJQ0FURQorI2RlZmluZSBTU0xfQURfVU5TVVBQT1JURURfQ0VSVElGSUNBVEUJU1NMM19BRF9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURQorI2RlZmluZSBTU0xfQURfQ0VSVElGSUNBVEVfUkVWT0tFRAlTU0wzX0FEX0NFUlRJRklDQVRFX1JFVk9LRUQKKyNkZWZpbmUgU1NMX0FEX0NFUlRJRklDQVRFX0VYUElSRUQJU1NMM19BRF9DRVJUSUZJQ0FURV9FWFBJUkVECisjZGVmaW5lIFNTTF9BRF9DRVJUSUZJQ0FURV9VTktOT1dOCVNTTDNfQURfQ0VSVElGSUNBVEVfVU5LTk9XTgorI2RlZmluZSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVIJU1NMM19BRF9JTExFR0FMX1BBUkFNRVRFUiAgIC8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9VTktOT1dOX0NBCQlUTFMxX0FEX1VOS05PV05fQ0EJLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMX0FEX0FDQ0VTU19ERU5JRUQJCVRMUzFfQURfQUNDRVNTX0RFTklFRAkvKiBmYXRhbCAqLworI2RlZmluZSBTU0xfQURfREVDT0RFX0VSUk9SCQlUTFMxX0FEX0RFQ09ERV9FUlJPUgkvKiBmYXRhbCAqLworI2RlZmluZSBTU0xfQURfREVDUllQVF9FUlJPUgkJVExTMV9BRF9ERUNSWVBUX0VSUk9SCisjZGVmaW5lIFNTTF9BRF9FWFBPUlRfUkVTVFJJQ1RJT04JVExTMV9BRF9FWFBPUlRfUkVTVFJJQ1RJT04vKiBmYXRhbCAqLworI2RlZmluZSBTU0xfQURfUFJPVE9DT0xfVkVSU0lPTgkJVExTMV9BRF9QUk9UT0NPTF9WRVJTSU9OIC8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9JTlNVRkZJQ0lFTlRfU0VDVVJJVFkJVExTMV9BRF9JTlNVRkZJQ0lFTlRfU0VDVVJJVFkvKiBmYXRhbCAqLworI2RlZmluZSBTU0xfQURfSU5URVJOQUxfRVJST1IJCVRMUzFfQURfSU5URVJOQUxfRVJST1IJLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMX0FEX1VTRVJfQ0FOQ0VMTEVECQlUTFMxX0FEX1VTRVJfQ0FOQ0VMTEVECisjZGVmaW5lIFNTTF9BRF9OT19SRU5FR09USUFUSU9OCQlUTFMxX0FEX05PX1JFTkVHT1RJQVRJT04KKyNkZWZpbmUgU1NMX0FEX1VOU1VQUE9SVEVEX0VYVEVOU0lPTglUTFMxX0FEX1VOU1VQUE9SVEVEX0VYVEVOU0lPTgorI2RlZmluZSBTU0xfQURfQ0VSVElGSUNBVEVfVU5PQlRBSU5BQkxFIFRMUzFfQURfQ0VSVElGSUNBVEVfVU5PQlRBSU5BQkxFCisjZGVmaW5lIFNTTF9BRF9VTlJFQ09HTklaRURfTkFNRQlUTFMxX0FEX1VOUkVDT0dOSVpFRF9OQU1FCisjZGVmaW5lIFNTTF9BRF9CQURfQ0VSVElGSUNBVEVfU1RBVFVTX1JFU1BPTlNFIFRMUzFfQURfQkFEX0NFUlRJRklDQVRFX1NUQVRVU19SRVNQT05TRQorI2RlZmluZSBTU0xfQURfQkFEX0NFUlRJRklDQVRFX0hBU0hfVkFMVUUgVExTMV9BRF9CQURfQ0VSVElGSUNBVEVfSEFTSF9WQUxVRQorI2RlZmluZSBTU0xfQURfVU5LTk9XTl9QU0tfSURFTlRJVFkgICAgIFRMUzFfQURfVU5LTk9XTl9QU0tfSURFTlRJVFkgLyogZmF0YWwgKi8KKworI2RlZmluZSBTU0xfRVJST1JfTk9ORQkJCTAKKyNkZWZpbmUgU1NMX0VSUk9SX1NTTAkJCTEKKyNkZWZpbmUgU1NMX0VSUk9SX1dBTlRfUkVBRAkJMgorI2RlZmluZSBTU0xfRVJST1JfV0FOVF9XUklURQkJMworI2RlZmluZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUAk0CisjZGVmaW5lIFNTTF9FUlJPUl9TWVNDQUxMCQk1IC8qIGxvb2sgYXQgZXJyb3Igc3RhY2svcmV0dXJuIHZhbHVlL2Vycm5vICovCisjZGVmaW5lIFNTTF9FUlJPUl9aRVJPX1JFVFVSTgkJNgorI2RlZmluZSBTU0xfRVJST1JfV0FOVF9DT05ORUNUCQk3CisjZGVmaW5lIFNTTF9FUlJPUl9XQU5UX0FDQ0VQVAkJOAorCisjZGVmaW5lIFNTTF9DVFJMX05FRURfVE1QX1JTQQkJCTEKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9SU0EJCQkyCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfREgJCQkzCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfRUNESAkJCTQKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9SU0FfQ0IJCQk1CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfREhfQ0IJCQk2CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTVBfRUNESF9DQgkJNworCisjZGVmaW5lIFNTTF9DVFJMX0dFVF9TRVNTSU9OX1JFVVNFRAkJOAorI2RlZmluZSBTU0xfQ1RSTF9HRVRfQ0xJRU5UX0NFUlRfUkVRVUVTVAk5CisjZGVmaW5lIFNTTF9DVFJMX0dFVF9OVU1fUkVORUdPVElBVElPTlMJCTEwCisjZGVmaW5lIFNTTF9DVFJMX0NMRUFSX05VTV9SRU5FR09USUFUSU9OUwkxMQorI2RlZmluZSBTU0xfQ1RSTF9HRVRfVE9UQUxfUkVORUdPVElBVElPTlMJMTIKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX0ZMQUdTCQkJMTMKKyNkZWZpbmUgU1NMX0NUUkxfRVhUUkFfQ0hBSU5fQ0VSVAkJMTQKKworI2RlZmluZSBTU0xfQ1RSTF9TRVRfTVNHX0NBTExCQUNLICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX01TR19DQUxMQkFDS19BUkcgICAgICAgICAgIDE2CisKKy8qIG9ubHkgYXBwbGllcyB0byBkYXRhZ3JhbSBjb25uZWN0aW9ucyAqLworI2RlZmluZSBTU0xfQ1RSTF9TRVRfTVRVICAgICAgICAgICAgICAgIDE3CisvKiBTdGF0cyAqLworI2RlZmluZSBTU0xfQ1RSTF9TRVNTX05VTUJFUgkJCTIwCisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfQ09OTkVDVAkJCTIxCisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfQ09OTkVDVF9HT09ECQkyMgorI2RlZmluZSBTU0xfQ1RSTF9TRVNTX0NPTk5FQ1RfUkVORUdPVElBVEUJMjMKKyNkZWZpbmUgU1NMX0NUUkxfU0VTU19BQ0NFUFQJCQkyNAorI2RlZmluZSBTU0xfQ1RSTF9TRVNTX0FDQ0VQVF9HT09ECQkyNQorI2RlZmluZSBTU0xfQ1RSTF9TRVNTX0FDQ0VQVF9SRU5FR09USUFURQkyNgorI2RlZmluZSBTU0xfQ1RSTF9TRVNTX0hJVAkJCTI3CisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfQ0JfSElUCQkJMjgKKyNkZWZpbmUgU1NMX0NUUkxfU0VTU19NSVNTRVMJCQkyOQorI2RlZmluZSBTU0xfQ1RSTF9TRVNTX1RJTUVPVVRTCQkJMzAKKyNkZWZpbmUgU1NMX0NUUkxfU0VTU19DQUNIRV9GVUxMCQkzMQorI2RlZmluZSBTU0xfQ1RSTF9PUFRJT05TCQkJMzIKKyNkZWZpbmUgU1NMX0NUUkxfTU9ERQkJCQkzMworCisjZGVmaW5lIFNTTF9DVFJMX0dFVF9SRUFEX0FIRUFECQkJNDAKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1JFQURfQUhFQUQJCQk0MQorI2RlZmluZSBTU0xfQ1RSTF9TRVRfU0VTU19DQUNIRV9TSVpFCQk0MgorI2RlZmluZSBTU0xfQ1RSTF9HRVRfU0VTU19DQUNIRV9TSVpFCQk0MworI2RlZmluZSBTU0xfQ1RSTF9TRVRfU0VTU19DQUNIRV9NT0RFCQk0NAorI2RlZmluZSBTU0xfQ1RSTF9HRVRfU0VTU19DQUNIRV9NT0RFCQk0NQorCisjZGVmaW5lIFNTTF9DVFJMX0dFVF9NQVhfQ0VSVF9MSVNUCQk1MAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfTUFYX0NFUlRfTElTVAkJNTEKKworI2RlZmluZSBTU0xfQ1RSTF9TRVRfTUFYX1NFTkRfRlJBR01FTlQJCTUyCisKKy8qIHNlZSB0bHMxLmggZm9yIG1hY3JvcyBiYXNlZCBvbiB0aGVzZSAqLworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQ0IJNTMKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0FSRwk1NAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX0hPU1ROQU1FCQk1NQorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX0RFQlVHX0NCCQk1NgorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX0RFQlVHX0FSRwkJNTcKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1RMU0VYVF9USUNLRVRfS0VZUwkJNTgKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9USUNLRVRfS0VZUwkJNTkKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9PUEFRVUVfUFJGX0lOUFVUCTYwCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfT1BBUVVFX1BSRl9JTlBVVF9DQgk2MQorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX09QQVFVRV9QUkZfSU5QVVRfQ0JfQVJHIDYyCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9DQgk2MworI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfQ0JfQVJHCTY0CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9UWVBFCTY1CisjZGVmaW5lIFNTTF9DVFJMX0dFVF9UTFNFWFRfU1RBVFVTX1JFUV9FWFRTCTY2CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9FWFRTCTY3CisjZGVmaW5lIFNTTF9DVFJMX0dFVF9UTFNFWFRfU1RBVFVTX1JFUV9JRFMJNjgKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX0lEUwk2OQorI2RlZmluZSBTU0xfQ1RSTF9HRVRfVExTRVhUX1NUQVRVU19SRVFfT0NTUF9SRVNQCTcwCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9PQ1NQX1JFU1AJNzEKKworI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1RJQ0tFVF9LRVlfQ0IJNzIKKyNlbmRpZgorCisjZGVmaW5lIERUTFNfQ1RSTF9HRVRfVElNRU9VVAkJNzMKKyNkZWZpbmUgRFRMU19DVFJMX0hBTkRMRV9USU1FT1VUCTc0CisjZGVmaW5lIERUTFNfQ1RSTF9MSVNURU4JCQk3NQorCisjZGVmaW5lIFNTTF9DVFJMX0dFVF9SSV9TVVBQT1JUCQkJNzYKKyNkZWZpbmUgU1NMX0NUUkxfQ0xFQVJfT1BUSU9OUwkJCTc3CisjZGVmaW5lIFNTTF9DVFJMX0NMRUFSX01PREUJCQk3OAorCisjZGVmaW5lIERUTFN2MV9nZXRfdGltZW91dChzc2wsIGFyZykgXAorCVNTTF9jdHJsKHNzbCxEVExTX0NUUkxfR0VUX1RJTUVPVVQsMCwgKHZvaWQgKilhcmcpCisjZGVmaW5lIERUTFN2MV9oYW5kbGVfdGltZW91dChzc2wpIFwKKwlTU0xfY3RybChzc2wsRFRMU19DVFJMX0hBTkRMRV9USU1FT1VULDAsIE5VTEwpCisjZGVmaW5lIERUTFN2MV9saXN0ZW4oc3NsLCBwZWVyKSBcCisJU1NMX2N0cmwoc3NsLERUTFNfQ1RSTF9MSVNURU4sMCwgKHZvaWQgKilwZWVyKQorCisjZGVmaW5lIFNTTF9zZXNzaW9uX3JldXNlZChzc2wpIFwKKwlTU0xfY3RybCgoc3NsKSxTU0xfQ1RSTF9HRVRfU0VTU0lPTl9SRVVTRUQsMCxOVUxMKQorI2RlZmluZSBTU0xfbnVtX3JlbmVnb3RpYXRpb25zKHNzbCkgXAorCVNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX0dFVF9OVU1fUkVORUdPVElBVElPTlMsMCxOVUxMKQorI2RlZmluZSBTU0xfY2xlYXJfbnVtX3JlbmVnb3RpYXRpb25zKHNzbCkgXAorCVNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX0NMRUFSX05VTV9SRU5FR09USUFUSU9OUywwLE5VTEwpCisjZGVmaW5lIFNTTF90b3RhbF9yZW5lZ290aWF0aW9ucyhzc2wpIFwKKwlTU0xfY3RybCgoc3NsKSxTU0xfQ1RSTF9HRVRfVE9UQUxfUkVORUdPVElBVElPTlMsMCxOVUxMKQorCisjZGVmaW5lIFNTTF9DVFhfbmVlZF90bXBfUlNBKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfTkVFRF9UTVBfUlNBLDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdG1wX3JzYShjdHgscnNhKSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfVE1QX1JTQSwwLChjaGFyICopcnNhKQorI2RlZmluZSBTU0xfQ1RYX3NldF90bXBfZGgoY3R4LGRoKSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfVE1QX0RILDAsKGNoYXIgKilkaCkKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdG1wX2VjZGgoY3R4LGVjZGgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9UTVBfRUNESCwwLChjaGFyICopZWNkaCkKKworI2RlZmluZSBTU0xfbmVlZF90bXBfUlNBKHNzbCkgXAorCVNTTF9jdHJsKHNzbCxTU0xfQ1RSTF9ORUVEX1RNUF9SU0EsMCxOVUxMKQorI2RlZmluZSBTU0xfc2V0X3RtcF9yc2Eoc3NsLHJzYSkgXAorCVNTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVE1QX1JTQSwwLChjaGFyICopcnNhKQorI2RlZmluZSBTU0xfc2V0X3RtcF9kaChzc2wsZGgpIFwKKwlTU0xfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RNUF9ESCwwLChjaGFyICopZGgpCisjZGVmaW5lIFNTTF9zZXRfdG1wX2VjZGgoc3NsLGVjZGgpIFwKKwlTU0xfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RNUF9FQ0RILDAsKGNoYXIgKillY2RoKQorCisjZGVmaW5lIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoY3R4LHg1MDkpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX0VYVFJBX0NIQUlOX0NFUlQsMCwoY2hhciAqKXg1MDkpCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK0JJT19NRVRIT0QgKkJJT19mX3NzbCh2b2lkKTsKK0JJTyAqQklPX25ld19zc2woU1NMX0NUWCAqY3R4LGludCBjbGllbnQpOworQklPICpCSU9fbmV3X3NzbF9jb25uZWN0KFNTTF9DVFggKmN0eCk7CitCSU8gKkJJT19uZXdfYnVmZmVyX3NzbF9jb25uZWN0KFNTTF9DVFggKmN0eCk7CitpbnQgQklPX3NzbF9jb3B5X3Nlc3Npb25faWQoQklPICp0byxCSU8gKmZyb20pOwordm9pZCBCSU9fc3NsX3NodXRkb3duKEJJTyAqc3NsX2Jpbyk7CisKKyNlbmRpZgorCitpbnQJU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoU1NMX0NUWCAqLGNvbnN0IGNoYXIgKnN0cik7CitTU0xfQ1RYICpTU0xfQ1RYX25ldyhjb25zdCBTU0xfTUVUSE9EICptZXRoKTsKK3ZvaWQJU1NMX0NUWF9mcmVlKFNTTF9DVFggKik7Citsb25nIFNTTF9DVFhfc2V0X3RpbWVvdXQoU1NMX0NUWCAqY3R4LGxvbmcgdCk7Citsb25nIFNTTF9DVFhfZ2V0X3RpbWVvdXQoY29uc3QgU1NMX0NUWCAqY3R4KTsKK1g1MDlfU1RPUkUgKlNTTF9DVFhfZ2V0X2NlcnRfc3RvcmUoY29uc3QgU1NMX0NUWCAqKTsKK3ZvaWQgU1NMX0NUWF9zZXRfY2VydF9zdG9yZShTU0xfQ1RYICosWDUwOV9TVE9SRSAqKTsKK2ludCBTU0xfd2FudChjb25zdCBTU0wgKnMpOworaW50CVNTTF9jbGVhcihTU0wgKnMpOworCit2b2lkCVNTTF9DVFhfZmx1c2hfc2Vzc2lvbnMoU1NMX0NUWCAqY3R4LGxvbmcgdG0pOworCitjb25zdCBTU0xfQ0lQSEVSICpTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKGNvbnN0IFNTTCAqcyk7CitpbnQJU1NMX0NJUEhFUl9nZXRfYml0cyhjb25zdCBTU0xfQ0lQSEVSICpjLGludCAqYWxnX2JpdHMpOworY2hhciAqCVNTTF9DSVBIRVJfZ2V0X3ZlcnNpb24oY29uc3QgU1NMX0NJUEhFUiAqYyk7Citjb25zdCBjaGFyICoJU1NMX0NJUEhFUl9nZXRfbmFtZShjb25zdCBTU0xfQ0lQSEVSICpjKTsKKworaW50CVNTTF9nZXRfZmQoY29uc3QgU1NMICpzKTsKK2ludAlTU0xfZ2V0X3JmZChjb25zdCBTU0wgKnMpOworaW50CVNTTF9nZXRfd2ZkKGNvbnN0IFNTTCAqcyk7Citjb25zdCBjaGFyICAqIFNTTF9nZXRfY2lwaGVyX2xpc3QoY29uc3QgU1NMICpzLGludCBuKTsKK2NoYXIgKglTU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKGNvbnN0IFNTTCAqcywgY2hhciAqYnVmLCBpbnQgbGVuKTsKK2ludAlTU0xfZ2V0X3JlYWRfYWhlYWQoY29uc3QgU1NMICogcyk7CitpbnQJU1NMX3BlbmRpbmcoY29uc3QgU1NMICpzKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19TT0NLCitpbnQJU1NMX3NldF9mZChTU0wgKnMsIGludCBmZCk7CitpbnQJU1NMX3NldF9yZmQoU1NMICpzLCBpbnQgZmQpOworaW50CVNTTF9zZXRfd2ZkKFNTTCAqcywgaW50IGZkKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTwordm9pZAlTU0xfc2V0X2JpbyhTU0wgKnMsIEJJTyAqcmJpbyxCSU8gKndiaW8pOworQklPICoJU1NMX2dldF9yYmlvKGNvbnN0IFNTTCAqcyk7CitCSU8gKglTU0xfZ2V0X3diaW8oY29uc3QgU1NMICpzKTsKKyNlbmRpZgoraW50CVNTTF9zZXRfY2lwaGVyX2xpc3QoU1NMICpzLCBjb25zdCBjaGFyICpzdHIpOworaW50CVNTTF9zZXRfY2lwaGVyX2xpc3RzKFNTTCAqcywgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnNrKTsKK3ZvaWQJU1NMX3NldF9yZWFkX2FoZWFkKFNTTCAqcywgaW50IHllcyk7CitpbnQJU1NMX2dldF92ZXJpZnlfbW9kZShjb25zdCBTU0wgKnMpOworaW50CVNTTF9nZXRfdmVyaWZ5X2RlcHRoKGNvbnN0IFNTTCAqcyk7CitpbnQJKCpTU0xfZ2V0X3ZlcmlmeV9jYWxsYmFjayhjb25zdCBTU0wgKnMpKShpbnQsWDUwOV9TVE9SRV9DVFggKik7Cit2b2lkCVNTTF9zZXRfdmVyaWZ5KFNTTCAqcywgaW50IG1vZGUsCisJCSAgICAgICBpbnQgKCpjYWxsYmFjaykoaW50IG9rLFg1MDlfU1RPUkVfQ1RYICpjdHgpKTsKK3ZvaWQJU1NMX3NldF92ZXJpZnlfZGVwdGgoU1NMICpzLCBpbnQgZGVwdGgpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQoraW50CVNTTF91c2VfUlNBUHJpdmF0ZUtleShTU0wgKnNzbCwgUlNBICpyc2EpOworI2VuZGlmCitpbnQJU1NMX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEoU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKmQsIGxvbmcgbGVuKTsKK2ludAlTU0xfdXNlX1ByaXZhdGVLZXkoU1NMICpzc2wsIEVWUF9QS0VZICpwa2V5KTsKK2ludAlTU0xfdXNlX1ByaXZhdGVLZXlfQVNOMShpbnQgcGssU1NMICpzc2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGxvbmcgbGVuKTsKK2ludAlTU0xfdXNlX2NlcnRpZmljYXRlKFNTTCAqc3NsLCBYNTA5ICp4KTsKK2ludAlTU0xfdXNlX2NlcnRpZmljYXRlX0FTTjEoU1NMICpzc2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pOworaW50CVNTTF91c2VfY2VydGlmaWNhdGVfY2hhaW4oU1NMICpzc2wsIFNUQUNLX09GKFg1MDkpICpjZXJ0X2NoYWluKTsKK1NUQUNLX09GKFg1MDkpICogU1NMX2dldF9jZXJ0aWZpY2F0ZV9jaGFpbihTU0wgKnNzbCwgWDUwOSAqeCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworaW50CVNTTF91c2VfUlNBUHJpdmF0ZUtleV9maWxlKFNTTCAqc3NsLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSk7CitpbnQJU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKK2ludAlTU0xfdXNlX2NlcnRpZmljYXRlX2ZpbGUoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKK2ludAlTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSk7CitpbnQJU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworaW50CVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSk7CitpbnQJU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUpOyAvKiBQRU0gdHlwZSAqLworU1RBQ0tfT0YoWDUwOV9OQU1FKSAqU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUoY29uc3QgY2hhciAqZmlsZSk7CitpbnQJU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soU1RBQ0tfT0YoWDUwOV9OQU1FKSAqc3RhY2tDQXMsCisJCQkJCSAgICBjb25zdCBjaGFyICpmaWxlKTsKKyNpZm5kZWYgT1BFTlNTTF9TWVNfVk1TCisjaWZuZGVmIE9QRU5TU0xfU1lTX01BQ0lOVE9TSF9DTEFTU0lDIC8qIFhYWFhYOiBCZXR0ZXIgc2NoZW1lIG5lZWRlZCEgW3dhczogI2lmbmRlZiBNQUNfT1NfcHJlX1hdICovCitpbnQJU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjayhTVEFDS19PRihYNTA5X05BTUUpICpzdGFja0NBcywKKwkJCQkJICAgY29uc3QgY2hhciAqZGlyKTsKKyNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgorCit2b2lkCVNTTF9sb2FkX2Vycm9yX3N0cmluZ3Modm9pZCApOworY29uc3QgY2hhciAqU1NMX3N0YXRlX3N0cmluZyhjb25zdCBTU0wgKnMpOworY29uc3QgY2hhciAqU1NMX3JzdGF0ZV9zdHJpbmcoY29uc3QgU1NMICpzKTsKK2NvbnN0IGNoYXIgKlNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhjb25zdCBTU0wgKnMpOworY29uc3QgY2hhciAqU1NMX3JzdGF0ZV9zdHJpbmdfbG9uZyhjb25zdCBTU0wgKnMpOworbG9uZwlTU0xfU0VTU0lPTl9nZXRfdGltZShjb25zdCBTU0xfU0VTU0lPTiAqcyk7Citsb25nCVNTTF9TRVNTSU9OX3NldF90aW1lKFNTTF9TRVNTSU9OICpzLCBsb25nIHQpOworbG9uZwlTU0xfU0VTU0lPTl9nZXRfdGltZW91dChjb25zdCBTU0xfU0VTU0lPTiAqcyk7Citsb25nCVNTTF9TRVNTSU9OX3NldF90aW1lb3V0KFNTTF9TRVNTSU9OICpzLCBsb25nIHQpOwordm9pZAlTU0xfY29weV9zZXNzaW9uX2lkKFNTTCAqdG8sY29uc3QgU1NMICpmcm9tKTsKKworU1NMX1NFU1NJT04gKlNTTF9TRVNTSU9OX25ldyh2b2lkKTsKK2NvbnN0IHVuc2lnbmVkIGNoYXIgKlNTTF9TRVNTSU9OX2dldF9pZChjb25zdCBTU0xfU0VTU0lPTiAqcywKKwkJCQkJdW5zaWduZWQgaW50ICpsZW4pOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50CVNTTF9TRVNTSU9OX3ByaW50X2ZwKEZJTEUgKmZwLGNvbnN0IFNTTF9TRVNTSU9OICpzZXMpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCitpbnQJU1NMX1NFU1NJT05fcHJpbnQoQklPICpmcCxjb25zdCBTU0xfU0VTU0lPTiAqc2VzKTsKKyNlbmRpZgordm9pZAlTU0xfU0VTU0lPTl9mcmVlKFNTTF9TRVNTSU9OICpzZXMpOworaW50CWkyZF9TU0xfU0VTU0lPTihTU0xfU0VTU0lPTiAqaW4sdW5zaWduZWQgY2hhciAqKnBwKTsKK2ludAlTU0xfc2V0X3Nlc3Npb24oU1NMICp0bywgU1NMX1NFU1NJT04gKnNlc3Npb24pOwordm9pZAlTU0xfc2V0X3Nlc3Npb25fY3JlYXRpb25fZW5hYmxlZChTU0wgKiwgaW50KTsKK2ludAlTU0xfQ1RYX2FkZF9zZXNzaW9uKFNTTF9DVFggKnMsIFNTTF9TRVNTSU9OICpjKTsKK2ludAlTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uKFNTTF9DVFggKixTU0xfU0VTU0lPTiAqYyk7CitpbnQJU1NMX0NUWF9zZXRfZ2VuZXJhdGVfc2Vzc2lvbl9pZChTU0xfQ1RYICosIEdFTl9TRVNTSU9OX0NCKTsKK2ludAlTU0xfc2V0X2dlbmVyYXRlX3Nlc3Npb25faWQoU1NMICosIEdFTl9TRVNTSU9OX0NCKTsKK2ludAlTU0xfaGFzX21hdGNoaW5nX3Nlc3Npb25faWQoY29uc3QgU1NMICpzc2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlkLAorCQkJCQl1bnNpZ25lZCBpbnQgaWRfbGVuKTsKK1NTTF9TRVNTSU9OICpkMmlfU1NMX1NFU1NJT04oU1NMX1NFU1NJT04gKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCSAgICAgbG9uZyBsZW5ndGgpOworCisjaWZkZWYgSEVBREVSX1g1MDlfSAorWDUwOSAqCVNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShjb25zdCBTU0wgKnMpOworI2VuZGlmCisKK1NUQUNLX09GKFg1MDkpICpTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbihjb25zdCBTU0wgKnMpOworCitpbnQgU1NMX0NUWF9nZXRfdmVyaWZ5X21vZGUoY29uc3QgU1NMX0NUWCAqY3R4KTsKK2ludCBTU0xfQ1RYX2dldF92ZXJpZnlfZGVwdGgoY29uc3QgU1NMX0NUWCAqY3R4KTsKK2ludCAoKlNTTF9DVFhfZ2V0X3ZlcmlmeV9jYWxsYmFjayhjb25zdCBTU0xfQ1RYICpjdHgpKShpbnQsWDUwOV9TVE9SRV9DVFggKik7Cit2b2lkIFNTTF9DVFhfc2V0X3ZlcmlmeShTU0xfQ1RYICpjdHgsaW50IG1vZGUsCisJCQlpbnQgKCpjYWxsYmFjaykoaW50LCBYNTA5X1NUT1JFX0NUWCAqKSk7Cit2b2lkIFNTTF9DVFhfc2V0X3ZlcmlmeV9kZXB0aChTU0xfQ1RYICpjdHgsaW50IGRlcHRoKTsKK3ZvaWQgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2soU1NMX0NUWCAqY3R4LCBpbnQgKCpjYikoWDUwOV9TVE9SRV9DVFggKix2b2lkICopLCB2b2lkICphcmcpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQoraW50IFNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXkoU1NMX0NUWCAqY3R4LCBSU0EgKnJzYSk7CisjZW5kaWYKK2ludCBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X0FTTjEoU1NMX0NUWCAqY3R4LCBjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBsb25nIGxlbik7CitpbnQgU1NMX0NUWF91c2VfUHJpdmF0ZUtleShTU0xfQ1RYICpjdHgsIEVWUF9QS0VZICpwa2V5KTsKK2ludCBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X0FTTjEoaW50IHBrLFNTTF9DVFggKmN0eCwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkLCBsb25nIGxlbik7CitpbnQgU1NMX0NUWF91c2VfY2VydGlmaWNhdGUoU1NMX0NUWCAqY3R4LCBYNTA5ICp4KTsKK2ludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9BU04xKFNTTF9DVFggKmN0eCwgaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZCk7CisKK3ZvaWQgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoU1NMX0NUWCAqY3R4LCBwZW1fcGFzc3dvcmRfY2IgKmNiKTsKK3ZvaWQgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEoU1NMX0NUWCAqY3R4LCB2b2lkICp1KTsKKworaW50IFNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkoY29uc3QgU1NMX0NUWCAqY3R4KTsKK2ludCBTU0xfY2hlY2tfcHJpdmF0ZV9rZXkoY29uc3QgU1NMICpjdHgpOworCitpbnQJU1NMX0NUWF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KFNTTF9DVFggKmN0eCxjb25zdCB1bnNpZ25lZCBjaGFyICpzaWRfY3R4LAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2lkX2N0eF9sZW4pOworCitTU0wgKglTU0xfbmV3KFNTTF9DVFggKmN0eCk7CitpbnQJU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoU1NMICpzc2wsY29uc3QgdW5zaWduZWQgY2hhciAqc2lkX2N0eCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgc2lkX2N0eF9sZW4pOworCitpbnQgU1NMX0NUWF9zZXRfcHVycG9zZShTU0xfQ1RYICpzLCBpbnQgcHVycG9zZSk7CitpbnQgU1NMX3NldF9wdXJwb3NlKFNTTCAqcywgaW50IHB1cnBvc2UpOworaW50IFNTTF9DVFhfc2V0X3RydXN0KFNTTF9DVFggKnMsIGludCB0cnVzdCk7CitpbnQgU1NMX3NldF90cnVzdChTU0wgKnMsIGludCB0cnVzdCk7CisKK2ludCBTU0xfQ1RYX3NldDFfcGFyYW0oU1NMX0NUWCAqY3R4LCBYNTA5X1ZFUklGWV9QQVJBTSAqdnBtKTsKK2ludCBTU0xfc2V0MV9wYXJhbShTU0wgKnNzbCwgWDUwOV9WRVJJRllfUEFSQU0gKnZwbSk7CisKK3ZvaWQJU1NMX2ZyZWUoU1NMICpzc2wpOworaW50IAlTU0xfYWNjZXB0KFNTTCAqc3NsKTsKK2ludCAJU1NMX2Nvbm5lY3QoU1NMICpzc2wpOworaW50IAlTU0xfcmVhZChTU0wgKnNzbCx2b2lkICpidWYsaW50IG51bSk7CitpbnQgCVNTTF9wZWVrKFNTTCAqc3NsLHZvaWQgKmJ1ZixpbnQgbnVtKTsKK2ludCAJU1NMX3dyaXRlKFNTTCAqc3NsLGNvbnN0IHZvaWQgKmJ1ZixpbnQgbnVtKTsKK2xvbmcJU1NMX2N0cmwoU1NMICpzc2wsaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKK2xvbmcJU1NMX2NhbGxiYWNrX2N0cmwoU1NMICosIGludCwgdm9pZCAoKikodm9pZCkpOworbG9uZwlTU0xfQ1RYX2N0cmwoU1NMX0NUWCAqY3R4LGludCBjbWQsIGxvbmcgbGFyZywgdm9pZCAqcGFyZyk7Citsb25nCVNTTF9DVFhfY2FsbGJhY2tfY3RybChTU0xfQ1RYICosIGludCwgdm9pZCAoKikodm9pZCkpOworCitpbnQJU1NMX2dldF9lcnJvcihjb25zdCBTU0wgKnMsaW50IHJldF9jb2RlKTsKK2NvbnN0IGNoYXIgKlNTTF9nZXRfdmVyc2lvbihjb25zdCBTU0wgKnMpOworCisvKiBUaGlzIHNldHMgdGhlICdkZWZhdWx0JyBTU0wgdmVyc2lvbiB0aGF0IFNTTF9uZXcoKSB3aWxsIGNyZWF0ZSAqLworaW50IFNTTF9DVFhfc2V0X3NzbF92ZXJzaW9uKFNTTF9DVFggKmN0eCwgY29uc3QgU1NMX01FVEhPRCAqbWV0aCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCitjb25zdCBTU0xfTUVUSE9EICpTU0x2Ml9tZXRob2Qodm9pZCk7CQkvKiBTU0x2MiAqLworY29uc3QgU1NMX01FVEhPRCAqU1NMdjJfc2VydmVyX21ldGhvZCh2b2lkKTsJLyogU1NMdjIgKi8KK2NvbnN0IFNTTF9NRVRIT0QgKlNTTHYyX2NsaWVudF9tZXRob2Qodm9pZCk7CS8qIFNTTHYyICovCisjZW5kaWYKKworY29uc3QgU1NMX01FVEhPRCAqU1NMdjNfbWV0aG9kKHZvaWQpOwkJLyogU1NMdjMgKi8KK2NvbnN0IFNTTF9NRVRIT0QgKlNTTHYzX3NlcnZlcl9tZXRob2Qodm9pZCk7CS8qIFNTTHYzICovCitjb25zdCBTU0xfTUVUSE9EICpTU0x2M19jbGllbnRfbWV0aG9kKHZvaWQpOwkvKiBTU0x2MyAqLworCitjb25zdCBTU0xfTUVUSE9EICpTU0x2MjNfbWV0aG9kKHZvaWQpOwkvKiBTU0x2MyBidXQgY2FuIHJvbGxiYWNrIHRvIHYyICovCitjb25zdCBTU0xfTUVUSE9EICpTU0x2MjNfc2VydmVyX21ldGhvZCh2b2lkKTsJLyogU1NMdjMgYnV0IGNhbiByb2xsYmFjayB0byB2MiAqLworY29uc3QgU1NMX01FVEhPRCAqU1NMdjIzX2NsaWVudF9tZXRob2Qodm9pZCk7CS8qIFNTTHYzIGJ1dCBjYW4gcm9sbGJhY2sgdG8gdjIgKi8KKworY29uc3QgU1NMX01FVEhPRCAqVExTdjFfbWV0aG9kKHZvaWQpOwkJLyogVExTdjEuMCAqLworY29uc3QgU1NMX01FVEhPRCAqVExTdjFfc2VydmVyX21ldGhvZCh2b2lkKTsJLyogVExTdjEuMCAqLworY29uc3QgU1NMX01FVEhPRCAqVExTdjFfY2xpZW50X21ldGhvZCh2b2lkKTsJLyogVExTdjEuMCAqLworCitjb25zdCBTU0xfTUVUSE9EICpEVExTdjFfbWV0aG9kKHZvaWQpOwkJLyogRFRMU3YxLjAgKi8KK2NvbnN0IFNTTF9NRVRIT0QgKkRUTFN2MV9zZXJ2ZXJfbWV0aG9kKHZvaWQpOwkvKiBEVExTdjEuMCAqLworY29uc3QgU1NMX01FVEhPRCAqRFRMU3YxX2NsaWVudF9tZXRob2Qodm9pZCk7CS8qIERUTFN2MS4wICovCisKK1NUQUNLX09GKFNTTF9DSVBIRVIpICpTU0xfZ2V0X2NpcGhlcnMoY29uc3QgU1NMICpzKTsKKworaW50IFNTTF9kb19oYW5kc2hha2UoU1NMICpzKTsKK2ludCBTU0xfcmVuZWdvdGlhdGUoU1NMICpzKTsKK2ludCBTU0xfcmVuZWdvdGlhdGVfcGVuZGluZyhTU0wgKnMpOworaW50IFNTTF9zaHV0ZG93bihTU0wgKnMpOworCitjb25zdCBTU0xfTUVUSE9EICpTU0xfZ2V0X3NzbF9tZXRob2QoU1NMICpzKTsKK2ludCBTU0xfc2V0X3NzbF9tZXRob2QoU1NMICpzLCBjb25zdCBTU0xfTUVUSE9EICptZXRob2QpOworY29uc3QgY2hhciAqU1NMX2FsZXJ0X3R5cGVfc3RyaW5nX2xvbmcoaW50IHZhbHVlKTsKK2NvbnN0IGNoYXIgKlNTTF9hbGVydF90eXBlX3N0cmluZyhpbnQgdmFsdWUpOworY29uc3QgY2hhciAqU1NMX2FsZXJ0X2Rlc2Nfc3RyaW5nX2xvbmcoaW50IHZhbHVlKTsKK2NvbnN0IGNoYXIgKlNTTF9hbGVydF9kZXNjX3N0cmluZyhpbnQgdmFsdWUpOworCit2b2lkIFNTTF9zZXRfY2xpZW50X0NBX2xpc3QoU1NMICpzLCBTVEFDS19PRihYNTA5X05BTUUpICpuYW1lX2xpc3QpOwordm9pZCBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChTU0xfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDlfTkFNRSkgKm5hbWVfbGlzdCk7CitTVEFDS19PRihYNTA5X05BTUUpICpTU0xfZ2V0X2NsaWVudF9DQV9saXN0KGNvbnN0IFNTTCAqcyk7CitTVEFDS19PRihYNTA5X05BTUUpICpTU0xfQ1RYX2dldF9jbGllbnRfQ0FfbGlzdChjb25zdCBTU0xfQ1RYICpzKTsKK2ludCBTU0xfYWRkX2NsaWVudF9DQShTU0wgKnNzbCxYNTA5ICp4KTsKK2ludCBTU0xfQ1RYX2FkZF9jbGllbnRfQ0EoU1NMX0NUWCAqY3R4LFg1MDkgKngpOworCit2b2lkIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShTU0wgKnMpOwordm9pZCBTU0xfc2V0X2FjY2VwdF9zdGF0ZShTU0wgKnMpOworCitsb25nIFNTTF9nZXRfZGVmYXVsdF90aW1lb3V0KGNvbnN0IFNTTCAqcyk7CisKK2ludCBTU0xfbGlicmFyeV9pbml0KHZvaWQgKTsKKworY2hhciAqU1NMX0NJUEhFUl9kZXNjcmlwdGlvbihjb25zdCBTU0xfQ0lQSEVSICosY2hhciAqYnVmLGludCBzaXplKTsKK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9kdXBfQ0FfbGlzdChTVEFDS19PRihYNTA5X05BTUUpICpzayk7CisKK1NTTCAqU1NMX2R1cChTU0wgKnNzbCk7CisKK1g1MDkgKlNTTF9nZXRfY2VydGlmaWNhdGUoY29uc3QgU1NMICpzc2wpOworLyogRVZQX1BLRVkgKi8gc3RydWN0IGV2cF9wa2V5X3N0ICpTU0xfZ2V0X3ByaXZhdGVrZXkoU1NMICpzc2wpOworCit2b2lkIFNTTF9DVFhfc2V0X3F1aWV0X3NodXRkb3duKFNTTF9DVFggKmN0eCxpbnQgbW9kZSk7CitpbnQgU1NMX0NUWF9nZXRfcXVpZXRfc2h1dGRvd24oY29uc3QgU1NMX0NUWCAqY3R4KTsKK3ZvaWQgU1NMX3NldF9xdWlldF9zaHV0ZG93bihTU0wgKnNzbCxpbnQgbW9kZSk7CitpbnQgU1NMX2dldF9xdWlldF9zaHV0ZG93bihjb25zdCBTU0wgKnNzbCk7Cit2b2lkIFNTTF9zZXRfc2h1dGRvd24oU1NMICpzc2wsaW50IG1vZGUpOworaW50IFNTTF9nZXRfc2h1dGRvd24oY29uc3QgU1NMICpzc2wpOworaW50IFNTTF92ZXJzaW9uKGNvbnN0IFNTTCAqc3NsKTsKK2ludCBTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhTU0xfQ1RYICpjdHgpOworaW50IFNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqQ0FmaWxlLAorCWNvbnN0IGNoYXIgKkNBcGF0aCk7CisjZGVmaW5lIFNTTF9nZXQwX3Nlc3Npb24gU1NMX2dldF9zZXNzaW9uIC8qIGp1c3QgcGVlayBhdCBwb2ludGVyICovCitTU0xfU0VTU0lPTiAqU1NMX2dldF9zZXNzaW9uKGNvbnN0IFNTTCAqc3NsKTsKK1NTTF9TRVNTSU9OICpTU0xfZ2V0MV9zZXNzaW9uKFNTTCAqc3NsKTsgLyogb2J0YWluIGEgcmVmZXJlbmNlIGNvdW50ICovCitTU0xfQ1RYICpTU0xfZ2V0X1NTTF9DVFgoY29uc3QgU1NMICpzc2wpOworU1NMX0NUWCAqU1NMX3NldF9TU0xfQ1RYKFNTTCAqc3NsLCBTU0xfQ1RYKiBjdHgpOwordm9pZCBTU0xfc2V0X2luZm9fY2FsbGJhY2soU1NMICpzc2wsCisJCQkgICB2b2lkICgqY2IpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpKTsKK3ZvaWQgKCpTU0xfZ2V0X2luZm9fY2FsbGJhY2soY29uc3QgU1NMICpzc2wpKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKTsKK2ludCBTU0xfc3RhdGUoY29uc3QgU1NMICpzc2wpOworCit2b2lkIFNTTF9zZXRfdmVyaWZ5X3Jlc3VsdChTU0wgKnNzbCxsb25nIHYpOworbG9uZyBTU0xfZ2V0X3ZlcmlmeV9yZXN1bHQoY29uc3QgU1NMICpzc2wpOworCitpbnQgU1NMX3NldF9leF9kYXRhKFNTTCAqc3NsLGludCBpZHgsdm9pZCAqZGF0YSk7Cit2b2lkICpTU0xfZ2V0X2V4X2RhdGEoY29uc3QgU1NMICpzc2wsaW50IGlkeCk7CitpbnQgU1NMX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwlDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CisKK2ludCBTU0xfU0VTU0lPTl9zZXRfZXhfZGF0YShTU0xfU0VTU0lPTiAqc3MsaW50IGlkeCx2b2lkICpkYXRhKTsKK3ZvaWQgKlNTTF9TRVNTSU9OX2dldF9leF9kYXRhKGNvbnN0IFNTTF9TRVNTSU9OICpzcyxpbnQgaWR4KTsKK2ludCBTU0xfU0VTU0lPTl9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworCitpbnQgU1NMX0NUWF9zZXRfZXhfZGF0YShTU0xfQ1RYICpzc2wsaW50IGlkeCx2b2lkICpkYXRhKTsKK3ZvaWQgKlNTTF9DVFhfZ2V0X2V4X2RhdGEoY29uc3QgU1NMX0NUWCAqc3NsLGludCBpZHgpOworaW50IFNTTF9DVFhfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCUNSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKKworaW50IFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHgodm9pZCApOworCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19zZXRfY2FjaGVfc2l6ZShjdHgsdCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VUX1NFU1NfQ0FDSEVfU0laRSx0LE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19nZXRfY2FjaGVfc2l6ZShjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX0dFVF9TRVNTX0NBQ0hFX1NJWkUsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUoY3R4LG0pIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9TRVNTX0NBQ0hFX01PREUsbSxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX2dldF9zZXNzaW9uX2NhY2hlX21vZGUoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9HRVRfU0VTU19DQUNIRV9NT0RFLDAsTlVMTCkKKworI2RlZmluZSBTU0xfQ1RYX2dldF9kZWZhdWx0X3JlYWRfYWhlYWQoY3R4KSBTU0xfQ1RYX2dldF9yZWFkX2FoZWFkKGN0eCkKKyNkZWZpbmUgU1NMX0NUWF9zZXRfZGVmYXVsdF9yZWFkX2FoZWFkKGN0eCxtKSBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkKGN0eCxtKQorI2RlZmluZSBTU0xfQ1RYX2dldF9yZWFkX2FoZWFkKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfR0VUX1JFQURfQUhFQUQsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkKGN0eCxtKSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfUkVBRF9BSEVBRCxtLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfZ2V0X21heF9jZXJ0X2xpc3QoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9HRVRfTUFYX0NFUlRfTElTVCwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2V0X21heF9jZXJ0X2xpc3QoY3R4LG0pIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9NQVhfQ0VSVF9MSVNULG0sTlVMTCkKKyNkZWZpbmUgU1NMX2dldF9tYXhfY2VydF9saXN0KHNzbCkgXAorCVNTTF9jdHJsKHNzbCxTU0xfQ1RSTF9HRVRfTUFYX0NFUlRfTElTVCwwLE5VTEwpCisjZGVmaW5lIFNTTF9zZXRfbWF4X2NlcnRfbGlzdChzc2wsbSkgXAorCVNTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfTUFYX0NFUlRfTElTVCxtLE5VTEwpCisKKyNkZWZpbmUgU1NMX0NUWF9zZXRfbWF4X3NlbmRfZnJhZ21lbnQoY3R4LG0pIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9NQVhfU0VORF9GUkFHTUVOVCxtLE5VTEwpCisjZGVmaW5lIFNTTF9zZXRfbWF4X3NlbmRfZnJhZ21lbnQoc3NsLG0pIFwKKwlTU0xfY3RybChzc2wsU1NMX0NUUkxfU0VUX01BWF9TRU5EX0ZSQUdNRU5ULG0sTlVMTCkKKworICAgICAvKiBOQjogdGhlIGtleWxlbmd0aCBpcyBvbmx5IGFwcGxpY2FibGUgd2hlbiBpc19leHBvcnQgaXMgdHJ1ZSAqLworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQordm9pZCBTU0xfQ1RYX3NldF90bXBfcnNhX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwKKwkJCQkgIFJTQSAqKCpjYikoU1NMICpzc2wsaW50IGlzX2V4cG9ydCwKKwkJCQkJICAgICBpbnQga2V5bGVuZ3RoKSk7CisKK3ZvaWQgU1NMX3NldF90bXBfcnNhX2NhbGxiYWNrKFNTTCAqc3NsLAorCQkJCSAgUlNBICooKmNiKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorCQkJCQkgICAgIGludCBrZXlsZW5ndGgpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICit2b2lkIFNTTF9DVFhfc2V0X3RtcF9kaF9jYWxsYmFjayhTU0xfQ1RYICpjdHgsCisJCQkJIERIICooKmRoKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorCQkJCQkgICBpbnQga2V5bGVuZ3RoKSk7Cit2b2lkIFNTTF9zZXRfdG1wX2RoX2NhbGxiYWNrKFNTTCAqc3NsLAorCQkJCSBESCAqKCpkaCkoU1NMICpzc2wsaW50IGlzX2V4cG9ydCwKKwkJCQkJICAgaW50IGtleWxlbmd0aCkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAordm9pZCBTU0xfQ1RYX3NldF90bXBfZWNkaF9jYWxsYmFjayhTU0xfQ1RYICpjdHgsCisJCQkJIEVDX0tFWSAqKCplY2RoKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorCQkJCQkgICBpbnQga2V5bGVuZ3RoKSk7Cit2b2lkIFNTTF9zZXRfdG1wX2VjZGhfY2FsbGJhY2soU1NMICpzc2wsCisJCQkJIEVDX0tFWSAqKCplY2RoKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorCQkJCQkgICBpbnQga2V5bGVuZ3RoKSk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKK2NvbnN0IENPTVBfTUVUSE9EICpTU0xfZ2V0X2N1cnJlbnRfY29tcHJlc3Npb24oU1NMICpzKTsKK2NvbnN0IENPTVBfTUVUSE9EICpTU0xfZ2V0X2N1cnJlbnRfZXhwYW5zaW9uKFNTTCAqcyk7Citjb25zdCBjaGFyICpTU0xfQ09NUF9nZXRfbmFtZShjb25zdCBDT01QX01FVEhPRCAqY29tcCk7CitTVEFDS19PRihTU0xfQ09NUCkgKlNTTF9DT01QX2dldF9jb21wcmVzc2lvbl9tZXRob2RzKHZvaWQpOworaW50IFNTTF9DT01QX2FkZF9jb21wcmVzc2lvbl9tZXRob2QoaW50IGlkLENPTVBfTUVUSE9EICpjbSk7CisjZWxzZQorY29uc3Qgdm9pZCAqU1NMX2dldF9jdXJyZW50X2NvbXByZXNzaW9uKFNTTCAqcyk7Citjb25zdCB2b2lkICpTU0xfZ2V0X2N1cnJlbnRfZXhwYW5zaW9uKFNTTCAqcyk7Citjb25zdCBjaGFyICpTU0xfQ09NUF9nZXRfbmFtZShjb25zdCB2b2lkICpjb21wKTsKK3ZvaWQgKlNTTF9DT01QX2dldF9jb21wcmVzc2lvbl9tZXRob2RzKHZvaWQpOworaW50IFNTTF9DT01QX2FkZF9jb21wcmVzc2lvbl9tZXRob2QoaW50IGlkLHZvaWQgKmNtKTsKKyNlbmRpZgorCisvKiBUTFMgZXh0ZW5zaW9ucyBmdW5jdGlvbnMgKi8KK2ludCBTU0xfc2V0X3Nlc3Npb25fdGlja2V0X2V4dChTU0wgKnMsIHZvaWQgKmV4dF9kYXRhLCBpbnQgZXh0X2xlbik7CisKK2ludCBTU0xfc2V0X3Nlc3Npb25fdGlja2V0X2V4dF9jYihTU0wgKnMsIHRsc19zZXNzaW9uX3RpY2tldF9leHRfY2JfZm4gY2IsCisJCQkJICB2b2lkICphcmcpOworCisvKiBQcmUtc2hhcmVkIHNlY3JldCBzZXNzaW9uIHJlc3VtcHRpb24gZnVuY3Rpb25zICovCitpbnQgU1NMX3NldF9zZXNzaW9uX3NlY3JldF9jYihTU0wgKnMsIHRsc19zZXNzaW9uX3NlY3JldF9jYl9mbiB0bHNfc2Vzc2lvbl9zZWNyZXRfY2IsIHZvaWQgKmFyZyk7CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfU1NMX3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgU1NMIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFNTTF9GX0NMSUVOVF9DRVJUSUZJQ0FURQkJCSAxMDAKKyNkZWZpbmUgU1NMX0ZfQ0xJRU5UX0ZJTklTSEVECQkJCSAxNjcKKyNkZWZpbmUgU1NMX0ZfQ0xJRU5UX0hFTExPCQkJCSAxMDEKKyNkZWZpbmUgU1NMX0ZfQ0xJRU5UX01BU1RFUl9LRVkJCQkJIDEwMgorI2RlZmluZSBTU0xfRl9EMklfU1NMX1NFU1NJT04JCQkJIDEwMworI2RlZmluZSBTU0xfRl9ET19EVExTMV9XUklURQkJCQkgMjQ1CisjZGVmaW5lIFNTTF9GX0RPX1NTTDNfV1JJVEUJCQkJIDEwNAorI2RlZmluZSBTU0xfRl9EVExTMV9BQ0NFUFQJCQkJIDI0NgorI2RlZmluZSBTU0xfRl9EVExTMV9BRERfQ0VSVF9UT19CVUYJCQkgMjk1CisjZGVmaW5lIFNTTF9GX0RUTFMxX0JVRkZFUl9SRUNPUkQJCQkgMjQ3CisjZGVmaW5lIFNTTF9GX0RUTFMxX0NMSUVOVF9IRUxMTwkJCSAyNDgKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfQ09OTkVDVAkJCQkgMjQ5CisjZGVmaW5lIFNTTF9GX0RUTFMxX0VOQwkJCQkJIDI1MAorI2RlZmluZSBTU0xfRl9EVExTMV9HRVRfSEVMTE9fVkVSSUZZCQkJIDI1MQorI2RlZmluZSBTU0xfRl9EVExTMV9HRVRfTUVTU0FHRQkJCQkgMjUyCisjZGVmaW5lIFNTTF9GX0RUTFMxX0dFVF9NRVNTQUdFX0ZSQUdNRU5UCQkgMjUzCisjZGVmaW5lIFNTTF9GX0RUTFMxX0dFVF9SRUNPUkQJCQkJIDI1NAorI2RlZmluZSBTU0xfRl9EVExTMV9IQU5ETEVfVElNRU9VVAkJCSAyOTcKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfT1VUUFVUX0NFUlRfQ0hBSU4JCQkgMjU1CisjZGVmaW5lIFNTTF9GX0RUTFMxX1BSRVBST0NFU1NfRlJBR01FTlQJCQkgMjg4CisjZGVmaW5lIFNTTF9GX0RUTFMxX1BST0NFU1NfT1VUX09GX1NFUV9NRVNTQUdFCQkgMjU2CisjZGVmaW5lIFNTTF9GX0RUTFMxX1BST0NFU1NfUkVDT1JECQkJIDI1NworI2RlZmluZSBTU0xfRl9EVExTMV9SRUFEX0JZVEVTCQkJCSAyNTgKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfUkVBRF9GQUlMRUQJCQkJIDI1OQorI2RlZmluZSBTU0xfRl9EVExTMV9TRU5EX0NFUlRJRklDQVRFX1JFUVVFU1QJCSAyNjAKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfQ0VSVElGSUNBVEUJCSAyNjEKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFCQkgMjYyCisjZGVmaW5lIFNTTF9GX0RUTFMxX1NFTkRfQ0xJRU5UX1ZFUklGWQkJCSAyNjMKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfU0VORF9IRUxMT19WRVJJRllfUkVRVUVTVAkJIDI2NAorI2RlZmluZSBTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9DRVJUSUZJQ0FURQkJIDI2NQorI2RlZmluZSBTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9IRUxMTwkJCSAyNjYKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFCQkgMjY3CisjZGVmaW5lIFNTTF9GX0RUTFMxX1dSSVRFX0FQUF9EQVRBX0JZVEVTCQkgMjY4CisjZGVmaW5lIFNTTF9GX0dFVF9DTElFTlRfRklOSVNIRUQJCQkgMTA1CisjZGVmaW5lIFNTTF9GX0dFVF9DTElFTlRfSEVMTE8JCQkJIDEwNgorI2RlZmluZSBTU0xfRl9HRVRfQ0xJRU5UX01BU1RFUl9LRVkJCQkgMTA3CisjZGVmaW5lIFNTTF9GX0dFVF9TRVJWRVJfRklOSVNIRUQJCQkgMTA4CisjZGVmaW5lIFNTTF9GX0dFVF9TRVJWRVJfSEVMTE8JCQkJIDEwOQorI2RlZmluZSBTU0xfRl9HRVRfU0VSVkVSX1ZFUklGWQkJCQkgMTEwCisjZGVmaW5lIFNTTF9GX0kyRF9TU0xfU0VTU0lPTgkJCQkgMTExCisjZGVmaW5lIFNTTF9GX1JFQURfTgkJCQkJIDExMgorI2RlZmluZSBTU0xfRl9SRVFVRVNUX0NFUlRJRklDQVRFCQkJIDExMworI2RlZmluZSBTU0xfRl9TRVJWRVJfRklOSVNICQkJCSAyMzkKKyNkZWZpbmUgU1NMX0ZfU0VSVkVSX0hFTExPCQkJCSAxMTQKKyNkZWZpbmUgU1NMX0ZfU0VSVkVSX1ZFUklGWQkJCQkgMjQwCisjZGVmaW5lIFNTTF9GX1NTTDIzX0FDQ0VQVAkJCQkgMTE1CisjZGVmaW5lIFNTTF9GX1NTTDIzX0NMSUVOVF9IRUxMTwkJCSAxMTYKKyNkZWZpbmUgU1NMX0ZfU1NMMjNfQ09OTkVDVAkJCQkgMTE3CisjZGVmaW5lIFNTTF9GX1NTTDIzX0dFVF9DTElFTlRfSEVMTE8JCQkgMTE4CisjZGVmaW5lIFNTTF9GX1NTTDIzX0dFVF9TRVJWRVJfSEVMTE8JCQkgMTE5CisjZGVmaW5lIFNTTF9GX1NTTDIzX1BFRUsJCQkJIDIzNworI2RlZmluZSBTU0xfRl9TU0wyM19SRUFECQkJCSAxMjAKKyNkZWZpbmUgU1NMX0ZfU1NMMjNfV1JJVEUJCQkJIDEyMQorI2RlZmluZSBTU0xfRl9TU0wyX0FDQ0VQVAkJCQkgMTIyCisjZGVmaW5lIFNTTF9GX1NTTDJfQ09OTkVDVAkJCQkgMTIzCisjZGVmaW5lIFNTTF9GX1NTTDJfRU5DX0lOSVQJCQkJIDEyNAorI2RlZmluZSBTU0xfRl9TU0wyX0dFTkVSQVRFX0tFWV9NQVRFUklBTAkJIDI0MQorI2RlZmluZSBTU0xfRl9TU0wyX1BFRUsJCQkJCSAyMzQKKyNkZWZpbmUgU1NMX0ZfU1NMMl9SRUFECQkJCQkgMTI1CisjZGVmaW5lIFNTTF9GX1NTTDJfUkVBRF9JTlRFUk5BTAkJCSAyMzYKKyNkZWZpbmUgU1NMX0ZfU1NMMl9TRVRfQ0VSVElGSUNBVEUJCQkgMTI2CisjZGVmaW5lIFNTTF9GX1NTTDJfV1JJVEUJCQkJIDEyNworI2RlZmluZSBTU0xfRl9TU0wzX0FDQ0VQVAkJCQkgMTI4CisjZGVmaW5lIFNTTF9GX1NTTDNfQUREX0NFUlRfVE9fQlVGCQkJIDI5NgorI2RlZmluZSBTU0xfRl9TU0wzX0NBTExCQUNLX0NUUkwJCQkgMjMzCisjZGVmaW5lIFNTTF9GX1NTTDNfQ0hBTkdFX0NJUEhFUl9TVEFURQkJCSAxMjkKKyNkZWZpbmUgU1NMX0ZfU1NMM19DSEVDS19DRVJUX0FORF9BTEdPUklUSE0JCSAxMzAKKyNkZWZpbmUgU1NMX0ZfU1NMM19DTElFTlRfSEVMTE8JCQkJIDEzMQorI2RlZmluZSBTU0xfRl9TU0wzX0NPTk5FQ1QJCQkJIDEzMgorI2RlZmluZSBTU0xfRl9TU0wzX0NUUkwJCQkJCSAyMTMKKyNkZWZpbmUgU1NMX0ZfU1NMM19DVFhfQ1RSTAkJCQkgMTMzCisjZGVmaW5lIFNTTF9GX1NTTDNfRElHRVNUX0NBQ0hFRF9SRUNPUkRTCQkgMjkzCisjZGVmaW5lIFNTTF9GX1NTTDNfRE9fQ0hBTkdFX0NJUEhFUl9TUEVDCQkgMjkyCisjZGVmaW5lIFNTTF9GX1NTTDNfRU5DCQkJCQkgMTM0CisjZGVmaW5lIFNTTF9GX1NTTDNfR0VORVJBVEVfS0VZX0JMT0NLCQkJIDIzOAorI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9DRVJUSUZJQ0FURV9SRVFVRVNUCQkgMTM1CisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX0NFUlRfU1RBVFVTCQkJIDI4OQorI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9DRVJUX1ZFUklGWQkJCSAxMzYKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0NFUlRJRklDQVRFCQkgMTM3CisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9IRUxMTwkJCSAxMzgKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRQkJIDEzOQorI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9GSU5JU0hFRAkJCQkgMTQwCisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRQkJCSAxNDEKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfTUVTU0FHRQkJCQkgMTQyCisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX05FV19TRVNTSU9OX1RJQ0tFVAkJIDI4MworI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9SRUNPUkQJCQkJIDE0MworI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9TRVJWRVJfQ0VSVElGSUNBVEUJCSAxNDQKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0RPTkUJCQkgMTQ1CisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9IRUxMTwkJCSAxNDYKKyNkZWZpbmUgU1NMX0ZfU1NMM19IQU5EU0hBS0VfTUFDCQkJIDI4NQorI2RlZmluZSBTU0xfRl9TU0wzX05FV19TRVNTSU9OX1RJQ0tFVAkJCSAyODcKKyNkZWZpbmUgU1NMX0ZfU1NMM19PVVRQVVRfQ0VSVF9DSEFJTgkJCSAxNDcKKyNkZWZpbmUgU1NMX0ZfU1NMM19QRUVLCQkJCQkgMjM1CisjZGVmaW5lIFNTTF9GX1NTTDNfUkVBRF9CWVRFUwkJCQkgMTQ4CisjZGVmaW5lIFNTTF9GX1NTTDNfUkVBRF9OCQkJCSAxNDkKKyNkZWZpbmUgU1NMX0ZfU1NMM19TRU5EX0NFUlRJRklDQVRFX1JFUVVFU1QJCSAxNTAKKyNkZWZpbmUgU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURQkJIDE1MQorI2RlZmluZSBTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRQkJIDE1MgorI2RlZmluZSBTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX1ZFUklGWQkJCSAxNTMKKyNkZWZpbmUgU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9DRVJUSUZJQ0FURQkJIDE1NAorI2RlZmluZSBTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0hFTExPCQkJIDI0MgorI2RlZmluZSBTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRQkJIDE1NQorI2RlZmluZSBTU0xfRl9TU0wzX1NFVFVQX0tFWV9CTE9DSwkJCSAxNTcKKyNkZWZpbmUgU1NMX0ZfU1NMM19TRVRVUF9SRUFEX0JVRkZFUgkJCSAxNTYKKyNkZWZpbmUgU1NMX0ZfU1NMM19TRVRVUF9XUklURV9CVUZGRVIJCQkgMjkxCisjZGVmaW5lIFNTTF9GX1NTTDNfV1JJVEVfQllURVMJCQkJIDE1OAorI2RlZmluZSBTU0xfRl9TU0wzX1dSSVRFX1BFTkRJTkcJCQkgMTU5CisjZGVmaW5lIFNTTF9GX1NTTF9BRERfQ0xJRU5USEVMTE9fUkVORUdPVElBVEVfRVhUCSAyOTgKKyNkZWZpbmUgU1NMX0ZfU1NMX0FERF9DTElFTlRIRUxMT19UTFNFWFQJCSAyNzcKKyNkZWZpbmUgU1NMX0ZfU1NMX0FERF9ESVJfQ0VSVF9TVUJKRUNUU19UT19TVEFDSwkgMjE1CisjZGVmaW5lIFNTTF9GX1NTTF9BRERfRklMRV9DRVJUX1NVQkpFQ1RTX1RPX1NUQUNLCSAyMTYKKyNkZWZpbmUgU1NMX0ZfU1NMX0FERF9TRVJWRVJIRUxMT19SRU5FR09USUFURV9FWFQJIDI5OQorI2RlZmluZSBTU0xfRl9TU0xfQUREX1NFUlZFUkhFTExPX1RMU0VYVAkJIDI3OAorI2RlZmluZSBTU0xfRl9TU0xfQkFEX01FVEhPRAkJCQkgMTYwCisjZGVmaW5lIFNTTF9GX1NTTF9CWVRFU19UT19DSVBIRVJfTElTVAkJCSAxNjEKKyNkZWZpbmUgU1NMX0ZfU1NMX0NFUlRfRFVQCQkJCSAyMjEKKyNkZWZpbmUgU1NMX0ZfU1NMX0NFUlRfSU5TVAkJCQkgMjIyCisjZGVmaW5lIFNTTF9GX1NTTF9DRVJUX0lOU1RBTlRJQVRFCQkJIDIxNAorI2RlZmluZSBTU0xfRl9TU0xfQ0VSVF9ORVcJCQkJIDE2MgorI2RlZmluZSBTU0xfRl9TU0xfQ0hFQ0tfUFJJVkFURV9LRVkJCQkgMTYzCisjZGVmaW5lIFNTTF9GX1NTTF9DSEVDS19TRVJWRVJIRUxMT19UTFNFWFQJCSAyODAKKyNkZWZpbmUgU1NMX0ZfU1NMX0NIRUNLX1NSVlJfRUNDX0NFUlRfQU5EX0FMRwkJIDI3OQorI2RlZmluZSBTU0xfRl9TU0xfQ0lQSEVSX1BST0NFU1NfUlVMRVNUUgkJIDIzMAorI2RlZmluZSBTU0xfRl9TU0xfQ0lQSEVSX1NUUkVOR1RIX1NPUlQJCQkgMjMxCisjZGVmaW5lIFNTTF9GX1NTTF9DTEVBUgkJCQkJIDE2NAorI2RlZmluZSBTU0xfRl9TU0xfQ09NUF9BRERfQ09NUFJFU1NJT05fTUVUSE9ECQkgMTY1CisjZGVmaW5lIFNTTF9GX1NTTF9DUkVBVEVfQ0lQSEVSX0xJU1QJCQkgMTY2CisjZGVmaW5lIFNTTF9GX1NTTF9DVFJMCQkJCQkgMjMyCisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfQ0hFQ0tfUFJJVkFURV9LRVkJCQkgMTY4CisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfTkVXCQkJCSAxNjkKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9TRVRfQ0lQSEVSX0xJU1QJCQkgMjY5CisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfU0VUX0NMSUVOVF9DRVJUX0VOR0lORQkJIDI5MAorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1NFVF9QVVJQT1NFCQkJIDIyNgorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1NFVF9TRVNTSU9OX0lEX0NPTlRFWFQJCSAyMTkKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9TRVRfU1NMX1ZFUlNJT04JCQkgMTcwCisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfU0VUX1RSVVNUCQkJCSAyMjkKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9VU0VfQ0VSVElGSUNBVEUJCQkgMTcxCisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfVVNFX0NFUlRJRklDQVRFX0FTTjEJCSAxNzIKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9VU0VfQ0VSVElGSUNBVEVfQ0hBSU5fRklMRQkgMjIwCisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfVVNFX0NFUlRJRklDQVRFX0ZJTEUJCSAxNzMKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9VU0VfUFJJVkFURUtFWQkJCSAxNzQKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9VU0VfUFJJVkFURUtFWV9BU04xCQkgMTc1CisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfVVNFX1BSSVZBVEVLRVlfRklMRQkJIDE3NgorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1VTRV9QU0tfSURFTlRJVFlfSElOVAkJIDI3MgorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1VTRV9SU0FQUklWQVRFS0VZCQkJIDE3NworI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1VTRV9SU0FQUklWQVRFS0VZX0FTTjEJCSAxNzgKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9VU0VfUlNBUFJJVkFURUtFWV9GSUxFCQkgMTc5CisjZGVmaW5lIFNTTF9GX1NTTF9ET19IQU5EU0hBS0UJCQkJIDE4MAorI2RlZmluZSBTU0xfRl9TU0xfR0VUX05FV19TRVNTSU9OCQkJIDE4MQorI2RlZmluZSBTU0xfRl9TU0xfR0VUX1BSRVZfU0VTU0lPTgkJCSAyMTcKKyNkZWZpbmUgU1NMX0ZfU1NMX0dFVF9TRVJWRVJfU0VORF9DRVJUCQkJIDE4MgorI2RlZmluZSBTU0xfRl9TU0xfR0VUX1NJR05fUEtFWQkJCQkgMTgzCisjZGVmaW5lIFNTTF9GX1NTTF9JTklUX1dCSU9fQlVGRkVSCQkJIDE4NAorI2RlZmluZSBTU0xfRl9TU0xfTE9BRF9DTElFTlRfQ0FfRklMRQkJCSAxODUKKyNkZWZpbmUgU1NMX0ZfU1NMX05FVwkJCQkJIDE4NgorI2RlZmluZSBTU0xfRl9TU0xfUEFSU0VfQ0xJRU5USEVMTE9fUkVORUdPVElBVEVfRVhUCSAzMDAKKyNkZWZpbmUgU1NMX0ZfU1NMX1BBUlNFX0NMSUVOVEhFTExPX1RMU0VYVAkJIDMwMgorI2RlZmluZSBTU0xfRl9TU0xfUEFSU0VfU0VSVkVSSEVMTE9fUkVORUdPVElBVEVfRVhUCSAzMDEKKyNkZWZpbmUgU1NMX0ZfU1NMX1BBUlNFX1NFUlZFUkhFTExPX1RMU0VYVAkJIDMwMworI2RlZmluZSBTU0xfRl9TU0xfUEVFSwkJCQkJIDI3MAorI2RlZmluZSBTU0xfRl9TU0xfUFJFUEFSRV9DTElFTlRIRUxMT19UTFNFWFQJCSAyODEKKyNkZWZpbmUgU1NMX0ZfU1NMX1BSRVBBUkVfU0VSVkVSSEVMTE9fVExTRVhUCQkgMjgyCisjZGVmaW5lIFNTTF9GX1NTTF9SRUFECQkJCQkgMjIzCisjZGVmaW5lIFNTTF9GX1NTTF9SU0FfUFJJVkFURV9ERUNSWVBUCQkJIDE4NworI2RlZmluZSBTU0xfRl9TU0xfUlNBX1BVQkxJQ19FTkNSWVBUCQkJIDE4OAorI2RlZmluZSBTU0xfRl9TU0xfU0VTU0lPTl9ORVcJCQkJIDE4OQorI2RlZmluZSBTU0xfRl9TU0xfU0VTU0lPTl9QUklOVF9GUAkJCSAxOTAKKyNkZWZpbmUgU1NMX0ZfU1NMX1NFU1NfQ0VSVF9ORVcJCQkJIDIyNQorI2RlZmluZSBTU0xfRl9TU0xfU0VUX0NFUlQJCQkJIDE5MQorI2RlZmluZSBTU0xfRl9TU0xfU0VUX0NJUEhFUl9MSVNUCQkJIDI3MQorI2RlZmluZSBTU0xfRl9TU0xfU0VUX0ZECQkJCSAxOTIKKyNkZWZpbmUgU1NMX0ZfU1NMX1NFVF9QS0VZCQkJCSAxOTMKKyNkZWZpbmUgU1NMX0ZfU1NMX1NFVF9QVVJQT1NFCQkJCSAyMjcKKyNkZWZpbmUgU1NMX0ZfU1NMX1NFVF9SRkQJCQkJIDE5NAorI2RlZmluZSBTU0xfRl9TU0xfU0VUX1NFU1NJT04JCQkJIDE5NQorI2RlZmluZSBTU0xfRl9TU0xfU0VUX1NFU1NJT05fSURfQ09OVEVYVAkJIDIxOAorI2RlZmluZSBTU0xfRl9TU0xfU0VUX1NFU1NJT05fVElDS0VUX0VYVAkJIDI5NAorI2RlZmluZSBTU0xfRl9TU0xfU0VUX1RSVVNUCQkJCSAyMjgKKyNkZWZpbmUgU1NMX0ZfU1NMX1NFVF9XRkQJCQkJIDE5NgorI2RlZmluZSBTU0xfRl9TU0xfU0hVVERPV04JCQkJIDIyNAorI2RlZmluZSBTU0xfRl9TU0xfVU5ERUZJTkVEX0NPTlNUX0ZVTkNUSU9OCQkgMjQzCisjZGVmaW5lIFNTTF9GX1NTTF9VTkRFRklORURfRlVOQ1RJT04JCQkgMTk3CisjZGVmaW5lIFNTTF9GX1NTTF9VTkRFRklORURfVk9JRF9GVU5DVElPTgkJIDI0NAorI2RlZmluZSBTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFCQkJIDE5OAorI2RlZmluZSBTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFX0FTTjEJCQkgMTk5CisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfQ0VSVElGSUNBVEVfQ0hBSU4JCQkgMjAwMAorI2RlZmluZSBTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFX0ZJTEUJCQkgMjAwCisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWQkJCSAyMDEKKyNkZWZpbmUgU1NMX0ZfU1NMX1VTRV9QUklWQVRFS0VZX0FTTjEJCQkgMjAyCisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWV9GSUxFCQkJIDIwMworI2RlZmluZSBTU0xfRl9TU0xfVVNFX1BTS19JREVOVElUWV9ISU5UCQkJIDI3MworI2RlZmluZSBTU0xfRl9TU0xfVVNFX1JTQVBSSVZBVEVLRVkJCQkgMjA0CisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfUlNBUFJJVkFURUtFWV9BU04xCQkgMjA1CisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfUlNBUFJJVkFURUtFWV9GSUxFCQkgMjA2CisjZGVmaW5lIFNTTF9GX1NTTF9WRVJJRllfQ0VSVF9DSEFJTgkJCSAyMDcKKyNkZWZpbmUgU1NMX0ZfU1NMX1dSSVRFCQkJCQkgMjA4CisjZGVmaW5lIFNTTF9GX1RMUzFfQ0VSVF9WRVJJRllfTUFDCQkJIDI4NgorI2RlZmluZSBTU0xfRl9UTFMxX0NIQU5HRV9DSVBIRVJfU1RBVEUJCQkgMjA5CisjZGVmaW5lIFNTTF9GX1RMUzFfQ0hFQ0tfU0VSVkVSSEVMTE9fVExTRVhUCQkgMjc0CisjZGVmaW5lIFNTTF9GX1RMUzFfRU5DCQkJCQkgMjEwCisjZGVmaW5lIFNTTF9GX1RMUzFfUFJFUEFSRV9DTElFTlRIRUxMT19UTFNFWFQJCSAyNzUKKyNkZWZpbmUgU1NMX0ZfVExTMV9QUkVQQVJFX1NFUlZFUkhFTExPX1RMU0VYVAkJIDI3NgorI2RlZmluZSBTU0xfRl9UTFMxX1BSRgkJCQkJIDI4NAorI2RlZmluZSBTU0xfRl9UTFMxX1NFVFVQX0tFWV9CTE9DSwkJCSAyMTEKKyNkZWZpbmUgU1NMX0ZfV1JJVEVfUEVORElORwkJCQkgMjEyCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgU1NMX1JfQVBQX0RBVEFfSU5fSEFORFNIQUtFCQkJIDEwMAorI2RlZmluZSBTU0xfUl9BVFRFTVBUX1RPX1JFVVNFX1NFU1NJT05fSU5fRElGRkVSRU5UX0NPTlRFWFQgMjcyCisjZGVmaW5lIFNTTF9SX0JBRF9BTEVSVF9SRUNPUkQJCQkJIDEwMQorI2RlZmluZSBTU0xfUl9CQURfQVVUSEVOVElDQVRJT05fVFlQRQkJCSAxMDIKKyNkZWZpbmUgU1NMX1JfQkFEX0NIQU5HRV9DSVBIRVJfU1BFQwkJCSAxMDMKKyNkZWZpbmUgU1NMX1JfQkFEX0NIRUNLU1VNCQkJCSAxMDQKKyNkZWZpbmUgU1NMX1JfQkFEX0RBVEFfUkVUVVJORURfQllfQ0FMTEJBQ0sJCSAxMDYKKyNkZWZpbmUgU1NMX1JfQkFEX0RFQ09NUFJFU1NJT04JCQkJIDEwNworI2RlZmluZSBTU0xfUl9CQURfREhfR19MRU5HVEgJCQkJIDEwOAorI2RlZmluZSBTU0xfUl9CQURfREhfUFVCX0tFWV9MRU5HVEgJCQkgMTA5CisjZGVmaW5lIFNTTF9SX0JBRF9ESF9QX0xFTkdUSAkJCQkgMTEwCisjZGVmaW5lIFNTTF9SX0JBRF9ESUdFU1RfTEVOR1RICQkJCSAxMTEKKyNkZWZpbmUgU1NMX1JfQkFEX0RTQV9TSUdOQVRVUkUJCQkJIDExMgorI2RlZmluZSBTU0xfUl9CQURfRUNDX0NFUlQJCQkJIDMwNAorI2RlZmluZSBTU0xfUl9CQURfRUNEU0FfU0lHTkFUVVJFCQkJIDMwNQorI2RlZmluZSBTU0xfUl9CQURfRUNQT0lOVAkJCQkgMzA2CisjZGVmaW5lIFNTTF9SX0JBRF9IQU5EU0hBS0VfTEVOR1RICQkJIDMzMgorI2RlZmluZSBTU0xfUl9CQURfSEVMTE9fUkVRVUVTVAkJCQkgMTA1CisjZGVmaW5lIFNTTF9SX0JBRF9MRU5HVEgJCQkJIDI3MQorI2RlZmluZSBTU0xfUl9CQURfTUFDX0RFQ09ERQkJCQkgMTEzCisjZGVmaW5lIFNTTF9SX0JBRF9NQUNfTEVOR1RICQkJCSAzMzMKKyNkZWZpbmUgU1NMX1JfQkFEX01FU1NBR0VfVFlQRQkJCQkgMTE0CisjZGVmaW5lIFNTTF9SX0JBRF9QQUNLRVRfTEVOR1RICQkJCSAxMTUKKyNkZWZpbmUgU1NMX1JfQkFEX1BST1RPQ09MX1ZFUlNJT05fTlVNQkVSCQkgMTE2CisjZGVmaW5lIFNTTF9SX0JBRF9QU0tfSURFTlRJVFlfSElOVF9MRU5HVEgJCSAzMTYKKyNkZWZpbmUgU1NMX1JfQkFEX1JFU1BPTlNFX0FSR1VNRU5UCQkJIDExNworI2RlZmluZSBTU0xfUl9CQURfUlNBX0RFQ1JZUFQJCQkJIDExOAorI2RlZmluZSBTU0xfUl9CQURfUlNBX0VOQ1JZUFQJCQkJIDExOQorI2RlZmluZSBTU0xfUl9CQURfUlNBX0VfTEVOR1RICQkJCSAxMjAKKyNkZWZpbmUgU1NMX1JfQkFEX1JTQV9NT0RVTFVTX0xFTkdUSAkJCSAxMjEKKyNkZWZpbmUgU1NMX1JfQkFEX1JTQV9TSUdOQVRVUkUJCQkJIDEyMgorI2RlZmluZSBTU0xfUl9CQURfU0lHTkFUVVJFCQkJCSAxMjMKKyNkZWZpbmUgU1NMX1JfQkFEX1NTTF9GSUxFVFlQRQkJCQkgMTI0CisjZGVmaW5lIFNTTF9SX0JBRF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgJCQkgMTI1CisjZGVmaW5lIFNTTF9SX0JBRF9TVEFURQkJCQkJIDEyNgorI2RlZmluZSBTU0xfUl9CQURfV1JJVEVfUkVUUlkJCQkJIDEyNworI2RlZmluZSBTU0xfUl9CSU9fTk9UX1NFVAkJCQkgMTI4CisjZGVmaW5lIFNTTF9SX0JMT0NLX0NJUEhFUl9QQURfSVNfV1JPTkcJCQkgMTI5CisjZGVmaW5lIFNTTF9SX0JOX0xJQgkJCQkJIDEzMAorI2RlZmluZSBTU0xfUl9DQV9ETl9MRU5HVEhfTUlTTUFUQ0gJCQkgMTMxCisjZGVmaW5lIFNTTF9SX0NBX0ROX1RPT19MT05HCQkJCSAxMzIKKyNkZWZpbmUgU1NMX1JfQ0NTX1JFQ0VJVkVEX0VBUkxZCQkJIDEzMworI2RlZmluZSBTU0xfUl9DRVJUSUZJQ0FURV9WRVJJRllfRkFJTEVECQkJIDEzNAorI2RlZmluZSBTU0xfUl9DRVJUX0xFTkdUSF9NSVNNQVRDSAkJCSAxMzUKKyNkZWZpbmUgU1NMX1JfQ0hBTExFTkdFX0lTX0RJRkZFUkVOVAkJCSAxMzYKKyNkZWZpbmUgU1NMX1JfQ0lQSEVSX0NPREVfV1JPTkdfTEVOR1RICQkJIDEzNworI2RlZmluZSBTU0xfUl9DSVBIRVJfT1JfSEFTSF9VTkFWQUlMQUJMRQkJIDEzOAorI2RlZmluZSBTU0xfUl9DSVBIRVJfVEFCTEVfU1JDX0VSUk9SCQkJIDEzOQorI2RlZmluZSBTU0xfUl9DTElFTlRIRUxMT19UTFNFWFQJCQkgMjI2CisjZGVmaW5lIFNTTF9SX0NPTVBSRVNTRURfTEVOR1RIX1RPT19MT05HCQkgMTQwCisjZGVmaW5lIFNTTF9SX0NPTVBSRVNTSU9OX0RJU0FCTEVECQkJIDM0MworI2RlZmluZSBTU0xfUl9DT01QUkVTU0lPTl9GQUlMVVJFCQkJIDE0MQorI2RlZmluZSBTU0xfUl9DT01QUkVTU0lPTl9JRF9OT1RfV0lUSElOX1BSSVZBVEVfUkFOR0UJIDMwNworI2RlZmluZSBTU0xfUl9DT01QUkVTU0lPTl9MSUJSQVJZX0VSUk9SCQkJIDE0MgorI2RlZmluZSBTU0xfUl9DT05ORUNUSU9OX0lEX0lTX0RJRkZFUkVOVAkJIDE0MworI2RlZmluZSBTU0xfUl9DT05ORUNUSU9OX1RZUEVfTk9UX1NFVAkJCSAxNDQKKyNkZWZpbmUgU1NMX1JfQ09PS0lFX01JU01BVENICQkJCSAzMDgKKyNkZWZpbmUgU1NMX1JfREFUQV9CRVRXRUVOX0NDU19BTkRfRklOSVNIRUQJCSAxNDUKKyNkZWZpbmUgU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcJCQkgMTQ2CisjZGVmaW5lIFNTTF9SX0RFQ1JZUFRJT05fRkFJTEVECQkJCSAxNDcKKyNkZWZpbmUgU1NMX1JfREVDUllQVElPTl9GQUlMRURfT1JfQkFEX1JFQ09SRF9NQUMJIDI4MQorI2RlZmluZSBTU0xfUl9ESF9QVUJMSUNfVkFMVUVfTEVOR1RIX0lTX1dST05HCQkgMTQ4CisjZGVmaW5lIFNTTF9SX0RJR0VTVF9DSEVDS19GQUlMRUQJCQkgMTQ5CisjZGVmaW5lIFNTTF9SX0RUTFNfTUVTU0FHRV9UT09fQklHCQkJIDMzNAorI2RlZmluZSBTU0xfUl9EVVBMSUNBVEVfQ09NUFJFU1NJT05fSUQJCQkgMzA5CisjZGVmaW5lIFNTTF9SX0VDQ19DRVJUX05PVF9GT1JfS0VZX0FHUkVFTUVOVAkJIDMxNworI2RlZmluZSBTU0xfUl9FQ0NfQ0VSVF9OT1RfRk9SX1NJR05JTkcJCQkgMzE4CisjZGVmaW5lIFNTTF9SX0VDQ19DRVJUX1NIT1VMRF9IQVZFX1JTQV9TSUdOQVRVUkUJIDMyMgorI2RlZmluZSBTU0xfUl9FQ0NfQ0VSVF9TSE9VTERfSEFWRV9TSEExX1NJR05BVFVSRQkgMzIzCisjZGVmaW5lIFNTTF9SX0VDR1JPVVBfVE9PX0xBUkdFX0ZPUl9DSVBIRVIJCSAzMTAKKyNkZWZpbmUgU1NMX1JfRU5DUllQVEVEX0xFTkdUSF9UT09fTE9ORwkJCSAxNTAKKyNkZWZpbmUgU1NMX1JfRVJST1JfR0VORVJBVElOR19UTVBfUlNBX0tFWQkJIDI4MgorI2RlZmluZSBTU0xfUl9FUlJPUl9JTl9SRUNFSVZFRF9DSVBIRVJfTElTVAkJIDE1MQorI2RlZmluZSBTU0xfUl9FWENFU1NJVkVfTUVTU0FHRV9TSVpFCQkJIDE1MgorI2RlZmluZSBTU0xfUl9FWFRSQV9EQVRBX0lOX01FU1NBR0UJCQkgMTUzCisjZGVmaW5lIFNTTF9SX0dPVF9BX0ZJTl9CRUZPUkVfQV9DQ1MJCQkgMTU0CisjZGVmaW5lIFNTTF9SX0hUVFBTX1BST1hZX1JFUVVFU1QJCQkgMTU1CisjZGVmaW5lIFNTTF9SX0hUVFBfUkVRVUVTVAkJCQkgMTU2CisjZGVmaW5lIFNTTF9SX0lMTEVHQUxfUEFERElORwkJCQkgMjgzCisjZGVmaW5lIFNTTF9SX0lOQ09OU0lTVEVOVF9DT01QUkVTU0lPTgkJCSAzNDAKKyNkZWZpbmUgU1NMX1JfSU5WQUxJRF9DSEFMTEVOR0VfTEVOR1RICQkJIDE1OAorI2RlZmluZSBTU0xfUl9JTlZBTElEX0NPTU1BTkQJCQkJIDI4MAorI2RlZmluZSBTU0xfUl9JTlZBTElEX0NPTVBSRVNTSU9OX0FMR09SSVRITQkJIDM0MQorI2RlZmluZSBTU0xfUl9JTlZBTElEX1BVUlBPU0UJCQkJIDI3OAorI2RlZmluZSBTU0xfUl9JTlZBTElEX1NUQVRVU19SRVNQT05TRQkJCSAzMjgKKyNkZWZpbmUgU1NMX1JfSU5WQUxJRF9USUNLRVRfS0VZU19MRU5HVEgJCSAzMjUKKyNkZWZpbmUgU1NMX1JfSU5WQUxJRF9UUlVTVAkJCQkgMjc5CisjZGVmaW5lIFNTTF9SX0tFWV9BUkdfVE9PX0xPTkcJCQkJIDI4NAorI2RlZmluZSBTU0xfUl9LUkI1CQkJCQkgMjg1CisjZGVmaW5lIFNTTF9SX0tSQjVfQ19DQ19QUklOQwkJCQkgMjg2CisjZGVmaW5lIFNTTF9SX0tSQjVfQ19HRVRfQ1JFRAkJCQkgMjg3CisjZGVmaW5lIFNTTF9SX0tSQjVfQ19JTklUCQkJCSAyODgKKyNkZWZpbmUgU1NMX1JfS1JCNV9DX01LX1JFUQkJCQkgMjg5CisjZGVmaW5lIFNTTF9SX0tSQjVfU19CQURfVElDS0VUCQkJCSAyOTAKKyNkZWZpbmUgU1NMX1JfS1JCNV9TX0lOSVQJCQkJIDI5MQorI2RlZmluZSBTU0xfUl9LUkI1X1NfUkRfUkVRCQkJCSAyOTIKKyNkZWZpbmUgU1NMX1JfS1JCNV9TX1RLVF9FWFBJUkVECQkJIDI5MworI2RlZmluZSBTU0xfUl9LUkI1X1NfVEtUX05ZVgkJCQkgMjk0CisjZGVmaW5lIFNTTF9SX0tSQjVfU19US1RfU0tFVwkJCQkgMjk1CisjZGVmaW5lIFNTTF9SX0xFTkdUSF9NSVNNQVRDSAkJCQkgMTU5CisjZGVmaW5lIFNTTF9SX0xFTkdUSF9UT09fU0hPUlQJCQkJIDE2MAorI2RlZmluZSBTU0xfUl9MSUJSQVJZX0JVRwkJCQkgMjc0CisjZGVmaW5lIFNTTF9SX0xJQlJBUllfSEFTX05PX0NJUEhFUlMJCQkgMTYxCisjZGVmaW5lIFNTTF9SX01FU1NBR0VfVE9PX0xPTkcJCQkJIDI5NgorI2RlZmluZSBTU0xfUl9NSVNTSU5HX0RIX0RTQV9DRVJUCQkJIDE2MgorI2RlZmluZSBTU0xfUl9NSVNTSU5HX0RIX0tFWQkJCQkgMTYzCisjZGVmaW5lIFNTTF9SX01JU1NJTkdfREhfUlNBX0NFUlQJCQkgMTY0CisjZGVmaW5lIFNTTF9SX01JU1NJTkdfRFNBX1NJR05JTkdfQ0VSVAkJCSAxNjUKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19FWFBPUlRfVE1QX0RIX0tFWQkJCSAxNjYKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19FWFBPUlRfVE1QX1JTQV9LRVkJCSAxNjcKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19SU0FfQ0VSVElGSUNBVEUJCQkgMTY4CisjZGVmaW5lIFNTTF9SX01JU1NJTkdfUlNBX0VOQ1JZUFRJTkdfQ0VSVAkJIDE2OQorI2RlZmluZSBTU0xfUl9NSVNTSU5HX1JTQV9TSUdOSU5HX0NFUlQJCQkgMTcwCisjZGVmaW5lIFNTTF9SX01JU1NJTkdfVE1QX0RIX0tFWQkJCSAxNzEKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19UTVBfRUNESF9LRVkJCQkgMzExCisjZGVmaW5lIFNTTF9SX01JU1NJTkdfVE1QX1JTQV9LRVkJCQkgMTcyCisjZGVmaW5lIFNTTF9SX01JU1NJTkdfVE1QX1JTQV9QS0VZCQkJIDE3MworI2RlZmluZSBTU0xfUl9NSVNTSU5HX1ZFUklGWV9NRVNTQUdFCQkJIDE3NAorI2RlZmluZSBTU0xfUl9OT05fU1NMVjJfSU5JVElBTF9QQUNLRVQJCQkgMTc1CisjZGVmaW5lIFNTTF9SX05PX0NFUlRJRklDQVRFU19SRVRVUk5FRAkJCSAxNzYKKyNkZWZpbmUgU1NMX1JfTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQJCQkgMTc3CisjZGVmaW5lIFNTTF9SX05PX0NFUlRJRklDQVRFX1JFVFVSTkVECQkJIDE3OAorI2RlZmluZSBTU0xfUl9OT19DRVJUSUZJQ0FURV9TRVQJCQkgMTc5CisjZGVmaW5lIFNTTF9SX05PX0NFUlRJRklDQVRFX1NQRUNJRklFRAkJCSAxODAKKyNkZWZpbmUgU1NMX1JfTk9fQ0lQSEVSU19BVkFJTEFCTEUJCQkgMTgxCisjZGVmaW5lIFNTTF9SX05PX0NJUEhFUlNfUEFTU0VECQkJCSAxODIKKyNkZWZpbmUgU1NMX1JfTk9fQ0lQSEVSU19TUEVDSUZJRUQJCQkgMTgzCisjZGVmaW5lIFNTTF9SX05PX0NJUEhFUl9MSVNUCQkJCSAxODQKKyNkZWZpbmUgU1NMX1JfTk9fQ0lQSEVSX01BVENICQkJCSAxODUKKyNkZWZpbmUgU1NMX1JfTk9fQ0xJRU5UX0NFUlRfTUVUSE9ECQkJIDMzMQorI2RlZmluZSBTU0xfUl9OT19DTElFTlRfQ0VSVF9SRUNFSVZFRAkJCSAxODYKKyNkZWZpbmUgU1NMX1JfTk9fQ09NUFJFU1NJT05fU1BFQ0lGSUVECQkJIDE4NworI2RlZmluZSBTU0xfUl9OT19HT1NUX0NFUlRJRklDQVRFX1NFTlRfQllfUEVFUgkJIDMzMAorI2RlZmluZSBTU0xfUl9OT19NRVRIT0RfU1BFQ0lGSUVECQkJIDE4OAorI2RlZmluZSBTU0xfUl9OT19QUklWQVRFS0VZCQkJCSAxODkKKyNkZWZpbmUgU1NMX1JfTk9fUFJJVkFURV9LRVlfQVNTSUdORUQJCQkgMTkwCisjZGVmaW5lIFNTTF9SX05PX1BST1RPQ09MU19BVkFJTEFCTEUJCQkgMTkxCisjZGVmaW5lIFNTTF9SX05PX1BVQkxJQ0tFWQkJCQkgMTkyCisjZGVmaW5lIFNTTF9SX05PX1JFTkVHT1RJQVRJT04JCQkJIDMzOQorI2RlZmluZSBTU0xfUl9OT19SRVFVSVJFRF9ESUdFU1QJCQkgMzI0CisjZGVmaW5lIFNTTF9SX05PX1NIQVJFRF9DSVBIRVIJCQkJIDE5MworI2RlZmluZSBTU0xfUl9OT19WRVJJRllfQ0FMTEJBQ0sJCQkgMTk0CisjZGVmaW5lIFNTTF9SX05VTExfU1NMX0NUWAkJCQkgMTk1CisjZGVmaW5lIFNTTF9SX05VTExfU1NMX01FVEhPRF9QQVNTRUQJCQkgMTk2CisjZGVmaW5lIFNTTF9SX09MRF9TRVNTSU9OX0NJUEhFUl9OT1RfUkVUVVJORUQJCSAxOTcKKyNkZWZpbmUgU1NMX1JfT0xEX1NFU1NJT05fQ09NUFJFU1NJT05fQUxHT1JJVEhNX05PVF9SRVRVUk5FRCAzNDQKKyNkZWZpbmUgU1NMX1JfT05MWV9UTFNfQUxMT1dFRF9JTl9GSVBTX01PREUJCSAyOTcKKyNkZWZpbmUgU1NMX1JfT1BBUVVFX1BSRl9JTlBVVF9UT09fTE9ORwkJCSAzMjcKKyNkZWZpbmUgU1NMX1JfUEFDS0VUX0xFTkdUSF9UT09fTE9ORwkJCSAxOTgKKyNkZWZpbmUgU1NMX1JfUEFSU0VfVExTRVhUCQkJCSAyMjcKKyNkZWZpbmUgU1NMX1JfUEFUSF9UT09fTE9ORwkJCQkgMjcwCisjZGVmaW5lIFNTTF9SX1BFRVJfRElEX05PVF9SRVRVUk5fQV9DRVJUSUZJQ0FURQkJIDE5OQorI2RlZmluZSBTU0xfUl9QRUVSX0VSUk9SCQkJCSAyMDAKKyNkZWZpbmUgU1NMX1JfUEVFUl9FUlJPUl9DRVJUSUZJQ0FURQkJCSAyMDEKKyNkZWZpbmUgU1NMX1JfUEVFUl9FUlJPUl9OT19DRVJUSUZJQ0FURQkJCSAyMDIKKyNkZWZpbmUgU1NMX1JfUEVFUl9FUlJPUl9OT19DSVBIRVIJCQkgMjAzCisjZGVmaW5lIFNTTF9SX1BFRVJfRVJST1JfVU5TVVBQT1JURURfQ0VSVElGSUNBVEVfVFlQRQkgMjA0CisjZGVmaW5lIFNTTF9SX1BSRV9NQUNfTEVOR1RIX1RPT19MT05HCQkJIDIwNQorI2RlZmluZSBTU0xfUl9QUk9CTEVNU19NQVBQSU5HX0NJUEhFUl9GVU5DVElPTlMJCSAyMDYKKyNkZWZpbmUgU1NMX1JfUFJPVE9DT0xfSVNfU0hVVERPV04JCQkgMjA3CisjZGVmaW5lIFNTTF9SX1BTS19JREVOVElUWV9OT1RfRk9VTkQJCQkgMjIzCisjZGVmaW5lIFNTTF9SX1BTS19OT19DTElFTlRfQ0IJCQkJIDIyNAorI2RlZmluZSBTU0xfUl9QU0tfTk9fU0VSVkVSX0NCCQkJCSAyMjUKKyNkZWZpbmUgU1NMX1JfUFVCTElDX0tFWV9FTkNSWVBUX0VSUk9SCQkJIDIwOAorI2RlZmluZSBTU0xfUl9QVUJMSUNfS0VZX0lTX05PVF9SU0EJCQkgMjA5CisjZGVmaW5lIFNTTF9SX1BVQkxJQ19LRVlfTk9UX1JTQQkJCSAyMTAKKyNkZWZpbmUgU1NMX1JfUkVBRF9CSU9fTk9UX1NFVAkJCQkgMjExCisjZGVmaW5lIFNTTF9SX1JFQURfVElNRU9VVF9FWFBJUkVECQkJIDMxMgorI2RlZmluZSBTU0xfUl9SRUFEX1dST05HX1BBQ0tFVF9UWVBFCQkJIDIxMgorI2RlZmluZSBTU0xfUl9SRUNPUkRfTEVOR1RIX01JU01BVENICQkJIDIxMworI2RlZmluZSBTU0xfUl9SRUNPUkRfVE9PX0xBUkdFCQkJCSAyMTQKKyNkZWZpbmUgU1NMX1JfUkVDT1JEX1RPT19TTUFMTAkJCQkgMjk4CisjZGVmaW5lIFNTTF9SX1JFTkVHT1RJQVRFX0VYVF9UT09fTE9ORwkJCSAzMzUKKyNkZWZpbmUgU1NMX1JfUkVORUdPVElBVElPTl9FTkNPRElOR19FUlIJCSAzMzYKKyNkZWZpbmUgU1NMX1JfUkVORUdPVElBVElPTl9NSVNNQVRDSAkJCSAzMzcKKyNkZWZpbmUgU1NMX1JfUkVRVUlSRURfQ0lQSEVSX01JU1NJTkcJCQkgMjE1CisjZGVmaW5lIFNTTF9SX1JFUVVJUkVEX0NPTVBSRVNTU0lPTl9BTEdPUklUSE1fTUlTU0lORwkgMzQyCisjZGVmaW5lIFNTTF9SX1JFVVNFX0NFUlRfTEVOR1RIX05PVF9aRVJPCQkgMjE2CisjZGVmaW5lIFNTTF9SX1JFVVNFX0NFUlRfVFlQRV9OT1RfWkVSTwkJCSAyMTcKKyNkZWZpbmUgU1NMX1JfUkVVU0VfQ0lQSEVSX0xJU1RfTk9UX1pFUk8JCSAyMTgKKyNkZWZpbmUgU1NMX1JfU0NTVl9SRUNFSVZFRF9XSEVOX1JFTkVHT1RJQVRJTkcJCSAzNDUKKyNkZWZpbmUgU1NMX1JfU0VSVkVSSEVMTE9fVExTRVhUCQkJIDI3NQorI2RlZmluZSBTU0xfUl9TRVNTSU9OX0lEX0NPTlRFWFRfVU5JTklUSUFMSVpFRAkJIDI3NworI2RlZmluZSBTU0xfUl9TRVNTSU9OX01BWV9OT1RfQkVfQ1JFQVRFRAkJIDIwMDAKKyNkZWZpbmUgU1NMX1JfU0hPUlRfUkVBRAkJCQkgMjE5CisjZGVmaW5lIFNTTF9SX1NJR05BVFVSRV9GT1JfTk9OX1NJR05JTkdfQ0VSVElGSUNBVEUJIDIyMAorI2RlZmluZSBTU0xfUl9TU0wyM19ET0lOR19TRVNTSU9OX0lEX1JFVVNFCQkgMjIxCisjZGVmaW5lIFNTTF9SX1NTTDJfQ09OTkVDVElPTl9JRF9UT09fTE9ORwkJIDI5OQorI2RlZmluZSBTU0xfUl9TU0wzX0VYVF9JTlZBTElEX0VDUE9JTlRGT1JNQVQJCSAzMjEKKyNkZWZpbmUgU1NMX1JfU1NMM19FWFRfSU5WQUxJRF9TRVJWRVJOQU1FCQkgMzE5CisjZGVmaW5lIFNTTF9SX1NTTDNfRVhUX0lOVkFMSURfU0VSVkVSTkFNRV9UWVBFCQkgMzIwCisjZGVmaW5lIFNTTF9SX1NTTDNfU0VTU0lPTl9JRF9UT09fTE9ORwkJCSAzMDAKKyNkZWZpbmUgU1NMX1JfU1NMM19TRVNTSU9OX0lEX1RPT19TSE9SVAkJCSAyMjIKKyNkZWZpbmUgU1NMX1JfU1NMVjNfQUxFUlRfQkFEX0NFUlRJRklDQVRFCQkgMTA0MgorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9CQURfUkVDT1JEX01BQwkJIDEwMjAKKyNkZWZpbmUgU1NMX1JfU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfRVhQSVJFRAkJIDEwNDUKKyNkZWZpbmUgU1NMX1JfU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfUkVWT0tFRAkJIDEwNDQKKyNkZWZpbmUgU1NMX1JfU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfVU5LTk9XTgkJIDEwNDYKKyNkZWZpbmUgU1NMX1JfU1NMVjNfQUxFUlRfREVDT01QUkVTU0lPTl9GQUlMVVJFCQkgMTAzMAorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9IQU5EU0hBS0VfRkFJTFVSRQkJIDEwNDAKKyNkZWZpbmUgU1NMX1JfU1NMVjNfQUxFUlRfSUxMRUdBTF9QQVJBTUVURVIJCSAxMDQ3CisjZGVmaW5lIFNTTF9SX1NTTFYzX0FMRVJUX05PX0NFUlRJRklDQVRFCQkgMTA0MQorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9VTkVYUEVDVEVEX01FU1NBR0UJCSAxMDEwCisjZGVmaW5lIFNTTF9SX1NTTFYzX0FMRVJUX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFCSAxMDQzCisjZGVmaW5lIFNTTF9SX1NTTF9DVFhfSEFTX05PX0RFRkFVTFRfU1NMX1ZFUlNJT04JIDIyOAorI2RlZmluZSBTU0xfUl9TU0xfSEFORFNIQUtFX0ZBSUxVUkUJCQkgMjI5CisjZGVmaW5lIFNTTF9SX1NTTF9MSUJSQVJZX0hBU19OT19DSVBIRVJTCQkgMjMwCisjZGVmaW5lIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0NBTExCQUNLX0ZBSUxFRAkJIDMwMQorI2RlZmluZSBTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05GTElDVAkJCSAzMDIKKyNkZWZpbmUgU1NMX1JfU1NMX1NFU1NJT05fSURfQ09OVEVYVF9UT09fTE9ORwkJIDI3MworI2RlZmluZSBTU0xfUl9TU0xfU0VTU0lPTl9JRF9IQVNfQkFEX0xFTkdUSAkJIDMwMworI2RlZmluZSBTU0xfUl9TU0xfU0VTU0lPTl9JRF9JU19ESUZGRVJFTlQJCSAyMzEKKyNkZWZpbmUgU1NMX1JfVExTVjFfQUxFUlRfQUNDRVNTX0RFTklFRAkJCSAxMDQ5CisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX0RFQ09ERV9FUlJPUgkJCSAxMDUwCisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX0RFQ1JZUFRJT05fRkFJTEVECQkgMTAyMQorI2RlZmluZSBTU0xfUl9UTFNWMV9BTEVSVF9ERUNSWVBUX0VSUk9SCQkJIDEwNTEKKyNkZWZpbmUgU1NMX1JfVExTVjFfQUxFUlRfRVhQT1JUX1JFU1RSSUNUSU9OCQkgMTA2MAorI2RlZmluZSBTU0xfUl9UTFNWMV9BTEVSVF9JTlNVRkZJQ0lFTlRfU0VDVVJJVFkJCSAxMDcxCisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX0lOVEVSTkFMX0VSUk9SCQkgMTA4MAorI2RlZmluZSBTU0xfUl9UTFNWMV9BTEVSVF9OT19SRU5FR09USUFUSU9OCQkgMTEwMAorI2RlZmluZSBTU0xfUl9UTFNWMV9BTEVSVF9QUk9UT0NPTF9WRVJTSU9OCQkgMTA3MAorI2RlZmluZSBTU0xfUl9UTFNWMV9BTEVSVF9SRUNPUkRfT1ZFUkZMT1cJCSAxMDIyCisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX1VOS05PV05fQ0EJCQkgMTA0OAorI2RlZmluZSBTU0xfUl9UTFNWMV9BTEVSVF9VU0VSX0NBTkNFTExFRAkJIDEwOTAKKyNkZWZpbmUgU1NMX1JfVExTVjFfQkFEX0NFUlRJRklDQVRFX0hBU0hfVkFMVUUJCSAxMTE0CisjZGVmaW5lIFNTTF9SX1RMU1YxX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0UJIDExMTMKKyNkZWZpbmUgU1NMX1JfVExTVjFfQ0VSVElGSUNBVEVfVU5PQlRBSU5BQkxFCQkgMTExMQorI2RlZmluZSBTU0xfUl9UTFNWMV9VTlJFQ09HTklaRURfTkFNRQkJCSAxMTEyCisjZGVmaW5lIFNTTF9SX1RMU1YxX1VOU1VQUE9SVEVEX0VYVEVOU0lPTgkJIDExMTAKKyNkZWZpbmUgU1NMX1JfVExTX0NMSUVOVF9DRVJUX1JFUV9XSVRIX0FOT05fQ0lQSEVSCSAyMzIKKyNkZWZpbmUgU1NMX1JfVExTX0lOVkFMSURfRUNQT0lOVEZPUk1BVF9MSVNUCQkgMTU3CisjZGVmaW5lIFNTTF9SX1RMU19QRUVSX0RJRF9OT1RfUkVTUE9ORF9XSVRIX0NFUlRJRklDQVRFX0xJU1QgMjMzCisjZGVmaW5lIFNTTF9SX1RMU19SU0FfRU5DUllQVEVEX1ZBTFVFX0xFTkdUSF9JU19XUk9ORwkgMjM0CisjZGVmaW5lIFNTTF9SX1RSSUVEX1RPX1VTRV9VTlNVUFBPUlRFRF9DSVBIRVIJCSAyMzUKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0RFQ09ERV9ESF9DRVJUUwkJCSAyMzYKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0RFQ09ERV9FQ0RIX0NFUlRTCQkgMzEzCisjZGVmaW5lIFNTTF9SX1VOQUJMRV9UT19FWFRSQUNUX1BVQkxJQ19LRVkJCSAyMzcKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0ZJTkRfREhfUEFSQU1FVEVSUwkJIDIzOAorI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fRklORF9FQ0RIX1BBUkFNRVRFUlMJCSAzMTQKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0ZJTkRfUFVCTElDX0tFWV9QQVJBTUVURVJTCSAyMzkKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0ZJTkRfU1NMX01FVEhPRAkJCSAyNDAKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0xPQURfU1NMMl9NRDVfUk9VVElORVMJCSAyNDEKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0xPQURfU1NMM19NRDVfUk9VVElORVMJCSAyNDIKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0xPQURfU1NMM19TSEExX1JPVVRJTkVTCQkgMjQzCisjZGVmaW5lIFNTTF9SX1VORVhQRUNURURfTUVTU0FHRQkJCSAyNDQKKyNkZWZpbmUgU1NMX1JfVU5FWFBFQ1RFRF9SRUNPUkQJCQkJIDI0NQorI2RlZmluZSBTU0xfUl9VTklOSVRJQUxJWkVECQkJCSAyNzYKKyNkZWZpbmUgU1NMX1JfVU5LTk9XTl9BTEVSVF9UWVBFCQkJIDI0NgorI2RlZmluZSBTU0xfUl9VTktOT1dOX0NFUlRJRklDQVRFX1RZUEUJCQkgMjQ3CisjZGVmaW5lIFNTTF9SX1VOS05PV05fQ0lQSEVSX1JFVFVSTkVECQkJIDI0OAorI2RlZmluZSBTU0xfUl9VTktOT1dOX0NJUEhFUl9UWVBFCQkJIDI0OQorI2RlZmluZSBTU0xfUl9VTktOT1dOX0tFWV9FWENIQU5HRV9UWVBFCQkJIDI1MAorI2RlZmluZSBTU0xfUl9VTktOT1dOX1BLRVlfVFlQRQkJCQkgMjUxCisjZGVmaW5lIFNTTF9SX1VOS05PV05fUFJPVE9DT0wJCQkJIDI1MgorI2RlZmluZSBTU0xfUl9VTktOT1dOX1JFTU9URV9FUlJPUl9UWVBFCQkJIDI1MworI2RlZmluZSBTU0xfUl9VTktOT1dOX1NTTF9WRVJTSU9OCQkJIDI1NAorI2RlZmluZSBTU0xfUl9VTktOT1dOX1NUQVRFCQkJCSAyNTUKKyNkZWZpbmUgU1NMX1JfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OX0RJU0FCTEVECSAzMzgKKyNkZWZpbmUgU1NMX1JfVU5TVVBQT1JURURfQ0lQSEVSCQkJIDI1NgorI2RlZmluZSBTU0xfUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTl9BTEdPUklUSE0JCSAyNTcKKyNkZWZpbmUgU1NMX1JfVU5TVVBQT1JURURfRElHRVNUX1RZUEUJCQkgMzI2CisjZGVmaW5lIFNTTF9SX1VOU1VQUE9SVEVEX0VMTElQVElDX0NVUlZFCQkgMzE1CisjZGVmaW5lIFNTTF9SX1VOU1VQUE9SVEVEX1BST1RPQ09MCQkJIDI1OAorI2RlZmluZSBTU0xfUl9VTlNVUFBPUlRFRF9TU0xfVkVSU0lPTgkJCSAyNTkKKyNkZWZpbmUgU1NMX1JfVU5TVVBQT1JURURfU1RBVFVTX1RZUEUJCQkgMzI5CisjZGVmaW5lIFNTTF9SX1dSSVRFX0JJT19OT1RfU0VUCQkJCSAyNjAKKyNkZWZpbmUgU1NMX1JfV1JPTkdfQ0lQSEVSX1JFVFVSTkVECQkJIDI2MQorI2RlZmluZSBTU0xfUl9XUk9OR19NRVNTQUdFX1RZUEUJCQkgMjYyCisjZGVmaW5lIFNTTF9SX1dST05HX05VTUJFUl9PRl9LRVlfQklUUwkJCSAyNjMKKyNkZWZpbmUgU1NMX1JfV1JPTkdfU0lHTkFUVVJFX0xFTkdUSAkJCSAyNjQKKyNkZWZpbmUgU1NMX1JfV1JPTkdfU0lHTkFUVVJFX1NJWkUJCQkgMjY1CisjZGVmaW5lIFNTTF9SX1dST05HX1NTTF9WRVJTSU9OCQkJCSAyNjYKKyNkZWZpbmUgU1NMX1JfV1JPTkdfVkVSU0lPTl9OVU1CRVIJCQkgMjY3CisjZGVmaW5lIFNTTF9SX1g1MDlfTElCCQkJCQkgMjY4CisjZGVmaW5lIFNTTF9SX1g1MDlfVkVSSUZJQ0FUSU9OX1NFVFVQX1BST0JMRU1TCQkgMjY5CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvc3NsMi5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3NzbDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWE1MmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3NzbDIuaApAQCAtMCwwICsxLDI2OCBAQAorLyogc3NsL3NzbDIuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9TU0wyX0ggCisjZGVmaW5lIEhFQURFUl9TU0wyX0ggCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFByb3RvY29sIFZlcnNpb24gQ29kZXMgKi8KKyNkZWZpbmUgU1NMMl9WRVJTSU9OCQkweDAwMDIKKyNkZWZpbmUgU1NMMl9WRVJTSU9OX01BSk9SCTB4MDAKKyNkZWZpbmUgU1NMMl9WRVJTSU9OX01JTk9SCTB4MDIKKy8qICNkZWZpbmUgU1NMMl9DTElFTlRfVkVSU0lPTgkweDAwMDIgKi8KKy8qICNkZWZpbmUgU1NMMl9TRVJWRVJfVkVSU0lPTgkweDAwMDIgKi8KKworLyogUHJvdG9jb2wgTWVzc2FnZSBDb2RlcyAqLworI2RlZmluZSBTU0wyX01UX0VSUk9SCQkJMAorI2RlZmluZSBTU0wyX01UX0NMSUVOVF9IRUxMTwkJMQorI2RlZmluZSBTU0wyX01UX0NMSUVOVF9NQVNURVJfS0VZCTIKKyNkZWZpbmUgU1NMMl9NVF9DTElFTlRfRklOSVNIRUQJCTMKKyNkZWZpbmUgU1NMMl9NVF9TRVJWRVJfSEVMTE8JCTQKKyNkZWZpbmUgU1NMMl9NVF9TRVJWRVJfVkVSSUZZCQk1CisjZGVmaW5lIFNTTDJfTVRfU0VSVkVSX0ZJTklTSEVECQk2CisjZGVmaW5lIFNTTDJfTVRfUkVRVUVTVF9DRVJUSUZJQ0FURQk3CisjZGVmaW5lIFNTTDJfTVRfQ0xJRU5UX0NFUlRJRklDQVRFCTgKKworLyogRXJyb3IgTWVzc2FnZSBDb2RlcyAqLworI2RlZmluZSBTU0wyX1BFX1VOREVGSU5FRF9FUlJPUgkJMHgwMDAwCisjZGVmaW5lIFNTTDJfUEVfTk9fQ0lQSEVSCQkweDAwMDEKKyNkZWZpbmUgU1NMMl9QRV9OT19DRVJUSUZJQ0FURQkJMHgwMDAyCisjZGVmaW5lIFNTTDJfUEVfQkFEX0NFUlRJRklDQVRFCQkweDAwMDQKKyNkZWZpbmUgU1NMMl9QRV9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURV9UWVBFIDB4MDAwNgorCisvKiBDaXBoZXIgS2luZCBWYWx1ZXMgKi8KKyNkZWZpbmUgU1NMMl9DS19OVUxMX1dJVEhfTUQ1CQkJMHgwMjAwMDAwMCAvKiB2MyAqLworI2RlZmluZSBTU0wyX0NLX1JDNF8xMjhfV0lUSF9NRDUJCTB4MDIwMTAwODAKKyNkZWZpbmUgU1NMMl9DS19SQzRfMTI4X0VYUE9SVDQwX1dJVEhfTUQ1CTB4MDIwMjAwODAKKyNkZWZpbmUgU1NMMl9DS19SQzJfMTI4X0NCQ19XSVRIX01ENQkJMHgwMjAzMDA4MAorI2RlZmluZSBTU0wyX0NLX1JDMl8xMjhfQ0JDX0VYUE9SVDQwX1dJVEhfTUQ1CTB4MDIwNDAwODAKKyNkZWZpbmUgU1NMMl9DS19JREVBXzEyOF9DQkNfV0lUSF9NRDUJCTB4MDIwNTAwODAKKyNkZWZpbmUgU1NMMl9DS19ERVNfNjRfQ0JDX1dJVEhfTUQ1CQkweDAyMDYwMDQwCisjZGVmaW5lIFNTTDJfQ0tfREVTXzY0X0NCQ19XSVRIX1NIQQkJMHgwMjA2MDE0MCAvKiB2MyAqLworI2RlZmluZSBTU0wyX0NLX0RFU18xOTJfRURFM19DQkNfV0lUSF9NRDUJMHgwMjA3MDBjMAorI2RlZmluZSBTU0wyX0NLX0RFU18xOTJfRURFM19DQkNfV0lUSF9TSEEJMHgwMjA3MDFjMCAvKiB2MyAqLworI2RlZmluZSBTU0wyX0NLX1JDNF82NF9XSVRIX01ENQkJCTB4MDIwODAwODAgLyogTVMgaGFjayAqLworIAorI2RlZmluZSBTU0wyX0NLX0RFU182NF9DRkI2NF9XSVRIX01ENV8xCQkweDAyZmYwODAwIC8qIFNTTGVheSAqLworI2RlZmluZSBTU0wyX0NLX05VTEwJCQkJMHgwMmZmMDgxMCAvKiBTU0xlYXkgKi8KKworI2RlZmluZSBTU0wyX1RYVF9ERVNfNjRfQ0ZCNjRfV0lUSF9NRDVfMQkiREVTLUNGQi1NMSIKKyNkZWZpbmUgU1NMMl9UWFRfTlVMTF9XSVRIX01ENQkJCSJOVUxMLU1ENSIKKyNkZWZpbmUgU1NMMl9UWFRfUkM0XzEyOF9XSVRIX01ENQkJIlJDNC1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX1JDNF8xMjhfRVhQT1JUNDBfV0lUSF9NRDUJIkVYUC1SQzQtTUQ1IgorI2RlZmluZSBTU0wyX1RYVF9SQzJfMTI4X0NCQ19XSVRIX01ENQkJIlJDMi1DQkMtTUQ1IgorI2RlZmluZSBTU0wyX1RYVF9SQzJfMTI4X0NCQ19FWFBPUlQ0MF9XSVRIX01ENQkiRVhQLVJDMi1DQkMtTUQ1IgorI2RlZmluZSBTU0wyX1RYVF9JREVBXzEyOF9DQkNfV0lUSF9NRDUJCSJJREVBLUNCQy1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX0RFU182NF9DQkNfV0lUSF9NRDUJCSJERVMtQ0JDLU1ENSIKKyNkZWZpbmUgU1NMMl9UWFRfREVTXzY0X0NCQ19XSVRIX1NIQQkJIkRFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wyX1RYVF9ERVNfMTkyX0VERTNfQ0JDX1dJVEhfTUQ1CSJERVMtQ0JDMy1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX0RFU18xOTJfRURFM19DQkNfV0lUSF9TSEEJIkRFUy1DQkMzLVNIQSIKKyNkZWZpbmUgU1NMMl9UWFRfUkM0XzY0X1dJVEhfTUQ1CQkiUkM0LTY0LU1ENSIKKworI2RlZmluZSBTU0wyX1RYVF9OVUxMCQkJCSJOVUxMIgorCisvKiBGbGFncyBmb3IgdGhlIFNTTF9DSVBIRVIuYWxnb3JpdGhtMiBmaWVsZCAqLworI2RlZmluZSBTU0wyX0NGXzVfQllURV9FTkMJCQkweDAxCisjZGVmaW5lIFNTTDJfQ0ZfOF9CWVRFX0VOQwkJCTB4MDIKKworLyogQ2VydGlmaWNhdGUgVHlwZSBDb2RlcyAqLworI2RlZmluZSBTU0wyX0NUX1g1MDlfQ0VSVElGSUNBVEUJCTB4MDEKKworLyogQXV0aGVudGljYXRpb24gVHlwZSBDb2RlICovCisjZGVmaW5lIFNTTDJfQVRfTUQ1X1dJVEhfUlNBX0VOQ1JZUFRJT04JCTB4MDEKKworI2RlZmluZSBTU0wyX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgJCTMyCisKKy8qIFVwcGVyL0xvd2VyIEJvdW5kcyAqLworI2RlZmluZSBTU0wyX01BWF9NQVNURVJfS0VZX0xFTkdUSF9JTl9CSVRTCTI1NgorI2lmZGVmIE9QRU5TU0xfU1lTX01QRQorI2RlZmluZSBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIJMjk5OTh1CisjZWxzZQorI2RlZmluZSBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIJMzI3Njd1ICAvKiAyXjE1LTEgKi8KKyNlbmRpZgorI2RlZmluZSBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIJMTYzODMgLyogMl4xNC0xICovCisKKyNkZWZpbmUgU1NMMl9DSEFMTEVOR0VfTEVOR1RICTE2CisvKiNkZWZpbmUgU1NMMl9DSEFMTEVOR0VfTEVOR1RICTMyICovCisjZGVmaW5lIFNTTDJfTUlOX0NIQUxMRU5HRV9MRU5HVEgJMTYKKyNkZWZpbmUgU1NMMl9NQVhfQ0hBTExFTkdFX0xFTkdUSAkzMgorI2RlZmluZSBTU0wyX0NPTk5FQ1RJT05fSURfTEVOR1RICTE2CisjZGVmaW5lIFNTTDJfTUFYX0NPTk5FQ1RJT05fSURfTEVOR1RICTE2CisjZGVmaW5lIFNTTDJfU1NMX1NFU1NJT05fSURfTEVOR1RICTE2CisjZGVmaW5lIFNTTDJfTUFYX0NFUlRfQ0hBTExFTkdFX0xFTkdUSAkzMgorI2RlZmluZSBTU0wyX01JTl9DRVJUX0NIQUxMRU5HRV9MRU5HVEgJMTYKKyNkZWZpbmUgU1NMMl9NQVhfS0VZX01BVEVSSUFMX0xFTkdUSAkyNAorCisjaWZuZGVmIEhFQURFUl9TU0xfTE9DTF9ICisjZGVmaW5lICBDRVJUCQljaGFyCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3Qgc3NsMl9zdGF0ZV9zdAorCXsKKwlpbnQgdGhyZWVfYnl0ZV9oZWFkZXI7CisJaW50IGNsZWFyX3RleHQ7CQkvKiBjbGVhciB0ZXh0ICovCisJaW50IGVzY2FwZTsJCS8qIG5vdCB1c2VkIGluIFNTTHYyICovCisJaW50IHNzbDJfcm9sbGJhY2s7CS8qIHVzZWQgaWYgU1NMdjIzIHJvbGxlZCBiYWNrIHRvIFNTTHYyICovCisKKwkvKiBub24tYmxvY2tpbmcgaW8gaW5mbywgdXNlZCB0byBtYWtlIHN1cmUgdGhlIHNhbWUKKwkgKiBhcmdzIHdlcmUgcGFzc3dkICovCisJdW5zaWduZWQgaW50IHdudW07CS8qIG51bWJlciBvZiBieXRlcyBzZW50IHNvIGZhciAqLworCWludCB3cGVuZF90b3Q7CisJY29uc3QgdW5zaWduZWQgY2hhciAqd3BlbmRfYnVmOworCisJaW50IHdwZW5kX29mZjsJLyogb2Zmc2V0IHRvIGRhdGEgdG8gd3JpdGUgKi8KKwlpbnQgd3BlbmRfbGVuOyAJLyogbnVtYmVyIG9mIGJ5dGVzIHBhc3N3ZCB0byB3cml0ZSAqLworCWludCB3cGVuZF9yZXQ7IAkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gcmV0dXJuIHRvIGNhbGxlciAqLworCisJLyogYnVmZmVyIHJhdyBkYXRhICovCisJaW50IHJidWZfbGVmdDsKKwlpbnQgcmJ1Zl9vZmZzOworCXVuc2lnbmVkIGNoYXIgKnJidWY7CisJdW5zaWduZWQgY2hhciAqd2J1ZjsKKworCXVuc2lnbmVkIGNoYXIgKndyaXRlX3B0cjsvKiB1c2VkIHRvIHBvaW50IHRvIHRoZSBzdGFydCBkdWUgdG8KKwkJCQkgICogMi8zIGJ5dGUgaGVhZGVyLiAqLworCisJdW5zaWduZWQgaW50IHBhZGRpbmc7CisJdW5zaWduZWQgaW50IHJsZW5ndGg7IC8qIHBhc3NlZCB0byBzc2wyX2VuYyAqLworCWludCByYWN0X2RhdGFfbGVuZ3RoOyAvKiBTZXQgd2hlbiB0aGluZ3MgYXJlIGVuY3J5cHRlZC4gKi8KKwl1bnNpZ25lZCBpbnQgd2xlbmd0aDsgLyogcGFzc2VkIHRvIHNzbDJfZW5jICovCisJaW50IHdhY3RfZGF0YV9sZW5ndGg7IC8qIFNldCB3aGVuIHRoaW5ncyBhcmUgZGVjcnlwdGVkLiAqLworCXVuc2lnbmVkIGNoYXIgKnJhY3RfZGF0YTsKKwl1bnNpZ25lZCBjaGFyICp3YWN0X2RhdGE7CisJdW5zaWduZWQgY2hhciAqbWFjX2RhdGE7CisKKwl1bnNpZ25lZCBjaGFyICpyZWFkX2tleTsKKwl1bnNpZ25lZCBjaGFyICp3cml0ZV9rZXk7CisKKwkJLyogU3R1ZmYgc3BlY2lmaWNhbGx5IHRvIGRvIHdpdGggdGhpcyBTU0wgc2Vzc2lvbiAqLworCXVuc2lnbmVkIGludCBjaGFsbGVuZ2VfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgY2hhbGxlbmdlW1NTTDJfTUFYX0NIQUxMRU5HRV9MRU5HVEhdOworCXVuc2lnbmVkIGludCBjb25uX2lkX2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIGNvbm5faWRbU1NMMl9NQVhfQ09OTkVDVElPTl9JRF9MRU5HVEhdOworCXVuc2lnbmVkIGludCBrZXlfbWF0ZXJpYWxfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIga2V5X21hdGVyaWFsW1NTTDJfTUFYX0tFWV9NQVRFUklBTF9MRU5HVEgqMl07CisKKwl1bnNpZ25lZCBsb25nIHJlYWRfc2VxdWVuY2U7CisJdW5zaWduZWQgbG9uZyB3cml0ZV9zZXF1ZW5jZTsKKworCXN0cnVjdAl7CisJCXVuc2lnbmVkIGludCBjb25uX2lkX2xlbmd0aDsKKwkJdW5zaWduZWQgaW50IGNlcnRfdHlwZTsJCisJCXVuc2lnbmVkIGludCBjZXJ0X2xlbmd0aDsKKwkJdW5zaWduZWQgaW50IGNzbDsgCisJCXVuc2lnbmVkIGludCBjbGVhcjsKKwkJdW5zaWduZWQgaW50IGVuYzsgCisJCXVuc2lnbmVkIGNoYXIgY2NsW1NTTDJfTUFYX0NFUlRfQ0hBTExFTkdFX0xFTkdUSF07CisJCXVuc2lnbmVkIGludCBjaXBoZXJfc3BlY19sZW5ndGg7CisJCXVuc2lnbmVkIGludCBzZXNzaW9uX2lkX2xlbmd0aDsKKwkJdW5zaWduZWQgaW50IGNsZW47CisJCXVuc2lnbmVkIGludCBybGVuOworCQl9IHRtcDsKKwl9IFNTTDJfU1RBVEU7CisKKy8qIFNTTHYyICovCisvKiBjbGllbnQgKi8KKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9IRUxMT19BCQkoMHgxMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9IRUxMT19CCQkoMHgxMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9HRVRfU0VSVkVSX0hFTExPX0EJCSgweDIwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfSEVMTE9fQgkJKDB4MjF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9DTElFTlRfTUFTVEVSX0tFWV9BCSgweDMwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX01BU1RFUl9LRVlfQgkoMHgzMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9GSU5JU0hFRF9BCQkoMHg0MHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9GSU5JU0hFRF9CCQkoMHg0MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9BCSgweDUwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0IJKDB4NTF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9DTElFTlRfQ0VSVElGSUNBVEVfQwkoMHg1MnxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9ECSgweDUzfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfVkVSSUZZX0EJCSgweDYwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfVkVSSUZZX0IJCSgweDYxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfRklOSVNIRURfQQkJKDB4NzB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfR0VUX1NFUlZFUl9GSU5JU0hFRF9CCQkoMHg3MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9DTElFTlRfU1RBUlRfRU5DUllQVElPTgkJKDB4ODB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfWDUwOV9HRVRfQ0xJRU5UX0NFUlRJRklDQVRFCSgweDkwfFNTTF9TVF9DT05ORUNUKQorLyogc2VydmVyICovCisjZGVmaW5lIFNTTDJfU1RfR0VUX0NMSUVOVF9IRUxMT19BCQkoMHgxMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQgkJKDB4MTF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9HRVRfQ0xJRU5UX0hFTExPX0MJCSgweDEyfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9TRVJWRVJfSEVMTE9fQQkJKDB4MjB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19CCQkoMHgyMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfTUFTVEVSX0tFWV9BCQkoMHgzMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfTUFTVEVSX0tFWV9CCQkoMHgzMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfU0VSVkVSX1ZFUklGWV9BCQkoMHg0MHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfU0VSVkVSX1ZFUklGWV9CCQkoMHg0MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfU0VSVkVSX1ZFUklGWV9DCQkoMHg0MnxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfRklOSVNIRURfQQkJKDB4NTB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9HRVRfQ0xJRU5UX0ZJTklTSEVEX0IJCSgweDUxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9TRVJWRVJfRklOSVNIRURfQQkJKDB4NjB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1NFUlZFUl9GSU5JU0hFRF9CCQkoMHg2MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9BCSgweDcwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0IJKDB4NzF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQwkoMHg3MnxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9ECSgweDczfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VSVkVSX1NUQVJUX0VOQ1JZUFRJT04JCSgweDgwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfWDUwOV9HRVRfU0VSVkVSX0NFUlRJRklDQVRFCSgweDkwfFNTTF9TVF9BQ0NFUFQpCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMyMjg5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIHNzbC9zc2wyMy5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1NTTDIzX0ggCisjZGVmaW5lIEhFQURFUl9TU0wyM19IIAorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKmNsaWVudCAqLworLyogd3JpdGUgdG8gc2VydmVyICovCisjZGVmaW5lIFNTTDIzX1NUX0NXX0NMTlRfSEVMTE9fQQkoMHgyMTB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDIzX1NUX0NXX0NMTlRfSEVMTE9fQgkoMHgyMTF8U1NMX1NUX0NPTk5FQ1QpCisvKiByZWFkIGZyb20gc2VydmVyICovCisjZGVmaW5lIFNTTDIzX1NUX0NSX1NSVlJfSEVMTE9fQQkoMHgyMjB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDIzX1NUX0NSX1NSVlJfSEVMTE9fQgkoMHgyMjF8U1NMX1NUX0NPTk5FQ1QpCisKKy8qIHNlcnZlciAqLworLyogcmVhZCBmcm9tIGNsaWVudCAqLworI2RlZmluZSBTU0wyM19TVF9TUl9DTE5UX0hFTExPX0EJKDB4MjEwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQgkoMHgyMTF8U1NMX1NUX0FDQ0VQVCkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3NzbDMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzMzk1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmgKQEAgLTAsMCArMSw2NDcgQEAKKy8qIHNzbC9zc2wzLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIEVDQyBjaXBoZXIgc3VpdGUgc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKworI2lmbmRlZiBIRUFERVJfU1NMM19IIAorI2RlZmluZSBIRUFERVJfU1NMM19IIAorCisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorI2luY2x1ZGUgPG9wZW5zc2wvY29tcC5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFNpZ25hbGxpbmcgY2lwaGVyIHN1aXRlIHZhbHVlOiBmcm9tIGRyYWZ0LWlldGYtdGxzLXJlbmVnb3RpYXRpb24tMDMudHh0ICovCisjZGVmaW5lIFNTTDNfQ0tfU0NTVgkJCQkweDAzMDAwMEZGCisKKyNkZWZpbmUgU1NMM19DS19SU0FfTlVMTF9NRDUJCQkweDAzMDAwMDAxCisjZGVmaW5lIFNTTDNfQ0tfUlNBX05VTExfU0hBCQkJMHgwMzAwMDAwMgorI2RlZmluZSBTU0wzX0NLX1JTQV9SQzRfNDBfTUQ1IAkJCTB4MDMwMDAwMDMKKyNkZWZpbmUgU1NMM19DS19SU0FfUkM0XzEyOF9NRDUJCQkweDAzMDAwMDA0CisjZGVmaW5lIFNTTDNfQ0tfUlNBX1JDNF8xMjhfU0hBCQkJMHgwMzAwMDAwNQorI2RlZmluZSBTU0wzX0NLX1JTQV9SQzJfNDBfTUQ1CQkJMHgwMzAwMDAwNgorI2RlZmluZSBTU0wzX0NLX1JTQV9JREVBXzEyOF9TSEEJCTB4MDMwMDAwMDcKKyNkZWZpbmUgU1NMM19DS19SU0FfREVTXzQwX0NCQ19TSEEJCTB4MDMwMDAwMDgKKyNkZWZpbmUgU1NMM19DS19SU0FfREVTXzY0X0NCQ19TSEEJCTB4MDMwMDAwMDkKKyNkZWZpbmUgU1NMM19DS19SU0FfREVTXzE5Ml9DQkMzX1NIQQkJMHgwMzAwMDAwQQorCisjZGVmaW5lIFNTTDNfQ0tfREhfRFNTX0RFU180MF9DQkNfU0hBCQkweDAzMDAwMDBCCisjZGVmaW5lIFNTTDNfQ0tfREhfRFNTX0RFU182NF9DQkNfU0hBCQkweDAzMDAwMDBDCisjZGVmaW5lIFNTTDNfQ0tfREhfRFNTX0RFU18xOTJfQ0JDM19TSEEgCTB4MDMwMDAwMEQKKyNkZWZpbmUgU1NMM19DS19ESF9SU0FfREVTXzQwX0NCQ19TSEEJCTB4MDMwMDAwMEUKKyNkZWZpbmUgU1NMM19DS19ESF9SU0FfREVTXzY0X0NCQ19TSEEJCTB4MDMwMDAwMEYKKyNkZWZpbmUgU1NMM19DS19ESF9SU0FfREVTXzE5Ml9DQkMzX1NIQSAJMHgwMzAwMDAxMAorCisjZGVmaW5lIFNTTDNfQ0tfRURIX0RTU19ERVNfNDBfQ0JDX1NIQQkJMHgwMzAwMDAxMQorI2RlZmluZSBTU0wzX0NLX0VESF9EU1NfREVTXzY0X0NCQ19TSEEJCTB4MDMwMDAwMTIKKyNkZWZpbmUgU1NMM19DS19FREhfRFNTX0RFU18xOTJfQ0JDM19TSEEJMHgwMzAwMDAxMworI2RlZmluZSBTU0wzX0NLX0VESF9SU0FfREVTXzQwX0NCQ19TSEEJCTB4MDMwMDAwMTQKKyNkZWZpbmUgU1NMM19DS19FREhfUlNBX0RFU182NF9DQkNfU0hBCQkweDAzMDAwMDE1CisjZGVmaW5lIFNTTDNfQ0tfRURIX1JTQV9ERVNfMTkyX0NCQzNfU0hBCTB4MDMwMDAwMTYKKworI2RlZmluZSBTU0wzX0NLX0FESF9SQzRfNDBfTUQ1CQkJMHgwMzAwMDAxNworI2RlZmluZSBTU0wzX0NLX0FESF9SQzRfMTI4X01ENQkJCTB4MDMwMDAwMTgKKyNkZWZpbmUgU1NMM19DS19BREhfREVTXzQwX0NCQ19TSEEJCTB4MDMwMDAwMTkKKyNkZWZpbmUgU1NMM19DS19BREhfREVTXzY0X0NCQ19TSEEJCTB4MDMwMDAwMUEKKyNkZWZpbmUgU1NMM19DS19BREhfREVTXzE5Ml9DQkNfU0hBCQkweDAzMDAwMDFCCisKKyNpZiAwCisJI2RlZmluZSBTU0wzX0NLX0ZaQV9ETVNfTlVMTF9TSEEJCTB4MDMwMDAwMUMKKwkjZGVmaW5lIFNTTDNfQ0tfRlpBX0RNU19GWkFfU0hBCQkJMHgwMzAwMDAxRAorCSNpZiAwIC8qIEJlY2F1c2UgaXQgY2xhc2hlcyB3aXRoIEtSQjUsIGlzIG5ldmVyIHVzZWQgYW55IG1vcmUsIGFuZCBpcyBzYWZlCisJCSB0byByZW1vdmUgYWNjb3JkaW5nIHRvIERhdmlkIEhvcHdvb2QgPGRhdmlkLmhvcHdvb2RAemV0bmV0LmNvLnVrPgorCQkgb2YgdGhlIGlldGYtdGxzIGxpc3QgKi8KKwkjZGVmaW5lIFNTTDNfQ0tfRlpBX0RNU19SQzRfU0hBCQkJMHgwMzAwMDAxRQorCSNlbmRpZgorI2VuZGlmCisKKy8qICAgIFZSUyBBZGRpdGlvbmFsIEtlcmJlcm9zNSBlbnRyaWVzCisgKi8KKyNkZWZpbmUgU1NMM19DS19LUkI1X0RFU182NF9DQkNfU0hBCQkweDAzMDAwMDFFCisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9ERVNfMTkyX0NCQzNfU0hBCQkweDAzMDAwMDFGCisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9SQzRfMTI4X1NIQQkJMHgwMzAwMDAyMAorI2RlZmluZSBTU0wzX0NLX0tSQjVfSURFQV8xMjhfQ0JDX1NIQQkgICAgICAgCTB4MDMwMDAwMjEKKyNkZWZpbmUgU1NMM19DS19LUkI1X0RFU182NF9DQkNfTUQ1ICAgICAgIAkweDAzMDAwMDIyCisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9ERVNfMTkyX0NCQzNfTUQ1ICAgICAgIAkweDAzMDAwMDIzCisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9SQzRfMTI4X01ENQkgICAgICAgCTB4MDMwMDAwMjQKKyNkZWZpbmUgU1NMM19DS19LUkI1X0lERUFfMTI4X0NCQ19NRDUgCQkweDAzMDAwMDI1CisKKyNkZWZpbmUgU1NMM19DS19LUkI1X0RFU180MF9DQkNfU0hBIAkJMHgwMzAwMDAyNgorI2RlZmluZSBTU0wzX0NLX0tSQjVfUkMyXzQwX0NCQ19TSEEgCQkweDAzMDAwMDI3CisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9SQzRfNDBfU0hBCSAJCTB4MDMwMDAwMjgKKyNkZWZpbmUgU1NMM19DS19LUkI1X0RFU180MF9DQkNfTUQ1IAkJMHgwMzAwMDAyOQorI2RlZmluZSBTU0wzX0NLX0tSQjVfUkMyXzQwX0NCQ19NRDUgCQkweDAzMDAwMDJBCisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9SQzRfNDBfTUQ1CSAJCTB4MDMwMDAwMkIKKworI2RlZmluZSBTU0wzX1RYVF9SU0FfTlVMTF9NRDUJCQkiTlVMTC1NRDUiCisjZGVmaW5lIFNTTDNfVFhUX1JTQV9OVUxMX1NIQQkJCSJOVUxMLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfUlNBX1JDNF80MF9NRDUgCQkiRVhQLVJDNC1NRDUiCisjZGVmaW5lIFNTTDNfVFhUX1JTQV9SQzRfMTI4X01ENQkJIlJDNC1NRDUiCisjZGVmaW5lIFNTTDNfVFhUX1JTQV9SQzRfMTI4X1NIQQkJIlJDNC1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX1JTQV9SQzJfNDBfTUQ1CQkJIkVYUC1SQzItQ0JDLU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfUlNBX0lERUFfMTI4X1NIQQkJIklERUEtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfUlNBX0RFU180MF9DQkNfU0hBCQkiRVhQLURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9SU0FfREVTXzY0X0NCQ19TSEEJCSJERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfUlNBX0RFU18xOTJfQ0JDM19TSEEJCSJERVMtQ0JDMy1TSEEiCisKKyNkZWZpbmUgU1NMM19UWFRfREhfRFNTX0RFU180MF9DQkNfU0hBCQkiRVhQLURILURTUy1ERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfREhfRFNTX0RFU182NF9DQkNfU0hBCQkiREgtRFNTLURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9ESF9EU1NfREVTXzE5Ml9DQkMzX1NIQSAJIkRILURTUy1ERVMtQ0JDMy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0RIX1JTQV9ERVNfNDBfQ0JDX1NIQQkJIkVYUC1ESC1SU0EtREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0RIX1JTQV9ERVNfNjRfQ0JDX1NIQQkJIkRILVJTQS1ERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfREhfUlNBX0RFU18xOTJfQ0JDM19TSEEgCSJESC1SU0EtREVTLUNCQzMtU0hBIgorCisjZGVmaW5lIFNTTDNfVFhUX0VESF9EU1NfREVTXzQwX0NCQ19TSEEJCSJFWFAtRURILURTUy1ERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfRURIX0RTU19ERVNfNjRfQ0JDX1NIQQkJIkVESC1EU1MtREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0VESF9EU1NfREVTXzE5Ml9DQkMzX1NIQQkiRURILURTUy1ERVMtQ0JDMy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0VESF9SU0FfREVTXzQwX0NCQ19TSEEJCSJFWFAtRURILVJTQS1ERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfRURIX1JTQV9ERVNfNjRfQ0JDX1NIQQkJIkVESC1SU0EtREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0VESF9SU0FfREVTXzE5Ml9DQkMzX1NIQQkiRURILVJTQS1ERVMtQ0JDMy1TSEEiCisKKyNkZWZpbmUgU1NMM19UWFRfQURIX1JDNF80MF9NRDUJCQkiRVhQLUFESC1SQzQtTUQ1IgorI2RlZmluZSBTU0wzX1RYVF9BREhfUkM0XzEyOF9NRDUJCSJBREgtUkM0LU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfQURIX0RFU180MF9DQkNfU0hBCQkiRVhQLUFESC1ERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfQURIX0RFU182NF9DQkNfU0hBCQkiQURILURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9BREhfREVTXzE5Ml9DQkNfU0hBCQkiQURILURFUy1DQkMzLVNIQSIKKworI2lmIDAKKwkjZGVmaW5lIFNTTDNfVFhUX0ZaQV9ETVNfTlVMTF9TSEEJCSJGWkEtTlVMTC1TSEEiCisJI2RlZmluZSBTU0wzX1RYVF9GWkFfRE1TX0ZaQV9TSEEJCSJGWkEtRlpBLUNCQy1TSEEiCisJI2RlZmluZSBTU0wzX1RYVF9GWkFfRE1TX1JDNF9TSEEJCSJGWkEtUkM0LVNIQSIKKyNlbmRpZgorCisjZGVmaW5lIFNTTDNfVFhUX0tSQjVfREVTXzY0X0NCQ19TSEEJCSJLUkI1LURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19TSEEJCSJLUkI1LURFUy1DQkMzLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9SQzRfMTI4X1NIQQkJIktSQjUtUkM0LVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9JREVBXzEyOF9DQkNfU0hBCSAgICAgICAJIktSQjUtSURFQS1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X0RFU182NF9DQkNfTUQ1ICAgICAgIAkiS1JCNS1ERVMtQ0JDLU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9ERVNfMTkyX0NCQzNfTUQ1ICAgICAgIAkiS1JCNS1ERVMtQ0JDMy1NRDUiCisjZGVmaW5lIFNTTDNfVFhUX0tSQjVfUkM0XzEyOF9NRDUJCSJLUkI1LVJDNC1NRDUiCisjZGVmaW5lIFNTTDNfVFhUX0tSQjVfSURFQV8xMjhfQ0JDX01ENSAJCSJLUkI1LUlERUEtQ0JDLU1ENSIKKworI2RlZmluZSBTU0wzX1RYVF9LUkI1X0RFU180MF9DQkNfU0hBIAkJIkVYUC1LUkI1LURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X1JDMl80MF9DQkNfU0hBIAkJIkVYUC1LUkI1LVJDMi1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X1JDNF80MF9TSEEJIAkiRVhQLUtSQjUtUkM0LVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9ERVNfNDBfQ0JDX01ENSAJCSJFWFAtS1JCNS1ERVMtQ0JDLU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9SQzJfNDBfQ0JDX01ENSAJCSJFWFAtS1JCNS1SQzItQ0JDLU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9SQzRfNDBfTUQ1CSAJIkVYUC1LUkI1LVJDNC1NRDUiCisKKyNkZWZpbmUgU1NMM19TU0xfU0VTU0lPTl9JRF9MRU5HVEgJCTMyCisjZGVmaW5lIFNTTDNfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSAkJMzIKKworI2RlZmluZSBTU0wzX01BU1RFUl9TRUNSRVRfU0laRQkJCTQ4CisjZGVmaW5lIFNTTDNfUkFORE9NX1NJWkUJCQkzMgorI2RlZmluZSBTU0wzX1NFU1NJT05fSURfU0laRQkJCTMyCisjZGVmaW5lIFNTTDNfUlRfSEVBREVSX0xFTkdUSAkJCTUKKworI2lmbmRlZiBTU0wzX0FMSUdOX1BBWUxPQUQKKyAvKiBTb21lIHdpbGwgYXJndWUgdGhhdCB0aGlzIGluY3JlYXNlcyBtZW1vcnkgZm9vdHByaW50LCBidXQgaXQncworICAqIG5vdCBhY3R1YWxseSB0cnVlLiBQb2ludCBpcyB0aGF0IG1hbGxvYyBoYXMgdG8gcmV0dXJuIGF0IGxlYXN0CisgICogNjQtYml0IGFsaWduZWQgcG9pbnRlcnMsIG1lYW5pbmcgdGhhdCBhbGxvY2F0aW5nIDUgYnl0ZXMgd2FzdGVzCisgICogMyBieXRlcyBpbiBlaXRoZXIgY2FzZS4gU3VnZ2VzdGVkIHByZS1nYXBpbmcgc2ltcGx5IG1vdmVzIHRoZXNlCisgICogd2FzdGVkIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiBhbGxvY2F0ZWQgcmVnaW9uIHRvIGl0cyBmcm9udCwKKyAgKiBidXQgbWFrZXMgZGF0YSBwYXlsb2FkIGFsaWduZWQsIHdoaWNoIGltcHJvdmVzIHBlcmZvcm1hbmNlOi0pICovCisjIGRlZmluZSBTU0wzX0FMSUdOX1BBWUxPQUQJCQk4CisjZWxzZQorIyBpZiAoU1NMM19BTElHTl9QQVlMT0FEJihTU0wzX0FMSUdOX1BBWUxPQUQtMSkpIT0wCisjICBlcnJvciAiaW5zYW5lIFNTTDNfQUxJR05fUEFZTE9BRCIKKyMgIHVuZGVmIFNTTDNfQUxJR05fUEFZTE9BRAorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRoaXMgaXMgdGhlIG1heGltdW0gTUFDIChkaWdlc3QpIHNpemUgdXNlZCBieSB0aGUgU1NMIGxpYnJhcnkuCisgKiBDdXJyZW50bHkgbWF4aW11bSBvZiAyMCBpcyB1c2VkIGJ5IFNIQTEsIGJ1dCB3ZSByZXNlcnZlIGZvcgorICogZnV0dXJlIGV4dGVuc2lvbiBmb3IgNTEyLWJpdCBoYXNoZXMuCisgKi8KKworI2RlZmluZSBTU0wzX1JUX01BWF9NRF9TSVpFCQkJNjQKKworLyogTWF4aW11bSBibG9jayBzaXplIHVzZWQgaW4gYWxsIGNpcGhlcnN1aXRlcy4gQ3VycmVudGx5IDE2IGZvciBBRVMuCisgKi8KKworI2RlZmluZQlTU0xfUlRfTUFYX0NJUEhFUl9CTE9DS19TSVpFCQkxNgorCisjZGVmaW5lIFNTTDNfUlRfTUFYX0VYVFJBCQkJKDE2Mzg0KQorCisvKiBEZWZhdWx0IGJ1ZmZlciBsZW5ndGggdXNlZCBmb3Igd3JpdGVuIHJlY29yZHMuICBUaHVzIGEgZ2VuZXJhdGVkIHJlY29yZAorICogd2lsbCBjb250YWluIHBsYWludGV4dCBubyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLiAqLworI2RlZmluZSBTU0wzX1JUX0RFRkFVTFRfUExBSU5fTEVOR1RICTIwNDgKKy8qIE1heGltdW0gcGxhaW50ZXh0IGxlbmd0aDogZGVmaW5lZCBieSBTU0wvVExTIHN0YW5kYXJkcyAqLworI2RlZmluZSBTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgJCTE2Mzg0CisvKiBNYXhpbXVtIGNvbXByZXNzaW9uIG92ZXJoZWFkOiBkZWZpbmVkIGJ5IFNTTC9UTFMgc3RhbmRhcmRzICovCisjZGVmaW5lIFNTTDNfUlRfTUFYX0NPTVBSRVNTRURfT1ZFUkhFQUQJCTEwMjQKKworLyogVGhlIHN0YW5kYXJkcyBnaXZlIGEgbWF4aW11bSBlbmNyeXB0aW9uIG92ZXJoZWFkIG9mIDEwMjQgYnl0ZXMuCisgKiBJbiBwcmFjdGljZSB0aGUgdmFsdWUgaXMgbG93ZXIgdGhhbiB0aGlzLiBUaGUgb3ZlcmhlYWQgaXMgdGhlIG1heGltdW0KKyAqIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzICgyNTYpIHBsdXMgdGhlIG1hYyBzaXplLgorICovCisjZGVmaW5lIFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRAkoMjU2ICsgU1NMM19SVF9NQVhfTURfU0laRSkKKworLyogT3BlblNTTCBjdXJyZW50bHkgb25seSB1c2VzIGEgcGFkZGluZyBsZW5ndGggb2YgYXQgbW9zdCBvbmUgYmxvY2sgc28KKyAqIHRoZSBzZW5kIG92ZXJoZWFkIGlzIHNtYWxsZXIuCisgKi8KKworI2RlZmluZSBTU0wzX1JUX1NFTkRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRCBcCisJCQkoU1NMX1JUX01BWF9DSVBIRVJfQkxPQ0tfU0laRSArIFNTTDNfUlRfTUFYX01EX1NJWkUpCisKKy8qIElmIGNvbXByZXNzaW9uIGlzbid0IHVzZWQgZG9uJ3QgaW5jbHVkZSB0aGUgY29tcHJlc3Npb24gb3ZlcmhlYWQgKi8KKworI2lmZGVmIE9QRU5TU0xfTk9fQ09NUAorI2RlZmluZSBTU0wzX1JUX01BWF9DT01QUkVTU0VEX0xFTkdUSAkJU1NMM19SVF9NQVhfUExBSU5fTEVOR1RICisjZWxzZQorI2RlZmluZSBTU0wzX1JUX01BWF9DT01QUkVTU0VEX0xFTkdUSAlcCisJCShTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgrU1NMM19SVF9NQVhfQ09NUFJFU1NFRF9PVkVSSEVBRCkKKyNlbmRpZgorI2RlZmluZSBTU0wzX1JUX01BWF9FTkNSWVBURURfTEVOR1RICVwKKwkJKFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRCtTU0wzX1JUX01BWF9DT01QUkVTU0VEX0xFTkdUSCkKKyNkZWZpbmUgU1NMM19SVF9NQVhfUEFDS0VUX1NJWkUJCVwKKwkJKFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9MRU5HVEgrU1NMM19SVF9IRUFERVJfTEVOR1RIKQorCisvKiBFeHRyYSBzcGFjZSBmb3IgZW1wdHkgZnJhZ21lbnQsIGhlYWRlcnMsIE1BQywgYW5kIHBhZGRpbmcuICovCisjZGVmaW5lIFNTTDNfUlRfREVGQVVMVF9XUklURV9PVkVSSEVBRCAgMjU2CisjZGVmaW5lIFNTTDNfUlRfREVGQVVMVF9QQUNLRVRfU0laRSAgICAgNDA5NiAtIFNTTDNfUlRfREVGQVVMVF9XUklURV9PVkVSSEVBRAorI2lmIFNTTDNfUlRfREVGQVVMVF9QTEFJTl9MRU5HVEggKyBTU0wzX1JUX0RFRkFVTFRfV1JJVEVfT1ZFUkhFQUQgPiBTU0wzX1JUX0RFRkFVTFRfUEFDS0VUX1NJWkUKKyNlcnJvciAiSW5zdWZmaWNpZW50IHNwYWNlIGFsbG9jYXRlZCBmb3Igd3JpdGUgYnVmZmVycy4iCisjZW5kaWYKKworI2RlZmluZSBTU0wzX01EX0NMSUVOVF9GSU5JU0hFRF9DT05TVAkiXHg0M1x4NENceDRFXHg1NCIKKyNkZWZpbmUgU1NMM19NRF9TRVJWRVJfRklOSVNIRURfQ09OU1QJIlx4NTNceDUyXHg1Nlx4NTIiCisKKyNkZWZpbmUgU1NMM19WRVJTSU9OCQkJMHgwMzAwCisjZGVmaW5lIFNTTDNfVkVSU0lPTl9NQUpPUgkJMHgwMworI2RlZmluZSBTU0wzX1ZFUlNJT05fTUlOT1IJCTB4MDAKKworI2RlZmluZSBTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQwkyMAorI2RlZmluZSBTU0wzX1JUX0FMRVJUCQkJMjEKKyNkZWZpbmUgU1NMM19SVF9IQU5EU0hBS0UJCTIyCisjZGVmaW5lIFNTTDNfUlRfQVBQTElDQVRJT05fREFUQQkyMworCisjZGVmaW5lIFNTTDNfQUxfV0FSTklORwkJCTEKKyNkZWZpbmUgU1NMM19BTF9GQVRBTAkJCTIKKworI2RlZmluZSBTU0wzX0FEX0NMT1NFX05PVElGWQkJIDAKKyNkZWZpbmUgU1NMM19BRF9VTkVYUEVDVEVEX01FU1NBR0UJMTAJLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMM19BRF9CQURfUkVDT1JEX01BQwkJMjAJLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMM19BRF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkUJMzAJLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRQk0MAkvKiBmYXRhbCAqLworI2RlZmluZSBTU0wzX0FEX05PX0NFUlRJRklDQVRFCQk0MQorI2RlZmluZSBTU0wzX0FEX0JBRF9DRVJUSUZJQ0FURQkJNDIKKyNkZWZpbmUgU1NMM19BRF9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURQk0MworI2RlZmluZSBTU0wzX0FEX0NFUlRJRklDQVRFX1JFVk9LRUQJNDQKKyNkZWZpbmUgU1NMM19BRF9DRVJUSUZJQ0FURV9FWFBJUkVECTQ1CisjZGVmaW5lIFNTTDNfQURfQ0VSVElGSUNBVEVfVU5LTk9XTgk0NgorI2RlZmluZSBTU0wzX0FEX0lMTEVHQUxfUEFSQU1FVEVSCTQ3CS8qIGZhdGFsICovCisKK3R5cGVkZWYgc3RydWN0IHNzbDNfcmVjb3JkX3N0CisJeworLypyICovCWludCB0eXBlOyAgICAgICAgICAgICAgIC8qIHR5cGUgb2YgcmVjb3JkICovCisvKnJ3Ki8JdW5zaWduZWQgaW50IGxlbmd0aDsgICAgLyogSG93IG1hbnkgYnl0ZXMgYXZhaWxhYmxlICovCisvKnIgKi8JdW5zaWduZWQgaW50IG9mZjsgICAgICAgLyogcmVhZC93cml0ZSBvZmZzZXQgaW50byAnYnVmJyAqLworLypydyovCXVuc2lnbmVkIGNoYXIgKmRhdGE7ICAgIC8qIHBvaW50ZXIgdG8gdGhlIHJlY29yZCBkYXRhICovCisvKnJ3Ki8JdW5zaWduZWQgY2hhciAqaW5wdXQ7ICAgLyogd2hlcmUgdGhlIGRlY29kZSBieXRlcyBhcmUgKi8KKy8qciAqLwl1bnNpZ25lZCBjaGFyICpjb21wOyAgICAvKiBvbmx5IHVzZWQgd2l0aCBkZWNvbXByZXNzaW9uIC0gbWFsbG9jKCllZCAqLworLypyICovICB1bnNpZ25lZCBsb25nIGVwb2NoOyAgICAvKiBlcG9jaCBudW1iZXIsIG5lZWRlZCBieSBEVExTMSAqLworLypyICovICB1bnNpZ25lZCBjaGFyIHNlcV9udW1bOF07IC8qIHNlcXVlbmNlIG51bWJlciwgbmVlZGVkIGJ5IERUTFMxICovCisJfSBTU0wzX1JFQ09SRDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3NsM19idWZmZXJfc3QKKwl7CisJdW5zaWduZWQgY2hhciAqYnVmOyAgICAgLyogYXQgbGVhc3QgU1NMM19SVF9NQVhfUEFDS0VUX1NJWkUgYnl0ZXMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICogc2VlIHNzbDNfc2V0dXBfYnVmZmVycygpICovCisJc2l6ZV90IGxlbjsgICAgICAgICAgICAgLyogYnVmZmVyIHNpemUgKi8KKwlpbnQgb2Zmc2V0OyAgICAgICAgICAgICAvKiB3aGVyZSB0byAnY29weSBmcm9tJyAqLworCWludCBsZWZ0OyAgICAgICAgICAgICAgIC8qIGhvdyBtYW55IGJ5dGVzIGxlZnQgKi8KKwl9IFNTTDNfQlVGRkVSOworCisjZGVmaW5lIFNTTDNfQ1RfUlNBX1NJR04JCQkxCisjZGVmaW5lIFNTTDNfQ1RfRFNTX1NJR04JCQkyCisjZGVmaW5lIFNTTDNfQ1RfUlNBX0ZJWEVEX0RICQkJMworI2RlZmluZSBTU0wzX0NUX0RTU19GSVhFRF9ESAkJCTQKKyNkZWZpbmUgU1NMM19DVF9SU0FfRVBIRU1FUkFMX0RICQk1CisjZGVmaW5lIFNTTDNfQ1RfRFNTX0VQSEVNRVJBTF9ESAkJNgorI2RlZmluZSBTU0wzX0NUX0ZPUlRFWlpBX0RNUwkJCTIwCisvKiBTU0wzX0NUX05VTUJFUiBpcyB1c2VkIHRvIHNpemUgYXJyYXlzIGFuZCBpdCBtdXN0IGJlIGxhcmdlCisgKiBlbm91Z2ggdG8gY29udGFpbiBhbGwgb2YgdGhlIGNlcnQgdHlwZXMgZGVmaW5lZCBlaXRoZXIgZm9yCisgKiBTU0x2MyBhbmQgVExTdjEuCisgKi8KKyNkZWZpbmUgU1NMM19DVF9OVU1CRVIJCQk5CisKKworI2RlZmluZSBTU0wzX0ZMQUdTX05PX1JFTkVHT1RJQVRFX0NJUEhFUlMJMHgwMDAxCisjZGVmaW5lIFNTTDNfRkxBR1NfREVMQVlfQ0xJRU5UX0ZJTklTSEVECTB4MDAwMgorI2RlZmluZSBTU0wzX0ZMQUdTX1BPUF9CVUZGRVIJCQkweDAwMDQKKyNkZWZpbmUgVExTMV9GTEFHU19UTFNfUEFERElOR19CVUcJCTB4MDAwOAorI2RlZmluZSBUTFMxX0ZMQUdTX1NLSVBfQ0VSVF9WRVJJRlkJCTB4MDAxMAorCit0eXBlZGVmIHN0cnVjdCBzc2wzX3N0YXRlX3N0CisJeworCWxvbmcgZmxhZ3M7CisJaW50IGRlbGF5X2J1Zl9wb3BfcmV0OworCisJdW5zaWduZWQgY2hhciByZWFkX3NlcXVlbmNlWzhdOworCWludCByZWFkX21hY19zZWNyZXRfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHJlYWRfbWFjX3NlY3JldFtFVlBfTUFYX01EX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgd3JpdGVfc2VxdWVuY2VbOF07CisJaW50IHdyaXRlX21hY19zZWNyZXRfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIHdyaXRlX21hY19zZWNyZXRbRVZQX01BWF9NRF9TSVpFXTsKKworCXVuc2lnbmVkIGNoYXIgc2VydmVyX3JhbmRvbVtTU0wzX1JBTkRPTV9TSVpFXTsKKwl1bnNpZ25lZCBjaGFyIGNsaWVudF9yYW5kb21bU1NMM19SQU5ET01fU0laRV07CisKKwkvKiBmbGFncyBmb3IgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBrbm93bi1JViB3ZWFrbmVzcyAqLworCWludCBuZWVkX2VtcHR5X2ZyYWdtZW50czsKKwlpbnQgZW1wdHlfZnJhZ21lbnRfZG9uZTsKKworCS8qIFRoZSB2YWx1ZSBvZiAnZXh0cmEnIHdoZW4gdGhlIGJ1ZmZlcnMgd2VyZSBpbml0aWFsaXplZCAqLworCWludCBpbml0X2V4dHJhOworCisJU1NMM19CVUZGRVIgcmJ1ZjsJLyogcmVhZCBJTyBnb2VzIGludG8gaGVyZSAqLworCVNTTDNfQlVGRkVSIHdidWY7CS8qIHdyaXRlIElPIGdvZXMgaW50byBoZXJlICovCisKKwlTU0wzX1JFQ09SRCBycmVjOwkvKiBlYWNoIGRlY29kZWQgcmVjb3JkIGdvZXMgaW4gaGVyZSAqLworCVNTTDNfUkVDT1JEIHdyZWM7CS8qIGdvZXMgb3V0IGZyb20gaGVyZSAqLworCisJLyogc3RvcmFnZSBmb3IgQWxlcnQvSGFuZHNoYWtlIHByb3RvY29sIGRhdGEgcmVjZWl2ZWQgYnV0IG5vdAorCSAqIHlldCBwcm9jZXNzZWQgYnkgc3NsM19yZWFkX2J5dGVzOiAqLworCXVuc2lnbmVkIGNoYXIgYWxlcnRfZnJhZ21lbnRbMl07CisJdW5zaWduZWQgaW50IGFsZXJ0X2ZyYWdtZW50X2xlbjsKKwl1bnNpZ25lZCBjaGFyIGhhbmRzaGFrZV9mcmFnbWVudFs0XTsKKwl1bnNpZ25lZCBpbnQgaGFuZHNoYWtlX2ZyYWdtZW50X2xlbjsKKworCS8qIHBhcnRpYWwgd3JpdGUgLSBjaGVjayB0aGUgbnVtYmVycyBtYXRjaCAqLworCXVuc2lnbmVkIGludCB3bnVtOwkvKiBudW1iZXIgb2YgYnl0ZXMgc2VudCBzbyBmYXIgKi8KKwlpbnQgd3BlbmRfdG90OwkJLyogbnVtYmVyIGJ5dGVzIHdyaXR0ZW4gKi8KKwlpbnQgd3BlbmRfdHlwZTsKKwlpbnQgd3BlbmRfcmV0OwkJLyogbnVtYmVyIG9mIGJ5dGVzIHN1Ym1pdHRlZCAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKndwZW5kX2J1ZjsKKworCS8qIHVzZWQgZHVyaW5nIHN0YXJ0dXAsIGRpZ2VzdCBhbGwgaW5jb21pbmcvb3V0Z29pbmcgcGFja2V0cyAqLworCUJJTyAqaGFuZHNoYWtlX2J1ZmZlcjsKKwkvKiBXaGVuIHNldCBvZiBoYW5kc2hha2UgZGlnZXN0cyBpcyBkZXRlcm1pbmVkLCBidWZmZXIgaXMgaGFzaGVkCisJICogYW5kIGZyZWVkIGFuZCBNRF9DVFgtZXMgZm9yIGFsbCByZXF1aXJlZCBkaWdlc3RzIGFyZSBzdG9yZWQgaW4KKwkgKiB0aGlzIGFycmF5ICovCisJRVZQX01EX0NUWCAqKmhhbmRzaGFrZV9kZ3N0OworCS8qIHRoaXMgaXMgc2V0IHdoZW5lcnZlciB3ZSBzZWUgYSBjaGFuZ2VfY2lwaGVyX3NwZWMgbWVzc2FnZQorCSAqIGNvbWUgaW4gd2hlbiB3ZSBhcmUgbm90IGxvb2tpbmcgZm9yIG9uZSAqLworCWludCBjaGFuZ2VfY2lwaGVyX3NwZWM7CisKKwlpbnQgd2Fybl9hbGVydDsKKwlpbnQgZmF0YWxfYWxlcnQ7CisJLyogd2UgYWxsb3cgb25lIGZhdGFsIGFuZCBvbmUgd2FybmluZyBhbGVydCB0byBiZSBvdXRzdGFuZGluZywKKwkgKiBzZW5kIGNsb3NlIGFsZXJ0IHZpYSB0aGUgd2FybmluZyBhbGVydCAqLworCWludCBhbGVydF9kaXNwYXRjaDsKKwl1bnNpZ25lZCBjaGFyIHNlbmRfYWxlcnRbMl07CisKKwkvKiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gd2Ugc2hvdWxkIHJlbmVnb3RpYXRlIEFTQVAsIGJhc2ljYWxseSB3aGVuCisJICogdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGluIHRoZSByZWFkIG9yIHdyaXRlIGJ1ZmZlcnMgKi8KKwlpbnQgcmVuZWdvdGlhdGU7CisJaW50IHRvdGFsX3JlbmVnb3RpYXRpb25zOworCWludCBudW1fcmVuZWdvdGlhdGlvbnM7CisKKwlpbnQgaW5fcmVhZF9hcHBfZGF0YTsKKworCS8qIE9wYXF1ZSBQUkYgaW5wdXQgYXMgdXNlZCBmb3IgdGhlIGN1cnJlbnQgaGFuZHNoYWtlLgorCSAqIFRoZXNlIGZpZWxkcyBhcmUgdXNlZCBvbmx5IGlmIFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQgaXMgZGVmaW5lZAorCSAqIChvdGhlcndpc2UsIHRoZXkgYXJlIG1lcmVseSBwcmVzZW50IHRvIGltcHJvdmUgYmluYXJ5IGNvbXBhdGliaWxpdHkpICovCisJdm9pZCAqY2xpZW50X29wYXF1ZV9wcmZfaW5wdXQ7CisJc2l6ZV90IGNsaWVudF9vcGFxdWVfcHJmX2lucHV0X2xlbjsKKwl2b2lkICpzZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dDsKKwlzaXplX3Qgc2VydmVyX29wYXF1ZV9wcmZfaW5wdXRfbGVuOworCisJc3RydWN0CXsKKwkJLyogYWN0dWFsbHkgb25seSBuZWVkcyB0byBiZSAxNisyMCAqLworCQl1bnNpZ25lZCBjaGFyIGNlcnRfdmVyaWZ5X21kW0VWUF9NQVhfTURfU0laRSoyXTsKKworCQkvKiBhY3R1YWxseSBvbmx5IG5lZWQgdG8gYmUgMTYrMjAgZm9yIFNTTHYzIGFuZCAxMiBmb3IgVExTICovCisJCXVuc2lnbmVkIGNoYXIgZmluaXNoX21kW0VWUF9NQVhfTURfU0laRSoyXTsKKwkJaW50IGZpbmlzaF9tZF9sZW47CisJCXVuc2lnbmVkIGNoYXIgcGVlcl9maW5pc2hfbWRbRVZQX01BWF9NRF9TSVpFKjJdOworCQlpbnQgcGVlcl9maW5pc2hfbWRfbGVuOworCQkKKwkJdW5zaWduZWQgbG9uZyBtZXNzYWdlX3NpemU7CisJCWludCBtZXNzYWdlX3R5cGU7CisKKwkJLyogdXNlZCB0byBob2xkIHRoZSBuZXcgY2lwaGVyIHdlIGFyZSBnb2luZyB0byB1c2UgKi8KKwkJY29uc3QgU1NMX0NJUEhFUiAqbmV3X2NpcGhlcjsKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCQlESCAqZGg7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJRUNfS0VZICplY2RoOyAvKiBob2xkcyBzaG9ydCBsaXZlZCBFQ0RIIGtleSAqLworI2VuZGlmCisKKwkJLyogdXNlZCB3aGVuIFNTTF9TVF9GTFVTSF9EQVRBIGlzIGVudGVyZWQgKi8KKwkJaW50IG5leHRfc3RhdGU7CQkJCisKKwkJaW50IHJldXNlX21lc3NhZ2U7CisKKwkJLyogdXNlZCBmb3IgY2VydGlmaWNhdGUgcmVxdWVzdHMgKi8KKwkJaW50IGNlcnRfcmVxOworCQlpbnQgY3R5cGVfbnVtOworCQljaGFyIGN0eXBlW1NTTDNfQ1RfTlVNQkVSXTsKKwkJU1RBQ0tfT0YoWDUwOV9OQU1FKSAqY2FfbmFtZXM7CisKKwkJaW50IHVzZV9yc2FfdG1wOworCisJCWludCBrZXlfYmxvY2tfbGVuZ3RoOworCQl1bnNpZ25lZCBjaGFyICprZXlfYmxvY2s7CisKKwkJY29uc3QgRVZQX0NJUEhFUiAqbmV3X3N5bV9lbmM7CisJCWNvbnN0IEVWUF9NRCAqbmV3X2hhc2g7CisJCWludCBuZXdfbWFjX3BrZXlfdHlwZTsKKwkJaW50IG5ld19tYWNfc2VjcmV0X3NpemU7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCQljb25zdCBTU0xfQ09NUCAqbmV3X2NvbXByZXNzaW9uOworI2Vsc2UKKwkJY2hhciAqbmV3X2NvbXByZXNzaW9uOworI2VuZGlmCisJCWludCBjZXJ0X3JlcXVlc3Q7CisJCX0gdG1wOworCisgICAgICAgIC8qIENvbm5lY3Rpb24gYmluZGluZyB0byBwcmV2ZW50IHJlbmVnb3RpYXRpb24gYXR0YWNrcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyIHByZXZpb3VzX2NsaWVudF9maW5pc2hlZFtFVlBfTUFYX01EX1NJWkVdOworICAgICAgICB1bnNpZ25lZCBjaGFyIHByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW47CisgICAgICAgIHVuc2lnbmVkIGNoYXIgcHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkW0VWUF9NQVhfTURfU0laRV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgcHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkX2xlbjsKKyAgICAgICAgaW50IHNlbmRfY29ubmVjdGlvbl9iaW5kaW5nOyAvKiBUT0RPRUtSICovCisJfSBTU0wzX1NUQVRFOworCisKKy8qIFNTTHYzICovCisvKmNsaWVudCAqLworLyogZXh0cmEgc3RhdGUgKi8KKyNkZWZpbmUgU1NMM19TVF9DV19GTFVTSAkJKDB4MTAwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NVVFRIUk9VR0hfQ09NUExFVEUJKDB4MTAxfFNTTF9TVF9DT05ORUNUKQorLyogd3JpdGUgdG8gc2VydmVyICovCisjZGVmaW5lIFNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19BCQkoMHgxMTB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19CCQkoMHgxMTF8U1NMX1NUX0NPTk5FQ1QpCisvKiByZWFkIGZyb20gc2VydmVyICovCisjZGVmaW5lIFNTTDNfU1RfQ1JfU1JWUl9IRUxMT19BCQkoMHgxMjB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfU1JWUl9IRUxMT19CCQkoMHgxMjF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIERUTFMxX1NUX0NSX0hFTExPX1ZFUklGWV9SRVFVRVNUX0EgKDB4MTI2fFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBEVExTMV9TVF9DUl9IRUxMT19WRVJJRllfUkVRVUVTVF9CICgweDEyN3xTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9DRVJUX0EJCSgweDEzMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9DRVJUX0IJCSgweDEzMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9LRVlfRVhDSF9BCQkoMHgxNDB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfS0VZX0VYQ0hfQgkJKDB4MTQxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX0NFUlRfUkVRX0EJCSgweDE1MHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9DRVJUX1JFUV9CCQkoMHgxNTF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfU1JWUl9ET05FX0EJCSgweDE2MHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9TUlZSX0RPTkVfQgkJKDB4MTYxfFNTTF9TVF9DT05ORUNUKQorLyogd3JpdGUgdG8gc2VydmVyICovCisjZGVmaW5lIFNTTDNfU1RfQ1dfQ0VSVF9BCQkoMHgxNzB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfQ0VSVF9CCQkoMHgxNzF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfQ0VSVF9DCQkoMHgxNzJ8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfQ0VSVF9ECQkoMHgxNzN8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfS0VZX0VYQ0hfQQkJKDB4MTgwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NXX0tFWV9FWENIX0IJCSgweDE4MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19DRVJUX1ZSRllfQQkJKDB4MTkwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NXX0NFUlRfVlJGWV9CCQkoMHgxOTF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfQ0hBTkdFX0EJCSgweDFBMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19DSEFOR0VfQgkJKDB4MUExfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NXX0ZJTklTSEVEX0EJCSgweDFCMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19GSU5JU0hFRF9CCQkoMHgxQjF8U1NMX1NUX0NPTk5FQ1QpCisvKiByZWFkIGZyb20gc2VydmVyICovCisjZGVmaW5lIFNTTDNfU1RfQ1JfQ0hBTkdFX0EJCSgweDFDMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9DSEFOR0VfQgkJKDB4MUMxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX0ZJTklTSEVEX0EJCSgweDFEMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9GSU5JU0hFRF9CCQkoMHgxRDF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQQkoMHgxRTB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQgkoMHgxRTF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfQ0VSVF9TVEFUVVNfQQkoMHgxRjB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfQ0VSVF9TVEFUVVNfQgkoMHgxRjF8U1NMX1NUX0NPTk5FQ1QpCisKKy8qIHNlcnZlciAqLworLyogZXh0cmEgc3RhdGUgKi8KKyNkZWZpbmUgU1NMM19TVF9TV19GTFVTSAkJKDB4MTAwfFNTTF9TVF9BQ0NFUFQpCisvKiByZWFkIGZyb20gY2xpZW50ICovCisvKiBEbyBub3QgY2hhbmdlIHRoZSBudW1iZXIgdmFsdWVzLCB0aGV5IGRvIG1hdHRlciAqLworI2RlZmluZSBTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQQkJKDB4MTEwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19CCQkoMHgxMTF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9DTE5UX0hFTExPX0MJCSgweDExMnxTU0xfU1RfQUNDRVBUKQorLyogd3JpdGUgdG8gY2xpZW50ICovCisjZGVmaW5lIERUTFMxX1NUX1NXX0hFTExPX1ZFUklGWV9SRVFVRVNUX0EgKDB4MTEzfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIERUTFMxX1NUX1NXX0hFTExPX1ZFUklGWV9SRVFVRVNUX0IgKDB4MTE0fFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0EJCSgweDEyMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9CCQkoMHgxMjF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19IRUxMT19SRVFfQwkJKDB4MTIyfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfU1JWUl9IRUxMT19BCQkoMHgxMzB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19TUlZSX0hFTExPX0IJCSgweDEzMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0NFUlRfQQkJKDB4MTQwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfQ0VSVF9CCQkoMHgxNDF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19LRVlfRVhDSF9BCQkoMHgxNTB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19LRVlfRVhDSF9CCQkoMHgxNTF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19DRVJUX1JFUV9BCQkoMHgxNjB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19DRVJUX1JFUV9CCQkoMHgxNjF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19TUlZSX0RPTkVfQQkJKDB4MTcwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfU1JWUl9ET05FX0IJCSgweDE3MXxTU0xfU1RfQUNDRVBUKQorLyogcmVhZCBmcm9tIGNsaWVudCAqLworI2RlZmluZSBTU0wzX1NUX1NSX0NFUlRfQQkJKDB4MTgwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1JfQ0VSVF9CCQkoMHgxODF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9LRVlfRVhDSF9BCQkoMHgxOTB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9LRVlfRVhDSF9CCQkoMHgxOTF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9DRVJUX1ZSRllfQQkJKDB4MUEwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1JfQ0VSVF9WUkZZX0IJCSgweDFBMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NSX0NIQU5HRV9BCQkoMHgxQjB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9DSEFOR0VfQgkJKDB4MUIxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1JfRklOSVNIRURfQQkJKDB4MUMwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1JfRklOSVNIRURfQgkJKDB4MUMxfFNTTF9TVF9BQ0NFUFQpCisvKiB3cml0ZSB0byBjbGllbnQgKi8KKyNkZWZpbmUgU1NMM19TVF9TV19DSEFOR0VfQQkJKDB4MUQwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfQ0hBTkdFX0IJCSgweDFEMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0ZJTklTSEVEX0EJCSgweDFFMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0ZJTklTSEVEX0IJCSgweDFFMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0EJKDB4MUYwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfU0VTU0lPTl9USUNLRVRfQgkoMHgxRjF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19DRVJUX1NUQVRVU19BCSgweDIwMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0NFUlRfU1RBVFVTX0IJKDB4MjAxfFNTTF9TVF9BQ0NFUFQpCisKKyNkZWZpbmUgU1NMM19NVF9IRUxMT19SRVFVRVNUCQkJMAorI2RlZmluZSBTU0wzX01UX0NMSUVOVF9IRUxMTwkJCTEKKyNkZWZpbmUgU1NMM19NVF9TRVJWRVJfSEVMTE8JCQkyCisjZGVmaW5lCVNTTDNfTVRfTkVXU0VTU0lPTl9USUNLRVQJCTQKKyNkZWZpbmUgU1NMM19NVF9DRVJUSUZJQ0FURQkJCTExCisjZGVmaW5lIFNTTDNfTVRfU0VSVkVSX0tFWV9FWENIQU5HRQkJMTIKKyNkZWZpbmUgU1NMM19NVF9DRVJUSUZJQ0FURV9SRVFVRVNUCQkxMworI2RlZmluZSBTU0wzX01UX1NFUlZFUl9ET05FCQkJMTQKKyNkZWZpbmUgU1NMM19NVF9DRVJUSUZJQ0FURV9WRVJJRlkJCTE1CisjZGVmaW5lIFNTTDNfTVRfQ0xJRU5UX0tFWV9FWENIQU5HRQkJMTYKKyNkZWZpbmUgU1NMM19NVF9GSU5JU0hFRAkJCTIwCisjZGVmaW5lIFNTTDNfTVRfQ0VSVElGSUNBVEVfU1RBVFVTCQkyMgorI2RlZmluZSBEVExTMV9NVF9IRUxMT19WRVJJRllfUkVRVUVTVCAgICAzCisKKworI2RlZmluZSBTU0wzX01UX0NDUwkJCQkxCisKKy8qIFRoZXNlIGFyZSB1c2VkIHdoZW4gY2hhbmdpbmcgb3ZlciB0byBhIG5ldyBjaXBoZXIgKi8KKyNkZWZpbmUgU1NMM19DQ19SRUFECQkweDAxCisjZGVmaW5lIFNTTDNfQ0NfV1JJVEUJCTB4MDIKKyNkZWZpbmUgU1NMM19DQ19DTElFTlQJCTB4MTAKKyNkZWZpbmUgU1NMM19DQ19TRVJWRVIJCTB4MjAKKyNkZWZpbmUgU1NMM19DSEFOR0VfQ0lQSEVSX0NMSUVOVF9XUklURQkoU1NMM19DQ19DTElFTlR8U1NMM19DQ19XUklURSkJCisjZGVmaW5lIFNTTDNfQ0hBTkdFX0NJUEhFUl9TRVJWRVJfUkVBRAkoU1NMM19DQ19TRVJWRVJ8U1NMM19DQ19SRUFEKQorI2RlZmluZSBTU0wzX0NIQU5HRV9DSVBIRVJfQ0xJRU5UX1JFQUQJKFNTTDNfQ0NfQ0xJRU5UfFNTTDNfQ0NfUkVBRCkKKyNkZWZpbmUgU1NMM19DSEFOR0VfQ0lQSEVSX1NFUlZFUl9XUklURQkoU1NMM19DQ19TRVJWRVJ8U1NMM19DQ19XUklURSkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzNWU1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCkBAIC0wLDAgKzEsMTA4IEBACisvKiBjcnlwdG8vc3RhY2svc3RhY2suaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9TVEFDS19ICisjZGVmaW5lIEhFQURFUl9TVEFDS19ICisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHN0YWNrX3N0CisJeworCWludCBudW07CisJY2hhciAqKmRhdGE7CisJaW50IHNvcnRlZDsKKworCWludCBudW1fYWxsb2M7CisJaW50ICgqY29tcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopOworCX0gX1NUQUNLOyAgLyogVXNlIFNUQUNLX09GKC4uLikgaW5zdGVhZCAqLworCisjZGVmaW5lIE1fc2tfbnVtKHNrKQkJKChzaykgPyAoc2spLT5udW06LTEpCisjZGVmaW5lIE1fc2tfdmFsdWUoc2ssbikJKChzaykgPyAoc2spLT5kYXRhW25dIDogTlVMTCkKKworaW50IHNrX251bShjb25zdCBfU1RBQ0sgKik7Cit2b2lkICpza192YWx1ZShjb25zdCBfU1RBQ0sgKiwgaW50KTsKKwordm9pZCAqc2tfc2V0KF9TVEFDSyAqLCBpbnQsIHZvaWQgKik7CisKK19TVEFDSyAqc2tfbmV3KGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKK19TVEFDSyAqc2tfbmV3X251bGwodm9pZCk7Cit2b2lkIHNrX2ZyZWUoX1NUQUNLICopOwordm9pZCBza19wb3BfZnJlZShfU1RBQ0sgKnN0LCB2b2lkICgqZnVuYykodm9pZCAqKSk7CitpbnQgc2tfaW5zZXJ0KF9TVEFDSyAqc2ssIHZvaWQgKmRhdGEsIGludCB3aGVyZSk7Cit2b2lkICpza19kZWxldGUoX1NUQUNLICpzdCwgaW50IGxvYyk7Cit2b2lkICpza19kZWxldGVfcHRyKF9TVEFDSyAqc3QsIHZvaWQgKnApOworaW50IHNrX2ZpbmQoX1NUQUNLICpzdCwgdm9pZCAqZGF0YSk7CitpbnQgc2tfZmluZF9leChfU1RBQ0sgKnN0LCB2b2lkICpkYXRhKTsKK2ludCBza19wdXNoKF9TVEFDSyAqc3QsIHZvaWQgKmRhdGEpOworaW50IHNrX3Vuc2hpZnQoX1NUQUNLICpzdCwgdm9pZCAqZGF0YSk7Cit2b2lkICpza19zaGlmdChfU1RBQ0sgKnN0KTsKK3ZvaWQgKnNrX3BvcChfU1RBQ0sgKnN0KTsKK3ZvaWQgc2tfemVybyhfU1RBQ0sgKnN0KTsKK2ludCAoKnNrX3NldF9jbXBfZnVuYyhfU1RBQ0sgKnNrLCBpbnQgKCpjKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpKQorCShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CitfU1RBQ0sgKnNrX2R1cChfU1RBQ0sgKnN0KTsKK3ZvaWQgc2tfc29ydChfU1RBQ0sgKnN0KTsKK2ludCBza19pc19zb3J0ZWQoY29uc3QgX1NUQUNLICpzdCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZkNGE4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCkBAIC0wLDAgKzEsNDQ5IEBACisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX1NZTUhBQ0tTX0gKKyNkZWZpbmUgSEVBREVSX1NZTUhBQ0tTX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworLyogSGFja3MgdG8gc29sdmUgdGhlIHByb2JsZW0gd2l0aCBsaW5rZXJzIGluY2FwYWJsZSBvZiBoYW5kbGluZyB2ZXJ5IGxvbmcKKyAgIHN5bWJvbCBuYW1lcy4gIEluIHRoZSBjYXNlIG9mIFZNUywgdGhlIGxpbWl0IGlzIDMxIGNoYXJhY3RlcnMgb24gVk1TIGZvcgorICAgVkFYLiAqLworLyogTm90ZSB0aGF0IHRoaXMgYWZmZWN0cyB1dGlsL2xpYmVheS5udW0gYW5kIHV0aWwvc3NsZWF5Lm51bS4uLiAgeW91IG1heQorICAgY2hhbmdlIHRob3NlIG1hbnVhbGx5LCBidXQgdGhhdCdzIG5vdCByZWNvbW1lbmRlZCwgYXMgdGhvc2UgZmlsZXMgYXJlCisgICBjb250cm9sbGVkIGNlbnRyYWxseSBhbmQgdXBkYXRlZCBvbiBVbml4LCBhbmQgdGhlIGNlbnRyYWwgZGVmaW5pdGlvbgorICAgbWF5IGRpc2FncmVlIHdpdGggeW91cnMsIHdoaWNoIGluIHR1cm4gbWF5IGNvbWUgd2l0aCBzaGFyZWFibGUgbGlicmFyeQorICAgaW5jb21wYXRpYmlsaXRpZXMuICovCisjaWZkZWYgT1BFTlNTTF9TWVNfVk1TCisKKy8qIEhhY2sgYSBsb25nIG5hbWUgaW4gY3J5cHRvL2V4X2RhdGEuYyAqLworI3VuZGVmIENSWVBUT19nZXRfZXhfZGF0YV9pbXBsZW1lbnRhdGlvbgorI2RlZmluZSBDUllQVE9fZ2V0X2V4X2RhdGFfaW1wbGVtZW50YXRpb24JQ1JZUFRPX2dldF9leF9kYXRhX2ltcGwKKyN1bmRlZiBDUllQVE9fc2V0X2V4X2RhdGFfaW1wbGVtZW50YXRpb24KKyNkZWZpbmUgQ1JZUFRPX3NldF9leF9kYXRhX2ltcGxlbWVudGF0aW9uCUNSWVBUT19zZXRfZXhfZGF0YV9pbXBsCisKKy8qIEhhY2sgYSBsb25nIG5hbWUgaW4gY3J5cHRvL2FzbjEvYV9tYnN0ci5jICovCisjdW5kZWYgQVNOMV9TVFJJTkdfc2V0X2RlZmF1bHRfbWFza19hc2MKKyNkZWZpbmUgQVNOMV9TVFJJTkdfc2V0X2RlZmF1bHRfbWFza19hc2MJQVNOMV9TVFJJTkdfc2V0X2RlZl9tYXNrX2FzYworCisjaWYgMCAvKiBObyBsb25nZXIgbmVlZGVkLCBzaW5jZSBzYWZlc3RhY2sgbWFjcm8gbWFnaWMgZG9lcyB0aGUgam9iICovCisvKiBIYWNrIHRoZSBuYW1lcyBjcmVhdGVkIHdpdGggREVDTEFSRV9BU04xX1NFVF9PRihQS0NTN19TSUdORVJfSU5GTykgKi8KKyN1bmRlZiBpMmRfQVNOMV9TRVRfT0ZfUEtDUzdfU0lHTkVSX0lORk8KKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX1BLQ1M3X1NJR05FUl9JTkZPCWkyZF9BU04xX1NFVF9PRl9QS0NTN19TSUdJTkYKKyN1bmRlZiBkMmlfQVNOMV9TRVRfT0ZfUEtDUzdfU0lHTkVSX0lORk8KKyNkZWZpbmUgZDJpX0FTTjFfU0VUX09GX1BLQ1M3X1NJR05FUl9JTkZPCWQyaV9BU04xX1NFVF9PRl9QS0NTN19TSUdJTkYKKyNlbmRpZgorCisjaWYgMCAvKiBObyBsb25nZXIgbmVlZGVkLCBzaW5jZSBzYWZlc3RhY2sgbWFjcm8gbWFnaWMgZG9lcyB0aGUgam9iICovCisvKiBIYWNrIHRoZSBuYW1lcyBjcmVhdGVkIHdpdGggREVDTEFSRV9BU04xX1NFVF9PRihQS0NTN19SRUNJUF9JTkZPKSAqLworI3VuZGVmIGkyZF9BU04xX1NFVF9PRl9QS0NTN19SRUNJUF9JTkZPCisjZGVmaW5lIGkyZF9BU04xX1NFVF9PRl9QS0NTN19SRUNJUF9JTkZPCWkyZF9BU04xX1NFVF9PRl9QS0NTN19SRUNJTkYKKyN1bmRlZiBkMmlfQVNOMV9TRVRfT0ZfUEtDUzdfUkVDSVBfSU5GTworI2RlZmluZSBkMmlfQVNOMV9TRVRfT0ZfUEtDUzdfUkVDSVBfSU5GTwlkMmlfQVNOMV9TRVRfT0ZfUEtDUzdfUkVDSU5GCisjZW5kaWYKKworI2lmIDAgLyogTm8gbG9uZ2VyIG5lZWRlZCwgc2luY2Ugc2FmZXN0YWNrIG1hY3JvIG1hZ2ljIGRvZXMgdGhlIGpvYiAqLworLyogSGFjayB0aGUgbmFtZXMgY3JlYXRlZCB3aXRoIERFQ0xBUkVfQVNOMV9TRVRfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKSAqLworI3VuZGVmIGkyZF9BU04xX1NFVF9PRl9BQ0NFU1NfREVTQ1JJUFRJT04KKyNkZWZpbmUgaTJkX0FTTjFfU0VUX09GX0FDQ0VTU19ERVNDUklQVElPTglpMmRfQVNOMV9TRVRfT0ZfQUNDX0RFU0MKKyN1bmRlZiBkMmlfQVNOMV9TRVRfT0ZfQUNDRVNTX0RFU0NSSVBUSU9OCisjZGVmaW5lIGQyaV9BU04xX1NFVF9PRl9BQ0NFU1NfREVTQ1JJUFRJT04JZDJpX0FTTjFfU0VUX09GX0FDQ19ERVNDCisjZW5kaWYKKworLyogSGFjayB0aGUgbmFtZXMgY3JlYXRlZCB3aXRoIERFQ0xBUkVfUEVNX3J3KE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0UpICovCisjdW5kZWYgUEVNX3JlYWRfTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRQorI2RlZmluZSBQRU1fcmVhZF9ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFCQlQRU1fcmVhZF9OU19DRVJUX1NFUQorI3VuZGVmIFBFTV93cml0ZV9ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFCisjZGVmaW5lIFBFTV93cml0ZV9ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFCVBFTV93cml0ZV9OU19DRVJUX1NFUQorI3VuZGVmIFBFTV9yZWFkX2Jpb19ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFCisjZGVmaW5lIFBFTV9yZWFkX2Jpb19ORVRTQ0FQRV9DRVJUX1NFUVVFTkNFCVBFTV9yZWFkX2Jpb19OU19DRVJUX1NFUQorI3VuZGVmIFBFTV93cml0ZV9iaW9fTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRQorI2RlZmluZSBQRU1fd3JpdGVfYmlvX05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UJUEVNX3dyaXRlX2Jpb19OU19DRVJUX1NFUQorI3VuZGVmIFBFTV93cml0ZV9jYl9iaW9fTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRQorI2RlZmluZSBQRU1fd3JpdGVfY2JfYmlvX05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UJUEVNX3dyaXRlX2NiX2Jpb19OU19DRVJUX1NFUQorCisvKiBIYWNrIHRoZSBuYW1lcyBjcmVhdGVkIHdpdGggREVDTEFSRV9QRU1fcncoUEtDUzhfUFJJVl9LRVlfSU5GTykgKi8KKyN1bmRlZiBQRU1fcmVhZF9QS0NTOF9QUklWX0tFWV9JTkZPCisjZGVmaW5lIFBFTV9yZWFkX1BLQ1M4X1BSSVZfS0VZX0lORk8JCVBFTV9yZWFkX1A4X1BSSVZfS0VZX0lORk8KKyN1bmRlZiBQRU1fd3JpdGVfUEtDUzhfUFJJVl9LRVlfSU5GTworI2RlZmluZSBQRU1fd3JpdGVfUEtDUzhfUFJJVl9LRVlfSU5GTwkJUEVNX3dyaXRlX1A4X1BSSVZfS0VZX0lORk8KKyN1bmRlZiBQRU1fcmVhZF9iaW9fUEtDUzhfUFJJVl9LRVlfSU5GTworI2RlZmluZSBQRU1fcmVhZF9iaW9fUEtDUzhfUFJJVl9LRVlfSU5GTwlQRU1fcmVhZF9iaW9fUDhfUFJJVl9LRVlfSU5GTworI3VuZGVmIFBFTV93cml0ZV9iaW9fUEtDUzhfUFJJVl9LRVlfSU5GTworI2RlZmluZSBQRU1fd3JpdGVfYmlvX1BLQ1M4X1BSSVZfS0VZX0lORk8JUEVNX3dyaXRlX2Jpb19QOF9QUklWX0tFWV9JTkZPCisjdW5kZWYgUEVNX3dyaXRlX2NiX2Jpb19QS0NTOF9QUklWX0tFWV9JTkZPCisjZGVmaW5lIFBFTV93cml0ZV9jYl9iaW9fUEtDUzhfUFJJVl9LRVlfSU5GTwlQRU1fd3J0X2NiX2Jpb19QOF9QUklWX0tFWV9JTkZPCisKKy8qIEhhY2sgb3RoZXIgUEVNIG5hbWVzICovCisjdW5kZWYgUEVNX3dyaXRlX2Jpb19QS0NTOFByaXZhdGVLZXlfbmlkCisjZGVmaW5lIFBFTV93cml0ZV9iaW9fUEtDUzhQcml2YXRlS2V5X25pZAlQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdktleV9uaWQKKworLyogSGFjayBzb21lIGxvbmcgWDUwOSBuYW1lcyAqLworI3VuZGVmIFg1MDlfUkVWT0tFRF9nZXRfZXh0X2J5X2NyaXRpY2FsCisjZGVmaW5lIFg1MDlfUkVWT0tFRF9nZXRfZXh0X2J5X2NyaXRpY2FsCVg1MDlfUkVWT0tFRF9nZXRfZXh0X2J5X2NyaXRpYworI3VuZGVmIFg1MDlfcG9saWN5X3RyZWVfZ2V0MF91c2VyX3BvbGljaWVzCisjZGVmaW5lIFg1MDlfcG9saWN5X3RyZWVfZ2V0MF91c2VyX3BvbGljaWVzCVg1MDlfcGN5X3RyZWVfZ2V0MF91c3JfcG9saWNpZXMKKyN1bmRlZiBYNTA5X3BvbGljeV9ub2RlX2dldDBfcXVhbGlmaWVycworI2RlZmluZSBYNTA5X3BvbGljeV9ub2RlX2dldDBfcXVhbGlmaWVycwlYNTA5X3BjeV9ub2RlX2dldDBfcXVhbGlmaWVycworI3VuZGVmIFg1MDlfU1RPUkVfQ1RYX2dldF9leHBsaWNpdF9wb2xpY3kKKyNkZWZpbmUgWDUwOV9TVE9SRV9DVFhfZ2V0X2V4cGxpY2l0X3BvbGljeQlYNTA5X1NUT1JFX0NUWF9nZXRfZXhwbF9wb2xpY3kKKyN1bmRlZiBYNTA5X1NUT1JFX0NUWF9nZXQwX2N1cnJlbnRfaXNzdWVyCisjZGVmaW5lIFg1MDlfU1RPUkVfQ1RYX2dldDBfY3VycmVudF9pc3N1ZXIJWDUwOV9TVE9SRV9DVFhfZ2V0MF9jdXJfaXNzdWVyCisKKy8qIEhhY2sgc29tZSBsb25nIENSWVBUTyBuYW1lcyAqLworI3VuZGVmIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrCisjZGVmaW5lIENSWVBUT19zZXRfZHlubG9ja19kZXN0cm95X2NhbGxiYWNrICAgICBDUllQVE9fc2V0X2R5bmxvY2tfZGVzdHJveV9jYgorI3VuZGVmIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2FsbGJhY2sKKyNkZWZpbmUgQ1JZUFRPX3NldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjayAgICAgIENSWVBUT19zZXRfZHlubG9ja19jcmVhdGVfY2IKKyN1bmRlZiBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjaworI2RlZmluZSBDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYWxsYmFjawlDUllQVE9fc2V0X2R5bmxvY2tfbG9ja19jYgorI3VuZGVmIENSWVBUT19nZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrCisjZGVmaW5lIENSWVBUT19nZXRfZHlubG9ja19sb2NrX2NhbGxiYWNrCUNSWVBUT19nZXRfZHlubG9ja19sb2NrX2NiCisjdW5kZWYgQ1JZUFRPX2dldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sKKyNkZWZpbmUgQ1JZUFRPX2dldF9keW5sb2NrX2Rlc3Ryb3lfY2FsbGJhY2sgICAgIENSWVBUT19nZXRfZHlubG9ja19kZXN0cm95X2NiCisjdW5kZWYgQ1JZUFRPX2dldF9keW5sb2NrX2NyZWF0ZV9jYWxsYmFjaworI2RlZmluZSBDUllQVE9fZ2V0X2R5bmxvY2tfY3JlYXRlX2NhbGxiYWNrICAgICAgQ1JZUFRPX2dldF9keW5sb2NrX2NyZWF0ZV9jYgorI3VuZGVmIENSWVBUT19zZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnMKKyNkZWZpbmUgQ1JZUFRPX3NldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucyAgICAgIENSWVBUT19zZXRfbG9ja2VkX21lbV9leF9mdW5jcworI3VuZGVmIENSWVBUT19nZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnMKKyNkZWZpbmUgQ1JZUFRPX2dldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucyAgICAgIENSWVBUT19nZXRfbG9ja2VkX21lbV9leF9mdW5jcworCisvKiBIYWNrIHNvbWUgbG9uZyBTU0wgbmFtZXMgKi8KKyN1bmRlZiBTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocworI2RlZmluZSBTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeV9wYXRocwlTU0xfQ1RYX3NldF9kZWZfdmVyaWZ5X3BhdGhzCisjdW5kZWYgU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeAorI2RlZmluZSBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4ICAgICAgU1NMX2dldF9leF9kX1g1MDlfU1RPUkVfQ1RYX2lkeAorI3VuZGVmIFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrCisjZGVmaW5lIFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrICAgICBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqc190b19zdGsKKyN1bmRlZiBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrCisjZGVmaW5lIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sgICAgICBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmpzX3RvX3N0aworI3VuZGVmIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUKKyNkZWZpbmUgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSAgICAgIFNTTF9DVFhfdXNlX2NlcnRfY2hhaW5fZmlsZQorI3VuZGVmIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrCisjZGVmaW5lIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrCVNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NiCisjdW5kZWYgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEKKyNkZWZpbmUgU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2JfdXNlcmRhdGEgIFNTTF9DVFhfc2V0X2RlZl9wYXNzd2RfY2JfdWQKKyN1bmRlZiBTU0xfQ09NUF9nZXRfY29tcHJlc3Npb25fbWV0aG9kcworI2RlZmluZSBTU0xfQ09NUF9nZXRfY29tcHJlc3Npb25fbWV0aG9kcwlTU0xfQ09NUF9nZXRfY29tcHJlc3NfbWV0aG9kcworCisjdW5kZWYgc3NsX2FkZF9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQKKyNkZWZpbmUgc3NsX2FkZF9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQJc3NsX2FkZF9jbGllbnRoZWxsb19yZW5lZ19leHQKKyN1bmRlZiBzc2xfYWRkX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dAorI2RlZmluZSBzc2xfYWRkX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dAlzc2xfYWRkX3NlcnZlcmhlbGxvX3JlbmVnX2V4dAorI3VuZGVmIHNzbF9wYXJzZV9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQKKyNkZWZpbmUgc3NsX3BhcnNlX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dAlzc2xfcGFyc2VfY2xpZW50aGVsbG9fcmVuZWdfZXh0CisjdW5kZWYgc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dAorI2RlZmluZSBzc2xfcGFyc2Vfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0CXNzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ19leHQKKworLyogSGFjayBzb21lIGxvbmcgRU5HSU5FIG5hbWVzICovCisjdW5kZWYgRU5HSU5FX2dldF9kZWZhdWx0X0JOX21vZF9leHBfY3J0CisjZGVmaW5lIEVOR0lORV9nZXRfZGVmYXVsdF9CTl9tb2RfZXhwX2NydAlFTkdJTkVfZ2V0X2RlZl9CTl9tb2RfZXhwX2NydAorI3VuZGVmIEVOR0lORV9zZXRfZGVmYXVsdF9CTl9tb2RfZXhwX2NydAorI2RlZmluZSBFTkdJTkVfc2V0X2RlZmF1bHRfQk5fbW9kX2V4cF9jcnQJRU5HSU5FX3NldF9kZWZfQk5fbW9kX2V4cF9jcnQKKyN1bmRlZiBFTkdJTkVfc2V0X2xvYWRfcHJpdmtleV9mdW5jdGlvbgorI2RlZmluZSBFTkdJTkVfc2V0X2xvYWRfcHJpdmtleV9mdW5jdGlvbglFTkdJTkVfc2V0X2xvYWRfcHJpdmtleV9mbgorI3VuZGVmIEVOR0lORV9nZXRfbG9hZF9wcml2a2V5X2Z1bmN0aW9uCisjZGVmaW5lIEVOR0lORV9nZXRfbG9hZF9wcml2a2V5X2Z1bmN0aW9uCUVOR0lORV9nZXRfbG9hZF9wcml2a2V5X2ZuCisjdW5kZWYgRU5HSU5FX3VucmVnaXN0ZXJfcGtleV9hc24xX21ldGhzCisjZGVmaW5lIEVOR0lORV91bnJlZ2lzdGVyX3BrZXlfYXNuMV9tZXRocwlFTkdJTkVfdW5yZWdfcGtleV9hc24xX21ldGhzCisjdW5kZWYgRU5HSU5FX3JlZ2lzdGVyX2FsbF9wa2V5X2FzbjFfbWV0aHMKKyNkZWZpbmUgRU5HSU5FX3JlZ2lzdGVyX2FsbF9wa2V5X2FzbjFfbWV0aHMJRU5HSU5FX3JlZ19hbGxfcGtleV9hc24xX21ldGhzCisjdW5kZWYgRU5HSU5FX3NldF9kZWZhdWx0X3BrZXlfYXNuMV9tZXRocworI2RlZmluZSBFTkdJTkVfc2V0X2RlZmF1bHRfcGtleV9hc24xX21ldGhzCUVOR0lORV9zZXRfZGVmX3BrZXlfYXNuMV9tZXRocworI3VuZGVmIEVOR0lORV9nZXRfcGtleV9hc24xX21ldGhfZW5naW5lCisjZGVmaW5lIEVOR0lORV9nZXRfcGtleV9hc24xX21ldGhfZW5naW5lCUVOR0lORV9nZXRfcGtleV9hc24xX21ldGhfZW5nCisjdW5kZWYgRU5HSU5FX3NldF9sb2FkX3NzbF9jbGllbnRfY2VydF9mdW5jdGlvbgorI2RlZmluZSBFTkdJTkVfc2V0X2xvYWRfc3NsX2NsaWVudF9jZXJ0X2Z1bmN0aW9uIFwKKwkJCQkJCUVOR0lORV9zZXRfbGRfc3NsX2NsbnRfY2VydF9mbgorI3VuZGVmIEVOR0lORV9nZXRfc3NsX2NsaWVudF9jZXJ0X2Z1bmN0aW9uCisjZGVmaW5lIEVOR0lORV9nZXRfc3NsX2NsaWVudF9jZXJ0X2Z1bmN0aW9uCUVOR0lORV9nZXRfc3NsX2NsaWVudF9jZXJ0X2ZuCisKKy8qIEhhY2sgc29tZSBsb25nIE9DU1AgbmFtZXMgKi8KKyN1bmRlZiBPQ1NQX1JFUVVFU1RfZ2V0X2V4dF9ieV9jcml0aWNhbAorI2RlZmluZSBPQ1NQX1JFUVVFU1RfZ2V0X2V4dF9ieV9jcml0aWNhbAlPQ1NQX1JFUVVFU1RfZ2V0X2V4dF9ieV9jcml0CisjdW5kZWYgT0NTUF9CQVNJQ1JFU1BfZ2V0X2V4dF9ieV9jcml0aWNhbAorI2RlZmluZSBPQ1NQX0JBU0lDUkVTUF9nZXRfZXh0X2J5X2NyaXRpY2FsICAgICAgT0NTUF9CQVNJQ1JFU1BfZ2V0X2V4dF9ieV9jcml0CisjdW5kZWYgT0NTUF9TSU5HTEVSRVNQX2dldF9leHRfYnlfY3JpdGljYWwKKyNkZWZpbmUgT0NTUF9TSU5HTEVSRVNQX2dldF9leHRfYnlfY3JpdGljYWwgICAgIE9DU1BfU0lOR0xFUkVTUF9nZXRfZXh0X2J5X2NyaXQKKworLyogSGFjayBzb21lIGxvbmcgREVTIG5hbWVzICovCisjdW5kZWYgX29zc2xfb2xkX2Rlc19lZGUzX2NmYjY0X2VuY3J5cHQKKyNkZWZpbmUgX29zc2xfb2xkX2Rlc19lZGUzX2NmYjY0X2VuY3J5cHQJX29zc2xfb2Rlc19lZGUzX2NmYjY0X2VuY3J5cHQKKyN1bmRlZiBfb3NzbF9vbGRfZGVzX2VkZTNfb2ZiNjRfZW5jcnlwdAorI2RlZmluZSBfb3NzbF9vbGRfZGVzX2VkZTNfb2ZiNjRfZW5jcnlwdAlfb3NzbF9vZGVzX2VkZTNfb2ZiNjRfZW5jcnlwdAorCisvKiBIYWNrIHNvbWUgbG9uZyBFVlAgbmFtZXMgKi8KKyN1bmRlZiBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYKKyNkZWZpbmUgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfbm9jb25mCU9QRU5TU0xfYWRkX2FsbF9hbGdvX25vY29uZgorI3VuZGVmIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX2NvbmYKKyNkZWZpbmUgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfY29uZgkJT1BFTlNTTF9hZGRfYWxsX2FsZ29fY29uZgorI3VuZGVmIEVWUF9QS0VZX21ldGhfc2V0X3ZlcmlmeV9yZWNvdmVyCisjZGVmaW5lIEVWUF9QS0VZX21ldGhfc2V0X3ZlcmlmeV9yZWNvdmVyCUVWUF9QS0VZX21ldGhfc2V0X3ZyZnlfcmVjb3ZlcgorCisvKiBIYWNrIHNvbWUgbG9uZyBFQyBuYW1lcyAqLworI3VuZGVmIEVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0KKyNkZWZpbmUgRUNfR1JPVVBfc2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybQlFQ19HUk9VUF9zZXRfcG9pbnRfY29udl9mb3JtCisjdW5kZWYgRUNfR1JPVVBfZ2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybQorI2RlZmluZSBFQ19HUk9VUF9nZXRfcG9pbnRfY29udmVyc2lvbl9mb3JtCUVDX0dST1VQX2dldF9wb2ludF9jb252X2Zvcm0KKyN1bmRlZiBFQ19HUk9VUF9jbGVhcl9mcmVlX2FsbF9leHRyYV9kYXRhCisjZGVmaW5lIEVDX0dST1VQX2NsZWFyX2ZyZWVfYWxsX2V4dHJhX2RhdGEJRUNfR1JPVVBfY2xyX2ZyZWVfYWxsX3h0cmFfZGF0YQorI3VuZGVmIEVDX1BPSU5UX3NldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAKKyNkZWZpbmUgRUNfUE9JTlRfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19QT0lOVF9zZXRfSnByb2pfY29vcmRzX0dGcAorI3VuZGVmIEVDX1BPSU5UX2dldF9KcHJvamVjdGl2ZV9jb29yZGluYXRlc19HRnAKKyNkZWZpbmUgRUNfUE9JTlRfZ2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19QT0lOVF9nZXRfSnByb2pfY29vcmRzX0dGcAorI3VuZGVmIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwCisjZGVmaW5lIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwICAgICBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3Jkc19HRnAKKyN1bmRlZiBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcAorI2RlZmluZSBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcCAgICAgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZHNfR0ZwCisjdW5kZWYgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwCisjZGVmaW5lIEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGcCBFQ19QT0lOVF9zZXRfY29tcHJfY29vcmRzX0dGcAorI3VuZGVmIEVDX1BPSU5UX3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQorI2RlZmluZSBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0gICAgRUNfUE9JTlRfc2V0X2FmZmluZV9jb29yZHNfR0YybQorI3VuZGVmIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQorI2RlZmluZSBFQ19QT0lOVF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0gICAgRUNfUE9JTlRfZ2V0X2FmZmluZV9jb29yZHNfR0YybQorI3VuZGVmIEVDX1BPSU5UX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzX0dGMm0KKyNkZWZpbmUgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0YybSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19QT0lOVF9zZXRfY29tcHJfY29vcmRzX0dGMm0KKyN1bmRlZiBlY19HRjJtX3NpbXBsZV9ncm91cF9jbGVhcl9maW5pc2gKKyNkZWZpbmUgZWNfR0YybV9zaW1wbGVfZ3JvdXBfY2xlYXJfZmluaXNoCWVjX0dGMm1fc2ltcGxlX2dycF9jbHJfZmluaXNoCisjdW5kZWYgZWNfR0YybV9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50CisjZGVmaW5lIGVjX0dGMm1fc2ltcGxlX2dyb3VwX2NoZWNrX2Rpc2NyaW1pbmFudAllY19HRjJtX3NpbXBsZV9ncnBfY2hrX2Rpc2NyaW0KKyN1bmRlZiBlY19HRjJtX3NpbXBsZV9wb2ludF9jbGVhcl9maW5pc2gKKyNkZWZpbmUgZWNfR0YybV9zaW1wbGVfcG9pbnRfY2xlYXJfZmluaXNoCWVjX0dGMm1fc2ltcGxlX3B0X2Nscl9maW5pc2gKKyN1bmRlZiBlY19HRjJtX3NpbXBsZV9wb2ludF9zZXRfdG9faW5maW5pdHkKKyNkZWZpbmUgZWNfR0YybV9zaW1wbGVfcG9pbnRfc2V0X3RvX2luZmluaXR5CWVjX0dGMm1fc2ltcGxlX3B0X3NldF90b19pbmYKKyN1bmRlZiBlY19HRjJtX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUKKyNkZWZpbmUgZWNfR0YybV9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lCWVjX0dGMm1fc2ltcGxlX3B0c19tYWtlX2FmZmluZQorI3VuZGVmIGVjX0dGMm1fc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMKKyNkZWZpbmUgZWNfR0YybV9zaW1wbGVfcG9pbnRfc2V0X2FmZmluZV9jb29yZGluYXRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRjJtX3NtcF9wdF9zZXRfYWZfY29vcmRzCisjdW5kZWYgZWNfR0YybV9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcworI2RlZmluZSBlY19HRjJtX3NpbXBsZV9wb2ludF9nZXRfYWZmaW5lX2Nvb3JkaW5hdGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGMm1fc21wX3B0X2dldF9hZl9jb29yZHMKKyN1bmRlZiBlY19HRjJtX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcworI2RlZmluZSBlY19HRjJtX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRjJtX3NtcF9zZXRfY29tcHJfY29vcmRzCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfY3VydmVfR0ZwCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2N1cnZlX0dGcCAgICAgICBlY19HRnBfc2ltcGxlX2dycF9zZXRfY3VydmVfR0ZwCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY3VydmVfR0ZwCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2N1cnZlX0dGcCAgICAgICBlY19HRnBfc2ltcGxlX2dycF9nZXRfY3VydmVfR0ZwCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9ncm91cF9jbGVhcl9maW5pc2gKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9ncm91cF9jbGVhcl9maW5pc2gJZWNfR0ZwX3NpbXBsZV9ncnBfY2xlYXJfZmluaXNoCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9ncm91cF9zZXRfZ2VuZXJhdG9yCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfZ3JvdXBfc2V0X2dlbmVyYXRvciAgICAgICBlY19HRnBfc2ltcGxlX2dycF9zZXRfZ2VuZXJhdG9yCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXQwX2dlbmVyYXRvcgorI2RlZmluZSBlY19HRnBfc2ltcGxlX2dyb3VwX2dldDBfZ2VuZXJhdG9yICAgICAgZWNfR0ZwX3NpbXBsZV9ncnBfZ3QwX2dlbmVyYXRvcgorI3VuZGVmIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2NvZmFjdG9yCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2NvZmFjdG9yCWVjX0dGcF9zaW1wbGVfZ3JwX2dldF9jb2ZhY3RvcgorI3VuZGVmIGVjX0dGcF9zaW1wbGVfcG9pbnRfY2xlYXJfZmluaXNoCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfcG9pbnRfY2xlYXJfZmluaXNoCWVjX0dGcF9zaW1wbGVfcHRfY2xlYXJfZmluaXNoCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfdG9faW5maW5pdHkKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfdG9faW5maW5pdHkgICAgIGVjX0dGcF9zaW1wbGVfcHRfc2V0X3RvX2luZgorI3VuZGVmIGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfcG9pbnRzX21ha2VfYWZmaW5lCWVjX0dGcF9zaW1wbGVfcHRzX21ha2VfYWZmaW5lCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9ncm91cF9nZXRfY3VydmVfR0ZwCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfZ3JvdXBfZ2V0X2N1cnZlX0dGcCAgICAgICBlY19HRnBfc2ltcGxlX2dycF9nZXRfY3VydmVfR0ZwCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9zZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfc2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc21wX3NldF9KcHJval9jb29yZHNfR0ZwCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9nZXRfSnByb2plY3RpdmVfY29vcmRpbmF0ZXNfR0ZwCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfZ2V0X0pwcm9qZWN0aXZlX2Nvb3JkaW5hdGVzX0dGcCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY19HRnBfc21wX2dldF9KcHJval9jb29yZHNfR0ZwCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGcAorI2RlZmluZSBlY19HRnBfc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zbXBfcHRfc2V0X2FmX2Nvb3Jkc19HRnAKKyN1bmRlZiBlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0ZwCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlc19HRnAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NtcF9wdF9nZXRfYWZfY29vcmRzX0dGcAorI3VuZGVmIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwCisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0ZwIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zbXBfc2V0X2NvbXByX2Nvb3Jkc19HRnAKKyN1bmRlZiBlY19HRnBfc2ltcGxlX3BvaW50X3NldF9hZmZpbmVfY29vcmRpbmF0ZXMKKyNkZWZpbmUgZWNfR0ZwX3NpbXBsZV9wb2ludF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zbXBfcHRfc2V0X2FmX2Nvb3JkcworI3VuZGVmIGVjX0dGcF9zaW1wbGVfcG9pbnRfZ2V0X2FmZmluZV9jb29yZGluYXRlcworI2RlZmluZSBlY19HRnBfc2ltcGxlX3BvaW50X2dldF9hZmZpbmVfY29vcmRpbmF0ZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNfR0ZwX3NtcF9wdF9nZXRfYWZfY29vcmRzCisjdW5kZWYgZWNfR0ZwX3NpbXBsZV9zZXRfY29tcHJlc3NlZF9jb29yZGluYXRlcworI2RlZmluZSBlY19HRnBfc2ltcGxlX3NldF9jb21wcmVzc2VkX2Nvb3JkaW5hdGVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjX0dGcF9zbXBfc2V0X2NvbXByX2Nvb3JkcworI3VuZGVmIGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50CisjZGVmaW5lIGVjX0dGcF9zaW1wbGVfZ3JvdXBfY2hlY2tfZGlzY3JpbWluYW50CWVjX0dGcF9zaW1wbGVfZ3JwX2Noa19kaXNjcmltCisKKy8qIEhhY2sgc29tIGxvbmcgU1RPUkUgbmFtZXMgKi8KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X2luaXRpYWxpc2VfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX3NldF9pbml0aWFsaXNlX2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X2luaXRpYWxpc2VfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X2NsZWFudXBfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX3NldF9jbGVhbnVwX2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X2NsZWFudXBfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X2dlbmVyYXRlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9zZXRfZ2VuZXJhdGVfZnVuY3Rpb24JU1RPUkVfbWV0aF9zZXRfZ2VuZXJhdGVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X21vZGlmeV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X21vZGlmeV9mdW5jdGlvbglTVE9SRV9tZXRoX3NldF9tb2RpZnlfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X3Jldm9rZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X3Jldm9rZV9mdW5jdGlvbglTVE9SRV9tZXRoX3NldF9yZXZva2VfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X2RlbGV0ZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X2RlbGV0ZV9mdW5jdGlvbglTVE9SRV9tZXRoX3NldF9kZWxldGVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X2xpc3Rfc3RhcnRfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX3NldF9saXN0X3N0YXJ0X2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X2xpc3Rfc3RhcnRfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X2xpc3RfbmV4dF9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X2xpc3RfbmV4dF9mdW5jdGlvbglTVE9SRV9tZXRoX3NldF9saXN0X25leHRfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X2xpc3RfZW5kX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9zZXRfbGlzdF9lbmRfZnVuY3Rpb24JU1RPUkVfbWV0aF9zZXRfbGlzdF9lbmRfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X3VwZGF0ZV9zdG9yZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X3VwZGF0ZV9zdG9yZV9mdW5jdGlvbglTVE9SRV9tZXRoX3NldF91cGRhdGVfc3RvcmVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X2xvY2tfc3RvcmVfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX3NldF9sb2NrX3N0b3JlX2Z1bmN0aW9uCVNUT1JFX21ldGhfc2V0X2xvY2tfc3RvcmVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2Rfc2V0X3VubG9ja19zdG9yZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2Rfc2V0X3VubG9ja19zdG9yZV9mdW5jdGlvbglTVE9SRV9tZXRoX3NldF91bmxvY2tfc3RvcmVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X2luaXRpYWxpc2VfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX2dldF9pbml0aWFsaXNlX2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X2luaXRpYWxpc2VfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X2NsZWFudXBfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX2dldF9jbGVhbnVwX2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X2NsZWFudXBfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X2dlbmVyYXRlX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9nZXRfZ2VuZXJhdGVfZnVuY3Rpb24JU1RPUkVfbWV0aF9nZXRfZ2VuZXJhdGVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X21vZGlmeV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X21vZGlmeV9mdW5jdGlvbglTVE9SRV9tZXRoX2dldF9tb2RpZnlfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X3Jldm9rZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X3Jldm9rZV9mdW5jdGlvbglTVE9SRV9tZXRoX2dldF9yZXZva2VfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X2RlbGV0ZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X2RlbGV0ZV9mdW5jdGlvbglTVE9SRV9tZXRoX2dldF9kZWxldGVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X2xpc3Rfc3RhcnRfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX2dldF9saXN0X3N0YXJ0X2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X2xpc3Rfc3RhcnRfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X2xpc3RfbmV4dF9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X2xpc3RfbmV4dF9mdW5jdGlvbglTVE9SRV9tZXRoX2dldF9saXN0X25leHRfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X2xpc3RfZW5kX2Z1bmN0aW9uCisjZGVmaW5lIFNUT1JFX21ldGhvZF9nZXRfbGlzdF9lbmRfZnVuY3Rpb24JU1RPUkVfbWV0aF9nZXRfbGlzdF9lbmRfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X3VwZGF0ZV9zdG9yZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X3VwZGF0ZV9zdG9yZV9mdW5jdGlvbglTVE9SRV9tZXRoX2dldF91cGRhdGVfc3RvcmVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X2xvY2tfc3RvcmVfZnVuY3Rpb24KKyNkZWZpbmUgU1RPUkVfbWV0aG9kX2dldF9sb2NrX3N0b3JlX2Z1bmN0aW9uCVNUT1JFX21ldGhfZ2V0X2xvY2tfc3RvcmVfZm4KKyN1bmRlZiBTVE9SRV9tZXRob2RfZ2V0X3VubG9ja19zdG9yZV9mdW5jdGlvbgorI2RlZmluZSBTVE9SRV9tZXRob2RfZ2V0X3VubG9ja19zdG9yZV9mdW5jdGlvbglTVE9SRV9tZXRoX2dldF91bmxvY2tfc3RvcmVfZm4KKworLyogSGFjayBzb21lIGxvbmcgVFMgbmFtZXMgKi8KKyN1bmRlZiBUU19SRVNQX0NUWF9zZXRfc3RhdHVzX2luZm9fY29uZAorI2RlZmluZSBUU19SRVNQX0NUWF9zZXRfc3RhdHVzX2luZm9fY29uZAlUU19SRVNQX0NUWF9zZXRfc3RhdF9pbmZvX2NvbmQKKyN1bmRlZiBUU19SRVNQX0NUWF9zZXRfY2xvY2tfcHJlY2lzaW9uX2RpZ2l0cworI2RlZmluZSBUU19SRVNQX0NUWF9zZXRfY2xvY2tfcHJlY2lzaW9uX2RpZ2l0cwlUU19SRVNQX0NUWF9zZXRfY2xrX3ByZWNfZGlnaXRzCisjdW5kZWYgVFNfQ09ORl9zZXRfY2xvY2tfcHJlY2lzaW9uX2RpZ2l0cworI2RlZmluZSBUU19DT05GX3NldF9jbG9ja19wcmVjaXNpb25fZGlnaXRzCVRTX0NPTkZfc2V0X2Nsa19wcmVjX2RpZ2l0cworCisvKiBIYWNrIHNvbWUgbG9uZyBDTVMgbmFtZXMgKi8KKyN1bmRlZiBDTVNfUmVjaXBpZW50SW5mb19rdHJpX2dldDBfYWxncworI2RlZmluZSBDTVNfUmVjaXBpZW50SW5mb19rdHJpX2dldDBfYWxncwlDTVNfUmVjaXBJbmZvX2t0cmlfZ2V0MF9hbGdzCisjdW5kZWYgQ01TX1JlY2lwaWVudEluZm9fa3RyaV9nZXQwX3NpZ25lcl9pZAorI2RlZmluZSBDTVNfUmVjaXBpZW50SW5mb19rdHJpX2dldDBfc2lnbmVyX2lkCUNNU19SZWNpcEluZm9fa3RyaV9nZXQwX3NpZ3JfaWQKKyN1bmRlZiBDTVNfT3RoZXJSZXZvY2F0aW9uSW5mb0Zvcm1hdF9pdAorI2RlZmluZSBDTVNfT3RoZXJSZXZvY2F0aW9uSW5mb0Zvcm1hdF9pdAlDTVNfT3RoZXJSZXZvY0luZm9Gb3JtYXRfaXQKKyN1bmRlZiBDTVNfS2V5QWdyZWVSZWNpcGllbnRJZGVudGlmaWVyX2l0CisjZGVmaW5lIENNU19LZXlBZ3JlZVJlY2lwaWVudElkZW50aWZpZXJfaXQJQ01TX0tleUFncmVlUmVjaXBJZGVudGlmaWVyX2l0CisjdW5kZWYgQ01TX09yaWdpbmF0b3JJZGVudGlmaWVyT3JLZXlfaXQKKyNkZWZpbmUgQ01TX09yaWdpbmF0b3JJZGVudGlmaWVyT3JLZXlfaXQJQ01TX09yaWdpbmF0b3JJZE9yS2V5X2l0CisjdW5kZWYgY21zX1NpZ25lcklkZW50aWZpZXJfZ2V0MF9zaWduZXJfaWQKKyNkZWZpbmUgY21zX1NpZ25lcklkZW50aWZpZXJfZ2V0MF9zaWduZXJfaWQJY21zX1NpZ25lcklkX2dldDBfc2lnbmVyX2lkCisKKy8qIEhhY2sgc29tZSBsb25nIERUTFMxIG5hbWVzICovCisjdW5kZWYgZHRsczFfcmV0cmFuc21pdF9idWZmZXJlZF9tZXNzYWdlcworI2RlZmluZSBkdGxzMV9yZXRyYW5zbWl0X2J1ZmZlcmVkX21lc3NhZ2VzCWR0bHMxX3JldHJhbnNtaXRfYnVmZmVyZWRfbXNncworCisvKiBIYWNrIHNvbWUgbG9uZyBVSSBuYW1lcyAqLworI3VuZGVmIFVJX21ldGhvZF9nZXRfcHJvbXB0X2NvbnN0cnVjdG9yCisjZGVmaW5lIFVJX21ldGhvZF9nZXRfcHJvbXB0X2NvbnN0cnVjdG9yCVVJX21ldGhvZF9nZXRfcHJvbXB0X2NvbnN0cnVjdHIKKyN1bmRlZiBVSV9tZXRob2Rfc2V0X3Byb21wdF9jb25zdHJ1Y3RvcgorI2RlZmluZSBVSV9tZXRob2Rfc2V0X3Byb21wdF9jb25zdHJ1Y3RvcglVSV9tZXRob2Rfc2V0X3Byb21wdF9jb25zdHJ1Y3RyCisKKyNlbmRpZiAvKiBkZWZpbmVkIE9QRU5TU0xfU1lTX1ZNUyAqLworCisKKy8qIENhc2UgaW5zZW5zaXRpdmUgbGlua2luZyBjYXVzZXMgcHJvYmxlbXMuLi4uICovCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfT1MyKQorI3VuZGVmIEVSUl9sb2FkX0NSWVBUT19zdHJpbmdzCisjZGVmaW5lIEVSUl9sb2FkX0NSWVBUT19zdHJpbmdzCQkJRVJSX2xvYWRfQ1JZUFRPbGliX3N0cmluZ3MKKyN1bmRlZiBPQ1NQX2NybElEX25ldworI2RlZmluZSBPQ1NQX2NybElEX25ldwkJCQlPQ1NQX2NybElEMl9uZXcKKworI3VuZGVmIGQyaV9FQ1BBUkFNRVRFUlMKKyNkZWZpbmUgZDJpX0VDUEFSQU1FVEVSUwkJCWQyaV9VQ19FQ1BBUkFNRVRFUlMKKyN1bmRlZiBpMmRfRUNQQVJBTUVURVJTCisjZGVmaW5lIGkyZF9FQ1BBUkFNRVRFUlMJCQlpMmRfVUNfRUNQQVJBTUVURVJTCisjdW5kZWYgZDJpX0VDUEtQQVJBTUVURVJTCisjZGVmaW5lIGQyaV9FQ1BLUEFSQU1FVEVSUwkJCWQyaV9VQ19FQ1BLUEFSQU1FVEVSUworI3VuZGVmIGkyZF9FQ1BLUEFSQU1FVEVSUworI2RlZmluZSBpMmRfRUNQS1BBUkFNRVRFUlMJCQlpMmRfVUNfRUNQS1BBUkFNRVRFUlMKKworLyogVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBzZWVtIHRvIGV4aXN0ISAgSG93ZXZlciwgSSdtIHBhcmFub2lkLi4uCisgICBPcmlnaW5hbCBjb21tYW5kIGluIHg1MDl2My5oOgorICAgVGhlc2UgZnVuY3Rpb25zIGFyZSBiZWluZyByZWRlZmluZWQgaW4gYW5vdGhlciBkaXJlY3RvcnksCisgICBhbmQgY2xhc2ggd2hlbiB0aGUgbGlua2VyIGlzIGNhc2UtaW5zZW5zaXRpdmUsIHNvIGxldCdzCisgICBoaWRlIHRoZW0gYSBsaXR0bGUsIGJ5IGdpdmluZyB0aGVtIGFuIGV4dHJhICdvJyBhdCB0aGUKKyAgIGJlZ2lubmluZyBvZiB0aGUgbmFtZS4uLiAqLworI3VuZGVmIFg1MDl2M19jbGVhbnVwX2V4dGVuc2lvbnMKKyNkZWZpbmUgWDUwOXYzX2NsZWFudXBfZXh0ZW5zaW9ucwkJb1g1MDl2M19jbGVhbnVwX2V4dGVuc2lvbnMKKyN1bmRlZiBYNTA5djNfYWRkX2V4dGVuc2lvbgorI2RlZmluZSBYNTA5djNfYWRkX2V4dGVuc2lvbgkJCW9YNTA5djNfYWRkX2V4dGVuc2lvbgorI3VuZGVmIFg1MDl2M19hZGRfbmV0c2NhcGVfZXh0ZW5zaW9ucworI2RlZmluZSBYNTA5djNfYWRkX25ldHNjYXBlX2V4dGVuc2lvbnMJCW9YNTA5djNfYWRkX25ldHNjYXBlX2V4dGVuc2lvbnMKKyN1bmRlZiBYNTA5djNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnMKKyNkZWZpbmUgWDUwOXYzX2FkZF9zdGFuZGFyZF9leHRlbnNpb25zCQlvWDUwOXYzX2FkZF9zdGFuZGFyZF9leHRlbnNpb25zCisKKy8qIFRoaXMgb25lIGNsYXNoZXMgd2l0aCBDTVNfZGF0YV9jcmVhdGUgKi8KKyN1bmRlZiBjbXNfRGF0YV9jcmVhdGUKKyNkZWZpbmUgY21zX0RhdGFfY3JlYXRlCQkJCXByaXZfY21zX0RhdGFfY3JlYXRlCisKKyNlbmRpZgorCisKKyNlbmRpZiAvKiAhIGRlZmluZWQgSEVBREVSX1ZNU19JREhBQ0tTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvdGxzMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzY2M4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvdGxzMS5oCkBAIC0wLDAgKzEsNTMyIEBACisvKiBzc2wvdGxzMS5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgYXJlIGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBhcmUgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlIHByb3ZpZGVkIGFib3ZlLgorICoKKyAqIEVDQyBjaXBoZXIgc3VpdGUgc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgd3JpdHRlbiBieQorICogVmlwdWwgR3VwdGEgYW5kIFN1bWl0IEd1cHRhIG9mIFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDA1IE5va2lhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBwb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBpcyBkZXZlbG9wZWQgYnkKKyAqIE5va2lhIENvcnBvcmF0aW9uIGFuZCBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZS4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uLCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWlrYSBLb3VzYSBhbmQgUGFzaSBFcm9uZW4gb2YKKyAqIE5va2lhIENvcnBvcmF0aW9uLCBjb25zaXN0cyBvZiB0aGUgIlBTSyIgKFByZS1TaGFyZWQgS2V5KSBjaXBoZXJzdWl0ZXMKKyAqIHN1cHBvcnQgKHNlZSBSRkMgNDI3OSkgdG8gT3BlblNTTC4KKyAqCisgKiBObyBwYXRlbnQgbGljZW5zZXMgb3Igb3RoZXIgcmlnaHRzIGV4Y2VwdCB0aG9zZSBleHByZXNzbHkgc3RhdGVkIGluCisgKiB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZSBsaWNlbnNlIHNoYWxsIGJlIGRlZW1lZCBncmFudGVkIG9yIHJlY2VpdmVkCisgKiBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCwgb3Igb3RoZXJ3aXNlLgorICoKKyAqIE5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IE5va2lhIHRoYXQgdGhlIENvbnRyaWJ1dGlvbiBkb2VzIG5vdAorICogaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSB0aGlyZAorICogcGFydHkgb3IgdGhhdCB0aGUgbGljZW5zZSBwcm92aWRlcyB5b3Ugd2l0aCBhbGwgdGhlIG5lY2Vzc2FyeSByaWdodHMKKyAqIHRvIG1ha2UgdXNlIG9mIHRoZSBDb250cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORC4gSU4KKyAqIEFERElUSU9OIFRPIFRIRSBESVNDTEFJTUVSUyBJTkNMVURFRCBJTiBUSEUgTElDRU5TRSwgTk9LSUEKKyAqIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBGT1IgQ0xBSU1TIEJST1VHSFQgQlkgWU9VIE9SIEFOWQorICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCisgKiBPVEhFUldJU0UuCisgKi8KKworI2lmbmRlZiBIRUFERVJfVExTMV9IIAorI2RlZmluZSBIRUFERVJfVExTMV9IIAorCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBUTFMxX0FMTE9XX0VYUEVSSU1FTlRBTF9DSVBIRVJTVUlURVMJMAorCisjZGVmaW5lIFRMUzFfVkVSU0lPTgkJCTB4MDMwMQorI2RlZmluZSBUTFMxX1ZFUlNJT05fTUFKT1IJCTB4MDMKKyNkZWZpbmUgVExTMV9WRVJTSU9OX01JTk9SCQkweDAxCisKKyNkZWZpbmUgVExTMV9BRF9ERUNSWVBUSU9OX0ZBSUxFRAkyMQorI2RlZmluZSBUTFMxX0FEX1JFQ09SRF9PVkVSRkxPVwkJMjIKKyNkZWZpbmUgVExTMV9BRF9VTktOT1dOX0NBCQk0OAkvKiBmYXRhbCAqLworI2RlZmluZSBUTFMxX0FEX0FDQ0VTU19ERU5JRUQJCTQ5CS8qIGZhdGFsICovCisjZGVmaW5lIFRMUzFfQURfREVDT0RFX0VSUk9SCQk1MAkvKiBmYXRhbCAqLworI2RlZmluZSBUTFMxX0FEX0RFQ1JZUFRfRVJST1IJCTUxCisjZGVmaW5lIFRMUzFfQURfRVhQT1JUX1JFU1RSSUNUSU9OCTYwCS8qIGZhdGFsICovCisjZGVmaW5lIFRMUzFfQURfUFJPVE9DT0xfVkVSU0lPTgk3MAkvKiBmYXRhbCAqLworI2RlZmluZSBUTFMxX0FEX0lOU1VGRklDSUVOVF9TRUNVUklUWQk3MQkvKiBmYXRhbCAqLworI2RlZmluZSBUTFMxX0FEX0lOVEVSTkFMX0VSUk9SCQk4MAkvKiBmYXRhbCAqLworI2RlZmluZSBUTFMxX0FEX1VTRVJfQ0FOQ0VMTEVECQk5MAorI2RlZmluZSBUTFMxX0FEX05PX1JFTkVHT1RJQVRJT04JMTAwCisvKiBjb2RlcyAxMTAtMTE0IGFyZSBmcm9tIFJGQzM1NDYgKi8KKyNkZWZpbmUgVExTMV9BRF9VTlNVUFBPUlRFRF9FWFRFTlNJT04JMTEwCisjZGVmaW5lIFRMUzFfQURfQ0VSVElGSUNBVEVfVU5PQlRBSU5BQkxFIDExMQorI2RlZmluZSBUTFMxX0FEX1VOUkVDT0dOSVpFRF9OQU1FIAkxMTIKKyNkZWZpbmUgVExTMV9BRF9CQURfQ0VSVElGSUNBVEVfU1RBVFVTX1JFU1BPTlNFIDExMworI2RlZmluZSBUTFMxX0FEX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFIDExNAorI2RlZmluZSBUTFMxX0FEX1VOS05PV05fUFNLX0lERU5USVRZCTExNQkvKiBmYXRhbCAqLworCisvKiBFeHRlbnNpb25UeXBlIHZhbHVlcyBmcm9tIFJGQzM1NDYgLyBSRkM0MzY2ICovCisjZGVmaW5lIFRMU0VYVF9UWVBFX3NlcnZlcl9uYW1lCQkJMAorI2RlZmluZSBUTFNFWFRfVFlQRV9tYXhfZnJhZ21lbnRfbGVuZ3RoCQkxCisjZGVmaW5lIFRMU0VYVF9UWVBFX2NsaWVudF9jZXJ0aWZpY2F0ZV91cmwJMgorI2RlZmluZSBUTFNFWFRfVFlQRV90cnVzdGVkX2NhX2tleXMJCTMKKyNkZWZpbmUgVExTRVhUX1RZUEVfdHJ1bmNhdGVkX2htYWMJCTQKKyNkZWZpbmUgVExTRVhUX1RZUEVfc3RhdHVzX3JlcXVlc3QJCTUKKy8qIEV4dGVuc2lvblR5cGUgdmFsdWVzIGZyb20gUkZDNDQ5MiAqLworI2RlZmluZSBUTFNFWFRfVFlQRV9lbGxpcHRpY19jdXJ2ZXMJCTEwCisjZGVmaW5lIFRMU0VYVF9UWVBFX2VjX3BvaW50X2Zvcm1hdHMJCTExCisjZGVmaW5lIFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0CQkzNQorLyogRXh0ZW5zaW9uVHlwZSB2YWx1ZSBmcm9tIGRyYWZ0LXJlc2NvcmxhLXRscy1vcGFxdWUtcHJmLWlucHV0LTAwLnR4dCAqLworI2lmIDAgLyogd2lsbCBoYXZlIHRvIGJlIHByb3ZpZGVkIGV4dGVybmFsbHkgZm9yIG5vdyAsCisgICAgICAgKiBpLmUuIGJ1aWxkIHdpdGggLURUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0PTM4MTgzCisgICAgICAgKiB1c2luZyB3aGF0ZXZlciBleHRlbnNpb24gbnVtYmVyIHlvdSdkIGxpa2UgdG8gdHJ5ICovCisjIGRlZmluZSBUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0CQk/PyAqLworI2VuZGlmCisKKy8qIFRlbXBvcmFyeSBleHRlbnNpb24gdHlwZSAqLworI2RlZmluZSBUTFNFWFRfVFlQRV9yZW5lZ290aWF0ZSAgICAgICAgICAgICAgICAgMHhmZjAxCisKKy8qIE5hbWVUeXBlIHZhbHVlIGZyb20gUkZDIDM1NDYgKi8KKyNkZWZpbmUgVExTRVhUX05BTUVUWVBFX2hvc3RfbmFtZSAwCisvKiBzdGF0dXMgcmVxdWVzdCB2YWx1ZSBmcm9tIFJGQyAzNTQ2ICovCisjZGVmaW5lIFRMU0VYVF9TVEFUVVNUWVBFX29jc3AgMQorCisvKiBFQ1BvaW50Rm9ybWF0IHZhbHVlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMiAqLworI2RlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9maXJzdAkJCTAKKyNkZWZpbmUgVExTRVhUX0VDUE9JTlRGT1JNQVRfdW5jb21wcmVzc2VkCQkwCisjZGVmaW5lIFRMU0VYVF9FQ1BPSU5URk9STUFUX2Fuc2lYOTYyX2NvbXByZXNzZWRfcHJpbWUJMQorI2RlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9hbnNpWDk2Ml9jb21wcmVzc2VkX2NoYXIyCTIKKyNkZWZpbmUgVExTRVhUX0VDUE9JTlRGT1JNQVRfbGFzdAkJCTIKKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCisjZGVmaW5lIFRMU0VYVF9NQVhMRU5faG9zdF9uYW1lIDI1NQorCitjb25zdCBjaGFyICpTU0xfZ2V0X3NlcnZlcm5hbWUoY29uc3QgU1NMICpzLCBjb25zdCBpbnQgdHlwZSkgOworaW50IFNTTF9nZXRfc2VydmVybmFtZV90eXBlKGNvbnN0IFNTTCAqcykgOworCisjZGVmaW5lIFNTTF9zZXRfdGxzZXh0X2hvc3RfbmFtZShzLG5hbWUpIFwKK1NTTF9jdHJsKHMsU1NMX0NUUkxfU0VUX1RMU0VYVF9IT1NUTkFNRSxUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lLChjaGFyICopbmFtZSkKKworI2RlZmluZSBTU0xfc2V0X3Rsc2V4dF9kZWJ1Z19jYWxsYmFjayhzc2wsIGNiKSBcCitTU0xfY2FsbGJhY2tfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RMU0VYVF9ERUJVR19DQiwodm9pZCAoKikodm9pZCkpY2IpCisKKyNkZWZpbmUgU1NMX3NldF90bHNleHRfZGVidWdfYXJnKHNzbCwgYXJnKSBcCitTU0xfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RMU0VYVF9ERUJVR19BUkcsMCwgKHZvaWQgKilhcmcpCisKKyNkZWZpbmUgU1NMX3NldF90bHNleHRfc3RhdHVzX3R5cGUoc3NsLCB0eXBlKSBcCitTU0xfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX1RZUEUsdHlwZSwgTlVMTCkKKworI2RlZmluZSBTU0xfZ2V0X3Rsc2V4dF9zdGF0dXNfZXh0cyhzc2wsIGFyZykgXAorU1NMX2N0cmwoc3NsLFNTTF9DVFJMX0dFVF9UTFNFWFRfU1RBVFVTX1JFUV9FWFRTLDAsICh2b2lkICopYXJnKQorCisjZGVmaW5lIFNTTF9zZXRfdGxzZXh0X3N0YXR1c19leHRzKHNzbCwgYXJnKSBcCitTU0xfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX0VYVFMsMCwgKHZvaWQgKilhcmcpCisKKyNkZWZpbmUgU1NMX2dldF90bHNleHRfc3RhdHVzX2lkcyhzc2wsIGFyZykgXAorU1NMX2N0cmwoc3NsLFNTTF9DVFJMX0dFVF9UTFNFWFRfU1RBVFVTX1JFUV9JRFMsMCwgKHZvaWQgKilhcmcpCisKKyNkZWZpbmUgU1NMX3NldF90bHNleHRfc3RhdHVzX2lkcyhzc2wsIGFyZykgXAorU1NMX2N0cmwoc3NsLFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9JRFMsMCwgKHZvaWQgKilhcmcpCisKKyNkZWZpbmUgU1NMX2dldF90bHNleHRfc3RhdHVzX29jc3BfcmVzcChzc2wsIGFyZykgXAorU1NMX2N0cmwoc3NsLFNTTF9DVFJMX0dFVF9UTFNFWFRfU1RBVFVTX1JFUV9PQ1NQX1JFU1AsMCwgKHZvaWQgKilhcmcpCisKKyNkZWZpbmUgU1NMX3NldF90bHNleHRfc3RhdHVzX29jc3BfcmVzcChzc2wsIGFyZywgYXJnbGVuKSBcCitTU0xfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX09DU1BfUkVTUCxhcmdsZW4sICh2b2lkICopYXJnKQorCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKGN0eCwgY2IpIFwKK1NTTF9DVFhfY2FsbGJhY2tfY3RybChjdHgsU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0NCLCh2b2lkICgqKSh2b2lkKSljYikKKworI2RlZmluZSBTU0xfVExTRVhUX0VSUl9PSyAwCisjZGVmaW5lIFNTTF9UTFNFWFRfRVJSX0FMRVJUX1dBUk5JTkcgMQorI2RlZmluZSBTU0xfVExTRVhUX0VSUl9BTEVSVF9GQVRBTCAyCisjZGVmaW5lIFNTTF9UTFNFWFRfRVJSX05PQUNLIDMKKworI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9hcmcoY3R4LCBhcmcpIFwKK1NTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0FSRywwLCAodm9pZCAqKWFyZykKKworI2RlZmluZSBTU0xfQ1RYX2dldF90bHNleHRfdGlja2V0X2tleXMoY3R4LCBrZXlzLCBrZXlsZW4pIFwKKwlTU0xfQ1RYX2N0cmwoKGN0eCksU1NMX0NUUkxfR0VUX1RMU0VYVF9USUNLRVRfS0VZUywoa2V5bGVuKSwoa2V5cykpCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF90aWNrZXRfa2V5cyhjdHgsIGtleXMsIGtleWxlbikgXAorCVNTTF9DVFhfY3RybCgoY3R4KSxTU0xfQ1RSTF9TRVRfVExTRVhUX1RJQ0tFVF9LRVlTLChrZXlsZW4pLChrZXlzKSkKKworI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfc3RhdHVzX2NiKHNzbCwgY2IpIFwKK1NTTF9DVFhfY2FsbGJhY2tfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX0NCLCh2b2lkICgqKSh2b2lkKSljYikKKworI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfc3RhdHVzX2FyZyhzc2wsIGFyZykgXAorU1NMX0NUWF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfQ0JfQVJHLDAsICh2b2lkICopYXJnKQorCisjZGVmaW5lIFNTTF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQocywgc3JjLCBsZW4pIFwKK1NTTF9jdHJsKHMsU1NMX0NUUkxfU0VUX1RMU0VYVF9PUEFRVUVfUFJGX0lOUFVULCBsZW4sIHNyYykKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2soY3R4LCBjYikgXAorU1NMX0NUWF9jYWxsYmFja19jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfVExTRVhUX09QQVFVRV9QUkZfSU5QVVRfQ0IsICh2b2lkICgqKSh2b2lkKSljYikKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnKGN0eCwgYXJnKSBcCitTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9UTFNFWFRfT1BBUVVFX1BSRl9JTlBVVF9DQl9BUkcsIDAsIGFyZykKKworI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfdGlja2V0X2tleV9jYihzc2wsIGNiKSBcCitTU0xfQ1RYX2NhbGxiYWNrX2N0cmwoc3NsLFNTTF9DVFJMX1NFVF9UTFNFWFRfVElDS0VUX0tFWV9DQiwodm9pZCAoKikodm9pZCkpY2IpCisKKyNlbmRpZgorCisvKiBQU0sgY2lwaGVyc3VpdGVzIGZyb20gNDI3OSAqLworI2RlZmluZSBUTFMxX0NLX1BTS19XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICAgICAgICAweDAzMDAwMDhBCisjZGVmaW5lIFRMUzFfQ0tfUFNLX1dJVEhfM0RFU19FREVfQ0JDX1NIQSAgICAgICAgICAgICAgIDB4MDMwMDAwOEIKKyNkZWZpbmUgVExTMV9DS19QU0tfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICAgICAgICAgMHgwMzAwMDA4QworI2RlZmluZSBUTFMxX0NLX1BTS19XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgICAgICAgICAweDAzMDAwMDhECisKKy8qIEFkZGl0aW9uYWwgVExTIGNpcGhlcnN1aXRlcyBmcm9tIGV4cGlyZWQgSW50ZXJuZXQgRHJhZnQKKyAqIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDEudHh0CisgKiAoYXZhaWxhYmxlIGlmIFRMUzFfQUxMT1dfRVhQRVJJTUVOVEFMX0NJUEhFUlNVSVRFUyBpcyBkZWZpbmVkLCBzZWUKKyAqIHMzX2xpYi5jKS4gIFdlIGFjdHVhbGx5IHRyZWF0IHRoZW0gbGlrZSBTU0wgMy4wIGNpcGhlcnMsIHdoaWNoIHdlIHByb2JhYmx5CisgKiBzaG91bGRuJ3QuICBOb3RlIHRoYXQgdGhlIGZpcnN0IHR3byBhcmUgYWN0dWFsbHkgbm90IGluIHRoZSBJRHMuICovCisjZGVmaW5lIFRMUzFfQ0tfUlNBX0VYUE9SVDEwMjRfV0lUSF9SQzRfNTZfTUQ1CQkweDAzMDAwMDYwIC8qIG5vdCBpbiBJRCAqLworI2RlZmluZSBUTFMxX0NLX1JTQV9FWFBPUlQxMDI0X1dJVEhfUkMyX0NCQ181Nl9NRDUJMHgwMzAwMDA2MSAvKiBub3QgaW4gSUQgKi8KKyNkZWZpbmUgVExTMV9DS19SU0FfRVhQT1JUMTAyNF9XSVRIX0RFU19DQkNfU0hBCQkweDAzMDAwMDYyCisjZGVmaW5lIFRMUzFfQ0tfREhFX0RTU19FWFBPUlQxMDI0X1dJVEhfREVTX0NCQ19TSEEJMHgwMzAwMDA2MworI2RlZmluZSBUTFMxX0NLX1JTQV9FWFBPUlQxMDI0X1dJVEhfUkM0XzU2X1NIQQkJMHgwMzAwMDA2NAorI2RlZmluZSBUTFMxX0NLX0RIRV9EU1NfRVhQT1JUMTAyNF9XSVRIX1JDNF81Nl9TSEEJMHgwMzAwMDA2NQorI2RlZmluZSBUTFMxX0NLX0RIRV9EU1NfV0lUSF9SQzRfMTI4X1NIQQkJMHgwMzAwMDA2NgorCisvKiBBRVMgY2lwaGVyc3VpdGVzIGZyb20gUkZDMzI2OCAqLworCisjZGVmaW5lIFRMUzFfQ0tfUlNBX1dJVEhfQUVTXzEyOF9TSEEJCQkweDAzMDAwMDJGCisjZGVmaW5lIFRMUzFfQ0tfREhfRFNTX1dJVEhfQUVTXzEyOF9TSEEJCQkweDAzMDAwMDMwCisjZGVmaW5lIFRMUzFfQ0tfREhfUlNBX1dJVEhfQUVTXzEyOF9TSEEJCQkweDAzMDAwMDMxCisjZGVmaW5lIFRMUzFfQ0tfREhFX0RTU19XSVRIX0FFU18xMjhfU0hBCQkweDAzMDAwMDMyCisjZGVmaW5lIFRMUzFfQ0tfREhFX1JTQV9XSVRIX0FFU18xMjhfU0hBCQkweDAzMDAwMDMzCisjZGVmaW5lIFRMUzFfQ0tfQURIX1dJVEhfQUVTXzEyOF9TSEEJCQkweDAzMDAwMDM0CisKKyNkZWZpbmUgVExTMV9DS19SU0FfV0lUSF9BRVNfMjU2X1NIQQkJCTB4MDMwMDAwMzUKKyNkZWZpbmUgVExTMV9DS19ESF9EU1NfV0lUSF9BRVNfMjU2X1NIQQkJCTB4MDMwMDAwMzYKKyNkZWZpbmUgVExTMV9DS19ESF9SU0FfV0lUSF9BRVNfMjU2X1NIQQkJCTB4MDMwMDAwMzcKKyNkZWZpbmUgVExTMV9DS19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9TSEEJCTB4MDMwMDAwMzgKKyNkZWZpbmUgVExTMV9DS19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9TSEEJCTB4MDMwMDAwMzkKKyNkZWZpbmUgVExTMV9DS19BREhfV0lUSF9BRVNfMjU2X1NIQQkJCTB4MDMwMDAwM0EKKworLyogQ2FtZWxsaWEgY2lwaGVyc3VpdGVzIGZyb20gUkZDNDEzMiAqLworI2RlZmluZSBUTFMxX0NLX1JTQV9XSVRIX0NBTUVMTElBXzEyOF9DQkNfU0hBCQkweDAzMDAwMDQxCisjZGVmaW5lIFRMUzFfQ0tfREhfRFNTX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJMHgwMzAwMDA0MgorI2RlZmluZSBUTFMxX0NLX0RIX1JTQV9XSVRIX0NBTUVMTElBXzEyOF9DQkNfU0hBCTB4MDMwMDAwNDMKKyNkZWZpbmUgVExTMV9DS19ESEVfRFNTX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJMHgwMzAwMDA0NAorI2RlZmluZSBUTFMxX0NLX0RIRV9SU0FfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkweDAzMDAwMDQ1CisjZGVmaW5lIFRMUzFfQ0tfQURIX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJCTB4MDMwMDAwNDYKKworI2RlZmluZSBUTFMxX0NLX1JTQV9XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBCQkweDAzMDAwMDg0CisjZGVmaW5lIFRMUzFfQ0tfREhfRFNTX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJMHgwMzAwMDA4NQorI2RlZmluZSBUTFMxX0NLX0RIX1JTQV9XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBCTB4MDMwMDAwODYKKyNkZWZpbmUgVExTMV9DS19ESEVfRFNTX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJMHgwMzAwMDA4NworI2RlZmluZSBUTFMxX0NLX0RIRV9SU0FfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQQkweDAzMDAwMDg4CisjZGVmaW5lIFRMUzFfQ0tfQURIX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJCTB4MDMwMDAwODkKKworLyogU0VFRCBjaXBoZXJzdWl0ZXMgZnJvbSBSRkM0MTYyICovCisjZGVmaW5lIFRMUzFfQ0tfUlNBX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwOTYKKyNkZWZpbmUgVExTMV9DS19ESF9EU1NfV0lUSF9TRUVEX1NIQSAgICAgICAgICAgICAgICAgICAgMHgwMzAwMDA5NworI2RlZmluZSBUTFMxX0NLX0RIX1JTQV9XSVRIX1NFRURfU0hBICAgICAgICAgICAgICAgICAgICAweDAzMDAwMDk4CisjZGVmaW5lIFRMUzFfQ0tfREhFX0RTU19XSVRIX1NFRURfU0hBICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwOTkKKyNkZWZpbmUgVExTMV9DS19ESEVfUlNBX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgICAgMHgwMzAwMDA5QQorI2RlZmluZSBUTFMxX0NLX0FESF9XSVRIX1NFRURfU0hBICAgICAgICAgICAgICAgIAkweDAzMDAwMDlCCisKKy8qIEVDQyBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMTIudHh0IHdpdGggY2hhbmdlcyBzb29uIHRvIGJlIGluIGRyYWZ0IDEzICovCisjZGVmaW5lIFRMUzFfQ0tfRUNESF9FQ0RTQV9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAgIDB4MDMwMEMwMDEKKyNkZWZpbmUgVExTMV9DS19FQ0RIX0VDRFNBX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICAgMHgwMzAwQzAwMgorI2RlZmluZSBUTFMxX0NLX0VDREhfRUNEU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBICAgICAgICAweDAzMDBDMDAzCisjZGVmaW5lIFRMUzFfQ0tfRUNESF9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSAgICAgICAgIDB4MDMwMEMwMDQKKyNkZWZpbmUgVExTMV9DS19FQ0RIX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgMHgwMzAwQzAwNQorCisjZGVmaW5lIFRMUzFfQ0tfRUNESEVfRUNEU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgIDB4MDMwMEMwMDYKKyNkZWZpbmUgVExTMV9DS19FQ0RIRV9FQ0RTQV9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgMHgwMzAwQzAwNworI2RlZmluZSBUTFMxX0NLX0VDREhFX0VDRFNBX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSAgICAgICAweDAzMDBDMDA4CisjZGVmaW5lIFRMUzFfQ0tfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgIDB4MDMwMEMwMDkKKyNkZWZpbmUgVExTMV9DS19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgMHgwMzAwQzAwQQorCisjZGVmaW5lIFRMUzFfQ0tfRUNESF9SU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICAgIDB4MDMwMEMwMEIKKyNkZWZpbmUgVExTMV9DS19FQ0RIX1JTQV9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICAgMHgwMzAwQzAwQworI2RlZmluZSBUTFMxX0NLX0VDREhfUlNBX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSAgICAgICAgICAweDAzMDBDMDBECisjZGVmaW5lIFRMUzFfQ0tfRUNESF9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICAgIDB4MDMwMEMwMEUKKyNkZWZpbmUgVExTMV9DS19FQ0RIX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgICAgMHgwMzAwQzAwRgorCisjZGVmaW5lIFRMUzFfQ0tfRUNESEVfUlNBX1dJVEhfTlVMTF9TSEEgICAgICAgICAgICAgICAgIDB4MDMwMEMwMTAKKyNkZWZpbmUgVExTMV9DS19FQ0RIRV9SU0FfV0lUSF9SQzRfMTI4X1NIQSAgICAgICAgICAgICAgMHgwMzAwQzAxMQorI2RlZmluZSBUTFMxX0NLX0VDREhFX1JTQV9XSVRIX0RFU18xOTJfQ0JDM19TSEEgICAgICAgICAweDAzMDBDMDEyCisjZGVmaW5lIFRMUzFfQ0tfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBICAgICAgICAgIDB4MDMwMEMwMTMKKyNkZWZpbmUgVExTMV9DS19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgICAgICAgICAgMHgwMzAwQzAxNAorCisjZGVmaW5lIFRMUzFfQ0tfRUNESF9hbm9uX1dJVEhfTlVMTF9TSEEgICAgICAgICAgICAgICAgIDB4MDMwMEMwMTUKKyNkZWZpbmUgVExTMV9DS19FQ0RIX2Fub25fV0lUSF9SQzRfMTI4X1NIQSAgICAgICAgICAgICAgMHgwMzAwQzAxNgorI2RlZmluZSBUTFMxX0NLX0VDREhfYW5vbl9XSVRIX0RFU18xOTJfQ0JDM19TSEEgICAgICAgICAweDAzMDBDMDE3CisjZGVmaW5lIFRMUzFfQ0tfRUNESF9hbm9uX1dJVEhfQUVTXzEyOF9DQkNfU0hBICAgICAgICAgIDB4MDMwMEMwMTgKKyNkZWZpbmUgVExTMV9DS19FQ0RIX2Fub25fV0lUSF9BRVNfMjU2X0NCQ19TSEEgICAgICAgICAgMHgwMzAwQzAxOQorCisvKiBYWFgKKyAqIEluY29uc2lzdGVuY3kgYWxlcnQ6CisgKiBUaGUgT3BlblNTTCBuYW1lcyBvZiBjaXBoZXJzIHdpdGggZXBoZW1lcmFsIERIIGhlcmUgaW5jbHVkZSB0aGUgc3RyaW5nCisgKiAiREhFIiwgd2hpbGUgZWxzZXdoZXJlIGl0IGhhcyBhbHdheXMgYmVlbiAiRURIIi4KKyAqIChUaGUgYWxpYXMgZm9yIHRoZSBsaXN0IG9mIGFsbCBzdWNoIGNpcGhlcnMgYWxzbyBpcyAiRURIIi4pCisgKiBUaGUgc3BlY2lmaWNhdGlvbnMgc3BlYWsgb2YgIkVESCI7IG1heWJlIHdlIHNob3VsZCBhbGxvdyBib3RoIGZvcm1zCisgKiBmb3IgZXZlcnl0aGluZy4gKi8KKyNkZWZpbmUgVExTMV9UWFRfUlNBX0VYUE9SVDEwMjRfV0lUSF9SQzRfNTZfTUQ1CQkiRVhQMTAyNC1SQzQtTUQ1IgorI2RlZmluZSBUTFMxX1RYVF9SU0FfRVhQT1JUMTAyNF9XSVRIX1JDMl9DQkNfNTZfTUQ1CSJFWFAxMDI0LVJDMi1DQkMtTUQ1IgorI2RlZmluZSBUTFMxX1RYVF9SU0FfRVhQT1JUMTAyNF9XSVRIX0RFU19DQkNfU0hBCSJFWFAxMDI0LURFUy1DQkMtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfRFNTX0VYUE9SVDEwMjRfV0lUSF9ERVNfQ0JDX1NIQQkiRVhQMTAyNC1ESEUtRFNTLURFUy1DQkMtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9SU0FfRVhQT1JUMTAyNF9XSVRIX1JDNF81Nl9TSEEJCSJFWFAxMDI0LVJDNC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9EU1NfRVhQT1JUMTAyNF9XSVRIX1JDNF81Nl9TSEEJIkVYUDEwMjQtREhFLURTUy1SQzQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfRFNTX1dJVEhfUkM0XzEyOF9TSEEJCSJESEUtRFNTLVJDNC1TSEEiCisKKy8qIEFFUyBjaXBoZXJzdWl0ZXMgZnJvbSBSRkMzMjY4ICovCisjZGVmaW5lIFRMUzFfVFhUX1JTQV9XSVRIX0FFU18xMjhfU0hBCQkJIkFFUzEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX0RTU19XSVRIX0FFU18xMjhfU0hBCQkiREgtRFNTLUFFUzEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX1JTQV9XSVRIX0FFU18xMjhfU0hBCQkiREgtUlNBLUFFUzEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9EU1NfV0lUSF9BRVNfMTI4X1NIQQkJIkRIRS1EU1MtQUVTMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhFX1JTQV9XSVRIX0FFU18xMjhfU0hBCQkiREhFLVJTQS1BRVMxMjgtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9BREhfV0lUSF9BRVNfMTI4X1NIQQkJCSJBREgtQUVTMTI4LVNIQSIKKworI2RlZmluZSBUTFMxX1RYVF9SU0FfV0lUSF9BRVNfMjU2X1NIQQkJCSJBRVMyNTYtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESF9EU1NfV0lUSF9BRVNfMjU2X1NIQQkJIkRILURTUy1BRVMyNTYtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESF9SU0FfV0lUSF9BRVNfMjU2X1NIQQkJIkRILVJTQS1BRVMyNTYtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfRFNTX1dJVEhfQUVTXzI1Nl9TSEEJCSJESEUtRFNTLUFFUzI1Ni1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9SU0FfV0lUSF9BRVNfMjU2X1NIQQkJIkRIRS1SU0EtQUVTMjU2LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfQURIX1dJVEhfQUVTXzI1Nl9TSEEJCQkiQURILUFFUzI1Ni1TSEEiCisKKy8qIEVDQyBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMDEudHh0IChNYXIgMTUsIDIwMDEpICovCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfRUNEU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICJFQ0RILUVDRFNBLU5VTEwtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIX0VDRFNBX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICAiRUNESC1FQ0RTQS1SQzQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIX0VDRFNBX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSAgICAgICAiRUNESC1FQ0RTQS1ERVMtQ0JDMy1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICJFQ0RILUVDRFNBLUFFUzEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgICAgICAgICJFQ0RILUVDRFNBLUFFUzI1Ni1TSEEiCisKKyNkZWZpbmUgVExTMV9UWFRfRUNESEVfRUNEU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgIkVDREhFLUVDRFNBLU5VTEwtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIRV9FQ0RTQV9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAiRUNESEUtRUNEU0EtUkM0LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESEVfRUNEU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBICAgICAgIkVDREhFLUVDRFNBLURFUy1DQkMzLVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgIkVDREhFLUVDRFNBLUFFUzEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICJFQ0RIRS1FQ0RTQS1BRVMyNTYtU0hBIgorCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfUlNBX1dJVEhfTlVMTF9TSEEgICAgICAgICAgICAgICAgICJFQ0RILVJTQS1OVUxMLVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESF9SU0FfV0lUSF9SQzRfMTI4X1NIQSAgICAgICAgICAgICAgIkVDREgtUlNBLVJDNC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfUlNBX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSAgICAgICAgICJFQ0RILVJTQS1ERVMtQ0JDMy1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBICAgICAgICAgICJFQ0RILVJTQS1BRVMxMjgtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgICAiRUNESC1SU0EtQUVTMjU2LVNIQSIKKworI2RlZmluZSBUTFMxX1RYVF9FQ0RIRV9SU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICAiRUNESEUtUlNBLU5VTEwtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIRV9SU0FfV0lUSF9SQzRfMTI4X1NIQSAgICAgICAgICAgICAiRUNESEUtUlNBLVJDNC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX0RFU18xOTJfQ0JDM19TSEEgICAgICAgICJFQ0RIRS1SU0EtREVTLUNCQzMtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICAiRUNESEUtUlNBLUFFUzEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgICJFQ0RIRS1SU0EtQUVTMjU2LVNIQSIKKworI2RlZmluZSBUTFMxX1RYVF9FQ0RIX2Fub25fV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICAiQUVDREgtTlVMTC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfYW5vbl9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICJBRUNESC1SQzQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIX2Fub25fV0lUSF9ERVNfMTkyX0NCQzNfU0hBICAgICAgICAiQUVDREgtREVTLUNCQzMtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIX2Fub25fV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICAiQUVDREgtQUVTMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESF9hbm9uX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgIkFFQ0RILUFFUzI1Ni1TSEEiCisKKy8qIFBTSyBjaXBoZXJzdWl0ZXMgZnJvbSBSRkMgNDI3OSAqLworI2RlZmluZSBUTFMxX1RYVF9QU0tfV0lUSF9SQzRfMTI4X1NIQQkJCSJQU0stUkM0LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfUFNLX1dJVEhfM0RFU19FREVfQ0JDX1NIQQkJIlBTSy0zREVTLUVERS1DQkMtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9QU0tfV0lUSF9BRVNfMTI4X0NCQ19TSEEJCSJQU0stQUVTMTI4LUNCQy1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX1BTS19XSVRIX0FFU18yNTZfQ0JDX1NIQQkJIlBTSy1BRVMyNTYtQ0JDLVNIQSIKKworLyogQ2FtZWxsaWEgY2lwaGVyc3VpdGVzIGZyb20gUkZDNDEzMiAqLworI2RlZmluZSBUTFMxX1RYVF9SU0FfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkJIkNBTUVMTElBMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhfRFNTX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJIkRILURTUy1DQU1FTExJQTEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX1JTQV9XSVRIX0NBTUVMTElBXzEyOF9DQkNfU0hBCSJESC1SU0EtQ0FNRUxMSUExMjgtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfRFNTX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJIkRIRS1EU1MtQ0FNRUxMSUExMjgtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfUlNBX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJIkRIRS1SU0EtQ0FNRUxMSUExMjgtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9BREhfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkJIkFESC1DQU1FTExJQTEyOC1TSEEiCisKKyNkZWZpbmUgVExTMV9UWFRfUlNBX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJCSJDQU1FTExJQTI1Ni1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX0RTU19XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBCSJESC1EU1MtQ0FNRUxMSUEyNTYtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESF9SU0FfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQQkiREgtUlNBLUNBTUVMTElBMjU2LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhFX0RTU19XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBCSJESEUtRFNTLUNBTUVMTElBMjU2LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhFX1JTQV9XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBCSJESEUtUlNBLUNBTUVMTElBMjU2LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfQURIX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJCSJBREgtQ0FNRUxMSUEyNTYtU0hBIgorCisvKiBTRUVEIGNpcGhlcnN1aXRlcyBmcm9tIFJGQzQxNjIgKi8KKyNkZWZpbmUgVExTMV9UWFRfUlNBX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgICAgICAgIlNFRUQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESF9EU1NfV0lUSF9TRUVEX1NIQSAgICAgICAgICAgICAgICAgICAiREgtRFNTLVNFRUQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESF9SU0FfV0lUSF9TRUVEX1NIQSAgICAgICAgICAgICAgICAgICAiREgtUlNBLVNFRUQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfRFNTX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgICAiREhFLURTUy1TRUVELVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhFX1JTQV9XSVRIX1NFRURfU0hBICAgICAgICAgICAgICAgICAgIkRIRS1SU0EtU0VFRC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0FESF9XSVRIX1NFRURfU0hBICAgICAgICAgICAgICAgICAgICAgICJBREgtU0VFRC1TSEEiCisKKworI2RlZmluZSBUTFNfQ1RfUlNBX1NJR04JCQkxCisjZGVmaW5lIFRMU19DVF9EU1NfU0lHTgkJCTIKKyNkZWZpbmUgVExTX0NUX1JTQV9GSVhFRF9ESAkJMworI2RlZmluZSBUTFNfQ1RfRFNTX0ZJWEVEX0RICQk0CisjZGVmaW5lIFRMU19DVF9FQ0RTQV9TSUdOCQk2NAorI2RlZmluZSBUTFNfQ1RfUlNBX0ZJWEVEX0VDREgJCTY1CisjZGVmaW5lIFRMU19DVF9FQ0RTQV9GSVhFRF9FQ0RIIAk2NgorI2RlZmluZSBUTFNfQ1RfR09TVDk0X1NJR04JCTIxCisjZGVmaW5lIFRMU19DVF9HT1NUMDFfU0lHTgkJMjIKKy8qIHdoZW4gY29ycmVjdGluZyB0aGlzIG51bWJlciwgY29ycmVjdCBhbHNvIFNTTDNfQ1RfTlVNQkVSIGluIHNzbDMuaCAoc2VlCisgKiBjb21tZW50IHRoZXJlKSAqLworI2RlZmluZSBUTFNfQ1RfTlVNQkVSCQkJOQorCisjZGVmaW5lIFRMUzFfRklOSVNIX01BQ19MRU5HVEgJCTEyCisKKyNkZWZpbmUgVExTX01EX01BWF9DT05TVF9TSVpFCQkJMjAKKyNkZWZpbmUgVExTX01EX0NMSUVOVF9GSU5JU0hfQ09OU1QJCSJjbGllbnQgZmluaXNoZWQiCisjZGVmaW5lIFRMU19NRF9DTElFTlRfRklOSVNIX0NPTlNUX1NJWkUJCTE1CisjZGVmaW5lIFRMU19NRF9TRVJWRVJfRklOSVNIX0NPTlNUCQkic2VydmVyIGZpbmlzaGVkIgorI2RlZmluZSBUTFNfTURfU0VSVkVSX0ZJTklTSF9DT05TVF9TSVpFCQkxNQorI2RlZmluZSBUTFNfTURfU0VSVkVSX1dSSVRFX0tFWV9DT05TVAkJInNlcnZlciB3cml0ZSBrZXkiCisjZGVmaW5lIFRMU19NRF9TRVJWRVJfV1JJVEVfS0VZX0NPTlNUX1NJWkUJMTYKKyNkZWZpbmUgVExTX01EX0tFWV9FWFBBTlNJT05fQ09OU1QJCSJrZXkgZXhwYW5zaW9uIgorI2RlZmluZSBUTFNfTURfS0VZX0VYUEFOU0lPTl9DT05TVF9TSVpFCQkxMworI2RlZmluZSBUTFNfTURfQ0xJRU5UX1dSSVRFX0tFWV9DT05TVAkJImNsaWVudCB3cml0ZSBrZXkiCisjZGVmaW5lIFRMU19NRF9DTElFTlRfV1JJVEVfS0VZX0NPTlNUX1NJWkUJMTYKKyNkZWZpbmUgVExTX01EX1NFUlZFUl9XUklURV9LRVlfQ09OU1QJCSJzZXJ2ZXIgd3JpdGUga2V5IgorI2RlZmluZSBUTFNfTURfU0VSVkVSX1dSSVRFX0tFWV9DT05TVF9TSVpFCTE2CisjZGVmaW5lIFRMU19NRF9JVl9CTE9DS19DT05TVAkJCSJJViBibG9jayIKKyNkZWZpbmUgVExTX01EX0lWX0JMT0NLX0NPTlNUX1NJWkUJCTgKKyNkZWZpbmUgVExTX01EX01BU1RFUl9TRUNSRVRfQ09OU1QJCSJtYXN0ZXIgc2VjcmV0IgorI2RlZmluZSBUTFNfTURfTUFTVEVSX1NFQ1JFVF9DT05TVF9TSVpFCQkxMworCisjaWZkZWYgQ0hBUlNFVF9FQkNESUMKKyN1bmRlZiBUTFNfTURfQ0xJRU5UX0ZJTklTSF9DT05TVAorI2RlZmluZSBUTFNfTURfQ0xJRU5UX0ZJTklTSF9DT05TVCAgICAiXHg2M1x4NmNceDY5XHg2NVx4NmVceDc0XHgyMFx4NjZceDY5XHg2ZVx4NjlceDczXHg2OFx4NjVceDY0IiAgLypjbGllbnQgZmluaXNoZWQqLworI3VuZGVmIFRMU19NRF9TRVJWRVJfRklOSVNIX0NPTlNUCisjZGVmaW5lIFRMU19NRF9TRVJWRVJfRklOSVNIX0NPTlNUICAgICJceDczXHg2NVx4NzJceDc2XHg2NVx4NzJceDIwXHg2Nlx4NjlceDZlXHg2OVx4NzNceDY4XHg2NVx4NjQiICAvKnNlcnZlciBmaW5pc2hlZCovCisjdW5kZWYgVExTX01EX1NFUlZFUl9XUklURV9LRVlfQ09OU1QKKyNkZWZpbmUgVExTX01EX1NFUlZFUl9XUklURV9LRVlfQ09OU1QgIlx4NzNceDY1XHg3Mlx4NzZceDY1XHg3Mlx4MjBceDc3XHg3Mlx4NjlceDc0XHg2NVx4MjBceDZiXHg2NVx4NzkiICAvKnNlcnZlciB3cml0ZSBrZXkqLworI3VuZGVmIFRMU19NRF9LRVlfRVhQQU5TSU9OX0NPTlNUCisjZGVmaW5lIFRMU19NRF9LRVlfRVhQQU5TSU9OX0NPTlNUICAgICJceDZiXHg2NVx4NzlceDIwXHg2NVx4NzhceDcwXHg2MVx4NmVceDczXHg2OVx4NmZceDZlIiAgLyprZXkgZXhwYW5zaW9uKi8KKyN1bmRlZiBUTFNfTURfQ0xJRU5UX1dSSVRFX0tFWV9DT05TVAorI2RlZmluZSBUTFNfTURfQ0xJRU5UX1dSSVRFX0tFWV9DT05TVCAiXHg2M1x4NmNceDY5XHg2NVx4NmVceDc0XHgyMFx4NzdceDcyXHg2OVx4NzRceDY1XHgyMFx4NmJceDY1XHg3OSIgIC8qY2xpZW50IHdyaXRlIGtleSovCisjdW5kZWYgVExTX01EX1NFUlZFUl9XUklURV9LRVlfQ09OU1QKKyNkZWZpbmUgVExTX01EX1NFUlZFUl9XUklURV9LRVlfQ09OU1QgIlx4NzNceDY1XHg3Mlx4NzZceDY1XHg3Mlx4MjBceDc3XHg3Mlx4NjlceDc0XHg2NVx4MjBceDZiXHg2NVx4NzkiICAvKnNlcnZlciB3cml0ZSBrZXkqLworI3VuZGVmIFRMU19NRF9JVl9CTE9DS19DT05TVAorI2RlZmluZSBUTFNfTURfSVZfQkxPQ0tfQ09OU1QgICAgICAgICAiXHg0OVx4NTZceDIwXHg2Mlx4NmNceDZmXHg2M1x4NmIiICAvKklWIGJsb2NrKi8KKyN1bmRlZiBUTFNfTURfTUFTVEVSX1NFQ1JFVF9DT05TVAorI2RlZmluZSBUTFNfTURfTUFTVEVSX1NFQ1JFVF9DT05TVCAgICAiXHg2ZFx4NjFceDczXHg3NFx4NjVceDcyXHgyMFx4NzNceDY1XHg2M1x4NzJceDY1XHg3NCIgIC8qbWFzdGVyIHNlY3JldCovCisjZW5kaWYKKworLyogVExTIFNlc3Npb24gVGlja2V0IGV4dGVuc2lvbiBzdHJ1Y3QgKi8KK3N0cnVjdCB0bHNfc2Vzc2lvbl90aWNrZXRfZXh0X3N0CisJeworCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKwl2b2lkICpkYXRhOworCX07CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvdHMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC90cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MGU4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvdHMuaApAQCAtMCwwICsxLDg2MSBAQAorLyogY3J5cHRvL3RzL3RzLmggKi8KKy8qIFdyaXR0ZW4gYnkgWm9sdGFuIEdsb3ppayAoemdsb3ppa0BvcGVudHNhLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDIsIDIwMDMsIDIwMDQuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfVFNfSAorI2RlZmluZSBIRUFERVJfVFNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3ltaGFja3MuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19CVUZGRVIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRVZQCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zYWZlc3RhY2suaD4KKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorI2luY2x1ZGUgPG9wZW5zc2wvcnNhLmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorLyogVW5kZXIgV2luMzIgdGhpcyBpcyBkZWZpbmVkIGluIHdpbmNyeXB0LmggKi8KKyN1bmRlZiBYNTA5X05BTUUKKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC94NTA5Lmg+CisjaW5jbHVkZSA8b3BlbnNzbC94NTA5djMuaD4KKworLyoKK01lc3NhZ2VJbXByaW50IDo6PSBTRVFVRU5DRSAgeworICAgICBoYXNoQWxnb3JpdGhtICAgICAgICAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCisgICAgIGhhc2hlZE1lc3NhZ2UgICAgICAgICAgICAgICAgT0NURVQgU1RSSU5HICB9CisqLworCit0eXBlZGVmIHN0cnVjdCBUU19tc2dfaW1wcmludF9zdAorCXsKKwlYNTA5X0FMR09SICpoYXNoX2FsZ287CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmhhc2hlZF9tc2c7CisJfSBUU19NU0dfSU1QUklOVDsKKworLyoKK1RpbWVTdGFtcFJlcSA6Oj0gU0VRVUVOQ0UgIHsKKyAgIHZlcnNpb24gICAgICAgICAgICAgICAgICBJTlRFR0VSICB7IHYxKDEpIH0sCisgICBtZXNzYWdlSW1wcmludCAgICAgICAgICAgTWVzc2FnZUltcHJpbnQsCisgICAgIC0tYSBoYXNoIGFsZ29yaXRobSBPSUQgYW5kIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBkYXRhIHRvIGJlCisgICAgIC0tdGltZS1zdGFtcGVkCisgICByZXFQb2xpY3kgICAgICAgICAgICAgICAgVFNBUG9saWN5SWQgICAgICAgICAgICAgICAgT1BUSU9OQUwsCisgICBub25jZSAgICAgICAgICAgICAgICAgICAgSU5URUdFUiAgICAgICAgICAgICAgICAgICAgT1BUSU9OQUwsCisgICBjZXJ0UmVxICAgICAgICAgICAgICAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgREVGQVVMVCBGQUxTRSwKKyAgIGV4dGVuc2lvbnMgICAgICAgICAgICAgICBbMF0gSU1QTElDSVQgRXh0ZW5zaW9ucyAgICBPUFRJT05BTCAgfQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgVFNfcmVxX3N0CisJeworCUFTTjFfSU5URUdFUiAqdmVyc2lvbjsKKwlUU19NU0dfSU1QUklOVCAqbXNnX2ltcHJpbnQ7CisJQVNOMV9PQkpFQ1QgKnBvbGljeV9pZDsJCS8qIE9QVElPTkFMICovCisJQVNOMV9JTlRFR0VSICpub25jZTsJCS8qIE9QVElPTkFMICovCisJQVNOMV9CT09MRUFOIGNlcnRfcmVxOwkJLyogREVGQVVMVCBGQUxTRSAqLworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0ZW5zaW9uczsJLyogWzBdIE9QVElPTkFMICovCisJfSBUU19SRVE7CisKKy8qCitBY2N1cmFjeSA6Oj0gU0VRVUVOQ0UgeworICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgIElOVEVHRVIgICAgICAgICAgIE9QVElPTkFMLAorICAgICAgICAgICAgICAgIG1pbGxpcyAgICAgWzBdIElOVEVHRVIgICgxLi45OTkpIE9QVElPTkFMLAorICAgICAgICAgICAgICAgIG1pY3JvcyAgICAgWzFdIElOVEVHRVIgICgxLi45OTkpIE9QVElPTkFMICB9CisqLworCit0eXBlZGVmIHN0cnVjdCBUU19hY2N1cmFjeV9zdAorCXsKKwlBU04xX0lOVEVHRVIgKnNlY29uZHM7CisJQVNOMV9JTlRFR0VSICptaWxsaXM7CisJQVNOMV9JTlRFR0VSICptaWNyb3M7CisJfSBUU19BQ0NVUkFDWTsKKworLyoKK1RTVEluZm8gOjo9IFNFUVVFTkNFICB7CisgICAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICBJTlRFR0VSICB7IHYxKDEpIH0sCisgICAgcG9saWN5ICAgICAgICAgICAgICAgICAgICAgICBUU0FQb2xpY3lJZCwKKyAgICBtZXNzYWdlSW1wcmludCAgICAgICAgICAgICAgIE1lc3NhZ2VJbXByaW50LAorICAgICAgLS0gTVVTVCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBzaW1pbGFyIGZpZWxkIGluCisgICAgICAtLSBUaW1lU3RhbXBSZXEKKyAgICBzZXJpYWxOdW1iZXIgICAgICAgICAgICAgICAgIElOVEVHRVIsCisgICAgIC0tIFRpbWUtU3RhbXBpbmcgdXNlcnMgTVVTVCBiZSByZWFkeSB0byBhY2NvbW1vZGF0ZSBpbnRlZ2VycworICAgICAtLSB1cCB0byAxNjAgYml0cy4KKyAgICBnZW5UaW1lICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYWxpemVkVGltZSwKKyAgICBhY2N1cmFjeSAgICAgICAgICAgICAgICAgICAgIEFjY3VyYWN5ICAgICAgICAgICAgICAgICBPUFRJT05BTCwKKyAgICBvcmRlcmluZyAgICAgICAgICAgICAgICAgICAgIEJPT0xFQU4gICAgICAgICAgICAgREVGQVVMVCBGQUxTRSwKKyAgICBub25jZSAgICAgICAgICAgICAgICAgICAgICAgIElOVEVHRVIgICAgICAgICAgICAgICAgICBPUFRJT05BTCwKKyAgICAgIC0tIE1VU1QgYmUgcHJlc2VudCBpZiB0aGUgc2ltaWxhciBmaWVsZCB3YXMgcHJlc2VudAorICAgICAgLS0gaW4gVGltZVN0YW1wUmVxLiAgSW4gdGhhdCBjYXNlIGl0IE1VU1QgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4KKyAgICB0c2EgICAgICAgICAgICAgICAgICAgICAgICAgIFswXSBHZW5lcmFsTmFtZSAgICAgICAgICBPUFRJT05BTCwKKyAgICBleHRlbnNpb25zICAgICAgICAgICAgICAgICAgIFsxXSBJTVBMSUNJVCBFeHRlbnNpb25zICBPUFRJT05BTCAgIH0KKyovCisKK3R5cGVkZWYgc3RydWN0IFRTX3RzdF9pbmZvX3N0CisJeworCUFTTjFfSU5URUdFUiAqdmVyc2lvbjsKKwlBU04xX09CSkVDVCAqcG9saWN5X2lkOworCVRTX01TR19JTVBSSU5UICptc2dfaW1wcmludDsKKwlBU04xX0lOVEVHRVIgKnNlcmlhbDsKKwlBU04xX0dFTkVSQUxJWkVEVElNRSAqdGltZTsKKwlUU19BQ0NVUkFDWSAqYWNjdXJhY3k7CisJQVNOMV9CT09MRUFOIG9yZGVyaW5nOworCUFTTjFfSU5URUdFUiAqbm9uY2U7CisJR0VORVJBTF9OQU1FICp0c2E7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRlbnNpb25zOworCX0gVFNfVFNUX0lORk87CQorCisvKgorUEtJU3RhdHVzSW5mbyA6Oj0gU0VRVUVOQ0UgeworICAgIHN0YXR1cyAgICAgICAgUEtJU3RhdHVzLAorICAgIHN0YXR1c1N0cmluZyAgUEtJRnJlZVRleHQgICAgIE9QVElPTkFMLAorICAgIGZhaWxJbmZvICAgICAgUEtJRmFpbHVyZUluZm8gIE9QVElPTkFMICB9CisKK0Zyb20gUkZDIDE1MTAgLSBzZWN0aW9uIDMuMS4xOgorUEtJRnJlZVRleHQgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLk1BWCkgT0YgVVRGOFN0cmluZworCS0tIHRleHQgZW5jb2RlZCBhcyBVVEYtOCBTdHJpbmcgKG5vdGU6ICBlYWNoIFVURjhTdHJpbmcgU0hPVUxECisJLS0gaW5jbHVkZSBhbiBSRkMgMTc2NiBsYW5ndWFnZSB0YWcgdG8gaW5kaWNhdGUgdGhlIGxhbmd1YWdlCisJLS0gb2YgdGhlIGNvbnRhaW5lZCB0ZXh0KQorKi8KKworLyogUG9zc2libGUgdmFsdWVzIGZvciBzdGF0dXMuIFNlZSB0c19yZXNwX3ByaW50LmMgJiYgdHNfcmVzcF92ZXJpZnkuYy4gKi8KKworI2RlZmluZQlUU19TVEFUVVNfR1JBTlRFRAkJCTAKKyNkZWZpbmUJVFNfU1RBVFVTX0dSQU5URURfV0lUSF9NT0RTCQkxCisjZGVmaW5lCVRTX1NUQVRVU19SRUpFQ1RJT04JCQkyCisjZGVmaW5lCVRTX1NUQVRVU19XQUlUSU5HCQkJMworI2RlZmluZQlUU19TVEFUVVNfUkVWT0NBVElPTl9XQVJOSU5HCQk0CisjZGVmaW5lCVRTX1NUQVRVU19SRVZPQ0FUSU9OX05PVElGSUNBVElPTgk1CisKKy8qIFBvc3NpYmxlIHZhbHVlcyBmb3IgZmFpbHVyZV9pbmZvLiBTZWUgdHNfcmVzcF9wcmludC5jICYmIHRzX3Jlc3BfdmVyaWZ5LmMgKi8KKworI2RlZmluZQlUU19JTkZPX0JBRF9BTEcJCQkwCisjZGVmaW5lCVRTX0lORk9fQkFEX1JFUVVFU1QJCTIKKyNkZWZpbmUJVFNfSU5GT19CQURfREFUQV9GT1JNQVQJCTUKKyNkZWZpbmUJVFNfSU5GT19USU1FX05PVF9BVkFJTEFCTEUJMTQKKyNkZWZpbmUJVFNfSU5GT19VTkFDQ0VQVEVEX1BPTElDWQkxNQorI2RlZmluZQlUU19JTkZPX1VOQUNDRVBURURfRVhURU5TSU9OCTE2CisjZGVmaW5lCVRTX0lORk9fQUREX0lORk9fTk9UX0FWQUlMQUJMRQkxNworI2RlZmluZQlUU19JTkZPX1NZU1RFTV9GQUlMVVJFCQkyNQorCit0eXBlZGVmIHN0cnVjdCBUU19zdGF0dXNfaW5mb19zdAorCXsKKwlBU04xX0lOVEVHRVIgKnN0YXR1czsKKwlTVEFDS19PRihBU04xX1VURjhTVFJJTkcpICp0ZXh0OworCUFTTjFfQklUX1NUUklORyAqZmFpbHVyZV9pbmZvOworCX0gVFNfU1RBVFVTX0lORk87CisKK0RFQ0xBUkVfU1RBQ0tfT0YoQVNOMV9VVEY4U1RSSU5HKQorREVDTEFSRV9BU04xX1NFVF9PRihBU04xX1VURjhTVFJJTkcpCisKKy8qCitUaW1lU3RhbXBSZXNwIDo6PSBTRVFVRU5DRSAgeworICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICBQS0lTdGF0dXNJbmZvLAorICAgICB0aW1lU3RhbXBUb2tlbiAgICAgICAgICBUaW1lU3RhbXBUb2tlbiAgICAgT1BUSU9OQUwgfQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgVFNfcmVzcF9zdAorCXsKKwlUU19TVEFUVVNfSU5GTyAqc3RhdHVzX2luZm87CisJUEtDUzcgKnRva2VuOworCVRTX1RTVF9JTkZPICp0c3RfaW5mbzsKKwl9IFRTX1JFU1A7CisKKy8qIFRoZSBzdHJ1Y3R1cmUgYmVsb3cgd291bGQgYmVsb25nIHRvIHRoZSBFU1MgY29tcG9uZW50LiAqLworCisvKgorSXNzdWVyU2VyaWFsIDo6PSBTRVFVRU5DRSB7CisJaXNzdWVyICAgICAgICAgICAgICAgICAgIEdlbmVyYWxOYW1lcywKKwlzZXJpYWxOdW1iZXIgICAgICAgICAgICAgQ2VydGlmaWNhdGVTZXJpYWxOdW1iZXIKKwl9CisqLworCit0eXBlZGVmIHN0cnVjdCBFU1NfaXNzdWVyX3NlcmlhbAorCXsKKwlTVEFDS19PRihHRU5FUkFMX05BTUUpCSppc3N1ZXI7CisJQVNOMV9JTlRFR0VSCQkqc2VyaWFsOworCX0gRVNTX0lTU1VFUl9TRVJJQUw7CisKKy8qCitFU1NDZXJ0SUQgOjo9ICBTRVFVRU5DRSB7CisgICAgICAgIGNlcnRIYXNoICAgICAgICAgICAgICAgICBIYXNoLAorICAgICAgICBpc3N1ZXJTZXJpYWwgICAgICAgICAgICAgSXNzdWVyU2VyaWFsIE9QVElPTkFMCit9CisqLworCit0eXBlZGVmIHN0cnVjdCBFU1NfY2VydF9pZAorCXsKKwlBU04xX09DVEVUX1NUUklORyAqaGFzaDsJLyogQWx3YXlzIFNIQS0xIGRpZ2VzdC4gKi8KKwlFU1NfSVNTVUVSX1NFUklBTCAqaXNzdWVyX3NlcmlhbDsKKwl9IEVTU19DRVJUX0lEOworCitERUNMQVJFX1NUQUNLX09GKEVTU19DRVJUX0lEKQorREVDTEFSRV9BU04xX1NFVF9PRihFU1NfQ0VSVF9JRCkKKworLyoKK1NpZ25pbmdDZXJ0aWZpY2F0ZSA6Oj0gIFNFUVVFTkNFIHsKKyAgICAgICBjZXJ0cyAgICAgICAgU0VRVUVOQ0UgT0YgRVNTQ2VydElELAorICAgICAgIHBvbGljaWVzICAgICBTRVFVRU5DRSBPRiBQb2xpY3lJbmZvcm1hdGlvbiBPUFRJT05BTAorfQorKi8KKwordHlwZWRlZiBzdHJ1Y3QgRVNTX3NpZ25pbmdfY2VydAorCXsKKwlTVEFDS19PRihFU1NfQ0VSVF9JRCkgKmNlcnRfaWRzOworCVNUQUNLX09GKFBPTElDWUlORk8pICpwb2xpY3lfaW5mbzsKKwl9IEVTU19TSUdOSU5HX0NFUlQ7CisKKworVFNfUkVRCSpUU19SRVFfbmV3KHZvaWQpOwordm9pZAlUU19SRVFfZnJlZShUU19SRVEgKmEpOworaW50CWkyZF9UU19SRVEoY29uc3QgVFNfUkVRICphLCB1bnNpZ25lZCBjaGFyICoqcHApOworVFNfUkVRCSpkMmlfVFNfUkVRKFRTX1JFUSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpOworCitUU19SRVEJKlRTX1JFUV9kdXAoVFNfUkVRICphKTsKKworVFNfUkVRCSpkMmlfVFNfUkVRX2ZwKEZJTEUgKmZwLCBUU19SRVEgKiphKTsKK2ludAlpMmRfVFNfUkVRX2ZwKEZJTEUgKmZwLCBUU19SRVEgKmEpOworVFNfUkVRCSpkMmlfVFNfUkVRX2JpbyhCSU8gKmZwLCBUU19SRVEgKiphKTsKK2ludAlpMmRfVFNfUkVRX2JpbyhCSU8gKmZwLCBUU19SRVEgKmEpOworCitUU19NU0dfSU1QUklOVAkqVFNfTVNHX0lNUFJJTlRfbmV3KHZvaWQpOwordm9pZAkJVFNfTVNHX0lNUFJJTlRfZnJlZShUU19NU0dfSU1QUklOVCAqYSk7CitpbnQJCWkyZF9UU19NU0dfSU1QUklOVChjb25zdCBUU19NU0dfSU1QUklOVCAqYSwgdW5zaWduZWQgY2hhciAqKnBwKTsKK1RTX01TR19JTVBSSU5UCSpkMmlfVFNfTVNHX0lNUFJJTlQoVFNfTVNHX0lNUFJJTlQgKiphLAorCQkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoKTsKKworVFNfTVNHX0lNUFJJTlQJKlRTX01TR19JTVBSSU5UX2R1cChUU19NU0dfSU1QUklOVCAqYSk7CisKK1RTX01TR19JTVBSSU5UCSpkMmlfVFNfTVNHX0lNUFJJTlRfZnAoRklMRSAqZnAsIFRTX01TR19JTVBSSU5UICoqYSk7CitpbnQJCWkyZF9UU19NU0dfSU1QUklOVF9mcChGSUxFICpmcCwgVFNfTVNHX0lNUFJJTlQgKmEpOworVFNfTVNHX0lNUFJJTlQJKmQyaV9UU19NU0dfSU1QUklOVF9iaW8oQklPICpmcCwgVFNfTVNHX0lNUFJJTlQgKiphKTsKK2ludAkJaTJkX1RTX01TR19JTVBSSU5UX2JpbyhCSU8gKmZwLCBUU19NU0dfSU1QUklOVCAqYSk7CisKK1RTX1JFU1AJKlRTX1JFU1BfbmV3KHZvaWQpOwordm9pZAlUU19SRVNQX2ZyZWUoVFNfUkVTUCAqYSk7CitpbnQJaTJkX1RTX1JFU1AoY29uc3QgVFNfUkVTUCAqYSwgdW5zaWduZWQgY2hhciAqKnBwKTsKK1RTX1JFU1AJKmQyaV9UU19SRVNQKFRTX1JFU1AgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoKTsKK1RTX1RTVF9JTkZPICpQS0NTN190b19UU19UU1RfSU5GTyhQS0NTNyAqdG9rZW4pOworVFNfUkVTUAkqVFNfUkVTUF9kdXAoVFNfUkVTUCAqYSk7CisKK1RTX1JFU1AJKmQyaV9UU19SRVNQX2ZwKEZJTEUgKmZwLCBUU19SRVNQICoqYSk7CitpbnQJaTJkX1RTX1JFU1BfZnAoRklMRSAqZnAsIFRTX1JFU1AgKmEpOworVFNfUkVTUAkqZDJpX1RTX1JFU1BfYmlvKEJJTyAqZnAsIFRTX1JFU1AgKiphKTsKK2ludAlpMmRfVFNfUkVTUF9iaW8oQklPICpmcCwgVFNfUkVTUCAqYSk7CisKK1RTX1NUQVRVU19JTkZPCSpUU19TVEFUVVNfSU5GT19uZXcodm9pZCk7Cit2b2lkCQlUU19TVEFUVVNfSU5GT19mcmVlKFRTX1NUQVRVU19JTkZPICphKTsKK2ludAkJaTJkX1RTX1NUQVRVU19JTkZPKGNvbnN0IFRTX1NUQVRVU19JTkZPICphLCB1bnNpZ25lZCBjaGFyICoqcHApOworVFNfU1RBVFVTX0lORk8JKmQyaV9UU19TVEFUVVNfSU5GTyhUU19TVEFUVVNfSU5GTyAqKmEsIAorCQkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsIGxvbmcgbGVuZ3RoKTsKK1RTX1NUQVRVU19JTkZPCSpUU19TVEFUVVNfSU5GT19kdXAoVFNfU1RBVFVTX0lORk8gKmEpOworCitUU19UU1RfSU5GTwkqVFNfVFNUX0lORk9fbmV3KHZvaWQpOwordm9pZAkJVFNfVFNUX0lORk9fZnJlZShUU19UU1RfSU5GTyAqYSk7CitpbnQJCWkyZF9UU19UU1RfSU5GTyhjb25zdCBUU19UU1RfSU5GTyAqYSwgdW5zaWduZWQgY2hhciAqKnBwKTsKK1RTX1RTVF9JTkZPCSpkMmlfVFNfVFNUX0lORk8oVFNfVFNUX0lORk8gKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQkJICAgIGxvbmcgbGVuZ3RoKTsKK1RTX1RTVF9JTkZPCSpUU19UU1RfSU5GT19kdXAoVFNfVFNUX0lORk8gKmEpOworCitUU19UU1RfSU5GTwkqZDJpX1RTX1RTVF9JTkZPX2ZwKEZJTEUgKmZwLCBUU19UU1RfSU5GTyAqKmEpOworaW50CQlpMmRfVFNfVFNUX0lORk9fZnAoRklMRSAqZnAsIFRTX1RTVF9JTkZPICphKTsKK1RTX1RTVF9JTkZPCSpkMmlfVFNfVFNUX0lORk9fYmlvKEJJTyAqZnAsIFRTX1RTVF9JTkZPICoqYSk7CitpbnQJCWkyZF9UU19UU1RfSU5GT19iaW8oQklPICpmcCwgVFNfVFNUX0lORk8gKmEpOworCitUU19BQ0NVUkFDWQkqVFNfQUNDVVJBQ1lfbmV3KHZvaWQpOwordm9pZAkJVFNfQUNDVVJBQ1lfZnJlZShUU19BQ0NVUkFDWSAqYSk7CitpbnQJCWkyZF9UU19BQ0NVUkFDWShjb25zdCBUU19BQ0NVUkFDWSAqYSwgdW5zaWduZWQgY2hhciAqKnBwKTsKK1RTX0FDQ1VSQUNZCSpkMmlfVFNfQUNDVVJBQ1koVFNfQUNDVVJBQ1kgKiphLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQkJICAgIGxvbmcgbGVuZ3RoKTsKK1RTX0FDQ1VSQUNZCSpUU19BQ0NVUkFDWV9kdXAoVFNfQUNDVVJBQ1kgKmEpOworCitFU1NfSVNTVUVSX1NFUklBTCAqRVNTX0lTU1VFUl9TRVJJQUxfbmV3KHZvaWQpOwordm9pZAkJICBFU1NfSVNTVUVSX1NFUklBTF9mcmVlKEVTU19JU1NVRVJfU0VSSUFMICphKTsKK2ludAkJICBpMmRfRVNTX0lTU1VFUl9TRVJJQUwoY29uc3QgRVNTX0lTU1VFUl9TRVJJQUwgKmEsCisJCQkJCXVuc2lnbmVkIGNoYXIgKipwcCk7CitFU1NfSVNTVUVSX1NFUklBTCAqZDJpX0VTU19JU1NVRVJfU0VSSUFMKEVTU19JU1NVRVJfU0VSSUFMICoqYSwKKwkJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwgbG9uZyBsZW5ndGgpOworRVNTX0lTU1VFUl9TRVJJQUwgKkVTU19JU1NVRVJfU0VSSUFMX2R1cChFU1NfSVNTVUVSX1NFUklBTCAqYSk7CisKK0VTU19DRVJUX0lECSpFU1NfQ0VSVF9JRF9uZXcodm9pZCk7Cit2b2lkCQlFU1NfQ0VSVF9JRF9mcmVlKEVTU19DRVJUX0lEICphKTsKK2ludAkJaTJkX0VTU19DRVJUX0lEKGNvbnN0IEVTU19DRVJUX0lEICphLCB1bnNpZ25lZCBjaGFyICoqcHApOworRVNTX0NFUlRfSUQJKmQyaV9FU1NfQ0VSVF9JRChFU1NfQ0VSVF9JRCAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCQkgbG9uZyBsZW5ndGgpOworRVNTX0NFUlRfSUQJKkVTU19DRVJUX0lEX2R1cChFU1NfQ0VSVF9JRCAqYSk7CisKK0VTU19TSUdOSU5HX0NFUlQgKkVTU19TSUdOSU5HX0NFUlRfbmV3KHZvaWQpOwordm9pZAkJIEVTU19TSUdOSU5HX0NFUlRfZnJlZShFU1NfU0lHTklOR19DRVJUICphKTsKK2ludAkJIGkyZF9FU1NfU0lHTklOR19DRVJUKGNvbnN0IEVTU19TSUdOSU5HX0NFUlQgKmEsIAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKipwcCk7CitFU1NfU0lHTklOR19DRVJUICpkMmlfRVNTX1NJR05JTkdfQ0VSVChFU1NfU0lHTklOR19DRVJUICoqYSwKKwkJCQkgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLCBsb25nIGxlbmd0aCk7CitFU1NfU0lHTklOR19DRVJUICpFU1NfU0lHTklOR19DRVJUX2R1cChFU1NfU0lHTklOR19DRVJUICphKTsKKwordm9pZCBFUlJfbG9hZF9UU19zdHJpbmdzKHZvaWQpOworCitpbnQgVFNfUkVRX3NldF92ZXJzaW9uKFRTX1JFUSAqYSwgbG9uZyB2ZXJzaW9uKTsKK2xvbmcgVFNfUkVRX2dldF92ZXJzaW9uKGNvbnN0IFRTX1JFUSAqYSk7CisKK2ludCBUU19SRVFfc2V0X21zZ19pbXByaW50KFRTX1JFUSAqYSwgVFNfTVNHX0lNUFJJTlQgKm1zZ19pbXByaW50KTsKK1RTX01TR19JTVBSSU5UICpUU19SRVFfZ2V0X21zZ19pbXByaW50KFRTX1JFUSAqYSk7CisKK2ludCBUU19NU0dfSU1QUklOVF9zZXRfYWxnbyhUU19NU0dfSU1QUklOVCAqYSwgWDUwOV9BTEdPUiAqYWxnKTsKK1g1MDlfQUxHT1IgKlRTX01TR19JTVBSSU5UX2dldF9hbGdvKFRTX01TR19JTVBSSU5UICphKTsKKworaW50IFRTX01TR19JTVBSSU5UX3NldF9tc2coVFNfTVNHX0lNUFJJTlQgKmEsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4pOworQVNOMV9PQ1RFVF9TVFJJTkcgKlRTX01TR19JTVBSSU5UX2dldF9tc2coVFNfTVNHX0lNUFJJTlQgKmEpOworCitpbnQgVFNfUkVRX3NldF9wb2xpY3lfaWQoVFNfUkVRICphLCBBU04xX09CSkVDVCAqcG9saWN5KTsKK0FTTjFfT0JKRUNUICpUU19SRVFfZ2V0X3BvbGljeV9pZChUU19SRVEgKmEpOworCitpbnQgVFNfUkVRX3NldF9ub25jZShUU19SRVEgKmEsIGNvbnN0IEFTTjFfSU5URUdFUiAqbm9uY2UpOworY29uc3QgQVNOMV9JTlRFR0VSICpUU19SRVFfZ2V0X25vbmNlKGNvbnN0IFRTX1JFUSAqYSk7CisKK2ludCBUU19SRVFfc2V0X2NlcnRfcmVxKFRTX1JFUSAqYSwgaW50IGNlcnRfcmVxKTsKK2ludCBUU19SRVFfZ2V0X2NlcnRfcmVxKGNvbnN0IFRTX1JFUSAqYSk7CisKK1NUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqVFNfUkVRX2dldF9leHRzKFRTX1JFUSAqYSk7Cit2b2lkIFRTX1JFUV9leHRfZnJlZShUU19SRVEgKmEpOworaW50IFRTX1JFUV9nZXRfZXh0X2NvdW50KFRTX1JFUSAqYSk7CitpbnQgVFNfUkVRX2dldF9leHRfYnlfTklEKFRTX1JFUSAqYSwgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50IFRTX1JFUV9nZXRfZXh0X2J5X09CSihUU19SRVEgKmEsIEFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zKTsKK2ludCBUU19SRVFfZ2V0X2V4dF9ieV9jcml0aWNhbChUU19SRVEgKmEsIGludCBjcml0LCBpbnQgbGFzdHBvcyk7CitYNTA5X0VYVEVOU0lPTiAqVFNfUkVRX2dldF9leHQoVFNfUkVRICphLCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpUU19SRVFfZGVsZXRlX2V4dChUU19SRVEgKmEsIGludCBsb2MpOworaW50IFRTX1JFUV9hZGRfZXh0KFRTX1JFUSAqYSwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKTsKK3ZvaWQgKlRTX1JFUV9nZXRfZXh0X2QyaShUU19SRVEgKmEsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpOworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIFRTX1JFUSBkZWZpbmVkIGluIHRzL3RzX3JlcV9wcmludC5jICovCisKK2ludCBUU19SRVFfcHJpbnRfYmlvKEJJTyAqYmlvLCBUU19SRVEgKmEpOworCisvKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIFRTX1JFU1AgZGVmaW5lZCBpbiB0cy90c19yZXNwX3V0aWxzLmMgKi8KKworaW50IFRTX1JFU1Bfc2V0X3N0YXR1c19pbmZvKFRTX1JFU1AgKmEsIFRTX1NUQVRVU19JTkZPICppbmZvKTsKK1RTX1NUQVRVU19JTkZPICpUU19SRVNQX2dldF9zdGF0dXNfaW5mbyhUU19SRVNQICphKTsKKworLyogQ2FsbGVyIGxvc2VzIG93bmVyc2hpcCBvZiBQS0NTNyBhbmQgVFNfVFNUX0lORk8gb2JqZWN0cy4gKi8KK3ZvaWQgVFNfUkVTUF9zZXRfdHN0X2luZm8oVFNfUkVTUCAqYSwgUEtDUzcgKnA3LCBUU19UU1RfSU5GTyAqdHN0X2luZm8pOworUEtDUzcgKlRTX1JFU1BfZ2V0X3Rva2VuKFRTX1JFU1AgKmEpOworVFNfVFNUX0lORk8gKlRTX1JFU1BfZ2V0X3RzdF9pbmZvKFRTX1JFU1AgKmEpOworCitpbnQgVFNfVFNUX0lORk9fc2V0X3ZlcnNpb24oVFNfVFNUX0lORk8gKmEsIGxvbmcgdmVyc2lvbik7Citsb25nIFRTX1RTVF9JTkZPX2dldF92ZXJzaW9uKGNvbnN0IFRTX1RTVF9JTkZPICphKTsKKworaW50IFRTX1RTVF9JTkZPX3NldF9wb2xpY3lfaWQoVFNfVFNUX0lORk8gKmEsIEFTTjFfT0JKRUNUICpwb2xpY3lfaWQpOworQVNOMV9PQkpFQ1QgKlRTX1RTVF9JTkZPX2dldF9wb2xpY3lfaWQoVFNfVFNUX0lORk8gKmEpOworCitpbnQgVFNfVFNUX0lORk9fc2V0X21zZ19pbXByaW50KFRTX1RTVF9JTkZPICphLCBUU19NU0dfSU1QUklOVCAqbXNnX2ltcHJpbnQpOworVFNfTVNHX0lNUFJJTlQgKlRTX1RTVF9JTkZPX2dldF9tc2dfaW1wcmludChUU19UU1RfSU5GTyAqYSk7CisKK2ludCBUU19UU1RfSU5GT19zZXRfc2VyaWFsKFRTX1RTVF9JTkZPICphLCBjb25zdCBBU04xX0lOVEVHRVIgKnNlcmlhbCk7Citjb25zdCBBU04xX0lOVEVHRVIgKlRTX1RTVF9JTkZPX2dldF9zZXJpYWwoY29uc3QgVFNfVFNUX0lORk8gKmEpOworCitpbnQgVFNfVFNUX0lORk9fc2V0X3RpbWUoVFNfVFNUX0lORk8gKmEsIGNvbnN0IEFTTjFfR0VORVJBTElaRURUSU1FICpndGltZSk7Citjb25zdCBBU04xX0dFTkVSQUxJWkVEVElNRSAqVFNfVFNUX0lORk9fZ2V0X3RpbWUoY29uc3QgVFNfVFNUX0lORk8gKmEpOworCitpbnQgVFNfVFNUX0lORk9fc2V0X2FjY3VyYWN5KFRTX1RTVF9JTkZPICphLCBUU19BQ0NVUkFDWSAqYWNjdXJhY3kpOworVFNfQUNDVVJBQ1kgKlRTX1RTVF9JTkZPX2dldF9hY2N1cmFjeShUU19UU1RfSU5GTyAqYSk7CisKK2ludCBUU19BQ0NVUkFDWV9zZXRfc2Vjb25kcyhUU19BQ0NVUkFDWSAqYSwgY29uc3QgQVNOMV9JTlRFR0VSICpzZWNvbmRzKTsKK2NvbnN0IEFTTjFfSU5URUdFUiAqVFNfQUNDVVJBQ1lfZ2V0X3NlY29uZHMoY29uc3QgVFNfQUNDVVJBQ1kgKmEpOworCitpbnQgVFNfQUNDVVJBQ1lfc2V0X21pbGxpcyhUU19BQ0NVUkFDWSAqYSwgY29uc3QgQVNOMV9JTlRFR0VSICptaWxsaXMpOworY29uc3QgQVNOMV9JTlRFR0VSICpUU19BQ0NVUkFDWV9nZXRfbWlsbGlzKGNvbnN0IFRTX0FDQ1VSQUNZICphKTsKKworaW50IFRTX0FDQ1VSQUNZX3NldF9taWNyb3MoVFNfQUNDVVJBQ1kgKmEsIGNvbnN0IEFTTjFfSU5URUdFUiAqbWljcm9zKTsKK2NvbnN0IEFTTjFfSU5URUdFUiAqVFNfQUNDVVJBQ1lfZ2V0X21pY3Jvcyhjb25zdCBUU19BQ0NVUkFDWSAqYSk7CisKK2ludCBUU19UU1RfSU5GT19zZXRfb3JkZXJpbmcoVFNfVFNUX0lORk8gKmEsIGludCBvcmRlcmluZyk7CitpbnQgVFNfVFNUX0lORk9fZ2V0X29yZGVyaW5nKGNvbnN0IFRTX1RTVF9JTkZPICphKTsKKworaW50IFRTX1RTVF9JTkZPX3NldF9ub25jZShUU19UU1RfSU5GTyAqYSwgY29uc3QgQVNOMV9JTlRFR0VSICpub25jZSk7Citjb25zdCBBU04xX0lOVEVHRVIgKlRTX1RTVF9JTkZPX2dldF9ub25jZShjb25zdCBUU19UU1RfSU5GTyAqYSk7CisKK2ludCBUU19UU1RfSU5GT19zZXRfdHNhKFRTX1RTVF9JTkZPICphLCBHRU5FUkFMX05BTUUgKnRzYSk7CitHRU5FUkFMX05BTUUgKlRTX1RTVF9JTkZPX2dldF90c2EoVFNfVFNUX0lORk8gKmEpOworCitTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKlRTX1RTVF9JTkZPX2dldF9leHRzKFRTX1RTVF9JTkZPICphKTsKK3ZvaWQgVFNfVFNUX0lORk9fZXh0X2ZyZWUoVFNfVFNUX0lORk8gKmEpOworaW50IFRTX1RTVF9JTkZPX2dldF9leHRfY291bnQoVFNfVFNUX0lORk8gKmEpOworaW50IFRTX1RTVF9JTkZPX2dldF9leHRfYnlfTklEKFRTX1RTVF9JTkZPICphLCBpbnQgbmlkLCBpbnQgbGFzdHBvcyk7CitpbnQgVFNfVFNUX0lORk9fZ2V0X2V4dF9ieV9PQkooVFNfVFNUX0lORk8gKmEsIEFTTjFfT0JKRUNUICpvYmosIGludCBsYXN0cG9zKTsKK2ludCBUU19UU1RfSU5GT19nZXRfZXh0X2J5X2NyaXRpY2FsKFRTX1RTVF9JTkZPICphLCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpOworWDUwOV9FWFRFTlNJT04gKlRTX1RTVF9JTkZPX2dldF9leHQoVFNfVFNUX0lORk8gKmEsIGludCBsb2MpOworWDUwOV9FWFRFTlNJT04gKlRTX1RTVF9JTkZPX2RlbGV0ZV9leHQoVFNfVFNUX0lORk8gKmEsIGludCBsb2MpOworaW50IFRTX1RTVF9JTkZPX2FkZF9leHQoVFNfVFNUX0lORk8gKmEsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7Cit2b2lkICpUU19UU1RfSU5GT19nZXRfZXh0X2QyaShUU19UU1RfSU5GTyAqYSwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CisKKy8qIERlY2xhcmF0aW9ucyByZWxhdGVkIHRvIHJlc3BvbnNlIGdlbmVyYXRpb24sIGRlZmluZWQgaW4gdHMvdHNfcmVzcF9zaWduLmMuICovCisKKy8qIE9wdGlvbmFsIGZsYWdzIGZvciByZXNwb25zZSBnZW5lcmF0aW9uLiAqLworCisvKiBEb24ndCBpbmNsdWRlIHRoZSBUU0EgbmFtZSBpbiByZXNwb25zZS4gKi8KKyNkZWZpbmUJVFNfVFNBX05BTUUJCTB4MDEKKworLyogU2V0IG9yZGVyaW5nIHRvIHRydWUgaW4gcmVzcG9uc2UuICovCisjZGVmaW5lCVRTX09SREVSSU5HCQkweDAyCisKKy8qCisgKiBJbmNsdWRlIHRoZSBzaWduZXIgY2VydGlmaWNhdGUgYW5kIHRoZSBvdGhlciBzcGVjaWZpZWQgY2VydGlmaWNhdGVzIGluCisgKiB0aGUgRVNTIHNpZ25pbmcgY2VydGlmaWNhdGUgYXR0cmlidXRlIGJlc2lkZSB0aGUgUEtDUzcgc2lnbmVkIGRhdGEuCisgKiBPbmx5IHRoZSBzaWduZXIgY2VydGlmaWNhdGVzIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQuCisgKi8KKyNkZWZpbmUJVFNfRVNTX0NFUlRfSURfQ0hBSU4JMHgwNAorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uLiAqLworc3RydWN0IFRTX3Jlc3BfY3R4OworCisvKiBUaGlzIG11c3QgcmV0dXJuIGEgdW5pcXVlIG51bWJlciBsZXNzIHRoYW4gMTYwIGJpdHMgbG9uZy4gKi8KK3R5cGVkZWYgQVNOMV9JTlRFR0VSICooKlRTX3NlcmlhbF9jYikoc3RydWN0IFRTX3Jlc3BfY3R4ICosIHZvaWQgKik7CisKKy8qIFRoaXMgbXVzdCByZXR1cm4gdGhlIHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcyBzaW5jZSBKYW4gMSwgMTk3MCBpbgorICAgdGhlIHNlYyBhbmQgdXNlYyB2YXJpYWJsZXMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuIAorICAgUmV0dXJuIG5vbi16ZXJvIGZvciBzdWNjZXNzIGFuZCB6ZXJvIGZvciBmYWlsdXJlLiAqLwordHlwZWRlZglpbnQgKCpUU190aW1lX2NiKShzdHJ1Y3QgVFNfcmVzcF9jdHggKiwgdm9pZCAqLCBsb25nICpzZWMsIGxvbmcgKnVzZWMpOworCisvKiBUaGlzIG11c3QgcHJvY2VzcyB0aGUgZ2l2ZW4gZXh0ZW5zaW9uLgorICogSXQgY2FuIG1vZGlmeSB0aGUgVFNfVFNUX0lORk8gb2JqZWN0IG9mIHRoZSBjb250ZXh0LgorICogUmV0dXJuIHZhbHVlczogITAgKHByb2Nlc3NlZCksIDAgKGVycm9yLCBpdCBtdXN0IHNldCB0aGUgCisgKiBzdGF0dXMgaW5mby9mYWlsdXJlIGluZm8gb2YgdGhlIHJlc3BvbnNlKS4KKyAqLwordHlwZWRlZglpbnQgKCpUU19leHRlbnNpb25fY2IpKHN0cnVjdCBUU19yZXNwX2N0eCAqLCBYNTA5X0VYVEVOU0lPTiAqLCB2b2lkICopOworCit0eXBlZGVmIHN0cnVjdCBUU19yZXNwX2N0eAorCXsKKwlYNTA5CQkqc2lnbmVyX2NlcnQ7CisJRVZQX1BLRVkJKnNpZ25lcl9rZXk7CisJU1RBQ0tfT0YoWDUwOSkJKmNlcnRzOwkvKiBDZXJ0cyB0byBpbmNsdWRlIGluIHNpZ25lZCBkYXRhLiAqLworCVNUQUNLX09GKEFTTjFfT0JKRUNUKQkqcG9saWNpZXM7CS8qIEFjY2VwdGFibGUgcG9saWNpZXMuICovCisJQVNOMV9PQkpFQ1QJKmRlZmF1bHRfcG9saWN5OyAvKiBJdCBtYXkgYXBwZWFyIGluIHBvbGljaWVzLCB0b28uICovCisJU1RBQ0tfT0YoRVZQX01EKQkqbWRzOwkvKiBBY2NlcHRhYmxlIG1lc3NhZ2UgZGlnZXN0cy4gKi8KKwlBU04xX0lOVEVHRVIJKnNlY29uZHM7CS8qIGFjY3VyYWN5LCAwIG1lYW5zIG5vdCBzcGVjaWZpZWQuICovCisJQVNOMV9JTlRFR0VSCSptaWxsaXM7CS8qIGFjY3VyYWN5LCAwIG1lYW5zIG5vdCBzcGVjaWZpZWQuICovCisJQVNOMV9JTlRFR0VSCSptaWNyb3M7CS8qIGFjY3VyYWN5LCAwIG1lYW5zIG5vdCBzcGVjaWZpZWQuICovCisJdW5zaWduZWQJY2xvY2tfcHJlY2lzaW9uX2RpZ2l0czsgLyogZnJhY3Rpb24gb2Ygc2Vjb25kcyBpbgorCQkJCQkJICAgdGltZSBzdGFtcCB0b2tlbi4gKi8KKwl1bnNpZ25lZAlmbGFnczsJCS8qIE9wdGlvbmFsIGluZm8sIHNlZSB2YWx1ZXMgYWJvdmUuICovCisKKwkvKiBDYWxsYmFjayBmdW5jdGlvbnMuICovCisJVFNfc2VyaWFsX2NiIHNlcmlhbF9jYjsKKwl2b2lkICpzZXJpYWxfY2JfZGF0YTsJLyogVXNlciBkYXRhIGZvciBzZXJpYWxfY2IuICovCisJCisJVFNfdGltZV9jYiB0aW1lX2NiOworCXZvaWQgKnRpbWVfY2JfZGF0YTsJLyogVXNlciBkYXRhIGZvciB0aW1lX2NiLiAqLworCQorCVRTX2V4dGVuc2lvbl9jYiBleHRlbnNpb25fY2I7CisJdm9pZCAqZXh0ZW5zaW9uX2NiX2RhdGE7CS8qIFVzZXIgZGF0YSBmb3IgZXh0ZW5zaW9uX2NiLiAqLworCisJLyogVGhlc2UgbWVtYmVycyBhcmUgdXNlZCBvbmx5IHdoaWxlIGNyZWF0aW5nIHRoZSByZXNwb25zZS4gKi8KKwlUU19SRVEJCSpyZXF1ZXN0OworCVRTX1JFU1AJCSpyZXNwb25zZTsKKwlUU19UU1RfSU5GTwkqdHN0X2luZm87CisJfSBUU19SRVNQX0NUWDsKKworREVDTEFSRV9TVEFDS19PRihFVlBfTUQpCitERUNMQVJFX0FTTjFfU0VUX09GKEVWUF9NRCkKKworLyogQ3JlYXRlcyBhIHJlc3BvbnNlIGNvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgZ2VuZXJhdGluZyByZXNwb25zZXMuICovCitUU19SRVNQX0NUWCAqVFNfUkVTUF9DVFhfbmV3KHZvaWQpOwordm9pZCBUU19SRVNQX0NUWF9mcmVlKFRTX1JFU1BfQ1RYICpjdHgpOworCisvKiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIHNldC4gKi8KK2ludCBUU19SRVNQX0NUWF9zZXRfc2lnbmVyX2NlcnQoVFNfUkVTUF9DVFggKmN0eCwgWDUwOSAqc2lnbmVyKTsKKworLyogVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSBzZXQuICovCitpbnQgVFNfUkVTUF9DVFhfc2V0X3NpZ25lcl9rZXkoVFNfUkVTUF9DVFggKmN0eCwgRVZQX1BLRVkgKmtleSk7CisKKy8qIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgc2V0LiAqLworaW50IFRTX1JFU1BfQ1RYX3NldF9kZWZfcG9saWN5KFRTX1JFU1BfQ1RYICpjdHgsIEFTTjFfT0JKRUNUICpkZWZfcG9saWN5KTsKKworLyogTm8gYWRkaXRpb25hbCBjZXJ0cyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3BvbnNlIGJ5IGRlZmF1bHQuICovCitpbnQgVFNfUkVTUF9DVFhfc2V0X2NlcnRzKFRTX1JFU1BfQ1RYICpjdHgsIFNUQUNLX09GKFg1MDkpICpjZXJ0cyk7CisKKy8qIEFkZHMgYSBuZXcgYWNjZXB0YWJsZSBwb2xpY3ksIG9ubHkgdGhlIGRlZmF1bHQgcG9saWN5IAorICAgaXMgYWNjZXB0ZWQgYnkgZGVmYXVsdC4gKi8KK2ludCBUU19SRVNQX0NUWF9hZGRfcG9saWN5KFRTX1JFU1BfQ1RYICpjdHgsIEFTTjFfT0JKRUNUICpwb2xpY3kpOworCisvKiBBZGRzIGEgbmV3IGFjY2VwdGFibGUgbWVzc2FnZSBkaWdlc3QuIE5vdGUgdGhhdCBubyBtZXNzYWdlIGRpZ2VzdHMgCisgICBhcmUgYWNjZXB0ZWQgYnkgZGVmYXVsdC4gVGhlIG1kIGFyZ3VtZW50IGlzIHNoYXJlZCB3aXRoIHRoZSBjYWxsZXIuICovCitpbnQgVFNfUkVTUF9DVFhfYWRkX21kKFRTX1JFU1BfQ1RYICpjdHgsIGNvbnN0IEVWUF9NRCAqbWQpOworCisvKiBBY2N1cmFjeSBpcyBub3QgaW5jbHVkZWQgYnkgZGVmYXVsdC4gKi8KK2ludCBUU19SRVNQX0NUWF9zZXRfYWNjdXJhY3koVFNfUkVTUF9DVFggKmN0eCwKKwkJCSAgICAgaW50IHNlY3MsIGludCBtaWxsaXMsIGludCBtaWNyb3MpOworCisvKiBDbG9jayBwcmVjaXNpb24gZGlnaXRzLCBpLmUuIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHM6IAorICAgJzAnIG1lYW5zIHNlYywgJzMnIG1zZWMsICc2JyB1c2VjLCBhbmQgc28gb24uIERlZmF1bHQgaXMgMC4gKi8gCitpbnQgVFNfUkVTUF9DVFhfc2V0X2Nsb2NrX3ByZWNpc2lvbl9kaWdpdHMoVFNfUkVTUF9DVFggKmN0eCwKKwkJCQkJICAgdW5zaWduZWQgY2xvY2tfcHJlY2lzaW9uX2RpZ2l0cyk7CisvKiBBdCBtb3N0IHdlIGFjY2VwdCB1c2VjIHByZWNpc2lvbi4gKi8JCisjZGVmaW5lIFRTX01BWF9DTE9DS19QUkVDSVNJT05fRElHSVRTCTYKKworLyogTm8gZmxhZ3MgYXJlIHNldCBieSBkZWZhdWx0LiAqLwordm9pZCBUU19SRVNQX0NUWF9hZGRfZmxhZ3MoVFNfUkVTUF9DVFggKmN0eCwgaW50IGZsYWdzKTsKKworLyogRGVmYXVsdCBjYWxsYmFjayBhbHdheXMgcmV0dXJucyBhIGNvbnN0YW50LiAqLwordm9pZCBUU19SRVNQX0NUWF9zZXRfc2VyaWFsX2NiKFRTX1JFU1BfQ1RYICpjdHgsIFRTX3NlcmlhbF9jYiBjYiwgdm9pZCAqZGF0YSk7CisKKy8qIERlZmF1bHQgY2FsbGJhY2sgdXNlcyB0aGUgZ2V0dGltZW9mZGF5KCkgYW5kIGdtdGltZSgpIHN5c3RlbSBjYWxscy4gKi8KK3ZvaWQgVFNfUkVTUF9DVFhfc2V0X3RpbWVfY2IoVFNfUkVTUF9DVFggKmN0eCwgVFNfdGltZV9jYiBjYiwgdm9pZCAqZGF0YSk7CisKKy8qIERlZmF1bHQgY2FsbGJhY2sgcmVqZWN0cyBhbGwgZXh0ZW5zaW9ucy4gVGhlIGV4dGVuc2lvbiBjYWxsYmFjayBpcyBjYWxsZWQgCisgKiB3aGVuIHRoZSBUU19UU1RfSU5GTyBvYmplY3QgaXMgYWxyZWFkeSBzZXQgdXAgYW5kIG5vdCBzaWduZWQgeWV0LiAqLworLyogRklYTUU6IGV4dGVuc2lvbiBoYW5kbGluZyBpcyBub3QgdGVzdGVkIHlldC4gKi8KK3ZvaWQgVFNfUkVTUF9DVFhfc2V0X2V4dGVuc2lvbl9jYihUU19SRVNQX0NUWCAqY3R4LCAKKwkJCQkgIFRTX2V4dGVuc2lvbl9jYiBjYiwgdm9pZCAqZGF0YSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCBpbiB0aGUgY2FsbGJhY2tzLiAqLworaW50IFRTX1JFU1BfQ1RYX3NldF9zdGF0dXNfaW5mbyhUU19SRVNQX0NUWCAqY3R4LCAKKwkJCQlpbnQgc3RhdHVzLCBjb25zdCBjaGFyICp0ZXh0KTsKKworLyogU2V0cyB0aGUgc3RhdHVzIGluZm8gb25seSBpZiBpdCBpcyBzdGlsbCBUU19TVEFUVVNfR1JBTlRFRC4gKi8KK2ludCBUU19SRVNQX0NUWF9zZXRfc3RhdHVzX2luZm9fY29uZChUU19SRVNQX0NUWCAqY3R4LCAKKwkJCQkgICAgIGludCBzdGF0dXMsIGNvbnN0IGNoYXIgKnRleHQpOworCitpbnQgVFNfUkVTUF9DVFhfYWRkX2ZhaWx1cmVfaW5mbyhUU19SRVNQX0NUWCAqY3R4LCBpbnQgZmFpbHVyZSk7CisKKy8qIFRoZSBnZXQgbWV0aG9kcyBiZWxvdyBjYW4gYmUgdXNlZCBpbiB0aGUgZXh0ZW5zaW9uIGNhbGxiYWNrLiAqLworVFNfUkVRICpUU19SRVNQX0NUWF9nZXRfcmVxdWVzdChUU19SRVNQX0NUWCAqY3R4KTsKKworVFNfVFNUX0lORk8gKlRTX1JFU1BfQ1RYX2dldF90c3RfaW5mbyhUU19SRVNQX0NUWCAqY3R4KTsKKworLyogCisgKiBDcmVhdGVzIHRoZSBzaWduZWQgVFNfVFNUX0lORk8gYW5kIHB1dHMgaXQgaW4gVFNfUkVTUC4KKyAqIEluIGNhc2Ugb2YgZXJyb3JzIGl0IHNldHMgdGhlIHN0YXR1cyBpbmZvIHByb3Blcmx5LgorICogUmV0dXJucyBOVUxMIG9ubHkgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbi9mYXRhbCBlcnJvci4KKyAqLworVFNfUkVTUCAqVFNfUkVTUF9jcmVhdGVfcmVzcG9uc2UoVFNfUkVTUF9DVFggKmN0eCwgQklPICpyZXFfYmlvKTsKKworLyoKKyAqIERlY2xhcmF0aW9ucyByZWxhdGVkIHRvIHJlc3BvbnNlIHZlcmlmaWNhdGlvbiwKKyAqIHRoZXkgYXJlIGRlZmluZWQgaW4gdHMvdHNfcmVzcF92ZXJpZnkuYy4KKyAqLworCitpbnQgVFNfUkVTUF92ZXJpZnlfc2lnbmF0dXJlKFBLQ1M3ICp0b2tlbiwgU1RBQ0tfT0YoWDUwOSkgKmNlcnRzLAorCQkJICAgICBYNTA5X1NUT1JFICpzdG9yZSwgWDUwOSAqKnNpZ25lcl9vdXQpOworCisvKiBDb250ZXh0IHN0cnVjdHVyZSBmb3IgdGhlIGdlbmVyaWMgdmVyaWZ5IG1ldGhvZC4gKi8KKworLyogVmVyaWZ5IHRoZSBzaWduZXIncyBjZXJ0aWZpY2F0ZSBhbmQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgcmVzcG9uc2UuICovCisjZGVmaW5lCVRTX1ZGWV9TSUdOQVRVUkUJKDF1IDw8IDApCisvKiBWZXJpZnkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSByZXNwb25zZS4gKi8KKyNkZWZpbmUJVFNfVkZZX1ZFUlNJT04JCSgxdSA8PCAxKQorLyogVmVyaWZ5IGlmIHRoZSBwb2xpY3kgc3VwcGxpZWQgYnkgdGhlIHVzZXIgbWF0Y2hlcyB0aGUgcG9saWN5IG9mIHRoZSBUU0EuICovCisjZGVmaW5lCVRTX1ZGWV9QT0xJQ1kJCSgxdSA8PCAyKQorLyogVmVyaWZ5IHRoZSBtZXNzYWdlIGltcHJpbnQgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIFRoaXMgZmxhZyBzaG91bGQgbm90IGJlCisgICBzcGVjaWZpZWQgd2l0aCBUU19WRllfREFUQS4gKi8KKyNkZWZpbmUJVFNfVkZZX0lNUFJJTlQJCSgxdSA8PCAzKQorLyogVmVyaWZ5IHRoZSBtZXNzYWdlIGltcHJpbnQgY29tcHV0ZWQgYnkgdGhlIHZlcmlmeSBtZXRob2QgZnJvbSB0aGUgdXNlcgorICAgcHJvdmlkZWQgZGF0YSBhbmQgdGhlIE1EIGFsZ29yaXRobSBvZiB0aGUgcmVzcG9uc2UuIFRoaXMgZmxhZyBzaG91bGQgbm90IGJlCisgICBzcGVjaWZpZWQgd2l0aCBUU19WRllfSU1QUklOVC4gKi8KKyNkZWZpbmUJVFNfVkZZX0RBVEEJCSgxdSA8PCA0KQorLyogVmVyaWZ5IHRoZSBub25jZSB2YWx1ZS4gKi8KKyNkZWZpbmUJVFNfVkZZX05PTkNFCQkoMXUgPDwgNSkKKy8qIFZlcmlmeSBpZiB0aGUgVFNBIG5hbWUgZmllbGQgbWF0Y2hlcyB0aGUgc2lnbmVyIGNlcnRpZmljYXRlLiAqLworI2RlZmluZQlUU19WRllfU0lHTkVSCQkoMXUgPDwgNikKKy8qIFZlcmlmeSBpZiB0aGUgVFNBIG5hbWUgZmllbGQgZXF1YWxzIHRvIHRoZSB1c2VyIHByb3ZpZGVkIG5hbWUuICovCisjZGVmaW5lCVRTX1ZGWV9UU0FfTkFNRQkJKDF1IDw8IDcpCisKKy8qIFlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29udmVuaWVuY2UgY29uc3RhbnRzLiAqLworI2RlZmluZQlUU19WRllfQUxMX0lNUFJJTlQJKFRTX1ZGWV9TSUdOQVRVUkUJXAorCQkJCSB8IFRTX1ZGWV9WRVJTSU9OCVwKKwkJCQkgfCBUU19WRllfUE9MSUNZCVwKKwkJCQkgfCBUU19WRllfSU1QUklOVAlcCisJCQkJIHwgVFNfVkZZX05PTkNFCQlcCisJCQkJIHwgVFNfVkZZX1NJR05FUglcCisJCQkJIHwgVFNfVkZZX1RTQV9OQU1FKQorI2RlZmluZQlUU19WRllfQUxMX0RBVEEJCShUU19WRllfU0lHTkFUVVJFCVwKKwkJCQkgfCBUU19WRllfVkVSU0lPTglcCisJCQkJIHwgVFNfVkZZX1BPTElDWQlcCisJCQkJIHwgVFNfVkZZX0RBVEEJCVwKKwkJCQkgfCBUU19WRllfTk9OQ0UJCVwKKwkJCQkgfCBUU19WRllfU0lHTkVSCVwKKwkJCQkgfCBUU19WRllfVFNBX05BTUUpCisKK3R5cGVkZWYgc3RydWN0IFRTX3ZlcmlmeV9jdHgKKwl7CisJLyogU2V0IHRoaXMgdG8gdGhlIHVuaW9uIG9mIFRTX1ZGWV8uLi4gZmxhZ3MgeW91IHdhbnQgdG8gY2Fycnkgb3V0LiAqLworCXVuc2lnbmVkCWZsYWdzOworCisJLyogTXVzdCBiZSBzZXQgb25seSB3aXRoIFRTX1ZGWV9TSUdOQVRVUkUuIGNlcnRzIGlzIG9wdGlvbmFsLiAqLworCVg1MDlfU1RPUkUJKnN0b3JlOworCVNUQUNLX09GKFg1MDkpCSpjZXJ0czsKKworCS8qIE11c3QgYmUgc2V0IG9ubHkgd2l0aCBUU19WRllfUE9MSUNZLiAqLworCUFTTjFfT0JKRUNUCSpwb2xpY3k7CisKKwkvKiBNdXN0IGJlIHNldCBvbmx5IHdpdGggVFNfVkZZX0lNUFJJTlQuIElmIG1kX2FsZyBpcyBOVUxMLCAKKwkgICB0aGUgYWxnb3JpdGhtIGZyb20gdGhlIHJlc3BvbnNlIGlzIHVzZWQuICovCisJWDUwOV9BTEdPUgkqbWRfYWxnOworCXVuc2lnbmVkIGNoYXIJKmltcHJpbnQ7CisJdW5zaWduZWQJaW1wcmludF9sZW47CisKKwkvKiBNdXN0IGJlIHNldCBvbmx5IHdpdGggVFNfVkZZX0RBVEEuICovCisJQklPCQkqZGF0YTsKKworCS8qIE11c3QgYmUgc2V0IG9ubHkgd2l0aCBUU19WRllfVFNBX05BTUUuICovCisJQVNOMV9JTlRFR0VSCSpub25jZTsKKworCS8qIE11c3QgYmUgc2V0IG9ubHkgd2l0aCBUU19WRllfVFNBX05BTUUuICovCisJR0VORVJBTF9OQU1FCSp0c2FfbmFtZTsKKwl9IFRTX1ZFUklGWV9DVFg7CisKK2ludCBUU19SRVNQX3ZlcmlmeV9yZXNwb25zZShUU19WRVJJRllfQ1RYICpjdHgsIFRTX1JFU1AgKnJlc3BvbnNlKTsKK2ludCBUU19SRVNQX3ZlcmlmeV90b2tlbihUU19WRVJJRllfQ1RYICpjdHgsIFBLQ1M3ICp0b2tlbik7CisKKy8qCisgKiBEZWNsYXJhdGlvbnMgcmVsYXRlZCB0byByZXNwb25zZSB2ZXJpZmljYXRpb24gY29udGV4dCwKKyAqIHRoZXkgYXJlIGRlZmluZWQgaW4gdHMvdHNfdmVyaWZ5X2N0eC5jLgorICovCisKKy8qIFNldCBhbGwgZmllbGRzIHRvIHplcm8uICovCitUU19WRVJJRllfQ1RYICpUU19WRVJJRllfQ1RYX25ldyh2b2lkKTsKK3ZvaWQgVFNfVkVSSUZZX0NUWF9pbml0KFRTX1ZFUklGWV9DVFggKmN0eCk7Cit2b2lkIFRTX1ZFUklGWV9DVFhfZnJlZShUU19WRVJJRllfQ1RYICpjdHgpOwordm9pZCBUU19WRVJJRllfQ1RYX2NsZWFudXAoVFNfVkVSSUZZX0NUWCAqY3R4KTsKKworLyogCisgKiBJZiBjdHggaXMgTlVMTCwgaXQgYWxsb2NhdGVzIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCwgb3RoZXJ3aXNlCisgKiBpdCByZXR1cm5zIGN0eC4gSXQgaW5pdGlhbGlzZXMgYWxsIHRoZSBtZW1iZXJzIGFzIGZvbGxvd3M6CisgKiBmbGFncyA9IFRTX1ZGWV9BTExfSU1QUklOVCAmIH4oVFNfVkZZX1RTQV9OQU1FIHwgVFNfVkZZX1NJR05BVFVSRSkKKyAqIGNlcnRzID0gTlVMTAorICogc3RvcmUgPSBOVUxMCisgKiBwb2xpY3kgPSBwb2xpY3kgZnJvbSB0aGUgcmVxdWVzdCBvciBOVUxMIGlmIGFic2VudCAoaW4gdGhpcyBjYXNlCisgKglUU19WRllfUE9MSUNZIGlzIGNsZWFyZWQgZnJvbSBmbGFncyBhcyB3ZWxsKQorICogbWRfYWxnID0gTUQgYWxnb3JpdGhtIGZyb20gcmVxdWVzdAorICogaW1wcmludCwgaW1wcmludF9sZW4gPSBpbXByaW50IGZyb20gcmVxdWVzdAorICogZGF0YSA9IE5VTEwKKyAqIG5vbmNlLCBub25jZV9sZW4gPSBub25jZSBmcm9tIHRoZSByZXF1ZXN0IG9yIE5VTEwgaWYgYWJzZW50IChpbiB0aGlzIGNhc2UKKyAqIAlUU19WRllfTk9OQ0UgaXMgY2xlYXJlZCBmcm9tIGZsYWdzIGFzIHdlbGwpCisgKiB0c2FfbmFtZSA9IE5VTEwKKyAqIEltcG9ydGFudDogYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBUU19WRllfU0lHTkFUVVJFIHNob3VsZCBiZSBhZGRlZCEKKyAqLworVFNfVkVSSUZZX0NUWCAqVFNfUkVRX3RvX1RTX1ZFUklGWV9DVFgoVFNfUkVRICpyZXEsIFRTX1ZFUklGWV9DVFggKmN0eCk7CisKKy8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBmb3IgVFNfUkVTUCBkZWZpbmVkIGluIHRzL3RzX3Jlc3BfcHJpbnQuYyAqLworCitpbnQgVFNfUkVTUF9wcmludF9iaW8oQklPICpiaW8sIFRTX1JFU1AgKmEpOworaW50IFRTX1NUQVRVU19JTkZPX3ByaW50X2JpbyhCSU8gKmJpbywgVFNfU1RBVFVTX0lORk8gKmEpOworaW50IFRTX1RTVF9JTkZPX3ByaW50X2JpbyhCSU8gKmJpbywgVFNfVFNUX0lORk8gKmEpOworCisvKiBDb21tb24gdXRpbGl0eSBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0cy90c19saWIuYyAqLworCitpbnQgVFNfQVNOMV9JTlRFR0VSX3ByaW50X2JpbyhCSU8gKmJpbywgY29uc3QgQVNOMV9JTlRFR0VSICpudW0pOworaW50IFRTX09CSl9wcmludF9iaW8oQklPICpiaW8sIGNvbnN0IEFTTjFfT0JKRUNUICpvYmopOworaW50IFRTX2V4dF9wcmludF9iaW8oQklPICpiaW8sIGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0ZW5zaW9ucyk7CitpbnQgVFNfWDUwOV9BTEdPUl9wcmludF9iaW8oQklPICpiaW8sIGNvbnN0IFg1MDlfQUxHT1IgKmFsZyk7CitpbnQgVFNfTVNHX0lNUFJJTlRfcHJpbnRfYmlvKEJJTyAqYmlvLCBUU19NU0dfSU1QUklOVCAqbXNnKTsKKworLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciBoYW5kbGluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMsCisgICBkZWZpbmVkIGluIHRzL3RzX2NvbmYuYyAqLworCitYNTA5ICpUU19DT05GX2xvYWRfY2VydChjb25zdCBjaGFyICpmaWxlKTsKK1NUQUNLX09GKFg1MDkpICpUU19DT05GX2xvYWRfY2VydHMoY29uc3QgY2hhciAqZmlsZSk7CitFVlBfUEtFWSAqVFNfQ09ORl9sb2FkX2tleShjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpwYXNzKTsKK2NvbnN0IGNoYXIgKlRTX0NPTkZfZ2V0X3RzYV9zZWN0aW9uKENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKnNlY3Rpb24pOworaW50IFRTX0NPTkZfc2V0X3NlcmlhbChDT05GICpjb25mLCBjb25zdCBjaGFyICpzZWN0aW9uLCBUU19zZXJpYWxfY2IgY2IsCisJCSAgICAgICBUU19SRVNQX0NUWCAqY3R4KTsKK2ludCBUU19DT05GX3NldF9jcnlwdG9fZGV2aWNlKENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKnNlY3Rpb24sCisJCQkgICAgICBjb25zdCBjaGFyICpkZXZpY2UpOworaW50IFRTX0NPTkZfc2V0X2RlZmF1bHRfZW5naW5lKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IFRTX0NPTkZfc2V0X3NpZ25lcl9jZXJ0KENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKnNlY3Rpb24sCisJCQkgICAgY29uc3QgY2hhciAqY2VydCwgVFNfUkVTUF9DVFggKmN0eCk7CitpbnQgVFNfQ09ORl9zZXRfY2VydHMoQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqY2VydHMsCisJCSAgICAgIFRTX1JFU1BfQ1RYICpjdHgpOworaW50IFRTX0NPTkZfc2V0X3NpZ25lcl9rZXkoQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwKKwkJCSAgIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqcGFzcywgVFNfUkVTUF9DVFggKmN0eCk7CitpbnQgVFNfQ09ORl9zZXRfZGVmX3BvbGljeShDT05GICpjb25mLCBjb25zdCBjaGFyICpzZWN0aW9uLAorCQkJICAgY29uc3QgY2hhciAqcG9saWN5LCBUU19SRVNQX0NUWCAqY3R4KTsKK2ludCBUU19DT05GX3NldF9wb2xpY2llcyhDT05GICpjb25mLCBjb25zdCBjaGFyICpzZWN0aW9uLCBUU19SRVNQX0NUWCAqY3R4KTsKK2ludCBUU19DT05GX3NldF9kaWdlc3RzKENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKnNlY3Rpb24sIFRTX1JFU1BfQ1RYICpjdHgpOworaW50IFRTX0NPTkZfc2V0X2FjY3VyYWN5KENPTkYgKmNvbmYsIGNvbnN0IGNoYXIgKnNlY3Rpb24sIFRTX1JFU1BfQ1RYICpjdHgpOworaW50IFRTX0NPTkZfc2V0X2Nsb2NrX3ByZWNpc2lvbl9kaWdpdHMoQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwKKwkJCQkgICAgICAgVFNfUkVTUF9DVFggKmN0eCk7CitpbnQgVFNfQ09ORl9zZXRfb3JkZXJpbmcoQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwgVFNfUkVTUF9DVFggKmN0eCk7CitpbnQgVFNfQ09ORl9zZXRfdHNhX25hbWUoQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwgVFNfUkVTUF9DVFggKmN0eCk7CitpbnQgVFNfQ09ORl9zZXRfZXNzX2NlcnRfaWRfY2hhaW4oQ09ORiAqY29uZiwgY29uc3QgY2hhciAqc2VjdGlvbiwKKwkJCQkgIFRTX1JFU1BfQ1RYICpjdHgpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9UU19zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIFRTIGZ1bmN0aW9ucy4gKi8KKworLyogRnVuY3Rpb24gY29kZXMuICovCisjZGVmaW5lIFRTX0ZfRDJJX1RTX1JFU1AJCQkJIDE0NworI2RlZmluZSBUU19GX0RFRl9TRVJJQUxfQ0IJCQkJIDExMAorI2RlZmluZSBUU19GX0RFRl9USU1FX0NCCQkJCSAxMTEKKyNkZWZpbmUgVFNfRl9FU1NfQUREX1NJR05JTkdfQ0VSVAkJCSAxMTIKKyNkZWZpbmUgVFNfRl9FU1NfQ0VSVF9JRF9ORVdfSU5JVAkJCSAxMTMKKyNkZWZpbmUgVFNfRl9FU1NfU0lHTklOR19DRVJUX05FV19JTklUCQkJIDExNAorI2RlZmluZSBUU19GX0lOVF9UU19SRVNQX1ZFUklGWV9UT0tFTgkJCSAxNDkKKyNkZWZpbmUgVFNfRl9QS0NTN19UT19UU19UU1RfSU5GTwkJCSAxNDgKKyNkZWZpbmUgVFNfRl9UU19BQ0NVUkFDWV9TRVRfTUlDUk9TCQkJIDExNQorI2RlZmluZSBUU19GX1RTX0FDQ1VSQUNZX1NFVF9NSUxMSVMJCQkgMTE2CisjZGVmaW5lIFRTX0ZfVFNfQUNDVVJBQ1lfU0VUX1NFQ09ORFMJCQkgMTE3CisjZGVmaW5lIFRTX0ZfVFNfQ0hFQ0tfSU1QUklOVFMJCQkJIDEwMAorI2RlZmluZSBUU19GX1RTX0NIRUNLX05PTkNFUwkJCQkgMTAxCisjZGVmaW5lIFRTX0ZfVFNfQ0hFQ0tfUE9MSUNZCQkJCSAxMDIKKyNkZWZpbmUgVFNfRl9UU19DSEVDS19TSUdOSU5HX0NFUlRTCQkJIDEwMworI2RlZmluZSBUU19GX1RTX0NIRUNLX1NUQVRVU19JTkZPCQkJIDEwNAorI2RlZmluZSBUU19GX1RTX0NPTVBVVEVfSU1QUklOVAkJCQkgMTQ1CisjZGVmaW5lIFRTX0ZfVFNfQ09ORl9TRVRfREVGQVVMVF9FTkdJTkUJCQkgMTQ2CisjZGVmaW5lIFRTX0ZfVFNfR0VUX1NUQVRVU19URVhUCQkJCSAxMDUKKyNkZWZpbmUgVFNfRl9UU19NU0dfSU1QUklOVF9TRVRfQUxHTwkJCSAxMTgKKyNkZWZpbmUgVFNfRl9UU19SRVFfU0VUX01TR19JTVBSSU5UCQkJIDExOQorI2RlZmluZSBUU19GX1RTX1JFUV9TRVRfTk9OQ0UJCQkJIDEyMAorI2RlZmluZSBUU19GX1RTX1JFUV9TRVRfUE9MSUNZX0lECQkJIDEyMQorI2RlZmluZSBUU19GX1RTX1JFU1BfQ1JFQVRFX1JFU1BPTlNFCQkJIDEyMgorI2RlZmluZSBUU19GX1RTX1JFU1BfQ1JFQVRFX1RTVF9JTkZPCQkJIDEyMworI2RlZmluZSBUU19GX1RTX1JFU1BfQ1RYX0FERF9GQUlMVVJFX0lORk8JCSAxMjQKKyNkZWZpbmUgVFNfRl9UU19SRVNQX0NUWF9BRERfTUQJCQkJIDEyNQorI2RlZmluZSBUU19GX1RTX1JFU1BfQ1RYX0FERF9QT0xJQ1kJCQkgMTI2CisjZGVmaW5lIFRTX0ZfVFNfUkVTUF9DVFhfTkVXCQkJCSAxMjcKKyNkZWZpbmUgVFNfRl9UU19SRVNQX0NUWF9TRVRfQUNDVVJBQ1kJCQkgMTI4CisjZGVmaW5lIFRTX0ZfVFNfUkVTUF9DVFhfU0VUX0NFUlRTCQkJIDEyOQorI2RlZmluZSBUU19GX1RTX1JFU1BfQ1RYX1NFVF9ERUZfUE9MSUNZCQkJIDEzMAorI2RlZmluZSBUU19GX1RTX1JFU1BfQ1RYX1NFVF9TSUdORVJfQ0VSVAkJIDEzMQorI2RlZmluZSBUU19GX1RTX1JFU1BfQ1RYX1NFVF9TVEFUVVNfSU5GTwkJIDEzMgorI2RlZmluZSBUU19GX1RTX1JFU1BfR0VUX1BPTElDWQkJCQkgMTMzCisjZGVmaW5lIFRTX0ZfVFNfUkVTUF9TRVRfR0VOVElNRV9XSVRIX1BSRUNJU0lPTgkJIDEzNAorI2RlZmluZSBUU19GX1RTX1JFU1BfU0VUX1NUQVRVU19JTkZPCQkJIDEzNQorI2RlZmluZSBUU19GX1RTX1JFU1BfU0VUX1RTVF9JTkZPCQkJIDE1MAorI2RlZmluZSBUU19GX1RTX1JFU1BfU0lHTgkJCQkgMTM2CisjZGVmaW5lIFRTX0ZfVFNfUkVTUF9WRVJJRllfU0lHTkFUVVJFCQkJIDEwNgorI2RlZmluZSBUU19GX1RTX1JFU1BfVkVSSUZZX1RPS0VOCQkJIDEwNworI2RlZmluZSBUU19GX1RTX1RTVF9JTkZPX1NFVF9BQ0NVUkFDWQkJCSAxMzcKKyNkZWZpbmUgVFNfRl9UU19UU1RfSU5GT19TRVRfTVNHX0lNUFJJTlQJCSAxMzgKKyNkZWZpbmUgVFNfRl9UU19UU1RfSU5GT19TRVRfTk9OQ0UJCQkgMTM5CisjZGVmaW5lIFRTX0ZfVFNfVFNUX0lORk9fU0VUX1BPTElDWV9JRAkJCSAxNDAKKyNkZWZpbmUgVFNfRl9UU19UU1RfSU5GT19TRVRfU0VSSUFMCQkJIDE0MQorI2RlZmluZSBUU19GX1RTX1RTVF9JTkZPX1NFVF9USU1FCQkJIDE0MgorI2RlZmluZSBUU19GX1RTX1RTVF9JTkZPX1NFVF9UU0EJCQkgMTQzCisjZGVmaW5lIFRTX0ZfVFNfVkVSSUZZCQkJCQkgMTA4CisjZGVmaW5lIFRTX0ZfVFNfVkVSSUZZX0NFUlQJCQkJIDEwOQorI2RlZmluZSBUU19GX1RTX1ZFUklGWV9DVFhfTkVXCQkJCSAxNDQKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBUU19SX0JBRF9QS0NTN19UWVBFCQkJCSAxMzIKKyNkZWZpbmUgVFNfUl9CQURfVFlQRQkJCQkJIDEzMworI2RlZmluZSBUU19SX0NFUlRJRklDQVRFX1ZFUklGWV9FUlJPUgkJCSAxMDAKKyNkZWZpbmUgVFNfUl9DT1VMRF9OT1RfU0VUX0VOR0lORQkJCSAxMjcKKyNkZWZpbmUgVFNfUl9DT1VMRF9OT1RfU0VUX1RJTUUJCQkJIDExNQorI2RlZmluZSBUU19SX0QySV9UU19SRVNQX0lOVF9GQUlMRUQJCQkgMTI4CisjZGVmaW5lIFRTX1JfREVUQUNIRURfQ09OVEVOVAkJCQkgMTM0CisjZGVmaW5lIFRTX1JfRVNTX0FERF9TSUdOSU5HX0NFUlRfRVJST1IJCQkgMTE2CisjZGVmaW5lIFRTX1JfRVNTX1NJR05JTkdfQ0VSVElGSUNBVEVfRVJST1IJCSAxMDEKKyNkZWZpbmUgVFNfUl9JTlZBTElEX05VTExfUE9JTlRFUgkJCSAxMDIKKyNkZWZpbmUgVFNfUl9JTlZBTElEX1NJR05FUl9DRVJUSUZJQ0FURV9QVVJQT1NFCQkgMTE3CisjZGVmaW5lIFRTX1JfTUVTU0FHRV9JTVBSSU5UX01JU01BVENICQkJIDEwMworI2RlZmluZSBUU19SX05PTkNFX01JU01BVENICQkJCSAxMDQKKyNkZWZpbmUgVFNfUl9OT05DRV9OT1RfUkVUVVJORUQJCQkJIDEwNQorI2RlZmluZSBUU19SX05PX0NPTlRFTlQJCQkJCSAxMDYKKyNkZWZpbmUgVFNfUl9OT19USU1FX1NUQU1QX1RPS0VOCQkJIDEwNworI2RlZmluZSBUU19SX1BLQ1M3X0FERF9TSUdOQVRVUkVfRVJST1IJCQkgMTE4CisjZGVmaW5lIFRTX1JfUEtDUzdfQUREX1NJR05FRF9BVFRSX0VSUk9SCQkgMTE5CisjZGVmaW5lIFRTX1JfUEtDUzdfVE9fVFNfVFNUX0lORk9fRkFJTEVECQkgMTI5CisjZGVmaW5lIFRTX1JfUE9MSUNZX01JU01BVENICQkJCSAxMDgKKyNkZWZpbmUgVFNfUl9QUklWQVRFX0tFWV9ET0VTX05PVF9NQVRDSF9DRVJUSUZJQ0FURQkgMTIwCisjZGVmaW5lIFRTX1JfUkVTUE9OU0VfU0VUVVBfRVJST1IJCQkgMTIxCisjZGVmaW5lIFRTX1JfU0lHTkFUVVJFX0ZBSUxVUkUJCQkJIDEwOQorI2RlZmluZSBUU19SX1RIRVJFX01VU1RfQkVfT05FX1NJR05FUgkJCSAxMTAKKyNkZWZpbmUgVFNfUl9USU1FX1NZU0NBTExfRVJST1IJCQkJIDEyMgorI2RlZmluZSBUU19SX1RPS0VOX05PVF9QUkVTRU5UCQkJCSAxMzAKKyNkZWZpbmUgVFNfUl9UT0tFTl9QUkVTRU5UCQkJCSAxMzEKKyNkZWZpbmUgVFNfUl9UU0FfTkFNRV9NSVNNQVRDSAkJCQkgMTExCisjZGVmaW5lIFRTX1JfVFNBX1VOVFJVU1RFRAkJCQkgMTEyCisjZGVmaW5lIFRTX1JfVFNUX0lORk9fU0VUVVBfRVJST1IJCQkgMTIzCisjZGVmaW5lIFRTX1JfVFNfREFUQVNJR04JCQkJIDEyNAorI2RlZmluZSBUU19SX1VOQUNDRVBUQUJMRV9QT0xJQ1kJCQkgMTI1CisjZGVmaW5lIFRTX1JfVU5TVVBQT1JURURfTURfQUxHT1JJVEhNCQkJIDEyNgorI2RlZmluZSBUU19SX1VOU1VQUE9SVEVEX1ZFUlNJT04JCQkgMTEzCisjZGVmaW5lIFRTX1JfV1JPTkdfQ09OVEVOVF9UWVBFCQkJCSAxMTQKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC90eHRfZGIuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC90eHRfZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWJlNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3R4dF9kYi5oCkBAIC0wLDAgKzEsMTEyIEBACisvKiBjcnlwdG8vdHh0X2RiL3R4dF9kYi5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1RYVF9EQl9ICisjZGVmaW5lIEhFQURFUl9UWFRfREJfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9saGFzaC5oPgorCisjZGVmaW5lIERCX0VSUk9SX09LCQkJMAorI2RlZmluZSBEQl9FUlJPUl9NQUxMT0MJCQkxCisjZGVmaW5lIERCX0VSUk9SX0lOREVYX0NMQVNIICAgIAkyCisjZGVmaW5lIERCX0VSUk9SX0lOREVYX09VVF9PRl9SQU5HRQkzCisjZGVmaW5lIERCX0VSUk9SX05PX0lOREVYCQk0CisjZGVmaW5lIERCX0VSUk9SX0lOU0VSVF9JTkRFWF9DTEFTSCAgICAJNQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIE9QRU5TU0xfU1RSSU5HICpPUEVOU1NMX1BTVFJJTkc7CitERUNMQVJFX1NQRUNJQUxfU1RBQ0tfT0YoT1BFTlNTTF9QU1RSSU5HLCBPUEVOU1NMX1NUUklORykKKwordHlwZWRlZiBzdHJ1Y3QgdHh0X2RiX3N0CisJeworCWludCBudW1fZmllbGRzOworCVNUQUNLX09GKE9QRU5TU0xfUFNUUklORykgKmRhdGE7CisJTEhBU0hfT0YoT1BFTlNTTF9TVFJJTkcpICoqaW5kZXg7CisJaW50ICgqKnF1YWwpKE9QRU5TU0xfU1RSSU5HICopOworCWxvbmcgZXJyb3I7CisJbG9uZyBhcmcxOworCWxvbmcgYXJnMjsKKwlPUEVOU1NMX1NUUklORyAqYXJnX3JvdzsKKwl9IFRYVF9EQjsKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworVFhUX0RCICpUWFRfREJfcmVhZChCSU8gKmluLCBpbnQgbnVtKTsKK2xvbmcgVFhUX0RCX3dyaXRlKEJJTyAqb3V0LCBUWFRfREIgKmRiKTsKKyNlbHNlCitUWFRfREIgKlRYVF9EQl9yZWFkKGNoYXIgKmluLCBpbnQgbnVtKTsKK2xvbmcgVFhUX0RCX3dyaXRlKGNoYXIgKm91dCwgVFhUX0RCICpkYik7CisjZW5kaWYKK2ludCBUWFRfREJfY3JlYXRlX2luZGV4KFRYVF9EQiAqZGIsaW50IGZpZWxkLGludCAoKnF1YWwpKE9QRU5TU0xfU1RSSU5HICopLAorCQkJTEhBU0hfSEFTSF9GTl9UWVBFIGhhc2gsIExIQVNIX0NPTVBfRk5fVFlQRSBjbXApOwordm9pZCBUWFRfREJfZnJlZShUWFRfREIgKmRiKTsKK09QRU5TU0xfU1RSSU5HICpUWFRfREJfZ2V0X2J5X2luZGV4KFRYVF9EQiAqZGIsIGludCBpZHgsIE9QRU5TU0xfU1RSSU5HICp2YWx1ZSk7CitpbnQgVFhUX0RCX2luc2VydChUWFRfREIgKmRiLCBPUEVOU1NMX1NUUklORyAqdmFsdWUpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvdWkuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC91aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWNmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wvdWkuaApAQCAtMCwwICsxLDM4MyBAQAorLyogY3J5cHRvL3VpL3VpLmggLSotIG1vZGU6QzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgUmljaGFyZCBMZXZpdHRlIChyaWNoYXJkQGxldml0dGUub3JnKSBmb3IgdGhlIE9wZW5TU0wKKyAqIHByb2plY3QgMjAwMS4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmIEhFQURFUl9VSV9ICisjZGVmaW5lIEhFQURFUl9VSV9ICisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvc2FmZXN0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBEZWNsYXJlZCBhbHJlYWR5IGluIG9zc2xfdHlwLmggKi8KKy8qIHR5cGVkZWYgc3RydWN0IHVpX3N0IFVJOyAqLworLyogdHlwZWRlZiBzdHJ1Y3QgdWlfbWV0aG9kX3N0IFVJX01FVEhPRDsgKi8KKworCisvKiBBbGwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIC0xIG9yIE5VTEwgb24gZXJyb3IgYW5kIGluIHNvbWUgY2FzZXMKKyAgIChVSV9wcm9jZXNzKCkpIC0yIGlmIGludGVycnVwdGVkIG9yIGluIHNvbWUgb3RoZXIgd2F5IGNhbmNlbGxlZC4KKyAgIFdoZW4gZXZlcnl0aGluZyBpcyBmaW5lLCB0aGV5IHJldHVybiAwLCBhIHBvc2l0aXZlIHZhbHVlIG9yIGEgbm9uLU5VTEwKKyAgIHBvaW50ZXIsIGFsbCBkZXBlbmRpbmcgb24gdGhlaXIgcHVycG9zZS4gKi8KKworLyogQ3JlYXRvcnMgYW5kIGRlc3RydWN0b3IuICAgKi8KK1VJICpVSV9uZXcodm9pZCk7CitVSSAqVUlfbmV3X21ldGhvZChjb25zdCBVSV9NRVRIT0QgKm1ldGhvZCk7Cit2b2lkIFVJX2ZyZWUoVUkgKnVpKTsKKworLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gYWRkIHN0cmluZ3MgdG8gYmUgcHJpbnRlZCBhbmQgcHJvbXB0CisgICBzdHJpbmdzIHRvIHByb21wdCBmb3IgZGF0YS4gIFRoZSBuYW1lcyBhcmUgVUlfe2FkZCxkdXB9XzxmdW5jdGlvbj5fc3RyaW5nCisgICBhbmQgVUlfe2FkZCxkdXB9X2lucHV0X2Jvb2xlYW4uCisKKyAgIFVJX3thZGQsZHVwfV88ZnVuY3Rpb24+X3N0cmluZyBoYXZlIHRoZSBmb2xsb3dpbmcgbWVhbmluZ3M6CisJYWRkCWFkZCBhIHRleHQgb3IgcHJvbXB0IHN0cmluZy4gIFRoZSBwb2ludGVycyBnaXZlbiB0byB0aGVzZQorCQlmdW5jdGlvbnMgYXJlIHVzZWQgdmVyYmF0aW0sIG5vIGNvcHlpbmcgaXMgZG9uZS4KKwlkdXAJbWFrZSBhIGNvcHkgb2YgdGhlIHRleHQgb3IgcHJvbXB0IHN0cmluZywgdGhlbiBhZGQgdGhlIGNvcHkKKwkJdG8gdGhlIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncyBpbiB0aGUgdXNlciBpbnRlcmZhY2UuCisJPGZ1bmN0aW9uPgorCQlUaGUgZnVuY3Rpb24gaXMgYSBuYW1lIGZvciB0aGUgZnVuY3Rpb25hbGl0eSB0aGF0IHRoZSBnaXZlbgorCQlzdHJpbmcgc2hhbGwgYmUgdXNlZCBmb3IuICBJdCBjYW4gYmUgb25lIG9mOgorCQkJaW5wdXQJdXNlIHRoZSBzdHJpbmcgYXMgZGF0YSBwcm9tcHQuCisJCQl2ZXJpZnkJdXNlIHRoZSBzdHJpbmcgYXMgdmVyaWZpY2F0aW9uIHByb21wdC4gIFRoaXMKKwkJCQlpcyB1c2VkIHRvIHZlcmlmeSBhIHByZXZpb3VzIGlucHV0LgorCQkJaW5mbwl1c2UgdGhlIHN0cmluZyBmb3IgaW5mb3JtYXRpb25hbCBvdXRwdXQuCisJCQllcnJvcgl1c2UgdGhlIHN0cmluZyBmb3IgZXJyb3Igb3V0cHV0LgorICAgSG9uZXN0bHksIHRoZXJlJ3MgY3VycmVudGx5IG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBpbmZvIGFuZCBlcnJvciBmb3IgdGhlCisgICBtb21lbnQuCisKKyAgIFVJX3thZGQsZHVwfV9pbnB1dF9ib29sZWFuIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGZvciAiYWRkIiBhbmQgImR1cCIsCisgICBhbmQgYXJlIHR5cGljYWxseSB1c2VkIHdoZW4gb25lIHdhbnRzIHRvIHByb21wdCBmb3IgYSB5ZXMvbm8gcmVzcG9uc2UuCisKKworICAgQWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBncm91cCB0YWtlIGEgVUkgYW5kIGEgcHJvbXB0IHN0cmluZy4KKyAgIFRoZSBzdHJpbmcgaW5wdXQgYW5kIHZlcmlmeSBhZGRpdGlvbiBmdW5jdGlvbnMgYWxzbyB0YWtlIGEgZmxhZyBhcmd1bWVudCwKKyAgIGEgYnVmZmVyIGZvciB0aGUgcmVzdWx0IHRvIGVuZCB1cCB3aXRoLCBhIG1pbmltdW0gaW5wdXQgc2l6ZSBhbmQgYSBtYXhpbXVtCisgICBpbnB1dCBzaXplICh0aGUgcmVzdWx0IGJ1ZmZlciBNVVNUIGJlIGxhcmdlIGVub3VnaCB0byBiZSBhYmxlIHRvIGNvbnRhaW4KKyAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzKS4gIEFkZGl0aW9uYWxseSwgdGhlIHZlcmlmeSBhZGRpdGlvbgorICAgZnVuY3Rpb25zIHRha2VzIGFub3RoZXIgYnVmZmVyIHRvIGNvbXBhcmUgdGhlIHJlc3VsdCBhZ2FpbnN0LgorICAgVGhlIGJvb2xlYW4gaW5wdXQgZnVuY3Rpb25zIHRha2UgYW4gYWN0aW9uIGRlc2NyaXB0aW9uIHN0cmluZyAod2hpY2ggc2hvdWxkCisgICBiZSBzYWZlIHRvIGlnbm9yZSBpZiB0aGUgZXhwZWN0ZWQgdXNlciBhY3Rpb24gaXMgb2J2aW91cywgZm9yIGV4YW1wbGUgd2l0aAorICAgYSBkaWFsb2cgYm94IHdpdGggYW4gT0sgYnV0dG9uIGFuZCBhIENhbmNlbCBidXR0b24pLCBhIHN0cmluZyBvZiBhY2NlcHRhYmxlCisgICBjaGFyYWN0ZXJzIHRvIG1lYW4gT0sgYW5kIHRvIG1lYW4gQ2FuY2VsLiAgVGhlIHR3byBsYXN0IHN0cmluZ3MgYXJlIGNoZWNrZWQKKyAgIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbid0IGhhdmUgY29tbW9uIGNoYXJhY3RlcnMuICBBZGRpdGlvbmFsbHksIHRoZSBzYW1lCisgICBmbGFnIGFyZ3VtZW50IGFzIGZvciB0aGUgc3RyaW5nIGlucHV0IGlzIHRha2VuLCBhcyB3ZWxsIGFzIGEgcmVzdWx0IGJ1ZmZlci4KKyAgIFRoZSByZXN1bHQgYnVmZmVyIGlzIHJlcXVpcmVkIHRvIGJlIGF0IGxlYXN0IG9uZSBieXRlIGxvbmcuICBEZXBlbmRpbmcgb24KKyAgIHRoZSBhbnN3ZXIsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbSB0aGUgT0sgb3IgdGhlIENhbmNlbCBjaGFyYWN0ZXIgc3RyaW5ncworICAgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlc3VsdCBidWZmZXIuICBObyBOVUwgd2lsbCBiZQorICAgYWRkZWQsIHNvIHRoZSByZXN1bHQgaXMgKm5vdCogYSBzdHJpbmcuCisKKyAgIE9uIHN1Y2Nlc3MsIHRoZSBhbGwgcmV0dXJuIGFuIGluZGV4IG9mIHRoZSBhZGRlZCBpbmZvcm1hdGlvbi4gIFRoYXQgaW5kZXgKKyAgIGlzIHVzZWZ1bGwgd2hlbiByZXRyaWV2aW5nIHJlc3VsdHMgd2l0aCBVSV9nZXQwX3Jlc3VsdCgpLiAqLworaW50IFVJX2FkZF9pbnB1dF9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBmbGFncywKKwljaGFyICpyZXN1bHRfYnVmLCBpbnQgbWluc2l6ZSwgaW50IG1heHNpemUpOworaW50IFVJX2R1cF9pbnB1dF9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBmbGFncywKKwljaGFyICpyZXN1bHRfYnVmLCBpbnQgbWluc2l6ZSwgaW50IG1heHNpemUpOworaW50IFVJX2FkZF92ZXJpZnlfc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgZmxhZ3MsCisJY2hhciAqcmVzdWx0X2J1ZiwgaW50IG1pbnNpemUsIGludCBtYXhzaXplLCBjb25zdCBjaGFyICp0ZXN0X2J1Zik7CitpbnQgVUlfZHVwX3ZlcmlmeV9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBmbGFncywKKwljaGFyICpyZXN1bHRfYnVmLCBpbnQgbWluc2l6ZSwgaW50IG1heHNpemUsIGNvbnN0IGNoYXIgKnRlc3RfYnVmKTsKK2ludCBVSV9hZGRfaW5wdXRfYm9vbGVhbihVSSAqdWksIGNvbnN0IGNoYXIgKnByb21wdCwgY29uc3QgY2hhciAqYWN0aW9uX2Rlc2MsCisJY29uc3QgY2hhciAqb2tfY2hhcnMsIGNvbnN0IGNoYXIgKmNhbmNlbF9jaGFycywKKwlpbnQgZmxhZ3MsIGNoYXIgKnJlc3VsdF9idWYpOworaW50IFVJX2R1cF9pbnB1dF9ib29sZWFuKFVJICp1aSwgY29uc3QgY2hhciAqcHJvbXB0LCBjb25zdCBjaGFyICphY3Rpb25fZGVzYywKKwljb25zdCBjaGFyICpva19jaGFycywgY29uc3QgY2hhciAqY2FuY2VsX2NoYXJzLAorCWludCBmbGFncywgY2hhciAqcmVzdWx0X2J1Zik7CitpbnQgVUlfYWRkX2luZm9fc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqdGV4dCk7CitpbnQgVUlfZHVwX2luZm9fc3RyaW5nKFVJICp1aSwgY29uc3QgY2hhciAqdGV4dCk7CitpbnQgVUlfYWRkX2Vycm9yX3N0cmluZyhVSSAqdWksIGNvbnN0IGNoYXIgKnRleHQpOworaW50IFVJX2R1cF9lcnJvcl9zdHJpbmcoVUkgKnVpLCBjb25zdCBjaGFyICp0ZXh0KTsKKworLyogVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSBmbGFncy4gIFRoZXkgY2FuIGJlIG9yJ2VkIHRvZ2V0aGVyLiAqLworLyogVXNlIHRvIGhhdmUgZWNob2luZyBvZiBpbnB1dCAqLworI2RlZmluZSBVSV9JTlBVVF9GTEFHX0VDSE8JCTB4MDEKKy8qIFVzZSBhIGRlZmF1bHQgcGFzc3dvcmQuICBXaGVyZSB0aGF0IHBhc3N3b3JkIGlzIGZvdW5kIGlzIGNvbXBsZXRlbHkKKyAgIHVwIHRvIHRoZSBhcHBsaWNhdGlvbiwgaXQgbWlnaHQgZm9yIGV4YW1wbGUgYmUgaW4gdGhlIHVzZXIgZGF0YSBzZXQKKyAgIHdpdGggVUlfYWRkX3VzZXJfZGF0YSgpLiAgSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGhhdmUgbW9yZSB0aGFuCisgICBvbmUgaW5wdXQgaW4gZWFjaCBVSSBiZWluZyBtYXJrZWQgd2l0aCB0aGlzIGZsYWcsIG9yIHRoZSBhcHBsaWNhdGlvbgorICAgbWlnaHQgZ2V0IGNvbmZ1c2VkLiAqLworI2RlZmluZSBVSV9JTlBVVF9GTEFHX0RFRkFVTFRfUFdECTB4MDIKKworLyogVGhlIHVzZXIgb2YgdGhlc2Ugcm91dGluZXMgbWF5IHdhbnQgdG8gZGVmaW5lIGZsYWdzIG9mIHRoZWlyIG93bi4gIFRoZSBjb3JlCisgICBVSSB3b24ndCBsb29rIGF0IHRob3NlLCBidXQgd2lsbCBwYXNzIHRoZW0gb24gdG8gdGhlIG1ldGhvZCByb3V0aW5lcy4gIFRoZXkKKyAgIG11c3QgdXNlIGhpZ2hlciBiaXRzIHNvIHRoZXkgZG9uJ3QgZ2V0IGNvbmZ1c2VkIHdpdGggdGhlIFVJIGJpdHMgYWJvdmUuCisgICBVSV9JTlBVVF9GTEFHX1VTRVJfQkFTRSB0ZWxscyB3aGljaCBpcyB0aGUgbG93ZXN0IGJpdCB0byB1c2UuICBBIGdvb2QKKyAgIGV4YW1wbGUgb2YgdXNlIGlzIHRoaXM6CisKKwkjZGVmaW5lIE1ZX1VJX0ZMQUcxCSgweDAxIDw8IFVJX0lOUFVUX0ZMQUdfVVNFUl9CQVNFKQorCisqLworI2RlZmluZSBVSV9JTlBVVF9GTEFHX1VTRVJfQkFTRQkxNgorCisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaGVscHMgY29uc3RydWN0IGEgcHJvbXB0LiAgb2JqZWN0X2Rlc2MgaXMgYQorICAgdGV4dHVhbCBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgb2JqZWN0LCBmb3IgZXhhbXBsZSAicGFzcyBwaHJhc2UiLAorICAgYW5kIG9iamVjdF9uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBvYmplY3QgKG1pZ2h0IGJlIGEgY2FyZCBuYW1lIG9yCisgICBhIGZpbGUgbmFtZS4KKyAgIFRoZSByZXR1cm5lZCBzdHJpbmcgc2hhbGwgYWx3YXlzIGJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCB3aXRoCisgICBPUEVOU1NMX21hbGxvYygpLCBhbmQgbmVlZCB0byBiZSBmcmVlJ2Qgd2l0aCBPUEVOU1NMX2ZyZWUoKS4KKworICAgSWYgdGhlIHVpX21ldGhvZCBkb2Vzbid0IGNvbnRhaW4gYSBwb2ludGVyIHRvIGEgdXNlci1kZWZpbmVkIHByb21wdAorICAgY29uc3RydWN0b3IsIGEgZGVmYXVsdCBzdHJpbmcgaXMgYnVpbHQsIGxvb2tpbmcgbGlrZSB0aGlzOgorCisJIkVudGVyIHtvYmplY3RfZGVzY30gZm9yIHtvYmplY3RfbmFtZX06IgorCisgICBTbywgaWYgb2JqZWN0X2Rlc2MgaGFzIHRoZSB2YWx1ZSAicGFzcyBwaHJhc2UiIGFuZCBvYmplY3RfbmFtZSBoYXMKKyAgIHRoZSB2YWx1ZSAiZm9vLmtleSIsIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzOgorCisJIkVudGVyIHBhc3MgcGhyYXNlIGZvciBmb28ua2V5OiIKKyovCitjaGFyICpVSV9jb25zdHJ1Y3RfcHJvbXB0KFVJICp1aV9tZXRob2QsCisJY29uc3QgY2hhciAqb2JqZWN0X2Rlc2MsIGNvbnN0IGNoYXIgKm9iamVjdF9uYW1lKTsKKworCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc3RvcmUgYSBwb2ludGVyIHRvIHVzZXItc3BlY2lmaWMgZGF0YS4KKyAgIEFueSBwcmV2aW91cyBzdWNoIHBvaW50ZXIgd2lsbCBiZSByZXR1cm5lZCBhbmQgcmVwbGFjZWQuCisKKyAgIEZvciBjYWxsYmFjayBwdXJwb3NlcywgdGhpcyBmdW5jdGlvbiBtYWtlcyBhIGxvdCBtb3JlIHNlbnNlIHRoYW4gdXNpbmcKKyAgIGV4X2RhdGEsIHNpbmNlIHRoZSBsYXR0ZXIgcmVxdWlyZXMgdGhhdCBkaWZmZXJlbnQgcGFydHMgb2YgT3BlblNTTCBvcgorICAgYXBwbGljYXRpb25zIHNoYXJlIHRoZSBzYW1lIGV4X2RhdGEgaW5kZXguCisKKyAgIE5vdGUgdGhhdCB0aGUgVUlfT3BlblNTTCgpIG1ldGhvZCBjb21wbGV0ZWx5IGlnbm9yZXMgdGhlIHVzZXIgZGF0YS4KKyAgIE90aGVyIG1ldGhvZHMgbWF5IG5vdCwgaG93ZXZlci4gICovCit2b2lkICpVSV9hZGRfdXNlcl9kYXRhKFVJICp1aSwgdm9pZCAqdXNlcl9kYXRhKTsKKy8qIFdlIG5lZWQgYSB1c2VyIGRhdGEgcmV0cmlldmluZyBmdW5jdGlvbiBhcyB3ZWxsLiAgKi8KK3ZvaWQgKlVJX2dldDBfdXNlcl9kYXRhKFVJICp1aSk7CisKKy8qIFJldHVybiB0aGUgcmVzdWx0IGFzc29jaWF0ZWQgd2l0aCBhIHByb21wdCBnaXZlbiB3aXRoIHRoZSBpbmRleCBpLiAqLworY29uc3QgY2hhciAqVUlfZ2V0MF9yZXN1bHQoVUkgKnVpLCBpbnQgaSk7CisKKy8qIFdoZW4gYWxsIHN0cmluZ3MgaGF2ZSBiZWVuIGFkZGVkLCBwcm9jZXNzIHRoZSB3aG9sZSB0aGluZy4gKi8KK2ludCBVSV9wcm9jZXNzKFVJICp1aSk7CisKKy8qIEdpdmUgYSB1c2VyIGludGVyZmFjZSBwYXJhbWV0cmlzZWQgY29udHJvbCBjb21tYW5kcy4gIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAgIHNlbmQgZG93biBhbiBpbnRlZ2VyLCBhIGRhdGEgcG9pbnRlciBvciBhIGZ1bmN0aW9uIHBvaW50ZXIsIGFzIHdlbGwgYXMKKyAgIGJlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gYSBVSS4gKi8KK2ludCBVSV9jdHJsKFVJICp1aSwgaW50IGNtZCwgbG9uZyBpLCB2b2lkICpwLCB2b2lkICgqZikodm9pZCkpOworCisvKiBUaGUgY29tbWFuZHMgKi8KKy8qIFVzZSBVSV9DT05UUk9MX1BSSU5UX0VSUk9SUyB3aXRoIHRoZSB2YWx1ZSAxIHRvIGhhdmUgVUlfcHJvY2VzcyBwcmludCB0aGUKKyAgIE9wZW5TU0wgZXJyb3Igc3RhY2sgYmVmb3JlIHByaW50aW5nIGFueSBpbmZvIG9yIGFkZGVkIGVycm9yIG1lc3NhZ2VzIGFuZAorICAgYmVmb3JlIGFueSBwcm9tcHRpbmcuICovCisjZGVmaW5lIFVJX0NUUkxfUFJJTlRfRVJST1JTCQkxCisvKiBDaGVjayBpZiBhIFVJX3Byb2Nlc3MoKSBpcyBwb3NzaWJsZSB0byBkbyBhZ2FpbiB3aXRoIHRoZSBzYW1lIGluc3RhbmNlIG9mCisgICBhIHVzZXIgaW50ZXJmYWNlLiAgVGhpcyBtYWtlcyBVSV9jdHJsKCkgcmV0dXJuIDEgaWYgaXQgaXMgcmVkb2FibGUsIGFuZCAwCisgICBpZiBub3QuICovCisjZGVmaW5lIFVJX0NUUkxfSVNfUkVET0FCTEUJCTIKKworCisvKiBTb21lIG1ldGhvZHMgbWF5IHVzZSBleHRyYSBkYXRhICovCisjZGVmaW5lIFVJX3NldF9hcHBfZGF0YShzLGFyZykgICAgICAgICBVSV9zZXRfZXhfZGF0YShzLDAsYXJnKQorI2RlZmluZSBVSV9nZXRfYXBwX2RhdGEocykgICAgICAgICAgICAgVUlfZ2V0X2V4X2RhdGEocywwKQoraW50IFVJX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwlDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgVUlfc2V0X2V4X2RhdGEoVUkgKnIsaW50IGlkeCx2b2lkICphcmcpOwordm9pZCAqVUlfZ2V0X2V4X2RhdGEoVUkgKnIsIGludCBpZHgpOworCisvKiBVc2Ugc3BlY2lmaWMgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBvbmUgKi8KK3ZvaWQgVUlfc2V0X2RlZmF1bHRfbWV0aG9kKGNvbnN0IFVJX01FVEhPRCAqbWV0aCk7Citjb25zdCBVSV9NRVRIT0QgKlVJX2dldF9kZWZhdWx0X21ldGhvZCh2b2lkKTsKK2NvbnN0IFVJX01FVEhPRCAqVUlfZ2V0X21ldGhvZChVSSAqdWkpOworY29uc3QgVUlfTUVUSE9EICpVSV9zZXRfbWV0aG9kKFVJICp1aSwgY29uc3QgVUlfTUVUSE9EICptZXRoKTsKKworLyogVGhlIG1ldGhvZCB3aXRoIGFsbCB0aGUgYnVpbHQtaW4gdGhpbmdpZXMgKi8KK1VJX01FVEhPRCAqVUlfT3BlblNTTCh2b2lkKTsKKworCisvKiAtLS0tLS0tLS0tIEZvciBtZXRob2Qgd3JpdGVycyAtLS0tLS0tLS0tICovCisvKiBBIG1ldGhvZCBjb250YWlucyBhIG51bWJlciBvZiBmdW5jdGlvbnMgdGhhdCBpbXBsZW1lbnQgdGhlIGxvdyBsZXZlbAorICAgb2YgdGhlIFVzZXIgSW50ZXJmYWNlLiAgVGhlIGZ1bmN0aW9ucyBhcmU6CisKKwlhbiBvcGVuZXIJVGhpcyBmdW5jdGlvbiBzdGFydHMgYSBzZXNzaW9uLCBtYXliZSBieSBvcGVuaW5nCisJCQlhIGNoYW5uZWwgdG8gYSB0dHksIG9yIGJ5IG9wZW5pbmcgYSB3aW5kb3cuCisJYSB3cml0ZXIJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gd3JpdGUgYSBnaXZlbiBzdHJpbmcsCisJCQltYXliZSB0byB0aGUgdHR5LCBtYXliZSBhcyBhIGZpZWxkIGxhYmVsIGluIGEKKwkJCXdpbmRvdy4KKwlhIGZsdXNoZXIJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZmx1c2ggZXZlcnl0aGluZyB0aGF0CisJCQloYXMgYmVlbiBvdXRwdXQgc28gZmFyLiAgSXQgY2FuIGJlIHVzZWQgdG8gYWN0dWFsbHkKKwkJCWRpc3BsYXkgYSBkaWFsb2cgYm94IGFmdGVyIGl0IGhhcyBiZWVuIGJ1aWx0LgorCWEgcmVhZGVyCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJlYWQgYSBnaXZlbiBwcm9tcHQsCisJCQltYXliZSBmcm9tIHRoZSB0dHksIG1heWJlIGZyb20gYSBmaWVsZCBpbiBhCisJCQl3aW5kb3cuICBOb3RlIHRoYXQgaXQncyBjYWxsZWQgd3RoIGFsbCBzdHJpbmcKKwkJCXN0cnVjdHVyZXMsIG5vdCBvbmx5IHRoZSBwcm9tcHQgb25lcywgc28gaXQgbXVzdAorCQkJY2hlY2sgc3VjaCB0aGluZ3MgaXRzZWxmLgorCWEgY2xvc2VyCVRoaXMgZnVuY3Rpb24gY2xvc2VzIHRoZSBzZXNzaW9uLCBtYXliZSBieSBjbG9zaW5nCisJCQl0aGUgY2hhbm5lbCB0byB0aGUgdHR5LCBvciBjbG9zaW5nIHRoZSB3aW5kb3cuCisKKyAgIEFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlIGV4cGVjdGVkIHRvIHJldHVybjoKKworCTAJb24gZXJyb3IuCisJMQlvbiBzdWNjZXNzLgorCS0xCW9uIG91dC1vZi1iYW5kIGV2ZW50cywgZm9yIGV4YW1wbGUgaWYgc29tZSBwcm9tcHRpbmcgaGFzCisJCWJlZW4gY2FuY2VsZWQgKGJ5IHByZXNzaW5nIEN0cmwtQywgZm9yIGV4YW1wbGUpLiAgVGhpcyBpcworCQlvbmx5IGNoZWNrZWQgd2hlbiByZXR1cm5lZCBieSB0aGUgZmx1c2hlciBvciB0aGUgcmVhZGVyLgorCisgICBUaGUgd2F5IHRoaXMgaXMgdXNlZCwgdGhlIG9wZW5lciBpcyBmaXJzdCBjYWxsZWQsIHRoZW4gdGhlIHdyaXRlciBmb3IgYWxsCisgICBzdHJpbmdzLCB0aGVuIHRoZSBmbHVzaGVyLCB0aGVuIHRoZSByZWFkZXIgZm9yIGFsbCBzdHJpbmdzIGFuZCBmaW5hbGx5IHRoZQorICAgY2xvc2VyLiAgTm90ZSB0aGF0IGlmIHlvdSB3YW50IHRvIHByb21wdCBmcm9tIGEgdGVybWluYWwgb3Igb3RoZXIgY29tbWFuZAorICAgbGluZSBpbnRlcmZhY2UsIHRoZSBiZXN0IGlzIHRvIGhhdmUgdGhlIHJlYWRlciBhbHNvIHdyaXRlIHRoZSBwcm9tcHRzCisgICBpbnN0ZWFkIG9mIGhhdmluZyB0aGUgd3JpdGVyIGRvIGl0LiAgSWYgeW91IHdhbnQgdG8gcHJvbXB0IGZyb20gYSBkaWFsb2cKKyAgIGJveCwgdGhlIHdyaXRlciBjYW4gYmUgdXNlZCB0byBidWlsZCB1cCB0aGUgY29udGVudHMgb2YgdGhlIGJveCwgYW5kIHRoZQorICAgZmx1c2hlciB0byBhY3R1YWxseSBkaXNwbGF5IHRoZSBib3ggYW5kIHJ1biB0aGUgZXZlbnQgbG9vcCB1bnRpbCBhbGwgZGF0YQorICAgaGFzIGJlZW4gZ2l2ZW4sIGFmdGVyIHdoaWNoIHRoZSByZWFkZXIgb25seSBncmFicyB0aGUgZ2l2ZW4gZGF0YSBhbmQgcHV0cworICAgdGhlbSBiYWNrIGludG8gdGhlIFVJIHN0cmluZ3MuCisKKyAgIEFsbCBtZXRob2QgZnVuY3Rpb25zIHRha2UgYSBVSSBhcyBhcmd1bWVudC4gIEFkZGl0aW9uYWxseSwgdGhlIHdyaXRlciBhbmQKKyAgIHRoZSByZWFkZXIgdGFrZSBhIFVJX1NUUklORy4KKyovCisKKy8qIFRoZSBVSV9TVFJJTkcgdHlwZSBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgdGhlIG5lZWRlZCBpbmZvCisgICBhYm91dCBhIHN0cmluZyBvciBhIHByb21wdCwgaW5jbHVkaW5nIHRlc3QgZGF0YSBmb3IgYSB2ZXJpZmljYXRpb24gcHJvbXB0LgorKi8KK3R5cGVkZWYgc3RydWN0IHVpX3N0cmluZ19zdCBVSV9TVFJJTkc7CitERUNMQVJFX1NUQUNLX09GKFVJX1NUUklORykKKworLyogVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBzdHJpbmdzIHRoYXQgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCisgICBUaGlzIGlzIG9ubHkgbmVlZGVkIGJ5IG1ldGhvZCBhdXRob3JzLiAqLworZW51bSBVSV9zdHJpbmdfdHlwZXMKKwl7CisJVUlUX05PTkU9MCwKKwlVSVRfUFJPTVBULAkJLyogUHJvbXB0IGZvciBhIHN0cmluZyAqLworCVVJVF9WRVJJRlksCQkvKiBQcm9tcHQgZm9yIGEgc3RyaW5nIGFuZCB2ZXJpZnkgKi8KKwlVSVRfQk9PTEVBTiwJCS8qIFByb21wdCBmb3IgYSB5ZXMvbm8gcmVzcG9uc2UgKi8KKwlVSVRfSU5GTywJCS8qIFNlbmQgaW5mbyB0byB0aGUgdXNlciAqLworCVVJVF9FUlJPUgkJLyogU2VuZCBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSB1c2VyICovCisJfTsKKworLyogQ3JlYXRlIGFuZCBtYW5pcHVsYXRlIG1ldGhvZHMgKi8KK1VJX01FVEhPRCAqVUlfY3JlYXRlX21ldGhvZChjaGFyICpuYW1lKTsKK3ZvaWQgVUlfZGVzdHJveV9tZXRob2QoVUlfTUVUSE9EICp1aV9tZXRob2QpOworaW50IFVJX21ldGhvZF9zZXRfb3BlbmVyKFVJX01FVEhPRCAqbWV0aG9kLCBpbnQgKCpvcGVuZXIpKFVJICp1aSkpOworaW50IFVJX21ldGhvZF9zZXRfd3JpdGVyKFVJX01FVEhPRCAqbWV0aG9kLCBpbnQgKCp3cml0ZXIpKFVJICp1aSwgVUlfU1RSSU5HICp1aXMpKTsKK2ludCBVSV9tZXRob2Rfc2V0X2ZsdXNoZXIoVUlfTUVUSE9EICptZXRob2QsIGludCAoKmZsdXNoZXIpKFVJICp1aSkpOworaW50IFVJX21ldGhvZF9zZXRfcmVhZGVyKFVJX01FVEhPRCAqbWV0aG9kLCBpbnQgKCpyZWFkZXIpKFVJICp1aSwgVUlfU1RSSU5HICp1aXMpKTsKK2ludCBVSV9tZXRob2Rfc2V0X2Nsb3NlcihVSV9NRVRIT0QgKm1ldGhvZCwgaW50ICgqY2xvc2VyKShVSSAqdWkpKTsKK2ludCBVSV9tZXRob2Rfc2V0X3Byb21wdF9jb25zdHJ1Y3RvcihVSV9NRVRIT0QgKm1ldGhvZCwgY2hhciAqKCpwcm9tcHRfY29uc3RydWN0b3IpKFVJKiB1aSwgY29uc3QgY2hhciogb2JqZWN0X2Rlc2MsIGNvbnN0IGNoYXIqIG9iamVjdF9uYW1lKSk7CitpbnQgKCpVSV9tZXRob2RfZ2V0X29wZW5lcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKik7CitpbnQgKCpVSV9tZXRob2RfZ2V0X3dyaXRlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKixVSV9TVFJJTkcqKTsKK2ludCAoKlVJX21ldGhvZF9nZXRfZmx1c2hlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKik7CitpbnQgKCpVSV9tZXRob2RfZ2V0X3JlYWRlcihVSV9NRVRIT0QgKm1ldGhvZCkpKFVJKixVSV9TVFJJTkcqKTsKK2ludCAoKlVJX21ldGhvZF9nZXRfY2xvc2VyKFVJX01FVEhPRCAqbWV0aG9kKSkoVUkqKTsKK2NoYXIqICgqVUlfbWV0aG9kX2dldF9wcm9tcHRfY29uc3RydWN0b3IoVUlfTUVUSE9EICptZXRob2QpKShVSSosIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKik7CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBoZWxwZXJzIGZvciBtZXRob2Qgd3JpdGVycyB0byBhY2Nlc3MgcmVsZXZhbnQKKyAgIGRhdGEgZnJvbSBhIFVJX1NUUklORy4gKi8KKworLyogUmV0dXJuIHR5cGUgb2YgdGhlIFVJX1NUUklORyAqLworZW51bSBVSV9zdHJpbmdfdHlwZXMgVUlfZ2V0X3N0cmluZ190eXBlKFVJX1NUUklORyAqdWlzKTsKKy8qIFJldHVybiBpbnB1dCBmbGFncyBvZiB0aGUgVUlfU1RSSU5HICovCitpbnQgVUlfZ2V0X2lucHV0X2ZsYWdzKFVJX1NUUklORyAqdWlzKTsKKy8qIFJldHVybiB0aGUgYWN0dWFsIHN0cmluZyB0byBvdXRwdXQgKHRoZSBwcm9tcHQsIGluZm8gb3IgZXJyb3IpICovCitjb25zdCBjaGFyICpVSV9nZXQwX291dHB1dF9zdHJpbmcoVUlfU1RSSU5HICp1aXMpOworLyogUmV0dXJuIHRoZSBvcHRpb25hbCBhY3Rpb24gc3RyaW5nIHRvIG91dHB1dCAodGhlIGJvb2xlYW4gcHJvbXRwIGluc3RydWN0aW9uKSAqLworY29uc3QgY2hhciAqVUlfZ2V0MF9hY3Rpb25fc3RyaW5nKFVJX1NUUklORyAqdWlzKTsKKy8qIFJldHVybiB0aGUgcmVzdWx0IG9mIGEgcHJvbXB0ICovCitjb25zdCBjaGFyICpVSV9nZXQwX3Jlc3VsdF9zdHJpbmcoVUlfU1RSSU5HICp1aXMpOworLyogUmV0dXJuIHRoZSBzdHJpbmcgdG8gdGVzdCB0aGUgcmVzdWx0IGFnYWluc3QuICBPbmx5IHVzZWZ1bCB3aXRoIHZlcmlmaWVzLiAqLworY29uc3QgY2hhciAqVUlfZ2V0MF90ZXN0X3N0cmluZyhVSV9TVFJJTkcgKnVpcyk7CisvKiBSZXR1cm4gdGhlIHJlcXVpcmVkIG1pbmltdW0gc2l6ZSBvZiB0aGUgcmVzdWx0ICovCitpbnQgVUlfZ2V0X3Jlc3VsdF9taW5zaXplKFVJX1NUUklORyAqdWlzKTsKKy8qIFJldHVybiB0aGUgcmVxdWlyZWQgbWF4aW11bSBzaXplIG9mIHRoZSByZXN1bHQgKi8KK2ludCBVSV9nZXRfcmVzdWx0X21heHNpemUoVUlfU1RSSU5HICp1aXMpOworLyogU2V0IHRoZSByZXN1bHQgb2YgYSBVSV9TVFJJTkcuICovCitpbnQgVUlfc2V0X3Jlc3VsdChVSSAqdWksIFVJX1NUUklORyAqdWlzLCBjb25zdCBjaGFyICpyZXN1bHQpOworCisKKy8qIEEgY291cGxlIG9mIHBvcHVsYXIgdXRpbGl0eSBmdW5jdGlvbnMgKi8KK2ludCBVSV9VVElMX3JlYWRfcHdfc3RyaW5nKGNoYXIgKmJ1ZixpbnQgbGVuZ3RoLGNvbnN0IGNoYXIgKnByb21wdCxpbnQgdmVyaWZ5KTsKK2ludCBVSV9VVElMX3JlYWRfcHcoY2hhciAqYnVmLGNoYXIgKmJ1ZmYsaW50IHNpemUsY29uc3QgY2hhciAqcHJvbXB0LGludCB2ZXJpZnkpOworCisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisvKiBUaGUgZm9sbG93aW5nIGxpbmVzIGFyZSBhdXRvIGdlbmVyYXRlZCBieSB0aGUgc2NyaXB0IG1rZXJyLnBsLiBBbnkgY2hhbmdlcworICogbWFkZSBhZnRlciB0aGlzIHBvaW50IG1heSBiZSBvdmVyd3JpdHRlbiB3aGVuIHRoZSBzY3JpcHQgaXMgbmV4dCBydW4uCisgKi8KK3ZvaWQgRVJSX2xvYWRfVUlfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBVSSBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBVSV9GX0dFTkVSQUxfQUxMT0NBVEVfQk9PTEVBTgkJCSAxMDgKKyNkZWZpbmUgVUlfRl9HRU5FUkFMX0FMTE9DQVRFX1BST01QVAkJCSAxMDkKKyNkZWZpbmUgVUlfRl9HRU5FUkFMX0FMTE9DQVRFX1NUUklORwkJCSAxMDAKKyNkZWZpbmUgVUlfRl9VSV9DVFJMCQkJCQkgMTExCisjZGVmaW5lIFVJX0ZfVUlfRFVQX0VSUk9SX1NUUklORwkJCSAxMDEKKyNkZWZpbmUgVUlfRl9VSV9EVVBfSU5GT19TVFJJTkcJCQkJIDEwMgorI2RlZmluZSBVSV9GX1VJX0RVUF9JTlBVVF9CT09MRUFOCQkJIDExMAorI2RlZmluZSBVSV9GX1VJX0RVUF9JTlBVVF9TVFJJTkcJCQkgMTAzCisjZGVmaW5lIFVJX0ZfVUlfRFVQX1ZFUklGWV9TVFJJTkcJCQkgMTA2CisjZGVmaW5lIFVJX0ZfVUlfR0VUMF9SRVNVTFQJCQkJIDEwNworI2RlZmluZSBVSV9GX1VJX05FV19NRVRIT0QJCQkJIDEwNAorI2RlZmluZSBVSV9GX1VJX1NFVF9SRVNVTFQJCQkJIDEwNQorCisvKiBSZWFzb24gY29kZXMuICovCisjZGVmaW5lIFVJX1JfQ09NTU9OX09LX0FORF9DQU5DRUxfQ0hBUkFDVEVSUwkJIDEwNAorI2RlZmluZSBVSV9SX0lOREVYX1RPT19MQVJHRQkJCQkgMTAyCisjZGVmaW5lIFVJX1JfSU5ERVhfVE9PX1NNQUxMCQkJCSAxMDMKKyNkZWZpbmUgVUlfUl9OT19SRVNVTFRfQlVGRkVSCQkJCSAxMDUKKyNkZWZpbmUgVUlfUl9SRVNVTFRfVE9PX0xBUkdFCQkJCSAxMDAKKyNkZWZpbmUgVUlfUl9SRVNVTFRfVE9PX1NNQUxMCQkJCSAxMDEKKyNkZWZpbmUgVUlfUl9VTktOT1dOX0NPTlRST0xfQ09NTUFORAkJCSAxMDYKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC91aV9jb21wYXQuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC91aV9jb21wYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzVjOWJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3VpX2NvbXBhdC5oCkBAIC0wLDAgKzEsODMgQEAKKy8qIGNyeXB0by91aS91aS5oIC0qLSBtb2RlOkM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFJpY2hhcmQgTGV2aXR0ZSAocmljaGFyZEBsZXZpdHRlLm9yZykgZm9yIHRoZSBPcGVuU1NMCisgKiBwcm9qZWN0IDIwMDEuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2lmbmRlZiBIRUFERVJfVUlfQ09NUEFUX0gKKyNkZWZpbmUgSEVBREVSX1VJX0NPTVBBVF9ICisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisjaW5jbHVkZSA8b3BlbnNzbC91aS5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3ZXJlIHByZXZpb3VzbHkgcGFydCBvZiB0aGUgREVTIHNlY3Rpb24sCisgICBhbmQgYXJlIHByb3ZpZGVkIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucy4gKi8KKworI2RlZmluZSBkZXNfcmVhZF9wd19zdHJpbmcoYixsLHAsdikgXAorCV9vc3NsX29sZF9kZXNfcmVhZF9wd19zdHJpbmcoKGIpLChsKSwocCksKHYpKQorI2RlZmluZSBkZXNfcmVhZF9wdyhiLGJmLHMscCx2KSBcCisJX29zc2xfb2xkX2Rlc19yZWFkX3B3KChiKSwoYmYpLChzKSwocCksKHYpKQorCitpbnQgX29zc2xfb2xkX2Rlc19yZWFkX3B3X3N0cmluZyhjaGFyICpidWYsaW50IGxlbmd0aCxjb25zdCBjaGFyICpwcm9tcHQsaW50IHZlcmlmeSk7CitpbnQgX29zc2xfb2xkX2Rlc19yZWFkX3B3KGNoYXIgKmJ1ZixjaGFyICpidWZmLGludCBzaXplLGNvbnN0IGNoYXIgKnByb21wdCxpbnQgdmVyaWZ5KTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC94NTA5LmggYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wveDUwOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNGY0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wveDUwOS5oCkBAIC0wLDAgKzEsMTI4NSBAQAorLyogY3J5cHRvL3g1MDkveDUwOS5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogRUNESCBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworCisjaWZuZGVmIEhFQURFUl9YNTA5X0gKKyNkZWZpbmUgSEVBREVSX1g1MDlfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9lX29zMi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3ltaGFja3MuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19CVUZGRVIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRVZQCisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9hc24xLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zYWZlc3RhY2suaD4KKworI2lmbmRlZiBPUEVOU1NMX05PX0VDCisjaW5jbHVkZSA8b3BlbnNzbC9lYy5oPgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZWNkc2EuaD4KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorI2luY2x1ZGUgPG9wZW5zc2wvZWNkaC5oPgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9vc3NsX3R5cC5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgT1BFTlNTTF9TWVNfV0lOMzIKKy8qIFVuZGVyIFdpbjMyIHRoZXNlIGFyZSBkZWZpbmVkIGluIHdpbmNyeXB0LmggKi8KKyN1bmRlZiBYNTA5X05BTUUKKyN1bmRlZiBYNTA5X0NFUlRfUEFJUgorI3VuZGVmIFg1MDlfRVhURU5TSU9OUworI2VuZGlmCisKKyNkZWZpbmUgWDUwOV9GSUxFVFlQRV9QRU0JMQorI2RlZmluZSBYNTA5X0ZJTEVUWVBFX0FTTjEJMgorI2RlZmluZSBYNTA5X0ZJTEVUWVBFX0RFRkFVTFQJMworCisjZGVmaW5lIFg1MDl2M19LVV9ESUdJVEFMX1NJR05BVFVSRQkweDAwODAKKyNkZWZpbmUgWDUwOXYzX0tVX05PTl9SRVBVRElBVElPTgkweDAwNDAKKyNkZWZpbmUgWDUwOXYzX0tVX0tFWV9FTkNJUEhFUk1FTlQJMHgwMDIwCisjZGVmaW5lIFg1MDl2M19LVV9EQVRBX0VOQ0lQSEVSTUVOVAkweDAwMTAKKyNkZWZpbmUgWDUwOXYzX0tVX0tFWV9BR1JFRU1FTlQJCTB4MDAwOAorI2RlZmluZSBYNTA5djNfS1VfS0VZX0NFUlRfU0lHTgkJMHgwMDA0CisjZGVmaW5lIFg1MDl2M19LVV9DUkxfU0lHTgkJMHgwMDAyCisjZGVmaW5lIFg1MDl2M19LVV9FTkNJUEhFUl9PTkxZCQkweDAwMDEKKyNkZWZpbmUgWDUwOXYzX0tVX0RFQ0lQSEVSX09OTFkJCTB4ODAwMAorI2RlZmluZSBYNTA5djNfS1VfVU5ERUYJCQkweGZmZmYKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9vYmplY3RzX3N0CisJeworCWludCBuaWQ7CisJaW50ICgqYTJpKSh2b2lkKTsKKwlpbnQgKCppMmEpKHZvaWQpOworCX0gWDUwOV9PQkpFQ1RTOworCitzdHJ1Y3QgWDUwOV9hbGdvcl9zdAorCXsKKwlBU04xX09CSkVDVCAqYWxnb3JpdGhtOworCUFTTjFfVFlQRSAqcGFyYW1ldGVyOworCX0gLyogWDUwOV9BTEdPUiAqLzsKKworREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X0FMR09SKQorCit0eXBlZGVmIFNUQUNLX09GKFg1MDlfQUxHT1IpIFg1MDlfQUxHT1JTOworCit0eXBlZGVmIHN0cnVjdCBYNTA5X3ZhbF9zdAorCXsKKwlBU04xX1RJTUUgKm5vdEJlZm9yZTsKKwlBU04xX1RJTUUgKm5vdEFmdGVyOworCX0gWDUwOV9WQUw7CisKK3N0cnVjdCBYNTA5X3B1YmtleV9zdAorCXsKKwlYNTA5X0FMR09SICphbGdvcjsKKwlBU04xX0JJVF9TVFJJTkcgKnB1YmxpY19rZXk7CisJRVZQX1BLRVkgKnBrZXk7CisJfTsKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9zaWdfc3QKKwl7CisJWDUwOV9BTEdPUiAqYWxnb3I7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmRpZ2VzdDsKKwl9IFg1MDlfU0lHOworCit0eXBlZGVmIHN0cnVjdCBYNTA5X25hbWVfZW50cnlfc3QKKwl7CisJQVNOMV9PQkpFQ1QgKm9iamVjdDsKKwlBU04xX1NUUklORyAqdmFsdWU7CisJaW50IHNldDsKKwlpbnQgc2l6ZTsgCS8qIHRlbXAgdmFyaWFibGUgKi8KKwl9IFg1MDlfTkFNRV9FTlRSWTsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X05BTUVfRU5UUlkpCitERUNMQVJFX0FTTjFfU0VUX09GKFg1MDlfTkFNRV9FTlRSWSkKKworLyogd2UgYWx3YXlzIGtlZXAgWDUwOV9OQU1FcyBpbiAyIGZvcm1zLiAqLworc3RydWN0IFg1MDlfbmFtZV9zdAorCXsKKwlTVEFDS19PRihYNTA5X05BTUVfRU5UUlkpICplbnRyaWVzOworCWludCBtb2RpZmllZDsJLyogdHJ1ZSBpZiAnYnl0ZXMnIG5lZWRzIHRvIGJlIGJ1aWx0ICovCisjaWZuZGVmIE9QRU5TU0xfTk9fQlVGRkVSCisJQlVGX01FTSAqYnl0ZXM7CisjZWxzZQorCWNoYXIgKmJ5dGVzOworI2VuZGlmCisvKgl1bnNpZ25lZCBsb25nIGhhc2g7IEtlZXAgdGhlIGhhc2ggYXJvdW5kIGZvciBsb29rdXBzICovCisJdW5zaWduZWQgY2hhciAqY2Fub25fZW5jOworCWludCBjYW5vbl9lbmNsZW47CisJfSAvKiBYNTA5X05BTUUgKi87CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9OQU1FKQorCisjZGVmaW5lIFg1MDlfRVhfVl9ORVRTQ0FQRV9IQUNLCQkweDgwMDAKKyNkZWZpbmUgWDUwOV9FWF9WX0lOSVQJCQkweDAwMDEKK3R5cGVkZWYgc3RydWN0IFg1MDlfZXh0ZW5zaW9uX3N0CisJeworCUFTTjFfT0JKRUNUICpvYmplY3Q7CisJQVNOMV9CT09MRUFOIGNyaXRpY2FsOworCUFTTjFfT0NURVRfU1RSSU5HICp2YWx1ZTsKKwl9IFg1MDlfRVhURU5TSU9OOworCit0eXBlZGVmIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSBYNTA5X0VYVEVOU0lPTlM7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pCitERUNMQVJFX0FTTjFfU0VUX09GKFg1MDlfRVhURU5TSU9OKQorCisvKiBhIHNlcXVlbmNlIG9mIHRoZXNlIGFyZSB1c2VkICovCit0eXBlZGVmIHN0cnVjdCB4NTA5X2F0dHJpYnV0ZXNfc3QKKwl7CisJQVNOMV9PQkpFQ1QgKm9iamVjdDsKKwlpbnQgc2luZ2xlOyAvKiAwIGZvciBhIHNldCwgMSBmb3IgYSBzaW5nbGUgaXRlbSAod2hpY2ggaXMgd3JvbmcpICovCisJdW5pb24JeworCQljaGFyCQkqcHRyOworLyogMCAqLwkJU1RBQ0tfT0YoQVNOMV9UWVBFKSAqc2V0OworLyogMSAqLwkJQVNOMV9UWVBFCSpzaW5nbGU7CisJCX0gdmFsdWU7CisJfSBYNTA5X0FUVFJJQlVURTsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X0FUVFJJQlVURSkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoWDUwOV9BVFRSSUJVVEUpCisKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9yZXFfaW5mb19zdAorCXsKKwlBU04xX0VOQ09ESU5HIGVuYzsKKwlBU04xX0lOVEVHRVIgKnZlcnNpb247CisJWDUwOV9OQU1FICpzdWJqZWN0OworCVg1MDlfUFVCS0VZICpwdWJrZXk7CisJLyogIGQ9MiBobD0yIGw9ICAwIGNvbnM6IGNvbnQ6IDAwICovCisJU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICphdHRyaWJ1dGVzOyAvKiBbIDAgXSAqLworCX0gWDUwOV9SRVFfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9yZXFfc3QKKwl7CisJWDUwOV9SRVFfSU5GTyAqcmVxX2luZm87CisJWDUwOV9BTEdPUiAqc2lnX2FsZzsKKwlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZTsKKwlpbnQgcmVmZXJlbmNlczsKKwl9IFg1MDlfUkVROworCit0eXBlZGVmIHN0cnVjdCB4NTA5X2NpbmZfc3QKKwl7CisJQVNOMV9JTlRFR0VSICp2ZXJzaW9uOwkJLyogWyAwIF0gZGVmYXVsdCBvZiB2MSAqLworCUFTTjFfSU5URUdFUiAqc2VyaWFsTnVtYmVyOworCVg1MDlfQUxHT1IgKnNpZ25hdHVyZTsKKwlYNTA5X05BTUUgKmlzc3VlcjsKKwlYNTA5X1ZBTCAqdmFsaWRpdHk7CisJWDUwOV9OQU1FICpzdWJqZWN0OworCVg1MDlfUFVCS0VZICprZXk7CisJQVNOMV9CSVRfU1RSSU5HICppc3N1ZXJVSUQ7CQkvKiBbIDEgXSBvcHRpb25hbCBpbiB2MiAqLworCUFTTjFfQklUX1NUUklORyAqc3ViamVjdFVJRDsJCS8qIFsgMiBdIG9wdGlvbmFsIGluIHYyICovCisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRlbnNpb25zOwkvKiBbIDMgXSBvcHRpb25hbCBpbiB2MyAqLworCX0gWDUwOV9DSU5GOworCisvKiBUaGlzIHN0dWZmIGlzIGNlcnRpZmljYXRlICJhdXhpbGlhcnkgaW5mbyIKKyAqIGl0IGNvbnRhaW5zIGRldGFpbHMgd2hpY2ggYXJlIHVzZWZ1bCBpbiBjZXJ0aWZpY2F0ZQorICogc3RvcmVzIGFuZCBkYXRhYmFzZXMuIFdoZW4gdXNlZCB0aGlzIGlzIHRhZ2dlZCBvbnRvCisgKiB0aGUgZW5kIG9mIHRoZSBjZXJ0aWZpY2F0ZSBpdHNlbGYKKyAqLworCit0eXBlZGVmIHN0cnVjdCB4NTA5X2NlcnRfYXV4X3N0CisJeworCVNUQUNLX09GKEFTTjFfT0JKRUNUKSAqdHJ1c3Q7CQkvKiB0cnVzdGVkIHVzZXMgKi8KKwlTVEFDS19PRihBU04xX09CSkVDVCkgKnJlamVjdDsJCS8qIHJlamVjdGVkIHVzZXMgKi8KKwlBU04xX1VURjhTVFJJTkcgKmFsaWFzOwkJCS8qICJmcmllbmRseSBuYW1lIiAqLworCUFTTjFfT0NURVRfU1RSSU5HICprZXlpZDsJCS8qIGtleSBpZCBvZiBwcml2YXRlIGtleSAqLworCVNUQUNLX09GKFg1MDlfQUxHT1IpICpvdGhlcjsJCS8qIG90aGVyIHVuc3BlY2lmaWVkIGluZm8gKi8KKwl9IFg1MDlfQ0VSVF9BVVg7CisKK3N0cnVjdCB4NTA5X3N0CisJeworCVg1MDlfQ0lORiAqY2VydF9pbmZvOworCVg1MDlfQUxHT1IgKnNpZ19hbGc7CisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmU7CisJaW50IHZhbGlkOworCWludCByZWZlcmVuY2VzOworCWNoYXIgKm5hbWU7CisJQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKwkvKiBUaGVzZSBjb250YWluIGNvcGllcyBvZiB2YXJpb3VzIGV4dGVuc2lvbiB2YWx1ZXMgKi8KKwlsb25nIGV4X3BhdGhsZW47CisJbG9uZyBleF9wY3BhdGhsZW47CisJdW5zaWduZWQgbG9uZyBleF9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGV4X2t1c2FnZTsKKwl1bnNpZ25lZCBsb25nIGV4X3hrdXNhZ2U7CisJdW5zaWduZWQgbG9uZyBleF9uc2NlcnQ7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKnNraWQ7CisJQVVUSE9SSVRZX0tFWUlEICpha2lkOworCVg1MDlfUE9MSUNZX0NBQ0hFICpwb2xpY3lfY2FjaGU7CisJU1RBQ0tfT0YoRElTVF9QT0lOVCkgKmNybGRwOworCVNUQUNLX09GKEdFTkVSQUxfTkFNRSkgKmFsdG5hbWU7CisJTkFNRV9DT05TVFJBSU5UUyAqbmM7CisjaWZuZGVmIE9QRU5TU0xfTk9fUkZDMzc3OQorCVNUQUNLX09GKElQQWRkcmVzc0ZhbWlseSkgKnJmYzM3NzlfYWRkcjsKKwlzdHJ1Y3QgQVNJZGVudGlmaWVyc19zdCAqcmZjMzc3OV9hc2lkOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisJdW5zaWduZWQgY2hhciBzaGExX2hhc2hbU0hBX0RJR0VTVF9MRU5HVEhdOworI2VuZGlmCisJWDUwOV9DRVJUX0FVWCAqYXV4OworCX0gLyogWDUwOSAqLzsKKworREVDTEFSRV9TVEFDS19PRihYNTA5KQorREVDTEFSRV9BU04xX1NFVF9PRihYNTA5KQorCisvKiBUaGlzIGlzIHVzZWQgZm9yIGEgdGFibGUgb2YgdHJ1c3QgY2hlY2tpbmcgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IHg1MDlfdHJ1c3Rfc3QgeworCWludCB0cnVzdDsKKwlpbnQgZmxhZ3M7CisJaW50ICgqY2hlY2tfdHJ1c3QpKHN0cnVjdCB4NTA5X3RydXN0X3N0ICosIFg1MDkgKiwgaW50KTsKKwljaGFyICpuYW1lOworCWludCBhcmcxOworCXZvaWQgKmFyZzI7Cit9IFg1MDlfVFJVU1Q7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9UUlVTVCkKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9jZXJ0X3BhaXJfc3QgeworCVg1MDkgKmZvcndhcmQ7CisJWDUwOSAqcmV2ZXJzZTsKK30gWDUwOV9DRVJUX1BBSVI7CisKKy8qIHN0YW5kYXJkIHRydXN0IGlkcyAqLworCisjZGVmaW5lIFg1MDlfVFJVU1RfREVGQVVMVAktMQkvKiBPbmx5IHZhbGlkIGluIHB1cnBvc2Ugc2V0dGluZ3MgKi8KKworI2RlZmluZSBYNTA5X1RSVVNUX0NPTVBBVAkxCisjZGVmaW5lIFg1MDlfVFJVU1RfU1NMX0NMSUVOVAkyCisjZGVmaW5lIFg1MDlfVFJVU1RfU1NMX1NFUlZFUgkzCisjZGVmaW5lIFg1MDlfVFJVU1RfRU1BSUwJNAorI2RlZmluZSBYNTA5X1RSVVNUX09CSkVDVF9TSUdOCTUKKyNkZWZpbmUgWDUwOV9UUlVTVF9PQ1NQX1NJR04JNgorI2RlZmluZSBYNTA5X1RSVVNUX09DU1BfUkVRVUVTVAk3CisjZGVmaW5lIFg1MDlfVFJVU1RfVFNBCQk4CisKKy8qIEtlZXAgdGhlc2UgdXAgdG8gZGF0ZSEgKi8KKyNkZWZpbmUgWDUwOV9UUlVTVF9NSU4JCTEKKyNkZWZpbmUgWDUwOV9UUlVTVF9NQVgJCTgKKworCisvKiB0cnVzdF9mbGFncyB2YWx1ZXMgKi8KKyNkZWZpbmUJWDUwOV9UUlVTVF9EWU5BTUlDIAkxCisjZGVmaW5lCVg1MDlfVFJVU1RfRFlOQU1JQ19OQU1FCTIKKworLyogY2hlY2tfdHJ1c3QgcmV0dXJuIGNvZGVzICovCisKKyNkZWZpbmUgWDUwOV9UUlVTVF9UUlVTVEVECTEKKyNkZWZpbmUgWDUwOV9UUlVTVF9SRUpFQ1RFRAkyCisjZGVmaW5lIFg1MDlfVFJVU1RfVU5UUlVTVEVECTMKKworLyogRmxhZ3MgZm9yIFg1MDlfcHJpbnRfZXgoKSAqLworCisjZGVmaW5lCVg1MDlfRkxBR19DT01QQVQJCTAKKyNkZWZpbmUJWDUwOV9GTEFHX05PX0hFQURFUgkJMUwKKyNkZWZpbmUJWDUwOV9GTEFHX05PX1ZFUlNJT04JCSgxTCA8PCAxKQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fU0VSSUFMCQkoMUwgPDwgMikKKyNkZWZpbmUJWDUwOV9GTEFHX05PX1NJR05BTUUJCSgxTCA8PCAzKQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fSVNTVUVSCQkoMUwgPDwgNCkKKyNkZWZpbmUJWDUwOV9GTEFHX05PX1ZBTElESVRZCQkoMUwgPDwgNSkKKyNkZWZpbmUJWDUwOV9GTEFHX05PX1NVQkpFQ1QJCSgxTCA8PCA2KQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fUFVCS0VZCQkoMUwgPDwgNykKKyNkZWZpbmUJWDUwOV9GTEFHX05PX0VYVEVOU0lPTlMJCSgxTCA8PCA4KQorI2RlZmluZQlYNTA5X0ZMQUdfTk9fU0lHRFVNUAkJKDFMIDw8IDkpCisjZGVmaW5lCVg1MDlfRkxBR19OT19BVVgJCSgxTCA8PCAxMCkKKyNkZWZpbmUJWDUwOV9GTEFHX05PX0FUVFJJQlVURVMJCSgxTCA8PCAxMSkKKworLyogRmxhZ3Mgc3BlY2lmaWMgdG8gWDUwOV9OQU1FX3ByaW50X2V4KCkgKi8JCisKKy8qIFRoZSBmaWVsZCBzZXBhcmF0b3IgaW5mb3JtYXRpb24gKi8KKworI2RlZmluZSBYTl9GTEFHX1NFUF9NQVNLCSgweGYgPDwgMTYpCisKKyNkZWZpbmUgWE5fRkxBR19DT01QQVQJCTAJCS8qIFRyYWRpdGlvbmFsIFNTTGVheTogdXNlIG9sZCBYNTA5X05BTUVfcHJpbnQgKi8KKyNkZWZpbmUgWE5fRkxBR19TRVBfQ09NTUFfUExVUwkoMSA8PCAxNikJLyogUkZDMjI1MyAsKyAqLworI2RlZmluZSBYTl9GTEFHX1NFUF9DUExVU19TUEMJKDIgPDwgMTYpCS8qICwrIHNwYWNlZDogbW9yZSByZWFkYWJsZSAqLworI2RlZmluZSBYTl9GTEFHX1NFUF9TUExVU19TUEMJKDMgPDwgMTYpCS8qIDsrIHNwYWNlZCAqLworI2RlZmluZSBYTl9GTEFHX1NFUF9NVUxUSUxJTkUJKDQgPDwgMTYpCS8qIE9uZSBsaW5lIHBlciBmaWVsZCAqLworCisjZGVmaW5lIFhOX0ZMQUdfRE5fUkVWCQkoMSA8PCAyMCkJLyogUmV2ZXJzZSBETiBvcmRlciAqLworCisvKiBIb3cgdGhlIGZpZWxkIG5hbWUgaXMgc2hvd24gKi8KKworI2RlZmluZSBYTl9GTEFHX0ZOX01BU0sJCSgweDMgPDwgMjEpCisKKyNkZWZpbmUgWE5fRkxBR19GTl9TTgkJMAkJLyogT2JqZWN0IHNob3J0IG5hbWUgKi8KKyNkZWZpbmUgWE5fRkxBR19GTl9MTgkJKDEgPDwgMjEpCS8qIE9iamVjdCBsb25nIG5hbWUgKi8KKyNkZWZpbmUgWE5fRkxBR19GTl9PSUQJCSgyIDw8IDIxKQkvKiBBbHdheXMgdXNlIE9JRHMgKi8KKyNkZWZpbmUgWE5fRkxBR19GTl9OT05FCQkoMyA8PCAyMSkJLyogTm8gZmllbGQgbmFtZXMgKi8KKworI2RlZmluZSBYTl9GTEFHX1NQQ19FUQkJKDEgPDwgMjMpCS8qIFB1dCBzcGFjZXMgcm91bmQgJz0nICovCisKKy8qIFRoaXMgZGV0ZXJtaW5lcyBpZiB3ZSBkdW1wIGZpZWxkcyB3ZSBkb24ndCByZWNvZ25pc2U6CisgKiBSRkMyMjUzIHJlcXVpcmVzIHRoaXMuCisgKi8KKworI2RlZmluZSBYTl9GTEFHX0RVTVBfVU5LTk9XTl9GSUVMRFMgKDEgPDwgMjQpCisKKyNkZWZpbmUgWE5fRkxBR19GTl9BTElHTgkoMSA8PCAyNSkJLyogQWxpZ24gZmllbGQgbmFtZXMgdG8gMjAgY2hhcmFjdGVycyAqLworCisvKiBDb21wbGV0ZSBzZXQgb2YgUkZDMjI1MyBmbGFncyAqLworCisjZGVmaW5lIFhOX0ZMQUdfUkZDMjI1MyAoQVNOMV9TVFJGTEdTX1JGQzIyNTMgfCBcCisJCQlYTl9GTEFHX1NFUF9DT01NQV9QTFVTIHwgXAorCQkJWE5fRkxBR19ETl9SRVYgfCBcCisJCQlYTl9GTEFHX0ZOX1NOIHwgXAorCQkJWE5fRkxBR19EVU1QX1VOS05PV05fRklFTERTKQorCisvKiByZWFkYWJsZSBvbmVsaW5lIGZvcm0gKi8KKworI2RlZmluZSBYTl9GTEFHX09ORUxJTkUgKEFTTjFfU1RSRkxHU19SRkMyMjUzIHwgXAorCQkJQVNOMV9TVFJGTEdTX0VTQ19RVU9URSB8IFwKKwkJCVhOX0ZMQUdfU0VQX0NQTFVTX1NQQyB8IFwKKwkJCVhOX0ZMQUdfU1BDX0VRIHwgXAorCQkJWE5fRkxBR19GTl9TTikKKworLyogcmVhZGFibGUgbXVsdGlsaW5lIGZvcm0gKi8KKworI2RlZmluZSBYTl9GTEFHX01VTFRJTElORSAoQVNOMV9TVFJGTEdTX0VTQ19DVFJMIHwgXAorCQkJQVNOMV9TVFJGTEdTX0VTQ19NU0IgfCBcCisJCQlYTl9GTEFHX1NFUF9NVUxUSUxJTkUgfCBcCisJCQlYTl9GTEFHX1NQQ19FUSB8IFwKKwkJCVhOX0ZMQUdfRk5fTE4gfCBcCisJCQlYTl9GTEFHX0ZOX0FMSUdOKQorCitzdHJ1Y3QgeDUwOV9yZXZva2VkX3N0CisJeworCUFTTjFfSU5URUdFUiAqc2VyaWFsTnVtYmVyOworCUFTTjFfVElNRSAqcmV2b2NhdGlvbkRhdGU7CisJU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pIC8qIG9wdGlvbmFsICovICpleHRlbnNpb25zOworCS8qIFNldCB1cCBpZiBpbmRpcmVjdCBDUkwgKi8KKwlTVEFDS19PRihHRU5FUkFMX05BTUUpICppc3N1ZXI7CisJLyogUmV2b2NhdGlvbiByZWFzb24gKi8KKwlpbnQgcmVhc29uOworCWludCBzZXF1ZW5jZTsgLyogbG9hZCBzZXF1ZW5jZSAqLworCX07CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9SRVZPS0VEKQorREVDTEFSRV9BU04xX1NFVF9PRihYNTA5X1JFVk9LRUQpCisKK3R5cGVkZWYgc3RydWN0IFg1MDlfY3JsX2luZm9fc3QKKwl7CisJQVNOMV9JTlRFR0VSICp2ZXJzaW9uOworCVg1MDlfQUxHT1IgKnNpZ19hbGc7CisJWDUwOV9OQU1FICppc3N1ZXI7CisJQVNOMV9USU1FICpsYXN0VXBkYXRlOworCUFTTjFfVElNRSAqbmV4dFVwZGF0ZTsKKwlTVEFDS19PRihYNTA5X1JFVk9LRUQpICpyZXZva2VkOworCVNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAvKiBbMF0gKi8gKmV4dGVuc2lvbnM7CisJQVNOMV9FTkNPRElORyBlbmM7CisJfSBYNTA5X0NSTF9JTkZPOworCitzdHJ1Y3QgWDUwOV9jcmxfc3QKKwl7CisJLyogYWN0dWFsIHNpZ25hdHVyZSAqLworCVg1MDlfQ1JMX0lORk8gKmNybDsKKwlYNTA5X0FMR09SICpzaWdfYWxnOworCUFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlOworCWludCByZWZlcmVuY2VzOworCWludCBmbGFnczsKKwkvKiBDb3BpZXMgb2YgdmFyaW91cyBleHRlbnNpb25zICovCisJQVVUSE9SSVRZX0tFWUlEICpha2lkOworCUlTU1VJTkdfRElTVF9QT0lOVCAqaWRwOworCS8qIENvbnZlbmllbnQgYnJlYWtkb3duIG9mIElEUCAqLworCWludCBpZHBfZmxhZ3M7CisJaW50IGlkcF9yZWFzb25zOworCS8qIENSTCBhbmQgYmFzZSBDUkwgbnVtYmVycyBmb3IgZGVsdGEgcHJvY2Vzc2luZyAqLworCUFTTjFfSU5URUdFUiAqY3JsX251bWJlcjsKKwlBU04xX0lOVEVHRVIgKmJhc2VfY3JsX251bWJlcjsKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEKKwl1bnNpZ25lZCBjaGFyIHNoYTFfaGFzaFtTSEFfRElHRVNUX0xFTkdUSF07CisjZW5kaWYKKwlTVEFDS19PRihHRU5FUkFMX05BTUVTKSAqaXNzdWVyczsKKwljb25zdCBYNTA5X0NSTF9NRVRIT0QgKm1ldGg7CisJdm9pZCAqbWV0aF9kYXRhOworCX0gLyogWDUwOV9DUkwgKi87CisKK0RFQ0xBUkVfU1RBQ0tfT0YoWDUwOV9DUkwpCitERUNMQVJFX0FTTjFfU0VUX09GKFg1MDlfQ1JMKQorCit0eXBlZGVmIHN0cnVjdCBwcml2YXRlX2tleV9zdAorCXsKKwlpbnQgdmVyc2lvbjsKKwkvKiBUaGUgUEtDUyM4IGRhdGEgdHlwZXMgKi8KKwlYNTA5X0FMR09SICplbmNfYWxnb3I7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmVuY19wa2V5OwkvKiBlbmNyeXB0ZWQgcHViIGtleSAqLworCisJLyogV2hlbiBkZWNyeXB0ZWQsIHRoZSBmb2xsb3dpbmcgd2lsbCBub3QgYmUgTlVMTCAqLworCUVWUF9QS0VZICpkZWNfcGtleTsKKworCS8qIHVzZWQgdG8gZW5jcnlwdCBhbmQgZGVjcnlwdCAqLworCWludCBrZXlfbGVuZ3RoOworCWNoYXIgKmtleV9kYXRhOworCWludCBrZXlfZnJlZTsJLyogdHJ1ZSBpZiB3ZSBzaG91bGQgYXV0byBmcmVlIGtleV9kYXRhICovCisKKwkvKiBleHBhbmRlZCB2ZXJzaW9uIG9mICdlbmNfYWxnb3InICovCisJRVZQX0NJUEhFUl9JTkZPIGNpcGhlcjsKKworCWludCByZWZlcmVuY2VzOworCX0gWDUwOV9QS0VZOworCisjaWZuZGVmIE9QRU5TU0xfTk9fRVZQCit0eXBlZGVmIHN0cnVjdCBYNTA5X2luZm9fc3QKKwl7CisJWDUwOSAqeDUwOTsKKwlYNTA5X0NSTCAqY3JsOworCVg1MDlfUEtFWSAqeF9wa2V5OworCisJRVZQX0NJUEhFUl9JTkZPIGVuY19jaXBoZXI7CisJaW50IGVuY19sZW47CisJY2hhciAqZW5jX2RhdGE7CisKKwlpbnQgcmVmZXJlbmNlczsKKwl9IFg1MDlfSU5GTzsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X0lORk8pCisjZW5kaWYKKworLyogVGhlIG5leHQgMiBzdHJ1Y3R1cmVzIGFuZCB0aGVpciA4IHJvdXRpbmVzIHdlcmUgc2VudCB0byBtZSBieQorICogUGF0IFJpY2hhcmQgPHBhdHJAeDUwOS5jb20+IGFuZCBhcmUgdXNlZCB0byBtYW5pcHVsYXRlCisgKiBOZXRzY2FwZXMgc3BraSBzdHJ1Y3R1cmVzIC0gdXNlZnVsIGlmIHlvdSBhcmUgd3JpdGluZyBhIENBIHdlYiBwYWdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE5ldHNjYXBlX3Nwa2FjX3N0CisJeworCVg1MDlfUFVCS0VZICpwdWJrZXk7CisJQVNOMV9JQTVTVFJJTkcgKmNoYWxsZW5nZTsJLyogY2hhbGxlbmdlIHNlbnQgaW4gYXRsYXMgPj0gUFIyICovCisJfSBORVRTQ0FQRV9TUEtBQzsKKwordHlwZWRlZiBzdHJ1Y3QgTmV0c2NhcGVfc3BraV9zdAorCXsKKwlORVRTQ0FQRV9TUEtBQyAqc3BrYWM7CS8qIHNpZ25lZCBwdWJsaWMga2V5IGFuZCBjaGFsbGVuZ2UgKi8KKwlYNTA5X0FMR09SICpzaWdfYWxnb3I7CisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmU7CisJfSBORVRTQ0FQRV9TUEtJOworCisvKiBOZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IE5ldHNjYXBlX2NlcnRpZmljYXRlX3NlcXVlbmNlCisJeworCUFTTjFfT0JKRUNUICp0eXBlOworCVNUQUNLX09GKFg1MDkpICpjZXJ0czsKKwl9IE5FVFNDQVBFX0NFUlRfU0VRVUVOQ0U7CisKKy8qIFVudXNlZCAoYW5kIGl2IGxlbmd0aCBpcyB3cm9uZykKK3R5cGVkZWYgc3RydWN0IENCQ1BhcmFtZXRlcl9zdAorCXsKKwl1bnNpZ25lZCBjaGFyIGl2WzhdOworCX0gQ0JDX1BBUkFNOworKi8KKworLyogUGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBzdHJ1Y3R1cmUgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUEJFUEFSQU1fc3QgeworQVNOMV9PQ1RFVF9TVFJJTkcgKnNhbHQ7CitBU04xX0lOVEVHRVIgKml0ZXI7Cit9IFBCRVBBUkFNOworCisvKiBQYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIFYyIHN0cnVjdHVyZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgUEJFMlBBUkFNX3N0IHsKK1g1MDlfQUxHT1IgKmtleWZ1bmM7CitYNTA5X0FMR09SICplbmNyeXB0aW9uOworfSBQQkUyUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IFBCS0RGMlBBUkFNX3N0IHsKK0FTTjFfVFlQRSAqc2FsdDsJLyogVXN1YWxseSBPQ1RFVCBTVFJJTkcgYnV0IGNvdWxkIGJlIGFueXRoaW5nICovCitBU04xX0lOVEVHRVIgKml0ZXI7CitBU04xX0lOVEVHRVIgKmtleWxlbmd0aDsKK1g1MDlfQUxHT1IgKnByZjsKK30gUEJLREYyUEFSQU07CisKKworLyogUEtDUyM4IHByaXZhdGUga2V5IGluZm8gc3RydWN0dXJlICovCisKK3N0cnVjdCBwa2NzOF9wcml2X2tleV9pbmZvX3N0CisgICAgICAgIHsKKyAgICAgICAgaW50IGJyb2tlbjsgICAgIC8qIEZsYWcgZm9yIHZhcmlvdXMgYnJva2VuIGZvcm1hdHMgKi8KKyNkZWZpbmUgUEtDUzhfT0sJCTAKKyNkZWZpbmUgUEtDUzhfTk9fT0NURVQJCTEKKyNkZWZpbmUgUEtDUzhfRU1CRURERURfUEFSQU0JMgorI2RlZmluZSBQS0NTOF9OU19EQgkJMworI2RlZmluZSBQS0NTOF9ORUdfUFJJVktFWQk0CisgICAgICAgIEFTTjFfSU5URUdFUiAqdmVyc2lvbjsKKyAgICAgICAgWDUwOV9BTEdPUiAqcGtleWFsZzsKKyAgICAgICAgQVNOMV9UWVBFICpwa2V5OyAvKiBTaG91bGQgYmUgT0NURVQgU1RSSU5HIGJ1dCBzb21lIGFyZSBicm9rZW4gKi8KKyAgICAgICAgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICphdHRyaWJ1dGVzOworICAgICAgICB9OworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2luY2x1ZGUgPG9wZW5zc2wveDUwOV92ZnkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BrY3M3Lmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgWDUwOV9FWFRfUEFDS19VTktOT1dOCTEKKyNkZWZpbmUgWDUwOV9FWFRfUEFDS19TVFJJTkcJMgorCisjZGVmaW5lCQlYNTA5X2dldF92ZXJzaW9uKHgpIEFTTjFfSU5URUdFUl9nZXQoKHgpLT5jZXJ0X2luZm8tPnZlcnNpb24pCisvKiAjZGVmaW5lCVg1MDlfZ2V0X3NlcmlhbE51bWJlcih4KSAoKHgpLT5jZXJ0X2luZm8tPnNlcmlhbE51bWJlcikgKi8KKyNkZWZpbmUJCVg1MDlfZ2V0X25vdEJlZm9yZSh4KSAoKHgpLT5jZXJ0X2luZm8tPnZhbGlkaXR5LT5ub3RCZWZvcmUpCisjZGVmaW5lCQlYNTA5X2dldF9ub3RBZnRlcih4KSAoKHgpLT5jZXJ0X2luZm8tPnZhbGlkaXR5LT5ub3RBZnRlcikKKyNkZWZpbmUJCVg1MDlfZXh0cmFjdF9rZXkoeCkJWDUwOV9nZXRfcHVia2V5KHgpIC8qKioqKi8KKyNkZWZpbmUJCVg1MDlfUkVRX2dldF92ZXJzaW9uKHgpIEFTTjFfSU5URUdFUl9nZXQoKHgpLT5yZXFfaW5mby0+dmVyc2lvbikKKyNkZWZpbmUJCVg1MDlfUkVRX2dldF9zdWJqZWN0X25hbWUoeCkgKCh4KS0+cmVxX2luZm8tPnN1YmplY3QpCisjZGVmaW5lCQlYNTA5X1JFUV9leHRyYWN0X2tleShhKQlYNTA5X1JFUV9nZXRfcHVia2V5KGEpCisjZGVmaW5lCQlYNTA5X25hbWVfY21wKGEsYikJWDUwOV9OQU1FX2NtcCgoYSksKGIpKQorI2RlZmluZQkJWDUwOV9nZXRfc2lnbmF0dXJlX3R5cGUoeCkgRVZQX1BLRVlfdHlwZShPQkpfb2JqMm5pZCgoeCktPnNpZ19hbGctPmFsZ29yaXRobSkpCisKKyNkZWZpbmUJCVg1MDlfQ1JMX2dldF92ZXJzaW9uKHgpIEFTTjFfSU5URUdFUl9nZXQoKHgpLT5jcmwtPnZlcnNpb24pCisjZGVmaW5lIAlYNTA5X0NSTF9nZXRfbGFzdFVwZGF0ZSh4KSAoKHgpLT5jcmwtPmxhc3RVcGRhdGUpCisjZGVmaW5lIAlYNTA5X0NSTF9nZXRfbmV4dFVwZGF0ZSh4KSAoKHgpLT5jcmwtPm5leHRVcGRhdGUpCisjZGVmaW5lCQlYNTA5X0NSTF9nZXRfaXNzdWVyKHgpICgoeCktPmNybC0+aXNzdWVyKQorI2RlZmluZQkJWDUwOV9DUkxfZ2V0X1JFVk9LRUQoeCkgKCh4KS0+Y3JsLT5yZXZva2VkKQorCit2b2lkIFg1MDlfQ1JMX3NldF9kZWZhdWx0X21ldGhvZChjb25zdCBYNTA5X0NSTF9NRVRIT0QgKm1ldGgpOworWDUwOV9DUkxfTUVUSE9EICpYNTA5X0NSTF9NRVRIT0RfbmV3KAorCWludCAoKmNybF9pbml0KShYNTA5X0NSTCAqY3JsKSwKKwlpbnQgKCpjcmxfZnJlZSkoWDUwOV9DUkwgKmNybCksCisJaW50ICgqY3JsX2xvb2t1cCkoWDUwOV9DUkwgKmNybCwgWDUwOV9SRVZPS0VEICoqcmV0LAorCQkJCUFTTjFfSU5URUdFUiAqc2VyLCBYNTA5X05BTUUgKmlzc3VlciksCisJaW50ICgqY3JsX3ZlcmlmeSkoWDUwOV9DUkwgKmNybCwgRVZQX1BLRVkgKnBrKSk7Cit2b2lkIFg1MDlfQ1JMX01FVEhPRF9mcmVlKFg1MDlfQ1JMX01FVEhPRCAqbSk7CisKK3ZvaWQgWDUwOV9DUkxfc2V0X21ldGhfZGF0YShYNTA5X0NSTCAqY3JsLCB2b2lkICpkYXQpOwordm9pZCAqWDUwOV9DUkxfZ2V0X21ldGhfZGF0YShYNTA5X0NSTCAqY3JsKTsKKworLyogVGhpcyBvbmUgaXMgb25seSB1c2VkIHNvIHRoYXQgYSBiaW5hcnkgZm9ybSBjYW4gb3V0cHV0LCBhcyBpbgorICogaTJkX1g1MDlfTkFNRShYNTA5X2dldF9YNTA5X1BVQktFWSh4KSwmYnVmKSAqLworI2RlZmluZSAJWDUwOV9nZXRfWDUwOV9QVUJLRVkoeCkgKCh4KS0+Y2VydF9pbmZvLT5rZXkpCisKKworY29uc3QgY2hhciAqWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcobG9uZyBuKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0VWUAoraW50IFg1MDlfdmVyaWZ5KFg1MDkgKmEsIEVWUF9QS0VZICpyKTsKKworaW50IFg1MDlfUkVRX3ZlcmlmeShYNTA5X1JFUSAqYSwgRVZQX1BLRVkgKnIpOworaW50IFg1MDlfQ1JMX3ZlcmlmeShYNTA5X0NSTCAqYSwgRVZQX1BLRVkgKnIpOworaW50IE5FVFNDQVBFX1NQS0lfdmVyaWZ5KE5FVFNDQVBFX1NQS0kgKmEsIEVWUF9QS0VZICpyKTsKKworTkVUU0NBUEVfU1BLSSAqIE5FVFNDQVBFX1NQS0lfYjY0X2RlY29kZShjb25zdCBjaGFyICpzdHIsIGludCBsZW4pOworY2hhciAqIE5FVFNDQVBFX1NQS0lfYjY0X2VuY29kZShORVRTQ0FQRV9TUEtJICp4KTsKK0VWUF9QS0VZICpORVRTQ0FQRV9TUEtJX2dldF9wdWJrZXkoTkVUU0NBUEVfU1BLSSAqeCk7CitpbnQgTkVUU0NBUEVfU1BLSV9zZXRfcHVia2V5KE5FVFNDQVBFX1NQS0kgKngsIEVWUF9QS0VZICpwa2V5KTsKKworaW50IE5FVFNDQVBFX1NQS0lfcHJpbnQoQklPICpvdXQsIE5FVFNDQVBFX1NQS0kgKnNwa2kpOworCitpbnQgWDUwOV9zaWduYXR1cmVfcHJpbnQoQklPICpicCxYNTA5X0FMR09SICphbGcsIEFTTjFfU1RSSU5HICpzaWcpOworCitpbnQgWDUwOV9zaWduKFg1MDkgKngsIEVWUF9QS0VZICpwa2V5LCBjb25zdCBFVlBfTUQgKm1kKTsKK2ludCBYNTA5X1JFUV9zaWduKFg1MDlfUkVRICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCk7CitpbnQgWDUwOV9DUkxfc2lnbihYNTA5X0NSTCAqeCwgRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqbWQpOworaW50IE5FVFNDQVBFX1NQS0lfc2lnbihORVRTQ0FQRV9TUEtJICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCk7CisKK2ludCBYNTA5X3B1YmtleV9kaWdlc3QoY29uc3QgWDUwOSAqZGF0YSxjb25zdCBFVlBfTUQgKnR5cGUsCisJCXVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKmxlbik7CitpbnQgWDUwOV9kaWdlc3QoY29uc3QgWDUwOSAqZGF0YSxjb25zdCBFVlBfTUQgKnR5cGUsCisJCXVuc2lnbmVkIGNoYXIgKm1kLCB1bnNpZ25lZCBpbnQgKmxlbik7CitpbnQgWDUwOV9DUkxfZGlnZXN0KGNvbnN0IFg1MDlfQ1JMICpkYXRhLGNvbnN0IEVWUF9NRCAqdHlwZSwKKwkJdW5zaWduZWQgY2hhciAqbWQsIHVuc2lnbmVkIGludCAqbGVuKTsKK2ludCBYNTA5X1JFUV9kaWdlc3QoY29uc3QgWDUwOV9SRVEgKmRhdGEsY29uc3QgRVZQX01EICp0eXBlLAorCQl1bnNpZ25lZCBjaGFyICptZCwgdW5zaWduZWQgaW50ICpsZW4pOworaW50IFg1MDlfTkFNRV9kaWdlc3QoY29uc3QgWDUwOV9OQU1FICpkYXRhLGNvbnN0IEVWUF9NRCAqdHlwZSwKKwkJdW5zaWduZWQgY2hhciAqbWQsIHVuc2lnbmVkIGludCAqbGVuKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitYNTA5ICpkMmlfWDUwOV9mcChGSUxFICpmcCwgWDUwOSAqKng1MDkpOworaW50IGkyZF9YNTA5X2ZwKEZJTEUgKmZwLFg1MDkgKng1MDkpOworWDUwOV9DUkwgKmQyaV9YNTA5X0NSTF9mcChGSUxFICpmcCxYNTA5X0NSTCAqKmNybCk7CitpbnQgaTJkX1g1MDlfQ1JMX2ZwKEZJTEUgKmZwLFg1MDlfQ1JMICpjcmwpOworWDUwOV9SRVEgKmQyaV9YNTA5X1JFUV9mcChGSUxFICpmcCxYNTA5X1JFUSAqKnJlcSk7CitpbnQgaTJkX1g1MDlfUkVRX2ZwKEZJTEUgKmZwLFg1MDlfUkVRICpyZXEpOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorUlNBICpkMmlfUlNBUHJpdmF0ZUtleV9mcChGSUxFICpmcCxSU0EgKipyc2EpOworaW50IGkyZF9SU0FQcml2YXRlS2V5X2ZwKEZJTEUgKmZwLFJTQSAqcnNhKTsKK1JTQSAqZDJpX1JTQVB1YmxpY0tleV9mcChGSUxFICpmcCxSU0EgKipyc2EpOworaW50IGkyZF9SU0FQdWJsaWNLZXlfZnAoRklMRSAqZnAsUlNBICpyc2EpOworUlNBICpkMmlfUlNBX1BVQktFWV9mcChGSUxFICpmcCxSU0EgKipyc2EpOworaW50IGkyZF9SU0FfUFVCS0VZX2ZwKEZJTEUgKmZwLFJTQSAqcnNhKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorRFNBICpkMmlfRFNBX1BVQktFWV9mcChGSUxFICpmcCwgRFNBICoqZHNhKTsKK2ludCBpMmRfRFNBX1BVQktFWV9mcChGSUxFICpmcCwgRFNBICpkc2EpOworRFNBICpkMmlfRFNBUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRFNBICoqZHNhKTsKK2ludCBpMmRfRFNBUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRFNBICpkc2EpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKK0VDX0tFWSAqZDJpX0VDX1BVQktFWV9mcChGSUxFICpmcCwgRUNfS0VZICoqZWNrZXkpOworaW50ICAgaTJkX0VDX1BVQktFWV9mcChGSUxFICpmcCwgRUNfS0VZICplY2tleSk7CitFQ19LRVkgKmQyaV9FQ1ByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVDX0tFWSAqKmVja2V5KTsKK2ludCAgIGkyZF9FQ1ByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVDX0tFWSAqZWNrZXkpOworI2VuZGlmCitYNTA5X1NJRyAqZDJpX1BLQ1M4X2ZwKEZJTEUgKmZwLFg1MDlfU0lHICoqcDgpOworaW50IGkyZF9QS0NTOF9mcChGSUxFICpmcCxYNTA5X1NJRyAqcDgpOworUEtDUzhfUFJJVl9LRVlfSU5GTyAqZDJpX1BLQ1M4X1BSSVZfS0VZX0lORk9fZnAoRklMRSAqZnAsCisJCQkJCQlQS0NTOF9QUklWX0tFWV9JTkZPICoqcDhpbmYpOworaW50IGkyZF9QS0NTOF9QUklWX0tFWV9JTkZPX2ZwKEZJTEUgKmZwLFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4aW5mKTsKK2ludCBpMmRfUEtDUzhQcml2YXRlS2V5SW5mb19mcChGSUxFICpmcCwgRVZQX1BLRVkgKmtleSk7CitpbnQgaTJkX1ByaXZhdGVLZXlfZnAoRklMRSAqZnAsIEVWUF9QS0VZICpwa2V5KTsKK0VWUF9QS0VZICpkMmlfUHJpdmF0ZUtleV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKiphKTsKK2ludCBpMmRfUFVCS0VZX2ZwKEZJTEUgKmZwLCBFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWSAqZDJpX1BVQktFWV9mcChGSUxFICpmcCwgRVZQX1BLRVkgKiphKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCitYNTA5ICpkMmlfWDUwOV9iaW8oQklPICpicCxYNTA5ICoqeDUwOSk7CitpbnQgaTJkX1g1MDlfYmlvKEJJTyAqYnAsWDUwOSAqeDUwOSk7CitYNTA5X0NSTCAqZDJpX1g1MDlfQ1JMX2JpbyhCSU8gKmJwLFg1MDlfQ1JMICoqY3JsKTsKK2ludCBpMmRfWDUwOV9DUkxfYmlvKEJJTyAqYnAsWDUwOV9DUkwgKmNybCk7CitYNTA5X1JFUSAqZDJpX1g1MDlfUkVRX2JpbyhCSU8gKmJwLFg1MDlfUkVRICoqcmVxKTsKK2ludCBpMmRfWDUwOV9SRVFfYmlvKEJJTyAqYnAsWDUwOV9SRVEgKnJlcSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitSU0EgKmQyaV9SU0FQcml2YXRlS2V5X2JpbyhCSU8gKmJwLFJTQSAqKnJzYSk7CitpbnQgaTJkX1JTQVByaXZhdGVLZXlfYmlvKEJJTyAqYnAsUlNBICpyc2EpOworUlNBICpkMmlfUlNBUHVibGljS2V5X2JpbyhCSU8gKmJwLFJTQSAqKnJzYSk7CitpbnQgaTJkX1JTQVB1YmxpY0tleV9iaW8oQklPICpicCxSU0EgKnJzYSk7CitSU0EgKmQyaV9SU0FfUFVCS0VZX2JpbyhCSU8gKmJwLFJTQSAqKnJzYSk7CitpbnQgaTJkX1JTQV9QVUJLRVlfYmlvKEJJTyAqYnAsUlNBICpyc2EpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCitEU0EgKmQyaV9EU0FfUFVCS0VZX2JpbyhCSU8gKmJwLCBEU0EgKipkc2EpOworaW50IGkyZF9EU0FfUFVCS0VZX2JpbyhCSU8gKmJwLCBEU0EgKmRzYSk7CitEU0EgKmQyaV9EU0FQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBEU0EgKipkc2EpOworaW50IGkyZF9EU0FQcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBEU0EgKmRzYSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworRUNfS0VZICpkMmlfRUNfUFVCS0VZX2JpbyhCSU8gKmJwLCBFQ19LRVkgKiplY2tleSk7CitpbnQgICBpMmRfRUNfUFVCS0VZX2JpbyhCSU8gKmJwLCBFQ19LRVkgKmVja2V5KTsKK0VDX0tFWSAqZDJpX0VDUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRUNfS0VZICoqZWNrZXkpOworaW50ICAgaTJkX0VDUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRUNfS0VZICplY2tleSk7CisjZW5kaWYKK1g1MDlfU0lHICpkMmlfUEtDUzhfYmlvKEJJTyAqYnAsWDUwOV9TSUcgKipwOCk7CitpbnQgaTJkX1BLQ1M4X2JpbyhCSU8gKmJwLFg1MDlfU0lHICpwOCk7CitQS0NTOF9QUklWX0tFWV9JTkZPICpkMmlfUEtDUzhfUFJJVl9LRVlfSU5GT19iaW8oQklPICpicCwKKwkJCQkJCVBLQ1M4X1BSSVZfS0VZX0lORk8gKipwOGluZik7CitpbnQgaTJkX1BLQ1M4X1BSSVZfS0VZX0lORk9fYmlvKEJJTyAqYnAsUEtDUzhfUFJJVl9LRVlfSU5GTyAqcDhpbmYpOworaW50IGkyZF9QS0NTOFByaXZhdGVLZXlJbmZvX2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqa2V5KTsKK2ludCBpMmRfUHJpdmF0ZUtleV9iaW8oQklPICpicCwgRVZQX1BLRVkgKnBrZXkpOworRVZQX1BLRVkgKmQyaV9Qcml2YXRlS2V5X2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqKmEpOworaW50IGkyZF9QVUJLRVlfYmlvKEJJTyAqYnAsIEVWUF9QS0VZICpwa2V5KTsKK0VWUF9QS0VZICpkMmlfUFVCS0VZX2JpbyhCSU8gKmJwLCBFVlBfUEtFWSAqKmEpOworI2VuZGlmCisKK1g1MDkgKlg1MDlfZHVwKFg1MDkgKng1MDkpOworWDUwOV9BVFRSSUJVVEUgKlg1MDlfQVRUUklCVVRFX2R1cChYNTA5X0FUVFJJQlVURSAqeGEpOworWDUwOV9FWFRFTlNJT04gKlg1MDlfRVhURU5TSU9OX2R1cChYNTA5X0VYVEVOU0lPTiAqZXgpOworWDUwOV9DUkwgKlg1MDlfQ1JMX2R1cChYNTA5X0NSTCAqY3JsKTsKK1g1MDlfUkVRICpYNTA5X1JFUV9kdXAoWDUwOV9SRVEgKnJlcSk7CitYNTA5X0FMR09SICpYNTA5X0FMR09SX2R1cChYNTA5X0FMR09SICp4bik7CitpbnQgWDUwOV9BTEdPUl9zZXQwKFg1MDlfQUxHT1IgKmFsZywgQVNOMV9PQkpFQ1QgKmFvYmosIGludCBwdHlwZSwgdm9pZCAqcHZhbCk7Cit2b2lkIFg1MDlfQUxHT1JfZ2V0MChBU04xX09CSkVDVCAqKnBhb2JqLCBpbnQgKnBwdHlwZSwgdm9pZCAqKnBwdmFsLAorCQkJCQkJWDUwOV9BTEdPUiAqYWxnb3IpOworCitYNTA5X05BTUUgKlg1MDlfTkFNRV9kdXAoWDUwOV9OQU1FICp4bik7CitYNTA5X05BTUVfRU5UUlkgKlg1MDlfTkFNRV9FTlRSWV9kdXAoWDUwOV9OQU1FX0VOVFJZICpuZSk7CisKK2ludAkJWDUwOV9jbXBfdGltZShjb25zdCBBU04xX1RJTUUgKnMsIHRpbWVfdCAqdCk7CitpbnQJCVg1MDlfY21wX2N1cnJlbnRfdGltZShjb25zdCBBU04xX1RJTUUgKnMpOworQVNOMV9USU1FICoJWDUwOV90aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgYWRqLCB0aW1lX3QgKnQpOworQVNOMV9USU1FICoJWDUwOV90aW1lX2Fkal9leChBU04xX1RJTUUgKnMsCisJCQkJaW50IG9mZnNldF9kYXksIGxvbmcgb2Zmc2V0X3NlYywgdGltZV90ICp0KTsKK0FTTjFfVElNRSAqCVg1MDlfZ210aW1lX2FkaihBU04xX1RJTUUgKnMsIGxvbmcgYWRqKTsKKworY29uc3QgY2hhciAqCVg1MDlfZ2V0X2RlZmF1bHRfY2VydF9hcmVhKHZvaWQgKTsKK2NvbnN0IGNoYXIgKglYNTA5X2dldF9kZWZhdWx0X2NlcnRfZGlyKHZvaWQgKTsKK2NvbnN0IGNoYXIgKglYNTA5X2dldF9kZWZhdWx0X2NlcnRfZmlsZSh2b2lkICk7Citjb25zdCBjaGFyICoJWDUwOV9nZXRfZGVmYXVsdF9jZXJ0X2Rpcl9lbnYodm9pZCApOworY29uc3QgY2hhciAqCVg1MDlfZ2V0X2RlZmF1bHRfY2VydF9maWxlX2Vudih2b2lkICk7Citjb25zdCBjaGFyICoJWDUwOV9nZXRfZGVmYXVsdF9wcml2YXRlX2Rpcih2b2lkICk7CisKK1g1MDlfUkVRICoJWDUwOV90b19YNTA5X1JFUShYNTA5ICp4LCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICptZCk7CitYNTA5ICoJCVg1MDlfUkVRX3RvX1g1MDkoWDUwOV9SRVEgKnIsIGludCBkYXlzLEVWUF9QS0VZICpwa2V5KTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X0FMR09SKQorREVDTEFSRV9BU04xX0VOQ09ERV9GVU5DVElPTlMoWDUwOV9BTEdPUlMsIFg1MDlfQUxHT1JTLCBYNTA5X0FMR09SUykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9WQUwpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9QVUJLRVkpCisKK2ludAkJWDUwOV9QVUJLRVlfc2V0KFg1MDlfUFVCS0VZICoqeCwgRVZQX1BLRVkgKnBrZXkpOworRVZQX1BLRVkgKglYNTA5X1BVQktFWV9nZXQoWDUwOV9QVUJLRVkgKmtleSk7CitpbnQJCVg1MDlfZ2V0X3B1YmtleV9wYXJhbWV0ZXJzKEVWUF9QS0VZICpwa2V5LAorCQkJCQkgICBTVEFDS19PRihYNTA5KSAqY2hhaW4pOworaW50CQlpMmRfUFVCS0VZKEVWUF9QS0VZICphLHVuc2lnbmVkIGNoYXIgKipwcCk7CitFVlBfUEtFWSAqCWQyaV9QVUJLRVkoRVZQX1BLRVkgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK2ludAkJaTJkX1JTQV9QVUJLRVkoUlNBICphLHVuc2lnbmVkIGNoYXIgKipwcCk7CitSU0EgKgkJZDJpX1JTQV9QVUJLRVkoUlNBICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKK2ludAkJaTJkX0RTQV9QVUJLRVkoRFNBICphLHVuc2lnbmVkIGNoYXIgKipwcCk7CitEU0EgKgkJZDJpX0RTQV9QVUJLRVkoRFNBICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsCisJCQlsb25nIGxlbmd0aCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworaW50CQlpMmRfRUNfUFVCS0VZKEVDX0tFWSAqYSwgdW5zaWduZWQgY2hhciAqKnBwKTsKK0VDX0tFWSAJCSpkMmlfRUNfUFVCS0VZKEVDX0tFWSAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCWxvbmcgbGVuZ3RoKTsKKyNlbmRpZgorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfU0lHKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X1JFUV9JTkZPKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X1JFUSkKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X0FUVFJJQlVURSkKK1g1MDlfQVRUUklCVVRFICpYNTA5X0FUVFJJQlVURV9jcmVhdGUoaW50IG5pZCwgaW50IGF0cnR5cGUsIHZvaWQgKnZhbHVlKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X0VYVEVOU0lPTikKK0RFQ0xBUkVfQVNOMV9FTkNPREVfRlVOQ1RJT05TKFg1MDlfRVhURU5TSU9OUywgWDUwOV9FWFRFTlNJT05TLCBYNTA5X0VYVEVOU0lPTlMpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9OQU1FX0VOVFJZKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfTkFNRSkKKworaW50CQlYNTA5X05BTUVfc2V0KFg1MDlfTkFNRSAqKnhuLCBYNTA5X05BTUUgKm5hbWUpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQ0lORikKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5KQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X0NFUlRfQVVYKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFg1MDlfQ0VSVF9QQUlSKQorCitpbnQgWDUwOV9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJICAgICBDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQgWDUwOV9zZXRfZXhfZGF0YShYNTA5ICpyLCBpbnQgaWR4LCB2b2lkICphcmcpOwordm9pZCAqWDUwOV9nZXRfZXhfZGF0YShYNTA5ICpyLCBpbnQgaWR4KTsKK2ludAkJaTJkX1g1MDlfQVVYKFg1MDkgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK1g1MDkgKgkJZDJpX1g1MDlfQVVYKFg1MDkgKiphLGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCxsb25nIGxlbmd0aCk7CisKK2ludCBYNTA5X2FsaWFzX3NldDEoWDUwOSAqeCwgdW5zaWduZWQgY2hhciAqbmFtZSwgaW50IGxlbik7CitpbnQgWDUwOV9rZXlpZF9zZXQxKFg1MDkgKngsIHVuc2lnbmVkIGNoYXIgKmlkLCBpbnQgbGVuKTsKK3Vuc2lnbmVkIGNoYXIgKiBYNTA5X2FsaWFzX2dldDAoWDUwOSAqeCwgaW50ICpsZW4pOwordW5zaWduZWQgY2hhciAqIFg1MDlfa2V5aWRfZ2V0MChYNTA5ICp4LCBpbnQgKmxlbik7CitpbnQgKCpYNTA5X1RSVVNUX3NldF9kZWZhdWx0KGludCAoKnRydXN0KShpbnQgLCBYNTA5ICosIGludCkpKShpbnQsIFg1MDkgKiwgaW50KTsKK2ludCBYNTA5X1RSVVNUX3NldChpbnQgKnQsIGludCB0cnVzdCk7CitpbnQgWDUwOV9hZGQxX3RydXN0X29iamVjdChYNTA5ICp4LCBBU04xX09CSkVDVCAqb2JqKTsKK2ludCBYNTA5X2FkZDFfcmVqZWN0X29iamVjdChYNTA5ICp4LCBBU04xX09CSkVDVCAqb2JqKTsKK3ZvaWQgWDUwOV90cnVzdF9jbGVhcihYNTA5ICp4KTsKK3ZvaWQgWDUwOV9yZWplY3RfY2xlYXIoWDUwOSAqeCk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoWDUwOV9SRVZPS0VEKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X0NSTF9JTkZPKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhYNTA5X0NSTCkKKworaW50IFg1MDlfQ1JMX2FkZDBfcmV2b2tlZChYNTA5X0NSTCAqY3JsLCBYNTA5X1JFVk9LRUQgKnJldik7CitpbnQgWDUwOV9DUkxfZ2V0MF9ieV9zZXJpYWwoWDUwOV9DUkwgKmNybCwKKwkJWDUwOV9SRVZPS0VEICoqcmV0LCBBU04xX0lOVEVHRVIgKnNlcmlhbCk7CitpbnQgWDUwOV9DUkxfZ2V0MF9ieV9jZXJ0KFg1MDlfQ1JMICpjcmwsIFg1MDlfUkVWT0tFRCAqKnJldCwgWDUwOSAqeCk7CisKK1g1MDlfUEtFWSAqCVg1MDlfUEtFWV9uZXcodm9pZCApOwordm9pZAkJWDUwOV9QS0VZX2ZyZWUoWDUwOV9QS0VZICphKTsKK2ludAkJaTJkX1g1MDlfUEtFWShYNTA5X1BLRVkgKmEsdW5zaWduZWQgY2hhciAqKnBwKTsKK1g1MDlfUEtFWSAqCWQyaV9YNTA5X1BLRVkoWDUwOV9QS0VZICoqYSxjb25zdCB1bnNpZ25lZCBjaGFyICoqcHAsbG9uZyBsZW5ndGgpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE5FVFNDQVBFX1NQS0kpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE5FVFNDQVBFX1NQS0FDKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhORVRTQ0FQRV9DRVJUX1NFUVVFTkNFKQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRVZQCitYNTA5X0lORk8gKglYNTA5X0lORk9fbmV3KHZvaWQpOwordm9pZAkJWDUwOV9JTkZPX2ZyZWUoWDUwOV9JTkZPICphKTsKK2NoYXIgKgkJWDUwOV9OQU1FX29uZWxpbmUoWDUwOV9OQU1FICphLGNoYXIgKmJ1ZixpbnQgc2l6ZSk7CisKK2ludCBBU04xX3ZlcmlmeShpMmRfb2Zfdm9pZCAqaTJkLCBYNTA5X0FMR09SICphbGdvcjEsCisJCUFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlLGNoYXIgKmRhdGEsRVZQX1BLRVkgKnBrZXkpOworCitpbnQgQVNOMV9kaWdlc3QoaTJkX29mX3ZvaWQgKmkyZCxjb25zdCBFVlBfTUQgKnR5cGUsY2hhciAqZGF0YSwKKwkJdW5zaWduZWQgY2hhciAqbWQsdW5zaWduZWQgaW50ICpsZW4pOworCitpbnQgQVNOMV9zaWduKGkyZF9vZl92b2lkICppMmQsIFg1MDlfQUxHT1IgKmFsZ29yMSwKKwkgICAgICBYNTA5X0FMR09SICphbGdvcjIsIEFTTjFfQklUX1NUUklORyAqc2lnbmF0dXJlLAorCSAgICAgIGNoYXIgKmRhdGEsRVZQX1BLRVkgKnBrZXksIGNvbnN0IEVWUF9NRCAqdHlwZSk7CisKK2ludCBBU04xX2l0ZW1fZGlnZXN0KGNvbnN0IEFTTjFfSVRFTSAqaXQsY29uc3QgRVZQX01EICp0eXBlLHZvaWQgKmRhdGEsCisJdW5zaWduZWQgY2hhciAqbWQsdW5zaWduZWQgaW50ICpsZW4pOworCitpbnQgQVNOMV9pdGVtX3ZlcmlmeShjb25zdCBBU04xX0lURU0gKml0LCBYNTA5X0FMR09SICphbGdvcjEsCisJQVNOMV9CSVRfU1RSSU5HICpzaWduYXR1cmUsdm9pZCAqZGF0YSxFVlBfUEtFWSAqcGtleSk7CisKK2ludCBBU04xX2l0ZW1fc2lnbihjb25zdCBBU04xX0lURU0gKml0LCBYNTA5X0FMR09SICphbGdvcjEsIFg1MDlfQUxHT1IgKmFsZ29yMiwKKwlBU04xX0JJVF9TVFJJTkcgKnNpZ25hdHVyZSwKKwl2b2lkICpkYXRhLCBFVlBfUEtFWSAqcGtleSwgY29uc3QgRVZQX01EICp0eXBlKTsKKyNlbmRpZgorCitpbnQgCQlYNTA5X3NldF92ZXJzaW9uKFg1MDkgKngsbG9uZyB2ZXJzaW9uKTsKK2ludCAJCVg1MDlfc2V0X3NlcmlhbE51bWJlcihYNTA5ICp4LCBBU04xX0lOVEVHRVIgKnNlcmlhbCk7CitBU04xX0lOVEVHRVIgKglYNTA5X2dldF9zZXJpYWxOdW1iZXIoWDUwOSAqeCk7CitpbnQgCQlYNTA5X3NldF9pc3N1ZXJfbmFtZShYNTA5ICp4LCBYNTA5X05BTUUgKm5hbWUpOworWDUwOV9OQU1FICoJWDUwOV9nZXRfaXNzdWVyX25hbWUoWDUwOSAqYSk7CitpbnQgCQlYNTA5X3NldF9zdWJqZWN0X25hbWUoWDUwOSAqeCwgWDUwOV9OQU1FICpuYW1lKTsKK1g1MDlfTkFNRSAqCVg1MDlfZ2V0X3N1YmplY3RfbmFtZShYNTA5ICphKTsKK2ludCAJCVg1MDlfc2V0X25vdEJlZm9yZShYNTA5ICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKTsKK2ludCAJCVg1MDlfc2V0X25vdEFmdGVyKFg1MDkgKngsIGNvbnN0IEFTTjFfVElNRSAqdG0pOworaW50IAkJWDUwOV9zZXRfcHVia2V5KFg1MDkgKngsIEVWUF9QS0VZICpwa2V5KTsKK0VWUF9QS0VZICoJWDUwOV9nZXRfcHVia2V5KFg1MDkgKngpOworQVNOMV9CSVRfU1RSSU5HICogWDUwOV9nZXQwX3B1YmtleV9iaXRzdHIoY29uc3QgWDUwOSAqeCk7CitpbnQJCVg1MDlfY2VydGlmaWNhdGVfdHlwZShYNTA5ICp4LEVWUF9QS0VZICpwdWJrZXkgLyogb3B0aW9uYWwgKi8pOworCitpbnQJCVg1MDlfUkVRX3NldF92ZXJzaW9uKFg1MDlfUkVRICp4LGxvbmcgdmVyc2lvbik7CitpbnQJCVg1MDlfUkVRX3NldF9zdWJqZWN0X25hbWUoWDUwOV9SRVEgKnJlcSxYNTA5X05BTUUgKm5hbWUpOworaW50CQlYNTA5X1JFUV9zZXRfcHVia2V5KFg1MDlfUkVRICp4LCBFVlBfUEtFWSAqcGtleSk7CitFVlBfUEtFWSAqCVg1MDlfUkVRX2dldF9wdWJrZXkoWDUwOV9SRVEgKnJlcSk7CitpbnQJCVg1MDlfUkVRX2V4dGVuc2lvbl9uaWQoaW50IG5pZCk7CitpbnQgKgkJWDUwOV9SRVFfZ2V0X2V4dGVuc2lvbl9uaWRzKHZvaWQpOwordm9pZAkJWDUwOV9SRVFfc2V0X2V4dGVuc2lvbl9uaWRzKGludCAqbmlkcyk7CitTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKlg1MDlfUkVRX2dldF9leHRlbnNpb25zKFg1MDlfUkVRICpyZXEpOworaW50IFg1MDlfUkVRX2FkZF9leHRlbnNpb25zX25pZChYNTA5X1JFUSAqcmVxLCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKmV4dHMsCisJCQkJaW50IG5pZCk7CitpbnQgWDUwOV9SRVFfYWRkX2V4dGVuc2lvbnMoWDUwOV9SRVEgKnJlcSwgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICpleHRzKTsKK2ludCBYNTA5X1JFUV9nZXRfYXR0cl9jb3VudChjb25zdCBYNTA5X1JFUSAqcmVxKTsKK2ludCBYNTA5X1JFUV9nZXRfYXR0cl9ieV9OSUQoY29uc3QgWDUwOV9SRVEgKnJlcSwgaW50IG5pZCwKKwkJCSAgaW50IGxhc3Rwb3MpOworaW50IFg1MDlfUkVRX2dldF9hdHRyX2J5X09CSihjb25zdCBYNTA5X1JFUSAqcmVxLCBBU04xX09CSkVDVCAqb2JqLAorCQkJICBpbnQgbGFzdHBvcyk7CitYNTA5X0FUVFJJQlVURSAqWDUwOV9SRVFfZ2V0X2F0dHIoY29uc3QgWDUwOV9SRVEgKnJlcSwgaW50IGxvYyk7CitYNTA5X0FUVFJJQlVURSAqWDUwOV9SRVFfZGVsZXRlX2F0dHIoWDUwOV9SRVEgKnJlcSwgaW50IGxvYyk7CitpbnQgWDUwOV9SRVFfYWRkMV9hdHRyKFg1MDlfUkVRICpyZXEsIFg1MDlfQVRUUklCVVRFICphdHRyKTsKK2ludCBYNTA5X1JFUV9hZGQxX2F0dHJfYnlfT0JKKFg1MDlfUkVRICpyZXEsCisJCQljb25zdCBBU04xX09CSkVDVCAqb2JqLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK2ludCBYNTA5X1JFUV9hZGQxX2F0dHJfYnlfTklEKFg1MDlfUkVRICpyZXEsCisJCQlpbnQgbmlkLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK2ludCBYNTA5X1JFUV9hZGQxX2F0dHJfYnlfdHh0KFg1MDlfUkVRICpyZXEsCisJCQljb25zdCBjaGFyICphdHRybmFtZSwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CisKK2ludCBYNTA5X0NSTF9zZXRfdmVyc2lvbihYNTA5X0NSTCAqeCwgbG9uZyB2ZXJzaW9uKTsKK2ludCBYNTA5X0NSTF9zZXRfaXNzdWVyX25hbWUoWDUwOV9DUkwgKngsIFg1MDlfTkFNRSAqbmFtZSk7CitpbnQgWDUwOV9DUkxfc2V0X2xhc3RVcGRhdGUoWDUwOV9DUkwgKngsIGNvbnN0IEFTTjFfVElNRSAqdG0pOworaW50IFg1MDlfQ1JMX3NldF9uZXh0VXBkYXRlKFg1MDlfQ1JMICp4LCBjb25zdCBBU04xX1RJTUUgKnRtKTsKK2ludCBYNTA5X0NSTF9zb3J0KFg1MDlfQ1JMICpjcmwpOworCitpbnQgWDUwOV9SRVZPS0VEX3NldF9zZXJpYWxOdW1iZXIoWDUwOV9SRVZPS0VEICp4LCBBU04xX0lOVEVHRVIgKnNlcmlhbCk7CitpbnQgWDUwOV9SRVZPS0VEX3NldF9yZXZvY2F0aW9uRGF0ZShYNTA5X1JFVk9LRUQgKnIsIEFTTjFfVElNRSAqdG0pOworCitpbnQJCVg1MDlfUkVRX2NoZWNrX3ByaXZhdGVfa2V5KFg1MDlfUkVRICp4NTA5LEVWUF9QS0VZICpwa2V5KTsKKworaW50CQlYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KFg1MDkgKng1MDksRVZQX1BLRVkgKnBrZXkpOworCitpbnQJCVg1MDlfaXNzdWVyX2FuZF9zZXJpYWxfY21wKGNvbnN0IFg1MDkgKmEsIGNvbnN0IFg1MDkgKmIpOwordW5zaWduZWQgbG9uZwlYNTA5X2lzc3Vlcl9hbmRfc2VyaWFsX2hhc2goWDUwOSAqYSk7CisKK2ludAkJWDUwOV9pc3N1ZXJfbmFtZV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYik7Cit1bnNpZ25lZCBsb25nCVg1MDlfaXNzdWVyX25hbWVfaGFzaChYNTA5ICphKTsKKworaW50CQlYNTA5X3N1YmplY3RfbmFtZV9jbXAoY29uc3QgWDUwOSAqYSwgY29uc3QgWDUwOSAqYik7Cit1bnNpZ25lZCBsb25nCVg1MDlfc3ViamVjdF9uYW1lX2hhc2goWDUwOSAqeCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19NRDUKK3Vuc2lnbmVkIGxvbmcJWDUwOV9pc3N1ZXJfbmFtZV9oYXNoX29sZChYNTA5ICphKTsKK3Vuc2lnbmVkIGxvbmcJWDUwOV9zdWJqZWN0X25hbWVfaGFzaF9vbGQoWDUwOSAqeCk7CisjZW5kaWYKKworaW50CQlYNTA5X2NtcChjb25zdCBYNTA5ICphLCBjb25zdCBYNTA5ICpiKTsKK2ludAkJWDUwOV9OQU1FX2NtcChjb25zdCBYNTA5X05BTUUgKmEsIGNvbnN0IFg1MDlfTkFNRSAqYik7Cit1bnNpZ25lZCBsb25nCVg1MDlfTkFNRV9oYXNoKFg1MDlfTkFNRSAqeCk7Cit1bnNpZ25lZCBsb25nCVg1MDlfTkFNRV9oYXNoX29sZChYNTA5X05BTUUgKngpOworCitpbnQJCVg1MDlfQ1JMX2NtcChjb25zdCBYNTA5X0NSTCAqYSwgY29uc3QgWDUwOV9DUkwgKmIpOworaW50CQlYNTA5X0NSTF9tYXRjaChjb25zdCBYNTA5X0NSTCAqYSwgY29uc3QgWDUwOV9DUkwgKmIpOworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50CQlYNTA5X3ByaW50X2V4X2ZwKEZJTEUgKmJwLFg1MDkgKngsIHVuc2lnbmVkIGxvbmcgbm1mbGFnLCB1bnNpZ25lZCBsb25nIGNmbGFnKTsKK2ludAkJWDUwOV9wcmludF9mcChGSUxFICpicCxYNTA5ICp4KTsKK2ludAkJWDUwOV9DUkxfcHJpbnRfZnAoRklMRSAqYnAsWDUwOV9DUkwgKngpOworaW50CQlYNTA5X1JFUV9wcmludF9mcChGSUxFICpicCxYNTA5X1JFUSAqcmVxKTsKK2ludCBYNTA5X05BTUVfcHJpbnRfZXhfZnAoRklMRSAqZnAsIFg1MDlfTkFNRSAqbm0sIGludCBpbmRlbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludAkJWDUwOV9OQU1FX3ByaW50KEJJTyAqYnAsIFg1MDlfTkFNRSAqbmFtZSwgaW50IG9iYXNlKTsKK2ludCBYNTA5X05BTUVfcHJpbnRfZXgoQklPICpvdXQsIFg1MDlfTkFNRSAqbm0sIGludCBpbmRlbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50CQlYNTA5X3ByaW50X2V4KEJJTyAqYnAsWDUwOSAqeCwgdW5zaWduZWQgbG9uZyBubWZsYWcsIHVuc2lnbmVkIGxvbmcgY2ZsYWcpOworaW50CQlYNTA5X3ByaW50KEJJTyAqYnAsWDUwOSAqeCk7CitpbnQJCVg1MDlfb2NzcGlkX3ByaW50KEJJTyAqYnAsWDUwOSAqeCk7CitpbnQJCVg1MDlfQ0VSVF9BVVhfcHJpbnQoQklPICpicCxYNTA5X0NFUlRfQVVYICp4LCBpbnQgaW5kZW50KTsKK2ludAkJWDUwOV9DUkxfcHJpbnQoQklPICpicCxYNTA5X0NSTCAqeCk7CitpbnQJCVg1MDlfUkVRX3ByaW50X2V4KEJJTyAqYnAsIFg1MDlfUkVRICp4LCB1bnNpZ25lZCBsb25nIG5tZmxhZywgdW5zaWduZWQgbG9uZyBjZmxhZyk7CitpbnQJCVg1MDlfUkVRX3ByaW50KEJJTyAqYnAsWDUwOV9SRVEgKnJlcSk7CisjZW5kaWYKKworaW50IAkJWDUwOV9OQU1FX2VudHJ5X2NvdW50KFg1MDlfTkFNRSAqbmFtZSk7CitpbnQgCQlYNTA5X05BTUVfZ2V0X3RleHRfYnlfTklEKFg1MDlfTkFNRSAqbmFtZSwgaW50IG5pZCwKKwkJCWNoYXIgKmJ1ZixpbnQgbGVuKTsKK2ludAkJWDUwOV9OQU1FX2dldF90ZXh0X2J5X09CSihYNTA5X05BTUUgKm5hbWUsIEFTTjFfT0JKRUNUICpvYmosCisJCQljaGFyICpidWYsaW50IGxlbik7CisKKy8qIE5PVEU6IHlvdSBzaG91bGQgYmUgcGFzc3NpbmcgLTEsIG5vdCAwIGFzIGxhc3Rwb3MuICBUaGUgZnVuY3Rpb25zIHRoYXQgdXNlCisgKiBsYXN0cG9zLCBzZWFyY2ggYWZ0ZXIgdGhhdCBwb3NpdGlvbiBvbi4gKi8KK2ludCAJCVg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfTklEKFg1MDlfTkFNRSAqbmFtZSxpbnQgbmlkLGludCBsYXN0cG9zKTsKK2ludCAJCVg1MDlfTkFNRV9nZXRfaW5kZXhfYnlfT0JKKFg1MDlfTkFNRSAqbmFtZSxBU04xX09CSkVDVCAqb2JqLAorCQkJaW50IGxhc3Rwb3MpOworWDUwOV9OQU1FX0VOVFJZICpYNTA5X05BTUVfZ2V0X2VudHJ5KFg1MDlfTkFNRSAqbmFtZSwgaW50IGxvYyk7CitYNTA5X05BTUVfRU5UUlkgKlg1MDlfTkFNRV9kZWxldGVfZW50cnkoWDUwOV9OQU1FICpuYW1lLCBpbnQgbG9jKTsKK2ludCAJCVg1MDlfTkFNRV9hZGRfZW50cnkoWDUwOV9OQU1FICpuYW1lLFg1MDlfTkFNRV9FTlRSWSAqbmUsCisJCQlpbnQgbG9jLCBpbnQgc2V0KTsKK2ludCBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X09CSihYNTA5X05BTUUgKm5hbWUsIEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLAorCQkJdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4sIGludCBsb2MsIGludCBzZXQpOworaW50IFg1MDlfTkFNRV9hZGRfZW50cnlfYnlfTklEKFg1MDlfTkFNRSAqbmFtZSwgaW50IG5pZCwgaW50IHR5cGUsCisJCQl1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbiwgaW50IGxvYywgaW50IHNldCk7CitYNTA5X05BTUVfRU5UUlkgKlg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfdHh0KFg1MDlfTkFNRV9FTlRSWSAqKm5lLAorCQljb25zdCBjaGFyICpmaWVsZCwgaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK1g1MDlfTkFNRV9FTlRSWSAqWDUwOV9OQU1FX0VOVFJZX2NyZWF0ZV9ieV9OSUQoWDUwOV9OQU1FX0VOVFJZICoqbmUsIGludCBuaWQsCisJCQlpbnQgdHlwZSx1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitpbnQgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQoWDUwOV9OQU1FICpuYW1lLCBjb25zdCBjaGFyICpmaWVsZCwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbiwgaW50IGxvYywgaW50IHNldCk7CitYNTA5X05BTUVfRU5UUlkgKlg1MDlfTkFNRV9FTlRSWV9jcmVhdGVfYnlfT0JKKFg1MDlfTkFNRV9FTlRSWSAqKm5lLAorCQkJQVNOMV9PQkpFQ1QgKm9iaiwgaW50IHR5cGUsY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsCisJCQlpbnQgbGVuKTsKK2ludCAJCVg1MDlfTkFNRV9FTlRSWV9zZXRfb2JqZWN0KFg1MDlfTkFNRV9FTlRSWSAqbmUsCisJCQlBU04xX09CSkVDVCAqb2JqKTsKK2ludCAJCVg1MDlfTkFNRV9FTlRSWV9zZXRfZGF0YShYNTA5X05BTUVfRU5UUlkgKm5lLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK0FTTjFfT0JKRUNUICoJWDUwOV9OQU1FX0VOVFJZX2dldF9vYmplY3QoWDUwOV9OQU1FX0VOVFJZICpuZSk7CitBU04xX1NUUklORyAqCVg1MDlfTkFNRV9FTlRSWV9nZXRfZGF0YShYNTA5X05BTUVfRU5UUlkgKm5lKTsKKworaW50CQlYNTA5djNfZ2V0X2V4dF9jb3VudChjb25zdCBTVEFDS19PRihYNTA5X0VYVEVOU0lPTikgKngpOworaW50CQlYNTA5djNfZ2V0X2V4dF9ieV9OSUQoY29uc3QgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4LAorCQkJCSAgICAgIGludCBuaWQsIGludCBsYXN0cG9zKTsKK2ludAkJWDUwOXYzX2dldF9leHRfYnlfT0JKKGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwKKwkJCQkgICAgICBBU04xX09CSkVDVCAqb2JqLGludCBsYXN0cG9zKTsKK2ludAkJWDUwOXYzX2dldF9leHRfYnlfY3JpdGljYWwoY29uc3QgU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4LAorCQkJCQkgICBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpOworWDUwOV9FWFRFTlNJT04gKlg1MDl2M19nZXRfZXh0KGNvbnN0IFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwgaW50IGxvYyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOXYzX2RlbGV0ZV9leHQoU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICp4LCBpbnQgbG9jKTsKK1NUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqWDUwOXYzX2FkZF9leHQoU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICoqeCwKKwkJCQkJIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7CisKK2ludAkJWDUwOV9nZXRfZXh0X2NvdW50KFg1MDkgKngpOworaW50CQlYNTA5X2dldF9leHRfYnlfTklEKFg1MDkgKngsIGludCBuaWQsIGludCBsYXN0cG9zKTsKK2ludAkJWDUwOV9nZXRfZXh0X2J5X09CSihYNTA5ICp4LEFTTjFfT0JKRUNUICpvYmosaW50IGxhc3Rwb3MpOworaW50CQlYNTA5X2dldF9leHRfYnlfY3JpdGljYWwoWDUwOSAqeCwgaW50IGNyaXQsIGludCBsYXN0cG9zKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5X2dldF9leHQoWDUwOSAqeCwgaW50IGxvYyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9kZWxldGVfZXh0KFg1MDkgKngsIGludCBsb2MpOworaW50CQlYNTA5X2FkZF9leHQoWDUwOSAqeCwgWDUwOV9FWFRFTlNJT04gKmV4LCBpbnQgbG9jKTsKK3ZvaWQJKglYNTA5X2dldF9leHRfZDJpKFg1MDkgKngsIGludCBuaWQsIGludCAqY3JpdCwgaW50ICppZHgpOworaW50CQlYNTA5X2FkZDFfZXh0X2kyZChYNTA5ICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK2ludAkJWDUwOV9DUkxfZ2V0X2V4dF9jb3VudChYNTA5X0NSTCAqeCk7CitpbnQJCVg1MDlfQ1JMX2dldF9leHRfYnlfTklEKFg1MDlfQ1JMICp4LCBpbnQgbmlkLCBpbnQgbGFzdHBvcyk7CitpbnQJCVg1MDlfQ1JMX2dldF9leHRfYnlfT0JKKFg1MDlfQ1JMICp4LEFTTjFfT0JKRUNUICpvYmosaW50IGxhc3Rwb3MpOworaW50CQlYNTA5X0NSTF9nZXRfZXh0X2J5X2NyaXRpY2FsKFg1MDlfQ1JMICp4LCBpbnQgY3JpdCwgaW50IGxhc3Rwb3MpOworWDUwOV9FWFRFTlNJT04gKlg1MDlfQ1JMX2dldF9leHQoWDUwOV9DUkwgKngsIGludCBsb2MpOworWDUwOV9FWFRFTlNJT04gKlg1MDlfQ1JMX2RlbGV0ZV9leHQoWDUwOV9DUkwgKngsIGludCBsb2MpOworaW50CQlYNTA5X0NSTF9hZGRfZXh0KFg1MDlfQ1JMICp4LCBYNTA5X0VYVEVOU0lPTiAqZXgsIGludCBsb2MpOwordm9pZAkqCVg1MDlfQ1JMX2dldF9leHRfZDJpKFg1MDlfQ1JMICp4LCBpbnQgbmlkLCBpbnQgKmNyaXQsIGludCAqaWR4KTsKK2ludAkJWDUwOV9DUkxfYWRkMV9leHRfaTJkKFg1MDlfQ1JMICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK2ludAkJWDUwOV9SRVZPS0VEX2dldF9leHRfY291bnQoWDUwOV9SRVZPS0VEICp4KTsKK2ludAkJWDUwOV9SRVZPS0VEX2dldF9leHRfYnlfTklEKFg1MDlfUkVWT0tFRCAqeCwgaW50IG5pZCwgaW50IGxhc3Rwb3MpOworaW50CQlYNTA5X1JFVk9LRURfZ2V0X2V4dF9ieV9PQkooWDUwOV9SRVZPS0VEICp4LEFTTjFfT0JKRUNUICpvYmosaW50IGxhc3Rwb3MpOworaW50CQlYNTA5X1JFVk9LRURfZ2V0X2V4dF9ieV9jcml0aWNhbChYNTA5X1JFVk9LRUQgKngsIGludCBjcml0LCBpbnQgbGFzdHBvcyk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOV9SRVZPS0VEX2dldF9leHQoWDUwOV9SRVZPS0VEICp4LCBpbnQgbG9jKTsKK1g1MDlfRVhURU5TSU9OICpYNTA5X1JFVk9LRURfZGVsZXRlX2V4dChYNTA5X1JFVk9LRUQgKngsIGludCBsb2MpOworaW50CQlYNTA5X1JFVk9LRURfYWRkX2V4dChYNTA5X1JFVk9LRUQgKngsIFg1MDlfRVhURU5TSU9OICpleCwgaW50IGxvYyk7Cit2b2lkCSoJWDUwOV9SRVZPS0VEX2dldF9leHRfZDJpKFg1MDlfUkVWT0tFRCAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CitpbnQJCVg1MDlfUkVWT0tFRF9hZGQxX2V4dF9pMmQoWDUwOV9SRVZPS0VEICp4LCBpbnQgbmlkLCB2b2lkICp2YWx1ZSwgaW50IGNyaXQsCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK1g1MDlfRVhURU5TSU9OICpYNTA5X0VYVEVOU0lPTl9jcmVhdGVfYnlfTklEKFg1MDlfRVhURU5TSU9OICoqZXgsCisJCQlpbnQgbmlkLCBpbnQgY3JpdCwgQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGEpOworWDUwOV9FWFRFTlNJT04gKlg1MDlfRVhURU5TSU9OX2NyZWF0ZV9ieV9PQkooWDUwOV9FWFRFTlNJT04gKipleCwKKwkJCUFTTjFfT0JKRUNUICpvYmosaW50IGNyaXQsQVNOMV9PQ1RFVF9TVFJJTkcgKmRhdGEpOworaW50CQlYNTA5X0VYVEVOU0lPTl9zZXRfb2JqZWN0KFg1MDlfRVhURU5TSU9OICpleCxBU04xX09CSkVDVCAqb2JqKTsKK2ludAkJWDUwOV9FWFRFTlNJT05fc2V0X2NyaXRpY2FsKFg1MDlfRVhURU5TSU9OICpleCwgaW50IGNyaXQpOworaW50CQlYNTA5X0VYVEVOU0lPTl9zZXRfZGF0YShYNTA5X0VYVEVOU0lPTiAqZXgsCisJCQlBU04xX09DVEVUX1NUUklORyAqZGF0YSk7CitBU04xX09CSkVDVCAqCVg1MDlfRVhURU5TSU9OX2dldF9vYmplY3QoWDUwOV9FWFRFTlNJT04gKmV4KTsKK0FTTjFfT0NURVRfU1RSSU5HICpYNTA5X0VYVEVOU0lPTl9nZXRfZGF0YShYNTA5X0VYVEVOU0lPTiAqbmUpOworaW50CQlYNTA5X0VYVEVOU0lPTl9nZXRfY3JpdGljYWwoWDUwOV9FWFRFTlNJT04gKmV4KTsKKworaW50IFg1MDlhdF9nZXRfYXR0cl9jb3VudChjb25zdCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngpOworaW50IFg1MDlhdF9nZXRfYXR0cl9ieV9OSUQoY29uc3QgU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICp4LCBpbnQgbmlkLAorCQkJICBpbnQgbGFzdHBvcyk7CitpbnQgWDUwOWF0X2dldF9hdHRyX2J5X09CSihjb25zdCBTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKnNrLCBBU04xX09CSkVDVCAqb2JqLAorCQkJICBpbnQgbGFzdHBvcyk7CitYNTA5X0FUVFJJQlVURSAqWDUwOWF0X2dldF9hdHRyKGNvbnN0IFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqeCwgaW50IGxvYyk7CitYNTA5X0FUVFJJQlVURSAqWDUwOWF0X2RlbGV0ZV9hdHRyKFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqeCwgaW50IGxvYyk7CitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKlg1MDlhdF9hZGQxX2F0dHIoU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICoqeCwKKwkJCQkJIFg1MDlfQVRUUklCVVRFICphdHRyKTsKK1NUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqWDUwOWF0X2FkZDFfYXR0cl9ieV9PQkooU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICoqeCwKKwkJCWNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworU1RBQ0tfT0YoWDUwOV9BVFRSSUJVVEUpICpYNTA5YXRfYWRkMV9hdHRyX2J5X05JRChTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKip4LAorCQkJaW50IG5pZCwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CitTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKlg1MDlhdF9hZGQxX2F0dHJfYnlfdHh0KFNUQUNLX09GKFg1MDlfQVRUUklCVVRFKSAqKngsCisJCQljb25zdCBjaGFyICphdHRybmFtZSwgaW50IHR5cGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7Cit2b2lkICpYNTA5YXRfZ2V0MF9kYXRhX2J5X09CSihTVEFDS19PRihYNTA5X0FUVFJJQlVURSkgKngsCisJCQkJQVNOMV9PQkpFQ1QgKm9iaiwgaW50IGxhc3Rwb3MsIGludCB0eXBlKTsKK1g1MDlfQVRUUklCVVRFICpYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfTklEKFg1MDlfQVRUUklCVVRFICoqYXR0ciwgaW50IG5pZCwKKwkgICAgIGludCBhdHJ0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK1g1MDlfQVRUUklCVVRFICpYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfT0JKKFg1MDlfQVRUUklCVVRFICoqYXR0ciwKKwkgICAgIGNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCBhdHJ0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK1g1MDlfQVRUUklCVVRFICpYNTA5X0FUVFJJQlVURV9jcmVhdGVfYnlfdHh0KFg1MDlfQVRUUklCVVRFICoqYXR0ciwKKwkJY29uc3QgY2hhciAqYXRybmFtZSwgaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKK2ludCBYNTA5X0FUVFJJQlVURV9zZXQxX29iamVjdChYNTA5X0FUVFJJQlVURSAqYXR0ciwgY29uc3QgQVNOMV9PQkpFQ1QgKm9iaik7CitpbnQgWDUwOV9BVFRSSUJVVEVfc2V0MV9kYXRhKFg1MDlfQVRUUklCVVRFICphdHRyLCBpbnQgYXR0cnR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pOwordm9pZCAqWDUwOV9BVFRSSUJVVEVfZ2V0MF9kYXRhKFg1MDlfQVRUUklCVVRFICphdHRyLCBpbnQgaWR4LAorCQkJCQlpbnQgYXRydHlwZSwgdm9pZCAqZGF0YSk7CitpbnQgWDUwOV9BVFRSSUJVVEVfY291bnQoWDUwOV9BVFRSSUJVVEUgKmF0dHIpOworQVNOMV9PQkpFQ1QgKlg1MDlfQVRUUklCVVRFX2dldDBfb2JqZWN0KFg1MDlfQVRUUklCVVRFICphdHRyKTsKK0FTTjFfVFlQRSAqWDUwOV9BVFRSSUJVVEVfZ2V0MF90eXBlKFg1MDlfQVRUUklCVVRFICphdHRyLCBpbnQgaWR4KTsKKworaW50IEVWUF9QS0VZX2dldF9hdHRyX2NvdW50KGNvbnN0IEVWUF9QS0VZICprZXkpOworaW50IEVWUF9QS0VZX2dldF9hdHRyX2J5X05JRChjb25zdCBFVlBfUEtFWSAqa2V5LCBpbnQgbmlkLAorCQkJICBpbnQgbGFzdHBvcyk7CitpbnQgRVZQX1BLRVlfZ2V0X2F0dHJfYnlfT0JKKGNvbnN0IEVWUF9QS0VZICprZXksIEFTTjFfT0JKRUNUICpvYmosCisJCQkgIGludCBsYXN0cG9zKTsKK1g1MDlfQVRUUklCVVRFICpFVlBfUEtFWV9nZXRfYXR0cihjb25zdCBFVlBfUEtFWSAqa2V5LCBpbnQgbG9jKTsKK1g1MDlfQVRUUklCVVRFICpFVlBfUEtFWV9kZWxldGVfYXR0cihFVlBfUEtFWSAqa2V5LCBpbnQgbG9jKTsKK2ludCBFVlBfUEtFWV9hZGQxX2F0dHIoRVZQX1BLRVkgKmtleSwgWDUwOV9BVFRSSUJVVEUgKmF0dHIpOworaW50IEVWUF9QS0VZX2FkZDFfYXR0cl9ieV9PQkooRVZQX1BLRVkgKmtleSwKKwkJCWNvbnN0IEFTTjFfT0JKRUNUICpvYmosIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworaW50IEVWUF9QS0VZX2FkZDFfYXR0cl9ieV9OSUQoRVZQX1BLRVkgKmtleSwKKwkJCWludCBuaWQsIGludCB0eXBlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4pOworaW50IEVWUF9QS0VZX2FkZDFfYXR0cl9ieV90eHQoRVZQX1BLRVkgKmtleSwKKwkJCWNvbnN0IGNoYXIgKmF0dHJuYW1lLCBpbnQgdHlwZSwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzLCBpbnQgbGVuKTsKKworaW50CQlYNTA5X3ZlcmlmeV9jZXJ0KFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCisvKiBsb29rdXAgYSBjZXJ0IGZyb20gYSBYNTA5IFNUQUNLICovCitYNTA5ICpYNTA5X2ZpbmRfYnlfaXNzdWVyX2FuZF9zZXJpYWwoU1RBQ0tfT0YoWDUwOSkgKnNrLFg1MDlfTkFNRSAqbmFtZSwKKwkJCQkgICAgIEFTTjFfSU5URUdFUiAqc2VyaWFsKTsKK1g1MDkgKlg1MDlfZmluZF9ieV9zdWJqZWN0KFNUQUNLX09GKFg1MDkpICpzayxYNTA5X05BTUUgKm5hbWUpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBCRVBBUkFNKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhQQkUyUEFSQU0pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBCS0RGMlBBUkFNKQorCitpbnQgUEtDUzVfcGJlX3NldDBfYWxnb3IoWDUwOV9BTEdPUiAqYWxnb3IsIGludCBhbGcsIGludCBpdGVyLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsIGludCBzYWx0bGVuKTsKKworWDUwOV9BTEdPUiAqUEtDUzVfcGJlX3NldChpbnQgYWxnLCBpbnQgaXRlciwKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LCBpbnQgc2FsdGxlbik7CitYNTA5X0FMR09SICpQS0NTNV9wYmUyX3NldChjb25zdCBFVlBfQ0lQSEVSICpjaXBoZXIsIGludCBpdGVyLAorCQkJCQkgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4pOworWDUwOV9BTEdPUiAqUEtDUzVfcGJlMl9zZXRfaXYoY29uc3QgRVZQX0NJUEhFUiAqY2lwaGVyLCBpbnQgaXRlciwKKwkJCQkgdW5zaWduZWQgY2hhciAqc2FsdCwgaW50IHNhbHRsZW4sCisJCQkJIHVuc2lnbmVkIGNoYXIgKmFpdiwgaW50IHByZl9uaWQpOworCisvKiBQS0NTIzggdXRpbGl0aWVzICovCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUEtDUzhfUFJJVl9LRVlfSU5GTykKKworRVZQX1BLRVkgKkVWUF9QS0NTODJQS0VZKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4KTsKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKkVWUF9QS0VZMlBLQ1M4KEVWUF9QS0VZICpwa2V5KTsKK1BLQ1M4X1BSSVZfS0VZX0lORk8gKkVWUF9QS0VZMlBLQ1M4X2Jyb2tlbihFVlBfUEtFWSAqcGtleSwgaW50IGJyb2tlbik7CitQS0NTOF9QUklWX0tFWV9JTkZPICpQS0NTOF9zZXRfYnJva2VuKFBLQ1M4X1BSSVZfS0VZX0lORk8gKnA4LCBpbnQgYnJva2VuKTsKKworaW50IFBLQ1M4X3BrZXlfc2V0MChQS0NTOF9QUklWX0tFWV9JTkZPICpwcml2LCBBU04xX09CSkVDVCAqYW9iaiwKKwkJCWludCB2ZXJzaW9uLCBpbnQgcHR5cGUsIHZvaWQgKnB2YWwsCisJCQkJdW5zaWduZWQgY2hhciAqcGVuYywgaW50IHBlbmNsZW4pOworaW50IFBLQ1M4X3BrZXlfZ2V0MChBU04xX09CSkVDVCAqKnBwa2FsZywKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqKnBrLCBpbnQgKnBwa2xlbiwKKwkJWDUwOV9BTEdPUiAqKnBhLAorCQlQS0NTOF9QUklWX0tFWV9JTkZPICpwOCk7CisKK2ludCBYNTA5X1BVQktFWV9zZXQwX3BhcmFtKFg1MDlfUFVCS0VZICpwdWIsIEFTTjFfT0JKRUNUICphb2JqLAorCQkJCQlpbnQgcHR5cGUsIHZvaWQgKnB2YWwsCisJCQkJCXVuc2lnbmVkIGNoYXIgKnBlbmMsIGludCBwZW5jbGVuKTsKK2ludCBYNTA5X1BVQktFWV9nZXQwX3BhcmFtKEFTTjFfT0JKRUNUICoqcHBrYWxnLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICoqcGssIGludCAqcHBrbGVuLAorCQlYNTA5X0FMR09SICoqcGEsCisJCVg1MDlfUFVCS0VZICpwdWIpOworCitpbnQgWDUwOV9jaGVja190cnVzdChYNTA5ICp4LCBpbnQgaWQsIGludCBmbGFncyk7CitpbnQgWDUwOV9UUlVTVF9nZXRfY291bnQodm9pZCk7CitYNTA5X1RSVVNUICogWDUwOV9UUlVTVF9nZXQwKGludCBpZHgpOworaW50IFg1MDlfVFJVU1RfZ2V0X2J5X2lkKGludCBpZCk7CitpbnQgWDUwOV9UUlVTVF9hZGQoaW50IGlkLCBpbnQgZmxhZ3MsIGludCAoKmNrKShYNTA5X1RSVVNUICosIFg1MDkgKiwgaW50KSwKKwkJCQkJY2hhciAqbmFtZSwgaW50IGFyZzEsIHZvaWQgKmFyZzIpOwordm9pZCBYNTA5X1RSVVNUX2NsZWFudXAodm9pZCk7CitpbnQgWDUwOV9UUlVTVF9nZXRfZmxhZ3MoWDUwOV9UUlVTVCAqeHApOworY2hhciAqWDUwOV9UUlVTVF9nZXQwX25hbWUoWDUwOV9UUlVTVCAqeHApOworaW50IFg1MDlfVFJVU1RfZ2V0X3RydXN0KFg1MDlfVFJVU1QgKnhwKTsKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9YNTA5X3N0cmluZ3Modm9pZCk7CisKKy8qIEVycm9yIGNvZGVzIGZvciB0aGUgWDUwOSBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBYNTA5X0ZfQUREX0NFUlRfRElSCQkJCSAxMDAKKyNkZWZpbmUgWDUwOV9GX0JZX0ZJTEVfQ1RSTAkJCQkgMTAxCisjZGVmaW5lIFg1MDlfRl9DSEVDS19QT0xJQ1kJCQkJIDE0NQorI2RlZmluZSBYNTA5X0ZfRElSX0NUUkwJCQkJCSAxMDIKKyNkZWZpbmUgWDUwOV9GX0dFVF9DRVJUX0JZX1NVQkpFQ1QJCQkgMTAzCisjZGVmaW5lIFg1MDlfRl9ORVRTQ0FQRV9TUEtJX0I2NF9ERUNPREUJCQkgMTI5CisjZGVmaW5lIFg1MDlfRl9ORVRTQ0FQRV9TUEtJX0I2NF9FTkNPREUJCQkgMTMwCisjZGVmaW5lIFg1MDlfRl9YNTA5QVRfQUREMV9BVFRSCQkJCSAxMzUKKyNkZWZpbmUgWDUwOV9GX1g1MDlWM19BRERfRVhUCQkJCSAxMDQKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX0NSRUFURV9CWV9OSUQJCSAxMzYKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX0NSRUFURV9CWV9PQkoJCSAxMzcKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX0NSRUFURV9CWV9UWFQJCSAxNDAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX0dFVDBfREFUQQkJCSAxMzkKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQVRUUklCVVRFX1NFVDFfREFUQQkJCSAxMzgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfQ0hFQ0tfUFJJVkFURV9LRVkJCQkgMTI4CisjZGVmaW5lIFg1MDlfRl9YNTA5X0NSTF9QUklOVF9GUAkJCSAxNDcKKyNkZWZpbmUgWDUwOV9GX1g1MDlfRVhURU5TSU9OX0NSRUFURV9CWV9OSUQJCSAxMDgKKyNkZWZpbmUgWDUwOV9GX1g1MDlfRVhURU5TSU9OX0NSRUFURV9CWV9PQkoJCSAxMDkKKyNkZWZpbmUgWDUwOV9GX1g1MDlfR0VUX1BVQktFWV9QQVJBTUVURVJTCQkgMTEwCisjZGVmaW5lIFg1MDlfRl9YNTA5X0xPQURfQ0VSVF9DUkxfRklMRQkJCSAxMzIKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTE9BRF9DRVJUX0ZJTEUJCQkgMTExCisjZGVmaW5lIFg1MDlfRl9YNTA5X0xPQURfQ1JMX0ZJTEUJCQkgMTEyCisjZGVmaW5lIFg1MDlfRl9YNTA5X05BTUVfQUREX0VOVFJZCQkJIDExMworI2RlZmluZSBYNTA5X0ZfWDUwOV9OQU1FX0VOVFJZX0NSRUFURV9CWV9OSUQJCSAxMTQKKyNkZWZpbmUgWDUwOV9GX1g1MDlfTkFNRV9FTlRSWV9DUkVBVEVfQllfVFhUCQkgMTMxCisjZGVmaW5lIFg1MDlfRl9YNTA5X05BTUVfRU5UUllfU0VUX09CSkVDVAkJIDExNQorI2RlZmluZSBYNTA5X0ZfWDUwOV9OQU1FX09ORUxJTkUJCQkgMTE2CisjZGVmaW5lIFg1MDlfRl9YNTA5X05BTUVfUFJJTlQJCQkJIDExNworI2RlZmluZSBYNTA5X0ZfWDUwOV9QUklOVF9FWF9GUAkJCQkgMTE4CisjZGVmaW5lIFg1MDlfRl9YNTA5X1BVQktFWV9HRVQJCQkJIDExOQorI2RlZmluZSBYNTA5X0ZfWDUwOV9QVUJLRVlfU0VUCQkJCSAxMjAKKyNkZWZpbmUgWDUwOV9GX1g1MDlfUkVRX0NIRUNLX1BSSVZBVEVfS0VZCQkgMTQ0CisjZGVmaW5lIFg1MDlfRl9YNTA5X1JFUV9QUklOVF9FWAkJCSAxMjEKKyNkZWZpbmUgWDUwOV9GX1g1MDlfUkVRX1BSSU5UX0ZQCQkJIDEyMgorI2RlZmluZSBYNTA5X0ZfWDUwOV9SRVFfVE9fWDUwOQkJCQkgMTIzCisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0FERF9DRVJUCQkJIDEyNAorI2RlZmluZSBYNTA5X0ZfWDUwOV9TVE9SRV9BRERfQ1JMCQkJIDEyNQorI2RlZmluZSBYNTA5X0ZfWDUwOV9TVE9SRV9DVFhfR0VUMV9JU1NVRVIJCSAxNDYKKyNkZWZpbmUgWDUwOV9GX1g1MDlfU1RPUkVfQ1RYX0lOSVQJCQkgMTQzCisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9ORVcJCQkgMTQyCisjZGVmaW5lIFg1MDlfRl9YNTA5X1NUT1JFX0NUWF9QVVJQT1NFX0lOSEVSSVQJCSAxMzQKKyNkZWZpbmUgWDUwOV9GX1g1MDlfVE9fWDUwOV9SRVEJCQkJIDEyNgorI2RlZmluZSBYNTA5X0ZfWDUwOV9UUlVTVF9BREQJCQkJIDEzMworI2RlZmluZSBYNTA5X0ZfWDUwOV9UUlVTVF9TRVQJCQkJIDE0MQorI2RlZmluZSBYNTA5X0ZfWDUwOV9WRVJJRllfQ0VSVAkJCQkgMTI3CisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgWDUwOV9SX0JBRF9YNTA5X0ZJTEVUWVBFCQkJIDEwMAorI2RlZmluZSBYNTA5X1JfQkFTRTY0X0RFQ09ERV9FUlJPUgkJCSAxMTgKKyNkZWZpbmUgWDUwOV9SX0NBTlRfQ0hFQ0tfREhfS0VZCQkJIDExNAorI2RlZmluZSBYNTA5X1JfQ0VSVF9BTFJFQURZX0lOX0hBU0hfVEFCTEUJCSAxMDEKKyNkZWZpbmUgWDUwOV9SX0VSUl9BU04xX0xJQgkJCQkgMTAyCisjZGVmaW5lIFg1MDlfUl9JTlZBTElEX0RJUkVDVE9SWQkJCSAxMTMKKyNkZWZpbmUgWDUwOV9SX0lOVkFMSURfRklFTERfTkFNRQkJCSAxMTkKKyNkZWZpbmUgWDUwOV9SX0lOVkFMSURfVFJVU1QJCQkJIDEyMworI2RlZmluZSBYNTA5X1JfS0VZX1RZUEVfTUlTTUFUQ0gJCQkgMTE1CisjZGVmaW5lIFg1MDlfUl9LRVlfVkFMVUVTX01JU01BVENICQkJIDExNgorI2RlZmluZSBYNTA5X1JfTE9BRElOR19DRVJUX0RJUgkJCQkgMTAzCisjZGVmaW5lIFg1MDlfUl9MT0FESU5HX0RFRkFVTFRTCQkJCSAxMDQKKyNkZWZpbmUgWDUwOV9SX01FVEhPRF9OT1RfU1VQUE9SVEVECQkJIDEyNAorI2RlZmluZSBYNTA5X1JfTk9fQ0VSVF9TRVRfRk9SX1VTX1RPX1ZFUklGWQkJIDEwNQorI2RlZmluZSBYNTA5X1JfUFVCTElDX0tFWV9ERUNPREVfRVJST1IJCQkgMTI1CisjZGVmaW5lIFg1MDlfUl9QVUJMSUNfS0VZX0VOQ09ERV9FUlJPUgkJCSAxMjYKKyNkZWZpbmUgWDUwOV9SX1NIT1VMRF9SRVRSWQkJCQkgMTA2CisjZGVmaW5lIFg1MDlfUl9VTkFCTEVfVE9fRklORF9QQVJBTUVURVJTX0lOX0NIQUlOCSAxMDcKKyNkZWZpbmUgWDUwOV9SX1VOQUJMRV9UT19HRVRfQ0VSVFNfUFVCTElDX0tFWQkJIDEwOAorI2RlZmluZSBYNTA5X1JfVU5LTk9XTl9LRVlfVFlQRQkJCQkgMTE3CisjZGVmaW5lIFg1MDlfUl9VTktOT1dOX05JRAkJCQkgMTA5CisjZGVmaW5lIFg1MDlfUl9VTktOT1dOX1BVUlBPU0VfSUQJCQkgMTIxCisjZGVmaW5lIFg1MDlfUl9VTktOT1dOX1RSVVNUX0lECQkJCSAxMjAKKyNkZWZpbmUgWDUwOV9SX1VOU1VQUE9SVEVEX0FMR09SSVRITQkJCSAxMTEKKyNkZWZpbmUgWDUwOV9SX1dST05HX0xPT0tVUF9UWVBFCQkJIDExMgorI2RlZmluZSBYNTA5X1JfV1JPTkdfVFlQRQkJCQkgMTIyCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDliMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaApAQCAtMCwwICsxLDU2NyBAQAorLyogY3J5cHRvL3g1MDkveDUwOV92ZnkuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaWZuZGVmIEhFQURFUl9YNTA5X0gKKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKy8qIG9wZW5zc2wveDUwOS5oIGVuZHMgdXAgI2luY2x1ZGUtaW5nIHRoaXMgZmlsZSBhdCBhYm91dCB0aGUgb25seQorICogYXBwcm9wcmlhdGUgbW9tZW50LiAqLworI2VuZGlmCisKKyNpZm5kZWYgSEVBREVSX1g1MDlfVkZZX0gKKyNkZWZpbmUgSEVBREVSX1g1MDlfVkZZX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19MSEFTSAorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N5bWhhY2tzLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiAwCisvKiBPdXRlciBvYmplY3QgKi8KK3R5cGVkZWYgc3RydWN0IHg1MDlfaGFzaF9kaXJfc3QKKwl7CisJaW50IG51bV9kaXJzOworCWNoYXIgKipkaXJzOworCWludCAqZGlyc190eXBlOworCWludCBudW1fZGlyc19hbGxvY2VkOworCX0gWDUwOV9IQVNIX0RJUl9DVFg7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9maWxlX3N0CisJeworCWludCBudW1fcGF0aHM7CS8qIG51bWJlciBvZiBwYXRocyB0byBmaWxlcyBvciBkaXJlY3RvcmllcyAqLworCWludCBudW1fYWxsb2NlZDsKKwljaGFyICoqcGF0aHM7CS8qIHRoZSBsaXN0IG9mIHBhdGhzIG9yIGRpcmVjdG9yaWVzICovCisJaW50ICpwYXRoX3R5cGU7CisJfSBYNTA5X0NFUlRfRklMRV9DVFg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKK1NTTF9DVFggLT4gWDUwOV9TVE9SRSAgICAKKwkJLT4gWDUwOV9MT09LVVAKKwkJCS0+WDUwOV9MT09LVVBfTUVUSE9ECisJCS0+IFg1MDlfTE9PS1VQCisJCQktPlg1MDlfTE9PS1VQX01FVEhPRAorIAorU1NMCS0+IFg1MDlfU1RPUkVfQ1RYCisJCS0+WDUwOV9TVE9SRSAgICAKKworVGhlIFg1MDlfU1RPUkUgaG9sZHMgdGhlIHRhYmxlcyBldGMgZm9yIHZlcmlmaWNhdGlvbiBzdHVmZi4KK0EgWDUwOV9TVE9SRV9DVFggaXMgdXNlZCB3aGlsZSB2YWxpZGF0aW5nIGEgc2luZ2xlIGNlcnRpZmljYXRlLgorVGhlIFg1MDlfU1RPUkUgaGFzIFg1MDlfTE9PS1VQcyBmb3IgbG9va2luZyB1cCBjZXJ0cy4KK1RoZSBYNTA5X1NUT1JFIHRoZW4gY2FsbHMgYSBmdW5jdGlvbiB0byBhY3R1YWxseSB2ZXJpZnkgdGhlCitjZXJ0aWZpY2F0ZSBjaGFpbi4KKyovCisKKyNkZWZpbmUgWDUwOV9MVV9SRVRSWQkJLTEKKyNkZWZpbmUgWDUwOV9MVV9GQUlMCQkwCisjZGVmaW5lIFg1MDlfTFVfWDUwOQkJMQorI2RlZmluZSBYNTA5X0xVX0NSTAkJMgorI2RlZmluZSBYNTA5X0xVX1BLRVkJCTMKKwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9vYmplY3Rfc3QKKwl7CisJLyogb25lIG9mIHRoZSBhYm92ZSB0eXBlcyAqLworCWludCB0eXBlOworCXVuaW9uCXsKKwkJY2hhciAqcHRyOworCQlYNTA5ICp4NTA5OworCQlYNTA5X0NSTCAqY3JsOworCQlFVlBfUEtFWSAqcGtleTsKKwkJfSBkYXRhOworCX0gWDUwOV9PQkpFQ1Q7CisKK3R5cGVkZWYgc3RydWN0IHg1MDlfbG9va3VwX3N0IFg1MDlfTE9PS1VQOworCitERUNMQVJFX1NUQUNLX09GKFg1MDlfTE9PS1VQKQorREVDTEFSRV9TVEFDS19PRihYNTA5X09CSkVDVCkKKworLyogVGhpcyBpcyBhIHN0YXRpYyB0aGF0IGRlZmluZXMgdGhlIGZ1bmN0aW9uIGludGVyZmFjZSAqLwordHlwZWRlZiBzdHJ1Y3QgeDUwOV9sb29rdXBfbWV0aG9kX3N0CisJeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqbmV3X2l0ZW0pKFg1MDlfTE9PS1VQICpjdHgpOworCXZvaWQgKCpmcmVlKShYNTA5X0xPT0tVUCAqY3R4KTsKKwlpbnQgKCppbml0KShYNTA5X0xPT0tVUCAqY3R4KTsKKwlpbnQgKCpzaHV0ZG93bikoWDUwOV9MT09LVVAgKmN0eCk7CisJaW50ICgqY3RybCkoWDUwOV9MT09LVVAgKmN0eCxpbnQgY21kLGNvbnN0IGNoYXIgKmFyZ2MsbG9uZyBhcmdsLAorCQkJY2hhciAqKnJldCk7CisJaW50ICgqZ2V0X2J5X3N1YmplY3QpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsWDUwOV9OQU1FICpuYW1lLAorCQkJICAgICAgWDUwOV9PQkpFQ1QgKnJldCk7CisJaW50ICgqZ2V0X2J5X2lzc3Vlcl9zZXJpYWwpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsWDUwOV9OQU1FICpuYW1lLAorCQkJCSAgICBBU04xX0lOVEVHRVIgKnNlcmlhbCxYNTA5X09CSkVDVCAqcmV0KTsKKwlpbnQgKCpnZXRfYnlfZmluZ2VycHJpbnQpKFg1MDlfTE9PS1VQICpjdHgsaW50IHR5cGUsCisJCQkJICB1bnNpZ25lZCBjaGFyICpieXRlcyxpbnQgbGVuLAorCQkJCSAgWDUwOV9PQkpFQ1QgKnJldCk7CisJaW50ICgqZ2V0X2J5X2FsaWFzKShYNTA5X0xPT0tVUCAqY3R4LGludCB0eXBlLGNoYXIgKnN0cixpbnQgbGVuLAorCQkJICAgIFg1MDlfT0JKRUNUICpyZXQpOworCX0gWDUwOV9MT09LVVBfTUVUSE9EOworCisvKiBUaGlzIHN0cnVjdHVyZSBob2xkIGFsbCBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCBhIHZlcmlmeSBvcGVyYXRpb24KKyAqIGJ5IGluY2x1ZGluZyBhbiBYNTA5X1ZFUklGWV9QQVJBTSBzdHJ1Y3R1cmUgaW4gcmVsYXRlZCBzdHJ1Y3R1cmVzIHRoZQorICogcGFyYW1ldGVycyB1c2VkIGNhbiBiZSBjdXN0b21pemVkCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgWDUwOV9WRVJJRllfUEFSQU1fc3QKKwl7CisJY2hhciAqbmFtZTsKKwl0aW1lX3QgY2hlY2tfdGltZTsJLyogVGltZSB0byB1c2UgKi8KKwl1bnNpZ25lZCBsb25nIGluaF9mbGFnczsgLyogSW5oZXJpdGFuY2UgZmxhZ3MgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBWYXJpb3VzIHZlcmlmeSBmbGFncyAqLworCWludCBwdXJwb3NlOwkJLyogcHVycG9zZSB0byBjaGVjayB1bnRydXN0ZWQgY2VydGlmaWNhdGVzICovCisJaW50IHRydXN0OwkJLyogdHJ1c3Qgc2V0dGluZyB0byBjaGVjayAqLworCWludCBkZXB0aDsJCS8qIFZlcmlmeSBkZXB0aCAqLworCVNUQUNLX09GKEFTTjFfT0JKRUNUKSAqcG9saWNpZXM7CS8qIFBlcm1pc3NpYmxlIHBvbGljaWVzICovCisJfSBYNTA5X1ZFUklGWV9QQVJBTTsKKworREVDTEFSRV9TVEFDS19PRihYNTA5X1ZFUklGWV9QQVJBTSkKKworLyogVGhpcyBpcyB1c2VkIHRvIGhvbGQgZXZlcnl0aGluZy4gIEl0IGlzIHVzZWQgZm9yIGFsbCBjZXJ0aWZpY2F0ZQorICogdmFsaWRhdGlvbi4gIE9uY2Ugd2UgaGF2ZSBhIGNlcnRpZmljYXRlIGNoYWluLCB0aGUgJ3ZlcmlmeScKKyAqIGZ1bmN0aW9uIGlzIHRoZW4gY2FsbGVkIHRvIGFjdHVhbGx5IGNoZWNrIHRoZSBjZXJ0IGNoYWluLiAqLworc3RydWN0IHg1MDlfc3RvcmVfc3QKKwl7CisJLyogVGhlIGZvbGxvd2luZyBpcyBhIGNhY2hlIG9mIHRydXN0ZWQgY2VydHMgKi8KKwlpbnQgY2FjaGU7IAkvKiBpZiB0cnVlLCBzdGFzaCBhbnkgaGl0cyAqLworCVNUQUNLX09GKFg1MDlfT0JKRUNUKSAqb2JqczsJLyogQ2FjaGUgb2YgYWxsIG9iamVjdHMgKi8KKworCS8qIFRoZXNlIGFyZSBleHRlcm5hbCBsb29rdXAgbWV0aG9kcyAqLworCVNUQUNLX09GKFg1MDlfTE9PS1VQKSAqZ2V0X2NlcnRfbWV0aG9kczsKKworCVg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbTsKKworCS8qIENhbGxiYWNrcyBmb3IgdmFyaW91cyBvcGVyYXRpb25zICovCisJaW50ICgqdmVyaWZ5KShYNTA5X1NUT1JFX0NUWCAqY3R4KTsJLyogY2FsbGVkIHRvIHZlcmlmeSBhIGNlcnRpZmljYXRlICovCisJaW50ICgqdmVyaWZ5X2NiKShpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmN0eCk7CS8qIGVycm9yIGNhbGxiYWNrICovCisJaW50ICgqZ2V0X2lzc3VlcikoWDUwOSAqKmlzc3VlciwgWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCk7CS8qIGdldCBpc3N1ZXJzIGNlcnQgZnJvbSBjdHggKi8KKwlpbnQgKCpjaGVja19pc3N1ZWQpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngsIFg1MDkgKmlzc3Vlcik7IC8qIGNoZWNrIGlzc3VlZCAqLworCWludCAoKmNoZWNrX3Jldm9jYXRpb24pKFg1MDlfU1RPUkVfQ1RYICpjdHgpOyAvKiBDaGVjayByZXZvY2F0aW9uIHN0YXR1cyBvZiBjaGFpbiAqLworCWludCAoKmdldF9jcmwpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICoqY3JsLCBYNTA5ICp4KTsgLyogcmV0cmlldmUgQ1JMICovCisJaW50ICgqY2hlY2tfY3JsKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsKTsgLyogQ2hlY2sgQ1JMIHZhbGlkaXR5ICovCisJaW50ICgqY2VydF9jcmwpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfQ1JMICpjcmwsIFg1MDkgKngpOyAvKiBDaGVjayBjZXJ0aWZpY2F0ZSBhZ2FpbnN0IENSTCAqLworCVNUQUNLX09GKFg1MDkpICogKCpsb29rdXBfY2VydHMpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pOworCVNUQUNLX09GKFg1MDlfQ1JMKSAqICgqbG9va3VwX2NybHMpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pOworCWludCAoKmNsZWFudXApKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCisJQ1JZUFRPX0VYX0RBVEEgZXhfZGF0YTsKKwlpbnQgcmVmZXJlbmNlczsKKwl9IC8qIFg1MDlfU1RPUkUgKi87CisKK2ludCBYNTA5X1NUT1JFX3NldF9kZXB0aChYNTA5X1NUT1JFICpzdG9yZSwgaW50IGRlcHRoKTsKKworI2RlZmluZSBYNTA5X1NUT1JFX3NldF92ZXJpZnlfY2JfZnVuYyhjdHgsZnVuYykgKChjdHgpLT52ZXJpZnlfY2I9KGZ1bmMpKQorI2RlZmluZSBYNTA5X1NUT1JFX3NldF92ZXJpZnlfZnVuYyhjdHgsZnVuYykJKChjdHgpLT52ZXJpZnk9KGZ1bmMpKQorCisvKiBUaGlzIGlzIHRoZSBmdW5jdGlvbnMgcGx1cyBhbiBpbnN0YW5jZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLiAqLworc3RydWN0IHg1MDlfbG9va3VwX3N0CisJeworCWludCBpbml0OwkJCS8qIGhhdmUgd2UgYmVlbiBzdGFydGVkICovCisJaW50IHNraXA7CQkJLyogZG9uJ3QgdXNlIHVzLiAqLworCVg1MDlfTE9PS1VQX01FVEhPRCAqbWV0aG9kOwkvKiB0aGUgZnVuY3Rpb25zICovCisJY2hhciAqbWV0aG9kX2RhdGE7CQkvKiBtZXRob2QgZGF0YSAqLworCisJWDUwOV9TVE9SRSAqc3RvcmVfY3R4OwkvKiB3aG8gb3ducyB1cyAqLworCX0gLyogWDUwOV9MT09LVVAgKi87CisKKy8qIFRoaXMgaXMgYSB1c2VkIHdoZW4gdmVyaWZ5aW5nIGNlcnQgY2hhaW5zLiAgU2luY2UgdGhlCisgKiBnYXRoZXJpbmcgb2YgdGhlIGNlcnQgY2hhaW4gY2FuIHRha2Ugc29tZSB0aW1lIChhbmQgaGF2ZSB0byBiZQorICogJ3JldHJpZWQnLCB0aGlzIG5lZWRzIHRvIGJlIGtlcHQgYW5kIHBhc3NlZCBhcm91bmQuICovCitzdHJ1Y3QgeDUwOV9zdG9yZV9jdHhfc3QgICAgICAvKiBYNTA5X1NUT1JFX0NUWCAqLworCXsKKwlYNTA5X1NUT1JFICpjdHg7CisJaW50IGN1cnJlbnRfbWV0aG9kOwkvKiB1c2VkIHdoZW4gbG9va2luZyB1cCBjZXJ0cyAqLworCisJLyogVGhlIGZvbGxvd2luZyBhcmUgc2V0IGJ5IHRoZSBjYWxsZXIgKi8KKwlYNTA5ICpjZXJ0OwkJLyogVGhlIGNlcnQgdG8gY2hlY2sgKi8KKwlTVEFDS19PRihYNTA5KSAqdW50cnVzdGVkOwkvKiBjaGFpbiBvZiBYNTA5cyAtIHVudHJ1c3RlZCAtIHBhc3NlZCBpbiAqLworCVNUQUNLX09GKFg1MDlfQ1JMKSAqY3JsczsJLyogc2V0IG9mIENSTHMgcGFzc2VkIGluICovCisKKwlYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07CisJdm9pZCAqb3RoZXJfY3R4OwkvKiBPdGhlciBpbmZvIGZvciB1c2Ugd2l0aCBnZXRfaXNzdWVyKCkgKi8KKworCS8qIENhbGxiYWNrcyBmb3IgdmFyaW91cyBvcGVyYXRpb25zICovCisJaW50ICgqdmVyaWZ5KShYNTA5X1NUT1JFX0NUWCAqY3R4KTsJLyogY2FsbGVkIHRvIHZlcmlmeSBhIGNlcnRpZmljYXRlICovCisJaW50ICgqdmVyaWZ5X2NiKShpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmN0eCk7CQkvKiBlcnJvciBjYWxsYmFjayAqLworCWludCAoKmdldF9pc3N1ZXIpKFg1MDkgKippc3N1ZXIsIFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDkgKngpOwkvKiBnZXQgaXNzdWVycyBjZXJ0IGZyb20gY3R4ICovCisJaW50ICgqY2hlY2tfaXNzdWVkKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5ICp4LCBYNTA5ICppc3N1ZXIpOyAvKiBjaGVjayBpc3N1ZWQgKi8KKwlpbnQgKCpjaGVja19yZXZvY2F0aW9uKShYNTA5X1NUT1JFX0NUWCAqY3R4KTsgLyogQ2hlY2sgcmV2b2NhdGlvbiBzdGF0dXMgb2YgY2hhaW4gKi8KKwlpbnQgKCpnZXRfY3JsKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqKmNybCwgWDUwOSAqeCk7IC8qIHJldHJpZXZlIENSTCAqLworCWludCAoKmNoZWNrX2NybCkoWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOV9DUkwgKmNybCk7IC8qIENoZWNrIENSTCB2YWxpZGl0eSAqLworCWludCAoKmNlcnRfY3JsKShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X0NSTCAqY3JsLCBYNTA5ICp4KTsgLyogQ2hlY2sgY2VydGlmaWNhdGUgYWdhaW5zdCBDUkwgKi8KKwlpbnQgKCpjaGVja19wb2xpY3kpKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCVNUQUNLX09GKFg1MDkpICogKCpsb29rdXBfY2VydHMpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pOworCVNUQUNLX09GKFg1MDlfQ1JMKSAqICgqbG9va3VwX2NybHMpKFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfTkFNRSAqbm0pOworCWludCAoKmNsZWFudXApKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCisJLyogVGhlIGZvbGxvd2luZyBpcyBidWlsdCB1cCAqLworCWludCB2YWxpZDsJCS8qIGlmIDAsIHJlYnVpbGQgY2hhaW4gKi8KKwlpbnQgbGFzdF91bnRydXN0ZWQ7CS8qIGluZGV4IG9mIGxhc3QgdW50cnVzdGVkIGNlcnQgKi8KKwlTVEFDS19PRihYNTA5KSAqY2hhaW47IAkJLyogY2hhaW4gb2YgWDUwOXMgLSBidWlsdCB1cCBhbmQgdHJ1c3RlZCAqLworCVg1MDlfUE9MSUNZX1RSRUUgKnRyZWU7CS8qIFZhbGlkIHBvbGljeSB0cmVlICovCisKKwlpbnQgZXhwbGljaXRfcG9saWN5OwkvKiBSZXF1aXJlIGV4cGxpY2l0IHBvbGljeSB2YWx1ZSAqLworCisJLyogV2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZywgdGhpcyBpcyB3aHkgKi8KKwlpbnQgZXJyb3JfZGVwdGg7CisJaW50IGVycm9yOworCVg1MDkgKmN1cnJlbnRfY2VydDsKKwlYNTA5ICpjdXJyZW50X2lzc3VlcjsJLyogY2VydCBjdXJyZW50bHkgYmVpbmcgdGVzdGVkIGFzIHZhbGlkIGlzc3VlciAqLworCVg1MDlfQ1JMICpjdXJyZW50X2NybDsJLyogY3VycmVudCBDUkwgKi8KKworCWludCBjdXJyZW50X2NybF9zY29yZTsgIC8qIHNjb3JlIG9mIGN1cnJlbnQgQ1JMICovCisJdW5zaWduZWQgaW50IGN1cnJlbnRfcmVhc29uczsgIC8qIFJlYXNvbiBtYXNrICovCisKKwlYNTA5X1NUT1JFX0NUWCAqcGFyZW50OyAvKiBGb3IgQ1JMIHBhdGggdmFsaWRhdGlvbjogcGFyZW50IGNvbnRleHQgKi8KKworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisJfSAvKiBYNTA5X1NUT1JFX0NUWCAqLzsKKwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfZGVwdGgoWDUwOV9TVE9SRV9DVFggKmN0eCwgaW50IGRlcHRoKTsKKworI2RlZmluZSBYNTA5X1NUT1JFX0NUWF9zZXRfYXBwX2RhdGEoY3R4LGRhdGEpIFwKKwlYNTA5X1NUT1JFX0NUWF9zZXRfZXhfZGF0YShjdHgsMCxkYXRhKQorI2RlZmluZSBYNTA5X1NUT1JFX0NUWF9nZXRfYXBwX2RhdGEoY3R4KSBcCisJWDUwOV9TVE9SRV9DVFhfZ2V0X2V4X2RhdGEoY3R4LDApCisKKyNkZWZpbmUgWDUwOV9MX0ZJTEVfTE9BRAkxCisjZGVmaW5lIFg1MDlfTF9BRERfRElSCQkyCisKKyNkZWZpbmUgWDUwOV9MT09LVVBfbG9hZF9maWxlKHgsbmFtZSx0eXBlKSBcCisJCVg1MDlfTE9PS1VQX2N0cmwoKHgpLFg1MDlfTF9GSUxFX0xPQUQsKG5hbWUpLChsb25nKSh0eXBlKSxOVUxMKQorCisjZGVmaW5lIFg1MDlfTE9PS1VQX2FkZF9kaXIoeCxuYW1lLHR5cGUpIFwKKwkJWDUwOV9MT09LVVBfY3RybCgoeCksWDUwOV9MX0FERF9ESVIsKG5hbWUpLChsb25nKSh0eXBlKSxOVUxMKQorCisjZGVmaW5lCQlYNTA5X1ZfT0sJCQkJCTAKKy8qIGlsbGVnYWwgZXJyb3IgKGZvciB1bmluaXRpYWxpemVkIHZhbHVlcywgdG8gYXZvaWQgWDUwOV9WX09LKTogMSAqLworCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfSVNTVUVSX0NFUlQJCTIKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkwJCQkzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOQUJMRV9UT19ERUNSWVBUX0NFUlRfU0lHTkFUVVJFCTQKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ1JZUFRfQ1JMX1NJR05BVFVSRQk1CisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOQUJMRV9UT19ERUNPREVfSVNTVUVSX1BVQkxJQ19LRVkJNgorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX1NJR05BVFVSRV9GQUlMVVJFCQk3CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NSTF9TSUdOQVRVUkVfRkFJTFVSRQkJOAorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX05PVF9ZRVRfVkFMSUQJCQk5CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQJCQkxMAorI2RlZmluZQkJWDUwOV9WX0VSUl9DUkxfTk9UX1lFVF9WQUxJRAkJCTExCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NSTF9IQVNfRVhQSVJFRAkJCTEyCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0JFRk9SRV9GSUVMRAkxMworI2RlZmluZQkJWDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9BRlRFUl9GSUVMRAkxNAorI2RlZmluZQkJWDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTEFTVF9VUERBVEVfRklFTEQJMTUKKyNkZWZpbmUJCVg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX05FWFRfVVBEQVRFX0ZJRUxECTE2CisjZGVmaW5lCQlYNTA5X1ZfRVJSX09VVF9PRl9NRU0JCQkJMTcKKyNkZWZpbmUJCVg1MDlfVl9FUlJfREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUCQkxOAorI2RlZmluZQkJWDUwOV9WX0VSUl9TRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOCQkxOQorI2RlZmluZQkJWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFkJMjAKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5BQkxFX1RPX1ZFUklGWV9MRUFGX1NJR05BVFVSRQkyMQorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX0NIQUlOX1RPT19MT05HCQkJMjIKKyNkZWZpbmUJCVg1MDlfVl9FUlJfQ0VSVF9SRVZPS0VECQkJCTIzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0lOVkFMSURfQ0EJCQkJMjQKKyNkZWZpbmUJCVg1MDlfVl9FUlJfUEFUSF9MRU5HVEhfRVhDRUVERUQJCQkyNQorI2RlZmluZQkJWDUwOV9WX0VSUl9JTlZBTElEX1BVUlBPU0UJCQkyNgorI2RlZmluZQkJWDUwOV9WX0VSUl9DRVJUX1VOVFJVU1RFRAkJCTI3CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0NFUlRfUkVKRUNURUQJCQkyOAorLyogVGhlc2UgYXJlICdpbmZvcm1hdGlvbmFsJyB3aGVuIGxvb2tpbmcgZm9yIGlzc3VlciBjZXJ0ICovCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1NVQkpFQ1RfSVNTVUVSX01JU01BVENICQkyOQorI2RlZmluZQkJWDUwOV9WX0VSUl9BS0lEX1NLSURfTUlTTUFUQ0gJCQkzMAorI2RlZmluZQkJWDUwOV9WX0VSUl9BS0lEX0lTU1VFUl9TRVJJQUxfTUlTTUFUQ0gJCTMxCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0tFWVVTQUdFX05PX0NFUlRTSUdOCQkJMzIKKworI2RlZmluZQkJWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTF9JU1NVRVIJCTMzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOSEFORExFRF9DUklUSUNBTF9FWFRFTlNJT04JCTM0CisjZGVmaW5lCQlYNTA5X1ZfRVJSX0tFWVVTQUdFX05PX0NSTF9TSUdOCQkJMzUKKyNkZWZpbmUJCVg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0NSTF9FWFRFTlNJT04JMzYKKyNkZWZpbmUJCVg1MDlfVl9FUlJfSU5WQUxJRF9OT05fQ0EJCQkzNworI2RlZmluZQkJWDUwOV9WX0VSUl9QUk9YWV9QQVRIX0xFTkdUSF9FWENFRURFRAkJMzgKKyNkZWZpbmUJCVg1MDlfVl9FUlJfS0VZVVNBR0VfTk9fRElHSVRBTF9TSUdOQVRVUkUJMzkKKyNkZWZpbmUJCVg1MDlfVl9FUlJfUFJPWFlfQ0VSVElGSUNBVEVTX05PVF9BTExPV0VECTQwCisKKyNkZWZpbmUJCVg1MDlfVl9FUlJfSU5WQUxJRF9FWFRFTlNJT04JCQk0MQorI2RlZmluZQkJWDUwOV9WX0VSUl9JTlZBTElEX1BPTElDWV9FWFRFTlNJT04JCTQyCisjZGVmaW5lCQlYNTA5X1ZfRVJSX05PX0VYUExJQ0lUX1BPTElDWQkJCTQzCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0RJRkZFUkVOVF9DUkxfU0NPUEUJCQk0NAorI2RlZmluZQkJWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9FWFRFTlNJT05fRkVBVFVSRQk0NQorCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOTkVTVEVEX1JFU09VUkNFCQkJNDYKKworI2RlZmluZQkJWDUwOV9WX0VSUl9QRVJNSVRURURfVklPTEFUSU9OCQkJNDcKKyNkZWZpbmUJCVg1MDlfVl9FUlJfRVhDTFVERURfVklPTEFUSU9OCQkJNDgKKyNkZWZpbmUJCVg1MDlfVl9FUlJfU1VCVFJFRV9NSU5NQVgJCQk0OQorI2RlZmluZQkJWDUwOV9WX0VSUl9VTlNVUFBPUlRFRF9DT05TVFJBSU5UX1RZUEUJCTUxCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX0NPTlNUUkFJTlRfU1lOVEFYCTUyCisjZGVmaW5lCQlYNTA5X1ZfRVJSX1VOU1VQUE9SVEVEX05BTUVfU1lOVEFYCQk1MworI2RlZmluZQkJWDUwOV9WX0VSUl9DUkxfUEFUSF9WQUxJREFUSU9OX0VSUk9SCQk1NAorCisvKiBUaGUgYXBwbGljYXRpb24gaXMgbm90IGhhcHB5ICovCisjZGVmaW5lCQlYNTA5X1ZfRVJSX0FQUExJQ0FUSU9OX1ZFUklGSUNBVElPTgkJNTAKKworLyogQ2VydGlmaWNhdGUgdmVyaWZ5IGZsYWdzICovCisKKy8qIFNlbmQgaXNzdWVyK3N1YmplY3QgY2hlY2tzIHRvIHZlcmlmeV9jYiAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19DQl9JU1NVRVJfQ0hFQ0sJCTB4MQorLyogVXNlIGNoZWNrIHRpbWUgaW5zdGVhZCBvZiBjdXJyZW50IHRpbWUgKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfVVNFX0NIRUNLX1RJTUUJCTB4MgorLyogTG9va3VwIENSTHMgKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfQ1JMX0NIRUNLCQkJMHg0CisvKiBMb29rdXAgQ1JMcyBmb3Igd2hvbGUgY2hhaW4gKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfQ1JMX0NIRUNLX0FMTAkJMHg4CisvKiBJZ25vcmUgdW5oYW5kbGVkIGNyaXRpY2FsIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfSUdOT1JFX0NSSVRJQ0FMCQkweDEwCisvKiBEaXNhYmxlIHdvcmthcm91bmRzIGZvciBicm9rZW4gY2VydGlmaWNhdGVzICovCisjZGVmaW5lCVg1MDlfVl9GTEFHX1g1MDlfU1RSSUNUCQkJMHgyMAorLyogRW5hYmxlIHByb3h5IGNlcnRpZmljYXRlIHZhbGlkYXRpb24gKi8KKyNkZWZpbmUJWDUwOV9WX0ZMQUdfQUxMT1dfUFJPWFlfQ0VSVFMJCTB4NDAKKy8qIEVuYWJsZSBwb2xpY3kgY2hlY2tpbmcgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfUE9MSUNZX0NIRUNLCQkweDgwCisvKiBQb2xpY3kgdmFyaWFibGUgcmVxdWlyZS1leHBsaWNpdC1wb2xpY3kgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfRVhQTElDSVRfUE9MSUNZCQkweDEwMAorLyogUG9saWN5IHZhcmlhYmxlIGluaGliaXQtYW55LXBvbGljeSAqLworI2RlZmluZQlYNTA5X1ZfRkxBR19JTkhJQklUX0FOWQkJCTB4MjAwCisvKiBQb2xpY3kgdmFyaWFibGUgaW5oaWJpdC1wb2xpY3ktbWFwcGluZyAqLworI2RlZmluZSBYNTA5X1ZfRkxBR19JTkhJQklUX01BUAkJCTB4NDAwCisvKiBOb3RpZnkgY2FsbGJhY2sgdGhhdCBwb2xpY3kgaXMgT0sgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfTk9USUZZX1BPTElDWQkJMHg4MDAKKy8qIEV4dGVuZGVkIENSTCBmZWF0dXJlcyBzdWNoIGFzIGluZGlyZWN0IENSTHMsIGFsdGVybmF0ZSBDUkwgc2lnbmluZyBrZXlzICovCisjZGVmaW5lIFg1MDlfVl9GTEFHX0VYVEVOREVEX0NSTF9TVVBQT1JUCTB4MTAwMAorLyogRGVsdGEgQ1JMIHN1cHBvcnQgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfVVNFX0RFTFRBUwkJCTB4MjAwMAorLyogQ2hlY2sgc2VsZnNpZ25lZCBDQSBzaWduYXR1cmUgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfQ0hFQ0tfU1NfU0lHTkFUVVJFCQkweDQwMDAKKworCisjZGVmaW5lIFg1MDlfVlBfRkxBR19ERUZBVUxUCQkJMHgxCisjZGVmaW5lIFg1MDlfVlBfRkxBR19PVkVSV1JJVEUJCQkweDIKKyNkZWZpbmUgWDUwOV9WUF9GTEFHX1JFU0VUX0ZMQUdTCQkweDQKKyNkZWZpbmUgWDUwOV9WUF9GTEFHX0xPQ0tFRAkJCTB4OAorI2RlZmluZSBYNTA5X1ZQX0ZMQUdfT05DRQkJCTB4MTAKKworLyogSW50ZXJuYWwgdXNlOiBtYXNrIG9mIHBvbGljeSByZWxhdGVkIG9wdGlvbnMgKi8KKyNkZWZpbmUgWDUwOV9WX0ZMQUdfUE9MSUNZX01BU0sgKFg1MDlfVl9GTEFHX1BPTElDWV9DSEVDSyBcCisJCQkJfCBYNTA5X1ZfRkxBR19FWFBMSUNJVF9QT0xJQ1kgXAorCQkJCXwgWDUwOV9WX0ZMQUdfSU5ISUJJVF9BTlkgXAorCQkJCXwgWDUwOV9WX0ZMQUdfSU5ISUJJVF9NQVApCisKK2ludCBYNTA5X09CSkVDVF9pZHhfYnlfc3ViamVjdChTVEFDS19PRihYNTA5X09CSkVDVCkgKmgsIGludCB0eXBlLAorCSAgICAgWDUwOV9OQU1FICpuYW1lKTsKK1g1MDlfT0JKRUNUICpYNTA5X09CSkVDVF9yZXRyaWV2ZV9ieV9zdWJqZWN0KFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCxpbnQgdHlwZSxYNTA5X05BTUUgKm5hbWUpOworWDUwOV9PQkpFQ1QgKlg1MDlfT0JKRUNUX3JldHJpZXZlX21hdGNoKFNUQUNLX09GKFg1MDlfT0JKRUNUKSAqaCwgWDUwOV9PQkpFQ1QgKngpOwordm9pZCBYNTA5X09CSkVDVF91cF9yZWZfY291bnQoWDUwOV9PQkpFQ1QgKmEpOwordm9pZCBYNTA5X09CSkVDVF9mcmVlX2NvbnRlbnRzKFg1MDlfT0JKRUNUICphKTsKK1g1MDlfU1RPUkUgKlg1MDlfU1RPUkVfbmV3KHZvaWQgKTsKK3ZvaWQgWDUwOV9TVE9SRV9mcmVlKFg1MDlfU1RPUkUgKnYpOworCitTVEFDS19PRihYNTA5KSogWDUwOV9TVE9SRV9nZXQxX2NlcnRzKFg1MDlfU1RPUkVfQ1RYICpzdCwgWDUwOV9OQU1FICpubSk7CitTVEFDS19PRihYNTA5X0NSTCkqIFg1MDlfU1RPUkVfZ2V0MV9jcmxzKFg1MDlfU1RPUkVfQ1RYICpzdCwgWDUwOV9OQU1FICpubSk7CitpbnQgWDUwOV9TVE9SRV9zZXRfZmxhZ3MoWDUwOV9TVE9SRSAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBYNTA5X1NUT1JFX3NldF9wdXJwb3NlKFg1MDlfU1RPUkUgKmN0eCwgaW50IHB1cnBvc2UpOworaW50IFg1MDlfU1RPUkVfc2V0X3RydXN0KFg1MDlfU1RPUkUgKmN0eCwgaW50IHRydXN0KTsKK2ludCBYNTA5X1NUT1JFX3NldDFfcGFyYW0oWDUwOV9TVE9SRSAqY3R4LCBYNTA5X1ZFUklGWV9QQVJBTSAqcG0pOworCit2b2lkIFg1MDlfU1RPUkVfc2V0X3ZlcmlmeV9jYihYNTA5X1NUT1JFICpjdHgsCisJCQkJICBpbnQgKCp2ZXJpZnlfY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpOworCitYNTA5X1NUT1JFX0NUWCAqWDUwOV9TVE9SRV9DVFhfbmV3KHZvaWQpOworCitpbnQgWDUwOV9TVE9SRV9DVFhfZ2V0MV9pc3N1ZXIoWDUwOSAqKmlzc3VlciwgWDUwOV9TVE9SRV9DVFggKmN0eCwgWDUwOSAqeCk7CisKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfZnJlZShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK2ludCBYNTA5X1NUT1JFX0NUWF9pbml0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIFg1MDlfU1RPUkUgKnN0b3JlLAorCQkJIFg1MDkgKng1MDksIFNUQUNLX09GKFg1MDkpICpjaGFpbik7Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soWDUwOV9TVE9SRV9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOSkgKnNrKTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfY2xlYW51cChYNTA5X1NUT1JFX0NUWCAqY3R4KTsKKworWDUwOV9MT09LVVAgKlg1MDlfU1RPUkVfYWRkX2xvb2t1cChYNTA5X1NUT1JFICp2LCBYNTA5X0xPT0tVUF9NRVRIT0QgKm0pOworCitYNTA5X0xPT0tVUF9NRVRIT0QgKlg1MDlfTE9PS1VQX2hhc2hfZGlyKHZvaWQpOworWDUwOV9MT09LVVBfTUVUSE9EICpYNTA5X0xPT0tVUF9maWxlKHZvaWQpOworCitpbnQgWDUwOV9TVE9SRV9hZGRfY2VydChYNTA5X1NUT1JFICpjdHgsIFg1MDkgKngpOworaW50IFg1MDlfU1RPUkVfYWRkX2NybChYNTA5X1NUT1JFICpjdHgsIFg1MDlfQ1JMICp4KTsKKworaW50IFg1MDlfU1RPUkVfZ2V0X2J5X3N1YmplY3QoWDUwOV9TVE9SRV9DVFggKnZzLGludCB0eXBlLFg1MDlfTkFNRSAqbmFtZSwKKwlYNTA5X09CSkVDVCAqcmV0KTsKKworaW50IFg1MDlfTE9PS1VQX2N0cmwoWDUwOV9MT09LVVAgKmN0eCwgaW50IGNtZCwgY29uc3QgY2hhciAqYXJnYywKKwlsb25nIGFyZ2wsIGNoYXIgKipyZXQpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fU1RESU8KK2ludCBYNTA5X2xvYWRfY2VydF9maWxlKFg1MDlfTE9PS1VQICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKK2ludCBYNTA5X2xvYWRfY3JsX2ZpbGUoWDUwOV9MT09LVVAgKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworaW50IFg1MDlfbG9hZF9jZXJ0X2NybF9maWxlKFg1MDlfTE9PS1VQICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKKyNlbmRpZgorCisKK1g1MDlfTE9PS1VQICpYNTA5X0xPT0tVUF9uZXcoWDUwOV9MT09LVVBfTUVUSE9EICptZXRob2QpOwordm9pZCBYNTA5X0xPT0tVUF9mcmVlKFg1MDlfTE9PS1VQICpjdHgpOworaW50IFg1MDlfTE9PS1VQX2luaXQoWDUwOV9MT09LVVAgKmN0eCk7CitpbnQgWDUwOV9MT09LVVBfYnlfc3ViamVjdChYNTA5X0xPT0tVUCAqY3R4LCBpbnQgdHlwZSwgWDUwOV9OQU1FICpuYW1lLAorCVg1MDlfT0JKRUNUICpyZXQpOworaW50IFg1MDlfTE9PS1VQX2J5X2lzc3Vlcl9zZXJpYWwoWDUwOV9MT09LVVAgKmN0eCwgaW50IHR5cGUsIFg1MDlfTkFNRSAqbmFtZSwKKwlBU04xX0lOVEVHRVIgKnNlcmlhbCwgWDUwOV9PQkpFQ1QgKnJldCk7CitpbnQgWDUwOV9MT09LVVBfYnlfZmluZ2VycHJpbnQoWDUwOV9MT09LVVAgKmN0eCwgaW50IHR5cGUsCisJdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBsZW4sIFg1MDlfT0JKRUNUICpyZXQpOworaW50IFg1MDlfTE9PS1VQX2J5X2FsaWFzKFg1MDlfTE9PS1VQICpjdHgsIGludCB0eXBlLCBjaGFyICpzdHIsCisJaW50IGxlbiwgWDUwOV9PQkpFQ1QgKnJldCk7CitpbnQgWDUwOV9MT09LVVBfc2h1dGRvd24oWDUwOV9MT09LVVAgKmN0eCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworaW50CVg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMgKFg1MDlfU1RPUkUgKmN0eCwKKwkJY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZGlyKTsKK2ludAlYNTA5X1NUT1JFX3NldF9kZWZhdWx0X3BhdGhzKFg1MDlfU1RPUkUgKmN0eCk7CisjZW5kaWYKKworaW50IFg1MDlfU1RPUkVfQ1RYX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwlDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CitpbnQJWDUwOV9TVE9SRV9DVFhfc2V0X2V4X2RhdGEoWDUwOV9TVE9SRV9DVFggKmN0eCxpbnQgaWR4LHZvaWQgKmRhdGEpOwordm9pZCAqCVg1MDlfU1RPUkVfQ1RYX2dldF9leF9kYXRhKFg1MDlfU1RPUkVfQ1RYICpjdHgsaW50IGlkeCk7CitpbnQJWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yKFg1MDlfU1RPUkVfQ1RYICpjdHgpOwordm9pZAlYNTA5X1NUT1JFX0NUWF9zZXRfZXJyb3IoWDUwOV9TVE9SRV9DVFggKmN0eCxpbnQgcyk7CitpbnQJWDUwOV9TVE9SRV9DVFhfZ2V0X2Vycm9yX2RlcHRoKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworWDUwOSAqCVg1MDlfU1RPUkVfQ1RYX2dldF9jdXJyZW50X2NlcnQoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitYNTA5ICpYNTA5X1NUT1JFX0NUWF9nZXQwX2N1cnJlbnRfaXNzdWVyKFg1MDlfU1RPUkVfQ1RYICpjdHgpOworWDUwOV9DUkwgKlg1MDlfU1RPUkVfQ1RYX2dldDBfY3VycmVudF9jcmwoWDUwOV9TVE9SRV9DVFggKmN0eCk7CitYNTA5X1NUT1JFX0NUWCAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wYXJlbnRfY3R4KFg1MDlfU1RPUkVfQ1RYICpjdHgpOworU1RBQ0tfT0YoWDUwOSkgKlg1MDlfU1RPUkVfQ1RYX2dldF9jaGFpbihYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK1NUQUNLX09GKFg1MDkpICpYNTA5X1NUT1JFX0NUWF9nZXQxX2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjdHgpOwordm9pZAlYNTA5X1NUT1JFX0NUWF9zZXRfY2VydChYNTA5X1NUT1JFX0NUWCAqYyxYNTA5ICp4KTsKK3ZvaWQJWDUwOV9TVE9SRV9DVFhfc2V0X2NoYWluKFg1MDlfU1RPUkVfQ1RYICpjLFNUQUNLX09GKFg1MDkpICpzayk7Cit2b2lkCVg1MDlfU1RPUkVfQ1RYX3NldDBfY3JscyhYNTA5X1NUT1JFX0NUWCAqYyxTVEFDS19PRihYNTA5X0NSTCkgKnNrKTsKK2ludCBYNTA5X1NUT1JFX0NUWF9zZXRfcHVycG9zZShYNTA5X1NUT1JFX0NUWCAqY3R4LCBpbnQgcHVycG9zZSk7CitpbnQgWDUwOV9TVE9SRV9DVFhfc2V0X3RydXN0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCB0cnVzdCk7CitpbnQgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGludCBkZWZfcHVycG9zZSwKKwkJCQlpbnQgcHVycG9zZSwgaW50IHRydXN0KTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0X2ZsYWdzKFg1MDlfU1RPUkVfQ1RYICpjdHgsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordm9pZCBYNTA5X1NUT1JFX0NUWF9zZXRfdGltZShYNTA5X1NUT1JFX0NUWCAqY3R4LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCQkJCQl0aW1lX3QgdCk7Cit2b2lkIFg1MDlfU1RPUkVfQ1RYX3NldF92ZXJpZnlfY2IoWDUwOV9TVE9SRV9DVFggKmN0eCwKKwkJCQkgIGludCAoKnZlcmlmeV9jYikoaW50LCBYNTA5X1NUT1JFX0NUWCAqKSk7CisgIAorWDUwOV9QT0xJQ1lfVFJFRSAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wb2xpY3lfdHJlZShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK2ludCBYNTA5X1NUT1JFX0NUWF9nZXRfZXhwbGljaXRfcG9saWN5KFg1MDlfU1RPUkVfQ1RYICpjdHgpOworCitYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9TVE9SRV9DVFhfZ2V0MF9wYXJhbShYNTA5X1NUT1JFX0NUWCAqY3R4KTsKK3ZvaWQgWDUwOV9TVE9SRV9DVFhfc2V0MF9wYXJhbShYNTA5X1NUT1JFX0NUWCAqY3R4LCBYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pOworaW50IFg1MDlfU1RPUkVfQ1RYX3NldF9kZWZhdWx0KFg1MDlfU1RPUkVfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKm5hbWUpOworCisvKiBYNTA5X1ZFUklGWV9QQVJBTSBmdW5jdGlvbnMgKi8KKworWDUwOV9WRVJJRllfUEFSQU0gKlg1MDlfVkVSSUZZX1BBUkFNX25ldyh2b2lkKTsKK3ZvaWQgWDUwOV9WRVJJRllfUEFSQU1fZnJlZShYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQoWDUwOV9WRVJJRllfUEFSQU0gKnRvLAorCQkJCQkJY29uc3QgWDUwOV9WRVJJRllfUEFSQU0gKmZyb20pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDEoWDUwOV9WRVJJRllfUEFSQU0gKnRvLCAKKwkJCQkJCWNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpmcm9tKTsKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXQxX25hbWUoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfZmxhZ3MoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9jbGVhcl9mbGFncyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sCisJCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7Cit1bnNpZ25lZCBsb25nIFg1MDlfVkVSSUZZX1BBUkFNX2dldF9mbGFncyhYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0pOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF9wdXJwb3NlKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgaW50IHB1cnBvc2UpOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldF90cnVzdChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGludCB0cnVzdCk7Cit2b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3NldF9kZXB0aChYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW0sIGludCBkZXB0aCk7Cit2b2lkIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90aW1lKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwgdGltZV90IHQpOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX2FkZDBfcG9saWN5KFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSwKKwkJCQkJCUFTTjFfT0JKRUNUICpwb2xpY3kpOworaW50IFg1MDlfVkVSSUZZX1BBUkFNX3NldDFfcG9saWNpZXMoWDUwOV9WRVJJRllfUEFSQU0gKnBhcmFtLCAKKwkJCQkJU1RBQ0tfT0YoQVNOMV9PQkpFQ1QpICpwb2xpY2llcyk7CitpbnQgWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2RlcHRoKGNvbnN0IFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7CisKK2ludCBYNTA5X1ZFUklGWV9QQVJBTV9hZGQwX3RhYmxlKFg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbSk7Citjb25zdCBYNTA5X1ZFUklGWV9QQVJBTSAqWDUwOV9WRVJJRllfUEFSQU1fbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBYNTA5X1ZFUklGWV9QQVJBTV90YWJsZV9jbGVhbnVwKHZvaWQpOworCitpbnQgWDUwOV9wb2xpY3lfY2hlY2soWDUwOV9QT0xJQ1lfVFJFRSAqKnB0cmVlLCBpbnQgKnBleHBsaWNpdF9wb2xpY3ksCisJCQlTVEFDS19PRihYNTA5KSAqY2VydHMsCisJCQlTVEFDS19PRihBU04xX09CSkVDVCkgKnBvbGljeV9vaWRzLAorCQkJdW5zaWduZWQgaW50IGZsYWdzKTsKKwordm9pZCBYNTA5X3BvbGljeV90cmVlX2ZyZWUoWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSk7CisKK2ludCBYNTA5X3BvbGljeV90cmVlX2xldmVsX2NvdW50KGNvbnN0IFg1MDlfUE9MSUNZX1RSRUUgKnRyZWUpOworWDUwOV9QT0xJQ1lfTEVWRUwgKgorCVg1MDlfcG9saWN5X3RyZWVfZ2V0MF9sZXZlbChjb25zdCBYNTA5X1BPTElDWV9UUkVFICp0cmVlLCBpbnQgaSk7CisKK1NUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICoKKwlYNTA5X3BvbGljeV90cmVlX2dldDBfcG9saWNpZXMoY29uc3QgWDUwOV9QT0xJQ1lfVFJFRSAqdHJlZSk7CisKK1NUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpICoKKwlYNTA5X3BvbGljeV90cmVlX2dldDBfdXNlcl9wb2xpY2llcyhjb25zdCBYNTA5X1BPTElDWV9UUkVFICp0cmVlKTsKKworaW50IFg1MDlfcG9saWN5X2xldmVsX25vZGVfY291bnQoWDUwOV9QT0xJQ1lfTEVWRUwgKmxldmVsKTsKKworWDUwOV9QT0xJQ1lfTk9ERSAqWDUwOV9wb2xpY3lfbGV2ZWxfZ2V0MF9ub2RlKFg1MDlfUE9MSUNZX0xFVkVMICpsZXZlbCwgaW50IGkpOworCitjb25zdCBBU04xX09CSkVDVCAqWDUwOV9wb2xpY3lfbm9kZV9nZXQwX3BvbGljeShjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlKTsKKworU1RBQ0tfT0YoUE9MSUNZUVVBTElORk8pICoKKwlYNTA5X3BvbGljeV9ub2RlX2dldDBfcXVhbGlmaWVycyhjb25zdCBYNTA5X1BPTElDWV9OT0RFICpub2RlKTsKK2NvbnN0IFg1MDlfUE9MSUNZX05PREUgKgorCVg1MDlfcG9saWN5X25vZGVfZ2V0MF9wYXJlbnQoY29uc3QgWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC94NTA5djMuaCBiL2xpYi9vcGVuc3NsL2luY2x1ZGUvb3BlbnNzbC94NTA5djMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzA4YWJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvaW5jbHVkZS9vcGVuc3NsL3g1MDl2My5oCkBAIC0wLDAgKzEsMTAwNyBAQAorLyogeDUwOXYzLmggKi8KKy8qIFdyaXR0ZW4gYnkgRHIgU3RlcGhlbiBOIEhlbnNvbiAoc3RldmVAb3BlbnNzbC5vcmcpIGZvciB0aGUgT3BlblNTTAorICogcHJvamVjdCAxOTk5LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgbGljZW5zaW5nQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKyNpZm5kZWYgSEVBREVSX1g1MDlWM19ICisjZGVmaW5lIEhFQURFUl9YNTA5VjNfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2NvbmYuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGb3J3YXJkIHJlZmVyZW5jZSAqLworc3RydWN0IHYzX2V4dF9tZXRob2Q7CitzdHJ1Y3QgdjNfZXh0X2N0eDsKKworLyogVXNlZnVsIHR5cGVkZWZzICovCisKK3R5cGVkZWYgdm9pZCAqICgqWDUwOVYzX0VYVF9ORVcpKHZvaWQpOwordHlwZWRlZiB2b2lkICgqWDUwOVYzX0VYVF9GUkVFKSh2b2lkICopOwordHlwZWRlZiB2b2lkICogKCpYNTA5VjNfRVhUX0QySSkodm9pZCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICoqICwgbG9uZyk7Cit0eXBlZGVmIGludCAoKlg1MDlWM19FWFRfSTJEKSh2b2lkICosIHVuc2lnbmVkIGNoYXIgKiopOwordHlwZWRlZiBTVEFDS19PRihDT05GX1ZBTFVFKSAqCisgICgqWDUwOVYzX0VYVF9JMlYpKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsIHZvaWQgKmV4dCwKKwkJICAgIFNUQUNLX09GKENPTkZfVkFMVUUpICpleHRsaXN0KTsKK3R5cGVkZWYgdm9pZCAqICgqWDUwOVYzX0VYVF9WMkkpKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsCisJCQkJIHN0cnVjdCB2M19leHRfY3R4ICpjdHgsCisJCQkJIFNUQUNLX09GKENPTkZfVkFMVUUpICp2YWx1ZXMpOwordHlwZWRlZiBjaGFyICogKCpYNTA5VjNfRVhUX0kyUykoY29uc3Qgc3RydWN0IHYzX2V4dF9tZXRob2QgKm1ldGhvZCwgdm9pZCAqZXh0KTsKK3R5cGVkZWYgdm9pZCAqICgqWDUwOVYzX0VYVF9TMkkpKGNvbnN0IHN0cnVjdCB2M19leHRfbWV0aG9kICptZXRob2QsCisJCQkJIHN0cnVjdCB2M19leHRfY3R4ICpjdHgsIGNvbnN0IGNoYXIgKnN0cik7Cit0eXBlZGVmIGludCAoKlg1MDlWM19FWFRfSTJSKShjb25zdCBzdHJ1Y3QgdjNfZXh0X21ldGhvZCAqbWV0aG9kLCB2b2lkICpleHQsCisJCQkgICAgICBCSU8gKm91dCwgaW50IGluZGVudCk7Cit0eXBlZGVmIHZvaWQgKiAoKlg1MDlWM19FWFRfUjJJKShjb25zdCBzdHJ1Y3QgdjNfZXh0X21ldGhvZCAqbWV0aG9kLAorCQkJCSBzdHJ1Y3QgdjNfZXh0X2N0eCAqY3R4LCBjb25zdCBjaGFyICpzdHIpOworCisvKiBWMyBleHRlbnNpb24gc3RydWN0dXJlICovCisKK3N0cnVjdCB2M19leHRfbWV0aG9kIHsKK2ludCBleHRfbmlkOworaW50IGV4dF9mbGFnczsKKy8qIElmIHRoaXMgaXMgc2V0IHRoZSBmb2xsb3dpbmcgZm91ciBmaWVsZHMgYXJlIGlnbm9yZWQgKi8KK0FTTjFfSVRFTV9FWFAgKml0OworLyogT2xkIHN0eWxlIEFTTjEgY2FsbHMgKi8KK1g1MDlWM19FWFRfTkVXIGV4dF9uZXc7CitYNTA5VjNfRVhUX0ZSRUUgZXh0X2ZyZWU7CitYNTA5VjNfRVhUX0QySSBkMmk7CitYNTA5VjNfRVhUX0kyRCBpMmQ7CisKKy8qIFRoZSBmb2xsb3dpbmcgcGFpciBpcyB1c2VkIGZvciBzdHJpbmcgZXh0ZW5zaW9ucyAqLworWDUwOVYzX0VYVF9JMlMgaTJzOworWDUwOVYzX0VYVF9TMkkgczJpOworCisvKiBUaGUgZm9sbG93aW5nIHBhaXIgaXMgdXNlZCBmb3IgbXVsdGktdmFsdWVkIGV4dGVuc2lvbnMgKi8KK1g1MDlWM19FWFRfSTJWIGkydjsKK1g1MDlWM19FWFRfVjJJIHYyaTsKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdXNlZCBmb3IgcmF3IGV4dGVuc2lvbnMgKi8KK1g1MDlWM19FWFRfSTJSIGkycjsKK1g1MDlWM19FWFRfUjJJIHIyaTsKKwordm9pZCAqdXNyX2RhdGE7CS8qIEFueSBleHRlbnNpb24gc3BlY2lmaWMgZGF0YSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgWDUwOVYzX0NPTkZfTUVUSE9EX3N0IHsKK2NoYXIgKiAoKmdldF9zdHJpbmcpKHZvaWQgKmRiLCBjaGFyICpzZWN0aW9uLCBjaGFyICp2YWx1ZSk7CitTVEFDS19PRihDT05GX1ZBTFVFKSAqICgqZ2V0X3NlY3Rpb24pKHZvaWQgKmRiLCBjaGFyICpzZWN0aW9uKTsKK3ZvaWQgKCpmcmVlX3N0cmluZykodm9pZCAqZGIsIGNoYXIgKiBzdHJpbmcpOwordm9pZCAoKmZyZWVfc2VjdGlvbikodm9pZCAqZGIsIFNUQUNLX09GKENPTkZfVkFMVUUpICpzZWN0aW9uKTsKK30gWDUwOVYzX0NPTkZfTUVUSE9EOworCisvKiBDb250ZXh0IHNwZWNpZmljIGluZm8gKi8KK3N0cnVjdCB2M19leHRfY3R4IHsKKyNkZWZpbmUgQ1RYX1RFU1QgMHgxCitpbnQgZmxhZ3M7CitYNTA5ICppc3N1ZXJfY2VydDsKK1g1MDkgKnN1YmplY3RfY2VydDsKK1g1MDlfUkVRICpzdWJqZWN0X3JlcTsKK1g1MDlfQ1JMICpjcmw7CitYNTA5VjNfQ09ORl9NRVRIT0QgKmRiX21ldGg7Cit2b2lkICpkYjsKKy8qIE1heWJlIG1vcmUgaGVyZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgdjNfZXh0X21ldGhvZCBYNTA5VjNfRVhUX01FVEhPRDsKKworREVDTEFSRV9TVEFDS19PRihYNTA5VjNfRVhUX01FVEhPRCkKKworLyogZXh0X2ZsYWdzIHZhbHVlcyAqLworI2RlZmluZSBYNTA5VjNfRVhUX0RZTkFNSUMJMHgxCisjZGVmaW5lIFg1MDlWM19FWFRfQ1RYX0RFUAkweDIKKyNkZWZpbmUgWDUwOVYzX0VYVF9NVUxUSUxJTkUJMHg0CisKK3R5cGVkZWYgQklUX1NUUklOR19CSVROQU1FIEVOVU1FUkFURURfTkFNRVM7CisKK3R5cGVkZWYgc3RydWN0IEJBU0lDX0NPTlNUUkFJTlRTX3N0IHsKK2ludCBjYTsKK0FTTjFfSU5URUdFUiAqcGF0aGxlbjsKK30gQkFTSUNfQ09OU1RSQUlOVFM7CisKKwordHlwZWRlZiBzdHJ1Y3QgUEtFWV9VU0FHRV9QRVJJT0Rfc3QgeworQVNOMV9HRU5FUkFMSVpFRFRJTUUgKm5vdEJlZm9yZTsKK0FTTjFfR0VORVJBTElaRURUSU1FICpub3RBZnRlcjsKK30gUEtFWV9VU0FHRV9QRVJJT0Q7CisKK3R5cGVkZWYgc3RydWN0IG90aGVyTmFtZV9zdCB7CitBU04xX09CSkVDVCAqdHlwZV9pZDsKK0FTTjFfVFlQRSAqdmFsdWU7Cit9IE9USEVSTkFNRTsKKwordHlwZWRlZiBzdHJ1Y3QgRURJUGFydHlOYW1lX3N0IHsKKwlBU04xX1NUUklORyAqbmFtZUFzc2lnbmVyOworCUFTTjFfU1RSSU5HICpwYXJ0eU5hbWU7Cit9IEVESVBBUlRZTkFNRTsKKwordHlwZWRlZiBzdHJ1Y3QgR0VORVJBTF9OQU1FX3N0IHsKKworI2RlZmluZSBHRU5fT1RIRVJOQU1FCTAKKyNkZWZpbmUgR0VOX0VNQUlMCTEKKyNkZWZpbmUgR0VOX0ROUwkJMgorI2RlZmluZSBHRU5fWDQwMAkzCisjZGVmaW5lIEdFTl9ESVJOQU1FCTQKKyNkZWZpbmUgR0VOX0VESVBBUlRZCTUKKyNkZWZpbmUgR0VOX1VSSQkJNgorI2RlZmluZSBHRU5fSVBBREQJNworI2RlZmluZSBHRU5fUklECQk4CisKK2ludCB0eXBlOwordW5pb24geworCWNoYXIgKnB0cjsKKwlPVEhFUk5BTUUgKm90aGVyTmFtZTsgLyogb3RoZXJOYW1lICovCisJQVNOMV9JQTVTVFJJTkcgKnJmYzgyMk5hbWU7CisJQVNOMV9JQTVTVFJJTkcgKmROU05hbWU7CisJQVNOMV9UWVBFICp4NDAwQWRkcmVzczsKKwlYNTA5X05BTUUgKmRpcmVjdG9yeU5hbWU7CisJRURJUEFSVFlOQU1FICplZGlQYXJ0eU5hbWU7CisJQVNOMV9JQTVTVFJJTkcgKnVuaWZvcm1SZXNvdXJjZUlkZW50aWZpZXI7CisJQVNOMV9PQ1RFVF9TVFJJTkcgKmlQQWRkcmVzczsKKwlBU04xX09CSkVDVCAqcmVnaXN0ZXJlZElEOworCisJLyogT2xkIG5hbWVzICovCisJQVNOMV9PQ1RFVF9TVFJJTkcgKmlwOyAvKiBpUEFkZHJlc3MgKi8KKwlYNTA5X05BTUUgKmRpcm47CQkvKiBkaXJuICovCisJQVNOMV9JQTVTVFJJTkcgKmlhNTsvKiByZmM4MjJOYW1lLCBkTlNOYW1lLCB1bmlmb3JtUmVzb3VyY2VJZGVudGlmaWVyICovCisJQVNOMV9PQkpFQ1QgKnJpZDsgLyogcmVnaXN0ZXJlZElEICovCisJQVNOMV9UWVBFICpvdGhlcjsgLyogeDQwMEFkZHJlc3MgKi8KK30gZDsKK30gR0VORVJBTF9OQU1FOworCit0eXBlZGVmIFNUQUNLX09GKEdFTkVSQUxfTkFNRSkgR0VORVJBTF9OQU1FUzsKKwordHlwZWRlZiBzdHJ1Y3QgQUNDRVNTX0RFU0NSSVBUSU9OX3N0IHsKKwlBU04xX09CSkVDVCAqbWV0aG9kOworCUdFTkVSQUxfTkFNRSAqbG9jYXRpb247Cit9IEFDQ0VTU19ERVNDUklQVElPTjsKKwordHlwZWRlZiBTVEFDS19PRihBQ0NFU1NfREVTQ1JJUFRJT04pIEFVVEhPUklUWV9JTkZPX0FDQ0VTUzsKKwordHlwZWRlZiBTVEFDS19PRihBU04xX09CSkVDVCkgRVhURU5ERURfS0VZX1VTQUdFOworCitERUNMQVJFX1NUQUNLX09GKEdFTkVSQUxfTkFNRSkKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoR0VORVJBTF9OQU1FKQorCitERUNMQVJFX1NUQUNLX09GKEFDQ0VTU19ERVNDUklQVElPTikKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoQUNDRVNTX0RFU0NSSVBUSU9OKQorCit0eXBlZGVmIHN0cnVjdCBESVNUX1BPSU5UX05BTUVfc3QgeworaW50IHR5cGU7Cit1bmlvbiB7CisJR0VORVJBTF9OQU1FUyAqZnVsbG5hbWU7CisJU1RBQ0tfT0YoWDUwOV9OQU1FX0VOVFJZKSAqcmVsYXRpdmVuYW1lOworfSBuYW1lOworLyogSWYgcmVsYXRpdmVuYW1lIHRoZW4gdGhpcyBjb250YWlucyB0aGUgZnVsbCBkaXN0cmlidXRpb24gcG9pbnQgbmFtZSAqLworWDUwOV9OQU1FICpkcG5hbWU7Cit9IERJU1RfUE9JTlRfTkFNRTsKKy8qIEFsbCBleGlzdGluZyByZWFzb25zICovCisjZGVmaW5lIENSTERQX0FMTF9SRUFTT05TCTB4ODA3ZgorCisjZGVmaW5lIENSTF9SRUFTT05fTk9ORQkJCQktMQorI2RlZmluZSBDUkxfUkVBU09OX1VOU1BFQ0lGSUVECQkJMAorI2RlZmluZSBDUkxfUkVBU09OX0tFWV9DT01QUk9NSVNFCQkxCisjZGVmaW5lIENSTF9SRUFTT05fQ0FfQ09NUFJPTUlTRQkJMgorI2RlZmluZSBDUkxfUkVBU09OX0FGRklMSUFUSU9OX0NIQU5HRUQJCTMKKyNkZWZpbmUgQ1JMX1JFQVNPTl9TVVBFUlNFREVECQkJNAorI2RlZmluZSBDUkxfUkVBU09OX0NFU1NBVElPTl9PRl9PUEVSQVRJT04JNQorI2RlZmluZSBDUkxfUkVBU09OX0NFUlRJRklDQVRFX0hPTEQJCTYKKyNkZWZpbmUgQ1JMX1JFQVNPTl9SRU1PVkVfRlJPTV9DUkwJCTgKKyNkZWZpbmUgQ1JMX1JFQVNPTl9QUklWSUxFR0VfV0lUSERSQVdOCQk5CisjZGVmaW5lIENSTF9SRUFTT05fQUFfQ09NUFJPTUlTRQkJMTAKKworc3RydWN0IERJU1RfUE9JTlRfc3QgeworRElTVF9QT0lOVF9OQU1FCSpkaXN0cG9pbnQ7CitBU04xX0JJVF9TVFJJTkcgKnJlYXNvbnM7CitHRU5FUkFMX05BTUVTICpDUkxpc3N1ZXI7CitpbnQgZHBfcmVhc29uczsKK307CisKK3R5cGVkZWYgU1RBQ0tfT0YoRElTVF9QT0lOVCkgQ1JMX0RJU1RfUE9JTlRTOworCitERUNMQVJFX1NUQUNLX09GKERJU1RfUE9JTlQpCitERUNMQVJFX0FTTjFfU0VUX09GKERJU1RfUE9JTlQpCisKK3N0cnVjdCBBVVRIT1JJVFlfS0VZSURfc3QgeworQVNOMV9PQ1RFVF9TVFJJTkcgKmtleWlkOworR0VORVJBTF9OQU1FUyAqaXNzdWVyOworQVNOMV9JTlRFR0VSICpzZXJpYWw7Cit9OworCisvKiBTdHJvbmcgZXh0cmFuZXQgc3RydWN0dXJlcyAqLworCit0eXBlZGVmIHN0cnVjdCBTWE5FVF9JRF9zdCB7CisJQVNOMV9JTlRFR0VSICp6b25lOworCUFTTjFfT0NURVRfU1RSSU5HICp1c2VyOworfSBTWE5FVElEOworCitERUNMQVJFX1NUQUNLX09GKFNYTkVUSUQpCitERUNMQVJFX0FTTjFfU0VUX09GKFNYTkVUSUQpCisKK3R5cGVkZWYgc3RydWN0IFNYTkVUX3N0IHsKKwlBU04xX0lOVEVHRVIgKnZlcnNpb247CisJU1RBQ0tfT0YoU1hORVRJRCkgKmlkczsKK30gU1hORVQ7CisKK3R5cGVkZWYgc3RydWN0IE5PVElDRVJFRl9zdCB7CisJQVNOMV9TVFJJTkcgKm9yZ2FuaXphdGlvbjsKKwlTVEFDS19PRihBU04xX0lOVEVHRVIpICpub3RpY2Vub3M7Cit9IE5PVElDRVJFRjsKKwordHlwZWRlZiBzdHJ1Y3QgVVNFUk5PVElDRV9zdCB7CisJTk9USUNFUkVGICpub3RpY2VyZWY7CisJQVNOMV9TVFJJTkcgKmV4cHRleHQ7Cit9IFVTRVJOT1RJQ0U7CisKK3R5cGVkZWYgc3RydWN0IFBPTElDWVFVQUxJTkZPX3N0IHsKKwlBU04xX09CSkVDVCAqcHF1YWxpZDsKKwl1bmlvbiB7CisJCUFTTjFfSUE1U1RSSU5HICpjcHN1cmk7CisJCVVTRVJOT1RJQ0UgKnVzZXJub3RpY2U7CisJCUFTTjFfVFlQRSAqb3RoZXI7CisJfSBkOworfSBQT0xJQ1lRVUFMSU5GTzsKKworREVDTEFSRV9TVEFDS19PRihQT0xJQ1lRVUFMSU5GTykKK0RFQ0xBUkVfQVNOMV9TRVRfT0YoUE9MSUNZUVVBTElORk8pCisKK3R5cGVkZWYgc3RydWN0IFBPTElDWUlORk9fc3QgeworCUFTTjFfT0JKRUNUICpwb2xpY3lpZDsKKwlTVEFDS19PRihQT0xJQ1lRVUFMSU5GTykgKnF1YWxpZmllcnM7Cit9IFBPTElDWUlORk87CisKK3R5cGVkZWYgU1RBQ0tfT0YoUE9MSUNZSU5GTykgQ0VSVElGSUNBVEVQT0xJQ0lFUzsKKworREVDTEFSRV9TVEFDS19PRihQT0xJQ1lJTkZPKQorREVDTEFSRV9BU04xX1NFVF9PRihQT0xJQ1lJTkZPKQorCit0eXBlZGVmIHN0cnVjdCBQT0xJQ1lfTUFQUElOR19zdCB7CisJQVNOMV9PQkpFQ1QgKmlzc3VlckRvbWFpblBvbGljeTsKKwlBU04xX09CSkVDVCAqc3ViamVjdERvbWFpblBvbGljeTsKK30gUE9MSUNZX01BUFBJTkc7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoUE9MSUNZX01BUFBJTkcpCisKK3R5cGVkZWYgU1RBQ0tfT0YoUE9MSUNZX01BUFBJTkcpIFBPTElDWV9NQVBQSU5HUzsKKwordHlwZWRlZiBzdHJ1Y3QgR0VORVJBTF9TVUJUUkVFX3N0IHsKKwlHRU5FUkFMX05BTUUgKmJhc2U7CisJQVNOMV9JTlRFR0VSICptaW5pbXVtOworCUFTTjFfSU5URUdFUiAqbWF4aW11bTsKK30gR0VORVJBTF9TVUJUUkVFOworCitERUNMQVJFX1NUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkKKworc3RydWN0IE5BTUVfQ09OU1RSQUlOVFNfc3QgeworCVNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKnBlcm1pdHRlZFN1YnRyZWVzOworCVNUQUNLX09GKEdFTkVSQUxfU1VCVFJFRSkgKmV4Y2x1ZGVkU3VidHJlZXM7Cit9OworCit0eXBlZGVmIHN0cnVjdCBQT0xJQ1lfQ09OU1RSQUlOVFNfc3QgeworCUFTTjFfSU5URUdFUiAqcmVxdWlyZUV4cGxpY2l0UG9saWN5OworCUFTTjFfSU5URUdFUiAqaW5oaWJpdFBvbGljeU1hcHBpbmc7Cit9IFBPTElDWV9DT05TVFJBSU5UUzsKKworLyogUHJveHkgY2VydGlmaWNhdGUgc3RydWN0dXJlcywgc2VlIFJGQyAzODIwICovCit0eXBlZGVmIHN0cnVjdCBQUk9YWV9QT0xJQ1lfc3QKKwl7CisJQVNOMV9PQkpFQ1QgKnBvbGljeUxhbmd1YWdlOworCUFTTjFfT0NURVRfU1RSSU5HICpwb2xpY3k7CisJfSBQUk9YWV9QT0xJQ1k7CisKK3R5cGVkZWYgc3RydWN0IFBST1hZX0NFUlRfSU5GT19FWFRFTlNJT05fc3QKKwl7CisJQVNOMV9JTlRFR0VSICpwY1BhdGhMZW5ndGhDb25zdHJhaW50OworCVBST1hZX1BPTElDWSAqcHJveHlQb2xpY3k7CisJfSBQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBST1hZX1BPTElDWSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTikKKworc3RydWN0IElTU1VJTkdfRElTVF9QT0lOVF9zdAorCXsKKwlESVNUX1BPSU5UX05BTUUgKmRpc3Rwb2ludDsKKwlpbnQgb25seXVzZXI7CisJaW50IG9ubHlDQTsKKwlBU04xX0JJVF9TVFJJTkcgKm9ubHlzb21lcmVhc29uczsKKwlpbnQgaW5kaXJlY3RDUkw7CisJaW50IG9ubHlhdHRyOworCX07CisKKy8qIFZhbHVlcyBpbiBpZHBfZmxhZ3MgZmllbGQgKi8KKy8qIElEUCBwcmVzZW50ICovCisjZGVmaW5lCUlEUF9QUkVTRU5UCTB4MQorLyogSURQIHZhbHVlcyBpbmNvbnNpc3RlbnQgKi8KKyNkZWZpbmUgSURQX0lOVkFMSUQJMHgyCisvKiBvbmx5dXNlciB0cnVlICovCisjZGVmaW5lCUlEUF9PTkxZVVNFUgkweDQKKy8qIG9ubHlDQSB0cnVlICovCisjZGVmaW5lCUlEUF9PTkxZQ0EJMHg4CisvKiBvbmx5YXR0ciB0cnVlICovCisjZGVmaW5lIElEUF9PTkxZQVRUUgkweDEwCisvKiBpbmRpcmVjdENSTCB0cnVlICovCisjZGVmaW5lIElEUF9JTkRJUkVDVAkweDIwCisvKiBvbmx5c29tZXJlYXNvbnMgcHJlc2VudCAqLworI2RlZmluZSBJRFBfUkVBU09OUwkweDQwCisKKyNkZWZpbmUgWDUwOVYzX2NvbmZfZXJyKHZhbCkgRVJSX2FkZF9lcnJvcl9kYXRhKDYsICJzZWN0aW9uOiIsIHZhbC0+c2VjdGlvbiwgXAorIixuYW1lOiIsIHZhbC0+bmFtZSwgIix2YWx1ZToiLCB2YWwtPnZhbHVlKTsKKworI2RlZmluZSBYNTA5VjNfc2V0X2N0eF90ZXN0KGN0eCkgXAorCQkJWDUwOVYzX3NldF9jdHgoY3R4LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBDVFhfVEVTVCkKKyNkZWZpbmUgWDUwOVYzX3NldF9jdHhfbm9kYihjdHgpIChjdHgpLT5kYiA9IE5VTEw7CisKKyNkZWZpbmUgRVhUX0JJVFNUUklORyhuaWQsIHRhYmxlKSB7IG5pZCwgMCwgQVNOMV9JVEVNX3JlZihBU04xX0JJVF9TVFJJTkcpLCBcCisJCQkwLDAsMCwwLCBcCisJCQkwLDAsIFwKKwkJCShYNTA5VjNfRVhUX0kyVilpMnZfQVNOMV9CSVRfU1RSSU5HLCBcCisJCQkoWDUwOVYzX0VYVF9WMkkpdjJpX0FTTjFfQklUX1NUUklORywgXAorCQkJTlVMTCwgTlVMTCwgXAorCQkJdGFibGV9CisKKyNkZWZpbmUgRVhUX0lBNVNUUklORyhuaWQpIHsgbmlkLCAwLCBBU04xX0lURU1fcmVmKEFTTjFfSUE1U1RSSU5HKSwgXAorCQkJMCwwLDAsMCwgXAorCQkJKFg1MDlWM19FWFRfSTJTKWkyc19BU04xX0lBNVNUUklORywgXAorCQkJKFg1MDlWM19FWFRfUzJJKXMyaV9BU04xX0lBNVNUUklORywgXAorCQkJMCwwLDAsMCwgXAorCQkJTlVMTH0KKworI2RlZmluZSBFWFRfRU5EIHsgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisKKworLyogWDUwOV9QVVJQT1NFIHN0dWZmICovCisKKyNkZWZpbmUgRVhGTEFHX0JDT05TCQkweDEKKyNkZWZpbmUgRVhGTEFHX0tVU0FHRQkJMHgyCisjZGVmaW5lIEVYRkxBR19YS1VTQUdFCQkweDQKKyNkZWZpbmUgRVhGTEFHX05TQ0VSVAkJMHg4CisKKyNkZWZpbmUgRVhGTEFHX0NBCQkweDEwCisvKiBSZWFsbHkgc2VsZiBpc3N1ZWQgbm90IG5lY2Vzc2FyaWx5IHNlbGYgc2lnbmVkICovCisjZGVmaW5lIEVYRkxBR19TSQkJMHgyMAorI2RlZmluZSBFWEZMQUdfU1MJCTB4MjAKKyNkZWZpbmUgRVhGTEFHX1YxCQkweDQwCisjZGVmaW5lIEVYRkxBR19JTlZBTElECQkweDgwCisjZGVmaW5lIEVYRkxBR19TRVQJCTB4MTAwCisjZGVmaW5lIEVYRkxBR19DUklUSUNBTAkJMHgyMDAKKyNkZWZpbmUgRVhGTEFHX1BST1hZCQkweDQwMAorCisjZGVmaW5lIEVYRkxBR19JTlZBTElEX1BPTElDWQkweDgwMAorI2RlZmluZSBFWEZMQUdfRlJFU0hFU1QJCTB4MTAwMAorCisjZGVmaW5lIEtVX0RJR0lUQUxfU0lHTkFUVVJFCTB4MDA4MAorI2RlZmluZSBLVV9OT05fUkVQVURJQVRJT04JMHgwMDQwCisjZGVmaW5lIEtVX0tFWV9FTkNJUEhFUk1FTlQJMHgwMDIwCisjZGVmaW5lIEtVX0RBVEFfRU5DSVBIRVJNRU5UCTB4MDAxMAorI2RlZmluZSBLVV9LRVlfQUdSRUVNRU5UCTB4MDAwOAorI2RlZmluZSBLVV9LRVlfQ0VSVF9TSUdOCTB4MDAwNAorI2RlZmluZSBLVV9DUkxfU0lHTgkJMHgwMDAyCisjZGVmaW5lIEtVX0VOQ0lQSEVSX09OTFkJMHgwMDAxCisjZGVmaW5lIEtVX0RFQ0lQSEVSX09OTFkJMHg4MDAwCisKKyNkZWZpbmUgTlNfU1NMX0NMSUVOVAkJMHg4MAorI2RlZmluZSBOU19TU0xfU0VSVkVSCQkweDQwCisjZGVmaW5lIE5TX1NNSU1FCQkweDIwCisjZGVmaW5lIE5TX09CSlNJR04JCTB4MTAKKyNkZWZpbmUgTlNfU1NMX0NBCQkweDA0CisjZGVmaW5lIE5TX1NNSU1FX0NBCQkweDAyCisjZGVmaW5lIE5TX09CSlNJR05fQ0EJCTB4MDEKKyNkZWZpbmUgTlNfQU5ZX0NBCQkoTlNfU1NMX0NBfE5TX1NNSU1FX0NBfE5TX09CSlNJR05fQ0EpCisKKyNkZWZpbmUgWEtVX1NTTF9TRVJWRVIJCTB4MQkKKyNkZWZpbmUgWEtVX1NTTF9DTElFTlQJCTB4MgorI2RlZmluZSBYS1VfU01JTUUJCTB4NAorI2RlZmluZSBYS1VfQ09ERV9TSUdOCQkweDgKKyNkZWZpbmUgWEtVX1NHQwkJCTB4MTAKKyNkZWZpbmUgWEtVX09DU1BfU0lHTgkJMHgyMAorI2RlZmluZSBYS1VfVElNRVNUQU1QCQkweDQwCisjZGVmaW5lIFhLVV9EVkNTCQkweDgwCisKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX0RZTkFNSUMJMHgxCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9EWU5BTUlDX05BTUUJMHgyCisKK3R5cGVkZWYgc3RydWN0IHg1MDlfcHVycG9zZV9zdCB7CisJaW50IHB1cnBvc2U7CisJaW50IHRydXN0OwkJLyogRGVmYXVsdCB0cnVzdCBJRCAqLworCWludCBmbGFnczsKKwlpbnQgKCpjaGVja19wdXJwb3NlKShjb25zdCBzdHJ1Y3QgeDUwOV9wdXJwb3NlX3N0ICosCisJCQkJY29uc3QgWDUwOSAqLCBpbnQpOworCWNoYXIgKm5hbWU7CisJY2hhciAqc25hbWU7CisJdm9pZCAqdXNyX2RhdGE7Cit9IFg1MDlfUFVSUE9TRTsKKworI2RlZmluZSBYNTA5X1BVUlBPU0VfU1NMX0NMSUVOVAkJMQorI2RlZmluZSBYNTA5X1BVUlBPU0VfU1NMX1NFUlZFUgkJMgorI2RlZmluZSBYNTA5X1BVUlBPU0VfTlNfU1NMX1NFUlZFUgkzCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9TTUlNRV9TSUdOCQk0CisjZGVmaW5lIFg1MDlfUFVSUE9TRV9TTUlNRV9FTkNSWVBUCTUKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX0NSTF9TSUdOCQk2CisjZGVmaW5lIFg1MDlfUFVSUE9TRV9BTlkJCTcKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX09DU1BfSEVMUEVSCTgKKyNkZWZpbmUgWDUwOV9QVVJQT1NFX1RJTUVTVEFNUF9TSUdOCTkKKworI2RlZmluZSBYNTA5X1BVUlBPU0VfTUlOCQkxCisjZGVmaW5lIFg1MDlfUFVSUE9TRV9NQVgJCTkKKworLyogRmxhZ3MgZm9yIFg1MDlWM19FWFRfcHJpbnQoKSAqLworCisjZGVmaW5lIFg1MDlWM19FWFRfVU5LTk9XTl9NQVNLCQkoMHhmTCA8PCAxNikKKy8qIFJldHVybiBlcnJvciBmb3IgdW5rbm93biBleHRlbnNpb25zICovCisjZGVmaW5lIFg1MDlWM19FWFRfREVGQVVMVAkJMAorLyogUHJpbnQgZXJyb3IgZm9yIHVua25vd24gZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYNTA5VjNfRVhUX0VSUk9SX1VOS05PV04JKDFMIDw8IDE2KQorLyogQVNOMSBwYXJzZSB1bmtub3duIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDUwOVYzX0VYVF9QQVJTRV9VTktOT1dOCSgyTCA8PCAxNikKKy8qIEJJT19kdW1wIHVua25vd24gZXh0ZW5zaW9ucyAqLworI2RlZmluZSBYNTA5VjNfRVhUX0RVTVBfVU5LTk9XTgkJKDNMIDw8IDE2KQorCisvKiBGbGFncyBmb3IgWDUwOVYzX2FkZDFfaTJkICovCisKKyNkZWZpbmUgWDUwOVYzX0FERF9PUF9NQVNLCQkweGZMCisjZGVmaW5lIFg1MDlWM19BRERfREVGQVVMVAkJMEwKKyNkZWZpbmUgWDUwOVYzX0FERF9BUFBFTkQJCTFMCisjZGVmaW5lIFg1MDlWM19BRERfUkVQTEFDRQkJMkwKKyNkZWZpbmUgWDUwOVYzX0FERF9SRVBMQUNFX0VYSVNUSU5HCTNMCisjZGVmaW5lIFg1MDlWM19BRERfS0VFUF9FWElTVElORwk0TAorI2RlZmluZSBYNTA5VjNfQUREX0RFTEVURQkJNUwKKyNkZWZpbmUgWDUwOVYzX0FERF9TSUxFTlQJCTB4MTAKKworREVDTEFSRV9TVEFDS19PRihYNTA5X1BVUlBPU0UpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQkFTSUNfQ09OU1RSQUlOVFMpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoU1hORVQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFNYTkVUSUQpCisKK2ludCBTWE5FVF9hZGRfaWRfYXNjKFNYTkVUICoqcHN4LCBjaGFyICp6b25lLCBjaGFyICp1c2VyLCBpbnQgdXNlcmxlbik7IAoraW50IFNYTkVUX2FkZF9pZF91bG9uZyhTWE5FVCAqKnBzeCwgdW5zaWduZWQgbG9uZyBsem9uZSwgY2hhciAqdXNlciwgaW50IHVzZXJsZW4pOyAKK2ludCBTWE5FVF9hZGRfaWRfSU5URUdFUihTWE5FVCAqKnBzeCwgQVNOMV9JTlRFR0VSICppem9uZSwgY2hhciAqdXNlciwgaW50IHVzZXJsZW4pOyAKKworQVNOMV9PQ1RFVF9TVFJJTkcgKlNYTkVUX2dldF9pZF9hc2MoU1hORVQgKnN4LCBjaGFyICp6b25lKTsKK0FTTjFfT0NURVRfU1RSSU5HICpTWE5FVF9nZXRfaWRfdWxvbmcoU1hORVQgKnN4LCB1bnNpZ25lZCBsb25nIGx6b25lKTsKK0FTTjFfT0NURVRfU1RSSU5HICpTWE5FVF9nZXRfaWRfSU5URUdFUihTWE5FVCAqc3gsIEFTTjFfSU5URUdFUiAqem9uZSk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVVUSE9SSVRZX0tFWUlEKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFBLRVlfVVNBR0VfUEVSSU9EKQorCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEdFTkVSQUxfTkFNRSkKK0dFTkVSQUxfTkFNRSAqR0VORVJBTF9OQU1FX2R1cChHRU5FUkFMX05BTUUgKmEpOworaW50IEdFTkVSQUxfTkFNRV9jbXAoR0VORVJBTF9OQU1FICphLCBHRU5FUkFMX05BTUUgKmIpOworCisKKworQVNOMV9CSVRfU1RSSU5HICp2MmlfQVNOMV9CSVRfU1RSSU5HKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsCisJCQkJWDUwOVYzX0NUWCAqY3R4LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqbnZhbCk7CitTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0FTTjFfQklUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCUFTTjFfQklUX1NUUklORyAqYml0cywKKwkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCk7CisKK1NUQUNLX09GKENPTkZfVkFMVUUpICppMnZfR0VORVJBTF9OQU1FKFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIEdFTkVSQUxfTkFNRSAqZ2VuLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqcmV0KTsKK2ludCBHRU5FUkFMX05BTUVfcHJpbnQoQklPICpvdXQsIEdFTkVSQUxfTkFNRSAqZ2VuKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhHRU5FUkFMX05BTUVTKQorCitTVEFDS19PRihDT05GX1ZBTFVFKSAqaTJ2X0dFTkVSQUxfTkFNRVMoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJR0VORVJBTF9OQU1FUyAqZ2VuLCBTVEFDS19PRihDT05GX1ZBTFVFKSAqZXh0bGlzdCk7CitHRU5FUkFMX05BTUVTICp2MmlfR0VORVJBTF9OQU1FUyhjb25zdCBYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLAorCQkJCSBYNTA5VjNfQ1RYICpjdHgsIFNUQUNLX09GKENPTkZfVkFMVUUpICpudmFsKTsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhPVEhFUk5BTUUpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEVESVBBUlRZTkFNRSkKK2ludCBPVEhFUk5BTUVfY21wKE9USEVSTkFNRSAqYSwgT1RIRVJOQU1FICpiKTsKK3ZvaWQgR0VORVJBTF9OQU1FX3NldDBfdmFsdWUoR0VORVJBTF9OQU1FICphLCBpbnQgdHlwZSwgdm9pZCAqdmFsdWUpOwordm9pZCAqR0VORVJBTF9OQU1FX2dldDBfdmFsdWUoR0VORVJBTF9OQU1FICphLCBpbnQgKnB0eXBlKTsKK2ludCBHRU5FUkFMX05BTUVfc2V0MF9vdGhlcm5hbWUoR0VORVJBTF9OQU1FICpnZW4sCisJCQkJQVNOMV9PQkpFQ1QgKm9pZCwgQVNOMV9UWVBFICp2YWx1ZSk7CitpbnQgR0VORVJBTF9OQU1FX2dldDBfb3RoZXJOYW1lKEdFTkVSQUxfTkFNRSAqZ2VuLCAKKwkJCQlBU04xX09CSkVDVCAqKnBvaWQsIEFTTjFfVFlQRSAqKnB2YWx1ZSk7CisKK2NoYXIgKmkyc19BU04xX09DVEVUX1NUUklORyhYNTA5VjNfRVhUX01FVEhPRCAqbWV0aG9kLCBBU04xX09DVEVUX1NUUklORyAqaWE1KTsKK0FTTjFfT0NURVRfU1RSSU5HICpzMmlfQVNOMV9PQ1RFVF9TVFJJTkcoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwgWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpzdHIpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEVYVEVOREVEX0tFWV9VU0FHRSkKK2ludCBpMmFfQUNDRVNTX0RFU0NSSVBUSU9OKEJJTyAqYnAsIEFDQ0VTU19ERVNDUklQVElPTiogYSk7CisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQ0VSVElGSUNBVEVQT0xJQ0lFUykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUE9MSUNZSU5GTykKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoUE9MSUNZUVVBTElORk8pCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKFVTRVJOT1RJQ0UpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKE5PVElDRVJFRikKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhDUkxfRElTVF9QT0lOVFMpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKERJU1RfUE9JTlQpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKERJU1RfUE9JTlRfTkFNRSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoSVNTVUlOR19ESVNUX1BPSU5UKQorCitpbnQgRElTVF9QT0lOVF9zZXRfZHBuYW1lKERJU1RfUE9JTlRfTkFNRSAqZHBuLCBYNTA5X05BTUUgKmluYW1lKTsKKworaW50IE5BTUVfQ09OU1RSQUlOVFNfY2hlY2soWDUwOSAqeCwgTkFNRV9DT05TVFJBSU5UUyAqbmMpOworCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKEFDQ0VTU19ERVNDUklQVElPTikKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVVUSE9SSVRZX0lORk9fQUNDRVNTKQorCitERUNMQVJFX0FTTjFfSVRFTShQT0xJQ1lfTUFQUElORykKK0RFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlMoUE9MSUNZX01BUFBJTkcpCitERUNMQVJFX0FTTjFfSVRFTShQT0xJQ1lfTUFQUElOR1MpCisKK0RFQ0xBUkVfQVNOMV9JVEVNKEdFTkVSQUxfU1VCVFJFRSkKK0RFQ0xBUkVfQVNOMV9BTExPQ19GVU5DVElPTlMoR0VORVJBTF9TVUJUUkVFKQorCitERUNMQVJFX0FTTjFfSVRFTShOQU1FX0NPTlNUUkFJTlRTKQorREVDTEFSRV9BU04xX0FMTE9DX0ZVTkNUSU9OUyhOQU1FX0NPTlNUUkFJTlRTKQorCitERUNMQVJFX0FTTjFfQUxMT0NfRlVOQ1RJT05TKFBPTElDWV9DT05TVFJBSU5UUykKK0RFQ0xBUkVfQVNOMV9JVEVNKFBPTElDWV9DT05TVFJBSU5UUykKKworR0VORVJBTF9OQU1FICphMmlfR0VORVJBTF9OQU1FKEdFTkVSQUxfTkFNRSAqb3V0LAorCQkJICAgICAgIGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICAgICBpbnQgZ2VuX3R5cGUsIGNoYXIgKnZhbHVlLCBpbnQgaXNfbmMpOworCisjaWZkZWYgSEVBREVSX0NPTkZfSAorR0VORVJBTF9OQU1FICp2MmlfR0VORVJBTF9OQU1FKGNvbnN0IFg1MDlWM19FWFRfTUVUSE9EICptZXRob2QsIFg1MDlWM19DVFggKmN0eCwKKwkJCSAgICAgICBDT05GX1ZBTFVFICpjbmYpOworR0VORVJBTF9OQU1FICp2MmlfR0VORVJBTF9OQU1FX2V4KEdFTkVSQUxfTkFNRSAqb3V0LAorCQkJCSAgY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGhvZCwKKwkJCQkgIFg1MDlWM19DVFggKmN0eCwgQ09ORl9WQUxVRSAqY25mLCBpbnQgaXNfbmMpOwordm9pZCBYNTA5VjNfY29uZl9mcmVlKENPTkZfVkFMVUUgKnZhbCk7CisKK1g1MDlfRVhURU5TSU9OICpYNTA5VjNfRVhUX25jb25mX25pZChDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGludCBleHRfbmlkLCBjaGFyICp2YWx1ZSk7CitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9uY29uZihDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTsKK2ludCBYNTA5VjNfRVhUX2FkZF9uY29uZl9zayhDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnNlY3Rpb24sIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKnNrKTsKK2ludCBYNTA5VjNfRVhUX2FkZF9uY29uZihDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnNlY3Rpb24sIFg1MDkgKmNlcnQpOworaW50IFg1MDlWM19FWFRfUkVRX2FkZF9uY29uZihDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnNlY3Rpb24sIFg1MDlfUkVRICpyZXEpOworaW50IFg1MDlWM19FWFRfQ1JMX2FkZF9uY29uZihDT05GICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnNlY3Rpb24sIFg1MDlfQ1JMICpjcmwpOworCitYNTA5X0VYVEVOU0lPTiAqWDUwOVYzX0VYVF9jb25mX25pZChMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LAorCQkJCSAgICBpbnQgZXh0X25pZCwgY2hhciAqdmFsdWUpOworWDUwOV9FWFRFTlNJT04gKlg1MDlWM19FWFRfY29uZihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LAorCQkJCWNoYXIgKm5hbWUsIGNoYXIgKnZhbHVlKTsKK2ludCBYNTA5VjNfRVhUX2FkZF9jb25mKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQljaGFyICpzZWN0aW9uLCBYNTA5ICpjZXJ0KTsKK2ludCBYNTA5VjNfRVhUX1JFUV9hZGRfY29uZihMSEFTSF9PRihDT05GX1ZBTFVFKSAqY29uZiwgWDUwOVYzX0NUWCAqY3R4LAorCQkJICAgIGNoYXIgKnNlY3Rpb24sIFg1MDlfUkVRICpyZXEpOworaW50IFg1MDlWM19FWFRfQ1JMX2FkZF9jb25mKExIQVNIX09GKENPTkZfVkFMVUUpICpjb25mLCBYNTA5VjNfQ1RYICpjdHgsCisJCQkgICAgY2hhciAqc2VjdGlvbiwgWDUwOV9DUkwgKmNybCk7CisKK2ludCBYNTA5VjNfYWRkX3ZhbHVlX2Jvb2xfbmYoY2hhciAqbmFtZSwgaW50IGFzbjFfYm9vbCwKKwkJCSAgICAgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KTsKK2ludCBYNTA5VjNfZ2V0X3ZhbHVlX2Jvb2woQ09ORl9WQUxVRSAqdmFsdWUsIGludCAqYXNuMV9ib29sKTsKK2ludCBYNTA5VjNfZ2V0X3ZhbHVlX2ludChDT05GX1ZBTFVFICp2YWx1ZSwgQVNOMV9JTlRFR0VSICoqYWludCk7Cit2b2lkIFg1MDlWM19zZXRfbmNvbmYoWDUwOVYzX0NUWCAqY3R4LCBDT05GICpjb25mKTsKK3ZvaWQgWDUwOVYzX3NldF9jb25mX2xoYXNoKFg1MDlWM19DVFggKmN0eCwgTEhBU0hfT0YoQ09ORl9WQUxVRSkgKmxoYXNoKTsKKyNlbmRpZgorCitjaGFyICogWDUwOVYzX2dldF9zdHJpbmcoWDUwOVYzX0NUWCAqY3R4LCBjaGFyICpuYW1lLCBjaGFyICpzZWN0aW9uKTsKK1NUQUNLX09GKENPTkZfVkFMVUUpICogWDUwOVYzX2dldF9zZWN0aW9uKFg1MDlWM19DVFggKmN0eCwgY2hhciAqc2VjdGlvbik7Cit2b2lkIFg1MDlWM19zdHJpbmdfZnJlZShYNTA5VjNfQ1RYICpjdHgsIGNoYXIgKnN0cik7Cit2b2lkIFg1MDlWM19zZWN0aW9uX2ZyZWUoIFg1MDlWM19DVFggKmN0eCwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKnNlY3Rpb24pOwordm9pZCBYNTA5VjNfc2V0X2N0eChYNTA5VjNfQ1RYICpjdHgsIFg1MDkgKmlzc3VlciwgWDUwOSAqc3ViamVjdCwKKwkJCQkgWDUwOV9SRVEgKnJlcSwgWDUwOV9DUkwgKmNybCwgaW50IGZsYWdzKTsKKworaW50IFg1MDlWM19hZGRfdmFsdWUoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworaW50IFg1MDlWM19hZGRfdmFsdWVfdWNoYXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqdmFsdWUsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworaW50IFg1MDlWM19hZGRfdmFsdWVfYm9vbChjb25zdCBjaGFyICpuYW1lLCBpbnQgYXNuMV9ib29sLAorCQkJCQkJU1RBQ0tfT0YoQ09ORl9WQUxVRSkgKipleHRsaXN0KTsKK2ludCBYNTA5VjNfYWRkX3ZhbHVlX2ludChjb25zdCBjaGFyICpuYW1lLCBBU04xX0lOVEVHRVIgKmFpbnQsCisJCQkJCQlTVEFDS19PRihDT05GX1ZBTFVFKSAqKmV4dGxpc3QpOworY2hhciAqIGkyc19BU04xX0lOVEVHRVIoWDUwOVYzX0VYVF9NRVRIT0QgKm1ldGgsIEFTTjFfSU5URUdFUiAqYWludCk7CitBU04xX0lOVEVHRVIgKiBzMmlfQVNOMV9JTlRFR0VSKFg1MDlWM19FWFRfTUVUSE9EICptZXRoLCBjaGFyICp2YWx1ZSk7CitjaGFyICogaTJzX0FTTjFfRU5VTUVSQVRFRChYNTA5VjNfRVhUX01FVEhPRCAqbWV0aCwgQVNOMV9FTlVNRVJBVEVEICphaW50KTsKK2NoYXIgKiBpMnNfQVNOMV9FTlVNRVJBVEVEX1RBQkxFKFg1MDlWM19FWFRfTUVUSE9EICptZXRoLCBBU04xX0VOVU1FUkFURUQgKmFpbnQpOworaW50IFg1MDlWM19FWFRfYWRkKFg1MDlWM19FWFRfTUVUSE9EICpleHQpOworaW50IFg1MDlWM19FWFRfYWRkX2xpc3QoWDUwOVYzX0VYVF9NRVRIT0QgKmV4dGxpc3QpOworaW50IFg1MDlWM19FWFRfYWRkX2FsaWFzKGludCBuaWRfdG8sIGludCBuaWRfZnJvbSk7Cit2b2lkIFg1MDlWM19FWFRfY2xlYW51cCh2b2lkKTsKKworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKlg1MDlWM19FWFRfZ2V0KFg1MDlfRVhURU5TSU9OICpleHQpOworY29uc3QgWDUwOVYzX0VYVF9NRVRIT0QgKlg1MDlWM19FWFRfZ2V0X25pZChpbnQgbmlkKTsKK2ludCBYNTA5VjNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnModm9pZCk7CitTVEFDS19PRihDT05GX1ZBTFVFKSAqWDUwOVYzX3BhcnNlX2xpc3QoY29uc3QgY2hhciAqbGluZSk7Cit2b2lkICpYNTA5VjNfRVhUX2QyaShYNTA5X0VYVEVOU0lPTiAqZXh0KTsKK3ZvaWQgKlg1MDlWM19nZXRfZDJpKFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqeCwgaW50IG5pZCwgaW50ICpjcml0LCBpbnQgKmlkeCk7CisKKworWDUwOV9FWFRFTlNJT04gKlg1MDlWM19FWFRfaTJkKGludCBleHRfbmlkLCBpbnQgY3JpdCwgdm9pZCAqZXh0X3N0cnVjKTsKK2ludCBYNTA5VjNfYWRkMV9pMmQoU1RBQ0tfT0YoWDUwOV9FWFRFTlNJT04pICoqeCwgaW50IG5pZCwgdm9pZCAqdmFsdWUsIGludCBjcml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKworY2hhciAqaGV4X3RvX3N0cmluZyhjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGxvbmcgbGVuKTsKK3Vuc2lnbmVkIGNoYXIgKnN0cmluZ190b19oZXgoY29uc3QgY2hhciAqc3RyLCBsb25nICpsZW4pOworaW50IG5hbWVfY21wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmNtcCk7CisKK3ZvaWQgWDUwOVYzX0VYVF92YWxfcHJuKEJJTyAqb3V0LCBTVEFDS19PRihDT05GX1ZBTFVFKSAqdmFsLCBpbnQgaW5kZW50LAorCQkJCQkJCQkgaW50IG1sKTsKK2ludCBYNTA5VjNfRVhUX3ByaW50KEJJTyAqb3V0LCBYNTA5X0VYVEVOU0lPTiAqZXh0LCB1bnNpZ25lZCBsb25nIGZsYWcsIGludCBpbmRlbnQpOworaW50IFg1MDlWM19FWFRfcHJpbnRfZnAoRklMRSAqb3V0LCBYNTA5X0VYVEVOU0lPTiAqZXh0LCBpbnQgZmxhZywgaW50IGluZGVudCk7CisKK2ludCBYNTA5VjNfZXh0ZW5zaW9uc19wcmludChCSU8gKm91dCwgY2hhciAqdGl0bGUsIFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqZXh0cywgdW5zaWduZWQgbG9uZyBmbGFnLCBpbnQgaW5kZW50KTsKKworaW50IFg1MDlfY2hlY2tfY2EoWDUwOSAqeCk7CitpbnQgWDUwOV9jaGVja19wdXJwb3NlKFg1MDkgKngsIGludCBpZCwgaW50IGNhKTsKK2ludCBYNTA5X3N1cHBvcnRlZF9leHRlbnNpb24oWDUwOV9FWFRFTlNJT04gKmV4KTsKK2ludCBYNTA5X1BVUlBPU0Vfc2V0KGludCAqcCwgaW50IHB1cnBvc2UpOworaW50IFg1MDlfY2hlY2tfaXNzdWVkKFg1MDkgKmlzc3VlciwgWDUwOSAqc3ViamVjdCk7CitpbnQgWDUwOV9jaGVja19ha2lkKFg1MDkgKmlzc3VlciwgQVVUSE9SSVRZX0tFWUlEICpha2lkKTsKK2ludCBYNTA5X1BVUlBPU0VfZ2V0X2NvdW50KHZvaWQpOworWDUwOV9QVVJQT1NFICogWDUwOV9QVVJQT1NFX2dldDAoaW50IGlkeCk7CitpbnQgWDUwOV9QVVJQT1NFX2dldF9ieV9zbmFtZShjaGFyICpzbmFtZSk7CitpbnQgWDUwOV9QVVJQT1NFX2dldF9ieV9pZChpbnQgaWQpOworaW50IFg1MDlfUFVSUE9TRV9hZGQoaW50IGlkLCBpbnQgdHJ1c3QsIGludCBmbGFncywKKwkJCWludCAoKmNrKShjb25zdCBYNTA5X1BVUlBPU0UgKiwgY29uc3QgWDUwOSAqLCBpbnQpLAorCQkJCWNoYXIgKm5hbWUsIGNoYXIgKnNuYW1lLCB2b2lkICphcmcpOworY2hhciAqWDUwOV9QVVJQT1NFX2dldDBfbmFtZShYNTA5X1BVUlBPU0UgKnhwKTsKK2NoYXIgKlg1MDlfUFVSUE9TRV9nZXQwX3NuYW1lKFg1MDlfUFVSUE9TRSAqeHApOworaW50IFg1MDlfUFVSUE9TRV9nZXRfdHJ1c3QoWDUwOV9QVVJQT1NFICp4cCk7Cit2b2lkIFg1MDlfUFVSUE9TRV9jbGVhbnVwKHZvaWQpOworaW50IFg1MDlfUFVSUE9TRV9nZXRfaWQoWDUwOV9QVVJQT1NFICopOworCitTVEFDS19PRihPUEVOU1NMX1NUUklORykgKlg1MDlfZ2V0MV9lbWFpbChYNTA5ICp4KTsKK1NUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqWDUwOV9SRVFfZ2V0MV9lbWFpbChYNTA5X1JFUSAqeCk7Cit2b2lkIFg1MDlfZW1haWxfZnJlZShTVEFDS19PRihPUEVOU1NMX1NUUklORykgKnNrKTsKK1NUQUNLX09GKE9QRU5TU0xfU1RSSU5HKSAqWDUwOV9nZXQxX29jc3AoWDUwOSAqeCk7CisKK0FTTjFfT0NURVRfU1RSSU5HICphMmlfSVBBRERSRVNTKGNvbnN0IGNoYXIgKmlwYXNjKTsKK0FTTjFfT0NURVRfU1RSSU5HICphMmlfSVBBRERSRVNTX05DKGNvbnN0IGNoYXIgKmlwYXNjKTsKK2ludCBhMmlfaXBhZGQodW5zaWduZWQgY2hhciAqaXBvdXQsIGNvbnN0IGNoYXIgKmlwYXNjKTsKK2ludCBYNTA5VjNfTkFNRV9mcm9tX3NlY3Rpb24oWDUwOV9OQU1FICpubSwgU1RBQ0tfT0YoQ09ORl9WQUxVRSkqZG5fc2ssCisJCQkJCQl1bnNpZ25lZCBsb25nIGNodHlwZSk7CisKK3ZvaWQgWDUwOV9QT0xJQ1lfTk9ERV9wcmludChCSU8gKm91dCwgWDUwOV9QT0xJQ1lfTk9ERSAqbm9kZSwgaW50IGluZGVudCk7CitERUNMQVJFX1NUQUNLX09GKFg1MDlfUE9MSUNZX05PREUpCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SRkMzNzc5CisKK3R5cGVkZWYgc3RydWN0IEFTUmFuZ2Vfc3QgeworICBBU04xX0lOVEVHRVIgKm1pbiwgKm1heDsKK30gQVNSYW5nZTsKKworI2RlZmluZQlBU0lkT3JSYW5nZV9pZAkJMAorI2RlZmluZQlBU0lkT3JSYW5nZV9yYW5nZQkxCisKK3R5cGVkZWYgc3RydWN0IEFTSWRPclJhbmdlX3N0IHsKKyAgaW50IHR5cGU7CisgIHVuaW9uIHsKKyAgICBBU04xX0lOVEVHRVIgKmlkOworICAgIEFTUmFuZ2UgICAgICAqcmFuZ2U7CisgIH0gdTsKK30gQVNJZE9yUmFuZ2U7CisKK3R5cGVkZWYgU1RBQ0tfT0YoQVNJZE9yUmFuZ2UpIEFTSWRPclJhbmdlczsKK0RFQ0xBUkVfU1RBQ0tfT0YoQVNJZE9yUmFuZ2UpCisKKyNkZWZpbmUJQVNJZGVudGlmaWVyQ2hvaWNlX2luaGVyaXQJCTAKKyNkZWZpbmUJQVNJZGVudGlmaWVyQ2hvaWNlX2FzSWRzT3JSYW5nZXMJMQorCit0eXBlZGVmIHN0cnVjdCBBU0lkZW50aWZpZXJDaG9pY2Vfc3QgeworICBpbnQgdHlwZTsKKyAgdW5pb24geworICAgIEFTTjFfTlVMTCAgICAqaW5oZXJpdDsKKyAgICBBU0lkT3JSYW5nZXMgKmFzSWRzT3JSYW5nZXM7CisgIH0gdTsKK30gQVNJZGVudGlmaWVyQ2hvaWNlOworCit0eXBlZGVmIHN0cnVjdCBBU0lkZW50aWZpZXJzX3N0IHsKKyAgQVNJZGVudGlmaWVyQ2hvaWNlICphc251bSwgKnJkaTsKK30gQVNJZGVudGlmaWVyczsKKworREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU1JhbmdlKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU0lkT3JSYW5nZSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoQVNJZGVudGlmaWVyQ2hvaWNlKQorREVDTEFSRV9BU04xX0ZVTkNUSU9OUyhBU0lkZW50aWZpZXJzKQorCisKK3R5cGVkZWYgc3RydWN0IElQQWRkcmVzc1JhbmdlX3N0IHsKKyAgQVNOMV9CSVRfU1RSSU5HCSptaW4sICptYXg7Cit9IElQQWRkcmVzc1JhbmdlOworCisjZGVmaW5lCUlQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1ByZWZpeAkwCisjZGVmaW5lCUlQQWRkcmVzc09yUmFuZ2VfYWRkcmVzc1JhbmdlCTEKKwordHlwZWRlZiBzdHJ1Y3QgSVBBZGRyZXNzT3JSYW5nZV9zdCB7CisgIGludCB0eXBlOworICB1bmlvbiB7CisgICAgQVNOMV9CSVRfU1RSSU5HCSphZGRyZXNzUHJlZml4OworICAgIElQQWRkcmVzc1JhbmdlCSphZGRyZXNzUmFuZ2U7CisgIH0gdTsKK30gSVBBZGRyZXNzT3JSYW5nZTsKKwordHlwZWRlZiBTVEFDS19PRihJUEFkZHJlc3NPclJhbmdlKSBJUEFkZHJlc3NPclJhbmdlczsKK0RFQ0xBUkVfU1RBQ0tfT0YoSVBBZGRyZXNzT3JSYW5nZSkKKworI2RlZmluZQlJUEFkZHJlc3NDaG9pY2VfaW5oZXJpdAkJCTAKKyNkZWZpbmUJSVBBZGRyZXNzQ2hvaWNlX2FkZHJlc3Nlc09yUmFuZ2VzCTEKKwordHlwZWRlZiBzdHJ1Y3QgSVBBZGRyZXNzQ2hvaWNlX3N0IHsKKyAgaW50IHR5cGU7CisgIHVuaW9uIHsKKyAgICBBU04xX05VTEwJCSppbmhlcml0OworICAgIElQQWRkcmVzc09yUmFuZ2VzCSphZGRyZXNzZXNPclJhbmdlczsKKyAgfSB1OworfSBJUEFkZHJlc3NDaG9pY2U7CisKK3R5cGVkZWYgc3RydWN0IElQQWRkcmVzc0ZhbWlseV9zdCB7CisgIEFTTjFfT0NURVRfU1RSSU5HCSphZGRyZXNzRmFtaWx5OworICBJUEFkZHJlc3NDaG9pY2UJKmlwQWRkcmVzc0Nob2ljZTsKK30gSVBBZGRyZXNzRmFtaWx5OworCit0eXBlZGVmIFNUQUNLX09GKElQQWRkcmVzc0ZhbWlseSkgSVBBZGRyQmxvY2tzOworREVDTEFSRV9TVEFDS19PRihJUEFkZHJlc3NGYW1pbHkpCisKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoSVBBZGRyZXNzUmFuZ2UpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKElQQWRkcmVzc09yUmFuZ2UpCitERUNMQVJFX0FTTjFfRlVOQ1RJT05TKElQQWRkcmVzc0Nob2ljZSkKK0RFQ0xBUkVfQVNOMV9GVU5DVElPTlMoSVBBZGRyZXNzRmFtaWx5KQorCisvKgorICogQVBJIHRhZyBmb3IgZWxlbWVudHMgb2YgdGhlIEFTSWRlbnRpZmVyIFNFUVVFTkNFLgorICovCisjZGVmaW5lCVYzX0FTSURfQVNOVU0JMAorI2RlZmluZQlWM19BU0lEX1JESQkxCisKKy8qCisgKiBBRkkgdmFsdWVzLCBhc3NpZ25lZCBieSBJQU5BLiAgSXQnZCBiZSBuaWNlIHRvIG1ha2UgdGhlIEFGSQorICogaGFuZGxpbmcgY29kZSB0b3RhbGx5IGdlbmVyaWMsIGJ1dCB0aGVyZSBhcmUgdG9vIG1hbnkgbGl0dGxlIHRoaW5ncworICogdGhhdCB3b3VsZCBuZWVkIHRvIGJlIGRlZmluZWQgZm9yIG90aGVyIGFkZHJlc3MgZmFtaWxpZXMgZm9yIGl0IHRvCisgKiBiZSB3b3J0aCB0aGUgdHJvdWJsZS4KKyAqLworI2RlZmluZQlJQU5BX0FGSV9JUFY0CTEKKyNkZWZpbmUJSUFOQV9BRklfSVBWNgkyCisKKy8qCisgKiBVdGlsaXRpZXMgdG8gY29uc3RydWN0IGFuZCBleHRyYWN0IHZhbHVlcyBmcm9tIFJGQzM3NzkgZXh0ZW5zaW9ucywKKyAqIHNpbmNlIHNvbWUgb2YgdGhlIGVuY29kaW5ncyAocGFydGljdWxhcmx5IGZvciBJUCBhZGRyZXNzIHByZWZpeGVzCisgKiBhbmQgcmFuZ2VzKSBhcmUgYSBiaXQgdGVkaW91cyB0byB3b3JrIHdpdGggZGlyZWN0bHkuCisgKi8KK2ludCB2M19hc2lkX2FkZF9pbmhlcml0KEFTSWRlbnRpZmllcnMgKmFzaWQsIGludCB3aGljaCk7CitpbnQgdjNfYXNpZF9hZGRfaWRfb3JfcmFuZ2UoQVNJZGVudGlmaWVycyAqYXNpZCwgaW50IHdoaWNoLAorCQkJICAgIEFTTjFfSU5URUdFUiAqbWluLCBBU04xX0lOVEVHRVIgKm1heCk7CitpbnQgdjNfYWRkcl9hZGRfaW5oZXJpdChJUEFkZHJCbG9ja3MgKmFkZHIsCisJCQljb25zdCB1bnNpZ25lZCBhZmksIGNvbnN0IHVuc2lnbmVkICpzYWZpKTsKK2ludCB2M19hZGRyX2FkZF9wcmVmaXgoSVBBZGRyQmxvY2tzICphZGRyLAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgYWZpLCBjb25zdCB1bnNpZ25lZCAqc2FmaSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmEsIGNvbnN0IGludCBwcmVmaXhsZW4pOworaW50IHYzX2FkZHJfYWRkX3JhbmdlKElQQWRkckJsb2NrcyAqYWRkciwKKwkJICAgICAgY29uc3QgdW5zaWduZWQgYWZpLCBjb25zdCB1bnNpZ25lZCAqc2FmaSwKKwkJICAgICAgdW5zaWduZWQgY2hhciAqbWluLCB1bnNpZ25lZCBjaGFyICptYXgpOwordW5zaWduZWQgdjNfYWRkcl9nZXRfYWZpKGNvbnN0IElQQWRkcmVzc0ZhbWlseSAqZik7CitpbnQgdjNfYWRkcl9nZXRfcmFuZ2UoSVBBZGRyZXNzT3JSYW5nZSAqYW9yLCBjb25zdCB1bnNpZ25lZCBhZmksCisJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm1pbiwgdW5zaWduZWQgY2hhciAqbWF4LAorCQkgICAgICBjb25zdCBpbnQgbGVuZ3RoKTsKKworLyoKKyAqIENhbm9uaWNhbCBmb3Jtcy4KKyAqLworaW50IHYzX2FzaWRfaXNfY2Fub25pY2FsKEFTSWRlbnRpZmllcnMgKmFzaWQpOworaW50IHYzX2FkZHJfaXNfY2Fub25pY2FsKElQQWRkckJsb2NrcyAqYWRkcik7CitpbnQgdjNfYXNpZF9jYW5vbml6ZShBU0lkZW50aWZpZXJzICphc2lkKTsKK2ludCB2M19hZGRyX2Nhbm9uaXplKElQQWRkckJsb2NrcyAqYWRkcik7CisKKy8qCisgKiBUZXN0cyBmb3IgaW5oZXJpdGFuY2UgYW5kIGNvbnRhaW5tZW50LgorICovCitpbnQgdjNfYXNpZF9pbmhlcml0cyhBU0lkZW50aWZpZXJzICphc2lkKTsKK2ludCB2M19hZGRyX2luaGVyaXRzKElQQWRkckJsb2NrcyAqYWRkcik7CitpbnQgdjNfYXNpZF9zdWJzZXQoQVNJZGVudGlmaWVycyAqYSwgQVNJZGVudGlmaWVycyAqYik7CitpbnQgdjNfYWRkcl9zdWJzZXQoSVBBZGRyQmxvY2tzICphLCBJUEFkZHJCbG9ja3MgKmIpOworCisvKgorICogQ2hlY2sgd2hldGhlciBSRkMgMzc3OSBleHRlbnNpb25zIG5lc3QgcHJvcGVybHkgaW4gY2hhaW5zLgorICovCitpbnQgdjNfYXNpZF92YWxpZGF0ZV9wYXRoKFg1MDlfU1RPUkVfQ1RYICopOworaW50IHYzX2FkZHJfdmFsaWRhdGVfcGF0aChYNTA5X1NUT1JFX0NUWCAqKTsKK2ludCB2M19hc2lkX3ZhbGlkYXRlX3Jlc291cmNlX3NldChTVEFDS19PRihYNTA5KSAqY2hhaW4sCisJCQkJICBBU0lkZW50aWZpZXJzICpleHQsCisJCQkJICBpbnQgYWxsb3dfaW5oZXJpdGFuY2UpOworaW50IHYzX2FkZHJfdmFsaWRhdGVfcmVzb3VyY2Vfc2V0KFNUQUNLX09GKFg1MDkpICpjaGFpbiwKKwkJCQkgIElQQWRkckJsb2NrcyAqZXh0LAorCQkJCSAgaW50IGFsbG93X2luaGVyaXRhbmNlKTsKKworI2VuZGlmIC8qIE9QRU5TU0xfTk9fUkZDMzc3OSAqLworCisvKiBCRUdJTiBFUlJPUiBDT0RFUyAqLworLyogVGhlIGZvbGxvd2luZyBsaW5lcyBhcmUgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHNjcmlwdCBta2Vyci5wbC4gQW55IGNoYW5nZXMKKyAqIG1hZGUgYWZ0ZXIgdGhpcyBwb2ludCBtYXkgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgc2NyaXB0IGlzIG5leHQgcnVuLgorICovCit2b2lkIEVSUl9sb2FkX1g1MDlWM19zdHJpbmdzKHZvaWQpOworCisvKiBFcnJvciBjb2RlcyBmb3IgdGhlIFg1MDlWMyBmdW5jdGlvbnMuICovCisKKy8qIEZ1bmN0aW9uIGNvZGVzLiAqLworI2RlZmluZSBYNTA5VjNfRl9BMklfR0VORVJBTF9OQU1FCQkJIDE2NAorI2RlZmluZSBYNTA5VjNfRl9BU0lERU5USUZJRVJDSE9JQ0VfQ0FOT05JWkUJCSAxNjEKKyNkZWZpbmUgWDUwOVYzX0ZfQVNJREVOVElGSUVSQ0hPSUNFX0lTX0NBTk9OSUNBTAkgMTYyCisjZGVmaW5lIFg1MDlWM19GX0NPUFlfRU1BSUwJCQkJIDEyMgorI2RlZmluZSBYNTA5VjNfRl9DT1BZX0lTU1VFUgkJCQkgMTIzCisjZGVmaW5lIFg1MDlWM19GX0RPX0RJUk5BTUUJCQkJIDE0NAorI2RlZmluZSBYNTA5VjNfRl9ET19FWFRfQ09ORgkJCQkgMTI0CisjZGVmaW5lIFg1MDlWM19GX0RPX0VYVF9JMkQJCQkJIDEzNQorI2RlZmluZSBYNTA5VjNfRl9ET19FWFRfTkNPTkYJCQkJIDE1MQorI2RlZmluZSBYNTA5VjNfRl9ET19JMlZfTkFNRV9DT05TVFJBSU5UUwkJIDE0OAorI2RlZmluZSBYNTA5VjNfRl9HTkFNRVNfRlJPTV9TRUNUTkFNRQkJCSAxNTYKKyNkZWZpbmUgWDUwOVYzX0ZfSEVYX1RPX1NUUklORwkJCQkgMTExCisjZGVmaW5lIFg1MDlWM19GX0kyU19BU04xX0VOVU1FUkFURUQJCQkgMTIxCisjZGVmaW5lIFg1MDlWM19GX0kyU19BU04xX0lBNVNUUklORwkJCSAxNDkKKyNkZWZpbmUgWDUwOVYzX0ZfSTJTX0FTTjFfSU5URUdFUgkJCSAxMjAKKyNkZWZpbmUgWDUwOVYzX0ZfSTJWX0FVVEhPUklUWV9JTkZPX0FDQ0VTUwkJIDEzOAorI2RlZmluZSBYNTA5VjNfRl9OT1RJQ0VfU0VDVElPTgkJCQkgMTMyCisjZGVmaW5lIFg1MDlWM19GX05SRUZfTk9TCQkJCSAxMzMKKyNkZWZpbmUgWDUwOVYzX0ZfUE9MSUNZX1NFQ1RJT04JCQkJIDEzMQorI2RlZmluZSBYNTA5VjNfRl9QUk9DRVNTX1BDSV9WQUxVRQkJCSAxNTAKKyNkZWZpbmUgWDUwOVYzX0ZfUjJJX0NFUlRQT0wJCQkJIDEzMAorI2RlZmluZSBYNTA5VjNfRl9SMklfUENJCQkJCSAxNTUKKyNkZWZpbmUgWDUwOVYzX0ZfUzJJX0FTTjFfSUE1U1RSSU5HCQkJIDEwMAorI2RlZmluZSBYNTA5VjNfRl9TMklfQVNOMV9JTlRFR0VSCQkJIDEwOAorI2RlZmluZSBYNTA5VjNfRl9TMklfQVNOMV9PQ1RFVF9TVFJJTkcJCQkgMTEyCisjZGVmaW5lIFg1MDlWM19GX1MySV9BU04xX1NLRVlfSUQJCQkgMTE0CisjZGVmaW5lIFg1MDlWM19GX1MySV9TS0VZX0lECQkJCSAxMTUKKyNkZWZpbmUgWDUwOVYzX0ZfU0VUX0RJU1RfUE9JTlRfTkFNRQkJCSAxNTgKKyNkZWZpbmUgWDUwOVYzX0ZfU1RSSU5HX1RPX0hFWAkJCQkgMTEzCisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX0FERF9JRF9BU0MJCQkgMTI1CisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX0FERF9JRF9JTlRFR0VSCQkJIDEyNgorI2RlZmluZSBYNTA5VjNfRl9TWE5FVF9BRERfSURfVUxPTkcJCQkgMTI3CisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX0dFVF9JRF9BU0MJCQkgMTI4CisjZGVmaW5lIFg1MDlWM19GX1NYTkVUX0dFVF9JRF9VTE9ORwkJCSAxMjkKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0FTSURFTlRJRklFUlMJCQkgMTYzCisjZGVmaW5lIFg1MDlWM19GX1YySV9BU04xX0JJVF9TVFJJTkcJCQkgMTAxCisjZGVmaW5lIFg1MDlWM19GX1YySV9BVVRIT1JJVFlfSU5GT19BQ0NFU1MJCSAxMzkKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0FVVEhPUklUWV9LRVlJRAkJCSAxMTkKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0JBU0lDX0NPTlNUUkFJTlRTCQkJIDEwMgorI2RlZmluZSBYNTA5VjNfRl9WMklfQ1JMRAkJCQkgMTM0CisjZGVmaW5lIFg1MDlWM19GX1YySV9FWFRFTkRFRF9LRVlfVVNBR0UJCQkgMTAzCisjZGVmaW5lIFg1MDlWM19GX1YySV9HRU5FUkFMX05BTUVTCQkJIDExOAorI2RlZmluZSBYNTA5VjNfRl9WMklfR0VORVJBTF9OQU1FX0VYCQkJIDExNworI2RlZmluZSBYNTA5VjNfRl9WMklfSURQCQkJCSAxNTcKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0lQQUREUkJMT0NLUwkJCSAxNTkKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX0lTU1VFUl9BTFQJCQkJIDE1MworI2RlZmluZSBYNTA5VjNfRl9WMklfTkFNRV9DT05TVFJBSU5UUwkJCSAxNDcKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX1BPTElDWV9DT05TVFJBSU5UUwkJCSAxNDYKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX1BPTElDWV9NQVBQSU5HUwkJCSAxNDUKKyNkZWZpbmUgWDUwOVYzX0ZfVjJJX1NVQkpFQ1RfQUxUCQkJIDE1NAorI2RlZmluZSBYNTA5VjNfRl9WM19BRERSX1ZBTElEQVRFX1BBVEhfSU5URVJOQUwJCSAxNjAKKyNkZWZpbmUgWDUwOVYzX0ZfVjNfR0VORVJJQ19FWFRFTlNJT04JCQkgMTE2CisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19BREQxX0kyRAkJCSAxNDAKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0FERF9WQUxVRQkJCSAxMDUKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0VYVF9BREQJCQkJIDEwNAorI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfRVhUX0FERF9BTElBUwkJCSAxMDYKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0VYVF9DT05GCQkJIDEwNworI2RlZmluZSBYNTA5VjNfRl9YNTA5VjNfRVhUX0kyRAkJCQkgMTM2CisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19FWFRfTkNPTkYJCQkgMTUyCisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19HRVRfU0VDVElPTgkJCSAxNDIKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX0dFVF9TVFJJTkcJCQkgMTQzCisjZGVmaW5lIFg1MDlWM19GX1g1MDlWM19HRVRfVkFMVUVfQk9PTAkJCSAxMTAKKyNkZWZpbmUgWDUwOVYzX0ZfWDUwOVYzX1BBUlNFX0xJU1QJCQkgMTA5CisjZGVmaW5lIFg1MDlWM19GX1g1MDlfUFVSUE9TRV9BREQJCQkgMTM3CisjZGVmaW5lIFg1MDlWM19GX1g1MDlfUFVSUE9TRV9TRVQJCQkgMTQxCisKKy8qIFJlYXNvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgWDUwOVYzX1JfQkFEX0lQX0FERFJFU1MJCQkJIDExOAorI2RlZmluZSBYNTA5VjNfUl9CQURfT0JKRUNUCQkJCSAxMTkKKyNkZWZpbmUgWDUwOVYzX1JfQk5fREVDMkJOX0VSUk9SCQkJIDEwMAorI2RlZmluZSBYNTA5VjNfUl9CTl9UT19BU04xX0lOVEVHRVJfRVJST1IJCSAxMDEKKyNkZWZpbmUgWDUwOVYzX1JfRElSTkFNRV9FUlJPUgkJCQkgMTQ5CisjZGVmaW5lIFg1MDlWM19SX0RJU1RQT0lOVF9BTFJFQURZX1NFVAkJCSAxNjAKKyNkZWZpbmUgWDUwOVYzX1JfRFVQTElDQVRFX1pPTkVfSUQJCQkgMTMzCisjZGVmaW5lIFg1MDlWM19SX0VSUk9SX0NPTlZFUlRJTkdfWk9ORQkJCSAxMzEKKyNkZWZpbmUgWDUwOVYzX1JfRVJST1JfQ1JFQVRJTkdfRVhURU5TSU9OCQkgMTQ0CisjZGVmaW5lIFg1MDlWM19SX0VSUk9SX0lOX0VYVEVOU0lPTgkJCSAxMjgKKyNkZWZpbmUgWDUwOVYzX1JfRVhQRUNURURfQV9TRUNUSU9OX05BTUUJCSAxMzcKKyNkZWZpbmUgWDUwOVYzX1JfRVhURU5TSU9OX0VYSVNUUwkJCSAxNDUKKyNkZWZpbmUgWDUwOVYzX1JfRVhURU5TSU9OX05BTUVfRVJST1IJCQkgMTE1CisjZGVmaW5lIFg1MDlWM19SX0VYVEVOU0lPTl9OT1RfRk9VTkQJCQkgMTAyCisjZGVmaW5lIFg1MDlWM19SX0VYVEVOU0lPTl9TRVRUSU5HX05PVF9TVVBQT1JURUQJIDEwMworI2RlZmluZSBYNTA5VjNfUl9FWFRFTlNJT05fVkFMVUVfRVJST1IJCQkgMTE2CisjZGVmaW5lIFg1MDlWM19SX0lMTEVHQUxfRU1QVFlfRVhURU5TSU9OCQkgMTUxCisjZGVmaW5lIFg1MDlWM19SX0lMTEVHQUxfSEVYX0RJR0lUCQkJIDExMworI2RlZmluZSBYNTA5VjNfUl9JTkNPUlJFQ1RfUE9MSUNZX1NZTlRBWF9UQUcJCSAxNTIKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9NVUxUSVBMRV9SRE5TCQkJIDE2MQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX0FTTlVNQkVSCQkJIDE2MgorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX0FTUkFOR0UJCQkgMTYzCisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfQk9PTEVBTl9TVFJJTkcJCQkgMTA0CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfRVhURU5TSU9OX1NUUklORwkJIDEwNQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX0lOSEVSSVRBTkNFCQkJIDE2NQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX0lQQUREUkVTUwkJCSAxNjYKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9OQU1FCQkJCSAxMDYKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX0FSR1VNRU5UCQkJIDEwNworI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX05VTExfTkFNRQkJCSAxMDgKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9OVUxMX1ZBTFVFCQkJIDEwOQorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX05VTUJFUgkJCQkgMTQwCisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfTlVNQkVSUwkJCSAxNDEKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9PQkpFQ1RfSURFTlRJRklFUgkJIDExMAorI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX09QVElPTgkJCQkgMTM4CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfUE9MSUNZX0lERU5USUZJRVIJCSAxMzQKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9QUk9YWV9QT0xJQ1lfU0VUVElORwkJIDE1MworI2RlZmluZSBYNTA5VjNfUl9JTlZBTElEX1BVUlBPU0UJCQkgMTQ2CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfU0FGSQkJCQkgMTY0CisjZGVmaW5lIFg1MDlWM19SX0lOVkFMSURfU0VDVElPTgkJCSAxMzUKKyNkZWZpbmUgWDUwOVYzX1JfSU5WQUxJRF9TWU5UQVgJCQkJIDE0MworI2RlZmluZSBYNTA5VjNfUl9JU1NVRVJfREVDT0RFX0VSUk9SCQkJIDEyNgorI2RlZmluZSBYNTA5VjNfUl9NSVNTSU5HX1ZBTFVFCQkJCSAxMjQKKyNkZWZpbmUgWDUwOVYzX1JfTkVFRF9PUkdBTklaQVRJT05fQU5EX05VTUJFUlMJCSAxNDIKKyNkZWZpbmUgWDUwOVYzX1JfTk9fQ09ORklHX0RBVEFCQVNFCQkJIDEzNgorI2RlZmluZSBYNTA5VjNfUl9OT19JU1NVRVJfQ0VSVElGSUNBVEUJCQkgMTIxCisjZGVmaW5lIFg1MDlWM19SX05PX0lTU1VFUl9ERVRBSUxTCQkJIDEyNworI2RlZmluZSBYNTA5VjNfUl9OT19QT0xJQ1lfSURFTlRJRklFUgkJCSAxMzkKKyNkZWZpbmUgWDUwOVYzX1JfTk9fUFJPWFlfQ0VSVF9QT0xJQ1lfTEFOR1VBR0VfREVGSU5FRAkgMTU0CisjZGVmaW5lIFg1MDlWM19SX05PX1BVQkxJQ19LRVkJCQkJIDExNAorI2RlZmluZSBYNTA5VjNfUl9OT19TVUJKRUNUX0RFVEFJTFMJCQkgMTI1CisjZGVmaW5lIFg1MDlWM19SX09ERF9OVU1CRVJfT0ZfRElHSVRTCQkJIDExMgorI2RlZmluZSBYNTA5VjNfUl9PUEVSQVRJT05fTk9UX0RFRklORUQJCQkgMTQ4CisjZGVmaW5lIFg1MDlWM19SX09USEVSTkFNRV9FUlJPUgkJCSAxNDcKKyNkZWZpbmUgWDUwOVYzX1JfUE9MSUNZX0xBTkdVQUdFX0FMUkVBRFlfREVGSU5FRAkgMTU1CisjZGVmaW5lIFg1MDlWM19SX1BPTElDWV9QQVRIX0xFTkdUSAkJCSAxNTYKKyNkZWZpbmUgWDUwOVYzX1JfUE9MSUNZX1BBVEhfTEVOR1RIX0FMUkVBRFlfREVGSU5FRAkgMTU3CisjZGVmaW5lIFg1MDlWM19SX1BPTElDWV9TWU5UQVhfTk9UX0NVUlJFTlRMWV9TVVBQT1JURUQJIDE1OAorI2RlZmluZSBYNTA5VjNfUl9QT0xJQ1lfV0hFTl9QUk9YWV9MQU5HVUFHRV9SRVFVSVJFU19OT19QT0xJQ1kgMTU5CisjZGVmaW5lIFg1MDlWM19SX1NFQ1RJT05fTk9UX0ZPVU5ECQkJIDE1MAorI2RlZmluZSBYNTA5VjNfUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9ERVRBSUxTCQkgMTIyCisjZGVmaW5lIFg1MDlWM19SX1VOQUJMRV9UT19HRVRfSVNTVUVSX0tFWUlECQkgMTIzCisjZGVmaW5lIFg1MDlWM19SX1VOS05PV05fQklUX1NUUklOR19BUkdVTUVOVAkJIDExMQorI2RlZmluZSBYNTA5VjNfUl9VTktOT1dOX0VYVEVOU0lPTgkJCSAxMjkKKyNkZWZpbmUgWDUwOVYzX1JfVU5LTk9XTl9FWFRFTlNJT05fTkFNRQkJCSAxMzAKKyNkZWZpbmUgWDUwOVYzX1JfVU5LTk9XTl9PUFRJT04JCQkJIDEyMAorI2RlZmluZSBYNTA5VjNfUl9VTlNVUFBPUlRFRF9PUFRJT04JCQkgMTE3CisjZGVmaW5lIFg1MDlWM19SX1VOU1VQUE9SVEVEX1RZUEUJCQkgMTY3CisjZGVmaW5lIFg1MDlWM19SX1VTRVJfVE9PX0xPTkcJCQkJIDEzMgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvb3BlbnNzbC5jb25maWcgYi9saWIvb3BlbnNzbC9vcGVuc3NsLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWIxZDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvb3BlbnNzbC5jb25maWcKQEAgLTAsMCArMSwyMTYgQEAKK0NPTkZJR1VSRV9BUkdTPSJcCitsaW51eC1nZW5lcmljMzIgXAorbm8taWRlYSBuby1jYXN0IG5vLXNlZWQgbm8tbWQyIG5vLXNoYTAgbm8td2hybHBvb2wgXAorLURMX0VORElBTiBcCisiCisKKyMgdW5uZWVkZWQgZGlyZWN0b3JpZXMKK1VOTkVFREVEX1NPVVJDRVM9IlwKK01hY09TIFwKK05ldHdhcmUgXAorVk1TIFwKK2FwcHMvZGVtb0NBIFwKK2FwcHMvc2V0IFwKK2J1Z3MgXAorY2VydHMgXAorY3J5cHRvL2NhbWVsbGlhIFwKK2NyeXB0by9jYXN0IFwKK2NyeXB0by9jbXMgXAorY3J5cHRvL2lkZWEgXAorY3J5cHRvL21kMiBcCitjcnlwdG8vcmM1IFwKK2NyeXB0by9zZWVkIFwKK2NyeXB0by93aHJscG9vbCBcCitkZW1vcyBcCitkb2MgXAorZW5naW5lcyBcCittcyBcCitvczIgXAorcGVybCBcCitzaGxpYiBcCit0ZXN0IFwKK3RpbWVzIFwKK3Rvb2xzIFwKK3V0aWwgXAorIgorCisjIHVubmVlZGVkIGZpbGVzCitVTk5FRURFRF9TT1VSQ0VTKz0iXAorQ0hBTkdFUyBcCitDSEFOR0VTLlNTTGVheSBcCitDb25maWd1cmUgXAorRkFRIFwKK0lOU1RBTEwgXAorSU5TVEFMTC5ESkdQUCBcCitJTlNUQUxMLk1hY09TIFwKK0lOU1RBTEwuTlcgXAorSU5TVEFMTC5PUzIgXAorSU5TVEFMTC5WTVMgXAorSU5TVEFMTC5XMzIgXAorSU5TVEFMTC5XNjQgXAorSU5TVEFMTC5XQ0UgXAorTElDRU5TRSBcCitNYWtlZmlsZSBcCitNYWtlZmlsZS5vcmcgXAorTWFrZWZpbGUuc2hhcmVkIFwKK05FV1MgXAorUFJPQkxFTVMgXAorUkVBRE1FIFwKK1JFQURNRS5BU04xIFwKK1JFQURNRS5FTkdJTkUgXAorYXBwcy9NYWtlZmlsZSBcCithcHBzL3RzLmMgXAorYXBwcy90c2dldCBcCitjb25maWcgXAorY3J5cHRvL01ha2VmaWxlIFwKK2NyeXB0by9hZXMvTWFrZWZpbGUgXAorY3J5cHRvL2FzbjEvTWFrZWZpbGUgXAorY3J5cHRvL2JmL0lOU1RBTEwgXAorY3J5cHRvL2JmL01ha2VmaWxlIFwKK2NyeXB0by9iZi9SRUFETUUgXAorY3J5cHRvL2JmL1ZFUlNJT04gXAorY3J5cHRvL2JmL2FzbS9yZWFkbWUgXAorY3J5cHRvL2JmL2JmX2NiYy5jIFwKK2NyeXB0by9iZi9iZl9vcHRzLmMgXAorY3J5cHRvL2JmL2Jmcy5jcHAgXAorY3J5cHRvL2JmL2Jmc3BlZWQuYyBcCitjcnlwdG8vYmYvYmZ0ZXN0LmMgXAorY3J5cHRvL2Jpby9NYWtlZmlsZSBcCitjcnlwdG8vYm4vTWFrZWZpbGUgXAorY3J5cHRvL2J1ZmZlci9NYWtlZmlsZSBcCitjcnlwdG8vY29tcC9NYWtlZmlsZSBcCitjcnlwdG8vY29uZi9NYWtlZmlsZSBcCitjcnlwdG8vZGVzL01ha2VmaWxlIFwKK2NyeXB0by9kaC9NYWtlZmlsZSBcCitjcnlwdG8vZGgvZGhfcHJuLmMgXAorY3J5cHRvL2RzYS9NYWtlZmlsZSBcCitjcnlwdG8vZHNvL01ha2VmaWxlIFwKK2NyeXB0by9kc28vZHNvX2Jlb3MuYyBcCitjcnlwdG8vZWMvTWFrZWZpbGUgXAorY3J5cHRvL2VjZGgvTWFrZWZpbGUgXAorY3J5cHRvL2VjZHNhL01ha2VmaWxlIFwKK2NyeXB0by9lbmdpbmUvTWFrZWZpbGUgXAorY3J5cHRvL2VuZ2luZS90Yl9hc25tdGguYyBcCitjcnlwdG8vZW5naW5lL3RiX3BrbWV0aC5jIFwKK2NyeXB0by9lcnIvTWFrZWZpbGUgXAorY3J5cHRvL2V2cC9NYWtlZmlsZSBcCitjcnlwdG8vZXZwL21fbWQyLmMgXAorY3J5cHRvL2V2cC9tX3NoYS5jIFwKK2NyeXB0by9obWFjL01ha2VmaWxlIFwKK2NyeXB0by9qcGFrZS9NYWtlZmlsZSBcCitjcnlwdG8va3JiNS9NYWtlZmlsZSBcCitjcnlwdG8vbGhhc2gvTWFrZWZpbGUgXAorY3J5cHRvL21kNC9NYWtlZmlsZSBcCitjcnlwdG8vbWQ1L01ha2VmaWxlIFwKK2NyeXB0by9tZGMyL01ha2VmaWxlIFwKK2NyeXB0by9tb2Rlcy9NYWtlZmlsZSBcCitjcnlwdG8vbW9kZXMvY3RzMTI4LmMgXAorY3J5cHRvL21vZGVzL21vZGVzLmggXAorY3J5cHRvL29iamVjdHMvTWFrZWZpbGUgXAorY3J5cHRvL29jc3AvTWFrZWZpbGUgXAorY3J5cHRvL3BlbS9NYWtlZmlsZSBcCitjcnlwdG8vcGtjczEyL01ha2VmaWxlIFwKK2NyeXB0by9wa2NzNy9NYWtlZmlsZSBcCitjcnlwdG8vcGtjczcvYmlvX3BrNy5jIFwKK2NyeXB0by9wcXVldWUvTWFrZWZpbGUgXAorY3J5cHRvL3JhbmQvTWFrZWZpbGUgXAorY3J5cHRvL3JjMi9NYWtlZmlsZSBcCitjcnlwdG8vcmM0L01ha2VmaWxlIFwKK2NyeXB0by9yaXBlbWQvTWFrZWZpbGUgXAorY3J5cHRvL3JzYS9NYWtlZmlsZSBcCitjcnlwdG8vc2hhL01ha2VmaWxlIFwKK2NyeXB0by9zaGEvc2hhX29uZS5jIFwKK2NyeXB0by9zdGFjay9NYWtlZmlsZSBcCitjcnlwdG8vc3RvcmUvTWFrZWZpbGUgXAorY3J5cHRvL3RzL01ha2VmaWxlIFwKK2NyeXB0by90cy90cy5oIFwKK2NyeXB0by90cy90c19hc24xLmMgXAorY3J5cHRvL3RzL3RzX2NvbmYuYyBcCitjcnlwdG8vdHMvdHNfbGliLmMgXAorY3J5cHRvL3RzL3RzX3JlcV9wcmludC5jIFwKK2NyeXB0by90cy90c19yZXFfdXRpbHMuYyBcCitjcnlwdG8vdHMvdHNfcnNwX3ByaW50LmMgXAorY3J5cHRvL3RzL3RzX3JzcF9zaWduLmMgXAorY3J5cHRvL3RzL3RzX3JzcF91dGlscy5jIFwKK2NyeXB0by90cy90c19yc3BfdmVyaWZ5LmMgXAorY3J5cHRvL3RzL3RzX3ZlcmlmeV9jdHguYyBcCitjcnlwdG8vdHh0X2RiL01ha2VmaWxlIFwKK2NyeXB0by91aS9NYWtlZmlsZSBcCitjcnlwdG8veDUwOS9NYWtlZmlsZSBcCitjcnlwdG8veDUwOXYzL01ha2VmaWxlIFwKK2luY2x1ZGUvb3BlbnNzbC9jYW1lbGxpYS5oIFwKK2luY2x1ZGUvb3BlbnNzbC9jYXN0LmggXAoraW5jbHVkZS9vcGVuc3NsL2Ntcy5oIFwKK2luY2x1ZGUvb3BlbnNzbC9pZGVhLmggXAoraW5jbHVkZS9vcGVuc3NsL21kYzIuaCBcCitpbmNsdWRlL29wZW5zc2wvc2VlZC5oIFwKK2luY2x1ZGUvb3BlbnNzbC93aHJscG9vbC5oIFwKK2luc3RhbGwuY29tIFwKK21ha2V2bXMuY29tIFwKK29wZW5zc2wuZG94eSBcCitvcGVuc3NsLnNwZWMgXAorIiAKKworTkVFREVEX1NPVVJDRVM9IlwKK2FwcHMgXAorY3J5cHRvIFwKK2Vfb3MuaCBcCitlX29zMi5oIFwKK3NzbCBcCitpbmNsdWRlIFwKKyIKKworT1BFTlNTTF9QQVRDSEVTPSJcCitwcm9ncy5wYXRjaCBcCitzbWFsbF9yZWNvcmRzLnBhdGNoIFwKK2hhbmRzaGFrZV9jdXR0aHJvdWdoLnBhdGNoIFwKK2pzc2UucGF0Y2ggXAorc2VjYWR2XzIwMTAxMTE2LTIucGF0Y2ggXAorIgorCitPUEVOU1NMX1BBVENIRVNfcHJvZ3NfU09VUkNFUz0iXAorYXBwcy9vcGVuc3NsLmMgXAorYXBwcy9wcm9ncy5oIFwKK2FwcHMvc3BlZWQuYyBcCitjcnlwdG8vdWkvdWlfb3BlbnNzbC5jIFwKKyIKKworT1BFTlNTTF9QQVRDSEVTX2hhbmRzaGFrZV9jdXR0aHJvdWdoX1NPVVJDRVM9IlwKK2FwcHMvc19jbGllbnQuYyBcCitzc2wvczNfY2xudC5jIFwKK3NzbC9zM19saWIuYyBcCitzc2wvc3NsLmggXAorc3NsL3NzbDMuaCBcCitzc2wvc3NsX2xpYi5jIFwKK3NzbC9zc2x0ZXN0LmMgXAordGVzdC90ZXN0c3NsIFwKKyIKKworT1BFTlNTTF9QQVRDSEVTX3NtYWxsX3JlY29yZHNfU09VUkNFUz0iXAorc3NsL2QxX3BrdC5jIFwKK3NzbC9zMjNfc3J2ci5jIFwKK3NzbC9zM19ib3RoLmMgXAorc3NsL3MzX3BrdC5jIFwKK3NzbC9zc2wuaCBcCitzc2wvc3NsMy5oIFwKK3NzbC9zc2x0ZXN0LmMgXAordGVzdC90ZXN0c3NsIFwKKyIKKworT1BFTlNTTF9QQVRDSEVTX2pzc2VfU09VUkNFUz0iXAorc3NsL3NzbC5oIFwKK3NzbC9kMV9jbG50LmMgXAorc3NsL3MyM19jbG50LmMgXAorc3NsL3MzX2JvdGguYyBcCitzc2wvczNfY2xudC5jIFwKK3NzbC9zM19zcnZyLmMgXAorc3NsL3NzbF9lcnIuYyBcCitzc2wvc3NsX2xpYi5jIFwKK3NzbC9zc2xfbG9jbC5oCitzc2wvc3NsX3JzYS5jIFwKK3NzbC9zc2xfc2Vzcy5jIFwKKyIKKworT1BFTlNTTF9QQVRDSEVTX3NlY2Fkdl8yMDEwMTExNl8yX1NPVVJDRVM9IlwKK3NzbC90MV9saWIuYyBcCisiCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9vcGVuc3NsLnZlcnNpb24gYi9saWIvb3BlbnNzbC9vcGVuc3NsLnZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1YjFjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL29wZW5zc2wudmVyc2lvbgpAQCAtMCwwICsxIEBACitPUEVOU1NMX1ZFUlNJT049MS4wLjBhCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9wYXRjaGVzL1JFQURNRSBiL2xpYi9vcGVuc3NsL3BhdGNoZXMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOThlZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9wYXRjaGVzL1JFQURNRQpAQCAtMCwwICsxLDM3IEBACitwcm9ncy5wYXRjaDoKKworRml4dXAgc291cmNlcyB1bmRlciB0aGUgYXBwcy8gZGlyZWN0b3J5IHRoYXQgYXJlIG5vdCBidWlsdCB1bmRlciB0aGUgYW5kcm9pZCBlbnZpcm9ubWVudC4KKworCitzbWFsbF9yZWNvcmRzLnBhdGNoOgorCitSZWR1Y2UgT3BlblNTTCBtZW1vcnkgY29uc3VtcHRpb24uCitTU0wgcmVjb3JkcyBtYXkgYmUgYXMgbGFyZ2UgYXMgMTZLLCBidXQgYXJlIHR5cGljYWxseSA8IDJLLiAgSW4KK2FkZGl0aW9uLCBhIGhpc3RvcmljIGJ1ZyBpbiBXaW5kb3dzIGFsbG93ZWQgcmVjb3JkcyB0byBiZSBhcyBsYXJnZQorMzJLLiAgT3BlblNTTCBzdGF0aWNhbGx5IGFsbG9jYXRlcyByZWFkIGFuZCB3cml0ZSBidWZmZXJzICgzNEsgYW5kCisxOEsgcmVzcGVjdGl2ZWx5KSB1c2VkIGZvciBwcm9jZXNzaW5nIHJlY29yZHMuCitXaXRoIHRoaXMgcGF0Y2gsIE9wZW5TU0wgc3RhdGljYWxseSBhbGxvY2F0ZXMgNEsgKyA0SyBidWZmZXJzLCB3aXRoCit0aGUgb3B0aW9uIG9mIGR5bmFtaWNhbGx5IGdyb3dpbmcgYnVmZmVycyB0byAzNEsgKyA0Sywgd2hpY2ggaXMgYQorc2F2aW5nIG9mIDQ0SyBwZXIgY29ubmVjdGlvbiBmb3IgdGhlIHR5cGljYWwgY2FzZS4KKworCitoYW5kc2hha2VfY3V0dGhyb3VnaC5wYXRjaAorCitFbmFibGVzIFNTTDMrIGNsaWVudHMgdG8gc2VuZCBhcHBsaWNhdGlvbiBkYXRhIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUKK0ZpbmlzaGVkIG1lc3NhZ2UgZXZlbiB3aGVuIG5lZ290aWF0aW5nIGZ1bGwtaGFuZHNoYWtlcy4gIFdpdGggdGhpcyBwYXRjaCwKK2NsaWVudHMgY2FuIG5lZ290aWF0ZSBTU0wgY29ubmVjdGlvbnMgaW4gMS1SVFQgZXZlbiB3aGVuIHBlcmZvcm1pbmcKK2Z1bGwtaGFuZHNoYWtlcy4KKworanNzZS5wYXRjaAorCitTdXBwb3J0IGZvciBKU1NFIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIE9wZW5TU0wuCisKKworc2VjYWR2XzIwMTAxMTE2LTIucGF0Y2gKKworT3BlblNTTCBTZWN1cml0eSBBZHZpc29yeSBbMTYgTm92ZW1iZXIgMjAxMF0KK1RMUyBleHRlbnNpb24gcGFyc2luZyByYWNlIGNvbmRpdGlvbi4gKFVQREFURUQpCitDVkUtMjAxMC0zODY0CitodHRwOi8vd3d3Lm9wZW5zc2wub3JnL25ld3Mvc2VjYWR2XzIwMTAxMTE2LTIudHh0CisKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvcGF0Y2hlcy9hcHBzX0FuZHJvaWQubWsgYi9saWIvb3BlbnNzbC9wYXRjaGVzL2FwcHNfQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmUwN2EyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvcGF0Y2hlcy9hcHBzX0FuZHJvaWQubWsKQEAgLTAsMCArMSw3OSBAQAorIyBDb3B5cmlnaHQgMjAwNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKwlhcHBfcmFuZC5jIFwKKwlhcHBzLmMgXAorCWFzbjFwYXJzLmMgXAorCWNhLmMgXAorCWNpcGhlcnMuYyBcCisJY3JsLmMgXAorCWNybDJwNy5jIFwKKwlkZ3N0LmMgXAorCWRoLmMgXAorCWRocGFyYW0uYyBcCisJZHNhLmMgXAorCWRzYXBhcmFtLmMgXAorCWVjcGFyYW0uYyBcCisJZWMuYyBcCisJZW5jLmMgXAorCWVuZ2luZS5jIFwKKwllcnJzdHIuYyBcCisJZ2VuZGguYyBcCisJZ2VuZHNhLmMgXAorCWdlbnBrZXkuYyBcCisJZ2VucnNhLmMgXAorCW5zZXEuYyBcCisJb2NzcC5jIFwKKwlvcGVuc3NsLmMgXAorCXBhc3N3ZC5jIFwKKwlwa2NzMTIuYyBcCisJcGtjczcuYyBcCisJcGtjczguYyBcCisJcGtleS5jIFwKKwlwa2V5cGFyYW0uYyBcCisJcGtleXV0bC5jIFwKKwlwcmltZS5jIFwKKwlyYW5kLmMgXAorCXJlcS5jIFwKKwlyc2EuYyBcCisJcnNhdXRsLmMgXAorCXNfY2IuYyBcCisJc19jbGllbnQuYyBcCisJc19zZXJ2ZXIuYyBcCisJc19zb2NrZXQuYyBcCisJc190aW1lLmMgXAorCXNlc3NfaWQuYyBcCisJc21pbWUuYyBcCisJc3BlZWQuYyBcCisJc3BrYWMuYyBcCisJdmVyaWZ5LmMgXAorCXZlcnNpb24uYyBcCisJeDUwOS5jCisKKyMgICBjbXMuYyBlYy5jIHNfc2VydmVyLmMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlic3NsIFwKKwlsaWJjcnlwdG8gCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCWV4dGVybmFsL29wZW5zc2wgXAorCWV4dGVybmFsL29wZW5zc2wvaW5jbHVkZQorCitMT0NBTF9DRkxBR1MgOj0gLURNT05PTElUSAorCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYW5kcm9pZC1jb25maWcubWsKKworIyBUaGVzZSBmbGFncyBvbWl0IHdob2xlIGZlYXR1cmVzIGZyb20gdGhlIGNvbW1hbmRsaW5lICJvcGVuc3NsIi4KKyMgSG93ZXZlciwgcG9ydGlvbnMgb2YgdGhlc2UgZmVhdHVyZXMgYXJlIGFjdHVhbGx5IHR1cm5lZCBvbi4KK0xPQ0FMX0NGTEFHUyArPSAtRE9QRU5TU0xfTk9fRFRMUzEKKworCitMT0NBTF9NT0RVTEU6PSBvcGVuc3NsCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvcGF0Y2hlcy9jcnlwdG9fQW5kcm9pZC5tayBiL2xpYi9vcGVuc3NsL3BhdGNoZXMvY3J5cHRvX0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExMzc0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3BhdGNoZXMvY3J5cHRvX0FuZHJvaWQubWsKQEAgLTAsMCArMSw1MzggQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCithcm1fY2ZsYWdzIDo9IC1ET1BFTlNTTF9CTl9BU01fTU9OVCAtREFFU19BU00gLURTSEExX0FTTSAtRFNIQTI1Nl9BU00gLURTSEE1MTJfQVNNCithcm1fc3JjX2ZpbGVzIDo9IFwKKyAgICBhZXMvYXNtL2Flcy1hcm12NC5zIFwKKyAgICBibi9hc20vYXJtdjQtbW9udC5zIFwKKyAgICBzaGEvYXNtL3NoYTEtYXJtdjQtbGFyZ2UucyBcCisgICAgc2hhL2FzbS9zaGEyNTYtYXJtdjQucyBcCisgICAgc2hhL2FzbS9zaGE1MTItYXJtdjQucworbm9uX2FybV9zcmNfZmlsZXMgOj0gYWVzL2Flc19jb3JlLmMKKworbG9jYWxfc3JjX2ZpbGVzIDo9IFwKKwljcnlwdGxpYi5jIFwKKwltZW0uYyBcCisJbWVtX2Nsci5jIFwKKwltZW1fZGJnLmMgXAorCWN2ZXJzaW9uLmMgXAorCWV4X2RhdGEuYyBcCisJY3B0X2Vyci5jIFwKKwllYmNkaWMuYyBcCisJdWlkLmMgXAorCW9fdGltZS5jIFwKKwlvX3N0ci5jIFwKKwlvX2Rpci5jIFwKKwlhZXMvYWVzX2NiYy5jIFwKKwlhZXMvYWVzX2NmYi5jIFwKKwlhZXMvYWVzX2N0ci5jIFwKKwlhZXMvYWVzX2VjYi5jIFwKKwlhZXMvYWVzX21pc2MuYyBcCisJYWVzL2Flc19vZmIuYyBcCisJYWVzL2Flc193cmFwLmMgXAorCWFzbjEvYV9iaXRzdHIuYyBcCisJYXNuMS9hX2Jvb2wuYyBcCisJYXNuMS9hX2J5dGVzLmMgXAorCWFzbjEvYV9kMmlfZnAuYyBcCisJYXNuMS9hX2RpZ2VzdC5jIFwKKwlhc24xL2FfZHVwLmMgXAorCWFzbjEvYV9lbnVtLmMgXAorCWFzbjEvYV9nZW50bS5jIFwKKwlhc24xL2FfaTJkX2ZwLmMgXAorCWFzbjEvYV9pbnQuYyBcCisJYXNuMS9hX21ic3RyLmMgXAorCWFzbjEvYV9vYmplY3QuYyBcCisJYXNuMS9hX29jdGV0LmMgXAorCWFzbjEvYV9wcmludC5jIFwKKwlhc24xL2Ffc2V0LmMgXAorCWFzbjEvYV9zaWduLmMgXAorCWFzbjEvYV9zdHJleC5jIFwKKwlhc24xL2Ffc3RybmlkLmMgXAorCWFzbjEvYV90aW1lLmMgXAorCWFzbjEvYV90eXBlLmMgXAorCWFzbjEvYV91dGN0bS5jIFwKKwlhc24xL2FfdXRmOC5jIFwKKwlhc24xL2FfdmVyaWZ5LmMgXAorCWFzbjEvYW1ldGhfbGliLmMgXAorCWFzbjEvYXNuMV9lcnIuYyBcCisJYXNuMS9hc24xX2dlbi5jIFwKKwlhc24xL2FzbjFfbGliLmMgXAorCWFzbjEvYXNuMV9wYXIuYyBcCisJYXNuMS9hc25fbWltZS5jIFwKKwlhc24xL2Fzbl9tb2lkLmMgXAorCWFzbjEvYXNuX3BhY2suYyBcCisJYXNuMS9iaW9fYXNuMS5jIFwKKwlhc24xL2Jpb19uZGVmLmMgXAorCWFzbjEvZDJpX3ByLmMgXAorCWFzbjEvZDJpX3B1LmMgXAorCWFzbjEvZXZwX2FzbjEuYyBcCisJYXNuMS9mX2VudW0uYyBcCisJYXNuMS9mX2ludC5jIFwKKwlhc24xL2Zfc3RyaW5nLmMgXAorCWFzbjEvaTJkX3ByLmMgXAorCWFzbjEvaTJkX3B1LmMgXAorCWFzbjEvbl9wa2V5LmMgXAorCWFzbjEvbnNzZXEuYyBcCisJYXNuMS9wNV9wYmUuYyBcCisJYXNuMS9wNV9wYmV2Mi5jIFwKKwlhc24xL3A4X3BrZXkuYyBcCisJYXNuMS90X2JpdHN0LmMgXAorCWFzbjEvdF9jcmwuYyBcCisJYXNuMS90X3BrZXkuYyBcCisJYXNuMS90X3JlcS5jIFwKKwlhc24xL3Rfc3BraS5jIFwKKwlhc24xL3RfeDUwOS5jIFwKKwlhc24xL3RfeDUwOWEuYyBcCisJYXNuMS90YXNuX2RlYy5jIFwKKwlhc24xL3Rhc25fZW5jLmMgXAorCWFzbjEvdGFzbl9mcmUuYyBcCisJYXNuMS90YXNuX25ldy5jIFwKKwlhc24xL3Rhc25fcHJuLmMgXAorCWFzbjEvdGFzbl90eXAuYyBcCisJYXNuMS90YXNuX3V0bC5jIFwKKwlhc24xL3hfYWxnb3IuYyBcCisJYXNuMS94X2F0dHJpYi5jIFwKKwlhc24xL3hfYmlnbnVtLmMgXAorCWFzbjEveF9jcmwuYyBcCisJYXNuMS94X2V4dGVuLmMgXAorCWFzbjEveF9pbmZvLmMgXAorCWFzbjEveF9sb25nLmMgXAorCWFzbjEveF9uYW1lLmMgXAorCWFzbjEveF9ueDUwOS5jIFwKKwlhc24xL3hfcGtleS5jIFwKKwlhc24xL3hfcHVia2V5LmMgXAorCWFzbjEveF9yZXEuYyBcCisJYXNuMS94X3NpZy5jIFwKKwlhc24xL3hfc3BraS5jIFwKKwlhc24xL3hfdmFsLmMgXAorCWFzbjEveF94NTA5LmMgXAorCWFzbjEveF94NTA5YS5jIFwKKwliZi9iZl9jZmI2NC5jIFwKKwliZi9iZl9lY2IuYyBcCisJYmYvYmZfZW5jLmMgXAorCWJmL2JmX29mYjY0LmMgXAorCWJmL2JmX3NrZXkuYyBcCisJYmlvL2JfZHVtcC5jIFwKKwliaW8vYl9wcmludC5jIFwKKwliaW8vYl9zb2NrLmMgXAorCWJpby9iZl9idWZmLmMgXAorCWJpby9iZl9uYmlvLmMgXAorCWJpby9iZl9udWxsLmMgXAorCWJpby9iaW9fY2IuYyBcCisJYmlvL2Jpb19lcnIuYyBcCisJYmlvL2Jpb19saWIuYyBcCisJYmlvL2Jzc19hY3B0LmMgXAorCWJpby9ic3NfYmlvLmMgXAorCWJpby9ic3NfY29ubi5jIFwKKwliaW8vYnNzX2RncmFtLmMgXAorCWJpby9ic3NfZmQuYyBcCisJYmlvL2Jzc19maWxlLmMgXAorCWJpby9ic3NfbG9nLmMgXAorCWJpby9ic3NfbWVtLmMgXAorCWJpby9ic3NfbnVsbC5jIFwKKwliaW8vYnNzX3NvY2suYyBcCisJYm4vYm5fYWRkLmMgXAorCWJuL2JuX2FzbS5jIFwKKwlibi9ibl9ibGluZC5jIFwKKwlibi9ibl9jdHguYyBcCisJYm4vYm5fZGl2LmMgXAorCWJuL2JuX2Vyci5jIFwKKwlibi9ibl9leHAuYyBcCisJYm4vYm5fZXhwMi5jIFwKKwlibi9ibl9nY2QuYyBcCisJYm4vYm5fZ2YybS5jIFwKKwlibi9ibl9rcm9uLmMgXAorCWJuL2JuX2xpYi5jIFwKKwlibi9ibl9tb2QuYyBcCisJYm4vYm5fbW9udC5jIFwKKwlibi9ibl9tcGkuYyBcCisJYm4vYm5fbXVsLmMgXAorCWJuL2JuX25pc3QuYyBcCisJYm4vYm5fcHJpbWUuYyBcCisJYm4vYm5fcHJpbnQuYyBcCisJYm4vYm5fcmFuZC5jIFwKKwlibi9ibl9yZWNwLmMgXAorCWJuL2JuX3NoaWZ0LmMgXAorCWJuL2JuX3Nxci5jIFwKKwlibi9ibl9zcXJ0LmMgXAorCWJuL2JuX3dvcmQuYyBcCisJYnVmZmVyL2J1Zl9lcnIuYyBcCisJYnVmZmVyL2J1ZmZlci5jIFwKKwljb21wL2NfcmxlLmMgXAorCWNvbXAvY196bGliLmMgXAorCWNvbXAvY29tcF9lcnIuYyBcCisJY29tcC9jb21wX2xpYi5jIFwKKwljb25mL2NvbmZfYXBpLmMgXAorCWNvbmYvY29uZl9kZWYuYyBcCisJY29uZi9jb25mX2Vyci5jIFwKKwljb25mL2NvbmZfbGliLmMgXAorCWNvbmYvY29uZl9tYWxsLmMgXAorCWNvbmYvY29uZl9tb2QuYyBcCisJY29uZi9jb25mX3NhcC5jIFwKKwlkZXMvY2JjX2Nrc20uYyBcCisJZGVzL2NiY19lbmMuYyBcCisJZGVzL2NmYjY0ZWRlLmMgXAorCWRlcy9jZmI2NGVuYy5jIFwKKwlkZXMvY2ZiX2VuYy5jIFwKKwlkZXMvZGVzX2VuYy5jIFwKKwlkZXMvZGVzX29sZC5jIFwKKwlkZXMvZGVzX29sZDIuYyBcCisJZGVzL2VjYjNfZW5jLmMgXAorCWRlcy9lY2JfZW5jLmMgXAorCWRlcy9lZGVfY2JjbV9lbmMuYyBcCisJZGVzL2VuY19yZWFkLmMgXAorCWRlcy9lbmNfd3JpdC5jIFwKKwlkZXMvZmNyeXB0LmMgXAorCWRlcy9mY3J5cHRfYi5jIFwKKwlkZXMvb2ZiNjRlZGUuYyBcCisJZGVzL29mYjY0ZW5jLmMgXAorCWRlcy9vZmJfZW5jLmMgXAorCWRlcy9wY2JjX2VuYy5jIFwKKwlkZXMvcXVkX2Nrc20uYyBcCisJZGVzL3JhbmRfa2V5LmMgXAorCWRlcy9yZWFkMnB3ZC5jIFwKKwlkZXMvcnBjX2VuYy5jIFwKKwlkZXMvc2V0X2tleS5jIFwKKwlkZXMvc3RyMmtleS5jIFwKKwlkZXMveGNiY19lbmMuYyBcCisJZGgvZGhfYW1ldGguYyBcCisJZGgvZGhfYXNuMS5jIFwKKwlkaC9kaF9jaGVjay5jIFwKKwlkaC9kaF9kZXByLmMgXAorCWRoL2RoX2Vyci5jIFwKKwlkaC9kaF9nZW4uYyBcCisJZGgvZGhfa2V5LmMgXAorCWRoL2RoX2xpYi5jIFwKKwlkaC9kaF9wbWV0aC5jIFwKKwlkc2EvZHNhX2FtZXRoLmMgXAorCWRzYS9kc2FfYXNuMS5jIFwKKwlkc2EvZHNhX2RlcHIuYyBcCisJZHNhL2RzYV9lcnIuYyBcCisJZHNhL2RzYV9nZW4uYyBcCisJZHNhL2RzYV9rZXkuYyBcCisJZHNhL2RzYV9saWIuYyBcCisJZHNhL2RzYV9vc3NsLmMgXAorCWRzYS9kc2FfcG1ldGguYyBcCisJZHNhL2RzYV9wcm4uYyBcCisJZHNhL2RzYV9zaWduLmMgXAorCWRzYS9kc2FfdnJmLmMgXAorCWRzby9kc29fZGwuYyBcCisJZHNvL2Rzb19kbGZjbi5jIFwKKwlkc28vZHNvX2Vyci5jIFwKKwlkc28vZHNvX2xpYi5jIFwKKwlkc28vZHNvX251bGwuYyBcCisJZHNvL2Rzb19vcGVuc3NsLmMgXAorCWRzby9kc29fdm1zLmMgXAorCWRzby9kc29fd2luMzIuYyBcCisJZWMvZWMyX211bHQuYyBcCisJZWMvZWMyX3NtcGwuYyBcCisJZWMvZWNfYW1ldGguYyBcCisJZWMvZWNfYXNuMS5jIFwKKwllYy9lY19jaGVjay5jIFwKKwllYy9lY19jdXJ2ZS5jIFwKKwllYy9lY19jdnQuYyBcCisJZWMvZWNfZXJyLmMgXAorCWVjL2VjX2tleS5jIFwKKwllYy9lY19saWIuYyBcCisJZWMvZWNfbXVsdC5jIFwKKwllYy9lY19wbWV0aC5jIFwKKwllYy9lY19wcmludC5jIFwKKwllYy9lY2tfcHJuLmMgXAorCWVjL2VjcF9tb250LmMgXAorCWVjL2VjcF9uaXN0LmMgXAorCWVjL2VjcF9zbXBsLmMgXAorCWVjZGgvZWNoX2Vyci5jIFwKKwllY2RoL2VjaF9rZXkuYyBcCisJZWNkaC9lY2hfbGliLmMgXAorCWVjZGgvZWNoX29zc2wuYyBcCisJZWNkc2EvZWNzX2FzbjEuYyBcCisJZWNkc2EvZWNzX2Vyci5jIFwKKwllY2RzYS9lY3NfbGliLmMgXAorCWVjZHNhL2Vjc19vc3NsLmMgXAorCWVjZHNhL2Vjc19zaWduLmMgXAorCWVjZHNhL2Vjc192cmYuYyBcCisJZXJyL2Vyci5jIFwKKwllcnIvZXJyX2FsbC5jIFwKKwllcnIvZXJyX3Bybi5jIFwKKwlldnAvYmlvX2I2NC5jIFwKKwlldnAvYmlvX2VuYy5jIFwKKwlldnAvYmlvX21kLmMgXAorCWV2cC9iaW9fb2suYyBcCisJZXZwL2NfYWxsLmMgXAorCWV2cC9jX2FsbGMuYyBcCisJZXZwL2NfYWxsZC5jIFwKKwlldnAvZGlnZXN0LmMgXAorCWV2cC9lX2Flcy5jIFwKKwlldnAvZV9iZi5jIFwKKwlldnAvZV9kZXMuYyBcCisJZXZwL2VfZGVzMy5jIFwKKwlldnAvZV9udWxsLmMgXAorCWV2cC9lX29sZC5jIFwKKwlldnAvZV9yYzIuYyBcCisJZXZwL2VfcmM0LmMgXAorCWV2cC9lX3JjNS5jIFwKKwlldnAvZV94Y2JjX2QuYyBcCisJZXZwL2VuY29kZS5jIFwKKwlldnAvZXZwX2FjbmYuYyBcCisJZXZwL2V2cF9lbmMuYyBcCisJZXZwL2V2cF9lcnIuYyBcCisJZXZwL2V2cF9rZXkuYyBcCisJZXZwL2V2cF9saWIuYyBcCisJZXZwL2V2cF9wYmUuYyBcCisJZXZwL2V2cF9wa2V5LmMgXAorCWV2cC9tX2Rzcy5jIFwKKwlldnAvbV9kc3MxLmMgXAorCWV2cC9tX2VjZHNhLmMgXAorCWV2cC9tX21kNC5jIFwKKwlldnAvbV9tZDUuYyBcCisJZXZwL21fbWRjMi5jIFwKKwlldnAvbV9udWxsLmMgXAorCWV2cC9tX3JpcGVtZC5jIFwKKwlldnAvbV9zaGExLmMgXAorCWV2cC9tX3NpZ3Zlci5jIFwKKwlldnAvbV93cC5jIFwKKwlldnAvbmFtZXMuYyBcCisJZXZwL3A1X2NycHQuYyBcCisJZXZwL3A1X2NycHQyLmMgXAorCWV2cC9wX2RlYy5jIFwKKwlldnAvcF9lbmMuYyBcCisJZXZwL3BfbGliLmMgXAorCWV2cC9wX29wZW4uYyBcCisJZXZwL3Bfc2VhbC5jIFwKKwlldnAvcF9zaWduLmMgXAorCWV2cC9wX3ZlcmlmeS5jIFwKKwlldnAvcG1ldGhfZm4uYyBcCisJZXZwL3BtZXRoX2duLmMgXAorCWV2cC9wbWV0aF9saWIuYyBcCisJaG1hYy9obV9hbWV0aC5jIFwKKwlobWFjL2htX3BtZXRoLmMgXAorCWhtYWMvaG1hYy5jIFwKKwlrcmI1L2tyYjVfYXNuLmMgXAorCWxoYXNoL2xoX3N0YXRzLmMgXAorCWxoYXNoL2xoYXNoLmMgXAorCW1kNC9tZDRfZGdzdC5jIFwKKwltZDQvbWQ0X29uZS5jIFwKKwltZDUvbWQ1X2Rnc3QuYyBcCisJbWQ1L21kNV9vbmUuYyBcCisJbW9kZXMvY2JjMTI4LmMgXAorCW1vZGVzL2NmYjEyOC5jIFwKKwltb2Rlcy9jdHIxMjguYyBcCisJbW9kZXMvb2ZiMTI4LmMgXAorCW9iamVjdHMvb19uYW1lcy5jIFwKKwlvYmplY3RzL29ial9kYXQuYyBcCisJb2JqZWN0cy9vYmpfZXJyLmMgXAorCW9iamVjdHMvb2JqX2xpYi5jIFwKKwlvYmplY3RzL29ial94cmVmLmMgXAorCW9jc3Avb2NzcF9hc24uYyBcCisJb2NzcC9vY3NwX2NsLmMgXAorCW9jc3Avb2NzcF9lcnIuYyBcCisJb2NzcC9vY3NwX2V4dC5jIFwKKwlvY3NwL29jc3BfaHQuYyBcCisJb2NzcC9vY3NwX2xpYi5jIFwKKwlvY3NwL29jc3BfcHJuLmMgXAorCW9jc3Avb2NzcF9zcnYuYyBcCisJb2NzcC9vY3NwX3ZmeS5jIFwKKwlwZW0vcGVtX2FsbC5jIFwKKwlwZW0vcGVtX2Vyci5jIFwKKwlwZW0vcGVtX2luZm8uYyBcCisJcGVtL3BlbV9saWIuYyBcCisJcGVtL3BlbV9vdGguYyBcCisJcGVtL3BlbV9wazguYyBcCisJcGVtL3BlbV9wa2V5LmMgXAorCXBlbS9wZW1fc2VhbC5jIFwKKwlwZW0vcGVtX3NpZ24uYyBcCisJcGVtL3BlbV94NTA5LmMgXAorCXBlbS9wZW1feGF1eC5jIFwKKwlwZW0vcHZrZm10LmMgXAorCXBrY3MxMi9wMTJfYWRkLmMgXAorCXBrY3MxMi9wMTJfYXNuLmMgXAorCXBrY3MxMi9wMTJfYXR0ci5jIFwKKwlwa2NzMTIvcDEyX2NycHQuYyBcCisJcGtjczEyL3AxMl9jcnQuYyBcCisJcGtjczEyL3AxMl9kZWNyLmMgXAorCXBrY3MxMi9wMTJfaW5pdC5jIFwKKwlwa2NzMTIvcDEyX2tleS5jIFwKKwlwa2NzMTIvcDEyX2tpc3MuYyBcCisJcGtjczEyL3AxMl9tdXRsLmMgXAorCXBrY3MxMi9wMTJfbnBhcy5jIFwKKwlwa2NzMTIvcDEyX3A4ZC5jIFwKKwlwa2NzMTIvcDEyX3A4ZS5jIFwKKwlwa2NzMTIvcDEyX3V0bC5jIFwKKwlwa2NzMTIvcGsxMmVyci5jIFwKKwlwa2NzNy9wazdfYXNuMS5jIFwKKwlwa2NzNy9wazdfYXR0ci5jIFwKKwlwa2NzNy9wazdfZG9pdC5jIFwKKwlwa2NzNy9wazdfbGliLmMJXAorCXBrY3M3L3BrN19taW1lLmMgXAorCXBrY3M3L3BrN19zbWltZS5jIFwKKwlwa2NzNy9wa2NzN2Vyci5jIFwKKwlyYW5kL21kX3JhbmQuYyBcCisJcmFuZC9yYW5kX2VnZC5jIFwKKwlyYW5kL3JhbmRfZXJyLmMgXAorCXJhbmQvcmFuZF9saWIuYyBcCisJcmFuZC9yYW5kX3VuaXguYyBcCisJcmFuZC9yYW5kZmlsZS5jIFwKKwlyYzIvcmMyX2NiYy5jIFwKKwlyYzIvcmMyX2VjYi5jIFwKKwlyYzIvcmMyX3NrZXkuYyBcCisJcmMyL3JjMmNmYjY0LmMgXAorCXJjMi9yYzJvZmI2NC5jIFwKKwlyYzQvcmM0X2VuYy5jIFwKKwlyYzQvcmM0X3NrZXkuYyBcCisJcmlwZW1kL3JtZF9kZ3N0LmMgXAorCXJpcGVtZC9ybWRfb25lLmMgXAorCXJzYS9yc2FfYW1ldGguYyBcCisJcnNhL3JzYV9hc24xLmMgXAorCXJzYS9yc2FfY2hrLmMgXAorCXJzYS9yc2FfZWF5LmMgXAorCXJzYS9yc2FfZXJyLmMgXAorCXJzYS9yc2FfZ2VuLmMgXAorCXJzYS9yc2FfbGliLmMgXAorCXJzYS9yc2Ffbm9uZS5jIFwKKwlyc2EvcnNhX251bGwuYyBcCisJcnNhL3JzYV9vYWVwLmMgXAorCXJzYS9yc2FfcGsxLmMgXAorCXJzYS9yc2FfcG1ldGguYyBcCisJcnNhL3JzYV9wcm4uYyBcCisJcnNhL3JzYV9wc3MuYyBcCisJcnNhL3JzYV9zYW9zLmMgXAorCXJzYS9yc2Ffc2lnbi5jIFwKKwlyc2EvcnNhX3NzbC5jIFwKKwlyc2EvcnNhX3g5MzEuYyBcCisJc2hhL3NoYTFfb25lLmMgXAorCXNoYS9zaGExZGdzdC5jIFwKKwlzaGEvc2hhMjU2LmMgXAorCXNoYS9zaGE1MTIuYyBcCisJc2hhL3NoYV9kZ3N0LmMgXAorCXN0YWNrL3N0YWNrLmMgXAorCXRzL3RzX2Vyci5jIFwKKwl0eHRfZGIvdHh0X2RiLmMgXAorCXVpL3VpX2NvbXBhdC5jIFwKKwl1aS91aV9lcnIuYyBcCisJdWkvdWlfbGliLmMgXAorCXVpL3VpX29wZW5zc2wuYyBcCisJdWkvdWlfdXRpbC5jIFwKKwl4NTA5L2J5X2Rpci5jIFwKKwl4NTA5L2J5X2ZpbGUuYyBcCisJeDUwOS94NTA5X2F0dC5jIFwKKwl4NTA5L3g1MDlfY21wLmMgXAorCXg1MDkveDUwOV9kMi5jIFwKKwl4NTA5L3g1MDlfZGVmLmMgXAorCXg1MDkveDUwOV9lcnIuYyBcCisJeDUwOS94NTA5X2V4dC5jIFwKKwl4NTA5L3g1MDlfbHUuYyBcCisJeDUwOS94NTA5X29iai5jIFwKKwl4NTA5L3g1MDlfcjJ4LmMgXAorCXg1MDkveDUwOV9yZXEuYyBcCisJeDUwOS94NTA5X3NldC5jIFwKKwl4NTA5L3g1MDlfdHJzLmMgXAorCXg1MDkveDUwOV90eHQuYyBcCisJeDUwOS94NTA5X3YzLmMgXAorCXg1MDkveDUwOV92ZnkuYyBcCisJeDUwOS94NTA5X3ZwbS5jIFwKKwl4NTA5L3g1MDljc2V0LmMgXAorCXg1MDkveDUwOW5hbWUuYyBcCisJeDUwOS94NTA5cnNldC5jIFwKKwl4NTA5L3g1MDlzcGtpLmMgXAorCXg1MDkveDUwOXR5cGUuYyBcCisJeDUwOS94X2FsbC5jIFwKKwl4NTA5djMvcGN5X2NhY2hlLmMgXAorCXg1MDl2My9wY3lfZGF0YS5jIFwKKwl4NTA5djMvcGN5X2xpYi5jIFwKKwl4NTA5djMvcGN5X21hcC5jIFwKKwl4NTA5djMvcGN5X25vZGUuYyBcCisJeDUwOXYzL3BjeV90cmVlLmMgXAorCXg1MDl2My92M19ha2V5LmMgXAorCXg1MDl2My92M19ha2V5YS5jIFwKKwl4NTA5djMvdjNfYWx0LmMgXAorCXg1MDl2My92M19iY29ucy5jIFwKKwl4NTA5djMvdjNfYml0c3QuYyBcCisJeDUwOXYzL3YzX2NvbmYuYyBcCisJeDUwOXYzL3YzX2Nwb2xzLmMgXAorCXg1MDl2My92M19jcmxkLmMgXAorCXg1MDl2My92M19lbnVtLmMgXAorCXg1MDl2My92M19leHRrdS5jIFwKKwl4NTA5djMvdjNfZ2Vubi5jIFwKKwl4NTA5djMvdjNfaWE1LmMgXAorCXg1MDl2My92M19pbmZvLmMgXAorCXg1MDl2My92M19pbnQuYyBcCisJeDUwOXYzL3YzX2xpYi5jIFwKKwl4NTA5djMvdjNfbmNvbnMuYyBcCisJeDUwOXYzL3YzX29jc3AuYyBcCisJeDUwOXYzL3YzX3BjaS5jIFwKKwl4NTA5djMvdjNfcGNpYS5jIFwKKwl4NTA5djMvdjNfcGNvbnMuYyBcCisJeDUwOXYzL3YzX3BrdS5jIFwKKwl4NTA5djMvdjNfcG1hcHMuYyBcCisJeDUwOXYzL3YzX3Bybi5jIFwKKwl4NTA5djMvdjNfcHVycC5jIFwKKwl4NTA5djMvdjNfc2tleS5jIFwKKwl4NTA5djMvdjNfc3huZXQuYyBcCisJeDUwOXYzL3YzX3V0bC5jIFwKKwl4NTA5djMvdjNlcnIuYworCitsb2NhbF9jX2luY2x1ZGVzIDo9IFwKKwlleHRlcm5hbC9vcGVuc3NsIFwKKwlleHRlcm5hbC9vcGVuc3NsL2NyeXB0by9hc24xIFwKKwlleHRlcm5hbC9vcGVuc3NsL2NyeXB0by9ldnAgXAorCWV4dGVybmFsL29wZW5zc2wvaW5jbHVkZSBcCisJZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlL29wZW5zc2wgXAorCWV4dGVybmFsL3psaWIKKworbG9jYWxfY19mbGFncyA6PSAtRE5PX1dJTkRPV1NfQlJBSU5ERUFUSAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyB0YXJnZXQKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2FuZHJvaWQtY29uZmlnLm1rCitMT0NBTF9TUkNfRklMRVMgKz0gJChsb2NhbF9zcmNfZmlsZXMpCitMT0NBTF9DRkxBR1MgKz0gJChsb2NhbF9jX2ZsYWdzKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKGxvY2FsX2NfaW5jbHVkZXMpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnoKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLGFybSkKKwlMT0NBTF9TUkNfRklMRVMgKz0gJChhcm1fc3JjX2ZpbGVzKQorCUxPQ0FMX0NGTEFHUyArPSAkKGFybV9jZmxhZ3MpCitlbHNlCisJTE9DQUxfU1JDX0ZJTEVTICs9ICQobm9uX2FybV9zcmNfZmlsZXMpCitlbmRpZgoraWZlcSAoJChUQVJHRVRfU0lNVUxBVE9SKSx0cnVlKQorCSMgTWFrZSB2YWxncmluZCBoYXBweS4KKwlMT0NBTF9DRkxBR1MgKz0gLURQVVJJRlkKKyAgICBMT0NBTF9MRExJQlMgKz0gLWxkbAorZWxzZQorCUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliZGwKK2VuZGlmCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFOj0gbGliY3J5cHRvCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBob3N0IHNoYXJlZCBsaWJyYXJ5CitpZmVxICgkKFdJVEhfSE9TVF9EQUxWSUspLHRydWUpCisgICAgaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisgICAgaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2FuZHJvaWQtY29uZmlnLm1rCisgICAgTE9DQUxfU1JDX0ZJTEVTICs9ICQobG9jYWxfc3JjX2ZpbGVzKQorICAgIExPQ0FMX0NGTEFHUyArPSAkKGxvY2FsX2NfZmxhZ3MpIC1EUFVSSUZZCisgICAgTE9DQUxfQ19JTkNMVURFUyArPSAkKGxvY2FsX2NfaW5jbHVkZXMpCisgICAgTE9DQUxfU1JDX0ZJTEVTICs9ICQobm9uX2FybV9zcmNfZmlsZXMpCisgICAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJ6CisgICAgTE9DQUxfTERMSUJTICs9IC1sZGwKKyAgICBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorICAgIExPQ0FMX01PRFVMRTo9IGxpYmNyeXB0bworICAgIGluY2x1ZGUgJChCVUlMRF9IT1NUX1NIQVJFRF9MSUJSQVJZKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBob3N0IHN0YXRpYyBsaWJyYXJ5LCB3aGljaCBpcyB1c2VkIGJ5IHNvbWUgU0RLIHRvb2xzLgorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi9hbmRyb2lkLWNvbmZpZy5taworTE9DQUxfU1JDX0ZJTEVTICs9ICQobG9jYWxfc3JjX2ZpbGVzKQorTE9DQUxfQ0ZMQUdTICs9ICQobG9jYWxfY19mbGFncykgLURQVVJJRlkKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChsb2NhbF9jX2luY2x1ZGVzKQorTE9DQUxfU1JDX0ZJTEVTICs9ICQobm9uX2FybV9zcmNfZmlsZXMpCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTICs9IGxpYnoKK0xPQ0FMX0xETElCUyArPSAtbGRsCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFOj0gbGliY3J5cHRvX3N0YXRpYworaW5jbHVkZSAkKEJVSUxEX0hPU1RfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9wYXRjaGVzL2hhbmRzaGFrZV9jdXR0aHJvdWdoLnBhdGNoIGIvbGliL29wZW5zc2wvcGF0Y2hlcy9oYW5kc2hha2VfY3V0dGhyb3VnaC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjI5ODM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvcGF0Y2hlcy9oYW5kc2hha2VfY3V0dGhyb3VnaC5wYXRjaApAQCAtMCwwICsxLDI3NSBAQAorZGlmZiAtdWFycCBvcGVuc3NsLTEuMC4wLm9yaWcvYXBwcy9zX2NsaWVudC5jIG9wZW5zc2wtMS4wLjAvYXBwcy9zX2NsaWVudC5jCistLS0gb3BlbnNzbC0xLjAuMC5vcmlnL2FwcHMvc19jbGllbnQuYwkyMDA5LTEyLTE2IDE1OjI4OjI4LjAwMDAwMDAwMCAtMDUwMAorKysrIG9wZW5zc2wtMS4wLjAvYXBwcy9zX2NsaWVudC5jCTIwMTAtMDQtMjEgMTQ6Mzk6NDkuMDAwMDAwMDAwIC0wNDAwCitAQCAtMjQ4LDYgKzI0OCw3IEBAIHN0YXRpYyB2b2lkIHNjX3VzYWdlKHZvaWQpCisgCUJJT19wcmludGYoYmlvX2VyciwiIC10bHNleHRkZWJ1ZyAgICAgIC0gaGV4IGR1bXAgb2YgYWxsIFRMUyBleHRlbnNpb25zIHJlY2VpdmVkXG4iKTsKKyAJQklPX3ByaW50ZihiaW9fZXJyLCIgLXN0YXR1cyAgICAgICAgICAgLSByZXF1ZXN0IGNlcnRpZmljYXRlIHN0YXR1cyBmcm9tIHNlcnZlclxuIik7CisgCUJJT19wcmludGYoYmlvX2VyciwiIC1ub190aWNrZXQgICAgICAgIC0gZGlzYWJsZSB1c2Ugb2YgUkZDNDUwN2JpcyBzZXNzaW9uIHRpY2tldHNcbiIpOworKwlCSU9fcHJpbnRmKGJpb19lcnIsIiAtY3V0dGhyb3VnaCAgICAgICAtIGVuYWJsZSAxLVJUVCBmdWxsLWhhbmRzaGFrZSBmb3Igc3Ryb25nIGNpcGhlcnNcbiIpOworICNlbmRpZgorIAl9CisgCitAQCAtMzA0LDYgKzMwNSw3IEBAIGludCBNQUlOKGludCBhcmdjLCBjaGFyICoqYXJndikKKyAJRVZQX1BLRVkgKmtleSA9IE5VTEw7CisgCWNoYXIgKkNBcGF0aD1OVUxMLCpDQWZpbGU9TlVMTCwqY2lwaGVyPU5VTEw7CisgCWludCByZWNvbm5lY3Q9MCxiYWRvcD0wLHZlcmlmeT1TU0xfVkVSSUZZX05PTkUsYnVncz0wOworKwlpbnQgY3V0dGhyb3VnaD0wOworIAlpbnQgY3JsZj0wOworIAlpbnQgd3JpdGVfdHR5LHJlYWRfdHR5LHdyaXRlX3NzbCxyZWFkX3NzbCx0dHlfb24sc3NsX3BlbmRpbmc7CisgCVNTTF9DVFggKmN0eD1OVUxMOworQEAgLTUzMyw2ICs1MzUsOCBAQCBpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1ub190aWNrZXQiKSA9PSAwKQorIAkJCXsgb2ZmfD1TU0xfT1BfTk9fVElDS0VUOyB9CisgI2VuZGlmCisrCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1jdXR0aHJvdWdoIikgPT0gMCkKKysJCQljdXR0aHJvdWdoPTE7CisgCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1zZXJ2ZXJwcmVmIikgPT0gMCkKKyAJCQlvZmZ8PVNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0U7CisgCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jaXBoZXIiKSA9PSAwKQorQEAgLTcxNCw2ICs3MTgsMTUgQEAgYmFkOgorIAkgKi8KKyAJaWYgKHNvY2tfdHlwZSA9PSBTT0NLX0RHUkFNKSBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkKGN0eCwgMSk7CisgCisrCS8qIEVuYWJsZSBoYW5kc2hha2UgY3V0dGhyb3VnaCBmb3IgY2xpZW50IGNvbm5lY3Rpb25zIHVzaW5nCisrCSAqIHN0cm9uZyBjaXBoZXJzLiAqLworKwlpZiAoY3V0dGhyb3VnaCkKKysJCXsKKysJCWludCBzc2xfbW9kZSA9IFNTTF9DVFhfZ2V0X21vZGUoY3R4KTsKKysJCXNzbF9tb2RlIHw9IFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIOworKwkJU1NMX0NUWF9zZXRfbW9kZShjdHgsIHNzbF9tb2RlKTsKKysJCX0KKysKKyAJaWYgKHN0YXRlKSBTU0xfQ1RYX3NldF9pbmZvX2NhbGxiYWNrKGN0eCxhcHBzX3NzbF9pbmZvX2NhbGxiYWNrKTsKKyAJaWYgKGNpcGhlciAhPSBOVUxMKQorIAkJaWYoIVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eCxjaXBoZXIpKSB7CitkaWZmIC11YXJwIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvczNfY2xudC5jIG9wZW5zc2wtMS4wLjAvc3NsL3MzX2NsbnQuYworLS0tIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvczNfY2xudC5jCTIwMTAtMDItMjcgMTk6MjQ6MjQuMDAwMDAwMDAwIC0wNTAwCisrKysgb3BlbnNzbC0xLjAuMC9zc2wvczNfY2xudC5jCTIwMTAtMDQtMjEgMTQ6Mzk6NDkuMDAwMDAwMDAwIC0wNDAwCitAQCAtMTg2LDYgKzE4NiwxOCBAQCBpbnQgc3NsM19jb25uZWN0KFNTTCAqcykKKyAJCisgCXMtPmluX2hhbmRzaGFrZSsrOworIAlpZiAoIVNTTF9pbl9pbml0KHMpIHx8IFNTTF9pbl9iZWZvcmUocykpIFNTTF9jbGVhcihzKTsgCisrI2lmIDAJLyogU2VuZCBhcHAgZGF0YSBpbiBzZXBhcmF0ZSBwYWNrZXQsIG90aGVyd2lzZSwgc29tZSBwYXJ0aWN1bGFyIHNpdGUKKysJICogKG9ubHkgb25lIHNpdGUgc28gZmFyKSBjbG9zZXMgdGhlIHNvY2tldC4KKysJICogTm90ZTogdGhlcmUgaXMgYSB2ZXJ5IHNtYWxsIGNoYW5jZSB0aGF0IHR3byBUQ1AgcGFja2V0cworKwkgKiBjb3VsZCBiZSBhcnJpdmluZyBhdCBzZXJ2ZXIgY29tYmluZWQgaW50byBhIHNpbmdsZSBUQ1AgcGFja2V0LAorKwkgKiB0aGVuIHRyaWdnZXIgdGhhdCBzaXRlIHRvIGJyZWFrLiBXZSBoYXZlbid0IGVuY291bnRlciB0aGF0IHRob3VnaC4KKysJICovCisrCWlmIChTU0xfZ2V0X21vZGUocykgJiBTU0xfTU9ERV9IQU5EU0hBS0VfQ1VUVEhST1VHSCkKKysJCXsKKysJCS8qIFNlbmQgYXBwIGRhdGEgYWxvbmcgd2l0aCBDQ1MvRmluaXNoZWQgKi8KKysJCXMtPnMzLT5mbGFncyB8PSBTU0wzX0ZMQUdTX0RFTEFZX0NMSUVOVF9GSU5JU0hFRDsKKysJCX0KKysjZW5kaWYKKyAKKyAJZm9yICg7OykKKyAJCXsKK0BAIC00NTQsMTQgKzQ2OCwzMSBAQCBpbnQgc3NsM19jb25uZWN0KFNTTCAqcykKKyAJCQkJfQorIAkJCWVsc2UKKyAJCQkJeworLSNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKy0JCQkJLyogQWxsb3cgTmV3U2Vzc2lvblRpY2tldCBpZiB0aWNrZXQgZXhwZWN0ZWQgKi8KKy0JCQkJaWYgKHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQpCistCQkJCQlzLT5zMy0+dG1wLm5leHRfc3RhdGU9U1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BOworKwkJCQlpZiAoKFNTTF9nZXRfbW9kZShzKSAmIFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIKSAmJiBTU0xfZ2V0X2NpcGhlcl9iaXRzKHMsIE5VTEwpID49IDEyOAorKwkJCQkgICAgJiYgcy0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZF9sZW4gPT0gMCAvKiBubyBjdXR0aHJvdWdoIG9uIHJlbmVnb3RpYXRpb24gKHdvdWxkIGNvbXBsaWNhdGUgdGhlIHN0YXRlIG1hY2hpbmUpICovCisrCQkJCSAgICkKKysJCQkJCXsKKysJCQkJCWlmIChzLT5zMy0+ZmxhZ3MgJiBTU0wzX0ZMQUdTX0RFTEFZX0NMSUVOVF9GSU5JU0hFRCkKKysJCQkJCQl7CisrCQkJCQkJcy0+c3RhdGU9U1NMM19TVF9DVVRUSFJPVUdIX0NPTVBMRVRFOworKwkJCQkJCXMtPnMzLT5mbGFnc3w9U1NMM19GTEFHU19QT1BfQlVGRkVSOworKwkJCQkJCXMtPnMzLT5kZWxheV9idWZfcG9wX3JldD0wOworKwkJCQkJCX0KKysJCQkJCWVsc2UKKysJCQkJCQl7CisrCQkJCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTDNfU1RfQ1VUVEhST1VHSF9DT01QTEVURTsKKysJCQkJCQl9CisrCQkJCQl9CisgCQkJCWVsc2UKKysJCQkJCXsKKysjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisrCQkJCQkvKiBBbGxvdyBOZXdTZXNzaW9uVGlja2V0IGlmIHRpY2tldCBleHBlY3RlZCAqLworKwkJCQkJaWYgKHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQpCisrCQkJCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQTsKKysJCQkJCWVsc2UKKyAjZW5kaWYKKy0JCQkJCistCQkJCXMtPnMzLT50bXAubmV4dF9zdGF0ZT1TU0wzX1NUX0NSX0ZJTklTSEVEX0E7CisrCQkJCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTDNfU1RfQ1JfRklOSVNIRURfQTsKKysJCQkJCX0KKyAJCQkJfQorIAkJCXMtPmluaXRfbnVtPTA7CisgCQkJYnJlYWs7CitAQCAtNTEyLDYgKzU0MSwyNCBAQCBpbnQgc3NsM19jb25uZWN0KFNTTCAqcykKKyAJCQlzLT5zdGF0ZT1zLT5zMy0+dG1wLm5leHRfc3RhdGU7CisgCQkJYnJlYWs7CisgCisrCQljYXNlIFNTTDNfU1RfQ1VUVEhST1VHSF9DT01QTEVURToKKysjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisrCQkJLyogQWxsb3cgTmV3U2Vzc2lvblRpY2tldCBpZiB0aWNrZXQgZXhwZWN0ZWQgKi8KKysJCQlpZiAocy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCkKKysJCQkJcy0+c3RhdGU9U1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BOworKwkJCWVsc2UKKysjZW5kaWYKKysJCQkJcy0+c3RhdGU9U1NMM19TVF9DUl9GSU5JU0hFRF9BOworKworKwkJCS8qIFNTTF93cml0ZSgpIHdpbGwgdGFrZSBjYXJlIG9mIGZsdXNoaW5nIGJ1ZmZlcmVkIGRhdGEgaWYKKysJCQkgKiBERUxBWV9DTElFTlRfRklOSVNIRUQgaXMgc2V0LgorKwkJCSAqLworKwkJCWlmICghKHMtPnMzLT5mbGFncyAmIFNTTDNfRkxBR1NfREVMQVlfQ0xJRU5UX0ZJTklTSEVEKSkKKysJCQkJc3NsX2ZyZWVfd2Jpb19idWZmZXIocyk7CisrCQkJcmV0ID0gMTsKKysJCQlnb3RvIGVuZDsKKysJCQkvKiBicmVhazsgKi8KKysKKyAJCWNhc2UgU1NMX1NUX09LOgorIAkJCS8qIGNsZWFuIGEgZmV3IHRoaW5ncyB1cCAqLworIAkJCXNzbDNfY2xlYW51cF9rZXlfYmxvY2socyk7CitkaWZmIC11YXJwIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvczNfbGliLmMgb3BlbnNzbC0xLjAuMC9zc2wvczNfbGliLmMKKy0tIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvczNfbGliLmMgICAgIDIwMDktMTAtMTYgMTE6MjQ6MTkuMDAwMDAwMDAwIC0wNDAwCisrKysgb3BlbnNzbC0xLjAuMC9zc2wvczNfbGliLmMgIDIwMTAtMDQtMjEgMTQ6Mzk6NDkuMDAwMDAwMDAwIC0wNDAwCitAQCAtMjU1MSw5ICsyNTUxLDIyIEBAIGludCBzc2wzX3dyaXRlKFNTTCAqcywgY29uc3Qgdm9pZCAqYnVmLCAKKyAKKyBzdGF0aWMgaW50IHNzbDNfcmVhZF9pbnRlcm5hbChTU0wgKnMsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHBlZWspCisgCXsKKy0JaW50IHJldDsKKysJaW50IG4scmV0OworIAkKKyAJY2xlYXJfc3lzX2Vycm9yKCk7CisrCWlmICgocy0+czMtPmZsYWdzICYgU1NMM19GTEFHU19QT1BfQlVGRkVSKSAmJiAocy0+d2JpbyA9PSBzLT5iYmlvKSkKKysJCXsKKysJCS8qIERlYWwgd2l0aCBhbiBhcHBsaWNhdGlvbiB0aGF0IGNhbGxzIFNTTF9yZWFkKCkgd2hlbiBoYW5kc2hha2UgZGF0YQorKwkJICogaXMgeWV0IHRvIGJlIHdyaXR0ZW4uCisrCQkgKi8KKysJCWlmIChCSU9fd3BlbmRpbmcocy0+d2JpbykgPiAwKQorKwkJCXsKKysJCQlzLT5yd3N0YXRlPVNTTF9XUklUSU5HOworKwkJCW49QklPX2ZsdXNoKHMtPndiaW8pOworKwkJCWlmIChuIDw9IDApIHJldHVybihuKTsKKysJCQlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworKwkJCX0KKysJCX0KKyAJaWYgKHMtPnMzLT5yZW5lZ290aWF0ZSkgc3NsM19yZW5lZ290aWF0ZV9jaGVjayhzKTsKKyAJcy0+czMtPmluX3JlYWRfYXBwX2RhdGE9MTsKKyAJcmV0PXMtPm1ldGhvZC0+c3NsX3JlYWRfYnl0ZXMocyxTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEsYnVmLGxlbixwZWVrKTsKK2RpZmYgLXVhcnAgb3BlbnNzbC0xLjAuMC5vcmlnL3NzbC9zc2wuaCBvcGVuc3NsLTEuMC4wL3NzbC9zc2wuaAorLS0tIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvc3NsLmgJMjAxMC0wMS0wNiAxMjozNzozOC4wMDAwMDAwMDAgLTA1MDAKKysrKyBvcGVuc3NsLTEuMC4wL3NzbC9zc2wuaAkyMDEwLTA0LTIxIDE2OjU3OjQ5LjAwMDAwMDAwMCAtMDQwMAorQEAgLTYwNSw2ICs2MDUsMTAgQEAgdHlwZWRlZiBzdHJ1Y3Qgc3NsX3Nlc3Npb25fc3QKKyAvKiBVc2Ugc21hbGwgcmVhZCBhbmQgd3JpdGUgYnVmZmVyczogKGEpIGxhenkgYWxsb2NhdGUgcmVhZCBidWZmZXJzIGZvcgorICAqIGxhcmdlIGluY29taW5nIHJlY29yZHMsIGFuZCAoYikgbGltaXQgdGhlIHNpemUgb2Ygb3V0Z29pbmcgcmVjb3Jkcy4gKi8KKyAjZGVmaW5lIFNTTF9NT0RFX1NNQUxMX0JVRkZFUlMgMHgwMDAwMDAyMEwKKysvKiBXaGVuIHNldCwgY2xpZW50cyBtYXkgc2VuZCBhcHBsaWNhdGlvbiBkYXRhIGJlZm9yZSByZWNlaXB0IG9mIENDUworKyAqIGFuZCBGaW5pc2hlZC4gIFRoaXMgbW9kZSBlbmFibGVzIGZ1bGwtaGFuZHNoYWtlcyB0byAnY29tcGxldGUnIGluCisrICogb25lIFJUVC4gKi8KKysjZGVmaW5lIFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIIDB4MDAwMDAwNDBMCisKKyAvKiBOb3RlOiBTU0xbX0NUWF1fc2V0X3tvcHRpb25zLG1vZGV9IHVzZSB8PSBvcCBvbiB0aGUgcHJldmlvdXMgdmFsdWUsCisgICogdGhleSBjYW5ub3QgYmUgdXNlZCB0byBjbGVhciBiaXRzLiAqLworQEAgLTEwOTcsMTAgKzExMDEsMTIgQEAgZXh0ZXJuICJDIiB7CisgLyogSXMgdGhlIFNTTF9jb25uZWN0aW9uIGVzdGFibGlzaGVkPyAqLworICNkZWZpbmUgU1NMX2dldF9zdGF0ZShhKQkJU1NMX3N0YXRlKGEpCisgI2RlZmluZSBTU0xfaXNfaW5pdF9maW5pc2hlZChhKQkJKFNTTF9zdGF0ZShhKSA9PSBTU0xfU1RfT0spCistI2RlZmluZSBTU0xfaW5faW5pdChhKQkJCShTU0xfc3RhdGUoYSkmU1NMX1NUX0lOSVQpCisrI2RlZmluZSBTU0xfaW5faW5pdChhKQkJCSgoU1NMX3N0YXRlKGEpJlNTTF9TVF9JTklUKSAmJiBcCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFTU0xfY3V0dGhyb3VnaF9jb21wbGV0ZShhKSkKKyAjZGVmaW5lIFNTTF9pbl9iZWZvcmUoYSkJCShTU0xfc3RhdGUoYSkmU1NMX1NUX0JFRk9SRSkKKyAjZGVmaW5lIFNTTF9pbl9jb25uZWN0X2luaXQoYSkJCShTU0xfc3RhdGUoYSkmU1NMX1NUX0NPTk5FQ1QpCisgI2RlZmluZSBTU0xfaW5fYWNjZXB0X2luaXQoYSkJCShTU0xfc3RhdGUoYSkmU1NMX1NUX0FDQ0VQVCkKKytpbnQgU1NMX2N1dHRocm91Z2hfY29tcGxldGUoY29uc3QgU1NMICpzKTsKKyAKKyAvKiBUaGUgZm9sbG93aW5nIDIgc3RhdGVzIGFyZSBrZXB0IGluIHNzbC0+cnN0YXRlIHdoZW4gcmVhZHMgZmFpbCwKKyAgKiB5b3Ugc2hvdWxkIG5vdCBuZWVkIHRoZXNlICovCitPbmx5IGluIG9wZW5zc2wtMS4wLjAvc3NsOiBzc2wuaC5vcmlnCitkaWZmIC11YXJwIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvc3NsMy5oIG9wZW5zc2wtMS4wLjAvc3NsL3NzbDMuaAorLS0gb3BlbnNzbC0xLjAuMC5vcmlnL3NzbC9zc2wzLmgJMjAxMC0wMS0wNiAxMjozNzozOC4wMDAwMDAwMDAgLTA1MDAKKysrKyBvcGVuc3NsLTEuMC4wL3NzbC9zc2wzLmgJMjAxMC0wNC0yMSAxNDozOTo0OS4wMDAwMDAwMDAgLTA0MDAKK0BAIC00NTYsNiArNDU2LDcgQEAgdHlwZWRlZiBzdHJ1Y3Qgc3NsM19zdGF0ZV9zdAorIC8qY2xpZW50ICovCisgLyogZXh0cmEgc3RhdGUgKi8KKyAjZGVmaW5lIFNTTDNfU1RfQ1dfRkxVU0gJCSgweDEwMHxTU0xfU1RfQ09OTkVDVCkKKysjZGVmaW5lIFNTTDNfU1RfQ1VUVEhST1VHSF9DT01QTEVURQkoMHgxMDF8U1NMX1NUX0NPTk5FQ1QpCisgLyogd3JpdGUgdG8gc2VydmVyICovCisgI2RlZmluZSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQQkJKDB4MTEwfFNTTF9TVF9DT05ORUNUKQorICNkZWZpbmUgU1NMM19TVF9DV19DTE5UX0hFTExPX0IJCSgweDExMXxTU0xfU1RfQ09OTkVDVCkKK2RpZmYgLXVhcnAgb3BlbnNzbC0xLjAuMC5vcmlnL3NzbC9zc2xfbGliLmMgb3BlbnNzbC0xLjAuMC9zc2wvc3NsX2xpYi5jCistLS0gb3BlbnNzbC0xLjAuMC5vcmlnL3NzbC9zc2xfbGliLmMJMjAxMC0wMi0xNyAxNDo0Mzo0Ni4wMDAwMDAwMDAgLTA1MDAKKysrKyBvcGVuc3NsLTEuMC4wL3NzbC9zc2xfbGliLmMJMjAxMC0wNC0yMSAxNzowMjo0NS4wMDAwMDAwMDAgLTA0MDAKK0BAIC0zMDMxLDYgKzMwMzEsMTkgQEAgdm9pZCBTU0xfc2V0X21zZ19jYWxsYmFjayhTU0wgKnNzbCwgdm9pZAorIAlTU0xfY2FsbGJhY2tfY3RybChzc2wsIFNTTF9DVFJMX1NFVF9NU0dfQ0FMTEJBQ0ssICh2b2lkICgqKSh2b2lkKSljYik7CisgCX0KKworK2ludCBTU0xfY3V0dGhyb3VnaF9jb21wbGV0ZShjb25zdCBTU0wgKnMpCisrCXsKKysJcmV0dXJuICghcy0+c2VydmVyICYmICAgICAgICAgICAgICAgICAvKiBjdXR0aHJvdWdoIG9ubHkgYXBwbGllcyB0byBjbGllbnRzICovCisrCQkhcy0+aGl0ICYmICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbC1oYW5kc2hha2UgKi8KKysJCXMtPnZlcnNpb24gPj0gU1NMM19WRVJTSU9OICYmCisrCQlzLT5zMy0+aW5fcmVhZF9hcHBfZGF0YSA9PSAwICYmICAgLyogY3V0dGhyb3VnaCBvbmx5IGFwcGxpZXMgdG8gd3JpdGUoKSAqLworKwkJKFNTTF9nZXRfbW9kZSgoU1NMKilzKSAmIFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIKSAmJiAgLyogY3V0dGhyb3VnaCBlbmFibGVkICovCisrCQlTU0xfZ2V0X2NpcGhlcl9iaXRzKHMsIE5VTEwpID49IDEyOCAmJiAgICAgICAgICAgICAgICAgICAgICAvKiBzdHJvbmcgY2lwaGVyIGNob29zZW4gKi8KKysJCXMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuID09IDAgJiYgICAgICAgICAgICAgICAgIC8qIG5vdCBhIHJlbmVnb3RpYXRpb24gaGFuZHNoYWtlICovCisrCQkocy0+c3RhdGUgPT0gU1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BIHx8ICAgICAgICAgICAgICAgICAvKiByZWFkeSB0byB3cml0ZSBhcHAtZGF0YSovCisrCQkJcy0+c3RhdGUgPT0gU1NMM19TVF9DUl9GSU5JU0hFRF9BKSk7CisrCX0KKysKKyAvKiBBbGxvY2F0ZXMgbmV3IEVWUF9NRF9DVFggYW5kIHNldHMgcG9pbnRlciB0byBpdCBpbnRvIGdpdmVuIHBvaW50ZXIKKyAgKiB2YWlyYWJsZSwgZnJlZWluZyAgRVZQX01EX0NUWCBwcmV2aW91c2x5IHN0b3JlZCBpbiB0aGF0IHZhcmlhYmxlLCBpZgorICAqIGFueS4gSWYgRVZQX01EIHBvaW50ZXIgaXMgcGFzc2VkLCBpbml0aWFsaXplcyBjdHggd2l0aCB0aGlzIG1kCitkaWZmIC11YXJwIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvc3NsdGVzdC5jIG9wZW5zc2wtMS4wLjAvc3NsL3NzbHRlc3QuYworLS0tIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvc3NsdGVzdC5jCTIwMTAtMDEtMjQgMTE6NTc6MzguMDAwMDAwMDAwIC0wNTAwCisrKysgb3BlbnNzbC0xLjAuMC9zc2wvc3NsdGVzdC5jCTIwMTAtMDQtMjEgMTc6MDY6MzUuMDAwMDAwMDAwIC0wNDAwCitAQCAtMjc5LDYgKzI3OSw3IEBAIHN0YXRpYyB2b2lkIHN2X3VzYWdlKHZvaWQpCisgCWZwcmludGYoc3RkZXJyLCIgLXRlc3RfY2lwaGVybGlzdCAtIHZlcmlmaWVzIHRoZSBvcmRlciBvZiB0aGUgc3NsIGNpcGhlciBsaXN0c1xuIik7CisgCWZwcmludGYoc3RkZXJyLCIgLWNfc21hbGxfcmVjb3JkcyAtIGVuYWJsZSBjbGllbnQgc2lkZSB1c2Ugb2Ygc21hbGwgU1NMIHJlY29yZCBidWZmZXJzXG4iKTsKKyAJZnByaW50ZihzdGRlcnIsIiAtc19zbWFsbF9yZWNvcmRzIC0gZW5hYmxlIHNlcnZlciBzaWRlIHVzZSBvZiBzbWFsbCBTU0wgcmVjb3JkIGJ1ZmZlcnNcbiIpOworKwlmcHJpbnRmKHN0ZGVyciwiIC1jdXR0aHJvdWdoICAgICAgLSBlbmFibGUgMS1SVFQgZnVsbC1oYW5kc2hha2UgZm9yIHN0cm9uZyBjaXBoZXJzXG4iKTsKKyAJfQorIAorIHN0YXRpYyB2b2lkIHByaW50X2RldGFpbHMoU1NMICpjX3NzbCwgY29uc3QgY2hhciAqcHJlZml4KQorQEAgLTQzNiw2ICs0MzcsNyBAQCBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorIAlpbnQgc3NsX21vZGUgPSAwOworIAlpbnQgY19zbWFsbF9yZWNvcmRzPTA7CisgCWludCBzX3NtYWxsX3JlY29yZHM9MDsKKysJaW50IGN1dHRocm91Z2ggPSAwOworIAorIAl2ZXJib3NlID0gMDsKKyAJZGVidWcgPSAwOworQEAgLTYzMiw2ICs2MzQsMTAgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyAJCQl7CisgCQkJc19zbWFsbF9yZWNvcmRzID0gMTsKKyAJCQl9CisrCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItY3V0dGhyb3VnaCIpID09IDApCisrCQkJeworKwkJCWN1dHRocm91Z2ggPSAxOworKwkJCX0KKyAJCWVsc2UKKyAJCQl7CisgCQkJZnByaW50ZihzdGRlcnIsInVua25vd24gb3B0aW9uICVzXG4iLCphcmd2KTsKK0BAIC03ODIsNiArNzg4LDEzIEBAIGJhZDoKKyAJCXNzbF9tb2RlIHw9IFNTTF9NT0RFX1NNQUxMX0JVRkZFUlM7CisgCQlTU0xfQ1RYX3NldF9tb2RlKHNfY3R4LCBzc2xfbW9kZSk7CisgCQl9CisrCXNzbF9tb2RlID0gMDsKKysJaWYgKGN1dHRocm91Z2gpCisrCQl7CisrCQlzc2xfbW9kZSA9IFNTTF9DVFhfZ2V0X21vZGUoY19jdHgpOworKwkJc3NsX21vZGUgPSBTU0xfTU9ERV9IQU5EU0hBS0VfQ1VUVEhST1VHSDsKKysJCVNTTF9DVFhfc2V0X21vZGUoY19jdHgsIHNzbF9tb2RlKTsKKysJCX0KKyAKKyAjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyAJaWYgKCFub19kaGUpCitkaWZmIC11YXJwIG9wZW5zc2wtMS4wLjAub3JpZy90ZXN0L3Rlc3Rzc2wgb3BlbnNzbC0xLjAuMC90ZXN0L3Rlc3Rzc2wKKy0tLSBvcGVuc3NsLTEuMC4wLm9yaWcvdGVzdC90ZXN0c3NsCTIwMDYtMDMtMTAgMTg6MDY6MjcuMDAwMDAwMDAwIC0wNTAwCisrKysgb3BlbnNzbC0xLjAuMC90ZXN0L3Rlc3Rzc2wJMjAxMC0wNC0yMSAxNjo1MDoxMy4wMDAwMDAwMDAgLTA0MDAKK0BAIC03OSw2ICs3OSw4IEBAICRzc2x0ZXN0IC1zZXJ2ZXJfYXV0aCAtY2xpZW50X2F1dGggLXNfc20KKyBlY2hvIHRlc3Qgc3NsdjIvc3NsdjMgd2l0aCBib3RoIGNsaWVudCBhbmQgc2VydmVyIGF1dGhlbnRpY2F0aW9uIGFuZCBzbWFsbCBjbGllbnQgYW5kIHNlcnZlciBidWZmZXJzCisgJHNzbHRlc3QgLXNlcnZlcl9hdXRoIC1jbGllbnRfYXV0aCAtY19zbWFsbF9yZWNvcmRzIC1zX3NtYWxsX3JlY29yZHMgJENBICRleHRyYSB8fCBleGl0IDEKKyAKKytlY2hvIHRlc3Qgc3NsdjIvc3NsdjMgd2l0aCBib3RoIGNsaWVudCBhbmQgc2VydmVyIGF1dGhlbnRpY2F0aW9uIGFuZCBoYW5kc2hha2UgY3V0dGhyb3VnaAorKyRzc2x0ZXN0IC1zZXJ2ZXJfYXV0aCAtY2xpZW50X2F1dGggLWN1dHRocm91Z2ggJENBICRleHRyYSB8fCBleGl0IDEKKyAKKyBlY2hvIHRlc3Qgc3NsdjIgdmlhIEJJTyBwYWlyCisgJHNzbHRlc3QgLWJpb19wYWlyIC1zc2wyICRleHRyYSB8fCBleGl0IDEKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3BhdGNoZXMvanNzZS5wYXRjaCBiL2xpYi9vcGVuc3NsL3BhdGNoZXMvanNzZS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA4N2RlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvcGF0Y2hlcy9qc3NlLnBhdGNoCkBAIC0wLDAgKzEsMjk3IEBACistLS0gb3BlbnNzbC0xLjAuMC5vcmlnL3NzbC9zc2wuaAkyMDEwLTA3LTEzIDIyOjI0OjI3LjAwMDAwMDAwMCArMDAwMAorKysrIG9wZW5zc2wtMS4wLjAvc3NsL3NzbC5oCTIwMTAtMDctMTMgMjI6MjQ6MjcuMDAwMDAwMDAwICswMDAwCitAQCAtMTA5MCw2ICsxMDkwLDkgQEAgc3RydWN0IHNzbF9zdAorIAkvKiBUaGlzIGNhbiBhbHNvIGJlIGluIHRoZSBzZXNzaW9uIG9uY2UgYSBzZXNzaW9uIGlzIGVzdGFibGlzaGVkICovCisgCVNTTF9TRVNTSU9OICpzZXNzaW9uOworIAorKyAgICAgICAgLyogVGhpcyBjYW4gYmUgZGlzYWJsZWQgdG8gcHJldmVudCB0aGUgdXNlIG9mIHVuY2FjaGVkIHNlc3Npb25zICovCisrCWludCBzZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQ7CisrCisgCS8qIERlZmF1bHQgZ2VuZXJhdGUgc2Vzc2lvbiBJRCBjYWxsYmFjay4gKi8KKyAJR0VOX1NFU1NJT05fQ0IgZ2VuZXJhdGVfc2Vzc2lvbl9pZDsKKyAKK0BAIC0xNTA5LDYgKzE1MTIsNyBAQCBCSU8gKglTU0xfZ2V0X3JiaW8oY29uc3QgU1NMICpzKTsKKyBCSU8gKglTU0xfZ2V0X3diaW8oY29uc3QgU1NMICpzKTsKKyAjZW5kaWYKKyBpbnQJU1NMX3NldF9jaXBoZXJfbGlzdChTU0wgKnMsIGNvbnN0IGNoYXIgKnN0cik7CisraW50CVNTTF9zZXRfY2lwaGVyX2xpc3RzKFNTTCAqcywgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnNrKTsKKyB2b2lkCVNTTF9zZXRfcmVhZF9haGVhZChTU0wgKnMsIGludCB5ZXMpOworIGludAlTU0xfZ2V0X3ZlcmlmeV9tb2RlKGNvbnN0IFNTTCAqcyk7CisgaW50CVNTTF9nZXRfdmVyaWZ5X2RlcHRoKGNvbnN0IFNTTCAqcyk7CitAQCAtMTUyNCw2ICsxNTI4LDggQEAgaW50CVNTTF91c2VfUHJpdmF0ZUtleShTU0wgKnNzbCwgRVZQX1BLRQorIGludAlTU0xfdXNlX1ByaXZhdGVLZXlfQVNOMShpbnQgcGssU1NMICpzc2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGxvbmcgbGVuKTsKKyBpbnQJU1NMX3VzZV9jZXJ0aWZpY2F0ZShTU0wgKnNzbCwgWDUwOSAqeCk7CisgaW50CVNTTF91c2VfY2VydGlmaWNhdGVfQVNOMShTU0wgKnNzbCwgY29uc3QgdW5zaWduZWQgY2hhciAqZCwgaW50IGxlbik7CisraW50CVNTTF91c2VfY2VydGlmaWNhdGVfY2hhaW4oU1NMICpzc2wsIFNUQUNLX09GKFg1MDkpICpjZXJ0X2NoYWluKTsKKytTVEFDS19PRihYNTA5KSAqIFNTTF9nZXRfY2VydGlmaWNhdGVfY2hhaW4oU1NMICpzc2wsIFg1MDkgKngpOworIAorICNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworIGludAlTU0xfdXNlX1JTQVByaXZhdGVLZXlfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworQEAgLTE1NjgsNiArMTU3NCw3IEBAIGludAlTU0xfU0VTU0lPTl9wcmludChCSU8gKmZwLGNvbnN0IFNTTF8KKyB2b2lkCVNTTF9TRVNTSU9OX2ZyZWUoU1NMX1NFU1NJT04gKnNlcyk7CisgaW50CWkyZF9TU0xfU0VTU0lPTihTU0xfU0VTU0lPTiAqaW4sdW5zaWduZWQgY2hhciAqKnBwKTsKKyBpbnQJU1NMX3NldF9zZXNzaW9uKFNTTCAqdG8sIFNTTF9TRVNTSU9OICpzZXNzaW9uKTsKKyt2b2lkCVNTTF9zZXRfc2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkKFNTTCAqLCBpbnQpOworIGludAlTU0xfQ1RYX2FkZF9zZXNzaW9uKFNTTF9DVFggKnMsIFNTTF9TRVNTSU9OICpjKTsKKyBpbnQJU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbihTU0xfQ1RYICosU1NMX1NFU1NJT04gKmMpOworIGludAlTU0xfQ1RYX3NldF9nZW5lcmF0ZV9zZXNzaW9uX2lkKFNTTF9DVFggKiwgR0VOX1NFU1NJT05fQ0IpOworQEAgLTIwMDksNiArMjAxNiw3IEBAIHZvaWQgRVJSX2xvYWRfU1NMX3N0cmluZ3Modm9pZCk7CisgI2RlZmluZSBTU0xfRl9TU0xfVU5ERUZJTkVEX1ZPSURfRlVOQ1RJT04JCSAyNDQKKyAjZGVmaW5lIFNTTF9GX1NTTF9VU0VfQ0VSVElGSUNBVEUJCQkgMTk4CisgI2RlZmluZSBTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFX0FTTjEJCQkgMTk5CisrI2RlZmluZSBTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFX0NIQUlOCQkJIDIwMDAKKyAjZGVmaW5lIFNTTF9GX1NTTF9VU0VfQ0VSVElGSUNBVEVfRklMRQkJCSAyMDAKKyAjZGVmaW5lIFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWQkJCSAyMDEKKyAjZGVmaW5lIFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWV9BU04xCQkJIDIwMgorQEAgLTIyMTMsNiArMjIyMSw3IEBAIHZvaWQgRVJSX2xvYWRfU1NMX3N0cmluZ3Modm9pZCk7CisgI2RlZmluZSBTU0xfUl9TQ1NWX1JFQ0VJVkVEX1dIRU5fUkVORUdPVElBVElORwkJIDM0NQorICNkZWZpbmUgU1NMX1JfU0VSVkVSSEVMTE9fVExTRVhUCQkJIDI3NQorICNkZWZpbmUgU1NMX1JfU0VTU0lPTl9JRF9DT05URVhUX1VOSU5JVElBTElaRUQJCSAyNzcKKysjZGVmaW5lIFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVECQkgMjAwMAorICNkZWZpbmUgU1NMX1JfU0hPUlRfUkVBRAkJCQkgMjE5CisgI2RlZmluZSBTU0xfUl9TSUdOQVRVUkVfRk9SX05PTl9TSUdOSU5HX0NFUlRJRklDQVRFCSAyMjAKKyAjZGVmaW5lIFNTTF9SX1NTTDIzX0RPSU5HX1NFU1NJT05fSURfUkVVU0UJCSAyMjEKKy0tLSBvcGVuc3NsLTEuMC4wLm9yaWcvc3NsL2QxX2NsbnQuYwkyMDEwLTAxLTI2IDE5OjQ2OjI5LjAwMDAwMDAwMCArMDAwMAorKysrIG9wZW5zc2wtMS4wLjAvc3NsL2QxX2NsbnQuYwkyMDEwLTA3LTEzIDIyOjI0OjI3LjAwMDAwMDAwMCArMDAwMAorQEAgLTYxMyw2ICs2MTMsMTIgQEAgaW50IGR0bHMxX2NsaWVudF9oZWxsbyhTU0wgKnMpCisgI2VuZGlmCisgCQkJKHMtPnNlc3Npb24tPm5vdF9yZXN1bWFibGUpKQorIAkJCXsKKysJCSAgICAgICAgaWYgKCFzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQpCisrCQkJCXsKKysJCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfQ0xJRU5UX0hFTExPLFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEKTsKKysJCQkJZ290byBlcnI7CisrCQkJCX0KKyAJCQlpZiAoIXNzbF9nZXRfbmV3X3Nlc3Npb24ocywwKSkKKyAJCQkJZ290byBlcnI7CisgCQkJfQorLS0tIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvczIzX2NsbnQuYwkyMDEwLTAyLTE2IDE0OjIwOjQwLjAwMDAwMDAwMCArMDAwMAorKysrIG9wZW5zc2wtMS4wLjAvc3NsL3MyM19jbG50LmMJMjAxMC0wNy0xMyAyMjoyNDoyNy4wMDAwMDAwMDAgKzAwMDAKK0BAIC02ODcsNiArNjg3LDEzIEBAIHN0YXRpYyBpbnQgc3NsMjNfZ2V0X3NlcnZlcl9oZWxsbyhTU0wgKnMKKyAKKyAJLyogU2luY2UsIGlmIHdlIGFyZSBzZW5kaW5nIGEgc3NsMjMgY2xpZW50IGhlbGxvLCB3ZSBhcmUgbm90CisgCSAqIHJldXNpbmcgYSBzZXNzaW9uLWlkICovCisrICAgICAgICBpZiAoIXMtPnNlc3Npb25fY3JlYXRpb25fZW5hYmxlZCkKKysJCXsKKysJCWlmICghKHMtPmNsaWVudF92ZXJzaW9uID09IFNTTDJfVkVSU0lPTikpCisrCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworKwkJU1NMZXJyKFNTTF9GX1NTTDIzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQpOworKwkJZ290byBlcnI7CisrCQl9CisgCWlmICghc3NsX2dldF9uZXdfc2Vzc2lvbihzLDApKQorIAkJZ290byBlcnI7CisgCistLS0gb3BlbnNzbC0xLjAuMC5vcmlnL3NzbC9zM19ib3RoLmMJMjAxMC0wNy0xMyAyMjoyNDoyNy4wMDAwMDAwMDAgKzAwMDAKKysrKyBvcGVuc3NsLTEuMC4wL3NzbC9zM19ib3RoLmMJMjAxMC0wNy0xMyAyMjoyNDoyNy4wMDAwMDAwMDAgKzAwMDAKK0BAIC0zMjIsOCArMzIyLDExIEBAIHVuc2lnbmVkIGxvbmcgc3NsM19vdXRwdXRfY2VydF9jaGFpbihTU0wKKyAJdW5zaWduZWQgbG9uZyBsPTc7CisgCUJVRl9NRU0gKmJ1ZjsKKyAJaW50IG5vX2NoYWluOworKwlTVEFDS19PRihYNTA5KSAqY2VydF9jaGFpbjsKKyAKKy0JaWYgKChzLT5tb2RlICYgU1NMX01PREVfTk9fQVVUT19DSEFJTikgfHwgcy0+Y3R4LT5leHRyYV9jZXJ0cykKKysJY2VydF9jaGFpbiA9IFNTTF9nZXRfY2VydGlmaWNhdGVfY2hhaW4ocywgeCk7CisrCisrCWlmICgocy0+bW9kZSAmIFNTTF9NT0RFX05PX0FVVE9fQ0hBSU4pIHx8IHMtPmN0eC0+ZXh0cmFfY2VydHMgfHwgY2VydF9jaGFpbikKKyAJCW5vX2NoYWluID0gMTsKKyAJZWxzZQorIAkJbm9fY2hhaW4gPSAwOworQEAgLTM3NSw2ICszNzgsMTAgQEAgdW5zaWduZWQgbG9uZyBzc2wzX291dHB1dF9jZXJ0X2NoYWluKFNTTAorIAkJCXJldHVybigwKTsKKyAJCX0KKyAKKysJZm9yIChpPTA7IGk8c2tfWDUwOV9udW0oY2VydF9jaGFpbik7IGkrKykKKysJCWlmIChzc2wzX2FkZF9jZXJ0X3RvX2J1ZihidWYsICZsLCBza19YNTA5X3ZhbHVlKGNlcnRfY2hhaW4saSkpKQorKwkJCXJldHVybigwKTsKKysKKyAJbC09NzsKKyAJcD0odW5zaWduZWQgY2hhciAqKSYoYnVmLT5kYXRhWzRdKTsKKyAJbDJuMyhsLHApOworLS0tIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvczNfY2xudC5jCTIwMTAtMDctMTMgMjI6MjQ6MjcuMDAwMDAwMDAwICswMDAwCisrKysgb3BlbnNzbC0xLjAuMC9zc2wvczNfY2xudC5jCTIwMTAtMDctMTMgMjI6MjQ6MjcuMDAwMDAwMDAwICswMDAwCitAQCAtNjY4LDYgKzY2OCwxMiBAQCBpbnQgc3NsM19jbGllbnRfaGVsbG8oU1NMICpzKQorICNlbmRpZgorIAkJCShzZXNzLT5ub3RfcmVzdW1hYmxlKSkKKyAJCQl7CisrCQkgICAgICAgIGlmICghcy0+c2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkKQorKwkJCQl7CisrCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKysJCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ0xJRU5UX0hFTExPLFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEKTsKKysJCQkJZ290byBlcnI7CisrCQkJCX0KKyAJCQlpZiAoIXNzbF9nZXRfbmV3X3Nlc3Npb24ocywwKSkKKyAJCQkJZ290byBlcnI7CisgCQkJfQorQEAgLTg3Niw2ICs4ODIsMTIgQEAgaW50IHNzbDNfZ2V0X3NlcnZlcl9oZWxsbyhTU0wgKnMpCisgCQlzLT5oaXQ9MDsKKyAJCWlmIChzLT5zZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aCA+IDApCisgCQkJeworKwkJICAgICAgICBpZiAoIXMtPnNlc3Npb25fY3JlYXRpb25fZW5hYmxlZCkKKysJCQkJeworKwkJCQlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisrCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQpOworKwkJCQlnb3RvIGVycjsKKysJCQkJfQorIAkJCWlmICghc3NsX2dldF9uZXdfc2Vzc2lvbihzLDApKQorIAkJCQl7CisgCQkJCWFsPVNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKy0tLSBvcGVuc3NsLTEuMC4wLm9yaWcvc3NsL3MzX3NydnIuYwkyMDEwLTAyLTI3IDIzOjA0OjEwLjAwMDAwMDAwMCArMDAwMAorKysrIG9wZW5zc2wtMS4wLjAvc3NsL3MzX3NydnIuYwkyMDEwLTA3LTEzIDIyOjI0OjI3LjAwMDAwMDAwMCArMDAwMAorQEAgLTg2OSw2ICs4NjksMTIgQEAgaW50IHNzbDNfZ2V0X2NsaWVudF9oZWxsbyhTU0wgKnMpCisgCSAqLworIAlpZiAoKHMtPm5ld19zZXNzaW9uICYmIChzLT5vcHRpb25zICYgU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OKSkpCisgCQl7CisrCSAgICAgICAgaWYgKCFzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQpCisrCQkJeworKwkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKysJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEKTsKKysJCQlnb3RvIGVycjsKKysJCX0KKyAJCWlmICghc3NsX2dldF9uZXdfc2Vzc2lvbihzLDEpKQorIAkJCWdvdG8gZXJyOworIAkJfQorQEAgLTg4Myw2ICs4ODksMTIgQEAgaW50IHNzbDNfZ2V0X2NsaWVudF9oZWxsbyhTU0wgKnMpCisgCQkJZ290byBlcnI7CisgCQllbHNlIC8qIGkgPT0gMCAqLworIAkJCXsKKysJCSAgICAgICAgaWYgKCFzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQpCisrCQkJCXsKKysJCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEKTsKKysJCQkJZ290byBlcnI7CisrCQkJCX0KKyAJCQlpZiAoIXNzbF9nZXRfbmV3X3Nlc3Npb24ocywxKSkKKyAJCQkJZ290byBlcnI7CisgCQkJfQorLS0tIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvc3NsX2Vyci5jCTIwMTAtMDEtMDYgMTc6Mzc6MzguMDAwMDAwMDAwICswMDAwCisrKysgb3BlbnNzbC0xLjAuMC9zc2wvc3NsX2Vyci5jCTIwMTAtMDctMTMgMjI6MjQ6MjcuMDAwMDAwMDAwICswMDAwCitAQCAtNDYyLDYgKzQ2Miw3IEBAIHN0YXRpYyBFUlJfU1RSSU5HX0RBVEEgU1NMX3N0cl9yZWFzb25zW10KKyB7RVJSX1JFQVNPTihTU0xfUl9TQ1NWX1JFQ0VJVkVEX1dIRU5fUkVORUdPVElBVElORyksInNjc3YgcmVjZWl2ZWQgd2hlbiByZW5lZ290aWF0aW5nIn0sCisge0VSUl9SRUFTT04oU1NMX1JfU0VSVkVSSEVMTE9fVExTRVhUKSAgICAsInNlcnZlcmhlbGxvIHRsc2V4dCJ9LAorIHtFUlJfUkVBU09OKFNTTF9SX1NFU1NJT05fSURfQ09OVEVYVF9VTklOSVRJQUxJWkVEKSwic2Vzc2lvbiBpZCBjb250ZXh0IHVuaW5pdGlhbGl6ZWQifSwKKyt7RVJSX1JFQVNPTihTU0xfUl9TRVNTSU9OX01BWV9OT1RfQkVfQ1JFQVRFRCksInNlc3Npb24gbWF5IG5vdCBiZSBjcmVhdGVkIn0sCisge0VSUl9SRUFTT04oU1NMX1JfU0hPUlRfUkVBRCkgICAgICAgICAgICAsInNob3J0IHJlYWQifSwKKyB7RVJSX1JFQVNPTihTU0xfUl9TSUdOQVRVUkVfRk9SX05PTl9TSUdOSU5HX0NFUlRJRklDQVRFKSwic2lnbmF0dXJlIGZvciBub24gc2lnbmluZyBjZXJ0aWZpY2F0ZSJ9LAorIHtFUlJfUkVBU09OKFNTTF9SX1NTTDIzX0RPSU5HX1NFU1NJT05fSURfUkVVU0UpLCJzc2wyMyBkb2luZyBzZXNzaW9uIGlkIHJldXNlIn0sCistLS0gb3BlbnNzbC0xLjAuMC5vcmlnL3NzbC9zc2xfbGliLmMJMjAxMC0wNy0xMyAyMjoyNDoyNy4wMDAwMDAwMDAgKzAwMDAKKysrKyBvcGVuc3NsLTEuMC4wL3NzbC9zc2xfbGliLmMJMjAxMC0wNy0xMyAyMjoyNDoyNy4wMDAwMDAwMDAgKzAwMDAKK0BAIC0zMjYsNiArMzI2LDcgQEAgU1NMICpTU0xfbmV3KFNTTF9DVFggKmN0eCkKKyAJT1BFTlNTTF9hc3NlcnQocy0+c2lkX2N0eF9sZW5ndGggPD0gc2l6ZW9mIHMtPnNpZF9jdHgpOworIAltZW1jcHkoJnMtPnNpZF9jdHgsJmN0eC0+c2lkX2N0eCxzaXplb2Yocy0+c2lkX2N0eCkpOworIAlzLT52ZXJpZnlfY2FsbGJhY2s9Y3R4LT5kZWZhdWx0X3ZlcmlmeV9jYWxsYmFjazsKKysJcy0+c2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkPTE7CisgCXMtPmdlbmVyYXRlX3Nlc3Npb25faWQ9Y3R4LT5nZW5lcmF0ZV9zZXNzaW9uX2lkOworIAorIAlzLT5wYXJhbSA9IFg1MDlfVkVSSUZZX1BBUkFNX25ldygpOworQEAgLTEzMDMsNiArMTMwNCwzMiBAQCBpbnQgU1NMX3NldF9jaXBoZXJfbGlzdChTU0wgKnMsY29uc3QgY2hhCisgCXJldHVybiAxOworIAl9CisgCisrLyoqIHNwZWNpZnkgdGhlIGNpcGhlcnMgdG8gYmUgdXNlZCBieSB0aGUgU1NMICovCisraW50IFNTTF9zZXRfY2lwaGVyX2xpc3RzKFNTTCAqcyxTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2spCisrCXsKKysJU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnRtcF9jaXBoZXJfbGlzdDsKKysKKysJaWYgKHNrID09IE5VTEwpCisrCQlyZXR1cm4gMDsKKysKKysgICAgICAgIC8qIEJhc2VkIG9uIGVuZCBvZiBzc2xfY3JlYXRlX2NpcGhlcl9saXN0ICovCisrCXRtcF9jaXBoZXJfbGlzdCA9IHNrX1NTTF9DSVBIRVJfZHVwKHNrKTsKKysJaWYgKHRtcF9jaXBoZXJfbGlzdCA9PSBOVUxMKQorKwkJeworKwkJcmV0dXJuIDA7CisrCQl9CisrCWlmIChzLT5jaXBoZXJfbGlzdCAhPSBOVUxMKQorKwkJc2tfU1NMX0NJUEhFUl9mcmVlKHMtPmNpcGhlcl9saXN0KTsKKysJcy0+Y2lwaGVyX2xpc3QgPSBzazsKKysJaWYgKHMtPmNpcGhlcl9saXN0X2J5X2lkICE9IE5VTEwpCisrCQlza19TU0xfQ0lQSEVSX2ZyZWUocy0+Y2lwaGVyX2xpc3RfYnlfaWQpOworKwlzLT5jaXBoZXJfbGlzdF9ieV9pZCA9IHRtcF9jaXBoZXJfbGlzdDsKKysJKHZvaWQpc2tfU1NMX0NJUEhFUl9zZXRfY21wX2Z1bmMocy0+Y2lwaGVyX2xpc3RfYnlfaWQsc3NsX2NpcGhlcl9wdHJfaWRfY21wKTsKKysKKysJc2tfU1NMX0NJUEhFUl9zb3J0KHMtPmNpcGhlcl9saXN0X2J5X2lkKTsKKysJcmV0dXJuIDE7CisrCX0KKysKKyAvKiB3b3JrcyB3ZWxsIGZvciBTU0x2Miwgbm90IHNvIGdvb2QgZm9yIFNTTHYzICovCisgY2hhciAqU1NMX2dldF9zaGFyZWRfY2lwaGVycyhjb25zdCBTU0wgKnMsY2hhciAqYnVmLGludCBsZW4pCisgCXsKKy0tLSBvcGVuc3NsLTEuMC4wLm9yaWcvc3NsL3NzbF9sb2NsLmgJMjAwOS0xMi0wOCAxMTozODoxOC4wMDAwMDAwMDAgKzAwMDAKKysrKyBvcGVuc3NsLTEuMC4wL3NzbC9zc2xfbG9jbC5oCTIwMTAtMDctMTMgMjI6MjQ6MjcuMDAwMDAwMDAwICswMDAwCitAQCAtNDU2LDYgKzQ1Niw3IEBACisgdHlwZWRlZiBzdHJ1Y3QgY2VydF9wa2V5X3N0CisgCXsKKyAJWDUwOSAqeDUwOTsKKysJU1RBQ0tfT0YoWDUwOSkgKmNlcnRfY2hhaW47CisgCUVWUF9QS0VZICpwcml2YXRla2V5OworIAl9IENFUlRfUEtFWTsKKyAKKy0tLSBvcGVuc3NsLTEuMC4wLm9yaWcvc3NsL3NzbF9yc2EuYwkyMDA5LTA5LTEyIDIzOjA5OjI2LjAwMDAwMDAwMCArMDAwMAorKysrIG9wZW5zc2wtMS4wLjAvc3NsL3NzbF9yc2EuYwkyMDEwLTA3LTEzIDIyOjI0OjI3LjAwMDAwMDAwMCArMDAwMAorQEAgLTY5Nyw2ICs2OTcsNDIgQEAgaW50IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfQVNOMShpbnQgdHlwZQorIAl9CisgCisgCisraW50IFNTTF91c2VfY2VydGlmaWNhdGVfY2hhaW4oU1NMICpzc2wsIFNUQUNLX09GKFg1MDkpICpjZXJ0X2NoYWluKQorKwl7CisrCWlmIChzc2wgPT0gTlVMTCkKKysJCXsKKysJCVNTTGVycihTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFX0NIQUlOLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisrCQlyZXR1cm4oMCk7CisrCQl9CisrCWlmIChzc2wtPmNlcnQgPT0gTlVMTCkKKysJCXsKKysJCVNTTGVycihTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFX0NIQUlOLFNTTF9SX05PX0NFUlRJRklDQVRFX0FTU0lHTkVEKTsKKysJCXJldHVybigwKTsKKysJCX0KKysJaWYgKHNzbC0+Y2VydC0+a2V5ID09IE5VTEwpCisrCQl7CisrCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURV9DSEFJTixTU0xfUl9OT19DRVJUSUZJQ0FURV9BU1NJR05FRCk7CisrCQlyZXR1cm4oMCk7CisrCQl9CisrCXNzbC0+Y2VydC0+a2V5LT5jZXJ0X2NoYWluID0gY2VydF9jaGFpbjsKKysJcmV0dXJuKDEpOworKwl9CisrCisrU1RBQ0tfT0YoWDUwOSkgKlNTTF9nZXRfY2VydGlmaWNhdGVfY2hhaW4oU1NMICpzc2wsIFg1MDkgKngpCisrCXsKKysJaW50IGk7CisrCWlmICh4ID09IE5VTEwpCisrCQlyZXR1cm4gTlVMTDsKKysJaWYgKHNzbCA9PSBOVUxMKQorKwkJcmV0dXJuIE5VTEw7CisrCWlmIChzc2wtPmNlcnQgPT0gTlVMTCkKKysJCXJldHVybiBOVUxMOworKwlmb3IgKGkgPSAwOyBpIDwgU1NMX1BLRVlfTlVNOyBpKyspCisrCQlpZiAoc3NsLT5jZXJ0LT5wa2V5c1tpXS54NTA5ID09IHgpCisrCQkJcmV0dXJuIHNzbC0+Y2VydC0+cGtleXNbaV0uY2VydF9jaGFpbjsKKysJcmV0dXJuIE5VTEw7CisrCX0KKysKKyAjaWZuZGVmIE9QRU5TU0xfTk9fU1RESU8KKyAvKiBSZWFkIGEgZmlsZSB0aGF0IGNvbnRhaW5zIG91ciBjZXJ0aWZpY2F0ZSBpbiAiUEVNIiBmb3JtYXQsCisgICogcG9zc2libHkgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiBDQSBjZXJ0aWZpY2F0ZXMgdGhhdCBzaG91bGQgYmUKKy0tLSBvcGVuc3NsLTEuMC4wLm9yaWcvc3NsL3NzbF9zZXNzLmMJMjAxMC0wMi0wMSAxNjo0OTo0Mi4wMDAwMDAwMDAgKzAwMDAKKysrKyBvcGVuc3NsLTEuMC4wL3NzbC9zc2xfc2Vzcy5jCTIwMTAtMDctMTMgMjI6MjQ6MjcuMDAwMDAwMDAwICswMDAwCitAQCAtMjYxLDYgKzI2MSwxMSBAQCBzdGF0aWMgaW50IGRlZl9nZW5lcmF0ZV9zZXNzaW9uX2lkKGNvbnN0CisgCXJldHVybiAwOworIH0KKyAKKyt2b2lkIFNTTF9zZXRfc2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkIChTU0wgKnMsIGludCBjcmVhdGlvbl9lbmFibGVkKQorKwl7CisrCXMtPnNlc3Npb25fY3JlYXRpb25fZW5hYmxlZCA9IGNyZWF0aW9uX2VuYWJsZWQ7CisrCX0KKysKKyBpbnQgc3NsX2dldF9uZXdfc2Vzc2lvbihTU0wgKnMsIGludCBzZXNzaW9uKQorIAl7CisgCS8qIFRoaXMgZ2V0cyB1c2VkIGJ5IGNsaWVudHMgYW5kIHNlcnZlcnMuICovCitAQCAtMjY5LDYgKzI3NCw4IEBAIGludCBzc2xfZ2V0X25ld19zZXNzaW9uKFNTTCAqcywgaW50IHNlc3MKKyAJU1NMX1NFU1NJT04gKnNzPU5VTEw7CisgCUdFTl9TRVNTSU9OX0NCIGNiID0gZGVmX2dlbmVyYXRlX3Nlc3Npb25faWQ7CisgCisrCS8qIGNhbGxlciBzaG91bGQgY2hlY2sgdGhpcyBpZiB0aGV5IGNhbiBkbyBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcgKi8KKysgICAgICAgIGlmICghcy0+c2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkKSByZXR1cm4oMCk7CisgCWlmICgoc3M9U1NMX1NFU1NJT05fbmV3KCkpID09IE5VTEwpIHJldHVybigwKTsKKyAKKyAJLyogSWYgdGhlIGNvbnRleHQgaGFzIGEgZGVmYXVsdCB0aW1lb3V0LCB1c2UgaXQgKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3BhdGNoZXMvcHJvZ3MucGF0Y2ggYi9saWIvb3BlbnNzbC9wYXRjaGVzL3Byb2dzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmQ5YjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9wYXRjaGVzL3Byb2dzLnBhdGNoCkBAIC0wLDAgKzEsNTQgQEAKKy0tLSBvcGVuc3NsLTEuMC4wLm9yaWcvYXBwcy9vcGVuc3NsLmMJMjAwOS0xMC0wNCAwOTo0MzoyMS4wMDAwMDAwMDAgLTA3MDAKKysrKyBvcGVuc3NsLTEuMC4wL2FwcHMvb3BlbnNzbC5jCTIwMTAtMDUtMTggMTQ6MDU6MTQuMDAwMDAwMDAwIC0wNzAwCitAQCAtMjc1LDggKzI3NSwxMCBAQCBpbnQgbWFpbihpbnQgQXJnYywgY2hhciAqQXJndltdKQorIAkJaWYgKEVSUl9HRVRfUkVBU09OKEVSUl9wZWVrX2xhc3RfZXJyb3IoKSkKKyAJCSAgICA9PSBDT05GX1JfTk9fU1VDSF9GSUxFKQorIAkJCXsKKysjaWYgMCAvKiBBTkRST0lEICovCisgCQkJQklPX3ByaW50ZihiaW9fZXJyLAorIAkJCQkgICAiV0FSTklORzogY2FuJ3Qgb3BlbiBjb25maWcgZmlsZTogJXNcbiIscCk7CisrI2VuZGlmCisgCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisgCQkJTkNPTkZfZnJlZShjb25maWcpOworIAkJCWNvbmZpZyA9IE5VTEw7CistLS0gb3BlbnNzbC0xLjAuMC5vcmlnL2FwcHMvcHJvZ3MuaAkyMDA5LTA2LTMwIDA4OjA4OjM4LjAwMDAwMDAwMCAtMDcwMAorKysrIG9wZW5zc2wtMS4wLjAvYXBwcy9wcm9ncy5oCTIwMTAtMDUtMTggMTQ6MDU6MzguMDAwMDAwMDAwIC0wNzAwCitAQCAtMTQ2LDcgKzE1Miw5IEBAIEZVTkNUSU9OIGZ1bmN0aW9uc1tdID0geworIAl7RlVOQ19UWVBFX0dFTkVSQUwsIm9jc3AiLG9jc3BfbWFpbn0sCisgI2VuZGlmCisgCXtGVU5DX1RZUEVfR0VORVJBTCwicHJpbWUiLHByaW1lX21haW59LAorKyNpZiAwIC8qIEFORFJPSUQgKi8KKyAJe0ZVTkNfVFlQRV9HRU5FUkFMLCJ0cyIsdHNfbWFpbn0sCisrI2VuZGlmCisgI2lmbmRlZiBPUEVOU1NMX05PX01EMgorIAl7RlVOQ19UWVBFX01ELCJtZDIiLGRnc3RfbWFpbn0sCisgI2VuZGlmCistLS0gb3BlbnNzbC0xLjAuMC5vcmlnL2FwcHMvc3BlZWQuYwkyMDEwLTAzLTAzIDExOjU2OjE3LjAwMDAwMDAwMCAtMDgwMAorKysrIG9wZW5zc2wtMS4wLjAvYXBwcy9zcGVlZC5jCTIwMTAtMDUtMTggMTQ6MDU6NTcuMDAwMDAwMDAwIC0wNzAwCitAQCAtMTcxOCw2ICsxNzE4LDcgQEAgaW50IE1BSU4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorIAkJCX0KKyAJCX0KKyAKKysjaWYgMCAvKiBBTkRST0lEICovCisgCWlmIChkb2l0W0RfSUdFXzEyOF9BRVNdKQorIAkJeworIAkJZm9yIChqPTA7IGo8U0laRV9OVU07IGorKykKK0BAIC0xNzYzLDYgKzE3NjQsNyBAQCBpbnQgTUFJTihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisgCisgCisgI2VuZGlmCisrI2VuZGlmCisgI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisgCWlmIChkb2l0W0RfQ0JDXzEyOF9DTUxdKQorIAkJeworLS0tIG9wZW5zc2wtMS4wLjAub3JpZy9jcnlwdG8vdWkvdWlfb3BlbnNzbC5jCTIwMDktMTAtMDQgMDk6NDM6MjEuMDAwMDAwMDAwIC0wNzAwCisrKysgb3BlbnNzbC0xLjAuMC9jcnlwdG8vdWkvdWlfb3BlbnNzbC5jCTIwMTAtMDUtMTggMTM6MzY6MjYuMDAwMDAwMDAwIC0wNzAwCitAQCAtMTg0LDcgKzE4NCw3IEBACisgIyB1bmRlZiAgU0dUVFkKKyAjZW5kaWYKKyAKKy0jaWYgZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoVEVSTUlPKQorKyNpZiBkZWZpbmVkKGxpbnV4KSAmJiAhZGVmaW5lZChURVJNSU8pICYmICFkZWZpbmVkKF9fQU5EUk9JRF9fKQorICMgdW5kZWYgIFRFUk1JT1MKKyAjIGRlZmluZSBURVJNSU8KKyAjIHVuZGVmICBTR1RUWQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvcGF0Y2hlcy9zZWNhZHZfMjAxMDExMTYtMi5wYXRjaCBiL2xpYi9vcGVuc3NsL3BhdGNoZXMvc2VjYWR2XzIwMTAxMTE2LTIucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxMzEzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3BhdGNoZXMvc2VjYWR2XzIwMTAxMTE2LTIucGF0Y2gKQEAgLTAsMCArMSw5OSBAQAorLS0tIG9wZW5zc2wtMS4wLjAub3JpZy9zc2wvdDFfbGliLmMJMTUgSnVuIDIwMTAgMTc6MjU6MTUgLTAwMDAJMS42NC4yLjE0CisrKysgb3BlbnNzbC0xLjAuMC9zc2wvdDFfbGliLmMJMTUgTm92IDIwMTAgMTU6MjY6MTkgLTAwMDAKK0BAIC03MTQsMTQgKzcxNCwyMyBAQAorIAkJCQlzd2l0Y2ggKHNlcnZuYW1lX3R5cGUpCisgCQkJCQl7CisgCQkJCWNhc2UgVExTRVhUX05BTUVUWVBFX2hvc3RfbmFtZToKKy0JCQkJCWlmIChzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCkKKysJCQkJCWlmICghcy0+aGl0KQorIAkJCQkJCXsKKy0JCQkJCQlpZiAobGVuID4gVExTRVhUX01BWExFTl9ob3N0X25hbWUgfHwgCistCQkJCQkJCSgocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lID0gT1BFTlNTTF9tYWxsb2MobGVuKzEpKSA9PSBOVUxMKSkKKysJCQkJCQlpZihzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUpCisrCQkJCQkJCXsKKysJCQkJCQkJKmFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKysJCQkJCQkJcmV0dXJuIDA7CisrCQkJCQkJCX0KKysJCQkJCQlpZiAobGVuID4gVExTRVhUX01BWExFTl9ob3N0X25hbWUpCisgCQkJCQkJCXsKKyAJCQkJCQkJKmFsID0gVExTMV9BRF9VTlJFQ09HTklaRURfTkFNRTsKKyAJCQkJCQkJcmV0dXJuIDA7CisgCQkJCQkJCX0KKysJCQkJCQlpZiAoKHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSA9IE9QRU5TU0xfbWFsbG9jKGxlbisxKSkgPT0gTlVMTCkKKysJCQkJCQkJeworKwkJCQkJCQkqYWwgPSBUTFMxX0FEX0lOVEVSTkFMX0VSUk9SOworKwkJCQkJCQlyZXR1cm4gMDsKKysJCQkJCQkJfQorIAkJCQkJCW1lbWNweShzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUsIHNkYXRhLCBsZW4pOworIAkJCQkJCXMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZVtsZW5dPSdcMCc7CisgCQkJCQkJaWYgKHN0cmxlbihzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUpICE9IGxlbikgeworQEAgLTczNCw3ICs3NDMsOCBAQAorIAorIAkJCQkJCX0KKyAJCQkJCWVsc2UgCistCQkJCQkJcy0+c2VydmVybmFtZV9kb25lID0gc3RybGVuKHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSkgPT0gbGVuIAorKwkJCQkJCXMtPnNlcnZlcm5hbWVfZG9uZSA9IHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZQorKwkJCQkJCQkmJiBzdHJsZW4ocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKSA9PSBsZW4gCisgCQkJCQkJCSYmIHN0cm5jbXAocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lLCAoY2hhciAqKXNkYXRhLCBsZW4pID09IDA7CisgCQkJCQkKKyAJCQkJCWJyZWFrOworQEAgLTc2NSwxNSArNzc1LDIyIEBACisgCQkJCSphbCA9IFRMUzFfQURfREVDT0RFX0VSUk9SOworIAkJCQlyZXR1cm4gMDsKKyAJCQkJfQorLQkJCXMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPSAwOworLQkJCWlmIChzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CistCQkJaWYgKChzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgPSBPUEVOU1NMX21hbGxvYyhlY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGgpKSA9PSBOVUxMKQorKwkJCWlmICghcy0+aGl0KQorIAkJCQl7CistCQkJCSphbCA9IFRMUzFfQURfSU5URVJOQUxfRVJST1I7CistCQkJCXJldHVybiAwOworKwkJCQlpZihzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QpCisrCQkJCQl7CisrCQkJCQkqYWwgPSBUTFMxX0FEX0RFQ09ERV9FUlJPUjsKKysJCQkJCXJldHVybiAwOworKwkJCQkJfQorKwkJCQlzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoID0gMDsKKysJCQkJaWYgKChzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgPSBPUEVOU1NMX21hbGxvYyhlY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGgpKSA9PSBOVUxMKQorKwkJCQkJeworKwkJCQkJKmFsID0gVExTMV9BRF9JTlRFUk5BTF9FUlJPUjsKKysJCQkJCXJldHVybiAwOworKwkJCQkJfQorKwkJCQlzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoID0gZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworKwkJCQltZW1jcHkocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0LCBzZGF0YSwgZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKTsKKyAJCQkJfQorLQkJCXMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPSBlY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGg7CistCQkJbWVtY3B5KHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCwgc2RhdGEsIGVjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCk7CisgI2lmIDAKKyAJCQlmcHJpbnRmKHN0ZGVyciwic3NsX3BhcnNlX2NsaWVudGhlbGxvX3Rsc2V4dCBzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgKGxlbmd0aD0laSkgIiwgcy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCk7CisgCQkJc2RhdGEgPSBzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3Q7CitAQCAtNzk0LDE1ICs4MTEsMjIgQEAKKyAJCQkJKmFsID0gVExTMV9BRF9ERUNPREVfRVJST1I7CisgCQkJCXJldHVybiAwOworIAkJCQl9CistCQkJcy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA9IDA7CistCQkJaWYgKHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0KTsKKy0JCQlpZiAoKHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCA9IE9QRU5TU0xfbWFsbG9jKGVsbGlwdGljY3VydmVsaXN0X2xlbmd0aCkpID09IE5VTEwpCisrCQkJaWYgKCFzLT5oaXQpCisgCQkJCXsKKy0JCQkJKmFsID0gVExTMV9BRF9JTlRFUk5BTF9FUlJPUjsKKy0JCQkJcmV0dXJuIDA7CisrCQkJCWlmKHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCkKKysJCQkJCXsKKysJCQkJCSphbCA9IFRMUzFfQURfREVDT0RFX0VSUk9SOworKwkJCQkJcmV0dXJuIDA7CisrCQkJCQl9CisrCQkJCXMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGggPSAwOworKwkJCQlpZiAoKHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCA9IE9QRU5TU0xfbWFsbG9jKGVsbGlwdGljY3VydmVsaXN0X2xlbmd0aCkpID09IE5VTEwpCisrCQkJCQl7CisrCQkJCQkqYWwgPSBUTFMxX0FEX0lOVEVSTkFMX0VSUk9SOworKwkJCQkJcmV0dXJuIDA7CisrCQkJCQl9CisrCQkJCXMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGggPSBlbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGg7CisrCQkJCW1lbWNweShzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QsIHNkYXRhLCBlbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGgpOworIAkJCQl9CistCQkJcy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA9IGVsbGlwdGljY3VydmVsaXN0X2xlbmd0aDsKKy0JCQltZW1jcHkocy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0LCBzZGF0YSwgZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoKTsKKyAjaWYgMAorIAkJCWZwcmludGYoc3RkZXJyLCJzc2xfcGFyc2VfY2xpZW50aGVsbG9fdGxzZXh0IHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCAobGVuZ3RoPSVpKSAiLCBzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoKTsKKyAJCQlzZGF0YSA9IHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdDsKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3BhdGNoZXMvc21hbGxfcmVjb3Jkcy5wYXRjaCBiL2xpYi9vcGVuc3NsL3BhdGNoZXMvc21hbGxfcmVjb3Jkcy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmVhNTFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvcGF0Y2hlcy9zbWFsbF9yZWNvcmRzLnBhdGNoCkBAIC0wLDAgKzEsMzM3IEBACistLS0gb3BlbnNzbC0xLjAuMGEub3JpZy9zc2wvZDFfcGt0LmMJMjAxMC0wNC0xNCAwMDowOTo1NS4wMDAwMDAwMDAgKzAwMDAKKysrKyBvcGVuc3NsLTEuMC4wYS9zc2wvZDFfcGt0LmMJMjAxMC0wOC0yNSAyMToxMjozOS4wMDAwMDAwMDAgKzAwMDAKK0BAIC02MDgsNiArNjA4LDI0IEBAIGFnYWluOgorIAkJCWdvdG8gYWdhaW47CisgCQkJfQorIAorKwkJLyogSWYgd2UgcmVjZWl2ZSBhIHZhbGlkIHJlY29yZCBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBidWZmZXIgc2l6ZSwKKysJCSAqIGFsbG9jYXRlIHNvbWUgbWVtb3J5IGZvciBpdC4KKysJCSAqLworKwkJaWYgKHJyLT5sZW5ndGggPiBzLT5zMy0+cmJ1Zi5sZW4gLSBEVExTMV9SVF9IRUFERVJfTEVOR1RIKQorKwkJCXsKKysJCQl1bnNpZ25lZCBjaGFyICpwcDsKKysJCQl1bnNpZ25lZCBpbnQgbmV3bGVuID0gcnItPmxlbmd0aCArIERUTFMxX1JUX0hFQURFUl9MRU5HVEg7CisrCQkJaWYgKChwcD1PUEVOU1NMX3JlYWxsb2Mocy0+czMtPnJidWYuYnVmLCBuZXdsZW4pKT09TlVMTCkKKysJCQkJeworKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfR0VUX1JFQ09SRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisrCQkJCXJldHVybigtMSk7CisrCQkJCX0KKysJCQlwID0gcHAgKyAocCAtIHMtPnMzLT5yYnVmLmJ1Zik7CisrCQkJcy0+czMtPnJidWYuYnVmPXBwOworKwkJCXMtPnMzLT5yYnVmLmxlbj1uZXdsZW47CisrCQkJcy0+cGFja2V0PSAmKHMtPnMzLT5yYnVmLmJ1ZlswXSk7CisrCQkJfQorKworIAkJLyogbm93IHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9CT0RZICovCisgCQl9CisgCitAQCAtMTM0Miw2ICsxMzYwLDcgQEAgaW50IGRvX2R0bHMxX3dyaXRlKFNTTCAqcywgaW50IHR5cGUsIGNvbgorIAlTU0wzX0JVRkZFUiAqd2I7CisgCVNTTF9TRVNTSU9OICpzZXNzOworIAlpbnQgYnM7CisrCXVuc2lnbmVkIGludCBsZW5fd2l0aF9vdmVyaGVhZCA9IGxlbiArIFNTTDNfUlRfREVGQVVMVF9XUklURV9PVkVSSEVBRDsKKyAKKyAJLyogZmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSBTU0wzX0JVRkZFUiBzdGlsbCBiZWluZyB3cml0dGVuCisgCSAqIG91dC4gIFRoaXMgd2lsbCBoYXBwZW4gd2l0aCBub24gYmxvY2tpbmcgSU8gKi8KK0BAIC0xMzUxLDYgKzEzNzAsMTYgQEAgaW50IGRvX2R0bHMxX3dyaXRlKFNTTCAqcywgaW50IHR5cGUsIGNvbgorIAkJcmV0dXJuKHNzbDNfd3JpdGVfcGVuZGluZyhzLHR5cGUsYnVmLGxlbikpOworIAkJfQorIAorKwlpZiAocy0+czMtPndidWYubGVuIDwgbGVuX3dpdGhfb3ZlcmhlYWQpCisrCQl7CisrCQlpZiAoKHA9T1BFTlNTTF9yZWFsbG9jKHMtPnMzLT53YnVmLmJ1ZiwgbGVuX3dpdGhfb3ZlcmhlYWQpKSA9PSBOVUxMKSB7CisrCQkJU1NMZXJyKFNTTF9GX0RPX0RUTFMxX1dSSVRFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKysJCQlnb3RvIGVycjsKKysJCX0KKysJCXMtPnMzLT53YnVmLmJ1ZiA9IHA7CisrCQlzLT5zMy0+d2J1Zi5sZW4gPSBsZW5fd2l0aF9vdmVyaGVhZDsKKysJCX0KKysKKyAJLyogSWYgd2UgaGF2ZSBhbiBhbGVydCB0byBzZW5kLCBsZXRzIHNlbmQgaXQgKi8KKyAJaWYgKHMtPnMzLT5hbGVydF9kaXNwYXRjaCkKKyAJCXsKKy0tLSBvcGVuc3NsLTEuMC4wYS5vcmlnL3NzbC9zMjNfc3J2ci5jCTIwMTAtMDItMTYgMTQ6MjA6NDAuMDAwMDAwMDAwICswMDAwCisrKysgb3BlbnNzbC0xLjAuMGEvc3NsL3MyM19zcnZyLmMJMjAxMC0wOC0yNSAyMToxMjozOS4wMDAwMDAwMDAgKzAwMDAKK0BAIC00MDMsOCArNDAzLDEzIEBAIGludCBzc2wyM19nZXRfY2xpZW50X2hlbGxvKFNTTCAqcykKKyAJCXZbMF0gPSBwWzNdOyAvKiA9PSBTU0wzX1ZFUlNJT05fTUFKT1IgKi8KKyAJCXZbMV0gPSBwWzRdOworIAorKy8qIFRoZSBTU0wyIHByb3RvY29sIGFsbG93cyBuIHRvIGJlIGxhcmdlciwganVzdCBwaWNrCisrICogYSByZWFzb25hYmxlIGJ1ZmZlciBzaXplLiAqLworKyNpZiBTU0wzX1JUX0RFRkFVTFRfUEFDS0VUX1NJWkUgPCAxMDI0KjQgLSBTU0wzX1JUX0RFRkFVTFRfV1JJVEVfT1ZFUkhFQUQKKysjZXJyb3IgIlNTTDNfUlRfREVGQVVMVF9QQUNLRVRfU0laRSBpcyB0b28gc21hbGwuIgorKyNlbmRpZgorIAkJbj0oKHBbMF0mMHg3Zik8PDgpfHBbMV07CistCQlpZiAobiA+ICgxMDI0KjQpKQorKwkJaWYgKG4gPiBTU0wzX1JUX0RFRkFVTFRfUEFDS0VUX1NJWkUgLSAyKQorIAkJCXsKKyAJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9SRUNPUkRfVE9PX0xBUkdFKTsKKyAJCQlnb3RvIGVycjsKKy0tLSBvcGVuc3NsLTEuMC4wYS5vcmlnL3NzbC9zM19ib3RoLmMJMjAxMC0wMy0yNCAyMzoxNjo0OS4wMDAwMDAwMDAgKzAwMDAKKysrKyBvcGVuc3NsLTEuMC4wYS9zc2wvczNfYm90aC5jCTIwMTAtMDgtMjUgMjE6MTI6MzkuMDAwMDAwMDAwICswMDAwCitAQCAtNzE1LDEzICs3MjIsMjAgQEAgaW50IHNzbDNfc2V0dXBfcmVhZF9idWZmZXIoU1NMICpzKQorIAorIAlpZiAocy0+czMtPnJidWYuYnVmID09IE5VTEwpCisgCQl7CistCQlsZW4gPSBTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgKKy0JCQkrIFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRAorLQkJCSsgaGVhZGVybGVuICsgYWxpZ247CistCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9NSUNST1NPRlRfQklHX1NTTFYzX0JVRkZFUikKKysJCWlmIChTU0xfZ2V0X21vZGUocykgJiBTU0xfTU9ERV9TTUFMTF9CVUZGRVJTKQorIAkJCXsKKy0JCQlzLT5zMy0+aW5pdF9leHRyYSA9IDE7CistCQkJbGVuICs9IFNTTDNfUlRfTUFYX0VYVFJBOworKwkJCWxlbiA9IFNTTDNfUlRfREVGQVVMVF9QQUNLRVRfU0laRTsKKysJCQl9CisrICAJCWVsc2UKKysJCQl7CisrCQkJbGVuID0gU1NMM19SVF9NQVhfUExBSU5fTEVOR1RICisrCQkJCSsgU1NMM19SVF9NQVhfRU5DUllQVEVEX09WRVJIRUFECisrCQkJCSsgaGVhZGVybGVuICsgYWxpZ247CisrCQkJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfTUlDUk9TT0ZUX0JJR19TU0xWM19CVUZGRVIpCisrCQkJCXsKKysJCQkJcy0+czMtPmluaXRfZXh0cmEgPSAxOworKwkJCQlsZW4gKz0gU1NMM19SVF9NQVhfRVhUUkE7CisrCQkJCX0KKyAJCQl9CisgI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKyAJCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fQ09NUFJFU1NJT04pKQorQEAgLTc1Nyw3ICs3NzEsMTUgQEAgaW50IHNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyKFNTTCAqcykKKyAKKyAJaWYgKHMtPnMzLT53YnVmLmJ1ZiA9PSBOVUxMKQorIAkJeworLQkJbGVuID0gcy0+bWF4X3NlbmRfZnJhZ21lbnQKKysJCWlmIChTU0xfZ2V0X21vZGUocykgJiBTU0xfTU9ERV9TTUFMTF9CVUZGRVJTKQorKwkJCXsKKysJCQlsZW4gPSBTU0wzX1JUX0RFRkFVTFRfUEFDS0VUX1NJWkU7CisrCQkJfQorKyAgCQllbHNlCisrCQkJeworKwkJCWxlbiA9IHMtPm1heF9zZW5kX2ZyYWdtZW50OworKwkJCX0KKysJCWxlbiArPSAwCisgCQkJKyBTU0wzX1JUX1NFTkRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRAorIAkJCSsgaGVhZGVybGVuICsgYWxpZ247CisgI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKK0BAIC03NjcsNyArNzg5LDYgQEAgaW50IHNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyKFNTTCAqcykKKyAJCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTKSkKKyAJCQlsZW4gKz0gaGVhZGVybGVuICsgYWxpZ24KKyAJCQkJKyBTU0wzX1JUX1NFTkRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRDsKKy0KKyAJCWlmICgocD1mcmVlbGlzdF9leHRyYWN0KHMtPmN0eCwgMCwgbGVuKSkgPT0gTlVMTCkKKyAJCQlnb3RvIGVycjsKKyAJCXMtPnMzLT53YnVmLmJ1ZiA9IHA7CitAQCAtODEwLDQgKzgzMSwzIEBAIGludCBzc2wzX3JlbGVhc2VfcmVhZF9idWZmZXIoU1NMICpzKQorIAkJfQorIAlyZXR1cm4gMTsKKyAJfQorLQorLS0tIG9wZW5zc2wtMS4wLjBhLm9yaWcvc3NsL3MzX3BrdC5jCTIwMTAtMDMtMjUgMTE6MjI6NDIuMDAwMDAwMDAwICswMDAwCisrKysgb3BlbnNzbC0xLjAuMGEvc3NsL3MzX3BrdC5jCTIwMTAtMDgtMjUgMjE6MTI6MzkuMDAwMDAwMDAwICswMDAwCitAQCAtMjkzLDYgKzI5MywxMSBAQCBzdGF0aWMgaW50IHNzbDNfZ2V0X3JlY29yZChTU0wgKnMpCisgCXNpemVfdCBleHRyYTsKKyAJaW50IGRlY3J5cHRpb25fZmFpbGVkX29yX2JhZF9yZWNvcmRfbWFjID0gMDsKKyAJdW5zaWduZWQgY2hhciAqbWFjID0gTlVMTDsKKysjaWYgZGVmaW5lZChTU0wzX0FMSUdOX1BBWUxPQUQpICYmIFNTTDNfQUxJR05fUEFZTE9BRCE9MAorKwlsb25nIGFsaWduPVNTTDNfQUxJR05fUEFZTE9BRDsKKysjZWxzZQorKwlsb25nIGFsaWduPTA7CisrI2VuZGlmCisgCisgCXJyPSAmKHMtPnMzLT5ycmVjKTsKKyAJc2Vzcz1zLT5zZXNzaW9uOworQEAgLTMwMSw3ICszMDYsOCBAQCBzdGF0aWMgaW50IHNzbDNfZ2V0X3JlY29yZChTU0wgKnMpCisgCQlleHRyYT1TU0wzX1JUX01BWF9FWFRSQTsKKyAJZWxzZQorIAkJZXh0cmE9MDsKKy0JaWYgKGV4dHJhICYmICFzLT5zMy0+aW5pdF9leHRyYSkKKysJaWYgKCEoU1NMX2dldF9tb2RlKHMpICYgU1NMX01PREVfU01BTExfQlVGRkVSUykgJiYKKysJCWV4dHJhICYmICFzLT5zMy0+aW5pdF9leHRyYSkKKyAJCXsKKyAJCS8qIEFuIGFwcGxpY2F0aW9uIGVycm9yOiBTTFNfT1BfTUlDUk9TT0ZUX0JJR19TU0xWM19CVUZGRVIKKyAJCSAqIHNldCBhZnRlciBzc2wzX3NldHVwX2J1ZmZlcnMoKSB3YXMgZG9uZSAqLworQEAgLTM1MCw2ICszNTYsMjEgQEAgZnByaW50ZihzdGRlcnIsICJSZWNvcmQgdHlwZT0lZCwgTGVuZ3RoPQorIAkJCWdvdG8gZXJyOworIAkJCX0KKyAKKysJCS8qIElmIHdlIHJlY2VpdmUgYSB2YWxpZCByZWNvcmQgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgYnVmZmVyIHNpemUsCisrCQkgKiBhbGxvY2F0ZSBzb21lIG1lbW9yeSBmb3IgaXQuCisrCQkgKi8KKysJCWlmIChyci0+bGVuZ3RoID4gcy0+czMtPnJidWYubGVuIC0gU1NMM19SVF9IRUFERVJfTEVOR1RIIC0gYWxpZ24pCisrCQkJeworKwkJCWlmICgocD1PUEVOU1NMX3JlYWxsb2Mocy0+czMtPnJidWYuYnVmLCByci0+bGVuZ3RoICsgU1NMM19SVF9IRUFERVJfTEVOR1RIICsgYWxpZ24pKT09TlVMTCkKKysJCQkJeworKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfUkVDT1JELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKysJCQkJZ290byBlcnI7CisrCQkJCX0KKysJCQlzLT5zMy0+cmJ1Zi5idWY9cDsKKysJCQlzLT5zMy0+cmJ1Zi5sZW49cnItPmxlbmd0aCArIFNTTDNfUlRfSEVBREVSX0xFTkdUSCArIGFsaWduOworKwkJCXMtPnBhY2tldD0gJihzLT5zMy0+cmJ1Zi5idWZbMF0pOworKwkJCX0KKysKKyAJCWlmIChyci0+bGVuZ3RoID4gcy0+czMtPnJidWYubGVuIC0gU1NMM19SVF9IRUFERVJfTEVOR1RIKQorIAkJCXsKKyAJCQlhbD1TU0xfQURfUkVDT1JEX09WRVJGTE9XOworQEAgLTU3Niw2ICs1OTcsNyBAQCBpbnQgc3NsM193cml0ZV9ieXRlcyhTU0wgKnMsIGludCB0eXBlLCBjCisgCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zj1idWZfOworIAl1bnNpZ25lZCBpbnQgdG90LG4sbnc7CisgCWludCBpOworKwl1bnNpZ25lZCBpbnQgbWF4X3BsYWluX2xlbmd0aDsKKyAKKyAJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKyAJdG90PXMtPnMzLT53bnVtOworQEAgLTU5NSw4ICs2MTcsMTMgQEAgaW50IHNzbDNfd3JpdGVfYnl0ZXMoU1NMICpzLCBpbnQgdHlwZSwgYworIAluPShsZW4tdG90KTsKKyAJZm9yICg7OykKKyAJCXsKKy0JCWlmIChuID4gcy0+bWF4X3NlbmRfZnJhZ21lbnQpCistCQkJbnc9cy0+bWF4X3NlbmRfZnJhZ21lbnQ7CisrCQlpZiAodHlwZSA9PSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgJiYgKFNTTF9nZXRfbW9kZShzKSAmIFNTTF9NT0RFX1NNQUxMX0JVRkZFUlMpKQorKwkJCW1heF9wbGFpbl9sZW5ndGggPSBTU0wzX1JUX0RFRkFVTFRfUExBSU5fTEVOR1RIOworKwkJZWxzZQorKwkJCW1heF9wbGFpbl9sZW5ndGggPSBzLT5tYXhfc2VuZF9mcmFnbWVudDsKKysKKysJCWlmIChuID4gbWF4X3BsYWluX2xlbmd0aCkKKysJCQludyA9IG1heF9wbGFpbl9sZW5ndGg7CisgCQllbHNlCisgCQkJbnc9bjsKKyAKK0BAIC03MjcsNiArNzI3LDE4IEBAIHN0YXRpYyBpbnQgZG9fc3NsM193cml0ZShTU0wgKnMsIGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisgCQlzLT5zMy0+ZW1wdHlfZnJhZ21lbnRfZG9uZSA9IDE7CisgCQl9CisgCisrCS8qIHJlc2l6ZSBpZiBuZWNlc3NhcnkgdG8gaG9sZCB0aGUgZGF0YS4gKi8KKysJaWYgKGxlbiArIFNTTDNfUlRfREVGQVVMVF9XUklURV9PVkVSSEVBRCA+IHdiLT5sZW4pCisrCQl7CisrCQlpZiAoKHA9T1BFTlNTTF9yZWFsbG9jKHdiLT5idWYsIGxlbiArIFNTTDNfUlRfREVGQVVMVF9XUklURV9PVkVSSEVBRCkpPT1OVUxMKQorKwkJCXsKKysJCQlTU0xlcnIoU1NMX0ZfRE9fU1NMM19XUklURSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisrCQkJZ290byBlcnI7CisrCQkJfQorKwkJd2ItPmJ1ZiA9IHA7CisrCQl3Yi0+bGVuID0gbGVuICsgU1NMM19SVF9ERUZBVUxUX1dSSVRFX09WRVJIRUFEOworKwkJfQorKworIAlpZiAoY3JlYXRlX2VtcHR5X2ZyYWdtZW50KQorIAkJeworICNpZiBkZWZpbmVkKFNTTDNfQUxJR05fUEFZTE9BRCkgJiYgU1NMM19BTElHTl9QQVlMT0FEIT0wCistLS0gb3BlbnNzbC0xLjAuMGEub3JpZy9zc2wvc3NsLmgJMjAxMC0wMS0wNiAxNzozNzozOC4wMDAwMDAwMDAgKzAwMDAKKysrKyBvcGVuc3NsLTEuMC4wYS9zc2wvc3NsLmgJMjAxMC0wOC0yNSAyMToxMjozOS4wMDAwMDAwMDAgKzAwMDAKK0BAIC02MDIsNiArNjAyLDkgQEAgdHlwZWRlZiBzdHJ1Y3Qgc3NsX3Nlc3Npb25fc3QKKyAgKiBUTFMgb25seS4pICAiUmVsZWFzZWQiIGJ1ZmZlcnMgYXJlIHB1dCBvbnRvIGEgZnJlZS1saXN0IGluIHRoZSBjb250ZXh0CisgICogb3IganVzdCBmcmVlZCAoZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0J3Mgc2V0dGluZyBmb3IgZnJlZWxpc3RfbWF4X2xlbikuICovCisgI2RlZmluZSBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMgMHgwMDAwMDAxMEwKKysvKiBVc2Ugc21hbGwgcmVhZCBhbmQgd3JpdGUgYnVmZmVyczogKGEpIGxhenkgYWxsb2NhdGUgcmVhZCBidWZmZXJzIGZvcgorKyAqIGxhcmdlIGluY29taW5nIHJlY29yZHMsIGFuZCAoYikgbGltaXQgdGhlIHNpemUgb2Ygb3V0Z29pbmcgcmVjb3Jkcy4gKi8KKysjZGVmaW5lIFNTTF9NT0RFX1NNQUxMX0JVRkZFUlMgMHgwMDAwMDAyMEwKKyAKKyAvKiBOb3RlOiBTU0xbX0NUWF1fc2V0X3tvcHRpb25zLG1vZGV9IHVzZSB8PSBvcCBvbiB0aGUgcHJldmlvdXMgdmFsdWUsCisgICogdGhleSBjYW5ub3QgYmUgdXNlZCB0byBjbGVhciBiaXRzLiAqLworLS0tIG9wZW5zc2wtMS4wLjBhLm9yaWcvc3NsL3NzbDMuaAkyMDEwLTAxLTA2IDE3OjM3OjM4LjAwMDAwMDAwMCArMDAwMAorKysrIG9wZW5zc2wtMS4wLjBhL3NzbC9zc2wzLmgJMjAxMC0wOC0yNSAyMToxMjozOS4wMDAwMDAwMDAgKzAwMDAKK0BAIC0yODAsNiArMjgwLDkgQEAgZXh0ZXJuICJDIiB7CisgCisgI2RlZmluZSBTU0wzX1JUX01BWF9FWFRSQQkJCSgxNjM4NCkKKyAKKysvKiBEZWZhdWx0IGJ1ZmZlciBsZW5ndGggdXNlZCBmb3Igd3JpdGVuIHJlY29yZHMuICBUaHVzIGEgZ2VuZXJhdGVkIHJlY29yZAorKyAqIHdpbGwgY29udGFpbiBwbGFpbnRleHQgbm8gbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZS4gKi8KKysjZGVmaW5lIFNTTDNfUlRfREVGQVVMVF9QTEFJTl9MRU5HVEgJMjA0OAorIC8qIE1heGltdW0gcGxhaW50ZXh0IGxlbmd0aDogZGVmaW5lZCBieSBTU0wvVExTIHN0YW5kYXJkcyAqLworICNkZWZpbmUgU1NMM19SVF9NQVhfUExBSU5fTEVOR1RICQkxNjM4NAorIC8qIE1heGltdW0gY29tcHJlc3Npb24gb3ZlcmhlYWQ6IGRlZmluZWQgYnkgU1NML1RMUyBzdGFuZGFyZHMgKi8KK0BAIC0zMTEsNiArMzE0LDEzIEBAIGV4dGVybiAiQyIgeworICNkZWZpbmUgU1NMM19SVF9NQVhfUEFDS0VUX1NJWkUJCVwKKyAJCShTU0wzX1JUX01BWF9FTkNSWVBURURfTEVOR1RIK1NTTDNfUlRfSEVBREVSX0xFTkdUSCkKKyAKKysvKiBFeHRyYSBzcGFjZSBmb3IgZW1wdHkgZnJhZ21lbnQsIGhlYWRlcnMsIE1BQywgYW5kIHBhZGRpbmcuICovCisrI2RlZmluZSBTU0wzX1JUX0RFRkFVTFRfV1JJVEVfT1ZFUkhFQUQgIDI1NgorKyNkZWZpbmUgU1NMM19SVF9ERUZBVUxUX1BBQ0tFVF9TSVpFICAgICA0MDk2IC0gU1NMM19SVF9ERUZBVUxUX1dSSVRFX09WRVJIRUFECisrI2lmIFNTTDNfUlRfREVGQVVMVF9QTEFJTl9MRU5HVEggKyBTU0wzX1JUX0RFRkFVTFRfV1JJVEVfT1ZFUkhFQUQgPiBTU0wzX1JUX0RFRkFVTFRfUEFDS0VUX1NJWkUKKysjZXJyb3IgIkluc3VmZmljaWVudCBzcGFjZSBhbGxvY2F0ZWQgZm9yIHdyaXRlIGJ1ZmZlcnMuIgorKyNlbmRpZgorKworICNkZWZpbmUgU1NMM19NRF9DTElFTlRfRklOSVNIRURfQ09OU1QJIlx4NDNceDRDXHg0RVx4NTQiCisgI2RlZmluZSBTU0wzX01EX1NFUlZFUl9GSU5JU0hFRF9DT05TVAkiXHg1M1x4NTJceDU2XHg1MiIKKyAKK0BAIC02MzQsNCArNjQ1LDMgQEAgdHlwZWRlZiBzdHJ1Y3Qgc3NsM19zdGF0ZV9zdAorIH0KKyAjZW5kaWYKKyAjZW5kaWYKKy0KKy0tLSBvcGVuc3NsLTEuMC4wYS5vcmlnL3NzbC9zc2x0ZXN0LmMJMjAxMC0wMS0yNCAxNjo1NzozOC4wMDAwMDAwMDAgKzAwMDAKKysrKyBvcGVuc3NsLTEuMC4wYS9zc2wvc3NsdGVzdC5jCTIwMTAtMDgtMjUgMjE6MTI6MzkuMDAwMDAwMDAwICswMDAwCitAQCAtMzE2LDYgKzMxNiw4IEBAIHN0YXRpYyB2b2lkIHN2X3VzYWdlKHZvaWQpCisgCSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIChkZWZhdWx0IGlzIHNlY3QxNjNyMikuXG4iKTsKKyAjZW5kaWYKKyAJZnByaW50ZihzdGRlcnIsIiAtdGVzdF9jaXBoZXJsaXN0IC0gdmVyaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBzc2wgY2lwaGVyIGxpc3RzXG4iKTsKKysJZnByaW50ZihzdGRlcnIsIiAtY19zbWFsbF9yZWNvcmRzIC0gZW5hYmxlIGNsaWVudCBzaWRlIHVzZSBvZiBzbWFsbCBTU0wgcmVjb3JkIGJ1ZmZlcnNcbiIpOworKwlmcHJpbnRmKHN0ZGVyciwiIC1zX3NtYWxsX3JlY29yZHMgLSBlbmFibGUgc2VydmVyIHNpZGUgdXNlIG9mIHNtYWxsIFNTTCByZWNvcmQgYnVmZmVyc1xuIik7CisgCX0KKyAKKyBzdGF0aWMgdm9pZCBwcmludF9kZXRhaWxzKFNTTCAqY19zc2wsIGNvbnN0IGNoYXIgKnByZWZpeCkKK0BAIC00NDQsNiArNDQ3LDkgQEAgaW50IG9wYXF1ZV9wcmZfaW5wdXRfY2IoU1NMICpzc2wsIHZvaWQgKgorIAlyZXR1cm4gYXJnLT5yZXQ7CisgCX0KKyAjZW5kaWYKKysJaW50IHNzbF9tb2RlID0gMDsKKysJaW50IGNfc21hbGxfcmVjb3Jkcz0wOworKwlpbnQgc19zbWFsbF9yZWNvcmRzPTA7CisgCisgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyAJeworQEAgLTY4MCw2ICs2ODcsMTQgQEAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyAJCQl7CisgCQkJdGVzdF9jaXBoZXJsaXN0ID0gMTsKKyAJCQl9CisrCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItY19zbWFsbF9yZWNvcmRzIikgPT0gMCkKKysJCQl7CisrCQkJY19zbWFsbF9yZWNvcmRzID0gMTsKKysJCQl9CisrCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItc19zbWFsbF9yZWNvcmRzIikgPT0gMCkKKysJCQl7CisrCQkJc19zbWFsbF9yZWNvcmRzID0gMTsKKysJCQl9CisgCQllbHNlCisgCQkJeworIAkJCWZwcmludGYoc3RkZXJyLCJ1bmtub3duIG9wdGlvbiAlc1xuIiwqYXJndik7CitAQCAtODAyLDYgKzgyMSwyMSBAQCBiYWQ6CisgCQlTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChzX2N0eCxjaXBoZXIpOworIAkJfQorIAorKwlzc2xfbW9kZSA9IDA7CisrCWlmIChjX3NtYWxsX3JlY29yZHMpCisrCQl7CisrCQlzc2xfbW9kZSA9IFNTTF9DVFhfZ2V0X21vZGUoY19jdHgpOworKwkJc3NsX21vZGUgfD0gU1NMX01PREVfU01BTExfQlVGRkVSUzsKKysJCVNTTF9DVFhfc2V0X21vZGUoY19jdHgsIHNzbF9tb2RlKTsKKysJCX0KKysJc3NsX21vZGUgPSAwOworKwlpZiAoc19zbWFsbF9yZWNvcmRzKQorKwkJeworKwkJc3NsX21vZGUgPSBTU0xfQ1RYX2dldF9tb2RlKHNfY3R4KTsKKysJCXNzbF9tb2RlIHw9IFNTTF9NT0RFX1NNQUxMX0JVRkZFUlM7CisrCQlTU0xfQ1RYX3NldF9tb2RlKHNfY3R4LCBzc2xfbW9kZSk7CisrCQl9CisrCisgI2lmbmRlZiBPUEVOU1NMX05PX0RICisgCWlmICghbm9fZGhlKQorIAkJeworLS0tIG9wZW5zc2wtMS4wLjAub3JpZy90ZXN0L3Rlc3Rzc2wJMjAwNi0wMy0xMCAxNTowNjoyNy4wMDAwMDAwMDAgLTA4MDAKKysrKyBvcGVuc3NsLTEuMC4wL3Rlc3QvdGVzdHNzbAkyMDEwLTA0LTI2IDEwOjI0OjU1LjAwMDAwMDAwMCAtMDcwMAorQEAgLTcwLDYgKzcwLDE2IEBAICRzc2x0ZXN0IC1jbGllbnRfYXV0aCAkQ0EgJGV4dHJhIHx8IGV4aXQKKyBlY2hvIHRlc3Qgc3NsdjIvc3NsdjMgd2l0aCBib3RoIGNsaWVudCBhbmQgc2VydmVyIGF1dGhlbnRpY2F0aW9uCisgJHNzbHRlc3QgLXNlcnZlcl9hdXRoIC1jbGllbnRfYXV0aCAkQ0EgJGV4dHJhIHx8IGV4aXQgMQorIAorK2VjaG8gdGVzdCBzc2x2Mi9zc2x2MyB3aXRoIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYXV0aGVudGljYXRpb24gYW5kIHNtYWxsIGNsaWVudCBidWZmZXJzCisrJHNzbHRlc3QgLXNlcnZlcl9hdXRoIC1jbGllbnRfYXV0aCAtY19zbWFsbF9yZWNvcmRzICRDQSAkZXh0cmEgfHwgZXhpdCAxCisrCisrZWNobyB0ZXN0IHNzbHYyL3NzbHYzIHdpdGggYm90aCBjbGllbnQgYW5kIHNlcnZlciBhdXRoZW50aWNhdGlvbiBhbmQgc21hbGwgc2VydmVyIGJ1ZmZlcnMKKyskc3NsdGVzdCAtc2VydmVyX2F1dGggLWNsaWVudF9hdXRoIC1zX3NtYWxsX3JlY29yZHMgJENBICRleHRyYSB8fCBleGl0IDEKKysKKytlY2hvIHRlc3Qgc3NsdjIvc3NsdjMgd2l0aCBib3RoIGNsaWVudCBhbmQgc2VydmVyIGF1dGhlbnRpY2F0aW9uIGFuZCBzbWFsbCBjbGllbnQgYW5kIHNlcnZlciBidWZmZXJzCisrJHNzbHRlc3QgLXNlcnZlcl9hdXRoIC1jbGllbnRfYXV0aCAtY19zbWFsbF9yZWNvcmRzIC1zX3NtYWxsX3JlY29yZHMgJENBICRleHRyYSB8fCBleGl0IDEKKysKKysKKyBlY2hvIHRlc3Qgc3NsdjIgdmlhIEJJTyBwYWlyCisgJHNzbHRlc3QgLWJpb19wYWlyIC1zc2wyICRleHRyYSB8fCBleGl0IDEKKyAKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3BhdGNoZXMvc3NsX0FuZHJvaWQubWsgYi9saWIvb3BlbnNzbC9wYXRjaGVzL3NzbF9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOWQzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9wYXRjaGVzL3NzbF9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNzUgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitsb2NhbF9jX2luY2x1ZGVzIDo9IFwKKwlleHRlcm5hbC9vcGVuc3NsIFwKKwlleHRlcm5hbC9vcGVuc3NsL2luY2x1ZGUgXAorCWV4dGVybmFsL29wZW5zc2wvY3J5cHRvCisKK2xvY2FsX3NyY19maWxlczo9IFwKKwlzMl9tZXRoLmMgXAorCXMyX3NydnIuYyBcCisJczJfY2xudC5jIFwKKwlzMl9saWIuYyBcCisJczJfZW5jLmMgXAorCXMyX3BrdC5jIFwKKwlzM19tZXRoLmMgXAorCXMzX3NydnIuYyBcCisJczNfY2xudC5jIFwKKwlzM19saWIuYyBcCisJczNfZW5jLmMgXAorCXMzX3BrdC5jIFwKKwlzM19ib3RoLmMgXAorCXMyM19tZXRoLmMgXAorCXMyM19zcnZyLmMgXAorCXMyM19jbG50LmMgXAorCXMyM19saWIuYyBcCisJczIzX3BrdC5jIFwKKwl0MV9tZXRoLmMgXAorCXQxX3NydnIuYyBcCisJdDFfY2xudC5jIFwKKwl0MV9saWIuYyBcCisJdDFfZW5jLmMgXAorCXQxX3JlbmVnLmMgXAorCXNzbF9saWIuYyBcCisJc3NsX2VycjIuYyBcCisJc3NsX2NlcnQuYyBcCisJc3NsX3Nlc3MuYyBcCisJc3NsX2NpcGguYyBcCisJc3NsX3N0YXQuYyBcCisJc3NsX3JzYS5jIFwKKwlzc2xfYXNuMS5jIFwKKwlzc2xfdHh0LmMgXAorCXNzbF9hbGdzLmMgXAorCWJpb19zc2wuYyBcCisJc3NsX2Vyci5jIFwKKwlrc3NsLmMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYW5kcm9pZC1jb25maWcubWsKK0xPQ0FMX1NSQ19GSUxFUyArPSAkKGxvY2FsX3NyY19maWxlcykKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChsb2NhbF9jX2luY2x1ZGVzKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjcnlwdG8KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEU6PSBsaWJzc2wKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworaWZlcSAoJChXSVRIX0hPU1RfREFMVklLKSx0cnVlKQorICAgIGluY2x1ZGUgJChDTEVBUl9WQVJTKQorICAgIGluY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi9hbmRyb2lkLWNvbmZpZy5taworICAgIExPQ0FMX1NSQ19GSUxFUyArPSAkKGxvY2FsX3NyY19maWxlcykKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQobG9jYWxfY19pbmNsdWRlcykKKyAgICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmNyeXB0bworICAgIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisgICAgTE9DQUxfTU9EVUxFOj0gbGlic3NsCisgICAgaW5jbHVkZSAkKEJVSUxEX0hPU1RfU0hBUkVEX0xJQlJBUlkpCitlbmRpZgorCisjIHNzbHRlc3QKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2FuZHJvaWQtY29uZmlnLm1rCitMT0NBTF9TUkNfRklMRVM6PSBzc2x0ZXN0LmMKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChsb2NhbF9jX2luY2x1ZGVzKQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJzc2wgbGliY3J5cHRvCitMT0NBTF9NT0RVTEU6PSBzc2x0ZXN0CitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAoraW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9wYXRjaGVzL3Rlc3Rzc2wuc2ggYi9saWIvb3BlbnNzbC9wYXRjaGVzL3Rlc3Rzc2wuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1NjA5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3BhdGNoZXMvdGVzdHNzbC5zaApAQCAtMCwwICsxLDc3IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIworIyBBbmRyb2lkIHRlc3Rzc2wuc2ggZHJpdmVyIHNjcmlwdCBmb3Igb3BlbnNzbCdzIHRlc3Rzc2wKKyMKKyMgYmFzZWQgb24gb3BlbnNzbCdzIHRlc3QvdGVzdHNzIHNjcmlwdCBhbmQgdGVzdC9NYWtlZmlsZSdzIHRlc3Rfc3NsIHRhcmdldAorIworCitzZXQgLWUKK3RyYXAgImVjaG8gRXhpdGluZyBvbiB1bmV4cGVjdGVkIGVycm9yLiIgRVJSCisKK2RldmljZT0vc2RjYXJkL2FuZHJvaWQudGVzdHNzbAorCitkaWdlc3Q9Jy1zaGExJworcmVxY21kPSJhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCByZXEiCit4NTA5Y21kPSJhZGIgc2hlbGwgL3N5c3RlbS9iaW4vb3BlbnNzbCB4NTA5ICRkaWdlc3QiCisKK0NBa2V5PSIkZGV2aWNlL2tleUNBLnNzIgorQ0FjZXJ0PSIkZGV2aWNlL2NlcnRDQS5zcyIKK0NBcmVxPSIkZGV2aWNlL3JlcUNBLnNzIgorQ0Fjb25mPSIkZGV2aWNlL0NBc3MuY25mIgorCitVY29uZj0iJGRldmljZS9Vc3MuY25mIgorVXJlcT0iJGRldmljZS9yZXFVLnNzIgorVWtleT0iJGRldmljZS9rZXlVLnNzIgorVWNlcnQ9IiRkZXZpY2UvY2VydFUuc3MiCisKK2VjaG8KK2VjaG8gInNldHRpbmcgdXAiCithZGIgcmVtb3VudAorYWRiIHNoZWxsIHJtIC1yICRkZXZpY2UKK2FkYiBzaGVsbCBta2RpciAkZGV2aWNlCisKK2VjaG8KK2VjaG8gInB1c2hpbmcgdGVzdCBmaWxlcyB0byBkZXZpY2UiCithZGIgcHVzaCAuICRkZXZpY2UKKworZWNobworZWNobyAibWFrZSBhIGNlcnRpZmljYXRlIHJlcXVlc3QgdXNpbmcgJ3JlcSciCithZGIgc2hlbGwgImVjaG8gXCJzdHJpbmcgdG8gbWFrZSB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgdGhpbmsgaXQgaGFzIGVudHJvcHlcIiA+PiAkZGV2aWNlLy5ybmQiCityZXFfbmV3PSctbmV3JworJHJlcWNtZCAtY29uZmlnICRDQWNvbmYgLW91dCAkQ0FyZXEgLWtleW91dCAkQ0FrZXkgJHJlcV9uZXcKKworZWNobworZWNobyAiY29udmVydCB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCBpbnRvIGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgdXNpbmcgJ3g1MDknIgorJHg1MDljbWQgLUNBY3JlYXRlc2VyaWFsIC1pbiAkQ0FyZXEgLWRheXMgMzAgLXJlcSAtb3V0ICRDQWNlcnQgLXNpZ25rZXkgJENBa2V5IC1leHRmaWxlICRDQWNvbmYgLWV4dGVuc2lvbnMgdjNfY2EKKworZWNobworZWNobyAibWFrZSBhIHVzZXIgY2VydGlmaWNhdGUgcmVxdWVzdCB1c2luZyAncmVxJyIKKyRyZXFjbWQgLWNvbmZpZyAkVWNvbmYgLW91dCAkVXJlcSAta2V5b3V0ICRVa2V5ICRyZXFfbmV3CisKK2VjaG8KK2VjaG8gInNpZ24gdXNlciBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHdpdGggdGhlIGp1c3QgY3JlYXRlZCBDQSB2aWEgJ3g1MDknIgorJHg1MDljbWQgLUNBY3JlYXRlc2VyaWFsIC1pbiAkVXJlcSAtZGF5cyAzMCAtcmVxIC1vdXQgJFVjZXJ0IC1DQSAkQ0FjZXJ0IC1DQWtleSAkQ0FrZXkgLWV4dGZpbGUgJFVjb25mIC1leHRlbnNpb25zIHYzX2VlCisKK2VjaG8KK2VjaG8gInJ1bm5pbmcgdGVzdHNzbCIKKy4vdGVzdHNzbCAkVWtleSAkVWNlcnQgJENBY2VydAorCitlY2hvCitlY2hvICJjbGVhbmluZyB1cCIKK2FkYiBzaGVsbCBybSAtciAkZGV2aWNlCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvQW5kcm9pZC5tayBiL2xpYi9vcGVuc3NsL3NzbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOWQzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvQW5kcm9pZC5tawpAQCAtMCwwICsxLDc1IEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworbG9jYWxfY19pbmNsdWRlcyA6PSBcCisJZXh0ZXJuYWwvb3BlbnNzbCBcCisJZXh0ZXJuYWwvb3BlbnNzbC9pbmNsdWRlIFwKKwlleHRlcm5hbC9vcGVuc3NsL2NyeXB0bworCitsb2NhbF9zcmNfZmlsZXM6PSBcCisJczJfbWV0aC5jIFwKKwlzMl9zcnZyLmMgXAorCXMyX2NsbnQuYyBcCisJczJfbGliLmMgXAorCXMyX2VuYy5jIFwKKwlzMl9wa3QuYyBcCisJczNfbWV0aC5jIFwKKwlzM19zcnZyLmMgXAorCXMzX2NsbnQuYyBcCisJczNfbGliLmMgXAorCXMzX2VuYy5jIFwKKwlzM19wa3QuYyBcCisJczNfYm90aC5jIFwKKwlzMjNfbWV0aC5jIFwKKwlzMjNfc3J2ci5jIFwKKwlzMjNfY2xudC5jIFwKKwlzMjNfbGliLmMgXAorCXMyM19wa3QuYyBcCisJdDFfbWV0aC5jIFwKKwl0MV9zcnZyLmMgXAorCXQxX2NsbnQuYyBcCisJdDFfbGliLmMgXAorCXQxX2VuYy5jIFwKKwl0MV9yZW5lZy5jIFwKKwlzc2xfbGliLmMgXAorCXNzbF9lcnIyLmMgXAorCXNzbF9jZXJ0LmMgXAorCXNzbF9zZXNzLmMgXAorCXNzbF9jaXBoLmMgXAorCXNzbF9zdGF0LmMgXAorCXNzbF9yc2EuYyBcCisJc3NsX2FzbjEuYyBcCisJc3NsX3R4dC5jIFwKKwlzc2xfYWxncy5jIFwKKwliaW9fc3NsLmMgXAorCXNzbF9lcnIuYyBcCisJa3NzbC5jCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uL2FuZHJvaWQtY29uZmlnLm1rCitMT0NBTF9TUkNfRklMRVMgKz0gJChsb2NhbF9zcmNfZmlsZXMpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQobG9jYWxfY19pbmNsdWRlcykKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3J5cHRvCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFOj0gbGlic3NsCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2lmZXEgKCQoV0lUSF9IT1NUX0RBTFZJSyksdHJ1ZSkKKyAgICBpbmNsdWRlICQoQ0xFQVJfVkFSUykKKyAgICBpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vYW5kcm9pZC1jb25maWcubWsKKyAgICBMT0NBTF9TUkNfRklMRVMgKz0gJChsb2NhbF9zcmNfZmlsZXMpCisgICAgTE9DQUxfQ19JTkNMVURFUyArPSAkKGxvY2FsX2NfaW5jbHVkZXMpCisgICAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjcnlwdG8KKyAgICBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorICAgIExPQ0FMX01PRFVMRTo9IGxpYnNzbAorICAgIGluY2x1ZGUgJChCVUlMRF9IT1NUX1NIQVJFRF9MSUJSQVJZKQorZW5kaWYKKworIyBzc2x0ZXN0CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi9hbmRyb2lkLWNvbmZpZy5taworTE9DQUxfU1JDX0ZJTEVTOj0gc3NsdGVzdC5jCitMT0NBTF9DX0lOQ0xVREVTICs9ICQobG9jYWxfY19pbmNsdWRlcykKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlic3NsIGxpYmNyeXB0bworTE9DQUxfTU9EVUxFOj0gc3NsdGVzdAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL01ha2VmaWxlIGIvbGliL29wZW5zc2wvc3NsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjc1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvTWFrZWZpbGUKQEAgLTAsMCArMSw5NzUgQEAKKyMKKyMgT3BlblNTTC9zc2wvTWFrZWZpbGUKKyMKKworRElSPQlzc2wKK1RPUD0JLi4KK0NDPQljYworSU5DTFVERVM9IC1JLi4vY3J5cHRvIC1JJChUT1ApIC1JLi4vaW5jbHVkZSAkKEtSQjVfSU5DTFVERVMpCitDRkxBRz0tZworTUFLRUZJTEU9CU1ha2VmaWxlCitBUj0JCWFyIHIKKyMgS1JCNSBzdHVmZgorS1JCNV9JTkNMVURFUz0KKworQ0ZMQUdTPSAkKElOQ0xVREVTKSAkKENGTEFHKQorCitHRU5FUkFMPU1ha2VmaWxlIFJFQURNRSBzc2wtbGliLmNvbSBpbnN0YWxsLmNvbQorVEVTVD1zc2x0ZXN0LmMKK0FQUFM9CisKK0xJQj0kKFRPUCkvbGlic3NsLmEKK1NIQVJFRF9MSUI9IGxpYnNzbCQoU0hMSUJfRVhUKQorTElCU1JDPQlcCisJczJfbWV0aC5jICAgczJfc3J2ci5jIHMyX2NsbnQuYyAgczJfbGliLmMgIHMyX2VuYy5jIHMyX3BrdC5jIFwKKwlzM19tZXRoLmMgICBzM19zcnZyLmMgczNfY2xudC5jICBzM19saWIuYyAgczNfZW5jLmMgczNfcGt0LmMgczNfYm90aC5jIFwKKwlzMjNfbWV0aC5jIHMyM19zcnZyLmMgczIzX2NsbnQuYyBzMjNfbGliLmMgICAgICAgICAgczIzX3BrdC5jIFwKKwl0MV9tZXRoLmMgICB0MV9zcnZyLmMgdDFfY2xudC5jICB0MV9saWIuYyAgdDFfZW5jLmMgXAorCWQxX21ldGguYyAgIGQxX3NydnIuYyBkMV9jbG50LmMgIGQxX2xpYi5jICBkMV9wa3QuYyBcCisJZDFfYm90aC5jIGQxX2VuYy5jIFwKKwlzc2xfbGliLmMgc3NsX2VycjIuYyBzc2xfY2VydC5jIHNzbF9zZXNzLmMgXAorCXNzbF9jaXBoLmMgc3NsX3N0YXQuYyBzc2xfcnNhLmMgXAorCXNzbF9hc24xLmMgc3NsX3R4dC5jIHNzbF9hbGdzLmMgXAorCWJpb19zc2wuYyBzc2xfZXJyLmMga3NzbC5jIHQxX3JlbmVnLmMKK0xJQk9CSj0gXAorCXMyX21ldGgubyAgczJfc3J2ci5vICBzMl9jbG50Lm8gIHMyX2xpYi5vICBzMl9lbmMubyBzMl9wa3QubyBcCisJczNfbWV0aC5vICBzM19zcnZyLm8gIHMzX2NsbnQubyAgczNfbGliLm8gIHMzX2VuYy5vIHMzX3BrdC5vIHMzX2JvdGgubyBcCisJczIzX21ldGgubyBzMjNfc3J2ci5vIHMyM19jbG50Lm8gczIzX2xpYi5vICAgICAgICAgIHMyM19wa3QubyBcCisJdDFfbWV0aC5vICAgdDFfc3J2ci5vIHQxX2NsbnQubyAgdDFfbGliLm8gIHQxX2VuYy5vIFwKKwlkMV9tZXRoLm8gICBkMV9zcnZyLm8gZDFfY2xudC5vICBkMV9saWIubyAgZDFfcGt0Lm8gXAorCWQxX2JvdGgubyBkMV9lbmMubyBcCisJc3NsX2xpYi5vIHNzbF9lcnIyLm8gc3NsX2NlcnQubyBzc2xfc2Vzcy5vIFwKKwlzc2xfY2lwaC5vIHNzbF9zdGF0Lm8gc3NsX3JzYS5vIFwKKwlzc2xfYXNuMS5vIHNzbF90eHQubyBzc2xfYWxncy5vIFwKKwliaW9fc3NsLm8gc3NsX2Vyci5vIGtzc2wubyB0MV9yZW5lZy5vCisKK1NSQz0gJChMSUJTUkMpCisKK0VYSEVBREVSPSBzc2wuaCBzc2wyLmggc3NsMy5oIHNzbDIzLmggdGxzMS5oIGR0bHMxLmgga3NzbC5oCitIRUFERVI9CSQoRVhIRUFERVIpIHNzbF9sb2NsLmgga3NzbF9sY2wuaAorCitBTEw9ICAgICQoR0VORVJBTCkgJChTUkMpICQoSEVBREVSKQorCit0b3A6CisJKGNkIC4uOyAkKE1BS0UpIERJUlM9JChESVIpIGFsbCkKKworYWxsOglzaGFyZWQKKworbGliOgkkKExJQk9CSikKKwkkKEFSKSAkKExJQikgJChMSUJPQkopCisJJChSQU5MSUIpICQoTElCKSB8fCBlY2hvIE5ldmVyIG1pbmQuCisJQHRvdWNoIGxpYgorCitzaGFyZWQ6IGxpYgorCWlmIFsgLW4gIiQoU0hBUkVEX0xJQlMpIiBdOyB0aGVuIFwKKwkJKGNkIC4uOyAkKE1BS0UpICQoU0hBUkVEX0xJQikpOyBcCisJZmkKKworZmlsZXM6CisJJChQRVJMKSAkKFRPUCkvdXRpbC9maWxlcy5wbCBNYWtlZmlsZSA+PiAkKFRPUCkvTUlORk8KKworbGlua3M6CisJQCQoUEVSTCkgJChUT1ApL3V0aWwvbWtsaW5rLnBsIC4uL2luY2x1ZGUvb3BlbnNzbCAkKEVYSEVBREVSKQorCUAkKFBFUkwpICQoVE9QKS91dGlsL21rbGluay5wbCAuLi90ZXN0ICQoVEVTVCkKKwlAJChQRVJMKSAkKFRPUCkvdXRpbC9ta2xpbmsucGwgLi4vYXBwcyAkKEFQUFMpCisKK2luc3RhbGw6CisJQFsgLW4gIiQoSU5TVEFMTFRPUCkiIF0gIyBzaG91bGQgYmUgc2V0IGJ5IHRvcCBNYWtlZmlsZS4uLgorCUBoZWFkZXJsaXN0PSIkKEVYSEVBREVSKSI7IGZvciBpIGluICQkaGVhZGVybGlzdCA7IFwKKwlkbyAgXAorCShjcCAkJGkgJChJTlNUQUxMX1BSRUZJWCkkKElOU1RBTExUT1ApL2luY2x1ZGUvb3BlbnNzbC8kJGk7IFwKKwljaG1vZCA2NDQgJChJTlNUQUxMX1BSRUZJWCkkKElOU1RBTExUT1ApL2luY2x1ZGUvb3BlbnNzbC8kJGkgKTsgXAorCWRvbmU7CisKK3RhZ3M6CisJY3RhZ3MgJChTUkMpCisKK3Rlc3RzOgorCitsaW50OgorCWxpbnQgLURMSU5UICQoSU5DTFVERVMpICQoU1JDKT5mbHVmZgorCitkZXBlbmQ6CisJQGlmIFsgLXogIiQoVEhJUykiIF07IHRoZW4gXAorCSAgICAkKE1BS0UpIC1mICQoVE9QKS9NYWtlZmlsZSByZWZsZWN0IFRISVM9JEA7IFwKKwllbHNlIFwKKwkgICAgJChNQUtFREVQRU5EKSAtLSAkKENGTEFHKSAkKElOQ0xVREVTKSAkKERFUEZMQUcpIC0tICQoUFJPR1MpICQoTElCU1JDKTsgXAorCWZpCisKK2RjbGVhbjoKKwkkKFBFUkwpIC1wZSAnaWYgKC9eIyBETyBOT1QgREVMRVRFIFRISVMgTElORS8pIHtwcmludDsgZXhpdCgwKTt9JyAkKE1BS0VGSUxFKSA+TWFrZWZpbGUubmV3CisJbXYgLWYgTWFrZWZpbGUubmV3ICQoTUFLRUZJTEUpCisKK2NsZWFuOgorCXJtIC1mICoubyAqLm9iaiBsaWIgdGFncyBjb3JlIC5wdXJlIC5uZnMqICoub2xkICouYmFrIGZsdWZmCisKKyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWFrZSBkZXBlbmQgZGVwZW5kcyBvbiBpdC4KKworYmlvX3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorYmlvX3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorYmlvX3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmgKK2Jpb19zc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmgKK2Jpb19zc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaAorYmlvX3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oCitiaW9fc3NsLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaAorYmlvX3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCitiaW9fc3NsLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmgKK2Jpb19zc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmgKK2Jpb19zc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmgKK2Jpb19zc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmggLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oCitiaW9fc3NsLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmgKK2Jpb19zc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmgKK2Jpb19zc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorYmlvX3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaAorYmlvX3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKK2Jpb19zc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5LmggYmlvX3NzbC5jCitkMV9ib3RoLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorZDFfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorZDFfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK2QxX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKK2QxX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorZDFfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcmFuZC5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmgKK2QxX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaAorZDFfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oCitkMV9ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmgKK2QxX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaAorZDFfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIGQxX2JvdGguYworZDFfYm90aC5vOiBzc2xfbG9jbC5oCitkMV9jbG50Lm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorZDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYm4uaCAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmgKK2QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmgKK2QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2RoLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitkMV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitkMV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK2QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitkMV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitkMV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKK2QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL21kNS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmgKK2QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaAorZDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaAorZDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaAorZDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaCAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmgKK2QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3JhbmQuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK2QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorZDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorZDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitkMV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitkMV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorZDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBkMV9jbG50LmMga3NzbF9sY2wuaCBzc2xfbG9jbC5oCitkMV9lbmMubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK2QxX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK2QxX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK2QxX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL21kNS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmgKK2QxX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmgKK2QxX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaAorZDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaAorZDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yYW5kLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorZDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorZDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oCitkMV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5LmggZDFfZW5jLmMgc3NsX2xvY2wuaAorZDFfbGliLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorZDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitkMV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorZDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitkMV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorZDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorZDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitkMV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorZDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorZDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitkMV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitkMV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorZDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK2QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitkMV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmgKK2QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitkMV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK2QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKK2QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBkMV9saWIuYyBzc2xfbG9jbC5oCitkMV9tZXRoLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorZDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorZDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK2QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKK2QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorZDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK2QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorZDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorZDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitkMV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorZDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBkMV9tZXRoLmMgc3NsX2xvY2wuaAorZDFfcGt0Lm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitkMV9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitkMV9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitkMV9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitkMV9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitkMV9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcmFuZC5oCitkMV9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK2QxX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oCitkMV9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaAorZDFfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK2QxX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIGQxX3BrdC5jCitkMV9wa3Qubzogc3NsX2xvY2wuaAorZDFfc3J2ci5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK2QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2JuLmggLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oCitkMV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oCitkMV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kaC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorZDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAorZDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitkMV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorZDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmggLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaAorZDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitkMV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9tZDUuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCitkMV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmgKK2QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmgKK2QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmgKK2QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmggLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oCitkMV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yYW5kLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCitkMV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmgKK2QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmgKK2QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorZDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaAorZDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKK2QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5LmggZDFfc3J2ci5jIHNzbF9sb2NsLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oCitrc3NsLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oCitrc3NsLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tyYjVfYXNuLmggLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaAora3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCitrc3NsLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmggLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oCitrc3NsLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAora3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaAora3NzbC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKK2tzc2wubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmgga3NzbC5jIGtzc2xfbGNsLmgKK3MyM19jbG50Lm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorczIzX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3MyM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3MyM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmgKK3MyM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK3MyM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3MyM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKK3MyM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcmFuZC5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oCitzMjNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIHMyM19jbG50LmMKK3MyM19jbG50Lm86IHNzbF9sb2NsLmgKK3MyM19saWIubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzMjNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzMjNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorczIzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorczIzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzMjNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaAorczIzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitzMjNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oCitzMjNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3MyM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oCitzMjNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIHMyM19saWIuYyBzc2xfbG9jbC5oCitzMjNfbWV0aC5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK3MyM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzMjNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzMjNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAorczIzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorczIzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzMjNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmggLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaAorczIzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorczIzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitzMjNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorczIzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzMjNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitzMjNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCitzMjNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitzMjNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorczIzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorczIzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3MyM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorczIzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5LmggczIzX21ldGguYyBzc2xfbG9jbC5oCitzMjNfcGt0Lm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorczIzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorczIzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK3MyM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKK3MyM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorczIzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK3MyM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorczIzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorczIzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitzMjNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorczIzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzMjNfcGt0LmMgc3NsX2xvY2wuaAorczIzX3NydnIubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzMjNfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorczIzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorczIzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorczIzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorczIzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorczIzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorczIzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9yYW5kLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK3MyM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5LmggczIzX3NydnIuYworczIzX3NydnIubzogc3NsX2xvY2wuaAorczJfY2xudC5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK3MyX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3MyX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzMl9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmggLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitzMl9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3MyX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JhbmQuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oCitzMl9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK3MyX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaAorczJfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCitzMl9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK3MyX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzMl9jbG50LmMKK3MyX2NsbnQubzogc3NsX2xvY2wuaAorczJfZW5jLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorczJfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzMl9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorczJfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzMl9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorczJfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorczJfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitzMl9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorczJfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorczJfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitzMl9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzMl9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorczJfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK3MyX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitzMl9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmgKK3MyX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitzMl9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3MyX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKK3MyX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzMl9lbmMuYyBzc2xfbG9jbC5oCitzMl9saWIubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzMl9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3MyX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzMl9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MyX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzMl9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzMl9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3MyX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitzMl9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL21kNS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmgKK3MyX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oCitzMl9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmgKK3MyX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaAorczJfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaAorczJfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmgKK3MyX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oCitzMl9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaAorczJfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmgKK3MyX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oCitzMl9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzMl9saWIuYworczJfbGliLm86IHNzbF9sb2NsLmgKK3MyX21ldGgubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzMl9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzMl9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorczJfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorczJfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzMl9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaAorczJfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitzMl9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oCitzMl9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3MyX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oCitzMl9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIHMyX21ldGguYyBzc2xfbG9jbC5oCitzMl9wa3QubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzMl9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3MyX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzMl9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MyX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzMl9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzMl9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3MyX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitzMl9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitzMl9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKK3MyX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3MyX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitzMl9wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaAorczJfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmgKK3MyX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorczJfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmgKK3MyX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaAorczJfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorczJfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIHMyX3BrdC5jIHNzbF9sb2NsLmgKK3MyX3NydnIubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzMl9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzMl9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorczJfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorczJfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzMl9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9yYW5kLmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaAorczJfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oCitzMl9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKK3MyX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaAorczJfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oCitzMl9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5LmggczJfc3J2ci5jCitzMl9zcnZyLm86IHNzbF9sb2NsLmgKK3MzX2JvdGgubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzM19ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzM19ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorczNfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorczNfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzM19ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9yYW5kLmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaAorczNfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oCitzM19ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKK3MzX2JvdGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaAorczNfYm90aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oCitzM19ib3RoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5LmggczNfYm90aC5jCitzM19ib3RoLm86IHNzbF9sb2NsLmgKK3MzX2NsbnQubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ibi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZGguaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3MzX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MzX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZW5naW5lLmgKK3MzX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmgKK3MzX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmggLi4vaW5jbHVkZS9vcGVuc3NsL21kNS5oCitzM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3MzX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JhbmQuaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oCitzM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK3MzX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaAorczNfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCitzM19jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK3MzX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBrc3NsX2xjbC5oCitzM19jbG50Lm86IHMzX2NsbnQuYyBzc2xfbG9jbC5oCitzM19lbmMubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzM19lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3MzX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzM19lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3MzX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzM19lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzM19lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3MzX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitzM19lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL21kNS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmgKK3MzX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oCitzM19lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmgKK3MzX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaAorczNfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaAorczNfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmgKK3MzX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oCitzM19lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaAorczNfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmgKK3MzX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oCitzM19lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzM19lbmMuYworczNfZW5jLm86IHNzbF9sb2NsLmgKK3MzX2xpYi5vOiAuLi9jcnlwdG8vZWMvZWNfbGNsLmggLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmgKK3MzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2JuLmgKK3MzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorczNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZGguaAorczNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaAorczNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oCitzM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaAorczNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmgKK3MzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmgKK3MzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaCAuLi9pbmNsdWRlL29wZW5zc2wvbWQ1LmgKK3MzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK3MzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorczNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorczNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKK3MzX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCitzM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorczNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oCitzM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorczNfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitzM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oCitzM19saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmgga3NzbF9sY2wuaCBzM19saWIuYyBzc2xfbG9jbC5oCitzM19tZXRoLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorczNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorczNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK3MzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKK3MzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorczNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK3MzX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorczNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorczNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitzM19tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorczNfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzM19tZXRoLmMgc3NsX2xvY2wuaAorczNfcGt0Lm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorczNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorczNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorczNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorczNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitzM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorczNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorczNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitzM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorczNfcGt0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK3MzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitzM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmgKK3MzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitzM19wa3QubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3MzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKK3MzX3BrdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzM19wa3QuYyBzc2xfbG9jbC5oCitzM19zcnZyLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorczNfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYm4uaCAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmgKK3MzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmgKK3MzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2RoLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK3MzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitzM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rcmI1X2Fzbi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmgKK3MzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmggLi4vaW5jbHVkZS9vcGVuc3NsL21kNS5oCitzM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorczNfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorczNfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3MzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorczNfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JhbmQuaAorczNfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oCitzM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK3MzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaAorczNfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCitzM19zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK3MzX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBrc3NsX2xjbC5oCitzM19zcnZyLm86IHMzX3NydnIuYyBzc2xfbG9jbC5oCitzc2xfYWxncy5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK3NzbF9hbGdzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzc2xfYWxncy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzc2xfYWxncy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAorc3NsX2FsZ3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorc3NsX2FsZ3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzc2xfYWxncy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmggLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaAorc3NsX2FsZ3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorc3NsX2FsZ3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitzc2xfYWxncy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorc3NsX2FsZ3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzc2xfYWxncy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitzc2xfYWxncy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCitzc2xfYWxncy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitzc2xfYWxncy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorc3NsX2FsZ3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorc3NsX2FsZ3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3NzbF9hbGdzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorc3NsX2FsZ3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmggc3NsX2FsZ3MuYyBzc2xfbG9jbC5oCitzc2xfYXNuMS5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMV9tYWMuaAorc3NsX2FzbjEubzogLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oIC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaAorc3NsX2FzbjEubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaAorc3NsX2FzbjEubzogLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaAorc3NsX2FzbjEubzogLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmggLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaAorc3NsX2FzbjEubzogLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaAorc3NsX2FzbjEubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oCitzc2xfYXNuMS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaCAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK3NzbF9hc24xLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmggc3NsX2FzbjEuYworc3NsX2FzbjEubzogc3NsX2xvY2wuaAorc3NsX2NlcnQubzogLi4vY3J5cHRvL29fZGlyLmggLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaCAuLi9pbmNsdWRlL29wZW5zc2wvYm4uaAorc3NsX2NlcnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZGguaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmgKK3NzbF9jZXJ0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaAorc3NsX2NlcnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oCitzc2xfY2VydC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOXYzLmgKK3NzbF9jZXJ0Lm86IHNzbF9jZXJ0LmMgc3NsX2xvY2wuaAorc3NsX2NpcGgubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzc2xfY2lwaC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3NzbF9jaXBoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK3NzbF9jaXBoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lbmdpbmUuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oCitzc2xfY2lwaC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCitzc2xfY2lwaC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oCitzc2xfY2lwaC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmgKK3NzbF9jaXBoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaAorc3NsX2NpcGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzc2xfY2lwaC5jCitzc2xfY2lwaC5vOiBzc2xfbG9jbC5oCitzc2xfZXJyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzc2xfZXJyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzc2xfZXJyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaAorc3NsX2Vyci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaAorc3NsX2Vyci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oCitzc2xfZXJyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmgKK3NzbF9lcnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oCitzc2xfZXJyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmgKK3NzbF9lcnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaAorc3NsX2Vyci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaAorc3NsX2Vyci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaAorc3NsX2Vyci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaCAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmgKK3NzbF9lcnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorc3NsX2Vyci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorc3NsX2Vyci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitzc2xfZXJyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitzc2xfZXJyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorc3NsX2Vyci5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzc2xfZXJyLmMKK3NzbF9lcnIyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzc2xfZXJyMi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorc3NsX2VycjIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oCitzc2xfZXJyMi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaAorc3NsX2VycjIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaAorc3NsX2VycjIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaAorc3NsX2VycjIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oCitzc2xfZXJyMi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCitzc2xfZXJyMi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oCitzc2xfZXJyMi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaAorc3NsX2VycjIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmgKK3NzbF9lcnIyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaAorc3NsX2VycjIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorc3NsX2VycjIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmgKK3NzbF9lcnIyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmgKK3NzbF9lcnIyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitzc2xfZXJyMi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKK3NzbF9lcnIyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIHNzbF9lcnIyLmMKK3NzbF9saWIubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCitzc2xfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzc2xfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oCitzc2xfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kaC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzc2xfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lbmdpbmUuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oCitzc2xfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCitzc2xfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmggLi4vaW5jbHVkZS9vcGVuc3NsL29jc3AuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3NzbF9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JhbmQuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oCitzc2xfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK3NzbF9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCitzc2xfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK3NzbF9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaAorc3NsX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOXYzLmgga3NzbF9sY2wuaCBzc2xfbGliLmMgc3NsX2xvY2wuaAorc3NsX3JzYS5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK3NzbF9yc2EubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3NzbF9yc2EubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzc2xfcnNhLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmggLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCitzc2xfcnNhLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3NzbF9yc2EubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCitzc2xfcnNhLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmgKK3NzbF9yc2EubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmgKK3NzbF9yc2EubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaAorc3NsX3JzYS5vOiAuLi9pbmNsdWRlL29wZW5zc2wvdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmgKK3NzbF9yc2EubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmggc3NsX2xvY2wuaCBzc2xfcnNhLmMKK3NzbF9zZXNzLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorc3NsX3Nlc3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3NzbF9zZXNzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3NzbF9zZXNzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzc2xfc2Vzcy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCitzc2xfc2Vzcy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZW5naW5lLmgKK3NzbF9zZXNzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmgKK3NzbF9zZXNzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaAorc3NsX3Nlc3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmggLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaAorc3NsX3Nlc3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaAorc3NsX3Nlc3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmggLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmgKK3NzbF9zZXNzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oCitzc2xfc2Vzcy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaCAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmgKK3NzbF9zZXNzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yYW5kLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCitzc2xfc2Vzcy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitzc2xfc2Vzcy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorc3NsX3Nlc3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorc3NsX3Nlc3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3NzbF9zZXNzLm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorc3NsX3Nlc3MubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmggc3NsX2xvY2wuaCBzc2xfc2Vzcy5jCitzc2xfc3RhdC5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK3NzbF9zdGF0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCitzc2xfc3RhdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzc2xfc3RhdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAorc3NsX3N0YXQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAorc3NsX3N0YXQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzc2xfc3RhdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmggLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaAorc3NsX3N0YXQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAorc3NsX3N0YXQubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitzc2xfc3RhdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAorc3NsX3N0YXQubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCitzc2xfc3RhdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitzc2xfc3RhdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCitzc2xfc3RhdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCitzc2xfc3RhdC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorc3NsX3N0YXQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAorc3NsX3N0YXQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3NzbF9zdGF0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorc3NsX3N0YXQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmggc3NsX2xvY2wuaCBzc2xfc3RhdC5jCitzc2xfdHh0Lm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAorc3NsX3R4dC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAorc3NsX3R4dC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK3NzbF90eHQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKK3NzbF90eHQubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAorc3NsX3R4dC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmgKK3NzbF90eHQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaAorc3NsX3R4dC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAorc3NsX3R4dC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oCitzc2xfdHh0Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAorc3NsX3R4dC5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzc2xfbG9jbC5oIHNzbF90eHQuYwordDFfY2xudC5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK3QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkaC5oCit0MV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmggLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wva3NzbC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9saGFzaC5oCit0MV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vYmpfbWFjLmggLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbTIuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JhbmQuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oCit0MV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zaGEuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmgKK3QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMjMuaAordDFfY2xudC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCit0MV9jbG50Lm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zeW1oYWNrcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmgKK3QxX2NsbnQubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOV92ZnkuaCBzc2xfbG9jbC5oCit0MV9jbG50Lm86IHQxX2NsbnQuYwordDFfZW5jLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAordDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCit0MV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2NyeXB0by5oIC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaAordDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCit0MV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAordDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RzYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaAordDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCit0MV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAordDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9tZDUuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCit0MV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaAordDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oCit0MV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmgKK3QxX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGtjczcuaCAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmgKK3QxX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcnNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NhZmVzdGFjay5oCit0MV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaAordDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmgKK3QxX2VuYy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zdGFjay5oCit0MV9lbmMubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaAordDFfZW5jLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5LmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmggc3NsX2xvY2wuaAordDFfZW5jLm86IHQxX2VuYy5jCit0MV9saWIubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCit0MV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2J1ZmZlci5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jb21wLmgKK3QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaAordDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaAordDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oCit0MV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaCAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaAordDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lcnIuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmgKK3QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmgKK3QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oCit0MV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29iamVjdHMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2NzcC5oCit0MV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKK3QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3NzbF90eXAuaCAuLi9pbmNsdWRlL29wZW5zc2wvcGVtLmgKK3QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCit0MV9saWIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaAordDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zYWZlc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc2hhLmgKK3QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAordDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmgKK3QxX2xpYi5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3RhY2suaCAuLi9pbmNsdWRlL29wZW5zc2wvc3ltaGFja3MuaAordDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAordDFfbGliLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5djMuaCBzc2xfbG9jbC5oCit0MV9saWIubzogdDFfbGliLmMKK3QxX21ldGgubzogLi4vZV9vcy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9hc24xLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Jpby5oCit0MV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCit0MV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9jcnlwdG8uaCAuLi9pbmNsdWRlL29wZW5zc2wvZHNhLmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2R0bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vfb3MyLmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAordDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZWNkc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvZXJyLmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2V2cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9obWFjLmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAordDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb2JqX21hYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vYmplY3RzLmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2xjb25mLmggLi4vaW5jbHVkZS9vcGVuc3NsL29wZW5zc2x2LmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCit0MV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0yLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BrY3M3LmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3BxdWV1ZS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaAordDFfbWV0aC5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCit0MV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oCit0MV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3QxX21ldGgubzogLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oCit0MV9tZXRoLm86IC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIHNzbF9sb2NsLmggdDFfbWV0aC5jCit0MV9yZW5lZy5vOiAuLi9lX29zLmggLi4vaW5jbHVkZS9vcGVuc3NsL2FzbjEuaCAuLi9pbmNsdWRlL29wZW5zc2wvYmlvLmgKK3QxX3JlbmVnLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9idWZmZXIuaCAuLi9pbmNsdWRlL29wZW5zc2wvY29tcC5oCit0MV9yZW5lZy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCit0MV9yZW5lZy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZHRsczEuaCAuLi9pbmNsdWRlL29wZW5zc2wvZV9vczIuaAordDFfcmVuZWcubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjLmggLi4vaW5jbHVkZS9vcGVuc3NsL2VjZGguaAordDFfcmVuZWcubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCit0MV9yZW5lZy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvZXZwLmggLi4vaW5jbHVkZS9vcGVuc3NsL2htYWMuaAordDFfcmVuZWcubzogLi4vaW5jbHVkZS9vcGVuc3NsL2tzc2wuaCAuLi9pbmNsdWRlL29wZW5zc2wvbGhhc2guaAordDFfcmVuZWcubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCit0MV9yZW5lZy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbGNvbmYuaCAuLi9pbmNsdWRlL29wZW5zc2wvb3BlbnNzbHYuaAordDFfcmVuZWcubzogLi4vaW5jbHVkZS9vcGVuc3NsL29zc2xfdHlwLmggLi4vaW5jbHVkZS9vcGVuc3NsL3BlbS5oCit0MV9yZW5lZy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCit0MV9yZW5lZy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcHF1ZXVlLmggLi4vaW5jbHVkZS9vcGVuc3NsL3JzYS5oCit0MV9yZW5lZy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oCit0MV9yZW5lZy5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIuaAordDFfcmVuZWcubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDIzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3NzbDMuaAordDFfcmVuZWcubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmgKK3QxX3JlbmVnLm86IC4uL2luY2x1ZGUvb3BlbnNzbC90bHMxLmggLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDkuaAordDFfcmVuZWcubzogLi4vaW5jbHVkZS9vcGVuc3NsL3g1MDlfdmZ5Lmggc3NsX2xvY2wuaCB0MV9yZW5lZy5jCit0MV9zcnZyLm86IC4uL2Vfb3MuaCAuLi9pbmNsdWRlL29wZW5zc2wvYXNuMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9iaW8uaAordDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvYnVmZmVyLmggLi4vaW5jbHVkZS9vcGVuc3NsL2NvbXAuaAordDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvY3J5cHRvLmggLi4vaW5jbHVkZS9vcGVuc3NsL2RzYS5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9kdGxzMS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lX29zMi5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9lYy5oIC4uL2luY2x1ZGUvb3BlbnNzbC9lY2RoLmgKK3QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL2VjZHNhLmggLi4vaW5jbHVkZS9vcGVuc3NsL2Vyci5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9ldnAuaCAuLi9pbmNsdWRlL29wZW5zc2wvaG1hYy5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9rc3NsLmggLi4vaW5jbHVkZS9vcGVuc3NsL2xoYXNoLmgKK3QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL29ial9tYWMuaCAuLi9pbmNsdWRlL29wZW5zc2wvb2JqZWN0cy5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3NsY29uZi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9vcGVuc3Nsdi5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9vc3NsX3R5cC5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wZW0uaAordDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvcGVtMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9wa2NzNy5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9wcXVldWUuaCAuLi9pbmNsdWRlL29wZW5zc2wvcmFuZC5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9yc2EuaCAuLi9pbmNsdWRlL29wZW5zc2wvc2FmZXN0YWNrLmgKK3QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3NoYS5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wuaAordDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wvc3NsMi5oIC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wyMy5oCit0MV9zcnZyLm86IC4uL2luY2x1ZGUvb3BlbnNzbC9zc2wzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3N0YWNrLmgKK3QxX3NydnIubzogLi4vaW5jbHVkZS9vcGVuc3NsL3N5bWhhY2tzLmggLi4vaW5jbHVkZS9vcGVuc3NsL3RsczEuaAordDFfc3J2ci5vOiAuLi9pbmNsdWRlL29wZW5zc2wveDUwOS5oIC4uL2luY2x1ZGUvb3BlbnNzbC94NTA5X3ZmeS5oIHNzbF9sb2NsLmgKK3QxX3NydnIubzogdDFfc3J2ci5jCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvYmlvX3NzbC5jIGIvbGliL29wZW5zc2wvc3NsL2Jpb19zc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjMxOWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL2Jpb19zc2wuYwpAQCAtMCwwICsxLDU5OSBAQAorLyogc3NsL2Jpb19zc2wuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisKK3N0YXRpYyBpbnQgc3NsX3dyaXRlKEJJTyAqaCwgY29uc3QgY2hhciAqYnVmLCBpbnQgbnVtKTsKK3N0YXRpYyBpbnQgc3NsX3JlYWQoQklPICpoLCBjaGFyICpidWYsIGludCBzaXplKTsKK3N0YXRpYyBpbnQgc3NsX3B1dHMoQklPICpoLCBjb25zdCBjaGFyICpzdHIpOworc3RhdGljIGxvbmcgc3NsX2N0cmwoQklPICpoLCBpbnQgY21kLCBsb25nIGFyZzEsIHZvaWQgKmFyZzIpOworc3RhdGljIGludCBzc2xfbmV3KEJJTyAqaCk7CitzdGF0aWMgaW50IHNzbF9mcmVlKEJJTyAqZGF0YSk7CitzdGF0aWMgbG9uZyBzc2xfY2FsbGJhY2tfY3RybChCSU8gKmgsIGludCBjbWQsIGJpb19pbmZvX2NiICpmcCk7Cit0eXBlZGVmIHN0cnVjdCBiaW9fc3NsX3N0CisJeworCVNTTCAqc3NsOyAvKiBUaGUgc3NsIGhhbmRsZSA6LSkgKi8KKwkvKiByZS1uZWdvdGlhdGUgZXZlcnkgdGltZSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGlzIHRoaXMgc2l6ZSAqLworCWludCBudW1fcmVuZWdvdGlhdGVzOworCXVuc2lnbmVkIGxvbmcgcmVuZWdvdGlhdGVfY291bnQ7CisJdW5zaWduZWQgbG9uZyBieXRlX2NvdW50OworCXVuc2lnbmVkIGxvbmcgcmVuZWdvdGlhdGVfdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdGltZTsKKwl9IEJJT19TU0w7CisKK3N0YXRpYyBCSU9fTUVUSE9EIG1ldGhvZHNfc3NscD0KKwl7CisJQklPX1RZUEVfU1NMLCJzc2wiLAorCXNzbF93cml0ZSwKKwlzc2xfcmVhZCwKKwlzc2xfcHV0cywKKwlOVUxMLCAvKiBzc2xfZ2V0cywgKi8KKwlzc2xfY3RybCwKKwlzc2xfbmV3LAorCXNzbF9mcmVlLAorCXNzbF9jYWxsYmFja19jdHJsLAorCX07CisKK0JJT19NRVRIT0QgKkJJT19mX3NzbCh2b2lkKQorCXsKKwlyZXR1cm4oJm1ldGhvZHNfc3NscCk7CisJfQorCitzdGF0aWMgaW50IHNzbF9uZXcoQklPICpiaSkKKwl7CisJQklPX1NTTCAqYnM7CisKKwlicz0oQklPX1NTTCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihCSU9fU1NMKSk7CisJaWYgKGJzID09IE5VTEwpCisJCXsKKwkJQklPZXJyKEJJT19GX1NTTF9ORVcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwltZW1zZXQoYnMsMCxzaXplb2YoQklPX1NTTCkpOworCWJpLT5pbml0PTA7CisJYmktPnB0cj0oY2hhciAqKWJzOworCWJpLT5mbGFncz0wOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgc3NsX2ZyZWUoQklPICphKQorCXsKKwlCSU9fU1NMICpiczsKKworCWlmIChhID09IE5VTEwpIHJldHVybigwKTsKKwlicz0oQklPX1NTTCAqKWEtPnB0cjsKKwlpZiAoYnMtPnNzbCAhPSBOVUxMKSBTU0xfc2h1dGRvd24oYnMtPnNzbCk7CisJaWYgKGEtPnNodXRkb3duKQorCQl7CisJCWlmIChhLT5pbml0ICYmIChicy0+c3NsICE9IE5VTEwpKQorCQkJU1NMX2ZyZWUoYnMtPnNzbCk7CisJCWEtPmluaXQ9MDsKKwkJYS0+ZmxhZ3M9MDsKKwkJfQorCWlmIChhLT5wdHIgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKGEtPnB0cik7CisJcmV0dXJuKDEpOworCX0KKwkKK3N0YXRpYyBpbnQgc3NsX3JlYWQoQklPICpiLCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgcmV0PTE7CisJQklPX1NTTCAqc2I7CisJU1NMICpzc2w7CisJaW50IHJldHJ5X3JlYXNvbj0wOworCWludCByPTA7CisKKwlpZiAob3V0ID09IE5VTEwpIHJldHVybigwKTsKKwlzYj0oQklPX1NTTCAqKWItPnB0cjsKKwlzc2w9c2ItPnNzbDsKKworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKworI2lmIDAKKwlpZiAoIVNTTF9pc19pbml0X2ZpbmlzaGVkKHNzbCkpCisJCXsKKy8qCQlyZXQ9U1NMX2RvX2hhbmRzaGFrZShzc2wpOyAqLworCQlpZiAocmV0ID4gMCkKKwkJCXsKKworCQkJb3V0ZmxhZ3M9KEJJT19GTEFHU19SRUFEfEJJT19GTEFHU19TSE9VTERfUkVUUlkpOworCQkJcmV0PSAtMTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisjZW5kaWYKKy8qCWlmIChyZXQgPiAwKSAqLworCXJldD1TU0xfcmVhZChzc2wsb3V0LG91dGwpOworCisJc3dpdGNoIChTU0xfZ2V0X2Vycm9yKHNzbCxyZXQpKQorCQl7CisJY2FzZSBTU0xfRVJST1JfTk9ORToKKwkJaWYgKHJldCA8PSAwKSBicmVhazsKKwkJaWYgKHNiLT5yZW5lZ290aWF0ZV9jb3VudCA+IDApCisJCQl7CisJCQlzYi0+Ynl0ZV9jb3VudCs9cmV0OworCQkJaWYgKHNiLT5ieXRlX2NvdW50ID4gc2ItPnJlbmVnb3RpYXRlX2NvdW50KQorCQkJCXsKKwkJCQlzYi0+Ynl0ZV9jb3VudD0wOworCQkJCXNiLT5udW1fcmVuZWdvdGlhdGVzKys7CisJCQkJU1NMX3JlbmVnb3RpYXRlKHNzbCk7CisJCQkJcj0xOworCQkJCX0KKwkJCX0KKwkJaWYgKChzYi0+cmVuZWdvdGlhdGVfdGltZW91dCA+IDApICYmICghcikpCisJCQl7CisJCQl1bnNpZ25lZCBsb25nIHRtOworCisJCQl0bT0odW5zaWduZWQgbG9uZyl0aW1lKE5VTEwpOworCQkJaWYgKHRtID4gc2ItPmxhc3RfdGltZStzYi0+cmVuZWdvdGlhdGVfdGltZW91dCkKKwkJCQl7CisJCQkJc2ItPmxhc3RfdGltZT10bTsKKwkJCQlzYi0+bnVtX3JlbmVnb3RpYXRlcysrOworCQkJCVNTTF9yZW5lZ290aWF0ZShzc2wpOworCQkJCX0KKwkJCX0KKworCQlicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisJCUJJT19zZXRfcmV0cnlfcmVhZChiKTsKKwkJYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkJQklPX3NldF9yZXRyeV93cml0ZShiKTsKKwkJYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDoKKwkJQklPX3NldF9yZXRyeV9zcGVjaWFsKGIpOworCQlyZXRyeV9yZWFzb249QklPX1JSX1NTTF9YNTA5X0xPT0tVUDsKKwkJYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9BQ0NFUFQ6CisJCUJJT19zZXRfcmV0cnlfc3BlY2lhbChiKTsKKwkJcmV0cnlfcmVhc29uPUJJT19SUl9BQ0NFUFQ7CisJCWJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1dBTlRfQ09OTkVDVDoKKwkJQklPX3NldF9yZXRyeV9zcGVjaWFsKGIpOworCQlyZXRyeV9yZWFzb249QklPX1JSX0NPTk5FQ1Q7CisJCWJyZWFrOworCWNhc2UgU1NMX0VSUk9SX1NZU0NBTEw6CisJY2FzZSBTU0xfRVJST1JfU1NMOgorCWNhc2UgU1NMX0VSUk9SX1pFUk9fUkVUVVJOOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCQl9CisKKwliLT5yZXRyeV9yZWFzb249cmV0cnlfcmVhc29uOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBzc2xfd3JpdGUoQklPICpiLCBjb25zdCBjaGFyICpvdXQsIGludCBvdXRsKQorCXsKKwlpbnQgcmV0LHI9MDsKKwlpbnQgcmV0cnlfcmVhc29uPTA7CisJU1NMICpzc2w7CisJQklPX1NTTCAqYnM7CisKKwlpZiAob3V0ID09IE5VTEwpIHJldHVybigwKTsKKwlicz0oQklPX1NTTCAqKWItPnB0cjsKKwlzc2w9YnMtPnNzbDsKKworCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKworLyoJcmV0PVNTTF9kb19oYW5kc2hha2Uoc3NsKTsKKwlpZiAocmV0ID4gMCkgKi8KKwlyZXQ9U1NMX3dyaXRlKHNzbCxvdXQsb3V0bCk7CisKKwlzd2l0Y2ggKFNTTF9nZXRfZXJyb3Ioc3NsLHJldCkpCisJCXsKKwljYXNlIFNTTF9FUlJPUl9OT05FOgorCQlpZiAocmV0IDw9IDApIGJyZWFrOworCQlpZiAoYnMtPnJlbmVnb3RpYXRlX2NvdW50ID4gMCkKKwkJCXsKKwkJCWJzLT5ieXRlX2NvdW50Kz1yZXQ7CisJCQlpZiAoYnMtPmJ5dGVfY291bnQgPiBicy0+cmVuZWdvdGlhdGVfY291bnQpCisJCQkJeworCQkJCWJzLT5ieXRlX2NvdW50PTA7CisJCQkJYnMtPm51bV9yZW5lZ290aWF0ZXMrKzsKKwkJCQlTU0xfcmVuZWdvdGlhdGUoc3NsKTsKKwkJCQlyPTE7CisJCQkJfQorCQkJfQorCQlpZiAoKGJzLT5yZW5lZ290aWF0ZV90aW1lb3V0ID4gMCkgJiYgKCFyKSkKKwkJCXsKKwkJCXVuc2lnbmVkIGxvbmcgdG07CisKKwkJCXRtPSh1bnNpZ25lZCBsb25nKXRpbWUoTlVMTCk7CisJCQlpZiAodG0gPiBicy0+bGFzdF90aW1lK2JzLT5yZW5lZ290aWF0ZV90aW1lb3V0KQorCQkJCXsKKwkJCQlicy0+bGFzdF90aW1lPXRtOworCQkJCWJzLT5udW1fcmVuZWdvdGlhdGVzKys7CisJCQkJU1NMX3JlbmVnb3RpYXRlKHNzbCk7CisJCQkJfQorCQkJfQorCQlicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorCQlCSU9fc2V0X3JldHJ5X3dyaXRlKGIpOworCQlicmVhazsKKwljYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisJCUJJT19zZXRfcmV0cnlfcmVhZChiKTsKKwkJYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUDoKKwkJQklPX3NldF9yZXRyeV9zcGVjaWFsKGIpOworCQlyZXRyeV9yZWFzb249QklPX1JSX1NTTF9YNTA5X0xPT0tVUDsKKwkJYnJlYWs7CisJY2FzZSBTU0xfRVJST1JfV0FOVF9DT05ORUNUOgorCQlCSU9fc2V0X3JldHJ5X3NwZWNpYWwoYik7CisJCXJldHJ5X3JlYXNvbj1CSU9fUlJfQ09OTkVDVDsKKwljYXNlIFNTTF9FUlJPUl9TWVNDQUxMOgorCWNhc2UgU1NMX0VSUk9SX1NTTDoKKwlkZWZhdWx0OgorCQlicmVhazsKKwkJfQorCisJYi0+cmV0cnlfcmVhc29uPXJldHJ5X3JlYXNvbjsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIHNzbF9jdHJsKEJJTyAqYiwgaW50IGNtZCwgbG9uZyBudW0sIHZvaWQgKnB0cikKKwl7CisJU1NMICoqc3NscCwqc3NsOworCUJJT19TU0wgKmJzOworCUJJTyAqZGJpbywqYmlvOworCWxvbmcgcmV0PTE7CisKKwlicz0oQklPX1NTTCAqKWItPnB0cjsKKwlzc2w9YnMtPnNzbDsKKwlpZiAoKHNzbCA9PSBOVUxMKSAgJiYgKGNtZCAhPSBCSU9fQ19TRVRfU1NMKSkKKwkJcmV0dXJuKDApOworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBCSU9fQ1RSTF9SRVNFVDoKKwkJU1NMX3NodXRkb3duKHNzbCk7CisKKwkJaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgPT0gc3NsLT5tZXRob2QtPnNzbF9jb25uZWN0KQorCQkJU1NMX3NldF9jb25uZWN0X3N0YXRlKHNzbCk7CisJCWVsc2UgaWYgKHNzbC0+aGFuZHNoYWtlX2Z1bmMgPT0gc3NsLT5tZXRob2QtPnNzbF9hY2NlcHQpCisJCQlTU0xfc2V0X2FjY2VwdF9zdGF0ZShzc2wpOworCisJCVNTTF9jbGVhcihzc2wpOworCisJCWlmIChiLT5uZXh0X2JpbyAhPSBOVUxMKQorCQkJcmV0PUJJT19jdHJsKGItPm5leHRfYmlvLGNtZCxudW0scHRyKTsKKwkJZWxzZSBpZiAoc3NsLT5yYmlvICE9IE5VTEwpCisJCQlyZXQ9QklPX2N0cmwoc3NsLT5yYmlvLGNtZCxudW0scHRyKTsKKwkJZWxzZQorCQkJcmV0PTE7CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfSU5GTzoKKwkJcmV0PTA7CisJCWJyZWFrOworCWNhc2UgQklPX0NfU1NMX01PREU6CisJCWlmIChudW0pIC8qIGNsaWVudCBtb2RlICovCisJCQlTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoc3NsKTsKKwkJZWxzZQorCQkJU1NMX3NldF9hY2NlcHRfc3RhdGUoc3NsKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ19TRVRfU1NMX1JFTkVHT1RJQVRFX1RJTUVPVVQ6CisJCXJldD1icy0+cmVuZWdvdGlhdGVfdGltZW91dDsKKwkJaWYgKG51bSA8IDYwKSBudW09NTsKKwkJYnMtPnJlbmVnb3RpYXRlX3RpbWVvdXQ9KHVuc2lnbmVkIGxvbmcpbnVtOworCQlicy0+bGFzdF90aW1lPSh1bnNpZ25lZCBsb25nKXRpbWUoTlVMTCk7CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX1NTTF9SRU5FR09USUFURV9CWVRFUzoKKwkJcmV0PWJzLT5yZW5lZ290aWF0ZV9jb3VudDsKKwkJaWYgKChsb25nKW51bSA+PTUxMikKKwkJCWJzLT5yZW5lZ290aWF0ZV9jb3VudD0odW5zaWduZWQgbG9uZyludW07CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX1NTTF9OVU1fUkVORUdPVElBVEVTOgorCQlyZXQ9YnMtPm51bV9yZW5lZ290aWF0ZXM7CisJCWJyZWFrOworCWNhc2UgQklPX0NfU0VUX1NTTDoKKwkJaWYgKHNzbCAhPSBOVUxMKQorCQkJc3NsX2ZyZWUoYik7CisJCWItPnNodXRkb3duPShpbnQpbnVtOworCQlzc2w9KFNTTCAqKXB0cjsKKwkJKChCSU9fU1NMICopYi0+cHRyKS0+c3NsPXNzbDsKKwkJYmlvPVNTTF9nZXRfcmJpbyhzc2wpOworCQlpZiAoYmlvICE9IE5VTEwpCisJCQl7CisJCQlpZiAoYi0+bmV4dF9iaW8gIT0gTlVMTCkKKwkJCQlCSU9fcHVzaChiaW8sYi0+bmV4dF9iaW8pOworCQkJYi0+bmV4dF9iaW89YmlvOworCQkJQ1JZUFRPX2FkZCgmYmlvLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfQklPKTsKKwkJCX0KKwkJYi0+aW5pdD0xOworCQlicmVhazsKKwljYXNlIEJJT19DX0dFVF9TU0w6CisJCWlmIChwdHIgIT0gTlVMTCkKKwkJCXsKKwkJCXNzbHA9KFNTTCAqKilwdHI7CisJCQkqc3NscD1zc2w7CisJCQl9CisJCWVsc2UKKwkJCXJldD0wOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0dFVF9DTE9TRToKKwkJcmV0PWItPnNodXRkb3duOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1NFVF9DTE9TRToKKwkJYi0+c2h1dGRvd249KGludCludW07CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfV1BFTkRJTkc6CisJCXJldD1CSU9fY3RybChzc2wtPndiaW8sY21kLG51bSxwdHIpOworCQlicmVhazsKKwljYXNlIEJJT19DVFJMX1BFTkRJTkc6CisJCXJldD1TU0xfcGVuZGluZyhzc2wpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQ9QklPX3BlbmRpbmcoc3NsLT5yYmlvKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9GTFVTSDoKKwkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGIpOworCQlyZXQ9QklPX2N0cmwoc3NsLT53YmlvLGNtZCxudW0scHRyKTsKKwkJQklPX2NvcHlfbmV4dF9yZXRyeShiKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9QVVNIOgorCQlpZiAoKGItPm5leHRfYmlvICE9IE5VTEwpICYmIChiLT5uZXh0X2JpbyAhPSBzc2wtPnJiaW8pKQorCQkJeworCQkJU1NMX3NldF9iaW8oc3NsLGItPm5leHRfYmlvLGItPm5leHRfYmlvKTsKKwkJCUNSWVBUT19hZGQoJmItPm5leHRfYmlvLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfQklPKTsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9QT1A6CisJCS8qIE9ubHkgZGV0YWNoIGlmIHdlIGFyZSB0aGUgQklPIGV4cGxpY2l0bHkgYmVpbmcgcG9wcGVkICovCisJCWlmIChiID09IHB0cikKKwkJCXsKKwkJCS8qIFNob3VsZG4ndCBoYXBwZW4gaW4gcHJhY3RpY2UgYmVjYXVzZSB0aGUKKwkJCSAqIHJiaW8gYW5kIHdiaW8gYXJlIHRoZSBzYW1lIHdoZW4gcHVzaGVkLgorCQkJICovCisJCQlpZiAoc3NsLT5yYmlvICE9IHNzbC0+d2JpbykKKwkJCQlCSU9fZnJlZV9hbGwoc3NsLT53YmlvKTsKKwkJCWlmIChiLT5uZXh0X2JpbyAhPSBOVUxMKQorCQkJCUNSWVBUT19hZGQoJmItPm5leHRfYmlvLT5yZWZlcmVuY2VzLC0xLENSWVBUT19MT0NLX0JJTyk7CisJCQlzc2wtPndiaW89TlVMTDsKKwkJCXNzbC0+cmJpbz1OVUxMOworCQkJfQorCQlicmVhazsKKwljYXNlIEJJT19DX0RPX1NUQVRFX01BQ0hJTkU6CisJCUJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKworCQliLT5yZXRyeV9yZWFzb249MDsKKwkJcmV0PShpbnQpU1NMX2RvX2hhbmRzaGFrZShzc2wpOworCisJCXN3aXRjaCAoU1NMX2dldF9lcnJvcihzc2wsKGludClyZXQpKQorCQkJeworCQljYXNlIFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisJCQlCSU9fc2V0X2ZsYWdzKGIsCisJCQkJQklPX0ZMQUdTX1JFQUR8QklPX0ZMQUdTX1NIT1VMRF9SRVRSWSk7CisJCQlicmVhazsKKwkJY2FzZSBTU0xfRVJST1JfV0FOVF9XUklURToKKwkJCUJJT19zZXRfZmxhZ3MoYiwKKwkJCQlCSU9fRkxBR1NfV1JJVEV8QklPX0ZMQUdTX1NIT1VMRF9SRVRSWSk7CisJCQlicmVhazsKKwkJY2FzZSBTU0xfRVJST1JfV0FOVF9DT05ORUNUOgorCQkJQklPX3NldF9mbGFncyhiLAorCQkJCUJJT19GTEFHU19JT19TUEVDSUFMfEJJT19GTEFHU19TSE9VTERfUkVUUlkpOworCQkJYi0+cmV0cnlfcmVhc29uPWItPm5leHRfYmlvLT5yZXRyeV9yZWFzb247CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQkJfQorCQlicmVhazsKKwljYXNlIEJJT19DVFJMX0RVUDoKKwkJZGJpbz0oQklPICopcHRyOworCQlpZiAoKChCSU9fU1NMICopZGJpby0+cHRyKS0+c3NsICE9IE5VTEwpCisJCQlTU0xfZnJlZSgoKEJJT19TU0wgKilkYmlvLT5wdHIpLT5zc2wpOworCQkoKEJJT19TU0wgKilkYmlvLT5wdHIpLT5zc2w9U1NMX2R1cChzc2wpOworCQkoKEJJT19TU0wgKilkYmlvLT5wdHIpLT5yZW5lZ290aWF0ZV9jb3VudD0KKwkJCSgoQklPX1NTTCAqKWItPnB0ciktPnJlbmVnb3RpYXRlX2NvdW50OworCQkoKEJJT19TU0wgKilkYmlvLT5wdHIpLT5ieXRlX2NvdW50PQorCQkJKChCSU9fU1NMICopYi0+cHRyKS0+Ynl0ZV9jb3VudDsKKwkJKChCSU9fU1NMICopZGJpby0+cHRyKS0+cmVuZWdvdGlhdGVfdGltZW91dD0KKwkJCSgoQklPX1NTTCAqKWItPnB0ciktPnJlbmVnb3RpYXRlX3RpbWVvdXQ7CisJCSgoQklPX1NTTCAqKWRiaW8tPnB0ciktPmxhc3RfdGltZT0KKwkJCSgoQklPX1NTTCAqKWItPnB0ciktPmxhc3RfdGltZTsKKwkJcmV0PSgoKEJJT19TU0wgKilkYmlvLT5wdHIpLT5zc2wgIT0gTlVMTCk7CisJCWJyZWFrOworCWNhc2UgQklPX0NfR0VUX0ZEOgorCQlyZXQ9QklPX2N0cmwoc3NsLT5yYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJY2FzZSBCSU9fQ1RSTF9TRVRfQ0FMTEJBQ0s6CisJCXsKKyNpZiAwIC8qIEZJWE1FOiBTaG91bGQgdGhpcyBiZSB1c2VkPyAgLS0gUmljaGFyZCBMZXZpdHRlICovCisJCVNTTGVycihTU0xfRl9TU0xfQ1RSTCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0ID0gLTE7CisjZWxzZQorCQlyZXQ9MDsKKyNlbmRpZgorCQl9CisJCWJyZWFrOworCWNhc2UgQklPX0NUUkxfR0VUX0NBTExCQUNLOgorCQl7CisJCXZvaWQgKCoqZnB0cikoY29uc3QgU1NMICp4c3NsLGludCB0eXBlLGludCB2YWwpOworCisJCWZwdHI9KHZvaWQgKCoqKShjb25zdCBTU0wgKnhzc2wsaW50IHR5cGUsaW50IHZhbCkpcHRyOworCQkqZnB0cj1TU0xfZ2V0X2luZm9fY2FsbGJhY2soc3NsKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2N0cmwoc3NsLT5yYmlvLGNtZCxudW0scHRyKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBsb25nIHNzbF9jYWxsYmFja19jdHJsKEJJTyAqYiwgaW50IGNtZCwgYmlvX2luZm9fY2IgKmZwKQorCXsKKwlTU0wgKnNzbDsKKwlCSU9fU1NMICpiczsKKwlsb25nIHJldD0xOworCisJYnM9KEJJT19TU0wgKiliLT5wdHI7CisJc3NsPWJzLT5zc2w7CisJc3dpdGNoIChjbWQpCisJCXsKKwljYXNlIEJJT19DVFJMX1NFVF9DQUxMQkFDSzoKKwkJeworCQkvKiBGSVhNRTogc2V0dGluZyB0aGlzIHZpYSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHByb3RvdHlwZQorCQkgICBzZWVtcyBsaWtlIGEgY3JhcCBpZGVhICovCisJCVNTTF9zZXRfaW5mb19jYWxsYmFjayhzc2wsKHZvaWQgKCopKGNvbnN0IFNTTCAqLGludCxpbnQpKWZwKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQ9QklPX2NhbGxiYWNrX2N0cmwoc3NsLT5yYmlvLGNtZCxmcCk7CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IHNzbF9wdXRzKEJJTyAqYnAsIGNvbnN0IGNoYXIgKnN0cikKKwl7CisJaW50IG4scmV0OworCisJbj1zdHJsZW4oc3RyKTsKKwlyZXQ9QklPX3dyaXRlKGJwLHN0cixuKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK0JJTyAqQklPX25ld19idWZmZXJfc3NsX2Nvbm5lY3QoU1NMX0NUWCAqY3R4KQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19TT0NLCisJQklPICpyZXQ9TlVMTCwqYnVmPU5VTEwsKnNzbD1OVUxMOworCisJaWYgKChidWY9QklPX25ldyhCSU9fZl9idWZmZXIoKSkpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKwlpZiAoKHNzbD1CSU9fbmV3X3NzbF9jb25uZWN0KGN0eCkpID09IE5VTEwpCisJCWdvdG8gZXJyOworCWlmICgocmV0PUJJT19wdXNoKGJ1Zixzc2wpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlyZXR1cm4ocmV0KTsKK2VycjoKKwlpZiAoYnVmICE9IE5VTEwpIEJJT19mcmVlKGJ1Zik7CisJaWYgKHNzbCAhPSBOVUxMKSBCSU9fZnJlZShzc2wpOworI2VuZGlmCisJcmV0dXJuKE5VTEwpOworCX0KKworQklPICpCSU9fbmV3X3NzbF9jb25uZWN0KFNTTF9DVFggKmN0eCkKKwl7CisJQklPICpyZXQ9TlVMTCwqY29uPU5VTEwsKnNzbD1OVUxMOworCisJaWYgKChjb249QklPX25ldyhCSU9fc19jb25uZWN0KCkpKSA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisJaWYgKChzc2w9QklPX25ld19zc2woY3R4LDEpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKwlpZiAoKHJldD1CSU9fcHVzaChzc2wsY29uKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisJcmV0dXJuKHJldCk7CitlcnI6CisJaWYgKGNvbiAhPSBOVUxMKSBCSU9fZnJlZShjb24pOworCXJldHVybihOVUxMKTsKKwl9CisKK0JJTyAqQklPX25ld19zc2woU1NMX0NUWCAqY3R4LCBpbnQgY2xpZW50KQorCXsKKwlCSU8gKnJldDsKKwlTU0wgKnNzbDsKKworCWlmICgocmV0PUJJT19uZXcoQklPX2Zfc3NsKCkpKSA9PSBOVUxMKQorCQlyZXR1cm4oTlVMTCk7CisJaWYgKChzc2w9U1NMX25ldyhjdHgpKSA9PSBOVUxMKQorCQl7CisJCUJJT19mcmVlKHJldCk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmIChjbGllbnQpCisJCVNTTF9zZXRfY29ubmVjdF9zdGF0ZShzc2wpOworCWVsc2UKKwkJU1NMX3NldF9hY2NlcHRfc3RhdGUoc3NsKTsKKwkJCisJQklPX3NldF9zc2wocmV0LHNzbCxCSU9fQ0xPU0UpOworCXJldHVybihyZXQpOworCX0KKworaW50IEJJT19zc2xfY29weV9zZXNzaW9uX2lkKEJJTyAqdCwgQklPICpmKQorCXsKKwl0PUJJT19maW5kX3R5cGUodCxCSU9fVFlQRV9TU0wpOworCWY9QklPX2ZpbmRfdHlwZShmLEJJT19UWVBFX1NTTCk7CisJaWYgKCh0ID09IE5VTEwpIHx8IChmID09IE5VTEwpKQorCQlyZXR1cm4oMCk7CisJaWYgKAkoKChCSU9fU1NMICopdC0+cHRyKS0+c3NsID09IE5VTEwpIHx8IAorCQkoKChCSU9fU1NMICopZi0+cHRyKS0+c3NsID09IE5VTEwpKQorCQlyZXR1cm4oMCk7CisJU1NMX2NvcHlfc2Vzc2lvbl9pZCgoKEJJT19TU0wgKil0LT5wdHIpLT5zc2wsKChCSU9fU1NMICopZi0+cHRyKS0+c3NsKTsKKwlyZXR1cm4oMSk7CisJfQorCit2b2lkIEJJT19zc2xfc2h1dGRvd24oQklPICpiKQorCXsKKwlTU0wgKnM7CisKKwl3aGlsZSAoYiAhPSBOVUxMKQorCQl7CisJCWlmIChiLT5tZXRob2QtPnR5cGUgPT0gQklPX1RZUEVfU1NMKQorCQkJeworCQkJcz0oKEJJT19TU0wgKiliLT5wdHIpLT5zc2w7CisJCQlTU0xfc2h1dGRvd24ocyk7CisJCQlicmVhazsKKwkJCX0KKwkJYj1iLT5uZXh0X2JpbzsKKwkJfQorCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9kMV9ib3RoLmMgYi9saWIvb3BlbnNzbC9zc2wvZDFfYm90aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTQwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvZDFfYm90aC5jCkBAIC0wLDAgKzEsMTQxOCBAQAorLyogc3NsL2QxX2JvdGguYyAqLworLyogCisgKiBEVExTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgTmFnZW5kcmEgTW9kYWR1Z3UKKyAqIChuYWdlbmRyYUBjcy5zdGFuZm9yZC5lZHUpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0IDIwMDUuICAKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCisjZGVmaW5lIFJTTUJMWV9CSVRNQVNLX1NJWkUobXNnX2xlbikgKCgobXNnX2xlbikgKyA3KSAvIDgpCisKKyNkZWZpbmUgUlNNQkxZX0JJVE1BU0tfTUFSSyhiaXRtYXNrLCBzdGFydCwgZW5kKSB7IFwKKwkJCWlmICgoZW5kKSAtIChzdGFydCkgPD0gOCkgeyBcCisJCQkJbG9uZyBpaTsgXAorCQkJCWZvciAoaWkgPSAoc3RhcnQpOyBpaSA8IChlbmQpOyBpaSsrKSBiaXRtYXNrWygoaWkpID4+IDMpXSB8PSAoMSA8PCAoKGlpKSAmIDcpKTsgXAorCQkJfSBlbHNlIHsgXAorCQkJCWxvbmcgaWk7IFwKKwkJCQliaXRtYXNrWygoc3RhcnQpID4+IDMpXSB8PSBiaXRtYXNrX3N0YXJ0X3ZhbHVlc1soKHN0YXJ0KSAmIDcpXTsgXAorCQkJCWZvciAoaWkgPSAoKChzdGFydCkgPj4gMykgKyAxKTsgaWkgPCAoKCgoZW5kKSAtIDEpKSA+PiAzKTsgaWkrKykgYml0bWFza1tpaV0gPSAweGZmOyBcCisJCQkJYml0bWFza1soKChlbmQpIC0gMSkgPj4gMyldIHw9IGJpdG1hc2tfZW5kX3ZhbHVlc1soKGVuZCkgJiA3KV07IFwKKwkJCX0gfQorCisjZGVmaW5lIFJTTUJMWV9CSVRNQVNLX0lTX0NPTVBMRVRFKGJpdG1hc2ssIG1zZ19sZW4sIGlzX2NvbXBsZXRlKSB7IFwKKwkJCWxvbmcgaWk7IFwKKwkJCU9QRU5TU0xfYXNzZXJ0KChtc2dfbGVuKSA+IDApOyBcCisJCQlpc19jb21wbGV0ZSA9IDE7IFwKKwkJCWlmIChiaXRtYXNrWygoKG1zZ19sZW4pIC0gMSkgPj4gMyldICE9IGJpdG1hc2tfZW5kX3ZhbHVlc1soKG1zZ19sZW4pICYgNyldKSBpc19jb21wbGV0ZSA9IDA7IFwKKwkJCWlmIChpc19jb21wbGV0ZSkgZm9yIChpaSA9ICgoKG1zZ19sZW4pIC0gMSkgPj4gMykgLSAxOyBpaSA+PSAwIDsgaWktLSkgXAorCQkJCWlmIChiaXRtYXNrW2lpXSAhPSAweGZmKSB7IGlzX2NvbXBsZXRlID0gMDsgYnJlYWs7IH0gfQorCisjaWYgMAorI2RlZmluZSBSU01CTFlfQklUTUFTS19QUklOVChiaXRtYXNrLCBtc2dfbGVuKSB7IFwKKwkJCWxvbmcgaWk7IFwKKwkJCXByaW50ZigiYml0bWFzazogIik7IGZvciAoaWkgPSAwOyBpaSA8IChtc2dfbGVuKTsgaWkrKykgXAorCQkJcHJpbnRmKCIlZCAiLCAoYml0bWFza1tpaSA+PiAzXSAmICgxIDw8IChpaSAmIDcpKSkgPj4gKGlpICYgNykpOyBcCisJCQlwcmludGYoIlxuIik7IH0KKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBiaXRtYXNrX3N0YXJ0X3ZhbHVlc1tdID0gezB4ZmYsIDB4ZmUsIDB4ZmMsIDB4ZjgsIDB4ZjAsIDB4ZTAsIDB4YzAsIDB4ODB9Oworc3RhdGljIHVuc2lnbmVkIGNoYXIgYml0bWFza19lbmRfdmFsdWVzW10gICA9IHsweDAwLCAweDAxLCAweDAzLCAweDA3LCAweDBmLCAweDFmLCAweDNmLCAweDdmfTsKKworLyogWERUTFM6ICBmaWd1cmUgb3V0IHRoZSByaWdodCB2YWx1ZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ19wcm9iYWJsZV9tdHVbXSA9IHsxNTAwIC0gMjgsIDUxMiAtIDI4LCAyNTYgLSAyOH07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHRsczFfbWluX210dSh2b2lkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHRsczFfZ3Vlc3NfbXR1KHVuc2lnbmVkIGludCBjdXJyX210dSk7CitzdGF0aWMgdm9pZCBkdGxzMV9maXhfbWVzc2FnZV9oZWFkZXIoU1NMICpzLCB1bnNpZ25lZCBsb25nIGZyYWdfb2ZmLCAKKwl1bnNpZ25lZCBsb25nIGZyYWdfbGVuKTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpkdGxzMV93cml0ZV9tZXNzYWdlX2hlYWRlcihTU0wgKnMsCisJdW5zaWduZWQgY2hhciAqcCk7CitzdGF0aWMgdm9pZCBkdGxzMV9zZXRfbWVzc2FnZV9oZWFkZXJfaW50KFNTTCAqcywgdW5zaWduZWQgY2hhciBtdCwKKwl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgc2hvcnQgc2VxX251bSwgdW5zaWduZWQgbG9uZyBmcmFnX29mZiwgCisJdW5zaWduZWQgbG9uZyBmcmFnX2xlbik7CitzdGF0aWMgbG9uZyBkdGxzMV9nZXRfbWVzc2FnZV9mcmFnbWVudChTU0wgKnMsIGludCBzdDEsIGludCBzdG4sIAorCWxvbmcgbWF4LCBpbnQgKm9rKTsKKworc3RhdGljIGhtX2ZyYWdtZW50ICoKK2R0bHMxX2htX2ZyYWdtZW50X25ldyh1bnNpZ25lZCBsb25nIGZyYWdfbGVuLCBpbnQgcmVhc3NlbWJseSkKKwl7CisJaG1fZnJhZ21lbnQgKmZyYWcgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqYml0bWFzayA9IE5VTEw7CisKKwlmcmFnID0gKGhtX2ZyYWdtZW50ICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKGhtX2ZyYWdtZW50KSk7CisJaWYgKCBmcmFnID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaWYgKGZyYWdfbGVuKQorCQl7CisJCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoZnJhZ19sZW4pOworCQlpZiAoIGJ1ZiA9PSBOVUxMKQorCQkJeworCQkJT1BFTlNTTF9mcmVlKGZyYWcpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCS8qIHplcm8gbGVuZ3RoIGZyYWdtZW50IGdldHMgemVybyBmcmFnLT5mcmFnbWVudCAqLworCWZyYWctPmZyYWdtZW50ID0gYnVmOworCisJLyogSW5pdGlhbGl6ZSByZWFzc2VtYmx5IGJpdG1hc2sgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHJlYXNzZW1ibHkpCisJCXsKKwkJYml0bWFzayA9ICh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MoUlNNQkxZX0JJVE1BU0tfU0laRShmcmFnX2xlbikpOworCQlpZiAoYml0bWFzayA9PSBOVUxMKQorCQkJeworCQkJaWYgKGJ1ZiAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoYnVmKTsKKwkJCU9QRU5TU0xfZnJlZShmcmFnKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQltZW1zZXQoYml0bWFzaywgMCwgUlNNQkxZX0JJVE1BU0tfU0laRShmcmFnX2xlbikpOworCQl9CisKKwlmcmFnLT5yZWFzc2VtYmx5ID0gYml0bWFzazsKKworCXJldHVybiBmcmFnOworCX0KKworc3RhdGljIHZvaWQKK2R0bHMxX2htX2ZyYWdtZW50X2ZyZWUoaG1fZnJhZ21lbnQgKmZyYWcpCisJeworCWlmIChmcmFnLT5mcmFnbWVudCkgT1BFTlNTTF9mcmVlKGZyYWctPmZyYWdtZW50KTsKKwlpZiAoZnJhZy0+cmVhc3NlbWJseSkgT1BFTlNTTF9mcmVlKGZyYWctPnJlYXNzZW1ibHkpOworCU9QRU5TU0xfZnJlZShmcmFnKTsKKwl9CisKKy8qIHNlbmQgcy0+aW5pdF9idWYgaW4gcmVjb3JkcyBvZiB0eXBlICd0eXBlJyAoU1NMM19SVF9IQU5EU0hBS0Ugb3IgU1NMM19SVF9DSEFOR0VfQ0lQSEVSX1NQRUMpICovCitpbnQgZHRsczFfZG9fd3JpdGUoU1NMICpzLCBpbnQgdHlwZSkKKwl7CisJaW50IHJldDsKKwlpbnQgY3Vycl9tdHU7CisJdW5zaWduZWQgaW50IGxlbiwgZnJhZ19vZmYsIG1hY19zaXplLCBibG9ja3NpemU7CisKKwkvKiBBSEEhICBGaWd1cmUgb3V0IHRoZSBNVFUsIGFuZCBzdGljayB0byB0aGUgcmlnaHQgc2l6ZSAqLworCWlmICggISAoU1NMX2dldF9vcHRpb25zKHMpICYgU1NMX09QX05PX1FVRVJZX01UVSkpCisJCXsKKwkJcy0+ZDEtPm10dSA9IAorCQkJQklPX2N0cmwoU1NMX2dldF93YmlvKHMpLCBCSU9fQ1RSTF9ER1JBTV9RVUVSWV9NVFUsIDAsIE5VTEwpOworCisJCS8qIEkndmUgc2VlbiB0aGUga2VybmVsIHJldHVybiBib2d1cyBudW1iZXJzIHdoZW4gaXQgZG9lc24ndCBrbm93CisJCSAqIChpbml0aWFsIHdyaXRlKSwgc28ganVzdCBtYWtlIHN1cmUgd2UgaGF2ZSBhIHJlYXNvbmFibGUgbnVtYmVyICovCisJCWlmICggcy0+ZDEtPm10dSA8IGR0bHMxX21pbl9tdHUoKSkKKwkJCXsKKwkJCXMtPmQxLT5tdHUgPSAwOworCQkJcy0+ZDEtPm10dSA9IGR0bHMxX2d1ZXNzX210dShzLT5kMS0+bXR1KTsKKwkJCUJJT19jdHJsKFNTTF9nZXRfd2JpbyhzKSwgQklPX0NUUkxfREdSQU1fU0VUX01UVSwgCisJCQkJcy0+ZDEtPm10dSwgTlVMTCk7CisJCQl9CisJCX0KKyNpZiAwIAorCW10dSA9IHMtPmQxLT5tdHU7CisKKwlmcHJpbnRmKHN0ZGVyciwgInVzaW5nIE1UVSA9ICVkXG4iLCBtdHUpOworCisJbXR1IC09IChEVExTMV9ITV9IRUFERVJfTEVOR1RIICsgRFRMUzFfUlRfSEVBREVSX0xFTkdUSCk7CisKKwljdXJyX210dSA9IG10dSAtIEJJT193cGVuZGluZyhTU0xfZ2V0X3diaW8ocykpOworCisJaWYgKCBjdXJyX210dSA+IDApCisJCW10dSA9IGN1cnJfbXR1OworCWVsc2UgaWYgKCAoIHJldCA9IEJJT19mbHVzaChTU0xfZ2V0X3diaW8ocykpKSA8PSAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCBCSU9fd3BlbmRpbmcoU1NMX2dldF93YmlvKHMpKSArIHMtPmluaXRfbnVtID49IG10dSkKKwkJeworCQlyZXQgPSBCSU9fZmx1c2goU1NMX2dldF93YmlvKHMpKTsKKwkJaWYgKCByZXQgPD0gMCkKKwkJCXJldHVybiByZXQ7CisJCW10dSA9IHMtPmQxLT5tdHUgLSAoRFRMUzFfSE1fSEVBREVSX0xFTkdUSCArIERUTFMxX1JUX0hFQURFUl9MRU5HVEgpOworCQl9CisKKwlPUEVOU1NMX2Fzc2VydChtdHUgPiAwKTsgIC8qIHNob3VsZCBoYXZlIHNvbWV0aGluZyByZWFzb25hYmxlIG5vdyAqLworCisjZW5kaWYKKworCWlmICggcy0+aW5pdF9vZmYgPT0gMCAgJiYgdHlwZSA9PSBTU0wzX1JUX0hBTkRTSEFLRSkKKwkJT1BFTlNTTF9hc3NlcnQocy0+aW5pdF9udW0gPT0gCisJCQkoaW50KXMtPmQxLT53X21zZ19oZHIubXNnX2xlbiArIERUTFMxX0hNX0hFQURFUl9MRU5HVEgpOworCisJaWYgKHMtPndyaXRlX2hhc2gpCisJCW1hY19zaXplID0gRVZQX01EX0NUWF9zaXplKHMtPndyaXRlX2hhc2gpOworCWVsc2UKKwkJbWFjX3NpemUgPSAwOworCisJaWYgKHMtPmVuY193cml0ZV9jdHggJiYgCisJCShFVlBfQ0lQSEVSX21vZGUoIHMtPmVuY193cml0ZV9jdHgtPmNpcGhlcikgJiBFVlBfQ0lQSF9DQkNfTU9ERSkpCisJCWJsb2Nrc2l6ZSA9IDIgKiBFVlBfQ0lQSEVSX2Jsb2NrX3NpemUocy0+ZW5jX3dyaXRlX2N0eC0+Y2lwaGVyKTsKKwllbHNlCisJCWJsb2Nrc2l6ZSA9IDA7CisKKwlmcmFnX29mZiA9IDA7CisJd2hpbGUoIHMtPmluaXRfbnVtKQorCQl7CisJCWN1cnJfbXR1ID0gcy0+ZDEtPm10dSAtIEJJT193cGVuZGluZyhTU0xfZ2V0X3diaW8ocykpIC0gCisJCQlEVExTMV9SVF9IRUFERVJfTEVOR1RIIC0gbWFjX3NpemUgLSBibG9ja3NpemU7CisKKwkJaWYgKCBjdXJyX210dSA8PSBEVExTMV9ITV9IRUFERVJfTEVOR1RIKQorCQkJeworCQkJLyogZ3JyLi4gd2UgY291bGQgZ2V0IGFuIGVycm9yIGlmIE1UVSBwaWNrZWQgd2FzIHdyb25nICovCisJCQlyZXQgPSBCSU9fZmx1c2goU1NMX2dldF93YmlvKHMpKTsKKwkJCWlmICggcmV0IDw9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCWN1cnJfbXR1ID0gcy0+ZDEtPm10dSAtIERUTFMxX1JUX0hFQURFUl9MRU5HVEggLQorCQkJCW1hY19zaXplIC0gYmxvY2tzaXplOworCQkJfQorCisJCWlmICggcy0+aW5pdF9udW0gPiBjdXJyX210dSkKKwkJCWxlbiA9IGN1cnJfbXR1OworCQllbHNlCisJCQlsZW4gPSBzLT5pbml0X251bTsKKworCisJCS8qIFhEVExTOiB0aGlzIGZ1bmN0aW9uIGlzIHRvbyBsb25nLiAgc3BsaXQgb3V0IHRoZSBDQ1MgcGFydCAqLworCQlpZiAoIHR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UpCisJCQl7CisJCQlpZiAoIHMtPmluaXRfb2ZmICE9IDApCisJCQkJeworCQkJCU9QRU5TU0xfYXNzZXJ0KHMtPmluaXRfb2ZmID4gRFRMUzFfSE1fSEVBREVSX0xFTkdUSCk7CisJCQkJcy0+aW5pdF9vZmYgLT0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSDsKKwkJCQlzLT5pbml0X251bSArPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCisJCQkJLyogd3JpdGUgYXRsZWFzdCBEVExTMV9ITV9IRUFERVJfTEVOR1RIIGJ5dGVzICovCisJCQkJaWYgKCBsZW4gPD0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSCkgIAorCQkJCQlsZW4gKz0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSDsKKwkJCQl9CisKKwkJCWR0bHMxX2ZpeF9tZXNzYWdlX2hlYWRlcihzLCBmcmFnX29mZiwgCisJCQkJbGVuIC0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSCk7CisKKwkJCWR0bHMxX3dyaXRlX21lc3NhZ2VfaGVhZGVyKHMsICh1bnNpZ25lZCBjaGFyICopJnMtPmluaXRfYnVmLT5kYXRhW3MtPmluaXRfb2ZmXSk7CisKKwkJCU9QRU5TU0xfYXNzZXJ0KGxlbiA+PSBEVExTMV9ITV9IRUFERVJfTEVOR1RIKTsKKwkJCX0KKworCQlyZXQ9ZHRsczFfd3JpdGVfYnl0ZXMocyx0eXBlLCZzLT5pbml0X2J1Zi0+ZGF0YVtzLT5pbml0X29mZl0sCisJCQlsZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCXsKKwkJCS8qIG1pZ2h0IG5lZWQgdG8gdXBkYXRlIE1UVSBoZXJlLCBidXQgd2UgZG9uJ3Qga25vdworCQkJICogd2hpY2ggcHJldmlvdXMgcGFja2V0IGNhdXNlZCB0aGUgZmFpbHVyZSAtLSBzbyBjYW4ndAorCQkJICogcmVhbGx5IHJldHJhbnNtaXQgYW55dGhpbmcuICBjb250aW51ZSBhcyBpZiBldmVyeXRoaW5nCisJCQkgKiBpcyBmaW5lIGFuZCB3YWl0IGZvciBhbiBhbGVydCB0byBoYW5kbGUgdGhlCisJCQkgKiByZXRyYW5zbWl0IAorCQkJICovCisJCQlpZiAoIEJJT19jdHJsKFNTTF9nZXRfd2JpbyhzKSwKKwkJCQlCSU9fQ1RSTF9ER1JBTV9NVFVfRVhDRUVERUQsIDAsIE5VTEwpID4gMCApCisJCQkJcy0+ZDEtPm10dSA9IEJJT19jdHJsKFNTTF9nZXRfd2JpbyhzKSwKKwkJCQkJQklPX0NUUkxfREdSQU1fUVVFUllfTVRVLCAwLCBOVUxMKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4oLTEpOworCQkJfQorCQllbHNlCisJCQl7CisKKwkJCS8qIGJhZCBpZiB0aGlzIGFzc2VydCBmYWlscywgb25seSBwYXJ0IG9mIHRoZSBoYW5kc2hha2UKKwkJCSAqIG1lc3NhZ2UgZ290IHNlbnQuICBidXQgd2h5IHdvdWxkIHRoaXMgaGFwcGVuPyAqLworCQkJT1BFTlNTTF9hc3NlcnQobGVuID09ICh1bnNpZ25lZCBpbnQpcmV0KTsKKworCQkJaWYgKHR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UgJiYgISBzLT5kMS0+cmV0cmFuc21pdHRpbmcpCisJCQkJeworCQkJCS8qIHNob3VsZCBub3QgYmUgZG9uZSBmb3IgJ0hlbGxvIFJlcXVlc3QncywgYnV0IGluIHRoYXQgY2FzZQorCQkJCSAqIHdlJ2xsIGlnbm9yZSB0aGUgcmVzdWx0IGFueXdheSAqLworCQkJCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSZzLT5pbml0X2J1Zi0+ZGF0YVtzLT5pbml0X29mZl07CisJCQkJY29uc3Qgc3RydWN0IGhtX2hlYWRlcl9zdCAqbXNnX2hkciA9ICZzLT5kMS0+d19tc2dfaGRyOworCQkJCWludCB4bGVuOworCisJCQkJaWYgKGZyYWdfb2ZmID09IDAgJiYgcy0+dmVyc2lvbiAhPSBEVExTMV9CQURfVkVSKQorCQkJCQl7CisJCQkJCS8qIHJlY29uc3RydWN0IG1lc3NhZ2UgaGVhZGVyIGlzIGlmIGl0CisJCQkJCSAqIGlzIGJlaW5nIHNlbnQgaW4gc2luZ2xlIGZyYWdtZW50ICovCisJCQkJCSpwKysgPSBtc2dfaGRyLT50eXBlOworCQkJCQlsMm4zKG1zZ19oZHItPm1zZ19sZW4scCk7CisJCQkJCXMybiAobXNnX2hkci0+c2VxLHApOworCQkJCQlsMm4zKDAscCk7CisJCQkJCWwybjMobXNnX2hkci0+bXNnX2xlbixwKTsKKwkJCQkJcCAgLT0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSDsKKwkJCQkJeGxlbiA9IHJldDsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlwICArPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCQkJCQl4bGVuID0gcmV0IC0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSDsKKwkJCQkJfQorCisJCQkJc3NsM19maW5pc2hfbWFjKHMsIHAsIHhsZW4pOworCQkJCX0KKworCQkJaWYgKHJldCA9PSBzLT5pbml0X251bSkKKwkJCQl7CisJCQkJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJCQkJcy0+bXNnX2NhbGxiYWNrKDEsIHMtPnZlcnNpb24sIHR5cGUsIHMtPmluaXRfYnVmLT5kYXRhLCAKKwkJCQkJCShzaXplX3QpKHMtPmluaXRfb2ZmICsgcy0+aW5pdF9udW0pLCBzLCAKKwkJCQkJCXMtPm1zZ19jYWxsYmFja19hcmcpOworCisJCQkJcy0+aW5pdF9vZmYgPSAwOyAgLyogZG9uZSB3cml0aW5nIHRoaXMgbWVzc2FnZSAqLworCQkJCXMtPmluaXRfbnVtID0gMDsKKworCQkJCXJldHVybigxKTsKKwkJCQl9CisJCQlzLT5pbml0X29mZis9cmV0OworCQkJcy0+aW5pdF9udW0tPXJldDsKKwkJCWZyYWdfb2ZmICs9IChyZXQgLT0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSCk7CisJCQl9CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCisKKy8qIE9idGFpbiBoYW5kc2hha2UgbWVzc2FnZSBvZiBtZXNzYWdlIHR5cGUgJ210JyAoYW55IGlmIG10ID09IC0xKSwKKyAqIG1heGltdW0gYWNjZXB0YWJsZSBib2R5IGxlbmd0aCAnbWF4Jy4KKyAqIFJlYWQgYW4gZW50aXJlIGhhbmRzaGFrZSBtZXNzYWdlLiAgSGFuZHNoYWtlIG1lc3NhZ2VzIGFycml2ZSBpbgorICogZnJhZ21lbnRzLgorICovCitsb25nIGR0bHMxX2dldF9tZXNzYWdlKFNTTCAqcywgaW50IHN0MSwgaW50IHN0biwgaW50IG10LCBsb25nIG1heCwgaW50ICpvaykKKwl7CisJaW50IGksIGFsOworCXN0cnVjdCBobV9oZWFkZXJfc3QgKm1zZ19oZHI7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBsb25nIG1zZ19sZW47CisKKwkvKiBzMy0+dG1wIGlzIHVzZWQgdG8gc3RvcmUgbWVzc2FnZXMgdGhhdCBhcmUgdW5leHBlY3RlZCwgY2F1c2VkCisJICogYnkgdGhlIGFic2VuY2Ugb2YgYW4gb3B0aW9uYWwgaGFuZHNoYWtlIG1lc3NhZ2UgKi8KKwlpZiAocy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlKQorCQl7CisJCXMtPnMzLT50bXAucmV1c2VfbWVzc2FnZT0wOworCQlpZiAoKG10ID49IDApICYmIChzLT5zMy0+dG1wLm1lc3NhZ2VfdHlwZSAhPSBtdCkpCisJCQl7CisJCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX0dFVF9NRVNTQUdFLFNTTF9SX1VORVhQRUNURURfTUVTU0FHRSk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQkqb2s9MTsKKwkJcy0+aW5pdF9tc2cgPSBzLT5pbml0X2J1Zi0+ZGF0YSArIERUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisJCXMtPmluaXRfbnVtID0gKGludClzLT5zMy0+dG1wLm1lc3NhZ2Vfc2l6ZTsKKwkJcmV0dXJuIHMtPmluaXRfbnVtOworCQl9CisKKwltc2dfaGRyID0gJnMtPmQxLT5yX21zZ19oZHI7CisJbWVtc2V0KG1zZ19oZHIsIDB4MDAsIHNpemVvZihzdHJ1Y3QgaG1faGVhZGVyX3N0KSk7CisKK2FnYWluOgorCWkgPSBkdGxzMV9nZXRfbWVzc2FnZV9mcmFnbWVudChzLCBzdDEsIHN0biwgbWF4LCBvayk7CisJaWYgKCBpID09IERUTFMxX0hNX0JBRF9GUkFHTUVOVCB8fAorCQlpID09IERUTFMxX0hNX0ZSQUdNRU5UX1JFVFJZKSAgLyogYmFkIGZyYWdtZW50IHJlY2VpdmVkICovCisJCWdvdG8gYWdhaW47CisJZWxzZSBpZiAoIGkgPD0gMCAmJiAhKm9rKQorCQlyZXR1cm4gaTsKKworCXAgPSAodW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCW1zZ19sZW4gPSBtc2dfaGRyLT5tc2dfbGVuOworCisJLyogcmVjb25zdHJ1Y3QgbWVzc2FnZSBoZWFkZXIgKi8KKwkqKHArKykgPSBtc2dfaGRyLT50eXBlOworCWwybjMobXNnX2xlbixwKTsKKwlzMm4gKG1zZ19oZHItPnNlcSxwKTsKKwlsMm4zKDAscCk7CisJbDJuMyhtc2dfbGVuLHApOworCWlmIChzLT52ZXJzaW9uICE9IERUTFMxX0JBRF9WRVIpIHsKKwkJcCAgICAgICAtPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCQltc2dfbGVuICs9IERUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisJfQorCisJc3NsM19maW5pc2hfbWFjKHMsIHAsIG1zZ19sZW4pOworCWlmIChzLT5tc2dfY2FsbGJhY2spCisJCXMtPm1zZ19jYWxsYmFjaygwLCBzLT52ZXJzaW9uLCBTU0wzX1JUX0hBTkRTSEFLRSwKKwkJCXAsIG1zZ19sZW4sCisJCQlzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsKKworCW1lbXNldChtc2dfaGRyLCAweDAwLCBzaXplb2Yoc3RydWN0IGhtX2hlYWRlcl9zdCkpOworCisJcy0+ZDEtPmhhbmRzaGFrZV9yZWFkX3NlcSsrOworCS8qIHdlIGp1c3QgcmVhZCBhIGhhbmRzaGFrZSBtZXNzYWdlIGZyb20gdGhlIG90aGVyIHNpZGU6CisJICogdGhpcyBtZWFucyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmV0cmFuc21pdCBvZiB0aGUKKwkgKiBidWZmZXJlZCBtZXNzYWdlcy4gIAorCSAqIFhEVExTOiBtYXkgYmUgYWJsZSBjbGVhciBvdXQgdGhpcworCSAqIGJ1ZmZlciBhIGxpdHRsZSBzb29uZXIgKGkuZSBpZiBhbiBvdXQtb2Ytb3JkZXIKKwkgKiBoYW5kc2hha2UgbWVzc2FnZS9yZWNvcmQgaXMgcmVjZWl2ZWQgYXQgdGhlIHJlY29yZAorCSAqIGxheWVyLiAgCisJICogWERUTFM6IGV4Y2VwdGlvbiBpcyB0aGF0IHRoZSBzZXJ2ZXIgbmVlZHMgdG8KKwkgKiBrbm93IHRoYXQgY2hhbmdlIGNpcGhlciBzcGVjIGFuZCBmaW5pc2hlZCBtZXNzYWdlcworCSAqIGhhdmUgYmVlbiByZWNlaXZlZCBieSB0aGUgY2xpZW50IGJlZm9yZSBjbGVhcmluZyB0aGlzCisJICogYnVmZmVyLiAgdGhpcyBjYW4gc2ltcGx5IGJlIGRvbmUgYnkgd2FpdGluZyBmb3IgdGhlCisJICogZmlyc3QgZGF0YSAgc2VnbWVudCwgYnV0IGlzIHRoZXJlIGEgYmV0dGVyIHdheT8gICovCisJZHRsczFfY2xlYXJfcmVjb3JkX2J1ZmZlcihzKTsKKworCXMtPmluaXRfbXNnID0gcy0+aW5pdF9idWYtPmRhdGEgKyBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCXJldHVybiBzLT5pbml0X251bTsKKworZl9lcnI6CisJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxhbCk7CisJKm9rID0gMDsKKwlyZXR1cm4gLTE7CisJfQorCisKK3N0YXRpYyBpbnQgZHRsczFfcHJlcHJvY2Vzc19mcmFnbWVudChTU0wgKnMsc3RydWN0IGhtX2hlYWRlcl9zdCAqbXNnX2hkcixpbnQgbWF4KQorCXsKKwlzaXplX3QgZnJhZ19vZmYsZnJhZ19sZW4sbXNnX2xlbjsKKworCW1zZ19sZW4gID0gbXNnX2hkci0+bXNnX2xlbjsKKwlmcmFnX29mZiA9IG1zZ19oZHItPmZyYWdfb2ZmOworCWZyYWdfbGVuID0gbXNnX2hkci0+ZnJhZ19sZW47CisKKwkvKiBzYW5pdHkgY2hlY2tpbmcgKi8KKwlpZiAoIChmcmFnX29mZitmcmFnX2xlbikgPiBtc2dfbGVuKQorCQl7CisJCVNTTGVycihTU0xfRl9EVExTMV9QUkVQUk9DRVNTX0ZSQUdNRU5ULFNTTF9SX0VYQ0VTU0lWRV9NRVNTQUdFX1NJWkUpOworCQlyZXR1cm4gU1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworCQl9CisKKwlpZiAoIChmcmFnX29mZitmcmFnX2xlbikgPiAodW5zaWduZWQgbG9uZyltYXgpCisJCXsKKwkJU1NMZXJyKFNTTF9GX0RUTFMxX1BSRVBST0NFU1NfRlJBR01FTlQsU1NMX1JfRVhDRVNTSVZFX01FU1NBR0VfU0laRSk7CisJCXJldHVybiBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCX0KKworCWlmICggcy0+ZDEtPnJfbXNnX2hkci5mcmFnX29mZiA9PSAwKSAvKiBmaXJzdCBmcmFnbWVudCAqLworCQl7CisJCS8qIG1zZ19sZW4gaXMgbGltaXRlZCB0byAyXjI0LCBidXQgaXMgZWZmZWN0aXZlbHkgY2hlY2tlZAorCQkgKiBhZ2FpbnN0IG1heCBhYm92ZSAqLworCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihzLT5pbml0X2J1Zixtc2dfbGVuK0RUTFMxX0hNX0hFQURFUl9MRU5HVEgpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1BSRVBST0NFU1NfRlJBR01FTlQsRVJSX1JfQlVGX0xJQik7CisJCQlyZXR1cm4gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworCQkJfQorCisJCXMtPnMzLT50bXAubWVzc2FnZV9zaXplICA9IG1zZ19sZW47CisJCXMtPmQxLT5yX21zZ19oZHIubXNnX2xlbiA9IG1zZ19sZW47CisJCXMtPnMzLT50bXAubWVzc2FnZV90eXBlICA9IG1zZ19oZHItPnR5cGU7CisJCXMtPmQxLT5yX21zZ19oZHIudHlwZSAgICA9IG1zZ19oZHItPnR5cGU7CisJCXMtPmQxLT5yX21zZ19oZHIuc2VxICAgICA9IG1zZ19oZHItPnNlcTsKKwkJfQorCWVsc2UgaWYgKG1zZ19sZW4gIT0gcy0+ZDEtPnJfbXNnX2hkci5tc2dfbGVuKQorCQl7CisJCS8qIFRoZXkgbXVzdCBiZSBwbGF5aW5nIHdpdGggdXMhIEJUVywgZmFpbHVyZSB0byBlbmZvcmNlCisJCSAqIHVwcGVyIGxpbWl0IHdvdWxkIG9wZW4gcG9zc2liaWxpdHkgZm9yIGJ1ZmZlciBvdmVycnVuLiAqLworCQlTU0xlcnIoU1NMX0ZfRFRMUzFfUFJFUFJPQ0VTU19GUkFHTUVOVCxTU0xfUl9FWENFU1NJVkVfTUVTU0FHRV9TSVpFKTsKKwkJcmV0dXJuIFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKwkJfQorCisJcmV0dXJuIDA7IC8qIG5vIGVycm9yICovCisJfQorCisKK3N0YXRpYyBpbnQKK2R0bHMxX3JldHJpZXZlX2J1ZmZlcmVkX2ZyYWdtZW50KFNTTCAqcywgbG9uZyBtYXgsIGludCAqb2spCisJeworCS8qICgwKSBjaGVjayB3aGV0aGVyIHRoZSBkZXNpcmVkIGZyYWdtZW50IGlzIGF2YWlsYWJsZQorCSAqIGlmIHNvOgorCSAqICgxKSBjb3B5IG92ZXIgdGhlIGZyYWdtZW50IHRvIHMtPmluaXRfYnVmLT5kYXRhW10KKwkgKiAoMikgdXBkYXRlIHMtPmluaXRfbnVtCisJICovCisJcGl0ZW0gKml0ZW07CisJaG1fZnJhZ21lbnQgKmZyYWc7CisJaW50IGFsOworCisJKm9rID0gMDsKKwlpdGVtID0gcHF1ZXVlX3BlZWsocy0+ZDEtPmJ1ZmZlcmVkX21lc3NhZ2VzKTsKKwlpZiAoIGl0ZW0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmcmFnID0gKGhtX2ZyYWdtZW50ICopaXRlbS0+ZGF0YTsKKwkKKwkvKiBEb24ndCByZXR1cm4gaWYgcmVhc3NlbWJseSBzdGlsbCBpbiBwcm9ncmVzcyAqLworCWlmIChmcmFnLT5yZWFzc2VtYmx5ICE9IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKCBzLT5kMS0+aGFuZHNoYWtlX3JlYWRfc2VxID09IGZyYWctPm1zZ19oZWFkZXIuc2VxKQorCQl7CisJCXVuc2lnbmVkIGxvbmcgZnJhZ19sZW4gPSBmcmFnLT5tc2dfaGVhZGVyLmZyYWdfbGVuOworCQlwcXVldWVfcG9wKHMtPmQxLT5idWZmZXJlZF9tZXNzYWdlcyk7CisKKwkJYWw9ZHRsczFfcHJlcHJvY2Vzc19mcmFnbWVudChzLCZmcmFnLT5tc2dfaGVhZGVyLG1heCk7CisKKwkJaWYgKGFsPT0wKSAvKiBubyBhbGVydCAqLworCQkJeworCQkJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGErRFRMUzFfSE1fSEVBREVSX0xFTkdUSDsKKwkJCW1lbWNweSgmcFtmcmFnLT5tc2dfaGVhZGVyLmZyYWdfb2ZmXSwKKwkJCQlmcmFnLT5mcmFnbWVudCxmcmFnLT5tc2dfaGVhZGVyLmZyYWdfbGVuKTsKKwkJCX0KKworCQlkdGxzMV9obV9mcmFnbWVudF9mcmVlKGZyYWcpOworCQlwaXRlbV9mcmVlKGl0ZW0pOworCisJCWlmIChhbD09MCkKKwkJCXsKKwkJCSpvayA9IDE7CisJCQlyZXR1cm4gZnJhZ19sZW47CisJCQl9CisKKwkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxhbCk7CisJCXMtPmluaXRfbnVtID0gMDsKKwkJKm9rID0gMDsKKwkJcmV0dXJuIC0xOworCQl9CisJZWxzZQorCQlyZXR1cm4gMDsKKwl9CisKKworc3RhdGljIGludAorZHRsczFfcmVhc3NlbWJsZV9mcmFnbWVudChTU0wgKnMsIHN0cnVjdCBobV9oZWFkZXJfc3QqIG1zZ19oZHIsIGludCAqb2spCisJeworCWhtX2ZyYWdtZW50ICpmcmFnID0gTlVMTDsKKwlwaXRlbSAqaXRlbSA9IE5VTEw7CisJaW50IGkgPSAtMSwgaXNfY29tcGxldGU7CisJdW5zaWduZWQgY2hhciBzZXE2NGJlWzhdOworCXVuc2lnbmVkIGxvbmcgZnJhZ19sZW4gPSBtc2dfaGRyLT5mcmFnX2xlbiwgbWF4X2xlbjsKKworCWlmICgobXNnX2hkci0+ZnJhZ19vZmYrZnJhZ19sZW4pID4gbXNnX2hkci0+bXNnX2xlbikKKwkJZ290byBlcnI7CisKKwkvKiBEZXRlcm1pbmUgbWF4aW11bSBhbGxvd2VkIG1lc3NhZ2Ugc2l6ZS4gRGVwZW5kcyBvbiAodXNlciBzZXQpCisJICogbWF4aW11bSBjZXJ0aWZpY2F0ZSBsZW5ndGgsIGJ1dCAxNmsgaXMgbWluaW11bS4KKwkgKi8KKwlpZiAoRFRMUzFfSE1fSEVBREVSX0xFTkdUSCArIFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9MRU5HVEggPCBzLT5tYXhfY2VydF9saXN0KQorCQltYXhfbGVuID0gcy0+bWF4X2NlcnRfbGlzdDsKKwllbHNlCisJCW1heF9sZW4gPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIICsgU1NMM19SVF9NQVhfRU5DUllQVEVEX0xFTkdUSDsKKworCWlmICgobXNnX2hkci0+ZnJhZ19vZmYrZnJhZ19sZW4pID4gbWF4X2xlbikKKwkJZ290byBlcnI7CisKKwkvKiBUcnkgdG8gZmluZCBpdGVtIGluIHF1ZXVlICovCisJbWVtc2V0KHNlcTY0YmUsMCxzaXplb2Yoc2VxNjRiZSkpOworCXNlcTY0YmVbNl0gPSAodW5zaWduZWQgY2hhcikgKG1zZ19oZHItPnNlcT4+OCk7CisJc2VxNjRiZVs3XSA9ICh1bnNpZ25lZCBjaGFyKSBtc2dfaGRyLT5zZXE7CisJaXRlbSA9IHBxdWV1ZV9maW5kKHMtPmQxLT5idWZmZXJlZF9tZXNzYWdlcywgc2VxNjRiZSk7CisKKwlpZiAoaXRlbSA9PSBOVUxMKQorCQl7CisJCWZyYWcgPSBkdGxzMV9obV9mcmFnbWVudF9uZXcobXNnX2hkci0+bXNnX2xlbiwgMSk7CisJCWlmICggZnJhZyA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCW1lbWNweSgmKGZyYWctPm1zZ19oZWFkZXIpLCBtc2dfaGRyLCBzaXplb2YoKm1zZ19oZHIpKTsKKwkJZnJhZy0+bXNnX2hlYWRlci5mcmFnX2xlbiA9IGZyYWctPm1zZ19oZWFkZXIubXNnX2xlbjsKKwkJZnJhZy0+bXNnX2hlYWRlci5mcmFnX29mZiA9IDA7CisJCX0KKwllbHNlCisJCWZyYWcgPSAoaG1fZnJhZ21lbnQqKSBpdGVtLT5kYXRhOworCisJLyogSWYgbWVzc2FnZSBpcyBhbHJlYWR5IHJlYXNzZW1ibGVkLCB0aGlzIG11c3QgYmUgYQorCSAqIHJldHJhbnNtaXQgYW5kIGNhbiBiZSBkcm9wcGVkLgorCSAqLworCWlmIChmcmFnLT5yZWFzc2VtYmx5ID09IE5VTEwpCisJCXsKKwkJdW5zaWduZWQgY2hhciBkZXZudWxsIFsyNTZdOworCisJCXdoaWxlIChmcmFnX2xlbikKKwkJCXsKKwkJCWkgPSBzLT5tZXRob2QtPnNzbF9yZWFkX2J5dGVzKHMsU1NMM19SVF9IQU5EU0hBS0UsCisJCQkJZGV2bnVsbCwKKwkJCQlmcmFnX2xlbj5zaXplb2YoZGV2bnVsbCk/c2l6ZW9mKGRldm51bGwpOmZyYWdfbGVuLDApOworCQkJaWYgKGk8PTApIGdvdG8gZXJyOworCQkJZnJhZ19sZW4gLT0gaTsKKwkJCX0KKwkJcmV0dXJuIERUTFMxX0hNX0ZSQUdNRU5UX1JFVFJZOworCQl9CisKKwkvKiByZWFkIHRoZSBib2R5IG9mIHRoZSBmcmFnbWVudCAoaGVhZGVyIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCAqLworCWkgPSBzLT5tZXRob2QtPnNzbF9yZWFkX2J5dGVzKHMsU1NMM19SVF9IQU5EU0hBS0UsCisJCWZyYWctPmZyYWdtZW50ICsgbXNnX2hkci0+ZnJhZ19vZmYsZnJhZ19sZW4sMCk7CisJaWYgKGk8PTAgfHwgKHVuc2lnbmVkIGxvbmcpaSE9ZnJhZ19sZW4pCisJCWdvdG8gZXJyOworCisJUlNNQkxZX0JJVE1BU0tfTUFSSyhmcmFnLT5yZWFzc2VtYmx5LCAobG9uZyltc2dfaGRyLT5mcmFnX29mZiwKKwkgICAgICAgICAgICAgICAgICAgIChsb25nKShtc2dfaGRyLT5mcmFnX29mZiArIGZyYWdfbGVuKSk7CisKKwlSU01CTFlfQklUTUFTS19JU19DT01QTEVURShmcmFnLT5yZWFzc2VtYmx5LCAobG9uZyltc2dfaGRyLT5tc2dfbGVuLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2NvbXBsZXRlKTsKKworCWlmIChpc19jb21wbGV0ZSkKKwkJeworCQlPUEVOU1NMX2ZyZWUoZnJhZy0+cmVhc3NlbWJseSk7CisJCWZyYWctPnJlYXNzZW1ibHkgPSBOVUxMOworCQl9CisKKwlpZiAoaXRlbSA9PSBOVUxMKQorCQl7CisJCW1lbXNldChzZXE2NGJlLDAsc2l6ZW9mKHNlcTY0YmUpKTsKKwkJc2VxNjRiZVs2XSA9ICh1bnNpZ25lZCBjaGFyKShtc2dfaGRyLT5zZXE+PjgpOworCQlzZXE2NGJlWzddID0gKHVuc2lnbmVkIGNoYXIpKG1zZ19oZHItPnNlcSk7CisKKwkJaXRlbSA9IHBpdGVtX25ldyhzZXE2NGJlLCBmcmFnKTsKKwkJaWYgKGl0ZW0gPT0gTlVMTCkKKwkJCXsKKwkJCWdvdG8gZXJyOworCQkJaSA9IC0xOworCQkJfQorCisJCXBxdWV1ZV9pbnNlcnQocy0+ZDEtPmJ1ZmZlcmVkX21lc3NhZ2VzLCBpdGVtKTsKKwkJfQorCisJcmV0dXJuIERUTFMxX0hNX0ZSQUdNRU5UX1JFVFJZOworCitlcnI6CisJaWYgKGZyYWcgIT0gTlVMTCkgZHRsczFfaG1fZnJhZ21lbnRfZnJlZShmcmFnKTsKKwlpZiAoaXRlbSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoaXRlbSk7CisJKm9rID0gMDsKKwlyZXR1cm4gaTsKKwl9CisKKworc3RhdGljIGludAorZHRsczFfcHJvY2Vzc19vdXRfb2Zfc2VxX21lc3NhZ2UoU1NMICpzLCBzdHJ1Y3QgaG1faGVhZGVyX3N0KiBtc2dfaGRyLCBpbnQgKm9rKQoreworCWludCBpPS0xOworCWhtX2ZyYWdtZW50ICpmcmFnID0gTlVMTDsKKwlwaXRlbSAqaXRlbSA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBzZXE2NGJlWzhdOworCXVuc2lnbmVkIGxvbmcgZnJhZ19sZW4gPSBtc2dfaGRyLT5mcmFnX2xlbjsKKworCWlmICgobXNnX2hkci0+ZnJhZ19vZmYrZnJhZ19sZW4pID4gbXNnX2hkci0+bXNnX2xlbikKKwkJZ290byBlcnI7CisKKwkvKiBUcnkgdG8gZmluZCBpdGVtIGluIHF1ZXVlLCB0byBwcmV2ZW50IGR1cGxpY2F0ZSBlbnRyaWVzICovCisJbWVtc2V0KHNlcTY0YmUsMCxzaXplb2Yoc2VxNjRiZSkpOworCXNlcTY0YmVbNl0gPSAodW5zaWduZWQgY2hhcikgKG1zZ19oZHItPnNlcT4+OCk7CisJc2VxNjRiZVs3XSA9ICh1bnNpZ25lZCBjaGFyKSBtc2dfaGRyLT5zZXE7CisJaXRlbSA9IHBxdWV1ZV9maW5kKHMtPmQxLT5idWZmZXJlZF9tZXNzYWdlcywgc2VxNjRiZSk7CisKKwkvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgYW4gZW50cnkgYW5kIHRoaXMgb25lIGlzIGEgZnJhZ21lbnQsCisJICogZG9uJ3QgZGlzY2FyZCBpdCBhbmQgcmF0aGVyIHRyeSB0byByZWFzc2VtYmxlIGl0LgorCSAqLworCWlmIChpdGVtICE9IE5VTEwgJiYgZnJhZ19sZW4gPCBtc2dfaGRyLT5tc2dfbGVuKQorCQlpdGVtID0gTlVMTDsKKworCS8qIERpc2NhcmQgdGhlIG1lc3NhZ2UgaWYgc2VxdWVuY2UgbnVtYmVyIHdhcyBhbHJlYWR5IHRoZXJlLCBpcworCSAqIHRvbyBmYXIgaW4gdGhlIGZ1dHVyZSwgYWxyZWFkeSBpbiB0aGUgcXVldWUgb3IgaWYgd2UgcmVjZWl2ZWQKKwkgKiBhIEZJTklTSEVEIGJlZm9yZSB0aGUgU0VSVkVSX0hFTExPLCB3aGljaCB0aGVuIG11c3QgYmUgYSBzdGFsZQorCSAqIHJldHJhbnNtaXQuCisJICovCisJaWYgKG1zZ19oZHItPnNlcSA8PSBzLT5kMS0+aGFuZHNoYWtlX3JlYWRfc2VxIHx8CisJCW1zZ19oZHItPnNlcSA+IHMtPmQxLT5oYW5kc2hha2VfcmVhZF9zZXEgKyAxMCB8fCBpdGVtICE9IE5VTEwgfHwKKwkJKHMtPmQxLT5oYW5kc2hha2VfcmVhZF9zZXEgPT0gMCAmJiBtc2dfaGRyLT50eXBlID09IFNTTDNfTVRfRklOSVNIRUQpKQorCQl7CisJCXVuc2lnbmVkIGNoYXIgZGV2bnVsbCBbMjU2XTsKKworCQl3aGlsZSAoZnJhZ19sZW4pCisJCQl7CisJCQlpID0gcy0+bWV0aG9kLT5zc2xfcmVhZF9ieXRlcyhzLFNTTDNfUlRfSEFORFNIQUtFLAorCQkJCWRldm51bGwsCisJCQkJZnJhZ19sZW4+c2l6ZW9mKGRldm51bGwpP3NpemVvZihkZXZudWxsKTpmcmFnX2xlbiwwKTsKKwkJCWlmIChpPD0wKSBnb3RvIGVycjsKKwkJCWZyYWdfbGVuIC09IGk7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKGZyYWdfbGVuICYmIGZyYWdfbGVuIDwgbXNnX2hkci0+bXNnX2xlbikKKwkJCXJldHVybiBkdGxzMV9yZWFzc2VtYmxlX2ZyYWdtZW50KHMsIG1zZ19oZHIsIG9rKTsKKworCQlmcmFnID0gZHRsczFfaG1fZnJhZ21lbnRfbmV3KGZyYWdfbGVuLCAwKTsKKwkJaWYgKCBmcmFnID09IE5VTEwpCisJCQlnb3RvIGVycjsKKworCQltZW1jcHkoJihmcmFnLT5tc2dfaGVhZGVyKSwgbXNnX2hkciwgc2l6ZW9mKCptc2dfaGRyKSk7CisKKwkJaWYgKGZyYWdfbGVuKQorCQkJeworCQkJLyogcmVhZCB0aGUgYm9keSBvZiB0aGUgZnJhZ21lbnQgKGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgKi8KKwkJCWkgPSBzLT5tZXRob2QtPnNzbF9yZWFkX2J5dGVzKHMsU1NMM19SVF9IQU5EU0hBS0UsCisJCQkJZnJhZy0+ZnJhZ21lbnQsZnJhZ19sZW4sMCk7CisJCQlpZiAoaTw9MCB8fCAodW5zaWduZWQgbG9uZylpIT1mcmFnX2xlbikKKwkJCQlnb3RvIGVycjsKKwkJCX0KKworCQltZW1zZXQoc2VxNjRiZSwwLHNpemVvZihzZXE2NGJlKSk7CisJCXNlcTY0YmVbNl0gPSAodW5zaWduZWQgY2hhcikobXNnX2hkci0+c2VxPj44KTsKKwkJc2VxNjRiZVs3XSA9ICh1bnNpZ25lZCBjaGFyKShtc2dfaGRyLT5zZXEpOworCisJCWl0ZW0gPSBwaXRlbV9uZXcoc2VxNjRiZSwgZnJhZyk7CisJCWlmICggaXRlbSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisKKwkJcHF1ZXVlX2luc2VydChzLT5kMS0+YnVmZmVyZWRfbWVzc2FnZXMsIGl0ZW0pOworCQl9CisKKwlyZXR1cm4gRFRMUzFfSE1fRlJBR01FTlRfUkVUUlk7CisKK2VycjoKKwlpZiAoIGZyYWcgIT0gTlVMTCkgZHRsczFfaG1fZnJhZ21lbnRfZnJlZShmcmFnKTsKKwlpZiAoIGl0ZW0gIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGl0ZW0pOworCSpvayA9IDA7CisJcmV0dXJuIGk7CisJfQorCisKK3N0YXRpYyBsb25nCitkdGxzMV9nZXRfbWVzc2FnZV9mcmFnbWVudChTU0wgKnMsIGludCBzdDEsIGludCBzdG4sIGxvbmcgbWF4LCBpbnQgKm9rKQorCXsKKwl1bnNpZ25lZCBjaGFyIHdpcmVbRFRMUzFfSE1fSEVBREVSX0xFTkdUSF07CisJdW5zaWduZWQgbG9uZyBsZW4sIGZyYWdfb2ZmLCBmcmFnX2xlbjsKKwlpbnQgaSxhbDsKKwlzdHJ1Y3QgaG1faGVhZGVyX3N0IG1zZ19oZHI7CisKKwkvKiBzZWUgaWYgd2UgaGF2ZSB0aGUgcmVxdWlyZWQgZnJhZ21lbnQgYWxyZWFkeSAqLworCWlmICgoZnJhZ19sZW4gPSBkdGxzMV9yZXRyaWV2ZV9idWZmZXJlZF9mcmFnbWVudChzLG1heCxvaykpIHx8ICpvaykKKwkJeworCQlpZiAoKm9rKQlzLT5pbml0X251bSA9IGZyYWdfbGVuOworCQlyZXR1cm4gZnJhZ19sZW47CisJCX0KKworCS8qIHJlYWQgaGFuZHNoYWtlIG1lc3NhZ2UgaGVhZGVyICovCisJaT1zLT5tZXRob2QtPnNzbF9yZWFkX2J5dGVzKHMsU1NMM19SVF9IQU5EU0hBS0Usd2lyZSwKKwkJRFRMUzFfSE1fSEVBREVSX0xFTkdUSCwgMCk7CisJaWYgKGkgPD0gMCkgCS8qIG5iaW8sIG9yIGFuIGVycm9yICovCisJCXsKKwkJcy0+cndzdGF0ZT1TU0xfUkVBRElORzsKKwkJKm9rID0gMDsKKwkJcmV0dXJuIGk7CisJCX0KKwlPUEVOU1NMX2Fzc2VydChpID09IERUTFMxX0hNX0hFQURFUl9MRU5HVEgpOworCisJLyogcGFyc2UgdGhlIG1lc3NhZ2UgZnJhZ21lbnQgaGVhZGVyICovCisJZHRsczFfZ2V0X21lc3NhZ2VfaGVhZGVyKHdpcmUsICZtc2dfaGRyKTsKKworCS8qIAorCSAqIGlmIHRoaXMgaXMgYSBmdXR1cmUgKG9yIHN0YWxlKSBtZXNzYWdlIGl0IGdldHMgYnVmZmVyZWQKKwkgKiAob3IgZHJvcHBlZCktLW5vIGZ1cnRoZXIgcHJvY2Vzc2luZyBhdCB0aGlzIHRpbWUgCisJICovCisJaWYgKCBtc2dfaGRyLnNlcSAhPSBzLT5kMS0+aGFuZHNoYWtlX3JlYWRfc2VxKQorCQlyZXR1cm4gZHRsczFfcHJvY2Vzc19vdXRfb2Zfc2VxX21lc3NhZ2UocywgJm1zZ19oZHIsIG9rKTsKKworCWxlbiA9IG1zZ19oZHIubXNnX2xlbjsKKwlmcmFnX29mZiA9IG1zZ19oZHIuZnJhZ19vZmY7CisJZnJhZ19sZW4gPSBtc2dfaGRyLmZyYWdfbGVuOworCisJaWYgKGZyYWdfbGVuICYmIGZyYWdfbGVuIDwgbGVuKQorCQlyZXR1cm4gZHRsczFfcmVhc3NlbWJsZV9mcmFnbWVudChzLCAmbXNnX2hkciwgb2spOworCisJaWYgKCFzLT5zZXJ2ZXIgJiYgcy0+ZDEtPnJfbXNnX2hkci5mcmFnX29mZiA9PSAwICYmCisJCXdpcmVbMF0gPT0gU1NMM19NVF9IRUxMT19SRVFVRVNUKQorCQl7CisJCS8qIFRoZSBzZXJ2ZXIgbWF5IGFsd2F5cyBzZW5kICdIZWxsbyBSZXF1ZXN0JyBtZXNzYWdlcyAtLQorCQkgKiB3ZSBhcmUgZG9pbmcgYSBoYW5kc2hha2UgYW55d2F5IG5vdywgc28gaWdub3JlIHRoZW0KKwkJICogaWYgdGhlaXIgZm9ybWF0IGlzIGNvcnJlY3QuIERvZXMgbm90IGNvdW50IGZvcgorCQkgKiAnRmluaXNoZWQnIE1BQy4gKi8KKwkJaWYgKHdpcmVbMV0gPT0gMCAmJiB3aXJlWzJdID09IDAgJiYgd2lyZVszXSA9PSAwKQorCQkJeworCQkJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJCQlzLT5tc2dfY2FsbGJhY2soMCwgcy0+dmVyc2lvbiwgU1NMM19SVF9IQU5EU0hBS0UsIAorCQkJCQl3aXJlLCBEVExTMV9ITV9IRUFERVJfTEVOR1RILCBzLCAKKwkJCQkJcy0+bXNnX2NhbGxiYWNrX2FyZyk7CisJCQkKKwkJCXMtPmluaXRfbnVtID0gMDsKKwkJCXJldHVybiBkdGxzMV9nZXRfbWVzc2FnZV9mcmFnbWVudChzLCBzdDEsIHN0biwKKwkJCQltYXgsIG9rKTsKKwkJCX0KKwkJZWxzZSAvKiBJbmNvcnJlY3RseSBmb3JtYXRlZCBIZWxsbyByZXF1ZXN0ICovCisJCQl7CisJCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX0dFVF9NRVNTQUdFX0ZSQUdNRU5ULFNTTF9SX1VORVhQRUNURURfTUVTU0FHRSk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQl9CisKKwlpZiAoKGFsPWR0bHMxX3ByZXByb2Nlc3NfZnJhZ21lbnQocywmbXNnX2hkcixtYXgpKSkKKwkJZ290byBmX2VycjsKKworCS8qIFhEVExTOiAgcmVzc3VyZWN0IHRoaXMgd2hlbiByZXN0YXJ0IGlzIGluIHBsYWNlICovCisJcy0+c3RhdGU9c3RuOworCisJaWYgKCBmcmFnX2xlbiA+IDApCisJCXsKKwkJdW5zaWduZWQgY2hhciAqcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhK0RUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisKKwkJaT1zLT5tZXRob2QtPnNzbF9yZWFkX2J5dGVzKHMsU1NMM19SVF9IQU5EU0hBS0UsCisJCQkmcFtmcmFnX29mZl0sZnJhZ19sZW4sMCk7CisJCS8qIFhEVExTOiAgZml4IHRoaXMtLW1lc3NhZ2UgZnJhZ21lbnRzIGNhbm5vdCBzcGFuIG11bHRpcGxlIHBhY2tldHMgKi8KKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCXMtPnJ3c3RhdGU9U1NMX1JFQURJTkc7CisJCQkqb2sgPSAwOworCQkJcmV0dXJuIGk7CisJCQl9CisJCX0KKwllbHNlCisJCWkgPSAwOworCisJLyogWERUTFM6ICBhbiBpbmNvcnJlY3RseSBmb3JtYXR0ZWQgZnJhZ21lbnQgc2hvdWxkIGNhdXNlIHRoZSAKKwkgKiBoYW5kc2hha2UgdG8gZmFpbCAqLworCU9QRU5TU0xfYXNzZXJ0KGkgPT0gKGludClmcmFnX2xlbik7CisKKwkqb2sgPSAxOworCisJLyogTm90ZSB0aGF0IHMtPmluaXRfbnVtIGlzICpub3QqIHVzZWQgYXMgY3VycmVudCBvZmZzZXQgaW4KKwkgKiBzLT5pbml0X2J1Zi0+ZGF0YSwgYnV0IGFzIGEgY291bnRlciBzdW1taW5nIHVwIGZyYWdtZW50cycKKwkgKiBsZW5ndGhzOiBhcyBzb29uIGFzIHRoZXkgc3VtIHVwIHRvIGhhbmRzaGFrZSBwYWNrZXQKKwkgKiBsZW5ndGgsIHdlIGFzc3VtZSB3ZSBoYXZlIGdvdCBhbGwgdGhlIGZyYWdtZW50cy4gKi8KKwlzLT5pbml0X251bSA9IGZyYWdfbGVuOworCXJldHVybiBmcmFnX2xlbjsKKworZl9lcnI6CisJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxhbCk7CisJcy0+aW5pdF9udW0gPSAwOworCisJKm9rPTA7CisJcmV0dXJuKC0xKTsKKwl9CisKK2ludCBkdGxzMV9zZW5kX2ZpbmlzaGVkKFNTTCAqcywgaW50IGEsIGludCBiLCBjb25zdCBjaGFyICpzZW5kZXIsIGludCBzbGVuKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwLCpkOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbDsKKworCWlmIChzLT5zdGF0ZSA9PSBhKQorCQl7CisJCWQ9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKwkJcD0gJihkW0RUTFMxX0hNX0hFQURFUl9MRU5HVEhdKTsKKworCQlpPXMtPm1ldGhvZC0+c3NsM19lbmMtPmZpbmFsX2ZpbmlzaF9tYWMocywKKwkJCXNlbmRlcixzbGVuLHMtPnMzLT50bXAuZmluaXNoX21kKTsKKwkJcy0+czMtPnRtcC5maW5pc2hfbWRfbGVuID0gaTsKKwkJbWVtY3B5KHAsIHMtPnMzLT50bXAuZmluaXNoX21kLCBpKTsKKwkJcCs9aTsKKwkJbD1pOworCisJLyogQ29weSB0aGUgZmluaXNoZWQgc28gd2UgY2FuIHVzZSBpdCBmb3IKKwkgKiByZW5lZ290aWF0aW9uIGNoZWNrcworCSAqLworCWlmKHMtPnR5cGUgPT0gU1NMX1NUX0NPTk5FQ1QpCisJCXsKKwkJT1BFTlNTTF9hc3NlcnQoaSA8PSBFVlBfTUFYX01EX1NJWkUpOworCQltZW1jcHkocy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZCwgCisJCSAgICAgICBzLT5zMy0+dG1wLmZpbmlzaF9tZCwgaSk7CisJCXMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuPWk7CisJCX0KKwllbHNlCisJCXsKKwkJT1BFTlNTTF9hc3NlcnQoaSA8PSBFVlBfTUFYX01EX1NJWkUpOworCQltZW1jcHkocy0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZCwgCisJCSAgICAgICBzLT5zMy0+dG1wLmZpbmlzaF9tZCwgaSk7CisJCXMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuPWk7CisJCX0KKworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjE2CisJCS8qIE1TVkMgMS41IGRvZXMgbm90IGNsZWFyIHRoZSB0b3AgYnl0ZXMgb2YgdGhlIHdvcmQgdW5sZXNzCisJCSAqIEkgZG8gdGhpcy4KKwkJICovCisJCWwmPTB4ZmZmZjsKKyNlbmRpZgorCisJCWQgPSBkdGxzMV9zZXRfbWVzc2FnZV9oZWFkZXIocywgZCwgU1NMM19NVF9GSU5JU0hFRCwgbCwgMCwgbCk7CisJCXMtPmluaXRfbnVtPShpbnQpbCtEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCQlzLT5pbml0X29mZj0wOworCisJCS8qIGJ1ZmZlciB0aGUgbWVzc2FnZSB0byBoYW5kbGUgcmUteG1pdHMgKi8KKwkJZHRsczFfYnVmZmVyX21lc3NhZ2UocywgMCk7CisKKwkJcy0+c3RhdGU9YjsKKwkJfQorCisJLyogU1NMM19TVF9TRU5EX3h4eHh4eF9IRUxMT19CICovCisJcmV0dXJuKGR0bHMxX2RvX3dyaXRlKHMsU1NMM19SVF9IQU5EU0hBS0UpKTsKKwl9CisKKy8qIGZvciB0aGVzZSAyIG1lc3NhZ2VzLCB3ZSBuZWVkIHRvCisgKiBzc2wtPmVuY19yZWFkX2N0eAkJCXJlLWluaXQKKyAqIHNzbC0+czMtPnJlYWRfc2VxdWVuY2UJCXplcm8KKyAqIHNzbC0+czMtPnJlYWRfbWFjX3NlY3JldAkJcmUtaW5pdAorICogc3NsLT5zZXNzaW9uLT5yZWFkX3N5bV9lbmMJCWFzc2lnbgorICogc3NsLT5zZXNzaW9uLT5yZWFkX2NvbXByZXNzaW9uCWFzc2lnbgorICogc3NsLT5zZXNzaW9uLT5yZWFkX2hhc2gJCWFzc2lnbgorICovCitpbnQgZHRsczFfc2VuZF9jaGFuZ2VfY2lwaGVyX3NwZWMoU1NMICpzLCBpbnQgYSwgaW50IGIpCisJeyAKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKHMtPnN0YXRlID09IGEpCisJCXsKKwkJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCQkqcCsrPVNTTDNfTVRfQ0NTOworCQlzLT5kMS0+aGFuZHNoYWtlX3dyaXRlX3NlcSA9IHMtPmQxLT5uZXh0X2hhbmRzaGFrZV93cml0ZV9zZXE7CisJCXMtPmluaXRfbnVtPURUTFMxX0NDU19IRUFERVJfTEVOR1RIOworCisJCWlmIChzLT52ZXJzaW9uID09IERUTFMxX0JBRF9WRVIpIHsKKwkJCXMtPmQxLT5uZXh0X2hhbmRzaGFrZV93cml0ZV9zZXErKzsKKwkJCXMybihzLT5kMS0+aGFuZHNoYWtlX3dyaXRlX3NlcSxwKTsKKwkJCXMtPmluaXRfbnVtKz0yOworCQl9CisKKwkJcy0+aW5pdF9vZmY9MDsKKworCQlkdGxzMV9zZXRfbWVzc2FnZV9oZWFkZXJfaW50KHMsIFNTTDNfTVRfQ0NTLCAwLCAKKwkJCXMtPmQxLT5oYW5kc2hha2Vfd3JpdGVfc2VxLCAwLCAwKTsKKworCQkvKiBidWZmZXIgdGhlIG1lc3NhZ2UgdG8gaGFuZGxlIHJlLXhtaXRzICovCisJCWR0bHMxX2J1ZmZlcl9tZXNzYWdlKHMsIDEpOworCisJCXMtPnN0YXRlPWI7CisJCX0KKworCS8qIFNTTDNfU1RfQ1dfQ0hBTkdFX0IgKi8KKwlyZXR1cm4oZHRsczFfZG9fd3JpdGUocyxTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQykpOworCX0KKworc3RhdGljIGludCBkdGxzMV9hZGRfY2VydF90b19idWYoQlVGX01FTSAqYnVmLCB1bnNpZ25lZCBsb25nICpsLCBYNTA5ICp4KQorCXsKKwlpbnQgbjsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJbj1pMmRfWDUwOSh4LE5VTEwpOworCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGJ1ZiwoaW50KShuKygqbCkrMykpKQorCQl7CisJCVNTTGVycihTU0xfRl9EVExTMV9BRERfQ0VSVF9UT19CVUYsRVJSX1JfQlVGX0xJQik7CisJCXJldHVybiAwOworCQl9CisJcD0odW5zaWduZWQgY2hhciAqKSYoYnVmLT5kYXRhWypsXSk7CisJbDJuMyhuLHApOworCWkyZF9YNTA5KHgsJnApOworCSpsKz1uKzM7CisKKwlyZXR1cm4gMTsKKwl9Cit1bnNpZ25lZCBsb25nIGR0bHMxX291dHB1dF9jZXJ0X2NoYWluKFNTTCAqcywgWDUwOSAqeCkKKwl7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGw9IDMgKyBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCUJVRl9NRU0gKmJ1ZjsKKworCS8qIFRMU3YxIHNlbmRzIGEgY2hhaW4gd2l0aCBub3RoaW5nIGluIGl0LCBpbnN0ZWFkIG9mIGFuIGFsZXJ0ICovCisJYnVmPXMtPmluaXRfYnVmOworCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGJ1ZiwxMCkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX0RUTFMxX09VVFBVVF9DRVJUX0NIQUlOLEVSUl9SX0JVRl9MSUIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoeCAhPSBOVUxMKQorCQl7CisJCVg1MDlfU1RPUkVfQ1RYIHhzX2N0eDsKKworCQlpZiAoIVg1MDlfU1RPUkVfQ1RYX2luaXQoJnhzX2N0eCxzLT5jdHgtPmNlcnRfc3RvcmUseCxOVUxMKSkKKyAgCQkJeworICAJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfT1VUUFVUX0NFUlRfQ0hBSU4sRVJSX1JfWDUwOV9MSUIpOworICAJCQlyZXR1cm4oMCk7CisgIAkJCX0KKyAgCisJCVg1MDlfdmVyaWZ5X2NlcnQoJnhzX2N0eCk7CisJCS8qIERvbid0IGxlYXZlIGVycm9ycyBpbiB0aGUgcXVldWUgKi8KKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCWZvciAoaT0wOyBpIDwgc2tfWDUwOV9udW0oeHNfY3R4LmNoYWluKTsgaSsrKQorICAJCQl7CisJCQl4ID0gc2tfWDUwOV92YWx1ZSh4c19jdHguY2hhaW4sIGkpOworCisJCQlpZiAoIWR0bHMxX2FkZF9jZXJ0X3RvX2J1ZihidWYsICZsLCB4KSkKKyAgCQkJCXsKKwkJCQlYNTA5X1NUT1JFX0NUWF9jbGVhbnVwKCZ4c19jdHgpOworCQkJCXJldHVybiAwOworICAJCQkJfQorICAJCQl9CisgIAkJWDUwOV9TVE9SRV9DVFhfY2xlYW51cCgmeHNfY3R4KTsKKyAgCQl9CisgIAkvKiBUaGF3dGUgc3BlY2lhbCA6LSkgKi8KKwlmb3IgKGk9MDsgaTxza19YNTA5X251bShzLT5jdHgtPmV4dHJhX2NlcnRzKTsgaSsrKQorCQl7CisJCXg9c2tfWDUwOV92YWx1ZShzLT5jdHgtPmV4dHJhX2NlcnRzLGkpOworCQlpZiAoIWR0bHMxX2FkZF9jZXJ0X3RvX2J1ZihidWYsICZsLCB4KSkKKwkJCXJldHVybiAwOworCQl9CisKKwlsLT0gKDMgKyBEVExTMV9ITV9IRUFERVJfTEVOR1RIKTsKKworCXA9KHVuc2lnbmVkIGNoYXIgKikmKGJ1Zi0+ZGF0YVtEVExTMV9ITV9IRUFERVJfTEVOR1RIXSk7CisJbDJuMyhsLHApOworCWwrPTM7CisJcD0odW5zaWduZWQgY2hhciAqKSYoYnVmLT5kYXRhWzBdKTsKKwlwID0gZHRsczFfc2V0X21lc3NhZ2VfaGVhZGVyKHMsIHAsIFNTTDNfTVRfQ0VSVElGSUNBVEUsIGwsIDAsIGwpOworCisJbCs9RFRMUzFfSE1fSEVBREVSX0xFTkdUSDsKKwlyZXR1cm4obCk7CisJfQorCitpbnQgZHRsczFfcmVhZF9mYWlsZWQoU1NMICpzLCBpbnQgY29kZSkKKwl7CisJaWYgKCBjb2RlID4gMCkKKwkJeworCQlmcHJpbnRmKCBzdGRlcnIsICJpbnZhbGlkIHN0YXRlIHJlYWNoZWQgJXM6JWQiLCBfX0ZJTEVfXywgX19MSU5FX18pOworCQlyZXR1cm4gMTsKKwkJfQorCisJaWYgKCFkdGxzMV9pc190aW1lcl9leHBpcmVkKHMpKQorCQl7CisJCS8qIG5vdCBhIHRpbWVvdXQsIG5vbmUgb2Ygb3VyIGJ1c2luZXNzLCAKKwkJICAgbGV0IGhpZ2hlciBsYXllcnMgaGFuZGxlIHRoaXMuICBpbiBmYWN0IGl0J3MgcHJvYmFibHkgYW4gZXJyb3IgKi8KKwkJcmV0dXJuIGNvZGU7CisJCX0KKworCWlmICggISBTU0xfaW5faW5pdChzKSkgIC8qIGRvbmUsIG5vIG5lZWQgdG8gc2VuZCBhIHJldHJhbnNtaXQgKi8KKwkJeworCQlCSU9fc2V0X2ZsYWdzKFNTTF9nZXRfcmJpbyhzKSwgQklPX0ZMQUdTX1JFQUQpOworCQlyZXR1cm4gY29kZTsKKwkJfQorCisjaWYgMCAvKiBmb3Igbm93LCBlYWNoIGFsZXJ0IGNvbnRhaW5zIG9ubHkgb25lIHJlY29yZCBudW1iZXIgKi8KKwlpdGVtID0gcHF1ZXVlX3BlZWsoc3RhdGUtPnJjdmRfcmVjb3Jkcyk7CisJaWYgKCBpdGVtICkKKwkJeworCQkvKiBzZW5kIGFuIGFsZXJ0IGltbWVkaWF0ZWx5IGZvciBhbGwgdGhlIG1pc3NpbmcgcmVjb3JkcyAqLworCQl9CisJZWxzZQorI2VuZGlmCisKKyNpZiAwICAvKiBubyBtb3JlIGFsZXJ0IHNlbmRpbmcsIGp1c3QgcmV0cmFuc21pdCB0aGUgbGFzdCBzZXQgb2YgbWVzc2FnZXMgKi8KKwlpZiAoIHN0YXRlLT50aW1lb3V0LnJlYWRfdGltZW91dHMgPj0gRFRMUzFfVE1PX1JFQURfQ09VTlQpCisJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfV0FSTklORywKKwkJCURUTFMxX0FEX01JU1NJTkdfSEFORFNIQUtFX01FU1NBR0UpOworI2VuZGlmCisKKwlyZXR1cm4gZHRsczFfaGFuZGxlX3RpbWVvdXQocyk7CisJfQorCitpbnQKK2R0bHMxX2dldF9xdWV1ZV9wcmlvcml0eSh1bnNpZ25lZCBzaG9ydCBzZXEsIGludCBpc19jY3MpCisJeworCS8qIFRoZSBpbmRleCBvZiB0aGUgcmV0cmFuc21pc3Npb24gcXVldWUgYWN0dWFsbHkgaXMgdGhlIG1lc3NhZ2Ugc2VxdWVuY2UgbnVtYmVyLAorCSAqIHNpbmNlIHRoZSBxdWV1ZSBvbmx5IGNvbnRhaW5zIG1lc3NhZ2VzIG9mIGEgc2luZ2xlIGhhbmRzaGFrZS4gSG93ZXZlciwgdGhlCisJICogQ2hhbmdlQ2lwaGVyU3BlYyBoYXMgbm8gbWVzc2FnZSBzZXF1ZW5jZSBudW1iZXIgYW5kIHNvIHVzaW5nIG9ubHkgdGhlIHNlcXVlbmNlCisJICogd2lsbCByZXN1bHQgaW4gdGhlIENDUyBhbmQgRmluaXNoZWQgaGF2aW5nIHRoZSBzYW1lIGluZGV4LiBUbyBwcmV2ZW50IHRoaXMsCisJICogdGhlIHNlcXVlbmNlIG51bWJlciBpcyBtdWx0aXBsaWVkIGJ5IDIuIEluIGNhc2Ugb2YgYSBDQ1MgMSBpcyBzdWJ0cmFjdGVkLgorCSAqIFRoaXMgZG9lcyBub3Qgb25seSBkaWZmZXIgQ1NTIGFuZCBGaW5pc2hlZCwgaXQgYWxzbyBtYWludGFpbnMgdGhlIG9yZGVyIG9mIHRoZQorCSAqIGluZGV4IChpbXBvcnRhbnQgZm9yIHByaW9yaXR5IHF1ZXVlcykgYW5kIGZpdHMgaW4gdGhlIHVuc2lnbmVkIHNob3J0IHZhcmlhYmxlLgorCSAqLwkKKwlyZXR1cm4gc2VxICogMiAtIGlzX2NjczsKKwl9CisKK2ludAorZHRsczFfcmV0cmFuc21pdF9idWZmZXJlZF9tZXNzYWdlcyhTU0wgKnMpCisJeworCXBxdWV1ZSBzZW50ID0gcy0+ZDEtPnNlbnRfbWVzc2FnZXM7CisJcGl0ZXJhdG9yIGl0ZXI7CisJcGl0ZW0gKml0ZW07CisJaG1fZnJhZ21lbnQgKmZyYWc7CisJaW50IGZvdW5kID0gMDsKKworCWl0ZXIgPSBwcXVldWVfaXRlcmF0b3Ioc2VudCk7CisKKwlmb3IgKCBpdGVtID0gcHF1ZXVlX25leHQoJml0ZXIpOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBwcXVldWVfbmV4dCgmaXRlcikpCisJCXsKKwkJZnJhZyA9IChobV9mcmFnbWVudCAqKWl0ZW0tPmRhdGE7CisJCQlpZiAoIGR0bHMxX3JldHJhbnNtaXRfbWVzc2FnZShzLAorCQkJCSh1bnNpZ25lZCBzaG9ydClkdGxzMV9nZXRfcXVldWVfcHJpb3JpdHkoZnJhZy0+bXNnX2hlYWRlci5zZXEsIGZyYWctPm1zZ19oZWFkZXIuaXNfY2NzKSwKKwkJCQkwLCAmZm91bmQpIDw9IDAgJiYgZm91bmQpCisJCQl7CisJCQlmcHJpbnRmKHN0ZGVyciwgImR0bHMxX3JldHJhbnNtaXRfbWVzc2FnZSgpIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCXJldHVybiAxOworCX0KKworaW50CitkdGxzMV9idWZmZXJfbWVzc2FnZShTU0wgKnMsIGludCBpc19jY3MpCisJeworCXBpdGVtICppdGVtOworCWhtX2ZyYWdtZW50ICpmcmFnOworCXVuc2lnbmVkIGNoYXIgc2VxNjRiZVs4XTsKKworCS8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgbWVzc2FnZSBoYXMgCisJICogYmVlbiBzZXJpYWxpemVkICovCisJT1BFTlNTTF9hc3NlcnQocy0+aW5pdF9vZmYgPT0gMCk7CisKKwlmcmFnID0gZHRsczFfaG1fZnJhZ21lbnRfbmV3KHMtPmluaXRfbnVtLCAwKTsKKworCW1lbWNweShmcmFnLT5mcmFnbWVudCwgcy0+aW5pdF9idWYtPmRhdGEsIHMtPmluaXRfbnVtKTsKKworCWlmICggaXNfY2NzKQorCQl7CisJCU9QRU5TU0xfYXNzZXJ0KHMtPmQxLT53X21zZ19oZHIubXNnX2xlbiArIAorCQkJICAgICAgICgocy0+dmVyc2lvbj09RFRMUzFfVkVSU0lPTik/RFRMUzFfQ0NTX0hFQURFUl9MRU5HVEg6MykgPT0gKHVuc2lnbmVkIGludClzLT5pbml0X251bSk7CisJCX0KKwllbHNlCisJCXsKKwkJT1BFTlNTTF9hc3NlcnQocy0+ZDEtPndfbXNnX2hkci5tc2dfbGVuICsgCisJCQlEVExTMV9ITV9IRUFERVJfTEVOR1RIID09ICh1bnNpZ25lZCBpbnQpcy0+aW5pdF9udW0pOworCQl9CisKKwlmcmFnLT5tc2dfaGVhZGVyLm1zZ19sZW4gPSBzLT5kMS0+d19tc2dfaGRyLm1zZ19sZW47CisJZnJhZy0+bXNnX2hlYWRlci5zZXEgPSBzLT5kMS0+d19tc2dfaGRyLnNlcTsKKwlmcmFnLT5tc2dfaGVhZGVyLnR5cGUgPSBzLT5kMS0+d19tc2dfaGRyLnR5cGU7CisJZnJhZy0+bXNnX2hlYWRlci5mcmFnX29mZiA9IDA7CisJZnJhZy0+bXNnX2hlYWRlci5mcmFnX2xlbiA9IHMtPmQxLT53X21zZ19oZHIubXNnX2xlbjsKKwlmcmFnLT5tc2dfaGVhZGVyLmlzX2NjcyA9IGlzX2NjczsKKworCS8qIHNhdmUgY3VycmVudCBzdGF0ZSovCisJZnJhZy0+bXNnX2hlYWRlci5zYXZlZF9yZXRyYW5zbWl0X3N0YXRlLmVuY193cml0ZV9jdHggPSBzLT5lbmNfd3JpdGVfY3R4OworCWZyYWctPm1zZ19oZWFkZXIuc2F2ZWRfcmV0cmFuc21pdF9zdGF0ZS53cml0ZV9oYXNoID0gcy0+d3JpdGVfaGFzaDsKKwlmcmFnLT5tc2dfaGVhZGVyLnNhdmVkX3JldHJhbnNtaXRfc3RhdGUuY29tcHJlc3MgPSBzLT5jb21wcmVzczsKKwlmcmFnLT5tc2dfaGVhZGVyLnNhdmVkX3JldHJhbnNtaXRfc3RhdGUuc2Vzc2lvbiA9IHMtPnNlc3Npb247CisJZnJhZy0+bXNnX2hlYWRlci5zYXZlZF9yZXRyYW5zbWl0X3N0YXRlLmVwb2NoID0gcy0+ZDEtPndfZXBvY2g7CisJCisJbWVtc2V0KHNlcTY0YmUsMCxzaXplb2Yoc2VxNjRiZSkpOworCXNlcTY0YmVbNl0gPSAodW5zaWduZWQgY2hhcikoZHRsczFfZ2V0X3F1ZXVlX3ByaW9yaXR5KGZyYWctPm1zZ19oZWFkZXIuc2VxLAorCQkJCQkJCQkJCQkJCQkgIGZyYWctPm1zZ19oZWFkZXIuaXNfY2NzKT4+OCk7CisJc2VxNjRiZVs3XSA9ICh1bnNpZ25lZCBjaGFyKShkdGxzMV9nZXRfcXVldWVfcHJpb3JpdHkoZnJhZy0+bXNnX2hlYWRlci5zZXEsCisJCQkJCQkJCQkJCQkJCSAgZnJhZy0+bXNnX2hlYWRlci5pc19jY3MpKTsKKworCWl0ZW0gPSBwaXRlbV9uZXcoc2VxNjRiZSwgZnJhZyk7CisJaWYgKCBpdGVtID09IE5VTEwpCisJCXsKKwkJZHRsczFfaG1fZnJhZ21lbnRfZnJlZShmcmFnKTsKKwkJcmV0dXJuIDA7CisJCX0KKworI2lmIDAKKwlmcHJpbnRmKCBzdGRlcnIsICJidWZmZXJlZCBtZXNzZ2U6IFx0dHlwZSA9ICV4eFxuIiwgbXNnX2J1Zi0+dHlwZSk7CisJZnByaW50Ziggc3RkZXJyLCAiXHRcdFx0XHRcdGxlbiA9ICVkXG4iLCBtc2dfYnVmLT5sZW4pOworCWZwcmludGYoIHN0ZGVyciwgIlx0XHRcdFx0XHRzZXFfbnVtID0gJWRcbiIsIG1zZ19idWYtPnNlcV9udW0pOworI2VuZGlmCisKKwlwcXVldWVfaW5zZXJ0KHMtPmQxLT5zZW50X21lc3NhZ2VzLCBpdGVtKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludAorZHRsczFfcmV0cmFuc21pdF9tZXNzYWdlKFNTTCAqcywgdW5zaWduZWQgc2hvcnQgc2VxLCB1bnNpZ25lZCBsb25nIGZyYWdfb2ZmLAorCWludCAqZm91bmQpCisJeworCWludCByZXQ7CisJLyogWERUTFM6IGZvciBub3cgYXNzdW1pbmcgdGhhdCByZWFkL3dyaXRlcyBhcmUgYmxvY2tpbmcgKi8KKwlwaXRlbSAqaXRlbTsKKwlobV9mcmFnbWVudCAqZnJhZyA7CisJdW5zaWduZWQgbG9uZyBoZWFkZXJfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgc2VxNjRiZVs4XTsKKwlzdHJ1Y3QgZHRsczFfcmV0cmFuc21pdF9zdGF0ZSBzYXZlZF9zdGF0ZTsKKwl1bnNpZ25lZCBjaGFyIHNhdmVfd3JpdGVfc2VxdWVuY2VbOF07CisKKwkvKgorCSAgT1BFTlNTTF9hc3NlcnQocy0+aW5pdF9udW0gPT0gMCk7CisJICBPUEVOU1NMX2Fzc2VydChzLT5pbml0X29mZiA9PSAwKTsKKwkgKi8KKworCS8qIFhEVExTOiAgdGhlIHJlcXVlc3RlZCBtZXNzYWdlIG91Z2h0IHRvIGJlIGZvdW5kLCBvdGhlcndpc2UgZXJyb3IgKi8KKwltZW1zZXQoc2VxNjRiZSwwLHNpemVvZihzZXE2NGJlKSk7CisJc2VxNjRiZVs2XSA9ICh1bnNpZ25lZCBjaGFyKShzZXE+PjgpOworCXNlcTY0YmVbN10gPSAodW5zaWduZWQgY2hhcilzZXE7CisKKwlpdGVtID0gcHF1ZXVlX2ZpbmQocy0+ZDEtPnNlbnRfbWVzc2FnZXMsIHNlcTY0YmUpOworCWlmICggaXRlbSA9PSBOVUxMKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCAicmV0cmFuc21pdDogIG1lc3NhZ2UgJWQgbm9uLWV4aXN0YW50XG4iLCBzZXEpOworCQkqZm91bmQgPSAwOworCQlyZXR1cm4gMDsKKwkJfQorCisJKmZvdW5kID0gMTsKKwlmcmFnID0gKGhtX2ZyYWdtZW50ICopaXRlbS0+ZGF0YTsKKworCWlmICggZnJhZy0+bXNnX2hlYWRlci5pc19jY3MpCisJCWhlYWRlcl9sZW5ndGggPSBEVExTMV9DQ1NfSEVBREVSX0xFTkdUSDsKKwllbHNlCisJCWhlYWRlcl9sZW5ndGggPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCisJbWVtY3B5KHMtPmluaXRfYnVmLT5kYXRhLCBmcmFnLT5mcmFnbWVudCwgCisJCWZyYWctPm1zZ19oZWFkZXIubXNnX2xlbiArIGhlYWRlcl9sZW5ndGgpOworCQlzLT5pbml0X251bSA9IGZyYWctPm1zZ19oZWFkZXIubXNnX2xlbiArIGhlYWRlcl9sZW5ndGg7CisKKwlkdGxzMV9zZXRfbWVzc2FnZV9oZWFkZXJfaW50KHMsIGZyYWctPm1zZ19oZWFkZXIudHlwZSwgCisJCWZyYWctPm1zZ19oZWFkZXIubXNnX2xlbiwgZnJhZy0+bXNnX2hlYWRlci5zZXEsIDAsIAorCQlmcmFnLT5tc2dfaGVhZGVyLmZyYWdfbGVuKTsKKworCS8qIHNhdmUgY3VycmVudCBzdGF0ZSAqLworCXNhdmVkX3N0YXRlLmVuY193cml0ZV9jdHggPSBzLT5lbmNfd3JpdGVfY3R4OworCXNhdmVkX3N0YXRlLndyaXRlX2hhc2ggPSBzLT53cml0ZV9oYXNoOworCXNhdmVkX3N0YXRlLmNvbXByZXNzID0gcy0+Y29tcHJlc3M7CisJc2F2ZWRfc3RhdGUuc2Vzc2lvbiA9IHMtPnNlc3Npb247CisJc2F2ZWRfc3RhdGUuZXBvY2ggPSBzLT5kMS0+d19lcG9jaDsKKwlzYXZlZF9zdGF0ZS5lcG9jaCA9IHMtPmQxLT53X2Vwb2NoOworCQorCXMtPmQxLT5yZXRyYW5zbWl0dGluZyA9IDE7CisJCisJLyogcmVzdG9yZSBzdGF0ZSBpbiB3aGljaCB0aGUgbWVzc2FnZSB3YXMgb3JpZ2luYWxseSBzZW50ICovCisJcy0+ZW5jX3dyaXRlX2N0eCA9IGZyYWctPm1zZ19oZWFkZXIuc2F2ZWRfcmV0cmFuc21pdF9zdGF0ZS5lbmNfd3JpdGVfY3R4OworCXMtPndyaXRlX2hhc2ggPSBmcmFnLT5tc2dfaGVhZGVyLnNhdmVkX3JldHJhbnNtaXRfc3RhdGUud3JpdGVfaGFzaDsKKwlzLT5jb21wcmVzcyA9IGZyYWctPm1zZ19oZWFkZXIuc2F2ZWRfcmV0cmFuc21pdF9zdGF0ZS5jb21wcmVzczsKKwlzLT5zZXNzaW9uID0gZnJhZy0+bXNnX2hlYWRlci5zYXZlZF9yZXRyYW5zbWl0X3N0YXRlLnNlc3Npb247CisJcy0+ZDEtPndfZXBvY2ggPSBmcmFnLT5tc2dfaGVhZGVyLnNhdmVkX3JldHJhbnNtaXRfc3RhdGUuZXBvY2g7CisJCisJaWYgKGZyYWctPm1zZ19oZWFkZXIuc2F2ZWRfcmV0cmFuc21pdF9zdGF0ZS5lcG9jaCA9PSBzYXZlZF9zdGF0ZS5lcG9jaCAtIDEpCisJeworCQltZW1jcHkoc2F2ZV93cml0ZV9zZXF1ZW5jZSwgcy0+czMtPndyaXRlX3NlcXVlbmNlLCBzaXplb2Yocy0+czMtPndyaXRlX3NlcXVlbmNlKSk7CisJCW1lbWNweShzLT5zMy0+d3JpdGVfc2VxdWVuY2UsIHMtPmQxLT5sYXN0X3dyaXRlX3NlcXVlbmNlLCBzaXplb2Yocy0+czMtPndyaXRlX3NlcXVlbmNlKSk7CisJfQorCQorCXJldCA9IGR0bHMxX2RvX3dyaXRlKHMsIGZyYWctPm1zZ19oZWFkZXIuaXNfY2NzID8gCisJCQkJCQkgU1NMM19SVF9DSEFOR0VfQ0lQSEVSX1NQRUMgOiBTU0wzX1JUX0hBTkRTSEFLRSk7CisJCisJLyogcmVzdG9yZSBjdXJyZW50IHN0YXRlICovCisJcy0+ZW5jX3dyaXRlX2N0eCA9IHNhdmVkX3N0YXRlLmVuY193cml0ZV9jdHg7CisJcy0+d3JpdGVfaGFzaCA9IHNhdmVkX3N0YXRlLndyaXRlX2hhc2g7CisJcy0+Y29tcHJlc3MgPSBzYXZlZF9zdGF0ZS5jb21wcmVzczsKKwlzLT5zZXNzaW9uID0gc2F2ZWRfc3RhdGUuc2Vzc2lvbjsKKwlzLT5kMS0+d19lcG9jaCA9IHNhdmVkX3N0YXRlLmVwb2NoOworCQorCWlmIChmcmFnLT5tc2dfaGVhZGVyLnNhdmVkX3JldHJhbnNtaXRfc3RhdGUuZXBvY2ggPT0gc2F2ZWRfc3RhdGUuZXBvY2ggLSAxKQorCXsKKwkJbWVtY3B5KHMtPmQxLT5sYXN0X3dyaXRlX3NlcXVlbmNlLCBzLT5zMy0+d3JpdGVfc2VxdWVuY2UsIHNpemVvZihzLT5zMy0+d3JpdGVfc2VxdWVuY2UpKTsKKwkJbWVtY3B5KHMtPnMzLT53cml0ZV9zZXF1ZW5jZSwgc2F2ZV93cml0ZV9zZXF1ZW5jZSwgc2l6ZW9mKHMtPnMzLT53cml0ZV9zZXF1ZW5jZSkpOworCX0KKworCXMtPmQxLT5yZXRyYW5zbWl0dGluZyA9IDA7CisKKwkodm9pZClCSU9fZmx1c2goU1NMX2dldF93YmlvKHMpKTsKKwlyZXR1cm4gcmV0OworCX0KKworLyogY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIGJ1ZmZlcmVkIG1lc3NhZ2VzIGFyZSBubyBsb25nZXIgbmVlZGVkICovCit2b2lkCitkdGxzMV9jbGVhcl9yZWNvcmRfYnVmZmVyKFNTTCAqcykKKwl7CisJcGl0ZW0gKml0ZW07CisKKwlmb3IoaXRlbSA9IHBxdWV1ZV9wb3Aocy0+ZDEtPnNlbnRfbWVzc2FnZXMpOworCQlpdGVtICE9IE5VTEw7IGl0ZW0gPSBwcXVldWVfcG9wKHMtPmQxLT5zZW50X21lc3NhZ2VzKSkKKwkJeworCQlkdGxzMV9obV9mcmFnbWVudF9mcmVlKChobV9mcmFnbWVudCAqKWl0ZW0tPmRhdGEpOworCQlwaXRlbV9mcmVlKGl0ZW0pOworCQl9CisJfQorCisKK3Vuc2lnbmVkIGNoYXIgKgorZHRsczFfc2V0X21lc3NhZ2VfaGVhZGVyKFNTTCAqcywgdW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgY2hhciBtdCwKKwkJCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGZyYWdfb2ZmLCB1bnNpZ25lZCBsb25nIGZyYWdfbGVuKQorCXsKKwlpZiAoIGZyYWdfb2ZmID09IDApCisJCXsKKwkJcy0+ZDEtPmhhbmRzaGFrZV93cml0ZV9zZXEgPSBzLT5kMS0+bmV4dF9oYW5kc2hha2Vfd3JpdGVfc2VxOworCQlzLT5kMS0+bmV4dF9oYW5kc2hha2Vfd3JpdGVfc2VxKys7CisJCX0KKworCWR0bHMxX3NldF9tZXNzYWdlX2hlYWRlcl9pbnQocywgbXQsIGxlbiwgcy0+ZDEtPmhhbmRzaGFrZV93cml0ZV9zZXEsCisJCWZyYWdfb2ZmLCBmcmFnX2xlbik7CisKKwlyZXR1cm4gcCArPSBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCX0KKworCisvKiBkb24ndCBhY3R1YWxseSBkbyB0aGUgd3JpdGluZywgd2FpdCB0aWxsIHRoZSBNVFUgaGFzIGJlZW4gcmV0cmlldmVkICovCitzdGF0aWMgdm9pZAorZHRsczFfc2V0X21lc3NhZ2VfaGVhZGVyX2ludChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgbXQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIHNob3J0IHNlcV9udW0sIHVuc2lnbmVkIGxvbmcgZnJhZ19vZmYsCisJCQkgICAgdW5zaWduZWQgbG9uZyBmcmFnX2xlbikKKwl7CisJc3RydWN0IGhtX2hlYWRlcl9zdCAqbXNnX2hkciA9ICZzLT5kMS0+d19tc2dfaGRyOworCisJbXNnX2hkci0+dHlwZSA9IG10OworCW1zZ19oZHItPm1zZ19sZW4gPSBsZW47CisJbXNnX2hkci0+c2VxID0gc2VxX251bTsKKwltc2dfaGRyLT5mcmFnX29mZiA9IGZyYWdfb2ZmOworCW1zZ19oZHItPmZyYWdfbGVuID0gZnJhZ19sZW47CisJfQorCitzdGF0aWMgdm9pZAorZHRsczFfZml4X21lc3NhZ2VfaGVhZGVyKFNTTCAqcywgdW5zaWduZWQgbG9uZyBmcmFnX29mZiwKKwkJCXVuc2lnbmVkIGxvbmcgZnJhZ19sZW4pCisJeworCXN0cnVjdCBobV9oZWFkZXJfc3QgKm1zZ19oZHIgPSAmcy0+ZDEtPndfbXNnX2hkcjsKKworCW1zZ19oZHItPmZyYWdfb2ZmID0gZnJhZ19vZmY7CisJbXNnX2hkci0+ZnJhZ19sZW4gPSBmcmFnX2xlbjsKKwl9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICoKK2R0bHMxX3dyaXRlX21lc3NhZ2VfaGVhZGVyKFNTTCAqcywgdW5zaWduZWQgY2hhciAqcCkKKwl7CisJc3RydWN0IGhtX2hlYWRlcl9zdCAqbXNnX2hkciA9ICZzLT5kMS0+d19tc2dfaGRyOworCisJKnArKyA9IG1zZ19oZHItPnR5cGU7CisJbDJuMyhtc2dfaGRyLT5tc2dfbGVuLCBwKTsKKworCXMybihtc2dfaGRyLT5zZXEsIHApOworCWwybjMobXNnX2hkci0+ZnJhZ19vZmYsIHApOworCWwybjMobXNnX2hkci0+ZnJhZ19sZW4sIHApOworCisJcmV0dXJuIHA7CisJfQorCitzdGF0aWMgdW5zaWduZWQgaW50IAorZHRsczFfbWluX210dSh2b2lkKQorCXsKKwlyZXR1cm4gKGdfcHJvYmFibGVfbXR1WyhzaXplb2YoZ19wcm9iYWJsZV9tdHUpIC8gCisJCXNpemVvZihnX3Byb2JhYmxlX210dVswXSkpIC0gMV0pOworCX0KKworc3RhdGljIHVuc2lnbmVkIGludCAKK2R0bHMxX2d1ZXNzX210dSh1bnNpZ25lZCBpbnQgY3Vycl9tdHUpCisJeworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCBjdXJyX210dSA9PSAwICkKKwkJcmV0dXJuIGdfcHJvYmFibGVfbXR1WzBdIDsKKworCWZvciAoIGkgPSAwOyBpIDwgc2l6ZW9mKGdfcHJvYmFibGVfbXR1KS9zaXplb2YoZ19wcm9iYWJsZV9tdHVbMF0pOyBpKyspCisJCWlmICggY3Vycl9tdHUgPiBnX3Byb2JhYmxlX210dVtpXSkKKwkJCXJldHVybiBnX3Byb2JhYmxlX210dVtpXTsKKworCXJldHVybiBjdXJyX210dTsKKwl9CisKK3ZvaWQKK2R0bHMxX2dldF9tZXNzYWdlX2hlYWRlcih1bnNpZ25lZCBjaGFyICpkYXRhLCBzdHJ1Y3QgaG1faGVhZGVyX3N0ICptc2dfaGRyKQorCXsKKwltZW1zZXQobXNnX2hkciwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBobV9oZWFkZXJfc3QpKTsKKwltc2dfaGRyLT50eXBlID0gKihkYXRhKyspOworCW4ybDMoZGF0YSwgbXNnX2hkci0+bXNnX2xlbik7CisKKwluMnMoZGF0YSwgbXNnX2hkci0+c2VxKTsKKwluMmwzKGRhdGEsIG1zZ19oZHItPmZyYWdfb2ZmKTsKKwluMmwzKGRhdGEsIG1zZ19oZHItPmZyYWdfbGVuKTsKKwl9CisKK3ZvaWQKK2R0bHMxX2dldF9jY3NfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHN0cnVjdCBjY3NfaGVhZGVyX3N0ICpjY3NfaGRyKQorCXsKKwltZW1zZXQoY2NzX2hkciwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBjY3NfaGVhZGVyX3N0KSk7CisKKwljY3NfaGRyLT50eXBlID0gKihkYXRhKyspOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9kMV9jbG50LmMgYi9saWIvb3BlbnNzbC9zc2wvZDFfY2xudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYmJlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvZDFfY2xudC5jCkBAIC0wLDAgKzEsMTU0MCBAQAorLyogc3NsL2QxX2NsbnQuYyAqLworLyogCisgKiBEVExTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgTmFnZW5kcmEgTW9kYWR1Z3UKKyAqIChuYWdlbmRyYUBjcy5zdGFuZm9yZC5lZHUpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0IDIwMDUuICAKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorI2luY2x1ZGUgImtzc2xfbGNsLmgiCisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjZW5kaWYKKworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKmR0bHMxX2dldF9jbGllbnRfbWV0aG9kKGludCB2ZXIpOworc3RhdGljIGludCBkdGxzMV9nZXRfaGVsbG9fdmVyaWZ5KFNTTCAqcyk7CisKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICpkdGxzMV9nZXRfY2xpZW50X21ldGhvZChpbnQgdmVyKQorCXsKKwlpZiAodmVyID09IERUTFMxX1ZFUlNJT04gfHwgdmVyID09IERUTFMxX0JBRF9WRVIpCisJCXJldHVybihEVExTdjFfY2xpZW50X21ldGhvZCgpKTsKKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKK0lNUExFTUVOVF9kdGxzMV9tZXRoX2Z1bmMoRFRMU3YxX2NsaWVudF9tZXRob2QsCisJCQlzc2xfdW5kZWZpbmVkX2Z1bmN0aW9uLAorCQkJZHRsczFfY29ubmVjdCwKKwkJCWR0bHMxX2dldF9jbGllbnRfbWV0aG9kKQorCitpbnQgZHRsczFfY29ubmVjdChTU0wgKnMpCisJeworCUJVRl9NRU0gKmJ1Zj1OVUxMOworCXVuc2lnbmVkIGxvbmcgVGltZT0odW5zaWduZWQgbG9uZyl0aW1lKE5VTEwpOworCXZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsaW50IHR5cGUsaW50IHZhbCk9TlVMTDsKKwlpbnQgcmV0PSAtMTsKKwlpbnQgbmV3X3N0YXRlLHN0YXRlLHNraXA9MDs7CisKKwlSQU5EX2FkZCgmVGltZSxzaXplb2YoVGltZSksMCk7CisJRVJSX2NsZWFyX2Vycm9yKCk7CisJY2xlYXJfc3lzX2Vycm9yKCk7CisKKwlpZiAocy0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQljYj1zLT5pbmZvX2NhbGxiYWNrOworCWVsc2UgaWYgKHMtPmN0eC0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQljYj1zLT5jdHgtPmluZm9fY2FsbGJhY2s7CisJCisJcy0+aW5faGFuZHNoYWtlKys7CisJaWYgKCFTU0xfaW5faW5pdChzKSB8fCBTU0xfaW5fYmVmb3JlKHMpKSBTU0xfY2xlYXIocyk7IAorCisJZm9yICg7OykKKwkJeworCQlzdGF0ZT1zLT5zdGF0ZTsKKworCQlzd2l0Y2gocy0+c3RhdGUpCisJCQl7CisJCWNhc2UgU1NMX1NUX1JFTkVHT1RJQVRFOgorCQkJcy0+bmV3X3Nlc3Npb249MTsKKwkJCXMtPnN0YXRlPVNTTF9TVF9DT05ORUNUOworCQkJcy0+Y3R4LT5zdGF0cy5zZXNzX2Nvbm5lY3RfcmVuZWdvdGlhdGUrKzsKKwkJCS8qIGJyZWFrICovCisJCWNhc2UgU1NMX1NUX0JFRk9SRToKKwkJY2FzZSBTU0xfU1RfQ09OTkVDVDoKKwkJY2FzZSBTU0xfU1RfQkVGT1JFfFNTTF9TVF9DT05ORUNUOgorCQljYXNlIFNTTF9TVF9PS3xTU0xfU1RfQ09OTkVDVDoKKworCQkJcy0+c2VydmVyPTA7CisJCQlpZiAoY2IgIT0gTlVMTCkgY2IocyxTU0xfQ0JfSEFORFNIQUtFX1NUQVJULDEpOworCisJCQlpZiAoKHMtPnZlcnNpb24gJiAweGZmMDAgKSAhPSAoRFRMUzFfVkVSU0lPTiAmIDB4ZmYwMCkgJiYKKwkJCSAgICAocy0+dmVyc2lvbiAmIDB4ZmYwMCApICE9IChEVExTMV9CQURfVkVSICYgMHhmZjAwKSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX0NPTk5FQ1QsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlyZXQgPSAtMTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQkJCisJCQkvKiBzLT52ZXJzaW9uPVNTTDNfVkVSU0lPTjsgKi8KKwkJCXMtPnR5cGU9U1NMX1NUX0NPTk5FQ1Q7CisKKwkJCWlmIChzLT5pbml0X2J1ZiA9PSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoKGJ1Zj1CVUZfTUVNX25ldygpKSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCXJldD0gLTE7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJaWYgKCFCVUZfTUVNX2dyb3coYnVmLFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCkpCisJCQkJCXsKKwkJCQkJcmV0PSAtMTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlzLT5pbml0X2J1Zj1idWY7CisJCQkJYnVmPU5VTEw7CisJCQkJfQorCisJCQlpZiAoIXNzbDNfc2V0dXBfYnVmZmVycyhzKSkgeyByZXQ9IC0xOyBnb3RvIGVuZDsgfQorCisJCQkvKiBzZXR1cCBidWZmaW5nIEJJTyAqLworCQkJaWYgKCFzc2xfaW5pdF93YmlvX2J1ZmZlcihzLDApKSB7IHJldD0gLTE7IGdvdG8gZW5kOyB9CisKKwkJCS8qIGRvbid0IHB1c2ggdGhlIGJ1ZmZlcmluZyBCSU8gcXVpdGUgeWV0ICovCisKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19BOworCQkJcy0+Y3R4LT5zdGF0cy5zZXNzX2Nvbm5lY3QrKzsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQkvKiBtYXJrIGNsaWVudF9yYW5kb20gdW5pbml0aWFsaXplZCAqLworCQkJbWVtc2V0KHMtPnMzLT5jbGllbnRfcmFuZG9tLDAsc2l6ZW9mKHMtPnMzLT5jbGllbnRfcmFuZG9tKSk7CisJCQlzLT5kMS0+c2VuZF9jb29raWUgPSAwOworCQkJcy0+aGl0ID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9DV19DTE5UX0hFTExPX0E6CisJCWNhc2UgU1NMM19TVF9DV19DTE5UX0hFTExPX0I6CisKKwkJCXMtPnNodXRkb3duPTA7CisKKwkJCS8qIGV2ZXJ5IERUTFMgQ2xpZW50SGVsbG8gcmVzZXRzIEZpbmlzaGVkIE1BQyAqLworCQkJc3NsM19pbml0X2ZpbmlzaGVkX21hYyhzKTsKKworCQkJZHRsczFfc3RhcnRfdGltZXIocyk7CisJCQlyZXQ9ZHRsczFfY2xpZW50X2hlbGxvKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKworCQkJaWYgKCBzLT5kMS0+c2VuZF9jb29raWUpCisJCQkJeworCQkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfRkxVU0g7CisJCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTDNfU1RfQ1JfU1JWUl9IRUxMT19BOworCQkJCX0KKwkJCWVsc2UKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX1NSVlJfSEVMTE9fQTsKKworCQkJcy0+aW5pdF9udW09MDsKKworCQkJLyogdHVybiBvbiBidWZmZXJpbmcgZm9yIHRoZSBuZXh0IGxvdCBvZiBvdXRwdXQgKi8KKwkJCWlmIChzLT5iYmlvICE9IHMtPndiaW8pCisJCQkJcy0+d2Jpbz1CSU9fcHVzaChzLT5iYmlvLHMtPndiaW8pOworCisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfQ1JfU1JWUl9IRUxMT19BOgorCQljYXNlIFNTTDNfU1RfQ1JfU1JWUl9IRUxMT19COgorCQkJcmV0PXNzbDNfZ2V0X3NlcnZlcl9oZWxsbyhzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQllbHNlCisJCQkJeworCQkJCWR0bHMxX3N0b3BfdGltZXIocyk7CisJCQkJaWYgKHMtPmhpdCkKKwkJCQkJcy0+c3RhdGU9U1NMM19TVF9DUl9GSU5JU0hFRF9BOworCQkJCWVsc2UKKwkJCQkJcy0+c3RhdGU9RFRMUzFfU1RfQ1JfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQTsKKwkJCQl9CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBEVExTMV9TVF9DUl9IRUxMT19WRVJJRllfUkVRVUVTVF9BOgorCQljYXNlIERUTFMxX1NUX0NSX0hFTExPX1ZFUklGWV9SRVFVRVNUX0I6CisKKwkJCXJldCA9IGR0bHMxX2dldF9oZWxsb192ZXJpZnkocyk7CisJCQlpZiAoIHJldCA8PSAwKQorCQkJCWdvdG8gZW5kOworCQkJZHRsczFfc3RvcF90aW1lcihzKTsKKwkJCWlmICggcy0+ZDEtPnNlbmRfY29va2llKSAvKiBzdGFydCBhZ2Fpbiwgd2l0aCBhIGNvb2tpZSAqLworCQkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19BOworCQkJZWxzZQorCQkJCXMtPnN0YXRlID0gU1NMM19TVF9DUl9DRVJUX0E7CisJCQlzLT5pbml0X251bSA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfQ1JfQ0VSVF9BOgorCQljYXNlIFNTTDNfU1RfQ1JfQ0VSVF9COgorI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQkJcmV0PXNzbDNfY2hlY2tfZmluaXNoZWQocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJaWYgKHJldCA9PSAyKQorCQkJCXsKKwkJCQlzLT5oaXQgPSAxOworCQkJCWlmIChzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkKQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX1NFU1NJT05fVElDS0VUX0E7CisJCQkJZWxzZQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0ZJTklTSEVEX0E7CisJCQkJcy0+aW5pdF9udW09MDsKKwkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCS8qIENoZWNrIGlmIGl0IGlzIGFub24gREggb3IgUFNLICovCisJCQlpZiAoIShzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoICYgU1NMX2FOVUxMKSAmJgorCQkJICAgICEocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleSAmIFNTTF9rUFNLKSkKKwkJCQl7CisJCQkJcmV0PXNzbDNfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzKTsKKwkJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQkJCWlmIChzLT50bHNleHRfc3RhdHVzX2V4cGVjdGVkKQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0NFUlRfU1RBVFVTX0E7CisJCQkJZWxzZQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0tFWV9FWENIX0E7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlza2lwID0gMTsKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0tFWV9FWENIX0E7CisJCQkJfQorI2Vsc2UKKwkJCQl9CisJCQllbHNlCisJCQkJc2tpcD0xOworCisJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0tFWV9FWENIX0E7CisjZW5kaWYKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfQ1JfS0VZX0VYQ0hfQToKKwkJY2FzZSBTU0wzX1NUX0NSX0tFWV9FWENIX0I6CisJCQlyZXQ9c3NsM19nZXRfa2V5X2V4Y2hhbmdlKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1JfQ0VSVF9SRVFfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisKKwkJCS8qIGF0IHRoaXMgcG9pbnQgd2UgY2hlY2sgdGhhdCB3ZSBoYXZlIHRoZQorCQkJICogcmVxdWlyZWQgc3R1ZmYgZnJvbSB0aGUgc2VydmVyICovCisJCQlpZiAoIXNzbDNfY2hlY2tfY2VydF9hbmRfYWxnb3JpdGhtKHMpKQorCQkJCXsKKwkJCQlyZXQ9IC0xOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9DUl9DRVJUX1JFUV9BOgorCQljYXNlIFNTTDNfU1RfQ1JfQ0VSVF9SRVFfQjoKKwkJCXJldD1zc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1JfU1JWUl9ET05FX0E7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NSX1NSVlJfRE9ORV9BOgorCQljYXNlIFNTTDNfU1RfQ1JfU1JWUl9ET05FX0I6CisJCQlyZXQ9c3NsM19nZXRfc2VydmVyX2RvbmUocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJaWYgKHMtPnMzLT50bXAuY2VydF9yZXEpCisJCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DRVJUX0E7CisJCQllbHNlCisJCQkJcy0+c3RhdGU9U1NMM19TVF9DV19LRVlfRVhDSF9BOworCQkJcy0+aW5pdF9udW09MDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfQToKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfQjoKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfQzoKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfRDoKKwkJCWR0bHMxX3N0YXJ0X3RpbWVyKHMpOworCQkJcmV0PWR0bHMxX3NlbmRfY2xpZW50X2NlcnRpZmljYXRlKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfS0VZX0VYQ0hfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfQ1dfS0VZX0VYQ0hfQToKKwkJY2FzZSBTU0wzX1NUX0NXX0tFWV9FWENIX0I6CisJCQlkdGxzMV9zdGFydF90aW1lcihzKTsKKwkJCXJldD1kdGxzMV9zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2Uocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJLyogRUFZIEVBWSBFQVkgbmVlZCB0byBjaGVjayBmb3IgREggZml4IGNlcnQKKwkJCSAqIHNlbnQgYmFjayAqLworCQkJLyogRm9yIFRMUywgY2VydF9yZXEgaXMgc2V0IHRvIDIsIHNvIGEgY2VydCBjaGFpbgorCQkJICogb2Ygbm90aGluZyBpcyBzZW50LCBidXQgbm8gdmVyaWZ5IHBhY2tldCBpcyBzZW50ICovCisJCQlpZiAocy0+czMtPnRtcC5jZXJ0X3JlcSA9PSAxKQorCQkJCXsKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0NFUlRfVlJGWV9BOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DSEFOR0VfQTsKKwkJCQlzLT5zMy0+Y2hhbmdlX2NpcGhlcl9zcGVjPTA7CisJCQkJfQorCisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfVlJGWV9BOgorCQljYXNlIFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0I6CisJCQlkdGxzMV9zdGFydF90aW1lcihzKTsKKwkJCXJldD1kdGxzMV9zZW5kX2NsaWVudF92ZXJpZnkocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DSEFOR0VfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlzLT5zMy0+Y2hhbmdlX2NpcGhlcl9zcGVjPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfQ1dfQ0hBTkdFX0E6CisJCWNhc2UgU1NMM19TVF9DV19DSEFOR0VfQjoKKwkJCWR0bHMxX3N0YXJ0X3RpbWVyKHMpOworCQkJcmV0PWR0bHMxX3NlbmRfY2hhbmdlX2NpcGhlcl9zcGVjKHMsCisJCQkJU1NMM19TVF9DV19DSEFOR0VfQSxTU0wzX1NUX0NXX0NIQU5HRV9CKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0ZJTklTSEVEX0E7CisJCQlzLT5pbml0X251bT0wOworCisJCQlzLT5zZXNzaW9uLT5jaXBoZXI9cy0+czMtPnRtcC5uZXdfY2lwaGVyOworI2lmZGVmIE9QRU5TU0xfTk9fQ09NUAorCQkJcy0+c2Vzc2lvbi0+Y29tcHJlc3NfbWV0aD0wOworI2Vsc2UKKwkJCWlmIChzLT5zMy0+dG1wLm5ld19jb21wcmVzc2lvbiA9PSBOVUxMKQorCQkJCXMtPnNlc3Npb24tPmNvbXByZXNzX21ldGg9MDsKKwkJCWVsc2UKKwkJCQlzLT5zZXNzaW9uLT5jb21wcmVzc19tZXRoPQorCQkJCQlzLT5zMy0+dG1wLm5ld19jb21wcmVzc2lvbi0+aWQ7CisjZW5kaWYKKwkJCWlmICghcy0+bWV0aG9kLT5zc2wzX2VuYy0+c2V0dXBfa2V5X2Jsb2NrKHMpKQorCQkJCXsKKwkJCQlyZXQ9IC0xOworCQkJCWdvdG8gZW5kOworCQkJCX0KKworCQkJaWYgKCFzLT5tZXRob2QtPnNzbDNfZW5jLT5jaGFuZ2VfY2lwaGVyX3N0YXRlKHMsCisJCQkJU1NMM19DSEFOR0VfQ0lQSEVSX0NMSUVOVF9XUklURSkpCisJCQkJeworCQkJCXJldD0gLTE7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJCisJCQlkdGxzMV9yZXNldF9zZXFfbnVtYmVycyhzLCBTU0wzX0NDX1dSSVRFKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9DV19GSU5JU0hFRF9BOgorCQljYXNlIFNTTDNfU1RfQ1dfRklOSVNIRURfQjoKKwkJCWR0bHMxX3N0YXJ0X3RpbWVyKHMpOworCQkJcmV0PWR0bHMxX3NlbmRfZmluaXNoZWQocywKKwkJCQlTU0wzX1NUX0NXX0ZJTklTSEVEX0EsU1NMM19TVF9DV19GSU5JU0hFRF9CLAorCQkJCXMtPm1ldGhvZC0+c3NsM19lbmMtPmNsaWVudF9maW5pc2hlZF9sYWJlbCwKKwkJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5jbGllbnRfZmluaXNoZWRfbGFiZWxfbGVuKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0ZMVVNIOworCisJCQkvKiBjbGVhciBmbGFncyAqLworCQkJcy0+czMtPmZsYWdzJj0gflNTTDNfRkxBR1NfUE9QX0JVRkZFUjsKKwkJCWlmIChzLT5oaXQpCisJCQkJeworCQkJCXMtPnMzLT50bXAubmV4dF9zdGF0ZT1TU0xfU1RfT0s7CisJCQkJaWYgKHMtPnMzLT5mbGFncyAmIFNTTDNfRkxBR1NfREVMQVlfQ0xJRU5UX0ZJTklTSEVEKQorCQkJCQl7CisJCQkJCXMtPnN0YXRlPVNTTF9TVF9PSzsKKwkJCQkJcy0+czMtPmZsYWdzfD1TU0wzX0ZMQUdTX1BPUF9CVUZGRVI7CisJCQkJCXMtPnMzLT5kZWxheV9idWZfcG9wX3JldD0wOworCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJCQkvKiBBbGxvdyBOZXdTZXNzaW9uVGlja2V0IGlmIHRpY2tldCBleHBlY3RlZCAqLworCQkJCWlmIChzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkKQorCQkJCQlzLT5zMy0+dG1wLm5leHRfc3RhdGU9U1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BOworCQkJCWVsc2UKKyNlbmRpZgorCQkJCQorCQkJCXMtPnMzLT50bXAubmV4dF9zdGF0ZT1TU0wzX1NUX0NSX0ZJTklTSEVEX0E7CisJCQkJfQorCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWNhc2UgU1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BOgorCQljYXNlIFNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQjoKKwkJCXJldD1zc2wzX2dldF9uZXdfc2Vzc2lvbl90aWNrZXQocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+c3RhdGU9U1NMM19TVF9DUl9GSU5JU0hFRF9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NSX0NFUlRfU1RBVFVTX0E6CisJCWNhc2UgU1NMM19TVF9DUl9DRVJUX1NUQVRVU19COgorCQkJcmV0PXNzbDNfZ2V0X2NlcnRfc3RhdHVzKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1JfS0VZX0VYQ0hfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisJCWJyZWFrOworI2VuZGlmCisKKwkJY2FzZSBTU0wzX1NUX0NSX0ZJTklTSEVEX0E6CisJCWNhc2UgU1NMM19TVF9DUl9GSU5JU0hFRF9COgorCQkJcy0+ZDEtPmNoYW5nZV9jaXBoZXJfc3BlY19vayA9IDE7CisJCQlyZXQ9c3NsM19nZXRfZmluaXNoZWQocyxTU0wzX1NUX0NSX0ZJTklTSEVEX0EsCisJCQkJU1NMM19TVF9DUl9GSU5JU0hFRF9CKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlkdGxzMV9zdG9wX3RpbWVyKHMpOworCisJCQlpZiAocy0+aGl0KQorCQkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfQ0hBTkdFX0E7CisJCQllbHNlCisJCQkJcy0+c3RhdGU9U1NMX1NUX09LOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9DV19GTFVTSDoKKwkJCXMtPnJ3c3RhdGU9U1NMX1dSSVRJTkc7CisJCQlpZiAoQklPX2ZsdXNoKHMtPndiaW8pIDw9IDApCisJCQkJeworCQkJCXJldD0gLTE7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJCXMtPnN0YXRlPXMtPnMzLT50bXAubmV4dF9zdGF0ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMX1NUX09LOgorCQkJLyogY2xlYW4gYSBmZXcgdGhpbmdzIHVwICovCisJCQlzc2wzX2NsZWFudXBfa2V5X2Jsb2NrKHMpOworCisjaWYgMAorCQkJaWYgKHMtPmluaXRfYnVmICE9IE5VTEwpCisJCQkJeworCQkJCUJVRl9NRU1fZnJlZShzLT5pbml0X2J1Zik7CisJCQkJcy0+aW5pdF9idWY9TlVMTDsKKwkJCQl9CisjZW5kaWYKKworCQkJLyogSWYgd2UgYXJlIG5vdCAnam9pbmluZycgdGhlIGxhc3QgdHdvIHBhY2tldHMsCisJCQkgKiByZW1vdmUgdGhlIGJ1ZmZlcmluZyBub3cgKi8KKwkJCWlmICghKHMtPnMzLT5mbGFncyAmIFNTTDNfRkxBR1NfUE9QX0JVRkZFUikpCisJCQkJc3NsX2ZyZWVfd2Jpb19idWZmZXIocyk7CisJCQkvKiBlbHNlIGRvIGl0IGxhdGVyIGluIHNzbDNfd3JpdGUgKi8KKworCQkJcy0+aW5pdF9udW09MDsKKwkJCXMtPm5ld19zZXNzaW9uPTA7CisKKwkJCXNzbF91cGRhdGVfY2FjaGUocyxTU0xfU0VTU19DQUNIRV9DTElFTlQpOworCQkJaWYgKHMtPmhpdCkgcy0+Y3R4LT5zdGF0cy5zZXNzX2hpdCsrOworCisJCQlyZXQ9MTsKKwkJCS8qIHMtPnNlcnZlcj0wOyAqLworCQkJcy0+aGFuZHNoYWtlX2Z1bmM9ZHRsczFfY29ubmVjdDsKKwkJCXMtPmN0eC0+c3RhdHMuc2Vzc19jb25uZWN0X2dvb2QrKzsKKworCQkJaWYgKGNiICE9IE5VTEwpIGNiKHMsU1NMX0NCX0hBTkRTSEFLRV9ET05FLDEpOworCisJCQkvKiBkb25lIHdpdGggaGFuZHNoYWtpbmcgKi8KKwkJCXMtPmQxLT5oYW5kc2hha2VfcmVhZF9zZXEgID0gMDsKKwkJCXMtPmQxLT5uZXh0X2hhbmRzaGFrZV93cml0ZV9zZXEgPSAwOworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKwkJCQorCQlkZWZhdWx0OgorCQkJU1NMZXJyKFNTTF9GX0RUTFMxX0NPTk5FQ1QsU1NMX1JfVU5LTk9XTl9TVEFURSk7CisJCQlyZXQ9IC0xOworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKwkJCX0KKworCQkvKiBkaWQgd2UgZG8gYW55dGhpbmcgKi8KKwkJaWYgKCFzLT5zMy0+dG1wLnJldXNlX21lc3NhZ2UgJiYgIXNraXApCisJCQl7CisJCQlpZiAocy0+ZGVidWcpCisJCQkJeworCQkJCWlmICgocmV0PUJJT19mbHVzaChzLT53YmlvKSkgPD0gMCkKKwkJCQkJZ290byBlbmQ7CisJCQkJfQorCisJCQlpZiAoKGNiICE9IE5VTEwpICYmIChzLT5zdGF0ZSAhPSBzdGF0ZSkpCisJCQkJeworCQkJCW5ld19zdGF0ZT1zLT5zdGF0ZTsKKwkJCQlzLT5zdGF0ZT1zdGF0ZTsKKwkJCQljYihzLFNTTF9DQl9DT05ORUNUX0xPT1AsMSk7CisJCQkJcy0+c3RhdGU9bmV3X3N0YXRlOworCQkJCX0KKwkJCX0KKwkJc2tpcD0wOworCQl9CitlbmQ6CisJcy0+aW5faGFuZHNoYWtlLS07CisJaWYgKGJ1ZiAhPSBOVUxMKQorCQlCVUZfTUVNX2ZyZWUoYnVmKTsKKwlpZiAoY2IgIT0gTlVMTCkKKwkJY2IocyxTU0xfQ0JfQ09OTkVDVF9FWElULHJldCk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgZHRsczFfY2xpZW50X2hlbGxvKFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnAsKmQ7CisJdW5zaWduZWQgaW50IGksajsKKwl1bnNpZ25lZCBsb25nIFRpbWUsbDsKKwlTU0xfQ09NUCAqY29tcDsKKworCWJ1Zj0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQSkKKwkJeworCQlTU0xfU0VTU0lPTiAqc2VzcyA9IHMtPnNlc3Npb247CisJCWlmICgocy0+c2Vzc2lvbiA9PSBOVUxMKSB8fAorCQkJKHMtPnNlc3Npb24tPnNzbF92ZXJzaW9uICE9IHMtPnZlcnNpb24pIHx8CisjaWZkZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJCSFzZXNzLT5zZXNzaW9uX2lkX2xlbmd0aCB8fAorI2Vsc2UKKwkJCSghc2Vzcy0+c2Vzc2lvbl9pZF9sZW5ndGggJiYgIXNlc3MtPnRsc2V4dF90aWNrKSB8fAorI2VuZGlmCisJCQkocy0+c2Vzc2lvbi0+bm90X3Jlc3VtYWJsZSkpCisJCQl7CisJCSAgICAgICAgaWYgKCFzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQpCisJCQkJeworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfQ0xJRU5UX0hFTExPLFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoIXNzbF9nZXRfbmV3X3Nlc3Npb24ocywwKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJLyogZWxzZSB1c2UgdGhlIHByZS1sb2FkZWQgc2Vzc2lvbiAqLworCisJCXA9cy0+czMtPmNsaWVudF9yYW5kb207CisKKwkJLyogaWYgY2xpZW50X3JhbmRvbSBpcyBpbml0aWFsaXplZCwgcmV1c2UgaXQsIHdlIGFyZQorCQkgKiByZXF1aXJlZCB0byB1c2Ugc2FtZSB1cG9uIHJlcGx5IHRvIEhlbGxvVmVyaWZ5ICovCisJCWZvciAoaT0wO3BbaV09PSdcMCcgJiYgaTxzaXplb2Yocy0+czMtPmNsaWVudF9yYW5kb20pO2krKykgOworCQlpZiAoaT09c2l6ZW9mKHMtPnMzLT5jbGllbnRfcmFuZG9tKSkKKwkJCXsKKwkJCVRpbWU9KHVuc2lnbmVkIGxvbmcpdGltZShOVUxMKTsJLyogVGltZSAqLworCQkJbDJuKFRpbWUscCk7CisJCQlSQU5EX3BzZXVkb19ieXRlcyhwLHNpemVvZihzLT5zMy0+Y2xpZW50X3JhbmRvbSktNCk7CisJCQl9CisKKwkJLyogRG8gdGhlIG1lc3NhZ2UgdHlwZSBhbmQgbGVuZ3RoIGxhc3QgKi8KKwkJZD1wPSAmKGJ1ZltEVExTMV9ITV9IRUFERVJfTEVOR1RIXSk7CisKKwkJKihwKyspPXMtPnZlcnNpb24+Pjg7CisJCSoocCsrKT1zLT52ZXJzaW9uJjB4ZmY7CisJCXMtPmNsaWVudF92ZXJzaW9uPXMtPnZlcnNpb247CisKKwkJLyogUmFuZG9tIHN0dWZmICovCisJCW1lbWNweShwLHMtPnMzLT5jbGllbnRfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUpOworCQlwKz1TU0wzX1JBTkRPTV9TSVpFOworCisJCS8qIFNlc3Npb24gSUQgKi8KKwkJaWYgKHMtPm5ld19zZXNzaW9uKQorCQkJaT0wOworCQllbHNlCisJCQlpPXMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoOworCQkqKHArKyk9aTsKKwkJaWYgKGkgIT0gMCkKKwkJCXsKKwkJCWlmIChpID4gc2l6ZW9mIHMtPnNlc3Npb24tPnNlc3Npb25faWQpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9DTElFTlRfSEVMTE8sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQltZW1jcHkocCxzLT5zZXNzaW9uLT5zZXNzaW9uX2lkLGkpOworCQkJcCs9aTsKKwkJCX0KKwkJCisJCS8qIGNvb2tpZSBzdHVmZiAqLworCQlpZiAoIHMtPmQxLT5jb29raWVfbGVuID4gc2l6ZW9mKHMtPmQxLT5jb29raWUpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX0NMSUVOVF9IRUxMTywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCSoocCsrKSA9IHMtPmQxLT5jb29raWVfbGVuOworCQltZW1jcHkocCwgcy0+ZDEtPmNvb2tpZSwgcy0+ZDEtPmNvb2tpZV9sZW4pOworCQlwICs9IHMtPmQxLT5jb29raWVfbGVuOworCisJCS8qIENpcGhlcnMgc3VwcG9ydGVkICovCisJCWk9c3NsX2NpcGhlcl9saXN0X3RvX2J5dGVzKHMsU1NMX2dldF9jaXBoZXJzKHMpLCYocFsyXSksMCk7CisJCWlmIChpID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfQ0xJRU5UX0hFTExPLFNTTF9SX05PX0NJUEhFUlNfQVZBSUxBQkxFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlzMm4oaSxwKTsKKwkJcCs9aTsKKworCQkvKiBDT01QUkVTU0lPTiAqLworCQlpZiAocy0+Y3R4LT5jb21wX21ldGhvZHMgPT0gTlVMTCkKKwkJCWo9MDsKKwkJZWxzZQorCQkJaj1za19TU0xfQ09NUF9udW0ocy0+Y3R4LT5jb21wX21ldGhvZHMpOworCQkqKHArKyk9MStqOworCQlmb3IgKGk9MDsgaTxqOyBpKyspCisJCQl7CisJCQljb21wPXNrX1NTTF9DT01QX3ZhbHVlKHMtPmN0eC0+Y29tcF9tZXRob2RzLGkpOworCQkJKihwKyspPWNvbXAtPmlkOworCQkJfQorCQkqKHArKyk9MDsgLyogQWRkIHRoZSBOVUxMIG1ldGhvZCAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWlmICgocCA9IHNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0KHMsIHAsIGJ1ZitTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpKSA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX0NMSUVOVF9IRUxMTyxFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKyNlbmRpZgkJCisKKwkJbD0ocC1kKTsKKwkJZD1idWY7CisKKwkJZCA9IGR0bHMxX3NldF9tZXNzYWdlX2hlYWRlcihzLCBkLCBTU0wzX01UX0NMSUVOVF9IRUxMTywgbCwgMCwgbCk7CisKKwkJcy0+c3RhdGU9U1NMM19TVF9DV19DTE5UX0hFTExPX0I7CisJCS8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLworCQlzLT5pbml0X251bT1wLWJ1ZjsKKwkJcy0+aW5pdF9vZmY9MDsKKworCQkvKiBidWZmZXIgdGhlIG1lc3NhZ2UgdG8gaGFuZGxlIHJlLXhtaXRzICovCisJCWR0bHMxX2J1ZmZlcl9tZXNzYWdlKHMsIDApOworCQl9CisKKwkvKiBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQiAqLworCXJldHVybihkdGxzMV9kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CitlcnI6CisJcmV0dXJuKC0xKTsKKwl9CisKK3N0YXRpYyBpbnQgZHRsczFfZ2V0X2hlbGxvX3ZlcmlmeShTU0wgKnMpCisJeworCWludCBuLCBhbCwgb2sgPSAwOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJdW5zaWduZWQgaW50IGNvb2tpZV9sZW47CisKKwluPXMtPm1ldGhvZC0+c3NsX2dldF9tZXNzYWdlKHMsCisJCURUTFMxX1NUX0NSX0hFTExPX1ZFUklGWV9SRVFVRVNUX0EsCisJCURUTFMxX1NUX0NSX0hFTExPX1ZFUklGWV9SRVFVRVNUX0IsCisJCS0xLAorCQlzLT5tYXhfY2VydF9saXN0LAorCQkmb2spOworCisJaWYgKCFvaykgcmV0dXJuKChpbnQpbik7CisKKwlpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgIT0gRFRMUzFfTVRfSEVMTE9fVkVSSUZZX1JFUVVFU1QpCisJCXsKKwkJcy0+ZDEtPnNlbmRfY29va2llID0gMDsKKwkJcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlPTE7CisJCXJldHVybigxKTsKKwkJfQorCisJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9tc2c7CisKKwlpZiAoKGRhdGFbMF0gIT0gKHMtPnZlcnNpb24+PjgpKSB8fCAoZGF0YVsxXSAhPSAocy0+dmVyc2lvbiYweGZmKSkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX0RUTFMxX0dFVF9IRUxMT19WRVJJRlksU1NMX1JfV1JPTkdfU1NMX1ZFUlNJT04pOworCQlzLT52ZXJzaW9uPShzLT52ZXJzaW9uJjB4ZmYwMCl8ZGF0YVsxXTsKKwkJYWwgPSBTU0xfQURfUFJPVE9DT0xfVkVSU0lPTjsKKwkJZ290byBmX2VycjsKKwkJfQorCWRhdGErPTI7CisKKwljb29raWVfbGVuID0gKihkYXRhKyspOworCWlmICggY29va2llX2xlbiA+IHNpemVvZihzLT5kMS0+Y29va2llKSkKKwkJeworCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCWdvdG8gZl9lcnI7CisJCX0KKworCW1lbWNweShzLT5kMS0+Y29va2llLCBkYXRhLCBjb29raWVfbGVuKTsKKwlzLT5kMS0+Y29va2llX2xlbiA9IGNvb2tpZV9sZW47CisKKwlzLT5kMS0+c2VuZF9jb29raWUgPSAxOworCXJldHVybiAxOworCitmX2VycjoKKwlzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgYWwpOworCXJldHVybiAtMTsKKwl9CisKK2ludCBkdGxzMV9zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwLCpkOworCWludCBuOworCXVuc2lnbmVkIGxvbmcgYWxnX2s7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJdW5zaWduZWQgY2hhciAqcTsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorICAgICAgICBLU1NMX0VSUiBrc3NsX2VycjsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0tSQjUgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJRUNfS0VZICpjbG50X2VjZGggPSBOVUxMOworCWNvbnN0IEVDX1BPSU5UICpzcnZyX2VjcG9pbnQgPSBOVUxMOworCUVWUF9QS0VZICpzcnZyX3B1Yl9wa2V5ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICplbmNvZGVkUG9pbnQgPSBOVUxMOworCWludCBlbmNvZGVkX3B0X2xlbiA9IDA7CisJQk5fQ1RYICogYm5fY3R4ID0gTlVMTDsKKyNlbmRpZgorCisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfQ1dfS0VZX0VYQ0hfQSkKKwkJeworCQlkPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCXA9ICYoZFtEVExTMV9ITV9IRUFERVJfTEVOR1RIXSk7CisJCQorCQlhbGdfaz1zLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OworCisgICAgICAgICAgICAgICAgLyogRm9vbCBlbWFjcyBpbmRlbnRhdGlvbiAqLworICAgICAgICAgICAgICAgIGlmICgwKSB7fQorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQllbHNlIGlmIChhbGdfayAmIFNTTF9rUlNBKQorCQkJeworCQkJUlNBICpyc2E7CisJCQl1bnNpZ25lZCBjaGFyIHRtcF9idWZbU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSF07CisKKwkJCWlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcnNhX3RtcCAhPSBOVUxMKQorCQkJCXJzYT1zLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcnNhX3RtcDsKKwkJCWVsc2UKKwkJCQl7CisJCQkJcGtleT1YNTA5X2dldF9wdWJrZXkocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX3BrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLng1MDkpOworCQkJCWlmICgocGtleSA9PSBOVUxMKSB8fAorCQkJCQkocGtleS0+dHlwZSAhPSBFVlBfUEtFWV9SU0EpIHx8CisJCQkJCShwa2V5LT5wa2V5LnJzYSA9PSBOVUxMKSkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlyc2E9cGtleS0+cGtleS5yc2E7CisJCQkJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwkJCQl9CisJCQkJCisJCQl0bXBfYnVmWzBdPXMtPmNsaWVudF92ZXJzaW9uPj44OworCQkJdG1wX2J1ZlsxXT1zLT5jbGllbnRfdmVyc2lvbiYweGZmOworCQkJaWYgKFJBTkRfYnl0ZXMoJih0bXBfYnVmWzJdKSxzaXplb2YgdG1wX2J1Zi0yKSA8PSAwKQorCQkJCQlnb3RvIGVycjsKKworCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg9c2l6ZW9mIHRtcF9idWY7CisKKwkJCXE9cDsKKwkJCS8qIEZpeCBidWYgZm9yIFRMUyBhbmQgW2luY2lkZW50YWxseV0gRFRMUyAqLworCQkJaWYgKHMtPnZlcnNpb24gPiBTU0wzX1ZFUlNJT04pCisJCQkJcCs9MjsKKwkJCW49UlNBX3B1YmxpY19lbmNyeXB0KHNpemVvZiB0bXBfYnVmLAorCQkJCXRtcF9idWYscCxyc2EsUlNBX1BLQ1MxX1BBRERJTkcpOworI2lmZGVmIFBLQ1MxX0NIRUNLCisJCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9QS0NTMV9DSEVDS18xKSBwWzFdKys7CisJCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9QS0NTMV9DSEVDS18yKSB0bXBfYnVmWzBdPTB4NzA7CisjZW5kaWYKKwkJCWlmIChuIDw9IDApCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsU1NMX1JfQkFEX1JTQV9FTkNSWVBUKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCS8qIEZpeCBidWYgZm9yIFRMUyBhbmQgW2luY2lkZW50YWxseV0gRFRMUyAqLworCQkJaWYgKHMtPnZlcnNpb24gPiBTU0wzX1ZFUlNJT04pCisJCQkJeworCQkJCXMybihuLHEpOworCQkJCW4rPTI7CisJCQkJfQorCisJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aD0KKwkJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KHMsCisJCQkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXksCisJCQkJCXRtcF9idWYsc2l6ZW9mIHRtcF9idWYpOworCQkJT1BFTlNTTF9jbGVhbnNlKHRtcF9idWYsc2l6ZW9mIHRtcF9idWYpOworCQkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCQllbHNlIGlmIChhbGdfayAmIFNTTF9rS1JCNSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfZXJyb3JfY29kZQlrcmI1cmM7CisgICAgICAgICAgICAgICAgICAgICAgICBLU1NMX0NUWAkqa3NzbF9jdHggPSBzLT5rc3NsX2N0eDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qICBrcmI1X2RhdGEJa3JiNV9hcF9yZXE7ICAqLworICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kYXRhCSplbmNfdGlja2V0OworICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kYXRhCWF1dGhlbnRpY2F0b3IsICphdXRocCA9IE5VTEw7CisJCQlFVlBfQ0lQSEVSX0NUWAljaXBoX2N0eDsKKwkJCWNvbnN0IEVWUF9DSVBIRVIgKmVuYyA9IE5VTEw7CisJCQl1bnNpZ25lZCBjaGFyCWl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKKwkJCXVuc2lnbmVkIGNoYXIJdG1wX2J1ZltTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIXTsKKwkJCXVuc2lnbmVkIGNoYXIJZXBtc1tTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIIAorCQkJCQkJKyBFVlBfTUFYX0lWX0xFTkdUSF07CisJCQlpbnQgCQlwYWRsLCBvdXRsID0gc2l6ZW9mKGVwbXMpOworCisJCQlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjaXBoX2N0eCk7CisKKyNpZmRlZiBLU1NMX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlKCVseCAmICVseClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ19rLCBTU0xfa0tSQjUpOworI2VuZGlmCS8qIEtTU0xfREVCVUcgKi8KKworCQkJYXV0aHAgPSBOVUxMOworI2lmZGVmIEtSQjVTRU5EQVVUSAorCQkJaWYgKEtSQjVTRU5EQVVUSCkgIGF1dGhwID0gJmF1dGhlbnRpY2F0b3I7CisjZW5kaWYJLyogS1JCNVNFTkRBVVRIICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVyYyA9IGtzc2xfY2dldF90a3Qoa3NzbF9jdHgsICZlbmNfdGlja2V0LCBhdXRocCwKKwkJCQkma3NzbF9lcnIpOworCQkJZW5jID0ga3NzbF9tYXBfZW5jKGtzc2xfY3R4LT5lbmN0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyNpZmRlZiBLU1NMX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoImtzc2xfY2dldF90a3QgcnRuICVkXG4iLCBrcmI1cmMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtyYjVyYyAmJiBrc3NsX2Vyci50ZXh0KQorCQkJICBwcmludGYoImtzc2xfY2dldF90a3Qga3NzbF9lcnI9JXNcbiIsIGtzc2xfZXJyLnRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCS8qIEtTU0xfREVCVUcgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtyYjVyYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLAorCQkJCQkJU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJCWtzc2xfZXJyLnJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKwkJCS8qICAyMDAxMDQwNiBWUlMgLSBFYXJsaWVyIHZlcnNpb25zIHVzZWQgS1JCNSBBUF9SRVEKKwkJCSoqICBpbiBwbGFjZSBvZiBSRkMgMjcxMiBLZXJiZXJvc1dyYXBwZXIsIGFzIGluOgorCQkJKioKKyAgICAgICAgICAgICAgICAgICAgICAgICoqICBTZW5kIHRpY2tldCAoY29weSB0byAqcCwgc2V0IG4gPSBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAqKiAgbiA9IGtyYjVfYXBfcmVxLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICoqICBtZW1jcHkocCwga3JiNV9hcF9yZXEuZGF0YSwga3JiNV9hcF9yZXEubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoqICBpZiAoa3JiNV9hcF9yZXEuZGF0YSkgIAorICAgICAgICAgICAgICAgICAgICAgICAgKiogICAga3NzbF9rcmI1X2ZyZWVfZGF0YV9jb250ZW50cyhOVUxMLCZrcmI1X2FwX3JlcSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKgorCQkJKiogIE5vdyB1c2luZyByZWFsIFJGQyAyNzEyIEtlcmJlcm9zV3JhcHBlcgorCQkJKiogIChUaGFua3MgdG8gU2ltb24gV2lsa2luc29uIDxzeHdAc3h3Lm9yZy51az4pCisJCQkqKiAgTm90ZTogMjcxMiAib3BhcXVlIiB0eXBlcyBhcmUgaGVyZSByZXBsYWNlZAorCQkJKiogIHdpdGggYSAyLWJ5dGUgbGVuZ3RoIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZS4KKwkJCSoqICBFeGFtcGxlOgorCQkJKiogIEtlcmJlcm9zV3JhcHBlcj0geHggeHggYXNuMXRpY2tldCAwIDAgeHggeHggZW5jcG1zCisJCQkqKiAgV2hlcmUgInh4IHh4IiA9IGxlbmd0aCBieXRlcy4gIFNob3duIGhlcmUgd2l0aAorCQkJKiogIG9wdGlvbmFsIGF1dGhlbnRpY2F0b3Igb21pdHRlZC4KKwkJCSovCisKKwkJCS8qICBLZXJiZXJvc1dyYXBwZXIuVGlja2V0CQkqLworCQkJczJuKGVuY190aWNrZXQtPmxlbmd0aCxwKTsKKwkJCW1lbWNweShwLCBlbmNfdGlja2V0LT5kYXRhLCBlbmNfdGlja2V0LT5sZW5ndGgpOworCQkJcCs9IGVuY190aWNrZXQtPmxlbmd0aDsKKwkJCW4gPSBlbmNfdGlja2V0LT5sZW5ndGggKyAyOworCisJCQkvKiAgS2VyYmVyb3NXcmFwcGVyLkF1dGhlbnRpY2F0b3IJKi8KKwkJCWlmIChhdXRocCAgJiYgIGF1dGhwLT5sZW5ndGgpICAKKwkJCQl7CisJCQkJczJuKGF1dGhwLT5sZW5ndGgscCk7CisJCQkJbWVtY3B5KHAsIGF1dGhwLT5kYXRhLCBhdXRocC0+bGVuZ3RoKTsKKwkJCQlwKz0gYXV0aHAtPmxlbmd0aDsKKwkJCQluKz0gYXV0aHAtPmxlbmd0aCArIDI7CisJCQkJCisJCQkJZnJlZShhdXRocC0+ZGF0YSk7CisJCQkJYXV0aHAtPmRhdGEgPSBOVUxMOworCQkJCWF1dGhwLT5sZW5ndGggPSAwOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJczJuKDAscCk7LyogIG51bGwgYXV0aGVudGljYXRvciBsZW5ndGgJKi8KKwkJCQluKz0yOworCQkJCX0KKyAKKwkJCWlmIChSQU5EX2J5dGVzKHRtcF9idWYsc2l6ZW9mIHRtcF9idWYpIDw9IDApCisJCQkgICAgZ290byBlcnI7CisKKwkJCS8qICAyMDAxMDQyMCBWUlMuICBUcmllZCBpdCB0aGlzIHdheTsgZmFpbGVkLgorCQkJKioJRVZQX0VuY3J5cHRJbml0X2V4KCZjaXBoX2N0eCxlbmMsIE5VTEwsTlVMTCk7CisJCQkqKglFVlBfQ0lQSEVSX0NUWF9zZXRfa2V5X2xlbmd0aCgmY2lwaF9jdHgsCisJCQkqKgkJCQlrc3NsX2N0eC0+bGVuZ3RoKTsKKwkJCSoqCUVWUF9FbmNyeXB0SW5pdF9leCgmY2lwaF9jdHgsTlVMTCwga2V5LGl2KTsKKwkJCSovCisKKwkJCW1lbXNldChpdiwgMCwgc2l6ZW9mIGl2KTsgIC8qIHBlciBSRkMgMTUxMCAqLworCQkJRVZQX0VuY3J5cHRJbml0X2V4KCZjaXBoX2N0eCxlbmMsIE5VTEwsCisJCQkJa3NzbF9jdHgtPmtleSxpdik7CisJCQlFVlBfRW5jcnlwdFVwZGF0ZSgmY2lwaF9jdHgsZXBtcywmb3V0bCx0bXBfYnVmLAorCQkJCXNpemVvZiB0bXBfYnVmKTsKKwkJCUVWUF9FbmNyeXB0RmluYWxfZXgoJmNpcGhfY3R4LCYoZXBtc1tvdXRsXSksJnBhZGwpOworCQkJb3V0bCArPSBwYWRsOworCQkJaWYgKG91dGwgPiAoaW50KXNpemVvZiBlcG1zKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY2lwaF9jdHgpOworCisJCQkvKiAgS2VyYmVyb3NXcmFwcGVyLkVuY3J5cHRlZFByZU1hc3RlclNlY3JldAkqLworCQkJczJuKG91dGwscCk7CisJCQltZW1jcHkocCwgZXBtcywgb3V0bCk7CisJCQlwKz1vdXRsOworCQkJbis9b3V0bCArIDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tZXRob2QtPnNzbDNfZW5jLT5nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KHMsCisJCQkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXksCisJCQkJCXRtcF9idWYsIHNpemVvZiB0bXBfYnVmKTsKKworCQkJT1BFTlNTTF9jbGVhbnNlKHRtcF9idWYsIHNpemVvZiB0bXBfYnVmKTsKKwkJCU9QRU5TU0xfY2xlYW5zZShlcG1zLCBvdXRsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCWVsc2UgaWYgKGFsZ19rICYgKFNTTF9rRURIfFNTTF9rREhyfFNTTF9rREhkKSkKKwkJCXsKKwkJCURIICpkaF9zcnZyLCpkaF9jbG50OworCisJCQlpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2RoX3RtcCAhPSBOVUxMKQorCQkJCWRoX3NydnI9cy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2RoX3RtcDsKKwkJCWVsc2UKKwkJCQl7CisJCQkJLyogd2UgZ2V0IHRoZW0gZnJvbSB0aGUgY2VydCAqLworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLFNTTF9SX1VOQUJMRV9UT19GSU5EX0RIX1BBUkFNRVRFUlMpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCQorCQkJLyogZ2VuZXJhdGUgYSBuZXcgcmFuZG9tIGtleSAqLworCQkJaWYgKChkaF9jbG50PURIcGFyYW1zX2R1cChkaF9zcnZyKSkgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSxFUlJfUl9ESF9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmICghREhfZ2VuZXJhdGVfa2V5KGRoX2NsbnQpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiB1c2UgdGhlICdwJyBvdXRwdXQgYnVmZmVyIGZvciB0aGUgREgga2V5LCBidXQKKwkJCSAqIG1ha2Ugc3VyZSB0byBjbGVhciBpdCBvdXQgYWZ0ZXJ3YXJkcyAqLworCisJCQluPURIX2NvbXB1dGVfa2V5KHAsZGhfc3J2ci0+cHViX2tleSxkaF9jbG50KTsKKworCQkJaWYgKG4gPD0gMCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSxFUlJfUl9ESF9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJLyogZ2VuZXJhdGUgbWFzdGVyIGtleSBmcm9tIHRoZSByZXN1bHQgKi8KKwkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoPQorCQkJCXMtPm1ldGhvZC0+c3NsM19lbmMtPmdlbmVyYXRlX21hc3Rlcl9zZWNyZXQocywKKwkJCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSxwLG4pOworCQkJLyogY2xlYW4gdXAgKi8KKwkJCW1lbXNldChwLDAsbik7CisKKwkJCS8qIHNlbmQgb2ZmIHRoZSBkYXRhICovCisJCQluPUJOX251bV9ieXRlcyhkaF9jbG50LT5wdWJfa2V5KTsKKwkJCXMybihuLHApOworCQkJQk5fYm4yYmluKGRoX2NsbnQtPnB1Yl9rZXkscCk7CisJCQluKz0yOworCisJCQlESF9mcmVlKGRoX2NsbnQpOworCisJCQkvKiBwZXJoYXBzIGNsZWFuIHRoaW5ncyB1cCBhIGJpdCBFQVkgRUFZIEVBWSBFQVkqLworCQkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESCAKKwkJZWxzZSBpZiAoYWxnX2sgJiAoU1NMX2tFRUNESHxTU0xfa0VDREhyfFNTTF9rRUNESGUpKQorCQkJeworCQkJY29uc3QgRUNfR1JPVVAgKnNydnJfZ3JvdXAgPSBOVUxMOworCQkJRUNfS0VZICp0a2V5OworCQkJaW50IGVjZGhfY2xudF9jZXJ0ID0gMDsKKwkJCWludCBmaWVsZF9zaXplID0gMDsKKworCQkJLyogRGlkIHdlIHNlbmQgb3V0IHRoZSBjbGllbnQncworCQkJICogRUNESCBzaGFyZSBmb3IgdXNlIGluIHByZW1hc3RlcgorCQkJICogY29tcHV0YXRpb24gYXMgcGFydCBvZiBjbGllbnQgY2VydGlmaWNhdGU/CisJCQkgKiBJZiBzbywgc2V0IGVjZGhfY2xudF9jZXJ0IHRvIDEuCisJCQkgKi8KKwkJCWlmICgoYWxnX2sgJiAoU1NMX2tFQ0RIcnxTU0xfa0VDREhlKSkgJiYgKHMtPmNlcnQgIT0gTlVMTCkpIAorCQkJCXsKKwkJCQkvKiBYWFg6IEZvciBub3csIHdlIGRvIG5vdCBzdXBwb3J0IGNsaWVudAorCQkJCSAqIGF1dGhlbnRpY2F0aW9uIHVzaW5nIEVDREggY2VydGlmaWNhdGVzLgorCQkJCSAqIFRvIGFkZCBzdWNoIHN1cHBvcnQsIG9uZSBuZWVkcyB0byBhZGQKKwkJCQkgKiBjb2RlIHRoYXQgY2hlY2tzIGZvciBhcHByb3ByaWF0ZSAKKwkJCQkgKiBjb25kaXRpb25zIGFuZCBzZXRzIGVjZGhfY2xudF9jZXJ0IHRvIDEuCisJCQkJICogRm9yIGV4YW1wbGUsIHRoZSBjZXJ0IGhhdmUgYW4gRUNDCisJCQkJICoga2V5IG9uIHRoZSBzYW1lIGN1cnZlIGFzIHRoZSBzZXJ2ZXIncworCQkJCSAqIGFuZCB0aGUga2V5IHNob3VsZCBiZSBhdXRob3JpemVkIGZvcgorCQkJCSAqIGtleSBhZ3JlZW1lbnQuCisJCQkJICoKKwkJCQkgKiBPbmUgYWxzbyBuZWVkcyB0byBhZGQgY29kZSBpbiBzc2wzX2Nvbm5lY3QKKwkJCQkgKiB0byBza2lwIHNlbmRpbmcgdGhlIGNlcnRpZmljYXRlIHZlcmlmeQorCQkJCSAqIG1lc3NhZ2UuCisJCQkJICoKKwkJCQkgKiBpZiAoKHMtPmNlcnQtPmtleS0+cHJpdmF0ZWtleSAhPSBOVUxMKSAmJgorCQkJCSAqICAgICAocy0+Y2VydC0+a2V5LT5wcml2YXRla2V5LT50eXBlID09CisJCQkJICogICAgICBFVlBfUEtFWV9FQykgJiYgLi4uKQorCQkJCSAqIGVjZGhfY2xudF9jZXJ0ID0gMTsKKwkJCQkgKi8KKwkJCQl9CisKKwkJCWlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfZWNkaF90bXAgIT0gTlVMTCkKKwkJCQl7CisJCQkJdGtleSA9IHMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9lY2RoX3RtcDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCS8qIEdldCB0aGUgU2VydmVyIFB1YmxpYyBLZXkgZnJvbSBDZXJ0ICovCisJCQkJc3J2cl9wdWJfcGtleSA9IFg1MDlfZ2V0X3B1YmtleShzLT5zZXNzaW9uLT4gXAorCQkJCSAgICBzZXNzX2NlcnQtPnBlZXJfcGtleXNbU1NMX1BLRVlfRUNDXS54NTA5KTsKKwkJCQlpZiAoKHNydnJfcHViX3BrZXkgPT0gTlVMTCkgfHwKKwkJCQkgICAgKHNydnJfcHViX3BrZXktPnR5cGUgIT0gRVZQX1BLRVlfRUMpIHx8CisJCQkJICAgIChzcnZyX3B1Yl9wa2V5LT5wa2V5LmVjID09IE5VTEwpKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJCSAgICBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisKKwkJCQl0a2V5ID0gc3J2cl9wdWJfcGtleS0+cGtleS5lYzsKKwkJCQl9CisKKwkJCXNydnJfZ3JvdXAgICA9IEVDX0tFWV9nZXQwX2dyb3VwKHRrZXkpOworCQkJc3J2cl9lY3BvaW50ID0gRUNfS0VZX2dldDBfcHVibGljX2tleSh0a2V5KTsKKworCQkJaWYgKChzcnZyX2dyb3VwID09IE5VTEwpIHx8IChzcnZyX2VjcG9pbnQgPT0gTlVMTCkpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJICAgIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCWlmICgoY2xudF9lY2RoPUVDX0tFWV9uZXcoKSkgPT0gTlVMTCkgCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJaWYgKCFFQ19LRVlfc2V0X2dyb3VwKGNsbnRfZWNkaCwgc3J2cl9ncm91cCkpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsRVJSX1JfRUNfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoZWNkaF9jbG50X2NlcnQpIAorCQkJCXsgCisJCQkJLyogUmV1c2Uga2V5IGluZm8gZnJvbSBvdXIgY2VydGlmaWNhdGUKKwkJCQkgKiBXZSBvbmx5IG5lZWQgb3VyIHByaXZhdGUga2V5IHRvIHBlcmZvcm0KKwkJCQkgKiB0aGUgRUNESCBjb21wdXRhdGlvbi4KKwkJCQkgKi8KKwkJCQljb25zdCBCSUdOVU0gKnByaXZfa2V5OworCQkJCXRrZXkgPSBzLT5jZXJ0LT5rZXktPnByaXZhdGVrZXktPnBrZXkuZWM7CisJCQkJcHJpdl9rZXkgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleSh0a2V5KTsKKwkJCQlpZiAocHJpdl9rZXkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlpZiAoIUVDX0tFWV9zZXRfcHJpdmF0ZV9rZXkoY2xudF9lY2RoLCBwcml2X2tleSkpCisJCQkJCXsKKwkJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSxFUlJfUl9FQ19MSUIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UgCisJCQkJeworCQkJCS8qIEdlbmVyYXRlIGEgbmV3IEVDREgga2V5IHBhaXIgKi8KKwkJCQlpZiAoIShFQ19LRVlfZ2VuZXJhdGVfa2V5KGNsbnRfZWNkaCkpKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsIEVSUl9SX0VDREhfTElCKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisKKwkJCS8qIHVzZSB0aGUgJ3AnIG91dHB1dCBidWZmZXIgZm9yIHRoZSBFQ0RIIGtleSwgYnV0CisJCQkgKiBtYWtlIHN1cmUgdG8gY2xlYXIgaXQgb3V0IGFmdGVyd2FyZHMKKwkJCSAqLworCisJCQlmaWVsZF9zaXplID0gRUNfR1JPVVBfZ2V0X2RlZ3JlZShzcnZyX2dyb3VwKTsKKwkJCWlmIChmaWVsZF9zaXplIDw9IDApCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsIAorCQkJCSAgICAgICBFUlJfUl9FQ0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJbj1FQ0RIX2NvbXB1dGVfa2V5KHAsIChmaWVsZF9zaXplKzcpLzgsIHNydnJfZWNwb2ludCwgY2xudF9lY2RoLCBOVUxMKTsKKwkJCWlmIChuIDw9IDApCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsIAorCQkJCSAgICAgICBFUlJfUl9FQ0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiBnZW5lcmF0ZSBtYXN0ZXIga2V5IGZyb20gdGhlIHJlc3VsdCAqLworCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGggPSBzLT5tZXRob2QtPnNzbDNfZW5jIFwKKwkJCSAgICAtPiBnZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KHMsIAorCQkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXksCisJCQkJcCwgbik7CisKKwkJCW1lbXNldChwLCAwLCBuKTsgLyogY2xlYW4gdXAgKi8KKworCQkJaWYgKGVjZGhfY2xudF9jZXJ0KSAKKwkJCQl7CisJCQkJLyogU2VuZCBlbXB0eSBjbGllbnQga2V5IGV4Y2ggbWVzc2FnZSAqLworCQkJCW4gPSAwOworCQkJCX0KKwkJCWVsc2UgCisJCQkJeworCQkJCS8qIEZpcnN0IGNoZWNrIHRoZSBzaXplIG9mIGVuY29kaW5nIGFuZAorCQkJCSAqIGFsbG9jYXRlIG1lbW9yeSBhY2NvcmRpbmdseS4KKwkJCQkgKi8KKwkJCQllbmNvZGVkX3B0X2xlbiA9IAorCQkJCSAgICBFQ19QT0lOVF9wb2ludDJvY3Qoc3J2cl9ncm91cCwgCisJCQkJCUVDX0tFWV9nZXQwX3B1YmxpY19rZXkoY2xudF9lY2RoKSwgCisJCQkJCVBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VELCAKKwkJCQkJTlVMTCwgMCwgTlVMTCk7CisKKwkJCQllbmNvZGVkUG9pbnQgPSAodW5zaWduZWQgY2hhciAqKSAKKwkJCQkgICAgT1BFTlNTTF9tYWxsb2MoZW5jb2RlZF9wdF9sZW4gKiAKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsgCisJCQkJYm5fY3R4ID0gQk5fQ1RYX25ldygpOworCQkJCWlmICgoZW5jb2RlZFBvaW50ID09IE5VTEwpIHx8IAorCQkJCSAgICAoYm5fY3R4ID09IE5VTEwpKSAKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKworCQkJCS8qIEVuY29kZSB0aGUgcHVibGljIGtleSAqLworCQkJCW4gPSBFQ19QT0lOVF9wb2ludDJvY3Qoc3J2cl9ncm91cCwgCisJCQkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoY2xudF9lY2RoKSwgCisJCQkJICAgIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VELCAKKwkJCQkgICAgZW5jb2RlZFBvaW50LCBlbmNvZGVkX3B0X2xlbiwgYm5fY3R4KTsKKworCQkJCSpwID0gbjsgLyogbGVuZ3RoIG9mIGVuY29kZWQgcG9pbnQgKi8KKwkJCQkvKiBFbmNvZGVkIHBvaW50IHdpbGwgYmUgY29waWVkIGhlcmUgKi8KKwkJCQlwICs9IDE7IAorCQkJCS8qIGNvcHkgdGhlIHBvaW50ICovCisJCQkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcCwgZW5jb2RlZFBvaW50LCBuKTsKKwkJCQkvKiBpbmNyZW1lbnQgbiB0byBhY2NvdW50IGZvciBsZW5ndGggZmllbGQgKi8KKwkJCQluICs9IDE7IAorCQkJCX0KKworCQkJLyogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisJCQlCTl9DVFhfZnJlZShibl9jdHgpOworCQkJaWYgKGVuY29kZWRQb2ludCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoZW5jb2RlZFBvaW50KTsKKwkJCWlmIChjbG50X2VjZGggIT0gTlVMTCkgCisJCQkJIEVDX0tFWV9mcmVlKGNsbnRfZWNkaCk7CisJCQlFVlBfUEtFWV9mcmVlKHNydnJfcHViX3BrZXkpOworCQkJfQorI2VuZGlmIC8qICFPUEVOU1NMX05PX0VDREggKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCQllbHNlIGlmIChhbGdfayAmIFNTTF9rUFNLKQorCQkJeworCQkJY2hhciBpZGVudGl0eVtQU0tfTUFYX0lERU5USVRZX0xFTl07CisJCQl1bnNpZ25lZCBjaGFyICp0ID0gTlVMTDsKKwkJCXVuc2lnbmVkIGNoYXIgcHNrX29yX3ByZV9tc1tQU0tfTUFYX1BTS19MRU4qMis0XTsKKwkJCXVuc2lnbmVkIGludCBwcmVfbXNfbGVuID0gMCwgcHNrX2xlbiA9IDA7CisJCQlpbnQgcHNrX2VyciA9IDE7CisKKwkJCW4gPSAwOworCQkJaWYgKHMtPnBza19jbGllbnRfY2FsbGJhY2sgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJU1NMX1JfUFNLX05PX0NMSUVOVF9DQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQlwc2tfbGVuID0gcy0+cHNrX2NsaWVudF9jYWxsYmFjayhzLCBzLT5jdHgtPnBza19pZGVudGl0eV9oaW50LAorCQkJCWlkZW50aXR5LCBQU0tfTUFYX0lERU5USVRZX0xFTiwKKwkJCQlwc2tfb3JfcHJlX21zLCBzaXplb2YocHNrX29yX3ByZV9tcykpOworCQkJaWYgKHBza19sZW4gPiBQU0tfTUFYX1BTS19MRU4pCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJCUVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIHBza19lcnI7CisJCQkJfQorCQkJZWxzZSBpZiAocHNrX2xlbiA9PSAwKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCQlTU0xfUl9QU0tfSURFTlRJVFlfTk9UX0ZPVU5EKTsKKwkJCQlnb3RvIHBza19lcnI7CisJCQkJfQorCisJCQkvKiBjcmVhdGUgUFNLIHByZV9tYXN0ZXJfc2VjcmV0ICovCisJCQlwcmVfbXNfbGVuID0gMitwc2tfbGVuKzIrcHNrX2xlbjsKKwkJCXQgPSBwc2tfb3JfcHJlX21zOworCQkJbWVtbW92ZShwc2tfb3JfcHJlX21zK3Bza19sZW4rNCwgcHNrX29yX3ByZV9tcywgcHNrX2xlbik7CisJCQlzMm4ocHNrX2xlbiwgdCk7CisJCQltZW1zZXQodCwgMCwgcHNrX2xlbik7CisJCQl0Kz1wc2tfbGVuOworCQkJczJuKHBza19sZW4sIHQpOworCisJCQlpZiAocy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5X2hpbnQgIT0gTlVMTCkKKwkJCQlPUEVOU1NMX2ZyZWUocy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5X2hpbnQpOworCQkJcy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5X2hpbnQgPSBCVUZfc3RyZHVwKHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQpOworCQkJaWYgKHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQgIT0gTlVMTCAmJgorCQkJCXMtPnNlc3Npb24tPnBza19pZGVudGl0eV9oaW50ID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIHBza19lcnI7CisJCQkJfQorCisJCQlpZiAocy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5ICE9IE5VTEwpCisJCQkJT1BFTlNTTF9mcmVlKHMtPnNlc3Npb24tPnBza19pZGVudGl0eSk7CisJCQlzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHkgPSBCVUZfc3RyZHVwKGlkZW50aXR5KTsKKwkJCWlmIChzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHkgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gcHNrX2VycjsKKwkJCQl9CisKKwkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoID0KKwkJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KHMsCisJCQkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXksCisJCQkJCXBza19vcl9wcmVfbXMsIHByZV9tc19sZW4pOyAKKwkJCW4gPSBzdHJsZW4oaWRlbnRpdHkpOworCQkJczJuKG4sIHApOworCQkJbWVtY3B5KHAsIGlkZW50aXR5LCBuKTsKKwkJCW4rPTI7CisJCQlwc2tfZXJyID0gMDsKKwkJcHNrX2VycjoKKwkJCU9QRU5TU0xfY2xlYW5zZShpZGVudGl0eSwgUFNLX01BWF9JREVOVElUWV9MRU4pOworCQkJT1BFTlNTTF9jbGVhbnNlKHBza19vcl9wcmVfbXMsIHNpemVvZihwc2tfb3JfcHJlX21zKSk7CisJCQlpZiAocHNrX2VyciAhPSAwKQorCQkJCXsKKwkJCQlzc2wzX3NlbmRfYWxlcnQocywgU1NMM19BTF9GQVRBTCwgU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJZWxzZQorCQkJeworCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSxFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJCisJCWQgPSBkdGxzMV9zZXRfbWVzc2FnZV9oZWFkZXIocywgZCwKKwkJU1NMM19NVF9DTElFTlRfS0VZX0VYQ0hBTkdFLCBuLCAwLCBuKTsKKwkJLyoKKwkJICooZCsrKT1TU0wzX01UX0NMSUVOVF9LRVlfRVhDSEFOR0U7CisJCSBsMm4zKG4sZCk7CisJCSBsMm4ocy0+ZDEtPmhhbmRzaGFrZV93cml0ZV9zZXEsZCk7CisJCSBzLT5kMS0+aGFuZHNoYWtlX3dyaXRlX3NlcSsrOworCQkqLworCQkKKwkJcy0+c3RhdGU9U1NMM19TVF9DV19LRVlfRVhDSF9COworCQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJcy0+aW5pdF9udW09bitEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCQlzLT5pbml0X29mZj0wOworCisJCS8qIGJ1ZmZlciB0aGUgbWVzc2FnZSB0byBoYW5kbGUgcmUteG1pdHMgKi8KKwkJZHRsczFfYnVmZmVyX21lc3NhZ2UocywgMCk7CisJCX0KKwkKKwkvKiBTU0wzX1NUX0NXX0tFWV9FWENIX0IgKi8KKwlyZXR1cm4oZHRsczFfZG9fd3JpdGUocyxTU0wzX1JUX0hBTkRTSEFLRSkpOworZXJyOgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlCTl9DVFhfZnJlZShibl9jdHgpOworCWlmIChlbmNvZGVkUG9pbnQgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKGVuY29kZWRQb2ludCk7CisJaWYgKGNsbnRfZWNkaCAhPSBOVUxMKSAKKwkJRUNfS0VZX2ZyZWUoY2xudF9lY2RoKTsKKwlFVlBfUEtFWV9mcmVlKHNydnJfcHViX3BrZXkpOworI2VuZGlmCisJcmV0dXJuKC0xKTsKKwl9CisKK2ludCBkdGxzMV9zZW5kX2NsaWVudF92ZXJpZnkoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwLCpkOworCXVuc2lnbmVkIGNoYXIgZGF0YVtNRDVfRElHRVNUX0xFTkdUSCtTSEFfRElHRVNUX0xFTkdUSF07CisJRVZQX1BLRVkgKnBrZXk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJdW5zaWduZWQgdT0wOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBuOworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fRFNBKSB8fCAhZGVmaW5lZChPUEVOU1NMX05PX0VDRFNBKQorCWludCBqOworI2VuZGlmCisKKwlpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9DV19DRVJUX1ZSRllfQSkKKwkJeworCQlkPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCXA9ICYoZFtEVExTMV9ITV9IRUFERVJfTEVOR1RIXSk7CisJCXBrZXk9cy0+Y2VydC0+a2V5LT5wcml2YXRla2V5OworCisJCXMtPm1ldGhvZC0+c3NsM19lbmMtPmNlcnRfdmVyaWZ5X21hYyhzLAorCQlOSURfc2hhMSwKKwkJCSYoZGF0YVtNRDVfRElHRVNUX0xFTkdUSF0pKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9SU0EpCisJCQl7CisJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5jZXJ0X3ZlcmlmeV9tYWMocywKKwkJCQlOSURfbWQ1LAorCQkJCSYoZGF0YVswXSkpOworCQkJaWYgKFJTQV9zaWduKE5JRF9tZDVfc2hhMSwgZGF0YSwKKwkJCQkJIE1ENV9ESUdFU1RfTEVOR1RIK1NIQV9ESUdFU1RfTEVOR1RILAorCQkJCQkmKHBbMl0pLCAmdSwgcGtleS0+cGtleS5yc2EpIDw9IDAgKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfVkVSSUZZLEVSUl9SX1JTQV9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXMybih1LHApOworCQkJbj11KzI7CisJCQl9CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCQkJaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfRFNBKQorCQkJeworCQkJaWYgKCFEU0Ffc2lnbihwa2V5LT5zYXZlX3R5cGUsCisJCQkJJihkYXRhW01ENV9ESUdFU1RfTEVOR1RIXSksCisJCQkJU0hBX0RJR0VTVF9MRU5HVEgsJihwWzJdKSwKKwkJCQkodW5zaWduZWQgaW50ICopJmoscGtleS0+cGtleS5kc2EpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfVkVSSUZZLEVSUl9SX0RTQV9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXMybihqLHApOworCQkJbj1qKzI7CisJCQl9CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDRFNBCisJCQlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9FQykKKwkJCXsKKwkJCWlmICghRUNEU0Ffc2lnbihwa2V5LT5zYXZlX3R5cGUsCisJCQkJJihkYXRhW01ENV9ESUdFU1RfTEVOR1RIXSksCisJCQkJU0hBX0RJR0VTVF9MRU5HVEgsJihwWzJdKSwKKwkJCQkodW5zaWduZWQgaW50ICopJmoscGtleS0+cGtleS5lYykpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9WRVJJRlksCisJCQkJICAgIEVSUl9SX0VDRFNBX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJczJuKGoscCk7CisJCQluPWorMjsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfVkVSSUZZLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWQgPSBkdGxzMV9zZXRfbWVzc2FnZV9oZWFkZXIocywgZCwKKwkJCVNTTDNfTVRfQ0VSVElGSUNBVEVfVkVSSUZZLCBuLCAwLCBuKSA7CisKKwkJcy0+aW5pdF9udW09KGludCluK0RUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisJCXMtPmluaXRfb2ZmPTA7CisKKwkJLyogYnVmZmVyIHRoZSBtZXNzYWdlIHRvIGhhbmRsZSByZS14bWl0cyAqLworCQlkdGxzMV9idWZmZXJfbWVzc2FnZShzLCAwKTsKKworCQlzLT5zdGF0ZSA9IFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0I7CisJCX0KKworCS8qIHMtPnN0YXRlID0gU1NMM19TVF9DV19DRVJUX1ZSRllfQiAqLworCXJldHVybihkdGxzMV9kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CitlcnI6CisJcmV0dXJuKC0xKTsKKwl9CisKK2ludCBkdGxzMV9zZW5kX2NsaWVudF9jZXJ0aWZpY2F0ZShTU0wgKnMpCisJeworCVg1MDkgKng1MDk9TlVMTDsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbDsKKworCWlmIChzLT5zdGF0ZSA9PQlTU0wzX1NUX0NXX0NFUlRfQSkKKwkJeworCQlpZiAoKHMtPmNlcnQgPT0gTlVMTCkgfHwKKwkJCShzLT5jZXJ0LT5rZXktPng1MDkgPT0gTlVMTCkgfHwKKwkJCShzLT5jZXJ0LT5rZXktPnByaXZhdGVrZXkgPT0gTlVMTCkpCisJCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0NFUlRfQjsKKwkJZWxzZQorCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DRVJUX0M7CisJCX0KKworCS8qIFdlIG5lZWQgdG8gZ2V0IGEgY2xpZW50IGNlcnQgKi8KKwlpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9DV19DRVJUX0IpCisJCXsKKwkJLyogSWYgd2UgZ2V0IGFuIGVycm9yLCB3ZSBuZWVkIHRvCisJCSAqIHNzbC0+cndzdGF0ZT1TU0xfWDUwOV9MT09LVVA7IHJldHVybigtMSk7CisJCSAqIFdlIHRoZW4gZ2V0IHJldGllZCBsYXRlciAqLworCQlpPTA7CisJCWkgPSBzc2xfZG9fY2xpZW50X2NlcnRfY2IocywgJng1MDksICZwa2V5KTsKKwkJaWYgKGkgPCAwKQorCQkJeworCQkJcy0+cndzdGF0ZT1TU0xfWDUwOV9MT09LVVA7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCQlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCQlpZiAoKGkgPT0gMSkgJiYgKHBrZXkgIT0gTlVMTCkgJiYgKHg1MDkgIT0gTlVMTCkpCisJCQl7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0NFUlRfQjsKKwkJCWlmICgJIVNTTF91c2VfY2VydGlmaWNhdGUocyx4NTA5KSB8fAorCQkJCSFTU0xfdXNlX1ByaXZhdGVLZXkocyxwa2V5KSkKKwkJCQlpPTA7CisJCQl9CisJCWVsc2UgaWYgKGkgPT0gMSkKKwkJCXsKKwkJCWk9MDsKKwkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURSxTU0xfUl9CQURfREFUQV9SRVRVUk5FRF9CWV9DQUxMQkFDSyk7CisJCQl9CisKKwkJaWYgKHg1MDkgIT0gTlVMTCkgWDUwOV9mcmVlKHg1MDkpOworCQlpZiAocGtleSAhPSBOVUxMKSBFVlBfUEtFWV9mcmVlKHBrZXkpOworCQlpZiAoaSA9PSAwKQorCQkJeworCQkJaWYgKHMtPnZlcnNpb24gPT0gU1NMM19WRVJTSU9OKQorCQkJCXsKKwkJCQlzLT5zMy0+dG1wLmNlcnRfcmVxPTA7CisJCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9XQVJOSU5HLFNTTF9BRF9OT19DRVJUSUZJQ0FURSk7CisJCQkJcmV0dXJuKDEpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJcy0+czMtPnRtcC5jZXJ0X3JlcT0yOworCQkJCX0KKwkJCX0KKworCQkvKiBPaywgd2UgaGF2ZSBhIGNlcnQgKi8KKwkJcy0+c3RhdGU9U1NMM19TVF9DV19DRVJUX0M7CisJCX0KKworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX0NXX0NFUlRfQykKKwkJeworCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0NFUlRfRDsKKwkJbD1kdGxzMV9vdXRwdXRfY2VydF9jaGFpbihzLAorCQkJKHMtPnMzLT50bXAuY2VydF9yZXEgPT0gMik/TlVMTDpzLT5jZXJ0LT5rZXktPng1MDkpOworCQlzLT5pbml0X251bT0oaW50KWw7CisJCXMtPmluaXRfb2ZmPTA7CisKKwkJLyogc2V0IGhlYWRlciBjYWxsZWQgYnkgZHRsczFfb3V0cHV0X2NlcnRfY2hhaW4oKSAqLworCisJCS8qIGJ1ZmZlciB0aGUgbWVzc2FnZSB0byBoYW5kbGUgcmUteG1pdHMgKi8KKwkJZHRsczFfYnVmZmVyX21lc3NhZ2UocywgMCk7CisJCX0KKwkvKiBTU0wzX1NUX0NXX0NFUlRfRCAqLworCXJldHVybihkdGxzMV9kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9kMV9lbmMuYyBiL2xpYi9vcGVuc3NsL3NzbC9kMV9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmE1NzM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL2QxX2VuYy5jCkBAIC0wLDAgKzEsMjkzIEBACisvKiBzc2wvZDFfZW5jLmMgKi8KKy8qIAorICogRFRMUyBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IE5hZ2VuZHJhIE1vZGFkdWd1CisgKiAobmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDA1LiAgCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbXAuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpZmRlZiBLU1NMX0RFQlVHCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKyNlbmRpZgorCitpbnQgZHRsczFfZW5jKFNTTCAqcywgaW50IHNlbmQpCisJeworCVNTTDNfUkVDT1JEICpyZWM7CisJRVZQX0NJUEhFUl9DVFggKmRzOworCXVuc2lnbmVkIGxvbmcgbDsKKwlpbnQgYnMsaSxpaSxqLGssbj0wOworCWNvbnN0IEVWUF9DSVBIRVIgKmVuYzsKKworCWlmIChzZW5kKQorCQl7CisJCWlmIChFVlBfTURfQ1RYX21kKHMtPndyaXRlX2hhc2gpKQorCQkJeworCQkJbj1FVlBfTURfQ1RYX3NpemUocy0+d3JpdGVfaGFzaCk7CisJCQlpZiAobiA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJfQorCQlkcz1zLT5lbmNfd3JpdGVfY3R4OworCQlyZWM9ICYocy0+czMtPndyZWMpOworCQlpZiAocy0+ZW5jX3dyaXRlX2N0eCA9PSBOVUxMKQorCQkJZW5jPU5VTEw7CisJCWVsc2UKKwkJCXsKKwkJCWVuYz1FVlBfQ0lQSEVSX0NUWF9jaXBoZXIocy0+ZW5jX3dyaXRlX2N0eCk7CisJCQlpZiAoIHJlYy0+ZGF0YSAhPSByZWMtPmlucHV0KQorCQkJCS8qIHdlIGNhbid0IHdyaXRlIGludG8gdGhlIGlucHV0IHN0cmVhbSAqLworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IHJlYy0+ZGF0YSAhPSByZWMtPmlucHV0XG4iLAorCQkJCQlfX0ZJTEVfXywgX19MSU5FX18pOworCQkJZWxzZSBpZiAoIEVWUF9DSVBIRVJfYmxvY2tfc2l6ZShkcy0+Y2lwaGVyKSA+IDEpCisJCQkJeworCQkJCWlmIChSQU5EX2J5dGVzKHJlYy0+aW5wdXQsIEVWUF9DSVBIRVJfYmxvY2tfc2l6ZShkcy0+Y2lwaGVyKSkgPD0gMCkKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpZiAoRVZQX01EX0NUWF9tZChzLT5yZWFkX2hhc2gpKQorCQkJeworCQkJbj1FVlBfTURfQ1RYX3NpemUocy0+cmVhZF9oYXNoKTsKKwkJCWlmIChuIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCWRzPXMtPmVuY19yZWFkX2N0eDsKKwkJcmVjPSAmKHMtPnMzLT5ycmVjKTsKKwkJaWYgKHMtPmVuY19yZWFkX2N0eCA9PSBOVUxMKQorCQkJZW5jPU5VTEw7CisJCWVsc2UKKwkJCWVuYz1FVlBfQ0lQSEVSX0NUWF9jaXBoZXIocy0+ZW5jX3JlYWRfY3R4KTsKKwkJfQorCisjaWZkZWYgS1NTTF9ERUJVRworCXByaW50ZigiZHRsczFfZW5jKCVkKVxuIiwgc2VuZCk7CisjZW5kaWYgICAgLyogS1NTTF9ERUJVRyAqLworCisJaWYgKChzLT5zZXNzaW9uID09IE5VTEwpIHx8IChkcyA9PSBOVUxMKSB8fAorCQkoZW5jID09IE5VTEwpKQorCQl7CisJCW1lbW1vdmUocmVjLT5kYXRhLHJlYy0+aW5wdXQscmVjLT5sZW5ndGgpOworCQlyZWMtPmlucHV0PXJlYy0+ZGF0YTsKKwkJfQorCWVsc2UKKwkJeworCQlsPXJlYy0+bGVuZ3RoOworCQlicz1FVlBfQ0lQSEVSX2Jsb2NrX3NpemUoZHMtPmNpcGhlcik7CisKKwkJaWYgKChicyAhPSAxKSAmJiBzZW5kKQorCQkJeworCQkJaT1icy0oKGludClsJWJzKTsKKworCQkJLyogQWRkIHdlaXJkIHBhZGRpbmcgb2YgdXB0byAyNTYgYnl0ZXMgKi8KKworCQkJLyogd2UgbmVlZCB0byBhZGQgJ2knIHBhZGRpbmcgYnl0ZXMgb2YgdmFsdWUgaiAqLworCQkJaj1pLTE7CisJCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9UTFNfQkxPQ0tfUEFERElOR19CVUcpCisJCQkJeworCQkJCWlmIChzLT5zMy0+ZmxhZ3MgJiBUTFMxX0ZMQUdTX1RMU19QQURESU5HX0JVRykKKwkJCQkJaisrOworCQkJCX0KKwkJCWZvciAoaz0oaW50KWw7IGs8KGludCkobCtpKTsgaysrKQorCQkJCXJlYy0+aW5wdXRba109ajsKKwkJCWwrPWk7CisJCQlyZWMtPmxlbmd0aCs9aTsKKwkJCX0KKworI2lmZGVmIEtTU0xfREVCVUcKKwkJeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWk7CisJCXByaW50ZigiRVZQX0NpcGhlcihkcz0lcCxyZWMtPmRhdGE9JXAscmVjLT5pbnB1dD0lcCxsPSVsZCkgPT0+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZHMscmVjLT5kYXRhLHJlYy0+aW5wdXQsbCk7CisJCXByaW50ZigiXHRFVlBfQ0lQSEVSX0NUWDogJWQgYnVmX2xlbiwgJWQga2V5X2xlbiBbJWQgJWRdLCAlZCBpdl9sZW5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkcy0+YnVmX2xlbiwgZHMtPmNpcGhlci0+a2V5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERFU19LRVlfU1osIERFU19TQ0hFRFVMRV9TWiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzLT5jaXBoZXItPml2X2xlbik7CisJCXByaW50ZigiXHRcdElWOiAiKTsKKwkJZm9yIChpPTA7IGk8ZHMtPmNpcGhlci0+aXZfbGVuOyBpKyspIHByaW50ZigiJTAyWCIsIGRzLT5pdltpXSk7CisJCXByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCJcdHJlYy0+aW5wdXQ9Iik7CisJCWZvciAodWk9MDsgdWk8bDsgdWkrKykgcHJpbnRmKCIgJTAyeCIsIHJlYy0+aW5wdXRbdWldKTsKKwkJcHJpbnRmKCJcbiIpOworCQl9CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCisJCWlmICghc2VuZCkKKwkJCXsKKwkJCWlmIChsID09IDAgfHwgbCVicyAhPSAwKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfRU5DLFNTTF9SX0JMT0NLX0NJUEhFUl9QQURfSVNfV1JPTkcpOworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0RFQ1JZUFRJT05fRkFJTEVEKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQorCQlFVlBfQ2lwaGVyKGRzLHJlYy0+ZGF0YSxyZWMtPmlucHV0LGwpOworCisjaWZkZWYgS1NTTF9ERUJVRworCQl7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpOworICAgICAgICAgICAgICAgIHByaW50ZigiXHRyZWMtPmRhdGE9Iik7CisJCWZvciAoaT0wOyBpPGw7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiICUwMngiLCByZWMtPmRhdGFbaV0pOyAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisKKwkJaWYgKChicyAhPSAxKSAmJiAhc2VuZCkKKwkJCXsKKwkJCWlpPWk9cmVjLT5kYXRhW2wtMV07IC8qIHBhZGRpbmdfbGVuZ3RoICovCisJCQlpKys7CisJCQlpZiAocy0+b3B0aW9ucyZTU0xfT1BfVExTX0JMT0NLX1BBRERJTkdfQlVHKQorCQkJCXsKKwkJCQkvKiBGaXJzdCBwYWNrZXQgaXMgZXZlbiBpbiBzaXplLCBzbyBjaGVjayAqLworCQkJCWlmICgobWVtY21wKHMtPnMzLT5yZWFkX3NlcXVlbmNlLAorCQkJCQkiXDBcMFwwXDBcMFwwXDBcMCIsOCkgPT0gMCkgJiYgIShpaSAmIDEpKQorCQkJCQlzLT5zMy0+ZmxhZ3N8PVRMUzFfRkxBR1NfVExTX1BBRERJTkdfQlVHOworCQkJCWlmIChzLT5zMy0+ZmxhZ3MgJiBUTFMxX0ZMQUdTX1RMU19QQURESU5HX0JVRykKKwkJCQkJaS0tOworCQkJCX0KKwkJCS8qIFRMUyAxLjAgZG9lcyBub3QgYm91bmQgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGJ5IHRoZSBibG9jayBzaXplLgorCQkJICogQWxsIG9mIHRoZW0gbXVzdCBoYXZlIHZhbHVlICdwYWRkaW5nX2xlbmd0aCcuICovCisJCQlpZiAoaSA+IChpbnQpcmVjLT5sZW5ndGgpCisJCQkJeworCQkJCS8qIEluY29ycmVjdCBwYWRkaW5nLiBTU0xlcnIoKSBhbmQgc3NsM19hbGVydCBhcmUgZG9uZQorCQkJCSAqIGJ5IGNhbGxlcjogd2UgZG9uJ3Qgd2FudCB0byByZXZlYWwgd2hldGhlciB0aGlzIGlzCisJCQkJICogYSBkZWNyeXB0aW9uIGVycm9yIG9yIGEgTUFDIHZlcmlmaWNhdGlvbiBmYWlsdXJlCisJCQkJICogKHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35ib2RvL3Rscy1jYmMudHh0KSAKKwkJCQkgKi8KKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJZm9yIChqPShpbnQpKGwtaSk7IGo8KGludClsOyBqKyspCisJCQkJeworCQkJCWlmIChyZWMtPmRhdGFbal0gIT0gaWkpCisJCQkJCXsKKwkJCQkJLyogSW5jb3JyZWN0IHBhZGRpbmcgKi8KKwkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJcmVjLT5sZW5ndGgtPWk7CisKKwkJCXJlYy0+ZGF0YSArPSBiczsgICAgLyogc2tpcCB0aGUgaW1wbGljaXQgSVYgKi8KKwkJCXJlYy0+aW5wdXQgKz0gYnM7CisJCQlyZWMtPmxlbmd0aCAtPSBiczsKKwkJCX0KKwkJfQorCXJldHVybigxKTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9kMV9saWIuYyBiL2xpYi9vcGVuc3NsL3NzbC9kMV9saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIyMjBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL2QxX2xpYi5jCkBAIC0wLDAgKzEsMzk0IEBACisvKiBzc2wvZDFfbGliLmMgKi8KKy8qIAorICogRFRMUyBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IE5hZ2VuZHJhIE1vZGFkdWd1CisgKiAobmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDA1LiAgCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNkZWZpbmUgVVNFX1NPQ0tFVFMKKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorCisjaWYgZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikgfHwgZGVmaW5lZChPUEVOU1NMX1NZU19WTVMpCisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X2N1cnJlbnRfdGltZShzdHJ1Y3QgdGltZXZhbCAqdCk7Citjb25zdCBjaGFyIGR0bHMxX3ZlcnNpb25fc3RyW109IkRUTFN2MSIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworaW50IGR0bHMxX2xpc3RlbihTU0wgKnMsIHN0cnVjdCBzb2NrYWRkciAqY2xpZW50KTsKKworU1NMM19FTkNfTUVUSE9EIERUTFN2MV9lbmNfZGF0YT17CisgICAgZHRsczFfZW5jLAorCXRsczFfbWFjLAorCXRsczFfc2V0dXBfa2V5X2Jsb2NrLAorCXRsczFfZ2VuZXJhdGVfbWFzdGVyX3NlY3JldCwKKwl0bHMxX2NoYW5nZV9jaXBoZXJfc3RhdGUsCisJdGxzMV9maW5hbF9maW5pc2hfbWFjLAorCVRMUzFfRklOSVNIX01BQ19MRU5HVEgsCisJdGxzMV9jZXJ0X3ZlcmlmeV9tYWMsCisJVExTX01EX0NMSUVOVF9GSU5JU0hfQ09OU1QsVExTX01EX0NMSUVOVF9GSU5JU0hfQ09OU1RfU0laRSwKKwlUTFNfTURfU0VSVkVSX0ZJTklTSF9DT05TVCxUTFNfTURfU0VSVkVSX0ZJTklTSF9DT05TVF9TSVpFLAorCXRsczFfYWxlcnRfY29kZSwKKwl9OworCitsb25nIGR0bHMxX2RlZmF1bHRfdGltZW91dCh2b2lkKQorCXsKKwkvKiAyIGhvdXJzLCB0aGUgMjQgaG91cnMgbWVudGlvbmVkIGluIHRoZSBEVExTdjEgc3BlYworCSAqIGlzIHdheSB0b28gbG9uZyBmb3IgaHR0cCwgdGhlIGNhY2hlIHdvdWxkIG92ZXIgZmlsbCAqLworCXJldHVybig2MCo2MCoyKTsKKwl9CisKK2ludCBkdGxzMV9uZXcoU1NMICpzKQorCXsKKwlEVExTMV9TVEFURSAqZDE7CisKKwlpZiAoIXNzbDNfbmV3KHMpKSByZXR1cm4oMCk7CisJaWYgKChkMT1PUEVOU1NMX21hbGxvYyhzaXplb2YgKmQxKSkgPT0gTlVMTCkgcmV0dXJuICgwKTsKKwltZW1zZXQoZDEsMCwgc2l6ZW9mICpkMSk7CisKKwkvKiBkMS0+aGFuZHNoYWtlX2Vwb2NoPTA7ICovCisKKwlkMS0+dW5wcm9jZXNzZWRfcmNkcy5xPXBxdWV1ZV9uZXcoKTsKKwlkMS0+cHJvY2Vzc2VkX3JjZHMucT1wcXVldWVfbmV3KCk7CisJZDEtPmJ1ZmZlcmVkX21lc3NhZ2VzID0gcHF1ZXVlX25ldygpOworCWQxLT5zZW50X21lc3NhZ2VzPXBxdWV1ZV9uZXcoKTsKKwlkMS0+YnVmZmVyZWRfYXBwX2RhdGEucT1wcXVldWVfbmV3KCk7CisKKwlpZiAoIHMtPnNlcnZlcikKKwkJeworCQlkMS0+Y29va2llX2xlbiA9IHNpemVvZihzLT5kMS0+Y29va2llKTsKKwkJfQorCisJaWYoICEgZDEtPnVucHJvY2Vzc2VkX3JjZHMucSB8fCAhIGQxLT5wcm9jZXNzZWRfcmNkcy5xIAorICAgICAgICB8fCAhIGQxLT5idWZmZXJlZF9tZXNzYWdlcyB8fCAhIGQxLT5zZW50X21lc3NhZ2VzIHx8ICEgZDEtPmJ1ZmZlcmVkX2FwcF9kYXRhLnEpCisJCXsKKyAgICAgICAgaWYgKCBkMS0+dW5wcm9jZXNzZWRfcmNkcy5xKSBwcXVldWVfZnJlZShkMS0+dW5wcm9jZXNzZWRfcmNkcy5xKTsKKyAgICAgICAgaWYgKCBkMS0+cHJvY2Vzc2VkX3JjZHMucSkgcHF1ZXVlX2ZyZWUoZDEtPnByb2Nlc3NlZF9yY2RzLnEpOworICAgICAgICBpZiAoIGQxLT5idWZmZXJlZF9tZXNzYWdlcykgcHF1ZXVlX2ZyZWUoZDEtPmJ1ZmZlcmVkX21lc3NhZ2VzKTsKKwkJaWYgKCBkMS0+c2VudF9tZXNzYWdlcykgcHF1ZXVlX2ZyZWUoZDEtPnNlbnRfbWVzc2FnZXMpOworCQlpZiAoIGQxLT5idWZmZXJlZF9hcHBfZGF0YS5xKSBwcXVldWVfZnJlZShkMS0+YnVmZmVyZWRfYXBwX2RhdGEucSk7CisJCU9QRU5TU0xfZnJlZShkMSk7CisJCXJldHVybiAoMCk7CisJCX0KKworCXMtPmQxPWQxOworCXMtPm1ldGhvZC0+c3NsX2NsZWFyKHMpOworCXJldHVybigxKTsKKwl9CisKK3ZvaWQgZHRsczFfZnJlZShTU0wgKnMpCisJeworICAgIHBpdGVtICppdGVtID0gTlVMTDsKKyAgICBobV9mcmFnbWVudCAqZnJhZyA9IE5VTEw7CisKKwlzc2wzX2ZyZWUocyk7CisKKyAgICB3aGlsZSggKGl0ZW0gPSBwcXVldWVfcG9wKHMtPmQxLT51bnByb2Nlc3NlZF9yY2RzLnEpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgIE9QRU5TU0xfZnJlZShpdGVtLT5kYXRhKTsKKyAgICAgICAgcGl0ZW1fZnJlZShpdGVtKTsKKyAgICAgICAgfQorICAgIHBxdWV1ZV9mcmVlKHMtPmQxLT51bnByb2Nlc3NlZF9yY2RzLnEpOworCisgICAgd2hpbGUoIChpdGVtID0gcHF1ZXVlX3BvcChzLT5kMS0+cHJvY2Vzc2VkX3JjZHMucSkpICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgT1BFTlNTTF9mcmVlKGl0ZW0tPmRhdGEpOworICAgICAgICBwaXRlbV9mcmVlKGl0ZW0pOworICAgICAgICB9CisgICAgcHF1ZXVlX2ZyZWUocy0+ZDEtPnByb2Nlc3NlZF9yY2RzLnEpOworCisgICAgd2hpbGUoIChpdGVtID0gcHF1ZXVlX3BvcChzLT5kMS0+YnVmZmVyZWRfbWVzc2FnZXMpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgIGZyYWcgPSAoaG1fZnJhZ21lbnQgKilpdGVtLT5kYXRhOworICAgICAgICBPUEVOU1NMX2ZyZWUoZnJhZy0+ZnJhZ21lbnQpOworICAgICAgICBPUEVOU1NMX2ZyZWUoZnJhZyk7CisgICAgICAgIHBpdGVtX2ZyZWUoaXRlbSk7CisgICAgICAgIH0KKyAgICBwcXVldWVfZnJlZShzLT5kMS0+YnVmZmVyZWRfbWVzc2FnZXMpOworCisgICAgd2hpbGUgKCAoaXRlbSA9IHBxdWV1ZV9wb3Aocy0+ZDEtPnNlbnRfbWVzc2FnZXMpKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgIGZyYWcgPSAoaG1fZnJhZ21lbnQgKilpdGVtLT5kYXRhOworICAgICAgICBPUEVOU1NMX2ZyZWUoZnJhZy0+ZnJhZ21lbnQpOworICAgICAgICBPUEVOU1NMX2ZyZWUoZnJhZyk7CisgICAgICAgIHBpdGVtX2ZyZWUoaXRlbSk7CisgICAgICAgIH0KKwlwcXVldWVfZnJlZShzLT5kMS0+c2VudF9tZXNzYWdlcyk7CisKKwl3aGlsZSAoIChpdGVtID0gcHF1ZXVlX3BvcChzLT5kMS0+YnVmZmVyZWRfYXBwX2RhdGEucSkpICE9IE5VTEwpCisJCXsKKwkJZnJhZyA9IChobV9mcmFnbWVudCAqKWl0ZW0tPmRhdGE7CisJCU9QRU5TU0xfZnJlZShmcmFnLT5mcmFnbWVudCk7CisJCU9QRU5TU0xfZnJlZShmcmFnKTsKKwkJcGl0ZW1fZnJlZShpdGVtKTsKKwkJfQorCXBxdWV1ZV9mcmVlKHMtPmQxLT5idWZmZXJlZF9hcHBfZGF0YS5xKTsKKworCU9QRU5TU0xfZnJlZShzLT5kMSk7CisJfQorCit2b2lkIGR0bHMxX2NsZWFyKFNTTCAqcykKKwl7CisJc3NsM19jbGVhcihzKTsKKwlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9DSVNDT19BTllDT05ORUNUKQorCQlzLT52ZXJzaW9uPURUTFMxX0JBRF9WRVI7CisJZWxzZQorCQlzLT52ZXJzaW9uPURUTFMxX1ZFUlNJT047CisJfQorCitsb25nIGR0bHMxX2N0cmwoU1NMICpzLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpCisJeworCWludCByZXQ9MDsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBEVExTX0NUUkxfR0VUX1RJTUVPVVQ6CisJCWlmIChkdGxzMV9nZXRfdGltZW91dChzLCAoc3RydWN0IHRpbWV2YWwqKSBwYXJnKSAhPSBOVUxMKQorCQkJeworCQkJcmV0ID0gMTsKKwkJCX0KKwkJYnJlYWs7CisJY2FzZSBEVExTX0NUUkxfSEFORExFX1RJTUVPVVQ6CisJCXJldCA9IGR0bHMxX2hhbmRsZV90aW1lb3V0KHMpOworCQlicmVhazsKKwljYXNlIERUTFNfQ1RSTF9MSVNURU46CisJCXJldCA9IGR0bHMxX2xpc3RlbihzLCBwYXJnKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBzc2wzX2N0cmwocywgY21kLCBsYXJnLCBwYXJnKTsKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKKy8qCisgKiBBcyBpdCdzIGltcG9zc2libGUgdG8gdXNlIHN0cmVhbSBjaXBoZXJzIGluICJkYXRhZ3JhbSIgbW9kZSwgdGhpcworICogc2ltcGxlIGZpbHRlciBpcyBkZXNpZ25lZCB0byBkaXNlbmdhZ2UgdGhlbSBpbiBEVExTLiBVbmZvcnR1bmF0ZWx5CisgKiB0aGVyZSBpcyBubyB1bml2ZXJzYWwgd2F5IHRvIGlkZW50aWZ5IHN0cmVhbSBTU0xfQ0lQSEVSLCBzbyB3ZSBoYXZlCisgKiB0byBleHBsaWNpdGx5IGxpc3QgdGhlaXIgU1NMXyogY29kZXMuIEN1cnJlbnRseSBSQzQgaXMgdGhlIG9ubHkgb25lCisgKiBhdmFpbGFibGUsIGJ1dCBpZiBuZXcgb25lcyBlbWVyZ2UsIHRoZXkgd2lsbCBoYXZlIHRvIGJlIGFkZGVkLi4uCisgKi8KK2NvbnN0IFNTTF9DSVBIRVIgKmR0bHMxX2dldF9jaXBoZXIodW5zaWduZWQgaW50IHUpCisJeworCWNvbnN0IFNTTF9DSVBIRVIgKmNpcGggPSBzc2wzX2dldF9jaXBoZXIodSk7CisKKwlpZiAoY2lwaCAhPSBOVUxMKQorCQl7CisJCWlmIChjaXBoLT5hbGdvcml0aG1fZW5jID09IFNTTF9SQzQpCisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJcmV0dXJuIGNpcGg7CisJfQorCit2b2lkIGR0bHMxX3N0YXJ0X3RpbWVyKFNTTCAqcykKKwl7CisJLyogSWYgdGltZXIgaXMgbm90IHNldCwgaW5pdGlhbGl6ZSBkdXJhdGlvbiB3aXRoIDEgc2Vjb25kICovCisJaWYgKHMtPmQxLT5uZXh0X3RpbWVvdXQudHZfc2VjID09IDAgJiYgcy0+ZDEtPm5leHRfdGltZW91dC50dl91c2VjID09IDApCisJCXsKKwkJcy0+ZDEtPnRpbWVvdXRfZHVyYXRpb24gPSAxOworCQl9CisJCisJLyogU2V0IHRpbWVvdXQgdG8gY3VycmVudCB0aW1lICovCisJZ2V0X2N1cnJlbnRfdGltZSgmKHMtPmQxLT5uZXh0X3RpbWVvdXQpKTsKKworCS8qIEFkZCBkdXJhdGlvbiB0byBjdXJyZW50IHRpbWUgKi8KKwlzLT5kMS0+bmV4dF90aW1lb3V0LnR2X3NlYyArPSBzLT5kMS0+dGltZW91dF9kdXJhdGlvbjsKKwlCSU9fY3RybChTU0xfZ2V0X3JiaW8ocyksIEJJT19DVFJMX0RHUkFNX1NFVF9ORVhUX1RJTUVPVVQsIDAsICYocy0+ZDEtPm5leHRfdGltZW91dCkpOworCX0KKworc3RydWN0IHRpbWV2YWwqIGR0bHMxX2dldF90aW1lb3V0KFNTTCAqcywgc3RydWN0IHRpbWV2YWwqIHRpbWVsZWZ0KQorCXsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lbm93OworCisJLyogSWYgbm8gdGltZW91dCBpcyBzZXQsIGp1c3QgcmV0dXJuIE5VTEwgKi8KKwlpZiAocy0+ZDEtPm5leHRfdGltZW91dC50dl9zZWMgPT0gMCAmJiBzLT5kMS0+bmV4dF90aW1lb3V0LnR2X3VzZWMgPT0gMCkKKwkJeworCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJLyogR2V0IGN1cnJlbnQgdGltZSAqLworCWdldF9jdXJyZW50X3RpbWUoJnRpbWVub3cpOworCisJLyogSWYgdGltZXIgYWxyZWFkeSBleHBpcmVkLCBzZXQgcmVtYWluaW5nIHRpbWUgdG8gMCAqLworCWlmIChzLT5kMS0+bmV4dF90aW1lb3V0LnR2X3NlYyA8IHRpbWVub3cudHZfc2VjIHx8CisJCShzLT5kMS0+bmV4dF90aW1lb3V0LnR2X3NlYyA9PSB0aW1lbm93LnR2X3NlYyAmJgorCQkgcy0+ZDEtPm5leHRfdGltZW91dC50dl91c2VjIDw9IHRpbWVub3cudHZfdXNlYykpCisJCXsKKwkJbWVtc2V0KHRpbWVsZWZ0LCAwLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwkJcmV0dXJuIHRpbWVsZWZ0OworCQl9CisKKwkvKiBDYWxjdWxhdGUgdGltZSBsZWZ0IHVudGlsIHRpbWVyIGV4cGlyZXMgKi8KKwltZW1jcHkodGltZWxlZnQsICYocy0+ZDEtPm5leHRfdGltZW91dCksIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCXRpbWVsZWZ0LT50dl9zZWMgLT0gdGltZW5vdy50dl9zZWM7CisJdGltZWxlZnQtPnR2X3VzZWMgLT0gdGltZW5vdy50dl91c2VjOworCWlmICh0aW1lbGVmdC0+dHZfdXNlYyA8IDApCisJCXsKKwkJdGltZWxlZnQtPnR2X3NlYy0tOworCQl0aW1lbGVmdC0+dHZfdXNlYyArPSAxMDAwMDAwOworCQl9CisKKwkvKiBJZiByZW1haW5pbmcgdGltZSBpcyBsZXNzIHRoYW4gMTUgbXMsIHNldCBpdCB0byAwCisJICogdG8gcHJldmVudCBpc3N1ZXMgYmVjYXVzZSBvZiBzbWFsbCBkZXZlcmdlbmNlcyB3aXRoCisJICogc29ja2V0IHRpbWVvdXRzLgorCSAqLworCWlmICh0aW1lbGVmdC0+dHZfc2VjID09IDAgJiYgdGltZWxlZnQtPnR2X3VzZWMgPCAxNTAwMCkKKwkJeworCQltZW1zZXQodGltZWxlZnQsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCQl9CisJCisKKwlyZXR1cm4gdGltZWxlZnQ7CisJfQorCitpbnQgZHRsczFfaXNfdGltZXJfZXhwaXJlZChTU0wgKnMpCisJeworCXN0cnVjdCB0aW1ldmFsIHRpbWVsZWZ0OworCisJLyogR2V0IHRpbWUgbGVmdCB1bnRpbCB0aW1lb3V0LCByZXR1cm4gZmFsc2UgaWYgbm8gdGltZXIgcnVubmluZyAqLworCWlmIChkdGxzMV9nZXRfdGltZW91dChzLCAmdGltZWxlZnQpID09IE5VTEwpCisJCXsKKwkJcmV0dXJuIDA7CisJCX0KKworCS8qIFJldHVybiBmYWxzZSBpZiB0aW1lciBpcyBub3QgZXhwaXJlZCB5ZXQgKi8KKwlpZiAodGltZWxlZnQudHZfc2VjID4gMCB8fCB0aW1lbGVmdC50dl91c2VjID4gMCkKKwkJeworCQlyZXR1cm4gMDsKKwkJfQorCisJLyogVGltZXIgZXhwaXJlZCwgc28gcmV0dXJuIHRydWUgKi8JCisJcmV0dXJuIDE7CisJfQorCit2b2lkIGR0bHMxX2RvdWJsZV90aW1lb3V0KFNTTCAqcykKKwl7CisJcy0+ZDEtPnRpbWVvdXRfZHVyYXRpb24gKj0gMjsKKwlpZiAocy0+ZDEtPnRpbWVvdXRfZHVyYXRpb24gPiA2MCkKKwkJcy0+ZDEtPnRpbWVvdXRfZHVyYXRpb24gPSA2MDsKKwlkdGxzMV9zdGFydF90aW1lcihzKTsKKwl9CisKK3ZvaWQgZHRsczFfc3RvcF90aW1lcihTU0wgKnMpCisJeworCS8qIFJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwltZW1zZXQoJihzLT5kMS0+bmV4dF90aW1lb3V0KSwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CisJcy0+ZDEtPnRpbWVvdXRfZHVyYXRpb24gPSAxOworCUJJT19jdHJsKFNTTF9nZXRfcmJpbyhzKSwgQklPX0NUUkxfREdSQU1fU0VUX05FWFRfVElNRU9VVCwgMCwgJihzLT5kMS0+bmV4dF90aW1lb3V0KSk7CisJfQorCitpbnQgZHRsczFfaGFuZGxlX3RpbWVvdXQoU1NMICpzKQorCXsKKwlEVExTMV9TVEFURSAqc3RhdGU7CisKKwkvKiBpZiBubyB0aW1lciBpcyBleHBpcmVkLCBkb24ndCBkbyBhbnl0aGluZyAqLworCWlmICghZHRsczFfaXNfdGltZXJfZXhwaXJlZChzKSkKKwkJeworCQlyZXR1cm4gMDsKKwkJfQorCisJZHRsczFfZG91YmxlX3RpbWVvdXQocyk7CisJc3RhdGUgPSBzLT5kMTsKKwlzdGF0ZS0+dGltZW91dC5udW1fYWxlcnRzKys7CisJaWYgKCBzdGF0ZS0+dGltZW91dC5udW1fYWxlcnRzID4gRFRMUzFfVE1PX0FMRVJUX0NPVU5UKQorCQl7CisJCS8qIGZhaWwgdGhlIGNvbm5lY3Rpb24sIGVub3VnaCBhbGVydHMgaGF2ZSBiZWVuIHNlbnQgKi8KKwkJU1NMZXJyKFNTTF9GX0RUTFMxX0hBTkRMRV9USU1FT1VULFNTTF9SX1JFQURfVElNRU9VVF9FWFBJUkVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXN0YXRlLT50aW1lb3V0LnJlYWRfdGltZW91dHMrKzsKKwlpZiAoIHN0YXRlLT50aW1lb3V0LnJlYWRfdGltZW91dHMgPiBEVExTMV9UTU9fUkVBRF9DT1VOVCkKKwkJeworCQlzdGF0ZS0+dGltZW91dC5yZWFkX3RpbWVvdXRzID0gMTsKKwkJfQorCisJZHRsczFfc3RhcnRfdGltZXIocyk7CisJcmV0dXJuIGR0bHMxX3JldHJhbnNtaXRfYnVmZmVyZWRfbWVzc2FnZXMocyk7CisJfQorCitzdGF0aWMgdm9pZCBnZXRfY3VycmVudF90aW1lKHN0cnVjdCB0aW1ldmFsICp0KQoreworI2lmZGVmIE9QRU5TU0xfU1lTX1dJTjMyCisJc3RydWN0IF90aW1lYiB0YjsKKwlfZnRpbWUoJnRiKTsKKwl0LT50dl9zZWMgPSAobG9uZyl0Yi50aW1lOworCXQtPnR2X3VzZWMgPSAobG9uZyl0Yi5taWxsaXRtICogMTAwMDsKKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorCXN0cnVjdCB0aW1lYiB0YjsKKwlmdGltZSgmdGIpOworCXQtPnR2X3NlYyA9IChsb25nKXRiLnRpbWU7CisJdC0+dHZfdXNlYyA9IChsb25nKXRiLm1pbGxpdG0gKiAxMDAwOworI2Vsc2UKKwlnZXR0aW1lb2ZkYXkodCwgTlVMTCk7CisjZW5kaWYKK30KKworaW50IGR0bHMxX2xpc3RlbihTU0wgKnMsIHN0cnVjdCBzb2NrYWRkciAqY2xpZW50KQorCXsKKwlpbnQgcmV0OworCisJU1NMX3NldF9vcHRpb25zKHMsIFNTTF9PUF9DT09LSUVfRVhDSEFOR0UpOworCXMtPmQxLT5saXN0ZW4gPSAxOworCisJcmV0ID0gU1NMX2FjY2VwdChzKTsKKwlpZiAocmV0IDw9IDApIHJldHVybiByZXQ7CisJCisJKHZvaWQpIEJJT19kZ3JhbV9nZXRfcGVlcihTU0xfZ2V0X3JiaW8ocyksIGNsaWVudCk7CisJcmV0dXJuIDE7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL2QxX21ldGguYyBiL2xpYi9vcGVuc3NsL3NzbC9kMV9tZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0MDA0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9kMV9tZXRoLmMKQEAgLTAsMCArMSw3NyBAQAorLyogc3NsL2QxX21ldGguaCAqLworLyogCisgKiBEVExTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgTmFnZW5kcmEgTW9kYWR1Z3UKKyAqIChuYWdlbmRyYUBjcy5zdGFuZm9yZC5lZHUpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0IDIwMDUuICAKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICpkdGxzMV9nZXRfbWV0aG9kKGludCB2ZXIpOworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKmR0bHMxX2dldF9tZXRob2QoaW50IHZlcikKKwl7CisJaWYgKHZlciA9PSBEVExTMV9WRVJTSU9OKQorCQlyZXR1cm4oRFRMU3YxX21ldGhvZCgpKTsKKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKK0lNUExFTUVOVF9kdGxzMV9tZXRoX2Z1bmMoRFRMU3YxX21ldGhvZCwKKwkJCWR0bHMxX2FjY2VwdCwKKwkJCWR0bHMxX2Nvbm5lY3QsCisJCQlkdGxzMV9nZXRfbWV0aG9kKQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvZDFfcGt0LmMgYi9saWIvb3BlbnNzbC9zc2wvZDFfcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyZWVhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9kMV9wa3QuYwpAQCAtMCwwICsxLDE4MDIgQEAKKy8qIHNzbC9kMV9wa3QuYyAqLworLyogCisgKiBEVExTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgTmFnZW5kcmEgTW9kYWR1Z3UKKyAqIChuYWdlbmRyYUBjcy5zdGFuZm9yZC5lZHUpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0IDIwMDUuICAKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjZGVmaW5lIFVTRV9TT0NLRVRTCisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wcXVldWUuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKworLyogbW9kIDEyOCBzYXR1cmF0aW5nIHN1YnRyYWN0IG9mIHR3byA2NC1iaXQgdmFsdWVzIGluIGJpZy1lbmRpYW4gb3JkZXIgKi8KK3N0YXRpYyBpbnQgc2F0c3ViNjRiZShjb25zdCB1bnNpZ25lZCBjaGFyICp2MSxjb25zdCB1bnNpZ25lZCBjaGFyICp2MikKK3sJaW50IHJldCxzYXQsYnJ3LGk7CisKKwlpZiAoc2l6ZW9mKGxvbmcpID09IDgpIGRvCisJewljb25zdCB1bmlvbiB7IGxvbmcgb25lOyBjaGFyIGxpdHRsZTsgfSBpc19lbmRpYW4gPSB7MX07CisJCWxvbmcgbDsKKworCQlpZiAoaXNfZW5kaWFuLmxpdHRsZSkJCQlicmVhazsKKwkJLyogbm90IHJlYWNoZWQgb24gbGl0dGxlLWVuZGlhbnMgKi8KKwkJLyogZm9sbG93aW5nIHRlc3QgaXMgcmVkdW5kYW50LCBiZWNhdXNlIGlucHV0IGlzCisJCSAqIGFsd2F5cyBhbGlnbmVkLCBidXQgSSB0YWtlIG5vIGNoYW5jZXMuLi4gKi8KKwkJaWYgKCgoc2l6ZV90KXYxfChzaXplX3QpdjIpJjB4NykJYnJlYWs7CisKKwkJbCAgPSAqKChsb25nICopdjEpOworCQlsIC09ICooKGxvbmcgKil2Mik7CisJCWlmIChsPjEyOCkJCXJldHVybiAxMjg7CisJCWVsc2UgaWYgKGw8LTEyOCkJcmV0dXJuIC0xMjg7CisJCWVsc2UJCQlyZXR1cm4gKGludClsOworCX0gd2hpbGUgKDApOworCisJcmV0ID0gKGludCl2MVs3XS0oaW50KXYyWzddOworCXNhdCA9IDA7CisJYnJ3ID0gcmV0Pj44OwkvKiBicncgaXMgZWl0aGVyIDAgb3IgLTEgKi8KKwlpZiAocmV0ICYgMHg4MCkKKwl7CWZvciAoaT02O2k+PTA7aS0tKQorCQl7CWJydyArPSAoaW50KXYxW2ldLShpbnQpdjJbaV07CisJCQlzYXQgfD0gfmJydzsKKwkJCWJydyA+Pj0gODsKKwkJfQorCX0KKwllbHNlCisJewlmb3IgKGk9NjtpPj0wO2ktLSkKKwkJewlicncgKz0gKGludCl2MVtpXS0oaW50KXYyW2ldOworCQkJc2F0IHw9IGJydzsKKwkJCWJydyA+Pj0gODsKKwkJfQorCX0KKwlicncgPDw9IDg7CS8qIGJydyBpcyBlaXRoZXIgMCBvciAtMjU2ICovCisKKwlpZiAoc2F0JjB4ZmYpCXJldHVybiBicncgfCAweDgwOworCWVsc2UJCXJldHVybiBicncgKyAocmV0JjB4RkYpOworfQorCitzdGF0aWMgaW50IGhhdmVfaGFuZHNoYWtlX2ZyYWdtZW50KFNTTCAqcywgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgCisJaW50IGxlbiwgaW50IHBlZWspOworc3RhdGljIGludCBkdGxzMV9yZWNvcmRfcmVwbGF5X2NoZWNrKFNTTCAqcywgRFRMUzFfQklUTUFQICpiaXRtYXApOworc3RhdGljIHZvaWQgZHRsczFfcmVjb3JkX2JpdG1hcF91cGRhdGUoU1NMICpzLCBEVExTMV9CSVRNQVAgKmJpdG1hcCk7CitzdGF0aWMgRFRMUzFfQklUTUFQICpkdGxzMV9nZXRfYml0bWFwKFNTTCAqcywgU1NMM19SRUNPUkQgKnJyLCAKKyAgICB1bnNpZ25lZCBpbnQgKmlzX25leHRfZXBvY2gpOworI2lmIDAKK3N0YXRpYyBpbnQgZHRsczFfcmVjb3JkX25lZWRzX2J1ZmZlcmluZyhTU0wgKnMsIFNTTDNfUkVDT1JEICpyciwKKwl1bnNpZ25lZCBzaG9ydCAqcHJpb3JpdHksIHVuc2lnbmVkIGxvbmcgKm9mZnNldCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgZHRsczFfYnVmZmVyX3JlY29yZChTU0wgKnMsIHJlY29yZF9wcXVldWUgKnEsCisJdW5zaWduZWQgY2hhciAqcHJpb3JpdHkpOworc3RhdGljIGludCBkdGxzMV9wcm9jZXNzX3JlY29yZChTU0wgKnMpOworc3RhdGljIHZvaWQgZHRsczFfY2xlYXJfdGltZW91dHMoU1NMICpzKTsKKworLyogY29weSBidWZmZXJlZCByZWNvcmQgaW50byBTU0wgc3RydWN0dXJlICovCitzdGF0aWMgaW50CitkdGxzMV9jb3B5X3JlY29yZChTU0wgKnMsIHBpdGVtICppdGVtKQorICAgIHsKKyAgICBEVExTMV9SRUNPUkRfREFUQSAqcmRhdGE7CisKKyAgICByZGF0YSA9IChEVExTMV9SRUNPUkRfREFUQSAqKWl0ZW0tPmRhdGE7CisgICAgCisgICAgaWYgKHMtPnMzLT5yYnVmLmJ1ZiAhPSBOVUxMKQorICAgICAgICBPUEVOU1NMX2ZyZWUocy0+czMtPnJidWYuYnVmKTsKKyAgICAKKyAgICBzLT5wYWNrZXQgPSByZGF0YS0+cGFja2V0OworICAgIHMtPnBhY2tldF9sZW5ndGggPSByZGF0YS0+cGFja2V0X2xlbmd0aDsKKyAgICBtZW1jcHkoJihzLT5zMy0+cmJ1ZiksICYocmRhdGEtPnJidWYpLCBzaXplb2YoU1NMM19CVUZGRVIpKTsKKyAgICBtZW1jcHkoJihzLT5zMy0+cnJlYyksICYocmRhdGEtPnJyZWMpLCBzaXplb2YoU1NMM19SRUNPUkQpKTsKKwkKKwkvKiBTZXQgcHJvcGVyIHNlcXVlbmNlIG51bWJlciBmb3IgbWFjIGNhbGN1bGF0aW9uICovCisJbWVtY3B5KCYocy0+czMtPnJlYWRfc2VxdWVuY2VbMl0pLCAmKHJkYXRhLT5wYWNrZXRbNV0pLCA2KTsKKyAgICAKKyAgICByZXR1cm4oMSk7CisgICAgfQorCisKK3N0YXRpYyBpbnQKK2R0bHMxX2J1ZmZlcl9yZWNvcmQoU1NMICpzLCByZWNvcmRfcHF1ZXVlICpxdWV1ZSwgdW5zaWduZWQgY2hhciAqcHJpb3JpdHkpCisJeworCURUTFMxX1JFQ09SRF9EQVRBICpyZGF0YTsKKwlwaXRlbSAqaXRlbTsKKworCS8qIExpbWl0IHRoZSBzaXplIG9mIHRoZSBxdWV1ZSB0byBwcmV2ZW50IERPUyBhdHRhY2tzICovCisJaWYgKHBxdWV1ZV9zaXplKHF1ZXVlLT5xKSA+PSAxMDApCisJCXJldHVybiAwOworCQkKKwlyZGF0YSA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihEVExTMV9SRUNPUkRfREFUQSkpOworCWl0ZW0gPSBwaXRlbV9uZXcocHJpb3JpdHksIHJkYXRhKTsKKwlpZiAocmRhdGEgPT0gTlVMTCB8fCBpdGVtID09IE5VTEwpCisJCXsKKwkJaWYgKHJkYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShyZGF0YSk7CisJCWlmIChpdGVtICE9IE5VTEwpIHBpdGVtX2ZyZWUoaXRlbSk7CisJCQorCQlTU0xlcnIoU1NMX0ZfRFRMUzFfQlVGRkVSX1JFQ09SRCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlyZXR1cm4oMCk7CisJCX0KKwkKKwlyZGF0YS0+cGFja2V0ID0gcy0+cGFja2V0OworCXJkYXRhLT5wYWNrZXRfbGVuZ3RoID0gcy0+cGFja2V0X2xlbmd0aDsKKwltZW1jcHkoJihyZGF0YS0+cmJ1ZiksICYocy0+czMtPnJidWYpLCBzaXplb2YoU1NMM19CVUZGRVIpKTsKKwltZW1jcHkoJihyZGF0YS0+cnJlYyksICYocy0+czMtPnJyZWMpLCBzaXplb2YoU1NMM19SRUNPUkQpKTsKKworCWl0ZW0tPmRhdGEgPSByZGF0YTsKKworCS8qIGluc2VydCBzaG91bGQgbm90IGZhaWwsIHNpbmNlIGR1cGxpY2F0ZXMgYXJlIGRyb3BwZWQgKi8KKwlpZiAocHF1ZXVlX2luc2VydChxdWV1ZS0+cSwgaXRlbSkgPT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX2ZyZWUocmRhdGEpOworCQlwaXRlbV9mcmVlKGl0ZW0pOworCQlyZXR1cm4oMCk7CisJCX0KKworCXMtPnBhY2tldCA9IE5VTEw7CisJcy0+cGFja2V0X2xlbmd0aCA9IDA7CisJbWVtc2V0KCYocy0+czMtPnJidWYpLCAwLCBzaXplb2YoU1NMM19CVUZGRVIpKTsKKwltZW1zZXQoJihzLT5zMy0+cnJlYyksIDAsIHNpemVvZihTU0wzX1JFQ09SRCkpOworCQorCWlmICghc3NsM19zZXR1cF9idWZmZXJzKHMpKQorCQl7CisJCVNTTGVycihTU0xfRl9EVExTMV9CVUZGRVJfUkVDT1JELCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCU9QRU5TU0xfZnJlZShyZGF0YSk7CisJCXBpdGVtX2ZyZWUoaXRlbSk7CisJCXJldHVybigwKTsKKwkJfQorCQorCXJldHVybigxKTsKKwl9CisKKworc3RhdGljIGludAorZHRsczFfcmV0cmlldmVfYnVmZmVyZWRfcmVjb3JkKFNTTCAqcywgcmVjb3JkX3BxdWV1ZSAqcXVldWUpCisgICAgeworICAgIHBpdGVtICppdGVtOworCisgICAgaXRlbSA9IHBxdWV1ZV9wb3AocXVldWUtPnEpOworICAgIGlmIChpdGVtKQorICAgICAgICB7CisgICAgICAgIGR0bHMxX2NvcHlfcmVjb3JkKHMsIGl0ZW0pOworCisgICAgICAgIE9QRU5TU0xfZnJlZShpdGVtLT5kYXRhKTsKKwkJcGl0ZW1fZnJlZShpdGVtKTsKKworICAgICAgICByZXR1cm4oMSk7CisgICAgICAgIH0KKworICAgIHJldHVybigwKTsKKyAgICB9CisKKworLyogcmV0cmlldmUgYSBidWZmZXJlZCByZWNvcmQgdGhhdCBiZWxvbmdzIHRvIHRoZSBuZXcgZXBvY2gsIGkuZS4sIG5vdCBwcm9jZXNzZWQgCisgKiB5ZXQgKi8KKyNkZWZpbmUgZHRsczFfZ2V0X3VucHJvY2Vzc2VkX3JlY29yZChzKSBcCisgICAgICAgICAgICAgICAgICAgZHRsczFfcmV0cmlldmVfYnVmZmVyZWRfcmVjb3JkKChzKSwgXAorICAgICAgICAgICAgICAgICAgICYoKHMpLT5kMS0+dW5wcm9jZXNzZWRfcmNkcykpCisKKy8qIHJldHJpZXZlIGEgYnVmZmVyZWQgcmVjb3JkIHRoYXQgYmVsb25ncyB0byB0aGUgY3VycmVudCBlcG9jaCwgaWUsIHByb2Nlc3NlZCAqLworI2RlZmluZSBkdGxzMV9nZXRfcHJvY2Vzc2VkX3JlY29yZChzKSBcCisgICAgICAgICAgICAgICAgICAgZHRsczFfcmV0cmlldmVfYnVmZmVyZWRfcmVjb3JkKChzKSwgXAorICAgICAgICAgICAgICAgICAgICYoKHMpLT5kMS0+cHJvY2Vzc2VkX3JjZHMpKQorCitzdGF0aWMgaW50CitkdGxzMV9wcm9jZXNzX2J1ZmZlcmVkX3JlY29yZHMoU1NMICpzKQorICAgIHsKKyAgICBwaXRlbSAqaXRlbTsKKyAgICAKKyAgICBpdGVtID0gcHF1ZXVlX3BlZWsocy0+ZDEtPnVucHJvY2Vzc2VkX3JjZHMucSk7CisgICAgaWYgKGl0ZW0pCisgICAgICAgIHsKKyAgICAgICAgRFRMUzFfUkVDT1JEX0RBVEEgKnJkYXRhOworICAgICAgICByZGF0YSA9IChEVExTMV9SRUNPUkRfREFUQSAqKWl0ZW0tPmRhdGE7CisgICAgICAgIAorICAgICAgICAvKiBDaGVjayBpZiBlcG9jaCBpcyBjdXJyZW50LiAqLworICAgICAgICBpZiAocy0+ZDEtPnVucHJvY2Vzc2VkX3JjZHMuZXBvY2ggIT0gcy0+ZDEtPnJfZXBvY2gpCisgICAgICAgICAgICByZXR1cm4oMSk7ICAvKiBOb3RoaW5nIHRvIGRvLiAqLworICAgICAgICAKKyAgICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIHJlY29yZHMuICovCisgICAgICAgIHdoaWxlIChwcXVldWVfcGVlayhzLT5kMS0+dW5wcm9jZXNzZWRfcmNkcy5xKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGR0bHMxX2dldF91bnByb2Nlc3NlZF9yZWNvcmQocyk7CisgICAgICAgICAgICBpZiAoICEgZHRsczFfcHJvY2Vzc19yZWNvcmQocykpCisgICAgICAgICAgICAgICAgcmV0dXJuKDApOworICAgICAgICAgICAgZHRsczFfYnVmZmVyX3JlY29yZChzLCAmKHMtPmQxLT5wcm9jZXNzZWRfcmNkcyksIAorICAgICAgICAgICAgICAgIHMtPnMzLT5ycmVjLnNlcV9udW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAvKiBzeW5jIGVwb2NoIG51bWJlcnMgb25jZSBhbGwgdGhlIHVucHJvY2Vzc2VkIHJlY29yZHMgCisgICAgICogaGF2ZSBiZWVuIHByb2Nlc3NlZCAqLworICAgIHMtPmQxLT5wcm9jZXNzZWRfcmNkcy5lcG9jaCA9IHMtPmQxLT5yX2Vwb2NoOworICAgIHMtPmQxLT51bnByb2Nlc3NlZF9yY2RzLmVwb2NoID0gcy0+ZDEtPnJfZXBvY2ggKyAxOworCisgICAgcmV0dXJuKDEpOworICAgIH0KKworCisjaWYgMAorCitzdGF0aWMgaW50CitkdGxzMV9nZXRfYnVmZmVyZWRfcmVjb3JkKFNTTCAqcykKKwl7CisJcGl0ZW0gKml0ZW07CisJUFFfNjRCSVQgcHJpb3JpdHkgPSAKKwkJKCgoUFFfNjRCSVQpcy0+ZDEtPmhhbmRzaGFrZV9yZWFkX3NlcSkgPDwgMzIpIHwgCisJCSgoUFFfNjRCSVQpcy0+ZDEtPnJfbXNnX2hkci5mcmFnX29mZik7CisJCisJaWYgKCAhIFNTTF9pbl9pbml0KHMpKSAgLyogaWYgd2UncmUgbm90IChyZSluZWdvdGlhdGluZywgCisJCQkJCQkJICAgbm90aGluZyBidWZmZXJlZCAqLworCQlyZXR1cm4gMDsKKworCisJaXRlbSA9IHBxdWV1ZV9wZWVrKHMtPmQxLT5yY3ZkX3JlY29yZHMpOworCWlmIChpdGVtICYmIGl0ZW0tPnByaW9yaXR5ID09IHByaW9yaXR5KQorCQl7CisJCS8qIENoZWNrIGlmIHdlJ3ZlIHJlY2VpdmVkIHRoZSByZWNvcmQgb2YgaW50ZXJlc3QuICBJdCBtdXN0IGJlCisJCSAqIGEgaGFuZHNoYWtlIHJlY29yZCwgc2luY2UgZGF0YSByZWNvcmRzIGFzIHBhc3NlZCB1cCB3aXRob3V0CisJCSAqIGJ1ZmZlcmluZyAqLworCQlEVExTMV9SRUNPUkRfREFUQSAqcmRhdGE7CisJCWl0ZW0gPSBwcXVldWVfcG9wKHMtPmQxLT5yY3ZkX3JlY29yZHMpOworCQlyZGF0YSA9IChEVExTMV9SRUNPUkRfREFUQSAqKWl0ZW0tPmRhdGE7CisJCQorCQlpZiAocy0+czMtPnJidWYuYnVmICE9IE5VTEwpCisJCQlPUEVOU1NMX2ZyZWUocy0+czMtPnJidWYuYnVmKTsKKwkJCisJCXMtPnBhY2tldCA9IHJkYXRhLT5wYWNrZXQ7CisJCXMtPnBhY2tldF9sZW5ndGggPSByZGF0YS0+cGFja2V0X2xlbmd0aDsKKwkJbWVtY3B5KCYocy0+czMtPnJidWYpLCAmKHJkYXRhLT5yYnVmKSwgc2l6ZW9mKFNTTDNfQlVGRkVSKSk7CisJCW1lbWNweSgmKHMtPnMzLT5ycmVjKSwgJihyZGF0YS0+cnJlYyksIHNpemVvZihTU0wzX1JFQ09SRCkpOworCQkKKwkJT1BFTlNTTF9mcmVlKGl0ZW0tPmRhdGEpOworCQlwaXRlbV9mcmVlKGl0ZW0pOworCQkKKwkJLyogcy0+ZDEtPm5leHRfZXhwZWN0ZWRfc2VxX251bSsrOyAqLworCQlyZXR1cm4oMSk7CisJCX0KKwkKKwlyZXR1cm4gMDsKKwl9CisKKyNlbmRpZgorCitzdGF0aWMgaW50CitkdGxzMV9wcm9jZXNzX3JlY29yZChTU0wgKnMpCit7CisJaW50IGksYWw7CisJaW50IGNsZWFyPTA7CisJaW50IGVuY19lcnI7CisJU1NMX1NFU1NJT04gKnNlc3M7CisJU1NMM19SRUNPUkQgKnJyOworCXVuc2lnbmVkIGludCBtYWNfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyIG1kW0VWUF9NQVhfTURfU0laRV07CisKKworCXJyPSAmKHMtPnMzLT5ycmVjKTsKKwlzZXNzID0gcy0+c2Vzc2lvbjsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHMtPnBhY2tldF9sZW5ndGggPT0gU1NMM19SVF9IRUFERVJfTE5HVEggKyByci0+bGVuZ3RoLAorCSAqIGFuZCB3ZSBoYXZlIHRoYXQgbWFueSBieXRlcyBpbiBzLT5wYWNrZXQKKwkgKi8KKwlyci0+aW5wdXQ9ICYocy0+cGFja2V0W0RUTFMxX1JUX0hFQURFUl9MRU5HVEhdKTsKKworCS8qIG9rLCB3ZSBjYW4gbm93IHJlYWQgZnJvbSAncy0+cGFja2V0JyBkYXRhIGludG8gJ3JyJworCSAqIHJyLT5pbnB1dCBwb2ludHMgYXQgcnItPmxlbmd0aCBieXRlcywgd2hpY2gKKwkgKiBuZWVkIHRvIGJlIGNvcGllZCBpbnRvIHJyLT5kYXRhIGJ5IGVpdGhlcgorCSAqIHRoZSBkZWNyeXB0aW9uIG9yIGJ5IHRoZSBkZWNvbXByZXNzaW9uCisJICogV2hlbiB0aGUgZGF0YSBpcyAnY29waWVkJyBpbnRvIHRoZSByci0+ZGF0YSBidWZmZXIsCisJICogcnItPmlucHV0IHdpbGwgYmUgcG9pbnRlZCBhdCB0aGUgbmV3IGJ1ZmZlciAqLyAKKworCS8qIFdlIG5vdyBoYXZlIC0gZW5jcnlwdGVkIFsgTUFDIFsgY29tcHJlc3NlZCBbIHBsYWluIF0gXSBdCisJICogcnItPmxlbmd0aCBieXRlcyBvZiBlbmNyeXB0ZWQgY29tcHJlc3NlZCBzdHVmZi4gKi8KKworCS8qIGNoZWNrIGlzIG5vdCBuZWVkZWQgSSBiZWxpZXZlICovCisJaWYgKHJyLT5sZW5ndGggPiBTU0wzX1JUX01BWF9FTkNSWVBURURfTEVOR1RIKQorCQl7CisJCWFsPVNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7CisJCVNTTGVycihTU0xfRl9EVExTMV9QUk9DRVNTX1JFQ09SRCxTU0xfUl9FTkNSWVBURURfTEVOR1RIX1RPT19MT05HKTsKKwkJZ290byBmX2VycjsKKwkJfQorCisJLyogZGVjcnlwdCBpbiBwbGFjZSBpbiAncnItPmlucHV0JyAqLworCXJyLT5kYXRhPXJyLT5pbnB1dDsKKworCWVuY19lcnIgPSBzLT5tZXRob2QtPnNzbDNfZW5jLT5lbmMocywwKTsKKwlpZiAoZW5jX2VyciA8PSAwKQorCQl7CisJCWlmIChlbmNfZXJyID09IDApCisJCQkvKiBTU0xlcnIoKSBhbmQgc3NsM19zZW5kX2FsZXJ0KCkgaGF2ZSBiZWVuIGNhbGxlZCAqLworCQkJZ290byBlcnI7CisKKwkJLyogb3RoZXJ3aXNlIGVuY19lcnIgPT0gLTEgKi8KKwkJZ290byBlcnI7CisJCX0KKworI2lmZGVmIFRMU19ERUJVRworcHJpbnRmKCJkZWMgJWRcbiIscnItPmxlbmd0aCk7Cit7IHVuc2lnbmVkIGludCB6OyBmb3IgKHo9MDsgejxyci0+bGVuZ3RoOyB6KyspIHByaW50ZigiJTAyWCVjIixyci0+ZGF0YVt6XSwoKHorMSklMTYpPycgJzonXG4nKTsgfQorcHJpbnRmKCJcbiIpOworI2VuZGlmCisKKwkvKiByLT5sZW5ndGggaXMgbm93IHRoZSBjb21wcmVzc2VkIGRhdGEgcGx1cyBtYWMgKi8KKwlpZiAoCShzZXNzID09IE5VTEwpIHx8CisJCShzLT5lbmNfcmVhZF9jdHggPT0gTlVMTCkgfHwKKwkJKHMtPnJlYWRfaGFzaCA9PSBOVUxMKSkKKwkJY2xlYXI9MTsKKworCWlmICghY2xlYXIpCisJCXsKKwkJLyogIWNsZWFyID0+IHMtPnJlYWRfaGFzaCAhPSBOVUxMID0+IG1hY19zaXplICE9IC0xICovCisJCWludCB0OworCQl0PUVWUF9NRF9DVFhfc2l6ZShzLT5yZWFkX2hhc2gpOworCQlPUEVOU1NMX2Fzc2VydCh0ID49IDApOworCQltYWNfc2l6ZT10OworCisJCWlmIChyci0+bGVuZ3RoID4gU1NMM19SVF9NQVhfQ09NUFJFU1NFRF9MRU5HVEgrbWFjX3NpemUpCisJCQl7CisjaWYgMCAvKiBPSyBvbmx5IGZvciBzdHJlYW0gY2lwaGVycyAodGhlbiByci0+bGVuZ3RoIGlzIHZpc2libGUgZnJvbSBjaXBoZXJ0ZXh0IGFueXdheSkgKi8KKwkJCWFsPVNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfUFJPQ0VTU19SRUNPUkQsU1NMX1JfUFJFX01BQ19MRU5HVEhfVE9PX0xPTkcpOworCQkJZ290byBmX2VycjsKKyNlbHNlCisJCQlnb3RvIGVycjsKKyNlbmRpZgkJCQorCQkJfQorCQkvKiBjaGVjayB0aGUgTUFDIGZvciByci0+aW5wdXQgKGl0J3MgaW4gbWFjX3NpemUgYnl0ZXMgYXQgdGhlIHRhaWwpICovCisJCWlmIChyci0+bGVuZ3RoIDwgbWFjX3NpemUpCisJCQl7CisjaWYgMCAvKiBPSyBvbmx5IGZvciBzdHJlYW0gY2lwaGVycyAqLworCQkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9EVExTMV9QUk9DRVNTX1JFQ09SRCxTU0xfUl9MRU5HVEhfVE9PX1NIT1JUKTsKKwkJCWdvdG8gZl9lcnI7CisjZWxzZQorCQkJZ290byBlcnI7CisjZW5kaWYKKwkJCX0KKwkJcnItPmxlbmd0aC09bWFjX3NpemU7CisJCWk9cy0+bWV0aG9kLT5zc2wzX2VuYy0+bWFjKHMsbWQsMCk7CisJCWlmIChpIDwgMCB8fCBtZW1jbXAobWQsJihyci0+ZGF0YVtyci0+bGVuZ3RoXSksbWFjX3NpemUpICE9IDApCisJCQl7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJLyogci0+bGVuZ3RoIGlzIG5vdyBqdXN0IGNvbXByZXNzZWQgKi8KKwlpZiAocy0+ZXhwYW5kICE9IE5VTEwpCisJCXsKKwkJaWYgKHJyLT5sZW5ndGggPiBTU0wzX1JUX01BWF9DT01QUkVTU0VEX0xFTkdUSCkKKwkJCXsKKwkJCWFsPVNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfUFJPQ0VTU19SRUNPUkQsU1NMX1JfQ09NUFJFU1NFRF9MRU5HVEhfVE9PX0xPTkcpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJaWYgKCFzc2wzX2RvX3VuY29tcHJlc3MocykpCisJCQl7CisJCQlhbD1TU0xfQURfREVDT01QUkVTU0lPTl9GQUlMVVJFOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1BST0NFU1NfUkVDT1JELFNTTF9SX0JBRF9ERUNPTVBSRVNTSU9OKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCX0KKworCWlmIChyci0+bGVuZ3RoID4gU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIKQorCQl7CisJCWFsPVNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7CisJCVNTTGVycihTU0xfRl9EVExTMV9QUk9DRVNTX1JFQ09SRCxTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORyk7CisJCWdvdG8gZl9lcnI7CisJCX0KKworCXJyLT5vZmY9MDsKKwkvKiBTbyBhdCB0aGlzIHBvaW50IHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZQorCSAqIHNzbC0+czMtPnJyZWMudHlwZSAJaXMgdGhlIHR5cGUgb2YgcmVjb3JkCisJICogc3NsLT5zMy0+cnJlYy5sZW5ndGgJPT0gbnVtYmVyIG9mIGJ5dGVzIGluIHJlY29yZAorCSAqIHNzbC0+czMtPnJyZWMub2ZmCT09IG9mZnNldCB0byBmaXJzdCB2YWxpZCBieXRlCisJICogc3NsLT5zMy0+cnJlYy5kYXRhCT09IHdoZXJlIHRvIHRha2UgYnl0ZXMgZnJvbSwgaW5jcmVtZW50CisJICoJCQkgICBhZnRlciB1c2UgOi0pLgorCSAqLworCisJLyogd2UgaGF2ZSBwdWxsZWQgaW4gYSBmdWxsIHBhY2tldCBzbyB6ZXJvIHRoaW5ncyAqLworCXMtPnBhY2tldF9sZW5ndGg9MDsKKwlkdGxzMV9yZWNvcmRfYml0bWFwX3VwZGF0ZShzLCAmKHMtPmQxLT5iaXRtYXApKTsvKiBNYXJrIHJlY2VpcHQgb2YgcmVjb3JkLiAqLworCXJldHVybigxKTsKKworZl9lcnI6CisJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxhbCk7CitlcnI6CisJcmV0dXJuKDApOworfQorCisKKy8qIENhbGwgdGhpcyB0byBnZXQgYSBuZXcgaW5wdXQgcmVjb3JkLgorICogSXQgd2lsbCByZXR1cm4gPD0gMCBpZiBtb3JlIGRhdGEgaXMgbmVlZGVkLCBub3JtYWxseSBkdWUgdG8gYW4gZXJyb3IKKyAqIG9yIG5vbi1ibG9ja2luZyBJTy4KKyAqIFdoZW4gaXQgZmluaXNoZXMsIG9uZSBwYWNrZXQgaGFzIGJlZW4gZGVjb2RlZCBhbmQgY2FuIGJlIGZvdW5kIGluCisgKiBzc2wtPnMzLT5ycmVjLnR5cGUgICAgLSBpcyB0aGUgdHlwZSBvZiByZWNvcmQKKyAqIHNzbC0+czMtPnJyZWMuZGF0YSwgCSAtIGRhdGEKKyAqIHNzbC0+czMtPnJyZWMubGVuZ3RoLCAtIG51bWJlciBvZiBieXRlcworICovCisvKiB1c2VkIG9ubHkgYnkgZHRsczFfcmVhZF9ieXRlcyAqLworaW50IGR0bHMxX2dldF9yZWNvcmQoU1NMICpzKQorCXsKKwlpbnQgc3NsX21ham9yLHNzbF9taW5vcjsKKwlpbnQgaSxuOworCVNTTDNfUkVDT1JEICpycjsKKwlTU0xfU0VTU0lPTiAqc2VzczsKKwl1bnNpZ25lZCBjaGFyICpwID0gTlVMTDsKKwl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOworCURUTFMxX0JJVE1BUCAqYml0bWFwOworCXVuc2lnbmVkIGludCBpc19uZXh0X2Vwb2NoOworCisJcnI9ICYocy0+czMtPnJyZWMpOworCXNlc3M9cy0+c2Vzc2lvbjsKKworCS8qIFRoZSBlcG9jaCBtYXkgaGF2ZSBjaGFuZ2VkLiAgSWYgc28sIHByb2Nlc3MgYWxsIHRoZQorCSAqIHBlbmRpbmcgcmVjb3Jkcy4gIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgb3BlcmF0aW9uLiAqLworCWR0bHMxX3Byb2Nlc3NfYnVmZmVyZWRfcmVjb3JkcyhzKTsKKworCS8qIGlmIHdlJ3JlIHJlbmVnb3RpYXRpbmcsIHRoZW4gdGhlcmUgbWF5IGJlIGJ1ZmZlcmVkIHJlY29yZHMgKi8KKwlpZiAoZHRsczFfZ2V0X3Byb2Nlc3NlZF9yZWNvcmQocykpCisJCXJldHVybiAxOworCisJLyogZ2V0IHNvbWV0aGluZyBmcm9tIHRoZSB3aXJlICovCithZ2FpbjoKKwkvKiBjaGVjayBpZiB3ZSBoYXZlIHRoZSBoZWFkZXIgKi8KKwlpZiAoCShzLT5yc3RhdGUgIT0gU1NMX1NUX1JFQURfQk9EWSkgfHwKKwkJKHMtPnBhY2tldF9sZW5ndGggPCBEVExTMV9SVF9IRUFERVJfTEVOR1RIKSkgCisJCXsKKwkJbj1zc2wzX3JlYWRfbihzLCBEVExTMV9SVF9IRUFERVJfTEVOR1RILCBzLT5zMy0+cmJ1Zi5sZW4sIDApOworCQkvKiByZWFkIHRpbWVvdXQgaXMgaGFuZGxlZCBieSBkdGxzMV9yZWFkX2J5dGVzICovCisJCWlmIChuIDw9IDApIHJldHVybihuKTsgLyogZXJyb3Igb3Igbm9uLWJsb2NraW5nICovCisKKwkJLyogdGhpcyBwYWNrZXQgY29udGFpbmVkIGEgcGFydGlhbCByZWNvcmQsIGR1bXAgaXQgKi8KKwkJaWYgKHMtPnBhY2tldF9sZW5ndGggIT0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSCkKKwkJCXsKKwkJCXMtPnBhY2tldF9sZW5ndGggPSAwOworCQkJZ290byBhZ2FpbjsKKwkJCX0KKworCQlzLT5yc3RhdGU9U1NMX1NUX1JFQURfQk9EWTsKKworCQlwPXMtPnBhY2tldDsKKworCQkvKiBQdWxsIGFwYXJ0IHRoZSBoZWFkZXIgaW50byB0aGUgRFRMUzFfUkVDT1JEICovCisJCXJyLT50eXBlPSAqKHArKyk7CisJCXNzbF9tYWpvcj0gKihwKyspOworCQlzc2xfbWlub3I9ICoocCsrKTsKKwkJdmVyc2lvbj0oc3NsX21ham9yPDw4KXxzc2xfbWlub3I7CisKKwkJLyogc2VxdWVuY2UgbnVtYmVyIGlzIDY0IGJpdHMsIHdpdGggdG9wIDIgYnl0ZXMgPSBlcG9jaCAqLyAKKwkJbjJzKHAscnItPmVwb2NoKTsKKworCQltZW1jcHkoJihzLT5zMy0+cmVhZF9zZXF1ZW5jZVsyXSksIHAsIDYpOworCQlwKz02OworCisJCW4ycyhwLHJyLT5sZW5ndGgpOworCisJCS8qIExldHMgY2hlY2sgdmVyc2lvbiAqLworCQlpZiAoIXMtPmZpcnN0X3BhY2tldCkKKwkJCXsKKwkJCWlmICh2ZXJzaW9uICE9IHMtPnZlcnNpb24pCisJCQkJeworCQkJCS8qIHVuZXhwZWN0ZWQgdmVyc2lvbiwgc2lsZW50bHkgZGlzY2FyZCAqLworCQkJCXJyLT5sZW5ndGggPSAwOworCQkJCXMtPnBhY2tldF9sZW5ndGggPSAwOworCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJfQorCisJCWlmICgodmVyc2lvbiAmIDB4ZmYwMCkgIT0gKHMtPnZlcnNpb24gJiAweGZmMDApKQorCQkJeworCQkJLyogd3JvbmcgdmVyc2lvbiwgc2lsZW50bHkgZGlzY2FyZCByZWNvcmQgKi8KKwkJCXJyLT5sZW5ndGggPSAwOworCQkJcy0+cGFja2V0X2xlbmd0aCA9IDA7CisJCQlnb3RvIGFnYWluOworCQkJfQorCisJCWlmIChyci0+bGVuZ3RoID4gU1NMM19SVF9NQVhfRU5DUllQVEVEX0xFTkdUSCkKKwkJCXsKKwkJCS8qIHJlY29yZCB0b28gbG9uZywgc2lsZW50bHkgZGlzY2FyZCBpdCAqLworCQkJcnItPmxlbmd0aCA9IDA7CisJCQlzLT5wYWNrZXRfbGVuZ3RoID0gMDsKKwkJCWdvdG8gYWdhaW47CisJCQl9CisKKwkJLyogSWYgd2UgcmVjZWl2ZSBhIHZhbGlkIHJlY29yZCBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBidWZmZXIgc2l6ZSwKKwkJICogYWxsb2NhdGUgc29tZSBtZW1vcnkgZm9yIGl0LgorCQkgKi8KKwkJaWYgKHJyLT5sZW5ndGggPiBzLT5zMy0+cmJ1Zi5sZW4gLSBEVExTMV9SVF9IRUFERVJfTEVOR1RIKQorCQkJeworCQkJdW5zaWduZWQgY2hhciAqcHA7CisJCQl1bnNpZ25lZCBpbnQgbmV3bGVuID0gcnItPmxlbmd0aCArIERUTFMxX1JUX0hFQURFUl9MRU5HVEg7CisJCQlpZiAoKHBwPU9QRU5TU0xfcmVhbGxvYyhzLT5zMy0+cmJ1Zi5idWYsIG5ld2xlbikpPT1OVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfR0VUX1JFQ09SRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJcmV0dXJuKC0xKTsKKwkJCQl9CisJCQlwID0gcHAgKyAocCAtIHMtPnMzLT5yYnVmLmJ1Zik7CisJCQlzLT5zMy0+cmJ1Zi5idWY9cHA7CisJCQlzLT5zMy0+cmJ1Zi5sZW49bmV3bGVuOworCQkJcy0+cGFja2V0PSAmKHMtPnMzLT5yYnVmLmJ1ZlswXSk7CisJCQl9CisKKwkJLyogbm93IHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9CT0RZICovCisJCX0KKworCS8qIHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9CT0RZLCBnZXQgYW5kIGRlY29kZSB0aGUgZGF0YSAqLworCisJaWYgKHJyLT5sZW5ndGggPiBzLT5wYWNrZXRfbGVuZ3RoLURUTFMxX1JUX0hFQURFUl9MRU5HVEgpCisJCXsKKwkJLyogbm93IHMtPnBhY2tldF9sZW5ndGggPT0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSCAqLworCQlpPXJyLT5sZW5ndGg7CisJCW49c3NsM19yZWFkX24ocyxpLGksMSk7CisJCWlmIChuIDw9IDApIHJldHVybihuKTsgLyogZXJyb3Igb3Igbm9uLWJsb2NraW5nIGlvICovCisKKwkJLyogdGhpcyBwYWNrZXQgY29udGFpbmVkIGEgcGFydGlhbCByZWNvcmQsIGR1bXAgaXQgKi8KKwkJaWYgKCBuICE9IGkpCisJCQl7CisJCQlyci0+bGVuZ3RoID0gMDsKKwkJCXMtPnBhY2tldF9sZW5ndGggPSAwOworCQkJZ290byBhZ2FpbjsKKwkJCX0KKworCQkvKiBub3cgbiA9PSByci0+bGVuZ3RoLAorCQkgKiBhbmQgcy0+cGFja2V0X2xlbmd0aCA9PSBEVExTMV9SVF9IRUFERVJfTEVOR1RIICsgcnItPmxlbmd0aCAqLworCQl9CisJcy0+cnN0YXRlPVNTTF9TVF9SRUFEX0hFQURFUjsgLyogc2V0IHN0YXRlIGZvciBsYXRlciBvcGVyYXRpb25zICovCisKKwkvKiBtYXRjaCBlcG9jaHMuICBOVUxMIG1lYW5zIHRoZSBwYWNrZXQgaXMgZHJvcHBlZCBvbiB0aGUgZmxvb3IgKi8KKwliaXRtYXAgPSBkdGxzMV9nZXRfYml0bWFwKHMsIHJyLCAmaXNfbmV4dF9lcG9jaCk7CisJaWYgKCBiaXRtYXAgPT0gTlVMTCkKKwkJeworCQlyci0+bGVuZ3RoID0gMDsKKwkJcy0+cGFja2V0X2xlbmd0aCA9IDA7ICAvKiBkdW1wIHRoaXMgcmVjb3JkICovCisJCWdvdG8gYWdhaW47ICAgLyogZ2V0IGFub3RoZXIgcmVjb3JkICovCisJCX0KKworCS8qIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIHJlcGVhdCwgb3IgYWdlZCByZWNvcmQuCisJICogRG9uJ3QgY2hlY2sgaWYgd2UncmUgbGlzdGVuaW5nIGFuZCB0aGlzIG1lc3NhZ2UgaXMKKwkgKiBhIENsaWVudEhlbGxvLiBUaGV5IGNhbiBsb29rIGFzIGlmIHRoZXkncmUgcmVwbGF5ZWQsCisJICogc2luY2UgdGhleSBhcnJpdmUgZnJvbSBkaWZmZXJlbnQgY29ubmVjdGlvbnMgYW5kCisJICogd291bGQgYmUgZHJvcHBlZCB1bm5lY2Vzc2FyaWx5LgorCSAqLworCWlmICghKHMtPmQxLT5saXN0ZW4gJiYgcnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UgJiYKKwkJKnAgPT0gU1NMM19NVF9DTElFTlRfSEVMTE8pICYmCisJCSFkdGxzMV9yZWNvcmRfcmVwbGF5X2NoZWNrKHMsIGJpdG1hcCkpCisJCXsKKwkJcnItPmxlbmd0aCA9IDA7CisJCXMtPnBhY2tldF9sZW5ndGg9MDsgLyogZHVtcCB0aGlzIHJlY29yZCAqLworCQlnb3RvIGFnYWluOyAgICAgLyogZ2V0IGFub3RoZXIgcmVjb3JkICovCisJCX0KKworCS8qIGp1c3QgcmVhZCBhIDAgbGVuZ3RoIHBhY2tldCAqLworCWlmIChyci0+bGVuZ3RoID09IDApIGdvdG8gYWdhaW47CisKKwkvKiBJZiB0aGlzIHJlY29yZCBpcyBmcm9tIHRoZSBuZXh0IGVwb2NoIChlaXRoZXIgSE0gb3IgQUxFUlQpLAorCSAqIGFuZCBhIGhhbmRzaGFrZSBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MsIGJ1ZmZlciBpdCBzaW5jZSBpdAorCSAqIGNhbm5vdCBiZSBwcm9jZXNzZWQgYXQgdGhpcyB0aW1lLiAqLworCWlmIChpc19uZXh0X2Vwb2NoKQorCQl7CisJCWlmIChTU0xfaW5faW5pdChzKSB8fCBzLT5pbl9oYW5kc2hha2UpCisJCQl7CisJCQlkdGxzMV9idWZmZXJfcmVjb3JkKHMsICYocy0+ZDEtPnVucHJvY2Vzc2VkX3JjZHMpLCByci0+c2VxX251bSk7CisJCQl9CisJCXJyLT5sZW5ndGggPSAwOworCQlzLT5wYWNrZXRfbGVuZ3RoID0gMDsKKwkJZ290byBhZ2FpbjsKKwkJfQorCisJaWYgKCFkdGxzMV9wcm9jZXNzX3JlY29yZChzKSkKKwkJeworCQlyci0+bGVuZ3RoID0gMDsKKwkJcy0+cGFja2V0X2xlbmd0aCA9IDA7ICAvKiBkdW1wIHRoaXMgcmVjb3JkICovCisJCWdvdG8gYWdhaW47ICAgLyogZ2V0IGFub3RoZXIgcmVjb3JkICovCisJCX0KKworCWR0bHMxX2NsZWFyX3RpbWVvdXRzKHMpOyAgLyogZG9uZSB3YWl0aW5nICovCisJcmV0dXJuKDEpOworCisJfQorCisvKiBSZXR1cm4gdXAgdG8gJ2xlbicgcGF5bG9hZCBieXRlcyByZWNlaXZlZCBpbiAndHlwZScgcmVjb3Jkcy4KKyAqICd0eXBlJyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqCisgKiAgIC0gIFNTTDNfUlRfSEFORFNIQUtFICh3aGVuIHNzbDNfZ2V0X21lc3NhZ2UgY2FsbHMgdXMpCisgKiAgIC0gIFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSAod2hlbiBzc2wzX3JlYWQgY2FsbHMgdXMpCisgKiAgIC0gIDAgKGR1cmluZyBhIHNodXRkb3duLCBubyBkYXRhIGhhcyB0byBiZSByZXR1cm5lZCkKKyAqCisgKiBJZiB3ZSBkb24ndCBoYXZlIHN0b3JlZCBkYXRhIHRvIHdvcmsgZnJvbSwgcmVhZCBhIFNTTC9UTFMgcmVjb3JkIGZpcnN0CisgKiAocG9zc2libHkgbXVsdGlwbGUgcmVjb3JkcyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHJldHVybikuCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZSBhbnkgc3VycHJpc2VzIHRoZSBwZWVyIG1heSBoYXZlIGZvciB1cywgc3VjaCBhcworICogQWxlcnQgcmVjb3JkcyAoZS5nLiBjbG9zZV9ub3RpZnkpLCBDaGFuZ2VDaXBoZXJTcGVjIHJlY29yZHMgKG5vdCByZWFsbHkKKyAqIGEgc3VycHJpc2UsIGJ1dCBoYW5kbGVkIGFzIGlmIGl0IHdlcmUpLCBvciByZW5lZ290aWF0aW9uIHJlcXVlc3RzLgorICogQWxzbyBpZiByZWNvcmQgcGF5bG9hZHMgY29udGFpbiBmcmFnbWVudHMgdG9vIHNtYWxsIHRvIHByb2Nlc3MsIHdlIHN0b3JlCisgKiB0aGVtIHVudGlsIHRoZXJlIGlzIGVub3VnaCBmb3IgdGhlIHJlc3BlY3RpdmUgcHJvdG9jb2wgKHRoZSByZWNvcmQgcHJvdG9jb2wKKyAqIG1heSB1c2UgYXJiaXRyYXJ5IGZyYWdtZW50YXRpb24gYW5kIGV2ZW4gaW50ZXJsZWF2aW5nKToKKyAqICAgICBDaGFuZ2UgY2lwaGVyIHNwZWMgcHJvdG9jb2wKKyAqICAgICAgICAgICAgIGp1c3QgMSBieXRlIG5lZWRlZCwgbm8gbmVlZCBmb3Iga2VlcGluZyBhbnl0aGluZyBzdG9yZWQKKyAqICAgICBBbGVydCBwcm90b2NvbAorICogICAgICAgICAgICAgMiBieXRlcyBuZWVkZWQgKEFsZXJ0TGV2ZWwsIEFsZXJ0RGVzY3JpcHRpb24pCisgKiAgICAgSGFuZHNoYWtlIHByb3RvY29sCisgKiAgICAgICAgICAgICA0IGJ5dGVzIG5lZWRlZCAoSGFuZHNoYWtlVHlwZSwgdWludDI0IGxlbmd0aCkgLS0gd2UganVzdCBoYXZlCisgKiAgICAgICAgICAgICB0byBkZXRlY3QgdW5leHBlY3RlZCBDbGllbnQgSGVsbG8gYW5kIEhlbGxvIFJlcXVlc3QgbWVzc2FnZXMKKyAqICAgICAgICAgICAgIGhlcmUsIGFueXRoaW5nIGVsc2UgaXMgaGFuZGxlZCBieSBoaWdoZXIgbGF5ZXJzCisgKiAgICAgQXBwbGljYXRpb24gZGF0YSBwcm90b2NvbAorICogICAgICAgICAgICAgbm9uZSBvZiBvdXIgYnVzaW5lc3MKKyAqLworaW50IGR0bHMxX3JlYWRfYnl0ZXMoU1NMICpzLCBpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcGVlaykKKwl7CisJaW50IGFsLGksaixyZXQ7CisJdW5zaWduZWQgaW50IG47CisJU1NMM19SRUNPUkQgKnJyOworCXZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsaW50IHR5cGUyLGludCB2YWwpPU5VTEw7CisKKwlpZiAocy0+czMtPnJidWYuYnVmID09IE5VTEwpIC8qIE5vdCBpbml0aWFsaXplZCB5ZXQgKi8KKwkJaWYgKCFzc2wzX3NldHVwX2J1ZmZlcnMocykpCisJCQlyZXR1cm4oLTEpOworCisgICAgLyogWFhYOiBjaGVjayB3aGF0IHRoZSBzZWNvbmQgJyYmIHR5cGUnIGlzIGFib3V0ICovCisJaWYgKCh0eXBlICYmICh0eXBlICE9IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSkgJiYgCisJCSh0eXBlICE9IFNTTDNfUlRfSEFORFNIQUtFKSAmJiB0eXBlKSB8fAorCSAgICAocGVlayAmJiAodHlwZSAhPSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEpKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfRFRMUzFfUkVBRF9CWVRFUywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlyZXR1cm4gLTE7CisJCX0KKworCS8qIGNoZWNrIHdoZXRoZXIgdGhlcmUncyBhIGhhbmRzaGFrZSBtZXNzYWdlIChjbGllbnQgaGVsbG8/KSB3YWl0aW5nICovCisJaWYgKCAocmV0ID0gaGF2ZV9oYW5kc2hha2VfZnJhZ21lbnQocywgdHlwZSwgYnVmLCBsZW4sIHBlZWspKSkKKwkJcmV0dXJuIHJldDsKKworCS8qIE5vdyBzLT5kMS0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbiA9PSAwIGlmIHR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UuICovCisKKwlpZiAoIXMtPmluX2hhbmRzaGFrZSAmJiBTU0xfaW5faW5pdChzKSkKKwkJeworCQkvKiB0eXBlID09IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSAqLworCQlpPXMtPmhhbmRzaGFrZV9mdW5jKHMpOworCQlpZiAoaSA8IDApIHJldHVybihpKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9EVExTMV9SRUFEX0JZVEVTLFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCQl9CisKK3N0YXJ0OgorCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisKKwkvKiBzLT5zMy0+cnJlYy50eXBlCSAgICAtIGlzIHRoZSB0eXBlIG9mIHJlY29yZAorCSAqIHMtPnMzLT5ycmVjLmRhdGEsICAgIC0gZGF0YQorCSAqIHMtPnMzLT5ycmVjLm9mZiwgICAgIC0gb2Zmc2V0IGludG8gJ2RhdGEnIGZvciBuZXh0IHJlYWQKKwkgKiBzLT5zMy0+cnJlYy5sZW5ndGgsICAtIG51bWJlciBvZiBieXRlcy4gKi8KKwlyciA9ICYocy0+czMtPnJyZWMpOworCisJLyogV2UgYXJlIG5vdCBoYW5kc2hha2luZyBhbmQgaGF2ZSBubyBkYXRhIHlldCwKKwkgKiBzbyBwcm9jZXNzIGRhdGEgYnVmZmVyZWQgZHVyaW5nIHRoZSBsYXN0IGhhbmRzaGFrZQorCSAqIGluIGFkdmFuY2UsIGlmIGFueS4KKwkgKi8KKwlpZiAocy0+c3RhdGUgPT0gU1NMX1NUX09LICYmIHJyLT5sZW5ndGggPT0gMCkKKwkJeworCQlwaXRlbSAqaXRlbTsKKwkJaXRlbSA9IHBxdWV1ZV9wb3Aocy0+ZDEtPmJ1ZmZlcmVkX2FwcF9kYXRhLnEpOworCQlpZiAoaXRlbSkKKwkJCXsKKwkJCWR0bHMxX2NvcHlfcmVjb3JkKHMsIGl0ZW0pOworCisJCQlPUEVOU1NMX2ZyZWUoaXRlbS0+ZGF0YSk7CisJCQlwaXRlbV9mcmVlKGl0ZW0pOworCQkJfQorCQl9CisKKwkvKiBDaGVjayBmb3IgdGltZW91dCAqLworCWlmIChkdGxzMV9oYW5kbGVfdGltZW91dChzKSA+IDApCisJCWdvdG8gc3RhcnQ7CisKKwkvKiBnZXQgbmV3IHBhY2tldCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoKHJyLT5sZW5ndGggPT0gMCkgfHwgKHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9CT0RZKSkKKwkJeworCQlyZXQ9ZHRsczFfZ2V0X3JlY29yZChzKTsKKwkJaWYgKHJldCA8PSAwKSAKKwkJCXsKKwkJCXJldCA9IGR0bHMxX3JlYWRfZmFpbGVkKHMsIHJldCk7CisJCQkvKiBhbnl0aGluZyBvdGhlciB0aGFuIGEgdGltZW91dCBpcyBhbiBlcnJvciAqLworCQkJaWYgKHJldCA8PSAwKSAgCisJCQkJcmV0dXJuKHJldCk7CisJCQllbHNlCisJCQkJZ290byBzdGFydDsKKwkJCX0KKwkJfQorCisJLyogd2Ugbm93IGhhdmUgYSBwYWNrZXQgd2hpY2ggY2FuIGJlIHJlYWQgYW5kIHByb2Nlc3NlZCAqLworCisJaWYgKHMtPnMzLT5jaGFuZ2VfY2lwaGVyX3NwZWMgLyogc2V0IHdoZW4gd2UgcmVjZWl2ZSBDaGFuZ2VDaXBoZXJTcGVjLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc2V0IGJ5IHNzbDNfZ2V0X2ZpbmlzaGVkICovCisJCSYmIChyci0+dHlwZSAhPSBTU0wzX1JUX0hBTkRTSEFLRSkpCisJCXsKKwkJLyogV2Ugbm93IGhhdmUgYXBwbGljYXRpb24gZGF0YSBiZXR3ZWVuIENDUyBhbmQgRmluaXNoZWQuCisJCSAqIE1vc3QgbGlrZWx5IHRoZSBwYWNrZXRzIHdlcmUgcmVvcmRlcmVkIG9uIHRoZWlyIHdheSwgc28KKwkJICogYnVmZmVyIHRoZSBhcHBsaWNhdGlvbiBkYXRhIGZvciBsYXRlciBwcm9jZXNzaW5nIHJhdGhlcgorCQkgKiB0aGFuIGRyb3BwaW5nIHRoZSBjb25uZWN0aW9uLgorCQkgKi8KKwkJZHRsczFfYnVmZmVyX3JlY29yZChzLCAmKHMtPmQxLT5idWZmZXJlZF9hcHBfZGF0YSksIHJyLT5zZXFfbnVtKTsKKwkJcnItPmxlbmd0aCA9IDA7CisJCWdvdG8gc3RhcnQ7CisJCX0KKworCS8qIElmIHRoZSBvdGhlciBlbmQgaGFzIHNodXQgZG93biwgdGhyb3cgYW55dGhpbmcgd2UgcmVhZCBhd2F5CisJICogKGV2ZW4gaW4gJ3BlZWsnIG1vZGUpICovCisJaWYgKHMtPnNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKQorCQl7CisJCXJyLT5sZW5ndGg9MDsKKwkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJcmV0dXJuKDApOworCQl9CisKKworCWlmICh0eXBlID09IHJyLT50eXBlKSAvKiBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgb3IgU1NMM19SVF9IQU5EU0hBS0UgKi8KKwkJeworCQkvKiBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgbm90IGdldHRpbmcgYXBwbGljYXRpb24gZGF0YSB3aGVuIHdlCisJCSAqIGFyZSBkb2luZyBhIGhhbmRzaGFrZSBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KKwkJaWYgKFNTTF9pbl9pbml0KHMpICYmICh0eXBlID09IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSkgJiYKKwkJCShzLT5lbmNfcmVhZF9jdHggPT0gTlVMTCkpCisJCQl7CisJCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1JFQURfQllURVMsU1NMX1JfQVBQX0RBVEFfSU5fSEFORFNIQUtFKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKwkJaWYgKGxlbiA8PSAwKSByZXR1cm4obGVuKTsKKworCQlpZiAoKHVuc2lnbmVkIGludClsZW4gPiByci0+bGVuZ3RoKQorCQkJbiA9IHJyLT5sZW5ndGg7CisJCWVsc2UKKwkJCW4gPSAodW5zaWduZWQgaW50KWxlbjsKKworCQltZW1jcHkoYnVmLCYocnItPmRhdGFbcnItPm9mZl0pLG4pOworCQlpZiAoIXBlZWspCisJCQl7CisJCQlyci0+bGVuZ3RoLT1uOworCQkJcnItPm9mZis9bjsKKwkJCWlmIChyci0+bGVuZ3RoID09IDApCisJCQkJeworCQkJCXMtPnJzdGF0ZT1TU0xfU1RfUkVBRF9IRUFERVI7CisJCQkJcnItPm9mZj0wOworCQkJCX0KKwkJCX0KKwkJcmV0dXJuKG4pOworCQl9CisKKworCS8qIElmIHdlIGdldCBoZXJlLCB0aGVuIHR5cGUgIT0gcnItPnR5cGU7IGlmIHdlIGhhdmUgYSBoYW5kc2hha2UKKwkgKiBtZXNzYWdlLCB0aGVuIGl0IHdhcyB1bmV4cGVjdGVkIChIZWxsbyBSZXF1ZXN0IG9yIENsaWVudCBIZWxsbykuICovCisKKwkvKiBJbiBjYXNlIG9mIHJlY29yZCB0eXBlcyBmb3Igd2hpY2ggd2UgaGF2ZSAnZnJhZ21lbnQnIHN0b3JhZ2UsCisJICogZmlsbCB0aGF0IHNvIHRoYXQgd2UgY2FuIHByb2Nlc3MgdGhlIGRhdGEgYXQgYSBmaXhlZCBwbGFjZS4KKwkgKi8KKwkJeworCQl1bnNpZ25lZCBpbnQgaywgZGVzdF9tYXhsZW4gPSAwOworCQl1bnNpZ25lZCBjaGFyICpkZXN0ID0gTlVMTDsKKwkJdW5zaWduZWQgaW50ICpkZXN0X2xlbiA9IE5VTEw7CisKKwkJaWYgKHJyLT50eXBlID09IFNTTDNfUlRfSEFORFNIQUtFKQorCQkJeworCQkJZGVzdF9tYXhsZW4gPSBzaXplb2Ygcy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudDsKKwkJCWRlc3QgPSBzLT5kMS0+aGFuZHNoYWtlX2ZyYWdtZW50OworCQkJZGVzdF9sZW4gPSAmcy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW47CisJCQl9CisJCWVsc2UgaWYgKHJyLT50eXBlID09IFNTTDNfUlRfQUxFUlQpCisJCQl7CisJCQlkZXN0X21heGxlbiA9IHNpemVvZihzLT5kMS0+YWxlcnRfZnJhZ21lbnQpOworCQkJZGVzdCA9IHMtPmQxLT5hbGVydF9mcmFnbWVudDsKKwkJCWRlc3RfbGVuID0gJnMtPmQxLT5hbGVydF9mcmFnbWVudF9sZW47CisJCQl9CisJCS8qIGVsc2UgaXQncyBhIENDUyBtZXNzYWdlLCBvciBhcHBsaWNhdGlvbiBkYXRhIG9yIHdyb25nICovCisJCWVsc2UgaWYgKHJyLT50eXBlICE9IFNTTDNfUlRfQ0hBTkdFX0NJUEhFUl9TUEVDKQorCQkJeworCQkJLyogQXBwbGljYXRpb24gZGF0YSB3aGlsZSByZW5lZ290aWF0aW5nCisJCQkgKiBpcyBhbGxvd2VkLiBUcnkgYWdhaW4gcmVhZGluZy4KKwkJCSAqLworCQkJaWYgKHJyLT50eXBlID09IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSkKKwkJCQl7CisJCQkJQklPICpiaW87CisJCQkJcy0+czMtPmluX3JlYWRfYXBwX2RhdGE9MjsKKwkJCQliaW89U1NMX2dldF9yYmlvKHMpOworCQkJCXMtPnJ3c3RhdGU9U1NMX1JFQURJTkc7CisJCQkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGJpbyk7CisJCQkJQklPX3NldF9yZXRyeV9yZWFkKGJpbyk7CisJCQkJcmV0dXJuKC0xKTsKKwkJCQl9CisKKwkJCS8qIE5vdCBjZXJ0YWluIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IGVycm9yIGhhbmRsaW5nICovCisJCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1JFQURfQllURVMsU1NMX1JfVU5FWFBFQ1RFRF9SRUNPUkQpOworCQkJZ290byBmX2VycjsKKwkJCX0KKworCQlpZiAoZGVzdF9tYXhsZW4gPiAwKQorCQkJeworICAgICAgICAgICAgLyogWERUTFM6ICBJbiBhIHBhdGhhbG9naWNhbCBjYXNlLCB0aGUgQ2xpZW50IEhlbGxvCisgICAgICAgICAgICAgKiAgbWF5IGJlIGZyYWdtZW50ZWQtLWRvbid0IGFsd2F5cyBleHBlY3QgZGVzdF9tYXhsZW4gYnl0ZXMgKi8KKwkJCWlmICggcnItPmxlbmd0aCA8IGRlc3RfbWF4bGVuKQorCQkJCXsKKyNpZmRlZiBEVExTMV9BRF9NSVNTSU5HX0hBTkRTSEFLRV9NRVNTQUdFCisJCQkJLyoKKwkJCQkgKiBmb3Igbm9ybWFsIGFsZXJ0cyByci0+bGVuZ3RoIGlzIDIsIHdoaWxlCisJCQkJICogZGVzdF9tYXhsZW4gaXMgNyBpZiB3ZSB3ZXJlIHRvIGhhbmRsZSB0aGlzCisJCQkJICogbm9uLWV4aXN0aW5nIGFsZXJ0Li4uCisJCQkJICovCisJCQkJRklYIE1FCisjZW5kaWYKKwkJCQlzLT5yc3RhdGU9U1NMX1NUX1JFQURfSEVBREVSOworCQkJCXJyLT5sZW5ndGggPSAwOworCQkJCWdvdG8gc3RhcnQ7CisJCQkJfQorCisJCQkvKiBub3cgbW92ZSAnbicgYnl0ZXM6ICovCisJCQlmb3IgKCBrID0gMDsgayA8IGRlc3RfbWF4bGVuOyBrKyspCisJCQkJeworCQkJCWRlc3Rba10gPSByci0+ZGF0YVtyci0+b2ZmKytdOworCQkJCXJyLT5sZW5ndGgtLTsKKwkJCQl9CisJCQkqZGVzdF9sZW4gPSBkZXN0X21heGxlbjsKKwkJCX0KKwkJfQorCisJLyogcy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPT0gMTIgIGlmZiAgcnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0U7CisJICogcy0+ZDEtPmFsZXJ0X2ZyYWdtZW50X2xlbiA9PSA3ICAgICAgaWZmICByci0+dHlwZSA9PSBTU0wzX1JUX0FMRVJULgorCSAqIChQb3NzaWJseSByciBpcyAnZW1wdHknIG5vdywgaS5lLiByci0+bGVuZ3RoIG1heSBiZSAwLikgKi8KKworCS8qIElmIHdlIGFyZSBhIGNsaWVudCwgY2hlY2sgZm9yIGFuIGluY29taW5nICdIZWxsbyBSZXF1ZXN0JzogKi8KKwlpZiAoKCFzLT5zZXJ2ZXIpICYmCisJCShzLT5kMS0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbiA+PSBEVExTMV9ITV9IRUFERVJfTEVOR1RIKSAmJgorCQkocy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudFswXSA9PSBTU0wzX01UX0hFTExPX1JFUVVFU1QpICYmCisJCShzLT5zZXNzaW9uICE9IE5VTEwpICYmIChzLT5zZXNzaW9uLT5jaXBoZXIgIT0gTlVMTCkpCisJCXsKKwkJcy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPSAwOworCisJCWlmICgocy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudFsxXSAhPSAwKSB8fAorCQkJKHMtPmQxLT5oYW5kc2hha2VfZnJhZ21lbnRbMl0gIT0gMCkgfHwKKwkJCShzLT5kMS0+aGFuZHNoYWtlX2ZyYWdtZW50WzNdICE9IDApKQorCQkJeworCQkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9EVExTMV9SRUFEX0JZVEVTLFNTTF9SX0JBRF9IRUxMT19SRVFVRVNUKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCS8qIG5vIG5lZWQgdG8gY2hlY2sgc2VxdWVuY2UgbnVtYmVyIG9uIEhFTExPIFJFUVVFU1QgbWVzc2FnZXMgKi8KKworCQlpZiAocy0+bXNnX2NhbGxiYWNrKQorCQkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIFNTTDNfUlRfSEFORFNIQUtFLCAKKwkJCQlzLT5kMS0+aGFuZHNoYWtlX2ZyYWdtZW50LCA0LCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsKKworCQlpZiAoU1NMX2lzX2luaXRfZmluaXNoZWQocykgJiYKKwkJCSEocy0+czMtPmZsYWdzICYgU1NMM19GTEFHU19OT19SRU5FR09USUFURV9DSVBIRVJTKSAmJgorCQkJIXMtPnMzLT5yZW5lZ290aWF0ZSkKKwkJCXsKKwkJCXNzbDNfcmVuZWdvdGlhdGUocyk7CisJCQlpZiAoc3NsM19yZW5lZ290aWF0ZV9jaGVjayhzKSkKKwkJCQl7CisJCQkJaT1zLT5oYW5kc2hha2VfZnVuYyhzKTsKKwkJCQlpZiAoaSA8IDApIHJldHVybihpKTsKKwkJCQlpZiAoaSA9PSAwKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9EVExTMV9SRUFEX0JZVEVTLFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQkJCXJldHVybigtMSk7CisJCQkJCX0KKworCQkJCWlmICghKHMtPm1vZGUgJiBTU0xfTU9ERV9BVVRPX1JFVFJZKSkKKwkJCQkJeworCQkJCQlpZiAocy0+czMtPnJidWYubGVmdCA9PSAwKSAvKiBubyByZWFkLWFoZWFkIGxlZnQ/ICovCisJCQkJCQl7CisJCQkJCQlCSU8gKmJpbzsKKwkJCQkJCS8qIEluIHRoZSBjYXNlIHdoZXJlIHdlIHRyeSB0byByZWFkIGFwcGxpY2F0aW9uIGRhdGEsCisJCQkJCQkgKiBidXQgd2UgdHJpZ2dlciBhbiBTU0wgaGFuZHNoYWtlLCB3ZSByZXR1cm4gLTEgd2l0aAorCQkJCQkJICogdGhlIHJldHJ5IG9wdGlvbiBzZXQuICBPdGhlcndpc2UgcmVuZWdvdGlhdGlvbiBtYXkKKwkJCQkJCSAqIGNhdXNlIG5hc3R5IHByb2JsZW1zIGluIHRoZSBibG9ja2luZyB3b3JsZCAqLworCQkJCQkJcy0+cndzdGF0ZT1TU0xfUkVBRElORzsKKwkJCQkJCWJpbz1TU0xfZ2V0X3JiaW8ocyk7CisJCQkJCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKwkJCQkJCUJJT19zZXRfcmV0cnlfcmVhZChiaW8pOworCQkJCQkJcmV0dXJuKC0xKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJLyogd2UgZWl0aGVyIGZpbmlzaGVkIGEgaGFuZHNoYWtlIG9yIGlnbm9yZWQgdGhlIHJlcXVlc3QsCisJCSAqIG5vdyB0cnkgYWdhaW4gdG8gb2J0YWluIHRoZSAoYXBwbGljYXRpb24pIGRhdGEgd2Ugd2VyZSBhc2tlZCBmb3IgKi8KKwkJZ290byBzdGFydDsKKwkJfQorCisJaWYgKHMtPmQxLT5hbGVydF9mcmFnbWVudF9sZW4gPj0gRFRMUzFfQUxfSEVBREVSX0xFTkdUSCkKKwkJeworCQlpbnQgYWxlcnRfbGV2ZWwgPSBzLT5kMS0+YWxlcnRfZnJhZ21lbnRbMF07CisJCWludCBhbGVydF9kZXNjciA9IHMtPmQxLT5hbGVydF9mcmFnbWVudFsxXTsKKworCQlzLT5kMS0+YWxlcnRfZnJhZ21lbnRfbGVuID0gMDsKKworCQlpZiAocy0+bXNnX2NhbGxiYWNrKQorCQkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIFNTTDNfUlRfQUxFUlQsIAorCQkJCXMtPmQxLT5hbGVydF9mcmFnbWVudCwgMiwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7CisKKwkJaWYgKHMtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJCWNiPXMtPmluZm9fY2FsbGJhY2s7CisJCWVsc2UgaWYgKHMtPmN0eC0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQkJY2I9cy0+Y3R4LT5pbmZvX2NhbGxiYWNrOworCisJCWlmIChjYiAhPSBOVUxMKQorCQkJeworCQkJaiA9IChhbGVydF9sZXZlbCA8PCA4KSB8IGFsZXJ0X2Rlc2NyOworCQkJY2IocywgU1NMX0NCX1JFQURfQUxFUlQsIGopOworCQkJfQorCisJCWlmIChhbGVydF9sZXZlbCA9PSAxKSAvKiB3YXJuaW5nICovCisJCQl7CisJCQlzLT5zMy0+d2Fybl9hbGVydCA9IGFsZXJ0X2Rlc2NyOworCQkJaWYgKGFsZXJ0X2Rlc2NyID09IFNTTF9BRF9DTE9TRV9OT1RJRlkpCisJCQkJeworCQkJCXMtPnNodXRkb3duIHw9IFNTTF9SRUNFSVZFRF9TSFVURE9XTjsKKwkJCQlyZXR1cm4oMCk7CisJCQkJfQorI2lmIDAKKyAgICAgICAgICAgIC8qIFhYWDogdGhpcyBpcyBhIHBvc3NpYmxlIGltcHJvdmVtZW50IGluIHRoZSBmdXR1cmUgKi8KKwkJCS8qIG5vdyBjaGVjayBpZiBpdCdzIGEgbWlzc2luZyByZWNvcmQgKi8KKwkJCWlmIChhbGVydF9kZXNjciA9PSBEVExTMV9BRF9NSVNTSU5HX0hBTkRTSEFLRV9NRVNTQUdFKQorCQkJCXsKKwkJCQl1bnNpZ25lZCBzaG9ydCBzZXE7CisJCQkJdW5zaWduZWQgaW50IGZyYWdfb2ZmOworCQkJCXVuc2lnbmVkIGNoYXIgKnAgPSAmKHMtPmQxLT5hbGVydF9mcmFnbWVudFsyXSk7CisKKwkJCQluMnMocCwgc2VxKTsKKwkJCQluMmwzKHAsIGZyYWdfb2ZmKTsKKworCQkJCWR0bHMxX3JldHJhbnNtaXRfbWVzc2FnZShzLAorCQkJCQkJCQkJCSBkdGxzMV9nZXRfcXVldWVfcHJpb3JpdHkoZnJhZy0+bXNnX2hlYWRlci5zZXEsIDApLAorCQkJCQkJCQkJCSBmcmFnX29mZiwgJmZvdW5kKTsKKwkJCQlpZiAoICEgZm91bmQgICYmIFNTTF9pbl9pbml0KHMpKQorCQkJCQl7CisJCQkJCS8qIGZwcmludGYoIHN0ZGVyciwiaW4gaW5pdCA9ICVkXG4iLCBTU0xfaW5faW5pdChzKSk7ICovCisJCQkJCS8qIHJlcXVlc3RlZCBhIG1lc3NhZ2Ugbm90IHlldCBzZW50LCAKKwkJCQkJICAgc2VuZCBhbiBhbGVydCBvdXJzZWx2ZXMgKi8KKwkJCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9XQVJOSU5HLAorCQkJCQkJRFRMUzFfQURfTUlTU0lOR19IQU5EU0hBS0VfTUVTU0FHRSk7CisJCQkJCX0KKwkJCQl9CisjZW5kaWYKKwkJCX0KKwkJZWxzZSBpZiAoYWxlcnRfbGV2ZWwgPT0gMikgLyogZmF0YWwgKi8KKwkJCXsKKwkJCWNoYXIgdG1wWzE2XTsKKworCQkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJCXMtPnMzLT5mYXRhbF9hbGVydCA9IGFsZXJ0X2Rlc2NyOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1JFQURfQllURVMsIFNTTF9BRF9SRUFTT05fT0ZGU0VUICsgYWxlcnRfZGVzY3IpOworCQkJQklPX3NucHJpbnRmKHRtcCxzaXplb2YgdG1wLCIlZCIsYWxlcnRfZGVzY3IpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsIlNTTCBhbGVydCBudW1iZXIgIix0bXApOworCQkJcy0+c2h1dGRvd258PVNTTF9SRUNFSVZFRF9TSFVURE9XTjsKKwkJCVNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24ocy0+Y3R4LHMtPnNlc3Npb24pOworCQkJcmV0dXJuKDApOworCQkJfQorCQllbHNlCisJCQl7CisJCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfUkVBRF9CWVRFUyxTU0xfUl9VTktOT1dOX0FMRVJUX1RZUEUpOworCQkJZ290byBmX2VycjsKKwkJCX0KKworCQlnb3RvIHN0YXJ0OworCQl9CisKKwlpZiAocy0+c2h1dGRvd24gJiBTU0xfU0VOVF9TSFVURE9XTikgLyogYnV0IHdlIGhhdmUgbm90IHJlY2VpdmVkIGEgc2h1dGRvd24gKi8KKwkJeworCQlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCQlyci0+bGVuZ3RoPTA7CisJCXJldHVybigwKTsKKwkJfQorCisJaWYgKHJyLT50eXBlID09IFNTTDNfUlRfQ0hBTkdFX0NJUEhFUl9TUEVDKQorCQl7CisJCXN0cnVjdCBjY3NfaGVhZGVyX3N0IGNjc19oZHI7CisJCXVuc2lnbmVkIGludCBjY3NfaGRyX2xlbiA9IERUTFMxX0NDU19IRUFERVJfTEVOR1RIOworCisJCWR0bHMxX2dldF9jY3NfaGVhZGVyKHJyLT5kYXRhLCAmY2NzX2hkcik7CisKKwkJaWYgKHMtPnZlcnNpb24gPT0gRFRMUzFfQkFEX1ZFUikKKwkJCWNjc19oZHJfbGVuID0gMzsKKworCQkvKiAnQ2hhbmdlIENpcGhlciBTcGVjJyBpcyBqdXN0IGEgc2luZ2xlIGJ5dGUsIHNvIHdlIGtub3cKKwkJICogZXhhY3RseSB3aGF0IHRoZSByZWNvcmQgcGF5bG9hZCBoYXMgdG8gbG9vayBsaWtlICovCisJCS8qIFhEVExTOiBjaGVjayB0aGF0IGVwb2NoIGlzIGNvbnNpc3RlbnQgKi8KKwkJaWYgKAkocnItPmxlbmd0aCAhPSBjY3NfaGRyX2xlbikgfHwgCisJCQkocnItPm9mZiAhPSAwKSB8fCAocnItPmRhdGFbMF0gIT0gU1NMM19NVF9DQ1MpKQorCQkJeworCQkJaT1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfUkVBRF9CWVRFUyxTU0xfUl9CQURfQ0hBTkdFX0NJUEhFUl9TUEVDKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCXJyLT5sZW5ndGg9MDsKKworCQlpZiAocy0+bXNnX2NhbGxiYWNrKQorCQkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIFNTTDNfUlRfQ0hBTkdFX0NJUEhFUl9TUEVDLCAKKwkJCQlyci0+ZGF0YSwgMSwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7CisKKwkJLyogV2UgY2FuJ3QgcHJvY2VzcyBhIENDUyBub3csIGJlY2F1c2UgcHJldmlvdXMgaGFuZHNoYWtlCisJCSAqIG1lc3NhZ2VzIGFyZSBzdGlsbCBtaXNzaW5nLCBzbyBqdXN0IGRyb3AgaXQuCisJCSAqLworCQlpZiAoIXMtPmQxLT5jaGFuZ2VfY2lwaGVyX3NwZWNfb2spCisJCQl7CisJCQlnb3RvIHN0YXJ0OworCQkJfQorCisJCXMtPmQxLT5jaGFuZ2VfY2lwaGVyX3NwZWNfb2sgPSAwOworCisJCXMtPnMzLT5jaGFuZ2VfY2lwaGVyX3NwZWM9MTsKKwkJaWYgKCFzc2wzX2RvX2NoYW5nZV9jaXBoZXJfc3BlYyhzKSkKKwkJCWdvdG8gZXJyOworCisJCS8qIGRvIHRoaXMgd2hlbmV2ZXIgQ0NTIGlzIHByb2Nlc3NlZCAqLworCQlkdGxzMV9yZXNldF9zZXFfbnVtYmVycyhzLCBTU0wzX0NDX1JFQUQpOworCisJCWlmIChzLT52ZXJzaW9uID09IERUTFMxX0JBRF9WRVIpCisJCQlzLT5kMS0+aGFuZHNoYWtlX3JlYWRfc2VxKys7CisKKwkJZ290byBzdGFydDsKKwkJfQorCisJLyogVW5leHBlY3RlZCBoYW5kc2hha2UgbWVzc2FnZSAoQ2xpZW50IEhlbGxvLCBvciBwcm90b2NvbCB2aW9sYXRpb24pICovCisJaWYgKChzLT5kMS0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbiA+PSBEVExTMV9ITV9IRUFERVJfTEVOR1RIKSAmJiAKKwkJIXMtPmluX2hhbmRzaGFrZSkKKwkJeworCQlzdHJ1Y3QgaG1faGVhZGVyX3N0IG1zZ19oZHI7CisJCQorCQkvKiB0aGlzIG1heSBqdXN0IGJlIGEgc3RhbGUgcmV0cmFuc21pdCAqLworCQlkdGxzMV9nZXRfbWVzc2FnZV9oZWFkZXIocnItPmRhdGEsICZtc2dfaGRyKTsKKwkJaWYoIHJyLT5lcG9jaCAhPSBzLT5kMS0+cl9lcG9jaCkKKwkJCXsKKwkJCXJyLT5sZW5ndGggPSAwOworCQkJZ290byBzdGFydDsKKwkJCX0KKworCQkvKiBJZiB3ZSBhcmUgc2VydmVyLCB3ZSBtYXkgaGF2ZSBhIHJlcGVhdGVkIEZJTklTSEVEIG9mIHRoZQorCQkgKiBjbGllbnQgaGVyZSwgdGhlbiByZXRyYW5zbWl0IG91ciBDQ1MgYW5kIEZJTklTSEVELgorCQkgKi8KKwkJaWYgKG1zZ19oZHIudHlwZSA9PSBTU0wzX01UX0ZJTklTSEVEKQorCQkJeworCQkJZHRsczFfcmV0cmFuc21pdF9idWZmZXJlZF9tZXNzYWdlcyhzKTsKKwkJCXJyLT5sZW5ndGggPSAwOworCQkJZ290byBzdGFydDsKKwkJCX0KKworCQlpZiAoKChzLT5zdGF0ZSZTU0xfU1RfTUFTSykgPT0gU1NMX1NUX09LKSAmJgorCQkJIShzLT5zMy0+ZmxhZ3MgJiBTU0wzX0ZMQUdTX05PX1JFTkVHT1RJQVRFX0NJUEhFUlMpKQorCQkJeworI2lmIDAgLyogd29ya2VkIG9ubHkgYmVjYXVzZSBDIG9wZXJhdG9yIHByZWZlcmVuY2VzIGFyZSBub3QgYXMgZXhwZWN0ZWQgKGFuZAorICAgICAgICogYmVjYXVzZSB0aGlzIGlzIG5vdCByZWFsbHkgbmVlZGVkIGZvciBjbGllbnRzIGV4Y2VwdCBmb3IgZGV0ZWN0aW5nCisgICAgICAgKiBwcm90b2NvbCB2aW9sYXRpb25zKTogKi8KKwkJCXMtPnN0YXRlPVNTTF9TVF9CRUZPUkV8KHMtPnNlcnZlcikKKwkJCQk/U1NMX1NUX0FDQ0VQVAorCQkJCTpTU0xfU1RfQ09OTkVDVDsKKyNlbHNlCisJCQlzLT5zdGF0ZSA9IHMtPnNlcnZlciA/IFNTTF9TVF9BQ0NFUFQgOiBTU0xfU1RfQ09OTkVDVDsKKyNlbmRpZgorCQkJcy0+bmV3X3Nlc3Npb249MTsKKwkJCX0KKwkJaT1zLT5oYW5kc2hha2VfZnVuYyhzKTsKKwkJaWYgKGkgPCAwKSByZXR1cm4oaSk7CisJCWlmIChpID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfUkVBRF9CWVRFUyxTU0xfUl9TU0xfSEFORFNIQUtFX0ZBSUxVUkUpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKworCQlpZiAoIShzLT5tb2RlICYgU1NMX01PREVfQVVUT19SRVRSWSkpCisJCQl7CisJCQlpZiAocy0+czMtPnJidWYubGVmdCA9PSAwKSAvKiBubyByZWFkLWFoZWFkIGxlZnQ/ICovCisJCQkJeworCQkJCUJJTyAqYmlvOworCQkJCS8qIEluIHRoZSBjYXNlIHdoZXJlIHdlIHRyeSB0byByZWFkIGFwcGxpY2F0aW9uIGRhdGEsCisJCQkJICogYnV0IHdlIHRyaWdnZXIgYW4gU1NMIGhhbmRzaGFrZSwgd2UgcmV0dXJuIC0xIHdpdGgKKwkJCQkgKiB0aGUgcmV0cnkgb3B0aW9uIHNldC4gIE90aGVyd2lzZSByZW5lZ290aWF0aW9uIG1heQorCQkJCSAqIGNhdXNlIG5hc3R5IHByb2JsZW1zIGluIHRoZSBibG9ja2luZyB3b3JsZCAqLworCQkJCXMtPnJ3c3RhdGU9U1NMX1JFQURJTkc7CisJCQkJYmlvPVNTTF9nZXRfcmJpbyhzKTsKKwkJCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKwkJCQlCSU9fc2V0X3JldHJ5X3JlYWQoYmlvKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCX0KKwkJZ290byBzdGFydDsKKwkJfQorCisJc3dpdGNoIChyci0+dHlwZSkKKwkJeworCWRlZmF1bHQ6CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTCisJCS8qIFRMUyBqdXN0IGlnbm9yZXMgdW5rbm93biBtZXNzYWdlIHR5cGVzICovCisJCWlmIChzLT52ZXJzaW9uID09IFRMUzFfVkVSU0lPTikKKwkJCXsKKwkJCXJyLT5sZW5ndGggPSAwOworCQkJZ290byBzdGFydDsKKwkJCX0KKyNlbmRpZgorCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQlTU0xlcnIoU1NMX0ZfRFRMUzFfUkVBRF9CWVRFUyxTU0xfUl9VTkVYUEVDVEVEX1JFQ09SRCk7CisJCWdvdG8gZl9lcnI7CisJY2FzZSBTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQzoKKwljYXNlIFNTTDNfUlRfQUxFUlQ6CisJY2FzZSBTU0wzX1JUX0hBTkRTSEFLRToKKwkJLyogd2UgYWxyZWFkeSBoYW5kbGVkIGFsbCBvZiB0aGVzZSwgd2l0aCB0aGUgcG9zc2libGUgZXhjZXB0aW9uCisJCSAqIG9mIFNTTDNfUlRfSEFORFNIQUtFIHdoZW4gcy0+aW5faGFuZHNoYWtlIGlzIHNldCwgYnV0IHRoYXQKKwkJICogc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiB0eXBlICE9IHJyLT50eXBlICovCisJCWFsPVNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7CisJCVNTTGVycihTU0xfRl9EVExTMV9SRUFEX0JZVEVTLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJZ290byBmX2VycjsKKwljYXNlIFNTTDNfUlRfQVBQTElDQVRJT05fREFUQToKKwkJLyogQXQgdGhpcyBwb2ludCwgd2Ugd2VyZSBleHBlY3RpbmcgaGFuZHNoYWtlIGRhdGEsCisJCSAqIGJ1dCBoYXZlIGFwcGxpY2F0aW9uIGRhdGEuICBJZiB0aGUgbGlicmFyeSB3YXMKKwkJICogcnVubmluZyBpbnNpZGUgc3NsM19yZWFkKCkgKGkuZS4gaW5fcmVhZF9hcHBfZGF0YQorCQkgKiBpcyBzZXQpIGFuZCBpdCBtYWtlcyBzZW5zZSB0byByZWFkIGFwcGxpY2F0aW9uIGRhdGEKKwkJICogYXQgdGhpcyBwb2ludCAoc2Vzc2lvbiByZW5lZ290aWF0aW9uIG5vdCB5ZXQgc3RhcnRlZCksCisJCSAqIHdlIHdpbGwgaW5kdWxnZSBpdC4KKwkJICovCisJCWlmIChzLT5zMy0+aW5fcmVhZF9hcHBfZGF0YSAmJgorCQkJKHMtPnMzLT50b3RhbF9yZW5lZ290aWF0aW9ucyAhPSAwKSAmJgorCQkJKCgKKwkJCQkocy0+c3RhdGUgJiBTU0xfU1RfQ09OTkVDVCkgJiYKKwkJCQkocy0+c3RhdGUgPj0gU1NMM19TVF9DV19DTE5UX0hFTExPX0EpICYmCisJCQkJKHMtPnN0YXRlIDw9IFNTTDNfU1RfQ1JfU1JWUl9IRUxMT19BKQorCQkJCSkgfHwgKAorCQkJCQkocy0+c3RhdGUgJiBTU0xfU1RfQUNDRVBUKSAmJgorCQkJCQkocy0+c3RhdGUgPD0gU1NMM19TVF9TV19IRUxMT19SRVFfQSkgJiYKKwkJCQkJKHMtPnN0YXRlID49IFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19BKQorCQkJCQkpCisJCQkJKSkKKwkJCXsKKwkJCXMtPnMzLT5pbl9yZWFkX2FwcF9kYXRhPTI7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1JFQURfQllURVMsU1NMX1JfVU5FWFBFQ1RFRF9SRUNPUkQpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJfQorCS8qIG5vdCByZWFjaGVkICovCisKK2ZfZXJyOgorCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsYWwpOworZXJyOgorCXJldHVybigtMSk7CisJfQorCitpbnQKK2R0bHMxX3dyaXRlX2FwcF9kYXRhX2J5dGVzKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHZvaWQgKmJ1Zl8sIGludCBsZW4pCisJeworCWludCBpOworCisJaWYgKFNTTF9pbl9pbml0KHMpICYmICFzLT5pbl9oYW5kc2hha2UpCisJCXsKKwkJaT1zLT5oYW5kc2hha2VfZnVuYyhzKTsKKwkJaWYgKGkgPCAwKSByZXR1cm4oaSk7CisJCWlmIChpID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfV1JJVEVfQVBQX0RBVEFfQllURVMsU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisJaWYgKGxlbiA+IFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCkKKwkJeworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1dSSVRFX0FQUF9EQVRBX0JZVEVTLFNTTF9SX0RUTFNfTUVTU0FHRV9UT09fQklHKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJaSA9IGR0bHMxX3dyaXRlX2J5dGVzKHMsIHR5cGUsIGJ1Zl8sIGxlbik7CisJcmV0dXJuIGk7CisJfQorCisKKwkvKiB0aGlzIG9ubHkgaGFwcGVucyB3aGVuIGEgY2xpZW50IGhlbGxvIGlzIHJlY2VpdmVkIGFuZCBhIGhhbmRzaGFrZSAKKwkgKiBpcyBzdGFydGVkLiAqLworc3RhdGljIGludAoraGF2ZV9oYW5kc2hha2VfZnJhZ21lbnQoU1NMICpzLCBpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmLCAKKwlpbnQgbGVuLCBpbnQgcGVlaykKKwl7CisJCisJaWYgKCh0eXBlID09IFNTTDNfUlRfSEFORFNIQUtFKSAmJiAocy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPiAwKSkKKwkJLyogKHBhcnRpYWxseSkgc2F0aXNmeSByZXF1ZXN0IGZyb20gc3RvcmFnZSAqLworCQl7CisJCXVuc2lnbmVkIGNoYXIgKnNyYyA9IHMtPmQxLT5oYW5kc2hha2VfZnJhZ21lbnQ7CisJCXVuc2lnbmVkIGNoYXIgKmRzdCA9IGJ1ZjsKKwkJdW5zaWduZWQgaW50IGssbjsKKwkJCisJCS8qIHBlZWsgPT0gMCAqLworCQluID0gMDsKKwkJd2hpbGUgKChsZW4gPiAwKSAmJiAocy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPiAwKSkKKwkJCXsKKwkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJCWxlbi0tOyBzLT5kMS0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbi0tOworCQkJbisrOworCQkJfQorCQkvKiBtb3ZlIGFueSByZW1haW5pbmcgZnJhZ21lbnQgYnl0ZXM6ICovCisJCWZvciAoayA9IDA7IGsgPCBzLT5kMS0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbjsgaysrKQorCQkJcy0+ZDEtPmhhbmRzaGFrZV9mcmFnbWVudFtrXSA9ICpzcmMrKzsKKwkJcmV0dXJuIG47CisJCX0KKwkKKwlyZXR1cm4gMDsKKwl9CisKKworCisKKy8qIENhbGwgdGhpcyB0byB3cml0ZSBkYXRhIGluIHJlY29yZHMgb2YgdHlwZSAndHlwZScKKyAqIEl0IHdpbGwgcmV0dXJuIDw9IDAgaWYgbm90IGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQgb3Igbm9uLWJsb2NraW5nIElPLgorICovCitpbnQgZHRsczFfd3JpdGVfYnl0ZXMoU1NMICpzLCBpbnQgdHlwZSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQorCXsKKwlpbnQgaTsKKworCU9QRU5TU0xfYXNzZXJ0KGxlbiA8PSBTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpOworCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJaT1kb19kdGxzMV93cml0ZShzLCB0eXBlLCBidWYsIGxlbiwgMCk7CisJcmV0dXJuIGk7CisJfQorCitpbnQgZG9fZHRsczFfd3JpdGUoU1NMICpzLCBpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgY3JlYXRlX2VtcHR5X2ZyYWdtZW50KQorCXsKKwl1bnNpZ25lZCBjaGFyICpwLCpwc2VxOworCWludCBpLG1hY19zaXplLGNsZWFyPTA7CisJaW50IHByZWZpeF9sZW4gPSAwOworCVNTTDNfUkVDT1JEICp3cjsKKwlTU0wzX0JVRkZFUiAqd2I7CisJU1NMX1NFU1NJT04gKnNlc3M7CisJaW50IGJzOworCXVuc2lnbmVkIGludCBsZW5fd2l0aF9vdmVyaGVhZCA9IGxlbiArIFNTTDNfUlRfREVGQVVMVF9XUklURV9PVkVSSEVBRDsKKworCS8qIGZpcnN0IGNoZWNrIGlmIHRoZXJlIGlzIGEgU1NMM19CVUZGRVIgc3RpbGwgYmVpbmcgd3JpdHRlbgorCSAqIG91dC4gIFRoaXMgd2lsbCBoYXBwZW4gd2l0aCBub24gYmxvY2tpbmcgSU8gKi8KKwlpZiAocy0+czMtPndidWYubGVmdCAhPSAwKQorCQl7CisJCU9QRU5TU0xfYXNzZXJ0KDApOyAvKiBYRFRMUzogIHdhbnQgdG8gc2VlIGlmIHdlIGV2ZXIgZ2V0IGhlcmUgKi8KKwkJcmV0dXJuKHNzbDNfd3JpdGVfcGVuZGluZyhzLHR5cGUsYnVmLGxlbikpOworCQl9CisKKwlpZiAocy0+czMtPndidWYubGVuIDwgbGVuX3dpdGhfb3ZlcmhlYWQpCisJCXsKKwkJaWYgKChwPU9QRU5TU0xfcmVhbGxvYyhzLT5zMy0+d2J1Zi5idWYsIGxlbl93aXRoX292ZXJoZWFkKSkgPT0gTlVMTCkgeworCQkJU1NMZXJyKFNTTF9GX0RPX0RUTFMxX1dSSVRFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCXMtPnMzLT53YnVmLmJ1ZiA9IHA7CisJCXMtPnMzLT53YnVmLmxlbiA9IGxlbl93aXRoX292ZXJoZWFkOworCQl9CisKKwkvKiBJZiB3ZSBoYXZlIGFuIGFsZXJ0IHRvIHNlbmQsIGxldHMgc2VuZCBpdCAqLworCWlmIChzLT5zMy0+YWxlcnRfZGlzcGF0Y2gpCisJCXsKKwkJaT1zLT5tZXRob2QtPnNzbF9kaXNwYXRjaF9hbGVydChzKTsKKwkJaWYgKGkgPD0gMCkKKwkJCXJldHVybihpKTsKKwkJLyogaWYgaXQgd2VudCwgZmFsbCB0aHJvdWdoIGFuZCBzZW5kIG1vcmUgc3R1ZmYgKi8KKwkJfQorCisJaWYgKGxlbiA9PSAwICYmICFjcmVhdGVfZW1wdHlfZnJhZ21lbnQpCisJCXJldHVybiAwOworCisJd3I9ICYocy0+czMtPndyZWMpOworCXdiPSAmKHMtPnMzLT53YnVmKTsKKwlzZXNzPXMtPnNlc3Npb247CisKKwlpZiAoCShzZXNzID09IE5VTEwpIHx8CisJCShzLT5lbmNfd3JpdGVfY3R4ID09IE5VTEwpIHx8CisJCShFVlBfTURfQ1RYX21kKHMtPndyaXRlX2hhc2gpID09IE5VTEwpKQorCQljbGVhcj0xOworCisJaWYgKGNsZWFyKQorCQltYWNfc2l6ZT0wOworCWVsc2UKKwkJeworCQltYWNfc2l6ZT1FVlBfTURfQ1RYX3NpemUocy0+d3JpdGVfaGFzaCk7CisJCWlmIChtYWNfc2l6ZSA8IDApCisJCQlnb3RvIGVycjsKKwkJfQorCisJLyogRFRMUyBpbXBsZW1lbnRzIGV4cGxpY2l0IElWLCBzbyBubyBuZWVkIGZvciBlbXB0eSBmcmFnbWVudHMgKi8KKyNpZiAwCisJLyogJ2NyZWF0ZV9lbXB0eV9mcmFnbWVudCcgaXMgdHJ1ZSBvbmx5IHdoZW4gdGhpcyBmdW5jdGlvbiBjYWxscyBpdHNlbGYgKi8KKwlpZiAoIWNsZWFyICYmICFjcmVhdGVfZW1wdHlfZnJhZ21lbnQgJiYgIXMtPnMzLT5lbXB0eV9mcmFnbWVudF9kb25lCisJICAgICYmIFNTTF92ZXJzaW9uKHMpICE9IERUTFMxX1ZFUlNJT04gJiYgU1NMX3ZlcnNpb24ocykgIT0gRFRMUzFfQkFEX1ZFUikKKwkJeworCQkvKiBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IGtub3duLUlWIHdlYWtuZXNzIGluIENCQyBjaXBoZXJzdWl0ZXMKKwkJICogKHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35ib2RvL3Rscy1jYmMudHh0KSAKKwkJICovCisKKwkJaWYgKHMtPnMzLT5uZWVkX2VtcHR5X2ZyYWdtZW50cyAmJiB0eXBlID09IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSkKKwkJCXsKKwkJCS8qIHJlY3Vyc2l2ZSBmdW5jdGlvbiBjYWxsIHdpdGggJ2NyZWF0ZV9lbXB0eV9mcmFnbWVudCcgc2V0OworCQkJICogdGhpcyBwcmVwYXJlcyBhbmQgYnVmZmVycyB0aGUgZGF0YSBmb3IgYW4gZW1wdHkgZnJhZ21lbnQKKwkJCSAqICh0aGVzZSAncHJlZml4X2xlbicgYnl0ZXMgYXJlIHNlbnQgb3V0IGxhdGVyCisJCQkgKiB0b2dldGhlciB3aXRoIHRoZSBhY3R1YWwgcGF5bG9hZCkgKi8KKwkJCXByZWZpeF9sZW4gPSBzLT5tZXRob2QtPmRvX3NzbF93cml0ZShzLCB0eXBlLCBidWYsIDAsIDEpOworCQkJaWYgKHByZWZpeF9sZW4gPD0gMCkKKwkJCQlnb3RvIGVycjsKKworCQkJaWYgKHMtPnMzLT53YnVmLmxlbiA8IChzaXplX3QpcHJlZml4X2xlbiArIFNTTDNfUlRfTUFYX1BBQ0tFVF9TSVpFKQorCQkJCXsKKwkJCQkvKiBpbnN1ZmZpY2llbnQgc3BhY2UgKi8KKwkJCQlTU0xlcnIoU1NMX0ZfRE9fRFRMUzFfV1JJVEUsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCQorCQlzLT5zMy0+ZW1wdHlfZnJhZ21lbnRfZG9uZSA9IDE7CisJCX0KKyNlbmRpZgorCXAgPSB3Yi0+YnVmICsgcHJlZml4X2xlbjsKKworCS8qIHdyaXRlIHRoZSBoZWFkZXIgKi8KKworCSoocCsrKT10eXBlJjB4ZmY7CisJd3ItPnR5cGU9dHlwZTsKKworCSoocCsrKT0ocy0+dmVyc2lvbj4+OCk7CisJKihwKyspPXMtPnZlcnNpb24mMHhmZjsKKworCS8qIGZpZWxkIHdoZXJlIHdlIGFyZSB0byB3cml0ZSBvdXQgcGFja2V0IGVwb2NoLCBzZXEgbnVtIGFuZCBsZW4gKi8KKwlwc2VxPXA7IAorCXArPTEwOworCisJLyogbGV0cyBzZXR1cCB0aGUgcmVjb3JkIHN0dWZmLiAqLworCisJLyogTWFrZSBzcGFjZSBmb3IgdGhlIGV4cGxpY2l0IElWIGluIGNhc2Ugb2YgQ0JDLgorCSAqICh0aGlzIGlzIGEgYml0IG9mIGEgYm91bmRhcnkgdmlvbGF0aW9uLCBidXQgd2hhdCB0aGUgaGVjaykuCisJICovCisJaWYgKCBzLT5lbmNfd3JpdGVfY3R4ICYmIAorCQkoRVZQX0NJUEhFUl9tb2RlKCBzLT5lbmNfd3JpdGVfY3R4LT5jaXBoZXIgKSAmIEVWUF9DSVBIX0NCQ19NT0RFKSkKKwkJYnMgPSBFVlBfQ0lQSEVSX2Jsb2NrX3NpemUocy0+ZW5jX3dyaXRlX2N0eC0+Y2lwaGVyKTsKKwllbHNlCisJCWJzID0gMDsKKworCXdyLT5kYXRhPXAgKyBiczsgIC8qIG1ha2Ugcm9vbSBmb3IgSVYgaW4gY2FzZSBvZiBDQkMgKi8KKwl3ci0+bGVuZ3RoPShpbnQpbGVuOworCXdyLT5pbnB1dD0odW5zaWduZWQgY2hhciAqKWJ1ZjsKKworCS8qIHdlIG5vdyAncmVhZCcgZnJvbSB3ci0+aW5wdXQsIHdyLT5sZW5ndGggYnl0ZXMgaW50bworCSAqIHdyLT5kYXRhICovCisKKwkvKiBmaXJzdCB3ZSBjb21wcmVzcyAqLworCWlmIChzLT5jb21wcmVzcyAhPSBOVUxMKQorCQl7CisJCWlmICghc3NsM19kb19jb21wcmVzcyhzKSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9ET19EVExTMV9XUklURSxTU0xfUl9DT01QUkVTU0lPTl9GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCW1lbWNweSh3ci0+ZGF0YSx3ci0+aW5wdXQsd3ItPmxlbmd0aCk7CisJCXdyLT5pbnB1dD13ci0+ZGF0YTsKKwkJfQorCisJLyogd2Ugc2hvdWxkIHN0aWxsIGhhdmUgdGhlIG91dHB1dCB0byB3ci0+ZGF0YSBhbmQgdGhlIGlucHV0CisJICogZnJvbSB3ci0+aW5wdXQuICBMZW5ndGggc2hvdWxkIGJlIHdyLT5sZW5ndGguCisJICogd3ItPmRhdGEgc3RpbGwgcG9pbnRzIGluIHRoZSB3Yi0+YnVmICovCisKKwlpZiAobWFjX3NpemUgIT0gMCkKKwkJeworCQlpZihzLT5tZXRob2QtPnNzbDNfZW5jLT5tYWMocywmKHBbd3ItPmxlbmd0aCArIGJzXSksMSkgPCAwKQorCQkJZ290byBlcnI7CisJCXdyLT5sZW5ndGgrPW1hY19zaXplOworCQl9CisKKwkvKiB0aGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZiBtYWMgc2l6ZSAqLworCXdyLT5pbnB1dD1wOworCXdyLT5kYXRhPXA7CisKKworCS8qIHNzbDNfZW5jIGNhbiBvbmx5IGhhdmUgYW4gZXJyb3Igb24gcmVhZCAqLworCWlmIChicykJLyogYnMgIT0gMCBpbiBjYXNlIG9mIENCQyAqLworCQl7CisJCVJBTkRfcHNldWRvX2J5dGVzKHAsYnMpOworCQkvKiBtYXN0ZXIgSVYgYW5kIGxhc3QgQ0JDIHJlc2lkdWUgc3RhbmQgZm9yCisJCSAqIHRoZSByZXN0IG9mIHJhbmRvbW5lc3MgKi8KKwkJd3ItPmxlbmd0aCArPSBiczsKKwkJfQorCisJcy0+bWV0aG9kLT5zc2wzX2VuYy0+ZW5jKHMsMSk7CisKKwkvKiByZWNvcmQgbGVuZ3RoIGFmdGVyIG1hYyBhbmQgYmxvY2sgcGFkZGluZyAqLworLyoJaWYgKHR5cGUgPT0gU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBIHx8CisJKHR5cGUgPT0gU1NMM19SVF9BTEVSVCAmJiAhIFNTTF9pbl9pbml0KHMpKSkgKi8KKwkKKwkvKiB0aGVyZSdzIG9ubHkgb25lIGVwb2NoIGJldHdlZW4gaGFuZHNoYWtlIGFuZCBhcHAgZGF0YSAqLworCQorCXMybihzLT5kMS0+d19lcG9jaCwgcHNlcSk7CisKKwkvKiBYRFRMUzogPz8gKi8KKy8qCWVsc2UKKwlzMm4ocy0+ZDEtPmhhbmRzaGFrZV9lcG9jaCwgcHNlcSk7ICovCisKKwltZW1jcHkocHNlcSwgJihzLT5zMy0+d3JpdGVfc2VxdWVuY2VbMl0pLCA2KTsKKwlwc2VxKz02OworCXMybih3ci0+bGVuZ3RoLHBzZXEpOworCisJLyogd2Ugc2hvdWxkIG5vdyBoYXZlCisJICogd3ItPmRhdGEgcG9pbnRpbmcgdG8gdGhlIGVuY3J5cHRlZCBkYXRhLCB3aGljaCBpcworCSAqIHdyLT5sZW5ndGggbG9uZyAqLworCXdyLT50eXBlPXR5cGU7IC8qIG5vdCBuZWVkZWQgYnV0IGhlbHBzIGZvciBkZWJ1Z2dpbmcgKi8KKwl3ci0+bGVuZ3RoKz1EVExTMV9SVF9IRUFERVJfTEVOR1RIOworCisjaWYgMCAgLyogdGhpcyBpcyBub3cgZG9uZSBhdCB0aGUgbWVzc2FnZSBsYXllciAqLworCS8qIGJ1ZmZlciB0aGUgcmVjb3JkLCBtYWtpbmcgaXQgZWFzeSB0byBoYW5kbGUgcmV0cmFuc21pdHMgKi8KKwlpZiAoIHR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UgfHwgdHlwZSA9PSBTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQykKKwkJZHRsczFfYnVmZmVyX3JlY29yZChzLCB3ci0+ZGF0YSwgd3ItPmxlbmd0aCwgCisJCQkqKChQUV82NEJJVCAqKSYocy0+czMtPndyaXRlX3NlcXVlbmNlWzBdKSkpOworI2VuZGlmCisKKwlzc2wzX3JlY29yZF9zZXF1ZW5jZV91cGRhdGUoJihzLT5zMy0+d3JpdGVfc2VxdWVuY2VbMF0pKTsKKworCWlmIChjcmVhdGVfZW1wdHlfZnJhZ21lbnQpCisJCXsKKwkJLyogd2UgYXJlIGluIGEgcmVjdXJzaXZlIGNhbGw7CisJCSAqIGp1c3QgcmV0dXJuIHRoZSBsZW5ndGgsIGRvbid0IHdyaXRlIG91dCBhbnl0aGluZyBoZXJlCisJCSAqLworCQlyZXR1cm4gd3ItPmxlbmd0aDsKKwkJfQorCisJLyogbm93IGxldCdzIHNldCB1cCB3YiAqLworCXdiLT5sZWZ0ID0gcHJlZml4X2xlbiArIHdyLT5sZW5ndGg7CisJd2ItPm9mZnNldCA9IDA7CisKKwkvKiBtZW1vcml6ZSBhcmd1bWVudHMgc28gdGhhdCBzc2wzX3dyaXRlX3BlbmRpbmcgY2FuIGRldGVjdCBiYWQgd3JpdGUgcmV0cmllcyBsYXRlciAqLworCXMtPnMzLT53cGVuZF90b3Q9bGVuOworCXMtPnMzLT53cGVuZF9idWY9YnVmOworCXMtPnMzLT53cGVuZF90eXBlPXR5cGU7CisJcy0+czMtPndwZW5kX3JldD1sZW47CisKKwkvKiB3ZSBub3cganVzdCBuZWVkIHRvIHdyaXRlIHRoZSBidWZmZXIgKi8KKwlyZXR1cm4gc3NsM193cml0ZV9wZW5kaW5nKHMsdHlwZSxidWYsbGVuKTsKK2VycjoKKwlyZXR1cm4gLTE7CisJfQorCisKKworc3RhdGljIGludCBkdGxzMV9yZWNvcmRfcmVwbGF5X2NoZWNrKFNTTCAqcywgRFRMUzFfQklUTUFQICpiaXRtYXApCisJeworCWludCBjbXA7CisJdW5zaWduZWQgaW50IHNoaWZ0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlcSA9IHMtPnMzLT5yZWFkX3NlcXVlbmNlOworCisJY21wID0gc2F0c3ViNjRiZShzZXEsYml0bWFwLT5tYXhfc2VxX251bSk7CisJaWYgKGNtcCA+IDApCisJCXsKKwkJbWVtY3B5IChzLT5zMy0+cnJlYy5zZXFfbnVtLHNlcSw4KTsKKwkJcmV0dXJuIDE7IC8qIHRoaXMgcmVjb3JkIGluIG5ldyAqLworCQl9CisJc2hpZnQgPSAtY21wOworCWlmIChzaGlmdCA+PSBzaXplb2YoYml0bWFwLT5tYXApKjgpCisJCXJldHVybiAwOyAvKiBzdGFsZSwgb3V0c2lkZSB0aGUgd2luZG93ICovCisJZWxzZSBpZiAoYml0bWFwLT5tYXAgJiAoMVVMPDxzaGlmdCkpCisJCXJldHVybiAwOyAvKiByZWNvcmQgcHJldmlvdXNseSByZWNlaXZlZCAqLworCisJbWVtY3B5IChzLT5zMy0+cnJlYy5zZXFfbnVtLHNlcSw4KTsKKwlyZXR1cm4gMTsKKwl9CisKKworc3RhdGljIHZvaWQgZHRsczFfcmVjb3JkX2JpdG1hcF91cGRhdGUoU1NMICpzLCBEVExTMV9CSVRNQVAgKmJpdG1hcCkKKwl7CisJaW50IGNtcDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc2VxID0gcy0+czMtPnJlYWRfc2VxdWVuY2U7CisKKwljbXAgPSBzYXRzdWI2NGJlKHNlcSxiaXRtYXAtPm1heF9zZXFfbnVtKTsKKwlpZiAoY21wID4gMCkKKwkJeworCQlzaGlmdCA9IGNtcDsKKwkJaWYgKHNoaWZ0IDwgc2l6ZW9mKGJpdG1hcC0+bWFwKSo4KQorCQkJYml0bWFwLT5tYXAgPDw9IHNoaWZ0LCBiaXRtYXAtPm1hcCB8PSAxVUw7CisJCWVsc2UKKwkJCWJpdG1hcC0+bWFwID0gMVVMOworCQltZW1jcHkoYml0bWFwLT5tYXhfc2VxX251bSxzZXEsOCk7CisJCX0KKwllbHNlCXsKKwkJc2hpZnQgPSAtY21wOworCQlpZiAoc2hpZnQgPCBzaXplb2YoYml0bWFwLT5tYXApKjgpCisJCQliaXRtYXAtPm1hcCB8PSAxVUw8PHNoaWZ0OworCQl9CisJfQorCisKK2ludCBkdGxzMV9kaXNwYXRjaF9hbGVydChTU0wgKnMpCisJeworCWludCBpLGo7CisJdm9pZCAoKmNiKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKT1OVUxMOworCXVuc2lnbmVkIGNoYXIgYnVmW0RUTFMxX0FMX0hFQURFUl9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICZidWZbMF07CisKKwlzLT5zMy0+YWxlcnRfZGlzcGF0Y2g9MDsKKworCW1lbXNldChidWYsIDB4MDAsIHNpemVvZihidWYpKTsKKwkqcHRyKysgPSBzLT5zMy0+c2VuZF9hbGVydFswXTsKKwkqcHRyKysgPSBzLT5zMy0+c2VuZF9hbGVydFsxXTsKKworI2lmZGVmIERUTFMxX0FEX01JU1NJTkdfSEFORFNIQUtFX01FU1NBR0UKKwlpZiAocy0+czMtPnNlbmRfYWxlcnRbMV0gPT0gRFRMUzFfQURfTUlTU0lOR19IQU5EU0hBS0VfTUVTU0FHRSkKKwkJewkKKwkJczJuKHMtPmQxLT5oYW5kc2hha2VfcmVhZF9zZXEsIHB0cik7CisjaWYgMAorCQlpZiAoIHMtPmQxLT5yX21zZ19oZHIuZnJhZ19vZmYgPT0gMCkgIC8qIHdhaXRpbmcgZm9yIGEgbmV3IG1zZyAqLworCisJCWVsc2UKKwkJCXMybihzLT5kMS0+cl9tc2dfaGRyLnNlcSwgcHRyKTsgLyogcGFydGlhbCBtc2cgcmVhZCAqLworI2VuZGlmCisKKyNpZiAwCisJCWZwcmludGYoc3RkZXJyLCAicy0+ZDEtPmhhbmRzaGFrZV9yZWFkX3NlcSA9ICVkLCBzLT5kMS0+cl9tc2dfaGRyLnNlcSA9ICVkXG4iLHMtPmQxLT5oYW5kc2hha2VfcmVhZF9zZXEscy0+ZDEtPnJfbXNnX2hkci5zZXEpOworI2VuZGlmCisJCWwybjMocy0+ZDEtPnJfbXNnX2hkci5mcmFnX29mZiwgcHRyKTsKKwkJfQorI2VuZGlmCisKKwlpID0gZG9fZHRsczFfd3JpdGUocywgU1NMM19SVF9BTEVSVCwgJmJ1ZlswXSwgc2l6ZW9mKGJ1ZiksIDApOworCWlmIChpIDw9IDApCisJCXsKKwkJcy0+czMtPmFsZXJ0X2Rpc3BhdGNoPTE7CisJCS8qIGZwcmludGYoIHN0ZGVyciwgIm5vdCBkb25lIHdpdGggYWxlcnRcbiIgKTsgKi8KKwkJfQorCWVsc2UKKwkJeworCQlpZiAocy0+czMtPnNlbmRfYWxlcnRbMF0gPT0gU1NMM19BTF9GQVRBTAorI2lmZGVmIERUTFMxX0FEX01JU1NJTkdfSEFORFNIQUtFX01FU1NBR0UKKwkJICAgIHx8IHMtPnMzLT5zZW5kX2FsZXJ0WzFdID09IERUTFMxX0FEX01JU1NJTkdfSEFORFNIQUtFX01FU1NBR0UKKyNlbmRpZgorCQkgICAgKQorCQkJKHZvaWQpQklPX2ZsdXNoKHMtPndiaW8pOworCisJCWlmIChzLT5tc2dfY2FsbGJhY2spCisJCQlzLT5tc2dfY2FsbGJhY2soMSwgcy0+dmVyc2lvbiwgU1NMM19SVF9BTEVSVCwgcy0+czMtPnNlbmRfYWxlcnQsIAorCQkJCTIsIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOworCisJCWlmIChzLT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCQljYj1zLT5pbmZvX2NhbGxiYWNrOworCQllbHNlIGlmIChzLT5jdHgtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJCWNiPXMtPmN0eC0+aW5mb19jYWxsYmFjazsKKworCQlpZiAoY2IgIT0gTlVMTCkKKwkJCXsKKwkJCWo9KHMtPnMzLT5zZW5kX2FsZXJ0WzBdPDw4KXxzLT5zMy0+c2VuZF9hbGVydFsxXTsKKwkJCWNiKHMsU1NMX0NCX1dSSVRFX0FMRVJULGopOworCQkJfQorCQl9CisJcmV0dXJuKGkpOworCX0KKworCitzdGF0aWMgRFRMUzFfQklUTUFQICoKK2R0bHMxX2dldF9iaXRtYXAoU1NMICpzLCBTU0wzX1JFQ09SRCAqcnIsIHVuc2lnbmVkIGludCAqaXNfbmV4dF9lcG9jaCkKKyAgICB7CisgICAgCisgICAgKmlzX25leHRfZXBvY2ggPSAwOworCisgICAgLyogSW4gY3VycmVudCBlcG9jaCwgYWNjZXB0IEhNLCBDQ1MsIERBVEEsICYgQUxFUlQgKi8KKyAgICBpZiAocnItPmVwb2NoID09IHMtPmQxLT5yX2Vwb2NoKQorICAgICAgICByZXR1cm4gJnMtPmQxLT5iaXRtYXA7CisKKyAgICAvKiBPbmx5IEhNIGFuZCBBTEVSVCBtZXNzYWdlcyBjYW4gYmUgZnJvbSB0aGUgbmV4dCBlcG9jaCAqLworICAgIGVsc2UgaWYgKHJyLT5lcG9jaCA9PSAodW5zaWduZWQgbG9uZykocy0+ZDEtPnJfZXBvY2ggKyAxKSAmJgorICAgICAgICAocnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UgfHwKKyAgICAgICAgICAgIHJyLT50eXBlID09IFNTTDNfUlRfQUxFUlQpKQorICAgICAgICB7CisgICAgICAgICppc19uZXh0X2Vwb2NoID0gMTsKKyAgICAgICAgcmV0dXJuICZzLT5kMS0+bmV4dF9iaXRtYXA7CisgICAgICAgIH0KKworICAgIHJldHVybiBOVUxMOworICAgIH0KKworI2lmIDAKK3N0YXRpYyBpbnQKK2R0bHMxX3JlY29yZF9uZWVkc19idWZmZXJpbmcoU1NMICpzLCBTU0wzX1JFQ09SRCAqcnIsIHVuc2lnbmVkIHNob3J0ICpwcmlvcml0eSwKKwl1bnNpZ25lZCBsb25nICpvZmZzZXQpCisJeworCisJLyogYWxlcnRzIGFyZSBwYXNzZWQgdXAgaW1tZWRpYXRlbHkgKi8KKwlpZiAoIHJyLT50eXBlID09IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSB8fAorCQlyci0+dHlwZSA9PSBTU0wzX1JUX0FMRVJUKQorCQlyZXR1cm4gMDsKKworCS8qIE9ubHkgbmVlZCB0byBidWZmZXIgaWYgYSBoYW5kc2hha2UgaXMgdW5kZXJ3YXkuCisJICogKHRoaXMgaW1wbGllcyB0aGF0IEhlbGxvIFJlcXVlc3QgYW5kIENsaWVudCBIZWxsbyBhcmUgcGFzc2VkIHVwCisJICogaW1tZWRpYXRlbHkpICovCisJaWYgKCBTU0xfaW5faW5pdChzKSkKKwkJeworCQl1bnNpZ25lZCBjaGFyICpkYXRhID0gcnItPmRhdGE7CisJCS8qIG5lZWQgdG8gZXh0cmFjdCB0aGUgSE0vQ0NTIHNlcXVlbmNlIG51bWJlciBoZXJlICovCisJCWlmICggcnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UgfHwKKwkJCXJyLT50eXBlID09IFNTTDNfUlRfQ0hBTkdFX0NJUEhFUl9TUEVDKQorCQkJeworCQkJdW5zaWduZWQgc2hvcnQgc2VxX251bTsKKwkJCXN0cnVjdCBobV9oZWFkZXJfc3QgbXNnX2hkcjsKKwkJCXN0cnVjdCBjY3NfaGVhZGVyX3N0IGNjc19oZHI7CisKKwkJCWlmICggcnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UpCisJCQkJeworCQkJCWR0bHMxX2dldF9tZXNzYWdlX2hlYWRlcihkYXRhLCAmbXNnX2hkcik7CisJCQkJc2VxX251bSA9IG1zZ19oZHIuc2VxOworCQkJCSpvZmZzZXQgPSBtc2dfaGRyLmZyYWdfb2ZmOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJZHRsczFfZ2V0X2Njc19oZWFkZXIoZGF0YSwgJmNjc19oZHIpOworCQkJCXNlcV9udW0gPSBjY3NfaGRyLnNlcTsKKwkJCQkqb2Zmc2V0ID0gMDsKKwkJCQl9CisJCQkJCisJCQkvKiB0aGlzIGlzIGVpdGhlciBhIHJlY29yZCB3ZSdyZSB3YWl0aW5nIGZvciwgb3IgYQorCQkJICogcmV0cmFuc21pdCBvZiBzb21ldGhpbmcgd2UgaGFwcGVuZWQgdG8gcHJldmlvdXNseSAKKwkJCSAqIHJlY2VpdmUgKGhpZ2hlciBsYXllcnMgd2lsbCBkcm9wIHRoZSByZXBlYXQgc2lsZW50bHkgKi8KKwkJCWlmICggc2VxX251bSA8IHMtPmQxLT5oYW5kc2hha2VfcmVhZF9zZXEpCisJCQkJcmV0dXJuIDA7CisJCQlpZiAocnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UgJiYgCisJCQkJc2VxX251bSA9PSBzLT5kMS0+aGFuZHNoYWtlX3JlYWRfc2VxICYmCisJCQkJbXNnX2hkci5mcmFnX29mZiA8IHMtPmQxLT5yX21zZ19oZHIuZnJhZ19vZmYpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlIGlmICggc2VxX251bSA9PSBzLT5kMS0+aGFuZHNoYWtlX3JlYWRfc2VxICYmCisJCQkJKHJyLT50eXBlID09IFNTTDNfUlRfQ0hBTkdFX0NJUEhFUl9TUEVDIHx8CisJCQkJCW1zZ19oZHIuZnJhZ19vZmYgPT0gcy0+ZDEtPnJfbXNnX2hkci5mcmFnX29mZikpCisJCQkJcmV0dXJuIDA7CisJCQllbHNlCisJCQkJeworCQkJCSpwcmlvcml0eSA9IHNlcV9udW07CisJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQllbHNlIC8qIHVua25vd24gcmVjb3JkIHR5cGUgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwordm9pZAorZHRsczFfcmVzZXRfc2VxX251bWJlcnMoU1NMICpzLCBpbnQgcncpCisJeworCXVuc2lnbmVkIGNoYXIgKnNlcTsKKwl1bnNpZ25lZCBpbnQgc2VxX2J5dGVzID0gc2l6ZW9mKHMtPnMzLT5yZWFkX3NlcXVlbmNlKTsKKworCWlmICggcncgJiBTU0wzX0NDX1JFQUQpCisJCXsKKwkJc2VxID0gcy0+czMtPnJlYWRfc2VxdWVuY2U7CisJCXMtPmQxLT5yX2Vwb2NoKys7CisJCW1lbWNweSgmKHMtPmQxLT5iaXRtYXApLCAmKHMtPmQxLT5uZXh0X2JpdG1hcCksIHNpemVvZihEVExTMV9CSVRNQVApKTsKKwkJbWVtc2V0KCYocy0+ZDEtPm5leHRfYml0bWFwKSwgMHgwMCwgc2l6ZW9mKERUTFMxX0JJVE1BUCkpOworCQl9CisJZWxzZQorCQl7CisJCXNlcSA9IHMtPnMzLT53cml0ZV9zZXF1ZW5jZTsKKwkJbWVtY3B5KHMtPmQxLT5sYXN0X3dyaXRlX3NlcXVlbmNlLCBzZXEsIHNpemVvZihzLT5zMy0+d3JpdGVfc2VxdWVuY2UpKTsKKwkJcy0+ZDEtPndfZXBvY2grKzsKKwkJfQorCisJbWVtc2V0KHNlcSwgMHgwMCwgc2VxX2J5dGVzKTsKKwl9CisKKworc3RhdGljIHZvaWQKK2R0bHMxX2NsZWFyX3RpbWVvdXRzKFNTTCAqcykKKwl7CisJbWVtc2V0KCYocy0+ZDEtPnRpbWVvdXQpLCAweDAwLCBzaXplb2Yoc3RydWN0IGR0bHMxX3RpbWVvdXRfc3QpKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvZDFfc3J2ci5jIGIvbGliL29wZW5zc2wvc3NsL2QxX3NydnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFjZWRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL2QxX3NydnIuYwpAQCAtMCwwICsxLDE1NTEgQEAKKy8qIHNzbC9kMV9zcnZyLmMgKi8KKy8qIAorICogRFRMUyBpbXBsZW1lbnRhdGlvbiB3cml0dGVuIGJ5IE5hZ2VuZHJhIE1vZGFkdWd1CisgKiAobmFnZW5kcmFAY3Muc3RhbmZvcmQuZWR1KSBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDA1LiAgCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqZHRsczFfZ2V0X3NlcnZlcl9tZXRob2QoaW50IHZlcik7CitzdGF0aWMgaW50IGR0bHMxX3NlbmRfaGVsbG9fdmVyaWZ5X3JlcXVlc3QoU1NMICpzKTsKKworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKmR0bHMxX2dldF9zZXJ2ZXJfbWV0aG9kKGludCB2ZXIpCisJeworCWlmICh2ZXIgPT0gRFRMUzFfVkVSU0lPTikKKwkJcmV0dXJuKERUTFN2MV9zZXJ2ZXJfbWV0aG9kKCkpOworCWVsc2UKKwkJcmV0dXJuKE5VTEwpOworCX0KKworSU1QTEVNRU5UX2R0bHMxX21ldGhfZnVuYyhEVExTdjFfc2VydmVyX21ldGhvZCwKKwkJCWR0bHMxX2FjY2VwdCwKKwkJCXNzbF91bmRlZmluZWRfZnVuY3Rpb24sCisJCQlkdGxzMV9nZXRfc2VydmVyX21ldGhvZCkKKworaW50IGR0bHMxX2FjY2VwdChTU0wgKnMpCisJeworCUJVRl9NRU0gKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIFRpbWU9KHVuc2lnbmVkIGxvbmcpdGltZShOVUxMKTsKKwl2b2lkICgqY2IpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpPU5VTEw7CisJdW5zaWduZWQgbG9uZyBhbGdfazsKKwlpbnQgcmV0PSAtMTsKKwlpbnQgbmV3X3N0YXRlLHN0YXRlLHNraXA9MDsKKworCVJBTkRfYWRkKCZUaW1lLHNpemVvZihUaW1lKSwwKTsKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKwljbGVhcl9zeXNfZXJyb3IoKTsKKworCWlmIChzLT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCWNiPXMtPmluZm9fY2FsbGJhY2s7CisJZWxzZSBpZiAocy0+Y3R4LT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCWNiPXMtPmN0eC0+aW5mb19jYWxsYmFjazsKKworCS8qIGluaXQgdGhpbmdzIHRvIGJsYW5rICovCisJcy0+aW5faGFuZHNoYWtlKys7CisJaWYgKCFTU0xfaW5faW5pdChzKSB8fCBTU0xfaW5fYmVmb3JlKHMpKSBTU0xfY2xlYXIocyk7CisKKwlpZiAocy0+Y2VydCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9EVExTMV9BQ0NFUFQsU1NMX1JfTk9fQ0VSVElGSUNBVEVfU0VUKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCisJZm9yICg7OykKKwkJeworCQlzdGF0ZT1zLT5zdGF0ZTsKKworCQlzd2l0Y2ggKHMtPnN0YXRlKQorCQkJeworCQljYXNlIFNTTF9TVF9SRU5FR09USUFURToKKwkJCXMtPm5ld19zZXNzaW9uPTE7CisJCQkvKiBzLT5zdGF0ZT1TU0xfU1RfQUNDRVBUOyAqLworCisJCWNhc2UgU1NMX1NUX0JFRk9SRToKKwkJY2FzZSBTU0xfU1RfQUNDRVBUOgorCQljYXNlIFNTTF9TVF9CRUZPUkV8U1NMX1NUX0FDQ0VQVDoKKwkJY2FzZSBTU0xfU1RfT0t8U1NMX1NUX0FDQ0VQVDoKKworCQkJcy0+c2VydmVyPTE7CisJCQlpZiAoY2IgIT0gTlVMTCkgY2IocyxTU0xfQ0JfSEFORFNIQUtFX1NUQVJULDEpOworCisJCQlpZiAoKHMtPnZlcnNpb24gJiAweGZmMDApICE9IChEVExTMV9WRVJTSU9OICYgMHhmZjAwKSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX0FDQ0VQVCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQlzLT50eXBlPVNTTF9TVF9BQ0NFUFQ7CisKKwkJCWlmIChzLT5pbml0X2J1ZiA9PSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoKGJ1Zj1CVUZfTUVNX25ldygpKSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCXJldD0gLTE7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJaWYgKCFCVUZfTUVNX2dyb3coYnVmLFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCkpCisJCQkJCXsKKwkJCQkJcmV0PSAtMTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlzLT5pbml0X2J1Zj1idWY7CisJCQkJfQorCisJCQlpZiAoIXNzbDNfc2V0dXBfYnVmZmVycyhzKSkKKwkJCQl7CisJCQkJcmV0PSAtMTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisKKwkJCXMtPmluaXRfbnVtPTA7CisKKwkJCWlmIChzLT5zdGF0ZSAhPSBTU0xfU1RfUkVORUdPVElBVEUpCisJCQkJeworCQkJCS8qIE9rLCB3ZSBub3cgbmVlZCB0byBwdXNoIG9uIGEgYnVmZmVyaW5nIEJJTyBzbyB0aGF0CisJCQkJICogdGhlIG91dHB1dCBpcyBzZW50IGluIGEgd2F5IHRoYXQgVENQIGxpa2VzIDotKQorCQkJCSAqLworCQkJCWlmICghc3NsX2luaXRfd2Jpb19idWZmZXIocywxKSkgeyByZXQ9IC0xOyBnb3RvIGVuZDsgfQorCisJCQkJc3NsM19pbml0X2ZpbmlzaGVkX21hYyhzKTsKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NSX0NMTlRfSEVMTE9fQTsKKwkJCQlzLT5jdHgtPnN0YXRzLnNlc3NfYWNjZXB0Kys7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkvKiBzLT5zdGF0ZSA9PSBTU0xfU1RfUkVORUdPVElBVEUsCisJCQkJICogd2Ugd2lsbCBqdXN0IHNlbmQgYSBIZWxsb1JlcXVlc3QgKi8KKwkJCQlzLT5jdHgtPnN0YXRzLnNlc3NfYWNjZXB0X3JlbmVnb3RpYXRlKys7CisJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19IRUxMT19SRVFfQTsKKwkJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19IRUxMT19SRVFfQToKKwkJY2FzZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9COgorCisJCQlzLT5zaHV0ZG93bj0wOworCQkJZHRsczFfc3RhcnRfdGltZXIocyk7CisJCQlyZXQ9ZHRsczFfc2VuZF9oZWxsb19yZXF1ZXN0KHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnMzLT50bXAubmV4dF9zdGF0ZT1TU0wzX1NUX1NXX0hFTExPX1JFUV9DOworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19GTFVTSDsKKwkJCXMtPmluaXRfbnVtPTA7CisKKwkJCXNzbDNfaW5pdF9maW5pc2hlZF9tYWMocyk7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0M6CisJCQlzLT5zdGF0ZT1TU0xfU1RfT0s7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19BOgorCQljYXNlIFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19COgorCQljYXNlIFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19DOgorCisJCQlzLT5zaHV0ZG93bj0wOworCQkJcmV0PXNzbDNfZ2V0X2NsaWVudF9oZWxsbyhzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlkdGxzMV9zdG9wX3RpbWVyKHMpOworCisJCQlpZiAocmV0ID09IDEgJiYgKFNTTF9nZXRfb3B0aW9ucyhzKSAmIFNTTF9PUF9DT09LSUVfRVhDSEFOR0UpKQorCQkJCXMtPnN0YXRlID0gRFRMUzFfU1RfU1dfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQTsKKwkJCWVsc2UKKwkJCQlzLT5zdGF0ZSA9IFNTTDNfU1RfU1dfU1JWUl9IRUxMT19BOworCisJCQlzLT5pbml0X251bT0wOworCisJCQkvKiBJZiB3ZSdyZSBqdXN0IGxpc3RlbmluZywgc3RvcCBoZXJlICovCisJCQlpZiAocy0+ZDEtPmxpc3RlbiAmJiBzLT5zdGF0ZSA9PSBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQSkKKwkJCQl7CisJCQkJcmV0ID0gMjsKKwkJCQlzLT5kMS0+bGlzdGVuID0gMDsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQkKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgRFRMUzFfU1RfU1dfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQToKKwkJY2FzZSBEVExTMV9TVF9TV19IRUxMT19WRVJJRllfUkVRVUVTVF9COgorCisJCQlkdGxzMV9zdGFydF90aW1lcihzKTsKKwkJCXJldCA9IGR0bHMxX3NlbmRfaGVsbG9fdmVyaWZ5X3JlcXVlc3Qocyk7CisJCQlpZiAoIHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfRkxVU0g7CisJCQlzLT5zMy0+dG1wLm5leHRfc3RhdGU9U1NMM19TVF9TUl9DTE5UX0hFTExPX0E7CisKKwkJCS8qIEhlbGxvVmVyaWZ5UmVxdWVzdCByZXNldHMgRmluaXNoZWQgTUFDICovCisJCQlpZiAocy0+dmVyc2lvbiAhPSBEVExTMV9CQURfVkVSKQorCQkJCXNzbDNfaW5pdF9maW5pc2hlZF9tYWMocyk7CisJCQlicmVhazsKKwkJCQorCQljYXNlIFNTTDNfU1RfU1dfU1JWUl9IRUxMT19BOgorCQljYXNlIFNTTDNfU1RfU1dfU1JWUl9IRUxMT19COgorCQkJcy0+bmV3X3Nlc3Npb24gPSAyOworCQkJZHRsczFfc3RhcnRfdGltZXIocyk7CisJCQlyZXQ9ZHRsczFfc2VuZF9zZXJ2ZXJfaGVsbG8ocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCQlpZiAocy0+aGl0KQorCQkJCXsKKwkJCQlpZiAocy0+dGxzZXh0X3RpY2tldF9leHBlY3RlZCkKKwkJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19TRVNTSU9OX1RJQ0tFVF9BOworCQkJCWVsc2UKKwkJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19DSEFOR0VfQTsKKwkJCQl9CisjZWxzZQorCQkJaWYgKHMtPmhpdCkKKwkJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19DSEFOR0VfQTsKKyNlbmRpZgorCQkJZWxzZQorCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfQ0VSVF9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19DRVJUX0E6CisJCWNhc2UgU1NMM19TVF9TV19DRVJUX0I6CisJCQkvKiBDaGVjayBpZiBpdCBpcyBhbm9uIERIIG9yIG5vcm1hbCBQU0sgKi8KKwkJCWlmICghKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGggJiBTU0xfYU5VTEwpCisJCQkJJiYgIShzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5ICYgU1NMX2tQU0spKQorCQkJCXsKKwkJCQlkdGxzMV9zdGFydF90aW1lcihzKTsKKwkJCQlyZXQ9ZHRsczFfc2VuZF9zZXJ2ZXJfY2VydGlmaWNhdGUocyk7CisJCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJCQlpZiAocy0+dGxzZXh0X3N0YXR1c19leHBlY3RlZCkKKwkJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19DRVJUX1NUQVRVU19BOworCQkJCWVsc2UKKwkJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19LRVlfRVhDSF9BOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJc2tpcCA9IDE7CisJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19LRVlfRVhDSF9BOworCQkJCX0KKyNlbHNlCisJCQkJfQorCQkJZWxzZQorCQkJCXNraXA9MTsKKworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19LRVlfRVhDSF9BOworI2VuZGlmCisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NXX0tFWV9FWENIX0E6CisJCWNhc2UgU1NMM19TVF9TV19LRVlfRVhDSF9COgorCQkJYWxnX2sgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OworCisJCQkvKiBjbGVhciB0aGlzLCBpdCBtYXkgZ2V0IHJlc2V0IGJ5CisJCQkgKiBzZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UgKi8KKwkJCWlmICgocy0+b3B0aW9ucyAmIFNTTF9PUF9FUEhFTUVSQUxfUlNBKQorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwkJCQkmJiAhKGFsZ19rICYgU1NMX2tLUkI1KQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fS1JCNSAqLworCQkJCSkKKwkJCQkvKiBvcHRpb24gU1NMX09QX0VQSEVNRVJBTF9SU0Egc2VuZHMgdGVtcG9yYXJ5IFJTQSBrZXkKKwkJCQkgKiBldmVuIHdoZW4gZm9yYmlkZGVuIGJ5IHByb3RvY29sIHNwZWNzCisJCQkJICogKGhhbmRzaGFrZSBtYXkgZmFpbCBhcyBjbGllbnRzIGFyZSBub3QgcmVxdWlyZWQgdG8KKwkJCQkgKiBiZSBhYmxlIHRvIGhhbmRsZSB0aGlzKSAqLworCQkJCXMtPnMzLT50bXAudXNlX3JzYV90bXA9MTsKKwkJCWVsc2UKKwkJCQlzLT5zMy0+dG1wLnVzZV9yc2FfdG1wPTA7CisKKwkJCS8qIG9ubHkgc2VuZCBpZiBhIERIIGtleSBleGNoYW5nZSBvcgorCQkJICogUlNBIGJ1dCB3ZSBoYXZlIGEgc2lnbiBvbmx5IGNlcnRpZmljYXRlICovCisJCQlpZiAocy0+czMtPnRtcC51c2VfcnNhX3RtcAorCQkJLyogUFNLOiBzZW5kIFNlcnZlcktleUV4Y2hhbmdlIGlmIFBTSyBpZGVudGl0eQorCQkJICogaGludCBpZiBwcm92aWRlZCAqLworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCQkJICAgIHx8ICgoYWxnX2sgJiBTU0xfa1BTSykgJiYgcy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCkKKyNlbmRpZgorCQkJICAgIHx8IChhbGdfayAmIChTU0xfa0VESHxTU0xfa0RIcnxTU0xfa0RIZCkpCisJCQkgICAgfHwgKGFsZ19rICYgU1NMX2tFRUNESCkKKwkJCSAgICB8fCAoKGFsZ19rICYgU1NMX2tSU0EpCisJCQkJJiYgKHMtPmNlcnQtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLnByaXZhdGVrZXkgPT0gTlVMTAorCQkJCSAgICB8fCAoU1NMX0NfSVNfRVhQT1JUKHMtPnMzLT50bXAubmV3X2NpcGhlcikKKwkJCQkJJiYgRVZQX1BLRVlfc2l6ZShzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS5wcml2YXRla2V5KSo4ID4gU1NMX0NfRVhQT1JUX1BLRVlMRU5HVEgocy0+czMtPnRtcC5uZXdfY2lwaGVyKQorCQkJCQkpCisJCQkJICAgICkKKwkJCQkpCisJCQkgICAgKQorCQkJCXsKKwkJCQlkdGxzMV9zdGFydF90aW1lcihzKTsKKwkJCQlyZXQ9ZHRsczFfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlKHMpOworCQkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQkJfQorCQkJZWxzZQorCQkJCXNraXA9MTsKKworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19DRVJUX1JFUV9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19DRVJUX1JFUV9BOgorCQljYXNlIFNTTDNfU1RfU1dfQ0VSVF9SRVFfQjoKKwkJCWlmICgvKiBkb24ndCByZXF1ZXN0IGNlcnQgdW5sZXNzIGFza2VkIGZvciBpdDogKi8KKwkJCQkhKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9QRUVSKSB8fAorCQkJCS8qIGlmIFNTTF9WRVJJRllfQ0xJRU5UX09OQ0UgaXMgc2V0LAorCQkJCSAqIGRvbid0IHJlcXVlc3QgY2VydCBkdXJpbmcgcmUtbmVnb3RpYXRpb246ICovCisJCQkJKChzLT5zZXNzaW9uLT5wZWVyICE9IE5VTEwpICYmCisJCQkJIChzLT52ZXJpZnlfbW9kZSAmIFNTTF9WRVJJRllfQ0xJRU5UX09OQ0UpKSB8fAorCQkJCS8qIG5ldmVyIHJlcXVlc3QgY2VydCBpbiBhbm9ueW1vdXMgY2lwaGVyc3VpdGVzCisJCQkJICogKHNlZSBzZWN0aW9uICJDZXJ0aWZpY2F0ZSByZXF1ZXN0IiBpbiBTU0wgMyBkcmFmdHMKKwkJCQkgKiBhbmQgaW4gUkZDIDIyNDYpOiAqLworCQkJCSgocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aCAmIFNTTF9hTlVMTCkgJiYKKwkJCQkgLyogLi4uIGV4Y2VwdCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpbnNpc3RzIG9uIHZlcmlmaWNhdGlvbgorCQkJCSAgKiAoYWdhaW5zdCB0aGUgc3BlY3MsIGJ1dCBzM19jbG50LmMgYWNjZXB0cyB0aGlzIGZvciBTU0wgMykgKi8KKwkJCQkgIShzLT52ZXJpZnlfbW9kZSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpKSB8fAorCQkJCSAvKiBuZXZlciByZXF1ZXN0IGNlcnQgaW4gS2VyYmVyb3MgY2lwaGVyc3VpdGVzICovCisJCQkJKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGggJiBTU0xfYUtSQjUpCisJCQkJLyogV2l0aCBub3JtYWwgUFNLIENlcnRpZmljYXRlcyBhbmQKKwkJCQkgKiBDZXJ0aWZpY2F0ZSBSZXF1ZXN0cyBhcmUgb21pdHRlZCAqLworCQkJCXx8IChzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5ICYgU1NMX2tQU0spKQorCQkJCXsKKwkJCQkvKiBubyBjZXJ0IHJlcXVlc3QgKi8KKwkJCQlza2lwPTE7CisJCQkJcy0+czMtPnRtcC5jZXJ0X3JlcXVlc3Q9MDsKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX1NSVlJfRE9ORV9BOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJcy0+czMtPnRtcC5jZXJ0X3JlcXVlc3Q9MTsKKwkJCQlkdGxzMV9zdGFydF90aW1lcihzKTsKKwkJCQlyZXQ9ZHRsczFfc2VuZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KHMpOworCQkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisjaWZuZGVmIE5FVFNDQVBFX0hBTkdfQlVHCisJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19TUlZSX0RPTkVfQTsKKyNlbHNlCisJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19GTFVTSDsKKwkJCQlzLT5zMy0+dG1wLm5leHRfc3RhdGU9U1NMM19TVF9TUl9DRVJUX0E7CisjZW5kaWYKKwkJCQlzLT5pbml0X251bT0wOworCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19TUlZSX0RPTkVfQToKKwkJY2FzZSBTU0wzX1NUX1NXX1NSVlJfRE9ORV9COgorCQkJZHRsczFfc3RhcnRfdGltZXIocyk7CisJCQlyZXQ9ZHRsczFfc2VuZF9zZXJ2ZXJfZG9uZShzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5zMy0+dG1wLm5leHRfc3RhdGU9U1NMM19TVF9TUl9DRVJUX0E7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX0ZMVVNIOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBTU0wzX1NUX1NXX0ZMVVNIOgorCQkJcy0+cndzdGF0ZT1TU0xfV1JJVElORzsKKwkJCWlmIChCSU9fZmx1c2gocy0+d2JpbykgPD0gMCkKKwkJCQl7CisJCQkJcmV0PSAtMTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCQkJcy0+c3RhdGU9cy0+czMtPnRtcC5uZXh0X3N0YXRlOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NSX0NFUlRfQToKKwkJY2FzZSBTU0wzX1NUX1NSX0NFUlRfQjoKKwkJCS8qIENoZWNrIGZvciBzZWNvbmQgY2xpZW50IGhlbGxvIChNUyBTR0MpICovCisJCQlyZXQgPSBzc2wzX2NoZWNrX2NsaWVudF9oZWxsbyhzKTsKKwkJCWlmIChyZXQgPD0gMCkKKwkJCQlnb3RvIGVuZDsKKwkJCWR0bHMxX3N0b3BfdGltZXIocyk7CisJCQlpZiAocmV0ID09IDIpCisJCQkJcy0+c3RhdGUgPSBTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQzsKKwkJCWVsc2UgeworCQkJCS8qIGNvdWxkIGJlIHNlbnQgZm9yIGEgREggY2VydCwgZXZlbiBpZiB3ZQorCQkJCSAqIGhhdmUgbm90IGFza2VkIGZvciBpdCA6LSkgKi8KKwkJCQlyZXQ9c3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlKHMpOworCQkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQkJZHRsczFfc3RvcF90aW1lcihzKTsKKwkJCQlzLT5pbml0X251bT0wOworCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1JfS0VZX0VYQ0hfQTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TUl9LRVlfRVhDSF9BOgorCQljYXNlIFNTTDNfU1RfU1JfS0VZX0VYQ0hfQjoKKwkJCXJldD1zc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCWR0bHMxX3N0b3BfdGltZXIocyk7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX1NSX0NFUlRfVlJGWV9BOworCQkJcy0+aW5pdF9udW09MDsKKworCQkJaWYgKHJldCA9PSAyKQorCQkJCXsKKwkJCQkvKiBGb3IgdGhlIEVDREggY2lwaGVyc3VpdGVzIHdoZW4KKwkJCQkgKiB0aGUgY2xpZW50IHNlbmRzIGl0cyBFQ0RIIHB1YiBrZXkgaW4KKwkJCQkgKiBhIGNlcnRpZmljYXRlLCB0aGUgQ2VydGlmaWNhdGVWZXJpZnkKKwkJCQkgKiBtZXNzYWdlIGlzIG5vdCBzZW50LgorCQkJCSAqLworCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1JfRklOSVNIRURfQTsKKwkJCQlzLT5pbml0X251bSA9IDA7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NSX0NFUlRfVlJGWV9BOworCQkJCXMtPmluaXRfbnVtPTA7CisKKwkJCQkvKiBXZSBuZWVkIHRvIGdldCBoYXNoZXMgaGVyZSBzbyBpZiB0aGVyZSBpcworCQkJCSAqIGEgY2xpZW50IGNlcnQsIGl0IGNhbiBiZSB2ZXJpZmllZCAqLyAKKwkJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5jZXJ0X3ZlcmlmeV9tYWMocywKKwkJCQkJTklEX21kNSwKKwkJCQkJJihzLT5zMy0+dG1wLmNlcnRfdmVyaWZ5X21kWzBdKSk7CisJCQkJcy0+bWV0aG9kLT5zc2wzX2VuYy0+Y2VydF92ZXJpZnlfbWFjKHMsCisJCQkJCU5JRF9zaGExLAorCQkJCQkmKHMtPnMzLT50bXAuY2VydF92ZXJpZnlfbWRbTUQ1X0RJR0VTVF9MRU5HVEhdKSk7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NSX0NFUlRfVlJGWV9BOgorCQljYXNlIFNTTDNfU1RfU1JfQ0VSVF9WUkZZX0I6CisKKwkJCXMtPmQxLT5jaGFuZ2VfY2lwaGVyX3NwZWNfb2sgPSAxOworCQkJLyogd2Ugc2hvdWxkIGRlY2lkZSBpZiB3ZSBleHBlY3RlZCB0aGlzIG9uZSAqLworCQkJcmV0PXNzbDNfZ2V0X2NlcnRfdmVyaWZ5KHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCWR0bHMxX3N0b3BfdGltZXIocyk7CisKKwkJCXMtPnN0YXRlPVNTTDNfU1RfU1JfRklOSVNIRURfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfU1JfRklOSVNIRURfQToKKwkJY2FzZSBTU0wzX1NUX1NSX0ZJTklTSEVEX0I6CisJCQlzLT5kMS0+Y2hhbmdlX2NpcGhlcl9zcGVjX29rID0gMTsKKwkJCXJldD1zc2wzX2dldF9maW5pc2hlZChzLFNTTDNfU1RfU1JfRklOSVNIRURfQSwKKwkJCQlTU0wzX1NUX1NSX0ZJTklTSEVEX0IpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCWR0bHMxX3N0b3BfdGltZXIocyk7CisJCQlpZiAocy0+aGl0KQorCQkJCXMtPnN0YXRlPVNTTF9TVF9PSzsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJCWVsc2UgaWYgKHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQpCisJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19TRVNTSU9OX1RJQ0tFVF9BOworI2VuZGlmCisJCQllbHNlCisJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19DSEFOR0VfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQljYXNlIFNTTDNfU1RfU1dfU0VTU0lPTl9USUNLRVRfQToKKwkJY2FzZSBTU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0I6CisJCQlyZXQ9ZHRsczFfc2VuZF9uZXdzZXNzaW9uX3RpY2tldChzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX0NIQU5HRV9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19DRVJUX1NUQVRVU19BOgorCQljYXNlIFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQjoKKwkJCXJldD1zc2wzX3NlbmRfY2VydF9zdGF0dXMocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19LRVlfRVhDSF9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisjZW5kaWYKKworCQljYXNlIFNTTDNfU1RfU1dfQ0hBTkdFX0E6CisJCWNhc2UgU1NMM19TVF9TV19DSEFOR0VfQjoKKworCQkJcy0+c2Vzc2lvbi0+Y2lwaGVyPXMtPnMzLT50bXAubmV3X2NpcGhlcjsKKwkJCWlmICghcy0+bWV0aG9kLT5zc2wzX2VuYy0+c2V0dXBfa2V5X2Jsb2NrKHMpKQorCQkJCXsgcmV0PSAtMTsgZ290byBlbmQ7IH0KKworCQkJcmV0PWR0bHMxX3NlbmRfY2hhbmdlX2NpcGhlcl9zcGVjKHMsCisJCQkJU1NMM19TVF9TV19DSEFOR0VfQSxTU0wzX1NUX1NXX0NIQU5HRV9CKTsKKworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfRklOSVNIRURfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisKKwkJCWlmICghcy0+bWV0aG9kLT5zc2wzX2VuYy0+Y2hhbmdlX2NpcGhlcl9zdGF0ZShzLAorCQkJCVNTTDNfQ0hBTkdFX0NJUEhFUl9TRVJWRVJfV1JJVEUpKQorCQkJCXsKKwkJCQlyZXQ9IC0xOworCQkJCWdvdG8gZW5kOworCQkJCX0KKworCQkJZHRsczFfcmVzZXRfc2VxX251bWJlcnMocywgU1NMM19DQ19XUklURSk7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfU1dfRklOSVNIRURfQToKKwkJY2FzZSBTU0wzX1NUX1NXX0ZJTklTSEVEX0I6CisJCQlyZXQ9ZHRsczFfc2VuZF9maW5pc2hlZChzLAorCQkJCVNTTDNfU1RfU1dfRklOSVNIRURfQSxTU0wzX1NUX1NXX0ZJTklTSEVEX0IsCisJCQkJcy0+bWV0aG9kLT5zc2wzX2VuYy0+c2VydmVyX2ZpbmlzaGVkX2xhYmVsLAorCQkJCXMtPm1ldGhvZC0+c3NsM19lbmMtPnNlcnZlcl9maW5pc2hlZF9sYWJlbF9sZW4pOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfRkxVU0g7CisJCQlpZiAocy0+aGl0KQorCQkJCXMtPnMzLT50bXAubmV4dF9zdGF0ZT1TU0wzX1NUX1NSX0ZJTklTSEVEX0E7CisJCQllbHNlCisJCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTF9TVF9PSzsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTF9TVF9PSzoKKwkJCS8qIGNsZWFuIGEgZmV3IHRoaW5ncyB1cCAqLworCQkJc3NsM19jbGVhbnVwX2tleV9ibG9jayhzKTsKKworI2lmIDAKKwkJCUJVRl9NRU1fZnJlZShzLT5pbml0X2J1Zik7CisJCQlzLT5pbml0X2J1Zj1OVUxMOworI2VuZGlmCisKKwkJCS8qIHJlbW92ZSBidWZmZXJpbmcgb24gb3V0cHV0ICovCisJCQlzc2xfZnJlZV93YmlvX2J1ZmZlcihzKTsKKworCQkJcy0+aW5pdF9udW09MDsKKworCQkJaWYgKHMtPm5ld19zZXNzaW9uID09IDIpIC8qIHNraXBwZWQgaWYgd2UganVzdCBzZW50IGEgSGVsbG9SZXF1ZXN0ICovCisJCQkJeworCQkJCS8qIGFjdHVhbGx5IG5vdCBuZWNlc3NhcmlseSBhICduZXcnIHNlc3Npb24gdW5sZXNzCisJCQkJICogU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OIGlzIHNldCAqLworCQkJCQorCQkJCXMtPm5ld19zZXNzaW9uPTA7CisJCQkJCisJCQkJc3NsX3VwZGF0ZV9jYWNoZShzLFNTTF9TRVNTX0NBQ0hFX1NFUlZFUik7CisJCQkJCisJCQkJcy0+Y3R4LT5zdGF0cy5zZXNzX2FjY2VwdF9nb29kKys7CisJCQkJLyogcy0+c2VydmVyPTE7ICovCisJCQkJcy0+aGFuZHNoYWtlX2Z1bmM9ZHRsczFfYWNjZXB0OworCisJCQkJaWYgKGNiICE9IE5VTEwpIGNiKHMsU1NMX0NCX0hBTkRTSEFLRV9ET05FLDEpOworCQkJCX0KKwkJCQorCQkJcmV0ID0gMTsKKworCQkJLyogZG9uZSBoYW5kc2hha2luZywgbmV4dCBtZXNzYWdlIGlzIGNsaWVudCBoZWxsbyAqLworCQkJcy0+ZDEtPmhhbmRzaGFrZV9yZWFkX3NlcSA9IDA7CisJCQkvKiBuZXh0IG1lc3NhZ2UgaXMgc2VydmVyIGhlbGxvICovCisJCQlzLT5kMS0+aGFuZHNoYWtlX3dyaXRlX3NlcSA9IDA7CisJCQlzLT5kMS0+bmV4dF9oYW5kc2hha2Vfd3JpdGVfc2VxID0gMDsKKwkJCWdvdG8gZW5kOworCQkJLyogYnJlYWs7ICovCisKKwkJZGVmYXVsdDoKKwkJCVNTTGVycihTU0xfRl9EVExTMV9BQ0NFUFQsU1NMX1JfVU5LTk9XTl9TVEFURSk7CisJCQlyZXQ9IC0xOworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKwkJCX0KKwkJCisJCWlmICghcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlICYmICFza2lwKQorCQkJeworCQkJaWYgKHMtPmRlYnVnKQorCQkJCXsKKwkJCQlpZiAoKHJldD1CSU9fZmx1c2gocy0+d2JpbykpIDw9IDApCisJCQkJCWdvdG8gZW5kOworCQkJCX0KKworCisJCQlpZiAoKGNiICE9IE5VTEwpICYmIChzLT5zdGF0ZSAhPSBzdGF0ZSkpCisJCQkJeworCQkJCW5ld19zdGF0ZT1zLT5zdGF0ZTsKKwkJCQlzLT5zdGF0ZT1zdGF0ZTsKKwkJCQljYihzLFNTTF9DQl9BQ0NFUFRfTE9PUCwxKTsKKwkJCQlzLT5zdGF0ZT1uZXdfc3RhdGU7CisJCQkJfQorCQkJfQorCQlza2lwPTA7CisJCX0KK2VuZDoKKwkvKiBCSU9fZmx1c2gocy0+d2Jpbyk7ICovCisKKwlzLT5pbl9oYW5kc2hha2UtLTsKKwlpZiAoY2IgIT0gTlVMTCkKKwkJY2IocyxTU0xfQ0JfQUNDRVBUX0VYSVQscmV0KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBkdGxzMV9zZW5kX2hlbGxvX3JlcXVlc3QoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfU1dfSEVMTE9fUkVRX0EpCisJCXsKKwkJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCQlwID0gZHRsczFfc2V0X21lc3NhZ2VfaGVhZGVyKHMsIHAsIFNTTDNfTVRfSEVMTE9fUkVRVUVTVCwgMCwgMCwgMCk7CisKKwkJcy0+c3RhdGU9U1NMM19TVF9TV19IRUxMT19SRVFfQjsKKwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCXMtPmluaXRfbnVtPURUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisJCXMtPmluaXRfb2ZmPTA7CisKKwkJLyogbm8gbmVlZCB0byBidWZmZXIgdGhpcyBtZXNzYWdlLCBzaW5jZSB0aGVyZSBhcmUgbm8gcmV0cmFuc21pdCAKKwkJICogcmVxdWVzdHMgZm9yIGl0ICovCisJCX0KKworCS8qIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0IgKi8KKwlyZXR1cm4oZHRsczFfZG9fd3JpdGUocyxTU0wzX1JUX0hBTkRTSEFLRSkpOworCX0KKworaW50IGR0bHMxX3NlbmRfaGVsbG9fdmVyaWZ5X3JlcXVlc3QoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBpbnQgbXNnX2xlbjsKKwl1bnNpZ25lZCBjaGFyICptc2csICpidWYsICpwOworCisJaWYgKHMtPnN0YXRlID09IERUTFMxX1NUX1NXX0hFTExPX1ZFUklGWV9SRVFVRVNUX0EpCisJCXsKKwkJYnVmID0gKHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKworCQltc2cgPSBwID0gJihidWZbRFRMUzFfSE1fSEVBREVSX0xFTkdUSF0pOworCQkqKHArKykgPSBzLT52ZXJzaW9uID4+IDg7CisJCSoocCsrKSA9IHMtPnZlcnNpb24gJiAweEZGOworCisJCWlmIChzLT5jdHgtPmFwcF9nZW5fY29va2llX2NiID09IE5VTEwgfHwKKwkJICAgICBzLT5jdHgtPmFwcF9nZW5fY29va2llX2NiKHMsIHMtPmQxLT5jb29raWUsCisJCQkgJihzLT5kMS0+Y29va2llX2xlbikpID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9IRUxMT19WRVJJRllfUkVRVUVTVCxFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkqKHArKykgPSAodW5zaWduZWQgY2hhcikgcy0+ZDEtPmNvb2tpZV9sZW47CisJCW1lbWNweShwLCBzLT5kMS0+Y29va2llLCBzLT5kMS0+Y29va2llX2xlbik7CisJCXAgKz0gcy0+ZDEtPmNvb2tpZV9sZW47CisJCW1zZ19sZW4gPSBwIC0gbXNnOworCisJCWR0bHMxX3NldF9tZXNzYWdlX2hlYWRlcihzLCBidWYsCisJCQlEVExTMV9NVF9IRUxMT19WRVJJRllfUkVRVUVTVCwgbXNnX2xlbiwgMCwgbXNnX2xlbik7CisKKwkJcy0+c3RhdGU9RFRMUzFfU1RfU1dfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQjsKKwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCXMtPmluaXRfbnVtPXAtYnVmOworCQlzLT5pbml0X29mZj0wOworCisJCS8qIGJ1ZmZlciB0aGUgbWVzc2FnZSB0byBoYW5kbGUgcmUteG1pdHMgKi8KKwkJZHRsczFfYnVmZmVyX21lc3NhZ2UocywgMCk7CisJCX0KKworCS8qIHMtPnN0YXRlID0gRFRMUzFfU1RfU1dfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQiAqLworCXJldHVybihkdGxzMV9kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorCitpbnQgZHRsczFfc2VuZF9zZXJ2ZXJfaGVsbG8oU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgY2hhciAqcCwqZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgc2w7CisJdW5zaWduZWQgbG9uZyBsLFRpbWU7CisKKwlpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9TV19TUlZSX0hFTExPX0EpCisJCXsKKwkJYnVmPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCXA9cy0+czMtPnNlcnZlcl9yYW5kb207CisJCVRpbWU9KHVuc2lnbmVkIGxvbmcpdGltZShOVUxMKTsJCQkvKiBUaW1lICovCisJCWwybihUaW1lLHApOworCQlSQU5EX3BzZXVkb19ieXRlcyhwLFNTTDNfUkFORE9NX1NJWkUtc2l6ZW9mKFRpbWUpKTsKKwkJLyogRG8gdGhlIG1lc3NhZ2UgdHlwZSBhbmQgbGVuZ3RoIGxhc3QgKi8KKwkJZD1wPSAmKGJ1ZltEVExTMV9ITV9IRUFERVJfTEVOR1RIXSk7CisKKwkJKihwKyspPXMtPnZlcnNpb24+Pjg7CisJCSoocCsrKT1zLT52ZXJzaW9uJjB4ZmY7CisKKwkJLyogUmFuZG9tIHN0dWZmICovCisJCW1lbWNweShwLHMtPnMzLT5zZXJ2ZXJfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUpOworCQlwKz1TU0wzX1JBTkRPTV9TSVpFOworCisJCS8qIG5vdyBpbiB0aGVvcnkgd2UgaGF2ZSAzIG9wdGlvbnMgdG8gc2VuZGluZyBiYWNrIHRoZQorCQkgKiBzZXNzaW9uIGlkLiAgSWYgaXQgaXMgYSByZS11c2UsIHdlIHNlbmQgYmFjayB0aGUKKwkJICogb2xkIHNlc3Npb24taWQsIGlmIGl0IGlzIGEgbmV3IHNlc3Npb24sIHdlIHNlbmQKKwkJICogYmFjayB0aGUgbmV3IHNlc3Npb24taWQgb3Igd2Ugc2VuZCBiYWNrIGEgMCBsZW5ndGgKKwkJICogc2Vzc2lvbi1pZCBpZiB3ZSB3YW50IGl0IHRvIGJlIHNpbmdsZSB1c2UuCisJCSAqIEN1cnJlbnRseSBJIHdpbGwgbm90IGltcGxlbWVudCB0aGUgJzAnIGxlbmd0aCBzZXNzaW9uLWlkCisJCSAqIDEyLUphbi05OCAtIEknbGwgbm93IHN1cHBvcnQgdGhlICcwJyBsZW5ndGggc3R1ZmYuCisJCSAqLworCQlpZiAoIShzLT5jdHgtPnNlc3Npb25fY2FjaGVfbW9kZSAmIFNTTF9TRVNTX0NBQ0hFX1NFUlZFUikpCisJCQlzLT5zZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aD0wOworCisJCXNsPXMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoOworCQlpZiAoc2wgPiBzaXplb2Ygcy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9IRUxMTywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQkqKHArKyk9c2w7CisJCW1lbWNweShwLHMtPnNlc3Npb24tPnNlc3Npb25faWQsc2wpOworCQlwKz1zbDsKKworCQkvKiBwdXQgdGhlIGNpcGhlciAqLworCQlpZiAocy0+czMtPnRtcC5uZXdfY2lwaGVyID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWk9c3NsM19wdXRfY2lwaGVyX2J5X2NoYXIocy0+czMtPnRtcC5uZXdfY2lwaGVyLHApOworCQlwKz1pOworCisJCS8qIHB1dCB0aGUgY29tcHJlc3Npb24gbWV0aG9kICovCisjaWZkZWYgT1BFTlNTTF9OT19DT01QCisJCSoocCsrKT0wOworI2Vsc2UKKwkJaWYgKHMtPnMzLT50bXAubmV3X2NvbXByZXNzaW9uID09IE5VTEwpCisJCQkqKHArKyk9MDsKKwkJZWxzZQorCQkJKihwKyspPXMtPnMzLT50bXAubmV3X2NvbXByZXNzaW9uLT5pZDsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWlmICgocCA9IHNzbF9hZGRfc2VydmVyaGVsbG9fdGxzZXh0KHMsIHAsIGJ1ZitTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpKSA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0hFTExPLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKyNlbmRpZgorCisJCS8qIGRvIHRoZSBoZWFkZXIgKi8KKwkJbD0ocC1kKTsKKwkJZD1idWY7CisKKwkJZCA9IGR0bHMxX3NldF9tZXNzYWdlX2hlYWRlcihzLCBkLCBTU0wzX01UX1NFUlZFUl9IRUxMTywgbCwgMCwgbCk7CisKKwkJcy0+c3RhdGU9U1NMM19TVF9TV19TUlZSX0hFTExPX0I7CisJCS8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLworCQlzLT5pbml0X251bT1wLWJ1ZjsKKwkJcy0+aW5pdF9vZmY9MDsKKworCQkvKiBidWZmZXIgdGhlIG1lc3NhZ2UgdG8gaGFuZGxlIHJlLXhtaXRzICovCisJCWR0bHMxX2J1ZmZlcl9tZXNzYWdlKHMsIDApOworCQl9CisKKwkvKiBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQiAqLworCXJldHVybihkdGxzMV9kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorCitpbnQgZHRsczFfc2VuZF9zZXJ2ZXJfZG9uZShTU0wgKnMpCisJeworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9TV19TUlZSX0RPTkVfQSkKKwkJeworCQlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisKKwkJLyogZG8gdGhlIGhlYWRlciAqLworCQlwID0gZHRsczFfc2V0X21lc3NhZ2VfaGVhZGVyKHMsIHAsIFNTTDNfTVRfU0VSVkVSX0RPTkUsIDAsIDAsIDApOworCisJCXMtPnN0YXRlPVNTTDNfU1RfU1dfU1JWUl9ET05FX0I7CisJCS8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLworCQlzLT5pbml0X251bT1EVExTMV9ITV9IRUFERVJfTEVOR1RIOworCQlzLT5pbml0X29mZj0wOworCisJCS8qIGJ1ZmZlciB0aGUgbWVzc2FnZSB0byBoYW5kbGUgcmUteG1pdHMgKi8KKwkJZHRsczFfYnVmZmVyX21lc3NhZ2UocywgMCk7CisJCX0KKworCS8qIFNTTDNfU1RfU1dfU1JWUl9ET05FX0IgKi8KKwlyZXR1cm4oZHRsczFfZG9fd3JpdGUocyxTU0wzX1JUX0hBTkRTSEFLRSkpOworCX0KKworaW50IGR0bHMxX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZShTU0wgKnMpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXVuc2lnbmVkIGNoYXIgKnE7CisJaW50IGosbnVtOworCVJTQSAqcnNhOworCXVuc2lnbmVkIGNoYXIgbWRfYnVmW01ENV9ESUdFU1RfTEVOR1RIK1NIQV9ESUdFU1RfTEVOR1RIXTsKKwl1bnNpZ25lZCBpbnQgdTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJREggKmRoPU5VTEwsKmRocDsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlFQ19LRVkgKmVjZGg9TlVMTCwgKmVjZGhwOworCXVuc2lnbmVkIGNoYXIgKmVuY29kZWRQb2ludCA9IE5VTEw7CisJaW50IGVuY29kZWRsZW4gPSAwOworCWludCBjdXJ2ZV9pZCA9IDA7CisJQk5fQ1RYICpibl9jdHggPSBOVUxMOyAKKyNlbmRpZgorCUVWUF9QS0VZICpwa2V5OworCXVuc2lnbmVkIGNoYXIgKnAsKmQ7CisJaW50IGFsLGk7CisJdW5zaWduZWQgbG9uZyB0eXBlOworCWludCBuOworCUNFUlQgKmNlcnQ7CisJQklHTlVNICpyWzRdOworCWludCBucls0XSxrbjsKKwlCVUZfTUVNICpidWY7CisJRVZQX01EX0NUWCBtZF9jdHg7CisKKwlFVlBfTURfQ1RYX2luaXQoJm1kX2N0eCk7CisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfU1dfS0VZX0VYQ0hfQSkKKwkJeworCQl0eXBlPXMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX21rZXk7CisJCWNlcnQ9cy0+Y2VydDsKKworCQlidWY9cy0+aW5pdF9idWY7CisKKwkJclswXT1yWzFdPXJbMl09clszXT1OVUxMOworCQluPTA7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCWlmICh0eXBlICYgU1NMX2tSU0EpCisJCQl7CisJCQlyc2E9Y2VydC0+cnNhX3RtcDsKKwkJCWlmICgocnNhID09IE5VTEwpICYmIChzLT5jZXJ0LT5yc2FfdG1wX2NiICE9IE5VTEwpKQorCQkJCXsKKwkJCQlyc2E9cy0+Y2VydC0+cnNhX3RtcF9jYihzLAorCQkJCSAgICAgIFNTTF9DX0lTX0VYUE9SVChzLT5zMy0+dG1wLm5ld19jaXBoZXIpLAorCQkJCSAgICAgIFNTTF9DX0VYUE9SVF9QS0VZTEVOR1RIKHMtPnMzLT50bXAubmV3X2NpcGhlcikpOworCQkJCWlmKHJzYSA9PSBOVUxMKQorCQkJCXsKKwkJCQkJYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLFNTTF9SX0VSUk9SX0dFTkVSQVRJTkdfVE1QX1JTQV9LRVkpOworCQkJCQlnb3RvIGZfZXJyOworCQkJCX0KKwkJCQlSU0FfdXBfcmVmKHJzYSk7CisJCQkJY2VydC0+cnNhX3RtcD1yc2E7CisJCQkJfQorCQkJaWYgKHJzYSA9PSBOVUxMKQorCQkJCXsKKwkJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxTU0xfUl9NSVNTSU5HX1RNUF9SU0FfS0VZKTsKKwkJCQlnb3RvIGZfZXJyOworCQkJCX0KKwkJCXJbMF09cnNhLT5uOworCQkJclsxXT1yc2EtPmU7CisJCQlzLT5zMy0+dG1wLnVzZV9yc2FfdG1wPTE7CisJCQl9CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCQlpZiAodHlwZSAmIFNTTF9rRURIKQorCQkJeworCQkJZGhwPWNlcnQtPmRoX3RtcDsKKwkJCWlmICgoZGhwID09IE5VTEwpICYmIChzLT5jZXJ0LT5kaF90bXBfY2IgIT0gTlVMTCkpCisJCQkJZGhwPXMtPmNlcnQtPmRoX3RtcF9jYihzLAorCQkJCSAgICAgIFNTTF9DX0lTX0VYUE9SVChzLT5zMy0+dG1wLm5ld19jaXBoZXIpLAorCQkJCSAgICAgIFNTTF9DX0VYUE9SVF9QS0VZTEVOR1RIKHMtPnMzLT50bXAubmV3X2NpcGhlcikpOworCQkJaWYgKGRocCA9PSBOVUxMKQorCQkJCXsKKwkJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxTU0xfUl9NSVNTSU5HX1RNUF9ESF9LRVkpOworCQkJCWdvdG8gZl9lcnI7CisJCQkJfQorCisJCQlpZiAocy0+czMtPnRtcC5kaCAhPSBOVUxMKQorCQkJCXsKKwkJCQlESF9mcmVlKGRoKTsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQlpZiAoKGRoPURIcGFyYW1zX2R1cChkaHApKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLEVSUl9SX0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQlzLT5zMy0+dG1wLmRoPWRoOworCQkJaWYgKChkaHAtPnB1Yl9rZXkgPT0gTlVMTCB8fAorCQkJICAgICBkaHAtPnByaXZfa2V5ID09IE5VTEwgfHwKKwkJCSAgICAgKHMtPm9wdGlvbnMgJiBTU0xfT1BfU0lOR0xFX0RIX1VTRSkpKQorCQkJCXsKKwkJCQlpZighREhfZ2VuZXJhdGVfa2V5KGRoKSkKKwkJCQkgICAgeworCQkJCSAgICBTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLAorCQkJCQkgICBFUlJfUl9ESF9MSUIpOworCQkJCSAgICBnb3RvIGVycjsKKwkJCQkgICAgfQorCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJZGgtPnB1Yl9rZXk9Qk5fZHVwKGRocC0+cHViX2tleSk7CisJCQkJZGgtPnByaXZfa2V5PUJOX2R1cChkaHAtPnByaXZfa2V5KTsKKwkJCQlpZiAoKGRoLT5wdWJfa2V5ID09IE5VTEwpIHx8CisJCQkJCShkaC0+cHJpdl9rZXkgPT0gTlVMTCkpCisJCQkJCXsKKwkJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfUl9ESF9MSUIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCXJbMF09ZGgtPnA7CisJCQlyWzFdPWRoLT5nOworCQkJclsyXT1kaC0+cHViX2tleTsKKwkJCX0KKwkJZWxzZSAKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJCWlmICh0eXBlICYgU1NMX2tFRUNESCkKKwkJCXsKKwkJCWNvbnN0IEVDX0dST1VQICpncm91cDsKKworCQkJZWNkaHA9Y2VydC0+ZWNkaF90bXA7CisJCQlpZiAoKGVjZGhwID09IE5VTEwpICYmIChzLT5jZXJ0LT5lY2RoX3RtcF9jYiAhPSBOVUxMKSkKKwkJCQl7CisJCQkJZWNkaHA9cy0+Y2VydC0+ZWNkaF90bXBfY2IocywKKwkJCQkgICAgICBTU0xfQ19JU19FWFBPUlQocy0+czMtPnRtcC5uZXdfY2lwaGVyKSwKKwkJCQkgICAgICBTU0xfQ19FWFBPUlRfUEtFWUxFTkdUSChzLT5zMy0+dG1wLm5ld19jaXBoZXIpKTsKKwkJCQl9CisJCQlpZiAoZWNkaHAgPT0gTlVMTCkKKwkJCQl7CisJCQkJYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsU1NMX1JfTUlTU0lOR19UTVBfRUNESF9LRVkpOworCQkJCWdvdG8gZl9lcnI7CisJCQkJfQorCisJCQlpZiAocy0+czMtPnRtcC5lY2RoICE9IE5VTEwpCisJCQkJeworCQkJCUVDX0tFWV9mcmVlKHMtPnMzLT50bXAuZWNkaCk7IAorCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCS8qIER1cGxpY2F0ZSB0aGUgRUNESCBzdHJ1Y3R1cmUuICovCisJCQlpZiAoZWNkaHAgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfUl9FQ0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaWYgKCFFQ19LRVlfdXBfcmVmKGVjZGhwKSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfUl9FQ0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJZWNkaCA9IGVjZGhwOworCisJCQlzLT5zMy0+dG1wLmVjZGg9ZWNkaDsKKwkJCWlmICgoRUNfS0VZX2dldDBfcHVibGljX2tleShlY2RoKSA9PSBOVUxMKSB8fAorCQkJICAgIChFQ19LRVlfZ2V0MF9wcml2YXRlX2tleShlY2RoKSA9PSBOVUxMKSB8fAorCQkJICAgIChzLT5vcHRpb25zICYgU1NMX09QX1NJTkdMRV9FQ0RIX1VTRSkpCisJCQkJeworCQkJCWlmKCFFQ19LRVlfZ2VuZXJhdGVfa2V5KGVjZGgpKQorCQkJCSAgICB7CisJCQkJICAgIFNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsRVJSX1JfRUNESF9MSUIpOworCQkJCSAgICBnb3RvIGVycjsKKwkJCQkgICAgfQorCQkJCX0KKworCQkJaWYgKCgoZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChlY2RoKSkgPT0gTlVMTCkgfHwKKwkJCSAgICAoRUNfS0VZX2dldDBfcHVibGljX2tleShlY2RoKSAgPT0gTlVMTCkgfHwKKwkJCSAgICAoRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkoZWNkaCkgPT0gTlVMTCkpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsRVJSX1JfRUNESF9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJaWYgKFNTTF9DX0lTX0VYUE9SVChzLT5zMy0+dG1wLm5ld19jaXBoZXIpICYmCisJCQkgICAgKEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApID4gMTYzKSkgCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsU1NMX1JfRUNHUk9VUF9UT09fTEFSR0VfRk9SX0NJUEhFUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiBYWFg6IEZvciBub3csIHdlIG9ubHkgc3VwcG9ydCBlcGhlbWVyYWwgRUNESAorCQkJICoga2V5cyBvdmVyIG5hbWVkIChub3QgZ2VuZXJpYykgY3VydmVzLiBGb3IgCisJCQkgKiBzdXBwb3J0ZWQgbmFtZWQgY3VydmVzLCBjdXJ2ZV9pZCBpcyBub24temVyby4KKwkJCSAqLworCQkJaWYgKChjdXJ2ZV9pZCA9IAorCQkJICAgIHRsczFfZWNfbmlkMmN1cnZlX2lkKEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKGdyb3VwKSkpCisJCQkgICAgPT0gMCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxTU0xfUl9VTlNVUFBPUlRFRF9FTExJUFRJQ19DVVJWRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiBFbmNvZGUgdGhlIHB1YmxpYyBrZXkuCisJCQkgKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSBvZiBlbmNvZGluZyBhbmQKKwkJCSAqIGFsbG9jYXRlIG1lbW9yeSBhY2NvcmRpbmdseS4KKwkJCSAqLworCQkJZW5jb2RlZGxlbiA9IEVDX1BPSU5UX3BvaW50Mm9jdChncm91cCwgCisJCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShlY2RoKSwKKwkJCSAgICBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCwgCisJCQkgICAgTlVMTCwgMCwgTlVMTCk7CisKKwkJCWVuY29kZWRQb2ludCA9ICh1bnNpZ25lZCBjaGFyICopIAorCQkJICAgIE9QRU5TU0xfbWFsbG9jKGVuY29kZWRsZW4qc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsgCisJCQlibl9jdHggPSBCTl9DVFhfbmV3KCk7CisJCQlpZiAoKGVuY29kZWRQb2ludCA9PSBOVUxMKSB8fCAoYm5fY3R4ID09IE5VTEwpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKworCQkJZW5jb2RlZGxlbiA9IEVDX1BPSU5UX3BvaW50Mm9jdChncm91cCwgCisJCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShlY2RoKSwgCisJCQkgICAgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQsIAorCQkJICAgIGVuY29kZWRQb2ludCwgZW5jb2RlZGxlbiwgYm5fY3R4KTsKKworCQkJaWYgKGVuY29kZWRsZW4gPT0gMCkgCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsRVJSX1JfRUNESF9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJQk5fQ1RYX2ZyZWUoYm5fY3R4KTsgIGJuX2N0eD1OVUxMOworCisJCQkvKiBYWFg6IEZvciBub3csIHdlIG9ubHkgc3VwcG9ydCBuYW1lZCAobm90IAorCQkJICogZ2VuZXJpYykgY3VydmVzIGluIEVDREggZXBoZW1lcmFsIGtleSBleGNoYW5nZXMuCisJCQkgKiBJbiB0aGlzIHNpdHVhdGlvbiwgd2UgbmVlZCBmb3VyIGFkZGl0aW9uYWwgYnl0ZXMKKwkJCSAqIHRvIGVuY29kZSB0aGUgZW50aXJlIFNlcnZlckVDREhQYXJhbXMKKwkJCSAqIHN0cnVjdHVyZS4gCisJCQkgKi8KKwkJCW4gPSA0ICsgZW5jb2RlZGxlbjsKKworCQkJLyogV2UnbGwgZ2VuZXJhdGUgdGhlIHNlcnZlcktleUV4Y2hhbmdlIG1lc3NhZ2UKKwkJCSAqIGV4cGxpY2l0bHkgc28gd2UgY2FuIHNldCB0aGVzZSB0byBOVUxMcworCQkJICovCisJCQlyWzBdPU5VTEw7CisJCQlyWzFdPU5VTEw7CisJCQlyWzJdPU5VTEw7CisJCQlyWzNdPU5VTEw7CisJCQl9CisJCWVsc2UgCisjZW5kaWYgLyogIU9QRU5TU0xfTk9fRUNESCAqLworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCQkJaWYgKHR5cGUgJiBTU0xfa1BTSykKKwkJCQl7CisJCQkJLyogcmVzZXJ2ZSBzaXplIGZvciByZWNvcmQgbGVuZ3RoIGFuZCBQU0sgaWRlbnRpdHkgaGludCovCisJCQkJbis9MitzdHJsZW4ocy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCk7CisJCQkJfQorCQkJZWxzZQorI2VuZGlmIC8qICFPUEVOU1NMX05PX1BTSyAqLworCQkJeworCQkJYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxTU0xfUl9VTktOT1dOX0tFWV9FWENIQU5HRV9UWVBFKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCWZvciAoaT0wOyByW2ldICE9IE5VTEw7IGkrKykKKwkJCXsKKwkJCW5yW2ldPUJOX251bV9ieXRlcyhyW2ldKTsKKwkJCW4rPTIrbnJbaV07CisJCQl9CisKKwkJaWYgKCEocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aCAmIFNTTF9hTlVMTCkKKwkJCSYmICEocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleSAmIFNTTF9rUFNLKSkKKwkJCXsKKwkJCWlmICgocGtleT1zc2xfZ2V0X3NpZ25fcGtleShzLHMtPnMzLT50bXAubmV3X2NpcGhlcikpCisJCQkJPT0gTlVMTCkKKwkJCQl7CisJCQkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQlnb3RvIGZfZXJyOworCQkJCX0KKwkJCWtuPUVWUF9QS0VZX3NpemUocGtleSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXBrZXk9TlVMTDsKKwkJCWtuPTA7CisJCQl9CisKKwkJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLG4rRFRMUzFfSE1fSEVBREVSX0xFTkdUSCtrbikpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfRFRMUzFfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLEVSUl9MSUJfQlVGKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlkPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCXA9ICYoZFtEVExTMV9ITV9IRUFERVJfTEVOR1RIXSk7CisKKwkJZm9yIChpPTA7IHJbaV0gIT0gTlVMTDsgaSsrKQorCQkJeworCQkJczJuKG5yW2ldLHApOworCQkJQk5fYm4yYmluKHJbaV0scCk7CisJCQlwKz1ucltpXTsKKwkJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJaWYgKHR5cGUgJiBTU0xfa0VFQ0RIKSAKKwkJCXsKKwkJCS8qIFhYWDogRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IG5hbWVkIChub3QgZ2VuZXJpYykgY3VydmVzLgorCQkJICogSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBzZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlIGhhczoKKwkJCSAqIFsxIGJ5dGUgQ3VydmVUeXBlXSwgWzIgYnl0ZSBDdXJ2ZU5hbWVdCisJCQkgKiBbMSBieXRlIGxlbmd0aCBvZiBlbmNvZGVkIHBvaW50XSwgZm9sbG93ZWQgYnkKKwkJCSAqIHRoZSBhY3R1YWwgZW5jb2RlZCBwb2ludCBpdHNlbGYKKwkJCSAqLworCQkJKnAgPSBOQU1FRF9DVVJWRV9UWVBFOworCQkJcCArPSAxOworCQkJKnAgPSAwOworCQkJcCArPSAxOworCQkJKnAgPSBjdXJ2ZV9pZDsKKwkJCXAgKz0gMTsKKwkJCSpwID0gZW5jb2RlZGxlbjsKKwkJCXAgKz0gMTsKKwkJCW1lbWNweSgodW5zaWduZWQgY2hhciopcCwgCisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKillbmNvZGVkUG9pbnQsIAorCQkJICAgIGVuY29kZWRsZW4pOworCQkJT1BFTlNTTF9mcmVlKGVuY29kZWRQb2ludCk7CisJCQlwICs9IGVuY29kZWRsZW47CisJCQl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCQlpZiAodHlwZSAmIFNTTF9rUFNLKQorCQkJeworCQkJLyogY29weSBQU0sgaWRlbnRpdHkgaGludCAqLworCQkJczJuKHN0cmxlbihzLT5jdHgtPnBza19pZGVudGl0eV9oaW50KSwgcCk7IAorCQkJc3RybmNweSgoY2hhciAqKXAsIHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQsIHN0cmxlbihzLT5jdHgtPnBza19pZGVudGl0eV9oaW50KSk7CisJCQlwKz1zdHJsZW4ocy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCk7CisJCQl9CisjZW5kaWYKKworCQkvKiBub3QgYW5vbnltb3VzICovCisJCWlmIChwa2V5ICE9IE5VTEwpCisJCQl7CisJCQkvKiBuIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhcmFtcywgdGhleSBzdGFydCBhdAorCQkJICogJihkW0RUTFMxX0hNX0hFQURFUl9MRU5HVEhdKSBhbmQgcCBwb2ludHMgdG8gdGhlIHNwYWNlCisJCQkgKiBhdCB0aGUgZW5kLiAqLworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQkJaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfUlNBKQorCQkJCXsKKwkJCQlxPW1kX2J1ZjsKKwkJCQlqPTA7CisJCQkJZm9yIChudW09MjsgbnVtID4gMDsgbnVtLS0pCisJCQkJCXsKKwkJCQkJRVZQX0RpZ2VzdEluaXRfZXgoJm1kX2N0eCwobnVtID09IDIpCisJCQkJCQk/cy0+Y3R4LT5tZDU6cy0+Y3R4LT5zaGExLCBOVUxMKTsKKwkJCQkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCYocy0+czMtPmNsaWVudF9yYW5kb21bMF0pLFNTTDNfUkFORE9NX1NJWkUpOworCQkJCQlFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsJihzLT5zMy0+c2VydmVyX3JhbmRvbVswXSksU1NMM19SQU5ET01fU0laRSk7CisJCQkJCUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwmKGRbRFRMUzFfSE1fSEVBREVSX0xFTkdUSF0pLG4pOworCQkJCQlFVlBfRGlnZXN0RmluYWxfZXgoJm1kX2N0eCxxLAorCQkJCQkJKHVuc2lnbmVkIGludCAqKSZpKTsKKwkJCQkJcSs9aTsKKwkJCQkJais9aTsKKwkJCQkJfQorCQkJCWlmIChSU0Ffc2lnbihOSURfbWQ1X3NoYTEsIG1kX2J1ZiwgaiwKKwkJCQkJJihwWzJdKSwgJnUsIHBrZXktPnBrZXkucnNhKSA8PSAwKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsRVJSX0xJQl9SU0EpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCXMybih1LHApOworCQkJCW4rPXUrMjsKKwkJCQl9CisJCQllbHNlCisjZW5kaWYKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0RTQSkKKwkJCQlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9EU0EpCisJCQkJeworCQkJCS8qIGxldHMgZG8gRFNTICovCisJCQkJRVZQX1NpZ25Jbml0X2V4KCZtZF9jdHgsRVZQX2RzczEoKSwgTlVMTCk7CisJCQkJRVZQX1NpZ25VcGRhdGUoJm1kX2N0eCwmKHMtPnMzLT5jbGllbnRfcmFuZG9tWzBdKSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJCQlFVlBfU2lnblVwZGF0ZSgmbWRfY3R4LCYocy0+czMtPnNlcnZlcl9yYW5kb21bMF0pLFNTTDNfUkFORE9NX1NJWkUpOworCQkJCUVWUF9TaWduVXBkYXRlKCZtZF9jdHgsJihkW0RUTFMxX0hNX0hFQURFUl9MRU5HVEhdKSxuKTsKKwkJCQlpZiAoIUVWUF9TaWduRmluYWwoJm1kX2N0eCwmKHBbMl0pLAorCQkJCQkodW5zaWduZWQgaW50ICopJmkscGtleSkpCisJCQkJCXsKKwkJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfTElCX0RTQSk7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJczJuKGkscCk7CisJCQkJbis9aSsyOworCQkJCX0KKwkJCWVsc2UKKyNlbmRpZgorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fRUNEU0EpCisJCQkJaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfRUMpCisJCQkJeworCQkJCS8qIGxldCdzIGRvIEVDRFNBICovCisJCQkJRVZQX1NpZ25Jbml0X2V4KCZtZF9jdHgsRVZQX2VjZHNhKCksIE5VTEwpOworCQkJCUVWUF9TaWduVXBkYXRlKCZtZF9jdHgsJihzLT5zMy0+Y2xpZW50X3JhbmRvbVswXSksU1NMM19SQU5ET01fU0laRSk7CisJCQkJRVZQX1NpZ25VcGRhdGUoJm1kX2N0eCwmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJCQlFVlBfU2lnblVwZGF0ZSgmbWRfY3R4LCYoZFs0XSksbik7CisJCQkJaWYgKCFFVlBfU2lnbkZpbmFsKCZtZF9jdHgsJihwWzJdKSwKKwkJCQkJKHVuc2lnbmVkIGludCAqKSZpLHBrZXkpKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsRVJSX0xJQl9FQ0RTQSk7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJczJuKGkscCk7CisJCQkJbis9aSsyOworCQkJCX0KKwkJCWVsc2UKKyNlbmRpZgorCQkJCXsKKwkJCQkvKiBJcyB0aGlzIGVycm9yIGNoZWNrIGFjdHVhbGx5IG5lZWRlZD8gKi8KKwkJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxTU0xfUl9VTktOT1dOX1BLRVlfVFlQRSk7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQl9CisKKwkJZCA9IGR0bHMxX3NldF9tZXNzYWdlX2hlYWRlcihzLCBkLAorCQkJU1NMM19NVF9TRVJWRVJfS0VZX0VYQ0hBTkdFLCBuLCAwLCBuKTsKKworCQkvKiB3ZSBzaG91bGQgbm93IGhhdmUgdGhpbmdzIHBhY2tlZCB1cCwgc28gbGV0cyBzZW5kCisJCSAqIGl0IG9mZiAqLworCQlzLT5pbml0X251bT1uK0RUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisJCXMtPmluaXRfb2ZmPTA7CisKKwkJLyogYnVmZmVyIHRoZSBtZXNzYWdlIHRvIGhhbmRsZSByZS14bWl0cyAqLworCQlkdGxzMV9idWZmZXJfbWVzc2FnZShzLCAwKTsKKwkJfQorCisJcy0+c3RhdGUgPSBTU0wzX1NUX1NXX0tFWV9FWENIX0I7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOworCXJldHVybihkdGxzMV9kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CitmX2VycjoKKwlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLGFsKTsKK2VycjoKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJaWYgKGVuY29kZWRQb2ludCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoZW5jb2RlZFBvaW50KTsKKwlCTl9DVFhfZnJlZShibl9jdHgpOworI2VuZGlmCisJRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOworCXJldHVybigtMSk7CisJfQorCitpbnQgZHRsczFfc2VuZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqcCwqZDsKKwlpbnQgaSxqLG5sLG9mZixuOworCVNUQUNLX09GKFg1MDlfTkFNRSkgKnNrPU5VTEw7CisJWDUwOV9OQU1FICpuYW1lOworCUJVRl9NRU0gKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgbXNnX2xlbjsKKworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX1NXX0NFUlRfUkVRX0EpCisJCXsKKwkJYnVmPXMtPmluaXRfYnVmOworCisJCWQ9cD0odW5zaWduZWQgY2hhciAqKSYoYnVmLT5kYXRhW0RUTFMxX0hNX0hFQURFUl9MRU5HVEhdKTsKKworCQkvKiBnZXQgdGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBjZXJ0IHR5cGVzICovCisJCXArKzsKKwkJbj1zc2wzX2dldF9yZXFfY2VydF90eXBlKHMscCk7CisJCWRbMF09bjsKKwkJcCs9bjsKKwkJbisrOworCisJCW9mZj1uOworCQlwKz0yOworCQluKz0yOworCisJCXNrPVNTTF9nZXRfY2xpZW50X0NBX2xpc3Qocyk7CisJCW5sPTA7CisJCWlmIChzayAhPSBOVUxMKQorCQkJeworCQkJZm9yIChpPTA7IGk8c2tfWDUwOV9OQU1FX251bShzayk7IGkrKykKKwkJCQl7CisJCQkJbmFtZT1za19YNTA5X05BTUVfdmFsdWUoc2ssaSk7CisJCQkJaj1pMmRfWDUwOV9OQU1FKG5hbWUsTlVMTCk7CisJCQkJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLERUTFMxX0hNX0hFQURFUl9MRU5HVEgrbitqKzIpKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9EVExTMV9TRU5EX0NFUlRJRklDQVRFX1JFUVVFU1QsRVJSX1JfQlVGX0xJQik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJcD0odW5zaWduZWQgY2hhciAqKSYoYnVmLT5kYXRhW0RUTFMxX0hNX0hFQURFUl9MRU5HVEgrbl0pOworCQkJCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTkVUU0NBUEVfQ0FfRE5fQlVHKSkKKwkJCQkJeworCQkJCQlzMm4oaixwKTsKKwkJCQkJaTJkX1g1MDlfTkFNRShuYW1lLCZwKTsKKwkJCQkJbis9MitqOworCQkJCQlubCs9MitqOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWQ9cDsKKwkJCQkJaTJkX1g1MDlfTkFNRShuYW1lLCZwKTsKKwkJCQkJai09MjsgczJuKGosZCk7IGorPTI7CisJCQkJCW4rPWo7CisJCQkJCW5sKz1qOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkvKiBlbHNlIG5vIENBIG5hbWVzICovCisJCXA9KHVuc2lnbmVkIGNoYXIgKikmKGJ1Zi0+ZGF0YVtEVExTMV9ITV9IRUFERVJfTEVOR1RIK29mZl0pOworCQlzMm4obmwscCk7CisKKwkJZD0odW5zaWduZWQgY2hhciAqKWJ1Zi0+ZGF0YTsKKwkJKihkKyspPVNTTDNfTVRfQ0VSVElGSUNBVEVfUkVRVUVTVDsKKwkJbDJuMyhuLGQpOworCQlzMm4ocy0+ZDEtPmhhbmRzaGFrZV93cml0ZV9zZXEsZCk7CisJCXMtPmQxLT5oYW5kc2hha2Vfd3JpdGVfc2VxKys7CisKKwkJLyogd2Ugc2hvdWxkIG5vdyBoYXZlIHRoaW5ncyBwYWNrZWQgdXAsIHNvIGxldHMgc2VuZAorCQkgKiBpdCBvZmYgKi8KKworCQlzLT5pbml0X251bT1uK0RUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisJCXMtPmluaXRfb2ZmPTA7CisjaWZkZWYgTkVUU0NBUEVfSEFOR19CVUcKKy8qIFhYWDogd2hhdCB0byBkbyBhYm91dCB0aGlzPyAqLworCQlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGEgKyBzLT5pbml0X251bTsKKworCQkvKiBkbyB0aGUgaGVhZGVyICovCisJCSoocCsrKT1TU0wzX01UX1NFUlZFUl9ET05FOworCQkqKHArKyk9MDsKKwkJKihwKyspPTA7CisJCSoocCsrKT0wOworCQlzLT5pbml0X251bSArPSA0OworI2VuZGlmCisKKwkJLyogWERUTFM6ICBzZXQgbWVzc2FnZSBoZWFkZXIgPyAqLworCQltc2dfbGVuID0gcy0+aW5pdF9udW0gLSBEVExTMV9ITV9IRUFERVJfTEVOR1RIOworCQlkdGxzMV9zZXRfbWVzc2FnZV9oZWFkZXIocywgKHZvaWQgKilzLT5pbml0X2J1Zi0+ZGF0YSwKKwkJCVNTTDNfTVRfQ0VSVElGSUNBVEVfUkVRVUVTVCwgbXNnX2xlbiwgMCwgbXNnX2xlbik7CisKKwkJLyogYnVmZmVyIHRoZSBtZXNzYWdlIHRvIGhhbmRsZSByZS14bWl0cyAqLworCQlkdGxzMV9idWZmZXJfbWVzc2FnZShzLCAwKTsKKworCQlzLT5zdGF0ZSA9IFNTTDNfU1RfU1dfQ0VSVF9SRVFfQjsKKwkJfQorCisJLyogU1NMM19TVF9TV19DRVJUX1JFUV9CICovCisJcmV0dXJuKGR0bHMxX2RvX3dyaXRlKHMsU1NMM19SVF9IQU5EU0hBS0UpKTsKK2VycjoKKwlyZXR1cm4oLTEpOworCX0KKworaW50IGR0bHMxX3NlbmRfc2VydmVyX2NlcnRpZmljYXRlKFNTTCAqcykKKwl7CisJdW5zaWduZWQgbG9uZyBsOworCVg1MDkgKng7CisKKwlpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9TV19DRVJUX0EpCisJCXsKKwkJeD1zc2xfZ2V0X3NlcnZlcl9zZW5kX2NlcnQocyk7CisJCWlmICh4ID09IE5VTEwpCisJCQl7CisJCQkvKiBWUlM6IGFsbG93IG51bGwgY2VydCBpZiBhdXRoID09IEtSQjUgKi8KKwkJCWlmICgocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleSAhPSBTU0xfa0tSQjUpIHx8CisJCQkgICAgKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGggIT0gU1NMX2FLUkI1KSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0NFUlRJRklDQVRFLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4oMCk7CisJCQkJfQorCQkJfQorCisJCWw9ZHRsczFfb3V0cHV0X2NlcnRfY2hhaW4ocyx4KTsKKwkJcy0+c3RhdGU9U1NMM19TVF9TV19DRVJUX0I7CisJCXMtPmluaXRfbnVtPShpbnQpbDsKKwkJcy0+aW5pdF9vZmY9MDsKKworCQkvKiBidWZmZXIgdGhlIG1lc3NhZ2UgdG8gaGFuZGxlIHJlLXhtaXRzICovCisJCWR0bHMxX2J1ZmZlcl9tZXNzYWdlKHMsIDApOworCQl9CisKKwkvKiBTU0wzX1NUX1NXX0NFUlRfQiAqLworCXJldHVybihkdGxzMV9kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCitpbnQgZHRsczFfc2VuZF9uZXdzZXNzaW9uX3RpY2tldChTU0wgKnMpCisJeworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0EpCisJCXsKKwkJdW5zaWduZWQgY2hhciAqcCwgKnNlbmMsICptYWNzdGFydDsKKwkJaW50IGxlbiwgc2xlbjsKKwkJdW5zaWduZWQgaW50IGhsZW4sIG1zZ19sZW47CisJCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwkJSE1BQ19DVFggaGN0eDsKKwkJU1NMX0NUWCAqdGN0eCA9IHMtPmluaXRpYWxfY3R4OworCQl1bnNpZ25lZCBjaGFyIGl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKKwkJdW5zaWduZWQgY2hhciBrZXlfbmFtZVsxNl07CisKKwkJLyogZ2V0IHNlc3Npb24gZW5jb2RpbmcgbGVuZ3RoICovCisJCXNsZW4gPSBpMmRfU1NMX1NFU1NJT04ocy0+c2Vzc2lvbiwgTlVMTCk7CisJCS8qIFNvbWUgbGVuZ3RoIHZhbHVlcyBhcmUgMTYgYml0cywgc28gZm9yZ2V0IGl0IGlmIHNlc3Npb24gaXMKKyAJCSAqIHRvbyBsb25nCisgCQkgKi8KKwkJaWYgKHNsZW4gPiAweEZGMDApCisJCQlyZXR1cm4gLTE7CisJCS8qIEdyb3cgYnVmZmVyIGlmIG5lZWQgYmU6IHRoZSBsZW5ndGggY2FsY3VsYXRpb24gaXMgYXMKKyAJCSAqIGZvbGxvd3MgMTIgKERUTFMgaGFuZHNoYWtlIG1lc3NhZ2UgaGVhZGVyKSArCisgCQkgKiA0ICh0aWNrZXQgbGlmZXRpbWUgaGludCkgKyAyICh0aWNrZXQgbGVuZ3RoKSArCisgCQkgKiAxNiAoa2V5IG5hbWUpICsgbWF4X2l2X2xlbiAoaXYgbGVuZ3RoKSArCisgCQkgKiBzZXNzaW9uX2xlbmd0aCArIG1heF9lbmNfYmxvY2tfc2l6ZSAobWF4IGVuY3J5cHRlZCBzZXNzaW9uCisgCQkgKiBsZW5ndGgpICsgbWF4X21kX3NpemUgKEhNQUMpLgorIAkJICovCisJCWlmICghQlVGX01FTV9ncm93KHMtPmluaXRfYnVmLAorCQkJRFRMUzFfSE1fSEVBREVSX0xFTkdUSCArIDIyICsgRVZQX01BWF9JVl9MRU5HVEggKworCQkJRVZQX01BWF9CTE9DS19MRU5HVEggKyBFVlBfTUFYX01EX1NJWkUgKyBzbGVuKSkKKwkJCXJldHVybiAtMTsKKwkJc2VuYyA9IE9QRU5TU0xfbWFsbG9jKHNsZW4pOworCQlpZiAoIXNlbmMpCisJCQlyZXR1cm4gLTE7CisJCXAgPSBzZW5jOworCQlpMmRfU1NMX1NFU1NJT04ocy0+c2Vzc2lvbiwgJnApOworCisJCXA9KHVuc2lnbmVkIGNoYXIgKikmKHMtPmluaXRfYnVmLT5kYXRhW0RUTFMxX0hNX0hFQURFUl9MRU5HVEhdKTsKKwkJRVZQX0NJUEhFUl9DVFhfaW5pdCgmY3R4KTsKKwkJSE1BQ19DVFhfaW5pdCgmaGN0eCk7CisJCS8qIEluaXRpYWxpemUgSE1BQyBhbmQgY2lwaGVyIGNvbnRleHRzLiBJZiBjYWxsYmFjayBwcmVzZW50CisJCSAqIGl0IGRvZXMgYWxsIHRoZSB3b3JrIG90aGVyd2lzZSB1c2UgZ2VuZXJhdGVkIHZhbHVlcworCQkgKiBmcm9tIHBhcmVudCBjdHguCisJCSAqLworCQlpZiAodGN0eC0+dGxzZXh0X3RpY2tldF9rZXlfY2IpCisJCQl7CisJCQlpZiAodGN0eC0+dGxzZXh0X3RpY2tldF9rZXlfY2Iocywga2V5X25hbWUsIGl2LCAmY3R4LAorCQkJCQkJCSAmaGN0eCwgMSkgPCAwKQorCQkJCXsKKwkJCQlPUEVOU1NMX2ZyZWUoc2VuYyk7CisJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJUkFORF9wc2V1ZG9fYnl0ZXMoaXYsIDE2KTsKKwkJCUVWUF9FbmNyeXB0SW5pdF9leCgmY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwKKwkJCQkJdGN0eC0+dGxzZXh0X3RpY2tfYWVzX2tleSwgaXYpOworCQkJSE1BQ19Jbml0X2V4KCZoY3R4LCB0Y3R4LT50bHNleHRfdGlja19obWFjX2tleSwgMTYsCisJCQkJCXRsc2V4dF90aWNrX21kKCksIE5VTEwpOworCQkJbWVtY3B5KGtleV9uYW1lLCB0Y3R4LT50bHNleHRfdGlja19rZXlfbmFtZSwgMTYpOworCQkJfQorCQlsMm4ocy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludCwgcCk7CisJCS8qIFNraXAgdGlja2V0IGxlbmd0aCBmb3Igbm93ICovCisJCXAgKz0gMjsKKwkJLyogT3V0cHV0IGtleSBuYW1lICovCisJCW1hY3N0YXJ0ID0gcDsKKwkJbWVtY3B5KHAsIGtleV9uYW1lLCAxNik7CisJCXAgKz0gMTY7CisJCS8qIG91dHB1dCBJViAqLworCQltZW1jcHkocCwgaXYsIEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aCgmY3R4KSk7CisJCXAgKz0gRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKCZjdHgpOworCQkvKiBFbmNyeXB0IHNlc3Npb24gZGF0YSAqLworCQlFVlBfRW5jcnlwdFVwZGF0ZSgmY3R4LCBwLCAmbGVuLCBzZW5jLCBzbGVuKTsKKwkJcCArPSBsZW47CisJCUVWUF9FbmNyeXB0RmluYWwoJmN0eCwgcCwgJmxlbik7CisJCXAgKz0gbGVuOworCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjdHgpOworCisJCUhNQUNfVXBkYXRlKCZoY3R4LCBtYWNzdGFydCwgcCAtIG1hY3N0YXJ0KTsKKwkJSE1BQ19GaW5hbCgmaGN0eCwgcCwgJmhsZW4pOworCQlITUFDX0NUWF9jbGVhbnVwKCZoY3R4KTsKKworCQlwICs9IGhsZW47CisJCS8qIE5vdyB3cml0ZSBvdXQgbGVuZ3RoczogcCBwb2ludHMgdG8gZW5kIG9mIGRhdGEgd3JpdHRlbiAqLworCQkvKiBUb3RhbCBsZW5ndGggKi8KKwkJbGVuID0gcCAtICh1bnNpZ25lZCBjaGFyICopKHMtPmluaXRfYnVmLT5kYXRhKTsKKwkJLyogVGlja2V0IGxlbmd0aCAqLworCQlwPSh1bnNpZ25lZCBjaGFyICopJihzLT5pbml0X2J1Zi0+ZGF0YVtEVExTMV9ITV9IRUFERVJfTEVOR1RIXSkgKyA0OworCQlzMm4obGVuIC0gRFRMUzFfSE1fSEVBREVSX0xFTkdUSCAtIDYsIHApOworCisJCS8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLworCQlzLT5pbml0X251bT0gbGVuOworCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0I7CisJCXMtPmluaXRfb2ZmPTA7CisJCU9QRU5TU0xfZnJlZShzZW5jKTsKKworCQkvKiBYRFRMUzogIHNldCBtZXNzYWdlIGhlYWRlciA/ICovCisJCW1zZ19sZW4gPSBzLT5pbml0X251bSAtIERUTFMxX0hNX0hFQURFUl9MRU5HVEg7CisJCWR0bHMxX3NldF9tZXNzYWdlX2hlYWRlcihzLCAodm9pZCAqKXMtPmluaXRfYnVmLT5kYXRhLAorCQkJU1NMM19NVF9ORVdTRVNTSU9OX1RJQ0tFVCwgbXNnX2xlbiwgMCwgbXNnX2xlbik7CisKKwkJLyogYnVmZmVyIHRoZSBtZXNzYWdlIHRvIGhhbmRsZSByZS14bWl0cyAqLworCQlkdGxzMV9idWZmZXJfbWVzc2FnZShzLCAwKTsKKwkJfQorCisJLyogU1NMM19TVF9TV19TRVNTSU9OX1RJQ0tFVF9CICovCisJcmV0dXJuKGR0bHMxX2RvX3dyaXRlKHMsU1NMM19SVF9IQU5EU0hBS0UpKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9kdGxzMS5oIGIvbGliL29wZW5zc2wvc3NsL2R0bHMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwMGQxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9kdGxzMS5oCkBAIC0wLDAgKzEsMjY3IEBACisvKiBzc2wvZHRsczEuaCAqLworLyogCisgKiBEVExTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgTmFnZW5kcmEgTW9kYWR1Z3UKKyAqIChuYWdlbmRyYUBjcy5zdGFuZm9yZC5lZHUpIGZvciB0aGUgT3BlblNTTCBwcm9qZWN0IDIwMDUuICAKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDA1IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpZm5kZWYgSEVBREVSX0RUTFMxX0ggCisjZGVmaW5lIEhFQURFUl9EVExTMV9IIAorCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BxdWV1ZS5oPgorI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworI2luY2x1ZGUgPHJlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4zMgorLyogTmVlZGVkIGZvciBzdHJ1Y3QgdGltZXZhbCAqLworI2luY2x1ZGUgPHdpbnNvY2suaD4KKyNlbGlmIGRlZmluZWQoT1BFTlNTTF9TWVNfTkVUV0FSRSkgJiYgIWRlZmluZWQoX1dJTlNPQ0syQVBJXykKKyNpbmNsdWRlIDxzeXMvdGltZXZhbC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgRFRMUzFfVkVSU0lPTgkJCTB4RkVGRgorI2RlZmluZSBEVExTMV9CQURfVkVSCQkJMHgwMTAwCisKKyNpZiAwCisvKiB0aGlzIGFsZXJ0IGRlc2NyaXB0aW9uIGlzIG5vdCBzcGVjaWZpZWQgYW55d2hlcmUuLi4gKi8KKyNkZWZpbmUgRFRMUzFfQURfTUlTU0lOR19IQU5EU0hBS0VfTUVTU0FHRSAgICAxMTAKKyNlbmRpZgorCisvKiBsZW5ndGhzIG9mIG1lc3NhZ2VzICovCisjZGVmaW5lIERUTFMxX0NPT0tJRV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAyNTYKKworI2RlZmluZSBEVExTMV9SVF9IRUFERVJfTEVOR1RIICAgICAgICAgICAgICAgICAgMTMKKworI2RlZmluZSBEVExTMV9ITV9IRUFERVJfTEVOR1RIICAgICAgICAgICAgICAgICAgMTIKKworI2RlZmluZSBEVExTMV9ITV9CQURfRlJBR01FTlQgICAgICAgICAgICAgICAgICAgLTIKKyNkZWZpbmUgRFRMUzFfSE1fRlJBR01FTlRfUkVUUlkgICAgICAgICAgICAgICAgIC0zCisKKyNkZWZpbmUgRFRMUzFfQ0NTX0hFQURFUl9MRU5HVEggICAgICAgICAgICAgICAgICAxCisKKyNpZmRlZiBEVExTMV9BRF9NSVNTSU5HX0hBTkRTSEFLRV9NRVNTQUdFCisjZGVmaW5lIERUTFMxX0FMX0hFQURFUl9MRU5HVEggICAgICAgICAgICAgICAgICAgNworI2Vsc2UKKyNkZWZpbmUgRFRMUzFfQUxfSEVBREVSX0xFTkdUSCAgICAgICAgICAgICAgICAgICAyCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBkdGxzMV9iaXRtYXBfc3QKKwl7CisJdW5zaWduZWQgbG9uZyBtYXA7CQkvKiB0cmFjayAzMiBwYWNrZXRzIG9uIDMyLWJpdCBzeXN0ZW1zCisJCQkJCSAgIGFuZCA2NCAtIG9uIDY0LWJpdCBzeXN0ZW1zICovCisJdW5zaWduZWQgY2hhciBtYXhfc2VxX251bVs4XTsJLyogbWF4IHJlY29yZCBudW1iZXIgc2VlbiBzbyBmYXIsCisJCQkJCSAgIDY0LWJpdCB2YWx1ZSBpbiBiaWctZW5kaWFuCisJCQkJCSAgIGVuY29kaW5nICovCisJfSBEVExTMV9CSVRNQVA7CisKK3N0cnVjdCBkdGxzMV9yZXRyYW5zbWl0X3N0YXRlCisJeworCUVWUF9DSVBIRVJfQ1RYICplbmNfd3JpdGVfY3R4OwkvKiBjcnlwdG9ncmFwaGljIHN0YXRlICovCisJRVZQX01EX0NUWCAqd3JpdGVfaGFzaDsJCQkvKiB1c2VkIGZvciBtYWMgZ2VuZXJhdGlvbiAqLworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwlDT01QX0NUWCAqY29tcHJlc3M7CQkJCS8qIGNvbXByZXNzaW9uICovCisjZWxzZQorCWNoYXIgKmNvbXByZXNzOwkKKyNlbmRpZgorCVNTTF9TRVNTSU9OICpzZXNzaW9uOworCXVuc2lnbmVkIHNob3J0IGVwb2NoOworCX07CisKK3N0cnVjdCBobV9oZWFkZXJfc3QKKwl7CisJdW5zaWduZWQgY2hhciB0eXBlOworCXVuc2lnbmVkIGxvbmcgbXNnX2xlbjsKKwl1bnNpZ25lZCBzaG9ydCBzZXE7CisJdW5zaWduZWQgbG9uZyBmcmFnX29mZjsKKwl1bnNpZ25lZCBsb25nIGZyYWdfbGVuOworCXVuc2lnbmVkIGludCBpc19jY3M7CisJc3RydWN0IGR0bHMxX3JldHJhbnNtaXRfc3RhdGUgc2F2ZWRfcmV0cmFuc21pdF9zdGF0ZTsKKwl9OworCitzdHJ1Y3QgY2NzX2hlYWRlcl9zdAorCXsKKwl1bnNpZ25lZCBjaGFyIHR5cGU7CisJdW5zaWduZWQgc2hvcnQgc2VxOworCX07CisKK3N0cnVjdCBkdGxzMV90aW1lb3V0X3N0CisJeworCS8qIE51bWJlciBvZiByZWFkIHRpbWVvdXRzIHNvIGZhciAqLworCXVuc2lnbmVkIGludCByZWFkX3RpbWVvdXRzOworCQorCS8qIE51bWJlciBvZiB3cml0ZSB0aW1lb3V0cyBzbyBmYXIgKi8KKwl1bnNpZ25lZCBpbnQgd3JpdGVfdGltZW91dHM7CisJCisJLyogTnVtYmVyIG9mIGFsZXJ0cyByZWNlaXZlZCBzbyBmYXIgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX2FsZXJ0czsKKwl9OworCit0eXBlZGVmIHN0cnVjdCByZWNvcmRfcHF1ZXVlX3N0CisJeworCXVuc2lnbmVkIHNob3J0IGVwb2NoOworCXBxdWV1ZSBxOworCX0gcmVjb3JkX3BxdWV1ZTsKKwordHlwZWRlZiBzdHJ1Y3QgaG1fZnJhZ21lbnRfc3QKKwl7CisJc3RydWN0IGhtX2hlYWRlcl9zdCBtc2dfaGVhZGVyOworCXVuc2lnbmVkIGNoYXIgKmZyYWdtZW50OworCXVuc2lnbmVkIGNoYXIgKnJlYXNzZW1ibHk7CisJfSBobV9mcmFnbWVudDsKKwordHlwZWRlZiBzdHJ1Y3QgZHRsczFfc3RhdGVfc3QKKwl7CisJdW5zaWduZWQgaW50IHNlbmRfY29va2llOworCXVuc2lnbmVkIGNoYXIgY29va2llW0RUTFMxX0NPT0tJRV9MRU5HVEhdOworCXVuc2lnbmVkIGNoYXIgcmN2ZF9jb29raWVbRFRMUzFfQ09PS0lFX0xFTkdUSF07CisJdW5zaWduZWQgaW50IGNvb2tpZV9sZW47CisKKwkvKiAKKwkgKiBUaGUgY3VycmVudCBkYXRhIGFuZCBoYW5kc2hha2UgZXBvY2guICBUaGlzIGlzIGluaXRpYWxseQorCSAqIHVuZGVmaW5lZCwgYW5kIHN0YXJ0cyBhdCB6ZXJvIG9uY2UgdGhlIGluaXRpYWwgaGFuZHNoYWtlIGlzCisJICogY29tcGxldGVkIAorCSAqLworCXVuc2lnbmVkIHNob3J0IHJfZXBvY2g7CisJdW5zaWduZWQgc2hvcnQgd19lcG9jaDsKKworCS8qIHJlY29yZHMgYmVpbmcgcmVjZWl2ZWQgaW4gdGhlIGN1cnJlbnQgZXBvY2ggKi8KKwlEVExTMV9CSVRNQVAgYml0bWFwOworCisJLyogcmVuZWdvdGlhdGlvbiBzdGFydHMgYSBuZXcgc2V0IG9mIHNlcXVlbmNlIG51bWJlcnMgKi8KKwlEVExTMV9CSVRNQVAgbmV4dF9iaXRtYXA7CisKKwkvKiBoYW5kc2hha2UgbWVzc2FnZSBudW1iZXJzICovCisJdW5zaWduZWQgc2hvcnQgaGFuZHNoYWtlX3dyaXRlX3NlcTsKKwl1bnNpZ25lZCBzaG9ydCBuZXh0X2hhbmRzaGFrZV93cml0ZV9zZXE7CisKKwl1bnNpZ25lZCBzaG9ydCBoYW5kc2hha2VfcmVhZF9zZXE7CisKKwkvKiBzYXZlIGxhc3Qgc2VxdWVuY2UgbnVtYmVyIGZvciByZXRyYW5zbWlzc2lvbnMgKi8KKwl1bnNpZ25lZCBjaGFyIGxhc3Rfd3JpdGVfc2VxdWVuY2VbOF07CisKKwkvKiBSZWNlaXZlZCBoYW5kc2hha2UgcmVjb3JkcyAocHJvY2Vzc2VkIGFuZCB1bnByb2Nlc3NlZCkgKi8KKwlyZWNvcmRfcHF1ZXVlIHVucHJvY2Vzc2VkX3JjZHM7CisJcmVjb3JkX3BxdWV1ZSBwcm9jZXNzZWRfcmNkczsKKworCS8qIEJ1ZmZlcmVkIGhhbmRzaGFrZSBtZXNzYWdlcyAqLworCXBxdWV1ZSBidWZmZXJlZF9tZXNzYWdlczsKKworCS8qIEJ1ZmZlcmVkIChzZW50KSBoYW5kc2hha2UgcmVjb3JkcyAqLworCXBxdWV1ZSBzZW50X21lc3NhZ2VzOworCisJLyogQnVmZmVyZWQgYXBwbGljYXRpb24gcmVjb3Jkcy4KKwkgKiBPbmx5IGZvciByZWNvcmRzIGJldHdlZW4gQ0NTIGFuZCBGaW5pc2hlZAorCSAqIHRvIHByZXZlbnQgZWl0aGVyIHByb3RvY29sIHZpb2xhdGlvbiBvcgorCSAqIHVubmVjZXNzYXJ5IG1lc3NhZ2UgbG9zcy4KKwkgKi8KKwlyZWNvcmRfcHF1ZXVlIGJ1ZmZlcmVkX2FwcF9kYXRhOworCisJLyogSXMgc2V0IHdoZW4gbGlzdGVuaW5nIGZvciBuZXcgY29ubmVjdGlvbnMgd2l0aCBkdGxzMV9saXN0ZW4oKSAqLworCXVuc2lnbmVkIGludCBsaXN0ZW47CisKKwl1bnNpZ25lZCBpbnQgbXR1OyAvKiBtYXggRFRMUyBwYWNrZXQgc2l6ZSAqLworCisJc3RydWN0IGhtX2hlYWRlcl9zdCB3X21zZ19oZHI7CisJc3RydWN0IGhtX2hlYWRlcl9zdCByX21zZ19oZHI7CisKKwlzdHJ1Y3QgZHRsczFfdGltZW91dF9zdCB0aW1lb3V0OworCisJLyogSW5kaWNhdGVzIHdoZW4gdGhlIGxhc3QgaGFuZHNoYWtlIG1zZyBzZW50IHdpbGwgdGltZW91dCAqLworCXN0cnVjdCB0aW1ldmFsIG5leHRfdGltZW91dDsKKworCS8qIFRpbWVvdXQgZHVyYXRpb24gKi8KKwl1bnNpZ25lZCBzaG9ydCB0aW1lb3V0X2R1cmF0aW9uOworCisJLyogc3RvcmFnZSBmb3IgQWxlcnQvSGFuZHNoYWtlIHByb3RvY29sIGRhdGEgcmVjZWl2ZWQgYnV0IG5vdAorCSAqIHlldCBwcm9jZXNzZWQgYnkgc3NsM19yZWFkX2J5dGVzOiAqLworCXVuc2lnbmVkIGNoYXIgYWxlcnRfZnJhZ21lbnRbRFRMUzFfQUxfSEVBREVSX0xFTkdUSF07CisJdW5zaWduZWQgaW50IGFsZXJ0X2ZyYWdtZW50X2xlbjsKKwl1bnNpZ25lZCBjaGFyIGhhbmRzaGFrZV9mcmFnbWVudFtEVExTMV9ITV9IRUFERVJfTEVOR1RIXTsKKwl1bnNpZ25lZCBpbnQgaGFuZHNoYWtlX2ZyYWdtZW50X2xlbjsKKworCXVuc2lnbmVkIGludCByZXRyYW5zbWl0dGluZzsKKwl1bnNpZ25lZCBpbnQgY2hhbmdlX2NpcGhlcl9zcGVjX29rOworCisJfSBEVExTMV9TVEFURTsKKwordHlwZWRlZiBzdHJ1Y3QgZHRsczFfcmVjb3JkX2RhdGFfc3QKKwl7CisJdW5zaWduZWQgY2hhciAqcGFja2V0OworCXVuc2lnbmVkIGludCAgIHBhY2tldF9sZW5ndGg7CisJU1NMM19CVUZGRVIgICAgcmJ1ZjsKKwlTU0wzX1JFQ09SRCAgICBycmVjOworCX0gRFRMUzFfUkVDT1JEX0RBVEE7CisKKworLyogVGltZW91dCBtdWx0aXBsaWVycyAodGltZW91dCBzbGljZSBpcyBkZWZpbmVkIGluIGFwcHMvdGltZW91dHMuaCAqLworI2RlZmluZSBEVExTMV9UTU9fUkVBRF9DT1VOVCAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERUTFMxX1RNT19XUklURV9DT1VOVCAgICAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBEVExTMV9UTU9fQUxFUlRfQ09VTlQgICAgICAgICAgICAgICAgICAgICAxMgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvaW5zdGFsbC5jb20gYi9saWIvb3BlbnNzbC9zc2wvaW5zdGFsbC5jb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1NjA2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9pbnN0YWxsLmNvbQpAQCAtMCwwICsxLDkwIEBACiskISBJTlNUQUxMLkNPTSAtLSBJbnN0YWxscyB0aGUgZmlsZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnkgdHJlZQorJCEKKyQhIEF1dGhvcjogUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPgorJCEgVGltZSBvZiBjcmVhdGlvbjogMjItTUFZLTE5OTggMTA6MTMKKyQhCiskISBQMQlyb290IG9mIHRoZSBkaXJlY3RvcnkgdHJlZQorJCEKKyQJSUYgUDEgLkVRUy4gIiIKKyQJVEhFTgorJAkgICAgV1JJVEUgU1lTJE9VVFBVVCAiRmlyc3QgYXJndW1lbnQgbWlzc2luZy4iCiskCSAgICBXUklURSBTWVMkT1VUUFVUIC0KKwkJICAiSXQgc2hvdWxkIGJlIHRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91IHdhbnQgdGhpbmdzIGluc3RhbGxlZC4iCiskCSAgICBFWElUCiskCUVORElGCiskCiskCUlGIChGJEdFVFNZSSgiQ1BVIikuTFQuMTI4KQorJAlUSEVOCiskCSAgICBBUkNIIDo9IFZBWAorJAlFTFNFCiskCSAgICBBUkNIID0gRiRFRElUKCBGJEdFVFNZSSggIkFSQ0hfTkFNRSIpLCAiVVBDQVNFIikKKyQJICAgIElGIChBUkNIIC5FUVMuICIiKSBUSEVOIEFSQ0ggPSAiVU5LIgorJAlFTkRJRgorJAorJAlST09UID0gRiRQQVJTRShQMSwiW11BLjswIiwsLCJTWU5UQVhfT05MWSxOT19DT05DRUFMIikgLSAiQS47MCIKKyQJUk9PVF9ERVYgPSBGJFBBUlNFKFJPT1QsLCwiREVWSUNFIiwiU1lOVEFYX09OTFkiKQorJAlST09UX0RJUiA9IEYkUEFSU0UoUk9PVCwsLCJESVJFQ1RPUlkiLCJTWU5UQVhfT05MWSIpIC0KKwkJICAgLSAiWzAwMDAwMC4iIC0gIl1bIiAtICJbIiAtICJdIgorJAlST09UID0gUk9PVF9ERVYgKyAiWyIgKyBST09UX0RJUgorJAorJAlERUZJTkUvTk9MT0cgV1JLX1NTTFJPT1QgJ1JPT1QnLl0gL1RSQU5TPUNPTkMKKyQJREVGSU5FL05PTE9HIFdSS19TU0xYTElCIFdSS19TU0xST09UOlsnQVJDSCdfTElCXQorJAlERUZJTkUvTk9MT0cgV1JLX1NTTElOQ0xVREUgV1JLX1NTTFJPT1Q6W0lOQ0xVREVdCiskCURFRklORS9OT0xPRyBXUktfU1NMWEVYRSBXUktfU1NMUk9PVDpbJ0FSQ0gnX0VYRV0KKyQKKyQJSUYgRiRQQVJTRSgiV1JLX1NTTFJPT1Q6WzAwMDAwMF0iKSAuRVFTLiAiIiBUSEVOIC0KKwkgICBDUkVBVEUvRElSL0xPRyBXUktfU1NMUk9PVDpbMDAwMDAwXQorJAlJRiBGJFBBUlNFKCJXUktfU1NMWExJQjoiKSAuRVFTLiAiIiBUSEVOIC0KKwkgICBDUkVBVEUvRElSL0xPRyBXUktfU1NMWExJQjoKKyQJSUYgRiRQQVJTRSgiV1JLX1NTTElOQ0xVREU6IikgLkVRUy4gIiIgVEhFTiAtCisJICAgQ1JFQVRFL0RJUi9MT0cgV1JLX1NTTElOQ0xVREU6CiskCUlGIEYkUEFSU0UoIldSS19TU0xYRVhFOiIpIC5FUVMuICIiIFRIRU4gLQorCSAgIENSRUFURS9ESVIvTE9HIFdSS19TU0xYRVhFOgorJAorJAlFWEhFQURFUiA6PSBzc2wuaCxzc2wyLmgsc3NsMy5oLHNzbDIzLmgsdGxzMS5oLGR0bHMxLmgsa3NzbC5oCiskCUVfRVhFIDo9IHNzbF90YXNrCiskCUxJQlMgOj0gTElCU1NMCiskCiskCVhFWEVfRElSIDo9IFstLidBUkNIJy5FWEUuU1NMXQorJAorJAlDT1BZICdFWEhFQURFUicgV1JLX1NTTElOQ0xVREU6L0xPRworJAlTRVQgRklMRS9QUk9UPVdPUkxEOlJFIFdSS19TU0xJTkNMVURFOidFWEhFQURFUicKKyQKKyQJSSA9IDAKKyQgTE9PUF9FWEU6IAorJAlFID0gRiRFRElUKEYkRUxFTUVOVChJLCAiLCIsIEVfRVhFKSwiVFJJTSIpCiskCUkgPSBJICsgMQorJAlJRiBFIC5FUVMuICIsIiBUSEVOIEdPVE8gTE9PUF9FWEVfRU5ECiskCVNFVCBOT09OCiskCUlGIEYkU0VBUkNIKFhFWEVfRElSK0UrIi5FWEUiKSAuTkVTLiAiIgorJAlUSEVOCiskCSAgQ09QWSAnWEVYRV9ESVInJ0UnLkVYRSBXUktfU1NMWEVYRTonRScuRVhFL2xvZworJAkgIFNFVCBGSUxFL1BST1Q9VzpSRSBXUktfU1NMWEVYRTonRScuRVhFCiskCUVORElGCiskCVNFVCBPTgorJAlHT1RPIExPT1BfRVhFCiskIExPT1BfRVhFX0VORDoKKyQKKyQJSSA9IDAKKyQgTE9PUF9MSUI6IAorJAlFID0gRiRFRElUKEYkRUxFTUVOVChJLCAiLCIsIExJQlMpLCJUUklNIikKKyQJSSA9IEkgKyAxCiskCUlGIEUgLkVRUy4gIiwiIFRIRU4gR09UTyBMT09QX0xJQl9FTkQKKyQJU0VUIE5PT04KKyQhIE9iamVjdCBsaWJyYXJ5LgorJAlJRiBGJFNFQVJDSChYRVhFX0RJUitFKyIuT0xCIikgLk5FUy4gIiIKKyQJVEhFTgorJAkgIENPUFkgJ1hFWEVfRElSJydFJy5PTEIgV1JLX1NTTFhMSUI6J0UnLk9MQi9sb2cKKyQJICBTRVQgRklMRS9QUk9UPVc6UkUgV1JLX1NTTFhMSUI6J0UnLk9MQgorJAlFTkRJRgorJCEgU2hhcmVhYmxlIGltYWdlLgorJAlJRiBGJFNFQVJDSChYRVhFX0RJUitFKyIuRVhFIikgLk5FUy4gIiIKKyQJVEhFTgorJAkgIENPUFkgJ1hFWEVfRElSJydFJy5FWEUgV1JLX1NTTFhMSUI6J0UnLkVYRS9sb2cKKyQJICBTRVQgRklMRS9QUk9UPVc6UkUgV1JLX1NTTFhMSUI6J0UnLkVYRQorJAlFTkRJRgorJAlTRVQgT04KKyQJR09UTyBMT09QX0xJQgorJCBMT09QX0xJQl9FTkQ6CiskCiskCUVYSVQKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9rc3NsLmMgYi9saWIvb3BlbnNzbC9zc2wva3NzbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MjBlMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wva3NzbC5jCkBAIC0wLDAgKzEsMjIwNSBAQAorLyogc3NsL2tzc2wuYyAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgVmVybiBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKworLyogIHNzbC9rc3NsLmMgIC0tICBSb3V0aW5lcyB0byBzdXBwb3J0ICgmIGRlYnVnKSBLZXJiZXJvczUgYXV0aCBmb3Igb3BlbnNzbAorKioKKyoqICAxOTk5MDcwMQlWUlMgCVN0YXJ0ZWQuCisqKiAgMjAwMDExPz8JSmVmZnJleSBBbHRtYW4sIFJpY2hhcmQgTGV2aXR0ZQorKiogICAgICAgICAgCQlHZW5lcmFsaXplZCBmb3IgSGVpbWRhbCwgTmV3ZXIgTUlULCAmIFdpbjMyLgorKiogICAgICAgICAgCQlJbnRlZ3JhdGVkIGludG8gbWFpbiBPcGVuU1NMIDAuOS43IHNuYXBzaG90cy4KKyoqICAyMDAxMDQxMwlTaW1vbiBXaWxraW5zb24sIFZSUworKiogICAgICAgICAgCQlSZWFsIFJGQzI3MTIgS2VyYmVyb3NXcmFwcGVyIHJlcGxhY2VzIEFQX1JFUS4KKyovCisKKyNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBLUkI1X1BSSVZBVEUJMQorCisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wva3JiNV9hc24uaD4KKyNpbmNsdWRlICJrc3NsX2xjbC5oIgorCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCisjaWZuZGVmIEVOT01FTQorI2RlZmluZSBFTk9NRU0gS1JCNUtSQl9FUlJfR0VORVJJQworI2VuZGlmCisKKy8qIAorICogV2hlbiBPcGVuU1NMIGlzIGJ1aWx0IG9uIFdpbmRvd3MsIHdlIGRvIG5vdCB3YW50IHRvIHJlcXVpcmUgdGhhdAorICogdGhlIEtlcmJlcm9zIERMTHMgYmUgYXZhaWxhYmxlIGluIG9yZGVyIGZvciB0aGUgT3BlblNTTCBETExzIHRvCisgKiB3b3JrLiAgVGhlcmVmb3JlLCBhbGwgS2VyYmVyb3Mgcm91dGluZXMgYXJlIGxvYWRlZCBhdCBydW4gdGltZQorICogYW5kIHdlIGRvIG5vdCBsaW5rIHRvIGEgLkxJQiBmaWxlLgorICovCisKKyNpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkRPV1MpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMzIpCisvKiAKKyAqIFRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGlzIHRvIHByb3ZpZGUKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBkaWZmZXJlbnQgcmVsZWFzZXMgb2YgTUlUIEtlcmJlcm9zIGZvciBXaW5kb3dzLgorICogQWxsIHZlcnNpb25zIHVwIHRvIDEuMiB1c2VkIG1hY3Jvcy4gIEJ1dCBtYWNyb3MgZG8gbm90IGFsbG93IGZvcgorICogYSBiaW5hcnkgY29tcGF0aWJsZSBpbnRlcmZhY2UgZm9yIERMTHMuICBUaGVyZWZvcmUsIGFsbCBtYWNyb3MgYXJlCisgKiBiZWluZyByZXBsYWNlZCBieSBmdW5jdGlvbiBjYWxscy4gIFRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIGFsbG93CisgKiBhbiBPcGVuU1NMIERMTCBidWlsdCBvbiBXaW5kb3dzIHRvIHdvcmsgd2hldGhlciBvciBub3QgdGhlIG1hY3JvCisgKiBvciBmdW5jdGlvbiBmb3JtIG9mIHRoZSByb3V0aW5lcyBhcmUgdXRpbGl6ZWQuCisgKi8KKyNpZmRlZiAga3JiNV9jY19nZXRfcHJpbmNpcGFsCisjZGVmaW5lIE5PX0RFRl9LUkI1X0NDQUNIRQorI3VuZGVmICBrcmI1X2NjX2dldF9wcmluY2lwYWwKKyNlbmRpZgorI2RlZmluZSBrcmI1X2NjX2dldF9wcmluY2lwYWwgICAga3NzbF9rcmI1X2NjX2dldF9wcmluY2lwYWwKKworI2RlZmluZSBrcmI1X2ZyZWVfZGF0YV9jb250ZW50cyAga3NzbF9rcmI1X2ZyZWVfZGF0YV9jb250ZW50cyAgIAorI2RlZmluZSBrcmI1X2ZyZWVfY29udGV4dCAgICAgICAga3NzbF9rcmI1X2ZyZWVfY29udGV4dCAgICAgICAgIAorI2RlZmluZSBrcmI1X2F1dGhfY29uX2ZyZWUgICAgICAga3NzbF9rcmI1X2F1dGhfY29uX2ZyZWUgICAgICAgIAorI2RlZmluZSBrcmI1X2ZyZWVfcHJpbmNpcGFsICAgICAga3NzbF9rcmI1X2ZyZWVfcHJpbmNpcGFsICAgICAgIAorI2RlZmluZSBrcmI1X21rX3JlcV9leHRlbmRlZCAgICAga3NzbF9rcmI1X21rX3JlcV9leHRlbmRlZCAgICAgIAorI2RlZmluZSBrcmI1X2dldF9jcmVkZW50aWFscyAgICAga3NzbF9rcmI1X2dldF9jcmVkZW50aWFscyAgICAgIAorI2RlZmluZSBrcmI1X2NjX2RlZmF1bHQgICAgICAgICAga3NzbF9rcmI1X2NjX2RlZmF1bHQgICAgICAgICAgIAorI2RlZmluZSBrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbCAga3NzbF9rcmI1X3NuYW1lX3RvX3ByaW5jaXBhbCAgIAorI2RlZmluZSBrcmI1X2luaXRfY29udGV4dCAgICAgICAga3NzbF9rcmI1X2luaXRfY29udGV4dCAgICAgICAgIAorI2RlZmluZSBrcmI1X2ZyZWVfdGlja2V0ICAgICAgICAga3NzbF9rcmI1X2ZyZWVfdGlja2V0ICAgICAgICAgIAorI2RlZmluZSBrcmI1X3JkX3JlcSAgICAgICAgICAgICAga3NzbF9rcmI1X3JkX3JlcSAgICAgICAgICAgICAgIAorI2RlZmluZSBrcmI1X2t0X2RlZmF1bHQgICAgICAgICAga3NzbF9rcmI1X2t0X2RlZmF1bHQgICAgICAgICAgIAorI2RlZmluZSBrcmI1X2t0X3Jlc29sdmUgICAgICAgICAga3NzbF9rcmI1X2t0X3Jlc29sdmUgICAgICAgICAgIAorLyogbWFjcm9zIGluIG1pdCAxLjIuMiBhbmQgZWFybGllcjsgZnVuY3Rpb25zIGluIG1pdCAxLjIuMyBhbmQgZ3JlYXRlciAqLworI2lmbmRlZiBrcmI1X2t0X2Nsb3NlCisjZGVmaW5lIGtyYjVfa3RfY2xvc2UgICAgICAgICAgICBrc3NsX2tyYjVfa3RfY2xvc2UKKyNlbmRpZiAvKiBrcmI1X2t0X2Nsb3NlICovCisjaWZuZGVmIGtyYjVfa3RfZ2V0X2VudHJ5CisjZGVmaW5lIGtyYjVfa3RfZ2V0X2VudHJ5ICAgICAgICBrc3NsX2tyYjVfa3RfZ2V0X2VudHJ5CisjZW5kaWYgLyoga3JiNV9rdF9nZXRfZW50cnkgKi8KKyNkZWZpbmUga3JiNV9hdXRoX2Nvbl9pbml0ICAgICAgIGtzc2xfa3JiNV9hdXRoX2Nvbl9pbml0ICAgICAgICAKKworI2RlZmluZSBrcmI1X3ByaW5jaXBhbF9jb21wYXJlICAga3NzbF9rcmI1X3ByaW5jaXBhbF9jb21wYXJlCisjZGVmaW5lIGtyYjVfZGVjcnlwdF90a3RfcGFydCAgICBrc3NsX2tyYjVfZGVjcnlwdF90a3RfcGFydAorI2RlZmluZSBrcmI1X3RpbWVvZmRheSAgICAgICAgICAga3NzbF9rcmI1X3RpbWVvZmRheQorI2RlZmluZSBrcmI1X3JjX2RlZmF1bHQgICAgICAgICAga3NzbF9rcmI1X3JjX2RlZmF1bHQKKworI2lmZGVmIGtyYjVfcmNfaW5pdGlhbGl6ZQorI3VuZGVmIGtyYjVfcmNfaW5pdGlhbGl6ZQorI2VuZGlmCisjZGVmaW5lIGtyYjVfcmNfaW5pdGlhbGl6ZSAgIGtzc2xfa3JiNV9yY19pbml0aWFsaXplCisKKyNpZmRlZiBrcmI1X3JjX2dldF9saWZlc3BhbgorI3VuZGVmIGtyYjVfcmNfZ2V0X2xpZmVzcGFuCisjZW5kaWYKKyNkZWZpbmUga3JiNV9yY19nZXRfbGlmZXNwYW4ga3NzbF9rcmI1X3JjX2dldF9saWZlc3BhbgorCisjaWZkZWYga3JiNV9yY19kZXN0cm95CisjdW5kZWYga3JiNV9yY19kZXN0cm95CisjZW5kaWYKKyNkZWZpbmUga3JiNV9yY19kZXN0cm95ICAgICAga3NzbF9rcmI1X3JjX2Rlc3Ryb3kKKworI2RlZmluZSB2YWxpZF9ja3N1bXR5cGUgICAgICBrc3NsX3ZhbGlkX2Nrc3VtdHlwZQorI2RlZmluZSBrcmI1X2NoZWNrc3VtX3NpemUgICBrc3NsX2tyYjVfY2hlY2tzdW1fc2l6ZQorI2RlZmluZSBrcmI1X2t0X2ZyZWVfZW50cnkgICBrc3NsX2tyYjVfa3RfZnJlZV9lbnRyeQorI2RlZmluZSBrcmI1X2F1dGhfY29uX3NldHJjYWNoZSAga3NzbF9rcmI1X2F1dGhfY29uX3NldHJjYWNoZQorI2RlZmluZSBrcmI1X2F1dGhfY29uX2dldHJjYWNoZSAga3NzbF9rcmI1X2F1dGhfY29uX2dldHJjYWNoZQorI2RlZmluZSBrcmI1X2dldF9zZXJ2ZXJfcmNhY2hlICAga3NzbF9rcmI1X2dldF9zZXJ2ZXJfcmNhY2hlCisKKy8qIFByb3RvdHlwZXMgZm9yIGJ1aWx0IGluIHN0dWJzICovCit2b2lkIGtzc2xfa3JiNV9mcmVlX2RhdGFfY29udGVudHMoa3JiNV9jb250ZXh0LCBrcmI1X2RhdGEgKik7Cit2b2lkIGtzc2xfa3JiNV9mcmVlX3ByaW5jaXBhbChrcmI1X2NvbnRleHQsIGtyYjVfcHJpbmNpcGFsICk7CitrcmI1X2Vycm9yX2NvZGUga3NzbF9rcmI1X2t0X3Jlc29sdmUoa3JiNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfa2V5dGFiICopOwora3JiNV9lcnJvcl9jb2RlIGtzc2xfa3JiNV9rdF9kZWZhdWx0KGtyYjVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2tleXRhYiAqKTsKK2tyYjVfZXJyb3JfY29kZSBrc3NsX2tyYjVfZnJlZV90aWNrZXQoa3JiNV9jb250ZXh0LCBrcmI1X3RpY2tldCAqKTsKK2tyYjVfZXJyb3JfY29kZSBrc3NsX2tyYjVfcmRfcmVxKGtyYjVfY29udGV4dCwga3JiNV9hdXRoX2NvbnRleHQgKiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NvbnN0IGtyYjVfZGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9jb25zdF9wcmluY2lwYWwsIGtyYjVfa2V5dGFiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfZmxhZ3MgKixrcmI1X3RpY2tldCAqKik7CisKK2tyYjVfYm9vbGVhbiBrc3NsX2tyYjVfcHJpbmNpcGFsX2NvbXBhcmUoa3JiNV9jb250ZXh0LCBrcmI1X2NvbnN0X3ByaW5jaXBhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9jb25zdF9wcmluY2lwYWwpOwora3JiNV9lcnJvcl9jb2RlIGtzc2xfa3JiNV9ta19yZXFfZXh0ZW5kZWQoa3JiNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9hdXRoX2NvbnRleHQgICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NvbnN0IGtyYjVfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2RhdGEgICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NyZWRzICAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kYXRhICAqICk7CitrcmI1X2Vycm9yX2NvZGUga3NzbF9rcmI1X2luaXRfY29udGV4dChrcmI1X2NvbnRleHQgKik7Cit2b2lkIGtzc2xfa3JiNV9mcmVlX2NvbnRleHQoa3JiNV9jb250ZXh0KTsKK2tyYjVfZXJyb3JfY29kZSBrc3NsX2tyYjVfY2NfZGVmYXVsdChrcmI1X2NvbnRleHQsa3JiNV9jY2FjaGUgICopOwora3JiNV9lcnJvcl9jb2RlIGtzc2xfa3JiNV9zbmFtZV90b19wcmluY2lwYWwoa3JiNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9jb25zdCBjaGFyICAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9jb25zdCBjaGFyICAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9pbnQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfcHJpbmNpcGFsICAqKTsKK2tyYjVfZXJyb3JfY29kZSBrc3NsX2tyYjVfZ2V0X2NyZWRlbnRpYWxzKGtyYjVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY29uc3Qga3JiNV9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9jcmVkcyAgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY3JlZHMgICogICopOwora3JiNV9lcnJvcl9jb2RlIGtzc2xfa3JiNV9hdXRoX2Nvbl9pbml0KGtyYjVfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2F1dGhfY29udGV4dCAgKik7CitrcmI1X2Vycm9yX2NvZGUga3NzbF9rcmI1X2NjX2dldF9wcmluY2lwYWwoa3JiNV9jb250ZXh0IGNvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY2NhY2hlIGNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfcHJpbmNpcGFsICpwcmluY2lwYWwpOwora3JiNV9lcnJvcl9jb2RlIGtzc2xfa3JiNV9hdXRoX2Nvbl9mcmVlKGtyYjVfY29udGV4dCxrcmI1X2F1dGhfY29udGV4dCk7CitzaXplX3Qga3NzbF9rcmI1X2NoZWNrc3VtX3NpemUoa3JiNV9jb250ZXh0IGNvbnRleHQsa3JiNV9ja3N1bXR5cGUgY3R5cGUpOwora3JiNV9ib29sZWFuIGtzc2xfdmFsaWRfY2tzdW10eXBlKGtyYjVfY2tzdW10eXBlIGN0eXBlKTsKK2tyYjVfZXJyb3JfY29kZSBrcmI1X2t0X2ZyZWVfZW50cnkoa3JiNV9jb250ZXh0LGtyYjVfa2V5dGFiX2VudHJ5IEZBUiAqICk7CitrcmI1X2Vycm9yX2NvZGUga3NzbF9rcmI1X2F1dGhfY29uX3NldHJjYWNoZShrcmI1X2NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9hdXRoX2NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9yY2FjaGUpOwora3JiNV9lcnJvcl9jb2RlIGtzc2xfa3JiNV9nZXRfc2VydmVyX3JjYWNoZShrcmI1X2NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NvbnN0IGtyYjVfZGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X3JjYWNoZSAqKTsKK2tyYjVfZXJyb3JfY29kZSBrc3NsX2tyYjVfYXV0aF9jb25fZ2V0cmNhY2hlKGtyYjVfY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2F1dGhfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfcmNhY2hlICopOworCisvKiBGdW5jdGlvbiBwb2ludGVycyAoYWxtb3N0IGFsbCBLZXJiZXJvcyBmdW5jdGlvbnMgYXJlIF9zdGRjYWxsKSAqLworc3RhdGljIHZvaWQgKF9zdGRjYWxsICpwX2tyYjVfZnJlZV9kYXRhX2NvbnRlbnRzKShrcmI1X2NvbnRleHQsIGtyYjVfZGF0YSAqKQorCT1OVUxMOworc3RhdGljIHZvaWQgKF9zdGRjYWxsICpwX2tyYjVfZnJlZV9wcmluY2lwYWwpKGtyYjVfY29udGV4dCwga3JiNV9wcmluY2lwYWwgKQorCT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZShfc3RkY2FsbCAqcF9rcmI1X2t0X3Jlc29sdmUpCisJCQkoa3JiNV9jb250ZXh0LCBrcmI1X2NvbnN0IGNoYXIgKiwga3JiNV9rZXl0YWIgKik9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICpwX2tyYjVfa3RfZGVmYXVsdCkoa3JiNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2tleXRhYiAqKT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZSAoX3N0ZGNhbGwgKnBfa3JiNV9mcmVlX3RpY2tldCkoa3JiNV9jb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfdGlja2V0ICopPU5VTEw7CitzdGF0aWMga3JiNV9lcnJvcl9jb2RlIChfc3RkY2FsbCAqcF9rcmI1X3JkX3JlcSkoa3JiNV9jb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2F1dGhfY29udGV4dCAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NvbnN0IGtyYjVfZGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY29uc3RfcHJpbmNpcGFsLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2tleXRhYiwga3JiNV9mbGFncyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfdGlja2V0ICoqKT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZSAoX3N0ZGNhbGwgKnBfa3JiNV9ta19yZXFfZXh0ZW5kZWQpCisJCQkoa3JiNV9jb250ZXh0LCBrcmI1X2F1dGhfY29udGV4dCAqLAorCQkJIGtyYjVfY29uc3Qga3JiNV9mbGFncywga3JiNV9kYXRhICosIGtyYjVfY3JlZHMgKiwKKwkJCSBrcmI1X2RhdGEgKiApPU5VTEw7CitzdGF0aWMga3JiNV9lcnJvcl9jb2RlIChfc3RkY2FsbCAqcF9rcmI1X2luaXRfY29udGV4dCkoa3JiNV9jb250ZXh0ICopPU5VTEw7CitzdGF0aWMgdm9pZCAoX3N0ZGNhbGwgKnBfa3JiNV9mcmVlX2NvbnRleHQpKGtyYjVfY29udGV4dCk9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICpwX2tyYjVfY2NfZGVmYXVsdCkoa3JiNV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NjYWNoZSAgKik9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICpwX2tyYjVfc25hbWVfdG9fcHJpbmNpcGFsKQorCQkJKGtyYjVfY29udGV4dCwga3JiNV9jb25zdCBjaGFyICosIGtyYjVfY29uc3QgY2hhciAqLAorCQkJIGtyYjVfaW50MzIsIGtyYjVfcHJpbmNpcGFsICopPU5VTEw7CitzdGF0aWMga3JiNV9lcnJvcl9jb2RlIChfc3RkY2FsbCAqcF9rcmI1X2dldF9jcmVkZW50aWFscykKKwkJCShrcmI1X2NvbnRleHQsIGtyYjVfY29uc3Qga3JiNV9mbGFncywga3JiNV9jY2FjaGUsCisJCQkga3JiNV9jcmVkcyAqLCBrcmI1X2NyZWRzICoqKT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZSAoX3N0ZGNhbGwgKnBfa3JiNV9hdXRoX2Nvbl9pbml0KQorCQkJKGtyYjVfY29udGV4dCwga3JiNV9hdXRoX2NvbnRleHQgKik9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICpwX2tyYjVfY2NfZ2V0X3ByaW5jaXBhbCkKKwkJCShrcmI1X2NvbnRleHQgY29udGV4dCwga3JiNV9jY2FjaGUgY2FjaGUsCisJCQkga3JiNV9wcmluY2lwYWwgKnByaW5jaXBhbCk9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICpwX2tyYjVfYXV0aF9jb25fZnJlZSkKKwkJCShrcmI1X2NvbnRleHQsIGtyYjVfYXV0aF9jb250ZXh0KT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZSAoX3N0ZGNhbGwgKnBfa3JiNV9kZWNyeXB0X3RrdF9wYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgKGtyYjVfY29udGV4dCwga3JiNV9jb25zdCBrcmI1X2tleWJsb2NrICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV90aWNrZXQgKik9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICpwX2tyYjVfdGltZW9mZGF5KQorICAgICAgICAgICAgICAgICAgICAgICAgKGtyYjVfY29udGV4dCBjb250ZXh0LCBrcmI1X2ludDMyICp0aW1lcmV0KT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZSAoX3N0ZGNhbGwgKnBfa3JiNV9yY19kZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgKGtyYjVfY29udGV4dCBjb250ZXh0LCBrcmI1X3JjYWNoZSAqcmMpPU5VTEw7CitzdGF0aWMga3JiNV9lcnJvcl9jb2RlIChfc3RkY2FsbCAqcF9rcmI1X3JjX2luaXRpYWxpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAoa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfcmNhY2hlIHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfZGVsdGF0IGxpZmVzcGFuKT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZSAoX3N0ZGNhbGwgKnBfa3JiNV9yY19nZXRfbGlmZXNwYW4pCisgICAgICAgICAgICAgICAgICAgICAgICAoa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfcmNhY2hlIHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9kZWx0YXQgKmxpZmVzcGFuKT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZSAoX3N0ZGNhbGwgKnBfa3JiNV9yY19kZXN0cm95KQorICAgICAgICAgICAgICAgICAgICAgICAgKGtyYjVfY29udGV4dCBjb250ZXh0LCBrcmI1X3JjYWNoZSByYyk9TlVMTDsKK3N0YXRpYyBrcmI1X2Jvb2xlYW4gKF9zdGRjYWxsICpwX2tyYjVfcHJpbmNpcGFsX2NvbXBhcmUpCisgICAgICAgICAgICAgICAgICAgICAoa3JiNV9jb250ZXh0LCBrcmI1X2NvbnN0X3ByaW5jaXBhbCwga3JiNV9jb25zdF9wcmluY2lwYWwpPU5VTEw7CitzdGF0aWMgc2l6ZV90IChfc3RkY2FsbCAqcF9rcmI1X2NoZWNrc3VtX3NpemUpKGtyYjVfY29udGV4dCBjb250ZXh0LGtyYjVfY2tzdW10eXBlIGN0eXBlKT1OVUxMOworc3RhdGljIGtyYjVfYm9vbGVhbiAoX3N0ZGNhbGwgKnBfdmFsaWRfY2tzdW10eXBlKShrcmI1X2Nrc3VtdHlwZSBjdHlwZSk9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICpwX2tyYjVfa3RfZnJlZV9lbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgIChrcmI1X2NvbnRleHQsa3JiNV9rZXl0YWJfZW50cnkgKiApPU5VTEw7CitzdGF0aWMga3JiNV9lcnJvcl9jb2RlIChfc3RkY2FsbCAqIHBfa3JiNV9hdXRoX2Nvbl9zZXRyY2FjaGUpKGtyYjVfY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2F1dGhfY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X3JjYWNoZSk9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICogcF9rcmI1X2dldF9zZXJ2ZXJfcmNhY2hlKShrcmI1X2NvbnRleHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NvbnN0IGtyYjVfZGF0YSAqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9yY2FjaGUgKik9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKCogcF9rcmI1X2F1dGhfY29uX2dldHJjYWNoZSkoa3JiNV9jb250ZXh0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfYXV0aF9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9yY2FjaGUgKik9TlVMTDsKK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUgKF9zdGRjYWxsICogcF9rcmI1X2t0X2Nsb3NlKShrcmI1X2NvbnRleHQgY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9rZXl0YWIga2V5dGFiKT1OVUxMOworc3RhdGljIGtyYjVfZXJyb3JfY29kZSAoX3N0ZGNhbGwgKiBwX2tyYjVfa3RfZ2V0X2VudHJ5KShrcmI1X2NvbnRleHQgY29udGV4dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfa2V5dGFiIGtleXRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAga3JiNV9jb25zdF9wcmluY2lwYWwgcHJpbmNpcGFsLCBrcmI1X2t2bm8gdm5vLAorICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2VuY3R5cGUgZW5jdHlwZSwga3JiNV9rZXl0YWJfZW50cnkgKmVudHJ5KT1OVUxMOworc3RhdGljIGludCBrcmI1X2xvYWRlZCA9IDA7ICAgICAvKiBvbmx5IGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSBmdW5jIHB0cnMgb25jZSAqLworCisvKiBGdW5jdGlvbiB0byBMb2FkIHRoZSBLZXJiZXJvcyA1IERMTCBhbmQgaW5pdGlhbGl6ZSBmdW5jdGlvbiBwb2ludGVycyAqLwordm9pZAorbG9hZF9rcmI1X2RsbCh2b2lkKQorCXsKKwlIQU5ETEUgaEtSQjVfMzI7CisgICAgCisJa3JiNV9sb2FkZWQrKzsKKwloS1JCNV8zMiA9IExvYWRMaWJyYXJ5KFRFWFQoIktSQjVfMzIiKSk7CisJaWYgKCFoS1JCNV8zMikKKwkJcmV0dXJuOworCisJKEZBUlBST0MpIHBfa3JiNV9mcmVlX2RhdGFfY29udGVudHMgPQorCQlHZXRQcm9jQWRkcmVzcyggaEtSQjVfMzIsICJrcmI1X2ZyZWVfZGF0YV9jb250ZW50cyIgKTsKKwkoRkFSUFJPQykgcF9rcmI1X2ZyZWVfY29udGV4dCA9CisJCUdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfZnJlZV9jb250ZXh0IiApOworCShGQVJQUk9DKSBwX2tyYjVfYXV0aF9jb25fZnJlZSA9CisJCUdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfYXV0aF9jb25fZnJlZSIgKTsKKwkoRkFSUFJPQykgcF9rcmI1X2ZyZWVfcHJpbmNpcGFsID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9mcmVlX3ByaW5jaXBhbCIgKTsKKwkoRkFSUFJPQykgcF9rcmI1X21rX3JlcV9leHRlbmRlZCA9CisJCUdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfbWtfcmVxX2V4dGVuZGVkIiApOworCShGQVJQUk9DKSBwX2tyYjVfZ2V0X2NyZWRlbnRpYWxzID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9nZXRfY3JlZGVudGlhbHMiICk7CisJKEZBUlBST0MpIHBfa3JiNV9jY19nZXRfcHJpbmNpcGFsID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9jY19nZXRfcHJpbmNpcGFsIiApOworCShGQVJQUk9DKSBwX2tyYjVfY2NfZGVmYXVsdCA9CisJCUdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfY2NfZGVmYXVsdCIgKTsKKwkoRkFSUFJPQykgcF9rcmI1X3NuYW1lX3RvX3ByaW5jaXBhbCA9CisJCUdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfc25hbWVfdG9fcHJpbmNpcGFsIiApOworCShGQVJQUk9DKSBwX2tyYjVfaW5pdF9jb250ZXh0ID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9pbml0X2NvbnRleHQiICk7CisJKEZBUlBST0MpIHBfa3JiNV9mcmVlX3RpY2tldCA9CisJCUdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfZnJlZV90aWNrZXQiICk7CisJKEZBUlBST0MpIHBfa3JiNV9yZF9yZXEgPQorCQlHZXRQcm9jQWRkcmVzcyggaEtSQjVfMzIsICJrcmI1X3JkX3JlcSIgKTsKKwkoRkFSUFJPQykgcF9rcmI1X3ByaW5jaXBhbF9jb21wYXJlID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9wcmluY2lwYWxfY29tcGFyZSIgKTsKKwkoRkFSUFJPQykgcF9rcmI1X2RlY3J5cHRfdGt0X3BhcnQgPQorCQlHZXRQcm9jQWRkcmVzcyggaEtSQjVfMzIsICJrcmI1X2RlY3J5cHRfdGt0X3BhcnQiICk7CisJKEZBUlBST0MpIHBfa3JiNV90aW1lb2ZkYXkgPQorCQlHZXRQcm9jQWRkcmVzcyggaEtSQjVfMzIsICJrcmI1X3RpbWVvZmRheSIgKTsKKwkoRkFSUFJPQykgcF9rcmI1X3JjX2RlZmF1bHQgPQorCQlHZXRQcm9jQWRkcmVzcyggaEtSQjVfMzIsICJrcmI1X3JjX2RlZmF1bHQiICk7CisJKEZBUlBST0MpIHBfa3JiNV9yY19pbml0aWFsaXplID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9yY19pbml0aWFsaXplIiApOworCShGQVJQUk9DKSBwX2tyYjVfcmNfZ2V0X2xpZmVzcGFuID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9yY19nZXRfbGlmZXNwYW4iICk7CisJKEZBUlBST0MpIHBfa3JiNV9yY19kZXN0cm95ID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9yY19kZXN0cm95IiApOworCShGQVJQUk9DKSBwX2tyYjVfa3RfZGVmYXVsdCA9CisJCUdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfa3RfZGVmYXVsdCIgKTsKKwkoRkFSUFJPQykgcF9rcmI1X2t0X3Jlc29sdmUgPQorCQlHZXRQcm9jQWRkcmVzcyggaEtSQjVfMzIsICJrcmI1X2t0X3Jlc29sdmUiICk7CisJKEZBUlBST0MpIHBfa3JiNV9hdXRoX2Nvbl9pbml0ID0KKwkJR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9hdXRoX2Nvbl9pbml0IiApOworICAgICAgICAoRkFSUFJPQykgcF92YWxpZF9ja3N1bXR5cGUgPQorICAgICAgICAgICAgICAgIEdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgInZhbGlkX2Nrc3VtdHlwZSIgKTsKKyAgICAgICAgKEZBUlBST0MpIHBfa3JiNV9jaGVja3N1bV9zaXplID0KKyAgICAgICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyggaEtSQjVfMzIsICJrcmI1X2NoZWNrc3VtX3NpemUiICk7CisgICAgICAgIChGQVJQUk9DKSBwX2tyYjVfa3RfZnJlZV9lbnRyeSA9CisgICAgICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9rdF9mcmVlX2VudHJ5IiApOworICAgICAgICAoRkFSUFJPQykgcF9rcmI1X2F1dGhfY29uX3NldHJjYWNoZSA9CisgICAgICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9hdXRoX2Nvbl9zZXRyY2FjaGUiICk7CisgICAgICAgIChGQVJQUk9DKSBwX2tyYjVfZ2V0X3NlcnZlcl9yY2FjaGUgPQorICAgICAgICAgICAgICAgIEdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfZ2V0X3NlcnZlcl9yY2FjaGUiICk7CisgICAgICAgIChGQVJQUk9DKSBwX2tyYjVfYXV0aF9jb25fZ2V0cmNhY2hlID0KKyAgICAgICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyggaEtSQjVfMzIsICJrcmI1X2F1dGhfY29uX2dldHJjYWNoZSIgKTsKKyAgICAgICAgKEZBUlBST0MpIHBfa3JiNV9rdF9jbG9zZSA9CisgICAgICAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MoIGhLUkI1XzMyLCAia3JiNV9rdF9jbG9zZSIgKTsKKyAgICAgICAgKEZBUlBST0MpIHBfa3JiNV9rdF9nZXRfZW50cnkgPQorICAgICAgICAgICAgICAgIEdldFByb2NBZGRyZXNzKCBoS1JCNV8zMiwgImtyYjVfa3RfZ2V0X2VudHJ5IiApOworCX0KKworLyogU3R1YnMgZm9yIGVhY2ggZnVuY3Rpb24gdG8gYmUgZHluYW1pY2x5IGxvYWRlZCAqLwordm9pZAora3NzbF9rcmI1X2ZyZWVfZGF0YV9jb250ZW50cyhrcmI1X2NvbnRleHQgQ08sIGtyYjVfZGF0YSAgKiBkYXRhKQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9mcmVlX2RhdGFfY29udGVudHMgKQorCQlwX2tyYjVfZnJlZV9kYXRhX2NvbnRlbnRzKENPLGRhdGEpOworCX0KKwora3JiNV9lcnJvcl9jb2RlCitrc3NsX2tyYjVfbWtfcmVxX2V4dGVuZGVkIChrcmI1X2NvbnRleHQgQ08sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfYXV0aF9jb250ZXh0ICAqIHBBQ08sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY29uc3Qga3JiNV9mbGFncyBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2RhdGEgICogcEQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NyZWRzICAqIHBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2RhdGEgICogcEQyKQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9ta19yZXFfZXh0ZW5kZWQgKQorCQlyZXR1cm4ocF9rcmI1X21rX3JlcV9leHRlbmRlZChDTyxwQUNPLEYscEQxLHBDLHBEMikpOworCWVsc2UKKwkJcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJfQora3JiNV9lcnJvcl9jb2RlCitrc3NsX2tyYjVfYXV0aF9jb25faW5pdChrcmI1X2NvbnRleHQgQ08sCisgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfYXV0aF9jb250ZXh0ICAqIHBBQ08pCisJeworCWlmICgha3JiNV9sb2FkZWQpCisJCWxvYWRfa3JiNV9kbGwoKTsKKworCWlmICggcF9rcmI1X2F1dGhfY29uX2luaXQgKQorCQlyZXR1cm4ocF9rcmI1X2F1dGhfY29uX2luaXQoQ08scEFDTykpOworCWVsc2UKKwkJcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJfQora3JiNV9lcnJvcl9jb2RlCitrc3NsX2tyYjVfYXV0aF9jb25fZnJlZSAoa3JiNV9jb250ZXh0IENPLAorICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9hdXRoX2NvbnRleHQgQUNPKQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9hdXRoX2Nvbl9mcmVlICkKKwkJcmV0dXJuKHBfa3JiNV9hdXRoX2Nvbl9mcmVlKENPLEFDTykpOworCWVsc2UKKwkJcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJfQora3JiNV9lcnJvcl9jb2RlCitrc3NsX2tyYjVfZ2V0X2NyZWRlbnRpYWxzKGtyYjVfY29udGV4dCBDTywKKyAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NvbnN0IGtyYjVfZmxhZ3MgRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NjYWNoZSBDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NyZWRzICAqIHBDUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2NyZWRzICAqKiBwcENSKQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9nZXRfY3JlZGVudGlhbHMgKQorCQlyZXR1cm4ocF9rcmI1X2dldF9jcmVkZW50aWFscyhDTyxGLENDLHBDUixwcENSKSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CitrcmI1X2Vycm9yX2NvZGUKK2tzc2xfa3JiNV9zbmFtZV90b19wcmluY2lwYWwoa3JiNV9jb250ZXh0IENPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY29uc3QgY2hhciAgKiBwQzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9jb25zdCBjaGFyICAqIHBDMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X2ludDMyIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9wcmluY2lwYWwgICogcFBSKQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9zbmFtZV90b19wcmluY2lwYWwgKQorCQlyZXR1cm4ocF9rcmI1X3NuYW1lX3RvX3ByaW5jaXBhbChDTyxwQzEscEMyLEkscFBSKSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CisKK2tyYjVfZXJyb3JfY29kZQora3NzbF9rcmI1X2NjX2RlZmF1bHQoa3JiNV9jb250ZXh0IENPLAorICAgICAgICAgICAgICAgICAgICBrcmI1X2NjYWNoZSAgKiBwQ0MpCisJeworCWlmICgha3JiNV9sb2FkZWQpCisJCWxvYWRfa3JiNV9kbGwoKTsKKworCWlmICggcF9rcmI1X2NjX2RlZmF1bHQgKQorCQlyZXR1cm4ocF9rcmI1X2NjX2RlZmF1bHQoQ08scENDKSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CisKK2tyYjVfZXJyb3JfY29kZQora3NzbF9rcmI1X2luaXRfY29udGV4dChrcmI1X2NvbnRleHQgKiBwQ08pCisJeworCWlmICgha3JiNV9sb2FkZWQpCisJCWxvYWRfa3JiNV9kbGwoKTsKKworCWlmICggcF9rcmI1X2luaXRfY29udGV4dCApCisJCXJldHVybihwX2tyYjVfaW5pdF9jb250ZXh0KHBDTykpOworCWVsc2UKKwkJcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJfQorCit2b2lkCitrc3NsX2tyYjVfZnJlZV9jb250ZXh0KGtyYjVfY29udGV4dCBDTykKKwl7CisJaWYgKCFrcmI1X2xvYWRlZCkKKwkJbG9hZF9rcmI1X2RsbCgpOworCisJaWYgKCBwX2tyYjVfZnJlZV9jb250ZXh0ICkKKwkJcF9rcmI1X2ZyZWVfY29udGV4dChDTyk7CisJfQorCit2b2lkCitrc3NsX2tyYjVfZnJlZV9wcmluY2lwYWwoa3JiNV9jb250ZXh0IGMsIGtyYjVfcHJpbmNpcGFsIHApCisJeworCWlmICgha3JiNV9sb2FkZWQpCisJCWxvYWRfa3JiNV9kbGwoKTsKKworCWlmICggcF9rcmI1X2ZyZWVfcHJpbmNpcGFsICkKKwkJcF9rcmI1X2ZyZWVfcHJpbmNpcGFsKGMscCk7CisJfQorCitrcmI1X2Vycm9yX2NvZGUKK2tzc2xfa3JiNV9rdF9yZXNvbHZlKGtyYjVfY29udGV4dCBjb24sCisgICAgICAgICAgICAgICAgICAgIGtyYjVfY29uc3QgY2hhciAqIHN6LAorICAgICAgICAgICAgICAgICAgICBrcmI1X2tleXRhYiAqIGt0KQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9rdF9yZXNvbHZlICkKKwkJcmV0dXJuKHBfa3JiNV9rdF9yZXNvbHZlKGNvbixzeixrdCkpOworCWVsc2UKKwkJcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJfQorCitrcmI1X2Vycm9yX2NvZGUKK2tzc2xfa3JiNV9rdF9kZWZhdWx0KGtyYjVfY29udGV4dCBjb24sCisgICAgICAgICAgICAgICAgICAgIGtyYjVfa2V5dGFiICoga3QpCisJeworCWlmICgha3JiNV9sb2FkZWQpCisJCWxvYWRfa3JiNV9kbGwoKTsKKworCWlmICggcF9rcmI1X2t0X2RlZmF1bHQgKQorCQlyZXR1cm4ocF9rcmI1X2t0X2RlZmF1bHQoY29uLGt0KSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CisKK2tyYjVfZXJyb3JfY29kZQora3NzbF9rcmI1X2ZyZWVfdGlja2V0KGtyYjVfY29udGV4dCBjb24sCisgICAgICAgICAgICAgICAgICAgICBrcmI1X3RpY2tldCAqIGt0KQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9mcmVlX3RpY2tldCApCisJCXJldHVybihwX2tyYjVfZnJlZV90aWNrZXQoY29uLGt0KSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CisKK2tyYjVfZXJyb3JfY29kZQora3NzbF9rcmI1X3JkX3JlcShrcmI1X2NvbnRleHQgY29uLCBrcmI1X2F1dGhfY29udGV4dCAqIHBhY29uLAorICAgICAgICAgICAgICAgIGtyYjVfY29uc3Qga3JiNV9kYXRhICogZGF0YSwKKyAgICAgICAgICAgICAgICBrcmI1X2NvbnN0X3ByaW5jaXBhbCBwcmluYywga3JiNV9rZXl0YWIga2V5dGFiLAorICAgICAgICAgICAgICAgIGtyYjVfZmxhZ3MgKiBmbGFncywga3JiNV90aWNrZXQgKiogcHB0a3QpCisJeworCWlmICgha3JiNV9sb2FkZWQpCisJCWxvYWRfa3JiNV9kbGwoKTsKKworCWlmICggcF9rcmI1X3JkX3JlcSApCisJCXJldHVybihwX2tyYjVfcmRfcmVxKGNvbixwYWNvbixkYXRhLHByaW5jLGtleXRhYixmbGFncyxwcHRrdCkpOworCWVsc2UKKwkJcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJfQorCitrcmI1X2Jvb2xlYW4KK2tyYjVfcHJpbmNpcGFsX2NvbXBhcmUoa3JiNV9jb250ZXh0IGNvbiwga3JiNV9jb25zdF9wcmluY2lwYWwgcHJpbmMxLAorICAgICAgICAgICAgICAgIGtyYjVfY29uc3RfcHJpbmNpcGFsIHByaW5jMikKKwl7CisJaWYgKCFrcmI1X2xvYWRlZCkKKwkJbG9hZF9rcmI1X2RsbCgpOworCisJaWYgKCBwX2tyYjVfcHJpbmNpcGFsX2NvbXBhcmUgKQorCQlyZXR1cm4ocF9rcmI1X3ByaW5jaXBhbF9jb21wYXJlKGNvbixwcmluYzEscHJpbmMyKSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CisKK2tyYjVfZXJyb3JfY29kZQora3JiNV9kZWNyeXB0X3RrdF9wYXJ0KGtyYjVfY29udGV4dCBjb24sIGtyYjVfY29uc3Qga3JiNV9rZXlibG9jayAqa2V5cywKKyAgICAgICAgICAgICAgICBrcmI1X3RpY2tldCAqdGlja2V0KQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9kZWNyeXB0X3RrdF9wYXJ0ICkKKwkJcmV0dXJuKHBfa3JiNV9kZWNyeXB0X3RrdF9wYXJ0KGNvbixrZXlzLHRpY2tldCkpOworCWVsc2UKKwkJcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJfQorCitrcmI1X2Vycm9yX2NvZGUKK2tyYjVfdGltZW9mZGF5KGtyYjVfY29udGV4dCBjb24sIGtyYjVfaW50MzIgKnRpbWVyZXQpCisJeworCWlmICgha3JiNV9sb2FkZWQpCisJCWxvYWRfa3JiNV9kbGwoKTsKKworCWlmICggcF9rcmI1X3RpbWVvZmRheSApCisJCXJldHVybihwX2tyYjVfdGltZW9mZGF5KGNvbix0aW1lcmV0KSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CisKK2tyYjVfZXJyb3JfY29kZQora3JiNV9yY19kZWZhdWx0KGtyYjVfY29udGV4dCBjb24sIGtyYjVfcmNhY2hlICpyYykKKwl7CisJaWYgKCFrcmI1X2xvYWRlZCkKKwkJbG9hZF9rcmI1X2RsbCgpOworCisJaWYgKCBwX2tyYjVfcmNfZGVmYXVsdCApCisJCXJldHVybihwX2tyYjVfcmNfZGVmYXVsdChjb24scmMpKTsKKwllbHNlCisJCXJldHVybiBLUkI1S1JCX0VSUl9HRU5FUklDOworCX0KKwora3JiNV9lcnJvcl9jb2RlCitrcmI1X3JjX2luaXRpYWxpemUoa3JiNV9jb250ZXh0IGNvbiwga3JiNV9yY2FjaGUgcmMsIGtyYjVfZGVsdGF0IGxpZmVzcGFuKQorCXsKKwlpZiAoIWtyYjVfbG9hZGVkKQorCQlsb2FkX2tyYjVfZGxsKCk7CisKKwlpZiAoIHBfa3JiNV9yY19pbml0aWFsaXplICkKKwkJcmV0dXJuKHBfa3JiNV9yY19pbml0aWFsaXplKGNvbiwgcmMsIGxpZmVzcGFuKSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CisKK2tyYjVfZXJyb3JfY29kZQora3JiNV9yY19nZXRfbGlmZXNwYW4oa3JiNV9jb250ZXh0IGNvbiwga3JiNV9yY2FjaGUgcmMsIGtyYjVfZGVsdGF0ICpsaWZlc3BhbnApCisJeworCWlmICgha3JiNV9sb2FkZWQpCisJCWxvYWRfa3JiNV9kbGwoKTsKKworCWlmICggcF9rcmI1X3JjX2dldF9saWZlc3BhbiApCisJCXJldHVybihwX2tyYjVfcmNfZ2V0X2xpZmVzcGFuKGNvbiwgcmMsIGxpZmVzcGFucCkpOworCWVsc2UKKwkJcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJfQorCitrcmI1X2Vycm9yX2NvZGUKK2tyYjVfcmNfZGVzdHJveShrcmI1X2NvbnRleHQgY29uLCBrcmI1X3JjYWNoZSByYykKKwl7CisJaWYgKCFrcmI1X2xvYWRlZCkKKwkJbG9hZF9rcmI1X2RsbCgpOworCisJaWYgKCBwX2tyYjVfcmNfZGVzdHJveSApCisJCXJldHVybihwX2tyYjVfcmNfZGVzdHJveShjb24sIHJjKSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwl9CisKK3NpemVfdCAKK2tyYjVfY2hlY2tzdW1fc2l6ZShrcmI1X2NvbnRleHQgY29udGV4dCxrcmI1X2Nrc3VtdHlwZSBjdHlwZSkKKyAgICAgICAgeworICAgICAgICBpZiAoIWtyYjVfbG9hZGVkKQorICAgICAgICAgICAgICAgIGxvYWRfa3JiNV9kbGwoKTsKKworICAgICAgICBpZiAoIHBfa3JiNV9jaGVja3N1bV9zaXplICkKKyAgICAgICAgICAgICAgICByZXR1cm4ocF9rcmI1X2NoZWNrc3VtX3NpemUoY29udGV4dCwgY3R5cGUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBLUkI1S1JCX0VSUl9HRU5FUklDOworICAgICAgICB9CisKK2tyYjVfYm9vbGVhbiAKK3ZhbGlkX2Nrc3VtdHlwZShrcmI1X2Nrc3VtdHlwZSBjdHlwZSkKKyAgICAgICAgeworICAgICAgICBpZiAoIWtyYjVfbG9hZGVkKQorICAgICAgICAgICAgICAgIGxvYWRfa3JiNV9kbGwoKTsKKworICAgICAgICBpZiAoIHBfdmFsaWRfY2tzdW10eXBlICkKKyAgICAgICAgICAgICAgICByZXR1cm4ocF92YWxpZF9ja3N1bXR5cGUoY3R5cGUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBLUkI1S1JCX0VSUl9HRU5FUklDOworICAgICAgICB9CisKK2tyYjVfZXJyb3JfY29kZSAKK2tyYjVfa3RfZnJlZV9lbnRyeShrcmI1X2NvbnRleHQgY29uLGtyYjVfa2V5dGFiX2VudHJ5ICogZW50cnkpCisgICAgICAgIHsKKyAgICAgICAgaWYgKCFrcmI1X2xvYWRlZCkKKyAgICAgICAgICAgICAgICBsb2FkX2tyYjVfZGxsKCk7CisKKyAgICAgICAgaWYgKCBwX2tyYjVfa3RfZnJlZV9lbnRyeSApCisgICAgICAgICAgICAgICAgcmV0dXJuKHBfa3JiNV9rdF9mcmVlX2VudHJ5KGNvbixlbnRyeSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIEtSQjVLUkJfRVJSX0dFTkVSSUM7CisgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgCisvKiBTdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgICovCisjaWZuZGVmIE5PX0RFRl9LUkI1X0NDQUNIRQorI2lmbmRlZiBrcmI1X3gKKyNkZWZpbmUga3JiNV94KHB0cixhcmdzKSAoKHB0cik/KCgqKHB0cikpIGFyZ3MpOihhYm9ydCgpLDEpKQorI2RlZmluZSBrcmI1X3hjKHB0cixhcmdzKSAoKHB0cik/KCgqKHB0cikpIGFyZ3MpOihhYm9ydCgpLChjaGFyKikwKSkKKyNlbmRpZiAKKwordHlwZWRlZglrcmI1X3BvaW50ZXIJa3JiNV9jY19jdXJzb3I7CS8qIGN1cnNvciBmb3Igc2VxdWVudGlhbCBsb29rdXAgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2tyYjVfY2NhY2hlCisJeworCWtyYjVfbWFnaWMgbWFnaWM7CisJc3RydWN0IF9rcmI1X2NjX29wcyBGQVIgKm9wczsKKwlrcmI1X3BvaW50ZXIgZGF0YTsKKwl9ICprcmI1X2NjYWNoZTsKKwordHlwZWRlZiBzdHJ1Y3QgX2tyYjVfY2Nfb3BzCisJeworCWtyYjVfbWFnaWMgbWFnaWM7CisJY2hhciAgKnByZWZpeDsKKwljaGFyICAqIChLUkI1X0NBTExDT05WICpnZXRfbmFtZSkKKwkJKGtyYjVfY29udGV4dCwga3JiNV9jY2FjaGUpOworCWtyYjVfZXJyb3JfY29kZSAoS1JCNV9DQUxMQ09OViAqcmVzb2x2ZSkKKwkJKGtyYjVfY29udGV4dCwga3JiNV9jY2FjaGUgICosIGNvbnN0IGNoYXIgICopOworCWtyYjVfZXJyb3JfY29kZSAoS1JCNV9DQUxMQ09OViAqZ2VuX25ldykKKwkJKGtyYjVfY29udGV4dCwga3JiNV9jY2FjaGUgICopOworCWtyYjVfZXJyb3JfY29kZSAoS1JCNV9DQUxMQ09OViAqaW5pdCkKKwkJKGtyYjVfY29udGV4dCwga3JiNV9jY2FjaGUsIGtyYjVfcHJpbmNpcGFsKTsKKwlrcmI1X2Vycm9yX2NvZGUgKEtSQjVfQ0FMTENPTlYgKmRlc3Ryb3kpCisJCShrcmI1X2NvbnRleHQsIGtyYjVfY2NhY2hlKTsKKwlrcmI1X2Vycm9yX2NvZGUgKEtSQjVfQ0FMTENPTlYgKmNsb3NlKQorCQkoa3JiNV9jb250ZXh0LCBrcmI1X2NjYWNoZSk7CisJa3JiNV9lcnJvcl9jb2RlIChLUkI1X0NBTExDT05WICpzdG9yZSkKKwkJKGtyYjVfY29udGV4dCwga3JiNV9jY2FjaGUsIGtyYjVfY3JlZHMgICopOworCWtyYjVfZXJyb3JfY29kZSAoS1JCNV9DQUxMQ09OViAqcmV0cmlldmUpCisJCShrcmI1X2NvbnRleHQsIGtyYjVfY2NhY2hlLAorCQlrcmI1X2ZsYWdzLCBrcmI1X2NyZWRzICAqLCBrcmI1X2NyZWRzICAqKTsKKwlrcmI1X2Vycm9yX2NvZGUgKEtSQjVfQ0FMTENPTlYgKmdldF9wcmluYykKKwkJKGtyYjVfY29udGV4dCwga3JiNV9jY2FjaGUsIGtyYjVfcHJpbmNpcGFsICAqKTsKKwlrcmI1X2Vycm9yX2NvZGUgKEtSQjVfQ0FMTENPTlYgKmdldF9maXJzdCkKKwkJKGtyYjVfY29udGV4dCwga3JiNV9jY2FjaGUsIGtyYjVfY2NfY3Vyc29yICAqKTsKKwlrcmI1X2Vycm9yX2NvZGUgKEtSQjVfQ0FMTENPTlYgKmdldF9uZXh0KQorCQkoa3JiNV9jb250ZXh0LCBrcmI1X2NjYWNoZSwKKwkJa3JiNV9jY19jdXJzb3IgICosIGtyYjVfY3JlZHMgICopOworCWtyYjVfZXJyb3JfY29kZSAoS1JCNV9DQUxMQ09OViAqZW5kX2dldCkKKwkJKGtyYjVfY29udGV4dCwga3JiNV9jY2FjaGUsIGtyYjVfY2NfY3Vyc29yICAqKTsKKwlrcmI1X2Vycm9yX2NvZGUgKEtSQjVfQ0FMTENPTlYgKnJlbW92ZV9jcmVkKQorCQkoa3JiNV9jb250ZXh0LCBrcmI1X2NjYWNoZSwKKwkJa3JiNV9mbGFncywga3JiNV9jcmVkcyAgKik7CisJa3JiNV9lcnJvcl9jb2RlIChLUkI1X0NBTExDT05WICpzZXRfZmxhZ3MpCisJCShrcmI1X2NvbnRleHQsIGtyYjVfY2NhY2hlLCBrcmI1X2ZsYWdzKTsKKwl9IGtyYjVfY2Nfb3BzOworI2VuZGlmIC8qIE5PX0RFRl9LUkI1X0NDQUNIRSAqLworCitrcmI1X2Vycm9yX2NvZGUgCitrc3NsX2tyYjVfY2NfZ2V0X3ByaW5jaXBhbAorICAgIChrcmI1X2NvbnRleHQgY29udGV4dCwga3JiNV9jY2FjaGUgY2FjaGUsCisgICAgICBrcmI1X3ByaW5jaXBhbCAqcHJpbmNpcGFsKQorCXsKKwlpZiAoIHBfa3JiNV9jY19nZXRfcHJpbmNpcGFsICkKKwkJcmV0dXJuKHBfa3JiNV9jY19nZXRfcHJpbmNpcGFsKGNvbnRleHQsY2FjaGUscHJpbmNpcGFsKSk7CisJZWxzZQorCQlyZXR1cm4oa3JiNV94CisJCQkoKGNhY2hlKS0+b3BzLT5nZXRfcHJpbmMsKGNvbnRleHQsIGNhY2hlLCBwcmluY2lwYWwpKSk7CisJfQorCitrcmI1X2Vycm9yX2NvZGUKK2tzc2xfa3JiNV9hdXRoX2Nvbl9zZXRyY2FjaGUoa3JiNV9jb250ZXh0IGNvbiwga3JiNV9hdXRoX2NvbnRleHQgYWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9yY2FjaGUgcmNhY2hlKQorICAgICAgICB7CisgICAgICAgIGlmICggcF9rcmI1X2F1dGhfY29uX3NldHJjYWNoZSApCisgICAgICAgICAgICAgICAgIHJldHVybihwX2tyYjVfYXV0aF9jb25fc2V0cmNhY2hlKGNvbixhY29uLHJjYWNoZSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgIHJldHVybiBLUkI1S1JCX0VSUl9HRU5FUklDOworICAgICAgICB9CisKK2tyYjVfZXJyb3JfY29kZQora3NzbF9rcmI1X2dldF9zZXJ2ZXJfcmNhY2hlKGtyYjVfY29udGV4dCBjb24sIGtyYjVfY29uc3Qga3JiNV9kYXRhICogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrcmI1X3JjYWNoZSAqIHJjYWNoZSkgCisgICAgICAgIHsKKwlpZiAoIHBfa3JiNV9nZXRfc2VydmVyX3JjYWNoZSApCisJCXJldHVybihwX2tyYjVfZ2V0X3NlcnZlcl9yY2FjaGUoY29uLGRhdGEscmNhY2hlKSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKyAgICAgICAgfQorCitrcmI1X2Vycm9yX2NvZGUKK2tzc2xfa3JiNV9hdXRoX2Nvbl9nZXRyY2FjaGUoa3JiNV9jb250ZXh0IGNvbiwga3JiNV9hdXRoX2NvbnRleHQgYWNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3JiNV9yY2FjaGUgKiBwcmNhY2hlKQorICAgICAgICB7CisJaWYgKCBwX2tyYjVfYXV0aF9jb25fZ2V0cmNhY2hlICkKKwkJcmV0dXJuKHBfa3JiNV9hdXRoX2Nvbl9nZXRyY2FjaGUoY29uLGFjb24sIHByY2FjaGUpKTsKKwllbHNlCisJCXJldHVybiBLUkI1S1JCX0VSUl9HRU5FUklDOworCX0KKyAKK2tyYjVfZXJyb3JfY29kZQora3NzbF9rcmI1X2t0X2Nsb3NlKGtyYjVfY29udGV4dCBjb250ZXh0LCBrcmI1X2tleXRhYiBrZXl0YWIpCisJeworCWlmICggcF9rcmI1X2t0X2Nsb3NlICkKKwkJcmV0dXJuKHBfa3JiNV9rdF9jbG9zZShjb250ZXh0LGtleXRhYikpOworCWVsc2UgCisJCXJldHVybiBLUkI1S1JCX0VSUl9HRU5FUklDOworCX0KKwora3JiNV9lcnJvcl9jb2RlCitrc3NsX2tyYjVfa3RfZ2V0X2VudHJ5KGtyYjVfY29udGV4dCBjb250ZXh0LCBrcmI1X2tleXRhYiBrZXl0YWIsCisgICAgICAgICAgICAgICAgICAgICAgIGtyYjVfY29uc3RfcHJpbmNpcGFsIHByaW5jaXBhbCwga3JiNV9rdm5vIHZubywKKyAgICAgICAgICAgICAgICAgICAgICAga3JiNV9lbmN0eXBlIGVuY3R5cGUsIGtyYjVfa2V5dGFiX2VudHJ5ICplbnRyeSkKKwl7CisJaWYgKCBwX2tyYjVfa3RfZ2V0X2VudHJ5ICkKKwkJcmV0dXJuKHBfa3JiNV9rdF9nZXRfZW50cnkoY29udGV4dCxrZXl0YWIscHJpbmNpcGFsLHZubyxlbmN0eXBlLGVudHJ5KSk7CisJZWxzZQorCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKyAgICAgICAgfQorI2VuZGlmICAvKiBPUEVOU1NMX1NZU19XSU5ET1dTIHx8IE9QRU5TU0xfU1lTX1dJTjMyICovCisKKworLyogbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGZvciBub24tdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIChlLmcuIHN0dWZmIHRoYXQgZ2V0cyBzYXZlZCBpbnRvIHRoZSBrc3NsIGNvbnRleHQpICovCitzdGF0aWMgdm9pZCoga3NzbF9jYWxsb2Moc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkKiBwOworCQorCXA9T1BFTlNTTF9tYWxsb2Mobm1lbWIqc2l6ZSk7CisJaWYgKHApeworCQltZW1zZXQocCwgMCwgbm1lbWIqc2l6ZSk7CisJfQorCXJldHVybiBwOworfQorCisjZGVmaW5lIGtzc2xfbWFsbG9jKHNpemUpIE9QRU5TU0xfbWFsbG9jKChzaXplKSkKKyNkZWZpbmUga3NzbF9yZWFsbG9jKHB0ciwgc2l6ZSkgT1BFTlNTTF9yZWFsbG9jKHB0ciwgc2l6ZSkKKyNkZWZpbmUga3NzbF9mcmVlKHB0cikgT1BFTlNTTF9mcmVlKChwdHIpKQorCisKK2NoYXIKKyprc3RyaW5nKGNoYXIgKnN0cmluZykKKyAgICAgICAgeworICAgICAgICBzdGF0aWMgY2hhcgkqbnVsbCA9ICJbTlVMTF0iOworCisJcmV0dXJuICgoc3RyaW5nID09IE5VTEwpPyBudWxsOiBzdHJpbmcpOworICAgICAgICB9CisKKy8qCUdpdmVuIEtSQjUgZW5jdHlwZSAoYmFzaWNhbGx5IERFUyBvciAzREVTKSwKKyoqCXJldHVybiBjbG9zZXN0IG1hdGNoIG9wZW5zc2wgRVZQXyBlbmNyeXB0aW9uIGFsZ29yaXRobS4KKyoqCVJldHVybiBOVUxMIGZvciB1bmtub3duIG9yIHByb2JsZW1hdGljIChrcmI1X2RrX2VuY3J5cHQpIGVuY3R5cGVzLgorKioJQXNzdW1lIEVOQ1RZUEVfKl9SQVcgKGtyYjVfcmF3X2VuY3J5cHQpIGFyZSBPSy4KKyovCitjb25zdCBFVlBfQ0lQSEVSICoKK2tzc2xfbWFwX2VuYyhrcmI1X2VuY3R5cGUgZW5jdHlwZSkKKyAgICAgICAgeworCXN3aXRjaCAoZW5jdHlwZSkKKwkJeworCWNhc2UgRU5DVFlQRV9ERVNfSE1BQ19TSEExOgkJLyogICAgRVZQX2Rlc19jYmMoKTsgICAgICAgKi8KKwljYXNlIEVOQ1RZUEVfREVTX0NCQ19DUkM6CisJY2FzZSBFTkNUWVBFX0RFU19DQkNfTUQ0OgorCWNhc2UgRU5DVFlQRV9ERVNfQ0JDX01ENToKKwljYXNlIEVOQ1RZUEVfREVTX0NCQ19SQVc6CisJCQkJcmV0dXJuIEVWUF9kZXNfY2JjKCk7CisJCQkJYnJlYWs7CisJY2FzZSBFTkNUWVBFX0RFUzNfQ0JDX1NIQTE6CQkvKiAgICBFVlBfZGVzX2VkZTNfY2JjKCk7ICAqLworCWNhc2UgRU5DVFlQRV9ERVMzX0NCQ19TSEE6CisJY2FzZSBFTkNUWVBFX0RFUzNfQ0JDX1JBVzoKKwkJCQlyZXR1cm4gRVZQX2Rlc19lZGUzX2NiYygpOworCQkJCWJyZWFrOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworCQkJCWJyZWFrOworCQl9CisJfQorCisKKy8qCVJldHVybiB0cnVlOjEgaWYgcCAibG9va3MgbGlrZSIgdGhlIHN0YXJ0IG9mIHRoZSByZWFsIGF1dGhlbnRpY2F0b3IKKyoqCWRlc2NyaWJlZCBpbiBrc3NsX3NraXBfY29uZm91bmQoKSBiZWxvdy4gIFRoZSBBU04uMSBwYXR0ZXJuIGlzCisqKgkiNjIgeHggMzAgeXkiIChBUFBMSUNBVElPTi0yLCBTRVFVRU5DRSksIHdoZXJlIHh4LXl5ID1+IDIsIGFuZAorKioJeHggYW5kIHl5IGFyZSBwb3NzaWJseSBtdWx0aS1ieXRlIGxlbmd0aCBmaWVsZHMuCisqLworc3RhdGljIGludCAJa3NzbF90ZXN0X2NvbmZvdW5kKHVuc2lnbmVkIGNoYXIgKnApCisJeworCWludCAJbGVuID0gMjsKKwlpbnQgCXh4ID0gMCwgeXkgPSAwOworCisJaWYgKCpwKysgIT0gMHg2MikgIHJldHVybiAwOworCWlmICgqcCA+IDB4ODIpICByZXR1cm4gMDsKKwlzd2l0Y2goKnApICB7CisJCWNhc2UgMHg4MjogIHArKzsgICAgICAgICAgeHggPSAoKnArKyA8PCA4KTsgIHh4ICs9ICpwKys7ICBicmVhazsKKwkJY2FzZSAweDgxOiAgcCsrOyAgICAgICAgICB4eCA9ICAqcCsrOyAgYnJlYWs7CisJCWNhc2UgMHg4MDogIHJldHVybiAwOworCQlkZWZhdWx0OiAgICB4eCA9ICpwKys7ICBicmVhazsKKwkJfQorCWlmICgqcCsrICE9IDB4MzApICByZXR1cm4gMDsKKwlpZiAoKnAgPiAweDgyKSAgcmV0dXJuIDA7CisJc3dpdGNoKCpwKSAgeworCQljYXNlIDB4ODI6ICBwKys7IGxlbis9MjsgIHl5ID0gKCpwKysgPDwgOCk7ICB5eSArPSAqcCsrOyAgYnJlYWs7CisJCWNhc2UgMHg4MTogIHArKzsgbGVuKys7ICAgeXkgPSAgKnArKzsgIGJyZWFrOworCQljYXNlIDB4ODA6ICByZXR1cm4gMDsKKwkJZGVmYXVsdDogICAgeXkgPSAqcCsrOyAgYnJlYWs7CisJCX0KKworCXJldHVybiAoeHggLSBsZW4gPT0geXkpPyAxOiAwOworCX0KKworLyoJQWxsb2NhdGUsIGZpbGwsIGFuZCByZXR1cm4gY2tzdW1sZW5zIGFycmF5IG9mIGNoZWNrc3VtIGxlbmd0aHMuCisqKglUaGlzIGFycmF5IGhvbGRzIGp1c3QgdGhlIHVuaXF1ZSBlbGVtZW50cyBmcm9tIHRoZSBrcmI1X2Nrc3VtYXJyYXlbXS4KKyoqCWFycmF5W25dID09IDAgc2lnbmFscyBlbmQgb2YgZGF0YS4KKyoqCisqKiAgICAgIFRoZSBrcmI1X2Nrc3VtYXJyYXlbXSB3YXMgYW4gaW50ZXJuYWwgdmFyaWFibGUgdGhhdCBoYXMgc2luY2UgYmVlbgorKiogICAgICByZXBsYWNlZCBieSBhIG1vcmUgZ2VuZXJhbCBtZXRob2QgZm9yIHN0b3JpbmcgdGhlIGRhdGEuICBJdCBzaG91bGQKKyoqICAgICAgbm90IGJlIHVzZWQuICBJbnN0ZWFkIHdlIHVzZSByZWFsIEFQSSBjYWxscyBhbmQgbWFrZSBhIGd1ZXNzIGZvciAKKyoqICAgICAgd2hhdCB0aGUgaGlnaGVzdCBhc3NpZ25lZCBDS1NVTVRZUEVfIGNvbnN0YW50IGlzLiAgQXMgb2YgMS4yLjIKKyoqICAgICAgaXQgaXMgMHgwMDBjIChDS1NVTVRZUEVfSE1BQ19TSEExX0RFUzMpLiAgU28gd2Ugd2lsbCB1c2UgMHgwMDEwLgorKi8KK3N0YXRpYyBzaXplX3QgICpwb3B1bGF0ZV9ja3N1bWxlbnModm9pZCkKKwl7CisJaW50IAkJaSwgaiwgbjsKKwlzdGF0aWMgc2l6ZV90IAkqY2tsZW5zID0gTlVMTDsKKworI2lmZGVmIEtSQjVfTUlUX09MRDExCisJbiA9IGtyYjVfbWF4X2Nrc3VtOworI2Vsc2UKKwluID0gMHgwMDEwOworI2VuZGlmCS8qIEtSQjVfTUlUX09MRDExICovCisgCisjaWZkZWYgS1JCNUNIRUNLQVVUSAorCWlmICghY2tsZW5zICYmICEoY2tsZW5zID0gKHNpemVfdCAqKSBjYWxsb2Moc2l6ZW9mKGludCksbisxKSkpICByZXR1cm4gTlVMTDsKKworCWZvciAoaT0wOyBpIDwgbjsgaSsrKSAgeworCQlpZiAoIXZhbGlkX2Nrc3VtdHlwZShpKSkgIGNvbnRpbnVlOwkvKiAgYXJyYXkgaGFzIGhvbGVzICAqLworCQlmb3IgKGo9MDsgaiA8IG47IGorKykgIHsKKwkJCWlmIChja2xlbnNbal0gPT0gMCkgIHsKKwkJCQlja2xlbnNbal0gPSBrcmI1X2NoZWNrc3VtX3NpemUoTlVMTCxpKTsKKwkJCQlicmVhazsJCS8qICBrcmI1IGVsZW0gd2FzIG5ldzogYWRkICAgKi8KKwkJCQl9CisJCQlpZiAoY2tsZW5zW2pdID09IGtyYjVfY2hlY2tzdW1fc2l6ZShOVUxMLGkpKSAgeworCQkJCWJyZWFrOwkJLyogIGlnbm9yZSBkdXBsaWNhdGUgZWxlbWVudHMgKi8KKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgkvKiBLUkI1Q0hFQ0tBVVRIICovCisKKwlyZXR1cm4gY2tsZW5zOworCX0KKworLyoJUmV0dXJuIHBvaW50ZXIgdG8gc3RhcnQgb2YgcmVhbCBhdXRoZW50aWNhdG9yIHdpdGhpbiBhdXRoZW50aWNhdG9yLCBvcgorKioJcmV0dXJuIE5VTEwgb24gZXJyb3IuCisqKglEZWNyeXB0ZWQgYXV0aGVudGljYXRvciBsb29rcyBsaWtlIHRoaXM6CisqKgkJWzAgb3IgOCBieXRlIGNvbmZvdW5kZXJdIFs0LTI0IGJ5dGUgY2hlY2tzdW1dIFtyZWFsIGF1dGhlbnQncl0KKyoqCVRoaXMgaGFja2VyeSB3b3VsZG4ndCBiZSBuZWNlc3NhcnkgaWYgTUlUIEtSQjUgMS4wLjYgaGFkIHRoZQorKioJa3JiNV9hdXRoX2Nvbl9nZXRja3N1bXR5cGUoKSBmdW5jdGlvbiBhZHZlcnRpc2VkIGluIGl0cyBrcmI1LmguCisqLwordW5zaWduZWQgY2hhcgkqa3NzbF9za2lwX2NvbmZvdW5kKGtyYjVfZW5jdHlwZSBldHlwZSwgdW5zaWduZWQgY2hhciAqYSkKKwl7CisJaW50IAkJaSwgY29ubGVuOworCXNpemVfdAkJY2tsZW47CisJc3RhdGljIHNpemVfdCAJKmNrc3VtbGVucyA9IE5VTEw7CisJdW5zaWduZWQgY2hhcgkqdGVzdF9hdXRoOworCisJY29ubGVuID0gKGV0eXBlKT8gODogMDsKKworCWlmICghY2tzdW1sZW5zICAmJiAgIShja3N1bWxlbnMgPSBwb3B1bGF0ZV9ja3N1bWxlbnMoKSkpICByZXR1cm4gTlVMTDsKKwlmb3IgKGk9MDsgKGNrbGVuID0gY2tzdW1sZW5zW2ldKSAhPSAwOyBpKyspCisJCXsKKwkJdGVzdF9hdXRoID0gYSArIGNvbmxlbiArIGNrbGVuOworCQlpZiAoa3NzbF90ZXN0X2NvbmZvdW5kKHRlc3RfYXV0aCkpICByZXR1cm4gdGVzdF9hdXRoOworCQl9CisKKwlyZXR1cm4gTlVMTDsKKwl9CisKKworLyoJU2V0IGtzc2xfZXJyIGVycm9yIGluZm8gd2hlbiByZWFzb24gdGV4dCBpcyBhIHNpbXBsZSBzdHJpbmcKKyoqCQlrc3NsX2VyciA9IHN0cnVjdCB7IGludCByZWFzb247IGNoYXIgdGV4dFtLU1NMX0VSUl9NQVgrMV07IH0KKyovCit2b2lkCitrc3NsX2Vycl9zZXQoS1NTTF9FUlIgKmtzc2xfZXJyLCBpbnQgcmVhc29uLCBjaGFyICp0ZXh0KQorICAgICAgICB7CisJaWYgKGtzc2xfZXJyID09IE5VTEwpICByZXR1cm47CisKKwlrc3NsX2Vyci0+cmVhc29uID0gcmVhc29uOworCUJJT19zbnByaW50Zihrc3NsX2Vyci0+dGV4dCwgS1NTTF9FUlJfTUFYLCAiJXMiLCB0ZXh0KTsKKwlyZXR1cm47CisgICAgICAgIH0KKworCisvKglEaXNwbGF5IGNvbnRlbnRzIG9mIGtyYjVfZGF0YSBzdHJ1Y3QsIGZvciBkZWJ1Z2dpbmcKKyovCit2b2lkCitwcmludF9rcmI1X2RhdGEoY2hhciAqbGFiZWwsIGtyYjVfZGF0YSAqa2RhdGEpCisgICAgICAgIHsKKwlpbnQgaTsKKworCXByaW50ZigiJXNbJWRdICIsIGxhYmVsLCBrZGF0YS0+bGVuZ3RoKTsKKwlmb3IgKGk9MDsgaSA8IChpbnQpa2RhdGEtPmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKwkJaWYgKDAgJiYgIGlzcHJpbnQoKGludCkga2RhdGEtPmRhdGFbaV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAkiJWMgIiwgIGtkYXRhLT5kYXRhW2ldKTsKKwkJZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKAkiJTAyeCAiLCAodW5zaWduZWQgY2hhcikga2RhdGEtPmRhdGFbaV0pOworCQl9CisJcHJpbnRmKCJcbiIpOworICAgICAgICB9CisKKworLyoJRGlzcGxheSBjb250ZW50cyBvZiBrcmI1X2F1dGhkYXRhIHN0cnVjdCwgZm9yIGRlYnVnZ2luZworKi8KK3ZvaWQKK3ByaW50X2tyYjVfYXV0aGRhdGEoY2hhciAqbGFiZWwsIGtyYjVfYXV0aGRhdGEgKiphZGF0YSkKKyAgICAgICAgeworCWlmIChhZGF0YSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKwkJcHJpbnRmKCIlcywgYXV0aGRhdGE9PTBcbiIsIGxhYmVsKTsKKwkJcmV0dXJuOworCQl9CisJcHJpbnRmKCIlcyBbJXBdXG4iLCBsYWJlbCwgKHZvaWQgKilhZGF0YSk7CisjaWYgMAorCXsKKyAgICAgICAgaW50IAlpOworCXByaW50ZigiJXNbYXQlZDolZF0gIiwgbGFiZWwsIGFkYXRhLT5hZF90eXBlLCBhZGF0YS0+bGVuZ3RoKTsKKwlmb3IgKGk9MDsgaSA8IGFkYXRhLT5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKChpc3ByaW50KGFkYXRhLT5jb250ZW50c1tpXSkpPyAiJWMgIjogIiUwMngiLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRhdGEtPmNvbnRlbnRzW2ldKTsKKwkJfQorCXByaW50ZigiXG4iKTsKKwl9CisjZW5kaWYKKwl9CisKKworLyoJRGlzcGxheSBjb250ZW50cyBvZiBrcmI1X2tleWJsb2NrIHN0cnVjdCwgZm9yIGRlYnVnZ2luZworKi8KK3ZvaWQKK3ByaW50X2tyYjVfa2V5YmxvY2soY2hhciAqbGFiZWwsIGtyYjVfa2V5YmxvY2sgKmtleWJsaykKKyAgICAgICAgeworCWludCBpOworCisJaWYgKGtleWJsayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKwkJcHJpbnRmKCIlcywga2V5YmxrPT0wXG4iLCBsYWJlbCk7CisJCXJldHVybjsKKwkJfQorI2lmZGVmIEtSQjVfSEVJTURBTAorCXByaW50ZigiJXNcblx0W2V0JWQ6JWRdOiAiLCBsYWJlbCwga2V5YmxrLT5rZXl0eXBlLAorCQkJCQkgICBrZXlibGstPmtleXZhbHVlLT5sZW5ndGgpOworCWZvciAoaT0wOyBpIDwgKGludClrZXlibGstPmtleXZhbHVlLT5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisJCXByaW50ZigiJTAyeCIsKHVuc2lnbmVkIGNoYXIgKikoa2V5YmxrLT5rZXl2YWx1ZS0+Y29udGVudHMpW2ldKTsKKwkJfQorCXByaW50ZigiXG4iKTsKKyNlbHNlCisJcHJpbnRmKCIlc1xuXHRbZXQlZDolZF06ICIsIGxhYmVsLCBrZXlibGstPmVuY3R5cGUsIGtleWJsay0+bGVuZ3RoKTsKKwlmb3IgKGk9MDsgaSA8IChpbnQpa2V5YmxrLT5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisJCXByaW50ZigiJTAyeCIsa2V5YmxrLT5jb250ZW50c1tpXSk7CisJCX0KKwlwcmludGYoIlxuIik7CisjZW5kaWYKKyAgICAgICAgfQorCisKKy8qCURpc3BsYXkgY29udGVudHMgb2Yga3JiNV9wcmluY2lwYWxfZGF0YSBzdHJ1Y3QsIGZvciBkZWJ1Z2dpbmcKKyoqCShrcmI1X3ByaW5jaXBhbCBpcyB0eXBlZGVmJ2QgPT0ga3JiNV9wcmluY2lwYWxfZGF0YSAqKQorKi8KK3N0YXRpYyB2b2lkCitwcmludF9rcmI1X3ByaW5jKGNoYXIgKmxhYmVsLCBrcmI1X3ByaW5jaXBhbF9kYXRhICpwcmluYykKKyAgICAgICAgeworCWludCBpLCB1aSwgdWo7CisKKwlwcmludGYoIiVzIHByaW5jaXBhbCBSZWFsbTogIiwgbGFiZWwpOworCWlmIChwcmluYyA9PSBOVUxMKSAgcmV0dXJuOworCWZvciAodWk9MDsgdWkgPCAoaW50KXByaW5jLT5yZWFsbS5sZW5ndGg7IHVpKyspICBwdXRjaGFyKHByaW5jLT5yZWFsbS5kYXRhW3VpXSk7CisJcHJpbnRmKCIgKG5hbWV0eXBlICVkKSBoYXMgJWQgc3RyaW5nczpcbiIsIHByaW5jLT50eXBlLHByaW5jLT5sZW5ndGgpOworCWZvciAoaT0wOyBpIDwgKGludClwcmluYy0+bGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgeworCQlwcmludGYoIlx0JWQgWyVkXTogIiwgaSwgcHJpbmMtPmRhdGFbaV0ubGVuZ3RoKTsKKwkJZm9yICh1aj0wOyB1aiA8IChpbnQpcHJpbmMtPmRhdGFbaV0ubGVuZ3RoOyB1aisrKSAgeworCQkJcHV0Y2hhcihwcmluYy0+ZGF0YVtpXS5kYXRhW3VqXSk7CisJCQl9CisJCXByaW50ZigiXG4iKTsKKwkJfQorCXJldHVybjsKKyAgICAgICAgfQorCisKKy8qCUdpdmVuIGtyYjUgc2VydmljZSAodHlwaWNhbGx5ICJrc3NsIikgYW5kIGhvc3RuYW1lIGluIGtzc2xfY3R4LAorKioJUmV0dXJuIGVuY3J5cHRlZCBLZXJiZXJvcyB0aWNrZXQgZm9yIHNlcnZpY2UgQCBob3N0bmFtZS4KKyoqCUlmIGF1dGhlbnAgaXMgbm9uLU5VTEwsIGFsc28gcmV0dXJuIGVuY3J5cHRlZCBhdXRoZW50aWNhdG9yLAorKioJd2hvc2UgZGF0YSBzaG91bGQgYmUgZnJlZWQgYnkgY2FsbGVyLgorKioJKE9yaWdpbmFsbHkgd2FzOiBDcmVhdGUgS2VyYmVyb3MgQVBfUkVRIG1lc3NhZ2UgZm9yIFNTTCBDbGllbnQuKQorKioKKyoqCTE5OTkwNjI4CVZSUyAJU3RhcnRlZDsgUmV0dXJucyBLZXJiZXJvcyBBUF9SRVEgbWVzc2FnZS4KKyoqCTIwMDEwNDA5CVZSUyAJTW9kaWZpZWQgZm9yIFJGQzI3MTI7IFJldHVybnMgZW5jIHRrdC4KKyoqCTIwMDEwNjA2CVZSUyAJTWF5IGFsc28gcmV0dXJuIG9wdGlvbmFsIGF1dGhlbnRpY2F0b3IuCisqLwora3JiNV9lcnJvcl9jb2RlCitrc3NsX2NnZXRfdGt0KAkvKiBVUERBVEUgKi8JS1NTTF9DVFggKmtzc2xfY3R4LAorICAgICAgICAgICAgICAgIC8qIE9VVCAgICAqLwlrcmI1X2RhdGEgKiplbmNfdGlja2V0cCwKKyAgICAgICAgICAgICAgICAvKiBVUERBVEUgKi8Ja3JiNV9kYXRhICphdXRoZW5wLAorICAgICAgICAgICAgICAgIC8qIE9VVCAgICAqLwlLU1NMX0VSUiAqa3NzbF9lcnIpCisJeworCWtyYjVfZXJyb3JfY29kZQkJa3JiNXJjID0gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwlrcmI1X2NvbnRleHQJCWtyYjVjb250ZXh0ID0gTlVMTDsKKwlrcmI1X2F1dGhfY29udGV4dAlrcmI1YXV0aF9jb250ZXh0ID0gTlVMTDsKKwlrcmI1X2NjYWNoZSAJCWtyYjVjY2RlZiA9IE5VTEw7CisJa3JiNV9jcmVkcwkJa3JiNWNyZWRzLCAqa3JiNWNyZWRzcCA9IE5VTEw7CisJa3JiNV9kYXRhCQlrcmI1X2FwcF9yZXE7CisKKwlrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIDAsICIiKTsKKwltZW1zZXQoKGNoYXIgKikma3JiNWNyZWRzLCAwLCBzaXplb2Yoa3JiNWNyZWRzKSk7CisKKwlpZiAoIWtzc2xfY3R4KQorICAgICAgICAgICAgICAgIHsKKwkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyBrc3NsX2N0eCBkZWZpbmVkLlxuIik7CisJCWdvdG8gZXJyOworCQl9CisJZWxzZSBpZiAoIWtzc2xfY3R4LT5zZXJ2aWNlX2hvc3QpCisgICAgICAgICAgICAgICAgeworCQlrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIFNTTF9SX0tSQjVfU19JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgImtzc2xfY3R4IHNlcnZpY2VfaG9zdCB1bmRlZmluZWQuXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICgoa3JiNXJjID0ga3JiNV9pbml0X2NvbnRleHQoJmtyYjVjb250ZXh0KSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisJCUJJT19zbnByaW50Zihrc3NsX2Vyci0+dGV4dCxLU1NMX0VSUl9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAia3JiNV9pbml0X2NvbnRleHQoKSBmYWlsczogJWRcbiIsIGtyYjVyYyk7CisJCWtzc2xfZXJyLT5yZWFzb24gPSBTU0xfUl9LUkI1X0NfSU5JVDsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICgoa3JiNXJjID0ga3JiNV9zbmFtZV90b19wcmluY2lwYWwoa3JiNWNvbnRleHQsCisgICAgICAgICAgICAgICAga3NzbF9jdHgtPnNlcnZpY2VfaG9zdCwKKyAgICAgICAgICAgICAgICAoa3NzbF9jdHgtPnNlcnZpY2VfbmFtZSk/IGtzc2xfY3R4LT5zZXJ2aWNlX25hbWU6IEtSQjVTVkMsCisgICAgICAgICAgICAgICAgS1JCNV9OVF9TUlZfSFNULCAma3JiNWNyZWRzLnNlcnZlcikpICE9IDApCisgICAgICAgICAgICAgICAgeworCQlCSU9fc25wcmludGYoa3NzbF9lcnItPnRleHQsS1NTTF9FUlJfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgImtyYjVfc25hbWVfdG9fcHJpbmNpcGFsKCkgZmFpbHMgZm9yICVzLyVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAga3NzbF9jdHgtPnNlcnZpY2VfaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChrc3NsX2N0eC0+c2VydmljZV9uYW1lKT8ga3NzbF9jdHgtPnNlcnZpY2VfbmFtZToKKwkJCQkJCSAgS1JCNVNWQyk7CisJCWtzc2xfZXJyLT5yZWFzb24gPSBTU0xfUl9LUkI1X0NfSU5JVDsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICgoa3JiNXJjID0ga3JiNV9jY19kZWZhdWx0KGtyYjVjb250ZXh0LCAma3JiNWNjZGVmKSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisJCWtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9DX0NDX1BSSU5DLAorICAgICAgICAgICAgICAgICAgICAgICAgImtyYjVfY2NfZGVmYXVsdCBmYWlscy5cbiIpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKChrcmI1cmMgPSBrcmI1X2NjX2dldF9wcmluY2lwYWwoa3JiNWNvbnRleHQsIGtyYjVjY2RlZiwKKyAgICAgICAgICAgICAgICAma3JiNWNyZWRzLmNsaWVudCkpICE9IDApCisgICAgICAgICAgICAgICAgeworCQlrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIFNTTF9SX0tSQjVfQ19DQ19QUklOQywKKyAgICAgICAgICAgICAgICAgICAgICAgICJrcmI1X2NjX2dldF9wcmluY2lwYWwoKSBmYWlscy5cbiIpOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKChrcmI1cmMgPSBrcmI1X2dldF9jcmVkZW50aWFscyhrcmI1Y29udGV4dCwgMCwga3JiNWNjZGVmLAorICAgICAgICAgICAgICAgICZrcmI1Y3JlZHMsICZrcmI1Y3JlZHNwKSkgIT0gMCkKKyAgICAgICAgICAgICAgICB7CisJCWtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9DX0dFVF9DUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgImtyYjVfZ2V0X2NyZWRlbnRpYWxzKCkgZmFpbHMuXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKworCSplbmNfdGlja2V0cCA9ICZrcmI1Y3JlZHNwLT50aWNrZXQ7CisjaWZkZWYgS1JCNV9IRUlNREFMCisJa3NzbF9jdHgtPmVuY3R5cGUgPSBrcmI1Y3JlZHNwLT5zZXNzaW9uLmtleXR5cGU7CisjZWxzZQorCWtzc2xfY3R4LT5lbmN0eXBlID0ga3JiNWNyZWRzcC0+a2V5YmxvY2suZW5jdHlwZTsKKyNlbmRpZgorCisJa3JiNXJjID0gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwkvKgljYWxsZXIgc2hvdWxkIGZyZWUgZGF0YSBvZiBrcmI1X2FwcF9yZXEgICovCisJLyogIDIwMDEwNDA2IFZSUyBkZWxldGVkIGZvciByZWFsIEtlcmJlcm9zV3JhcHBlcgorCSoqICAyMDAxMDYwNSBWUlMgcmVpbnN0YXRlZCB0byBvZmZlciBBdXRoZW50aWNhdG9yIHRvIEtlcmJlcm9zV3JhcHBlcgorCSovCisJa3JiNV9hcHBfcmVxLmxlbmd0aCA9IDA7CisJaWYgKGF1dGhlbnApCisgICAgICAgICAgICAgICAgeworCQlrcmI1X2RhdGEJa3JiNWluX2RhdGE7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIJKnA7CisJCWxvbmcJCWFybGVuOworCQlLUkI1X0FQUkVRQk9EWQkqYXBfcmVxOworCisJCWF1dGhlbnAtPmxlbmd0aCA9IDA7CisJCWtyYjVpbl9kYXRhLmRhdGEgPSBOVUxMOworCQlrcmI1aW5fZGF0YS5sZW5ndGggPSAwOworCQlpZiAoKGtyYjVyYyA9IGtyYjVfbWtfcmVxX2V4dGVuZGVkKGtyYjVjb250ZXh0LAorCQkJJmtyYjVhdXRoX2NvbnRleHQsIDAsICZrcmI1aW5fZGF0YSwga3JiNWNyZWRzcCwKKwkJCSZrcmI1X2FwcF9yZXEpKSAhPSAwKQorCQkJeworCQkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X0NfTUtfUkVRLAorCQkJCSJrcmI1X21rX3JlcV9leHRlbmRlZCgpIGZhaWxzLlxuIik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlhcmxlbiA9IGtyYjVfYXBwX3JlcS5sZW5ndGg7CisJCXAgPSAodW5zaWduZWQgY2hhciAqKWtyYjVfYXBwX3JlcS5kYXRhOworCQlhcF9yZXEgPSAoS1JCNV9BUFJFUUJPRFkgKikgZDJpX0tSQjVfQVBSRVEoTlVMTCwgJnAsIGFybGVuKTsKKwkJaWYgKGFwX3JlcSkKKwkJCXsKKwkJCWF1dGhlbnAtPmxlbmd0aCA9IGkyZF9LUkI1X0VOQ0RBVEEoCisJCQkJCWFwX3JlcS0+YXV0aGVudGljYXRvciwgTlVMTCk7CisJCQlpZiAoYXV0aGVucC0+bGVuZ3RoICAmJiAKKwkJCQkoYXV0aGVucC0+ZGF0YSA9IG1hbGxvYyhhdXRoZW5wLT5sZW5ndGgpKSkKKwkJCQl7CisJCQkJdW5zaWduZWQgY2hhcgkqYWRwID0gKHVuc2lnbmVkIGNoYXIgKilhdXRoZW5wLT5kYXRhOworCQkJCWF1dGhlbnAtPmxlbmd0aCA9IGkyZF9LUkI1X0VOQ0RBVEEoCisJCQkJCQlhcF9yZXEtPmF1dGhlbnRpY2F0b3IsICZhZHApOworCQkJCX0KKwkJCX0KKworCQlpZiAoYXBfcmVxKSAgS1JCNV9BUFJFUV9mcmVlKChLUkI1X0FQUkVRICopIGFwX3JlcSk7CisJCWlmIChrcmI1X2FwcF9yZXEubGVuZ3RoKSAgCisgICAgICAgICAgICAgICAgICAgICAgICBrc3NsX2tyYjVfZnJlZV9kYXRhX2NvbnRlbnRzKGtyYjVjb250ZXh0LCZrcmI1X2FwcF9yZXEpOworCQl9CisjaWZkZWYgS1JCNV9IRUlNREFMCisJaWYgKGtzc2xfY3R4X3NldGtleShrc3NsX2N0eCwgJmtyYjVjcmVkc3AtPnNlc3Npb24pKQorICAgICAgICAgICAgICAgIHsKKwkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X0NfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJrc3NsX2N0eF9zZXRrZXkoKSBmYWlscy5cbiIpOworCQl9CisjZWxzZQorCWlmIChrc3NsX2N0eF9zZXRrZXkoa3NzbF9jdHgsICZrcmI1Y3JlZHNwLT5rZXlibG9jaykpCisgICAgICAgICAgICAgICAgeworCQlrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIFNTTF9SX0tSQjVfQ19JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgImtzc2xfY3R4X3NldGtleSgpIGZhaWxzLlxuIik7CisJCX0KKyNlbmRpZgorCWVsc2UJa3JiNXJjID0gMDsKKworIGVycjoKKyNpZmRlZiBLU1NMX0RFQlVHCisJa3NzbF9jdHhfc2hvdyhrc3NsX2N0eCk7CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCisJaWYgKGtyYjVjcmVkcy5jbGllbnQpCWtyYjVfZnJlZV9wcmluY2lwYWwoa3JiNWNvbnRleHQsCisJCQkJCQkJa3JiNWNyZWRzLmNsaWVudCk7CisJaWYgKGtyYjVjcmVkcy5zZXJ2ZXIpCWtyYjVfZnJlZV9wcmluY2lwYWwoa3JiNWNvbnRleHQsCisJCQkJCQkJa3JiNWNyZWRzLnNlcnZlcik7CisJaWYgKGtyYjVhdXRoX2NvbnRleHQpCWtyYjVfYXV0aF9jb25fZnJlZShrcmI1Y29udGV4dCwKKwkJCQkJCQlrcmI1YXV0aF9jb250ZXh0KTsKKwlpZiAoa3JiNWNvbnRleHQpCWtyYjVfZnJlZV9jb250ZXh0KGtyYjVjb250ZXh0KTsKKwlyZXR1cm4gKGtyYjVyYyk7CisJfQorCisKKy8qICBHaXZlbiBkMmlfLWRlY29kZWQgYXNuMXRpY2tldCwgYWxsb2NhdGUgYW5kIHJldHVybiBhIG5ldyBrcmI1X3RpY2tldC4KKyoqICBSZXR1cm4gS2VyYmVyb3MgZXJyb3IgY29kZSBhbmQga3NzbF9lcnIgc3RydWN0IG9uIGVycm9yLgorKiogIEFsbG9jYXRlcyBrcmI1X3RpY2tldCBhbmQga3JiNV9wcmluY2lwYWw7IGNhbGxlciBzaG91bGQgZnJlZSB0aGVzZS4KKyoqCisqKgkyMDAxMDQxMAlWUlMJSW1wbGVtZW50ZWQga3JiNV9kZWNvZGVfdGlja2V0KCkgYXMKKyoqCQkJCW9sZF9rcmI1X2RlY29kZV90aWNrZXQoKS4gTWlzc2luZyBmcm9tIE1JVDEuMC42LgorKioJMjAwMTA2MTUJVlJTIAlSZS1jYXN0IGFzIG9wZW5zc2wvYXNuMSBkMmlfKigpIGZ1bmN0aW9ucy4KKyoqCQkJCVJlLXVzZWQgc29tZSBvZiB0aGUgb2xkIGtyYjVfZGVjb2RlX3RpY2tldCgpCisqKgkJCQljb2RlIGhlcmUuICBUaGlzIHRrdCBzaG91bGQgYWxsb2MvZnJlZSBqdXN0CisqKgkJCQlsaWtlIHRoZSByZWFsIHRoaW5nLgorKi8KK3N0YXRpYyBrcmI1X2Vycm9yX2NvZGUKK2tzc2xfVEtUMnRrdCgJLyogSU4gICAgICovCWtyYjVfY29udGV4dAlrcmI1Y29udGV4dCwKKwkJLyogSU4gICAgICovCUtSQjVfVEtUQk9EWQkqYXNuMXRpY2tldCwKKwkJLyogT1VUICAgICovCWtyYjVfdGlja2V0CSoqa3JiNXRpY2tldCwKKwkJLyogT1VUICAgICovCUtTU0xfRVJSICprc3NsX2VyciAgKQorICAgICAgICB7CisgICAgICAgIGtyYjVfZXJyb3JfY29kZQkJCWtyYjVyYyA9IEtSQjVLUkJfRVJSX0dFTkVSSUM7CisJa3JiNV90aWNrZXQgCQkJKm5ldzV0aWNrZXQgPSBOVUxMOworCUFTTjFfR0VORVJBTFNUUklORwkJKmdzdHJfc3ZjLCAqZ3N0cl9ob3N0OworCisJKmtyYjV0aWNrZXQgPSBOVUxMOworCisJaWYgKGFzbjF0aWNrZXQgPT0gTlVMTCAgfHwgIGFzbjF0aWNrZXQtPnJlYWxtID09IE5VTEwgIHx8CisJCWFzbjF0aWNrZXQtPnNuYW1lID09IE5VTEwgIHx8IAorCQlza19BU04xX0dFTkVSQUxTVFJJTkdfbnVtKGFzbjF0aWNrZXQtPnNuYW1lLT5uYW1lc3RyaW5nKSA8IDIpCisJCXsKKwkJQklPX3NucHJpbnRmKGtzc2xfZXJyLT50ZXh0LCBLU1NMX0VSUl9NQVgsCisJCQkiTnVsbCBmaWVsZCBpbiBhc24xdGlja2V0LlxuIik7CisJCWtzc2xfZXJyLT5yZWFzb24gPSBTU0xfUl9LUkI1X1NfUkRfUkVROworCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwkJfQorCisJaWYgKChuZXc1dGlja2V0ID0gKGtyYjVfdGlja2V0ICopIGNhbGxvYygxLCBzaXplb2Yoa3JiNV90aWNrZXQpKSk9PU5VTEwpCisJCXsKKwkJQklPX3NucHJpbnRmKGtzc2xfZXJyLT50ZXh0LCBLU1NMX0VSUl9NQVgsCisJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG5ldyBrcmI1X3RpY2tldC5cbiIpOworCQlrc3NsX2Vyci0+cmVhc29uID0gU1NMX1JfS1JCNV9TX1JEX1JFUTsKKwkJcmV0dXJuIEVOT01FTTsJCS8qICBvciAgS1JCNUtSQl9FUlJfR0VORVJJQzsJKi8KKwkJfQorCisJZ3N0cl9zdmMgID0gc2tfQVNOMV9HRU5FUkFMU1RSSU5HX3ZhbHVlKGFzbjF0aWNrZXQtPnNuYW1lLT5uYW1lc3RyaW5nLCAwKTsKKwlnc3RyX2hvc3QgPSBza19BU04xX0dFTkVSQUxTVFJJTkdfdmFsdWUoYXNuMXRpY2tldC0+c25hbWUtPm5hbWVzdHJpbmcsIDEpOworCisJaWYgKChrcmI1cmMgPSBrc3NsX2J1aWxkX3ByaW5jaXBhbF8yKGtyYjVjb250ZXh0LAorCQkJJm5ldzV0aWNrZXQtPnNlcnZlciwKKwkJCWFzbjF0aWNrZXQtPnJlYWxtLT5sZW5ndGgsIChjaGFyICopYXNuMXRpY2tldC0+cmVhbG0tPmRhdGEsCisJCQlnc3RyX3N2Yy0+bGVuZ3RoLCAgKGNoYXIgKilnc3RyX3N2Yy0+ZGF0YSwKKwkJCWdzdHJfaG9zdC0+bGVuZ3RoLCAoY2hhciAqKWdzdHJfaG9zdC0+ZGF0YSkpICE9IDApCisJCXsKKwkJZnJlZShuZXc1dGlja2V0KTsKKwkJQklPX3NucHJpbnRmKGtzc2xfZXJyLT50ZXh0LCBLU1NMX0VSUl9NQVgsCisJCQkiRXJyb3IgYnVpbGRpbmcgdGlja2V0IHNlcnZlciBwcmluY2lwYWwuXG4iKTsKKwkJa3NzbF9lcnItPnJlYXNvbiA9IFNTTF9SX0tSQjVfU19SRF9SRVE7CisJCXJldHVybiBrcmI1cmM7CQkvKiAgb3IgIEtSQjVLUkJfRVJSX0dFTkVSSUM7CSovCisJCX0KKworCWtyYjVfcHJpbmNfdHlwZShrcmI1Y29udGV4dCwgbmV3NXRpY2tldC0+c2VydmVyKSA9CisJCQlhc24xdGlja2V0LT5zbmFtZS0+bmFtZXR5cGUtPmRhdGFbMF07CisJbmV3NXRpY2tldC0+ZW5jX3BhcnQuZW5jdHlwZSA9IGFzbjF0aWNrZXQtPmVuY2RhdGEtPmV0eXBlLT5kYXRhWzBdOworCW5ldzV0aWNrZXQtPmVuY19wYXJ0Lmt2bm8gPSBhc24xdGlja2V0LT5lbmNkYXRhLT5rdm5vLT5kYXRhWzBdOworCW5ldzV0aWNrZXQtPmVuY19wYXJ0LmNpcGhlcnRleHQubGVuZ3RoID0KKwkJCWFzbjF0aWNrZXQtPmVuY2RhdGEtPmNpcGhlci0+bGVuZ3RoOworCWlmICgobmV3NXRpY2tldC0+ZW5jX3BhcnQuY2lwaGVydGV4dC5kYXRhID0KKwkJY2FsbG9jKDEsIGFzbjF0aWNrZXQtPmVuY2RhdGEtPmNpcGhlci0+bGVuZ3RoKSkgPT0gTlVMTCkKKwkJeworCQlmcmVlKG5ldzV0aWNrZXQpOworCQlCSU9fc25wcmludGYoa3NzbF9lcnItPnRleHQsIEtTU0xfRVJSX01BWCwKKwkJCSJFcnJvciBhbGxvY2F0aW5nIGNpcGhlciBpbiBrcmI1dGlja2V0LlxuIik7CisJCWtzc2xfZXJyLT5yZWFzb24gPSBTU0xfUl9LUkI1X1NfUkRfUkVROworCQlyZXR1cm4gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwkJfQorCWVsc2UKKwkJeworCQltZW1jcHkobmV3NXRpY2tldC0+ZW5jX3BhcnQuY2lwaGVydGV4dC5kYXRhLAorCQkJYXNuMXRpY2tldC0+ZW5jZGF0YS0+Y2lwaGVyLT5kYXRhLAorCQkJYXNuMXRpY2tldC0+ZW5jZGF0YS0+Y2lwaGVyLT5sZW5ndGgpOworCQl9CisKKwkqa3JiNXRpY2tldCA9IG5ldzV0aWNrZXQ7CisJcmV0dXJuIDA7CisJfQorCisKKy8qCUdpdmVuIGtyYjUgc2VydmljZSBuYW1lIGluIEtTU0xfQ1RYICprc3NsX2N0eCAodHlwaWNhbGx5ICJrc3NsIiksCisqKgkJYW5kIGtyYjUgQVBfUkVRIG1lc3NhZ2UgJiBtZXNzYWdlIGxlbmd0aCwKKyoqCVJldHVybiBLZXJiZXJvcyBzZXNzaW9uIGtleSBhbmQgY2xpZW50IHByaW5jaXBsZQorKioJCXRvIFNTTCBTZXJ2ZXIgaW4gS1NTTF9DVFggKmtzc2xfY3R4LgorKioKKyoqCTE5OTkwNzAyCVZSUyAJU3RhcnRlZC4KKyovCitrcmI1X2Vycm9yX2NvZGUKK2tzc2xfc2dldF90a3QoCS8qIFVQREFURSAqLwlLU1NMX0NUWAkJKmtzc2xfY3R4LAorCQkvKiBJTiAgICAgKi8Ja3JiNV9kYXRhCQkqaW5kYXRhLAorCQkvKiBPVVQgICAgKi8Ja3JiNV90aWNrZXRfdGltZXMJKnR0aW1lcywKKwkJLyogT1VUICAgICovCUtTU0xfRVJSCQkqa3NzbF9lcnIgICkKKyAgICAgICAgeworICAgICAgICBrcmI1X2Vycm9yX2NvZGUJCQlrcmI1cmMgPSBLUkI1S1JCX0VSUl9HRU5FUklDOworICAgICAgICBzdGF0aWMga3JiNV9jb250ZXh0CQlrcmI1Y29udGV4dCA9IE5VTEw7CisJc3RhdGljIGtyYjVfYXV0aF9jb250ZXh0CWtyYjVhdXRoX2NvbnRleHQgPSBOVUxMOworCWtyYjVfdGlja2V0IAkJCSprcmI1dGlja2V0ID0gTlVMTDsKKwlLUkI1X1RLVEJPRFkgCQkJKmFzbjF0aWNrZXQgPSBOVUxMOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJCSpwOworCWtyYjVfa2V5dGFiIAkJCWtyYjVrZXl0YWIgPSBOVUxMOworCWtyYjVfa2V5dGFiX2VudHJ5CQlrdF9lbnRyeTsKKwlrcmI1X3ByaW5jaXBhbAkJCWtyYjVzZXJ2ZXI7CisgICAgICAgIGtyYjVfcmNhY2hlICAgICAgICAgICAgICAgICAgICAgcmNhY2hlID0gTlVMTDsKKworCWtzc2xfZXJyX3NldChrc3NsX2VyciwgMCwgIiIpOworCisJaWYgKCFrc3NsX2N0eCkKKyAgICAgICAgICAgICAgICB7CisJCWtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9TX0lOSVQsCisJCQkiTm8ga3NzbF9jdHggZGVmaW5lZC5cbiIpOworCQlnb3RvIGVycjsKKwkJfQorCisjaWZkZWYgS1NTTF9ERUJVRworCXByaW50ZigiaW4ga3NzbF9zZ2V0X3RrdCglcylcbiIsIGtzdHJpbmcoa3NzbF9jdHgtPnNlcnZpY2VfbmFtZSkpOworI2VuZGlmCS8qIEtTU0xfREVCVUcgKi8KKworCWlmICgha3JiNWNvbnRleHQgICYmICAoa3JiNXJjID0ga3JiNV9pbml0X2NvbnRleHQoJmtyYjVjb250ZXh0KSkpCisgICAgICAgICAgICAgICAgeworCQlrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIFNTTF9SX0tSQjVfU19JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgImtyYjVfaW5pdF9jb250ZXh0KCkgZmFpbHMuXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKwlpZiAoa3JiNWF1dGhfY29udGV4dCAgJiYKKwkJKGtyYjVyYyA9IGtyYjVfYXV0aF9jb25fZnJlZShrcmI1Y29udGV4dCwga3JiNWF1dGhfY29udGV4dCkpKQorICAgICAgICAgICAgICAgIHsKKwkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJrcmI1X2F1dGhfY29uX2ZyZWUoKSBmYWlscy5cbiIpOworCQlnb3RvIGVycjsKKwkJfQorCWVsc2UgIGtyYjVhdXRoX2NvbnRleHQgPSBOVUxMOworCWlmICgha3JiNWF1dGhfY29udGV4dCAgJiYKKwkJKGtyYjVyYyA9IGtyYjVfYXV0aF9jb25faW5pdChrcmI1Y29udGV4dCwgJmtyYjVhdXRoX2NvbnRleHQpKSkKKyAgICAgICAgICAgICAgICB7CisJCWtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9TX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAia3JiNV9hdXRoX2Nvbl9pbml0KCkgZmFpbHMuXG4iKTsKKwkJZ290byBlcnI7CisJCX0KKworIAorCWlmICgoa3JiNXJjID0ga3JiNV9hdXRoX2Nvbl9nZXRyY2FjaGUoa3JiNWNvbnRleHQsIGtyYjVhdXRoX2NvbnRleHQsCisJCSZyY2FjaGUpKSkKKwkJeworIAkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKwkJCSJrcmI1X2F1dGhfY29uX2dldHJjYWNoZSgpIGZhaWxzLlxuIik7CisgCQlnb3RvIGVycjsKKwkJfQorIAorCWlmICgoa3JiNXJjID0ga3JiNV9zbmFtZV90b19wcmluY2lwYWwoa3JiNWNvbnRleHQsIE5VTEwsCisgICAgICAgICAgICAgICAgKGtzc2xfY3R4LT5zZXJ2aWNlX25hbWUpPyBrc3NsX2N0eC0+c2VydmljZV9uYW1lOiBLUkI1U1ZDLAorICAgICAgICAgICAgICAgIEtSQjVfTlRfU1JWX0hTVCwgJmtyYjVzZXJ2ZXIpKSAhPSAwKQorICAgICAgICAgICAgICAgIHsKKwkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJrcmI1X3NuYW1lX3RvX3ByaW5jaXBhbCgpIGZhaWxzLlxuIik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAocmNhY2hlID09IE5VTEwpIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoKGtyYjVyYyA9IGtyYjVfZ2V0X3NlcnZlcl9yY2FjaGUoa3JiNWNvbnRleHQsCisJCQlrcmI1X3ByaW5jX2NvbXBvbmVudChrcmI1Y29udGV4dCwga3JiNXNlcnZlciwgMCksCisJCQkmcmNhY2hlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisJCSAgICAgICAga3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtyYjVfZ2V0X3NlcnZlcl9yY2FjaGUoKSBmYWlscy5cbiIpOworICAgICAgICAgICAgICAgICAgCWdvdG8gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICBpZiAoKGtyYjVyYyA9IGtyYjVfYXV0aF9jb25fc2V0cmNhY2hlKGtyYjVjb250ZXh0LCBrcmI1YXV0aF9jb250ZXh0LCByY2FjaGUpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKwkJCSJrcmI1X2F1dGhfY29uX3NldHJjYWNoZSgpIGZhaWxzLlxuIik7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgfQorCisKKwkvKglrc3NsX2N0eC0+a2V5dGFiX2ZpbGUgPT0gTlVMTCA9PT4gdXNlIEtlcmJlcm9zIGRlZmF1bHQKKwkqLworCWlmIChrc3NsX2N0eC0+a2V5dGFiX2ZpbGUpCisJCXsKKwkJa3JiNXJjID0ga3JiNV9rdF9yZXNvbHZlKGtyYjVjb250ZXh0LCBrc3NsX2N0eC0+a2V5dGFiX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAma3JiNWtleXRhYik7CisJCWlmIChrcmI1cmMpCisJCQl7CisJCQlrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIFNTTF9SX0tSQjVfU19JTklULAorCQkJCSJrcmI1X2t0X3Jlc29sdmUoKSBmYWlscy5cbiIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKyAgICAgICAgICAgICAgICBrcmI1cmMgPSBrcmI1X2t0X2RlZmF1bHQoa3JiNWNvbnRleHQsJmtyYjVrZXl0YWIpOworICAgICAgICAgICAgICAgIGlmIChrcmI1cmMpCisJCQl7CisJCQlrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIFNTTF9SX0tSQjVfU19JTklULCAKKwkJCQkia3JiNV9rdF9kZWZhdWx0KCkgZmFpbHMuXG4iKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl9CisKKwkvKglBY3R1YWwgS2VyYmVyb3M1IGtyYjVfcmVjdmF1dGgoKSBoYXMgaW5pdGlhbCBjb252ZXJzYXRpb24gaGVyZQorCSoqCW8JY2hlY2sgS1JCNV9TRU5EQVVUSF9CQURBVVRIVkVSUworCSoqCQl1bmxlc3MgS1JCNV9SRUNWQVVUSF9TS0lQX1ZFUlNJT04KKwkqKglvCWNoZWNrIEtSQjVfU0VOREFVVEhfQkFEQVBQTFZFUlMKKwkqKglvCXNlbmQgIjAiIG1zZyBpZiBhbGwgT0sKKwkqLworCisJLyogIDIwMDEwNDExIHdhcyB1c2luZyBBUF9SRVEgaW5zdGVhZCBvZiB0cnVlIEtlcmJlcm9zV3JhcHBlcgorCSoqCisJKiogIGlmICgoa3JiNXJjID0ga3JiNV9yZF9yZXEoa3JiNWNvbnRleHQsICZrcmI1YXV0aF9jb250ZXh0LAorCSoqCQkJJmtyYjVpbl9kYXRhLCBrcmI1c2VydmVyLCBrcmI1a2V5dGFiLAorCSoqCQkJJmFwX29wdGlvbiwgJmtyYjV0aWNrZXQpKSAhPSAwKSAgeyBFcnJvciB9CisJKi8KKworCXAgPSAodW5zaWduZWQgY2hhciAqKWluZGF0YS0+ZGF0YTsKKwlpZiAoKGFzbjF0aWNrZXQgPSAoS1JCNV9US1RCT0RZICopIGQyaV9LUkI1X1RJQ0tFVChOVUxMLCAmcCwKKwkJCQkJCShsb25nKSBpbmRhdGEtPmxlbmd0aCkpID09IE5VTEwpCisJCXsKKwkJQklPX3NucHJpbnRmKGtzc2xfZXJyLT50ZXh0LCBLU1NMX0VSUl9NQVgsCisJCQkiZDJpX0tSQjVfVElDS0VUKCkgQVNOLjEgZGVjb2RlIGZhaWx1cmUuXG4iKTsKKwkJa3NzbF9lcnItPnJlYXNvbiA9IFNTTF9SX0tSQjVfU19SRF9SRVE7CisJCWdvdG8gZXJyOworCQl9CisJCisJLyogV2FzOiAga3JiNXJjID0ga3JiNV9kZWNvZGVfdGlja2V0KGtyYjVpbl9kYXRhLCZrcmI1dGlja2V0KSkgIT0gMCkgKi8KKwlpZiAoKGtyYjVyYyA9IGtzc2xfVEtUMnRrdChrcmI1Y29udGV4dCwgYXNuMXRpY2tldCwgJmtyYjV0aWNrZXQsCisJCQkJCWtzc2xfZXJyKSkgIT0gMCkKKwkJeworCQlCSU9fc25wcmludGYoa3NzbF9lcnItPnRleHQsIEtTU0xfRVJSX01BWCwKKwkJCSJFcnJvciBjb252ZXJ0aW5nIEFTTi4xIHRpY2tldCB0byBrcmI1X3RpY2tldC5cbiIpOworCQlrc3NsX2Vyci0+cmVhc29uID0gU1NMX1JfS1JCNV9TX1JEX1JFUTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICghIGtyYjVfcHJpbmNpcGFsX2NvbXBhcmUoa3JiNWNvbnRleHQsIGtyYjVzZXJ2ZXIsCisJCQkJCQkgIGtyYjV0aWNrZXQtPnNlcnZlcikpICB7CisJCWtyYjVyYyA9IEtSQjVfUFJJTkNfTk9NQVRDSDsKKwkJQklPX3NucHJpbnRmKGtzc2xfZXJyLT50ZXh0LCBLU1NMX0VSUl9NQVgsCisJCQkic2VydmVyIHByaW5jaXBhbCAhPSB0aWNrZXQgcHJpbmNpcGFsXG4iKTsKKwkJa3NzbF9lcnItPnJlYXNvbiA9IFNTTF9SX0tSQjVfU19SRF9SRVE7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKChrcmI1cmMgPSBrcmI1X2t0X2dldF9lbnRyeShrcmI1Y29udGV4dCwga3JiNWtleXRhYiwKKwkJCWtyYjV0aWNrZXQtPnNlcnZlciwga3JiNXRpY2tldC0+ZW5jX3BhcnQua3ZubywKKwkJCWtyYjV0aWNrZXQtPmVuY19wYXJ0LmVuY3R5cGUsICZrdF9lbnRyeSkpICE9IDApICB7CisJCUJJT19zbnByaW50Zihrc3NsX2Vyci0+dGV4dCwgS1NTTF9FUlJfTUFYLAorCQkJImtyYjVfa3RfZ2V0X2VudHJ5KCkgZmFpbHMgd2l0aCAleC5cbiIsIGtyYjVyYyk7CisJCWtzc2xfZXJyLT5yZWFzb24gPSBTU0xfUl9LUkI1X1NfUkRfUkVROworCQlnb3RvIGVycjsKKwkJfQorCWlmICgoa3JiNXJjID0ga3JiNV9kZWNyeXB0X3RrdF9wYXJ0KGtyYjVjb250ZXh0LCAma3RfZW50cnkua2V5LAorCQkJa3JiNXRpY2tldCkpICE9IDApICB7CisJCUJJT19zbnByaW50Zihrc3NsX2Vyci0+dGV4dCwgS1NTTF9FUlJfTUFYLAorCQkJImtyYjVfZGVjcnlwdF90a3RfcGFydCgpIGZhaWxlZC5cbiIpOworCQlrc3NsX2Vyci0+cmVhc29uID0gU1NMX1JfS1JCNV9TX1JEX1JFUTsKKwkJZ290byBlcnI7CisJCX0KKwllbHNlICB7CisJCWtyYjVfa3RfZnJlZV9lbnRyeShrcmI1Y29udGV4dCwgJmt0X2VudHJ5KTsKKyNpZmRlZiBLU1NMX0RFQlVHCisJCXsKKwkJaW50IGk7IGtyYjVfYWRkcmVzcyAqKnBhZGRyID0ga3JiNXRpY2tldC0+ZW5jX3BhcnQyLT5jYWRkcnM7CisJCXByaW50ZigiRGVjcnlwdGVkIHRpY2tldCBmaWVsZHM6XG4iKTsKKwkJcHJpbnRmKCJcdGZsYWdzOiAlWCwgdHJhbnNpdC10eXBlOiAlWCIsCisJCQlrcmI1dGlja2V0LT5lbmNfcGFydDItPmZsYWdzLAorCQkJa3JiNXRpY2tldC0+ZW5jX3BhcnQyLT50cmFuc2l0ZWQudHJfdHlwZSk7CisJCXByaW50X2tyYjVfZGF0YSgiXHR0cmFuc2l0LWRhdGE6ICIsCisJCQkmKGtyYjV0aWNrZXQtPmVuY19wYXJ0Mi0+dHJhbnNpdGVkLnRyX2NvbnRlbnRzKSk7CisJCXByaW50ZigiXHRjYWRkcnM6ICVwLCBhdXRoZGF0YTogJXBcbiIsCisJCQlrcmI1dGlja2V0LT5lbmNfcGFydDItPmNhZGRycywKKwkJCWtyYjV0aWNrZXQtPmVuY19wYXJ0Mi0+YXV0aG9yaXphdGlvbl9kYXRhKTsKKwkJaWYgKHBhZGRyKQorCQkJeworCQkJcHJpbnRmKCJcdGNhZGRyczpcbiIpOworCQkJZm9yIChpPTA7IHBhZGRyW2ldICE9IE5VTEw7IGkrKykKKwkJCQl7CisJCQkJa3JiNV9kYXRhIGQ7CisJCQkJZC5sZW5ndGg9cGFkZHJbaV0tPmxlbmd0aDsKKwkJCQlkLmRhdGE9cGFkZHJbaV0tPmNvbnRlbnRzOworCQkJCXByaW50X2tyYjVfZGF0YSgiXHRcdElQOiAiLCAmZCk7CisJCQkJfQorCQkJfQorCQlwcmludGYoIlx0c3RhcnQvYXV0aC9lbmQgdGltZXM6ICVkIC8gJWQgLyAlZFxuIiwKKwkJCWtyYjV0aWNrZXQtPmVuY19wYXJ0Mi0+dGltZXMuc3RhcnR0aW1lLAorCQkJa3JiNXRpY2tldC0+ZW5jX3BhcnQyLT50aW1lcy5hdXRodGltZSwKKwkJCWtyYjV0aWNrZXQtPmVuY19wYXJ0Mi0+dGltZXMuZW5kdGltZSk7CisJCX0KKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisJCX0KKworCWtyYjVyYyA9IEtSQjVfTk9fVEtUX1NVUFBMSUVEOworCWlmICgha3JiNXRpY2tldCAgfHwJIWtyYjV0aWNrZXQtPmVuY19wYXJ0MiAgfHwKKyAgICAgICAgICAgICAgICAha3JiNXRpY2tldC0+ZW5jX3BhcnQyLT5jbGllbnQgIHx8CisgICAgICAgICAgICAgICAgIWtyYjV0aWNrZXQtPmVuY19wYXJ0Mi0+Y2xpZW50LT5kYXRhICB8fAorICAgICAgICAgICAgICAgICFrcmI1dGlja2V0LT5lbmNfcGFydDItPnNlc3Npb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9TX0JBRF9USUNLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHRpY2tldCBmcm9tIGtyYjVfcmRfcmVxLlxuIik7CisJCX0KKwllbHNlIGlmIChrc3NsX2N0eF9zZXRwcmluYyhrc3NsX2N0eCwgS1NTTF9DTElFTlQsCisJCSAma3JiNXRpY2tldC0+ZW5jX3BhcnQyLT5jbGllbnQtPnJlYWxtLAorCQkga3JiNXRpY2tldC0+ZW5jX3BhcnQyLT5jbGllbnQtPmRhdGEsCisJCSBrcmI1dGlja2V0LT5lbmNfcGFydDItPmNsaWVudC0+bGVuZ3RoKSkKKyAgICAgICAgICAgICAgICB7CisJCWtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9TX0JBRF9USUNLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAia3NzbF9jdHhfc2V0cHJpbmMoKSBmYWlscy5cbiIpOworCQl9CisJZWxzZSBpZiAoa3NzbF9jdHhfc2V0a2V5KGtzc2xfY3R4LCBrcmI1dGlja2V0LT5lbmNfcGFydDItPnNlc3Npb24pKQorICAgICAgICAgICAgICAgIHsKKwkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfQkFEX1RJQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJrc3NsX2N0eF9zZXRrZXkoKSBmYWlscy5cbiIpOworCQl9CisJZWxzZSBpZiAoa3JiNXRpY2tldC0+ZW5jX3BhcnQyLT5mbGFncyAmIFRLVF9GTEdfSU5WQUxJRCkKKyAgICAgICAgICAgICAgICB7CisJCWtyYjVyYyA9IEtSQjVLUkJfQVBfRVJSX1RLVF9JTlZBTElEOworICAgICAgICAgICAgICAgIGtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9TX0JBRF9USUNLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0aWNrZXQgZnJvbSBrcmI1X3JkX3JlcS5cbiIpOworCQl9CisJZWxzZQlrcmI1cmMgPSAwOworCisJa3NzbF9jdHgtPmVuY3R5cGUJPSBrcmI1dGlja2V0LT5lbmNfcGFydC5lbmN0eXBlOworCXR0aW1lcy0+YXV0aHRpbWUJPSBrcmI1dGlja2V0LT5lbmNfcGFydDItPnRpbWVzLmF1dGh0aW1lOworCXR0aW1lcy0+c3RhcnR0aW1lCT0ga3JiNXRpY2tldC0+ZW5jX3BhcnQyLT50aW1lcy5zdGFydHRpbWU7CisJdHRpbWVzLT5lbmR0aW1lIAk9IGtyYjV0aWNrZXQtPmVuY19wYXJ0Mi0+dGltZXMuZW5kdGltZTsKKwl0dGltZXMtPnJlbmV3X3RpbGwJPSBrcmI1dGlja2V0LT5lbmNfcGFydDItPnRpbWVzLnJlbmV3X3RpbGw7CisKKyBlcnI6CisjaWZkZWYgS1NTTF9ERUJVRworCWtzc2xfY3R4X3Nob3coa3NzbF9jdHgpOworI2VuZGlmCS8qIEtTU0xfREVCVUcgKi8KKworCWlmIChhc24xdGlja2V0KSAJS1JCNV9USUNLRVRfZnJlZSgoS1JCNV9USUNLRVQgKikgYXNuMXRpY2tldCk7CisgICAgICAgIGlmIChrcmI1a2V5dGFiKSAgICAgICAgIGtyYjVfa3RfY2xvc2Uoa3JiNWNvbnRleHQsIGtyYjVrZXl0YWIpOworCWlmIChrcmI1dGlja2V0KSAJa3JiNV9mcmVlX3RpY2tldChrcmI1Y29udGV4dCwga3JiNXRpY2tldCk7CisJaWYgKGtyYjVzZXJ2ZXIpIAlrcmI1X2ZyZWVfcHJpbmNpcGFsKGtyYjVjb250ZXh0LCBrcmI1c2VydmVyKTsKKwlyZXR1cm4gKGtyYjVyYyk7CisgICAgICAgIH0KKworCisvKglBbGxvY2F0ZSAmIHJldHVybiBhIG5ldyBrc3NsX2N0eCBzdHJ1Y3QuCisqLworS1NTTF9DVFgJKgora3NzbF9jdHhfbmV3KHZvaWQpCisgICAgICAgIHsKKwlyZXR1cm4gKChLU1NMX0NUWCAqKSBrc3NsX2NhbGxvYygxLCBzaXplb2YoS1NTTF9DVFgpKSk7CisgICAgICAgIH0KKworCisvKglGcmVlcyBhIGtzc2xfY3R4IHN0cnVjdCBhbmQgYW55IGFsbG9jYXRlZCBtZW1vcnkgaXQgaG9sZHMuCisqKglSZXR1cm5zIE5VTEwuCisqLworS1NTTF9DVFgJKgora3NzbF9jdHhfZnJlZShLU1NMX0NUWCAqa3NzbF9jdHgpCisgICAgICAgIHsKKwlpZiAoa3NzbF9jdHggPT0gTlVMTCkgIHJldHVybiBrc3NsX2N0eDsKKworCWlmIChrc3NsX2N0eC0+a2V5KSAgCQlPUEVOU1NMX2NsZWFuc2Uoa3NzbF9jdHgtPmtleSwKKwkJCQkJCQkgICAgICBrc3NsX2N0eC0+bGVuZ3RoKTsKKwlpZiAoa3NzbF9jdHgtPmtleSkgIAkJa3NzbF9mcmVlKGtzc2xfY3R4LT5rZXkpOworCWlmIChrc3NsX2N0eC0+Y2xpZW50X3ByaW5jKSAJa3NzbF9mcmVlKGtzc2xfY3R4LT5jbGllbnRfcHJpbmMpOworCWlmIChrc3NsX2N0eC0+c2VydmljZV9ob3N0KSAJa3NzbF9mcmVlKGtzc2xfY3R4LT5zZXJ2aWNlX2hvc3QpOworCWlmIChrc3NsX2N0eC0+c2VydmljZV9uYW1lKSAJa3NzbF9mcmVlKGtzc2xfY3R4LT5zZXJ2aWNlX25hbWUpOworCWlmIChrc3NsX2N0eC0+a2V5dGFiX2ZpbGUpIAlrc3NsX2ZyZWUoa3NzbF9jdHgtPmtleXRhYl9maWxlKTsKKworCWtzc2xfZnJlZShrc3NsX2N0eCk7CisJcmV0dXJuIChLU1NMX0NUWCAqKSBOVUxMOworICAgICAgICB9CisKKworLyoJR2l2ZW4gYW4gYXJyYXkgb2YgKGtyYjVfZGF0YSAqKSBlbnRpdHkgKGFuZCBvcHRpb25hbCByZWFsbSksCisqKglzZXQgdGhlIHBsYWluIChjaGFyICopIGNsaWVudF9wcmluYyBvciBzZXJ2aWNlX2hvc3QgbWVtYmVyCisqKglvZiB0aGUga3NzbF9jdHggc3RydWN0LgorKi8KK2tyYjVfZXJyb3JfY29kZQora3NzbF9jdHhfc2V0cHJpbmMoS1NTTF9DVFggKmtzc2xfY3R4LCBpbnQgd2hpY2gsCisgICAgICAgIGtyYjVfZGF0YSAqcmVhbG0sIGtyYjVfZGF0YSAqZW50aXR5LCBpbnQgbmVudGl0aWVzKQorICAgICAgICB7CisJY2hhcgkqKnByaW5jOworCWludCAJbGVuZ3RoOworCWludCBpOworCisJaWYgKGtzc2xfY3R4ID09IE5VTEwgIHx8ICBlbnRpdHkgPT0gTlVMTCkgIHJldHVybiBLU1NMX0NUWF9FUlI7CisKKwlzd2l0Y2ggKHdoaWNoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgY2FzZSBLU1NMX0NMSUVOVDoJcHJpbmMgPSAma3NzbF9jdHgtPmNsaWVudF9wcmluYzsJYnJlYWs7CisgICAgICAgIGNhc2UgS1NTTF9TRVJWRVI6CXByaW5jID0gJmtzc2xfY3R4LT5zZXJ2aWNlX2hvc3Q7CWJyZWFrOworICAgICAgICBkZWZhdWx0OgkJcmV0dXJuIEtTU0xfQ1RYX0VSUjsJCQlicmVhazsKKwkJfQorCWlmICgqcHJpbmMpICBrc3NsX2ZyZWUoKnByaW5jKTsKKworCS8qIEFkZCB1cCBhbGwgdGhlIGVudGl0eS0+bGVuZ3RocyAqLworCWxlbmd0aCA9IDA7CisJZm9yIChpPTA7IGkgPCBuZW50aXRpZXM7IGkrKykKKwkJeworCQlsZW5ndGggKz0gZW50aXR5W2ldLmxlbmd0aDsKKwkJfQorCS8qIEFkZCBpbiBzcGFjZSBmb3IgdGhlICcvJyBjaGFyYWN0ZXIocykgKGlmIGFueSkgKi8KKwlsZW5ndGggKz0gbmVudGl0aWVzLTE7CisJLyogU3BhY2UgZm9yIHRoZSAoJ0AnK3JlYWxtK05VTEwgfCBOVUxMKSAqLworCWxlbmd0aCArPSAoKHJlYWxtKT8gcmVhbG0tPmxlbmd0aCArIDI6IDEpOworCisJaWYgKCgqcHJpbmMgPSBrc3NsX2NhbGxvYygxLCBsZW5ndGgpKSA9PSBOVUxMKQorCQlyZXR1cm4gS1NTTF9DVFhfRVJSOworCWVsc2UKKwkJeworCQlmb3IgKGkgPSAwOyBpIDwgbmVudGl0aWVzOyBpKyspCisJCQl7CisJCQlzdHJuY2F0KCpwcmluYywgZW50aXR5W2ldLmRhdGEsIGVudGl0eVtpXS5sZW5ndGgpOworCQkJaWYgKGkgPCBuZW50aXRpZXMtMSkKKwkJCQl7CisJCQkJc3RyY2F0ICgqcHJpbmMsICIvIik7CisJCQkJfQorCQkJfQorCQlpZiAocmVhbG0pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisJCQlzdHJjYXQgKCpwcmluYywgIkAiKTsKKwkJCSh2b2lkKSBzdHJuY2F0KCpwcmluYywgcmVhbG0tPmRhdGEsIHJlYWxtLT5sZW5ndGgpOworCQkJfQorCQl9CisKKwlyZXR1cm4gS1NTTF9DVFhfT0s7CisgICAgICAgIH0KKworCisvKglTZXQgb25lIG9mIHRoZSBwbGFpbiAoY2hhciAqKSBzdHJpbmcgbWVtYmVycyBvZiB0aGUga3NzbF9jdHggc3RydWN0LgorKioJRGVmYXVsdCB2YWx1ZXMgc2hvdWxkIGJlOgorKioJCXdoaWNoID09IEtTU0xfU0VSVklDRQk9Pgkia2hvc3QiIChLUkI1U1ZDKQorKioJCXdoaWNoID09IEtTU0xfS0VZVEFCCT0+CSIvZXRjL2tyYjUua2V5dGFiIiAoS1JCNUtFWVRBQikKKyovCitrcmI1X2Vycm9yX2NvZGUKK2tzc2xfY3R4X3NldHN0cmluZyhLU1NMX0NUWCAqa3NzbF9jdHgsIGludCB3aGljaCwgY2hhciAqdGV4dCkKKyAgICAgICAgeworCWNoYXIJKipzdHJpbmc7CisKKwlpZiAoIWtzc2xfY3R4KSAgcmV0dXJuIEtTU0xfQ1RYX0VSUjsKKworCXN3aXRjaCAod2hpY2gpCisgICAgICAgICAgICAgICAgeworICAgICAgICBjYXNlIEtTU0xfU0VSVklDRToJc3RyaW5nID0gJmtzc2xfY3R4LT5zZXJ2aWNlX25hbWU7CWJyZWFrOworICAgICAgICBjYXNlIEtTU0xfU0VSVkVSOglzdHJpbmcgPSAma3NzbF9jdHgtPnNlcnZpY2VfaG9zdDsJYnJlYWs7CisgICAgICAgIGNhc2UgS1NTTF9DTElFTlQ6CXN0cmluZyA9ICZrc3NsX2N0eC0+Y2xpZW50X3ByaW5jOwlicmVhazsKKyAgICAgICAgY2FzZSBLU1NMX0tFWVRBQjoJc3RyaW5nID0gJmtzc2xfY3R4LT5rZXl0YWJfZmlsZTsJYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CQlyZXR1cm4gS1NTTF9DVFhfRVJSOwkJCWJyZWFrOworCQl9CisJaWYgKCpzdHJpbmcpICBrc3NsX2ZyZWUoKnN0cmluZyk7CisKKwlpZiAoIXRleHQpCisgICAgICAgICAgICAgICAgeworCQkqc3RyaW5nID0gJ1wwJzsKKwkJcmV0dXJuIEtTU0xfQ1RYX09LOworCQl9CisKKwlpZiAoKCpzdHJpbmcgPSBrc3NsX2NhbGxvYygxLCBzdHJsZW4odGV4dCkgKyAxKSkgPT0gTlVMTCkKKwkJcmV0dXJuIEtTU0xfQ1RYX0VSUjsKKwllbHNlCisJCXN0cmNweSgqc3RyaW5nLCB0ZXh0KTsKKworCXJldHVybiBLU1NMX0NUWF9PSzsKKyAgICAgICAgfQorCisKKy8qCUNvcHkgdGhlIEtlcmJlcm9zIHNlc3Npb24ga2V5IGZyb20gYSAoa3JiNV9rZXlibG9jayAqKSB0byBhIGtzc2xfY3R4CisqKglzdHJ1Y3QuICBDbGVhciBrc3NsX2N0eC0+a2V5IGlmIEtlcmJlcm9zIHNlc3Npb24ga2V5IGlzIE5VTEwuCisqLwora3JiNV9lcnJvcl9jb2RlCitrc3NsX2N0eF9zZXRrZXkoS1NTTF9DVFggKmtzc2xfY3R4LCBrcmI1X2tleWJsb2NrICpzZXNzaW9uKQorICAgICAgICB7CisJaW50IAkJbGVuZ3RoOworCWtyYjVfZW5jdHlwZQllbmN0eXBlOworCWtyYjVfb2N0ZXQgRkFSCSpjb250ZW50cyA9IE5VTEw7CisKKwlpZiAoIWtzc2xfY3R4KSAgcmV0dXJuIEtTU0xfQ1RYX0VSUjsKKworCWlmIChrc3NsX2N0eC0+a2V5KQorICAgICAgICAgICAgICAgIHsKKwkJT1BFTlNTTF9jbGVhbnNlKGtzc2xfY3R4LT5rZXksIGtzc2xfY3R4LT5sZW5ndGgpOworCQlrc3NsX2ZyZWUoa3NzbF9jdHgtPmtleSk7CisJCX0KKworCWlmIChzZXNzaW9uKQorICAgICAgICAgICAgICAgIHsKKworI2lmZGVmIEtSQjVfSEVJTURBTAorCQlsZW5ndGggPSBzZXNzaW9uLT5rZXl2YWx1ZS0+bGVuZ3RoOworCQllbmN0eXBlID0gc2Vzc2lvbi0+a2V5dHlwZTsKKwkJY29udGVudHMgPSBzZXNzaW9uLT5rZXl2YWx1ZS0+Y29udGVudHM7CisjZWxzZQorCQlsZW5ndGggPSBzZXNzaW9uLT5sZW5ndGg7CisJCWVuY3R5cGUgPSBzZXNzaW9uLT5lbmN0eXBlOworCQljb250ZW50cyA9IHNlc3Npb24tPmNvbnRlbnRzOworI2VuZGlmCisJCWtzc2xfY3R4LT5lbmN0eXBlID0gZW5jdHlwZTsKKwkJa3NzbF9jdHgtPmxlbmd0aCAgPSBsZW5ndGg7CisJCX0KKwllbHNlCisgICAgICAgICAgICAgICAgeworCQlrc3NsX2N0eC0+ZW5jdHlwZSA9IEVOQ1RZUEVfVU5LTk9XTjsKKwkJa3NzbF9jdHgtPmxlbmd0aCAgPSAwOworCQlyZXR1cm4gS1NTTF9DVFhfT0s7CisJCX0KKworCWlmICgoa3NzbF9jdHgtPmtleSA9CisgICAgICAgICAgICAgICAgKGtyYjVfb2N0ZXQgRkFSICopIGtzc2xfY2FsbG9jKDEsIGtzc2xfY3R4LT5sZW5ndGgpKSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKwkJa3NzbF9jdHgtPmxlbmd0aCAgPSAwOworCQlyZXR1cm4gS1NTTF9DVFhfRVJSOworCQl9CisJZWxzZQorCQltZW1jcHkoa3NzbF9jdHgtPmtleSwgY29udGVudHMsIGxlbmd0aCk7CisKKwlyZXR1cm4gS1NTTF9DVFhfT0s7CisgICAgICAgIH0KKworCisvKglEaXNwbGF5IGNvbnRlbnRzIG9mIGtzc2xfY3R4IHN0cnVjdAorKi8KK3ZvaWQKK2tzc2xfY3R4X3Nob3coS1NTTF9DVFggKmtzc2xfY3R4KQorICAgICAgICB7CisJaW50IAlpOworCisJcHJpbnRmKCJrc3NsX2N0eDogIik7CisJaWYgKGtzc2xfY3R4ID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworCQlwcmludGYoIk5VTExcbiIpOworCQlyZXR1cm47CisJCX0KKwllbHNlCisJCXByaW50ZigiJXBcbiIsICh2b2lkICopa3NzbF9jdHgpOworCisJcHJpbnRmKCJcdHNlcnZpY2U6XHQlc1xuIiwKKyAgICAgICAgICAgICAgICAoa3NzbF9jdHgtPnNlcnZpY2VfbmFtZSk/IGtzc2xfY3R4LT5zZXJ2aWNlX25hbWU6ICJOVUxMIik7CisJcHJpbnRmKCJcdGNsaWVudDpcdCVzXG4iLAorICAgICAgICAgICAgICAgIChrc3NsX2N0eC0+Y2xpZW50X3ByaW5jKT8ga3NzbF9jdHgtPmNsaWVudF9wcmluYzogIk5VTEwiKTsKKwlwcmludGYoIlx0c2VydmVyOlx0JXNcbiIsCisgICAgICAgICAgICAgICAgKGtzc2xfY3R4LT5zZXJ2aWNlX2hvc3QpPyBrc3NsX2N0eC0+c2VydmljZV9ob3N0OiAiTlVMTCIpOworCXByaW50ZigiXHRrZXl0YWI6XHQlc1xuIiwKKyAgICAgICAgICAgICAgICAoa3NzbF9jdHgtPmtleXRhYl9maWxlKT8ga3NzbF9jdHgtPmtleXRhYl9maWxlOiAiTlVMTCIpOworCXByaW50ZigiXHRrZXkgWyVkOiVkXTpcdCIsCisgICAgICAgICAgICAgICAga3NzbF9jdHgtPmVuY3R5cGUsIGtzc2xfY3R4LT5sZW5ndGgpOworCisJZm9yIChpPTA7IGkgPCBrc3NsX2N0eC0+bGVuZ3RoICAmJiAga3NzbF9jdHgtPmtleTsgaSsrKQorICAgICAgICAgICAgICAgIHsKKwkJcHJpbnRmKCIlMDJ4Iiwga3NzbF9jdHgtPmtleVtpXSk7CisJCX0KKwlwcmludGYoIlxuIik7CisJcmV0dXJuOworICAgICAgICB9CisKKyAgICBpbnQgCisgICAga3NzbF9rZXl0YWJfaXNfYXZhaWxhYmxlKEtTU0xfQ1RYICprc3NsX2N0eCkKK3sKKyAgICBrcmI1X2NvbnRleHQJCWtyYjVjb250ZXh0ID0gTlVMTDsKKyAgICBrcmI1X2tleXRhYiAJCWtyYjVrZXl0YWIgPSBOVUxMOworICAgIGtyYjVfa2V5dGFiX2VudHJ5ICAgICAgICAgICBlbnRyeTsKKyAgICBrcmI1X3ByaW5jaXBhbCAgICAgICAgICAgICAgcHJpbmMgPSBOVUxMOworICAgIGtyYjVfZXJyb3JfY29kZSAgCQlrcmI1cmMgPSBLUkI1S1JCX0VSUl9HRU5FUklDOworICAgIGludCByYyA9IDA7CisKKyAgICBpZiAoKGtyYjVyYyA9IGtyYjVfaW5pdF9jb250ZXh0KCZrcmI1Y29udGV4dCkpKQorICAgICAgICByZXR1cm4oMCk7CisKKyAgICAvKglrc3NsX2N0eC0+a2V5dGFiX2ZpbGUgPT0gTlVMTCA9PT4gdXNlIEtlcmJlcm9zIGRlZmF1bHQKKyAgICAqLworICAgIGlmIChrc3NsX2N0eC0+a2V5dGFiX2ZpbGUpCisgICAgeworICAgICAgICBrcmI1cmMgPSBrcmI1X2t0X3Jlc29sdmUoa3JiNWNvbnRleHQsIGtzc2xfY3R4LT5rZXl0YWJfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma3JiNWtleXRhYik7CisgICAgICAgIGlmIChrcmI1cmMpCisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGtyYjVyYyA9IGtyYjVfa3RfZGVmYXVsdChrcmI1Y29udGV4dCwma3JiNWtleXRhYik7CisgICAgICAgIGlmIChrcmI1cmMpCisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQorCisgICAgLyogdGhlIGhvc3Qga2V5IHdlIGFyZSBsb29raW5nIGZvciAqLworICAgIGtyYjVyYyA9IGtyYjVfc25hbWVfdG9fcHJpbmNpcGFsKGtyYjVjb250ZXh0LCBOVUxMLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrc3NsX2N0eC0+c2VydmljZV9uYW1lID8ga3NzbF9jdHgtPnNlcnZpY2VfbmFtZTogS1JCNVNWQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLUkI1X05UX1NSVl9IU1QsICZwcmluYyk7CisKKyAgICBpZiAoa3JiNXJjKQorCWdvdG8gZXhpdDsKKworICAgIGtyYjVyYyA9IGtyYjVfa3RfZ2V0X2VudHJ5KGtyYjVjb250ZXh0LCBrcmI1a2V5dGFiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogSUdOT1JFX1ZOTyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBJR05PUkVfRU5DVFlQRSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5KTsKKyAgICBpZiAoIGtyYjVyYyA9PSBLUkI1X0tUX05PVEZPVU5EICkgeworICAgICAgICByYyA9IDE7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9IGVsc2UgaWYgKCBrcmI1cmMgKQorICAgICAgICBnb3RvIGV4aXQ7CisgICAgCisgICAga3JiNV9rdF9mcmVlX2VudHJ5KGtyYjVjb250ZXh0LCAmZW50cnkpOworICAgIHJjID0gMTsKKworICBleGl0OgorICAgIGlmIChrcmI1a2V5dGFiKSAgICAga3JiNV9rdF9jbG9zZShrcmI1Y29udGV4dCwga3JiNWtleXRhYik7CisgICAgaWYgKHByaW5jKSAgICAgICAgICBrcmI1X2ZyZWVfcHJpbmNpcGFsKGtyYjVjb250ZXh0LCBwcmluYyk7CisgICAgaWYgKGtyYjVjb250ZXh0KQlrcmI1X2ZyZWVfY29udGV4dChrcmI1Y29udGV4dCk7CisgICAgcmV0dXJuKHJjKTsKK30KKworaW50IAora3NzbF90Z3RfaXNfYXZhaWxhYmxlKEtTU0xfQ1RYICprc3NsX2N0eCkKKyAgICAgICAgeworICAgICAgICBrcmI1X2Vycm9yX2NvZGUJCWtyYjVyYyA9IEtSQjVLUkJfRVJSX0dFTkVSSUM7CisgICAgICAgIGtyYjVfY29udGV4dAkJa3JiNWNvbnRleHQgPSBOVUxMOworICAgICAgICBrcmI1X2NjYWNoZSAJCWtyYjVjY2RlZiA9IE5VTEw7CisgICAgICAgIGtyYjVfY3JlZHMJCWtyYjVjcmVkcywgKmtyYjVjcmVkc3AgPSBOVUxMOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICByYyA9IDA7CisKKyAgICAgICAgbWVtc2V0KChjaGFyICopJmtyYjVjcmVkcywgMCwgc2l6ZW9mKGtyYjVjcmVkcykpOworCisgICAgICAgIGlmICgha3NzbF9jdHgpCisgICAgICAgICAgICByZXR1cm4oMCk7CisKKyAgICAgICAgaWYgKCFrc3NsX2N0eC0+c2VydmljZV9ob3N0KQorICAgICAgICAgICAgcmV0dXJuKDApOworCisgICAgICAgIGlmICgoa3JiNXJjID0ga3JiNV9pbml0X2NvbnRleHQoJmtyYjVjb250ZXh0KSkgIT0gMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOworCisgICAgICAgIGlmICgoa3JiNXJjID0ga3JiNV9zbmFtZV90b19wcmluY2lwYWwoa3JiNWNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3NzbF9jdHgtPnNlcnZpY2VfaG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa3NzbF9jdHgtPnNlcnZpY2VfbmFtZSk/IGtzc2xfY3R4LT5zZXJ2aWNlX25hbWU6IEtSQjVTVkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1JCNV9OVF9TUlZfSFNULCAma3JiNWNyZWRzLnNlcnZlcikpICE9IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICBpZiAoKGtyYjVyYyA9IGtyYjVfY2NfZGVmYXVsdChrcmI1Y29udGV4dCwgJmtyYjVjY2RlZikpICE9IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICBpZiAoKGtyYjVyYyA9IGtyYjVfY2NfZ2V0X3ByaW5jaXBhbChrcmI1Y29udGV4dCwga3JiNWNjZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtyYjVjcmVkcy5jbGllbnQpKSAhPSAwKQorICAgICAgICAgICAgZ290byBlcnI7CisKKyAgICAgICAgaWYgKChrcmI1cmMgPSBrcmI1X2dldF9jcmVkZW50aWFscyhrcmI1Y29udGV4dCwgMCwga3JiNWNjZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma3JiNWNyZWRzLCAma3JiNWNyZWRzcCkpICE9IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICByYyA9IDE7CisKKyAgICAgIGVycjoKKyNpZmRlZiBLU1NMX0RFQlVHCisJa3NzbF9jdHhfc2hvdyhrc3NsX2N0eCk7CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCisJaWYgKGtyYjVjcmVkcy5jbGllbnQpCWtyYjVfZnJlZV9wcmluY2lwYWwoa3JiNWNvbnRleHQsIGtyYjVjcmVkcy5jbGllbnQpOworCWlmIChrcmI1Y3JlZHMuc2VydmVyKQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGtyYjVjb250ZXh0LCBrcmI1Y3JlZHMuc2VydmVyKTsKKwlpZiAoa3JiNWNvbnRleHQpCWtyYjVfZnJlZV9jb250ZXh0KGtyYjVjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuKHJjKTsKKwl9CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU5ET1dTKSAmJiAhZGVmaW5lZChPUEVOU1NMX1NZU19XSU4zMikKK3ZvaWQga3NzbF9rcmI1X2ZyZWVfZGF0YV9jb250ZW50cyhrcmI1X2NvbnRleHQgY29udGV4dCwga3JiNV9kYXRhICpkYXRhKQorCXsKKyNpZmRlZiBLUkI1X0hFSU1EQUwKKwlkYXRhLT5sZW5ndGggPSAwOworICAgICAgICBpZiAoZGF0YS0+ZGF0YSkKKyAgICAgICAgICAgIGZyZWUoZGF0YS0+ZGF0YSk7CisjZWxpZiBkZWZpbmVkKEtSQjVfTUlUX09MRDExKQorCWlmIChkYXRhLT5kYXRhKSAgeworCQlrcmI1X3hmcmVlKGRhdGEtPmRhdGEpOworCQlkYXRhLT5kYXRhID0gMDsKKwkJfQorI2Vsc2UKKwlrcmI1X2ZyZWVfZGF0YV9jb250ZW50cyhOVUxMLCBkYXRhKTsKKyNlbmRpZgorCX0KKyNlbmRpZiAvKiAhT1BFTlNTTF9TWVNfV0lORE9XUyAmJiAhT1BFTlNTTF9TWVNfV0lOMzIgKi8KKworCisvKiAgR2l2ZW4gcG9pbnRlcnMgdG8gS2VyYmVyb3NUaW1lIGFuZCBzdHJ1Y3QgdG0gc3RydWN0cywgY29udmVydCB0aGUKKyoqICBLZXJiZXJvc1RpbWUgc3RyaW5nIHRvIHN0cnVjdCB0bS4gIE5vdGUgdGhhdCBLZXJiZXJvc1RpbWUgaXMgYQorKiogIEFTTjFfR0VORVJBTElaRURUSU1FIHZhbHVlLCBjb25zdHJhaW5lZCB0byBHTVQgd2l0aCBubyBmcmFjdGlvbmFsCisqKiAgc2Vjb25kcyBhcyBkZWZpbmVkIGluIFJGQyAxNTEwLgorKiogIFJldHVybiBwb2ludGVyIHRvIHRoZSAocGFydGlhbGx5KSBmaWxsZWQgaW4gc3RydWN0IHRtIG9uIHN1Y2Nlc3MsCisqKiAgcmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KKyovCitzdGF0aWMgc3RydWN0IHRtICprX2dtdGltZShBU04xX0dFTkVSQUxJWkVEVElNRSAqZ3RpbWUsIHN0cnVjdCB0bSAqa190bSkKKwl7CisJY2hhciAJCWMsICpwOworCisJaWYgKCFrX3RtKSAgcmV0dXJuIE5VTEw7CisJaWYgKGd0aW1lID09IE5VTEwgIHx8ICBndGltZS0+bGVuZ3RoIDwgMTQpICByZXR1cm4gTlVMTDsKKwlpZiAoZ3RpbWUtPmRhdGEgPT0gTlVMTCkgIHJldHVybiBOVUxMOworCisJcCA9IChjaGFyICopJmd0aW1lLT5kYXRhWzE0XTsKKworCWMgPSAqcDsJICpwID0gJ1wwJzsgIHAgLT0gMjsgIGtfdG0tPnRtX3NlYyAgPSBhdG9pKHApOyAgICAgICoocCsyKSA9IGM7CisJYyA9ICpwOwkgKnAgPSAnXDAnOyAgcCAtPSAyOyAga190bS0+dG1fbWluICA9IGF0b2kocCk7ICAgICAgKihwKzIpID0gYzsKKwljID0gKnA7CSAqcCA9ICdcMCc7ICBwIC09IDI7ICBrX3RtLT50bV9ob3VyID0gYXRvaShwKTsgICAgICAqKHArMikgPSBjOworCWMgPSAqcDsJICpwID0gJ1wwJzsgIHAgLT0gMjsgIGtfdG0tPnRtX21kYXkgPSBhdG9pKHApOyAgICAgICoocCsyKSA9IGM7CisJYyA9ICpwOwkgKnAgPSAnXDAnOyAgcCAtPSAyOyAga190bS0+dG1fbW9uICA9IGF0b2kocCktMTsgICAgKihwKzIpID0gYzsKKwljID0gKnA7CSAqcCA9ICdcMCc7ICBwIC09IDQ7ICBrX3RtLT50bV95ZWFyID0gYXRvaShwKS0xOTAwOyAqKHArNCkgPSBjOworCisJcmV0dXJuIGtfdG07CisJfQorCisKKy8qICBIZWxwZXIgZnVuY3Rpb24gZm9yIGtzc2xfdmFsaWRhdGVfdGltZXMoKS4KKyoqICBXZSBuZWVkIGNvbnRleHQtPmNsb2Nrc2tldywgYnV0IGtyYjVfY29udGV4dCBpcyBhbiBvcGFxdWUgc3RydWN0LgorKiogIFNvIHdlIHRyeSB0byBzbmVlayB0aGUgY2xvY2tza2V3IG91dCB0aHJvdWdoIHRoZSByZXBsYXkgY2FjaGUuCisqKglJZiB0aGF0IGZhaWxzIGp1c3QgcmV0dXJuIGEgbGlrZWx5IGRlZmF1bHQgKDMwMCBzZWNvbmRzKS4KKyovCitzdGF0aWMga3JiNV9kZWx0YXQgZ2V0X3JjX2Nsb2Nrc2tldyhrcmI1X2NvbnRleHQgY29udGV4dCkKKwl7CisJa3JiNV9yY2FjaGUgCXJjOworCWtyYjVfZGVsdGF0IAljbG9ja3NrZXc7CisKKwlpZiAoa3JiNV9yY19kZWZhdWx0KGNvbnRleHQsICZyYykpICByZXR1cm4gS1NTTF9DTE9DS1NLRVc7CisJaWYgKGtyYjVfcmNfaW5pdGlhbGl6ZShjb250ZXh0LCByYywgMCkpICByZXR1cm4gS1NTTF9DTE9DS1NLRVc7CisJaWYgKGtyYjVfcmNfZ2V0X2xpZmVzcGFuKGNvbnRleHQsIHJjLCAmY2xvY2tza2V3KSkgIHsKKwkJY2xvY2tza2V3ID0gS1NTTF9DTE9DS1NLRVc7CisJCX0KKwkodm9pZCkga3JiNV9yY19kZXN0cm95KGNvbnRleHQsIHJjKTsKKwlyZXR1cm4gY2xvY2tza2V3OworCX0KKworCisvKiAga3NzbF92YWxpZGF0ZV90aW1lcygpIGNvbWJpbmVzIChhbmQgbW9yZSBpbXBvcnRhbnRseSBleHBvc2VzKQorKiogIHRoZSBNSVQgS1JCNSBpbnRlcm5hbCBmdW5jdGlvbiBrcmI1X3ZhbGlkYXRlX3RpbWVzKCkgYW5kIHRoZQorKiogIGluX2Nsb2NrX3NrZXcoKSBtYWNyby4gIFRoZSBhdXRoZW50aWNhdG9yIGNsaWVudCB0aW1lIGlzIGNoZWNrZWQKKyoqICB0byBiZSB3aXRoaW4gY2xvY2tza2V3IHNlY3Mgb2YgdGhlIGN1cnJlbnQgdGltZSBhbmQgdGhlIGN1cnJlbnQKKyoqICB0aW1lIGlzIGNoZWNrZWQgdG8gYmUgd2l0aGluIHRoZSB0aWNrZXQgc3RhcnQgYW5kIGV4cGlyZSB0aW1lcy4KKyoqICBFaXRoZXIgY2hlY2sgbWF5IGJlIG9taXR0ZWQgYnkgc3VwcGx5aW5nIGEgTlVMTCB2YWx1ZS4KKyoqICBSZXR1cm5zIDAgZm9yIHZhbGlkIHRpbWVzLCBTU0xfUl9LUkI1KiBlcnJvciBjb2RlcyBvdGhlcndpc2UuCisqKiAgU2VlIEFsc286IChLZXJiZXJvcyBzb3VyY2UpL2tyYjUvbGliL2tyYjUva3JiL3ZhbGlkX3RpbWVzLmMKKyoqICAyMDAxMDQyMCBWUlMKKyovCitrcmI1X2Vycm9yX2NvZGUgIGtzc2xfdmFsaWRhdGVfdGltZXMoCWtyYjVfdGltZXN0YW1wIGF0aW1lLAorCQkJCQlrcmI1X3RpY2tldF90aW1lcyAqdHRpbWVzKQorCXsKKwlrcmI1X2RlbHRhdCAJc2tldzsKKwlrcmI1X3RpbWVzdGFtcAlzdGFydCwgbm93OworCWtyYjVfZXJyb3JfY29kZQlyYzsKKwlrcmI1X2NvbnRleHQJY29udGV4dDsKKworCWlmICgocmMgPSBrcmI1X2luaXRfY29udGV4dCgmY29udGV4dCkpKQkgcmV0dXJuIFNTTF9SX0tSQjVfU19CQURfVElDS0VUOworCXNrZXcgPSBnZXRfcmNfY2xvY2tza2V3KGNvbnRleHQpOyAKKwlpZiAoKHJjID0ga3JiNV90aW1lb2ZkYXkoY29udGV4dCwmbm93KSkpIHJldHVybiBTU0xfUl9LUkI1X1NfQkFEX1RJQ0tFVDsKKwlrcmI1X2ZyZWVfY29udGV4dChjb250ZXh0KTsKKworCWlmIChhdGltZSAgJiYgIGxhYnMoYXRpbWUgLSBub3cpID49IHNrZXcpICByZXR1cm4gU1NMX1JfS1JCNV9TX1RLVF9TS0VXOworCisJaWYgKCEgdHRpbWVzKSAgcmV0dXJuIDA7CisKKwlzdGFydCA9ICh0dGltZXMtPnN0YXJ0dGltZSAhPSAwKT8gdHRpbWVzLT5zdGFydHRpbWU6IHR0aW1lcy0+YXV0aHRpbWU7CisJaWYgKHN0YXJ0IC0gbm93ID4gc2tldykgIHJldHVybiBTU0xfUl9LUkI1X1NfVEtUX05ZVjsKKwlpZiAoKG5vdyAtIHR0aW1lcy0+ZW5kdGltZSkgPiBza2V3KSAgcmV0dXJuIFNTTF9SX0tSQjVfU19US1RfRVhQSVJFRDsKKworI2lmZGVmIEtTU0xfREVCVUcKKwlwcmludGYoImtzc2xfdmFsaWRhdGVfdGltZXM6ICVkIHw8LSAgfCAlZCAtICVkIHwgPCAlZCAgLT58ICVkXG4iLAorCQlzdGFydCwgYXRpbWUsIG5vdywgc2tldywgdHRpbWVzLT5lbmR0aW1lKTsKKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisKKwlyZXR1cm4gMDsKKwl9CisKKworLyogIERlY29kZSBhbmQgZGVjcnlwdCBnaXZlbiBERVItZW5jb2RlZCBhdXRoZW50aWNhdG9yLCB0aGVuIHBhc3MKKyoqICBhdXRoZW50aWNhdG9yIGN0aW1lIGJhY2sgaW4gKmF0aW1lcCAob3IgMCBpZiB0aW1lIHVuYXZhaWxhYmxlKS4KKyoqICBSZXR1cm5zIGtyYjVfZXJyb3JfY29kZSBhbmQga3NzbF9lcnIgb24gZXJyb3IuICBBIE5VTEwgCisqKiAgYXV0aGVudGljYXRvciAoYXV0aGVudHAtPmxlbmd0aCA9PSAwKSBpcyBub3QgY29uc2lkZXJlZCBhbiBlcnJvci4KKyoqICBOb3RlIHRoYXQga3NzbF9jaGVja19hdXRoZW50KCkgbWFrZXMgdXNlIG9mIHRoZSBLUkI1IHNlc3Npb24ga2V5OworKiogIHlvdSBtdXN0IGNhbGwga3NzbF9zZ2V0X3RrdCgpIHRvIGdldCB0aGUga2V5IGJlZm9yZSBjYWxsaW5nIHRoaXMgcm91dGluZS4KKyovCitrcmI1X2Vycm9yX2NvZGUgIGtzc2xfY2hlY2tfYXV0aGVudCgKKwkJCS8qIElOICAgICAqLwlLU1NMX0NUWAkqa3NzbF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBJTiAgICAgKi8gICAJa3JiNV9kYXRhCSphdXRoZW50cCwKKwkJCS8qIE9VVCAgICAqLwlrcmI1X3RpbWVzdGFtcAkqYXRpbWVwLAorCQkJLyogT1VUICAgICovICAgIEtTU0xfRVJSCSprc3NsX2VyciAgKQorCXsKKyAgICAgICAga3JiNV9lcnJvcl9jb2RlCQlrcmI1cmMgPSAwOworCUtSQjVfRU5DREFUQQkJKmRlY19hdXRoZW50ID0gTlVMTDsKKwlLUkI1X0FVVEhFTlRCT0RZCSphdXRoID0gTlVMTDsKKwlrcmI1X2VuY3R5cGUJCWVuY3R5cGU7CisJRVZQX0NJUEhFUl9DVFgJCWNpcGhfY3R4OworCWNvbnN0IEVWUF9DSVBIRVIJKmVuYyA9IE5VTEw7CisJdW5zaWduZWQgY2hhcgkJaXZbRVZQX01BWF9JVl9MRU5HVEhdOworCWNvbnN0IHVuc2lnbmVkIGNoYXIJKnA7CisJdW5zaWduZWQgY2hhcgkJKnVuZW5jX2F1dGhlbnQ7CisJaW50IAkJCW91dGwsIHVuZW5jYnVmc2l6ZTsKKwlzdHJ1Y3QgdG0JCXRtX3RpbWUsICp0bV9sLCAqdG1fZzsKKwl0aW1lX3QJCQlub3csIHRsLCB0ZywgdHIsIHR6X29mZnNldDsKKworCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmNpcGhfY3R4KTsKKwkqYXRpbWVwID0gMDsKKwlrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIDAsICIiKTsKKworI2lmbmRlZiBLUkI1Q0hFQ0tBVVRICisJYXV0aGVudHAgPSBOVUxMOworI2Vsc2UKKyNpZglLUkI1Q0hFQ0tBVVRIID09IDAKKwlhdXRoZW50cCA9IE5VTEw7CisjZW5kaWYKKyNlbmRpZgkvKiBLUkI1Q0hFQ0tBVVRIICovCisKKwlpZiAoYXV0aGVudHAgPT0gTlVMTCAgfHwgIGF1dGhlbnRwLT5sZW5ndGggPT0gMCkgIHJldHVybiAwOworCisjaWZkZWYgS1NTTF9ERUJVRworICAgICAgICB7CisgICAgICAgIHVuc2lnbmVkIGludCB1aTsKKwlwcmludGYoImtzc2xfY2hlY2tfYXV0aGVudDogYXV0aGVudGljYXRvclslZF06XG4iLGF1dGhlbnRwLT5sZW5ndGgpOworCXAgPSBhdXRoZW50cC0+ZGF0YTsgCisJZm9yICh1aT0wOyB1aSA8IGF1dGhlbnRwLT5sZW5ndGg7IHVpKyspICBwcmludGYoIiUwMnggIixwW3VpXSk7CisJcHJpbnRmKCJcbiIpOworICAgICAgICB9CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCisJdW5lbmNidWZzaXplID0gMiAqIGF1dGhlbnRwLT5sZW5ndGg7CisJaWYgKCh1bmVuY19hdXRoZW50ID0gY2FsbG9jKDEsIHVuZW5jYnVmc2l6ZSkpID09IE5VTEwpCisJCXsKKwkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGUgYXV0aGVudGljYXRvciBidWZmZXIuXG4iKTsKKwkJa3JiNXJjID0gS1JCNUtSQl9FUlJfR0VORVJJQzsKKwkJZ290byBlcnI7CisJCX0KKworCXAgPSAodW5zaWduZWQgY2hhciAqKWF1dGhlbnRwLT5kYXRhOworCWlmICgoZGVjX2F1dGhlbnQgPSBkMmlfS1JCNV9FTkNEQVRBKE5VTEwsICZwLAorCQkJCQkobG9uZykgYXV0aGVudHAtPmxlbmd0aCkpID09IE5VTEwpIAorCQl7CisJCWtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9TX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZGVjb2RpbmcgYXV0aGVudGljYXRvci5cbiIpOworCQlrcmI1cmMgPSBLUkI1S1JCX0FQX0VSUl9CQURfSU5URUdSSVRZOworCQlnb3RvIGVycjsKKwkJfQorCisJZW5jdHlwZSA9IGRlY19hdXRoZW50LT5ldHlwZS0+ZGF0YVswXTsJLyogc2hvdWxkID0ga3NzbF9jdHgtPmVuY3R5cGUgKi8KKyNpZiAhZGVmaW5lZChLUkI1X01JVF9PTEQxMSkKKyAgICAgICAgICAgIHN3aXRjaCAoIGVuY3R5cGUgKSB7CisgICAgICAgICAgICBjYXNlIEVOQ1RZUEVfREVTM19DQkNfU0hBMToJCS8qICAgIEVWUF9kZXNfZWRlM19jYmMoKTsgICovCisgICAgICAgICAgICBjYXNlIEVOQ1RZUEVfREVTM19DQkNfU0hBOgorICAgICAgICAgICAgY2FzZSBFTkNUWVBFX0RFUzNfQ0JDX1JBVzoKKyAgICAgICAgICAgICAgICBrcmI1cmMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAsIGNhbid0IGhhbmRsZSBkZXJpdmVkIGtleXMgKi8KKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCWVuYyA9IGtzc2xfbWFwX2VuYyhlbmN0eXBlKTsKKwltZW1zZXQoaXYsIDAsIHNpemVvZiBpdik7ICAgICAgIC8qIHBlciBSRkMgMTUxMCAqLworCisJaWYgKGVuYyA9PSBOVUxMKQorCQl7CisJCS8qICBEaXNhYmxlIGtzc2xfY2hlY2tfYXV0aGVudCBmb3IgRU5DVFlQRV9ERVMzX0NCQ19TSEExLgorCQkqKiAgVGhpcyBlbmN0eXBlIGluZGljYXRlcyB0aGUgYXV0aGVudGljYXRvciB3YXMgZW5jcnlwdGVkCisJCSoqICB1c2luZyBrZXktdXNhZ2UgZGVyaXZlZCBrZXlzIHdoaWNoIG9wZW5zc2wgY2Fubm90IGRlY3J5cHQuCisJCSovCisJCWdvdG8gZXJyOworCQl9CisKKyAgICAgICAgaWYgKCFFVlBfQ2lwaGVySW5pdCgmY2lwaF9jdHgsZW5jLGtzc2xfY3R4LT5rZXksaXYsMCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGtzc2xfZXJyX3NldChrc3NsX2VyciwgU1NMX1JfS1JCNV9TX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAiRVZQX0NpcGhlckluaXQgZXJyb3IgZGVjcnlwdGluZyBhdXRoZW50aWNhdG9yLlxuIik7CisgICAgICAgICAgICAgICAga3JiNXJjID0gS1JCNUtSQl9BUF9FUlJfQkFEX0lOVEVHUklUWTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIG91dGwgPSBkZWNfYXV0aGVudC0+Y2lwaGVyLT5sZW5ndGg7CisgICAgICAgIGlmICghRVZQX0NpcGhlcigmY2lwaF9jdHgsdW5lbmNfYXV0aGVudCxkZWNfYXV0aGVudC0+Y2lwaGVyLT5kYXRhLG91dGwpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrc3NsX2Vycl9zZXQoa3NzbF9lcnIsIFNTTF9SX0tSQjVfU19JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgIkVWUF9DaXBoZXIgZXJyb3IgZGVjcnlwdGluZyBhdXRoZW50aWNhdG9yLlxuIik7CisgICAgICAgICAgICAgICAga3JiNXJjID0gS1JCNUtSQl9BUF9FUlJfQkFEX0lOVEVHUklUWTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmNpcGhfY3R4KTsKKworI2lmZGVmIEtTU0xfREVCVUcKKwl7CisJaW50IHBhZGw7CisJcHJpbnRmKCJrc3NsX2NoZWNrX2F1dGhlbnQ6IGRlY3J5cHRlZCBhdXRoZW50aWNhdG9yWyVkXSA9XG4iLCBvdXRsKTsKKwlmb3IgKHBhZGw9MDsgcGFkbCA8IG91dGw7IHBhZGwrKykgcHJpbnRmKCIlMDJ4ICIsdW5lbmNfYXV0aGVudFtwYWRsXSk7CisJcHJpbnRmKCJcbiIpOworCX0KKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisKKwlpZiAoKHAgPSBrc3NsX3NraXBfY29uZm91bmQoZW5jdHlwZSwgdW5lbmNfYXV0aGVudCkpID09IE5VTEwpCisJCXsKKwkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25mb3VuZGVkIGJ5IGF1dGhlbnRpY2F0b3IuXG4iKTsKKwkJa3JiNXJjID0gS1JCNUtSQl9BUF9FUlJfQkFEX0lOVEVHUklUWTsKKwkJZ290byBlcnI7CisJCX0KKwlvdXRsIC09IHAgLSB1bmVuY19hdXRoZW50OworCisJaWYgKChhdXRoID0gKEtSQjVfQVVUSEVOVEJPRFkgKikgZDJpX0tSQjVfQVVUSEVOVChOVUxMLCAmcCwKKwkJCQkJCQkgIChsb25nKSBvdXRsKSk9PU5VTEwpCisJCXsKKwkJa3NzbF9lcnJfc2V0KGtzc2xfZXJyLCBTU0xfUl9LUkI1X1NfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBkZWNvZGluZyBhdXRoZW50aWNhdG9yIGJvZHkuXG4iKTsKKwkJa3JiNXJjID0gS1JCNUtSQl9BUF9FUlJfQkFEX0lOVEVHUklUWTsKKwkJZ290byBlcnI7CisJCX0KKworCW1lbXNldCgmdG1fdGltZSwwLHNpemVvZihzdHJ1Y3QgdG0pKTsKKwlpZiAoa19nbXRpbWUoYXV0aC0+Y3RpbWUsICZ0bV90aW1lKSAgJiYKKwkJKCh0ciA9IG1rdGltZSgmdG1fdGltZSkpICE9ICh0aW1lX3QpKC0xKSkpCisgCQl7CisgCQlub3cgID0gdGltZSgmbm93KTsKKyAJCXRtX2wgPSBsb2NhbHRpbWUoJm5vdyk7IAl0bCA9IG1rdGltZSh0bV9sKTsKKyAJCXRtX2cgPSBnbXRpbWUoJm5vdyk7CQl0ZyA9IG1rdGltZSh0bV9nKTsKKyAJCXR6X29mZnNldCA9IHRnIC0gdGw7CisKKwkJKmF0aW1lcCA9IChrcmI1X3RpbWVzdGFtcCkodHIgLSB0el9vZmZzZXQpOworIAkJfQorCisjaWZkZWYgS1NTTF9ERUJVRworCXByaW50Zigia3NzbF9jaGVja19hdXRoZW50OiByZXR1cm5zICVkIGZvciBjbGllbnQgdGltZSAiLCAqYXRpbWVwKTsKKwlpZiAoYXV0aCAmJiBhdXRoLT5jdGltZSAmJiBhdXRoLT5jdGltZS0+bGVuZ3RoICYmIGF1dGgtPmN0aW1lLT5kYXRhKQorCQlwcmludGYoIiUuKnNcbiIsIGF1dGgtPmN0aW1lLT5sZW5ndGgsIGF1dGgtPmN0aW1lLT5kYXRhKTsKKwllbHNlCXByaW50ZigiTlVMTFxuIik7CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCisgZXJyOgorCWlmIChhdXRoKQkJS1JCNV9BVVRIRU5UX2ZyZWUoKEtSQjVfQVVUSEVOVCAqKSBhdXRoKTsKKwlpZiAoZGVjX2F1dGhlbnQpCUtSQjVfRU5DREFUQV9mcmVlKGRlY19hdXRoZW50KTsKKwlpZiAodW5lbmNfYXV0aGVudCkJZnJlZSh1bmVuY19hdXRoZW50KTsKKwlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjaXBoX2N0eCk7CisJcmV0dXJuIGtyYjVyYzsKKwl9CisKKworLyogIFJlcGxhY2VzIGtyYjVfYnVpbGRfcHJpbmNpcGFsX2V4dCgpLCB3aXRoIHZhcmFyZ3MgbGVuZ3RoID09IDIgKHN2YywgaG9zdCksCisqKiAgYmVjYXVzZSBJIGRvbnQndCBrbm93IGhvdyB0byBzdHViIHZhcmFyZ3MuCisqKiAgUmV0dXJucyBrcmI1X2Vycm9yX2NvZGUgPT0gRU5PTUVNIG9uIGFsbG9jIGVycm9yLCBvdGhlcndpc2UKKyoqICBwYXNzZXMgYmFjayBuZXdseSBjb25zdHJ1Y3RlZCBwcmluY2lwYWwsIHdoaWNoIHNob3VsZCBiZSBmcmVlZCBieSBjYWxsZXIuCisqLwora3JiNV9lcnJvcl9jb2RlICBrc3NsX2J1aWxkX3ByaW5jaXBhbF8yKAorCQkJLyogVVBEQVRFICovCWtyYjVfY29udGV4dAljb250ZXh0LAorCQkJLyogT1VUICAgICovCWtyYjVfcHJpbmNpcGFsCSpwcmluYywKKwkJCS8qIElOICAgICAqLwlpbnQgcmxlbiwgIGNvbnN0IGNoYXIgKnJlYWxtLAorCQkJLyogSU4JICAqLwlpbnQgc2xlbiwgIGNvbnN0IGNoYXIgKnN2YywKKwkJCS8qIElOCSAgKi8JaW50IGhsZW4sICBjb25zdCBjaGFyICpob3N0KQorCXsKKwlrcmI1X2RhdGEJCSpwX2RhdGEgPSBOVUxMOworCWtyYjVfcHJpbmNpcGFsCQluZXdfcCA9IE5VTEw7CisgICAgICAgIGNoYXIJCQkqbmV3X3IgPSBOVUxMOworCisJaWYgKChwX2RhdGEgPSAoa3JiNV9kYXRhICopIGNhbGxvYygyLCBzaXplb2Yoa3JiNV9kYXRhKSkpID09IE5VTEwgIHx8CisJICAgIChuZXdfcCA9IChrcmI1X3ByaW5jaXBhbCkgY2FsbG9jKDEsIHNpemVvZihrcmI1X3ByaW5jaXBhbF9kYXRhKSkpCisJCQk9PSBOVUxMKSAgZ290byBlcnI7CisJbmV3X3AtPmxlbmd0aCA9IDI7CisJbmV3X3AtPmRhdGEgPSBwX2RhdGE7CisKKwlpZiAoKG5ld19yID0gY2FsbG9jKDEsIHJsZW4gKyAxKSkgPT0gTlVMTCkgIGdvdG8gZXJyOworCW1lbWNweShuZXdfciwgcmVhbG0sIHJsZW4pOworCWtyYjVfcHJpbmNfc2V0X3JlYWxtX2xlbmd0aChjb250ZXh0LCBuZXdfcCwgcmxlbik7CisJa3JiNV9wcmluY19zZXRfcmVhbG1fZGF0YShjb250ZXh0LCBuZXdfcCwgbmV3X3IpOworCisJaWYgKChuZXdfcC0+ZGF0YVswXS5kYXRhID0gY2FsbG9jKDEsIHNsZW4gKyAxKSkgPT0gTlVMTCkgIGdvdG8gZXJyOworCW1lbWNweShuZXdfcC0+ZGF0YVswXS5kYXRhLCBzdmMsIHNsZW4pOworCW5ld19wLT5kYXRhWzBdLmxlbmd0aCA9IHNsZW47CisKKwlpZiAoKG5ld19wLT5kYXRhWzFdLmRhdGEgPSBjYWxsb2MoMSwgaGxlbiArIDEpKSA9PSBOVUxMKSAgZ290byBlcnI7CisJbWVtY3B5KG5ld19wLT5kYXRhWzFdLmRhdGEsIGhvc3QsIGhsZW4pOworCW5ld19wLT5kYXRhWzFdLmxlbmd0aCA9IGhsZW47CisJCisJa3JiNV9wcmluY190eXBlKGNvbnRleHQsIG5ld19wKSA9IEtSQjVfTlRfVU5LTk9XTjsKKwkqcHJpbmMgPSBuZXdfcDsKKwlyZXR1cm4gMDsKKworIGVycjoKKwlpZiAobmV3X3AgICYmICBuZXdfcFswXS5kYXRhKQlmcmVlKG5ld19wWzBdLmRhdGEpOworCWlmIChuZXdfcCAgJiYgIG5ld19wWzFdLmRhdGEpCWZyZWUobmV3X3BbMV0uZGF0YSk7CisJaWYgKG5ld19wKQlmcmVlKG5ld19wKTsKKwlpZiAobmV3X3IpCWZyZWUobmV3X3IpOworCXJldHVybiBFTk9NRU07CisJfQorCisKKyNlbHNlIC8qICFPUEVOU1NMX05PX0tSQjUgKi8KKworI2lmIGRlZmluZWQoUEVEQU5USUMpIHx8IGRlZmluZWQoT1BFTlNTTF9TWVNfVk1TKQorc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyNlbmRpZgorCisjZW5kaWYJLyogIU9QRU5TU0xfTk9fS1JCNQkqLworCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wva3NzbC5oIGIvbGliL29wZW5zc2wvc3NsL2tzc2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QyMGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL2tzc2wuaApAQCAtMCwwICsxLDE3OSBAQAorLyogc3NsL2tzc2wuaCAtKi0gbW9kZTogQzsgYy1maWxlLXN0eWxlOiAiZWF5IiAtKi0gKi8KKy8qIFdyaXR0ZW4gYnkgVmVybiBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiBmb3IgdGhlIE9wZW5TU0wgcHJvamVjdCAyMDAwLgorICogcHJvamVjdCAyMDAwLgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAyMDAwIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIGxpY2Vuc2luZ0BPcGVuU1NMLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5PcGVuU1NMLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKy8qCisqKgkxOTk5MDcwMQlWUlMgCVN0YXJ0ZWQuCisqLworCisjaWZuZGVmCUtTU0xfSAorI2RlZmluZQlLU1NMX0gKKworI2luY2x1ZGUgPG9wZW5zc2wvb3BlbnNzbGNvbmYuaD4KKworI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxrcmI1Lmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisqKglEZXBlbmRpbmcgb24gd2hpY2ggS1JCNSBpbXBsZW1lbnRhdGlvbiB1c2VkLCBzb21lIHR5cGVzIGZyb20KKyoqCXRoZSBvdGhlciBtYXkgYmUgbWlzc2luZy4gIFJlc29sdmUgdGhhdCBoZXJlIGFuZCBub3cKKyovCisjaWZkZWYgS1JCNV9IRUlNREFMCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIga3JiNV9vY3RldDsKKyNkZWZpbmUgRkFSCisjZWxzZQorCisjaWZuZGVmIEZBUgorI2RlZmluZSBGQVIKKyNlbmRpZgorCisjZW5kaWYKKworLyoJVW5jb21tZW50IHRoaXMgdG8gZGVidWcga3NzbCBwcm9ibGVtcyBvcgorKioJdG8gdHJhY2UgdXNhZ2Ugb2YgdGhlIEtlcmJlcm9zIHNlc3Npb24ga2V5CisqKgorKioJI2RlZmluZQkJS1NTTF9ERUJVRworKi8KKworI2lmbmRlZglLUkI1U1ZDCisjZGVmaW5lIEtSQjVTVkMJImhvc3QiCisjZW5kaWYKKworI2lmbmRlZglLUkI1S0VZVEFCCisjZGVmaW5lIEtSQjVLRVlUQUIJIi9ldGMva3JiNS5rZXl0YWIiCisjZW5kaWYKKworI2lmbmRlZiBLUkI1U0VOREFVVEgKKyNkZWZpbmUgS1JCNVNFTkRBVVRICTEKKyNlbmRpZgorCisjaWZuZGVmIEtSQjVDSEVDS0FVVEgKKyNkZWZpbmUgS1JCNUNIRUNLQVVUSAkxCisjZW5kaWYKKworI2lmbmRlZiBLU1NMX0NMT0NLU0tFVworI2RlZmluZQlLU1NMX0NMT0NLU0tFVwkzMDA7CisjZW5kaWYKKworI2RlZmluZQlLU1NMX0VSUl9NQVgJMjU1Cit0eXBlZGVmIHN0cnVjdCBrc3NsX2Vycl9zdCAgeworCWludCAgcmVhc29uOworCWNoYXIgdGV4dFtLU1NMX0VSUl9NQVgrMV07CisJfSBLU1NMX0VSUjsKKworCisvKglDb250ZXh0IGZvciBwYXNzaW5nCisqKgkJKDEpIEtlcmJlcm9zIHNlc3Npb24ga2V5IHRvIFNTTCwgYW5kCisqKgkJKDIpCUNvbmZpZyBkYXRhIGJldHdlZW4gYXBwbGljYXRpb24gYW5kIFNTTCBsaWIKKyovCit0eXBlZGVmIHN0cnVjdCBrc3NsX2N0eF9zdAorICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCXVzZWQgYnk6ICAgIGRpc3Bvc2l0aW9uOiAgICAgICAgICAgICovCisJY2hhciAqc2VydmljZV9uYW1lOwkvKglDLFMJICAgIGRlZmF1bHQgb2sgKGtzc2wpICAgICAgICovCisJY2hhciAqc2VydmljZV9ob3N0OwkvKglDCSAgICBpbnB1dCwgUkVRVUlSRUQgICAgICAgICAqLworCWNoYXIgKmNsaWVudF9wcmluYzsJLyoJUwkgICAgb3V0cHV0IGZyb20ga3JiNSB0aWNrZXQgKi8KKwljaGFyICprZXl0YWJfZmlsZTsJLyogICAgICBTCSAgICBOVUxMICgvZXRjL2tyYjUua2V5dGFiKSAqLworCWNoYXIgKmNyZWRfY2FjaGU7CS8qCUMJICAgIE5VTEwgKGRlZmF1bHQpICAgICAgICAgICovCisJa3JiNV9lbmN0eXBlIGVuY3R5cGU7CisJaW50IGxlbmd0aDsKKwlrcmI1X29jdGV0IEZBUiAqa2V5OworCX0gS1NTTF9DVFg7CisKKyNkZWZpbmUJS1NTTF9DTElFTlQgCTEKKyNkZWZpbmUgS1NTTF9TRVJWRVIgCTIKKyNkZWZpbmUJS1NTTF9TRVJWSUNFCTMKKyNkZWZpbmUJS1NTTF9LRVlUQUIgCTQKKworI2RlZmluZSBLU1NMX0NUWF9PSyAJMAorI2RlZmluZSBLU1NMX0NUWF9FUlIJMQorI2RlZmluZSBLU1NMX05PTUVNCTIKKworLyogUHVibGljIChmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBPcGVuU1NMIHdpdGggS2VyYmVyb3MgNSBzdXBwb3J0ICovCitrcmI1X2Vycm9yX2NvZGUga3NzbF9jdHhfc2V0c3RyaW5nKEtTU0xfQ1RYICprc3NsX2N0eCwgaW50IHdoaWNoLCBjaGFyICp0ZXh0KTsKK0tTU0xfQ1RYICprc3NsX2N0eF9uZXcodm9pZCk7CitLU1NMX0NUWCAqa3NzbF9jdHhfZnJlZShLU1NMX0NUWCAqa3NzbF9jdHgpOwordm9pZCBrc3NsX2N0eF9zaG93KEtTU0xfQ1RYICprc3NsX2N0eCk7CitrcmI1X2Vycm9yX2NvZGUga3NzbF9jdHhfc2V0cHJpbmMoS1NTTF9DVFggKmtzc2xfY3R4LCBpbnQgd2hpY2gsCisgICAgICAgIGtyYjVfZGF0YSAqcmVhbG0sIGtyYjVfZGF0YSAqZW50aXR5LCBpbnQgbmVudGl0aWVzKTsKK2tyYjVfZXJyb3JfY29kZQlrc3NsX2NnZXRfdGt0KEtTU0xfQ1RYICprc3NsX2N0eCwgIGtyYjVfZGF0YSAqKmVuY190a3RwLAorICAgICAgICBrcmI1X2RhdGEgKmF1dGhlbnAsIEtTU0xfRVJSICprc3NsX2Vycik7CitrcmI1X2Vycm9yX2NvZGUJa3NzbF9zZ2V0X3RrdChLU1NMX0NUWCAqa3NzbF9jdHgsICBrcmI1X2RhdGEgKmluZGF0YSwKKyAgICAgICAga3JiNV90aWNrZXRfdGltZXMgKnR0aW1lcywgS1NTTF9FUlIgKmtzc2xfZXJyKTsKK2tyYjVfZXJyb3JfY29kZSBrc3NsX2N0eF9zZXRrZXkoS1NTTF9DVFggKmtzc2xfY3R4LCBrcmI1X2tleWJsb2NrICpzZXNzaW9uKTsKK3ZvaWQJa3NzbF9lcnJfc2V0KEtTU0xfRVJSICprc3NsX2VyciwgaW50IHJlYXNvbiwgY2hhciAqdGV4dCk7Cit2b2lkIGtzc2xfa3JiNV9mcmVlX2RhdGFfY29udGVudHMoa3JiNV9jb250ZXh0IGNvbnRleHQsIGtyYjVfZGF0YSAqZGF0YSk7CitrcmI1X2Vycm9yX2NvZGUgIGtzc2xfYnVpbGRfcHJpbmNpcGFsXzIoa3JiNV9jb250ZXh0IGNvbnRleHQsCisJCQlrcmI1X3ByaW5jaXBhbCAqcHJpbmMsIGludCBybGVuLCBjb25zdCBjaGFyICpyZWFsbSwKKwkJCWludCBzbGVuLCBjb25zdCBjaGFyICpzdmMsIGludCBobGVuLCBjb25zdCBjaGFyICpob3N0KTsKK2tyYjVfZXJyb3JfY29kZSAga3NzbF92YWxpZGF0ZV90aW1lcyhrcmI1X3RpbWVzdGFtcCBhdGltZSwKKwkJCQkJa3JiNV90aWNrZXRfdGltZXMgKnR0aW1lcyk7CitrcmI1X2Vycm9yX2NvZGUgIGtzc2xfY2hlY2tfYXV0aGVudChLU1NMX0NUWCAqa3NzbF9jdHgsIGtyYjVfZGF0YSAqYXV0aGVudHAsCisJCQkgICAgICAgICAgICBrcmI1X3RpbWVzdGFtcCAqYXRpbWVwLCBLU1NMX0VSUiAqa3NzbF9lcnIpOwordW5zaWduZWQgY2hhcgkqa3NzbF9za2lwX2NvbmZvdW5kKGtyYjVfZW5jdHlwZSBlbmN0eXBlLCB1bnNpZ25lZCBjaGFyICphdXRobik7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCS8qIE9QRU5TU0xfTk9fS1JCNQkqLworI2VuZGlmCS8qIEtTU0xfSCAJKi8KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9rc3NsX2xjbC5oIGIvbGliL29wZW5zc2wvc3NsL2tzc2xfbGNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzOWM5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9rc3NsX2xjbC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIHNzbC9rc3NsLmggLSotIG1vZGU6IEM7IGMtZmlsZS1zdHlsZTogImVheSIgLSotICovCisvKiBXcml0dGVuIGJ5IFZlcm4gU3RhYXRzIDxzdGFhdHN2ckBhc2MuaHBjLm1pbD4gZm9yIHRoZSBPcGVuU1NMIHByb2plY3QgMjAwMC4KKyAqIHByb2plY3QgMjAwMC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBsaWNlbnNpbmdAT3BlblNTTC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cuT3BlblNTTC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaWZuZGVmCUtTU0xfTENMX0gKKyNkZWZpbmUJS1NTTF9MQ0xfSAorCisjaW5jbHVkZSA8b3BlbnNzbC9rc3NsLmg+CisKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFByaXZhdGUgKGludGVybmFsIHRvIE9wZW5TU0wpICovCit2b2lkIHByaW50X2tyYjVfZGF0YShjaGFyICpsYWJlbCwga3JiNV9kYXRhICprZGF0YSk7Cit2b2lkIHByaW50X2tyYjVfYXV0aGRhdGEoY2hhciAqbGFiZWwsIGtyYjVfYXV0aGRhdGEgKiphZGF0YSk7Cit2b2lkIHByaW50X2tyYjVfa2V5YmxvY2soY2hhciAqbGFiZWwsIGtyYjVfa2V5YmxvY2sgKmtleWJsayk7CisKK2NoYXIgKmtzdHJpbmcoY2hhciAqc3RyaW5nKTsKK2NoYXIgKmtudW1iZXIoaW50IGxlbiwga3JiNV9vY3RldCAqY29udGVudHMpOworCitjb25zdCBFVlBfQ0lQSEVSICprc3NsX21hcF9lbmMoa3JiNV9lbmN0eXBlIGVuY3R5cGUpOworCitpbnQga3NzbF9rZXl0YWJfaXNfYXZhaWxhYmxlKEtTU0xfQ1RYICprc3NsX2N0eCk7CitpbnQga3NzbF90Z3RfaXNfYXZhaWxhYmxlKEtTU0xfQ1RYICprc3NsX2N0eCk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCS8qIE9QRU5TU0xfTk9fS1JCNQkqLworI2VuZGlmCS8qIEtTU0xfTENMX0ggCSovCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvczIzX2NsbnQuYyBiL2xpYi9vcGVuc3NsL3NzbC9zMjNfY2xudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWZlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvczIzX2NsbnQuYwpAQCAtMCwwICsxLDcwMyBAQAorLyogc3NsL3MyM19jbG50LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKnNzbDIzX2dldF9jbGllbnRfbWV0aG9kKGludCB2ZXIpOworc3RhdGljIGludCBzc2wyM19jbGllbnRfaGVsbG8oU1NMICpzKTsKK3N0YXRpYyBpbnQgc3NsMjNfZ2V0X3NlcnZlcl9oZWxsbyhTU0wgKnMpOworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKnNzbDIzX2dldF9jbGllbnRfbWV0aG9kKGludCB2ZXIpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDIKKwlpZiAodmVyID09IFNTTDJfVkVSU0lPTikKKwkJcmV0dXJuKFNTTHYyX2NsaWVudF9tZXRob2QoKSk7CisjZW5kaWYKKwlpZiAodmVyID09IFNTTDNfVkVSU0lPTikKKwkJcmV0dXJuKFNTTHYzX2NsaWVudF9tZXRob2QoKSk7CisJZWxzZSBpZiAodmVyID09IFRMUzFfVkVSU0lPTikKKwkJcmV0dXJuKFRMU3YxX2NsaWVudF9tZXRob2QoKSk7CisJZWxzZQorCQlyZXR1cm4oTlVMTCk7CisJfQorCitJTVBMRU1FTlRfc3NsMjNfbWV0aF9mdW5jKFNTTHYyM19jbGllbnRfbWV0aG9kLAorCQkJc3NsX3VuZGVmaW5lZF9mdW5jdGlvbiwKKwkJCXNzbDIzX2Nvbm5lY3QsCisJCQlzc2wyM19nZXRfY2xpZW50X21ldGhvZCkKKworaW50IHNzbDIzX2Nvbm5lY3QoU1NMICpzKQorCXsKKwlCVUZfTUVNICpidWY9TlVMTDsKKwl1bnNpZ25lZCBsb25nIFRpbWU9KHVuc2lnbmVkIGxvbmcpdGltZShOVUxMKTsKKwl2b2lkICgqY2IpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpPU5VTEw7CisJaW50IHJldD0gLTE7CisJaW50IG5ld19zdGF0ZSxzdGF0ZTsKKworCVJBTkRfYWRkKCZUaW1lLHNpemVvZihUaW1lKSwwKTsKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKwljbGVhcl9zeXNfZXJyb3IoKTsKKworCWlmIChzLT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCWNiPXMtPmluZm9fY2FsbGJhY2s7CisJZWxzZSBpZiAocy0+Y3R4LT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCWNiPXMtPmN0eC0+aW5mb19jYWxsYmFjazsKKwkKKwlzLT5pbl9oYW5kc2hha2UrKzsKKwlpZiAoIVNTTF9pbl9pbml0KHMpIHx8IFNTTF9pbl9iZWZvcmUocykpIFNTTF9jbGVhcihzKTsgCisKKwlmb3IgKDs7KQorCQl7CisJCXN0YXRlPXMtPnN0YXRlOworCisJCXN3aXRjaChzLT5zdGF0ZSkKKwkJCXsKKwkJY2FzZSBTU0xfU1RfQkVGT1JFOgorCQljYXNlIFNTTF9TVF9DT05ORUNUOgorCQljYXNlIFNTTF9TVF9CRUZPUkV8U1NMX1NUX0NPTk5FQ1Q6CisJCWNhc2UgU1NMX1NUX09LfFNTTF9TVF9DT05ORUNUOgorCisJCQlpZiAocy0+c2Vzc2lvbiAhPSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfQ09OTkVDVCxTU0xfUl9TU0wyM19ET0lOR19TRVNTSU9OX0lEX1JFVVNFKTsKKwkJCQlyZXQ9IC0xOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCXMtPnNlcnZlcj0wOworCQkJaWYgKGNiICE9IE5VTEwpIGNiKHMsU1NMX0NCX0hBTkRTSEFLRV9TVEFSVCwxKTsKKworCQkJLyogcy0+dmVyc2lvbj1UTFMxX1ZFUlNJT047ICovCisJCQlzLT50eXBlPVNTTF9TVF9DT05ORUNUOworCisJCQlpZiAocy0+aW5pdF9idWYgPT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKChidWY9QlVGX01FTV9uZXcoKSkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlyZXQ9IC0xOworCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCWlmICghQlVGX01FTV9ncm93KGJ1ZixTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpKQorCQkJCQl7CisJCQkJCXJldD0gLTE7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJcy0+aW5pdF9idWY9YnVmOworCQkJCWJ1Zj1OVUxMOworCQkJCX0KKworCQkJaWYgKCFzc2wzX3NldHVwX2J1ZmZlcnMocykpIHsgcmV0PSAtMTsgZ290byBlbmQ7IH0KKworCQkJc3NsM19pbml0X2ZpbmlzaGVkX21hYyhzKTsKKworCQkJcy0+c3RhdGU9U1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19BOworCQkJcy0+Y3R4LT5zdGF0cy5zZXNzX2Nvbm5lY3QrKzsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDIzX1NUX0NXX0NMTlRfSEVMTE9fQToKKwkJY2FzZSBTU0wyM19TVF9DV19DTE5UX0hFTExPX0I6CisKKwkJCXMtPnNodXRkb3duPTA7CisJCQlyZXQ9c3NsMjNfY2xpZW50X2hlbGxvKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDIzX1NUX0NSX1NSVlJfSEVMTE9fQTsKKwkJCXMtPmluaXRfbnVtPTA7CisKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMMjNfU1RfQ1JfU1JWUl9IRUxMT19BOgorCQljYXNlIFNTTDIzX1NUX0NSX1NSVlJfSEVMTE9fQjoKKwkJCXJldD1zc2wyM19nZXRfc2VydmVyX2hlbGxvKHMpOworCQkJaWYgKHJldCA+PSAwKSBjYj1OVUxMOworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKworCQlkZWZhdWx0OgorCQkJU1NMZXJyKFNTTF9GX1NTTDIzX0NPTk5FQ1QsU1NMX1JfVU5LTk9XTl9TVEFURSk7CisJCQlyZXQ9IC0xOworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKwkJCX0KKworCQlpZiAocy0+ZGVidWcpIHsgKHZvaWQpQklPX2ZsdXNoKHMtPndiaW8pOyB9CisKKwkJaWYgKChjYiAhPSBOVUxMKSAmJiAocy0+c3RhdGUgIT0gc3RhdGUpKQorCQkJeworCQkJbmV3X3N0YXRlPXMtPnN0YXRlOworCQkJcy0+c3RhdGU9c3RhdGU7CisJCQljYihzLFNTTF9DQl9DT05ORUNUX0xPT1AsMSk7CisJCQlzLT5zdGF0ZT1uZXdfc3RhdGU7CisJCQl9CisJCX0KK2VuZDoKKwlzLT5pbl9oYW5kc2hha2UtLTsKKwlpZiAoYnVmICE9IE5VTEwpCisJCUJVRl9NRU1fZnJlZShidWYpOworCWlmIChjYiAhPSBOVUxMKQorCQljYihzLFNTTF9DQl9DT05ORUNUX0VYSVQscmV0KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgc3NsMjNfbm9fc3NsMl9jaXBoZXJzKFNTTCAqcykKKwl7CisJU1NMX0NJUEhFUiAqY2lwaGVyOworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJzOworCWludCBpOworCWNpcGhlcnMgPSBTU0xfZ2V0X2NpcGhlcnMocyk7CisJZm9yIChpID0gMDsgaSA8IHNrX1NTTF9DSVBIRVJfbnVtKGNpcGhlcnMpOyBpKyspCisJCXsKKwkJY2lwaGVyID0gc2tfU1NMX0NJUEhFUl92YWx1ZShjaXBoZXJzLCBpKTsKKwkJaWYgKGNpcGhlci0+YWxnb3JpdGhtX3NzbCA9PSBTU0xfU1NMVjIpCisJCQlyZXR1cm4gMDsKKwkJfQorCXJldHVybiAxOworCX0KKworc3RhdGljIGludCBzc2wyM19jbGllbnRfaGVsbG8oU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgY2hhciAqcCwqZDsKKwlpbnQgaSxjaF9sZW47CisJdW5zaWduZWQgbG9uZyBUaW1lLGw7CisJaW50IHNzbDJfY29tcGF0OworCWludCB2ZXJzaW9uID0gMCwgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcjsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJaW50IGo7CisJU1NMX0NPTVAgKmNvbXA7CisjZW5kaWYKKwlpbnQgcmV0OworCisJc3NsMl9jb21wYXQgPSAocy0+b3B0aW9ucyAmIFNTTF9PUF9OT19TU0x2MikgPyAwIDogMTsKKworCWlmIChzc2wyX2NvbXBhdCAmJiBzc2wyM19ub19zc2wyX2NpcGhlcnMocykpCisJCXNzbDJfY29tcGF0ID0gMDsKKworCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fVExTdjEpKQorCQl7CisJCXZlcnNpb24gPSBUTFMxX1ZFUlNJT047CisJCX0KKwllbHNlIGlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fU1NMdjMpKQorCQl7CisJCXZlcnNpb24gPSBTU0wzX1ZFUlNJT047CisJCX0KKwllbHNlIGlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fU1NMdjIpKQorCQl7CisJCXZlcnNpb24gPSBTU0wyX1ZFUlNJT047CisJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpZiAodmVyc2lvbiAhPSBTU0wyX1ZFUlNJT04pCisJCXsKKwkJLyogaGF2ZSB0byBkaXNhYmxlIFNTTCAyLjAgY29tcGF0aWJpbGl0eSBpZiB3ZSBuZWVkIFRMUyBleHRlbnNpb25zICovCisKKwkJaWYgKHMtPnRsc2V4dF9ob3N0bmFtZSAhPSBOVUxMKQorCQkJc3NsMl9jb21wYXQgPSAwOworCQlpZiAocy0+dGxzZXh0X3N0YXR1c190eXBlICE9IC0xKQorCQkJc3NsMl9jb21wYXQgPSAwOworI2lmZGVmIFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQKKwkJaWYgKHMtPmN0eC0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2sgIT0gMCB8fCBzLT50bHNleHRfb3BhcXVlX3ByZl9pbnB1dCAhPSBOVUxMKQorCQkJc3NsMl9jb21wYXQgPSAwOworI2VuZGlmCisJCX0KKyNlbmRpZgorCisJYnVmPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJaWYgKHMtPnN0YXRlID09IFNTTDIzX1NUX0NXX0NMTlRfSEVMTE9fQSkKKwkJeworI2lmIDAKKwkJLyogZG9uJ3QgcmV1c2Ugc2Vzc2lvbi1pZCdzICovCisJCWlmICghc3NsX2dldF9uZXdfc2Vzc2lvbihzLDApKQorCQkJeworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKyNlbmRpZgorCisJCXA9cy0+czMtPmNsaWVudF9yYW5kb207CisJCVRpbWU9KHVuc2lnbmVkIGxvbmcpdGltZShOVUxMKTsJCS8qIFRpbWUgKi8KKwkJbDJuKFRpbWUscCk7CisJCWlmIChSQU5EX3BzZXVkb19ieXRlcyhwLFNTTDNfUkFORE9NX1NJWkUtNCkgPD0gMCkKKwkJCXJldHVybiAtMTsKKworCQlpZiAodmVyc2lvbiA9PSBUTFMxX1ZFUlNJT04pCisJCQl7CisJCQl2ZXJzaW9uX21ham9yID0gVExTMV9WRVJTSU9OX01BSk9SOworCQkJdmVyc2lvbl9taW5vciA9IFRMUzFfVkVSU0lPTl9NSU5PUjsKKwkJCX0KKwkJZWxzZSBpZiAodmVyc2lvbiA9PSBTU0wzX1ZFUlNJT04pCisJCQl7CisJCQl2ZXJzaW9uX21ham9yID0gU1NMM19WRVJTSU9OX01BSk9SOworCQkJdmVyc2lvbl9taW5vciA9IFNTTDNfVkVSU0lPTl9NSU5PUjsKKwkJCX0KKwkJZWxzZSBpZiAodmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pCisJCQl7CisJCQl2ZXJzaW9uX21ham9yID0gU1NMMl9WRVJTSU9OX01BSk9SOworCQkJdmVyc2lvbl9taW5vciA9IFNTTDJfVkVSU0lPTl9NSU5PUjsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDIzX0NMSUVOVF9IRUxMTyxTU0xfUl9OT19QUk9UT0NPTFNfQVZBSUxBQkxFKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisKKwkJcy0+Y2xpZW50X3ZlcnNpb24gPSB2ZXJzaW9uOworCisJCWlmIChzc2wyX2NvbXBhdCkKKwkJCXsKKwkJCS8qIGNyZWF0ZSBTU0wgMi4wIGNvbXBhdGlibGUgQ2xpZW50IEhlbGxvICovCisKKwkJCS8qIHR3byBieXRlIHJlY29yZCBoZWFkZXIgd2lsbCBiZSB3cml0dGVuIGxhc3QgKi8KKwkJCWQgPSAmKGJ1ZlsyXSk7CisJCQlwID0gZCArIDk7IC8qIGxlYXZlIHNwYWNlIGZvciBtZXNzYWdlIHR5cGUsIHZlcnNpb24sIGluZGl2aWR1YWwgbGVuZ3RoIGZpZWxkcyAqLworCisJCQkqKGQrKykgPSBTU0wyX01UX0NMSUVOVF9IRUxMTzsKKwkJCSooZCsrKSA9IHZlcnNpb25fbWFqb3I7CisJCQkqKGQrKykgPSB2ZXJzaW9uX21pbm9yOworCQkJCisJCQkvKiBDaXBoZXJzIHN1cHBvcnRlZCAqLworCQkJaT1zc2xfY2lwaGVyX2xpc3RfdG9fYnl0ZXMocyxTU0xfZ2V0X2NpcGhlcnMocykscCwwKTsKKwkJCWlmIChpID09IDApCisJCQkJeworCQkJCS8qIG5vIGNpcGhlcnMgKi8KKwkJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfQ0xJRU5UX0hFTExPLFNTTF9SX05PX0NJUEhFUlNfQVZBSUxBQkxFKTsKKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJczJuKGksZCk7CisJCQlwKz1pOworCQkJCisJCQkvKiBwdXQgaW4gdGhlIHNlc3Npb24taWQgbGVuZ3RoICh6ZXJvIHNpbmNlIHRoZXJlIGlzIG5vIHJldXNlKSAqLworI2lmIDAKKwkJCXMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoPTA7CisjZW5kaWYKKwkJCXMybigwLGQpOworCisJCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9ORVRTQ0FQRV9DSEFMTEVOR0VfQlVHKQorCQkJCWNoX2xlbj1TU0wyX0NIQUxMRU5HRV9MRU5HVEg7CisJCQllbHNlCisJCQkJY2hfbGVuPVNTTDJfTUFYX0NIQUxMRU5HRV9MRU5HVEg7CisKKwkJCS8qIHdyaXRlIG91dCBzc2x2MiBjaGFsbGVuZ2UgKi8KKwkJCS8qIE5vdGUgdGhhdCBjaF9sZW4gbXVzdCBiZSA8PSBTU0wzX1JBTkRPTV9TSVpFICgzMiksCisJCQkgICBiZWNhdXNlIGl0IGlzIG9uZSBvZiBTU0wyX01BWF9DSEFMTEVOR0VfTEVOR1RIICgzMikKKwkJCSAgIG9yIFNTTDJfTUFYX0NIQUxMRU5HRV9MRU5HVEggKDE2KSwgYnV0IGxlYXZlIHRoZQorCQkJICAgY2hlY2sgaW4gZm9yIGZ1dHVycHJvb2ZpbmcgKi8KKwkJCWlmIChTU0wzX1JBTkRPTV9TSVpFIDwgY2hfbGVuKQorCQkJCWk9U1NMM19SQU5ET01fU0laRTsKKwkJCWVsc2UKKwkJCQlpPWNoX2xlbjsKKwkJCXMybihpLGQpOworCQkJbWVtc2V0KCYocy0+czMtPmNsaWVudF9yYW5kb21bMF0pLDAsU1NMM19SQU5ET01fU0laRSk7CisJCQlpZiAoUkFORF9wc2V1ZG9fYnl0ZXMoJihzLT5zMy0+Y2xpZW50X3JhbmRvbVtTU0wzX1JBTkRPTV9TSVpFLWldKSxpKSA8PSAwKQorCQkJCXJldHVybiAtMTsKKworCQkJbWVtY3B5KHAsJihzLT5zMy0+Y2xpZW50X3JhbmRvbVtTU0wzX1JBTkRPTV9TSVpFLWldKSxpKTsKKwkJCXArPWk7CisKKwkJCWk9IHAtICYoYnVmWzJdKTsKKwkJCWJ1ZlswXT0oKGk+PjgpJjB4ZmYpfDB4ODA7CisJCQlidWZbMV09KGkmMHhmZik7CisKKwkJCS8qIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSAqLworCQkJcy0+aW5pdF9udW09aSsyOworCQkJcy0+aW5pdF9vZmY9MDsKKworCQkJc3NsM19maW5pc2hfbWFjKHMsJihidWZbMl0pLGkpOworCQkJfQorCQllbHNlCisJCQl7CisJCQkvKiBjcmVhdGUgQ2xpZW50IEhlbGxvIGluIFNTTCAzLjAvVExTIDEuMCBmb3JtYXQgKi8KKworCQkJLyogZG8gdGhlIHJlY29yZCBoZWFkZXIgKDUgYnl0ZXMpIGFuZCBoYW5kc2hha2UgbWVzc2FnZSBoZWFkZXIgKDQgYnl0ZXMpIGxhc3QgKi8KKwkJCWQgPSBwID0gJihidWZbOV0pOworCQkJCisJCQkqKHArKykgPSB2ZXJzaW9uX21ham9yOworCQkJKihwKyspID0gdmVyc2lvbl9taW5vcjsKKworCQkJLyogUmFuZG9tIHN0dWZmICovCisJCQltZW1jcHkocCwgcy0+czMtPmNsaWVudF9yYW5kb20sIFNTTDNfUkFORE9NX1NJWkUpOworCQkJcCArPSBTU0wzX1JBTkRPTV9TSVpFOworCisJCQkvKiBTZXNzaW9uIElEICh6ZXJvIHNpbmNlIHRoZXJlIGlzIG5vIHJldXNlKSAqLworCQkJKihwKyspID0gMDsKKworCQkJLyogQ2lwaGVycyBzdXBwb3J0ZWQgKHVzaW5nIFNTTCAzLjAvVExTIDEuMCBmb3JtYXQpICovCisJCQlpPXNzbF9jaXBoZXJfbGlzdF90b19ieXRlcyhzLFNTTF9nZXRfY2lwaGVycyhzKSwmKHBbMl0pLHNzbDNfcHV0X2NpcGhlcl9ieV9jaGFyKTsKKwkJCWlmIChpID09IDApCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wyM19DTElFTlRfSEVMTE8sU1NMX1JfTk9fQ0lQSEVSU19BVkFJTEFCTEUpOworCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQlzMm4oaSxwKTsKKwkJCXArPWk7CisKKwkJCS8qIENPTVBSRVNTSU9OICovCisjaWZkZWYgT1BFTlNTTF9OT19DT01QCisJCQkqKHArKyk9MTsKKyNlbHNlCisJCQlpZiAoKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fQ09NUFJFU1NJT04pCisJCQkJCQl8fCAhcy0+Y3R4LT5jb21wX21ldGhvZHMpCisJCQkJaj0wOworCQkJZWxzZQorCQkJCWo9c2tfU1NMX0NPTVBfbnVtKHMtPmN0eC0+Y29tcF9tZXRob2RzKTsKKwkJCSoocCsrKT0xK2o7CisJCQlmb3IgKGk9MDsgaTxqOyBpKyspCisJCQkJeworCQkJCWNvbXA9c2tfU1NMX0NPTVBfdmFsdWUocy0+Y3R4LT5jb21wX21ldGhvZHMsaSk7CisJCQkJKihwKyspPWNvbXAtPmlkOworCQkJCX0KKyNlbmRpZgorCQkJKihwKyspPTA7IC8qIEFkZCB0aGUgTlVMTCBtZXRob2QgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQkJLyogVExTIGV4dGVuc2lvbnMqLworCQkJaWYgKHNzbF9wcmVwYXJlX2NsaWVudGhlbGxvX3Rsc2V4dChzKSA8PSAwKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfQ0xJRU5UX0hFTExPLFNTTF9SX0NMSUVOVEhFTExPX1RMU0VYVCk7CisJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCWlmICgocCA9IHNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0KHMsIHAsIGJ1ZitTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfQ0xJRU5UX0hFTExPLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorI2VuZGlmCisJCQkKKwkJCWwgPSBwLWQ7CisKKwkJCS8qIGZpbGwgaW4gNC1ieXRlIGhhbmRzaGFrZSBoZWFkZXIgKi8KKwkJCWQ9JihidWZbNV0pOworCQkJKihkKyspPVNTTDNfTVRfQ0xJRU5UX0hFTExPOworCQkJbDJuMyhsLGQpOworCisJCQlsICs9IDQ7CisKKwkJCWlmIChsID4gU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfQ0xJRU5UX0hFTExPLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCisJCQkvKiBmaWxsIGluIDUtYnl0ZSByZWNvcmQgaGVhZGVyICovCisJCQlkPWJ1ZjsKKwkJCSooZCsrKSA9IFNTTDNfUlRfSEFORFNIQUtFOworCQkJKihkKyspID0gdmVyc2lvbl9tYWpvcjsKKwkJCSooZCsrKSA9IHZlcnNpb25fbWlub3I7IC8qIGFyZ3VhYmx5IHdlIHNob3VsZCBzZW5kIHRoZSAqbG93ZXN0KiBzdXBvcnRlZCB2ZXJzaW9uIGhlcmUKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAqIChpbmRpY2F0aW5nLCBlLmcuLCBUTFMgMS4wIGluICJTU0wgMy4wIGZvcm1hdCIpICovCisJCQlzMm4oKGludClsLGQpOworCisJCQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCXMtPmluaXRfbnVtPXAtYnVmOworCQkJcy0+aW5pdF9vZmY9MDsKKworCQkJc3NsM19maW5pc2hfbWFjKHMsJihidWZbNV0pLCBzLT5pbml0X251bSAtIDUpOworCQkJfQorCisJCXMtPnN0YXRlPVNTTDIzX1NUX0NXX0NMTlRfSEVMTE9fQjsKKwkJcy0+aW5pdF9vZmY9MDsKKwkJfQorCisJLyogU1NMM19TVF9DV19DTE5UX0hFTExPX0IgKi8KKwlyZXQgPSBzc2wyM193cml0ZV9ieXRlcyhzKTsKKworCWlmICgocmV0ID49IDIpICYmIHMtPm1zZ19jYWxsYmFjaykKKwkJeworCQkvKiBDbGllbnQgSGVsbG8gaGFzIGJlZW4gc2VudDsgdGVsbCBtc2dfY2FsbGJhY2sgKi8KKworCQlpZiAoc3NsMl9jb21wYXQpCisJCQlzLT5tc2dfY2FsbGJhY2soMSwgU1NMMl9WRVJTSU9OLCAwLCBzLT5pbml0X2J1Zi0+ZGF0YSsyLCByZXQtMiwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7CisJCWVsc2UKKwkJCXMtPm1zZ19jYWxsYmFjaygxLCB2ZXJzaW9uLCBTU0wzX1JUX0hBTkRTSEFLRSwgcy0+aW5pdF9idWYtPmRhdGErNSwgcmV0LTUsIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOworCQl9CisKKwlyZXR1cm4gcmV0OworCX0KKworc3RhdGljIGludCBzc2wyM19nZXRfc2VydmVyX2hlbGxvKFNTTCAqcykKKwl7CisJY2hhciBidWZbOF07CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaTsKKwlpbnQgbjsKKworCW49c3NsMjNfcmVhZF9ieXRlcyhzLDcpOworCisJaWYgKG4gIT0gNykgcmV0dXJuKG4pOworCXA9cy0+cGFja2V0OworCisJbWVtY3B5KGJ1ZixwLG4pOworCisJaWYgKChwWzBdICYgMHg4MCkgJiYgKHBbMl0gPT0gU1NMMl9NVF9TRVJWRVJfSEVMTE8pICYmCisJCShwWzVdID09IDB4MDApICYmIChwWzZdID09IDB4MDIpKQorCQl7CisjaWZkZWYgT1BFTlNTTF9OT19TU0wyCisJCVNTTGVycihTU0xfRl9TU0wyM19HRVRfU0VSVkVSX0hFTExPLFNTTF9SX1VOU1VQUE9SVEVEX1BST1RPQ09MKTsKKwkJZ290byBlcnI7CisjZWxzZQorCQkvKiB3ZSBhcmUgdGFsa2luZyBzc2x2MiAqLworCQkvKiB3ZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBTU0x2MyBzZXR1cCBhbmQgcHV0IGluIHRoZQorCQkgKiBzc2x2MiBzdHVmZi4gKi8KKwkJaW50IGNoX2xlbjsKKworCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9OT19TU0x2MikKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wyM19HRVRfU0VSVkVSX0hFTExPLFNTTF9SX1VOU1VQUE9SVEVEX1BST1RPQ09MKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAocy0+czIgPT0gTlVMTCkKKwkJCXsKKwkJCWlmICghc3NsMl9uZXcocykpCisJCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXNzbDJfY2xlYXIocyk7CisKKwkJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfTkVUU0NBUEVfQ0hBTExFTkdFX0JVRykKKwkJCWNoX2xlbj1TU0wyX0NIQUxMRU5HRV9MRU5HVEg7CisJCWVsc2UKKwkJCWNoX2xlbj1TU0wyX01BWF9DSEFMTEVOR0VfTEVOR1RIOworCisJCS8qIHdyaXRlIG91dCBzc2x2MiBjaGFsbGVuZ2UgKi8KKwkJLyogTm90ZSB0aGF0IGNoX2xlbiBtdXN0IGJlIDw9IFNTTDNfUkFORE9NX1NJWkUgKDMyKSwgYmVjYXVzZQorCQkgICBpdCBpcyBvbmUgb2YgU1NMMl9NQVhfQ0hBTExFTkdFX0xFTkdUSCAoMzIpIG9yCisJCSAgIFNTTDJfTUFYX0NIQUxMRU5HRV9MRU5HVEggKDE2KSwgYnV0IGxlYXZlIHRoZSBjaGVjayBpbiBmb3IKKwkJICAgZnV0dXJwcm9vZmluZyAqLworCQlpPShTU0wzX1JBTkRPTV9TSVpFIDwgY2hfbGVuKQorCQkJP1NTTDNfUkFORE9NX1NJWkU6Y2hfbGVuOworCQlzLT5zMi0+Y2hhbGxlbmdlX2xlbmd0aD1pOworCQltZW1jcHkocy0+czItPmNoYWxsZW5nZSwKKwkJCSYocy0+czMtPmNsaWVudF9yYW5kb21bU1NMM19SQU5ET01fU0laRS1pXSksaSk7CisKKwkJaWYgKHMtPnMzICE9IE5VTEwpIHNzbDNfZnJlZShzKTsKKworCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihzLT5pbml0X2J1ZiwKKwkJCVNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfM19CWVRFX0hFQURFUikpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfR0VUX1NFUlZFUl9IRUxMTyxFUlJfUl9CVUZfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCXMtPnN0YXRlPVNTTDJfU1RfR0VUX1NFUlZFUl9IRUxMT19BOworCQlpZiAoIShzLT5jbGllbnRfdmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pKQorCQkJLyogdXNlIHNwZWNpYWwgcGFkZGluZyAoU1NMIDMuMCBkcmFmdC9SRkMgMjI0NiwgQXBwLiBFLjIpICovCisJCQlzLT5zMi0+c3NsMl9yb2xsYmFjaz0xOworCisJCS8qIHNldHVwIHRoZSA3IGJ5dGVzIHdlIGhhdmUgcmVhZCBzbyB3ZSBnZXQgdGhlbSBmcm9tCisJCSAqIHRoZSBzc2x2MiBidWZmZXIgKi8KKwkJcy0+cnN0YXRlPVNTTF9TVF9SRUFEX0hFQURFUjsKKwkJcy0+cGFja2V0X2xlbmd0aD1uOworCQlzLT5wYWNrZXQ9ICYocy0+czItPnJidWZbMF0pOworCQltZW1jcHkocy0+cGFja2V0LGJ1ZixuKTsKKwkJcy0+czItPnJidWZfbGVmdD1uOworCQlzLT5zMi0+cmJ1Zl9vZmZzPTA7CisKKwkJLyogd2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb25lICovCisJCXMtPnMyLT53cml0ZV9zZXF1ZW5jZT0xOworCisJCXMtPm1ldGhvZD1TU0x2Ml9jbGllbnRfbWV0aG9kKCk7CisJCXMtPmhhbmRzaGFrZV9mdW5jPXMtPm1ldGhvZC0+c3NsX2Nvbm5lY3Q7CisjZW5kaWYKKwkJfQorCWVsc2UgaWYgKHBbMV0gPT0gU1NMM19WRVJTSU9OX01BSk9SICYmCisJICAgICAgICAgKHBbMl0gPT0gU1NMM19WRVJTSU9OX01JTk9SIHx8IHBbMl0gPT0gVExTMV9WRVJTSU9OX01JTk9SKSAmJgorCSAgICAgICAgICgocFswXSA9PSBTU0wzX1JUX0hBTkRTSEFLRSAmJiBwWzVdID09IFNTTDNfTVRfU0VSVkVSX0hFTExPKSB8fAorCSAgICAgICAgICAocFswXSA9PSBTU0wzX1JUX0FMRVJUICYmIHBbM10gPT0gMCAmJiBwWzRdID09IDIpKSkKKwkJeworCQkvKiB3ZSBoYXZlIHNzbHYzIG9yIHRsczEgKHNlcnZlciBoZWxsbyBvciBhbGVydCkgKi8KKworCQlpZiAoKHBbMl0gPT0gU1NMM19WRVJTSU9OX01JTk9SKSAmJgorCQkJIShzLT5vcHRpb25zICYgU1NMX09QX05PX1NTTHYzKSkKKwkJCXsKKwkJCXMtPnZlcnNpb249U1NMM19WRVJTSU9OOworCQkJcy0+bWV0aG9kPVNTTHYzX2NsaWVudF9tZXRob2QoKTsKKwkJCX0KKwkJZWxzZSBpZiAoKHBbMl0gPT0gVExTMV9WRVJTSU9OX01JTk9SKSAmJgorCQkJIShzLT5vcHRpb25zICYgU1NMX09QX05PX1RMU3YxKSkKKwkJCXsKKwkJCXMtPnZlcnNpb249VExTMV9WRVJTSU9OOworCQkJcy0+bWV0aG9kPVRMU3YxX2NsaWVudF9tZXRob2QoKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDIzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfVU5TVVBQT1JURURfUFJPVE9DT0wpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKHBbMF0gPT0gU1NMM19SVF9BTEVSVCAmJiBwWzVdICE9IFNTTDNfQUxfV0FSTklORykKKwkJCXsKKwkJCS8qIGZhdGFsIGFsZXJ0ICovCisKKwkJCXZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsaW50IHR5cGUsaW50IHZhbCk9TlVMTDsKKwkJCWludCBqOworCisJCQlpZiAocy0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQkJCWNiPXMtPmluZm9fY2FsbGJhY2s7CisJCQllbHNlIGlmIChzLT5jdHgtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJCQljYj1zLT5jdHgtPmluZm9fY2FsbGJhY2s7CisgCisJCQlpPXBbNV07CisJCQlpZiAoY2IgIT0gTlVMTCkKKwkJCQl7CisJCQkJaj0oaTw8OCl8cFs2XTsKKwkJCQljYihzLFNTTF9DQl9SRUFEX0FMRVJULGopOworCQkJCX0KKwkJCQorCQkJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJCQlzLT5tc2dfY2FsbGJhY2soMCwgcy0+dmVyc2lvbiwgU1NMM19SVF9BTEVSVCwgcCs1LCAyLCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsKKworCQkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJCVNTTGVycihTU0xfRl9TU0wyM19HRVRfU0VSVkVSX0hFTExPLFNTTF9BRF9SRUFTT05fT0ZGU0VUK3BbNl0pOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJaWYgKCFzc2xfaW5pdF93YmlvX2J1ZmZlcihzLDEpKSBnb3RvIGVycjsKKworCQkvKiB3ZSBhcmUgaW4gdGhpcyBzdGF0ZSAqLworCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX1NSVlJfSEVMTE9fQTsKKworCQkvKiBwdXQgdGhlIDcgYnl0ZXMgd2UgaGF2ZSByZWFkIGludG8gdGhlIGlucHV0IGJ1ZmZlcgorCQkgKiBmb3IgU1NMdjMgKi8KKwkJcy0+cnN0YXRlPVNTTF9TVF9SRUFEX0hFQURFUjsKKwkJcy0+cGFja2V0X2xlbmd0aD1uOworCQlpZiAocy0+czMtPnJidWYuYnVmID09IE5VTEwpCisJCQlpZiAoIXNzbDNfc2V0dXBfcmVhZF9idWZmZXIocykpCisJCQkJZ290byBlcnI7CisJCXMtPnBhY2tldD0gJihzLT5zMy0+cmJ1Zi5idWZbMF0pOworCQltZW1jcHkocy0+cGFja2V0LGJ1ZixuKTsKKwkJcy0+czMtPnJidWYubGVmdD1uOworCQlzLT5zMy0+cmJ1Zi5vZmZzZXQ9MDsKKworCQlzLT5oYW5kc2hha2VfZnVuYz1zLT5tZXRob2QtPnNzbF9jb25uZWN0OworCQl9CisJZWxzZQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wyM19HRVRfU0VSVkVSX0hFTExPLFNTTF9SX1VOS05PV05fUFJPVE9DT0wpOworCQlnb3RvIGVycjsKKwkJfQorCXMtPmluaXRfbnVtPTA7CisKKwkvKiBTaW5jZSwgaWYgd2UgYXJlIHNlbmRpbmcgYSBzc2wyMyBjbGllbnQgaGVsbG8sIHdlIGFyZSBub3QKKwkgKiByZXVzaW5nIGEgc2Vzc2lvbi1pZCAqLworICAgICAgICBpZiAoIXMtPnNlc3Npb25fY3JlYXRpb25fZW5hYmxlZCkKKwkJeworCQlpZiAoIShzLT5jbGllbnRfdmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pKQorCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCQlTU0xlcnIoU1NMX0ZfU1NMMjNfR0VUX1NFUlZFUl9IRUxMTyxTU0xfUl9TRVNTSU9OX01BWV9OT1RfQkVfQ1JFQVRFRCk7CisJCWdvdG8gZXJyOworCQl9CisJaWYgKCFzc2xfZ2V0X25ld19zZXNzaW9uKHMsMCkpCisJCWdvdG8gZXJyOworCisJcmV0dXJuKFNTTF9jb25uZWN0KHMpKTsKK2VycjoKKwlyZXR1cm4oLTEpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zMjNfbGliLmMgYi9saWIvb3BlbnNzbC9zc2wvczIzX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZmNlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvczIzX2xpYi5jCkBAIC0wLDAgKzEsMTk0IEBACisvKiBzc2wvczIzX2xpYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisKK2xvbmcgc3NsMjNfZGVmYXVsdF90aW1lb3V0KHZvaWQpCisJeworCXJldHVybigzMDApOworCX0KKworaW50IHNzbDIzX251bV9jaXBoZXJzKHZvaWQpCisJeworCXJldHVybihzc2wzX251bV9jaXBoZXJzKCkKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisJICAgICAgICsgc3NsMl9udW1fY2lwaGVycygpCisjZW5kaWYKKwkgICAgKTsKKwl9CisKK2NvbnN0IFNTTF9DSVBIRVIgKnNzbDIzX2dldF9jaXBoZXIodW5zaWduZWQgaW50IHUpCisJeworCXVuc2lnbmVkIGludCB1dT1zc2wzX251bV9jaXBoZXJzKCk7CisKKwlpZiAodSA8IHV1KQorCQlyZXR1cm4oc3NsM19nZXRfY2lwaGVyKHUpKTsKKwllbHNlCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorCQlyZXR1cm4oc3NsMl9nZXRfY2lwaGVyKHUtdXUpKTsKKyNlbHNlCisJCXJldHVybihOVUxMKTsKKyNlbmRpZgorCX0KKworLyogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjaGVjayBpZiB0aGUgY2lwaGVycyByZXF1aXJlZCBhcmUgYWN0dWFsbHkKKyAqIGF2YWlsYWJsZSAqLworY29uc3QgU1NMX0NJUEhFUiAqc3NsMjNfZ2V0X2NpcGhlcl9ieV9jaGFyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnApCisJeworCVNTTF9DSVBIRVIgYzsKKwljb25zdCBTU0xfQ0lQSEVSICpjcDsKKwl1bnNpZ25lZCBsb25nIGlkOworCWludCBuOworCisJbj1zc2wzX251bV9jaXBoZXJzKCk7CisJaWQ9MHgwMzAwMDAwMHwoKHVuc2lnbmVkIGxvbmcpcFswXTw8MTZMKXwKKwkJKCh1bnNpZ25lZCBsb25nKXBbMV08PDhMKXwodW5zaWduZWQgbG9uZylwWzJdOworCWMuaWQ9aWQ7CisJY3A9c3NsM19nZXRfY2lwaGVyX2J5X2NoYXIocCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorCWlmIChjcCA9PSBOVUxMKQorCQljcD1zc2wyX2dldF9jaXBoZXJfYnlfY2hhcihwKTsKKyNlbmRpZgorCXJldHVybihjcCk7CisJfQorCitpbnQgc3NsMjNfcHV0X2NpcGhlcl9ieV9jaGFyKGNvbnN0IFNTTF9DSVBIRVIgKmMsIHVuc2lnbmVkIGNoYXIgKnApCisJeworCWxvbmcgbDsKKworCS8qIFdlIGNhbiB3cml0ZSBTU0x2MiBhbmQgU1NMdjMgY2lwaGVycyAqLworCWlmIChwICE9IE5VTEwpCisJCXsKKwkJbD1jLT5pZDsKKwkJcFswXT0oKHVuc2lnbmVkIGNoYXIpKGw+PjE2TCkpJjB4RkY7CisJCXBbMV09KCh1bnNpZ25lZCBjaGFyKShsPj4gOEwpKSYweEZGOworCQlwWzJdPSgodW5zaWduZWQgY2hhcikobCAgICAgKSkmMHhGRjsKKwkJfQorCXJldHVybigzKTsKKwl9CisKK2ludCBzc2wyM19yZWFkKFNTTCAqcywgdm9pZCAqYnVmLCBpbnQgbGVuKQorCXsKKwlpbnQgbjsKKworCWNsZWFyX3N5c19lcnJvcigpOworCWlmIChTU0xfaW5faW5pdChzKSAmJiAoIXMtPmluX2hhbmRzaGFrZSkpCisJCXsKKwkJbj1zLT5oYW5kc2hha2VfZnVuYyhzKTsKKwkJaWYgKG4gPCAwKSByZXR1cm4obik7CisJCWlmIChuID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfUkVBRCxTU0xfUl9TU0xfSEFORFNIQUtFX0ZBSUxVUkUpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJcmV0dXJuKFNTTF9yZWFkKHMsYnVmLGxlbikpOworCQl9CisJZWxzZQorCQl7CisJCXNzbF91bmRlZmluZWRfZnVuY3Rpb24ocyk7CisJCXJldHVybigtMSk7CisJCX0KKwl9CisKK2ludCBzc2wyM19wZWVrKFNTTCAqcywgdm9pZCAqYnVmLCBpbnQgbGVuKQorCXsKKwlpbnQgbjsKKworCWNsZWFyX3N5c19lcnJvcigpOworCWlmIChTU0xfaW5faW5pdChzKSAmJiAoIXMtPmluX2hhbmRzaGFrZSkpCisJCXsKKwkJbj1zLT5oYW5kc2hha2VfZnVuYyhzKTsKKwkJaWYgKG4gPCAwKSByZXR1cm4obik7CisJCWlmIChuID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfUEVFSyxTU0xfUl9TU0xfSEFORFNIQUtFX0ZBSUxVUkUpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJcmV0dXJuKFNTTF9wZWVrKHMsYnVmLGxlbikpOworCQl9CisJZWxzZQorCQl7CisJCXNzbF91bmRlZmluZWRfZnVuY3Rpb24ocyk7CisJCXJldHVybigtMSk7CisJCX0KKwl9CisKK2ludCBzc2wyM193cml0ZShTU0wgKnMsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKKwl7CisJaW50IG47CisKKwljbGVhcl9zeXNfZXJyb3IoKTsKKwlpZiAoU1NMX2luX2luaXQocykgJiYgKCFzLT5pbl9oYW5kc2hha2UpKQorCQl7CisJCW49cy0+aGFuZHNoYWtlX2Z1bmMocyk7CisJCWlmIChuIDwgMCkgcmV0dXJuKG4pOworCQlpZiAobiA9PSAwKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDIzX1dSSVRFLFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCQlyZXR1cm4oU1NMX3dyaXRlKHMsYnVmLGxlbikpOworCQl9CisJZWxzZQorCQl7CisJCXNzbF91bmRlZmluZWRfZnVuY3Rpb24ocyk7CisJCXJldHVybigtMSk7CisJCX0KKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvczIzX21ldGguYyBiL2xpYi9vcGVuc3NsL3NzbC9zMjNfbWV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDk5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvczIzX21ldGguYwpAQCAtMCwwICsxLDg4IEBACisvKiBzc2wvczIzX21ldGguYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorCitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqc3NsMjNfZ2V0X21ldGhvZChpbnQgdmVyKTsKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICpzc2wyM19nZXRfbWV0aG9kKGludCB2ZXIpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDIKKwlpZiAodmVyID09IFNTTDJfVkVSU0lPTikKKwkJcmV0dXJuKFNTTHYyX21ldGhvZCgpKTsKKwllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisJaWYgKHZlciA9PSBTU0wzX1ZFUlNJT04pCisJCXJldHVybihTU0x2M19tZXRob2QoKSk7CisJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTMQorCWlmICh2ZXIgPT0gVExTMV9WRVJTSU9OKQorCQlyZXR1cm4oVExTdjFfbWV0aG9kKCkpOworCWVsc2UKKyNlbmRpZgorCQlyZXR1cm4oTlVMTCk7CisJfQorCitJTVBMRU1FTlRfc3NsMjNfbWV0aF9mdW5jKFNTTHYyM19tZXRob2QsCisJCQlzc2wyM19hY2NlcHQsCisJCQlzc2wyM19jb25uZWN0LAorCQkJc3NsMjNfZ2V0X21ldGhvZCkKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3MyM19wa3QuYyBiL2xpYi9vcGVuc3NsL3NzbC9zMjNfcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhNmExYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zMjNfcGt0LmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qIHNzbC9zMjNfcGt0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgVVNFX1NPQ0tFVFMKKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKworaW50IHNzbDIzX3dyaXRlX2J5dGVzKFNTTCAqcykKKwl7CisJaW50IGksbnVtLHRvdDsKKwljaGFyICpidWY7CisKKwlidWY9cy0+aW5pdF9idWYtPmRhdGE7CisJdG90PXMtPmluaXRfb2ZmOworCW51bT1zLT5pbml0X251bTsKKwlmb3IgKDs7KQorCQl7CisJCXMtPnJ3c3RhdGU9U1NMX1dSSVRJTkc7CisJCWk9QklPX3dyaXRlKHMtPndiaW8sJihidWZbdG90XSksbnVtKTsKKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCXMtPmluaXRfb2ZmPXRvdDsKKwkJCXMtPmluaXRfbnVtPW51bTsKKwkJCXJldHVybihpKTsKKwkJCX0KKwkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJaWYgKGkgPT0gbnVtKSByZXR1cm4odG90K2kpOworCisJCW51bS09aTsKKwkJdG90Kz1pOworCQl9CisJfQorCisvKiByZXR1cm4gcmVndWxhcmx5IG9ubHkgd2hlbiB3ZSBoYXZlIHJlYWQgKGF0IGxlYXN0KSAnbicgYnl0ZXMgKi8KK2ludCBzc2wyM19yZWFkX2J5dGVzKFNTTCAqcywgaW50IG4pCisJeworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGo7CisKKwlpZiAocy0+cGFja2V0X2xlbmd0aCA8ICh1bnNpZ25lZCBpbnQpbikKKwkJeworCQlwPXMtPnBhY2tldDsKKworCQlmb3IgKDs7KQorCQkJeworCQkJcy0+cndzdGF0ZT1TU0xfUkVBRElORzsKKwkJCWo9QklPX3JlYWQocy0+cmJpbywoY2hhciAqKSYocFtzLT5wYWNrZXRfbGVuZ3RoXSksCisJCQkJbi1zLT5wYWNrZXRfbGVuZ3RoKTsKKwkJCWlmIChqIDw9IDApCisJCQkJcmV0dXJuKGopOworCQkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJCXMtPnBhY2tldF9sZW5ndGgrPWo7CisJCQlpZiAocy0+cGFja2V0X2xlbmd0aCA+PSAodW5zaWduZWQgaW50KW4pCisJCQkJcmV0dXJuKHMtPnBhY2tldF9sZW5ndGgpOworCQkJfQorCQl9CisJcmV0dXJuKG4pOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3MyM19zcnZyLmMgYi9saWIvb3BlbnNzbC9zc2wvczIzX3NydnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI4NzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3MyM19zcnZyLmMKQEAgLTAsMCArMSw1OTkgQEAKKy8qIHNzbC9zMjNfc3J2ci5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDYgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICpzc2wyM19nZXRfc2VydmVyX21ldGhvZChpbnQgdmVyKTsKK2ludCBzc2wyM19nZXRfY2xpZW50X2hlbGxvKFNTTCAqcyk7CitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqc3NsMjNfZ2V0X3NlcnZlcl9tZXRob2QoaW50IHZlcikKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorCWlmICh2ZXIgPT0gU1NMMl9WRVJTSU9OKQorCQlyZXR1cm4oU1NMdjJfc2VydmVyX21ldGhvZCgpKTsKKyNlbmRpZgorCWlmICh2ZXIgPT0gU1NMM19WRVJTSU9OKQorCQlyZXR1cm4oU1NMdjNfc2VydmVyX21ldGhvZCgpKTsKKwllbHNlIGlmICh2ZXIgPT0gVExTMV9WRVJTSU9OKQorCQlyZXR1cm4oVExTdjFfc2VydmVyX21ldGhvZCgpKTsKKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKK0lNUExFTUVOVF9zc2wyM19tZXRoX2Z1bmMoU1NMdjIzX3NlcnZlcl9tZXRob2QsCisJCQlzc2wyM19hY2NlcHQsCisJCQlzc2xfdW5kZWZpbmVkX2Z1bmN0aW9uLAorCQkJc3NsMjNfZ2V0X3NlcnZlcl9tZXRob2QpCisKK2ludCBzc2wyM19hY2NlcHQoU1NMICpzKQorCXsKKwlCVUZfTUVNICpidWY7CisJdW5zaWduZWQgbG9uZyBUaW1lPSh1bnNpZ25lZCBsb25nKXRpbWUoTlVMTCk7CisJdm9pZCAoKmNiKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKT1OVUxMOworCWludCByZXQ9IC0xOworCWludCBuZXdfc3RhdGUsc3RhdGU7CisKKwlSQU5EX2FkZCgmVGltZSxzaXplb2YoVGltZSksMCk7CisJRVJSX2NsZWFyX2Vycm9yKCk7CisJY2xlYXJfc3lzX2Vycm9yKCk7CisKKwlpZiAocy0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQljYj1zLT5pbmZvX2NhbGxiYWNrOworCWVsc2UgaWYgKHMtPmN0eC0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQljYj1zLT5jdHgtPmluZm9fY2FsbGJhY2s7CisJCisJcy0+aW5faGFuZHNoYWtlKys7CisJaWYgKCFTU0xfaW5faW5pdChzKSB8fCBTU0xfaW5fYmVmb3JlKHMpKSBTU0xfY2xlYXIocyk7IAorCisJZm9yICg7OykKKwkJeworCQlzdGF0ZT1zLT5zdGF0ZTsKKworCQlzd2l0Y2gocy0+c3RhdGUpCisJCQl7CisJCWNhc2UgU1NMX1NUX0JFRk9SRToKKwkJY2FzZSBTU0xfU1RfQUNDRVBUOgorCQljYXNlIFNTTF9TVF9CRUZPUkV8U1NMX1NUX0FDQ0VQVDoKKwkJY2FzZSBTU0xfU1RfT0t8U1NMX1NUX0FDQ0VQVDoKKworCQkJcy0+c2VydmVyPTE7CisJCQlpZiAoY2IgIT0gTlVMTCkgY2IocyxTU0xfQ0JfSEFORFNIQUtFX1NUQVJULDEpOworCisJCQkvKiBzLT52ZXJzaW9uPVNTTDNfVkVSU0lPTjsgKi8KKwkJCXMtPnR5cGU9U1NMX1NUX0FDQ0VQVDsKKworCQkJaWYgKHMtPmluaXRfYnVmID09IE5VTEwpCisJCQkJeworCQkJCWlmICgoYnVmPUJVRl9NRU1fbmV3KCkpID09IE5VTEwpCisJCQkJCXsKKwkJCQkJcmV0PSAtMTsKKwkJCQkJZ290byBlbmQ7CisJCQkJCX0KKwkJCQlpZiAoIUJVRl9NRU1fZ3JvdyhidWYsU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIKSkKKwkJCQkJeworCQkJCQlyZXQ9IC0xOworCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCXMtPmluaXRfYnVmPWJ1ZjsKKwkJCQl9CisKKwkJCXNzbDNfaW5pdF9maW5pc2hlZF9tYWMocyk7CisKKwkJCXMtPnN0YXRlPVNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQTsKKwkJCXMtPmN0eC0+c3RhdHMuc2Vzc19hY2NlcHQrKzsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQToKKwkJY2FzZSBTU0wyM19TVF9TUl9DTE5UX0hFTExPX0I6CisKKwkJCXMtPnNodXRkb3duPTA7CisJCQlyZXQ9c3NsMjNfZ2V0X2NsaWVudF9oZWxsbyhzKTsKKwkJCWlmIChyZXQgPj0gMCkgY2I9TlVMTDsKKwkJCWdvdG8gZW5kOworCQkJLyogYnJlYWs7ICovCisKKwkJZGVmYXVsdDoKKwkJCVNTTGVycihTU0xfRl9TU0wyM19BQ0NFUFQsU1NMX1JfVU5LTk9XTl9TVEFURSk7CisJCQlyZXQ9IC0xOworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKwkJCX0KKworCQlpZiAoKGNiICE9IE5VTEwpICYmIChzLT5zdGF0ZSAhPSBzdGF0ZSkpCisJCQl7CisJCQluZXdfc3RhdGU9cy0+c3RhdGU7CisJCQlzLT5zdGF0ZT1zdGF0ZTsKKwkJCWNiKHMsU1NMX0NCX0FDQ0VQVF9MT09QLDEpOworCQkJcy0+c3RhdGU9bmV3X3N0YXRlOworCQkJfQorCQl9CitlbmQ6CisJcy0+aW5faGFuZHNoYWtlLS07CisJaWYgKGNiICE9IE5VTEwpCisJCWNiKHMsU1NMX0NCX0FDQ0VQVF9FWElULHJldCk7CisJcmV0dXJuKHJldCk7CisJfQorCisKK2ludCBzc2wyM19nZXRfY2xpZW50X2hlbGxvKFNTTCAqcykKKwl7CisJY2hhciBidWZfc3BhY2VbMTFdOyAvKiBSZXF1ZXN0IHRoaXMgbWFueSBieXRlcyBpbiBpbml0aWFsIHJlYWQuCisJICAgICAgICAgICAgICAgICAgICAgKiBXZSBjYW4gZGV0ZWN0IFNTTCAzLjAvVExTIDEuMCBDbGllbnQgSGVsbG9zCisJICAgICAgICAgICAgICAgICAgICAgKiAoJ3R5cGUgPT0gMycpIGNvcnJlY3RseSBvbmx5IHdoZW4gdGhlIGZvbGxvd2luZworCSAgICAgICAgICAgICAgICAgICAgICogaXMgaW4gYSBzaW5nbGUgcmVjb3JkLCB3aGljaCBpcyBub3QgZ3VhcmFudGVlZCBieQorCSAgICAgICAgICAgICAgICAgICAgICogdGhlIHByb3RvY29sIHNwZWNpZmljYXRpb246CisJICAgICAgICAgICAgICAgICAgICAgKiBCeXRlICBDb250ZW50CisJICAgICAgICAgICAgICAgICAgICAgKiAgMCAgICAgdHlwZSAgICAgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAqICAxLzIgICB2ZXJzaW9uICAgICAgICAgID4gcmVjb3JkIGhlYWRlcgorCSAgICAgICAgICAgICAgICAgICAgICogIDMvNCAgIGxlbmd0aCAgICAgICAgICAvCisJICAgICAgICAgICAgICAgICAgICAgKiAgNSAgICAgbXNnX3R5cGUgICAgICAgIFwKKwkgICAgICAgICAgICAgICAgICAgICAqICA2LTggICBsZW5ndGggICAgICAgICAgID4gQ2xpZW50IEhlbGxvIG1lc3NhZ2UKKwkgICAgICAgICAgICAgICAgICAgICAqICA5LzEwICBjbGllbnRfdmVyc2lvbiAgLworCSAgICAgICAgICAgICAgICAgICAgICovCisJY2hhciAqYnVmPSAmKGJ1Zl9zcGFjZVswXSk7CisJdW5zaWduZWQgY2hhciAqcCwqZCwqZF9sZW4sKmRkOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBjc2wsc2lsLGNsOworCWludCBuPTAsajsKKwlpbnQgdHlwZT0wOworCWludCB2WzJdOworCisJaWYgKHMtPnN0YXRlID09CVNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQSkKKwkJeworCQkvKiByZWFkIHRoZSBpbml0aWFsIGhlYWRlciAqLworCQl2WzBdPXZbMV09MDsKKworCQlpZiAoIXNzbDNfc2V0dXBfYnVmZmVycyhzKSkgZ290byBlcnI7CisKKwkJbj1zc2wyM19yZWFkX2J5dGVzKHMsIHNpemVvZiBidWZfc3BhY2UpOworCQlpZiAobiAhPSBzaXplb2YgYnVmX3NwYWNlKSByZXR1cm4obik7IC8qIG4gPT0gLTEgfHwgbiA9PSAwICovCisKKwkJcD1zLT5wYWNrZXQ7CisKKwkJbWVtY3B5KGJ1ZixwLG4pOworCisJCWlmICgocFswXSAmIDB4ODApICYmIChwWzJdID09IFNTTDJfTVRfQ0xJRU5UX0hFTExPKSkKKwkJCXsKKwkJCS8qCisJCQkgKiBTU0x2MiBoZWFkZXIKKwkJCSAqLworCQkJaWYgKChwWzNdID09IDB4MDApICYmIChwWzRdID09IDB4MDIpKQorCQkJCXsKKwkJCQl2WzBdPXBbM107IHZbMV09cFs0XTsKKwkJCQkvKiBTU0x2MiAqLworCQkJCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fU1NMdjIpKQorCQkJCQl0eXBlPTE7CisJCQkJfQorCQkJZWxzZSBpZiAocFszXSA9PSBTU0wzX1ZFUlNJT05fTUFKT1IpCisJCQkJeworCQkJCXZbMF09cFszXTsgdlsxXT1wWzRdOworCQkJCS8qIFNTTHYzL1RMU3YxICovCisJCQkJaWYgKHBbNF0gPj0gVExTMV9WRVJTSU9OX01JTk9SKQorCQkJCQl7CisJCQkJCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fVExTdjEpKQorCQkJCQkJeworCQkJCQkJcy0+dmVyc2lvbj1UTFMxX1ZFUlNJT047CisJCQkJCQkvKiB0eXBlPTI7ICovIC8qIGRvbmUgbGF0ZXIgdG8gc3Vydml2ZSByZXN0YXJ0cyAqLworCQkJCQkJcy0+c3RhdGU9U1NMMjNfU1RfU1JfQ0xOVF9IRUxMT19COworCQkJCQkJfQorCQkJCQllbHNlIGlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fU1NMdjMpKQorCQkJCQkJeworCQkJCQkJcy0+dmVyc2lvbj1TU0wzX1ZFUlNJT047CisJCQkJCQkvKiB0eXBlPTI7ICovCisJCQkJCQlzLT5zdGF0ZT1TU0wyM19TVF9TUl9DTE5UX0hFTExPX0I7CisJCQkJCQl9CisJCQkJCWVsc2UgaWYgKCEocy0+b3B0aW9ucyAmIFNTTF9PUF9OT19TU0x2MikpCisJCQkJCQl7CisJCQkJCQl0eXBlPTE7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlIGlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fU1NMdjMpKQorCQkJCQl7CisJCQkJCXMtPnZlcnNpb249U1NMM19WRVJTSU9OOworCQkJCQkvKiB0eXBlPTI7ICovCisJCQkJCXMtPnN0YXRlPVNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQjsKKwkJCQkJfQorCQkJCWVsc2UgaWYgKCEocy0+b3B0aW9ucyAmIFNTTF9PUF9OT19TU0x2MikpCisJCQkJCXR5cGU9MTsKKworCQkJCX0KKwkJCX0KKwkJZWxzZSBpZiAoKHBbMF0gPT0gU1NMM19SVF9IQU5EU0hBS0UpICYmCisJCQkgKHBbMV0gPT0gU1NMM19WRVJTSU9OX01BSk9SKSAmJgorCQkJIChwWzVdID09IFNTTDNfTVRfQ0xJRU5UX0hFTExPKSAmJgorCQkJICgocFszXSA9PSAwICYmIHBbNF0gPCA1IC8qIHNpbGx5IHJlY29yZCBsZW5ndGg/ICovKQorCQkJCXx8IChwWzldID49IHBbMV0pKSkKKwkJCXsKKwkJCS8qCisJCQkgKiBTU0x2MyBvciB0bHMxIGhlYWRlcgorCQkJICovCisJCQkKKwkJCXZbMF09cFsxXTsgLyogbWFqb3IgdmVyc2lvbiAoPSBTU0wzX1ZFUlNJT05fTUFKT1IpICovCisJCQkvKiBXZSBtdXN0IGxvb2sgYXQgY2xpZW50X3ZlcnNpb24gaW5zaWRlIHRoZSBDbGllbnQgSGVsbG8gbWVzc2FnZQorCQkJICogdG8gZ2V0IHRoZSBjb3JyZWN0IG1pbm9yIHZlcnNpb24uCisJCQkgKiBIb3dldmVyIGlmIHdlIGhhdmUgb25seSBhIHBhdGhvbG9naWNhbGx5IHNtYWxsIGZyYWdtZW50IG9mIHRoZQorCQkJICogQ2xpZW50IEhlbGxvIG1lc3NhZ2UsIHRoaXMgd291bGQgYmUgZGlmZmljdWx0LCBhbmQgd2UnZCBoYXZlCisJCQkgKiB0byByZWFkIG1vcmUgcmVjb3JkcyB0byBmaW5kIG91dC4KKwkJCSAqIE5vIGtub3duIFNTTCAzLjAgY2xpZW50IGZyYWdtZW50cyBDbGllbnRIZWxsbyBsaWtlIHRoaXMsCisJCQkgKiBzbyB3ZSBzaW1wbHkgYXNzdW1lIFRMUyAxLjAgdG8gYXZvaWQgcHJvdG9jb2wgdmVyc2lvbiBkb3duZ3JhZGUKKwkJCSAqIGF0dGFja3MuICovCisJCQlpZiAocFszXSA9PSAwICYmIHBbNF0gPCA2KQorCQkJCXsKKyNpZiAwCisJCQkJU1NMZXJyKFNTTF9GX1NTTDIzX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfUkVDT1JEX1RPT19TTUFMTCk7CisJCQkJZ290byBlcnI7CisjZWxzZQorCQkJCXZbMV0gPSBUTFMxX1ZFUlNJT05fTUlOT1I7CisjZW5kaWYKKwkJCQl9CisJCQkvKiBpZiBtYWpvciB2ZXJzaW9uIG51bWJlciA+IDMgc2V0IG1pbm9yIHRvIGEgdmFsdWUKKwkJCSAqIHdoaWNoIHdpbGwgdXNlIHRoZSBoaWdoZXN0IHZlcnNpb24gMyB3ZSBzdXBwb3J0LgorCQkJICogSWYgVExTIDIuMCBldmVyIGFwcGVhcnMgd2Ugd2lsbCBuZWVkIHRvIHJldmlzZQorCQkJICogdGhpcy4uLi4KKwkJCSAqLworCQkJZWxzZSBpZiAocFs5XSA+IFNTTDNfVkVSU0lPTl9NQUpPUikKKwkJCQl2WzFdPTB4ZmY7CisJCQllbHNlCisJCQkJdlsxXT1wWzEwXTsgLyogbWlub3IgdmVyc2lvbiBhY2NvcmRpbmcgdG8gY2xpZW50X3ZlcnNpb24gKi8KKwkJCWlmICh2WzFdID49IFRMUzFfVkVSU0lPTl9NSU5PUikKKwkJCQl7CisJCQkJaWYgKCEocy0+b3B0aW9ucyAmIFNTTF9PUF9OT19UTFN2MSkpCisJCQkJCXsKKwkJCQkJcy0+dmVyc2lvbj1UTFMxX1ZFUlNJT047CisJCQkJCXR5cGU9MzsKKwkJCQkJfQorCQkJCWVsc2UgaWYgKCEocy0+b3B0aW9ucyAmIFNTTF9PUF9OT19TU0x2MykpCisJCQkJCXsKKwkJCQkJcy0+dmVyc2lvbj1TU0wzX1ZFUlNJT047CisJCQkJCXR5cGU9MzsKKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJLyogY2xpZW50IHJlcXVlc3RzIFNTTCAzLjAgKi8KKwkJCQlpZiAoIShzLT5vcHRpb25zICYgU1NMX09QX05PX1NTTHYzKSkKKwkJCQkJeworCQkJCQlzLT52ZXJzaW9uPVNTTDNfVkVSU0lPTjsKKwkJCQkJdHlwZT0zOworCQkJCQl9CisJCQkJZWxzZSBpZiAoIShzLT5vcHRpb25zICYgU1NMX09QX05PX1RMU3YxKSkKKwkJCQkJeworCQkJCQkvKiB3ZSB3b24ndCBiZSBhYmxlIHRvIHVzZSBUTFMgb2YgY291cnNlLAorCQkJCQkgKiBidXQgdGhpcyB3aWxsIHNlbmQgYW4gYXBwcm9wcmlhdGUgYWxlcnQgKi8KKwkJCQkJcy0+dmVyc2lvbj1UTFMxX1ZFUlNJT047CisJCQkJCXR5cGU9MzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJZWxzZSBpZiAoKHN0cm5jbXAoIkdFVCAiLCAoY2hhciAqKXAsNCkgPT0gMCkgfHwKKwkJCSAoc3RybmNtcCgiUE9TVCAiLChjaGFyICopcCw1KSA9PSAwKSB8fAorCQkJIChzdHJuY21wKCJIRUFEICIsKGNoYXIgKilwLDUpID09IDApIHx8CisJCQkgKHN0cm5jbXAoIlBVVCAiLCAoY2hhciAqKXAsNCkgPT0gMCkpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9IVFRQX1JFUVVFU1QpOworCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UgaWYgKHN0cm5jbXAoIkNPTk5FQ1QiLChjaGFyICopcCw3KSA9PSAwKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDIzX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfSFRUUFNfUFJPWFlfUkVRVUVTVCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJaWYgKHMtPnN0YXRlID09IFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQikKKwkJeworCQkvKiB3ZSBoYXZlIFNTTHYzL1RMU3YxIGluIGFuIFNTTHYyIGhlYWRlcgorCQkgKiAob3RoZXIgY2FzZXMgc2tpcCB0aGlzIHN0YXRlKSAqLworCisJCXR5cGU9MjsKKwkJcD1zLT5wYWNrZXQ7CisJCXZbMF0gPSBwWzNdOyAvKiA9PSBTU0wzX1ZFUlNJT05fTUFKT1IgKi8KKwkJdlsxXSA9IHBbNF07CisKKy8qIFRoZSBTU0wyIHByb3RvY29sIGFsbG93cyBuIHRvIGJlIGxhcmdlciwganVzdCBwaWNrCisgKiBhIHJlYXNvbmFibGUgYnVmZmVyIHNpemUuICovCisjaWYgU1NMM19SVF9ERUZBVUxUX1BBQ0tFVF9TSVpFIDwgMTAyNCo0IC0gU1NMM19SVF9ERUZBVUxUX1dSSVRFX09WRVJIRUFECisjZXJyb3IgIlNTTDNfUlRfREVGQVVMVF9QQUNLRVRfU0laRSBpcyB0b28gc21hbGwuIgorI2VuZGlmCisJCW49KChwWzBdJjB4N2YpPDw4KXxwWzFdOworCQlpZiAobiA+IFNTTDNfUlRfREVGQVVMVF9QQUNLRVRfU0laRSAtIDIpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9SRUNPUkRfVE9PX0xBUkdFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWo9c3NsMjNfcmVhZF9ieXRlcyhzLG4rMik7CisJCWlmIChqIDw9IDApIHJldHVybihqKTsKKworCQlzc2wzX2ZpbmlzaF9tYWMocywgcy0+cGFja2V0KzIsIHMtPnBhY2tldF9sZW5ndGgtMik7CisJCWlmIChzLT5tc2dfY2FsbGJhY2spCisJCQlzLT5tc2dfY2FsbGJhY2soMCwgU1NMMl9WRVJTSU9OLCAwLCBzLT5wYWNrZXQrMiwgcy0+cGFja2V0X2xlbmd0aC0yLCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsgLyogQ0xJRU5ULUhFTExPICovCisKKwkJcD1zLT5wYWNrZXQ7CisJCXArPTU7CisJCW4ycyhwLGNzbCk7CisJCW4ycyhwLHNpbCk7CisJCW4ycyhwLGNsKTsKKwkJZD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCQlpZiAoKGNzbCtzaWwrY2wrMTEpICE9IHMtPnBhY2tldF9sZW5ndGgpIC8qIFdlIGNhbid0IGhhdmUgVExTIGV4dGVuc2lvbnMgaW4gU1NMIDIuMCBmb3JtYXQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDbGllbnQgSGVsbG8sIGNhbiB3ZT8gRXJyb3IgY29uZGl0aW9uIHNob3VsZCBiZQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICc+JyBvdGhlcndlaXNlICovCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMMjNfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9SRUNPUkRfTEVOR1RIX01JU01BVENIKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCS8qIHJlY29yZCBoZWFkZXI6IG1zZ190eXBlIC4uLiAqLworCQkqKGQrKykgPSBTU0wzX01UX0NMSUVOVF9IRUxMTzsKKwkJLyogLi4uIGFuZCBsZW5ndGggKGFjdHVhbCB2YWx1ZSB3aWxsIGJlIHdyaXR0ZW4gbGF0ZXIpICovCisJCWRfbGVuID0gZDsKKwkJZCArPSAzOworCisJCS8qIGNsaWVudF92ZXJzaW9uICovCisJCSooZCsrKSA9IFNTTDNfVkVSU0lPTl9NQUpPUjsgLyogPT0gdlswXSAqLworCQkqKGQrKykgPSB2WzFdOworCisJCS8qIGxldHMgcG9wdWxhdGUgdGhlIHJhbmRvbSBhcmVhICovCisJCS8qIGdldCB0aGUgY2hhbGxlbmdlX2xlbmd0aCAqLworCQlpPShjbCA+IFNTTDNfUkFORE9NX1NJWkUpP1NTTDNfUkFORE9NX1NJWkU6Y2w7CisJCW1lbXNldChkLDAsU1NMM19SQU5ET01fU0laRSk7CisJCW1lbWNweSgmKGRbU1NMM19SQU5ET01fU0laRS1pXSksJihwW2NzbCtzaWxdKSxpKTsKKwkJZCs9U1NMM19SQU5ET01fU0laRTsKKworCQkvKiBubyBzZXNzaW9uLWlkIHJldXNlICovCisJCSooZCsrKT0wOworCisJCS8qIGNpcGhlcnMgKi8KKwkJaj0wOworCQlkZD1kOworCQlkKz0yOworCQlmb3IgKGk9MDsgaTxjc2w7IGkrPTMpCisJCQl7CisJCQlpZiAocFtpXSAhPSAwKSBjb250aW51ZTsKKwkJCSooZCsrKT1wW2krMV07CisJCQkqKGQrKyk9cFtpKzJdOworCQkJais9MjsKKwkJCX0KKwkJczJuKGosZGQpOworCisJCS8qIENPTVBSRVNTSU9OICovCisJCSooZCsrKT0xOworCQkqKGQrKyk9MDsKKwkJCisjaWYgMAorICAgICAgICAgICAgICAgIC8qIGNvcHkgYW55IHJlbWFpbmluZyBkYXRhIHdpdGggbWF5IGJlIGV4dGVuc2lvbnMgKi8KKwkgICAgICAgIHAgPSBwK2NzbCtzaWwrY2w7CisJCXdoaWxlIChwIDwgIHMtPnBhY2tldCtzLT5wYWNrZXRfbGVuZ3RoKQorCQkJeworCQkJKihkKyspPSoocCsrKTsKKwkJCX0KKyNlbmRpZgorCisJCWkgPSAoZC0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhKSAtIDQ7CisJCWwybjMoKGxvbmcpaSwgZF9sZW4pOworCisJCS8qIGdldCB0aGUgZGF0YSByZXVzZWQgZnJvbSB0aGUgaW5pdF9idWYgKi8KKwkJcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlPTE7CisJCXMtPnMzLT50bXAubWVzc2FnZV90eXBlPVNTTDNfTVRfQ0xJRU5UX0hFTExPOworCQlzLT5zMy0+dG1wLm1lc3NhZ2Vfc2l6ZT1pOworCQl9CisKKwkvKiBpbWFnaW5hcnkgbmV3IHN0YXRlIChmb3IgcHJvZ3JhbSBzdHJ1Y3R1cmUpOiAqLworCS8qIHMtPnN0YXRlID0gU1NMMjNfU1JfQ0xOVF9IRUxMT19DICovCisKKwlpZiAodHlwZSA9PSAxKQorCQl7CisjaWZkZWYgT1BFTlNTTF9OT19TU0wyCisJCVNTTGVycihTU0xfRl9TU0wyM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX1VOU1VQUE9SVEVEX1BST1RPQ09MKTsKKwkJZ290byBlcnI7CisjZWxzZQorCQkvKiB3ZSBhcmUgdGFsa2luZyBzc2x2MiAqLworCQkvKiB3ZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBTU0x2My9UTFN2MSBzZXR1cCBhbmQgcHV0IGluIHRoZQorCQkgKiBzc2x2MiBzdHVmZi4gKi8KKworCQlpZiAocy0+czIgPT0gTlVMTCkKKwkJCXsKKwkJCWlmICghc3NsMl9uZXcocykpCisJCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXNzbDJfY2xlYXIocyk7CisKKwkJaWYgKHMtPnMzICE9IE5VTEwpIHNzbDNfZnJlZShzKTsKKworCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihzLT5pbml0X2J1ZiwKKwkJCVNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfM19CWVRFX0hFQURFUikpCisJCQl7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlzLT5zdGF0ZT1TU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQTsKKwkJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fVExTdjEgJiYgcy0+b3B0aW9ucyAmIFNTTF9PUF9OT19TU0x2MykKKwkJCXMtPnMyLT5zc2wyX3JvbGxiYWNrPTA7CisJCWVsc2UKKwkJCS8qIHJlamVjdCBTU0wgMi4wIHNlc3Npb24gaWYgY2xpZW50IHN1cHBvcnRzIFNTTCAzLjAgb3IgVExTIDEuMAorCQkJICogKFNTTCAzLjAgZHJhZnQvUkZDIDIyNDYsIEFwcC4gRS4yKSAqLworCQkJcy0+czItPnNzbDJfcm9sbGJhY2s9MTsKKworCQkvKiBzZXR1cCB0aGUgbiBieXRlcyB3ZSBoYXZlIHJlYWQgc28gd2UgZ2V0IHRoZW0gZnJvbQorCQkgKiB0aGUgc3NsdjIgYnVmZmVyICovCisJCXMtPnJzdGF0ZT1TU0xfU1RfUkVBRF9IRUFERVI7CisJCXMtPnBhY2tldF9sZW5ndGg9bjsKKwkJcy0+cGFja2V0PSAmKHMtPnMyLT5yYnVmWzBdKTsKKwkJbWVtY3B5KHMtPnBhY2tldCxidWYsbik7CisJCXMtPnMyLT5yYnVmX2xlZnQ9bjsKKwkJcy0+czItPnJidWZfb2Zmcz0wOworCisJCXMtPm1ldGhvZD1TU0x2Ml9zZXJ2ZXJfbWV0aG9kKCk7CisJCXMtPmhhbmRzaGFrZV9mdW5jPXMtPm1ldGhvZC0+c3NsX2FjY2VwdDsKKyNlbmRpZgorCQl9CisKKwlpZiAoKHR5cGUgPT0gMikgfHwgKHR5cGUgPT0gMykpCisJCXsKKwkJLyogd2UgaGF2ZSBTU0x2My9UTFN2MSAodHlwZSAyOiBTU0wyIHN0eWxlLCB0eXBlIDM6IFNTTDMvVExTIHN0eWxlKSAqLworCisJCWlmICghc3NsX2luaXRfd2Jpb19idWZmZXIocywxKSkgZ290byBlcnI7CisKKwkJLyogd2UgYXJlIGluIHRoaXMgc3RhdGUgKi8KKwkJcy0+c3RhdGU9U1NMM19TVF9TUl9DTE5UX0hFTExPX0E7CisKKwkJaWYgKHR5cGUgPT0gMykKKwkJCXsKKwkJCS8qIHB1dCB0aGUgJ24nIGJ5dGVzIHdlIGhhdmUgcmVhZCBpbnRvIHRoZSBpbnB1dCBidWZmZXIKKwkJCSAqIGZvciBTU0x2MyAqLworCQkJcy0+cnN0YXRlPVNTTF9TVF9SRUFEX0hFQURFUjsKKwkJCXMtPnBhY2tldF9sZW5ndGg9bjsKKwkJCWlmIChzLT5zMy0+cmJ1Zi5idWYgPT0gTlVMTCkKKwkJCQlpZiAoIXNzbDNfc2V0dXBfcmVhZF9idWZmZXIocykpCisJCQkJCWdvdG8gZXJyOworCisJCQlzLT5wYWNrZXQ9ICYocy0+czMtPnJidWYuYnVmWzBdKTsKKwkJCW1lbWNweShzLT5wYWNrZXQsYnVmLG4pOworCQkJcy0+czMtPnJidWYubGVmdD1uOworCQkJcy0+czMtPnJidWYub2Zmc2V0PTA7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXMtPnBhY2tldF9sZW5ndGg9MDsKKwkJCXMtPnMzLT5yYnVmLmxlZnQ9MDsKKwkJCXMtPnMzLT5yYnVmLm9mZnNldD0wOworCQkJfQorCisJCWlmIChzLT52ZXJzaW9uID09IFRMUzFfVkVSU0lPTikKKwkJCXMtPm1ldGhvZCA9IFRMU3YxX3NlcnZlcl9tZXRob2QoKTsKKwkJZWxzZQorCQkJcy0+bWV0aG9kID0gU1NMdjNfc2VydmVyX21ldGhvZCgpOworI2lmIDAgLyogc3NsM19nZXRfY2xpZW50X2hlbGxvIGRvZXMgdGhpcyAqLworCQlzLT5jbGllbnRfdmVyc2lvbj0odlswXTw8OCl8dlsxXTsKKyNlbmRpZgorCQlzLT5oYW5kc2hha2VfZnVuYz1zLT5tZXRob2QtPnNzbF9hY2NlcHQ7CisJCX0KKwkKKwlpZiAoKHR5cGUgPCAxKSB8fCAodHlwZSA+IDMpKQorCQl7CisJCS8qIGJhZCwgdmVyeSBiYWQgKi8KKwkJU1NMZXJyKFNTTF9GX1NTTDIzX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfVU5LTk9XTl9QUk9UT0NPTCk7CisJCWdvdG8gZXJyOworCQl9CisJcy0+aW5pdF9udW09MDsKKworCWlmIChidWYgIT0gYnVmX3NwYWNlKSBPUEVOU1NMX2ZyZWUoYnVmKTsKKwlyZXR1cm4oU1NMX2FjY2VwdChzKSk7CitlcnI6CisJaWYgKGJ1ZiAhPSBidWZfc3BhY2UpIE9QRU5TU0xfZnJlZShidWYpOworCXJldHVybigtMSk7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3MyX2NsbnQuYyBiL2xpYi9vcGVuc3NsL3NzbC9zMl9jbG50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhYzE1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zMl9jbG50LmMKQEAgLTAsMCArMSwxMTI1IEBACisvKiBzc2wvczJfY2xudC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNzbF9sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorCitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqc3NsMl9nZXRfY2xpZW50X21ldGhvZChpbnQgdmVyKTsKK3N0YXRpYyBpbnQgZ2V0X3NlcnZlcl9maW5pc2hlZChTU0wgKnMpOworc3RhdGljIGludCBnZXRfc2VydmVyX3ZlcmlmeShTU0wgKnMpOworc3RhdGljIGludCBnZXRfc2VydmVyX2hlbGxvKFNTTCAqcyk7CitzdGF0aWMgaW50IGNsaWVudF9oZWxsbyhTU0wgKnMpOyAKK3N0YXRpYyBpbnQgY2xpZW50X21hc3Rlcl9rZXkoU1NMICpzKTsKK3N0YXRpYyBpbnQgY2xpZW50X2ZpbmlzaGVkKFNTTCAqcyk7CitzdGF0aWMgaW50IGNsaWVudF9jZXJ0aWZpY2F0ZShTU0wgKnMpOworc3RhdGljIGludCBzc2xfcnNhX3B1YmxpY19lbmNyeXB0KFNFU1NfQ0VSVCAqc2MsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmZyb20sCisJdW5zaWduZWQgY2hhciAqdG8saW50IHBhZGRpbmcpOworI2RlZmluZSBCUkVBSwlicmVhaworCitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqc3NsMl9nZXRfY2xpZW50X21ldGhvZChpbnQgdmVyKQorCXsKKwlpZiAodmVyID09IFNTTDJfVkVSU0lPTikKKwkJcmV0dXJuKFNTTHYyX2NsaWVudF9tZXRob2QoKSk7CisJZWxzZQorCQlyZXR1cm4oTlVMTCk7CisJfQorCitJTVBMRU1FTlRfc3NsMl9tZXRoX2Z1bmMoU1NMdjJfY2xpZW50X21ldGhvZCwKKwkJCXNzbF91bmRlZmluZWRfZnVuY3Rpb24sCisJCQlzc2wyX2Nvbm5lY3QsCisJCQlzc2wyX2dldF9jbGllbnRfbWV0aG9kKQorCitpbnQgc3NsMl9jb25uZWN0KFNTTCAqcykKKwl7CisJdW5zaWduZWQgbG9uZyBsPSh1bnNpZ25lZCBsb25nKXRpbWUoTlVMTCk7CisJQlVGX01FTSAqYnVmPU5VTEw7CisJaW50IHJldD0gLTE7CisJdm9pZCAoKmNiKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKT1OVUxMOworCWludCBuZXdfc3RhdGUsc3RhdGU7CisKKwlSQU5EX2FkZCgmbCxzaXplb2YobCksMCk7CisJRVJSX2NsZWFyX2Vycm9yKCk7CisJY2xlYXJfc3lzX2Vycm9yKCk7CisKKwlpZiAocy0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQljYj1zLT5pbmZvX2NhbGxiYWNrOworCWVsc2UgaWYgKHMtPmN0eC0+aW5mb19jYWxsYmFjayAhPSBOVUxMKQorCQljYj1zLT5jdHgtPmluZm9fY2FsbGJhY2s7CisKKwkvKiBpbml0IHRoaW5ncyB0byBibGFuayAqLworCXMtPmluX2hhbmRzaGFrZSsrOworCWlmICghU1NMX2luX2luaXQocykgfHwgU1NMX2luX2JlZm9yZShzKSkgU1NMX2NsZWFyKHMpOworCisJZm9yICg7OykKKwkJeworCQlzdGF0ZT1zLT5zdGF0ZTsKKworCQlzd2l0Y2ggKHMtPnN0YXRlKQorCQkJeworCQljYXNlIFNTTF9TVF9CRUZPUkU6CisJCWNhc2UgU1NMX1NUX0NPTk5FQ1Q6CisJCWNhc2UgU1NMX1NUX0JFRk9SRXxTU0xfU1RfQ09OTkVDVDoKKwkJY2FzZSBTU0xfU1RfT0t8U1NMX1NUX0NPTk5FQ1Q6CisKKwkJCXMtPnNlcnZlcj0wOworCQkJaWYgKGNiICE9IE5VTEwpIGNiKHMsU1NMX0NCX0hBTkRTSEFLRV9TVEFSVCwxKTsKKworCQkJcy0+dmVyc2lvbj1TU0wyX1ZFUlNJT047CisJCQlzLT50eXBlPVNTTF9TVF9DT05ORUNUOworCisJCQlidWY9cy0+aW5pdF9idWY7CisJCQlpZiAoKGJ1ZiA9PSBOVUxMKSAmJiAoKGJ1Zj1CVUZfTUVNX25ldygpKSA9PSBOVUxMKSkKKwkJCQl7CisJCQkJcmV0PSAtMTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlpZiAoIUJVRl9NRU1fZ3JvdyhidWYsCisJCQkJU1NMMl9NQVhfUkVDT1JEX0xFTkdUSF8zX0JZVEVfSEVBREVSKSkKKwkJCQl7CisJCQkJaWYgKGJ1ZiA9PSBzLT5pbml0X2J1ZikKKwkJCQkJYnVmPU5VTEw7CisJCQkJcmV0PSAtMTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlzLT5pbml0X2J1Zj1idWY7CisJCQlidWY9TlVMTDsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlzLT5zdGF0ZT1TU0wyX1NUX1NFTkRfQ0xJRU5UX0hFTExPX0E7CisJCQlzLT5jdHgtPnN0YXRzLnNlc3NfY29ubmVjdCsrOworCQkJcy0+aGFuZHNoYWtlX2Z1bmM9c3NsMl9jb25uZWN0OworCQkJQlJFQUs7CisKKwkJY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0hFTExPX0E6CisJCWNhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9IRUxMT19COgorCQkJcy0+c2h1dGRvd249MDsKKwkJCXJldD1jbGllbnRfaGVsbG8ocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+aW5pdF9udW09MDsKKwkJCXMtPnN0YXRlPVNTTDJfU1RfR0VUX1NFUlZFUl9IRUxMT19BOworCQkJQlJFQUs7CisJCQorCQljYXNlIFNTTDJfU1RfR0VUX1NFUlZFUl9IRUxMT19BOgorCQljYXNlIFNTTDJfU1RfR0VUX1NFUlZFUl9IRUxMT19COgorCQkJcmV0PWdldF9zZXJ2ZXJfaGVsbG8ocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWlmICghcy0+aGl0KSAvKiBuZXcgc2Vzc2lvbiAqLworCQkJCXsKKwkJCQlzLT5zdGF0ZT1TU0wyX1NUX1NFTkRfQ0xJRU5UX01BU1RFUl9LRVlfQTsKKwkJCQlCUkVBSzsgCisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlzLT5zdGF0ZT1TU0wyX1NUX0NMSUVOVF9TVEFSVF9FTkNSWVBUSU9OOworCQkJCWJyZWFrOworCQkJCX0KKwkKKwkJY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX01BU1RFUl9LRVlfQToKKwkJY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX01BU1RFUl9LRVlfQjoKKwkJCXJldD1jbGllbnRfbWFzdGVyX2tleShzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5pbml0X251bT0wOworCQkJcy0+c3RhdGU9U1NMMl9TVF9DTElFTlRfU1RBUlRfRU5DUllQVElPTjsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMMl9TVF9DTElFTlRfU1RBUlRfRU5DUllQVElPTjoKKwkJCS8qIE9rLCB3ZSBub3cgaGF2ZSBhbGwgdGhlIHN0dWZmIG5lZWRlZCB0bworCQkJICogc3RhcnQgZW5jcnlwdGluZywgc28gbGV0cyBmaXJlIGl0IHVwIDotKSAqLworCQkJaWYgKCFzc2wyX2VuY19pbml0KHMsMSkpCisJCQkJeworCQkJCXJldD0gLTE7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJcy0+czItPmNsZWFyX3RleHQ9MDsKKwkJCXMtPnN0YXRlPVNTTDJfU1RfU0VORF9DTElFTlRfRklOSVNIRURfQTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9GSU5JU0hFRF9BOgorCQljYXNlIFNTTDJfU1RfU0VORF9DTElFTlRfRklOSVNIRURfQjoKKwkJCXJldD1jbGllbnRfZmluaXNoZWQocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+aW5pdF9udW09MDsKKwkJCXMtPnN0YXRlPVNTTDJfU1RfR0VUX1NFUlZFUl9WRVJJRllfQTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMMl9TVF9HRVRfU0VSVkVSX1ZFUklGWV9BOgorCQljYXNlIFNTTDJfU1RfR0VUX1NFUlZFUl9WRVJJRllfQjoKKwkJCXJldD1nZXRfc2VydmVyX3ZlcmlmeShzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5pbml0X251bT0wOworCQkJcy0+c3RhdGU9U1NMMl9TVF9HRVRfU0VSVkVSX0ZJTklTSEVEX0E7CisJCQlicmVhazsKKworCQljYXNlIFNTTDJfU1RfR0VUX1NFUlZFUl9GSU5JU0hFRF9BOgorCQljYXNlIFNTTDJfU1RfR0VUX1NFUlZFUl9GSU5JU0hFRF9COgorCQkJcmV0PWdldF9zZXJ2ZXJfZmluaXNoZWQocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0E6CisJCWNhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9COgorCQljYXNlIFNTTDJfU1RfU0VORF9DTElFTlRfQ0VSVElGSUNBVEVfQzoKKwkJY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0Q6CisJCWNhc2UgU1NMMl9TVF9YNTA5X0dFVF9DTElFTlRfQ0VSVElGSUNBVEU6CisJCQlyZXQ9Y2xpZW50X2NlcnRpZmljYXRlKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlzLT5zdGF0ZT1TU0wyX1NUX0dFVF9TRVJWRVJfRklOSVNIRURfQTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMX1NUX09LOgorCQkJaWYgKHMtPmluaXRfYnVmICE9IE5VTEwpCisJCQkJeworCQkJCUJVRl9NRU1fZnJlZShzLT5pbml0X2J1Zik7CisJCQkJcy0+aW5pdF9idWY9TlVMTDsKKwkJCQl9CisJCQlzLT5pbml0X251bT0wOworCQkvKglFUlJfY2xlYXJfZXJyb3IoKTsqLworCisJCQkvKiBJZiB3ZSB3YW50IHRvIGNhY2hlIHNlc3Npb24taWRzIGluIHRoZSBjbGllbnQKKwkJCSAqIGFuZCB3ZSBzdWNjZXNzZnVsbHkgYWRkIHRoZSBzZXNzaW9uLWlkIHRvIHRoZQorCQkJICogY2FjaGUsIGFuZCB0aGVyZSBpcyBhIGNhbGxiYWNrLCB0aGVuIHBhc3MgaXQgb3V0LgorCQkJICogMjYvMTEvOTYgLSBlYXkgLSBvbmx5IGFkZCBpZiBub3QgYSByZS11c2VkIHNlc3Npb24uCisJCQkgKi8KKworCQkJc3NsX3VwZGF0ZV9jYWNoZShzLFNTTF9TRVNTX0NBQ0hFX0NMSUVOVCk7CisJCQlpZiAocy0+aGl0KSBzLT5jdHgtPnN0YXRzLnNlc3NfaGl0Kys7CisKKwkJCXJldD0xOworCQkJLyogcy0+c2VydmVyPTA7ICovCisJCQlzLT5jdHgtPnN0YXRzLnNlc3NfY29ubmVjdF9nb29kKys7CisKKwkJCWlmIChjYiAhPSBOVUxMKSBjYihzLFNTTF9DQl9IQU5EU0hBS0VfRE9ORSwxKTsKKworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKwkJZGVmYXVsdDoKKwkJCVNTTGVycihTU0xfRl9TU0wyX0NPTk5FQ1QsU1NMX1JfVU5LTk9XTl9TVEFURSk7CisJCQlyZXR1cm4oLTEpOworCQkJLyogYnJlYWs7ICovCisJCQl9CisKKwkJaWYgKChjYiAhPSBOVUxMKSAmJiAocy0+c3RhdGUgIT0gc3RhdGUpKQorCQkJeworCQkJbmV3X3N0YXRlPXMtPnN0YXRlOworCQkJcy0+c3RhdGU9c3RhdGU7CisJCQljYihzLFNTTF9DQl9DT05ORUNUX0xPT1AsMSk7CisJCQlzLT5zdGF0ZT1uZXdfc3RhdGU7CisJCQl9CisJCX0KK2VuZDoKKwlzLT5pbl9oYW5kc2hha2UtLTsKKwlpZiAoYnVmICE9IE5VTEwpCisJCUJVRl9NRU1fZnJlZShidWYpOworCWlmIChjYiAhPSBOVUxMKSAKKwkJY2IocyxTU0xfQ0JfQ09OTkVDVF9FWElULHJldCk7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGdldF9zZXJ2ZXJfaGVsbG8oU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgaSxqOworCXVuc2lnbmVkIGxvbmcgbGVuOworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpzaz1OVUxMLCpjbCwgKnByaW8sICphbGxvdzsKKworCWJ1Zj0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCXA9YnVmOworCWlmIChzLT5zdGF0ZSA9PSBTU0wyX1NUX0dFVF9TRVJWRVJfSEVMTE9fQSkKKwkJeworCQlpPXNzbDJfcmVhZChzLChjaGFyICopJihidWZbcy0+aW5pdF9udW1dKSwxMS1zLT5pbml0X251bSk7CisJCWlmIChpIDwgKDExLXMtPmluaXRfbnVtKSkgCisJCQlyZXR1cm4oc3NsMl9wYXJ0X3JlYWQocyxTU0xfRl9HRVRfU0VSVkVSX0hFTExPLGkpKTsKKwkJcy0+aW5pdF9udW0gPSAxMTsKKworCQlpZiAoKihwKyspICE9IFNTTDJfTVRfU0VSVkVSX0hFTExPKQorCQkJeworCQkJaWYgKHBbLTFdICE9IFNTTDJfTVRfRVJST1IpCisJCQkJeworCQkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQkJCVNTTGVycihTU0xfRl9HRVRfU0VSVkVSX0hFTExPLAorCQkJCQlTU0xfUl9SRUFEX1dST05HX1BBQ0tFVF9UWVBFKTsKKwkJCQl9CisJCQllbHNlCisJCQkJU1NMZXJyKFNTTF9GX0dFVF9TRVJWRVJfSEVMTE8sCisJCQkJCVNTTF9SX1BFRVJfRVJST1IpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKyNpZmRlZiBfX0FQUExFX0NDX18KKwkJLyogVGhlIFJoYXBzb2R5IDUuNSAoYS5rLmEuIE1hY09TIFgpIGNvbXBpbGVyIGJ1ZworCQkgKiB3b3JrYXJvdW5kLiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+ICovCisJCXMtPmhpdD0oaT0qKHArKykpPzE6MDsKKyNlbHNlCisJCXMtPmhpdD0oKihwKyspKT8xOjA7CisjZW5kaWYKKwkJcy0+czItPnRtcC5jZXJ0X3R5cGU9ICoocCsrKTsKKwkJbjJzKHAsaSk7CisJCWlmIChpIDwgcy0+dmVyc2lvbikgcy0+dmVyc2lvbj1pOworCQluMnMocCxpKTsgcy0+czItPnRtcC5jZXJ0X2xlbmd0aD1pOworCQluMnMocCxpKTsgcy0+czItPnRtcC5jc2w9aTsKKwkJbjJzKHAsaSk7IHMtPnMyLT50bXAuY29ubl9pZF9sZW5ndGg9aTsKKwkJcy0+c3RhdGU9U1NMMl9TVF9HRVRfU0VSVkVSX0hFTExPX0I7CisJCX0KKworCS8qIFNTTDJfU1RfR0VUX1NFUlZFUl9IRUxMT19CICovCisJbGVuID0gMTEgKyAodW5zaWduZWQgbG9uZylzLT5zMi0+dG1wLmNlcnRfbGVuZ3RoICsgKHVuc2lnbmVkIGxvbmcpcy0+czItPnRtcC5jc2wgKyAodW5zaWduZWQgbG9uZylzLT5zMi0+dG1wLmNvbm5faWRfbGVuZ3RoOworCWlmIChsZW4gPiBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIpCisJCXsKKwkJU1NMZXJyKFNTTF9GX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfTUVTU0FHRV9UT09fTE9ORyk7CisJCXJldHVybiAtMTsKKwkJfQorCWogPSAoaW50KWxlbiAtIHMtPmluaXRfbnVtOworCWkgPSBzc2wyX3JlYWQocywoY2hhciAqKSYoYnVmW3MtPmluaXRfbnVtXSksaik7CisJaWYgKGkgIT0gaikgcmV0dXJuKHNzbDJfcGFydF9yZWFkKHMsU1NMX0ZfR0VUX1NFUlZFUl9IRUxMTyxpKSk7CisJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIDAsIGJ1ZiwgKHNpemVfdClsZW4sIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOyAvKiBTRVJWRVItSEVMTE8gKi8KKworCS8qIHRoaW5ncyBhcmUgbG9va2luZyBnb29kICovCisKKwlwID0gYnVmICsgMTE7CisJaWYgKHMtPmhpdCkKKwkJeworCQlpZiAocy0+czItPnRtcC5jZXJ0X2xlbmd0aCAhPSAwKSAKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9HRVRfU0VSVkVSX0hFTExPLFNTTF9SX1JFVVNFX0NFUlRfTEVOR1RIX05PVF9aRVJPKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCWlmIChzLT5zMi0+dG1wLmNlcnRfdHlwZSAhPSAwKQorCQkJeworCQkJaWYgKCEocy0+b3B0aW9ucyAmCisJCQkJU1NMX09QX1NTTFJFRjJfUkVVU0VfQ0VSVF9UWVBFX0JVRykpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9HRVRfU0VSVkVSX0hFTExPLFNTTF9SX1JFVVNFX0NFUlRfVFlQRV9OT1RfWkVSTyk7CisJCQkJcmV0dXJuKC0xKTsKKwkJCQl9CisJCQl9CisJCWlmIChzLT5zMi0+dG1wLmNzbCAhPSAwKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfUkVVU0VfQ0lQSEVSX0xJU1RfTk9UX1pFUk8pOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworI2lmZGVmIHVuZGVmCisJCS8qIHZlcnkgYmFkICovCisJCW1lbXNldChzLT5zZXNzaW9uLT5zZXNzaW9uX2lkLDAsCisJCQlTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSF9JTl9CWVRFUyk7CisJCXMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoPTA7CisJCSovCisjZW5kaWYKKworCQkvKiB3ZSBuZWVkIHRvIGRvIHRoaXMgaW4gY2FzZSB3ZSB3ZXJlIHRyeWluZyB0byByZXVzZSBhIAorCQkgKiBjbGllbnQgc2Vzc2lvbiBidXQgb3RoZXJzIGFyZSBhbHJlYWR5IHJldXNpbmcgaXQuCisJCSAqIElmIHRoaXMgd2FzIGEgbmV3ICdibGFuaycgc2Vzc2lvbiBJRCwgdGhlIHNlc3Npb24taWQKKwkJICogbGVuZ3RoIHdpbGwgc3RpbGwgYmUgMCAqLworCQlpZiAocy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGggPiAwKQorCQkJeworCQkJaWYgKCFzc2xfZ2V0X25ld19zZXNzaW9uKHMsMCkpCisJCQkJeworCQkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQkJCXJldHVybigtMSk7CisJCQkJfQorCQkJfQorCisJCWlmIChzc2wyX3NldF9jZXJ0aWZpY2F0ZShzLHMtPnMyLT50bXAuY2VydF90eXBlLAorCQkJcy0+czItPnRtcC5jZXJ0X2xlbmd0aCxwKSA8PSAwKQorCQkJeworCQkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX0JBRF9DRVJUSUZJQ0FURSk7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCQlwKz1zLT5zMi0+dG1wLmNlcnRfbGVuZ3RoOworCisJCWlmIChzLT5zMi0+dG1wLmNzbCA9PSAwKQorCQkJeworCQkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX05PX0NJUEhFUik7CisJCQlTU0xlcnIoU1NMX0ZfR0VUX1NFUlZFUl9IRUxMTyxTU0xfUl9OT19DSVBIRVJfTElTVCk7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCisJCS8qIFdlIGhhdmUganVzdCByZWNlaXZlZCBhIGxpc3Qgb2YgY2lwaGVycyBiYWNrIGZyb20gdGhlCisJCSAqIHNlcnZlci4gIFdlIG5lZWQgdG8gZ2V0IHRoZSBvbmVzIHRoYXQgbWF0Y2gsIHRoZW4gc2VsZWN0CisJCSAqIHRoZSBvbmUgd2Ugd2FudCB0aGUgbW9zdCA6LSkuICovCisKKwkJLyogbG9hZCB0aGUgY2lwaGVycyAqLworCQlzaz1zc2xfYnl0ZXNfdG9fY2lwaGVyX2xpc3QocyxwLHMtPnMyLT50bXAuY3NsLAorCQkJCQkgICAgJnMtPnNlc3Npb24tPmNpcGhlcnMpOworCQlwKz1zLT5zMi0+dG1wLmNzbDsKKwkJaWYgKHNrID09IE5VTEwpCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCVNTTGVycihTU0xfRl9HRVRfU0VSVkVSX0hFTExPLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisKKwkJKHZvaWQpc2tfU1NMX0NJUEhFUl9zZXRfY21wX2Z1bmMoc2ssc3NsX2NpcGhlcl9wdHJfaWRfY21wKTsKKworCQkvKiBnZXQgdGhlIGFycmF5IG9mIGNpcGhlcnMgd2Ugd2lsbCBhY2NlcHQgKi8KKwkJY2w9U1NMX2dldF9jaXBoZXJzKHMpOworCQkodm9pZClza19TU0xfQ0lQSEVSX3NldF9jbXBfZnVuYyhjbCxzc2xfY2lwaGVyX3B0cl9pZF9jbXApOworCisJCS8qCisJCSAqIElmIHNlcnZlciBwcmVmZXJlbmNlIGZsYWcgc2V0LCBjaG9vc2UgdGhlIGZpcnN0CisJCSAqIChoaWdoZXN0IHByaW9yaXR5KSBjaXBoZXIgdGhlIHNlcnZlciBzZW5kcywgb3RoZXJ3aXNlCisJCSAqIGNsaWVudCBwcmVmZXJlbmNlIGhhcyBwcmlvcml0eS4KKwkJICovCisJCWlmIChzLT5vcHRpb25zICYgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSkKKwkJICAgIHsKKwkJICAgIHByaW8gPSBzazsKKwkJICAgIGFsbG93ID0gY2w7CisJCSAgICB9CisJCWVsc2UKKwkJICAgIHsKKwkJICAgIHByaW8gPSBjbDsKKwkJICAgIGFsbG93ID0gc2s7CisJCSAgICB9CisJCS8qIEluIHRoZW9yeSB3ZSBjb3VsZCBoYXZlIGNpcGhlcnMgc2VudCBiYWNrIHRoYXQgd2UKKwkJICogZG9uJ3Qgd2FudCB0byB1c2UgYnV0IHRoYXQgZG9lcyBub3QgbWF0dGVyIHNpbmNlIHdlCisJCSAqIHdpbGwgY2hlY2sgYWdhaW5zdCB0aGUgbGlzdCB3ZSBvcmlnaW5hbGx5IHNlbnQgYW5kCisJCSAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIHNob3VsZCBub3QgYm90aGVyIHRvIG1hdGNoCisJCSAqIHRoZSB0d28gbGlzdHMgdXAganVzdCB0byBjaGVjay4gKi8KKwkJZm9yIChpPTA7IGk8c2tfU1NMX0NJUEhFUl9udW0ocHJpbyk7IGkrKykKKwkJCXsKKwkJCWlmIChza19TU0xfQ0lQSEVSX2ZpbmQoYWxsb3csCisJCQkJCSAgICAgc2tfU1NMX0NJUEhFUl92YWx1ZShwcmlvLGkpKSA+PSAwKQorCQkJCWJyZWFrOworCQkJfQorCisJCWlmIChpID49IHNrX1NTTF9DSVBIRVJfbnVtKHByaW8pKQorCQkJeworCQkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX05PX0NJUEhFUik7CisJCQlTU0xlcnIoU1NMX0ZfR0VUX1NFUlZFUl9IRUxMTyxTU0xfUl9OT19DSVBIRVJfTUFUQ0gpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJcy0+c2Vzc2lvbi0+Y2lwaGVyPXNrX1NTTF9DSVBIRVJfdmFsdWUocHJpbyxpKTsKKworCisJCWlmIChzLT5zZXNzaW9uLT5wZWVyICE9IE5VTEwpIC8qIGNhbid0IGhhcHBlbiovCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLCBTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCQlTU0xlcnIoU1NMX0ZfR0VUX1NFUlZFUl9IRUxMTywgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKworCQlzLT5zZXNzaW9uLT5wZWVyID0gcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2tleS0+eDUwOTsKKwkJLyogcGVlcl9rZXktPng1MDkgaGFzIGJlZW4gc2V0IGJ5IHNzbDJfc2V0X2NlcnRpZmljYXRlLiAqLworCQlDUllQVE9fYWRkKCZzLT5zZXNzaW9uLT5wZWVyLT5yZWZlcmVuY2VzLCAxLCBDUllQVE9fTE9DS19YNTA5KTsKKwkJfQorCisJaWYgKHMtPnNlc3Npb24tPnNlc3NfY2VydCA9PSBOVUxMIAorICAgICAgfHwgcy0+c2Vzc2lvbi0+cGVlciAhPSBzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfa2V5LT54NTA5KQorCQkvKiBjYW4ndCBoYXBwZW4gKi8KKwkJeworCQlzc2wyX3JldHVybl9lcnJvcihzLCBTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCVNTTGVycihTU0xfRl9HRVRfU0VSVkVSX0hFTExPLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCXJldHVybigtMSk7CisJCX0KKwkJCisJcy0+czItPmNvbm5faWRfbGVuZ3RoPXMtPnMyLT50bXAuY29ubl9pZF9sZW5ndGg7CisJaWYgKHMtPnMyLT5jb25uX2lkX2xlbmd0aCA+IHNpemVvZiBzLT5zMi0+Y29ubl9pZCkKKwkJeworCQlzc2wyX3JldHVybl9lcnJvcihzLCBTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCVNTTGVycihTU0xfRl9HRVRfU0VSVkVSX0hFTExPLCBTU0xfUl9TU0wyX0NPTk5FQ1RJT05fSURfVE9PX0xPTkcpOworCQlyZXR1cm4gLTE7CisJCX0KKwltZW1jcHkocy0+czItPmNvbm5faWQscCxzLT5zMi0+dG1wLmNvbm5faWRfbGVuZ3RoKTsKKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IGNsaWVudF9oZWxsbyhTU0wgKnMpCisJeworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpwLCpkOworLyoJQ0lQSEVSICoqY2lwaGVyOyovCisJaW50IGksbixqOworCisJYnVmPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfU0VORF9DTElFTlRfSEVMTE9fQSkKKwkJeworCQlpZiAoKHMtPnNlc3Npb24gPT0gTlVMTCkgfHwKKwkJCShzLT5zZXNzaW9uLT5zc2xfdmVyc2lvbiAhPSBzLT52ZXJzaW9uKSkKKwkJCXsKKwkJCWlmICghc3NsX2dldF9uZXdfc2Vzc2lvbihzLDApKQorCQkJCXsKKwkJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCX0KKwkJLyogZWxzZSB1c2UgdGhlIHByZS1sb2FkZWQgc2Vzc2lvbiAqLworCisJCXA9YnVmOwkJCQkJLyogaGVhZGVyICovCisJCWQ9cCs5OwkJCQkJLyogZGF0YSBzZWN0aW9uICovCisJCSoocCsrKT1TU0wyX01UX0NMSUVOVF9IRUxMTzsJCS8qIHR5cGUgKi8KKwkJczJuKFNTTDJfVkVSU0lPTixwKTsJCQkvKiB2ZXJzaW9uICovCisJCW49aj0wOworCisJCW49c3NsX2NpcGhlcl9saXN0X3RvX2J5dGVzKHMsU1NMX2dldF9jaXBoZXJzKHMpLGQsMCk7CisJCWQrPW47CisKKwkJaWYgKG4gPT0gMCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9DTElFTlRfSEVMTE8sU1NMX1JfTk9fQ0lQSEVSU19BVkFJTEFCTEUpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKworCQlzMm4obixwKTsJCQkvKiBjaXBoZXIgc3BlYyBudW0gYnl0ZXMgKi8KKworCQlpZiAoKHMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoID4gMCkgJiYKKwkJCShzLT5zZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aCA8PQorCQkJU1NMMl9NQVhfU1NMX1NFU1NJT05fSURfTEVOR1RIKSkKKwkJCXsKKwkJCWk9cy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGg7CisJCQlzMm4oaSxwKTsJCS8qIHNlc3Npb24gaWQgbGVuZ3RoICovCisJCQltZW1jcHkoZCxzLT5zZXNzaW9uLT5zZXNzaW9uX2lkLCh1bnNpZ25lZCBpbnQpaSk7CisJCQlkKz1pOworCQkJfQorCQllbHNlCisJCQl7CisJCQlzMm4oMCxwKTsKKwkJCX0KKworCQlzLT5zMi0+Y2hhbGxlbmdlX2xlbmd0aD1TU0wyX0NIQUxMRU5HRV9MRU5HVEg7CisJCXMybihTU0wyX0NIQUxMRU5HRV9MRU5HVEgscCk7CQkvKiBjaGFsbGVuZ2UgbGVuZ3RoICovCisJCS8qY2hhbGxlbmdlIGlkIGRhdGEqLworCQlpZiAoUkFORF9wc2V1ZG9fYnl0ZXMocy0+czItPmNoYWxsZW5nZSxTU0wyX0NIQUxMRU5HRV9MRU5HVEgpIDw9IDApCisJCQlyZXR1cm4gLTE7CisJCW1lbWNweShkLHMtPnMyLT5jaGFsbGVuZ2UsU1NMMl9DSEFMTEVOR0VfTEVOR1RIKTsKKwkJZCs9U1NMMl9DSEFMTEVOR0VfTEVOR1RIOworCisJCXMtPnN0YXRlPVNTTDJfU1RfU0VORF9DTElFTlRfSEVMTE9fQjsKKwkJcy0+aW5pdF9udW09ZC1idWY7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKwkvKiBTU0wyX1NUX1NFTkRfQ0xJRU5UX0hFTExPX0IgKi8KKwlyZXR1cm4oc3NsMl9kb193cml0ZShzKSk7CisJfQorCitzdGF0aWMgaW50IGNsaWVudF9tYXN0ZXJfa2V5KFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnAsKmQ7CisJaW50IGNsZWFyLGVuYyxrYXJnLGk7CisJU1NMX1NFU1NJT04gKnNlc3M7CisJY29uc3QgRVZQX0NJUEhFUiAqYzsKKwljb25zdCBFVlBfTUQgKm1kOworCisJYnVmPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfU0VORF9DTElFTlRfTUFTVEVSX0tFWV9BKQorCQl7CisKKwkJaWYgKCFzc2xfY2lwaGVyX2dldF9ldnAocy0+c2Vzc2lvbiwmYywmbWQsTlVMTCxOVUxMLE5VTEwpKQorCQkJeworCQkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX05PX0NJUEhFUik7CisJCQlTU0xlcnIoU1NMX0ZfQ0xJRU5UX01BU1RFUl9LRVksU1NMX1JfUFJPQkxFTVNfTUFQUElOR19DSVBIRVJfRlVOQ1RJT05TKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCXNlc3M9cy0+c2Vzc2lvbjsKKwkJcD1idWY7CisJCWQ9cCsxMDsKKwkJKihwKyspPVNTTDJfTVRfQ0xJRU5UX01BU1RFUl9LRVk7LyogdHlwZSAqLworCisJCWk9c3NsX3B1dF9jaXBoZXJfYnlfY2hhcihzLHNlc3MtPmNpcGhlcixwKTsKKwkJcCs9aTsKKworCQkvKiBtYWtlIGtleV9hcmcgZGF0YSAqLworCQlpPUVWUF9DSVBIRVJfaXZfbGVuZ3RoKGMpOworCQlzZXNzLT5rZXlfYXJnX2xlbmd0aD1pOworCQlpZiAoaSA+IFNTTF9NQVhfS0VZX0FSR19MRU5HVEgpCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLCBTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCQlTU0xlcnIoU1NMX0ZfQ0xJRU5UX01BU1RFUl9LRVksIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJaWYgKGkgPiAwKQorCQkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKHNlc3MtPmtleV9hcmcsaSkgPD0gMCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJLyogbWFrZSBhIG1hc3RlciBrZXkgKi8KKwkJaT1FVlBfQ0lQSEVSX2tleV9sZW5ndGgoYyk7CisJCXNlc3MtPm1hc3Rlcl9rZXlfbGVuZ3RoPWk7CisJCWlmIChpID4gMCkKKwkJCXsKKwkJCWlmIChpID4gKGludClzaXplb2Yoc2Vzcy0+bWFzdGVyX2tleSkpCisJCQkJeworCQkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsIFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCQlTU0xlcnIoU1NMX0ZfQ0xJRU5UX01BU1RFUl9LRVksIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJaWYgKFJBTkRfYnl0ZXMoc2Vzcy0+bWFzdGVyX2tleSxpKSA8PSAwKQorCQkJCXsKKwkJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCX0KKworCQlpZiAoc2Vzcy0+Y2lwaGVyLT5hbGdvcml0aG0yICYgU1NMMl9DRl84X0JZVEVfRU5DKQorCQkJZW5jPTg7CisJCWVsc2UgaWYgKFNTTF9DX0lTX0VYUE9SVChzZXNzLT5jaXBoZXIpKQorCQkJZW5jPTU7CisJCWVsc2UKKwkJCWVuYz1pOworCisJCWlmICgoaW50KWkgPCBlbmMpCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCVNTTGVycihTU0xfRl9DTElFTlRfTUFTVEVSX0tFWSxTU0xfUl9DSVBIRVJfVEFCTEVfU1JDX0VSUk9SKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCWNsZWFyPWktZW5jOworCQlzMm4oY2xlYXIscCk7CisJCW1lbWNweShkLHNlc3MtPm1hc3Rlcl9rZXksKHVuc2lnbmVkIGludCljbGVhcik7CisJCWQrPWNsZWFyOworCisJCWVuYz1zc2xfcnNhX3B1YmxpY19lbmNyeXB0KHNlc3MtPnNlc3NfY2VydCxlbmMsCisJCQkmKHNlc3MtPm1hc3Rlcl9rZXlbY2xlYXJdKSxkLAorCQkJKHMtPnMyLT5zc2wyX3JvbGxiYWNrKT9SU0FfU1NMVjIzX1BBRERJTkc6UlNBX1BLQ1MxX1BBRERJTkcpOworCQlpZiAoZW5jIDw9IDApCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCVNTTGVycihTU0xfRl9DTElFTlRfTUFTVEVSX0tFWSxTU0xfUl9QVUJMSUNfS0VZX0VOQ1JZUFRfRVJST1IpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKyNpZmRlZiBQS0NTMV9DSEVDSworCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9QS0NTMV9DSEVDS18xKSBkWzFdKys7CisJCWlmIChzLT5vcHRpb25zICYgU1NMX09QX1BLQ1MxX0NIRUNLXzIpCisJCQlzZXNzLT5tYXN0ZXJfa2V5W2NsZWFyXSsrOworI2VuZGlmCisJCXMybihlbmMscCk7CisJCWQrPWVuYzsKKwkJa2FyZz1zZXNzLT5rZXlfYXJnX2xlbmd0aDsJCisJCXMybihrYXJnLHApOyAvKiBrZXkgYXJnIHNpemUgKi8KKwkJaWYgKGthcmcgPiAoaW50KXNpemVvZihzZXNzLT5rZXlfYXJnKSkKKwkJCXsKKwkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQkJU1NMZXJyKFNTTF9GX0NMSUVOVF9NQVNURVJfS0VZLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCW1lbWNweShkLHNlc3MtPmtleV9hcmcsKHVuc2lnbmVkIGludClrYXJnKTsKKwkJZCs9a2FyZzsKKworCQlzLT5zdGF0ZT1TU0wyX1NUX1NFTkRfQ0xJRU5UX01BU1RFUl9LRVlfQjsKKwkJcy0+aW5pdF9udW09ZC1idWY7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKworCS8qIFNTTDJfU1RfU0VORF9DTElFTlRfTUFTVEVSX0tFWV9CICovCisJcmV0dXJuKHNzbDJfZG9fd3JpdGUocykpOworCX0KKworc3RhdGljIGludCBjbGllbnRfZmluaXNoZWQoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfU0VORF9DTElFTlRfRklOSVNIRURfQSkKKwkJeworCQlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCSoocCsrKT1TU0wyX01UX0NMSUVOVF9GSU5JU0hFRDsKKwkJaWYgKHMtPnMyLT5jb25uX2lkX2xlbmd0aCA+IHNpemVvZiBzLT5zMi0+Y29ubl9pZCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9DTElFTlRfRklOSVNIRUQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJbWVtY3B5KHAscy0+czItPmNvbm5faWQsKHVuc2lnbmVkIGludClzLT5zMi0+Y29ubl9pZF9sZW5ndGgpOworCisJCXMtPnN0YXRlPVNTTDJfU1RfU0VORF9DTElFTlRfRklOSVNIRURfQjsKKwkJcy0+aW5pdF9udW09cy0+czItPmNvbm5faWRfbGVuZ3RoKzE7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKwlyZXR1cm4oc3NsMl9kb193cml0ZShzKSk7CisJfQorCisvKiByZWFkIHRoZSBkYXRhIGFuZCB0aGVuIHJlc3BvbmQgKi8KK3N0YXRpYyBpbnQgY2xpZW50X2NlcnRpZmljYXRlKFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnAsKmQ7CisJaW50IGk7CisJdW5zaWduZWQgaW50IG47CisJaW50IGNlcnRfY2hfbGVuOworCXVuc2lnbmVkIGNoYXIgKmNlcnRfY2g7CisKKwlidWY9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKworCS8qIFdlIGhhdmUgYSBjZXJ0IGFzc29jaWF0ZWQgd2l0aCB0aGUgU1NMLCBzbyBhdHRhY2ggaXQgdG8KKwkgKiB0aGUgc2Vzc2lvbiBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZSAqLworCisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfU0VORF9DTElFTlRfQ0VSVElGSUNBVEVfQSkKKwkJeworCQlpPXNzbDJfcmVhZChzLChjaGFyICopJihidWZbcy0+aW5pdF9udW1dKSwKKwkJCVNTTDJfTUFYX0NFUlRfQ0hBTExFTkdFX0xFTkdUSCsyLXMtPmluaXRfbnVtKTsKKwkJaWYgKGk8KFNTTDJfTUlOX0NFUlRfQ0hBTExFTkdFX0xFTkdUSCsyLXMtPmluaXRfbnVtKSkKKwkJCXJldHVybihzc2wyX3BhcnRfcmVhZChzLFNTTF9GX0NMSUVOVF9DRVJUSUZJQ0FURSxpKSk7CisJCXMtPmluaXRfbnVtICs9IGk7CisJCWlmIChzLT5tc2dfY2FsbGJhY2spCisJCQlzLT5tc2dfY2FsbGJhY2soMCwgcy0+dmVyc2lvbiwgMCwgYnVmLCAoc2l6ZV90KXMtPmluaXRfbnVtLCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsgLyogUkVRVUVTVC1DRVJUSUZJQ0FURSAqLworCisJCS8qIHR5cGU9YnVmWzBdOyAqLworCQkvKiB0eXBlIGVxIHg1MDkgKi8KKwkJaWYgKGJ1ZlsxXSAhPSBTU0wyX0FUX01ENV9XSVRIX1JTQV9FTkNSWVBUSU9OKQorCQkJeworCQkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFX1RZUEUpOworCQkJU1NMZXJyKFNTTF9GX0NMSUVOVF9DRVJUSUZJQ0FURSxTU0xfUl9CQURfQVVUSEVOVElDQVRJT05fVFlQRSk7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCisJCWlmICgocy0+Y2VydCA9PSBOVUxMKSB8fAorCQkJKHMtPmNlcnQtPmtleS0+eDUwOSA9PSBOVUxMKSB8fAorCQkJKHMtPmNlcnQtPmtleS0+cHJpdmF0ZWtleSA9PSBOVUxMKSkKKwkJCXsKKwkJCXMtPnN0YXRlPVNTTDJfU1RfWDUwOV9HRVRfQ0xJRU5UX0NFUlRJRklDQVRFOworCQkJfQorCQllbHNlCisJCQlzLT5zdGF0ZT1TU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0M7CisJCX0KKworCWNlcnRfY2ggPSBidWYgKyAyOworCWNlcnRfY2hfbGVuID0gcy0+aW5pdF9udW0gLSAyOworCisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfWDUwOV9HRVRfQ0xJRU5UX0NFUlRJRklDQVRFKQorCQl7CisJCVg1MDkgKng1MDk9TlVMTDsKKwkJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKworCQkvKiBJZiB3ZSBnZXQgYW4gZXJyb3Igd2UgbmVlZCB0bworCQkgKiBzc2wtPnJ3c3RhdGU9U1NMX1g1MDlfTE9PS1VQOworCQkgKiByZXR1cm4oZXJyb3IpOworCQkgKiBXZSBzaG91bGQgdGhlbiBiZSByZXRyaWVkIHdoZW4gdGhpbmdzIGFyZSBvayBhbmQgd2UKKwkJICogY2FuIGdldCBhIGNlcnQgb3Igbm90ICovCisKKwkJaT0wOworCQlpZiAocy0+Y3R4LT5jbGllbnRfY2VydF9jYiAhPSBOVUxMKQorCQkJeworCQkJaT1zLT5jdHgtPmNsaWVudF9jZXJ0X2NiKHMsJih4NTA5KSwmKHBrZXkpKTsKKwkJCX0KKworCQlpZiAoaSA8IDApCisJCQl7CisJCQlzLT5yd3N0YXRlPVNTTF9YNTA5X0xPT0tVUDsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisKKwkJaWYgKChpID09IDEpICYmIChwa2V5ICE9IE5VTEwpICYmICh4NTA5ICE9IE5VTEwpKQorCQkJeworCQkJcy0+c3RhdGU9U1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9DOworCQkJaWYgKAkhU1NMX3VzZV9jZXJ0aWZpY2F0ZShzLHg1MDkpIHx8IAorCQkJCSFTU0xfdXNlX1ByaXZhdGVLZXkocyxwa2V5KSkKKwkJCQl7CisJCQkJaT0wOworCQkJCX0KKwkJCVg1MDlfZnJlZSh4NTA5KTsKKwkJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCQl9CisJCWVsc2UgaWYgKGkgPT0gMSkKKwkJCXsKKwkJCWlmICh4NTA5ICE9IE5VTEwpIFg1MDlfZnJlZSh4NTA5KTsKKwkJCWlmIChwa2V5ICE9IE5VTEwpIEVWUF9QS0VZX2ZyZWUocGtleSk7CisJCQlTU0xlcnIoU1NMX0ZfQ0xJRU5UX0NFUlRJRklDQVRFLFNTTF9SX0JBRF9EQVRBX1JFVFVSTkVEX0JZX0NBTExCQUNLKTsKKwkJCWk9MDsKKwkJCX0KKworCQlpZiAoaSA9PSAwKQorCQkJeworCQkJLyogV2UgaGF2ZSBubyBjbGllbnQgY2VydGlmaWNhdGUgdG8gcmVzcG9uZCB3aXRoCisJCQkgKiBzbyBzZW5kIHRoZSBjb3JyZWN0IGVycm9yIG1lc3NhZ2UgYmFjayAqLworCQkJcy0+c3RhdGU9U1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9COworCQkJcD1idWY7CisJCQkqKHArKyk9U1NMMl9NVF9FUlJPUjsKKwkJCXMybihTU0wyX1BFX05PX0NFUlRJRklDQVRFLHApOworCQkJcy0+aW5pdF9vZmY9MDsKKwkJCXMtPmluaXRfbnVtPTM7CisJCQkvKiBXcml0ZSBpcyBkb25lIGF0IHRoZSBlbmQgKi8KKwkJCX0KKwkJfQorCisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfU0VORF9DTElFTlRfQ0VSVElGSUNBVEVfQikKKwkJeworCQlyZXR1cm4oc3NsMl9kb193cml0ZShzKSk7CisJCX0KKworCWlmIChzLT5zdGF0ZSA9PSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0MpCisJCXsKKwkJRVZQX01EX0NUWCBjdHg7CisKKwkJLyogb2ssIG5vdyB3ZSBjYWxjdWxhdGUgdGhlIGNoZWNrc3VtCisJCSAqIGRvIGl0IGZpcnN0IHNvIHdlIGNhbiByZXVzZSBidWYgOi0pICovCisJCXA9YnVmOworCQlFVlBfTURfQ1RYX2luaXQoJmN0eCk7CisJCUVWUF9TaWduSW5pdF9leCgmY3R4LHMtPmN0eC0+cnNhX21kNSwgTlVMTCk7CisJCUVWUF9TaWduVXBkYXRlKCZjdHgscy0+czItPmtleV9tYXRlcmlhbCwKKwkJCSAgICAgICBzLT5zMi0+a2V5X21hdGVyaWFsX2xlbmd0aCk7CisJCUVWUF9TaWduVXBkYXRlKCZjdHgsY2VydF9jaCwodW5zaWduZWQgaW50KWNlcnRfY2hfbGVuKTsKKwkJaT1pMmRfWDUwOShzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfa2V5LT54NTA5LCZwKTsKKwkJLyogRG9uJ3QgdXBkYXRlIHRoZSBzaWduYXR1cmUgaWYgaXQgZmFpbHMgLSBGSVhNRTogcHJvYmFibHkgc2hvdWxkIGhhbmRsZSB0aGlzIGJldHRlciAqLworCQlpZihpID4gMCkKKwkJCUVWUF9TaWduVXBkYXRlKCZjdHgsYnVmLCh1bnNpZ25lZCBpbnQpaSk7CisKKwkJcD1idWY7CisJCWQ9cCs2OworCQkqKHArKyk9U1NMMl9NVF9DTElFTlRfQ0VSVElGSUNBVEU7CisJCSoocCsrKT1TU0wyX0NUX1g1MDlfQ0VSVElGSUNBVEU7CisJCW49aTJkX1g1MDkocy0+Y2VydC0+a2V5LT54NTA5LCZkKTsKKwkJczJuKG4scCk7CisKKwkJaWYgKCFFVlBfU2lnbkZpbmFsKCZjdHgsZCwmbixzLT5jZXJ0LT5rZXktPnByaXZhdGVrZXkpKQorCQkJeworCQkJLyogdGhpcyBpcyBub3QgZ29vZC4gIElmIHRoaW5ncyBoYXZlIGZhaWxlZCBpdAorCQkJICogbWVhbnMgdGhlcmUgc28gc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGtleS4KKwkJCSAqIFdlIHdpbGwgY29udGludWUgd2l0aCBhIDAgbGVuZ3RoIHNpZ25hdHVyZQorCQkJICovCisJCQl9CisJCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKwkJczJuKG4scCk7CisJCWQrPW47CisKKwkJcy0+c3RhdGU9U1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9EOworCQlzLT5pbml0X251bT1kLWJ1ZjsKKwkJcy0+aW5pdF9vZmY9MDsKKwkJfQorCS8qIGlmIChzLT5zdGF0ZSA9PSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0QpICovCisJcmV0dXJuKHNzbDJfZG9fd3JpdGUocykpOworCX0KKworc3RhdGljIGludCBnZXRfc2VydmVyX3ZlcmlmeShTU0wgKnMpCisJeworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGksIG4sIGxlbjsKKworCXA9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKwlpZiAocy0+c3RhdGUgPT0gU1NMMl9TVF9HRVRfU0VSVkVSX1ZFUklGWV9BKQorCQl7CisJCWk9c3NsMl9yZWFkKHMsKGNoYXIgKikmKHBbcy0+aW5pdF9udW1dKSwxLXMtPmluaXRfbnVtKTsKKwkJaWYgKGkgPCAoMS1zLT5pbml0X251bSkpIAorCQkJcmV0dXJuKHNzbDJfcGFydF9yZWFkKHMsU1NMX0ZfR0VUX1NFUlZFUl9WRVJJRlksaSkpOworCQlzLT5pbml0X251bSArPSBpOworCisJCXMtPnN0YXRlPSBTU0wyX1NUX0dFVF9TRVJWRVJfVkVSSUZZX0I7CisJCWlmICgqcCAhPSBTU0wyX01UX1NFUlZFUl9WRVJJRlkpCisJCQl7CisJCQlpZiAocFswXSAhPSBTU0wyX01UX0VSUk9SKQorCQkJCXsKKwkJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCQlTU0xlcnIoU1NMX0ZfR0VUX1NFUlZFUl9WRVJJRlksCisJCQkJCVNTTF9SX1JFQURfV1JPTkdfUEFDS0VUX1RZUEUpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0dFVF9TRVJWRVJfVkVSSUZZLFNTTF9SX1BFRVJfRVJST1IpOworCQkJCS8qIHRyeSB0byByZWFkIHRoZSBlcnJvciBtZXNzYWdlICovCisJCQkJaT1zc2wyX3JlYWQocywoY2hhciAqKSYocFtzLT5pbml0X251bV0pLDMtcy0+aW5pdF9udW0pOworCQkJCXJldHVybiBzc2wyX3BhcnRfcmVhZChzLFNTTF9GX0dFVF9TRVJWRVJfVkVSSUZZLGkpOworCQkJCX0KKwkJCXJldHVybigtMSk7CisJCQl9CisJCX0KKwkKKwlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJbGVuID0gMSArIHMtPnMyLT5jaGFsbGVuZ2VfbGVuZ3RoOworCW4gPSAgbGVuIC0gcy0+aW5pdF9udW07CisJaSA9IHNzbDJfcmVhZChzLChjaGFyICopJihwW3MtPmluaXRfbnVtXSksbik7CisJaWYgKGkgPCBuKQorCQlyZXR1cm4oc3NsMl9wYXJ0X3JlYWQocyxTU0xfRl9HRVRfU0VSVkVSX1ZFUklGWSxpKSk7CisJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIDAsIHAsIGxlbiwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7IC8qIFNFUlZFUi1WRVJJRlkgKi8KKwlwICs9IDE7CisKKwlpZiAobWVtY21wKHAscy0+czItPmNoYWxsZW5nZSxzLT5zMi0+Y2hhbGxlbmdlX2xlbmd0aCkgIT0gMCkKKwkJeworCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJU1NMZXJyKFNTTF9GX0dFVF9TRVJWRVJfVkVSSUZZLFNTTF9SX0NIQUxMRU5HRV9JU19ESUZGRVJFTlQpOworCQlyZXR1cm4oLTEpOworCQl9CisJcmV0dXJuKDEpOworCX0KKworc3RhdGljIGludCBnZXRfc2VydmVyX2ZpbmlzaGVkKFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGksIG4sIGxlbjsKKworCWJ1Zj0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCXA9YnVmOworCWlmIChzLT5zdGF0ZSA9PSBTU0wyX1NUX0dFVF9TRVJWRVJfRklOSVNIRURfQSkKKwkJeworCQlpPXNzbDJfcmVhZChzLChjaGFyICopJihidWZbcy0+aW5pdF9udW1dKSwxLXMtPmluaXRfbnVtKTsKKwkJaWYgKGkgPCAoMS1zLT5pbml0X251bSkpCisJCQlyZXR1cm4oc3NsMl9wYXJ0X3JlYWQocyxTU0xfRl9HRVRfU0VSVkVSX0ZJTklTSEVELGkpKTsKKwkJcy0+aW5pdF9udW0gKz0gaTsKKworCQlpZiAoKnAgPT0gU1NMMl9NVF9SRVFVRVNUX0NFUlRJRklDQVRFKQorCQkJeworCQkJcy0+c3RhdGU9U1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9BOworCQkJcmV0dXJuKDEpOworCQkJfQorCQllbHNlIGlmICgqcCAhPSBTU0wyX01UX1NFUlZFUl9GSU5JU0hFRCkKKwkJCXsKKwkJCWlmIChwWzBdICE9IFNTTDJfTVRfRVJST1IpCisJCQkJeworCQkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQkJCVNTTGVycihTU0xfRl9HRVRfU0VSVkVSX0ZJTklTSEVELFNTTF9SX1JFQURfV1JPTkdfUEFDS0VUX1RZUEUpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX0dFVF9TRVJWRVJfRklOSVNIRUQsU1NMX1JfUEVFUl9FUlJPUik7CisJCQkJLyogdHJ5IHRvIHJlYWQgdGhlIGVycm9yIG1lc3NhZ2UgKi8KKwkJCQlpPXNzbDJfcmVhZChzLChjaGFyICopJihwW3MtPmluaXRfbnVtXSksMy1zLT5pbml0X251bSk7CisJCQkJcmV0dXJuIHNzbDJfcGFydF9yZWFkKHMsU1NMX0ZfR0VUX1NFUlZFUl9WRVJJRlksaSk7CisJCQkJfQorCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJcy0+c3RhdGU9U1NMMl9TVF9HRVRfU0VSVkVSX0ZJTklTSEVEX0I7CisJCX0KKworCWxlbiA9IDEgKyBTU0wyX1NTTF9TRVNTSU9OX0lEX0xFTkdUSDsKKwluID0gbGVuIC0gcy0+aW5pdF9udW07CisJaSA9IHNzbDJfcmVhZChzLChjaGFyICopJihidWZbcy0+aW5pdF9udW1dKSwgbik7CisJaWYgKGkgPCBuKSAvKiBYWFggY291bGQgYmUgc2hvcnRlciB0aGFuIFNTTDJfU1NMX1NFU1NJT05fSURfTEVOR1RILCB0aGF0J3MgdGhlIG1heGltdW0gKi8KKwkJcmV0dXJuKHNzbDJfcGFydF9yZWFkKHMsU1NMX0ZfR0VUX1NFUlZFUl9GSU5JU0hFRCxpKSk7CisJcy0+aW5pdF9udW0gKz0gaTsKKwlpZiAocy0+bXNnX2NhbGxiYWNrKQorCQlzLT5tc2dfY2FsbGJhY2soMCwgcy0+dmVyc2lvbiwgMCwgYnVmLCAoc2l6ZV90KXMtPmluaXRfbnVtLCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsgLyogU0VSVkVSLUZJTklTSEVEICovCisKKwlpZiAoIXMtPmhpdCkgLyogbmV3IHNlc3Npb24gKi8KKwkJeworCQkvKiBuZXcgc2Vzc2lvbi1pZCAqLworCQkvKiBNYWtlIHN1cmUgd2Ugd2VyZSBub3QgdHJ5aW5nIHRvIHJlLXVzZSBhbiBvbGQgU1NMX1NFU1NJT04KKwkJICogb3IgYmFkIHRoaW5ncyBjYW4gaGFwcGVuICovCisJCS8qIFpaWlpaWlpaWlpaWlogKi8KKwkJcy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGg9U1NMMl9TU0xfU0VTU0lPTl9JRF9MRU5HVEg7CisJCW1lbWNweShzLT5zZXNzaW9uLT5zZXNzaW9uX2lkLHArMSxTU0wyX1NTTF9TRVNTSU9OX0lEX0xFTkdUSCk7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKCEocy0+b3B0aW9ucyAmIFNTTF9PUF9NSUNST1NPRlRfU0VTU19JRF9CVUcpKQorCQkJeworCQkJaWYgKChzLT5zZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aCA+IHNpemVvZiBzLT5zZXNzaW9uLT5zZXNzaW9uX2lkKQorCQkJICAgIHx8ICgwICE9IG1lbWNtcChidWYgKyAxLCBzLT5zZXNzaW9uLT5zZXNzaW9uX2lkLAorCQkJICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoKSkpCisJCQkJeworCQkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQkJCVNTTGVycihTU0xfRl9HRVRfU0VSVkVSX0ZJTklTSEVELFNTTF9SX1NTTF9TRVNTSU9OX0lEX0lTX0RJRkZFUkVOVCk7CisJCQkJcmV0dXJuKC0xKTsKKwkJCQl9CisJCQl9CisJCX0KKwlzLT5zdGF0ZSA9IFNTTF9TVF9PSzsKKwlyZXR1cm4oMSk7CisJfQorCisvKiBsb2FkcyBpbiB0aGUgY2VydGlmaWNhdGUgZnJvbSB0aGUgc2VydmVyICovCitpbnQgc3NsMl9zZXRfY2VydGlmaWNhdGUoU1NMICpzLCBpbnQgdHlwZSwgaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKKwl7CisJU1RBQ0tfT0YoWDUwOSkgKnNrPU5VTEw7CisJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKwlTRVNTX0NFUlQgKnNjPU5VTEw7CisJaW50IGk7CisJWDUwOSAqeDUwOT1OVUxMOworCWludCByZXQ9MDsKKwkKKwl4NTA5PWQyaV9YNTA5KE5VTEwsJmRhdGEsKGxvbmcpbGVuKTsKKwlpZiAoeDUwOSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wyX1NFVF9DRVJUSUZJQ0FURSxFUlJfUl9YNTA5X0xJQik7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAoKHNrPXNrX1g1MDlfbmV3X251bGwoKSkgPT0gTlVMTCB8fCAhc2tfWDUwOV9wdXNoKHNrLHg1MDkpKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wyX1NFVF9DRVJUSUZJQ0FURSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwlpPXNzbF92ZXJpZnlfY2VydF9jaGFpbihzLHNrKTsKKwkJCisJaWYgKChzLT52ZXJpZnlfbW9kZSAhPSBTU0xfVkVSSUZZX05PTkUpICYmIChpIDw9IDApKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wyX1NFVF9DRVJUSUZJQ0FURSxTU0xfUl9DRVJUSUZJQ0FURV9WRVJJRllfRkFJTEVEKTsKKwkJZ290byBlcnI7CisJCX0KKwlFUlJfY2xlYXJfZXJyb3IoKTsgLyogYnV0IHdlIGtlZXAgcy0+dmVyaWZ5X3Jlc3VsdCAqLworCXMtPnNlc3Npb24tPnZlcmlmeV9yZXN1bHQgPSBzLT52ZXJpZnlfcmVzdWx0OworCisJLyogc2VydmVyJ3MgY2VydCBmb3IgdGhpcyBzZXNzaW9uICovCisJc2M9c3NsX3Nlc3NfY2VydF9uZXcoKTsKKwlpZiAoc2MgPT0gTlVMTCkKKwkJeworCQlyZXQ9IC0xOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQpIHNzbF9zZXNzX2NlcnRfZnJlZShzLT5zZXNzaW9uLT5zZXNzX2NlcnQpOworCXMtPnNlc3Npb24tPnNlc3NfY2VydD1zYzsKKworCXNjLT5wZWVyX3BrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLng1MDk9eDUwOTsKKwlzYy0+cGVlcl9rZXk9ICYoc2MtPnBlZXJfcGtleXNbU1NMX1BLRVlfUlNBX0VOQ10pOworCisJcGtleT1YNTA5X2dldF9wdWJrZXkoeDUwOSk7CisJeDUwOT1OVUxMOworCWlmIChwa2V5ID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDJfU0VUX0NFUlRJRklDQVRFLFNTTF9SX1VOQUJMRV9UT19FWFRSQUNUX1BVQkxJQ19LRVkpOworCQlnb3RvIGVycjsKKwkJfQorCWlmIChwa2V5LT50eXBlICE9IEVWUF9QS0VZX1JTQSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMMl9TRVRfQ0VSVElGSUNBVEUsU1NMX1JfUFVCTElDX0tFWV9OT1RfUlNBKTsKKwkJZ290byBlcnI7CisJCX0KKworCWlmICghc3NsX3NldF9wZWVyX2NlcnRfdHlwZShzYyxTU0wyX0NUX1g1MDlfQ0VSVElGSUNBVEUpKQorCQlnb3RvIGVycjsKKwlyZXQ9MTsKK2VycjoKKwlza19YNTA5X2ZyZWUoc2spOworCVg1MDlfZnJlZSh4NTA5KTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBzc2xfcnNhX3B1YmxpY19lbmNyeXB0KFNFU1NfQ0VSVCAqc2MsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKmZyb20sCisJICAgICB1bnNpZ25lZCBjaGFyICp0bywgaW50IHBhZGRpbmcpCisJeworCUVWUF9QS0VZICpwa2V5PU5VTEw7CisJaW50IGk9IC0xOworCisJaWYgKChzYyA9PSBOVUxMKSB8fCAoc2MtPnBlZXJfa2V5LT54NTA5ID09IE5VTEwpIHx8CisJCSgocGtleT1YNTA5X2dldF9wdWJrZXkoc2MtPnBlZXJfa2V5LT54NTA5KSkgPT0gTlVMTCkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9SU0FfUFVCTElDX0VOQ1JZUFQsU1NMX1JfTk9fUFVCTElDS0VZKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCWlmIChwa2V5LT50eXBlICE9IEVWUF9QS0VZX1JTQSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1JTQV9QVUJMSUNfRU5DUllQVCxTU0xfUl9QVUJMSUNfS0VZX0lTX05PVF9SU0EpOworCQlnb3RvIGVuZDsKKwkJfQorCisJLyogd2UgaGF2ZSB0aGUgcHVibGljIGtleSAqLworCWk9UlNBX3B1YmxpY19lbmNyeXB0KGxlbixmcm9tLHRvLHBrZXktPnBrZXkucnNhLHBhZGRpbmcpOworCWlmIChpIDwgMCkKKwkJU1NMZXJyKFNTTF9GX1NTTF9SU0FfUFVCTElDX0VOQ1JZUFQsRVJSX1JfUlNBX0xJQik7CitlbmQ6CisJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlyZXR1cm4oaSk7CisJfQorI2Vsc2UgLyogIU9QRU5TU0xfTk9fU1NMMiAqLworCisjIGlmIFBFREFOVElDCitzdGF0aWMgdm9pZCAqZHVtbXk9JmR1bW15OworIyBlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zMl9lbmMuYyBiL2xpYi9vcGVuc3NsL3NzbC9zMl9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjMzOTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3MyX2VuYy5jCkBAIC0wLDAgKzEsMTkzIEBACisvKiBzc2wvczJfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgInNzbF9sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBzc2wyX2VuY19pbml0KFNTTCAqcywgaW50IGNsaWVudCkKKwl7CisJLyogTWF4IG51bWJlciBvZiBieXRlcyBuZWVkZWQgKi8KKwlFVlBfQ0lQSEVSX0NUWCAqcnMsKndzOworCWNvbnN0IEVWUF9DSVBIRVIgKmM7CisJY29uc3QgRVZQX01EICptZDsKKwlpbnQgbnVtOworCisJaWYgKCFzc2xfY2lwaGVyX2dldF9ldnAocy0+c2Vzc2lvbiwmYywmbWQsTlVMTCxOVUxMLE5VTEwpKQorCQl7CisJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9OT19DSVBIRVIpOworCQlTU0xlcnIoU1NMX0ZfU1NMMl9FTkNfSU5JVCxTU0xfUl9QUk9CTEVNU19NQVBQSU5HX0NJUEhFUl9GVU5DVElPTlMpOworCQlyZXR1cm4oMCk7CisJCX0KKwlzc2xfcmVwbGFjZV9oYXNoKCZzLT5yZWFkX2hhc2gsbWQpOworCXNzbF9yZXBsYWNlX2hhc2goJnMtPndyaXRlX2hhc2gsbWQpOworCisJaWYgKChzLT5lbmNfcmVhZF9jdHggPT0gTlVMTCkgJiYKKwkJKChzLT5lbmNfcmVhZF9jdHg9KEVWUF9DSVBIRVJfQ1RYICopCisJCU9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfQ0lQSEVSX0NUWCkpKSA9PSBOVUxMKSkKKwkJZ290byBlcnI7CisKKwkvKiBtYWtlIHN1cmUgaXQncyBpbnRpYWxpemVkIGluIGNhc2UgdGhlIG1hbGxvYyBmb3IgZW5jX3dyaXRlX2N0eCBmYWlscworCSAqIGFuZCB3ZSBleGl0IHdpdGggYW4gZXJyb3IgKi8KKwlycz0gcy0+ZW5jX3JlYWRfY3R4OworCUVWUF9DSVBIRVJfQ1RYX2luaXQocnMpOworCisJaWYgKChzLT5lbmNfd3JpdGVfY3R4ID09IE5VTEwpICYmCisJCSgocy0+ZW5jX3dyaXRlX2N0eD0oRVZQX0NJUEhFUl9DVFggKikKKwkJT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVWUF9DSVBIRVJfQ1RYKSkpID09IE5VTEwpKQorCQlnb3RvIGVycjsKKworCXdzPSBzLT5lbmNfd3JpdGVfY3R4OworCUVWUF9DSVBIRVJfQ1RYX2luaXQod3MpOworCisJbnVtPWMtPmtleV9sZW47CisJcy0+czItPmtleV9tYXRlcmlhbF9sZW5ndGg9bnVtKjI7CisJT1BFTlNTTF9hc3NlcnQocy0+czItPmtleV9tYXRlcmlhbF9sZW5ndGggPD0gc2l6ZW9mIHMtPnMyLT5rZXlfbWF0ZXJpYWwpOworCisJaWYgKHNzbDJfZ2VuZXJhdGVfa2V5X21hdGVyaWFsKHMpIDw9IDApCisJCXJldHVybiAwOworCisJT1BFTlNTTF9hc3NlcnQoYy0+aXZfbGVuIDw9IChpbnQpc2l6ZW9mKHMtPnNlc3Npb24tPmtleV9hcmcpKTsKKwlFVlBfRW5jcnlwdEluaXRfZXgod3MsYyxOVUxMLCYocy0+czItPmtleV9tYXRlcmlhbFsoY2xpZW50KT9udW06MF0pLAorCQlzLT5zZXNzaW9uLT5rZXlfYXJnKTsKKwlFVlBfRGVjcnlwdEluaXRfZXgocnMsYyxOVUxMLCYocy0+czItPmtleV9tYXRlcmlhbFsoY2xpZW50KT8wOm51bV0pLAorCQlzLT5zZXNzaW9uLT5rZXlfYXJnKTsKKwlzLT5zMi0+cmVhZF9rZXk9ICAmKHMtPnMyLT5rZXlfbWF0ZXJpYWxbKGNsaWVudCk/MDpudW1dKTsKKwlzLT5zMi0+d3JpdGVfa2V5PSAmKHMtPnMyLT5rZXlfbWF0ZXJpYWxbKGNsaWVudCk/bnVtOjBdKTsKKwlyZXR1cm4oMSk7CitlcnI6CisJU1NMZXJyKFNTTF9GX1NTTDJfRU5DX0lOSVQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCXJldHVybigwKTsKKwl9CisKKy8qIHJlYWQvd3JpdGVzIGZyb20gcy0+czItPm1hY19kYXRhIHVzaW5nIGxlbmd0aCBmb3IgZW5jcnlwdCBhbmQgCisgKiBkZWNyeXB0LiAgSXQgc2V0cyBzLT5zMi0+cGFkZGluZyBhbmQgcy0+W3J3XWxlbmd0aAorICogaWYgd2UgYXJlIGVuY3J5cHRpbmcgKi8KK3ZvaWQgc3NsMl9lbmMoU1NMICpzLCBpbnQgc2VuZCkKKwl7CisJRVZQX0NJUEhFUl9DVFggKmRzOworCXVuc2lnbmVkIGxvbmcgbDsKKwlpbnQgYnM7CisKKwlpZiAoc2VuZCkKKwkJeworCQlkcz1zLT5lbmNfd3JpdGVfY3R4OworCQlsPXMtPnMyLT53bGVuZ3RoOworCQl9CisJZWxzZQorCQl7CisJCWRzPXMtPmVuY19yZWFkX2N0eDsKKwkJbD1zLT5zMi0+cmxlbmd0aDsKKwkJfQorCisJLyogY2hlY2sgZm9yIE5VTEwgY2lwaGVyICovCisJaWYgKGRzID09IE5VTEwpIHJldHVybjsKKworCisJYnM9ZHMtPmNpcGhlci0+YmxvY2tfc2l6ZTsKKwkvKiBUaGlzIHNob3VsZCBiZSB1c2luZyAoYnMtMSkgYW5kIGJzIGluc3RlYWQgb2YgNyBhbmQgOCwgYnV0CisJICogd2hhdCB0aGUgaGVsbC4gKi8KKwlpZiAoYnMgPT0gOCkKKwkJbD0obCs3KS84Kjg7CisKKwlFVlBfQ2lwaGVyKGRzLHMtPnMyLT5tYWNfZGF0YSxzLT5zMi0+bWFjX2RhdGEsbCk7CisJfQorCit2b2lkIHNzbDJfbWFjKFNTTCAqcywgdW5zaWduZWQgY2hhciAqbWQsIGludCBzZW5kKQorCXsKKwlFVlBfTURfQ1RYIGM7CisJdW5zaWduZWQgY2hhciBzZXF1ZW5jZVs0XSwqcCwqc2VjLCphY3Q7CisJdW5zaWduZWQgbG9uZyBzZXE7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWlmIChzZW5kKQorCQl7CisJCXNlcT1zLT5zMi0+d3JpdGVfc2VxdWVuY2U7CisJCXNlYz1zLT5zMi0+d3JpdGVfa2V5OworCQlsZW49cy0+czItPndhY3RfZGF0YV9sZW5ndGg7CisJCWFjdD1zLT5zMi0+d2FjdF9kYXRhOworCQl9CisJZWxzZQorCQl7CisJCXNlcT1zLT5zMi0+cmVhZF9zZXF1ZW5jZTsKKwkJc2VjPXMtPnMyLT5yZWFkX2tleTsKKwkJbGVuPXMtPnMyLT5yYWN0X2RhdGFfbGVuZ3RoOworCQlhY3Q9cy0+czItPnJhY3RfZGF0YTsKKwkJfQorCisJcD0gJihzZXF1ZW5jZVswXSk7CisJbDJuKHNlcSxwKTsKKworCS8qIFRoZXJlIGhhcyB0byBiZSBhIE1BQyBhbGdvcml0aG0uICovCisJRVZQX01EX0NUWF9pbml0KCZjKTsKKwlFVlBfTURfQ1RYX2NvcHkoJmMsIHMtPnJlYWRfaGFzaCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmYyxzZWMsCisJCUVWUF9DSVBIRVJfQ1RYX2tleV9sZW5ndGgocy0+ZW5jX3JlYWRfY3R4KSk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmYyxhY3QsbGVuKTsgCisJLyogdGhlIGFib3ZlIGxpbmUgYWxzbyBkb2VzIHRoZSBwYWQgZGF0YSAqLworCUVWUF9EaWdlc3RVcGRhdGUoJmMsc2VxdWVuY2UsNCk7IAorCUVWUF9EaWdlc3RGaW5hbF9leCgmYyxtZCxOVUxMKTsKKwlFVlBfTURfQ1RYX2NsZWFudXAoJmMpOworCX0KKyNlbHNlIC8qICFPUEVOU1NMX05PX1NTTDIgKi8KKworIyBpZiBQRURBTlRJQworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyMgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvczJfbGliLmMgYi9saWIvb3BlbnNzbC9zc2wvczJfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxNDYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zMl9saWIuYwpAQCAtMCwwICsxLDU1NiBAQAorLyogc3NsL3MyX2xpYi5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNzbF9sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorCitjb25zdCBjaGFyIHNzbDJfdmVyc2lvbl9zdHJbXT0iU1NMdjIiIE9QRU5TU0xfVkVSU0lPTl9QVEVYVDsKKworI2RlZmluZSBTU0wyX05VTV9DSVBIRVJTIChzaXplb2Yoc3NsMl9jaXBoZXJzKS9zaXplb2YoU1NMX0NJUEhFUikpCisKKy8qIGxpc3Qgb2YgYXZhaWxhYmxlIFNTTHYyIGNpcGhlcnMgKHNvcnRlZCBieSBpZCkgKi8KK09QRU5TU0xfR0xPQkFMIGNvbnN0IFNTTF9DSVBIRVIgc3NsMl9jaXBoZXJzW109eworI2lmIDAKKy8qIE5VTExfV0lUSF9NRDUgdjMgKi8KKwl7CisJMSwKKwlTU0wyX1RYVF9OVUxMX1dJVEhfTUQ1LAorCVNTTDJfQ0tfTlVMTF9XSVRIX01ENSwKKwlTU0xfa1JTQSwKKwlTU0xfYVJTQSwKKwlTU0xfZU5VTEwsCisJU1NMX01ENSwKKwlTU0xfU1NMVjIsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDB8U1NMX1NUUk9OR19OT05FLAorCTAsCisJMCwKKwkwLAorCX0sCisjZW5kaWYKKworLyogUkM0XzEyOF9XSVRIX01ENSAqLworCXsKKwkxLAorCVNTTDJfVFhUX1JDNF8xMjhfV0lUSF9NRDUsCisJU1NMMl9DS19SQzRfMTI4X1dJVEhfTUQ1LAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9SQzQsCisJU1NMX01ENSwKKwlTU0xfU1NMVjIsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwkwLAorCTEyOCwKKwkxMjgsCisJfSwKKworLyogUkM0XzEyOF9FWFBPUlQ0MF9XSVRIX01ENSAqLworCXsKKwkxLAorCVNTTDJfVFhUX1JDNF8xMjhfRVhQT1JUNDBfV0lUSF9NRDUsCisJU1NMMl9DS19SQzRfMTI4X0VYUE9SVDQwX1dJVEhfTUQ1LAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9SQzQsCisJU1NMX01ENSwKKwlTU0xfU1NMVjIsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDAsCisJU1NMMl9DRl81X0JZVEVfRU5DLAorCTQwLAorCTEyOCwKKwl9LAorCisvKiBSQzJfMTI4X0NCQ19XSVRIX01ENSAqLworCXsKKwkxLAorCVNTTDJfVFhUX1JDMl8xMjhfQ0JDX1dJVEhfTUQ1LAorCVNTTDJfQ0tfUkMyXzEyOF9DQkNfV0lUSF9NRDUsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX1JDMiwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMiwKKwlTU0xfTk9UX0VYUHxTU0xfTUVESVVNLAorCTAsCisJMTI4LAorCTEyOCwKKwl9LAorCisvKiBSQzJfMTI4X0NCQ19FWFBPUlQ0MF9XSVRIX01ENSAqLworCXsKKwkxLAorCVNTTDJfVFhUX1JDMl8xMjhfQ0JDX0VYUE9SVDQwX1dJVEhfTUQ1LAorCVNTTDJfQ0tfUkMyXzEyOF9DQkNfRVhQT1JUNDBfV0lUSF9NRDUsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX1JDMiwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMiwKKwlTU0xfRVhQT1JUfFNTTF9FWFA0MCwKKwlTU0wyX0NGXzVfQllURV9FTkMsCisJNDAsCisJMTI4LAorCX0sCisKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisvKiBJREVBXzEyOF9DQkNfV0lUSF9NRDUgKi8KKwl7CisJMSwKKwlTU0wyX1RYVF9JREVBXzEyOF9DQkNfV0lUSF9NRDUsCisJU1NMMl9DS19JREVBXzEyOF9DQkNfV0lUSF9NRDUsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX0lERUEsCisJU1NMX01ENSwKKwlTU0xfU1NMVjIsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwkwLAorCTEyOCwKKwkxMjgsCisJfSwKKyNlbmRpZgorCisvKiBERVNfNjRfQ0JDX1dJVEhfTUQ1ICovCisJeworCTEsCisJU1NMMl9UWFRfREVTXzY0X0NCQ19XSVRIX01ENSwKKwlTU0wyX0NLX0RFU182NF9DQkNfV0lUSF9NRDUsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX0RFUywKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMiwKKwlTU0xfTk9UX0VYUHxTU0xfTE9XLAorCTAsCisJNTYsCisJNTYsCisJfSwKKworLyogREVTXzE5Ml9FREUzX0NCQ19XSVRIX01ENSAqLworCXsKKwkxLAorCVNTTDJfVFhUX0RFU18xOTJfRURFM19DQkNfV0lUSF9NRDUsCisJU1NMMl9DS19ERVNfMTkyX0VERTNfQ0JDX1dJVEhfTUQ1LAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF8zREVTLAorCVNTTF9NRDUsCisJU1NMX1NTTFYyLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCTAsCisJMTY4LAorCTE2OCwKKwl9LAorCisjaWYgMAorLyogUkM0XzY0X1dJVEhfTUQ1ICovCisJeworCTEsCisJU1NMMl9UWFRfUkM0XzY0X1dJVEhfTUQ1LAorCVNTTDJfQ0tfUkM0XzY0X1dJVEhfTUQ1LAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9SQzQsCisJU1NMX01ENSwKKwlTU0xfU1NMVjIsCisJU1NMX05PVF9FWFB8U1NMX0xPVywKKwlTU0wyX0NGXzhfQllURV9FTkMsCisJNjQsCisJNjQsCisJfSwKKyNlbmRpZgorCisjaWYgMAorLyogTlVMTCBTU0xlYXkgKHRlc3RpbmcpICovCisJewkKKwkwLAorCVNTTDJfVFhUX05VTEwsCisJU1NMMl9DS19OVUxMLAorCTAsCisJMCwKKwkwLAorCTAsCisJU1NMX1NTTFYyLAorCVNTTF9TVFJPTkdfTk9ORSwKKwkwLAorCTAsCisJMCwKKwl9LAorI2VuZGlmCisKKy8qIGVuZCBvZiBsaXN0IDotKSAqLworCX07CisKK2xvbmcgc3NsMl9kZWZhdWx0X3RpbWVvdXQodm9pZCkKKwl7CisJcmV0dXJuKDMwMCk7CisJfQorCitpbnQgc3NsMl9udW1fY2lwaGVycyh2b2lkKQorCXsKKwlyZXR1cm4oU1NMMl9OVU1fQ0lQSEVSUyk7CisJfQorCitjb25zdCBTU0xfQ0lQSEVSICpzc2wyX2dldF9jaXBoZXIodW5zaWduZWQgaW50IHUpCisJeworCWlmICh1IDwgU1NMMl9OVU1fQ0lQSEVSUykKKwkJcmV0dXJuKCYoc3NsMl9jaXBoZXJzW1NTTDJfTlVNX0NJUEhFUlMtMS11XSkpOworCWVsc2UKKwkJcmV0dXJuKE5VTEwpOworCX0KKworaW50IHNzbDJfcGVuZGluZyhjb25zdCBTU0wgKnMpCisJeworCXJldHVybiBTU0xfaW5faW5pdChzKSA/IDAgOiBzLT5zMi0+cmFjdF9kYXRhX2xlbmd0aDsKKwl9CisKK2ludCBzc2wyX25ldyhTU0wgKnMpCisJeworCVNTTDJfU1RBVEUgKnMyOworCisJaWYgKChzMj1PUEVOU1NMX21hbGxvYyhzaXplb2YgKnMyKSkgPT0gTlVMTCkgZ290byBlcnI7CisJbWVtc2V0KHMyLDAsc2l6ZW9mICpzMik7CisKKyNpZiBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIgKyAzID4gU1NMMl9NQVhfUkVDT1JEX0xFTkdUSF8yX0JZVEVfSEVBREVSICsgMgorIyAgZXJyb3IgImFzc2VydGlvbiBmYWlsZWQiCisjZW5kaWYKKworCWlmICgoczItPnJidWY9T1BFTlNTTF9tYWxsb2MoCisJCVNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfMl9CWVRFX0hFQURFUisyKSkgPT0gTlVMTCkgZ290byBlcnI7CisJLyogd2J1ZiBuZWVkcyBvbmUgYnl0ZSBtb3JlIGJlY2F1c2Ugd2hlbiB1c2luZyB0d28tYnl0ZSBoZWFkZXJzLAorCSAqIHdlIGxlYXZlIHRoZSBmaXJzdCBieXRlIHVudXNlZCBpbiBkb19zc2xfd3JpdGUgKHMyX3BrdC5jKSAqLworCWlmICgoczItPndidWY9T1BFTlNTTF9tYWxsb2MoCisJCVNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfMl9CWVRFX0hFQURFUiszKSkgPT0gTlVMTCkgZ290byBlcnI7CisJcy0+czI9czI7CisKKwlzc2wyX2NsZWFyKHMpOworCXJldHVybigxKTsKK2VycjoKKwlpZiAoczIgIT0gTlVMTCkKKwkJeworCQlpZiAoczItPndidWYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHMyLT53YnVmKTsKKwkJaWYgKHMyLT5yYnVmICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzMi0+cmJ1Zik7CisJCU9QRU5TU0xfZnJlZShzMik7CisJCX0KKwlyZXR1cm4oMCk7CisJfQorCit2b2lkIHNzbDJfZnJlZShTU0wgKnMpCisJeworCVNTTDJfU1RBVEUgKnMyOworCisJaWYocyA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlzMj1zLT5zMjsKKwlpZiAoczItPnJidWYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHMyLT5yYnVmKTsKKwlpZiAoczItPndidWYgIT0gTlVMTCkgT1BFTlNTTF9mcmVlKHMyLT53YnVmKTsKKwlPUEVOU1NMX2NsZWFuc2UoczIsc2l6ZW9mICpzMik7CisJT1BFTlNTTF9mcmVlKHMyKTsKKwlzLT5zMj1OVUxMOworCX0KKwordm9pZCBzc2wyX2NsZWFyKFNTTCAqcykKKwl7CisJU1NMMl9TVEFURSAqczI7CisJdW5zaWduZWQgY2hhciAqcmJ1Ziwqd2J1ZjsKKworCXMyPXMtPnMyOworCisJcmJ1Zj1zMi0+cmJ1ZjsKKwl3YnVmPXMyLT53YnVmOworCisJbWVtc2V0KHMyLDAsc2l6ZW9mICpzMik7CisKKwlzMi0+cmJ1Zj1yYnVmOworCXMyLT53YnVmPXdidWY7CisJczItPmNsZWFyX3RleHQ9MTsKKwlzLT5wYWNrZXQ9czItPnJidWY7CisJcy0+dmVyc2lvbj1TU0wyX1ZFUlNJT047CisJcy0+cGFja2V0X2xlbmd0aD0wOworCX0KKworbG9uZyBzc2wyX2N0cmwoU1NMICpzLCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpCisJeworCWludCByZXQ9MDsKKworCXN3aXRjaChjbWQpCisJCXsKKwljYXNlIFNTTF9DVFJMX0dFVF9TRVNTSU9OX1JFVVNFRDoKKwkJcmV0PXMtPmhpdDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK2xvbmcgc3NsMl9jYWxsYmFja19jdHJsKFNTTCAqcywgaW50IGNtZCwgdm9pZCAoKmZwKSh2b2lkKSkKKwl7CisJcmV0dXJuKDApOworCX0KKworbG9uZyBzc2wyX2N0eF9jdHJsKFNTTF9DVFggKmN0eCwgaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKQorCXsKKwlyZXR1cm4oMCk7CisJfQorCitsb25nIHNzbDJfY3R4X2NhbGxiYWNrX2N0cmwoU1NMX0NUWCAqY3R4LCBpbnQgY21kLCB2b2lkICgqZnApKHZvaWQpKQorCXsKKwlyZXR1cm4oMCk7CisJfQorCisvKiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGNoZWNrIGlmIHRoZSBjaXBoZXJzIHJlcXVpcmVkIGFyZSBhY3R1YWxseQorICogYXZhaWxhYmxlICovCitjb25zdCBTU0xfQ0lQSEVSICpzc2wyX2dldF9jaXBoZXJfYnlfY2hhcihjb25zdCB1bnNpZ25lZCBjaGFyICpwKQorCXsKKwlTU0xfQ0lQSEVSIGM7CisJY29uc3QgU1NMX0NJUEhFUiAqY3A7CisJdW5zaWduZWQgbG9uZyBpZDsKKworCWlkPTB4MDIwMDAwMDBMfCgodW5zaWduZWQgbG9uZylwWzBdPDwxNkwpfAorCQkoKHVuc2lnbmVkIGxvbmcpcFsxXTw8OEwpfCh1bnNpZ25lZCBsb25nKXBbMl07CisJYy5pZD1pZDsKKwljcCA9IE9CSl9ic2VhcmNoX3NzbF9jaXBoZXJfaWQoJmMsIHNzbDJfY2lwaGVycywgU1NMMl9OVU1fQ0lQSEVSUyk7CisJaWYgKChjcCA9PSBOVUxMKSB8fCAoY3AtPnZhbGlkID09IDApKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlCisJCXJldHVybiBjcDsKKwl9CisKK2ludCBzc2wyX3B1dF9jaXBoZXJfYnlfY2hhcihjb25zdCBTU0xfQ0lQSEVSICpjLCB1bnNpZ25lZCBjaGFyICpwKQorCXsKKwlsb25nIGw7CisKKwlpZiAocCAhPSBOVUxMKQorCQl7CisJCWw9Yy0+aWQ7CisJCWlmICgobCAmIDB4ZmYwMDAwMDApICE9IDB4MDIwMDAwMDApIHJldHVybigwKTsKKwkJcFswXT0oKHVuc2lnbmVkIGNoYXIpKGw+PjE2TCkpJjB4RkY7CisJCXBbMV09KCh1bnNpZ25lZCBjaGFyKShsPj4gOEwpKSYweEZGOworCQlwWzJdPSgodW5zaWduZWQgY2hhcikobCAgICAgKSkmMHhGRjsKKwkJfQorCXJldHVybigzKTsKKwl9CisKK2ludCBzc2wyX2dlbmVyYXRlX2tleV9tYXRlcmlhbChTU0wgKnMpCisJeworCXVuc2lnbmVkIGludCBpOworCUVWUF9NRF9DVFggY3R4OworCXVuc2lnbmVkIGNoYXIgKmttOworCXVuc2lnbmVkIGNoYXIgYz0nMCc7CisJY29uc3QgRVZQX01EICptZDU7CisJaW50IG1kX3NpemU7CisKKwltZDUgPSBFVlBfbWQ1KCk7CisKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworCWMgPSBvc190b2FzY2lpWycwJ107IC8qIE11c3QgYmUgYW4gQVNDSUkgJzAnLCBub3QgRUJDRElDICcwJywKKwkJCQlzZWUgU1NMdjIgZG9jdSAqLworI2VuZGlmCisJRVZQX01EX0NUWF9pbml0KCZjdHgpOworCWttPXMtPnMyLT5rZXlfbWF0ZXJpYWw7CisKKyAJaWYgKHMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoIDwgMCB8fAorCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGggPiAoaW50KXNpemVvZihzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5KSkKKyAJCXsKKyAJCVNTTGVycihTU0xfRl9TU0wyX0dFTkVSQVRFX0tFWV9NQVRFUklBTCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworIAkJcmV0dXJuIDA7CisgCQl9CisJbWRfc2l6ZSA9IEVWUF9NRF9zaXplKG1kNSk7CisJaWYgKG1kX3NpemUgPCAwKQorCSAgICByZXR1cm4gMDsKKwlmb3IgKGk9MDsgaTxzLT5zMi0+a2V5X21hdGVyaWFsX2xlbmd0aDsgaSArPSBtZF9zaXplKQorCQl7CisJCWlmICgoKGttIC0gcy0+czItPmtleV9tYXRlcmlhbCkgKyBtZF9zaXplKSA+CisJCQkJKGludClzaXplb2Yocy0+czItPmtleV9tYXRlcmlhbCkpCisJCQl7CisJCQkvKiBFVlBfRGlnZXN0RmluYWxfZXgoKSBiZWxvdyB3b3VsZCB3cml0ZSBiZXlvbmQgYnVmZmVyICovCisJCQlTU0xlcnIoU1NMX0ZfU1NMMl9HRU5FUkFURV9LRVlfTUFURVJJQUwsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiAwOworCQkJfQorCisJCUVWUF9EaWdlc3RJbml0X2V4KCZjdHgsIG1kNSwgTlVMTCk7CisKKwkJT1BFTlNTTF9hc3NlcnQocy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGggPj0gMAorCQkgICAgJiYgcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGgKKwkJICAgIDwgKGludClzaXplb2Yocy0+c2Vzc2lvbi0+bWFzdGVyX2tleSkpOworCQlFVlBfRGlnZXN0VXBkYXRlKCZjdHgscy0+c2Vzc2lvbi0+bWFzdGVyX2tleSxzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwmYywxKTsKKwkJYysrOworCQlFVlBfRGlnZXN0VXBkYXRlKCZjdHgscy0+czItPmNoYWxsZW5nZSxzLT5zMi0+Y2hhbGxlbmdlX2xlbmd0aCk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCxzLT5zMi0+Y29ubl9pZCxzLT5zMi0+Y29ubl9pZF9sZW5ndGgpOworCQlFVlBfRGlnZXN0RmluYWxfZXgoJmN0eCxrbSxOVUxMKTsKKwkJa20gKz0gbWRfc2l6ZTsKKwkJfQorCisJRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOworCXJldHVybiAxOworCX0KKwordm9pZCBzc2wyX3JldHVybl9lcnJvcihTU0wgKnMsIGludCBlcnIpCisJeworCWlmICghcy0+ZXJyb3IpCisJCXsKKwkJcy0+ZXJyb3I9MzsKKwkJcy0+ZXJyb3JfY29kZT1lcnI7CisKKwkJc3NsMl93cml0ZV9lcnJvcihzKTsKKwkJfQorCX0KKworCit2b2lkIHNzbDJfd3JpdGVfZXJyb3IoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKKwlpbnQgaSxlcnJvcjsKKworCWJ1ZlswXT1TU0wyX01UX0VSUk9SOworCWJ1ZlsxXT0ocy0+ZXJyb3JfY29kZT4+OCkmMHhmZjsKKwlidWZbMl09KHMtPmVycm9yX2NvZGUpJjB4ZmY7CisKKy8qCXN0YXRlPXMtPnJ3c3RhdGU7Ki8KKworCWVycm9yPXMtPmVycm9yOyAvKiBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byB3cml0ZSAqLworCXMtPmVycm9yPTA7CisJT1BFTlNTTF9hc3NlcnQoZXJyb3IgPj0gMCAmJiBlcnJvciA8PSAoaW50KXNpemVvZihidWYpKTsKKwlpPXNzbDJfd3JpdGUocywmKGJ1ZlszLWVycm9yXSksZXJyb3IpOworCisvKglpZiAoaSA9PSBlcnJvcikgcy0+cndzdGF0ZT1zdGF0ZTsgKi8KKworCWlmIChpIDwgMCkKKwkJcy0+ZXJyb3I9ZXJyb3I7CisJZWxzZQorCQl7CisJCXMtPmVycm9yPWVycm9yLWk7CisKKwkJaWYgKHMtPmVycm9yID09IDApCisJCQlpZiAocy0+bXNnX2NhbGxiYWNrKQorCQkJCXMtPm1zZ19jYWxsYmFjaygxLCBzLT52ZXJzaW9uLCAwLCBidWYsIDMsIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOyAvKiBFUlJPUiAqLworCQl9CisJfQorCitpbnQgc3NsMl9zaHV0ZG93bihTU0wgKnMpCisJeworCXMtPnNodXRkb3duPShTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOworCXJldHVybigxKTsKKwl9CisjZWxzZSAvKiAhT1BFTlNTTF9OT19TU0wyICovCisKKyMgaWYgUEVEQU5USUMKK3N0YXRpYyB2b2lkICpkdW1teT0mZHVtbXk7CisjIGVuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3MyX21ldGguYyBiL2xpYi9vcGVuc3NsL3NzbC9zMl9tZXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlOGNhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zMl9tZXRoLmMKQEAgLTAsMCArMSw4NCBAQAorLyogc3NsL3MyX21ldGguYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKnNzbDJfZ2V0X21ldGhvZChpbnQgdmVyKTsKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICpzc2wyX2dldF9tZXRob2QoaW50IHZlcikKKwl7CisJaWYgKHZlciA9PSBTU0wyX1ZFUlNJT04pCisJCXJldHVybihTU0x2Ml9tZXRob2QoKSk7CisJZWxzZQorCQlyZXR1cm4oTlVMTCk7CisJfQorCitJTVBMRU1FTlRfc3NsMl9tZXRoX2Z1bmMoU1NMdjJfbWV0aG9kLAorCQkJIHNzbDJfYWNjZXB0LAorCQkJIHNzbDJfY29ubmVjdCwKKwkJCSBzc2wyX2dldF9tZXRob2QpCisKKyNlbHNlIC8qICFPUEVOU1NMX05PX1NTTDIgKi8KKworIyBpZiBQRURBTlRJQworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyMgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvczJfcGt0LmMgYi9saWIvb3BlbnNzbC9zc2wvczJfcGt0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5NjNiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zMl9wa3QuYwpAQCAtMCwwICsxLDc0NCBAQAorLyogc3NsL3MyX3BrdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgInNzbF9sb2NsLmgiCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgVVNFX1NPQ0tFVFMKKworc3RhdGljIGludCByZWFkX24oU1NMICpzLHVuc2lnbmVkIGludCBuLHVuc2lnbmVkIGludCBtYXgsdW5zaWduZWQgaW50IGV4dGVuZCk7CitzdGF0aWMgaW50IG5fZG9fc3NsX3dyaXRlKFNTTCAqcywgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgd3JpdGVfcGVuZGluZyhTU0wgKnMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CitzdGF0aWMgaW50IHNzbF9tdF9lcnJvcihpbnQgbik7CisKKworLyogU1NMIDIuMCBpbWxlbWVudGF0aW9uIGZvciBTU0xfcmVhZC9TU0xfcGVlayAtCisgKiBUaGlzIHJvdXRpbmUgd2lsbCByZXR1cm4gMCB0byBsZW4gYnl0ZXMsIGRlY3J5cHRlZCBldGMgaWYgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyBpbnQgc3NsMl9yZWFkX2ludGVybmFsKFNTTCAqcywgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgcGVlaykKKwl7CisJaW50IG47CisJdW5zaWduZWQgY2hhciBtYWNbTUFYX01BQ19TSVpFXTsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBpOworCWludCBtYWNfc2l6ZTsKKworIHNzbDJfcmVhZF9hZ2FpbjoKKwlpZiAoU1NMX2luX2luaXQocykgJiYgIXMtPmluX2hhbmRzaGFrZSkKKwkJeworCQluPXMtPmhhbmRzaGFrZV9mdW5jKHMpOworCQlpZiAobiA8IDApIHJldHVybihuKTsKKwkJaWYgKG4gPT0gMCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wyX1JFQURfSU5URVJOQUwsU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCX0KKworCWNsZWFyX3N5c19lcnJvcigpOworCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJaWYgKGxlbiA8PSAwKSByZXR1cm4obGVuKTsKKworCWlmIChzLT5zMi0+cmFjdF9kYXRhX2xlbmd0aCAhPSAwKSAvKiByZWFkIGZyb20gYnVmZmVyICovCisJCXsKKwkJaWYgKGxlbiA+IHMtPnMyLT5yYWN0X2RhdGFfbGVuZ3RoKQorCQkJbj1zLT5zMi0+cmFjdF9kYXRhX2xlbmd0aDsKKwkJZWxzZQorCQkJbj1sZW47CisKKwkJbWVtY3B5KGJ1ZixzLT5zMi0+cmFjdF9kYXRhLCh1bnNpZ25lZCBpbnQpbik7CisJCWlmICghcGVlaykKKwkJCXsKKwkJCXMtPnMyLT5yYWN0X2RhdGFfbGVuZ3RoLT1uOworCQkJcy0+czItPnJhY3RfZGF0YSs9bjsKKwkJCWlmIChzLT5zMi0+cmFjdF9kYXRhX2xlbmd0aCA9PSAwKQorCQkJCXMtPnJzdGF0ZT1TU0xfU1RfUkVBRF9IRUFERVI7CisJCQl9CisKKwkJcmV0dXJuKG4pOworCQl9CisKKwkvKiBzLT5zMi0+cmFjdF9kYXRhX2xlbmd0aCA9PSAwCisJICogCisJICogRmlsbCB0aGUgYnVmZmVyLCB0aGVuIGdvdG8gc3NsMl9yZWFkX2FnYWluLgorCSAqLworCisJaWYgKHMtPnJzdGF0ZSA9PSBTU0xfU1RfUkVBRF9IRUFERVIpCisJCXsKKwkJaWYgKHMtPmZpcnN0X3BhY2tldCkKKwkJCXsKKwkJCW49cmVhZF9uKHMsNSxTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIrMiwwKTsKKwkJCWlmIChuIDw9IDApIHJldHVybihuKTsgLyogZXJyb3Igb3Igbm9uLWJsb2NraW5nICovCisJCQlzLT5maXJzdF9wYWNrZXQ9MDsKKwkJCXA9cy0+cGFja2V0OworCQkJaWYgKCEoKHBbMF0gJiAweDgwKSAmJiAoCisJCQkJKHBbMl0gPT0gU1NMMl9NVF9DTElFTlRfSEVMTE8pIHx8CisJCQkJKHBbMl0gPT0gU1NMMl9NVF9TRVJWRVJfSEVMTE8pKSkpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wyX1JFQURfSU5URVJOQUwsU1NMX1JfTk9OX1NTTFYyX0lOSVRJQUxfUEFDS0VUKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJbj1yZWFkX24ocywyLFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfMl9CWVRFX0hFQURFUisyLDApOworCQkJaWYgKG4gPD0gMCkgcmV0dXJuKG4pOyAvKiBlcnJvciBvciBub24tYmxvY2tpbmcgKi8KKwkJCX0KKwkJLyogcGFydCByZWFkIHN0dWZmICovCisKKwkJcy0+cnN0YXRlPVNTTF9TVF9SRUFEX0JPRFk7CisJCXA9cy0+cGFja2V0OworCQkvKiBEbyBoZWFkZXIgKi8KKwkJLypzLT5zMi0+cGFkZGluZz0wOyovCisJCXMtPnMyLT5lc2NhcGU9MDsKKwkJcy0+czItPnJsZW5ndGg9KCgodW5zaWduZWQgaW50KXBbMF0pPDw4KXwoKHVuc2lnbmVkIGludClwWzFdKTsKKwkJaWYgKChwWzBdICYgVFdPX0JZVEVfQklUKSkJCS8qIFR3byBieXRlIGhlYWRlcj8gKi8KKwkJCXsKKwkJCXMtPnMyLT50aHJlZV9ieXRlX2hlYWRlcj0wOworCQkJcy0+czItPnJsZW5ndGgmPVRXT19CWVRFX01BU0s7CQorCQkJfQorCQllbHNlCisJCQl7CisJCQlzLT5zMi0+dGhyZWVfYnl0ZV9oZWFkZXI9MTsKKwkJCXMtPnMyLT5ybGVuZ3RoJj1USFJFRV9CWVRFX01BU0s7CisKKwkJCS8qIHNlY3VyaXR5ID5zMi0+ZXNjYXBlICovCisJCQlzLT5zMi0+ZXNjYXBlPSgocFswXSAmIFNFQ19FU0NfQklUKSk/MTowOworCQkJfQorCQl9CisKKwlpZiAocy0+cnN0YXRlID09IFNTTF9TVF9SRUFEX0JPRFkpCisJCXsKKwkJbj1zLT5zMi0+cmxlbmd0aCsyK3MtPnMyLT50aHJlZV9ieXRlX2hlYWRlcjsKKwkJaWYgKG4gPiAoaW50KXMtPnBhY2tldF9sZW5ndGgpCisJCQl7CisJCQluLT1zLT5wYWNrZXRfbGVuZ3RoOworCQkJaT1yZWFkX24ocywodW5zaWduZWQgaW50KW4sKHVuc2lnbmVkIGludCluLDEpOworCQkJaWYgKGkgPD0gMCkgcmV0dXJuKGkpOyAvKiBFUlJPUiAqLworCQkJfQorCisJCXA9ICYocy0+cGFja2V0WzJdKTsKKwkJcy0+cnN0YXRlPVNTTF9TVF9SRUFEX0hFQURFUjsKKwkJaWYgKHMtPnMyLT50aHJlZV9ieXRlX2hlYWRlcikKKwkJCXMtPnMyLT5wYWRkaW5nPSAqKHArKyk7CisJCWVsc2UJcy0+czItPnBhZGRpbmc9MDsKKworCQkvKiBEYXRhIHBvcnRpb24gKi8KKwkJaWYgKHMtPnMyLT5jbGVhcl90ZXh0KQorCQkJeworCQkJbWFjX3NpemUgPSAwOworCQkJcy0+czItPm1hY19kYXRhPXA7CisJCQlzLT5zMi0+cmFjdF9kYXRhPXA7CisJCQlpZiAocy0+czItPnBhZGRpbmcpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wyX1JFQURfSU5URVJOQUwsU1NMX1JfSUxMRUdBTF9QQURESU5HKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJbWFjX3NpemU9RVZQX01EX0NUWF9zaXplKHMtPnJlYWRfaGFzaCk7CisJCQlpZiAobWFjX3NpemUgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCU9QRU5TU0xfYXNzZXJ0KG1hY19zaXplIDw9IE1BWF9NQUNfU0laRSk7CisJCQlzLT5zMi0+bWFjX2RhdGE9cDsKKwkJCXMtPnMyLT5yYWN0X2RhdGE9ICZwW21hY19zaXplXTsKKwkJCWlmIChzLT5zMi0+cGFkZGluZyArIG1hY19zaXplID4gcy0+czItPnJsZW5ndGgpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wyX1JFQURfSU5URVJOQUwsU1NMX1JfSUxMRUdBTF9QQURESU5HKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJCX0KKwkJCX0KKworCQlzLT5zMi0+cmFjdF9kYXRhX2xlbmd0aD1zLT5zMi0+cmxlbmd0aDsKKwkJLyogYWRkZWQgYSBjaGVjayBmb3IgbGVuZ3RoID4gbWF4X3NpemUgaW4gY2FzZQorCQkgKiBlbmNyeXB0aW9uIHdhcyBub3QgdHVybmVkIG9uIHlldCBkdWUgdG8gYW4gZXJyb3IgKi8KKwkJaWYgKCghcy0+czItPmNsZWFyX3RleHQpICYmCisJCQkocy0+czItPnJsZW5ndGggPj0gKHVuc2lnbmVkIGludCltYWNfc2l6ZSkpCisJCQl7CisJCQlzc2wyX2VuYyhzLDApOworCQkJcy0+czItPnJhY3RfZGF0YV9sZW5ndGgtPW1hY19zaXplOworCQkJc3NsMl9tYWMocyxtYWMsMCk7CisJCQlzLT5zMi0+cmFjdF9kYXRhX2xlbmd0aC09cy0+czItPnBhZGRpbmc7CisJCQlpZiAoCShtZW1jbXAobWFjLHMtPnMyLT5tYWNfZGF0YSwKKwkJCQkodW5zaWduZWQgaW50KW1hY19zaXplKSAhPSAwKSB8fAorCQkJCShzLT5zMi0+cmxlbmd0aCVFVlBfQ0lQSEVSX0NUWF9ibG9ja19zaXplKHMtPmVuY19yZWFkX2N0eCkgIT0gMCkpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wyX1JFQURfSU5URVJOQUwsU1NMX1JfQkFEX01BQ19ERUNPREUpOworCQkJCXJldHVybigtMSk7CisJCQkJfQorCQkJfQorCQlJTkMzMihzLT5zMi0+cmVhZF9zZXF1ZW5jZSk7IC8qIGV4cGVjdCBuZXh0IG51bWJlciAqLworCQkvKiBzLT5zMi0+cmFjdF9kYXRhIGlzIG5vdyBhdmFpbGFibGUgZm9yIHByb2Nlc3NpbmcgKi8KKworCQkvKiBQb3NzaWJseSB0aGUgcGFja2V0IHRoYXQgd2UganVzdCByZWFkIGhhZCAwIGFjdHVhbCBkYXRhIGJ5dGVzLgorCQkgKiAoU1NMZWF5L09wZW5TU0wgaXRzZWxmIG5ldmVyIHNlbmRzIHN1Y2ggcGFja2V0czsgc2VlIHNzbDJfd3JpdGUuKQorCQkgKiBJbiB0aGlzIGNhc2UsIHJldHVybmluZyAwIHdvdWxkIGJlIGludGVycHJldGVkIGJ5IHRoZSBjYWxsZXIKKwkJICogYXMgaW5kaWNhdGluZyBFT0YsIHNvIGl0J3Mgbm90IGEgZ29vZCBpZGVhLiAgSW5zdGVhZCwgd2UganVzdAorCQkgKiBjb250aW51ZSByZWFkaW5nOyB0aHVzIHNzbDJfcmVhZF9pbnRlcm5hbCBtYXkgaGF2ZSB0byBwcm9jZXNzCisJCSAqIG11bHRpcGxlIHBhY2tldHMgYmVmb3JlIGl0IGNhbiByZXR1cm4uCisJCSAqCisJCSAqIFtOb3RlIHRoYXQgdXNpbmcgc2VsZWN0KCkgZm9yIGJsb2NraW5nIHNvY2tldHMgKm5ldmVyKiBndWFyYW50ZWVzCisJCSAqIHRoYXQgdGhlIG5leHQgU1NMX3JlYWQgd2lsbCBub3QgYmxvY2sgLS0gdGhlIGF2YWlsYWJsZQorCQkgKiBkYXRhIG1heSBjb250YWluIGluY29tcGxldGUgcGFja2V0cywgYW5kIGV4Y2VwdCBmb3IgU1NMIDIsCisJCSAqIHJlbmVnb3RpYXRpb24gY2FuIGNvbmZ1c2UgdGhpbmdzIGV2ZW4gbW9yZS5dICovCisKKwkJZ290byBzc2wyX3JlYWRfYWdhaW47IC8qIFRoaXMgc2hvdWxkIHJlYWxseSBiZQorCQkgICAgICAgICAgICAgICAgICAgICAgICogInJldHVybiBzc2wyX3JlYWQocyxidWYsbGVuKSIsCisJCSAgICAgICAgICAgICAgICAgICAgICAgKiBidXQgdGhhdCB3b3VsZCBhbGxvdyBmb3IKKwkJICAgICAgICAgICAgICAgICAgICAgICAqIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFja3MgaWYgYQorCQkgICAgICAgICAgICAgICAgICAgICAgICogQyBjb21waWxlciBpcyB1c2VkIHRoYXQgZG9lcyBub3QKKwkJICAgICAgICAgICAgICAgICAgICAgICAqIHJlY29nbml6ZSBlbmQtcmVjdXJzaW9uLiAqLworCQl9CisJZWxzZQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wyX1JFQURfSU5URVJOQUwsU1NMX1JfQkFEX1NUQVRFKTsKKwkJCXJldHVybigtMSk7CisJCX0KKwl9CisKK2ludCBzc2wyX3JlYWQoU1NMICpzLCB2b2lkICpidWYsIGludCBsZW4pCisJeworCXJldHVybiBzc2wyX3JlYWRfaW50ZXJuYWwocywgYnVmLCBsZW4sIDApOworCX0KKworaW50IHNzbDJfcGVlayhTU0wgKnMsIHZvaWQgKmJ1ZiwgaW50IGxlbikKKwl7CisJcmV0dXJuIHNzbDJfcmVhZF9pbnRlcm5hbChzLCBidWYsIGxlbiwgMSk7CisJfQorCitzdGF0aWMgaW50IHJlYWRfbihTU0wgKnMsIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgbWF4LAorCSAgICAgdW5zaWduZWQgaW50IGV4dGVuZCkKKwl7CisJaW50IGksb2ZmLG5ld2I7CisKKwkvKiBpZiB0aGVyZSBpcyBzdHVmZiBzdGlsbCBpbiB0aGUgYnVmZmVyIGZyb20gYSBwcmV2aW91cyByZWFkLAorCSAqIGFuZCB0aGVyZSBpcyBtb3JlIHRoYW4gd2Ugd2FudCwgdGFrZSBzb21lLiAqLworCWlmIChzLT5zMi0+cmJ1Zl9sZWZ0ID49IChpbnQpbikKKwkJeworCQlpZiAoZXh0ZW5kKQorCQkJcy0+cGFja2V0X2xlbmd0aCs9bjsKKwkJZWxzZQorCQkJeworCQkJcy0+cGFja2V0PSAmKHMtPnMyLT5yYnVmW3MtPnMyLT5yYnVmX29mZnNdKTsKKwkJCXMtPnBhY2tldF9sZW5ndGg9bjsKKwkJCX0KKwkJcy0+czItPnJidWZfbGVmdC09bjsKKwkJcy0+czItPnJidWZfb2Zmcys9bjsKKwkJcmV0dXJuKG4pOworCQl9CisKKwlpZiAoIXMtPnJlYWRfYWhlYWQpIG1heD1uOworCWlmIChtYXggPiAodW5zaWduZWQgaW50KShTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIrMikpCisJCW1heD1TU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIrMjsKKwkKKworCS8qIEVsc2Ugd2Ugd2FudCBtb3JlIHRoYW4gd2UgaGF2ZS4KKwkgKiBGaXJzdCwgaWYgdGhlcmUgaXMgc29tZSBsZWZ0IG9yIHdlIHdhbnQgdG8gZXh0ZW5kICovCisJb2ZmPTA7CisJaWYgKChzLT5zMi0+cmJ1Zl9sZWZ0ICE9IDApIHx8ICgocy0+cGFja2V0X2xlbmd0aCAhPSAwKSAmJiBleHRlbmQpKQorCQl7CisJCW5ld2I9cy0+czItPnJidWZfbGVmdDsKKwkJaWYgKGV4dGVuZCkKKwkJCXsKKwkJCW9mZj1zLT5wYWNrZXRfbGVuZ3RoOworCQkJaWYgKHMtPnBhY2tldCAhPSBzLT5zMi0+cmJ1ZikKKwkJCQltZW1jcHkocy0+czItPnJidWYscy0+cGFja2V0LAorCQkJCQkodW5zaWduZWQgaW50KW5ld2Irb2ZmKTsKKwkJCX0KKwkJZWxzZSBpZiAocy0+czItPnJidWZfb2ZmcyAhPSAwKQorCQkJeworCQkJbWVtY3B5KHMtPnMyLT5yYnVmLCYocy0+czItPnJidWZbcy0+czItPnJidWZfb2Zmc10pLAorCQkJCSh1bnNpZ25lZCBpbnQpbmV3Yik7CisJCQlzLT5zMi0+cmJ1Zl9vZmZzPTA7CisJCQl9CisJCXMtPnMyLT5yYnVmX2xlZnQ9MDsKKwkJfQorCWVsc2UKKwkJbmV3Yj0wOworCisJLyogb2ZmIGlzIHRoZSBvZmZzZXQgdG8gc3RhcnQgd3JpdGluZyB0b28uCisJICogci0+czItPnJidWZfb2ZmcyBpcyB0aGUgJ3VucmVhZCBkYXRhJywgbm93IDAuIAorCSAqIG5ld2IgaXMgdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgc28gZmFyCisJICovCisJcy0+cGFja2V0PXMtPnMyLT5yYnVmOworCXdoaWxlIChuZXdiIDwgKGludCluKQorCQl7CisJCWNsZWFyX3N5c19lcnJvcigpOworCQlpZiAocy0+cmJpbyAhPSBOVUxMKQorCQkJeworCQkJcy0+cndzdGF0ZT1TU0xfUkVBRElORzsKKwkJCWk9QklPX3JlYWQocy0+cmJpbywoY2hhciAqKSYocy0+czItPnJidWZbb2ZmK25ld2JdKSwKKwkJCQltYXgtbmV3Yik7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9SRUFEX04sU1NMX1JfUkVBRF9CSU9fTk9UX1NFVCk7CisJCQlpPSAtMTsKKwkJCX0KKyNpZmRlZiBQS1RfREVCVUcKKwkJaWYgKHMtPmRlYnVnICYgMHgwMSkgc2xlZXAoMSk7CisjZW5kaWYKKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCXMtPnMyLT5yYnVmX2xlZnQrPW5ld2I7CisJCQlyZXR1cm4oaSk7CisJCQl9CisJCW5ld2IrPWk7CisJCX0KKworCS8qIHJlY29yZCB1bnJlYWQgZGF0YSAqLworCWlmIChuZXdiID4gKGludCluKQorCQl7CisJCXMtPnMyLT5yYnVmX29mZnM9bitvZmY7CisJCXMtPnMyLT5yYnVmX2xlZnQ9bmV3Yi1uOworCQl9CisJZWxzZQorCQl7CisJCXMtPnMyLT5yYnVmX29mZnM9MDsKKwkJcy0+czItPnJidWZfbGVmdD0wOworCQl9CisJaWYgKGV4dGVuZCkKKwkJcy0+cGFja2V0X2xlbmd0aCs9bjsKKwllbHNlCisJCXMtPnBhY2tldF9sZW5ndGg9bjsKKwlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCXJldHVybihuKTsKKwl9CisKK2ludCBzc2wyX3dyaXRlKFNTTCAqcywgY29uc3Qgdm9pZCAqX2J1ZiwgaW50IGxlbikKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmPV9idWY7CisJdW5zaWduZWQgaW50IG4sdG90OworCWludCBpOworCisJaWYgKFNTTF9pbl9pbml0KHMpICYmICFzLT5pbl9oYW5kc2hha2UpCisJCXsKKwkJaT1zLT5oYW5kc2hha2VfZnVuYyhzKTsKKwkJaWYgKGkgPCAwKSByZXR1cm4oaSk7CisJCWlmIChpID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMMl9XUklURSxTU0xfUl9TU0xfSEFORFNIQUtFX0ZBSUxVUkUpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJfQorCisJaWYgKHMtPmVycm9yKQorCQl7CisJCXNzbDJfd3JpdGVfZXJyb3Iocyk7CisJCWlmIChzLT5lcnJvcikKKwkJCXJldHVybigtMSk7CisJCX0KKworCWNsZWFyX3N5c19lcnJvcigpOworCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJaWYgKGxlbiA8PSAwKSByZXR1cm4obGVuKTsKKworCXRvdD1zLT5zMi0+d251bTsKKwlzLT5zMi0+d251bT0wOworCisJbj0obGVuLXRvdCk7CisJZm9yICg7OykKKwkJeworCQlpPW5fZG9fc3NsX3dyaXRlKHMsJihidWZbdG90XSksbik7CisJCWlmIChpIDw9IDApCisJCQl7CisJCQlzLT5zMi0+d251bT10b3Q7CisJCQlyZXR1cm4oaSk7CisJCQl9CisJCWlmICgoaSA9PSAoaW50KW4pIHx8CisJCQkocy0+bW9kZSAmIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFKSkKKwkJCXsKKwkJCXJldHVybih0b3QraSk7CisJCQl9CisJCQorCQluLT1pOworCQl0b3QrPWk7CisJCX0KKwl9CisKK3N0YXRpYyBpbnQgd3JpdGVfcGVuZGluZyhTU0wgKnMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKKwl7CisJaW50IGk7CisKKwkvKiBzLT5zMi0+d3BlbmRfbGVuICE9IDAgTVVTVCBiZSB0cnVlLiAqLworCisJLyogY2hlY2sgdGhhdCB0aGV5IGhhdmUgZ2l2ZW4gdXMgdGhlIHNhbWUgYnVmZmVyIHRvCisJICogd3JpdGUgKi8KKwlpZiAoKHMtPnMyLT53cGVuZF90b3QgPiAoaW50KWxlbikgfHwKKwkJKChzLT5zMi0+d3BlbmRfYnVmICE9IGJ1ZikgJiYKKwkJICEocy0+bW9kZSAmIFNTTF9NT0RFX0FDQ0VQVF9NT1ZJTkdfV1JJVEVfQlVGRkVSKSkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1dSSVRFX1BFTkRJTkcsU1NMX1JfQkFEX1dSSVRFX1JFVFJZKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCisJZm9yICg7OykKKwkJeworCQljbGVhcl9zeXNfZXJyb3IoKTsKKwkJaWYgKHMtPndiaW8gIT0gTlVMTCkKKwkJCXsKKwkJCXMtPnJ3c3RhdGU9U1NMX1dSSVRJTkc7CisJCQlpPUJJT193cml0ZShzLT53YmlvLAorCQkJCShjaGFyICopJihzLT5zMi0+d3JpdGVfcHRyW3MtPnMyLT53cGVuZF9vZmZdKSwKKwkJCQkodW5zaWduZWQgaW50KXMtPnMyLT53cGVuZF9sZW4pOworCQkJfQorCQllbHNlCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfV1JJVEVfUEVORElORyxTU0xfUl9XUklURV9CSU9fTk9UX1NFVCk7CisJCQlpPSAtMTsKKwkJCX0KKyNpZmRlZiBQS1RfREVCVUcKKwkJaWYgKHMtPmRlYnVnICYgMHgwMSkgc2xlZXAoMSk7CisjZW5kaWYKKwkJaWYgKGkgPT0gcy0+czItPndwZW5kX2xlbikKKwkJCXsKKwkJCXMtPnMyLT53cGVuZF9sZW49MDsKKwkJCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJCQlyZXR1cm4ocy0+czItPndwZW5kX3JldCk7CisJCQl9CisJCWVsc2UgaWYgKGkgPD0gMCkKKwkJCXJldHVybihpKTsKKwkJcy0+czItPndwZW5kX29mZis9aTsKKwkJcy0+czItPndwZW5kX2xlbi09aTsKKwkJfQorCX0KKworc3RhdGljIGludCBuX2RvX3NzbF93cml0ZShTU0wgKnMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKKwl7CisJdW5zaWduZWQgaW50IGosayxvbGVuLHAsYnM7CisJaW50IG1hY19zaXplOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnBwOworCisJb2xlbj1sZW47CisKKwkvKiBmaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBkYXRhIGZyb20gYW4gZW5jcnlwdGlvbiB3YWl0aW5nIHRvCisJICogYmUgc2VudCAtIGl0IG11c3QgYmUgc2VudCBiZWNhdXNlIHRoZSBvdGhlciBlbmQgaXMgd2FpdGluZy4KKwkgKiBUaGlzIHdpbGwgaGFwcGVuIHdpdGggbm9uLWJsb2NraW5nIElPLiAgV2UgcHJpbnQgaXQgYW5kIHRoZW4KKwkgKiByZXR1cm4uCisJICovCisJaWYgKHMtPnMyLT53cGVuZF9sZW4gIT0gMCkgcmV0dXJuKHdyaXRlX3BlbmRpbmcocyxidWYsbGVuKSk7CisKKwkvKiBzZXQgbWFjX3NpemUgdG8gbWFjIHNpemUgKi8KKwlpZiAocy0+czItPmNsZWFyX3RleHQpCisJCW1hY19zaXplPTA7CisJZWxzZQorCQl7CisJCW1hY19zaXplPUVWUF9NRF9DVFhfc2l6ZShzLT53cml0ZV9oYXNoKTsKKwkJaWYgKG1hY19zaXplIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJfQorCisJLyogbGV0cyBzZXQgdGhlIHBhZCBwICovCisJaWYgKHMtPnMyLT5jbGVhcl90ZXh0KQorCQl7CisJCWlmIChsZW4gPiBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIpCisJCQlsZW49U1NMMl9NQVhfUkVDT1JEX0xFTkdUSF8yX0JZVEVfSEVBREVSOworCQlwPTA7CisJCXMtPnMyLT50aHJlZV9ieXRlX2hlYWRlcj0wOworCQkvKiBsZW49bGVuOyAqLworCQl9CisJZWxzZQorCQl7CisJCWJzPUVWUF9DSVBIRVJfQ1RYX2Jsb2NrX3NpemUocy0+ZW5jX3JlYWRfY3R4KTsKKwkJaj1sZW4rbWFjX3NpemU7CisJCS8qIFR3by1ieXRlIGhlYWRlcnMgYWxsb3cgZm9yIGEgbGFyZ2VyIHJlY29yZCBsZW5ndGggdGhhbgorCQkgKiB0aHJlZS1ieXRlIGhlYWRlcnMsIGJ1dCB3ZSBjYW4ndCB1c2UgdGhlbSBpZiB3ZSBuZWVkCisJCSAqIHBhZGRpbmcgb3IgaWYgd2UgaGF2ZSB0byBzZXQgdGhlIGVzY2FwZSBiaXQuICovCisJCWlmICgoaiA+IFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfM19CWVRFX0hFQURFUikgJiYKKwkJCSghcy0+czItPmVzY2FwZSkpCisJCQl7CisJCQlpZiAoaiA+IFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfMl9CWVRFX0hFQURFUikKKwkJCQlqPVNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfMl9CWVRFX0hFQURFUjsKKwkJCS8qIHNldCBrIHRvIHRoZSBtYXggbnVtYmVyIG9mIGJ5dGVzIHdpdGggMgorCQkJICogYnl0ZSBoZWFkZXIgKi8KKwkJCWs9ai0oaiVicyk7CisJCQkvKiBob3cgbWFueSBkYXRhIGJ5dGVzPyAqLworCQkJbGVuPWstbWFjX3NpemU7IAorCQkJcy0+czItPnRocmVlX2J5dGVfaGVhZGVyPTA7CisJCQlwPTA7CisJCQl9CisJCWVsc2UgaWYgKChicyA8PSAxKSAmJiAoIXMtPnMyLT5lc2NhcGUpKQorCQkJeworCQkJLyogaiA8PSBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIsIHRodXMKKwkJCSAqIGogPCBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzJfQllURV9IRUFERVIgKi8KKwkJCXMtPnMyLT50aHJlZV9ieXRlX2hlYWRlcj0wOworCQkJcD0wOworCQkJfQorCQllbHNlIC8qIHdlIG1heSBoYXZlIHRvIHVzZSBhIDMgYnl0ZSBoZWFkZXIgKi8KKwkJCXsKKwkJCS8qIElmIHMtPnMyLT5lc2NhcGUgaXMgbm90IHNldCwgdGhlbgorCQkJICogaiA8PSBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIsIGFuZCB0aHVzCisJCQkgKiBqIDwgU1NMMl9NQVhfUkVDT1JEX0xFTkdUSF8yX0JZVEVfSEVBREVSLiAqLworCQkJcD0oaiVicyk7CisJCQlwPShwID09IDApPzA6KGJzLXApOworCQkJaWYgKHMtPnMyLT5lc2NhcGUpCisJCQkJeworCQkJCXMtPnMyLT50aHJlZV9ieXRlX2hlYWRlcj0xOworCQkJCWlmIChqID4gU1NMMl9NQVhfUkVDT1JEX0xFTkdUSF8zX0JZVEVfSEVBREVSKQorCQkJCQlqPVNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfM19CWVRFX0hFQURFUjsKKwkJCQl9CisJCQllbHNlCisJCQkJcy0+czItPnRocmVlX2J5dGVfaGVhZGVyPShwID09IDApPzA6MTsKKwkJCX0KKwkJfQorCisJLyogTm93CisJICogICAgICBqIDw9IFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfMl9CWVRFX0hFQURFUgorCSAqIGhvbGRzLCBhbmQgaWYgcy0+czItPnRocmVlX2J5dGVfaGVhZGVyIGlzIHNldCwgdGhlbiBldmVuCisJICogICAgICBqIDw9IFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfM19CWVRFX0hFQURFUi4KKwkgKi8KKworCS8qIG1hY19zaXplIGlzIHRoZSBudW1iZXIgb2YgTUFDIGJ5dGVzCisJICogbGVuIGlzIHRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyB3ZSBhcmUgZ29pbmcgdG8gc2VuZAorCSAqIHAgaXMgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzCisJICogKGlmIGl0IGlzIGEgdHdvLWJ5dGUgaGVhZGVyLCB0aGVuIHAgPT0gMCkgKi8KKworCXMtPnMyLT53bGVuZ3RoPWxlbjsKKwlzLT5zMi0+cGFkZGluZz1wOworCXMtPnMyLT5tYWNfZGF0YT0gJihzLT5zMi0+d2J1ZlszXSk7CisJcy0+czItPndhY3RfZGF0YT0gJihzLT5zMi0+d2J1ZlszK21hY19zaXplXSk7CisJLyogd2UgY29weSB0aGUgZGF0YSBpbnRvIHMtPnMyLT53YnVmICovCisJbWVtY3B5KHMtPnMyLT53YWN0X2RhdGEsYnVmLGxlbik7CisJaWYgKHApCisJCW1lbXNldCgmKHMtPnMyLT53YWN0X2RhdGFbbGVuXSksMCxwKTsgLyogYXJiaXRyYXJ5IHBhZGRpbmcgKi8KKworCWlmICghcy0+czItPmNsZWFyX3RleHQpCisJCXsKKwkJcy0+czItPndhY3RfZGF0YV9sZW5ndGg9bGVuK3A7CisJCXNzbDJfbWFjKHMscy0+czItPm1hY19kYXRhLDEpOworCQlzLT5zMi0+d2xlbmd0aCs9cCttYWNfc2l6ZTsKKwkJc3NsMl9lbmMocywxKTsKKwkJfQorCisJLyogcGFja2FnZSB1cCB0aGUgaGVhZGVyICovCisJcy0+czItPndwZW5kX2xlbj1zLT5zMi0+d2xlbmd0aDsKKwlpZiAocy0+czItPnRocmVlX2J5dGVfaGVhZGVyKSAvKiAzIGJ5dGUgaGVhZGVyICovCisJCXsKKwkJcHA9cy0+czItPm1hY19kYXRhOworCQlwcC09MzsKKwkJcHBbMF09KHMtPnMyLT53bGVuZ3RoPj44KSYoVEhSRUVfQllURV9NQVNLPj44KTsKKwkJaWYgKHMtPnMyLT5lc2NhcGUpIHBwWzBdfD1TRUNfRVNDX0JJVDsKKwkJcHBbMV09cy0+czItPndsZW5ndGgmMHhmZjsKKwkJcHBbMl09cy0+czItPnBhZGRpbmc7CisJCXMtPnMyLT53cGVuZF9sZW4rPTM7CisJCX0KKwllbHNlCisJCXsKKwkJcHA9cy0+czItPm1hY19kYXRhOworCQlwcC09MjsKKwkJcHBbMF09KChzLT5zMi0+d2xlbmd0aD4+OCkmKFRXT19CWVRFX01BU0s+PjgpKXxUV09fQllURV9CSVQ7CisJCXBwWzFdPXMtPnMyLT53bGVuZ3RoJjB4ZmY7CisJCXMtPnMyLT53cGVuZF9sZW4rPTI7CisJCX0KKwlzLT5zMi0+d3JpdGVfcHRyPXBwOworCQorCUlOQzMyKHMtPnMyLT53cml0ZV9zZXF1ZW5jZSk7IC8qIGV4cGVjdCBuZXh0IG51bWJlciAqLworCisJLyogbGV0cyB0cnkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGRhdGEgKi8KKwlzLT5zMi0+d3BlbmRfdG90PW9sZW47CisJcy0+czItPndwZW5kX2J1Zj1idWY7CisKKwlzLT5zMi0+d3BlbmRfcmV0PWxlbjsKKworCXMtPnMyLT53cGVuZF9vZmY9MDsKKwlyZXR1cm4od3JpdGVfcGVuZGluZyhzLGJ1ZixvbGVuKSk7CisJfQorCitpbnQgc3NsMl9wYXJ0X3JlYWQoU1NMICpzLCB1bnNpZ25lZCBsb25nIGYsIGludCBpKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBqOworCisJaWYgKGkgPCAwKQorCQl7CisJCS8qIHNzbDJfcmV0dXJuX2Vycm9yKHMpOyAqLworCQkvKiBmb3Igbm9uLWJsb2NraW5nIGlvLAorCQkgKiB0aGlzIGlzIG5vdCBuZWNlc3NhcmlseSBmYXRhbCAqLworCQlyZXR1cm4oaSk7CisJCX0KKwllbHNlCisJCXsKKwkJcy0+aW5pdF9udW0rPWk7CisKKwkJLyogQ2hlY2sgZm9yIGVycm9yLiAgV2hpbGUgdGhlcmUgYXJlIHJlY292ZXJhYmxlIGVycm9ycywKKwkJICogdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkIHdoZW4gdGhvc2UgbXVzdCBiZSBleHBlY3RlZDsKKwkJICogYW55IGVycm9yIGRldGVjdGVkIGhlcmUgaXMgZmF0YWwuICovCisJCWlmIChzLT5pbml0X251bSA+PSAzKQorCQkJeworCQkJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCQkJaWYgKHBbMF0gPT0gU1NMMl9NVF9FUlJPUikKKwkJCQl7CisJCQkJaj0ocFsxXTw8OCl8cFsyXTsKKwkJCQlTU0xlcnIoKGludClmLHNzbF9tdF9lcnJvcihqKSk7CisJCQkJcy0+aW5pdF9udW0gLT0gMzsKKwkJCQlpZiAocy0+aW5pdF9udW0gPiAwKQorCQkJCQltZW1tb3ZlKHAsIHArMywgcy0+aW5pdF9udW0pOworCQkJCX0KKwkJCX0KKworCQkvKiBJZiBpdCdzIG5vdCBhbiBlcnJvciBtZXNzYWdlLCB3ZSBoYXZlIHNvbWUgZXJyb3IgYW55d2F5IC0tCisJCSAqIHRoZSBtZXNzYWdlIHdhcyBzaG9ydGVyIHRoYW4gZXhwZWN0ZWQuICBUaGlzIHRvbyBpcyB0cmVhdGVkCisJCSAqIGFzIGZhdGFsIChhdCBsZWFzdCBpZiBTU0xfZ2V0X2Vycm9yIGlzIGFza2VkIGZvciBpdHMgb3BpbmlvbikuICovCisJCXJldHVybigwKTsKKwkJfQorCX0KKworaW50IHNzbDJfZG9fd3JpdGUoU1NMICpzKQorCXsKKwlpbnQgcmV0OworCisJcmV0PXNzbDJfd3JpdGUocywmcy0+aW5pdF9idWYtPmRhdGFbcy0+aW5pdF9vZmZdLHMtPmluaXRfbnVtKTsKKwlpZiAocmV0ID09IHMtPmluaXRfbnVtKQorCQl7CisJCWlmIChzLT5tc2dfY2FsbGJhY2spCisJCQlzLT5tc2dfY2FsbGJhY2soMSwgcy0+dmVyc2lvbiwgMCwgcy0+aW5pdF9idWYtPmRhdGEsIChzaXplX3QpKHMtPmluaXRfb2ZmICsgcy0+aW5pdF9udW0pLCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsKKwkJcmV0dXJuKDEpOworCQl9CisJaWYgKHJldCA8IDApCisJCXJldHVybigtMSk7CisJcy0+aW5pdF9vZmYrPXJldDsKKwlzLT5pbml0X251bS09cmV0OworCXJldHVybigwKTsKKwl9CisKK3N0YXRpYyBpbnQgc3NsX210X2Vycm9yKGludCBuKQorCXsKKwlpbnQgcmV0OworCisJc3dpdGNoIChuKQorCQl7CisJY2FzZSBTU0wyX1BFX05PX0NJUEhFUjoKKwkJcmV0PVNTTF9SX1BFRVJfRVJST1JfTk9fQ0lQSEVSOworCQlicmVhazsKKwljYXNlIFNTTDJfUEVfTk9fQ0VSVElGSUNBVEU6CisJCXJldD1TU0xfUl9QRUVSX0VSUk9SX05PX0NFUlRJRklDQVRFOworCQlicmVhazsKKwljYXNlIFNTTDJfUEVfQkFEX0NFUlRJRklDQVRFOgorCQlyZXQ9U1NMX1JfUEVFUl9FUlJPUl9DRVJUSUZJQ0FURTsKKwkJYnJlYWs7CisJY2FzZSBTU0wyX1BFX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFX1RZUEU6CisJCXJldD1TU0xfUl9QRUVSX0VSUk9SX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFX1RZUEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldD1TU0xfUl9VTktOT1dOX1JFTU9URV9FUlJPUl9UWVBFOworCQlicmVhazsKKwkJfQorCXJldHVybihyZXQpOworCX0KKyNlbHNlIC8qICFPUEVOU1NMX05PX1NTTDIgKi8KKworIyBpZiBQRURBTlRJQworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyMgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvczJfc3J2ci5jIGIvbGliL29wZW5zc2wvc3NsL3MyX3NydnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDM0ZTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3MyX3NydnIuYwpAQCAtMCwwICsxLDExNDMgQEAKKy8qIHNzbC9zMl9zcnZyLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworCisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICpzc2wyX2dldF9zZXJ2ZXJfbWV0aG9kKGludCB2ZXIpOworc3RhdGljIGludCBnZXRfY2xpZW50X21hc3Rlcl9rZXkoU1NMICpzKTsKK3N0YXRpYyBpbnQgZ2V0X2NsaWVudF9oZWxsbyhTU0wgKnMpOworc3RhdGljIGludCBzZXJ2ZXJfaGVsbG8oU1NMICpzKTsgCitzdGF0aWMgaW50IGdldF9jbGllbnRfZmluaXNoZWQoU1NMICpzKTsKK3N0YXRpYyBpbnQgc2VydmVyX3ZlcmlmeShTU0wgKnMpOworc3RhdGljIGludCBzZXJ2ZXJfZmluaXNoKFNTTCAqcyk7CitzdGF0aWMgaW50IHJlcXVlc3RfY2VydGlmaWNhdGUoU1NMICpzKTsKK3N0YXRpYyBpbnQgc3NsX3JzYV9wcml2YXRlX2RlY3J5cHQoQ0VSVCAqYywgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqZnJvbSwKKwl1bnNpZ25lZCBjaGFyICp0byxpbnQgcGFkZGluZyk7CisjZGVmaW5lIEJSRUFLCWJyZWFrCisKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICpzc2wyX2dldF9zZXJ2ZXJfbWV0aG9kKGludCB2ZXIpCisJeworCWlmICh2ZXIgPT0gU1NMMl9WRVJTSU9OKQorCQlyZXR1cm4oU1NMdjJfc2VydmVyX21ldGhvZCgpKTsKKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKK0lNUExFTUVOVF9zc2wyX21ldGhfZnVuYyhTU0x2Ml9zZXJ2ZXJfbWV0aG9kLAorCQkJc3NsMl9hY2NlcHQsCisJCQlzc2xfdW5kZWZpbmVkX2Z1bmN0aW9uLAorCQkJc3NsMl9nZXRfc2VydmVyX21ldGhvZCkKKworaW50IHNzbDJfYWNjZXB0KFNTTCAqcykKKwl7CisJdW5zaWduZWQgbG9uZyBsPSh1bnNpZ25lZCBsb25nKXRpbWUoTlVMTCk7CisJQlVGX01FTSAqYnVmPU5VTEw7CisJaW50IHJldD0gLTE7CisJbG9uZyBudW0xOworCXZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsaW50IHR5cGUsaW50IHZhbCk9TlVMTDsKKwlpbnQgbmV3X3N0YXRlLHN0YXRlOworCisJUkFORF9hZGQoJmwsc2l6ZW9mKGwpLDApOworCUVSUl9jbGVhcl9lcnJvcigpOworCWNsZWFyX3N5c19lcnJvcigpOworCisJaWYgKHMtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJY2I9cy0+aW5mb19jYWxsYmFjazsKKwllbHNlIGlmIChzLT5jdHgtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJY2I9cy0+Y3R4LT5pbmZvX2NhbGxiYWNrOworCisJLyogaW5pdCB0aGluZ3MgdG8gYmxhbmsgKi8KKwlzLT5pbl9oYW5kc2hha2UrKzsKKwlpZiAoIVNTTF9pbl9pbml0KHMpIHx8IFNTTF9pbl9iZWZvcmUocykpIFNTTF9jbGVhcihzKTsKKworCWlmIChzLT5jZXJ0ID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDJfQUNDRVBULFNTTF9SX05PX0NFUlRJRklDQVRFX1NFVCk7CisJCXJldHVybigtMSk7CisJCX0KKworCWNsZWFyX3N5c19lcnJvcigpOworCWZvciAoOzspCisJCXsKKwkJc3RhdGU9cy0+c3RhdGU7CisKKwkJc3dpdGNoIChzLT5zdGF0ZSkKKwkJCXsKKwkJY2FzZSBTU0xfU1RfQkVGT1JFOgorCQljYXNlIFNTTF9TVF9BQ0NFUFQ6CisJCWNhc2UgU1NMX1NUX0JFRk9SRXxTU0xfU1RfQUNDRVBUOgorCQljYXNlIFNTTF9TVF9PS3xTU0xfU1RfQUNDRVBUOgorCisJCQlzLT5zZXJ2ZXI9MTsKKwkJCWlmIChjYiAhPSBOVUxMKSBjYihzLFNTTF9DQl9IQU5EU0hBS0VfU1RBUlQsMSk7CisKKwkJCXMtPnZlcnNpb249U1NMMl9WRVJTSU9OOworCQkJcy0+dHlwZT1TU0xfU1RfQUNDRVBUOworCisJCQlidWY9cy0+aW5pdF9idWY7CisJCQlpZiAoKGJ1ZiA9PSBOVUxMKSAmJiAoKGJ1Zj1CVUZfTUVNX25ldygpKSA9PSBOVUxMKSkKKwkJCQl7IHJldD0gLTE7IGdvdG8gZW5kOyB9CisJCQlpZiAoIUJVRl9NRU1fZ3JvdyhidWYsKGludCkKKwkJCQlTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIpKQorCQkJCXsgcmV0PSAtMTsgZ290byBlbmQ7IH0KKwkJCXMtPmluaXRfYnVmPWJ1ZjsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlzLT5jdHgtPnN0YXRzLnNlc3NfYWNjZXB0Kys7CisJCQlzLT5oYW5kc2hha2VfZnVuYz1zc2wyX2FjY2VwdDsKKwkJCXMtPnN0YXRlPVNTTDJfU1RfR0VUX0NMSUVOVF9IRUxMT19BOworCQkJQlJFQUs7CisKKwkJY2FzZSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQToKKwkJY2FzZSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQjoKKwkJY2FzZSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQzoKKwkJCXMtPnNodXRkb3duPTA7CisJCQlyZXQ9Z2V0X2NsaWVudF9oZWxsbyhzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5pbml0X251bT0wOworCQkJcy0+c3RhdGU9U1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19BOworCQkJQlJFQUs7CisKKwkJY2FzZSBTU0wyX1NUX1NFTkRfU0VSVkVSX0hFTExPX0E6CisJCWNhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19COgorCQkJcmV0PXNlcnZlcl9oZWxsbyhzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5pbml0X251bT0wOworCQkJaWYgKCFzLT5oaXQpCisJCQkJeworCQkJCXMtPnN0YXRlPVNTTDJfU1RfR0VUX0NMSUVOVF9NQVNURVJfS0VZX0E7CisJCQkJQlJFQUs7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlzLT5zdGF0ZT1TU0wyX1NUX1NFUlZFUl9TVEFSVF9FTkNSWVBUSU9OOworCQkJCUJSRUFLOworCQkJCX0KKwkJY2FzZSBTU0wyX1NUX0dFVF9DTElFTlRfTUFTVEVSX0tFWV9BOgorCQljYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9NQVNURVJfS0VZX0I6CisJCQlyZXQ9Z2V0X2NsaWVudF9tYXN0ZXJfa2V5KHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlzLT5zdGF0ZT1TU0wyX1NUX1NFUlZFUl9TVEFSVF9FTkNSWVBUSU9OOworCQkJQlJFQUs7CisKKwkJY2FzZSBTU0wyX1NUX1NFUlZFUl9TVEFSVF9FTkNSWVBUSU9OOgorCQkJLyogT2sgd2UgaG93IGhhdmUgc2VudCBhbGwgdGhlIHN0dWZmIG5lZWRlZCB0bworCQkJICogc3RhcnQgZW5jcnlwdGluZywgdGhlIG5leHQgcGFja2V0IGJhY2sgd2lsbAorCQkJICogYmUgZW5jcnlwdGVkLiAqLworCQkJaWYgKCFzc2wyX2VuY19pbml0KHMsMCkpCisJCQkJeyByZXQ9IC0xOyBnb3RvIGVuZDsgfQorCQkJcy0+czItPmNsZWFyX3RleHQ9MDsKKwkJCXMtPnN0YXRlPVNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0E7CisJCQlCUkVBSzsKKworCQljYXNlIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0E6CisJCWNhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9WRVJJRllfQjoKKwkJCXJldD1zZXJ2ZXJfdmVyaWZ5KHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlpZiAocy0+aGl0KQorCQkJCXsKKwkJCQkvKiBJZiB3ZSBhcmUgaW4gaGVyZSwgd2UgaGF2ZSBiZWVuCisJCQkJICogYnVmZmVyaW5nIHRoZSBvdXRwdXQsIHNvIHdlIG5lZWQgdG8KKwkJCQkgKiBmbHVzaCBpdCBhbmQgcmVtb3ZlIGJ1ZmZlcmluZyBmcm9tCisJCQkJICogZnV0dXJlIHRyYWZmaWMgKi8KKwkJCQlzLT5zdGF0ZT1TU0wyX1NUX1NFTkRfU0VSVkVSX1ZFUklGWV9DOworCQkJCUJSRUFLOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJcy0+c3RhdGU9U1NMMl9TVF9HRVRfQ0xJRU5UX0ZJTklTSEVEX0E7CisJCQkJYnJlYWs7CisJCQkJfQorCisgCQljYXNlIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0M6CisgCQkJLyogZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKyAJCQludW0xPUJJT19jdHJsKHMtPndiaW8sQklPX0NUUkxfSU5GTywwLE5VTEwpOworIAkJCWlmIChudW0xID4gMCkKKyAJCQkJeworCQkJCXMtPnJ3c3RhdGU9U1NMX1dSSVRJTkc7CisgCQkJCW51bTE9QklPX2ZsdXNoKHMtPndiaW8pOworIAkJCQlpZiAobnVtMSA8PSAwKSB7IHJldD0gLTE7IGdvdG8gZW5kOyB9CisJCQkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJCQl9CisKKyAJCQkvKiBmbHVzaGVkIGFuZCBub3cgcmVtb3ZlIGJ1ZmZlcmluZyAqLworIAkJCXMtPndiaW89QklPX3BvcChzLT53YmlvKTsKKworIAkJCXMtPnN0YXRlPVNTTDJfU1RfR0VUX0NMSUVOVF9GSU5JU0hFRF9BOworICAJCQlCUkVBSzsKKworCQljYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9GSU5JU0hFRF9BOgorCQljYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9GSU5JU0hFRF9COgorCQkJcmV0PWdldF9jbGllbnRfZmluaXNoZWQocyk7CisJCQlpZiAocmV0IDw9IDApCisJCQkJZ290byBlbmQ7CisJCQlzLT5pbml0X251bT0wOworCQkJcy0+c3RhdGU9U1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQTsKKwkJCUJSRUFLOworCisJCWNhc2UgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQToKKwkJY2FzZSBTU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9COgorCQljYXNlIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0M6CisJCWNhc2UgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfRDoKKwkJCS8qIGRvbid0IGRvIGEgJ3JlcXVlc3QgY2VydGlmaWNhdGUnIGlmIHdlCisJCQkgKiBkb24ndCB3YW50IHRvLCBvciB3ZSBhbHJlYWR5IGhhdmUgb25lLCBhbmQKKwkJCSAqIHdlIG9ubHkgd2FudCB0byBkbyBpdCBvbmNlLiAqLworCQkJaWYgKCEocy0+dmVyaWZ5X21vZGUgJiBTU0xfVkVSSUZZX1BFRVIpIHx8CisJCQkJKChzLT5zZXNzaW9uLT5wZWVyICE9IE5VTEwpICYmCisJCQkJKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9DTElFTlRfT05DRSkpKQorCQkJCXsKKwkJCQlzLT5zdGF0ZT1TU0wyX1NUX1NFTkRfU0VSVkVSX0ZJTklTSEVEX0E7CisJCQkJYnJlYWs7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlyZXQ9cmVxdWVzdF9jZXJ0aWZpY2F0ZShzKTsKKwkJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJCXMtPmluaXRfbnVtPTA7CisJCQkJcy0+c3RhdGU9U1NMMl9TVF9TRU5EX1NFUlZFUl9GSU5JU0hFRF9BOworCQkJCX0KKwkJCUJSRUFLOworCisJCWNhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9GSU5JU0hFRF9BOgorCQljYXNlIFNTTDJfU1RfU0VORF9TRVJWRVJfRklOSVNIRURfQjoKKwkJCXJldD1zZXJ2ZXJfZmluaXNoKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlzLT5zdGF0ZT1TU0xfU1RfT0s7CisJCQlicmVhazsKKworCQljYXNlIFNTTF9TVF9PSzoKKwkJCUJVRl9NRU1fZnJlZShzLT5pbml0X2J1Zik7CisJCQlzc2xfZnJlZV93YmlvX2J1ZmZlcihzKTsKKwkJCXMtPmluaXRfYnVmPU5VTEw7CisJCQlzLT5pbml0X251bT0wOworCQkvKglFUlJfY2xlYXJfZXJyb3IoKTsqLworCisJCQlzc2xfdXBkYXRlX2NhY2hlKHMsU1NMX1NFU1NfQ0FDSEVfU0VSVkVSKTsKKworCQkJcy0+Y3R4LT5zdGF0cy5zZXNzX2FjY2VwdF9nb29kKys7CisJCQkvKiBzLT5zZXJ2ZXI9MTsgKi8KKwkJCXJldD0xOworCisJCQlpZiAoY2IgIT0gTlVMTCkgY2IocyxTU0xfQ0JfSEFORFNIQUtFX0RPTkUsMSk7CisKKwkJCWdvdG8gZW5kOworCQkJLyogQlJFQUs7ICovCisKKwkJZGVmYXVsdDoKKwkJCVNTTGVycihTU0xfRl9TU0wyX0FDQ0VQVCxTU0xfUl9VTktOT1dOX1NUQVRFKTsKKwkJCXJldD0gLTE7CisJCQlnb3RvIGVuZDsKKwkJCS8qIEJSRUFLOyAqLworCQkJfQorCQkKKwkJaWYgKChjYiAhPSBOVUxMKSAmJiAocy0+c3RhdGUgIT0gc3RhdGUpKQorCQkJeworCQkJbmV3X3N0YXRlPXMtPnN0YXRlOworCQkJcy0+c3RhdGU9c3RhdGU7CisJCQljYihzLFNTTF9DQl9BQ0NFUFRfTE9PUCwxKTsKKwkJCXMtPnN0YXRlPW5ld19zdGF0ZTsKKwkJCX0KKwkJfQorZW5kOgorCXMtPmluX2hhbmRzaGFrZS0tOworCWlmIChjYiAhPSBOVUxMKQorCQljYihzLFNTTF9DQl9BQ0NFUFRfRVhJVCxyZXQpOworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBnZXRfY2xpZW50X21hc3Rlcl9rZXkoU1NMICpzKQorCXsKKwlpbnQgaXNfZXhwb3J0LGksbixrZXlhLGVrOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXVuc2lnbmVkIGNoYXIgKnA7CisJY29uc3QgU1NMX0NJUEhFUiAqY3A7CisJY29uc3QgRVZQX0NJUEhFUiAqYzsKKwljb25zdCBFVlBfTUQgKm1kOworCisJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCWlmIChzLT5zdGF0ZSA9PSBTU0wyX1NUX0dFVF9DTElFTlRfTUFTVEVSX0tFWV9BKQorCQl7CisJCWk9c3NsMl9yZWFkKHMsKGNoYXIgKikmKHBbcy0+aW5pdF9udW1dKSwxMC1zLT5pbml0X251bSk7CisKKwkJaWYgKGkgPCAoMTAtcy0+aW5pdF9udW0pKQorCQkJcmV0dXJuKHNzbDJfcGFydF9yZWFkKHMsU1NMX0ZfR0VUX0NMSUVOVF9NQVNURVJfS0VZLGkpKTsKKwkJcy0+aW5pdF9udW0gPSAxMDsKKworCQlpZiAoKihwKyspICE9IFNTTDJfTVRfQ0xJRU5UX01BU1RFUl9LRVkpCisJCQl7CisJCQlpZiAocFstMV0gIT0gU1NMMl9NVF9FUlJPUikKKwkJCQl7CisJCQkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCQkJU1NMZXJyKFNTTF9GX0dFVF9DTElFTlRfTUFTVEVSX0tFWSxTU0xfUl9SRUFEX1dST05HX1BBQ0tFVF9UWVBFKTsKKwkJCQl9CisJCQllbHNlCisJCQkJU1NMZXJyKFNTTF9GX0dFVF9DTElFTlRfTUFTVEVSX0tFWSwgU1NMX1JfUEVFUl9FUlJPUik7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCisJCWNwPXNzbDJfZ2V0X2NpcGhlcl9ieV9jaGFyKHApOworCQlpZiAoY3AgPT0gTlVMTCkKKwkJCXsKKwkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9OT19DSVBIRVIpOworCQkJU1NMZXJyKFNTTF9GX0dFVF9DTElFTlRfTUFTVEVSX0tFWSwgU1NMX1JfTk9fQ0lQSEVSX01BVENIKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCXMtPnNlc3Npb24tPmNpcGhlcj0gY3A7CisKKwkJcCs9MzsKKwkJbjJzKHAsaSk7IHMtPnMyLT50bXAuY2xlYXI9aTsKKwkJbjJzKHAsaSk7IHMtPnMyLT50bXAuZW5jPWk7CisJCW4ycyhwLGkpOyBzLT5zZXNzaW9uLT5rZXlfYXJnX2xlbmd0aD1pOworCQlpZihzLT5zZXNzaW9uLT5rZXlfYXJnX2xlbmd0aCA+IFNTTF9NQVhfS0VZX0FSR19MRU5HVEgpCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX01BU1RFUl9LRVksIFNTTF9SX0tFWV9BUkdfVE9PX0xPTkcpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlzLT5zdGF0ZT1TU0wyX1NUX0dFVF9DTElFTlRfTUFTVEVSX0tFWV9COworCQl9CisKKwkvKiBTU0wyX1NUX0dFVF9DTElFTlRfTUFTVEVSX0tFWV9CICovCisJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCWlmIChzLT5pbml0X2J1Zi0+bGVuZ3RoIDwgU1NMMl9NQVhfUkVDT1JEX0xFTkdUSF8zX0JZVEVfSEVBREVSKQorCQl7CisJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQlTU0xlcnIoU1NMX0ZfR0VUX0NMSUVOVF9NQVNURVJfS0VZLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCXJldHVybiAtMTsKKwkJfQorCWtleWE9cy0+c2Vzc2lvbi0+a2V5X2FyZ19sZW5ndGg7CisJbGVuID0gMTAgKyAodW5zaWduZWQgbG9uZylzLT5zMi0+dG1wLmNsZWFyICsgKHVuc2lnbmVkIGxvbmcpcy0+czItPnRtcC5lbmMgKyAodW5zaWduZWQgbG9uZylrZXlhOworCWlmIChsZW4gPiBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIpCisJCXsKKwkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX01BU1RFUl9LRVksU1NMX1JfTUVTU0FHRV9UT09fTE9ORyk7CisJCXJldHVybiAtMTsKKwkJfQorCW4gPSAoaW50KWxlbiAtIHMtPmluaXRfbnVtOworCWkgPSBzc2wyX3JlYWQocywoY2hhciAqKSYocFtzLT5pbml0X251bV0pLG4pOworCWlmIChpICE9IG4pIHJldHVybihzc2wyX3BhcnRfcmVhZChzLFNTTF9GX0dFVF9DTElFTlRfTUFTVEVSX0tFWSxpKSk7CisJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIDAsIHAsIChzaXplX3QpbGVuLCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsgLyogQ0xJRU5ULU1BU1RFUi1LRVkgKi8KKwlwICs9IDEwOworCisJbWVtY3B5KHMtPnNlc3Npb24tPmtleV9hcmcsJihwW3MtPnMyLT50bXAuY2xlYXIrcy0+czItPnRtcC5lbmNdKSwKKwkJKHVuc2lnbmVkIGludClrZXlhKTsKKworCWlmIChzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS5wcml2YXRla2V5ID09IE5VTEwpCisJCXsKKwkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX01BU1RFUl9LRVksU1NMX1JfTk9fUFJJVkFURUtFWSk7CisJCXJldHVybigtMSk7CisJCX0KKwlpPXNzbF9yc2FfcHJpdmF0ZV9kZWNyeXB0KHMtPmNlcnQscy0+czItPnRtcC5lbmMsCisJCSYocFtzLT5zMi0+dG1wLmNsZWFyXSksJihwW3MtPnMyLT50bXAuY2xlYXJdKSwKKwkJKHMtPnMyLT5zc2wyX3JvbGxiYWNrKT9SU0FfU1NMVjIzX1BBRERJTkc6UlNBX1BLQ1MxX1BBRERJTkcpOworCisJaXNfZXhwb3J0PVNTTF9DX0lTX0VYUE9SVChzLT5zZXNzaW9uLT5jaXBoZXIpOworCQorCWlmICghc3NsX2NpcGhlcl9nZXRfZXZwKHMtPnNlc3Npb24sJmMsJm1kLE5VTEwsTlVMTCxOVUxMKSkKKwkJeworCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfTk9fQ0lQSEVSKTsKKwkJU1NMZXJyKFNTTF9GX0dFVF9DTElFTlRfTUFTVEVSX0tFWSxTU0xfUl9QUk9CTEVNU19NQVBQSU5HX0NJUEhFUl9GVU5DVElPTlMpOworCQlyZXR1cm4oMCk7CisJCX0KKworCWlmIChzLT5zZXNzaW9uLT5jaXBoZXItPmFsZ29yaXRobTIgJiBTU0wyX0NGXzhfQllURV9FTkMpCisJCXsKKwkJaXNfZXhwb3J0PTE7CisJCWVrPTg7CisJCX0KKwllbHNlCisJCWVrPTU7CisKKwkvKiBiYWQgZGVjcnlwdCAqLworI2lmIDEKKwkvKiBJZiBhIGJhZCBkZWNyeXB0LCBjb250aW51ZSB3aXRoIHByb3RvY29sIGJ1dCB3aXRoIGEKKwkgKiByYW5kb20gbWFzdGVyIHNlY3JldCAoQmxlaWNoZW5iYWNoZXIgYXR0YWNrKSAqLworCWlmICgoaSA8IDApIHx8CisJCSgoIWlzX2V4cG9ydCAmJiAoaSAhPSBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoYykpKQorCQl8fCAoaXNfZXhwb3J0ICYmICgoaSAhPSBlaykgfHwgKHMtPnMyLT50bXAuY2xlYXIrKHVuc2lnbmVkIGludClpICE9CisJCQkodW5zaWduZWQgaW50KUVWUF9DSVBIRVJfa2V5X2xlbmd0aChjKSkpKSkpCisJCXsKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCWlmIChpc19leHBvcnQpCisJCQlpPWVrOworCQllbHNlCisJCQlpPUVWUF9DSVBIRVJfa2V5X2xlbmd0aChjKTsKKwkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKHAsaSkgPD0gMCkKKwkJCXJldHVybiAwOworCQl9CisjZWxzZQorCWlmIChpIDwgMCkKKwkJeworCQllcnJvcj0xOworCQlTU0xlcnIoU1NMX0ZfR0VUX0NMSUVOVF9NQVNURVJfS0VZLFNTTF9SX0JBRF9SU0FfREVDUllQVCk7CisJCX0KKwkvKiBpbmNvcnJlY3QgbnVtYmVyIG9mIGtleSBieXRlcyBmb3Igbm9uIGV4cG9ydCBjaXBoZXIgKi8KKwllbHNlIGlmICgoIWlzX2V4cG9ydCAmJiAoaSAhPSBFVlBfQ0lQSEVSX2tleV9sZW5ndGgoYykpKQorCQl8fCAoaXNfZXhwb3J0ICYmICgoaSAhPSBlaykgfHwgKHMtPnMyLT50bXAuY2xlYXIraSAhPQorCQkJRVZQX0NJUEhFUl9rZXlfbGVuZ3RoKGMpKSkpKQorCQl7CisJCWVycm9yPTE7CisJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX01BU1RFUl9LRVksU1NMX1JfV1JPTkdfTlVNQkVSX09GX0tFWV9CSVRTKTsKKwkJfQorCWlmIChlcnJvcikKKwkJeworCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorI2VuZGlmCisKKwlpZiAoaXNfZXhwb3J0KSBpKz1zLT5zMi0+dG1wLmNsZWFyOworCisJaWYgKGkgPiBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIKQorCQl7CisJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQlTU0xlcnIoU1NMX0ZfR0VUX0NMSUVOVF9NQVNURVJfS0VZLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCXJldHVybiAtMTsKKwkJfQorCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoPWk7CisJbWVtY3B5KHMtPnNlc3Npb24tPm1hc3Rlcl9rZXkscCwodW5zaWduZWQgaW50KWkpOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgZ2V0X2NsaWVudF9oZWxsbyhTU0wgKnMpCisJeworCWludCBpLG47CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgY2hhciAqcDsKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqY3M7IC8qIGEgc3RhY2sgb2YgU1NMX0NJUEhFUlMgKi8KKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2w7IC8qIHRoZSBvbmVzIHdlIHdhbnQgdG8gdXNlICovCisJU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnByaW8sICphbGxvdzsKKwlpbnQgejsKKworCS8qIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrIHRvIGNoZWNrIGZvciB0aGUgY29ycmVjdCBwYWNrZXQKKwkgKiB0eXBlIHRoZSBmaXJzdCB0aW1lIHJvdW5kLiAqLworCWlmIChzLT5zdGF0ZSA9PSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQSkKKwkJeworCQlzLT5maXJzdF9wYWNrZXQ9MTsKKwkJcy0+c3RhdGU9U1NMMl9TVF9HRVRfQ0xJRU5UX0hFTExPX0I7CisJCX0KKworCXA9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKwlpZiAocy0+c3RhdGUgPT0gU1NMMl9TVF9HRVRfQ0xJRU5UX0hFTExPX0IpCisJCXsKKwkJaT1zc2wyX3JlYWQocywoY2hhciAqKSYocFtzLT5pbml0X251bV0pLDktcy0+aW5pdF9udW0pOworCQlpZiAoaSA8ICg5LXMtPmluaXRfbnVtKSkgCisJCQlyZXR1cm4oc3NsMl9wYXJ0X3JlYWQocyxTU0xfRl9HRVRfQ0xJRU5UX0hFTExPLGkpKTsKKwkJcy0+aW5pdF9udW0gPSA5OworCQorCQlpZiAoKihwKyspICE9IFNTTDJfTVRfQ0xJRU5UX0hFTExPKQorCQkJeworCQkJaWYgKHBbLTFdICE9IFNTTDJfTVRfRVJST1IpCisJCQkJeworCQkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQkJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX1JFQURfV1JPTkdfUEFDS0VUX1RZUEUpOworCQkJCX0KKwkJCWVsc2UKKwkJCQlTU0xlcnIoU1NMX0ZfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9QRUVSX0VSUk9SKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCW4ycyhwLGkpOworCQlpZiAoaSA8IHMtPnZlcnNpb24pIHMtPnZlcnNpb249aTsKKwkJbjJzKHAsaSk7IHMtPnMyLT50bXAuY2lwaGVyX3NwZWNfbGVuZ3RoPWk7CisJCW4ycyhwLGkpOyBzLT5zMi0+dG1wLnNlc3Npb25faWRfbGVuZ3RoPWk7CisJCW4ycyhwLGkpOyBzLT5zMi0+Y2hhbGxlbmdlX2xlbmd0aD1pOworCQlpZiAoCShpIDwgU1NMMl9NSU5fQ0hBTExFTkdFX0xFTkdUSCkgfHwKKwkJCShpID4gU1NMMl9NQVhfQ0hBTExFTkdFX0xFTkdUSCkpCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX0lOVkFMSURfQ0hBTExFTkdFX0xFTkdUSCk7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCQlzLT5zdGF0ZT1TU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQzsKKwkJfQorCisJLyogU1NMMl9TVF9HRVRfQ0xJRU5UX0hFTExPX0MgKi8KKwlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJbGVuID0gOSArICh1bnNpZ25lZCBsb25nKXMtPnMyLT50bXAuY2lwaGVyX3NwZWNfbGVuZ3RoICsgKHVuc2lnbmVkIGxvbmcpcy0+czItPmNoYWxsZW5nZV9sZW5ndGggKyAodW5zaWduZWQgbG9uZylzLT5zMi0+dG1wLnNlc3Npb25faWRfbGVuZ3RoOworCWlmIChsZW4gPiBTU0wyX01BWF9SRUNPUkRfTEVOR1RIXzNfQllURV9IRUFERVIpCisJCXsKKwkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX01FU1NBR0VfVE9PX0xPTkcpOworCQlyZXR1cm4gLTE7CisJCX0KKwluID0gKGludClsZW4gLSBzLT5pbml0X251bTsKKwlpID0gc3NsMl9yZWFkKHMsKGNoYXIgKikmKHBbcy0+aW5pdF9udW1dKSxuKTsKKwlpZiAoaSAhPSBuKSByZXR1cm4oc3NsMl9wYXJ0X3JlYWQocyxTU0xfRl9HRVRfQ0xJRU5UX0hFTExPLGkpKTsKKwlpZiAocy0+bXNnX2NhbGxiYWNrKQorCQlzLT5tc2dfY2FsbGJhY2soMCwgcy0+dmVyc2lvbiwgMCwgcCwgKHNpemVfdClsZW4sIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOyAvKiBDTElFTlQtSEVMTE8gKi8KKwlwICs9IDk7CisKKwkvKiBnZXQgc2Vzc2lvbi1pZCBiZWZvcmUgY2lwaGVyIHN0dWZmIHNvIHdlIGNhbiBnZXQgb3V0IHNlc3Npb24KKwkgKiBzdHJ1Y3R1cmUgaWYgaXQgaXMgY2FjaGVkICovCisJLyogc2Vzc2lvbi1pZCAqLworCWlmICgocy0+czItPnRtcC5zZXNzaW9uX2lkX2xlbmd0aCAhPSAwKSAmJiAKKwkJKHMtPnMyLT50bXAuc2Vzc2lvbl9pZF9sZW5ndGggIT0gU1NMMl9TU0xfU0VTU0lPTl9JRF9MRU5HVEgpKQorCQl7CisJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQlTU0xlcnIoU1NMX0ZfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9CQURfU1NMX1NFU1NJT05fSURfTEVOR1RIKTsKKwkJcmV0dXJuKC0xKTsKKwkJfQorCisJaWYgKHMtPnMyLT50bXAuc2Vzc2lvbl9pZF9sZW5ndGggPT0gMCkKKwkJeworCQlpZiAoIXNzbF9nZXRfbmV3X3Nlc3Npb24ocywxKSkKKwkJCXsKKwkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpPXNzbF9nZXRfcHJldl9zZXNzaW9uKHMsJihwW3MtPnMyLT50bXAuY2lwaGVyX3NwZWNfbGVuZ3RoXSksCisJCQlzLT5zMi0+dG1wLnNlc3Npb25faWRfbGVuZ3RoLCBOVUxMKTsKKwkJaWYgKGkgPT0gMSkKKwkJCXsgLyogcHJldmlvdXMgc2Vzc2lvbiAqLworCQkJcy0+aGl0PTE7CisJCQl9CisJCWVsc2UgaWYgKGkgPT0gLTEpCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmIChzLT5jZXJ0ID09IE5VTEwpCisJCQkJeworCQkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9OT19DRVJUSUZJQ0FURSk7CisJCQkJU1NMZXJyKFNTTF9GX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfTk9fQ0VSVElGSUNBVEVfU0VUKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJCX0KKworCQkJaWYgKCFzc2xfZ2V0X25ld19zZXNzaW9uKHMsMSkpCisJCQkJeworCQkJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQkJCXJldHVybigtMSk7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAoIXMtPmhpdCkKKwkJeworCQljcz1zc2xfYnl0ZXNfdG9fY2lwaGVyX2xpc3QocyxwLHMtPnMyLT50bXAuY2lwaGVyX3NwZWNfbGVuZ3RoLAorCQkJJnMtPnNlc3Npb24tPmNpcGhlcnMpOworCQlpZiAoY3MgPT0gTlVMTCkgZ290byBtZW1fZXJyOworCisJCWNsPVNTTF9nZXRfY2lwaGVycyhzKTsKKworCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UpCisJCSAgICB7CisJCSAgICBwcmlvPXNrX1NTTF9DSVBIRVJfZHVwKGNsKTsKKwkJICAgIGlmIChwcmlvID09IE5VTEwpIGdvdG8gbWVtX2VycjsKKwkJICAgIGFsbG93ID0gY3M7CisJCSAgICB9CisJCWVsc2UKKwkJICAgIHsKKwkJICAgIHByaW8gPSBjczsKKwkJICAgIGFsbG93ID0gY2w7CisJCSAgICB9CisJCWZvciAoej0wOyB6PHNrX1NTTF9DSVBIRVJfbnVtKHByaW8pOyB6KyspCisJCQl7CisJCQlpZiAoc2tfU1NMX0NJUEhFUl9maW5kKGFsbG93LHNrX1NTTF9DSVBIRVJfdmFsdWUocHJpbyx6KSkgPCAwKQorCQkJCXsKKwkJCQkodm9pZClza19TU0xfQ0lQSEVSX2RlbGV0ZShwcmlvLHopOworCQkJCXotLTsKKwkJCQl9CisJCQl9CisJCWlmIChzLT5vcHRpb25zICYgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSkKKwkJICAgIHsKKwkJICAgIHNrX1NTTF9DSVBIRVJfZnJlZShzLT5zZXNzaW9uLT5jaXBoZXJzKTsKKwkJICAgIHMtPnNlc3Npb24tPmNpcGhlcnMgPSBwcmlvOworCQkgICAgfQorCQkvKiBzLT5zZXNzaW9uLT5jaXBoZXJzIHNob3VsZCBub3cgaGF2ZSBhIGxpc3Qgb2YKKwkJICogY2lwaGVycyB0aGF0IGFyZSBvbiBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KKwkJICogVGhpcyBsaXN0IGlzIG9yZGVyZWQgYnkgdGhlIG9yZGVyIHRoZSBjbGllbnQgc2VudAorCQkgKiB0aGUgY2lwaGVycyBvciBpbiB0aGUgb3JkZXIgb2YgdGhlIHNlcnZlcidzIHByZWZlcmVuY2UKKwkJICogaWYgU1NMX09QX0NJUEhFUl9TRVJWRVJfUFJFRkVSRU5DRSB3YXMgc2V0LgorCQkgKi8KKwkJfQorCXArPXMtPnMyLT50bXAuY2lwaGVyX3NwZWNfbGVuZ3RoOworCS8qIGRvbmUgY2lwaGVyIHNlbGVjdGlvbiAqLworCisJLyogc2Vzc2lvbiBpZCBleHRyYWN0ZWQgYWxyZWFkeSAqLworCXArPXMtPnMyLT50bXAuc2Vzc2lvbl9pZF9sZW5ndGg7CisKKwkvKiBjaGFsbGVuZ2UgKi8KKwlpZiAocy0+czItPmNoYWxsZW5nZV9sZW5ndGggPiBzaXplb2Ygcy0+czItPmNoYWxsZW5nZSkKKwkJeworCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJU1NMZXJyKFNTTF9GX0dFVF9DTElFTlRfSEVMTE8sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJcmV0dXJuIC0xOworCQl9CisJbWVtY3B5KHMtPnMyLT5jaGFsbGVuZ2UscCwodW5zaWduZWQgaW50KXMtPnMyLT5jaGFsbGVuZ2VfbGVuZ3RoKTsKKwlyZXR1cm4oMSk7CittZW1fZXJyOgorCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX0hFTExPLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwlyZXR1cm4oMCk7CisJfQorCitzdGF0aWMgaW50IHNlcnZlcl9oZWxsbyhTU0wgKnMpCisJeworCXVuc2lnbmVkIGNoYXIgKnAsKmQ7CisJaW50IG4saGl0OworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpzazsKKworCXA9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKwlpZiAocy0+c3RhdGUgPT0gU1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19BKQorCQl7CisJCWQ9cCsxMTsKKwkJKihwKyspPVNTTDJfTVRfU0VSVkVSX0hFTExPOwkJLyogdHlwZSAqLworCQloaXQ9cy0+aGl0OworCQkqKHArKyk9KHVuc2lnbmVkIGNoYXIpaGl0OworI2lmIDEKKwkJaWYgKCFoaXQpCisJCQl7CisJCQlpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ICE9IE5VTEwpCisJCQkJLyogVGhpcyBjYW4ndCByZWFsbHkgaGFwcGVuIGJlY2F1c2UgZ2V0X2NsaWVudF9oZWxsbworCQkJCSAqIGhhcyBjYWxsZWQgc3NsX2dldF9uZXdfc2Vzc2lvbiwgd2hpY2ggZG9lcyBub3Qgc2V0CisJCQkJICogc2Vzc19jZXJ0LiAqLworCQkJCXNzbF9zZXNzX2NlcnRfZnJlZShzLT5zZXNzaW9uLT5zZXNzX2NlcnQpOworCQkJcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ID0gc3NsX3Nlc3NfY2VydF9uZXcoKTsKKwkJCWlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NFUlZFUl9IRUxMTywgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCXJldHVybigtMSk7CisJCQkJfQorCQkJfQorCQkvKiBJZiAnaGl0JyBpcyBzZXQsIHRoZW4gcy0+c2Vzc19jZXJ0IG1heSBiZSBub24tTlVMTCBvciBOVUxMLAorCQkgKiBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBzdXJ2aXZlZCBpbiB0aGUgaW50ZXJuYWwgY2FjaGUKKwkJICogb3Igd2FzIHJldHJpZXZlZCBmcm9tIGFuIGV4dGVybmFsIGNhY2hlLgorCQkgKiBJZiBpdCBpcyBOVUxMLCB3ZSBjYW5ub3QgcHV0IGFueSB1c2VmdWwgZGF0YSBpbiBpdCBhbnl3YXksCisJCSAqIHNvIHdlIGRvbid0IHRvdWNoIGl0LgorCQkgKi8KKworI2Vsc2UgLyogVGhhdCdzIHdoYXQgdXNlZCB0byBiZSBkb25lIHdoZW4gY2VydF9zdCBhbmQgc2Vzc19jZXJ0X3N0IHdlcmUKKwkgICAqIHRoZSBzYW1lLiAqLworCQlpZiAoIWhpdCkKKwkJCXsJCQkvKiBlbHNlIGFkZCBjZXJ0IHRvIHNlc3Npb24gKi8KKwkJCUNSWVBUT19hZGQoJnMtPmNlcnQtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19TU0xfQ0VSVCk7CisJCQlpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ICE9IE5VTEwpCisJCQkJc3NsX2NlcnRfZnJlZShzLT5zZXNzaW9uLT5zZXNzX2NlcnQpOworCQkJcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0PXMtPmNlcnQ7CQkKKwkJCX0KKwkJZWxzZQkvKiBXZSBoYXZlIGEgc2Vzc2lvbiBpZC1jYWNoZSBoaXQsIGlmIHRoZQorCQkJICogc2Vzc2lvbi1pZCBoYXMgbm8gY2VydGlmaWNhdGUgbGlzdGVkIGFnYWluc3QKKwkJCSAqIHRoZSAnY2VydCcgc3RydWN0dXJlLCBncmFiIHRoZSAnb2xkJyBvbmUKKwkJCSAqIGxpc3RlZCBhZ2FpbnN0IHRoZSBTU0wgY29ubmVjdGlvbiAqLworCQkJeworCQkJaWYgKHMtPnNlc3Npb24tPnNlc3NfY2VydCA9PSBOVUxMKQorCQkJCXsKKwkJCQlDUllQVE9fYWRkKCZzLT5jZXJ0LT5yZWZlcmVuY2VzLDEsCisJCQkJCUNSWVBUT19MT0NLX1NTTF9DRVJUKTsKKwkJCQlzLT5zZXNzaW9uLT5zZXNzX2NlcnQ9cy0+Y2VydDsKKwkJCQl9CisJCQl9CisjZW5kaWYKKworCQlpZiAocy0+Y2VydCA9PSBOVUxMKQorCQkJeworCQkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX05PX0NFUlRJRklDQVRFKTsKKwkJCVNTTGVycihTU0xfRl9TRVJWRVJfSEVMTE8sU1NMX1JfTk9fQ0VSVElGSUNBVEVfU1BFQ0lGSUVEKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisKKwkJaWYgKGhpdCkKKwkJCXsKKwkJCSoocCsrKT0wOwkJLyogbm8gY2VydGlmaWNhdGUgdHlwZSAqLworCQkJczJuKHMtPnZlcnNpb24scCk7CS8qIHZlcnNpb24gKi8KKwkJCXMybigwLHApOwkJLyogY2VydCBsZW4gKi8KKwkJCXMybigwLHApOwkJLyogY2lwaGVycyBsZW4gKi8KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJLyogRUFZIEVBWSAqLworCQkJLyogcHV0IGNlcnRpZmljYXRlIHR5cGUgKi8KKwkJCSoocCsrKT1TU0wyX0NUX1g1MDlfQ0VSVElGSUNBVEU7CisJCQlzMm4ocy0+dmVyc2lvbixwKTsJLyogdmVyc2lvbiAqLworCQkJbj1pMmRfWDUwOShzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS54NTA5LE5VTEwpOworCQkJczJuKG4scCk7CQkvKiBjZXJ0aWZpY2F0ZSBsZW5ndGggKi8KKwkJCWkyZF9YNTA5KHMtPmNlcnQtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLng1MDksJmQpOworCQkJbj0wOworCQkJCisJCQkvKiBsZXRzIHNlbmQgb3V0IHRoZSBjaXBoZXJzIHdlIGxpa2UgaW4gdGhlCisJCQkgKiBwcmVmZXJlZCBvcmRlciAqLworCQkJc2s9IHMtPnNlc3Npb24tPmNpcGhlcnM7CisJCQluPXNzbF9jaXBoZXJfbGlzdF90b19ieXRlcyhzLHMtPnNlc3Npb24tPmNpcGhlcnMsZCwwKTsKKwkJCWQrPW47CisJCQlzMm4obixwKTsJCS8qIGFkZCBjaXBoZXIgbGVuZ3RoICovCisJCQl9CisKKwkJLyogbWFrZSBhbmQgc2VuZCBjb25uX2lkICovCisJCXMybihTU0wyX0NPTk5FQ1RJT05fSURfTEVOR1RILHApOwkvKiBhZGQgY29ubl9pZCBsZW5ndGggKi8KKwkJcy0+czItPmNvbm5faWRfbGVuZ3RoPVNTTDJfQ09OTkVDVElPTl9JRF9MRU5HVEg7CisJCWlmIChSQU5EX3BzZXVkb19ieXRlcyhzLT5zMi0+Y29ubl9pZCwoaW50KXMtPnMyLT5jb25uX2lkX2xlbmd0aCkgPD0gMCkKKwkJCXJldHVybiAtMTsKKwkJbWVtY3B5KGQscy0+czItPmNvbm5faWQsU1NMMl9DT05ORUNUSU9OX0lEX0xFTkdUSCk7CisJCWQrPVNTTDJfQ09OTkVDVElPTl9JRF9MRU5HVEg7CisKKwkJcy0+c3RhdGU9U1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19COworCQlzLT5pbml0X251bT1kLSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKwkvKiBTU0wyX1NUX1NFTkRfU0VSVkVSX0hFTExPX0IgKi8KKyAJLyogSWYgd2UgYXJlIHVzaW5nIFRDUC9JUCwgdGhlIHBlcmZvcm1hbmNlIGlzIGJhZCBpZiB3ZSBkbyAyCisgCSAqIHdyaXRlcyB3aXRob3V0IGEgcmVhZCBiZXR3ZWVuIHRoZW0uICBUaGlzIG9jY3VycyB3aGVuCisgCSAqIFNlc3Npb24taWQgcmV1c2UgaXMgdXNlZCwgc28gSSB3aWxsIHB1dCBpbiBhIGJ1ZmZlcmluZyBtb2R1bGUKKyAJICovCisgCWlmIChzLT5oaXQpCisgCQl7CisJCWlmICghc3NsX2luaXRfd2Jpb19idWZmZXIocywxKSkgcmV0dXJuKC0xKTsKKyAJCX0KKyAKKwlyZXR1cm4oc3NsMl9kb193cml0ZShzKSk7CisJfQorCitzdGF0aWMgaW50IGdldF9jbGllbnRfZmluaXNoZWQoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBpLCBuOworCXVuc2lnbmVkIGxvbmcgbGVuOworCisJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCWlmIChzLT5zdGF0ZSA9PSBTU0wyX1NUX0dFVF9DTElFTlRfRklOSVNIRURfQSkKKwkJeworCQlpPXNzbDJfcmVhZChzLChjaGFyICopJihwW3MtPmluaXRfbnVtXSksMS1zLT5pbml0X251bSk7CisJCWlmIChpIDwgMS1zLT5pbml0X251bSkKKwkJCXJldHVybihzc2wyX3BhcnRfcmVhZChzLFNTTF9GX0dFVF9DTElFTlRfRklOSVNIRUQsaSkpOworCQlzLT5pbml0X251bSArPSBpOworCisJCWlmICgqcCAhPSBTU0wyX01UX0NMSUVOVF9GSU5JU0hFRCkKKwkJCXsKKwkJCWlmICgqcCAhPSBTU0wyX01UX0VSUk9SKQorCQkJCXsKKwkJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCQlTU0xlcnIoU1NMX0ZfR0VUX0NMSUVOVF9GSU5JU0hFRCxTU0xfUl9SRUFEX1dST05HX1BBQ0tFVF9UWVBFKTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX0ZJTklTSEVELFNTTF9SX1BFRVJfRVJST1IpOworCQkJCS8qIHRyeSB0byByZWFkIHRoZSBlcnJvciBtZXNzYWdlICovCisJCQkJaT1zc2wyX3JlYWQocywoY2hhciAqKSYocFtzLT5pbml0X251bV0pLDMtcy0+aW5pdF9udW0pOworCQkJCXJldHVybiBzc2wyX3BhcnRfcmVhZChzLFNTTF9GX0dFVF9TRVJWRVJfVkVSSUZZLGkpOworCQkJCX0KKwkJCXJldHVybigtMSk7CisJCQl9CisJCXMtPnN0YXRlPVNTTDJfU1RfR0VUX0NMSUVOVF9GSU5JU0hFRF9COworCQl9CisKKwkvKiBTU0wyX1NUX0dFVF9DTElFTlRfRklOSVNIRURfQiAqLworCWlmIChzLT5zMi0+Y29ubl9pZF9sZW5ndGggPiBzaXplb2Ygcy0+czItPmNvbm5faWQpCisJCXsKKwkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX1VOREVGSU5FRF9FUlJPUik7CisJCVNTTGVycihTU0xfRl9HRVRfQ0xJRU5UX0ZJTklTSEVELCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCXJldHVybiAtMTsKKwkJfQorCWxlbiA9IDEgKyAodW5zaWduZWQgbG9uZylzLT5zMi0+Y29ubl9pZF9sZW5ndGg7CisJbiA9IChpbnQpbGVuIC0gcy0+aW5pdF9udW07CisJaSA9IHNzbDJfcmVhZChzLChjaGFyICopJihwW3MtPmluaXRfbnVtXSksbik7CisJaWYgKGkgPCBuKQorCQl7CisJCXJldHVybihzc2wyX3BhcnRfcmVhZChzLFNTTF9GX0dFVF9DTElFTlRfRklOSVNIRUQsaSkpOworCQl9CisJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIDAsIHAsIGxlbiwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7IC8qIENMSUVOVC1GSU5JU0hFRCAqLworCXAgKz0gMTsKKwlpZiAobWVtY21wKHAscy0+czItPmNvbm5faWQscy0+czItPmNvbm5faWRfbGVuZ3RoKSAhPSAwKQorCQl7CisJCXNzbDJfcmV0dXJuX2Vycm9yKHMsU1NMMl9QRV9VTkRFRklORURfRVJST1IpOworCQlTU0xlcnIoU1NMX0ZfR0VUX0NMSUVOVF9GSU5JU0hFRCxTU0xfUl9DT05ORUNUSU9OX0lEX0lTX0RJRkZFUkVOVCk7CisJCXJldHVybigtMSk7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCitzdGF0aWMgaW50IHNlcnZlcl92ZXJpZnkoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0EpCisJCXsKKwkJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCQkqKHArKyk9U1NMMl9NVF9TRVJWRVJfVkVSSUZZOworCQlpZiAocy0+czItPmNoYWxsZW5nZV9sZW5ndGggPiBzaXplb2Ygcy0+czItPmNoYWxsZW5nZSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TRVJWRVJfVkVSSUZZLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCW1lbWNweShwLHMtPnMyLT5jaGFsbGVuZ2UsKHVuc2lnbmVkIGludClzLT5zMi0+Y2hhbGxlbmdlX2xlbmd0aCk7CisJCS8qIHArPXMtPnMyLT5jaGFsbGVuZ2VfbGVuZ3RoOyAqLworCisJCXMtPnN0YXRlPVNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0I7CisJCXMtPmluaXRfbnVtPXMtPnMyLT5jaGFsbGVuZ2VfbGVuZ3RoKzE7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKwlyZXR1cm4oc3NsMl9kb193cml0ZShzKSk7CisJfQorCitzdGF0aWMgaW50IHNlcnZlcl9maW5pc2goU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfU0VORF9TRVJWRVJfRklOSVNIRURfQSkKKwkJeworCQlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCSoocCsrKT1TU0wyX01UX1NFUlZFUl9GSU5JU0hFRDsKKworCQlpZiAocy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGggPiBzaXplb2Ygcy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TRVJWRVJfRklOSVNILCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCW1lbWNweShwLHMtPnNlc3Npb24tPnNlc3Npb25faWQsICh1bnNpZ25lZCBpbnQpcy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGgpOworCQkvKiBwKz1zLT5zZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aDsgKi8KKworCQlzLT5zdGF0ZT1TU0wyX1NUX1NFTkRfU0VSVkVSX0ZJTklTSEVEX0I7CisJCXMtPmluaXRfbnVtPXMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoKzE7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKworCS8qIFNTTDJfU1RfU0VORF9TRVJWRVJfRklOSVNIRURfQiAqLworCXJldHVybihzc2wyX2RvX3dyaXRlKHMpKTsKKwl9CisKKy8qIHNlbmQgdGhlIHJlcXVlc3QgYW5kIGNoZWNrIHRoZSByZXNwb25zZSAqLworc3RhdGljIGludCByZXF1ZXN0X2NlcnRpZmljYXRlKFNTTCAqcykKKwl7CisJY29uc3QgdW5zaWduZWQgY2hhciAqY3A7CisJdW5zaWduZWQgY2hhciAqcCwqcDIsKmJ1ZjI7CisJdW5zaWduZWQgY2hhciAqY2NkOworCWludCBpLGosY3R5cGUscmV0PSAtMTsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKwlYNTA5ICp4NTA5PU5VTEw7CisJU1RBQ0tfT0YoWDUwOSkgKnNrPU5VTEw7CisKKwljY2Q9cy0+czItPnRtcC5jY2w7CisJaWYgKHMtPnN0YXRlID09IFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0EpCisJCXsKKwkJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCQkqKHArKyk9U1NMMl9NVF9SRVFVRVNUX0NFUlRJRklDQVRFOworCQkqKHArKyk9U1NMMl9BVF9NRDVfV0lUSF9SU0FfRU5DUllQVElPTjsKKwkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKGNjZCxTU0wyX01JTl9DRVJUX0NIQUxMRU5HRV9MRU5HVEgpIDw9IDApCisJCQlyZXR1cm4gLTE7CisJCW1lbWNweShwLGNjZCxTU0wyX01JTl9DRVJUX0NIQUxMRU5HRV9MRU5HVEgpOworCisJCXMtPnN0YXRlPVNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0I7CisJCXMtPmluaXRfbnVtPVNTTDJfTUlOX0NFUlRfQ0hBTExFTkdFX0xFTkdUSCsyOworCQlzLT5pbml0X29mZj0wOworCQl9CisKKwlpZiAocy0+c3RhdGUgPT0gU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQikKKwkJeworCQlpPXNzbDJfZG9fd3JpdGUocyk7CisJCWlmIChpIDw9IDApCisJCQl7CisJCQlyZXQ9aTsKKwkJCWdvdG8gZW5kOworCQkJfQorCisJCXMtPmluaXRfbnVtPTA7CisJCXMtPnN0YXRlPVNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0M7CisJCX0KKworCWlmIChzLT5zdGF0ZSA9PSBTU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9DKQorCQl7CisJCXA9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKwkJaT1zc2wyX3JlYWQocywoY2hhciAqKSYocFtzLT5pbml0X251bV0pLDYtcy0+aW5pdF9udW0pOyAvKiB0cnkgdG8gcmVhZCA2IG9jdGV0cyAuLi4gKi8KKwkJaWYgKGkgPCAzLXMtPmluaXRfbnVtKSAvKiAuLi4gYnV0IGRvbid0IGNhbGwgc3NsMl9wYXJ0X3JlYWQgbm93IGlmIHdlIGdvdCBhdCBsZWFzdCAzCisJCSAgICAgICAgICAgICAgICAgICAgICAgICogKHByb2JhYmx5IE5PLUNFUlRJRklDQVRFLUVSUk9SKSAqLworCQkJeworCQkJcmV0PXNzbDJfcGFydF9yZWFkKHMsU1NMX0ZfUkVRVUVTVF9DRVJUSUZJQ0FURSxpKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlzLT5pbml0X251bSArPSBpOworCisJCWlmICgocy0+aW5pdF9udW0gPj0gMykgJiYgKHBbMF0gPT0gU1NMMl9NVF9FUlJPUikpCisJCQl7CisJCQluMnMocCxpKTsKKwkJCWlmIChpICE9IFNTTDJfUEVfTk9fQ0VSVElGSUNBVEUpCisJCQkJeworCQkJCS8qIG5vdCB0aGUgZXJyb3IgbWVzc2FnZSB3ZSBleHBlY3RlZCAtLSBsZXQgc3NsMl9wYXJ0X3JlYWQgaGFuZGxlIGl0ICovCisJCQkJcy0+aW5pdF9udW0gLT0gMzsKKwkJCQlyZXQgPSBzc2wyX3BhcnRfcmVhZChzLFNTTF9GX1JFUVVFU1RfQ0VSVElGSUNBVEUsIDMpOworCQkJCWdvdG8gZW5kOworCQkJCX0KKworCQkJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJCQlzLT5tc2dfY2FsbGJhY2soMCwgcy0+dmVyc2lvbiwgMCwgcCwgMywgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7IC8qIEVSUk9SICovCisKKwkJCS8qIHRoaXMgaXMgdGhlIG9uZSBwbGFjZSB3aGVyZSB3ZSBjYW4gcmVjb3ZlciBmcm9tIGFuIFNTTCAyLjAgZXJyb3IgKi8KKworCQkJaWYgKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkKKwkJCQl7CisJCQkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX0JBRF9DRVJUSUZJQ0FURSk7CisJCQkJU1NMZXJyKFNTTF9GX1JFUVVFU1RfQ0VSVElGSUNBVEUsU1NMX1JfUEVFUl9ESURfTk9UX1JFVFVSTl9BX0NFUlRJRklDQVRFKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlyZXQ9MTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQlpZiAoKCoocCsrKSAhPSBTU0wyX01UX0NMSUVOVF9DRVJUSUZJQ0FURSkgfHwgKHMtPmluaXRfbnVtIDwgNikpCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SKTsKKwkJCVNTTGVycihTU0xfRl9SRVFVRVNUX0NFUlRJRklDQVRFLFNTTF9SX1NIT1JUX1JFQUQpOworCQkJZ290byBlbmQ7CisJCQl9CisJCWlmIChzLT5pbml0X251bSAhPSA2KQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1JFUVVFU1RfQ0VSVElGSUNBVEUsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCWdvdG8gZW5kOworCQkJfQorCQkKKwkJLyogb2sgd2UgaGF2ZSBhIHJlc3BvbnNlICovCisJCS8qIGNlcnRpZmljYXRlIHR5cGUsIHRoZXJlIGlzIG9ubHkgb25lIHJpZ2h0IG5vdy4gKi8KKwkJY3R5cGU9ICoocCsrKTsKKwkJaWYgKGN0eXBlICE9IFNTTDJfQVRfTUQ1X1dJVEhfUlNBX0VOQ1JZUFRJT04pCisJCQl7CisJCQlzc2wyX3JldHVybl9lcnJvcihzLFNTTDJfUEVfVU5TVVBQT1JURURfQ0VSVElGSUNBVEVfVFlQRSk7CisJCQlTU0xlcnIoU1NMX0ZfUkVRVUVTVF9DRVJUSUZJQ0FURSxTU0xfUl9CQURfUkVTUE9OU0VfQVJHVU1FTlQpOworCQkJZ290byBlbmQ7CisJCQl9CisJCW4ycyhwLGkpOyBzLT5zMi0+dG1wLmNsZW49aTsKKwkJbjJzKHAsaSk7IHMtPnMyLT50bXAucmxlbj1pOworCQlzLT5zdGF0ZT1TU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9EOworCQl9CisKKwkvKiBTU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9EICovCisJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCWxlbiA9IDYgKyAodW5zaWduZWQgbG9uZylzLT5zMi0+dG1wLmNsZW4gKyAodW5zaWduZWQgbG9uZylzLT5zMi0+dG1wLnJsZW47CisJaWYgKGxlbiA+IFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfM19CWVRFX0hFQURFUikKKwkJeworCQlTU0xlcnIoU1NMX0ZfUkVRVUVTVF9DRVJUSUZJQ0FURSxTU0xfUl9NRVNTQUdFX1RPT19MT05HKTsKKwkJZ290byBlbmQ7CisJCX0KKwlqID0gKGludClsZW4gLSBzLT5pbml0X251bTsKKwlpID0gc3NsMl9yZWFkKHMsKGNoYXIgKikmKHBbcy0+aW5pdF9udW1dKSxqKTsKKwlpZiAoaSA8IGopIAorCQl7CisJCXJldD1zc2wyX3BhcnRfcmVhZChzLFNTTF9GX1JFUVVFU1RfQ0VSVElGSUNBVEUsaSk7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIDAsIHAsIGxlbiwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7IC8qIENMSUVOVC1DRVJUSUZJQ0FURSAqLworCXAgKz0gNjsKKworCWNwID0gcDsKKwl4NTA5PShYNTA5ICopZDJpX1g1MDkoTlVMTCwmY3AsKGxvbmcpcy0+czItPnRtcC5jbGVuKTsKKwlpZiAoeDUwOSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9SRVFVRVNUX0NFUlRJRklDQVRFLEVSUl9SX1g1MDlfTElCKTsKKwkJZ290byBtc2dfZW5kOworCQl9CisKKwlpZiAoKChzaz1za19YNTA5X25ld19udWxsKCkpID09IE5VTEwpIHx8ICghc2tfWDUwOV9wdXNoKHNrLHg1MDkpKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfUkVRVUVTVF9DRVJUSUZJQ0FURSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gbXNnX2VuZDsKKwkJfQorCisJaT1zc2xfdmVyaWZ5X2NlcnRfY2hhaW4ocyxzayk7CisKKwlpZiAoaSA+IDApCS8qIHdlIGxpa2UgdGhlIHBhY2tldCwgbm93IGNoZWNrIHRoZSBjaGtzdW0gKi8KKwkJeworCQlFVlBfTURfQ1RYIGN0eDsKKwkJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKworCQlFVlBfTURfQ1RYX2luaXQoJmN0eCk7CisJCUVWUF9WZXJpZnlJbml0X2V4KCZjdHgscy0+Y3R4LT5yc2FfbWQ1LCBOVUxMKTsKKwkJRVZQX1ZlcmlmeVVwZGF0ZSgmY3R4LHMtPnMyLT5rZXlfbWF0ZXJpYWwsCisJCQkJIHMtPnMyLT5rZXlfbWF0ZXJpYWxfbGVuZ3RoKTsKKwkJRVZQX1ZlcmlmeVVwZGF0ZSgmY3R4LGNjZCxTU0wyX01JTl9DRVJUX0NIQUxMRU5HRV9MRU5HVEgpOworCisJCWk9aTJkX1g1MDkocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfUlNBX0VOQ10ueDUwOSxOVUxMKTsKKwkJYnVmMj1PUEVOU1NMX21hbGxvYygodW5zaWduZWQgaW50KWkpOworCQlpZiAoYnVmMiA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1JFUVVFU1RfQ0VSVElGSUNBVEUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBtc2dfZW5kOworCQkJfQorCQlwMj1idWYyOworCQlpPWkyZF9YNTA5KHMtPmNlcnQtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLng1MDksJnAyKTsKKwkJRVZQX1ZlcmlmeVVwZGF0ZSgmY3R4LGJ1ZjIsKHVuc2lnbmVkIGludClpKTsKKwkJT1BFTlNTTF9mcmVlKGJ1ZjIpOworCisJCXBrZXk9WDUwOV9nZXRfcHVia2V5KHg1MDkpOworCQlpZiAocGtleSA9PSBOVUxMKSBnb3RvIGVuZDsKKwkJaT1FVlBfVmVyaWZ5RmluYWwoJmN0eCxjcCxzLT5zMi0+dG1wLnJsZW4scGtleSk7CisJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKworCQlpZiAoaSA+IDApCisJCQl7CisJCQlpZiAocy0+c2Vzc2lvbi0+cGVlciAhPSBOVUxMKQorCQkJCVg1MDlfZnJlZShzLT5zZXNzaW9uLT5wZWVyKTsKKwkJCXMtPnNlc3Npb24tPnBlZXI9eDUwOTsKKwkJCUNSWVBUT19hZGQoJng1MDktPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5KTsKKwkJCXMtPnNlc3Npb24tPnZlcmlmeV9yZXN1bHQgPSBzLT52ZXJpZnlfcmVzdWx0OworCQkJcmV0PTE7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1JFUVVFU1RfQ0VSVElGSUNBVEUsU1NMX1JfQkFEX0NIRUNLU1VNKTsKKwkJCWdvdG8gbXNnX2VuZDsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworbXNnX2VuZDoKKwkJc3NsMl9yZXR1cm5fZXJyb3IocyxTU0wyX1BFX0JBRF9DRVJUSUZJQ0FURSk7CisJCX0KK2VuZDoKKwlza19YNTA5X2ZyZWUoc2spOworCVg1MDlfZnJlZSh4NTA5KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK3N0YXRpYyBpbnQgc3NsX3JzYV9wcml2YXRlX2RlY3J5cHQoQ0VSVCAqYywgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKnRvLCBpbnQgcGFkZGluZykKKwl7CisJUlNBICpyc2E7CisJaW50IGk7CisKKwlpZiAoKGMgPT0gTlVMTCkgfHwgKGMtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLnByaXZhdGVrZXkgPT0gTlVMTCkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9SU0FfUFJJVkFURV9ERUNSWVBULFNTTF9SX05PX1BSSVZBVEVLRVkpOworCQlyZXR1cm4oLTEpOworCQl9CisJaWYgKGMtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLnByaXZhdGVrZXktPnR5cGUgIT0gRVZQX1BLRVlfUlNBKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfUlNBX1BSSVZBVEVfREVDUllQVCxTU0xfUl9QVUJMSUNfS0VZX0lTX05PVF9SU0EpOworCQlyZXR1cm4oLTEpOworCQl9CisJcnNhPWMtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLnByaXZhdGVrZXktPnBrZXkucnNhOworCisJLyogd2UgaGF2ZSB0aGUgcHVibGljIGtleSAqLworCWk9UlNBX3ByaXZhdGVfZGVjcnlwdChsZW4sZnJvbSx0byxyc2EscGFkZGluZyk7CisJaWYgKGkgPCAwKQorCQlTU0xlcnIoU1NMX0ZfU1NMX1JTQV9QUklWQVRFX0RFQ1JZUFQsRVJSX1JfUlNBX0xJQik7CisJcmV0dXJuKGkpOworCX0KKyNlbHNlIC8qICFPUEVOU1NMX05PX1NTTDIgKi8KKworIyBpZiBQRURBTlRJQworc3RhdGljIHZvaWQgKmR1bW15PSZkdW1teTsKKyMgZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvczNfYm90aC5jIGIvbGliL29wZW5zc2wvc3NsL3MzX2JvdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ1YjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3MzX2JvdGguYwpAQCAtMCwwICsxLDgzMyBAQAorLyogc3NsL3MzX2JvdGguYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogRUNDIGNpcGhlciBzdWl0ZSBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKworLyogc2VuZCBzLT5pbml0X2J1ZiBpbiByZWNvcmRzIG9mIHR5cGUgJ3R5cGUnIChTU0wzX1JUX0hBTkRTSEFLRSBvciBTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQykgKi8KK2ludCBzc2wzX2RvX3dyaXRlKFNTTCAqcywgaW50IHR5cGUpCisJeworCWludCByZXQ7CisKKwlyZXQ9c3NsM193cml0ZV9ieXRlcyhzLHR5cGUsJnMtPmluaXRfYnVmLT5kYXRhW3MtPmluaXRfb2ZmXSwKKwkgICAgICAgICAgICAgICAgICAgICBzLT5pbml0X251bSk7CisJaWYgKHJldCA8IDApIHJldHVybigtMSk7CisJaWYgKHR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UpCisJCS8qIHNob3VsZCBub3QgYmUgZG9uZSBmb3IgJ0hlbGxvIFJlcXVlc3QncywgYnV0IGluIHRoYXQgY2FzZQorCQkgKiB3ZSdsbCBpZ25vcmUgdGhlIHJlc3VsdCBhbnl3YXkgKi8KKwkJc3NsM19maW5pc2hfbWFjKHMsKHVuc2lnbmVkIGNoYXIgKikmcy0+aW5pdF9idWYtPmRhdGFbcy0+aW5pdF9vZmZdLHJldCk7CisJCisJaWYgKHJldCA9PSBzLT5pbml0X251bSkKKwkJeworCQlpZiAocy0+bXNnX2NhbGxiYWNrKQorCQkJcy0+bXNnX2NhbGxiYWNrKDEsIHMtPnZlcnNpb24sIHR5cGUsIHMtPmluaXRfYnVmLT5kYXRhLCAoc2l6ZV90KShzLT5pbml0X29mZiArIHMtPmluaXRfbnVtKSwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7CisJCXJldHVybigxKTsKKwkJfQorCXMtPmluaXRfb2ZmKz1yZXQ7CisJcy0+aW5pdF9udW0tPXJldDsKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgc3NsM19zZW5kX2ZpbmlzaGVkKFNTTCAqcywgaW50IGEsIGludCBiLCBjb25zdCBjaGFyICpzZW5kZXIsIGludCBzbGVuKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwLCpkOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbDsKKworCWlmIChzLT5zdGF0ZSA9PSBhKQorCQl7CisJCWQ9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKwkJcD0gJihkWzRdKTsKKworCQlpPXMtPm1ldGhvZC0+c3NsM19lbmMtPmZpbmFsX2ZpbmlzaF9tYWMocywKKwkJCXNlbmRlcixzbGVuLHMtPnMzLT50bXAuZmluaXNoX21kKTsKKwkJcy0+czMtPnRtcC5maW5pc2hfbWRfbGVuID0gaTsKKwkJbWVtY3B5KHAsIHMtPnMzLT50bXAuZmluaXNoX21kLCBpKTsKKwkJcCs9aTsKKwkJbD1pOworCisgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgZmluaXNoZWQgc28gd2UgY2FuIHVzZSBpdCBmb3IKKyAgICAgICAgICAgICAgICAgICByZW5lZ290aWF0aW9uIGNoZWNrcyAqLworICAgICAgICAgICAgICAgIGlmKHMtPnR5cGUgPT0gU1NMX1NUX0NPTk5FQ1QpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9hc3NlcnQoaSA8PSBFVlBfTUFYX01EX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+czMtPnRtcC5maW5pc2hfbWQsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuPWk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BFTlNTTF9hc3NlcnQoaSA8PSBFVlBfTUFYX01EX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnMzLT50bXAuZmluaXNoX21kLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuPWk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU4xNgorCQkvKiBNU1ZDIDEuNSBkb2VzIG5vdCBjbGVhciB0aGUgdG9wIGJ5dGVzIG9mIHRoZSB3b3JkIHVubGVzcworCQkgKiBJIGRvIHRoaXMuCisJCSAqLworCQlsJj0weGZmZmY7CisjZW5kaWYKKworCQkqKGQrKyk9U1NMM19NVF9GSU5JU0hFRDsKKwkJbDJuMyhsLGQpOworCQlzLT5pbml0X251bT0oaW50KWwrNDsKKwkJcy0+aW5pdF9vZmY9MDsKKworCQlzLT5zdGF0ZT1iOworCQl9CisKKwkvKiBTU0wzX1NUX1NFTkRfeHh4eHh4X0hFTExPX0IgKi8KKwlyZXR1cm4oc3NsM19kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorCitpbnQgc3NsM19nZXRfZmluaXNoZWQoU1NMICpzLCBpbnQgYSwgaW50IGIpCisJeworCWludCBhbCxpLG9rOworCWxvbmcgbjsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJLyogdGhlIG1hYyBoYXMgYWxyZWFkeSBiZWVuIGdlbmVyYXRlZCB3aGVuIHdlIHJlY2VpdmVkIHRoZQorCSAqIGNoYW5nZSBjaXBoZXIgc3BlYyBtZXNzYWdlIGFuZCBpcyBpbiBzLT5zMy0+dG1wLnBlZXJfZmluaXNoX21kCisJICovIAorCisJbj1zLT5tZXRob2QtPnNzbF9nZXRfbWVzc2FnZShzLAorCQlhLAorCQliLAorCQlTU0wzX01UX0ZJTklTSEVELAorCQk2NCwgLyogc2hvdWxkIGFjdHVhbGx5IGJlIDM2KzQgOi0pICovCisJCSZvayk7CisKKwlpZiAoIW9rKSByZXR1cm4oKGludCluKTsKKworCS8qIElmIHRoaXMgb2NjdXJzLCB3ZSBoYXZlIG1pc3NlZCBhIG1lc3NhZ2UgKi8KKwlpZiAoIXMtPnMzLT5jaGFuZ2VfY2lwaGVyX3NwZWMpCisJCXsKKwkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0ZJTklTSEVELFNTTF9SX0dPVF9BX0ZJTl9CRUZPUkVfQV9DQ1MpOworCQlnb3RvIGZfZXJyOworCQl9CisJcy0+czMtPmNoYW5nZV9jaXBoZXJfc3BlYz0wOworCisJcCA9ICh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9tc2c7CisJaSA9IHMtPnMzLT50bXAucGVlcl9maW5pc2hfbWRfbGVuOworCisJaWYgKGkgIT0gbikKKwkJeworCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfRklOSVNIRUQsU1NMX1JfQkFEX0RJR0VTVF9MRU5HVEgpOworCQlnb3RvIGZfZXJyOworCQl9CisKKwlpZiAobWVtY21wKHAsIHMtPnMzLT50bXAucGVlcl9maW5pc2hfbWQsIGkpICE9IDApCisJCXsKKwkJYWw9U1NMX0FEX0RFQ1JZUFRfRVJST1I7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9GSU5JU0hFRCxTU0xfUl9ESUdFU1RfQ0hFQ0tfRkFJTEVEKTsKKwkJZ290byBmX2VycjsKKwkJfQorCisgICAgICAgIC8qIENvcHkgdGhlIGZpbmlzaGVkIHNvIHdlIGNhbiB1c2UgaXQgZm9yCisgICAgICAgICAgIHJlbmVnb3RpYXRpb24gY2hlY2tzICovCisgICAgICAgIGlmKHMtPnR5cGUgPT0gU1NMX1NUX0FDQ0VQVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT1BFTlNTTF9hc3NlcnQoaSA8PSBFVlBfTUFYX01EX1NJWkUpOworICAgICAgICAgICAgICAgIG1lbWNweShzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkLCAKKyAgICAgICAgICAgICAgICAgICAgcy0+czMtPnRtcC5wZWVyX2ZpbmlzaF9tZCwgaSk7CisgICAgICAgICAgICAgICAgcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW49aTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT1BFTlNTTF9hc3NlcnQoaSA8PSBFVlBfTUFYX01EX1NJWkUpOworICAgICAgICAgICAgICAgIG1lbWNweShzLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkLCAKKyAgICAgICAgICAgICAgICAgICAgcy0+czMtPnRtcC5wZWVyX2ZpbmlzaF9tZCwgaSk7CisgICAgICAgICAgICAgICAgcy0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZF9sZW49aTsKKyAgICAgICAgICAgICAgICB9CisKKwlyZXR1cm4oMSk7CitmX2VycjoKKwlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLGFsKTsKKwlyZXR1cm4oMCk7CisJfQorCisvKiBmb3IgdGhlc2UgMiBtZXNzYWdlcywgd2UgbmVlZCB0bworICogc3NsLT5lbmNfcmVhZF9jdHgJCQlyZS1pbml0CisgKiBzc2wtPnMzLT5yZWFkX3NlcXVlbmNlCQl6ZXJvCisgKiBzc2wtPnMzLT5yZWFkX21hY19zZWNyZXQJCXJlLWluaXQKKyAqIHNzbC0+c2Vzc2lvbi0+cmVhZF9zeW1fZW5jCQlhc3NpZ24KKyAqIHNzbC0+c2Vzc2lvbi0+cmVhZF9jb21wcmVzc2lvbglhc3NpZ24KKyAqIHNzbC0+c2Vzc2lvbi0+cmVhZF9oYXNoCQlhc3NpZ24KKyAqLworaW50IHNzbDNfc2VuZF9jaGFuZ2VfY2lwaGVyX3NwZWMoU1NMICpzLCBpbnQgYSwgaW50IGIpCisJeyAKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKHMtPnN0YXRlID09IGEpCisJCXsKKwkJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCQkqcD1TU0wzX01UX0NDUzsKKwkJcy0+aW5pdF9udW09MTsKKwkJcy0+aW5pdF9vZmY9MDsKKworCQlzLT5zdGF0ZT1iOworCQl9CisKKwkvKiBTU0wzX1NUX0NXX0NIQU5HRV9CICovCisJcmV0dXJuKHNzbDNfZG9fd3JpdGUocyxTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQykpOworCX0KKworc3RhdGljIGludCBzc2wzX2FkZF9jZXJ0X3RvX2J1ZihCVUZfTUVNICpidWYsIHVuc2lnbmVkIGxvbmcgKmwsIFg1MDkgKngpCisJeworCWludCBuOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwluPWkyZF9YNTA5KHgsTlVMTCk7CisJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLChpbnQpKG4rKCpsKSszKSkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfQUREX0NFUlRfVE9fQlVGLEVSUl9SX0JVRl9MSUIpOworCQlyZXR1cm4oLTEpOworCQl9CisJcD0odW5zaWduZWQgY2hhciAqKSYoYnVmLT5kYXRhWypsXSk7CisJbDJuMyhuLHApOworCWkyZF9YNTA5KHgsJnApOworCSpsKz1uKzM7CisKKwlyZXR1cm4oMCk7CisJfQorCit1bnNpZ25lZCBsb25nIHNzbDNfb3V0cHV0X2NlcnRfY2hhaW4oU1NMICpzLCBYNTA5ICp4KQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbD03OworCUJVRl9NRU0gKmJ1ZjsKKwlpbnQgbm9fY2hhaW47CisJU1RBQ0tfT0YoWDUwOSkgKmNlcnRfY2hhaW47CisKKwljZXJ0X2NoYWluID0gU1NMX2dldF9jZXJ0aWZpY2F0ZV9jaGFpbihzLCB4KTsKKworCWlmICgocy0+bW9kZSAmIFNTTF9NT0RFX05PX0FVVE9fQ0hBSU4pIHx8IHMtPmN0eC0+ZXh0cmFfY2VydHMgfHwgY2VydF9jaGFpbikKKwkJbm9fY2hhaW4gPSAxOworCWVsc2UKKwkJbm9fY2hhaW4gPSAwOworCisJLyogVExTdjEgc2VuZHMgYSBjaGFpbiB3aXRoIG5vdGhpbmcgaW4gaXQsIGluc3RlYWQgb2YgYW4gYWxlcnQgKi8KKwlidWY9cy0+aW5pdF9idWY7CisJaWYgKCFCVUZfTUVNX2dyb3dfY2xlYW4oYnVmLDEwKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19PVVRQVVRfQ0VSVF9DSEFJTixFUlJfUl9CVUZfTElCKTsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKHggIT0gTlVMTCkKKwkJeworCQlpZiAobm9fY2hhaW4pCisJCQl7CisJCQlpZiAoc3NsM19hZGRfY2VydF90b19idWYoYnVmLCAmbCwgeCkpCisJCQkJcmV0dXJuKDApOworCQkJfQorCQllbHNlCisJCQl7CisJCQlYNTA5X1NUT1JFX0NUWCB4c19jdHg7CisKKwkJCWlmICghWDUwOV9TVE9SRV9DVFhfaW5pdCgmeHNfY3R4LHMtPmN0eC0+Y2VydF9zdG9yZSx4LE5VTEwpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19PVVRQVVRfQ0VSVF9DSEFJTixFUlJfUl9YNTA5X0xJQik7CisJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCVg1MDlfdmVyaWZ5X2NlcnQoJnhzX2N0eCk7CisJCQkvKiBEb24ndCBsZWF2ZSBlcnJvcnMgaW4gdGhlIHF1ZXVlICovCisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCWZvciAoaT0wOyBpIDwgc2tfWDUwOV9udW0oeHNfY3R4LmNoYWluKTsgaSsrKQorCQkJCXsKKwkJCQl4ID0gc2tfWDUwOV92YWx1ZSh4c19jdHguY2hhaW4sIGkpOworCisJCQkJaWYgKHNzbDNfYWRkX2NlcnRfdG9fYnVmKGJ1ZiwgJmwsIHgpKQorCQkJCQl7CisJCQkJCVg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJnhzX2N0eCk7CisJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJWDUwOV9TVE9SRV9DVFhfY2xlYW51cCgmeHNfY3R4KTsKKwkJCX0KKwkJfQorCS8qIFRoYXd0ZSBzcGVjaWFsIDotKSAqLworCWZvciAoaT0wOyBpPHNrX1g1MDlfbnVtKHMtPmN0eC0+ZXh0cmFfY2VydHMpOyBpKyspCisJCXsKKwkJeD1za19YNTA5X3ZhbHVlKHMtPmN0eC0+ZXh0cmFfY2VydHMsaSk7CisJCWlmIChzc2wzX2FkZF9jZXJ0X3RvX2J1ZihidWYsICZsLCB4KSkKKwkJCXJldHVybigwKTsKKwkJfQorCisJZm9yIChpPTA7IGk8c2tfWDUwOV9udW0oY2VydF9jaGFpbik7IGkrKykKKwkJaWYgKHNzbDNfYWRkX2NlcnRfdG9fYnVmKGJ1ZiwgJmwsIHNrX1g1MDlfdmFsdWUoY2VydF9jaGFpbixpKSkpCisJCQlyZXR1cm4oMCk7CisKKwlsLT03OworCXA9KHVuc2lnbmVkIGNoYXIgKikmKGJ1Zi0+ZGF0YVs0XSk7CisJbDJuMyhsLHApOworCWwrPTM7CisJcD0odW5zaWduZWQgY2hhciAqKSYoYnVmLT5kYXRhWzBdKTsKKwkqKHArKyk9U1NMM19NVF9DRVJUSUZJQ0FURTsKKwlsMm4zKGwscCk7CisJbCs9NDsKKwlyZXR1cm4obCk7CisJfQorCisvKiBPYnRhaW4gaGFuZHNoYWtlIG1lc3NhZ2Ugb2YgbWVzc2FnZSB0eXBlICdtdCcgKGFueSBpZiBtdCA9PSAtMSksCisgKiBtYXhpbXVtIGFjY2VwdGFibGUgYm9keSBsZW5ndGggJ21heCcuCisgKiBUaGUgZmlyc3QgZm91ciBieXRlcyAobXNnX3R5cGUgYW5kIGxlbmd0aCkgYXJlIHJlYWQgaW4gc3RhdGUgJ3N0MScsCisgKiB0aGUgYm9keSBpcyByZWFkIGluIHN0YXRlICdzdG4nLgorICovCitsb25nIHNzbDNfZ2V0X21lc3NhZ2UoU1NMICpzLCBpbnQgc3QxLCBpbnQgc3RuLCBpbnQgbXQsIGxvbmcgbWF4LCBpbnQgKm9rKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGxvbmcgbDsKKwlsb25nIG47CisJaW50IGksYWw7CisKKwlpZiAocy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlKQorCQl7CisJCXMtPnMzLT50bXAucmV1c2VfbWVzc2FnZT0wOworCQlpZiAoKG10ID49IDApICYmIChzLT5zMy0+dG1wLm1lc3NhZ2VfdHlwZSAhPSBtdCkpCisJCQl7CisJCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX01FU1NBR0UsU1NMX1JfVU5FWFBFQ1RFRF9NRVNTQUdFKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCSpvaz0xOworCQlzLT5pbml0X21zZyA9IHMtPmluaXRfYnVmLT5kYXRhICsgNDsKKwkJcy0+aW5pdF9udW0gPSAoaW50KXMtPnMzLT50bXAubWVzc2FnZV9zaXplOworCQlyZXR1cm4gcy0+aW5pdF9udW07CisJCX0KKworCXA9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKworCWlmIChzLT5zdGF0ZSA9PSBzdDEpIC8qIHMtPmluaXRfbnVtIDwgNCAqLworCQl7CisJCWludCBza2lwX21lc3NhZ2U7CisKKwkJZG8KKwkJCXsKKwkJCXdoaWxlIChzLT5pbml0X251bSA8IDQpCisJCQkJeworCQkJCWk9cy0+bWV0aG9kLT5zc2xfcmVhZF9ieXRlcyhzLFNTTDNfUlRfSEFORFNIQUtFLAorCQkJCQkmcFtzLT5pbml0X251bV0sNCAtIHMtPmluaXRfbnVtLCAwKTsKKwkJCQlpZiAoaSA8PSAwKQorCQkJCQl7CisJCQkJCXMtPnJ3c3RhdGU9U1NMX1JFQURJTkc7CisJCQkJCSpvayA9IDA7CisJCQkJCXJldHVybiBpOworCQkJCQl9CisJCQkJcy0+aW5pdF9udW0rPWk7CisJCQkJfQorCQkJCisJCQlza2lwX21lc3NhZ2UgPSAwOworCQkJaWYgKCFzLT5zZXJ2ZXIpCisJCQkJaWYgKHBbMF0gPT0gU1NMM19NVF9IRUxMT19SRVFVRVNUKQorCQkJCQkvKiBUaGUgc2VydmVyIG1heSBhbHdheXMgc2VuZCAnSGVsbG8gUmVxdWVzdCcgbWVzc2FnZXMgLS0KKwkJCQkJICogd2UgYXJlIGRvaW5nIGEgaGFuZHNoYWtlIGFueXdheSBub3csIHNvIGlnbm9yZSB0aGVtCisJCQkJCSAqIGlmIHRoZWlyIGZvcm1hdCBpcyBjb3JyZWN0LiBEb2VzIG5vdCBjb3VudCBmb3IKKwkJCQkJICogJ0ZpbmlzaGVkJyBNQUMuICovCisJCQkJCWlmIChwWzFdID09IDAgJiYgcFsyXSA9PSAwICYmcFszXSA9PSAwKQorCQkJCQkJeworCQkJCQkJcy0+aW5pdF9udW0gPSAwOworCQkJCQkJc2tpcF9tZXNzYWdlID0gMTsKKworCQkJCQkJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJCQkJCQlzLT5tc2dfY2FsbGJhY2soMCwgcy0+dmVyc2lvbiwgU1NMM19SVF9IQU5EU0hBS0UsIHAsIDQsIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOworCQkJCQkJfQorCQkJfQorCQl3aGlsZSAoc2tpcF9tZXNzYWdlKTsKKworCQkvKiBzLT5pbml0X251bSA9PSA0ICovCisKKwkJaWYgKChtdCA+PSAwKSAmJiAoKnAgIT0gbXQpKQorCQkJeworCQkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9NRVNTQUdFLFNTTF9SX1VORVhQRUNURURfTUVTU0FHRSk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQlpZiAoKG10IDwgMCkgJiYgKCpwID09IFNTTDNfTVRfQ0xJRU5UX0hFTExPKSAmJgorCQkJCQkoc3QxID09IFNTTDNfU1RfU1JfQ0VSVF9BKSAmJgorCQkJCQkoc3RuID09IFNTTDNfU1RfU1JfQ0VSVF9CKSkKKwkJCXsKKwkJCS8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBnb3QgYW4gTVMgU0dDIHNlY29uZCBjbGllbnQKKwkJCSAqIGhlbGxvIChtYXliZSB3ZSBzaG91bGQgYWx3YXlzIGFsbG93IHRoZSBjbGllbnQgdG8KKwkJCSAqIHN0YXJ0IGEgbmV3IGhhbmRzaGFrZT8pLiBXZSBuZWVkIHRvIHJlc3RhcnQgdGhlIG1hYy4KKwkJCSAqIERvbid0IGluY3JlbWVudCB7bnVtLHRvdGFsfV9yZW5lZ290aWF0aW9ucyBiZWNhdXNlCisJCQkgKiB3ZSBoYXZlIG5vdCBjb21wbGV0ZWQgdGhlIGhhbmRzaGFrZS4gKi8KKwkJCXNzbDNfaW5pdF9maW5pc2hlZF9tYWMocyk7CisJCQl9CisKKwkJcy0+czMtPnRtcC5tZXNzYWdlX3R5cGU9ICoocCsrKTsKKworCQluMmwzKHAsbCk7CisJCWlmIChsID4gKHVuc2lnbmVkIGxvbmcpbWF4KQorCQkJeworCQkJYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX01FU1NBR0UsU1NMX1JfRVhDRVNTSVZFX01FU1NBR0VfU0laRSk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQlpZiAobCA+IChJTlRfTUFYLTQpKSAvKiBCVUZfTUVNX2dyb3cgdGFrZXMgYW4gJ2ludCcgcGFyYW1ldGVyICovCisJCQl7CisJCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfTUVTU0FHRSxTU0xfUl9FWENFU1NJVkVfTUVTU0FHRV9TSVpFKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCWlmIChsICYmICFCVUZfTUVNX2dyb3dfY2xlYW4ocy0+aW5pdF9idWYsKGludClsKzQpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX01FU1NBR0UsRVJSX1JfQlVGX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcy0+czMtPnRtcC5tZXNzYWdlX3NpemU9bDsKKwkJcy0+c3RhdGU9c3RuOworCisJCXMtPmluaXRfbXNnID0gcy0+aW5pdF9idWYtPmRhdGEgKyA0OworCQlzLT5pbml0X251bSA9IDA7CisJCX0KKworCS8qIG5leHQgc3RhdGUgKHN0bikgKi8KKwlwID0gcy0+aW5pdF9tc2c7CisJbiA9IHMtPnMzLT50bXAubWVzc2FnZV9zaXplIC0gcy0+aW5pdF9udW07CisJd2hpbGUgKG4gPiAwKQorCQl7CisJCWk9cy0+bWV0aG9kLT5zc2xfcmVhZF9ieXRlcyhzLFNTTDNfUlRfSEFORFNIQUtFLCZwW3MtPmluaXRfbnVtXSxuLDApOworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJcy0+cndzdGF0ZT1TU0xfUkVBRElORzsKKwkJCSpvayA9IDA7CisJCQlyZXR1cm4gaTsKKwkJCX0KKwkJcy0+aW5pdF9udW0gKz0gaTsKKwkJbiAtPSBpOworCQl9CisJc3NsM19maW5pc2hfbWFjKHMsICh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGEsIHMtPmluaXRfbnVtICsgNCk7CisJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJcy0+bXNnX2NhbGxiYWNrKDAsIHMtPnZlcnNpb24sIFNTTDNfUlRfSEFORFNIQUtFLCBzLT5pbml0X2J1Zi0+ZGF0YSwgKHNpemVfdClzLT5pbml0X251bSArIDQsIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOworCSpvaz0xOworCXJldHVybiBzLT5pbml0X251bTsKK2ZfZXJyOgorCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsYWwpOworZXJyOgorCSpvaz0wOworCXJldHVybigtMSk7CisJfQorCitpbnQgc3NsX2NlcnRfdHlwZShYNTA5ICp4LCBFVlBfUEtFWSAqcGtleSkKKwl7CisJRVZQX1BLRVkgKnBrOworCWludCByZXQ9IC0xLGk7CisKKwlpZiAocGtleSA9PSBOVUxMKQorCQlwaz1YNTA5X2dldF9wdWJrZXkoeCk7CisJZWxzZQorCQlwaz1wa2V5OworCWlmIChwayA9PSBOVUxMKSBnb3RvIGVycjsKKworCWk9cGstPnR5cGU7CisJaWYgKGkgPT0gRVZQX1BLRVlfUlNBKQorCQl7CisJCXJldD1TU0xfUEtFWV9SU0FfRU5DOworCQl9CisJZWxzZSBpZiAoaSA9PSBFVlBfUEtFWV9EU0EpCisJCXsKKwkJcmV0PVNTTF9QS0VZX0RTQV9TSUdOOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKwllbHNlIGlmIChpID09IEVWUF9QS0VZX0VDKQorCQl7CisJCXJldCA9IFNTTF9QS0VZX0VDQzsKKwkJfQkKKyNlbmRpZgorCWVsc2UgaWYgKGkgPT0gTklEX2lkX0dvc3RSMzQxMF85NCB8fCBpID09IE5JRF9pZF9Hb3N0UjM0MTBfOTRfY2MpIAorCQl7CisJCXJldCA9IFNTTF9QS0VZX0dPU1Q5NDsKKwkJfQorCWVsc2UgaWYgKGkgPT0gTklEX2lkX0dvc3RSMzQxMF8yMDAxIHx8IGkgPT0gTklEX2lkX0dvc3RSMzQxMF8yMDAxX2NjKSAKKwkJeworCQlyZXQgPSBTU0xfUEtFWV9HT1NUMDE7CisJCX0KK2VycjoKKwlpZighcGtleSkgRVZQX1BLRVlfZnJlZShwayk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgc3NsX3ZlcmlmeV9hbGFybV90eXBlKGxvbmcgdHlwZSkKKwl7CisJaW50IGFsOworCisJc3dpdGNoKHR5cGUpCisJCXsKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVDoKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9DUkw6CisJY2FzZSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19HRVRfQ1JMX0lTU1VFUjoKKwkJYWw9U1NMX0FEX1VOS05PV05fQ0E7CisJCWJyZWFrOworCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVDUllQVF9DRVJUX1NJR05BVFVSRToKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ1JZUFRfQ1JMX1NJR05BVFVSRToKKwljYXNlIFg1MDlfVl9FUlJfVU5BQkxFX1RPX0RFQ09ERV9JU1NVRVJfUFVCTElDX0tFWToKKwljYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQkVGT1JFX0ZJRUxEOgorCWNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DRVJUX05PVF9BRlRFUl9GSUVMRDoKKwljYXNlIFg1MDlfVl9FUlJfRVJST1JfSU5fQ1JMX0xBU1RfVVBEQVRFX0ZJRUxEOgorCWNhc2UgWDUwOV9WX0VSUl9FUlJPUl9JTl9DUkxfTkVYVF9VUERBVEVfRklFTEQ6CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfTk9UX1lFVF9WQUxJRDoKKwljYXNlIFg1MDlfVl9FUlJfQ1JMX05PVF9ZRVRfVkFMSUQ6CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfVU5UUlVTVEVEOgorCWNhc2UgWDUwOV9WX0VSUl9DRVJUX1JFSkVDVEVEOgorCQlhbD1TU0xfQURfQkFEX0NFUlRJRklDQVRFOworCQlicmVhazsKKwljYXNlIFg1MDlfVl9FUlJfQ0VSVF9TSUdOQVRVUkVfRkFJTFVSRToKKwljYXNlIFg1MDlfVl9FUlJfQ1JMX1NJR05BVFVSRV9GQUlMVVJFOgorCQlhbD1TU0xfQURfREVDUllQVF9FUlJPUjsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfSEFTX0VYUElSRUQ6CisJY2FzZSBYNTA5X1ZfRVJSX0NSTF9IQVNfRVhQSVJFRDoKKwkJYWw9U1NMX0FEX0NFUlRJRklDQVRFX0VYUElSRUQ7CisJCWJyZWFrOworCWNhc2UgWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQ6CisJCWFsPVNTTF9BRF9DRVJUSUZJQ0FURV9SRVZPS0VEOworCQlicmVhazsKKwljYXNlIFg1MDlfVl9FUlJfT1VUX09GX01FTToKKwkJYWw9U1NMX0FEX0lOVEVSTkFMX0VSUk9SOworCQlicmVhazsKKwljYXNlIFg1MDlfVl9FUlJfREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUOgorCWNhc2UgWDUwOV9WX0VSUl9TRUxGX1NJR05FRF9DRVJUX0lOX0NIQUlOOgorCWNhc2UgWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0lTU1VFUl9DRVJUX0xPQ0FMTFk6CisJY2FzZSBYNTA5X1ZfRVJSX1VOQUJMRV9UT19WRVJJRllfTEVBRl9TSUdOQVRVUkU6CisJY2FzZSBYNTA5X1ZfRVJSX0NFUlRfQ0hBSU5fVE9PX0xPTkc6CisJY2FzZSBYNTA5X1ZfRVJSX1BBVEhfTEVOR1RIX0VYQ0VFREVEOgorCWNhc2UgWDUwOV9WX0VSUl9JTlZBTElEX0NBOgorCQlhbD1TU0xfQURfVU5LTk9XTl9DQTsKKwkJYnJlYWs7CisJY2FzZSBYNTA5X1ZfRVJSX0FQUExJQ0FUSU9OX1ZFUklGSUNBVElPTjoKKwkJYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQlicmVhazsKKwljYXNlIFg1MDlfVl9FUlJfSU5WQUxJRF9QVVJQT1NFOgorCQlhbD1TU0xfQURfVU5TVVBQT1JURURfQ0VSVElGSUNBVEU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFsPVNTTF9BRF9DRVJUSUZJQ0FURV9VTktOT1dOOworCQlicmVhazsKKwkJfQorCXJldHVybihhbCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fQlVGX0ZSRUVMSVNUUworLyogT24gc29tZSBwbGF0Zm9ybXMsIG1hbGxvYygpIHBlcmZvcm1hbmNlIGlzIGJhZCBlbm91Z2ggdGhhdCB5b3UgY2FuJ3QganVzdAorICogZnJlZSgpIGFuZCBtYWxsb2MoKSBidWZmZXJzIGFsbCB0aGUgdGltZSwgc28gd2UgbmVlZCB0byB1c2UgZnJlZWxpc3RzIGZyb20KKyAqIHVudXNlZCBidWZmZXJzLiAgQ3VycmVudGx5LCBlYWNoIGZyZWVsaXN0IGhvbGRzIG1lbW9yeSBjaHVua3Mgb2Ygb25seSBhCisgKiBnaXZlbiBzaXplIChsaXN0LT5jaHVua2xlbik7IG90aGVyIHNpemVkIGNodW5rcyBhcmUgZnJlZWQgYW5kIG1hbGxvY2VkLgorICogVGhpcyBkb2Vzbid0IGhlbHAgbXVjaCBpZiB5b3UncmUgdXNpbmcgbWFueSBkaWZmZXJlbnQgU1NMIG9wdGlvbiBzZXR0aW5ncworICogd2l0aCBhIGdpdmVuIGNvbnRleHQuICAoVGhlIG9wdGlvbnMgYWZmZWN0aW5nIGJ1ZmZlciBzaXplIGFyZQorICogbWF4X3NlbmRfZnJhZ21lbnQsIHJlYWQgYnVmZmVyIHZzIHdyaXRlIGJ1ZmZlciwKKyAqIFNTTF9PUF9NSUNST1NPRlRfQklHX1dSSVRFX0JVRkZFUiwgU1NMX09QX05PX0NPTVBSRVNTSU9OLCBhbmQKKyAqIFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMuKSAgVXNpbmcgYSBzZXBhcmF0ZSBmcmVlbGlzdCBmb3IgZXZlcnkKKyAqIHBvc3NpYmxlIHNpemUgaXMgbm90IGFuIG9wdGlvbiwgc2luY2UgbWF4X3NlbmRfZnJhZ21lbnQgY2FuIHRha2Ugb24gbWFueQorICogZGlmZmVyZW50IHZhbHVlcy4KKyAqCisgKiBJZiB5b3UgYXJlIG9uIGEgcGxhdGZvcm0gd2l0aCBhIHNsb3cgbWFsbG9jKCksIGFuZCB5b3UncmUgdXNpbmcgU1NMCisgKiBjb25uZWN0aW9ucyB3aXRoIG1hbnkgZGlmZmVyZW50IHNldHRpbmdzIGZvciB0aGVzZSBvcHRpb25zLCBhbmQgeW91IG5lZWQgdG8KKyAqIHVzZSB0aGUgU1NMX01PRF9SRUxFQVNFX0JVRkZFUlMgZmVhdHVyZSwgeW91IGhhdmUgYSBmZXcgb3B0aW9uczoKKyAqICAgIC0gTGluayBhZ2FpbnN0IGEgZmFzdGVyIG1hbGxvYyBpbXBsZW1lbnRhdGlvbi4KKyAqICAgIC0gVXNlIGEgc2VwYXJhdGUgU1NMX0NUWCBmb3IgZWFjaCBvcHRpb24gc2V0LgorICogICAgLSBJbXByb3ZlIHRoaXMgY29kZS4KKyAqLworc3RhdGljIHZvaWQgKgorZnJlZWxpc3RfZXh0cmFjdChTU0xfQ1RYICpjdHgsIGludCBmb3JfcmVhZCwgaW50IHN6KQorCXsKKwlTU0wzX0JVRl9GUkVFTElTVCAqbGlzdDsKKwlTU0wzX0JVRl9GUkVFTElTVF9FTlRSWSAqZW50ID0gTlVMTDsKKwl2b2lkICpyZXN1bHQgPSBOVUxMOworCisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKwlsaXN0ID0gZm9yX3JlYWQgPyBjdHgtPnJidWZfZnJlZWxpc3QgOiBjdHgtPndidWZfZnJlZWxpc3Q7CisJaWYgKGxpc3QgIT0gTlVMTCAmJiBzeiA9PSAoaW50KWxpc3QtPmNodW5rbGVuKQorCQllbnQgPSBsaXN0LT5oZWFkOworCWlmIChlbnQgIT0gTlVMTCkKKwkJeworCQlsaXN0LT5oZWFkID0gZW50LT5uZXh0OworCQlyZXN1bHQgPSBlbnQ7CisJCWlmICgtLWxpc3QtPmxlbiA9PSAwKQorCQkJbGlzdC0+Y2h1bmtsZW4gPSAwOworCQl9CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1NTTF9DVFgpOworCWlmICghcmVzdWx0KQorCQlyZXN1bHQgPSBPUEVOU1NMX21hbGxvYyhzeik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVsaXN0X2luc2VydChTU0xfQ1RYICpjdHgsIGludCBmb3JfcmVhZCwgc2l6ZV90IHN6LCB2b2lkICptZW0pCisJeworCVNTTDNfQlVGX0ZSRUVMSVNUICpsaXN0OworCVNTTDNfQlVGX0ZSRUVMSVNUX0VOVFJZICplbnQ7CisKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1NTTF9DVFgpOworCWxpc3QgPSBmb3JfcmVhZCA/IGN0eC0+cmJ1Zl9mcmVlbGlzdCA6IGN0eC0+d2J1Zl9mcmVlbGlzdDsKKwlpZiAobGlzdCAhPSBOVUxMICYmCisJICAgIChzeiA9PSBsaXN0LT5jaHVua2xlbiB8fCBsaXN0LT5jaHVua2xlbiA9PSAwKSAmJgorCSAgICBsaXN0LT5sZW4gPCBjdHgtPmZyZWVsaXN0X21heF9sZW4gJiYKKwkgICAgc3ogPj0gc2l6ZW9mKCplbnQpKQorCQl7CisJCWxpc3QtPmNodW5rbGVuID0gc3o7CisJCWVudCA9IG1lbTsKKwkJZW50LT5uZXh0ID0gbGlzdC0+aGVhZDsKKwkJbGlzdC0+aGVhZCA9IGVudDsKKwkJKytsaXN0LT5sZW47CisJCW1lbSA9IE5VTEw7CisJCX0KKworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKwlpZiAobWVtKQorCQlPUEVOU1NMX2ZyZWUobWVtKTsKKwl9CisjZWxzZQorI2RlZmluZSBmcmVlbGlzdF9leHRyYWN0KGMsZnIsc3opIE9QRU5TU0xfbWFsbG9jKHN6KQorI2RlZmluZSBmcmVlbGlzdF9pbnNlcnQoYyxmcixzeixtKSBPUEVOU1NMX2ZyZWUobSkKKyNlbmRpZgorCitpbnQgc3NsM19zZXR1cF9yZWFkX2J1ZmZlcihTU0wgKnMpCisJeworCXVuc2lnbmVkIGNoYXIgKnA7CisJc2l6ZV90IGxlbixhbGlnbj0wLGhlYWRlcmxlbjsKKwkKKwlpZiAoU1NMX3ZlcnNpb24ocykgPT0gRFRMUzFfVkVSU0lPTiB8fCBTU0xfdmVyc2lvbihzKSA9PSBEVExTMV9CQURfVkVSKQorCQloZWFkZXJsZW4gPSBEVExTMV9SVF9IRUFERVJfTEVOR1RIOworCWVsc2UKKwkJaGVhZGVybGVuID0gU1NMM19SVF9IRUFERVJfTEVOR1RIOworCisjaWYgZGVmaW5lZChTU0wzX0FMSUdOX1BBWUxPQUQpICYmIFNTTDNfQUxJR05fUEFZTE9BRCE9MAorCWFsaWduID0gKC1TU0wzX1JUX0hFQURFUl9MRU5HVEgpJihTU0wzX0FMSUdOX1BBWUxPQUQtMSk7CisjZW5kaWYKKworCWlmIChzLT5zMy0+cmJ1Zi5idWYgPT0gTlVMTCkKKwkJeworCQlpZiAoU1NMX2dldF9tb2RlKHMpICYgU1NMX01PREVfU01BTExfQlVGRkVSUykKKwkJCXsKKwkJCWxlbiA9IFNTTDNfUlRfREVGQVVMVF9QQUNLRVRfU0laRTsKKwkJCX0KKyAgCQllbHNlCisJCQl7CisJCQlsZW4gPSBTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgKKwkJCQkrIFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRAorCQkJCSsgaGVhZGVybGVuICsgYWxpZ247CisJCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9NSUNST1NPRlRfQklHX1NTTFYzX0JVRkZFUikKKwkJCQl7CisJCQkJcy0+czMtPmluaXRfZXh0cmEgPSAxOworCQkJCWxlbiArPSBTU0wzX1JUX01BWF9FWFRSQTsKKwkJCQl9CisJCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCQlpZiAoIShzLT5vcHRpb25zICYgU1NMX09QX05PX0NPTVBSRVNTSU9OKSkKKwkJCWxlbiArPSBTU0wzX1JUX01BWF9DT01QUkVTU0VEX09WRVJIRUFEOworI2VuZGlmCisJCWlmICgocD1mcmVlbGlzdF9leHRyYWN0KHMtPmN0eCwgMSwgbGVuKSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQlzLT5zMy0+cmJ1Zi5idWYgPSBwOworCQlzLT5zMy0+cmJ1Zi5sZW4gPSBsZW47CisJCX0KKworCXMtPnBhY2tldD0gJihzLT5zMy0+cmJ1Zi5idWZbMF0pOworCXJldHVybiAxOworCitlcnI6CisJU1NMZXJyKFNTTF9GX1NTTDNfU0VUVVBfUkVBRF9CVUZGRVIsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCXJldHVybiAwOworCX0KKworaW50IHNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyKFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqcDsKKwlzaXplX3QgbGVuLGFsaWduPTAsaGVhZGVybGVuOworCisJaWYgKFNTTF92ZXJzaW9uKHMpID09IERUTFMxX1ZFUlNJT04gfHwgU1NMX3ZlcnNpb24ocykgPT0gRFRMUzFfQkFEX1ZFUikKKwkJaGVhZGVybGVuID0gRFRMUzFfUlRfSEVBREVSX0xFTkdUSCArIDE7CisJZWxzZQorCQloZWFkZXJsZW4gPSBTU0wzX1JUX0hFQURFUl9MRU5HVEg7CisKKyNpZiBkZWZpbmVkKFNTTDNfQUxJR05fUEFZTE9BRCkgJiYgU1NMM19BTElHTl9QQVlMT0FEIT0wCisJYWxpZ24gPSAoLVNTTDNfUlRfSEVBREVSX0xFTkdUSCkmKFNTTDNfQUxJR05fUEFZTE9BRC0xKTsKKyNlbmRpZgorCisJaWYgKHMtPnMzLT53YnVmLmJ1ZiA9PSBOVUxMKQorCQl7CisJCWlmIChTU0xfZ2V0X21vZGUocykgJiBTU0xfTU9ERV9TTUFMTF9CVUZGRVJTKQorCQkJeworCQkJbGVuID0gU1NMM19SVF9ERUZBVUxUX1BBQ0tFVF9TSVpFOworCQkJfQorICAJCWVsc2UKKwkJCXsKKwkJCWxlbiA9IHMtPm1heF9zZW5kX2ZyYWdtZW50OworCQkJfQorCQlsZW4gKz0gMAorCQkJKyBTU0wzX1JUX1NFTkRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRAorCQkJKyBoZWFkZXJsZW4gKyBhbGlnbjsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fQ09NUFJFU1NJT04pKQorCQkJbGVuICs9IFNTTDNfUlRfTUFYX0NPTVBSRVNTRURfT1ZFUkhFQUQ7CisjZW5kaWYKKwkJaWYgKCEocy0+b3B0aW9ucyAmIFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMpKQorCQkJbGVuICs9IGhlYWRlcmxlbiArIGFsaWduCisJCQkJKyBTU0wzX1JUX1NFTkRfTUFYX0VOQ1JZUFRFRF9PVkVSSEVBRDsKKwkJaWYgKChwPWZyZWVsaXN0X2V4dHJhY3Qocy0+Y3R4LCAwLCBsZW4pKSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCXMtPnMzLT53YnVmLmJ1ZiA9IHA7CisJCXMtPnMzLT53YnVmLmxlbiA9IGxlbjsKKwkJfQorCisJcmV0dXJuIDE7CisKK2VycjoKKwlTU0xlcnIoU1NMX0ZfU1NMM19TRVRVUF9XUklURV9CVUZGRVIsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCXJldHVybiAwOworCX0KKworCitpbnQgc3NsM19zZXR1cF9idWZmZXJzKFNTTCAqcykKKwl7CisJaWYgKCFzc2wzX3NldHVwX3JlYWRfYnVmZmVyKHMpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyKHMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBzc2wzX3JlbGVhc2Vfd3JpdGVfYnVmZmVyKFNTTCAqcykKKwl7CisJaWYgKHMtPnMzLT53YnVmLmJ1ZiAhPSBOVUxMKQorCQl7CisJCWZyZWVsaXN0X2luc2VydChzLT5jdHgsIDAsIHMtPnMzLT53YnVmLmxlbiwgcy0+czMtPndidWYuYnVmKTsKKwkJcy0+czMtPndidWYuYnVmID0gTlVMTDsKKwkJfQorCXJldHVybiAxOworCX0KKworaW50IHNzbDNfcmVsZWFzZV9yZWFkX2J1ZmZlcihTU0wgKnMpCisJeworCWlmIChzLT5zMy0+cmJ1Zi5idWYgIT0gTlVMTCkKKwkJeworCQlmcmVlbGlzdF9pbnNlcnQocy0+Y3R4LCAxLCBzLT5zMy0+cmJ1Zi5sZW4sIHMtPnMzLT5yYnVmLmJ1Zik7CisJCXMtPnMzLT5yYnVmLmJ1ZiA9IE5VTEw7CisJCX0KKwlyZXR1cm4gMTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvczNfY2xudC5jIGIvbGliL29wZW5zc2wvc3NsL3MzX2NsbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmZmYjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3MzX2NsbnQuYwpAQCAtMCwwICsxLDMxMDMgQEAKKy8qIHNzbC9zM19jbG50LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogRUNDIGNpcGhlciBzdWl0ZSBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBWaXB1bCBHdXB0YSBhbmQgU3VtaXQgR3VwdGEgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDUgTm9raWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIHBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGlzIGRldmVsb3BlZCBieQorICogTm9raWEgQ29ycG9yYXRpb24gYW5kIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlLgorICoKKyAqIFRoZSBDb250cmlidXRpb24sIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZgorICogTm9raWEgQ29ycG9yYXRpb24sIGNvbnNpc3RzIG9mIHRoZSAiUFNLIiAoUHJlLVNoYXJlZCBLZXkpIGNpcGhlcnN1aXRlcworICogc3VwcG9ydCAoc2VlIFJGQyA0Mjc5KSB0byBPcGVuU1NMLgorICoKKyAqIE5vIHBhdGVudCBsaWNlbnNlcyBvciBvdGhlciByaWdodHMgZXhjZXB0IHRob3NlIGV4cHJlc3NseSBzdGF0ZWQgaW4KKyAqIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlIGxpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIGdyYW50ZWQgb3IgcmVjZWl2ZWQKKyAqIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsLCBvciBvdGhlcndpc2UuCisgKgorICogTm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgTm9raWEgdGhhdCB0aGUgQ29udHJpYnV0aW9uIGRvZXMgbm90CisgKiBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IHRoaXJkCisgKiBwYXJ0eSBvciB0aGF0IHRoZSBsaWNlbnNlIHByb3ZpZGVzIHlvdSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHJpZ2h0cworICogdG8gbWFrZSB1c2Ugb2YgdGhlIENvbnRyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELiBJTgorICogQURESVRJT04gVE8gVEhFIERJU0NMQUlNRVJTIElOQ0xVREVEIElOIFRIRSBMSUNFTlNFLCBOT0tJQQorICogU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIEZPUiBDTEFJTVMgQlJPVUdIVCBCWSBZT1UgT1IgQU5ZCisgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKKyAqIE9USEVSV0lTRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgImtzc2xfbGNsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKyNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2JuLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqc3NsM19nZXRfY2xpZW50X21ldGhvZChpbnQgdmVyKTsKK3N0YXRpYyBpbnQgY2FfZG5fY21wKGNvbnN0IFg1MDlfTkFNRSAqIGNvbnN0ICphLGNvbnN0IFg1MDlfTkFNRSAqIGNvbnN0ICpiKTsKKworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKnNzbDNfZ2V0X2NsaWVudF9tZXRob2QoaW50IHZlcikKKwl7CisJaWYgKHZlciA9PSBTU0wzX1ZFUlNJT04pCisJCXJldHVybihTU0x2M19jbGllbnRfbWV0aG9kKCkpOworCWVsc2UKKwkJcmV0dXJuKE5VTEwpOworCX0KKworSU1QTEVNRU5UX3NzbDNfbWV0aF9mdW5jKFNTTHYzX2NsaWVudF9tZXRob2QsCisJCQlzc2xfdW5kZWZpbmVkX2Z1bmN0aW9uLAorCQkJc3NsM19jb25uZWN0LAorCQkJc3NsM19nZXRfY2xpZW50X21ldGhvZCkKKworaW50IHNzbDNfY29ubmVjdChTU0wgKnMpCisJeworCUJVRl9NRU0gKmJ1Zj1OVUxMOworCXVuc2lnbmVkIGxvbmcgVGltZT0odW5zaWduZWQgbG9uZyl0aW1lKE5VTEwpOworCXZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsaW50IHR5cGUsaW50IHZhbCk9TlVMTDsKKwlpbnQgcmV0PSAtMTsKKwlpbnQgbmV3X3N0YXRlLHN0YXRlLHNraXA9MDsKKworCVJBTkRfYWRkKCZUaW1lLHNpemVvZihUaW1lKSwwKTsKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKwljbGVhcl9zeXNfZXJyb3IoKTsKKworCWlmIChzLT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCWNiPXMtPmluZm9fY2FsbGJhY2s7CisJZWxzZSBpZiAocy0+Y3R4LT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCWNiPXMtPmN0eC0+aW5mb19jYWxsYmFjazsKKwkKKwlzLT5pbl9oYW5kc2hha2UrKzsKKwlpZiAoIVNTTF9pbl9pbml0KHMpIHx8IFNTTF9pbl9iZWZvcmUocykpIFNTTF9jbGVhcihzKTsgCisjaWYgMAkvKiBTZW5kIGFwcCBkYXRhIGluIHNlcGFyYXRlIHBhY2tldCwgb3RoZXJ3aXNlLCBzb21lIHBhcnRpY3VsYXIgc2l0ZQorCSAqIChvbmx5IG9uZSBzaXRlIHNvIGZhcikgY2xvc2VzIHRoZSBzb2NrZXQuCisJICogTm90ZTogdGhlcmUgaXMgYSB2ZXJ5IHNtYWxsIGNoYW5jZSB0aGF0IHR3byBUQ1AgcGFja2V0cworCSAqIGNvdWxkIGJlIGFycml2aW5nIGF0IHNlcnZlciBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIFRDUCBwYWNrZXQsCisJICogdGhlbiB0cmlnZ2VyIHRoYXQgc2l0ZSB0byBicmVhay4gV2UgaGF2ZW4ndCBlbmNvdW50ZXIgdGhhdCB0aG91Z2guCisJICovCisJaWYgKFNTTF9nZXRfbW9kZShzKSAmIFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIKQorCQl7CisJCS8qIFNlbmQgYXBwIGRhdGEgYWxvbmcgd2l0aCBDQ1MvRmluaXNoZWQgKi8KKwkJcy0+czMtPmZsYWdzIHw9IFNTTDNfRkxBR1NfREVMQVlfQ0xJRU5UX0ZJTklTSEVEOworCQl9CisjZW5kaWYKKworCWZvciAoOzspCisJCXsKKwkJc3RhdGU9cy0+c3RhdGU7CisKKwkJc3dpdGNoKHMtPnN0YXRlKQorCQkJeworCQljYXNlIFNTTF9TVF9SRU5FR09USUFURToKKwkJCXMtPm5ld19zZXNzaW9uPTE7CisJCQlzLT5zdGF0ZT1TU0xfU1RfQ09OTkVDVDsKKwkJCXMtPmN0eC0+c3RhdHMuc2Vzc19jb25uZWN0X3JlbmVnb3RpYXRlKys7CisJCQkvKiBicmVhayAqLworCQljYXNlIFNTTF9TVF9CRUZPUkU6CisJCWNhc2UgU1NMX1NUX0NPTk5FQ1Q6CisJCWNhc2UgU1NMX1NUX0JFRk9SRXxTU0xfU1RfQ09OTkVDVDoKKwkJY2FzZSBTU0xfU1RfT0t8U1NMX1NUX0NPTk5FQ1Q6CisKKwkJCXMtPnNlcnZlcj0wOworCQkJaWYgKGNiICE9IE5VTEwpIGNiKHMsU1NMX0NCX0hBTkRTSEFLRV9TVEFSVCwxKTsKKworCQkJaWYgKChzLT52ZXJzaW9uICYgMHhmZjAwICkgIT0gMHgwMzAwKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DT05ORUNULCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJcmV0ID0gLTE7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJCQorCQkJLyogcy0+dmVyc2lvbj1TU0wzX1ZFUlNJT047ICovCisJCQlzLT50eXBlPVNTTF9TVF9DT05ORUNUOworCisJCQlpZiAocy0+aW5pdF9idWYgPT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKChidWY9QlVGX01FTV9uZXcoKSkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlyZXQ9IC0xOworCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCWlmICghQlVGX01FTV9ncm93KGJ1ZixTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpKQorCQkJCQl7CisJCQkJCXJldD0gLTE7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJcy0+aW5pdF9idWY9YnVmOworCQkJCWJ1Zj1OVUxMOworCQkJCX0KKworCQkJaWYgKCFzc2wzX3NldHVwX2J1ZmZlcnMocykpIHsgcmV0PSAtMTsgZ290byBlbmQ7IH0KKworCQkJLyogc2V0dXAgYnVmZmluZyBCSU8gKi8KKwkJCWlmICghc3NsX2luaXRfd2Jpb19idWZmZXIocywwKSkgeyByZXQ9IC0xOyBnb3RvIGVuZDsgfQorCisJCQkvKiBkb24ndCBwdXNoIHRoZSBidWZmZXJpbmcgQklPIHF1aXRlIHlldCAqLworCisJCQlzc2wzX2luaXRfZmluaXNoZWRfbWFjKHMpOworCisJCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0NMTlRfSEVMTE9fQTsKKwkJCXMtPmN0eC0+c3RhdHMuc2Vzc19jb25uZWN0Kys7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQToKKwkJY2FzZSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQjoKKworCQkJcy0+c2h1dGRvd249MDsKKwkJCXJldD1zc2wzX2NsaWVudF9oZWxsbyhzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX1NSVlJfSEVMTE9fQTsKKwkJCXMtPmluaXRfbnVtPTA7CisKKwkJCS8qIHR1cm4gb24gYnVmZmVyaW5nIGZvciB0aGUgbmV4dCBsb3Qgb2Ygb3V0cHV0ICovCisJCQlpZiAocy0+YmJpbyAhPSBzLT53YmlvKQorCQkJCXMtPndiaW89QklPX3B1c2gocy0+YmJpbyxzLT53YmlvKTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NSX1NSVlJfSEVMTE9fQToKKwkJY2FzZSBTU0wzX1NUX0NSX1NSVlJfSEVMTE9fQjoKKwkJCXJldD1zc2wzX2dldF9zZXJ2ZXJfaGVsbG8ocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCisJCQlpZiAocy0+aGl0KQorCQkJCXMtPnN0YXRlPVNTTDNfU1RfQ1JfRklOSVNIRURfQTsKKwkJCWVsc2UKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0NFUlRfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfQ1JfQ0VSVF9BOgorCQljYXNlIFNTTDNfU1RfQ1JfQ0VSVF9COgorI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQkJcmV0PXNzbDNfY2hlY2tfZmluaXNoZWQocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJaWYgKHJldCA9PSAyKQorCQkJCXsKKwkJCQlzLT5oaXQgPSAxOworCQkJCWlmIChzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkKQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX1NFU1NJT05fVElDS0VUX0E7CisJCQkJZWxzZQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0ZJTklTSEVEX0E7CisJCQkJcy0+aW5pdF9udW09MDsKKwkJCQlicmVhazsKKwkJCQl9CisjZW5kaWYKKwkJCS8qIENoZWNrIGlmIGl0IGlzIGFub24gREgvRUNESCAqLworCQkJLyogb3IgUFNLICovCisJCQlpZiAoIShzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoICYgU1NMX2FOVUxMKSAmJgorCQkJICAgICEocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleSAmIFNTTF9rUFNLKSkKKwkJCQl7CisJCQkJcmV0PXNzbDNfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzKTsKKwkJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQkJCWlmIChzLT50bHNleHRfc3RhdHVzX2V4cGVjdGVkKQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0NFUlRfU1RBVFVTX0E7CisJCQkJZWxzZQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0tFWV9FWENIX0E7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlza2lwID0gMTsKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0tFWV9FWENIX0E7CisJCQkJfQorI2Vsc2UKKwkJCQl9CisJCQllbHNlCisJCQkJc2tpcD0xOworCisJCQlzLT5zdGF0ZT1TU0wzX1NUX0NSX0tFWV9FWENIX0E7CisjZW5kaWYKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfQ1JfS0VZX0VYQ0hfQToKKwkJY2FzZSBTU0wzX1NUX0NSX0tFWV9FWENIX0I6CisJCQlyZXQ9c3NsM19nZXRfa2V5X2V4Y2hhbmdlKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1JfQ0VSVF9SRVFfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisKKwkJCS8qIGF0IHRoaXMgcG9pbnQgd2UgY2hlY2sgdGhhdCB3ZSBoYXZlIHRoZQorCQkJICogcmVxdWlyZWQgc3R1ZmYgZnJvbSB0aGUgc2VydmVyICovCisJCQlpZiAoIXNzbDNfY2hlY2tfY2VydF9hbmRfYWxnb3JpdGhtKHMpKQorCQkJCXsKKwkJCQlyZXQ9IC0xOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9DUl9DRVJUX1JFUV9BOgorCQljYXNlIFNTTDNfU1RfQ1JfQ0VSVF9SRVFfQjoKKwkJCXJldD1zc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1JfU1JWUl9ET05FX0E7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NSX1NSVlJfRE9ORV9BOgorCQljYXNlIFNTTDNfU1RfQ1JfU1JWUl9ET05FX0I6CisJCQlyZXQ9c3NsM19nZXRfc2VydmVyX2RvbmUocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJaWYgKHMtPnMzLT50bXAuY2VydF9yZXEpCisJCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DRVJUX0E7CisJCQllbHNlCisJCQkJcy0+c3RhdGU9U1NMM19TVF9DV19LRVlfRVhDSF9BOworCQkJcy0+aW5pdF9udW09MDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfQToKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfQjoKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfQzoKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfRDoKKwkJCXJldD1zc2wzX3NlbmRfY2xpZW50X2NlcnRpZmljYXRlKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfS0VZX0VYQ0hfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfQ1dfS0VZX0VYQ0hfQToKKwkJY2FzZSBTU0wzX1NUX0NXX0tFWV9FWENIX0I6CisJCQlyZXQ9c3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2Uocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJLyogRUFZIEVBWSBFQVkgbmVlZCB0byBjaGVjayBmb3IgREggZml4IGNlcnQKKwkJCSAqIHNlbnQgYmFjayAqLworCQkJLyogRm9yIFRMUywgY2VydF9yZXEgaXMgc2V0IHRvIDIsIHNvIGEgY2VydCBjaGFpbgorCQkJICogb2Ygbm90aGluZyBpcyBzZW50LCBidXQgbm8gdmVyaWZ5IHBhY2tldCBpcyBzZW50ICovCisJCQkvKiBYWFg6IEZvciBub3csIHdlIGRvIG5vdCBzdXBwb3J0IGNsaWVudCAKKwkJCSAqIGF1dGhlbnRpY2F0aW9uIGluIEVDREggY2lwaGVyIHN1aXRlcyB3aXRoCisJCQkgKiBFQ0RIIChyYXRoZXIgdGhhbiBFQ0RTQSkgY2VydGlmaWNhdGVzLgorCQkJICogV2UgbmVlZCB0byBza2lwIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZnkgCisJCQkgKiBtZXNzYWdlIHdoZW4gY2xpZW50J3MgRUNESCBwdWJsaWMga2V5IGlzIHNlbnQgCisJCQkgKiBpbnNpZGUgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZS4KKwkJCSAqLworCQkJaWYgKHMtPnMzLT50bXAuY2VydF9yZXEgPT0gMSkKKwkJCQl7CisJCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DRVJUX1ZSRllfQTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfQ0hBTkdFX0E7CisJCQkJcy0+czMtPmNoYW5nZV9jaXBoZXJfc3BlYz0wOworCQkJCX0KKwkJCWlmIChzLT5zMy0+ZmxhZ3MgJiBUTFMxX0ZMQUdTX1NLSVBfQ0VSVF9WRVJJRlkpCisJCQkJeworCQkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfQ0hBTkdFX0E7CisJCQkJcy0+czMtPmNoYW5nZV9jaXBoZXJfc3BlYz0wOworCQkJCX0KKworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9DV19DRVJUX1ZSRllfQToKKwkJY2FzZSBTU0wzX1NUX0NXX0NFUlRfVlJGWV9COgorCQkJcmV0PXNzbDNfc2VuZF9jbGllbnRfdmVyaWZ5KHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfQ0hBTkdFX0E7CisJCQlzLT5pbml0X251bT0wOworCQkJcy0+czMtPmNoYW5nZV9jaXBoZXJfc3BlYz0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NXX0NIQU5HRV9BOgorCQljYXNlIFNTTDNfU1RfQ1dfQ0hBTkdFX0I6CisJCQlyZXQ9c3NsM19zZW5kX2NoYW5nZV9jaXBoZXJfc3BlYyhzLAorCQkJCVNTTDNfU1RfQ1dfQ0hBTkdFX0EsU1NMM19TVF9DV19DSEFOR0VfQik7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+c3RhdGU9U1NMM19TVF9DV19GSU5JU0hFRF9BOworCQkJcy0+aW5pdF9udW09MDsKKworCQkJcy0+c2Vzc2lvbi0+Y2lwaGVyPXMtPnMzLT50bXAubmV3X2NpcGhlcjsKKyNpZmRlZiBPUEVOU1NMX05PX0NPTVAKKwkJCXMtPnNlc3Npb24tPmNvbXByZXNzX21ldGg9MDsKKyNlbHNlCisJCQlpZiAocy0+czMtPnRtcC5uZXdfY29tcHJlc3Npb24gPT0gTlVMTCkKKwkJCQlzLT5zZXNzaW9uLT5jb21wcmVzc19tZXRoPTA7CisJCQllbHNlCisJCQkJcy0+c2Vzc2lvbi0+Y29tcHJlc3NfbWV0aD0KKwkJCQkJcy0+czMtPnRtcC5uZXdfY29tcHJlc3Npb24tPmlkOworI2VuZGlmCisJCQlpZiAoIXMtPm1ldGhvZC0+c3NsM19lbmMtPnNldHVwX2tleV9ibG9jayhzKSkKKwkJCQl7CisJCQkJcmV0PSAtMTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisKKwkJCWlmICghcy0+bWV0aG9kLT5zc2wzX2VuYy0+Y2hhbmdlX2NpcGhlcl9zdGF0ZShzLAorCQkJCVNTTDNfQ0hBTkdFX0NJUEhFUl9DTElFTlRfV1JJVEUpKQorCQkJCXsKKwkJCQlyZXQ9IC0xOworCQkJCWdvdG8gZW5kOworCQkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NXX0ZJTklTSEVEX0E6CisJCWNhc2UgU1NMM19TVF9DV19GSU5JU0hFRF9COgorCQkJcmV0PXNzbDNfc2VuZF9maW5pc2hlZChzLAorCQkJCVNTTDNfU1RfQ1dfRklOSVNIRURfQSxTU0wzX1NUX0NXX0ZJTklTSEVEX0IsCisJCQkJcy0+bWV0aG9kLT5zc2wzX2VuYy0+Y2xpZW50X2ZpbmlzaGVkX2xhYmVsLAorCQkJCXMtPm1ldGhvZC0+c3NsM19lbmMtPmNsaWVudF9maW5pc2hlZF9sYWJlbF9sZW4pOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfRkxVU0g7CisKKwkJCS8qIGNsZWFyIGZsYWdzICovCisJCQlzLT5zMy0+ZmxhZ3MmPSB+U1NMM19GTEFHU19QT1BfQlVGRkVSOworCQkJaWYgKHMtPmhpdCkKKwkJCQl7CisJCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTF9TVF9PSzsKKwkJCQlpZiAocy0+czMtPmZsYWdzICYgU1NMM19GTEFHU19ERUxBWV9DTElFTlRfRklOSVNIRUQpCisJCQkJCXsKKwkJCQkJcy0+c3RhdGU9U1NMX1NUX09LOworCQkJCQlzLT5zMy0+ZmxhZ3N8PVNTTDNfRkxBR1NfUE9QX0JVRkZFUjsKKwkJCQkJcy0+czMtPmRlbGF5X2J1Zl9wb3BfcmV0PTA7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWlmICgoU1NMX2dldF9tb2RlKHMpICYgU1NMX01PREVfSEFORFNIQUtFX0NVVFRIUk9VR0gpICYmIFNTTF9nZXRfY2lwaGVyX2JpdHMocywgTlVMTCkgPj0gMTI4CisJCQkJICAgICYmIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuID09IDAgLyogbm8gY3V0dGhyb3VnaCBvbiByZW5lZ290aWF0aW9uICh3b3VsZCBjb21wbGljYXRlIHRoZSBzdGF0ZSBtYWNoaW5lKSAqLworCQkJCSAgICkKKwkJCQkJeworCQkJCQlpZiAocy0+czMtPmZsYWdzICYgU1NMM19GTEFHU19ERUxBWV9DTElFTlRfRklOSVNIRUQpCisJCQkJCQl7CisJCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX0NVVFRIUk9VR0hfQ09NUExFVEU7CisJCQkJCQlzLT5zMy0+ZmxhZ3N8PVNTTDNfRkxBR1NfUE9QX0JVRkZFUjsKKwkJCQkJCXMtPnMzLT5kZWxheV9idWZfcG9wX3JldD0wOworCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQlzLT5zMy0+dG1wLm5leHRfc3RhdGU9U1NMM19TVF9DVVRUSFJPVUdIX0NPTVBMRVRFOworCQkJCQkJfQorCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCQkJCS8qIEFsbG93IE5ld1Nlc3Npb25UaWNrZXQgaWYgdGlja2V0IGV4cGVjdGVkICovCisJCQkJCWlmIChzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkKQorCQkJCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQTsKKwkJCQkJZWxzZQorI2VuZGlmCisJCQkJCQlzLT5zMy0+dG1wLm5leHRfc3RhdGU9U1NMM19TVF9DUl9GSU5JU0hFRF9BOworCQkJCQl9CisJCQkJfQorCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCWNhc2UgU1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BOgorCQljYXNlIFNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQjoKKwkJCXJldD1zc2wzX2dldF9uZXdfc2Vzc2lvbl90aWNrZXQocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+c3RhdGU9U1NMM19TVF9DUl9GSU5JU0hFRF9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NSX0NFUlRfU1RBVFVTX0E6CisJCWNhc2UgU1NMM19TVF9DUl9DRVJUX1NUQVRVU19COgorCQkJcmV0PXNzbDNfZ2V0X2NlcnRfc3RhdHVzKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1JfS0VZX0VYQ0hfQTsKKwkJCXMtPmluaXRfbnVtPTA7CisJCWJyZWFrOworI2VuZGlmCisKKwkJY2FzZSBTU0wzX1NUX0NSX0ZJTklTSEVEX0E6CisJCWNhc2UgU1NMM19TVF9DUl9GSU5JU0hFRF9COgorCisJCQlyZXQ9c3NsM19nZXRfZmluaXNoZWQocyxTU0wzX1NUX0NSX0ZJTklTSEVEX0EsCisJCQkJU1NMM19TVF9DUl9GSU5JU0hFRF9CKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisKKwkJCWlmIChzLT5oaXQpCisJCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DSEFOR0VfQTsKKwkJCWVsc2UKKwkJCQlzLT5zdGF0ZT1TU0xfU1RfT0s7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NXX0ZMVVNIOgorCQkJcy0+cndzdGF0ZT1TU0xfV1JJVElORzsKKwkJCWlmIChCSU9fZmx1c2gocy0+d2JpbykgPD0gMCkKKwkJCQl7CisJCQkJcmV0PSAtMTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCQkJcy0+c3RhdGU9cy0+czMtPnRtcC5uZXh0X3N0YXRlOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX0NVVFRIUk9VR0hfQ09NUExFVEU6CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCQkvKiBBbGxvdyBOZXdTZXNzaW9uVGlja2V0IGlmIHRpY2tldCBleHBlY3RlZCAqLworCQkJaWYgKHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQpCisJCQkJcy0+c3RhdGU9U1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BOworCQkJZWxzZQorI2VuZGlmCisJCQkJcy0+c3RhdGU9U1NMM19TVF9DUl9GSU5JU0hFRF9BOworCisJCQkvKiBTU0xfd3JpdGUoKSB3aWxsIHRha2UgY2FyZSBvZiBmbHVzaGluZyBidWZmZXJlZCBkYXRhIGlmCisJCQkgKiBERUxBWV9DTElFTlRfRklOSVNIRUQgaXMgc2V0LgorCQkJICovCisJCQlpZiAoIShzLT5zMy0+ZmxhZ3MgJiBTU0wzX0ZMQUdTX0RFTEFZX0NMSUVOVF9GSU5JU0hFRCkpCisJCQkJc3NsX2ZyZWVfd2Jpb19idWZmZXIocyk7CisJCQlyZXQgPSAxOworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKworCQljYXNlIFNTTF9TVF9PSzoKKwkJCS8qIGNsZWFuIGEgZmV3IHRoaW5ncyB1cCAqLworCQkJc3NsM19jbGVhbnVwX2tleV9ibG9jayhzKTsKKworCQkJaWYgKHMtPmluaXRfYnVmICE9IE5VTEwpCisJCQkJeworCQkJCUJVRl9NRU1fZnJlZShzLT5pbml0X2J1Zik7CisJCQkJcy0+aW5pdF9idWY9TlVMTDsKKwkJCQl9CisKKwkJCS8qIElmIHdlIGFyZSBub3QgJ2pvaW5pbmcnIHRoZSBsYXN0IHR3byBwYWNrZXRzLAorCQkJICogcmVtb3ZlIHRoZSBidWZmZXJpbmcgbm93ICovCisJCQlpZiAoIShzLT5zMy0+ZmxhZ3MgJiBTU0wzX0ZMQUdTX1BPUF9CVUZGRVIpKQorCQkJCXNzbF9mcmVlX3diaW9fYnVmZmVyKHMpOworCQkJLyogZWxzZSBkbyBpdCBsYXRlciBpbiBzc2wzX3dyaXRlICovCisKKwkJCXMtPmluaXRfbnVtPTA7CisJCQlzLT5uZXdfc2Vzc2lvbj0wOworCisJCQlzc2xfdXBkYXRlX2NhY2hlKHMsU1NMX1NFU1NfQ0FDSEVfQ0xJRU5UKTsKKwkJCWlmIChzLT5oaXQpIHMtPmN0eC0+c3RhdHMuc2Vzc19oaXQrKzsKKworCQkJcmV0PTE7CisJCQkvKiBzLT5zZXJ2ZXI9MDsgKi8KKwkJCXMtPmhhbmRzaGFrZV9mdW5jPXNzbDNfY29ubmVjdDsKKwkJCXMtPmN0eC0+c3RhdHMuc2Vzc19jb25uZWN0X2dvb2QrKzsKKworCQkJaWYgKGNiICE9IE5VTEwpIGNiKHMsU1NMX0NCX0hBTkRTSEFLRV9ET05FLDEpOworCisJCQlnb3RvIGVuZDsKKwkJCS8qIGJyZWFrOyAqLworCQkJCisJCWRlZmF1bHQ6CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19DT05ORUNULFNTTF9SX1VOS05PV05fU1RBVEUpOworCQkJcmV0PSAtMTsKKwkJCWdvdG8gZW5kOworCQkJLyogYnJlYWs7ICovCisJCQl9CisKKwkJLyogZGlkIHdlIGRvIGFueXRoaW5nICovCisJCWlmICghcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlICYmICFza2lwKQorCQkJeworCQkJaWYgKHMtPmRlYnVnKQorCQkJCXsKKwkJCQlpZiAoKHJldD1CSU9fZmx1c2gocy0+d2JpbykpIDw9IDApCisJCQkJCWdvdG8gZW5kOworCQkJCX0KKworCQkJaWYgKChjYiAhPSBOVUxMKSAmJiAocy0+c3RhdGUgIT0gc3RhdGUpKQorCQkJCXsKKwkJCQluZXdfc3RhdGU9cy0+c3RhdGU7CisJCQkJcy0+c3RhdGU9c3RhdGU7CisJCQkJY2IocyxTU0xfQ0JfQ09OTkVDVF9MT09QLDEpOworCQkJCXMtPnN0YXRlPW5ld19zdGF0ZTsKKwkJCQl9CisJCQl9CisJCXNraXA9MDsKKwkJfQorZW5kOgorCXMtPmluX2hhbmRzaGFrZS0tOworCWlmIChidWYgIT0gTlVMTCkKKwkJQlVGX01FTV9mcmVlKGJ1Zik7CisJaWYgKGNiICE9IE5VTEwpCisJCWNiKHMsU1NMX0NCX0NPTk5FQ1RfRVhJVCxyZXQpOworCXJldHVybihyZXQpOworCX0KKworCitpbnQgc3NsM19jbGllbnRfaGVsbG8oU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgY2hhciAqcCwqZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIFRpbWUsbDsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJaW50IGo7CisJU1NMX0NPTVAgKmNvbXA7CisjZW5kaWYKKworCWJ1Zj0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQSkKKwkJeworCQlTU0xfU0VTU0lPTiAqc2VzcyA9IHMtPnNlc3Npb247CisJCWlmICgoc2VzcyA9PSBOVUxMKSB8fAorCQkJKHNlc3MtPnNzbF92ZXJzaW9uICE9IHMtPnZlcnNpb24pIHx8CisjaWZkZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJCSFzZXNzLT5zZXNzaW9uX2lkX2xlbmd0aCB8fAorI2Vsc2UKKwkJCSghc2Vzcy0+c2Vzc2lvbl9pZF9sZW5ndGggJiYgIXNlc3MtPnRsc2V4dF90aWNrKSB8fAorI2VuZGlmCisJCQkoc2Vzcy0+bm90X3Jlc3VtYWJsZSkpCisJCQl7CisJCSAgICAgICAgaWYgKCFzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQpCisJCQkJeworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DTElFTlRfSEVMTE8sU1NMX1JfU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmICghc3NsX2dldF9uZXdfc2Vzc2lvbihzLDApKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQkvKiBlbHNlIHVzZSB0aGUgcHJlLWxvYWRlZCBzZXNzaW9uICovCisKKwkJcD1zLT5zMy0+Y2xpZW50X3JhbmRvbTsKKwkJVGltZT0odW5zaWduZWQgbG9uZyl0aW1lKE5VTEwpOwkJCS8qIFRpbWUgKi8KKwkJbDJuKFRpbWUscCk7CisJCWlmIChSQU5EX3BzZXVkb19ieXRlcyhwLFNTTDNfUkFORE9NX1NJWkUtNCkgPD0gMCkKKwkJCWdvdG8gZXJyOworCisJCS8qIERvIHRoZSBtZXNzYWdlIHR5cGUgYW5kIGxlbmd0aCBsYXN0ICovCisJCWQ9cD0gJihidWZbNF0pOworCisJCSoocCsrKT1zLT52ZXJzaW9uPj44OworCQkqKHArKyk9cy0+dmVyc2lvbiYweGZmOworCQlzLT5jbGllbnRfdmVyc2lvbj1zLT52ZXJzaW9uOworCisJCS8qIFJhbmRvbSBzdHVmZiAqLworCQltZW1jcHkocCxzLT5zMy0+Y2xpZW50X3JhbmRvbSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJcCs9U1NMM19SQU5ET01fU0laRTsKKworCQkvKiBTZXNzaW9uIElEICovCisJCWlmIChzLT5uZXdfc2Vzc2lvbikKKwkJCWk9MDsKKwkJZWxzZQorCQkJaT1zLT5zZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aDsKKwkJKihwKyspPWk7CisJCWlmIChpICE9IDApCisJCQl7CisJCQlpZiAoaSA+IChpbnQpc2l6ZW9mKHMtPnNlc3Npb24tPnNlc3Npb25faWQpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DTElFTlRfSEVMTE8sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQltZW1jcHkocCxzLT5zZXNzaW9uLT5zZXNzaW9uX2lkLGkpOworCQkJcCs9aTsKKwkJCX0KKwkJCisJCS8qIENpcGhlcnMgc3VwcG9ydGVkICovCisJCWk9c3NsX2NpcGhlcl9saXN0X3RvX2J5dGVzKHMsU1NMX2dldF9jaXBoZXJzKHMpLCYocFsyXSksMCk7CisJCWlmIChpID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19DTElFTlRfSEVMTE8sU1NMX1JfTk9fQ0lQSEVSU19BVkFJTEFCTEUpOworCQkJZ290byBlcnI7CisJCQl9CisJCXMybihpLHApOworCQlwKz1pOworCisJCS8qIENPTVBSRVNTSU9OICovCisjaWZkZWYgT1BFTlNTTF9OT19DT01QCisJCSoocCsrKT0xOworI2Vsc2UKKworCQlpZiAoKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fQ09NUFJFU1NJT04pCisJCQkJCXx8ICFzLT5jdHgtPmNvbXBfbWV0aG9kcykKKwkJCWo9MDsKKwkJZWxzZQorCQkJaj1za19TU0xfQ09NUF9udW0ocy0+Y3R4LT5jb21wX21ldGhvZHMpOworCQkqKHArKyk9MStqOworCQlmb3IgKGk9MDsgaTxqOyBpKyspCisJCQl7CisJCQljb21wPXNrX1NTTF9DT01QX3ZhbHVlKHMtPmN0eC0+Y29tcF9tZXRob2RzLGkpOworCQkJKihwKyspPWNvbXAtPmlkOworCQkJfQorI2VuZGlmCisJCSoocCsrKT0wOyAvKiBBZGQgdGhlIE5VTEwgbWV0aG9kICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJLyogVExTIGV4dGVuc2lvbnMqLworCQlpZiAoc3NsX3ByZXBhcmVfY2xpZW50aGVsbG9fdGxzZXh0KHMpIDw9IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19DTElFTlRfSEVMTE8sU1NMX1JfQ0xJRU5USEVMTE9fVExTRVhUKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAoKHAgPSBzc2xfYWRkX2NsaWVudGhlbGxvX3Rsc2V4dChzLCBwLCBidWYrU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIKSkgPT0gTlVMTCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0NMSUVOVF9IRUxMTyxFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKyNlbmRpZgorCQkKKwkJbD0ocC1kKTsKKwkJZD1idWY7CisJCSooZCsrKT1TU0wzX01UX0NMSUVOVF9IRUxMTzsKKwkJbDJuMyhsLGQpOworCisJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19COworCQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJcy0+aW5pdF9udW09cC1idWY7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKworCS8qIFNTTDNfU1RfQ1dfQ0xOVF9IRUxMT19CICovCisJcmV0dXJuKHNzbDNfZG9fd3JpdGUocyxTU0wzX1JUX0hBTkRTSEFLRSkpOworZXJyOgorCXJldHVybigtMSk7CisJfQorCitpbnQgc3NsM19nZXRfc2VydmVyX2hlbGxvKFNTTCAqcykKKwl7CisJU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnNrOworCWNvbnN0IFNTTF9DSVBIRVIgKmM7CisJdW5zaWduZWQgY2hhciAqcCwqZDsKKwlpbnQgaSxhbCxvazsKKwl1bnNpZ25lZCBpbnQgajsKKwlsb25nIG47CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCVNTTF9DT01QICpjb21wOworI2VuZGlmCisKKwluPXMtPm1ldGhvZC0+c3NsX2dldF9tZXNzYWdlKHMsCisJCVNTTDNfU1RfQ1JfU1JWUl9IRUxMT19BLAorCQlTU0wzX1NUX0NSX1NSVlJfSEVMTE9fQiwKKwkJLTEsCisJCTIwMDAwLCAvKiA/PyAqLworCQkmb2spOworCisJaWYgKCFvaykgcmV0dXJuKChpbnQpbik7CisKKwlpZiAoIFNTTF92ZXJzaW9uKHMpID09IERUTFMxX1ZFUlNJT04gfHwgU1NMX3ZlcnNpb24ocykgPT0gRFRMUzFfQkFEX1ZFUikKKwkJeworCQlpZiAoIHMtPnMzLT50bXAubWVzc2FnZV90eXBlID09IERUTFMxX01UX0hFTExPX1ZFUklGWV9SRVFVRVNUKQorCQkJeworCQkJaWYgKCBzLT5kMS0+c2VuZF9jb29raWUgPT0gMCkKKwkJCQl7CisJCQkJcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlID0gMTsKKwkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQllbHNlIC8qIGFscmVhZHkgc2VudCBhIGNvb2tpZSAqLworCQkJCXsKKwkJCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfQkFEX01FU1NBR0VfVFlQRSk7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQl9CisJCX0KKwkKKwlpZiAoIHMtPnMzLT50bXAubWVzc2FnZV90eXBlICE9IFNTTDNfTVRfU0VSVkVSX0hFTExPKQorCQl7CisJCWFsPVNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfQkFEX01FU1NBR0VfVFlQRSk7CisJCWdvdG8gZl9lcnI7CisJCX0KKworCWQ9cD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfbXNnOworCisJaWYgKChwWzBdICE9IChzLT52ZXJzaW9uPj44KSkgfHwgKHBbMV0gIT0gKHMtPnZlcnNpb24mMHhmZikpKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfV1JPTkdfU1NMX1ZFUlNJT04pOworCQlzLT52ZXJzaW9uPShzLT52ZXJzaW9uJjB4ZmYwMCl8cFsxXTsKKwkJYWw9U1NMX0FEX1BST1RPQ09MX1ZFUlNJT047CisJCWdvdG8gZl9lcnI7CisJCX0KKwlwKz0yOworCisJLyogbG9hZCB0aGUgc2VydmVyIGhlbGxvIGRhdGEgKi8KKwkvKiBsb2FkIHRoZSBzZXJ2ZXIgcmFuZG9tICovCisJbWVtY3B5KHMtPnMzLT5zZXJ2ZXJfcmFuZG9tLHAsU1NMM19SQU5ET01fU0laRSk7CisJcCs9U1NMM19SQU5ET01fU0laRTsKKworCS8qIGdldCB0aGUgc2Vzc2lvbi1pZCAqLworCWo9ICoocCsrKTsKKworCWlmICgoaiA+IHNpemVvZiBzLT5zZXNzaW9uLT5zZXNzaW9uX2lkKSB8fCAoaiA+IFNTTDNfU0VTU0lPTl9JRF9TSVpFKSkKKwkJeworCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfU1NMM19TRVNTSU9OX0lEX1RPT19MT05HKTsKKwkJZ290byBmX2VycjsKKwkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJLyogY2hlY2sgaWYgd2Ugd2FudCB0byByZXN1bWUgdGhlIHNlc3Npb24gYmFzZWQgb24gZXh0ZXJuYWwgcHJlLXNoYXJlZCBzZWNyZXQgKi8KKwlpZiAocy0+dmVyc2lvbiA+PSBUTFMxX1ZFUlNJT04gJiYgcy0+dGxzX3Nlc3Npb25fc2VjcmV0X2NiKQorCQl7CisJCVNTTF9DSVBIRVIgKnByZWZfY2lwaGVyPU5VTEw7CisJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoPXNpemVvZihzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5KTsKKwkJaWYgKHMtPnRsc19zZXNzaW9uX3NlY3JldF9jYihzLCBzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LAorCQkJCQkgICAgICZzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCwKKwkJCQkJICAgICBOVUxMLCAmcHJlZl9jaXBoZXIsCisJCQkJCSAgICAgcy0+dGxzX3Nlc3Npb25fc2VjcmV0X2NiX2FyZykpCisJCQl7CisJCQlzLT5zZXNzaW9uLT5jaXBoZXIgPSBwcmVmX2NpcGhlciA/CisJCQkJcHJlZl9jaXBoZXIgOiBzc2xfZ2V0X2NpcGhlcl9ieV9jaGFyKHMsIHAraik7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBPUEVOU1NMX05PX1RMU0VYVCAqLworCisJaWYgKGogIT0gMCAmJiBqID09IHMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoCisJICAgICYmIG1lbWNtcChwLHMtPnNlc3Npb24tPnNlc3Npb25faWQsaikgPT0gMCkKKwkgICAgeworCSAgICBpZihzLT5zaWRfY3R4X2xlbmd0aCAhPSBzLT5zZXNzaW9uLT5zaWRfY3R4X2xlbmd0aAorCSAgICAgICB8fCBtZW1jbXAocy0+c2Vzc2lvbi0+c2lkX2N0eCxzLT5zaWRfY3R4LHMtPnNpZF9jdHhfbGVuZ3RoKSkKKwkJeworCQkvKiBhY3R1YWxseSBhIGNsaWVudCBhcHBsaWNhdGlvbiBidWcgKi8KKwkJYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0hFTExPLFNTTF9SX0FUVEVNUFRfVE9fUkVVU0VfU0VTU0lPTl9JTl9ESUZGRVJFTlRfQ09OVEVYVCk7CisJCWdvdG8gZl9lcnI7CisJCX0KKwkgICAgcy0+aGl0PTE7CisJICAgIH0KKwllbHNlCS8qIGEgbWlzcyBvciBjcmFwIGZyb20gdGhlIG90aGVyIGVuZCAqLworCQl7CisJCS8qIElmIHdlIHdlcmUgdHJ5aW5nIGZvciBzZXNzaW9uLWlkIHJldXNlLCBtYWtlIGEgbmV3CisJCSAqIFNTTF9TRVNTSU9OIHNvIHdlIGRvbid0IHN0dWZmIHVwIG90aGVyIHBlb3BsZSAqLworCQlzLT5oaXQ9MDsKKwkJaWYgKHMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoID4gMCkKKwkJCXsKKwkJICAgICAgICBpZiAoIXMtPnNlc3Npb25fY3JlYXRpb25fZW5hYmxlZCkKKwkJCQl7CisJCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCWlmICghc3NsX2dldF9uZXdfc2Vzc2lvbihzLDApKQorCQkJCXsKKwkJCQlhbD1TU0xfQURfSU5URVJOQUxfRVJST1I7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQl9CisJCXMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoPWo7CisJCW1lbWNweShzLT5zZXNzaW9uLT5zZXNzaW9uX2lkLHAsaik7IC8qIGogY291bGQgYmUgMCAqLworCQl9CisJcCs9ajsKKwljPXNzbF9nZXRfY2lwaGVyX2J5X2NoYXIocyxwKTsKKwlpZiAoYyA9PSBOVUxMKQorCQl7CisJCS8qIHVua25vd24gY2lwaGVyICovCisJCWFsPVNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9IRUxMTyxTU0xfUl9VTktOT1dOX0NJUEhFUl9SRVRVUk5FRCk7CisJCWdvdG8gZl9lcnI7CisJCX0KKwlwKz1zc2xfcHV0X2NpcGhlcl9ieV9jaGFyKHMsTlVMTCxOVUxMKTsKKworCXNrPXNzbF9nZXRfY2lwaGVyc19ieV9pZChzKTsKKwlpPXNrX1NTTF9DSVBIRVJfZmluZChzayxjKTsKKwlpZiAoaSA8IDApCisJCXsKKwkJLyogd2UgZGlkIG5vdCBzYXkgd2Ugd291bGQgdXNlIHRoaXMgY2lwaGVyICovCisJCWFsPVNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9IRUxMTyxTU0xfUl9XUk9OR19DSVBIRVJfUkVUVVJORUQpOworCQlnb3RvIGZfZXJyOworCQl9CisKKwkvKiBEZXBlbmRpbmcgb24gdGhlIHNlc3Npb24gY2FjaGluZyAoaW50ZXJuYWwvZXh0ZXJuYWwpLCB0aGUgY2lwaGVyCisJICAgYW5kL29yIGNpcGhlcl9pZCB2YWx1ZXMgbWF5IG5vdCBiZSBzZXQuIE1ha2Ugc3VyZSB0aGF0CisJICAgY2lwaGVyX2lkIGlzIHNldCBhbmQgdXNlIGl0IGZvciBjb21wYXJpc29uLiAqLworCWlmIChzLT5zZXNzaW9uLT5jaXBoZXIpCisJCXMtPnNlc3Npb24tPmNpcGhlcl9pZCA9IHMtPnNlc3Npb24tPmNpcGhlci0+aWQ7CisJaWYgKHMtPmhpdCAmJiAocy0+c2Vzc2lvbi0+Y2lwaGVyX2lkICE9IGMtPmlkKSkKKwkJeworCQlpZiAoIShzLT5vcHRpb25zICYKKwkJCVNTTF9PUF9ORVRTQ0FQRV9SRVVTRV9DSVBIRVJfQ0hBTkdFX0JVRykpCisJCQl7CisJCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0hFTExPLFNTTF9SX09MRF9TRVNTSU9OX0NJUEhFUl9OT1RfUkVUVVJORUQpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJfQorCXMtPnMzLT50bXAubmV3X2NpcGhlcj1jOworCWlmICghc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMocykpCisJCWdvdG8gZl9lcnI7CisKKwkvKiBsZXRzIGdldCB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtICovCisJLyogQ09NUFJFU1NJT04gKi8KKyNpZmRlZiBPUEVOU1NMX05PX0NPTVAKKwlpZiAoKihwKyspICE9IDApCisJCXsKKwkJYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0hFTExPLFNTTF9SX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OX0FMR09SSVRITSk7CisJCWdvdG8gZl9lcnI7CisJCX0KKwkvKiBJZiBjb21wcmVzc2lvbiBpcyBkaXNhYmxlZCB3ZSdkIGJldHRlciBub3QgdHJ5IHRvIHJlc3VtZSBhIHNlc3Npb24KKwkgKiB1c2luZyBjb21wcmVzc2lvbi4KKwkgKi8KKwlpZiAocy0+c2Vzc2lvbi0+Y29tcHJlc3NfbWV0aCAhPSAwKQorCQl7CisJCWFsPVNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9IRUxMTyxTU0xfUl9JTkNPTlNJU1RFTlRfQ09NUFJFU1NJT04pOworCQlnb3RvIGZfZXJyOworCQl9CisjZWxzZQorCWo9ICoocCsrKTsKKwlpZiAocy0+aGl0ICYmIGogIT0gcy0+c2Vzc2lvbi0+Y29tcHJlc3NfbWV0aCkKKwkJeworCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfT0xEX1NFU1NJT05fQ09NUFJFU1NJT05fQUxHT1JJVEhNX05PVF9SRVRVUk5FRCk7CisJCWdvdG8gZl9lcnI7CisJCX0KKwlpZiAoaiA9PSAwKQorCQljb21wPU5VTEw7CisJZWxzZSBpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9OT19DT01QUkVTU0lPTikKKwkJeworCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfQ09NUFJFU1NJT05fRElTQUJMRUQpOworCQlnb3RvIGZfZXJyOworCQl9CisJZWxzZQorCQljb21wPXNzbDNfY29tcF9maW5kKHMtPmN0eC0+Y29tcF9tZXRob2RzLGopOworCQorCWlmICgoaiAhPSAwKSAmJiAoY29tcCA9PSBOVUxMKSkKKwkJeworCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8sU1NMX1JfVU5TVVBQT1JURURfQ09NUFJFU1NJT05fQUxHT1JJVEhNKTsKKwkJZ290byBmX2VycjsKKwkJfQorCWVsc2UKKwkJeworCQlzLT5zMy0+dG1wLm5ld19jb21wcmVzc2lvbj1jb21wOworCQl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCS8qIFRMUyBleHRlbnNpb25zKi8KKwlpZiAocy0+dmVyc2lvbiA+PSBTU0wzX1ZFUlNJT04pCisJCXsKKwkJaWYgKCFzc2xfcGFyc2Vfc2VydmVyaGVsbG9fdGxzZXh0KHMsJnAsZCxuLCAmYWwpKQorCQkJeworCQkJLyogJ2FsJyBzZXQgYnkgc3NsX3BhcnNlX3NlcnZlcmhlbGxvX3Rsc2V4dCAqLworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9IRUxMTyxTU0xfUl9QQVJTRV9UTFNFWFQpOworCQkJZ290byBmX2VycjsgCisJCQl9CisJCWlmIChzc2xfY2hlY2tfc2VydmVyaGVsbG9fdGxzZXh0KHMpIDw9IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0hFTExPLFNTTF9SX1NFUlZFUkhFTExPX1RMU0VYVCk7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKyNlbmRpZgorCisJaWYgKHAgIT0gKGQrbikpCisJCXsKKwkJLyogd3JvbmcgcGFja2V0IGxlbmd0aCAqLworCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0hFTExPLFNTTF9SX0JBRF9QQUNLRVRfTEVOR1RIKTsKKwkJZ290byBlcnI7CisJCX0KKworCXJldHVybigxKTsKK2ZfZXJyOgorCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsYWwpOworZXJyOgorCXJldHVybigtMSk7CisJfQorCitpbnQgc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlKFNTTCAqcykKKwl7CisJaW50IGFsLGksb2sscmV0PSAtMTsKKwl1bnNpZ25lZCBsb25nIG4sbmMsbGxlbixsOworCVg1MDkgKng9TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpxLCpwOworCXVuc2lnbmVkIGNoYXIgKmQ7CisJU1RBQ0tfT0YoWDUwOSkgKnNrPU5VTEw7CisJU0VTU19DRVJUICpzYzsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCWludCBuZWVkX2NlcnQgPSAxOyAvKiBWUlM6IDA9PiB3aWxsIGFsbG93IG51bGwgY2VydCBpZiBhdXRoID09IEtSQjUgKi8KKworCW49cy0+bWV0aG9kLT5zc2xfZ2V0X21lc3NhZ2UocywKKwkJU1NMM19TVF9DUl9DRVJUX0EsCisJCVNTTDNfU1RfQ1JfQ0VSVF9CLAorCQktMSwKKwkJcy0+bWF4X2NlcnRfbGlzdCwKKwkJJm9rKTsKKworCWlmICghb2spIHJldHVybigoaW50KW4pOworCisJaWYgKChzLT5zMy0+dG1wLm1lc3NhZ2VfdHlwZSA9PSBTU0wzX01UX1NFUlZFUl9LRVlfRVhDSEFOR0UpIHx8CisJCSgocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aCAmIFNTTF9hS1JCNSkgJiYgCisJCShzLT5zMy0+dG1wLm1lc3NhZ2VfdHlwZSA9PSBTU0wzX01UX1NFUlZFUl9ET05FKSkpCisJCXsKKwkJcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlPTE7CisJCXJldHVybigxKTsKKwkJfQorCisJaWYgKHMtPnMzLT50bXAubWVzc2FnZV90eXBlICE9IFNTTDNfTVRfQ0VSVElGSUNBVEUpCisJCXsKKwkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9DRVJUSUZJQ0FURSxTU0xfUl9CQURfTUVTU0FHRV9UWVBFKTsKKwkJZ290byBmX2VycjsKKwkJfQorCXA9ZD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfbXNnOworCisJaWYgKChzaz1za19YNTA5X25ld19udWxsKCkpID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9DRVJUSUZJQ0FURSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwluMmwzKHAsbGxlbik7CisJaWYgKGxsZW4rMyAhPSBuKQorCQl7CisJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfQ0VSVElGSUNBVEUsU1NMX1JfTEVOR1RIX01JU01BVENIKTsKKwkJZ290byBmX2VycjsKKwkJfQorCWZvciAobmM9MDsgbmM8bGxlbjsgKQorCQl7CisJCW4ybDMocCxsKTsKKwkJaWYgKChsK25jKzMpID4gbGxlbikKKwkJCXsKKwkJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0NFUlRJRklDQVRFLFNTTF9SX0NFUlRfTEVOR1RIX01JU01BVENIKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKwkJcT1wOworCQl4PWQyaV9YNTA5KE5VTEwsJnEsbCk7CisJCWlmICh4ID09IE5VTEwpCisJCQl7CisJCQlhbD1TU0xfQURfQkFEX0NFUlRJRklDQVRFOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9DRVJUSUZJQ0FURSxFUlJfUl9BU04xX0xJQik7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQlpZiAocSAhPSAocCtsKSkKKwkJCXsKKwkJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0NFUlRJRklDQVRFLFNTTF9SX0NFUlRfTEVOR1RIX01JU01BVENIKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCWlmICghc2tfWDUwOV9wdXNoKHNrLHgpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9DRVJUSUZJQ0FURSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJeD1OVUxMOworCQluYys9bCszOworCQlwPXE7CisJCX0KKworCWk9c3NsX3ZlcmlmeV9jZXJ0X2NoYWluKHMsc2spOworCWlmICgocy0+dmVyaWZ5X21vZGUgIT0gU1NMX1ZFUklGWV9OT05FKSAmJiAoaSA8PSAwKQorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwkgICAgJiYgISgocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleSAmIFNTTF9rS1JCNSkgJiYKKwkJIChzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoICYgU1NMX2FLUkI1KSkKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0tSQjUgKi8KKwkJKQorCQl7CisJCWFsPXNzbF92ZXJpZnlfYWxhcm1fdHlwZShzLT52ZXJpZnlfcmVzdWx0KTsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9DRVJUSUZJQ0FURSxTU0xfUl9DRVJUSUZJQ0FURV9WRVJJRllfRkFJTEVEKTsKKwkJZ290byBmX2VycjsgCisJCX0KKwlFUlJfY2xlYXJfZXJyb3IoKTsgLyogYnV0IHdlIGtlZXAgcy0+dmVyaWZ5X3Jlc3VsdCAqLworCisJc2M9c3NsX3Nlc3NfY2VydF9uZXcoKTsKKwlpZiAoc2MgPT0gTlVMTCkgZ290byBlcnI7CisKKwlpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0KSBzc2xfc2Vzc19jZXJ0X2ZyZWUocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0KTsKKwlzLT5zZXNzaW9uLT5zZXNzX2NlcnQ9c2M7CisKKwlzYy0+Y2VydF9jaGFpbj1zazsKKwkvKiBJbmNvbnNpc3RlbmN5IGFsZXJ0OiBjZXJ0X2NoYWluIGRvZXMgaW5jbHVkZSB0aGUgcGVlcidzCisJICogY2VydGlmaWNhdGUsIHdoaWNoIHdlIGRvbid0IGluY2x1ZGUgaW4gczNfc3J2ci5jICovCisJeD1za19YNTA5X3ZhbHVlKHNrLDApOworCXNrPU5VTEw7CisgCS8qIFZSUyAxOTk5MDYyMTogcG9zc2libGUgbWVtb3J5IGxlYWs7IHNrPW51bGwgPT0+ICFza19wb3BfZnJlZSgpIEBlbmQqLworCisJcGtleT1YNTA5X2dldF9wdWJrZXkoeCk7CisKKwkvKiBWUlM6IGFsbG93IG51bGwgY2VydCBpZiBhdXRoID09IEtSQjUgKi8KKwluZWVkX2NlcnQgPSAoKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX21rZXkgJiBTU0xfa0tSQjUpICYmCisJICAgICAgICAgICAgKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGggJiBTU0xfYUtSQjUpKQorCSAgICAgICAgICAgID8gMCA6IDE7CisKKyNpZmRlZiBLU1NMX0RFQlVHCisJcHJpbnRmKCJwa2V5LHggPSAlcCwgJXBcbiIsIHBrZXkseCk7CisJcHJpbnRmKCJzc2xfY2VydF90eXBlKHgscGtleSkgPSAlZFxuIiwgc3NsX2NlcnRfdHlwZSh4LHBrZXkpKTsKKwlwcmludGYoImNpcGhlciwgYWxnLCBuYyA9ICVzLCAlbHgsICVseCwgJWRcbiIsIHMtPnMzLT50bXAubmV3X2NpcGhlci0+bmFtZSwKKwkJcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleSwgcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aCwgbmVlZF9jZXJ0KTsKKyNlbmRpZiAgICAvKiBLU1NMX0RFQlVHICovCisKKwlpZiAobmVlZF9jZXJ0ICYmICgocGtleSA9PSBOVUxMKSB8fCBFVlBfUEtFWV9taXNzaW5nX3BhcmFtZXRlcnMocGtleSkpKQorCQl7CisJCXg9TlVMTDsKKwkJYWw9U1NMM19BTF9GQVRBTDsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9DRVJUSUZJQ0FURSwKKwkJCVNTTF9SX1VOQUJMRV9UT19GSU5EX1BVQkxJQ19LRVlfUEFSQU1FVEVSUyk7CisJCWdvdG8gZl9lcnI7CisJCX0KKworCWk9c3NsX2NlcnRfdHlwZSh4LHBrZXkpOworCWlmIChuZWVkX2NlcnQgJiYgaSA8IDApCisJCXsKKwkJeD1OVUxMOworCQlhbD1TU0wzX0FMX0ZBVEFMOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0NFUlRJRklDQVRFLAorCQkJU1NMX1JfVU5LTk9XTl9DRVJUSUZJQ0FURV9UWVBFKTsKKwkJZ290byBmX2VycjsKKwkJfQorCisJaWYgKG5lZWRfY2VydCkKKwkJeworCQlzYy0+cGVlcl9jZXJ0X3R5cGU9aTsKKwkJQ1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDkpOworCQkvKiBXaHkgd291bGQgdGhlIGZvbGxvd2luZyBldmVyIGhhcHBlbj8KKwkJICogV2UganVzdCBjcmVhdGVkIHNjIGEgY291cGxlIG9mIGxpbmVzIGFnby4gKi8KKwkJaWYgKHNjLT5wZWVyX3BrZXlzW2ldLng1MDkgIT0gTlVMTCkKKwkJCVg1MDlfZnJlZShzYy0+cGVlcl9wa2V5c1tpXS54NTA5KTsKKwkJc2MtPnBlZXJfcGtleXNbaV0ueDUwOT14OworCQlzYy0+cGVlcl9rZXk9ICYoc2MtPnBlZXJfcGtleXNbaV0pOworCisJCWlmIChzLT5zZXNzaW9uLT5wZWVyICE9IE5VTEwpCisJCQlYNTA5X2ZyZWUocy0+c2Vzc2lvbi0+cGVlcik7CisJCUNSWVBUT19hZGQoJngtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19YNTA5KTsKKwkJcy0+c2Vzc2lvbi0+cGVlcj14OworCQl9CisJZWxzZQorCQl7CisJCXNjLT5wZWVyX2NlcnRfdHlwZT1pOworCQlzYy0+cGVlcl9rZXk9IE5VTEw7CisKKwkJaWYgKHMtPnNlc3Npb24tPnBlZXIgIT0gTlVMTCkKKwkJCVg1MDlfZnJlZShzLT5zZXNzaW9uLT5wZWVyKTsKKwkJcy0+c2Vzc2lvbi0+cGVlcj1OVUxMOworCQl9CisJcy0+c2Vzc2lvbi0+dmVyaWZ5X3Jlc3VsdCA9IHMtPnZlcmlmeV9yZXN1bHQ7CisKKwl4PU5VTEw7CisJcmV0PTE7CisKKwlpZiAoMCkKKwkJeworZl9lcnI6CisJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsYWwpOworCQl9CitlcnI6CisJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlYNTA5X2ZyZWUoeCk7CisJc2tfWDUwOV9wb3BfZnJlZShzayxYNTA5X2ZyZWUpOworCXJldHVybihyZXQpOworCX0KKworaW50IHNzbDNfZ2V0X2tleV9leGNoYW5nZShTU0wgKnMpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXVuc2lnbmVkIGNoYXIgKnEsbWRfYnVmW0VWUF9NQVhfTURfU0laRSoyXTsKKyNlbmRpZgorCUVWUF9NRF9DVFggbWRfY3R4OworCXVuc2lnbmVkIGNoYXIgKnBhcmFtLCpwOworCWludCBhbCxpLGoscGFyYW1fbGVuLG9rOworCWxvbmcgbixhbGdfayxhbGdfYTsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCVJTQSAqcnNhPU5VTEw7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCURIICpkaD1OVUxMOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCUVDX0tFWSAqZWNkaCA9IE5VTEw7CisJQk5fQ1RYICpibl9jdHggPSBOVUxMOworCUVDX1BPSU5UICpzcnZyX2VjcG9pbnQgPSBOVUxMOworCWludCBjdXJ2ZV9uaWQgPSAwOworCWludCBlbmNvZGVkX3B0X2xlbiA9IDA7CisjZW5kaWYKKworCS8qIHVzZSBzYW1lIG1lc3NhZ2Ugc2l6ZSBhcyBpbiBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KCkKKwkgKiBhcyBTZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlIG1heSBiZSBza2lwcGVkICovCisJbj1zLT5tZXRob2QtPnNzbF9nZXRfbWVzc2FnZShzLAorCQlTU0wzX1NUX0NSX0tFWV9FWENIX0EsCisJCVNTTDNfU1RfQ1JfS0VZX0VYQ0hfQiwKKwkJLTEsCisJCXMtPm1heF9jZXJ0X2xpc3QsCisJCSZvayk7CisJaWYgKCFvaykgcmV0dXJuKChpbnQpbik7CisKKwlpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgIT0gU1NMM19NVF9TRVJWRVJfS0VZX0VYQ0hBTkdFKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJCS8qIEluIHBsYWluIFBTSyBjaXBoZXJzdWl0ZSwgU2VydmVyS2V5RXhjaGFuZ2UgY2FuIGJlCisJCSAgIG9taXR0ZWQgaWYgbm8gaWRlbnRpdHkgaGludCBpcyBzZW50LiBTZXQKKwkJICAgc2Vzc2lvbi0+c2Vzc19jZXJ0IGFueXdheSB0byBhdm9pZCBwcm9ibGVtcworCQkgICBsYXRlci4qLworCQlpZiAocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleSAmIFNTTF9rUFNLKQorCQkJeworCQkJcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0PXNzbF9zZXNzX2NlcnRfbmV3KCk7CisJCQlpZiAocy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCkKKwkJCQlPUEVOU1NMX2ZyZWUocy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCk7CisJCQlzLT5jdHgtPnBza19pZGVudGl0eV9oaW50ID0gTlVMTDsKKwkJCX0KKyNlbmRpZgorCQlzLT5zMy0+dG1wLnJldXNlX21lc3NhZ2U9MTsKKwkJcmV0dXJuKDEpOworCQl9CisKKwlwYXJhbT1wPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9tc2c7CisJaWYgKHMtPnNlc3Npb24tPnNlc3NfY2VydCAhPSBOVUxMKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCWlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcnNhX3RtcCAhPSBOVUxMKQorCQkJeworCQkJUlNBX2ZyZWUocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX3JzYV90bXApOworCQkJcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX3JzYV90bXA9TlVMTDsKKwkJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCWlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfZGhfdG1wKQorCQkJeworCQkJREhfZnJlZShzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfZGhfdG1wKTsKKwkJCXMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9kaF90bXA9TlVMTDsKKwkJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJaWYgKHMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9lY2RoX3RtcCkKKwkJCXsKKwkJCUVDX0tFWV9mcmVlKHMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9lY2RoX3RtcCk7CisJCQlzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfZWNkaF90bXA9TlVMTDsKKwkJCX0KKyNlbmRpZgorCQl9CisJZWxzZQorCQl7CisJCXMtPnNlc3Npb24tPnNlc3NfY2VydD1zc2xfc2Vzc19jZXJ0X25ldygpOworCQl9CisKKwlwYXJhbV9sZW49MDsKKwlhbGdfaz1zLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OworCWFsZ19hPXMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGg7CisJRVZQX01EX0NUWF9pbml0KCZtZF9jdHgpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJaWYgKGFsZ19rICYgU1NMX2tQU0spCisJCXsKKwkJY2hhciB0bXBfaWRfaGludFtQU0tfTUFYX0lERU5USVRZX0xFTisxXTsKKworCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCW4ycyhwLGkpOworCQlwYXJhbV9sZW49aSsyOworCQkvKiBTdG9yZSBQU0sgaWRlbnRpdHkgaGludCBmb3IgbGF0ZXIgdXNlLCBoaW50IGlzIHVzZWQKKwkJICogaW4gc3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UuICBBc3N1bWUgdGhhdCB0aGUKKwkJICogbWF4aW11bSBsZW5ndGggb2YgYSBQU0sgaWRlbnRpdHkgaGludCBjYW4gYmUgYXMKKwkJICogbG9uZyBhcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBQU0sgaWRlbnRpdHkuICovCisJCWlmIChpID4gUFNLX01BWF9JREVOVElUWV9MRU4pCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLAorCQkJCVNTTF9SX0RBVEFfTEVOR1RIX1RPT19MT05HKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCWlmIChwYXJhbV9sZW4gPiBuKQorCQkJeworCQkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsCisJCQkJU1NMX1JfQkFEX1BTS19JREVOVElUWV9ISU5UX0xFTkdUSCk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQkvKiBJZiByZWNlaXZlZCBQU0sgaWRlbnRpdHkgaGludCBjb250YWlucyBOVUxMCisJCSAqIGNoYXJhY3RlcnMsIHRoZSBoaW50IGlzIHRydW5jYXRlZCBmcm9tIHRoZSBmaXJzdAorCQkgKiBOVUxMLiBwIG1heSBub3QgYmUgZW5kaW5nIHdpdGggTlVMTCwgc28gY3JlYXRlIGEKKwkJICogTlVMTC10ZXJtaW5hdGVkIHN0cmluZy4gKi8KKwkJbWVtY3B5KHRtcF9pZF9oaW50LCBwLCBpKTsKKwkJbWVtc2V0KHRtcF9pZF9oaW50K2ksIDAsIFBTS19NQVhfSURFTlRJVFlfTEVOKzEtaSk7CisJCWlmIChzLT5jdHgtPnBza19pZGVudGl0eV9oaW50ICE9IE5VTEwpCisJCQlPUEVOU1NMX2ZyZWUocy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCk7CisJCXMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQgPSBCVUZfc3RyZHVwKHRtcF9pZF9oaW50KTsKKwkJaWYgKHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQgPT0gTlVMTCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CSAgIAorCisJCXArPWk7CisJCW4tPXBhcmFtX2xlbjsKKwkJfQorCWVsc2UKKyNlbmRpZiAvKiAhT1BFTlNTTF9OT19QU0sgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwlpZiAoYWxnX2sgJiBTU0xfa1JTQSkKKwkJeworCQlpZiAoKHJzYT1SU0FfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQluMnMocCxpKTsKKwkJcGFyYW1fbGVuPWkrMjsKKwkJaWYgKHBhcmFtX2xlbiA+IG4pCisJCQl7CisJCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9CQURfUlNBX01PRFVMVVNfTEVOR1RIKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCWlmICghKHJzYS0+bj1CTl9iaW4yYm4ocCxpLHJzYS0+bikpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxFUlJfUl9CTl9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCXArPWk7CisKKwkJbjJzKHAsaSk7CisJCXBhcmFtX2xlbis9aSsyOworCQlpZiAocGFyYW1fbGVuID4gbikKKwkJCXsKKwkJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLFNTTF9SX0JBRF9SU0FfRV9MRU5HVEgpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJaWYgKCEocnNhLT5lPUJOX2JpbjJibihwLGkscnNhLT5lKSkpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLEVSUl9SX0JOX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcCs9aTsKKwkJbi09cGFyYW1fbGVuOworCisJCS8qIHRoaXMgc2hvdWxkIGJlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGFuIGV4cG9ydCBjaXBoZXIgKi8KKwkJaWYgKGFsZ19hICYgU1NMX2FSU0EpCisJCQlwa2V5PVg1MDlfZ2V0X3B1YmtleShzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcGtleXNbU1NMX1BLRVlfUlNBX0VOQ10ueDUwOSk7CisJCWVsc2UKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCXMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9yc2FfdG1wPXJzYTsKKwkJcnNhPU5VTEw7CisJCX0KKyNlbHNlIC8qIE9QRU5TU0xfTk9fUlNBICovCisJaWYgKDApCisJCTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJZWxzZSBpZiAoYWxnX2sgJiBTU0xfa0VESCkKKwkJeworCQlpZiAoKGRoPURIX25ldygpKSA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxFUlJfUl9ESF9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCW4ycyhwLGkpOworCQlwYXJhbV9sZW49aSsyOworCQlpZiAocGFyYW1fbGVuID4gbikKKwkJCXsKKwkJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLFNTTF9SX0JBRF9ESF9QX0xFTkdUSCk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQlpZiAoIShkaC0+cD1CTl9iaW4yYm4ocCxpLE5VTEwpKSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsRVJSX1JfQk5fTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlwKz1pOworCisJCW4ycyhwLGkpOworCQlwYXJhbV9sZW4rPWkrMjsKKwkJaWYgKHBhcmFtX2xlbiA+IG4pCisJCQl7CisJCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9CQURfREhfR19MRU5HVEgpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJaWYgKCEoZGgtPmc9Qk5fYmluMmJuKHAsaSxOVUxMKSkpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFLEVSUl9SX0JOX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJcCs9aTsKKworCQluMnMocCxpKTsKKwkJcGFyYW1fbGVuKz1pKzI7CisJCWlmIChwYXJhbV9sZW4gPiBuKQorCQkJeworCQkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsU1NMX1JfQkFEX0RIX1BVQl9LRVlfTEVOR1RIKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCWlmICghKGRoLT5wdWJfa2V5PUJOX2JpbjJibihwLGksTlVMTCkpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxFUlJfUl9CTl9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCXArPWk7CisJCW4tPXBhcmFtX2xlbjsKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQlpZiAoYWxnX2EgJiBTU0xfYVJTQSkKKwkJCXBrZXk9WDUwOV9nZXRfcHVia2V5KHMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS54NTA5KTsKKyNlbHNlCisJCWlmICgwKQorCQkJOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJCWVsc2UgaWYgKGFsZ19hICYgU1NMX2FEU1MpCisJCQlwa2V5PVg1MDlfZ2V0X3B1YmtleShzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcGtleXNbU1NMX1BLRVlfRFNBX1NJR05dLng1MDkpOworI2VuZGlmCisJCS8qIGVsc2UgYW5vbnltb3VzIERILCBzbyBubyBjZXJ0aWZpY2F0ZSBvciBwa2V5LiAqLworCisJCXMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9kaF90bXA9ZGg7CisJCWRoPU5VTEw7CisJCX0KKwllbHNlIGlmICgoYWxnX2sgJiBTU0xfa0RIcikgfHwgKGFsZ19rICYgU1NMX2tESGQpKQorCQl7CisJCWFsPVNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9UUklFRF9UT19VU0VfVU5TVVBQT1JURURfQ0lQSEVSKTsKKwkJZ290byBmX2VycjsKKwkJfQorI2VuZGlmIC8qICFPUEVOU1NMX05PX0RIICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJZWxzZSBpZiAoYWxnX2sgJiBTU0xfa0VFQ0RIKQorCQl7CisJCUVDX0dST1VQICpuZ3JvdXA7CisJCWNvbnN0IEVDX0dST1VQICpncm91cDsKKworCQlpZiAoKGVjZGg9RUNfS0VZX25ldygpKSA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBFeHRyYWN0IGVsbGlwdGljIGN1cnZlIHBhcmFtZXRlcnMgYW5kIHRoZQorCQkgKiBzZXJ2ZXIncyBlcGhlbWVyYWwgRUNESCBwdWJsaWMga2V5LgorCQkgKiBLZWVwIGFjY3VtdWxhdGluZyBsZW5ndGhzIG9mIHZhcmlvdXMgY29tcG9uZW50cyBpbgorCQkgKiBwYXJhbV9sZW4gYW5kIG1ha2Ugc3VyZSBpdCBuZXZlciBleGNlZWRzIG4uCisJCSAqLworCisJCS8qIFhYWDogRm9yIG5vdyB3ZSBvbmx5IHN1cHBvcnQgbmFtZWQgKG5vdCBnZW5lcmljKSBjdXJ2ZXMKKwkJICogYW5kIHRoZSBFQ1BhcmFtZXRlcnMgaW4gdGhpcyBjYXNlIGlzIGp1c3QgdGhyZWUgYnl0ZXMuCisJCSAqLworCQlwYXJhbV9sZW49MzsKKwkJaWYgKChwYXJhbV9sZW4gPiBuKSB8fAorCQkgICAgKCpwICE9IE5BTUVEX0NVUlZFX1RZUEUpIHx8IAorCQkgICAgKChjdXJ2ZV9uaWQgPSB0bHMxX2VjX2N1cnZlX2lkMm5pZCgqKHAgKyAyKSkpID09IDApKSAKKwkJCXsKKwkJCWFsPVNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsU1NMX1JfVU5BQkxFX1RPX0ZJTkRfRUNESF9QQVJBTUVURVJTKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKwkJbmdyb3VwID0gRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoY3VydmVfbmlkKTsKKwkJaWYgKG5ncm91cCA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmIChFQ19LRVlfc2V0X2dyb3VwKGVjZGgsIG5ncm91cCkgPT0gMCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsRVJSX1JfRUNfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlFQ19HUk9VUF9mcmVlKG5ncm91cCk7CisKKwkJZ3JvdXAgPSBFQ19LRVlfZ2V0MF9ncm91cChlY2RoKTsKKworCQlpZiAoU1NMX0NfSVNfRVhQT1JUKHMtPnMzLT50bXAubmV3X2NpcGhlcikgJiYKKwkJICAgIChFQ19HUk9VUF9nZXRfZGVncmVlKGdyb3VwKSA+IDE2MykpCisJCQl7CisJCQlhbD1TU0xfQURfRVhQT1JUX1JFU1RSSUNUSU9OOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9FQ0dST1VQX1RPT19MQVJHRV9GT1JfQ0lQSEVSKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKwkJcCs9MzsKKworCQkvKiBOZXh0LCBnZXQgdGhlIGVuY29kZWQgRUNQb2ludCAqLworCQlpZiAoKChzcnZyX2VjcG9pbnQgPSBFQ19QT0lOVF9uZXcoZ3JvdXApKSA9PSBOVUxMKSB8fAorCQkgICAgKChibl9jdHggPSBCTl9DVFhfbmV3KCkpID09IE5VTEwpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQllbmNvZGVkX3B0X2xlbiA9ICpwOyAgLyogbGVuZ3RoIG9mIGVuY29kZWQgcG9pbnQgKi8KKwkJcCs9MTsKKwkJcGFyYW1fbGVuICs9ICgxICsgZW5jb2RlZF9wdF9sZW4pOworCQlpZiAoKHBhcmFtX2xlbiA+IG4pIHx8CisJCSAgICAoRUNfUE9JTlRfb2N0MnBvaW50KGdyb3VwLCBzcnZyX2VjcG9pbnQsIAorCQkJcCwgZW5jb2RlZF9wdF9sZW4sIGJuX2N0eCkgPT0gMCkpCisJCQl7CisJCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9CQURfRUNQT0lOVCk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCisJCW4tPXBhcmFtX2xlbjsKKwkJcCs9ZW5jb2RlZF9wdF9sZW47CisKKwkJLyogVGhlIEVDQy9UTFMgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBtZW50aW9uCisJCSAqIHRoZSB1c2Ugb2YgRFNBIHRvIHNpZ24gRUNQYXJhbWV0ZXJzIGluIHRoZSBzZXJ2ZXIKKwkJICoga2V5IGV4Y2hhbmdlIG1lc3NhZ2UuIFdlIGRvIHN1cHBvcnQgUlNBIGFuZCBFQ0RTQS4KKwkJICovCisJCWlmICgwKSA7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCWVsc2UgaWYgKGFsZ19hICYgU1NMX2FSU0EpCisJCQlwa2V5PVg1MDlfZ2V0X3B1YmtleShzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcGtleXNbU1NMX1BLRVlfUlNBX0VOQ10ueDUwOSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCQllbHNlIGlmIChhbGdfYSAmIFNTTF9hRUNEU0EpCisJCQlwa2V5PVg1MDlfZ2V0X3B1YmtleShzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcGtleXNbU1NMX1BLRVlfRUNDXS54NTA5KTsKKyNlbmRpZgorCQkvKiBlbHNlIGFub255bW91cyBFQ0RILCBzbyBubyBjZXJ0aWZpY2F0ZSBvciBwa2V5LiAqLworCQlFQ19LRVlfc2V0X3B1YmxpY19rZXkoZWNkaCwgc3J2cl9lY3BvaW50KTsKKwkJcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2VjZGhfdG1wPWVjZGg7CisJCWVjZGg9TlVMTDsKKwkJQk5fQ1RYX2ZyZWUoYm5fY3R4KTsKKwkJRUNfUE9JTlRfZnJlZShzcnZyX2VjcG9pbnQpOworCQlzcnZyX2VjcG9pbnQgPSBOVUxMOworCQl9CisJZWxzZSBpZiAoYWxnX2spCisJCXsKKwkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpOworCQlnb3RvIGZfZXJyOworCQl9CisjZW5kaWYgLyogIU9QRU5TU0xfTk9fRUNESCAqLworCisKKwkvKiBwIHBvaW50cyB0byB0aGUgbmV4dCBieXRlLCB0aGVyZSBhcmUgJ24nIGJ5dGVzIGxlZnQgKi8KKworCS8qIGlmIGl0IHdhcyBzaWduZWQsIGNoZWNrIHRoZSBzaWduYXR1cmUgKi8KKwlpZiAocGtleSAhPSBOVUxMKQorCQl7CisJCW4ycyhwLGkpOworCQluLT0yOworCQlqPUVWUF9QS0VZX3NpemUocGtleSk7CisKKwkJaWYgKChpICE9IG4pIHx8IChuID4gaikgfHwgKG4gPD0gMCkpCisJCQl7CisJCQkvKiB3cm9uZyBwYWNrZXQgbGVuZ3RoICovCisJCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9XUk9OR19TSUdOQVRVUkVfTEVOR1RIKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkJaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfUlNBKQorCQkJeworCQkJaW50IG51bTsKKworCQkJaj0wOworCQkJcT1tZF9idWY7CisJCQlmb3IgKG51bT0yOyBudW0gPiAwOyBudW0tLSkKKwkJCQl7CisJCQkJRVZQX0RpZ2VzdEluaXRfZXgoJm1kX2N0eCwobnVtID09IDIpCisJCQkJCT9zLT5jdHgtPm1kNTpzLT5jdHgtPnNoYTEsIE5VTEwpOworCQkJCUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwmKHMtPnMzLT5jbGllbnRfcmFuZG9tWzBdKSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJCQlFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsJihzLT5zMy0+c2VydmVyX3JhbmRvbVswXSksU1NMM19SQU5ET01fU0laRSk7CisJCQkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LHBhcmFtLHBhcmFtX2xlbik7CisJCQkJRVZQX0RpZ2VzdEZpbmFsX2V4KCZtZF9jdHgscSwodW5zaWduZWQgaW50ICopJmkpOworCQkJCXErPWk7CisJCQkJais9aTsKKwkJCQl9CisJCQlpPVJTQV92ZXJpZnkoTklEX21kNV9zaGExLCBtZF9idWYsIGosIHAsIG4sCisJCQkJCQkJCXBrZXktPnBrZXkucnNhKTsKKwkJCWlmIChpIDwgMCkKKwkJCQl7CisJCQkJYWw9U1NMX0FEX0RFQ1JZUFRfRVJST1I7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9CQURfUlNBX0RFQ1JZUFQpOworCQkJCWdvdG8gZl9lcnI7CisJCQkJfQorCQkJaWYgKGkgPT0gMCkKKwkJCQl7CisJCQkJLyogYmFkIHNpZ25hdHVyZSAqLworCQkJCWFsPVNTTF9BRF9ERUNSWVBUX0VSUk9SOworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsU1NMX1JfQkFEX1NJR05BVFVSRSk7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCQkJaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfRFNBKQorCQkJeworCQkJLyogbGV0cyBkbyBEU1MgKi8KKwkJCUVWUF9WZXJpZnlJbml0X2V4KCZtZF9jdHgsRVZQX2RzczEoKSwgTlVMTCk7CisJCQlFVlBfVmVyaWZ5VXBkYXRlKCZtZF9jdHgsJihzLT5zMy0+Y2xpZW50X3JhbmRvbVswXSksU1NMM19SQU5ET01fU0laRSk7CisJCQlFVlBfVmVyaWZ5VXBkYXRlKCZtZF9jdHgsJihzLT5zMy0+c2VydmVyX3JhbmRvbVswXSksU1NMM19SQU5ET01fU0laRSk7CisJCQlFVlBfVmVyaWZ5VXBkYXRlKCZtZF9jdHgscGFyYW0scGFyYW1fbGVuKTsKKwkJCWlmIChFVlBfVmVyaWZ5RmluYWwoJm1kX2N0eCxwLChpbnQpbixwa2V5KSA8PSAwKQorCQkJCXsKKwkJCQkvKiBiYWQgc2lnbmF0dXJlICovCisJCQkJYWw9U1NMX0FEX0RFQ1JZUFRfRVJST1I7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9CQURfU0lHTkFUVVJFKTsKKwkJCQlnb3RvIGZfZXJyOworCQkJCX0KKwkJCX0KKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwkJCWlmIChwa2V5LT50eXBlID09IEVWUF9QS0VZX0VDKQorCQkJeworCQkJLyogbGV0J3MgZG8gRUNEU0EgKi8KKwkJCUVWUF9WZXJpZnlJbml0X2V4KCZtZF9jdHgsRVZQX2VjZHNhKCksIE5VTEwpOworCQkJRVZQX1ZlcmlmeVVwZGF0ZSgmbWRfY3R4LCYocy0+czMtPmNsaWVudF9yYW5kb21bMF0pLFNTTDNfUkFORE9NX1NJWkUpOworCQkJRVZQX1ZlcmlmeVVwZGF0ZSgmbWRfY3R4LCYocy0+czMtPnNlcnZlcl9yYW5kb21bMF0pLFNTTDNfUkFORE9NX1NJWkUpOworCQkJRVZQX1ZlcmlmeVVwZGF0ZSgmbWRfY3R4LHBhcmFtLHBhcmFtX2xlbik7CisJCQlpZiAoRVZQX1ZlcmlmeUZpbmFsKCZtZF9jdHgscCwoaW50KW4scGtleSkgPD0gMCkKKwkJCQl7CisJCQkJLyogYmFkIHNpZ25hdHVyZSAqLworCQkJCWFsPVNTTF9BRF9ERUNSWVBUX0VSUk9SOworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsU1NMX1JfQkFEX1NJR05BVFVSRSk7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKyNlbmRpZgorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpZiAoIShhbGdfYSAmIFNTTF9hTlVMTCkgJiYgIShhbGdfayAmIFNTTF9rUFNLKSkKKwkJCS8qIGFOVUxMIG9yIGtQU0sgZG8gbm90IG5lZWQgcHVibGljIGtleXMgKi8KKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UsRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCS8qIHN0aWxsIGRhdGEgbGVmdCBvdmVyICovCisJCWlmIChuICE9IDApCisJCQl7CisJCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0tFWV9FWENIQU5HRSxTU0xfUl9FWFRSQV9EQVRBX0lOX01FU1NBR0UpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJfQorCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOworCXJldHVybigxKTsKK2ZfZXJyOgorCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsYWwpOworZXJyOgorCUVWUF9QS0VZX2ZyZWUocGtleSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJaWYgKHJzYSAhPSBOVUxMKQorCQlSU0FfZnJlZShyc2EpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwlpZiAoZGggIT0gTlVMTCkKKwkJREhfZnJlZShkaCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJQk5fQ1RYX2ZyZWUoYm5fY3R4KTsKKwlFQ19QT0lOVF9mcmVlKHNydnJfZWNwb2ludCk7CisJaWYgKGVjZGggIT0gTlVMTCkKKwkJRUNfS0VZX2ZyZWUoZWNkaCk7CisjZW5kaWYKKwlFVlBfTURfQ1RYX2NsZWFudXAoJm1kX2N0eCk7CisJcmV0dXJuKC0xKTsKKwl9CisKK2ludCBzc2wzX2dldF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KFNTTCAqcykKKwl7CisJaW50IG9rLHJldD0wOworCXVuc2lnbmVkIGxvbmcgbixuYyxsOworCXVuc2lnbmVkIGludCBsbGVuLGN0eXBlX251bSxpOworCVg1MDlfTkFNRSAqeG49TlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCpxOworCXVuc2lnbmVkIGNoYXIgKmQ7CisJU1RBQ0tfT0YoWDUwOV9OQU1FKSAqY2Ffc2s9TlVMTDsKKworCW49cy0+bWV0aG9kLT5zc2xfZ2V0X21lc3NhZ2UocywKKwkJU1NMM19TVF9DUl9DRVJUX1JFUV9BLAorCQlTU0wzX1NUX0NSX0NFUlRfUkVRX0IsCisJCS0xLAorCQlzLT5tYXhfY2VydF9saXN0LAorCQkmb2spOworCisJaWYgKCFvaykgcmV0dXJuKChpbnQpbik7CisKKwlzLT5zMy0+dG1wLmNlcnRfcmVxPTA7CisKKwlpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgPT0gU1NMM19NVF9TRVJWRVJfRE9ORSkKKwkJeworCQlzLT5zMy0+dG1wLnJldXNlX21lc3NhZ2U9MTsKKwkJcmV0dXJuKDEpOworCQl9CisKKwlpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgIT0gU1NMM19NVF9DRVJUSUZJQ0FURV9SRVFVRVNUKQorCQl7CisJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRSk7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DRVJUSUZJQ0FURV9SRVFVRVNULFNTTF9SX1dST05HX01FU1NBR0VfVFlQRSk7CisJCWdvdG8gZXJyOworCQl9CisKKwkvKiBUTFMgZG9lcyBub3QgbGlrZSBhbm9uLURIIHdpdGggY2xpZW50IGNlcnQgKi8KKwlpZiAocy0+dmVyc2lvbiA+IFNTTDNfVkVSU0lPTikKKwkJeworCQlpZiAocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aCAmIFNTTF9hTlVMTCkKKwkJCXsKKwkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRSk7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVElGSUNBVEVfUkVRVUVTVCxTU0xfUl9UTFNfQ0xJRU5UX0NFUlRfUkVRX1dJVEhfQU5PTl9DSVBIRVIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKworCXA9ZD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfbXNnOworCisJaWYgKChjYV9zaz1za19YNTA5X05BTUVfbmV3KGNhX2RuX2NtcCkpID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRJRklDQVRFX1JFUVVFU1QsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJLyogZ2V0IHRoZSBjZXJ0aWZpY2F0ZSB0eXBlcyAqLworCWN0eXBlX251bT0gKihwKyspOworCWlmIChjdHlwZV9udW0gPiBTU0wzX0NUX05VTUJFUikKKwkJY3R5cGVfbnVtPVNTTDNfQ1RfTlVNQkVSOworCWZvciAoaT0wOyBpPGN0eXBlX251bTsgaSsrKQorCQlzLT5zMy0+dG1wLmN0eXBlW2ldPSBwW2ldOworCXArPWN0eXBlX251bTsKKworCS8qIGdldCB0aGUgQ0EgUkROcyAqLworCW4ycyhwLGxsZW4pOworI2lmIDAKK3sKK0ZJTEUgKm91dDsKK291dD1mb3BlbigiL3RtcC92c2lnbi5kZXIiLCJ3Iik7Citmd3JpdGUocCwxLGxsZW4sb3V0KTsKK2ZjbG9zZShvdXQpOworfQorI2VuZGlmCisKKwlpZiAoKGxsZW4rY3R5cGVfbnVtKzIrMSkgIT0gbikKKwkJeworCQlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLFNTTF9BRF9ERUNPREVfRVJST1IpOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVElGSUNBVEVfUkVRVUVTVCxTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOworCQlnb3RvIGVycjsKKwkJfQorCisJZm9yIChuYz0wOyBuYzxsbGVuOyApCisJCXsKKwkJbjJzKHAsbCk7CisJCWlmICgobCtuYysyKSA+IGxsZW4pCisJCQl7CisJCQlpZiAoKHMtPm9wdGlvbnMgJiBTU0xfT1BfTkVUU0NBUEVfQ0FfRE5fQlVHKSkKKwkJCQlnb3RvIGNvbnQ7IC8qIG5ldHNjYXBlIGJ1Z3MgKi8KKwkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0RFQ09ERV9FUlJPUik7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVElGSUNBVEVfUkVRVUVTVCxTU0xfUl9DQV9ETl9UT09fTE9ORyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlxPXA7CisKKwkJaWYgKCh4bj1kMmlfWDUwOV9OQU1FKE5VTEwsJnEsbCkpID09IE5VTEwpCisJCQl7CisJCQkvKiBJZiBuZXRzY2FwZSB0b2xlcmFuY2UgaXMgb24sIGlnbm9yZSBlcnJvcnMgKi8KKwkJCWlmIChzLT5vcHRpb25zICYgU1NMX09QX05FVFNDQVBFX0NBX0ROX0JVRykKKwkJCQlnb3RvIGNvbnQ7CisJCQllbHNlCisJCQkJeworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0RFQ09ERV9FUlJPUik7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRJRklDQVRFX1JFUVVFU1QsRVJSX1JfQVNOMV9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKworCQlpZiAocSAhPSAocCtsKSkKKwkJCXsKKwkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0RFQ09ERV9FUlJPUik7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVElGSUNBVEVfUkVRVUVTVCxTU0xfUl9DQV9ETl9MRU5HVEhfTUlTTUFUQ0gpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmICghc2tfWDUwOV9OQU1FX3B1c2goY2Ffc2sseG4pKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRJRklDQVRFX1JFUVVFU1QsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJcCs9bDsKKwkJbmMrPWwrMjsKKwkJfQorCisJaWYgKDApCisJCXsKK2NvbnQ6CisJCUVSUl9jbGVhcl9lcnJvcigpOworCQl9CisKKwkvKiB3ZSBzaG91bGQgc2V0dXAgYSBjZXJ0aWZpY2F0ZSB0byByZXR1cm4uLi4uICovCisJcy0+czMtPnRtcC5jZXJ0X3JlcT0xOworCXMtPnMzLT50bXAuY3R5cGVfbnVtPWN0eXBlX251bTsKKwlpZiAocy0+czMtPnRtcC5jYV9uYW1lcyAhPSBOVUxMKQorCQlza19YNTA5X05BTUVfcG9wX2ZyZWUocy0+czMtPnRtcC5jYV9uYW1lcyxYNTA5X05BTUVfZnJlZSk7CisJcy0+czMtPnRtcC5jYV9uYW1lcz1jYV9zazsKKwljYV9zaz1OVUxMOworCisJcmV0PTE7CitlcnI6CisJaWYgKGNhX3NrICE9IE5VTEwpIHNrX1g1MDlfTkFNRV9wb3BfZnJlZShjYV9zayxYNTA5X05BTUVfZnJlZSk7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGNhX2RuX2NtcChjb25zdCBYNTA5X05BTUUgKiBjb25zdCAqYSwgY29uc3QgWDUwOV9OQU1FICogY29uc3QgKmIpCisJeworCXJldHVybihYNTA5X05BTUVfY21wKCphLCpiKSk7CisJfQorI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAoraW50IHNzbDNfZ2V0X25ld19zZXNzaW9uX3RpY2tldChTU0wgKnMpCisJeworCWludCBvayxhbCxyZXQ9MCwgdGlja2xlbjsKKwlsb25nIG47CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBjaGFyICpkOworCisJbj1zLT5tZXRob2QtPnNzbF9nZXRfbWVzc2FnZShzLAorCQlTU0wzX1NUX0NSX1NFU1NJT05fVElDS0VUX0EsCisJCVNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQiwKKwkJLTEsCisJCTE2Mzg0LAorCQkmb2spOworCisJaWYgKCFvaykKKwkJcmV0dXJuKChpbnQpbik7CisKKwlpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgPT0gU1NMM19NVF9GSU5JU0hFRCkKKwkJeworCQlzLT5zMy0+dG1wLnJldXNlX21lc3NhZ2U9MTsKKwkJcmV0dXJuKDEpOworCQl9CisJaWYgKHMtPnMzLT50bXAubWVzc2FnZV90eXBlICE9IFNTTDNfTVRfTkVXU0VTU0lPTl9USUNLRVQpCisJCXsKKwkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX05FV19TRVNTSU9OX1RJQ0tFVCxTU0xfUl9CQURfTUVTU0FHRV9UWVBFKTsKKwkJZ290byBmX2VycjsKKwkJfQorCWlmIChuIDwgNikKKwkJeworCQkvKiBuZWVkIGF0IGxlYXN0IHRpY2tldF9saWZldGltZV9oaW50ICsgdGlja2V0IGxlbmd0aCAqLworCQlhbCA9IFNTTDNfQUxfRkFUQUwsU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX05FV19TRVNTSU9OX1RJQ0tFVCxTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOworCQlnb3RvIGZfZXJyOworCQl9CisKKwlwPWQ9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X21zZzsKKwluMmwocCwgcy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludCk7CisJbjJzKHAsIHRpY2tsZW4pOworCS8qIHRpY2tldF9saWZldGltZV9oaW50ICsgdGlja2V0X2xlbmd0aCArIHRpY2tldCAqLworCWlmICh0aWNrbGVuICsgNiAhPSBuKQorCQl7CisJCWFsID0gU1NMM19BTF9GQVRBTCxTU0xfQURfREVDT0RFX0VSUk9SOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfTkVXX1NFU1NJT05fVElDS0VULFNTTF9SX0xFTkdUSF9NSVNNQVRDSCk7CisJCWdvdG8gZl9lcnI7CisJCX0KKwlpZiAocy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2spCisJCXsKKwkJT1BFTlNTTF9mcmVlKHMtPnNlc3Npb24tPnRsc2V4dF90aWNrKTsKKwkJcy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2tsZW4gPSAwOworCQl9CisJcy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2sgPSBPUEVOU1NMX21hbGxvYyh0aWNrbGVuKTsKKwlpZiAoIXMtPnNlc3Npb24tPnRsc2V4dF90aWNrKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9ORVdfU0VTU0lPTl9USUNLRVQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCW1lbWNweShzLT5zZXNzaW9uLT50bHNleHRfdGljaywgcCwgdGlja2xlbik7CisJcy0+c2Vzc2lvbi0+dGxzZXh0X3RpY2tsZW4gPSB0aWNrbGVuOworCS8qIFRoZXJlIGFyZSB0d28gd2F5cyB0byBkZXRlY3QgYSByZXN1bWVkIHRpY2tldCBzZXNpb24uCisJICogT25lIGlzIHRvIHNldCBhbiBhcHByb3ByaWF0ZSBzZXNzaW9uIElEIGFuZCB0aGVuIHRoZSBzZXJ2ZXIKKwkgKiBtdXN0IHJldHVybiBhIG1hdGNoIGluIFNlcnZlckhlbGxvLiBUaGlzIGFsbG93cyB0aGUgbm9ybWFsCisJICogY2xpZW50IHNlc3Npb24gSUQgbWF0Y2hpbmcgdG8gd29yayBhbmQgd2Uga25vdyBtdWNoIAorCSAqIGVhcmxpZXIgdGhhdCB0aGUgdGlja2V0IGhhcyBiZWVuIGFjY2VwdGVkLgorCSAqIAorCSAqIFRoZSBvdGhlciB3YXkgaXMgdG8gc2V0IHplcm8gbGVuZ3RoIHNlc3Npb24gSUQgd2hlbiB0aGUKKwkgKiB0aWNrZXQgaXMgcHJlc2VudGVkIGFuZCByZWx5IG9uIHRoZSBoYW5kc2hha2UgdG8gZGV0ZXJtaW5lCisJICogc2Vzc2lvbiByZXN1bXB0aW9uLgorCSAqCisJICogV2UgY2hvb3NlIHRoZSBmb3JtZXIgYXBwcm9hY2ggYmVjYXVzZSB0aGlzIGZpdHMgaW4gd2l0aAorCSAqIGFzc3VtcHRpb25zIGVsc2V3aGVyZSBpbiBPcGVuU1NMLiBUaGUgc2Vzc2lvbiBJRCBpcyBzZXQKKwkgKiB0byB0aGUgU0hBMjU2IChvciBTSEExIGlzIFNIQTI1NiBpcyBkaXNhYmxlZCkgaGFzaCBvZiB0aGUKKwkgKiB0aWNrZXQuCisJICovIAorCUVWUF9EaWdlc3QocCwgdGlja2xlbiwKKwkJCXMtPnNlc3Npb24tPnNlc3Npb25faWQsICZzLT5zZXNzaW9uLT5zZXNzaW9uX2lkX2xlbmd0aCwKKyNpZm5kZWYgT1BFTlNTTF9OT19TSEEyNTYKKwkJCQkJCQlFVlBfc2hhMjU2KCksIE5VTEwpOworI2Vsc2UKKwkJCQkJCQlFVlBfc2hhMSgpLCBOVUxMKTsKKyNlbmRpZgorCXJldD0xOworCXJldHVybihyZXQpOworZl9lcnI6CisJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxhbCk7CitlcnI6CisJcmV0dXJuKC0xKTsKKwl9CisKK2ludCBzc2wzX2dldF9jZXJ0X3N0YXR1cyhTU0wgKnMpCisJeworCWludCBvaywgYWw7CisJdW5zaWduZWQgbG9uZyByZXNwbGVuLG47CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKworCW49cy0+bWV0aG9kLT5zc2xfZ2V0X21lc3NhZ2UocywKKwkJU1NMM19TVF9DUl9DRVJUX1NUQVRVU19BLAorCQlTU0wzX1NUX0NSX0NFUlRfU1RBVFVTX0IsCisJCVNTTDNfTVRfQ0VSVElGSUNBVEVfU1RBVFVTLAorCQkxNjM4NCwKKwkJJm9rKTsKKworCWlmICghb2spIHJldHVybigoaW50KW4pOworCWlmIChuIDwgNCkKKwkJeworCQkvKiBuZWVkIGF0IGxlYXN0IHN0YXR1cyB0eXBlICsgbGVuZ3RoICovCisJCWFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfU1RBVFVTLFNTTF9SX0xFTkdUSF9NSVNNQVRDSCk7CisJCWdvdG8gZl9lcnI7CisJCX0KKwlwID0gKHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X21zZzsKKwlpZiAoKnArKyAhPSBUTFNFWFRfU1RBVFVTVFlQRV9vY3NwKQorCQl7CisJCWFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfU1RBVFVTLFNTTF9SX1VOU1VQUE9SVEVEX1NUQVRVU19UWVBFKTsKKwkJZ290byBmX2VycjsKKwkJfQorCW4ybDMocCwgcmVzcGxlbik7CisJaWYgKHJlc3BsZW4gKyA0ICE9IG4pCisJCXsKKwkJYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMsU1NMX1JfTEVOR1RIX01JU01BVENIKTsKKwkJZ290byBmX2VycjsKKwkJfQorCWlmIChzLT50bHNleHRfb2NzcF9yZXNwKQorCQlPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X29jc3BfcmVzcCk7CisJcy0+dGxzZXh0X29jc3BfcmVzcCA9IEJVRl9tZW1kdXAocCwgcmVzcGxlbik7CisJaWYgKCFzLT50bHNleHRfb2NzcF9yZXNwKQorCQl7CisJCWFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGZfZXJyOworCQl9CisJcy0+dGxzZXh0X29jc3BfcmVzcGxlbiA9IHJlc3BsZW47CisJaWYgKHMtPmN0eC0+dGxzZXh0X3N0YXR1c19jYikKKwkJeworCQlpbnQgcmV0OworCQlyZXQgPSBzLT5jdHgtPnRsc2V4dF9zdGF0dXNfY2Iocywgcy0+Y3R4LT50bHNleHRfc3RhdHVzX2FyZyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXsKKwkJCWFsID0gU1NMX0FEX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0U7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMsU1NMX1JfSU5WQUxJRF9TVEFUVVNfUkVTUE9OU0UpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJaWYgKHJldCA8IDApCisJCQl7CisJCQlhbCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DRVJUX1NUQVRVUyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQl9CisJcmV0dXJuIDE7CitmX2VycjoKKwlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLGFsKTsKKwlyZXR1cm4oLTEpOworCX0KKyNlbmRpZgorCitpbnQgc3NsM19nZXRfc2VydmVyX2RvbmUoU1NMICpzKQorCXsKKwlpbnQgb2sscmV0PTA7CisJbG9uZyBuOworCisJbj1zLT5tZXRob2QtPnNzbF9nZXRfbWVzc2FnZShzLAorCQlTU0wzX1NUX0NSX1NSVlJfRE9ORV9BLAorCQlTU0wzX1NUX0NSX1NSVlJfRE9ORV9CLAorCQlTU0wzX01UX1NFUlZFUl9ET05FLAorCQkzMCwgLyogc2hvdWxkIGJlIHZlcnkgc21hbGwsIGxpa2UgMCA6LSkgKi8KKwkJJm9rKTsKKworCWlmICghb2spIHJldHVybigoaW50KW4pOworCWlmIChuID4gMCkKKwkJeworCQkvKiBzaG91bGQgY29udGFpbiBubyBkYXRhICovCisJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0RFQ09ERV9FUlJPUik7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9TRVJWRVJfRE9ORSxTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOworCQlyZXR1cm4gLTE7CisJCX0KKwlyZXQ9MTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKworaW50IHNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlKFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqcCwqZDsKKwlpbnQgbjsKKwl1bnNpZ25lZCBsb25nIGFsZ19rOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXVuc2lnbmVkIGNoYXIgKnE7CisJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwlLU1NMX0VSUiBrc3NsX2VycjsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0tSQjUgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJRUNfS0VZICpjbG50X2VjZGggPSBOVUxMOworCWNvbnN0IEVDX1BPSU5UICpzcnZyX2VjcG9pbnQgPSBOVUxMOworCUVWUF9QS0VZICpzcnZyX3B1Yl9wa2V5ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICplbmNvZGVkUG9pbnQgPSBOVUxMOworCWludCBlbmNvZGVkX3B0X2xlbiA9IDA7CisJQk5fQ1RYICogYm5fY3R4ID0gTlVMTDsKKyNlbmRpZgorCisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfQ1dfS0VZX0VYQ0hfQSkKKwkJeworCQlkPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCXA9ICYoZFs0XSk7CisKKwkJYWxnX2s9cy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKKworCQkvKiBGb29sIGVtYWNzIGluZGVudGF0aW9uICovCisJCWlmICgwKSB7fQorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQllbHNlIGlmIChhbGdfayAmIFNTTF9rUlNBKQorCQkJeworCQkJUlNBICpyc2E7CisJCQl1bnNpZ25lZCBjaGFyIHRtcF9idWZbU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSF07CisKKwkJCWlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcnNhX3RtcCAhPSBOVUxMKQorCQkJCXJzYT1zLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcnNhX3RtcDsKKwkJCWVsc2UKKwkJCQl7CisJCQkJcGtleT1YNTA5X2dldF9wdWJrZXkocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX3BrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLng1MDkpOworCQkJCWlmICgocGtleSA9PSBOVUxMKSB8fAorCQkJCQkocGtleS0+dHlwZSAhPSBFVlBfUEtFWV9SU0EpIHx8CisJCQkJCShwa2V5LT5wa2V5LnJzYSA9PSBOVUxMKSkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCXJzYT1wa2V5LT5wa2V5LnJzYTsKKwkJCQlFVlBfUEtFWV9mcmVlKHBrZXkpOworCQkJCX0KKwkJCQkKKwkJCXRtcF9idWZbMF09cy0+Y2xpZW50X3ZlcnNpb24+Pjg7CisJCQl0bXBfYnVmWzFdPXMtPmNsaWVudF92ZXJzaW9uJjB4ZmY7CisJCQlpZiAoUkFORF9ieXRlcygmKHRtcF9idWZbMl0pLHNpemVvZiB0bXBfYnVmLTIpIDw9IDApCisJCQkJCWdvdG8gZXJyOworCisJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aD1zaXplb2YgdG1wX2J1ZjsKKworCQkJcT1wOworCQkJLyogRml4IGJ1ZiBmb3IgVExTIGFuZCBiZXlvbmQgKi8KKwkJCWlmIChzLT52ZXJzaW9uID4gU1NMM19WRVJTSU9OKQorCQkJCXArPTI7CisJCQluPVJTQV9wdWJsaWNfZW5jcnlwdChzaXplb2YgdG1wX2J1ZiwKKwkJCQl0bXBfYnVmLHAscnNhLFJTQV9QS0NTMV9QQURESU5HKTsKKyNpZmRlZiBQS0NTMV9DSEVDSworCQkJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfUEtDUzFfQ0hFQ0tfMSkgcFsxXSsrOworCQkJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfUEtDUzFfQ0hFQ0tfMikgdG1wX2J1ZlswXT0weDcwOworI2VuZGlmCisJCQlpZiAobiA8PSAwKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsU1NMX1JfQkFEX1JTQV9FTkNSWVBUKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCS8qIEZpeCBidWYgZm9yIFRMUyBhbmQgYmV5b25kICovCisJCQlpZiAocy0+dmVyc2lvbiA+IFNTTDNfVkVSU0lPTikKKwkJCQl7CisJCQkJczJuKG4scSk7CisJCQkJbis9MjsKKwkJCQl9CisKKwkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoPQorCQkJCXMtPm1ldGhvZC0+c3NsM19lbmMtPmdlbmVyYXRlX21hc3Rlcl9zZWNyZXQocywKKwkJCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSwKKwkJCQkJdG1wX2J1ZixzaXplb2YgdG1wX2J1Zik7CisJCQlPUEVOU1NMX2NsZWFuc2UodG1wX2J1ZixzaXplb2YgdG1wX2J1Zik7CisJCQl9CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisJCWVsc2UgaWYgKGFsZ19rICYgU1NMX2tLUkI1KQorCQkJeworCQkJa3JiNV9lcnJvcl9jb2RlCWtyYjVyYzsKKwkJCUtTU0xfQ1RYCSprc3NsX2N0eCA9IHMtPmtzc2xfY3R4OworCQkJLyogIGtyYjVfZGF0YQlrcmI1X2FwX3JlcTsgICovCisJCQlrcmI1X2RhdGEJKmVuY190aWNrZXQ7CisJCQlrcmI1X2RhdGEJYXV0aGVudGljYXRvciwgKmF1dGhwID0gTlVMTDsKKwkJCUVWUF9DSVBIRVJfQ1RYCWNpcGhfY3R4OworCQkJY29uc3QgRVZQX0NJUEhFUiAqZW5jID0gTlVMTDsKKwkJCXVuc2lnbmVkIGNoYXIJaXZbRVZQX01BWF9JVl9MRU5HVEhdOworCQkJdW5zaWduZWQgY2hhcgl0bXBfYnVmW1NTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEhdOworCQkJdW5zaWduZWQgY2hhcgllcG1zW1NTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEggCisJCQkJCQkrIEVWUF9NQVhfSVZfTEVOR1RIXTsKKwkJCWludCAJCXBhZGwsIG91dGwgPSBzaXplb2YoZXBtcyk7CisKKwkJCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmNpcGhfY3R4KTsKKworI2lmZGVmIEtTU0xfREVCVUcKKwkJCXByaW50Zigic3NsM19zZW5kX2NsaWVudF9rZXlfZXhjaGFuZ2UoJWx4ICYgJWx4KVxuIiwKKwkJCQlhbGdfaywgU1NMX2tLUkI1KTsKKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisKKwkJCWF1dGhwID0gTlVMTDsKKyNpZmRlZiBLUkI1U0VOREFVVEgKKwkJCWlmIChLUkI1U0VOREFVVEgpICBhdXRocCA9ICZhdXRoZW50aWNhdG9yOworI2VuZGlmCS8qIEtSQjVTRU5EQVVUSCAqLworCisJCQlrcmI1cmMgPSBrc3NsX2NnZXRfdGt0KGtzc2xfY3R4LCAmZW5jX3RpY2tldCwgYXV0aHAsCisJCQkJJmtzc2xfZXJyKTsKKwkJCWVuYyA9IGtzc2xfbWFwX2VuYyhrc3NsX2N0eC0+ZW5jdHlwZSk7CisJCQlpZiAoZW5jID09IE5VTEwpCisJCQkgICAgZ290byBlcnI7CisjaWZkZWYgS1NTTF9ERUJVRworCQkJeworCQkJcHJpbnRmKCJrc3NsX2NnZXRfdGt0IHJ0biAlZFxuIiwga3JiNXJjKTsKKwkJCWlmIChrcmI1cmMgJiYga3NzbF9lcnIudGV4dCkKKwkJCSAgcHJpbnRmKCJrc3NsX2NnZXRfdGt0IGtzc2xfZXJyPSVzXG4iLCBrc3NsX2Vyci50ZXh0KTsKKwkJCX0KKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisKKwkJCWlmIChrcmI1cmMpCisJCQkJeworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsCisJCQkJCQlTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJCWtzc2xfZXJyLnJlYXNvbik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiAgMjAwMTA0MDYgVlJTIC0gRWFybGllciB2ZXJzaW9ucyB1c2VkIEtSQjUgQVBfUkVRCisJCQkqKiAgaW4gcGxhY2Ugb2YgUkZDIDI3MTIgS2VyYmVyb3NXcmFwcGVyLCBhcyBpbjoKKwkJCSoqCisJCQkqKiAgU2VuZCB0aWNrZXQgKGNvcHkgdG8gKnAsIHNldCBuID0gbGVuZ3RoKQorCQkJKiogIG4gPSBrcmI1X2FwX3JlcS5sZW5ndGg7CisJCQkqKiAgbWVtY3B5KHAsIGtyYjVfYXBfcmVxLmRhdGEsIGtyYjVfYXBfcmVxLmxlbmd0aCk7CisJCQkqKiAgaWYgKGtyYjVfYXBfcmVxLmRhdGEpICAKKwkJCSoqICAgIGtzc2xfa3JiNV9mcmVlX2RhdGFfY29udGVudHMoTlVMTCwma3JiNV9hcF9yZXEpOworCQkJKioKKwkJCSoqICBOb3cgdXNpbmcgcmVhbCBSRkMgMjcxMiBLZXJiZXJvc1dyYXBwZXIKKwkJCSoqICAoVGhhbmtzIHRvIFNpbW9uIFdpbGtpbnNvbiA8c3h3QHN4dy5vcmcudWs+KQorCQkJKiogIE5vdGU6IDI3MTIgIm9wYXF1ZSIgdHlwZXMgYXJlIGhlcmUgcmVwbGFjZWQKKwkJCSoqICB3aXRoIGEgMi1ieXRlIGxlbmd0aCBmb2xsb3dlZCBieSB0aGUgdmFsdWUuCisJCQkqKiAgRXhhbXBsZToKKwkJCSoqICBLZXJiZXJvc1dyYXBwZXI9IHh4IHh4IGFzbjF0aWNrZXQgMCAwIHh4IHh4IGVuY3BtcworCQkJKiogIFdoZXJlICJ4eCB4eCIgPSBsZW5ndGggYnl0ZXMuICBTaG93biBoZXJlIHdpdGgKKwkJCSoqICBvcHRpb25hbCBhdXRoZW50aWNhdG9yIG9taXR0ZWQuCisJCQkqLworCisJCQkvKiAgS2VyYmVyb3NXcmFwcGVyLlRpY2tldAkJKi8KKwkJCXMybihlbmNfdGlja2V0LT5sZW5ndGgscCk7CisJCQltZW1jcHkocCwgZW5jX3RpY2tldC0+ZGF0YSwgZW5jX3RpY2tldC0+bGVuZ3RoKTsKKwkJCXArPSBlbmNfdGlja2V0LT5sZW5ndGg7CisJCQluID0gZW5jX3RpY2tldC0+bGVuZ3RoICsgMjsKKworCQkJLyogIEtlcmJlcm9zV3JhcHBlci5BdXRoZW50aWNhdG9yCSovCisJCQlpZiAoYXV0aHAgICYmICBhdXRocC0+bGVuZ3RoKSAgCisJCQkJeworCQkJCXMybihhdXRocC0+bGVuZ3RoLHApOworCQkJCW1lbWNweShwLCBhdXRocC0+ZGF0YSwgYXV0aHAtPmxlbmd0aCk7CisJCQkJcCs9IGF1dGhwLT5sZW5ndGg7CisJCQkJbis9IGF1dGhwLT5sZW5ndGggKyAyOworCQkJCQorCQkJCWZyZWUoYXV0aHAtPmRhdGEpOworCQkJCWF1dGhwLT5kYXRhID0gTlVMTDsKKwkJCQlhdXRocC0+bGVuZ3RoID0gMDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCXMybigwLHApOy8qICBudWxsIGF1dGhlbnRpY2F0b3IgbGVuZ3RoCSovCisJCQkJbis9MjsKKwkJCQl9CisgCisJCQkgICAgdG1wX2J1ZlswXT1zLT5jbGllbnRfdmVyc2lvbj4+ODsKKwkJCSAgICB0bXBfYnVmWzFdPXMtPmNsaWVudF92ZXJzaW9uJjB4ZmY7CisJCQkgICAgaWYgKFJBTkRfYnl0ZXMoJih0bXBfYnVmWzJdKSxzaXplb2YgdG1wX2J1Zi0yKSA8PSAwKQorCQkJCWdvdG8gZXJyOworCisJCQkvKiAgMjAwMTA0MjAgVlJTLiAgVHJpZWQgaXQgdGhpcyB3YXk7IGZhaWxlZC4KKwkJCSoqCUVWUF9FbmNyeXB0SW5pdF9leCgmY2lwaF9jdHgsZW5jLCBOVUxMLE5VTEwpOworCQkJKioJRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGgoJmNpcGhfY3R4LAorCQkJKioJCQkJa3NzbF9jdHgtPmxlbmd0aCk7CisJCQkqKglFVlBfRW5jcnlwdEluaXRfZXgoJmNpcGhfY3R4LE5VTEwsIGtleSxpdik7CisJCQkqLworCisJCQltZW1zZXQoaXYsIDAsIHNpemVvZiBpdik7ICAvKiBwZXIgUkZDIDE1MTAgKi8KKwkJCUVWUF9FbmNyeXB0SW5pdF9leCgmY2lwaF9jdHgsZW5jLCBOVUxMLAorCQkJCWtzc2xfY3R4LT5rZXksaXYpOworCQkJRVZQX0VuY3J5cHRVcGRhdGUoJmNpcGhfY3R4LGVwbXMsJm91dGwsdG1wX2J1ZiwKKwkJCQlzaXplb2YgdG1wX2J1Zik7CisJCQlFVlBfRW5jcnlwdEZpbmFsX2V4KCZjaXBoX2N0eCwmKGVwbXNbb3V0bF0pLCZwYWRsKTsKKwkJCW91dGwgKz0gcGFkbDsKKwkJCWlmIChvdXRsID4gKGludClzaXplb2YgZXBtcykKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY2lwaF9jdHgpOworCisJCQkvKiAgS2VyYmVyb3NXcmFwcGVyLkVuY3J5cHRlZFByZU1hc3RlclNlY3JldAkqLworCQkJczJuKG91dGwscCk7CisJCQltZW1jcHkocCwgZXBtcywgb3V0bCk7CisJCQlwKz1vdXRsOworCQkJbis9b3V0bCArIDI7CisKKwkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoPQorCQkJCXMtPm1ldGhvZC0+c3NsM19lbmMtPmdlbmVyYXRlX21hc3Rlcl9zZWNyZXQocywKKwkJCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSwKKwkJCQkJdG1wX2J1Ziwgc2l6ZW9mIHRtcF9idWYpOworCisJCQlPUEVOU1NMX2NsZWFuc2UodG1wX2J1Ziwgc2l6ZW9mIHRtcF9idWYpOworCQkJT1BFTlNTTF9jbGVhbnNlKGVwbXMsIG91dGwpOworCQkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwkJZWxzZSBpZiAoYWxnX2sgJiAoU1NMX2tFREh8U1NMX2tESHJ8U1NMX2tESGQpKQorCQkJeworCQkJREggKmRoX3NydnIsKmRoX2NsbnQ7CisKKwkJCWlmIChzLT5zZXNzaW9uLT5zZXNzX2NlcnQgPT0gTlVMTCkgCisJCQkJeworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX1VORVhQRUNURURfTUVTU0FHRSk7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLFNTTF9SX1VORVhQRUNURURfTUVTU0FHRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQlpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2RoX3RtcCAhPSBOVUxMKQorCQkJCWRoX3NydnI9cy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2RoX3RtcDsKKwkJCWVsc2UKKwkJCQl7CisJCQkJLyogd2UgZ2V0IHRoZW0gZnJvbSB0aGUgY2VydCAqLworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsU1NMX1JfVU5BQkxFX1RPX0ZJTkRfREhfUEFSQU1FVEVSUyk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJCisJCQkvKiBnZW5lcmF0ZSBhIG5ldyByYW5kb20ga2V5ICovCisJCQlpZiAoKGRoX2NsbnQ9REhwYXJhbXNfZHVwKGRoX3NydnIpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsRVJSX1JfREhfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoIURIX2dlbmVyYXRlX2tleShkaF9jbG50KSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiB1c2UgdGhlICdwJyBvdXRwdXQgYnVmZmVyIGZvciB0aGUgREgga2V5LCBidXQKKwkJCSAqIG1ha2Ugc3VyZSB0byBjbGVhciBpdCBvdXQgYWZ0ZXJ3YXJkcyAqLworCisJCQluPURIX2NvbXB1dGVfa2V5KHAsZGhfc3J2ci0+cHViX2tleSxkaF9jbG50KTsKKworCQkJaWYgKG4gPD0gMCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiBnZW5lcmF0ZSBtYXN0ZXIga2V5IGZyb20gdGhlIHJlc3VsdCAqLworCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg9CisJCQkJcy0+bWV0aG9kLT5zc2wzX2VuYy0+Z2VuZXJhdGVfbWFzdGVyX3NlY3JldChzLAorCQkJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LHAsbik7CisJCQkvKiBjbGVhbiB1cCAqLworCQkJbWVtc2V0KHAsMCxuKTsKKworCQkJLyogc2VuZCBvZmYgdGhlIGRhdGEgKi8KKwkJCW49Qk5fbnVtX2J5dGVzKGRoX2NsbnQtPnB1Yl9rZXkpOworCQkJczJuKG4scCk7CisJCQlCTl9ibjJiaW4oZGhfY2xudC0+cHViX2tleSxwKTsKKwkJCW4rPTI7CisKKwkJCURIX2ZyZWUoZGhfY2xudCk7CisKKwkJCS8qIHBlcmhhcHMgY2xlYW4gdGhpbmdzIHVwIGEgYml0IEVBWSBFQVkgRUFZIEVBWSovCisJCQl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX0VDREggCisJCWVsc2UgaWYgKGFsZ19rICYgKFNTTF9rRUVDREh8U1NMX2tFQ0RIcnxTU0xfa0VDREhlKSkKKwkJCXsKKwkJCWNvbnN0IEVDX0dST1VQICpzcnZyX2dyb3VwID0gTlVMTDsKKwkJCUVDX0tFWSAqdGtleTsKKwkJCWludCBlY2RoX2NsbnRfY2VydCA9IDA7CisJCQlpbnQgZmllbGRfc2l6ZSA9IDA7CisKKwkJCS8qIERpZCB3ZSBzZW5kIG91dCB0aGUgY2xpZW50J3MKKwkJCSAqIEVDREggc2hhcmUgZm9yIHVzZSBpbiBwcmVtYXN0ZXIKKwkJCSAqIGNvbXB1dGF0aW9uIGFzIHBhcnQgb2YgY2xpZW50IGNlcnRpZmljYXRlPworCQkJICogSWYgc28sIHNldCBlY2RoX2NsbnRfY2VydCB0byAxLgorCQkJICovCisJCQlpZiAoKGFsZ19rICYgKFNTTF9rRUNESHJ8U1NMX2tFQ0RIZSkpICYmIChzLT5jZXJ0ICE9IE5VTEwpKSAKKwkJCQl7CisJCQkJLyogWFhYOiBGb3Igbm93LCB3ZSBkbyBub3Qgc3VwcG9ydCBjbGllbnQKKwkJCQkgKiBhdXRoZW50aWNhdGlvbiB1c2luZyBFQ0RIIGNlcnRpZmljYXRlcy4KKwkJCQkgKiBUbyBhZGQgc3VjaCBzdXBwb3J0LCBvbmUgbmVlZHMgdG8gYWRkCisJCQkJICogY29kZSB0aGF0IGNoZWNrcyBmb3IgYXBwcm9wcmlhdGUgCisJCQkJICogY29uZGl0aW9ucyBhbmQgc2V0cyBlY2RoX2NsbnRfY2VydCB0byAxLgorCQkJCSAqIEZvciBleGFtcGxlLCB0aGUgY2VydCBoYXZlIGFuIEVDQworCQkJCSAqIGtleSBvbiB0aGUgc2FtZSBjdXJ2ZSBhcyB0aGUgc2VydmVyJ3MKKwkJCQkgKiBhbmQgdGhlIGtleSBzaG91bGQgYmUgYXV0aG9yaXplZCBmb3IKKwkJCQkgKiBrZXkgYWdyZWVtZW50LgorCQkJCSAqCisJCQkJICogT25lIGFsc28gbmVlZHMgdG8gYWRkIGNvZGUgaW4gc3NsM19jb25uZWN0CisJCQkJICogdG8gc2tpcCBzZW5kaW5nIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZnkKKwkJCQkgKiBtZXNzYWdlLgorCQkJCSAqCisJCQkJICogaWYgKChzLT5jZXJ0LT5rZXktPnByaXZhdGVrZXkgIT0gTlVMTCkgJiYKKwkJCQkgKiAgICAgKHMtPmNlcnQtPmtleS0+cHJpdmF0ZWtleS0+dHlwZSA9PQorCQkJCSAqICAgICAgRVZQX1BLRVlfRUMpICYmIC4uLikKKwkJCQkgKiBlY2RoX2NsbnRfY2VydCA9IDE7CisJCQkJICovCisJCQkJfQorCisJCQlpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5wZWVyX2VjZGhfdG1wICE9IE5VTEwpCisJCQkJeworCQkJCXRrZXkgPSBzLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfZWNkaF90bXA7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQkvKiBHZXQgdGhlIFNlcnZlciBQdWJsaWMgS2V5IGZyb20gQ2VydCAqLworCQkJCXNydnJfcHViX3BrZXkgPSBYNTA5X2dldF9wdWJrZXkocy0+c2Vzc2lvbi0+IFwKKwkJCQkgICAgc2Vzc19jZXJ0LT5wZWVyX3BrZXlzW1NTTF9QS0VZX0VDQ10ueDUwOSk7CisJCQkJaWYgKChzcnZyX3B1Yl9wa2V5ID09IE5VTEwpIHx8CisJCQkJICAgIChzcnZyX3B1Yl9wa2V5LT50eXBlICE9IEVWUF9QS0VZX0VDKSB8fAorCQkJCSAgICAoc3J2cl9wdWJfcGtleS0+cGtleS5lYyA9PSBOVUxMKSkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJCSAgICBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisKKwkJCQl0a2V5ID0gc3J2cl9wdWJfcGtleS0+cGtleS5lYzsKKwkJCQl9CisKKwkJCXNydnJfZ3JvdXAgICA9IEVDX0tFWV9nZXQwX2dyb3VwKHRrZXkpOworCQkJc3J2cl9lY3BvaW50ID0gRUNfS0VZX2dldDBfcHVibGljX2tleSh0a2V5KTsKKworCQkJaWYgKChzcnZyX2dyb3VwID09IE5VTEwpIHx8IChzcnZyX2VjcG9pbnQgPT0gTlVMTCkpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJaWYgKChjbG50X2VjZGg9RUNfS0VZX25ldygpKSA9PSBOVUxMKSAKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCWlmICghRUNfS0VZX3NldF9ncm91cChjbG50X2VjZGgsIHNydnJfZ3JvdXApKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsRVJSX1JfRUNfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoZWNkaF9jbG50X2NlcnQpIAorCQkJCXsgCisJCQkJLyogUmV1c2Uga2V5IGluZm8gZnJvbSBvdXIgY2VydGlmaWNhdGUKKwkJCQkgKiBXZSBvbmx5IG5lZWQgb3VyIHByaXZhdGUga2V5IHRvIHBlcmZvcm0KKwkJCQkgKiB0aGUgRUNESCBjb21wdXRhdGlvbi4KKwkJCQkgKi8KKwkJCQljb25zdCBCSUdOVU0gKnByaXZfa2V5OworCQkJCXRrZXkgPSBzLT5jZXJ0LT5rZXktPnByaXZhdGVrZXktPnBrZXkuZWM7CisJCQkJcHJpdl9rZXkgPSBFQ19LRVlfZ2V0MF9wcml2YXRlX2tleSh0a2V5KTsKKwkJCQlpZiAocHJpdl9rZXkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWlmICghRUNfS0VZX3NldF9wcml2YXRlX2tleShjbG50X2VjZGgsIHByaXZfa2V5KSkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsRVJSX1JfRUNfTElCKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlIAorCQkJCXsKKwkJCQkvKiBHZW5lcmF0ZSBhIG5ldyBFQ0RIIGtleSBwYWlyICovCisJCQkJaWYgKCEoRUNfS0VZX2dlbmVyYXRlX2tleShjbG50X2VjZGgpKSkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsIEVSUl9SX0VDREhfTElCKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQl9CisKKwkJCS8qIHVzZSB0aGUgJ3AnIG91dHB1dCBidWZmZXIgZm9yIHRoZSBFQ0RIIGtleSwgYnV0CisJCQkgKiBtYWtlIHN1cmUgdG8gY2xlYXIgaXQgb3V0IGFmdGVyd2FyZHMKKwkJCSAqLworCisJCQlmaWVsZF9zaXplID0gRUNfR1JPVVBfZ2V0X2RlZ3JlZShzcnZyX2dyb3VwKTsKKwkJCWlmIChmaWVsZF9zaXplIDw9IDApCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwgCisJCQkJICAgICAgIEVSUl9SX0VDREhfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQluPUVDREhfY29tcHV0ZV9rZXkocCwgKGZpZWxkX3NpemUrNykvOCwgc3J2cl9lY3BvaW50LCBjbG50X2VjZGgsIE5VTEwpOworCQkJaWYgKG4gPD0gMCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLCAKKwkJCQkgICAgICAgRVJSX1JfRUNESF9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJLyogZ2VuZXJhdGUgbWFzdGVyIGtleSBmcm9tIHRoZSByZXN1bHQgKi8KKwkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoID0gcy0+bWV0aG9kLT5zc2wzX2VuYyBcCisJCQkgICAgLT4gZ2VuZXJhdGVfbWFzdGVyX3NlY3JldChzLCAKKwkJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LAorCQkJCXAsIG4pOworCisJCQltZW1zZXQocCwgMCwgbik7IC8qIGNsZWFuIHVwICovCisKKwkJCWlmIChlY2RoX2NsbnRfY2VydCkgCisJCQkJeworCQkJCS8qIFNlbmQgZW1wdHkgY2xpZW50IGtleSBleGNoIG1lc3NhZ2UgKi8KKwkJCQluID0gMDsKKwkJCQl9CisJCQllbHNlIAorCQkJCXsKKwkJCQkvKiBGaXJzdCBjaGVjayB0aGUgc2l6ZSBvZiBlbmNvZGluZyBhbmQKKwkJCQkgKiBhbGxvY2F0ZSBtZW1vcnkgYWNjb3JkaW5nbHkuCisJCQkJICovCisJCQkJZW5jb2RlZF9wdF9sZW4gPSAKKwkJCQkgICAgRUNfUE9JTlRfcG9pbnQyb2N0KHNydnJfZ3JvdXAsIAorCQkJCQlFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGNsbnRfZWNkaCksIAorCQkJCQlQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRCwgCisJCQkJCU5VTEwsIDAsIE5VTEwpOworCisJCQkJZW5jb2RlZFBvaW50ID0gKHVuc2lnbmVkIGNoYXIgKikgCisJCQkJICAgIE9QRU5TU0xfbWFsbG9jKGVuY29kZWRfcHRfbGVuICogCisJCQkJCXNpemVvZih1bnNpZ25lZCBjaGFyKSk7IAorCQkJCWJuX2N0eCA9IEJOX0NUWF9uZXcoKTsKKwkJCQlpZiAoKGVuY29kZWRQb2ludCA9PSBOVUxMKSB8fCAKKwkJCQkgICAgKGJuX2N0eCA9PSBOVUxMKSkgCisJCQkJCXsKKwkJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKworCQkJCS8qIEVuY29kZSB0aGUgcHVibGljIGtleSAqLworCQkJCW4gPSBFQ19QT0lOVF9wb2ludDJvY3Qoc3J2cl9ncm91cCwgCisJCQkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoY2xudF9lY2RoKSwgCisJCQkJICAgIFBPSU5UX0NPTlZFUlNJT05fVU5DT01QUkVTU0VELCAKKwkJCQkgICAgZW5jb2RlZFBvaW50LCBlbmNvZGVkX3B0X2xlbiwgYm5fY3R4KTsKKworCQkJCSpwID0gbjsgLyogbGVuZ3RoIG9mIGVuY29kZWQgcG9pbnQgKi8KKwkJCQkvKiBFbmNvZGVkIHBvaW50IHdpbGwgYmUgY29waWVkIGhlcmUgKi8KKwkJCQlwICs9IDE7IAorCQkJCS8qIGNvcHkgdGhlIHBvaW50ICovCisJCQkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcCwgZW5jb2RlZFBvaW50LCBuKTsKKwkJCQkvKiBpbmNyZW1lbnQgbiB0byBhY2NvdW50IGZvciBsZW5ndGggZmllbGQgKi8KKwkJCQluICs9IDE7IAorCQkJCX0KKworCQkJLyogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisJCQlCTl9DVFhfZnJlZShibl9jdHgpOworCQkJaWYgKGVuY29kZWRQb2ludCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoZW5jb2RlZFBvaW50KTsKKwkJCWlmIChjbG50X2VjZGggIT0gTlVMTCkgCisJCQkJIEVDX0tFWV9mcmVlKGNsbnRfZWNkaCk7CisJCQlFVlBfUEtFWV9mcmVlKHNydnJfcHViX3BrZXkpOworCQkJfQorI2VuZGlmIC8qICFPUEVOU1NMX05PX0VDREggKi8KKwkJZWxzZSBpZiAoYWxnX2sgJiBTU0xfa0dPU1QpIAorCQkJeworCQkJLyogR09TVCBrZXkgZXhjaGFuZ2UgbWVzc2FnZSBjcmVhdGlvbiAqLworCQkJRVZQX1BLRVlfQ1RYICpwa2V5X2N0eDsKKwkJCVg1MDkgKnBlZXJfY2VydDsgCisJCQlzaXplX3QgbXNnbGVuOworCQkJdW5zaWduZWQgaW50IG1kX2xlbjsKKwkJCWludCBrZXl0eXBlOworCQkJdW5zaWduZWQgY2hhciBwcmVtYXN0ZXJfc2VjcmV0WzMyXSxzaGFyZWRfdWttWzMyXSwgdG1wWzI1Nl07CisJCQlFVlBfTURfQ1RYICp1a21faGFzaDsKKwkJCUVWUF9QS0VZICpwdWJfa2V5OworCisJCQkvKiBHZXQgc2VydmVyIHNlcnRpZmljYXRlIFBLRVkgYW5kIGNyZWF0ZSBjdHggZnJvbSBpdCAqLworCQkJcGVlcl9jZXJ0PXMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9wa2V5c1soa2V5dHlwZT1TU0xfUEtFWV9HT1NUMDEpXS54NTA5OworCQkJaWYgKCFwZWVyX2NlcnQpIAorCQkJCXBlZXJfY2VydD1zLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfcGtleXNbKGtleXR5cGU9U1NMX1BLRVlfR09TVDk0KV0ueDUwOTsKKwkJCWlmICghcGVlcl9jZXJ0KQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsU1NMX1JfTk9fR09TVF9DRVJUSUZJQ0FURV9TRU5UX0JZX1BFRVIpOworCQkJCQlnb3RvIGVycjsKKwkJCQl9CQorCQkJCQorCQkJcGtleV9jdHg9RVZQX1BLRVlfQ1RYX25ldyhwdWJfa2V5PVg1MDlfZ2V0X3B1YmtleShwZWVyX2NlcnQpLE5VTEwpOworCQkJLyogSWYgd2UgaGF2ZSBzZW5kIGEgY2VydGlmaWNhdGUsIGFuZCBjZXJ0aWZpY2F0ZSBrZXkKKworCQkJICogcGFyYW1ldGVycyBtYXRjaCB0aG9zZSBvZiBzZXJ2ZXIgY2VydGlmaWNhdGUsIHVzZQorCQkJICogY2VydGlmaWNhdGUga2V5IGZvciBrZXkgZXhjaGFuZ2UKKwkJCSAqLworCisJCQkgLyogT3RoZXJ3aXNlLCBnZW5lcmF0ZSBlcGhlbWVyYWwga2V5IHBhaXIgKi8KKwkJCQkJCisJCQlFVlBfUEtFWV9lbmNyeXB0X2luaXQocGtleV9jdHgpOworCQkJICAvKiBHZW5lcmF0ZSBzZXNzaW9uIGtleSAqLwkKKwkJICAgIFJBTkRfYnl0ZXMocHJlbWFzdGVyX3NlY3JldCwzMik7CisJCQkvKiBJZiB3ZSBoYXZlIGNsaWVudCBjZXJ0aWZpY2F0ZSwgdXNlIGl0cyBzZWNyZXQgYXMgcGVlciBrZXkgKi8KKwkJCWlmIChzLT5zMy0+dG1wLmNlcnRfcmVxICYmIHMtPmNlcnQtPmtleS0+cHJpdmF0ZWtleSkgeworCQkJCWlmIChFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIocGtleV9jdHgscy0+Y2VydC0+a2V5LT5wcml2YXRla2V5KSA8PTApIHsKKwkJCQkJLyogSWYgdGhlcmUgd2FzIGFuIGVycm9yIC0ganVzdCBpZ25vcmUgaXQuIEVwaGVtZXJhbCBrZXkKKwkJCQkJKiB3b3VsZCBiZSB1c2VkCisJCQkJCSovCisJCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCX0KKwkJCX0JCQkKKwkJCS8qIENvbXB1dGUgc2hhcmVkIElWIGFuZCBzdG9yZSBpdCBpbiBhbGdvcml0aG0tc3BlY2lmaWMKKwkJCSAqIGNvbnRleHQgZGF0YSAqLworCQkJdWttX2hhc2ggPSBFVlBfTURfQ1RYX2NyZWF0ZSgpOworCQkJRVZQX0RpZ2VzdEluaXQodWttX2hhc2gsRVZQX2dldF9kaWdlc3RieW5pZChOSURfaWRfR29zdFIzNDExXzk0KSk7CisJCQlFVlBfRGlnZXN0VXBkYXRlKHVrbV9oYXNoLHMtPnMzLT5jbGllbnRfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUpOworCQkJRVZQX0RpZ2VzdFVwZGF0ZSh1a21faGFzaCxzLT5zMy0+c2VydmVyX3JhbmRvbSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJCUVWUF9EaWdlc3RGaW5hbF9leCh1a21faGFzaCwgc2hhcmVkX3VrbSwgJm1kX2xlbik7CisJCQlFVlBfTURfQ1RYX2Rlc3Ryb3kodWttX2hhc2gpOworCQkJaWYgKEVWUF9QS0VZX0NUWF9jdHJsKHBrZXlfY3R4LC0xLEVWUF9QS0VZX09QX0VOQ1JZUFQsRVZQX1BLRVlfQ1RSTF9TRVRfSVYsCisJCQkJOCxzaGFyZWRfdWttKTwwKSB7CisJCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJCVNTTF9SX0xJQlJBUllfQlVHKTsKKwkJCQkJZ290byBlcnI7CisJCQkJfQkKKwkJCS8qIE1ha2UgR09TVCBrZXl0cmFuc3BvcnQgYmxvYiBtZXNzYWdlICovCisJCQkvKkVuY2Fwc3VsYXRlIGl0IGludG8gc2VxdWVuY2UgKi8KKwkJCSoocCsrKT1WX0FTTjFfU0VRVUVOQ0UgfCBWX0FTTjFfQ09OU1RSVUNURUQ7CisJCQltc2dsZW49MjU1OworCQkJaWYgKEVWUF9QS0VZX2VuY3J5cHQocGtleV9jdHgsdG1wLCZtc2dsZW4scHJlbWFzdGVyX3NlY3JldCwzMik8MCkgeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCQlTU0xfUl9MSUJSQVJZX0JVRyk7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQlpZiAobXNnbGVuID49IDB4ODApCisJCQkJeworCQkJCSoocCsrKT0weDgxOworCQkJCSoocCsrKT0gbXNnbGVuICYgMHhmZjsKKwkJCQluPW1zZ2xlbiszOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJKihwKyspPSBtc2dsZW4gJiAweGZmOworCQkJCW49bXNnbGVuKzI7CisJCQkJfQorCQkJbWVtY3B5KHAsIHRtcCwgbXNnbGVuKTsKKwkJCS8qIENoZWNrIGlmIHB1YmtleSBmcm9tIGNsaWVudCBjZXJ0aWZpY2F0ZSB3YXMgdXNlZCAqLworCQkJaWYgKEVWUF9QS0VZX0NUWF9jdHJsKHBrZXlfY3R4LCAtMSwgLTEsIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVksIDIsIE5VTEwpID4gMCkKKwkJCQl7CisJCQkJLyogU2V0IGZsYWcgInNraXAgY2VydGlmaWNhdGUgdmVyaWZ5IiAqLworCQkJCXMtPnMzLT5mbGFncyB8PSBUTFMxX0ZMQUdTX1NLSVBfQ0VSVF9WRVJJRlk7CisJCQkJfQorCQkJRVZQX1BLRVlfQ1RYX2ZyZWUocGtleV9jdHgpOworCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg9CisJCQkJcy0+bWV0aG9kLT5zc2wzX2VuYy0+Z2VuZXJhdGVfbWFzdGVyX3NlY3JldChzLAorCQkJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LHByZW1hc3Rlcl9zZWNyZXQsMzIpOworCQkJRVZQX1BLRVlfZnJlZShwdWJfa2V5KTsKKworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCQllbHNlIGlmIChhbGdfayAmIFNTTF9rUFNLKQorCQkJeworCQkJY2hhciBpZGVudGl0eVtQU0tfTUFYX0lERU5USVRZX0xFTl07CisJCQl1bnNpZ25lZCBjaGFyICp0ID0gTlVMTDsKKwkJCXVuc2lnbmVkIGNoYXIgcHNrX29yX3ByZV9tc1tQU0tfTUFYX1BTS19MRU4qMis0XTsKKwkJCXVuc2lnbmVkIGludCBwcmVfbXNfbGVuID0gMCwgcHNrX2xlbiA9IDA7CisJCQlpbnQgcHNrX2VyciA9IDE7CisKKwkJCW4gPSAwOworCQkJaWYgKHMtPnBza19jbGllbnRfY2FsbGJhY2sgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCQlTU0xfUl9QU0tfTk9fQ0xJRU5UX0NCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCXBza19sZW4gPSBzLT5wc2tfY2xpZW50X2NhbGxiYWNrKHMsIHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQsCisJCQkJaWRlbnRpdHksIFBTS19NQVhfSURFTlRJVFlfTEVOLAorCQkJCXBza19vcl9wcmVfbXMsIHNpemVvZihwc2tfb3JfcHJlX21zKSk7CisJCQlpZiAocHNrX2xlbiA+IFBTS19NQVhfUFNLX0xFTikKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCQlFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJZ290byBwc2tfZXJyOworCQkJCX0KKwkJCWVsc2UgaWYgKHBza19sZW4gPT0gMCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCQlTU0xfUl9QU0tfSURFTlRJVFlfTk9UX0ZPVU5EKTsKKwkJCQlnb3RvIHBza19lcnI7CisJCQkJfQorCisJCQkvKiBjcmVhdGUgUFNLIHByZV9tYXN0ZXJfc2VjcmV0ICovCisJCQlwcmVfbXNfbGVuID0gMitwc2tfbGVuKzIrcHNrX2xlbjsKKwkJCXQgPSBwc2tfb3JfcHJlX21zOworCQkJbWVtbW92ZShwc2tfb3JfcHJlX21zK3Bza19sZW4rNCwgcHNrX29yX3ByZV9tcywgcHNrX2xlbik7CisJCQlzMm4ocHNrX2xlbiwgdCk7CisJCQltZW1zZXQodCwgMCwgcHNrX2xlbik7CisJCQl0Kz1wc2tfbGVuOworCQkJczJuKHBza19sZW4sIHQpOworCisJCQlpZiAocy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5X2hpbnQgIT0gTlVMTCkKKwkJCQlPUEVOU1NMX2ZyZWUocy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5X2hpbnQpOworCQkJcy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5X2hpbnQgPSBCVUZfc3RyZHVwKHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQpOworCQkJaWYgKHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQgIT0gTlVMTCAmJgorCQkJCXMtPnNlc3Npb24tPnBza19pZGVudGl0eV9oaW50ID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gcHNrX2VycjsKKwkJCQl9CisKKwkJCWlmIChzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHkgIT0gTlVMTCkKKwkJCQlPUEVOU1NMX2ZyZWUocy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5KTsKKwkJCXMtPnNlc3Npb24tPnBza19pZGVudGl0eSA9IEJVRl9zdHJkdXAoaWRlbnRpdHkpOworCQkJaWYgKHMtPnNlc3Npb24tPnBza19pZGVudGl0eSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIHBza19lcnI7CisJCQkJfQorCisJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCA9CisJCQkJcy0+bWV0aG9kLT5zc2wzX2VuYy0+Z2VuZXJhdGVfbWFzdGVyX3NlY3JldChzLAorCQkJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LAorCQkJCQlwc2tfb3JfcHJlX21zLCBwcmVfbXNfbGVuKTsgCisJCQluID0gc3RybGVuKGlkZW50aXR5KTsKKwkJCXMybihuLCBwKTsKKwkJCW1lbWNweShwLCBpZGVudGl0eSwgbik7CisJCQluKz0yOworCQkJcHNrX2VyciA9IDA7CisJCXBza19lcnI6CisJCQlPUEVOU1NMX2NsZWFuc2UoaWRlbnRpdHksIFBTS19NQVhfSURFTlRJVFlfTEVOKTsKKwkJCU9QRU5TU0xfY2xlYW5zZShwc2tfb3JfcHJlX21zLCBzaXplb2YocHNrX29yX3ByZV9tcykpOworCQkJaWYgKHBza19lcnIgIT0gMCkKKwkJCQl7CisJCQkJc3NsM19zZW5kX2FsZXJ0KHMsIFNTTDNfQUxfRkFUQUwsIFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCWVsc2UKKwkJCXsKKwkJCXNzbDNfc2VuZF9hbGVydChzLCBTU0wzX0FMX0ZBVEFMLAorCQkJICAgIFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkgICAgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJZ290byBlcnI7CisJCQl9CisJCQorCQkqKGQrKyk9U1NMM19NVF9DTElFTlRfS0VZX0VYQ0hBTkdFOworCQlsMm4zKG4sZCk7CisKKwkJcy0+c3RhdGU9U1NMM19TVF9DV19LRVlfRVhDSF9COworCQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJcy0+aW5pdF9udW09bis0OworCQlzLT5pbml0X29mZj0wOworCQl9CisKKwkvKiBTU0wzX1NUX0NXX0tFWV9FWENIX0IgKi8KKwlyZXR1cm4oc3NsM19kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CitlcnI6CisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCUJOX0NUWF9mcmVlKGJuX2N0eCk7CisJaWYgKGVuY29kZWRQb2ludCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoZW5jb2RlZFBvaW50KTsKKwlpZiAoY2xudF9lY2RoICE9IE5VTEwpIAorCQlFQ19LRVlfZnJlZShjbG50X2VjZGgpOworCUVWUF9QS0VZX2ZyZWUoc3J2cl9wdWJfcGtleSk7CisjZW5kaWYKKwlyZXR1cm4oLTEpOworCX0KKworaW50IHNzbDNfc2VuZF9jbGllbnRfdmVyaWZ5KFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqcCwqZDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbTUQ1X0RJR0VTVF9MRU5HVEgrU0hBX0RJR0VTVF9MRU5HVEhdOworCUVWUF9QS0VZICpwa2V5OworCUVWUF9QS0VZX0NUWCAqcGN0eD1OVUxMOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXVuc2lnbmVkIHU9MDsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgbjsKKwlpbnQgajsKKworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX0NXX0NFUlRfVlJGWV9BKQorCQl7CisJCWQ9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKwkJcD0gJihkWzRdKTsKKwkJcGtleT1zLT5jZXJ0LT5rZXktPnByaXZhdGVrZXk7CisvKiBDcmVhdGUgY29udGV4dCBmcm9tIGtleSBhbmQgdGVzdCBpZiBzaGExIGlzIGFsbG93ZWQgYXMgZGlnZXN0ICovCisJCXBjdHggPSBFVlBfUEtFWV9DVFhfbmV3KHBrZXksTlVMTCk7CisJCUVWUF9QS0VZX3NpZ25faW5pdChwY3R4KTsKKwkJaWYgKEVWUF9QS0VZX0NUWF9zZXRfc2lnbmF0dXJlX21kKHBjdHgsIEVWUF9zaGExKCkpPjApCisJCQl7CisJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5jZXJ0X3ZlcmlmeV9tYWMocywKKwkJCQkJCU5JRF9zaGExLAorCQkJCQkJJihkYXRhW01ENV9ESUdFU1RfTEVOR1RIXSkpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkJaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfUlNBKQorCQkJeworCQkJcy0+bWV0aG9kLT5zc2wzX2VuYy0+Y2VydF92ZXJpZnlfbWFjKHMsCisJCQkJTklEX21kNSwKKwkJCSAJJihkYXRhWzBdKSk7CisJCQlpZiAoUlNBX3NpZ24oTklEX21kNV9zaGExLCBkYXRhLAorCQkJCQkgTUQ1X0RJR0VTVF9MRU5HVEgrU0hBX0RJR0VTVF9MRU5HVEgsCisJCQkJCSYocFsyXSksICZ1LCBwa2V5LT5wa2V5LnJzYSkgPD0gMCApCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX1ZFUklGWSxFUlJfUl9SU0FfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlzMm4odSxwKTsKKwkJCW49dSsyOworCQkJfQorCQllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkJCWlmIChwa2V5LT50eXBlID09IEVWUF9QS0VZX0RTQSkKKwkJCXsKKwkJCWlmICghRFNBX3NpZ24ocGtleS0+c2F2ZV90eXBlLAorCQkJCSYoZGF0YVtNRDVfRElHRVNUX0xFTkdUSF0pLAorCQkJCVNIQV9ESUdFU1RfTEVOR1RILCYocFsyXSksCisJCQkJKHVuc2lnbmVkIGludCAqKSZqLHBrZXktPnBrZXkuZHNhKSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DTElFTlRfVkVSSUZZLEVSUl9SX0RTQV9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXMybihqLHApOworCQkJbj1qKzI7CisJCQl9CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDRFNBCisJCQlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9FQykKKwkJCXsKKwkJCWlmICghRUNEU0Ffc2lnbihwa2V5LT5zYXZlX3R5cGUsCisJCQkJJihkYXRhW01ENV9ESUdFU1RfTEVOR1RIXSksCisJCQkJU0hBX0RJR0VTVF9MRU5HVEgsJihwWzJdKSwKKwkJCQkodW5zaWduZWQgaW50ICopJmoscGtleS0+cGtleS5lYykpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX1ZFUklGWSwKKwkJCQkgICAgRVJSX1JfRUNEU0FfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlzMm4oaixwKTsKKwkJCW49aisyOworCQkJfQorCQllbHNlCisjZW5kaWYKKwkJaWYgKHBrZXktPnR5cGUgPT0gTklEX2lkX0dvc3RSMzQxMF85NCB8fCBwa2V5LT50eXBlID09IE5JRF9pZF9Hb3N0UjM0MTBfMjAwMSkgCisJCXsKKwkJdW5zaWduZWQgY2hhciBzaWduYnVmWzY0XTsKKwkJaW50IGk7CisJCXNpemVfdCBzaWdzaXplPTY0OworCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5jZXJ0X3ZlcmlmeV9tYWMocywKKwkJCU5JRF9pZF9Hb3N0UjM0MTFfOTQsCisJCQlkYXRhKTsKKwkJaWYgKEVWUF9QS0VZX3NpZ24ocGN0eCwgc2lnbmJ1ZiwgJnNpZ3NpemUsIGRhdGEsIDMyKSA8PSAwKSB7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9WRVJJRlksCisJCQlFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJfQorCQlmb3IgKGk9NjMsaj0wOyBpPj0wOyBqKyssIGktLSkgeworCQkJcFsyK2pdPXNpZ25idWZbaV07CisJCX0JCisJCXMybihqLHApOworCQluPWorMjsKKwkJfQorCQllbHNlCisJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX1ZFUklGWSxFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJfQorCQkqKGQrKyk9U1NMM19NVF9DRVJUSUZJQ0FURV9WRVJJRlk7CisJCWwybjMobixkKTsKKworCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0NFUlRfVlJGWV9COworCQlzLT5pbml0X251bT0oaW50KW4rNDsKKwkJcy0+aW5pdF9vZmY9MDsKKwkJfQorCUVWUF9QS0VZX0NUWF9mcmVlKHBjdHgpOworCXJldHVybihzc2wzX2RvX3dyaXRlKHMsU1NMM19SVF9IQU5EU0hBS0UpKTsKK2VycjoKKwlFVlBfUEtFWV9DVFhfZnJlZShwY3R4KTsKKwlyZXR1cm4oLTEpOworCX0KKworaW50IHNzbDNfc2VuZF9jbGllbnRfY2VydGlmaWNhdGUoU1NMICpzKQorCXsKKwlYNTA5ICp4NTA5PU5VTEw7CisJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGw7CisKKwlpZiAocy0+c3RhdGUgPT0JU1NMM19TVF9DV19DRVJUX0EpCisJCXsKKwkJaWYgKChzLT5jZXJ0ID09IE5VTEwpIHx8CisJCQkocy0+Y2VydC0+a2V5LT54NTA5ID09IE5VTEwpIHx8CisJCQkocy0+Y2VydC0+a2V5LT5wcml2YXRla2V5ID09IE5VTEwpKQorCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DRVJUX0I7CisJCWVsc2UKKwkJCXMtPnN0YXRlPVNTTDNfU1RfQ1dfQ0VSVF9DOworCQl9CisKKwkvKiBXZSBuZWVkIHRvIGdldCBhIGNsaWVudCBjZXJ0ICovCisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfQ1dfQ0VSVF9CKQorCQl7CisJCS8qIElmIHdlIGdldCBhbiBlcnJvciwgd2UgbmVlZCB0bworCQkgKiBzc2wtPnJ3c3RhdGU9U1NMX1g1MDlfTE9PS1VQOyByZXR1cm4oLTEpOworCQkgKiBXZSB0aGVuIGdldCByZXRpZWQgbGF0ZXIgKi8KKwkJaT0wOworCQlpID0gc3NsX2RvX2NsaWVudF9jZXJ0X2NiKHMsICZ4NTA5LCAmcGtleSk7CisJCWlmIChpIDwgMCkKKwkJCXsKKwkJCXMtPnJ3c3RhdGU9U1NMX1g1MDlfTE9PS1VQOworCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJaWYgKChpID09IDEpICYmIChwa2V5ICE9IE5VTEwpICYmICh4NTA5ICE9IE5VTEwpKQorCQkJeworCQkJcy0+c3RhdGU9U1NMM19TVF9DV19DRVJUX0I7CisJCQlpZiAoCSFTU0xfdXNlX2NlcnRpZmljYXRlKHMseDUwOSkgfHwKKwkJCQkhU1NMX3VzZV9Qcml2YXRlS2V5KHMscGtleSkpCisJCQkJaT0wOworCQkJfQorCQllbHNlIGlmIChpID09IDEpCisJCQl7CisJCQlpPTA7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURSxTU0xfUl9CQURfREFUQV9SRVRVUk5FRF9CWV9DQUxMQkFDSyk7CisJCQl9CisKKwkJaWYgKHg1MDkgIT0gTlVMTCkgWDUwOV9mcmVlKHg1MDkpOworCQlpZiAocGtleSAhPSBOVUxMKSBFVlBfUEtFWV9mcmVlKHBrZXkpOworCQlpZiAoaSA9PSAwKQorCQkJeworCQkJaWYgKHMtPnZlcnNpb24gPT0gU1NMM19WRVJTSU9OKQorCQkJCXsKKwkJCQlzLT5zMy0+dG1wLmNlcnRfcmVxPTA7CisJCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9XQVJOSU5HLFNTTF9BRF9OT19DRVJUSUZJQ0FURSk7CisJCQkJcmV0dXJuKDEpOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJcy0+czMtPnRtcC5jZXJ0X3JlcT0yOworCQkJCX0KKwkJCX0KKworCQkvKiBPaywgd2UgaGF2ZSBhIGNlcnQgKi8KKwkJcy0+c3RhdGU9U1NMM19TVF9DV19DRVJUX0M7CisJCX0KKworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX0NXX0NFUlRfQykKKwkJeworCQlzLT5zdGF0ZT1TU0wzX1NUX0NXX0NFUlRfRDsKKwkJbD1zc2wzX291dHB1dF9jZXJ0X2NoYWluKHMsCisJCQkocy0+czMtPnRtcC5jZXJ0X3JlcSA9PSAyKT9OVUxMOnMtPmNlcnQtPmtleS0+eDUwOSk7CisJCXMtPmluaXRfbnVtPShpbnQpbDsKKwkJcy0+aW5pdF9vZmY9MDsKKwkJfQorCS8qIFNTTDNfU1RfQ1dfQ0VSVF9EICovCisJcmV0dXJuKHNzbDNfZG9fd3JpdGUocyxTU0wzX1JUX0hBTkRTSEFLRSkpOworCX0KKworI2RlZmluZSBoYXNfYml0cyhpLG0pCSgoKGkpJihtKSkgPT0gKG0pKQorCitpbnQgc3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG0oU1NMICpzKQorCXsKKwlpbnQgaSxpZHg7CisJbG9uZyBhbGdfayxhbGdfYTsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCVNFU1NfQ0VSVCAqc2M7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJUlNBICpyc2E7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCURIICpkaDsKKyNlbmRpZgorCisJYWxnX2s9cy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKKwlhbGdfYT1zLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoOworCisJLyogd2UgZG9uJ3QgaGF2ZSBhIGNlcnRpZmljYXRlICovCisJaWYgKChhbGdfYSAmIChTU0xfYURIfFNTTF9hTlVMTHxTU0xfYUtSQjUpKSB8fCAoYWxnX2sgJiBTU0xfa1BTSykpCisJCXJldHVybigxKTsKKworCXNjPXMtPnNlc3Npb24tPnNlc3NfY2VydDsKKwlpZiAoc2MgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19DSEVDS19DRVJUX0FORF9BTEdPUklUSE0sRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlnb3RvIGVycjsKKwkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJcnNhPXMtPnNlc3Npb24tPnNlc3NfY2VydC0+cGVlcl9yc2FfdG1wOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwlkaD1zLT5zZXNzaW9uLT5zZXNzX2NlcnQtPnBlZXJfZGhfdG1wOworI2VuZGlmCisKKwkvKiBUaGlzIGlzIHRoZSBwYXNzZWQgY2VydGlmaWNhdGUgKi8KKworCWlkeD1zYy0+cGVlcl9jZXJ0X3R5cGU7CisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWlmIChpZHggPT0gU1NMX1BLRVlfRUNDKQorCQl7CisJCWlmIChzc2xfY2hlY2tfc3J2cl9lY2NfY2VydF9hbmRfYWxnKHNjLT5wZWVyX3BrZXlzW2lkeF0ueDUwOSwKKwkJICAgIHMtPnMzLT50bXAubmV3X2NpcGhlcikgPT0gMCkgCisJCQl7IC8qIGNoZWNrIGZhaWxlZCAqLworCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ0hFQ0tfQ0VSVF9BTkRfQUxHT1JJVEhNLFNTTF9SX0JBRF9FQ0NfQ0VSVCk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQllbHNlIAorCQkJeworCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKyNlbmRpZgorCXBrZXk9WDUwOV9nZXRfcHVia2V5KHNjLT5wZWVyX3BrZXlzW2lkeF0ueDUwOSk7CisJaT1YNTA5X2NlcnRpZmljYXRlX3R5cGUoc2MtPnBlZXJfcGtleXNbaWR4XS54NTA5LHBrZXkpOworCUVWUF9QS0VZX2ZyZWUocGtleSk7CisKKwkKKwkvKiBDaGVjayB0aGF0IHdlIGhhdmUgYSBjZXJ0aWZpY2F0ZSBpZiB3ZSByZXF1aXJlIG9uZSAqLworCWlmICgoYWxnX2EgJiBTU0xfYVJTQSkgJiYgIWhhc19iaXRzKGksRVZQX1BLX1JTQXxFVlBfUEtUX1NJR04pKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wzX0NIRUNLX0NFUlRfQU5EX0FMR09SSVRITSxTU0xfUl9NSVNTSU5HX1JTQV9TSUdOSU5HX0NFUlQpOworCQlnb3RvIGZfZXJyOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJZWxzZSBpZiAoKGFsZ19hICYgU1NMX2FEU1MpICYmICFoYXNfYml0cyhpLEVWUF9QS19EU0F8RVZQX1BLVF9TSUdOKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19DSEVDS19DRVJUX0FORF9BTEdPUklUSE0sU1NMX1JfTUlTU0lOR19EU0FfU0lHTklOR19DRVJUKTsKKwkJZ290byBmX2VycjsKKwkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJaWYgKChhbGdfayAmIFNTTF9rUlNBKSAmJgorCQkhKGhhc19iaXRzKGksRVZQX1BLX1JTQXxFVlBfUEtUX0VOQykgfHwgKHJzYSAhPSBOVUxMKSkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfQ0hFQ0tfQ0VSVF9BTkRfQUxHT1JJVEhNLFNTTF9SX01JU1NJTkdfUlNBX0VOQ1JZUFRJTkdfQ0VSVCk7CisJCWdvdG8gZl9lcnI7CisJCX0KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJaWYgKChhbGdfayAmIFNTTF9rRURIKSAmJgorCQkhKGhhc19iaXRzKGksRVZQX1BLX0RIfEVWUF9QS1RfRVhDSCkgfHwgKGRoICE9IE5VTEwpKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19DSEVDS19DRVJUX0FORF9BTEdPUklUSE0sU1NMX1JfTUlTU0lOR19ESF9LRVkpOworCQlnb3RvIGZfZXJyOworCQl9CisJZWxzZSBpZiAoKGFsZ19rICYgU1NMX2tESHIpICYmICFoYXNfYml0cyhpLEVWUF9QS19ESHxFVlBfUEtTX1JTQSkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfQ0hFQ0tfQ0VSVF9BTkRfQUxHT1JJVEhNLFNTTF9SX01JU1NJTkdfREhfUlNBX0NFUlQpOworCQlnb3RvIGZfZXJyOworCQl9CisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJZWxzZSBpZiAoKGFsZ19rICYgU1NMX2tESGQpICYmICFoYXNfYml0cyhpLEVWUF9QS19ESHxFVlBfUEtTX0RTQSkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfQ0hFQ0tfQ0VSVF9BTkRfQUxHT1JJVEhNLFNTTF9SX01JU1NJTkdfREhfRFNBX0NFUlQpOworCQlnb3RvIGZfZXJyOworCQl9CisjZW5kaWYKKyNlbmRpZgorCisJaWYgKFNTTF9DX0lTX0VYUE9SVChzLT5zMy0+dG1wLm5ld19jaXBoZXIpICYmICFoYXNfYml0cyhpLEVWUF9QS1RfRVhQKSkKKwkJeworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQlpZiAoYWxnX2sgJiBTU0xfa1JTQSkKKwkJCXsKKwkJCWlmIChyc2EgPT0gTlVMTAorCQkJICAgIHx8IFJTQV9zaXplKHJzYSkqOCA+IFNTTF9DX0VYUE9SVF9QS0VZTEVOR1RIKHMtPnMzLT50bXAubmV3X2NpcGhlcikpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0NIRUNLX0NFUlRfQU5EX0FMR09SSVRITSxTU0xfUl9NSVNTSU5HX0VYUE9SVF9UTVBfUlNBX0tFWSk7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCQlpZiAoYWxnX2sgJiAoU1NMX2tFREh8U1NMX2tESHJ8U1NMX2tESGQpKQorCQkJICAgIHsKKwkJCSAgICBpZiAoZGggPT0gTlVMTAorCQkJCXx8IERIX3NpemUoZGgpKjggPiBTU0xfQ19FWFBPUlRfUEtFWUxFTkdUSChzLT5zMy0+dG1wLm5ld19jaXBoZXIpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DSEVDS19DRVJUX0FORF9BTEdPUklUSE0sU1NMX1JfTUlTU0lOR19FWFBPUlRfVE1QX0RIX0tFWSk7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQl9CisJCWVsc2UKKyNlbmRpZgorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ0hFQ0tfQ0VSVF9BTkRfQUxHT1JJVEhNLFNTTF9SX1VOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEUpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJfQorCXJldHVybigxKTsKK2ZfZXJyOgorCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKK2VycjoKKwlyZXR1cm4oMCk7CisJfQorCisvKiBDaGVjayB0byBzZWUgaWYgaGFuZHNoYWtlIGlzIGZ1bGwgb3IgcmVzdW1lZC4gVXN1YWxseSB0aGlzIGlzIGp1c3QgYQorICogY2FzZSBvZiBjaGVja2luZyB0byBzZWUgaWYgYSBjYWNoZSBoaXQgaGFzIG9jY3VycmVkLiBJbiB0aGUgY2FzZSBvZgorICogc2Vzc2lvbiB0aWNrZXRzIHdlIGhhdmUgdG8gY2hlY2sgdGhlIG5leHQgbWVzc2FnZSB0byBiZSBzdXJlLgorICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK2ludCBzc2wzX2NoZWNrX2ZpbmlzaGVkKFNTTCAqcykKKwl7CisJaW50IG9rOworCWxvbmcgbjsKKwkvKiBJZiB3ZSBoYXZlIG5vIHRpY2tldCBpdCBjYW5ub3QgYmUgYSByZXN1bWVkIHNlc3Npb24uICovCisJaWYgKCFzLT5zZXNzaW9uLT50bHNleHRfdGljaykKKwkJcmV0dXJuIDE7CisJLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWFsbHkgZXhwZWN0IGEgQ2VydGlmaWNhdGUKKwkgKiBtZXNzYWdlLCBzbyBwZXJtaXQgYXBwcm9wcmlhdGUgbWVzc2FnZSBsZW5ndGggKi8KKwluPXMtPm1ldGhvZC0+c3NsX2dldF9tZXNzYWdlKHMsCisJCVNTTDNfU1RfQ1JfQ0VSVF9BLAorCQlTU0wzX1NUX0NSX0NFUlRfQiwKKwkJLTEsCisJCXMtPm1heF9jZXJ0X2xpc3QsCisJCSZvayk7CisJaWYgKCFvaykgcmV0dXJuKChpbnQpbik7CisJcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlID0gMTsKKwlpZiAoKHMtPnMzLT50bXAubWVzc2FnZV90eXBlID09IFNTTDNfTVRfRklOSVNIRUQpCisJCXx8IChzLT5zMy0+dG1wLm1lc3NhZ2VfdHlwZSA9PSBTU0wzX01UX05FV1NFU1NJT05fVElDS0VUKSkKKwkJcmV0dXJuIDI7CisKKwlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKworaW50IHNzbF9kb19jbGllbnRfY2VydF9jYihTU0wgKnMsIFg1MDkgKipweDUwOSwgRVZQX1BLRVkgKipwcGtleSkKKwl7CisJaW50IGkgPSAwOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmIChzLT5jdHgtPmNsaWVudF9jZXJ0X2VuZ2luZSkKKwkJeworCQlpID0gRU5HSU5FX2xvYWRfc3NsX2NsaWVudF9jZXJ0KHMtPmN0eC0+Y2xpZW50X2NlcnRfZW5naW5lLCBzLAorCQkJCQkJU1NMX2dldF9jbGllbnRfQ0FfbGlzdChzKSwKKwkJCQkJCXB4NTA5LCBwcGtleSwgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWlmIChpICE9IDApCisJCQlyZXR1cm4gaTsKKwkJfQorI2VuZGlmCisJaWYgKHMtPmN0eC0+Y2xpZW50X2NlcnRfY2IpCisJCWkgPSBzLT5jdHgtPmNsaWVudF9jZXJ0X2NiKHMscHg1MDkscHBrZXkpOworCXJldHVybiBpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zM19lbmMuYyBiL2xpYi9vcGVuc3NsL3NzbC9zM19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDdhZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3MzX2VuYy5jCkBAIC0wLDAgKzEsODQ3IEBACisvKiBzc2wvczNfZW5jLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDA1IE5va2lhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBwb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBpcyBkZXZlbG9wZWQgYnkKKyAqIE5va2lhIENvcnBvcmF0aW9uIGFuZCBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZS4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uLCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWlrYSBLb3VzYSBhbmQgUGFzaSBFcm9uZW4gb2YKKyAqIE5va2lhIENvcnBvcmF0aW9uLCBjb25zaXN0cyBvZiB0aGUgIlBTSyIgKFByZS1TaGFyZWQgS2V5KSBjaXBoZXJzdWl0ZXMKKyAqIHN1cHBvcnQgKHNlZSBSRkMgNDI3OSkgdG8gT3BlblNTTC4KKyAqCisgKiBObyBwYXRlbnQgbGljZW5zZXMgb3Igb3RoZXIgcmlnaHRzIGV4Y2VwdCB0aG9zZSBleHByZXNzbHkgc3RhdGVkIGluCisgKiB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZSBsaWNlbnNlIHNoYWxsIGJlIGRlZW1lZCBncmFudGVkIG9yIHJlY2VpdmVkCisgKiBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCwgb3Igb3RoZXJ3aXNlLgorICoKKyAqIE5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IE5va2lhIHRoYXQgdGhlIENvbnRyaWJ1dGlvbiBkb2VzIG5vdAorICogaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSB0aGlyZAorICogcGFydHkgb3IgdGhhdCB0aGUgbGljZW5zZSBwcm92aWRlcyB5b3Ugd2l0aCBhbGwgdGhlIG5lY2Vzc2FyeSByaWdodHMKKyAqIHRvIG1ha2UgdXNlIG9mIHRoZSBDb250cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORC4gSU4KKyAqIEFERElUSU9OIFRPIFRIRSBESVNDTEFJTUVSUyBJTkNMVURFRCBJTiBUSEUgTElDRU5TRSwgTk9LSUEKKyAqIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBGT1IgQ0xBSU1TIEJST1VHSFQgQlkgWU9VIE9SIEFOWQorICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCisgKiBPVEhFUldJU0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNzbDNfcGFkXzFbNDhdPXsKKwkweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCisJMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAorCTB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKKwkweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCisJMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAorCTB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiB9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzc2wzX3BhZF8yWzQ4XT17CisJMHg1YywweDVjLDB4NWMsMHg1YywweDVjLDB4NWMsMHg1YywweDVjLAorCTB4NWMsMHg1YywweDVjLDB4NWMsMHg1YywweDVjLDB4NWMsMHg1YywKKwkweDVjLDB4NWMsMHg1YywweDVjLDB4NWMsMHg1YywweDVjLDB4NWMsCisJMHg1YywweDVjLDB4NWMsMHg1YywweDVjLDB4NWMsMHg1YywweDVjLAorCTB4NWMsMHg1YywweDVjLDB4NWMsMHg1YywweDVjLDB4NWMsMHg1YywKKwkweDVjLDB4NWMsMHg1YywweDVjLDB4NWMsMHg1YywweDVjLDB4NWMgfTsKK3N0YXRpYyBpbnQgc3NsM19oYW5kc2hha2VfbWFjKFNTTCAqcywgaW50IG1kX25pZCwKKwljb25zdCBjaGFyICpzZW5kZXIsIGludCBsZW4sIHVuc2lnbmVkIGNoYXIgKnApOworc3RhdGljIGludCBzc2wzX2dlbmVyYXRlX2tleV9ibG9jayhTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKmttLCBpbnQgbnVtKQorCXsKKwlFVlBfTURfQ1RYIG01OworCUVWUF9NRF9DVFggczE7CisJdW5zaWduZWQgY2hhciBidWZbMTZdLHNtZFtTSEFfRElHRVNUX0xFTkdUSF07CisJdW5zaWduZWQgY2hhciBjPSdBJzsKKwl1bnNpZ25lZCBpbnQgaSxqLGs7CisKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworCWMgPSBvc190b2FzY2lpW2NdOyAvKidBJyBpbiBBU0NJSSAqLworI2VuZGlmCisJaz0wOworCUVWUF9NRF9DVFhfaW5pdCgmbTUpOworCUVWUF9NRF9DVFhfaW5pdCgmczEpOworCWZvciAoaT0wOyAoaW50KWk8bnVtOyBpKz1NRDVfRElHRVNUX0xFTkdUSCkKKwkJeworCQlrKys7CisJCWlmIChrID4gc2l6ZW9mIGJ1ZikKKwkJCXsKKwkJCS8qIGJ1ZzogJ2J1ZicgaXMgdG9vIHNtYWxsIGZvciB0aGlzIGNpcGhlcnN1aXRlICovCisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRU5FUkFURV9LRVlfQkxPQ0ssIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiAwOworCQkJfQorCQkKKwkJZm9yIChqPTA7IGo8azsgaisrKQorCQkJYnVmW2pdPWM7CisJCWMrKzsKKwkJRVZQX0RpZ2VzdEluaXRfZXgoJnMxLEVWUF9zaGExKCksIE5VTEwpOworCQlFVlBfRGlnZXN0VXBkYXRlKCZzMSxidWYsayk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJnMxLHMtPnNlc3Npb24tPm1hc3Rlcl9rZXksCisJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJnMxLHMtPnMzLT5zZXJ2ZXJfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUpOworCQlFVlBfRGlnZXN0VXBkYXRlKCZzMSxzLT5zMy0+Y2xpZW50X3JhbmRvbSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJRVZQX0RpZ2VzdEZpbmFsX2V4KCZzMSxzbWQsTlVMTCk7CisKKwkJRVZQX0RpZ2VzdEluaXRfZXgoJm01LEVWUF9tZDUoKSwgTlVMTCk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJm01LHMtPnNlc3Npb24tPm1hc3Rlcl9rZXksCisJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJm01LHNtZCxTSEFfRElHRVNUX0xFTkdUSCk7CisJCWlmICgoaW50KShpK01ENV9ESUdFU1RfTEVOR1RIKSA+IG51bSkKKwkJCXsKKwkJCUVWUF9EaWdlc3RGaW5hbF9leCgmbTUsc21kLE5VTEwpOworCQkJbWVtY3B5KGttLHNtZCwobnVtLWkpKTsKKwkJCX0KKwkJZWxzZQorCQkJRVZQX0RpZ2VzdEZpbmFsX2V4KCZtNSxrbSxOVUxMKTsKKworCQlrbSs9TUQ1X0RJR0VTVF9MRU5HVEg7CisJCX0KKwlPUEVOU1NMX2NsZWFuc2Uoc21kLFNIQV9ESUdFU1RfTEVOR1RIKTsKKwlFVlBfTURfQ1RYX2NsZWFudXAoJm01KTsKKwlFVlBfTURfQ1RYX2NsZWFudXAoJnMxKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBzc2wzX2NoYW5nZV9jaXBoZXJfc3RhdGUoU1NMICpzLCBpbnQgd2hpY2gpCisJeworCXVuc2lnbmVkIGNoYXIgKnAsKmtleV9ibG9jaywqbWFjX3NlY3JldDsKKwl1bnNpZ25lZCBjaGFyIGV4cF9rZXlbRVZQX01BWF9LRVlfTEVOR1RIXTsKKwl1bnNpZ25lZCBjaGFyIGV4cF9pdltFVlBfTUFYX0lWX0xFTkdUSF07CisJdW5zaWduZWQgY2hhciAqbXMsKmtleSwqaXYsKmVyMSwqZXIyOworCUVWUF9DSVBIRVJfQ1RYICpkZDsKKwljb25zdCBFVlBfQ0lQSEVSICpjOworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwlDT01QX01FVEhPRCAqY29tcDsKKyNlbmRpZgorCWNvbnN0IEVWUF9NRCAqbTsKKwlFVlBfTURfQ1RYIG1kOworCWludCBpc19leHAsbixpLGosayxjbDsKKwlpbnQgcmV1c2VfZGQgPSAwOworCisJaXNfZXhwPVNTTF9DX0lTX0VYUE9SVChzLT5zMy0+dG1wLm5ld19jaXBoZXIpOworCWM9cy0+czMtPnRtcC5uZXdfc3ltX2VuYzsKKwltPXMtPnMzLT50bXAubmV3X2hhc2g7CisJLyogbSA9PSBOVUxMIHdpbGwgbGVhZCB0byBhIGNyYXNoIGxhdGVyICovCisJT1BFTlNTTF9hc3NlcnQobSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCWlmIChzLT5zMy0+dG1wLm5ld19jb21wcmVzc2lvbiA9PSBOVUxMKQorCQljb21wPU5VTEw7CisJZWxzZQorCQljb21wPXMtPnMzLT50bXAubmV3X2NvbXByZXNzaW9uLT5tZXRob2Q7CisjZW5kaWYKKwlrZXlfYmxvY2s9cy0+czMtPnRtcC5rZXlfYmxvY2s7CisKKwlpZiAod2hpY2ggJiBTU0wzX0NDX1JFQUQpCisJCXsKKwkJaWYgKHMtPmVuY19yZWFkX2N0eCAhPSBOVUxMKQorCQkJcmV1c2VfZGQgPSAxOworCQllbHNlIGlmICgocy0+ZW5jX3JlYWRfY3R4PU9QRU5TU0xfbWFsbG9jKHNpemVvZihFVlBfQ0lQSEVSX0NUWCkpKSA9PSBOVUxMKQorCQkJZ290byBlcnI7CisJCWVsc2UKKwkJCS8qIG1ha2Ugc3VyZSBpdCdzIGludGlhbGl6ZWQgaW4gY2FzZSB3ZSBleGl0IGxhdGVyIHdpdGggYW4gZXJyb3IgKi8KKwkJCUVWUF9DSVBIRVJfQ1RYX2luaXQocy0+ZW5jX3JlYWRfY3R4KTsKKwkJZGQ9IHMtPmVuY19yZWFkX2N0eDsKKworCQlzc2xfcmVwbGFjZV9oYXNoKCZzLT5yZWFkX2hhc2gsbSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCQkvKiBDT01QUkVTUyAqLworCQlpZiAocy0+ZXhwYW5kICE9IE5VTEwpCisJCQl7CisJCQlDT01QX0NUWF9mcmVlKHMtPmV4cGFuZCk7CisJCQlzLT5leHBhbmQ9TlVMTDsKKwkJCX0KKwkJaWYgKGNvbXAgIT0gTlVMTCkKKwkJCXsKKwkJCXMtPmV4cGFuZD1DT01QX0NUWF9uZXcoY29tcCk7CisJCQlpZiAocy0+ZXhwYW5kID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0NIQU5HRV9DSVBIRVJfU1RBVEUsU1NMX1JfQ09NUFJFU1NJT05fTElCUkFSWV9FUlJPUik7CisJCQkJZ290byBlcnIyOworCQkJCX0KKwkJCWlmIChzLT5zMy0+cnJlYy5jb21wID09IE5VTEwpCisJCQkJcy0+czMtPnJyZWMuY29tcD0odW5zaWduZWQgY2hhciAqKQorCQkJCQlPUEVOU1NMX21hbGxvYyhTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpOworCQkJaWYgKHMtPnMzLT5ycmVjLmNvbXAgPT0gTlVMTCkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKyNlbmRpZgorCQltZW1zZXQoJihzLT5zMy0+cmVhZF9zZXF1ZW5jZVswXSksMCw4KTsKKwkJbWFjX3NlY3JldD0gJihzLT5zMy0+cmVhZF9tYWNfc2VjcmV0WzBdKTsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAocy0+ZW5jX3dyaXRlX2N0eCAhPSBOVUxMKQorCQkJcmV1c2VfZGQgPSAxOworCQllbHNlIGlmICgocy0+ZW5jX3dyaXRlX2N0eD1PUEVOU1NMX21hbGxvYyhzaXplb2YoRVZQX0NJUEhFUl9DVFgpKSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQllbHNlCisJCQkvKiBtYWtlIHN1cmUgaXQncyBpbnRpYWxpemVkIGluIGNhc2Ugd2UgZXhpdCBsYXRlciB3aXRoIGFuIGVycm9yICovCisJCQlFVlBfQ0lQSEVSX0NUWF9pbml0KHMtPmVuY193cml0ZV9jdHgpOworCQlkZD0gcy0+ZW5jX3dyaXRlX2N0eDsKKwkJc3NsX3JlcGxhY2VfaGFzaCgmcy0+d3JpdGVfaGFzaCxtKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJCS8qIENPTVBSRVNTICovCisJCWlmIChzLT5jb21wcmVzcyAhPSBOVUxMKQorCQkJeworCQkJQ09NUF9DVFhfZnJlZShzLT5jb21wcmVzcyk7CisJCQlzLT5jb21wcmVzcz1OVUxMOworCQkJfQorCQlpZiAoY29tcCAhPSBOVUxMKQorCQkJeworCQkJcy0+Y29tcHJlc3M9Q09NUF9DVFhfbmV3KGNvbXApOworCQkJaWYgKHMtPmNvbXByZXNzID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0NIQU5HRV9DSVBIRVJfU1RBVEUsU1NMX1JfQ09NUFJFU1NJT05fTElCUkFSWV9FUlJPUik7CisJCQkJZ290byBlcnIyOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQltZW1zZXQoJihzLT5zMy0+d3JpdGVfc2VxdWVuY2VbMF0pLDAsOCk7CisJCW1hY19zZWNyZXQ9ICYocy0+czMtPndyaXRlX21hY19zZWNyZXRbMF0pOworCQl9CisKKwlpZiAocmV1c2VfZGQpCisJCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoZGQpOworCisJcD1zLT5zMy0+dG1wLmtleV9ibG9jazsKKwlpPUVWUF9NRF9zaXplKG0pOworCWlmIChpIDwgMCkKKwkJZ290byBlcnIyOworCWNsPUVWUF9DSVBIRVJfa2V5X2xlbmd0aChjKTsKKwlqPWlzX2V4cCA/IChjbCA8IFNTTF9DX0VYUE9SVF9LRVlMRU5HVEgocy0+czMtPnRtcC5uZXdfY2lwaGVyKSA/CisJCSBjbCA6IFNTTF9DX0VYUE9SVF9LRVlMRU5HVEgocy0+czMtPnRtcC5uZXdfY2lwaGVyKSkgOiBjbDsKKwkvKiBXYXMgaj0oaXNfZXhwKT81OkVWUF9DSVBIRVJfa2V5X2xlbmd0aChjKTsgKi8KKwlrPUVWUF9DSVBIRVJfaXZfbGVuZ3RoKGMpOworCWlmICgJKHdoaWNoID09IFNTTDNfQ0hBTkdFX0NJUEhFUl9DTElFTlRfV1JJVEUpIHx8CisJCSh3aGljaCA9PSBTU0wzX0NIQU5HRV9DSVBIRVJfU0VSVkVSX1JFQUQpKQorCQl7CisJCW1zPSAgJihwWyAwXSk7IG49aStpOworCQlrZXk9ICYocFsgbl0pOyBuKz1qK2o7CisJCWl2PSAgJihwWyBuXSk7IG4rPWsrazsKKwkJZXIxPSAmKHMtPnMzLT5jbGllbnRfcmFuZG9tWzBdKTsKKwkJZXIyPSAmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKTsKKwkJfQorCWVsc2UKKwkJeworCQluPWk7CisJCW1zPSAgJihwWyBuXSk7IG4rPWkrajsKKwkJa2V5PSAmKHBbIG5dKTsgbis9aitrOworCQlpdj0gICYocFsgbl0pOyBuKz1rOworCQllcjE9ICYocy0+czMtPnNlcnZlcl9yYW5kb21bMF0pOworCQllcjI9ICYocy0+czMtPmNsaWVudF9yYW5kb21bMF0pOworCQl9CisKKwlpZiAobiA+IHMtPnMzLT50bXAua2V5X2Jsb2NrX2xlbmd0aCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19DSEFOR0VfQ0lQSEVSX1NUQVRFLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJZ290byBlcnIyOworCQl9CisKKwlFVlBfTURfQ1RYX2luaXQoJm1kKTsKKwltZW1jcHkobWFjX3NlY3JldCxtcyxpKTsKKwlpZiAoaXNfZXhwKQorCQl7CisJCS8qIEluIGhlcmUgSSBzZXQgYm90aCB0aGUgcmVhZCBhbmQgd3JpdGUga2V5L2l2IHRvIHRoZQorCQkgKiBzYW1lIHZhbHVlIHNpbmNlIG9ubHkgdGhlIGNvcnJlY3Qgb25lIHdpbGwgYmUgdXNlZCA6LSkuCisJCSAqLworCQlFVlBfRGlnZXN0SW5pdF9leCgmbWQsRVZQX21kNSgpLCBOVUxMKTsKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsa2V5LGopOworCQlFVlBfRGlnZXN0VXBkYXRlKCZtZCxlcjEsU1NMM19SQU5ET01fU0laRSk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJm1kLGVyMixTU0wzX1JBTkRPTV9TSVpFKTsKKwkJRVZQX0RpZ2VzdEZpbmFsX2V4KCZtZCwmKGV4cF9rZXlbMF0pLE5VTEwpOworCQlrZXk9ICYoZXhwX2tleVswXSk7CisKKwkJaWYgKGsgPiAwKQorCQkJeworCQkJRVZQX0RpZ2VzdEluaXRfZXgoJm1kLEVWUF9tZDUoKSwgTlVMTCk7CisJCQlFVlBfRGlnZXN0VXBkYXRlKCZtZCxlcjEsU1NMM19SQU5ET01fU0laRSk7CisJCQlFVlBfRGlnZXN0VXBkYXRlKCZtZCxlcjIsU1NMM19SQU5ET01fU0laRSk7CisJCQlFVlBfRGlnZXN0RmluYWxfZXgoJm1kLCYoZXhwX2l2WzBdKSxOVUxMKTsKKwkJCWl2PSAmKGV4cF9pdlswXSk7CisJCQl9CisJCX0KKworCXMtPnNlc3Npb24tPmtleV9hcmdfbGVuZ3RoPTA7CisKKwlFVlBfQ2lwaGVySW5pdF9leChkZCxjLE5VTEwsa2V5LGl2LCh3aGljaCAmIFNTTDNfQ0NfV1JJVEUpKTsKKworCU9QRU5TU0xfY2xlYW5zZSgmKGV4cF9rZXlbMF0pLHNpemVvZihleHBfa2V5KSk7CisJT1BFTlNTTF9jbGVhbnNlKCYoZXhwX2l2WzBdKSxzaXplb2YoZXhwX2l2KSk7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZtZCk7CisJcmV0dXJuKDEpOworZXJyOgorCVNTTGVycihTU0xfRl9TU0wzX0NIQU5HRV9DSVBIRVJfU1RBVEUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworZXJyMjoKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgc3NsM19zZXR1cF9rZXlfYmxvY2soU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCWNvbnN0IEVWUF9DSVBIRVIgKmM7CisJY29uc3QgRVZQX01EICpoYXNoOworCWludCBudW07CisJaW50IHJldCA9IDA7CisJU1NMX0NPTVAgKmNvbXA7CisKKwlpZiAocy0+czMtPnRtcC5rZXlfYmxvY2tfbGVuZ3RoICE9IDApCisJCXJldHVybigxKTsKKworCWlmICghc3NsX2NpcGhlcl9nZXRfZXZwKHMtPnNlc3Npb24sJmMsJmhhc2gsTlVMTCxOVUxMLCZjb21wKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19TRVRVUF9LRVlfQkxPQ0ssU1NMX1JfQ0lQSEVSX09SX0hBU0hfVU5BVkFJTEFCTEUpOworCQlyZXR1cm4oMCk7CisJCX0KKworCXMtPnMzLT50bXAubmV3X3N5bV9lbmM9YzsKKwlzLT5zMy0+dG1wLm5ld19oYXNoPWhhc2g7CisjaWZkZWYgT1BFTlNTTF9OT19DT01QCisJcy0+czMtPnRtcC5uZXdfY29tcHJlc3Npb249TlVMTDsKKyNlbHNlCisJcy0+czMtPnRtcC5uZXdfY29tcHJlc3Npb249Y29tcDsKKyNlbmRpZgorCisJbnVtPUVWUF9NRF9zaXplKGhhc2gpOworCWlmIChudW0gPCAwKQorCQlyZXR1cm4gMDsKKworCW51bT1FVlBfQ0lQSEVSX2tleV9sZW5ndGgoYykrbnVtK0VWUF9DSVBIRVJfaXZfbGVuZ3RoKGMpOworCW51bSo9MjsKKworCXNzbDNfY2xlYW51cF9rZXlfYmxvY2socyk7CisKKwlpZiAoKHA9T1BFTlNTTF9tYWxsb2MobnVtKSkgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlzLT5zMy0+dG1wLmtleV9ibG9ja19sZW5ndGg9bnVtOworCXMtPnMzLT50bXAua2V5X2Jsb2NrPXA7CisKKwlyZXQgPSBzc2wzX2dlbmVyYXRlX2tleV9ibG9jayhzLHAsbnVtKTsKKworCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTKSkKKwkJeworCQkvKiBlbmFibGUgdnVsbmVyYWJpbGl0eSBjb3VudGVybWVhc3VyZSBmb3IgQ0JDIGNpcGhlcnMgd2l0aAorCQkgKiBrbm93bi1JViBwcm9ibGVtIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35ib2RvL3Rscy1jYmMudHh0KQorCQkgKi8KKwkJcy0+czMtPm5lZWRfZW1wdHlfZnJhZ21lbnRzID0gMTsKKworCQlpZiAocy0+c2Vzc2lvbi0+Y2lwaGVyICE9IE5VTEwpCisJCQl7CisJCQlpZiAocy0+c2Vzc2lvbi0+Y2lwaGVyLT5hbGdvcml0aG1fZW5jID09IFNTTF9lTlVMTCkKKwkJCQlzLT5zMy0+bmVlZF9lbXB0eV9mcmFnbWVudHMgPSAwOworCQkJCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM0CisJCQlpZiAocy0+c2Vzc2lvbi0+Y2lwaGVyLT5hbGdvcml0aG1fZW5jID09IFNTTF9SQzQpCisJCQkJcy0+czMtPm5lZWRfZW1wdHlfZnJhZ21lbnRzID0gMDsKKyNlbmRpZgorCQkJfQorCQl9CisKKwlyZXR1cm4gcmV0OworCQkKK2VycjoKKwlTU0xlcnIoU1NMX0ZfU1NMM19TRVRVUF9LRVlfQkxPQ0ssRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCXJldHVybigwKTsKKwl9CisKK3ZvaWQgc3NsM19jbGVhbnVwX2tleV9ibG9jayhTU0wgKnMpCisJeworCWlmIChzLT5zMy0+dG1wLmtleV9ibG9jayAhPSBOVUxMKQorCQl7CisJCU9QRU5TU0xfY2xlYW5zZShzLT5zMy0+dG1wLmtleV9ibG9jaywKKwkJCXMtPnMzLT50bXAua2V5X2Jsb2NrX2xlbmd0aCk7CisJCU9QRU5TU0xfZnJlZShzLT5zMy0+dG1wLmtleV9ibG9jayk7CisJCXMtPnMzLT50bXAua2V5X2Jsb2NrPU5VTEw7CisJCX0KKwlzLT5zMy0+dG1wLmtleV9ibG9ja19sZW5ndGg9MDsKKwl9CisKK2ludCBzc2wzX2VuYyhTU0wgKnMsIGludCBzZW5kKQorCXsKKwlTU0wzX1JFQ09SRCAqcmVjOworCUVWUF9DSVBIRVJfQ1RYICpkczsKKwl1bnNpZ25lZCBsb25nIGw7CisJaW50IGJzLGk7CisJY29uc3QgRVZQX0NJUEhFUiAqZW5jOworCisJaWYgKHNlbmQpCisJCXsKKwkJZHM9cy0+ZW5jX3dyaXRlX2N0eDsKKwkJcmVjPSAmKHMtPnMzLT53cmVjKTsKKwkJaWYgKHMtPmVuY193cml0ZV9jdHggPT0gTlVMTCkKKwkJCWVuYz1OVUxMOworCQllbHNlCisJCQllbmM9RVZQX0NJUEhFUl9DVFhfY2lwaGVyKHMtPmVuY193cml0ZV9jdHgpOworCQl9CisJZWxzZQorCQl7CisJCWRzPXMtPmVuY19yZWFkX2N0eDsKKwkJcmVjPSAmKHMtPnMzLT5ycmVjKTsKKwkJaWYgKHMtPmVuY19yZWFkX2N0eCA9PSBOVUxMKQorCQkJZW5jPU5VTEw7CisJCWVsc2UKKwkJCWVuYz1FVlBfQ0lQSEVSX0NUWF9jaXBoZXIocy0+ZW5jX3JlYWRfY3R4KTsKKwkJfQorCisJaWYgKChzLT5zZXNzaW9uID09IE5VTEwpIHx8IChkcyA9PSBOVUxMKSB8fAorCQkoZW5jID09IE5VTEwpKQorCQl7CisJCW1lbW1vdmUocmVjLT5kYXRhLHJlYy0+aW5wdXQscmVjLT5sZW5ndGgpOworCQlyZWMtPmlucHV0PXJlYy0+ZGF0YTsKKwkJfQorCWVsc2UKKwkJeworCQlsPXJlYy0+bGVuZ3RoOworCQlicz1FVlBfQ0lQSEVSX2Jsb2NrX3NpemUoZHMtPmNpcGhlcik7CisKKwkJLyogQ09NUFJFU1MgKi8KKworCQlpZiAoKGJzICE9IDEpICYmIHNlbmQpCisJCQl7CisJCQlpPWJzLSgoaW50KWwlYnMpOworCisJCQkvKiB3ZSBuZWVkIHRvIGFkZCAnaS0xJyBwYWRkaW5nIGJ5dGVzICovCisJCQlsKz1pOworCQkJcmVjLT5sZW5ndGgrPWk7CisJCQlyZWMtPmlucHV0W2wtMV09KGktMSk7CisJCQl9CisJCQorCQlpZiAoIXNlbmQpCisJCQl7CisJCQlpZiAobCA9PSAwIHx8IGwlYnMgIT0gMCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfRU5DLFNTTF9SX0JMT0NLX0NJUEhFUl9QQURfSVNfV1JPTkcpOworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0RFQ1JZUFRJT05fRkFJTEVEKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkvKiBvdGhlcndpc2UsIHJlYy0+bGVuZ3RoID49IGJzICovCisJCQl9CisJCQorCQlFVlBfQ2lwaGVyKGRzLHJlYy0+ZGF0YSxyZWMtPmlucHV0LGwpOworCisJCWlmICgoYnMgIT0gMSkgJiYgIXNlbmQpCisJCQl7CisJCQlpPXJlYy0+ZGF0YVtsLTFdKzE7CisJCQkvKiBTU0wgMy4wIGJvdW5kcyB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgYnkgdGhlIGJsb2NrIHNpemU7CisJCQkgKiBwYWRkaW5nIGJ5dGVzIChleGNlcHQgdGhlIGxhc3Qgb25lKSBhcmUgYXJiaXRyYXJ5ICovCisJCQlpZiAoaSA+IGJzKQorCQkJCXsKKwkJCQkvKiBJbmNvcnJlY3QgcGFkZGluZy4gU1NMZXJyKCkgYW5kIHNzbDNfYWxlcnQgYXJlIGRvbmUKKwkJCQkgKiBieSBjYWxsZXI6IHdlIGRvbid0IHdhbnQgdG8gcmV2ZWFsIHdoZXRoZXIgdGhpcyBpcworCQkJCSAqIGEgZGVjcnlwdGlvbiBlcnJvciBvciBhIE1BQyB2ZXJpZmljYXRpb24gZmFpbHVyZQorCQkJCSAqIChzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+Ym9kby90bHMtY2JjLnR4dCkgKi8KKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJLyogbm93IGkgPD0gYnMgPD0gcmVjLT5sZW5ndGggKi8KKwkJCXJlYy0+bGVuZ3RoLT1pOworCQkJfQorCQl9CisJcmV0dXJuKDEpOworCX0KKwordm9pZCBzc2wzX2luaXRfZmluaXNoZWRfbWFjKFNTTCAqcykKKwl7CisJaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyKSBCSU9fZnJlZShzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlcik7CisJaWYgKHMtPnMzLT5oYW5kc2hha2VfZGdzdCkgc3NsM19mcmVlX2RpZ2VzdF9saXN0KHMpOworICAgIHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyPUJJT19uZXcoQklPX3NfbWVtKCkpOwkKKwkodm9pZClCSU9fc2V0X2Nsb3NlKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyLEJJT19DTE9TRSk7CisJfQorCit2b2lkIHNzbDNfZnJlZV9kaWdlc3RfbGlzdChTU0wgKnMpIAorCXsKKwlpbnQgaTsKKwlpZiAoIXMtPnMzLT5oYW5kc2hha2VfZGdzdCkgcmV0dXJuOworCWZvciAoaT0wO2k8U1NMX01BWF9ESUdFU1Q7aSsrKSAKKwkJeworCQlpZiAocy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldKQorCQkJRVZQX01EX0NUWF9kZXN0cm95KHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSk7CisJCX0KKwlPUEVOU1NMX2ZyZWUocy0+czMtPmhhbmRzaGFrZV9kZ3N0KTsKKwlzLT5zMy0+aGFuZHNoYWtlX2Rnc3Q9TlVMTDsKKwl9CQorCQkKKworCit2b2lkIHNzbDNfZmluaXNoX21hYyhTU0wgKnMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKKwl7CisJaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyKSAKKwkJeworCQlCSU9fd3JpdGUgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyLCh2b2lkICopYnVmLGxlbik7CisJCX0gCisJZWxzZSAKKwkJeworCQlpbnQgaTsKKwkJZm9yIChpPTA7aTwgU1NMX01BWF9ESUdFU1Q7aSsrKSAKKwkJCXsKKwkJCWlmIChzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0hPSBOVUxMKQorCQkJRVZQX0RpZ2VzdFVwZGF0ZShzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0sYnVmLGxlbik7CisJCQl9CisJCX0JCisJfQorCitpbnQgc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMoU1NMICpzKQorCXsKKwlpbnQgaTsKKwlsb25nIG1hc2s7CisJY29uc3QgRVZQX01EICptZDsKKwlsb25nIGhkYXRhbGVuOworCXZvaWQgKmhkYXRhOworCisJLyogQWxsb2NhdGUgaGFuZHNoYWtlX2Rnc3QgYXJyYXkgKi8KKwlzc2wzX2ZyZWVfZGlnZXN0X2xpc3Qocyk7CisJcy0+czMtPmhhbmRzaGFrZV9kZ3N0ID0gT1BFTlNTTF9tYWxsb2MoU1NMX01BWF9ESUdFU1QgKiBzaXplb2YoRVZQX01EX0NUWCAqKSk7CisJbWVtc2V0KHMtPnMzLT5oYW5kc2hha2VfZGdzdCwwLFNTTF9NQVhfRElHRVNUICpzaXplb2YoRVZQX01EX0NUWCAqKSk7CisJaGRhdGFsZW4gPSBCSU9fZ2V0X21lbV9kYXRhKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyLCZoZGF0YSk7CisJaWYgKGhkYXRhbGVuIDw9IDApCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfRElHRVNUX0NBQ0hFRF9SRUNPUkRTLCBTU0xfUl9CQURfSEFORFNIQUtFX0xFTkdUSCk7CisJCXJldHVybiAwOworCQl9CisKKwkvKiBMb29wIHRocm91Z2ggYml0c28gb2YgYWxnb3JpdGhtMiBmaWVsZCBhbmQgY3JlYXRlIE1EX0NUWC1lcyAqLworCWZvciAoaT0wO3NzbF9nZXRfaGFuZHNoYWtlX2RpZ2VzdChpLCZtYXNrLCZtZCk7IGkrKykgCisJCXsKKwkJaWYgKChtYXNrICYgcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG0yKSAmJiBtZCkgCisJCQl7CisJCQlzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV09RVZQX01EX0NUWF9jcmVhdGUoKTsKKwkJCUVWUF9EaWdlc3RJbml0X2V4KHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSxtZCxOVUxMKTsKKwkJCUVWUF9EaWdlc3RVcGRhdGUocy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldLGhkYXRhLGhkYXRhbGVuKTsKKwkJCX0gCisJCWVsc2UgCisJCQl7CQorCQkJcy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldPU5VTEw7CisJCQl9CisJCX0KKwkvKiBGcmVlIGhhbmRzaGFrZV9idWZmZXIgQklPICovCisJQklPX2ZyZWUocy0+czMtPmhhbmRzaGFrZV9idWZmZXIpOworCXMtPnMzLT5oYW5kc2hha2VfYnVmZmVyID0gTlVMTDsKKworCXJldHVybiAxOworCX0KKworaW50IHNzbDNfY2VydF92ZXJpZnlfbWFjKFNTTCAqcywgaW50IG1kX25pZCwgdW5zaWduZWQgY2hhciAqcCkKKwl7CisJcmV0dXJuKHNzbDNfaGFuZHNoYWtlX21hYyhzLG1kX25pZCxOVUxMLDAscCkpOworCX0KK2ludCBzc2wzX2ZpbmFsX2ZpbmlzaF9tYWMoU1NMICpzLCAKKwkgICAgIGNvbnN0IGNoYXIgKnNlbmRlciwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqcCkKKwl7CisJaW50IHJldDsKKwlyZXQ9c3NsM19oYW5kc2hha2VfbWFjKHMsTklEX21kNSxzZW5kZXIsbGVuLHApOworCXArPXJldDsKKwlyZXQrPXNzbDNfaGFuZHNoYWtlX21hYyhzLE5JRF9zaGExLHNlbmRlcixsZW4scCk7CisJcmV0dXJuKHJldCk7CisJfQorc3RhdGljIGludCBzc2wzX2hhbmRzaGFrZV9tYWMoU1NMICpzLCBpbnQgbWRfbmlkLAorCSAgICAgY29uc3QgY2hhciAqc2VuZGVyLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpwKQorCXsKKwl1bnNpZ25lZCBpbnQgcmV0OworCWludCBucGFkLG47CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgY2hhciBtZF9idWZbRVZQX01BWF9NRF9TSVpFXTsKKwlFVlBfTURfQ1RYIGN0eCwqZD1OVUxMOworCisJaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyKSAKKwkJaWYgKCFzc2wzX2RpZ2VzdF9jYWNoZWRfcmVjb3JkcyhzKSkKKwkJCXJldHVybiAwOworCisJLyogU2VhcmNoIGZvciBkaWdlc3Qgb2Ygc3BlY2lmaWVkIHR5cGUgaW4gdGhlIGhhbmRzaGFrZV9kZ3N0CisJICogYXJyYXkqLworCWZvciAoaT0wO2k8U1NMX01BWF9ESUdFU1Q7aSsrKSAKKwkJeworCQkgIGlmIChzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0mJkVWUF9NRF9DVFhfdHlwZShzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV0pPT1tZF9uaWQpIAorCQkgIAl7CisJCSAgCWQ9cy0+czMtPmhhbmRzaGFrZV9kZ3N0W2ldOworCQkJYnJlYWs7CisJCQl9CisJCX0KKwlpZiAoIWQpIHsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfSEFORFNIQUtFX01BQyxTU0xfUl9OT19SRVFVSVJFRF9ESUdFU1QpOworCQlyZXR1cm4gMDsKKwl9CQorCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKwlFVlBfTURfQ1RYX2NvcHlfZXgoJmN0eCxkKTsKKwluPUVWUF9NRF9DVFhfc2l6ZSgmY3R4KTsKKwlpZiAobiA8IDApCisJCXJldHVybiAwOworCisJbnBhZD0oNDgvbikqbjsKKwlpZiAoc2VuZGVyICE9IE5VTEwpCisJCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCxzZW5kZXIsbGVuKTsKKwlFVlBfRGlnZXN0VXBkYXRlKCZjdHgscy0+c2Vzc2lvbi0+bWFzdGVyX2tleSwKKwkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGgpOworCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCxzc2wzX3BhZF8xLG5wYWQpOworCUVWUF9EaWdlc3RGaW5hbF9leCgmY3R4LG1kX2J1ZiwmaSk7CisKKwlFVlBfRGlnZXN0SW5pdF9leCgmY3R4LEVWUF9NRF9DVFhfbWQoJmN0eCksIE5VTEwpOworCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCxzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LAorCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LHNzbDNfcGFkXzIsbnBhZCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LG1kX2J1ZixpKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgoJmN0eCxwLCZyZXQpOworCisJRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOworCisJcmV0dXJuKChpbnQpcmV0KTsKKwl9CisKK2ludCBuX3NzbDNfbWFjKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICptZCwgaW50IHNlbmQpCisJeworCVNTTDNfUkVDT1JEICpyZWM7CisJdW5zaWduZWQgY2hhciAqbWFjX3NlYywqc2VxOworCUVWUF9NRF9DVFggbWRfY3R4OworCWNvbnN0IEVWUF9NRF9DVFggKmhhc2g7CisJdW5zaWduZWQgY2hhciAqcCxyZWNfY2hhcjsKKwl1bnNpZ25lZCBpbnQgbWRfc2l6ZTsKKwlpbnQgbnBhZDsKKwlpbnQgdDsKKworCWlmIChzZW5kKQorCQl7CisJCXJlYz0gJihzc2wtPnMzLT53cmVjKTsKKwkJbWFjX3NlYz0gJihzc2wtPnMzLT53cml0ZV9tYWNfc2VjcmV0WzBdKTsKKwkJc2VxPSAmKHNzbC0+czMtPndyaXRlX3NlcXVlbmNlWzBdKTsKKwkJaGFzaD1zc2wtPndyaXRlX2hhc2g7CisJCX0KKwllbHNlCisJCXsKKwkJcmVjPSAmKHNzbC0+czMtPnJyZWMpOworCQltYWNfc2VjPSAmKHNzbC0+czMtPnJlYWRfbWFjX3NlY3JldFswXSk7CisJCXNlcT0gJihzc2wtPnMzLT5yZWFkX3NlcXVlbmNlWzBdKTsKKwkJaGFzaD1zc2wtPnJlYWRfaGFzaDsKKwkJfQorCisJdD1FVlBfTURfQ1RYX3NpemUoaGFzaCk7CisJaWYgKHQgPCAwKQorCQlyZXR1cm4gLTE7CisJbWRfc2l6ZT10OworCW5wYWQ9KDQ4L21kX3NpemUpKm1kX3NpemU7CisKKwkvKiBDaG9wIHRoZSBkaWdlc3Qgb2ZmIHRoZSBlbmQgOi0pICovCisJRVZQX01EX0NUWF9pbml0KCZtZF9jdHgpOworCisJRVZQX01EX0NUWF9jb3B5X2V4KCAmbWRfY3R4LGhhc2gpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCxtYWNfc2VjLG1kX3NpemUpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCxzc2wzX3BhZF8xLG5wYWQpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCxzZXEsOCk7CisJcmVjX2NoYXI9cmVjLT50eXBlOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwmcmVjX2NoYXIsMSk7CisJcD1tZDsKKwlzMm4ocmVjLT5sZW5ndGgscCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LG1kLDIpOworCUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCxyZWMtPmlucHV0LHJlYy0+bGVuZ3RoKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgoICZtZF9jdHgsbWQsTlVMTCk7CisKKwlFVlBfTURfQ1RYX2NvcHlfZXgoICZtZF9jdHgsaGFzaCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LG1hY19zZWMsbWRfc2l6ZSk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LHNzbDNfcGFkXzIsbnBhZCk7CisJRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LG1kLG1kX3NpemUpOworCUVWUF9EaWdlc3RGaW5hbF9leCggJm1kX2N0eCxtZCwmbWRfc2l6ZSk7CisKKwlFVlBfTURfQ1RYX2NsZWFudXAoJm1kX2N0eCk7CisKKwlzc2wzX3JlY29yZF9zZXF1ZW5jZV91cGRhdGUoc2VxKTsKKwlyZXR1cm4obWRfc2l6ZSk7CisJfQorCit2b2lkIHNzbDNfcmVjb3JkX3NlcXVlbmNlX3VwZGF0ZSh1bnNpZ25lZCBjaGFyICpzZXEpCisJeworCWludCBpOworCisJZm9yIChpPTc7IGk+PTA7IGktLSkKKwkJeworCQkrK3NlcVtpXTsKKwkJaWYgKHNlcVtpXSAhPSAwKSBicmVhazsgCisJCX0KKwl9CisKK2ludCBzc2wzX2dlbmVyYXRlX21hc3Rlcl9zZWNyZXQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKnAsCisJICAgICBpbnQgbGVuKQorCXsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdFszXT17CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCShjb25zdCB1bnNpZ25lZCBjaGFyICopIkEiLAorCQkoY29uc3QgdW5zaWduZWQgY2hhciAqKSJCQiIsCisJCShjb25zdCB1bnNpZ25lZCBjaGFyICopIkNDQyIsCisjZWxzZQorCQkoY29uc3QgdW5zaWduZWQgY2hhciAqKSJceDQxIiwKKwkJKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikiXHg0Mlx4NDIiLAorCQkoY29uc3QgdW5zaWduZWQgY2hhciAqKSJceDQzXHg0M1x4NDMiLAorI2VuZGlmCisJCX07CisJdW5zaWduZWQgY2hhciBidWZbRVZQX01BWF9NRF9TSVpFXTsKKwlFVlBfTURfQ1RYIGN0eDsKKwlpbnQgaSxyZXQ9MDsKKwl1bnNpZ25lZCBpbnQgbjsKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKwlmb3IgKGk9MDsgaTwzOyBpKyspCisJCXsKKwkJRVZQX0RpZ2VzdEluaXRfZXgoJmN0eCxzLT5jdHgtPnNoYTEsIE5VTEwpOworCQlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsc2FsdFtpXSxzdHJsZW4oKGNvbnN0IGNoYXIgKilzYWx0W2ldKSk7CisJCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCxwLGxlbik7CisJCUVWUF9EaWdlc3RVcGRhdGUoJmN0eCwmKHMtPnMzLT5jbGllbnRfcmFuZG9tWzBdKSwKKwkJCVNTTDNfUkFORE9NX1NJWkUpOworCQlFVlBfRGlnZXN0VXBkYXRlKCZjdHgsJihzLT5zMy0+c2VydmVyX3JhbmRvbVswXSksCisJCQlTU0wzX1JBTkRPTV9TSVpFKTsKKwkJRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsYnVmLCZuKTsKKworCQlFVlBfRGlnZXN0SW5pdF9leCgmY3R4LHMtPmN0eC0+bWQ1LCBOVUxMKTsKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LHAsbGVuKTsKKwkJRVZQX0RpZ2VzdFVwZGF0ZSgmY3R4LGJ1ZixuKTsKKwkJRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgsb3V0LCZuKTsKKwkJb3V0Kz1uOworCQlyZXQrPW47CisJCX0KKwlFVlBfTURfQ1RYX2NsZWFudXAoJmN0eCk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgc3NsM19hbGVydF9jb2RlKGludCBjb2RlKQorCXsKKwlzd2l0Y2ggKGNvZGUpCisJCXsKKwljYXNlIFNTTF9BRF9DTE9TRV9OT1RJRlk6CXJldHVybihTU0wzX0FEX0NMT1NFX05PVElGWSk7CisJY2FzZSBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOglyZXR1cm4oU1NMM19BRF9VTkVYUEVDVEVEX01FU1NBR0UpOworCWNhc2UgU1NMX0FEX0JBRF9SRUNPUkRfTUFDOglyZXR1cm4oU1NMM19BRF9CQURfUkVDT1JEX01BQyk7CisJY2FzZSBTU0xfQURfREVDUllQVElPTl9GQUlMRUQ6CXJldHVybihTU0wzX0FEX0JBRF9SRUNPUkRfTUFDKTsKKwljYXNlIFNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c6CXJldHVybihTU0wzX0FEX0JBRF9SRUNPUkRfTUFDKTsKKwljYXNlIFNTTF9BRF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkU6cmV0dXJuKFNTTDNfQURfREVDT01QUkVTU0lPTl9GQUlMVVJFKTsKKwljYXNlIFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRToJcmV0dXJuKFNTTDNfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCWNhc2UgU1NMX0FEX05PX0NFUlRJRklDQVRFOglyZXR1cm4oU1NMM19BRF9OT19DRVJUSUZJQ0FURSk7CisJY2FzZSBTU0xfQURfQkFEX0NFUlRJRklDQVRFOglyZXR1cm4oU1NMM19BRF9CQURfQ0VSVElGSUNBVEUpOworCWNhc2UgU1NMX0FEX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFOnJldHVybihTU0wzX0FEX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFKTsKKwljYXNlIFNTTF9BRF9DRVJUSUZJQ0FURV9SRVZPS0VEOnJldHVybihTU0wzX0FEX0NFUlRJRklDQVRFX1JFVk9LRUQpOworCWNhc2UgU1NMX0FEX0NFUlRJRklDQVRFX0VYUElSRUQ6cmV0dXJuKFNTTDNfQURfQ0VSVElGSUNBVEVfRVhQSVJFRCk7CisJY2FzZSBTU0xfQURfQ0VSVElGSUNBVEVfVU5LTk9XTjpyZXR1cm4oU1NMM19BRF9DRVJUSUZJQ0FURV9VTktOT1dOKTsKKwljYXNlIFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjoJcmV0dXJuKFNTTDNfQURfSUxMRUdBTF9QQVJBTUVURVIpOworCWNhc2UgU1NMX0FEX1VOS05PV05fQ0E6CQlyZXR1cm4oU1NMM19BRF9CQURfQ0VSVElGSUNBVEUpOworCWNhc2UgU1NMX0FEX0FDQ0VTU19ERU5JRUQ6CXJldHVybihTU0wzX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwljYXNlIFNTTF9BRF9ERUNPREVfRVJST1I6CXJldHVybihTU0wzX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwljYXNlIFNTTF9BRF9ERUNSWVBUX0VSUk9SOglyZXR1cm4oU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJY2FzZSBTU0xfQURfRVhQT1JUX1JFU1RSSUNUSU9OOglyZXR1cm4oU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJY2FzZSBTU0xfQURfUFJPVE9DT0xfVkVSU0lPTjoJcmV0dXJuKFNTTDNfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCWNhc2UgU1NMX0FEX0lOU1VGRklDSUVOVF9TRUNVUklUWTpyZXR1cm4oU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJY2FzZSBTU0xfQURfSU5URVJOQUxfRVJST1I6CXJldHVybihTU0wzX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwljYXNlIFNTTF9BRF9VU0VSX0NBTkNFTExFRDoJcmV0dXJuKFNTTDNfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCWNhc2UgU1NMX0FEX05PX1JFTkVHT1RJQVRJT046CXJldHVybigtMSk7IC8qIERvbid0IHNlbmQgaXQgOi0pICovCisJY2FzZSBTU0xfQURfVU5TVVBQT1JURURfRVhURU5TSU9OOiByZXR1cm4oU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJY2FzZSBTU0xfQURfQ0VSVElGSUNBVEVfVU5PQlRBSU5BQkxFOiByZXR1cm4oU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJY2FzZSBTU0xfQURfVU5SRUNPR05JWkVEX05BTUU6CXJldHVybihTU0wzX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwljYXNlIFNTTF9BRF9CQURfQ0VSVElGSUNBVEVfU1RBVFVTX1JFU1BPTlNFOiByZXR1cm4oU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJY2FzZSBTU0xfQURfQkFEX0NFUlRJRklDQVRFX0hBU0hfVkFMVUU6IHJldHVybihTU0wzX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwljYXNlIFNTTF9BRF9VTktOT1dOX1BTS19JREVOVElUWTpyZXR1cm4oVExTMV9BRF9VTktOT1dOX1BTS19JREVOVElUWSk7CisJZGVmYXVsdDoJCQlyZXR1cm4oLTEpOworCQl9CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvczNfbGliLmMgYi9saWIvb3BlbnNzbC9zc2wvczNfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlZGJhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zM19saWIuYwpAQCAtMCwwICsxLDMzNDIgQEAKKy8qIHNzbC9zM19saWIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGFyZSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBFQ0MgY2lwaGVyIHN1aXRlIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKyAqIFZpcHVsIEd1cHRhIGFuZCBTdW1pdCBHdXB0YSBvZiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNSBOb2tpYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgcG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgaXMgZGV2ZWxvcGVkIGJ5CisgKiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiwgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mCisgKiBOb2tpYSBDb3Jwb3JhdGlvbiwgY29uc2lzdHMgb2YgdGhlICJQU0siIChQcmUtU2hhcmVkIEtleSkgY2lwaGVyc3VpdGVzCisgKiBzdXBwb3J0IChzZWUgUkZDIDQyNzkpIHRvIE9wZW5TU0wuCisgKgorICogTm8gcGF0ZW50IGxpY2Vuc2VzIG9yIG90aGVyIHJpZ2h0cyBleGNlcHQgdGhvc2UgZXhwcmVzc2x5IHN0YXRlZCBpbgorICogdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UgbGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgZ3JhbnRlZCBvciByZWNlaXZlZAorICogZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwsIG9yIG90aGVyd2lzZS4KKyAqCisgKiBObyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBOb2tpYSB0aGF0IHRoZSBDb250cmlidXRpb24gZG9lcyBub3QKKyAqIGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgdGhpcmQKKyAqIHBhcnR5IG9yIHRoYXQgdGhlIGxpY2Vuc2UgcHJvdmlkZXMgeW91IHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgcmlnaHRzCisgKiB0byBtYWtlIHVzZSBvZiB0aGUgQ29udHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQuIElOCisgKiBBRERJVElPTiBUTyBUSEUgRElTQ0xBSU1FUlMgSU5DTFVERUQgSU4gVEhFIExJQ0VOU0UsIE5PS0lBCisgKiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgRk9SIENMQUlNUyBCUk9VR0hUIEJZIFlPVSBPUiBBTlkKKyAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgorICogT1RIRVJXSVNFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisjaW5jbHVkZSAia3NzbF9sY2wuaCIKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworI2luY2x1ZGUgIi4uL2NyeXB0by9lYy9lY19sY2wuaCIKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCisjZW5kaWYgLyogT1BFTlNTTF9OT19UTFNFWFQgKi8KKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisKK2NvbnN0IGNoYXIgc3NsM192ZXJzaW9uX3N0cltdPSJTU0x2MyIgT1BFTlNTTF9WRVJTSU9OX1BURVhUOworCisjZGVmaW5lIFNTTDNfTlVNX0NJUEhFUlMJKHNpemVvZihzc2wzX2NpcGhlcnMpL3NpemVvZihTU0xfQ0lQSEVSKSkKKworLyogbGlzdCBvZiBhdmFpbGFibGUgU1NMdjMgY2lwaGVycyAoc29ydGVkIGJ5IGlkKSAqLworT1BFTlNTTF9HTE9CQUwgU1NMX0NJUEhFUiBzc2wzX2NpcGhlcnNbXT17CisKKy8qIFRoZSBSU0EgY2lwaGVycyAqLworLyogQ2lwaGVyIDAxICovCisJeworCTEsCisJU1NMM19UWFRfUlNBX05VTExfTUQ1LAorCVNTTDNfQ0tfUlNBX05VTExfTUQ1LAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9lTlVMTCwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfU1RST05HX05PTkUsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkwLAorCTAsCisJfSwKKworLyogQ2lwaGVyIDAyICovCisJeworCTEsCisJU1NMM19UWFRfUlNBX05VTExfU0hBLAorCVNTTDNfQ0tfUlNBX05VTExfU0hBLAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9lTlVMTCwKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX1NUUk9OR19OT05FfFNTTF9GSVBTLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMCwKKwkwLAorCX0sCisKKy8qIENpcGhlciAwMyAqLworCXsKKwkxLAorCVNTTDNfVFhUX1JTQV9SQzRfNDBfTUQ1LAorCVNTTDNfQ0tfUlNBX1JDNF80MF9NRDUsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX1JDNCwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMywKKwlTU0xfRVhQT1JUfFNTTF9FWFA0MCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTQwLAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMDQgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9SU0FfUkM0XzEyOF9NRDUsCisJU1NMM19DS19SU0FfUkM0XzEyOF9NRDUsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX1JDNCwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfTUVESVVNLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMDUgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9SU0FfUkM0XzEyOF9TSEEsCisJU1NMM19DS19SU0FfUkM0XzEyOF9TSEEsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX1JDNCwKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworLyogQ2lwaGVyIDA2ICovCisJeworCTEsCisJU1NMM19UWFRfUlNBX1JDMl80MF9NRDUsCisJU1NMM19DS19SU0FfUkMyXzQwX01ENSwKKwlTU0xfa1JTQSwKKwlTU0xfYVJTQSwKKwlTU0xfUkMyLAorCVNTTF9NRDUsCisJU1NMX1NTTFYzLAorCVNTTF9FWFBPUlR8U1NMX0VYUDQwLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNDAsCisJMTI4LAorCX0sCisKKy8qIENpcGhlciAwNyAqLworI2lmbmRlZiBPUEVOU1NMX05PX0lERUEKKwl7CisJMSwKKwlTU0wzX1RYVF9SU0FfSURFQV8xMjhfU0hBLAorCVNTTDNfQ0tfUlNBX0lERUFfMTI4X1NIQSwKKwlTU0xfa1JTQSwKKwlTU0xfYVJTQSwKKwlTU0xfSURFQSwKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKyNlbmRpZgorCisvKiBDaXBoZXIgMDggKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9SU0FfREVTXzQwX0NCQ19TSEEsCisJU1NMM19DS19SU0FfREVTXzQwX0NCQ19TSEEsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDAsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk0MCwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMDkgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9SU0FfREVTXzY0X0NCQ19TSEEsCisJU1NMM19DS19SU0FfREVTXzY0X0NCQ19TSEEsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX0xPVywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTU2LAorCTU2LAorCX0sCisKKy8qIENpcGhlciAwQSAqLworCXsKKwkxLAorCVNTTDNfVFhUX1JTQV9ERVNfMTkyX0NCQzNfU0hBLAorCVNTTDNfQ0tfUlNBX0RFU18xOTJfQ0JDM19TSEEsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMXzNERVMsCisJU1NMX1NIQTEsCisJU1NMX1NTTFYzLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdIfFNTTF9GSVBTLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTY4LAorCTE2OCwKKwl9LAorCisvKiBUaGUgREggY2lwaGVycyAqLworLyogQ2lwaGVyIDBCICovCisJeworCTAsCisJU1NMM19UWFRfREhfRFNTX0RFU180MF9DQkNfU0hBLAorCVNTTDNfQ0tfREhfRFNTX0RFU180MF9DQkNfU0hBLAorCVNTTF9rREhkLAorCVNTTF9hREgsCisJU1NMX0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDAsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk0MCwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMEMgKi8KKwl7CisJMCwgLyogbm90IGltcGxlbWVudGVkIChub24tZXBoZW1lcmFsIERIKSAqLworCVNTTDNfVFhUX0RIX0RTU19ERVNfNjRfQ0JDX1NIQSwKKwlTU0wzX0NLX0RIX0RTU19ERVNfNjRfQ0JDX1NIQSwKKwlTU0xfa0RIZCwKKwlTU0xfYURILAorCVNTTF9ERVMsCisJU1NMX1NIQTEsCisJU1NMX1NTTFYzLAorCVNTTF9OT1RfRVhQfFNTTF9MT1csCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk1NiwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMEQgKi8KKwl7CisJMCwgLyogbm90IGltcGxlbWVudGVkIChub24tZXBoZW1lcmFsIERIKSAqLworCVNTTDNfVFhUX0RIX0RTU19ERVNfMTkyX0NCQzNfU0hBLAorCVNTTDNfQ0tfREhfRFNTX0RFU18xOTJfQ0JDM19TSEEsCisJU1NMX2tESGQsCisJU1NMX2FESCwKKwlTU0xfM0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX0hJR0h8U1NMX0ZJUFMsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxNjgsCisJMTY4LAorCX0sCisKKy8qIENpcGhlciAwRSAqLworCXsKKwkwLCAvKiBub3QgaW1wbGVtZW50ZWQgKG5vbi1lcGhlbWVyYWwgREgpICovCisJU1NMM19UWFRfREhfUlNBX0RFU180MF9DQkNfU0hBLAorCVNTTDNfQ0tfREhfUlNBX0RFU180MF9DQkNfU0hBLAorCVNTTF9rREhyLAorCVNTTF9hREgsCisJU1NMX0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDAsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk0MCwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMEYgKi8KKwl7CisJMCwgLyogbm90IGltcGxlbWVudGVkIChub24tZXBoZW1lcmFsIERIKSAqLworCVNTTDNfVFhUX0RIX1JTQV9ERVNfNjRfQ0JDX1NIQSwKKwlTU0wzX0NLX0RIX1JTQV9ERVNfNjRfQ0JDX1NIQSwKKwlTU0xfa0RIciwKKwlTU0xfYURILAorCVNTTF9ERVMsCisJU1NMX1NIQTEsCisJU1NMX1NTTFYzLAorCVNTTF9OT1RfRVhQfFNTTF9MT1csCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk1NiwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMTAgKi8KKwl7CisJMCwgLyogbm90IGltcGxlbWVudGVkIChub24tZXBoZW1lcmFsIERIKSAqLworCVNTTDNfVFhUX0RIX1JTQV9ERVNfMTkyX0NCQzNfU0hBLAorCVNTTDNfQ0tfREhfUlNBX0RFU18xOTJfQ0JDM19TSEEsCisJU1NMX2tESHIsCisJU1NMX2FESCwKKwlTU0xfM0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX0hJR0h8U1NMX0ZJUFMsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxNjgsCisJMTY4LAorCX0sCisKKy8qIFRoZSBFcGhlbWVyYWwgREggY2lwaGVycyAqLworLyogQ2lwaGVyIDExICovCisJeworCTEsCisJU1NMM19UWFRfRURIX0RTU19ERVNfNDBfQ0JDX1NIQSwKKwlTU0wzX0NLX0VESF9EU1NfREVTXzQwX0NCQ19TSEEsCisJU1NMX2tFREgsCisJU1NMX2FEU1MsCisJU1NMX0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDAsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk0MCwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMTIgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9FREhfRFNTX0RFU182NF9DQkNfU0hBLAorCVNTTDNfQ0tfRURIX0RTU19ERVNfNjRfQ0JDX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYURTUywKKwlTU0xfREVTLAorCVNTTF9TSEExLAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfTE9XLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNTYsCisJNTYsCisJfSwKKworLyogQ2lwaGVyIDEzICovCisJeworCTEsCisJU1NMM19UWFRfRURIX0RTU19ERVNfMTkyX0NCQzNfU0hBLAorCVNTTDNfQ0tfRURIX0RTU19ERVNfMTkyX0NCQzNfU0hBLAorCVNTTF9rRURILAorCVNTTF9hRFNTLAorCVNTTF8zREVTLAorCVNTTF9TSEExLAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTE2OCwKKwkxNjgsCisJfSwKKworLyogQ2lwaGVyIDE0ICovCisJeworCTEsCisJU1NMM19UWFRfRURIX1JTQV9ERVNfNDBfQ0JDX1NIQSwKKwlTU0wzX0NLX0VESF9SU0FfREVTXzQwX0NCQ19TSEEsCisJU1NMX2tFREgsCisJU1NMX2FSU0EsCisJU1NMX0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDAsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk0MCwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMTUgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9FREhfUlNBX0RFU182NF9DQkNfU0hBLAorCVNTTDNfQ0tfRURIX1JTQV9ERVNfNjRfQ0JDX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYVJTQSwKKwlTU0xfREVTLAorCVNTTF9TSEExLAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfTE9XLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNTYsCisJNTYsCisJfSwKKworLyogQ2lwaGVyIDE2ICovCisJeworCTEsCisJU1NMM19UWFRfRURIX1JTQV9ERVNfMTkyX0NCQzNfU0hBLAorCVNTTDNfQ0tfRURIX1JTQV9ERVNfMTkyX0NCQzNfU0hBLAorCVNTTF9rRURILAorCVNTTF9hUlNBLAorCVNTTF8zREVTLAorCVNTTF9TSEExLAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTE2OCwKKwkxNjgsCisJfSwKKworLyogQ2lwaGVyIDE3ICovCisJeworCTEsCisJU1NMM19UWFRfQURIX1JDNF80MF9NRDUsCisJU1NMM19DS19BREhfUkM0XzQwX01ENSwKKwlTU0xfa0VESCwKKwlTU0xfYU5VTEwsCisJU1NMX1JDNCwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMywKKwlTU0xfRVhQT1JUfFNTTF9FWFA0MCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTQwLAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMTggKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9BREhfUkM0XzEyOF9NRDUsCisJU1NMM19DS19BREhfUkM0XzEyOF9NRDUsCisJU1NMX2tFREgsCisJU1NMX2FOVUxMLAorCVNTTF9SQzQsCisJU1NMX01ENSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworLyogQ2lwaGVyIDE5ICovCisJeworCTEsCisJU1NMM19UWFRfQURIX0RFU180MF9DQkNfU0hBLAorCVNTTDNfQ0tfQURIX0RFU180MF9DQkNfU0hBLAorCVNTTF9rRURILAorCVNTTF9hTlVMTCwKKwlTU0xfREVTLAorCVNTTF9TSEExLAorCVNTTF9TU0xWMywKKwlTU0xfRVhQT1JUfFNTTF9FWFA0MCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTQwLAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMUEgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9BREhfREVTXzY0X0NCQ19TSEEsCisJU1NMM19DS19BREhfREVTXzY0X0NCQ19TSEEsCisJU1NMX2tFREgsCisJU1NMX2FOVUxMLAorCVNTTF9ERVMsCisJU1NMX1NIQTEsCisJU1NMX1NTTFYzLAorCVNTTF9OT1RfRVhQfFNTTF9MT1csCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk1NiwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMUIgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9BREhfREVTXzE5Ml9DQkNfU0hBLAorCVNTTDNfQ0tfQURIX0RFU18xOTJfQ0JDX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYU5VTEwsCisJU1NMXzNERVMsCisJU1NMX1NIQTEsCisJU1NMX1NTTFYzLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdIfFNTTF9GSVBTLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTY4LAorCTE2OCwKKwl9LAorCisvKiBGb3J0ZXp6YSBjaXBoZXJzdWl0ZSBmcm9tIFNTTCAzLjAgc3BlYyAqLworI2lmIDAKKy8qIENpcGhlciAxQyAqLworCXsKKwkwLAorCVNTTDNfVFhUX0ZaQV9ETVNfTlVMTF9TSEEsCisJU1NMM19DS19GWkFfRE1TX05VTExfU0hBLAorCVNTTF9rRlpBLAorCVNTTF9hRlpBLAorCVNTTF9lTlVMTCwKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX1NUUk9OR19OT05FLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMCwKKwkwLAorCX0sCisKKy8qIENpcGhlciAxRCAqLworCXsKKwkwLAorCVNTTDNfVFhUX0ZaQV9ETVNfRlpBX1NIQSwKKwlTU0wzX0NLX0ZaQV9ETVNfRlpBX1NIQSwKKwlTU0xfa0ZaQSwKKwlTU0xfYUZaQSwKKwlTU0xfZUZaQSwKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX1NUUk9OR19OT05FLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMCwKKwkwLAorCX0sCisKKy8qIENpcGhlciAxRSAqLworCXsKKwkwLAorCVNTTDNfVFhUX0ZaQV9ETVNfUkM0X1NIQSwKKwlTU0wzX0NLX0ZaQV9ETVNfUkM0X1NIQSwKKwlTU0xfa0ZaQSwKKwlTU0xfYUZaQSwKKwlTU0xfUkM0LAorCVNTTF9TSEExLAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfTUVESVVNLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisvKiBUaGUgS2VyYmVyb3MgY2lwaGVycyovCisvKiBDaXBoZXIgMUUgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9LUkI1X0RFU182NF9DQkNfU0hBLAorCVNTTDNfQ0tfS1JCNV9ERVNfNjRfQ0JDX1NIQSwKKwlTU0xfa0tSQjUsCisJU1NMX2FLUkI1LAorCVNTTF9ERVMsCisJU1NMX1NIQTEsCisJU1NMX1NTTFYzLAorCVNTTF9OT1RfRVhQfFNTTF9MT1csCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk1NiwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMUYgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19TSEEsCisJU1NMM19DS19LUkI1X0RFU18xOTJfQ0JDM19TSEEsCisJU1NMX2tLUkI1LAorCVNTTF9hS1JCNSwKKwlTU0xfM0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX0hJR0h8U1NMX0ZJUFMsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxNjgsCisJMTY4LAorCX0sCisKKy8qIENpcGhlciAyMCAqLworCXsKKwkxLAorCVNTTDNfVFhUX0tSQjVfUkM0XzEyOF9TSEEsCisJU1NMM19DS19LUkI1X1JDNF8xMjhfU0hBLAorCVNTTF9rS1JCNSwKKwlTU0xfYUtSQjUsCisJU1NMX1JDNCwKKwlTU0xfU0hBMSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworLyogQ2lwaGVyIDIxICovCisJeworCTEsCisJU1NMM19UWFRfS1JCNV9JREVBXzEyOF9DQkNfU0hBLAorCVNTTDNfQ0tfS1JCNV9JREVBXzEyOF9DQkNfU0hBLAorCVNTTF9rS1JCNSwKKwlTU0xfYUtSQjUsCisJU1NMX0lERUEsCisJU1NMX1NIQTEsCisJU1NMX1NTTFYzLAorCVNTTF9OT1RfRVhQfFNTTF9NRURJVU0sCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisKKy8qIENpcGhlciAyMiAqLworCXsKKwkxLAorCVNTTDNfVFhUX0tSQjVfREVTXzY0X0NCQ19NRDUsCisJU1NMM19DS19LUkI1X0RFU182NF9DQkNfTUQ1LAorCVNTTF9rS1JCNSwKKwlTU0xfYUtSQjUsCisJU1NMX0RFUywKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfTE9XLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNTYsCisJNTYsCisJfSwKKworLyogQ2lwaGVyIDIzICovCisJeworCTEsCisJU1NMM19UWFRfS1JCNV9ERVNfMTkyX0NCQzNfTUQ1LAorCVNTTDNfQ0tfS1JCNV9ERVNfMTkyX0NCQzNfTUQ1LAorCVNTTF9rS1JCNSwKKwlTU0xfYUtSQjUsCisJU1NMXzNERVMsCisJU1NMX01ENSwKKwlTU0xfU1NMVjMsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxNjgsCisJMTY4LAorCX0sCisKKy8qIENpcGhlciAyNCAqLworCXsKKwkxLAorCVNTTDNfVFhUX0tSQjVfUkM0XzEyOF9NRDUsCisJU1NMM19DS19LUkI1X1JDNF8xMjhfTUQ1LAorCVNTTF9rS1JCNSwKKwlTU0xfYUtSQjUsCisJU1NMX1JDNCwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfTUVESVVNLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMjUgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9LUkI1X0lERUFfMTI4X0NCQ19NRDUsCisJU1NMM19DS19LUkI1X0lERUFfMTI4X0NCQ19NRDUsCisJU1NMX2tLUkI1LAorCVNTTF9hS1JCNSwKKwlTU0xfSURFQSwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMywKKwlTU0xfTk9UX0VYUHxTU0xfTUVESVVNLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMjYgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9LUkI1X0RFU180MF9DQkNfU0hBLAorCVNTTDNfQ0tfS1JCNV9ERVNfNDBfQ0JDX1NIQSwKKwlTU0xfa0tSQjUsCisJU1NMX2FLUkI1LAorCVNTTF9ERVMsCisJU1NMX1NIQTEsCisJU1NMX1NTTFYzLAorCVNTTF9FWFBPUlR8U1NMX0VYUDQwLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNDAsCisJNTYsCisJfSwKKworLyogQ2lwaGVyIDI3ICovCisJeworCTEsCisJU1NMM19UWFRfS1JCNV9SQzJfNDBfQ0JDX1NIQSwKKwlTU0wzX0NLX0tSQjVfUkMyXzQwX0NCQ19TSEEsCisJU1NMX2tLUkI1LAorCVNTTF9hS1JCNSwKKwlTU0xfUkMyLAorCVNTTF9TSEExLAorCVNTTF9TU0xWMywKKwlTU0xfRVhQT1JUfFNTTF9FWFA0MCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTQwLAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMjggKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9LUkI1X1JDNF80MF9TSEEsCisJU1NMM19DS19LUkI1X1JDNF80MF9TSEEsCisJU1NMX2tLUkI1LAorCVNTTF9hS1JCNSwKKwlTU0xfUkM0LAorCVNTTF9TSEExLAorCVNTTF9TU0xWMywKKwlTU0xfRVhQT1JUfFNTTF9FWFA0MCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTQwLAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMjkgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9LUkI1X0RFU180MF9DQkNfTUQ1LAorCVNTTDNfQ0tfS1JCNV9ERVNfNDBfQ0JDX01ENSwKKwlTU0xfa0tSQjUsCisJU1NMX2FLUkI1LAorCVNTTF9ERVMsCisJU1NMX01ENSwKKwlTU0xfU1NMVjMsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDAsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk0MCwKKwk1NiwKKwl9LAorCisvKiBDaXBoZXIgMkEgKi8KKwl7CisJMSwKKwlTU0wzX1RYVF9LUkI1X1JDMl80MF9DQkNfTUQ1LAorCVNTTDNfQ0tfS1JCNV9SQzJfNDBfQ0JDX01ENSwKKwlTU0xfa0tSQjUsCisJU1NMX2FLUkI1LAorCVNTTF9SQzIsCisJU1NMX01ENSwKKwlTU0xfU1NMVjMsCisJU1NMX0VYUE9SVHxTU0xfRVhQNDAsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk0MCwKKwkxMjgsCisJfSwKKworLyogQ2lwaGVyIDJCICovCisJeworCTEsCisJU1NMM19UWFRfS1JCNV9SQzRfNDBfTUQ1LAorCVNTTDNfQ0tfS1JCNV9SQzRfNDBfTUQ1LAorCVNTTF9rS1JCNSwKKwlTU0xfYUtSQjUsCisJU1NMX1JDNCwKKwlTU0xfTUQ1LAorCVNTTF9TU0xWMywKKwlTU0xfRVhQT1JUfFNTTF9FWFA0MCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTQwLAorCTEyOCwKKwl9LAorI2VuZGlmCS8qIE9QRU5TU0xfTk9fS1JCNSAqLworCisvKiBOZXcgQUVTIGNpcGhlcnN1aXRlcyAqLworLyogQ2lwaGVyIDJGICovCisJeworCTEsCisJVExTMV9UWFRfUlNBX1dJVEhfQUVTXzEyOF9TSEEsCisJVExTMV9DS19SU0FfV0lUSF9BRVNfMTI4X1NIQSwKKwlTU0xfa1JTQSwKKwlTU0xfYVJTQSwKKwlTU0xfQUVTMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKy8qIENpcGhlciAzMCAqLworCXsKKwkwLAorCVRMUzFfVFhUX0RIX0RTU19XSVRIX0FFU18xMjhfU0hBLAorCVRMUzFfQ0tfREhfRFNTX1dJVEhfQUVTXzEyOF9TSEEsCisJU1NMX2tESGQsCisJU1NMX2FESCwKKwlTU0xfQUVTMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKy8qIENpcGhlciAzMSAqLworCXsKKwkwLAorCVRMUzFfVFhUX0RIX1JTQV9XSVRIX0FFU18xMjhfU0hBLAorCVRMUzFfQ0tfREhfUlNBX1dJVEhfQUVTXzEyOF9TSEEsCisJU1NMX2tESHIsCisJU1NMX2FESCwKKwlTU0xfQUVTMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKy8qIENpcGhlciAzMiAqLworCXsKKwkxLAorCVRMUzFfVFhUX0RIRV9EU1NfV0lUSF9BRVNfMTI4X1NIQSwKKwlUTFMxX0NLX0RIRV9EU1NfV0lUSF9BRVNfMTI4X1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYURTUywKKwlTU0xfQUVTMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKy8qIENpcGhlciAzMyAqLworCXsKKwkxLAorCVRMUzFfVFhUX0RIRV9SU0FfV0lUSF9BRVNfMTI4X1NIQSwKKwlUTFMxX0NLX0RIRV9SU0FfV0lUSF9BRVNfMTI4X1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYVJTQSwKKwlTU0xfQUVTMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKy8qIENpcGhlciAzNCAqLworCXsKKwkxLAorCVRMUzFfVFhUX0FESF9XSVRIX0FFU18xMjhfU0hBLAorCVRMUzFfQ0tfQURIX1dJVEhfQUVTXzEyOF9TSEEsCisJU1NMX2tFREgsCisJU1NMX2FOVUxMLAorCVNTTF9BRVMxMjgsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdIfFNTTF9GSVBTLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisvKiBDaXBoZXIgMzUgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9SU0FfV0lUSF9BRVNfMjU2X1NIQSwKKwlUTFMxX0NLX1JTQV9XSVRIX0FFU18yNTZfU0hBLAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9BRVMyNTYsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdIfFNTTF9GSVBTLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMjU2LAorCTI1NiwKKwl9LAorLyogQ2lwaGVyIDM2ICovCisJeworCTAsCisJVExTMV9UWFRfREhfRFNTX1dJVEhfQUVTXzI1Nl9TSEEsCisJVExTMV9DS19ESF9EU1NfV0lUSF9BRVNfMjU2X1NIQSwKKwlTU0xfa0RIZCwKKwlTU0xfYURILAorCVNTTF9BRVMyNTYsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdIfFNTTF9GSVBTLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMjU2LAorCTI1NiwKKwl9LAorCisvKiBDaXBoZXIgMzcgKi8KKwl7CisJMCwgLyogbm90IGltcGxlbWVudGVkIChub24tZXBoZW1lcmFsIERIKSAqLworCVRMUzFfVFhUX0RIX1JTQV9XSVRIX0FFU18yNTZfU0hBLAorCVRMUzFfQ0tfREhfUlNBX1dJVEhfQUVTXzI1Nl9TSEEsCisJU1NMX2tESHIsCisJU1NMX2FESCwKKwlTU0xfQUVTMjU2LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYsCisJfSwKKworLyogQ2lwaGVyIDM4ICovCisJeworCTEsCisJVExTMV9UWFRfREhFX0RTU19XSVRIX0FFU18yNTZfU0hBLAorCVRMUzFfQ0tfREhFX0RTU19XSVRIX0FFU18yNTZfU0hBLAorCVNTTF9rRURILAorCVNTTF9hRFNTLAorCVNTTF9BRVMyNTYsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdIfFNTTF9GSVBTLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMjU2LAorCTI1NiwKKwl9LAorCisvKiBDaXBoZXIgMzkgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9ESEVfUlNBX1dJVEhfQUVTXzI1Nl9TSEEsCisJVExTMV9DS19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9TSEEsCisJU1NMX2tFREgsCisJU1NMX2FSU0EsCisJU1NMX0FFUzI1NiwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0h8U1NMX0ZJUFMsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkyNTYsCisJMjU2LAorCX0sCisKKwkvKiBDaXBoZXIgM0EgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9BREhfV0lUSF9BRVNfMjU2X1NIQSwKKwlUTFMxX0NLX0FESF9XSVRIX0FFU18yNTZfU0hBLAorCVNTTF9rRURILAorCVNTTF9hTlVMTCwKKwlTU0xfQUVTMjU2LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSHxTU0xfRklQUywKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYsCisJfSwKKworI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJLyogQ2FtZWxsaWEgY2lwaGVyc3VpdGVzIGZyb20gUkZDNDEzMiAoMTI4LWJpdCBwb3J0aW9uKSAqLworCisJLyogQ2lwaGVyIDQxICovCisJeworCTEsCisJVExTMV9UWFRfUlNBX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEsCisJVExTMV9DS19SU0FfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQSwKKwlTU0xfa1JTQSwKKwlTU0xfYVJTQSwKKwlTU0xfQ0FNRUxMSUExMjgsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisJLyogQ2lwaGVyIDQyICovCisJeworCTAsIC8qIG5vdCBpbXBsZW1lbnRlZCAobm9uLWVwaGVtZXJhbCBESCkgKi8KKwlUTFMxX1RYVF9ESF9EU1NfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQSwKKwlUTFMxX0NLX0RIX0RTU19XSVRIX0NBTUVMTElBXzEyOF9DQkNfU0hBLAorCVNTTF9rREhkLAorCVNTTF9hREgsCisJU1NMX0NBTUVMTElBMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciA0MyAqLworCXsKKwkwLCAvKiBub3QgaW1wbGVtZW50ZWQgKG5vbi1lcGhlbWVyYWwgREgpICovCisJVExTMV9UWFRfREhfUlNBX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEsCisJVExTMV9DS19ESF9SU0FfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQSwKKwlTU0xfa0RIciwKKwlTU0xfYURILAorCVNTTF9DQU1FTExJQTEyOCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgNDQgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9ESEVfRFNTX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEsCisJVExTMV9DS19ESEVfRFNTX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEsCisJU1NMX2tFREgsCisJU1NMX2FEU1MsCisJU1NMX0NBTUVMTElBMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciA0NSAqLworCXsKKwkxLAorCVRMUzFfVFhUX0RIRV9SU0FfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQSwKKwlUTFMxX0NLX0RIRV9SU0FfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYVJTQSwKKwlTU0xfQ0FNRUxMSUExMjgsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisJLyogQ2lwaGVyIDQ2ICovCisJeworCTEsCisJVExTMV9UWFRfQURIX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEsCisJVExTMV9DS19BREhfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYU5VTEwsCisJU1NMX0NBTUVMTElBMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0NBTUVMTElBICovCisKKyNpZiBUTFMxX0FMTE9XX0VYUEVSSU1FTlRBTF9DSVBIRVJTVUlURVMKKwkvKiBOZXcgVExTIEV4cG9ydCBDaXBoZXJTdWl0ZXMgZnJvbSBleHBpcmVkIElEICovCisjaWYgMAorCS8qIENpcGhlciA2MCAqLworCXsKKwkxLAorCVRMUzFfVFhUX1JTQV9FWFBPUlQxMDI0X1dJVEhfUkM0XzU2X01ENSwKKwlUTFMxX0NLX1JTQV9FWFBPUlQxMDI0X1dJVEhfUkM0XzU2X01ENSwKKwlTU0xfa1JTQSwKKwlTU0xfYVJTQSwKKwlTU0xfUkM0LAorCVNTTF9NRDUsCisJU1NMX1RMU1YxLAorCVNTTF9FWFBPUlR8U1NMX0VYUDU2LAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNTYsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgNjEgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9SU0FfRVhQT1JUMTAyNF9XSVRIX1JDMl9DQkNfNTZfTUQ1LAorCVRMUzFfQ0tfUlNBX0VYUE9SVDEwMjRfV0lUSF9SQzJfQ0JDXzU2X01ENSwKKwlTU0xfa1JTQSwKKwlTU0xfYVJTQSwKKwlTU0xfUkMyLAorCVNTTF9NRDUsCisJU1NMX1RMU1YxLAorCVNTTF9FWFBPUlR8U1NMX0VYUDU2LAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNTYsCisJMTI4LAorCX0sCisjZW5kaWYKKworCS8qIENpcGhlciA2MiAqLworCXsKKwkxLAorCVRMUzFfVFhUX1JTQV9FWFBPUlQxMDI0X1dJVEhfREVTX0NCQ19TSEEsCisJVExTMV9DS19SU0FfRVhQT1JUMTAyNF9XSVRIX0RFU19DQkNfU0hBLAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9ERVMsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9FWFBPUlR8U1NMX0VYUDU2LAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNTYsCisJNTYsCisJfSwKKworCS8qIENpcGhlciA2MyAqLworCXsKKwkxLAorCVRMUzFfVFhUX0RIRV9EU1NfRVhQT1JUMTAyNF9XSVRIX0RFU19DQkNfU0hBLAorCVRMUzFfQ0tfREhFX0RTU19FWFBPUlQxMDI0X1dJVEhfREVTX0NCQ19TSEEsCisJU1NMX2tFREgsCisJU1NMX2FEU1MsCisJU1NMX0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX0VYUE9SVHxTU0xfRVhQNTYsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwk1NiwKKwk1NiwKKwl9LAorCisJLyogQ2lwaGVyIDY0ICovCisJeworCTEsCisJVExTMV9UWFRfUlNBX0VYUE9SVDEwMjRfV0lUSF9SQzRfNTZfU0hBLAorCVRMUzFfQ0tfUlNBX0VYUE9SVDEwMjRfV0lUSF9SQzRfNTZfU0hBLAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9SQzQsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9FWFBPUlR8U1NMX0VYUDU2LAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJNTYsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgNjUgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9ESEVfRFNTX0VYUE9SVDEwMjRfV0lUSF9SQzRfNTZfU0hBLAorCVRMUzFfQ0tfREhFX0RTU19FWFBPUlQxMDI0X1dJVEhfUkM0XzU2X1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYURTUywKKwlTU0xfUkM0LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfRVhQT1JUfFNTTF9FWFA1NiwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTU2LAorCTEyOCwKKwl9LAorCisJLyogQ2lwaGVyIDY2ICovCisJeworCTEsCisJVExTMV9UWFRfREhFX0RTU19XSVRIX1JDNF8xMjhfU0hBLAorCVRMUzFfQ0tfREhFX0RTU19XSVRIX1JDNF8xMjhfU0hBLAorCVNTTF9rRURILAorCVNTTF9hRFNTLAorCVNTTF9SQzQsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9NRURJVU0sCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisjZW5kaWYKKwl7CisJMSwKKwkiR09TVDk0LUdPU1Q4OS1HT1NUODkiLAorCTB4MzAwMDA4MCwKKwlTU0xfa0dPU1QsCisJU1NMX2FHT1NUOTQsCisJU1NMX2VHT1NUMjgxNDc4OUNOVCwKKwlTU0xfR09TVDg5TUFDLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19HT1NUOTR8VExTMV9QUkZfR09TVDk0fFRMUzFfU1RSRUFNX01BQywKKwkyNTYsCisJMjU2CisJfSwKKwl7CisJMSwKKwkiR09TVDIwMDEtR09TVDg5LUdPU1Q4OSIsCisJMHgzMDAwMDgxLAorCVNTTF9rR09TVCwKKwlTU0xfYUdPU1QwMSwKKwlTU0xfZUdPU1QyODE0Nzg5Q05ULAorCVNTTF9HT1NUODlNQUMsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0dPU1Q5NHxUTFMxX1BSRl9HT1NUOTR8VExTMV9TVFJFQU1fTUFDLAorCTI1NiwKKwkyNTYKKwl9LAorCXsKKwkxLAorCSJHT1NUOTQtTlVMTC1HT1NUOTQiLAorCTB4MzAwMDA4MiwKKwlTU0xfa0dPU1QsCisJU1NMX2FHT1NUOTQsCisJU1NMX2VOVUxMLAorCVNTTF9HT1NUOTQsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9TVFJPTkdfTk9ORSwKKwlTU0xfSEFORFNIQUtFX01BQ19HT1NUOTR8VExTMV9QUkZfR09TVDk0LAorCTAsCisJMAorCX0sCisJeworCTEsCisJIkdPU1QyMDAxLU5VTEwtR09TVDk0IiwKKwkweDMwMDAwODMsCisJU1NMX2tHT1NULAorCVNTTF9hR09TVDAxLAorCVNTTF9lTlVMTCwKKwlTU0xfR09TVDk0LAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfU1RST05HX05PTkUsCisJU1NMX0hBTkRTSEFLRV9NQUNfR09TVDk0fFRMUzFfUFJGX0dPU1Q5NCwKKwkwLAorCTAKKwl9LAorCisjaWZuZGVmIE9QRU5TU0xfTk9fQ0FNRUxMSUEKKwkvKiBDYW1lbGxpYSBjaXBoZXJzdWl0ZXMgZnJvbSBSRkM0MTMyICgyNTYtYml0IHBvcnRpb24pICovCisKKwkvKiBDaXBoZXIgODQgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9SU0FfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQSwKKwlUTFMxX0NLX1JTQV9XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBLAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9DQU1FTExJQTI1NiwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkyNTYsCisJMjU2LAorCX0sCisJLyogQ2lwaGVyIDg1ICovCisJeworCTAsIC8qIG5vdCBpbXBsZW1lbnRlZCAobm9uLWVwaGVtZXJhbCBESCkgKi8KKwlUTFMxX1RYVF9ESF9EU1NfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQSwKKwlUTFMxX0NLX0RIX0RTU19XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBLAorCVNTTF9rREhkLAorCVNTTF9hREgsCisJU1NMX0NBTUVMTElBMjU2LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYsCisJfSwKKworCS8qIENpcGhlciA4NiAqLworCXsKKwkwLCAvKiBub3QgaW1wbGVtZW50ZWQgKG5vbi1lcGhlbWVyYWwgREgpICovCisJVExTMV9UWFRfREhfUlNBX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEsCisJVExTMV9DS19ESF9SU0FfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQSwKKwlTU0xfa0RIciwKKwlTU0xfYURILAorCVNTTF9DQU1FTExJQTI1NiwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkyNTYsCisJMjU2LAorCX0sCisKKwkvKiBDaXBoZXIgODcgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9ESEVfRFNTX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEsCisJVExTMV9DS19ESEVfRFNTX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEsCisJU1NMX2tFREgsCisJU1NMX2FEU1MsCisJU1NMX0NBTUVMTElBMjU2LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYsCisJfSwKKworCS8qIENpcGhlciA4OCAqLworCXsKKwkxLAorCVRMUzFfVFhUX0RIRV9SU0FfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQSwKKwlUTFMxX0NLX0RIRV9SU0FfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYVJTQSwKKwlTU0xfQ0FNRUxMSUEyNTYsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMjU2LAorCTI1NiwKKwl9LAorCisJLyogQ2lwaGVyIDg5ICovCisJeworCTEsCisJVExTMV9UWFRfQURIX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEsCisJVExTMV9DS19BREhfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYU5VTEwsCisJU1NMX0NBTUVMTElBMjU2LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYsCisJfSwKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0NBTUVMTElBICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwkvKiBDaXBoZXIgOEEgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9QU0tfV0lUSF9SQzRfMTI4X1NIQSwKKwlUTFMxX0NLX1BTS19XSVRIX1JDNF8xMjhfU0hBLAorCVNTTF9rUFNLLAorCVNTTF9hUFNLLAorCVNTTF9SQzQsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9NRURJVU0sCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgOEIgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9QU0tfV0lUSF8zREVTX0VERV9DQkNfU0hBLAorCVRMUzFfQ0tfUFNLX1dJVEhfM0RFU19FREVfQ0JDX1NIQSwKKwlTU0xfa1BTSywKKwlTU0xfYVBTSywKKwlTU0xfM0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxNjgsCisJMTY4LAorCX0sCisKKwkvKiBDaXBoZXIgOEMgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9QU0tfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCisJVExTMV9DS19QU0tfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCisJU1NMX2tQU0ssCisJU1NMX2FQU0ssCisJU1NMX0FFUzEyOCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgOEQgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9QU0tfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCisJVExTMV9DS19QU0tfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCisJU1NMX2tQU0ssCisJU1NMX2FQU0ssCisJU1NMX0FFUzI1NiwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkyNTYsCisJMjU2LAorCX0sCisjZW5kaWYgIC8qIE9QRU5TU0xfTk9fUFNLICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TRUVECisJLyogU0VFRCBjaXBoZXJzdWl0ZXMgZnJvbSBSRkM0MTYyICovCisKKwkvKiBDaXBoZXIgOTYgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9SU0FfV0lUSF9TRUVEX1NIQSwKKwlUTFMxX0NLX1JTQV9XSVRIX1NFRURfU0hBLAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9TRUVELAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfTUVESVVNLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisJLyogQ2lwaGVyIDk3ICovCisJeworCTAsIC8qIG5vdCBpbXBsZW1lbnRlZCAobm9uLWVwaGVtZXJhbCBESCkgKi8KKwlUTFMxX1RYVF9ESF9EU1NfV0lUSF9TRUVEX1NIQSwKKwlUTFMxX0NLX0RIX0RTU19XSVRIX1NFRURfU0hBLAorCVNTTF9rREhkLAorCVNTTF9hREgsCisJU1NMX1NFRUQsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9NRURJVU0sCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgOTggKi8KKwl7CisJMCwgLyogbm90IGltcGxlbWVudGVkIChub24tZXBoZW1lcmFsIERIKSAqLworCVRMUzFfVFhUX0RIX1JTQV9XSVRIX1NFRURfU0hBLAorCVRMUzFfQ0tfREhfUlNBX1dJVEhfU0VFRF9TSEEsCisJU1NMX2tESHIsCisJU1NMX2FESCwKKwlTU0xfU0VFRCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciA5OSAqLworCXsKKwkxLAorCVRMUzFfVFhUX0RIRV9EU1NfV0lUSF9TRUVEX1NIQSwKKwlUTFMxX0NLX0RIRV9EU1NfV0lUSF9TRUVEX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYURTUywKKwlTU0xfU0VFRCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciA5QSAqLworCXsKKwkxLAorCVRMUzFfVFhUX0RIRV9SU0FfV0lUSF9TRUVEX1NIQSwKKwlUTFMxX0NLX0RIRV9SU0FfV0lUSF9TRUVEX1NIQSwKKwlTU0xfa0VESCwKKwlTU0xfYVJTQSwKKwlTU0xfU0VFRCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciA5QiAqLworCXsKKwkxLAorCVRMUzFfVFhUX0FESF9XSVRIX1NFRURfU0hBLAorCVRMUzFfQ0tfQURIX1dJVEhfU0VFRF9TSEEsCisJU1NMX2tFREgsCisJU1NMX2FOVUxMLAorCVNTTF9TRUVELAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfTUVESVVNLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisjZW5kaWYgLyogT1BFTlNTTF9OT19TRUVEICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJLyogQ2lwaGVyIEMwMDEgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9FQ0RIX0VDRFNBX1dJVEhfTlVMTF9TSEEsCisJVExTMV9DS19FQ0RIX0VDRFNBX1dJVEhfTlVMTF9TSEEsCisJU1NMX2tFQ0RIZSwKKwlTU0xfYUVDREgsCisJU1NMX2VOVUxMLAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfU1RST05HX05PTkUsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkwLAorCTAsCisJfSwKKworCS8qIENpcGhlciBDMDAyICovCisJeworCTEsCisJVExTMV9UWFRfRUNESF9FQ0RTQV9XSVRIX1JDNF8xMjhfU0hBLAorCVRMUzFfQ0tfRUNESF9FQ0RTQV9XSVRIX1JDNF8xMjhfU0hBLAorCVNTTF9rRUNESGUsCisJU1NMX2FFQ0RILAorCVNTTF9SQzQsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9NRURJVU0sCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgQzAwMyAqLworCXsKKwkxLAorCVRMUzFfVFhUX0VDREhfRUNEU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBLAorCVRMUzFfQ0tfRUNESF9FQ0RTQV9XSVRIX0RFU18xOTJfQ0JDM19TSEEsCisJU1NMX2tFQ0RIZSwKKwlTU0xfYUVDREgsCisJU1NMXzNERVMsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTY4LAorCTE2OCwKKwl9LAorCisJLyogQ2lwaGVyIEMwMDQgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9FQ0RIX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAorCVRMUzFfQ0tfRUNESF9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKKwlTU0xfa0VDREhlLAorCVNTTF9hRUNESCwKKwlTU0xfQUVTMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciBDMDA1ICovCisJeworCTEsCisJVExTMV9UWFRfRUNESF9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwlUTFMxX0NLX0VDREhfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCisJU1NMX2tFQ0RIZSwKKwlTU0xfYUVDREgsCisJU1NMX0FFUzI1NiwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkyNTYsCisJMjU2LAorCX0sCisKKwkvKiBDaXBoZXIgQzAwNiAqLworCXsKKwkxLAorCVRMUzFfVFhUX0VDREhFX0VDRFNBX1dJVEhfTlVMTF9TSEEsCisJVExTMV9DS19FQ0RIRV9FQ0RTQV9XSVRIX05VTExfU0hBLAorCVNTTF9rRUVDREgsCisJU1NMX2FFQ0RTQSwKKwlTU0xfZU5VTEwsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9TVFJPTkdfTk9ORSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTAsCisJMCwKKwl9LAorCisJLyogQ2lwaGVyIEMwMDcgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9FQ0RIRV9FQ0RTQV9XSVRIX1JDNF8xMjhfU0hBLAorCVRMUzFfQ0tfRUNESEVfRUNEU0FfV0lUSF9SQzRfMTI4X1NIQSwKKwlTU0xfa0VFQ0RILAorCVNTTF9hRUNEU0EsCisJU1NMX1JDNCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciBDMDA4ICovCisJeworCTEsCisJVExTMV9UWFRfRUNESEVfRUNEU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBLAorCVRMUzFfQ0tfRUNESEVfRUNEU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBLAorCVNTTF9rRUVDREgsCisJU1NMX2FFQ0RTQSwKKwlTU0xfM0RFUywKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxNjgsCisJMTY4LAorCX0sCisKKwkvKiBDaXBoZXIgQzAwOSAqLworCXsKKwkxLAorCVRMUzFfVFhUX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAorCVRMUzFfQ0tfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCisJU1NMX2tFRUNESCwKKwlTU0xfYUVDRFNBLAorCVNTTF9BRVMxMjgsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisJLyogQ2lwaGVyIEMwMEEgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwlUTFMxX0NLX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLAorCVNTTF9rRUVDREgsCisJU1NMX2FFQ0RTQSwKKwlTU0xfQUVTMjU2LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYsCisJfSwKKworCS8qIENpcGhlciBDMDBCICovCisJeworCTEsCisJVExTMV9UWFRfRUNESF9SU0FfV0lUSF9OVUxMX1NIQSwKKwlUTFMxX0NLX0VDREhfUlNBX1dJVEhfTlVMTF9TSEEsCisJU1NMX2tFQ0RIciwKKwlTU0xfYUVDREgsCisJU1NMX2VOVUxMLAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfU1RST05HX05PTkUsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkwLAorCTAsCisJfSwKKworCS8qIENpcGhlciBDMDBDICovCisJeworCTEsCisJVExTMV9UWFRfRUNESF9SU0FfV0lUSF9SQzRfMTI4X1NIQSwKKwlUTFMxX0NLX0VDREhfUlNBX1dJVEhfUkM0XzEyOF9TSEEsCisJU1NMX2tFQ0RIciwKKwlTU0xfYUVDREgsCisJU1NMX1JDNCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciBDMDBEICovCisJeworCTEsCisJVExTMV9UWFRfRUNESF9SU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBLAorCVRMUzFfQ0tfRUNESF9SU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBLAorCVNTTF9rRUNESHIsCisJU1NMX2FFQ0RILAorCVNTTF8zREVTLAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTE2OCwKKwkxNjgsCisJfSwKKworCS8qIENpcGhlciBDMDBFICovCisJeworCTEsCisJVExTMV9UWFRfRUNESF9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCisJVExTMV9DS19FQ0RIX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKKwlTU0xfa0VDREhyLAorCVNTTF9hRUNESCwKKwlTU0xfQUVTMTI4LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciBDMDBGICovCisJeworCTEsCisJVExTMV9UWFRfRUNESF9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCisJVExTMV9DS19FQ0RIX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwlTU0xfa0VDREhyLAorCVNTTF9hRUNESCwKKwlTU0xfQUVTMjU2LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYsCisJfSwKKworCS8qIENpcGhlciBDMDEwICovCisJeworCTEsCisJVExTMV9UWFRfRUNESEVfUlNBX1dJVEhfTlVMTF9TSEEsCisJVExTMV9DS19FQ0RIRV9SU0FfV0lUSF9OVUxMX1NIQSwKKwlTU0xfa0VFQ0RILAorCVNTTF9hUlNBLAorCVNTTF9lTlVMTCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX1NUUk9OR19OT05FLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMCwKKwkwLAorCX0sCisKKwkvKiBDaXBoZXIgQzAxMSAqLworCXsKKwkxLAorCVRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX1JDNF8xMjhfU0hBLAorCVRMUzFfQ0tfRUNESEVfUlNBX1dJVEhfUkM0XzEyOF9TSEEsCisJU1NMX2tFRUNESCwKKwlTU0xfYVJTQSwKKwlTU0xfUkM0LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfTUVESVVNLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTI4LAorCTEyOCwKKwl9LAorCisJLyogQ2lwaGVyIEMwMTIgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9FQ0RIRV9SU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBLAorCVRMUzFfQ0tfRUNESEVfUlNBX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSwKKwlTU0xfa0VFQ0RILAorCVNTTF9hUlNBLAorCVNTTF8zREVTLAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTE2OCwKKwkxNjgsCisJfSwKKworCS8qIENpcGhlciBDMDEzICovCisJeworCTEsCisJVExTMV9UWFRfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAorCVRMUzFfQ0tfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBLAorCVNTTF9rRUVDREgsCisJU1NMX2FSU0EsCisJU1NMX0FFUzEyOCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgQzAxNCAqLworCXsKKwkxLAorCVRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwlUTFMxX0NLX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwlTU0xfa0VFQ0RILAorCVNTTF9hUlNBLAorCVNTTF9BRVMyNTYsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMjU2LAorCTI1NiwKKwl9LAorCisJLyogQ2lwaGVyIEMwMTUgKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9FQ0RIX2Fub25fV0lUSF9OVUxMX1NIQSwKKwlUTFMxX0NLX0VDREhfYW5vbl9XSVRIX05VTExfU0hBLAorCVNTTF9rRUVDREgsCisJU1NMX2FOVUxMLAorCVNTTF9lTlVMTCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX1NUUk9OR19OT05FLAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMCwKKwkwLAorCX0sCisKKwkvKiBDaXBoZXIgQzAxNiAqLworCXsKKwkxLAorCVRMUzFfVFhUX0VDREhfYW5vbl9XSVRIX1JDNF8xMjhfU0hBLAorCVRMUzFfQ0tfRUNESF9hbm9uX1dJVEhfUkM0XzEyOF9TSEEsCisJU1NMX2tFRUNESCwKKwlTU0xfYU5VTEwsCisJU1NMX1JDNCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX01FRElVTSwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTEyOCwKKwkxMjgsCisJfSwKKworCS8qIENpcGhlciBDMDE3ICovCisJeworCTEsCisJVExTMV9UWFRfRUNESF9hbm9uX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSwKKwlUTFMxX0NLX0VDREhfYW5vbl9XSVRIX0RFU18xOTJfQ0JDM19TSEEsCisJU1NMX2tFRUNESCwKKwlTU0xfYU5VTEwsCisJU1NMXzNERVMsCisJU1NMX1NIQTEsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkYsCisJMTY4LAorCTE2OCwKKwl9LAorCisJLyogQ2lwaGVyIEMwMTggKi8KKwl7CisJMSwKKwlUTFMxX1RYVF9FQ0RIX2Fub25fV0lUSF9BRVNfMTI4X0NCQ19TSEEsCisJVExTMV9DS19FQ0RIX2Fub25fV0lUSF9BRVNfMTI4X0NCQ19TSEEsCisJU1NMX2tFRUNESCwKKwlTU0xfYU5VTEwsCisJU1NMX0FFUzEyOCwKKwlTU0xfU0hBMSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkxMjgsCisJMTI4LAorCX0sCisKKwkvKiBDaXBoZXIgQzAxOSAqLworCXsKKwkxLAorCVRMUzFfVFhUX0VDREhfYW5vbl9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwlUTFMxX0NLX0VDREhfYW5vbl9XSVRIX0FFU18yNTZfQ0JDX1NIQSwKKwlTU0xfa0VFQ0RILAorCVNTTF9hTlVMTCwKKwlTU0xfQUVTMjU2LAorCVNTTF9TSEExLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYsCisJfSwKKyNlbmRpZgkvKiBPUEVOU1NMX05PX0VDREggKi8KKworI2lmZGVmIFRFTVBfR09TVF9UTFMKKy8qIENpcGhlciBGRjAwICovCisJeworCTEsCisJIkdPU1QtTUQ1IiwKKwkweDAzMDBmZjAwLAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9lR09TVDI4MTQ3ODlDTlQsCisJU1NMX01ENSwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkyNTYsCisJMjU2LAorCX0sCisJeworCTEsCisJIkdPU1QtR09TVDk0IiwKKwkweDAzMDBmZjAxLAorCVNTTF9rUlNBLAorCVNTTF9hUlNBLAorCVNTTF9lR09TVDI4MTQ3ODlDTlQsCisJU1NMX0dPU1Q5NCwKKwlTU0xfVExTVjEsCisJU1NMX05PVF9FWFB8U1NMX0hJR0gsCisJU1NMX0hBTkRTSEFLRV9NQUNfREVGQVVMVHxUTFMxX1BSRiwKKwkyNTYsCisJMjU2CisJfSwKKwl7CisJMSwKKwkiR09TVC1HT1NUODlNQUMiLAorCTB4MDMwMGZmMDIsCisJU1NMX2tSU0EsCisJU1NMX2FSU0EsCisJU1NMX2VHT1NUMjgxNDc4OUNOVCwKKwlTU0xfR09TVDg5TUFDLAorCVNTTF9UTFNWMSwKKwlTU0xfTk9UX0VYUHxTU0xfSElHSCwKKwlTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUfFRMUzFfUFJGLAorCTI1NiwKKwkyNTYKKwl9LAorCXsKKwkxLAorCSJHT1NULUdPU1Q4OVNUUkVBTSIsCisJMHgwMzAwZmYwMywKKwlTU0xfa1JTQSwKKwlTU0xfYVJTQSwKKwlTU0xfZUdPU1QyODE0Nzg5Q05ULAorCVNTTF9HT1NUODlNQUMsCisJU1NMX1RMU1YxLAorCVNTTF9OT1RfRVhQfFNTTF9ISUdILAorCVNTTF9IQU5EU0hBS0VfTUFDX0RFRkFVTFR8VExTMV9QUkZ8VExTMV9TVFJFQU1fTUFDLAorCTI1NiwKKwkyNTYKKwl9LAorI2VuZGlmCisKKy8qIGVuZCBvZiBsaXN0ICovCisJfTsKKworU1NMM19FTkNfTUVUSE9EIFNTTHYzX2VuY19kYXRhPXsKKwlzc2wzX2VuYywKKwluX3NzbDNfbWFjLAorCXNzbDNfc2V0dXBfa2V5X2Jsb2NrLAorCXNzbDNfZ2VuZXJhdGVfbWFzdGVyX3NlY3JldCwKKwlzc2wzX2NoYW5nZV9jaXBoZXJfc3RhdGUsCisJc3NsM19maW5hbF9maW5pc2hfbWFjLAorCU1ENV9ESUdFU1RfTEVOR1RIK1NIQV9ESUdFU1RfTEVOR1RILAorCXNzbDNfY2VydF92ZXJpZnlfbWFjLAorCVNTTDNfTURfQ0xJRU5UX0ZJTklTSEVEX0NPTlNULDQsCisJU1NMM19NRF9TRVJWRVJfRklOSVNIRURfQ09OU1QsNCwKKwlzc2wzX2FsZXJ0X2NvZGUsCisJfTsKKworbG9uZyBzc2wzX2RlZmF1bHRfdGltZW91dCh2b2lkKQorCXsKKwkvKiAyIGhvdXJzLCB0aGUgMjQgaG91cnMgbWVudGlvbmVkIGluIHRoZSBTU0x2MyBzcGVjCisJICogaXMgd2F5IHRvbyBsb25nIGZvciBodHRwLCB0aGUgY2FjaGUgd291bGQgb3ZlciBmaWxsICovCisJcmV0dXJuKDYwKjYwKjIpOworCX0KKworaW50IHNzbDNfbnVtX2NpcGhlcnModm9pZCkKKwl7CisJcmV0dXJuKFNTTDNfTlVNX0NJUEhFUlMpOworCX0KKworY29uc3QgU1NMX0NJUEhFUiAqc3NsM19nZXRfY2lwaGVyKHVuc2lnbmVkIGludCB1KQorCXsKKwlpZiAodSA8IFNTTDNfTlVNX0NJUEhFUlMpCisJCXJldHVybigmKHNzbDNfY2lwaGVyc1tTU0wzX05VTV9DSVBIRVJTLTEtdV0pKTsKKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKK2ludCBzc2wzX3BlbmRpbmcoY29uc3QgU1NMICpzKQorCXsKKwlpZiAocy0+cnN0YXRlID09IFNTTF9TVF9SRUFEX0JPRFkpCisJCXJldHVybiAwOworCQorCXJldHVybiAocy0+czMtPnJyZWMudHlwZSA9PSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEpID8gcy0+czMtPnJyZWMubGVuZ3RoIDogMDsKKwl9CisKK2ludCBzc2wzX25ldyhTU0wgKnMpCisJeworCVNTTDNfU1RBVEUgKnMzOworCisJaWYgKChzMz1PUEVOU1NMX21hbGxvYyhzaXplb2YgKnMzKSkgPT0gTlVMTCkgZ290byBlcnI7CisJbWVtc2V0KHMzLDAsc2l6ZW9mICpzMyk7CisJbWVtc2V0KHMzLT5ycmVjLnNlcV9udW0sMCxzaXplb2YoczMtPnJyZWMuc2VxX251bSkpOworCW1lbXNldChzMy0+d3JlYy5zZXFfbnVtLDAsc2l6ZW9mKHMzLT53cmVjLnNlcV9udW0pKTsKKworCXMtPnMzPXMzOworCisJcy0+bWV0aG9kLT5zc2xfY2xlYXIocyk7CisJcmV0dXJuKDEpOworZXJyOgorCXJldHVybigwKTsKKwl9CisKK3ZvaWQgc3NsM19mcmVlKFNTTCAqcykKKwl7CisJaWYocyA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKyNpZmRlZiBUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0CisJaWYgKHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dCAhPSBOVUxMKQorCQlPUEVOU1NMX2ZyZWUocy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0KTsKKwlpZiAocy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQpOworI2VuZGlmCisKKwlzc2wzX2NsZWFudXBfa2V5X2Jsb2NrKHMpOworCWlmIChzLT5zMy0+cmJ1Zi5idWYgIT0gTlVMTCkKKwkJc3NsM19yZWxlYXNlX3JlYWRfYnVmZmVyKHMpOworCWlmIChzLT5zMy0+d2J1Zi5idWYgIT0gTlVMTCkKKwkJc3NsM19yZWxlYXNlX3dyaXRlX2J1ZmZlcihzKTsKKwlpZiAocy0+czMtPnJyZWMuY29tcCAhPSBOVUxMKQorCQlPUEVOU1NMX2ZyZWUocy0+czMtPnJyZWMuY29tcCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwlpZiAocy0+czMtPnRtcC5kaCAhPSBOVUxMKQorCQlESF9mcmVlKHMtPnMzLT50bXAuZGgpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWlmIChzLT5zMy0+dG1wLmVjZGggIT0gTlVMTCkKKwkJRUNfS0VZX2ZyZWUocy0+czMtPnRtcC5lY2RoKTsKKyNlbmRpZgorCisJaWYgKHMtPnMzLT50bXAuY2FfbmFtZXMgIT0gTlVMTCkKKwkJc2tfWDUwOV9OQU1FX3BvcF9mcmVlKHMtPnMzLT50bXAuY2FfbmFtZXMsWDUwOV9OQU1FX2ZyZWUpOworCWlmIChzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlcikgeworCQlCSU9fZnJlZShzLT5zMy0+aGFuZHNoYWtlX2J1ZmZlcik7CisJfQorCWlmIChzLT5zMy0+aGFuZHNoYWtlX2Rnc3QpIHNzbDNfZnJlZV9kaWdlc3RfbGlzdChzKTsKKwlPUEVOU1NMX2NsZWFuc2Uocy0+czMsc2l6ZW9mICpzLT5zMyk7CisJT1BFTlNTTF9mcmVlKHMtPnMzKTsKKwlzLT5zMz1OVUxMOworCX0KKwordm9pZCBzc2wzX2NsZWFyKFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqcnAsKndwOworCXNpemVfdCBybGVuLCB3bGVuOworCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorCWlmIChzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dCk7CisJcy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0ID0gTlVMTDsKKwlpZiAocy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQpOworCXMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dCA9IE5VTEw7CisjZW5kaWYKKworCXNzbDNfY2xlYW51cF9rZXlfYmxvY2socyk7CisJaWYgKHMtPnMzLT50bXAuY2FfbmFtZXMgIT0gTlVMTCkKKwkJc2tfWDUwOV9OQU1FX3BvcF9mcmVlKHMtPnMzLT50bXAuY2FfbmFtZXMsWDUwOV9OQU1FX2ZyZWUpOworCisJaWYgKHMtPnMzLT5ycmVjLmNvbXAgIT0gTlVMTCkKKwkJeworCQlPUEVOU1NMX2ZyZWUocy0+czMtPnJyZWMuY29tcCk7CisJCXMtPnMzLT5ycmVjLmNvbXA9TlVMTDsKKwkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJaWYgKHMtPnMzLT50bXAuZGggIT0gTlVMTCkKKwkJREhfZnJlZShzLT5zMy0+dG1wLmRoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlpZiAocy0+czMtPnRtcC5lY2RoICE9IE5VTEwpCisJCUVDX0tFWV9mcmVlKHMtPnMzLT50bXAuZWNkaCk7CisjZW5kaWYKKworCXJwID0gcy0+czMtPnJidWYuYnVmOworCXdwID0gcy0+czMtPndidWYuYnVmOworCXJsZW4gPSBzLT5zMy0+cmJ1Zi5sZW47CisgCXdsZW4gPSBzLT5zMy0+d2J1Zi5sZW47CisJaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyKSB7CisJCUJJT19mcmVlKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyKTsKKwkJcy0+czMtPmhhbmRzaGFrZV9idWZmZXIgPSBOVUxMOworCX0KKwlpZiAocy0+czMtPmhhbmRzaGFrZV9kZ3N0KSB7CisJCXNzbDNfZnJlZV9kaWdlc3RfbGlzdChzKTsKKwl9CQorCW1lbXNldChzLT5zMywwLHNpemVvZiAqcy0+czMpOworCXMtPnMzLT5yYnVmLmJ1ZiA9IHJwOworCXMtPnMzLT53YnVmLmJ1ZiA9IHdwOworCXMtPnMzLT5yYnVmLmxlbiA9IHJsZW47CisgCXMtPnMzLT53YnVmLmxlbiA9IHdsZW47CisKKwlzc2xfZnJlZV93YmlvX2J1ZmZlcihzKTsKKworCXMtPnBhY2tldF9sZW5ndGg9MDsKKwlzLT5zMy0+cmVuZWdvdGlhdGU9MDsKKwlzLT5zMy0+dG90YWxfcmVuZWdvdGlhdGlvbnM9MDsKKwlzLT5zMy0+bnVtX3JlbmVnb3RpYXRpb25zPTA7CisJcy0+czMtPmluX3JlYWRfYXBwX2RhdGE9MDsKKwlzLT52ZXJzaW9uPVNTTDNfVkVSU0lPTjsKKwl9CisKK2xvbmcgc3NsM19jdHJsKFNTTCAqcywgaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKQorCXsKKwlpbnQgcmV0PTA7CisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0RTQSkgfHwgIWRlZmluZWQoT1BFTlNTTF9OT19SU0EpCisJaWYgKAorI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCSAgICBjbWQgPT0gU1NMX0NUUkxfU0VUX1RNUF9SU0EgfHwKKwkgICAgY21kID09IFNTTF9DVFJMX1NFVF9UTVBfUlNBX0NCIHx8CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19EU0EKKwkgICAgY21kID09IFNTTF9DVFJMX1NFVF9UTVBfREggfHwKKwkgICAgY21kID09IFNTTF9DVFJMX1NFVF9UTVBfREhfQ0IgfHwKKyNlbmRpZgorCQkwKQorCQl7CisJCWlmICghc3NsX2NlcnRfaW5zdCgmcy0+Y2VydCkpCisJCSAgICAJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ1RSTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKDApOworCQkJfQorCQl9CisjZW5kaWYKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBTU0xfQ1RSTF9HRVRfU0VTU0lPTl9SRVVTRUQ6CisJCXJldD1zLT5oaXQ7CisJCWJyZWFrOworCWNhc2UgU1NMX0NUUkxfR0VUX0NMSUVOVF9DRVJUX1JFUVVFU1Q6CisJCWJyZWFrOworCWNhc2UgU1NMX0NUUkxfR0VUX05VTV9SRU5FR09USUFUSU9OUzoKKwkJcmV0PXMtPnMzLT5udW1fcmVuZWdvdGlhdGlvbnM7CisJCWJyZWFrOworCWNhc2UgU1NMX0NUUkxfQ0xFQVJfTlVNX1JFTkVHT1RJQVRJT05TOgorCQlyZXQ9cy0+czMtPm51bV9yZW5lZ290aWF0aW9uczsKKwkJcy0+czMtPm51bV9yZW5lZ290aWF0aW9ucz0wOworCQlicmVhazsKKwljYXNlIFNTTF9DVFJMX0dFVF9UT1RBTF9SRU5FR09USUFUSU9OUzoKKwkJcmV0PXMtPnMzLT50b3RhbF9yZW5lZ290aWF0aW9uczsKKwkJYnJlYWs7CisJY2FzZSBTU0xfQ1RSTF9HRVRfRkxBR1M6CisJCXJldD0oaW50KShzLT5zMy0+ZmxhZ3MpOworCQlicmVhazsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwljYXNlIFNTTF9DVFJMX05FRURfVE1QX1JTQToKKwkJaWYgKChzLT5jZXJ0ICE9IE5VTEwpICYmIChzLT5jZXJ0LT5yc2FfdG1wID09IE5VTEwpICYmCisJCSAgICAoKHMtPmNlcnQtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLnByaXZhdGVrZXkgPT0gTlVMTCkgfHwKKwkJICAgICAoRVZQX1BLRVlfc2l6ZShzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS5wcml2YXRla2V5KSA+ICg1MTIvOCkpKSkKKwkJCXJldCA9IDE7CisJCWJyZWFrOworCWNhc2UgU1NMX0NUUkxfU0VUX1RNUF9SU0E6CisJCXsKKwkJCVJTQSAqcnNhID0gKFJTQSAqKXBhcmc7CisJCQlpZiAocnNhID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0NUUkwsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCQkJcmV0dXJuKHJldCk7CisJCQkJfQorCQkJaWYgKChyc2EgPSBSU0FQcml2YXRlS2V5X2R1cChyc2EpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLCBFUlJfUl9SU0FfTElCKTsKKwkJCQlyZXR1cm4ocmV0KTsKKwkJCQl9CisJCQlpZiAocy0+Y2VydC0+cnNhX3RtcCAhPSBOVUxMKQorCQkJCVJTQV9mcmVlKHMtPmNlcnQtPnJzYV90bXApOworCQkJcy0+Y2VydC0+cnNhX3RtcCA9IHJzYTsKKwkJCXJldCA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX1JTQV9DQjoKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLCBFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCQlyZXR1cm4ocmV0KTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX0RIOgorCQl7CisJCQlESCAqZGggPSAoREggKilwYXJnOworCQkJaWYgKGRoID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0NUUkwsIEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCQkJcmV0dXJuKHJldCk7CisJCQkJfQorCQkJaWYgKChkaCA9IERIcGFyYW1zX2R1cChkaCkpID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0NUUkwsIEVSUl9SX0RIX0xJQik7CisJCQkJcmV0dXJuKHJldCk7CisJCQkJfQorCQkJaWYgKCEocy0+b3B0aW9ucyAmIFNTTF9PUF9TSU5HTEVfREhfVVNFKSkKKwkJCQl7CisJCQkJaWYgKCFESF9nZW5lcmF0ZV9rZXkoZGgpKQorCQkJCQl7CisJCQkJCURIX2ZyZWUoZGgpOworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLCBFUlJfUl9ESF9MSUIpOworCQkJCQlyZXR1cm4ocmV0KTsKKwkJCQkJfQorCQkJCX0KKwkJCWlmIChzLT5jZXJ0LT5kaF90bXAgIT0gTlVMTCkKKwkJCQlESF9mcmVlKHMtPmNlcnQtPmRoX3RtcCk7CisJCQlzLT5jZXJ0LT5kaF90bXAgPSBkaDsKKwkJCXJldCA9IDE7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX0RIX0NCOgorCQl7CisJCVNTTGVycihTU0xfRl9TU0wzX0NUUkwsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybihyZXQpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWNhc2UgU1NMX0NUUkxfU0VUX1RNUF9FQ0RIOgorCQl7CisJCUVDX0tFWSAqZWNkaCA9IE5VTEw7CisgCQkJCisJCWlmIChwYXJnID09IE5VTEwpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQkJcmV0dXJuKHJldCk7CisJCQl9CisJCWlmICghRUNfS0VZX3VwX3JlZigoRUNfS0VZICopcGFyZykpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLEVSUl9SX0VDREhfTElCKTsKKwkJCXJldHVybihyZXQpOworCQkJfQorCQllY2RoID0gKEVDX0tFWSAqKXBhcmc7CisJCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfU0lOR0xFX0VDREhfVVNFKSkKKwkJCXsKKwkJCWlmICghRUNfS0VZX2dlbmVyYXRlX2tleShlY2RoKSkKKwkJCQl7CisJCQkJRUNfS0VZX2ZyZWUoZWNkaCk7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ1RSTCxFUlJfUl9FQ0RIX0xJQik7CisJCQkJcmV0dXJuKHJldCk7CisJCQkJfQorCQkJfQorCQlpZiAocy0+Y2VydC0+ZWNkaF90bXAgIT0gTlVMTCkKKwkJCUVDX0tFWV9mcmVlKHMtPmNlcnQtPmVjZGhfdG1wKTsKKwkJcy0+Y2VydC0+ZWNkaF90bXAgPSBlY2RoOworCQlyZXQgPSAxOworCQl9CisJCWJyZWFrOworCWNhc2UgU1NMX0NUUkxfU0VUX1RNUF9FQ0RIX0NCOgorCQl7CisJCVNTTGVycihTU0xfRl9TU0wzX0NUUkwsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybihyZXQpOworCQl9CisJCWJyZWFrOworI2VuZGlmIC8qICFPUEVOU1NMX05PX0VDREggKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwljYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfSE9TVE5BTUU6CisgCQlpZiAobGFyZyA9PSBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lKQorCQkJeworCQkJaWYgKHMtPnRsc2V4dF9ob3N0bmFtZSAhPSBOVUxMKSAKKwkJCQlPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X2hvc3RuYW1lKTsKKwkJCXMtPnRsc2V4dF9ob3N0bmFtZSA9IE5VTEw7CisKKwkJCXJldCA9IDE7CisJCQlpZiAocGFyZyA9PSBOVUxMKSAKKwkJCQlicmVhazsKKwkJCWlmIChzdHJsZW4oKGNoYXIgKilwYXJnKSA+IFRMU0VYVF9NQVhMRU5faG9zdF9uYW1lKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLCBTU0xfUl9TU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUUpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWlmICgocy0+dGxzZXh0X2hvc3RuYW1lID0gQlVGX3N0cmR1cCgoY2hhciAqKXBhcmcpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQllbHNlCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFJMLCBTU0xfUl9TU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUVfVFlQRSk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKyAJCWJyZWFrOworCWNhc2UgU1NMX0NUUkxfU0VUX1RMU0VYVF9ERUJVR19BUkc6CisJCXMtPnRsc2V4dF9kZWJ1Z19hcmc9cGFyZzsKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisKKyNpZmRlZiBUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0CisJY2FzZSBTU0xfQ1RSTF9TRVRfVExTRVhUX09QQVFVRV9QUkZfSU5QVVQ6CisJCWlmIChsYXJnID4gMTIyODgpIC8qIGFjdHVhbCBpbnRlcm5hbCBsaW1pdCBpcyAyXjE2IGZvciB0aGUgY29tcGxldGUgaGVsbG8gbWVzc2FnZQorCQkgICAgICAgICAgICAgICAgICAgKiAoaW5jbHVkaW5nIHRoZSBjZXJ0IGNoYWluIGFuZCBldmVyeXRoaW5nKSAqLworCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ1RSTCwgU1NMX1JfT1BBUVVFX1BSRl9JTlBVVF9UT09fTE9ORyk7CisJCQlicmVhazsKKwkJCX0KKwkJaWYgKHMtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpCisJCQlPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQpOworCQlpZiAoKHNpemVfdClsYXJnID09IDApCisJCQlzLT50bHNleHRfb3BhcXVlX3ByZl9pbnB1dCA9IE9QRU5TU0xfbWFsbG9jKDEpOyAvKiBkdW1teSBieXRlIGp1c3QgdG8gZ2V0IG5vbi1OVUxMICovCisJCWVsc2UKKwkJCXMtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0ID0gQlVGX21lbWR1cChwYXJnLCAoc2l6ZV90KWxhcmcpOworCQlpZiAocy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCkKKwkJCXsKKwkJCXMtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2xlbiA9IChzaXplX3QpbGFyZzsKKwkJCXJldCA9IDE7CisJCQl9CisJCWVsc2UKKwkJCXMtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2xlbiA9IDA7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9UWVBFOgorCQlzLT50bHNleHRfc3RhdHVzX3R5cGU9bGFyZzsKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNTTF9DVFJMX0dFVF9UTFNFWFRfU1RBVFVTX1JFUV9FWFRTOgorCQkqKFNUQUNLX09GKFg1MDlfRVhURU5TSU9OKSAqKilwYXJnID0gcy0+dGxzZXh0X29jc3BfZXh0czsKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9FWFRTOgorCQlzLT50bHNleHRfb2NzcF9leHRzID0gcGFyZzsKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNTTF9DVFJMX0dFVF9UTFNFWFRfU1RBVFVTX1JFUV9JRFM6CisJCSooU1RBQ0tfT0YoT0NTUF9SRVNQSUQpICoqKXBhcmcgPSBzLT50bHNleHRfb2NzcF9pZHM7CisJCXJldCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfSURTOgorCQlzLT50bHNleHRfb2NzcF9pZHMgPSBwYXJnOworCQlyZXQgPSAxOworCQlicmVhazsKKworCWNhc2UgU1NMX0NUUkxfR0VUX1RMU0VYVF9TVEFUVVNfUkVRX09DU1BfUkVTUDoKKwkJKih1bnNpZ25lZCBjaGFyICoqKXBhcmcgPSBzLT50bHNleHRfb2NzcF9yZXNwOworCQlyZXR1cm4gcy0+dGxzZXh0X29jc3BfcmVzcGxlbjsKKwkJCisJY2FzZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfT0NTUF9SRVNQOgorCQlpZiAocy0+dGxzZXh0X29jc3BfcmVzcCkKKwkJCU9QRU5TU0xfZnJlZShzLT50bHNleHRfb2NzcF9yZXNwKTsKKwkJcy0+dGxzZXh0X29jc3BfcmVzcCA9IHBhcmc7CisJCXMtPnRsc2V4dF9vY3NwX3Jlc3BsZW4gPSBsYXJnOworCQlyZXQgPSAxOworCQlicmVhazsKKworI2VuZGlmIC8qICFPUEVOU1NMX05PX1RMU0VYVCAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitsb25nIHNzbDNfY2FsbGJhY2tfY3RybChTU0wgKnMsIGludCBjbWQsIHZvaWQgKCpmcCkodm9pZCkpCisJeworCWludCByZXQ9MDsKKworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fRFNBKSB8fCAhZGVmaW5lZChPUEVOU1NMX05PX1JTQSkKKwlpZiAoCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJICAgIGNtZCA9PSBTU0xfQ1RSTF9TRVRfVE1QX1JTQV9DQiB8fAorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJICAgIGNtZCA9PSBTU0xfQ1RSTF9TRVRfVE1QX0RIX0NCIHx8CisjZW5kaWYKKwkJMCkKKwkJeworCQlpZiAoIXNzbF9jZXJ0X2luc3QoJnMtPmNlcnQpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ0FMTEJBQ0tfQ1RSTCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKDApOworCQkJfQorCQl9CisjZW5kaWYKKworCXN3aXRjaCAoY21kKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX1JTQV9DQjoKKwkJeworCQlzLT5jZXJ0LT5yc2FfdG1wX2NiID0gKFJTQSAqKCopKFNTTCAqLCBpbnQsIGludCkpZnA7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCWNhc2UgU1NMX0NUUkxfU0VUX1RNUF9ESF9DQjoKKwkJeworCQlzLT5jZXJ0LT5kaF90bXBfY2IgPSAoREggKigqKShTU0wgKiwgaW50LCBpbnQpKWZwOworCQl9CisJCWJyZWFrOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWNhc2UgU1NMX0NUUkxfU0VUX1RNUF9FQ0RIX0NCOgorCQl7CisJCXMtPmNlcnQtPmVjZGhfdG1wX2NiID0gKEVDX0tFWSAqKCopKFNTTCAqLCBpbnQsIGludCkpZnA7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwljYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfREVCVUdfQ0I6CisJCXMtPnRsc2V4dF9kZWJ1Z19jYj0odm9pZCAoKikoU1NMICosaW50ICxpbnQsCisJCQkJCXVuc2lnbmVkIGNoYXIgKiwgaW50LCB2b2lkICopKWZwOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCWJyZWFrOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitsb25nIHNzbDNfY3R4X2N0cmwoU1NMX0NUWCAqY3R4LCBpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpCisJeworCUNFUlQgKmNlcnQ7CisKKwljZXJ0PWN0eC0+Y2VydDsKKworCXN3aXRjaCAoY21kKQorCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJY2FzZSBTU0xfQ1RSTF9ORUVEX1RNUF9SU0E6CisJCWlmICgJKGNlcnQtPnJzYV90bXAgPT0gTlVMTCkgJiYKKwkJCSgoY2VydC0+cGtleXNbU1NMX1BLRVlfUlNBX0VOQ10ucHJpdmF0ZWtleSA9PSBOVUxMKSB8fAorCQkJIChFVlBfUEtFWV9zaXplKGNlcnQtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLnByaXZhdGVrZXkpID4gKDUxMi84KSkpCisJCQkpCisJCQlyZXR1cm4oMSk7CisJCWVsc2UKKwkJCXJldHVybigwKTsKKwkJLyogYnJlYWs7ICovCisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX1JTQToKKwkJeworCQlSU0EgKnJzYTsKKwkJaW50IGk7CisKKwkJcnNhPShSU0EgKilwYXJnOworCQlpPTE7CisJCWlmIChyc2EgPT0gTlVMTCkKKwkJCWk9MDsKKwkJZWxzZQorCQkJeworCQkJaWYgKChyc2E9UlNBUHJpdmF0ZUtleV9kdXAocnNhKSkgPT0gTlVMTCkKKwkJCQlpPTA7CisJCQl9CisJCWlmICghaSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0NUWF9DVFJMLEVSUl9SX1JTQV9MSUIpOworCQkJcmV0dXJuKDApOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoY2VydC0+cnNhX3RtcCAhPSBOVUxMKQorCQkJCVJTQV9mcmVlKGNlcnQtPnJzYV90bXApOworCQkJY2VydC0+cnNhX3RtcD1yc2E7CisJCQlyZXR1cm4oMSk7CisJCQl9CisJCX0KKwkJLyogYnJlYWs7ICovCisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX1JTQV9DQjoKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFhfQ1RSTCwgRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwkJcmV0dXJuKDApOworCQl9CisJCWJyZWFrOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwljYXNlIFNTTF9DVFJMX1NFVF9UTVBfREg6CisJCXsKKwkJREggKm5ldz1OVUxMLCpkaDsKKworCQlkaD0oREggKilwYXJnOworCQlpZiAoKG5ldz1ESHBhcmFtc19kdXAoZGgpKSA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ1RYX0NUUkwsRVJSX1JfREhfTElCKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlpZiAoIShjdHgtPm9wdGlvbnMgJiBTU0xfT1BfU0lOR0xFX0RIX1VTRSkpCisJCQl7CisJCQlpZiAoIURIX2dlbmVyYXRlX2tleShuZXcpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19DVFhfQ1RSTCxFUlJfUl9ESF9MSUIpOworCQkJCURIX2ZyZWUobmV3KTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCWlmIChjZXJ0LT5kaF90bXAgIT0gTlVMTCkKKwkJCURIX2ZyZWUoY2VydC0+ZGhfdG1wKTsKKwkJY2VydC0+ZGhfdG1wPW5ldzsKKwkJcmV0dXJuIDE7CisJCX0KKwkJLypicmVhazsgKi8KKwljYXNlIFNTTF9DVFJMX1NFVF9UTVBfREhfQ0I6CisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfQ1RYX0NUUkwsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybigwKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwljYXNlIFNTTF9DVFJMX1NFVF9UTVBfRUNESDoKKwkJeworCQlFQ19LRVkgKmVjZGggPSBOVUxMOworIAkJCQorCQlpZiAocGFyZyA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ1RYX0NUUkwsRVJSX1JfRUNESF9MSUIpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWVjZGggPSBFQ19LRVlfZHVwKChFQ19LRVkgKilwYXJnKTsKKwkJaWYgKGVjZGggPT0gTlVMTCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0NUWF9DVFJMLEVSUl9SX0VDX0xJQik7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJaWYgKCEoY3R4LT5vcHRpb25zICYgU1NMX09QX1NJTkdMRV9FQ0RIX1VTRSkpCisJCQl7CisJCQlpZiAoIUVDX0tFWV9nZW5lcmF0ZV9rZXkoZWNkaCkpCisJCQkJeworCQkJCUVDX0tFWV9mcmVlKGVjZGgpOworCQkJCVNTTGVycihTU0xfRl9TU0wzX0NUWF9DVFJMLEVSUl9SX0VDREhfTElCKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisKKwkJaWYgKGNlcnQtPmVjZGhfdG1wICE9IE5VTEwpCisJCQl7CisJCQlFQ19LRVlfZnJlZShjZXJ0LT5lY2RoX3RtcCk7CisJCQl9CisJCWNlcnQtPmVjZGhfdG1wID0gZWNkaDsKKwkJcmV0dXJuIDE7CisJCX0KKwkJLyogYnJlYWs7ICovCisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX0VDREhfQ0I6CisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfQ1RYX0NUUkwsIEVSUl9SX1NIT1VMRF9OT1RfSEFWRV9CRUVOX0NBTExFRCk7CisJCXJldHVybigwKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZiAvKiAhT1BFTlNTTF9OT19FQ0RIICovCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJY2FzZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHOgorCQljdHgtPnRsc2V4dF9zZXJ2ZXJuYW1lX2FyZz1wYXJnOworCQlicmVhazsKKwljYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfVElDS0VUX0tFWVM6CisJY2FzZSBTU0xfQ1RSTF9HRVRfVExTRVhUX1RJQ0tFVF9LRVlTOgorCQl7CisJCXVuc2lnbmVkIGNoYXIgKmtleXMgPSBwYXJnOworCQlpZiAoIWtleXMpCisJCQlyZXR1cm4gNDg7CisJCWlmIChsYXJnICE9IDQ4KQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfQ1RYX0NUUkwsIFNTTF9SX0lOVkFMSURfVElDS0VUX0tFWVNfTEVOR1RIKTsKKwkJCXJldHVybiAwOworCQkJfQorCQlpZiAoY21kID09IFNTTF9DVFJMX1NFVF9UTFNFWFRfVElDS0VUX0tFWVMpCisJCQl7CisJCQltZW1jcHkoY3R4LT50bHNleHRfdGlja19rZXlfbmFtZSwga2V5cywgMTYpOworCQkJbWVtY3B5KGN0eC0+dGxzZXh0X3RpY2tfaG1hY19rZXksIGtleXMgKyAxNiwgMTYpOworCQkJbWVtY3B5KGN0eC0+dGxzZXh0X3RpY2tfYWVzX2tleSwga2V5cyArIDMyLCAxNik7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCW1lbWNweShrZXlzLCBjdHgtPnRsc2V4dF90aWNrX2tleV9uYW1lLCAxNik7CisJCQltZW1jcHkoa2V5cyArIDE2LCBjdHgtPnRsc2V4dF90aWNrX2htYWNfa2V5LCAxNik7CisJCQltZW1jcHkoa2V5cyArIDMyLCBjdHgtPnRsc2V4dF90aWNrX2Flc19rZXksIDE2KTsKKwkJCX0KKwkJcmV0dXJuIDE7CisJCX0KKworI2lmZGVmIFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQKKwljYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfT1BBUVVFX1BSRl9JTlBVVF9DQl9BUkc6CisJCWN0eC0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnID0gcGFyZzsKKwkJcmV0dXJuIDE7CisjZW5kaWYKKworCWNhc2UgU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX0NCX0FSRzoKKwkJY3R4LT50bHNleHRfc3RhdHVzX2FyZz1wYXJnOworCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisKKyNlbmRpZiAvKiAhT1BFTlNTTF9OT19UTFNFWFQgKi8KKworCS8qIEEgVGhhd3RlIHNwZWNpYWwgOi0pICovCisJY2FzZSBTU0xfQ1RSTF9FWFRSQV9DSEFJTl9DRVJUOgorCQlpZiAoY3R4LT5leHRyYV9jZXJ0cyA9PSBOVUxMKQorCQkJeworCQkJaWYgKChjdHgtPmV4dHJhX2NlcnRzPXNrX1g1MDlfbmV3X251bGwoKSkgPT0gTlVMTCkKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCXNrX1g1MDlfcHVzaChjdHgtPmV4dHJhX2NlcnRzLChYNTA5ICopcGFyZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuKDApOworCQl9CisJcmV0dXJuKDEpOworCX0KKworbG9uZyBzc2wzX2N0eF9jYWxsYmFja19jdHJsKFNTTF9DVFggKmN0eCwgaW50IGNtZCwgdm9pZCAoKmZwKSh2b2lkKSkKKwl7CisJQ0VSVCAqY2VydDsKKworCWNlcnQ9Y3R4LT5jZXJ0OworCisJc3dpdGNoIChjbWQpCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwljYXNlIFNTTF9DVFJMX1NFVF9UTVBfUlNBX0NCOgorCQl7CisJCWNlcnQtPnJzYV90bXBfY2IgPSAoUlNBICooKikoU1NMICosIGludCwgaW50KSlmcDsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX0RIX0NCOgorCQl7CisJCWNlcnQtPmRoX3RtcF9jYiA9IChESCAqKCopKFNTTCAqLCBpbnQsIGludCkpZnA7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJY2FzZSBTU0xfQ1RSTF9TRVRfVE1QX0VDREhfQ0I6CisJCXsKKwkJY2VydC0+ZWNkaF90bXBfY2IgPSAoRUNfS0VZICooKikoU1NMICosIGludCwgaW50KSlmcDsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCWNhc2UgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0NCOgorCQljdHgtPnRsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrPShpbnQgKCopKFNTTCAqLGludCAqLHZvaWQgKikpZnA7CisJCWJyZWFrOworCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorCWNhc2UgU1NMX0NUUkxfU0VUX1RMU0VYVF9PUEFRVUVfUFJGX0lOUFVUX0NCOgorCQljdHgtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrID0gKGludCAoKikoU1NMICosdm9pZCAqLCBzaXplX3QsIHZvaWQgKikpZnA7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9DQjoKKwkJY3R4LT50bHNleHRfc3RhdHVzX2NiPShpbnQgKCopKFNTTCAqLHZvaWQgKikpZnA7CisJCWJyZWFrOworCisJY2FzZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1RJQ0tFVF9LRVlfQ0I6CisJCWN0eC0+dGxzZXh0X3RpY2tldF9rZXlfY2I9KGludCAoKikoU1NMICosdW5zaWduZWQgY2hhciAgKiwKKwkJCQkJCXVuc2lnbmVkIGNoYXIgKiwKKwkJCQkJCUVWUF9DSVBIRVJfQ1RYICosCisJCQkJCQlITUFDX0NUWCAqLCBpbnQpKWZwOworCQlicmVhazsKKworI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuKDApOworCQl9CisJcmV0dXJuKDEpOworCX0KKworLyogVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBjaGVjayBpZiB0aGUgY2lwaGVycyByZXF1aXJlZCBhcmUgYWN0dWFsbHkKKyAqIGF2YWlsYWJsZSAqLworY29uc3QgU1NMX0NJUEhFUiAqc3NsM19nZXRfY2lwaGVyX2J5X2NoYXIoY29uc3QgdW5zaWduZWQgY2hhciAqcCkKKwl7CisJU1NMX0NJUEhFUiBjOworCWNvbnN0IFNTTF9DSVBIRVIgKmNwOworCXVuc2lnbmVkIGxvbmcgaWQ7CisKKwlpZD0weDAzMDAwMDAwTHwoKHVuc2lnbmVkIGxvbmcpcFswXTw8OEwpfCh1bnNpZ25lZCBsb25nKXBbMV07CisJYy5pZD1pZDsKKwljcCA9IE9CSl9ic2VhcmNoX3NzbF9jaXBoZXJfaWQoJmMsIHNzbDNfY2lwaGVycywgU1NMM19OVU1fQ0lQSEVSUyk7CisJaWYgKGNwID09IE5VTEwgfHwgY3AtPnZhbGlkID09IDApCisJCXJldHVybiBOVUxMOworCWVsc2UKKwkJcmV0dXJuIGNwOworCX0KKworaW50IHNzbDNfcHV0X2NpcGhlcl9ieV9jaGFyKGNvbnN0IFNTTF9DSVBIRVIgKmMsIHVuc2lnbmVkIGNoYXIgKnApCisJeworCWxvbmcgbDsKKworCWlmIChwICE9IE5VTEwpCisJCXsKKwkJbD1jLT5pZDsKKwkJaWYgKChsICYgMHhmZjAwMDAwMCkgIT0gMHgwMzAwMDAwMCkgcmV0dXJuKDApOworCQlwWzBdPSgodW5zaWduZWQgY2hhcikobD4+IDhMKSkmMHhGRjsKKwkJcFsxXT0oKHVuc2lnbmVkIGNoYXIpKGwgICAgICkpJjB4RkY7CisJCX0KKwlyZXR1cm4oMik7CisJfQorCitTU0xfQ0lQSEVSICpzc2wzX2Nob29zZV9jaXBoZXIoU1NMICpzLCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2xudCwKKwkgICAgIFNUQUNLX09GKFNTTF9DSVBIRVIpICpzcnZyKQorCXsKKwlTU0xfQ0lQSEVSICpjLCpyZXQ9TlVMTDsKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqcHJpbywgKmFsbG93OworCWludCBpLGlpLG9rOworI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fVExTRVhUKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX0VDKQorCXVuc2lnbmVkIGludCBqOworCWludCBlY19vaywgZWNfbmlkOworCXVuc2lnbmVkIGNoYXIgZWNfc2VhcmNoMSA9IDAsIGVjX3NlYXJjaDIgPSAwOworI2VuZGlmCisJQ0VSVCAqY2VydDsKKwl1bnNpZ25lZCBsb25nIGFsZ19rLGFsZ19hLG1hc2tfayxtYXNrX2EsZW1hc2tfayxlbWFza19hOworCisJLyogTGV0J3Mgc2VlIHdoaWNoIGNpcGhlcnMgd2UgY2FuIHN1cHBvcnQgKi8KKwljZXJ0PXMtPmNlcnQ7CisKKyNpZiAwCisJLyogRG8gbm90IHNldCB0aGUgY29tcGFyZSBmdW5jdGlvbnMsIGJlY2F1c2UgdGhpcyBtYXkgbGVhZCB0byBhCisJICogcmVvcmRlcmluZyBieSAiaWQiLiBXZSB3YW50IHRvIGtlZXAgdGhlIG9yaWdpbmFsIG9yZGVyaW5nLgorCSAqIFdlIG1heSBwYXkgYSBwcmljZSBpbiBwZXJmb3JtYW5jZSBkdXJpbmcgc2tfU1NMX0NJUEhFUl9maW5kKCksCisJICogYnV0IHdvdWxkIGhhdmUgdG8gcGF5IHdpdGggdGhlIHByaWNlIG9mIHNrX1NTTF9DSVBIRVJfZHVwKCkuCisJICovCisJc2tfU1NMX0NJUEhFUl9zZXRfY21wX2Z1bmMoc3J2ciwgc3NsX2NpcGhlcl9wdHJfaWRfY21wKTsKKwlza19TU0xfQ0lQSEVSX3NldF9jbXBfZnVuYyhjbG50LCBzc2xfY2lwaGVyX3B0cl9pZF9jbXApOworI2VuZGlmCisKKyNpZmRlZiBDSVBIRVJfREVCVUcKKwlwcmludGYoIlNlcnZlciBoYXMgJWQgZnJvbSAlcDpcbiIsIHNrX1NTTF9DSVBIRVJfbnVtKHNydnIpLCAodm9pZCAqKXNydnIpOworCWZvcihpPTAgOyBpIDwgc2tfU1NMX0NJUEhFUl9udW0oc3J2cikgOyArK2kpCisJCXsKKwkJYz1za19TU0xfQ0lQSEVSX3ZhbHVlKHNydnIsaSk7CisJCXByaW50ZigiJXA6JXNcbiIsKHZvaWQgKiljLGMtPm5hbWUpOworCQl9CisJcHJpbnRmKCJDbGllbnQgc2VudCAlZCBmcm9tICVwOlxuIiwgc2tfU1NMX0NJUEhFUl9udW0oY2xudCksICh2b2lkICopY2xudCk7CisJZm9yKGk9MCA7IGkgPCBza19TU0xfQ0lQSEVSX251bShjbG50KSA7ICsraSkKKwkgICAgeworCSAgICBjPXNrX1NTTF9DSVBIRVJfdmFsdWUoY2xudCxpKTsKKwkgICAgcHJpbnRmKCIlcDolc1xuIiwodm9pZCAqKWMsYy0+bmFtZSk7CisJICAgIH0KKyNlbmRpZgorCisJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfQ0lQSEVSX1NFUlZFUl9QUkVGRVJFTkNFKQorCQl7CisJCXByaW8gPSBzcnZyOworCQlhbGxvdyA9IGNsbnQ7CisJCX0KKwllbHNlCisJCXsKKwkJcHJpbyA9IGNsbnQ7CisJCWFsbG93ID0gc3J2cjsKKwkJfQorCisJZm9yIChpPTA7IGk8c2tfU1NMX0NJUEhFUl9udW0ocHJpbyk7IGkrKykKKwkJeworCQljPXNrX1NTTF9DSVBIRVJfdmFsdWUocHJpbyxpKTsKKworCQlzc2xfc2V0X2NlcnRfbWFza3MoY2VydCxjKTsKKwkJbWFza19rID0gY2VydC0+bWFza19rOworCQltYXNrX2EgPSBjZXJ0LT5tYXNrX2E7CisJCWVtYXNrX2sgPSBjZXJ0LT5leHBvcnRfbWFza19rOworCQllbWFza19hID0gY2VydC0+ZXhwb3J0X21hc2tfYTsKKwkJCQorI2lmZGVmIEtTU0xfREVCVUcKKy8qCQlwcmludGYoInNzbDNfY2hvb3NlX2NpcGhlciAlZCBhbGc9ICVseFxuIiwgaSxjLT5hbGdvcml0aG1zKTsqLworI2VuZGlmICAgIC8qIEtTU0xfREVCVUcgKi8KKworCQlhbGdfaz1jLT5hbGdvcml0aG1fbWtleTsKKwkJYWxnX2E9Yy0+YWxnb3JpdGhtX2F1dGg7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisJCWlmIChhbGdfayAmIFNTTF9rS1JCNSkKKwkJCXsKKwkJCWlmICggIWtzc2xfa2V5dGFiX2lzX2F2YWlsYWJsZShzLT5rc3NsX2N0eCkgKQorCQkJICAgIGNvbnRpbnVlOworCQkJfQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fS1JCNSAqLworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCQkvKiB3aXRoIFBTSyB0aGVyZSBtdXN0IGJlIHNlcnZlciBjYWxsYmFjayBzZXQgKi8KKwkJaWYgKChhbGdfayAmIFNTTF9rUFNLKSAmJiBzLT5wc2tfc2VydmVyX2NhbGxiYWNrID09IE5VTEwpCisJCQljb250aW51ZTsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1BTSyAqLworCisJCWlmIChTU0xfQ19JU19FWFBPUlQoYykpCisJCQl7CisJCQlvayA9IChhbGdfayAmIGVtYXNrX2spICYmIChhbGdfYSAmIGVtYXNrX2EpOworI2lmZGVmIENJUEhFUl9ERUJVRworCQkJcHJpbnRmKCIlZDpbJTA4bFg6JTA4bFg6JTA4bFg6JTA4bFhdJXA6JXMgKGV4cG9ydClcbiIsb2ssYWxnX2ssYWxnX2EsZW1hc2tfayxlbWFza19hLAorCQkJICAgICAgICh2b2lkICopYyxjLT5uYW1lKTsKKyNlbmRpZgorCQkJfQorCQllbHNlCisJCQl7CisJCQlvayA9IChhbGdfayAmIG1hc2tfaykgJiYgKGFsZ19hICYgbWFza19hKTsKKyNpZmRlZiBDSVBIRVJfREVCVUcKKwkJCXByaW50ZigiJWQ6WyUwOGxYOiUwOGxYOiUwOGxYOiUwOGxYXSVwOiVzXG4iLG9rLGFsZ19rLGFsZ19hLG1hc2tfayxtYXNrX2EsKHZvaWQgKiljLAorCQkJICAgICAgIGMtPm5hbWUpOworI2VuZGlmCisJCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCQlpZiAoCisJCQkvKiBpZiB3ZSBhcmUgY29uc2lkZXJpbmcgYW4gRUNDIGNpcGhlciBzdWl0ZSB0aGF0IHVzZXMgb3VyIGNlcnRpZmljYXRlICovCisJCQkoYWxnX2EgJiBTU0xfYUVDRFNBIHx8IGFsZ19hICYgU1NMX2FFQ0RIKQorCQkJLyogYW5kIHdlIGhhdmUgYW4gRUNDIGNlcnRpZmljYXRlICovCisJCQkmJiAocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfRUNDXS54NTA5ICE9IE5VTEwpCisJCQkvKiBhbmQgdGhlIGNsaWVudCBzcGVjaWZpZWQgYSBTdXBwb3J0ZWQgUG9pbnQgRm9ybWF0cyBleHRlbnNpb24gKi8KKwkJCSYmICgocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA+IDApICYmIChzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgIT0gTlVMTCkpCisJCQkvKiBhbmQgb3VyIGNlcnRpZmljYXRlJ3MgcG9pbnQgaXMgY29tcHJlc3NlZCAqLworCQkJJiYgKAorCQkJCShzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLng1MDktPmNlcnRfaW5mbyAhPSBOVUxMKQorCQkJCSYmIChzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLng1MDktPmNlcnRfaW5mby0+a2V5ICE9IE5VTEwpCisJCQkJJiYgKHMtPmNlcnQtPnBrZXlzW1NTTF9QS0VZX0VDQ10ueDUwOS0+Y2VydF9pbmZvLT5rZXktPnB1YmxpY19rZXkgIT0gTlVMTCkKKwkJCQkmJiAocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfRUNDXS54NTA5LT5jZXJ0X2luZm8tPmtleS0+cHVibGljX2tleS0+ZGF0YSAhPSBOVUxMKQorCQkJCSYmICgKKwkJCQkJKCoocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfRUNDXS54NTA5LT5jZXJ0X2luZm8tPmtleS0+cHVibGljX2tleS0+ZGF0YSkgPT0gUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VEKQorCQkJCQl8fCAoKihzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLng1MDktPmNlcnRfaW5mby0+a2V5LT5wdWJsaWNfa2V5LT5kYXRhKSA9PSBQT0lOVF9DT05WRVJTSU9OX0NPTVBSRVNTRUQgKyAxKQorCQkJCQkpCisJCQkJKQorCQkpCisJCQl7CisJCQllY19vayA9IDA7CisJCQkvKiBpZiBvdXIgY2VydGlmaWNhdGUncyBjdXJ2ZSBpcyBvdmVyIGEgZmllbGQgdHlwZSB0aGF0IHRoZSBjbGllbnQgZG9lcyBub3Qgc3VwcG9ydAorCQkJICogdGhlbiBkbyBub3QgYWxsb3cgdGhpcyBjaXBoZXIgc3VpdGUgdG8gYmUgbmVnb3RpYXRlZCAqLworCQkJaWYgKAorCQkJCShzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLnByaXZhdGVrZXktPnBrZXkuZWMgIT0gTlVMTCkKKwkJCQkmJiAocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfRUNDXS5wcml2YXRla2V5LT5wa2V5LmVjLT5ncm91cCAhPSBOVUxMKQorCQkJCSYmIChzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLnByaXZhdGVrZXktPnBrZXkuZWMtPmdyb3VwLT5tZXRoICE9IE5VTEwpCisJCQkJJiYgKEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZShzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLnByaXZhdGVrZXktPnBrZXkuZWMtPmdyb3VwLT5tZXRoKSA9PSBOSURfWDlfNjJfcHJpbWVfZmllbGQpCisJCQkpCisJCQkJeworCQkJCWZvciAoaiA9IDA7IGogPCBzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOyBqKyspCisJCQkJCXsKKwkJCQkJaWYgKHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdFtqXSA9PSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9hbnNpWDk2Ml9jb21wcmVzc2VkX3ByaW1lKQorCQkJCQkJeworCQkJCQkJZWNfb2sgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQllbHNlIGlmIChFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfRUNDXS5wcml2YXRla2V5LT5wa2V5LmVjLT5ncm91cC0+bWV0aCkgPT0gTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCkKKwkJCQl7CisJCQkJZm9yIChqID0gMDsgaiA8IHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGg7IGorKykKKwkJCQkJeworCQkJCQlpZiAocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0W2pdID09IFRMU0VYVF9FQ1BPSU5URk9STUFUX2Fuc2lYOTYyX2NvbXByZXNzZWRfY2hhcjIpCisJCQkJCQl7CisJCQkJCQllY19vayA9IDE7CisJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCW9rID0gb2sgJiYgZWNfb2s7CisJCQl9CisJCWlmICgKKwkJCS8qIGlmIHdlIGFyZSBjb25zaWRlcmluZyBhbiBFQ0MgY2lwaGVyIHN1aXRlIHRoYXQgdXNlcyBvdXIgY2VydGlmaWNhdGUgKi8KKwkJCShhbGdfYSAmIFNTTF9hRUNEU0EgfHwgYWxnX2EgJiBTU0xfYUVDREgpCisJCQkvKiBhbmQgd2UgaGF2ZSBhbiBFQ0MgY2VydGlmaWNhdGUgKi8KKwkJCSYmIChzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLng1MDkgIT0gTlVMTCkKKwkJCS8qIGFuZCB0aGUgY2xpZW50IHNwZWNpZmllZCBhbiBFbGxpcHRpY0N1cnZlcyBleHRlbnNpb24gKi8KKwkJCSYmICgocy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA+IDApICYmIChzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QgIT0gTlVMTCkpCisJCSkKKwkJCXsKKwkJCWVjX29rID0gMDsKKwkJCWlmICgKKwkJCQkocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfRUNDXS5wcml2YXRla2V5LT5wa2V5LmVjICE9IE5VTEwpCisJCQkJJiYgKHMtPmNlcnQtPnBrZXlzW1NTTF9QS0VZX0VDQ10ucHJpdmF0ZWtleS0+cGtleS5lYy0+Z3JvdXAgIT0gTlVMTCkKKwkJCSkKKwkJCQl7CisJCQkJZWNfbmlkID0gRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfRUNDXS5wcml2YXRla2V5LT5wa2V5LmVjLT5ncm91cCk7CisJCQkJaWYgKChlY19uaWQgPT0gMCkKKwkJCQkJJiYgKHMtPmNlcnQtPnBrZXlzW1NTTF9QS0VZX0VDQ10ucHJpdmF0ZWtleS0+cGtleS5lYy0+Z3JvdXAtPm1ldGggIT0gTlVMTCkKKwkJCQkpCisJCQkJCXsKKwkJCQkJaWYgKEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZShzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLnByaXZhdGVrZXktPnBrZXkuZWMtPmdyb3VwLT5tZXRoKSA9PSBOSURfWDlfNjJfcHJpbWVfZmllbGQpCisJCQkJCQl7CisJCQkJCQllY19zZWFyY2gxID0gMHhGRjsKKwkJCQkJCWVjX3NlYXJjaDIgPSAweDAxOworCQkJCQkJfQorCQkJCQllbHNlIGlmIChFQ19NRVRIT0RfZ2V0X2ZpZWxkX3R5cGUocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfRUNDXS5wcml2YXRla2V5LT5wa2V5LmVjLT5ncm91cC0+bWV0aCkgPT0gTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCkKKwkJCQkJCXsKKwkJCQkJCWVjX3NlYXJjaDEgPSAweEZGOworCQkJCQkJZWNfc2VhcmNoMiA9IDB4MDI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJZWNfc2VhcmNoMSA9IDB4MDA7CisJCQkJCWVjX3NlYXJjaDIgPSB0bHMxX2VjX25pZDJjdXJ2ZV9pZChlY19uaWQpOworCQkJCQl9CisJCQkJaWYgKChlY19zZWFyY2gxICE9IDApIHx8IChlY19zZWFyY2gyICE9IDApKQorCQkJCQl7CisJCQkJCWZvciAoaiA9IDA7IGogPCBzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoIC8gMjsgaisrKQorCQkJCQkJeworCQkJCQkJaWYgKChzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RbMipqXSA9PSBlY19zZWFyY2gxKSAmJiAocy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0WzIqaisxXSA9PSBlY19zZWFyY2gyKSkKKwkJCQkJCQl7CisJCQkJCQkJZWNfb2sgPSAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCW9rID0gb2sgJiYgZWNfb2s7CisJCQl9CisJCWlmICgKKwkJCS8qIGlmIHdlIGFyZSBjb25zaWRlcmluZyBhbiBFQ0MgY2lwaGVyIHN1aXRlIHRoYXQgdXNlcyBhbiBlcGhlbWVyYWwgRUMga2V5ICovCisJCQkoYWxnX2sgJiBTU0xfa0VFQ0RIKQorCQkJLyogYW5kIHdlIGhhdmUgYW4gZXBoZW1lcmFsIEVDIGtleSAqLworCQkJJiYgKHMtPmNlcnQtPmVjZGhfdG1wICE9IE5VTEwpCisJCQkvKiBhbmQgdGhlIGNsaWVudCBzcGVjaWZpZWQgYW4gRWxsaXB0aWNDdXJ2ZXMgZXh0ZW5zaW9uICovCisJCQkmJiAoKHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGggPiAwKSAmJiAocy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0ICE9IE5VTEwpKQorCQkpCisJCQl7CisJCQllY19vayA9IDA7CisJCQlpZiAocy0+Y2VydC0+ZWNkaF90bXAtPmdyb3VwICE9IE5VTEwpCisJCQkJeworCQkJCWVjX25pZCA9IEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKHMtPmNlcnQtPmVjZGhfdG1wLT5ncm91cCk7CisJCQkJaWYgKChlY19uaWQgPT0gMCkKKwkJCQkJJiYgKHMtPmNlcnQtPmVjZGhfdG1wLT5ncm91cC0+bWV0aCAhPSBOVUxMKQorCQkJCSkKKwkJCQkJeworCQkJCQlpZiAoRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKHMtPmNlcnQtPmVjZGhfdG1wLT5ncm91cC0+bWV0aCkgPT0gTklEX1g5XzYyX3ByaW1lX2ZpZWxkKQorCQkJCQkJeworCQkJCQkJZWNfc2VhcmNoMSA9IDB4RkY7CisJCQkJCQllY19zZWFyY2gyID0gMHgwMTsKKwkJCQkJCX0KKwkJCQkJZWxzZSBpZiAoRUNfTUVUSE9EX2dldF9maWVsZF90eXBlKHMtPmNlcnQtPmVjZGhfdG1wLT5ncm91cC0+bWV0aCkgPT0gTklEX1g5XzYyX2NoYXJhY3RlcmlzdGljX3R3b19maWVsZCkKKwkJCQkJCXsKKwkJCQkJCWVjX3NlYXJjaDEgPSAweEZGOworCQkJCQkJZWNfc2VhcmNoMiA9IDB4MDI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJZWNfc2VhcmNoMSA9IDB4MDA7CisJCQkJCWVjX3NlYXJjaDIgPSB0bHMxX2VjX25pZDJjdXJ2ZV9pZChlY19uaWQpOworCQkJCQl9CisJCQkJaWYgKChlY19zZWFyY2gxICE9IDApIHx8IChlY19zZWFyY2gyICE9IDApKQorCQkJCQl7CisJCQkJCWZvciAoaiA9IDA7IGogPCBzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoIC8gMjsgaisrKQorCQkJCQkJeworCQkJCQkJaWYgKChzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RbMipqXSA9PSBlY19zZWFyY2gxKSAmJiAocy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0WzIqaisxXSA9PSBlY19zZWFyY2gyKSkKKwkJCQkJCQl7CisJCQkJCQkJZWNfb2sgPSAxOworCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCW9rID0gb2sgJiYgZWNfb2s7CisJCQl9CisjZW5kaWYgLyogT1BFTlNTTF9OT19FQyAqLworI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisKKwkJaWYgKCFvaykgY29udGludWU7CisJCWlpPXNrX1NTTF9DSVBIRVJfZmluZChhbGxvdyxjKTsKKwkJaWYgKGlpID49IDApCisJCQl7CisJCQlyZXQ9c2tfU1NMX0NJUEhFUl92YWx1ZShhbGxvdyxpaSk7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCXJldHVybihyZXQpOworCX0KKworaW50IHNzbDNfZ2V0X3JlcV9jZXJ0X3R5cGUoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpwKQorCXsKKwlpbnQgcmV0PTA7CisJdW5zaWduZWQgbG9uZyBhbGdfazsKKworCWFsZ19rID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0dPU1QKKwlpZiAocy0+dmVyc2lvbiA+PSBUTFMxX1ZFUlNJT04pCisJCXsKKwkJaWYgKGFsZ19rICYgU1NMX2tHT1NUKQorCQkJeworCQkJcFtyZXQrK109VExTX0NUX0dPU1Q5NF9TSUdOOworCQkJcFtyZXQrK109VExTX0NUX0dPU1QwMV9TSUdOOworCQkJcmV0dXJuKHJldCk7CisJCQl9CisJCX0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwlpZiAoYWxnX2sgJiAoU1NMX2tESHJ8U1NMX2tFREgpKQorCQl7CisjICBpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkJcFtyZXQrK109U1NMM19DVF9SU0FfRklYRURfREg7CisjICBlbmRpZgorIyAgaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJCXBbcmV0KytdPVNTTDNfQ1RfRFNTX0ZJWEVEX0RIOworIyAgZW5kaWYKKwkJfQorCWlmICgocy0+dmVyc2lvbiA9PSBTU0wzX1ZFUlNJT04pICYmCisJCShhbGdfayAmIChTU0xfa0VESHxTU0xfa0RIZHxTU0xfa0RIcikpKQorCQl7CisjICBpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkJcFtyZXQrK109U1NMM19DVF9SU0FfRVBIRU1FUkFMX0RIOworIyAgZW5kaWYKKyMgIGlmbmRlZiBPUEVOU1NMX05PX0RTQQorCQlwW3JldCsrXT1TU0wzX0NUX0RTU19FUEhFTUVSQUxfREg7CisjICBlbmRpZgorCQl9CisjZW5kaWYgLyogIU9QRU5TU0xfTk9fREggKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwlwW3JldCsrXT1TU0wzX0NUX1JTQV9TSUdOOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJcFtyZXQrK109U1NMM19DVF9EU1NfU0lHTjsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlpZiAoKGFsZ19rICYgKFNTTF9rRUNESHJ8U1NMX2tFQ0RIZSkpICYmIChzLT52ZXJzaW9uID49IFRMUzFfVkVSU0lPTikpCisJCXsKKwkJcFtyZXQrK109VExTX0NUX1JTQV9GSVhFRF9FQ0RIOworCQlwW3JldCsrXT1UTFNfQ1RfRUNEU0FfRklYRURfRUNESDsKKwkJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCS8qIEVDRFNBIGNlcnRzIGNhbiBiZSB1c2VkIHdpdGggUlNBIGNpcGhlciBzdWl0ZXMgYXMgd2VsbCAKKwkgKiBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBTU0xfa0VDREggb3IgU1NMX2tFRUNESAorCSAqLworCWlmIChzLT52ZXJzaW9uID49IFRMUzFfVkVSU0lPTikKKwkJeworCQlwW3JldCsrXT1UTFNfQ1RfRUNEU0FfU0lHTjsKKwkJfQorI2VuZGlmCQorCXJldHVybihyZXQpOworCX0KKworaW50IHNzbDNfc2h1dGRvd24oU1NMICpzKQorCXsKKwlpbnQgcmV0OworCisJLyogRG9uJ3QgZG8gYW55dGhpbmcgbXVjaCBpZiB3ZSBoYXZlIG5vdCBkb25lIHRoZSBoYW5kc2hha2Ugb3IKKwkgKiB3ZSBkb24ndCB3YW50IHRvIHNlbmQgbWVzc2FnZXMgOi0pICovCisJaWYgKChzLT5xdWlldF9zaHV0ZG93bikgfHwgKHMtPnN0YXRlID09IFNTTF9TVF9CRUZPUkUpKQorCQl7CisJCXMtPnNodXRkb3duPShTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pOworCQlyZXR1cm4oMSk7CisJCX0KKworCWlmICghKHMtPnNodXRkb3duICYgU1NMX1NFTlRfU0hVVERPV04pKQorCQl7CisJCXMtPnNodXRkb3dufD1TU0xfU0VOVF9TSFVURE9XTjsKKyNpZiAxCisJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfV0FSTklORyxTU0xfQURfQ0xPU0VfTk9USUZZKTsKKyNlbmRpZgorCQkvKiBvdXIgc2h1dGRvd24gYWxlcnQgaGFzIGJlZW4gc2VudCBub3csIGFuZCBpZiBpdCBzdGlsbCBuZWVkcworCSAJICogdG8gYmUgd3JpdHRlbiwgcy0+czMtPmFsZXJ0X2Rpc3BhdGNoIHdpbGwgYmUgdHJ1ZSAqLworCSAJaWYgKHMtPnMzLT5hbGVydF9kaXNwYXRjaCkKKwkgCQlyZXR1cm4oLTEpOwkvKiByZXR1cm4gV0FOVF9XUklURSAqLworCQl9CisJZWxzZSBpZiAocy0+czMtPmFsZXJ0X2Rpc3BhdGNoKQorCQl7CisJCS8qIHJlc2VuZCBpdCBpZiBub3Qgc2VudCAqLworI2lmIDEKKwkJcmV0PXMtPm1ldGhvZC0+c3NsX2Rpc3BhdGNoX2FsZXJ0KHMpOworCQlpZihyZXQgPT0gLTEpCisJCQl7CisJCQkvKiB3ZSBvbmx5IGdldCB0byByZXR1cm4gLTEgaGVyZSB0aGUgMm5kL050aAorCQkJICogaW52b2NhdGlvbiwgd2UgbXVzdCAgaGF2ZSBhbHJlYWR5IHNpZ25hbGxlZAorCQkJICogcmV0dXJuIDAgdXBvbiBhIHByZXZpb3VzIGludm9hdGlvbiwKKwkJCSAqIHJldHVybiBXQU5UX1dSSVRFICovCisJCQlyZXR1cm4ocmV0KTsKKwkJCX0KKyNlbmRpZgorCQl9CisJZWxzZSBpZiAoIShzLT5zaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikpCisJCXsKKwkJLyogSWYgd2UgYXJlIHdhaXRpbmcgZm9yIGEgY2xvc2UgZnJvbSBvdXIgcGVlciwgd2UgYXJlIGNsb3NlZCAqLworCQlzLT5tZXRob2QtPnNzbF9yZWFkX2J5dGVzKHMsMCxOVUxMLDAsMCk7CisJCWlmKCEocy0+c2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pKQorCQkJeworCQkJcmV0dXJuKC0xKTsJLyogcmV0dXJuIFdBTlRfUkVBRCAqLworCQkJfQorCQl9CisKKwlpZiAoKHMtPnNodXRkb3duID09IChTU0xfU0VOVF9TSFVURE9XTnxTU0xfUkVDRUlWRURfU0hVVERPV04pKSAmJgorCQkhcy0+czMtPmFsZXJ0X2Rpc3BhdGNoKQorCQlyZXR1cm4oMSk7CisJZWxzZQorCQlyZXR1cm4oMCk7CisJfQorCitpbnQgc3NsM193cml0ZShTU0wgKnMsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbikKKwl7CisJaW50IHJldCxuOworCisjaWYgMAorCWlmIChzLT5zaHV0ZG93biAmIFNTTF9TRU5EX1NIVVRET1dOKQorCQl7CisJCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJCXJldHVybigwKTsKKwkJfQorI2VuZGlmCisJY2xlYXJfc3lzX2Vycm9yKCk7CisJaWYgKHMtPnMzLT5yZW5lZ290aWF0ZSkgc3NsM19yZW5lZ290aWF0ZV9jaGVjayhzKTsKKworCS8qIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZsYWcgdGhhdCBzZW5kcyB0aGUKKwkgKiBsYXN0IGhhbmRzaGFrZSBtZXNzYWdlIGluIHRoZSBzYW1lIHBhY2tldCBhcyB0aGUgZmlyc3QKKwkgKiB1c2UgZGF0YSAtIHVzZWQgdG8gc2VlIGlmIGl0IGhlbHBzIHRoZSBUQ1AgcHJvdG9jb2wgZHVyaW5nCisJICogc2Vzc2lvbi1pZCByZXVzZSAqLworCS8qIFRoZSBzZWNvbmQgdGVzdCBpcyBiZWNhdXNlIHRoZSBidWZmZXIgbWF5IGhhdmUgYmVlbiByZW1vdmVkICovCisJaWYgKChzLT5zMy0+ZmxhZ3MgJiBTU0wzX0ZMQUdTX1BPUF9CVUZGRVIpICYmIChzLT53YmlvID09IHMtPmJiaW8pKQorCQl7CisJCS8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgd2Ugd3JpdGUgaW50byB0aGUgYnVmZmVyICovCisJCWlmIChzLT5zMy0+ZGVsYXlfYnVmX3BvcF9yZXQgPT0gMCkKKwkJCXsKKwkJCXJldD1zc2wzX3dyaXRlX2J5dGVzKHMsU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBLAorCQkJCQkgICAgIGJ1ZixsZW4pOworCQkJaWYgKHJldCA8PSAwKSByZXR1cm4ocmV0KTsKKworCQkJcy0+czMtPmRlbGF5X2J1Zl9wb3BfcmV0PXJldDsKKwkJCX0KKworCQlzLT5yd3N0YXRlPVNTTF9XUklUSU5HOworCQluPUJJT19mbHVzaChzLT53YmlvKTsKKwkJaWYgKG4gPD0gMCkgcmV0dXJuKG4pOworCQlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCisJCS8qIFdlIGhhdmUgZmx1c2hlZCB0aGUgYnVmZmVyLCBzbyByZW1vdmUgaXQgKi8KKwkJc3NsX2ZyZWVfd2Jpb19idWZmZXIocyk7CisJCXMtPnMzLT5mbGFncyY9IH5TU0wzX0ZMQUdTX1BPUF9CVUZGRVI7CisKKwkJcmV0PXMtPnMzLT5kZWxheV9idWZfcG9wX3JldDsKKwkJcy0+czMtPmRlbGF5X2J1Zl9wb3BfcmV0PTA7CisJCX0KKwllbHNlCisJCXsKKwkJcmV0PXMtPm1ldGhvZC0+c3NsX3dyaXRlX2J5dGVzKHMsU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBLAorCQkJYnVmLGxlbik7CisJCWlmIChyZXQgPD0gMCkgcmV0dXJuKHJldCk7CisJCX0KKworCXJldHVybihyZXQpOworCX0KKworc3RhdGljIGludCBzc2wzX3JlYWRfaW50ZXJuYWwoU1NMICpzLCB2b2lkICpidWYsIGludCBsZW4sIGludCBwZWVrKQorCXsKKwlpbnQgbixyZXQ7CisJCisJY2xlYXJfc3lzX2Vycm9yKCk7CisJaWYgKChzLT5zMy0+ZmxhZ3MgJiBTU0wzX0ZMQUdTX1BPUF9CVUZGRVIpICYmIChzLT53YmlvID09IHMtPmJiaW8pKQorCQl7CisJCS8qIERlYWwgd2l0aCBhbiBhcHBsaWNhdGlvbiB0aGF0IGNhbGxzIFNTTF9yZWFkKCkgd2hlbiBoYW5kc2hha2UgZGF0YQorCQkgKiBpcyB5ZXQgdG8gYmUgd3JpdHRlbi4KKwkJICovCisJCWlmIChCSU9fd3BlbmRpbmcocy0+d2JpbykgPiAwKQorCQkJeworCQkJcy0+cndzdGF0ZT1TU0xfV1JJVElORzsKKwkJCW49QklPX2ZsdXNoKHMtPndiaW8pOworCQkJaWYgKG4gPD0gMCkgcmV0dXJuKG4pOworCQkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKwkJCX0KKwkJfQorCWlmIChzLT5zMy0+cmVuZWdvdGlhdGUpIHNzbDNfcmVuZWdvdGlhdGVfY2hlY2socyk7CisJcy0+czMtPmluX3JlYWRfYXBwX2RhdGE9MTsKKwlyZXQ9cy0+bWV0aG9kLT5zc2xfcmVhZF9ieXRlcyhzLFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSxidWYsbGVuLHBlZWspOworCWlmICgocmV0ID09IC0xKSAmJiAocy0+czMtPmluX3JlYWRfYXBwX2RhdGEgPT0gMikpCisJCXsKKwkJLyogc3NsM19yZWFkX2J5dGVzIGRlY2lkZWQgdG8gY2FsbCBzLT5oYW5kc2hha2VfZnVuYywgd2hpY2gKKwkJICogY2FsbGVkIHNzbDNfcmVhZF9ieXRlcyB0byByZWFkIGhhbmRzaGFrZSBkYXRhLgorCQkgKiBIb3dldmVyLCBzc2wzX3JlYWRfYnl0ZXMgYWN0dWFsbHkgZm91bmQgYXBwbGljYXRpb24gZGF0YQorCQkgKiBhbmQgdGhpbmtzIHRoYXQgYXBwbGljYXRpb24gZGF0YSBtYWtlcyBzZW5zZSBoZXJlOyBzbyBkaXNhYmxlCisJCSAqIGhhbmRzaGFrZSBwcm9jZXNzaW5nIGFuZCB0cnkgdG8gcmVhZCBhcHBsaWNhdGlvbiBkYXRhIGFnYWluLiAqLworCQlzLT5pbl9oYW5kc2hha2UrKzsKKwkJcmV0PXMtPm1ldGhvZC0+c3NsX3JlYWRfYnl0ZXMocyxTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEsYnVmLGxlbixwZWVrKTsKKwkJcy0+aW5faGFuZHNoYWtlLS07CisJCX0KKwllbHNlCisJCXMtPnMzLT5pbl9yZWFkX2FwcF9kYXRhPTA7CisKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBzc2wzX3JlYWQoU1NMICpzLCB2b2lkICpidWYsIGludCBsZW4pCisJeworCXJldHVybiBzc2wzX3JlYWRfaW50ZXJuYWwocywgYnVmLCBsZW4sIDApOworCX0KKworaW50IHNzbDNfcGVlayhTU0wgKnMsIHZvaWQgKmJ1ZiwgaW50IGxlbikKKwl7CisJcmV0dXJuIHNzbDNfcmVhZF9pbnRlcm5hbChzLCBidWYsIGxlbiwgMSk7CisJfQorCitpbnQgc3NsM19yZW5lZ290aWF0ZShTU0wgKnMpCisJeworCWlmIChzLT5oYW5kc2hha2VfZnVuYyA9PSBOVUxMKQorCQlyZXR1cm4oMSk7CisKKwlpZiAocy0+czMtPmZsYWdzICYgU1NMM19GTEFHU19OT19SRU5FR09USUFURV9DSVBIRVJTKQorCQlyZXR1cm4oMCk7CisKKwlzLT5zMy0+cmVuZWdvdGlhdGU9MTsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgc3NsM19yZW5lZ290aWF0ZV9jaGVjayhTU0wgKnMpCisJeworCWludCByZXQ9MDsKKworCWlmIChzLT5zMy0+cmVuZWdvdGlhdGUpCisJCXsKKwkJaWYgKAkocy0+czMtPnJidWYubGVmdCA9PSAwKSAmJgorCQkJKHMtPnMzLT53YnVmLmxlZnQgPT0gMCkgJiYKKwkJCSFTU0xfaW5faW5pdChzKSkKKwkJCXsKKy8qCitpZiB3ZSBhcmUgdGhlIHNlcnZlciwgYW5kIHdlIGhhdmUgc2VudCBhICdSRU5FR09USUFURScgbWVzc2FnZSwgd2UKK25lZWQgdG8gZ28gdG8gU1NMX1NUX0FDQ0VQVC4KKyovCisJCQkvKiBTU0xfU1RfQUNDRVBUICovCisJCQlzLT5zdGF0ZT1TU0xfU1RfUkVORUdPVElBVEU7CisJCQlzLT5zMy0+cmVuZWdvdGlhdGU9MDsKKwkJCXMtPnMzLT5udW1fcmVuZWdvdGlhdGlvbnMrKzsKKwkJCXMtPnMzLT50b3RhbF9yZW5lZ290aWF0aW9ucysrOworCQkJcmV0PTE7CisJCQl9CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zM19tZXRoLmMgYi9saWIvb3BlbnNzbC9zc2wvczNfbWV0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZGRiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvczNfbWV0aC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qIHNzbC9zM19tZXRoLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKnNzbDNfZ2V0X21ldGhvZChpbnQgdmVyKTsKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICpzc2wzX2dldF9tZXRob2QoaW50IHZlcikKKwl7CisJaWYgKHZlciA9PSBTU0wzX1ZFUlNJT04pCisJCXJldHVybihTU0x2M19tZXRob2QoKSk7CisJZWxzZSAKKwkJcmV0dXJuKE5VTEwpOworCX0KKworSU1QTEVNRU5UX3NzbDNfbWV0aF9mdW5jKFNTTHYzX21ldGhvZCwKKwkJCSBzc2wzX2FjY2VwdCwKKwkJCSBzc2wzX2Nvbm5lY3QsCisJCQkgc3NsM19nZXRfbWV0aG9kKQorCisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zM19wa3QuYyBiL2xpYi9vcGVuc3NsL3NzbC9zM19wa3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWVmMmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3MzX3BrdC5jCkBAIC0wLDAgKzEsMTQ5NiBAQAorLyogc3NsL3MzX3BrdC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDIgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgVVNFX1NPQ0tFVFMKKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKworc3RhdGljIGludCBkb19zc2wzX3dyaXRlKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgY3JlYXRlX2VtcHR5X2ZyYWdtZW50KTsKK3N0YXRpYyBpbnQgc3NsM19nZXRfcmVjb3JkKFNTTCAqcyk7CisKK2ludCBzc2wzX3JlYWRfbihTU0wgKnMsIGludCBuLCBpbnQgbWF4LCBpbnQgZXh0ZW5kKQorCXsKKwkvKiBJZiBleHRlbmQgPT0gMCwgb2J0YWluIG5ldyBuLWJ5dGUgcGFja2V0OyBpZiBleHRlbmQgPT0gMSwgaW5jcmVhc2UKKwkgKiBwYWNrZXQgYnkgYW5vdGhlciBuIGJ5dGVzLgorCSAqIFRoZSBwYWNrZXQgd2lsbCBiZSBpbiB0aGUgc3ViLWFycmF5IG9mIHMtPnMzLT5yYnVmLmJ1ZiBzcGVjaWZpZWQKKwkgKiBieSBzLT5wYWNrZXQgYW5kIHMtPnBhY2tldF9sZW5ndGguCisJICogKElmIHMtPnJlYWRfYWhlYWQgaXMgc2V0LCAnbWF4JyBieXRlcyBtYXkgYmUgc3RvcmVkIGluIHJidWYKKwkgKiBbcGx1cyBzLT5wYWNrZXRfbGVuZ3RoIGJ5dGVzIGlmIGV4dGVuZCA9PSAxXS4pCisJICovCisJaW50IGksbGVuLGxlZnQ7CisJbG9uZyBhbGlnbj0wOworCXVuc2lnbmVkIGNoYXIgKnBrdDsKKwlTU0wzX0JVRkZFUiAqcmI7CisKKwlpZiAobiA8PSAwKSByZXR1cm4gbjsKKworCXJiICAgID0gJihzLT5zMy0+cmJ1Zik7CisJaWYgKHJiLT5idWYgPT0gTlVMTCkKKwkJaWYgKCFzc2wzX3NldHVwX3JlYWRfYnVmZmVyKHMpKQorCQkJcmV0dXJuIC0xOworCisJbGVmdCAgPSByYi0+bGVmdDsKKyNpZiBkZWZpbmVkKFNTTDNfQUxJR05fUEFZTE9BRCkgJiYgU1NMM19BTElHTl9QQVlMT0FEIT0wCisJYWxpZ24gPSAobG9uZylyYi0+YnVmICsgU1NMM19SVF9IRUFERVJfTEVOR1RIOworCWFsaWduID0gKC1hbGlnbikmKFNTTDNfQUxJR05fUEFZTE9BRC0xKTsKKyNlbmRpZgorCisJaWYgKCFleHRlbmQpCisJCXsKKwkJLyogc3RhcnQgd2l0aCBlbXB0eSBwYWNrZXQgLi4uICovCisJCWlmIChsZWZ0ID09IDApCisJCQlyYi0+b2Zmc2V0ID0gYWxpZ247CisJCWVsc2UgaWYgKGFsaWduICE9IDAgJiYgbGVmdCA+PSBTU0wzX1JUX0hFQURFUl9MRU5HVEgpCisJCQl7CisJCQkvKiBjaGVjayBpZiBuZXh0IHBhY2tldCBsZW5ndGggaXMgbGFyZ2UKKwkJCSAqIGVub3VnaCB0byBqdXN0aWZ5IHBheWxvYWQgYWxpZ25tZW50Li4uICovCisJCQlwa3QgPSByYi0+YnVmICsgcmItPm9mZnNldDsKKwkJCWlmIChwa3RbMF0gPT0gU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBCisJCQkgICAgJiYgKHBrdFszXTw8OHxwa3RbNF0pID49IDEyOCkKKwkJCQl7CisJCQkJLyogTm90ZSB0aGF0IGV2ZW4gaWYgcGFja2V0IGlzIGNvcnJ1cHRlZAorCQkJCSAqIGFuZCBpdHMgbGVuZ3RoIGZpZWxkIGlzIGluc2FuZSwgd2UgY2FuCisJCQkJICogb25seSBiZSBsZWQgdG8gd3JvbmcgZGVjaXNpb24gYWJvdXQKKwkJCQkgKiB3aGV0aGVyIG1lbW1vdmUgd2lsbCBvY2N1ciBvciBub3QuCisJCQkJICogSGVhZGVyIHZhbHVlcyBoYXMgbm8gZWZmZWN0IG9uIG1lbW1vdmUKKwkJCQkgKiBhcmd1bWVudHMgYW5kIHRoZXJlZm9yZSBubyBidWZmZXIKKwkJCQkgKiBvdmVycnVuIGNhbiBiZSB0cmlnZ2VyZWQuICovCisJCQkJbWVtbW92ZSAocmItPmJ1ZithbGlnbixwa3QsbGVmdCk7CisJCQkJcmItPm9mZnNldCA9IGFsaWduOworCQkJCX0KKwkJCX0KKwkJcy0+cGFja2V0ID0gcmItPmJ1ZiArIHJiLT5vZmZzZXQ7CisJCXMtPnBhY2tldF9sZW5ndGggPSAwOworCQkvKiAuLi4gbm93IHdlIGNhbiBhY3QgYXMgaWYgJ2V4dGVuZCcgd2FzIHNldCAqLworCQl9CisKKwkvKiBGb3IgRFRMUy9VRFAgcmVhZHMgc2hvdWxkIG5vdCBzcGFuIG11bHRpcGxlIHBhY2tldHMKKwkgKiBiZWNhdXNlIHRoZSByZWFkIG9wZXJhdGlvbiByZXR1cm5zIHRoZSB3aG9sZSBwYWNrZXQKKwkgKiBhdCBvbmNlIChhcyBsb25nIGFzIGl0IGZpdHMgaW50byB0aGUgYnVmZmVyKS4gKi8KKwlpZiAoU1NMX3ZlcnNpb24ocykgPT0gRFRMUzFfVkVSU0lPTiB8fCBTU0xfdmVyc2lvbihzKSA9PSBEVExTMV9CQURfVkVSKQorCQl7CisJCWlmIChsZWZ0ID4gMCAmJiBuID4gbGVmdCkKKwkJCW4gPSBsZWZ0OworCQl9CisKKwkvKiBpZiB0aGVyZSBpcyBlbm91Z2ggaW4gdGhlIGJ1ZmZlciBmcm9tIGEgcHJldmlvdXMgcmVhZCwgdGFrZSBzb21lICovCisJaWYgKGxlZnQgPj0gbikKKwkJeworCQlzLT5wYWNrZXRfbGVuZ3RoKz1uOworCQlyYi0+bGVmdD1sZWZ0LW47CisJCXJiLT5vZmZzZXQrPW47CisJCXJldHVybihuKTsKKwkJfQorCisJLyogZWxzZSB3ZSBuZWVkIHRvIHJlYWQgbW9yZSBkYXRhICovCisKKwlsZW4gPSBzLT5wYWNrZXRfbGVuZ3RoOworCXBrdCA9IHJiLT5idWYrYWxpZ247CisJLyogTW92ZSBhbnkgYXZhaWxhYmxlIGJ5dGVzIHRvIGZyb250IG9mIGJ1ZmZlcjoKKwkgKiAnbGVuJyBieXRlcyBhbHJlYWR5IHBvaW50ZWQgdG8gYnkgJ3BhY2tldCcsCisJICogJ2xlZnQnIGV4dHJhIG9uZXMgYXQgdGhlIGVuZCAqLworCWlmIChzLT5wYWNrZXQgIT0gcGt0KSAvKiBsZW4gPiAwICovCisJCXsKKwkJbWVtbW92ZShwa3QsIHMtPnBhY2tldCwgbGVuK2xlZnQpOworCQlzLT5wYWNrZXQgPSBwa3Q7CisJCXJiLT5vZmZzZXQgPSBsZW4gKyBhbGlnbjsKKwkJfQorCisJaWYgKG4gPiAoaW50KShyYi0+bGVuIC0gcmItPm9mZnNldCkpIC8qIGRvZXMgbm90IGhhcHBlbiAqLworCQl7CisJCVNTTGVycihTU0xfRl9TU0wzX1JFQURfTixFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCXJldHVybiAtMTsKKwkJfQorCisJaWYgKCFzLT5yZWFkX2FoZWFkKQorCQkvKiBpZ25vcmUgbWF4IHBhcmFtZXRlciAqLworCQltYXggPSBuOworCWVsc2UKKwkJeworCQlpZiAobWF4IDwgbikKKwkJCW1heCA9IG47CisJCWlmIChtYXggPiAoaW50KShyYi0+bGVuIC0gcmItPm9mZnNldCkpCisJCQltYXggPSByYi0+bGVuIC0gcmItPm9mZnNldDsKKwkJfQorCisJd2hpbGUgKGxlZnQgPCBuKQorCQl7CisJCS8qIE5vdyB3ZSBoYXZlIGxlbitsZWZ0IGJ5dGVzIGF0IHRoZSBmcm9udCBvZiBzLT5zMy0+cmJ1Zi5idWYKKwkJICogYW5kIG5lZWQgdG8gcmVhZCBpbiBtb3JlIHVudGlsIHdlIGhhdmUgbGVuK24gKHVwIHRvCisJCSAqIGxlbittYXggaWYgcG9zc2libGUpICovCisKKwkJY2xlYXJfc3lzX2Vycm9yKCk7CisJCWlmIChzLT5yYmlvICE9IE5VTEwpCisJCQl7CisJCQlzLT5yd3N0YXRlPVNTTF9SRUFESU5HOworCQkJaT1CSU9fcmVhZChzLT5yYmlvLHBrdCtsZW4rbGVmdCwgbWF4LWxlZnQpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19SRUFEX04sU1NMX1JfUkVBRF9CSU9fTk9UX1NFVCk7CisJCQlpID0gLTE7CisJCQl9CisKKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCXJiLT5sZWZ0ID0gbGVmdDsKKwkJCWlmIChzLT5tb2RlICYgU1NMX01PREVfUkVMRUFTRV9CVUZGRVJTKQorCQkJCWlmIChsZW4rbGVmdCA9PSAwKQorCQkJCQlzc2wzX3JlbGVhc2VfcmVhZF9idWZmZXIocyk7CisJCQlyZXR1cm4oaSk7CisJCQl9CisJCWxlZnQrPWk7CisJCS8qIHJlYWRzIHNob3VsZCAqbmV2ZXIqIHNwYW4gbXVsdGlwbGUgcGFja2V0cyBmb3IgRFRMUyBiZWNhdXNlCisJCSAqIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBwcm90b2NvbCBpcyBtZXNzYWdlIG9yaWVudGVkIGFzIG9wcG9zZWQKKwkJICogdG8gYnl0ZSBvcmllbnRlZCBhcyBpbiB0aGUgVExTIGNhc2UuICovCisJCWlmIChTU0xfdmVyc2lvbihzKSA9PSBEVExTMV9WRVJTSU9OIHx8IFNTTF92ZXJzaW9uKHMpID09IERUTFMxX0JBRF9WRVIpCisJCQl7CisJCQlpZiAobiA+IGxlZnQpCisJCQkJbiA9IGxlZnQ7IC8qIG1ha2VzIHRoZSB3aGlsZSBjb25kaXRpb24gZmFsc2UgKi8KKwkJCX0KKwkJfQorCisJLyogZG9uZSByZWFkaW5nLCBub3cgdGhlIGJvb2sta2VlcGluZyAqLworCXJiLT5vZmZzZXQgKz0gbjsKKwlyYi0+bGVmdCA9IGxlZnQgLSBuOworCXMtPnBhY2tldF9sZW5ndGggKz0gbjsKKwlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCXJldHVybihuKTsKKwl9CisKKy8qIENhbGwgdGhpcyB0byBnZXQgYSBuZXcgaW5wdXQgcmVjb3JkLgorICogSXQgd2lsbCByZXR1cm4gPD0gMCBpZiBtb3JlIGRhdGEgaXMgbmVlZGVkLCBub3JtYWxseSBkdWUgdG8gYW4gZXJyb3IKKyAqIG9yIG5vbi1ibG9ja2luZyBJTy4KKyAqIFdoZW4gaXQgZmluaXNoZXMsIG9uZSBwYWNrZXQgaGFzIGJlZW4gZGVjb2RlZCBhbmQgY2FuIGJlIGZvdW5kIGluCisgKiBzc2wtPnMzLT5ycmVjLnR5cGUgICAgLSBpcyB0aGUgdHlwZSBvZiByZWNvcmQKKyAqIHNzbC0+czMtPnJyZWMuZGF0YSwgCSAtIGRhdGEKKyAqIHNzbC0+czMtPnJyZWMubGVuZ3RoLCAtIG51bWJlciBvZiBieXRlcworICovCisvKiB1c2VkIG9ubHkgYnkgc3NsM19yZWFkX2J5dGVzICovCitzdGF0aWMgaW50IHNzbDNfZ2V0X3JlY29yZChTU0wgKnMpCisJeworCWludCBzc2xfbWFqb3Isc3NsX21pbm9yLGFsOworCWludCBlbmNfZXJyLG4saSxyZXQ9IC0xOworCVNTTDNfUkVDT1JEICpycjsKKwlTU0xfU0VTU0lPTiAqc2VzczsKKwl1bnNpZ25lZCBjaGFyICpwOworCXVuc2lnbmVkIGNoYXIgbWRbRVZQX01BWF9NRF9TSVpFXTsKKwlzaG9ydCB2ZXJzaW9uOworCWludCBtYWNfc2l6ZTsKKwlpbnQgY2xlYXI9MDsKKwlzaXplX3QgZXh0cmE7CisJaW50IGRlY3J5cHRpb25fZmFpbGVkX29yX2JhZF9yZWNvcmRfbWFjID0gMDsKKwl1bnNpZ25lZCBjaGFyICptYWMgPSBOVUxMOworI2lmIGRlZmluZWQoU1NMM19BTElHTl9QQVlMT0FEKSAmJiBTU0wzX0FMSUdOX1BBWUxPQUQhPTAKKwlsb25nIGFsaWduPVNTTDNfQUxJR05fUEFZTE9BRDsKKyNlbHNlCisJbG9uZyBhbGlnbj0wOworI2VuZGlmCisKKwlycj0gJihzLT5zMy0+cnJlYyk7CisJc2Vzcz1zLT5zZXNzaW9uOworCisJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfTUlDUk9TT0ZUX0JJR19TU0xWM19CVUZGRVIpCisJCWV4dHJhPVNTTDNfUlRfTUFYX0VYVFJBOworCWVsc2UKKwkJZXh0cmE9MDsKKwlpZiAoIShTU0xfZ2V0X21vZGUocykgJiBTU0xfTU9ERV9TTUFMTF9CVUZGRVJTKSAmJgorCQlleHRyYSAmJiAhcy0+czMtPmluaXRfZXh0cmEpCisJCXsKKwkJLyogQW4gYXBwbGljYXRpb24gZXJyb3I6IFNMU19PUF9NSUNST1NPRlRfQklHX1NTTFYzX0JVRkZFUgorCQkgKiBzZXQgYWZ0ZXIgc3NsM19zZXR1cF9idWZmZXJzKCkgd2FzIGRvbmUgKi8KKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1JFQ09SRCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlyZXR1cm4gLTE7CisJCX0KKworYWdhaW46CisJLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGUgaGVhZGVyICovCisJaWYgKAkocy0+cnN0YXRlICE9IFNTTF9TVF9SRUFEX0JPRFkpIHx8CisJCShzLT5wYWNrZXRfbGVuZ3RoIDwgU1NMM19SVF9IRUFERVJfTEVOR1RIKSkgCisJCXsKKwkJbj1zc2wzX3JlYWRfbihzLCBTU0wzX1JUX0hFQURFUl9MRU5HVEgsIHMtPnMzLT5yYnVmLmxlbiwgMCk7CisJCWlmIChuIDw9IDApIHJldHVybihuKTsgLyogZXJyb3Igb3Igbm9uLWJsb2NraW5nICovCisJCXMtPnJzdGF0ZT1TU0xfU1RfUkVBRF9CT0RZOworCisJCXA9cy0+cGFja2V0OworCisJCS8qIFB1bGwgYXBhcnQgdGhlIGhlYWRlciBpbnRvIHRoZSBTU0wzX1JFQ09SRCAqLworCQlyci0+dHlwZT0gKihwKyspOworCQlzc2xfbWFqb3I9ICoocCsrKTsKKwkJc3NsX21pbm9yPSAqKHArKyk7CisJCXZlcnNpb249KHNzbF9tYWpvcjw8OCl8c3NsX21pbm9yOworCQluMnMocCxyci0+bGVuZ3RoKTsKKyNpZiAwCitmcHJpbnRmKHN0ZGVyciwgIlJlY29yZCB0eXBlPSVkLCBMZW5ndGg9JWRcbiIsIHJyLT50eXBlLCByci0+bGVuZ3RoKTsKKyNlbmRpZgorCisJCS8qIExldHMgY2hlY2sgdmVyc2lvbiAqLworCQlpZiAoIXMtPmZpcnN0X3BhY2tldCkKKwkJCXsKKwkJCWlmICh2ZXJzaW9uICE9IHMtPnZlcnNpb24pCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9SRUNPUkQsU1NMX1JfV1JPTkdfVkVSU0lPTl9OVU1CRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMtPnZlcnNpb24gJiAweEZGMDApID09ICh2ZXJzaW9uICYgMHhGRjAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCS8qIFNlbmQgYmFjayBlcnJvciB1c2luZyB0aGVpciBtaW5vciB2ZXJzaW9uIG51bWJlciA6LSkgKi8KKwkJCQkJcy0+dmVyc2lvbiA9ICh1bnNpZ25lZCBzaG9ydCl2ZXJzaW9uOworCQkJCWFsPVNTTF9BRF9QUk9UT0NPTF9WRVJTSU9OOworCQkJCWdvdG8gZl9lcnI7CisJCQkJfQorCQkJfQorCisJCWlmICgodmVyc2lvbj4+OCkgIT0gU1NMM19WRVJTSU9OX01BSk9SKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1JFQ09SRCxTU0xfUl9XUk9OR19WRVJTSU9OX05VTUJFUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBJZiB3ZSByZWNlaXZlIGEgdmFsaWQgcmVjb3JkIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IGJ1ZmZlciBzaXplLAorCQkgKiBhbGxvY2F0ZSBzb21lIG1lbW9yeSBmb3IgaXQuCisJCSAqLworCQlpZiAocnItPmxlbmd0aCA+IHMtPnMzLT5yYnVmLmxlbiAtIFNTTDNfUlRfSEVBREVSX0xFTkdUSCAtIGFsaWduKQorCQkJeworCQkJaWYgKChwPU9QRU5TU0xfcmVhbGxvYyhzLT5zMy0+cmJ1Zi5idWYsIHJyLT5sZW5ndGggKyBTU0wzX1JUX0hFQURFUl9MRU5HVEggKyBhbGlnbikpPT1OVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfUkVDT1JELEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlzLT5zMy0+cmJ1Zi5idWY9cDsKKwkJCXMtPnMzLT5yYnVmLmxlbj1yci0+bGVuZ3RoICsgU1NMM19SVF9IRUFERVJfTEVOR1RIICsgYWxpZ247CisJCQlzLT5wYWNrZXQ9ICYocy0+czMtPnJidWYuYnVmWzBdKTsKKwkJCX0KKworCQlpZiAocnItPmxlbmd0aCA+IHMtPnMzLT5yYnVmLmxlbiAtIFNTTDNfUlRfSEVBREVSX0xFTkdUSCkKKwkJCXsKKwkJCWFsPVNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfUkVDT1JELFNTTF9SX1BBQ0tFVF9MRU5HVEhfVE9PX0xPTkcpOworCQkJZ290byBmX2VycjsKKwkJCX0KKworCQkvKiBub3cgcy0+cnN0YXRlID09IFNTTF9TVF9SRUFEX0JPRFkgKi8KKwkJfQorCisJLyogcy0+cnN0YXRlID09IFNTTF9TVF9SRUFEX0JPRFksIGdldCBhbmQgZGVjb2RlIHRoZSBkYXRhICovCisKKwlpZiAocnItPmxlbmd0aCA+IHMtPnBhY2tldF9sZW5ndGgtU1NMM19SVF9IRUFERVJfTEVOR1RIKQorCQl7CisJCS8qIG5vdyBzLT5wYWNrZXRfbGVuZ3RoID09IFNTTDNfUlRfSEVBREVSX0xFTkdUSCAqLworCQlpPXJyLT5sZW5ndGg7CisJCW49c3NsM19yZWFkX24ocyxpLGksMSk7CisJCWlmIChuIDw9IDApIHJldHVybihuKTsgLyogZXJyb3Igb3Igbm9uLWJsb2NraW5nIGlvICovCisJCS8qIG5vdyBuID09IHJyLT5sZW5ndGgsCisJCSAqIGFuZCBzLT5wYWNrZXRfbGVuZ3RoID09IFNTTDNfUlRfSEVBREVSX0xFTkdUSCArIHJyLT5sZW5ndGggKi8KKwkJfQorCisJcy0+cnN0YXRlPVNTTF9TVF9SRUFEX0hFQURFUjsgLyogc2V0IHN0YXRlIGZvciBsYXRlciBvcGVyYXRpb25zICovCisKKwkvKiBBdCB0aGlzIHBvaW50LCBzLT5wYWNrZXRfbGVuZ3RoID09IFNTTDNfUlRfSEVBREVSX0xOR1RIICsgcnItPmxlbmd0aCwKKwkgKiBhbmQgd2UgaGF2ZSB0aGF0IG1hbnkgYnl0ZXMgaW4gcy0+cGFja2V0CisJICovCisJcnItPmlucHV0PSAmKHMtPnBhY2tldFtTU0wzX1JUX0hFQURFUl9MRU5HVEhdKTsKKworCS8qIG9rLCB3ZSBjYW4gbm93IHJlYWQgZnJvbSAncy0+cGFja2V0JyBkYXRhIGludG8gJ3JyJworCSAqIHJyLT5pbnB1dCBwb2ludHMgYXQgcnItPmxlbmd0aCBieXRlcywgd2hpY2gKKwkgKiBuZWVkIHRvIGJlIGNvcGllZCBpbnRvIHJyLT5kYXRhIGJ5IGVpdGhlcgorCSAqIHRoZSBkZWNyeXB0aW9uIG9yIGJ5IHRoZSBkZWNvbXByZXNzaW9uCisJICogV2hlbiB0aGUgZGF0YSBpcyAnY29waWVkJyBpbnRvIHRoZSByci0+ZGF0YSBidWZmZXIsCisJICogcnItPmlucHV0IHdpbGwgYmUgcG9pbnRlZCBhdCB0aGUgbmV3IGJ1ZmZlciAqLyAKKworCS8qIFdlIG5vdyBoYXZlIC0gZW5jcnlwdGVkIFsgTUFDIFsgY29tcHJlc3NlZCBbIHBsYWluIF0gXSBdCisJICogcnItPmxlbmd0aCBieXRlcyBvZiBlbmNyeXB0ZWQgY29tcHJlc3NlZCBzdHVmZi4gKi8KKworCS8qIGNoZWNrIGlzIG5vdCBuZWVkZWQgSSBiZWxpZXZlICovCisJaWYgKHJyLT5sZW5ndGggPiBTU0wzX1JUX01BWF9FTkNSWVBURURfTEVOR1RIK2V4dHJhKQorCQl7CisJCWFsPVNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9SRUNPUkQsU1NMX1JfRU5DUllQVEVEX0xFTkdUSF9UT09fTE9ORyk7CisJCWdvdG8gZl9lcnI7CisJCX0KKworCS8qIGRlY3J5cHQgaW4gcGxhY2UgaW4gJ3JyLT5pbnB1dCcgKi8KKwlyci0+ZGF0YT1yci0+aW5wdXQ7CisKKwllbmNfZXJyID0gcy0+bWV0aG9kLT5zc2wzX2VuYy0+ZW5jKHMsMCk7CisJaWYgKGVuY19lcnIgPD0gMCkKKwkJeworCQlpZiAoZW5jX2VyciA9PSAwKQorCQkJLyogU1NMZXJyKCkgYW5kIHNzbDNfc2VuZF9hbGVydCgpIGhhdmUgYmVlbiBjYWxsZWQgKi8KKwkJCWdvdG8gZXJyOworCisJCS8qIE90aGVyd2lzZSBlbmNfZXJyID09IC0xLCB3aGljaCBpbmRpY2F0ZXMgYmFkIHBhZGRpbmcKKwkJICogKHJlYy0+bGVuZ3RoIGhhcyBub3QgYmVlbiBjaGFuZ2VkIGluIHRoaXMgY2FzZSkuCisJCSAqIFRvIG1pbmltaXplIGluZm9ybWF0aW9uIGxlYWtlZCB2aWEgdGltaW5nLCB3ZSB3aWxsIHBlcmZvcm0KKwkJICogdGhlIE1BQyBjb21wdXRhdGlvbiBhbnl3YXkuICovCisJCWRlY3J5cHRpb25fZmFpbGVkX29yX2JhZF9yZWNvcmRfbWFjID0gMTsKKwkJfQorCisjaWZkZWYgVExTX0RFQlVHCitwcmludGYoImRlYyAlZFxuIixyci0+bGVuZ3RoKTsKK3sgdW5zaWduZWQgaW50IHo7IGZvciAoej0wOyB6PHJyLT5sZW5ndGg7IHorKykgcHJpbnRmKCIlMDJYJWMiLHJyLT5kYXRhW3pdLCgoeisxKSUxNik/JyAnOidcbicpOyB9CitwcmludGYoIlxuIik7CisjZW5kaWYKKworCS8qIHItPmxlbmd0aCBpcyBub3cgdGhlIGNvbXByZXNzZWQgZGF0YSBwbHVzIG1hYyAqLworCWlmICgJKHNlc3MgPT0gTlVMTCkgfHwKKwkJKHMtPmVuY19yZWFkX2N0eCA9PSBOVUxMKSB8fAorCQkoRVZQX01EX0NUWF9tZChzLT5yZWFkX2hhc2gpID09IE5VTEwpKQorCQljbGVhcj0xOworCisJaWYgKCFjbGVhcikKKwkJeworCQkvKiAhY2xlYXIgPT4gcy0+cmVhZF9oYXNoICE9IE5VTEwgPT4gbWFjX3NpemUgIT0gLTEgKi8KKwkJbWFjX3NpemU9RVZQX01EX0NUWF9zaXplKHMtPnJlYWRfaGFzaCk7CisJCU9QRU5TU0xfYXNzZXJ0KG1hY19zaXplID49IDApOworCisJCWlmIChyci0+bGVuZ3RoID4gU1NMM19SVF9NQVhfQ09NUFJFU1NFRF9MRU5HVEgrZXh0cmErbWFjX3NpemUpCisJCQl7CisjaWYgMCAvKiBPSyBvbmx5IGZvciBzdHJlYW0gY2lwaGVycyAodGhlbiByci0+bGVuZ3RoIGlzIHZpc2libGUgZnJvbSBjaXBoZXJ0ZXh0IGFueXdheSkgKi8KKwkJCWFsPVNTTF9BRF9SRUNPUkRfT1ZFUkZMT1c7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfUkVDT1JELFNTTF9SX1BSRV9NQUNfTEVOR1RIX1RPT19MT05HKTsKKwkJCWdvdG8gZl9lcnI7CisjZWxzZQorCQkJZGVjcnlwdGlvbl9mYWlsZWRfb3JfYmFkX3JlY29yZF9tYWMgPSAxOworI2VuZGlmCQkJCisJCQl9CisJCS8qIGNoZWNrIHRoZSBNQUMgZm9yIHJyLT5pbnB1dCAoaXQncyBpbiBtYWNfc2l6ZSBieXRlcyBhdCB0aGUgdGFpbCkgKi8KKwkJaWYgKHJyLT5sZW5ndGggPj0gKHVuc2lnbmVkIGludCltYWNfc2l6ZSkKKwkJCXsKKwkJCXJyLT5sZW5ndGggLT0gbWFjX3NpemU7CisJCQltYWMgPSAmcnItPmRhdGFbcnItPmxlbmd0aF07CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCS8qIHJlY29yZCAobWludXMgcGFkZGluZykgaXMgdG9vIHNob3J0IHRvIGNvbnRhaW4gYSBNQUMgKi8KKyNpZiAwIC8qIE9LIG9ubHkgZm9yIHN0cmVhbSBjaXBoZXJzICovCisJCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1JFQ09SRCxTU0xfUl9MRU5HVEhfVE9PX1NIT1JUKTsKKwkJCWdvdG8gZl9lcnI7CisjZWxzZQorCQkJZGVjcnlwdGlvbl9mYWlsZWRfb3JfYmFkX3JlY29yZF9tYWMgPSAxOworCQkJcnItPmxlbmd0aCA9IDA7CisjZW5kaWYKKwkJCX0KKwkJaT1zLT5tZXRob2QtPnNzbDNfZW5jLT5tYWMocyxtZCwwKTsKKwkJaWYgKGkgPCAwIHx8IG1hYyA9PSBOVUxMIHx8IG1lbWNtcChtZCwgbWFjLCAoc2l6ZV90KW1hY19zaXplKSAhPSAwKQorCQkJeworCQkJZGVjcnlwdGlvbl9mYWlsZWRfb3JfYmFkX3JlY29yZF9tYWMgPSAxOworCQkJfQorCQl9CisKKwlpZiAoZGVjcnlwdGlvbl9mYWlsZWRfb3JfYmFkX3JlY29yZF9tYWMpCisJCXsKKwkJLyogQSBzZXBhcmF0ZSAnZGVjcnlwdGlvbl9mYWlsZWQnIGFsZXJ0IHdhcyBpbnRyb2R1Y2VkIHdpdGggVExTIDEuMCwKKwkJICogU1NMIDMuMCBvbmx5IGhhcyAnYmFkX3JlY29yZF9tYWMnLiAgQnV0IHVubGVzcyBhIGRlY3J5cHRpb24KKwkJICogZmFpbHVyZSBpcyBkaXJlY3RseSB2aXNpYmxlIGZyb20gdGhlIGNpcGhlcnRleHQgYW55d2F5LAorCQkgKiB3ZSBzaG91bGQgbm90IHJldmVhbCB3aGljaCBraW5kIG9mIGVycm9yIG9jY3VyZWQgLS0gdGhpcworCQkgKiBtaWdodCBiZWNvbWUgdmlzaWJsZSB0byBhbiBhdHRhY2tlciAoZS5nLiB2aWEgYSBsb2dmaWxlKSAqLworCQlhbD1TU0xfQURfQkFEX1JFQ09SRF9NQUM7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9SRUNPUkQsU1NMX1JfREVDUllQVElPTl9GQUlMRURfT1JfQkFEX1JFQ09SRF9NQUMpOworCQlnb3RvIGZfZXJyOworCQl9CisKKwkvKiByLT5sZW5ndGggaXMgbm93IGp1c3QgY29tcHJlc3NlZCAqLworCWlmIChzLT5leHBhbmQgIT0gTlVMTCkKKwkJeworCQlpZiAocnItPmxlbmd0aCA+IFNTTDNfUlRfTUFYX0NPTVBSRVNTRURfTEVOR1RIK2V4dHJhKQorCQkJeworCQkJYWw9U1NMX0FEX1JFQ09SRF9PVkVSRkxPVzsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9SRUNPUkQsU1NMX1JfQ09NUFJFU1NFRF9MRU5HVEhfVE9PX0xPTkcpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJaWYgKCFzc2wzX2RvX3VuY29tcHJlc3MocykpCisJCQl7CisJCQlhbD1TU0xfQURfREVDT01QUkVTU0lPTl9GQUlMVVJFOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX1JFQ09SRCxTU0xfUl9CQURfREVDT01QUkVTU0lPTik7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQl9CisKKwlpZiAocnItPmxlbmd0aCA+IFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCtleHRyYSkKKwkJeworCQlhbD1TU0xfQURfUkVDT1JEX09WRVJGTE9XOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfUkVDT1JELFNTTF9SX0RBVEFfTEVOR1RIX1RPT19MT05HKTsKKwkJZ290byBmX2VycjsKKwkJfQorCisJcnItPm9mZj0wOworCS8qIFNvIGF0IHRoaXMgcG9pbnQgdGhlIGZvbGxvd2luZyBpcyB0cnVlCisJICogc3NsLT5zMy0+cnJlYy50eXBlIAlpcyB0aGUgdHlwZSBvZiByZWNvcmQKKwkgKiBzc2wtPnMzLT5ycmVjLmxlbmd0aAk9PSBudW1iZXIgb2YgYnl0ZXMgaW4gcmVjb3JkCisJICogc3NsLT5zMy0+cnJlYy5vZmYJPT0gb2Zmc2V0IHRvIGZpcnN0IHZhbGlkIGJ5dGUKKwkgKiBzc2wtPnMzLT5ycmVjLmRhdGEJPT0gd2hlcmUgdG8gdGFrZSBieXRlcyBmcm9tLCBpbmNyZW1lbnQKKwkgKgkJCSAgIGFmdGVyIHVzZSA6LSkuCisJICovCisKKwkvKiB3ZSBoYXZlIHB1bGxlZCBpbiBhIGZ1bGwgcGFja2V0IHNvIHplcm8gdGhpbmdzICovCisJcy0+cGFja2V0X2xlbmd0aD0wOworCisJLyoganVzdCByZWFkIGEgMCBsZW5ndGggcGFja2V0ICovCisJaWYgKHJyLT5sZW5ndGggPT0gMCkgZ290byBhZ2FpbjsKKworI2lmIDAKK2ZwcmludGYoc3RkZXJyLCAiVWx0aW1hdGUgUmVjb3JkIHR5cGU9JWQsIExlbmd0aD0lZFxuIiwgcnItPnR5cGUsIHJyLT5sZW5ndGgpOworI2VuZGlmCisKKwlyZXR1cm4oMSk7CisKK2ZfZXJyOgorCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsYWwpOworZXJyOgorCXJldHVybihyZXQpOworCX0KKworaW50IHNzbDNfZG9fdW5jb21wcmVzcyhTU0wgKnNzbCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCWludCBpOworCVNTTDNfUkVDT1JEICpycjsKKworCXJyPSAmKHNzbC0+czMtPnJyZWMpOworCWk9Q09NUF9leHBhbmRfYmxvY2soc3NsLT5leHBhbmQscnItPmNvbXAsCisJCVNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCxyci0+ZGF0YSwoaW50KXJyLT5sZW5ndGgpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuKDApOworCWVsc2UKKwkJcnItPmxlbmd0aD1pOworCXJyLT5kYXRhPXJyLT5jb21wOworI2VuZGlmCisJcmV0dXJuKDEpOworCX0KKworaW50IHNzbDNfZG9fY29tcHJlc3MoU1NMICpzc2wpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwlpbnQgaTsKKwlTU0wzX1JFQ09SRCAqd3I7CisKKwl3cj0gJihzc2wtPnMzLT53cmVjKTsKKwlpPUNPTVBfY29tcHJlc3NfYmxvY2soc3NsLT5jb21wcmVzcyx3ci0+ZGF0YSwKKwkJU1NMM19SVF9NQVhfQ09NUFJFU1NFRF9MRU5HVEgsCisJCXdyLT5pbnB1dCwoaW50KXdyLT5sZW5ndGgpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuKDApOworCWVsc2UKKwkJd3ItPmxlbmd0aD1pOworCisJd3ItPmlucHV0PXdyLT5kYXRhOworI2VuZGlmCisJcmV0dXJuKDEpOworCX0KKworLyogQ2FsbCB0aGlzIHRvIHdyaXRlIGRhdGEgaW4gcmVjb3JkcyBvZiB0eXBlICd0eXBlJworICogSXQgd2lsbCByZXR1cm4gPD0gMCBpZiBub3QgYWxsIGRhdGEgaGFzIGJlZW4gc2VudCBvciBub24tYmxvY2tpbmcgSU8uCisgKi8KK2ludCBzc2wzX3dyaXRlX2J5dGVzKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHZvaWQgKmJ1Zl8sIGludCBsZW4pCisJeworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1Zj1idWZfOworCXVuc2lnbmVkIGludCB0b3QsbixudzsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbWF4X3BsYWluX2xlbmd0aDsKKworCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJdG90PXMtPnMzLT53bnVtOworCXMtPnMzLT53bnVtPTA7CisKKwlpZiAoU1NMX2luX2luaXQocykgJiYgIXMtPmluX2hhbmRzaGFrZSkKKwkJeworCQlpPXMtPmhhbmRzaGFrZV9mdW5jKHMpOworCQlpZiAoaSA8IDApIHJldHVybihpKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX1dSSVRFX0JZVEVTLFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCW49KGxlbi10b3QpOworCWZvciAoOzspCisJCXsKKwkJaWYgKHR5cGUgPT0gU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBICYmIChTU0xfZ2V0X21vZGUocykgJiBTU0xfTU9ERV9TTUFMTF9CVUZGRVJTKSkKKwkJCW1heF9wbGFpbl9sZW5ndGggPSBTU0wzX1JUX0RFRkFVTFRfUExBSU5fTEVOR1RIOworCQllbHNlCisJCQltYXhfcGxhaW5fbGVuZ3RoID0gcy0+bWF4X3NlbmRfZnJhZ21lbnQ7CisKKwkJaWYgKG4gPiBtYXhfcGxhaW5fbGVuZ3RoKQorCQkJbncgPSBtYXhfcGxhaW5fbGVuZ3RoOworCQllbHNlCisJCQludz1uOworCisJCWk9ZG9fc3NsM193cml0ZShzLCB0eXBlLCAmKGJ1Zlt0b3RdKSwgbncsIDApOworCQlpZiAoaSA8PSAwKQorCQkJeworCQkJcy0+czMtPndudW09dG90OworCQkJcmV0dXJuIGk7CisJCQl9CisKKwkJaWYgKChpID09IChpbnQpbikgfHwKKwkJCSh0eXBlID09IFNTTDNfUlRfQVBQTElDQVRJT05fREFUQSAmJgorCQkJIChzLT5tb2RlICYgU1NMX01PREVfRU5BQkxFX1BBUlRJQUxfV1JJVEUpKSkKKwkJCXsKKwkJCS8qIG5leHQgY2h1bmsgb2YgZGF0YSBzaG91bGQgZ2V0IGFub3RoZXIgcHJlcGVuZGVkIGVtcHR5IGZyYWdtZW50CisJCQkgKiBpbiBjaXBoZXJzdWl0ZXMgd2l0aCBrbm93bi1JViB3ZWFrbmVzczogKi8KKwkJCXMtPnMzLT5lbXB0eV9mcmFnbWVudF9kb25lID0gMDsKKwkJCQorCQkJcmV0dXJuIHRvdCtpOworCQkJfQorCisJCW4tPWk7CisJCXRvdCs9aTsKKwkJfQorCX0KKworc3RhdGljIGludCBkb19zc2wzX3dyaXRlKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgY3JlYXRlX2VtcHR5X2ZyYWdtZW50KQorCXsKKwl1bnNpZ25lZCBjaGFyICpwLCpwbGVuOworCWludCBpLG1hY19zaXplLGNsZWFyPTA7CisJaW50IHByZWZpeF9sZW49MDsKKwlsb25nIGFsaWduPTA7CisJU1NMM19SRUNPUkQgKndyOworCVNTTDNfQlVGRkVSICp3Yj0mKHMtPnMzLT53YnVmKTsKKwlTU0xfU0VTU0lPTiAqc2VzczsKKworIAlpZiAod2ItPmJ1ZiA9PSBOVUxMKQorCQlpZiAoIXNzbDNfc2V0dXBfd3JpdGVfYnVmZmVyKHMpKQorCQkJcmV0dXJuIC0xOworCisJLyogZmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSBTU0wzX0JVRkZFUiBzdGlsbCBiZWluZyB3cml0dGVuCisJICogb3V0LiAgVGhpcyB3aWxsIGhhcHBlbiB3aXRoIG5vbiBibG9ja2luZyBJTyAqLworCWlmICh3Yi0+bGVmdCAhPSAwKQorCQlyZXR1cm4oc3NsM193cml0ZV9wZW5kaW5nKHMsdHlwZSxidWYsbGVuKSk7CisKKwkvKiBJZiB3ZSBoYXZlIGFuIGFsZXJ0IHRvIHNlbmQsIGxldHMgc2VuZCBpdCAqLworCWlmIChzLT5zMy0+YWxlcnRfZGlzcGF0Y2gpCisJCXsKKwkJaT1zLT5tZXRob2QtPnNzbF9kaXNwYXRjaF9hbGVydChzKTsKKwkJaWYgKGkgPD0gMCkKKwkJCXJldHVybihpKTsKKwkJLyogaWYgaXQgd2VudCwgZmFsbCB0aHJvdWdoIGFuZCBzZW5kIG1vcmUgc3R1ZmYgKi8KKwkJfQorCisJaWYgKGxlbiA9PSAwICYmICFjcmVhdGVfZW1wdHlfZnJhZ21lbnQpCisJCXJldHVybiAwOworCisJd3I9ICYocy0+czMtPndyZWMpOworCXNlc3M9cy0+c2Vzc2lvbjsKKworCWlmICgJKHNlc3MgPT0gTlVMTCkgfHwKKwkJKHMtPmVuY193cml0ZV9jdHggPT0gTlVMTCkgfHwKKwkJKEVWUF9NRF9DVFhfbWQocy0+d3JpdGVfaGFzaCkgPT0gTlVMTCkpCisJCWNsZWFyPTE7CisKKwlpZiAoY2xlYXIpCisJCW1hY19zaXplPTA7CisJZWxzZQorCQl7CisJCW1hY19zaXplPUVWUF9NRF9DVFhfc2l6ZShzLT53cml0ZV9oYXNoKTsKKwkJaWYgKG1hY19zaXplIDwgMCkKKwkJCWdvdG8gZXJyOworCQl9CisKKwkvKiAnY3JlYXRlX2VtcHR5X2ZyYWdtZW50JyBpcyB0cnVlIG9ubHkgd2hlbiB0aGlzIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZiAqLworCWlmICghY2xlYXIgJiYgIWNyZWF0ZV9lbXB0eV9mcmFnbWVudCAmJiAhcy0+czMtPmVtcHR5X2ZyYWdtZW50X2RvbmUpCisJCXsKKwkJLyogY291bnRlcm1lYXN1cmUgYWdhaW5zdCBrbm93bi1JViB3ZWFrbmVzcyBpbiBDQkMgY2lwaGVyc3VpdGVzCisJCSAqIChzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+Ym9kby90bHMtY2JjLnR4dCkgKi8KKworCQlpZiAocy0+czMtPm5lZWRfZW1wdHlfZnJhZ21lbnRzICYmIHR5cGUgPT0gU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBKQorCQkJeworCQkJLyogcmVjdXJzaXZlIGZ1bmN0aW9uIGNhbGwgd2l0aCAnY3JlYXRlX2VtcHR5X2ZyYWdtZW50JyBzZXQ7CisJCQkgKiB0aGlzIHByZXBhcmVzIGFuZCBidWZmZXJzIHRoZSBkYXRhIGZvciBhbiBlbXB0eSBmcmFnbWVudAorCQkJICogKHRoZXNlICdwcmVmaXhfbGVuJyBieXRlcyBhcmUgc2VudCBvdXQgbGF0ZXIKKwkJCSAqIHRvZ2V0aGVyIHdpdGggdGhlIGFjdHVhbCBwYXlsb2FkKSAqLworCQkJcHJlZml4X2xlbiA9IGRvX3NzbDNfd3JpdGUocywgdHlwZSwgYnVmLCAwLCAxKTsKKwkJCWlmIChwcmVmaXhfbGVuIDw9IDApCisJCQkJZ290byBlcnI7CisKKwkJCWlmIChwcmVmaXhfbGVuID4KKwkJKFNTTDNfUlRfSEVBREVSX0xFTkdUSCArIFNTTDNfUlRfU0VORF9NQVhfRU5DUllQVEVEX09WRVJIRUFEKSkKKwkJCQl7CisJCQkJLyogaW5zdWZmaWNpZW50IHNwYWNlICovCisJCQkJU1NMZXJyKFNTTF9GX0RPX1NTTDNfV1JJVEUsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9CisJCQorCQlzLT5zMy0+ZW1wdHlfZnJhZ21lbnRfZG9uZSA9IDE7CisJCX0KKworCS8qIHJlc2l6ZSBpZiBuZWNlc3NhcnkgdG8gaG9sZCB0aGUgZGF0YS4gKi8KKwlpZiAobGVuICsgU1NMM19SVF9ERUZBVUxUX1dSSVRFX09WRVJIRUFEID4gd2ItPmxlbikKKwkJeworCQlpZiAoKHA9T1BFTlNTTF9yZWFsbG9jKHdiLT5idWYsIGxlbiArIFNTTDNfUlRfREVGQVVMVF9XUklURV9PVkVSSEVBRCkpPT1OVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX0RPX1NTTDNfV1JJVEUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCXdiLT5idWYgPSBwOworCQl3Yi0+bGVuID0gbGVuICsgU1NMM19SVF9ERUZBVUxUX1dSSVRFX09WRVJIRUFEOworCQl9CisKKwlpZiAoY3JlYXRlX2VtcHR5X2ZyYWdtZW50KQorCQl7CisjaWYgZGVmaW5lZChTU0wzX0FMSUdOX1BBWUxPQUQpICYmIFNTTDNfQUxJR05fUEFZTE9BRCE9MAorCQkvKiBleHRyYSBmcmFnbWVudCB3b3VsZCBiZSBjb3VwbGUgb2YgY2lwaGVyIGJsb2NrcywKKwkJICogd2hpY2ggd291bGQgYmUgbXVsdGlwbGUgb2YgU1NMM19BTElHTl9QQVlMT0FELCBzbworCQkgKiBpZiB3ZSB3YW50IHRvIGFsaWduIHRoZSByZWFsIHBheWxvYWQsIHRoZW4gd2UgY2FuCisJCSAqIGp1c3QgcHJldGVudCB3ZSBzaW1wbHkgaGF2ZSB0d28gaGVhZGVycy4gKi8KKwkJYWxpZ24gPSAobG9uZyl3Yi0+YnVmICsgMipTU0wzX1JUX0hFQURFUl9MRU5HVEg7CisJCWFsaWduID0gKC1hbGlnbikmKFNTTDNfQUxJR05fUEFZTE9BRC0xKTsKKyNlbmRpZgorCQlwID0gd2ItPmJ1ZiArIGFsaWduOworCQl3Yi0+b2Zmc2V0ICA9IGFsaWduOworCQl9CisJZWxzZSBpZiAocHJlZml4X2xlbikKKwkJeworCQlwID0gd2ItPmJ1ZiArIHdiLT5vZmZzZXQgKyBwcmVmaXhfbGVuOworCQl9CisJZWxzZQorCQl7CisjaWYgZGVmaW5lZChTU0wzX0FMSUdOX1BBWUxPQUQpICYmIFNTTDNfQUxJR05fUEFZTE9BRCE9MAorCQlhbGlnbiA9IChsb25nKXdiLT5idWYgKyBTU0wzX1JUX0hFQURFUl9MRU5HVEg7CisJCWFsaWduID0gKC1hbGlnbikmKFNTTDNfQUxJR05fUEFZTE9BRC0xKTsKKyNlbmRpZgorCQlwID0gd2ItPmJ1ZiArIGFsaWduOworCQl3Yi0+b2Zmc2V0ICA9IGFsaWduOworCQl9CisKKwkvKiB3cml0ZSB0aGUgaGVhZGVyICovCisKKwkqKHArKyk9dHlwZSYweGZmOworCXdyLT50eXBlPXR5cGU7CisKKwkqKHArKyk9KHMtPnZlcnNpb24+PjgpOworCSoocCsrKT1zLT52ZXJzaW9uJjB4ZmY7CisKKwkvKiBmaWVsZCB3aGVyZSB3ZSBhcmUgdG8gd3JpdGUgb3V0IHBhY2tldCBsZW5ndGggKi8KKwlwbGVuPXA7IAorCXArPTI7CisKKwkvKiBsZXRzIHNldHVwIHRoZSByZWNvcmQgc3R1ZmYuICovCisJd3ItPmRhdGE9cDsKKwl3ci0+bGVuZ3RoPShpbnQpbGVuOworCXdyLT5pbnB1dD0odW5zaWduZWQgY2hhciAqKWJ1ZjsKKworCS8qIHdlIG5vdyAncmVhZCcgZnJvbSB3ci0+aW5wdXQsIHdyLT5sZW5ndGggYnl0ZXMgaW50bworCSAqIHdyLT5kYXRhICovCisKKwkvKiBmaXJzdCB3ZSBjb21wcmVzcyAqLworCWlmIChzLT5jb21wcmVzcyAhPSBOVUxMKQorCQl7CisJCWlmICghc3NsM19kb19jb21wcmVzcyhzKSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9ET19TU0wzX1dSSVRFLFNTTF9SX0NPTVBSRVNTSU9OX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJbWVtY3B5KHdyLT5kYXRhLHdyLT5pbnB1dCx3ci0+bGVuZ3RoKTsKKwkJd3ItPmlucHV0PXdyLT5kYXRhOworCQl9CisKKwkvKiB3ZSBzaG91bGQgc3RpbGwgaGF2ZSB0aGUgb3V0cHV0IHRvIHdyLT5kYXRhIGFuZCB0aGUgaW5wdXQKKwkgKiBmcm9tIHdyLT5pbnB1dC4gIExlbmd0aCBzaG91bGQgYmUgd3ItPmxlbmd0aC4KKwkgKiB3ci0+ZGF0YSBzdGlsbCBwb2ludHMgaW4gdGhlIHdiLT5idWYgKi8KKworCWlmIChtYWNfc2l6ZSAhPSAwKQorCQl7CisJCWlmIChzLT5tZXRob2QtPnNzbDNfZW5jLT5tYWMocywmKHBbd3ItPmxlbmd0aF0pLDEpIDwgMCkKKwkJCWdvdG8gZXJyOworCQl3ci0+bGVuZ3RoKz1tYWNfc2l6ZTsKKwkJd3ItPmlucHV0PXA7CisJCXdyLT5kYXRhPXA7CisJCX0KKworCS8qIHNzbDNfZW5jIGNhbiBvbmx5IGhhdmUgYW4gZXJyb3Igb24gcmVhZCAqLworCXMtPm1ldGhvZC0+c3NsM19lbmMtPmVuYyhzLDEpOworCisJLyogcmVjb3JkIGxlbmd0aCBhZnRlciBtYWMgYW5kIGJsb2NrIHBhZGRpbmcgKi8KKwlzMm4od3ItPmxlbmd0aCxwbGVuKTsKKworCS8qIHdlIHNob3VsZCBub3cgaGF2ZQorCSAqIHdyLT5kYXRhIHBvaW50aW5nIHRvIHRoZSBlbmNyeXB0ZWQgZGF0YSwgd2hpY2ggaXMKKwkgKiB3ci0+bGVuZ3RoIGxvbmcgKi8KKwl3ci0+dHlwZT10eXBlOyAvKiBub3QgbmVlZGVkIGJ1dCBoZWxwcyBmb3IgZGVidWdnaW5nICovCisJd3ItPmxlbmd0aCs9U1NMM19SVF9IRUFERVJfTEVOR1RIOworCisJaWYgKGNyZWF0ZV9lbXB0eV9mcmFnbWVudCkKKwkJeworCQkvKiB3ZSBhcmUgaW4gYSByZWN1cnNpdmUgY2FsbDsKKwkJICoganVzdCByZXR1cm4gdGhlIGxlbmd0aCwgZG9uJ3Qgd3JpdGUgb3V0IGFueXRoaW5nIGhlcmUKKwkJICovCisJCXJldHVybiB3ci0+bGVuZ3RoOworCQl9CisKKwkvKiBub3cgbGV0J3Mgc2V0IHVwIHdiICovCisJd2ItPmxlZnQgPSBwcmVmaXhfbGVuICsgd3ItPmxlbmd0aDsKKworCS8qIG1lbW9yaXplIGFyZ3VtZW50cyBzbyB0aGF0IHNzbDNfd3JpdGVfcGVuZGluZyBjYW4gZGV0ZWN0IGJhZCB3cml0ZSByZXRyaWVzIGxhdGVyICovCisJcy0+czMtPndwZW5kX3RvdD1sZW47CisJcy0+czMtPndwZW5kX2J1Zj1idWY7CisJcy0+czMtPndwZW5kX3R5cGU9dHlwZTsKKwlzLT5zMy0+d3BlbmRfcmV0PWxlbjsKKworCS8qIHdlIG5vdyBqdXN0IG5lZWQgdG8gd3JpdGUgdGhlIGJ1ZmZlciAqLworCXJldHVybiBzc2wzX3dyaXRlX3BlbmRpbmcocyx0eXBlLGJ1ZixsZW4pOworZXJyOgorCXJldHVybiAtMTsKKwl9CisKKy8qIGlmIHMtPnMzLT53YnVmLmxlZnQgIT0gMCwgd2UgbmVlZCB0byBjYWxsIHRoaXMgKi8KK2ludCBzc2wzX3dyaXRlX3BlbmRpbmcoU1NMICpzLCBpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCXVuc2lnbmVkIGludCBsZW4pCisJeworCWludCBpOworCVNTTDNfQlVGRkVSICp3Yj0mKHMtPnMzLT53YnVmKTsKKworLyogWFhYWCAqLworCWlmICgocy0+czMtPndwZW5kX3RvdCA+IChpbnQpbGVuKQorCQl8fCAoKHMtPnMzLT53cGVuZF9idWYgIT0gYnVmKSAmJgorCQkJIShzLT5tb2RlICYgU1NMX01PREVfQUNDRVBUX01PVklOR19XUklURV9CVUZGRVIpKQorCQl8fCAocy0+czMtPndwZW5kX3R5cGUgIT0gdHlwZSkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfV1JJVEVfUEVORElORyxTU0xfUl9CQURfV1JJVEVfUkVUUlkpOworCQlyZXR1cm4oLTEpOworCQl9CisKKwlmb3IgKDs7KQorCQl7CisJCWNsZWFyX3N5c19lcnJvcigpOworCQlpZiAocy0+d2JpbyAhPSBOVUxMKQorCQkJeworCQkJcy0+cndzdGF0ZT1TU0xfV1JJVElORzsKKwkJCWk9QklPX3dyaXRlKHMtPndiaW8sCisJCQkJKGNoYXIgKikmKHdiLT5idWZbd2ItPm9mZnNldF0pLAorCQkJCSh1bnNpZ25lZCBpbnQpd2ItPmxlZnQpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19XUklURV9QRU5ESU5HLFNTTF9SX0JJT19OT1RfU0VUKTsKKwkJCWk9IC0xOworCQkJfQorCQlpZiAoaSA9PSB3Yi0+bGVmdCkKKwkJCXsKKwkJCXdiLT5sZWZ0PTA7CisJCQl3Yi0+b2Zmc2V0Kz1pOworCQkJaWYgKHMtPm1vZGUgJiBTU0xfTU9ERV9SRUxFQVNFX0JVRkZFUlMpCisJCQkJc3NsM19yZWxlYXNlX3dyaXRlX2J1ZmZlcihzKTsKKwkJCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJCQlyZXR1cm4ocy0+czMtPndwZW5kX3JldCk7CisJCQl9CisJCWVsc2UgaWYgKGkgPD0gMCkgeworCQkJaWYgKHMtPnZlcnNpb24gPT0gRFRMUzFfVkVSU0lPTiB8fAorCQkJICAgIHMtPnZlcnNpb24gPT0gRFRMUzFfQkFEX1ZFUikgeworCQkJCS8qIEZvciBEVExTLCBqdXN0IGRyb3AgaXQuIFRoYXQncyBraW5kIG9mIHRoZSB3aG9sZQorCQkJCSAgIHBvaW50IGluIHVzaW5nIGEgZGF0YWdyYW0gc2VydmljZSAqLworCQkJCXdiLT5sZWZ0ID0gMDsKKwkJCX0KKwkJCXJldHVybihpKTsKKwkJfQorCQl3Yi0+b2Zmc2V0Kz1pOworCQl3Yi0+bGVmdC09aTsKKwkJfQorCX0KKworLyogUmV0dXJuIHVwIHRvICdsZW4nIHBheWxvYWQgYnl0ZXMgcmVjZWl2ZWQgaW4gJ3R5cGUnIHJlY29yZHMuCisgKiAndHlwZScgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKgorICogICAtICBTU0wzX1JUX0hBTkRTSEFLRSAod2hlbiBzc2wzX2dldF9tZXNzYWdlIGNhbGxzIHVzKQorICogICAtICBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgKHdoZW4gc3NsM19yZWFkIGNhbGxzIHVzKQorICogICAtICAwIChkdXJpbmcgYSBzaHV0ZG93biwgbm8gZGF0YSBoYXMgdG8gYmUgcmV0dXJuZWQpCisgKgorICogSWYgd2UgZG9uJ3QgaGF2ZSBzdG9yZWQgZGF0YSB0byB3b3JrIGZyb20sIHJlYWQgYSBTU0wvVExTIHJlY29yZCBmaXJzdAorICogKHBvc3NpYmx5IG11bHRpcGxlIHJlY29yZHMgaWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byByZXR1cm4pLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUgYW55IHN1cnByaXNlcyB0aGUgcGVlciBtYXkgaGF2ZSBmb3IgdXMsIHN1Y2ggYXMKKyAqIEFsZXJ0IHJlY29yZHMgKGUuZy4gY2xvc2Vfbm90aWZ5KSwgQ2hhbmdlQ2lwaGVyU3BlYyByZWNvcmRzIChub3QgcmVhbGx5CisgKiBhIHN1cnByaXNlLCBidXQgaGFuZGxlZCBhcyBpZiBpdCB3ZXJlKSwgb3IgcmVuZWdvdGlhdGlvbiByZXF1ZXN0cy4KKyAqIEFsc28gaWYgcmVjb3JkIHBheWxvYWRzIGNvbnRhaW4gZnJhZ21lbnRzIHRvbyBzbWFsbCB0byBwcm9jZXNzLCB3ZSBzdG9yZQorICogdGhlbSB1bnRpbCB0aGVyZSBpcyBlbm91Z2ggZm9yIHRoZSByZXNwZWN0aXZlIHByb3RvY29sICh0aGUgcmVjb3JkIHByb3RvY29sCisgKiBtYXkgdXNlIGFyYml0cmFyeSBmcmFnbWVudGF0aW9uIGFuZCBldmVuIGludGVybGVhdmluZyk6CisgKiAgICAgQ2hhbmdlIGNpcGhlciBzcGVjIHByb3RvY29sCisgKiAgICAgICAgICAgICBqdXN0IDEgYnl0ZSBuZWVkZWQsIG5vIG5lZWQgZm9yIGtlZXBpbmcgYW55dGhpbmcgc3RvcmVkCisgKiAgICAgQWxlcnQgcHJvdG9jb2wKKyAqICAgICAgICAgICAgIDIgYnl0ZXMgbmVlZGVkIChBbGVydExldmVsLCBBbGVydERlc2NyaXB0aW9uKQorICogICAgIEhhbmRzaGFrZSBwcm90b2NvbAorICogICAgICAgICAgICAgNCBieXRlcyBuZWVkZWQgKEhhbmRzaGFrZVR5cGUsIHVpbnQyNCBsZW5ndGgpIC0tIHdlIGp1c3QgaGF2ZQorICogICAgICAgICAgICAgdG8gZGV0ZWN0IHVuZXhwZWN0ZWQgQ2xpZW50IEhlbGxvIGFuZCBIZWxsbyBSZXF1ZXN0IG1lc3NhZ2VzCisgKiAgICAgICAgICAgICBoZXJlLCBhbnl0aGluZyBlbHNlIGlzIGhhbmRsZWQgYnkgaGlnaGVyIGxheWVycworICogICAgIEFwcGxpY2F0aW9uIGRhdGEgcHJvdG9jb2wKKyAqICAgICAgICAgICAgIG5vbmUgb2Ygb3VyIGJ1c2luZXNzCisgKi8KK2ludCBzc2wzX3JlYWRfYnl0ZXMoU1NMICpzLCBpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcGVlaykKKwl7CisJaW50IGFsLGksaixyZXQ7CisJdW5zaWduZWQgaW50IG47CisJU1NMM19SRUNPUkQgKnJyOworCXZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsaW50IHR5cGUyLGludCB2YWwpPU5VTEw7CisKKwlpZiAocy0+czMtPnJidWYuYnVmID09IE5VTEwpIC8qIE5vdCBpbml0aWFsaXplZCB5ZXQgKi8KKwkJaWYgKCFzc2wzX3NldHVwX3JlYWRfYnVmZmVyKHMpKQorCQkJcmV0dXJuKC0xKTsKKworCWlmICgodHlwZSAmJiAodHlwZSAhPSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEpICYmICh0eXBlICE9IFNTTDNfUlRfSEFORFNIQUtFKSAmJiB0eXBlKSB8fAorCSAgICAocGVlayAmJiAodHlwZSAhPSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEpKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19SRUFEX0JZVEVTLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCXJldHVybiAtMTsKKwkJfQorCisJaWYgKCh0eXBlID09IFNTTDNfUlRfSEFORFNIQUtFKSAmJiAocy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPiAwKSkKKwkJLyogKHBhcnRpYWxseSkgc2F0aXNmeSByZXF1ZXN0IGZyb20gc3RvcmFnZSAqLworCQl7CisJCXVuc2lnbmVkIGNoYXIgKnNyYyA9IHMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnQ7CisJCXVuc2lnbmVkIGNoYXIgKmRzdCA9IGJ1ZjsKKwkJdW5zaWduZWQgaW50IGs7CisKKwkJLyogcGVlayA9PSAwICovCisJCW4gPSAwOworCQl3aGlsZSAoKGxlbiA+IDApICYmIChzLT5zMy0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbiA+IDApKQorCQkJeworCQkJKmRzdCsrID0gKnNyYysrOworCQkJbGVuLS07IHMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnRfbGVuLS07CisJCQluKys7CisJCQl9CisJCS8qIG1vdmUgYW55IHJlbWFpbmluZyBmcmFnbWVudCBieXRlczogKi8KKwkJZm9yIChrID0gMDsgayA8IHMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnRfbGVuOyBrKyspCisJCQlzLT5zMy0+aGFuZHNoYWtlX2ZyYWdtZW50W2tdID0gKnNyYysrOworCQlyZXR1cm4gbjsKKwl9CisKKwkvKiBOb3cgcy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPT0gMCBpZiB0eXBlID09IFNTTDNfUlRfSEFORFNIQUtFLiAqLworCisJaWYgKCFzLT5pbl9oYW5kc2hha2UgJiYgU1NMX2luX2luaXQocykpCisJCXsKKwkJLyogdHlwZSA9PSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEgKi8KKwkJaT1zLT5oYW5kc2hha2VfZnVuYyhzKTsKKwkJaWYgKGkgPCAwKSByZXR1cm4oaSk7CisJCWlmIChpID09IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19SRUFEX0JZVEVTLFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQlyZXR1cm4oLTEpOworCQkJfQorCQl9CitzdGFydDoKKwlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCisJLyogcy0+czMtPnJyZWMudHlwZQkgICAgLSBpcyB0aGUgdHlwZSBvZiByZWNvcmQKKwkgKiBzLT5zMy0+cnJlYy5kYXRhLCAgICAtIGRhdGEKKwkgKiBzLT5zMy0+cnJlYy5vZmYsICAgICAtIG9mZnNldCBpbnRvICdkYXRhJyBmb3IgbmV4dCByZWFkCisJICogcy0+czMtPnJyZWMubGVuZ3RoLCAgLSBudW1iZXIgb2YgYnl0ZXMuICovCisJcnIgPSAmKHMtPnMzLT5ycmVjKTsKKworCS8qIGdldCBuZXcgcGFja2V0IGlmIG5lY2Vzc2FyeSAqLworCWlmICgocnItPmxlbmd0aCA9PSAwKSB8fCAocy0+cnN0YXRlID09IFNTTF9TVF9SRUFEX0JPRFkpKQorCQl7CisJCXJldD1zc2wzX2dldF9yZWNvcmQocyk7CisJCWlmIChyZXQgPD0gMCkgcmV0dXJuKHJldCk7CisJCX0KKworCS8qIHdlIG5vdyBoYXZlIGEgcGFja2V0IHdoaWNoIGNhbiBiZSByZWFkIGFuZCBwcm9jZXNzZWQgKi8KKworCWlmIChzLT5zMy0+Y2hhbmdlX2NpcGhlcl9zcGVjIC8qIHNldCB3aGVuIHdlIHJlY2VpdmUgQ2hhbmdlQ2lwaGVyU3BlYywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXNldCBieSBzc2wzX2dldF9maW5pc2hlZCAqLworCQkmJiAocnItPnR5cGUgIT0gU1NMM19SVF9IQU5EU0hBS0UpKQorCQl7CisJCWFsPVNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7CisJCVNTTGVycihTU0xfRl9TU0wzX1JFQURfQllURVMsU1NMX1JfREFUQV9CRVRXRUVOX0NDU19BTkRfRklOSVNIRUQpOworCQlnb3RvIGZfZXJyOworCQl9CisKKwkvKiBJZiB0aGUgb3RoZXIgZW5kIGhhcyBzaHV0IGRvd24sIHRocm93IGFueXRoaW5nIHdlIHJlYWQgYXdheQorCSAqIChldmVuIGluICdwZWVrJyBtb2RlKSAqLworCWlmIChzLT5zaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikKKwkJeworCQlyci0+bGVuZ3RoPTA7CisJCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJCXJldHVybigwKTsKKwkJfQorCisKKwlpZiAodHlwZSA9PSByci0+dHlwZSkgLyogU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBIG9yIFNTTDNfUlRfSEFORFNIQUtFICovCisJCXsKKwkJLyogbWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBnZXR0aW5nIGFwcGxpY2F0aW9uIGRhdGEgd2hlbiB3ZQorCQkgKiBhcmUgZG9pbmcgYSBoYW5kc2hha2UgZm9yIHRoZSBmaXJzdCB0aW1lICovCisJCWlmIChTU0xfaW5faW5pdChzKSAmJiAodHlwZSA9PSBTU0wzX1JUX0FQUExJQ0FUSU9OX0RBVEEpICYmCisJCQkocy0+ZW5jX3JlYWRfY3R4ID09IE5VTEwpKQorCQkJeworCQkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJCVNTTGVycihTU0xfRl9TU0wzX1JFQURfQllURVMsU1NMX1JfQVBQX0RBVEFfSU5fSEFORFNIQUtFKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKwkJaWYgKGxlbiA8PSAwKSByZXR1cm4obGVuKTsKKworCQlpZiAoKHVuc2lnbmVkIGludClsZW4gPiByci0+bGVuZ3RoKQorCQkJbiA9IHJyLT5sZW5ndGg7CisJCWVsc2UKKwkJCW4gPSAodW5zaWduZWQgaW50KWxlbjsKKworCQltZW1jcHkoYnVmLCYocnItPmRhdGFbcnItPm9mZl0pLG4pOworCQlpZiAoIXBlZWspCisJCQl7CisJCQlyci0+bGVuZ3RoLT1uOworCQkJcnItPm9mZis9bjsKKwkJCWlmIChyci0+bGVuZ3RoID09IDApCisJCQkJeworCQkJCXMtPnJzdGF0ZT1TU0xfU1RfUkVBRF9IRUFERVI7CisJCQkJcnItPm9mZj0wOworCQkJCWlmIChzLT5tb2RlICYgU1NMX01PREVfUkVMRUFTRV9CVUZGRVJTKQorCQkJCQlzc2wzX3JlbGVhc2VfcmVhZF9idWZmZXIocyk7CisJCQkJfQorCQkJfQorCQlyZXR1cm4obik7CisJCX0KKworCisJLyogSWYgd2UgZ2V0IGhlcmUsIHRoZW4gdHlwZSAhPSByci0+dHlwZTsgaWYgd2UgaGF2ZSBhIGhhbmRzaGFrZQorCSAqIG1lc3NhZ2UsIHRoZW4gaXQgd2FzIHVuZXhwZWN0ZWQgKEhlbGxvIFJlcXVlc3Qgb3IgQ2xpZW50IEhlbGxvKS4gKi8KKworCS8qIEluIGNhc2Ugb2YgcmVjb3JkIHR5cGVzIGZvciB3aGljaCB3ZSBoYXZlICdmcmFnbWVudCcgc3RvcmFnZSwKKwkgKiBmaWxsIHRoYXQgc28gdGhhdCB3ZSBjYW4gcHJvY2VzcyB0aGUgZGF0YSBhdCBhIGZpeGVkIHBsYWNlLgorCSAqLworCQl7CisJCXVuc2lnbmVkIGludCBkZXN0X21heGxlbiA9IDA7CisJCXVuc2lnbmVkIGNoYXIgKmRlc3QgPSBOVUxMOworCQl1bnNpZ25lZCBpbnQgKmRlc3RfbGVuID0gTlVMTDsKKworCQlpZiAocnItPnR5cGUgPT0gU1NMM19SVF9IQU5EU0hBS0UpCisJCQl7CisJCQlkZXN0X21heGxlbiA9IHNpemVvZiBzLT5zMy0+aGFuZHNoYWtlX2ZyYWdtZW50OworCQkJZGVzdCA9IHMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnQ7CisJCQlkZXN0X2xlbiA9ICZzLT5zMy0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbjsKKwkJCX0KKwkJZWxzZSBpZiAocnItPnR5cGUgPT0gU1NMM19SVF9BTEVSVCkKKwkJCXsKKwkJCWRlc3RfbWF4bGVuID0gc2l6ZW9mIHMtPnMzLT5hbGVydF9mcmFnbWVudDsKKwkJCWRlc3QgPSBzLT5zMy0+YWxlcnRfZnJhZ21lbnQ7CisJCQlkZXN0X2xlbiA9ICZzLT5zMy0+YWxlcnRfZnJhZ21lbnRfbGVuOworCQkJfQorCisJCWlmIChkZXN0X21heGxlbiA+IDApCisJCQl7CisJCQluID0gZGVzdF9tYXhsZW4gLSAqZGVzdF9sZW47IC8qIGF2YWlsYWJsZSBzcGFjZSBpbiAnZGVzdCcgKi8KKwkJCWlmIChyci0+bGVuZ3RoIDwgbikKKwkJCQluID0gcnItPmxlbmd0aDsgLyogYXZhaWxhYmxlIGJ5dGVzICovCisKKwkJCS8qIG5vdyBtb3ZlICduJyBieXRlczogKi8KKwkJCXdoaWxlIChuLS0gPiAwKQorCQkJCXsKKwkJCQlkZXN0WygqZGVzdF9sZW4pKytdID0gcnItPmRhdGFbcnItPm9mZisrXTsKKwkJCQlyci0+bGVuZ3RoLS07CisJCQkJfQorCisJCQlpZiAoKmRlc3RfbGVuIDwgZGVzdF9tYXhsZW4pCisJCQkJZ290byBzdGFydDsgLyogZnJhZ21lbnQgd2FzIHRvbyBzbWFsbCAqLworCQkJfQorCQl9CisKKwkvKiBzLT5zMy0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbiA9PSA0ICBpZmYgIHJyLT50eXBlID09IFNTTDNfUlRfSEFORFNIQUtFOworCSAqIHMtPnMzLT5hbGVydF9mcmFnbWVudF9sZW4gPT0gMiAgICAgIGlmZiAgcnItPnR5cGUgPT0gU1NMM19SVF9BTEVSVC4KKwkgKiAoUG9zc2libHkgcnIgaXMgJ2VtcHR5JyBub3csIGkuZS4gcnItPmxlbmd0aCBtYXkgYmUgMC4pICovCisKKwkvKiBJZiB3ZSBhcmUgYSBjbGllbnQsIGNoZWNrIGZvciBhbiBpbmNvbWluZyAnSGVsbG8gUmVxdWVzdCc6ICovCisJaWYgKCghcy0+c2VydmVyKSAmJgorCQkocy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPj0gNCkgJiYKKwkJKHMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnRbMF0gPT0gU1NMM19NVF9IRUxMT19SRVFVRVNUKSAmJgorCQkocy0+c2Vzc2lvbiAhPSBOVUxMKSAmJiAocy0+c2Vzc2lvbi0+Y2lwaGVyICE9IE5VTEwpKQorCQl7CisJCXMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnRfbGVuID0gMDsKKworCQlpZiAoKHMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnRbMV0gIT0gMCkgfHwKKwkJCShzLT5zMy0+aGFuZHNoYWtlX2ZyYWdtZW50WzJdICE9IDApIHx8CisJCQkocy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudFszXSAhPSAwKSkKKwkJCXsKKwkJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19SRUFEX0JZVEVTLFNTTF9SX0JBRF9IRUxMT19SRVFVRVNUKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKwkJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJCXMtPm1zZ19jYWxsYmFjaygwLCBzLT52ZXJzaW9uLCBTU0wzX1JUX0hBTkRTSEFLRSwgcy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudCwgNCwgcywgcy0+bXNnX2NhbGxiYWNrX2FyZyk7CisKKwkJaWYgKFNTTF9pc19pbml0X2ZpbmlzaGVkKHMpICYmCisJCQkhKHMtPnMzLT5mbGFncyAmIFNTTDNfRkxBR1NfTk9fUkVORUdPVElBVEVfQ0lQSEVSUykgJiYKKwkJCSFzLT5zMy0+cmVuZWdvdGlhdGUpCisJCQl7CisJCQlzc2wzX3JlbmVnb3RpYXRlKHMpOworCQkJaWYgKHNzbDNfcmVuZWdvdGlhdGVfY2hlY2socykpCisJCQkJeworCQkJCWk9cy0+aGFuZHNoYWtlX2Z1bmMocyk7CisJCQkJaWYgKGkgPCAwKSByZXR1cm4oaSk7CisJCQkJaWYgKGkgPT0gMCkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19SRUFEX0JZVEVTLFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQkJCXJldHVybigtMSk7CisJCQkJCX0KKworCQkJCWlmICghKHMtPm1vZGUgJiBTU0xfTU9ERV9BVVRPX1JFVFJZKSkKKwkJCQkJeworCQkJCQlpZiAocy0+czMtPnJidWYubGVmdCA9PSAwKSAvKiBubyByZWFkLWFoZWFkIGxlZnQ/ICovCisJCQkJCQl7CisJCQkJCQlCSU8gKmJpbzsKKwkJCQkJCS8qIEluIHRoZSBjYXNlIHdoZXJlIHdlIHRyeSB0byByZWFkIGFwcGxpY2F0aW9uIGRhdGEsCisJCQkJCQkgKiBidXQgd2UgdHJpZ2dlciBhbiBTU0wgaGFuZHNoYWtlLCB3ZSByZXR1cm4gLTEgd2l0aAorCQkJCQkJICogdGhlIHJldHJ5IG9wdGlvbiBzZXQuICBPdGhlcndpc2UgcmVuZWdvdGlhdGlvbiBtYXkKKwkJCQkJCSAqIGNhdXNlIG5hc3R5IHByb2JsZW1zIGluIHRoZSBibG9ja2luZyB3b3JsZCAqLworCQkJCQkJcy0+cndzdGF0ZT1TU0xfUkVBRElORzsKKwkJCQkJCWJpbz1TU0xfZ2V0X3JiaW8ocyk7CisJCQkJCQlCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYmlvKTsKKwkJCQkJCUJJT19zZXRfcmV0cnlfcmVhZChiaW8pOworCQkJCQkJcmV0dXJuKC0xKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJLyogd2UgZWl0aGVyIGZpbmlzaGVkIGEgaGFuZHNoYWtlIG9yIGlnbm9yZWQgdGhlIHJlcXVlc3QsCisJCSAqIG5vdyB0cnkgYWdhaW4gdG8gb2J0YWluIHRoZSAoYXBwbGljYXRpb24pIGRhdGEgd2Ugd2VyZSBhc2tlZCBmb3IgKi8KKwkJZ290byBzdGFydDsKKwkJfQorCS8qIElmIHdlIGFyZSBhIHNlcnZlciBhbmQgZ2V0IGEgY2xpZW50IGhlbGxvIHdoZW4gcmVuZWdvdGlhdGlvbiBpc24ndAorCSAqIGFsbG93ZWQgc2VuZCBiYWNrIGEgbm8gcmVuZWdvdGlhdGlvbiBhbGVydCBhbmQgY2Fycnkgb24uCisJICogV0FSTklORzogZXhwZXJpbWVudGFsIGNvZGUsIG5lZWRzIHJldmlld2luZyAoc3RldmUpCisJICovCisJaWYgKHMtPnNlcnZlciAmJgorCQlTU0xfaXNfaW5pdF9maW5pc2hlZChzKSAmJgorICAgIAkJIXMtPnMzLT5zZW5kX2Nvbm5lY3Rpb25fYmluZGluZyAmJgorCQkocy0+dmVyc2lvbiA+IFNTTDNfVkVSU0lPTikgJiYKKwkJKHMtPnMzLT5oYW5kc2hha2VfZnJhZ21lbnRfbGVuID49IDQpICYmCisJCShzLT5zMy0+aGFuZHNoYWtlX2ZyYWdtZW50WzBdID09IFNTTDNfTVRfQ0xJRU5UX0hFTExPKSAmJgorCQkocy0+c2Vzc2lvbiAhPSBOVUxMKSAmJiAocy0+c2Vzc2lvbi0+Y2lwaGVyICE9IE5VTEwpICYmCisJCSEocy0+Y3R4LT5vcHRpb25zICYgU1NMX09QX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTikpCisJCQorCQl7CisJCS8qcy0+czMtPmhhbmRzaGFrZV9mcmFnbWVudF9sZW4gPSAwOyovCisJCXJyLT5sZW5ndGggPSAwOworCQlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX1dBUk5JTkcsIFNTTF9BRF9OT19SRU5FR09USUFUSU9OKTsKKwkJZ290byBzdGFydDsKKwkJfQorCWlmIChzLT5zMy0+YWxlcnRfZnJhZ21lbnRfbGVuID49IDIpCisJCXsKKwkJaW50IGFsZXJ0X2xldmVsID0gcy0+czMtPmFsZXJ0X2ZyYWdtZW50WzBdOworCQlpbnQgYWxlcnRfZGVzY3IgPSBzLT5zMy0+YWxlcnRfZnJhZ21lbnRbMV07CisKKwkJcy0+czMtPmFsZXJ0X2ZyYWdtZW50X2xlbiA9IDA7CisKKwkJaWYgKHMtPm1zZ19jYWxsYmFjaykKKwkJCXMtPm1zZ19jYWxsYmFjaygwLCBzLT52ZXJzaW9uLCBTU0wzX1JUX0FMRVJULCBzLT5zMy0+YWxlcnRfZnJhZ21lbnQsIDIsIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOworCisJCWlmIChzLT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCQljYj1zLT5pbmZvX2NhbGxiYWNrOworCQllbHNlIGlmIChzLT5jdHgtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJCWNiPXMtPmN0eC0+aW5mb19jYWxsYmFjazsKKworCQlpZiAoY2IgIT0gTlVMTCkKKwkJCXsKKwkJCWogPSAoYWxlcnRfbGV2ZWwgPDwgOCkgfCBhbGVydF9kZXNjcjsKKwkJCWNiKHMsIFNTTF9DQl9SRUFEX0FMRVJULCBqKTsKKwkJCX0KKworCQlpZiAoYWxlcnRfbGV2ZWwgPT0gMSkgLyogd2FybmluZyAqLworCQkJeworCQkJcy0+czMtPndhcm5fYWxlcnQgPSBhbGVydF9kZXNjcjsKKwkJCWlmIChhbGVydF9kZXNjciA9PSBTU0xfQURfQ0xPU0VfTk9USUZZKQorCQkJCXsKKwkJCQlzLT5zaHV0ZG93biB8PSBTU0xfUkVDRUlWRURfU0hVVERPV047CisJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCS8qIFRoaXMgaXMgYSB3YXJuaW5nIGJ1dCB3ZSByZWNlaXZlIGl0IGlmIHdlIHJlcXVlc3RlZAorCQkJICogcmVuZWdvdGlhdGlvbiBhbmQgdGhlIHBlZXIgZGVuaWVkIGl0LiBUZXJtaW5hdGUgd2l0aAorCQkJICogYSBmYXRhbCBhbGVydCBiZWNhdXNlIGlmIGFwcGxpY2F0aW9uIHRyaWVkIHRvCisJCQkgKiByZW5lZ290aWF0aWUgaXQgcHJlc3VtYWJseSBoYWQgYSBnb29kIHJlYXNvbiBhbmQKKwkJCSAqIGV4cGVjdHMgaXQgdG8gc3VjY2VlZC4KKwkJCSAqCisJCQkgKiBJbiBmdXR1cmUgd2UgbWlnaHQgaGF2ZSBhIHJlbmVnb3RpYXRpb24gd2hlcmUgd2UKKwkJCSAqIGRvbid0IGNhcmUgaWYgdGhlIHBlZXIgcmVmdXNlZCBpdCB3aGVyZSB3ZSBjYXJyeSBvbi4KKwkJCSAqLworCQkJZWxzZSBpZiAoYWxlcnRfZGVzY3IgPT0gU1NMX0FEX05PX1JFTkVHT1RJQVRJT04pCisJCQkJeworCQkJCWFsID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJCVNTTGVycihTU0xfRl9TU0wzX1JFQURfQllURVMsU1NMX1JfTk9fUkVORUdPVElBVElPTik7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKGFsZXJ0X2xldmVsID09IDIpIC8qIGZhdGFsICovCisJCQl7CisJCQljaGFyIHRtcFsxNl07CisKKwkJCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJCQlzLT5zMy0+ZmF0YWxfYWxlcnQgPSBhbGVydF9kZXNjcjsKKwkJCVNTTGVycihTU0xfRl9TU0wzX1JFQURfQllURVMsIFNTTF9BRF9SRUFTT05fT0ZGU0VUICsgYWxlcnRfZGVzY3IpOworCQkJQklPX3NucHJpbnRmKHRtcCxzaXplb2YgdG1wLCIlZCIsYWxlcnRfZGVzY3IpOworCQkJRVJSX2FkZF9lcnJvcl9kYXRhKDIsIlNTTCBhbGVydCBudW1iZXIgIix0bXApOworCQkJcy0+c2h1dGRvd258PVNTTF9SRUNFSVZFRF9TSFVURE9XTjsKKwkJCVNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24ocy0+Y3R4LHMtPnNlc3Npb24pOworCQkJcmV0dXJuKDApOworCQkJfQorCQllbHNlCisJCQl7CisJCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19SRUFEX0JZVEVTLFNTTF9SX1VOS05PV05fQUxFUlRfVFlQRSk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCisJCWdvdG8gc3RhcnQ7CisJCX0KKworCWlmIChzLT5zaHV0ZG93biAmIFNTTF9TRU5UX1NIVVRET1dOKSAvKiBidXQgd2UgaGF2ZSBub3QgcmVjZWl2ZWQgYSBzaHV0ZG93biAqLworCQl7CisJCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJCXJyLT5sZW5ndGg9MDsKKwkJcmV0dXJuKDApOworCQl9CisKKwlpZiAocnItPnR5cGUgPT0gU1NMM19SVF9DSEFOR0VfQ0lQSEVSX1NQRUMpCisJCXsKKwkJLyogJ0NoYW5nZSBDaXBoZXIgU3BlYycgaXMganVzdCBhIHNpbmdsZSBieXRlLCBzbyB3ZSBrbm93CisJCSAqIGV4YWN0bHkgd2hhdCB0aGUgcmVjb3JkIHBheWxvYWQgaGFzIHRvIGxvb2sgbGlrZSAqLworCQlpZiAoCShyci0+bGVuZ3RoICE9IDEpIHx8IChyci0+b2ZmICE9IDApIHx8CisJCQkocnItPmRhdGFbMF0gIT0gU1NMM19NVF9DQ1MpKQorCQkJeworCQkJYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfUkVBRF9CWVRFUyxTU0xfUl9CQURfQ0hBTkdFX0NJUEhFUl9TUEVDKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKwkJLyogQ2hlY2sgd2UgaGF2ZSBhIGNpcGhlciB0byBjaGFuZ2UgdG8gKi8KKwkJaWYgKHMtPnMzLT50bXAubmV3X2NpcGhlciA9PSBOVUxMKQorCQkJeworCQkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJCVNTTGVycihTU0xfRl9TU0wzX1JFQURfQllURVMsU1NMX1JfQ0NTX1JFQ0VJVkVEX0VBUkxZKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisKKwkJcnItPmxlbmd0aD0wOworCisJCWlmIChzLT5tc2dfY2FsbGJhY2spCisJCQlzLT5tc2dfY2FsbGJhY2soMCwgcy0+dmVyc2lvbiwgU1NMM19SVF9DSEFOR0VfQ0lQSEVSX1NQRUMsIHJyLT5kYXRhLCAxLCBzLCBzLT5tc2dfY2FsbGJhY2tfYXJnKTsKKworCQlzLT5zMy0+Y2hhbmdlX2NpcGhlcl9zcGVjPTE7CisJCWlmICghc3NsM19kb19jaGFuZ2VfY2lwaGVyX3NwZWMocykpCisJCQlnb3RvIGVycjsKKwkJZWxzZQorCQkJZ290byBzdGFydDsKKwkJfQorCisJLyogVW5leHBlY3RlZCBoYW5kc2hha2UgbWVzc2FnZSAoQ2xpZW50IEhlbGxvLCBvciBwcm90b2NvbCB2aW9sYXRpb24pICovCisJaWYgKChzLT5zMy0+aGFuZHNoYWtlX2ZyYWdtZW50X2xlbiA+PSA0KSAmJgkhcy0+aW5faGFuZHNoYWtlKQorCQl7CisJCWlmICgoKHMtPnN0YXRlJlNTTF9TVF9NQVNLKSA9PSBTU0xfU1RfT0spICYmCisJCQkhKHMtPnMzLT5mbGFncyAmIFNTTDNfRkxBR1NfTk9fUkVORUdPVElBVEVfQ0lQSEVSUykpCisJCQl7CisjaWYgMCAvKiB3b3JrZWQgb25seSBiZWNhdXNlIEMgb3BlcmF0b3IgcHJlZmVyZW5jZXMgYXJlIG5vdCBhcyBleHBlY3RlZCAoYW5kCisgICAgICAgKiBiZWNhdXNlIHRoaXMgaXMgbm90IHJlYWxseSBuZWVkZWQgZm9yIGNsaWVudHMgZXhjZXB0IGZvciBkZXRlY3RpbmcKKyAgICAgICAqIHByb3RvY29sIHZpb2xhdGlvbnMpOiAqLworCQkJcy0+c3RhdGU9U1NMX1NUX0JFRk9SRXwocy0+c2VydmVyKQorCQkJCT9TU0xfU1RfQUNDRVBUCisJCQkJOlNTTF9TVF9DT05ORUNUOworI2Vsc2UKKwkJCXMtPnN0YXRlID0gcy0+c2VydmVyID8gU1NMX1NUX0FDQ0VQVCA6IFNTTF9TVF9DT05ORUNUOworI2VuZGlmCisJCQlzLT5uZXdfc2Vzc2lvbj0xOworCQkJfQorCQlpPXMtPmhhbmRzaGFrZV9mdW5jKHMpOworCQlpZiAoaSA8IDApIHJldHVybihpKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX1JFQURfQllURVMsU1NMX1JfU1NMX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCXJldHVybigtMSk7CisJCQl9CisKKwkJaWYgKCEocy0+bW9kZSAmIFNTTF9NT0RFX0FVVE9fUkVUUlkpKQorCQkJeworCQkJaWYgKHMtPnMzLT5yYnVmLmxlZnQgPT0gMCkgLyogbm8gcmVhZC1haGVhZCBsZWZ0PyAqLworCQkJCXsKKwkJCQlCSU8gKmJpbzsKKwkJCQkvKiBJbiB0aGUgY2FzZSB3aGVyZSB3ZSB0cnkgdG8gcmVhZCBhcHBsaWNhdGlvbiBkYXRhLAorCQkJCSAqIGJ1dCB3ZSB0cmlnZ2VyIGFuIFNTTCBoYW5kc2hha2UsIHdlIHJldHVybiAtMSB3aXRoCisJCQkJICogdGhlIHJldHJ5IG9wdGlvbiBzZXQuICBPdGhlcndpc2UgcmVuZWdvdGlhdGlvbiBtYXkKKwkJCQkgKiBjYXVzZSBuYXN0eSBwcm9ibGVtcyBpbiB0aGUgYmxvY2tpbmcgd29ybGQgKi8KKwkJCQlzLT5yd3N0YXRlPVNTTF9SRUFESU5HOworCQkJCWJpbz1TU0xfZ2V0X3JiaW8ocyk7CisJCQkJQklPX2NsZWFyX3JldHJ5X2ZsYWdzKGJpbyk7CisJCQkJQklPX3NldF9yZXRyeV9yZWFkKGJpbyk7CisJCQkJcmV0dXJuKC0xKTsKKwkJCQl9CisJCQl9CisJCWdvdG8gc3RhcnQ7CisJCX0KKworCXN3aXRjaCAocnItPnR5cGUpCisJCXsKKwlkZWZhdWx0OgorI2lmbmRlZiBPUEVOU1NMX05PX1RMUworCQkvKiBUTFMganVzdCBpZ25vcmVzIHVua25vd24gbWVzc2FnZSB0eXBlcyAqLworCQlpZiAocy0+dmVyc2lvbiA9PSBUTFMxX1ZFUlNJT04pCisJCQl7CisJCQlyci0+bGVuZ3RoID0gMDsKKwkJCWdvdG8gc3RhcnQ7CisJCQl9CisjZW5kaWYKKwkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfUkVBRF9CWVRFUyxTU0xfUl9VTkVYUEVDVEVEX1JFQ09SRCk7CisJCWdvdG8gZl9lcnI7CisJY2FzZSBTU0wzX1JUX0NIQU5HRV9DSVBIRVJfU1BFQzoKKwljYXNlIFNTTDNfUlRfQUxFUlQ6CisJY2FzZSBTU0wzX1JUX0hBTkRTSEFLRToKKwkJLyogd2UgYWxyZWFkeSBoYW5kbGVkIGFsbCBvZiB0aGVzZSwgd2l0aCB0aGUgcG9zc2libGUgZXhjZXB0aW9uCisJCSAqIG9mIFNTTDNfUlRfSEFORFNIQUtFIHdoZW4gcy0+aW5faGFuZHNoYWtlIGlzIHNldCwgYnV0IHRoYXQKKwkJICogc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiB0eXBlICE9IHJyLT50eXBlICovCisJCWFsPVNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7CisJCVNTTGVycihTU0xfRl9TU0wzX1JFQURfQllURVMsRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlnb3RvIGZfZXJyOworCWNhc2UgU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBOgorCQkvKiBBdCB0aGlzIHBvaW50LCB3ZSB3ZXJlIGV4cGVjdGluZyBoYW5kc2hha2UgZGF0YSwKKwkJICogYnV0IGhhdmUgYXBwbGljYXRpb24gZGF0YS4gIElmIHRoZSBsaWJyYXJ5IHdhcworCQkgKiBydW5uaW5nIGluc2lkZSBzc2wzX3JlYWQoKSAoaS5lLiBpbl9yZWFkX2FwcF9kYXRhCisJCSAqIGlzIHNldCkgYW5kIGl0IG1ha2VzIHNlbnNlIHRvIHJlYWQgYXBwbGljYXRpb24gZGF0YQorCQkgKiBhdCB0aGlzIHBvaW50IChzZXNzaW9uIHJlbmVnb3RpYXRpb24gbm90IHlldCBzdGFydGVkKSwKKwkJICogd2Ugd2lsbCBpbmR1bGdlIGl0LgorCQkgKi8KKwkJaWYgKHMtPnMzLT5pbl9yZWFkX2FwcF9kYXRhICYmCisJCQkocy0+czMtPnRvdGFsX3JlbmVnb3RpYXRpb25zICE9IDApICYmCisJCQkoKAorCQkJCShzLT5zdGF0ZSAmIFNTTF9TVF9DT05ORUNUKSAmJgorCQkJCShzLT5zdGF0ZSA+PSBTU0wzX1NUX0NXX0NMTlRfSEVMTE9fQSkgJiYKKwkJCQkocy0+c3RhdGUgPD0gU1NMM19TVF9DUl9TUlZSX0hFTExPX0EpCisJCQkJKSB8fCAoCisJCQkJCShzLT5zdGF0ZSAmIFNTTF9TVF9BQ0NFUFQpICYmCisJCQkJCShzLT5zdGF0ZSA8PSBTU0wzX1NUX1NXX0hFTExPX1JFUV9BKSAmJgorCQkJCQkocy0+c3RhdGUgPj0gU1NMM19TVF9TUl9DTE5UX0hFTExPX0EpCisJCQkJCSkKKwkJCQkpKQorCQkJeworCQkJcy0+czMtPmluX3JlYWRfYXBwX2RhdGE9MjsKKwkJCXJldHVybigtMSk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWFsPVNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19SRUFEX0JZVEVTLFNTTF9SX1VORVhQRUNURURfUkVDT1JEKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCX0KKwkvKiBub3QgcmVhY2hlZCAqLworCitmX2VycjoKKwlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLGFsKTsKK2VycjoKKwlyZXR1cm4oLTEpOworCX0KKworaW50IHNzbDNfZG9fY2hhbmdlX2NpcGhlcl9zcGVjKFNTTCAqcykKKwl7CisJaW50IGk7CisJY29uc3QgY2hhciAqc2VuZGVyOworCWludCBzbGVuOworCisJaWYgKHMtPnN0YXRlICYgU1NMX1NUX0FDQ0VQVCkKKwkJaT1TU0wzX0NIQU5HRV9DSVBIRVJfU0VSVkVSX1JFQUQ7CisJZWxzZQorCQlpPVNTTDNfQ0hBTkdFX0NJUEhFUl9DTElFTlRfUkVBRDsKKworCWlmIChzLT5zMy0+dG1wLmtleV9ibG9jayA9PSBOVUxMKQorCQl7CisJCWlmIChzLT5zZXNzaW9uID09IE5VTEwpIAorCQkJeworCQkJLyogbWlnaHQgaGFwcGVuIGlmIGR0bHMxX3JlYWRfYnl0ZXMoKSBjYWxscyB0aGlzICovCisJCQlTU0xlcnIoU1NMX0ZfU1NMM19ET19DSEFOR0VfQ0lQSEVSX1NQRUMsU1NMX1JfQ0NTX1JFQ0VJVkVEX0VBUkxZKTsKKwkJCXJldHVybiAoMCk7CisJCQl9CisKKwkJcy0+c2Vzc2lvbi0+Y2lwaGVyPXMtPnMzLT50bXAubmV3X2NpcGhlcjsKKwkJaWYgKCFzLT5tZXRob2QtPnNzbDNfZW5jLT5zZXR1cF9rZXlfYmxvY2socykpIHJldHVybigwKTsKKwkJfQorCisJaWYgKCFzLT5tZXRob2QtPnNzbDNfZW5jLT5jaGFuZ2VfY2lwaGVyX3N0YXRlKHMsaSkpCisJCXJldHVybigwKTsKKworCS8qIHdlIGhhdmUgdG8gcmVjb3JkIHRoZSBtZXNzYWdlIGRpZ2VzdCBhdAorCSAqIHRoaXMgcG9pbnQgc28gd2UgY2FuIGdldCBpdCBiZWZvcmUgd2UgcmVhZAorCSAqIHRoZSBmaW5pc2hlZCBtZXNzYWdlICovCisJaWYgKHMtPnN0YXRlICYgU1NMX1NUX0NPTk5FQ1QpCisJCXsKKwkJc2VuZGVyPXMtPm1ldGhvZC0+c3NsM19lbmMtPnNlcnZlcl9maW5pc2hlZF9sYWJlbDsKKwkJc2xlbj1zLT5tZXRob2QtPnNzbDNfZW5jLT5zZXJ2ZXJfZmluaXNoZWRfbGFiZWxfbGVuOworCQl9CisJZWxzZQorCQl7CisJCXNlbmRlcj1zLT5tZXRob2QtPnNzbDNfZW5jLT5jbGllbnRfZmluaXNoZWRfbGFiZWw7CisJCXNsZW49cy0+bWV0aG9kLT5zc2wzX2VuYy0+Y2xpZW50X2ZpbmlzaGVkX2xhYmVsX2xlbjsKKwkJfQorCisJcy0+czMtPnRtcC5wZWVyX2ZpbmlzaF9tZF9sZW4gPSBzLT5tZXRob2QtPnNzbDNfZW5jLT5maW5hbF9maW5pc2hfbWFjKHMsCisJCXNlbmRlcixzbGVuLHMtPnMzLT50bXAucGVlcl9maW5pc2hfbWQpOworCisJcmV0dXJuKDEpOworCX0KKworaW50IHNzbDNfc2VuZF9hbGVydChTU0wgKnMsIGludCBsZXZlbCwgaW50IGRlc2MpCisJeworCS8qIE1hcCB0bHMvc3NsIGFsZXJ0IHZhbHVlIHRvIGNvcnJlY3Qgb25lICovCisJZGVzYz1zLT5tZXRob2QtPnNzbDNfZW5jLT5hbGVydF92YWx1ZShkZXNjKTsKKwlpZiAocy0+dmVyc2lvbiA9PSBTU0wzX1ZFUlNJT04gJiYgZGVzYyA9PSBTU0xfQURfUFJPVE9DT0xfVkVSU0lPTikKKwkJZGVzYyA9IFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsgLyogU1NMIDMuMCBkb2VzIG5vdCBoYXZlIHByb3RvY29sX3ZlcnNpb24gYWxlcnRzICovCisJaWYgKGRlc2MgPCAwKSByZXR1cm4gLTE7CisJLyogSWYgYSBmYXRhbCBvbmUsIHJlbW92ZSBmcm9tIGNhY2hlICovCisJaWYgKChsZXZlbCA9PSAyKSAmJiAocy0+c2Vzc2lvbiAhPSBOVUxMKSkKKwkJU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbihzLT5jdHgscy0+c2Vzc2lvbik7CisKKwlzLT5zMy0+YWxlcnRfZGlzcGF0Y2g9MTsKKwlzLT5zMy0+c2VuZF9hbGVydFswXT1sZXZlbDsKKwlzLT5zMy0+c2VuZF9hbGVydFsxXT1kZXNjOworCWlmIChzLT5zMy0+d2J1Zi5sZWZ0ID09IDApIC8qIGRhdGEgc3RpbGwgYmVpbmcgd3JpdHRlbiBvdXQ/ICovCisJCXJldHVybiBzLT5tZXRob2QtPnNzbF9kaXNwYXRjaF9hbGVydChzKTsKKwkvKiBlbHNlIGRhdGEgaXMgc3RpbGwgYmVpbmcgd3JpdHRlbiBvdXQsIHdlIHdpbGwgZ2V0IHdyaXR0ZW4KKwkgKiBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZSAqLworCXJldHVybiAtMTsKKwl9CisKK2ludCBzc2wzX2Rpc3BhdGNoX2FsZXJ0KFNTTCAqcykKKwl7CisJaW50IGksajsKKwl2b2lkICgqY2IpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpPU5VTEw7CisKKwlzLT5zMy0+YWxlcnRfZGlzcGF0Y2g9MDsKKwlpID0gZG9fc3NsM193cml0ZShzLCBTU0wzX1JUX0FMRVJULCAmcy0+czMtPnNlbmRfYWxlcnRbMF0sIDIsIDApOworCWlmIChpIDw9IDApCisJCXsKKwkJcy0+czMtPmFsZXJ0X2Rpc3BhdGNoPTE7CisJCX0KKwllbHNlCisJCXsKKwkJLyogQWxlcnQgc2VudCB0byBCSU8uICBJZiBpdCBpcyBpbXBvcnRhbnQsIGZsdXNoIGl0IG5vdy4KKwkJICogSWYgdGhlIG1lc3NhZ2UgZG9lcyBub3QgZ2V0IHNlbnQgZHVlIHRvIG5vbi1ibG9ja2luZyBJTywKKwkJICogd2Ugd2lsbCBub3Qgd29ycnkgdG9vIG11Y2guICovCisJCWlmIChzLT5zMy0+c2VuZF9hbGVydFswXSA9PSBTU0wzX0FMX0ZBVEFMKQorCQkJKHZvaWQpQklPX2ZsdXNoKHMtPndiaW8pOworCisJCWlmIChzLT5tc2dfY2FsbGJhY2spCisJCQlzLT5tc2dfY2FsbGJhY2soMSwgcy0+dmVyc2lvbiwgU1NMM19SVF9BTEVSVCwgcy0+czMtPnNlbmRfYWxlcnQsIDIsIHMsIHMtPm1zZ19jYWxsYmFja19hcmcpOworCisJCWlmIChzLT5pbmZvX2NhbGxiYWNrICE9IE5VTEwpCisJCQljYj1zLT5pbmZvX2NhbGxiYWNrOworCQllbHNlIGlmIChzLT5jdHgtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJCWNiPXMtPmN0eC0+aW5mb19jYWxsYmFjazsKKworCQlpZiAoY2IgIT0gTlVMTCkKKwkJCXsKKwkJCWo9KHMtPnMzLT5zZW5kX2FsZXJ0WzBdPDw4KXxzLT5zMy0+c2VuZF9hbGVydFsxXTsKKwkJCWNiKHMsU1NMX0NCX1dSSVRFX0FMRVJULGopOworCQkJfQorCQl9CisJcmV0dXJuKGkpOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zM19zcnZyLmMgYi9saWIvb3BlbnNzbC9zc2wvczNfc3J2ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkM2I1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvczNfc3J2ci5jCkBAIC0wLDAgKzEsMzE5MiBAQAorLyogc3NsL3MzX3NydnIuYyAtKi0gbW9kZTpDOyBjLWZpbGUtc3R5bGU6ICJlYXkiIC0qLSAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGFyZSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgYXJlIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZSBwcm92aWRlZCBhYm92ZS4KKyAqCisgKiBFQ0MgY2lwaGVyIHN1aXRlIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkKKyAqIFZpcHVsIEd1cHRhIGFuZCBTdW1pdCBHdXB0YSBvZiBTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcy4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNSBOb2tpYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgcG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgaXMgZGV2ZWxvcGVkIGJ5CisgKiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiwgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mCisgKiBOb2tpYSBDb3Jwb3JhdGlvbiwgY29uc2lzdHMgb2YgdGhlICJQU0siIChQcmUtU2hhcmVkIEtleSkgY2lwaGVyc3VpdGVzCisgKiBzdXBwb3J0IChzZWUgUkZDIDQyNzkpIHRvIE9wZW5TU0wuCisgKgorICogTm8gcGF0ZW50IGxpY2Vuc2VzIG9yIG90aGVyIHJpZ2h0cyBleGNlcHQgdGhvc2UgZXhwcmVzc2x5IHN0YXRlZCBpbgorICogdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UgbGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgZ3JhbnRlZCBvciByZWNlaXZlZAorICogZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwsIG9yIG90aGVyd2lzZS4KKyAqCisgKiBObyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBOb2tpYSB0aGF0IHRoZSBDb250cmlidXRpb24gZG9lcyBub3QKKyAqIGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgdGhpcmQKKyAqIHBhcnR5IG9yIHRoYXQgdGhlIGxpY2Vuc2UgcHJvdmlkZXMgeW91IHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgcmlnaHRzCisgKiB0byBtYWtlIHVzZSBvZiB0aGUgQ29udHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQuIElOCisgKiBBRERJVElPTiBUTyBUSEUgRElTQ0xBSU1FUlMgSU5DTFVERUQgSU4gVEhFIExJQ0VOU0UsIE5PS0lBCisgKiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgRk9SIENMQUlNUyBCUk9VR0hUIEJZIFlPVSBPUiBBTlkKKyAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgorICogT1RIRVJXSVNFLgorICovCisKKyNkZWZpbmUgUkVVU0VfQ0lQSEVSX0JVRworI2RlZmluZSBORVRTQ0FQRV9IQU5HX0JVRworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgImtzc2xfbGNsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvaG1hYy5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKyNpbmNsdWRlIDxvcGVuc3NsL2tyYjVfYXNuLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL21kNS5oPgorCitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqc3NsM19nZXRfc2VydmVyX21ldGhvZChpbnQgdmVyKTsKKworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKnNzbDNfZ2V0X3NlcnZlcl9tZXRob2QoaW50IHZlcikKKwl7CisJaWYgKHZlciA9PSBTU0wzX1ZFUlNJT04pCisJCXJldHVybihTU0x2M19zZXJ2ZXJfbWV0aG9kKCkpOworCWVsc2UKKwkJcmV0dXJuKE5VTEwpOworCX0KKworSU1QTEVNRU5UX3NzbDNfbWV0aF9mdW5jKFNTTHYzX3NlcnZlcl9tZXRob2QsCisJCQlzc2wzX2FjY2VwdCwKKwkJCXNzbF91bmRlZmluZWRfZnVuY3Rpb24sCisJCQlzc2wzX2dldF9zZXJ2ZXJfbWV0aG9kKQorCitpbnQgc3NsM19hY2NlcHQoU1NMICpzKQorCXsKKwlCVUZfTUVNICpidWY7CisJdW5zaWduZWQgbG9uZyBhbGdfayxUaW1lPSh1bnNpZ25lZCBsb25nKXRpbWUoTlVMTCk7CisJdm9pZCAoKmNiKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKT1OVUxMOworCWludCByZXQ9IC0xOworCWludCBuZXdfc3RhdGUsc3RhdGUsc2tpcD0wOworCisJUkFORF9hZGQoJlRpbWUsc2l6ZW9mKFRpbWUpLDApOworCUVSUl9jbGVhcl9lcnJvcigpOworCWNsZWFyX3N5c19lcnJvcigpOworCisJaWYgKHMtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJY2I9cy0+aW5mb19jYWxsYmFjazsKKwllbHNlIGlmIChzLT5jdHgtPmluZm9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJY2I9cy0+Y3R4LT5pbmZvX2NhbGxiYWNrOworCisJLyogaW5pdCB0aGluZ3MgdG8gYmxhbmsgKi8KKwlzLT5pbl9oYW5kc2hha2UrKzsKKwlpZiAoIVNTTF9pbl9pbml0KHMpIHx8IFNTTF9pbl9iZWZvcmUocykpIFNTTF9jbGVhcihzKTsKKworCWlmIChzLT5jZXJ0ID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfQUNDRVBULFNTTF9SX05PX0NFUlRJRklDQVRFX1NFVCk7CisJCXJldHVybigtMSk7CisJCX0KKworCWZvciAoOzspCisJCXsKKwkJc3RhdGU9cy0+c3RhdGU7CisKKwkJc3dpdGNoIChzLT5zdGF0ZSkKKwkJCXsKKwkJY2FzZSBTU0xfU1RfUkVORUdPVElBVEU6CisJCQlzLT5uZXdfc2Vzc2lvbj0xOworCQkJLyogcy0+c3RhdGU9U1NMX1NUX0FDQ0VQVDsgKi8KKworCQljYXNlIFNTTF9TVF9CRUZPUkU6CisJCWNhc2UgU1NMX1NUX0FDQ0VQVDoKKwkJY2FzZSBTU0xfU1RfQkVGT1JFfFNTTF9TVF9BQ0NFUFQ6CisJCWNhc2UgU1NMX1NUX09LfFNTTF9TVF9BQ0NFUFQ6CisKKwkJCXMtPnNlcnZlcj0xOworCQkJaWYgKGNiICE9IE5VTEwpIGNiKHMsU1NMX0NCX0hBTkRTSEFLRV9TVEFSVCwxKTsKKworCQkJaWYgKChzLT52ZXJzaW9uPj44KSAhPSAzKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19BQ0NFUFQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJcy0+dHlwZT1TU0xfU1RfQUNDRVBUOworCisJCQlpZiAocy0+aW5pdF9idWYgPT0gTlVMTCkKKwkJCQl7CisJCQkJaWYgKChidWY9QlVGX01FTV9uZXcoKSkgPT0gTlVMTCkKKwkJCQkJeworCQkJCQlyZXQ9IC0xOworCQkJCQlnb3RvIGVuZDsKKwkJCQkJfQorCQkJCWlmICghQlVGX01FTV9ncm93KGJ1ZixTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgpKQorCQkJCQl7CisJCQkJCXJldD0gLTE7CisJCQkJCWdvdG8gZW5kOworCQkJCQl9CisJCQkJcy0+aW5pdF9idWY9YnVmOworCQkJCX0KKworCQkJaWYgKCFzc2wzX3NldHVwX2J1ZmZlcnMocykpCisJCQkJeworCQkJCXJldD0gLTE7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCisJCQlzLT5pbml0X251bT0wOworCisJCQlpZiAocy0+c3RhdGUgIT0gU1NMX1NUX1JFTkVHT1RJQVRFKQorCQkJCXsKKwkJCQkvKiBPaywgd2Ugbm93IG5lZWQgdG8gcHVzaCBvbiBhIGJ1ZmZlcmluZyBCSU8gc28gdGhhdAorCQkJCSAqIHRoZSBvdXRwdXQgaXMgc2VudCBpbiBhIHdheSB0aGF0IFRDUCBsaWtlcyA6LSkKKwkJCQkgKi8KKwkJCQlpZiAoIXNzbF9pbml0X3diaW9fYnVmZmVyKHMsMSkpIHsgcmV0PSAtMTsgZ290byBlbmQ7IH0KKwkJCQkKKwkJCQlzc2wzX2luaXRfZmluaXNoZWRfbWFjKHMpOworCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1JfQ0xOVF9IRUxMT19BOworCQkJCXMtPmN0eC0+c3RhdHMuc2Vzc19hY2NlcHQrKzsKKwkJCQl9CisJCQllbHNlIGlmICghcy0+czMtPnNlbmRfY29ubmVjdGlvbl9iaW5kaW5nICYmCisJCQkJIShzLT5vcHRpb25zICYgU1NMX09QX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTikpCisJCQkJeworCQkJCS8qIFNlcnZlciBhdHRlbXB0aW5nIHRvIHJlbmVnb3RpYXRlIHdpdGgKKwkJCQkgKiBjbGllbnQgdGhhdCBkb2Vzbid0IHN1cHBvcnQgc2VjdXJlCisJCQkJICogcmVuZWdvdGlhdGlvbi4KKwkJCQkgKi8KKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19BQ0NFUFQsIFNTTF9SX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTl9ESVNBQkxFRCk7CisJCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCQkJCXJldCA9IC0xOworCQkJCWdvdG8gZW5kOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJLyogcy0+c3RhdGUgPT0gU1NMX1NUX1JFTkVHT1RJQVRFLAorCQkJCSAqIHdlIHdpbGwganVzdCBzZW5kIGEgSGVsbG9SZXF1ZXN0ICovCisJCQkJcy0+Y3R4LT5zdGF0cy5zZXNzX2FjY2VwdF9yZW5lZ290aWF0ZSsrOworCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfSEVMTE9fUkVRX0E7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9BOgorCQljYXNlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0I6CisKKwkJCXMtPnNodXRkb3duPTA7CisJCQlyZXQ9c3NsM19zZW5kX2hlbGxvX3JlcXVlc3Qocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTDNfU1RfU1dfSEVMTE9fUkVRX0M7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX0ZMVVNIOworCQkJcy0+aW5pdF9udW09MDsKKworCQkJc3NsM19pbml0X2ZpbmlzaGVkX21hYyhzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19IRUxMT19SRVFfQzoKKwkJCXMtPnN0YXRlPVNTTF9TVF9PSzsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TUl9DTE5UX0hFTExPX0E6CisJCWNhc2UgU1NMM19TVF9TUl9DTE5UX0hFTExPX0I6CisJCWNhc2UgU1NMM19TVF9TUl9DTE5UX0hFTExPX0M6CisKKwkJCXMtPnNodXRkb3duPTA7CisJCQlyZXQ9c3NsM19nZXRfY2xpZW50X2hlbGxvKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCQorCQkJcy0+bmV3X3Nlc3Npb24gPSAyOworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19TUlZSX0hFTExPX0E7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQToKKwkJY2FzZSBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQjoKKwkJCXJldD1zc2wzX3NlbmRfc2VydmVyX2hlbGxvKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJCWlmIChzLT5oaXQpCisJCQkJeworCQkJCWlmIChzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkKQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0E7CisJCQkJZWxzZQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX0NIQU5HRV9BOworCQkJCX0KKyNlbHNlCisJCQlpZiAocy0+aGl0KQorCQkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX0NIQU5HRV9BOworI2VuZGlmCisJCQllbHNlCisJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19DRVJUX0E7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NXX0NFUlRfQToKKwkJY2FzZSBTU0wzX1NUX1NXX0NFUlRfQjoKKwkJCS8qIENoZWNrIGlmIGl0IGlzIGFub24gREggb3IgYW5vbiBFQ0RILCAqLworCQkJLyogbm9ybWFsIFBTSyBvciBLUkI1ICovCisJCQlpZiAoIShzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoICYgU1NMX2FOVUxMKQorCQkJCSYmICEocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleSAmIFNTTF9rUFNLKQorCQkJCSYmICEocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aCAmIFNTTF9hS1JCNSkpCisJCQkJeworCQkJCXJldD1zc2wzX3NlbmRfc2VydmVyX2NlcnRpZmljYXRlKHMpOworCQkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJCQkJaWYgKHMtPnRsc2V4dF9zdGF0dXNfZXhwZWN0ZWQpCisJCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQTsKKwkJCQllbHNlCisJCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfS0VZX0VYQ0hfQTsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCXNraXAgPSAxOworCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfS0VZX0VYQ0hfQTsKKwkJCQl9CisjZWxzZQorCQkJCX0KKwkJCWVsc2UKKwkJCQlza2lwPTE7CisKKwkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfS0VZX0VYQ0hfQTsKKyNlbmRpZgorCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19LRVlfRVhDSF9BOgorCQljYXNlIFNTTDNfU1RfU1dfS0VZX0VYQ0hfQjoKKwkJCWFsZ19rID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKKworCQkJLyogY2xlYXIgdGhpcywgaXQgbWF5IGdldCByZXNldCBieQorCQkJICogc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlICovCisJCQlpZiAoKHMtPm9wdGlvbnMgJiBTU0xfT1BfRVBIRU1FUkFMX1JTQSkKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisJCQkJJiYgIShhbGdfayAmIFNTTF9rS1JCNSkKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0tSQjUgKi8KKwkJCQkpCisJCQkJLyogb3B0aW9uIFNTTF9PUF9FUEhFTUVSQUxfUlNBIHNlbmRzIHRlbXBvcmFyeSBSU0Ega2V5CisJCQkJICogZXZlbiB3aGVuIGZvcmJpZGRlbiBieSBwcm90b2NvbCBzcGVjcworCQkJCSAqIChoYW5kc2hha2UgbWF5IGZhaWwgYXMgY2xpZW50cyBhcmUgbm90IHJlcXVpcmVkIHRvCisJCQkJICogYmUgYWJsZSB0byBoYW5kbGUgdGhpcykgKi8KKwkJCQlzLT5zMy0+dG1wLnVzZV9yc2FfdG1wPTE7CisJCQllbHNlCisJCQkJcy0+czMtPnRtcC51c2VfcnNhX3RtcD0wOworCisKKwkJCS8qIG9ubHkgc2VuZCBpZiBhIERIIGtleSBleGNoYW5nZSwgZm9ydGV6emEgb3IKKwkJCSAqIFJTQSBidXQgd2UgaGF2ZSBhIHNpZ24gb25seSBjZXJ0aWZpY2F0ZQorCQkJICoKKwkJCSAqIFBTSzogbWF5IHNlbmQgUFNLIGlkZW50aXR5IGhpbnRzCisJCQkgKgorCQkJICogRm9yIEVDQyBjaXBoZXJzdWl0ZXMsIHdlIHNlbmQgYSBzZXJ2ZXJLZXlFeGNoYW5nZQorCQkJICogbWVzc2FnZSBvbmx5IGlmIHRoZSBjaXBoZXIgc3VpdGUgaXMgZWl0aGVyCisJCQkgKiBFQ0RILWFub24gb3IgRUNESEUuIEluIG90aGVyIGNhc2VzLCB0aGUKKwkJCSAqIHNlcnZlciBjZXJ0aWZpY2F0ZSBjb250YWlucyB0aGUgc2VydmVyJ3MKKwkJCSAqIHB1YmxpYyBrZXkgZm9yIGtleSBleGNoYW5nZS4KKwkJCSAqLworCQkJaWYgKHMtPnMzLT50bXAudXNlX3JzYV90bXAKKwkJCS8qIFBTSzogc2VuZCBTZXJ2ZXJLZXlFeGNoYW5nZSBpZiBQU0sgaWRlbnRpdHkKKwkJCSAqIGhpbnQgaWYgcHJvdmlkZWQgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwkJCSAgICB8fCAoKGFsZ19rICYgU1NMX2tQU0spICYmIHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQpCisjZW5kaWYKKwkJCSAgICB8fCAoYWxnX2sgJiAoU1NMX2tESHJ8U1NMX2tESGR8U1NMX2tFREgpKQorCQkJICAgIHx8IChhbGdfayAmIFNTTF9rRUVDREgpCisJCQkgICAgfHwgKChhbGdfayAmIFNTTF9rUlNBKQorCQkJCSYmIChzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS5wcml2YXRla2V5ID09IE5VTEwKKwkJCQkgICAgfHwgKFNTTF9DX0lTX0VYUE9SVChzLT5zMy0+dG1wLm5ld19jaXBoZXIpCisJCQkJCSYmIEVWUF9QS0VZX3NpemUocy0+Y2VydC0+cGtleXNbU1NMX1BLRVlfUlNBX0VOQ10ucHJpdmF0ZWtleSkqOCA+IFNTTF9DX0VYUE9SVF9QS0VZTEVOR1RIKHMtPnMzLT50bXAubmV3X2NpcGhlcikKKwkJCQkJKQorCQkJCSAgICApCisJCQkJKQorCQkJICAgICkKKwkJCQl7CisJCQkJcmV0PXNzbDNfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlKHMpOworCQkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQkJfQorCQkJZWxzZQorCQkJCXNraXA9MTsKKworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19DRVJUX1JFUV9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19DRVJUX1JFUV9BOgorCQljYXNlIFNTTDNfU1RfU1dfQ0VSVF9SRVFfQjoKKwkJCWlmICgvKiBkb24ndCByZXF1ZXN0IGNlcnQgdW5sZXNzIGFza2VkIGZvciBpdDogKi8KKwkJCQkhKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9QRUVSKSB8fAorCQkJCS8qIGlmIFNTTF9WRVJJRllfQ0xJRU5UX09OQ0UgaXMgc2V0LAorCQkJCSAqIGRvbid0IHJlcXVlc3QgY2VydCBkdXJpbmcgcmUtbmVnb3RpYXRpb246ICovCisJCQkJKChzLT5zZXNzaW9uLT5wZWVyICE9IE5VTEwpICYmCisJCQkJIChzLT52ZXJpZnlfbW9kZSAmIFNTTF9WRVJJRllfQ0xJRU5UX09OQ0UpKSB8fAorCQkJCS8qIG5ldmVyIHJlcXVlc3QgY2VydCBpbiBhbm9ueW1vdXMgY2lwaGVyc3VpdGVzCisJCQkJICogKHNlZSBzZWN0aW9uICJDZXJ0aWZpY2F0ZSByZXF1ZXN0IiBpbiBTU0wgMyBkcmFmdHMKKwkJCQkgKiBhbmQgaW4gUkZDIDIyNDYpOiAqLworCQkJCSgocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aCAmIFNTTF9hTlVMTCkgJiYKKwkJCQkgLyogLi4uIGV4Y2VwdCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpbnNpc3RzIG9uIHZlcmlmaWNhdGlvbgorCQkJCSAgKiAoYWdhaW5zdCB0aGUgc3BlY3MsIGJ1dCBzM19jbG50LmMgYWNjZXB0cyB0aGlzIGZvciBTU0wgMykgKi8KKwkJCQkgIShzLT52ZXJpZnlfbW9kZSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpKSB8fAorCQkJCSAvKiBuZXZlciByZXF1ZXN0IGNlcnQgaW4gS2VyYmVyb3MgY2lwaGVyc3VpdGVzICovCisJCQkJKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGggJiBTU0xfYUtSQjUpCisJCQkJLyogV2l0aCBub3JtYWwgUFNLIENlcnRpZmljYXRlcyBhbmQKKwkJCQkgKiBDZXJ0aWZpY2F0ZSBSZXF1ZXN0cyBhcmUgb21pdHRlZCAqLworCQkJCXx8IChzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5ICYgU1NMX2tQU0spKQorCQkJCXsKKwkJCQkvKiBubyBjZXJ0IHJlcXVlc3QgKi8KKwkJCQlza2lwPTE7CisJCQkJcy0+czMtPnRtcC5jZXJ0X3JlcXVlc3Q9MDsKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX1NSVlJfRE9ORV9BOworCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJcy0+czMtPnRtcC5jZXJ0X3JlcXVlc3Q9MTsKKwkJCQlyZXQ9c3NsM19zZW5kX2NlcnRpZmljYXRlX3JlcXVlc3Qocyk7CisJCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKyNpZm5kZWYgTkVUU0NBUEVfSEFOR19CVUcKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX1NSVlJfRE9ORV9BOworI2Vsc2UKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX0ZMVVNIOworCQkJCXMtPnMzLT50bXAubmV4dF9zdGF0ZT1TU0wzX1NUX1NSX0NFUlRfQTsKKyNlbmRpZgorCQkJCXMtPmluaXRfbnVtPTA7CisJCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NXX1NSVlJfRE9ORV9BOgorCQljYXNlIFNTTDNfU1RfU1dfU1JWUl9ET05FX0I6CisJCQlyZXQ9c3NsM19zZW5kX3NlcnZlcl9kb25lKHMpOworCQkJaWYgKHJldCA8PSAwKSBnb3RvIGVuZDsKKwkJCXMtPnMzLT50bXAubmV4dF9zdGF0ZT1TU0wzX1NUX1NSX0NFUlRfQTsKKwkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfRkxVU0g7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisJCQorCQljYXNlIFNTTDNfU1RfU1dfRkxVU0g6CisKKwkJCS8qIFRoaXMgY29kZSBvcmlnaW5hbGx5IGNoZWNrZWQgdG8gc2VlIGlmCisJCQkgKiBhbnkgZGF0YSB3YXMgcGVuZGluZyB1c2luZyBCSU9fQ1RSTF9JTkZPCisJCQkgKiBhbmQgdGhlbiBmbHVzaGVkLiBUaGlzIGNhdXNlZCBwcm9ibGVtcworCQkJICogYXMgZG9jdW1lbnRlZCBpbiBQUiMxOTM5LiBUaGUgcHJvcG9zZWQKKwkJCSAqIGZpeCBkb2Vzbid0IGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGlzIGlzc3VlCisJCQkgKiBhcyBidWdneSBpbXBsZW1lbnRhdGlvbnMgb2YgQklPX0NUUkxfUEVORElORworCQkJICogc3RpbGwgZXhpc3QuIFNvIGluc3RlYWQgd2UganVzdCBmbHVzaAorCQkJICogdW5jb25kaXRpb25hbGx5LgorCQkJICovCisKKwkJCXMtPnJ3c3RhdGU9U1NMX1dSSVRJTkc7CisJCQlpZiAoQklPX2ZsdXNoKHMtPndiaW8pIDw9IDApCisJCQkJeworCQkJCXJldD0gLTE7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJcy0+cndzdGF0ZT1TU0xfTk9USElORzsKKworCQkJcy0+c3RhdGU9cy0+czMtPnRtcC5uZXh0X3N0YXRlOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NSX0NFUlRfQToKKwkJY2FzZSBTU0wzX1NUX1NSX0NFUlRfQjoKKwkJCS8qIENoZWNrIGZvciBzZWNvbmQgY2xpZW50IGhlbGxvIChNUyBTR0MpICovCisJCQlyZXQgPSBzc2wzX2NoZWNrX2NsaWVudF9oZWxsbyhzKTsKKwkJCWlmIChyZXQgPD0gMCkKKwkJCQlnb3RvIGVuZDsKKwkJCWlmIChyZXQgPT0gMikKKwkJCQlzLT5zdGF0ZSA9IFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19DOworCQkJZWxzZSB7CisJCQkJaWYgKHMtPnMzLT50bXAuY2VydF9yZXF1ZXN0KQorCQkJCQl7CisJCQkJCXJldD1zc2wzX2dldF9jbGllbnRfY2VydGlmaWNhdGUocyk7CisJCQkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQkJCX0KKwkJCQlzLT5pbml0X251bT0wOworCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1JfS0VZX0VYQ0hfQTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TUl9LRVlfRVhDSF9BOgorCQljYXNlIFNTTDNfU1RfU1JfS0VZX0VYQ0hfQjoKKwkJCXJldD1zc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlKHMpOworCQkJaWYgKHJldCA8PSAwKQorCQkJCWdvdG8gZW5kOworCQkJaWYgKHJldCA9PSAyKQorCQkJCXsKKwkJCQkvKiBGb3IgdGhlIEVDREggY2lwaGVyc3VpdGVzIHdoZW4KKwkJCQkgKiB0aGUgY2xpZW50IHNlbmRzIGl0cyBFQ0RIIHB1YiBrZXkgaW4KKwkJCQkgKiBhIGNlcnRpZmljYXRlLCB0aGUgQ2VydGlmaWNhdGVWZXJpZnkKKwkJCQkgKiBtZXNzYWdlIGlzIG5vdCBzZW50LgorCQkJCSAqIEFsc28gZm9yIEdPU1QgY2lwaGVyc3VpdGVzIHdoZW4KKwkJCQkgKiB0aGUgY2xpZW50IHVzZXMgaXRzIGtleSBmcm9tIHRoZSBjZXJ0aWZpY2F0ZQorCQkJCSAqIGZvciBrZXkgZXhjaGFuZ2UuCisJCQkJICovCisJCQkJcy0+c3RhdGU9U1NMM19TVF9TUl9GSU5JU0hFRF9BOworCQkJCXMtPmluaXRfbnVtID0gMDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWludCBvZmZzZXQ9MDsKKwkJCQlpbnQgZGdzdF9udW07CisKKwkJCQlzLT5zdGF0ZT1TU0wzX1NUX1NSX0NFUlRfVlJGWV9BOworCQkJCXMtPmluaXRfbnVtPTA7CisKKwkJCQkvKiBXZSBuZWVkIHRvIGdldCBoYXNoZXMgaGVyZSBzbyBpZiB0aGVyZSBpcworCQkJCSAqIGEgY2xpZW50IGNlcnQsIGl0IGNhbiBiZSB2ZXJpZmllZAorCQkJCSAqIEZJWE1FIC0gZGlnZXN0IHByb2Nlc3NpbmcgZm9yIENlcnRpZmljYXRlVmVyaWZ5CisJCQkJICogc2hvdWxkIGJlIGdlbmVyYWxpemVkLiBCdXQgaXQgaXMgbmV4dCBzdGVwCisJCQkJICovCisJCQkJaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyKQorCQkJCQlpZiAoIXNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzKHMpKQorCQkJCQkJcmV0dXJuIC0xOworCQkJCWZvciAoZGdzdF9udW09MDsgZGdzdF9udW08U1NMX01BWF9ESUdFU1Q7ZGdzdF9udW0rKykJCisJCQkJCWlmIChzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbZGdzdF9udW1dKSAKKwkJCQkJCXsKKwkJCQkJCWludCBkZ3N0X3NpemU7CisKKwkJCQkJCXMtPm1ldGhvZC0+c3NsM19lbmMtPmNlcnRfdmVyaWZ5X21hYyhzLEVWUF9NRF9DVFhfdHlwZShzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbZGdzdF9udW1dKSwmKHMtPnMzLT50bXAuY2VydF92ZXJpZnlfbWRbb2Zmc2V0XSkpOworCQkJCQkJZGdzdF9zaXplPUVWUF9NRF9DVFhfc2l6ZShzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbZGdzdF9udW1dKTsKKwkJCQkJCWlmIChkZ3N0X3NpemUgPCAwKQorCQkJCQkJCXsKKwkJCQkJCQlyZXQgPSAtMTsKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCQl9CisJCQkJCQlvZmZzZXQrPWRnc3Rfc2l6ZTsKKwkJCQkJCX0JCQorCQkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TUl9DRVJUX1ZSRllfQToKKwkJY2FzZSBTU0wzX1NUX1NSX0NFUlRfVlJGWV9COgorCisJCQkvKiB3ZSBzaG91bGQgZGVjaWRlIGlmIHdlIGV4cGVjdGVkIHRoaXMgb25lICovCisJCQlyZXQ9c3NsM19nZXRfY2VydF92ZXJpZnkocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCisJCQlzLT5zdGF0ZT1TU0wzX1NUX1NSX0ZJTklTSEVEX0E7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTU0wzX1NUX1NSX0ZJTklTSEVEX0E6CisJCWNhc2UgU1NMM19TVF9TUl9GSU5JU0hFRF9COgorCQkJcmV0PXNzbDNfZ2V0X2ZpbmlzaGVkKHMsU1NMM19TVF9TUl9GSU5JU0hFRF9BLAorCQkJCVNTTDNfU1RfU1JfRklOSVNIRURfQik7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQkJaWYgKHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQpCisJCQkJcy0+c3RhdGU9U1NMM19TVF9TV19TRVNTSU9OX1RJQ0tFVF9BOworCQkJZWxzZSBpZiAocy0+aGl0KQorCQkJCXMtPnN0YXRlPVNTTF9TVF9PSzsKKyNlbHNlCisJCQlpZiAocy0+aGl0KQorCQkJCXMtPnN0YXRlPVNTTF9TVF9PSzsKKyNlbmRpZgorCQkJZWxzZQorCQkJCXMtPnN0YXRlPVNTTDNfU1RfU1dfQ0hBTkdFX0E7CisJCQlzLT5pbml0X251bT0wOworCQkJYnJlYWs7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJY2FzZSBTU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0E6CisJCWNhc2UgU1NMM19TVF9TV19TRVNTSU9OX1RJQ0tFVF9COgorCQkJcmV0PXNzbDNfc2VuZF9uZXdzZXNzaW9uX3RpY2tldChzKTsKKwkJCWlmIChyZXQgPD0gMCkgZ290byBlbmQ7CisJCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX0NIQU5HRV9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMM19TVF9TV19DRVJUX1NUQVRVU19BOgorCQljYXNlIFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQjoKKwkJCXJldD1zc2wzX3NlbmRfY2VydF9zdGF0dXMocyk7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19LRVlfRVhDSF9BOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisjZW5kaWYKKworCQljYXNlIFNTTDNfU1RfU1dfQ0hBTkdFX0E6CisJCWNhc2UgU1NMM19TVF9TV19DSEFOR0VfQjoKKworCQkJcy0+c2Vzc2lvbi0+Y2lwaGVyPXMtPnMzLT50bXAubmV3X2NpcGhlcjsKKwkJCWlmICghcy0+bWV0aG9kLT5zc2wzX2VuYy0+c2V0dXBfa2V5X2Jsb2NrKHMpKQorCQkJCXsgcmV0PSAtMTsgZ290byBlbmQ7IH0KKworCQkJcmV0PXNzbDNfc2VuZF9jaGFuZ2VfY2lwaGVyX3NwZWMocywKKwkJCQlTU0wzX1NUX1NXX0NIQU5HRV9BLFNTTDNfU1RfU1dfQ0hBTkdFX0IpOworCisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19GSU5JU0hFRF9BOworCQkJcy0+aW5pdF9udW09MDsKKworCQkJaWYgKCFzLT5tZXRob2QtPnNzbDNfZW5jLT5jaGFuZ2VfY2lwaGVyX3N0YXRlKHMsCisJCQkJU1NMM19DSEFOR0VfQ0lQSEVSX1NFUlZFUl9XUklURSkpCisJCQkJeworCQkJCXJldD0gLTE7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFNTTDNfU1RfU1dfRklOSVNIRURfQToKKwkJY2FzZSBTU0wzX1NUX1NXX0ZJTklTSEVEX0I6CisJCQlyZXQ9c3NsM19zZW5kX2ZpbmlzaGVkKHMsCisJCQkJU1NMM19TVF9TV19GSU5JU0hFRF9BLFNTTDNfU1RfU1dfRklOSVNIRURfQiwKKwkJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5zZXJ2ZXJfZmluaXNoZWRfbGFiZWwsCisJCQkJcy0+bWV0aG9kLT5zc2wzX2VuYy0+c2VydmVyX2ZpbmlzaGVkX2xhYmVsX2xlbik7CisJCQlpZiAocmV0IDw9IDApIGdvdG8gZW5kOworCQkJcy0+c3RhdGU9U1NMM19TVF9TV19GTFVTSDsKKwkJCWlmIChzLT5oaXQpCisJCQkJcy0+czMtPnRtcC5uZXh0X3N0YXRlPVNTTDNfU1RfU1JfRklOSVNIRURfQTsKKwkJCWVsc2UKKwkJCQlzLT5zMy0+dG1wLm5leHRfc3RhdGU9U1NMX1NUX09LOworCQkJcy0+aW5pdF9udW09MDsKKwkJCWJyZWFrOworCisJCWNhc2UgU1NMX1NUX09LOgorCQkJLyogY2xlYW4gYSBmZXcgdGhpbmdzIHVwICovCisJCQlzc2wzX2NsZWFudXBfa2V5X2Jsb2NrKHMpOworCisJCQlCVUZfTUVNX2ZyZWUocy0+aW5pdF9idWYpOworCQkJcy0+aW5pdF9idWY9TlVMTDsKKworCQkJLyogcmVtb3ZlIGJ1ZmZlcmluZyBvbiBvdXRwdXQgKi8KKwkJCXNzbF9mcmVlX3diaW9fYnVmZmVyKHMpOworCisJCQlzLT5pbml0X251bT0wOworCisJCQlpZiAocy0+bmV3X3Nlc3Npb24gPT0gMikgLyogc2tpcHBlZCBpZiB3ZSBqdXN0IHNlbnQgYSBIZWxsb1JlcXVlc3QgKi8KKwkJCQl7CisJCQkJLyogYWN0dWFsbHkgbm90IG5lY2Vzc2FyaWx5IGEgJ25ldycgc2Vzc2lvbiB1bmxlc3MKKwkJCQkgKiBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04gaXMgc2V0ICovCisJCQkJCisJCQkJcy0+bmV3X3Nlc3Npb249MDsKKwkJCQkKKwkJCQlzc2xfdXBkYXRlX2NhY2hlKHMsU1NMX1NFU1NfQ0FDSEVfU0VSVkVSKTsKKwkJCQkKKwkJCQlzLT5jdHgtPnN0YXRzLnNlc3NfYWNjZXB0X2dvb2QrKzsKKwkJCQkvKiBzLT5zZXJ2ZXI9MTsgKi8KKwkJCQlzLT5oYW5kc2hha2VfZnVuYz1zc2wzX2FjY2VwdDsKKworCQkJCWlmIChjYiAhPSBOVUxMKSBjYihzLFNTTF9DQl9IQU5EU0hBS0VfRE9ORSwxKTsKKwkJCQl9CisJCQkKKwkJCXJldCA9IDE7CisJCQlnb3RvIGVuZDsKKwkJCS8qIGJyZWFrOyAqLworCisJCWRlZmF1bHQ6CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19BQ0NFUFQsU1NMX1JfVU5LTk9XTl9TVEFURSk7CisJCQlyZXQ9IC0xOworCQkJZ290byBlbmQ7CisJCQkvKiBicmVhazsgKi8KKwkJCX0KKwkJCisJCWlmICghcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlICYmICFza2lwKQorCQkJeworCQkJaWYgKHMtPmRlYnVnKQorCQkJCXsKKwkJCQlpZiAoKHJldD1CSU9fZmx1c2gocy0+d2JpbykpIDw9IDApCisJCQkJCWdvdG8gZW5kOworCQkJCX0KKworCisJCQlpZiAoKGNiICE9IE5VTEwpICYmIChzLT5zdGF0ZSAhPSBzdGF0ZSkpCisJCQkJeworCQkJCW5ld19zdGF0ZT1zLT5zdGF0ZTsKKwkJCQlzLT5zdGF0ZT1zdGF0ZTsKKwkJCQljYihzLFNTTF9DQl9BQ0NFUFRfTE9PUCwxKTsKKwkJCQlzLT5zdGF0ZT1uZXdfc3RhdGU7CisJCQkJfQorCQkJfQorCQlza2lwPTA7CisJCX0KK2VuZDoKKwkvKiBCSU9fZmx1c2gocy0+d2Jpbyk7ICovCisKKwlzLT5pbl9oYW5kc2hha2UtLTsKKwlpZiAoY2IgIT0gTlVMTCkKKwkJY2IocyxTU0xfQ0JfQUNDRVBUX0VYSVQscmV0KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBzc2wzX3NlbmRfaGVsbG9fcmVxdWVzdChTU0wgKnMpCisJeworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9TV19IRUxMT19SRVFfQSkKKwkJeworCQlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCSoocCsrKT1TU0wzX01UX0hFTExPX1JFUVVFU1Q7CisJCSoocCsrKT0wOworCQkqKHArKyk9MDsKKwkJKihwKyspPTA7CisKKwkJcy0+c3RhdGU9U1NMM19TVF9TV19IRUxMT19SRVFfQjsKKwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCXMtPmluaXRfbnVtPTQ7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKworCS8qIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0IgKi8KKwlyZXR1cm4oc3NsM19kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorCitpbnQgc3NsM19jaGVja19jbGllbnRfaGVsbG8oU1NMICpzKQorCXsKKwlpbnQgb2s7CisJbG9uZyBuOworCisJLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWFsbHkgZXhwZWN0IGEgQ2VydGlmaWNhdGUgbWVzc2FnZSwKKwkgKiBzbyBwZXJtaXQgYXBwcm9wcmlhdGUgbWVzc2FnZSBsZW5ndGggKi8KKwluPXMtPm1ldGhvZC0+c3NsX2dldF9tZXNzYWdlKHMsCisJCVNTTDNfU1RfU1JfQ0VSVF9BLAorCQlTU0wzX1NUX1NSX0NFUlRfQiwKKwkJLTEsCisJCXMtPm1heF9jZXJ0X2xpc3QsCisJCSZvayk7CisJaWYgKCFvaykgcmV0dXJuKChpbnQpbik7CisJcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlID0gMTsKKwlpZiAocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgPT0gU1NMM19NVF9DTElFTlRfSEVMTE8pCisJCXsKKwkJLyogVGhyb3cgYXdheSB3aGF0IHdlIGhhdmUgZG9uZSBzbyBmYXIgaW4gdGhlIGN1cnJlbnQgaGFuZHNoYWtlLAorCQkgKiB3aGljaCB3aWxsIG5vdyBiZSBhYm9ydGVkLiAoQSBmdWxsIFNTTF9jbGVhciB3b3VsZCBiZSB0b28gbXVjaC4pCisJCSAqIEkgaG9wZSB0aGF0IHRtcC5kaCBpcyB0aGUgb25seSB0aGluZyB0aGF0IG1heSBuZWVkIHRvIGJlIGNsZWFyZWQKKwkJICogd2hlbiBhIGhhbmRzaGFrZSBpcyBub3QgY29tcGxldGVkIC4uLiAqLworI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCWlmIChzLT5zMy0+dG1wLmRoICE9IE5VTEwpCisJCQl7CisJCQlESF9mcmVlKHMtPnMzLT50bXAuZGgpOworCQkJcy0+czMtPnRtcC5kaCA9IE5VTEw7CisJCQl9CisjZW5kaWYKKwkJcmV0dXJuIDI7CisJCX0KKwlyZXR1cm4gMTsKK30KKworaW50IHNzbDNfZ2V0X2NsaWVudF9oZWxsbyhTU0wgKnMpCisJeworCWludCBpLGosb2ssYWwscmV0PSAtMTsKKwl1bnNpZ25lZCBpbnQgY29va2llX2xlbjsKKwlsb25nIG47CisJdW5zaWduZWQgbG9uZyBpZDsKKwl1bnNpZ25lZCBjaGFyICpwLCpkLCpxOworCVNTTF9DSVBIRVIgKmM7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCVNTTF9DT01QICpjb21wPU5VTEw7CisjZW5kaWYKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2lwaGVycz1OVUxMOworCisJLyogV2UgZG8gdGhpcyBzbyB0aGF0IHdlIHdpbGwgcmVzcG9uZCB3aXRoIG91ciBuYXRpdmUgdHlwZS4KKwkgKiBJZiB3ZSBhcmUgVExTdjEgYW5kIHdlIGdldCBTU0x2Mywgd2Ugd2lsbCByZXNwb25kIHdpdGggVExTdjEsCisJICogVGhpcyBkb3duIHN3aXRjaGluZyBzaG91bGQgYmUgaGFuZGxlZCBieSBhIGRpZmZlcmVudCBtZXRob2QuCisJICogSWYgd2UgYXJlIFNTTHYzLCB3ZSB3aWxsIHJlc3BvbmQgd2l0aCBTU0x2MywgZXZlbiBpZiBwcm9tcHRlZCB3aXRoCisJICogVExTdjEuCisJICovCisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19BKQorCQl7CisJCXMtPnN0YXRlPVNTTDNfU1RfU1JfQ0xOVF9IRUxMT19COworCQl9CisJcy0+Zmlyc3RfcGFja2V0PTE7CisJbj1zLT5tZXRob2QtPnNzbF9nZXRfbWVzc2FnZShzLAorCQlTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQiwKKwkJU1NMM19TVF9TUl9DTE5UX0hFTExPX0MsCisJCVNTTDNfTVRfQ0xJRU5UX0hFTExPLAorCQlTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgsCisJCSZvayk7CisKKwlpZiAoIW9rKSByZXR1cm4oKGludCluKTsKKwlzLT5maXJzdF9wYWNrZXQ9MDsKKwlkPXA9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X21zZzsKKworCS8qIHVzZSB2ZXJzaW9uIGZyb20gaW5zaWRlIGNsaWVudCBoZWxsbywgbm90IGZyb20gcmVjb3JkIGhlYWRlcgorCSAqIChtYXkgZGlmZmVyOiBzZWUgUkZDIDIyNDYsIEFwcGVuZGl4IEUsIHNlY29uZCBwYXJhZ3JhcGgpICovCisJcy0+Y2xpZW50X3ZlcnNpb249KCgoaW50KXBbMF0pPDw4KXwoaW50KXBbMV07CisJcCs9MjsKKworCWlmICgocy0+dmVyc2lvbiA9PSBEVExTMV9WRVJTSU9OICYmIHMtPmNsaWVudF92ZXJzaW9uID4gcy0+dmVyc2lvbikgfHwKKwkgICAgKHMtPnZlcnNpb24gIT0gRFRMUzFfVkVSU0lPTiAmJiBzLT5jbGllbnRfdmVyc2lvbiA8IHMtPnZlcnNpb24pKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8sIFNTTF9SX1dST05HX1ZFUlNJT05fTlVNQkVSKTsKKwkJaWYgKChzLT5jbGllbnRfdmVyc2lvbj4+OCkgPT0gU1NMM19WRVJTSU9OX01BSk9SKQorCQkJeworCQkJLyogc2ltaWxhciB0byBzc2wzX2dldF9yZWNvcmQsIHNlbmQgYWxlcnQgdXNpbmcgcmVtb3RlIHZlcnNpb24gbnVtYmVyICovCisJCQlzLT52ZXJzaW9uID0gcy0+Y2xpZW50X3ZlcnNpb247CisJCQl9CisJCWFsID0gU1NMX0FEX1BST1RPQ09MX1ZFUlNJT047CisJCWdvdG8gZl9lcnI7CisJCX0KKworCS8qIElmIHdlIHJlcXVpcmUgY29va2llcyBhbmQgdGhpcyBDbGllbnRIZWxsbyBkb2Vzbid0CisJICogY29udGFpbiBvbmUsIGp1c3QgcmV0dXJuIHNpbmNlIHdlIGRvIG5vdCB3YW50IHRvCisJICogYWxsb2NhdGUgYW55IG1lbW9yeSB5ZXQuIFNvIGNoZWNrIGNvb2tpZSBsZW5ndGguLi4KKwkgKi8KKwlpZiAoU1NMX2dldF9vcHRpb25zKHMpICYgU1NMX09QX0NPT0tJRV9FWENIQU5HRSkKKwkJeworCQl1bnNpZ25lZCBpbnQgc2Vzc2lvbl9sZW5ndGgsIGNvb2tpZV9sZW5ndGg7CisJCQorCQlzZXNzaW9uX2xlbmd0aCA9ICoocCArIFNTTDNfUkFORE9NX1NJWkUpOworCQljb29raWVfbGVuZ3RoID0gKihwICsgU1NMM19SQU5ET01fU0laRSArIHNlc3Npb25fbGVuZ3RoICsgMSk7CisKKwkJaWYgKGNvb2tpZV9sZW5ndGggPT0gMCkKKwkJCXJldHVybiAxOworCQl9CisKKwkvKiBsb2FkIHRoZSBjbGllbnQgcmFuZG9tICovCisJbWVtY3B5KHMtPnMzLT5jbGllbnRfcmFuZG9tLHAsU1NMM19SQU5ET01fU0laRSk7CisJcCs9U1NMM19SQU5ET01fU0laRTsKKworCS8qIGdldCB0aGUgc2Vzc2lvbi1pZCAqLworCWo9ICoocCsrKTsKKworCXMtPmhpdD0wOworCS8qIFZlcnNpb25zIGJlZm9yZSAwLjkuNyBhbHdheXMgYWxsb3cgc2Vzc2lvbiByZXVzZSBkdXJpbmcgcmVuZWdvdGlhdGlvbgorCSAqIChpLmUuIHdoZW4gcy0+bmV3X3Nlc3Npb24gaXMgdHJ1ZSksIG9wdGlvbgorCSAqIFNTTF9PUF9OT19TRVNTSU9OX1JFU1VNUFRJT05fT05fUkVORUdPVElBVElPTiBpcyBuZXcgd2l0aCAwLjkuNy4KKwkgKiBNYXliZSB0aGlzIG9wdGlvbmFsIGJlaGF2aW91ciBzaG91bGQgYWx3YXlzIGhhdmUgYmVlbiB0aGUgZGVmYXVsdCwKKwkgKiBidXQgd2UgY2Fubm90IHNhZmVseSBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIChvciBuZXcgYXBwbGljYXRpb25zCisJICogbWlnaHQgYmUgd3JpdHRlbiB0aGF0IGJlY29tZSB0b3RhbGx5IHVuc2VjdXJlIHdoZW4gY29tcGlsZWQgd2l0aAorCSAqIGFuIGVhcmxpZXIgbGlicmFyeSB2ZXJzaW9uKQorCSAqLworCWlmICgocy0+bmV3X3Nlc3Npb24gJiYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04pKSkKKwkJeworCSAgICAgICAgaWYgKCFzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQpCisJCQl7CisJCQlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRSk7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEKTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWlmICghc3NsX2dldF9uZXdfc2Vzc2lvbihzLDEpKQorCQkJZ290byBlcnI7CisJCX0KKwllbHNlCisJCXsKKwkJaT1zc2xfZ2V0X3ByZXZfc2Vzc2lvbihzLCBwLCBqLCBkICsgbik7CisJCWlmIChpID09IDEpCisJCQl7IC8qIHByZXZpb3VzIHNlc3Npb24gKi8KKwkJCXMtPmhpdD0xOworCQkJfQorCQllbHNlIGlmIChpID09IC0xKQorCQkJZ290byBlcnI7CisJCWVsc2UgLyogaSA9PSAwICovCisJCQl7CisJCSAgICAgICAgaWYgKCFzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQpCisJCQkJeworCQkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFKTsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVEKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlpZiAoIXNzbF9nZXRfbmV3X3Nlc3Npb24ocywxKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCisJcCs9ajsKKworCWlmIChzLT52ZXJzaW9uID09IERUTFMxX1ZFUlNJT04gfHwgcy0+dmVyc2lvbiA9PSBEVExTMV9CQURfVkVSKQorCQl7CisJCS8qIGNvb2tpZSBzdHVmZiAqLworCQljb29raWVfbGVuID0gKihwKyspOworCisJCS8qIAorCQkgKiBUaGUgQ2xpZW50SGVsbG8gbWF5IGNvbnRhaW4gYSBjb29raWUgZXZlbiBpZiB0aGUKKwkJICogSGVsbG9WZXJpZnkgbWVzc2FnZSBoYXMgbm90IGJlZW4gc2VudC0tbWFrZSBzdXJlIHRoYXQgaXQKKwkJICogZG9lcyBub3QgY2F1c2UgYW4gb3ZlcmZsb3cuCisJCSAqLworCQlpZiAoIGNvb2tpZV9sZW4gPiBzaXplb2Yocy0+ZDEtPnJjdmRfY29va2llKSkKKwkJCXsKKwkJCS8qIHRvbyBtdWNoIGRhdGEgKi8KKwkJCWFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8sIFNTTF9SX0NPT0tJRV9NSVNNQVRDSCk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCisJCS8qIHZlcmlmeSB0aGUgY29va2llIGlmIGFwcHJvcHJpYXRlIG9wdGlvbiBpcyBzZXQuICovCisJCWlmICgoU1NMX2dldF9vcHRpb25zKHMpICYgU1NMX09QX0NPT0tJRV9FWENIQU5HRSkgJiYKKwkJCWNvb2tpZV9sZW4gPiAwKQorCQkJeworCQkJbWVtY3B5KHMtPmQxLT5yY3ZkX2Nvb2tpZSwgcCwgY29va2llX2xlbik7CisKKwkJCWlmICggcy0+Y3R4LT5hcHBfdmVyaWZ5X2Nvb2tpZV9jYiAhPSBOVUxMKQorCQkJCXsKKwkJCQlpZiAoIHMtPmN0eC0+YXBwX3ZlcmlmeV9jb29raWVfY2Iocywgcy0+ZDEtPnJjdmRfY29va2llLAorCQkJCQljb29raWVfbGVuKSA9PSAwKQorCQkJCQl7CisJCQkJCWFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKwkJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9IRUxMTywgCisJCQkJCQlTU0xfUl9DT09LSUVfTUlTTUFUQ0gpOworCQkJCQlnb3RvIGZfZXJyOworCQkJCQl9CisJCQkJLyogZWxzZSBjb29raWUgdmVyaWZpY2F0aW9uIHN1Y2NlZWRlZCAqLworCQkJCX0KKwkJCWVsc2UgaWYgKCBtZW1jbXAocy0+ZDEtPnJjdmRfY29va2llLCBzLT5kMS0+Y29va2llLCAKKwkJCQkJCSAgcy0+ZDEtPmNvb2tpZV9sZW4pICE9IDApIC8qIGRlZmF1bHQgdmVyaWZpY2F0aW9uICovCisJCQkJeworCQkJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8sIAorCQkJCQkJU1NMX1JfQ09PS0lFX01JU01BVENIKTsKKwkJCQkJZ290byBmX2VycjsKKwkJCQl9CisKKwkJCXJldCA9IDI7CisJCQl9CisKKwkJcCArPSBjb29raWVfbGVuOworCQl9CisKKwluMnMocCxpKTsKKwlpZiAoKGkgPT0gMCkgJiYgKGogIT0gMCkpCisJCXsKKwkJLyogd2UgbmVlZCBhIGNpcGhlciBpZiB3ZSBhcmUgbm90IHJlc3VtaW5nIGEgc2Vzc2lvbiAqLworCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfTk9fQ0lQSEVSU19TUEVDSUZJRUQpOworCQlnb3RvIGZfZXJyOworCQl9CisJaWYgKChwK2kpID49IChkK24pKQorCQl7CisJCS8qIG5vdCBlbm91Z2ggZGF0YSAqLworCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX0xFTkdUSF9NSVNNQVRDSCk7CisJCWdvdG8gZl9lcnI7CisJCX0KKwlpZiAoKGkgPiAwKSAmJiAoc3NsX2J5dGVzX3RvX2NpcGhlcl9saXN0KHMscCxpLCYoY2lwaGVycykpCisJCT09IE5VTEwpKQorCQl7CisJCWdvdG8gZXJyOworCQl9CisJcCs9aTsKKworCS8qIElmIGl0IGlzIGEgaGl0LCBjaGVjayB0aGF0IHRoZSBjaXBoZXIgaXMgaW4gdGhlIGxpc3QgKi8KKwlpZiAoKHMtPmhpdCkgJiYgKGkgPiAwKSkKKwkJeworCQlqPTA7CisJCWlkPXMtPnNlc3Npb24tPmNpcGhlci0+aWQ7CisKKyNpZmRlZiBDSVBIRVJfREVCVUcKKwkJcHJpbnRmKCJjbGllbnQgc2VudCAlZCBjaXBoZXJzXG4iLHNrX251bShjaXBoZXJzKSk7CisjZW5kaWYKKwkJZm9yIChpPTA7IGk8c2tfU1NMX0NJUEhFUl9udW0oY2lwaGVycyk7IGkrKykKKwkJCXsKKwkJCWM9c2tfU1NMX0NJUEhFUl92YWx1ZShjaXBoZXJzLGkpOworI2lmZGVmIENJUEhFUl9ERUJVRworCQkJcHJpbnRmKCJjbGllbnQgWyUyZCBvZiAlMmRdOiVzXG4iLAorCQkJCWksc2tfbnVtKGNpcGhlcnMpLFNTTF9DSVBIRVJfZ2V0X25hbWUoYykpOworI2VuZGlmCisJCQlpZiAoYy0+aWQgPT0gaWQpCisJCQkJeworCQkJCWo9MTsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCWlmIChqID09IDAgJiYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfTkVUU0NBUEVfUkVVU0VfQ0lQSEVSX0NIQU5HRV9CVUcpICYmIChza19TU0xfQ0lQSEVSX251bShjaXBoZXJzKSA9PSAxKSkKKwkJCXsKKwkJCS8qIFNwZWNpYWwgY2FzZSBhcyBjbGllbnQgYnVnIHdvcmthcm91bmQ6IHRoZSBwcmV2aW91c2x5IHVzZWQgY2lwaGVyIG1heQorCQkJICogbm90IGJlIGluIHRoZSBjdXJyZW50IGxpc3QsIHRoZSBjbGllbnQgaW5zdGVhZCBtaWdodCBiZSB0cnlpbmcgdG8KKwkJCSAqIGNvbnRpbnVlIHVzaW5nIGEgY2lwaGVyIHRoYXQgYmVmb3JlIHdhc24ndCBjaG9zZW4gZHVlIHRvIHNlcnZlcgorCQkJICogcHJlZmVyZW5jZXMuICBXZSdsbCBoYXZlIHRvIHJlamVjdCB0aGUgY29ubmVjdGlvbiBpZiB0aGUgY2lwaGVyIGlzIG5vdAorCQkJICogZW5hYmxlZCwgdGhvdWdoLiAqLworCQkJYyA9IHNrX1NTTF9DSVBIRVJfdmFsdWUoY2lwaGVycywgMCk7CisJCQlpZiAoc2tfU1NMX0NJUEhFUl9maW5kKFNTTF9nZXRfY2lwaGVycyhzKSwgYykgPj0gMCkKKwkJCQl7CisJCQkJcy0+c2Vzc2lvbi0+Y2lwaGVyID0gYzsKKwkJCQlqID0gMTsKKwkJCQl9CisJCQl9CisJCWlmIChqID09IDApCisJCQl7CisJCQkvKiB3ZSBuZWVkIHRvIGhhdmUgdGhlIGNpcGhlciBpbiB0aGUgY2lwaGVyCisJCQkgKiBsaXN0IGlmIHdlIGFyZSBhc2tlZCB0byByZXVzZSBpdCAqLworCQkJYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9SRVFVSVJFRF9DSVBIRVJfTUlTU0lORyk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQl9CisKKwkvKiBjb21wcmVzc2lvbiAqLworCWk9ICoocCsrKTsKKwlpZiAoKHAraSkgPiAoZCtuKSkKKwkJeworCQkvKiBub3QgZW5vdWdoIGRhdGEgKi8KKwkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOworCQlnb3RvIGZfZXJyOworCQl9CisJcT1wOworCWZvciAoaj0wOyBqPGk7IGorKykKKwkJeworCQlpZiAocFtqXSA9PSAwKSBicmVhazsKKwkJfQorCisJcCs9aTsKKwlpZiAoaiA+PSBpKQorCQl7CisJCS8qIG5vIGNvbXByZXNzICovCisJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfTk9fQ09NUFJFU1NJT05fU1BFQ0lGSUVEKTsKKwkJZ290byBmX2VycjsKKwkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJLyogVExTIGV4dGVuc2lvbnMqLworCWlmIChzLT52ZXJzaW9uID49IFNTTDNfVkVSU0lPTikKKwkJeworCQlpZiAoIXNzbF9wYXJzZV9jbGllbnRoZWxsb190bHNleHQocywmcCxkLG4sICZhbCkpCisJCQl7CisJCQkvKiAnYWwnIHNldCBieSBzc2xfcGFyc2VfY2xpZW50aGVsbG9fdGxzZXh0ICovCisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX1BBUlNFX1RMU0VYVCk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQl9CisJCWlmIChzc2xfY2hlY2tfY2xpZW50aGVsbG9fdGxzZXh0KHMpIDw9IDApIHsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfQ0xJRU5USEVMTE9fVExTRVhUKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkvKiBDaGVjayBpZiB3ZSB3YW50IHRvIHVzZSBleHRlcm5hbCBwcmUtc2hhcmVkIHNlY3JldCBmb3IgdGhpcworCSAqIGhhbmRzaGFrZSBmb3Igbm90IHJldXNlZCBzZXNzaW9uIG9ubHkuIFdlIG5lZWQgdG8gZ2VuZXJhdGUKKwkgKiBzZXJ2ZXJfcmFuZG9tIGJlZm9yZSBjYWxsaW5nIHRsc19zZXNzaW9uX3NlY3JldF9jYiBpbiBvcmRlciB0byBhbGxvdworCSAqIFNlc3Npb25UaWNrZXQgcHJvY2Vzc2luZyB0byB1c2UgaXQgaW4ga2V5IGRlcml2YXRpb24uICovCisJeworCQl1bnNpZ25lZCBsb25nIFRpbWU7CisJCXVuc2lnbmVkIGNoYXIgKnBvczsKKwkJVGltZT0odW5zaWduZWQgbG9uZyl0aW1lKE5VTEwpOwkJCS8qIFRpbWUgKi8KKwkJcG9zPXMtPnMzLT5zZXJ2ZXJfcmFuZG9tOworCQlsMm4oVGltZSxwb3MpOworCQlpZiAoUkFORF9wc2V1ZG9fYnl0ZXMocG9zLFNTTDNfUkFORE9NX1NJWkUtNCkgPD0gMCkKKwkJCXsKKwkJCWFsPVNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJfQorCisJaWYgKCFzLT5oaXQgJiYgcy0+dmVyc2lvbiA+PSBUTFMxX1ZFUlNJT04gJiYgcy0+dGxzX3Nlc3Npb25fc2VjcmV0X2NiKQorCQl7CisJCVNTTF9DSVBIRVIgKnByZWZfY2lwaGVyPU5VTEw7CisKKwkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg9c2l6ZW9mKHMtPnNlc3Npb24tPm1hc3Rlcl9rZXkpOworCQlpZihzLT50bHNfc2Vzc2lvbl9zZWNyZXRfY2Iocywgcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSwgJnMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoLAorCQkJY2lwaGVycywgJnByZWZfY2lwaGVyLCBzLT50bHNfc2Vzc2lvbl9zZWNyZXRfY2JfYXJnKSkKKwkJCXsKKwkJCXMtPmhpdD0xOworCQkJcy0+c2Vzc2lvbi0+Y2lwaGVycz1jaXBoZXJzOworCQkJcy0+c2Vzc2lvbi0+dmVyaWZ5X3Jlc3VsdD1YNTA5X1ZfT0s7CisKKwkJCWNpcGhlcnM9TlVMTDsKKworCQkJLyogY2hlY2sgaWYgc29tZSBjaXBoZXIgd2FzIHByZWZlcnJlZCBieSBjYWxsIGJhY2sgKi8KKwkJCXByZWZfY2lwaGVyPXByZWZfY2lwaGVyID8gcHJlZl9jaXBoZXIgOiBzc2wzX2Nob29zZV9jaXBoZXIocywgcy0+c2Vzc2lvbi0+Y2lwaGVycywgU1NMX2dldF9jaXBoZXJzKHMpKTsKKwkJCWlmIChwcmVmX2NpcGhlciA9PSBOVUxMKQorCQkJCXsKKwkJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9OT19TSEFSRURfQ0lQSEVSKTsKKwkJCQlnb3RvIGZfZXJyOworCQkJCX0KKworCQkJcy0+c2Vzc2lvbi0+Y2lwaGVyPXByZWZfY2lwaGVyOworCisJCQlpZiAocy0+Y2lwaGVyX2xpc3QpCisJCQkJc2tfU1NMX0NJUEhFUl9mcmVlKHMtPmNpcGhlcl9saXN0KTsKKworCQkJaWYgKHMtPmNpcGhlcl9saXN0X2J5X2lkKQorCQkJCXNrX1NTTF9DSVBIRVJfZnJlZShzLT5jaXBoZXJfbGlzdF9ieV9pZCk7CisKKwkJCXMtPmNpcGhlcl9saXN0ID0gc2tfU1NMX0NJUEhFUl9kdXAocy0+c2Vzc2lvbi0+Y2lwaGVycyk7CisJCQlzLT5jaXBoZXJfbGlzdF9ieV9pZCA9IHNrX1NTTF9DSVBIRVJfZHVwKHMtPnNlc3Npb24tPmNpcGhlcnMpOworCQkJfQorCQl9CisjZW5kaWYKKworCS8qIFdvcnN0IGNhc2UsIHdlIHdpbGwgdXNlIHRoZSBOVUxMIGNvbXByZXNzaW9uLCBidXQgaWYgd2UgaGF2ZSBvdGhlcgorCSAqIG9wdGlvbnMsIHdlIHdpbGwgbm93IGxvb2sgZm9yIHRoZW0uICBXZSBoYXZlIGktMSBjb21wcmVzc2lvbgorCSAqIGFsZ29yaXRobXMgZnJvbSB0aGUgY2xpZW50LCBzdGFydGluZyBhdCBxLiAqLworCXMtPnMzLT50bXAubmV3X2NvbXByZXNzaW9uPU5VTEw7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCS8qIFRoaXMgb25seSBoYXBwZW5zIGlmIHdlIGhhdmUgYSBjYWNoZSBoaXQgKi8KKwlpZiAocy0+c2Vzc2lvbi0+Y29tcHJlc3NfbWV0aCAhPSAwKQorCQl7CisJCWludCBtLCBjb21wX2lkID0gcy0+c2Vzc2lvbi0+Y29tcHJlc3NfbWV0aDsKKwkJLyogUGVyZm9ybSBzYW5pdHkgY2hlY2tzIG9uIHJlc3VtZWQgY29tcHJlc3Npb24gYWxnb3JpdGhtICovCisJCS8qIENhbid0IGRpc2FibGUgY29tcHJlc3Npb24gKi8KKwkJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fQ09NUFJFU1NJT04pCisJCQl7CisJCQlhbD1TU0xfQURfSU5URVJOQUxfRVJST1I7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX0lOQ09OU0lTVEVOVF9DT01QUkVTU0lPTik7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQkvKiBMb29rIGZvciByZXN1bWVkIGNvbXByZXNzaW9uIG1ldGhvZCAqLworCQlmb3IgKG0gPSAwOyBtIDwgc2tfU1NMX0NPTVBfbnVtKHMtPmN0eC0+Y29tcF9tZXRob2RzKTsgbSsrKQorCQkJeworCQkJY29tcD1za19TU0xfQ09NUF92YWx1ZShzLT5jdHgtPmNvbXBfbWV0aG9kcyxtKTsKKwkJCWlmIChjb21wX2lkID09IGNvbXAtPmlkKQorCQkJCXsKKwkJCQlzLT5zMy0+dG1wLm5ld19jb21wcmVzc2lvbj1jb21wOworCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJaWYgKHMtPnMzLT50bXAubmV3X2NvbXByZXNzaW9uID09IE5VTEwpCisJCQl7CisJCQlhbD1TU0xfQURfSU5URVJOQUxfRVJST1I7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX0lOVkFMSURfQ09NUFJFU1NJT05fQUxHT1JJVEhNKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCS8qIExvb2sgZm9yIHJlc3VtZWQgbWV0aG9kIGluIGNvbXByZXNzaW9uIGxpc3QgKi8KKwkJZm9yIChtID0gMDsgbSA8IGk7IG0rKykKKwkJCXsKKwkJCWlmIChxW21dID09IGNvbXBfaWQpCisJCQkJYnJlYWs7CisJCQl9CisJCWlmIChtID49IGkpCisJCQl7CisJCQlhbD1TU0xfQURfSUxMRUdBTF9QQVJBTUVURVI7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPLFNTTF9SX1JFUVVJUkVEX0NPTVBSRVNTU0lPTl9BTEdPUklUSE1fTUlTU0lORyk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQl9CisJZWxzZSBpZiAocy0+aGl0KQorCQljb21wID0gTlVMTDsKKwllbHNlIGlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfTk9fQ09NUFJFU1NJT04pICYmIHMtPmN0eC0+Y29tcF9tZXRob2RzKQorCQl7IC8qIFNlZSBpZiB3ZSBoYXZlIGEgbWF0Y2ggKi8KKwkJaW50IG0sbm4sbyx2LGRvbmU9MDsKKworCQlubj1za19TU0xfQ09NUF9udW0ocy0+Y3R4LT5jb21wX21ldGhvZHMpOworCQlmb3IgKG09MDsgbTxubjsgbSsrKQorCQkJeworCQkJY29tcD1za19TU0xfQ09NUF92YWx1ZShzLT5jdHgtPmNvbXBfbWV0aG9kcyxtKTsKKwkJCXY9Y29tcC0+aWQ7CisJCQlmb3IgKG89MDsgbzxpOyBvKyspCisJCQkJeworCQkJCWlmICh2ID09IHFbb10pCisJCQkJCXsKKwkJCQkJZG9uZT0xOworCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCWlmIChkb25lKSBicmVhazsKKwkJCX0KKwkJaWYgKGRvbmUpCisJCQlzLT5zMy0+dG1wLm5ld19jb21wcmVzc2lvbj1jb21wOworCQllbHNlCisJCQljb21wPU5VTEw7CisJCX0KKyNlbHNlCisJLyogSWYgY29tcHJlc3Npb24gaXMgZGlzYWJsZWQgd2UnZCBiZXR0ZXIgbm90IHRyeSB0byByZXN1bWUgYSBzZXNzaW9uCisJICogdXNpbmcgY29tcHJlc3Npb24uCisJICovCisJaWYgKHMtPnNlc3Npb24tPmNvbXByZXNzX21ldGggIT0gMCkKKwkJeworCQlhbD1TU0xfQURfSU5URVJOQUxfRVJST1I7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfSU5DT05TSVNURU5UX0NPTVBSRVNTSU9OKTsKKwkJZ290byBmX2VycjsKKwkJfQorI2VuZGlmCisKKwkvKiBHaXZlbiBzLT5zZXNzaW9uLT5jaXBoZXJzIGFuZCBTU0xfZ2V0X2NpcGhlcnMsIHdlIG11c3QKKwkgKiBwaWNrIGEgY2lwaGVyICovCisKKwlpZiAoIXMtPmhpdCkKKwkJeworI2lmZGVmIE9QRU5TU0xfTk9fQ09NUAorCQlzLT5zZXNzaW9uLT5jb21wcmVzc19tZXRoPTA7CisjZWxzZQorCQlzLT5zZXNzaW9uLT5jb21wcmVzc19tZXRoPShjb21wID09IE5VTEwpPzA6Y29tcC0+aWQ7CisjZW5kaWYKKwkJaWYgKHMtPnNlc3Npb24tPmNpcGhlcnMgIT0gTlVMTCkKKwkJCXNrX1NTTF9DSVBIRVJfZnJlZShzLT5zZXNzaW9uLT5jaXBoZXJzKTsKKwkJcy0+c2Vzc2lvbi0+Y2lwaGVycz1jaXBoZXJzOworCQlpZiAoY2lwaGVycyA9PSBOVUxMKQorCQkJeworCQkJYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9IRUxMTyxTU0xfUl9OT19DSVBIRVJTX1BBU1NFRCk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQljaXBoZXJzPU5VTEw7CisJCWM9c3NsM19jaG9vc2VfY2lwaGVyKHMscy0+c2Vzc2lvbi0+Y2lwaGVycywKKwkJCQkgICAgIFNTTF9nZXRfY2lwaGVycyhzKSk7CisKKwkJaWYgKGMgPT0gTlVMTCkKKwkJCXsKKwkJCWFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8sU1NMX1JfTk9fU0hBUkVEX0NJUEhFUik7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQlzLT5zMy0+dG1wLm5ld19jaXBoZXI9YzsKKwkJfQorCWVsc2UKKwkJeworCQkvKiBTZXNzaW9uLWlkIHJldXNlICovCisjaWZkZWYgUkVVU0VfQ0lQSEVSX0JVRworCQlTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2s7CisJCVNTTF9DSVBIRVIgKm5jPU5VTEw7CisJCVNTTF9DSVBIRVIgKmVjPU5VTEw7CisKKwkJaWYgKHMtPm9wdGlvbnMgJiBTU0xfT1BfTkVUU0NBUEVfREVNT19DSVBIRVJfQ0hBTkdFX0JVRykKKwkJCXsKKwkJCXNrPXMtPnNlc3Npb24tPmNpcGhlcnM7CisJCQlmb3IgKGk9MDsgaTxza19TU0xfQ0lQSEVSX251bShzayk7IGkrKykKKwkJCQl7CisJCQkJYz1za19TU0xfQ0lQSEVSX3ZhbHVlKHNrLGkpOworCQkJCWlmIChjLT5hbGdvcml0aG1fZW5jICYgU1NMX2VOVUxMKQorCQkJCQluYz1jOworCQkJCWlmIChTU0xfQ19JU19FWFBPUlQoYykpCisJCQkJCWVjPWM7CisJCQkJfQorCQkJaWYgKG5jICE9IE5VTEwpCisJCQkJcy0+czMtPnRtcC5uZXdfY2lwaGVyPW5jOworCQkJZWxzZSBpZiAoZWMgIT0gTlVMTCkKKwkJCQlzLT5zMy0+dG1wLm5ld19jaXBoZXI9ZWM7CisJCQllbHNlCisJCQkJcy0+czMtPnRtcC5uZXdfY2lwaGVyPXMtPnNlc3Npb24tPmNpcGhlcjsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisJCXMtPnMzLT50bXAubmV3X2NpcGhlcj1zLT5zZXNzaW9uLT5jaXBoZXI7CisJCX0KKworCWlmICghc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMocykpCisJCWdvdG8gZl9lcnI7CisJCisJLyogd2Ugbm93IGhhdmUgdGhlIGZvbGxvd2luZyBzZXR1cC4gCisJICogY2xpZW50X3JhbmRvbQorCSAqIGNpcGhlcl9saXN0IAkJLSBvdXIgcHJlZmVyZWQgbGlzdCBvZiBjaXBoZXJzCisJICogY2lwaGVycyAJCS0gdGhlIGNsaWVudHMgcHJlZmVyZWQgbGlzdCBvZiBjaXBoZXJzCisJICogY29tcHJlc3Npb24JCS0gYmFzaWNhbGx5IGlnbm9yZWQgcmlnaHQgbm93CisJICogc3NsIHZlcnNpb24gaXMgc2V0CS0gc3NsdjMKKwkgKiBzLT5zZXNzaW9uCQktIFRoZSBzc2wgc2Vzc2lvbiBoYXMgYmVlbiBzZXR1cC4KKwkgKiBzLT5oaXQJCS0gc2Vzc2lvbiByZXVzZSBmbGFnCisJICogcy0+dG1wLm5ld19jaXBoZXIJLSB0aGUgbmV3IGNpcGhlciB0byB1c2UuCisJICovCisKKwlpZiAocmV0IDwgMCkgcmV0PTE7CisJaWYgKDApCisJCXsKK2ZfZXJyOgorCQlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLGFsKTsKKwkJfQorZXJyOgorCWlmIChjaXBoZXJzICE9IE5VTEwpIHNrX1NTTF9DSVBIRVJfZnJlZShjaXBoZXJzKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBzc2wzX3NlbmRfc2VydmVyX2hlbGxvKFNTTCAqcykKKwl7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgKnAsKmQ7CisJaW50IGksc2w7CisJdW5zaWduZWQgbG9uZyBsOworI2lmZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJdW5zaWduZWQgbG9uZyBUaW1lOworI2VuZGlmCisKKwlpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9TV19TUlZSX0hFTExPX0EpCisJCXsKKwkJYnVmPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisjaWZkZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJcD1zLT5zMy0+c2VydmVyX3JhbmRvbTsKKwkJLyogR2VuZXJhdGUgc2VydmVyX3JhbmRvbSBpZiBpdCB3YXMgbm90IG5lZWRlZCBwcmV2aW91c2x5ICovCisJCVRpbWU9KHVuc2lnbmVkIGxvbmcpdGltZShOVUxMKTsJCQkvKiBUaW1lICovCisJCWwybihUaW1lLHApOworCQlpZiAoUkFORF9wc2V1ZG9fYnl0ZXMocCxTU0wzX1JBTkRPTV9TSVpFLTQpIDw9IDApCisJCQlyZXR1cm4gLTE7CisjZW5kaWYKKwkJLyogRG8gdGhlIG1lc3NhZ2UgdHlwZSBhbmQgbGVuZ3RoIGxhc3QgKi8KKwkJZD1wPSAmKGJ1Zls0XSk7CisKKwkJKihwKyspPXMtPnZlcnNpb24+Pjg7CisJCSoocCsrKT1zLT52ZXJzaW9uJjB4ZmY7CisKKwkJLyogUmFuZG9tIHN0dWZmICovCisJCW1lbWNweShwLHMtPnMzLT5zZXJ2ZXJfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUpOworCQlwKz1TU0wzX1JBTkRPTV9TSVpFOworCisJCS8qIG5vdyBpbiB0aGVvcnkgd2UgaGF2ZSAzIG9wdGlvbnMgdG8gc2VuZGluZyBiYWNrIHRoZQorCQkgKiBzZXNzaW9uIGlkLiAgSWYgaXQgaXMgYSByZS11c2UsIHdlIHNlbmQgYmFjayB0aGUKKwkJICogb2xkIHNlc3Npb24taWQsIGlmIGl0IGlzIGEgbmV3IHNlc3Npb24sIHdlIHNlbmQKKwkJICogYmFjayB0aGUgbmV3IHNlc3Npb24taWQgb3Igd2Ugc2VuZCBiYWNrIGEgMCBsZW5ndGgKKwkJICogc2Vzc2lvbi1pZCBpZiB3ZSB3YW50IGl0IHRvIGJlIHNpbmdsZSB1c2UuCisJCSAqIEN1cnJlbnRseSBJIHdpbGwgbm90IGltcGxlbWVudCB0aGUgJzAnIGxlbmd0aCBzZXNzaW9uLWlkCisJCSAqIDEyLUphbi05OCAtIEknbGwgbm93IHN1cHBvcnQgdGhlICcwJyBsZW5ndGggc3R1ZmYuCisJCSAqCisJCSAqIFdlIGFsc28gaGF2ZSBhbiBhZGRpdGlvbmFsIGNhc2Ugd2hlcmUgc3RhdGVsZXNzIHNlc3Npb24KKwkJICogcmVzdW1wdGlvbiBpcyBzdWNjZXNzZnVsOiB3ZSBhbHdheXMgc2VuZCBiYWNrIHRoZSBvbGQKKwkJICogc2Vzc2lvbiBpZC4gSW4gdGhpcyBjYXNlIHMtPmhpdCBpcyBub24gemVybzogdGhpcyBjYW4KKwkJICogb25seSBoYXBwZW4gaWYgc3RhdGVsZXNzIHNlc3Npb24gcmVzdW1wdGlvbiBpcyBzdWNjZXNmdWwKKwkJICogaWYgc2Vzc2lvbiBjYWNoaW5nIGlzIGRpc2FibGVkIHNvIGV4aXN0aW5nIGZ1bmN0aW9uYWxpdHkKKwkJICogaXMgdW5hZmZlY3RlZC4KKwkJICovCisJCWlmICghKHMtPmN0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlICYgU1NMX1NFU1NfQ0FDSEVfU0VSVkVSKQorCQkJJiYgIXMtPmhpdCkKKwkJCXMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoPTA7CisKKwkJc2w9cy0+c2Vzc2lvbi0+c2Vzc2lvbl9pZF9sZW5ndGg7CisJCWlmIChzbCA+IChpbnQpc2l6ZW9mKHMtPnNlc3Npb24tPnNlc3Npb25faWQpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfSEVMTE8sIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJKihwKyspPXNsOworCQltZW1jcHkocCxzLT5zZXNzaW9uLT5zZXNzaW9uX2lkLHNsKTsKKwkJcCs9c2w7CisKKwkJLyogcHV0IHRoZSBjaXBoZXIgKi8KKwkJaT1zc2wzX3B1dF9jaXBoZXJfYnlfY2hhcihzLT5zMy0+dG1wLm5ld19jaXBoZXIscCk7CisJCXArPWk7CisKKwkJLyogcHV0IHRoZSBjb21wcmVzc2lvbiBtZXRob2QgKi8KKyNpZmRlZiBPUEVOU1NMX05PX0NPTVAKKwkJCSoocCsrKT0wOworI2Vsc2UKKwkJaWYgKHMtPnMzLT50bXAubmV3X2NvbXByZXNzaW9uID09IE5VTEwpCisJCQkqKHArKyk9MDsKKwkJZWxzZQorCQkJKihwKyspPXMtPnMzLT50bXAubmV3X2NvbXByZXNzaW9uLT5pZDsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCQlpZiAoc3NsX3ByZXBhcmVfc2VydmVyaGVsbG9fdGxzZXh0KHMpIDw9IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9IRUxMTyxTU0xfUl9TRVJWRVJIRUxMT19UTFNFWFQpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlpZiAoKHAgPSBzc2xfYWRkX3NlcnZlcmhlbGxvX3Rsc2V4dChzLCBwLCBidWYrU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIKSkgPT0gTlVMTCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0hFTExPLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKyNlbmRpZgorCQkvKiBkbyB0aGUgaGVhZGVyICovCisJCWw9KHAtZCk7CisJCWQ9YnVmOworCQkqKGQrKyk9U1NMM19NVF9TRVJWRVJfSEVMTE87CisJCWwybjMobCxkKTsKKworCQlzLT5zdGF0ZT1TU0wzX1NUX1NXX1NSVlJfSEVMTE9fQjsKKwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCXMtPmluaXRfbnVtPXAtYnVmOworCQlzLT5pbml0X29mZj0wOworCQl9CisKKwkvKiBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQiAqLworCXJldHVybihzc2wzX2RvX3dyaXRlKHMsU1NMM19SVF9IQU5EU0hBS0UpKTsKKwl9CisKK2ludCBzc2wzX3NlbmRfc2VydmVyX2RvbmUoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfU1dfU1JWUl9ET05FX0EpCisJCXsKKwkJcD0odW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCisJCS8qIGRvIHRoZSBoZWFkZXIgKi8KKwkJKihwKyspPVNTTDNfTVRfU0VSVkVSX0RPTkU7CisJCSoocCsrKT0wOworCQkqKHArKyk9MDsKKwkJKihwKyspPTA7CisKKwkJcy0+c3RhdGU9U1NMM19TVF9TV19TUlZSX0RPTkVfQjsKKwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCXMtPmluaXRfbnVtPTQ7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKworCS8qIFNTTDNfU1RfU1dfU1JWUl9ET05FX0IgKi8KKwlyZXR1cm4oc3NsM19kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorCitpbnQgc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UoU1NMICpzKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwl1bnNpZ25lZCBjaGFyICpxOworCWludCBqLG51bTsKKwlSU0EgKnJzYTsKKwl1bnNpZ25lZCBjaGFyIG1kX2J1ZltNRDVfRElHRVNUX0xFTkdUSCtTSEFfRElHRVNUX0xFTkdUSF07CisJdW5zaWduZWQgaW50IHU7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCURIICpkaD1OVUxMLCpkaHA7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJRUNfS0VZICplY2RoPU5VTEwsICplY2RocDsKKwl1bnNpZ25lZCBjaGFyICplbmNvZGVkUG9pbnQgPSBOVUxMOworCWludCBlbmNvZGVkbGVuID0gMDsKKwlpbnQgY3VydmVfaWQgPSAwOworCUJOX0NUWCAqYm5fY3R4ID0gTlVMTDsgCisjZW5kaWYKKwlFVlBfUEtFWSAqcGtleTsKKwl1bnNpZ25lZCBjaGFyICpwLCpkOworCWludCBhbCxpOworCXVuc2lnbmVkIGxvbmcgdHlwZTsKKwlpbnQgbjsKKwlDRVJUICpjZXJ0OworCUJJR05VTSAqcls0XTsKKwlpbnQgbnJbNF0sa247CisJQlVGX01FTSAqYnVmOworCUVWUF9NRF9DVFggbWRfY3R4OworCisJRVZQX01EX0NUWF9pbml0KCZtZF9jdHgpOworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX1NXX0tFWV9FWENIX0EpCisJCXsKKwkJdHlwZT1zLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OworCQljZXJ0PXMtPmNlcnQ7CisKKwkJYnVmPXMtPmluaXRfYnVmOworCisJCXJbMF09clsxXT1yWzJdPXJbM109TlVMTDsKKwkJbj0wOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQlpZiAodHlwZSAmIFNTTF9rUlNBKQorCQkJeworCQkJcnNhPWNlcnQtPnJzYV90bXA7CisJCQlpZiAoKHJzYSA9PSBOVUxMKSAmJiAocy0+Y2VydC0+cnNhX3RtcF9jYiAhPSBOVUxMKSkKKwkJCQl7CisJCQkJcnNhPXMtPmNlcnQtPnJzYV90bXBfY2IocywKKwkJCQkgICAgICBTU0xfQ19JU19FWFBPUlQocy0+czMtPnRtcC5uZXdfY2lwaGVyKSwKKwkJCQkgICAgICBTU0xfQ19FWFBPUlRfUEtFWUxFTkdUSChzLT5zMy0+dG1wLm5ld19jaXBoZXIpKTsKKwkJCQlpZihyc2EgPT0gTlVMTCkKKwkJCQl7CisJCQkJCWFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKwkJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLFNTTF9SX0VSUk9SX0dFTkVSQVRJTkdfVE1QX1JTQV9LRVkpOworCQkJCQlnb3RvIGZfZXJyOworCQkJCX0KKwkJCQlSU0FfdXBfcmVmKHJzYSk7CisJCQkJY2VydC0+cnNhX3RtcD1yc2E7CisJCQkJfQorCQkJaWYgKHJzYSA9PSBOVUxMKQorCQkJCXsKKwkJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLFNTTF9SX01JU1NJTkdfVE1QX1JTQV9LRVkpOworCQkJCWdvdG8gZl9lcnI7CisJCQkJfQorCQkJclswXT1yc2EtPm47CisJCQlyWzFdPXJzYS0+ZTsKKwkJCXMtPnMzLT50bXAudXNlX3JzYV90bXA9MTsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwkJCWlmICh0eXBlICYgU1NMX2tFREgpCisJCQl7CisJCQlkaHA9Y2VydC0+ZGhfdG1wOworCQkJaWYgKChkaHAgPT0gTlVMTCkgJiYgKHMtPmNlcnQtPmRoX3RtcF9jYiAhPSBOVUxMKSkKKwkJCQlkaHA9cy0+Y2VydC0+ZGhfdG1wX2NiKHMsCisJCQkJICAgICAgU1NMX0NfSVNfRVhQT1JUKHMtPnMzLT50bXAubmV3X2NpcGhlciksCisJCQkJICAgICAgU1NMX0NfRVhQT1JUX1BLRVlMRU5HVEgocy0+czMtPnRtcC5uZXdfY2lwaGVyKSk7CisJCQlpZiAoZGhwID09IE5VTEwpCisJCQkJeworCQkJCWFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsU1NMX1JfTUlTU0lOR19UTVBfREhfS0VZKTsKKwkJCQlnb3RvIGZfZXJyOworCQkJCX0KKworCQkJaWYgKHMtPnMzLT50bXAuZGggIT0gTlVMTCkKKwkJCQl7CisJCQkJREhfZnJlZShkaCk7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQlpZiAoKGRoPURIcGFyYW1zX2R1cChkaHApKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsRVJSX1JfREhfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCXMtPnMzLT50bXAuZGg9ZGg7CisJCQlpZiAoKGRocC0+cHViX2tleSA9PSBOVUxMIHx8CisJCQkgICAgIGRocC0+cHJpdl9rZXkgPT0gTlVMTCB8fAorCQkJICAgICAocy0+b3B0aW9ucyAmIFNTTF9PUF9TSU5HTEVfREhfVVNFKSkpCisJCQkJeworCQkJCWlmKCFESF9nZW5lcmF0ZV9rZXkoZGgpKQorCQkJCSAgICB7CisJCQkJICAgIFNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSwKKwkJCQkJICAgRVJSX1JfREhfTElCKTsKKwkJCQkgICAgZ290byBlcnI7CisJCQkJICAgIH0KKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCWRoLT5wdWJfa2V5PUJOX2R1cChkaHAtPnB1Yl9rZXkpOworCQkJCWRoLT5wcml2X2tleT1CTl9kdXAoZGhwLT5wcml2X2tleSk7CisJCQkJaWYgKChkaC0+cHViX2tleSA9PSBOVUxMKSB8fAorCQkJCQkoZGgtPnByaXZfa2V5ID09IE5VTEwpKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfUl9ESF9MSUIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCX0KKwkJCXJbMF09ZGgtPnA7CisJCQlyWzFdPWRoLT5nOworCQkJclsyXT1kaC0+cHViX2tleTsKKwkJCX0KKwkJZWxzZSAKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJCWlmICh0eXBlICYgU1NMX2tFRUNESCkKKwkJCXsKKwkJCWNvbnN0IEVDX0dST1VQICpncm91cDsKKworCQkJZWNkaHA9Y2VydC0+ZWNkaF90bXA7CisJCQlpZiAoKGVjZGhwID09IE5VTEwpICYmIChzLT5jZXJ0LT5lY2RoX3RtcF9jYiAhPSBOVUxMKSkKKwkJCQl7CisJCQkJZWNkaHA9cy0+Y2VydC0+ZWNkaF90bXBfY2IocywKKwkJCQkgICAgICBTU0xfQ19JU19FWFBPUlQocy0+czMtPnRtcC5uZXdfY2lwaGVyKSwKKwkJCQkgICAgICBTU0xfQ19FWFBPUlRfUEtFWUxFTkdUSChzLT5zMy0+dG1wLm5ld19jaXBoZXIpKTsKKwkJCQl9CisJCQlpZiAoZWNkaHAgPT0gTlVMTCkKKwkJCQl7CisJCQkJYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxTU0xfUl9NSVNTSU5HX1RNUF9FQ0RIX0tFWSk7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisKKwkJCWlmIChzLT5zMy0+dG1wLmVjZGggIT0gTlVMTCkKKwkJCQl7CisJCQkJRUNfS0VZX2ZyZWUocy0+czMtPnRtcC5lY2RoKTsgCisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQkvKiBEdXBsaWNhdGUgdGhlIEVDREggc3RydWN0dXJlLiAqLworCQkJaWYgKGVjZGhwID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfUl9FQ0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJaWYgKCFFQ19LRVlfdXBfcmVmKGVjZGhwKSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLEVSUl9SX0VDREhfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQllY2RoID0gZWNkaHA7CisKKwkJCXMtPnMzLT50bXAuZWNkaD1lY2RoOworCQkJaWYgKChFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGVjZGgpID09IE5VTEwpIHx8CisJCQkgICAgKEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGVjZGgpID09IE5VTEwpIHx8CisJCQkgICAgKHMtPm9wdGlvbnMgJiBTU0xfT1BfU0lOR0xFX0VDREhfVVNFKSkKKwkJCQl7CisJCQkJaWYoIUVDX0tFWV9nZW5lcmF0ZV9rZXkoZWNkaCkpCisJCQkJICAgIHsKKwkJCQkgICAgU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLEVSUl9SX0VDREhfTElCKTsKKwkJCQkgICAgZ290byBlcnI7CisJCQkJICAgIH0KKwkJCQl9CisKKwkJCWlmICgoKGdyb3VwID0gRUNfS0VZX2dldDBfZ3JvdXAoZWNkaCkpID09IE5VTEwpIHx8CisJCQkgICAgKEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoZWNkaCkgID09IE5VTEwpIHx8CisJCQkgICAgKEVDX0tFWV9nZXQwX3ByaXZhdGVfa2V5KGVjZGgpID09IE5VTEwpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsRVJSX1JfRUNESF9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJaWYgKFNTTF9DX0lTX0VYUE9SVChzLT5zMy0+dG1wLm5ld19jaXBoZXIpICYmCisJCQkgICAgKEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApID4gMTYzKSkgCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxTU0xfUl9FQ0dST1VQX1RPT19MQVJHRV9GT1JfQ0lQSEVSKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCS8qIFhYWDogRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IGVwaGVtZXJhbCBFQ0RICisJCQkgKiBrZXlzIG92ZXIgbmFtZWQgKG5vdCBnZW5lcmljKSBjdXJ2ZXMuIEZvciAKKwkJCSAqIHN1cHBvcnRlZCBuYW1lZCBjdXJ2ZXMsIGN1cnZlX2lkIGlzIG5vbi16ZXJvLgorCQkJICovCisJCQlpZiAoKGN1cnZlX2lkID0gCisJCQkgICAgdGxzMV9lY19uaWQyY3VydmVfaWQoRUNfR1JPVVBfZ2V0X2N1cnZlX25hbWUoZ3JvdXApKSkKKwkJCSAgICA9PSAwKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsU1NMX1JfVU5TVVBQT1JURURfRUxMSVBUSUNfQ1VSVkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJLyogRW5jb2RlIHRoZSBwdWJsaWMga2V5LgorCQkJICogRmlyc3QgY2hlY2sgdGhlIHNpemUgb2YgZW5jb2RpbmcgYW5kCisJCQkgKiBhbGxvY2F0ZSBtZW1vcnkgYWNjb3JkaW5nbHkuCisJCQkgKi8KKwkJCWVuY29kZWRsZW4gPSBFQ19QT0lOVF9wb2ludDJvY3QoZ3JvdXAsIAorCQkJICAgIEVDX0tFWV9nZXQwX3B1YmxpY19rZXkoZWNkaCksCisJCQkgICAgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQsIAorCQkJICAgIE5VTEwsIDAsIE5VTEwpOworCisJCQllbmNvZGVkUG9pbnQgPSAodW5zaWduZWQgY2hhciAqKSAKKwkJCSAgICBPUEVOU1NMX21hbGxvYyhlbmNvZGVkbGVuKnNpemVvZih1bnNpZ25lZCBjaGFyKSk7IAorCQkJYm5fY3R4ID0gQk5fQ1RYX25ldygpOworCQkJaWYgKChlbmNvZGVkUG9pbnQgPT0gTlVMTCkgfHwgKGJuX2N0eCA9PSBOVUxMKSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisKKworCQkJZW5jb2RlZGxlbiA9IEVDX1BPSU5UX3BvaW50Mm9jdChncm91cCwgCisJCQkgICAgRUNfS0VZX2dldDBfcHVibGljX2tleShlY2RoKSwgCisJCQkgICAgUE9JTlRfQ09OVkVSU0lPTl9VTkNPTVBSRVNTRUQsIAorCQkJICAgIGVuY29kZWRQb2ludCwgZW5jb2RlZGxlbiwgYm5fY3R4KTsKKworCQkJaWYgKGVuY29kZWRsZW4gPT0gMCkgCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfUl9FQ0RIX0xJQik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCisJCQlCTl9DVFhfZnJlZShibl9jdHgpOyAgYm5fY3R4PU5VTEw7CisKKwkJCS8qIFhYWDogRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IG5hbWVkIChub3QgCisJCQkgKiBnZW5lcmljKSBjdXJ2ZXMgaW4gRUNESCBlcGhlbWVyYWwga2V5IGV4Y2hhbmdlcy4KKwkJCSAqIEluIHRoaXMgc2l0dWF0aW9uLCB3ZSBuZWVkIGZvdXIgYWRkaXRpb25hbCBieXRlcworCQkJICogdG8gZW5jb2RlIHRoZSBlbnRpcmUgU2VydmVyRUNESFBhcmFtcworCQkJICogc3RydWN0dXJlLiAKKwkJCSAqLworCQkJbiA9IDQgKyBlbmNvZGVkbGVuOworCisJCQkvKiBXZSdsbCBnZW5lcmF0ZSB0aGUgc2VydmVyS2V5RXhjaGFuZ2UgbWVzc2FnZQorCQkJICogZXhwbGljaXRseSBzbyB3ZSBjYW4gc2V0IHRoZXNlIHRvIE5VTExzCisJCQkgKi8KKwkJCXJbMF09TlVMTDsKKwkJCXJbMV09TlVMTDsKKwkJCXJbMl09TlVMTDsKKwkJCXJbM109TlVMTDsKKwkJCX0KKwkJZWxzZSAKKyNlbmRpZiAvKiAhT1BFTlNTTF9OT19FQ0RIICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJCQlpZiAodHlwZSAmIFNTTF9rUFNLKQorCQkJCXsKKwkJCQkvKiByZXNlcnZlIHNpemUgZm9yIHJlY29yZCBsZW5ndGggYW5kIFBTSyBpZGVudGl0eSBoaW50Ki8KKwkJCQluKz0yK3N0cmxlbihzLT5jdHgtPnBza19pZGVudGl0eV9oaW50KTsKKwkJCQl9CisJCQllbHNlCisjZW5kaWYgLyogIU9QRU5TU0xfTk9fUFNLICovCisJCQl7CisJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsU1NMX1JfVU5LTk9XTl9LRVlfRVhDSEFOR0VfVFlQRSk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQlmb3IgKGk9MDsgcltpXSAhPSBOVUxMOyBpKyspCisJCQl7CisJCQlucltpXT1CTl9udW1fYnl0ZXMocltpXSk7CisJCQluKz0yK25yW2ldOworCQkJfQorCisJCWlmICghKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX2F1dGggJiBTU0xfYU5VTEwpCisJCQkmJiAhKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX21rZXkgJiBTU0xfa1BTSykpCisJCQl7CisJCQlpZiAoKHBrZXk9c3NsX2dldF9zaWduX3BrZXkocyxzLT5zMy0+dG1wLm5ld19jaXBoZXIpKQorCQkJCT09IE5VTEwpCisJCQkJeworCQkJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJZ290byBmX2VycjsKKwkJCQl9CisJCQlrbj1FVlBfUEtFWV9zaXplKHBrZXkpOworCQkJfQorCQllbHNlCisJCQl7CisJCQlwa2V5PU5VTEw7CisJCQlrbj0wOworCQkJfQorCisJCWlmICghQlVGX01FTV9ncm93X2NsZWFuKGJ1ZixuKzQra24pKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLEVSUl9MSUJfQlVGKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlkPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCXA9ICYoZFs0XSk7CisKKwkJZm9yIChpPTA7IHJbaV0gIT0gTlVMTDsgaSsrKQorCQkJeworCQkJczJuKG5yW2ldLHApOworCQkJQk5fYm4yYmluKHJbaV0scCk7CisJCQlwKz1ucltpXTsKKwkJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwkJaWYgKHR5cGUgJiBTU0xfa0VFQ0RIKSAKKwkJCXsKKwkJCS8qIFhYWDogRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IG5hbWVkIChub3QgZ2VuZXJpYykgY3VydmVzLgorCQkJICogSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBzZXJ2ZXJLZXlFeGNoYW5nZSBtZXNzYWdlIGhhczoKKwkJCSAqIFsxIGJ5dGUgQ3VydmVUeXBlXSwgWzIgYnl0ZSBDdXJ2ZU5hbWVdCisJCQkgKiBbMSBieXRlIGxlbmd0aCBvZiBlbmNvZGVkIHBvaW50XSwgZm9sbG93ZWQgYnkKKwkJCSAqIHRoZSBhY3R1YWwgZW5jb2RlZCBwb2ludCBpdHNlbGYKKwkJCSAqLworCQkJKnAgPSBOQU1FRF9DVVJWRV9UWVBFOworCQkJcCArPSAxOworCQkJKnAgPSAwOworCQkJcCArPSAxOworCQkJKnAgPSBjdXJ2ZV9pZDsKKwkJCXAgKz0gMTsKKwkJCSpwID0gZW5jb2RlZGxlbjsKKwkJCXAgKz0gMTsKKwkJCW1lbWNweSgodW5zaWduZWQgY2hhciopcCwgCisJCQkgICAgKHVuc2lnbmVkIGNoYXIgKillbmNvZGVkUG9pbnQsIAorCQkJICAgIGVuY29kZWRsZW4pOworCQkJT1BFTlNTTF9mcmVlKGVuY29kZWRQb2ludCk7CisJCQlwICs9IGVuY29kZWRsZW47CisJCQl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCQlpZiAodHlwZSAmIFNTTF9rUFNLKQorCQkJeworCQkJLyogY29weSBQU0sgaWRlbnRpdHkgaGludCAqLworCQkJczJuKHN0cmxlbihzLT5jdHgtPnBza19pZGVudGl0eV9oaW50KSwgcCk7IAorCQkJc3RybmNweSgoY2hhciAqKXAsIHMtPmN0eC0+cHNrX2lkZW50aXR5X2hpbnQsIHN0cmxlbihzLT5jdHgtPnBza19pZGVudGl0eV9oaW50KSk7CisJCQlwKz1zdHJsZW4ocy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCk7CisJCQl9CisjZW5kaWYKKworCQkvKiBub3QgYW5vbnltb3VzICovCisJCWlmIChwa2V5ICE9IE5VTEwpCisJCQl7CisJCQkvKiBuIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhcmFtcywgdGhleSBzdGFydCBhdCAmKGRbNF0pCisJCQkgKiBhbmQgcCBwb2ludHMgdG8gdGhlIHNwYWNlIGF0IHRoZSBlbmQuICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCQlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9SU0EpCisJCQkJeworCQkJCXE9bWRfYnVmOworCQkJCWo9MDsKKwkJCQlmb3IgKG51bT0yOyBudW0gPiAwOyBudW0tLSkKKwkJCQkJeworCQkJCQlFVlBfRGlnZXN0SW5pdF9leCgmbWRfY3R4LChudW0gPT0gMikKKwkJCQkJCT9zLT5jdHgtPm1kNTpzLT5jdHgtPnNoYTEsIE5VTEwpOworCQkJCQlFVlBfRGlnZXN0VXBkYXRlKCZtZF9jdHgsJihzLT5zMy0+Y2xpZW50X3JhbmRvbVswXSksU1NMM19SQU5ET01fU0laRSk7CisJCQkJCUVWUF9EaWdlc3RVcGRhdGUoJm1kX2N0eCwmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJCQkJRVZQX0RpZ2VzdFVwZGF0ZSgmbWRfY3R4LCYoZFs0XSksbik7CisJCQkJCUVWUF9EaWdlc3RGaW5hbF9leCgmbWRfY3R4LHEsCisJCQkJCQkodW5zaWduZWQgaW50ICopJmkpOworCQkJCQlxKz1pOworCQkJCQlqKz1pOworCQkJCQl9CisJCQkJaWYgKFJTQV9zaWduKE5JRF9tZDVfc2hhMSwgbWRfYnVmLCBqLAorCQkJCQkmKHBbMl0pLCAmdSwgcGtleS0+cGtleS5yc2EpIDw9IDApCisJCQkJCXsKKwkJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFLEVSUl9MSUJfUlNBKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlzMm4odSxwKTsKKwkJCQluKz11KzI7CisJCQkJfQorCQkJZWxzZQorI2VuZGlmCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19EU0EpCisJCQkJaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfRFNBKQorCQkJCXsKKwkJCQkvKiBsZXRzIGRvIERTUyAqLworCQkJCUVWUF9TaWduSW5pdF9leCgmbWRfY3R4LEVWUF9kc3MxKCksIE5VTEwpOworCQkJCUVWUF9TaWduVXBkYXRlKCZtZF9jdHgsJihzLT5zMy0+Y2xpZW50X3JhbmRvbVswXSksU1NMM19SQU5ET01fU0laRSk7CisJCQkJRVZQX1NpZ25VcGRhdGUoJm1kX2N0eCwmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJCQlFVlBfU2lnblVwZGF0ZSgmbWRfY3R4LCYoZFs0XSksbik7CisJCQkJaWYgKCFFVlBfU2lnbkZpbmFsKCZtZF9jdHgsJihwWzJdKSwKKwkJCQkJKHVuc2lnbmVkIGludCAqKSZpLHBrZXkpKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfTElCX0RTQSk7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJczJuKGkscCk7CisJCQkJbis9aSsyOworCQkJCX0KKwkJCWVsc2UKKyNlbmRpZgorI2lmICFkZWZpbmVkKE9QRU5TU0xfTk9fRUNEU0EpCisJCQkJaWYgKHBrZXktPnR5cGUgPT0gRVZQX1BLRVlfRUMpCisJCQkJeworCQkJCS8qIGxldCdzIGRvIEVDRFNBICovCisJCQkJRVZQX1NpZ25Jbml0X2V4KCZtZF9jdHgsRVZQX2VjZHNhKCksIE5VTEwpOworCQkJCUVWUF9TaWduVXBkYXRlKCZtZF9jdHgsJihzLT5zMy0+Y2xpZW50X3JhbmRvbVswXSksU1NMM19SQU5ET01fU0laRSk7CisJCQkJRVZQX1NpZ25VcGRhdGUoJm1kX2N0eCwmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKSxTU0wzX1JBTkRPTV9TSVpFKTsKKwkJCQlFVlBfU2lnblVwZGF0ZSgmbWRfY3R4LCYoZFs0XSksbik7CisJCQkJaWYgKCFFVlBfU2lnbkZpbmFsKCZtZF9jdHgsJihwWzJdKSwKKwkJCQkJKHVuc2lnbmVkIGludCAqKSZpLHBrZXkpKQorCQkJCQl7CisJCQkJCVNTTGVycihTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0tFWV9FWENIQU5HRSxFUlJfTElCX0VDRFNBKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlzMm4oaSxwKTsKKwkJCQluKz1pKzI7CisJCQkJfQorCQkJZWxzZQorI2VuZGlmCisJCQkJeworCQkJCS8qIElzIHRoaXMgZXJyb3IgY2hlY2sgYWN0dWFsbHkgbmVlZGVkPyAqLworCQkJCWFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UsU1NMX1JfVU5LTk9XTl9QS0VZX1RZUEUpOworCQkJCWdvdG8gZl9lcnI7CisJCQkJfQorCQkJfQorCisJCSooZCsrKT1TU0wzX01UX1NFUlZFUl9LRVlfRVhDSEFOR0U7CisJCWwybjMobixkKTsKKworCQkvKiB3ZSBzaG91bGQgbm93IGhhdmUgdGhpbmdzIHBhY2tlZCB1cCwgc28gbGV0cyBzZW5kCisJCSAqIGl0IG9mZiAqLworCQlzLT5pbml0X251bT1uKzQ7CisJCXMtPmluaXRfb2ZmPTA7CisJCX0KKworCXMtPnN0YXRlID0gU1NMM19TVF9TV19LRVlfRVhDSF9COworCUVWUF9NRF9DVFhfY2xlYW51cCgmbWRfY3R4KTsKKwlyZXR1cm4oc3NsM19kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CitmX2VycjoKKwlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLGFsKTsKK2VycjoKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJaWYgKGVuY29kZWRQb2ludCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoZW5jb2RlZFBvaW50KTsKKwlCTl9DVFhfZnJlZShibl9jdHgpOworI2VuZGlmCisJRVZQX01EX0NUWF9jbGVhbnVwKCZtZF9jdHgpOworCXJldHVybigtMSk7CisJfQorCitpbnQgc3NsM19zZW5kX2NlcnRpZmljYXRlX3JlcXVlc3QoU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwLCpkOworCWludCBpLGosbmwsb2ZmLG47CisJU1RBQ0tfT0YoWDUwOV9OQU1FKSAqc2s9TlVMTDsKKwlYNTA5X05BTUUgKm5hbWU7CisJQlVGX01FTSAqYnVmOworCisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfU1dfQ0VSVF9SRVFfQSkKKwkJeworCQlidWY9cy0+aW5pdF9idWY7CisKKwkJZD1wPSh1bnNpZ25lZCBjaGFyICopJihidWYtPmRhdGFbNF0pOworCisJCS8qIGdldCB0aGUgbGlzdCBvZiBhY2NlcHRhYmxlIGNlcnQgdHlwZXMgKi8KKwkJcCsrOworCQluPXNzbDNfZ2V0X3JlcV9jZXJ0X3R5cGUocyxwKTsKKwkJZFswXT1uOworCQlwKz1uOworCQluKys7CisKKwkJb2ZmPW47CisJCXArPTI7CisJCW4rPTI7CisKKwkJc2s9U1NMX2dldF9jbGllbnRfQ0FfbGlzdChzKTsKKwkJbmw9MDsKKwkJaWYgKHNrICE9IE5VTEwpCisJCQl7CisJCQlmb3IgKGk9MDsgaTxza19YNTA5X05BTUVfbnVtKHNrKTsgaSsrKQorCQkJCXsKKwkJCQluYW1lPXNrX1g1MDlfTkFNRV92YWx1ZShzayxpKTsKKwkJCQlqPWkyZF9YNTA5X05BTUUobmFtZSxOVUxMKTsKKwkJCQlpZiAoIUJVRl9NRU1fZ3Jvd19jbGVhbihidWYsNCtuK2orMikpCisJCQkJCXsKKwkJCQkJU1NMZXJyKFNTTF9GX1NTTDNfU0VORF9DRVJUSUZJQ0FURV9SRVFVRVNULEVSUl9SX0JVRl9MSUIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCXA9KHVuc2lnbmVkIGNoYXIgKikmKGJ1Zi0+ZGF0YVs0K25dKTsKKwkJCQlpZiAoIShzLT5vcHRpb25zICYgU1NMX09QX05FVFNDQVBFX0NBX0ROX0JVRykpCisJCQkJCXsKKwkJCQkJczJuKGoscCk7CisJCQkJCWkyZF9YNTA5X05BTUUobmFtZSwmcCk7CisJCQkJCW4rPTIrajsKKwkJCQkJbmwrPTIrajsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlkPXA7CisJCQkJCWkyZF9YNTA5X05BTUUobmFtZSwmcCk7CisJCQkJCWotPTI7IHMybihqLGQpOyBqKz0yOworCQkJCQluKz1qOworCQkJCQlubCs9ajsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJLyogZWxzZSBubyBDQSBuYW1lcyAqLworCQlwPSh1bnNpZ25lZCBjaGFyICopJihidWYtPmRhdGFbNCtvZmZdKTsKKwkJczJuKG5sLHApOworCisJCWQ9KHVuc2lnbmVkIGNoYXIgKilidWYtPmRhdGE7CisJCSooZCsrKT1TU0wzX01UX0NFUlRJRklDQVRFX1JFUVVFU1Q7CisJCWwybjMobixkKTsKKworCQkvKiB3ZSBzaG91bGQgbm93IGhhdmUgdGhpbmdzIHBhY2tlZCB1cCwgc28gbGV0cyBzZW5kCisJCSAqIGl0IG9mZiAqLworCisJCXMtPmluaXRfbnVtPW4rNDsKKwkJcy0+aW5pdF9vZmY9MDsKKyNpZmRlZiBORVRTQ0FQRV9IQU5HX0JVRworCQlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGEgKyBzLT5pbml0X251bTsKKworCQkvKiBkbyB0aGUgaGVhZGVyICovCisJCSoocCsrKT1TU0wzX01UX1NFUlZFUl9ET05FOworCQkqKHArKyk9MDsKKwkJKihwKyspPTA7CisJCSoocCsrKT0wOworCQlzLT5pbml0X251bSArPSA0OworI2VuZGlmCisKKwkJcy0+c3RhdGUgPSBTU0wzX1NUX1NXX0NFUlRfUkVRX0I7CisJCX0KKworCS8qIFNTTDNfU1RfU1dfQ0VSVF9SRVFfQiAqLworCXJldHVybihzc2wzX2RvX3dyaXRlKHMsU1NMM19SVF9IQU5EU0hBS0UpKTsKK2VycjoKKwlyZXR1cm4oLTEpOworCX0KKworaW50IHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UoU1NMICpzKQorCXsKKwlpbnQgaSxhbCxvazsKKwlsb25nIG47CisJdW5zaWduZWQgbG9uZyBhbGdfazsKKwl1bnNpZ25lZCBjaGFyICpwOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCVJTQSAqcnNhPU5VTEw7CisJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJQklHTlVNICpwdWI9TlVMTDsKKwlESCAqZGhfc3J2cjsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwlLU1NMX0VSUiBrc3NsX2VycjsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0tSQjUgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlFQ19LRVkgKnNydnJfZWNkaCA9IE5VTEw7CisJRVZQX1BLRVkgKmNsbnRfcHViX3BrZXkgPSBOVUxMOworCUVDX1BPSU5UICpjbG50X2VjcG9pbnQgPSBOVUxMOworCUJOX0NUWCAqYm5fY3R4ID0gTlVMTDsgCisjZW5kaWYKKworCW49cy0+bWV0aG9kLT5zc2xfZ2V0X21lc3NhZ2UocywKKwkJU1NMM19TVF9TUl9LRVlfRVhDSF9BLAorCQlTU0wzX1NUX1NSX0tFWV9FWENIX0IsCisJCVNTTDNfTVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJMjA0OCwgLyogPz8/ICovCisJCSZvayk7CisKKwlpZiAoIW9rKSByZXR1cm4oKGludCluKTsKKwlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9tc2c7CisKKwlhbGdfaz1zLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OworCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJaWYgKGFsZ19rICYgU1NMX2tSU0EpCisJCXsKKwkJLyogRklYIFRISVMgVVAgRUFZIEVBWSBFQVkgRUFZICovCisJCWlmIChzLT5zMy0+dG1wLnVzZV9yc2FfdG1wKQorCQkJeworCQkJaWYgKChzLT5jZXJ0ICE9IE5VTEwpICYmIChzLT5jZXJ0LT5yc2FfdG1wICE9IE5VTEwpKQorCQkJCXJzYT1zLT5jZXJ0LT5yc2FfdG1wOworCQkJLyogRG9uJ3QgZG8gYSBjYWxsYmFjayBiZWNhdXNlIHJzYV90bXAgc2hvdWxkCisJCQkgKiBiZSBzZW50IGFscmVhZHkgKi8KKwkJCWlmIChyc2EgPT0gTlVMTCkKKwkJCQl7CisJCQkJYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLFNTTF9SX01JU1NJTkdfVE1QX1JTQV9QS0VZKTsKKwkJCQlnb3RvIGZfZXJyOworCisJCQkJfQorCQkJfQorCQllbHNlCisJCQl7CisJCQlwa2V5PXMtPmNlcnQtPnBrZXlzW1NTTF9QS0VZX1JTQV9FTkNdLnByaXZhdGVrZXk7CisJCQlpZiAoCShwa2V5ID09IE5VTEwpIHx8CisJCQkJKHBrZXktPnR5cGUgIT0gRVZQX1BLRVlfUlNBKSB8fAorCQkJCShwa2V5LT5wa2V5LnJzYSA9PSBOVUxMKSkKKwkJCQl7CisJCQkJYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLFNTTF9SX01JU1NJTkdfUlNBX0NFUlRJRklDQVRFKTsKKwkJCQlnb3RvIGZfZXJyOworCQkJCX0KKwkJCXJzYT1wa2V5LT5wa2V5LnJzYTsKKwkJCX0KKworCQkvKiBUTFMgYW5kIFtpbmNpZGVudGFsbHldIERUTFN7MHhGRUZGfSAqLworCQlpZiAocy0+dmVyc2lvbiA+IFNTTDNfVkVSU0lPTiAmJiBzLT52ZXJzaW9uICE9IERUTFMxX0JBRF9WRVIpCisJCQl7CisJCQluMnMocCxpKTsKKwkJCWlmIChuICE9IGkrMikKKwkJCQl7CisJCQkJaWYgKCEocy0+b3B0aW9ucyAmIFNTTF9PUF9UTFNfRDVfQlVHKSkKKwkJCQkJeworCQkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSxTU0xfUl9UTFNfUlNBX0VOQ1JZUFRFRF9WQUxVRV9MRU5HVEhfSVNfV1JPTkcpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJcC09MjsKKwkJCQl9CisJCQllbHNlCisJCQkJbj1pOworCQkJfQorCisJCWk9UlNBX3ByaXZhdGVfZGVjcnlwdCgoaW50KW4scCxwLHJzYSxSU0FfUEtDUzFfUEFERElORyk7CisKKwkJYWwgPSAtMTsKKwkJCisJCWlmIChpICE9IFNTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEgpCisJCQl7CisJCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQkJLyogU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsU1NMX1JfQkFEX1JTQV9ERUNSWVBUKTsgKi8KKwkJCX0KKworCQlpZiAoKGFsID09IC0xKSAmJiAhKChwWzBdID09IChzLT5jbGllbnRfdmVyc2lvbj4+OCkpICYmIChwWzFdID09IChzLT5jbGllbnRfdmVyc2lvbiAmIDB4ZmYpKSkpCisJCQl7CisJCQkvKiBUaGUgcHJlbWFzdGVyIHNlY3JldCBtdXN0IGNvbnRhaW4gdGhlIHNhbWUgdmVyc2lvbiBudW1iZXIgYXMgdGhlCisJCQkgKiBDbGllbnRIZWxsbyB0byBkZXRlY3QgdmVyc2lvbiByb2xsYmFjayBhdHRhY2tzIChzdHJhbmdlbHksIHRoZQorCQkJICogcHJvdG9jb2wgZG9lcyBub3Qgb2ZmZXIgc3VjaCBwcm90ZWN0aW9uIGZvciBESCBjaXBoZXJzdWl0ZXMpLgorCQkJICogSG93ZXZlciwgYnVnZ3kgY2xpZW50cyBleGlzdCB0aGF0IHNlbmQgdGhlIG5lZ290aWF0ZWQgcHJvdG9jb2wKKwkJCSAqIHZlcnNpb24gaW5zdGVhZCBpZiB0aGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZAorCQkJICogcHJvdG9jb2wgdmVyc2lvbi4KKwkJCSAqIElmIFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHIGlzIHNldCwgdG9sZXJhdGUgc3VjaCBjbGllbnRzLiAqLworCQkJaWYgKCEoKHMtPm9wdGlvbnMgJiBTU0xfT1BfVExTX1JPTExCQUNLX0JVRykgJiYKKwkJCQkocFswXSA9PSAocy0+dmVyc2lvbj4+OCkpICYmIChwWzFdID09IChzLT52ZXJzaW9uICYgMHhmZikpKSkKKwkJCQl7CisJCQkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQkvKiBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSxTU0xfUl9CQURfUFJPVE9DT0xfVkVSU0lPTl9OVU1CRVIpOyAqLworCisJCQkJLyogVGhlIEtsaW1hLVBva29ybnktUm9zYSBleHRlbnNpb24gb2YgQmxlaWNoZW5iYWNoZXIncyBhdHRhY2sKKwkJCQkgKiAoaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDAzLzA1Mi8pIGV4cGxvaXRzIHRoZSB2ZXJzaW9uCisJCQkJICogbnVtYmVyIGNoZWNrIGFzIGEgImJhZCB2ZXJzaW9uIG9yYWNsZSIgLS0gYW4gYWxlcnQgd291bGQKKwkJCQkgKiByZXZlYWwgdGhhdCB0aGUgcGxhaW50ZXh0IGNvcnJlc3BvbmRpbmcgdG8gc29tZSBjaXBoZXJ0ZXh0CisJCQkJICogbWFkZSB1cCBieSB0aGUgYWR2ZXJzYXJ5IGlzIHByb3Blcmx5IGZvcm1hdHRlZCBleGNlcHQKKwkJCQkgKiB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlciBpcyB3cm9uZy4gIFRvIGF2b2lkIHN1Y2ggYXR0YWNrcywKKwkJCQkgKiB3ZSBzaG91bGQgdHJlYXQgdGhpcyBqdXN0IGxpa2UgYW55IG90aGVyIGRlY3J5cHRpb24gZXJyb3IuICovCisJCQkJfQorCQkJfQorCisJCWlmIChhbCAhPSAtMSkKKwkJCXsKKwkJCS8qIFNvbWUgZGVjcnlwdGlvbiBmYWlsdXJlIC0tIHVzZSByYW5kb20gdmFsdWUgaW5zdGVhZCBhcyBjb3VudGVybWVhc3VyZQorCQkJICogYWdhaW5zdCBCbGVpY2hlbmJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUgUlNBIHBhZGRpbmcKKwkJCSAqIChzZWUgUkZDIDIyNDYsIHNlY3Rpb24gNy40LjcuMSkuICovCisJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCWkgPSBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIOworCQkJcFswXSA9IHMtPmNsaWVudF92ZXJzaW9uID4+IDg7CisJCQlwWzFdID0gcy0+Y2xpZW50X3ZlcnNpb24gJiAweGZmOworCQkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKHArMiwgaS0yKSA8PSAwKSAvKiBzaG91bGQgYmUgUkFORF9ieXRlcywgYnV0IHdlIGNhbm5vdCB3b3JrIGFyb3VuZCBhIGZhaWx1cmUgKi8KKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkKKwkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg9CisJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KHMsCisJCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSwKKwkJCQlwLGkpOworCQlPUEVOU1NMX2NsZWFuc2UocCxpKTsKKwkJfQorCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCWlmIChhbGdfayAmIChTU0xfa0VESHxTU0xfa0RIcnxTU0xfa0RIZCkpCisJCXsKKwkJbjJzKHAsaSk7CisJCWlmIChuICE9IGkrMikKKwkJCXsKKwkJCWlmICghKHMtPm9wdGlvbnMgJiBTU0xfT1BfU1NMRUFZXzA4MF9DTElFTlRfREhfQlVHKSkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsU1NMX1JfREhfUFVCTElDX1ZBTFVFX0xFTkdUSF9JU19XUk9ORyk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlwLT0yOworCQkJCWk9KGludCluOworCQkJCX0KKwkJCX0KKworCQlpZiAobiA9PSAwTCkgLyogdGhlIHBhcmFtZXRlcnMgYXJlIGluIHRoZSBjZXJ0ICovCisJCQl7CisJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSxTU0xfUl9VTkFCTEVfVE9fREVDT0RFX0RIX0NFUlRTKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmIChzLT5zMy0+dG1wLmRoID09IE5VTEwpCisJCQkJeworCQkJCWFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSxTU0xfUl9NSVNTSU5HX1RNUF9ESF9LRVkpOworCQkJCWdvdG8gZl9lcnI7CisJCQkJfQorCQkJZWxzZQorCQkJCWRoX3NydnI9cy0+czMtPnRtcC5kaDsKKwkJCX0KKworCQlwdWI9Qk5fYmluMmJuKHAsaSxOVUxMKTsKKwkJaWYgKHB1YiA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsU1NMX1JfQk5fTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWk9REhfY29tcHV0ZV9rZXkocCxwdWIsZGhfc3J2cik7CisKKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLEVSUl9SX0RIX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlESF9mcmVlKHMtPnMzLT50bXAuZGgpOworCQlzLT5zMy0+dG1wLmRoPU5VTEw7CisKKwkJQk5fY2xlYXJfZnJlZShwdWIpOworCQlwdWI9TlVMTDsKKwkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg9CisJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KHMsCisJCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSxwLGkpOworCQlPUEVOU1NMX2NsZWFuc2UocCxpKTsKKwkJfQorCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwlpZiAoYWxnX2sgJiBTU0xfa0tSQjUpCisJCXsKKwkJa3JiNV9lcnJvcl9jb2RlCQlrcmI1cmM7CisJCWtyYjVfZGF0YQkJZW5jX3RpY2tldDsKKwkJa3JiNV9kYXRhCQlhdXRoZW50aWNhdG9yOworCQlrcmI1X2RhdGEJCWVuY19wbXM7CisJCUtTU0xfQ1RYCQkqa3NzbF9jdHggPSBzLT5rc3NsX2N0eDsKKwkJRVZQX0NJUEhFUl9DVFgJCWNpcGhfY3R4OworCQljb25zdCBFVlBfQ0lQSEVSCSplbmMgPSBOVUxMOworCQl1bnNpZ25lZCBjaGFyCQlpdltFVlBfTUFYX0lWX0xFTkdUSF07CisJCXVuc2lnbmVkIGNoYXIJCXBtc1tTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RICisJCQkJCSAgICAgICArIEVWUF9NQVhfQkxPQ0tfTEVOR1RIXTsKKwkJaW50CQkgICAgIHBhZGwsIG91dGw7CisJCWtyYjVfdGltZXN0YW1wCQlhdXRodGltZSA9IDA7CisJCWtyYjVfdGlja2V0X3RpbWVzCXR0aW1lczsKKworCQlFVlBfQ0lQSEVSX0NUWF9pbml0KCZjaXBoX2N0eCk7CisKKwkJaWYgKCFrc3NsX2N0eCkgIGtzc2xfY3R4ID0ga3NzbF9jdHhfbmV3KCk7CisKKwkJbjJzKHAsaSk7CisJCWVuY190aWNrZXQubGVuZ3RoID0gaTsKKworCQlpZiAobiA8IChsb25nKShlbmNfdGlja2V0Lmxlbmd0aCArIDYpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJZW5jX3RpY2tldC5kYXRhID0gKGNoYXIgKilwOworCQlwKz1lbmNfdGlja2V0Lmxlbmd0aDsKKworCQluMnMocCxpKTsKKwkJYXV0aGVudGljYXRvci5sZW5ndGggPSBpOworCisJCWlmIChuIDwgKGxvbmcpKGVuY190aWNrZXQubGVuZ3RoICsgYXV0aGVudGljYXRvci5sZW5ndGggKyA2KSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCVNTTF9SX0RBVEFfTEVOR1RIX1RPT19MT05HKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWF1dGhlbnRpY2F0b3IuZGF0YSA9IChjaGFyICopcDsKKwkJcCs9YXV0aGVudGljYXRvci5sZW5ndGg7CisKKwkJbjJzKHAsaSk7CisJCWVuY19wbXMubGVuZ3RoID0gaTsKKwkJZW5jX3Btcy5kYXRhID0gKGNoYXIgKilwOworCQlwKz1lbmNfcG1zLmxlbmd0aDsKKworCQkvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCBpcyBjaGVja2VkIGFnYWluIGJlbG93LAorCQkqKiBhZnRlciBkZWNyeXB0aW9uCisJCSovCisJCWlmKGVuY19wbXMubGVuZ3RoID4gc2l6ZW9mIHBtcykKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJICAgICAgIFNTTF9SX0RBVEFfTEVOR1RIX1RPT19MT05HKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmIChuICE9IChsb25nKShlbmNfdGlja2V0Lmxlbmd0aCArIGF1dGhlbnRpY2F0b3IubGVuZ3RoICsKKwkJCQkJCWVuY19wbXMubGVuZ3RoICsgNikpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQlTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlpZiAoKGtyYjVyYyA9IGtzc2xfc2dldF90a3Qoa3NzbF9jdHgsICZlbmNfdGlja2V0LCAmdHRpbWVzLAorCQkJCQkma3NzbF9lcnIpKSAhPSAwKQorCQkJeworI2lmZGVmIEtTU0xfREVCVUcKKwkJCXByaW50Zigia3NzbF9zZ2V0X3RrdCBydG4gJWQgWyVkXVxuIiwKKwkJCQlrcmI1cmMsIGtzc2xfZXJyLnJlYXNvbik7CisJCQlpZiAoa3NzbF9lcnIudGV4dCkKKwkJCQlwcmludGYoImtzc2xfZXJyIHRleHQ9ICVzXG4iLCBrc3NsX2Vyci50ZXh0KTsKKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQlrc3NsX2Vyci5yZWFzb24pOworCQkJZ290byBlcnI7CisJCQl9CisKKwkJLyogIE5vdGU6IG5vIGF1dGhlbnRpY2F0b3IgaXMgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IsCisJCSoqICBidXQgd2lsbCByZXR1cm4gYXV0aHRpbWUgPT0gMC4KKwkJKi8KKwkJaWYgKChrcmI1cmMgPSBrc3NsX2NoZWNrX2F1dGhlbnQoa3NzbF9jdHgsICZhdXRoZW50aWNhdG9yLAorCQkJCQkmYXV0aHRpbWUsICZrc3NsX2VycikpICE9IDApCisJCQl7CisjaWZkZWYgS1NTTF9ERUJVRworCQkJcHJpbnRmKCJrc3NsX2NoZWNrX2F1dGhlbnQgcnRuICVkIFslZF1cbiIsCisJCQkJa3JiNXJjLCBrc3NsX2Vyci5yZWFzb24pOworCQkJaWYgKGtzc2xfZXJyLnRleHQpCisJCQkJcHJpbnRmKCJrc3NsX2VyciB0ZXh0PSAlc1xuIiwga3NzbF9lcnIudGV4dCk7CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJa3NzbF9lcnIucmVhc29uKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCWlmICgoa3JiNXJjID0ga3NzbF92YWxpZGF0ZV90aW1lcyhhdXRodGltZSwgJnR0aW1lcykpICE9IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwga3JiNXJjKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisjaWZkZWYgS1NTTF9ERUJVRworCQlrc3NsX2N0eF9zaG93KGtzc2xfY3R4KTsKKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisKKwkJZW5jID0ga3NzbF9tYXBfZW5jKGtzc2xfY3R4LT5lbmN0eXBlKTsKKwkJaWYgKGVuYyA9PSBOVUxMKQorCQkgICAgZ290byBlcnI7CisKKwkJbWVtc2V0KGl2LCAwLCBzaXplb2YgaXYpOwkvKiBwZXIgUkZDIDE1MTAgKi8KKworCQlpZiAoIUVWUF9EZWNyeXB0SW5pdF9leCgmY2lwaF9jdHgsZW5jLE5VTEwsa3NzbF9jdHgtPmtleSxpdikpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQlTU0xfUl9ERUNSWVBUSU9OX0ZBSUxFRCk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKCFFVlBfRGVjcnlwdFVwZGF0ZSgmY2lwaF9jdHgsIHBtcywmb3V0bCwKKwkJCQkJKHVuc2lnbmVkIGNoYXIgKillbmNfcG1zLmRhdGEsIGVuY19wbXMubGVuZ3RoKSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCVNTTF9SX0RFQ1JZUFRJT05fRkFJTEVEKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZiAob3V0bCA+IFNTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEgpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQlTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWYgKCFFVlBfRGVjcnlwdEZpbmFsX2V4KCZjaXBoX2N0eCwmKHBtc1tvdXRsXSksJnBhZGwpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJU1NMX1JfREVDUllQVElPTl9GQUlMRUQpOworCQkJZ290byBlcnI7CisJCQl9CisJCW91dGwgKz0gcGFkbDsKKwkJaWYgKG91dGwgPiBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RIKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmICghKChwbXNbMF0gPT0gKHMtPmNsaWVudF92ZXJzaW9uPj44KSkgJiYgKHBtc1sxXSA9PSAocy0+Y2xpZW50X3ZlcnNpb24gJiAweGZmKSkpKQorCQkgICAgeworCQkgICAgLyogVGhlIHByZW1hc3RlciBzZWNyZXQgbXVzdCBjb250YWluIHRoZSBzYW1lIHZlcnNpb24gbnVtYmVyIGFzIHRoZQorCQkgICAgICogQ2xpZW50SGVsbG8gdG8gZGV0ZWN0IHZlcnNpb24gcm9sbGJhY2sgYXR0YWNrcyAoc3RyYW5nZWx5LCB0aGUKKwkJICAgICAqIHByb3RvY29sIGRvZXMgbm90IG9mZmVyIHN1Y2ggcHJvdGVjdGlvbiBmb3IgREggY2lwaGVyc3VpdGVzKS4KKwkJICAgICAqIEhvd2V2ZXIsIGJ1Z2d5IGNsaWVudHMgZXhpc3QgdGhhdCBzZW5kIHJhbmRvbSBieXRlcyBpbnN0ZWFkIG9mCisJCSAgICAgKiB0aGUgcHJvdG9jb2wgdmVyc2lvbi4KKwkJICAgICAqIElmIFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHIGlzIHNldCwgdG9sZXJhdGUgc3VjaCBjbGllbnRzLiAKKwkJICAgICAqIChQZXJoYXBzIHdlIHNob3VsZCBoYXZlIGEgc2VwYXJhdGUgQlVHIHZhbHVlIGZvciB0aGUgS2VyYmVyb3MgY2lwaGVyKQorCQkgICAgICovCisJCSAgICBpZiAoIShzLT5vcHRpb25zICYgU1NMX09QX1RMU19ST0xMQkFDS19CVUcpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkgICAgICAgU1NMX0FEX0RFQ09ERV9FUlJPUik7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJICAgIH0KKworCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZjaXBoX2N0eCk7CisKKwkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg9CisJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KHMsCisJCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSwgcG1zLCBvdXRsKTsKKworCQlpZiAoa3NzbF9jdHgtPmNsaWVudF9wcmluYykKKwkJCXsKKwkJCXNpemVfdCBsZW4gPSBzdHJsZW4oa3NzbF9jdHgtPmNsaWVudF9wcmluYyk7CisJCQlpZiAoIGxlbiA8IFNTTF9NQVhfS1JCNV9QUklOQ0lQQUxfTEVOR1RIICkgCisJCQkJeworCQkJCXMtPnNlc3Npb24tPmtyYjVfY2xpZW50X3ByaW5jX2xlbiA9IGxlbjsKKwkJCQltZW1jcHkocy0+c2Vzc2lvbi0+a3JiNV9jbGllbnRfcHJpbmMsa3NzbF9jdHgtPmNsaWVudF9wcmluYyxsZW4pOworCQkJCX0KKwkJCX0KKworCisJCS8qICBXYXMgZG9pbmcga3NzbF9jdHhfZnJlZSgpIGhlcmUsCisJCSoqICBidXQgaXQgY2F1c2VkIHByb2JsZW1zIGZvciBhcGFjaGUuCisJCSoqICBrc3NsX2N0eCA9IGtzc2xfY3R4X2ZyZWUoa3NzbF9jdHgpOworCQkqKiAgaWYgKHMtPmtzc2xfY3R4KSAgcy0+a3NzbF9jdHggPSBOVUxMOworCQkqLworCQl9CisJZWxzZQorI2VuZGlmCS8qIE9QRU5TU0xfTk9fS1JCNSAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCQlpZiAoYWxnX2sgJiAoU1NMX2tFRUNESHxTU0xfa0VDREhyfFNTTF9rRUNESGUpKQorCQl7CisJCWludCByZXQgPSAxOworCQlpbnQgZmllbGRfc2l6ZSA9IDA7CisJCWNvbnN0IEVDX0tFWSAgICp0a2V5OworCQljb25zdCBFQ19HUk9VUCAqZ3JvdXA7CisJCWNvbnN0IEJJR05VTSAqcHJpdl9rZXk7CisKKwkJLyogaW5pdGlhbGl6ZSBzdHJ1Y3R1cmVzIGZvciBzZXJ2ZXIncyBFQ0RIIGtleSBwYWlyICovCisJCWlmICgoc3J2cl9lY2RoID0gRUNfS0VZX25ldygpKSA9PSBOVUxMKSAKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJICAgIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCisJCS8qIExldCdzIGdldCBzZXJ2ZXIgcHJpdmF0ZSBrZXkgYW5kIGdyb3VwIGluZm9ybWF0aW9uICovCisJCWlmIChhbGdfayAmIChTU0xfa0VDREhyfFNTTF9rRUNESGUpKQorCQkJeyAKKwkJCS8qIHVzZSB0aGUgY2VydGlmaWNhdGUgKi8KKwkJCXRrZXkgPSBzLT5jZXJ0LT5wa2V5c1tTU0xfUEtFWV9FQ0NdLnByaXZhdGVrZXktPnBrZXkuZWM7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCS8qIHVzZSB0aGUgZXBoZXJtZXJhbCB2YWx1ZXMgd2Ugc2F2ZWQgd2hlbgorCQkJICogZ2VuZXJhdGluZyB0aGUgU2VydmVyS2V5RXhjaGFuZ2UgbXNnLgorCQkJICovCisJCQl0a2V5ID0gcy0+czMtPnRtcC5lY2RoOworCQkJfQorCisJCWdyb3VwICAgID0gRUNfS0VZX2dldDBfZ3JvdXAodGtleSk7CisJCXByaXZfa2V5ID0gRUNfS0VZX2dldDBfcHJpdmF0ZV9rZXkodGtleSk7CisKKwkJaWYgKCFFQ19LRVlfc2V0X2dyb3VwKHNydnJfZWNkaCwgZ3JvdXApIHx8CisJCSAgICAhRUNfS0VZX3NldF9wcml2YXRlX2tleShzcnZyX2VjZGgsIHByaXZfa2V5KSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJICAgICAgIEVSUl9SX0VDX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQkvKiBMZXQncyBnZXQgY2xpZW50J3MgcHVibGljIGtleSAqLworCQlpZiAoKGNsbnRfZWNwb2ludCA9IEVDX1BPSU5UX25ldyhncm91cCkpID09IE5VTEwpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCSAgICBFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlpZiAobiA9PSAwTCkgCisJCQl7CisJCQkvKiBDbGllbnQgUHVibGlja2V5IHdhcyBpbiBDbGllbnQgQ2VydGlmaWNhdGUgKi8KKworCQkJIGlmIChhbGdfayAmIFNTTF9rRUVDREgpCisJCQkJIHsKKwkJCQkgYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJCSBTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSxTU0xfUl9NSVNTSU5HX1RNUF9FQ0RIX0tFWSk7CisJCQkJIGdvdG8gZl9lcnI7CisJCQkJIH0KKwkJCWlmICgoKGNsbnRfcHViX3BrZXk9WDUwOV9nZXRfcHVia2V5KHMtPnNlc3Npb24tPnBlZXIpKQorCQkJICAgID09IE5VTEwpIHx8IAorCQkJICAgIChjbG50X3B1Yl9wa2V5LT50eXBlICE9IEVWUF9QS0VZX0VDKSkKKwkJCQl7CisJCQkJLyogWFhYOiBGb3Igbm93LCB3ZSBkbyBub3Qgc3VwcG9ydCBjbGllbnQKKwkJCQkgKiBhdXRoZW50aWNhdGlvbiB1c2luZyBFQ0RIIGNlcnRpZmljYXRlcworCQkJCSAqIHNvIHRoaXMgYnJhbmNoIChuID09IDBMKSBvZiB0aGUgY29kZSBpcworCQkJCSAqIG5ldmVyIGV4ZWN1dGVkLiBXaGVuIHRoYXQgc3VwcG9ydCBpcworCQkJCSAqIGFkZGVkLCB3ZSBvdWdodCB0byBlbnN1cmUgdGhlIGtleSAKKwkJCQkgKiByZWNlaXZlZCBpbiB0aGUgY2VydGlmaWNhdGUgaXMgCisJCQkJICogYXV0aG9yaXplZCBmb3Iga2V5IGFncmVlbWVudC4KKwkJCQkgKiBFQ0RIX2NvbXB1dGVfa2V5IGltcGxpY2l0bHkgY2hlY2tzIHRoYXQKKwkJCQkgKiB0aGUgdHdvIEVDREggc2hhcmVzIGFyZSBmb3IgdGhlIHNhbWUKKwkJCQkgKiBncm91cC4KKwkJCQkgKi8KKwkJCSAgIAlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQkgICAJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJICAgIFNTTF9SX1VOQUJMRV9UT19ERUNPREVfRUNESF9DRVJUUyk7CisJCQkgICAJZ290byBmX2VycjsKKwkJCSAgIAl9CisKKwkJCWlmIChFQ19QT0lOVF9jb3B5KGNsbnRfZWNwb2ludCwKKwkJCSAgICBFQ19LRVlfZ2V0MF9wdWJsaWNfa2V5KGNsbnRfcHViX3BrZXktPnBrZXkuZWMpKSA9PSAwKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJRVJSX1JfRUNfTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlyZXQgPSAyOyAvKiBTa2lwIGNlcnRpZmljYXRlIHZlcmlmeSBwcm9jZXNzaW5nICovCisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCS8qIEdldCBjbGllbnQncyBwdWJsaWMga2V5IGZyb20gZW5jb2RlZCBwb2ludAorCQkJICogaW4gdGhlIENsaWVudEtleUV4Y2hhbmdlIG1lc3NhZ2UuCisJCQkgKi8KKwkJCWlmICgoYm5fY3R4ID0gQk5fQ1RYX25ldygpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkgICAgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKworCQkJLyogR2V0IGVuY29kZWQgcG9pbnQgbGVuZ3RoICovCisJCQlpID0gKnA7IAorCQkJcCArPSAxOworCQkJaWYgKEVDX1BPSU5UX29jdDJwb2ludChncm91cCwgCisJCQkgICAgY2xudF9lY3BvaW50LCBwLCBpLCBibl9jdHgpID09IDApCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCSAgICBFUlJfUl9FQ19MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCS8qIHAgaXMgcG9pbnRpbmcgdG8gc29tZXdoZXJlIGluIHRoZSBidWZmZXIKKwkJCSAqIGN1cnJlbnRseSwgc28gc2V0IGl0IHRvIHRoZSBzdGFydCAKKwkJCSAqLyAKKwkJCXA9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKwkJCX0KKworCQkvKiBDb21wdXRlIHRoZSBzaGFyZWQgcHJlLW1hc3RlciBzZWNyZXQgKi8KKwkJZmllbGRfc2l6ZSA9IEVDX0dST1VQX2dldF9kZWdyZWUoZ3JvdXApOworCQlpZiAoZmllbGRfc2l6ZSA8PSAwKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsIAorCQkJICAgICAgIEVSUl9SX0VDREhfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpID0gRUNESF9jb21wdXRlX2tleShwLCAoZmllbGRfc2l6ZSs3KS84LCBjbG50X2VjcG9pbnQsIHNydnJfZWNkaCwgTlVMTCk7CisJCWlmIChpIDw9IDApCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCSAgICBFUlJfUl9FQ0RIX0xJQik7CisJCQlnb3RvIGVycjsKKwkJCX0KKworCQlFVlBfUEtFWV9mcmVlKGNsbnRfcHViX3BrZXkpOworCQlFQ19QT0lOVF9mcmVlKGNsbnRfZWNwb2ludCk7CisJCUVDX0tFWV9mcmVlKHNydnJfZWNkaCk7CisJCUJOX0NUWF9mcmVlKGJuX2N0eCk7CisJCUVDX0tFWV9mcmVlKHMtPnMzLT50bXAuZWNkaCk7CisJCXMtPnMzLT50bXAuZWNkaCA9IE5VTEw7IAorCisJCS8qIENvbXB1dGUgdGhlIG1hc3RlciBzZWNyZXQgKi8KKwkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGggPSBzLT5tZXRob2QtPnNzbDNfZW5jLT4gXAorCQkgICAgZ2VuZXJhdGVfbWFzdGVyX3NlY3JldChzLCBzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LCBwLCBpKTsKKwkJCisJCU9QRU5TU0xfY2xlYW5zZShwLCBpKTsKKwkJcmV0dXJuIChyZXQpOworCQl9CisJZWxzZQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJCWlmIChhbGdfayAmIFNTTF9rUFNLKQorCQkJeworCQkJdW5zaWduZWQgY2hhciAqdCA9IE5VTEw7CisJCQl1bnNpZ25lZCBjaGFyIHBza19vcl9wcmVfbXNbUFNLX01BWF9QU0tfTEVOKjIrNF07CisJCQl1bnNpZ25lZCBpbnQgcHJlX21zX2xlbiA9IDAsIHBza19sZW4gPSAwOworCQkJaW50IHBza19lcnIgPSAxOworCQkJY2hhciB0bXBfaWRbUFNLX01BWF9JREVOVElUWV9MRU4rMV07CisKKwkJCWFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKworCQkJbjJzKHAsaSk7CisJCQlpZiAobiAhPSBpKzIpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCQlTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOworCQkJCWdvdG8gcHNrX2VycjsKKwkJCQl9CisJCQlpZiAoaSA+IFBTS19NQVhfSURFTlRJVFlfTEVOKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJU1NMX1JfREFUQV9MRU5HVEhfVE9PX0xPTkcpOworCQkJCWdvdG8gcHNrX2VycjsKKwkJCQl9CisJCQlpZiAocy0+cHNrX3NlcnZlcl9jYWxsYmFjayA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkgICAgICAgU1NMX1JfUFNLX05PX1NFUlZFUl9DQik7CisJCQkJZ290byBwc2tfZXJyOworCQkJCX0KKworCQkJLyogQ3JlYXRlIGd1YXJhbnRlZWQgTlVMTC10ZXJtaW5hdGVkIGlkZW50aXR5CisJCQkgKiBzdHJpbmcgZm9yIHRoZSBjYWxsYmFjayAqLworCQkJbWVtY3B5KHRtcF9pZCwgcCwgaSk7CisJCQltZW1zZXQodG1wX2lkK2ksIDAsIFBTS19NQVhfSURFTlRJVFlfTEVOKzEtaSk7CisJCQlwc2tfbGVuID0gcy0+cHNrX3NlcnZlcl9jYWxsYmFjayhzLCB0bXBfaWQsCisJCQkJcHNrX29yX3ByZV9tcywgc2l6ZW9mKHBza19vcl9wcmVfbXMpKTsKKwkJCU9QRU5TU0xfY2xlYW5zZSh0bXBfaWQsIFBTS19NQVhfSURFTlRJVFlfTEVOKzEpOworCisJCQlpZiAocHNrX2xlbiA+IFBTS19NQVhfUFNLX0xFTikKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJCUVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCQlnb3RvIHBza19lcnI7CisJCQkJfQorCQkJZWxzZSBpZiAocHNrX2xlbiA9PSAwKQorCQkJCXsKKwkJCQkvKiBQU0sgcmVsYXRlZCB0byB0aGUgZ2l2ZW4gaWRlbnRpdHkgbm90IGZvdW5kICovCisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJICAgICAgIFNTTF9SX1BTS19JREVOVElUWV9OT1RfRk9VTkQpOworCQkJCWFsPVNTTF9BRF9VTktOT1dOX1BTS19JREVOVElUWTsKKwkJCQlnb3RvIHBza19lcnI7CisJCQkJfQorCisJCQkvKiBjcmVhdGUgUFNLIHByZV9tYXN0ZXJfc2VjcmV0ICovCisJCQlwcmVfbXNfbGVuPTIrcHNrX2xlbisyK3Bza19sZW47CisJCQl0ID0gcHNrX29yX3ByZV9tczsKKwkJCW1lbW1vdmUocHNrX29yX3ByZV9tcytwc2tfbGVuKzQsIHBza19vcl9wcmVfbXMsIHBza19sZW4pOworCQkJczJuKHBza19sZW4sIHQpOworCQkJbWVtc2V0KHQsIDAsIHBza19sZW4pOworCQkJdCs9cHNrX2xlbjsKKwkJCXMybihwc2tfbGVuLCB0KTsKKworCQkJaWYgKHMtPnNlc3Npb24tPnBza19pZGVudGl0eSAhPSBOVUxMKQorCQkJCU9QRU5TU0xfZnJlZShzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHkpOworCQkJcy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5ID0gQlVGX3N0cmR1cCgoY2hhciAqKXApOworCQkJaWYgKHMtPnNlc3Npb24tPnBza19pZGVudGl0eSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSwKKwkJCQkJRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gcHNrX2VycjsKKwkJCQl9CisKKwkJCWlmIChzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHlfaGludCAhPSBOVUxMKQorCQkJCU9QRU5TU0xfZnJlZShzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHlfaGludCk7CisJCQlzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHlfaGludCA9IEJVRl9zdHJkdXAocy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCk7CisJCQlpZiAocy0+Y3R4LT5wc2tfaWRlbnRpdHlfaGludCAhPSBOVUxMICYmCisJCQkJcy0+c2Vzc2lvbi0+cHNrX2lkZW50aXR5X2hpbnQgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9LRVlfRVhDSEFOR0UsCisJCQkJCUVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlnb3RvIHBza19lcnI7CisJCQkJfQorCisJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aD0KKwkJCQlzLT5tZXRob2QtPnNzbDNfZW5jLT5nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KHMsCisJCQkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXksIHBza19vcl9wcmVfbXMsIHByZV9tc19sZW4pOworCQkJcHNrX2VyciA9IDA7CisJCXBza19lcnI6CisJCQlPUEVOU1NMX2NsZWFuc2UocHNrX29yX3ByZV9tcywgc2l6ZW9mKHBza19vcl9wcmVfbXMpKTsKKwkJCWlmIChwc2tfZXJyICE9IDApCisJCQkJZ290byBmX2VycjsKKwkJCX0KKwkJZWxzZQorI2VuZGlmCisJCWlmIChhbGdfayAmIFNTTF9rR09TVCkgCisJCQl7CisJCQlpbnQgcmV0ID0gMDsKKwkJCUVWUF9QS0VZX0NUWCAqcGtleV9jdHg7CisJCQlFVlBfUEtFWSAqY2xpZW50X3B1Yl9wa2V5ID0gTlVMTDsKKwkJCXVuc2lnbmVkIGNoYXIgcHJlbWFzdGVyX3NlY3JldFszMl0sICpzdGFydDsKKwkJCXNpemVfdCBvdXRsZW49MzIsIGlubGVuOwkJCQorCisJCQkvKiBHZXQgb3VyIGNlcnRpZmljYXRlIHByaXZhdGUga2V5Ki8KKwkJCXBrZXlfY3R4ID0gRVZQX1BLRVlfQ1RYX25ldyhzLT5jZXJ0LT5rZXktPnByaXZhdGVrZXksTlVMTCk7CQorCQkJRVZQX1BLRVlfZGVjcnlwdF9pbml0KHBrZXlfY3R4KTsKKwkJCS8qIElmIGNsaWVudCBjZXJ0aWZpY2F0ZSBpcyBwcmVzZW50IGFuZCBpcyBvZiB0aGUgc2FtZSB0eXBlLCBtYXliZQorCQkJICogdXNlIGl0IGZvciBrZXkgZXhjaGFuZ2UuICBEb24ndCBtaW5kIGVycm9ycyBmcm9tCisJCQkgKiBFVlBfUEtFWV9kZXJpdmVfc2V0X3BlZXIsIGJlY2F1c2UgaXQgaXMgY29tcGxldGVseSB2YWxpZCB0byB1c2UKKwkJCSAqIGEgY2xpZW50IGNlcnRpZmljYXRlIGZvciBhdXRob3JpemF0aW9uIG9ubHkuICovCisJCQljbGllbnRfcHViX3BrZXkgPSBYNTA5X2dldF9wdWJrZXkocy0+c2Vzc2lvbi0+cGVlcik7CisJCQlpZiAoY2xpZW50X3B1Yl9wa2V5KQorCQkJCXsKKwkJCQlpZiAoRVZQX1BLRVlfZGVyaXZlX3NldF9wZWVyKHBrZXlfY3R4LCBjbGllbnRfcHViX3BrZXkpIDw9IDApCisJCQkJCUVSUl9jbGVhcl9lcnJvcigpOworCQkJCX0KKwkJCS8qIERlY3J5cHQgc2Vzc2lvbiBrZXkgKi8KKwkJCWlmICgoKnAhPSggVl9BU04xX1NFUVVFTkNFfCBWX0FTTjFfQ09OU1RSVUNURUQpKSkgCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLFNTTF9SX0RFQ1JZUFRJT05fRkFJTEVEKTsKKwkJCQlnb3RvIGdlcnI7CisJCQkJfQorCQkJaWYgKHBbMV0gPT0gMHg4MSkKKwkJCQl7CisJCQkJc3RhcnQgPSBwKzM7CisJCQkJaW5sZW4gPSBwWzJdOworCQkJCX0KKwkJCWVsc2UgaWYgKHBbMV0gPCAweDgwKQorCQkJCXsKKwkJCQlzdGFydCA9IHArMjsKKwkJCQlpbmxlbiA9IHBbMV07CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSxTU0xfUl9ERUNSWVBUSU9OX0ZBSUxFRCk7CisJCQkJZ290byBnZXJyOworCQkJCX0KKwkJCWlmIChFVlBfUEtFWV9kZWNyeXB0KHBrZXlfY3R4LHByZW1hc3Rlcl9zZWNyZXQsJm91dGxlbixzdGFydCxpbmxlbikgPD0wKSAKKworCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSxTU0xfUl9ERUNSWVBUSU9OX0ZBSUxFRCk7CisJCQkJZ290byBnZXJyOworCQkJCX0KKwkJCS8qIEdlbmVyYXRlIG1hc3RlciBzZWNyZXQgKi8KKwkJCXMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoPQorCQkJCXMtPm1ldGhvZC0+c3NsM19lbmMtPmdlbmVyYXRlX21hc3Rlcl9zZWNyZXQocywKKwkJCQkJcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSxwcmVtYXN0ZXJfc2VjcmV0LDMyKTsKKwkJCS8qIENoZWNrIGlmIHB1YmtleSBmcm9tIGNsaWVudCBjZXJ0aWZpY2F0ZSB3YXMgdXNlZCAqLworCQkJaWYgKEVWUF9QS0VZX0NUWF9jdHJsKHBrZXlfY3R4LCAtMSwgLTEsIEVWUF9QS0VZX0NUUkxfUEVFUl9LRVksIDIsIE5VTEwpID4gMCkKKwkJCQlyZXQgPSAyOworCQkJZWxzZQorCQkJCXJldCA9IDE7CisJCWdlcnI6CisJCQlFVlBfUEtFWV9mcmVlKGNsaWVudF9wdWJfcGtleSk7CisJCQlFVlBfUEtFWV9DVFhfZnJlZShwa2V5X2N0eCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQllbHNlCisJCQkJZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJeworCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFLAorCQkJCVNTTF9SX1VOS05PV05fQ0lQSEVSX1RZUEUpOworCQlnb3RvIGZfZXJyOworCQl9CisKKwlyZXR1cm4oMSk7CitmX2VycjoKKwlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLGFsKTsKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX0RIKSB8fCAhZGVmaW5lZChPUEVOU1NMX05PX1JTQSkgfHwgIWRlZmluZWQoT1BFTlNTTF9OT19FQ0RIKQorZXJyOgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCUVWUF9QS0VZX2ZyZWUoY2xudF9wdWJfcGtleSk7CisJRUNfUE9JTlRfZnJlZShjbG50X2VjcG9pbnQpOworCWlmIChzcnZyX2VjZGggIT0gTlVMTCkgCisJCUVDX0tFWV9mcmVlKHNydnJfZWNkaCk7CisJQk5fQ1RYX2ZyZWUoYm5fY3R4KTsKKyNlbmRpZgorCXJldHVybigtMSk7CisJfQorCitpbnQgc3NsM19nZXRfY2VydF92ZXJpZnkoU1NMICpzKQorCXsKKwlFVlBfUEtFWSAqcGtleT1OVUxMOworCXVuc2lnbmVkIGNoYXIgKnA7CisJaW50IGFsLG9rLHJldD0wOworCWxvbmcgbjsKKwlpbnQgdHlwZT0wLGksajsKKwlYNTA5ICpwZWVyOworCisJbj1zLT5tZXRob2QtPnNzbF9nZXRfbWVzc2FnZShzLAorCQlTU0wzX1NUX1NSX0NFUlRfVlJGWV9BLAorCQlTU0wzX1NUX1NSX0NFUlRfVlJGWV9CLAorCQktMSwKKwkJNTE0LCAvKiA1MTQ/ICovCisJCSZvayk7CisKKwlpZiAoIW9rKSByZXR1cm4oKGludCluKTsKKworCWlmIChzLT5zZXNzaW9uLT5wZWVyICE9IE5VTEwpCisJCXsKKwkJcGVlcj1zLT5zZXNzaW9uLT5wZWVyOworCQlwa2V5PVg1MDlfZ2V0X3B1YmtleShwZWVyKTsKKwkJdHlwZT1YNTA5X2NlcnRpZmljYXRlX3R5cGUocGVlcixwa2V5KTsKKwkJfQorCWVsc2UKKwkJeworCQlwZWVyPU5VTEw7CisJCXBrZXk9TlVMTDsKKwkJfQorCisJaWYgKHMtPnMzLT50bXAubWVzc2FnZV90eXBlICE9IFNTTDNfTVRfQ0VSVElGSUNBVEVfVkVSSUZZKQorCQl7CisJCXMtPnMzLT50bXAucmV1c2VfbWVzc2FnZT0xOworCQlpZiAoKHBlZXIgIT0gTlVMTCkgJiYgKHR5cGUgfCBFVlBfUEtUX1NJR04pKQorCQkJeworCQkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DRVJUX1ZFUklGWSxTU0xfUl9NSVNTSU5HX1ZFUklGWV9NRVNTQUdFKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCXJldD0xOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKHBlZXIgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9WRVJJRlksU1NMX1JfTk9fQ0xJRU5UX0NFUlRfUkVDRUlWRUQpOworCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQlnb3RvIGZfZXJyOworCQl9CisKKwlpZiAoISh0eXBlICYgRVZQX1BLVF9TSUdOKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9WRVJJRlksU1NMX1JfU0lHTkFUVVJFX0ZPUl9OT05fU0lHTklOR19DRVJUSUZJQ0FURSk7CisJCWFsPVNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKwkJZ290byBmX2VycjsKKwkJfQorCisJaWYgKHMtPnMzLT5jaGFuZ2VfY2lwaGVyX3NwZWMpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfVkVSSUZZLFNTTF9SX0NDU19SRUNFSVZFRF9FQVJMWSk7CisJCWFsPVNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U7CisJCWdvdG8gZl9lcnI7CisJCX0KKworCS8qIHdlIG5vdyBoYXZlIGEgc2lnbmF0dXJlIHRoYXQgd2UgbmVlZCB0byB2ZXJpZnkgKi8KKwlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9tc2c7CisJLyogQ2hlY2sgZm9yIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnMgb2YgR09TVCBjaXBoZXJzdWl0ZXMgKi8KKwkvKiBJZiBrZXkgaXMgR09TVCBhbmQgbiBpcyBleGFjdGx5IDY0LCBpdCBpcyBiYXJlCisJICogc2lnbmF0dXJlIHdpdGhvdXQgbGVuZ3RoIGZpZWxkICovCisJaWYgKG49PTY0ICYmIChwa2V5LT50eXBlPT1OSURfaWRfR29zdFIzNDEwXzk0IHx8CisJCXBrZXktPnR5cGUgPT0gTklEX2lkX0dvc3RSMzQxMF8yMDAxKSApCisJCXsKKwkJaT02NDsKKwkJfSAKKwllbHNlIAorCQl7CQorCQluMnMocCxpKTsKKwkJbi09MjsKKwkJaWYgKGkgPiBuKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfVkVSSUZZLFNTTF9SX0xFTkdUSF9NSVNNQVRDSCk7CisJCQlhbD1TU0xfQURfREVDT0RFX0VSUk9SOworCQkJZ290byBmX2VycjsKKwkJCX0KKyAgICAJfQorCWo9RVZQX1BLRVlfc2l6ZShwa2V5KTsKKwlpZiAoKGkgPiBqKSB8fCAobiA+IGopIHx8IChuIDw9IDApKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DRVJUX1ZFUklGWSxTU0xfUl9XUk9OR19TSUdOQVRVUkVfU0laRSk7CisJCWFsPVNTTF9BRF9ERUNPREVfRVJST1I7CisJCWdvdG8gZl9lcnI7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQSAKKwlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9SU0EpCisJCXsKKwkJaT1SU0FfdmVyaWZ5KE5JRF9tZDVfc2hhMSwgcy0+czMtPnRtcC5jZXJ0X3ZlcmlmeV9tZCwKKwkJCU1ENV9ESUdFU1RfTEVOR1RIK1NIQV9ESUdFU1RfTEVOR1RILCBwLCBpLCAKKwkJCQkJCQlwa2V5LT5wa2V5LnJzYSk7CisJCWlmIChpIDwgMCkKKwkJCXsKKwkJCWFsPVNTTF9BRF9ERUNSWVBUX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfVkVSSUZZLFNTTF9SX0JBRF9SU0FfREVDUllQVCk7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQlpZiAoaSA9PSAwKQorCQkJeworCQkJYWw9U1NMX0FEX0RFQ1JZUFRfRVJST1I7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9WRVJJRlksU1NMX1JfQkFEX1JTQV9TSUdOQVRVUkUpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJfQorCWVsc2UKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorCQlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9EU0EpCisJCXsKKwkJaj1EU0FfdmVyaWZ5KHBrZXktPnNhdmVfdHlwZSwKKwkJCSYocy0+czMtPnRtcC5jZXJ0X3ZlcmlmeV9tZFtNRDVfRElHRVNUX0xFTkdUSF0pLAorCQkJU0hBX0RJR0VTVF9MRU5HVEgscCxpLHBrZXktPnBrZXkuZHNhKTsKKwkJaWYgKGogPD0gMCkKKwkJCXsKKwkJCS8qIGJhZCBzaWduYXR1cmUgKi8KKwkJCWFsPVNTTF9BRF9ERUNSWVBUX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfVkVSSUZZLFNTTF9SX0JBRF9EU0FfU0lHTkFUVVJFKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCX0KKwllbHNlCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCQlpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9FQykKKwkJeworCQlqPUVDRFNBX3ZlcmlmeShwa2V5LT5zYXZlX3R5cGUsCisJCQkmKHMtPnMzLT50bXAuY2VydF92ZXJpZnlfbWRbTUQ1X0RJR0VTVF9MRU5HVEhdKSwKKwkJCVNIQV9ESUdFU1RfTEVOR1RILHAsaSxwa2V5LT5wa2V5LmVjKTsKKwkJaWYgKGogPD0gMCkKKwkJCXsKKwkJCS8qIGJhZCBzaWduYXR1cmUgKi8KKwkJCWFsPVNTTF9BRF9ERUNSWVBUX0VSUk9SOworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfVkVSSUZZLAorCQkJICAgIFNTTF9SX0JBRF9FQ0RTQV9TSUdOQVRVUkUpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJfQorCWVsc2UKKyNlbmRpZgorCWlmIChwa2V5LT50eXBlID09IE5JRF9pZF9Hb3N0UjM0MTBfOTQgfHwgcGtleS0+dHlwZSA9PSBOSURfaWRfR29zdFIzNDEwXzIwMDEpCisJCXsgICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVs2NF07CisJCQlpbnQgaWR4OworCQkJRVZQX1BLRVlfQ1RYICpwY3R4ID0gRVZQX1BLRVlfQ1RYX25ldyhwa2V5LE5VTEwpOworCQkJRVZQX1BLRVlfdmVyaWZ5X2luaXQocGN0eCk7CisJCQlpZiAoaSE9NjQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwiR09TVCBzaWduYXR1cmUgbGVuZ3RoIGlzICVkIixpKTsKKwkJCX0JCisJCQlmb3IgKGlkeD0wO2lkeDw2NDtpZHgrKykgeworCQkJCXNpZ25hdHVyZVs2My1pZHhdPXBbaWR4XTsKKwkJCX0JCisJCQlqPUVWUF9QS0VZX3ZlcmlmeShwY3R4LHNpZ25hdHVyZSw2NCxzLT5zMy0+dG1wLmNlcnRfdmVyaWZ5X21kLDMyKTsKKwkJCUVWUF9QS0VZX0NUWF9mcmVlKHBjdHgpOworCQkJaWYgKGo8PTApIAorCQkJCXsKKwkJCQlhbD1TU0xfQURfREVDUllQVF9FUlJPUjsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0VSVF9WRVJJRlksCisJCQkJCVNTTF9SX0JBRF9FQ0RTQV9TSUdOQVRVUkUpOworCQkJCWdvdG8gZl9lcnI7CisJCQkJfQkKKwkJfQorCWVsc2UJCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NFUlRfVkVSSUZZLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJYWw9U1NMX0FEX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFOworCQlnb3RvIGZfZXJyOworCQl9CisKKworCXJldD0xOworCWlmICgwKQorCQl7CitmX2VycjoKKwkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxhbCk7CisJCX0KK2VuZDoKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCXJldHVybihyZXQpOworCX0KKworaW50IHNzbDNfZ2V0X2NsaWVudF9jZXJ0aWZpY2F0ZShTU0wgKnMpCisJeworCWludCBpLG9rLGFsLHJldD0gLTE7CisJWDUwOSAqeD1OVUxMOworCXVuc2lnbmVkIGxvbmcgbCxuYyxsbGVuLG47CisJY29uc3QgdW5zaWduZWQgY2hhciAqcCwqcTsKKwl1bnNpZ25lZCBjaGFyICpkOworCVNUQUNLX09GKFg1MDkpICpzaz1OVUxMOworCisJbj1zLT5tZXRob2QtPnNzbF9nZXRfbWVzc2FnZShzLAorCQlTU0wzX1NUX1NSX0NFUlRfQSwKKwkJU1NMM19TVF9TUl9DRVJUX0IsCisJCS0xLAorCQlzLT5tYXhfY2VydF9saXN0LAorCQkmb2spOworCisJaWYgKCFvaykgcmV0dXJuKChpbnQpbik7CisKKwlpZgkocy0+czMtPnRtcC5tZXNzYWdlX3R5cGUgPT0gU1NMM19NVF9DTElFTlRfS0VZX0VYQ0hBTkdFKQorCQl7CisJCWlmICgJKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9QRUVSKSAmJgorCQkJKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9GQUlMX0lGX05PX1BFRVJfQ0VSVCkpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0NFUlRJRklDQVRFLFNTTF9SX1BFRVJfRElEX05PVF9SRVRVUk5fQV9DRVJUSUZJQ0FURSk7CisJCQlhbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQlnb3RvIGZfZXJyOworCQkJfQorCQkvKiBJZiB0bHMgYXNrZWQgZm9yIGEgY2xpZW50IGNlcnQsIHRoZSBjbGllbnQgbXVzdCByZXR1cm4gYSAwIGxpc3QgKi8KKwkJaWYgKChzLT52ZXJzaW9uID4gU1NMM19WRVJTSU9OKSAmJiBzLT5zMy0+dG1wLmNlcnRfcmVxdWVzdCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfQ0VSVElGSUNBVEUsU1NMX1JfVExTX1BFRVJfRElEX05PVF9SRVNQT05EX1dJVEhfQ0VSVElGSUNBVEVfTElTVCk7CisJCQlhbD1TU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJcy0+czMtPnRtcC5yZXVzZV9tZXNzYWdlPTE7CisJCXJldHVybigxKTsKKwkJfQorCisJaWYgKHMtPnMzLT50bXAubWVzc2FnZV90eXBlICE9IFNTTDNfTVRfQ0VSVElGSUNBVEUpCisJCXsKKwkJYWw9U1NMX0FEX1VORVhQRUNURURfTUVTU0FHRTsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9DRVJUSUZJQ0FURSxTU0xfUl9XUk9OR19NRVNTQUdFX1RZUEUpOworCQlnb3RvIGZfZXJyOworCQl9CisJcD1kPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9tc2c7CisKKwlpZiAoKHNrPXNrX1g1MDlfbmV3X251bGwoKSkgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0NFUlRJRklDQVRFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJZ290byBlcnI7CisJCX0KKworCW4ybDMocCxsbGVuKTsKKwlpZiAobGxlbiszICE9IG4pCisJCXsKKwkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9DRVJUSUZJQ0FURSxTU0xfUl9MRU5HVEhfTUlTTUFUQ0gpOworCQlnb3RvIGZfZXJyOworCQl9CisJZm9yIChuYz0wOyBuYzxsbGVuOyApCisJCXsKKwkJbjJsMyhwLGwpOworCQlpZiAoKGwrbmMrMykgPiBsbGVuKQorCQkJeworCQkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfQ0VSVElGSUNBVEUsU1NMX1JfQ0VSVF9MRU5HVEhfTUlTTUFUQ0gpOworCQkJZ290byBmX2VycjsKKwkJCX0KKworCQlxPXA7CisJCXg9ZDJpX1g1MDkoTlVMTCwmcCxsKTsKKwkJaWYgKHggPT0gTlVMTCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfQ0VSVElGSUNBVEUsRVJSX1JfQVNOMV9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmIChwICE9IChxK2wpKQorCQkJeworCQkJYWw9U1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfQ0VSVElGSUNBVEUsU1NMX1JfQ0VSVF9MRU5HVEhfTUlTTUFUQ0gpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJaWYgKCFza19YNTA5X3B1c2goc2sseCkpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0NFUlRJRklDQVRFLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQl4PU5VTEw7CisJCW5jKz1sKzM7CisJCX0KKworCWlmIChza19YNTA5X251bShzaykgPD0gMCkKKwkJeworCQkvKiBUTFMgZG9lcyBub3QgbWluZCAwIGNlcnRzIHJldHVybmVkICovCisJCWlmIChzLT52ZXJzaW9uID09IFNTTDNfVkVSU0lPTikKKwkJCXsKKwkJCWFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfQ0VSVElGSUNBVEUsU1NMX1JfTk9fQ0VSVElGSUNBVEVTX1JFVFVSTkVEKTsKKwkJCWdvdG8gZl9lcnI7CisJCQl9CisJCS8qIEZhaWwgZm9yIFRMUyBvbmx5IGlmIHdlIHJlcXVpcmVkIGEgY2VydGlmaWNhdGUgKi8KKwkJZWxzZSBpZiAoKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9QRUVSKSAmJgorCQkJIChzLT52ZXJpZnlfbW9kZSAmIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9DRVJUSUZJQ0FURSxTU0xfUl9QRUVSX0RJRF9OT1RfUkVUVVJOX0FfQ0VSVElGSUNBVEUpOworCQkJYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJfQorCWVsc2UKKwkJeworCQlpPXNzbF92ZXJpZnlfY2VydF9jaGFpbihzLHNrKTsKKwkJaWYgKGkgPD0gMCkKKwkJCXsKKwkJCWFsPXNzbF92ZXJpZnlfYWxhcm1fdHlwZShzLT52ZXJpZnlfcmVzdWx0KTsKKwkJCVNTTGVycihTU0xfRl9TU0wzX0dFVF9DTElFTlRfQ0VSVElGSUNBVEUsU1NMX1JfTk9fQ0VSVElGSUNBVEVfUkVUVVJORUQpOworCQkJZ290byBmX2VycjsKKwkJCX0KKwkJfQorCisJaWYgKHMtPnNlc3Npb24tPnBlZXIgIT0gTlVMTCkgLyogVGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCAqLworCQlYNTA5X2ZyZWUocy0+c2Vzc2lvbi0+cGVlcik7CisJcy0+c2Vzc2lvbi0+cGVlcj1za19YNTA5X3NoaWZ0KHNrKTsKKwlzLT5zZXNzaW9uLT52ZXJpZnlfcmVzdWx0ID0gcy0+dmVyaWZ5X3Jlc3VsdDsKKworCS8qIFdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHNlc3NfY2VydCB3aWxsIGFsd2F5cyBiZSBOVUxMCisJICogd2hlbiB3ZSBhcnJpdmUgaGVyZS4gKi8KKwlpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ID09IE5VTEwpCisJCXsKKwkJcy0+c2Vzc2lvbi0+c2Vzc19jZXJ0ID0gc3NsX3Nlc3NfY2VydF9uZXcoKTsKKwkJaWYgKHMtPnNlc3Npb24tPnNlc3NfY2VydCA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9DRVJUSUZJQ0FURSwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlpZiAocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5jZXJ0X2NoYWluICE9IE5VTEwpCisJCXNrX1g1MDlfcG9wX2ZyZWUocy0+c2Vzc2lvbi0+c2Vzc19jZXJ0LT5jZXJ0X2NoYWluLCBYNTA5X2ZyZWUpOworCXMtPnNlc3Npb24tPnNlc3NfY2VydC0+Y2VydF9jaGFpbj1zazsKKwkvKiBJbmNvbnNpc3RlbmN5IGFsZXJ0OiBjZXJ0X2NoYWluIGRvZXMgKm5vdCogaW5jbHVkZSB0aGUKKwkgKiBwZWVyJ3Mgb3duIGNlcnRpZmljYXRlLCB3aGlsZSB3ZSBkbyBpbmNsdWRlIGl0IGluIHMzX2NsbnQuYyAqLworCisJc2s9TlVMTDsKKworCXJldD0xOworCWlmICgwKQorCQl7CitmX2VycjoKKwkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxhbCk7CisJCX0KK2VycjoKKwlpZiAoeCAhPSBOVUxMKSBYNTA5X2ZyZWUoeCk7CisJaWYgKHNrICE9IE5VTEwpIHNrX1g1MDlfcG9wX2ZyZWUoc2ssWDUwOV9mcmVlKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBzc2wzX3NlbmRfc2VydmVyX2NlcnRpZmljYXRlKFNTTCAqcykKKwl7CisJdW5zaWduZWQgbG9uZyBsOworCVg1MDkgKng7CisKKwlpZiAocy0+c3RhdGUgPT0gU1NMM19TVF9TV19DRVJUX0EpCisJCXsKKwkJeD1zc2xfZ2V0X3NlcnZlcl9zZW5kX2NlcnQocyk7CisJCWlmICh4ID09IE5VTEwpCisJCQl7CisJCQkvKiBWUlM6IGFsbG93IG51bGwgY2VydCBpZiBhdXRoID09IEtSQjUgKi8KKwkJCWlmICgocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aCAhPSBTU0xfYUtSQjUpIHx8CisJCQkgICAgKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtX21rZXkgJiBTU0xfa0tSQjUpKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMM19TRU5EX1NFUlZFUl9DRVJUSUZJQ0FURSxFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJcmV0dXJuKDApOworCQkJCX0KKwkJCX0KKworCQlsPXNzbDNfb3V0cHV0X2NlcnRfY2hhaW4ocyx4KTsKKwkJcy0+c3RhdGU9U1NMM19TVF9TV19DRVJUX0I7CisJCXMtPmluaXRfbnVtPShpbnQpbDsKKwkJcy0+aW5pdF9vZmY9MDsKKwkJfQorCisJLyogU1NMM19TVF9TV19DRVJUX0IgKi8KKwlyZXR1cm4oc3NsM19kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAoraW50IHNzbDNfc2VuZF9uZXdzZXNzaW9uX3RpY2tldChTU0wgKnMpCisJeworCWlmIChzLT5zdGF0ZSA9PSBTU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0EpCisJCXsKKwkJdW5zaWduZWQgY2hhciAqcCwgKnNlbmMsICptYWNzdGFydDsKKwkJaW50IGxlbiwgc2xlbjsKKwkJdW5zaWduZWQgaW50IGhsZW47CisJCUVWUF9DSVBIRVJfQ1RYIGN0eDsKKwkJSE1BQ19DVFggaGN0eDsKKwkJU1NMX0NUWCAqdGN0eCA9IHMtPmluaXRpYWxfY3R4OworCQl1bnNpZ25lZCBjaGFyIGl2W0VWUF9NQVhfSVZfTEVOR1RIXTsKKwkJdW5zaWduZWQgY2hhciBrZXlfbmFtZVsxNl07CisKKwkJLyogZ2V0IHNlc3Npb24gZW5jb2RpbmcgbGVuZ3RoICovCisJCXNsZW4gPSBpMmRfU1NMX1NFU1NJT04ocy0+c2Vzc2lvbiwgTlVMTCk7CisJCS8qIFNvbWUgbGVuZ3RoIHZhbHVlcyBhcmUgMTYgYml0cywgc28gZm9yZ2V0IGl0IGlmIHNlc3Npb24gaXMKKyAJCSAqIHRvbyBsb25nCisgCQkgKi8KKwkJaWYgKHNsZW4gPiAweEZGMDApCisJCQlyZXR1cm4gLTE7CisJCS8qIEdyb3cgYnVmZmVyIGlmIG5lZWQgYmU6IHRoZSBsZW5ndGggY2FsY3VsYXRpb24gaXMgYXMKKyAJCSAqIGZvbGxvd3MgMSAoc2l6ZSBvZiBtZXNzYWdlIG5hbWUpICsgMyAobWVzc2FnZSBsZW5ndGgKKyAJCSAqIGJ5dGVzKSArIDQgKHRpY2tldCBsaWZldGltZSBoaW50KSArIDIgKHRpY2tldCBsZW5ndGgpICsKKyAJCSAqIDE2IChrZXkgbmFtZSkgKyBtYXhfaXZfbGVuIChpdiBsZW5ndGgpICsKKyAJCSAqIHNlc3Npb25fbGVuZ3RoICsgbWF4X2VuY19ibG9ja19zaXplIChtYXggZW5jcnlwdGVkIHNlc3Npb24KKyAJCSAqIGxlbmd0aCkgKyBtYXhfbWRfc2l6ZSAoSE1BQykuCisgCQkgKi8KKwkJaWYgKCFCVUZfTUVNX2dyb3cocy0+aW5pdF9idWYsCisJCQkyNiArIEVWUF9NQVhfSVZfTEVOR1RIICsgRVZQX01BWF9CTE9DS19MRU5HVEggKworCQkJRVZQX01BWF9NRF9TSVpFICsgc2xlbikpCisJCQlyZXR1cm4gLTE7CisJCXNlbmMgPSBPUEVOU1NMX21hbGxvYyhzbGVuKTsKKwkJaWYgKCFzZW5jKQorCQkJcmV0dXJuIC0xOworCQlwID0gc2VuYzsKKwkJaTJkX1NTTF9TRVNTSU9OKHMtPnNlc3Npb24sICZwKTsKKworCQlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGE7CisJCS8qIGRvIHRoZSBoZWFkZXIgKi8KKwkJKihwKyspPVNTTDNfTVRfTkVXU0VTU0lPTl9USUNLRVQ7CisJCS8qIFNraXAgbWVzc2FnZSBsZW5ndGggZm9yIG5vdyAqLworCQlwICs9IDM7CisJCUVWUF9DSVBIRVJfQ1RYX2luaXQoJmN0eCk7CisJCUhNQUNfQ1RYX2luaXQoJmhjdHgpOworCQkvKiBJbml0aWFsaXplIEhNQUMgYW5kIGNpcGhlciBjb250ZXh0cy4gSWYgY2FsbGJhY2sgcHJlc2VudAorCQkgKiBpdCBkb2VzIGFsbCB0aGUgd29yayBvdGhlcndpc2UgdXNlIGdlbmVyYXRlZCB2YWx1ZXMKKwkJICogZnJvbSBwYXJlbnQgY3R4LgorCQkgKi8KKwkJaWYgKHRjdHgtPnRsc2V4dF90aWNrZXRfa2V5X2NiKQorCQkJeworCQkJaWYgKHRjdHgtPnRsc2V4dF90aWNrZXRfa2V5X2NiKHMsIGtleV9uYW1lLCBpdiwgJmN0eCwKKwkJCQkJCQkgJmhjdHgsIDEpIDwgMCkKKwkJCQl7CisJCQkJT1BFTlNTTF9mcmVlKHNlbmMpOworCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCVJBTkRfcHNldWRvX2J5dGVzKGl2LCAxNik7CisJCQlFVlBfRW5jcnlwdEluaXRfZXgoJmN0eCwgRVZQX2Flc18xMjhfY2JjKCksIE5VTEwsCisJCQkJCXRjdHgtPnRsc2V4dF90aWNrX2Flc19rZXksIGl2KTsKKwkJCUhNQUNfSW5pdF9leCgmaGN0eCwgdGN0eC0+dGxzZXh0X3RpY2tfaG1hY19rZXksIDE2LAorCQkJCQl0bHNleHRfdGlja19tZCgpLCBOVUxMKTsKKwkJCW1lbWNweShrZXlfbmFtZSwgdGN0eC0+dGxzZXh0X3RpY2tfa2V5X25hbWUsIDE2KTsKKwkJCX0KKwkJbDJuKHMtPnNlc3Npb24tPnRsc2V4dF90aWNrX2xpZmV0aW1lX2hpbnQsIHApOworCQkvKiBTa2lwIHRpY2tldCBsZW5ndGggZm9yIG5vdyAqLworCQlwICs9IDI7CisJCS8qIE91dHB1dCBrZXkgbmFtZSAqLworCQltYWNzdGFydCA9IHA7CisJCW1lbWNweShwLCBrZXlfbmFtZSwgMTYpOworCQlwICs9IDE2OworCQkvKiBvdXRwdXQgSVYgKi8KKwkJbWVtY3B5KHAsIGl2LCBFVlBfQ0lQSEVSX0NUWF9pdl9sZW5ndGgoJmN0eCkpOworCQlwICs9IEVWUF9DSVBIRVJfQ1RYX2l2X2xlbmd0aCgmY3R4KTsKKwkJLyogRW5jcnlwdCBzZXNzaW9uIGRhdGEgKi8KKwkJRVZQX0VuY3J5cHRVcGRhdGUoJmN0eCwgcCwgJmxlbiwgc2VuYywgc2xlbik7CisJCXAgKz0gbGVuOworCQlFVlBfRW5jcnlwdEZpbmFsKCZjdHgsIHAsICZsZW4pOworCQlwICs9IGxlbjsKKwkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKworCQlITUFDX1VwZGF0ZSgmaGN0eCwgbWFjc3RhcnQsIHAgLSBtYWNzdGFydCk7CisJCUhNQUNfRmluYWwoJmhjdHgsIHAsICZobGVuKTsKKwkJSE1BQ19DVFhfY2xlYW51cCgmaGN0eCk7CisKKwkJcCArPSBobGVuOworCQkvKiBOb3cgd3JpdGUgb3V0IGxlbmd0aHM6IHAgcG9pbnRzIHRvIGVuZCBvZiBkYXRhIHdyaXR0ZW4gKi8KKwkJLyogVG90YWwgbGVuZ3RoICovCisJCWxlbiA9IHAgLSAodW5zaWduZWQgY2hhciAqKXMtPmluaXRfYnVmLT5kYXRhOworCQlwPSh1bnNpZ25lZCBjaGFyICopcy0+aW5pdF9idWYtPmRhdGEgKyAxOworCQlsMm4zKGxlbiAtIDQsIHApOyAvKiBNZXNzYWdlIGxlbmd0aCAqLworCQlwICs9IDQ7CisJCXMybihsZW4gLSAxMCwgcCk7ICAvKiBUaWNrZXQgbGVuZ3RoICovCisKKwkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCXMtPmluaXRfbnVtPSBsZW47CisJCXMtPnN0YXRlPVNTTDNfU1RfU1dfU0VTU0lPTl9USUNLRVRfQjsKKwkJcy0+aW5pdF9vZmY9MDsKKwkJT1BFTlNTTF9mcmVlKHNlbmMpOworCQl9CisKKwkvKiBTU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0IgKi8KKwlyZXR1cm4oc3NsM19kb193cml0ZShzLFNTTDNfUlRfSEFORFNIQUtFKSk7CisJfQorCitpbnQgc3NsM19zZW5kX2NlcnRfc3RhdHVzKFNTTCAqcykKKwl7CisJaWYgKHMtPnN0YXRlID09IFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQSkKKwkJeworCQl1bnNpZ25lZCBjaGFyICpwOworCQkvKiBHcm93IGJ1ZmZlciBpZiBuZWVkIGJlOiB0aGUgbGVuZ3RoIGNhbGN1bGF0aW9uIGlzIGFzCisgCQkgKiBmb2xsb3dzIDEgKG1lc3NhZ2UgdHlwZSkgKyAzIChtZXNzYWdlIGxlbmd0aCkgKworIAkJICogMSAob2NzcCByZXNwb25zZSB0eXBlKSArIDMgKG9jc3AgcmVzcG9uc2UgbGVuZ3RoKQorIAkJICogKyAob2NzcCByZXNwb25zZSkKKyAJCSAqLworCQlpZiAoIUJVRl9NRU1fZ3JvdyhzLT5pbml0X2J1ZiwgOCArIHMtPnRsc2V4dF9vY3NwX3Jlc3BsZW4pKQorCQkJcmV0dXJuIC0xOworCisJCXA9KHVuc2lnbmVkIGNoYXIgKilzLT5pbml0X2J1Zi0+ZGF0YTsKKworCQkvKiBkbyB0aGUgaGVhZGVyICovCisJCSoocCsrKT1TU0wzX01UX0NFUlRJRklDQVRFX1NUQVRVUzsKKwkJLyogbWVzc2FnZSBsZW5ndGggKi8KKwkJbDJuMyhzLT50bHNleHRfb2NzcF9yZXNwbGVuICsgNCwgcCk7CisJCS8qIHN0YXR1cyB0eXBlICovCisJCSoocCsrKT0gcy0+dGxzZXh0X3N0YXR1c190eXBlOworCQkvKiBsZW5ndGggb2YgT0NTUCByZXNwb25zZSAqLworCQlsMm4zKHMtPnRsc2V4dF9vY3NwX3Jlc3BsZW4sIHApOworCQkvKiBhY3R1YWwgcmVzcG9uc2UgKi8KKwkJbWVtY3B5KHAsIHMtPnRsc2V4dF9vY3NwX3Jlc3AsIHMtPnRsc2V4dF9vY3NwX3Jlc3BsZW4pOworCQkvKiBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJcy0+aW5pdF9udW0gPSA4ICsgcy0+dGxzZXh0X29jc3BfcmVzcGxlbjsKKwkJcy0+c3RhdGU9U1NMM19TVF9TV19DRVJUX1NUQVRVU19COworCQlzLT5pbml0X29mZiA9IDA7CisJCX0KKworCS8qIFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQiAqLworCXJldHVybihzc2wzX2RvX3dyaXRlKHMsU1NMM19SVF9IQU5EU0hBS0UpKTsKKwl9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zc2wtbGliLmNvbSBiL2xpYi9vcGVuc3NsL3NzbC9zc2wtbGliLmNvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWNhOWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbC1saWIuY29tCkBAIC0wLDAgKzEsMTA1NyBAQAorJCEKKyQhICBTU0wtTElCLkNPTQorJCEgIFdyaXR0ZW4gQnk6ICBSb2JlcnQgQnllcgorJCEgICAgICAgICAgICAgICBWaWNlLVByZXNpZGVudAorJCEgICAgICAgICAgICAgICBBLUNvbSBDb21wdXRpbmcsIEluYy4KKyQhICAgICAgICAgICAgICAgYnllckBtYWlsLmFsbC1uZXQubmV0CiskIQorJCEgIENoYW5nZXMgYnkgUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPgorJCEKKyQhICBUaGlzIGNvbW1hbmQgZmlsZSBjb21waWxlcyBhbmQgY3JlYXRlcyB0aGUgIlsueHh4LkVYRS5TU0xdTElCU1NMLk9MQiIgCiskISAgbGlicmFyeSBmb3IgT3BlblNTTC4gIFRoZSAieHh4IiBkZW5vdGVzIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBvZgorJCEgIEFMUEhBLCBJQTY0IG9yIFZBWC4KKyQhCiskISAgSXQgaXMgd3JpdHRlbiB0byBkZXRlY3Qgd2hhdCB0eXBlIG9mIG1hY2hpbmUgeW91IGFyZSBjb21waWxpbmcgb24KKyQhICAoaS5lLiBBTFBIQSBvciBWQVgpIGFuZCB3aGljaCAiQyIgY29tcGlsZXIgeW91IGhhdmUgKGkuZS4gVkFYQywgREVDQyAKKyQhICBvciBHTlUgQykgb3IgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIGNvbXBpbGVyIHRvIHVzZS4KKyQhCiskISAgU3BlY2lmeSB0aGUgZm9sbG93aW5nIGFzIFAxIHRvIGJ1aWxkIGp1c3QgdGhhdCBwYXJ0IG9yIEFMTCB0byBqdXN0CiskISAgYnVpbGQgZXZlcnl0aGluZy4KKyQhCiskISAgICAJCUxJQlJBUlkgICAgVG8ganVzdCBjb21waWxlIHRoZSBbLnh4eC5FWEUuU1NMXUxJQlNTTC5PTEIgTGlicmFyeS4KKyQhICAgIAkJU1NMX1RBU0sgICBUbyBqdXN0IGNvbXBpbGUgdGhlIFsueHh4LkVYRS5TU0xdU1NMX1RBU0suRVhFCiskIQorJCEgIFNwZWNpZnkgREVCVUcgb3IgTk9ERUJVRyBhcyBQMiB0byBjb21waWxlIHdpdGggb3Igd2l0aG91dCBkZWJ1Z2dlcgorJCEgIGluZm9ybWF0aW9uLgorJCEKKyQhICBTcGVjaWZ5IHdoaWNoIGNvbXBpbGVyIGF0IFAzIHRvIHRyeSB0byBjb21waWxlIHVuZGVyLgorJCEKKyQhCSAgIFZBWEMJIEZvciBWQVggQy4KKyQhCSAgIERFQ0MJIEZvciBERUMgQy4KKyQhCSAgIEdOVUMJIEZvciBHTlUgQy4KKyQhCiskISAgSWYgeW91IGRvbid0IHNwZWNpZnkgYSBjb21waWxlciwgaXQgd2lsbCB0cnkgdG8gZGV0ZXJtaW5lIHdoaWNoCiskISAgIkMiIGNvbXBpbGVyIHRvIHVzZS4KKyQhCiskISAgUDQsIGlmIGRlZmluZWQsIHNldHMgYSBUQ1AvSVAgbGlicmFyeSB0byB1c2UsIHRocm91Z2ggb25lIG9mIHRoZSBmb2xsb3dpbmcKKyQhICBrZXl3b3JkczoKKyQhCiskIQlVQ1gJCWZvciBVQ1gKKyQhCVRDUElQCQlmb3IgVENQSVAgKHBvc3QgVUNYKQorJCEJU09DS0VUU0hSCWZvciBTT0NLRVRTSFIrTkVUTElCCiskIQorJCEgIFA1LCBpZiBkZWZpbmVkLCBzZXRzIGEgY29tcGlsZXIgdGhyZWFkIE5PVCBuZWVkZWQgb24gT3BlblZNUyA3LjEgKGFuZCB1cCkKKyQhCiskIQorJCEgRGVmaW5lIEEgVENQL0lQIExpYnJhcnkgVGhhdCBXZSBXaWxsIE5lZWQgVG8gTGluayBUby4KKyQhIChUaGF0IElzLCBJZiBXZSBOZWVkIFRvIExpbmsgVG8gT25lLikKKyQhCiskIFRDUElQX0xJQiA9ICIiCiskIQorJCEgQ2hlY2sgV2hhdCBBcmNoaXRlY3R1cmUgV2UgQXJlIFVzaW5nLgorJCEKKyQgSUYgKEYkR0VUU1lJKCJDUFUiKS5MVC4xMjgpCiskIFRIRU4KKyQhCiskISAgVGhlIEFyY2hpdGVjdHVyZSBJcyBWQVguCiskIQorJCAgIEFSQ0ggPSAiVkFYIgorJCEKKyQhIEVsc2UuLi4KKyQhCiskIEVMU0UKKyQhCiskISAgVGhlIEFyY2hpdGVjdHVyZSBJcyBBbHBoYSwgSUE2NCBvciB3aGF0ZXZlciBjb21lcyBpbiB0aGUgZnV0dXJlLgorJCEKKyQgICBBUkNIID0gRiRFRElUKCBGJEdFVFNZSSggIkFSQ0hfTkFNRSIpLCAiVVBDQVNFIikKKyQgICBJRiAoQVJDSCAuRVFTLiAiIikgVEhFTiBBUkNIID0gIlVOSyIKKyQhCiskISBFbmQgVGhlIEFyY2hpdGVjdHVyZSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgRGVmaW5lIFRoZSBPQkogRGlyZWN0b3J5LgorJCEKKyQgT0JKX0RJUiA6PSBTWVMkRElTSzpbLS4nQVJDSCcuT0JKLlNTTF0KKyQhCiskISBEZWZpbmUgVGhlIEVYRSBEaXJlY3RvcnkuCiskIQorJCBFWEVfRElSIDo9IFNZUyRESVNLOlstLidBUkNIJy5FWEUuU1NMXQorJCEKKyQhIENoZWNrIFRvIE1ha2UgU3VyZSBXZSBIYXZlIFZhbGlkIENvbW1hbmQgTGluZSBQYXJhbWV0ZXJzLgorJCEKKyQgR09TVUIgQ0hFQ0tfT1BUSU9OUworJCEKKyQhIEluaXRpYWxpc2UgbG9naWNhbCBuYW1lcyBhbmQgc3VjaAorJCEKKyQgR09TVUIgSU5JVElBTElTRQorJCEKKyQhIFRlbGwgVGhlIFVzZXIgV2hhdCBLaW5kIG9mIE1hY2hpbmUgV2UgUnVuIE9uLgorJCEKKyQgV1JJVEUgU1lTJE9VVFBVVCAiQ29tcGlsaW5nIE9uIEEgIixBUkNILCIgTWFjaGluZS4iCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFRoZSBBcmNoaXRlY3R1cmUgU3BlY2lmaWMgT0JKIERpcmVjdG9yeSBFeGlzdHMuCiskIQorJCBJRiAoRiRQQVJTRShPQkpfRElSKS5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgSXQgRG9zZW4ndCBFeGlzdCwgU28gQ3JlYXRlIEl0LgorJCEKKyQgICBDUkVBVEUvRElSICdPQkpfRElSJworJCEKKyQhIEVuZCBUaGUgQXJjaGl0ZWN0dXJlIFNwZWNpZmljIE9CSiBEaXJlY3RvcnkgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBUaGUgQXJjaGl0ZWN0dXJlIFNwZWNpZmljIERpcmVjdG9yeSBFeGlzdHMuCiskIQorJCBJRiAoRiRQQVJTRShFWEVfRElSKS5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgSXQgRG9zZW4ndCBFeGlzdCwgU28gQ3JlYXRlIEl0LgorJCEKKyQgICBDUkVBVEUvRElSICdFWEVfRElSJworJCEKKyQhIEVuZCBUaGUgQXJjaGl0ZWN0dXJlIFNwZWNpZmljIERpcmVjdG9yeSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgRGVmaW5lIFRoZSBMaWJyYXJ5IE5hbWUuCiskIQorJCBTU0xfTElCIDo9ICdFWEVfRElSJ0xJQlNTTC5PTEIKKyQhCiskISBEZWZpbmUgVGhlIENSWVBUTy1MSUIgV2UgQXJlIFRvIFVzZS4KKyQhCiskIENSWVBUT19MSUIgOj0gU1lTJERJU0s6Wy0uJ0FSQ0gnLkVYRS5DUllQVE9dTElCQ1JZUFRPLk9MQgorJCEKKyQhIENoZWNrIFRvIFNlZSBXaGF0IFdlIEFyZSBUbyBEby4KKyQhCiskIElGIChCVUlMREFMTC5FUVMuIlRSVUUiKQorJCBUSEVOCiskIQorJCEgIFNpbmNlIE5vdGhpbmcgU3BlY2lhbCBXYXMgU3BlY2lmaWVkLCBEbyBFdmVyeXRoaW5nLgorJCEKKyQgICBHT1NVQiBMSUJSQVJZCiskICAgR09TVUIgU1NMX1RBU0sKKyQhCiskISBFbHNlLi4uCiskIQorJCBFTFNFCiskIQorJCEgIEJ1aWxkIEp1c3QgV2hhdCBUaGUgVXNlciBXYW50cyBVcyBUbyBCdWlsZC4KKyQhCiskICAgR09TVUIgJ0JVSUxEQUxMJworJCEKKyQhIEVuZCBUaGUgQlVJTERBTEwgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIFRpbWUgVG8gRVhJVC4KKyQhCiskIEVYSVQ6CiskIEdPU1VCIENMRUFOVVAKKyQgRVhJVCAgIAorJCEKKyQhIENvbXBpbGUgVGhlIExpYnJhcnkuCiskIQorJCBMSUJSQVJZOgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBBbHJlYWR5IEhhdmUgQSAiWy54eHguRVhFLlNTTF1MSUJTU0wuT0xCIiBMaWJyYXJ5Li4uCiskIQorJCBJRiAoRiRTRUFSQ0goU1NMX0xJQikuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgR3Vlc3MgTm90LCBDcmVhdGUgVGhlIExpYnJhcnkuCiskIQorJCAgIExJQlJBUlkvQ1JFQVRFL09CSkVDVCAnU1NMX0xJQicKKyQhCiskISBFbmQgVGhlIExpYnJhcnkgRXhpc3QgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIERlZmluZSBUaGUgRGlmZmVyZW50IFNTTCAibGlicmFyeSIgRmlsZXMuCiskIQorJCBMSUJfU1NMID0gInMyX21ldGgsczJfc3J2cixzMl9jbG50LHMyX2xpYixzMl9lbmMsczJfcGt0LCIrIC0KKwkgICAgInMzX21ldGgsczNfc3J2cixzM19jbG50LHMzX2xpYixzM19lbmMsczNfcGt0LHMzX2JvdGgsIisgLQorCSAgICAiczIzX21ldGgsczIzX3NydnIsczIzX2NsbnQsczIzX2xpYixzMjNfcGt0LCIrIC0KKwkgICAgInQxX21ldGgsdDFfc3J2cix0MV9jbG50LHQxX2xpYix0MV9lbmMsIisgLQorCSAgICAiZDFfbWV0aCxkMV9zcnZyLGQxX2NsbnQsZDFfbGliLGQxX3BrdCwiKyAtCisJICAgICJkMV9ib3RoLGQxX2VuYywiKyAtCisJICAgICJzc2xfbGliLHNzbF9lcnIyLHNzbF9jZXJ0LHNzbF9zZXNzLCIrIC0KKwkgICAgInNzbF9jaXBoLHNzbF9zdGF0LHNzbF9yc2EsIisgLQorCSAgICAic3NsX2FzbjEsc3NsX3R4dCxzc2xfYWxncywiKyAtCisJICAgICJiaW9fc3NsLHNzbF9lcnIsa3NzbCx0MV9yZW5lZyIKKyQhCiskISBUZWxsIFRoZSBVc2VyIFRoYXQgV2UgQXJlIENvbXBpbGluZyBUaGUgTGlicmFyeS4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIkJ1aWxkaW5nIFRoZSAiLFNTTF9MSUIsIiBMaWJyYXJ5LiIKKyQhCiskISBEZWZpbmUgQSBGaWxlIENvdW50ZXIgQW5kIFNldCBJdCBUbyAiMCIKKyQhCiskIEZJTEVfQ09VTlRFUiA9IDAKKyQhCiskISBUb3AgT2YgVGhlIEZpbGUgTG9vcC4KKyQhCiskIE5FWFRfRklMRToKKyQhCiskISBPLkssIEV4dHJhY3QgVGhlIEZpbGUgTmFtZSBGcm9tIFRoZSBGaWxlIExpc3QuCiskIQorJCBGSUxFX05BTUUgPSBGJEVMRU1FTlQoRklMRV9DT1VOVEVSLCIsIixMSUJfU1NMKQorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgQXQgVGhlIEVuZCBPZiBUaGUgRmlsZSBMaXN0LgorJCEKKyQgSUYgKEZJTEVfTkFNRS5FUVMuIiwiKSBUSEVOIEdPVE8gRklMRV9ET05FCiskIQorJCEgSW5jcmVtZW50IFRoZSBDb3VudGVyLgorJCEKKyQgRklMRV9DT1VOVEVSID0gRklMRV9DT1VOVEVSICsgMQorJCEKKyQhIENyZWF0ZSBUaGUgU291cmNlIEZpbGUgTmFtZS4KKyQhCiskIFNPVVJDRV9GSUxFID0gIlNZUyRESVNLOltdIiArIEZJTEVfTkFNRSArICIuQyIKKyQhCiskISBDcmVhdGUgVGhlIE9iamVjdCBGaWxlIE5hbWUuCiskIQorJCBPQkpFQ1RfRklMRSA9IE9CSl9ESVIgKyBGSUxFX05BTUUgKyAiLk9CSiIKKyQgT04gV0FSTklORyBUSEVOIEdPVE8gTkVYVF9GSUxFCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFRoZSBGaWxlIFdlIFdhbnQgVG8gQ29tcGlsZSBJcyBBY3R1YWxseSBUaGVyZS4KKyQhCiskIElGIChGJFNFQVJDSChTT1VSQ0VfRklMRSkuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgVGhhdCBUaGUgRmlsZSBEb3Nlbid0IEV4aXN0LgorJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIEZpbGUgIixTT1VSQ0VfRklMRSwiIERvc2VuJ3QgRXhpc3QuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQhCiskISAgRXhpdCBUaGUgQnVpbGQuCiskIQorJCAgIEVYSVQKKyQhCiskISBFbmQgVGhlIEZpbGUgRXhpc3RzIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISAgVGVsbCBUaGUgVXNlciBXaGF0IEZpbGUgV2UgQXJlIENvbXBpbGluZy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIgkiLEZJTEVfTkFNRSwiLmMiCiskIQorJCEgQ29tcGlsZSBUaGUgRmlsZS4KKyQhCiskIE9OIEVSUk9SIFRIRU4gR09UTyBORVhUX0ZJTEUKKyQgQ0MvT0JKRUNUPSdPQkpFQ1RfRklMRScgJ1NPVVJDRV9GSUxFJworJCEKKyQhIEFkZCBJdCBUbyBUaGUgTGlicmFyeS4KKyQhCiskIExJQlJBUlkvUkVQTEFDRS9PQkpFQ1QgJ1NTTF9MSUInICdPQkpFQ1RfRklMRScKKyQhCiskISBUaW1lIFRvIENsZWFuIFVwIFRoZSBPYmplY3QgRmlsZS4KKyQhCiskIERFTEVURSAnT0JKRUNUX0ZJTEUnOyoKKyQhCiskISBHbyBCYWNrIEFuZCBHZXQgVGhlIE5leHQgRmlsZSBOYW1lLgorJCEKKyQgR09UTyBORVhUX0ZJTEUKKyQhCiskISBBbGwgRG9uZSBXaXRoIFRoaXMgTGlicmFyeS4KKyQhCiskIEZJTEVfRE9ORToKKyQhCiskISBUZWxsIFRoZSBVc2VyIFRoYXQgV2UgQXJlIEFsbCBEb25lLgorJCEKKyQgV1JJVEUgU1lTJE9VVFBVVCAiTGlicmFyeSAiLFNTTF9MSUIsIiBDb21waWxlZC4iCiskIQorJCEgVGltZSBUbyBSRVRVUk4uCiskIQorJCBSRVRVUk4KKyQgU1NMX1RBU0s6CiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgVGhlIFByb3BlciBMaWJyYXJpZXMuCiskIQorJCBHT1NVQiBMSUJfQ0hFQ0sKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgSGF2ZSBBIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskIEdPU1VCIENIRUNLX09QVF9GSUxFCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFRoZSBGaWxlIFdlIFdhbnQgVG8gQ29tcGlsZSBJcyBBY3R1YWxseSBUaGVyZS4KKyQhCiskIElGIChGJFNFQVJDSCgiU1lTJERJU0s6W11TU0xfVEFTSy5DIikuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgVGhhdCBUaGUgRmlsZSBEb3Nlbid0IEV4aXN0LgorJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIEZpbGUgU1NMX1RBU0suQyBEb3Nlbid0IEV4aXN0LiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskIQorJCEgIEV4aXQgVGhlIEJ1aWxkLgorJCEKKyQgICBFWElUCiskIQorJCEgRW5kIFRoZSBTU0xfVEFTSy5DIEZpbGUgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIFRlbGwgVGhlIFVzZXIgV2UgQXJlIENyZWF0aW5nIFRoZSBTU0xfVEFTSy4KKyQhCiskIFdSSVRFIFNZUyRPVVRQVVQgIkNyZWF0aW5nIFNTTF9UQVNLIE9TVSBIVFRQIFNTTCBFbmdpbmUuIgkKKyQhCiskISBDb21waWxlIFRoZSBGaWxlLgorJCEKKyQgT04gRVJST1IgVEhFTiBHT1RPIFNTTF9UQVNLX0VORAorJCBDQzUvT0JKRUNUPSdPQkpfRElSJ1NTTF9UQVNLLk9CSiBTWVMkRElTSzpbXVNTTF9UQVNLLkMKKyQhCiskISBMaW5rIFRoZSBQcm9ncmFtLgorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIEFyZSBUbyBMaW5rIFdpdGggQSBTcGVjaWZpYyBUQ1AvSVAgTGlicmFyeS4KKyQhCiskIElGIChUQ1BJUF9MSUIuTkVTLiIiKQorJCBUSEVOCiskIQorJCEgIExpbmsgV2l0aCBUQ1AvSVAgTGlicmFyeS4KKyQhCiskICAgTElOSy8nREVCVUdHRVInLydUUkFDRUJBQ0snL0VYRT0nRVhFX0RJUidTU0xfVEFTSy5FWEUgLQorICAgICAgICAnT0JKX0RJUidTU0xfVEFTSy5PQkosIC0KKwknU1NMX0xJQicvTElCUkFSWSwnQ1JZUFRPX0xJQicvTElCUkFSWSwgLQorICAgICAgICAnVENQSVBfTElCJywnT1BUX0ZJTEUnL09QVElPTgorJCEKKyQhIEVsc2UuLi4KKyQhCiskIEVMU0UKKyQhCiskISAgRG9uJ3QgTGluayBXaXRoIFRDUC9JUCBMaWJyYXJ5LgorJCEKKyQgICBMSU5LLydERUJVR0dFUicvJ1RSQUNFQkFDSycvRVhFPSdFWEVfRElSJ1NTTF9UQVNLLkVYRSAtCisgICAgICAgICdPQkpfRElSJ1NTTF9UQVNLLk9CSiwtCisJJ1NTTF9MSUInL0xJQlJBUlksJ0NSWVBUT19MSUInL0xJQlJBUlksIC0KKyAgICAgICAgJ09QVF9GSUxFJy9PUFRJT04KKyQhCiskISBFbmQgVGhlIFRDUC9JUCBMaWJyYXJ5IENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBUaW1lIFRvIFJldHVybi4KKyQhCiskU1NMX1RBU0tfRU5EOgorJCBSRVRVUk4KKyQhCiskISBDaGVjayBGb3IgVGhlIExpbmsgT3B0aW9uIEZJbGUuCiskIQorJCBDSEVDS19PUFRfRklMRToKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgTmVlZCBUbyBNYWtlIEEgVkFYIEMgT3B0aW9uIEZpbGUuCiskIQorJCBJRiAoQ09NUElMRVIuRVFTLiJWQVhDIikKKyQgVEhFTgorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgV2UgQWxyZWFkeSBIYXZlIEEgVkFYIEMgTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICBJRiAoRiRTRUFSQ0goT1BUX0ZJTEUpLkVRUy4iIikKKyQgICBUSEVOCiskIQorJCEgICAgV2UgTmVlZCBBIFZBWCBDIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskICAgICBDUkVBVEUgJ09QVF9GSUxFJworJERFQ0sKKyEKKyEgRGVmYXVsdCBTeXN0ZW0gT3B0aW9ucyBGaWxlIFRvIExpbmsgQWdpYW5zdCAKKyEgVGhlIFNoYXJhYmxlIFZBWCBDIFJ1bnRpbWUgTGlicmFyeS4KKyEKK1NZUyRTSEFSRTpWQVhDUlRMLkVYRS9TSEFSRQorJEVPRAorJCEKKyQhICBFbmQgVGhlIE9wdGlvbiBGaWxlIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgVkFYQyBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFdlIE5lZWQgQSBHTlUgQyBPcHRpb24gRmlsZS4KKyQhCiskIElGIChDT01QSUxFUi5FUVMuIkdOVUMiKQorJCBUSEVOCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBbHJlYWR5IEhhdmUgQSBHTlUgQyBMaW5rZXIgT3B0aW9uIEZpbGUuCiskIQorJCAgIElGIChGJFNFQVJDSChPUFRfRklMRSkuRVFTLiIiKQorJCAgIFRIRU4KKyQhCiskISAgICBXZSBOZWVkIEEgR05VIEMgTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICAgIENSRUFURSAnT1BUX0ZJTEUnCiskREVDSworIQorISBEZWZhdWx0IFN5c3RlbSBPcHRpb25zIEZpbGUgVG8gTGluayBBZ2lhbnN0IAorISBUaGUgU2hhcmFibGUgQyBSdW50aW1lIExpYnJhcnkuCishCitHTlVfQ0M6WzAwMDAwMF1HQ0NMSUIvTElCUkFSWQorU1lTJFNIQVJFOlZBWENSVEwvU0hBUkUKKyRFT0QKKyQhCiskISAgRW5kIFRoZSBPcHRpb24gRmlsZSBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISBFbmQgVGhlIEdOVSBDIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgTmVlZCBBIERFQyBDIE9wdGlvbiBGaWxlLgorJCEKKyQgSUYgKENPTVBJTEVSLkVRUy4iREVDQyIpCiskIFRIRU4KKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFscmVhZHkgSGF2ZSBBIERFQyBDIExpbmtlciBPcHRpb24gRmlsZS4KKyQhCiskICAgSUYgKEYkU0VBUkNIKE9QVF9GSUxFKS5FUVMuIiIpCiskICAgVEhFTgorJCEKKyQhICAgIEZpZ3VyZSBPdXQgSWYgV2UgTmVlZCBBIG5vbi1WQVggT3IgQSBWQVggTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICAgIElGIChBUkNILkVRUy4iVkFYIikKKyQgICAgIFRIRU4KKyQhCiskISAgICAgIFdlIE5lZWQgQSBERUMgQyBMaW5rZXIgT3B0aW9uIEZpbGUgRm9yIFZBWC4KKyQhCiskICAgICAgIENSRUFURSAnT1BUX0ZJTEUnCiskREVDSworIQorISBEZWZhdWx0IFN5c3RlbSBPcHRpb25zIEZpbGUgVG8gTGluayBBZ2lhbnN0IAorISBUaGUgU2hhcmFibGUgREVDIEMgUnVudGltZSBMaWJyYXJ5LgorIQorU1lTJFNIQVJFOkRFQ0MkU0hSLkVYRS9TSEFSRQorJEVPRAorJCEKKyQhICAgIEVsc2UuLi4KKyQhCiskICAgICBFTFNFCiskIQorJCEgICAgICBDcmVhdGUgVGhlIG5vbi1WQVggTGlua2VyIE9wdGlvbiBGaWxlLgorJCEKKyQgICAgICAgQ1JFQVRFICdPUFRfRklMRScKKyRERUNLCishCishIERlZmF1bHQgU3lzdGVtIE9wdGlvbnMgRmlsZSBGb3Igbm9uLVZBWCBUbyBMaW5rIEFnaWFuc3QgCishIFRoZSBTaGFyYWJsZSBDIFJ1bnRpbWUgTGlicmFyeS4KKyEKK1NZUyRTSEFSRTpDTUEkT1BFTl9MSUJfU0hSL1NIQVJFCitTWVMkU0hBUkU6Q01BJE9QRU5fUlRML1NIQVJFCiskRU9ECiskIQorJCEgICAgRW5kIFRoZSBERUMgQyBPcHRpb24gRmlsZSBDaGVjay4KKyQhCiskICAgICBFTkRJRgorJCEKKyQhICBFbmQgVGhlIE9wdGlvbiBGaWxlIFNlYXJjaC4KKyQhCiskICAgRU5ESUYKKyQhCiskISBFbmQgVGhlIERFQyBDIENoZWNrLgorJCEKKyQgRU5ESUYKKyQhCiskISAgVGVsbCBUaGUgVXNlciBXaGF0IExpbmtlciBPcHRpb24gRmlsZSBXZSBBcmUgVXNpbmcuCiskIQorJCBXUklURSBTWVMkT1VUUFVUICJVc2luZyBMaW5rZXIgT3B0aW9uIEZpbGUgIixPUFRfRklMRSwiLiIJCiskIQorJCEgVGltZSBUbyBSRVRVUk4uCiskIQorJCBSRVRVUk4KKyQgTElCX0NIRUNLOgorJCEKKyQhIExvb2sgRm9yIFRoZSBWQVggTGlicmFyeSBMSUJTU0wuT0xCLgorJCEKKyQgSUYgKEYkU0VBUkNIKFNTTF9MSUIpLkVRUy4iIikKKyQgVEhFTgorJCEKKyQhICBUZWxsIFRoZSBVc2VyIFdlIENhbid0IEZpbmQgVGhlIExJQlNTTC5PTEIgTGlicmFyeS4KKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIkNhbid0IEZpbmQgVGhlIExpYnJhcnkgIixTU0xfTElCLCIuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIldlIENhbid0IExpbmsgV2l0aG91dCBJdC4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBTaW5jZSBXZSBDYW4ndCBMaW5rIFdpdGhvdXQgSXQsIEV4aXQuCiskIQorJCAgIEVYSVQKKyQhCiskISBFbmQgVGhlIExJQlNTTC5PTEIgTGlicmFyeSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgTG9vayBGb3IgVGhlIExpYnJhcnkgTElCQ1JZUFRPLk9MQi4KKyQhCiskIElGIChGJFNFQVJDSChDUllQVE9fTElCKS5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgVGVsbCBUaGUgVXNlciBXZSBDYW4ndCBGaW5kIFRoZSBMSUJDUllQVE8uT0xCIExpYnJhcnkuCiskIQorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICJDYW4ndCBGaW5kIFRoZSBMaWJyYXJ5ICIsQ1JZUFRPX0xJQiwiLiIKKyQgICBXUklURSBTWVMkT1VUUFVUICJXZSBDYW4ndCBMaW5rIFdpdGhvdXQgSXQuIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQhCiskISAgU2luY2UgV2UgQ2FuJ3QgTGluayBXaXRob3V0IEl0LCBFeGl0LgorJCEKKyQgICBFWElUCiskIQorJCEgRW5kIFRoZSBMSUJDUllQVE8uT0xCIExpYnJhcnkgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIFRpbWUgVG8gUmV0dXJuLgorJCEKKyQgUkVUVVJOCiskIQorJCEgQ2hlY2sgVGhlIFVzZXIncyBPcHRpb25zLgorJCEKKyQgQ0hFQ0tfT1BUSU9OUzoKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgUDEgSXMgQmxhbmsuCiskIQorJCBJRiAoUDEuRVFTLiJBTEwiKQorJCBUSEVOCiskIQorJCEgICBQMSBJcyBCbGFuaywgU28gQnVpbGQgRXZlcnl0aGluZy4KKyQhCiskICAgIEJVSUxEQUxMID0gIlRSVUUiCiskIQorJCEgRWxzZS4uLgorJCEKKyQgRUxTRQorJCEKKyQhICBFbHNlLCBDaGVjayBUbyBTZWUgSWYgUDEgSGFzIEEgVmFsaWQgQXJndW1lbnQuCiskIQorJCAgIElGIChQMS5FUVMuIkxJQlJBUlkiKS5PUi4oUDEuRVFTLiJTU0xfVEFTSyIpCiskICAgVEhFTgorJCEKKyQhICAgIEEgVmFsaWQgQXJndW1lbnQuCiskIQorJCAgICAgQlVJTERBTEwgPSBQMQorJCEKKyQhICBFbHNlLi4uCiskIQorJCAgIEVMU0UKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIFdlIERvbid0IEtub3cgV2hhdCBUaGV5IFdhbnQuCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVGhlIE9wdGlvbiAiLFAxLCIgSXMgSW52YWxpZC4gIFRoZSBWYWxpZCBPcHRpb25zIEFyZToiCiskICAgICBXUklURSBTWVMkT1VUUFVUICIiCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgICAgQUxMICAgICAgOiAgSnVzdCBCdWlsZCBFdmVyeXRoaW5nLiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBMSUJSQVJZICA6ICBUbyBDb21waWxlIEp1c3QgVGhlIFsueHh4LkVYRS5TU0xdTElCU1NMLk9MQiBMaWJyYXJ5LiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiAgICBTU0xfVEFTSyA6ICBUbyBDb21waWxlIEp1c3QgVGhlIFsueHh4LkVYRS5TU0xdU1NMX1RBU0suRVhFIFByb2dyYW0uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIFdoZXJlICd4eHgnIFN0YW5kcyBGb3I6IgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIEFMUEhBICAgIDogIEFscGhhIEFyY2hpdGVjdHVyZS4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICIgICAgSUE2NCAgICAgOiAgSUE2NCBBcmNoaXRlY3R1cmUuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIFZBWCAgICAgIDogIFZBWCBBcmNoaXRlY3R1cmUuIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICAgIFRpbWUgVG8gRVhJVC4KKyQhCiskICAgICBFWElUCiskIQorJCEgIEVuZCBUaGUgVmFsaWQgQXJndW1lbnQgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBQMSBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgQ2hlY2sgVG8gU2VlIElmIFAyIElzIEJsYW5rLgorJCEKKyQgSUYgKFAyLkVRUy4iTk9ERUJVRyIpCiskIFRIRU4KKyQhCiskISAgIFAyIElzIE5PREVCVUcsIFNvIENvbXBpbGUgV2l0aG91dCBEZWJ1Z2dlciBJbmZvcm1hdGlvbi4KKyQhCiskICAgIERFQlVHR0VSICA9ICJOT0RFQlVHIgorJCAgICBUUkFDRUJBQ0sgPSAiTk9UUkFDRUJBQ0siIAorJCAgICBHQ0NfT1BUSU1JWkUgPSAiT1BUSU1JWkUiCiskICAgIENDX09QVElNSVpFID0gIk9QVElNSVpFIgorJCAgICBXUklURSBTWVMkT1VUUFVUICJObyBEZWJ1Z2dlciBJbmZvcm1hdGlvbiBXaWxsIEJlIFByb2R1Y2VkIER1cmluZyBDb21waWxlLiIKKyQgICAgV1JJVEUgU1lTJE9VVFBVVCAiQ29tcGlsaW5nIFdpdGggQ29tcGlsZXIgT3B0aW1pemF0aW9uLiIKKyQhCiskISBFbHNlLi4uCiskIQorJCBFTFNFCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBBcmUgVG8gQ29tcGlsZSBXaXRoIERlYnVnZ2VyIEluZm9ybWF0aW9uLgorJCEKKyQgICBJRiAoUDIuRVFTLiJERUJVRyIpCiskICAgVEhFTgorJCEKKyQhICAgIENvbXBpbGUgV2l0aCBEZWJ1Z2dlciBJbmZvcm1hdGlvbi4KKyQhCiskICAgICBERUJVR0dFUiAgPSAiREVCVUciCiskICAgICBUUkFDRUJBQ0sgPSAiVFJBQ0VCQUNLIgorJCAgICAgR0NDX09QVElNSVpFID0gIk5PT1BUSU1JWkUiCiskICAgICBDQ19PUFRJTUlaRSA9ICJOT09QVElNSVpFIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiRGVidWdnZXIgSW5mb3JtYXRpb24gV2lsbCBCZSBQcm9kdWNlZCBEdXJpbmcgQ29tcGlsZS4iCiskICAgICBXUklURSBTWVMkT1VUUFVUICJDb21waWxpbmcgV2l0aG91dCBDb21waWxlciBPcHRpbWl6YXRpb24uIgorJCAgIEVMU0UKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIEVudGVyZWQgQW4gSW52YWxpZCBPcHRpb24uLgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlRoZSBPcHRpb24gIixQMiwiIElzIEludmFsaWQuICBUaGUgVmFsaWQgT3B0aW9ucyBBcmU6IgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIERFQlVHICAgIDogIENvbXBpbGUgV2l0aCBUaGUgRGVidWdnZXIgSW5mb3JtYXRpb24uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiICAgIE5PREVCVUcgIDogIENvbXBpbGUgV2l0aG91dCBUaGUgRGVidWdnZXIgSW5mb3JtYXRpb24uIgorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICAgIFRpbWUgVG8gRVhJVC4KKyQhCiskICAgICBFWElUCiskIQorJCEgIEVuZCBUaGUgVmFsaWQgQXJndW1lbnQgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgRW5kIFRoZSBQMiBDaGVjay4KKyQhCiskIEVORElGCiskIQorJCEgU3BlY2lhbCBUaHJlYWRzIEZvciBPcGVuVk1TIHY3LjEgT3IgTGF0ZXIKKyQhCiskISBXcml0dGVuIEJ5OiAgUmljaGFyZCBMZXZpdHRlCiskISAgICAgICAgICAgICAgcmljaGFyZEBsZXZpdHRlLm9yZworJCEKKyQhCiskISBDaGVjayBUbyBTZWUgSWYgV2UgSGF2ZSBBIE9wdGlvbiBGb3IgUDUuCiskIQorJCBJRiAoUDUuRVFTLiIiKQorJCBUSEVOCiskIQorJCEgIEdldCBUaGUgVmVyc2lvbiBPZiBWTVMgV2UgQXJlIFVzaW5nLgorJCEKKyQgICBJU1NFVkVOIDo9CiskICAgVE1QID0gRiRFTEVNRU5UKDAsIi0iLEYkRVhUUkFDVCgxLDQsRiRHRVRTWUkoIlZFUlNJT04iKSkpCiskICAgVE1QID0gRiRJTlRFR0VSKEYkRUxFTUVOVCgwLCIuIixUTVApK0YkRUxFTUVOVCgxLCIuIixUTVApKQorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgVGhlIFZNUyBWZXJzaW9uIElzIHY3LjEgT3IgTGF0ZXIuCiskIQorJCAgIElGIChUTVAuR0UuNzEpCiskICAgVEhFTgorJCEKKyQhICAgIFdlIEhhdmUgT3BlblZNUyB2Ny4xIE9yIExhdGVyLCBTbyBVc2UgVGhlIFNwZWNpYWwgVGhyZWFkcy4KKyQhCiskICAgICBJU1NFVkVOIDo9ICxQVEhSRUFEX1VTRV9ENAorJCEKKyQhICBFbmQgVGhlIFZNUyBWZXJzaW9uIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhIEVuZCBUaGUgUDUgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBQMyBJcyBCbGFuay4KKyQhCiskIElGIChQMy5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgTy5LLiwgVGhlIFVzZXIgRGlkbid0IFNwZWNpZnkgQSBDb21waWxlciwgTGV0J3MgVHJ5IFRvCiskISAgRmluZCBPdXQgV2hpY2ggT25lIFRvIFVzZS4KKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEhhdmUgR05VIEMuCiskIQorJCAgIElGIChGJFRSTkxOTSgiR05VX0NDIikuTkVTLiIiKQorJCAgIFRIRU4KKyQhCiskISAgICBMb29rcyBMaWtlIEdOVUMsIFNldCBUbyBVc2UgR05VQy4KKyQhCiskICAgICBQMyA9ICJHTlVDIgorJCEKKyQhICBFbmQgVGhlIEdOVSBDIENvbXBpbGVyIENoZWNrLgorJCEKKyQgICBFTFNFCiskIQorJCEgIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIFZBWEMgT3IgREVDQy4KKyQhCiskICAgICBJRiAoQVJDSC5ORVMuIlZBWCIpLk9SLihGJFRSTkxOTSgiREVDQyRDQ19ERUZBVUxUIikuTkVTLiIiKQorJCAgICAgVEhFTiAKKyQhCiskISAgICAgIExvb2tzIExpa2UgREVDQywgU2V0IFRvIFVzZSBERUNDLgorJCEKKyQgICAgICAgUDMgPSAiREVDQyIKKyQhCiskISAgICAgIEVsc2UuLi4KKyQhCiskICAgICBFTFNFCiskIQorJCEgICAgICBMb29rcyBMaWtlIFZBWEMsIFNldCBUbyBVc2UgVkFYQy4KKyQhCiskICAgICAgIFAzID0gIlZBWEMiCiskIQorJCEgICAgRW5kIFRoZSBWQVhDIENvbXBpbGVyIENoZWNrLgorJCEKKyQgICAgIEVORElGCiskIQorJCEgIEVuZCBUaGUgREVDQyAmIFZBWEMgQ29tcGlsZXIgQ2hlY2suCiskIQorJCAgIEVORElGCiskIQorJCEgIEVuZCBUaGUgQ29tcGlsZXIgQ2hlY2suCiskIQorJCBFTkRJRgorJCEKKyQhIENoZWNrIFRvIFNlZSBJZiBXZSBIYXZlIEEgT3B0aW9uIEZvciBQNC4KKyQhCiskIElGIChQNC5FUVMuIiIpCiskIFRIRU4KKyQhCiskISAgRmluZCBvdXQgd2hhdCBzb2NrZXQgbGlicmFyeSB3ZSBoYXZlIGF2YWlsYWJsZQorJCEKKyQgICBJRiBGJFBBUlNFKCJTT0NLRVRTSFI6IikgLk5FUy4gIiIKKyQgICBUSEVOCiskIQorJCEgICAgV2UgaGF2ZSBTT0NLRVRTSFIsIGFuZCBpdCBpcyBteSBvcGluaW9uIHRoYXQgaXQncyB0aGUgYmVzdCB0byB1c2UuCiskIQorJCAgICAgUDQgPSAiU09DS0VUU0hSIgorJCEKKyQhICAgIFRlbGwgdGhlIHVzZXIKKyQhCiskICAgICBXUklURSBTWVMkT1VUUFVUICJVc2luZyBTT0NLRVRTSFIgZm9yIFRDUC9JUCIKKyQhCiskISAgICBFbHNlLCBsZXQncyBsb29rIGZvciBzb21ldGhpbmcgZWxzZQorJCEKKyQgICBFTFNFCiskIQorJCEgICAgTGlrZSBVQ1ggKHRoZSByZWFzb24gdG8gZG8gdGhpcyBiZWZvcmUgTXVsdGluZXQgaXMgdGhhdCB0aGUgVUNYCiskISAgICBlbXVsYXRpb24gaXMgZWFzaWVyIHRvIHVzZS4uLikKKyQhCiskICAgICBJRiBGJFRSTkxOTSgiVUNYJElQQ19TSFIiKSAuTkVTLiAiIiAtCisJIC5PUi4gRiRQQVJTRSgiU1lTJFNIQVJFOlVDWCRJUENfU0hSLkVYRSIpIC5ORVMuICIiIC0KKwkgLk9SLiBGJFBBUlNFKCJTWVMkTElCUkFSWTpVQ1gkSVBDLk9MQiIpIC5ORVMuICIiCiskICAgICBUSEVOCiskIQorJCEJTGFzdCByZXNvcnQ6IGEgVUNYIG9yIFVDWC1jb21wYXRpYmxlIGxpYnJhcnkKKyQhCiskCVA0ID0gIlVDWCIKKyQhCiskISAgICAgIFRlbGwgdGhlIHVzZXIKKyQhCiskICAgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIFVDWCBvciBhbiBlbXVsYXRpb24gdGhlcmVvZiBmb3IgVENQL0lQIgorJCEKKyQhCVRoYXQgd2FzIGFsbC4uLgorJCEKKyQgICAgIEVORElGCiskICAgRU5ESUYKKyQgRU5ESUYKKyQhCiskISBTZXQgVXAgSW5pdGlhbCBDQyBEZWZpbml0aW9ucywgUG9zc2libHkgV2l0aCBVc2VyIE9uZXMKKyQhCiskIENDREVGUyA9ICJUQ1BJUF9UWVBFXycnUDQnIgorJCBJRiBGJFRZUEUoVVNFUl9DQ0RFRlMpIC5ORVMuICIiIFRIRU4gQ0NERUZTID0gQ0NERUZTICsgIiwiICsgVVNFUl9DQ0RFRlMKKyQgQ0NFWFRSQUZMQUdTID0gIiIKKyQgSUYgRiRUWVBFKFVTRVJfQ0NGTEFHUykgLk5FUy4gIiIgVEhFTiBDQ0VYVFJBRkxBR1MgPSBVU0VSX0NDRkxBR1MKKyQgQ0NESVNBQkxFV0FSTklOR1MgPSAiTE9OR0xPTkdUWVBFLExPTkdMT05HU1VGWCxGT1VORENSIgorJCBJRiBGJFRZUEUoVVNFUl9DQ0RJU0FCTEVXQVJOSU5HUykgLk5FUy4gIiIgVEhFTiAtCisJQ0NESVNBQkxFV0FSTklOR1MgPSBDQ0RJU0FCTEVXQVJOSU5HUyArICIsIiArIFVTRVJfQ0NESVNBQkxFV0FSTklOR1MKKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFRoZSBVc2VyIEVudGVyZWQgQSBWYWxpZCBQYXJhbXRlci4KKyQhCiskIElGIChQMy5FUVMuIlZBWEMiKS5PUi4oUDMuRVFTLiJERUNDIikuT1IuKFAzLkVRUy4iR05VQyIpCiskIFRIRU4KKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFRoZSBVc2VyIFdhbnRlZCBERUNDLgorJCEKKyQgICBJRiAoUDMuRVFTLiJERUNDIikKKyQgICBUSEVOCiskIQorJCEgICAgTG9va3MgTGlrZSBERUNDLCBTZXQgVG8gVXNlIERFQ0MuCiskIQorJCAgICAgQ09NUElMRVIgPSAiREVDQyIKKyQhCiskISAgICBUZWxsIFRoZSBVc2VyIFdlIEFyZSBVc2luZyBERUNDLgorJCEKKyQgICAgIFdSSVRFIFNZUyRPVVRQVVQgIlVzaW5nIERFQ0MgJ0MnIENvbXBpbGVyLiIKKyQhCiskISAgICBVc2UgREVDQy4uLgorJCEKKyQgICAgIENDID0gIkNDIgorJCAgICAgSUYgQVJDSC5FUVMuIlZBWCIgLkFORC4gRiRUUk5MTk0oIkRFQ0MkQ0NfREVGQVVMVCIpLk5FUy4iL0RFQ0MiIC0KKwkgVEhFTiBDQyA9ICJDQy9ERUNDIgorJCAgICAgQ0MgPSBDQyArICIvJydDQ19PUFRJTUlaRScvJydERUJVR0dFUicvU1RBTkRBUkQ9QU5TSTg5IiArIC0KKyAgICAgICAgICAgIi9OT0xJU1QvUFJFRklYPUFMTCIgKyAtCisJICAgIi9JTkNMVURFPShTWVMkRElTSzpbLS5DUllQVE9dLFNZUyRESVNLOlstXSkiICsgQ0NFWFRSQUZMQUdTCiskIQorJCEgICAgRGVmaW5lIFRoZSBMaW5rZXIgT3B0aW9ucyBGaWxlIE5hbWUuCiskIQorJCAgICAgT1BUX0ZJTEUgPSAiJydFWEVfRElSJ1ZBWF9ERUNDX09QVElPTlMuT1BUIgorJCEKKyQhICBFbmQgREVDQyBDaGVjay4KKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgVG8gU2VlIElmIFdlIEFyZSBUbyBVc2UgVkFYQy4KKyQhCiskICAgSUYgKFAzLkVRUy4iVkFYQyIpCiskICAgVEhFTgorJCEKKyQhICAgIExvb2tzIExpa2UgVkFYQywgU2V0IFRvIFVzZSBWQVhDLgorJCEKKyQgICAgIENPTVBJTEVSID0gIlZBWEMiCiskIQorJCEgICAgVGVsbCBUaGUgVXNlciBXZSBBcmUgVXNpbmcgVkFYIEMuCiskIQorJCAgICAgV1JJVEUgU1lTJE9VVFBVVCAiVXNpbmcgVkFYQyAnQycgQ29tcGlsZXIuIgorJCEKKyQhICAgIENvbXBpbGUgVXNpbmcgVkFYQy4KKyQhCiskICAgICBDQyA9ICJDQyIKKyQgICAgIElGIEFSQ0guTkVTLiJWQVgiCiskICAgICBUSEVOCiskCVdSSVRFIFNZUyRPVVRQVVQgIlRoZXJlIGlzIG5vIFZBWCBDIG9uICcnQVJDSCchIgorJAlFWElUCiskICAgICBFTkRJRgorJCAgICAgSUYgRiRUUk5MTk0oIkRFQ0MkQ0NfREVGQVVMVCIpLkVRUy4iL0RFQ0MiIFRIRU4gQ0MgPSAiQ0MvVkFYQyIKKyQgICAgIENDID0gQ0MgKyAiLycnQ0NfT1BUSU1JWkUnLycnREVCVUdHRVInL05PTElTVCIgKyAtCisJICAgIi9JTkNMVURFPShTWVMkRElTSzpbLS5DUllQVE9dLFNZUyRESVNLOlstXSkiICsgQ0NFWFRSQUZMQUdTCiskICAgICBDQ0RFRlMgPSBDQ0RFRlMgKyAiLCIiVkFYQyIiIgorJCEKKyQhICAgIERlZmluZSA8c3lzPiBBcyBTWVMkQ09NTU9OOltTWVNMSUJdCiskIQorJCAgICAgREVGSU5FL05PTE9HIFNZUyBTWVMkQ09NTU9OOltTWVNMSUJdCiskIQorJCEgICAgRGVmaW5lIFRoZSBMaW5rZXIgT3B0aW9ucyBGaWxlIE5hbWUuCiskIQorJCAgICAgT1BUX0ZJTEUgPSAiJydFWEVfRElSJ1ZBWF9WQVhDX09QVElPTlMuT1BUIgorJCEKKyQhICBFbmQgVkFYQyBDaGVjaworJCEKKyQgICBFTkRJRgorJCEKKyQhICBDaGVjayBUbyBTZWUgSWYgV2UgQXJlIFRvIFVzZSBHTlUgQy4KKyQhCiskICAgSUYgKFAzLkVRUy4iR05VQyIpCiskICAgVEhFTgorJCEKKyQhICAgIExvb2tzIExpa2UgR05VQywgU2V0IFRvIFVzZSBHTlVDLgorJCEKKyQgICAgIENPTVBJTEVSID0gIkdOVUMiCiskIQorJCEgICAgVGVsbCBUaGUgVXNlciBXZSBBcmUgVXNpbmcgR05VQy4KKyQhCiskICAgICBXUklURSBTWVMkT1VUUFVUICJVc2luZyBHTlUgJ0MnIENvbXBpbGVyLiIKKyQhCiskISAgICBVc2UgR05VIEMuLi4KKyQhCiskICAgICBJRiBGJFRZUEUoR0NDKSAuRVFTLiAiIiBUSEVOIEdDQyA6PSBHQ0MKKyQgICAgIENDID0gR0NDKyIvTk9DQVNFX0hBQ0svJydHQ0NfT1BUSU1JWkUnLycnREVCVUdHRVInL05PTElTVCIgKyAtCisJICAgIi9JTkNMVURFPShTWVMkRElTSzpbLS5DUllQVE9dLFNZUyRESVNLOlstXSkiICsgQ0NFWFRSQUZMQUdTCiskIQorJCEgICAgRGVmaW5lIFRoZSBMaW5rZXIgT3B0aW9ucyBGaWxlIE5hbWUuCiskIQorJCAgICAgT1BUX0ZJTEUgPSAiJydFWEVfRElSJ1ZBWF9HTlVDX09QVElPTlMuT1BUIgorJCEKKyQhICBFbmQgVGhlIEdOVSBDIENoZWNrLgorJCEKKyQgICBFTkRJRgorJCEKKyQhICBTZXQgdXAgZGVmYXVsdCBkZWZpbmVzCiskIQorJCAgIENDREVGUyA9ICIiIkZMQVRfSU5DPTEiIiwiICsgQ0NERUZTCiskIQorJCEgIEZpbmlzaCB1cCB0aGUgZGVmaW5pdGlvbiBvZiBDQy4KKyQhCiskICAgSUYgQ09NUElMRVIgLkVRUy4gIkRFQ0MiCiskICAgVEhFTgorJCAgICAgSUYgQ0NESVNBQkxFV0FSTklOR1MgLkVRUy4gIiIKKyQgICAgIFRIRU4KKyQgICAgICAgQ0M0RElTQUJMRVdBUk5JTkdTID0gIkRPTExBUklEIgorJCAgICAgRUxTRQorJCAgICAgICBDQzRESVNBQkxFV0FSTklOR1MgPSBDQ0RJU0FCTEVXQVJOSU5HUyArICIsRE9MTEFSSUQiCiskICAgICAgIENDRElTQUJMRVdBUk5JTkdTID0gIi9XQVJOSU5HPShESVNBQkxFPSgiICsgQ0NESVNBQkxFV0FSTklOR1MgKyAiKSkiCiskICAgICBFTkRJRgorJCAgICAgQ0M0RElTQUJMRVdBUk5JTkdTID0gIi9XQVJOSU5HPShESVNBQkxFPSgiICsgQ0M0RElTQUJMRVdBUk5JTkdTICsgIikpIgorJCAgIEVMU0UKKyQgICAgIENDRElTQUJMRVdBUk5JTkdTID0gIiIKKyQgICAgIENDNERJU0FCTEVXQVJOSU5HUyA9ICIiCiskICAgRU5ESUYKKyQgICBDQzIgPSBDQyArICIvREVGSU5FPSgiICsgQ0NERUZTICsgIixfUE9TSVhfQ19TT1VSQ0UpIiArIENDRElTQUJMRVdBUk5JTkdTCiskICAgQ0MzID0gQ0MgKyAiL0RFRklORT0oIiArIENDREVGUyArIElTU0VWRU4gKyAiKSIgKyBDQ0RJU0FCTEVXQVJOSU5HUworJCAgIENDID0gQ0MgKyAiL0RFRklORT0oIiArIENDREVGUyArICIpIiArIENDRElTQUJMRVdBUk5JTkdTCiskICAgSUYgQ09NUElMRVIgLkVRUy4gIkRFQ0MiCiskICAgVEhFTgorJCAgICAgQ0M0ID0gQ0MgLSBDQ0RJU0FCTEVXQVJOSU5HUyArIENDNERJU0FCTEVXQVJOSU5HUworJCAgICAgQ0M1ID0gQ0MzIC0gQ0NESVNBQkxFV0FSTklOR1MgKyBDQzRESVNBQkxFV0FSTklOR1MKKyQgICBFTFNFCiskICAgICBDQzQgPSBDQworJCAgICAgQ0M1ID0gQ0MzCiskICAgRU5ESUYKKyQhCiskISAgU2hvdyB1c2VyIHRoZSByZXN1bHQKKyQhCiskICAgV1JJVEUvU1lNQk9MIFNZUyRPVVRQVVQgIk1haW4gQ29tcGlsaW5nIENvbW1hbmQ6ICIsQ0MKKyQhCiskISAgRWxzZSBUaGUgVXNlciBFbnRlcmVkIEFuIEludmFsaWQgQXJndW1lbnQuCiskIQorJCBFTFNFCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgV2UgRG9uJ3QgS25vdyBXaGF0IFRoZXkgV2FudC4KKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIlRoZSBPcHRpb24gIixQMywiIElzIEludmFsaWQuICBUaGUgVmFsaWQgT3B0aW9ucyBBcmU6IgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgVkFYQyAgOiAgVG8gQ29tcGlsZSBXaXRoIFZBWCBDLiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgREVDQyAgOiAgVG8gQ29tcGlsZSBXaXRoIERFQyBDLiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgR05VQyAgOiAgVG8gQ29tcGlsZSBXaXRoIEdOVSBDLiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIiCiskIQorJCEgIFRpbWUgVG8gRVhJVC4KKyQhCiskICAgRVhJVAorJCBFTkRJRgorJCEKKyQhIFRpbWUgdG8gY2hlY2sgdGhlIGNvbnRlbnRzLCBhbmQgdG8gbWFrZSBzdXJlIHdlIGdldCB0aGUgY29ycmVjdCBsaWJyYXJ5LgorJCEKKyQgSUYgUDQuRVFTLiJTT0NLRVRTSFIiIC5PUi4gUDQuRVFTLiJNVUxUSU5FVCIgLk9SLiBQNC5FUVMuIlVDWCIgLQorICAgICAuT1IuIFA0LkVRUy4iVENQSVAiIC5PUi4gUDQuRVFTLiJOT05FIgorJCBUSEVOCiskIQorJCEgIENoZWNrIHRvIHNlZSBpZiBTT0NLRVRTSFIgd2FzIGNob3NlbgorJCEKKyQgICBJRiBQNC5FUVMuIlNPQ0tFVFNIUiIKKyQgICBUSEVOCiskIQorJCEgICAgU2V0IHRoZSBsaWJyYXJ5IHRvIHVzZSBTT0NLRVRTSFIKKyQhCiskICAgICBUQ1BJUF9MSUIgPSAiU1lTJERJU0s6Wy0uVk1TXVNPQ0tFVFNIUl9TSFIuT1BUL09QVCIKKyQhCiskISAgICBEb25lIHdpdGggU09DS0VUU0hSCiskIQorJCAgIEVORElGCiskIQorJCEgIENoZWNrIHRvIHNlZSBpZiBNVUxUSU5FVCB3YXMgY2hvc2VuCiskIQorJCAgIElGIFA0LkVRUy4iTVVMVElORVQiCiskICAgVEhFTgorJCEKKyQhICAgIFNldCB0aGUgbGlicmFyeSB0byB1c2UgVUNYIGVtdWxhdGlvbi4KKyQhCiskICAgICBQNCA9ICJVQ1giCiskIQorJCEgICAgRG9uZSB3aXRoIE1VTFRJTkVUCiskIQorJCAgIEVORElGCiskIQorJCEgIENoZWNrIHRvIHNlZSBpZiBVQ1ggd2FzIGNob3NlbgorJCEKKyQgICBJRiBQNC5FUVMuIlVDWCIKKyQgICBUSEVOCiskIQorJCEgICAgU2V0IHRoZSBsaWJyYXJ5IHRvIHVzZSBVQ1guCiskIQorJCAgICAgVENQSVBfTElCID0gIlNZUyRESVNLOlstLlZNU11VQ1hfU0hSX0RFQ0MuT1BUL09QVCIKKyQgICAgIElGIEYkVFJOTE5NKCJVQ1gkSVBDX1NIUiIpIC5ORVMuICIiCiskICAgICBUSEVOCiskICAgICAgIFRDUElQX0xJQiA9ICJTWVMkRElTSzpbLS5WTVNdVUNYX1NIUl9ERUNDX0xPRy5PUFQvT1BUIgorJCAgICAgRUxTRQorJCAgICAgICBJRiBDT01QSUxFUiAuTkVTLiAiREVDQyIgLkFORC4gQVJDSCAuRVFTLiAiVkFYIiBUSEVOIC0KKwkgIFRDUElQX0xJQiA9ICJTWVMkRElTSzpbLS5WTVNdVUNYX1NIUl9WQVhDLk9QVC9PUFQiCiskICAgICBFTkRJRgorJCEKKyQhICAgIERvbmUgd2l0aCBVQ1gKKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgdG8gc2VlIGlmIFRDUElQIHdhcyBjaG9zZW4KKyQhCiskICAgSUYgUDQuRVFTLiJUQ1BJUCIKKyQgICBUSEVOCiskIQorJCEgICAgU2V0IHRoZSBsaWJyYXJ5IHRvIHVzZSBUQ1BJUCAocG9zdCBVQ1gpLgorJCEKKyQgICAgIFRDUElQX0xJQiA9ICJTWVMkRElTSzpbLS5WTVNdVENQSVBfU0hSX0RFQ0MuT1BUL09QVCIKKyQhCiskISAgICBEb25lIHdpdGggVENQSVAKKyQhCiskICAgRU5ESUYKKyQhCiskISAgQ2hlY2sgdG8gc2VlIGlmIE5PTkUgd2FzIGNob3NlbgorJCEKKyQgICBJRiBQNC5FUVMuIk5PTkUiCiskICAgVEhFTgorJCEKKyQhICAgIERvIG5vdCB1c2UgYSBUQ1BJUCBsaWJyYXJ5LgorJCEKKyQgICAgIFRDUElQX0xJQiA9ICIiCiskIQorJCEgICAgRG9uZSB3aXRoIE5PTkUKKyQhCiskICAgRU5ESUYKKyQhCiskISAgUHJpbnQgaW5mbworJCEKKyQgICBXUklURSBTWVMkT1VUUFVUICJUQ1AvSVAgbGlicmFyeSBzcGVjOiAiLCBUQ1BJUF9MSUIKKyQhCiskISAgRWxzZSBUaGUgVXNlciBFbnRlcmVkIEFuIEludmFsaWQgQXJndW1lbnQuCiskIQorJCBFTFNFCiskIQorJCEgIFRlbGwgVGhlIFVzZXIgV2UgRG9uJ3QgS25vdyBXaGF0IFRoZXkgV2FudC4KKyQhCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIlRoZSBPcHRpb24gIixQNCwiIElzIEludmFsaWQuICBUaGUgVmFsaWQgT3B0aW9ucyBBcmU6IgorJCAgIFdSSVRFIFNZUyRPVVRQVVQgIiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgU09DS0VUU0hSICA6ICBUbyBsaW5rIHdpdGggU09DS0VUU0hSIFRDUC9JUCBsaWJyYXJ5LiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgVUNYICAgICAgICA6ICBUbyBsaW5rIHdpdGggVUNYIFRDUC9JUCBsaWJyYXJ5LiIKKyQgICBXUklURSBTWVMkT1VUUFVUICIgICAgVENQSVAgICAgICA6ICBUbyBsaW5rIHdpdGggVENQSVAgKHBvc3QgVUNYKSBUQ1AvSVAgbGlicmFyeS4iCiskICAgV1JJVEUgU1lTJE9VVFBVVCAiIgorJCEKKyQhICBUaW1lIFRvIEVYSVQuCiskIQorJCAgIEVYSVQKKyQhCiskISAgRG9uZSB3aXRoIFRDUC9JUCBsaWJyYXJpZXMKKyQhCiskIEVORElGCiskIQorJCEgIFRpbWUgVG8gUkVUVVJOLi4uCiskIQorJCBSRVRVUk4KKyQhCiskIElOSVRJQUxJU0U6CiskIQorJCEgU2F2ZSBvbGQgdmFsdWUgb2YgdGhlIGxvZ2ljYWwgbmFtZSBPUEVOU1NMCiskIQorJCBfX1NBVkVfT1BFTlNTTCA9IEYkVFJOTE5NKCJPUEVOU1NMIiwiTE5NJFBST0NFU1NfVEFCTEUiKQorJCEKKyQhIFNhdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uCiskIQorJCBfX0hFUkUgPSBGJFBBUlNFKEYkUEFSU0UoIkEuOyIsRiRFTlZJUk9OTUVOVCgiUFJPQ0VEVVJFIikpLSJBLjsiLCJbXUEuOyIpIC0gIkEuOyIKKyQgX19IRVJFID0gRiRFRElUKF9fSEVSRSwiVVBDQVNFIikKKyQgX19UT1AgPSBfX0hFUkUgLSAiU1NMXSIKKyQgX19JTkNMVURFID0gX19UT1AgKyAiSU5DTFVERS5PUEVOU1NMXSIKKyQhCiskISBTZXQgdXAgdGhlIGxvZ2ljYWwgbmFtZSBPUEVOU1NMIHRvIHBvaW50IGF0IHRoZSBpbmNsdWRlIGRpcmVjdG9yeQorJCEKKyQgREVGSU5FIE9QRU5TU0wvTk9MT0cgJ19fSU5DTFVERScKKyQhCiskISBEb25lCiskIQorJCBSRVRVUk4KKyQhCiskIENMRUFOVVA6CiskIQorJCEgUmVzdG9yZSB0aGUgbG9naWNhbCBuYW1lIE9QRU5TU0wgaWYgaXQgaGFkIGEgdmFsdWUKKyQhCiskIElGIF9fU0FWRV9PUEVOU1NMIC5FUVMuICIiCiskIFRIRU4KKyQgICBERUFTU0lHTiBPUEVOU1NMCiskIEVMU0UKKyQgICBERUZJTkUvTk9MT0cgT1BFTlNTTCAnX19TQVZFX09QRU5TU0wnCiskIEVORElGCiskIQorJCEgRG9uZQorJCEKKyQgUkVUVVJOCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvc3NsLmggYi9saWIvb3BlbnNzbC9zc2wvc3NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMGY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zc2wuaApAQCAtMCwwICsxLDIzMjAgQEAKKy8qIHNzbC9zc2wuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogRUNDIGNpcGhlciBzdWl0ZSBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDA1IE5va2lhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBwb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBpcyBkZXZlbG9wZWQgYnkKKyAqIE5va2lhIENvcnBvcmF0aW9uIGFuZCBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZS4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uLCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWlrYSBLb3VzYSBhbmQgUGFzaSBFcm9uZW4gb2YKKyAqIE5va2lhIENvcnBvcmF0aW9uLCBjb25zaXN0cyBvZiB0aGUgIlBTSyIgKFByZS1TaGFyZWQgS2V5KSBjaXBoZXJzdWl0ZXMKKyAqIHN1cHBvcnQgKHNlZSBSRkMgNDI3OSkgdG8gT3BlblNTTC4KKyAqCisgKiBObyBwYXRlbnQgbGljZW5zZXMgb3Igb3RoZXIgcmlnaHRzIGV4Y2VwdCB0aG9zZSBleHByZXNzbHkgc3RhdGVkIGluCisgKiB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZSBsaWNlbnNlIHNoYWxsIGJlIGRlZW1lZCBncmFudGVkIG9yIHJlY2VpdmVkCisgKiBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCwgb3Igb3RoZXJ3aXNlLgorICoKKyAqIE5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IE5va2lhIHRoYXQgdGhlIENvbnRyaWJ1dGlvbiBkb2VzIG5vdAorICogaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSB0aGlyZAorICogcGFydHkgb3IgdGhhdCB0aGUgbGljZW5zZSBwcm92aWRlcyB5b3Ugd2l0aCBhbGwgdGhlIG5lY2Vzc2FyeSByaWdodHMKKyAqIHRvIG1ha2UgdXNlIG9mIHRoZSBDb250cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORC4gSU4KKyAqIEFERElUSU9OIFRPIFRIRSBESVNDTEFJTUVSUyBJTkNMVURFRCBJTiBUSEUgTElDRU5TRSwgTk9LSUEKKyAqIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBGT1IgQ0xBSU1TIEJST1VHSFQgQlkgWU9VIE9SIEFOWQorICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCisgKiBPVEhFUldJU0UuCisgKi8KKworI2lmbmRlZiBIRUFERVJfU1NMX0ggCisjZGVmaW5lIEhFQURFUl9TU0xfSCAKKworI2luY2x1ZGUgPG9wZW5zc2wvZV9vczIuaD4KKworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbXAuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JJTworI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ERVBSRUNBVEVECisjaWZuZGVmIE9QRU5TU0xfTk9fWDUwOQorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvcGVtLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2tzc2wuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3NhZmVzdGFjay5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3ltaGFja3MuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogU1NMZWF5IHZlcnNpb24gbnVtYmVyIGZvciBBU04uMSBlbmNvZGluZyBvZiB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiAqLworLyogVmVyc2lvbiAwIC0gaW5pdGlhbCB2ZXJzaW9uCisgKiBWZXJzaW9uIDEgLSBhZGRlZCB0aGUgb3B0aW9uYWwgcGVlciBjZXJ0aWZpY2F0ZQorICovCisjZGVmaW5lIFNTTF9TRVNTSU9OX0FTTjFfVkVSU0lPTiAweDAwMDEKKworLyogdGV4dCBzdHJpbmdzIGZvciB0aGUgY2lwaGVycyAqLworI2RlZmluZSBTU0xfVFhUX05VTExfV0lUSF9NRDUJCVNTTDJfVFhUX05VTExfV0lUSF9NRDUJCQkKKyNkZWZpbmUgU1NMX1RYVF9SQzRfMTI4X1dJVEhfTUQ1CVNTTDJfVFhUX1JDNF8xMjhfV0lUSF9NRDUJCQorI2RlZmluZSBTU0xfVFhUX1JDNF8xMjhfRVhQT1JUNDBfV0lUSF9NRDUgU1NMMl9UWFRfUkM0XzEyOF9FWFBPUlQ0MF9XSVRIX01ENQkKKyNkZWZpbmUgU1NMX1RYVF9SQzJfMTI4X0NCQ19XSVRIX01ENQlTU0wyX1RYVF9SQzJfMTI4X0NCQ19XSVRIX01ENQkJCisjZGVmaW5lIFNTTF9UWFRfUkMyXzEyOF9DQkNfRVhQT1JUNDBfV0lUSF9NRDUgU1NMMl9UWFRfUkMyXzEyOF9DQkNfRVhQT1JUNDBfV0lUSF9NRDUJCisjZGVmaW5lIFNTTF9UWFRfSURFQV8xMjhfQ0JDX1dJVEhfTUQ1CVNTTDJfVFhUX0lERUFfMTI4X0NCQ19XSVRIX01ENQkJCisjZGVmaW5lIFNTTF9UWFRfREVTXzY0X0NCQ19XSVRIX01ENQlTU0wyX1RYVF9ERVNfNjRfQ0JDX1dJVEhfTUQ1CQkKKyNkZWZpbmUgU1NMX1RYVF9ERVNfNjRfQ0JDX1dJVEhfU0hBCVNTTDJfVFhUX0RFU182NF9DQkNfV0lUSF9TSEEJCQorI2RlZmluZSBTU0xfVFhUX0RFU18xOTJfRURFM19DQkNfV0lUSF9NRDUgU1NMMl9UWFRfREVTXzE5Ml9FREUzX0NCQ19XSVRIX01ENQkKKyNkZWZpbmUgU1NMX1RYVF9ERVNfMTkyX0VERTNfQ0JDX1dJVEhfU0hBIFNTTDJfVFhUX0RFU18xOTJfRURFM19DQkNfV0lUSF9TSEEJCisKKy8qICAgIFZSUyBBZGRpdGlvbmFsIEtlcmJlcm9zNSBlbnRyaWVzCisgKi8KKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU182NF9DQkNfU0hBICAgU1NMM19UWFRfS1JCNV9ERVNfNjRfQ0JDX1NIQQorI2RlZmluZSBTU0xfVFhUX0tSQjVfREVTXzE5Ml9DQkMzX1NIQSBTU0wzX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19TSEEKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X1JDNF8xMjhfU0hBICAgICAgU1NMM19UWFRfS1JCNV9SQzRfMTI4X1NIQQorI2RlZmluZSBTU0xfVFhUX0tSQjVfSURFQV8xMjhfQ0JDX1NIQSBTU0wzX1RYVF9LUkI1X0lERUFfMTI4X0NCQ19TSEEKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU182NF9DQkNfTUQ1ICAgU1NMM19UWFRfS1JCNV9ERVNfNjRfQ0JDX01ENSAgICAgICAKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19NRDUgU1NMM19UWFRfS1JCNV9ERVNfMTkyX0NCQzNfTUQ1ICAgICAgIAorI2RlZmluZSBTU0xfVFhUX0tSQjVfUkM0XzEyOF9NRDUgICAgICBTU0wzX1RYVF9LUkI1X1JDNF8xMjhfTUQ1CisjZGVmaW5lIFNTTF9UWFRfS1JCNV9JREVBXzEyOF9DQkNfTUQ1IFNTTDNfVFhUX0tSQjVfSURFQV8xMjhfQ0JDX01ENSAKKworI2RlZmluZSBTU0xfVFhUX0tSQjVfREVTXzQwX0NCQ19TSEEgICBTU0wzX1RYVF9LUkI1X0RFU180MF9DQkNfU0hBIAorI2RlZmluZSBTU0xfVFhUX0tSQjVfUkMyXzQwX0NCQ19TSEEgICBTU0wzX1RYVF9LUkI1X1JDMl80MF9DQkNfU0hBIAorI2RlZmluZSBTU0xfVFhUX0tSQjVfUkM0XzQwX1NIQQkgICAgICBTU0wzX1RYVF9LUkI1X1JDNF80MF9TSEEKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU180MF9DQkNfTUQ1ICAgU1NMM19UWFRfS1JCNV9ERVNfNDBfQ0JDX01ENSAKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X1JDMl80MF9DQkNfTUQ1ICAgU1NMM19UWFRfS1JCNV9SQzJfNDBfQ0JDX01ENSAKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X1JDNF80MF9NRDUJICAgICAgU1NMM19UWFRfS1JCNV9SQzRfNDBfTUQ1CisKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU180MF9DQkNfU0hBICAgU1NMM19UWFRfS1JCNV9ERVNfNDBfQ0JDX1NIQQorI2RlZmluZSBTU0xfVFhUX0tSQjVfREVTXzQwX0NCQ19NRDUgICBTU0wzX1RYVF9LUkI1X0RFU180MF9DQkNfTUQ1CisjZGVmaW5lIFNTTF9UWFRfS1JCNV9ERVNfNjRfQ0JDX1NIQSAgIFNTTDNfVFhUX0tSQjVfREVTXzY0X0NCQ19TSEEKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU182NF9DQkNfTUQ1ICAgU1NMM19UWFRfS1JCNV9ERVNfNjRfQ0JDX01ENQorI2RlZmluZSBTU0xfVFhUX0tSQjVfREVTXzE5Ml9DQkMzX1NIQSBTU0wzX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19TSEEKKyNkZWZpbmUgU1NMX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19NRDUgU1NMM19UWFRfS1JCNV9ERVNfMTkyX0NCQzNfTUQ1CisjZGVmaW5lIFNTTF9NQVhfS1JCNV9QUklOQ0lQQUxfTEVOR1RIICAyNTYKKworI2RlZmluZSBTU0xfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSAkJMzIKKyNkZWZpbmUgU1NMX01BWF9TSURfQ1RYX0xFTkdUSAkJCTMyCisKKyNkZWZpbmUgU1NMX01JTl9SU0FfTU9EVUxVU19MRU5HVEhfSU5fQllURVMJKDUxMi84KQorI2RlZmluZSBTU0xfTUFYX0tFWV9BUkdfTEVOR1RICQkJOAorI2RlZmluZSBTU0xfTUFYX01BU1RFUl9LRVlfTEVOR1RICQk0OAorCisKKy8qIFRoZXNlIGFyZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggY2lwaGVycyB0byB1c2UgYW5kIG5vdCB0byB1c2UgKi8KKworI2RlZmluZSBTU0xfVFhUX0VYUDQwCQkiRVhQT1JUNDAiCisjZGVmaW5lIFNTTF9UWFRfRVhQNTYJCSJFWFBPUlQ1NiIKKyNkZWZpbmUgU1NMX1RYVF9MT1cJCSJMT1ciCisjZGVmaW5lIFNTTF9UWFRfTUVESVVNCQkiTUVESVVNIgorI2RlZmluZSBTU0xfVFhUX0hJR0gJCSJISUdIIgorI2RlZmluZSBTU0xfVFhUX0ZJUFMJCSJGSVBTIgorCisjZGVmaW5lIFNTTF9UWFRfa0ZaQQkJImtGWkEiIC8qIHVudXNlZCEgKi8KKyNkZWZpbmUJU1NMX1RYVF9hRlpBCQkiYUZaQSIgLyogdW51c2VkISAqLworI2RlZmluZSBTU0xfVFhUX2VGWkEJCSJlRlpBIiAvKiB1bnVzZWQhICovCisjZGVmaW5lIFNTTF9UWFRfRlpBCQkiRlpBIiAgLyogdW51c2VkISAqLworCisjZGVmaW5lCVNTTF9UWFRfYU5VTEwJCSJhTlVMTCIKKyNkZWZpbmUJU1NMX1RYVF9lTlVMTAkJImVOVUxMIgorI2RlZmluZQlTU0xfVFhUX05VTEwJCSJOVUxMIgorCisjZGVmaW5lIFNTTF9UWFRfa1JTQQkJImtSU0EiCisjZGVmaW5lIFNTTF9UWFRfa0RIcgkJImtESHIiIC8qIG5vIHN1Y2ggY2lwaGVyc3VpdGVzIHN1cHBvcnRlZCEgKi8KKyNkZWZpbmUgU1NMX1RYVF9rREhkCQkia0RIZCIgLyogbm8gc3VjaCBjaXBoZXJzdWl0ZXMgc3VwcG9ydGVkISAqLworI2RlZmluZSBTU0xfVFhUX2tESCAJCSJrREgiICAvKiBubyBzdWNoIGNpcGhlcnN1aXRlcyBzdXBwb3J0ZWQhICovCisjZGVmaW5lIFNTTF9UWFRfa0VESAkJImtFREgiCisjZGVmaW5lIFNTTF9UWFRfa0tSQjUgICAgIAkia0tSQjUiCisjZGVmaW5lIFNTTF9UWFRfa0VDREhyCQkia0VDREhyIgorI2RlZmluZSBTU0xfVFhUX2tFQ0RIZQkJImtFQ0RIZSIKKyNkZWZpbmUgU1NMX1RYVF9rRUNESAkJImtFQ0RIIgorI2RlZmluZSBTU0xfVFhUX2tFRUNESAkJImtFRUNESCIKKyNkZWZpbmUgU1NMX1RYVF9rUFNLICAgICAgICAgICAgImtQU0siCisjZGVmaW5lIFNTTF9UWFRfa0dPU1QJCSJrR09TVCIKKworI2RlZmluZQlTU0xfVFhUX2FSU0EJCSJhUlNBIgorI2RlZmluZQlTU0xfVFhUX2FEU1MJCSJhRFNTIgorI2RlZmluZQlTU0xfVFhUX2FESAkJImFESCIgLyogbm8gc3VjaCBjaXBoZXJzdWl0ZXMgc3VwcG9ydGVkISAqLworI2RlZmluZQlTU0xfVFhUX2FFQ0RICQkiYUVDREgiCisjZGVmaW5lIFNTTF9UWFRfYUtSQjUgICAgIAkiYUtSQjUiCisjZGVmaW5lIFNTTF9UWFRfYUVDRFNBCQkiYUVDRFNBIgorI2RlZmluZSBTU0xfVFhUX2FQU0sgICAgICAgICAgICAiYVBTSyIKKyNkZWZpbmUgU1NMX1RYVF9hR09TVDk0CSJhR09TVDk0IgorI2RlZmluZSBTU0xfVFhUX2FHT1NUMDEgImFHT1NUMDEiCisjZGVmaW5lIFNTTF9UWFRfYUdPU1QgICJhR09TVCIKKworI2RlZmluZQlTU0xfVFhUX0RTUwkJIkRTUyIKKyNkZWZpbmUgU1NMX1RYVF9ESAkJIkRIIgorI2RlZmluZSBTU0xfVFhUX0VESAkJIkVESCIgLyogc2FtZSBhcyAia0VESDotQURIIiAqLworI2RlZmluZSBTU0xfVFhUX0FESAkJIkFESCIKKyNkZWZpbmUgU1NMX1RYVF9SU0EJCSJSU0EiCisjZGVmaW5lIFNTTF9UWFRfRUNESAkJIkVDREgiCisjZGVmaW5lIFNTTF9UWFRfRUVDREgJCSJFRUNESCIgLyogc2FtZSBhcyAia0VFQ0RIOi1BRUNESCIgKi8KKyNkZWZpbmUgU1NMX1RYVF9BRUNESAkJIkFFQ0RIIgorI2RlZmluZSBTU0xfVFhUX0VDRFNBCQkiRUNEU0EiCisjZGVmaW5lIFNTTF9UWFRfS1JCNSAgICAgIAkiS1JCNSIKKyNkZWZpbmUgU1NMX1RYVF9QU0sgICAgICAgICAgICAgIlBTSyIKKworI2RlZmluZSBTU0xfVFhUX0RFUwkJIkRFUyIKKyNkZWZpbmUgU1NMX1RYVF8zREVTCQkiM0RFUyIKKyNkZWZpbmUgU1NMX1RYVF9SQzQJCSJSQzQiCisjZGVmaW5lIFNTTF9UWFRfUkMyCQkiUkMyIgorI2RlZmluZSBTU0xfVFhUX0lERUEJCSJJREVBIgorI2RlZmluZSBTU0xfVFhUX1NFRUQJCSJTRUVEIgorI2RlZmluZSBTU0xfVFhUX0FFUzEyOAkJIkFFUzEyOCIKKyNkZWZpbmUgU1NMX1RYVF9BRVMyNTYJCSJBRVMyNTYiCisjZGVmaW5lIFNTTF9UWFRfQUVTCQkiQUVTIgorI2RlZmluZSBTU0xfVFhUX0NBTUVMTElBMTI4CSJDQU1FTExJQTEyOCIKKyNkZWZpbmUgU1NMX1RYVF9DQU1FTExJQTI1NgkiQ0FNRUxMSUEyNTYiCisjZGVmaW5lIFNTTF9UWFRfQ0FNRUxMSUEJIkNBTUVMTElBIgorCisjZGVmaW5lIFNTTF9UWFRfTUQ1CQkiTUQ1IgorI2RlZmluZSBTU0xfVFhUX1NIQTEJCSJTSEExIgorI2RlZmluZSBTU0xfVFhUX1NIQQkJIlNIQSIgLyogc2FtZSBhcyAiU0hBMSIgKi8KKyNkZWZpbmUgU1NMX1RYVF9HT1NUOTQJCSJHT1NUOTQiIAorI2RlZmluZSBTU0xfVFhUX0dPU1Q4OU1BQwkJIkdPU1Q4OU1BQyIgCisKKyNkZWZpbmUgU1NMX1RYVF9TU0xWMgkJIlNTTHYyIgorI2RlZmluZSBTU0xfVFhUX1NTTFYzCQkiU1NMdjMiCisjZGVmaW5lIFNTTF9UWFRfVExTVjEJCSJUTFN2MSIKKworI2RlZmluZSBTU0xfVFhUX0VYUAkJIkVYUCIKKyNkZWZpbmUgU1NMX1RYVF9FWFBPUlQJCSJFWFBPUlQiCisKKyNkZWZpbmUgU1NMX1RYVF9BTEwJCSJBTEwiCisKKy8qCisgKiBDT01QTEVNRU5UT0YqIGRlZmluaXRpb25zLiBUaGVzZSBpZGVudGlmaWVycyBhcmUgdXNlZCB0byAoZGUtc2VsZWN0KQorICogY2lwaGVycyBub3JtYWxseSBub3QgYmVpbmcgdXNlZC4KKyAqIEV4YW1wbGU6ICJSQzQiIHdpbGwgYWN0aXZhdGUgYWxsIGNpcGhlcnMgdXNpbmcgUkM0IGluY2x1ZGluZyBjaXBoZXJzCisgKiB3aXRob3V0IGF1dGhlbnRpY2F0aW9uLCB3aGljaCB3b3VsZCBub3JtYWxseSBkaXNhYmxlZCBieSBERUZBVUxUIChkdWUKKyAqIHRoZSAiIUFESCIgYmVpbmcgcGFydCBvZiBkZWZhdWx0KS4gVGhlcmVmb3JlICJSQzQ6IUNPTVBMRU1FTlRPRkRFRkFVTFQiCisgKiB3aWxsIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIGFsc28gZGlzYWJsZWQgaW4gdGhlIHNwZWNpZmljIHNlbGVjdGlvbi4KKyAqIENPTVBMRU1FTlRPRiogaWRlbnRpZmllcnMgYXJlIHBvcnRhYmxlIGJldHdlZW4gdmVyc2lvbiwgYXMgYWRqdXN0bWVudHMKKyAqIHRvIHRoZSBkZWZhdWx0IGNpcGhlciBzZXR1cCB3aWxsIGFsc28gYmUgaW5jbHVkZWQgaGVyZS4KKyAqCisgKiBDT01QTEVNRU5UT0ZERUZBVUxUIGRvZXMgbm90IGV4cGVyaWVuY2UgdGhlIHNhbWUgc3BlY2lhbCB0cmVhdG1lbnQgdGhhdAorICogREVGQVVMVCBnZXRzLCBhcyBvbmx5IHNlbGVjdGlvbiBpcyBiZWluZyBkb25lIGFuZCBubyBzb3J0aW5nIGFzIG5lZWRlZAorICogZm9yIERFRkFVTFQuCisgKi8KKyNkZWZpbmUgU1NMX1RYVF9DTVBBTEwJCSJDT01QTEVNRU5UT0ZBTEwiCisjZGVmaW5lIFNTTF9UWFRfQ01QREVGCQkiQ09NUExFTUVOVE9GREVGQVVMVCIKKworLyogVGhlIGZvbGxvd2luZyBjaXBoZXIgbGlzdCBpcyB1c2VkIGJ5IGRlZmF1bHQuCisgKiBJdCBhbHNvIGlzIHN1YnN0aXR1dGVkIHdoZW4gYW4gYXBwbGljYXRpb24tZGVmaW5lZCBjaXBoZXIgbGlzdCBzdHJpbmcKKyAqIHN0YXJ0cyB3aXRoICdERUZBVUxUJy4gKi8KKyNkZWZpbmUgU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QJIkFMTDohYU5VTEw6IWVOVUxMOiFTU0x2MiIKKy8qIEFzIG9mIE9wZW5TU0wgMS4wLjAsIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoKSBpbiBzc2wvc3NsX2NpcGguYyBhbHdheXMKKyAqIHN0YXJ0cyB3aXRoIGEgcmVhc29uYWJsZSBvcmRlciwgYW5kIGFsbCB3ZSBoYXZlIHRvIGRvIGZvciBERUZBVUxUIGlzCisgKiB0aHJvd2luZyBvdXQgYW5vbnltb3VzIGFuZCB1bmVuY3J5cHRlZCBjaXBoZXJzdWl0ZXMhCisgKiAoVGhlIGxhdHRlciBhcmUgbm90IGFjdHVhbGx5IGVuYWJsZWQgYnkgQUxMLCBidXQgIkFMTDpSU0EiIHdvdWxkIGVuYWJsZQorICogc29tZSBvZiB0aGVtLikKKyAqLworCisvKiBVc2VkIGluIFNTTF9zZXRfc2h1dGRvd24oKS9TU0xfZ2V0X3NodXRkb3duKCk7ICovCisjZGVmaW5lIFNTTF9TRU5UX1NIVVRET1dOCTEKKyNkZWZpbmUgU1NMX1JFQ0VJVkVEX1NIVVRET1dOCTIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIChkZWZpbmVkKE9QRU5TU0xfTk9fUlNBKSB8fCBkZWZpbmVkKE9QRU5TU0xfTk9fTUQ1KSkgJiYgIWRlZmluZWQoT1BFTlNTTF9OT19TU0wyKQorI2RlZmluZSBPUEVOU1NMX05PX1NTTDIKKyNlbmRpZgorCisjZGVmaW5lIFNTTF9GSUxFVFlQRV9BU04xCVg1MDlfRklMRVRZUEVfQVNOMQorI2RlZmluZSBTU0xfRklMRVRZUEVfUEVNCVg1MDlfRklMRVRZUEVfUEVNCisKKy8qIFRoaXMgaXMgbmVlZGVkIHRvIHN0b3AgY29tcGlsZXJzIGNvbXBsYWluaW5nIGFib3V0IHRoZQorICogJ3N0cnVjdCBzc2xfc3QgKicgZnVuY3Rpb24gcGFyYW1ldGVycyB1c2VkIHRvIHByb3RvdHlwZSBjYWxsYmFja3MKKyAqIGluIFNTTF9DVFguICovCit0eXBlZGVmIHN0cnVjdCBzc2xfc3QgKnNzbF9jcm9ja19zdDsKK3R5cGVkZWYgc3RydWN0IHRsc19zZXNzaW9uX3RpY2tldF9leHRfc3QgVExTX1NFU1NJT05fVElDS0VUX0VYVDsKKworLyogdXNlZCB0byBob2xkIGluZm8gb24gdGhlIHBhcnRpY3VsYXIgY2lwaGVycyB1c2VkICovCit0eXBlZGVmIHN0cnVjdCBzc2xfY2lwaGVyX3N0CisJeworCWludCB2YWxpZDsKKwljb25zdCBjaGFyICpuYW1lOwkJLyogdGV4dCBuYW1lICovCisJdW5zaWduZWQgbG9uZyBpZDsJCS8qIGlkLCA0IGJ5dGVzLCBmaXJzdCBpcyB2ZXJzaW9uICovCisKKwkvKiBjaGFuZ2VkIGluIDAuOS45OiB0aGVzZSBmb3VyIHVzZWQgdG8gYmUgcG9ydGlvbnMgb2YgYSBzaW5nbGUgdmFsdWUgJ2FsZ29yaXRobXMnICovCisJdW5zaWduZWQgbG9uZyBhbGdvcml0aG1fbWtleTsJLyoga2V5IGV4Y2hhbmdlIGFsZ29yaXRobSAqLworCXVuc2lnbmVkIGxvbmcgYWxnb3JpdGhtX2F1dGg7CS8qIHNlcnZlciBhdXRoZW50aWNhdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgYWxnb3JpdGhtX2VuYzsJLyogc3ltbWV0cmljIGVuY3J5cHRpb24gKi8KKwl1bnNpZ25lZCBsb25nIGFsZ29yaXRobV9tYWM7CS8qIHN5bW1ldHJpYyBhdXRoZW50aWNhdGlvbiAqLworCXVuc2lnbmVkIGxvbmcgYWxnb3JpdGhtX3NzbDsJLyogKG1ham9yKSBwcm90b2NvbCB2ZXJzaW9uICovCisKKwl1bnNpZ25lZCBsb25nIGFsZ29fc3RyZW5ndGg7CS8qIHN0cmVuZ3RoIGFuZCBleHBvcnQgZmxhZ3MgKi8KKwl1bnNpZ25lZCBsb25nIGFsZ29yaXRobTI7CS8qIEV4dHJhIGZsYWdzICovCisJaW50IHN0cmVuZ3RoX2JpdHM7CQkvKiBOdW1iZXIgb2YgYml0cyByZWFsbHkgdXNlZCAqLworCWludCBhbGdfYml0czsJCQkvKiBOdW1iZXIgb2YgYml0cyBmb3IgYWxnb3JpdGhtICovCisJfSBTU0xfQ0lQSEVSOworCitERUNMQVJFX1NUQUNLX09GKFNTTF9DSVBIRVIpCisKK3R5cGVkZWYgaW50ICgqdGxzX3Nlc3Npb25fdGlja2V0X2V4dF9jYl9mbikoU1NMICpzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLCB2b2lkICphcmcpOwordHlwZWRlZiBpbnQgKCp0bHNfc2Vzc2lvbl9zZWNyZXRfY2JfZm4pKFNTTCAqcywgdm9pZCAqc2VjcmV0LCBpbnQgKnNlY3JldF9sZW4sIFNUQUNLX09GKFNTTF9DSVBIRVIpICpwZWVyX2NpcGhlcnMsIFNTTF9DSVBIRVIgKipjaXBoZXIsIHZvaWQgKmFyZyk7CisKKy8qIFVzZWQgdG8gaG9sZCBmdW5jdGlvbnMgZm9yIFNTTHYyIG9yIFNTTHYzL1RMU3YxIGZ1bmN0aW9ucyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3NsX21ldGhvZF9zdAorCXsKKwlpbnQgdmVyc2lvbjsKKwlpbnQgKCpzc2xfbmV3KShTU0wgKnMpOworCXZvaWQgKCpzc2xfY2xlYXIpKFNTTCAqcyk7CisJdm9pZCAoKnNzbF9mcmVlKShTU0wgKnMpOworCWludCAoKnNzbF9hY2NlcHQpKFNTTCAqcyk7CisJaW50ICgqc3NsX2Nvbm5lY3QpKFNTTCAqcyk7CisJaW50ICgqc3NsX3JlYWQpKFNTTCAqcyx2b2lkICpidWYsaW50IGxlbik7CisJaW50ICgqc3NsX3BlZWspKFNTTCAqcyx2b2lkICpidWYsaW50IGxlbik7CisJaW50ICgqc3NsX3dyaXRlKShTU0wgKnMsY29uc3Qgdm9pZCAqYnVmLGludCBsZW4pOworCWludCAoKnNzbF9zaHV0ZG93bikoU1NMICpzKTsKKwlpbnQgKCpzc2xfcmVuZWdvdGlhdGUpKFNTTCAqcyk7CisJaW50ICgqc3NsX3JlbmVnb3RpYXRlX2NoZWNrKShTU0wgKnMpOworCWxvbmcgKCpzc2xfZ2V0X21lc3NhZ2UpKFNTTCAqcywgaW50IHN0MSwgaW50IHN0biwgaW50IG10LCBsb25nCisJCW1heCwgaW50ICpvayk7CisJaW50ICgqc3NsX3JlYWRfYnl0ZXMpKFNTTCAqcywgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbiwgCisJCWludCBwZWVrKTsKKwlpbnQgKCpzc2xfd3JpdGVfYnl0ZXMpKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHZvaWQgKmJ1Zl8sIGludCBsZW4pOworCWludCAoKnNzbF9kaXNwYXRjaF9hbGVydCkoU1NMICpzKTsKKwlsb25nICgqc3NsX2N0cmwpKFNTTCAqcyxpbnQgY21kLGxvbmcgbGFyZyx2b2lkICpwYXJnKTsKKwlsb25nICgqc3NsX2N0eF9jdHJsKShTU0xfQ1RYICpjdHgsaW50IGNtZCxsb25nIGxhcmcsdm9pZCAqcGFyZyk7CisJY29uc3QgU1NMX0NJUEhFUiAqKCpnZXRfY2lwaGVyX2J5X2NoYXIpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cik7CisJaW50ICgqcHV0X2NpcGhlcl9ieV9jaGFyKShjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIsdW5zaWduZWQgY2hhciAqcHRyKTsKKwlpbnQgKCpzc2xfcGVuZGluZykoY29uc3QgU1NMICpzKTsKKwlpbnQgKCpudW1fY2lwaGVycykodm9pZCk7CisJY29uc3QgU1NMX0NJUEhFUiAqKCpnZXRfY2lwaGVyKSh1bnNpZ25lZCBuY2lwaGVyKTsKKwljb25zdCBzdHJ1Y3Qgc3NsX21ldGhvZF9zdCAqKCpnZXRfc3NsX21ldGhvZCkoaW50IHZlcnNpb24pOworCWxvbmcgKCpnZXRfdGltZW91dCkodm9pZCk7CisJc3RydWN0IHNzbDNfZW5jX21ldGhvZCAqc3NsM19lbmM7IC8qIEV4dHJhIFNTTHYzL1RMUyBzdHVmZiAqLworCWludCAoKnNzbF92ZXJzaW9uKSh2b2lkKTsKKwlsb25nICgqc3NsX2NhbGxiYWNrX2N0cmwpKFNTTCAqcywgaW50IGNiX2lkLCB2b2lkICgqZnApKHZvaWQpKTsKKwlsb25nICgqc3NsX2N0eF9jYWxsYmFja19jdHJsKShTU0xfQ1RYICpzLCBpbnQgY2JfaWQsIHZvaWQgKCpmcCkodm9pZCkpOworCX0gU1NMX01FVEhPRDsKKworLyogTGV0cyBtYWtlIHRoaXMgaW50byBhbiBBU04uMSB0eXBlIHN0cnVjdHVyZSBhcyBmb2xsb3dzCisgKiBTU0xfU0VTU0lPTl9JRCA6Oj0gU0VRVUVOQ0UgeworICoJdmVyc2lvbiAJCUlOVEVHRVIsCS0tIHN0cnVjdHVyZSB2ZXJzaW9uIG51bWJlcgorICoJU1NMdmVyc2lvbiAJCUlOVEVHRVIsCS0tIFNTTCB2ZXJzaW9uIG51bWJlcgorICoJQ2lwaGVyIAkJCU9DVEVUIFNUUklORywJLS0gdGhlIDMgYnl0ZSBjaXBoZXIgSUQKKyAqCVNlc3Npb25fSUQgCQlPQ1RFVCBTVFJJTkcsCS0tIHRoZSBTZXNzaW9uIElECisgKglNYXN0ZXJfa2V5IAkJT0NURVQgU1RSSU5HLAktLSB0aGUgbWFzdGVyIGtleQorICoJS1JCNV9wcmluY2lwYWwJCU9DVEVUIFNUUklORwktLSBvcHRpb25hbCBLZXJiZXJvcyBwcmluY2lwYWwKKyAqCUtleV9BcmcgWyAwIF0gSU1QTElDSVQJT0NURVQgU1RSSU5HLAktLSB0aGUgb3B0aW9uYWwgS2V5IGFyZ3VtZW50CisgKglUaW1lIFsgMSBdIEVYUExJQ0lUCUlOVEVHRVIsCS0tIG9wdGlvbmFsIFN0YXJ0IFRpbWUKKyAqCVRpbWVvdXQgWyAyIF0gRVhQTElDSVQJSU5URUdFUiwJLS0gb3B0aW9uYWwgVGltZW91dCBpbnMgc2Vjb25kcworICoJUGVlciBbIDMgXSBFWFBMSUNJVAlYNTA5LAkJLS0gb3B0aW9uYWwgUGVlciBDZXJ0aWZpY2F0ZQorICoJU2Vzc2lvbl9JRF9jb250ZXh0IFsgNCBdIEVYUExJQ0lUIE9DVEVUIFNUUklORywgICAtLSB0aGUgU2Vzc2lvbiBJRCBjb250ZXh0CisgKglWZXJpZnlfcmVzdWx0IFsgNSBdIEVYUExJQ0lUIElOVEVHRVIsICAgLS0gWDUwOV9WXy4uLiBjb2RlIGZvciBgUGVlcicKKyAqCUhvc3ROYW1lIFsgNiBdIEVYUExJQ0lUIE9DVEVUIFNUUklORywgICAtLSBvcHRpb25hbCBIb3N0TmFtZSBmcm9tIHNlcnZlcm5hbWUgVExTIGV4dGVuc2lvbiAKKyAqCUVDUG9pbnRGb3JtYXRMaXN0IFsgNyBdIE9DVEVUIFNUUklORywgICAgIC0tIG9wdGlvbmFsIEVDIHBvaW50IGZvcm1hdCBsaXN0IGZyb20gVExTIGV4dGVuc2lvbgorICoJUFNLX2lkZW50aXR5X2hpbnQgWyA4IF0gRVhQTElDSVQgT0NURVQgU1RSSU5HLCAtLSBvcHRpb25hbCBQU0sgaWRlbnRpdHkgaGludAorICoJUFNLX2lkZW50aXR5IFsgOSBdIEVYUExJQ0lUIE9DVEVUIFNUUklORyAtLSBvcHRpb25hbCBQU0sgaWRlbnRpdHkKKyAqCX0KKyAqIExvb2sgaW4gc3NsL3NzbF9hc24xLmMgZm9yIG1vcmUgZGV0YWlscworICogSSdtIHVzaW5nIEVYUExJQ0lUIHRhZ3Mgc28gSSBjYW4gcmVhZCB0aGUgZGFtbiB0aGluZ3MgdXNpbmcgYXNuMXBhcnNlIDotKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3NsX3Nlc3Npb25fc3QKKwl7CisJaW50IHNzbF92ZXJzaW9uOwkvKiB3aGF0IHNzbCB2ZXJzaW9uIHNlc3Npb24gaW5mbyBpcworCQkJCSAqIGJlaW5nIGtlcHQgaW4gaGVyZT8gKi8KKworCS8qIG9ubHkgcmVhbGx5IHVzZWQgaW4gU1NMdjIgKi8KKwl1bnNpZ25lZCBpbnQga2V5X2FyZ19sZW5ndGg7CisJdW5zaWduZWQgY2hhciBrZXlfYXJnW1NTTF9NQVhfS0VZX0FSR19MRU5HVEhdOworCWludCBtYXN0ZXJfa2V5X2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIG1hc3Rlcl9rZXlbU1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSF07CisJLyogc2Vzc2lvbl9pZCAtIHZhbGlkPyAqLworCXVuc2lnbmVkIGludCBzZXNzaW9uX2lkX2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHNlc3Npb25faWRbU1NMX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEhdOworCS8qIHRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2Vzc2lvbiBpcyBiZWluZyByZXVzZWQgaW4KKwkgKiB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4gSXQgaXMgdXAgdG8gdGhlIGFwcGxpY2F0aW9uIHRvIHNldCB0aGlzLAorCSAqIHZpYSBTU0xfbmV3ICovCisJdW5zaWduZWQgaW50IHNpZF9jdHhfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgc2lkX2N0eFtTU0xfTUFYX1NJRF9DVFhfTEVOR1RIXTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKyAgICAgICAgdW5zaWduZWQgaW50IGtyYjVfY2xpZW50X3ByaW5jX2xlbjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBrcmI1X2NsaWVudF9wcmluY1tTU0xfTUFYX0tSQjVfUFJJTkNJUEFMX0xFTkdUSF07CisjZW5kaWYgLyogT1BFTlNTTF9OT19LUkI1ICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJY2hhciAqcHNrX2lkZW50aXR5X2hpbnQ7CisJY2hhciAqcHNrX2lkZW50aXR5OworI2VuZGlmCisJaW50IG5vdF9yZXN1bWFibGU7CisKKwkvKiBUaGUgY2VydCBpcyB0aGUgY2VydGlmaWNhdGUgdXNlZCB0byBlc3RhYmxpc2ggdGhpcyBjb25uZWN0aW9uICovCisJc3RydWN0IHNlc3NfY2VydF9zdCAvKiBTRVNTX0NFUlQgKi8gKnNlc3NfY2VydDsKKworCS8qIFRoaXMgaXMgdGhlIGNlcnQgZm9yIHRoZSBvdGhlciBlbmQuCisJICogT24gY2xpZW50cywgaXQgd2lsbCBiZSB0aGUgc2FtZSBhcyBzZXNzX2NlcnQtPnBlZXJfa2V5LT54NTA5CisJICogKHRoZSBsYXR0ZXIgaXMgbm90IGVub3VnaCBhcyBzZXNzX2NlcnQgaXMgbm90IHJldGFpbmVkCisJICogaW4gdGhlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHNlc3Npb25zLCBzZWUgc3NsX2FzbjEuYykuICovCisJWDUwOSAqcGVlcjsKKwkvKiB3aGVuIGFwcF92ZXJpZnlfY2FsbGJhY2sgYWNjZXB0cyBhIHNlc3Npb24gd2hlcmUgdGhlIHBlZXIncyBjZXJ0aWZpY2F0ZQorCSAqIGlzIG5vdCBvaywgd2UgbXVzdCByZW1lbWJlciB0aGUgZXJyb3IgZm9yIHNlc3Npb24gcmV1c2U6ICovCisJbG9uZyB2ZXJpZnlfcmVzdWx0OyAvKiBvbmx5IGZvciBzZXJ2ZXJzICovCisKKwlpbnQgcmVmZXJlbmNlczsKKwlsb25nIHRpbWVvdXQ7CisJbG9uZyB0aW1lOworCisJdW5zaWduZWQgaW50IGNvbXByZXNzX21ldGg7CS8qIE5lZWQgdG8gbG9va3VwIHRoZSBtZXRob2QgKi8KKworCWNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcjsKKwl1bnNpZ25lZCBsb25nIGNpcGhlcl9pZDsJLyogd2hlbiBBU04uMSBsb2FkZWQsIHRoaXMKKwkJCQkJICogbmVlZHMgdG8gYmUgdXNlZCB0byBsb2FkCisJCQkJCSAqIHRoZSAnY2lwaGVyJyBzdHJ1Y3R1cmUgKi8KKworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJzOyAvKiBzaGFyZWQgY2lwaGVycz8gKi8KKworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7IC8qIGFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgKi8KKworCS8qIFRoZXNlIGFyZSB1c2VkIHRvIG1ha2UgcmVtb3ZhbCBvZiBzZXNzaW9uLWlkcyBtb3JlCisJICogZWZmaWNpZW50IGFuZCB0byBpbXBsZW1lbnQgYSBtYXhpbXVtIGNhY2hlIHNpemUuICovCisJc3RydWN0IHNzbF9zZXNzaW9uX3N0ICpwcmV2LCpuZXh0OworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCWNoYXIgKnRsc2V4dF9ob3N0bmFtZTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCXNpemVfdCB0bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdDsgLyogcGVlcidzIGxpc3QgKi8KKwlzaXplX3QgdGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICp0bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3Q7IC8qIHBlZXIncyBsaXN0ICovCisjZW5kaWYgLyogT1BFTlNTTF9OT19FQyAqLworCS8qIFJGQzQ1MDcgaW5mbyAqLworCXVuc2lnbmVkIGNoYXIgKnRsc2V4dF90aWNrOwkvKiBTZXNzaW9uIHRpY2tldCAqLworCXNpemVfdAl0bHNleHRfdGlja2xlbjsJCS8qIFNlc3Npb24gdGlja2V0IGxlbmd0aCAqLwkKKwlsb25nIHRsc2V4dF90aWNrX2xpZmV0aW1lX2hpbnQ7CS8qIFNlc3Npb24gbGlmZXRpbWUgaGludCBpbiBzZWNvbmRzICovCisjZW5kaWYKKwl9IFNTTF9TRVNTSU9OOworCisKKyNkZWZpbmUgU1NMX09QX01JQ1JPU09GVF9TRVNTX0lEX0JVRwkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIFNTTF9PUF9ORVRTQ0FQRV9DSEFMTEVOR0VfQlVHCQkJMHgwMDAwMDAwMkwKKy8qIEFsbG93IGluaXRpYWwgY29ubmVjdGlvbiB0byBzZXJ2ZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBSSSAqLworI2RlZmluZSBTU0xfT1BfTEVHQUNZX1NFUlZFUl9DT05ORUNUCQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgU1NMX09QX05FVFNDQVBFX1JFVVNFX0NJUEhFUl9DSEFOR0VfQlVHCQkweDAwMDAwMDA4TAorI2RlZmluZSBTU0xfT1BfU1NMUkVGMl9SRVVTRV9DRVJUX1RZUEVfQlVHCQkweDAwMDAwMDEwTAorI2RlZmluZSBTU0xfT1BfTUlDUk9TT0ZUX0JJR19TU0xWM19CVUZGRVIJCTB4MDAwMDAwMjBMCisjZGVmaW5lIFNTTF9PUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HCQkJMHgwMDAwMDA0MEwgLyogbm8gZWZmZWN0IHNpbmNlIDAuOS43aCBhbmQgMC45LjhiICovCisjZGVmaW5lIFNTTF9PUF9TU0xFQVlfMDgwX0NMSUVOVF9ESF9CVUcJCQkweDAwMDAwMDgwTAorI2RlZmluZSBTU0xfT1BfVExTX0Q1X0JVRwkJCQkweDAwMDAwMTAwTAorI2RlZmluZSBTU0xfT1BfVExTX0JMT0NLX1BBRERJTkdfQlVHCQkJMHgwMDAwMDIwMEwKKworLyogRGlzYWJsZSBTU0wgMy4wL1RMUyAxLjAgQ0JDIHZ1bG5lcmFiaWxpdHkgd29ya2Fyb3VuZCB0aGF0IHdhcyBhZGRlZAorICogaW4gT3BlblNTTCAwLjkuNmQuICBVc3VhbGx5IChkZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uIHByb3RvY29sKQorICogdGhlIHdvcmthcm91bmQgaXMgbm90IG5lZWRlZC4gIFVuZm9ydHVuYXRlbHkgc29tZSBicm9rZW4gU1NML1RMUworICogaW1wbGVtZW50YXRpb25zIGNhbm5vdCBoYW5kbGUgaXQgYXQgYWxsLCB3aGljaCBpcyB3aHkgd2UgaW5jbHVkZQorICogaXQgaW4gU1NMX09QX0FMTC4gKi8KKyNkZWZpbmUgU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyAgICAgICAgICAgICAgMHgwMDAwMDgwMEwgLyogYWRkZWQgaW4gMC45LjZlICovCisKKy8qIFNTTF9PUF9BTEw6IHZhcmlvdXMgYnVnIHdvcmthcm91bmRzIHRoYXQgc2hvdWxkIGJlIHJhdGhlciBoYXJtbGVzcy4KKyAqICAgICAgICAgICAgIFRoaXMgdXNlZCB0byBiZSAweDAwMEZGRkZGTCBiZWZvcmUgMC45LjcuICovCisjZGVmaW5lIFNTTF9PUF9BTEwJCQkJCTB4ODAwMDBGRkZMCisKKy8qIERUTFMgb3B0aW9ucyAqLworI2RlZmluZSBTU0xfT1BfTk9fUVVFUllfTVRVICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorLyogVHVybiBvbiBDb29raWUgRXhjaGFuZ2UgKG9uIHJlbGV2YW50IGZvciBzZXJ2ZXJzKSAqLworI2RlZmluZSBTU0xfT1BfQ09PS0lFX0VYQ0hBTkdFICAgICAgICAgICAgICAweDAwMDAyMDAwTAorLyogRG9uJ3QgdXNlIFJGQzQ1MDcgdGlja2V0IGV4dGVuc2lvbiAqLworI2RlZmluZSBTU0xfT1BfTk9fVElDS0VUCSAgICAgICAgICAgIDB4MDAwMDQwMDBMCisvKiBVc2UgQ2lzY28ncyAic3Blc2h1bCIgdmVyc2lvbiBvZiBEVExTX0JBRF9WRVIgKGFzIGNsaWVudCkgICovCisjZGVmaW5lIFNTTF9PUF9DSVNDT19BTllDT05ORUNUCQkgICAgMHgwMDAwODAwMEwKKworLyogQXMgc2VydmVyLCBkaXNhbGxvdyBzZXNzaW9uIHJlc3VtcHRpb24gb24gcmVuZWdvdGlhdGlvbiAqLworI2RlZmluZSBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04JMHgwMDAxMDAwMEwKKy8qIERvbid0IHVzZSBjb21wcmVzc2lvbiBldmVuIGlmIHN1cHBvcnRlZCAqLworI2RlZmluZSBTU0xfT1BfTk9fQ09NUFJFU1NJT04JCQkJMHgwMDAyMDAwMEwKKy8qIFBlcm1pdCB1bnNhZmUgbGVnYWN5IHJlbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgU1NMX09QX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTgkweDAwMDQwMDAwTAorLyogSWYgc2V0LCBhbHdheXMgY3JlYXRlIGEgbmV3IGtleSB3aGVuIHVzaW5nIHRtcF9lY2RoIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgU1NMX09QX1NJTkdMRV9FQ0RIX1VTRQkJCQkweDAwMDgwMDAwTAorLyogSWYgc2V0LCBhbHdheXMgY3JlYXRlIGEgbmV3IGtleSB3aGVuIHVzaW5nIHRtcF9kaCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFNTTF9PUF9TSU5HTEVfREhfVVNFCQkJCTB4MDAxMDAwMDBMCisvKiBTZXQgdG8gYWx3YXlzIHVzZSB0aGUgdG1wX3JzYSBrZXkgd2hlbiBkb2luZyBSU0Egb3BlcmF0aW9ucywKKyAqIGV2ZW4gd2hlbiB0aGlzIHZpb2xhdGVzIHByb3RvY29sIHNwZWNzICovCisjZGVmaW5lIFNTTF9PUF9FUEhFTUVSQUxfUlNBCQkJCTB4MDAyMDAwMDBMCisvKiBTZXQgb24gc2VydmVycyB0byBjaG9vc2UgdGhlIGNpcGhlciBhY2NvcmRpbmcgdG8gdGhlIHNlcnZlcidzCisgKiBwcmVmZXJlbmNlcyAqLworI2RlZmluZSBTU0xfT1BfQ0lQSEVSX1NFUlZFUl9QUkVGRVJFTkNFCQkJMHgwMDQwMDAwMEwKKy8qIElmIHNldCwgYSBzZXJ2ZXIgd2lsbCBhbGxvdyBhIGNsaWVudCB0byBpc3N1ZSBhIFNTTHYzLjAgdmVyc2lvbiBudW1iZXIKKyAqIGFzIGxhdGVzdCB2ZXJzaW9uIHN1cHBvcnRlZCBpbiB0aGUgcHJlbWFzdGVyIHNlY3JldCwgZXZlbiB3aGVuIFRMU3YxLjAKKyAqICh2ZXJzaW9uIDMuMSkgd2FzIGFubm91bmNlZCBpbiB0aGUgY2xpZW50IGhlbGxvLiBOb3JtYWxseSB0aGlzIGlzCisgKiBmb3JiaWRkZW4gdG8gcHJldmVudCB2ZXJzaW9uIHJvbGxiYWNrIGF0dGFja3MuICovCisjZGVmaW5lIFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHCQkJCTB4MDA4MDAwMDBMCisKKyNkZWZpbmUgU1NMX09QX05PX1NTTHYyCQkJCQkweDAxMDAwMDAwTAorI2RlZmluZSBTU0xfT1BfTk9fU1NMdjMJCQkJCTB4MDIwMDAwMDBMCisjZGVmaW5lIFNTTF9PUF9OT19UTFN2MQkJCQkJMHgwNDAwMDAwMEwKKworLyogVGhlIG5leHQgZmxhZyBkZWxpYmVyYXRlbHkgY2hhbmdlcyB0aGUgY2lwaGVydGVzdCwgdGhpcyBpcyBhIGNoZWNrCisgKiBmb3IgdGhlIFBLQ1MjMSBhdHRhY2sgKi8KKyNkZWZpbmUgU1NMX09QX1BLQ1MxX0NIRUNLXzEJCQkJMHgwODAwMDAwMEwKKyNkZWZpbmUgU1NMX09QX1BLQ1MxX0NIRUNLXzIJCQkJMHgxMDAwMDAwMEwKKyNkZWZpbmUgU1NMX09QX05FVFNDQVBFX0NBX0ROX0JVRwkJCTB4MjAwMDAwMDBMCisjZGVmaW5lIFNTTF9PUF9ORVRTQ0FQRV9ERU1PX0NJUEhFUl9DSEFOR0VfQlVHCQkweDQwMDAwMDAwTAorLyogTWFrZSBzZXJ2ZXIgYWRkIHNlcnZlci1oZWxsbyBleHRlbnNpb24gZnJvbSBlYXJseSB2ZXJzaW9uIG9mCisgKiBjcnlwdG9wcm8gZHJhZnQsIHdoZW4gR09TVCBjaXBoZXJzdWl0ZSBpcyBuZWdvdGlhdGVkLiAKKyAqIFJlcXVpcmVkIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggQ3J5cHRvUHJvIENTUCAzLnggCisgKi8KKyNkZWZpbmUgU1NMX09QX0NSWVBUT1BST19UTFNFWFRfQlVHCQkJMHg4MDAwMDAwMEwKKworLyogQWxsb3cgU1NMX3dyaXRlKC4uLiwgbikgdG8gcmV0dXJuIHIgd2l0aCAwIDwgciA8IG4gKGkuZS4gcmVwb3J0IHN1Y2Nlc3MKKyAqIHdoZW4ganVzdCBhIHNpbmdsZSByZWNvcmQgaGFzIGJlZW4gd3JpdHRlbik6ICovCisjZGVmaW5lIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFICAgICAgIDB4MDAwMDAwMDFMCisvKiBNYWtlIGl0IHBvc3NpYmxlIHRvIHJldHJ5IFNTTF93cml0ZSgpIHdpdGggY2hhbmdlZCBidWZmZXIgbG9jYXRpb24KKyAqIChidWZmZXIgY29udGVudHMgbXVzdCBzdGF5IHRoZSBzYW1lISk7IHRoaXMgaXMgbm90IHRoZSBkZWZhdWx0IHRvIGF2b2lkCisgKiB0aGUgbWlzY29uY2VwdGlvbiB0aGF0IG5vbi1ibG9ja2luZyBTU0xfd3JpdGUoKSBiZWhhdmVzIGxpa2UKKyAqIG5vbi1ibG9ja2luZyB3cml0ZSgpOiAqLworI2RlZmluZSBTU0xfTU9ERV9BQ0NFUFRfTU9WSU5HX1dSSVRFX0JVRkZFUiAweDAwMDAwMDAyTAorLyogTmV2ZXIgYm90aGVyIHRoZSBhcHBsaWNhdGlvbiB3aXRoIHJldHJpZXMgaWYgdGhlIHRyYW5zcG9ydAorICogaXMgYmxvY2tpbmc6ICovCisjZGVmaW5lIFNTTF9NT0RFX0FVVE9fUkVUUlkgMHgwMDAwMDAwNEwKKy8qIERvbid0IGF0dGVtcHQgdG8gYXV0b21hdGljYWxseSBidWlsZCBjZXJ0aWZpY2F0ZSBjaGFpbiAqLworI2RlZmluZSBTU0xfTU9ERV9OT19BVVRPX0NIQUlOIDB4MDAwMDAwMDhMCisvKiBTYXZlIFJBTSBieSByZWxlYXNpbmcgcmVhZCBhbmQgd3JpdGUgYnVmZmVycyB3aGVuIHRoZXkncmUgZW1wdHkuIChTU0wzIGFuZAorICogVExTIG9ubHkuKSAgIlJlbGVhc2VkIiBidWZmZXJzIGFyZSBwdXQgb250byBhIGZyZWUtbGlzdCBpbiB0aGUgY29udGV4dAorICogb3IganVzdCBmcmVlZCAoZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0J3Mgc2V0dGluZyBmb3IgZnJlZWxpc3RfbWF4X2xlbikuICovCisjZGVmaW5lIFNTTF9NT0RFX1JFTEVBU0VfQlVGRkVSUyAweDAwMDAwMDEwTAorLyogVXNlIHNtYWxsIHJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnM6IChhKSBsYXp5IGFsbG9jYXRlIHJlYWQgYnVmZmVycyBmb3IKKyAqIGxhcmdlIGluY29taW5nIHJlY29yZHMsIGFuZCAoYikgbGltaXQgdGhlIHNpemUgb2Ygb3V0Z29pbmcgcmVjb3Jkcy4gKi8KKyNkZWZpbmUgU1NMX01PREVfU01BTExfQlVGRkVSUyAweDAwMDAwMDIwTAorLyogV2hlbiBzZXQsIGNsaWVudHMgbWF5IHNlbmQgYXBwbGljYXRpb24gZGF0YSBiZWZvcmUgcmVjZWlwdCBvZiBDQ1MKKyAqIGFuZCBGaW5pc2hlZC4gIFRoaXMgbW9kZSBlbmFibGVzIGZ1bGwtaGFuZHNoYWtlcyB0byAnY29tcGxldGUnIGluCisgKiBvbmUgUlRULiAqLworI2RlZmluZSBTU0xfTU9ERV9IQU5EU0hBS0VfQ1VUVEhST1VHSCAweDAwMDAwMDQwTAorCisvKiBOb3RlOiBTU0xbX0NUWF1fc2V0X3tvcHRpb25zLG1vZGV9IHVzZSB8PSBvcCBvbiB0aGUgcHJldmlvdXMgdmFsdWUsCisgKiB0aGV5IGNhbm5vdCBiZSB1c2VkIHRvIGNsZWFyIGJpdHMuICovCisKKyNkZWZpbmUgU1NMX0NUWF9zZXRfb3B0aW9ucyhjdHgsb3ApIFwKKwlTU0xfQ1RYX2N0cmwoKGN0eCksU1NMX0NUUkxfT1BUSU9OUywob3ApLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfY2xlYXJfb3B0aW9ucyhjdHgsb3ApIFwKKwlTU0xfQ1RYX2N0cmwoKGN0eCksU1NMX0NUUkxfQ0xFQVJfT1BUSU9OUywob3ApLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfZ2V0X29wdGlvbnMoY3R4KSBcCisJU1NMX0NUWF9jdHJsKChjdHgpLFNTTF9DVFJMX09QVElPTlMsMCxOVUxMKQorI2RlZmluZSBTU0xfc2V0X29wdGlvbnMoc3NsLG9wKSBcCisJU1NMX2N0cmwoKHNzbCksU1NMX0NUUkxfT1BUSU9OUywob3ApLE5VTEwpCisjZGVmaW5lIFNTTF9jbGVhcl9vcHRpb25zKHNzbCxvcCkgXAorCVNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX0NMRUFSX09QVElPTlMsKG9wKSxOVUxMKQorI2RlZmluZSBTU0xfZ2V0X29wdGlvbnMoc3NsKSBcCisgICAgICAgIFNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX09QVElPTlMsMCxOVUxMKQorCisjZGVmaW5lIFNTTF9DVFhfc2V0X21vZGUoY3R4LG9wKSBcCisJU1NMX0NUWF9jdHJsKChjdHgpLFNTTF9DVFJMX01PREUsKG9wKSxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX2NsZWFyX21vZGUoY3R4LG9wKSBcCisJU1NMX0NUWF9jdHJsKChjdHgpLFNTTF9DVFJMX0NMRUFSX01PREUsKG9wKSxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX2dldF9tb2RlKGN0eCkgXAorCVNTTF9DVFhfY3RybCgoY3R4KSxTU0xfQ1RSTF9NT0RFLDAsTlVMTCkKKyNkZWZpbmUgU1NMX2NsZWFyX21vZGUoc3NsLG9wKSBcCisJU1NMX2N0cmwoKHNzbCksU1NMX0NUUkxfQ0xFQVJfTU9ERSwob3ApLE5VTEwpCisjZGVmaW5lIFNTTF9zZXRfbW9kZShzc2wsb3ApIFwKKwlTU0xfY3RybCgoc3NsKSxTU0xfQ1RSTF9NT0RFLChvcCksTlVMTCkKKyNkZWZpbmUgU1NMX2dldF9tb2RlKHNzbCkgXAorICAgICAgICBTU0xfY3RybCgoc3NsKSxTU0xfQ1RSTF9NT0RFLDAsTlVMTCkKKyNkZWZpbmUgU1NMX3NldF9tdHUoc3NsLCBtdHUpIFwKKyAgICAgICAgU1NMX2N0cmwoKHNzbCksU1NMX0NUUkxfU0VUX01UVSwobXR1KSxOVUxMKQorCisjZGVmaW5lIFNTTF9nZXRfc2VjdXJlX3JlbmVnb3RpYXRpb25fc3VwcG9ydChzc2wpIFwKKwlTU0xfY3RybCgoc3NsKSwgU1NMX0NUUkxfR0VUX1JJX1NVUFBPUlQsIDAsIE5VTEwpCisKK3ZvaWQgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwgdm9pZCAoKmNiKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykpOwordm9pZCBTU0xfc2V0X21zZ19jYWxsYmFjayhTU0wgKnNzbCwgdm9pZCAoKmNiKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykpOworI2RlZmluZSBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2tfYXJnKGN0eCwgYXJnKSBTU0xfQ1RYX2N0cmwoKGN0eCksIFNTTF9DVFJMX1NFVF9NU0dfQ0FMTEJBQ0tfQVJHLCAwLCAoYXJnKSkKKyNkZWZpbmUgU1NMX3NldF9tc2dfY2FsbGJhY2tfYXJnKHNzbCwgYXJnKSBTU0xfY3RybCgoc3NsKSwgU1NMX0NUUkxfU0VUX01TR19DQUxMQkFDS19BUkcsIDAsIChhcmcpKQorCisKKworI2lmIGRlZmluZWQoT1BFTlNTTF9TWVNfTVNET1MpICYmICFkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTjMyKQorI2RlZmluZSBTU0xfTUFYX0NFUlRfTElTVF9ERUZBVUxUIDEwMjQqMzAgLyogMzBrIG1heCBjZXJ0IGxpc3QgOi0pICovCisjZWxzZQorI2RlZmluZSBTU0xfTUFYX0NFUlRfTElTVF9ERUZBVUxUIDEwMjQqMTAwIC8qIDEwMGsgbWF4IGNlcnQgbGlzdCA6LSkgKi8KKyNlbmRpZgorCisjZGVmaW5lIFNTTF9TRVNTSU9OX0NBQ0hFX01BWF9TSVpFX0RFRkFVTFQJKDEwMjQqMjApCisKKy8qIFRoaXMgY2FsbGJhY2sgdHlwZSBpcyB1c2VkIGluc2lkZSBTU0xfQ1RYLCBTU0wsIGFuZCBpbiB0aGUgZnVuY3Rpb25zIHRoYXQgc2V0CisgKiB0aGVtLiBJdCBpcyB1c2VkIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmF0aW9uIG9mIFNTTC9UTFMgc2Vzc2lvbiBJRHMgaW4gYQorICogc2VydmVyLiBSZXR1cm4gdmFsdWUgc2hvdWxkIGJlIHplcm8gb24gYW4gZXJyb3IsIG5vbi16ZXJvIHRvIHByb2NlZWQuIEFsc28sCisgKiBjYWxsYmFja3Mgc2hvdWxkIHRoZW1zZWx2ZXMgY2hlY2sgaWYgdGhlIGlkIHRoZXkgZ2VuZXJhdGUgaXMgdW5pcXVlIG90aGVyd2lzZQorICogdGhlIFNTTCBoYW5kc2hha2Ugd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgLSBjYWxsYmFja3MgY2FuIGRvIHRoaXMgdXNpbmcgdGhlCisgKiAnc3NsJyB2YWx1ZSB0aGV5J3JlIHBhc3NlZCBieTsKKyAqICAgICAgU1NMX2hhc19tYXRjaGluZ19zZXNzaW9uX2lkKHNzbCwgaWQsICppZF9sZW4pCisgKiBUaGUgbGVuZ3RoIHZhbHVlIHBhc3NlZCBpbiBpcyBzZXQgYXQgdGhlIG1heGltdW0gc2l6ZSB0aGUgc2Vzc2lvbiBJRCBjYW4gYmUuCisgKiBJbiBTU0x2MiB0aGlzIGlzIDE2IGJ5dGVzLCB3aGVyZWFzIFNTTHYzL1RMU3YxIGl0IGlzIDMyIGJ5dGVzLiBUaGUgY2FsbGJhY2sKKyAqIGNhbiBhbHRlciB0aGlzIGxlbmd0aCB0byBiZSBsZXNzIGlmIGRlc2lyZWQsIGJ1dCB1bmRlciBTU0x2MiBzZXNzaW9uIElEcyBhcmUKKyAqIHN1cHBvc2VkIHRvIGJlIGZpeGVkIGF0IDE2IGJ5dGVzIHNvIHRoZSBpZCB3aWxsIGJlIHBhZGRlZCBhZnRlciB0aGUgY2FsbGJhY2sKKyAqIHJldHVybnMgaW4gdGhpcyBjYXNlLiBJdCBpcyBhbHNvIGFuIGVycm9yIGZvciB0aGUgY2FsbGJhY2sgdG8gc2V0IHRoZSBzaXplIHRvCisgKiB6ZXJvLiAqLwordHlwZWRlZiBpbnQgKCpHRU5fU0VTU0lPTl9DQikoY29uc3QgU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKmlkLAorCQkJCXVuc2lnbmVkIGludCAqaWRfbGVuKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc3NsX2NvbXBfc3QKKwl7CisJaW50IGlkOworCWNvbnN0IGNoYXIgKm5hbWU7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCUNPTVBfTUVUSE9EICptZXRob2Q7CisjZWxzZQorCWNoYXIgKm1ldGhvZDsKKyNlbmRpZgorCX0gU1NMX0NPTVA7CisKK0RFQ0xBUkVfU1RBQ0tfT0YoU1NMX0NPTVApCitERUNMQVJFX0xIQVNIX09GKFNTTF9TRVNTSU9OKTsKKworc3RydWN0IHNzbF9jdHhfc3QKKwl7CisJY29uc3QgU1NMX01FVEhPRCAqbWV0aG9kOworCisJU1RBQ0tfT0YoU1NMX0NJUEhFUikgKmNpcGhlcl9saXN0OworCS8qIHNhbWUgYXMgYWJvdmUgYnV0IHNvcnRlZCBmb3IgbG9va3VwICovCisJU1RBQ0tfT0YoU1NMX0NJUEhFUikgKmNpcGhlcl9saXN0X2J5X2lkOworCisJc3RydWN0IHg1MDlfc3RvcmVfc3QgLyogWDUwOV9TVE9SRSAqLyAqY2VydF9zdG9yZTsKKwlMSEFTSF9PRihTU0xfU0VTU0lPTikgKnNlc3Npb25zOworCS8qIE1vc3Qgc2Vzc2lvbi1pZHMgdGhhdCB3aWxsIGJlIGNhY2hlZCwgZGVmYXVsdCBpcworCSAqIFNTTF9TRVNTSU9OX0NBQ0hFX01BWF9TSVpFX0RFRkFVTFQuIDAgaXMgdW5saW1pdGVkLiAqLworCXVuc2lnbmVkIGxvbmcgc2Vzc2lvbl9jYWNoZV9zaXplOworCXN0cnVjdCBzc2xfc2Vzc2lvbl9zdCAqc2Vzc2lvbl9jYWNoZV9oZWFkOworCXN0cnVjdCBzc2xfc2Vzc2lvbl9zdCAqc2Vzc2lvbl9jYWNoZV90YWlsOworCisJLyogVGhpcyBjYW4gaGF2ZSBvbmUgb2YgMiB2YWx1ZXMsIG9yZWQgdG9nZXRoZXIsCisJICogU1NMX1NFU1NfQ0FDSEVfQ0xJRU5ULAorCSAqIFNTTF9TRVNTX0NBQ0hFX1NFUlZFUiwKKwkgKiBEZWZhdWx0IGlzIFNTTF9TRVNTSU9OX0NBQ0hFX1NFUlZFUiwgd2hpY2ggbWVhbnMgb25seQorCSAqIFNTTF9hY2NlcHQgd2hpY2ggY2FjaGUgU1NMX1NFU1NJT05TLiAqLworCWludCBzZXNzaW9uX2NhY2hlX21vZGU7CisKKwkvKiBJZiB0aW1lb3V0IGlzIG5vdCAwLCBpdCBpcyB0aGUgZGVmYXVsdCB0aW1lb3V0IHZhbHVlIHNldAorCSAqIHdoZW4gU1NMX25ldygpIGlzIGNhbGxlZC4gIFRoaXMgaGFzIGJlZW4gcHV0IGluIHRvIG1ha2UKKwkgKiBsaWZlIGVhc2llciB0byBzZXQgdGhpbmdzIHVwICovCisJbG9uZyBzZXNzaW9uX3RpbWVvdXQ7CisKKwkvKiBJZiB0aGlzIGNhbGxiYWNrIGlzIG5vdCBudWxsLCBpdCB3aWxsIGJlIGNhbGxlZCBlYWNoCisJICogdGltZSBhIHNlc3Npb24gaWQgaXMgYWRkZWQgdG8gdGhlIGNhY2hlLiAgSWYgdGhpcyBmdW5jdGlvbgorCSAqIHJldHVybnMgMSwgaXQgbWVhbnMgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBkbyBhCisJICogU1NMX1NFU1NJT05fZnJlZSgpIHdoZW4gaXQgaGFzIGZpbmlzaGVkIHVzaW5nIGl0LiAgT3RoZXJ3aXNlLAorCSAqIG9uIDAsIGl0IG1lYW5zIHRoZSBjYWxsYmFjayBoYXMgZmluaXNoZWQgd2l0aCBpdC4KKwkgKiBJZiByZW1vdmVfc2Vzc2lvbl9jYiBpcyBub3QgbnVsbCwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbgorCSAqIGEgc2Vzc2lvbi1pZCBpcyByZW1vdmVkIGZyb20gdGhlIGNhY2hlLiAgQWZ0ZXIgdGhlIGNhbGwsCisJICogT3BlblNTTCB3aWxsIFNTTF9TRVNTSU9OX2ZyZWUoKSBpdC4gKi8KKwlpbnQgKCpuZXdfc2Vzc2lvbl9jYikoc3RydWN0IHNzbF9zdCAqc3NsLFNTTF9TRVNTSU9OICpzZXNzKTsKKwl2b2lkICgqcmVtb3ZlX3Nlc3Npb25fY2IpKHN0cnVjdCBzc2xfY3R4X3N0ICpjdHgsU1NMX1NFU1NJT04gKnNlc3MpOworCVNTTF9TRVNTSU9OICooKmdldF9zZXNzaW9uX2NiKShzdHJ1Y3Qgc3NsX3N0ICpzc2wsCisJCXVuc2lnbmVkIGNoYXIgKmRhdGEsaW50IGxlbixpbnQgKmNvcHkpOworCisJc3RydWN0CisJCXsKKwkJaW50IHNlc3NfY29ubmVjdDsJLyogU1NMIG5ldyBjb25uIC0gc3RhcnRlZCAqLworCQlpbnQgc2Vzc19jb25uZWN0X3JlbmVnb3RpYXRlOy8qIFNTTCByZW5lZyAtIHJlcXVlc3RlZCAqLworCQlpbnQgc2Vzc19jb25uZWN0X2dvb2Q7CS8qIFNTTCBuZXcgY29ubmUvcmVuZWcgLSBmaW5pc2hlZCAqLworCQlpbnQgc2Vzc19hY2NlcHQ7CS8qIFNTTCBuZXcgYWNjZXB0IC0gc3RhcnRlZCAqLworCQlpbnQgc2Vzc19hY2NlcHRfcmVuZWdvdGlhdGU7LyogU1NMIHJlbmVnIC0gcmVxdWVzdGVkICovCisJCWludCBzZXNzX2FjY2VwdF9nb29kOwkvKiBTU0wgYWNjZXB0L3JlbmVnIC0gZmluaXNoZWQgKi8KKwkJaW50IHNlc3NfbWlzczsJCS8qIHNlc3Npb24gbG9va3VwIG1pc3NlcyAgKi8KKwkJaW50IHNlc3NfdGltZW91dDsJLyogcmV1c2UgYXR0ZW1wdCBvbiB0aW1lb3V0ZWQgc2Vzc2lvbiAqLworCQlpbnQgc2Vzc19jYWNoZV9mdWxsOwkvKiBzZXNzaW9uIHJlbW92ZWQgZHVlIHRvIGZ1bGwgY2FjaGUgKi8KKwkJaW50IHNlc3NfaGl0OwkJLyogc2Vzc2lvbiByZXVzZSBhY3R1YWxseSBkb25lICovCisJCWludCBzZXNzX2NiX2hpdDsJLyogc2Vzc2lvbi1pZCB0aGF0IHdhcyBub3QKKwkJCQkJICogaW4gdGhlIGNhY2hlIHdhcworCQkJCQkgKiBwYXNzZWQgYmFjayB2aWEgdGhlIGNhbGxiYWNrLiAgVGhpcworCQkJCQkgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMKKwkJCQkJICogc3VwcGx5aW5nIHNlc3Npb24taWQncyBmcm9tIG90aGVyCisJCQkJCSAqIHByb2Nlc3NlcyAtIHNwb29reSA6LSkgKi8KKwkJfSBzdGF0czsKKworCWludCByZWZlcmVuY2VzOworCisJLyogaWYgZGVmaW5lZCwgdGhlc2Ugb3ZlcnJpZGUgdGhlIFg1MDlfdmVyaWZ5X2NlcnQoKSBjYWxscyAqLworCWludCAoKmFwcF92ZXJpZnlfY2FsbGJhY2spKFg1MDlfU1RPUkVfQ1RYICosIHZvaWQgKik7CisJdm9pZCAqYXBwX3ZlcmlmeV9hcmc7CisJLyogYmVmb3JlIE9wZW5TU0wgMC45LjcsICdhcHBfdmVyaWZ5X2FyZycgd2FzIGlnbm9yZWQKKwkgKiAoJ2FwcF92ZXJpZnlfY2FsbGJhY2snIHdhcyBjYWxsZWQgd2l0aCBqdXN0IG9uZSBhcmd1bWVudCkgKi8KKworCS8qIERlZmF1bHQgcGFzc3dvcmQgY2FsbGJhY2suICovCisJcGVtX3Bhc3N3b3JkX2NiICpkZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjazsKKworCS8qIERlZmF1bHQgcGFzc3dvcmQgY2FsbGJhY2sgdXNlciBkYXRhLiAqLworCXZvaWQgKmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhOworCisJLyogZ2V0IGNsaWVudCBjZXJ0IGNhbGxiYWNrICovCisJaW50ICgqY2xpZW50X2NlcnRfY2IpKFNTTCAqc3NsLCBYNTA5ICoqeDUwOSwgRVZQX1BLRVkgKipwa2V5KTsKKworICAgIC8qIGNvb2tpZSBnZW5lcmF0ZSBjYWxsYmFjayAqLworICAgIGludCAoKmFwcF9nZW5fY29va2llX2NiKShTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqY29va2llLCAKKyAgICAgICAgdW5zaWduZWQgaW50ICpjb29raWVfbGVuKTsKKworICAgIC8qIHZlcmlmeSBjb29raWUgY2FsbGJhY2sgKi8KKyAgICBpbnQgKCphcHBfdmVyaWZ5X2Nvb2tpZV9jYikoU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKmNvb2tpZSwgCisgICAgICAgIHVuc2lnbmVkIGludCBjb29raWVfbGVuKTsKKworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisKKwljb25zdCBFVlBfTUQgKnJzYV9tZDU7LyogRm9yIFNTTHYyIC0gbmFtZSBpcyAnc3NsMi1tZDUnICovCisJY29uc3QgRVZQX01EICptZDU7CS8qIEZvciBTU0x2My9UTFN2MSAnc3NsMy1tZDUnICovCisJY29uc3QgRVZQX01EICpzaGExOyAgIC8qIEZvciBTU0x2My9UTFN2MSAnc3NsMy0+c2hhMScgKi8KKworCVNUQUNLX09GKFg1MDkpICpleHRyYV9jZXJ0czsKKwlTVEFDS19PRihTU0xfQ09NUCkgKmNvbXBfbWV0aG9kczsgLyogc3RhY2sgb2YgU1NMX0NPTVAsIFNTTHYzL1RMU3YxICovCisKKworCS8qIERlZmF1bHQgdmFsdWVzIHVzZWQgd2hlbiBubyBwZXItU1NMIHZhbHVlIGlzIGRlZmluZWQgZm9sbG93ICovCisKKwl2b2lkICgqaW5mb19jYWxsYmFjaykoY29uc3QgU1NMICpzc2wsaW50IHR5cGUsaW50IHZhbCk7IC8qIHVzZWQgaWYgU1NMJ3MgaW5mb19jYWxsYmFjayBpcyBOVUxMICovCisKKwkvKiB3aGF0IHdlIHB1dCBpbiBjbGllbnQgY2VydCByZXF1ZXN0cyAqLworCVNUQUNLX09GKFg1MDlfTkFNRSkgKmNsaWVudF9DQTsKKworCisJLyogRGVmYXVsdCB2YWx1ZXMgdG8gdXNlIGluIFNTTCBzdHJ1Y3R1cmVzIGZvbGxvdyAodGhlc2UgYXJlIGNvcGllZCBieSBTU0xfbmV3KSAqLworCisJdW5zaWduZWQgbG9uZyBvcHRpb25zOworCXVuc2lnbmVkIGxvbmcgbW9kZTsKKwlsb25nIG1heF9jZXJ0X2xpc3Q7CisKKwlzdHJ1Y3QgY2VydF9zdCAvKiBDRVJUICovICpjZXJ0OworCWludCByZWFkX2FoZWFkOworCisJLyogY2FsbGJhY2sgdGhhdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHBlZWsgYXQgcHJvdG9jb2wgbWVzc2FnZXMgKi8KKwl2b2lkICgqbXNnX2NhbGxiYWNrKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZyk7CisJdm9pZCAqbXNnX2NhbGxiYWNrX2FyZzsKKworCWludCB2ZXJpZnlfbW9kZTsKKwl1bnNpZ25lZCBpbnQgc2lkX2N0eF9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBzaWRfY3R4W1NTTF9NQVhfU0lEX0NUWF9MRU5HVEhdOworCWludCAoKmRlZmF1bHRfdmVyaWZ5X2NhbGxiYWNrKShpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmN0eCk7IC8qIGNhbGxlZCAndmVyaWZ5X2NhbGxiYWNrJyBpbiB0aGUgU1NMICovCisKKwkvKiBEZWZhdWx0IGdlbmVyYXRlIHNlc3Npb24gSUQgY2FsbGJhY2suICovCisJR0VOX1NFU1NJT05fQ0IgZ2VuZXJhdGVfc2Vzc2lvbl9pZDsKKworCVg1MDlfVkVSSUZZX1BBUkFNICpwYXJhbTsKKworI2lmIDAKKwlpbnQgcHVycG9zZTsJCS8qIFB1cnBvc2Ugc2V0dGluZyAqLworCWludCB0cnVzdDsJCS8qIFRydXN0IHNldHRpbmcgKi8KKyNlbmRpZgorCisJaW50IHF1aWV0X3NodXRkb3duOworCisJLyogTWF4aW11bSBhbW91bnQgb2YgZGF0YSB0byBzZW5kIGluIG9uZSBmcmFnbWVudC4KKwkgKiBhY3R1YWwgcmVjb3JkIHNpemUgY2FuIGJlIG1vcmUgdGhhbiB0aGlzIGR1ZSB0bworCSAqIHBhZGRpbmcgYW5kIE1BQyBvdmVyaGVhZHMuCisJICovCisJdW5zaWduZWQgaW50IG1heF9zZW5kX2ZyYWdtZW50OworCisjaWZuZGVmIE9QRU5TU0xfRU5HSU5FCisJLyogRW5naW5lIHRvIHBhc3MgcmVxdWVzdHMgZm9yIGNsaWVudCBjZXJ0cyB0bworCSAqLworCUVOR0lORSAqY2xpZW50X2NlcnRfZW5naW5lOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkvKiBUTFMgZXh0ZW5zaW9ucyBzZXJ2ZXJuYW1lIGNhbGxiYWNrICovCisJaW50ICgqdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2spKFNTTCosIGludCAqLCB2b2lkICopOworCXZvaWQgKnRsc2V4dF9zZXJ2ZXJuYW1lX2FyZzsKKwkvKiBSRkMgNDUwNyBzZXNzaW9uIHRpY2tldCBrZXlzICovCisJdW5zaWduZWQgY2hhciB0bHNleHRfdGlja19rZXlfbmFtZVsxNl07CisJdW5zaWduZWQgY2hhciB0bHNleHRfdGlja19obWFjX2tleVsxNl07CisJdW5zaWduZWQgY2hhciB0bHNleHRfdGlja19hZXNfa2V5WzE2XTsKKwkvKiBDYWxsYmFjayB0byBzdXBwb3J0IGN1c3RvbWlzYXRpb24gb2YgdGlja2V0IGtleSBzZXR0aW5nICovCisJaW50ICgqdGxzZXh0X3RpY2tldF9rZXlfY2IpKFNTTCAqc3NsLAorCQkJCQl1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBjaGFyICppdiwKKwkJCQkJRVZQX0NJUEhFUl9DVFggKmVjdHgsCisgCQkJCQlITUFDX0NUWCAqaGN0eCwgaW50IGVuYyk7CisKKwkvKiBjZXJ0aWZpY2F0ZSBzdGF0dXMgcmVxdWVzdCBpbmZvICovCisJLyogQ2FsbGJhY2sgZm9yIHN0YXR1cyByZXF1ZXN0ICovCisJaW50ICgqdGxzZXh0X3N0YXR1c19jYikoU1NMICpzc2wsIHZvaWQgKmFyZyk7CisJdm9pZCAqdGxzZXh0X3N0YXR1c19hcmc7CisKKwkvKiBkcmFmdC1yZXNjb3JsYS10bHMtb3BhcXVlLXByZi1pbnB1dC0wMC50eHQgaW5mb3JtYXRpb24gKi8KKwlpbnQgKCp0bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFjaykoU1NMICosIHZvaWQgKnBlZXJpbnB1dCwgc2l6ZV90IGxlbiwgdm9pZCAqYXJnKTsKKwl2b2lkICp0bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFja19hcmc7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCWNoYXIgKnBza19pZGVudGl0eV9oaW50OworCXVuc2lnbmVkIGludCAoKnBza19jbGllbnRfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LCBjaGFyICppZGVudGl0eSwKKwkJdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sIHVuc2lnbmVkIGNoYXIgKnBzaywKKwkJdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKTsKKwl1bnNpZ25lZCBpbnQgKCpwc2tfc2VydmVyX2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCisJCXVuc2lnbmVkIGNoYXIgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQlVGX0ZSRUVMSVNUUworI2RlZmluZSBTU0xfTUFYX0JVRl9GUkVFTElTVF9MRU5fREVGQVVMVCAzMgorCXVuc2lnbmVkIGludCBmcmVlbGlzdF9tYXhfbGVuOworCXN0cnVjdCBzc2wzX2J1Zl9mcmVlbGlzdF9zdCAqd2J1Zl9mcmVlbGlzdDsKKwlzdHJ1Y3Qgc3NsM19idWZfZnJlZWxpc3Rfc3QgKnJidWZfZnJlZWxpc3Q7CisjZW5kaWYKKwl9OworCisjZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX09GRgkJCTB4MDAwMAorI2RlZmluZSBTU0xfU0VTU19DQUNIRV9DTElFTlQJCQkweDAwMDEKKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfU0VSVkVSCQkJMHgwMDAyCisjZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX0JPVEgJKFNTTF9TRVNTX0NBQ0hFX0NMSUVOVHxTU0xfU0VTU19DQUNIRV9TRVJWRVIpCisjZGVmaW5lIFNTTF9TRVNTX0NBQ0hFX05PX0FVVE9fQ0xFQVIJCTB4MDA4MAorLyogZW5vdWdoIGNvbW1lbnRzIGFscmVhZHkgLi4uIHNlZSBTU0xfQ1RYX3NldF9zZXNzaW9uX2NhY2hlX21vZGUoMykgKi8KKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQCTB4MDEwMAorI2RlZmluZSBTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9TVE9SRQkweDAyMDAKKyNkZWZpbmUgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUwgXAorCShTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9MT09LVVB8U1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUpCisKK0xIQVNIX09GKFNTTF9TRVNTSU9OKSAqU1NMX0NUWF9zZXNzaW9ucyhTU0xfQ1RYICpjdHgpOworI2RlZmluZSBTU0xfQ1RYX3Nlc3NfbnVtYmVyKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VTU19OVU1CRVIsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3Nlc3NfY29ubmVjdChjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfQ09OTkVDVCwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19jb25uZWN0X2dvb2QoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVNTX0NPTk5FQ1RfR09PRCwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19jb25uZWN0X3JlbmVnb3RpYXRlKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VTU19DT05ORUNUX1JFTkVHT1RJQVRFLDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX2FjY2VwdChjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfQUNDRVBULDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX2FjY2VwdF9yZW5lZ290aWF0ZShjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfQUNDRVBUX1JFTkVHT1RJQVRFLDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX2FjY2VwdF9nb29kKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VTU19BQ0NFUFRfR09PRCwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19oaXRzKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VTU19ISVQsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3Nlc3NfY2JfaGl0cyhjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfQ0JfSElULDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX21pc3NlcyhjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFU1NfTUlTU0VTLDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX3RpbWVvdXRzKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VTU19USU1FT1VUUywwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2Vzc19jYWNoZV9mdWxsKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VTU19DQUNIRV9GVUxMLDAsTlVMTCkKKwordm9pZCBTU0xfQ1RYX3Nlc3Nfc2V0X25ld19jYihTU0xfQ1RYICpjdHgsIGludCAoKm5ld19zZXNzaW9uX2NiKShzdHJ1Y3Qgc3NsX3N0ICpzc2wsU1NMX1NFU1NJT04gKnNlc3MpKTsKK2ludCAoKlNTTF9DVFhfc2Vzc19nZXRfbmV3X2NiKFNTTF9DVFggKmN0eCkpKHN0cnVjdCBzc2xfc3QgKnNzbCwgU1NMX1NFU1NJT04gKnNlc3MpOwordm9pZCBTU0xfQ1RYX3Nlc3Nfc2V0X3JlbW92ZV9jYihTU0xfQ1RYICpjdHgsIHZvaWQgKCpyZW1vdmVfc2Vzc2lvbl9jYikoc3RydWN0IHNzbF9jdHhfc3QgKmN0eCxTU0xfU0VTU0lPTiAqc2VzcykpOwordm9pZCAoKlNTTF9DVFhfc2Vzc19nZXRfcmVtb3ZlX2NiKFNTTF9DVFggKmN0eCkpKHN0cnVjdCBzc2xfY3R4X3N0ICpjdHgsIFNTTF9TRVNTSU9OICpzZXNzKTsKK3ZvaWQgU1NMX0NUWF9zZXNzX3NldF9nZXRfY2IoU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqKCpnZXRfc2Vzc2lvbl9jYikoc3RydWN0IHNzbF9zdCAqc3NsLCB1bnNpZ25lZCBjaGFyICpkYXRhLGludCBsZW4saW50ICpjb3B5KSk7CitTU0xfU0VTU0lPTiAqKCpTU0xfQ1RYX3Nlc3NfZ2V0X2dldF9jYihTU0xfQ1RYICpjdHgpKShzdHJ1Y3Qgc3NsX3N0ICpzc2wsIHVuc2lnbmVkIGNoYXIgKkRhdGEsIGludCBsZW4sIGludCAqY29weSk7Cit2b2lkIFNTTF9DVFhfc2V0X2luZm9fY2FsbGJhY2soU1NMX0NUWCAqY3R4LCB2b2lkICgqY2IpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpKTsKK3ZvaWQgKCpTU0xfQ1RYX2dldF9pbmZvX2NhbGxiYWNrKFNTTF9DVFggKmN0eCkpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpOwordm9pZCBTU0xfQ1RYX3NldF9jbGllbnRfY2VydF9jYihTU0xfQ1RYICpjdHgsIGludCAoKmNsaWVudF9jZXJ0X2NiKShTU0wgKnNzbCwgWDUwOSAqKng1MDksIEVWUF9QS0VZICoqcGtleSkpOworaW50ICgqU1NMX0NUWF9nZXRfY2xpZW50X2NlcnRfY2IoU1NMX0NUWCAqY3R4KSkoU1NMICpzc2wsIFg1MDkgKip4NTA5LCBFVlBfUEtFWSAqKnBrZXkpOworI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQoraW50IFNTTF9DVFhfc2V0X2NsaWVudF9jZXJ0X2VuZ2luZShTU0xfQ1RYICpjdHgsIEVOR0lORSAqZSk7CisjZW5kaWYKK3ZvaWQgU1NMX0NUWF9zZXRfY29va2llX2dlbmVyYXRlX2NiKFNTTF9DVFggKmN0eCwgaW50ICgqYXBwX2dlbl9jb29raWVfY2IpKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICpjb29raWUsIHVuc2lnbmVkIGludCAqY29va2llX2xlbikpOwordm9pZCBTU0xfQ1RYX3NldF9jb29raWVfdmVyaWZ5X2NiKFNTTF9DVFggKmN0eCwgaW50ICgqYXBwX3ZlcmlmeV9jb29raWVfY2IpKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICpjb29raWUsIHVuc2lnbmVkIGludCBjb29raWVfbGVuKSk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKy8qIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGdpdmVuIHRvIGNhbGxiYWNrcyBjb250YWluaW5nIHRoZQorICogcmVzdWx0aW5nIGlkZW50aXR5L3BzayAqLworI2RlZmluZSBQU0tfTUFYX0lERU5USVRZX0xFTiAxMjgKKyNkZWZpbmUgUFNLX01BWF9QU0tfTEVOIDI1Ngordm9pZCBTU0xfQ1RYX3NldF9wc2tfY2xpZW50X2NhbGxiYWNrKFNTTF9DVFggKmN0eCwgCisJdW5zaWduZWQgaW50ICgqcHNrX2NsaWVudF9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIAorCQljaGFyICppZGVudGl0eSwgdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sIHVuc2lnbmVkIGNoYXIgKnBzaywKKwkJdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSk7Cit2b2lkIFNTTF9zZXRfcHNrX2NsaWVudF9jYWxsYmFjayhTU0wgKnNzbCwgCisJdW5zaWduZWQgaW50ICgqcHNrX2NsaWVudF9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIAorCQljaGFyICppZGVudGl0eSwgdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sIHVuc2lnbmVkIGNoYXIgKnBzaywKKwkJdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSk7Cit2b2lkIFNTTF9DVFhfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soU1NMX0NUWCAqY3R4LCAKKwl1bnNpZ25lZCBpbnQgKCpwc2tfc2VydmVyX2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCisJCXVuc2lnbmVkIGNoYXIgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSk7Cit2b2lkIFNTTF9zZXRfcHNrX3NlcnZlcl9jYWxsYmFjayhTU0wgKnNzbCwKKwl1bnNpZ25lZCBpbnQgKCpwc2tfc2VydmVyX2NhbGxiYWNrKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCisJCXVuc2lnbmVkIGNoYXIgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSk7CitpbnQgU1NMX0NUWF91c2VfcHNrX2lkZW50aXR5X2hpbnQoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICppZGVudGl0eV9oaW50KTsKK2ludCBTU0xfdXNlX3Bza19pZGVudGl0eV9oaW50KFNTTCAqcywgY29uc3QgY2hhciAqaWRlbnRpdHlfaGludCk7Citjb25zdCBjaGFyICpTU0xfZ2V0X3Bza19pZGVudGl0eV9oaW50KGNvbnN0IFNTTCAqcyk7Citjb25zdCBjaGFyICpTU0xfZ2V0X3Bza19pZGVudGl0eShjb25zdCBTU0wgKnMpOworI2VuZGlmCisKKyNkZWZpbmUgU1NMX05PVEhJTkcJMQorI2RlZmluZSBTU0xfV1JJVElORwkyCisjZGVmaW5lIFNTTF9SRUFESU5HCTMKKyNkZWZpbmUgU1NMX1g1MDlfTE9PS1VQCTQKKworLyogVGhlc2Ugd2lsbCBvbmx5IGJlIHVzZWQgd2hlbiBkb2luZyBub24tYmxvY2tpbmcgSU8gKi8KKyNkZWZpbmUgU1NMX3dhbnRfbm90aGluZyhzKQkoU1NMX3dhbnQocykgPT0gU1NMX05PVEhJTkcpCisjZGVmaW5lIFNTTF93YW50X3JlYWQocykJKFNTTF93YW50KHMpID09IFNTTF9SRUFESU5HKQorI2RlZmluZSBTU0xfd2FudF93cml0ZShzKQkoU1NMX3dhbnQocykgPT0gU1NMX1dSSVRJTkcpCisjZGVmaW5lIFNTTF93YW50X3g1MDlfbG9va3VwKHMpCShTU0xfd2FudChzKSA9PSBTU0xfWDUwOV9MT09LVVApCisKKyNkZWZpbmUgU1NMX01BQ19GTEFHX1JFQURfTUFDX1NUUkVBTSAxCisjZGVmaW5lIFNTTF9NQUNfRkxBR19XUklURV9NQUNfU1RSRUFNIDIKKworc3RydWN0IHNzbF9zdAorCXsKKwkvKiBwcm90b2NvbCB2ZXJzaW9uCisJICogKG9uZSBvZiBTU0wyX1ZFUlNJT04sIFNTTDNfVkVSU0lPTiwgVExTMV9WRVJTSU9OLCBEVExTMV9WRVJTSU9OKQorCSAqLworCWludCB2ZXJzaW9uOworCWludCB0eXBlOyAvKiBTU0xfU1RfQ09OTkVDVCBvciBTU0xfU1RfQUNDRVBUICovCisKKwljb25zdCBTU0xfTUVUSE9EICptZXRob2Q7IC8qIFNTTHYzICovCisKKwkvKiBUaGVyZSBhcmUgMiBCSU8ncyBldmVuIHRob3VnaCB0aGV5IGFyZSBub3JtYWxseSBib3RoIHRoZQorCSAqIHNhbWUuICBUaGlzIGlzIHNvIGRhdGEgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gdG8gZGlmZmVyZW50CisJICogaGFuZGxlcnMgKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworCUJJTyAqcmJpbzsgLyogdXNlZCBieSBTU0xfcmVhZCAqLworCUJJTyAqd2JpbzsgLyogdXNlZCBieSBTU0xfd3JpdGUgKi8KKwlCSU8gKmJiaW87IC8qIHVzZWQgZHVyaW5nIHNlc3Npb24taWQgcmV1c2UgdG8gY29uY2F0ZW5hdGUKKwkJICAgICogbWVzc2FnZXMgKi8KKyNlbHNlCisJY2hhciAqcmJpbzsgLyogdXNlZCBieSBTU0xfcmVhZCAqLworCWNoYXIgKndiaW87IC8qIHVzZWQgYnkgU1NMX3dyaXRlICovCisJY2hhciAqYmJpbzsKKyNlbmRpZgorCS8qIFRoaXMgaG9sZHMgYSB2YXJpYWJsZSB0aGF0IGluZGljYXRlcyB3aGF0IHdlIHdlcmUgZG9pbmcKKwkgKiB3aGVuIGEgMCBvciAtMSBpcyByZXR1cm5lZC4gIFRoaXMgaXMgbmVlZGVkIGZvcgorCSAqIG5vbi1ibG9ja2luZyBJTyBzbyB3ZSBrbm93IHdoYXQgcmVxdWVzdCBuZWVkcyByZS1kb2luZyB3aGVuCisJICogaW4gU1NMX2FjY2VwdCBvciBTU0xfY29ubmVjdCAqLworCWludCByd3N0YXRlOworCisJLyogdHJ1ZSB3aGVuIHdlIGFyZSBhY3R1YWxseSBpbiBTU0xfYWNjZXB0KCkgb3IgU1NMX2Nvbm5lY3QoKSAqLworCWludCBpbl9oYW5kc2hha2U7CisJaW50ICgqaGFuZHNoYWtlX2Z1bmMpKFNTTCAqKTsKKworCS8qIEltYWdpbmUgdGhhdCBoZXJlJ3MgYSBib29sZWFuIG1lbWJlciAiaW5pdCIgdGhhdCBpcworCSAqIHN3aXRjaGVkIGFzIHNvb24gYXMgU1NMX3NldF97YWNjZXB0L2Nvbm5lY3R9X3N0YXRlCisJICogaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSwgc28gdGhhdCAic3RhdGUiIGFuZAorCSAqICJoYW5kc2hha2VfZnVuYyIgYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLiAgQnV0IGFzCisJICogaGFuZHNoYWtlX2Z1bmMgaXMgPT0gMCB1bnRpbCB0aGVuLCB3ZSB1c2UgdGhpcworCSAqIHRlc3QgaW5zdGVhZCBvZiBhbiAiaW5pdCIgbWVtYmVyLgorCSAqLworCisJaW50IHNlcnZlcjsJLyogYXJlIHdlIHRoZSBzZXJ2ZXIgc2lkZT8gLSBtb3N0bHkgdXNlZCBieSBTU0xfY2xlYXIqLworCisJaW50IG5ld19zZXNzaW9uOy8qIDEgaWYgd2UgYXJlIHRvIHVzZSBhIG5ldyBzZXNzaW9uLgorCSAgICAgICAgICAgICAgICAgKiAyIGlmIHdlIGFyZSBhIHNlcnZlciBhbmQgYXJlIGluc2lkZSBhIGhhbmRzaGFrZQorCSAgICAgICAgICAgICAgICAgKiAgIChpLmUuIG5vdCBqdXN0IHNlbmRpbmcgYSBIZWxsb1JlcXVlc3QpCisJICAgICAgICAgICAgICAgICAqIE5COiBGb3Igc2VydmVycywgdGhlICduZXcnIHNlc3Npb24gbWF5IGFjdHVhbGx5IGJlIGEgcHJldmlvdXNseQorCSAgICAgICAgICAgICAgICAgKiBjYWNoZWQgc2Vzc2lvbiBvciBldmVuIHRoZSBwcmV2aW91cyBzZXNzaW9uIHVubGVzcworCSAgICAgICAgICAgICAgICAgKiBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04gaXMgc2V0ICovCisJaW50IHF1aWV0X3NodXRkb3duOy8qIGRvbid0IHNlbmQgc2h1dGRvd24gcGFja2V0cyAqLworCWludCBzaHV0ZG93bjsJLyogd2UgaGF2ZSBzaHV0IHRoaW5ncyBkb3duLCAweDAxIHNlbnQsIDB4MDIKKwkJCSAqIGZvciByZWNlaXZlZCAqLworCWludCBzdGF0ZTsJLyogd2hlcmUgd2UgYXJlICovCisJaW50IHJzdGF0ZTsJLyogd2hlcmUgd2UgYXJlIHdoZW4gcmVhZGluZyAqLworCisJQlVGX01FTSAqaW5pdF9idWY7CS8qIGJ1ZmZlciB1c2VkIGR1cmluZyBpbml0ICovCisJdm9pZCAqaW5pdF9tc2c7ICAgCS8qIHBvaW50ZXIgdG8gaGFuZHNoYWtlIG1lc3NhZ2UgYm9keSwgc2V0IGJ5IHNzbDNfZ2V0X21lc3NhZ2UoKSAqLworCWludCBpbml0X251bTsJCS8qIGFtb3VudCByZWFkL3dyaXR0ZW4gKi8KKwlpbnQgaW5pdF9vZmY7CQkvKiBhbW91bnQgcmVhZC93cml0dGVuICovCisKKwkvKiB1c2VkIGludGVybmFsbHkgdG8gcG9pbnQgYXQgYSByYXcgcGFja2V0ICovCisJdW5zaWduZWQgY2hhciAqcGFja2V0OworCXVuc2lnbmVkIGludCBwYWNrZXRfbGVuZ3RoOworCisJc3RydWN0IHNzbDJfc3RhdGVfc3QgKnMyOyAvKiBTU0x2MiB2YXJpYWJsZXMgKi8KKwlzdHJ1Y3Qgc3NsM19zdGF0ZV9zdCAqczM7IC8qIFNTTHYzIHZhcmlhYmxlcyAqLworCXN0cnVjdCBkdGxzMV9zdGF0ZV9zdCAqZDE7IC8qIERUTFN2MSB2YXJpYWJsZXMgKi8KKworCWludCByZWFkX2FoZWFkOwkJLyogUmVhZCBhcyBtYW55IGlucHV0IGJ5dGVzIGFzIHBvc3NpYmxlCisJICAgICAgICAgICAgICAgCSAJICogKGZvciBub24tYmxvY2tpbmcgcmVhZHMpICovCisKKwkvKiBjYWxsYmFjayB0aGF0IGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gcGVlayBhdCBwcm90b2NvbCBtZXNzYWdlcyAqLworCXZvaWQgKCptc2dfY2FsbGJhY2spKGludCB3cml0ZV9wLCBpbnQgdmVyc2lvbiwgaW50IGNvbnRlbnRfdHlwZSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBTU0wgKnNzbCwgdm9pZCAqYXJnKTsKKwl2b2lkICptc2dfY2FsbGJhY2tfYXJnOworCisJaW50IGhpdDsJCS8qIHJldXNpbmcgYSBwcmV2aW91cyBzZXNzaW9uICovCisKKwlYNTA5X1ZFUklGWV9QQVJBTSAqcGFyYW07CisKKyNpZiAwCisJaW50IHB1cnBvc2U7CQkvKiBQdXJwb3NlIHNldHRpbmcgKi8KKwlpbnQgdHJ1c3Q7CQkvKiBUcnVzdCBzZXR0aW5nICovCisjZW5kaWYKKworCS8qIGNyeXB0byAqLworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpjaXBoZXJfbGlzdDsKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2lwaGVyX2xpc3RfYnlfaWQ7CisKKwkvKiBUaGVzZSBhcmUgdGhlIG9uZXMgYmVpbmcgdXNlZCwgdGhlIG9uZXMgaW4gU1NMX1NFU1NJT04gYXJlCisJICogdGhlIG9uZXMgdG8gYmUgJ2NvcGllZCcgaW50byB0aGVzZSBvbmVzICovCisJaW50IG1hY19mbGFnczsgCisJRVZQX0NJUEhFUl9DVFggKmVuY19yZWFkX2N0eDsJCS8qIGNyeXB0b2dyYXBoaWMgc3RhdGUgKi8KKwlFVlBfTURfQ1RYICpyZWFkX2hhc2g7CQkvKiB1c2VkIGZvciBtYWMgZ2VuZXJhdGlvbiAqLworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwlDT01QX0NUWCAqZXhwYW5kOwkJCS8qIHVuY29tcHJlc3MgKi8KKyNlbHNlCisJY2hhciAqZXhwYW5kOworI2VuZGlmCisKKwlFVlBfQ0lQSEVSX0NUWCAqZW5jX3dyaXRlX2N0eDsJCS8qIGNyeXB0b2dyYXBoaWMgc3RhdGUgKi8KKwlFVlBfTURfQ1RYICp3cml0ZV9oYXNoOwkJLyogdXNlZCBmb3IgbWFjIGdlbmVyYXRpb24gKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJQ09NUF9DVFggKmNvbXByZXNzOwkJCS8qIGNvbXByZXNzaW9uICovCisjZWxzZQorCWNoYXIgKmNvbXByZXNzOwkKKyNlbmRpZgorCisJLyogc2Vzc2lvbiBpbmZvICovCisKKwkvKiBjbGllbnQgY2VydD8gKi8KKwkvKiBUaGlzIGlzIHVzZWQgdG8gaG9sZCB0aGUgc2VydmVyIGNlcnRpZmljYXRlIHVzZWQgKi8KKwlzdHJ1Y3QgY2VydF9zdCAvKiBDRVJUICovICpjZXJ0OworCisJLyogdGhlIHNlc3Npb25faWRfY29udGV4dCBpcyB1c2VkIHRvIGVuc3VyZSBzZXNzaW9ucyBhcmUgb25seSByZXVzZWQKKwkgKiBpbiB0aGUgYXBwcm9wcmlhdGUgY29udGV4dCAqLworCXVuc2lnbmVkIGludCBzaWRfY3R4X2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHNpZF9jdHhbU1NMX01BWF9TSURfQ1RYX0xFTkdUSF07CisKKwkvKiBUaGlzIGNhbiBhbHNvIGJlIGluIHRoZSBzZXNzaW9uIG9uY2UgYSBzZXNzaW9uIGlzIGVzdGFibGlzaGVkICovCisJU1NMX1NFU1NJT04gKnNlc3Npb247CisKKyAgICAgICAgLyogVGhpcyBjYW4gYmUgZGlzYWJsZWQgdG8gcHJldmVudCB0aGUgdXNlIG9mIHVuY2FjaGVkIHNlc3Npb25zICovCisJaW50IHNlc3Npb25fY3JlYXRpb25fZW5hYmxlZDsKKworCS8qIERlZmF1bHQgZ2VuZXJhdGUgc2Vzc2lvbiBJRCBjYWxsYmFjay4gKi8KKwlHRU5fU0VTU0lPTl9DQiBnZW5lcmF0ZV9zZXNzaW9uX2lkOworCisJLyogVXNlZCBpbiBTU0wyIGFuZCBTU0wzICovCisJaW50IHZlcmlmeV9tb2RlOwkvKiAwIGRvbid0IGNhcmUgYWJvdXQgdmVyaWZ5IGZhaWx1cmUuCisJCQkJICogMSBmYWlsIGlmIHZlcmlmeSBmYWlscyAqLworCWludCAoKnZlcmlmeV9jYWxsYmFjaykoaW50IG9rLFg1MDlfU1RPUkVfQ1RYICpjdHgpOyAvKiBmYWlsIGlmIGNhbGxiYWNrIHJldHVybnMgMCAqLworCisJdm9pZCAoKmluZm9fY2FsbGJhY2spKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpOyAvKiBvcHRpb25hbCBpbmZvcm1hdGlvbmFsIGNhbGxiYWNrICovCisKKwlpbnQgZXJyb3I7CQkvKiBlcnJvciBieXRlcyB0byBiZSB3cml0dGVuICovCisJaW50IGVycm9yX2NvZGU7CQkvKiBhY3R1YWwgY29kZSAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCUtTU0xfQ1RYICprc3NsX2N0eDsgICAgIC8qIEtlcmJlcm9zIDUgY29udGV4dCAqLworI2VuZGlmCS8qIE9QRU5TU0xfTk9fS1JCNSAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJdW5zaWduZWQgaW50ICgqcHNrX2NsaWVudF9jYWxsYmFjaykoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIGNoYXIgKmlkZW50aXR5LAorCQl1bnNpZ25lZCBpbnQgbWF4X2lkZW50aXR5X2xlbiwgdW5zaWduZWQgY2hhciAqcHNrLAorCQl1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pOworCXVuc2lnbmVkIGludCAoKnBza19zZXJ2ZXJfY2FsbGJhY2spKFNTTCAqc3NsLCBjb25zdCBjaGFyICppZGVudGl0eSwKKwkJdW5zaWduZWQgY2hhciAqcHNrLCB1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pOworI2VuZGlmCisKKwlTU0xfQ1RYICpjdHg7CisJLyogc2V0IHRoaXMgZmxhZyB0byAxIGFuZCBhIHNsZWVwKDEpIGlzIHB1dCBpbnRvIGFsbCBTU0xfcmVhZCgpCisJICogYW5kIFNTTF93cml0ZSgpIGNhbGxzLCBnb29kIGZvciBuYmlvIGRlYnVnaW5nIDotKSAqLworCWludCBkZWJ1ZzsJCisKKwkvKiBleHRyYSBhcHBsaWNhdGlvbiBkYXRhICovCisJbG9uZyB2ZXJpZnlfcmVzdWx0OworCUNSWVBUT19FWF9EQVRBIGV4X2RhdGE7CisKKwkvKiBmb3Igc2VydmVyIHNpZGUsIGtlZXAgdGhlIGxpc3Qgb2YgQ0FfZG4gd2UgY2FuIHVzZSAqLworCVNUQUNLX09GKFg1MDlfTkFNRSkgKmNsaWVudF9DQTsKKworCWludCByZWZlcmVuY2VzOworCXVuc2lnbmVkIGxvbmcgb3B0aW9uczsgLyogcHJvdG9jb2wgYmVoYXZpb3VyICovCisJdW5zaWduZWQgbG9uZyBtb2RlOyAvKiBBUEkgYmVoYXZpb3VyICovCisJbG9uZyBtYXhfY2VydF9saXN0OworCWludCBmaXJzdF9wYWNrZXQ7CisJaW50IGNsaWVudF92ZXJzaW9uOwkvKiB3aGF0IHdhcyBwYXNzZWQsIHVzZWQgZm9yCisJCQkJICogU1NMdjMvVExTIHJvbGxiYWNrIGNoZWNrICovCisJdW5zaWduZWQgaW50IG1heF9zZW5kX2ZyYWdtZW50OworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCS8qIFRMUyBleHRlbnNpb24gZGVidWcgY2FsbGJhY2sgKi8KKwl2b2lkICgqdGxzZXh0X2RlYnVnX2NiKShTU0wgKnMsIGludCBjbGllbnRfc2VydmVyLCBpbnQgdHlwZSwKKwkJCQkJdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwKKwkJCQkJdm9pZCAqYXJnKTsKKwl2b2lkICp0bHNleHRfZGVidWdfYXJnOworCWNoYXIgKnRsc2V4dF9ob3N0bmFtZTsKKwlpbnQgc2VydmVybmFtZV9kb25lOyAgIC8qIG5vIGZ1cnRoZXIgbW9kIG9mIHNlcnZlcm5hbWUgCisJICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogY2FsbCB0aGUgc2VydmVybmFtZSBleHRlbnNpb24gY2FsbGJhY2suCisJICAgICAgICAgICAgICAgICAgICAgICAgICAxIDogcHJlcGFyZSAyLCBhbGxvdyBsYXN0IGFjayBqdXN0IGFmdGVyIGluIHNlcnZlciBjYWxsYmFjay4KKwkgICAgICAgICAgICAgICAgICAgICAgICAgIDIgOiBkb24ndCBjYWxsIHNlcnZlcm5hbWUgY2FsbGJhY2ssIG5vIGFjayBpbiBzZXJ2ZXIgaGVsbG8KKwkgICAgICAgICAgICAgICAgICAgICAgICovCisJLyogY2VydGlmaWNhdGUgc3RhdHVzIHJlcXVlc3QgaW5mbyAqLworCS8qIFN0YXR1cyB0eXBlIG9yIC0xIGlmIG5vIHN0YXR1cyB0eXBlICovCisJaW50IHRsc2V4dF9zdGF0dXNfdHlwZTsKKwkvKiBFeHBlY3QgT0NTUCBDZXJ0aWZpY2F0ZVN0YXR1cyBtZXNzYWdlICovCisJaW50IHRsc2V4dF9zdGF0dXNfZXhwZWN0ZWQ7CisJLyogT0NTUCBzdGF0dXMgcmVxdWVzdCBvbmx5ICovCisJU1RBQ0tfT0YoT0NTUF9SRVNQSUQpICp0bHNleHRfb2NzcF9pZHM7CisJWDUwOV9FWFRFTlNJT05TICp0bHNleHRfb2NzcF9leHRzOworCS8qIE9DU1AgcmVzcG9uc2UgcmVjZWl2ZWQgb3IgdG8gYmUgc2VudCAqLworCXVuc2lnbmVkIGNoYXIgKnRsc2V4dF9vY3NwX3Jlc3A7CisJaW50IHRsc2V4dF9vY3NwX3Jlc3BsZW47CisKKwkvKiBSRkM0NTA3IHNlc3Npb24gdGlja2V0IGV4cGVjdGVkIHRvIGJlIHJlY2VpdmVkIG9yIHNlbnQgKi8KKwlpbnQgdGxzZXh0X3RpY2tldF9leHBlY3RlZDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCXNpemVfdCB0bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgKnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdDsgLyogb3VyIGxpc3QgKi8KKwlzaXplX3QgdGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aDsKKwl1bnNpZ25lZCBjaGFyICp0bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3Q7IC8qIG91ciBsaXN0ICovCisjZW5kaWYgLyogT1BFTlNTTF9OT19FQyAqLworCisJLyogZHJhZnQtcmVzY29ybGEtdGxzLW9wYXF1ZS1wcmYtaW5wdXQtMDAudHh0IGluZm9ybWF0aW9uIHRvIGJlIHVzZWQgZm9yIGhhbmRzaGFrZXMgKi8KKwl2b2lkICp0bHNleHRfb3BhcXVlX3ByZl9pbnB1dDsKKwlzaXplX3QgdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfbGVuOworCisJLyogVExTIFNlc3Npb24gVGlja2V0IGV4dGVuc2lvbiBvdmVycmlkZSAqLworCVRMU19TRVNTSU9OX1RJQ0tFVF9FWFQgKnRsc2V4dF9zZXNzaW9uX3RpY2tldDsKKworCS8qIFRMUyBTZXNzaW9uIFRpY2tldCBleHRlbnNpb24gY2FsbGJhY2sgKi8KKwl0bHNfc2Vzc2lvbl90aWNrZXRfZXh0X2NiX2ZuIHRsc19zZXNzaW9uX3RpY2tldF9leHRfY2I7CisJdm9pZCAqdGxzX3Nlc3Npb25fdGlja2V0X2V4dF9jYl9hcmc7CisKKwkvKiBUTFMgcHJlLXNoYXJlZCBzZWNyZXQgc2Vzc2lvbiByZXN1bXB0aW9uICovCisJdGxzX3Nlc3Npb25fc2VjcmV0X2NiX2ZuIHRsc19zZXNzaW9uX3NlY3JldF9jYjsKKwl2b2lkICp0bHNfc2Vzc2lvbl9zZWNyZXRfY2JfYXJnOworCisJU1NMX0NUWCAqIGluaXRpYWxfY3R4OyAvKiBpbml0aWFsIGN0eCwgdXNlZCB0byBzdG9yZSBzZXNzaW9ucyAqLworI2RlZmluZSBzZXNzaW9uX2N0eCBpbml0aWFsX2N0eAorI2Vsc2UKKyNkZWZpbmUgc2Vzc2lvbl9jdHggY3R4CisjZW5kaWYgLyogT1BFTlNTTF9OT19UTFNFWFQgKi8KKwl9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaW5jbHVkZSA8b3BlbnNzbC9zc2wyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC90bHMxLmg+IC8qIFRoaXMgaXMgbW9zdGx5IHNzbHYzIHdpdGggYSBmZXcgdHdlYWtzICovCisjaW5jbHVkZSA8b3BlbnNzbC9kdGxzMS5oPiAvKiBEYXRhZ3JhbSBUTFMgKi8KKyNpbmNsdWRlIDxvcGVuc3NsL3NzbDIzLmg+CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgU1NMX3NldF9hcHBfZGF0YShzLGFyZykJCShTU0xfc2V0X2V4X2RhdGEocywwLChjaGFyICopYXJnKSkKKyNkZWZpbmUgU1NMX2dldF9hcHBfZGF0YShzKQkJKFNTTF9nZXRfZXhfZGF0YShzLDApKQorI2RlZmluZSBTU0xfU0VTU0lPTl9zZXRfYXBwX2RhdGEocyxhKQkoU1NMX1NFU1NJT05fc2V0X2V4X2RhdGEocywwLChjaGFyICopYSkpCisjZGVmaW5lIFNTTF9TRVNTSU9OX2dldF9hcHBfZGF0YShzKQkoU1NMX1NFU1NJT05fZ2V0X2V4X2RhdGEocywwKSkKKyNkZWZpbmUgU1NMX0NUWF9nZXRfYXBwX2RhdGEoY3R4KQkoU1NMX0NUWF9nZXRfZXhfZGF0YShjdHgsMCkpCisjZGVmaW5lIFNTTF9DVFhfc2V0X2FwcF9kYXRhKGN0eCxhcmcpCShTU0xfQ1RYX3NldF9leF9kYXRhKGN0eCwwLChjaGFyICopYXJnKSkKKworLyogVGhlIGZvbGxvd2luZyBhcmUgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3Igc3NsLT5zdGF0ZSBhcmUgYXJlCisgKiB1c2VkIHRvIGluZGljYXRlIHdoZXJlIHdlIGFyZSB1cCB0byBpbiB0aGUgU1NMIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudC4KKyAqIFRoZSBtYWNyb3MgdGhhdCBmb2xsb3cgYXJlIGFib3V0IHRoZSBvbmx5IHRoaW5ncyB5b3Ugc2hvdWxkIG5lZWQgdG8gdXNlCisgKiBhbmQgZXZlbiB0aGVuLCBvbmx5IHdoZW4gdXNpbmcgbm9uLWJsb2NraW5nIElPLgorICogSXQgY2FuIGFsc28gYmUgdXNlZnVsIHRvIHdvcmsgb3V0IHdoZXJlIHlvdSB3ZXJlIHdoZW4gdGhlIGNvbm5lY3Rpb24KKyAqIGZhaWxlZCAqLworCisjZGVmaW5lIFNTTF9TVF9DT05ORUNUCQkJMHgxMDAwCisjZGVmaW5lIFNTTF9TVF9BQ0NFUFQJCQkweDIwMDAKKyNkZWZpbmUgU1NMX1NUX01BU0sJCQkweDBGRkYKKyNkZWZpbmUgU1NMX1NUX0lOSVQJCQkoU1NMX1NUX0NPTk5FQ1R8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMX1NUX0JFRk9SRQkJCTB4NDAwMAorI2RlZmluZSBTU0xfU1RfT0sJCQkweDAzCisjZGVmaW5lIFNTTF9TVF9SRU5FR09USUFURQkJKDB4MDR8U1NMX1NUX0lOSVQpCisKKyNkZWZpbmUgU1NMX0NCX0xPT1AJCQkweDAxCisjZGVmaW5lIFNTTF9DQl9FWElUCQkJMHgwMgorI2RlZmluZSBTU0xfQ0JfUkVBRAkJCTB4MDQKKyNkZWZpbmUgU1NMX0NCX1dSSVRFCQkJMHgwOAorI2RlZmluZSBTU0xfQ0JfQUxFUlQJCQkweDQwMDAgLyogdXNlZCBpbiBjYWxsYmFjayAqLworI2RlZmluZSBTU0xfQ0JfUkVBRF9BTEVSVAkJKFNTTF9DQl9BTEVSVHxTU0xfQ0JfUkVBRCkKKyNkZWZpbmUgU1NMX0NCX1dSSVRFX0FMRVJUCQkoU1NMX0NCX0FMRVJUfFNTTF9DQl9XUklURSkKKyNkZWZpbmUgU1NMX0NCX0FDQ0VQVF9MT09QCQkoU1NMX1NUX0FDQ0VQVHxTU0xfQ0JfTE9PUCkKKyNkZWZpbmUgU1NMX0NCX0FDQ0VQVF9FWElUCQkoU1NMX1NUX0FDQ0VQVHxTU0xfQ0JfRVhJVCkKKyNkZWZpbmUgU1NMX0NCX0NPTk5FQ1RfTE9PUAkJKFNTTF9TVF9DT05ORUNUfFNTTF9DQl9MT09QKQorI2RlZmluZSBTU0xfQ0JfQ09OTkVDVF9FWElUCQkoU1NMX1NUX0NPTk5FQ1R8U1NMX0NCX0VYSVQpCisjZGVmaW5lIFNTTF9DQl9IQU5EU0hBS0VfU1RBUlQJCTB4MTAKKyNkZWZpbmUgU1NMX0NCX0hBTkRTSEFLRV9ET05FCQkweDIwCisKKy8qIElzIHRoZSBTU0xfY29ubmVjdGlvbiBlc3RhYmxpc2hlZD8gKi8KKyNkZWZpbmUgU1NMX2dldF9zdGF0ZShhKQkJU1NMX3N0YXRlKGEpCisjZGVmaW5lIFNTTF9pc19pbml0X2ZpbmlzaGVkKGEpCQkoU1NMX3N0YXRlKGEpID09IFNTTF9TVF9PSykKKyNkZWZpbmUgU1NMX2luX2luaXQoYSkJCQkoKFNTTF9zdGF0ZShhKSZTU0xfU1RfSU5JVCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFTU0xfY3V0dGhyb3VnaF9jb21wbGV0ZShhKSkKKyNkZWZpbmUgU1NMX2luX2JlZm9yZShhKQkJKFNTTF9zdGF0ZShhKSZTU0xfU1RfQkVGT1JFKQorI2RlZmluZSBTU0xfaW5fY29ubmVjdF9pbml0KGEpCQkoU1NMX3N0YXRlKGEpJlNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0xfaW5fYWNjZXB0X2luaXQoYSkJCShTU0xfc3RhdGUoYSkmU1NMX1NUX0FDQ0VQVCkKK2ludCBTU0xfY3V0dGhyb3VnaF9jb21wbGV0ZShjb25zdCBTU0wgKnMpOworCisvKiBUaGUgZm9sbG93aW5nIDIgc3RhdGVzIGFyZSBrZXB0IGluIHNzbC0+cnN0YXRlIHdoZW4gcmVhZHMgZmFpbCwKKyAqIHlvdSBzaG91bGQgbm90IG5lZWQgdGhlc2UgKi8KKyNkZWZpbmUgU1NMX1NUX1JFQURfSEVBREVSCQkJMHhGMAorI2RlZmluZSBTU0xfU1RfUkVBRF9CT0RZCQkJMHhGMQorI2RlZmluZSBTU0xfU1RfUkVBRF9ET05FCQkJMHhGMgorCisvKiBPYnRhaW4gbGF0ZXN0IEZpbmlzaGVkIG1lc3NhZ2UKKyAqICAgLS0gdGhhdCB3ZSBzZW50IChTU0xfZ2V0X2ZpbmlzaGVkKQorICogICAtLSB0aGF0IHdlIGV4cGVjdGVkIGZyb20gcGVlciAoU1NMX2dldF9wZWVyX2ZpbmlzaGVkKS4KKyAqIFJldHVybnMgbGVuZ3RoICgwID09IG5vIEZpbmlzaGVkIHNvIGZhciksIGNvcGllcyB1cCB0byAnY291bnQnIGJ5dGVzLiAqLworc2l6ZV90IFNTTF9nZXRfZmluaXNoZWQoY29uc3QgU1NMICpzLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CitzaXplX3QgU1NMX2dldF9wZWVyX2ZpbmlzaGVkKGNvbnN0IFNTTCAqcywgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOworCisvKiB1c2UgZWl0aGVyIFNTTF9WRVJJRllfTk9ORSBvciBTU0xfVkVSSUZZX1BFRVIsIHRoZSBsYXN0IDIgb3B0aW9ucworICogYXJlICdvcmVkJyB3aXRoIFNTTF9WRVJJRllfUEVFUiBpZiB0aGV5IGFyZSBkZXNpcmVkICovCisjZGVmaW5lIFNTTF9WRVJJRllfTk9ORQkJCTB4MDAKKyNkZWZpbmUgU1NMX1ZFUklGWV9QRUVSCQkJMHgwMQorI2RlZmluZSBTU0xfVkVSSUZZX0ZBSUxfSUZfTk9fUEVFUl9DRVJUCTB4MDIKKyNkZWZpbmUgU1NMX1ZFUklGWV9DTElFTlRfT05DRQkJMHgwNAorCisjZGVmaW5lIE9wZW5TU0xfYWRkX3NzbF9hbGdvcml0aG1zKCkJU1NMX2xpYnJhcnlfaW5pdCgpCisjZGVmaW5lIFNTTGVheV9hZGRfc3NsX2FsZ29yaXRobXMoKQlTU0xfbGlicmFyeV9pbml0KCkKKworLyogdGhpcyBpcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworI2lmIDAgLyogTkVXX1NTTEVBWSAqLworI2RlZmluZSBTU0xfQ1RYX3NldF9kZWZhdWx0X3ZlcmlmeShhLGIsYykgU1NMX0NUWF9zZXRfdmVyaWZ5KGEsYixjKQorI2RlZmluZSBTU0xfc2V0X3ByZWZfY2lwaGVyKGMsbikJU1NMX3NldF9jaXBoZXJfbGlzdChjLG4pCisjZGVmaW5lIFNTTF9hZGRfc2Vzc2lvbihhLGIpICAgICAgICAgICAgU1NMX0NUWF9hZGRfc2Vzc2lvbigoYSksKGIpKQorI2RlZmluZSBTU0xfcmVtb3ZlX3Nlc3Npb24oYSxiKQkJU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbigoYSksKGIpKQorI2RlZmluZSBTU0xfZmx1c2hfc2Vzc2lvbnMoYSxiKQkJU1NMX0NUWF9mbHVzaF9zZXNzaW9ucygoYSksKGIpKQorI2VuZGlmCisvKiBNb3JlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgU1NMX2dldF9jaXBoZXIocykgXAorCQlTU0xfQ0lQSEVSX2dldF9uYW1lKFNTTF9nZXRfY3VycmVudF9jaXBoZXIocykpCisjZGVmaW5lIFNTTF9nZXRfY2lwaGVyX2JpdHMocyxucCkgXAorCQlTU0xfQ0lQSEVSX2dldF9iaXRzKFNTTF9nZXRfY3VycmVudF9jaXBoZXIocyksbnApCisjZGVmaW5lIFNTTF9nZXRfY2lwaGVyX3ZlcnNpb24ocykgXAorCQlTU0xfQ0lQSEVSX2dldF92ZXJzaW9uKFNTTF9nZXRfY3VycmVudF9jaXBoZXIocykpCisjZGVmaW5lIFNTTF9nZXRfY2lwaGVyX25hbWUocykgXAorCQlTU0xfQ0lQSEVSX2dldF9uYW1lKFNTTF9nZXRfY3VycmVudF9jaXBoZXIocykpCisjZGVmaW5lIFNTTF9nZXRfdGltZShhKQkJU1NMX1NFU1NJT05fZ2V0X3RpbWUoYSkKKyNkZWZpbmUgU1NMX3NldF90aW1lKGEsYikJU1NMX1NFU1NJT05fc2V0X3RpbWUoKGEpLChiKSkKKyNkZWZpbmUgU1NMX2dldF90aW1lb3V0KGEpCVNTTF9TRVNTSU9OX2dldF90aW1lb3V0KGEpCisjZGVmaW5lIFNTTF9zZXRfdGltZW91dChhLGIpCVNTTF9TRVNTSU9OX3NldF90aW1lb3V0KChhKSwoYikpCisKKyNkZWZpbmUgZDJpX1NTTF9TRVNTSU9OX2JpbyhicCxzX2lkKSBBU04xX2QyaV9iaW9fb2YoU1NMX1NFU1NJT04sU1NMX1NFU1NJT05fbmV3LGQyaV9TU0xfU0VTU0lPTixicCxzX2lkKQorI2RlZmluZSBpMmRfU1NMX1NFU1NJT05fYmlvKGJwLHNfaWQpIEFTTjFfaTJkX2Jpb19vZihTU0xfU0VTU0lPTixpMmRfU1NMX1NFU1NJT04sYnAsc19pZCkKKworREVDTEFSRV9QRU1fcncoU1NMX1NFU1NJT04sIFNTTF9TRVNTSU9OKQorCisjZGVmaW5lIFNTTF9BRF9SRUFTT05fT0ZGU0VUCQkxMDAwIC8qIG9mZnNldCB0byBnZXQgU1NMX1JfLi4uIHZhbHVlIGZyb20gU1NMX0FEXy4uLiAqLworCisvKiBUaGVzZSBhbGVydCB0eXBlcyBhcmUgZm9yIFNTTHYzIGFuZCBUTFN2MSAqLworI2RlZmluZSBTU0xfQURfQ0xPU0VfTk9USUZZCQlTU0wzX0FEX0NMT1NFX05PVElGWQorI2RlZmluZSBTU0xfQURfVU5FWFBFQ1RFRF9NRVNTQUdFCVNTTDNfQURfVU5FWFBFQ1RFRF9NRVNTQUdFIC8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9CQURfUkVDT1JEX01BQwkJU1NMM19BRF9CQURfUkVDT1JEX01BQyAgICAgLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMX0FEX0RFQ1JZUFRJT05fRkFJTEVECVRMUzFfQURfREVDUllQVElPTl9GQUlMRUQKKyNkZWZpbmUgU1NMX0FEX1JFQ09SRF9PVkVSRkxPVwkJVExTMV9BRF9SRUNPUkRfT1ZFUkZMT1cKKyNkZWZpbmUgU1NMX0FEX0RFQ09NUFJFU1NJT05fRkFJTFVSRQlTU0wzX0FEX0RFQ09NUFJFU1NJT05fRkFJTFVSRS8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRQlTU0wzX0FEX0hBTkRTSEFLRV9GQUlMVVJFLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMX0FEX05PX0NFUlRJRklDQVRFCQlTU0wzX0FEX05PX0NFUlRJRklDQVRFIC8qIE5vdCBmb3IgVExTICovCisjZGVmaW5lIFNTTF9BRF9CQURfQ0VSVElGSUNBVEUJCVNTTDNfQURfQkFEX0NFUlRJRklDQVRFCisjZGVmaW5lIFNTTF9BRF9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURQlTU0wzX0FEX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFCisjZGVmaW5lIFNTTF9BRF9DRVJUSUZJQ0FURV9SRVZPS0VECVNTTDNfQURfQ0VSVElGSUNBVEVfUkVWT0tFRAorI2RlZmluZSBTU0xfQURfQ0VSVElGSUNBVEVfRVhQSVJFRAlTU0wzX0FEX0NFUlRJRklDQVRFX0VYUElSRUQKKyNkZWZpbmUgU1NMX0FEX0NFUlRJRklDQVRFX1VOS05PV04JU1NMM19BRF9DRVJUSUZJQ0FURV9VTktOT1dOCisjZGVmaW5lIFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUglTU0wzX0FEX0lMTEVHQUxfUEFSQU1FVEVSICAgLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMX0FEX1VOS05PV05fQ0EJCVRMUzFfQURfVU5LTk9XTl9DQQkvKiBmYXRhbCAqLworI2RlZmluZSBTU0xfQURfQUNDRVNTX0RFTklFRAkJVExTMV9BRF9BQ0NFU1NfREVOSUVECS8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9ERUNPREVfRVJST1IJCVRMUzFfQURfREVDT0RFX0VSUk9SCS8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9ERUNSWVBUX0VSUk9SCQlUTFMxX0FEX0RFQ1JZUFRfRVJST1IKKyNkZWZpbmUgU1NMX0FEX0VYUE9SVF9SRVNUUklDVElPTglUTFMxX0FEX0VYUE9SVF9SRVNUUklDVElPTi8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9QUk9UT0NPTF9WRVJTSU9OCQlUTFMxX0FEX1BST1RPQ09MX1ZFUlNJT04gLyogZmF0YWwgKi8KKyNkZWZpbmUgU1NMX0FEX0lOU1VGRklDSUVOVF9TRUNVUklUWQlUTFMxX0FEX0lOU1VGRklDSUVOVF9TRUNVUklUWS8qIGZhdGFsICovCisjZGVmaW5lIFNTTF9BRF9JTlRFUk5BTF9FUlJPUgkJVExTMV9BRF9JTlRFUk5BTF9FUlJPUgkvKiBmYXRhbCAqLworI2RlZmluZSBTU0xfQURfVVNFUl9DQU5DRUxMRUQJCVRMUzFfQURfVVNFUl9DQU5DRUxMRUQKKyNkZWZpbmUgU1NMX0FEX05PX1JFTkVHT1RJQVRJT04JCVRMUzFfQURfTk9fUkVORUdPVElBVElPTgorI2RlZmluZSBTU0xfQURfVU5TVVBQT1JURURfRVhURU5TSU9OCVRMUzFfQURfVU5TVVBQT1JURURfRVhURU5TSU9OCisjZGVmaW5lIFNTTF9BRF9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEUgVExTMV9BRF9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEUKKyNkZWZpbmUgU1NMX0FEX1VOUkVDT0dOSVpFRF9OQU1FCVRMUzFfQURfVU5SRUNPR05JWkVEX05BTUUKKyNkZWZpbmUgU1NMX0FEX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0UgVExTMV9BRF9CQURfQ0VSVElGSUNBVEVfU1RBVFVTX1JFU1BPTlNFCisjZGVmaW5lIFNTTF9BRF9CQURfQ0VSVElGSUNBVEVfSEFTSF9WQUxVRSBUTFMxX0FEX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFCisjZGVmaW5lIFNTTF9BRF9VTktOT1dOX1BTS19JREVOVElUWSAgICAgVExTMV9BRF9VTktOT1dOX1BTS19JREVOVElUWSAvKiBmYXRhbCAqLworCisjZGVmaW5lIFNTTF9FUlJPUl9OT05FCQkJMAorI2RlZmluZSBTU0xfRVJST1JfU1NMCQkJMQorI2RlZmluZSBTU0xfRVJST1JfV0FOVF9SRUFECQkyCisjZGVmaW5lIFNTTF9FUlJPUl9XQU5UX1dSSVRFCQkzCisjZGVmaW5lIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQCTQKKyNkZWZpbmUgU1NMX0VSUk9SX1NZU0NBTEwJCTUgLyogbG9vayBhdCBlcnJvciBzdGFjay9yZXR1cm4gdmFsdWUvZXJybm8gKi8KKyNkZWZpbmUgU1NMX0VSUk9SX1pFUk9fUkVUVVJOCQk2CisjZGVmaW5lIFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QJCTcKKyNkZWZpbmUgU1NMX0VSUk9SX1dBTlRfQUNDRVBUCQk4CisKKyNkZWZpbmUgU1NMX0NUUkxfTkVFRF9UTVBfUlNBCQkJMQorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVE1QX1JTQQkJCTIKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9ESAkJCTMKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9FQ0RICQkJNAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVE1QX1JTQV9DQgkJCTUKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9ESF9DQgkJCTYKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RNUF9FQ0RIX0NCCQk3CisKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1NFU1NJT05fUkVVU0VECQk4CisjZGVmaW5lIFNTTF9DVFJMX0dFVF9DTElFTlRfQ0VSVF9SRVFVRVNUCTkKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX05VTV9SRU5FR09USUFUSU9OUwkJMTAKKyNkZWZpbmUgU1NMX0NUUkxfQ0xFQVJfTlVNX1JFTkVHT1RJQVRJT05TCTExCisjZGVmaW5lIFNTTF9DVFJMX0dFVF9UT1RBTF9SRU5FR09USUFUSU9OUwkxMgorI2RlZmluZSBTU0xfQ1RSTF9HRVRfRkxBR1MJCQkxMworI2RlZmluZSBTU0xfQ1RSTF9FWFRSQV9DSEFJTl9DRVJUCQkxNAorCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9NU0dfQ0FMTEJBQ0sgICAgICAgICAgICAgICAxNQorI2RlZmluZSBTU0xfQ1RSTF9TRVRfTVNHX0NBTExCQUNLX0FSRyAgICAgICAgICAgMTYKKworLyogb25seSBhcHBsaWVzIHRvIGRhdGFncmFtIGNvbm5lY3Rpb25zICovCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9NVFUgICAgICAgICAgICAgICAgMTcKKy8qIFN0YXRzICovCisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfTlVNQkVSCQkJMjAKKyNkZWZpbmUgU1NMX0NUUkxfU0VTU19DT05ORUNUCQkJMjEKKyNkZWZpbmUgU1NMX0NUUkxfU0VTU19DT05ORUNUX0dPT0QJCTIyCisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfQ09OTkVDVF9SRU5FR09USUFURQkyMworI2RlZmluZSBTU0xfQ1RSTF9TRVNTX0FDQ0VQVAkJCTI0CisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfQUNDRVBUX0dPT0QJCTI1CisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfQUNDRVBUX1JFTkVHT1RJQVRFCTI2CisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfSElUCQkJMjcKKyNkZWZpbmUgU1NMX0NUUkxfU0VTU19DQl9ISVQJCQkyOAorI2RlZmluZSBTU0xfQ1RSTF9TRVNTX01JU1NFUwkJCTI5CisjZGVmaW5lIFNTTF9DVFJMX1NFU1NfVElNRU9VVFMJCQkzMAorI2RlZmluZSBTU0xfQ1RSTF9TRVNTX0NBQ0hFX0ZVTEwJCTMxCisjZGVmaW5lIFNTTF9DVFJMX09QVElPTlMJCQkzMgorI2RlZmluZSBTU0xfQ1RSTF9NT0RFCQkJCTMzCisKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1JFQURfQUhFQUQJCQk0MAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfUkVBRF9BSEVBRAkJCTQxCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9TRVNTX0NBQ0hFX1NJWkUJCTQyCisjZGVmaW5lIFNTTF9DVFJMX0dFVF9TRVNTX0NBQ0hFX1NJWkUJCTQzCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9TRVNTX0NBQ0hFX01PREUJCTQ0CisjZGVmaW5lIFNTTF9DVFJMX0dFVF9TRVNTX0NBQ0hFX01PREUJCTQ1CisKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX01BWF9DRVJUX0xJU1QJCTUwCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9NQVhfQ0VSVF9MSVNUCQk1MQorCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9NQVhfU0VORF9GUkFHTUVOVAkJNTIKKworLyogc2VlIHRsczEuaCBmb3IgbWFjcm9zIGJhc2VkIG9uIHRoZXNlICovCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfU0VSVkVSTkFNRV9DQgk1MworI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHCTU0CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfSE9TVE5BTUUJCTU1CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfREVCVUdfQ0IJCTU2CisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfREVCVUdfQVJHCQk1NworI2RlZmluZSBTU0xfQ1RSTF9HRVRfVExTRVhUX1RJQ0tFVF9LRVlTCQk1OAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1RJQ0tFVF9LRVlTCQk1OQorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX09QQVFVRV9QUkZfSU5QVVQJNjAKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9PUEFRVUVfUFJGX0lOUFVUX0NCCTYxCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfT1BBUVVFX1BSRl9JTlBVVF9DQl9BUkcgNjIKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX0NCCTYzCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9DQl9BUkcJNjQKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX1RZUEUJNjUKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1RMU0VYVF9TVEFUVVNfUkVRX0VYVFMJNjYKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX0VYVFMJNjcKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1RMU0VYVF9TVEFUVVNfUkVRX0lEUwk2OAorI2RlZmluZSBTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfSURTCTY5CisjZGVmaW5lIFNTTF9DVFJMX0dFVF9UTFNFWFRfU1RBVFVTX1JFUV9PQ1NQX1JFU1AJNzAKKyNkZWZpbmUgU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX09DU1BfUkVTUAk3MQorCisjZGVmaW5lIFNTTF9DVFJMX1NFVF9UTFNFWFRfVElDS0VUX0tFWV9DQgk3MgorI2VuZGlmCisKKyNkZWZpbmUgRFRMU19DVFJMX0dFVF9USU1FT1VUCQk3MworI2RlZmluZSBEVExTX0NUUkxfSEFORExFX1RJTUVPVVQJNzQKKyNkZWZpbmUgRFRMU19DVFJMX0xJU1RFTgkJCTc1CisKKyNkZWZpbmUgU1NMX0NUUkxfR0VUX1JJX1NVUFBPUlQJCQk3NgorI2RlZmluZSBTU0xfQ1RSTF9DTEVBUl9PUFRJT05TCQkJNzcKKyNkZWZpbmUgU1NMX0NUUkxfQ0xFQVJfTU9ERQkJCTc4CisKKyNkZWZpbmUgRFRMU3YxX2dldF90aW1lb3V0KHNzbCwgYXJnKSBcCisJU1NMX2N0cmwoc3NsLERUTFNfQ1RSTF9HRVRfVElNRU9VVCwwLCAodm9pZCAqKWFyZykKKyNkZWZpbmUgRFRMU3YxX2hhbmRsZV90aW1lb3V0KHNzbCkgXAorCVNTTF9jdHJsKHNzbCxEVExTX0NUUkxfSEFORExFX1RJTUVPVVQsMCwgTlVMTCkKKyNkZWZpbmUgRFRMU3YxX2xpc3Rlbihzc2wsIHBlZXIpIFwKKwlTU0xfY3RybChzc2wsRFRMU19DVFJMX0xJU1RFTiwwLCAodm9pZCAqKXBlZXIpCisKKyNkZWZpbmUgU1NMX3Nlc3Npb25fcmV1c2VkKHNzbCkgXAorCVNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX0dFVF9TRVNTSU9OX1JFVVNFRCwwLE5VTEwpCisjZGVmaW5lIFNTTF9udW1fcmVuZWdvdGlhdGlvbnMoc3NsKSBcCisJU1NMX2N0cmwoKHNzbCksU1NMX0NUUkxfR0VUX05VTV9SRU5FR09USUFUSU9OUywwLE5VTEwpCisjZGVmaW5lIFNTTF9jbGVhcl9udW1fcmVuZWdvdGlhdGlvbnMoc3NsKSBcCisJU1NMX2N0cmwoKHNzbCksU1NMX0NUUkxfQ0xFQVJfTlVNX1JFTkVHT1RJQVRJT05TLDAsTlVMTCkKKyNkZWZpbmUgU1NMX3RvdGFsX3JlbmVnb3RpYXRpb25zKHNzbCkgXAorCVNTTF9jdHJsKChzc2wpLFNTTF9DVFJMX0dFVF9UT1RBTF9SRU5FR09USUFUSU9OUywwLE5VTEwpCisKKyNkZWZpbmUgU1NMX0NUWF9uZWVkX3RtcF9SU0EoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9ORUVEX1RNUF9SU0EsMCxOVUxMKQorI2RlZmluZSBTU0xfQ1RYX3NldF90bXBfcnNhKGN0eCxyc2EpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9UTVBfUlNBLDAsKGNoYXIgKilyc2EpCisjZGVmaW5lIFNTTF9DVFhfc2V0X3RtcF9kaChjdHgsZGgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9UTVBfREgsMCwoY2hhciAqKWRoKQorI2RlZmluZSBTU0xfQ1RYX3NldF90bXBfZWNkaChjdHgsZWNkaCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VUX1RNUF9FQ0RILDAsKGNoYXIgKillY2RoKQorCisjZGVmaW5lIFNTTF9uZWVkX3RtcF9SU0Eoc3NsKSBcCisJU1NMX2N0cmwoc3NsLFNTTF9DVFJMX05FRURfVE1QX1JTQSwwLE5VTEwpCisjZGVmaW5lIFNTTF9zZXRfdG1wX3JzYShzc2wscnNhKSBcCisJU1NMX2N0cmwoc3NsLFNTTF9DVFJMX1NFVF9UTVBfUlNBLDAsKGNoYXIgKilyc2EpCisjZGVmaW5lIFNTTF9zZXRfdG1wX2RoKHNzbCxkaCkgXAorCVNTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVE1QX0RILDAsKGNoYXIgKilkaCkKKyNkZWZpbmUgU1NMX3NldF90bXBfZWNkaChzc2wsZWNkaCkgXAorCVNTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVE1QX0VDREgsMCwoY2hhciAqKWVjZGgpCisKKyNkZWZpbmUgU1NMX0NUWF9hZGRfZXh0cmFfY2hhaW5fY2VydChjdHgseDUwOSkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfRVhUUkFfQ0hBSU5fQ0VSVCwwLChjaGFyICopeDUwOSkKKworI2lmbmRlZiBPUEVOU1NMX05PX0JJTworQklPX01FVEhPRCAqQklPX2Zfc3NsKHZvaWQpOworQklPICpCSU9fbmV3X3NzbChTU0xfQ1RYICpjdHgsaW50IGNsaWVudCk7CitCSU8gKkJJT19uZXdfc3NsX2Nvbm5lY3QoU1NMX0NUWCAqY3R4KTsKK0JJTyAqQklPX25ld19idWZmZXJfc3NsX2Nvbm5lY3QoU1NMX0NUWCAqY3R4KTsKK2ludCBCSU9fc3NsX2NvcHlfc2Vzc2lvbl9pZChCSU8gKnRvLEJJTyAqZnJvbSk7Cit2b2lkIEJJT19zc2xfc2h1dGRvd24oQklPICpzc2xfYmlvKTsKKworI2VuZGlmCisKK2ludAlTU0xfQ1RYX3NldF9jaXBoZXJfbGlzdChTU0xfQ1RYICosY29uc3QgY2hhciAqc3RyKTsKK1NTTF9DVFggKlNTTF9DVFhfbmV3KGNvbnN0IFNTTF9NRVRIT0QgKm1ldGgpOwordm9pZAlTU0xfQ1RYX2ZyZWUoU1NMX0NUWCAqKTsKK2xvbmcgU1NMX0NUWF9zZXRfdGltZW91dChTU0xfQ1RYICpjdHgsbG9uZyB0KTsKK2xvbmcgU1NMX0NUWF9nZXRfdGltZW91dChjb25zdCBTU0xfQ1RYICpjdHgpOworWDUwOV9TVE9SRSAqU1NMX0NUWF9nZXRfY2VydF9zdG9yZShjb25zdCBTU0xfQ1RYICopOwordm9pZCBTU0xfQ1RYX3NldF9jZXJ0X3N0b3JlKFNTTF9DVFggKixYNTA5X1NUT1JFICopOworaW50IFNTTF93YW50KGNvbnN0IFNTTCAqcyk7CitpbnQJU1NMX2NsZWFyKFNTTCAqcyk7CisKK3ZvaWQJU1NMX0NUWF9mbHVzaF9zZXNzaW9ucyhTU0xfQ1RYICpjdHgsbG9uZyB0bSk7CisKK2NvbnN0IFNTTF9DSVBIRVIgKlNTTF9nZXRfY3VycmVudF9jaXBoZXIoY29uc3QgU1NMICpzKTsKK2ludAlTU0xfQ0lQSEVSX2dldF9iaXRzKGNvbnN0IFNTTF9DSVBIRVIgKmMsaW50ICphbGdfYml0cyk7CitjaGFyICoJU1NMX0NJUEhFUl9nZXRfdmVyc2lvbihjb25zdCBTU0xfQ0lQSEVSICpjKTsKK2NvbnN0IGNoYXIgKglTU0xfQ0lQSEVSX2dldF9uYW1lKGNvbnN0IFNTTF9DSVBIRVIgKmMpOworCitpbnQJU1NMX2dldF9mZChjb25zdCBTU0wgKnMpOworaW50CVNTTF9nZXRfcmZkKGNvbnN0IFNTTCAqcyk7CitpbnQJU1NMX2dldF93ZmQoY29uc3QgU1NMICpzKTsKK2NvbnN0IGNoYXIgICogU1NMX2dldF9jaXBoZXJfbGlzdChjb25zdCBTU0wgKnMsaW50IG4pOworY2hhciAqCVNTTF9nZXRfc2hhcmVkX2NpcGhlcnMoY29uc3QgU1NMICpzLCBjaGFyICpidWYsIGludCBsZW4pOworaW50CVNTTF9nZXRfcmVhZF9haGVhZChjb25zdCBTU0wgKiBzKTsKK2ludAlTU0xfcGVuZGluZyhjb25zdCBTU0wgKnMpOworI2lmbmRlZiBPUEVOU1NMX05PX1NPQ0sKK2ludAlTU0xfc2V0X2ZkKFNTTCAqcywgaW50IGZkKTsKK2ludAlTU0xfc2V0X3JmZChTU0wgKnMsIGludCBmZCk7CitpbnQJU1NMX3NldF93ZmQoU1NMICpzLCBpbnQgZmQpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fQklPCit2b2lkCVNTTF9zZXRfYmlvKFNTTCAqcywgQklPICpyYmlvLEJJTyAqd2Jpbyk7CitCSU8gKglTU0xfZ2V0X3JiaW8oY29uc3QgU1NMICpzKTsKK0JJTyAqCVNTTF9nZXRfd2Jpbyhjb25zdCBTU0wgKnMpOworI2VuZGlmCitpbnQJU1NMX3NldF9jaXBoZXJfbGlzdChTU0wgKnMsIGNvbnN0IGNoYXIgKnN0cik7CitpbnQJU1NMX3NldF9jaXBoZXJfbGlzdHMoU1NMICpzLCBTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2spOwordm9pZAlTU0xfc2V0X3JlYWRfYWhlYWQoU1NMICpzLCBpbnQgeWVzKTsKK2ludAlTU0xfZ2V0X3ZlcmlmeV9tb2RlKGNvbnN0IFNTTCAqcyk7CitpbnQJU1NMX2dldF92ZXJpZnlfZGVwdGgoY29uc3QgU1NMICpzKTsKK2ludAkoKlNTTF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTCAqcykpKGludCxYNTA5X1NUT1JFX0NUWCAqKTsKK3ZvaWQJU1NMX3NldF92ZXJpZnkoU1NMICpzLCBpbnQgbW9kZSwKKwkJICAgICAgIGludCAoKmNhbGxiYWNrKShpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmN0eCkpOwordm9pZAlTU0xfc2V0X3ZlcmlmeV9kZXB0aChTU0wgKnMsIGludCBkZXB0aCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitpbnQJU1NMX3VzZV9SU0FQcml2YXRlS2V5KFNTTCAqc3NsLCBSU0EgKnJzYSk7CisjZW5kaWYKK2ludAlTU0xfdXNlX1JTQVByaXZhdGVLZXlfQVNOMShTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqZCwgbG9uZyBsZW4pOworaW50CVNTTF91c2VfUHJpdmF0ZUtleShTU0wgKnNzbCwgRVZQX1BLRVkgKnBrZXkpOworaW50CVNTTF91c2VfUHJpdmF0ZUtleV9BU04xKGludCBwayxTU0wgKnNzbCwgY29uc3QgdW5zaWduZWQgY2hhciAqZCwgbG9uZyBsZW4pOworaW50CVNTTF91c2VfY2VydGlmaWNhdGUoU1NMICpzc2wsIFg1MDkgKngpOworaW50CVNTTF91c2VfY2VydGlmaWNhdGVfQVNOMShTU0wgKnNzbCwgY29uc3QgdW5zaWduZWQgY2hhciAqZCwgaW50IGxlbik7CitpbnQJU1NMX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbihTU0wgKnNzbCwgU1RBQ0tfT0YoWDUwOSkgKmNlcnRfY2hhaW4pOworU1RBQ0tfT0YoWDUwOSkgKiBTU0xfZ2V0X2NlcnRpZmljYXRlX2NoYWluKFNTTCAqc3NsLCBYNTA5ICp4KTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1NURElPCitpbnQJU1NMX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKK2ludAlTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworaW50CVNTTF91c2VfY2VydGlmaWNhdGVfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpOworaW50CVNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXlfZmlsZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKK2ludAlTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgdHlwZSk7CitpbnQJU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKTsKK2ludAlTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSk7IC8qIFBFTSB0eXBlICovCitTVEFDS19PRihYNTA5X05BTUUpICpTU0xfbG9hZF9jbGllbnRfQ0FfZmlsZShjb25zdCBjaGFyICpmaWxlKTsKK2ludAlTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjayhTVEFDS19PRihYNTA5X05BTUUpICpzdGFja0NBcywKKwkJCQkJICAgIGNvbnN0IGNoYXIgKmZpbGUpOworI2lmbmRlZiBPUEVOU1NMX1NZU19WTVMKKyNpZm5kZWYgT1BFTlNTTF9TWVNfTUFDSU5UT1NIX0NMQVNTSUMgLyogWFhYWFg6IEJldHRlciBzY2hlbWUgbmVlZGVkISBbd2FzOiAjaWZuZGVmIE1BQ19PU19wcmVfWF0gKi8KK2ludAlTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKFNUQUNLX09GKFg1MDlfTkFNRSkgKnN0YWNrQ0FzLAorCQkJCQkgICBjb25zdCBjaGFyICpkaXIpOworI2VuZGlmCisjZW5kaWYKKworI2VuZGlmCisKK3ZvaWQJU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncyh2b2lkICk7Citjb25zdCBjaGFyICpTU0xfc3RhdGVfc3RyaW5nKGNvbnN0IFNTTCAqcyk7Citjb25zdCBjaGFyICpTU0xfcnN0YXRlX3N0cmluZyhjb25zdCBTU0wgKnMpOworY29uc3QgY2hhciAqU1NMX3N0YXRlX3N0cmluZ19sb25nKGNvbnN0IFNTTCAqcyk7Citjb25zdCBjaGFyICpTU0xfcnN0YXRlX3N0cmluZ19sb25nKGNvbnN0IFNTTCAqcyk7Citsb25nCVNTTF9TRVNTSU9OX2dldF90aW1lKGNvbnN0IFNTTF9TRVNTSU9OICpzKTsKK2xvbmcJU1NMX1NFU1NJT05fc2V0X3RpbWUoU1NMX1NFU1NJT04gKnMsIGxvbmcgdCk7Citsb25nCVNTTF9TRVNTSU9OX2dldF90aW1lb3V0KGNvbnN0IFNTTF9TRVNTSU9OICpzKTsKK2xvbmcJU1NMX1NFU1NJT05fc2V0X3RpbWVvdXQoU1NMX1NFU1NJT04gKnMsIGxvbmcgdCk7Cit2b2lkCVNTTF9jb3B5X3Nlc3Npb25faWQoU1NMICp0byxjb25zdCBTU0wgKmZyb20pOworCitTU0xfU0VTU0lPTiAqU1NMX1NFU1NJT05fbmV3KHZvaWQpOworY29uc3QgdW5zaWduZWQgY2hhciAqU1NMX1NFU1NJT05fZ2V0X2lkKGNvbnN0IFNTTF9TRVNTSU9OICpzLAorCQkJCQl1bnNpZ25lZCBpbnQgKmxlbik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRlBfQVBJCitpbnQJU1NMX1NFU1NJT05fcHJpbnRfZnAoRklMRSAqZnAsY29uc3QgU1NMX1NFU1NJT04gKnNlcyk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19CSU8KK2ludAlTU0xfU0VTU0lPTl9wcmludChCSU8gKmZwLGNvbnN0IFNTTF9TRVNTSU9OICpzZXMpOworI2VuZGlmCit2b2lkCVNTTF9TRVNTSU9OX2ZyZWUoU1NMX1NFU1NJT04gKnNlcyk7CitpbnQJaTJkX1NTTF9TRVNTSU9OKFNTTF9TRVNTSU9OICppbix1bnNpZ25lZCBjaGFyICoqcHApOworaW50CVNTTF9zZXRfc2Vzc2lvbihTU0wgKnRvLCBTU0xfU0VTU0lPTiAqc2Vzc2lvbik7Cit2b2lkCVNTTF9zZXRfc2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkKFNTTCAqLCBpbnQpOworaW50CVNTTF9DVFhfYWRkX3Nlc3Npb24oU1NMX0NUWCAqcywgU1NMX1NFU1NJT04gKmMpOworaW50CVNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24oU1NMX0NUWCAqLFNTTF9TRVNTSU9OICpjKTsKK2ludAlTU0xfQ1RYX3NldF9nZW5lcmF0ZV9zZXNzaW9uX2lkKFNTTF9DVFggKiwgR0VOX1NFU1NJT05fQ0IpOworaW50CVNTTF9zZXRfZ2VuZXJhdGVfc2Vzc2lvbl9pZChTU0wgKiwgR0VOX1NFU1NJT05fQ0IpOworaW50CVNTTF9oYXNfbWF0Y2hpbmdfc2Vzc2lvbl9pZChjb25zdCBTU0wgKnNzbCwgY29uc3QgdW5zaWduZWQgY2hhciAqaWQsCisJCQkJCXVuc2lnbmVkIGludCBpZF9sZW4pOworU1NMX1NFU1NJT04gKmQyaV9TU0xfU0VTU0lPTihTU0xfU0VTU0lPTiAqKmEsY29uc3QgdW5zaWduZWQgY2hhciAqKnBwLAorCQkJICAgICBsb25nIGxlbmd0aCk7CisKKyNpZmRlZiBIRUFERVJfWDUwOV9ICitYNTA5ICoJU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKGNvbnN0IFNTTCAqcyk7CisjZW5kaWYKKworU1RBQ0tfT0YoWDUwOSkgKlNTTF9nZXRfcGVlcl9jZXJ0X2NoYWluKGNvbnN0IFNTTCAqcyk7CisKK2ludCBTU0xfQ1RYX2dldF92ZXJpZnlfbW9kZShjb25zdCBTU0xfQ1RYICpjdHgpOworaW50IFNTTF9DVFhfZ2V0X3ZlcmlmeV9kZXB0aChjb25zdCBTU0xfQ1RYICpjdHgpOworaW50ICgqU1NMX0NUWF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTF9DVFggKmN0eCkpKGludCxYNTA5X1NUT1JFX0NUWCAqKTsKK3ZvaWQgU1NMX0NUWF9zZXRfdmVyaWZ5KFNTTF9DVFggKmN0eCxpbnQgbW9kZSwKKwkJCWludCAoKmNhbGxiYWNrKShpbnQsIFg1MDlfU1RPUkVfQ1RYICopKTsKK3ZvaWQgU1NMX0NUWF9zZXRfdmVyaWZ5X2RlcHRoKFNTTF9DVFggKmN0eCxpbnQgZGVwdGgpOwordm9pZCBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjayhTU0xfQ1RYICpjdHgsIGludCAoKmNiKShYNTA5X1NUT1JFX0NUWCAqLHZvaWQgKiksIHZvaWQgKmFyZyk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitpbnQgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleShTU0xfQ1RYICpjdHgsIFJTQSAqcnNhKTsKKyNlbmRpZgoraW50IFNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXlfQVNOMShTU0xfQ1RYICpjdHgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGxvbmcgbGVuKTsKK2ludCBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KFNTTF9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpOworaW50IFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfQVNOMShpbnQgcGssU1NMX0NUWCAqY3R4LAorCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGxvbmcgbGVuKTsKK2ludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZShTU0xfQ1RYICpjdHgsIFg1MDkgKngpOworaW50IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX0FTTjEoU1NMX0NUWCAqY3R4LCBpbnQgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkKTsKKwordm9pZCBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihTU0xfQ1RYICpjdHgsIHBlbV9wYXNzd29yZF9jYiAqY2IpOwordm9pZCBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YShTU0xfQ1RYICpjdHgsIHZvaWQgKnUpOworCitpbnQgU1NMX0NUWF9jaGVja19wcml2YXRlX2tleShjb25zdCBTU0xfQ1RYICpjdHgpOworaW50IFNTTF9jaGVja19wcml2YXRlX2tleShjb25zdCBTU0wgKmN0eCk7CisKK2ludAlTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoU1NMX0NUWCAqY3R4LGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNpZF9jdHgsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBzaWRfY3R4X2xlbik7CisKK1NTTCAqCVNTTF9uZXcoU1NMX0NUWCAqY3R4KTsKK2ludAlTU0xfc2V0X3Nlc3Npb25faWRfY29udGV4dChTU0wgKnNzbCxjb25zdCB1bnNpZ25lZCBjaGFyICpzaWRfY3R4LAorCQkJCSAgIHVuc2lnbmVkIGludCBzaWRfY3R4X2xlbik7CisKK2ludCBTU0xfQ1RYX3NldF9wdXJwb3NlKFNTTF9DVFggKnMsIGludCBwdXJwb3NlKTsKK2ludCBTU0xfc2V0X3B1cnBvc2UoU1NMICpzLCBpbnQgcHVycG9zZSk7CitpbnQgU1NMX0NUWF9zZXRfdHJ1c3QoU1NMX0NUWCAqcywgaW50IHRydXN0KTsKK2ludCBTU0xfc2V0X3RydXN0KFNTTCAqcywgaW50IHRydXN0KTsKKworaW50IFNTTF9DVFhfc2V0MV9wYXJhbShTU0xfQ1RYICpjdHgsIFg1MDlfVkVSSUZZX1BBUkFNICp2cG0pOworaW50IFNTTF9zZXQxX3BhcmFtKFNTTCAqc3NsLCBYNTA5X1ZFUklGWV9QQVJBTSAqdnBtKTsKKwordm9pZAlTU0xfZnJlZShTU0wgKnNzbCk7CitpbnQgCVNTTF9hY2NlcHQoU1NMICpzc2wpOworaW50IAlTU0xfY29ubmVjdChTU0wgKnNzbCk7CitpbnQgCVNTTF9yZWFkKFNTTCAqc3NsLHZvaWQgKmJ1ZixpbnQgbnVtKTsKK2ludCAJU1NMX3BlZWsoU1NMICpzc2wsdm9pZCAqYnVmLGludCBudW0pOworaW50IAlTU0xfd3JpdGUoU1NMICpzc2wsY29uc3Qgdm9pZCAqYnVmLGludCBudW0pOworbG9uZwlTU0xfY3RybChTU0wgKnNzbCxpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOworbG9uZwlTU0xfY2FsbGJhY2tfY3RybChTU0wgKiwgaW50LCB2b2lkICgqKSh2b2lkKSk7Citsb25nCVNTTF9DVFhfY3RybChTU0xfQ1RYICpjdHgsaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKK2xvbmcJU1NMX0NUWF9jYWxsYmFja19jdHJsKFNTTF9DVFggKiwgaW50LCB2b2lkICgqKSh2b2lkKSk7CisKK2ludAlTU0xfZ2V0X2Vycm9yKGNvbnN0IFNTTCAqcyxpbnQgcmV0X2NvZGUpOworY29uc3QgY2hhciAqU1NMX2dldF92ZXJzaW9uKGNvbnN0IFNTTCAqcyk7CisKKy8qIFRoaXMgc2V0cyB0aGUgJ2RlZmF1bHQnIFNTTCB2ZXJzaW9uIHRoYXQgU1NMX25ldygpIHdpbGwgY3JlYXRlICovCitpbnQgU1NMX0NUWF9zZXRfc3NsX3ZlcnNpb24oU1NMX0NUWCAqY3R4LCBjb25zdCBTU0xfTUVUSE9EICptZXRoKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDIKK2NvbnN0IFNTTF9NRVRIT0QgKlNTTHYyX21ldGhvZCh2b2lkKTsJCS8qIFNTTHYyICovCitjb25zdCBTU0xfTUVUSE9EICpTU0x2Ml9zZXJ2ZXJfbWV0aG9kKHZvaWQpOwkvKiBTU0x2MiAqLworY29uc3QgU1NMX01FVEhPRCAqU1NMdjJfY2xpZW50X21ldGhvZCh2b2lkKTsJLyogU1NMdjIgKi8KKyNlbmRpZgorCitjb25zdCBTU0xfTUVUSE9EICpTU0x2M19tZXRob2Qodm9pZCk7CQkvKiBTU0x2MyAqLworY29uc3QgU1NMX01FVEhPRCAqU1NMdjNfc2VydmVyX21ldGhvZCh2b2lkKTsJLyogU1NMdjMgKi8KK2NvbnN0IFNTTF9NRVRIT0QgKlNTTHYzX2NsaWVudF9tZXRob2Qodm9pZCk7CS8qIFNTTHYzICovCisKK2NvbnN0IFNTTF9NRVRIT0QgKlNTTHYyM19tZXRob2Qodm9pZCk7CS8qIFNTTHYzIGJ1dCBjYW4gcm9sbGJhY2sgdG8gdjIgKi8KK2NvbnN0IFNTTF9NRVRIT0QgKlNTTHYyM19zZXJ2ZXJfbWV0aG9kKHZvaWQpOwkvKiBTU0x2MyBidXQgY2FuIHJvbGxiYWNrIHRvIHYyICovCitjb25zdCBTU0xfTUVUSE9EICpTU0x2MjNfY2xpZW50X21ldGhvZCh2b2lkKTsJLyogU1NMdjMgYnV0IGNhbiByb2xsYmFjayB0byB2MiAqLworCitjb25zdCBTU0xfTUVUSE9EICpUTFN2MV9tZXRob2Qodm9pZCk7CQkvKiBUTFN2MS4wICovCitjb25zdCBTU0xfTUVUSE9EICpUTFN2MV9zZXJ2ZXJfbWV0aG9kKHZvaWQpOwkvKiBUTFN2MS4wICovCitjb25zdCBTU0xfTUVUSE9EICpUTFN2MV9jbGllbnRfbWV0aG9kKHZvaWQpOwkvKiBUTFN2MS4wICovCisKK2NvbnN0IFNTTF9NRVRIT0QgKkRUTFN2MV9tZXRob2Qodm9pZCk7CQkvKiBEVExTdjEuMCAqLworY29uc3QgU1NMX01FVEhPRCAqRFRMU3YxX3NlcnZlcl9tZXRob2Qodm9pZCk7CS8qIERUTFN2MS4wICovCitjb25zdCBTU0xfTUVUSE9EICpEVExTdjFfY2xpZW50X21ldGhvZCh2b2lkKTsJLyogRFRMU3YxLjAgKi8KKworU1RBQ0tfT0YoU1NMX0NJUEhFUikgKlNTTF9nZXRfY2lwaGVycyhjb25zdCBTU0wgKnMpOworCitpbnQgU1NMX2RvX2hhbmRzaGFrZShTU0wgKnMpOworaW50IFNTTF9yZW5lZ290aWF0ZShTU0wgKnMpOworaW50IFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKFNTTCAqcyk7CitpbnQgU1NMX3NodXRkb3duKFNTTCAqcyk7CisKK2NvbnN0IFNTTF9NRVRIT0QgKlNTTF9nZXRfc3NsX21ldGhvZChTU0wgKnMpOworaW50IFNTTF9zZXRfc3NsX21ldGhvZChTU0wgKnMsIGNvbnN0IFNTTF9NRVRIT0QgKm1ldGhvZCk7Citjb25zdCBjaGFyICpTU0xfYWxlcnRfdHlwZV9zdHJpbmdfbG9uZyhpbnQgdmFsdWUpOworY29uc3QgY2hhciAqU1NMX2FsZXJ0X3R5cGVfc3RyaW5nKGludCB2YWx1ZSk7Citjb25zdCBjaGFyICpTU0xfYWxlcnRfZGVzY19zdHJpbmdfbG9uZyhpbnQgdmFsdWUpOworY29uc3QgY2hhciAqU1NMX2FsZXJ0X2Rlc2Nfc3RyaW5nKGludCB2YWx1ZSk7CisKK3ZvaWQgU1NMX3NldF9jbGllbnRfQ0FfbGlzdChTU0wgKnMsIFNUQUNLX09GKFg1MDlfTkFNRSkgKm5hbWVfbGlzdCk7Cit2b2lkIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KFNTTF9DVFggKmN0eCwgU1RBQ0tfT0YoWDUwOV9OQU1FKSAqbmFtZV9saXN0KTsKK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9nZXRfY2xpZW50X0NBX2xpc3QoY29uc3QgU1NMICpzKTsKK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9DVFhfZ2V0X2NsaWVudF9DQV9saXN0KGNvbnN0IFNTTF9DVFggKnMpOworaW50IFNTTF9hZGRfY2xpZW50X0NBKFNTTCAqc3NsLFg1MDkgKngpOworaW50IFNTTF9DVFhfYWRkX2NsaWVudF9DQShTU0xfQ1RYICpjdHgsWDUwOSAqeCk7CisKK3ZvaWQgU1NMX3NldF9jb25uZWN0X3N0YXRlKFNTTCAqcyk7Cit2b2lkIFNTTF9zZXRfYWNjZXB0X3N0YXRlKFNTTCAqcyk7CisKK2xvbmcgU1NMX2dldF9kZWZhdWx0X3RpbWVvdXQoY29uc3QgU1NMICpzKTsKKworaW50IFNTTF9saWJyYXJ5X2luaXQodm9pZCApOworCitjaGFyICpTU0xfQ0lQSEVSX2Rlc2NyaXB0aW9uKGNvbnN0IFNTTF9DSVBIRVIgKixjaGFyICpidWYsaW50IHNpemUpOworU1RBQ0tfT0YoWDUwOV9OQU1FKSAqU1NMX2R1cF9DQV9saXN0KFNUQUNLX09GKFg1MDlfTkFNRSkgKnNrKTsKKworU1NMICpTU0xfZHVwKFNTTCAqc3NsKTsKKworWDUwOSAqU1NMX2dldF9jZXJ0aWZpY2F0ZShjb25zdCBTU0wgKnNzbCk7CisvKiBFVlBfUEtFWSAqLyBzdHJ1Y3QgZXZwX3BrZXlfc3QgKlNTTF9nZXRfcHJpdmF0ZWtleShTU0wgKnNzbCk7CisKK3ZvaWQgU1NMX0NUWF9zZXRfcXVpZXRfc2h1dGRvd24oU1NMX0NUWCAqY3R4LGludCBtb2RlKTsKK2ludCBTU0xfQ1RYX2dldF9xdWlldF9zaHV0ZG93bihjb25zdCBTU0xfQ1RYICpjdHgpOwordm9pZCBTU0xfc2V0X3F1aWV0X3NodXRkb3duKFNTTCAqc3NsLGludCBtb2RlKTsKK2ludCBTU0xfZ2V0X3F1aWV0X3NodXRkb3duKGNvbnN0IFNTTCAqc3NsKTsKK3ZvaWQgU1NMX3NldF9zaHV0ZG93bihTU0wgKnNzbCxpbnQgbW9kZSk7CitpbnQgU1NMX2dldF9zaHV0ZG93bihjb25zdCBTU0wgKnNzbCk7CitpbnQgU1NMX3ZlcnNpb24oY29uc3QgU1NMICpzc2wpOworaW50IFNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKFNTTF9DVFggKmN0eCk7CitpbnQgU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICpDQWZpbGUsCisJY29uc3QgY2hhciAqQ0FwYXRoKTsKKyNkZWZpbmUgU1NMX2dldDBfc2Vzc2lvbiBTU0xfZ2V0X3Nlc3Npb24gLyoganVzdCBwZWVrIGF0IHBvaW50ZXIgKi8KK1NTTF9TRVNTSU9OICpTU0xfZ2V0X3Nlc3Npb24oY29uc3QgU1NMICpzc2wpOworU1NMX1NFU1NJT04gKlNTTF9nZXQxX3Nlc3Npb24oU1NMICpzc2wpOyAvKiBvYnRhaW4gYSByZWZlcmVuY2UgY291bnQgKi8KK1NTTF9DVFggKlNTTF9nZXRfU1NMX0NUWChjb25zdCBTU0wgKnNzbCk7CitTU0xfQ1RYICpTU0xfc2V0X1NTTF9DVFgoU1NMICpzc2wsIFNTTF9DVFgqIGN0eCk7Cit2b2lkIFNTTF9zZXRfaW5mb19jYWxsYmFjayhTU0wgKnNzbCwKKwkJCSAgIHZvaWQgKCpjYikoY29uc3QgU1NMICpzc2wsaW50IHR5cGUsaW50IHZhbCkpOwordm9pZCAoKlNTTF9nZXRfaW5mb19jYWxsYmFjayhjb25zdCBTU0wgKnNzbCkpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpOworaW50IFNTTF9zdGF0ZShjb25zdCBTU0wgKnNzbCk7CisKK3ZvaWQgU1NMX3NldF92ZXJpZnlfcmVzdWx0KFNTTCAqc3NsLGxvbmcgdik7Citsb25nIFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChjb25zdCBTU0wgKnNzbCk7CisKK2ludCBTU0xfc2V0X2V4X2RhdGEoU1NMICpzc2wsaW50IGlkeCx2b2lkICpkYXRhKTsKK3ZvaWQgKlNTTF9nZXRfZXhfZGF0YShjb25zdCBTU0wgKnNzbCxpbnQgaWR4KTsKK2ludCBTU0xfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsIHZvaWQgKmFyZ3AsIENSWVBUT19FWF9uZXcgKm5ld19mdW5jLAorCUNSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKTsKKworaW50IFNTTF9TRVNTSU9OX3NldF9leF9kYXRhKFNTTF9TRVNTSU9OICpzcyxpbnQgaWR4LHZvaWQgKmRhdGEpOwordm9pZCAqU1NMX1NFU1NJT05fZ2V0X2V4X2RhdGEoY29uc3QgU1NMX1NFU1NJT04gKnNzLGludCBpZHgpOworaW50IFNTTF9TRVNTSU9OX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwlDUllQVE9fRVhfZHVwICpkdXBfZnVuYywgQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYyk7CisKK2ludCBTU0xfQ1RYX3NldF9leF9kYXRhKFNTTF9DVFggKnNzbCxpbnQgaWR4LHZvaWQgKmRhdGEpOwordm9pZCAqU1NMX0NUWF9nZXRfZXhfZGF0YShjb25zdCBTU0xfQ1RYICpzc2wsaW50IGlkeCk7CitpbnQgU1NMX0NUWF9nZXRfZXhfbmV3X2luZGV4KGxvbmcgYXJnbCwgdm9pZCAqYXJncCwgQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsIENSWVBUT19FWF9mcmVlICpmcmVlX2Z1bmMpOworCitpbnQgU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeCh2b2lkICk7CisKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX3NldF9jYWNoZV9zaXplKGN0eCx0KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfU0VTU19DQUNIRV9TSVpFLHQsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXNzX2dldF9jYWNoZV9zaXplKGN0eCkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfR0VUX1NFU1NfQ0FDSEVfU0laRSwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjdHgsbSkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VUX1NFU1NfQ0FDSEVfTU9ERSxtLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfZ2V0X3Nlc3Npb25fY2FjaGVfbW9kZShjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX0dFVF9TRVNTX0NBQ0hFX01PREUsMCxOVUxMKQorCisjZGVmaW5lIFNTTF9DVFhfZ2V0X2RlZmF1bHRfcmVhZF9haGVhZChjdHgpIFNTTF9DVFhfZ2V0X3JlYWRfYWhlYWQoY3R4KQorI2RlZmluZSBTU0xfQ1RYX3NldF9kZWZhdWx0X3JlYWRfYWhlYWQoY3R4LG0pIFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQoY3R4LG0pCisjZGVmaW5lIFNTTF9DVFhfZ2V0X3JlYWRfYWhlYWQoY3R4KSBcCisJU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9HRVRfUkVBRF9BSEVBRCwwLE5VTEwpCisjZGVmaW5lIFNTTF9DVFhfc2V0X3JlYWRfYWhlYWQoY3R4LG0pIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9SRUFEX0FIRUFELG0sTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9nZXRfbWF4X2NlcnRfbGlzdChjdHgpIFwKKwlTU0xfQ1RYX2N0cmwoY3R4LFNTTF9DVFJMX0dFVF9NQVhfQ0VSVF9MSVNULDAsTlVMTCkKKyNkZWZpbmUgU1NMX0NUWF9zZXRfbWF4X2NlcnRfbGlzdChjdHgsbSkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VUX01BWF9DRVJUX0xJU1QsbSxOVUxMKQorI2RlZmluZSBTU0xfZ2V0X21heF9jZXJ0X2xpc3Qoc3NsKSBcCisJU1NMX2N0cmwoc3NsLFNTTF9DVFJMX0dFVF9NQVhfQ0VSVF9MSVNULDAsTlVMTCkKKyNkZWZpbmUgU1NMX3NldF9tYXhfY2VydF9saXN0KHNzbCxtKSBcCisJU1NMX2N0cmwoc3NsLFNTTF9DVFJMX1NFVF9NQVhfQ0VSVF9MSVNULG0sTlVMTCkKKworI2RlZmluZSBTU0xfQ1RYX3NldF9tYXhfc2VuZF9mcmFnbWVudChjdHgsbSkgXAorCVNTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VUX01BWF9TRU5EX0ZSQUdNRU5ULG0sTlVMTCkKKyNkZWZpbmUgU1NMX3NldF9tYXhfc2VuZF9mcmFnbWVudChzc2wsbSkgXAorCVNTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfTUFYX1NFTkRfRlJBR01FTlQsbSxOVUxMKQorCisgICAgIC8qIE5COiB0aGUga2V5bGVuZ3RoIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIGlzX2V4cG9ydCBpcyB0cnVlICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCit2b2lkIFNTTF9DVFhfc2V0X3RtcF9yc2FfY2FsbGJhY2soU1NMX0NUWCAqY3R4LAorCQkJCSAgUlNBICooKmNiKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorCQkJCQkgICAgIGludCBrZXlsZW5ndGgpKTsKKwordm9pZCBTU0xfc2V0X3RtcF9yc2FfY2FsbGJhY2soU1NMICpzc2wsCisJCQkJICBSU0EgKigqY2IpKFNTTCAqc3NsLGludCBpc19leHBvcnQsCisJCQkJCSAgICAgaW50IGtleWxlbmd0aCkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKK3ZvaWQgU1NMX0NUWF9zZXRfdG1wX2RoX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwKKwkJCQkgREggKigqZGgpKFNTTCAqc3NsLGludCBpc19leHBvcnQsCisJCQkJCSAgIGludCBrZXlsZW5ndGgpKTsKK3ZvaWQgU1NMX3NldF90bXBfZGhfY2FsbGJhY2soU1NMICpzc2wsCisJCQkJIERIICooKmRoKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorCQkJCQkgICBpbnQga2V5bGVuZ3RoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICit2b2lkIFNTTF9DVFhfc2V0X3RtcF9lY2RoX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwKKwkJCQkgRUNfS0VZICooKmVjZGgpKFNTTCAqc3NsLGludCBpc19leHBvcnQsCisJCQkJCSAgIGludCBrZXlsZW5ndGgpKTsKK3ZvaWQgU1NMX3NldF90bXBfZWNkaF9jYWxsYmFjayhTU0wgKnNzbCwKKwkJCQkgRUNfS0VZICooKmVjZGgpKFNTTCAqc3NsLGludCBpc19leHBvcnQsCisJCQkJCSAgIGludCBrZXlsZW5ndGgpKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorY29uc3QgQ09NUF9NRVRIT0QgKlNTTF9nZXRfY3VycmVudF9jb21wcmVzc2lvbihTU0wgKnMpOworY29uc3QgQ09NUF9NRVRIT0QgKlNTTF9nZXRfY3VycmVudF9leHBhbnNpb24oU1NMICpzKTsKK2NvbnN0IGNoYXIgKlNTTF9DT01QX2dldF9uYW1lKGNvbnN0IENPTVBfTUVUSE9EICpjb21wKTsKK1NUQUNLX09GKFNTTF9DT01QKSAqU1NMX0NPTVBfZ2V0X2NvbXByZXNzaW9uX21ldGhvZHModm9pZCk7CitpbnQgU1NMX0NPTVBfYWRkX2NvbXByZXNzaW9uX21ldGhvZChpbnQgaWQsQ09NUF9NRVRIT0QgKmNtKTsKKyNlbHNlCitjb25zdCB2b2lkICpTU0xfZ2V0X2N1cnJlbnRfY29tcHJlc3Npb24oU1NMICpzKTsKK2NvbnN0IHZvaWQgKlNTTF9nZXRfY3VycmVudF9leHBhbnNpb24oU1NMICpzKTsKK2NvbnN0IGNoYXIgKlNTTF9DT01QX2dldF9uYW1lKGNvbnN0IHZvaWQgKmNvbXApOwordm9pZCAqU1NMX0NPTVBfZ2V0X2NvbXByZXNzaW9uX21ldGhvZHModm9pZCk7CitpbnQgU1NMX0NPTVBfYWRkX2NvbXByZXNzaW9uX21ldGhvZChpbnQgaWQsdm9pZCAqY20pOworI2VuZGlmCisKKy8qIFRMUyBleHRlbnNpb25zIGZ1bmN0aW9ucyAqLworaW50IFNTTF9zZXRfc2Vzc2lvbl90aWNrZXRfZXh0KFNTTCAqcywgdm9pZCAqZXh0X2RhdGEsIGludCBleHRfbGVuKTsKKworaW50IFNTTF9zZXRfc2Vzc2lvbl90aWNrZXRfZXh0X2NiKFNTTCAqcywgdGxzX3Nlc3Npb25fdGlja2V0X2V4dF9jYl9mbiBjYiwKKwkJCQkgIHZvaWQgKmFyZyk7CisKKy8qIFByZS1zaGFyZWQgc2VjcmV0IHNlc3Npb24gcmVzdW1wdGlvbiBmdW5jdGlvbnMgKi8KK2ludCBTU0xfc2V0X3Nlc3Npb25fc2VjcmV0X2NiKFNTTCAqcywgdGxzX3Nlc3Npb25fc2VjcmV0X2NiX2ZuIHRsc19zZXNzaW9uX3NlY3JldF9jYiwgdm9pZCAqYXJnKTsKKworLyogQkVHSU4gRVJST1IgQ09ERVMgKi8KKy8qIFRoZSBmb2xsb3dpbmcgbGluZXMgYXJlIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzY3JpcHQgbWtlcnIucGwuIEFueSBjaGFuZ2VzCisgKiBtYWRlIGFmdGVyIHRoaXMgcG9pbnQgbWF5IGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBpcyBuZXh0IHJ1bi4KKyAqLwordm9pZCBFUlJfbG9hZF9TU0xfc3RyaW5ncyh2b2lkKTsKKworLyogRXJyb3IgY29kZXMgZm9yIHRoZSBTU0wgZnVuY3Rpb25zLiAqLworCisvKiBGdW5jdGlvbiBjb2Rlcy4gKi8KKyNkZWZpbmUgU1NMX0ZfQ0xJRU5UX0NFUlRJRklDQVRFCQkJIDEwMAorI2RlZmluZSBTU0xfRl9DTElFTlRfRklOSVNIRUQJCQkJIDE2NworI2RlZmluZSBTU0xfRl9DTElFTlRfSEVMTE8JCQkJIDEwMQorI2RlZmluZSBTU0xfRl9DTElFTlRfTUFTVEVSX0tFWQkJCQkgMTAyCisjZGVmaW5lIFNTTF9GX0QySV9TU0xfU0VTU0lPTgkJCQkgMTAzCisjZGVmaW5lIFNTTF9GX0RPX0RUTFMxX1dSSVRFCQkJCSAyNDUKKyNkZWZpbmUgU1NMX0ZfRE9fU1NMM19XUklURQkJCQkgMTA0CisjZGVmaW5lIFNTTF9GX0RUTFMxX0FDQ0VQVAkJCQkgMjQ2CisjZGVmaW5lIFNTTF9GX0RUTFMxX0FERF9DRVJUX1RPX0JVRgkJCSAyOTUKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfQlVGRkVSX1JFQ09SRAkJCSAyNDcKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfQ0xJRU5UX0hFTExPCQkJIDI0OAorI2RlZmluZSBTU0xfRl9EVExTMV9DT05ORUNUCQkJCSAyNDkKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfRU5DCQkJCQkgMjUwCisjZGVmaW5lIFNTTF9GX0RUTFMxX0dFVF9IRUxMT19WRVJJRlkJCQkgMjUxCisjZGVmaW5lIFNTTF9GX0RUTFMxX0dFVF9NRVNTQUdFCQkJCSAyNTIKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfR0VUX01FU1NBR0VfRlJBR01FTlQJCSAyNTMKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfR0VUX1JFQ09SRAkJCQkgMjU0CisjZGVmaW5lIFNTTF9GX0RUTFMxX0hBTkRMRV9USU1FT1VUCQkJIDI5NworI2RlZmluZSBTU0xfRl9EVExTMV9PVVRQVVRfQ0VSVF9DSEFJTgkJCSAyNTUKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfUFJFUFJPQ0VTU19GUkFHTUVOVAkJCSAyODgKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfUFJPQ0VTU19PVVRfT0ZfU0VRX01FU1NBR0UJCSAyNTYKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfUFJPQ0VTU19SRUNPUkQJCQkgMjU3CisjZGVmaW5lIFNTTF9GX0RUTFMxX1JFQURfQllURVMJCQkJIDI1OAorI2RlZmluZSBTU0xfRl9EVExTMV9SRUFEX0ZBSUxFRAkJCQkgMjU5CisjZGVmaW5lIFNTTF9GX0RUTFMxX1NFTkRfQ0VSVElGSUNBVEVfUkVRVUVTVAkJIDI2MAorI2RlZmluZSBTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURQkJIDI2MQorI2RlZmluZSBTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UJCSAyNjIKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfVkVSSUZZCQkJIDI2MworI2RlZmluZSBTU0xfRl9EVExTMV9TRU5EX0hFTExPX1ZFUklGWV9SRVFVRVNUCQkgMjY0CisjZGVmaW5lIFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0NFUlRJRklDQVRFCQkgMjY1CisjZGVmaW5lIFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0hFTExPCQkJIDI2NgorI2RlZmluZSBTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UJCSAyNjcKKyNkZWZpbmUgU1NMX0ZfRFRMUzFfV1JJVEVfQVBQX0RBVEFfQllURVMJCSAyNjgKKyNkZWZpbmUgU1NMX0ZfR0VUX0NMSUVOVF9GSU5JU0hFRAkJCSAxMDUKKyNkZWZpbmUgU1NMX0ZfR0VUX0NMSUVOVF9IRUxMTwkJCQkgMTA2CisjZGVmaW5lIFNTTF9GX0dFVF9DTElFTlRfTUFTVEVSX0tFWQkJCSAxMDcKKyNkZWZpbmUgU1NMX0ZfR0VUX1NFUlZFUl9GSU5JU0hFRAkJCSAxMDgKKyNkZWZpbmUgU1NMX0ZfR0VUX1NFUlZFUl9IRUxMTwkJCQkgMTA5CisjZGVmaW5lIFNTTF9GX0dFVF9TRVJWRVJfVkVSSUZZCQkJCSAxMTAKKyNkZWZpbmUgU1NMX0ZfSTJEX1NTTF9TRVNTSU9OCQkJCSAxMTEKKyNkZWZpbmUgU1NMX0ZfUkVBRF9OCQkJCQkgMTEyCisjZGVmaW5lIFNTTF9GX1JFUVVFU1RfQ0VSVElGSUNBVEUJCQkgMTEzCisjZGVmaW5lIFNTTF9GX1NFUlZFUl9GSU5JU0gJCQkJIDIzOQorI2RlZmluZSBTU0xfRl9TRVJWRVJfSEVMTE8JCQkJIDExNAorI2RlZmluZSBTU0xfRl9TRVJWRVJfVkVSSUZZCQkJCSAyNDAKKyNkZWZpbmUgU1NMX0ZfU1NMMjNfQUNDRVBUCQkJCSAxMTUKKyNkZWZpbmUgU1NMX0ZfU1NMMjNfQ0xJRU5UX0hFTExPCQkJIDExNgorI2RlZmluZSBTU0xfRl9TU0wyM19DT05ORUNUCQkJCSAxMTcKKyNkZWZpbmUgU1NMX0ZfU1NMMjNfR0VUX0NMSUVOVF9IRUxMTwkJCSAxMTgKKyNkZWZpbmUgU1NMX0ZfU1NMMjNfR0VUX1NFUlZFUl9IRUxMTwkJCSAxMTkKKyNkZWZpbmUgU1NMX0ZfU1NMMjNfUEVFSwkJCQkgMjM3CisjZGVmaW5lIFNTTF9GX1NTTDIzX1JFQUQJCQkJIDEyMAorI2RlZmluZSBTU0xfRl9TU0wyM19XUklURQkJCQkgMTIxCisjZGVmaW5lIFNTTF9GX1NTTDJfQUNDRVBUCQkJCSAxMjIKKyNkZWZpbmUgU1NMX0ZfU1NMMl9DT05ORUNUCQkJCSAxMjMKKyNkZWZpbmUgU1NMX0ZfU1NMMl9FTkNfSU5JVAkJCQkgMTI0CisjZGVmaW5lIFNTTF9GX1NTTDJfR0VORVJBVEVfS0VZX01BVEVSSUFMCQkgMjQxCisjZGVmaW5lIFNTTF9GX1NTTDJfUEVFSwkJCQkJIDIzNAorI2RlZmluZSBTU0xfRl9TU0wyX1JFQUQJCQkJCSAxMjUKKyNkZWZpbmUgU1NMX0ZfU1NMMl9SRUFEX0lOVEVSTkFMCQkJIDIzNgorI2RlZmluZSBTU0xfRl9TU0wyX1NFVF9DRVJUSUZJQ0FURQkJCSAxMjYKKyNkZWZpbmUgU1NMX0ZfU1NMMl9XUklURQkJCQkgMTI3CisjZGVmaW5lIFNTTF9GX1NTTDNfQUNDRVBUCQkJCSAxMjgKKyNkZWZpbmUgU1NMX0ZfU1NMM19BRERfQ0VSVF9UT19CVUYJCQkgMjk2CisjZGVmaW5lIFNTTF9GX1NTTDNfQ0FMTEJBQ0tfQ1RSTAkJCSAyMzMKKyNkZWZpbmUgU1NMX0ZfU1NMM19DSEFOR0VfQ0lQSEVSX1NUQVRFCQkJIDEyOQorI2RlZmluZSBTU0xfRl9TU0wzX0NIRUNLX0NFUlRfQU5EX0FMR09SSVRITQkJIDEzMAorI2RlZmluZSBTU0xfRl9TU0wzX0NMSUVOVF9IRUxMTwkJCQkgMTMxCisjZGVmaW5lIFNTTF9GX1NTTDNfQ09OTkVDVAkJCQkgMTMyCisjZGVmaW5lIFNTTF9GX1NTTDNfQ1RSTAkJCQkJIDIxMworI2RlZmluZSBTU0xfRl9TU0wzX0NUWF9DVFJMCQkJCSAxMzMKKyNkZWZpbmUgU1NMX0ZfU1NMM19ESUdFU1RfQ0FDSEVEX1JFQ09SRFMJCSAyOTMKKyNkZWZpbmUgU1NMX0ZfU1NMM19ET19DSEFOR0VfQ0lQSEVSX1NQRUMJCSAyOTIKKyNkZWZpbmUgU1NMX0ZfU1NMM19FTkMJCQkJCSAxMzQKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRU5FUkFURV9LRVlfQkxPQ0sJCQkgMjM4CisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX0NFUlRJRklDQVRFX1JFUVVFU1QJCSAxMzUKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMJCQkgMjg5CisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX0NFUlRfVkVSSUZZCQkJIDEzNgorI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9DTElFTlRfQ0VSVElGSUNBVEUJCSAxMzcKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0hFTExPCQkJIDEzOAorI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFCQkgMTM5CisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX0ZJTklTSEVECQkJCSAxNDAKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfS0VZX0VYQ0hBTkdFCQkJIDE0MQorI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9NRVNTQUdFCQkJCSAxNDIKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfTkVXX1NFU1NJT05fVElDS0VUCQkgMjgzCisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX1JFQ09SRAkJCQkgMTQzCisjZGVmaW5lIFNTTF9GX1NTTDNfR0VUX1NFUlZFUl9DRVJUSUZJQ0FURQkJIDE0NAorI2RlZmluZSBTU0xfRl9TU0wzX0dFVF9TRVJWRVJfRE9ORQkJCSAxNDUKKyNkZWZpbmUgU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0hFTExPCQkJIDE0NgorI2RlZmluZSBTU0xfRl9TU0wzX0hBTkRTSEFLRV9NQUMJCQkgMjg1CisjZGVmaW5lIFNTTF9GX1NTTDNfTkVXX1NFU1NJT05fVElDS0VUCQkJIDI4NworI2RlZmluZSBTU0xfRl9TU0wzX09VVFBVVF9DRVJUX0NIQUlOCQkJIDE0NworI2RlZmluZSBTU0xfRl9TU0wzX1BFRUsJCQkJCSAyMzUKKyNkZWZpbmUgU1NMX0ZfU1NMM19SRUFEX0JZVEVTCQkJCSAxNDgKKyNkZWZpbmUgU1NMX0ZfU1NMM19SRUFEX04JCQkJIDE0OQorI2RlZmluZSBTU0xfRl9TU0wzX1NFTkRfQ0VSVElGSUNBVEVfUkVRVUVTVAkJIDE1MAorI2RlZmluZSBTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFCQkgMTUxCisjZGVmaW5lIFNTTF9GX1NTTDNfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFCQkgMTUyCisjZGVmaW5lIFNTTF9GX1NTTDNfU0VORF9DTElFTlRfVkVSSUZZCQkJIDE1MworI2RlZmluZSBTU0xfRl9TU0wzX1NFTkRfU0VSVkVSX0NFUlRJRklDQVRFCQkgMTU0CisjZGVmaW5lIFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfSEVMTE8JCQkgMjQyCisjZGVmaW5lIFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFCQkgMTU1CisjZGVmaW5lIFNTTF9GX1NTTDNfU0VUVVBfS0VZX0JMT0NLCQkJIDE1NworI2RlZmluZSBTU0xfRl9TU0wzX1NFVFVQX1JFQURfQlVGRkVSCQkJIDE1NgorI2RlZmluZSBTU0xfRl9TU0wzX1NFVFVQX1dSSVRFX0JVRkZFUgkJCSAyOTEKKyNkZWZpbmUgU1NMX0ZfU1NMM19XUklURV9CWVRFUwkJCQkgMTU4CisjZGVmaW5lIFNTTF9GX1NTTDNfV1JJVEVfUEVORElORwkJCSAxNTkKKyNkZWZpbmUgU1NMX0ZfU1NMX0FERF9DTElFTlRIRUxMT19SRU5FR09USUFURV9FWFQJIDI5OAorI2RlZmluZSBTU0xfRl9TU0xfQUREX0NMSUVOVEhFTExPX1RMU0VYVAkJIDI3NworI2RlZmluZSBTU0xfRl9TU0xfQUREX0RJUl9DRVJUX1NVQkpFQ1RTX1RPX1NUQUNLCSAyMTUKKyNkZWZpbmUgU1NMX0ZfU1NMX0FERF9GSUxFX0NFUlRfU1VCSkVDVFNfVE9fU1RBQ0sJIDIxNgorI2RlZmluZSBTU0xfRl9TU0xfQUREX1NFUlZFUkhFTExPX1JFTkVHT1RJQVRFX0VYVAkgMjk5CisjZGVmaW5lIFNTTF9GX1NTTF9BRERfU0VSVkVSSEVMTE9fVExTRVhUCQkgMjc4CisjZGVmaW5lIFNTTF9GX1NTTF9CQURfTUVUSE9ECQkJCSAxNjAKKyNkZWZpbmUgU1NMX0ZfU1NMX0JZVEVTX1RPX0NJUEhFUl9MSVNUCQkJIDE2MQorI2RlZmluZSBTU0xfRl9TU0xfQ0VSVF9EVVAJCQkJIDIyMQorI2RlZmluZSBTU0xfRl9TU0xfQ0VSVF9JTlNUCQkJCSAyMjIKKyNkZWZpbmUgU1NMX0ZfU1NMX0NFUlRfSU5TVEFOVElBVEUJCQkgMjE0CisjZGVmaW5lIFNTTF9GX1NTTF9DRVJUX05FVwkJCQkgMTYyCisjZGVmaW5lIFNTTF9GX1NTTF9DSEVDS19QUklWQVRFX0tFWQkJCSAxNjMKKyNkZWZpbmUgU1NMX0ZfU1NMX0NIRUNLX1NFUlZFUkhFTExPX1RMU0VYVAkJIDI4MAorI2RlZmluZSBTU0xfRl9TU0xfQ0hFQ0tfU1JWUl9FQ0NfQ0VSVF9BTkRfQUxHCQkgMjc5CisjZGVmaW5lIFNTTF9GX1NTTF9DSVBIRVJfUFJPQ0VTU19SVUxFU1RSCQkgMjMwCisjZGVmaW5lIFNTTF9GX1NTTF9DSVBIRVJfU1RSRU5HVEhfU09SVAkJCSAyMzEKKyNkZWZpbmUgU1NMX0ZfU1NMX0NMRUFSCQkJCQkgMTY0CisjZGVmaW5lIFNTTF9GX1NTTF9DT01QX0FERF9DT01QUkVTU0lPTl9NRVRIT0QJCSAxNjUKKyNkZWZpbmUgU1NMX0ZfU1NMX0NSRUFURV9DSVBIRVJfTElTVAkJCSAxNjYKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUUkwJCQkJCSAyMzIKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9DSEVDS19QUklWQVRFX0tFWQkJCSAxNjgKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9ORVcJCQkJIDE2OQorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1NFVF9DSVBIRVJfTElTVAkJCSAyNjkKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9TRVRfQ0xJRU5UX0NFUlRfRU5HSU5FCQkgMjkwCisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfU0VUX1BVUlBPU0UJCQkgMjI2CisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfU0VUX1NFU1NJT05fSURfQ09OVEVYVAkJIDIxOQorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1NFVF9TU0xfVkVSU0lPTgkJCSAxNzAKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9TRVRfVFJVU1QJCQkJIDIyOQorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURQkJCSAxNzEKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9VU0VfQ0VSVElGSUNBVEVfQVNOMQkJIDE3MgorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURV9DSEFJTl9GSUxFCSAyMjAKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9VU0VfQ0VSVElGSUNBVEVfRklMRQkJIDE3MworI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1VTRV9QUklWQVRFS0VZCQkJIDE3NAorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1VTRV9QUklWQVRFS0VZX0FTTjEJCSAxNzUKKyNkZWZpbmUgU1NMX0ZfU1NMX0NUWF9VU0VfUFJJVkFURUtFWV9GSUxFCQkgMTc2CisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfVVNFX1BTS19JREVOVElUWV9ISU5UCQkgMjcyCisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfVVNFX1JTQVBSSVZBVEVLRVkJCQkgMTc3CisjZGVmaW5lIFNTTF9GX1NTTF9DVFhfVVNFX1JTQVBSSVZBVEVLRVlfQVNOMQkJIDE3OAorI2RlZmluZSBTU0xfRl9TU0xfQ1RYX1VTRV9SU0FQUklWQVRFS0VZX0ZJTEUJCSAxNzkKKyNkZWZpbmUgU1NMX0ZfU1NMX0RPX0hBTkRTSEFLRQkJCQkgMTgwCisjZGVmaW5lIFNTTF9GX1NTTF9HRVRfTkVXX1NFU1NJT04JCQkgMTgxCisjZGVmaW5lIFNTTF9GX1NTTF9HRVRfUFJFVl9TRVNTSU9OCQkJIDIxNworI2RlZmluZSBTU0xfRl9TU0xfR0VUX1NFUlZFUl9TRU5EX0NFUlQJCQkgMTgyCisjZGVmaW5lIFNTTF9GX1NTTF9HRVRfU0lHTl9QS0VZCQkJCSAxODMKKyNkZWZpbmUgU1NMX0ZfU1NMX0lOSVRfV0JJT19CVUZGRVIJCQkgMTg0CisjZGVmaW5lIFNTTF9GX1NTTF9MT0FEX0NMSUVOVF9DQV9GSUxFCQkJIDE4NQorI2RlZmluZSBTU0xfRl9TU0xfTkVXCQkJCQkgMTg2CisjZGVmaW5lIFNTTF9GX1NTTF9QQVJTRV9DTElFTlRIRUxMT19SRU5FR09USUFURV9FWFQJIDMwMAorI2RlZmluZSBTU0xfRl9TU0xfUEFSU0VfQ0xJRU5USEVMTE9fVExTRVhUCQkgMzAyCisjZGVmaW5lIFNTTF9GX1NTTF9QQVJTRV9TRVJWRVJIRUxMT19SRU5FR09USUFURV9FWFQJIDMwMQorI2RlZmluZSBTU0xfRl9TU0xfUEFSU0VfU0VSVkVSSEVMTE9fVExTRVhUCQkgMzAzCisjZGVmaW5lIFNTTF9GX1NTTF9QRUVLCQkJCQkgMjcwCisjZGVmaW5lIFNTTF9GX1NTTF9QUkVQQVJFX0NMSUVOVEhFTExPX1RMU0VYVAkJIDI4MQorI2RlZmluZSBTU0xfRl9TU0xfUFJFUEFSRV9TRVJWRVJIRUxMT19UTFNFWFQJCSAyODIKKyNkZWZpbmUgU1NMX0ZfU1NMX1JFQUQJCQkJCSAyMjMKKyNkZWZpbmUgU1NMX0ZfU1NMX1JTQV9QUklWQVRFX0RFQ1JZUFQJCQkgMTg3CisjZGVmaW5lIFNTTF9GX1NTTF9SU0FfUFVCTElDX0VOQ1JZUFQJCQkgMTg4CisjZGVmaW5lIFNTTF9GX1NTTF9TRVNTSU9OX05FVwkJCQkgMTg5CisjZGVmaW5lIFNTTF9GX1NTTF9TRVNTSU9OX1BSSU5UX0ZQCQkJIDE5MAorI2RlZmluZSBTU0xfRl9TU0xfU0VTU19DRVJUX05FVwkJCQkgMjI1CisjZGVmaW5lIFNTTF9GX1NTTF9TRVRfQ0VSVAkJCQkgMTkxCisjZGVmaW5lIFNTTF9GX1NTTF9TRVRfQ0lQSEVSX0xJU1QJCQkgMjcxCisjZGVmaW5lIFNTTF9GX1NTTF9TRVRfRkQJCQkJIDE5MgorI2RlZmluZSBTU0xfRl9TU0xfU0VUX1BLRVkJCQkJIDE5MworI2RlZmluZSBTU0xfRl9TU0xfU0VUX1BVUlBPU0UJCQkJIDIyNworI2RlZmluZSBTU0xfRl9TU0xfU0VUX1JGRAkJCQkgMTk0CisjZGVmaW5lIFNTTF9GX1NTTF9TRVRfU0VTU0lPTgkJCQkgMTk1CisjZGVmaW5lIFNTTF9GX1NTTF9TRVRfU0VTU0lPTl9JRF9DT05URVhUCQkgMjE4CisjZGVmaW5lIFNTTF9GX1NTTF9TRVRfU0VTU0lPTl9USUNLRVRfRVhUCQkgMjk0CisjZGVmaW5lIFNTTF9GX1NTTF9TRVRfVFJVU1QJCQkJIDIyOAorI2RlZmluZSBTU0xfRl9TU0xfU0VUX1dGRAkJCQkgMTk2CisjZGVmaW5lIFNTTF9GX1NTTF9TSFVURE9XTgkJCQkgMjI0CisjZGVmaW5lIFNTTF9GX1NTTF9VTkRFRklORURfQ09OU1RfRlVOQ1RJT04JCSAyNDMKKyNkZWZpbmUgU1NMX0ZfU1NMX1VOREVGSU5FRF9GVU5DVElPTgkJCSAxOTcKKyNkZWZpbmUgU1NMX0ZfU1NMX1VOREVGSU5FRF9WT0lEX0ZVTkNUSU9OCQkgMjQ0CisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfQ0VSVElGSUNBVEUJCQkgMTk4CisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfQ0VSVElGSUNBVEVfQVNOMQkJCSAxOTkKKyNkZWZpbmUgU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURV9DSEFJTgkJCSAyMDAwCisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfQ0VSVElGSUNBVEVfRklMRQkJCSAyMDAKKyNkZWZpbmUgU1NMX0ZfU1NMX1VTRV9QUklWQVRFS0VZCQkJIDIwMQorI2RlZmluZSBTU0xfRl9TU0xfVVNFX1BSSVZBVEVLRVlfQVNOMQkJCSAyMDIKKyNkZWZpbmUgU1NMX0ZfU1NMX1VTRV9QUklWQVRFS0VZX0ZJTEUJCQkgMjAzCisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfUFNLX0lERU5USVRZX0hJTlQJCQkgMjczCisjZGVmaW5lIFNTTF9GX1NTTF9VU0VfUlNBUFJJVkFURUtFWQkJCSAyMDQKKyNkZWZpbmUgU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZX0FTTjEJCSAyMDUKKyNkZWZpbmUgU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZX0ZJTEUJCSAyMDYKKyNkZWZpbmUgU1NMX0ZfU1NMX1ZFUklGWV9DRVJUX0NIQUlOCQkJIDIwNworI2RlZmluZSBTU0xfRl9TU0xfV1JJVEUJCQkJCSAyMDgKKyNkZWZpbmUgU1NMX0ZfVExTMV9DRVJUX1ZFUklGWV9NQUMJCQkgMjg2CisjZGVmaW5lIFNTTF9GX1RMUzFfQ0hBTkdFX0NJUEhFUl9TVEFURQkJCSAyMDkKKyNkZWZpbmUgU1NMX0ZfVExTMV9DSEVDS19TRVJWRVJIRUxMT19UTFNFWFQJCSAyNzQKKyNkZWZpbmUgU1NMX0ZfVExTMV9FTkMJCQkJCSAyMTAKKyNkZWZpbmUgU1NMX0ZfVExTMV9QUkVQQVJFX0NMSUVOVEhFTExPX1RMU0VYVAkJIDI3NQorI2RlZmluZSBTU0xfRl9UTFMxX1BSRVBBUkVfU0VSVkVSSEVMTE9fVExTRVhUCQkgMjc2CisjZGVmaW5lIFNTTF9GX1RMUzFfUFJGCQkJCQkgMjg0CisjZGVmaW5lIFNTTF9GX1RMUzFfU0VUVVBfS0VZX0JMT0NLCQkJIDIxMQorI2RlZmluZSBTU0xfRl9XUklURV9QRU5ESU5HCQkJCSAyMTIKKworLyogUmVhc29uIGNvZGVzLiAqLworI2RlZmluZSBTU0xfUl9BUFBfREFUQV9JTl9IQU5EU0hBS0UJCQkgMTAwCisjZGVmaW5lIFNTTF9SX0FUVEVNUFRfVE9fUkVVU0VfU0VTU0lPTl9JTl9ESUZGRVJFTlRfQ09OVEVYVCAyNzIKKyNkZWZpbmUgU1NMX1JfQkFEX0FMRVJUX1JFQ09SRAkJCQkgMTAxCisjZGVmaW5lIFNTTF9SX0JBRF9BVVRIRU5USUNBVElPTl9UWVBFCQkJIDEwMgorI2RlZmluZSBTU0xfUl9CQURfQ0hBTkdFX0NJUEhFUl9TUEVDCQkJIDEwMworI2RlZmluZSBTU0xfUl9CQURfQ0hFQ0tTVU0JCQkJIDEwNAorI2RlZmluZSBTU0xfUl9CQURfREFUQV9SRVRVUk5FRF9CWV9DQUxMQkFDSwkJIDEwNgorI2RlZmluZSBTU0xfUl9CQURfREVDT01QUkVTU0lPTgkJCQkgMTA3CisjZGVmaW5lIFNTTF9SX0JBRF9ESF9HX0xFTkdUSAkJCQkgMTA4CisjZGVmaW5lIFNTTF9SX0JBRF9ESF9QVUJfS0VZX0xFTkdUSAkJCSAxMDkKKyNkZWZpbmUgU1NMX1JfQkFEX0RIX1BfTEVOR1RICQkJCSAxMTAKKyNkZWZpbmUgU1NMX1JfQkFEX0RJR0VTVF9MRU5HVEgJCQkJIDExMQorI2RlZmluZSBTU0xfUl9CQURfRFNBX1NJR05BVFVSRQkJCQkgMTEyCisjZGVmaW5lIFNTTF9SX0JBRF9FQ0NfQ0VSVAkJCQkgMzA0CisjZGVmaW5lIFNTTF9SX0JBRF9FQ0RTQV9TSUdOQVRVUkUJCQkgMzA1CisjZGVmaW5lIFNTTF9SX0JBRF9FQ1BPSU5UCQkJCSAzMDYKKyNkZWZpbmUgU1NMX1JfQkFEX0hBTkRTSEFLRV9MRU5HVEgJCQkgMzMyCisjZGVmaW5lIFNTTF9SX0JBRF9IRUxMT19SRVFVRVNUCQkJCSAxMDUKKyNkZWZpbmUgU1NMX1JfQkFEX0xFTkdUSAkJCQkgMjcxCisjZGVmaW5lIFNTTF9SX0JBRF9NQUNfREVDT0RFCQkJCSAxMTMKKyNkZWZpbmUgU1NMX1JfQkFEX01BQ19MRU5HVEgJCQkJIDMzMworI2RlZmluZSBTU0xfUl9CQURfTUVTU0FHRV9UWVBFCQkJCSAxMTQKKyNkZWZpbmUgU1NMX1JfQkFEX1BBQ0tFVF9MRU5HVEgJCQkJIDExNQorI2RlZmluZSBTU0xfUl9CQURfUFJPVE9DT0xfVkVSU0lPTl9OVU1CRVIJCSAxMTYKKyNkZWZpbmUgU1NMX1JfQkFEX1BTS19JREVOVElUWV9ISU5UX0xFTkdUSAkJIDMxNgorI2RlZmluZSBTU0xfUl9CQURfUkVTUE9OU0VfQVJHVU1FTlQJCQkgMTE3CisjZGVmaW5lIFNTTF9SX0JBRF9SU0FfREVDUllQVAkJCQkgMTE4CisjZGVmaW5lIFNTTF9SX0JBRF9SU0FfRU5DUllQVAkJCQkgMTE5CisjZGVmaW5lIFNTTF9SX0JBRF9SU0FfRV9MRU5HVEgJCQkJIDEyMAorI2RlZmluZSBTU0xfUl9CQURfUlNBX01PRFVMVVNfTEVOR1RICQkJIDEyMQorI2RlZmluZSBTU0xfUl9CQURfUlNBX1NJR05BVFVSRQkJCQkgMTIyCisjZGVmaW5lIFNTTF9SX0JBRF9TSUdOQVRVUkUJCQkJIDEyMworI2RlZmluZSBTU0xfUl9CQURfU1NMX0ZJTEVUWVBFCQkJCSAxMjQKKyNkZWZpbmUgU1NMX1JfQkFEX1NTTF9TRVNTSU9OX0lEX0xFTkdUSAkJCSAxMjUKKyNkZWZpbmUgU1NMX1JfQkFEX1NUQVRFCQkJCQkgMTI2CisjZGVmaW5lIFNTTF9SX0JBRF9XUklURV9SRVRSWQkJCQkgMTI3CisjZGVmaW5lIFNTTF9SX0JJT19OT1RfU0VUCQkJCSAxMjgKKyNkZWZpbmUgU1NMX1JfQkxPQ0tfQ0lQSEVSX1BBRF9JU19XUk9ORwkJCSAxMjkKKyNkZWZpbmUgU1NMX1JfQk5fTElCCQkJCQkgMTMwCisjZGVmaW5lIFNTTF9SX0NBX0ROX0xFTkdUSF9NSVNNQVRDSAkJCSAxMzEKKyNkZWZpbmUgU1NMX1JfQ0FfRE5fVE9PX0xPTkcJCQkJIDEzMgorI2RlZmluZSBTU0xfUl9DQ1NfUkVDRUlWRURfRUFSTFkJCQkgMTMzCisjZGVmaW5lIFNTTF9SX0NFUlRJRklDQVRFX1ZFUklGWV9GQUlMRUQJCQkgMTM0CisjZGVmaW5lIFNTTF9SX0NFUlRfTEVOR1RIX01JU01BVENICQkJIDEzNQorI2RlZmluZSBTU0xfUl9DSEFMTEVOR0VfSVNfRElGRkVSRU5UCQkJIDEzNgorI2RlZmluZSBTU0xfUl9DSVBIRVJfQ09ERV9XUk9OR19MRU5HVEgJCQkgMTM3CisjZGVmaW5lIFNTTF9SX0NJUEhFUl9PUl9IQVNIX1VOQVZBSUxBQkxFCQkgMTM4CisjZGVmaW5lIFNTTF9SX0NJUEhFUl9UQUJMRV9TUkNfRVJST1IJCQkgMTM5CisjZGVmaW5lIFNTTF9SX0NMSUVOVEhFTExPX1RMU0VYVAkJCSAyMjYKKyNkZWZpbmUgU1NMX1JfQ09NUFJFU1NFRF9MRU5HVEhfVE9PX0xPTkcJCSAxNDAKKyNkZWZpbmUgU1NMX1JfQ09NUFJFU1NJT05fRElTQUJMRUQJCQkgMzQzCisjZGVmaW5lIFNTTF9SX0NPTVBSRVNTSU9OX0ZBSUxVUkUJCQkgMTQxCisjZGVmaW5lIFNTTF9SX0NPTVBSRVNTSU9OX0lEX05PVF9XSVRISU5fUFJJVkFURV9SQU5HRQkgMzA3CisjZGVmaW5lIFNTTF9SX0NPTVBSRVNTSU9OX0xJQlJBUllfRVJST1IJCQkgMTQyCisjZGVmaW5lIFNTTF9SX0NPTk5FQ1RJT05fSURfSVNfRElGRkVSRU5UCQkgMTQzCisjZGVmaW5lIFNTTF9SX0NPTk5FQ1RJT05fVFlQRV9OT1RfU0VUCQkJIDE0NAorI2RlZmluZSBTU0xfUl9DT09LSUVfTUlTTUFUQ0gJCQkJIDMwOAorI2RlZmluZSBTU0xfUl9EQVRBX0JFVFdFRU5fQ0NTX0FORF9GSU5JU0hFRAkJIDE0NQorI2RlZmluZSBTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORwkJCSAxNDYKKyNkZWZpbmUgU1NMX1JfREVDUllQVElPTl9GQUlMRUQJCQkJIDE0NworI2RlZmluZSBTU0xfUl9ERUNSWVBUSU9OX0ZBSUxFRF9PUl9CQURfUkVDT1JEX01BQwkgMjgxCisjZGVmaW5lIFNTTF9SX0RIX1BVQkxJQ19WQUxVRV9MRU5HVEhfSVNfV1JPTkcJCSAxNDgKKyNkZWZpbmUgU1NMX1JfRElHRVNUX0NIRUNLX0ZBSUxFRAkJCSAxNDkKKyNkZWZpbmUgU1NMX1JfRFRMU19NRVNTQUdFX1RPT19CSUcJCQkgMzM0CisjZGVmaW5lIFNTTF9SX0RVUExJQ0FURV9DT01QUkVTU0lPTl9JRAkJCSAzMDkKKyNkZWZpbmUgU1NMX1JfRUNDX0NFUlRfTk9UX0ZPUl9LRVlfQUdSRUVNRU5UCQkgMzE3CisjZGVmaW5lIFNTTF9SX0VDQ19DRVJUX05PVF9GT1JfU0lHTklORwkJCSAzMTgKKyNkZWZpbmUgU1NMX1JfRUNDX0NFUlRfU0hPVUxEX0hBVkVfUlNBX1NJR05BVFVSRQkgMzIyCisjZGVmaW5lIFNTTF9SX0VDQ19DRVJUX1NIT1VMRF9IQVZFX1NIQTFfU0lHTkFUVVJFCSAzMjMKKyNkZWZpbmUgU1NMX1JfRUNHUk9VUF9UT09fTEFSR0VfRk9SX0NJUEhFUgkJIDMxMAorI2RlZmluZSBTU0xfUl9FTkNSWVBURURfTEVOR1RIX1RPT19MT05HCQkJIDE1MAorI2RlZmluZSBTU0xfUl9FUlJPUl9HRU5FUkFUSU5HX1RNUF9SU0FfS0VZCQkgMjgyCisjZGVmaW5lIFNTTF9SX0VSUk9SX0lOX1JFQ0VJVkVEX0NJUEhFUl9MSVNUCQkgMTUxCisjZGVmaW5lIFNTTF9SX0VYQ0VTU0lWRV9NRVNTQUdFX1NJWkUJCQkgMTUyCisjZGVmaW5lIFNTTF9SX0VYVFJBX0RBVEFfSU5fTUVTU0FHRQkJCSAxNTMKKyNkZWZpbmUgU1NMX1JfR09UX0FfRklOX0JFRk9SRV9BX0NDUwkJCSAxNTQKKyNkZWZpbmUgU1NMX1JfSFRUUFNfUFJPWFlfUkVRVUVTVAkJCSAxNTUKKyNkZWZpbmUgU1NMX1JfSFRUUF9SRVFVRVNUCQkJCSAxNTYKKyNkZWZpbmUgU1NMX1JfSUxMRUdBTF9QQURESU5HCQkJCSAyODMKKyNkZWZpbmUgU1NMX1JfSU5DT05TSVNURU5UX0NPTVBSRVNTSU9OCQkJIDM0MAorI2RlZmluZSBTU0xfUl9JTlZBTElEX0NIQUxMRU5HRV9MRU5HVEgJCQkgMTU4CisjZGVmaW5lIFNTTF9SX0lOVkFMSURfQ09NTUFORAkJCQkgMjgwCisjZGVmaW5lIFNTTF9SX0lOVkFMSURfQ09NUFJFU1NJT05fQUxHT1JJVEhNCQkgMzQxCisjZGVmaW5lIFNTTF9SX0lOVkFMSURfUFVSUE9TRQkJCQkgMjc4CisjZGVmaW5lIFNTTF9SX0lOVkFMSURfU1RBVFVTX1JFU1BPTlNFCQkJIDMyOAorI2RlZmluZSBTU0xfUl9JTlZBTElEX1RJQ0tFVF9LRVlTX0xFTkdUSAkJIDMyNQorI2RlZmluZSBTU0xfUl9JTlZBTElEX1RSVVNUCQkJCSAyNzkKKyNkZWZpbmUgU1NMX1JfS0VZX0FSR19UT09fTE9ORwkJCQkgMjg0CisjZGVmaW5lIFNTTF9SX0tSQjUJCQkJCSAyODUKKyNkZWZpbmUgU1NMX1JfS1JCNV9DX0NDX1BSSU5DCQkJCSAyODYKKyNkZWZpbmUgU1NMX1JfS1JCNV9DX0dFVF9DUkVECQkJCSAyODcKKyNkZWZpbmUgU1NMX1JfS1JCNV9DX0lOSVQJCQkJIDI4OAorI2RlZmluZSBTU0xfUl9LUkI1X0NfTUtfUkVRCQkJCSAyODkKKyNkZWZpbmUgU1NMX1JfS1JCNV9TX0JBRF9USUNLRVQJCQkJIDI5MAorI2RlZmluZSBTU0xfUl9LUkI1X1NfSU5JVAkJCQkgMjkxCisjZGVmaW5lIFNTTF9SX0tSQjVfU19SRF9SRVEJCQkJIDI5MgorI2RlZmluZSBTU0xfUl9LUkI1X1NfVEtUX0VYUElSRUQJCQkgMjkzCisjZGVmaW5lIFNTTF9SX0tSQjVfU19US1RfTllWCQkJCSAyOTQKKyNkZWZpbmUgU1NMX1JfS1JCNV9TX1RLVF9TS0VXCQkJCSAyOTUKKyNkZWZpbmUgU1NMX1JfTEVOR1RIX01JU01BVENICQkJCSAxNTkKKyNkZWZpbmUgU1NMX1JfTEVOR1RIX1RPT19TSE9SVAkJCQkgMTYwCisjZGVmaW5lIFNTTF9SX0xJQlJBUllfQlVHCQkJCSAyNzQKKyNkZWZpbmUgU1NMX1JfTElCUkFSWV9IQVNfTk9fQ0lQSEVSUwkJCSAxNjEKKyNkZWZpbmUgU1NMX1JfTUVTU0FHRV9UT09fTE9ORwkJCQkgMjk2CisjZGVmaW5lIFNTTF9SX01JU1NJTkdfREhfRFNBX0NFUlQJCQkgMTYyCisjZGVmaW5lIFNTTF9SX01JU1NJTkdfREhfS0VZCQkJCSAxNjMKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19ESF9SU0FfQ0VSVAkJCSAxNjQKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19EU0FfU0lHTklOR19DRVJUCQkJIDE2NQorI2RlZmluZSBTU0xfUl9NSVNTSU5HX0VYUE9SVF9UTVBfREhfS0VZCQkJIDE2NgorI2RlZmluZSBTU0xfUl9NSVNTSU5HX0VYUE9SVF9UTVBfUlNBX0tFWQkJIDE2NworI2RlZmluZSBTU0xfUl9NSVNTSU5HX1JTQV9DRVJUSUZJQ0FURQkJCSAxNjgKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19SU0FfRU5DUllQVElOR19DRVJUCQkgMTY5CisjZGVmaW5lIFNTTF9SX01JU1NJTkdfUlNBX1NJR05JTkdfQ0VSVAkJCSAxNzAKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19UTVBfREhfS0VZCQkJIDE3MQorI2RlZmluZSBTU0xfUl9NSVNTSU5HX1RNUF9FQ0RIX0tFWQkJCSAzMTEKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19UTVBfUlNBX0tFWQkJCSAxNzIKKyNkZWZpbmUgU1NMX1JfTUlTU0lOR19UTVBfUlNBX1BLRVkJCQkgMTczCisjZGVmaW5lIFNTTF9SX01JU1NJTkdfVkVSSUZZX01FU1NBR0UJCQkgMTc0CisjZGVmaW5lIFNTTF9SX05PTl9TU0xWMl9JTklUSUFMX1BBQ0tFVAkJCSAxNzUKKyNkZWZpbmUgU1NMX1JfTk9fQ0VSVElGSUNBVEVTX1JFVFVSTkVECQkJIDE3NgorI2RlZmluZSBTU0xfUl9OT19DRVJUSUZJQ0FURV9BU1NJR05FRAkJCSAxNzcKKyNkZWZpbmUgU1NMX1JfTk9fQ0VSVElGSUNBVEVfUkVUVVJORUQJCQkgMTc4CisjZGVmaW5lIFNTTF9SX05PX0NFUlRJRklDQVRFX1NFVAkJCSAxNzkKKyNkZWZpbmUgU1NMX1JfTk9fQ0VSVElGSUNBVEVfU1BFQ0lGSUVECQkJIDE4MAorI2RlZmluZSBTU0xfUl9OT19DSVBIRVJTX0FWQUlMQUJMRQkJCSAxODEKKyNkZWZpbmUgU1NMX1JfTk9fQ0lQSEVSU19QQVNTRUQJCQkJIDE4MgorI2RlZmluZSBTU0xfUl9OT19DSVBIRVJTX1NQRUNJRklFRAkJCSAxODMKKyNkZWZpbmUgU1NMX1JfTk9fQ0lQSEVSX0xJU1QJCQkJIDE4NAorI2RlZmluZSBTU0xfUl9OT19DSVBIRVJfTUFUQ0gJCQkJIDE4NQorI2RlZmluZSBTU0xfUl9OT19DTElFTlRfQ0VSVF9NRVRIT0QJCQkgMzMxCisjZGVmaW5lIFNTTF9SX05PX0NMSUVOVF9DRVJUX1JFQ0VJVkVECQkJIDE4NgorI2RlZmluZSBTU0xfUl9OT19DT01QUkVTU0lPTl9TUEVDSUZJRUQJCQkgMTg3CisjZGVmaW5lIFNTTF9SX05PX0dPU1RfQ0VSVElGSUNBVEVfU0VOVF9CWV9QRUVSCQkgMzMwCisjZGVmaW5lIFNTTF9SX05PX01FVEhPRF9TUEVDSUZJRUQJCQkgMTg4CisjZGVmaW5lIFNTTF9SX05PX1BSSVZBVEVLRVkJCQkJIDE4OQorI2RlZmluZSBTU0xfUl9OT19QUklWQVRFX0tFWV9BU1NJR05FRAkJCSAxOTAKKyNkZWZpbmUgU1NMX1JfTk9fUFJPVE9DT0xTX0FWQUlMQUJMRQkJCSAxOTEKKyNkZWZpbmUgU1NMX1JfTk9fUFVCTElDS0VZCQkJCSAxOTIKKyNkZWZpbmUgU1NMX1JfTk9fUkVORUdPVElBVElPTgkJCQkgMzM5CisjZGVmaW5lIFNTTF9SX05PX1JFUVVJUkVEX0RJR0VTVAkJCSAzMjQKKyNkZWZpbmUgU1NMX1JfTk9fU0hBUkVEX0NJUEhFUgkJCQkgMTkzCisjZGVmaW5lIFNTTF9SX05PX1ZFUklGWV9DQUxMQkFDSwkJCSAxOTQKKyNkZWZpbmUgU1NMX1JfTlVMTF9TU0xfQ1RYCQkJCSAxOTUKKyNkZWZpbmUgU1NMX1JfTlVMTF9TU0xfTUVUSE9EX1BBU1NFRAkJCSAxOTYKKyNkZWZpbmUgU1NMX1JfT0xEX1NFU1NJT05fQ0lQSEVSX05PVF9SRVRVUk5FRAkJIDE5NworI2RlZmluZSBTU0xfUl9PTERfU0VTU0lPTl9DT01QUkVTU0lPTl9BTEdPUklUSE1fTk9UX1JFVFVSTkVEIDM0NAorI2RlZmluZSBTU0xfUl9PTkxZX1RMU19BTExPV0VEX0lOX0ZJUFNfTU9ERQkJIDI5NworI2RlZmluZSBTU0xfUl9PUEFRVUVfUFJGX0lOUFVUX1RPT19MT05HCQkJIDMyNworI2RlZmluZSBTU0xfUl9QQUNLRVRfTEVOR1RIX1RPT19MT05HCQkJIDE5OAorI2RlZmluZSBTU0xfUl9QQVJTRV9UTFNFWFQJCQkJIDIyNworI2RlZmluZSBTU0xfUl9QQVRIX1RPT19MT05HCQkJCSAyNzAKKyNkZWZpbmUgU1NMX1JfUEVFUl9ESURfTk9UX1JFVFVSTl9BX0NFUlRJRklDQVRFCQkgMTk5CisjZGVmaW5lIFNTTF9SX1BFRVJfRVJST1IJCQkJIDIwMAorI2RlZmluZSBTU0xfUl9QRUVSX0VSUk9SX0NFUlRJRklDQVRFCQkJIDIwMQorI2RlZmluZSBTU0xfUl9QRUVSX0VSUk9SX05PX0NFUlRJRklDQVRFCQkJIDIwMgorI2RlZmluZSBTU0xfUl9QRUVSX0VSUk9SX05PX0NJUEhFUgkJCSAyMDMKKyNkZWZpbmUgU1NMX1JfUEVFUl9FUlJPUl9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURV9UWVBFCSAyMDQKKyNkZWZpbmUgU1NMX1JfUFJFX01BQ19MRU5HVEhfVE9PX0xPTkcJCQkgMjA1CisjZGVmaW5lIFNTTF9SX1BST0JMRU1TX01BUFBJTkdfQ0lQSEVSX0ZVTkNUSU9OUwkJIDIwNgorI2RlZmluZSBTU0xfUl9QUk9UT0NPTF9JU19TSFVURE9XTgkJCSAyMDcKKyNkZWZpbmUgU1NMX1JfUFNLX0lERU5USVRZX05PVF9GT1VORAkJCSAyMjMKKyNkZWZpbmUgU1NMX1JfUFNLX05PX0NMSUVOVF9DQgkJCQkgMjI0CisjZGVmaW5lIFNTTF9SX1BTS19OT19TRVJWRVJfQ0IJCQkJIDIyNQorI2RlZmluZSBTU0xfUl9QVUJMSUNfS0VZX0VOQ1JZUFRfRVJST1IJCQkgMjA4CisjZGVmaW5lIFNTTF9SX1BVQkxJQ19LRVlfSVNfTk9UX1JTQQkJCSAyMDkKKyNkZWZpbmUgU1NMX1JfUFVCTElDX0tFWV9OT1RfUlNBCQkJIDIxMAorI2RlZmluZSBTU0xfUl9SRUFEX0JJT19OT1RfU0VUCQkJCSAyMTEKKyNkZWZpbmUgU1NMX1JfUkVBRF9USU1FT1VUX0VYUElSRUQJCQkgMzEyCisjZGVmaW5lIFNTTF9SX1JFQURfV1JPTkdfUEFDS0VUX1RZUEUJCQkgMjEyCisjZGVmaW5lIFNTTF9SX1JFQ09SRF9MRU5HVEhfTUlTTUFUQ0gJCQkgMjEzCisjZGVmaW5lIFNTTF9SX1JFQ09SRF9UT09fTEFSR0UJCQkJIDIxNAorI2RlZmluZSBTU0xfUl9SRUNPUkRfVE9PX1NNQUxMCQkJCSAyOTgKKyNkZWZpbmUgU1NMX1JfUkVORUdPVElBVEVfRVhUX1RPT19MT05HCQkJIDMzNQorI2RlZmluZSBTU0xfUl9SRU5FR09USUFUSU9OX0VOQ09ESU5HX0VSUgkJIDMzNgorI2RlZmluZSBTU0xfUl9SRU5FR09USUFUSU9OX01JU01BVENICQkJIDMzNworI2RlZmluZSBTU0xfUl9SRVFVSVJFRF9DSVBIRVJfTUlTU0lORwkJCSAyMTUKKyNkZWZpbmUgU1NMX1JfUkVRVUlSRURfQ09NUFJFU1NTSU9OX0FMR09SSVRITV9NSVNTSU5HCSAzNDIKKyNkZWZpbmUgU1NMX1JfUkVVU0VfQ0VSVF9MRU5HVEhfTk9UX1pFUk8JCSAyMTYKKyNkZWZpbmUgU1NMX1JfUkVVU0VfQ0VSVF9UWVBFX05PVF9aRVJPCQkJIDIxNworI2RlZmluZSBTU0xfUl9SRVVTRV9DSVBIRVJfTElTVF9OT1RfWkVSTwkJIDIxOAorI2RlZmluZSBTU0xfUl9TQ1NWX1JFQ0VJVkVEX1dIRU5fUkVORUdPVElBVElORwkJIDM0NQorI2RlZmluZSBTU0xfUl9TRVJWRVJIRUxMT19UTFNFWFQJCQkgMjc1CisjZGVmaW5lIFNTTF9SX1NFU1NJT05fSURfQ09OVEVYVF9VTklOSVRJQUxJWkVECQkgMjc3CisjZGVmaW5lIFNTTF9SX1NFU1NJT05fTUFZX05PVF9CRV9DUkVBVEVECQkgMjAwMAorI2RlZmluZSBTU0xfUl9TSE9SVF9SRUFECQkJCSAyMTkKKyNkZWZpbmUgU1NMX1JfU0lHTkFUVVJFX0ZPUl9OT05fU0lHTklOR19DRVJUSUZJQ0FURQkgMjIwCisjZGVmaW5lIFNTTF9SX1NTTDIzX0RPSU5HX1NFU1NJT05fSURfUkVVU0UJCSAyMjEKKyNkZWZpbmUgU1NMX1JfU1NMMl9DT05ORUNUSU9OX0lEX1RPT19MT05HCQkgMjk5CisjZGVmaW5lIFNTTF9SX1NTTDNfRVhUX0lOVkFMSURfRUNQT0lOVEZPUk1BVAkJIDMyMQorI2RlZmluZSBTU0xfUl9TU0wzX0VYVF9JTlZBTElEX1NFUlZFUk5BTUUJCSAzMTkKKyNkZWZpbmUgU1NMX1JfU1NMM19FWFRfSU5WQUxJRF9TRVJWRVJOQU1FX1RZUEUJCSAzMjAKKyNkZWZpbmUgU1NMX1JfU1NMM19TRVNTSU9OX0lEX1RPT19MT05HCQkJIDMwMAorI2RlZmluZSBTU0xfUl9TU0wzX1NFU1NJT05fSURfVE9PX1NIT1JUCQkJIDIyMgorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9CQURfQ0VSVElGSUNBVEUJCSAxMDQyCisjZGVmaW5lIFNTTF9SX1NTTFYzX0FMRVJUX0JBRF9SRUNPUkRfTUFDCQkgMTAyMAorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9FWFBJUkVECQkgMTA0NQorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9SRVZPS0VECQkgMTA0NAorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9VTktOT1dOCQkgMTA0NgorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkUJCSAxMDMwCisjZGVmaW5lIFNTTF9SX1NTTFYzX0FMRVJUX0hBTkRTSEFLRV9GQUlMVVJFCQkgMTA0MAorI2RlZmluZSBTU0xfUl9TU0xWM19BTEVSVF9JTExFR0FMX1BBUkFNRVRFUgkJIDEwNDcKKyNkZWZpbmUgU1NMX1JfU1NMVjNfQUxFUlRfTk9fQ0VSVElGSUNBVEUJCSAxMDQxCisjZGVmaW5lIFNTTF9SX1NTTFYzX0FMRVJUX1VORVhQRUNURURfTUVTU0FHRQkJIDEwMTAKKyNkZWZpbmUgU1NMX1JfU1NMVjNfQUxFUlRfVU5TVVBQT1JURURfQ0VSVElGSUNBVEUJIDEwNDMKKyNkZWZpbmUgU1NMX1JfU1NMX0NUWF9IQVNfTk9fREVGQVVMVF9TU0xfVkVSU0lPTgkgMjI4CisjZGVmaW5lIFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRQkJCSAyMjkKKyNkZWZpbmUgU1NMX1JfU1NMX0xJQlJBUllfSEFTX05PX0NJUEhFUlMJCSAyMzAKKyNkZWZpbmUgU1NMX1JfU1NMX1NFU1NJT05fSURfQ0FMTEJBQ0tfRkFJTEVECQkgMzAxCisjZGVmaW5lIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0NPTkZMSUNUCQkJIDMwMgorI2RlZmluZSBTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HCQkgMjczCisjZGVmaW5lIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0hBU19CQURfTEVOR1RICQkgMzAzCisjZGVmaW5lIFNTTF9SX1NTTF9TRVNTSU9OX0lEX0lTX0RJRkZFUkVOVAkJIDIzMQorI2RlZmluZSBTU0xfUl9UTFNWMV9BTEVSVF9BQ0NFU1NfREVOSUVECQkJIDEwNDkKKyNkZWZpbmUgU1NMX1JfVExTVjFfQUxFUlRfREVDT0RFX0VSUk9SCQkJIDEwNTAKKyNkZWZpbmUgU1NMX1JfVExTVjFfQUxFUlRfREVDUllQVElPTl9GQUlMRUQJCSAxMDIxCisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX0RFQ1JZUFRfRVJST1IJCQkgMTA1MQorI2RlZmluZSBTU0xfUl9UTFNWMV9BTEVSVF9FWFBPUlRfUkVTVFJJQ1RJT04JCSAxMDYwCisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX0lOU1VGRklDSUVOVF9TRUNVUklUWQkJIDEwNzEKKyNkZWZpbmUgU1NMX1JfVExTVjFfQUxFUlRfSU5URVJOQUxfRVJST1IJCSAxMDgwCisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX05PX1JFTkVHT1RJQVRJT04JCSAxMTAwCisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX1BST1RPQ09MX1ZFUlNJT04JCSAxMDcwCisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVwkJIDEwMjIKKyNkZWZpbmUgU1NMX1JfVExTVjFfQUxFUlRfVU5LTk9XTl9DQQkJCSAxMDQ4CisjZGVmaW5lIFNTTF9SX1RMU1YxX0FMRVJUX1VTRVJfQ0FOQ0VMTEVECQkgMTA5MAorI2RlZmluZSBTU0xfUl9UTFNWMV9CQURfQ0VSVElGSUNBVEVfSEFTSF9WQUxVRQkJIDExMTQKKyNkZWZpbmUgU1NMX1JfVExTVjFfQkFEX0NFUlRJRklDQVRFX1NUQVRVU19SRVNQT05TRQkgMTExMworI2RlZmluZSBTU0xfUl9UTFNWMV9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEUJCSAxMTExCisjZGVmaW5lIFNTTF9SX1RMU1YxX1VOUkVDT0dOSVpFRF9OQU1FCQkJIDExMTIKKyNkZWZpbmUgU1NMX1JfVExTVjFfVU5TVVBQT1JURURfRVhURU5TSU9OCQkgMTExMAorI2RlZmluZSBTU0xfUl9UTFNfQ0xJRU5UX0NFUlRfUkVRX1dJVEhfQU5PTl9DSVBIRVIJIDIzMgorI2RlZmluZSBTU0xfUl9UTFNfSU5WQUxJRF9FQ1BPSU5URk9STUFUX0xJU1QJCSAxNTcKKyNkZWZpbmUgU1NMX1JfVExTX1BFRVJfRElEX05PVF9SRVNQT05EX1dJVEhfQ0VSVElGSUNBVEVfTElTVCAyMzMKKyNkZWZpbmUgU1NMX1JfVExTX1JTQV9FTkNSWVBURURfVkFMVUVfTEVOR1RIX0lTX1dST05HCSAyMzQKKyNkZWZpbmUgU1NMX1JfVFJJRURfVE9fVVNFX1VOU1VQUE9SVEVEX0NJUEhFUgkJIDIzNQorI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fREVDT0RFX0RIX0NFUlRTCQkJIDIzNgorI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fREVDT0RFX0VDREhfQ0VSVFMJCSAzMTMKKyNkZWZpbmUgU1NMX1JfVU5BQkxFX1RPX0VYVFJBQ1RfUFVCTElDX0tFWQkJIDIzNworI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fRklORF9ESF9QQVJBTUVURVJTCQkgMjM4CisjZGVmaW5lIFNTTF9SX1VOQUJMRV9UT19GSU5EX0VDREhfUEFSQU1FVEVSUwkJIDMxNAorI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fRklORF9QVUJMSUNfS0VZX1BBUkFNRVRFUlMJIDIzOQorI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fRklORF9TU0xfTUVUSE9ECQkJIDI0MAorI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fTE9BRF9TU0wyX01ENV9ST1VUSU5FUwkJIDI0MQorI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fTE9BRF9TU0wzX01ENV9ST1VUSU5FUwkJIDI0MgorI2RlZmluZSBTU0xfUl9VTkFCTEVfVE9fTE9BRF9TU0wzX1NIQTFfUk9VVElORVMJCSAyNDMKKyNkZWZpbmUgU1NMX1JfVU5FWFBFQ1RFRF9NRVNTQUdFCQkJIDI0NAorI2RlZmluZSBTU0xfUl9VTkVYUEVDVEVEX1JFQ09SRAkJCQkgMjQ1CisjZGVmaW5lIFNTTF9SX1VOSU5JVElBTElaRUQJCQkJIDI3NgorI2RlZmluZSBTU0xfUl9VTktOT1dOX0FMRVJUX1RZUEUJCQkgMjQ2CisjZGVmaW5lIFNTTF9SX1VOS05PV05fQ0VSVElGSUNBVEVfVFlQRQkJCSAyNDcKKyNkZWZpbmUgU1NMX1JfVU5LTk9XTl9DSVBIRVJfUkVUVVJORUQJCQkgMjQ4CisjZGVmaW5lIFNTTF9SX1VOS05PV05fQ0lQSEVSX1RZUEUJCQkgMjQ5CisjZGVmaW5lIFNTTF9SX1VOS05PV05fS0VZX0VYQ0hBTkdFX1RZUEUJCQkgMjUwCisjZGVmaW5lIFNTTF9SX1VOS05PV05fUEtFWV9UWVBFCQkJCSAyNTEKKyNkZWZpbmUgU1NMX1JfVU5LTk9XTl9QUk9UT0NPTAkJCQkgMjUyCisjZGVmaW5lIFNTTF9SX1VOS05PV05fUkVNT1RFX0VSUk9SX1RZUEUJCQkgMjUzCisjZGVmaW5lIFNTTF9SX1VOS05PV05fU1NMX1ZFUlNJT04JCQkgMjU0CisjZGVmaW5lIFNTTF9SX1VOS05PV05fU1RBVEUJCQkJIDI1NQorI2RlZmluZSBTU0xfUl9VTlNBRkVfTEVHQUNZX1JFTkVHT1RJQVRJT05fRElTQUJMRUQJIDMzOAorI2RlZmluZSBTU0xfUl9VTlNVUFBPUlRFRF9DSVBIRVIJCQkgMjU2CisjZGVmaW5lIFNTTF9SX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OX0FMR09SSVRITQkJIDI1NworI2RlZmluZSBTU0xfUl9VTlNVUFBPUlRFRF9ESUdFU1RfVFlQRQkJCSAzMjYKKyNkZWZpbmUgU1NMX1JfVU5TVVBQT1JURURfRUxMSVBUSUNfQ1VSVkUJCSAzMTUKKyNkZWZpbmUgU1NMX1JfVU5TVVBQT1JURURfUFJPVE9DT0wJCQkgMjU4CisjZGVmaW5lIFNTTF9SX1VOU1VQUE9SVEVEX1NTTF9WRVJTSU9OCQkJIDI1OQorI2RlZmluZSBTU0xfUl9VTlNVUFBPUlRFRF9TVEFUVVNfVFlQRQkJCSAzMjkKKyNkZWZpbmUgU1NMX1JfV1JJVEVfQklPX05PVF9TRVQJCQkJIDI2MAorI2RlZmluZSBTU0xfUl9XUk9OR19DSVBIRVJfUkVUVVJORUQJCQkgMjYxCisjZGVmaW5lIFNTTF9SX1dST05HX01FU1NBR0VfVFlQRQkJCSAyNjIKKyNkZWZpbmUgU1NMX1JfV1JPTkdfTlVNQkVSX09GX0tFWV9CSVRTCQkJIDI2MworI2RlZmluZSBTU0xfUl9XUk9OR19TSUdOQVRVUkVfTEVOR1RICQkJIDI2NAorI2RlZmluZSBTU0xfUl9XUk9OR19TSUdOQVRVUkVfU0laRQkJCSAyNjUKKyNkZWZpbmUgU1NMX1JfV1JPTkdfU1NMX1ZFUlNJT04JCQkJIDI2NgorI2RlZmluZSBTU0xfUl9XUk9OR19WRVJTSU9OX05VTUJFUgkJCSAyNjcKKyNkZWZpbmUgU1NMX1JfWDUwOV9MSUIJCQkJCSAyNjgKKyNkZWZpbmUgU1NMX1JfWDUwOV9WRVJJRklDQVRJT05fU0VUVVBfUFJPQkxFTVMJCSAyNjkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zc2wyLmggYi9saWIvb3BlbnNzbC9zc2wvc3NsMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YTUyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvc3NsMi5oCkBAIC0wLDAgKzEsMjY4IEBACisvKiBzc2wvc3NsMi5oICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpZm5kZWYgSEVBREVSX1NTTDJfSCAKKyNkZWZpbmUgSEVBREVSX1NTTDJfSCAKKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogUHJvdG9jb2wgVmVyc2lvbiBDb2RlcyAqLworI2RlZmluZSBTU0wyX1ZFUlNJT04JCTB4MDAwMgorI2RlZmluZSBTU0wyX1ZFUlNJT05fTUFKT1IJMHgwMAorI2RlZmluZSBTU0wyX1ZFUlNJT05fTUlOT1IJMHgwMgorLyogI2RlZmluZSBTU0wyX0NMSUVOVF9WRVJTSU9OCTB4MDAwMiAqLworLyogI2RlZmluZSBTU0wyX1NFUlZFUl9WRVJTSU9OCTB4MDAwMiAqLworCisvKiBQcm90b2NvbCBNZXNzYWdlIENvZGVzICovCisjZGVmaW5lIFNTTDJfTVRfRVJST1IJCQkwCisjZGVmaW5lIFNTTDJfTVRfQ0xJRU5UX0hFTExPCQkxCisjZGVmaW5lIFNTTDJfTVRfQ0xJRU5UX01BU1RFUl9LRVkJMgorI2RlZmluZSBTU0wyX01UX0NMSUVOVF9GSU5JU0hFRAkJMworI2RlZmluZSBTU0wyX01UX1NFUlZFUl9IRUxMTwkJNAorI2RlZmluZSBTU0wyX01UX1NFUlZFUl9WRVJJRlkJCTUKKyNkZWZpbmUgU1NMMl9NVF9TRVJWRVJfRklOSVNIRUQJCTYKKyNkZWZpbmUgU1NMMl9NVF9SRVFVRVNUX0NFUlRJRklDQVRFCTcKKyNkZWZpbmUgU1NMMl9NVF9DTElFTlRfQ0VSVElGSUNBVEUJOAorCisvKiBFcnJvciBNZXNzYWdlIENvZGVzICovCisjZGVmaW5lIFNTTDJfUEVfVU5ERUZJTkVEX0VSUk9SCQkweDAwMDAKKyNkZWZpbmUgU1NMMl9QRV9OT19DSVBIRVIJCTB4MDAwMQorI2RlZmluZSBTU0wyX1BFX05PX0NFUlRJRklDQVRFCQkweDAwMDIKKyNkZWZpbmUgU1NMMl9QRV9CQURfQ0VSVElGSUNBVEUJCTB4MDAwNAorI2RlZmluZSBTU0wyX1BFX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFX1RZUEUgMHgwMDA2CisKKy8qIENpcGhlciBLaW5kIFZhbHVlcyAqLworI2RlZmluZSBTU0wyX0NLX05VTExfV0lUSF9NRDUJCQkweDAyMDAwMDAwIC8qIHYzICovCisjZGVmaW5lIFNTTDJfQ0tfUkM0XzEyOF9XSVRIX01ENQkJMHgwMjAxMDA4MAorI2RlZmluZSBTU0wyX0NLX1JDNF8xMjhfRVhQT1JUNDBfV0lUSF9NRDUJMHgwMjAyMDA4MAorI2RlZmluZSBTU0wyX0NLX1JDMl8xMjhfQ0JDX1dJVEhfTUQ1CQkweDAyMDMwMDgwCisjZGVmaW5lIFNTTDJfQ0tfUkMyXzEyOF9DQkNfRVhQT1JUNDBfV0lUSF9NRDUJMHgwMjA0MDA4MAorI2RlZmluZSBTU0wyX0NLX0lERUFfMTI4X0NCQ19XSVRIX01ENQkJMHgwMjA1MDA4MAorI2RlZmluZSBTU0wyX0NLX0RFU182NF9DQkNfV0lUSF9NRDUJCTB4MDIwNjAwNDAKKyNkZWZpbmUgU1NMMl9DS19ERVNfNjRfQ0JDX1dJVEhfU0hBCQkweDAyMDYwMTQwIC8qIHYzICovCisjZGVmaW5lIFNTTDJfQ0tfREVTXzE5Ml9FREUzX0NCQ19XSVRIX01ENQkweDAyMDcwMGMwCisjZGVmaW5lIFNTTDJfQ0tfREVTXzE5Ml9FREUzX0NCQ19XSVRIX1NIQQkweDAyMDcwMWMwIC8qIHYzICovCisjZGVmaW5lIFNTTDJfQ0tfUkM0XzY0X1dJVEhfTUQ1CQkJMHgwMjA4MDA4MCAvKiBNUyBoYWNrICovCisgCisjZGVmaW5lIFNTTDJfQ0tfREVTXzY0X0NGQjY0X1dJVEhfTUQ1XzEJCTB4MDJmZjA4MDAgLyogU1NMZWF5ICovCisjZGVmaW5lIFNTTDJfQ0tfTlVMTAkJCQkweDAyZmYwODEwIC8qIFNTTGVheSAqLworCisjZGVmaW5lIFNTTDJfVFhUX0RFU182NF9DRkI2NF9XSVRIX01ENV8xCSJERVMtQ0ZCLU0xIgorI2RlZmluZSBTU0wyX1RYVF9OVUxMX1dJVEhfTUQ1CQkJIk5VTEwtTUQ1IgorI2RlZmluZSBTU0wyX1RYVF9SQzRfMTI4X1dJVEhfTUQ1CQkiUkM0LU1ENSIKKyNkZWZpbmUgU1NMMl9UWFRfUkM0XzEyOF9FWFBPUlQ0MF9XSVRIX01ENQkiRVhQLVJDNC1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX1JDMl8xMjhfQ0JDX1dJVEhfTUQ1CQkiUkMyLUNCQy1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX1JDMl8xMjhfQ0JDX0VYUE9SVDQwX1dJVEhfTUQ1CSJFWFAtUkMyLUNCQy1NRDUiCisjZGVmaW5lIFNTTDJfVFhUX0lERUFfMTI4X0NCQ19XSVRIX01ENQkJIklERUEtQ0JDLU1ENSIKKyNkZWZpbmUgU1NMMl9UWFRfREVTXzY0X0NCQ19XSVRIX01ENQkJIkRFUy1DQkMtTUQ1IgorI2RlZmluZSBTU0wyX1RYVF9ERVNfNjRfQ0JDX1dJVEhfU0hBCQkiREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDJfVFhUX0RFU18xOTJfRURFM19DQkNfV0lUSF9NRDUJIkRFUy1DQkMzLU1ENSIKKyNkZWZpbmUgU1NMMl9UWFRfREVTXzE5Ml9FREUzX0NCQ19XSVRIX1NIQQkiREVTLUNCQzMtU0hBIgorI2RlZmluZSBTU0wyX1RYVF9SQzRfNjRfV0lUSF9NRDUJCSJSQzQtNjQtTUQ1IgorCisjZGVmaW5lIFNTTDJfVFhUX05VTEwJCQkJIk5VTEwiCisKKy8qIEZsYWdzIGZvciB0aGUgU1NMX0NJUEhFUi5hbGdvcml0aG0yIGZpZWxkICovCisjZGVmaW5lIFNTTDJfQ0ZfNV9CWVRFX0VOQwkJCTB4MDEKKyNkZWZpbmUgU1NMMl9DRl84X0JZVEVfRU5DCQkJMHgwMgorCisvKiBDZXJ0aWZpY2F0ZSBUeXBlIENvZGVzICovCisjZGVmaW5lIFNTTDJfQ1RfWDUwOV9DRVJUSUZJQ0FURQkJMHgwMQorCisvKiBBdXRoZW50aWNhdGlvbiBUeXBlIENvZGUgKi8KKyNkZWZpbmUgU1NMMl9BVF9NRDVfV0lUSF9SU0FfRU5DUllQVElPTgkJMHgwMQorCisjZGVmaW5lIFNTTDJfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSAkJMzIKKworLyogVXBwZXIvTG93ZXIgQm91bmRzICovCisjZGVmaW5lIFNTTDJfTUFYX01BU1RFUl9LRVlfTEVOR1RIX0lOX0JJVFMJMjU2CisjaWZkZWYgT1BFTlNTTF9TWVNfTVBFCisjZGVmaW5lIFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfMl9CWVRFX0hFQURFUgkyOTk5OHUKKyNlbHNlCisjZGVmaW5lIFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfMl9CWVRFX0hFQURFUgkzMjc2N3UgIC8qIDJeMTUtMSAqLworI2VuZGlmCisjZGVmaW5lIFNTTDJfTUFYX1JFQ09SRF9MRU5HVEhfM19CWVRFX0hFQURFUgkxNjM4MyAvKiAyXjE0LTEgKi8KKworI2RlZmluZSBTU0wyX0NIQUxMRU5HRV9MRU5HVEgJMTYKKy8qI2RlZmluZSBTU0wyX0NIQUxMRU5HRV9MRU5HVEgJMzIgKi8KKyNkZWZpbmUgU1NMMl9NSU5fQ0hBTExFTkdFX0xFTkdUSAkxNgorI2RlZmluZSBTU0wyX01BWF9DSEFMTEVOR0VfTEVOR1RICTMyCisjZGVmaW5lIFNTTDJfQ09OTkVDVElPTl9JRF9MRU5HVEgJMTYKKyNkZWZpbmUgU1NMMl9NQVhfQ09OTkVDVElPTl9JRF9MRU5HVEgJMTYKKyNkZWZpbmUgU1NMMl9TU0xfU0VTU0lPTl9JRF9MRU5HVEgJMTYKKyNkZWZpbmUgU1NMMl9NQVhfQ0VSVF9DSEFMTEVOR0VfTEVOR1RICTMyCisjZGVmaW5lIFNTTDJfTUlOX0NFUlRfQ0hBTExFTkdFX0xFTkdUSAkxNgorI2RlZmluZSBTU0wyX01BWF9LRVlfTUFURVJJQUxfTEVOR1RICTI0CisKKyNpZm5kZWYgSEVBREVSX1NTTF9MT0NMX0gKKyNkZWZpbmUgIENFUlQJCWNoYXIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzc2wyX3N0YXRlX3N0CisJeworCWludCB0aHJlZV9ieXRlX2hlYWRlcjsKKwlpbnQgY2xlYXJfdGV4dDsJCS8qIGNsZWFyIHRleHQgKi8KKwlpbnQgZXNjYXBlOwkJLyogbm90IHVzZWQgaW4gU1NMdjIgKi8KKwlpbnQgc3NsMl9yb2xsYmFjazsJLyogdXNlZCBpZiBTU0x2MjMgcm9sbGVkIGJhY2sgdG8gU1NMdjIgKi8KKworCS8qIG5vbi1ibG9ja2luZyBpbyBpbmZvLCB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgc2FtZQorCSAqIGFyZ3Mgd2VyZSBwYXNzd2QgKi8KKwl1bnNpZ25lZCBpbnQgd251bTsJLyogbnVtYmVyIG9mIGJ5dGVzIHNlbnQgc28gZmFyICovCisJaW50IHdwZW5kX3RvdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp3cGVuZF9idWY7CisKKwlpbnQgd3BlbmRfb2ZmOwkvKiBvZmZzZXQgdG8gZGF0YSB0byB3cml0ZSAqLworCWludCB3cGVuZF9sZW47IAkvKiBudW1iZXIgb2YgYnl0ZXMgcGFzc3dkIHRvIHdyaXRlICovCisJaW50IHdwZW5kX3JldDsgCS8qIG51bWJlciBvZiBieXRlcyB0byByZXR1cm4gdG8gY2FsbGVyICovCisKKwkvKiBidWZmZXIgcmF3IGRhdGEgKi8KKwlpbnQgcmJ1Zl9sZWZ0OworCWludCByYnVmX29mZnM7CisJdW5zaWduZWQgY2hhciAqcmJ1ZjsKKwl1bnNpZ25lZCBjaGFyICp3YnVmOworCisJdW5zaWduZWQgY2hhciAqd3JpdGVfcHRyOy8qIHVzZWQgdG8gcG9pbnQgdG8gdGhlIHN0YXJ0IGR1ZSB0bworCQkJCSAgKiAyLzMgYnl0ZSBoZWFkZXIuICovCisKKwl1bnNpZ25lZCBpbnQgcGFkZGluZzsKKwl1bnNpZ25lZCBpbnQgcmxlbmd0aDsgLyogcGFzc2VkIHRvIHNzbDJfZW5jICovCisJaW50IHJhY3RfZGF0YV9sZW5ndGg7IC8qIFNldCB3aGVuIHRoaW5ncyBhcmUgZW5jcnlwdGVkLiAqLworCXVuc2lnbmVkIGludCB3bGVuZ3RoOyAvKiBwYXNzZWQgdG8gc3NsMl9lbmMgKi8KKwlpbnQgd2FjdF9kYXRhX2xlbmd0aDsgLyogU2V0IHdoZW4gdGhpbmdzIGFyZSBkZWNyeXB0ZWQuICovCisJdW5zaWduZWQgY2hhciAqcmFjdF9kYXRhOworCXVuc2lnbmVkIGNoYXIgKndhY3RfZGF0YTsKKwl1bnNpZ25lZCBjaGFyICptYWNfZGF0YTsKKworCXVuc2lnbmVkIGNoYXIgKnJlYWRfa2V5OworCXVuc2lnbmVkIGNoYXIgKndyaXRlX2tleTsKKworCQkvKiBTdHVmZiBzcGVjaWZpY2FsbHkgdG8gZG8gd2l0aCB0aGlzIFNTTCBzZXNzaW9uICovCisJdW5zaWduZWQgaW50IGNoYWxsZW5nZV9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBjaGFsbGVuZ2VbU1NMMl9NQVhfQ0hBTExFTkdFX0xFTkdUSF07CisJdW5zaWduZWQgaW50IGNvbm5faWRfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgY29ubl9pZFtTU0wyX01BWF9DT05ORUNUSU9OX0lEX0xFTkdUSF07CisJdW5zaWduZWQgaW50IGtleV9tYXRlcmlhbF9sZW5ndGg7CisJdW5zaWduZWQgY2hhciBrZXlfbWF0ZXJpYWxbU1NMMl9NQVhfS0VZX01BVEVSSUFMX0xFTkdUSCoyXTsKKworCXVuc2lnbmVkIGxvbmcgcmVhZF9zZXF1ZW5jZTsKKwl1bnNpZ25lZCBsb25nIHdyaXRlX3NlcXVlbmNlOworCisJc3RydWN0CXsKKwkJdW5zaWduZWQgaW50IGNvbm5faWRfbGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgY2VydF90eXBlOwkKKwkJdW5zaWduZWQgaW50IGNlcnRfbGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgY3NsOyAKKwkJdW5zaWduZWQgaW50IGNsZWFyOworCQl1bnNpZ25lZCBpbnQgZW5jOyAKKwkJdW5zaWduZWQgY2hhciBjY2xbU1NMMl9NQVhfQ0VSVF9DSEFMTEVOR0VfTEVOR1RIXTsKKwkJdW5zaWduZWQgaW50IGNpcGhlcl9zcGVjX2xlbmd0aDsKKwkJdW5zaWduZWQgaW50IHNlc3Npb25faWRfbGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgY2xlbjsKKwkJdW5zaWduZWQgaW50IHJsZW47CisJCX0gdG1wOworCX0gU1NMMl9TVEFURTsKKworLyogU1NMdjIgKi8KKy8qIGNsaWVudCAqLworI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0hFTExPX0EJCSgweDEwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0hFTExPX0IJCSgweDExfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9TRVJWRVJfSEVMTE9fQQkJKDB4MjB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfR0VUX1NFUlZFUl9IRUxMT19CCQkoMHgyMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9NQVNURVJfS0VZX0EJKDB4MzB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9DTElFTlRfTUFTVEVSX0tFWV9CCSgweDMxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0ZJTklTSEVEX0EJCSgweDQwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0ZJTklTSEVEX0IJCSgweDQxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0EJKDB4NTB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9DTElFTlRfQ0VSVElGSUNBVEVfQgkoMHg1MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9DCSgweDUyfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0QJKDB4NTN8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfR0VUX1NFUlZFUl9WRVJJRllfQQkJKDB4NjB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfR0VUX1NFUlZFUl9WRVJJRllfQgkJKDB4NjF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDJfU1RfR0VUX1NFUlZFUl9GSU5JU0hFRF9BCQkoMHg3MHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9HRVRfU0VSVkVSX0ZJTklTSEVEX0IJCSgweDcxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wyX1NUX0NMSUVOVF9TVEFSVF9FTkNSWVBUSU9OCQkoMHg4MHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMl9TVF9YNTA5X0dFVF9DTElFTlRfQ0VSVElGSUNBVEUJKDB4OTB8U1NMX1NUX0NPTk5FQ1QpCisvKiBzZXJ2ZXIgKi8KKyNkZWZpbmUgU1NMMl9TVF9HRVRfQ0xJRU5UX0hFTExPX0EJCSgweDEwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfR0VUX0NMSUVOVF9IRUxMT19CCQkoMHgxMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQwkJKDB4MTJ8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19BCQkoMHgyMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfU0VSVkVSX0hFTExPX0IJCSgweDIxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfR0VUX0NMSUVOVF9NQVNURVJfS0VZX0EJCSgweDMwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfR0VUX0NMSUVOVF9NQVNURVJfS0VZX0IJCSgweDMxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0EJCSgweDQwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0IJCSgweDQxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0MJCSgweDQyfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfR0VUX0NMSUVOVF9GSU5JU0hFRF9BCQkoMHg1MHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX0dFVF9DTElFTlRfRklOSVNIRURfQgkJKDB4NTF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1NFUlZFUl9GSU5JU0hFRF9BCQkoMHg2MHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfU0VSVkVSX0ZJTklTSEVEX0IJCSgweDYxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0EJKDB4NzB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQgkoMHg3MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wyX1NUX1NFTkRfUkVRVUVTVF9DRVJUSUZJQ0FURV9DCSgweDcyfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0QJKDB4NzN8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9TRVJWRVJfU1RBUlRfRU5DUllQVElPTgkJKDB4ODB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMl9TVF9YNTA5X0dFVF9TRVJWRVJfQ0VSVElGSUNBVEUJKDB4OTB8U1NMX1NUX0FDQ0VQVCkKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3NzbDIzLmggYi9saWIvb3BlbnNzbC9zc2wvc3NsMjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzIyODk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbDIzLmgKQEAgLTAsMCArMSw4MyBAQAorLyogc3NsL3NzbDIzLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworI2lmbmRlZiBIRUFERVJfU1NMMjNfSCAKKyNkZWZpbmUgSEVBREVSX1NTTDIzX0ggCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qY2xpZW50ICovCisvKiB3cml0ZSB0byBzZXJ2ZXIgKi8KKyNkZWZpbmUgU1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19BCSgweDIxMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19CCSgweDIxMXxTU0xfU1RfQ09OTkVDVCkKKy8qIHJlYWQgZnJvbSBzZXJ2ZXIgKi8KKyNkZWZpbmUgU1NMMjNfU1RfQ1JfU1JWUl9IRUxMT19BCSgweDIyMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMMjNfU1RfQ1JfU1JWUl9IRUxMT19CCSgweDIyMXxTU0xfU1RfQ09OTkVDVCkKKworLyogc2VydmVyICovCisvKiByZWFkIGZyb20gY2xpZW50ICovCisjZGVmaW5lIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQQkoMHgyMTB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMMjNfU1RfU1JfQ0xOVF9IRUxMT19CCSgweDIxMXxTU0xfU1RfQUNDRVBUKQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvc3NsMy5oIGIvbGliL29wZW5zc2wvc3NsL3NzbDMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjMzOTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbDMuaApAQCAtMCwwICsxLDY0NyBAQAorLyogc3NsL3NzbDMuaCAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDAyIFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogRUNDIGNpcGhlciBzdWl0ZSBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworCisjaWZuZGVmIEhFQURFUl9TU0wzX0ggCisjZGVmaW5lIEhFQURFUl9TU0wzX0ggCisKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisjaW5jbHVkZSA8b3BlbnNzbC9jb21wLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zc2wuaD4KKworI2lmZGVmICBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogU2lnbmFsbGluZyBjaXBoZXIgc3VpdGUgdmFsdWU6IGZyb20gZHJhZnQtaWV0Zi10bHMtcmVuZWdvdGlhdGlvbi0wMy50eHQgKi8KKyNkZWZpbmUgU1NMM19DS19TQ1NWCQkJCTB4MDMwMDAwRkYKKworI2RlZmluZSBTU0wzX0NLX1JTQV9OVUxMX01ENQkJCTB4MDMwMDAwMDEKKyNkZWZpbmUgU1NMM19DS19SU0FfTlVMTF9TSEEJCQkweDAzMDAwMDAyCisjZGVmaW5lIFNTTDNfQ0tfUlNBX1JDNF80MF9NRDUgCQkJMHgwMzAwMDAwMworI2RlZmluZSBTU0wzX0NLX1JTQV9SQzRfMTI4X01ENQkJCTB4MDMwMDAwMDQKKyNkZWZpbmUgU1NMM19DS19SU0FfUkM0XzEyOF9TSEEJCQkweDAzMDAwMDA1CisjZGVmaW5lIFNTTDNfQ0tfUlNBX1JDMl80MF9NRDUJCQkweDAzMDAwMDA2CisjZGVmaW5lIFNTTDNfQ0tfUlNBX0lERUFfMTI4X1NIQQkJMHgwMzAwMDAwNworI2RlZmluZSBTU0wzX0NLX1JTQV9ERVNfNDBfQ0JDX1NIQQkJMHgwMzAwMDAwOAorI2RlZmluZSBTU0wzX0NLX1JTQV9ERVNfNjRfQ0JDX1NIQQkJMHgwMzAwMDAwOQorI2RlZmluZSBTU0wzX0NLX1JTQV9ERVNfMTkyX0NCQzNfU0hBCQkweDAzMDAwMDBBCisKKyNkZWZpbmUgU1NMM19DS19ESF9EU1NfREVTXzQwX0NCQ19TSEEJCTB4MDMwMDAwMEIKKyNkZWZpbmUgU1NMM19DS19ESF9EU1NfREVTXzY0X0NCQ19TSEEJCTB4MDMwMDAwMEMKKyNkZWZpbmUgU1NMM19DS19ESF9EU1NfREVTXzE5Ml9DQkMzX1NIQSAJMHgwMzAwMDAwRAorI2RlZmluZSBTU0wzX0NLX0RIX1JTQV9ERVNfNDBfQ0JDX1NIQQkJMHgwMzAwMDAwRQorI2RlZmluZSBTU0wzX0NLX0RIX1JTQV9ERVNfNjRfQ0JDX1NIQQkJMHgwMzAwMDAwRgorI2RlZmluZSBTU0wzX0NLX0RIX1JTQV9ERVNfMTkyX0NCQzNfU0hBIAkweDAzMDAwMDEwCisKKyNkZWZpbmUgU1NMM19DS19FREhfRFNTX0RFU180MF9DQkNfU0hBCQkweDAzMDAwMDExCisjZGVmaW5lIFNTTDNfQ0tfRURIX0RTU19ERVNfNjRfQ0JDX1NIQQkJMHgwMzAwMDAxMgorI2RlZmluZSBTU0wzX0NLX0VESF9EU1NfREVTXzE5Ml9DQkMzX1NIQQkweDAzMDAwMDEzCisjZGVmaW5lIFNTTDNfQ0tfRURIX1JTQV9ERVNfNDBfQ0JDX1NIQQkJMHgwMzAwMDAxNAorI2RlZmluZSBTU0wzX0NLX0VESF9SU0FfREVTXzY0X0NCQ19TSEEJCTB4MDMwMDAwMTUKKyNkZWZpbmUgU1NMM19DS19FREhfUlNBX0RFU18xOTJfQ0JDM19TSEEJMHgwMzAwMDAxNgorCisjZGVmaW5lIFNTTDNfQ0tfQURIX1JDNF80MF9NRDUJCQkweDAzMDAwMDE3CisjZGVmaW5lIFNTTDNfQ0tfQURIX1JDNF8xMjhfTUQ1CQkJMHgwMzAwMDAxOAorI2RlZmluZSBTU0wzX0NLX0FESF9ERVNfNDBfQ0JDX1NIQQkJMHgwMzAwMDAxOQorI2RlZmluZSBTU0wzX0NLX0FESF9ERVNfNjRfQ0JDX1NIQQkJMHgwMzAwMDAxQQorI2RlZmluZSBTU0wzX0NLX0FESF9ERVNfMTkyX0NCQ19TSEEJCTB4MDMwMDAwMUIKKworI2lmIDAKKwkjZGVmaW5lIFNTTDNfQ0tfRlpBX0RNU19OVUxMX1NIQQkJMHgwMzAwMDAxQworCSNkZWZpbmUgU1NMM19DS19GWkFfRE1TX0ZaQV9TSEEJCQkweDAzMDAwMDFECisJI2lmIDAgLyogQmVjYXVzZSBpdCBjbGFzaGVzIHdpdGggS1JCNSwgaXMgbmV2ZXIgdXNlZCBhbnkgbW9yZSwgYW5kIGlzIHNhZmUKKwkJIHRvIHJlbW92ZSBhY2NvcmRpbmcgdG8gRGF2aWQgSG9wd29vZCA8ZGF2aWQuaG9wd29vZEB6ZXRuZXQuY28udWs+CisJCSBvZiB0aGUgaWV0Zi10bHMgbGlzdCAqLworCSNkZWZpbmUgU1NMM19DS19GWkFfRE1TX1JDNF9TSEEJCQkweDAzMDAwMDFFCisJI2VuZGlmCisjZW5kaWYKKworLyogICAgVlJTIEFkZGl0aW9uYWwgS2VyYmVyb3M1IGVudHJpZXMKKyAqLworI2RlZmluZSBTU0wzX0NLX0tSQjVfREVTXzY0X0NCQ19TSEEJCTB4MDMwMDAwMUUKKyNkZWZpbmUgU1NMM19DS19LUkI1X0RFU18xOTJfQ0JDM19TSEEJCTB4MDMwMDAwMUYKKyNkZWZpbmUgU1NMM19DS19LUkI1X1JDNF8xMjhfU0hBCQkweDAzMDAwMDIwCisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9JREVBXzEyOF9DQkNfU0hBCSAgICAgICAJMHgwMzAwMDAyMQorI2RlZmluZSBTU0wzX0NLX0tSQjVfREVTXzY0X0NCQ19NRDUgICAgICAgCTB4MDMwMDAwMjIKKyNkZWZpbmUgU1NMM19DS19LUkI1X0RFU18xOTJfQ0JDM19NRDUgICAgICAgCTB4MDMwMDAwMjMKKyNkZWZpbmUgU1NMM19DS19LUkI1X1JDNF8xMjhfTUQ1CSAgICAgICAJMHgwMzAwMDAyNAorI2RlZmluZSBTU0wzX0NLX0tSQjVfSURFQV8xMjhfQ0JDX01ENSAJCTB4MDMwMDAwMjUKKworI2RlZmluZSBTU0wzX0NLX0tSQjVfREVTXzQwX0NCQ19TSEEgCQkweDAzMDAwMDI2CisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9SQzJfNDBfQ0JDX1NIQSAJCTB4MDMwMDAwMjcKKyNkZWZpbmUgU1NMM19DS19LUkI1X1JDNF80MF9TSEEJIAkJMHgwMzAwMDAyOAorI2RlZmluZSBTU0wzX0NLX0tSQjVfREVTXzQwX0NCQ19NRDUgCQkweDAzMDAwMDI5CisjZGVmaW5lIFNTTDNfQ0tfS1JCNV9SQzJfNDBfQ0JDX01ENSAJCTB4MDMwMDAwMkEKKyNkZWZpbmUgU1NMM19DS19LUkI1X1JDNF80MF9NRDUJIAkJMHgwMzAwMDAyQgorCisjZGVmaW5lIFNTTDNfVFhUX1JTQV9OVUxMX01ENQkJCSJOVUxMLU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfUlNBX05VTExfU0hBCQkJIk5VTEwtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9SU0FfUkM0XzQwX01ENSAJCSJFWFAtUkM0LU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfUlNBX1JDNF8xMjhfTUQ1CQkiUkM0LU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfUlNBX1JDNF8xMjhfU0hBCQkiUkM0LVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfUlNBX1JDMl80MF9NRDUJCQkiRVhQLVJDMi1DQkMtTUQ1IgorI2RlZmluZSBTU0wzX1RYVF9SU0FfSURFQV8xMjhfU0hBCQkiSURFQS1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9SU0FfREVTXzQwX0NCQ19TSEEJCSJFWFAtREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX1JTQV9ERVNfNjRfQ0JDX1NIQQkJIkRFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9SU0FfREVTXzE5Ml9DQkMzX1NIQQkJIkRFUy1DQkMzLVNIQSIKKworI2RlZmluZSBTU0wzX1RYVF9ESF9EU1NfREVTXzQwX0NCQ19TSEEJCSJFWFAtREgtRFNTLURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9ESF9EU1NfREVTXzY0X0NCQ19TSEEJCSJESC1EU1MtREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0RIX0RTU19ERVNfMTkyX0NCQzNfU0hBIAkiREgtRFNTLURFUy1DQkMzLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfREhfUlNBX0RFU180MF9DQkNfU0hBCQkiRVhQLURILVJTQS1ERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfREhfUlNBX0RFU182NF9DQkNfU0hBCQkiREgtUlNBLURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9ESF9SU0FfREVTXzE5Ml9DQkMzX1NIQSAJIkRILVJTQS1ERVMtQ0JDMy1TSEEiCisKKyNkZWZpbmUgU1NMM19UWFRfRURIX0RTU19ERVNfNDBfQ0JDX1NIQQkJIkVYUC1FREgtRFNTLURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9FREhfRFNTX0RFU182NF9DQkNfU0hBCQkiRURILURTUy1ERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfRURIX0RTU19ERVNfMTkyX0NCQzNfU0hBCSJFREgtRFNTLURFUy1DQkMzLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfRURIX1JTQV9ERVNfNDBfQ0JDX1NIQQkJIkVYUC1FREgtUlNBLURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9FREhfUlNBX0RFU182NF9DQkNfU0hBCQkiRURILVJTQS1ERVMtQ0JDLVNIQSIKKyNkZWZpbmUgU1NMM19UWFRfRURIX1JTQV9ERVNfMTkyX0NCQzNfU0hBCSJFREgtUlNBLURFUy1DQkMzLVNIQSIKKworI2RlZmluZSBTU0wzX1RYVF9BREhfUkM0XzQwX01ENQkJCSJFWFAtQURILVJDNC1NRDUiCisjZGVmaW5lIFNTTDNfVFhUX0FESF9SQzRfMTI4X01ENQkJIkFESC1SQzQtTUQ1IgorI2RlZmluZSBTU0wzX1RYVF9BREhfREVTXzQwX0NCQ19TSEEJCSJFWFAtQURILURFUy1DQkMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9BREhfREVTXzY0X0NCQ19TSEEJCSJBREgtREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0FESF9ERVNfMTkyX0NCQ19TSEEJCSJBREgtREVTLUNCQzMtU0hBIgorCisjaWYgMAorCSNkZWZpbmUgU1NMM19UWFRfRlpBX0RNU19OVUxMX1NIQQkJIkZaQS1OVUxMLVNIQSIKKwkjZGVmaW5lIFNTTDNfVFhUX0ZaQV9ETVNfRlpBX1NIQQkJIkZaQS1GWkEtQ0JDLVNIQSIKKwkjZGVmaW5lIFNTTDNfVFhUX0ZaQV9ETVNfUkM0X1NIQQkJIkZaQS1SQzQtU0hBIgorI2VuZGlmCisKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9ERVNfNjRfQ0JDX1NIQQkJIktSQjUtREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0tSQjVfREVTXzE5Ml9DQkMzX1NIQQkJIktSQjUtREVTLUNCQzMtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X1JDNF8xMjhfU0hBCQkiS1JCNS1SQzQtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X0lERUFfMTI4X0NCQ19TSEEJICAgICAgIAkiS1JCNS1JREVBLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0tSQjVfREVTXzY0X0NCQ19NRDUgICAgICAgCSJLUkI1LURFUy1DQkMtTUQ1IgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X0RFU18xOTJfQ0JDM19NRDUgICAgICAgCSJLUkI1LURFUy1DQkMzLU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9SQzRfMTI4X01ENQkJIktSQjUtUkM0LU1ENSIKKyNkZWZpbmUgU1NMM19UWFRfS1JCNV9JREVBXzEyOF9DQkNfTUQ1IAkJIktSQjUtSURFQS1DQkMtTUQ1IgorCisjZGVmaW5lIFNTTDNfVFhUX0tSQjVfREVTXzQwX0NCQ19TSEEgCQkiRVhQLUtSQjUtREVTLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0tSQjVfUkMyXzQwX0NCQ19TSEEgCQkiRVhQLUtSQjUtUkMyLUNCQy1TSEEiCisjZGVmaW5lIFNTTDNfVFhUX0tSQjVfUkM0XzQwX1NIQQkgCSJFWFAtS1JCNS1SQzQtU0hBIgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X0RFU180MF9DQkNfTUQ1IAkJIkVYUC1LUkI1LURFUy1DQkMtTUQ1IgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X1JDMl80MF9DQkNfTUQ1IAkJIkVYUC1LUkI1LVJDMi1DQkMtTUQ1IgorI2RlZmluZSBTU0wzX1RYVF9LUkI1X1JDNF80MF9NRDUJIAkiRVhQLUtSQjUtUkM0LU1ENSIKKworI2RlZmluZSBTU0wzX1NTTF9TRVNTSU9OX0lEX0xFTkdUSAkJMzIKKyNkZWZpbmUgU1NMM19NQVhfU1NMX1NFU1NJT05fSURfTEVOR1RICQkzMgorCisjZGVmaW5lIFNTTDNfTUFTVEVSX1NFQ1JFVF9TSVpFCQkJNDgKKyNkZWZpbmUgU1NMM19SQU5ET01fU0laRQkJCTMyCisjZGVmaW5lIFNTTDNfU0VTU0lPTl9JRF9TSVpFCQkJMzIKKyNkZWZpbmUgU1NMM19SVF9IRUFERVJfTEVOR1RICQkJNQorCisjaWZuZGVmIFNTTDNfQUxJR05fUEFZTE9BRAorIC8qIFNvbWUgd2lsbCBhcmd1ZSB0aGF0IHRoaXMgaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIGJ1dCBpdCdzCisgICogbm90IGFjdHVhbGx5IHRydWUuIFBvaW50IGlzIHRoYXQgbWFsbG9jIGhhcyB0byByZXR1cm4gYXQgbGVhc3QKKyAgKiA2NC1iaXQgYWxpZ25lZCBwb2ludGVycywgbWVhbmluZyB0aGF0IGFsbG9jYXRpbmcgNSBieXRlcyB3YXN0ZXMKKyAgKiAzIGJ5dGVzIGluIGVpdGhlciBjYXNlLiBTdWdnZXN0ZWQgcHJlLWdhcGluZyBzaW1wbHkgbW92ZXMgdGhlc2UKKyAgKiB3YXN0ZWQgYnl0ZXMgZnJvbSB0aGUgZW5kIG9mIGFsbG9jYXRlZCByZWdpb24gdG8gaXRzIGZyb250LAorICAqIGJ1dCBtYWtlcyBkYXRhIHBheWxvYWQgYWxpZ25lZCwgd2hpY2ggaW1wcm92ZXMgcGVyZm9ybWFuY2U6LSkgKi8KKyMgZGVmaW5lIFNTTDNfQUxJR05fUEFZTE9BRAkJCTgKKyNlbHNlCisjIGlmIChTU0wzX0FMSUdOX1BBWUxPQUQmKFNTTDNfQUxJR05fUEFZTE9BRC0xKSkhPTAKKyMgIGVycm9yICJpbnNhbmUgU1NMM19BTElHTl9QQVlMT0FEIgorIyAgdW5kZWYgU1NMM19BTElHTl9QQVlMT0FECisjIGVuZGlmCisjZW5kaWYKKworLyogVGhpcyBpcyB0aGUgbWF4aW11bSBNQUMgKGRpZ2VzdCkgc2l6ZSB1c2VkIGJ5IHRoZSBTU0wgbGlicmFyeS4KKyAqIEN1cnJlbnRseSBtYXhpbXVtIG9mIDIwIGlzIHVzZWQgYnkgU0hBMSwgYnV0IHdlIHJlc2VydmUgZm9yCisgKiBmdXR1cmUgZXh0ZW5zaW9uIGZvciA1MTItYml0IGhhc2hlcy4KKyAqLworCisjZGVmaW5lIFNTTDNfUlRfTUFYX01EX1NJWkUJCQk2NAorCisvKiBNYXhpbXVtIGJsb2NrIHNpemUgdXNlZCBpbiBhbGwgY2lwaGVyc3VpdGVzLiBDdXJyZW50bHkgMTYgZm9yIEFFUy4KKyAqLworCisjZGVmaW5lCVNTTF9SVF9NQVhfQ0lQSEVSX0JMT0NLX1NJWkUJCTE2CisKKyNkZWZpbmUgU1NMM19SVF9NQVhfRVhUUkEJCQkoMTYzODQpCisKKy8qIERlZmF1bHQgYnVmZmVyIGxlbmd0aCB1c2VkIGZvciB3cml0ZW4gcmVjb3Jkcy4gIFRodXMgYSBnZW5lcmF0ZWQgcmVjb3JkCisgKiB3aWxsIGNvbnRhaW4gcGxhaW50ZXh0IG5vIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUuICovCisjZGVmaW5lIFNTTDNfUlRfREVGQVVMVF9QTEFJTl9MRU5HVEgJMjA0OAorLyogTWF4aW11bSBwbGFpbnRleHQgbGVuZ3RoOiBkZWZpbmVkIGJ5IFNTTC9UTFMgc3RhbmRhcmRzICovCisjZGVmaW5lIFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSAkJMTYzODQKKy8qIE1heGltdW0gY29tcHJlc3Npb24gb3ZlcmhlYWQ6IGRlZmluZWQgYnkgU1NML1RMUyBzdGFuZGFyZHMgKi8KKyNkZWZpbmUgU1NMM19SVF9NQVhfQ09NUFJFU1NFRF9PVkVSSEVBRAkJMTAyNAorCisvKiBUaGUgc3RhbmRhcmRzIGdpdmUgYSBtYXhpbXVtIGVuY3J5cHRpb24gb3ZlcmhlYWQgb2YgMTAyNCBieXRlcy4KKyAqIEluIHByYWN0aWNlIHRoZSB2YWx1ZSBpcyBsb3dlciB0aGFuIHRoaXMuIFRoZSBvdmVyaGVhZCBpcyB0aGUgbWF4aW11bQorICogbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgKDI1NikgcGx1cyB0aGUgbWFjIHNpemUuCisgKi8KKyNkZWZpbmUgU1NMM19SVF9NQVhfRU5DUllQVEVEX09WRVJIRUFECSgyNTYgKyBTU0wzX1JUX01BWF9NRF9TSVpFKQorCisvKiBPcGVuU1NMIGN1cnJlbnRseSBvbmx5IHVzZXMgYSBwYWRkaW5nIGxlbmd0aCBvZiBhdCBtb3N0IG9uZSBibG9jayBzbworICogdGhlIHNlbmQgb3ZlcmhlYWQgaXMgc21hbGxlci4KKyAqLworCisjZGVmaW5lIFNTTDNfUlRfU0VORF9NQVhfRU5DUllQVEVEX09WRVJIRUFEIFwKKwkJCShTU0xfUlRfTUFYX0NJUEhFUl9CTE9DS19TSVpFICsgU1NMM19SVF9NQVhfTURfU0laRSkKKworLyogSWYgY29tcHJlc3Npb24gaXNuJ3QgdXNlZCBkb24ndCBpbmNsdWRlIHRoZSBjb21wcmVzc2lvbiBvdmVyaGVhZCAqLworCisjaWZkZWYgT1BFTlNTTF9OT19DT01QCisjZGVmaW5lIFNTTDNfUlRfTUFYX0NPTVBSRVNTRURfTEVOR1RICQlTU0wzX1JUX01BWF9QTEFJTl9MRU5HVEgKKyNlbHNlCisjZGVmaW5lIFNTTDNfUlRfTUFYX0NPTVBSRVNTRURfTEVOR1RICVwKKwkJKFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCtTU0wzX1JUX01BWF9DT01QUkVTU0VEX09WRVJIRUFEKQorI2VuZGlmCisjZGVmaW5lIFNTTDNfUlRfTUFYX0VOQ1JZUFRFRF9MRU5HVEgJXAorCQkoU1NMM19SVF9NQVhfRU5DUllQVEVEX09WRVJIRUFEK1NTTDNfUlRfTUFYX0NPTVBSRVNTRURfTEVOR1RIKQorI2RlZmluZSBTU0wzX1JUX01BWF9QQUNLRVRfU0laRQkJXAorCQkoU1NMM19SVF9NQVhfRU5DUllQVEVEX0xFTkdUSCtTU0wzX1JUX0hFQURFUl9MRU5HVEgpCisKKy8qIEV4dHJhIHNwYWNlIGZvciBlbXB0eSBmcmFnbWVudCwgaGVhZGVycywgTUFDLCBhbmQgcGFkZGluZy4gKi8KKyNkZWZpbmUgU1NMM19SVF9ERUZBVUxUX1dSSVRFX09WRVJIRUFEICAyNTYKKyNkZWZpbmUgU1NMM19SVF9ERUZBVUxUX1BBQ0tFVF9TSVpFICAgICA0MDk2IC0gU1NMM19SVF9ERUZBVUxUX1dSSVRFX09WRVJIRUFECisjaWYgU1NMM19SVF9ERUZBVUxUX1BMQUlOX0xFTkdUSCArIFNTTDNfUlRfREVGQVVMVF9XUklURV9PVkVSSEVBRCA+IFNTTDNfUlRfREVGQVVMVF9QQUNLRVRfU0laRQorI2Vycm9yICJJbnN1ZmZpY2llbnQgc3BhY2UgYWxsb2NhdGVkIGZvciB3cml0ZSBidWZmZXJzLiIKKyNlbmRpZgorCisjZGVmaW5lIFNTTDNfTURfQ0xJRU5UX0ZJTklTSEVEX0NPTlNUCSJceDQzXHg0Q1x4NEVceDU0IgorI2RlZmluZSBTU0wzX01EX1NFUlZFUl9GSU5JU0hFRF9DT05TVAkiXHg1M1x4NTJceDU2XHg1MiIKKworI2RlZmluZSBTU0wzX1ZFUlNJT04JCQkweDAzMDAKKyNkZWZpbmUgU1NMM19WRVJTSU9OX01BSk9SCQkweDAzCisjZGVmaW5lIFNTTDNfVkVSU0lPTl9NSU5PUgkJMHgwMAorCisjZGVmaW5lIFNTTDNfUlRfQ0hBTkdFX0NJUEhFUl9TUEVDCTIwCisjZGVmaW5lIFNTTDNfUlRfQUxFUlQJCQkyMQorI2RlZmluZSBTU0wzX1JUX0hBTkRTSEFLRQkJMjIKKyNkZWZpbmUgU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBCTIzCisKKyNkZWZpbmUgU1NMM19BTF9XQVJOSU5HCQkJMQorI2RlZmluZSBTU0wzX0FMX0ZBVEFMCQkJMgorCisjZGVmaW5lIFNTTDNfQURfQ0xPU0VfTk9USUZZCQkgMAorI2RlZmluZSBTU0wzX0FEX1VORVhQRUNURURfTUVTU0FHRQkxMAkvKiBmYXRhbCAqLworI2RlZmluZSBTU0wzX0FEX0JBRF9SRUNPUkRfTUFDCQkyMAkvKiBmYXRhbCAqLworI2RlZmluZSBTU0wzX0FEX0RFQ09NUFJFU1NJT05fRkFJTFVSRQkzMAkvKiBmYXRhbCAqLworI2RlZmluZSBTU0wzX0FEX0hBTkRTSEFLRV9GQUlMVVJFCTQwCS8qIGZhdGFsICovCisjZGVmaW5lIFNTTDNfQURfTk9fQ0VSVElGSUNBVEUJCTQxCisjZGVmaW5lIFNTTDNfQURfQkFEX0NFUlRJRklDQVRFCQk0MgorI2RlZmluZSBTU0wzX0FEX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFCTQzCisjZGVmaW5lIFNTTDNfQURfQ0VSVElGSUNBVEVfUkVWT0tFRAk0NAorI2RlZmluZSBTU0wzX0FEX0NFUlRJRklDQVRFX0VYUElSRUQJNDUKKyNkZWZpbmUgU1NMM19BRF9DRVJUSUZJQ0FURV9VTktOT1dOCTQ2CisjZGVmaW5lIFNTTDNfQURfSUxMRUdBTF9QQVJBTUVURVIJNDcJLyogZmF0YWwgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3NsM19yZWNvcmRfc3QKKwl7CisvKnIgKi8JaW50IHR5cGU7ICAgICAgICAgICAgICAgLyogdHlwZSBvZiByZWNvcmQgKi8KKy8qcncqLwl1bnNpZ25lZCBpbnQgbGVuZ3RoOyAgICAvKiBIb3cgbWFueSBieXRlcyBhdmFpbGFibGUgKi8KKy8qciAqLwl1bnNpZ25lZCBpbnQgb2ZmOyAgICAgICAvKiByZWFkL3dyaXRlIG9mZnNldCBpbnRvICdidWYnICovCisvKnJ3Ki8JdW5zaWduZWQgY2hhciAqZGF0YTsgICAgLyogcG9pbnRlciB0byB0aGUgcmVjb3JkIGRhdGEgKi8KKy8qcncqLwl1bnNpZ25lZCBjaGFyICppbnB1dDsgICAvKiB3aGVyZSB0aGUgZGVjb2RlIGJ5dGVzIGFyZSAqLworLypyICovCXVuc2lnbmVkIGNoYXIgKmNvbXA7ICAgIC8qIG9ubHkgdXNlZCB3aXRoIGRlY29tcHJlc3Npb24gLSBtYWxsb2MoKWVkICovCisvKnIgKi8gIHVuc2lnbmVkIGxvbmcgZXBvY2g7ICAgIC8qIGVwb2NoIG51bWJlciwgbmVlZGVkIGJ5IERUTFMxICovCisvKnIgKi8gIHVuc2lnbmVkIGNoYXIgc2VxX251bVs4XTsgLyogc2VxdWVuY2UgbnVtYmVyLCBuZWVkZWQgYnkgRFRMUzEgKi8KKwl9IFNTTDNfUkVDT1JEOworCit0eXBlZGVmIHN0cnVjdCBzc2wzX2J1ZmZlcl9zdAorCXsKKwl1bnNpZ25lZCBjaGFyICpidWY7ICAgICAvKiBhdCBsZWFzdCBTU0wzX1JUX01BWF9QQUNLRVRfU0laRSBieXRlcywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZWUgc3NsM19zZXR1cF9idWZmZXJzKCkgKi8KKwlzaXplX3QgbGVuOyAgICAgICAgICAgICAvKiBidWZmZXIgc2l6ZSAqLworCWludCBvZmZzZXQ7ICAgICAgICAgICAgIC8qIHdoZXJlIHRvICdjb3B5IGZyb20nICovCisJaW50IGxlZnQ7ICAgICAgICAgICAgICAgLyogaG93IG1hbnkgYnl0ZXMgbGVmdCAqLworCX0gU1NMM19CVUZGRVI7CisKKyNkZWZpbmUgU1NMM19DVF9SU0FfU0lHTgkJCTEKKyNkZWZpbmUgU1NMM19DVF9EU1NfU0lHTgkJCTIKKyNkZWZpbmUgU1NMM19DVF9SU0FfRklYRURfREgJCQkzCisjZGVmaW5lIFNTTDNfQ1RfRFNTX0ZJWEVEX0RICQkJNAorI2RlZmluZSBTU0wzX0NUX1JTQV9FUEhFTUVSQUxfREgJCTUKKyNkZWZpbmUgU1NMM19DVF9EU1NfRVBIRU1FUkFMX0RICQk2CisjZGVmaW5lIFNTTDNfQ1RfRk9SVEVaWkFfRE1TCQkJMjAKKy8qIFNTTDNfQ1RfTlVNQkVSIGlzIHVzZWQgdG8gc2l6ZSBhcnJheXMgYW5kIGl0IG11c3QgYmUgbGFyZ2UKKyAqIGVub3VnaCB0byBjb250YWluIGFsbCBvZiB0aGUgY2VydCB0eXBlcyBkZWZpbmVkIGVpdGhlciBmb3IKKyAqIFNTTHYzIGFuZCBUTFN2MS4KKyAqLworI2RlZmluZSBTU0wzX0NUX05VTUJFUgkJCTkKKworCisjZGVmaW5lIFNTTDNfRkxBR1NfTk9fUkVORUdPVElBVEVfQ0lQSEVSUwkweDAwMDEKKyNkZWZpbmUgU1NMM19GTEFHU19ERUxBWV9DTElFTlRfRklOSVNIRUQJMHgwMDAyCisjZGVmaW5lIFNTTDNfRkxBR1NfUE9QX0JVRkZFUgkJCTB4MDAwNAorI2RlZmluZSBUTFMxX0ZMQUdTX1RMU19QQURESU5HX0JVRwkJMHgwMDA4CisjZGVmaW5lIFRMUzFfRkxBR1NfU0tJUF9DRVJUX1ZFUklGWQkJMHgwMDEwCisKK3R5cGVkZWYgc3RydWN0IHNzbDNfc3RhdGVfc3QKKwl7CisJbG9uZyBmbGFnczsKKwlpbnQgZGVsYXlfYnVmX3BvcF9yZXQ7CisKKwl1bnNpZ25lZCBjaGFyIHJlYWRfc2VxdWVuY2VbOF07CisJaW50IHJlYWRfbWFjX3NlY3JldF9zaXplOworCXVuc2lnbmVkIGNoYXIgcmVhZF9tYWNfc2VjcmV0W0VWUF9NQVhfTURfU0laRV07CisJdW5zaWduZWQgY2hhciB3cml0ZV9zZXF1ZW5jZVs4XTsKKwlpbnQgd3JpdGVfbWFjX3NlY3JldF9zaXplOworCXVuc2lnbmVkIGNoYXIgd3JpdGVfbWFjX3NlY3JldFtFVlBfTUFYX01EX1NJWkVdOworCisJdW5zaWduZWQgY2hhciBzZXJ2ZXJfcmFuZG9tW1NTTDNfUkFORE9NX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgY2xpZW50X3JhbmRvbVtTU0wzX1JBTkRPTV9TSVpFXTsKKworCS8qIGZsYWdzIGZvciBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IGtub3duLUlWIHdlYWtuZXNzICovCisJaW50IG5lZWRfZW1wdHlfZnJhZ21lbnRzOworCWludCBlbXB0eV9mcmFnbWVudF9kb25lOworCisJLyogVGhlIHZhbHVlIG9mICdleHRyYScgd2hlbiB0aGUgYnVmZmVycyB3ZXJlIGluaXRpYWxpemVkICovCisJaW50IGluaXRfZXh0cmE7CisKKwlTU0wzX0JVRkZFUiByYnVmOwkvKiByZWFkIElPIGdvZXMgaW50byBoZXJlICovCisJU1NMM19CVUZGRVIgd2J1ZjsJLyogd3JpdGUgSU8gZ29lcyBpbnRvIGhlcmUgKi8KKworCVNTTDNfUkVDT1JEIHJyZWM7CS8qIGVhY2ggZGVjb2RlZCByZWNvcmQgZ29lcyBpbiBoZXJlICovCisJU1NMM19SRUNPUkQgd3JlYzsJLyogZ29lcyBvdXQgZnJvbSBoZXJlICovCisKKwkvKiBzdG9yYWdlIGZvciBBbGVydC9IYW5kc2hha2UgcHJvdG9jb2wgZGF0YSByZWNlaXZlZCBidXQgbm90CisJICogeWV0IHByb2Nlc3NlZCBieSBzc2wzX3JlYWRfYnl0ZXM6ICovCisJdW5zaWduZWQgY2hhciBhbGVydF9mcmFnbWVudFsyXTsKKwl1bnNpZ25lZCBpbnQgYWxlcnRfZnJhZ21lbnRfbGVuOworCXVuc2lnbmVkIGNoYXIgaGFuZHNoYWtlX2ZyYWdtZW50WzRdOworCXVuc2lnbmVkIGludCBoYW5kc2hha2VfZnJhZ21lbnRfbGVuOworCisJLyogcGFydGlhbCB3cml0ZSAtIGNoZWNrIHRoZSBudW1iZXJzIG1hdGNoICovCisJdW5zaWduZWQgaW50IHdudW07CS8qIG51bWJlciBvZiBieXRlcyBzZW50IHNvIGZhciAqLworCWludCB3cGVuZF90b3Q7CQkvKiBudW1iZXIgYnl0ZXMgd3JpdHRlbiAqLworCWludCB3cGVuZF90eXBlOworCWludCB3cGVuZF9yZXQ7CQkvKiBudW1iZXIgb2YgYnl0ZXMgc3VibWl0dGVkICovCisJY29uc3QgdW5zaWduZWQgY2hhciAqd3BlbmRfYnVmOworCisJLyogdXNlZCBkdXJpbmcgc3RhcnR1cCwgZGlnZXN0IGFsbCBpbmNvbWluZy9vdXRnb2luZyBwYWNrZXRzICovCisJQklPICpoYW5kc2hha2VfYnVmZmVyOworCS8qIFdoZW4gc2V0IG9mIGhhbmRzaGFrZSBkaWdlc3RzIGlzIGRldGVybWluZWQsIGJ1ZmZlciBpcyBoYXNoZWQKKwkgKiBhbmQgZnJlZWQgYW5kIE1EX0NUWC1lcyBmb3IgYWxsIHJlcXVpcmVkIGRpZ2VzdHMgYXJlIHN0b3JlZCBpbgorCSAqIHRoaXMgYXJyYXkgKi8KKwlFVlBfTURfQ1RYICoqaGFuZHNoYWtlX2Rnc3Q7CisJLyogdGhpcyBpcyBzZXQgd2hlbmVydmVyIHdlIHNlZSBhIGNoYW5nZV9jaXBoZXJfc3BlYyBtZXNzYWdlCisJICogY29tZSBpbiB3aGVuIHdlIGFyZSBub3QgbG9va2luZyBmb3Igb25lICovCisJaW50IGNoYW5nZV9jaXBoZXJfc3BlYzsKKworCWludCB3YXJuX2FsZXJ0OworCWludCBmYXRhbF9hbGVydDsKKwkvKiB3ZSBhbGxvdyBvbmUgZmF0YWwgYW5kIG9uZSB3YXJuaW5nIGFsZXJ0IHRvIGJlIG91dHN0YW5kaW5nLAorCSAqIHNlbmQgY2xvc2UgYWxlcnQgdmlhIHRoZSB3YXJuaW5nIGFsZXJ0ICovCisJaW50IGFsZXJ0X2Rpc3BhdGNoOworCXVuc2lnbmVkIGNoYXIgc2VuZF9hbGVydFsyXTsKKworCS8qIFRoaXMgZmxhZyBpcyBzZXQgd2hlbiB3ZSBzaG91bGQgcmVuZWdvdGlhdGUgQVNBUCwgYmFzaWNhbGx5IHdoZW4KKwkgKiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgaW4gdGhlIHJlYWQgb3Igd3JpdGUgYnVmZmVycyAqLworCWludCByZW5lZ290aWF0ZTsKKwlpbnQgdG90YWxfcmVuZWdvdGlhdGlvbnM7CisJaW50IG51bV9yZW5lZ290aWF0aW9uczsKKworCWludCBpbl9yZWFkX2FwcF9kYXRhOworCisJLyogT3BhcXVlIFBSRiBpbnB1dCBhcyB1c2VkIGZvciB0aGUgY3VycmVudCBoYW5kc2hha2UuCisJICogVGhlc2UgZmllbGRzIGFyZSB1c2VkIG9ubHkgaWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dCBpcyBkZWZpbmVkCisJICogKG90aGVyd2lzZSwgdGhleSBhcmUgbWVyZWx5IHByZXNlbnQgdG8gaW1wcm92ZSBiaW5hcnkgY29tcGF0aWJpbGl0eSkgKi8KKwl2b2lkICpjbGllbnRfb3BhcXVlX3ByZl9pbnB1dDsKKwlzaXplX3QgY2xpZW50X29wYXF1ZV9wcmZfaW5wdXRfbGVuOworCXZvaWQgKnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0OworCXNpemVfdCBzZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dF9sZW47CisKKwlzdHJ1Y3QJeworCQkvKiBhY3R1YWxseSBvbmx5IG5lZWRzIHRvIGJlIDE2KzIwICovCisJCXVuc2lnbmVkIGNoYXIgY2VydF92ZXJpZnlfbWRbRVZQX01BWF9NRF9TSVpFKjJdOworCisJCS8qIGFjdHVhbGx5IG9ubHkgbmVlZCB0byBiZSAxNisyMCBmb3IgU1NMdjMgYW5kIDEyIGZvciBUTFMgKi8KKwkJdW5zaWduZWQgY2hhciBmaW5pc2hfbWRbRVZQX01BWF9NRF9TSVpFKjJdOworCQlpbnQgZmluaXNoX21kX2xlbjsKKwkJdW5zaWduZWQgY2hhciBwZWVyX2ZpbmlzaF9tZFtFVlBfTUFYX01EX1NJWkUqMl07CisJCWludCBwZWVyX2ZpbmlzaF9tZF9sZW47CisJCQorCQl1bnNpZ25lZCBsb25nIG1lc3NhZ2Vfc2l6ZTsKKwkJaW50IG1lc3NhZ2VfdHlwZTsKKworCQkvKiB1c2VkIHRvIGhvbGQgdGhlIG5ldyBjaXBoZXIgd2UgYXJlIGdvaW5nIHRvIHVzZSAqLworCQljb25zdCBTU0xfQ0lQSEVSICpuZXdfY2lwaGVyOworI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCURIICpkaDsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCQlFQ19LRVkgKmVjZGg7IC8qIGhvbGRzIHNob3J0IGxpdmVkIEVDREgga2V5ICovCisjZW5kaWYKKworCQkvKiB1c2VkIHdoZW4gU1NMX1NUX0ZMVVNIX0RBVEEgaXMgZW50ZXJlZCAqLworCQlpbnQgbmV4dF9zdGF0ZTsJCQkKKworCQlpbnQgcmV1c2VfbWVzc2FnZTsKKworCQkvKiB1c2VkIGZvciBjZXJ0aWZpY2F0ZSByZXF1ZXN0cyAqLworCQlpbnQgY2VydF9yZXE7CisJCWludCBjdHlwZV9udW07CisJCWNoYXIgY3R5cGVbU1NMM19DVF9OVU1CRVJdOworCQlTVEFDS19PRihYNTA5X05BTUUpICpjYV9uYW1lczsKKworCQlpbnQgdXNlX3JzYV90bXA7CisKKwkJaW50IGtleV9ibG9ja19sZW5ndGg7CisJCXVuc2lnbmVkIGNoYXIgKmtleV9ibG9jazsKKworCQljb25zdCBFVlBfQ0lQSEVSICpuZXdfc3ltX2VuYzsKKwkJY29uc3QgRVZQX01EICpuZXdfaGFzaDsKKwkJaW50IG5ld19tYWNfcGtleV90eXBlOworCQlpbnQgbmV3X21hY19zZWNyZXRfc2l6ZTsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJCWNvbnN0IFNTTF9DT01QICpuZXdfY29tcHJlc3Npb247CisjZWxzZQorCQljaGFyICpuZXdfY29tcHJlc3Npb247CisjZW5kaWYKKwkJaW50IGNlcnRfcmVxdWVzdDsKKwkJfSB0bXA7CisKKyAgICAgICAgLyogQ29ubmVjdGlvbiBiaW5kaW5nIHRvIHByZXZlbnQgcmVuZWdvdGlhdGlvbiBhdHRhY2tzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgcHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkW0VWUF9NQVhfTURfU0laRV07CisgICAgICAgIHVuc2lnbmVkIGNoYXIgcHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbjsKKyAgICAgICAgdW5zaWduZWQgY2hhciBwcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRbRVZQX01BWF9NRF9TSVpFXTsKKyAgICAgICAgdW5zaWduZWQgY2hhciBwcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuOworICAgICAgICBpbnQgc2VuZF9jb25uZWN0aW9uX2JpbmRpbmc7IC8qIFRPRE9FS1IgKi8KKwl9IFNTTDNfU1RBVEU7CisKKworLyogU1NMdjMgKi8KKy8qY2xpZW50ICovCisvKiBleHRyYSBzdGF0ZSAqLworI2RlZmluZSBTU0wzX1NUX0NXX0ZMVVNICQkoMHgxMDB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1VUVEhST1VHSF9DT01QTEVURQkoMHgxMDF8U1NMX1NUX0NPTk5FQ1QpCisvKiB3cml0ZSB0byBzZXJ2ZXIgKi8KKyNkZWZpbmUgU1NMM19TVF9DV19DTE5UX0hFTExPX0EJCSgweDExMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19DTE5UX0hFTExPX0IJCSgweDExMXxTU0xfU1RfQ09OTkVDVCkKKy8qIHJlYWQgZnJvbSBzZXJ2ZXIgKi8KKyNkZWZpbmUgU1NMM19TVF9DUl9TUlZSX0hFTExPX0EJCSgweDEyMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9TUlZSX0hFTExPX0IJCSgweDEyMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgRFRMUzFfU1RfQ1JfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQSAoMHgxMjZ8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIERUTFMxX1NUX0NSX0hFTExPX1ZFUklGWV9SRVFVRVNUX0IgKDB4MTI3fFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX0NFUlRfQQkJKDB4MTMwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX0NFUlRfQgkJKDB4MTMxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX0tFWV9FWENIX0EJCSgweDE0MHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9LRVlfRVhDSF9CCQkoMHgxNDF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfQ0VSVF9SRVFfQQkJKDB4MTUwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX0NFUlRfUkVRX0IJCSgweDE1MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9TUlZSX0RPTkVfQQkJKDB4MTYwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX1NSVlJfRE9ORV9CCQkoMHgxNjF8U1NMX1NUX0NPTk5FQ1QpCisvKiB3cml0ZSB0byBzZXJ2ZXIgKi8KKyNkZWZpbmUgU1NMM19TVF9DV19DRVJUX0EJCSgweDE3MHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19DRVJUX0IJCSgweDE3MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19DRVJUX0MJCSgweDE3MnxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19DRVJUX0QJCSgweDE3M3xTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19LRVlfRVhDSF9BCQkoMHgxODB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfS0VZX0VYQ0hfQgkJKDB4MTgxfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NXX0NFUlRfVlJGWV9BCQkoMHgxOTB8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0IJCSgweDE5MXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DV19DSEFOR0VfQQkJKDB4MUEwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NXX0NIQU5HRV9CCQkoMHgxQTF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1dfRklOSVNIRURfQQkJKDB4MUIwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NXX0ZJTklTSEVEX0IJCSgweDFCMXxTU0xfU1RfQ09OTkVDVCkKKy8qIHJlYWQgZnJvbSBzZXJ2ZXIgKi8KKyNkZWZpbmUgU1NMM19TVF9DUl9DSEFOR0VfQQkJKDB4MUMwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX0NIQU5HRV9CCQkoMHgxQzF8U1NMX1NUX0NPTk5FQ1QpCisjZGVmaW5lIFNTTDNfU1RfQ1JfRklOSVNIRURfQQkJKDB4MUQwfFNTTF9TVF9DT05ORUNUKQorI2RlZmluZSBTU0wzX1NUX0NSX0ZJTklTSEVEX0IJCSgweDFEMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BCSgweDFFMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9CCSgweDFFMXxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9DRVJUX1NUQVRVU19BCSgweDFGMHxTU0xfU1RfQ09OTkVDVCkKKyNkZWZpbmUgU1NMM19TVF9DUl9DRVJUX1NUQVRVU19CCSgweDFGMXxTU0xfU1RfQ09OTkVDVCkKKworLyogc2VydmVyICovCisvKiBleHRyYSBzdGF0ZSAqLworI2RlZmluZSBTU0wzX1NUX1NXX0ZMVVNICQkoMHgxMDB8U1NMX1NUX0FDQ0VQVCkKKy8qIHJlYWQgZnJvbSBjbGllbnQgKi8KKy8qIERvIG5vdCBjaGFuZ2UgdGhlIG51bWJlciB2YWx1ZXMsIHRoZXkgZG8gbWF0dGVyICovCisjZGVmaW5lIFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19BCQkoMHgxMTB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9DTE5UX0hFTExPX0IJCSgweDExMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQwkJKDB4MTEyfFNTTF9TVF9BQ0NFUFQpCisvKiB3cml0ZSB0byBjbGllbnQgKi8KKyNkZWZpbmUgRFRMUzFfU1RfU1dfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQSAoMHgxMTN8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgRFRMUzFfU1RfU1dfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQiAoMHgxMTR8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19IRUxMT19SRVFfQQkJKDB4MTIwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0IJCSgweDEyMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9DCQkoMHgxMjJ8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19TUlZSX0hFTExPX0EJCSgweDEzMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQgkJKDB4MTMxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfQ0VSVF9BCQkoMHgxNDB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19DRVJUX0IJCSgweDE0MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0tFWV9FWENIX0EJCSgweDE1MHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0tFWV9FWENIX0IJCSgweDE1MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0NFUlRfUkVRX0EJCSgweDE2MHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0NFUlRfUkVRX0IJCSgweDE2MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX1NSVlJfRE9ORV9BCQkoMHgxNzB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19TUlZSX0RPTkVfQgkJKDB4MTcxfFNTTF9TVF9BQ0NFUFQpCisvKiByZWFkIGZyb20gY2xpZW50ICovCisjZGVmaW5lIFNTTDNfU1RfU1JfQ0VSVF9BCQkoMHgxODB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9DRVJUX0IJCSgweDE4MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NSX0tFWV9FWENIX0EJCSgweDE5MHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NSX0tFWV9FWENIX0IJCSgweDE5MXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NSX0NFUlRfVlJGWV9BCQkoMHgxQTB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9DRVJUX1ZSRllfQgkJKDB4MUExfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1JfQ0hBTkdFX0EJCSgweDFCMHxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NSX0NIQU5HRV9CCQkoMHgxQjF8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9GSU5JU0hFRF9BCQkoMHgxQzB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TUl9GSU5JU0hFRF9CCQkoMHgxQzF8U1NMX1NUX0FDQ0VQVCkKKy8qIHdyaXRlIHRvIGNsaWVudCAqLworI2RlZmluZSBTU0wzX1NUX1NXX0NIQU5HRV9BCQkoMHgxRDB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19DSEFOR0VfQgkJKDB4MUQxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfRklOSVNIRURfQQkJKDB4MUUwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfRklOSVNIRURfQgkJKDB4MUUxfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfU0VTU0lPTl9USUNLRVRfQQkoMHgxRjB8U1NMX1NUX0FDQ0VQVCkKKyNkZWZpbmUgU1NMM19TVF9TV19TRVNTSU9OX1RJQ0tFVF9CCSgweDFGMXxTU0xfU1RfQUNDRVBUKQorI2RlZmluZSBTU0wzX1NUX1NXX0NFUlRfU1RBVFVTX0EJKDB4MjAwfFNTTF9TVF9BQ0NFUFQpCisjZGVmaW5lIFNTTDNfU1RfU1dfQ0VSVF9TVEFUVVNfQgkoMHgyMDF8U1NMX1NUX0FDQ0VQVCkKKworI2RlZmluZSBTU0wzX01UX0hFTExPX1JFUVVFU1QJCQkwCisjZGVmaW5lIFNTTDNfTVRfQ0xJRU5UX0hFTExPCQkJMQorI2RlZmluZSBTU0wzX01UX1NFUlZFUl9IRUxMTwkJCTIKKyNkZWZpbmUJU1NMM19NVF9ORVdTRVNTSU9OX1RJQ0tFVAkJNAorI2RlZmluZSBTU0wzX01UX0NFUlRJRklDQVRFCQkJMTEKKyNkZWZpbmUgU1NMM19NVF9TRVJWRVJfS0VZX0VYQ0hBTkdFCQkxMgorI2RlZmluZSBTU0wzX01UX0NFUlRJRklDQVRFX1JFUVVFU1QJCTEzCisjZGVmaW5lIFNTTDNfTVRfU0VSVkVSX0RPTkUJCQkxNAorI2RlZmluZSBTU0wzX01UX0NFUlRJRklDQVRFX1ZFUklGWQkJMTUKKyNkZWZpbmUgU1NMM19NVF9DTElFTlRfS0VZX0VYQ0hBTkdFCQkxNgorI2RlZmluZSBTU0wzX01UX0ZJTklTSEVECQkJMjAKKyNkZWZpbmUgU1NMM19NVF9DRVJUSUZJQ0FURV9TVEFUVVMJCTIyCisjZGVmaW5lIERUTFMxX01UX0hFTExPX1ZFUklGWV9SRVFVRVNUICAgIDMKKworCisjZGVmaW5lIFNTTDNfTVRfQ0NTCQkJCTEKKworLyogVGhlc2UgYXJlIHVzZWQgd2hlbiBjaGFuZ2luZyBvdmVyIHRvIGEgbmV3IGNpcGhlciAqLworI2RlZmluZSBTU0wzX0NDX1JFQUQJCTB4MDEKKyNkZWZpbmUgU1NMM19DQ19XUklURQkJMHgwMgorI2RlZmluZSBTU0wzX0NDX0NMSUVOVAkJMHgxMAorI2RlZmluZSBTU0wzX0NDX1NFUlZFUgkJMHgyMAorI2RlZmluZSBTU0wzX0NIQU5HRV9DSVBIRVJfQ0xJRU5UX1dSSVRFCShTU0wzX0NDX0NMSUVOVHxTU0wzX0NDX1dSSVRFKQkKKyNkZWZpbmUgU1NMM19DSEFOR0VfQ0lQSEVSX1NFUlZFUl9SRUFECShTU0wzX0NDX1NFUlZFUnxTU0wzX0NDX1JFQUQpCisjZGVmaW5lIFNTTDNfQ0hBTkdFX0NJUEhFUl9DTElFTlRfUkVBRAkoU1NMM19DQ19DTElFTlR8U1NMM19DQ19SRUFEKQorI2RlZmluZSBTU0wzX0NIQU5HRV9DSVBIRVJfU0VSVkVSX1dSSVRFCShTU0wzX0NDX1NFUlZFUnxTU0wzX0NDX1dSSVRFKQorCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3NzbF9hbGdzLmMgYi9saWIvb3BlbnNzbC9zc2wvc3NsX2FsZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTY3YjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbF9hbGdzLmMKQEAgLTAsMCArMSwxNDAgQEAKKy8qIHNzbC9zc2xfYWxncy5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorCitpbnQgU1NMX2xpYnJhcnlfaW5pdCh2b2lkKQorCXsKKworI2lmbmRlZiBPUEVOU1NMX05PX0RFUworCUVWUF9hZGRfY2lwaGVyKEVWUF9kZXNfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9kZXNfZWRlM19jYmMoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJRVZQX2FkZF9jaXBoZXIoRVZQX2lkZWFfY2JjKCkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUkM0CisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjNCgpKTsKKyNlbmRpZiAgCisjaWZuZGVmIE9QRU5TU0xfTk9fUkMyCisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjMl9jYmMoKSk7CisJLyogTm90IGFjdHVhbGx5IHVzZWQgZm9yIFNTTC9UTFMgYnV0IHRoaXMgbWFrZXMgUEtDUyMxMiB3b3JrCisJICogaWYgYW4gYXBwbGljYXRpb24gb25seSBjYWxscyBTU0xfbGlicmFyeV9pbml0KCkuCisJICovCisJRVZQX2FkZF9jaXBoZXIoRVZQX3JjMl80MF9jYmMoKSk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19BRVMKKwlFVlBfYWRkX2NpcGhlcihFVlBfYWVzXzEyOF9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2Flc18xOTJfY2JjKCkpOworCUVWUF9hZGRfY2lwaGVyKEVWUF9hZXNfMjU2X2NiYygpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NBTUVMTElBCisJRVZQX2FkZF9jaXBoZXIoRVZQX2NhbWVsbGlhXzEyOF9jYmMoKSk7CisJRVZQX2FkZF9jaXBoZXIoRVZQX2NhbWVsbGlhXzI1Nl9jYmMoKSk7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1NFRUQKKwlFVlBfYWRkX2NpcGhlcihFVlBfc2VlZF9jYmMoKSk7CisjZW5kaWYKKyAgCisjaWZuZGVmIE9QRU5TU0xfTk9fTUQ1CisJRVZQX2FkZF9kaWdlc3QoRVZQX21kNSgpKTsKKwlFVlBfYWRkX2RpZ2VzdF9hbGlhcyhTTl9tZDUsInNzbDItbWQ1Iik7CisJRVZQX2FkZF9kaWdlc3RfYWxpYXMoU05fbWQ1LCJzc2wzLW1kNSIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBCisJRVZQX2FkZF9kaWdlc3QoRVZQX3NoYTEoKSk7IC8qIFJTQSB3aXRoIHNoYTEgKi8KKwlFVlBfYWRkX2RpZ2VzdF9hbGlhcyhTTl9zaGExLCJzc2wzLXNoYTEiKTsKKwlFVlBfYWRkX2RpZ2VzdF9hbGlhcyhTTl9zaGExV2l0aFJTQUVuY3J5cHRpb24sU05fc2hhMVdpdGhSU0EpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBMjU2CisJRVZQX2FkZF9kaWdlc3QoRVZQX3NoYTIyNCgpKTsKKwlFVlBfYWRkX2RpZ2VzdChFVlBfc2hhMjU2KCkpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fU0hBNTEyCisJRVZQX2FkZF9kaWdlc3QoRVZQX3NoYTM4NCgpKTsKKwlFVlBfYWRkX2RpZ2VzdChFVlBfc2hhNTEyKCkpOworI2VuZGlmCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TSEEpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fRFNBKQorCUVWUF9hZGRfZGlnZXN0KEVWUF9kc3MxKCkpOyAvKiBEU0Egd2l0aCBzaGExICovCisJRVZQX2FkZF9kaWdlc3RfYWxpYXMoU05fZHNhV2l0aFNIQTEsU05fZHNhV2l0aFNIQTFfMik7CisJRVZQX2FkZF9kaWdlc3RfYWxpYXMoU05fZHNhV2l0aFNIQTEsIkRTUzEiKTsKKwlFVlBfYWRkX2RpZ2VzdF9hbGlhcyhTTl9kc2FXaXRoU0hBMSwiZHNzMSIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwlFVlBfYWRkX2RpZ2VzdChFVlBfZWNkc2EoKSk7CisjZW5kaWYKKwkvKiBJZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBwaGFzZWQgb3V0IGNpcGhlcnMsIGFkZCB0aGUgZm9sbG93aW5nICovCisjaWYgMAorCUVWUF9hZGRfZGlnZXN0KEVWUF9zaGEoKSk7CisJRVZQX2FkZF9kaWdlc3QoRVZQX2RzcygpKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwkvKiBUaGlzIHdpbGwgaW5pdGlhbGlzZSB0aGUgYnVpbHQtaW4gY29tcHJlc3Npb24gYWxnb3JpdGhtcy4KKwkgICBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgYSBTVEFDS19PRihTU0xfQ09NUCksIGJ1dCB0aGF0IGNhbgorCSAgIGJlIGRpc2NhcmRlZCBzYWZlbHkgKi8KKwkodm9pZClTU0xfQ09NUF9nZXRfY29tcHJlc3Npb25fbWV0aG9kcygpOworI2VuZGlmCisJLyogaW5pdGlhbGl6ZSBjaXBoZXIvZGlnZXN0IG1ldGhvZHMgdGFibGUgKi8KKwlzc2xfbG9hZF9jaXBoZXJzKCk7CisJcmV0dXJuKDEpOworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3NzbF9hc24xLmMgYi9saWIvb3BlbnNzbC9zc2wvc3NsX2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODcwOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbF9hc24xLmMKQEAgLTAsMCArMSw1OTMgQEAKKy8qIHNzbC9zc2xfYXNuMS5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDUgTm9raWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIHBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGlzIGRldmVsb3BlZCBieQorICogTm9raWEgQ29ycG9yYXRpb24gYW5kIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlLgorICoKKyAqIFRoZSBDb250cmlidXRpb24sIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZgorICogTm9raWEgQ29ycG9yYXRpb24sIGNvbnNpc3RzIG9mIHRoZSAiUFNLIiAoUHJlLVNoYXJlZCBLZXkpIGNpcGhlcnN1aXRlcworICogc3VwcG9ydCAoc2VlIFJGQyA0Mjc5KSB0byBPcGVuU1NMLgorICoKKyAqIE5vIHBhdGVudCBsaWNlbnNlcyBvciBvdGhlciByaWdodHMgZXhjZXB0IHRob3NlIGV4cHJlc3NseSBzdGF0ZWQgaW4KKyAqIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlIGxpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIGdyYW50ZWQgb3IgcmVjZWl2ZWQKKyAqIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsLCBvciBvdGhlcndpc2UuCisgKgorICogTm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgTm9raWEgdGhhdCB0aGUgQ29udHJpYnV0aW9uIGRvZXMgbm90CisgKiBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IHRoaXJkCisgKiBwYXJ0eSBvciB0aGF0IHRoZSBsaWNlbnNlIHByb3ZpZGVzIHlvdSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHJpZ2h0cworICogdG8gbWFrZSB1c2Ugb2YgdGhlIENvbnRyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELiBJTgorICogQURESVRJT04gVE8gVEhFIERJU0NMQUlNRVJTIElOQ0xVREVEIElOIFRIRSBMSUNFTlNFLCBOT0tJQQorICogU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIEZPUiBDTEFJTVMgQlJPVUdIVCBCWSBZT1UgT1IgQU5ZCisgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKKyAqIE9USEVSV0lTRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYXNuMV9tYWMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKwordHlwZWRlZiBzdHJ1Y3Qgc3NsX3Nlc3Npb25fYXNuMV9zdAorCXsKKwlBU04xX0lOVEVHRVIgdmVyc2lvbjsKKwlBU04xX0lOVEVHRVIgc3NsX3ZlcnNpb247CisJQVNOMV9PQ1RFVF9TVFJJTkcgY2lwaGVyOworCUFTTjFfT0NURVRfU1RSSU5HIGNvbXBfaWQ7CisJQVNOMV9PQ1RFVF9TVFJJTkcgbWFzdGVyX2tleTsKKwlBU04xX09DVEVUX1NUUklORyBzZXNzaW9uX2lkOworCUFTTjFfT0NURVRfU1RSSU5HIHNlc3Npb25faWRfY29udGV4dDsKKwlBU04xX09DVEVUX1NUUklORyBrZXlfYXJnOworI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKyAgICAgICAgQVNOMV9PQ1RFVF9TVFJJTkcga3JiNV9wcmluYzsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0tSQjUgKi8KKwlBU04xX0lOVEVHRVIgdGltZTsKKwlBU04xX0lOVEVHRVIgdGltZW91dDsKKwlBU04xX0lOVEVHRVIgdmVyaWZ5X3Jlc3VsdDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlBU04xX09DVEVUX1NUUklORyB0bHNleHRfaG9zdG5hbWU7CisJQVNOMV9JTlRFR0VSIHRsc2V4dF90aWNrX2xpZmV0aW1lOworCUFTTjFfT0NURVRfU1RSSU5HIHRsc2V4dF90aWNrOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJQVNOMV9PQ1RFVF9TVFJJTkcgcHNrX2lkZW50aXR5X2hpbnQ7CisJQVNOMV9PQ1RFVF9TVFJJTkcgcHNrX2lkZW50aXR5OworI2VuZGlmIC8qIE9QRU5TU0xfTk9fUFNLICovCisJfSBTU0xfU0VTU0lPTl9BU04xOworCitpbnQgaTJkX1NTTF9TRVNTSU9OKFNTTF9TRVNTSU9OICppbiwgdW5zaWduZWQgY2hhciAqKnBwKQorCXsKKyNkZWZpbmUgTFNJWkUyIChzaXplb2YobG9uZykqMikKKwlpbnQgdjE9MCx2Mj0wLHYzPTAsdjQ9MCx2NT0wLHY3PTAsdjg9MDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls0XSxpYnVmMVtMU0laRTJdLGlidWYyW0xTSVpFMl07CisJdW5zaWduZWQgY2hhciBpYnVmM1tMU0laRTJdLGlidWY0W0xTSVpFMl0saWJ1ZjVbTFNJWkUyXTsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpbnQgdjY9MCx2OT0wLHYxMD0wOworCXVuc2lnbmVkIGNoYXIgaWJ1ZjZbTFNJWkUyXTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwl1bnNpZ25lZCBjaGFyIGNidWY7CisJaW50IHYxMT0wOworI2VuZGlmCisJbG9uZyBsOworCVNTTF9TRVNTSU9OX0FTTjEgYTsKKwlNX0FTTjFfSTJEX3ZhcnMoaW4pOworCisJaWYgKChpbiA9PSBOVUxMKSB8fCAoKGluLT5jaXBoZXIgPT0gTlVMTCkgJiYgKGluLT5jaXBoZXJfaWQgPT0gMCkpKQorCQlyZXR1cm4oMCk7CisKKwkvKiBOb3RlIHRoYXQgSSBjaGVhdCBpbiB0aGUgZm9sbG93aW5nIDIgYXNzaWdubWVudHMuICBJIGtub3cKKwkgKiB0aGF0IGlmIHRoZSBBU04xX0lOVEVHRVIgcGFzc2VkIHRvIEFTTjFfSU5URUdFUl9zZXQKKwkgKiBpcyA+IHNpemVvZihsb25nKSsxLCB0aGUgYnVmZmVyIHdpbGwgbm90IGJlIHJlLU9QRU5TU0xfbWFsbG9jKCllZC4KKwkgKiBUaGlzIGlzIGEgYml0IGV2aWwgYnV0IG1ha2VzIHRoaW5ncyBzaW1wbGUsIG5vIGR5bmFtaWMgYWxsb2NhdGlvbgorCSAqIHRvIGNsZWFuIHVwIDotKSAqLworCWEudmVyc2lvbi5sZW5ndGg9TFNJWkUyOworCWEudmVyc2lvbi50eXBlPVZfQVNOMV9JTlRFR0VSOworCWEudmVyc2lvbi5kYXRhPWlidWYxOworCUFTTjFfSU5URUdFUl9zZXQoJihhLnZlcnNpb24pLFNTTF9TRVNTSU9OX0FTTjFfVkVSU0lPTik7CisKKwlhLnNzbF92ZXJzaW9uLmxlbmd0aD1MU0laRTI7CisJYS5zc2xfdmVyc2lvbi50eXBlPVZfQVNOMV9JTlRFR0VSOworCWEuc3NsX3ZlcnNpb24uZGF0YT1pYnVmMjsKKwlBU04xX0lOVEVHRVJfc2V0KCYoYS5zc2xfdmVyc2lvbiksaW4tPnNzbF92ZXJzaW9uKTsKKworCWEuY2lwaGVyLnR5cGU9Vl9BU04xX09DVEVUX1NUUklORzsKKwlhLmNpcGhlci5kYXRhPWJ1ZjsKKworCWlmIChpbi0+Y2lwaGVyID09IE5VTEwpCisJCWw9aW4tPmNpcGhlcl9pZDsKKwllbHNlCisJCWw9aW4tPmNpcGhlci0+aWQ7CisJaWYgKGluLT5zc2xfdmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pCisJCXsKKwkJYS5jaXBoZXIubGVuZ3RoPTM7CisJCWJ1ZlswXT0oKHVuc2lnbmVkIGNoYXIpKGw+PjE2TCkpJjB4ZmY7CisJCWJ1ZlsxXT0oKHVuc2lnbmVkIGNoYXIpKGw+PiA4TCkpJjB4ZmY7CisJCWJ1ZlsyXT0oKHVuc2lnbmVkIGNoYXIpKGwgICAgICkpJjB4ZmY7CisJCX0KKwllbHNlCisJCXsKKwkJYS5jaXBoZXIubGVuZ3RoPTI7CisJCWJ1ZlswXT0oKHVuc2lnbmVkIGNoYXIpKGw+PjhMKSkmMHhmZjsKKwkJYnVmWzFdPSgodW5zaWduZWQgY2hhcikobCAgICApKSYweGZmOworCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJaWYgKGluLT5jb21wcmVzc19tZXRoKQorCQl7CisJCWNidWYgPSAodW5zaWduZWQgY2hhcilpbi0+Y29tcHJlc3NfbWV0aDsKKwkJYS5jb21wX2lkLmxlbmd0aCA9IDE7CisJCWEuY29tcF9pZC50eXBlID0gVl9BU04xX09DVEVUX1NUUklORzsKKwkJYS5jb21wX2lkLmRhdGEgPSAmY2J1ZjsKKwkJfQorI2VuZGlmCisKKwlhLm1hc3Rlcl9rZXkubGVuZ3RoPWluLT5tYXN0ZXJfa2V5X2xlbmd0aDsKKwlhLm1hc3Rlcl9rZXkudHlwZT1WX0FTTjFfT0NURVRfU1RSSU5HOworCWEubWFzdGVyX2tleS5kYXRhPWluLT5tYXN0ZXJfa2V5OworCisJYS5zZXNzaW9uX2lkLmxlbmd0aD1pbi0+c2Vzc2lvbl9pZF9sZW5ndGg7CisJYS5zZXNzaW9uX2lkLnR5cGU9Vl9BU04xX09DVEVUX1NUUklORzsKKwlhLnNlc3Npb25faWQuZGF0YT1pbi0+c2Vzc2lvbl9pZDsKKworCWEuc2Vzc2lvbl9pZF9jb250ZXh0Lmxlbmd0aD1pbi0+c2lkX2N0eF9sZW5ndGg7CisJYS5zZXNzaW9uX2lkX2NvbnRleHQudHlwZT1WX0FTTjFfT0NURVRfU1RSSU5HOworCWEuc2Vzc2lvbl9pZF9jb250ZXh0LmRhdGE9aW4tPnNpZF9jdHg7CisKKwlhLmtleV9hcmcubGVuZ3RoPWluLT5rZXlfYXJnX2xlbmd0aDsKKwlhLmtleV9hcmcudHlwZT1WX0FTTjFfT0NURVRfU1RSSU5HOworCWEua2V5X2FyZy5kYXRhPWluLT5rZXlfYXJnOworCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCWlmIChpbi0+a3JiNV9jbGllbnRfcHJpbmNfbGVuKQorCQl7CisJCWEua3JiNV9wcmluYy5sZW5ndGg9aW4tPmtyYjVfY2xpZW50X3ByaW5jX2xlbjsKKwkJYS5rcmI1X3ByaW5jLnR5cGU9Vl9BU04xX09DVEVUX1NUUklORzsKKwkJYS5rcmI1X3ByaW5jLmRhdGE9aW4tPmtyYjVfY2xpZW50X3ByaW5jOworCQl9CisjZW5kaWYgLyogT1BFTlNTTF9OT19LUkI1ICovCisKKwlpZiAoaW4tPnRpbWUgIT0gMEwpCisJCXsKKwkJYS50aW1lLmxlbmd0aD1MU0laRTI7CisJCWEudGltZS50eXBlPVZfQVNOMV9JTlRFR0VSOworCQlhLnRpbWUuZGF0YT1pYnVmMzsKKwkJQVNOMV9JTlRFR0VSX3NldCgmKGEudGltZSksaW4tPnRpbWUpOworCQl9CisKKwlpZiAoaW4tPnRpbWVvdXQgIT0gMEwpCisJCXsKKwkJYS50aW1lb3V0Lmxlbmd0aD1MU0laRTI7CisJCWEudGltZW91dC50eXBlPVZfQVNOMV9JTlRFR0VSOworCQlhLnRpbWVvdXQuZGF0YT1pYnVmNDsKKwkJQVNOMV9JTlRFR0VSX3NldCgmKGEudGltZW91dCksaW4tPnRpbWVvdXQpOworCQl9CisKKwlpZiAoaW4tPnZlcmlmeV9yZXN1bHQgIT0gWDUwOV9WX09LKQorCQl7CisJCWEudmVyaWZ5X3Jlc3VsdC5sZW5ndGg9TFNJWkUyOworCQlhLnZlcmlmeV9yZXN1bHQudHlwZT1WX0FTTjFfSU5URUdFUjsKKwkJYS52ZXJpZnlfcmVzdWx0LmRhdGE9aWJ1ZjU7CisJCUFTTjFfSU5URUdFUl9zZXQoJmEudmVyaWZ5X3Jlc3VsdCxpbi0+dmVyaWZ5X3Jlc3VsdCk7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCWlmIChpbi0+dGxzZXh0X2hvc3RuYW1lKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhLnRsc2V4dF9ob3N0bmFtZS5sZW5ndGg9c3RybGVuKGluLT50bHNleHRfaG9zdG5hbWUpOworICAgICAgICAgICAgICAgIGEudGxzZXh0X2hvc3RuYW1lLnR5cGU9Vl9BU04xX09DVEVUX1NUUklORzsKKyAgICAgICAgICAgICAgICBhLnRsc2V4dF9ob3N0bmFtZS5kYXRhPSh1bnNpZ25lZCBjaGFyICopaW4tPnRsc2V4dF9ob3N0bmFtZTsKKyAgICAgICAgICAgICAgICB9CisJaWYgKGluLT50bHNleHRfdGljaykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYS50bHNleHRfdGljay5sZW5ndGg9IGluLT50bHNleHRfdGlja2xlbjsKKyAgICAgICAgICAgICAgICBhLnRsc2V4dF90aWNrLnR5cGU9Vl9BU04xX09DVEVUX1NUUklORzsKKyAgICAgICAgICAgICAgICBhLnRsc2V4dF90aWNrLmRhdGE9KHVuc2lnbmVkIGNoYXIgKilpbi0+dGxzZXh0X3RpY2s7CisgICAgICAgICAgICAgICAgfQorCWlmIChpbi0+dGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludCA+IDApCisJCXsKKwkJYS50bHNleHRfdGlja19saWZldGltZS5sZW5ndGg9TFNJWkUyOworCQlhLnRsc2V4dF90aWNrX2xpZmV0aW1lLnR5cGU9Vl9BU04xX0lOVEVHRVI7CisJCWEudGxzZXh0X3RpY2tfbGlmZXRpbWUuZGF0YT1pYnVmNjsKKwkJQVNOMV9JTlRFR0VSX3NldCgmYS50bHNleHRfdGlja19saWZldGltZSxpbi0+dGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludCk7CisJCX0KKyNlbmRpZiAvKiBPUEVOU1NMX05PX1RMU0VYVCAqLworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCWlmIChpbi0+cHNrX2lkZW50aXR5X2hpbnQpCisJCXsKKwkJYS5wc2tfaWRlbnRpdHlfaGludC5sZW5ndGg9c3RybGVuKGluLT5wc2tfaWRlbnRpdHlfaGludCk7CisJCWEucHNrX2lkZW50aXR5X2hpbnQudHlwZT1WX0FTTjFfT0NURVRfU1RSSU5HOworCQlhLnBza19pZGVudGl0eV9oaW50LmRhdGE9KHVuc2lnbmVkIGNoYXIgKikoaW4tPnBza19pZGVudGl0eV9oaW50KTsKKwkJfQorCWlmIChpbi0+cHNrX2lkZW50aXR5KQorCQl7CisJCWEucHNrX2lkZW50aXR5Lmxlbmd0aD1zdHJsZW4oaW4tPnBza19pZGVudGl0eSk7CisJCWEucHNrX2lkZW50aXR5LnR5cGU9Vl9BU04xX09DVEVUX1NUUklORzsKKwkJYS5wc2tfaWRlbnRpdHkuZGF0YT0odW5zaWduZWQgY2hhciAqKShpbi0+cHNrX2lkZW50aXR5KTsKKwkJfQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fUFNLICovCisKKwlNX0FTTjFfSTJEX2xlbigmKGEudmVyc2lvbiksCQlpMmRfQVNOMV9JTlRFR0VSKTsKKwlNX0FTTjFfSTJEX2xlbigmKGEuc3NsX3ZlcnNpb24pLAlpMmRfQVNOMV9JTlRFR0VSKTsKKwlNX0FTTjFfSTJEX2xlbigmKGEuY2lwaGVyKSwJCWkyZF9BU04xX09DVEVUX1NUUklORyk7CisJTV9BU04xX0kyRF9sZW4oJihhLnNlc3Npb25faWQpLAkJaTJkX0FTTjFfT0NURVRfU1RSSU5HKTsKKwlNX0FTTjFfSTJEX2xlbigmKGEubWFzdGVyX2tleSksCQlpMmRfQVNOMV9PQ1RFVF9TVFJJTkcpOworI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKwlpZiAoaW4tPmtyYjVfY2xpZW50X3ByaW5jX2xlbikKKyAgICAgICAgCU1fQVNOMV9JMkRfbGVuKCYoYS5rcmI1X3ByaW5jKSwJaTJkX0FTTjFfT0NURVRfU1RSSU5HKTsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0tSQjUgKi8KKwlpZiAoaW4tPmtleV9hcmdfbGVuZ3RoID4gMCkKKwkJTV9BU04xX0kyRF9sZW5fSU1QX29wdCgmKGEua2V5X2FyZyksaTJkX0FTTjFfT0NURVRfU1RSSU5HKTsKKwlpZiAoaW4tPnRpbWUgIT0gMEwpCisJCU1fQVNOMV9JMkRfbGVuX0VYUF9vcHQoJihhLnRpbWUpLGkyZF9BU04xX0lOVEVHRVIsMSx2MSk7CisJaWYgKGluLT50aW1lb3V0ICE9IDBMKQorCQlNX0FTTjFfSTJEX2xlbl9FWFBfb3B0KCYoYS50aW1lb3V0KSxpMmRfQVNOMV9JTlRFR0VSLDIsdjIpOworCWlmIChpbi0+cGVlciAhPSBOVUxMKQorCQlNX0FTTjFfSTJEX2xlbl9FWFBfb3B0KGluLT5wZWVyLGkyZF9YNTA5LDMsdjMpOworCU1fQVNOMV9JMkRfbGVuX0VYUF9vcHQoJmEuc2Vzc2lvbl9pZF9jb250ZXh0LGkyZF9BU04xX09DVEVUX1NUUklORyw0LHY0KTsKKwlpZiAoaW4tPnZlcmlmeV9yZXN1bHQgIT0gWDUwOV9WX09LKQorCQlNX0FTTjFfSTJEX2xlbl9FWFBfb3B0KCYoYS52ZXJpZnlfcmVzdWx0KSxpMmRfQVNOMV9JTlRFR0VSLDUsdjUpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKGluLT50bHNleHRfdGlja19saWZldGltZV9oaW50ID4gMCkKKyAgICAgIAkgCU1fQVNOMV9JMkRfbGVuX0VYUF9vcHQoJmEudGxzZXh0X3RpY2tfbGlmZXRpbWUsIGkyZF9BU04xX0lOVEVHRVIsOSx2OSk7CisJaWYgKGluLT50bHNleHRfdGljaykKKyAgICAgICAgCU1fQVNOMV9JMkRfbGVuX0VYUF9vcHQoJihhLnRsc2V4dF90aWNrKSwgaTJkX0FTTjFfT0NURVRfU1RSSU5HLDEwLHYxMCk7CisJaWYgKGluLT50bHNleHRfaG9zdG5hbWUpCisgICAgICAgIAlNX0FTTjFfSTJEX2xlbl9FWFBfb3B0KCYoYS50bHNleHRfaG9zdG5hbWUpLCBpMmRfQVNOMV9PQ1RFVF9TVFJJTkcsNix2Nik7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCWlmIChpbi0+Y29tcHJlc3NfbWV0aCkKKyAgICAgICAgCU1fQVNOMV9JMkRfbGVuX0VYUF9vcHQoJihhLmNvbXBfaWQpLCBpMmRfQVNOMV9PQ1RFVF9TVFJJTkcsMTEsdjExKTsKKyNlbmRpZgorI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJaWYgKGluLT5wc2tfaWRlbnRpdHlfaGludCkKKyAgICAgICAgCU1fQVNOMV9JMkRfbGVuX0VYUF9vcHQoJihhLnBza19pZGVudGl0eV9oaW50KSwgaTJkX0FTTjFfT0NURVRfU1RSSU5HLDcsdjcpOworCWlmIChpbi0+cHNrX2lkZW50aXR5KQorICAgICAgICAJTV9BU04xX0kyRF9sZW5fRVhQX29wdCgmKGEucHNrX2lkZW50aXR5KSwgaTJkX0FTTjFfT0NURVRfU1RSSU5HLDgsdjgpOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fUFNLICovCisKKwlNX0FTTjFfSTJEX3NlcV90b3RhbCgpOworCisJTV9BU04xX0kyRF9wdXQoJihhLnZlcnNpb24pLAkJaTJkX0FTTjFfSU5URUdFUik7CisJTV9BU04xX0kyRF9wdXQoJihhLnNzbF92ZXJzaW9uKSwJaTJkX0FTTjFfSU5URUdFUik7CisJTV9BU04xX0kyRF9wdXQoJihhLmNpcGhlciksCQlpMmRfQVNOMV9PQ1RFVF9TVFJJTkcpOworCU1fQVNOMV9JMkRfcHV0KCYoYS5zZXNzaW9uX2lkKSwJCWkyZF9BU04xX09DVEVUX1NUUklORyk7CisJTV9BU04xX0kyRF9wdXQoJihhLm1hc3Rlcl9rZXkpLAkJaTJkX0FTTjFfT0NURVRfU1RSSU5HKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisJaWYgKGluLT5rcmI1X2NsaWVudF9wcmluY19sZW4pCisgICAgICAgIAlNX0FTTjFfSTJEX3B1dCgmKGEua3JiNV9wcmluYyksCWkyZF9BU04xX09DVEVUX1NUUklORyk7CisjZW5kaWYgLyogT1BFTlNTTF9OT19LUkI1ICovCisJaWYgKGluLT5rZXlfYXJnX2xlbmd0aCA+IDApCisJCU1fQVNOMV9JMkRfcHV0X0lNUF9vcHQoJihhLmtleV9hcmcpLGkyZF9BU04xX09DVEVUX1NUUklORywwKTsKKwlpZiAoaW4tPnRpbWUgIT0gMEwpCisJCU1fQVNOMV9JMkRfcHV0X0VYUF9vcHQoJihhLnRpbWUpLGkyZF9BU04xX0lOVEVHRVIsMSx2MSk7CisJaWYgKGluLT50aW1lb3V0ICE9IDBMKQorCQlNX0FTTjFfSTJEX3B1dF9FWFBfb3B0KCYoYS50aW1lb3V0KSxpMmRfQVNOMV9JTlRFR0VSLDIsdjIpOworCWlmIChpbi0+cGVlciAhPSBOVUxMKQorCQlNX0FTTjFfSTJEX3B1dF9FWFBfb3B0KGluLT5wZWVyLGkyZF9YNTA5LDMsdjMpOworCU1fQVNOMV9JMkRfcHV0X0VYUF9vcHQoJmEuc2Vzc2lvbl9pZF9jb250ZXh0LGkyZF9BU04xX09DVEVUX1NUUklORyw0LAorCQkJICAgICAgIHY0KTsKKwlpZiAoaW4tPnZlcmlmeV9yZXN1bHQgIT0gWDUwOV9WX09LKQorCQlNX0FTTjFfSTJEX3B1dF9FWFBfb3B0KCZhLnZlcmlmeV9yZXN1bHQsaTJkX0FTTjFfSU5URUdFUiw1LHY1KTsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpZiAoaW4tPnRsc2V4dF9ob3N0bmFtZSkKKyAgICAgICAgCU1fQVNOMV9JMkRfcHV0X0VYUF9vcHQoJihhLnRsc2V4dF9ob3N0bmFtZSksIGkyZF9BU04xX09DVEVUX1NUUklORyw2LHY2KTsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1RMU0VYVCAqLworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCWlmIChpbi0+cHNrX2lkZW50aXR5X2hpbnQpCisJCU1fQVNOMV9JMkRfcHV0X0VYUF9vcHQoJihhLnBza19pZGVudGl0eV9oaW50KSwgaTJkX0FTTjFfT0NURVRfU1RSSU5HLDcsdjcpOworCWlmIChpbi0+cHNrX2lkZW50aXR5KQorCQlNX0FTTjFfSTJEX3B1dF9FWFBfb3B0KCYoYS5wc2tfaWRlbnRpdHkpLCBpMmRfQVNOMV9PQ1RFVF9TVFJJTkcsOCx2OCk7CisjZW5kaWYgLyogT1BFTlNTTF9OT19QU0sgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpZiAoaW4tPnRsc2V4dF90aWNrX2xpZmV0aW1lX2hpbnQgPiAwKQorICAgICAgCSAJTV9BU04xX0kyRF9wdXRfRVhQX29wdCgmYS50bHNleHRfdGlja19saWZldGltZSwgaTJkX0FTTjFfSU5URUdFUiw5LHY5KTsKKwlpZiAoaW4tPnRsc2V4dF90aWNrKQorICAgICAgICAJTV9BU04xX0kyRF9wdXRfRVhQX29wdCgmKGEudGxzZXh0X3RpY2spLCBpMmRfQVNOMV9PQ1RFVF9TVFJJTkcsMTAsdjEwKTsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1RMU0VYVCAqLworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwlpZiAoaW4tPmNvbXByZXNzX21ldGgpCisgICAgICAgIAlNX0FTTjFfSTJEX3B1dF9FWFBfb3B0KCYoYS5jb21wX2lkKSwgaTJkX0FTTjFfT0NURVRfU1RSSU5HLDExLHYxMSk7CisjZW5kaWYKKwlNX0FTTjFfSTJEX2ZpbmlzaCgpOworCX0KKworU1NMX1NFU1NJT04gKmQyaV9TU0xfU0VTU0lPTihTU0xfU0VTU0lPTiAqKmEsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcCwKKwkJCSAgICAgbG9uZyBsZW5ndGgpCisJeworCWludCB2ZXJzaW9uLHNzbF92ZXJzaW9uPTAsaTsKKwlsb25nIGlkOworCUFTTjFfSU5URUdFUiBhaSwqYWlwOworCUFTTjFfT0NURVRfU1RSSU5HIG9zLCpvc3A7CisJTV9BU04xX0QySV92YXJzKGEsU1NMX1NFU1NJT04gKixTU0xfU0VTU0lPTl9uZXcpOworCisJYWlwPSAmYWk7CisJb3NwPSAmb3M7CisKKwlNX0FTTjFfRDJJX0luaXQoKTsKKwlNX0FTTjFfRDJJX3N0YXJ0X3NlcXVlbmNlKCk7CisKKwlhaS5kYXRhPU5VTEw7IGFpLmxlbmd0aD0wOworCU1fQVNOMV9EMklfZ2V0X3goQVNOMV9JTlRFR0VSLGFpcCxkMmlfQVNOMV9JTlRFR0VSKTsKKwl2ZXJzaW9uPShpbnQpQVNOMV9JTlRFR0VSX2dldChhaXApOworCWlmIChhaS5kYXRhICE9IE5VTEwpIHsgT1BFTlNTTF9mcmVlKGFpLmRhdGEpOyBhaS5kYXRhPU5VTEw7IGFpLmxlbmd0aD0wOyB9CisKKwkvKiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSB2ZXJzaW9uIHJpZ2h0IG5vdyA6LSkgKi8KKwlNX0FTTjFfRDJJX2dldF94KEFTTjFfSU5URUdFUixhaXAsZDJpX0FTTjFfSU5URUdFUik7CisJc3NsX3ZlcnNpb249KGludClBU04xX0lOVEVHRVJfZ2V0KGFpcCk7CisJcmV0LT5zc2xfdmVyc2lvbj1zc2xfdmVyc2lvbjsKKwlpZiAoYWkuZGF0YSAhPSBOVUxMKSB7IE9QRU5TU0xfZnJlZShhaS5kYXRhKTsgYWkuZGF0YT1OVUxMOyBhaS5sZW5ndGg9MDsgfQorCisJb3MuZGF0YT1OVUxMOyBvcy5sZW5ndGg9MDsKKwlNX0FTTjFfRDJJX2dldF94KEFTTjFfT0NURVRfU1RSSU5HLG9zcCxkMmlfQVNOMV9PQ1RFVF9TVFJJTkcpOworCWlmIChzc2xfdmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pCisJCXsKKwkJaWYgKG9zLmxlbmd0aCAhPSAzKQorCQkJeworCQkJYy5lcnJvcj1TU0xfUl9DSVBIRVJfQ09ERV9XUk9OR19MRU5HVEg7CisJCQlnb3RvIGVycjsKKwkJCX0KKwkJaWQ9MHgwMjAwMDAwMEx8CisJCQkoKHVuc2lnbmVkIGxvbmcpb3MuZGF0YVswXTw8MTZMKXwKKwkJCSgodW5zaWduZWQgbG9uZylvcy5kYXRhWzFdPDwgOEwpfAorCQkJICh1bnNpZ25lZCBsb25nKW9zLmRhdGFbMl07CisJCX0KKwllbHNlIGlmICgoc3NsX3ZlcnNpb24+PjgpID49IFNTTDNfVkVSU0lPTl9NQUpPUikKKwkJeworCQlpZiAob3MubGVuZ3RoICE9IDIpCisJCQl7CisJCQljLmVycm9yPVNTTF9SX0NJUEhFUl9DT0RFX1dST05HX0xFTkdUSDsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlpZD0weDAzMDAwMDAwTHwKKwkJCSgodW5zaWduZWQgbG9uZylvcy5kYXRhWzBdPDw4TCl8CisJCQkgKHVuc2lnbmVkIGxvbmcpb3MuZGF0YVsxXTsKKwkJfQorCWVsc2UKKwkJeworCQljLmVycm9yPVNTTF9SX1VOS05PV05fU1NMX1ZFUlNJT047CisJCWdvdG8gZXJyOworCQl9CisJCisJcmV0LT5jaXBoZXI9TlVMTDsKKwlyZXQtPmNpcGhlcl9pZD1pZDsKKworCU1fQVNOMV9EMklfZ2V0X3goQVNOMV9PQ1RFVF9TVFJJTkcsb3NwLGQyaV9BU04xX09DVEVUX1NUUklORyk7CisJaWYgKChzc2xfdmVyc2lvbj4+OCkgPj0gU1NMM19WRVJTSU9OX01BSk9SKQorCQlpPVNTTDNfTUFYX1NTTF9TRVNTSU9OX0lEX0xFTkdUSDsKKwllbHNlIC8qIGlmIChzc2xfdmVyc2lvbj4+OCA9PSBTU0wyX1ZFUlNJT05fTUFKT1IpICovCisJCWk9U1NMMl9NQVhfU1NMX1NFU1NJT05fSURfTEVOR1RIOworCisJaWYgKG9zLmxlbmd0aCA+IGkpCisJCW9zLmxlbmd0aCA9IGk7CisJaWYgKG9zLmxlbmd0aCA+IChpbnQpc2l6ZW9mKHJldC0+c2Vzc2lvbl9pZCkpIC8qIGNhbid0IGhhcHBlbiAqLworCQlvcy5sZW5ndGggPSBzaXplb2YocmV0LT5zZXNzaW9uX2lkKTsKKworCXJldC0+c2Vzc2lvbl9pZF9sZW5ndGg9b3MubGVuZ3RoOworCU9QRU5TU0xfYXNzZXJ0KG9zLmxlbmd0aCA8PSAoaW50KXNpemVvZihyZXQtPnNlc3Npb25faWQpKTsKKwltZW1jcHkocmV0LT5zZXNzaW9uX2lkLG9zLmRhdGEsb3MubGVuZ3RoKTsKKworCU1fQVNOMV9EMklfZ2V0X3goQVNOMV9PQ1RFVF9TVFJJTkcsb3NwLGQyaV9BU04xX09DVEVUX1NUUklORyk7CisJaWYgKG9zLmxlbmd0aCA+IFNTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEgpCisJCXJldC0+bWFzdGVyX2tleV9sZW5ndGg9U1NMX01BWF9NQVNURVJfS0VZX0xFTkdUSDsKKwllbHNlCisJCXJldC0+bWFzdGVyX2tleV9sZW5ndGg9b3MubGVuZ3RoOworCW1lbWNweShyZXQtPm1hc3Rlcl9rZXksb3MuZGF0YSxyZXQtPm1hc3Rlcl9rZXlfbGVuZ3RoKTsKKworCW9zLmxlbmd0aD0wOworCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCW9zLmxlbmd0aD0wOworCU1fQVNOMV9EMklfZ2V0X29wdChvc3AsZDJpX0FTTjFfT0NURVRfU1RSSU5HLFZfQVNOMV9PQ1RFVF9TVFJJTkcpOworCWlmIChvcy5kYXRhKQorCQl7CisgICAgICAgIAlpZiAob3MubGVuZ3RoID4gU1NMX01BWF9LUkI1X1BSSU5DSVBBTF9MRU5HVEgpCisgICAgICAgICAgICAJCXJldC0+a3JiNV9jbGllbnRfcHJpbmNfbGVuPTA7CisJCWVsc2UKKwkJCXJldC0+a3JiNV9jbGllbnRfcHJpbmNfbGVuPW9zLmxlbmd0aDsKKwkJbWVtY3B5KHJldC0+a3JiNV9jbGllbnRfcHJpbmMsb3MuZGF0YSxyZXQtPmtyYjVfY2xpZW50X3ByaW5jX2xlbik7CisJCU9QRU5TU0xfZnJlZShvcy5kYXRhKTsKKwkJb3MuZGF0YSA9IE5VTEw7CisJCW9zLmxlbmd0aCA9IDA7CisJCX0KKwllbHNlCisJCXJldC0+a3JiNV9jbGllbnRfcHJpbmNfbGVuPTA7CisjZW5kaWYgLyogT1BFTlNTTF9OT19LUkI1ICovCisKKwlNX0FTTjFfRDJJX2dldF9JTVBfb3B0KG9zcCxkMmlfQVNOMV9PQ1RFVF9TVFJJTkcsMCxWX0FTTjFfT0NURVRfU1RSSU5HKTsKKwlpZiAob3MubGVuZ3RoID4gU1NMX01BWF9LRVlfQVJHX0xFTkdUSCkKKwkJcmV0LT5rZXlfYXJnX2xlbmd0aD1TU0xfTUFYX0tFWV9BUkdfTEVOR1RIOworCWVsc2UKKwkJcmV0LT5rZXlfYXJnX2xlbmd0aD1vcy5sZW5ndGg7CisJbWVtY3B5KHJldC0+a2V5X2FyZyxvcy5kYXRhLHJldC0+a2V5X2FyZ19sZW5ndGgpOworCWlmIChvcy5kYXRhICE9IE5VTEwpIE9QRU5TU0xfZnJlZShvcy5kYXRhKTsKKworCWFpLmxlbmd0aD0wOworCU1fQVNOMV9EMklfZ2V0X0VYUF9vcHQoYWlwLGQyaV9BU04xX0lOVEVHRVIsMSk7CisJaWYgKGFpLmRhdGEgIT0gTlVMTCkKKwkJeworCQlyZXQtPnRpbWU9QVNOMV9JTlRFR0VSX2dldChhaXApOworCQlPUEVOU1NMX2ZyZWUoYWkuZGF0YSk7IGFpLmRhdGE9TlVMTDsgYWkubGVuZ3RoPTA7CisJCX0KKwllbHNlCisJCXJldC0+dGltZT0odW5zaWduZWQgbG9uZyl0aW1lKE5VTEwpOworCisJYWkubGVuZ3RoPTA7CisJTV9BU04xX0QySV9nZXRfRVhQX29wdChhaXAsZDJpX0FTTjFfSU5URUdFUiwyKTsKKwlpZiAoYWkuZGF0YSAhPSBOVUxMKQorCQl7CisJCXJldC0+dGltZW91dD1BU04xX0lOVEVHRVJfZ2V0KGFpcCk7CisJCU9QRU5TU0xfZnJlZShhaS5kYXRhKTsgYWkuZGF0YT1OVUxMOyBhaS5sZW5ndGg9MDsKKwkJfQorCWVsc2UKKwkJcmV0LT50aW1lb3V0PTM7CisKKwlpZiAocmV0LT5wZWVyICE9IE5VTEwpCisJCXsKKwkJWDUwOV9mcmVlKHJldC0+cGVlcik7CisJCXJldC0+cGVlcj1OVUxMOworCQl9CisJTV9BU04xX0QySV9nZXRfRVhQX29wdChyZXQtPnBlZXIsZDJpX1g1MDksMyk7CisKKwlvcy5sZW5ndGg9MDsKKwlvcy5kYXRhPU5VTEw7CisJTV9BU04xX0QySV9nZXRfRVhQX29wdChvc3AsZDJpX0FTTjFfT0NURVRfU1RSSU5HLDQpOworCisJaWYob3MuZGF0YSAhPSBOVUxMKQorCSAgICB7CisJICAgIGlmIChvcy5sZW5ndGggPiBTU0xfTUFYX1NJRF9DVFhfTEVOR1RIKQorCQl7CisJCWMuZXJyb3I9U1NMX1JfQkFEX0xFTkdUSDsKKwkJZ290byBlcnI7CisJCX0KKwkgICAgZWxzZQorCQl7CisJCXJldC0+c2lkX2N0eF9sZW5ndGg9b3MubGVuZ3RoOworCQltZW1jcHkocmV0LT5zaWRfY3R4LG9zLmRhdGEsb3MubGVuZ3RoKTsKKwkJfQorCSAgICBPUEVOU1NMX2ZyZWUob3MuZGF0YSk7IG9zLmRhdGE9TlVMTDsgb3MubGVuZ3RoPTA7CisJICAgIH0KKwllbHNlCisJICAgIHJldC0+c2lkX2N0eF9sZW5ndGg9MDsKKworCWFpLmxlbmd0aD0wOworCU1fQVNOMV9EMklfZ2V0X0VYUF9vcHQoYWlwLGQyaV9BU04xX0lOVEVHRVIsNSk7CisJaWYgKGFpLmRhdGEgIT0gTlVMTCkKKwkJeworCQlyZXQtPnZlcmlmeV9yZXN1bHQ9QVNOMV9JTlRFR0VSX2dldChhaXApOworCQlPUEVOU1NMX2ZyZWUoYWkuZGF0YSk7IGFpLmRhdGE9TlVMTDsgYWkubGVuZ3RoPTA7CisJCX0KKwllbHNlCisJCXJldC0+dmVyaWZ5X3Jlc3VsdD1YNTA5X1ZfT0s7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlvcy5sZW5ndGg9MDsKKwlvcy5kYXRhPU5VTEw7CisJTV9BU04xX0QySV9nZXRfRVhQX29wdChvc3AsZDJpX0FTTjFfT0NURVRfU1RSSU5HLDYpOworCWlmIChvcy5kYXRhKQorCQl7CisJCXJldC0+dGxzZXh0X2hvc3RuYW1lID0gQlVGX3N0cm5kdXAoKGNoYXIgKilvcy5kYXRhLCBvcy5sZW5ndGgpOworCQlPUEVOU1NMX2ZyZWUob3MuZGF0YSk7CisJCW9zLmRhdGEgPSBOVUxMOworCQlvcy5sZW5ndGggPSAwOworCQl9CisJZWxzZQorCQlyZXQtPnRsc2V4dF9ob3N0bmFtZT1OVUxMOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwlvcy5sZW5ndGg9MDsKKwlvcy5kYXRhPU5VTEw7CisJTV9BU04xX0QySV9nZXRfRVhQX29wdChvc3AsZDJpX0FTTjFfT0NURVRfU1RSSU5HLDcpOworCWlmIChvcy5kYXRhKQorCQl7CisJCXJldC0+cHNrX2lkZW50aXR5X2hpbnQgPSBCVUZfc3RybmR1cCgoY2hhciAqKW9zLmRhdGEsIG9zLmxlbmd0aCk7CisJCU9QRU5TU0xfZnJlZShvcy5kYXRhKTsKKwkJb3MuZGF0YSA9IE5VTEw7CisJCW9zLmxlbmd0aCA9IDA7CisJCX0KKwllbHNlCisJCXJldC0+cHNrX2lkZW50aXR5X2hpbnQ9TlVMTDsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1BTSyAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJYWkubGVuZ3RoPTA7CisJTV9BU04xX0QySV9nZXRfRVhQX29wdChhaXAsZDJpX0FTTjFfSU5URUdFUiw5KTsKKwlpZiAoYWkuZGF0YSAhPSBOVUxMKQorCQl7CisJCXJldC0+dGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludD1BU04xX0lOVEVHRVJfZ2V0KGFpcCk7CisJCU9QRU5TU0xfZnJlZShhaS5kYXRhKTsgYWkuZGF0YT1OVUxMOyBhaS5sZW5ndGg9MDsKKwkJfQorCWVsc2UgaWYgKHJldC0+dGxzZXh0X3RpY2tsZW4gJiYgcmV0LT5zZXNzaW9uX2lkX2xlbmd0aCkKKwkJcmV0LT50bHNleHRfdGlja19saWZldGltZV9oaW50ID0gLTE7CisJZWxzZQorCQlyZXQtPnRsc2V4dF90aWNrX2xpZmV0aW1lX2hpbnQ9MDsKKwlvcy5sZW5ndGg9MDsKKwlvcy5kYXRhPU5VTEw7CisJTV9BU04xX0QySV9nZXRfRVhQX29wdChvc3AsZDJpX0FTTjFfT0NURVRfU1RSSU5HLDEwKTsKKwlpZiAob3MuZGF0YSkKKwkJeworCQlyZXQtPnRsc2V4dF90aWNrID0gb3MuZGF0YTsKKwkJcmV0LT50bHNleHRfdGlja2xlbiA9IG9zLmxlbmd0aDsKKwkJb3MuZGF0YSA9IE5VTEw7CisJCW9zLmxlbmd0aCA9IDA7CisJCX0KKwllbHNlCisJCXJldC0+dGxzZXh0X3RpY2s9TlVMTDsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX1RMU0VYVCAqLworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwlvcy5sZW5ndGg9MDsKKwlvcy5kYXRhPU5VTEw7CisJTV9BU04xX0QySV9nZXRfRVhQX29wdChvc3AsZDJpX0FTTjFfT0NURVRfU1RSSU5HLDExKTsKKwlpZiAob3MuZGF0YSkKKwkJeworCQlyZXQtPmNvbXByZXNzX21ldGggPSBvcy5kYXRhWzBdOworCQlPUEVOU1NMX2ZyZWUob3MuZGF0YSk7CisJCW9zLmRhdGEgPSBOVUxMOworCQl9CisjZW5kaWYKKworCU1fQVNOMV9EMklfRmluaXNoKGEsU1NMX1NFU1NJT05fZnJlZSxTU0xfRl9EMklfU1NMX1NFU1NJT04pOworCX0KZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zc2xfY2VydC5jIGIvbGliL29wZW5zc2wvc3NsL3NzbF9jZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyNTZlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zc2xfY2VydC5jCkBAIC0wLDAgKzEsODM0IEBACisvKiEgXGZpbGUgc3NsL3NzbF9jZXJ0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIEVDQyBjaXBoZXIgc3VpdGUgc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJlX29zLmgiCisjaWZuZGVmIE5PX1NZU19UWVBFU19ICisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJvX2Rpci5oIgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9wZW0uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisKK2ludCBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KHZvaWQpCisJeworCXN0YXRpYyB2b2xhdGlsZSBpbnQgc3NsX3g1MDlfc3RvcmVfY3R4X2lkeD0gLTE7CisJaW50IGdvdF93cml0ZV9sb2NrID0gMDsKKworCUNSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisKKwlpZiAoc3NsX3g1MDlfc3RvcmVfY3R4X2lkeCA8IDApCisJCXsKKwkJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX1NTTF9DVFgpOworCQlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1NTTF9DVFgpOworCQlnb3Rfd3JpdGVfbG9jayA9IDE7CisJCQorCQlpZiAoc3NsX3g1MDlfc3RvcmVfY3R4X2lkeCA8IDApCisJCQl7CisJCQlzc2xfeDUwOV9zdG9yZV9jdHhfaWR4PVg1MDlfU1RPUkVfQ1RYX2dldF9leF9uZXdfaW5kZXgoCisJCQkJMCwiU1NMIGZvciB2ZXJpZnkgY2FsbGJhY2siLE5VTEwsTlVMTCxOVUxMKTsKKwkJCX0KKwkJfQorCisJaWYgKGdvdF93cml0ZV9sb2NrKQorCQlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJZWxzZQorCQlDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJCisJcmV0dXJuIHNzbF94NTA5X3N0b3JlX2N0eF9pZHg7CisJfQorCitDRVJUICpzc2xfY2VydF9uZXcodm9pZCkKKwl7CisJQ0VSVCAqcmV0OworCisJcmV0PShDRVJUICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENFUlQpKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DRVJUX05FVyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCW1lbXNldChyZXQsMCxzaXplb2YoQ0VSVCkpOworCisJcmV0LT5rZXk9ICYocmV0LT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXSk7CisJcmV0LT5yZWZlcmVuY2VzPTE7CisKKwlyZXR1cm4ocmV0KTsKKwl9CisKK0NFUlQgKnNzbF9jZXJ0X2R1cChDRVJUICpjZXJ0KQorCXsKKwlDRVJUICpyZXQ7CisJaW50IGk7CisKKwlyZXQgPSAoQ0VSVCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihDRVJUKSk7CisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ0VSVF9EVVAsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisKKwltZW1zZXQocmV0LCAwLCBzaXplb2YoQ0VSVCkpOworCisJcmV0LT5rZXkgPSAmcmV0LT5wa2V5c1tjZXJ0LT5rZXkgLSAmY2VydC0+cGtleXNbMF1dOworCS8qIG9yIHJldC0+a2V5ID0gcmV0LT5wa2V5cyArIChjZXJ0LT5rZXkgLSBjZXJ0LT5wa2V5cyksCisJICogaWYgeW91IGZpbmQgdGhhdCBtb3JlIHJlYWRhYmxlICovCisKKwlyZXQtPnZhbGlkID0gY2VydC0+dmFsaWQ7CisJcmV0LT5tYXNrX2sgPSBjZXJ0LT5tYXNrX2s7CisJcmV0LT5tYXNrX2EgPSBjZXJ0LT5tYXNrX2E7CisJcmV0LT5leHBvcnRfbWFza19rID0gY2VydC0+ZXhwb3J0X21hc2tfazsKKwlyZXQtPmV4cG9ydF9tYXNrX2EgPSBjZXJ0LT5leHBvcnRfbWFza19hOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJaWYgKGNlcnQtPnJzYV90bXAgIT0gTlVMTCkKKwkJeworCQlSU0FfdXBfcmVmKGNlcnQtPnJzYV90bXApOworCQlyZXQtPnJzYV90bXAgPSBjZXJ0LT5yc2FfdG1wOworCQl9CisJcmV0LT5yc2FfdG1wX2NiID0gY2VydC0+cnNhX3RtcF9jYjsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwlpZiAoY2VydC0+ZGhfdG1wICE9IE5VTEwpCisJCXsKKwkJcmV0LT5kaF90bXAgPSBESHBhcmFtc19kdXAoY2VydC0+ZGhfdG1wKTsKKwkJaWYgKHJldC0+ZGhfdG1wID09IE5VTEwpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMX0NFUlRfRFVQLCBFUlJfUl9ESF9MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCWlmIChjZXJ0LT5kaF90bXAtPnByaXZfa2V5KQorCQkJeworCQkJQklHTlVNICpiID0gQk5fZHVwKGNlcnQtPmRoX3RtcC0+cHJpdl9rZXkpOworCQkJaWYgKCFiKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMX0NFUlRfRFVQLCBFUlJfUl9CTl9MSUIpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXJldC0+ZGhfdG1wLT5wcml2X2tleSA9IGI7CisJCQl9CisJCWlmIChjZXJ0LT5kaF90bXAtPnB1Yl9rZXkpCisJCQl7CisJCQlCSUdOVU0gKmIgPSBCTl9kdXAoY2VydC0+ZGhfdG1wLT5wdWJfa2V5KTsKKwkJCWlmICghYikKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTF9DRVJUX0RVUCwgRVJSX1JfQk5fTElCKTsKKwkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQlyZXQtPmRoX3RtcC0+cHViX2tleSA9IGI7CisJCQl9CisJCX0KKwlyZXQtPmRoX3RtcF9jYiA9IGNlcnQtPmRoX3RtcF9jYjsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWlmIChjZXJ0LT5lY2RoX3RtcCkKKwkJeworCQlyZXQtPmVjZGhfdG1wID0gRUNfS0VZX2R1cChjZXJ0LT5lY2RoX3RtcCk7CisJCWlmIChyZXQtPmVjZGhfdG1wID09IE5VTEwpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMX0NFUlRfRFVQLCBFUlJfUl9FQ19MSUIpOworCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwlyZXQtPmVjZGhfdG1wX2NiID0gY2VydC0+ZWNkaF90bXBfY2I7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBTU0xfUEtFWV9OVU07IGkrKykKKwkJeworCQlpZiAoY2VydC0+cGtleXNbaV0ueDUwOSAhPSBOVUxMKQorCQkJeworCQkJcmV0LT5wa2V5c1tpXS54NTA5ID0gY2VydC0+cGtleXNbaV0ueDUwOTsKKwkJCUNSWVBUT19hZGQoJnJldC0+cGtleXNbaV0ueDUwOS0+cmVmZXJlbmNlcywgMSwKKwkJCQlDUllQVE9fTE9DS19YNTA5KTsKKwkJCX0KKwkJCisJCWlmIChjZXJ0LT5wa2V5c1tpXS5wcml2YXRla2V5ICE9IE5VTEwpCisJCQl7CisJCQlyZXQtPnBrZXlzW2ldLnByaXZhdGVrZXkgPSBjZXJ0LT5wa2V5c1tpXS5wcml2YXRla2V5OworCQkJQ1JZUFRPX2FkZCgmcmV0LT5wa2V5c1tpXS5wcml2YXRla2V5LT5yZWZlcmVuY2VzLCAxLAorCQkJCUNSWVBUT19MT0NLX0VWUF9QS0VZKTsKKworCQkJc3dpdGNoKGkpIAorCQkJCXsKKwkJCQkvKiBJZiB0aGVyZSB3YXMgYW55dGhpbmcgc3BlY2lhbCB0byBkbyBmb3IKKwkJCQkgKiBjZXJ0YWluIHR5cGVzIG9mIGtleXMsIHdlJ2QgZG8gaXQgaGVyZS4KKwkJCQkgKiAoTm90aGluZyBhdCB0aGUgbW9tZW50LCBJIHRoaW5rLikgKi8KKworCQkJY2FzZSBTU0xfUEtFWV9SU0FfRU5DOgorCQkJY2FzZSBTU0xfUEtFWV9SU0FfU0lHTjoKKwkJCQkvKiBXZSBoYXZlIGFuIFJTQSBrZXkuICovCisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFNTTF9QS0VZX0RTQV9TSUdOOgorCQkJCS8qIFdlIGhhdmUgYSBEU0Ega2V5LiAqLworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTU0xfUEtFWV9ESF9SU0E6CisJCQljYXNlIFNTTF9QS0VZX0RIX0RTQToKKwkJCQkvKiBXZSBoYXZlIGEgREgga2V5LiAqLworCQkJCWJyZWFrOworCisJCQljYXNlIFNTTF9QS0VZX0VDQzoKKwkJCQkvKiBXZSBoYXZlIGFuIEVDQyBrZXkgKi8KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKiBDYW4ndCBoYXBwZW4uICovCisJCQkJU1NMZXJyKFNTTF9GX1NTTF9DRVJUX0RVUCwgU1NMX1JfTElCUkFSWV9CVUcpOworCQkJCX0KKwkJCX0KKwkJfQorCQorCS8qIHJldC0+ZXh0cmFfY2VydHMgKnNob3VsZCogZXhpc3QsIGJ1dCBjdXJyZW50bHkgdGhlIG93biBjZXJ0aWZpY2F0ZQorCSAqIGNoYWluIGlzIGhlbGQgaW5zaWRlIFNTTF9DVFggKi8KKworCXJldC0+cmVmZXJlbmNlcz0xOworCisJcmV0dXJuKHJldCk7CisJCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19ESCkgfHwgIWRlZmluZWQoT1BFTlNTTF9OT19FQ0RIKQorZXJyOgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJaWYgKHJldC0+cnNhX3RtcCAhPSBOVUxMKQorCQlSU0FfZnJlZShyZXQtPnJzYV90bXApOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwlpZiAocmV0LT5kaF90bXAgIT0gTlVMTCkKKwkJREhfZnJlZShyZXQtPmRoX3RtcCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJaWYgKHJldC0+ZWNkaF90bXAgIT0gTlVMTCkKKwkJRUNfS0VZX2ZyZWUocmV0LT5lY2RoX3RtcCk7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBTU0xfUEtFWV9OVU07IGkrKykKKwkJeworCQlpZiAocmV0LT5wa2V5c1tpXS54NTA5ICE9IE5VTEwpCisJCQlYNTA5X2ZyZWUocmV0LT5wa2V5c1tpXS54NTA5KTsKKwkJaWYgKHJldC0+cGtleXNbaV0ucHJpdmF0ZWtleSAhPSBOVUxMKQorCQkJRVZQX1BLRVlfZnJlZShyZXQtPnBrZXlzW2ldLnByaXZhdGVrZXkpOworCQl9CisKKwlyZXR1cm4gTlVMTDsKKwl9CisKKwordm9pZCBzc2xfY2VydF9mcmVlKENFUlQgKmMpCisJeworCWludCBpOworCisJaWYoYyA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJmMtPnJlZmVyZW5jZXMsLTEsQ1JZUFRPX0xPQ0tfU1NMX0NFUlQpOworI2lmZGVmIFJFRl9QUklOVAorCVJFRl9QUklOVCgiQ0VSVCIsYyk7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsInNzbF9jZXJ0X2ZyZWUsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQlhYm9ydCgpOyAvKiBvayAqLworCQl9CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCWlmIChjLT5yc2FfdG1wKSBSU0FfZnJlZShjLT5yc2FfdG1wKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJaWYgKGMtPmRoX3RtcCkgREhfZnJlZShjLT5kaF90bXApOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWlmIChjLT5lY2RoX3RtcCkgRUNfS0VZX2ZyZWUoYy0+ZWNkaF90bXApOworI2VuZGlmCisKKwlmb3IgKGk9MDsgaTxTU0xfUEtFWV9OVU07IGkrKykKKwkJeworCQlpZiAoYy0+cGtleXNbaV0ueDUwOSAhPSBOVUxMKQorCQkJWDUwOV9mcmVlKGMtPnBrZXlzW2ldLng1MDkpOworCQlpZiAoYy0+cGtleXNbaV0ucHJpdmF0ZWtleSAhPSBOVUxMKQorCQkJRVZQX1BLRVlfZnJlZShjLT5wa2V5c1tpXS5wcml2YXRla2V5KTsKKyNpZiAwCisJCWlmIChjLT5wa2V5c1tpXS5wdWJsaWNrZXkgIT0gTlVMTCkKKwkJCUVWUF9QS0VZX2ZyZWUoYy0+cGtleXNbaV0ucHVibGlja2V5KTsKKyNlbmRpZgorCQl9CisJT1BFTlNTTF9mcmVlKGMpOworCX0KKworaW50IHNzbF9jZXJ0X2luc3QoQ0VSVCAqKm8pCisJeworCS8qIENyZWF0ZSBhIENFUlQgaWYgdGhlcmUgaXNuJ3QgYWxyZWFkeSBvbmUKKwkgKiAod2hpY2ggY2Fubm90IHJlYWxseSBoYXBwZW4sIGFzIGl0IGlzIGluaXRpYWxseSBjcmVhdGVkIGluCisJICogU1NMX0NUWF9uZXc7IGJ1dCB0aGUgZWFybGllciBjb2RlIHVzdWFsbHkgYWxsb3dzIGZvciB0aGF0IG9uZQorCSAqIGJlaW5nIG5vbi1leGlzdGFudCwgc28gd2UgZm9sbG93IHRoYXQgYmVoYXZpb3VyLCBhcyBpdCBtaWdodAorCSAqIHR1cm4gb3V0IHRoYXQgdGhlcmUgYWN0dWFsbHkgaXMgYSByZWFzb24gZm9yIGl0IC0tIGJ1dCBJJ20KKwkgKiBub3Qgc3VyZSB0aGF0ICphbGwqIG9mIHRoZSBleGlzdGluZyBjb2RlIGNvdWxkIGNvcGUgd2l0aAorCSAqIHMtPmNlcnQgYmVpbmcgTlVMTCwgb3RoZXJ3aXNlIHdlIGNvdWxkIGRvIHdpdGhvdXQgdGhlCisJICogaW5pdGlhbGl6YXRpb24gaW4gU1NMX0NUWF9uZXcpLgorCSAqLworCQorCWlmIChvID09IE5VTEwpIAorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ0VSVF9JTlNULCBFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoKm8gPT0gTlVMTCkKKwkJeworCQlpZiAoKCpvID0gc3NsX2NlcnRfbmV3KCkpID09IE5VTEwpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMX0NFUlRfSU5TVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuKDApOworCQkJfQorCQl9CisJcmV0dXJuKDEpOworCX0KKworCitTRVNTX0NFUlQgKnNzbF9zZXNzX2NlcnRfbmV3KHZvaWQpCisJeworCVNFU1NfQ0VSVCAqcmV0OworCisJcmV0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mICpyZXQpOworCWlmIChyZXQgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1NFU1NfQ0VSVF9ORVcsIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuIE5VTEw7CisJCX0KKworCW1lbXNldChyZXQsIDAgLHNpemVvZiAqcmV0KTsKKwlyZXQtPnBlZXJfa2V5ID0gJihyZXQtPnBlZXJfcGtleXNbU1NMX1BLRVlfUlNBX0VOQ10pOworCXJldC0+cmVmZXJlbmNlcyA9IDE7CisKKwlyZXR1cm4gcmV0OworCX0KKwordm9pZCBzc2xfc2Vzc19jZXJ0X2ZyZWUoU0VTU19DRVJUICpzYykKKwl7CisJaW50IGk7CisKKwlpZiAoc2MgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaSA9IENSWVBUT19hZGQoJnNjLT5yZWZlcmVuY2VzLCAtMSwgQ1JZUFRPX0xPQ0tfU1NMX1NFU1NfQ0VSVCk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJTRVNTX0NFUlQiLCBzYyk7CisjZW5kaWYKKwlpZiAoaSA+IDApCisJCXJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsInNzbF9zZXNzX2NlcnRfZnJlZSwgYmFkIHJlZmVyZW5jZSBjb3VudFxuIik7CisJCWFib3J0KCk7IC8qIG9rICovCisJCX0KKyNlbmRpZgorCisJLyogaSA9PSAwICovCisJaWYgKHNjLT5jZXJ0X2NoYWluICE9IE5VTEwpCisJCXNrX1g1MDlfcG9wX2ZyZWUoc2MtPmNlcnRfY2hhaW4sIFg1MDlfZnJlZSk7CisJZm9yIChpID0gMDsgaSA8IFNTTF9QS0VZX05VTTsgaSsrKQorCQl7CisJCWlmIChzYy0+cGVlcl9wa2V5c1tpXS54NTA5ICE9IE5VTEwpCisJCQlYNTA5X2ZyZWUoc2MtPnBlZXJfcGtleXNbaV0ueDUwOSk7CisjaWYgMCAvKiBXZSBkb24ndCBoYXZlIHRoZSBwZWVyJ3MgcHJpdmF0ZSBrZXkuICBUaGVzZSBsaW5lcyBhcmUganVzdAorCSAgICogaGVyZSBhcyBhIHJlbWluZGVyIHRoYXQgd2UncmUgc3RpbGwgdXNpbmcgYSBub3QtcXVpdGUtYXBwcm9wcmlhdGUKKwkgICAqIGRhdGEgc3RydWN0dXJlLiAqLworCQlpZiAoc2MtPnBlZXJfcGtleXNbaV0ucHJpdmF0ZWtleSAhPSBOVUxMKQorCQkJRVZQX1BLRVlfZnJlZShzYy0+cGVlcl9wa2V5c1tpXS5wcml2YXRla2V5KTsKKyNlbmRpZgorCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwlpZiAoc2MtPnBlZXJfcnNhX3RtcCAhPSBOVUxMKQorCQlSU0FfZnJlZShzYy0+cGVlcl9yc2FfdG1wKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJaWYgKHNjLT5wZWVyX2RoX3RtcCAhPSBOVUxMKQorCQlESF9mcmVlKHNjLT5wZWVyX2RoX3RtcCk7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJaWYgKHNjLT5wZWVyX2VjZGhfdG1wICE9IE5VTEwpCisJCUVDX0tFWV9mcmVlKHNjLT5wZWVyX2VjZGhfdG1wKTsKKyNlbmRpZgorCisJT1BFTlNTTF9mcmVlKHNjKTsKKwl9CisKK2ludCBzc2xfc2V0X3BlZXJfY2VydF90eXBlKFNFU1NfQ0VSVCAqc2MsaW50IHR5cGUpCisJeworCXNjLT5wZWVyX2NlcnRfdHlwZSA9IHR5cGU7CisJcmV0dXJuKDEpOworCX0KKworaW50IHNzbF92ZXJpZnlfY2VydF9jaGFpbihTU0wgKnMsU1RBQ0tfT0YoWDUwOSkgKnNrKQorCXsKKwlYNTA5ICp4OworCWludCBpOworCVg1MDlfU1RPUkVfQ1RYIGN0eDsKKworCWlmICgoc2sgPT0gTlVMTCkgfHwgKHNrX1g1MDlfbnVtKHNrKSA9PSAwKSkKKwkJcmV0dXJuKDApOworCisJeD1za19YNTA5X3ZhbHVlKHNrLDApOworCWlmKCFYNTA5X1NUT1JFX0NUWF9pbml0KCZjdHgscy0+Y3R4LT5jZXJ0X3N0b3JlLHgsc2spKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfVkVSSUZZX0NFUlRfQ0hBSU4sRVJSX1JfWDUwOV9MSUIpOworCQlyZXR1cm4oMCk7CisJCX0KKyNpZiAwCisJaWYgKFNTTF9nZXRfdmVyaWZ5X2RlcHRoKHMpID49IDApCisJCVg1MDlfU1RPUkVfQ1RYX3NldF9kZXB0aCgmY3R4LCBTU0xfZ2V0X3ZlcmlmeV9kZXB0aChzKSk7CisjZW5kaWYKKwlYNTA5X1NUT1JFX0NUWF9zZXRfZXhfZGF0YSgmY3R4LFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX0NUWF9pZHgoKSxzKTsKKworCS8qIFdlIG5lZWQgdG8gaW5oZXJpdCB0aGUgdmVyaWZ5IHBhcmFtZXRlcnMuIFRoZXNlIGNhbiBiZSBkZXRlcm1pbmVkIGJ5CisJICogdGhlIGNvbnRleHQ6IGlmIGl0cyBhIHNlcnZlciBpdCB3aWxsIHZlcmlmeSBTU0wgY2xpZW50IGNlcnRpZmljYXRlcworCSAqIG9yIHZpY2UgdmVyc2EuCisJICovCisKKwlYNTA5X1NUT1JFX0NUWF9zZXRfZGVmYXVsdCgmY3R4LAorCQkJCXMtPnNlcnZlciA/ICJzc2xfY2xpZW50IiA6ICJzc2xfc2VydmVyIik7CisJLyogQW55dGhpbmcgbm9uLWRlZmF1bHQgaW4gInBhcmFtIiBzaG91bGQgb3ZlcndyaXRlIGFueXRoaW5nIGluIHRoZQorCSAqIGN0eC4KKwkgKi8KKwlYNTA5X1ZFUklGWV9QQVJBTV9zZXQxKFg1MDlfU1RPUkVfQ1RYX2dldDBfcGFyYW0oJmN0eCksIHMtPnBhcmFtKTsKKworCWlmIChzLT52ZXJpZnlfY2FsbGJhY2spCisJCVg1MDlfU1RPUkVfQ1RYX3NldF92ZXJpZnlfY2IoJmN0eCwgcy0+dmVyaWZ5X2NhbGxiYWNrKTsKKworCWlmIChzLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2sgIT0gTlVMTCkKKyNpZiAxIC8qIG5ldyB3aXRoIE9wZW5TU0wgMC45LjcgKi8KKwkJaT1zLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2soJmN0eCwgcy0+Y3R4LT5hcHBfdmVyaWZ5X2FyZyk7IAorI2Vsc2UKKwkJaT1zLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2soJmN0eCk7IC8qIHNob3VsZCBwYXNzIGFwcF92ZXJpZnlfYXJnICovCisjZW5kaWYKKwllbHNlCisJCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19YNTA5X1ZFUklGWQorCQlpPVg1MDlfdmVyaWZ5X2NlcnQoJmN0eCk7CisjZWxzZQorCQlpPTA7CisJCWN0eC5lcnJvcj1YNTA5X1ZfRVJSX0FQUExJQ0FUSU9OX1ZFUklGSUNBVElPTjsKKwkJU1NMZXJyKFNTTF9GX1NTTF9WRVJJRllfQ0VSVF9DSEFJTixTU0xfUl9OT19WRVJJRllfQ0FMTEJBQ0spOworI2VuZGlmCisJCX0KKworCXMtPnZlcmlmeV9yZXN1bHQ9Y3R4LmVycm9yOworCVg1MDlfU1RPUkVfQ1RYX2NsZWFudXAoJmN0eCk7CisKKwlyZXR1cm4oaSk7CisJfQorCitzdGF0aWMgdm9pZCBzZXRfY2xpZW50X0NBX2xpc3QoU1RBQ0tfT0YoWDUwOV9OQU1FKSAqKmNhX2xpc3QsU1RBQ0tfT0YoWDUwOV9OQU1FKSAqbmFtZV9saXN0KQorCXsKKwlpZiAoKmNhX2xpc3QgIT0gTlVMTCkKKwkJc2tfWDUwOV9OQU1FX3BvcF9mcmVlKCpjYV9saXN0LFg1MDlfTkFNRV9mcmVlKTsKKworCSpjYV9saXN0PW5hbWVfbGlzdDsKKwl9CisKK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9kdXBfQ0FfbGlzdChTVEFDS19PRihYNTA5X05BTUUpICpzaykKKwl7CisJaW50IGk7CisJU1RBQ0tfT0YoWDUwOV9OQU1FKSAqcmV0OworCVg1MDlfTkFNRSAqbmFtZTsKKworCXJldD1za19YNTA5X05BTUVfbmV3X251bGwoKTsKKwlmb3IgKGk9MDsgaTxza19YNTA5X05BTUVfbnVtKHNrKTsgaSsrKQorCQl7CisJCW5hbWU9WDUwOV9OQU1FX2R1cChza19YNTA5X05BTUVfdmFsdWUoc2ssaSkpOworCQlpZiAoKG5hbWUgPT0gTlVMTCkgfHwgIXNrX1g1MDlfTkFNRV9wdXNoKHJldCxuYW1lKSkKKwkJCXsKKwkJCXNrX1g1MDlfTkFNRV9wb3BfZnJlZShyZXQsWDUwOV9OQU1FX2ZyZWUpOworCQkJcmV0dXJuKE5VTEwpOworCQkJfQorCQl9CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIFNTTF9zZXRfY2xpZW50X0NBX2xpc3QoU1NMICpzLFNUQUNLX09GKFg1MDlfTkFNRSkgKm5hbWVfbGlzdCkKKwl7CisJc2V0X2NsaWVudF9DQV9saXN0KCYocy0+Y2xpZW50X0NBKSxuYW1lX2xpc3QpOworCX0KKwordm9pZCBTU0xfQ1RYX3NldF9jbGllbnRfQ0FfbGlzdChTU0xfQ1RYICpjdHgsU1RBQ0tfT0YoWDUwOV9OQU1FKSAqbmFtZV9saXN0KQorCXsKKwlzZXRfY2xpZW50X0NBX2xpc3QoJihjdHgtPmNsaWVudF9DQSksbmFtZV9saXN0KTsKKwl9CisKK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9DVFhfZ2V0X2NsaWVudF9DQV9saXN0KGNvbnN0IFNTTF9DVFggKmN0eCkKKwl7CisJcmV0dXJuKGN0eC0+Y2xpZW50X0NBKTsKKwl9CisKK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9nZXRfY2xpZW50X0NBX2xpc3QoY29uc3QgU1NMICpzKQorCXsKKwlpZiAocy0+dHlwZSA9PSBTU0xfU1RfQ09OTkVDVCkKKwkJeyAvKiB3ZSBhcmUgaW4gdGhlIGNsaWVudCAqLworCQlpZiAoKChzLT52ZXJzaW9uPj44KSA9PSBTU0wzX1ZFUlNJT05fTUFKT1IpICYmCisJCQkocy0+czMgIT0gTlVMTCkpCisJCQlyZXR1cm4ocy0+czMtPnRtcC5jYV9uYW1lcyk7CisJCWVsc2UKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAocy0+Y2xpZW50X0NBICE9IE5VTEwpCisJCQlyZXR1cm4ocy0+Y2xpZW50X0NBKTsKKwkJZWxzZQorCQkJcmV0dXJuKHMtPmN0eC0+Y2xpZW50X0NBKTsKKwkJfQorCX0KKworc3RhdGljIGludCBhZGRfY2xpZW50X0NBKFNUQUNLX09GKFg1MDlfTkFNRSkgKipzayxYNTA5ICp4KQorCXsKKwlYNTA5X05BTUUgKm5hbWU7CisKKwlpZiAoeCA9PSBOVUxMKSByZXR1cm4oMCk7CisJaWYgKCgqc2sgPT0gTlVMTCkgJiYgKCgqc2s9c2tfWDUwOV9OQU1FX25ld19udWxsKCkpID09IE5VTEwpKQorCQlyZXR1cm4oMCk7CisJCQorCWlmICgobmFtZT1YNTA5X05BTUVfZHVwKFg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSkpID09IE5VTEwpCisJCXJldHVybigwKTsKKworCWlmICghc2tfWDUwOV9OQU1FX3B1c2goKnNrLG5hbWUpKQorCQl7CisJCVg1MDlfTkFNRV9mcmVlKG5hbWUpOworCQlyZXR1cm4oMCk7CisJCX0KKwlyZXR1cm4oMSk7CisJfQorCitpbnQgU1NMX2FkZF9jbGllbnRfQ0EoU1NMICpzc2wsWDUwOSAqeCkKKwl7CisJcmV0dXJuKGFkZF9jbGllbnRfQ0EoJihzc2wtPmNsaWVudF9DQSkseCkpOworCX0KKworaW50IFNTTF9DVFhfYWRkX2NsaWVudF9DQShTU0xfQ1RYICpjdHgsWDUwOSAqeCkKKwl7CisJcmV0dXJuKGFkZF9jbGllbnRfQ0EoJihjdHgtPmNsaWVudF9DQSkseCkpOworCX0KKworc3RhdGljIGludCB4bmFtZV9jbXAoY29uc3QgWDUwOV9OQU1FICogY29uc3QgKmEsIGNvbnN0IFg1MDlfTkFNRSAqIGNvbnN0ICpiKQorCXsKKwlyZXR1cm4oWDUwOV9OQU1FX2NtcCgqYSwqYikpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1NURElPCisvKiEKKyAqIExvYWQgQ0EgY2VydHMgZnJvbSBhIGZpbGUgaW50byBhIDo6U1RBQ0suIE5vdGUgdGhhdCBpdCBpcyBzb21ld2hhdCBtaXNuYW1lZDsKKyAqIGl0IGRvZXNuJ3QgcmVhbGx5IGhhdmUgYW55dGhpbmcgdG8gZG8gd2l0aCBjbGllbnRzIChleGNlcHQgdGhhdCBhIGNvbW1vbiB1c2UKKyAqIGZvciBhIHN0YWNrIG9mIENBcyBpcyB0byBzZW5kIGl0IHRvIHRoZSBjbGllbnQpLiBBY3R1YWxseSwgaXQgZG9lc24ndCBoYXZlCisgKiBtdWNoIHRvIGRvIHdpdGggQ0FzLCBlaXRoZXIsIHNpbmNlIGl0IHdpbGwgbG9hZCBhbnkgb2xkIGNlcnQuCisgKiBccGFyYW0gZmlsZSB0aGUgZmlsZSBjb250YWluaW5nIG9uZSBvciBtb3JlIGNlcnRzLgorICogXHJldHVybiBhIDo6U1RBQ0sgY29udGFpbmluZyB0aGUgY2VydHMuCisgKi8KK1NUQUNLX09GKFg1MDlfTkFNRSkgKlNTTF9sb2FkX2NsaWVudF9DQV9maWxlKGNvbnN0IGNoYXIgKmZpbGUpCisJeworCUJJTyAqaW47CisJWDUwOSAqeD1OVUxMOworCVg1MDlfTkFNRSAqeG49TlVMTDsKKwlTVEFDS19PRihYNTA5X05BTUUpICpyZXQgPSBOVUxMLCpzazsKKworCXNrPXNrX1g1MDlfTkFNRV9uZXcoeG5hbWVfY21wKTsKKworCWluPUJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKTsKKworCWlmICgoc2sgPT0gTlVMTCkgfHwgKGluID09IE5VTEwpKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfTE9BRF9DTElFTlRfQ0FfRklMRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisJCisJaWYgKCFCSU9fcmVhZF9maWxlbmFtZShpbixmaWxlKSkKKwkJZ290byBlcnI7CisKKwlmb3IgKDs7KQorCQl7CisJCWlmIChQRU1fcmVhZF9iaW9fWDUwOShpbiwmeCxOVUxMLE5VTEwpID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKHJldCA9PSBOVUxMKQorCQkJeworCQkJcmV0ID0gc2tfWDUwOV9OQU1FX25ld19udWxsKCk7CisJCQlpZiAocmV0ID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0xfTE9BRF9DTElFTlRfQ0FfRklMRSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQlpZiAoKHhuPVg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSkgPT0gTlVMTCkgZ290byBlcnI7CisJCS8qIGNoZWNrIGZvciBkdXBsaWNhdGVzICovCisJCXhuPVg1MDlfTkFNRV9kdXAoeG4pOworCQlpZiAoeG4gPT0gTlVMTCkgZ290byBlcnI7CisJCWlmIChza19YNTA5X05BTUVfZmluZChzayx4bikgPj0gMCkKKwkJCVg1MDlfTkFNRV9mcmVlKHhuKTsKKwkJZWxzZQorCQkJeworCQkJc2tfWDUwOV9OQU1FX3B1c2goc2sseG4pOworCQkJc2tfWDUwOV9OQU1FX3B1c2gocmV0LHhuKTsKKwkJCX0KKwkJfQorCisJaWYgKDApCisJCXsKK2VycjoKKwkJaWYgKHJldCAhPSBOVUxMKSBza19YNTA5X05BTUVfcG9wX2ZyZWUocmV0LFg1MDlfTkFNRV9mcmVlKTsKKwkJcmV0PU5VTEw7CisJCX0KKwlpZiAoc2sgIT0gTlVMTCkgc2tfWDUwOV9OQU1FX2ZyZWUoc2spOworCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJaWYgKHggIT0gTlVMTCkgWDUwOV9mcmVlKHgpOworCWlmIChyZXQgIT0gTlVMTCkKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKKy8qIQorICogQWRkIGEgZmlsZSBvZiBjZXJ0cyB0byBhIHN0YWNrLgorICogXHBhcmFtIHN0YWNrIHRoZSBzdGFjayB0byBhZGQgdG8uCisgKiBccGFyYW0gZmlsZSB0aGUgZmlsZSB0byBhZGQgZnJvbS4gQWxsIGNlcnRzIGluIHRoaXMgZmlsZSB0aGF0IGFyZSBub3QKKyAqIGFscmVhZHkgaW4gdGhlIHN0YWNrIHdpbGwgYmUgYWRkZWQuCisgKiBccmV0dXJuIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSBvZiBmYWlsdXJlIHNvbWUKKyAqIGNlcnRzIG1heSBoYXZlIGJlZW4gYWRkZWQgdG8gXGMgc3RhY2suCisgKi8KKworaW50IFNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKFNUQUNLX09GKFg1MDlfTkFNRSkgKnN0YWNrLAorCQkJCQljb25zdCBjaGFyICpmaWxlKQorCXsKKwlCSU8gKmluOworCVg1MDkgKng9TlVMTDsKKwlYNTA5X05BTUUgKnhuPU5VTEw7CisJaW50IHJldD0xOworCWludCAoKm9sZGNtcCkoY29uc3QgWDUwOV9OQU1FICogY29uc3QgKmEsIGNvbnN0IFg1MDlfTkFNRSAqIGNvbnN0ICpiKTsKKwkKKwlvbGRjbXA9c2tfWDUwOV9OQU1FX3NldF9jbXBfZnVuYyhzdGFjayx4bmFtZV9jbXApOworCQorCWluPUJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKTsKKwkKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0FERF9GSUxFX0NFUlRfU1VCSkVDVFNfVE9fU1RBQ0ssRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCQorCWlmICghQklPX3JlYWRfZmlsZW5hbWUoaW4sZmlsZSkpCisJCWdvdG8gZXJyOworCQorCWZvciAoOzspCisJCXsKKwkJaWYgKFBFTV9yZWFkX2Jpb19YNTA5KGluLCZ4LE5VTEwsTlVMTCkgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKHhuPVg1MDlfZ2V0X3N1YmplY3RfbmFtZSh4KSkgPT0gTlVMTCkgZ290byBlcnI7CisJCXhuPVg1MDlfTkFNRV9kdXAoeG4pOworCQlpZiAoeG4gPT0gTlVMTCkgZ290byBlcnI7CisJCWlmIChza19YNTA5X05BTUVfZmluZChzdGFjayx4bikgPj0gMCkKKwkJCVg1MDlfTkFNRV9mcmVlKHhuKTsKKwkJZWxzZQorCQkJc2tfWDUwOV9OQU1FX3B1c2goc3RhY2sseG4pOworCQl9CisKKwlFUlJfY2xlYXJfZXJyb3IoKTsKKworCWlmICgwKQorCQl7CitlcnI6CisJCXJldD0wOworCQl9CisJaWYoaW4gIT0gTlVMTCkKKwkJQklPX2ZyZWUoaW4pOworCWlmKHggIT0gTlVMTCkKKwkJWDUwOV9mcmVlKHgpOworCQorCSh2b2lkKXNrX1g1MDlfTkFNRV9zZXRfY21wX2Z1bmMoc3RhY2ssb2xkY21wKTsKKworCXJldHVybiByZXQ7CisJfQorCisvKiEKKyAqIEFkZCBhIGRpcmVjdG9yeSBvZiBjZXJ0cyB0byBhIHN0YWNrLgorICogXHBhcmFtIHN0YWNrIHRoZSBzdGFjayB0byBhcHBlbmQgdG8uCisgKiBccGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgdG8gYXBwZW5kIGZyb20uIEFsbCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlCisgKiBleGFtaW5lZCBhcyBwb3RlbnRpYWwgY2VydHMuIEFueSB0aGF0IGFyZSBhY2NlcHRhYmxlIHRvCisgKiBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKCkgdGhhdCBhcmUgbm90IGFscmVhZHkgaW4gdGhlIHN0YWNrIHdpbGwgYmUKKyAqIGluY2x1ZGVkLgorICogXHJldHVybiAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZmFpbHVyZSBzb21lCisgKiBjZXJ0cyBtYXkgaGF2ZSBiZWVuIGFkZGVkIHRvIFxjIHN0YWNrLgorICovCisKK2ludCBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKFNUQUNLX09GKFg1MDlfTkFNRSkgKnN0YWNrLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpkaXIpCisJeworCU9QRU5TU0xfRElSX0NUWCAqZCA9IE5VTEw7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJaW50IHJldCA9IDA7CisKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1JFQURESVIpOworCisJLyogTm90ZSB0aGF0IGEgc2lkZSBlZmZlY3QgaXMgdGhhdCB0aGUgQ0FzIHdpbGwgYmUgc29ydGVkIGJ5IG5hbWUgKi8KKworCXdoaWxlKChmaWxlbmFtZSA9IE9QRU5TU0xfRElSX3JlYWQoJmQsIGRpcikpKQorCQl7CisJCWNoYXIgYnVmWzEwMjRdOworCQlpbnQgcjsKKworCQlpZihzdHJsZW4oZGlyKStzdHJsZW4oZmlsZW5hbWUpKzIgPiBzaXplb2YgYnVmKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTF9BRERfRElSX0NFUlRfU1VCSkVDVFNfVE9fU1RBQ0ssU1NMX1JfUEFUSF9UT09fTE9ORyk7CisJCQlnb3RvIGVycjsKKwkJCX0KKworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworCQlyID0gQklPX3NucHJpbnRmKGJ1ZixzaXplb2YgYnVmLCIlcyVzIixkaXIsZmlsZW5hbWUpOworI2Vsc2UKKwkJciA9IEJJT19zbnByaW50ZihidWYsc2l6ZW9mIGJ1ZiwiJXMvJXMiLGRpcixmaWxlbmFtZSk7CisjZW5kaWYKKwkJaWYgKHIgPD0gMCB8fCByID49IChpbnQpc2l6ZW9mKGJ1ZikpCisJCQlnb3RvIGVycjsKKwkJaWYoIVNTTF9hZGRfZmlsZV9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrKHN0YWNrLGJ1ZikpCisJCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKGVycm5vKQorCQl7CisJCVNZU2VycihTWVNfRl9PUEVORElSLCBnZXRfbGFzdF9zeXNfZXJyb3IoKSk7CisJCUVSUl9hZGRfZXJyb3JfZGF0YSgzLCAiT1BFTlNTTF9ESVJfcmVhZCgmY3R4LCAnIiwgZGlyLCAiJykiKTsKKwkJU1NMZXJyKFNTTF9GX1NTTF9BRERfRElSX0NFUlRfU1VCSkVDVFNfVE9fU1RBQ0ssIEVSUl9SX1NZU19MSUIpOworCQlnb3RvIGVycjsKKwkJfQorCisJcmV0ID0gMTsKKworZXJyOgorCWlmIChkKSBPUEVOU1NMX0RJUl9lbmQoJmQpOworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19SRUFERElSKTsKKwlyZXR1cm4gcmV0OworCX0KKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3NzbF9jaXBoLmMgYi9saWIvb3BlbnNzbC9zc2wvc3NsX2NpcGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWUzNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbF9jaXBoLmMKQEAgLTAsMCArMSwxNzQ4IEBACisvKiBzc2wvc3NsX2NpcGguYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDIgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBTEwgUklHSFRTIFJFU0VSVkVELgorICogRUNDIGNpcGhlciBzdWl0ZSBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgCisgKiBTVU4gTUlDUk9TWVNURU1TLCBJTkMuLCBhbmQgY29udHJpYnV0ZWQgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDA1IE5va2lhLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoZSBwb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBpcyBkZXZlbG9wZWQgYnkKKyAqIE5va2lhIENvcnBvcmF0aW9uIGFuZCBpcyBsaWNlbnNlZCBwdXJzdWFudCB0byB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZQorICogbGljZW5zZS4KKyAqCisgKiBUaGUgQ29udHJpYnV0aW9uLCBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWlrYSBLb3VzYSBhbmQgUGFzaSBFcm9uZW4gb2YKKyAqIE5va2lhIENvcnBvcmF0aW9uLCBjb25zaXN0cyBvZiB0aGUgIlBTSyIgKFByZS1TaGFyZWQgS2V5KSBjaXBoZXJzdWl0ZXMKKyAqIHN1cHBvcnQgKHNlZSBSRkMgNDI3OSkgdG8gT3BlblNTTC4KKyAqCisgKiBObyBwYXRlbnQgbGljZW5zZXMgb3Igb3RoZXIgcmlnaHRzIGV4Y2VwdCB0aG9zZSBleHByZXNzbHkgc3RhdGVkIGluCisgKiB0aGUgT3BlblNTTCBvcGVuIHNvdXJjZSBsaWNlbnNlIHNoYWxsIGJlIGRlZW1lZCBncmFudGVkIG9yIHJlY2VpdmVkCisgKiBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCwgb3Igb3RoZXJ3aXNlLgorICoKKyAqIE5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IE5va2lhIHRoYXQgdGhlIENvbnRyaWJ1dGlvbiBkb2VzIG5vdAorICogaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSB0aGlyZAorICogcGFydHkgb3IgdGhhdCB0aGUgbGljZW5zZSBwcm92aWRlcyB5b3Ugd2l0aCBhbGwgdGhlIG5lY2Vzc2FyeSByaWdodHMKKyAqIHRvIG1ha2UgdXNlIG9mIHRoZSBDb250cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORC4gSU4KKyAqIEFERElUSU9OIFRPIFRIRSBESVNDTEFJTUVSUyBJTkNMVURFRCBJTiBUSEUgTElDRU5TRSwgTk9LSUEKKyAqIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIExJQUJJTElUWSBGT1IgQ0xBSU1TIEJST1VHSFQgQlkgWU9VIE9SIEFOWQorICogT1RIRVIgRU5USVRZIEJBU0VEIE9OIElORlJJTkdFTUVOVCBPRiBJTlRFTExFQ1RVQUwgUFJPUEVSVFkgUklHSFRTIE9SCisgKiBPVEhFUldJU0UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorI2luY2x1ZGUgPG9wZW5zc2wvY29tcC5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisKKyNkZWZpbmUgU1NMX0VOQ19ERVNfSURYCQkwCisjZGVmaW5lIFNTTF9FTkNfM0RFU19JRFgJMQorI2RlZmluZSBTU0xfRU5DX1JDNF9JRFgJCTIKKyNkZWZpbmUgU1NMX0VOQ19SQzJfSURYCQkzCisjZGVmaW5lIFNTTF9FTkNfSURFQV9JRFgJNAorI2RlZmluZSBTU0xfRU5DX05VTExfSURYCTUKKyNkZWZpbmUgU1NMX0VOQ19BRVMxMjhfSURYCTYKKyNkZWZpbmUgU1NMX0VOQ19BRVMyNTZfSURYCTcKKyNkZWZpbmUgU1NMX0VOQ19DQU1FTExJQTEyOF9JRFgJOAorI2RlZmluZSBTU0xfRU5DX0NBTUVMTElBMjU2X0lEWAk5CisjZGVmaW5lIFNTTF9FTkNfR09TVDg5X0lEWAkxMAorI2RlZmluZSBTU0xfRU5DX1NFRURfSURYICAgIAkxMQorI2RlZmluZSBTU0xfRU5DX05VTV9JRFgJCTEyCisKKworc3RhdGljIGNvbnN0IEVWUF9DSVBIRVIgKnNzbF9jaXBoZXJfbWV0aG9kc1tTU0xfRU5DX05VTV9JRFhdPXsKKwlOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsCisJfTsKKworI2RlZmluZSBTU0xfQ09NUF9OVUxMX0lEWAkwCisjZGVmaW5lIFNTTF9DT01QX1pMSUJfSURYCTEKKyNkZWZpbmUgU1NMX0NPTVBfTlVNX0lEWAkyCisKK3N0YXRpYyBTVEFDS19PRihTU0xfQ09NUCkgKnNzbF9jb21wX21ldGhvZHM9TlVMTDsKKworI2RlZmluZSBTU0xfTURfTUQ1X0lEWAkwCisjZGVmaW5lIFNTTF9NRF9TSEExX0lEWAkxCisjZGVmaW5lIFNTTF9NRF9HT1NUOTRfSURYIDIKKyNkZWZpbmUgU1NMX01EX0dPU1Q4OU1BQ19JRFggMworLypDb25zdGFudCBTU0xfTUFYX0RJR0VTVCBlcXVhbCB0byBzaXplIG9mIGRpZ2VzdHMgYXJyYXkgc2hvdWxkIGJlIAorICogZGVmaW5lZCBpbiB0aGUKKyAqIHNzbF9sb2NsLmggKi8KKyNkZWZpbmUgU1NMX01EX05VTV9JRFgJU1NMX01BWF9ESUdFU1QgCitzdGF0aWMgY29uc3QgRVZQX01EICpzc2xfZGlnZXN0X21ldGhvZHNbU1NMX01EX05VTV9JRFhdPXsKKwlOVUxMLE5VTEwsTlVMTCxOVUxMCisJfTsKKy8qIFBLRVlfVFlQRSBmb3IgR09TVDg5TUFDIGlzIGtub3duIGluIGFkdmFuY2UsIGJ1dCwgYmVjYXVzZQorICogaW1wbGVtZW50YXRpb24gaXMgZW5naW5lLXByb3ZpZGVkLCB3ZSdsbCBmaWxsIGl0IG9ubHkgaWYKKyAqIGNvcnJlc3BvbmRpbmcgRVZQX1BLRVlfTUVUSE9EIGlzIGZvdW5kIAorICovCitzdGF0aWMgaW50ICBzc2xfbWFjX3BrZXlfaWRbU1NMX01EX05VTV9JRFhdPXsKKwlFVlBfUEtFWV9ITUFDLEVWUF9QS0VZX0hNQUMsRVZQX1BLRVlfSE1BQyxOSURfdW5kZWYKKwl9OworCitzdGF0aWMgaW50IHNzbF9tYWNfc2VjcmV0X3NpemVbU1NMX01EX05VTV9JRFhdPXsKKwkwLDAsMCwwCisJfTsKKworc3RhdGljIGludCBzc2xfaGFuZHNoYWtlX2RpZ2VzdF9mbGFnW1NTTF9NRF9OVU1fSURYXT17CisJU1NMX0hBTkRTSEFLRV9NQUNfTUQ1LFNTTF9IQU5EU0hBS0VfTUFDX1NIQSwKKwlTU0xfSEFORFNIQUtFX01BQ19HT1NUOTQsMAorCX07CisKKyNkZWZpbmUgQ0lQSEVSX0FERAkxCisjZGVmaW5lIENJUEhFUl9LSUxMCTIKKyNkZWZpbmUgQ0lQSEVSX0RFTAkzCisjZGVmaW5lIENJUEhFUl9PUkQJNAorI2RlZmluZSBDSVBIRVJfU1BFQ0lBTAk1CisKK3R5cGVkZWYgc3RydWN0IGNpcGhlcl9vcmRlcl9zdAorCXsKKwljb25zdCBTU0xfQ0lQSEVSICpjaXBoZXI7CisJaW50IGFjdGl2ZTsKKwlpbnQgZGVhZDsKKwlzdHJ1Y3QgY2lwaGVyX29yZGVyX3N0ICpuZXh0LCpwcmV2OworCX0gQ0lQSEVSX09SREVSOworCitzdGF0aWMgY29uc3QgU1NMX0NJUEhFUiBjaXBoZXJfYWxpYXNlc1tdPXsKKwkvKiAiQUxMIiBkb2Vzbid0IGluY2x1ZGUgZU5VTEwgKG11c3QgYmUgc3BlY2lmaWNhbGx5IGVuYWJsZWQpICovCisJezAsU1NMX1RYVF9BTEwsMCwgICAgIDAsMCx+U1NMX2VOVUxMLDAsMCwwLDAsMCwwfSwKKwkvKiAiQ09NUExFTUVOVE9GQUxMIiAqLworCXswLFNTTF9UWFRfQ01QQUxMLDAsICAwLDAsU1NMX2VOVUxMLDAsMCwwLDAsMCwwfSwKKworCS8qICJDT01QTEVNRU5UT0ZERUZBVUxUIiAoZG9lcyAqbm90KiBpbmNsdWRlIGNpcGhlcnN1aXRlcyBub3QgZm91bmQgaW4gQUxMISkgKi8KKwl7MCxTU0xfVFhUX0NNUERFRiwwLCAgU1NMX2tFREh8U1NMX2tFRUNESCxTU0xfYU5VTEwsflNTTF9lTlVMTCwwLDAsMCwwLDAsMH0sCisKKwkvKiBrZXkgZXhjaGFuZ2UgYWxpYXNlcworCSAqIChzb21lIG9mIHRob3NlIHVzaW5nIG9ubHkgYSBzaW5nbGUgYml0IGhlcmUgY29tYmluZQorCSAqIG11bHRpcGxlIGtleSBleGNoYW5nZSBhbGdzIGFjY29yZGluZyB0byB0aGUgUkZDcywKKwkgKiBlLmcuIGtFREggY29tYmluZXMgREhFX0RTUyBhbmQgREhFX1JTQSkgKi8KKwl7MCxTU0xfVFhUX2tSU0EsMCwgICAgU1NMX2tSU0EsICAwLDAsMCwwLDAsMCwwLDB9LAorCisJezAsU1NMX1RYVF9rREhyLDAsICAgIFNTTF9rREhyLCAgMCwwLDAsMCwwLDAsMCwwfSwgLyogbm8gc3VjaCBjaXBoZXJzdWl0ZXMgc3VwcG9ydGVkISAqLworCXswLFNTTF9UWFRfa0RIZCwwLCAgICBTU0xfa0RIZCwgIDAsMCwwLDAsMCwwLDAsMH0sIC8qIG5vIHN1Y2ggY2lwaGVyc3VpdGVzIHN1cHBvcnRlZCEgKi8KKwl7MCxTU0xfVFhUX2tESCwwLCAgICAgU1NMX2tESHJ8U1NMX2tESGQsMCwwLDAsMCwwLDAsMCwwfSwgLyogbm8gc3VjaCBjaXBoZXJzdWl0ZXMgc3VwcG9ydGVkISAqLworCXswLFNTTF9UWFRfa0VESCwwLCAgICBTU0xfa0VESCwgIDAsMCwwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9ESCwwLCAgICAgIFNTTF9rREhyfFNTTF9rREhkfFNTTF9rRURILDAsMCwwLDAsMCwwLDAsMH0sCisKKwl7MCxTU0xfVFhUX2tLUkI1LDAsICAgU1NMX2tLUkI1LCAwLDAsMCwwLDAsMCwwLDB9LAorCisJezAsU1NMX1RYVF9rRUNESHIsMCwgIFNTTF9rRUNESHIsMCwwLDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX2tFQ0RIZSwwLCAgU1NMX2tFQ0RIZSwwLDAsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfa0VDREgsMCwgICBTU0xfa0VDREhyfFNTTF9rRUNESGUsMCwwLDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX2tFRUNESCwwLCAgU1NMX2tFRUNESCwwLDAsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfRUNESCwwLCAgICBTU0xfa0VDREhyfFNTTF9rRUNESGV8U1NMX2tFRUNESCwwLDAsMCwwLDAsMCwwLDB9LAorCisgICAgICAgIHswLFNTTF9UWFRfa1BTSywwLCAgICBTU0xfa1BTSywgIDAsMCwwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9rR09TVCwwLCBTU0xfa0dPU1QsMCwwLDAsMCwwLDAsMCwwfSwKKworCS8qIHNlcnZlciBhdXRoZW50aWNhdGlvbiBhbGlhc2VzICovCisJezAsU1NMX1RYVF9hUlNBLDAsICAgIDAsU1NMX2FSU0EsICAwLDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX2FEU1MsMCwgICAgMCxTU0xfYURTUywgIDAsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfRFNTLDAsICAgICAwLFNTTF9hRFNTLCAgIDAsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfYUtSQjUsMCwgICAwLFNTTF9hS1JCNSwgMCwwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9hTlVMTCwwLCAgIDAsU1NMX2FOVUxMLCAwLDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX2FESCwwLCAgICAgMCxTU0xfYURILCAgIDAsMCwwLDAsMCwwLDB9LCAvKiBubyBzdWNoIGNpcGhlcnN1aXRlcyBzdXBwb3J0ZWQhICovCisJezAsU1NMX1RYVF9hRUNESCwwLCAgIDAsU1NMX2FFQ0RILCAwLDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX2FFQ0RTQSwwLCAgMCxTU0xfYUVDRFNBLDAsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfRUNEU0EsMCwgICAwLFNTTF9hRUNEU0EsIDAsMCwwLDAsMCwwLDB9LAorICAgICAgICB7MCxTU0xfVFhUX2FQU0ssMCwgICAgMCxTU0xfYVBTSywgIDAsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfYUdPU1Q5NCwwLDAsU1NMX2FHT1NUOTQsMCwwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9hR09TVDAxLDAsMCxTU0xfYUdPU1QwMSwwLDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX2FHT1NULDAsMCxTU0xfYUdPU1Q5NHxTU0xfYUdPU1QwMSwwLDAsMCwwLDAsMCwwfSwKKworCS8qIGFsaWFzZXMgY29tYmluaW5nIGtleSBleGNoYW5nZSBhbmQgc2VydmVyIGF1dGhlbnRpY2F0aW9uICovCisJezAsU1NMX1RYVF9FREgsMCwgICAgIFNTTF9rRURILH5TU0xfYU5VTEwsMCwwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9FRUNESCwwLCAgIFNTTF9rRUVDREgsflNTTF9hTlVMTCwwLDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX05VTEwsMCwgICAgMCwwLFNTTF9lTlVMTCwgMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfS1JCNSwwLCAgICBTU0xfa0tSQjUsU1NMX2FLUkI1LDAsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfUlNBLDAsICAgICBTU0xfa1JTQSxTU0xfYVJTQSwwLDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX0FESCwwLCAgICAgU1NMX2tFREgsU1NMX2FOVUxMLDAsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfQUVDREgsMCwgICBTU0xfa0VFQ0RILFNTTF9hTlVMTCwwLDAsMCwwLDAsMCwwfSwKKyAgICAgICAgezAsU1NMX1RYVF9QU0ssMCwgICAgIFNTTF9rUFNLLFNTTF9hUFNLLDAsMCwwLDAsMCwwLDB9LAorCisKKwkvKiBzeW1tZXRyaWMgZW5jcnlwdGlvbiBhbGlhc2VzICovCisJezAsU1NMX1RYVF9ERVMsMCwgICAgIDAsMCxTU0xfREVTLCAgIDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUXzNERVMsMCwgICAgMCwwLFNTTF8zREVTLCAgMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfUkM0LDAsICAgICAwLDAsU1NMX1JDNCwgICAwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9SQzIsMCwgICAgIDAsMCxTU0xfUkMyLCAgIDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX0lERUEsMCwgICAgMCwwLFNTTF9JREVBLCAgMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfU0VFRCwwLCAgICAwLDAsU1NMX1NFRUQsICAwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9lTlVMTCwwLCAgIDAsMCxTU0xfZU5VTEwsIDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX0FFUzEyOCwwLCAgMCwwLFNTTF9BRVMxMjgsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfQUVTMjU2LDAsICAwLDAsU1NMX0FFUzI1NiwwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9BRVMsMCwgICAgIDAsMCxTU0xfQUVTMTI4fFNTTF9BRVMyNTYsMCwwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfQ0FNRUxMSUExMjgsMCwwLDAsU1NMX0NBTUVMTElBMTI4LDAsMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX0NBTUVMTElBMjU2LDAsMCwwLFNTTF9DQU1FTExJQTI1NiwwLDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9DQU1FTExJQSAgICwwLDAsMCxTU0xfQ0FNRUxMSUExMjh8U1NMX0NBTUVMTElBMjU2LDAsMCwwLDAsMCwwfSwKKworCS8qIE1BQyBhbGlhc2VzICovCQorCXswLFNTTF9UWFRfTUQ1LDAsICAgICAwLDAsMCxTU0xfTUQ1LCAgIDAsMCwwLDAsMH0sCisJezAsU1NMX1RYVF9TSEExLDAsICAgIDAsMCwwLFNTTF9TSEExLCAgMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX1NIQSwwLCAgICAgMCwwLDAsU1NMX1NIQTEsICAwLDAsMCwwLDB9LAorCXswLFNTTF9UWFRfR09TVDk0LDAsICAgICAwLDAsMCxTU0xfR09TVDk0LCAgMCwwLDAsMCwwfSwKKwl7MCxTU0xfVFhUX0dPU1Q4OU1BQywwLCAgICAgMCwwLDAsU1NMX0dPU1Q4OU1BQywgIDAsMCwwLDAsMH0sCisKKwkvKiBwcm90b2NvbCB2ZXJzaW9uIGFsaWFzZXMgKi8KKwl7MCxTU0xfVFhUX1NTTFYyLDAsICAgMCwwLDAsMCxTU0xfU1NMVjIsIDAsMCwwLDB9LAorCXswLFNTTF9UWFRfU1NMVjMsMCwgICAwLDAsMCwwLFNTTF9TU0xWMywgMCwwLDAsMH0sCisJezAsU1NMX1RYVF9UTFNWMSwwLCAgIDAsMCwwLDAsU1NMX1RMU1YxLCAwLDAsMCwwfSwKKworCS8qIGV4cG9ydCBmbGFnICovCisJezAsU1NMX1RYVF9FWFAsMCwgICAgIDAsMCwwLDAsMCxTU0xfRVhQT1JULDAsMCwwfSwKKwl7MCxTU0xfVFhUX0VYUE9SVCwwLCAgMCwwLDAsMCwwLFNTTF9FWFBPUlQsMCwwLDB9LAorCisJLyogc3RyZW5ndGggY2xhc3NlcyAqLworCXswLFNTTF9UWFRfRVhQNDAsMCwgICAwLDAsMCwwLDAsU1NMX0VYUDQwLCAwLDAsMH0sCisJezAsU1NMX1RYVF9FWFA1NiwwLCAgIDAsMCwwLDAsMCxTU0xfRVhQNTYsIDAsMCwwfSwKKwl7MCxTU0xfVFhUX0xPVywwLCAgICAgMCwwLDAsMCwwLFNTTF9MT1csICAgMCwwLDB9LAorCXswLFNTTF9UWFRfTUVESVVNLDAsICAwLDAsMCwwLDAsU1NMX01FRElVTSwwLDAsMH0sCisJezAsU1NMX1RYVF9ISUdILDAsICAgIDAsMCwwLDAsMCxTU0xfSElHSCwgIDAsMCwwfSwKKwkvKiBGSVBTIDE0MC0yIGFwcHJvdmVkIGNpcGhlcnN1aXRlICovCisJezAsU1NMX1RYVF9GSVBTLDAsICAgIDAsMCx+U1NMX2VOVUxMLDAsMCxTU0xfRklQUywgIDAsMCwwfSwKKwl9OworLyogU2VhcmNoIGZvciBwdWJsaWMga2V5IGFsZ29yaXRobSB3aXRoIGdpdmVuIG5hbWUgYW5kIAorICogcmV0dXJuIGl0cyBwa2V5X2lkIGlmIGl0IGlzIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIHJldHVybiAwCisgKi8KKyNpZmRlZiBPUEVOU1NMX05PX0VOR0lORQorCitzdGF0aWMgaW50IGdldF9vcHRpb25hbF9wa2V5X2lkKGNvbnN0IGNoYXIgKnBrZXlfbmFtZSkKKwl7CisJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCWludCBwa2V5X2lkPTA7CisJYW1ldGggPSBFVlBfUEtFWV9hc24xX2ZpbmRfc3RyKE5VTEwscGtleV9uYW1lLC0xKTsKKwlpZiAoYW1ldGgpIAorCQl7CisJCUVWUF9QS0VZX2FzbjFfZ2V0MF9pbmZvKCZwa2V5X2lkLCBOVUxMLE5VTEwsTlVMTCxOVUxMLGFtZXRoKTsKKwkJfQkJCisJcmV0dXJuIHBrZXlfaWQ7CisJfQorCisjZWxzZQorCitzdGF0aWMgaW50IGdldF9vcHRpb25hbF9wa2V5X2lkKGNvbnN0IGNoYXIgKnBrZXlfbmFtZSkKKwl7CisJY29uc3QgRVZQX1BLRVlfQVNOMV9NRVRIT0QgKmFtZXRoOworCUVOR0lORSAqdG1wZW5nID0gTlVMTDsKKwlpbnQgcGtleV9pZD0wOworCWFtZXRoID0gRVZQX1BLRVlfYXNuMV9maW5kX3N0cigmdG1wZW5nLHBrZXlfbmFtZSwtMSk7CisJaWYgKGFtZXRoKQorCQl7CisJCUVWUF9QS0VZX2FzbjFfZ2V0MF9pbmZvKCZwa2V5X2lkLCBOVUxMLE5VTEwsTlVMTCxOVUxMLGFtZXRoKTsKKwkJfQorCWlmICh0bXBlbmcpIEVOR0lORV9maW5pc2godG1wZW5nKTsKKwlyZXR1cm4gcGtleV9pZDsKKwl9CisKKyNlbmRpZgorCit2b2lkIHNzbF9sb2FkX2NpcGhlcnModm9pZCkKKwl7CisJc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfREVTX0lEWF09IAorCQlFVlBfZ2V0X2NpcGhlcmJ5bmFtZShTTl9kZXNfY2JjKTsKKwlzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ18zREVTX0lEWF09CisJCUVWUF9nZXRfY2lwaGVyYnluYW1lKFNOX2Rlc19lZGUzX2NiYyk7CisJc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfUkM0X0lEWF09CisJCUVWUF9nZXRfY2lwaGVyYnluYW1lKFNOX3JjNCk7CisJc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfUkMyX0lEWF09IAorCQlFVlBfZ2V0X2NpcGhlcmJ5bmFtZShTTl9yYzJfY2JjKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19JREVBCisJc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfSURFQV9JRFhdPSAKKwkJRVZQX2dldF9jaXBoZXJieW5hbWUoU05faWRlYV9jYmMpOworI2Vsc2UKKwlzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19JREVBX0lEWF09IE5VTEw7CisjZW5kaWYKKwlzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19BRVMxMjhfSURYXT0KKwkgIEVWUF9nZXRfY2lwaGVyYnluYW1lKFNOX2Flc18xMjhfY2JjKTsKKwlzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19BRVMyNTZfSURYXT0KKwkgIEVWUF9nZXRfY2lwaGVyYnluYW1lKFNOX2Flc18yNTZfY2JjKTsKKwlzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19DQU1FTExJQTEyOF9JRFhdPQorCSAgRVZQX2dldF9jaXBoZXJieW5hbWUoU05fY2FtZWxsaWFfMTI4X2NiYyk7CisJc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfQ0FNRUxMSUEyNTZfSURYXT0KKwkgIEVWUF9nZXRfY2lwaGVyYnluYW1lKFNOX2NhbWVsbGlhXzI1Nl9jYmMpOworCXNzbF9jaXBoZXJfbWV0aG9kc1tTU0xfRU5DX0dPU1Q4OV9JRFhdPQorCSAgRVZQX2dldF9jaXBoZXJieW5hbWUoU05fZ29zdDg5X2NudCk7CisJc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfU0VFRF9JRFhdPQorCSAgRVZQX2dldF9jaXBoZXJieW5hbWUoU05fc2VlZF9jYmMpOworCisJc3NsX2RpZ2VzdF9tZXRob2RzW1NTTF9NRF9NRDVfSURYXT0KKwkJRVZQX2dldF9kaWdlc3RieW5hbWUoU05fbWQ1KTsKKwlzc2xfbWFjX3NlY3JldF9zaXplW1NTTF9NRF9NRDVfSURYXT0KKwkJRVZQX01EX3NpemUoc3NsX2RpZ2VzdF9tZXRob2RzW1NTTF9NRF9NRDVfSURYXSk7CisJT1BFTlNTTF9hc3NlcnQoc3NsX21hY19zZWNyZXRfc2l6ZVtTU0xfTURfTUQ1X0lEWF0gPj0gMCk7CisJc3NsX2RpZ2VzdF9tZXRob2RzW1NTTF9NRF9TSEExX0lEWF09CisJCUVWUF9nZXRfZGlnZXN0YnluYW1lKFNOX3NoYTEpOworCXNzbF9tYWNfc2VjcmV0X3NpemVbU1NMX01EX1NIQTFfSURYXT0KKwkJRVZQX01EX3NpemUoc3NsX2RpZ2VzdF9tZXRob2RzW1NTTF9NRF9TSEExX0lEWF0pOworCU9QRU5TU0xfYXNzZXJ0KHNzbF9tYWNfc2VjcmV0X3NpemVbU1NMX01EX1NIQTFfSURYXSA+PSAwKTsKKwlzc2xfZGlnZXN0X21ldGhvZHNbU1NMX01EX0dPU1Q5NF9JRFhdPQorCQlFVlBfZ2V0X2RpZ2VzdGJ5bmFtZShTTl9pZF9Hb3N0UjM0MTFfOTQpOworCWlmIChzc2xfZGlnZXN0X21ldGhvZHNbU1NMX01EX0dPU1Q5NF9JRFhdKQorCQl7CQorCQlzc2xfbWFjX3NlY3JldF9zaXplW1NTTF9NRF9HT1NUOTRfSURYXT0KKwkJCUVWUF9NRF9zaXplKHNzbF9kaWdlc3RfbWV0aG9kc1tTU0xfTURfR09TVDk0X0lEWF0pOworCQlPUEVOU1NMX2Fzc2VydChzc2xfbWFjX3NlY3JldF9zaXplW1NTTF9NRF9HT1NUOTRfSURYXSA+PSAwKTsKKwkJfQorCXNzbF9kaWdlc3RfbWV0aG9kc1tTU0xfTURfR09TVDg5TUFDX0lEWF09CisJCUVWUF9nZXRfZGlnZXN0YnluYW1lKFNOX2lkX0dvc3QyODE0N184OV9NQUMpOworCQlzc2xfbWFjX3BrZXlfaWRbU1NMX01EX0dPU1Q4OU1BQ19JRFhdID0gZ2V0X29wdGlvbmFsX3BrZXlfaWQoImdvc3QtbWFjIik7CisJCWlmIChzc2xfbWFjX3BrZXlfaWRbU1NMX01EX0dPU1Q4OU1BQ19JRFhdKSB7CisJCQlzc2xfbWFjX3NlY3JldF9zaXplW1NTTF9NRF9HT1NUODlNQUNfSURYXT0zMjsKKwkJfQkJCisKKwl9CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCitzdGF0aWMgaW50IHNrX2NvbXBfY21wKGNvbnN0IFNTTF9DT01QICogY29uc3QgKmEsCisJCQljb25zdCBTU0xfQ09NUCAqIGNvbnN0ICpiKQorCXsKKwlyZXR1cm4oKCphKS0+aWQtKCpiKS0+aWQpOworCX0KKworc3RhdGljIHZvaWQgbG9hZF9idWlsdGluX2NvbXByZXNzaW9ucyh2b2lkKQorCXsKKwlpbnQgZ290X3dyaXRlX2xvY2sgPSAwOworCisJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19TU0wpOworCWlmIChzc2xfY29tcF9tZXRob2RzID09IE5VTEwpCisJCXsKKwkJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX1NTTCk7CisJCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfU1NMKTsKKwkJZ290X3dyaXRlX2xvY2sgPSAxOworCQkKKwkJaWYgKHNzbF9jb21wX21ldGhvZHMgPT0gTlVMTCkKKwkJCXsKKwkJCVNTTF9DT01QICpjb21wID0gTlVMTDsKKworCQkJTWVtQ2hlY2tfb2ZmKCk7CisJCQlzc2xfY29tcF9tZXRob2RzPXNrX1NTTF9DT01QX25ldyhza19jb21wX2NtcCk7CisJCQlpZiAoc3NsX2NvbXBfbWV0aG9kcyAhPSBOVUxMKQorCQkJCXsKKwkJCQljb21wPShTU0xfQ09NUCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihTU0xfQ09NUCkpOworCQkJCWlmIChjb21wICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJY29tcC0+bWV0aG9kPUNPTVBfemxpYigpOworCQkJCQlpZiAoY29tcC0+bWV0aG9kCisJCQkJCQkmJiBjb21wLT5tZXRob2QtPnR5cGUgPT0gTklEX3VuZGVmKQorCQkJCQkJT1BFTlNTTF9mcmVlKGNvbXApOworCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQljb21wLT5pZD1TU0xfQ09NUF9aTElCX0lEWDsKKwkJCQkJCWNvbXAtPm5hbWU9Y29tcC0+bWV0aG9kLT5uYW1lOworCQkJCQkJc2tfU1NMX0NPTVBfcHVzaChzc2xfY29tcF9tZXRob2RzLGNvbXApOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJTWVtQ2hlY2tfb24oKTsKKwkJCX0KKwkJfQorCQorCWlmIChnb3Rfd3JpdGVfbG9jaykKKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1NTTCk7CisJZWxzZQorCQlDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfU1NMKTsKKwl9CisjZW5kaWYKKworaW50IHNzbF9jaXBoZXJfZ2V0X2V2cChjb25zdCBTU0xfU0VTU0lPTiAqcywgY29uc3QgRVZQX0NJUEhFUiAqKmVuYywKKwkgICAgIGNvbnN0IEVWUF9NRCAqKm1kLCBpbnQgKm1hY19wa2V5X3R5cGUsIGludCAqbWFjX3NlY3JldF9zaXplLFNTTF9DT01QICoqY29tcCkKKwl7CisJaW50IGk7CisJY29uc3QgU1NMX0NJUEhFUiAqYzsKKworCWM9cy0+Y2lwaGVyOworCWlmIChjID09IE5VTEwpIHJldHVybigwKTsKKwlpZiAoY29tcCAhPSBOVUxMKQorCQl7CisJCVNTTF9DT01QIGN0bXA7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCQlsb2FkX2J1aWx0aW5fY29tcHJlc3Npb25zKCk7CisjZW5kaWYKKworCQkqY29tcD1OVUxMOworCQljdG1wLmlkPXMtPmNvbXByZXNzX21ldGg7CisJCWlmIChzc2xfY29tcF9tZXRob2RzICE9IE5VTEwpCisJCQl7CisJCQlpPXNrX1NTTF9DT01QX2ZpbmQoc3NsX2NvbXBfbWV0aG9kcywmY3RtcCk7CisJCQlpZiAoaSA+PSAwKQorCQkJCSpjb21wPXNrX1NTTF9DT01QX3ZhbHVlKHNzbF9jb21wX21ldGhvZHMsaSk7CisJCQllbHNlCisJCQkJKmNvbXA9TlVMTDsKKwkJCX0KKwkJfQorCisJaWYgKChlbmMgPT0gTlVMTCkgfHwgKG1kID09IE5VTEwpKSByZXR1cm4oMCk7CisKKwlzd2l0Y2ggKGMtPmFsZ29yaXRobV9lbmMpCisJCXsKKwljYXNlIFNTTF9ERVM6CisJCWk9U1NMX0VOQ19ERVNfSURYOworCQlicmVhazsKKwljYXNlIFNTTF8zREVTOgorCQlpPVNTTF9FTkNfM0RFU19JRFg7CisJCWJyZWFrOworCWNhc2UgU1NMX1JDNDoKKwkJaT1TU0xfRU5DX1JDNF9JRFg7CisJCWJyZWFrOworCWNhc2UgU1NMX1JDMjoKKwkJaT1TU0xfRU5DX1JDMl9JRFg7CisJCWJyZWFrOworCWNhc2UgU1NMX0lERUE6CisJCWk9U1NMX0VOQ19JREVBX0lEWDsKKwkJYnJlYWs7CisJY2FzZSBTU0xfZU5VTEw6CisJCWk9U1NMX0VOQ19OVUxMX0lEWDsKKwkJYnJlYWs7CisJY2FzZSBTU0xfQUVTMTI4OgorCQlpPVNTTF9FTkNfQUVTMTI4X0lEWDsKKwkJYnJlYWs7CisJY2FzZSBTU0xfQUVTMjU2OgorCQlpPVNTTF9FTkNfQUVTMjU2X0lEWDsKKwkJYnJlYWs7CisJY2FzZSBTU0xfQ0FNRUxMSUExMjg6CisJCWk9U1NMX0VOQ19DQU1FTExJQTEyOF9JRFg7CisJCWJyZWFrOworCWNhc2UgU1NMX0NBTUVMTElBMjU2OgorCQlpPVNTTF9FTkNfQ0FNRUxMSUEyNTZfSURYOworCQlicmVhazsKKwljYXNlIFNTTF9lR09TVDI4MTQ3ODlDTlQ6CisJCWk9U1NMX0VOQ19HT1NUODlfSURYOworCQlicmVhazsKKwljYXNlIFNTTF9TRUVEOgorCQlpPVNTTF9FTkNfU0VFRF9JRFg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWk9IC0xOworCQlicmVhazsKKwkJfQorCisJaWYgKChpIDwgMCkgfHwgKGkgPiBTU0xfRU5DX05VTV9JRFgpKQorCQkqZW5jPU5VTEw7CisJZWxzZQorCQl7CisJCWlmIChpID09IFNTTF9FTkNfTlVMTF9JRFgpCisJCQkqZW5jPUVWUF9lbmNfbnVsbCgpOworCQllbHNlCisJCQkqZW5jPXNzbF9jaXBoZXJfbWV0aG9kc1tpXTsKKwkJfQorCisJc3dpdGNoIChjLT5hbGdvcml0aG1fbWFjKQorCQl7CisJY2FzZSBTU0xfTUQ1OgorCQlpPVNTTF9NRF9NRDVfSURYOworCQlicmVhazsKKwljYXNlIFNTTF9TSEExOgorCQlpPVNTTF9NRF9TSEExX0lEWDsKKwkJYnJlYWs7CisJY2FzZSBTU0xfR09TVDk0OgorCQlpID0gU1NMX01EX0dPU1Q5NF9JRFg7CisJCWJyZWFrOworCWNhc2UgU1NMX0dPU1Q4OU1BQzoKKwkJaSA9IFNTTF9NRF9HT1NUODlNQUNfSURYOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpPSAtMTsKKwkJYnJlYWs7CisJCX0KKwlpZiAoKGkgPCAwKSB8fCAoaSA+IFNTTF9NRF9OVU1fSURYKSkKKwl7CisJCSptZD1OVUxMOyAKKwkJaWYgKG1hY19wa2V5X3R5cGUhPU5VTEwpICptYWNfcGtleV90eXBlID0gTklEX3VuZGVmOworCQlpZiAobWFjX3NlY3JldF9zaXplIT1OVUxMKSAqbWFjX3NlY3JldF9zaXplID0gMDsKKworCX0KKwllbHNlCisJeworCQkqbWQ9c3NsX2RpZ2VzdF9tZXRob2RzW2ldOworCQlpZiAobWFjX3BrZXlfdHlwZSE9TlVMTCkgKm1hY19wa2V5X3R5cGUgPSBzc2xfbWFjX3BrZXlfaWRbaV07CisJCWlmIChtYWNfc2VjcmV0X3NpemUhPU5VTEwpICptYWNfc2VjcmV0X3NpemUgPSBzc2xfbWFjX3NlY3JldF9zaXplW2ldOworCX0JCisKKwlpZiAoKCplbmMgIT0gTlVMTCkgJiYgKCptZCAhPSBOVUxMKSAmJiAoIW1hY19wa2V5X3R5cGV8fCptYWNfcGtleV90eXBlICE9IE5JRF91bmRlZikpCisJCXJldHVybigxKTsKKwllbHNlCisJCXJldHVybigwKTsKKwl9CisKK2ludCBzc2xfZ2V0X2hhbmRzaGFrZV9kaWdlc3QoaW50IGlkeCwgbG9uZyAqbWFzaywgY29uc3QgRVZQX01EICoqbWQpIAoreworCWlmIChpZHggPDB8fGlkeD49U1NMX01EX05VTV9JRFgpIAorCQl7CisJCXJldHVybiAwOworCQl9CisJaWYgKHNzbF9oYW5kc2hha2VfZGlnZXN0X2ZsYWdbaWR4XT09MCkgcmV0dXJuIDA7CisJKm1hc2sgPSBzc2xfaGFuZHNoYWtlX2RpZ2VzdF9mbGFnW2lkeF07CisJKm1kID0gc3NsX2RpZ2VzdF9tZXRob2RzW2lkeF07CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgSVRFTV9TRVAoYSkgXAorCSgoKGEpID09ICc6JykgfHwgKChhKSA9PSAnICcpIHx8ICgoYSkgPT0gJzsnKSB8fCAoKGEpID09ICcsJykpCisKK3N0YXRpYyB2b2lkIGxsX2FwcGVuZF90YWlsKENJUEhFUl9PUkRFUiAqKmhlYWQsIENJUEhFUl9PUkRFUiAqY3VyciwKKwkgICAgIENJUEhFUl9PUkRFUiAqKnRhaWwpCisJeworCWlmIChjdXJyID09ICp0YWlsKSByZXR1cm47CisJaWYgKGN1cnIgPT0gKmhlYWQpCisJCSpoZWFkPWN1cnItPm5leHQ7CisJaWYgKGN1cnItPnByZXYgIT0gTlVMTCkKKwkJY3Vyci0+cHJldi0+bmV4dD1jdXJyLT5uZXh0OworCWlmIChjdXJyLT5uZXh0ICE9IE5VTEwpCisJCWN1cnItPm5leHQtPnByZXY9Y3Vyci0+cHJldjsKKwkoKnRhaWwpLT5uZXh0PWN1cnI7CisJY3Vyci0+cHJldj0gKnRhaWw7CisJY3Vyci0+bmV4dD1OVUxMOworCSp0YWlsPWN1cnI7CisJfQorCitzdGF0aWMgdm9pZCBsbF9hcHBlbmRfaGVhZChDSVBIRVJfT1JERVIgKipoZWFkLCBDSVBIRVJfT1JERVIgKmN1cnIsCisJICAgICBDSVBIRVJfT1JERVIgKip0YWlsKQorCXsKKwlpZiAoY3VyciA9PSAqaGVhZCkgcmV0dXJuOworCWlmIChjdXJyID09ICp0YWlsKQorCQkqdGFpbD1jdXJyLT5wcmV2OworCWlmIChjdXJyLT5uZXh0ICE9IE5VTEwpCisJCWN1cnItPm5leHQtPnByZXY9Y3Vyci0+cHJldjsKKwlpZiAoY3Vyci0+cHJldiAhPSBOVUxMKQorCQljdXJyLT5wcmV2LT5uZXh0PWN1cnItPm5leHQ7CisJKCpoZWFkKS0+cHJldj1jdXJyOworCWN1cnItPm5leHQ9ICpoZWFkOworCWN1cnItPnByZXY9TlVMTDsKKwkqaGVhZD1jdXJyOworCX0KKworc3RhdGljIHZvaWQgc3NsX2NpcGhlcl9nZXRfZGlzYWJsZWQodW5zaWduZWQgbG9uZyAqbWtleSwgdW5zaWduZWQgbG9uZyAqYXV0aCwgdW5zaWduZWQgbG9uZyAqZW5jLCB1bnNpZ25lZCBsb25nICptYWMsIHVuc2lnbmVkIGxvbmcgKnNzbCkKKwl7CisJKm1rZXkgPSAwOworCSphdXRoID0gMDsKKwkqZW5jID0gMDsKKwkqbWFjID0gMDsKKwkqc3NsID0gMDsKKworI2lmZGVmIE9QRU5TU0xfTk9fUlNBCisJKm1rZXkgfD0gU1NMX2tSU0E7CisJKmF1dGggfD0gU1NMX2FSU0E7CisjZW5kaWYKKyNpZmRlZiBPUEVOU1NMX05PX0RTQQorCSphdXRoIHw9IFNTTF9hRFNTOworI2VuZGlmCisJKm1rZXkgfD0gU1NMX2tESHJ8U1NMX2tESGQ7IC8qIG5vIHN1Y2ggY2lwaGVyc3VpdGVzIHN1cHBvcnRlZCEgKi8KKwkqYXV0aCB8PSBTU0xfYURIOworI2lmZGVmIE9QRU5TU0xfTk9fREgKKwkqbWtleSB8PSBTU0xfa0RIcnxTU0xfa0RIZHxTU0xfa0VESDsKKwkqYXV0aCB8PSBTU0xfYURIOworI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9OT19LUkI1CisJKm1rZXkgfD0gU1NMX2tLUkI1OworCSphdXRoIHw9IFNTTF9hS1JCNTsKKyNlbmRpZgorI2lmZGVmIE9QRU5TU0xfTk9fRUNEU0EKKwkqYXV0aCB8PSBTU0xfYUVDRFNBOworI2VuZGlmCisjaWZkZWYgT1BFTlNTTF9OT19FQ0RICisJKm1rZXkgfD0gU1NMX2tFQ0RIZXxTU0xfa0VDREhyOworCSphdXRoIHw9IFNTTF9hRUNESDsKKyNlbmRpZgorI2lmZGVmIE9QRU5TU0xfTk9fUFNLCisJKm1rZXkgfD0gU1NMX2tQU0s7CisJKmF1dGggfD0gU1NMX2FQU0s7CisjZW5kaWYKKwkvKiBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgR09TVCAzNC4xMCBhbGdvcml0aG1zLCBhbmQgaWYgdGhleQorCSAqIGRvIG5vdCBwcmVzZW50LCBkaXNhYmxlICBhcHByb3ByaWF0ZSBhdXRoIGFuZCBrZXkgZXhjaGFuZ2UgKi8KKwlpZiAoIWdldF9vcHRpb25hbF9wa2V5X2lkKCJnb3N0OTQiKSkgeworCQkqYXV0aCB8PSBTU0xfYUdPU1Q5NDsKKwl9CisJaWYgKCFnZXRfb3B0aW9uYWxfcGtleV9pZCgiZ29zdDIwMDEiKSkgeworCQkqYXV0aCB8PSBTU0xfYUdPU1QwMTsKKwl9CisJLyogRGlzYWJsZSBHT1NUIGtleSBleGNoYW5nZSBpZiBubyBHT1NUIHNpZ25hdHVyZSBhbGdzIGFyZSBhdmFpbGFibGUgKiAqLworCWlmICgoKmF1dGggJiAoU1NMX2FHT1NUOTR8U1NMX2FHT1NUMDEpKSA9PSAoU1NMX2FHT1NUOTR8U1NMX2FHT1NUMDEpKSB7CisJCSpta2V5IHw9IFNTTF9rR09TVDsKKwl9CQorI2lmZGVmIFNTTF9GT1JCSURfRU5VTEwKKwkqZW5jIHw9IFNTTF9lTlVMTDsKKyNlbmRpZgorCQkKKworCisJKmVuYyB8PSAoc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfREVTX0lEWCBdID09IE5VTEwpID8gU1NMX0RFUyA6MDsKKwkqZW5jIHw9IChzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ18zREVTX0lEWF0gPT0gTlVMTCkgPyBTU0xfM0RFUzowOworCSplbmMgfD0gKHNzbF9jaXBoZXJfbWV0aG9kc1tTU0xfRU5DX1JDNF9JRFggXSA9PSBOVUxMKSA/IFNTTF9SQzQgOjA7CisJKmVuYyB8PSAoc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfUkMyX0lEWCBdID09IE5VTEwpID8gU1NMX1JDMiA6MDsKKwkqZW5jIHw9IChzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19JREVBX0lEWF0gPT0gTlVMTCkgPyBTU0xfSURFQTowOworCSplbmMgfD0gKHNzbF9jaXBoZXJfbWV0aG9kc1tTU0xfRU5DX0FFUzEyOF9JRFhdID09IE5VTEwpID8gU1NMX0FFUzEyODowOworCSplbmMgfD0gKHNzbF9jaXBoZXJfbWV0aG9kc1tTU0xfRU5DX0FFUzI1Nl9JRFhdID09IE5VTEwpID8gU1NMX0FFUzI1NjowOworCSplbmMgfD0gKHNzbF9jaXBoZXJfbWV0aG9kc1tTU0xfRU5DX0NBTUVMTElBMTI4X0lEWF0gPT0gTlVMTCkgPyBTU0xfQ0FNRUxMSUExMjg6MDsKKwkqZW5jIHw9IChzc2xfY2lwaGVyX21ldGhvZHNbU1NMX0VOQ19DQU1FTExJQTI1Nl9JRFhdID09IE5VTEwpID8gU1NMX0NBTUVMTElBMjU2OjA7CisJKmVuYyB8PSAoc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfR09TVDg5X0lEWF0gPT0gTlVMTCkgPyBTU0xfZUdPU1QyODE0Nzg5Q05UOjA7CisJKmVuYyB8PSAoc3NsX2NpcGhlcl9tZXRob2RzW1NTTF9FTkNfU0VFRF9JRFhdID09IE5VTEwpID8gU1NMX1NFRUQ6MDsKKworCSptYWMgfD0gKHNzbF9kaWdlc3RfbWV0aG9kc1tTU0xfTURfTUQ1X0lEWCBdID09IE5VTEwpID8gU1NMX01ENSA6MDsKKwkqbWFjIHw9IChzc2xfZGlnZXN0X21ldGhvZHNbU1NMX01EX1NIQTFfSURYXSA9PSBOVUxMKSA/IFNTTF9TSEExOjA7CisJKm1hYyB8PSAoc3NsX2RpZ2VzdF9tZXRob2RzW1NTTF9NRF9HT1NUOTRfSURYXSA9PSBOVUxMKSA/IFNTTF9HT1NUOTQ6MDsKKwkqbWFjIHw9IChzc2xfZGlnZXN0X21ldGhvZHNbU1NMX01EX0dPU1Q4OU1BQ19JRFhdID09IE5VTEwgfHwgc3NsX21hY19wa2V5X2lkW1NTTF9NRF9HT1NUODlNQUNfSURYXT09TklEX3VuZGVmKT8gU1NMX0dPU1Q4OU1BQzowOworCisJfQorCitzdGF0aWMgdm9pZCBzc2xfY2lwaGVyX2NvbGxlY3RfY2lwaGVycyhjb25zdCBTU0xfTUVUSE9EICpzc2xfbWV0aG9kLAorICAgICAgICAgICAgICAgIGludCBudW1fb2ZfY2lwaGVycywKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRpc2FibGVkX21rZXksIHVuc2lnbmVkIGxvbmcgZGlzYWJsZWRfYXV0aCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRpc2FibGVkX2VuYywgdW5zaWduZWQgbG9uZyBkaXNhYmxlZF9tYWMsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBkaXNhYmxlZF9zc2wsCisgICAgICAgICAgICAgICAgQ0lQSEVSX09SREVSICpjb19saXN0LAorICAgICAgICAgICAgICAgIENJUEhFUl9PUkRFUiAqKmhlYWRfcCwgQ0lQSEVSX09SREVSICoqdGFpbF9wKQorCXsKKwlpbnQgaSwgY29fbGlzdF9udW07CisJY29uc3QgU1NMX0NJUEhFUiAqYzsKKworCS8qCisJICogV2UgaGF2ZSBudW1fb2ZfY2lwaGVycyBkZXNjcmlwdGlvbnMgY29tcGlsZWQgaW4sIGRlcGVuZGluZyBvbiB0aGUKKwkgKiBtZXRob2Qgc2VsZWN0ZWQgKFNTTHYyIGFuZC9vciBTU0x2MywgVExTdjEgZXRjKS4KKwkgKiBUaGVzZSB3aWxsIGxhdGVyIGJlIHNvcnRlZCBpbiBhIGxpbmtlZCBsaXN0IHdpdGggYXQgbW9zdCBudW0KKwkgKiBlbnRyaWVzLgorCSAqLworCisJLyogR2V0IHRoZSBpbml0aWFsIGxpc3Qgb2YgY2lwaGVycyAqLworCWNvX2xpc3RfbnVtID0gMDsJLyogYWN0dWFsIGNvdW50IG9mIGNpcGhlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX2NpcGhlcnM7IGkrKykKKwkJeworCQljID0gc3NsX21ldGhvZC0+Z2V0X2NpcGhlcihpKTsKKwkJLyogZHJvcCB0aG9zZSB0aGF0IHVzZSBhbnkgb2YgdGhhdCBpcyBub3QgYXZhaWxhYmxlICovCisJCWlmICgoYyAhPSBOVUxMKSAmJiBjLT52YWxpZCAmJgorCQkgICAgIShjLT5hbGdvcml0aG1fbWtleSAmIGRpc2FibGVkX21rZXkpICYmCisJCSAgICAhKGMtPmFsZ29yaXRobV9hdXRoICYgZGlzYWJsZWRfYXV0aCkgJiYKKwkJICAgICEoYy0+YWxnb3JpdGhtX2VuYyAmIGRpc2FibGVkX2VuYykgJiYKKwkJICAgICEoYy0+YWxnb3JpdGhtX21hYyAmIGRpc2FibGVkX21hYykgJiYKKwkJICAgICEoYy0+YWxnb3JpdGhtX3NzbCAmIGRpc2FibGVkX3NzbCkpCisJCQl7CisJCQljb19saXN0W2NvX2xpc3RfbnVtXS5jaXBoZXIgPSBjOworCQkJY29fbGlzdFtjb19saXN0X251bV0ubmV4dCA9IE5VTEw7CisJCQljb19saXN0W2NvX2xpc3RfbnVtXS5wcmV2ID0gTlVMTDsKKwkJCWNvX2xpc3RbY29fbGlzdF9udW1dLmFjdGl2ZSA9IDA7CisJCQljb19saXN0X251bSsrOworI2lmZGVmIEtTU0xfREVCVUcKKwkJCXByaW50ZigiXHQlZDogJXMgJWx4ICVseCAlbHhcbiIsaSxjLT5uYW1lLGMtPmlkLGMtPmFsZ29yaXRobV9ta2V5LGMtPmFsZ29yaXRobV9hdXRoKTsKKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisJCQkvKgorCQkJaWYgKCFza19wdXNoKGNhX2xpc3QsKGNoYXIgKiljKSkgZ290byBlcnI7CisJCQkqLworCQkJfQorCQl9CisKKwkvKgorCSAqIFByZXBhcmUgbGlua2VkIGxpc3QgZnJvbSBsaXN0IGVudHJpZXMKKwkgKi8JCisJaWYgKGNvX2xpc3RfbnVtID4gMCkKKwkJeworCQljb19saXN0WzBdLnByZXYgPSBOVUxMOworCisJCWlmIChjb19saXN0X251bSA+IDEpCisJCQl7CisJCQljb19saXN0WzBdLm5leHQgPSAmY29fbGlzdFsxXTsKKwkJCQorCQkJZm9yIChpID0gMTsgaSA8IGNvX2xpc3RfbnVtIC0gMTsgaSsrKQorCQkJCXsKKwkJCQljb19saXN0W2ldLnByZXYgPSAmY29fbGlzdFtpIC0gMV07CisJCQkJY29fbGlzdFtpXS5uZXh0ID0gJmNvX2xpc3RbaSArIDFdOworCQkJCX0KKworCQkJY29fbGlzdFtjb19saXN0X251bSAtIDFdLnByZXYgPSAmY29fbGlzdFtjb19saXN0X251bSAtIDJdOworCQkJfQorCQkKKwkJY29fbGlzdFtjb19saXN0X251bSAtIDFdLm5leHQgPSBOVUxMOworCisJCSpoZWFkX3AgPSAmY29fbGlzdFswXTsKKwkJKnRhaWxfcCA9ICZjb19saXN0W2NvX2xpc3RfbnVtIC0gMV07CisJCX0KKwl9CisKK3N0YXRpYyB2b2lkIHNzbF9jaXBoZXJfY29sbGVjdF9hbGlhc2VzKGNvbnN0IFNTTF9DSVBIRVIgKipjYV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9vZl9ncm91cF9hbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBkaXNhYmxlZF9ta2V5LCB1bnNpZ25lZCBsb25nIGRpc2FibGVkX2F1dGgsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRpc2FibGVkX2VuYywgdW5zaWduZWQgbG9uZyBkaXNhYmxlZF9tYWMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGRpc2FibGVkX3NzbCwKKwkJCUNJUEhFUl9PUkRFUiAqaGVhZCkKKwl7CisJQ0lQSEVSX09SREVSICpjaXBoX2N1cnI7CisJY29uc3QgU1NMX0NJUEhFUiAqKmNhX2N1cnI7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBtYXNrX21rZXkgPSB+ZGlzYWJsZWRfbWtleTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfYXV0aCA9IH5kaXNhYmxlZF9hdXRoOworCXVuc2lnbmVkIGxvbmcgbWFza19lbmMgPSB+ZGlzYWJsZWRfZW5jOworCXVuc2lnbmVkIGxvbmcgbWFza19tYWMgPSB+ZGlzYWJsZWRfbWFjOworCXVuc2lnbmVkIGxvbmcgbWFza19zc2wgPSB+ZGlzYWJsZWRfc3NsOworCisJLyoKKwkgKiBGaXJzdCwgYWRkIHRoZSByZWFsIGNpcGhlcnMgYXMgYWxyZWFkeSBjb2xsZWN0ZWQKKwkgKi8KKwljaXBoX2N1cnIgPSBoZWFkOworCWNhX2N1cnIgPSBjYV9saXN0OworCXdoaWxlIChjaXBoX2N1cnIgIT0gTlVMTCkKKwkJeworCQkqY2FfY3VyciA9IGNpcGhfY3Vyci0+Y2lwaGVyOworCQljYV9jdXJyKys7CisJCWNpcGhfY3VyciA9IGNpcGhfY3Vyci0+bmV4dDsKKwkJfQorCisJLyoKKwkgKiBOb3cgd2UgYWRkIHRoZSBhdmFpbGFibGUgb25lcyBmcm9tIHRoZSBjaXBoZXJfYWxpYXNlc1tdIHRhYmxlLgorCSAqIFRoZXkgcmVwcmVzZW50IGVpdGhlciBvbmUgb3IgbW9yZSBhbGdvcml0aG1zLCBzb21lIG9mIHdoaWNoCisJICogaW4gYW55IGFmZmVjdGVkIGNhdGVnb3J5IG11c3QgYmUgc3VwcG9ydGVkIChzZXQgaW4gZW5hYmxlZF9tYXNrKSwKKwkgKiBvciByZXByZXNlbnQgYSBjaXBoZXIgc3RyZW5ndGggdmFsdWUgKHdpbGwgYmUgYWRkZWQgaW4gYW55IGNhc2UgYmVjYXVzZSBhbGdvcml0aG1zPTApLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfZ3JvdXBfYWxpYXNlczsgaSsrKQorCQl7CisJCXVuc2lnbmVkIGxvbmcgYWxnb3JpdGhtX21rZXkgPSBjaXBoZXJfYWxpYXNlc1tpXS5hbGdvcml0aG1fbWtleTsKKwkJdW5zaWduZWQgbG9uZyBhbGdvcml0aG1fYXV0aCA9IGNpcGhlcl9hbGlhc2VzW2ldLmFsZ29yaXRobV9hdXRoOworCQl1bnNpZ25lZCBsb25nIGFsZ29yaXRobV9lbmMgPSBjaXBoZXJfYWxpYXNlc1tpXS5hbGdvcml0aG1fZW5jOworCQl1bnNpZ25lZCBsb25nIGFsZ29yaXRobV9tYWMgPSBjaXBoZXJfYWxpYXNlc1tpXS5hbGdvcml0aG1fbWFjOworCQl1bnNpZ25lZCBsb25nIGFsZ29yaXRobV9zc2wgPSBjaXBoZXJfYWxpYXNlc1tpXS5hbGdvcml0aG1fc3NsOworCisJCWlmIChhbGdvcml0aG1fbWtleSkKKwkJCWlmICgoYWxnb3JpdGhtX21rZXkgJiBtYXNrX21rZXkpID09IDApCisJCQkJY29udGludWU7CisJCisJCWlmIChhbGdvcml0aG1fYXV0aCkKKwkJCWlmICgoYWxnb3JpdGhtX2F1dGggJiBtYXNrX2F1dGgpID09IDApCisJCQkJY29udGludWU7CisJCQorCQlpZiAoYWxnb3JpdGhtX2VuYykKKwkJCWlmICgoYWxnb3JpdGhtX2VuYyAmIG1hc2tfZW5jKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkKKwkJaWYgKGFsZ29yaXRobV9tYWMpCisJCQlpZiAoKGFsZ29yaXRobV9tYWMgJiBtYXNrX21hYykgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCisJCWlmIChhbGdvcml0aG1fc3NsKQorCQkJaWYgKChhbGdvcml0aG1fc3NsICYgbWFza19zc2wpID09IDApCisJCQkJY29udGludWU7CisJCQorCQkqY2FfY3VyciA9IChTU0xfQ0lQSEVSICopKGNpcGhlcl9hbGlhc2VzICsgaSk7CisJCWNhX2N1cnIrKzsKKwkJfQorCisJKmNhX2N1cnIgPSBOVUxMOwkvKiBlbmQgb2YgbGlzdCAqLworCX0KKworc3RhdGljIHZvaWQgc3NsX2NpcGhlcl9hcHBseV9ydWxlKHVuc2lnbmVkIGxvbmcgY2lwaGVyX2lkLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYWxnX21rZXksIHVuc2lnbmVkIGxvbmcgYWxnX2F1dGgsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhbGdfZW5jLCB1bnNpZ25lZCBsb25nIGFsZ19tYWMsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhbGdfc3NsLAorCQl1bnNpZ25lZCBsb25nIGFsZ29fc3RyZW5ndGgsCisJCWludCBydWxlLCBpbnQgc3RyZW5ndGhfYml0cywKKwkJQ0lQSEVSX09SREVSICoqaGVhZF9wLCBDSVBIRVJfT1JERVIgKip0YWlsX3ApCisJeworCUNJUEhFUl9PUkRFUiAqaGVhZCwgKnRhaWwsICpjdXJyLCAqY3VycjIsICpsYXN0OworCWNvbnN0IFNTTF9DSVBIRVIgKmNwOworCWludCByZXZlcnNlID0gMDsKKworI2lmZGVmIENJUEhFUl9ERUJVRworCXByaW50ZigiQXBwbHlpbmcgcnVsZSAlZCB3aXRoICUwOGx4LyUwOGx4LyUwOGx4LyUwOGx4LyUwOGx4ICUwOGx4ICglZClcbiIsCisJCXJ1bGUsIGFsZ19ta2V5LCBhbGdfYXV0aCwgYWxnX2VuYywgYWxnX21hYywgYWxnX3NzbCwgYWxnb19zdHJlbmd0aCwgc3RyZW5ndGhfYml0cyk7CisjZW5kaWYKKworCWlmIChydWxlID09IENJUEhFUl9ERUwpCisJCXJldmVyc2UgPSAxOyAvKiBuZWVkZWQgdG8gbWFpbnRhaW4gc29ydGluZyBiZXR3ZWVuIGN1cnJlbnRseSBkZWxldGVkIGNpcGhlcnMgKi8KKworCWhlYWQgPSAqaGVhZF9wOworCXRhaWwgPSAqdGFpbF9wOworCisJaWYgKHJldmVyc2UpCisJCXsKKwkJY3VyciA9IHRhaWw7CisJCWxhc3QgPSBoZWFkOworCQl9CisJZWxzZQorCQl7CisJCWN1cnIgPSBoZWFkOworCQlsYXN0ID0gdGFpbDsKKwkJfQorCisJY3VycjIgPSBjdXJyOworCWZvciAoOzspCisJCXsKKwkJaWYgKChjdXJyID09IE5VTEwpIHx8IChjdXJyID09IGxhc3QpKSBicmVhazsKKwkJY3VyciA9IGN1cnIyOworCQljdXJyMiA9IHJldmVyc2UgPyBjdXJyLT5wcmV2IDogY3Vyci0+bmV4dDsKKworCQljcCA9IGN1cnItPmNpcGhlcjsKKworCQkvKgorCQkgKiBTZWxlY3Rpb24gY3JpdGVyaWEgaXMgZWl0aGVyIHRoZSB2YWx1ZSBvZiBzdHJlbmd0aF9iaXRzCisJCSAqIG9yIHRoZSBhbGdvcml0aG1zIHVzZWQuCisJCSAqLworCQlpZiAoc3RyZW5ndGhfYml0cyA+PSAwKQorCQkJeworCQkJaWYgKHN0cmVuZ3RoX2JpdHMgIT0gY3AtPnN0cmVuZ3RoX2JpdHMpCisJCQkJY29udGludWU7CisJCQl9CisJCWVsc2UKKwkJCXsKKyNpZmRlZiBDSVBIRVJfREVCVUcKKwkJCXByaW50ZigiXG5OYW1lOiAlczpcbkFsZ28gPSAlMDhseC8lMDhseC8lMDhseC8lMDhseC8lMDhseCBBbGdvX3N0cmVuZ3RoID0gJTA4bHhcbiIsIGNwLT5uYW1lLCBjcC0+YWxnb3JpdGhtX21rZXksIGNwLT5hbGdvcml0aG1fYXV0aCwgY3AtPmFsZ29yaXRobV9lbmMsIGNwLT5hbGdvcml0aG1fbWFjLCBjcC0+YWxnb3JpdGhtX3NzbCwgY3AtPmFsZ29fc3RyZW5ndGgpOworI2VuZGlmCisKKwkJCWlmIChhbGdfbWtleSAmJiAhKGFsZ19ta2V5ICYgY3AtPmFsZ29yaXRobV9ta2V5KSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChhbGdfYXV0aCAmJiAhKGFsZ19hdXRoICYgY3AtPmFsZ29yaXRobV9hdXRoKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChhbGdfZW5jICYmICEoYWxnX2VuYyAmIGNwLT5hbGdvcml0aG1fZW5jKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChhbGdfbWFjICYmICEoYWxnX21hYyAmIGNwLT5hbGdvcml0aG1fbWFjKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChhbGdfc3NsICYmICEoYWxnX3NzbCAmIGNwLT5hbGdvcml0aG1fc3NsKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICgoYWxnb19zdHJlbmd0aCAmIFNTTF9FWFBfTUFTSykgJiYgIShhbGdvX3N0cmVuZ3RoICYgU1NMX0VYUF9NQVNLICYgY3AtPmFsZ29fc3RyZW5ndGgpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChhbGdvX3N0cmVuZ3RoICYgU1NMX1NUUk9OR19NQVNLKSAmJiAhKGFsZ29fc3RyZW5ndGggJiBTU0xfU1RST05HX01BU0sgJiBjcC0+YWxnb19zdHJlbmd0aCkpCisJCQkJY29udGludWU7CisJCQl9CisKKyNpZmRlZiBDSVBIRVJfREVCVUcKKwkJcHJpbnRmKCJBY3Rpb24gPSAlZFxuIiwgcnVsZSk7CisjZW5kaWYKKworCQkvKiBhZGQgdGhlIGNpcGhlciBpZiBpdCBoYXMgbm90IGJlZW4gYWRkZWQgeWV0LiAqLworCQlpZiAocnVsZSA9PSBDSVBIRVJfQUREKQorCQkJeworCQkJLyogcmV2ZXJzZSA9PSAwICovCisJCQlpZiAoIWN1cnItPmFjdGl2ZSkKKwkJCQl7CisJCQkJbGxfYXBwZW5kX3RhaWwoJmhlYWQsIGN1cnIsICZ0YWlsKTsKKwkJCQljdXJyLT5hY3RpdmUgPSAxOworCQkJCX0KKwkJCX0KKwkJLyogTW92ZSB0aGUgYWRkZWQgY2lwaGVyIHRvIHRoaXMgbG9jYXRpb24gKi8KKwkJZWxzZSBpZiAocnVsZSA9PSBDSVBIRVJfT1JEKQorCQkJeworCQkJLyogcmV2ZXJzZSA9PSAwICovCisJCQlpZiAoY3Vyci0+YWN0aXZlKQorCQkJCXsKKwkJCQlsbF9hcHBlbmRfdGFpbCgmaGVhZCwgY3VyciwgJnRhaWwpOworCQkJCX0KKwkJCX0KKwkJZWxzZSBpZgkocnVsZSA9PSBDSVBIRVJfREVMKQorCQkJeworCQkJLyogcmV2ZXJzZSA9PSAxICovCisJCQlpZiAoY3Vyci0+YWN0aXZlKQorCQkJCXsKKwkJCQkvKiBtb3N0IHJlY2VudGx5IGRlbGV0ZWQgY2lwaGVyc3VpdGVzIGdldCBiZXN0IHBvc2l0aW9ucworCQkJCSAqIGZvciBhbnkgZnV0dXJlIENJUEhFUl9BREQgKG5vdGUgdGhhdCB0aGUgQ0lQSEVSX0RFTCBsb29wCisJCQkJICogd29ya3MgaW4gcmV2ZXJzZSB0byBtYWludGFpbiB0aGUgb3JkZXIpICovCisJCQkJbGxfYXBwZW5kX2hlYWQoJmhlYWQsIGN1cnIsICZ0YWlsKTsKKwkJCQljdXJyLT5hY3RpdmUgPSAwOworCQkJCX0KKwkJCX0KKwkJZWxzZSBpZiAocnVsZSA9PSBDSVBIRVJfS0lMTCkKKwkJCXsKKwkJCS8qIHJldmVyc2UgPT0gMCAqLworCQkJaWYgKGhlYWQgPT0gY3VycikKKwkJCQloZWFkID0gY3Vyci0+bmV4dDsKKwkJCWVsc2UKKwkJCQljdXJyLT5wcmV2LT5uZXh0ID0gY3Vyci0+bmV4dDsKKwkJCWlmICh0YWlsID09IGN1cnIpCisJCQkJdGFpbCA9IGN1cnItPnByZXY7CisJCQljdXJyLT5hY3RpdmUgPSAwOworCQkJaWYgKGN1cnItPm5leHQgIT0gTlVMTCkKKwkJCQljdXJyLT5uZXh0LT5wcmV2ID0gY3Vyci0+cHJldjsKKwkJCWlmIChjdXJyLT5wcmV2ICE9IE5VTEwpCisJCQkJY3Vyci0+cHJldi0+bmV4dCA9IGN1cnItPm5leHQ7CisJCQljdXJyLT5uZXh0ID0gTlVMTDsKKwkJCWN1cnItPnByZXYgPSBOVUxMOworCQkJfQorCQl9CisKKwkqaGVhZF9wID0gaGVhZDsKKwkqdGFpbF9wID0gdGFpbDsKKwl9CisKK3N0YXRpYyBpbnQgc3NsX2NpcGhlcl9zdHJlbmd0aF9zb3J0KENJUEhFUl9PUkRFUiAqKmhlYWRfcCwKKwkJCQkgICAgQ0lQSEVSX09SREVSICoqdGFpbF9wKQorCXsKKwlpbnQgbWF4X3N0cmVuZ3RoX2JpdHMsIGksICpudW1iZXJfdXNlczsKKwlDSVBIRVJfT1JERVIgKmN1cnI7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBzb3J0cyB0aGUgY2lwaGVycyB3aXRoIGRlc2NlbmRpbmcgc3RyZW5ndGguIFRoZSBzb3J0aW5nCisJICogbXVzdCBrZWVwIHRoZSBwcmUtc29ydGVkIHNlcXVlbmNlLCBzbyB3ZSBhcHBseSB0aGUgbm9ybWFsIHNvcnRpbmcKKwkgKiByb3V0aW5lIGFzICcrJyBtb3ZlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCSAqLworCW1heF9zdHJlbmd0aF9iaXRzID0gMDsKKwljdXJyID0gKmhlYWRfcDsKKwl3aGlsZSAoY3VyciAhPSBOVUxMKQorCQl7CisJCWlmIChjdXJyLT5hY3RpdmUgJiYKKwkJICAgIChjdXJyLT5jaXBoZXItPnN0cmVuZ3RoX2JpdHMgPiBtYXhfc3RyZW5ndGhfYml0cykpCisJCSAgICBtYXhfc3RyZW5ndGhfYml0cyA9IGN1cnItPmNpcGhlci0+c3RyZW5ndGhfYml0czsKKwkJY3VyciA9IGN1cnItPm5leHQ7CisJCX0KKworCW51bWJlcl91c2VzID0gT1BFTlNTTF9tYWxsb2MoKG1heF9zdHJlbmd0aF9iaXRzICsgMSkgKiBzaXplb2YoaW50KSk7CisJaWYgKCFudW1iZXJfdXNlcykKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NJUEhFUl9TVFJFTkdUSF9TT1JULEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJbWVtc2V0KG51bWJlcl91c2VzLCAwLCAobWF4X3N0cmVuZ3RoX2JpdHMgKyAxKSAqIHNpemVvZihpbnQpKTsKKworCS8qCisJICogTm93IGZpbmQgdGhlIHN0cmVuZ3RoX2JpdHMgdmFsdWVzIGFjdHVhbGx5IHVzZWQKKwkgKi8KKwljdXJyID0gKmhlYWRfcDsKKwl3aGlsZSAoY3VyciAhPSBOVUxMKQorCQl7CisJCWlmIChjdXJyLT5hY3RpdmUpCisJCQludW1iZXJfdXNlc1tjdXJyLT5jaXBoZXItPnN0cmVuZ3RoX2JpdHNdKys7CisJCWN1cnIgPSBjdXJyLT5uZXh0OworCQl9CisJLyoKKwkgKiBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVzZWQgc3RyZW5ndGhfYml0cyB2YWx1ZXMgaW4gZGVzY2VuZGluZworCSAqIG9yZGVyLgorCSAqLworCWZvciAoaSA9IG1heF9zdHJlbmd0aF9iaXRzOyBpID49IDA7IGktLSkKKwkJaWYgKG51bWJlcl91c2VzW2ldID4gMCkKKwkJCXNzbF9jaXBoZXJfYXBwbHlfcnVsZSgwLCAwLCAwLCAwLCAwLCAwLCAwLCBDSVBIRVJfT1JELCBpLCBoZWFkX3AsIHRhaWxfcCk7CisKKwlPUEVOU1NMX2ZyZWUobnVtYmVyX3VzZXMpOworCXJldHVybigxKTsKKwl9CisKK3N0YXRpYyBpbnQgc3NsX2NpcGhlcl9wcm9jZXNzX3J1bGVzdHIoY29uc3QgY2hhciAqcnVsZV9zdHIsCisgICAgICAgICAgICAgICAgQ0lQSEVSX09SREVSICoqaGVhZF9wLCBDSVBIRVJfT1JERVIgKip0YWlsX3AsCisgICAgICAgICAgICAgICAgY29uc3QgU1NMX0NJUEhFUiAqKmNhX2xpc3QpCisJeworCXVuc2lnbmVkIGxvbmcgYWxnX21rZXksIGFsZ19hdXRoLCBhbGdfZW5jLCBhbGdfbWFjLCBhbGdfc3NsLCBhbGdvX3N0cmVuZ3RoOworCWNvbnN0IGNoYXIgKmwsICpzdGFydCwgKmJ1ZjsKKwlpbnQgaiwgbXVsdGksIGZvdW5kLCBydWxlLCByZXR2YWwsIG9rLCBidWZsZW47CisJdW5zaWduZWQgbG9uZyBjaXBoZXJfaWQgPSAwOworCWNoYXIgY2g7CisKKwlyZXR2YWwgPSAxOworCWwgPSBydWxlX3N0cjsKKwlmb3IgKDs7KQorCQl7CisJCWNoID0gKmw7CisKKwkJaWYgKGNoID09ICdcMCcpCisJCQlicmVhazsJCS8qIGRvbmUgKi8KKwkJaWYgKGNoID09ICctJykKKwkJCXsgcnVsZSA9IENJUEhFUl9ERUw7IGwrKzsgfQorCQllbHNlIGlmIChjaCA9PSAnKycpCisJCQl7IHJ1bGUgPSBDSVBIRVJfT1JEOyBsKys7IH0KKwkJZWxzZSBpZiAoY2ggPT0gJyEnKQorCQkJeyBydWxlID0gQ0lQSEVSX0tJTEw7IGwrKzsgfQorCQllbHNlIGlmIChjaCA9PSAnQCcpCisJCQl7IHJ1bGUgPSBDSVBIRVJfU1BFQ0lBTDsgbCsrOyB9CisJCWVsc2UKKwkJCXsgcnVsZSA9IENJUEhFUl9BREQ7IH0KKworCQlpZiAoSVRFTV9TRVAoY2gpKQorCQkJeworCQkJbCsrOworCQkJY29udGludWU7CisJCQl9CisKKwkJYWxnX21rZXkgPSAwOworCQlhbGdfYXV0aCA9IDA7CisJCWFsZ19lbmMgPSAwOworCQlhbGdfbWFjID0gMDsKKwkJYWxnX3NzbCA9IDA7CisJCWFsZ29fc3RyZW5ndGggPSAwOworCisJCXN0YXJ0PWw7CisJCWZvciAoOzspCisJCQl7CisJCQljaCA9ICpsOworCQkJYnVmID0gbDsKKwkJCWJ1ZmxlbiA9IDA7CisjaWZuZGVmIENIQVJTRVRfRUJDRElDCisJCQl3aGlsZSAoCSgoY2ggPj0gJ0EnKSAmJiAoY2ggPD0gJ1onKSkgfHwKKwkJCQkoKGNoID49ICcwJykgJiYgKGNoIDw9ICc5JykpIHx8CisJCQkJKChjaCA+PSAnYScpICYmIChjaCA8PSAneicpKSB8fAorCQkJCSAoY2ggPT0gJy0nKSkKKyNlbHNlCisJCQl3aGlsZSAoCWlzYWxudW0oY2gpIHx8IChjaCA9PSAnLScpKQorI2VuZGlmCisJCQkJIHsKKwkJCQkgY2ggPSAqKCsrbCk7CisJCQkJIGJ1ZmxlbisrOworCQkJCSB9CisKKwkJCWlmIChidWZsZW4gPT0gMCkKKwkJCQl7CisJCQkJLyoKKwkJCQkgKiBXZSBoaXQgc29tZXRoaW5nIHdlIGNhbm5vdCBkZWFsIHdpdGgsCisJCQkJICogaXQgaXMgbm8gY29tbWFuZCBvciBzZXBhcmF0b3Igbm9yCisJCQkJICogYWxwaGFudW1lcmljLCBzbyB3ZSBjYWxsIHRoaXMgYW4gZXJyb3IuCisJCQkJICovCisJCQkJU1NMZXJyKFNTTF9GX1NTTF9DSVBIRVJfUFJPQ0VTU19SVUxFU1RSLAorCQkJCSAgICAgICBTU0xfUl9JTlZBTElEX0NPTU1BTkQpOworCQkJCXJldHZhbCA9IGZvdW5kID0gMDsKKwkJCQlsKys7CisJCQkJYnJlYWs7CisJCQkJfQorCisJCQlpZiAocnVsZSA9PSBDSVBIRVJfU1BFQ0lBTCkKKwkJCQl7CisJCQkJZm91bmQgPSAwOyAvKiB1bnVzZWQgLS0gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworCQkJCWJyZWFrOwkvKiBzcGVjaWFsIHRyZWF0bWVudCAqLworCQkJCX0KKworCQkJLyogY2hlY2sgZm9yIG11bHRpLXBhcnQgc3BlY2lmaWNhdGlvbiAqLworCQkJaWYgKGNoID09ICcrJykKKwkJCQl7CisJCQkJbXVsdGk9MTsKKwkJCQlsKys7CisJCQkJfQorCQkJZWxzZQorCQkJCW11bHRpPTA7CisKKwkJCS8qCisJCQkgKiBOb3cgc2VhcmNoIGZvciB0aGUgY2lwaGVyIGFsaWFzIGluIHRoZSBjYV9saXN0LiBCZSBjYXJlZnVsCisJCQkgKiB3aXRoIHRoZSBzdHJuY21wLCBiZWNhdXNlIHRoZSAiYnVmbGVuIiBsaW1pdGF0aW9uCisJCQkgKiB3aWxsIG1ha2UgdGhlIHJ1bGUgIkFESDpTT01FIiBhbmQgdGhlIGNpcGhlcgorCQkJICogIkFESC1NWS1DSVBIRVIiIGxvb2sgbGlrZSBhIG1hdGNoIGZvciBidWZsZW49My4KKwkJCSAqIFNvIGFkZGl0aW9uYWxseSBjaGVjayB3aGV0aGVyIHRoZSBjaXBoZXIgbmFtZSBmb3VuZAorCQkJICogaGFzIHRoZSBjb3JyZWN0IGxlbmd0aC4gV2UgY2FuIHNhdmUgYSBzdHJsZW4oKSBjYWxsOgorCQkJICoganVzdCBjaGVja2luZyBmb3IgdGhlICdcMCcgYXQgdGhlIHJpZ2h0IHBsYWNlIGlzCisJCQkgKiBzdWZmaWNpZW50LCB3ZSBoYXZlIHRvIHN0cm5jbXAoKSBhbnl3YXkuIChXZSBjYW5ub3QKKwkJCSAqIHVzZSBzdHJjbXAoKSwgYmVjYXVzZSBidWYgaXMgbm90ICdcMCcgdGVybWluYXRlZC4pCisJCQkgKi8KKwkJCWogPSBmb3VuZCA9IDA7CisJCQljaXBoZXJfaWQgPSAwOworCQkJd2hpbGUgKGNhX2xpc3Rbal0pCisJCQkJeworCQkJCWlmICghc3RybmNtcChidWYsIGNhX2xpc3Rbal0tPm5hbWUsIGJ1ZmxlbikgJiYKKwkJCQkgICAgKGNhX2xpc3Rbal0tPm5hbWVbYnVmbGVuXSA9PSAnXDAnKSkKKwkJCQkJeworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQlqKys7CisJCQkJfQorCisJCQlpZiAoIWZvdW5kKQorCQkJCWJyZWFrOwkvKiBpZ25vcmUgdGhpcyBlbnRyeSAqLworCisJCQlpZiAoY2FfbGlzdFtqXS0+YWxnb3JpdGhtX21rZXkpCisJCQkJeworCQkJCWlmIChhbGdfbWtleSkKKwkJCQkJeworCQkJCQlhbGdfbWtleSAmPSBjYV9saXN0W2pdLT5hbGdvcml0aG1fbWtleTsKKwkJCQkJaWYgKCFhbGdfbWtleSkgeyBmb3VuZCA9IDA7IGJyZWFrOyB9CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCWFsZ19ta2V5ID0gY2FfbGlzdFtqXS0+YWxnb3JpdGhtX21rZXk7CisJCQkJfQorCisJCQlpZiAoY2FfbGlzdFtqXS0+YWxnb3JpdGhtX2F1dGgpCisJCQkJeworCQkJCWlmIChhbGdfYXV0aCkKKwkJCQkJeworCQkJCQlhbGdfYXV0aCAmPSBjYV9saXN0W2pdLT5hbGdvcml0aG1fYXV0aDsKKwkJCQkJaWYgKCFhbGdfYXV0aCkgeyBmb3VuZCA9IDA7IGJyZWFrOyB9CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCWFsZ19hdXRoID0gY2FfbGlzdFtqXS0+YWxnb3JpdGhtX2F1dGg7CisJCQkJfQorCQkJCisJCQlpZiAoY2FfbGlzdFtqXS0+YWxnb3JpdGhtX2VuYykKKwkJCQl7CisJCQkJaWYgKGFsZ19lbmMpCisJCQkJCXsKKwkJCQkJYWxnX2VuYyAmPSBjYV9saXN0W2pdLT5hbGdvcml0aG1fZW5jOworCQkJCQlpZiAoIWFsZ19lbmMpIHsgZm91bmQgPSAwOyBicmVhazsgfQorCQkJCQl9CisJCQkJZWxzZQorCQkJCQlhbGdfZW5jID0gY2FfbGlzdFtqXS0+YWxnb3JpdGhtX2VuYzsKKwkJCQl9CisJCQkJCQkKKwkJCWlmIChjYV9saXN0W2pdLT5hbGdvcml0aG1fbWFjKQorCQkJCXsKKwkJCQlpZiAoYWxnX21hYykKKwkJCQkJeworCQkJCQlhbGdfbWFjICY9IGNhX2xpc3Rbal0tPmFsZ29yaXRobV9tYWM7CisJCQkJCWlmICghYWxnX21hYykgeyBmb3VuZCA9IDA7IGJyZWFrOyB9CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCWFsZ19tYWMgPSBjYV9saXN0W2pdLT5hbGdvcml0aG1fbWFjOworCQkJCX0KKwkJCQorCQkJaWYgKGNhX2xpc3Rbal0tPmFsZ29fc3RyZW5ndGggJiBTU0xfRVhQX01BU0spCisJCQkJeworCQkJCWlmIChhbGdvX3N0cmVuZ3RoICYgU1NMX0VYUF9NQVNLKQorCQkJCQl7CisJCQkJCWFsZ29fc3RyZW5ndGggJj0gKGNhX2xpc3Rbal0tPmFsZ29fc3RyZW5ndGggJiBTU0xfRVhQX01BU0spIHwgflNTTF9FWFBfTUFTSzsKKwkJCQkJaWYgKCEoYWxnb19zdHJlbmd0aCAmIFNTTF9FWFBfTUFTSykpIHsgZm91bmQgPSAwOyBicmVhazsgfQorCQkJCQl9CisJCQkJZWxzZQorCQkJCQlhbGdvX3N0cmVuZ3RoIHw9IGNhX2xpc3Rbal0tPmFsZ29fc3RyZW5ndGggJiBTU0xfRVhQX01BU0s7CisJCQkJfQorCisJCQlpZiAoY2FfbGlzdFtqXS0+YWxnb19zdHJlbmd0aCAmIFNTTF9TVFJPTkdfTUFTSykKKwkJCQl7CisJCQkJaWYgKGFsZ29fc3RyZW5ndGggJiBTU0xfU1RST05HX01BU0spCisJCQkJCXsKKwkJCQkJYWxnb19zdHJlbmd0aCAmPSAoY2FfbGlzdFtqXS0+YWxnb19zdHJlbmd0aCAmIFNTTF9TVFJPTkdfTUFTSykgfCB+U1NMX1NUUk9OR19NQVNLOworCQkJCQlpZiAoIShhbGdvX3N0cmVuZ3RoICYgU1NMX1NUUk9OR19NQVNLKSkgeyBmb3VuZCA9IDA7IGJyZWFrOyB9CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCWFsZ29fc3RyZW5ndGggfD0gY2FfbGlzdFtqXS0+YWxnb19zdHJlbmd0aCAmIFNTTF9TVFJPTkdfTUFTSzsKKwkJCQl9CisJCQkKKwkJCWlmIChjYV9saXN0W2pdLT52YWxpZCkKKwkJCQl7CisJCQkJLyogZXhwbGljaXQgY2lwaGVyc3VpdGUgZm91bmQ7IGl0cyBwcm90b2NvbCB2ZXJzaW9uCisJCQkJICogZG9lcyBub3QgYmVjb21lIHBhcnQgb2YgdGhlIHNlYXJjaCBwYXR0ZXJuISovCisKKwkJCQljaXBoZXJfaWQgPSBjYV9saXN0W2pdLT5pZDsKKwkJCQl9CisJCQllbHNlCisJCQkJeworCQkJCS8qIG5vdCBhbiBleHBsaWNpdCBjaXBoZXJzdWl0ZTsgb25seSBpbiB0aGlzIGNhc2UsIHRoZQorCQkJCSAqIHByb3RvY29sIHZlcnNpb24gaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBzZWFyY2ggcGF0dGVybiAqLworCisJCQkJaWYgKGNhX2xpc3Rbal0tPmFsZ29yaXRobV9zc2wpCisJCQkJCXsKKwkJCQkJaWYgKGFsZ19zc2wpCisJCQkJCQl7CisJCQkJCQlhbGdfc3NsICY9IGNhX2xpc3Rbal0tPmFsZ29yaXRobV9zc2w7CisJCQkJCQlpZiAoIWFsZ19zc2wpIHsgZm91bmQgPSAwOyBicmVhazsgfQorCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCQlhbGdfc3NsID0gY2FfbGlzdFtqXS0+YWxnb3JpdGhtX3NzbDsKKwkJCQkJfQorCQkJCX0KKwkJCQorCQkJaWYgKCFtdWx0aSkgYnJlYWs7CisJCQl9CisKKwkJLyoKKwkJICogT2ssIHdlIGhhdmUgdGhlIHJ1bGUsIG5vdyBhcHBseSBpdAorCQkgKi8KKwkJaWYgKHJ1bGUgPT0gQ0lQSEVSX1NQRUNJQUwpCisJCQl7CS8qIHNwZWNpYWwgY29tbWFuZCAqLworCQkJb2sgPSAwOworCQkJaWYgKChidWZsZW4gPT0gOCkgJiYKKwkJCQkhc3RybmNtcChidWYsICJTVFJFTkdUSCIsIDgpKQorCQkJCW9rID0gc3NsX2NpcGhlcl9zdHJlbmd0aF9zb3J0KGhlYWRfcCwgdGFpbF9wKTsKKwkJCWVsc2UKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMX0NJUEhFUl9QUk9DRVNTX1JVTEVTVFIsCisJCQkJCVNTTF9SX0lOVkFMSURfQ09NTUFORCk7CisJCQlpZiAob2sgPT0gMCkKKwkJCQlyZXR2YWwgPSAwOworCQkJLyoKKwkJCSAqIFdlIGRvIG5vdCBzdXBwb3J0IGFueSAibXVsdGkiIG9wdGlvbnMKKwkJCSAqIHRvZ2V0aGVyIHdpdGggIkAiLCBzbyB0aHJvdyBhd2F5IHRoZQorCQkJICogcmVzdCBvZiB0aGUgY29tbWFuZCwgaWYgYW55IGxlZnQsIHVudGlsCisJCQkgKiBlbmQgb3IgJzonIGlzIGZvdW5kLgorCQkJICovCisJCQl3aGlsZSAoKCpsICE9ICdcMCcpICYmICFJVEVNX1NFUCgqbCkpCisJCQkJbCsrOworCQkJfQorCQllbHNlIGlmIChmb3VuZCkKKwkJCXsKKwkJCXNzbF9jaXBoZXJfYXBwbHlfcnVsZShjaXBoZXJfaWQsCisJCQkJYWxnX21rZXksIGFsZ19hdXRoLCBhbGdfZW5jLCBhbGdfbWFjLCBhbGdfc3NsLCBhbGdvX3N0cmVuZ3RoLAorCQkJCXJ1bGUsIC0xLCBoZWFkX3AsIHRhaWxfcCk7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCXdoaWxlICgoKmwgIT0gJ1wwJykgJiYgIUlURU1fU0VQKCpsKSkKKwkJCQlsKys7CisJCQl9CisJCWlmICgqbCA9PSAnXDAnKSBicmVhazsgLyogZG9uZSAqLworCQl9CisKKwlyZXR1cm4ocmV0dmFsKTsKKwl9CisKK1NUQUNLX09GKFNTTF9DSVBIRVIpICpzc2xfY3JlYXRlX2NpcGhlcl9saXN0KGNvbnN0IFNTTF9NRVRIT0QgKnNzbF9tZXRob2QsCisJCVNUQUNLX09GKFNTTF9DSVBIRVIpICoqY2lwaGVyX2xpc3QsCisJCVNUQUNLX09GKFNTTF9DSVBIRVIpICoqY2lwaGVyX2xpc3RfYnlfaWQsCisJCWNvbnN0IGNoYXIgKnJ1bGVfc3RyKQorCXsKKwlpbnQgb2ssIG51bV9vZl9jaXBoZXJzLCBudW1fb2ZfYWxpYXNfbWF4LCBudW1fb2ZfZ3JvdXBfYWxpYXNlczsKKwl1bnNpZ25lZCBsb25nIGRpc2FibGVkX21rZXksIGRpc2FibGVkX2F1dGgsIGRpc2FibGVkX2VuYywgZGlzYWJsZWRfbWFjLCBkaXNhYmxlZF9zc2w7CisJU1RBQ0tfT0YoU1NMX0NJUEhFUikgKmNpcGhlcnN0YWNrLCAqdG1wX2NpcGhlcl9saXN0OworCWNvbnN0IGNoYXIgKnJ1bGVfcDsKKwlDSVBIRVJfT1JERVIgKmNvX2xpc3QgPSBOVUxMLCAqaGVhZCA9IE5VTEwsICp0YWlsID0gTlVMTCwgKmN1cnI7CisJY29uc3QgU1NMX0NJUEhFUiAqKmNhX2xpc3QgPSBOVUxMOworCisJLyoKKwkgKiBSZXR1cm4gd2l0aCBlcnJvciBpZiBub3RoaW5nIHRvIGRvLgorCSAqLworCWlmIChydWxlX3N0ciA9PSBOVUxMIHx8IGNpcGhlcl9saXN0ID09IE5VTEwgfHwgY2lwaGVyX2xpc3RfYnlfaWQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIFRvIHJlZHVjZSB0aGUgd29yayB0byBkbyB3ZSBvbmx5IHdhbnQgdG8gcHJvY2VzcyB0aGUgY29tcGlsZWQKKwkgKiBpbiBhbGdvcml0aG1zLCBzbyB3ZSBmaXJzdCBnZXQgdGhlIG1hc2sgb2YgZGlzYWJsZWQgY2lwaGVycy4KKwkgKi8KKwlzc2xfY2lwaGVyX2dldF9kaXNhYmxlZCgmZGlzYWJsZWRfbWtleSwgJmRpc2FibGVkX2F1dGgsICZkaXNhYmxlZF9lbmMsICZkaXNhYmxlZF9tYWMsICZkaXNhYmxlZF9zc2wpOworCisJLyoKKwkgKiBOb3cgd2UgaGF2ZSB0byBjb2xsZWN0IHRoZSBhdmFpbGFibGUgY2lwaGVycyBmcm9tIHRoZSBjb21waWxlZAorCSAqIGluIGNpcGhlcnMuIFdlIGNhbm5vdCBnZXQgbW9yZSB0aGFuIHRoZSBudW1iZXIgY29tcGlsZWQgaW4sIHNvCisJICogaXQgaXMgdXNlZCBmb3IgYWxsb2NhdGlvbi4KKwkgKi8KKwludW1fb2ZfY2lwaGVycyA9IHNzbF9tZXRob2QtPm51bV9jaXBoZXJzKCk7CisjaWZkZWYgS1NTTF9ERUJVRworCXByaW50Zigic3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCgpIGZvciAlZCBjaXBoZXJzXG4iLCBudW1fb2ZfY2lwaGVycyk7CisjZW5kaWYgICAgLyogS1NTTF9ERUJVRyAqLworCWNvX2xpc3QgPSAoQ0lQSEVSX09SREVSICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKENJUEhFUl9PUkRFUikgKiBudW1fb2ZfY2lwaGVycyk7CisJaWYgKGNvX2xpc3QgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NSRUFURV9DSVBIRVJfTElTVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybihOVUxMKTsJLyogRmFpbHVyZSAqLworCQl9CisKKwlzc2xfY2lwaGVyX2NvbGxlY3RfY2lwaGVycyhzc2xfbWV0aG9kLCBudW1fb2ZfY2lwaGVycywKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZF9ta2V5LCBkaXNhYmxlZF9hdXRoLCBkaXNhYmxlZF9lbmMsIGRpc2FibGVkX21hYywgZGlzYWJsZWRfc3NsLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvX2xpc3QsICZoZWFkLCAmdGFpbCk7CisKKworCS8qIE5vdyBhcnJhbmdlIGFsbCBjaXBoZXJzIGJ5IHByZWZlcmVuY2U6ICovCisKKwkvKiBFdmVyeXRoaW5nIGVsc2UgYmVpbmcgZXF1YWwsIHByZWZlciBlcGhlbWVyYWwgRUNESCBvdmVyIG90aGVyIGtleSBleGNoYW5nZSBtZWNoYW5pc21zICovCisJc3NsX2NpcGhlcl9hcHBseV9ydWxlKDAsIFNTTF9rRUVDREgsIDAsIDAsIDAsIDAsIDAsIENJUEhFUl9BREQsIC0xLCAmaGVhZCwgJnRhaWwpOworCXNzbF9jaXBoZXJfYXBwbHlfcnVsZSgwLCBTU0xfa0VFQ0RILCAwLCAwLCAwLCAwLCAwLCBDSVBIRVJfREVMLCAtMSwgJmhlYWQsICZ0YWlsKTsKKworCS8qIEFFUyBpcyBvdXIgcHJlZmVycmVkIHN5bW1ldHJpYyBjaXBoZXIgKi8KKwlzc2xfY2lwaGVyX2FwcGx5X3J1bGUoMCwgMCwgMCwgU1NMX0FFUywgMCwgMCwgMCwgQ0lQSEVSX0FERCwgLTEsICZoZWFkLCAmdGFpbCk7CisKKwkvKiBUZW1wb3JhcmlseSBlbmFibGUgZXZlcnl0aGluZyBlbHNlIGZvciBzb3J0aW5nICovCisJc3NsX2NpcGhlcl9hcHBseV9ydWxlKDAsIDAsIDAsIDAsIDAsIDAsIDAsIENJUEhFUl9BREQsIC0xLCAmaGVhZCwgJnRhaWwpOworCisJLyogTG93IHByaW9yaXR5IGZvciBNRDUgKi8KKwlzc2xfY2lwaGVyX2FwcGx5X3J1bGUoMCwgMCwgMCwgMCwgU1NMX01ENSwgMCwgMCwgQ0lQSEVSX09SRCwgLTEsICZoZWFkLCAmdGFpbCk7CisKKwkvKiBNb3ZlIGFub255bW91cyBjaXBoZXJzIHRvIHRoZSBlbmQuICBVc3VhbGx5LCB0aGVzZSB3aWxsIHJlbWFpbiBkaXNhYmxlZC4KKwkgKiAoRm9yIGFwcGxpY2F0aW9ucyB0aGF0IGFsbG93IHRoZW0sIHRoZXkgYXJlbid0IHRvbyBiYWQsIGJ1dCB3ZSBwcmVmZXIKKwkgKiBhdXRoZW50aWNhdGVkIGNpcGhlcnMuKSAqLworCXNzbF9jaXBoZXJfYXBwbHlfcnVsZSgwLCAwLCBTU0xfYU5VTEwsIDAsIDAsIDAsIDAsIENJUEhFUl9PUkQsIC0xLCAmaGVhZCwgJnRhaWwpOworCisJLyogTW92ZSBjaXBoZXJzIHdpdGhvdXQgZm9yd2FyZCBzZWNyZWN5IHRvIHRoZSBlbmQgKi8KKwlzc2xfY2lwaGVyX2FwcGx5X3J1bGUoMCwgMCwgU1NMX2FFQ0RILCAwLCAwLCAwLCAwLCBDSVBIRVJfT1JELCAtMSwgJmhlYWQsICZ0YWlsKTsKKwkvKiBzc2xfY2lwaGVyX2FwcGx5X3J1bGUoMCwgMCwgU1NMX2FESCwgMCwgMCwgMCwgMCwgQ0lQSEVSX09SRCwgLTEsICZoZWFkLCAmdGFpbCk7ICovCisJc3NsX2NpcGhlcl9hcHBseV9ydWxlKDAsIFNTTF9rUlNBLCAwLCAwLCAwLCAwLCAwLCBDSVBIRVJfT1JELCAtMSwgJmhlYWQsICZ0YWlsKTsKKwlzc2xfY2lwaGVyX2FwcGx5X3J1bGUoMCwgU1NMX2tQU0ssIDAsMCwgMCwgMCwgMCwgQ0lQSEVSX09SRCwgLTEsICZoZWFkLCAmdGFpbCk7CisJc3NsX2NpcGhlcl9hcHBseV9ydWxlKDAsIFNTTF9rS1JCNSwgMCwwLCAwLCAwLCAwLCBDSVBIRVJfT1JELCAtMSwgJmhlYWQsICZ0YWlsKTsKKworCS8qIFJDNCBpcyBzb3J0LW9mIGJyb2tlbiAtLSBtb3ZlIHRoZSB0aGUgZW5kICovCisJc3NsX2NpcGhlcl9hcHBseV9ydWxlKDAsIDAsIDAsIFNTTF9SQzQsIDAsIDAsIDAsIENJUEhFUl9PUkQsIC0xLCAmaGVhZCwgJnRhaWwpOworCisJLyogTm93IHNvcnQgYnkgc3ltbWV0cmljIGVuY3J5cHRpb24gc3RyZW5ndGguICBUaGUgYWJvdmUgb3JkZXJpbmcgcmVtYWlucworCSAqIGluIGZvcmNlIHdpdGhpbiBlYWNoIGNsYXNzICovCisJaWYgKCFzc2xfY2lwaGVyX3N0cmVuZ3RoX3NvcnQoJmhlYWQsICZ0YWlsKSkKKwkJeworCQlPUEVOU1NMX2ZyZWUoY29fbGlzdCk7CisJCXJldHVybiBOVUxMOworCQl9CisKKwkvKiBOb3cgZGlzYWJsZSBldmVyeXRoaW5nIChtYWludGFpbmluZyB0aGUgb3JkZXJpbmchKSAqLworCXNzbF9jaXBoZXJfYXBwbHlfcnVsZSgwLCAwLCAwLCAwLCAwLCAwLCAwLCBDSVBIRVJfREVMLCAtMSwgJmhlYWQsICZ0YWlsKTsKKworCisJLyoKKwkgKiBXZSBhbHNvIG5lZWQgY2lwaGVyIGFsaWFzZXMgZm9yIHNlbGVjdGluZyBiYXNlZCBvbiB0aGUgcnVsZV9zdHIuCisJICogVGhlcmUgbWlnaHQgYmUgdHdvIHR5cGVzIG9mIGVudHJpZXMgaW4gdGhlIHJ1bGVfc3RyOiAxKSBuYW1lcworCSAqIG9mIGNpcGhlcnMgdGhlbXNlbHZlcyAyKSBhbGlhc2VzIGZvciBncm91cHMgb2YgY2lwaGVycy4KKwkgKiBGb3IgMSkgd2UgbmVlZCB0aGUgYXZhaWxhYmxlIGNpcGhlcnMgYW5kIGZvciAyKSB0aGUgY2lwaGVyCisJICogZ3JvdXBzIG9mIGNpcGhlcl9hbGlhc2VzIGFkZGVkIHRvZ2V0aGVyIGluIG9uZSBsaXN0IChvdGhlcndpc2UKKwkgKiB3ZSB3b3VsZCBiZSBoYXBweSB3aXRoIGp1c3QgdGhlIGNpcGhlcl9hbGlhc2VzIHRhYmxlKS4KKwkgKi8KKwludW1fb2ZfZ3JvdXBfYWxpYXNlcyA9IHNpemVvZihjaXBoZXJfYWxpYXNlcykgLyBzaXplb2YoU1NMX0NJUEhFUik7CisJbnVtX29mX2FsaWFzX21heCA9IG51bV9vZl9jaXBoZXJzICsgbnVtX29mX2dyb3VwX2FsaWFzZXMgKyAxOworCWNhX2xpc3QgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoU1NMX0NJUEhFUiAqKSAqIG51bV9vZl9hbGlhc19tYXgpOworCWlmIChjYV9saXN0ID09IE5VTEwpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGNvX2xpc3QpOworCQlTU0xlcnIoU1NMX0ZfU1NMX0NSRUFURV9DSVBIRVJfTElTVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybihOVUxMKTsJLyogRmFpbHVyZSAqLworCQl9CisJc3NsX2NpcGhlcl9jb2xsZWN0X2FsaWFzZXMoY2FfbGlzdCwgbnVtX29mX2dyb3VwX2FsaWFzZXMsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRfbWtleSwgZGlzYWJsZWRfYXV0aCwgZGlzYWJsZWRfZW5jLAorCQkJCSAgIGRpc2FibGVkX21hYywgZGlzYWJsZWRfc3NsLCBoZWFkKTsKKworCS8qCisJICogSWYgdGhlIHJ1bGVfc3RyaW5nIGJlZ2lucyB3aXRoIERFRkFVTFQsIGFwcGx5IHRoZSBkZWZhdWx0IHJ1bGUKKwkgKiBiZWZvcmUgdXNpbmcgdGhlIChwb3NzaWJseSBhdmFpbGFibGUpIGFkZGl0aW9uYWwgcnVsZXMuCisJICovCisJb2sgPSAxOworCXJ1bGVfcCA9IHJ1bGVfc3RyOworCWlmIChzdHJuY21wKHJ1bGVfc3RyLCJERUZBVUxUIiw3KSA9PSAwKQorCQl7CisJCW9rID0gc3NsX2NpcGhlcl9wcm9jZXNzX3J1bGVzdHIoU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QsCisJCQkmaGVhZCwgJnRhaWwsIGNhX2xpc3QpOworCQlydWxlX3AgKz0gNzsKKwkJaWYgKCpydWxlX3AgPT0gJzonKQorCQkJcnVsZV9wKys7CisJCX0KKworCWlmIChvayAmJiAoc3RybGVuKHJ1bGVfcCkgPiAwKSkKKwkJb2sgPSBzc2xfY2lwaGVyX3Byb2Nlc3NfcnVsZXN0cihydWxlX3AsICZoZWFkLCAmdGFpbCwgY2FfbGlzdCk7CisKKwlPUEVOU1NMX2ZyZWUoKHZvaWQgKiljYV9saXN0KTsJLyogTm90IG5lZWRlZCBhbnltb3JlICovCisKKwlpZiAoIW9rKQorCQl7CS8qIFJ1bGUgcHJvY2Vzc2luZyBmYWlsdXJlICovCisJCU9QRU5TU0xfZnJlZShjb19saXN0KTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJCisJLyoKKwkgKiBBbGxvY2F0ZSBuZXcgImNpcGhlcnN0YWNrIiBmb3IgdGhlIHJlc3VsdCwgcmV0dXJuIHdpdGggZXJyb3IKKwkgKiBpZiB3ZSBjYW5ub3QgZ2V0IG9uZS4KKwkgKi8KKwlpZiAoKGNpcGhlcnN0YWNrID0gc2tfU1NMX0NJUEhFUl9uZXdfbnVsbCgpKSA9PSBOVUxMKQorCQl7CisJCU9QRU5TU0xfZnJlZShjb19saXN0KTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisKKwkvKgorCSAqIFRoZSBjaXBoZXIgc2VsZWN0aW9uIGZvciB0aGUgbGlzdCBpcyBkb25lLiBUaGUgY2lwaGVycyBhcmUgYWRkZWQKKwkgKiB0byB0aGUgcmVzdWx0aW5nIHByZWNlZGVuY2UgdG8gdGhlIFNUQUNLX09GKFNTTF9DSVBIRVIpLgorCSAqLworCWZvciAoY3VyciA9IGhlYWQ7IGN1cnIgIT0gTlVMTDsgY3VyciA9IGN1cnItPm5leHQpCisJCXsKKwkJaWYgKGN1cnItPmFjdGl2ZSkKKwkJCXsKKwkJCXNrX1NTTF9DSVBIRVJfcHVzaChjaXBoZXJzdGFjaywgY3Vyci0+Y2lwaGVyKTsKKyNpZmRlZiBDSVBIRVJfREVCVUcKKwkJCXByaW50ZigiPCVzPlxuIixjdXJyLT5jaXBoZXItPm5hbWUpOworI2VuZGlmCisJCQl9CisJCX0KKwlPUEVOU1NMX2ZyZWUoY29fbGlzdCk7CS8qIE5vdCBuZWVkZWQgYW55IGxvbmdlciAqLworCisJdG1wX2NpcGhlcl9saXN0ID0gc2tfU1NMX0NJUEhFUl9kdXAoY2lwaGVyc3RhY2spOworCWlmICh0bXBfY2lwaGVyX2xpc3QgPT0gTlVMTCkKKwkJeworCQlza19TU0xfQ0lQSEVSX2ZyZWUoY2lwaGVyc3RhY2spOworCQlyZXR1cm4gTlVMTDsKKwkJfQorCWlmICgqY2lwaGVyX2xpc3QgIT0gTlVMTCkKKwkJc2tfU1NMX0NJUEhFUl9mcmVlKCpjaXBoZXJfbGlzdCk7CisJKmNpcGhlcl9saXN0ID0gY2lwaGVyc3RhY2s7CisJaWYgKCpjaXBoZXJfbGlzdF9ieV9pZCAhPSBOVUxMKQorCQlza19TU0xfQ0lQSEVSX2ZyZWUoKmNpcGhlcl9saXN0X2J5X2lkKTsKKwkqY2lwaGVyX2xpc3RfYnlfaWQgPSB0bXBfY2lwaGVyX2xpc3Q7CisJKHZvaWQpc2tfU1NMX0NJUEhFUl9zZXRfY21wX2Z1bmMoKmNpcGhlcl9saXN0X2J5X2lkLHNzbF9jaXBoZXJfcHRyX2lkX2NtcCk7CisKKwlza19TU0xfQ0lQSEVSX3NvcnQoKmNpcGhlcl9saXN0X2J5X2lkKTsKKwlyZXR1cm4oY2lwaGVyc3RhY2spOworCX0KKworY2hhciAqU1NMX0NJUEhFUl9kZXNjcmlwdGlvbihjb25zdCBTU0xfQ0lQSEVSICpjaXBoZXIsIGNoYXIgKmJ1ZiwgaW50IGxlbikKKwl7CisJaW50IGlzX2V4cG9ydCxwa2wsa2w7CisJY29uc3QgY2hhciAqdmVyLCpleHBfc3RyOworCWNvbnN0IGNoYXIgKmt4LCphdSwqZW5jLCptYWM7CisJdW5zaWduZWQgbG9uZyBhbGdfbWtleSxhbGdfYXV0aCxhbGdfZW5jLGFsZ19tYWMsYWxnX3NzbCxhbGcyLGFsZ19zOworI2lmZGVmIEtTU0xfREVCVUcKKwlzdGF0aWMgY29uc3QgY2hhciAqZm9ybWF0PSIlLTIzcyAlcyBLeD0lLThzIEF1PSUtNHMgRW5jPSUtOXMgTWFjPSUtNHMlcyBBTD0lbHgvJWx4LyVseC8lbHgvJWx4XG4iOworI2Vsc2UKKwlzdGF0aWMgY29uc3QgY2hhciAqZm9ybWF0PSIlLTIzcyAlcyBLeD0lLThzIEF1PSUtNHMgRW5jPSUtOXMgTWFjPSUtNHMlc1xuIjsKKyNlbmRpZiAvKiBLU1NMX0RFQlVHICovCisKKwlhbGdfbWtleSA9IGNpcGhlci0+YWxnb3JpdGhtX21rZXk7CisJYWxnX2F1dGggPSBjaXBoZXItPmFsZ29yaXRobV9hdXRoOworCWFsZ19lbmMgPSBjaXBoZXItPmFsZ29yaXRobV9lbmM7CisJYWxnX21hYyA9IGNpcGhlci0+YWxnb3JpdGhtX21hYzsKKwlhbGdfc3NsID0gY2lwaGVyLT5hbGdvcml0aG1fc3NsOworCisJYWxnX3M9Y2lwaGVyLT5hbGdvX3N0cmVuZ3RoOworCWFsZzI9Y2lwaGVyLT5hbGdvcml0aG0yOworCisJaXNfZXhwb3J0PVNTTF9DX0lTX0VYUE9SVChjaXBoZXIpOworCXBrbD1TU0xfQ19FWFBPUlRfUEtFWUxFTkdUSChjaXBoZXIpOworCWtsPVNTTF9DX0VYUE9SVF9LRVlMRU5HVEgoY2lwaGVyKTsKKwlleHBfc3RyPWlzX2V4cG9ydD8iIGV4cG9ydCI6IiI7CisJCisJaWYgKGFsZ19zc2wgJiBTU0xfU1NMVjIpCisJCXZlcj0iU1NMdjIiOworCWVsc2UgaWYgKGFsZ19zc2wgJiBTU0xfU1NMVjMpCisJCXZlcj0iU1NMdjMiOworCWVsc2UKKwkJdmVyPSJ1bmtub3duIjsKKworCXN3aXRjaCAoYWxnX21rZXkpCisJCXsKKwljYXNlIFNTTF9rUlNBOgorCQlreD1pc19leHBvcnQ/KHBrbCA9PSA1MTIgPyAiUlNBKDUxMikiIDogIlJTQSgxMDI0KSIpOiJSU0EiOworCQlicmVhazsKKwljYXNlIFNTTF9rREhyOgorCQlreD0iREgvUlNBIjsKKwkJYnJlYWs7CisJY2FzZSBTU0xfa0RIZDoKKwkJa3g9IkRIL0RTUyI7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNTTF9rS1JCNToKKwkJa3g9IktSQjUiOworCQlicmVhazsKKwljYXNlIFNTTF9rRURIOgorCQlreD1pc19leHBvcnQ/KHBrbCA9PSA1MTIgPyAiREgoNTEyKSIgOiAiREgoMTAyNCkiKToiREgiOworCQlicmVhazsKKwljYXNlIFNTTF9rRUNESHI6CisJCWt4PSJFQ0RIL1JTQSI7CisJCWJyZWFrOworCWNhc2UgU1NMX2tFQ0RIZToKKwkJa3g9IkVDREgvRUNEU0EiOworCQlicmVhazsKKwljYXNlIFNTTF9rRUVDREg6CisJCWt4PSJFQ0RIIjsKKwkJYnJlYWs7CisJY2FzZSBTU0xfa1BTSzoKKwkJa3g9IlBTSyI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWt4PSJ1bmtub3duIjsKKwkJfQorCisJc3dpdGNoIChhbGdfYXV0aCkKKwkJeworCWNhc2UgU1NMX2FSU0E6CisJCWF1PSJSU0EiOworCQlicmVhazsKKwljYXNlIFNTTF9hRFNTOgorCQlhdT0iRFNTIjsKKwkJYnJlYWs7CisJY2FzZSBTU0xfYURIOgorCQlhdT0iREgiOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTU0xfYUtSQjU6CisJCWF1PSJLUkI1IjsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU1NMX2FFQ0RIOgorCQlhdT0iRUNESCI7CisJCWJyZWFrOworCWNhc2UgU1NMX2FOVUxMOgorCQlhdT0iTm9uZSI7CisJCWJyZWFrOworCWNhc2UgU1NMX2FFQ0RTQToKKwkJYXU9IkVDRFNBIjsKKwkJYnJlYWs7CisJY2FzZSBTU0xfYVBTSzoKKwkJYXU9IlBTSyI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWF1PSJ1bmtub3duIjsKKwkJYnJlYWs7CisJCX0KKworCXN3aXRjaCAoYWxnX2VuYykKKwkJeworCWNhc2UgU1NMX0RFUzoKKwkJZW5jPShpc19leHBvcnQgJiYga2wgPT0gNSk/IkRFUyg0MCkiOiJERVMoNTYpIjsKKwkJYnJlYWs7CisJY2FzZSBTU0xfM0RFUzoKKwkJZW5jPSIzREVTKDE2OCkiOworCQlicmVhazsKKwljYXNlIFNTTF9SQzQ6CisJCWVuYz1pc19leHBvcnQ/KGtsID09IDUgPyAiUkM0KDQwKSIgOiAiUkM0KDU2KSIpCisJCSAgOigoYWxnMiZTU0wyX0NGXzhfQllURV9FTkMpPyJSQzQoNjQpIjoiUkM0KDEyOCkiKTsKKwkJYnJlYWs7CisJY2FzZSBTU0xfUkMyOgorCQllbmM9aXNfZXhwb3J0PyhrbCA9PSA1ID8gIlJDMig0MCkiIDogIlJDMig1NikiKToiUkMyKDEyOCkiOworCQlicmVhazsKKwljYXNlIFNTTF9JREVBOgorCQllbmM9IklERUEoMTI4KSI7CisJCWJyZWFrOworCWNhc2UgU1NMX2VOVUxMOgorCQllbmM9Ik5vbmUiOworCQlicmVhazsKKwljYXNlIFNTTF9BRVMxMjg6CisJCWVuYz0iQUVTKDEyOCkiOworCQlicmVhazsKKwljYXNlIFNTTF9BRVMyNTY6CisJCWVuYz0iQUVTKDI1NikiOworCQlicmVhazsKKwljYXNlIFNTTF9DQU1FTExJQTEyODoKKwkJZW5jPSJDYW1lbGxpYSgxMjgpIjsKKwkJYnJlYWs7CisJY2FzZSBTU0xfQ0FNRUxMSUEyNTY6CisJCWVuYz0iQ2FtZWxsaWEoMjU2KSI7CisJCWJyZWFrOworCWNhc2UgU1NMX1NFRUQ6CisJCWVuYz0iU0VFRCgxMjgpIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZW5jPSJ1bmtub3duIjsKKwkJYnJlYWs7CisJCX0KKworCXN3aXRjaCAoYWxnX21hYykKKwkJeworCWNhc2UgU1NMX01ENToKKwkJbWFjPSJNRDUiOworCQlicmVhazsKKwljYXNlIFNTTF9TSEExOgorCQltYWM9IlNIQTEiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltYWM9InVua25vd24iOworCQlicmVhazsKKwkJfQorCisJaWYgKGJ1ZiA9PSBOVUxMKQorCQl7CisJCWxlbj0xMjg7CisJCWJ1Zj1PUEVOU1NMX21hbGxvYyhsZW4pOworCQlpZiAoYnVmID09IE5VTEwpIHJldHVybigiT1BFTlNTTF9tYWxsb2MgRXJyb3IiKTsKKwkJfQorCWVsc2UgaWYgKGxlbiA8IDEyOCkKKwkJcmV0dXJuKCJCdWZmZXIgdG9vIHNtYWxsIik7CisKKyNpZmRlZiBLU1NMX0RFQlVHCisJQklPX3NucHJpbnRmKGJ1ZixsZW4sZm9ybWF0LGNpcGhlci0+bmFtZSx2ZXIsa3gsYXUsZW5jLG1hYyxleHBfc3RyLGFsZ19ta2V5LGFsZ19hdXRoLGFsZ19lbmMsYWxnX21hYyxhbGdfc3NsKTsKKyNlbHNlCisJQklPX3NucHJpbnRmKGJ1ZixsZW4sZm9ybWF0LGNpcGhlci0+bmFtZSx2ZXIsa3gsYXUsZW5jLG1hYyxleHBfc3RyKTsKKyNlbmRpZiAvKiBLU1NMX0RFQlVHICovCisJcmV0dXJuKGJ1Zik7CisJfQorCitjaGFyICpTU0xfQ0lQSEVSX2dldF92ZXJzaW9uKGNvbnN0IFNTTF9DSVBIRVIgKmMpCisJeworCWludCBpOworCisJaWYgKGMgPT0gTlVMTCkgcmV0dXJuKCIoTk9ORSkiKTsKKwlpPShpbnQpKGMtPmlkPj4yNEwpOworCWlmIChpID09IDMpCisJCXJldHVybigiVExTdjEvU1NMdjMiKTsKKwllbHNlIGlmIChpID09IDIpCisJCXJldHVybigiU1NMdjIiKTsKKwllbHNlCisJCXJldHVybigidW5rbm93biIpOworCX0KKworLyogcmV0dXJuIHRoZSBhY3R1YWwgY2lwaGVyIGJlaW5nIHVzZWQgKi8KK2NvbnN0IGNoYXIgKlNTTF9DSVBIRVJfZ2V0X25hbWUoY29uc3QgU1NMX0NJUEhFUiAqYykKKwl7CisJaWYgKGMgIT0gTlVMTCkKKwkJcmV0dXJuKGMtPm5hbWUpOworCXJldHVybigiKE5PTkUpIik7CisJfQorCisvKiBudW1iZXIgb2YgYml0cyBmb3Igc3ltbWV0cmljIGNpcGhlciAqLworaW50IFNTTF9DSVBIRVJfZ2V0X2JpdHMoY29uc3QgU1NMX0NJUEhFUiAqYywgaW50ICphbGdfYml0cykKKwl7CisJaW50IHJldD0wOworCisJaWYgKGMgIT0gTlVMTCkKKwkJeworCQlpZiAoYWxnX2JpdHMgIT0gTlVMTCkgKmFsZ19iaXRzID0gYy0+YWxnX2JpdHM7CisJCXJldCA9IGMtPnN0cmVuZ3RoX2JpdHM7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK1NTTF9DT01QICpzc2wzX2NvbXBfZmluZChTVEFDS19PRihTU0xfQ09NUCkgKnNrLCBpbnQgbikKKwl7CisJU1NMX0NPTVAgKmN0bXA7CisJaW50IGksbm47CisKKwlpZiAoKG4gPT0gMCkgfHwgKHNrID09IE5VTEwpKSByZXR1cm4oTlVMTCk7CisJbm49c2tfU1NMX0NPTVBfbnVtKHNrKTsKKwlmb3IgKGk9MDsgaTxubjsgaSsrKQorCQl7CisJCWN0bXA9c2tfU1NMX0NPTVBfdmFsdWUoc2ssaSk7CisJCWlmIChjdG1wLT5pZCA9PSBuKQorCQkJcmV0dXJuKGN0bXApOworCQl9CisJcmV0dXJuKE5VTEwpOworCX0KKworI2lmZGVmIE9QRU5TU0xfTk9fQ09NUAordm9pZCAqU1NMX0NPTVBfZ2V0X2NvbXByZXNzaW9uX21ldGhvZHModm9pZCkKKwl7CisJcmV0dXJuIE5VTEw7CisJfQoraW50IFNTTF9DT01QX2FkZF9jb21wcmVzc2lvbl9tZXRob2QoaW50IGlkLCB2b2lkICpjbSkKKwl7CisJcmV0dXJuIDE7CisJfQorCitjb25zdCBjaGFyICpTU0xfQ09NUF9nZXRfbmFtZShjb25zdCB2b2lkICpjb21wKQorCXsKKwlyZXR1cm4gTlVMTDsKKwl9CisjZWxzZQorU1RBQ0tfT0YoU1NMX0NPTVApICpTU0xfQ09NUF9nZXRfY29tcHJlc3Npb25fbWV0aG9kcyh2b2lkKQorCXsKKwlsb2FkX2J1aWx0aW5fY29tcHJlc3Npb25zKCk7CisJcmV0dXJuKHNzbF9jb21wX21ldGhvZHMpOworCX0KKworaW50IFNTTF9DT01QX2FkZF9jb21wcmVzc2lvbl9tZXRob2QoaW50IGlkLCBDT01QX01FVEhPRCAqY20pCisJeworCVNTTF9DT01QICpjb21wOworCisgICAgICAgIGlmIChjbSA9PSBOVUxMIHx8IGNtLT50eXBlID09IE5JRF91bmRlZikKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworCS8qIEFjY29yZGluZyB0byBkcmFmdC1pZXRmLXRscy1jb21wcmVzc2lvbi0wNC50eHQsIHRoZQorCSAgIGNvbXByZXNzaW9uIG51bWJlciByYW5nZXMgc2hvdWxkIGJlIHRoZSBmb2xsb3dpbmc6CisKKwkgICAwIHRvIDYzOiAgICBtZXRob2RzIGRlZmluZWQgYnkgdGhlIElFVEYKKwkgICA2NCB0byAxOTI6ICBleHRlcm5hbCBwYXJ0eSBtZXRob2RzIGFzc2lnbmVkIGJ5IElBTkEKKwkgICAxOTMgdG8gMjU1OiByZXNlcnZlZCBmb3IgcHJpdmF0ZSB1c2UgKi8KKwlpZiAoaWQgPCAxOTMgfHwgaWQgPiAyNTUpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DT01QX0FERF9DT01QUkVTU0lPTl9NRVRIT0QsU1NMX1JfQ09NUFJFU1NJT05fSURfTk9UX1dJVEhJTl9QUklWQVRFX1JBTkdFKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCU1lbUNoZWNrX29mZigpOworCWNvbXA9KFNTTF9DT01QICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFNTTF9DT01QKSk7CisJY29tcC0+aWQ9aWQ7CisJY29tcC0+bWV0aG9kPWNtOworCWxvYWRfYnVpbHRpbl9jb21wcmVzc2lvbnMoKTsKKwlpZiAoc3NsX2NvbXBfbWV0aG9kcworCQkmJiBza19TU0xfQ09NUF9maW5kKHNzbF9jb21wX21ldGhvZHMsY29tcCkgPj0gMCkKKwkJeworCQlPUEVOU1NMX2ZyZWUoY29tcCk7CisJCU1lbUNoZWNrX29uKCk7CisJCVNTTGVycihTU0xfRl9TU0xfQ09NUF9BRERfQ09NUFJFU1NJT05fTUVUSE9ELFNTTF9SX0RVUExJQ0FURV9DT01QUkVTU0lPTl9JRCk7CisJCXJldHVybigxKTsKKwkJfQorCWVsc2UgaWYgKChzc2xfY29tcF9tZXRob2RzID09IE5VTEwpCisJCXx8ICFza19TU0xfQ09NUF9wdXNoKHNzbF9jb21wX21ldGhvZHMsY29tcCkpCisJCXsKKwkJT1BFTlNTTF9mcmVlKGNvbXApOworCQlNZW1DaGVja19vbigpOworCQlTU0xlcnIoU1NMX0ZfU1NMX0NPTVBfQUREX0NPTVBSRVNTSU9OX01FVEhPRCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybigxKTsKKwkJfQorCWVsc2UKKwkJeworCQlNZW1DaGVja19vbigpOworCQlyZXR1cm4oMCk7CisJCX0KKwl9CisKK2NvbnN0IGNoYXIgKlNTTF9DT01QX2dldF9uYW1lKGNvbnN0IENPTVBfTUVUSE9EICpjb21wKQorCXsKKwlpZiAoY29tcCkKKwkJcmV0dXJuIGNvbXAtPm5hbWU7CisJcmV0dXJuIE5VTEw7CisJfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zc2xfZXJyLmMgYi9saWIvb3BlbnNzbC9zc2wvc3NsX2Vyci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjdkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvc3NsX2Vyci5jCkBAIC0wLDAgKzEsNTcyIEBACisvKiBzc2wvc3NsX2Vyci5jICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDkgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQE9wZW5TU0wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lk9wZW5TU0wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKworLyogTk9URTogdGhpcyBmaWxlIHdhcyBhdXRvIGdlbmVyYXRlZCBieSB0aGUgbWtlcnIucGwgc2NyaXB0OiBhbnkgY2hhbmdlcworICogbWFkZSB0byBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIHNjcmlwdCBuZXh0IHVwZGF0ZXMgdGhpcyBmaWxlLAorICogb25seSByZWFzb24gc3RyaW5ncyB3aWxsIGJlIHByZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisKKy8qIEJFR0lOIEVSUk9SIENPREVTICovCisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKyNkZWZpbmUgRVJSX0ZVTkMoZnVuYykgRVJSX1BBQ0soRVJSX0xJQl9TU0wsZnVuYywwKQorI2RlZmluZSBFUlJfUkVBU09OKHJlYXNvbikgRVJSX1BBQ0soRVJSX0xJQl9TU0wsMCxyZWFzb24pCisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgU1NMX3N0cl9mdW5jdHNbXT0KKwl7Cit7RVJSX0ZVTkMoU1NMX0ZfQ0xJRU5UX0NFUlRJRklDQVRFKSwJIkNMSUVOVF9DRVJUSUZJQ0FURSJ9LAore0VSUl9GVU5DKFNTTF9GX0NMSUVOVF9GSU5JU0hFRCksCSJDTElFTlRfRklOSVNIRUQifSwKK3tFUlJfRlVOQyhTU0xfRl9DTElFTlRfSEVMTE8pLAkiQ0xJRU5UX0hFTExPIn0sCit7RVJSX0ZVTkMoU1NMX0ZfQ0xJRU5UX01BU1RFUl9LRVkpLAkiQ0xJRU5UX01BU1RFUl9LRVkifSwKK3tFUlJfRlVOQyhTU0xfRl9EMklfU1NMX1NFU1NJT04pLAkiZDJpX1NTTF9TRVNTSU9OIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRE9fRFRMUzFfV1JJVEUpLAkiRE9fRFRMUzFfV1JJVEUifSwKK3tFUlJfRlVOQyhTU0xfRl9ET19TU0wzX1dSSVRFKSwJIkRPX1NTTDNfV1JJVEUifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9BQ0NFUFQpLAkiRFRMUzFfQUNDRVBUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfQUREX0NFUlRfVE9fQlVGKSwJIkRUTFMxX0FERF9DRVJUX1RPX0JVRiJ9LAore0VSUl9GVU5DKFNTTF9GX0RUTFMxX0JVRkZFUl9SRUNPUkQpLAkiRFRMUzFfQlVGRkVSX1JFQ09SRCJ9LAore0VSUl9GVU5DKFNTTF9GX0RUTFMxX0NMSUVOVF9IRUxMTyksCSJEVExTMV9DTElFTlRfSEVMTE8ifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9DT05ORUNUKSwJIkRUTFMxX0NPTk5FQ1QifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9FTkMpLAkiRFRMUzFfRU5DIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfR0VUX0hFTExPX1ZFUklGWSksCSJEVExTMV9HRVRfSEVMTE9fVkVSSUZZIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfR0VUX01FU1NBR0UpLAkiRFRMUzFfR0VUX01FU1NBR0UifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9HRVRfTUVTU0FHRV9GUkFHTUVOVCksCSJEVExTMV9HRVRfTUVTU0FHRV9GUkFHTUVOVCJ9LAore0VSUl9GVU5DKFNTTF9GX0RUTFMxX0dFVF9SRUNPUkQpLAkiRFRMUzFfR0VUX1JFQ09SRCJ9LAore0VSUl9GVU5DKFNTTF9GX0RUTFMxX0hBTkRMRV9USU1FT1VUKSwJIkRUTFMxX0hBTkRMRV9USU1FT1VUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfT1VUUFVUX0NFUlRfQ0hBSU4pLAkiRFRMUzFfT1VUUFVUX0NFUlRfQ0hBSU4ifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9QUkVQUk9DRVNTX0ZSQUdNRU5UKSwJIkRUTFMxX1BSRVBST0NFU1NfRlJBR01FTlQifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9QUk9DRVNTX09VVF9PRl9TRVFfTUVTU0FHRSksCSJEVExTMV9QUk9DRVNTX09VVF9PRl9TRVFfTUVTU0FHRSJ9LAore0VSUl9GVU5DKFNTTF9GX0RUTFMxX1BST0NFU1NfUkVDT1JEKSwJIkRUTFMxX1BST0NFU1NfUkVDT1JEIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfUkVBRF9CWVRFUyksCSJEVExTMV9SRUFEX0JZVEVTIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfUkVBRF9GQUlMRUQpLAkiRFRMUzFfUkVBRF9GQUlMRUQifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9TRU5EX0NFUlRJRklDQVRFX1JFUVVFU1QpLAkiRFRMUzFfU0VORF9DRVJUSUZJQ0FURV9SRVFVRVNUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfQ0VSVElGSUNBVEUpLAkiRFRMUzFfU0VORF9DTElFTlRfQ0VSVElGSUNBVEUifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UpLAkiRFRMUzFfU0VORF9DTElFTlRfS0VZX0VYQ0hBTkdFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfU0VORF9DTElFTlRfVkVSSUZZKSwJIkRUTFMxX1NFTkRfQ0xJRU5UX1ZFUklGWSJ9LAore0VSUl9GVU5DKFNTTF9GX0RUTFMxX1NFTkRfSEVMTE9fVkVSSUZZX1JFUVVFU1QpLAkiRFRMUzFfU0VORF9IRUxMT19WRVJJRllfUkVRVUVTVCJ9LAore0VSUl9GVU5DKFNTTF9GX0RUTFMxX1NFTkRfU0VSVkVSX0NFUlRJRklDQVRFKSwJIkRUTFMxX1NFTkRfU0VSVkVSX0NFUlRJRklDQVRFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfU0VORF9TRVJWRVJfSEVMTE8pLAkiRFRMUzFfU0VORF9TRVJWRVJfSEVMTE8ifSwKK3tFUlJfRlVOQyhTU0xfRl9EVExTMV9TRU5EX1NFUlZFUl9LRVlfRVhDSEFOR0UpLAkiRFRMUzFfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfRFRMUzFfV1JJVEVfQVBQX0RBVEFfQllURVMpLAkiRFRMUzFfV1JJVEVfQVBQX0RBVEFfQllURVMifSwKK3tFUlJfRlVOQyhTU0xfRl9HRVRfQ0xJRU5UX0ZJTklTSEVEKSwJIkdFVF9DTElFTlRfRklOSVNIRUQifSwKK3tFUlJfRlVOQyhTU0xfRl9HRVRfQ0xJRU5UX0hFTExPKSwJIkdFVF9DTElFTlRfSEVMTE8ifSwKK3tFUlJfRlVOQyhTU0xfRl9HRVRfQ0xJRU5UX01BU1RFUl9LRVkpLAkiR0VUX0NMSUVOVF9NQVNURVJfS0VZIn0sCit7RVJSX0ZVTkMoU1NMX0ZfR0VUX1NFUlZFUl9GSU5JU0hFRCksCSJHRVRfU0VSVkVSX0ZJTklTSEVEIn0sCit7RVJSX0ZVTkMoU1NMX0ZfR0VUX1NFUlZFUl9IRUxMTyksCSJHRVRfU0VSVkVSX0hFTExPIn0sCit7RVJSX0ZVTkMoU1NMX0ZfR0VUX1NFUlZFUl9WRVJJRlkpLAkiR0VUX1NFUlZFUl9WRVJJRlkifSwKK3tFUlJfRlVOQyhTU0xfRl9JMkRfU1NMX1NFU1NJT04pLAkiaTJkX1NTTF9TRVNTSU9OIn0sCit7RVJSX0ZVTkMoU1NMX0ZfUkVBRF9OKSwJIlJFQURfTiJ9LAore0VSUl9GVU5DKFNTTF9GX1JFUVVFU1RfQ0VSVElGSUNBVEUpLAkiUkVRVUVTVF9DRVJUSUZJQ0FURSJ9LAore0VSUl9GVU5DKFNTTF9GX1NFUlZFUl9GSU5JU0gpLAkiU0VSVkVSX0ZJTklTSCJ9LAore0VSUl9GVU5DKFNTTF9GX1NFUlZFUl9IRUxMTyksCSJTRVJWRVJfSEVMTE8ifSwKK3tFUlJfRlVOQyhTU0xfRl9TRVJWRVJfVkVSSUZZKSwJIlNFUlZFUl9WRVJJRlkifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wyM19BQ0NFUFQpLAkiU1NMMjNfQUNDRVBUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMMjNfQ0xJRU5UX0hFTExPKSwJIlNTTDIzX0NMSUVOVF9IRUxMTyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDIzX0NPTk5FQ1QpLAkiU1NMMjNfQ09OTkVDVCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDIzX0dFVF9DTElFTlRfSEVMTE8pLAkiU1NMMjNfR0VUX0NMSUVOVF9IRUxMTyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDIzX0dFVF9TRVJWRVJfSEVMTE8pLAkiU1NMMjNfR0VUX1NFUlZFUl9IRUxMTyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDIzX1BFRUspLAkiU1NMMjNfUEVFSyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDIzX1JFQUQpLAkiU1NMMjNfUkVBRCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDIzX1dSSVRFKSwJIlNTTDIzX1dSSVRFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMMl9BQ0NFUFQpLAkiU1NMMl9BQ0NFUFQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wyX0NPTk5FQ1QpLAkiU1NMMl9DT05ORUNUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMMl9FTkNfSU5JVCksCSJTU0wyX0VOQ19JTklUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMMl9HRU5FUkFURV9LRVlfTUFURVJJQUwpLAkiU1NMMl9HRU5FUkFURV9LRVlfTUFURVJJQUwifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wyX1BFRUspLAkiU1NMMl9QRUVLIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMMl9SRUFEKSwJIlNTTDJfUkVBRCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDJfUkVBRF9JTlRFUk5BTCksCSJTU0wyX1JFQURfSU5URVJOQUwifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wyX1NFVF9DRVJUSUZJQ0FURSksCSJTU0wyX1NFVF9DRVJUSUZJQ0FURSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDJfV1JJVEUpLAkiU1NMMl9XUklURSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfQUNDRVBUKSwJIlNTTDNfQUNDRVBUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19BRERfQ0VSVF9UT19CVUYpLAkiU1NMM19BRERfQ0VSVF9UT19CVUYifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX0NBTExCQUNLX0NUUkwpLAkiU1NMM19DQUxMQkFDS19DVFJMIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19DSEFOR0VfQ0lQSEVSX1NUQVRFKSwJIlNTTDNfQ0hBTkdFX0NJUEhFUl9TVEFURSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfQ0hFQ0tfQ0VSVF9BTkRfQUxHT1JJVEhNKSwJIlNTTDNfQ0hFQ0tfQ0VSVF9BTkRfQUxHT1JJVEhNIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19DTElFTlRfSEVMTE8pLAkiU1NMM19DTElFTlRfSEVMTE8ifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX0NPTk5FQ1QpLAkiU1NMM19DT05ORUNUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19DVFJMKSwJIlNTTDNfQ1RSTCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfQ1RYX0NUUkwpLAkiU1NMM19DVFhfQ1RSTCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfRElHRVNUX0NBQ0hFRF9SRUNPUkRTKSwJIlNTTDNfRElHRVNUX0NBQ0hFRF9SRUNPUkRTIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19ET19DSEFOR0VfQ0lQSEVSX1NQRUMpLAkiU1NMM19ET19DSEFOR0VfQ0lQSEVSX1NQRUMifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX0VOQyksCSJTU0wzX0VOQyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfR0VORVJBVEVfS0VZX0JMT0NLKSwJIlNTTDNfR0VORVJBVEVfS0VZX0JMT0NLIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19HRVRfQ0VSVElGSUNBVEVfUkVRVUVTVCksCSJTU0wzX0dFVF9DRVJUSUZJQ0FURV9SRVFVRVNUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19HRVRfQ0VSVF9TVEFUVVMpLAkiU1NMM19HRVRfQ0VSVF9TVEFUVVMifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX0dFVF9DRVJUX1ZFUklGWSksCSJTU0wzX0dFVF9DRVJUX1ZFUklGWSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfR0VUX0NMSUVOVF9DRVJUSUZJQ0FURSksCSJTU0wzX0dFVF9DTElFTlRfQ0VSVElGSUNBVEUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX0dFVF9DTElFTlRfSEVMTE8pLAkiU1NMM19HRVRfQ0xJRU5UX0hFTExPIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19HRVRfQ0xJRU5UX0tFWV9FWENIQU5HRSksCSJTU0wzX0dFVF9DTElFTlRfS0VZX0VYQ0hBTkdFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19HRVRfRklOSVNIRUQpLAkiU1NMM19HRVRfRklOSVNIRUQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX0dFVF9LRVlfRVhDSEFOR0UpLAkiU1NMM19HRVRfS0VZX0VYQ0hBTkdFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19HRVRfTUVTU0FHRSksCSJTU0wzX0dFVF9NRVNTQUdFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19HRVRfTkVXX1NFU1NJT05fVElDS0VUKSwJIlNTTDNfR0VUX05FV19TRVNTSU9OX1RJQ0tFVCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfR0VUX1JFQ09SRCksCSJTU0wzX0dFVF9SRUNPUkQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX0dFVF9TRVJWRVJfQ0VSVElGSUNBVEUpLAkiU1NMM19HRVRfU0VSVkVSX0NFUlRJRklDQVRFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19HRVRfU0VSVkVSX0RPTkUpLAkiU1NMM19HRVRfU0VSVkVSX0RPTkUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX0dFVF9TRVJWRVJfSEVMTE8pLAkiU1NMM19HRVRfU0VSVkVSX0hFTExPIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19IQU5EU0hBS0VfTUFDKSwJInNzbDNfaGFuZHNoYWtlX21hYyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfTkVXX1NFU1NJT05fVElDS0VUKSwJIlNTTDNfTkVXX1NFU1NJT05fVElDS0VUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19PVVRQVVRfQ0VSVF9DSEFJTiksCSJTU0wzX09VVFBVVF9DRVJUX0NIQUlOIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19QRUVLKSwJIlNTTDNfUEVFSyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfUkVBRF9CWVRFUyksCSJTU0wzX1JFQURfQllURVMifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX1JFQURfTiksCSJTU0wzX1JFQURfTiJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfU0VORF9DRVJUSUZJQ0FURV9SRVFVRVNUKSwJIlNTTDNfU0VORF9DRVJUSUZJQ0FURV9SRVFVRVNUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURSksCSJTU0wzX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UpLAkiU1NMM19TRU5EX0NMSUVOVF9LRVlfRVhDSEFOR0UifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX1NFTkRfQ0xJRU5UX1ZFUklGWSksCSJTU0wzX1NFTkRfQ0xJRU5UX1ZFUklGWSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfQ0VSVElGSUNBVEUpLAkiU1NMM19TRU5EX1NFUlZFUl9DRVJUSUZJQ0FURSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfSEVMTE8pLAkiU1NMM19TRU5EX1NFUlZFUl9IRUxMTyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFKSwJIlNTTDNfU0VORF9TRVJWRVJfS0VZX0VYQ0hBTkdFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMM19TRVRVUF9LRVlfQkxPQ0spLAkiU1NMM19TRVRVUF9LRVlfQkxPQ0sifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX1NFVFVQX1JFQURfQlVGRkVSKSwJIlNTTDNfU0VUVVBfUkVBRF9CVUZGRVIifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0wzX1NFVFVQX1dSSVRFX0JVRkZFUiksCSJTU0wzX1NFVFVQX1dSSVRFX0JVRkZFUiJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfV1JJVEVfQllURVMpLAkiU1NMM19XUklURV9CWVRFUyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTDNfV1JJVEVfUEVORElORyksCSJTU0wzX1dSSVRFX1BFTkRJTkcifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQUREX0NMSUVOVEhFTExPX1JFTkVHT1RJQVRFX0VYVCksCSJTU0xfQUREX0NMSUVOVEhFTExPX1JFTkVHT1RJQVRFX0VYVCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9BRERfQ0xJRU5USEVMTE9fVExTRVhUKSwJIlNTTF9BRERfQ0xJRU5USEVMTE9fVExTRVhUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0FERF9ESVJfQ0VSVF9TVUJKRUNUU19UT19TVEFDSyksCSJTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0FERF9GSUxFX0NFUlRfU1VCSkVDVFNfVE9fU1RBQ0spLAkiU1NMX2FkZF9maWxlX2NlcnRfc3ViamVjdHNfdG9fc3RhY2sifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQUREX1NFUlZFUkhFTExPX1JFTkVHT1RJQVRFX0VYVCksCSJTU0xfQUREX1NFUlZFUkhFTExPX1JFTkVHT1RJQVRFX0VYVCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9BRERfU0VSVkVSSEVMTE9fVExTRVhUKSwJIlNTTF9BRERfU0VSVkVSSEVMTE9fVExTRVhUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0JBRF9NRVRIT0QpLAkiU1NMX0JBRF9NRVRIT0QifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQllURVNfVE9fQ0lQSEVSX0xJU1QpLAkiU1NMX0JZVEVTX1RPX0NJUEhFUl9MSVNUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NFUlRfRFVQKSwJIlNTTF9DRVJUX0RVUCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DRVJUX0lOU1QpLAkiU1NMX0NFUlRfSU5TVCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DRVJUX0lOU1RBTlRJQVRFKSwJIlNTTF9DRVJUX0lOU1RBTlRJQVRFIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NFUlRfTkVXKSwJIlNTTF9DRVJUX05FVyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DSEVDS19QUklWQVRFX0tFWSksCSJTU0xfY2hlY2tfcHJpdmF0ZV9rZXkifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ0hFQ0tfU0VSVkVSSEVMTE9fVExTRVhUKSwJIlNTTF9DSEVDS19TRVJWRVJIRUxMT19UTFNFWFQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ0hFQ0tfU1JWUl9FQ0NfQ0VSVF9BTkRfQUxHKSwJIlNTTF9DSEVDS19TUlZSX0VDQ19DRVJUX0FORF9BTEcifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ0lQSEVSX1BST0NFU1NfUlVMRVNUUiksCSJTU0xfQ0lQSEVSX1BST0NFU1NfUlVMRVNUUiJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DSVBIRVJfU1RSRU5HVEhfU09SVCksCSJTU0xfQ0lQSEVSX1NUUkVOR1RIX1NPUlQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ0xFQVIpLAkiU1NMX2NsZWFyIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NPTVBfQUREX0NPTVBSRVNTSU9OX01FVEhPRCksCSJTU0xfQ09NUF9hZGRfY29tcHJlc3Npb25fbWV0aG9kIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NSRUFURV9DSVBIRVJfTElTVCksCSJTU0xfQ1JFQVRFX0NJUEhFUl9MSVNUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NUUkwpLAkiU1NMX2N0cmwifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ1RYX0NIRUNLX1BSSVZBVEVfS0VZKSwJIlNTTF9DVFhfY2hlY2tfcHJpdmF0ZV9rZXkifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ1RYX05FVyksCSJTU0xfQ1RYX25ldyJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DVFhfU0VUX0NJUEhFUl9MSVNUKSwJIlNTTF9DVFhfc2V0X2NpcGhlcl9saXN0In0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NUWF9TRVRfQ0xJRU5UX0NFUlRfRU5HSU5FKSwJIlNTTF9DVFhfc2V0X2NsaWVudF9jZXJ0X2VuZ2luZSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DVFhfU0VUX1BVUlBPU0UpLAkiU1NMX0NUWF9zZXRfcHVycG9zZSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DVFhfU0VUX1NFU1NJT05fSURfQ09OVEVYVCksCSJTU0xfQ1RYX3NldF9zZXNzaW9uX2lkX2NvbnRleHQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ1RYX1NFVF9TU0xfVkVSU0lPTiksCSJTU0xfQ1RYX3NldF9zc2xfdmVyc2lvbiJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DVFhfU0VUX1RSVVNUKSwJIlNTTF9DVFhfc2V0X3RydXN0In0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NUWF9VU0VfQ0VSVElGSUNBVEUpLAkiU1NMX0NUWF91c2VfY2VydGlmaWNhdGUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURV9BU04xKSwJIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX0FTTjEifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURV9DSEFJTl9GSUxFKSwJIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURV9GSUxFKSwJIlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2ZpbGUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ1RYX1VTRV9QUklWQVRFS0VZKSwJIlNTTF9DVFhfdXNlX1ByaXZhdGVLZXkifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfQ1RYX1VTRV9QUklWQVRFS0VZX0FTTjEpLAkiU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9BU04xIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NUWF9VU0VfUFJJVkFURUtFWV9GSUxFKSwJIlNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DVFhfVVNFX1BTS19JREVOVElUWV9ISU5UKSwJIlNTTF9DVFhfdXNlX3Bza19pZGVudGl0eV9oaW50In0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NUWF9VU0VfUlNBUFJJVkFURUtFWSksCSJTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5In0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0NUWF9VU0VfUlNBUFJJVkFURUtFWV9BU04xKSwJIlNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXlfQVNOMSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9DVFhfVVNFX1JTQVBSSVZBVEVLRVlfRklMRSksCSJTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfRE9fSEFORFNIQUtFKSwJIlNTTF9kb19oYW5kc2hha2UifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfR0VUX05FV19TRVNTSU9OKSwJIlNTTF9HRVRfTkVXX1NFU1NJT04ifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfR0VUX1BSRVZfU0VTU0lPTiksCSJTU0xfR0VUX1BSRVZfU0VTU0lPTiJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9HRVRfU0VSVkVSX1NFTkRfQ0VSVCksCSJTU0xfR0VUX1NFUlZFUl9TRU5EX0NFUlQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfR0VUX1NJR05fUEtFWSksCSJTU0xfR0VUX1NJR05fUEtFWSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9JTklUX1dCSU9fQlVGRkVSKSwJIlNTTF9JTklUX1dCSU9fQlVGRkVSIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX0xPQURfQ0xJRU5UX0NBX0ZJTEUpLAkiU1NMX2xvYWRfY2xpZW50X0NBX2ZpbGUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfTkVXKSwJIlNTTF9uZXcifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfUEFSU0VfQ0xJRU5USEVMTE9fUkVORUdPVElBVEVfRVhUKSwJIlNTTF9QQVJTRV9DTElFTlRIRUxMT19SRU5FR09USUFURV9FWFQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfUEFSU0VfQ0xJRU5USEVMTE9fVExTRVhUKSwJIlNTTF9QQVJTRV9DTElFTlRIRUxMT19UTFNFWFQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfUEFSU0VfU0VSVkVSSEVMTE9fUkVORUdPVElBVEVfRVhUKSwJIlNTTF9QQVJTRV9TRVJWRVJIRUxMT19SRU5FR09USUFURV9FWFQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfUEFSU0VfU0VSVkVSSEVMTE9fVExTRVhUKSwJIlNTTF9QQVJTRV9TRVJWRVJIRUxMT19UTFNFWFQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfUEVFSyksCSJTU0xfcGVlayJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9QUkVQQVJFX0NMSUVOVEhFTExPX1RMU0VYVCksCSJTU0xfUFJFUEFSRV9DTElFTlRIRUxMT19UTFNFWFQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfUFJFUEFSRV9TRVJWRVJIRUxMT19UTFNFWFQpLAkiU1NMX1BSRVBBUkVfU0VSVkVSSEVMTE9fVExTRVhUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1JFQUQpLAkiU1NMX3JlYWQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfUlNBX1BSSVZBVEVfREVDUllQVCksCSJTU0xfUlNBX1BSSVZBVEVfREVDUllQVCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9SU0FfUFVCTElDX0VOQ1JZUFQpLAkiU1NMX1JTQV9QVUJMSUNfRU5DUllQVCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9TRVNTSU9OX05FVyksCSJTU0xfU0VTU0lPTl9uZXcifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfU0VTU0lPTl9QUklOVF9GUCksCSJTU0xfU0VTU0lPTl9wcmludF9mcCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9TRVNTX0NFUlRfTkVXKSwJIlNTTF9TRVNTX0NFUlRfTkVXIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1NFVF9DRVJUKSwJIlNTTF9TRVRfQ0VSVCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9TRVRfQ0lQSEVSX0xJU1QpLAkiU1NMX3NldF9jaXBoZXJfbGlzdCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9TRVRfRkQpLAkiU1NMX3NldF9mZCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9TRVRfUEtFWSksCSJTU0xfU0VUX1BLRVkifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfU0VUX1BVUlBPU0UpLAkiU1NMX3NldF9wdXJwb3NlIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1NFVF9SRkQpLAkiU1NMX3NldF9yZmQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfU0VUX1NFU1NJT04pLAkiU1NMX3NldF9zZXNzaW9uIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1NFVF9TRVNTSU9OX0lEX0NPTlRFWFQpLAkiU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfU0VUX1NFU1NJT05fVElDS0VUX0VYVCksCSJTU0xfc2V0X3Nlc3Npb25fdGlja2V0X2V4dCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9TRVRfVFJVU1QpLAkiU1NMX3NldF90cnVzdCJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9TRVRfV0ZEKSwJIlNTTF9zZXRfd2ZkIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1NIVVRET1dOKSwJIlNTTF9zaHV0ZG93biJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9VTkRFRklORURfQ09OU1RfRlVOQ1RJT04pLAkiU1NMX1VOREVGSU5FRF9DT05TVF9GVU5DVElPTiJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9VTkRFRklORURfRlVOQ1RJT04pLAkiU1NMX1VOREVGSU5FRF9GVU5DVElPTiJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9VTkRFRklORURfVk9JRF9GVU5DVElPTiksCSJTU0xfVU5ERUZJTkVEX1ZPSURfRlVOQ1RJT04ifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFKSwJIlNTTF91c2VfY2VydGlmaWNhdGUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFX0FTTjEpLAkiU1NMX3VzZV9jZXJ0aWZpY2F0ZV9BU04xIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURV9GSUxFKSwJIlNTTF91c2VfY2VydGlmaWNhdGVfZmlsZSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWSksCSJTU0xfdXNlX1ByaXZhdGVLZXkifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfVVNFX1BSSVZBVEVLRVlfQVNOMSksCSJTU0xfdXNlX1ByaXZhdGVLZXlfQVNOMSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWV9GSUxFKSwJIlNTTF91c2VfUHJpdmF0ZUtleV9maWxlIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1VTRV9QU0tfSURFTlRJVFlfSElOVCksCSJTU0xfdXNlX3Bza19pZGVudGl0eV9oaW50In0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZKSwJIlNTTF91c2VfUlNBUHJpdmF0ZUtleSJ9LAore0VSUl9GVU5DKFNTTF9GX1NTTF9VU0VfUlNBUFJJVkFURUtFWV9BU04xKSwJIlNTTF91c2VfUlNBUHJpdmF0ZUtleV9BU04xIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZX0ZJTEUpLAkiU1NMX3VzZV9SU0FQcml2YXRlS2V5X2ZpbGUifSwKK3tFUlJfRlVOQyhTU0xfRl9TU0xfVkVSSUZZX0NFUlRfQ0hBSU4pLAkiU1NMX1ZFUklGWV9DRVJUX0NIQUlOIn0sCit7RVJSX0ZVTkMoU1NMX0ZfU1NMX1dSSVRFKSwJIlNTTF93cml0ZSJ9LAore0VSUl9GVU5DKFNTTF9GX1RMUzFfQ0VSVF9WRVJJRllfTUFDKSwJInRsczFfY2VydF92ZXJpZnlfbWFjIn0sCit7RVJSX0ZVTkMoU1NMX0ZfVExTMV9DSEFOR0VfQ0lQSEVSX1NUQVRFKSwJIlRMUzFfQ0hBTkdFX0NJUEhFUl9TVEFURSJ9LAore0VSUl9GVU5DKFNTTF9GX1RMUzFfQ0hFQ0tfU0VSVkVSSEVMTE9fVExTRVhUKSwJIlRMUzFfQ0hFQ0tfU0VSVkVSSEVMTE9fVExTRVhUIn0sCit7RVJSX0ZVTkMoU1NMX0ZfVExTMV9FTkMpLAkiVExTMV9FTkMifSwKK3tFUlJfRlVOQyhTU0xfRl9UTFMxX1BSRVBBUkVfQ0xJRU5USEVMTE9fVExTRVhUKSwJIlRMUzFfUFJFUEFSRV9DTElFTlRIRUxMT19UTFNFWFQifSwKK3tFUlJfRlVOQyhTU0xfRl9UTFMxX1BSRVBBUkVfU0VSVkVSSEVMTE9fVExTRVhUKSwJIlRMUzFfUFJFUEFSRV9TRVJWRVJIRUxMT19UTFNFWFQifSwKK3tFUlJfRlVOQyhTU0xfRl9UTFMxX1BSRiksCSJ0bHMxX3ByZiJ9LAore0VSUl9GVU5DKFNTTF9GX1RMUzFfU0VUVVBfS0VZX0JMT0NLKSwJIlRMUzFfU0VUVVBfS0VZX0JMT0NLIn0sCit7RVJSX0ZVTkMoU1NMX0ZfV1JJVEVfUEVORElORyksCSJXUklURV9QRU5ESU5HIn0sCit7MCxOVUxMfQorCX07CisKK3N0YXRpYyBFUlJfU1RSSU5HX0RBVEEgU1NMX3N0cl9yZWFzb25zW109CisJewore0VSUl9SRUFTT04oU1NMX1JfQVBQX0RBVEFfSU5fSEFORFNIQUtFKSAsImFwcCBkYXRhIGluIGhhbmRzaGFrZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfQVRURU1QVF9UT19SRVVTRV9TRVNTSU9OX0lOX0RJRkZFUkVOVF9DT05URVhUKSwiYXR0ZW1wdCB0byByZXVzZSBzZXNzaW9uIGluIGRpZmZlcmVudCBjb250ZXh0In0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfQUxFUlRfUkVDT1JEKSAgICAgICwiYmFkIGFsZXJ0IHJlY29yZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX0FVVEhFTlRJQ0FUSU9OX1RZUEUpLCJiYWQgYXV0aGVudGljYXRpb24gdHlwZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX0NIQU5HRV9DSVBIRVJfU1BFQyksImJhZCBjaGFuZ2UgY2lwaGVyIHNwZWMifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9DSEVDS1NVTSkgICAgICAgICAgLCJiYWQgY2hlY2tzdW0ifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9EQVRBX1JFVFVSTkVEX0JZX0NBTExCQUNLKSwiYmFkIGRhdGEgcmV0dXJuZWQgYnkgY2FsbGJhY2sifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9ERUNPTVBSRVNTSU9OKSAgICAgLCJiYWQgZGVjb21wcmVzc2lvbiJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX0RIX0dfTEVOR1RIKSAgICAgICAsImJhZCBkaCBnIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX0RIX1BVQl9LRVlfTEVOR1RIKSAsImJhZCBkaCBwdWIga2V5IGxlbmd0aCJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX0RIX1BfTEVOR1RIKSAgICAgICAsImJhZCBkaCBwIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX0RJR0VTVF9MRU5HVEgpICAgICAsImJhZCBkaWdlc3QgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfRFNBX1NJR05BVFVSRSkgICAgICwiYmFkIGRzYSBzaWduYXR1cmUifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9FQ0NfQ0VSVCkgICAgICAgICAgLCJiYWQgZWNjIGNlcnQifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9FQ0RTQV9TSUdOQVRVUkUpICAgLCJiYWQgZWNkc2Egc2lnbmF0dXJlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfRUNQT0lOVCkgICAgICAgICAgICwiYmFkIGVjcG9pbnQifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9IQU5EU0hBS0VfTEVOR1RIKSAgLCJiYWQgaGFuZHNoYWtlIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX0hFTExPX1JFUVVFU1QpICAgICAsImJhZCBoZWxsbyByZXF1ZXN0In0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfTEVOR1RIKSAgICAgICAgICAgICwiYmFkIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX01BQ19ERUNPREUpICAgICAgICAsImJhZCBtYWMgZGVjb2RlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfTUFDX0xFTkdUSCkgICAgICAgICwiYmFkIG1hYyBsZW5ndGgifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9NRVNTQUdFX1RZUEUpICAgICAgLCJiYWQgbWVzc2FnZSB0eXBlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfUEFDS0VUX0xFTkdUSCkgICAgICwiYmFkIHBhY2tldCBsZW5ndGgifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9QUk9UT0NPTF9WRVJTSU9OX05VTUJFUiksImJhZCBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX1BTS19JREVOVElUWV9ISU5UX0xFTkdUSCksImJhZCBwc2sgaWRlbnRpdHkgaGludCBsZW5ndGgifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9SRVNQT05TRV9BUkdVTUVOVCkgLCJiYWQgcmVzcG9uc2UgYXJndW1lbnQifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9SU0FfREVDUllQVCkgICAgICAgLCJiYWQgcnNhIGRlY3J5cHQifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9SU0FfRU5DUllQVCkgICAgICAgLCJiYWQgcnNhIGVuY3J5cHQifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9SU0FfRV9MRU5HVEgpICAgICAgLCJiYWQgcnNhIGUgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfUlNBX01PRFVMVVNfTEVOR1RIKSwiYmFkIHJzYSBtb2R1bHVzIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX1JTQV9TSUdOQVRVUkUpICAgICAsImJhZCByc2Egc2lnbmF0dXJlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfU0lHTkFUVVJFKSAgICAgICAgICwiYmFkIHNpZ25hdHVyZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfQkFEX1NTTF9GSUxFVFlQRSkgICAgICAsImJhZCBzc2wgZmlsZXR5cGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JBRF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgpLCJiYWQgc3NsIHNlc3Npb24gaWQgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfU1RBVEUpICAgICAgICAgICAgICwiYmFkIHN0YXRlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CQURfV1JJVEVfUkVUUlkpICAgICAgICwiYmFkIHdyaXRlIHJldHJ5In0sCit7RVJSX1JFQVNPTihTU0xfUl9CSU9fTk9UX1NFVCkgICAgICAgICAgICwiYmlvIG5vdCBzZXQifSwKK3tFUlJfUkVBU09OKFNTTF9SX0JMT0NLX0NJUEhFUl9QQURfSVNfV1JPTkcpLCJibG9jayBjaXBoZXIgcGFkIGlzIHdyb25nIn0sCit7RVJSX1JFQVNPTihTU0xfUl9CTl9MSUIpICAgICAgICAgICAgICAgICwiYm4gbGliIn0sCit7RVJSX1JFQVNPTihTU0xfUl9DQV9ETl9MRU5HVEhfTUlTTUFUQ0gpICwiY2EgZG4gbGVuZ3RoIG1pc21hdGNoIn0sCit7RVJSX1JFQVNPTihTU0xfUl9DQV9ETl9UT09fTE9ORykgICAgICAgICwiY2EgZG4gdG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX0NDU19SRUNFSVZFRF9FQVJMWSkgICAgLCJjY3MgcmVjZWl2ZWQgZWFybHkifSwKK3tFUlJfUkVBU09OKFNTTF9SX0NFUlRJRklDQVRFX1ZFUklGWV9GQUlMRUQpLCJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9DRVJUX0xFTkdUSF9NSVNNQVRDSCkgICwiY2VydCBsZW5ndGggbWlzbWF0Y2gifSwKK3tFUlJfUkVBU09OKFNTTF9SX0NIQUxMRU5HRV9JU19ESUZGRVJFTlQpLCJjaGFsbGVuZ2UgaXMgZGlmZmVyZW50In0sCit7RVJSX1JFQVNPTihTU0xfUl9DSVBIRVJfQ09ERV9XUk9OR19MRU5HVEgpLCJjaXBoZXIgY29kZSB3cm9uZyBsZW5ndGgifSwKK3tFUlJfUkVBU09OKFNTTF9SX0NJUEhFUl9PUl9IQVNIX1VOQVZBSUxBQkxFKSwiY2lwaGVyIG9yIGhhc2ggdW5hdmFpbGFibGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX0NJUEhFUl9UQUJMRV9TUkNfRVJST1IpLCJjaXBoZXIgdGFibGUgc3JjIGVycm9yIn0sCit7RVJSX1JFQVNPTihTU0xfUl9DTElFTlRIRUxMT19UTFNFWFQpICAgICwiY2xpZW50aGVsbG8gdGxzZXh0In0sCit7RVJSX1JFQVNPTihTU0xfUl9DT01QUkVTU0VEX0xFTkdUSF9UT09fTE9ORyksImNvbXByZXNzZWQgbGVuZ3RoIHRvbyBsb25nIn0sCit7RVJSX1JFQVNPTihTU0xfUl9DT01QUkVTU0lPTl9ESVNBQkxFRCkgICwiY29tcHJlc3Npb24gZGlzYWJsZWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX0NPTVBSRVNTSU9OX0ZBSUxVUkUpICAgLCJjb21wcmVzc2lvbiBmYWlsdXJlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9DT01QUkVTU0lPTl9JRF9OT1RfV0lUSElOX1BSSVZBVEVfUkFOR0UpLCJjb21wcmVzc2lvbiBpZCBub3Qgd2l0aGluIHByaXZhdGUgcmFuZ2UifSwKK3tFUlJfUkVBU09OKFNTTF9SX0NPTVBSRVNTSU9OX0xJQlJBUllfRVJST1IpLCJjb21wcmVzc2lvbiBsaWJyYXJ5IGVycm9yIn0sCit7RVJSX1JFQVNPTihTU0xfUl9DT05ORUNUSU9OX0lEX0lTX0RJRkZFUkVOVCksImNvbm5lY3Rpb24gaWQgaXMgZGlmZmVyZW50In0sCit7RVJSX1JFQVNPTihTU0xfUl9DT05ORUNUSU9OX1RZUEVfTk9UX1NFVCksImNvbm5lY3Rpb24gdHlwZSBub3Qgc2V0In0sCit7RVJSX1JFQVNPTihTU0xfUl9DT09LSUVfTUlTTUFUQ0gpICAgICAgICwiY29va2llIG1pc21hdGNoIn0sCit7RVJSX1JFQVNPTihTU0xfUl9EQVRBX0JFVFdFRU5fQ0NTX0FORF9GSU5JU0hFRCksImRhdGEgYmV0d2VlbiBjY3MgYW5kIGZpbmlzaGVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORykgICwiZGF0YSBsZW5ndGggdG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX0RFQ1JZUFRJT05fRkFJTEVEKSAgICAgLCJkZWNyeXB0aW9uIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfREVDUllQVElPTl9GQUlMRURfT1JfQkFEX1JFQ09SRF9NQUMpLCJkZWNyeXB0aW9uIGZhaWxlZCBvciBiYWQgcmVjb3JkIG1hYyJ9LAore0VSUl9SRUFTT04oU1NMX1JfREhfUFVCTElDX1ZBTFVFX0xFTkdUSF9JU19XUk9ORyksImRoIHB1YmxpYyB2YWx1ZSBsZW5ndGggaXMgd3JvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX0RJR0VTVF9DSEVDS19GQUlMRUQpICAgLCJkaWdlc3QgY2hlY2sgZmFpbGVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9EVExTX01FU1NBR0VfVE9PX0JJRykgICwiZHRscyBtZXNzYWdlIHRvbyBiaWcifSwKK3tFUlJfUkVBU09OKFNTTF9SX0RVUExJQ0FURV9DT01QUkVTU0lPTl9JRCksImR1cGxpY2F0ZSBjb21wcmVzc2lvbiBpZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfRUNDX0NFUlRfTk9UX0ZPUl9LRVlfQUdSRUVNRU5UKSwiZWNjIGNlcnQgbm90IGZvciBrZXkgYWdyZWVtZW50In0sCit7RVJSX1JFQVNPTihTU0xfUl9FQ0NfQ0VSVF9OT1RfRk9SX1NJR05JTkcpLCJlY2MgY2VydCBub3QgZm9yIHNpZ25pbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX0VDQ19DRVJUX1NIT1VMRF9IQVZFX1JTQV9TSUdOQVRVUkUpLCJlY2MgY2VydCBzaG91bGQgaGF2ZSByc2Egc2lnbmF0dXJlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9FQ0NfQ0VSVF9TSE9VTERfSEFWRV9TSEExX1NJR05BVFVSRSksImVjYyBjZXJ0IHNob3VsZCBoYXZlIHNoYTEgc2lnbmF0dXJlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9FQ0dST1VQX1RPT19MQVJHRV9GT1JfQ0lQSEVSKSwiZWNncm91cCB0b28gbGFyZ2UgZm9yIGNpcGhlciJ9LAore0VSUl9SRUFTT04oU1NMX1JfRU5DUllQVEVEX0xFTkdUSF9UT09fTE9ORyksImVuY3J5cHRlZCBsZW5ndGggdG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX0VSUk9SX0dFTkVSQVRJTkdfVE1QX1JTQV9LRVkpLCJlcnJvciBnZW5lcmF0aW5nIHRtcCByc2Ega2V5In0sCit7RVJSX1JFQVNPTihTU0xfUl9FUlJPUl9JTl9SRUNFSVZFRF9DSVBIRVJfTElTVCksImVycm9yIGluIHJlY2VpdmVkIGNpcGhlciBsaXN0In0sCit7RVJSX1JFQVNPTihTU0xfUl9FWENFU1NJVkVfTUVTU0FHRV9TSVpFKSwiZXhjZXNzaXZlIG1lc3NhZ2Ugc2l6ZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfRVhUUkFfREFUQV9JTl9NRVNTQUdFKSAsImV4dHJhIGRhdGEgaW4gbWVzc2FnZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfR09UX0FfRklOX0JFRk9SRV9BX0NDUyksImdvdCBhIGZpbiBiZWZvcmUgYSBjY3MifSwKK3tFUlJfUkVBU09OKFNTTF9SX0hUVFBTX1BST1hZX1JFUVVFU1QpICAgLCJodHRwcyBwcm94eSByZXF1ZXN0In0sCit7RVJSX1JFQVNPTihTU0xfUl9IVFRQX1JFUVVFU1QpICAgICAgICAgICwiaHR0cCByZXF1ZXN0In0sCit7RVJSX1JFQVNPTihTU0xfUl9JTExFR0FMX1BBRERJTkcpICAgICAgICwiaWxsZWdhbCBwYWRkaW5nIn0sCit7RVJSX1JFQVNPTihTU0xfUl9JTkNPTlNJU1RFTlRfQ09NUFJFU1NJT04pLCJpbmNvbnNpc3RlbnQgY29tcHJlc3Npb24ifSwKK3tFUlJfUkVBU09OKFNTTF9SX0lOVkFMSURfQ0hBTExFTkdFX0xFTkdUSCksImludmFsaWQgY2hhbGxlbmdlIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oU1NMX1JfSU5WQUxJRF9DT01NQU5EKSAgICAgICAsImludmFsaWQgY29tbWFuZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfSU5WQUxJRF9DT01QUkVTU0lPTl9BTEdPUklUSE0pLCJpbnZhbGlkIGNvbXByZXNzaW9uIGFsZ29yaXRobSJ9LAore0VSUl9SRUFTT04oU1NMX1JfSU5WQUxJRF9QVVJQT1NFKSAgICAgICAsImludmFsaWQgcHVycG9zZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfSU5WQUxJRF9TVEFUVVNfUkVTUE9OU0UpLCJpbnZhbGlkIHN0YXR1cyByZXNwb25zZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfSU5WQUxJRF9USUNLRVRfS0VZU19MRU5HVEgpLCJpbnZhbGlkIHRpY2tldCBrZXlzIGxlbmd0aCJ9LAore0VSUl9SRUFTT04oU1NMX1JfSU5WQUxJRF9UUlVTVCkgICAgICAgICAsImludmFsaWQgdHJ1c3QifSwKK3tFUlJfUkVBU09OKFNTTF9SX0tFWV9BUkdfVE9PX0xPTkcpICAgICAgLCJrZXkgYXJnIHRvbyBsb25nIn0sCit7RVJSX1JFQVNPTihTU0xfUl9LUkI1KSAgICAgICAgICAgICAgICAgICwia3JiNSJ9LAore0VSUl9SRUFTT04oU1NMX1JfS1JCNV9DX0NDX1BSSU5DKSAgICAgICAsImtyYjUgY2xpZW50IGNjIHByaW5jaXBhbCAobm8gdGt0PykifSwKK3tFUlJfUkVBU09OKFNTTF9SX0tSQjVfQ19HRVRfQ1JFRCkgICAgICAgLCJrcmI1IGNsaWVudCBnZXQgY3JlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfS1JCNV9DX0lOSVQpICAgICAgICAgICAsImtyYjUgY2xpZW50IGluaXQifSwKK3tFUlJfUkVBU09OKFNTTF9SX0tSQjVfQ19NS19SRVEpICAgICAgICAgLCJrcmI1IGNsaWVudCBta19yZXEgKGV4cGlyZWQgdGt0PykifSwKK3tFUlJfUkVBU09OKFNTTF9SX0tSQjVfU19CQURfVElDS0VUKSAgICAgLCJrcmI1IHNlcnZlciBiYWQgdGlja2V0In0sCit7RVJSX1JFQVNPTihTU0xfUl9LUkI1X1NfSU5JVCkgICAgICAgICAgICwia3JiNSBzZXJ2ZXIgaW5pdCJ9LAore0VSUl9SRUFTT04oU1NMX1JfS1JCNV9TX1JEX1JFUSkgICAgICAgICAsImtyYjUgc2VydmVyIHJkX3JlcSAoa2V5dGFiIHBlcm1zPykifSwKK3tFUlJfUkVBU09OKFNTTF9SX0tSQjVfU19US1RfRVhQSVJFRCkgICAgLCJrcmI1IHNlcnZlciB0a3QgZXhwaXJlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfS1JCNV9TX1RLVF9OWVYpICAgICAgICAsImtyYjUgc2VydmVyIHRrdCBub3QgeWV0IHZhbGlkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9LUkI1X1NfVEtUX1NLRVcpICAgICAgICwia3JiNSBzZXJ2ZXIgdGt0IHNrZXcifSwKK3tFUlJfUkVBU09OKFNTTF9SX0xFTkdUSF9NSVNNQVRDSCkgICAgICAgLCJsZW5ndGggbWlzbWF0Y2gifSwKK3tFUlJfUkVBU09OKFNTTF9SX0xFTkdUSF9UT09fU0hPUlQpICAgICAgLCJsZW5ndGggdG9vIHNob3J0In0sCit7RVJSX1JFQVNPTihTU0xfUl9MSUJSQVJZX0JVRykgICAgICAgICAgICwibGlicmFyeSBidWcifSwKK3tFUlJfUkVBU09OKFNTTF9SX0xJQlJBUllfSEFTX05PX0NJUEhFUlMpLCJsaWJyYXJ5IGhhcyBubyBjaXBoZXJzIn0sCit7RVJSX1JFQVNPTihTU0xfUl9NRVNTQUdFX1RPT19MT05HKSAgICAgICwibWVzc2FnZSB0b28gbG9uZyJ9LAore0VSUl9SRUFTT04oU1NMX1JfTUlTU0lOR19ESF9EU0FfQ0VSVCkgICAsIm1pc3NpbmcgZGggZHNhIGNlcnQifSwKK3tFUlJfUkVBU09OKFNTTF9SX01JU1NJTkdfREhfS0VZKSAgICAgICAgLCJtaXNzaW5nIGRoIGtleSJ9LAore0VSUl9SRUFTT04oU1NMX1JfTUlTU0lOR19ESF9SU0FfQ0VSVCkgICAsIm1pc3NpbmcgZGggcnNhIGNlcnQifSwKK3tFUlJfUkVBU09OKFNTTF9SX01JU1NJTkdfRFNBX1NJR05JTkdfQ0VSVCksIm1pc3NpbmcgZHNhIHNpZ25pbmcgY2VydCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTUlTU0lOR19FWFBPUlRfVE1QX0RIX0tFWSksIm1pc3NpbmcgZXhwb3J0IHRtcCBkaCBrZXkifSwKK3tFUlJfUkVBU09OKFNTTF9SX01JU1NJTkdfRVhQT1JUX1RNUF9SU0FfS0VZKSwibWlzc2luZyBleHBvcnQgdG1wIHJzYSBrZXkifSwKK3tFUlJfUkVBU09OKFNTTF9SX01JU1NJTkdfUlNBX0NFUlRJRklDQVRFKSwibWlzc2luZyByc2EgY2VydGlmaWNhdGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX01JU1NJTkdfUlNBX0VOQ1JZUFRJTkdfQ0VSVCksIm1pc3NpbmcgcnNhIGVuY3J5cHRpbmcgY2VydCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTUlTU0lOR19SU0FfU0lHTklOR19DRVJUKSwibWlzc2luZyByc2Egc2lnbmluZyBjZXJ0In0sCit7RVJSX1JFQVNPTihTU0xfUl9NSVNTSU5HX1RNUF9ESF9LRVkpICAgICwibWlzc2luZyB0bXAgZGgga2V5In0sCit7RVJSX1JFQVNPTihTU0xfUl9NSVNTSU5HX1RNUF9FQ0RIX0tFWSkgICwibWlzc2luZyB0bXAgZWNkaCBrZXkifSwKK3tFUlJfUkVBU09OKFNTTF9SX01JU1NJTkdfVE1QX1JTQV9LRVkpICAgLCJtaXNzaW5nIHRtcCByc2Ega2V5In0sCit7RVJSX1JFQVNPTihTU0xfUl9NSVNTSU5HX1RNUF9SU0FfUEtFWSkgICwibWlzc2luZyB0bXAgcnNhIHBrZXkifSwKK3tFUlJfUkVBU09OKFNTTF9SX01JU1NJTkdfVkVSSUZZX01FU1NBR0UpLCJtaXNzaW5nIHZlcmlmeSBtZXNzYWdlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9OT05fU1NMVjJfSU5JVElBTF9QQUNLRVQpLCJub24gc3NsdjIgaW5pdGlhbCBwYWNrZXQifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX0NFUlRJRklDQVRFU19SRVRVUk5FRCksIm5vIGNlcnRpZmljYXRlcyByZXR1cm5lZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQpLCJubyBjZXJ0aWZpY2F0ZSBhc3NpZ25lZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fQ0VSVElGSUNBVEVfUkVUVVJORUQpLCJubyBjZXJ0aWZpY2F0ZSByZXR1cm5lZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fQ0VSVElGSUNBVEVfU0VUKSAgICAsIm5vIGNlcnRpZmljYXRlIHNldCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fQ0VSVElGSUNBVEVfU1BFQ0lGSUVEKSwibm8gY2VydGlmaWNhdGUgc3BlY2lmaWVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9OT19DSVBIRVJTX0FWQUlMQUJMRSkgICwibm8gY2lwaGVycyBhdmFpbGFibGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX0NJUEhFUlNfUEFTU0VEKSAgICAgLCJubyBjaXBoZXJzIHBhc3NlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fQ0lQSEVSU19TUEVDSUZJRUQpICAsIm5vIGNpcGhlcnMgc3BlY2lmaWVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9OT19DSVBIRVJfTElTVCkgICAgICAgICwibm8gY2lwaGVyIGxpc3QifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX0NJUEhFUl9NQVRDSCkgICAgICAgLCJubyBjaXBoZXIgbWF0Y2gifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX0NMSUVOVF9DRVJUX01FVEhPRCkgLCJubyBjbGllbnQgY2VydCBtZXRob2QifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX0NMSUVOVF9DRVJUX1JFQ0VJVkVEKSwibm8gY2xpZW50IGNlcnQgcmVjZWl2ZWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX0NPTVBSRVNTSU9OX1NQRUNJRklFRCksIm5vIGNvbXByZXNzaW9uIHNwZWNpZmllZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fR09TVF9DRVJUSUZJQ0FURV9TRU5UX0JZX1BFRVIpLCJQZWVyIGhhdmVuJ3Qgc2VudCBHT1NUIGNlcnRpZmljYXRlLCByZXF1aXJlZCBmb3Igc2VsZWN0ZWQgY2lwaGVyc3VpdGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX01FVEhPRF9TUEVDSUZJRUQpICAgLCJubyBtZXRob2Qgc3BlY2lmaWVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9OT19QUklWQVRFS0VZKSAgICAgICAgICwibm8gcHJpdmF0ZWtleSJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fUFJJVkFURV9LRVlfQVNTSUdORUQpLCJubyBwcml2YXRlIGtleSBhc3NpZ25lZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fUFJPVE9DT0xTX0FWQUlMQUJMRSksIm5vIHByb3RvY29scyBhdmFpbGFibGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX1BVQkxJQ0tFWSkgICAgICAgICAgLCJubyBwdWJsaWNrZXkifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX1JFTkVHT1RJQVRJT04pICAgICAgLCJubyByZW5lZ290aWF0aW9uIn0sCit7RVJSX1JFQVNPTihTU0xfUl9OT19SRVFVSVJFRF9ESUdFU1QpICAgICwiZGlnZXN0IHJlcXVyZWQgZm9yIGhhbmRzaGFrZSBpc24ndCBjb21wdXRlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfTk9fU0hBUkVEX0NJUEhFUikgICAgICAsIm5vIHNoYXJlZCBjaXBoZXIifSwKK3tFUlJfUkVBU09OKFNTTF9SX05PX1ZFUklGWV9DQUxMQkFDSykgICAgLCJubyB2ZXJpZnkgY2FsbGJhY2sifSwKK3tFUlJfUkVBU09OKFNTTF9SX05VTExfU1NMX0NUWCkgICAgICAgICAgLCJudWxsIHNzbCBjdHgifSwKK3tFUlJfUkVBU09OKFNTTF9SX05VTExfU1NMX01FVEhPRF9QQVNTRUQpLCJudWxsIHNzbCBtZXRob2QgcGFzc2VkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9PTERfU0VTU0lPTl9DSVBIRVJfTk9UX1JFVFVSTkVEKSwib2xkIHNlc3Npb24gY2lwaGVyIG5vdCByZXR1cm5lZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfT0xEX1NFU1NJT05fQ09NUFJFU1NJT05fQUxHT1JJVEhNX05PVF9SRVRVUk5FRCksIm9sZCBzZXNzaW9uIGNvbXByZXNzaW9uIGFsZ29yaXRobSBub3QgcmV0dXJuZWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX09OTFlfVExTX0FMTE9XRURfSU5fRklQU19NT0RFKSwib25seSB0bHMgYWxsb3dlZCBpbiBmaXBzIG1vZGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX09QQVFVRV9QUkZfSU5QVVRfVE9PX0xPTkcpLCJvcGFxdWUgUFJGIGlucHV0IHRvbyBsb25nIn0sCit7RVJSX1JFQVNPTihTU0xfUl9QQUNLRVRfTEVOR1RIX1RPT19MT05HKSwicGFja2V0IGxlbmd0aCB0b28gbG9uZyJ9LAore0VSUl9SRUFTT04oU1NMX1JfUEFSU0VfVExTRVhUKSAgICAgICAgICAsInBhcnNlIHRsc2V4dCJ9LAore0VSUl9SRUFTT04oU1NMX1JfUEFUSF9UT09fTE9ORykgICAgICAgICAsInBhdGggdG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX1BFRVJfRElEX05PVF9SRVRVUk5fQV9DRVJUSUZJQ0FURSksInBlZXIgZGlkIG5vdCByZXR1cm4gYSBjZXJ0aWZpY2F0ZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfUEVFUl9FUlJPUikgICAgICAgICAgICAsInBlZXIgZXJyb3IifSwKK3tFUlJfUkVBU09OKFNTTF9SX1BFRVJfRVJST1JfQ0VSVElGSUNBVEUpLCJwZWVyIGVycm9yIGNlcnRpZmljYXRlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9QRUVSX0VSUk9SX05PX0NFUlRJRklDQVRFKSwicGVlciBlcnJvciBubyBjZXJ0aWZpY2F0ZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfUEVFUl9FUlJPUl9OT19DSVBIRVIpICAsInBlZXIgZXJyb3Igbm8gY2lwaGVyIn0sCit7RVJSX1JFQVNPTihTU0xfUl9QRUVSX0VSUk9SX1VOU1VQUE9SVEVEX0NFUlRJRklDQVRFX1RZUEUpLCJwZWVyIGVycm9yIHVuc3VwcG9ydGVkIGNlcnRpZmljYXRlIHR5cGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1BSRV9NQUNfTEVOR1RIX1RPT19MT05HKSwicHJlIG1hYyBsZW5ndGggdG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX1BST0JMRU1TX01BUFBJTkdfQ0lQSEVSX0ZVTkNUSU9OUyksInByb2JsZW1zIG1hcHBpbmcgY2lwaGVyIGZ1bmN0aW9ucyJ9LAore0VSUl9SRUFTT04oU1NMX1JfUFJPVE9DT0xfSVNfU0hVVERPV04pICAsInByb3RvY29sIGlzIHNodXRkb3duIn0sCit7RVJSX1JFQVNPTihTU0xfUl9QU0tfSURFTlRJVFlfTk9UX0ZPVU5EKSwicHNrIGlkZW50aXR5IG5vdCBmb3VuZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfUFNLX05PX0NMSUVOVF9DQikgICAgICAsInBzayBubyBjbGllbnQgY2IifSwKK3tFUlJfUkVBU09OKFNTTF9SX1BTS19OT19TRVJWRVJfQ0IpICAgICAgLCJwc2sgbm8gc2VydmVyIGNiIn0sCit7RVJSX1JFQVNPTihTU0xfUl9QVUJMSUNfS0VZX0VOQ1JZUFRfRVJST1IpLCJwdWJsaWMga2V5IGVuY3J5cHQgZXJyb3IifSwKK3tFUlJfUkVBU09OKFNTTF9SX1BVQkxJQ19LRVlfSVNfTk9UX1JTQSkgLCJwdWJsaWMga2V5IGlzIG5vdCByc2EifSwKK3tFUlJfUkVBU09OKFNTTF9SX1BVQkxJQ19LRVlfTk9UX1JTQSkgICAgLCJwdWJsaWMga2V5IG5vdCByc2EifSwKK3tFUlJfUkVBU09OKFNTTF9SX1JFQURfQklPX05PVF9TRVQpICAgICAgLCJyZWFkIGJpbyBub3Qgc2V0In0sCit7RVJSX1JFQVNPTihTU0xfUl9SRUFEX1RJTUVPVVRfRVhQSVJFRCkgICwicmVhZCB0aW1lb3V0IGV4cGlyZWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX1JFQURfV1JPTkdfUEFDS0VUX1RZUEUpLCJyZWFkIHdyb25nIHBhY2tldCB0eXBlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9SRUNPUkRfTEVOR1RIX01JU01BVENIKSwicmVjb3JkIGxlbmd0aCBtaXNtYXRjaCJ9LAore0VSUl9SRUFTT04oU1NMX1JfUkVDT1JEX1RPT19MQVJHRSkgICAgICAsInJlY29yZCB0b28gbGFyZ2UifSwKK3tFUlJfUkVBU09OKFNTTF9SX1JFQ09SRF9UT09fU01BTEwpICAgICAgLCJyZWNvcmQgdG9vIHNtYWxsIn0sCit7RVJSX1JFQVNPTihTU0xfUl9SRU5FR09USUFURV9FWFRfVE9PX0xPTkcpLCJyZW5lZ290aWF0ZSBleHQgdG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX1JFTkVHT1RJQVRJT05fRU5DT0RJTkdfRVJSKSwicmVuZWdvdGlhdGlvbiBlbmNvZGluZyBlcnIifSwKK3tFUlJfUkVBU09OKFNTTF9SX1JFTkVHT1RJQVRJT05fTUlTTUFUQ0gpLCJyZW5lZ290aWF0aW9uIG1pc21hdGNoIn0sCit7RVJSX1JFQVNPTihTU0xfUl9SRVFVSVJFRF9DSVBIRVJfTUlTU0lORyksInJlcXVpcmVkIGNpcGhlciBtaXNzaW5nIn0sCit7RVJSX1JFQVNPTihTU0xfUl9SRVFVSVJFRF9DT01QUkVTU1NJT05fQUxHT1JJVEhNX01JU1NJTkcpLCJyZXF1aXJlZCBjb21wcmVzc3Npb24gYWxnb3JpdGhtIG1pc3NpbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX1JFVVNFX0NFUlRfTEVOR1RIX05PVF9aRVJPKSwicmV1c2UgY2VydCBsZW5ndGggbm90IHplcm8ifSwKK3tFUlJfUkVBU09OKFNTTF9SX1JFVVNFX0NFUlRfVFlQRV9OT1RfWkVSTyksInJldXNlIGNlcnQgdHlwZSBub3QgemVybyJ9LAore0VSUl9SRUFTT04oU1NMX1JfUkVVU0VfQ0lQSEVSX0xJU1RfTk9UX1pFUk8pLCJyZXVzZSBjaXBoZXIgbGlzdCBub3QgemVybyJ9LAore0VSUl9SRUFTT04oU1NMX1JfU0NTVl9SRUNFSVZFRF9XSEVOX1JFTkVHT1RJQVRJTkcpLCJzY3N2IHJlY2VpdmVkIHdoZW4gcmVuZWdvdGlhdGluZyJ9LAore0VSUl9SRUFTT04oU1NMX1JfU0VSVkVSSEVMTE9fVExTRVhUKSAgICAsInNlcnZlcmhlbGxvIHRsc2V4dCJ9LAore0VSUl9SRUFTT04oU1NMX1JfU0VTU0lPTl9JRF9DT05URVhUX1VOSU5JVElBTElaRUQpLCJzZXNzaW9uIGlkIGNvbnRleHQgdW5pbml0aWFsaXplZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfU0VTU0lPTl9NQVlfTk9UX0JFX0NSRUFURUQpLCJzZXNzaW9uIG1heSBub3QgYmUgY3JlYXRlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfU0hPUlRfUkVBRCkgICAgICAgICAgICAsInNob3J0IHJlYWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NJR05BVFVSRV9GT1JfTk9OX1NJR05JTkdfQ0VSVElGSUNBVEUpLCJzaWduYXR1cmUgZm9yIG5vbiBzaWduaW5nIGNlcnRpZmljYXRlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9TU0wyM19ET0lOR19TRVNTSU9OX0lEX1JFVVNFKSwic3NsMjMgZG9pbmcgc2Vzc2lvbiBpZCByZXVzZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMMl9DT05ORUNUSU9OX0lEX1RPT19MT05HKSwic3NsMiBjb25uZWN0aW9uIGlkIHRvbyBsb25nIn0sCit7RVJSX1JFQVNPTihTU0xfUl9TU0wzX0VYVF9JTlZBTElEX0VDUE9JTlRGT1JNQVQpLCJzc2wzIGV4dCBpbnZhbGlkIGVjcG9pbnRmb3JtYXQifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTDNfRVhUX0lOVkFMSURfU0VSVkVSTkFNRSksInNzbDMgZXh0IGludmFsaWQgc2VydmVybmFtZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMM19FWFRfSU5WQUxJRF9TRVJWRVJOQU1FX1RZUEUpLCJzc2wzIGV4dCBpbnZhbGlkIHNlcnZlcm5hbWUgdHlwZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMM19TRVNTSU9OX0lEX1RPT19MT05HKSwic3NsMyBzZXNzaW9uIGlkIHRvbyBsb25nIn0sCit7RVJSX1JFQVNPTihTU0xfUl9TU0wzX1NFU1NJT05fSURfVE9PX1NIT1JUKSwic3NsMyBzZXNzaW9uIGlkIHRvbyBzaG9ydCJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMVjNfQUxFUlRfQkFEX0NFUlRJRklDQVRFKSwic3NsdjMgYWxlcnQgYmFkIGNlcnRpZmljYXRlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9TU0xWM19BTEVSVF9CQURfUkVDT1JEX01BQyksInNzbHYzIGFsZXJ0IGJhZCByZWNvcmQgbWFjIn0sCit7RVJSX1JFQVNPTihTU0xfUl9TU0xWM19BTEVSVF9DRVJUSUZJQ0FURV9FWFBJUkVEKSwic3NsdjMgYWxlcnQgY2VydGlmaWNhdGUgZXhwaXJlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMVjNfQUxFUlRfQ0VSVElGSUNBVEVfUkVWT0tFRCksInNzbHYzIGFsZXJ0IGNlcnRpZmljYXRlIHJldm9rZWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTFYzX0FMRVJUX0NFUlRJRklDQVRFX1VOS05PV04pLCJzc2x2MyBhbGVydCBjZXJ0aWZpY2F0ZSB1bmtub3duIn0sCit7RVJSX1JFQVNPTihTU0xfUl9TU0xWM19BTEVSVF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkUpLCJzc2x2MyBhbGVydCBkZWNvbXByZXNzaW9uIGZhaWx1cmUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTFYzX0FMRVJUX0hBTkRTSEFLRV9GQUlMVVJFKSwic3NsdjMgYWxlcnQgaGFuZHNoYWtlIGZhaWx1cmUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTFYzX0FMRVJUX0lMTEVHQUxfUEFSQU1FVEVSKSwic3NsdjMgYWxlcnQgaWxsZWdhbCBwYXJhbWV0ZXIifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTFYzX0FMRVJUX05PX0NFUlRJRklDQVRFKSwic3NsdjMgYWxlcnQgbm8gY2VydGlmaWNhdGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTFYzX0FMRVJUX1VORVhQRUNURURfTUVTU0FHRSksInNzbHYzIGFsZXJ0IHVuZXhwZWN0ZWQgbWVzc2FnZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMVjNfQUxFUlRfVU5TVVBQT1JURURfQ0VSVElGSUNBVEUpLCJzc2x2MyBhbGVydCB1bnN1cHBvcnRlZCBjZXJ0aWZpY2F0ZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMX0NUWF9IQVNfTk9fREVGQVVMVF9TU0xfVkVSU0lPTiksInNzbCBjdHggaGFzIG5vIGRlZmF1bHQgc3NsIHZlcnNpb24ifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTF9IQU5EU0hBS0VfRkFJTFVSRSkgLCJzc2wgaGFuZHNoYWtlIGZhaWx1cmUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTF9MSUJSQVJZX0hBU19OT19DSVBIRVJTKSwic3NsIGxpYnJhcnkgaGFzIG5vIGNpcGhlcnMifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTF9TRVNTSU9OX0lEX0NBTExCQUNLX0ZBSUxFRCksInNzbCBzZXNzaW9uIGlkIGNhbGxiYWNrIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMX1NFU1NJT05fSURfQ09ORkxJQ1QpLCJzc2wgc2Vzc2lvbiBpZCBjb25mbGljdCJ9LAore0VSUl9SRUFTT04oU1NMX1JfU1NMX1NFU1NJT05fSURfQ09OVEVYVF9UT09fTE9ORyksInNzbCBzZXNzaW9uIGlkIGNvbnRleHQgdG9vIGxvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTF9TRVNTSU9OX0lEX0hBU19CQURfTEVOR1RIKSwic3NsIHNlc3Npb24gaWQgaGFzIGJhZCBsZW5ndGgifSwKK3tFUlJfUkVBU09OKFNTTF9SX1NTTF9TRVNTSU9OX0lEX0lTX0RJRkZFUkVOVCksInNzbCBzZXNzaW9uIGlkIGlzIGRpZmZlcmVudCJ9LAore0VSUl9SRUFTT04oU1NMX1JfVExTVjFfQUxFUlRfQUNDRVNTX0RFTklFRCksInRsc3YxIGFsZXJ0IGFjY2VzcyBkZW5pZWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU1YxX0FMRVJUX0RFQ09ERV9FUlJPUiksInRsc3YxIGFsZXJ0IGRlY29kZSBlcnJvciJ9LAore0VSUl9SRUFTT04oU1NMX1JfVExTVjFfQUxFUlRfREVDUllQVElPTl9GQUlMRUQpLCJ0bHN2MSBhbGVydCBkZWNyeXB0aW9uIGZhaWxlZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfVExTVjFfQUxFUlRfREVDUllQVF9FUlJPUiksInRsc3YxIGFsZXJ0IGRlY3J5cHQgZXJyb3IifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU1YxX0FMRVJUX0VYUE9SVF9SRVNUUklDVElPTiksInRsc3YxIGFsZXJ0IGV4cG9ydCByZXN0cmljdGlvbiJ9LAore0VSUl9SRUFTT04oU1NMX1JfVExTVjFfQUxFUlRfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZKSwidGxzdjEgYWxlcnQgaW5zdWZmaWNpZW50IHNlY3VyaXR5In0sCit7RVJSX1JFQVNPTihTU0xfUl9UTFNWMV9BTEVSVF9JTlRFUk5BTF9FUlJPUiksInRsc3YxIGFsZXJ0IGludGVybmFsIGVycm9yIn0sCit7RVJSX1JFQVNPTihTU0xfUl9UTFNWMV9BTEVSVF9OT19SRU5FR09USUFUSU9OKSwidGxzdjEgYWxlcnQgbm8gcmVuZWdvdGlhdGlvbiJ9LAore0VSUl9SRUFTT04oU1NMX1JfVExTVjFfQUxFUlRfUFJPVE9DT0xfVkVSU0lPTiksInRsc3YxIGFsZXJ0IHByb3RvY29sIHZlcnNpb24ifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU1YxX0FMRVJUX1JFQ09SRF9PVkVSRkxPVyksInRsc3YxIGFsZXJ0IHJlY29yZCBvdmVyZmxvdyJ9LAore0VSUl9SRUFTT04oU1NMX1JfVExTVjFfQUxFUlRfVU5LTk9XTl9DQSksInRsc3YxIGFsZXJ0IHVua25vd24gY2EifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU1YxX0FMRVJUX1VTRVJfQ0FOQ0VMTEVEKSwidGxzdjEgYWxlcnQgdXNlciBjYW5jZWxsZWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU1YxX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFKSwidGxzdjEgYmFkIGNlcnRpZmljYXRlIGhhc2ggdmFsdWUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU1YxX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0UpLCJ0bHN2MSBiYWQgY2VydGlmaWNhdGUgc3RhdHVzIHJlc3BvbnNlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9UTFNWMV9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEUpLCJ0bHN2MSBjZXJ0aWZpY2F0ZSB1bm9idGFpbmFibGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU1YxX1VOUkVDT0dOSVpFRF9OQU1FKSwidGxzdjEgdW5yZWNvZ25pemVkIG5hbWUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU1YxX1VOU1VQUE9SVEVEX0VYVEVOU0lPTiksInRsc3YxIHVuc3VwcG9ydGVkIGV4dGVuc2lvbiJ9LAore0VSUl9SRUFTT04oU1NMX1JfVExTX0NMSUVOVF9DRVJUX1JFUV9XSVRIX0FOT05fQ0lQSEVSKSwidGxzIGNsaWVudCBjZXJ0IHJlcSB3aXRoIGFub24gY2lwaGVyIn0sCit7RVJSX1JFQVNPTihTU0xfUl9UTFNfSU5WQUxJRF9FQ1BPSU5URk9STUFUX0xJU1QpLCJ0bHMgaW52YWxpZCBlY3BvaW50Zm9ybWF0IGxpc3QifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RMU19QRUVSX0RJRF9OT1RfUkVTUE9ORF9XSVRIX0NFUlRJRklDQVRFX0xJU1QpLCJ0bHMgcGVlciBkaWQgbm90IHJlc3BvbmQgd2l0aCBjZXJ0aWZpY2F0ZSBsaXN0In0sCit7RVJSX1JFQVNPTihTU0xfUl9UTFNfUlNBX0VOQ1JZUFRFRF9WQUxVRV9MRU5HVEhfSVNfV1JPTkcpLCJ0bHMgcnNhIGVuY3J5cHRlZCB2YWx1ZSBsZW5ndGggaXMgd3JvbmcifSwKK3tFUlJfUkVBU09OKFNTTF9SX1RSSUVEX1RPX1VTRV9VTlNVUFBPUlRFRF9DSVBIRVIpLCJ0cmllZCB0byB1c2UgdW5zdXBwb3J0ZWQgY2lwaGVyIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTkFCTEVfVE9fREVDT0RFX0RIX0NFUlRTKSwidW5hYmxlIHRvIGRlY29kZSBkaCBjZXJ0cyJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5BQkxFX1RPX0RFQ09ERV9FQ0RIX0NFUlRTKSwidW5hYmxlIHRvIGRlY29kZSBlY2RoIGNlcnRzIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTkFCTEVfVE9fRVhUUkFDVF9QVUJMSUNfS0VZKSwidW5hYmxlIHRvIGV4dHJhY3QgcHVibGljIGtleSJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5BQkxFX1RPX0ZJTkRfREhfUEFSQU1FVEVSUyksInVuYWJsZSB0byBmaW5kIGRoIHBhcmFtZXRlcnMifSwKK3tFUlJfUkVBU09OKFNTTF9SX1VOQUJMRV9UT19GSU5EX0VDREhfUEFSQU1FVEVSUyksInVuYWJsZSB0byBmaW5kIGVjZGggcGFyYW1ldGVycyJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5BQkxFX1RPX0ZJTkRfUFVCTElDX0tFWV9QQVJBTUVURVJTKSwidW5hYmxlIHRvIGZpbmQgcHVibGljIGtleSBwYXJhbWV0ZXJzIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTkFCTEVfVE9fRklORF9TU0xfTUVUSE9EKSwidW5hYmxlIHRvIGZpbmQgc3NsIG1ldGhvZCJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5BQkxFX1RPX0xPQURfU1NMMl9NRDVfUk9VVElORVMpLCJ1bmFibGUgdG8gbG9hZCBzc2wyIG1kNSByb3V0aW5lcyJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5BQkxFX1RPX0xPQURfU1NMM19NRDVfUk9VVElORVMpLCJ1bmFibGUgdG8gbG9hZCBzc2wzIG1kNSByb3V0aW5lcyJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5BQkxFX1RPX0xPQURfU1NMM19TSEExX1JPVVRJTkVTKSwidW5hYmxlIHRvIGxvYWQgc3NsMyBzaGExIHJvdXRpbmVzIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTkVYUEVDVEVEX01FU1NBR0UpICAgICwidW5leHBlY3RlZCBtZXNzYWdlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTkVYUEVDVEVEX1JFQ09SRCkgICAgICwidW5leHBlY3RlZCByZWNvcmQifSwKK3tFUlJfUkVBU09OKFNTTF9SX1VOSU5JVElBTElaRUQpICAgICAgICAgLCJ1bmluaXRpYWxpemVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTktOT1dOX0FMRVJUX1RZUEUpICAgICwidW5rbm93biBhbGVydCB0eXBlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTktOT1dOX0NFUlRJRklDQVRFX1RZUEUpLCJ1bmtub3duIGNlcnRpZmljYXRlIHR5cGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1VOS05PV05fQ0lQSEVSX1JFVFVSTkVEKSwidW5rbm93biBjaXBoZXIgcmV0dXJuZWQifSwKK3tFUlJfUkVBU09OKFNTTF9SX1VOS05PV05fQ0lQSEVSX1RZUEUpICAgLCJ1bmtub3duIGNpcGhlciB0eXBlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTktOT1dOX0tFWV9FWENIQU5HRV9UWVBFKSwidW5rbm93biBrZXkgZXhjaGFuZ2UgdHlwZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5LTk9XTl9QS0VZX1RZUEUpICAgICAsInVua25vd24gcGtleSB0eXBlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTktOT1dOX1BST1RPQ09MKSAgICAgICwidW5rbm93biBwcm90b2NvbCJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5LTk9XTl9SRU1PVEVfRVJST1JfVFlQRSksInVua25vd24gcmVtb3RlIGVycm9yIHR5cGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1VOS05PV05fU1NMX1ZFUlNJT04pICAgLCJ1bmtub3duIHNzbCB2ZXJzaW9uIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTktOT1dOX1NUQVRFKSAgICAgICAgICwidW5rbm93biBzdGF0ZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OX0RJU0FCTEVEKSwidW5zYWZlIGxlZ2FjeSByZW5lZ290aWF0aW9uIGRpc2FibGVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTlNVUFBPUlRFRF9DSVBIRVIpICAgICwidW5zdXBwb3J0ZWQgY2lwaGVyIn0sCit7RVJSX1JFQVNPTihTU0xfUl9VTlNVUFBPUlRFRF9DT01QUkVTU0lPTl9BTEdPUklUSE0pLCJ1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiBhbGdvcml0aG0ifSwKK3tFUlJfUkVBU09OKFNTTF9SX1VOU1VQUE9SVEVEX0RJR0VTVF9UWVBFKSwidW5zdXBwb3J0ZWQgZGlnZXN0IHR5cGUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1VOU1VQUE9SVEVEX0VMTElQVElDX0NVUlZFKSwidW5zdXBwb3J0ZWQgZWxsaXB0aWMgY3VydmUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1VOU1VQUE9SVEVEX1BST1RPQ09MKSAgLCJ1bnN1cHBvcnRlZCBwcm90b2NvbCJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5TVVBQT1JURURfU1NMX1ZFUlNJT04pLCJ1bnN1cHBvcnRlZCBzc2wgdmVyc2lvbiJ9LAore0VSUl9SRUFTT04oU1NMX1JfVU5TVVBQT1JURURfU1RBVFVTX1RZUEUpLCJ1bnN1cHBvcnRlZCBzdGF0dXMgdHlwZSJ9LAore0VSUl9SRUFTT04oU1NMX1JfV1JJVEVfQklPX05PVF9TRVQpICAgICAsIndyaXRlIGJpbyBub3Qgc2V0In0sCit7RVJSX1JFQVNPTihTU0xfUl9XUk9OR19DSVBIRVJfUkVUVVJORUQpICwid3JvbmcgY2lwaGVyIHJldHVybmVkIn0sCit7RVJSX1JFQVNPTihTU0xfUl9XUk9OR19NRVNTQUdFX1RZUEUpICAgICwid3JvbmcgbWVzc2FnZSB0eXBlIn0sCit7RVJSX1JFQVNPTihTU0xfUl9XUk9OR19OVU1CRVJfT0ZfS0VZX0JJVFMpLCJ3cm9uZyBudW1iZXIgb2Yga2V5IGJpdHMifSwKK3tFUlJfUkVBU09OKFNTTF9SX1dST05HX1NJR05BVFVSRV9MRU5HVEgpLCJ3cm9uZyBzaWduYXR1cmUgbGVuZ3RoIn0sCit7RVJSX1JFQVNPTihTU0xfUl9XUk9OR19TSUdOQVRVUkVfU0laRSkgICwid3Jvbmcgc2lnbmF0dXJlIHNpemUifSwKK3tFUlJfUkVBU09OKFNTTF9SX1dST05HX1NTTF9WRVJTSU9OKSAgICAgLCJ3cm9uZyBzc2wgdmVyc2lvbiJ9LAore0VSUl9SRUFTT04oU1NMX1JfV1JPTkdfVkVSU0lPTl9OVU1CRVIpICAsIndyb25nIHZlcnNpb24gbnVtYmVyIn0sCit7RVJSX1JFQVNPTihTU0xfUl9YNTA5X0xJQikgICAgICAgICAgICAgICwieDUwOSBsaWIifSwKK3tFUlJfUkVBU09OKFNTTF9SX1g1MDlfVkVSSUZJQ0FUSU9OX1NFVFVQX1BST0JMRU1TKSwieDUwOSB2ZXJpZmljYXRpb24gc2V0dXAgcHJvYmxlbXMifSwKK3swLE5VTEx9CisJfTsKKworI2VuZGlmCisKK3ZvaWQgRVJSX2xvYWRfU1NMX3N0cmluZ3Modm9pZCkKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fRVJSCisKKwlpZiAoRVJSX2Z1bmNfZXJyb3Jfc3RyaW5nKFNTTF9zdHJfZnVuY3RzWzBdLmVycm9yKSA9PSBOVUxMKQorCQl7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxTU0xfc3RyX2Z1bmN0cyk7CisJCUVSUl9sb2FkX3N0cmluZ3MoMCxTU0xfc3RyX3JlYXNvbnMpOworCQl9CisjZW5kaWYKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvc3NsX2VycjIuYyBiL2xpYi9vcGVuc3NsL3NzbC9zc2xfZXJyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTVhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvc3NsX2VycjIuYwpAQCAtMCwwICsxLDcwIEBACisvKiBzc2wvc3NsX2VycjIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisKK3ZvaWQgU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncyh2b2lkKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FUlIKKwlFUlJfbG9hZF9jcnlwdG9fc3RyaW5ncygpOworCUVSUl9sb2FkX1NTTF9zdHJpbmdzKCk7CisjZW5kaWYKKwl9CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zc2xfbGliLmMgYi9saWIvb3BlbnNzbC9zc2wvc3NsX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjBkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvc3NsX2xpYi5jCkBAIC0wLDAgKzEsMzEwMiBAQAorLyohIFxmaWxlIHNzbC9zc2xfbGliLmMKKyAqICBcYnJpZWYgVmVyc2lvbiBpbmRlcGVuZGVudCBTU0wgZnVuY3Rpb25zLgorICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDcgVGhlIE9wZW5TU0wgUHJvamVjdC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcworICogICAgc29mdHdhcmUgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQuIChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogNC4gVGhlIG5hbWVzICJPcGVuU1NMIFRvb2xraXQiIGFuZCAiT3BlblNTTCBQcm9qZWN0IiBtdXN0IG5vdCBiZSB1c2VkIHRvCisgKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdAorICogICAgb3BlbnNzbC1jb3JlQG9wZW5zc2wub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJPcGVuU1NMIgorICogICAgbm9yIG1heSAiT3BlblNTTCIgYXBwZWFyIGluIHRoZWlyIG5hbWVzIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgorICogICAgcGVybWlzc2lvbiBvZiB0aGUgT3BlblNTTCBQcm9qZWN0LgorICoKKyAqIDYuIFJlZGlzdHJpYnV0aW9ucyBvZiBhbnkgZm9ybSB3aGF0c29ldmVyIG11c3QgcmV0YWluIHRoZSBmb2xsb3dpbmcKKyAqICAgIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0IChodHRwOi8vd3d3Lm9wZW5zc2wub3JnLykiCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgT3BlblNTTCBQUk9KRUNUIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgT3BlblNTTCBQUk9KRUNUIE9SCisgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQKKyAqIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieSBFcmljIFlvdW5nCisgKiAoZWF5QGNyeXB0c29mdC5jb20pLiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltCisgKiBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwMiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFMTCBSSUdIVFMgUkVTRVJWRUQuCisgKiBFQ0MgY2lwaGVyIHN1aXRlIHN1cHBvcnQgaW4gT3BlblNTTCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSAKKyAqIFNVTiBNSUNST1NZU1RFTVMsIElOQy4sIGFuZCBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDUgTm9raWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIHBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGlzIGRldmVsb3BlZCBieQorICogTm9raWEgQ29ycG9yYXRpb24gYW5kIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlLgorICoKKyAqIFRoZSBDb250cmlidXRpb24sIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZgorICogTm9raWEgQ29ycG9yYXRpb24sIGNvbnNpc3RzIG9mIHRoZSAiUFNLIiAoUHJlLVNoYXJlZCBLZXkpIGNpcGhlcnN1aXRlcworICogc3VwcG9ydCAoc2VlIFJGQyA0Mjc5KSB0byBPcGVuU1NMLgorICoKKyAqIE5vIHBhdGVudCBsaWNlbnNlcyBvciBvdGhlciByaWdodHMgZXhjZXB0IHRob3NlIGV4cHJlc3NseSBzdGF0ZWQgaW4KKyAqIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlIGxpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIGdyYW50ZWQgb3IgcmVjZWl2ZWQKKyAqIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsLCBvciBvdGhlcndpc2UuCisgKgorICogTm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgTm9raWEgdGhhdCB0aGUgQ29udHJpYnV0aW9uIGRvZXMgbm90CisgKiBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IHRoaXJkCisgKiBwYXJ0eSBvciB0aGF0IHRoZSBsaWNlbnNlIHByb3ZpZGVzIHlvdSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHJpZ2h0cworICogdG8gbWFrZSB1c2Ugb2YgdGhlIENvbnRyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELiBJTgorICogQURESVRJT04gVE8gVEhFIERJU0NMQUlNRVJTIElOQ0xVREVEIElOIFRIRSBMSUNFTlNFLCBOT0tJQQorICogU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIEZPUiBDTEFJTVMgQlJPVUdIVCBCWSBZT1UgT1IgQU5ZCisgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKKyAqIE9USEVSV0lTRS4KKyAqLworCisjaWZkZWYgUkVGX0NIRUNLCisjICBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKyNpbmNsdWRlICJrc3NsX2xjbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbGhhc2guaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvcmFuZC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2NzcC5oPgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisjaW5jbHVkZSA8b3BlbnNzbC9kaC5oPgorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorCitjb25zdCBjaGFyICpTU0xfdmVyc2lvbl9zdHI9T1BFTlNTTF9WRVJTSU9OX1RFWFQ7CisKK1NTTDNfRU5DX01FVEhPRCBzc2wzX3VuZGVmX2VuY19tZXRob2Q9eworCS8qIGV2aWwgY2FzdHMsIGJ1dCB0aGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZXJlJ3MgYSBsaWJyYXJ5IGJ1ZyAqLworCShpbnQgKCopKFNTTCAqLGludCkpc3NsX3VuZGVmaW5lZF9mdW5jdGlvbiwKKwkoaW50ICgqKShTU0wgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpKXNzbF91bmRlZmluZWRfZnVuY3Rpb24sCisJc3NsX3VuZGVmaW5lZF9mdW5jdGlvbiwKKwkoaW50ICgqKShTU0wgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCkpc3NsX3VuZGVmaW5lZF9mdW5jdGlvbiwKKwkoaW50ICgqKShTU0wqLCBpbnQpKXNzbF91bmRlZmluZWRfZnVuY3Rpb24sCisJKGludCAoKikoU1NMICosICBjb25zdCBjaGFyKiwgaW50LCB1bnNpZ25lZCBjaGFyICopKXNzbF91bmRlZmluZWRfZnVuY3Rpb24sCisJMCwJLyogZmluaXNoX21hY19sZW5ndGggKi8KKwkoaW50ICgqKShTU0wgKiwgaW50LCB1bnNpZ25lZCBjaGFyICopKXNzbF91bmRlZmluZWRfZnVuY3Rpb24sCisJTlVMTCwJLyogY2xpZW50X2ZpbmlzaGVkX2xhYmVsICovCisJMCwJLyogY2xpZW50X2ZpbmlzaGVkX2xhYmVsX2xlbiAqLworCU5VTEwsCS8qIHNlcnZlcl9maW5pc2hlZF9sYWJlbCAqLworCTAsCS8qIHNlcnZlcl9maW5pc2hlZF9sYWJlbF9sZW4gKi8KKwkoaW50ICgqKShpbnQpKXNzbF91bmRlZmluZWRfZnVuY3Rpb24KKwl9OworCitpbnQgU1NMX2NsZWFyKFNTTCAqcykKKwl7CisKKwlpZiAocy0+bWV0aG9kID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DTEVBUixTU0xfUl9OT19NRVRIT0RfU1BFQ0lGSUVEKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlpZiAoc3NsX2NsZWFyX2JhZF9zZXNzaW9uKHMpKQorCQl7CisJCVNTTF9TRVNTSU9OX2ZyZWUocy0+c2Vzc2lvbik7CisJCXMtPnNlc3Npb249TlVMTDsKKwkJfQorCisJcy0+ZXJyb3I9MDsKKwlzLT5oaXQ9MDsKKwlzLT5zaHV0ZG93bj0wOworCisjaWYgMCAvKiBEaXNhYmxlZCBzaW5jZSB2ZXJzaW9uIDEuMTAgb2YgdGhpcyBmaWxlIChlYXJseSByZXR1cm4gbm90CisgICAgICAgKiBuZWVkZWQgYmVjYXVzZSBTU0xfY2xlYXIgaXMgbm90IGNhbGxlZCB3aGVuIGRvaW5nIHJlbmVnb3RpYXRpb24pICovCisJLyogVGhpcyBpcyBzZXQgaWYgd2UgYXJlIGRvaW5nIGR5bmFtaWMgcmVuZWdvdGlhdGlvbiBzbyBrZWVwCisJICogdGhlIG9sZCBjaXBoZXIuICBJdCBpcyBzb3J0IG9mIGEgU1NMX2NsZWFyX2xpdGUgOi0pICovCisJaWYgKHMtPm5ld19zZXNzaW9uKSByZXR1cm4oMSk7CisjZWxzZQorCWlmIChzLT5uZXdfc2Vzc2lvbikKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NMRUFSLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJCX0KKyNlbmRpZgorCisJcy0+dHlwZT0wOworCisJcy0+c3RhdGU9U1NMX1NUX0JFRk9SRXwoKHMtPnNlcnZlcik/U1NMX1NUX0FDQ0VQVDpTU0xfU1RfQ09OTkVDVCk7CisKKwlzLT52ZXJzaW9uPXMtPm1ldGhvZC0+dmVyc2lvbjsKKwlzLT5jbGllbnRfdmVyc2lvbj1zLT52ZXJzaW9uOworCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJcy0+cnN0YXRlPVNTTF9TVF9SRUFEX0hFQURFUjsKKyNpZiAwCisJcy0+cmVhZF9haGVhZD1zLT5jdHgtPnJlYWRfYWhlYWQ7CisjZW5kaWYKKworCWlmIChzLT5pbml0X2J1ZiAhPSBOVUxMKQorCQl7CisJCUJVRl9NRU1fZnJlZShzLT5pbml0X2J1Zik7CisJCXMtPmluaXRfYnVmPU5VTEw7CisJCX0KKworCXNzbF9jbGVhcl9jaXBoZXJfY3R4KHMpOworCXNzbF9jbGVhcl9oYXNoX2N0eCgmcy0+cmVhZF9oYXNoKTsKKwlzc2xfY2xlYXJfaGFzaF9jdHgoJnMtPndyaXRlX2hhc2gpOworCisJcy0+Zmlyc3RfcGFja2V0PTA7CisKKyNpZiAxCisJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHdlcmUgY2hhbmdlZCBpbnRvIGEgZGlmZmVyZW50IG1ldGhvZCwgaWYKKwkgKiBzbywgcmV2ZXJ0IGJhY2sgaWYgd2UgYXJlIG5vdCBkb2luZyBzZXNzaW9uLWlkIHJldXNlLiAqLworCWlmICghcy0+aW5faGFuZHNoYWtlICYmIChzLT5zZXNzaW9uID09IE5VTEwpICYmIChzLT5tZXRob2QgIT0gcy0+Y3R4LT5tZXRob2QpKQorCQl7CisJCXMtPm1ldGhvZC0+c3NsX2ZyZWUocyk7CisJCXMtPm1ldGhvZD1zLT5jdHgtPm1ldGhvZDsKKwkJaWYgKCFzLT5tZXRob2QtPnNzbF9uZXcocykpCisJCQlyZXR1cm4oMCk7CisJCX0KKwllbHNlCisjZW5kaWYKKwkJcy0+bWV0aG9kLT5zc2xfY2xlYXIocyk7CisJcmV0dXJuKDEpOworCX0KKworLyoqIFVzZWQgdG8gY2hhbmdlIGFuIFNTTF9DVFhzIGRlZmF1bHQgU1NMIG1ldGhvZCB0eXBlICovCitpbnQgU1NMX0NUWF9zZXRfc3NsX3ZlcnNpb24oU1NMX0NUWCAqY3R4LGNvbnN0IFNTTF9NRVRIT0QgKm1ldGgpCisJeworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpzazsKKworCWN0eC0+bWV0aG9kPW1ldGg7CisKKwlzaz1zc2xfY3JlYXRlX2NpcGhlcl9saXN0KGN0eC0+bWV0aG9kLCYoY3R4LT5jaXBoZXJfbGlzdCksCisJCSYoY3R4LT5jaXBoZXJfbGlzdF9ieV9pZCksCisJCW1ldGgtPnZlcnNpb24gPT0gU1NMMl9WRVJTSU9OID8gIlNTTHYyIiA6IFNTTF9ERUZBVUxUX0NJUEhFUl9MSVNUKTsKKwlpZiAoKHNrID09IE5VTEwpIHx8IChza19TU0xfQ0lQSEVSX251bShzaykgPD0gMCkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfU0VUX1NTTF9WRVJTSU9OLFNTTF9SX1NTTF9MSUJSQVJZX0hBU19OT19DSVBIRVJTKTsKKwkJcmV0dXJuKDApOworCQl9CisJcmV0dXJuKDEpOworCX0KKworU1NMICpTU0xfbmV3KFNTTF9DVFggKmN0eCkKKwl7CisJU1NMICpzOworCisJaWYgKGN0eCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfTkVXLFNTTF9SX05VTExfU1NMX0NUWCk7CisJCXJldHVybihOVUxMKTsKKwkJfQorCWlmIChjdHgtPm1ldGhvZCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfTkVXLFNTTF9SX1NTTF9DVFhfSEFTX05PX0RFRkFVTFRfU1NMX1ZFUlNJT04pOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKworCXM9KFNTTCAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihTU0wpKTsKKwlpZiAocyA9PSBOVUxMKSBnb3RvIGVycjsKKwltZW1zZXQocywwLHNpemVvZihTU0wpKTsKKworI2lmbmRlZglPUEVOU1NMX05PX0tSQjUKKwlzLT5rc3NsX2N0eCA9IGtzc2xfY3R4X25ldygpOworI2VuZGlmCS8qIE9QRU5TU0xfTk9fS1JCNSAqLworCisJcy0+b3B0aW9ucz1jdHgtPm9wdGlvbnM7CisJcy0+bW9kZT1jdHgtPm1vZGU7CisJcy0+bWF4X2NlcnRfbGlzdD1jdHgtPm1heF9jZXJ0X2xpc3Q7CisKKwlpZiAoY3R4LT5jZXJ0ICE9IE5VTEwpCisJCXsKKwkJLyogRWFybGllciBsaWJyYXJ5IHZlcnNpb25zIHVzZWQgdG8gY29weSB0aGUgcG9pbnRlciB0bworCQkgKiB0aGUgQ0VSVCwgbm90IGl0cyBjb250ZW50czsgb25seSB3aGVuIHNldHRpbmcgbmV3CisJCSAqIHBhcmFtZXRlcnMgZm9yIHRoZSBwZXItU1NMIGNvcHksIHNzbF9jZXJ0X25ldyB3b3VsZCBiZQorCQkgKiBjYWxsZWQgKGFuZCB0aGUgZGlyZWN0IHJlZmVyZW5jZSB0byB0aGUgcGVyLVNTTF9DVFgKKwkJICogc2V0dGluZ3Mgd291bGQgYmUgbG9zdCwgYnV0IHRob3NlIHN0aWxsIHdlcmUgaW5kaXJlY3RseQorCQkgKiBhY2Nlc3NlZCBmb3IgdmFyaW91cyBwdXJwb3NlcywgYW5kIGZvciB0aGF0IHJlYXNvbiB0aGV5CisJCSAqIHVzZWQgdG8gYmUga25vd24gYXMgcy0+Y3R4LT5kZWZhdWx0X2NlcnQpLgorCQkgKiBOb3cgd2UgZG9uJ3QgbG9vayBhdCB0aGUgU1NMX0NUWCdzIENFUlQgYWZ0ZXIgaGF2aW5nCisJCSAqIGR1cGxpY2F0ZWQgaXQgb25jZS4gKi8KKworCQlzLT5jZXJ0ID0gc3NsX2NlcnRfZHVwKGN0eC0+Y2VydCk7CisJCWlmIChzLT5jZXJ0ID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJfQorCWVsc2UKKwkJcy0+Y2VydD1OVUxMOyAvKiBDYW5ub3QgcmVhbGx5IGhhcHBlbiAoc2VlIFNTTF9DVFhfbmV3KSAqLworCisJcy0+cmVhZF9haGVhZD1jdHgtPnJlYWRfYWhlYWQ7CisJcy0+bXNnX2NhbGxiYWNrPWN0eC0+bXNnX2NhbGxiYWNrOworCXMtPm1zZ19jYWxsYmFja19hcmc9Y3R4LT5tc2dfY2FsbGJhY2tfYXJnOworCXMtPnZlcmlmeV9tb2RlPWN0eC0+dmVyaWZ5X21vZGU7CisjaWYgMAorCXMtPnZlcmlmeV9kZXB0aD1jdHgtPnZlcmlmeV9kZXB0aDsKKyNlbmRpZgorCXMtPnNpZF9jdHhfbGVuZ3RoPWN0eC0+c2lkX2N0eF9sZW5ndGg7CisJT1BFTlNTTF9hc3NlcnQocy0+c2lkX2N0eF9sZW5ndGggPD0gc2l6ZW9mIHMtPnNpZF9jdHgpOworCW1lbWNweSgmcy0+c2lkX2N0eCwmY3R4LT5zaWRfY3R4LHNpemVvZihzLT5zaWRfY3R4KSk7CisJcy0+dmVyaWZ5X2NhbGxiYWNrPWN0eC0+ZGVmYXVsdF92ZXJpZnlfY2FsbGJhY2s7CisJcy0+c2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkPTE7CisJcy0+Z2VuZXJhdGVfc2Vzc2lvbl9pZD1jdHgtPmdlbmVyYXRlX3Nlc3Npb25faWQ7CisKKwlzLT5wYXJhbSA9IFg1MDlfVkVSSUZZX1BBUkFNX25ldygpOworCWlmICghcy0+cGFyYW0pCisJCWdvdG8gZXJyOworCVg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQocy0+cGFyYW0sIGN0eC0+cGFyYW0pOworI2lmIDAKKwlzLT5wdXJwb3NlID0gY3R4LT5wdXJwb3NlOworCXMtPnRydXN0ID0gY3R4LT50cnVzdDsKKyNlbmRpZgorCXMtPnF1aWV0X3NodXRkb3duPWN0eC0+cXVpZXRfc2h1dGRvd247CisJcy0+bWF4X3NlbmRfZnJhZ21lbnQgPSBjdHgtPm1heF9zZW5kX2ZyYWdtZW50OworCisJQ1JZUFRPX2FkZCgmY3R4LT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJcy0+Y3R4PWN0eDsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlzLT50bHNleHRfZGVidWdfY2IgPSAwOworCXMtPnRsc2V4dF9kZWJ1Z19hcmcgPSBOVUxMOworCXMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQgPSAwOworCXMtPnRsc2V4dF9zdGF0dXNfdHlwZSA9IC0xOworCXMtPnRsc2V4dF9zdGF0dXNfZXhwZWN0ZWQgPSAwOworCXMtPnRsc2V4dF9vY3NwX2lkcyA9IE5VTEw7CisJcy0+dGxzZXh0X29jc3BfZXh0cyA9IE5VTEw7CisJcy0+dGxzZXh0X29jc3BfcmVzcCA9IE5VTEw7CisJcy0+dGxzZXh0X29jc3BfcmVzcGxlbiA9IC0xOworCUNSWVBUT19hZGQoJmN0eC0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1NTTF9DVFgpOworCXMtPmluaXRpYWxfY3R4PWN0eDsKKyNlbmRpZgorCisJcy0+dmVyaWZ5X3Jlc3VsdD1YNTA5X1ZfT0s7CisKKwlzLT5tZXRob2Q9Y3R4LT5tZXRob2Q7CisKKwlpZiAoIXMtPm1ldGhvZC0+c3NsX25ldyhzKSkKKwkJZ290byBlcnI7CisKKwlzLT5yZWZlcmVuY2VzPTE7CisJcy0+c2VydmVyPShjdHgtPm1ldGhvZC0+c3NsX2FjY2VwdCA9PSBzc2xfdW5kZWZpbmVkX2Z1bmN0aW9uKT8wOjE7CisKKwlTU0xfY2xlYXIocyk7CisKKwlDUllQVE9fbmV3X2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1NTTCwgcywgJnMtPmV4X2RhdGEpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJcy0+cHNrX2NsaWVudF9jYWxsYmFjaz1jdHgtPnBza19jbGllbnRfY2FsbGJhY2s7CisJcy0+cHNrX3NlcnZlcl9jYWxsYmFjaz1jdHgtPnBza19zZXJ2ZXJfY2FsbGJhY2s7CisjZW5kaWYKKworCXJldHVybihzKTsKK2VycjoKKwlpZiAocyAhPSBOVUxMKQorCQl7CisJCWlmIChzLT5jZXJ0ICE9IE5VTEwpCisJCQlzc2xfY2VydF9mcmVlKHMtPmNlcnQpOworCQlpZiAocy0+Y3R4ICE9IE5VTEwpCisJCQlTU0xfQ1RYX2ZyZWUocy0+Y3R4KTsgLyogZGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCAqLworCQlPUEVOU1NMX2ZyZWUocyk7CisJCX0KKwlTU0xlcnIoU1NMX0ZfU1NMX05FVyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJcmV0dXJuKE5VTEwpOworCX0KKworaW50IFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChTU0xfQ1RYICpjdHgsY29uc3QgdW5zaWduZWQgY2hhciAqc2lkX2N0eCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgc2lkX2N0eF9sZW4pCisgICAgeworICAgIGlmKHNpZF9jdHhfbGVuID4gc2l6ZW9mIGN0eC0+c2lkX2N0eCkKKwl7CisJU1NMZXJyKFNTTF9GX1NTTF9DVFhfU0VUX1NFU1NJT05fSURfQ09OVEVYVCxTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05URVhUX1RPT19MT05HKTsKKwlyZXR1cm4gMDsKKwl9CisgICAgY3R4LT5zaWRfY3R4X2xlbmd0aD1zaWRfY3R4X2xlbjsKKyAgICBtZW1jcHkoY3R4LT5zaWRfY3R4LHNpZF9jdHgsc2lkX2N0eF9sZW4pOworCisgICAgcmV0dXJuIDE7CisgICAgfQorCitpbnQgU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQoU1NMICpzc2wsY29uc3QgdW5zaWduZWQgY2hhciAqc2lkX2N0eCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2lkX2N0eF9sZW4pCisgICAgeworICAgIGlmKHNpZF9jdHhfbGVuID4gU1NMX01BWF9TSURfQ1RYX0xFTkdUSCkKKwl7CisJU1NMZXJyKFNTTF9GX1NTTF9TRVRfU0VTU0lPTl9JRF9DT05URVhULFNTTF9SX1NTTF9TRVNTSU9OX0lEX0NPTlRFWFRfVE9PX0xPTkcpOworCXJldHVybiAwOworCX0KKyAgICBzc2wtPnNpZF9jdHhfbGVuZ3RoPXNpZF9jdHhfbGVuOworICAgIG1lbWNweShzc2wtPnNpZF9jdHgsc2lkX2N0eCxzaWRfY3R4X2xlbik7CisKKyAgICByZXR1cm4gMTsKKyAgICB9CisKK2ludCBTU0xfQ1RYX3NldF9nZW5lcmF0ZV9zZXNzaW9uX2lkKFNTTF9DVFggKmN0eCwgR0VOX1NFU1NJT05fQ0IgY2IpCisJeworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJY3R4LT5nZW5lcmF0ZV9zZXNzaW9uX2lkID0gY2I7CisJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1NTTF9DVFgpOworCXJldHVybiAxOworCX0KKworaW50IFNTTF9zZXRfZ2VuZXJhdGVfc2Vzc2lvbl9pZChTU0wgKnNzbCwgR0VOX1NFU1NJT05fQ0IgY2IpCisJeworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfU1NMKTsKKwlzc2wtPmdlbmVyYXRlX3Nlc3Npb25faWQgPSBjYjsKKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfU1NMKTsKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBTU0xfaGFzX21hdGNoaW5nX3Nlc3Npb25faWQoY29uc3QgU1NMICpzc2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlkLAorCQkJCXVuc2lnbmVkIGludCBpZF9sZW4pCisJeworCS8qIEEgcXVpY2sgZXhhbWluYXRpb24gb2YgU1NMX1NFU1NJT05faGFzaCBhbmQgU1NMX1NFU1NJT05fY21wIHNob3dzIGhvdworCSAqIHdlIGNhbiAiY29uc3RydWN0IiBhIHNlc3Npb24gdG8gZ2l2ZSB1cyB0aGUgZGVzaXJlZCBjaGVjayAtIGllLiB0bworCSAqIGZpbmQgaWYgdGhlcmUncyBhIHNlc3Npb24gaW4gdGhlIGhhc2ggdGFibGUgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoCisJICogYW55IG5ldyBzZXNzaW9uIGJ1aWx0IG91dCBvZiB0aGlzIGlkL2lkX2xlbiBhbmQgdGhlIHNzbF92ZXJzaW9uIGluCisJICogdXNlIGJ5IHRoaXMgU1NMLiAqLworCVNTTF9TRVNTSU9OIHIsICpwOworCisJaWYoaWRfbGVuID4gc2l6ZW9mIHIuc2Vzc2lvbl9pZCkKKwkJcmV0dXJuIDA7CisKKwlyLnNzbF92ZXJzaW9uID0gc3NsLT52ZXJzaW9uOworCXIuc2Vzc2lvbl9pZF9sZW5ndGggPSBpZF9sZW47CisJbWVtY3B5KHIuc2Vzc2lvbl9pZCwgaWQsIGlkX2xlbik7CisJLyogTkI6IFNTTHYyIGFsd2F5cyB1c2VzIGEgZml4ZWQgMTYtYnl0ZSBzZXNzaW9uIElELCBzbyBldmVuIGlmIGEKKwkgKiBjYWxsYmFjayBpcyBjYWxsaW5nIHVzIHRvIGNoZWNrIHRoZSB1bmlxdWVuZXNzIG9mIGEgc2hvcnRlciBJRCwgaXQKKwkgKiBtdXN0IGJlIGNvbXBhcmVkIGFzIGEgcGFkZGVkLW91dCBJRCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBpdCB3aWxsIGJlCisJICogY29udmVydGVkIHRvIHdoZW4gdGhlIGNhbGxiYWNrIGhhcyBmaW5pc2hlZCBjaG9vc2luZyBpdC4gKi8KKwlpZigoci5zc2xfdmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pICYmCisJCQkoaWRfbGVuIDwgU1NMMl9TU0xfU0VTU0lPTl9JRF9MRU5HVEgpKQorCQl7CisJCW1lbXNldChyLnNlc3Npb25faWQgKyBpZF9sZW4sIDAsCisJCQlTU0wyX1NTTF9TRVNTSU9OX0lEX0xFTkdUSCAtIGlkX2xlbik7CisJCXIuc2Vzc2lvbl9pZF9sZW5ndGggPSBTU0wyX1NTTF9TRVNTSU9OX0lEX0xFTkdUSDsKKwkJfQorCisJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKwlwID0gbGhfU1NMX1NFU1NJT05fcmV0cmlldmUoc3NsLT5jdHgtPnNlc3Npb25zLCAmcik7CisJQ1JZUFRPX3JfdW5sb2NrKENSWVBUT19MT0NLX1NTTF9DVFgpOworCXJldHVybiAocCAhPSBOVUxMKTsKKwl9CisKK2ludCBTU0xfQ1RYX3NldF9wdXJwb3NlKFNTTF9DVFggKnMsIGludCBwdXJwb3NlKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0X3B1cnBvc2Uocy0+cGFyYW0sIHB1cnBvc2UpOworCX0KKworaW50IFNTTF9zZXRfcHVycG9zZShTU0wgKnMsIGludCBwdXJwb3NlKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0X3B1cnBvc2Uocy0+cGFyYW0sIHB1cnBvc2UpOworCX0KKworaW50IFNTTF9DVFhfc2V0X3RydXN0KFNTTF9DVFggKnMsIGludCB0cnVzdCkKKwl7CisJcmV0dXJuIFg1MDlfVkVSSUZZX1BBUkFNX3NldF90cnVzdChzLT5wYXJhbSwgdHJ1c3QpOworCX0KKworaW50IFNTTF9zZXRfdHJ1c3QoU1NMICpzLCBpbnQgdHJ1c3QpCisJeworCXJldHVybiBYNTA5X1ZFUklGWV9QQVJBTV9zZXRfdHJ1c3Qocy0+cGFyYW0sIHRydXN0KTsKKwl9CisKK2ludCBTU0xfQ1RYX3NldDFfcGFyYW0oU1NMX0NUWCAqY3R4LCBYNTA5X1ZFUklGWV9QQVJBTSAqdnBtKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0MShjdHgtPnBhcmFtLCB2cG0pOworCX0KKworaW50IFNTTF9zZXQxX3BhcmFtKFNTTCAqc3NsLCBYNTA5X1ZFUklGWV9QQVJBTSAqdnBtKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fc2V0MShzc2wtPnBhcmFtLCB2cG0pOworCX0KKwordm9pZCBTU0xfZnJlZShTU0wgKnMpCisJeworCWludCBpOworCisJaWYocyA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJnMtPnJlZmVyZW5jZXMsLTEsQ1JZUFRPX0xPQ0tfU1NMKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlNTTCIscyk7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIlNTTF9mcmVlLCBiYWQgcmVmZXJlbmNlIGNvdW50XG4iKTsKKwkJYWJvcnQoKTsgLyogb2sgKi8KKwkJfQorI2VuZGlmCisKKwlpZiAocy0+cGFyYW0pCisJCVg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUocy0+cGFyYW0pOworCisJQ1JZUFRPX2ZyZWVfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfU1NMLCBzLCAmcy0+ZXhfZGF0YSk7CisKKwlpZiAocy0+YmJpbyAhPSBOVUxMKQorCQl7CisJCS8qIElmIHRoZSBidWZmZXJpbmcgQklPIGlzIGluIHBsYWNlLCBwb3AgaXQgb2ZmICovCisJCWlmIChzLT5iYmlvID09IHMtPndiaW8pCisJCQl7CisJCQlzLT53YmlvPUJJT19wb3Aocy0+d2Jpbyk7CisJCQl9CisJCUJJT19mcmVlKHMtPmJiaW8pOworCQlzLT5iYmlvPU5VTEw7CisJCX0KKwlpZiAocy0+cmJpbyAhPSBOVUxMKQorCQlCSU9fZnJlZV9hbGwocy0+cmJpbyk7CisJaWYgKChzLT53YmlvICE9IE5VTEwpICYmIChzLT53YmlvICE9IHMtPnJiaW8pKQorCQlCSU9fZnJlZV9hbGwocy0+d2Jpbyk7CisKKwlpZiAocy0+aW5pdF9idWYgIT0gTlVMTCkgQlVGX01FTV9mcmVlKHMtPmluaXRfYnVmKTsKKworCS8qIGFkZCBleHRyYSBzdHVmZiAqLworCWlmIChzLT5jaXBoZXJfbGlzdCAhPSBOVUxMKSBza19TU0xfQ0lQSEVSX2ZyZWUocy0+Y2lwaGVyX2xpc3QpOworCWlmIChzLT5jaXBoZXJfbGlzdF9ieV9pZCAhPSBOVUxMKSBza19TU0xfQ0lQSEVSX2ZyZWUocy0+Y2lwaGVyX2xpc3RfYnlfaWQpOworCisJLyogTWFrZSB0aGUgbmV4dCBjYWxsIHdvcmsgOi0pICovCisJaWYgKHMtPnNlc3Npb24gIT0gTlVMTCkKKwkJeworCQlzc2xfY2xlYXJfYmFkX3Nlc3Npb24ocyk7CisJCVNTTF9TRVNTSU9OX2ZyZWUocy0+c2Vzc2lvbik7CisJCX0KKworCXNzbF9jbGVhcl9jaXBoZXJfY3R4KHMpOworCXNzbF9jbGVhcl9oYXNoX2N0eCgmcy0+cmVhZF9oYXNoKTsKKwlzc2xfY2xlYXJfaGFzaF9jdHgoJnMtPndyaXRlX2hhc2gpOworCisJaWYgKHMtPmNlcnQgIT0gTlVMTCkgc3NsX2NlcnRfZnJlZShzLT5jZXJ0KTsKKwkvKiBGcmVlIHVwIGlmIGFsbG9jYXRlZCAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKHMtPnRsc2V4dF9ob3N0bmFtZSkKKwkJT1BFTlNTTF9mcmVlKHMtPnRsc2V4dF9ob3N0bmFtZSk7CisJaWYgKHMtPmluaXRpYWxfY3R4KSBTU0xfQ1RYX2ZyZWUocy0+aW5pdGlhbF9jdHgpOworI2lmbmRlZiBPUEVOU1NMX05PX0VDCisJaWYgKHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCkgT1BFTlNTTF9mcmVlKHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CisJaWYgKHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCkgT1BFTlNTTF9mcmVlKHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCk7CisjZW5kaWYgLyogT1BFTlNTTF9OT19FQyAqLworCWlmIChzLT50bHNleHRfb3BhcXVlX3ByZl9pbnB1dCkgT1BFTlNTTF9mcmVlKHMtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0KTsKKwlpZiAocy0+dGxzZXh0X29jc3BfZXh0cykKKwkJc2tfWDUwOV9FWFRFTlNJT05fcG9wX2ZyZWUocy0+dGxzZXh0X29jc3BfZXh0cywKKwkJCQkJCVg1MDlfRVhURU5TSU9OX2ZyZWUpOworCWlmIChzLT50bHNleHRfb2NzcF9pZHMpCisJCXNrX09DU1BfUkVTUElEX3BvcF9mcmVlKHMtPnRsc2V4dF9vY3NwX2lkcywgT0NTUF9SRVNQSURfZnJlZSk7CisJaWYgKHMtPnRsc2V4dF9vY3NwX3Jlc3ApCisJCU9QRU5TU0xfZnJlZShzLT50bHNleHRfb2NzcF9yZXNwKTsKKyNlbmRpZgorCisJaWYgKHMtPmNsaWVudF9DQSAhPSBOVUxMKQorCQlza19YNTA5X05BTUVfcG9wX2ZyZWUocy0+Y2xpZW50X0NBLFg1MDlfTkFNRV9mcmVlKTsKKworCWlmIChzLT5tZXRob2QgIT0gTlVMTCkgcy0+bWV0aG9kLT5zc2xfZnJlZShzKTsKKworCWlmIChzLT5jdHgpIFNTTF9DVFhfZnJlZShzLT5jdHgpOworCisjaWZuZGVmCU9QRU5TU0xfTk9fS1JCNQorCWlmIChzLT5rc3NsX2N0eCAhPSBOVUxMKQorCQlrc3NsX2N0eF9mcmVlKHMtPmtzc2xfY3R4KTsKKyNlbmRpZgkvKiBPUEVOU1NMX05PX0tSQjUgKi8KKworCU9QRU5TU0xfZnJlZShzKTsKKwl9CisKK3ZvaWQgU1NMX3NldF9iaW8oU1NMICpzLEJJTyAqcmJpbyxCSU8gKndiaW8pCisJeworCS8qIElmIHRoZSBvdXRwdXQgYnVmZmVyaW5nIEJJTyBpcyBzdGlsbCBpbiBwbGFjZSwgcmVtb3ZlIGl0CisJICovCisJaWYgKHMtPmJiaW8gIT0gTlVMTCkKKwkJeworCQlpZiAocy0+d2JpbyA9PSBzLT5iYmlvKQorCQkJeworCQkJcy0+d2Jpbz1zLT53YmlvLT5uZXh0X2JpbzsKKwkJCXMtPmJiaW8tPm5leHRfYmlvPU5VTEw7CisJCQl9CisJCX0KKwlpZiAoKHMtPnJiaW8gIT0gTlVMTCkgJiYgKHMtPnJiaW8gIT0gcmJpbykpCisJCUJJT19mcmVlX2FsbChzLT5yYmlvKTsKKwlpZiAoKHMtPndiaW8gIT0gTlVMTCkgJiYgKHMtPndiaW8gIT0gd2JpbykgJiYgKHMtPnJiaW8gIT0gcy0+d2JpbykpCisJCUJJT19mcmVlX2FsbChzLT53YmlvKTsKKwlzLT5yYmlvPXJiaW87CisJcy0+d2Jpbz13YmlvOworCX0KKworQklPICpTU0xfZ2V0X3JiaW8oY29uc3QgU1NMICpzKQorCXsgcmV0dXJuKHMtPnJiaW8pOyB9CisKK0JJTyAqU1NMX2dldF93YmlvKGNvbnN0IFNTTCAqcykKKwl7IHJldHVybihzLT53YmlvKTsgfQorCitpbnQgU1NMX2dldF9mZChjb25zdCBTU0wgKnMpCisJeworCXJldHVybihTU0xfZ2V0X3JmZChzKSk7CisJfQorCitpbnQgU1NMX2dldF9yZmQoY29uc3QgU1NMICpzKQorCXsKKwlpbnQgcmV0PSAtMTsKKwlCSU8gKmIsKnI7CisKKwliPVNTTF9nZXRfcmJpbyhzKTsKKwlyPUJJT19maW5kX3R5cGUoYixCSU9fVFlQRV9ERVNDUklQVE9SKTsKKwlpZiAociAhPSBOVUxMKQorCQlCSU9fZ2V0X2ZkKHIsJnJldCk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgU1NMX2dldF93ZmQoY29uc3QgU1NMICpzKQorCXsKKwlpbnQgcmV0PSAtMTsKKwlCSU8gKmIsKnI7CisKKwliPVNTTF9nZXRfd2JpbyhzKTsKKwlyPUJJT19maW5kX3R5cGUoYixCSU9fVFlQRV9ERVNDUklQVE9SKTsKKwlpZiAociAhPSBOVUxMKQorCQlCSU9fZ2V0X2ZkKHIsJnJldCk7CisJcmV0dXJuKHJldCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fU09DSworaW50IFNTTF9zZXRfZmQoU1NMICpzLGludCBmZCkKKwl7CisJaW50IHJldD0wOworCUJJTyAqYmlvPU5VTEw7CisKKwliaW89QklPX25ldyhCSU9fc19zb2NrZXQoKSk7CisKKwlpZiAoYmlvID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9TRVRfRkQsRVJSX1JfQlVGX0xJQik7CisJCWdvdG8gZXJyOworCQl9CisJQklPX3NldF9mZChiaW8sZmQsQklPX05PQ0xPU0UpOworCVNTTF9zZXRfYmlvKHMsYmlvLGJpbyk7CisJcmV0PTE7CitlcnI6CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgU1NMX3NldF93ZmQoU1NMICpzLGludCBmZCkKKwl7CisJaW50IHJldD0wOworCUJJTyAqYmlvPU5VTEw7CisKKwlpZiAoKHMtPnJiaW8gPT0gTlVMTCkgfHwgKEJJT19tZXRob2RfdHlwZShzLT5yYmlvKSAhPSBCSU9fVFlQRV9TT0NLRVQpCisJCXx8ICgoaW50KUJJT19nZXRfZmQocy0+cmJpbyxOVUxMKSAhPSBmZCkpCisJCXsKKwkJYmlvPUJJT19uZXcoQklPX3Nfc29ja2V0KCkpOworCisJCWlmIChiaW8gPT0gTlVMTCkKKwkJCXsgU1NMZXJyKFNTTF9GX1NTTF9TRVRfV0ZELEVSUl9SX0JVRl9MSUIpOyBnb3RvIGVycjsgfQorCQlCSU9fc2V0X2ZkKGJpbyxmZCxCSU9fTk9DTE9TRSk7CisJCVNTTF9zZXRfYmlvKHMsU1NMX2dldF9yYmlvKHMpLGJpbyk7CisJCX0KKwllbHNlCisJCVNTTF9zZXRfYmlvKHMsU1NMX2dldF9yYmlvKHMpLFNTTF9nZXRfcmJpbyhzKSk7CisJcmV0PTE7CitlcnI6CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgU1NMX3NldF9yZmQoU1NMICpzLGludCBmZCkKKwl7CisJaW50IHJldD0wOworCUJJTyAqYmlvPU5VTEw7CisKKwlpZiAoKHMtPndiaW8gPT0gTlVMTCkgfHwgKEJJT19tZXRob2RfdHlwZShzLT53YmlvKSAhPSBCSU9fVFlQRV9TT0NLRVQpCisJCXx8ICgoaW50KUJJT19nZXRfZmQocy0+d2JpbyxOVUxMKSAhPSBmZCkpCisJCXsKKwkJYmlvPUJJT19uZXcoQklPX3Nfc29ja2V0KCkpOworCisJCWlmIChiaW8gPT0gTlVMTCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0xfU0VUX1JGRCxFUlJfUl9CVUZfTElCKTsKKwkJCWdvdG8gZXJyOworCQkJfQorCQlCSU9fc2V0X2ZkKGJpbyxmZCxCSU9fTk9DTE9TRSk7CisJCVNTTF9zZXRfYmlvKHMsYmlvLFNTTF9nZXRfd2JpbyhzKSk7CisJCX0KKwllbHNlCisJCVNTTF9zZXRfYmlvKHMsU1NMX2dldF93YmlvKHMpLFNTTF9nZXRfd2JpbyhzKSk7CisJcmV0PTE7CitlcnI6CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKKworLyogcmV0dXJuIGxlbmd0aCBvZiBsYXRlc3QgRmluaXNoZWQgbWVzc2FnZSB3ZSBzZW50LCBjb3B5IHRvICdidWYnICovCitzaXplX3QgU1NMX2dldF9maW5pc2hlZChjb25zdCBTU0wgKnMsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQorCXsKKwlzaXplX3QgcmV0ID0gMDsKKwkKKwlpZiAocy0+czMgIT0gTlVMTCkKKwkJeworCQlyZXQgPSBzLT5zMy0+dG1wLmZpbmlzaF9tZF9sZW47CisJCWlmIChjb3VudCA+IHJldCkKKwkJCWNvdW50ID0gcmV0OworCQltZW1jcHkoYnVmLCBzLT5zMy0+dG1wLmZpbmlzaF9tZCwgY291bnQpOworCQl9CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIHJldHVybiBsZW5ndGggb2YgbGF0ZXN0IEZpbmlzaGVkIG1lc3NhZ2Ugd2UgZXhwZWN0ZWQsIGNvcHkgdG8gJ2J1ZicgKi8KK3NpemVfdCBTU0xfZ2V0X3BlZXJfZmluaXNoZWQoY29uc3QgU1NMICpzLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKKwl7CisJc2l6ZV90IHJldCA9IDA7CisJCisJaWYgKHMtPnMzICE9IE5VTEwpCisJCXsKKwkJcmV0ID0gcy0+czMtPnRtcC5wZWVyX2ZpbmlzaF9tZF9sZW47CisJCWlmIChjb3VudCA+IHJldCkKKwkJCWNvdW50ID0gcmV0OworCQltZW1jcHkoYnVmLCBzLT5zMy0+dG1wLnBlZXJfZmluaXNoX21kLCBjb3VudCk7CisJCX0KKwlyZXR1cm4gcmV0OworCX0KKworCitpbnQgU1NMX2dldF92ZXJpZnlfbW9kZShjb25zdCBTU0wgKnMpCisJeworCXJldHVybihzLT52ZXJpZnlfbW9kZSk7CisJfQorCitpbnQgU1NMX2dldF92ZXJpZnlfZGVwdGgoY29uc3QgU1NMICpzKQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2RlcHRoKHMtPnBhcmFtKTsKKwl9CisKK2ludCAoKlNTTF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTCAqcykpKGludCxYNTA5X1NUT1JFX0NUWCAqKQorCXsKKwlyZXR1cm4ocy0+dmVyaWZ5X2NhbGxiYWNrKTsKKwl9CisKK2ludCBTU0xfQ1RYX2dldF92ZXJpZnlfbW9kZShjb25zdCBTU0xfQ1RYICpjdHgpCisJeworCXJldHVybihjdHgtPnZlcmlmeV9tb2RlKTsKKwl9CisKK2ludCBTU0xfQ1RYX2dldF92ZXJpZnlfZGVwdGgoY29uc3QgU1NMX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4gWDUwOV9WRVJJRllfUEFSQU1fZ2V0X2RlcHRoKGN0eC0+cGFyYW0pOworCX0KKworaW50ICgqU1NMX0NUWF9nZXRfdmVyaWZ5X2NhbGxiYWNrKGNvbnN0IFNTTF9DVFggKmN0eCkpKGludCxYNTA5X1NUT1JFX0NUWCAqKQorCXsKKwlyZXR1cm4oY3R4LT5kZWZhdWx0X3ZlcmlmeV9jYWxsYmFjayk7CisJfQorCit2b2lkIFNTTF9zZXRfdmVyaWZ5KFNTTCAqcyxpbnQgbW9kZSwKKwkJICAgIGludCAoKmNhbGxiYWNrKShpbnQgb2ssWDUwOV9TVE9SRV9DVFggKmN0eCkpCisJeworCXMtPnZlcmlmeV9tb2RlPW1vZGU7CisJaWYgKGNhbGxiYWNrICE9IE5VTEwpCisJCXMtPnZlcmlmeV9jYWxsYmFjaz1jYWxsYmFjazsKKwl9CisKK3ZvaWQgU1NMX3NldF92ZXJpZnlfZGVwdGgoU1NMICpzLGludCBkZXB0aCkKKwl7CisJWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKHMtPnBhcmFtLCBkZXB0aCk7CisJfQorCit2b2lkIFNTTF9zZXRfcmVhZF9haGVhZChTU0wgKnMsaW50IHllcykKKwl7CisJcy0+cmVhZF9haGVhZD15ZXM7CisJfQorCitpbnQgU1NMX2dldF9yZWFkX2FoZWFkKGNvbnN0IFNTTCAqcykKKwl7CisJcmV0dXJuKHMtPnJlYWRfYWhlYWQpOworCX0KKworaW50IFNTTF9wZW5kaW5nKGNvbnN0IFNTTCAqcykKKwl7CisJLyogU1NMX3BlbmRpbmcgY2Fubm90IHdvcmsgcHJvcGVybHkgaWYgcmVhZC1haGVhZCBpcyBlbmFibGVkCisJICogKFNTTF9bQ1RYX11jdHJsKC4uLiwgU1NMX0NUUkxfU0VUX1JFQURfQUhFQUQsIDEsIE5VTEwpKSwKKwkgKiBhbmQgaXQgaXMgaW1wb3NzaWJsZSB0byBmaXggc2luY2UgU1NMX3BlbmRpbmcgY2Fubm90IHJlcG9ydAorCSAqIGVycm9ycyB0aGF0IG1heSBiZSBvYnNlcnZlZCB3aGlsZSBzY2FubmluZyB0aGUgbmV3IGRhdGEuCisJICogKE5vdGUgdGhhdCBTU0xfcGVuZGluZygpIGlzIG9mdGVuIHVzZWQgYXMgYSBib29sZWFuIHZhbHVlLAorCSAqIHNvIHdlJ2QgYmV0dGVyIG5vdCByZXR1cm4gLTEuKQorCSAqLworCXJldHVybihzLT5tZXRob2QtPnNzbF9wZW5kaW5nKHMpKTsKKwl9CisKK1g1MDkgKlNTTF9nZXRfcGVlcl9jZXJ0aWZpY2F0ZShjb25zdCBTU0wgKnMpCisJeworCVg1MDkgKnI7CisJCisJaWYgKChzID09IE5VTEwpIHx8IChzLT5zZXNzaW9uID09IE5VTEwpKQorCQlyPU5VTEw7CisJZWxzZQorCQlyPXMtPnNlc3Npb24tPnBlZXI7CisKKwlpZiAociA9PSBOVUxMKSByZXR1cm4ocik7CisKKwlDUllQVE9fYWRkKCZyLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfWDUwOSk7CisKKwlyZXR1cm4ocik7CisJfQorCitTVEFDS19PRihYNTA5KSAqU1NMX2dldF9wZWVyX2NlcnRfY2hhaW4oY29uc3QgU1NMICpzKQorCXsKKwlTVEFDS19PRihYNTA5KSAqcjsKKwkKKwlpZiAoKHMgPT0gTlVMTCkgfHwgKHMtPnNlc3Npb24gPT0gTlVMTCkgfHwgKHMtPnNlc3Npb24tPnNlc3NfY2VydCA9PSBOVUxMKSkKKwkJcj1OVUxMOworCWVsc2UKKwkJcj1zLT5zZXNzaW9uLT5zZXNzX2NlcnQtPmNlcnRfY2hhaW47CisKKwkvKiBJZiB3ZSBhcmUgYSBjbGllbnQsIGNlcnRfY2hhaW4gaW5jbHVkZXMgdGhlIHBlZXIncyBvd24KKwkgKiBjZXJ0aWZpY2F0ZTsgaWYgd2UgYXJlIGEgc2VydmVyLCBpdCBkb2VzIG5vdC4gKi8KKwkKKwlyZXR1cm4ocik7CisJfQorCisvKiBOb3cgaW4gdGhlb3J5LCBzaW5jZSB0aGUgY2FsbGluZyBwcm9jZXNzIG93biAndCcgaXQgc2hvdWxkIGJlIHNhZmUgdG8KKyAqIG1vZGlmeS4gIFdlIG5lZWQgdG8gYmUgYWJsZSB0byByZWFkIGYgd2l0aG91dCBiZWluZyBoYXNzbGVkICovCit2b2lkIFNTTF9jb3B5X3Nlc3Npb25faWQoU1NMICp0LGNvbnN0IFNTTCAqZikKKwl7CisJQ0VSVCAqdG1wOworCisJLyogRG8gd2UgbmVlZCB0byB0byBTU0wgbG9ja2luZz8gKi8KKwlTU0xfc2V0X3Nlc3Npb24odCxTU0xfZ2V0X3Nlc3Npb24oZikpOworCisJLyogd2hhdCBpZiB3ZSBhcmUgc2V0dXAgYXMgU1NMdjIgYnV0IHdhbnQgdG8gdGFsayBTU0x2MyBvcgorCSAqIHZpY2UtdmVyc2EgKi8KKwlpZiAodC0+bWV0aG9kICE9IGYtPm1ldGhvZCkKKwkJeworCQl0LT5tZXRob2QtPnNzbF9mcmVlKHQpOwkvKiBjbGVhbnVwIGN1cnJlbnQgKi8KKwkJdC0+bWV0aG9kPWYtPm1ldGhvZDsJLyogY2hhbmdlIG1ldGhvZCAqLworCQl0LT5tZXRob2QtPnNzbF9uZXcodCk7CS8qIHNldHVwIG5ldyAqLworCQl9CisKKwl0bXA9dC0+Y2VydDsKKwlpZiAoZi0+Y2VydCAhPSBOVUxMKQorCQl7CisJCUNSWVBUT19hZGQoJmYtPmNlcnQtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19TU0xfQ0VSVCk7CisJCXQtPmNlcnQ9Zi0+Y2VydDsKKwkJfQorCWVsc2UKKwkJdC0+Y2VydD1OVUxMOworCWlmICh0bXAgIT0gTlVMTCkgc3NsX2NlcnRfZnJlZSh0bXApOworCVNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHQsZi0+c2lkX2N0eCxmLT5zaWRfY3R4X2xlbmd0aCk7CisJfQorCisvKiBGaXggdGhpcyBzbyBpdCBjaGVja3MgYWxsIHRoZSB2YWxpZCBrZXkvY2VydCBvcHRpb25zICovCitpbnQgU1NMX0NUWF9jaGVja19wcml2YXRlX2tleShjb25zdCBTU0xfQ1RYICpjdHgpCisJeworCWlmICgJKGN0eCA9PSBOVUxMKSB8fAorCQkoY3R4LT5jZXJ0ID09IE5VTEwpIHx8CisJCShjdHgtPmNlcnQtPmtleS0+eDUwOSA9PSBOVUxMKSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9DSEVDS19QUklWQVRFX0tFWSxTU0xfUl9OT19DRVJUSUZJQ0FURV9BU1NJR05FRCk7CisJCXJldHVybigwKTsKKwkJfQorCWlmIAkoY3R4LT5jZXJ0LT5rZXktPnByaXZhdGVrZXkgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9DSEVDS19QUklWQVRFX0tFWSxTU0xfUl9OT19QUklWQVRFX0tFWV9BU1NJR05FRCk7CisJCXJldHVybigwKTsKKwkJfQorCXJldHVybihYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KGN0eC0+Y2VydC0+a2V5LT54NTA5LCBjdHgtPmNlcnQtPmtleS0+cHJpdmF0ZWtleSkpOworCX0KKworLyogRml4IHRoaXMgZnVuY3Rpb24gc28gdGhhdCBpdCB0YWtlcyBhbiBvcHRpb25hbCB0eXBlIHBhcmFtZXRlciAqLworaW50IFNTTF9jaGVja19wcml2YXRlX2tleShjb25zdCBTU0wgKnNzbCkKKwl7CisJaWYgKHNzbCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ0hFQ0tfUFJJVkFURV9LRVksRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKHNzbC0+Y2VydCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ0hFQ0tfUFJJVkFURV9LRVksU1NMX1JfTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQpOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChzc2wtPmNlcnQtPmtleS0+eDUwOSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ0hFQ0tfUFJJVkFURV9LRVksU1NMX1JfTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoc3NsLT5jZXJ0LT5rZXktPnByaXZhdGVrZXkgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NIRUNLX1BSSVZBVEVfS0VZLFNTTF9SX05PX1BSSVZBVEVfS0VZX0FTU0lHTkVEKTsKKwkJcmV0dXJuKDApOworCQl9CisJcmV0dXJuKFg1MDlfY2hlY2tfcHJpdmF0ZV9rZXkoc3NsLT5jZXJ0LT5rZXktPng1MDksCisJCXNzbC0+Y2VydC0+a2V5LT5wcml2YXRla2V5KSk7CisJfQorCitpbnQgU1NMX2FjY2VwdChTU0wgKnMpCisJeworCWlmIChzLT5oYW5kc2hha2VfZnVuYyA9PSAwKQorCQkvKiBOb3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQgeWV0ICovCisJCVNTTF9zZXRfYWNjZXB0X3N0YXRlKHMpOworCisJcmV0dXJuKHMtPm1ldGhvZC0+c3NsX2FjY2VwdChzKSk7CisJfQorCitpbnQgU1NMX2Nvbm5lY3QoU1NMICpzKQorCXsKKwlpZiAocy0+aGFuZHNoYWtlX2Z1bmMgPT0gMCkKKwkJLyogTm90IHByb3Blcmx5IGluaXRpYWxpemVkIHlldCAqLworCQlTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUocyk7CisKKwlyZXR1cm4ocy0+bWV0aG9kLT5zc2xfY29ubmVjdChzKSk7CisJfQorCitsb25nIFNTTF9nZXRfZGVmYXVsdF90aW1lb3V0KGNvbnN0IFNTTCAqcykKKwl7CisJcmV0dXJuKHMtPm1ldGhvZC0+Z2V0X3RpbWVvdXQoKSk7CisJfQorCitpbnQgU1NMX3JlYWQoU1NMICpzLHZvaWQgKmJ1ZixpbnQgbnVtKQorCXsKKwlpZiAocy0+aGFuZHNoYWtlX2Z1bmMgPT0gMCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1JFQUQsIFNTTF9SX1VOSU5JVElBTElaRUQpOworCQlyZXR1cm4gLTE7CisJCX0KKworCWlmIChzLT5zaHV0ZG93biAmIFNTTF9SRUNFSVZFRF9TSFVURE9XTikKKwkJeworCQlzLT5yd3N0YXRlPVNTTF9OT1RISU5HOworCQlyZXR1cm4oMCk7CisJCX0KKwlyZXR1cm4ocy0+bWV0aG9kLT5zc2xfcmVhZChzLGJ1ZixudW0pKTsKKwl9CisKK2ludCBTU0xfcGVlayhTU0wgKnMsdm9pZCAqYnVmLGludCBudW0pCisJeworCWlmIChzLT5oYW5kc2hha2VfZnVuYyA9PSAwKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfUEVFSywgU1NMX1JfVU5JTklUSUFMSVpFRCk7CisJCXJldHVybiAtMTsKKwkJfQorCisJaWYgKHMtPnNodXRkb3duICYgU1NMX1JFQ0VJVkVEX1NIVVRET1dOKQorCQl7CisJCXJldHVybigwKTsKKwkJfQorCXJldHVybihzLT5tZXRob2QtPnNzbF9wZWVrKHMsYnVmLG51bSkpOworCX0KKworaW50IFNTTF93cml0ZShTU0wgKnMsY29uc3Qgdm9pZCAqYnVmLGludCBudW0pCisJeworCWlmIChzLT5oYW5kc2hha2VfZnVuYyA9PSAwKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfV1JJVEUsIFNTTF9SX1VOSU5JVElBTElaRUQpOworCQlyZXR1cm4gLTE7CisJCX0KKworCWlmIChzLT5zaHV0ZG93biAmIFNTTF9TRU5UX1NIVVRET1dOKQorCQl7CisJCXMtPnJ3c3RhdGU9U1NMX05PVEhJTkc7CisJCVNTTGVycihTU0xfRl9TU0xfV1JJVEUsU1NMX1JfUFJPVE9DT0xfSVNfU0hVVERPV04pOworCQlyZXR1cm4oLTEpOworCQl9CisJcmV0dXJuKHMtPm1ldGhvZC0+c3NsX3dyaXRlKHMsYnVmLG51bSkpOworCX0KKworaW50IFNTTF9zaHV0ZG93bihTU0wgKnMpCisJeworCS8qIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGJlaGF2ZXMgZGlmZmVyZW50bHkgZnJvbSB3aGF0IG9uZSBtaWdodAorCSAqIGV4cGVjdC4gIFJldHVybiB2YWx1ZXMgYXJlIDAgZm9yIG5vIHN1Y2Nlc3MgKHlldCksCisJICogMSBmb3Igc3VjY2VzczsgYnV0IGNhbGxpbmcgaXQgb25jZSBpcyB1c3VhbGx5IG5vdCBlbm91Z2gsCisJICogZXZlbiBpZiBibG9ja2luZyBJL08gaXMgdXNlZCAoc2VlIHNzbDNfc2h1dGRvd24pLgorCSAqLworCisJaWYgKHMtPmhhbmRzaGFrZV9mdW5jID09IDApCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9TSFVURE9XTiwgU1NMX1JfVU5JTklUSUFMSVpFRCk7CisJCXJldHVybiAtMTsKKwkJfQorCisJaWYgKChzICE9IE5VTEwpICYmICFTU0xfaW5faW5pdChzKSkKKwkJcmV0dXJuKHMtPm1ldGhvZC0+c3NsX3NodXRkb3duKHMpKTsKKwllbHNlCisJCXJldHVybigxKTsKKwl9CisKK2ludCBTU0xfcmVuZWdvdGlhdGUoU1NMICpzKQorCXsKKwlpZiAocy0+bmV3X3Nlc3Npb24gPT0gMCkKKwkJeworCQlzLT5uZXdfc2Vzc2lvbj0xOworCQl9CisJcmV0dXJuKHMtPm1ldGhvZC0+c3NsX3JlbmVnb3RpYXRlKHMpKTsKKwl9CisKK2ludCBTU0xfcmVuZWdvdGlhdGVfcGVuZGluZyhTU0wgKnMpCisJeworCS8qIGJlY29tZXMgdHJ1ZSB3aGVuIG5lZ290aWF0aW9uIGlzIHJlcXVlc3RlZDsKKwkgKiBmYWxzZSBhZ2FpbiBvbmNlIGEgaGFuZHNoYWtlIGhhcyBmaW5pc2hlZCAqLworCXJldHVybiAocy0+bmV3X3Nlc3Npb24gIT0gMCk7CisJfQorCitsb25nIFNTTF9jdHJsKFNTTCAqcyxpbnQgY21kLGxvbmcgbGFyZyx2b2lkICpwYXJnKQorCXsKKwlsb25nIGw7CisKKwlzd2l0Y2ggKGNtZCkKKwkJeworCWNhc2UgU1NMX0NUUkxfR0VUX1JFQURfQUhFQUQ6CisJCXJldHVybihzLT5yZWFkX2FoZWFkKTsKKwljYXNlIFNTTF9DVFJMX1NFVF9SRUFEX0FIRUFEOgorCQlsPXMtPnJlYWRfYWhlYWQ7CisJCXMtPnJlYWRfYWhlYWQ9bGFyZzsKKwkJcmV0dXJuKGwpOworCisJY2FzZSBTU0xfQ1RSTF9TRVRfTVNHX0NBTExCQUNLX0FSRzoKKwkJcy0+bXNnX2NhbGxiYWNrX2FyZyA9IHBhcmc7CisJCXJldHVybiAxOworCisJY2FzZSBTU0xfQ1RSTF9PUFRJT05TOgorCQlyZXR1cm4ocy0+b3B0aW9uc3w9bGFyZyk7CisJY2FzZSBTU0xfQ1RSTF9DTEVBUl9PUFRJT05TOgorCQlyZXR1cm4ocy0+b3B0aW9ucyY9fmxhcmcpOworCWNhc2UgU1NMX0NUUkxfTU9ERToKKwkJcmV0dXJuKHMtPm1vZGV8PWxhcmcpOworCWNhc2UgU1NMX0NUUkxfQ0xFQVJfTU9ERToKKwkJcmV0dXJuKHMtPm1vZGUgJj1+bGFyZyk7CisJY2FzZSBTU0xfQ1RSTF9HRVRfTUFYX0NFUlRfTElTVDoKKwkJcmV0dXJuKHMtPm1heF9jZXJ0X2xpc3QpOworCWNhc2UgU1NMX0NUUkxfU0VUX01BWF9DRVJUX0xJU1Q6CisJCWw9cy0+bWF4X2NlcnRfbGlzdDsKKwkJcy0+bWF4X2NlcnRfbGlzdD1sYXJnOworCQlyZXR1cm4obCk7CisJY2FzZSBTU0xfQ1RSTF9TRVRfTVRVOgorCQlpZiAoU1NMX3ZlcnNpb24ocykgPT0gRFRMUzFfVkVSU0lPTiB8fAorCQkgICAgU1NMX3ZlcnNpb24ocykgPT0gRFRMUzFfQkFEX1ZFUikKKwkJCXsKKwkJCXMtPmQxLT5tdHUgPSBsYXJnOworCQkJcmV0dXJuIGxhcmc7CisJCQl9CisJCXJldHVybiAwOworCWNhc2UgU1NMX0NUUkxfU0VUX01BWF9TRU5EX0ZSQUdNRU5UOgorCQlpZiAobGFyZyA8IDUxMiB8fCBsYXJnID4gU1NMM19SVF9NQVhfUExBSU5fTEVOR1RIKQorCQkJcmV0dXJuIDA7CisJCXMtPm1heF9zZW5kX2ZyYWdtZW50ID0gbGFyZzsKKwkJcmV0dXJuIDE7CisJY2FzZSBTU0xfQ1RSTF9HRVRfUklfU1VQUE9SVDoKKwkJaWYgKHMtPnMzKQorCQkJcmV0dXJuIHMtPnMzLT5zZW5kX2Nvbm5lY3Rpb25fYmluZGluZzsKKwkJZWxzZSByZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4ocy0+bWV0aG9kLT5zc2xfY3RybChzLGNtZCxsYXJnLHBhcmcpKTsKKwkJfQorCX0KKworbG9uZyBTU0xfY2FsbGJhY2tfY3RybChTU0wgKnMsIGludCBjbWQsIHZvaWQgKCpmcCkodm9pZCkpCisJeworCXN3aXRjaChjbWQpCisJCXsKKwljYXNlIFNTTF9DVFJMX1NFVF9NU0dfQ0FMTEJBQ0s6CisJCXMtPm1zZ19jYWxsYmFjayA9ICh2b2lkICgqKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykpKGZwKTsKKwkJcmV0dXJuIDE7CisJCQorCWRlZmF1bHQ6CisJCXJldHVybihzLT5tZXRob2QtPnNzbF9jYWxsYmFja19jdHJsKHMsY21kLGZwKSk7CisJCX0KKwl9CisKK0xIQVNIX09GKFNTTF9TRVNTSU9OKSAqU1NMX0NUWF9zZXNzaW9ucyhTU0xfQ1RYICpjdHgpCisJeworCXJldHVybiBjdHgtPnNlc3Npb25zOworCX0KKworbG9uZyBTU0xfQ1RYX2N0cmwoU1NMX0NUWCAqY3R4LGludCBjbWQsbG9uZyBsYXJnLHZvaWQgKnBhcmcpCisJeworCWxvbmcgbDsKKworCXN3aXRjaCAoY21kKQorCQl7CisJY2FzZSBTU0xfQ1RSTF9HRVRfUkVBRF9BSEVBRDoKKwkJcmV0dXJuKGN0eC0+cmVhZF9haGVhZCk7CisJY2FzZSBTU0xfQ1RSTF9TRVRfUkVBRF9BSEVBRDoKKwkJbD1jdHgtPnJlYWRfYWhlYWQ7CisJCWN0eC0+cmVhZF9haGVhZD1sYXJnOworCQlyZXR1cm4obCk7CisJCQorCWNhc2UgU1NMX0NUUkxfU0VUX01TR19DQUxMQkFDS19BUkc6CisJCWN0eC0+bXNnX2NhbGxiYWNrX2FyZyA9IHBhcmc7CisJCXJldHVybiAxOworCisJY2FzZSBTU0xfQ1RSTF9HRVRfTUFYX0NFUlRfTElTVDoKKwkJcmV0dXJuKGN0eC0+bWF4X2NlcnRfbGlzdCk7CisJY2FzZSBTU0xfQ1RSTF9TRVRfTUFYX0NFUlRfTElTVDoKKwkJbD1jdHgtPm1heF9jZXJ0X2xpc3Q7CisJCWN0eC0+bWF4X2NlcnRfbGlzdD1sYXJnOworCQlyZXR1cm4obCk7CisKKwljYXNlIFNTTF9DVFJMX1NFVF9TRVNTX0NBQ0hFX1NJWkU6CisJCWw9Y3R4LT5zZXNzaW9uX2NhY2hlX3NpemU7CisJCWN0eC0+c2Vzc2lvbl9jYWNoZV9zaXplPWxhcmc7CisJCXJldHVybihsKTsKKwljYXNlIFNTTF9DVFJMX0dFVF9TRVNTX0NBQ0hFX1NJWkU6CisJCXJldHVybihjdHgtPnNlc3Npb25fY2FjaGVfc2l6ZSk7CisJY2FzZSBTU0xfQ1RSTF9TRVRfU0VTU19DQUNIRV9NT0RFOgorCQlsPWN0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlOworCQljdHgtPnNlc3Npb25fY2FjaGVfbW9kZT1sYXJnOworCQlyZXR1cm4obCk7CisJY2FzZSBTU0xfQ1RSTF9HRVRfU0VTU19DQUNIRV9NT0RFOgorCQlyZXR1cm4oY3R4LT5zZXNzaW9uX2NhY2hlX21vZGUpOworCisJY2FzZSBTU0xfQ1RSTF9TRVNTX05VTUJFUjoKKwkJcmV0dXJuKGxoX1NTTF9TRVNTSU9OX251bV9pdGVtcyhjdHgtPnNlc3Npb25zKSk7CisJY2FzZSBTU0xfQ1RSTF9TRVNTX0NPTk5FQ1Q6CisJCXJldHVybihjdHgtPnN0YXRzLnNlc3NfY29ubmVjdCk7CisJY2FzZSBTU0xfQ1RSTF9TRVNTX0NPTk5FQ1RfR09PRDoKKwkJcmV0dXJuKGN0eC0+c3RhdHMuc2Vzc19jb25uZWN0X2dvb2QpOworCWNhc2UgU1NMX0NUUkxfU0VTU19DT05ORUNUX1JFTkVHT1RJQVRFOgorCQlyZXR1cm4oY3R4LT5zdGF0cy5zZXNzX2Nvbm5lY3RfcmVuZWdvdGlhdGUpOworCWNhc2UgU1NMX0NUUkxfU0VTU19BQ0NFUFQ6CisJCXJldHVybihjdHgtPnN0YXRzLnNlc3NfYWNjZXB0KTsKKwljYXNlIFNTTF9DVFJMX1NFU1NfQUNDRVBUX0dPT0Q6CisJCXJldHVybihjdHgtPnN0YXRzLnNlc3NfYWNjZXB0X2dvb2QpOworCWNhc2UgU1NMX0NUUkxfU0VTU19BQ0NFUFRfUkVORUdPVElBVEU6CisJCXJldHVybihjdHgtPnN0YXRzLnNlc3NfYWNjZXB0X3JlbmVnb3RpYXRlKTsKKwljYXNlIFNTTF9DVFJMX1NFU1NfSElUOgorCQlyZXR1cm4oY3R4LT5zdGF0cy5zZXNzX2hpdCk7CisJY2FzZSBTU0xfQ1RSTF9TRVNTX0NCX0hJVDoKKwkJcmV0dXJuKGN0eC0+c3RhdHMuc2Vzc19jYl9oaXQpOworCWNhc2UgU1NMX0NUUkxfU0VTU19NSVNTRVM6CisJCXJldHVybihjdHgtPnN0YXRzLnNlc3NfbWlzcyk7CisJY2FzZSBTU0xfQ1RSTF9TRVNTX1RJTUVPVVRTOgorCQlyZXR1cm4oY3R4LT5zdGF0cy5zZXNzX3RpbWVvdXQpOworCWNhc2UgU1NMX0NUUkxfU0VTU19DQUNIRV9GVUxMOgorCQlyZXR1cm4oY3R4LT5zdGF0cy5zZXNzX2NhY2hlX2Z1bGwpOworCWNhc2UgU1NMX0NUUkxfT1BUSU9OUzoKKwkJcmV0dXJuKGN0eC0+b3B0aW9uc3w9bGFyZyk7CisJY2FzZSBTU0xfQ1RSTF9DTEVBUl9PUFRJT05TOgorCQlyZXR1cm4oY3R4LT5vcHRpb25zJj1+bGFyZyk7CisJY2FzZSBTU0xfQ1RSTF9NT0RFOgorCQlyZXR1cm4oY3R4LT5tb2RlfD1sYXJnKTsKKwljYXNlIFNTTF9DVFJMX0NMRUFSX01PREU6CisJCXJldHVybihjdHgtPm1vZGUmPX5sYXJnKTsKKwljYXNlIFNTTF9DVFJMX1NFVF9NQVhfU0VORF9GUkFHTUVOVDoKKwkJaWYgKGxhcmcgPCA1MTIgfHwgbGFyZyA+IFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSCkKKwkJCXJldHVybiAwOworCQljdHgtPm1heF9zZW5kX2ZyYWdtZW50ID0gbGFyZzsKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuKGN0eC0+bWV0aG9kLT5zc2xfY3R4X2N0cmwoY3R4LGNtZCxsYXJnLHBhcmcpKTsKKwkJfQorCX0KKworbG9uZyBTU0xfQ1RYX2NhbGxiYWNrX2N0cmwoU1NMX0NUWCAqY3R4LCBpbnQgY21kLCB2b2lkICgqZnApKHZvaWQpKQorCXsKKwlzd2l0Y2goY21kKQorCQl7CisJY2FzZSBTU0xfQ1RSTF9TRVRfTVNHX0NBTExCQUNLOgorCQljdHgtPm1zZ19jYWxsYmFjayA9ICh2b2lkICgqKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykpKGZwKTsKKwkJcmV0dXJuIDE7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4oY3R4LT5tZXRob2QtPnNzbF9jdHhfY2FsbGJhY2tfY3RybChjdHgsY21kLGZwKSk7CisJCX0KKwl9CisKK2ludCBzc2xfY2lwaGVyX2lkX2NtcChjb25zdCBTU0xfQ0lQSEVSICphLCBjb25zdCBTU0xfQ0lQSEVSICpiKQorCXsKKwlsb25nIGw7CisKKwlsPWEtPmlkLWItPmlkOworCWlmIChsID09IDBMKQorCQlyZXR1cm4oMCk7CisJZWxzZQorCQlyZXR1cm4oKGwgPiAwKT8xOi0xKTsKKwl9CisKK2ludCBzc2xfY2lwaGVyX3B0cl9pZF9jbXAoY29uc3QgU1NMX0NJUEhFUiAqIGNvbnN0ICphcCwKKwkJCWNvbnN0IFNTTF9DSVBIRVIgKiBjb25zdCAqYnApCisJeworCWxvbmcgbDsKKworCWw9KCphcCktPmlkLSgqYnApLT5pZDsKKwlpZiAobCA9PSAwTCkKKwkJcmV0dXJuKDApOworCWVsc2UKKwkJcmV0dXJuKChsID4gMCk/MTotMSk7CisJfQorCisvKiogcmV0dXJuIGEgU1RBQ0sgb2YgdGhlIGNpcGhlcnMgYXZhaWxhYmxlIGZvciB0aGUgU1NMIGFuZCBpbiBvcmRlciBvZgorICogcHJlZmVyZW5jZSAqLworU1RBQ0tfT0YoU1NMX0NJUEhFUikgKlNTTF9nZXRfY2lwaGVycyhjb25zdCBTU0wgKnMpCisJeworCWlmIChzICE9IE5VTEwpCisJCXsKKwkJaWYgKHMtPmNpcGhlcl9saXN0ICE9IE5VTEwpCisJCQl7CisJCQlyZXR1cm4ocy0+Y2lwaGVyX2xpc3QpOworCQkJfQorCQllbHNlIGlmICgocy0+Y3R4ICE9IE5VTEwpICYmCisJCQkocy0+Y3R4LT5jaXBoZXJfbGlzdCAhPSBOVUxMKSkKKwkJCXsKKwkJCXJldHVybihzLT5jdHgtPmNpcGhlcl9saXN0KTsKKwkJCX0KKwkJfQorCXJldHVybihOVUxMKTsKKwl9CisKKy8qKiByZXR1cm4gYSBTVEFDSyBvZiB0aGUgY2lwaGVycyBhdmFpbGFibGUgZm9yIHRoZSBTU0wgYW5kIGluIG9yZGVyIG9mCisgKiBhbGdvcml0aG0gaWQgKi8KK1NUQUNLX09GKFNTTF9DSVBIRVIpICpzc2xfZ2V0X2NpcGhlcnNfYnlfaWQoU1NMICpzKQorCXsKKwlpZiAocyAhPSBOVUxMKQorCQl7CisJCWlmIChzLT5jaXBoZXJfbGlzdF9ieV9pZCAhPSBOVUxMKQorCQkJeworCQkJcmV0dXJuKHMtPmNpcGhlcl9saXN0X2J5X2lkKTsKKwkJCX0KKwkJZWxzZSBpZiAoKHMtPmN0eCAhPSBOVUxMKSAmJgorCQkJKHMtPmN0eC0+Y2lwaGVyX2xpc3RfYnlfaWQgIT0gTlVMTCkpCisJCQl7CisJCQlyZXR1cm4ocy0+Y3R4LT5jaXBoZXJfbGlzdF9ieV9pZCk7CisJCQl9CisJCX0KKwlyZXR1cm4oTlVMTCk7CisJfQorCisvKiogVGhlIG9sZCBpbnRlcmZhY2UgdG8gZ2V0IHRoZSBzYW1lIHRoaW5nIGFzIFNTTF9nZXRfY2lwaGVycygpICovCitjb25zdCBjaGFyICpTU0xfZ2V0X2NpcGhlcl9saXN0KGNvbnN0IFNTTCAqcyxpbnQgbikKKwl7CisJU1NMX0NJUEhFUiAqYzsKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2s7CisKKwlpZiAocyA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJc2s9U1NMX2dldF9jaXBoZXJzKHMpOworCWlmICgoc2sgPT0gTlVMTCkgfHwgKHNrX1NTTF9DSVBIRVJfbnVtKHNrKSA8PSBuKSkKKwkJcmV0dXJuKE5VTEwpOworCWM9c2tfU1NMX0NJUEhFUl92YWx1ZShzayxuKTsKKwlpZiAoYyA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJcmV0dXJuKGMtPm5hbWUpOworCX0KKworLyoqIHNwZWNpZnkgdGhlIGNpcGhlcnMgdG8gYmUgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBTU0xfQ1RYICovCitpbnQgU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoU1NMX0NUWCAqY3R4LCBjb25zdCBjaGFyICpzdHIpCisJeworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpzazsKKwkKKwlzaz1zc2xfY3JlYXRlX2NpcGhlcl9saXN0KGN0eC0+bWV0aG9kLCZjdHgtPmNpcGhlcl9saXN0LAorCQkmY3R4LT5jaXBoZXJfbGlzdF9ieV9pZCxzdHIpOworCS8qIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QgbWF5IHJldHVybiBhbiBlbXB0eSBzdGFjayBpZiBpdAorCSAqIHdhcyB1bmFibGUgdG8gZmluZCBhIGNpcGhlciBtYXRjaGluZyB0aGUgZ2l2ZW4gcnVsZSBzdHJpbmcKKwkgKiAoZm9yIGV4YW1wbGUgaWYgdGhlIHJ1bGUgc3RyaW5nIHNwZWNpZmllcyBhIGNpcGhlciB3aGljaAorCSAqIGhhcyBiZWVuIGRpc2FibGVkKS4gVGhpcyBpcyBub3QgYW4gZXJyb3IgYXMgZmFyIGFzCisJICogc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCBpcyBjb25jZXJuZWQsIGFuZCBoZW5jZQorCSAqIGN0eC0+Y2lwaGVyX2xpc3QgYW5kIGN0eC0+Y2lwaGVyX2xpc3RfYnlfaWQgaGFzIGJlZW4KKwkgKiB1cGRhdGVkLiAqLworCWlmIChzayA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChza19TU0xfQ0lQSEVSX251bShzaykgPT0gMCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9TRVRfQ0lQSEVSX0xJU1QsIFNTTF9SX05PX0NJUEhFUl9NQVRDSCk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCisvKiogc3BlY2lmeSB0aGUgY2lwaGVycyB0byBiZSB1c2VkIGJ5IHRoZSBTU0wgKi8KK2ludCBTU0xfc2V0X2NpcGhlcl9saXN0KFNTTCAqcyxjb25zdCBjaGFyICpzdHIpCisJeworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpzazsKKwkKKwlzaz1zc2xfY3JlYXRlX2NpcGhlcl9saXN0KHMtPmN0eC0+bWV0aG9kLCZzLT5jaXBoZXJfbGlzdCwKKwkJJnMtPmNpcGhlcl9saXN0X2J5X2lkLHN0cik7CisJLyogc2VlIGNvbW1lbnQgaW4gU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QgKi8KKwlpZiAoc2sgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoc2tfU1NMX0NJUEhFUl9udW0oc2spID09IDApCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9TRVRfQ0lQSEVSX0xJU1QsIFNTTF9SX05PX0NJUEhFUl9NQVRDSCk7CisJCXJldHVybiAwOworCQl9CisJcmV0dXJuIDE7CisJfQorCisvKiogc3BlY2lmeSB0aGUgY2lwaGVycyB0byBiZSB1c2VkIGJ5IHRoZSBTU0wgKi8KK2ludCBTU0xfc2V0X2NpcGhlcl9saXN0cyhTU0wgKnMsU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnNrKQorCXsKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqdG1wX2NpcGhlcl9saXN0OworCisJaWYgKHNrID09IE5VTEwpCisJCXJldHVybiAwOworCisgICAgICAgIC8qIEJhc2VkIG9uIGVuZCBvZiBzc2xfY3JlYXRlX2NpcGhlcl9saXN0ICovCisJdG1wX2NpcGhlcl9saXN0ID0gc2tfU1NMX0NJUEhFUl9kdXAoc2spOworCWlmICh0bXBfY2lwaGVyX2xpc3QgPT0gTlVMTCkKKwkJeworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChzLT5jaXBoZXJfbGlzdCAhPSBOVUxMKQorCQlza19TU0xfQ0lQSEVSX2ZyZWUocy0+Y2lwaGVyX2xpc3QpOworCXMtPmNpcGhlcl9saXN0ID0gc2s7CisJaWYgKHMtPmNpcGhlcl9saXN0X2J5X2lkICE9IE5VTEwpCisJCXNrX1NTTF9DSVBIRVJfZnJlZShzLT5jaXBoZXJfbGlzdF9ieV9pZCk7CisJcy0+Y2lwaGVyX2xpc3RfYnlfaWQgPSB0bXBfY2lwaGVyX2xpc3Q7CisJKHZvaWQpc2tfU1NMX0NJUEhFUl9zZXRfY21wX2Z1bmMocy0+Y2lwaGVyX2xpc3RfYnlfaWQsc3NsX2NpcGhlcl9wdHJfaWRfY21wKTsKKworCXNrX1NTTF9DSVBIRVJfc29ydChzLT5jaXBoZXJfbGlzdF9ieV9pZCk7CisJcmV0dXJuIDE7CisJfQorCisvKiB3b3JrcyB3ZWxsIGZvciBTU0x2Miwgbm90IHNvIGdvb2QgZm9yIFNTTHYzICovCitjaGFyICpTU0xfZ2V0X3NoYXJlZF9jaXBoZXJzKGNvbnN0IFNTTCAqcyxjaGFyICpidWYsaW50IGxlbikKKwl7CisJY2hhciAqcDsKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2s7CisJU1NMX0NJUEhFUiAqYzsKKwlpbnQgaTsKKworCWlmICgocy0+c2Vzc2lvbiA9PSBOVUxMKSB8fCAocy0+c2Vzc2lvbi0+Y2lwaGVycyA9PSBOVUxMKSB8fAorCQkobGVuIDwgMikpCisJCXJldHVybihOVUxMKTsKKworCXA9YnVmOworCXNrPXMtPnNlc3Npb24tPmNpcGhlcnM7CisJZm9yIChpPTA7IGk8c2tfU1NMX0NJUEhFUl9udW0oc2spOyBpKyspCisJCXsKKwkJaW50IG47CisKKwkJYz1za19TU0xfQ0lQSEVSX3ZhbHVlKHNrLGkpOworCQluPXN0cmxlbihjLT5uYW1lKTsKKwkJaWYgKG4rMSA+IGxlbikKKwkJCXsKKwkJCWlmIChwICE9IGJ1ZikKKwkJCQktLXA7CisJCQkqcD0nXDAnOworCQkJcmV0dXJuIGJ1ZjsKKwkJCX0KKwkJc3RyY3B5KHAsYy0+bmFtZSk7CisJCXArPW47CisJCSoocCsrKT0nOic7CisJCWxlbi09bisxOworCQl9CisJcFstMV09J1wwJzsKKwlyZXR1cm4oYnVmKTsKKwl9CisKK2ludCBzc2xfY2lwaGVyX2xpc3RfdG9fYnl0ZXMoU1NMICpzLFNUQUNLX09GKFNTTF9DSVBIRVIpICpzayx1bnNpZ25lZCBjaGFyICpwLAorCQkJICAgICBpbnQgKCpwdXRfY2IpKGNvbnN0IFNTTF9DSVBIRVIgKiwgdW5zaWduZWQgY2hhciAqKSkKKwl7CisJaW50IGksaj0wOworCVNTTF9DSVBIRVIgKmM7CisJdW5zaWduZWQgY2hhciAqcTsKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisJaW50IG5va3JiNSA9ICFrc3NsX3RndF9pc19hdmFpbGFibGUocy0+a3NzbF9jdHgpOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fS1JCNSAqLworCisJaWYgKHNrID09IE5VTEwpIHJldHVybigwKTsKKwlxPXA7CisKKwlmb3IgKGk9MDsgaTxza19TU0xfQ0lQSEVSX251bShzayk7IGkrKykKKwkJeworCQljPXNrX1NTTF9DSVBIRVJfdmFsdWUoc2ssaSk7CisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCQlpZiAoKChjLT5hbGdvcml0aG1fbWtleSAmIFNTTF9rS1JCNSkgfHwgKGMtPmFsZ29yaXRobV9hdXRoICYgU1NMX2FLUkI1KSkgJiYKKwkJICAgIG5va3JiNSkKKwkJICAgIGNvbnRpbnVlOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fS1JCNSAqLworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCQkvKiB3aXRoIFBTSyB0aGVyZSBtdXN0IGJlIGNsaWVudCBjYWxsYmFjayBzZXQgKi8KKwkJaWYgKCgoYy0+YWxnb3JpdGhtX21rZXkgJiBTU0xfa1BTSykgfHwgKGMtPmFsZ29yaXRobV9hdXRoICYgU1NMX2FQU0spKSAmJgorCQkgICAgcy0+cHNrX2NsaWVudF9jYWxsYmFjayA9PSBOVUxMKQorCQkJY29udGludWU7CisjZW5kaWYgLyogT1BFTlNTTF9OT19QU0sgKi8KKwkJaiA9IHB1dF9jYiA/IHB1dF9jYihjLHApIDogc3NsX3B1dF9jaXBoZXJfYnlfY2hhcihzLGMscCk7CisJCXArPWo7CisJCX0KKwkvKiBJZiBwID09IHEsIG5vIGNpcGhlcnMgYW5kIGNhbGxlciBpbmRpY2F0ZXMgYW4gZXJyb3IuIE90aGVyd2lzZQorCSAqIGFkZCBTQ1NWIGlmIG5vdCByZW5lZ290aWF0aW5nLgorCSAqLworCWlmIChwICE9IHEgJiYgIXMtPm5ld19zZXNzaW9uKQorCQl7CisJCXN0YXRpYyBTU0xfQ0lQSEVSIHNjc3YgPQorCQkJeworCQkJMCwgTlVMTCwgU1NMM19DS19TQ1NWLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisJCQl9OworCQlqID0gcHV0X2NiID8gcHV0X2NiKCZzY3N2LHApIDogc3NsX3B1dF9jaXBoZXJfYnlfY2hhcihzLCZzY3N2LHApOworCQlwKz1qOworI2lmZGVmIE9QRU5TU0xfUklfREVCVUcKKwkJZnByaW50ZihzdGRlcnIsICJTQ1NWIHNlbnQgYnkgY2xpZW50XG4iKTsKKyNlbmRpZgorCQl9CisKKwlyZXR1cm4ocC1xKTsKKwl9CisKK1NUQUNLX09GKFNTTF9DSVBIRVIpICpzc2xfYnl0ZXNfdG9fY2lwaGVyX2xpc3QoU1NMICpzLHVuc2lnbmVkIGNoYXIgKnAsaW50IG51bSwKKwkJCQkJICAgICAgIFNUQUNLX09GKFNTTF9DSVBIRVIpICoqc2twKQorCXsKKwljb25zdCBTU0xfQ0lQSEVSICpjOworCVNUQUNLX09GKFNTTF9DSVBIRVIpICpzazsKKwlpbnQgaSxuOworCWlmIChzLT5zMykKKwkJcy0+czMtPnNlbmRfY29ubmVjdGlvbl9iaW5kaW5nID0gMDsKKworCW49c3NsX3B1dF9jaXBoZXJfYnlfY2hhcihzLE5VTEwsTlVMTCk7CisJaWYgKChudW0lbikgIT0gMCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0JZVEVTX1RPX0NJUEhFUl9MSVNULFNTTF9SX0VSUk9SX0lOX1JFQ0VJVkVEX0NJUEhFUl9MSVNUKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJaWYgKChza3AgPT0gTlVMTCkgfHwgKCpza3AgPT0gTlVMTCkpCisJCXNrPXNrX1NTTF9DSVBIRVJfbmV3X251bGwoKTsgLyogY2hhbmdlIHBlcmhhcHMgbGF0ZXIgKi8KKwllbHNlCisJCXsKKwkJc2s9ICpza3A7CisJCXNrX1NTTF9DSVBIRVJfemVybyhzayk7CisJCX0KKworCWZvciAoaT0wOyBpPG51bTsgaSs9bikKKwkJeworCQkvKiBDaGVjayBmb3IgU0NTViAqLworCQlpZiAocy0+czMgJiYgKG4gIT0gMyB8fCAhcFswXSkgJiYKKwkJCShwW24tMl0gPT0gKChTU0wzX0NLX1NDU1YgPj4gOCkgJiAweGZmKSkgJiYKKwkJCShwW24tMV0gPT0gKFNTTDNfQ0tfU0NTViAmIDB4ZmYpKSkKKwkJCXsKKwkJCS8qIFNDU1YgZmF0YWwgaWYgcmVuZWdvdGlhdGluZyAqLworCQkJaWYgKHMtPm5ld19zZXNzaW9uKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMX0JZVEVTX1RPX0NJUEhFUl9MSVNULFNTTF9SX1NDU1ZfUkVDRUlWRURfV0hFTl9SRU5FR09USUFUSU5HKTsKKwkJCQlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX0ZBVEFMLFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRSk7IAorCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCXMtPnMzLT5zZW5kX2Nvbm5lY3Rpb25fYmluZGluZyA9IDE7CisJCQlwICs9IG47CisjaWZkZWYgT1BFTlNTTF9SSV9ERUJVRworCQkJZnByaW50ZihzdGRlcnIsICJTQ1NWIHJlY2VpdmVkIGJ5IHNlcnZlclxuIik7CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCQkJfQorCisJCWM9c3NsX2dldF9jaXBoZXJfYnlfY2hhcihzLHApOworCQlwKz1uOworCQlpZiAoYyAhPSBOVUxMKQorCQkJeworCQkJaWYgKCFza19TU0xfQ0lQSEVSX3B1c2goc2ssYykpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0xfQllURVNfVE9fQ0lQSEVSX0xJU1QsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCisJaWYgKHNrcCAhPSBOVUxMKQorCQkqc2twPXNrOworCXJldHVybihzayk7CitlcnI6CisJaWYgKChza3AgPT0gTlVMTCkgfHwgKCpza3AgPT0gTlVMTCkpCisJCXNrX1NTTF9DSVBIRVJfZnJlZShzayk7CisJcmV0dXJuKE5VTEwpOworCX0KKworCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisvKiogcmV0dXJuIGEgc2VydmVybmFtZSBleHRlbnNpb24gdmFsdWUgaWYgcHJvdmlkZWQgaW4gQ2xpZW50IEhlbGxvLCBvciBOVUxMLgorICogU28gZmFyLCBvbmx5IGhvc3RfbmFtZSB0eXBlcyBhcmUgZGVmaW5lZCAoUkZDIDM1NDYpLgorICovCisKK2NvbnN0IGNoYXIgKlNTTF9nZXRfc2VydmVybmFtZShjb25zdCBTU0wgKnMsIGNvbnN0IGludCB0eXBlKQorCXsKKwlpZiAodHlwZSAhPSBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBzLT5zZXNzaW9uICYmICFzLT50bHNleHRfaG9zdG5hbWUgPworCQlzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgOgorCQlzLT50bHNleHRfaG9zdG5hbWU7CisJfQorCitpbnQgU1NMX2dldF9zZXJ2ZXJuYW1lX3R5cGUoY29uc3QgU1NMICpzKQorCXsKKwlpZiAocy0+c2Vzc2lvbiAmJiAoIXMtPnRsc2V4dF9ob3N0bmFtZSA/IHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSA6IHMtPnRsc2V4dF9ob3N0bmFtZSkpCisJCXJldHVybiBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lOworCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3NsX3Nlc3Npb25faGFzaChjb25zdCBTU0xfU0VTU0lPTiAqYSkKKwl7CisJdW5zaWduZWQgbG9uZyBsOworCisJbD0odW5zaWduZWQgbG9uZykKKwkJKCh1bnNpZ25lZCBpbnQpIGEtPnNlc3Npb25faWRbMF0gICAgICl8CisJCSgodW5zaWduZWQgaW50KSBhLT5zZXNzaW9uX2lkWzFdPDwgOEwpfAorCQkoKHVuc2lnbmVkIGxvbmcpYS0+c2Vzc2lvbl9pZFsyXTw8MTZMKXwKKwkJKCh1bnNpZ25lZCBsb25nKWEtPnNlc3Npb25faWRbM108PDI0TCk7CisJcmV0dXJuKGwpOworCX0KKworLyogTkI6IElmIHRoaXMgZnVuY3Rpb24gKG9yIGluZGVlZCB0aGUgaGFzaCBmdW5jdGlvbiB3aGljaCB1c2VzIGEgc29ydCBvZgorICogY29hcnNlciBmdW5jdGlvbiB0aGFuIHRoaXMgb25lKSBpcyBjaGFuZ2VkLCBlbnN1cmUKKyAqIFNTTF9DVFhfaGFzX21hdGNoaW5nX3Nlc3Npb25faWQoKSBpcyBjaGVja2VkIGFjY29yZGluZ2x5LiBJdCByZWxpZXMgb24gYmVpbmcKKyAqIGFibGUgdG8gY29uc3RydWN0IGFuIFNTTF9TRVNTSU9OIHRoYXQgd2lsbCBjb2xsaWRlIHdpdGggYW55IGV4aXN0aW5nIHNlc3Npb24KKyAqIHdpdGggYSBtYXRjaGluZyBzZXNzaW9uIElELiAqLworc3RhdGljIGludCBzc2xfc2Vzc2lvbl9jbXAoY29uc3QgU1NMX1NFU1NJT04gKmEsY29uc3QgU1NMX1NFU1NJT04gKmIpCisJeworCWlmIChhLT5zc2xfdmVyc2lvbiAhPSBiLT5zc2xfdmVyc2lvbikKKwkJcmV0dXJuKDEpOworCWlmIChhLT5zZXNzaW9uX2lkX2xlbmd0aCAhPSBiLT5zZXNzaW9uX2lkX2xlbmd0aCkKKwkJcmV0dXJuKDEpOworCXJldHVybihtZW1jbXAoYS0+c2Vzc2lvbl9pZCxiLT5zZXNzaW9uX2lkLGEtPnNlc3Npb25faWRfbGVuZ3RoKSk7CisJfQorCisvKiBUaGVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBzaG91bGQgcmVtYWluIHJhdGhlciB0aGFuIHJlZGVjbGFyaW5nCisgKiBTU0xfU0VTU0lPTl9oYXNoIGFuZCBTU0xfU0VTU0lPTl9jbXAgZm9yIHZvaWQqIHR5cGVzIGFuZCBjYXN0aW5nIGVhY2gKKyAqIHZhcmlhYmxlLiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIGZ1bmN0aW9ucyBhcmVuJ3Qgc3RhdGljLCB0aGV5J3JlIGV4cG9zZWQgdmlhCisgKiBzc2wuaC4gKi8KK3N0YXRpYyBJTVBMRU1FTlRfTEhBU0hfSEFTSF9GTihzc2xfc2Vzc2lvbiwgU1NMX1NFU1NJT04pCitzdGF0aWMgSU1QTEVNRU5UX0xIQVNIX0NPTVBfRk4oc3NsX3Nlc3Npb24sIFNTTF9TRVNTSU9OKQorCitTU0xfQ1RYICpTU0xfQ1RYX25ldyhjb25zdCBTU0xfTUVUSE9EICptZXRoKQorCXsKKwlTU0xfQ1RYICpyZXQ9TlVMTDsKKworCWlmIChtZXRoID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfTkVXLFNTTF9SX05VTExfU1NMX01FVEhPRF9QQVNTRUQpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKworCWlmIChTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkgPCAwKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX05FVyxTU0xfUl9YNTA5X1ZFUklGSUNBVElPTl9TRVRVUF9QUk9CTEVNUyk7CisJCWdvdG8gZXJyOworCQl9CisJcmV0PShTU0xfQ1RYICopT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFNTTF9DVFgpKTsKKwlpZiAocmV0ID09IE5VTEwpCisJCWdvdG8gZXJyOworCisJbWVtc2V0KHJldCwwLHNpemVvZihTU0xfQ1RYKSk7CisKKwlyZXQtPm1ldGhvZD1tZXRoOworCisJcmV0LT5jZXJ0X3N0b3JlPU5VTEw7CisJcmV0LT5zZXNzaW9uX2NhY2hlX21vZGU9U1NMX1NFU1NfQ0FDSEVfU0VSVkVSOworCXJldC0+c2Vzc2lvbl9jYWNoZV9zaXplPVNTTF9TRVNTSU9OX0NBQ0hFX01BWF9TSVpFX0RFRkFVTFQ7CisJcmV0LT5zZXNzaW9uX2NhY2hlX2hlYWQ9TlVMTDsKKwlyZXQtPnNlc3Npb25fY2FjaGVfdGFpbD1OVUxMOworCisJLyogV2UgdGFrZSB0aGUgc3lzdGVtIGRlZmF1bHQgKi8KKwlyZXQtPnNlc3Npb25fdGltZW91dD1tZXRoLT5nZXRfdGltZW91dCgpOworCisJcmV0LT5uZXdfc2Vzc2lvbl9jYj0wOworCXJldC0+cmVtb3ZlX3Nlc3Npb25fY2I9MDsKKwlyZXQtPmdldF9zZXNzaW9uX2NiPTA7CisJcmV0LT5nZW5lcmF0ZV9zZXNzaW9uX2lkPTA7CisKKwltZW1zZXQoKGNoYXIgKikmcmV0LT5zdGF0cywwLHNpemVvZihyZXQtPnN0YXRzKSk7CisKKwlyZXQtPnJlZmVyZW5jZXM9MTsKKwlyZXQtPnF1aWV0X3NodXRkb3duPTA7CisKKy8qCXJldC0+Y2lwaGVyPU5VTEw7Ki8KKy8qCXJldC0+czItPmNoYWxsZW5nZT1OVUxMOworCXJldC0+bWFzdGVyX2tleT1OVUxMOworCXJldC0+a2V5X2FyZz1OVUxMOworCXJldC0+czItPmNvbm5faWQ9TlVMTDsgKi8KKworCXJldC0+aW5mb19jYWxsYmFjaz1OVUxMOworCisJcmV0LT5hcHBfdmVyaWZ5X2NhbGxiYWNrPTA7CisJcmV0LT5hcHBfdmVyaWZ5X2FyZz1OVUxMOworCisJcmV0LT5tYXhfY2VydF9saXN0PVNTTF9NQVhfQ0VSVF9MSVNUX0RFRkFVTFQ7CisJcmV0LT5yZWFkX2FoZWFkPTA7CisJcmV0LT5tc2dfY2FsbGJhY2s9MDsKKwlyZXQtPm1zZ19jYWxsYmFja19hcmc9TlVMTDsKKwlyZXQtPnZlcmlmeV9tb2RlPVNTTF9WRVJJRllfTk9ORTsKKyNpZiAwCisJcmV0LT52ZXJpZnlfZGVwdGg9LTE7IC8qIERvbid0IGltcG9zZSBhIGxpbWl0IChidXQgeDUwOV9sdS5jIGRvZXMpICovCisjZW5kaWYKKwlyZXQtPnNpZF9jdHhfbGVuZ3RoPTA7CisJcmV0LT5kZWZhdWx0X3ZlcmlmeV9jYWxsYmFjaz1OVUxMOworCWlmICgocmV0LT5jZXJ0PXNzbF9jZXJ0X25ldygpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCXJldC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2s9MDsKKwlyZXQtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhPU5VTEw7CisJcmV0LT5jbGllbnRfY2VydF9jYj0wOworCXJldC0+YXBwX2dlbl9jb29raWVfY2I9MDsKKwlyZXQtPmFwcF92ZXJpZnlfY29va2llX2NiPTA7CisKKwlyZXQtPnNlc3Npb25zPWxoX1NTTF9TRVNTSU9OX25ldygpOworCWlmIChyZXQtPnNlc3Npb25zID09IE5VTEwpIGdvdG8gZXJyOworCXJldC0+Y2VydF9zdG9yZT1YNTA5X1NUT1JFX25ldygpOworCWlmIChyZXQtPmNlcnRfc3RvcmUgPT0gTlVMTCkgZ290byBlcnI7CisKKwlzc2xfY3JlYXRlX2NpcGhlcl9saXN0KHJldC0+bWV0aG9kLAorCQkmcmV0LT5jaXBoZXJfbGlzdCwmcmV0LT5jaXBoZXJfbGlzdF9ieV9pZCwKKwkJbWV0aC0+dmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04gPyAiU1NMdjIiIDogU1NMX0RFRkFVTFRfQ0lQSEVSX0xJU1QpOworCWlmIChyZXQtPmNpcGhlcl9saXN0ID09IE5VTEwKKwkgICAgfHwgc2tfU1NMX0NJUEhFUl9udW0ocmV0LT5jaXBoZXJfbGlzdCkgPD0gMCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9ORVcsU1NMX1JfTElCUkFSWV9IQVNfTk9fQ0lQSEVSUyk7CisJCWdvdG8gZXJyMjsKKwkJfQorCisJcmV0LT5wYXJhbSA9IFg1MDlfVkVSSUZZX1BBUkFNX25ldygpOworCWlmICghcmV0LT5wYXJhbSkKKwkJZ290byBlcnI7CisKKwlpZiAoKHJldC0+cnNhX21kNT1FVlBfZ2V0X2RpZ2VzdGJ5bmFtZSgic3NsMi1tZDUiKSkgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9ORVcsU1NMX1JfVU5BQkxFX1RPX0xPQURfU1NMMl9NRDVfUk9VVElORVMpOworCQlnb3RvIGVycjI7CisJCX0KKwlpZiAoKHJldC0+bWQ1PUVWUF9nZXRfZGlnZXN0YnluYW1lKCJzc2wzLW1kNSIpKSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX05FVyxTU0xfUl9VTkFCTEVfVE9fTE9BRF9TU0wzX01ENV9ST1VUSU5FUyk7CisJCWdvdG8gZXJyMjsKKwkJfQorCWlmICgocmV0LT5zaGExPUVWUF9nZXRfZGlnZXN0YnluYW1lKCJzc2wzLXNoYTEiKSkgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9ORVcsU1NMX1JfVU5BQkxFX1RPX0xPQURfU1NMM19TSEExX1JPVVRJTkVTKTsKKwkJZ290byBlcnIyOworCQl9CisKKwlpZiAoKHJldC0+Y2xpZW50X0NBPXNrX1g1MDlfTkFNRV9uZXdfbnVsbCgpKSA9PSBOVUxMKQorCQlnb3RvIGVycjsKKworCUNSWVBUT19uZXdfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfU1NMX0NUWCwgcmV0LCAmcmV0LT5leF9kYXRhKTsKKworCXJldC0+ZXh0cmFfY2VydHM9TlVMTDsKKwlyZXQtPmNvbXBfbWV0aG9kcz1TU0xfQ09NUF9nZXRfY29tcHJlc3Npb25fbWV0aG9kcygpOworCisJcmV0LT5tYXhfc2VuZF9mcmFnbWVudCA9IFNTTDNfUlRfTUFYX1BMQUlOX0xFTkdUSDsKKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCXJldC0+dGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2sgPSAwOworCXJldC0+dGxzZXh0X3NlcnZlcm5hbWVfYXJnID0gTlVMTDsKKwkvKiBTZXR1cCBSRkM0NTA3IHRpY2tldCBrZXlzICovCisJaWYgKChSQU5EX3BzZXVkb19ieXRlcyhyZXQtPnRsc2V4dF90aWNrX2tleV9uYW1lLCAxNikgPD0gMCkKKwkJfHwgKFJBTkRfYnl0ZXMocmV0LT50bHNleHRfdGlja19obWFjX2tleSwgMTYpIDw9IDApCisJCXx8IChSQU5EX2J5dGVzKHJldC0+dGxzZXh0X3RpY2tfYWVzX2tleSwgMTYpIDw9IDApKQorCQlyZXQtPm9wdGlvbnMgfD0gU1NMX09QX05PX1RJQ0tFVDsKKworCXJldC0+dGxzZXh0X3N0YXR1c19jYiA9IDA7CisJcmV0LT50bHNleHRfc3RhdHVzX2FyZyA9IE5VTEw7CisKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCXJldC0+cHNrX2lkZW50aXR5X2hpbnQ9TlVMTDsKKwlyZXQtPnBza19jbGllbnRfY2FsbGJhY2s9TlVMTDsKKwlyZXQtPnBza19zZXJ2ZXJfY2FsbGJhY2s9TlVMTDsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0JVRl9GUkVFTElTVFMKKwlyZXQtPmZyZWVsaXN0X21heF9sZW4gPSBTU0xfTUFYX0JVRl9GUkVFTElTVF9MRU5fREVGQVVMVDsKKwlyZXQtPnJidWZfZnJlZWxpc3QgPSBPUEVOU1NMX21hbGxvYyhzaXplb2YoU1NMM19CVUZfRlJFRUxJU1QpKTsKKwlpZiAoIXJldC0+cmJ1Zl9mcmVlbGlzdCkKKwkJZ290byBlcnI7CisJcmV0LT5yYnVmX2ZyZWVsaXN0LT5jaHVua2xlbiA9IDA7CisJcmV0LT5yYnVmX2ZyZWVsaXN0LT5sZW4gPSAwOworCXJldC0+cmJ1Zl9mcmVlbGlzdC0+aGVhZCA9IE5VTEw7CisJcmV0LT53YnVmX2ZyZWVsaXN0ID0gT1BFTlNTTF9tYWxsb2Moc2l6ZW9mKFNTTDNfQlVGX0ZSRUVMSVNUKSk7CisJaWYgKCFyZXQtPndidWZfZnJlZWxpc3QpCisJCXsKKwkJT1BFTlNTTF9mcmVlKHJldC0+cmJ1Zl9mcmVlbGlzdCk7CisJCWdvdG8gZXJyOworCQl9CisJcmV0LT53YnVmX2ZyZWVsaXN0LT5jaHVua2xlbiA9IDA7CisJcmV0LT53YnVmX2ZyZWVsaXN0LT5sZW4gPSAwOworCXJldC0+d2J1Zl9mcmVlbGlzdC0+aGVhZCA9IE5VTEw7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKKwlyZXQtPmNsaWVudF9jZXJ0X2VuZ2luZSA9IE5VTEw7CisjaWZkZWYgT1BFTlNTTF9TU0xfQ0xJRU5UX0VOR0lORV9BVVRPCisjZGVmaW5lIGVuZ19zdHJ4KHgpCSN4CisjZGVmaW5lIGVuZ19zdHIoeCkJZW5nX3N0cngoeCkKKwkvKiBVc2Ugc3BlY2lmaWMgY2xpZW50IGVuZ2luZSBhdXRvbWF0aWNhbGx5Li4uIGlnbm9yZSBlcnJvcnMgKi8KKwl7CisJRU5HSU5FICplbmc7CisJZW5nID0gRU5HSU5FX2J5X2lkKGVuZ19zdHIoT1BFTlNTTF9TU0xfQ0xJRU5UX0VOR0lORV9BVVRPKSk7CisJaWYgKCFlbmcpCisJCXsKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpOworCQllbmcgPSBFTkdJTkVfYnlfaWQoZW5nX3N0cihPUEVOU1NMX1NTTF9DTElFTlRfRU5HSU5FX0FVVE8pKTsKKwkJfQorCWlmICghZW5nIHx8ICFTU0xfQ1RYX3NldF9jbGllbnRfY2VydF9lbmdpbmUocmV0LCBlbmcpKQorCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwl9CisjZW5kaWYKKyNlbmRpZgorCS8qIERlZmF1bHQgaXMgdG8gY29ubmVjdCB0byBub24tUkkgc2VydmVycy4gV2hlbiBSSSBpcyBtb3JlIHdpZGVseQorCSAqIGRlcGxveWVkIG1pZ2h0IGNoYW5nZSB0aGlzLgorCSAqLworCXJldC0+b3B0aW9ucyB8PSBTU0xfT1BfTEVHQUNZX1NFUlZFUl9DT05ORUNUOworCisJcmV0dXJuKHJldCk7CitlcnI6CisJU1NMZXJyKFNTTF9GX1NTTF9DVFhfTkVXLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKK2VycjI6CisJaWYgKHJldCAhPSBOVUxMKSBTU0xfQ1RYX2ZyZWUocmV0KTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCisjaWYgMAorc3RhdGljIHZvaWQgU1NMX0NPTVBfZnJlZShTU0xfQ09NUCAqY29tcCkKKyAgICB7IE9QRU5TU0xfZnJlZShjb21wKTsgfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CVUZfRlJFRUxJU1RTCitzdGF0aWMgdm9pZAorc3NsX2J1Zl9mcmVlbGlzdF9mcmVlKFNTTDNfQlVGX0ZSRUVMSVNUICpsaXN0KQorCXsKKwlTU0wzX0JVRl9GUkVFTElTVF9FTlRSWSAqZW50LCAqbmV4dDsKKwlmb3IgKGVudCA9IGxpc3QtPmhlYWQ7IGVudDsgZW50ID0gbmV4dCkKKwkJeworCQluZXh0ID0gZW50LT5uZXh0OworCQlPUEVOU1NMX2ZyZWUoZW50KTsKKwkJfQorCU9QRU5TU0xfZnJlZShsaXN0KTsKKwl9CisjZW5kaWYKKwordm9pZCBTU0xfQ1RYX2ZyZWUoU1NMX0NUWCAqYSkKKwl7CisJaW50IGk7CisKKwlpZiAoYSA9PSBOVUxMKSByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJmEtPnJlZmVyZW5jZXMsLTEsQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisjaWZkZWYgUkVGX1BSSU5UCisJUkVGX1BSSU5UKCJTU0xfQ1RYIixhKTsKKyNlbmRpZgorCWlmIChpID4gMCkgcmV0dXJuOworI2lmZGVmIFJFRl9DSEVDSworCWlmIChpIDwgMCkKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwiU1NMX0NUWF9mcmVlLCBiYWQgcmVmZXJlbmNlIGNvdW50XG4iKTsKKwkJYWJvcnQoKTsgLyogb2sgKi8KKwkJfQorI2VuZGlmCisKKwlpZiAoYS0+cGFyYW0pCisJCVg1MDlfVkVSSUZZX1BBUkFNX2ZyZWUoYS0+cGFyYW0pOworCisJLyoKKwkgKiBGcmVlIGludGVybmFsIHNlc3Npb24gY2FjaGUuIEhvd2V2ZXI6IHRoZSByZW1vdmVfY2IoKSBtYXkgcmVmZXJlbmNlCisJICogdGhlIGV4X2RhdGEgb2YgU1NMX0NUWCwgdGh1cyB0aGUgZXhfZGF0YSBzdG9yZSBjYW4gb25seSBiZSByZW1vdmVkCisJICogYWZ0ZXIgdGhlIHNlc3Npb25zIHdlcmUgZmx1c2hlZC4KKwkgKiBBcyB0aGUgZXhfZGF0YSBoYW5kbGluZyByb3V0aW5lcyBtaWdodCBhbHNvIHRvdWNoIHRoZSBzZXNzaW9uIGNhY2hlLAorCSAqIHRoZSBtb3N0IHNlY3VyZSBzb2x1dGlvbiBzZWVtcyB0byBiZTogZW1wdHkgKGZsdXNoKSB0aGUgY2FjaGUsIHRoZW4KKwkgKiBmcmVlIGV4X2RhdGEsIHRoZW4gZmluYWxseSBmcmVlIHRoZSBjYWNoZS4KKwkgKiAoU2VlIHRpY2tldCBbb3BlbnNzbC5vcmcgIzIxMl0uKQorCSAqLworCWlmIChhLT5zZXNzaW9ucyAhPSBOVUxMKQorCQlTU0xfQ1RYX2ZsdXNoX3Nlc3Npb25zKGEsMCk7CisKKwlDUllQVE9fZnJlZV9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9TU0xfQ1RYLCBhLCAmYS0+ZXhfZGF0YSk7CisKKwlpZiAoYS0+c2Vzc2lvbnMgIT0gTlVMTCkKKwkJbGhfU1NMX1NFU1NJT05fZnJlZShhLT5zZXNzaW9ucyk7CisKKwlpZiAoYS0+Y2VydF9zdG9yZSAhPSBOVUxMKQorCQlYNTA5X1NUT1JFX2ZyZWUoYS0+Y2VydF9zdG9yZSk7CisJaWYgKGEtPmNpcGhlcl9saXN0ICE9IE5VTEwpCisJCXNrX1NTTF9DSVBIRVJfZnJlZShhLT5jaXBoZXJfbGlzdCk7CisJaWYgKGEtPmNpcGhlcl9saXN0X2J5X2lkICE9IE5VTEwpCisJCXNrX1NTTF9DSVBIRVJfZnJlZShhLT5jaXBoZXJfbGlzdF9ieV9pZCk7CisJaWYgKGEtPmNlcnQgIT0gTlVMTCkKKwkJc3NsX2NlcnRfZnJlZShhLT5jZXJ0KTsKKwlpZiAoYS0+Y2xpZW50X0NBICE9IE5VTEwpCisJCXNrX1g1MDlfTkFNRV9wb3BfZnJlZShhLT5jbGllbnRfQ0EsWDUwOV9OQU1FX2ZyZWUpOworCWlmIChhLT5leHRyYV9jZXJ0cyAhPSBOVUxMKQorCQlza19YNTA5X3BvcF9mcmVlKGEtPmV4dHJhX2NlcnRzLFg1MDlfZnJlZSk7CisjaWYgMCAvKiBUaGlzIHNob3VsZCBuZXZlciBiZSBkb25lLCBzaW5jZSBpdCByZW1vdmVzIGEgZ2xvYmFsIGRhdGFiYXNlICovCisJaWYgKGEtPmNvbXBfbWV0aG9kcyAhPSBOVUxMKQorCQlza19TU0xfQ09NUF9wb3BfZnJlZShhLT5jb21wX21ldGhvZHMsU1NMX0NPTVBfZnJlZSk7CisjZWxzZQorCWEtPmNvbXBfbWV0aG9kcyA9IE5VTEw7CisjZW5kaWYKKworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCWlmIChhLT5wc2tfaWRlbnRpdHlfaGludCkKKwkJT1BFTlNTTF9mcmVlKGEtPnBza19pZGVudGl0eV9oaW50KTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCWlmIChhLT5jbGllbnRfY2VydF9lbmdpbmUpCisJCUVOR0lORV9maW5pc2goYS0+Y2xpZW50X2NlcnRfZW5naW5lKTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQlVGX0ZSRUVMSVNUUworCWlmIChhLT53YnVmX2ZyZWVsaXN0KQorCQlzc2xfYnVmX2ZyZWVsaXN0X2ZyZWUoYS0+d2J1Zl9mcmVlbGlzdCk7CisJaWYgKGEtPnJidWZfZnJlZWxpc3QpCisJCXNzbF9idWZfZnJlZWxpc3RfZnJlZShhLT5yYnVmX2ZyZWVsaXN0KTsKKyNlbmRpZgorCisJT1BFTlNTTF9mcmVlKGEpOworCX0KKwordm9pZCBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYihTU0xfQ1RYICpjdHgsIHBlbV9wYXNzd29yZF9jYiAqY2IpCisJeworCWN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2s9Y2I7CisJfQorCit2b2lkIFNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiX3VzZXJkYXRhKFNTTF9DVFggKmN0eCx2b2lkICp1KQorCXsKKwljdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhPXU7CisJfQorCit2b2lkIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKFNTTF9DVFggKmN0eCwgaW50ICgqY2IpKFg1MDlfU1RPUkVfQ1RYICosdm9pZCAqKSwgdm9pZCAqYXJnKQorCXsKKwljdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2s9Y2I7CisJY3R4LT5hcHBfdmVyaWZ5X2FyZz1hcmc7CisJfQorCit2b2lkIFNTTF9DVFhfc2V0X3ZlcmlmeShTU0xfQ1RYICpjdHgsaW50IG1vZGUsaW50ICgqY2IpKGludCwgWDUwOV9TVE9SRV9DVFggKikpCisJeworCWN0eC0+dmVyaWZ5X21vZGU9bW9kZTsKKwljdHgtPmRlZmF1bHRfdmVyaWZ5X2NhbGxiYWNrPWNiOworCX0KKwordm9pZCBTU0xfQ1RYX3NldF92ZXJpZnlfZGVwdGgoU1NMX0NUWCAqY3R4LGludCBkZXB0aCkKKwl7CisJWDUwOV9WRVJJRllfUEFSQU1fc2V0X2RlcHRoKGN0eC0+cGFyYW0sIGRlcHRoKTsKKwl9CisKK3ZvaWQgc3NsX3NldF9jZXJ0X21hc2tzKENFUlQgKmMsIGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikKKwl7CisJQ0VSVF9QS0VZICpjcGs7CisJaW50IHJzYV9lbmMscnNhX3RtcCxyc2Ffc2lnbixkaF90bXAsZGhfcnNhLGRoX2RzYSxkc2Ffc2lnbjsKKwlpbnQgcnNhX2VuY19leHBvcnQsZGhfcnNhX2V4cG9ydCxkaF9kc2FfZXhwb3J0OworCWludCByc2FfdG1wX2V4cG9ydCxkaF90bXBfZXhwb3J0LGtsOworCXVuc2lnbmVkIGxvbmcgbWFza19rLG1hc2tfYSxlbWFza19rLGVtYXNrX2E7CisJaW50IGhhdmVfZWNjX2NlcnQsIGVjZGhfb2ssIGVjZHNhX29rLCBlY2NfcGtleV9zaXplOworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlpbnQgaGF2ZV9lY2RoX3RtcDsKKyNlbmRpZgorCVg1MDkgKnggPSBOVUxMOworCUVWUF9QS0VZICplY2NfcGtleSA9IE5VTEw7CisJaW50IHNpZ25hdHVyZV9uaWQgPSAwOworCisJaWYgKGMgPT0gTlVMTCkgcmV0dXJuOworCisJa2w9U1NMX0NfRVhQT1JUX1BLRVlMRU5HVEgoY2lwaGVyKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCXJzYV90bXA9KGMtPnJzYV90bXAgIT0gTlVMTCB8fCBjLT5yc2FfdG1wX2NiICE9IE5VTEwpOworCXJzYV90bXBfZXhwb3J0PShjLT5yc2FfdG1wX2NiICE9IE5VTEwgfHwKKwkJKHJzYV90bXAgJiYgUlNBX3NpemUoYy0+cnNhX3RtcCkqOCA8PSBrbCkpOworI2Vsc2UKKwlyc2FfdG1wPXJzYV90bXBfZXhwb3J0PTA7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorCWRoX3RtcD0oYy0+ZGhfdG1wICE9IE5VTEwgfHwgYy0+ZGhfdG1wX2NiICE9IE5VTEwpOworCWRoX3RtcF9leHBvcnQ9KGMtPmRoX3RtcF9jYiAhPSBOVUxMIHx8CisJCShkaF90bXAgJiYgREhfc2l6ZShjLT5kaF90bXApKjggPD0ga2wpKTsKKyNlbHNlCisJZGhfdG1wPWRoX3RtcF9leHBvcnQ9MDsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWhhdmVfZWNkaF90bXA9KGMtPmVjZGhfdG1wICE9IE5VTEwgfHwgYy0+ZWNkaF90bXBfY2IgIT0gTlVMTCk7CisjZW5kaWYKKwljcGs9ICYoYy0+cGtleXNbU1NMX1BLRVlfUlNBX0VOQ10pOworCXJzYV9lbmM9IChjcGstPng1MDkgIT0gTlVMTCAmJiBjcGstPnByaXZhdGVrZXkgIT0gTlVMTCk7CisJcnNhX2VuY19leHBvcnQ9KHJzYV9lbmMgJiYgRVZQX1BLRVlfc2l6ZShjcGstPnByaXZhdGVrZXkpKjggPD0ga2wpOworCWNwaz0gJihjLT5wa2V5c1tTU0xfUEtFWV9SU0FfU0lHTl0pOworCXJzYV9zaWduPShjcGstPng1MDkgIT0gTlVMTCAmJiBjcGstPnByaXZhdGVrZXkgIT0gTlVMTCk7CisJY3BrPSAmKGMtPnBrZXlzW1NTTF9QS0VZX0RTQV9TSUdOXSk7CisJZHNhX3NpZ249KGNway0+eDUwOSAhPSBOVUxMICYmIGNway0+cHJpdmF0ZWtleSAhPSBOVUxMKTsKKwljcGs9ICYoYy0+cGtleXNbU1NMX1BLRVlfREhfUlNBXSk7CisJZGhfcnNhPSAgKGNway0+eDUwOSAhPSBOVUxMICYmIGNway0+cHJpdmF0ZWtleSAhPSBOVUxMKTsKKwlkaF9yc2FfZXhwb3J0PShkaF9yc2EgJiYgRVZQX1BLRVlfc2l6ZShjcGstPnByaXZhdGVrZXkpKjggPD0ga2wpOworCWNwaz0gJihjLT5wa2V5c1tTU0xfUEtFWV9ESF9EU0FdKTsKKy8qIEZJWCBUSElTIEVBWSBFQVkgRUFZICovCisJZGhfZHNhPSAgKGNway0+eDUwOSAhPSBOVUxMICYmIGNway0+cHJpdmF0ZWtleSAhPSBOVUxMKTsKKwlkaF9kc2FfZXhwb3J0PShkaF9kc2EgJiYgRVZQX1BLRVlfc2l6ZShjcGstPnByaXZhdGVrZXkpKjggPD0ga2wpOworCWNwaz0gJihjLT5wa2V5c1tTU0xfUEtFWV9FQ0NdKTsKKwloYXZlX2VjY19jZXJ0PSAoY3BrLT54NTA5ICE9IE5VTEwgJiYgY3BrLT5wcml2YXRla2V5ICE9IE5VTEwpOworCW1hc2tfaz0wOworCW1hc2tfYT0wOworCWVtYXNrX2s9MDsKKwllbWFza19hPTA7CisKKwkKKworI2lmZGVmIENJUEhFUl9ERUJVRworCXByaW50ZigicnQ9JWQgcnRlPSVkIGRodD0lZCBlY2RodD0lZCByZT0lZCByZWU9JWQgcnM9JWQgZHM9JWQgZGhyPSVkIGRoZD0lZFxuIiwKKwkgICAgICAgIHJzYV90bXAscnNhX3RtcF9leHBvcnQsZGhfdG1wLGhhdmVfZWNkaF90bXAsCisJCXJzYV9lbmMscnNhX2VuY19leHBvcnQscnNhX3NpZ24sZHNhX3NpZ24sZGhfcnNhLGRoX2RzYSk7CisjZW5kaWYKKwkKKwljcGsgPSAmKGMtPnBrZXlzW1NTTF9QS0VZX0dPU1QwMV0pOworCWlmIChjcGstPng1MDkgIT0gTlVMTCAmJiBjcGstPnByaXZhdGVrZXkgIT1OVUxMKSB7CisJCW1hc2tfayB8PSBTU0xfa0dPU1Q7CisJCW1hc2tfYSB8PSBTU0xfYUdPU1QwMTsKKwl9CisJY3BrID0gJihjLT5wa2V5c1tTU0xfUEtFWV9HT1NUOTRdKTsKKwlpZiAoY3BrLT54NTA5ICE9IE5VTEwgJiYgY3BrLT5wcml2YXRla2V5ICE9TlVMTCkgeworCQltYXNrX2sgfD0gU1NMX2tHT1NUOworCQltYXNrX2EgfD0gU1NMX2FHT1NUOTQ7CisJfQorCisJaWYgKHJzYV9lbmMgfHwgKHJzYV90bXAgJiYgcnNhX3NpZ24pKQorCQltYXNrX2t8PVNTTF9rUlNBOworCWlmIChyc2FfZW5jX2V4cG9ydCB8fCAocnNhX3RtcF9leHBvcnQgJiYgKHJzYV9zaWduIHx8IHJzYV9lbmMpKSkKKwkJZW1hc2tfa3w9U1NMX2tSU0E7CisKKyNpZiAwCisJLyogVGhlIG1hdGNoIG5lZWRzIHRvIGJlIGJvdGgga0VESCBhbmQgYVJTQSBvciBhRFNBLCBzbyBkb24ndCB3b3JyeSAqLworCWlmICgJKGRoX3RtcCB8fCBkaF9yc2EgfHwgZGhfZHNhKSAmJgorCQkocnNhX2VuYyB8fCByc2Ffc2lnbiB8fCBkc2Ffc2lnbikpCisJCW1hc2tfa3w9U1NMX2tFREg7CisJaWYgKChkaF90bXBfZXhwb3J0IHx8IGRoX3JzYV9leHBvcnQgfHwgZGhfZHNhX2V4cG9ydCkgJiYKKwkJKHJzYV9lbmMgfHwgcnNhX3NpZ24gfHwgZHNhX3NpZ24pKQorCQllbWFza19rfD1TU0xfa0VESDsKKyNlbmRpZgorCisJaWYgKGRoX3RtcF9leHBvcnQpCisJCWVtYXNrX2t8PVNTTF9rRURIOworCisJaWYgKGRoX3RtcCkKKwkJbWFza19rfD1TU0xfa0VESDsKKworCWlmIChkaF9yc2EpIG1hc2tfa3w9U1NMX2tESHI7CisJaWYgKGRoX3JzYV9leHBvcnQpIGVtYXNrX2t8PVNTTF9rREhyOworCisJaWYgKGRoX2RzYSkgbWFza19rfD1TU0xfa0RIZDsKKwlpZiAoZGhfZHNhX2V4cG9ydCkgZW1hc2tfa3w9U1NMX2tESGQ7CisKKwlpZiAocnNhX2VuYyB8fCByc2Ffc2lnbikKKwkJeworCQltYXNrX2F8PVNTTF9hUlNBOworCQllbWFza19hfD1TU0xfYVJTQTsKKwkJfQorCisJaWYgKGRzYV9zaWduKQorCQl7CisJCW1hc2tfYXw9U1NMX2FEU1M7CisJCWVtYXNrX2F8PVNTTF9hRFNTOworCQl9CisKKwltYXNrX2F8PVNTTF9hTlVMTDsKKwllbWFza19hfD1TU0xfYU5VTEw7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19LUkI1CisJbWFza19rfD1TU0xfa0tSQjU7CisJbWFza19hfD1TU0xfYUtSQjU7CisJZW1hc2tfa3w9U1NMX2tLUkI1OworCWVtYXNrX2F8PVNTTF9hS1JCNTsKKyNlbmRpZgorCisJLyogQW4gRUNDIGNlcnRpZmljYXRlIG1heSBiZSB1c2FibGUgZm9yIEVDREggYW5kL29yCisJICogRUNEU0EgY2lwaGVyIHN1aXRlcyBkZXBlbmRpbmcgb24gdGhlIGtleSB1c2FnZSBleHRlbnNpb24uCisJICovCisJaWYgKGhhdmVfZWNjX2NlcnQpCisJCXsKKwkJLyogVGhpcyBjYWxsIHBvcHVsYXRlcyBleHRlbnNpb24gZmxhZ3MgKGV4X2ZsYWdzKSAqLworCQl4ID0gKGMtPnBrZXlzW1NTTF9QS0VZX0VDQ10pLng1MDk7CisJCVg1MDlfY2hlY2tfcHVycG9zZSh4LCAtMSwgMCk7CisJCWVjZGhfb2sgPSAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfS1VTQUdFKSA/CisJCSAgICAoeC0+ZXhfa3VzYWdlICYgWDUwOXYzX0tVX0tFWV9BR1JFRU1FTlQpIDogMTsKKwkJZWNkc2Ffb2sgPSAoeC0+ZXhfZmxhZ3MgJiBFWEZMQUdfS1VTQUdFKSA/CisJCSAgICAoeC0+ZXhfa3VzYWdlICYgWDUwOXYzX0tVX0RJR0lUQUxfU0lHTkFUVVJFKSA6IDE7CisJCWVjY19wa2V5ID0gWDUwOV9nZXRfcHVia2V5KHgpOworCQllY2NfcGtleV9zaXplID0gKGVjY19wa2V5ICE9IE5VTEwpID8KKwkJICAgIEVWUF9QS0VZX2JpdHMoZWNjX3BrZXkpIDogMDsKKwkJRVZQX1BLRVlfZnJlZShlY2NfcGtleSk7CisJCWlmICgoeC0+c2lnX2FsZykgJiYgKHgtPnNpZ19hbGctPmFsZ29yaXRobSkpCisJCQlzaWduYXR1cmVfbmlkID0gT0JKX29iajJuaWQoeC0+c2lnX2FsZy0+YWxnb3JpdGhtKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJCWlmIChlY2RoX29rKQorCQkJeworCQkJY29uc3QgY2hhciAqc2lnID0gT0JKX25pZDJsbihzaWduYXR1cmVfbmlkKTsKKwkJCWlmIChzaWcgPT0gTlVMTCkKKwkJCQl7CisJCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQkJc2lnID0gInVua25vd24iOworCQkJCX0KKwkJCQkKKwkJCWlmIChzdHJzdHIoc2lnLCAiV2l0aFJTQSIpKQorCQkJCXsKKwkJCQltYXNrX2t8PVNTTF9rRUNESHI7CisJCQkJbWFza19hfD1TU0xfYUVDREg7CisJCQkJaWYgKGVjY19wa2V5X3NpemUgPD0gMTYzKQorCQkJCQl7CisJCQkJCWVtYXNrX2t8PVNTTF9rRUNESHI7CisJCQkJCWVtYXNrX2F8PVNTTF9hRUNESDsKKwkJCQkJfQorCQkJCX0KKworCQkJaWYgKHNpZ25hdHVyZV9uaWQgPT0gTklEX2VjZHNhX3dpdGhfU0hBMSkKKwkJCQl7CisJCQkJbWFza19rfD1TU0xfa0VDREhlOworCQkJCW1hc2tfYXw9U1NMX2FFQ0RIOworCQkJCWlmIChlY2NfcGtleV9zaXplIDw9IDE2MykKKwkJCQkJeworCQkJCQllbWFza19rfD1TU0xfa0VDREhlOworCQkJCQllbWFza19hfD1TU0xfYUVDREg7CisJCQkJCX0KKwkJCQl9CisJCQl9CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RTQQorCQlpZiAoZWNkc2Ffb2spCisJCQl7CisJCQltYXNrX2F8PVNTTF9hRUNEU0E7CisJCQllbWFza19hfD1TU0xfYUVDRFNBOworCQkJfQorI2VuZGlmCisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlpZiAoaGF2ZV9lY2RoX3RtcCkKKwkJeworCQltYXNrX2t8PVNTTF9rRUVDREg7CisJCWVtYXNrX2t8PVNTTF9rRUVDREg7CisJCX0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisJbWFza19rIHw9IFNTTF9rUFNLOworCW1hc2tfYSB8PSBTU0xfYVBTSzsKKwllbWFza19rIHw9IFNTTF9rUFNLOworCWVtYXNrX2EgfD0gU1NMX2FQU0s7CisjZW5kaWYKKworCWMtPm1hc2tfaz1tYXNrX2s7CisJYy0+bWFza19hPW1hc2tfYTsKKwljLT5leHBvcnRfbWFza19rPWVtYXNrX2s7CisJYy0+ZXhwb3J0X21hc2tfYT1lbWFza19hOworCWMtPnZhbGlkPTE7CisJfQorCisvKiBUaGlzIGhhbmR5IG1hY3JvIGJvcnJvd2VkIGZyb20gY3J5cHRvL3g1MDl2My92M19wdXJwLmMgKi8KKyNkZWZpbmUga3VfcmVqZWN0KHgsIHVzYWdlKSBcCisJKCgoeCktPmV4X2ZsYWdzICYgRVhGTEFHX0tVU0FHRSkgJiYgISgoeCktPmV4X2t1c2FnZSAmICh1c2FnZSkpKQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKworaW50IHNzbF9jaGVja19zcnZyX2VjY19jZXJ0X2FuZF9hbGcoWDUwOSAqeCwgY29uc3QgU1NMX0NJUEhFUiAqY3MpCisJeworCXVuc2lnbmVkIGxvbmcgYWxnX2ssIGFsZ19hOworCUVWUF9QS0VZICpwa2V5ID0gTlVMTDsKKwlpbnQga2V5c2l6ZSA9IDA7CisJaW50IHNpZ25hdHVyZV9uaWQgPSAwOworCisJYWxnX2sgPSBjcy0+YWxnb3JpdGhtX21rZXk7CisJYWxnX2EgPSBjcy0+YWxnb3JpdGhtX2F1dGg7CisKKwlpZiAoU1NMX0NfSVNfRVhQT1JUKGNzKSkKKwkJeworCQkvKiBFQ0RIIGtleSBsZW5ndGggaW4gZXhwb3J0IGNpcGhlcnMgbXVzdCBiZSA8PSAxNjMgYml0cyAqLworCQlwa2V5ID0gWDUwOV9nZXRfcHVia2V5KHgpOworCQlpZiAocGtleSA9PSBOVUxMKSByZXR1cm4gMDsKKwkJa2V5c2l6ZSA9IEVWUF9QS0VZX2JpdHMocGtleSk7CisJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCWlmIChrZXlzaXplID4gMTYzKSByZXR1cm4gMDsKKwkJfQorCisJLyogVGhpcyBjYWxsIHBvcHVsYXRlcyB0aGUgZXhfZmxhZ3MgZmllbGQgY29ycmVjdGx5ICovCisJWDUwOV9jaGVja19wdXJwb3NlKHgsIC0xLCAwKTsKKwlpZiAoKHgtPnNpZ19hbGcpICYmICh4LT5zaWdfYWxnLT5hbGdvcml0aG0pKQorCQlzaWduYXR1cmVfbmlkID0gT0JKX29iajJuaWQoeC0+c2lnX2FsZy0+YWxnb3JpdGhtKTsKKwlpZiAoYWxnX2sgJiBTU0xfa0VDREhlIHx8IGFsZ19rICYgU1NMX2tFQ0RIcikKKwkJeworCQkvKiBrZXkgdXNhZ2UsIGlmIHByZXNlbnQsIG11c3QgYWxsb3cga2V5IGFncmVlbWVudCAqLworCQlpZiAoa3VfcmVqZWN0KHgsIFg1MDl2M19LVV9LRVlfQUdSRUVNRU5UKSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0xfQ0hFQ0tfU1JWUl9FQ0NfQ0VSVF9BTkRfQUxHLCBTU0xfUl9FQ0NfQ0VSVF9OT1RfRk9SX0tFWV9BR1JFRU1FTlQpOworCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmIChhbGdfayAmIFNTTF9rRUNESGUpCisJCQl7CisJCQkvKiBzaWduYXR1cmUgYWxnIG11c3QgYmUgRUNEU0EgKi8KKwkJCWlmIChzaWduYXR1cmVfbmlkICE9IE5JRF9lY2RzYV93aXRoX1NIQTEpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0xfQ0hFQ0tfU1JWUl9FQ0NfQ0VSVF9BTkRfQUxHLCBTU0xfUl9FQ0NfQ0VSVF9TSE9VTERfSEFWRV9TSEExX1NJR05BVFVSRSk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQlpZiAoYWxnX2sgJiBTU0xfa0VDREhyKQorCQkJeworCQkJLyogc2lnbmF0dXJlIGFsZyBtdXN0IGJlIFJTQSAqLworCisJCQljb25zdCBjaGFyICpzaWcgPSBPQkpfbmlkMmxuKHNpZ25hdHVyZV9uaWQpOworCQkJaWYgKHNpZyA9PSBOVUxMKQorCQkJCXsKKwkJCQlFUlJfY2xlYXJfZXJyb3IoKTsKKwkJCQlzaWcgPSAidW5rbm93biI7CisJCQkJfQorCQkJaWYgKHN0cnN0cihzaWcsICJXaXRoUlNBIikgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTF9DSEVDS19TUlZSX0VDQ19DRVJUX0FORF9BTEcsIFNTTF9SX0VDQ19DRVJUX1NIT1VMRF9IQVZFX1JTQV9TSUdOQVRVUkUpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCWlmIChhbGdfYSAmIFNTTF9hRUNEU0EpCisJCXsKKwkJLyoga2V5IHVzYWdlLCBpZiBwcmVzZW50LCBtdXN0IGFsbG93IHNpZ25pbmcgKi8KKwkJaWYgKGt1X3JlamVjdCh4LCBYNTA5djNfS1VfRElHSVRBTF9TSUdOQVRVUkUpKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTF9DSEVDS19TUlZSX0VDQ19DRVJUX0FORF9BTEcsIFNTTF9SX0VDQ19DRVJUX05PVF9GT1JfU0lHTklORyk7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJcmV0dXJuIDE7ICAvKiBhbGwgY2hlY2tzIGFyZSBvayAqLworCX0KKworI2VuZGlmCisKKy8qIFRISVMgTkVFRFMgQ0xFQU5JTkcgVVAgKi8KK1g1MDkgKnNzbF9nZXRfc2VydmVyX3NlbmRfY2VydChTU0wgKnMpCisJeworCXVuc2lnbmVkIGxvbmcgYWxnX2ssYWxnX2EsbWFza19rLG1hc2tfYTsKKwlDRVJUICpjOworCWludCBpLGlzX2V4cG9ydDsKKworCWM9cy0+Y2VydDsKKwlzc2xfc2V0X2NlcnRfbWFza3MoYywgcy0+czMtPnRtcC5uZXdfY2lwaGVyKTsKKwlpc19leHBvcnQ9U1NMX0NfSVNfRVhQT1JUKHMtPnMzLT50bXAubmV3X2NpcGhlcik7CisJaWYgKGlzX2V4cG9ydCkKKwkJeworCQltYXNrX2sgPSBjLT5leHBvcnRfbWFza19rOworCQltYXNrX2EgPSBjLT5leHBvcnRfbWFza19hOworCQl9CisJZWxzZQorCQl7CisJCW1hc2tfayA9IGMtPm1hc2tfazsKKwkJbWFza19hID0gYy0+bWFza19hOworCQl9CisJCisJYWxnX2sgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OworCWFsZ19hID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aDsKKworCWlmIChhbGdfayAmIChTU0xfa0VDREhyfFNTTF9rRUNESGUpKQorCQl7CisJCS8qIHdlIGRvbid0IG5lZWQgdG8gbG9vayBhdCBTU0xfa0VFQ0RICisJCSAqIHNpbmNlIG5vIGNlcnRpZmljYXRlIGlzIG5lZWRlZCBmb3IKKwkJICogYW5vbiBFQ0RIIGFuZCBmb3IgYXV0aGVudGljYXRlZAorCQkgKiBFRUNESCwgdGhlIGNoZWNrIGZvciB0aGUgYXV0aAorCQkgKiBhbGdvcml0aG0gd2lsbCBzZXQgaSBjb3JyZWN0bHkKKwkJICogTk9URTogRm9yIEVDREgtUlNBLCB3ZSBuZWVkIGFuIEVDQworCQkgKiBub3QgYW4gUlNBIGNlcnQgYnV0IGZvciBFRUNESC1SU0EKKwkJICogd2UgbmVlZCBhbiBSU0EgY2VydC4gUGxhY2luZyB0aGUKKwkJICogY2hlY2tzIGZvciBTU0xfa0VDREggYmVmb3JlIFJTQQorCQkgKiBjaGVja3MgZW5zdXJlcyB0aGUgY29ycmVjdCBjZXJ0IGlzIGNob3Nlbi4KKwkJICovCisJCWk9U1NMX1BLRVlfRUNDOworCQl9CisJZWxzZSBpZiAoYWxnX2EgJiBTU0xfYUVDRFNBKQorCQl7CisJCWk9U1NMX1BLRVlfRUNDOworCQl9CisJZWxzZSBpZiAoYWxnX2sgJiBTU0xfa0RIcikKKwkJaT1TU0xfUEtFWV9ESF9SU0E7CisJZWxzZSBpZiAoYWxnX2sgJiBTU0xfa0RIZCkKKwkJaT1TU0xfUEtFWV9ESF9EU0E7CisJZWxzZSBpZiAoYWxnX2EgJiBTU0xfYURTUykKKwkJaT1TU0xfUEtFWV9EU0FfU0lHTjsKKwllbHNlIGlmIChhbGdfYSAmIFNTTF9hUlNBKQorCQl7CisJCWlmIChjLT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS54NTA5ID09IE5VTEwpCisJCQlpPVNTTF9QS0VZX1JTQV9TSUdOOworCQllbHNlCisJCQlpPVNTTF9QS0VZX1JTQV9FTkM7CisJCX0KKwllbHNlIGlmIChhbGdfYSAmIFNTTF9hS1JCNSkKKwkJeworCQkvKiBWUlMgc29tZXRoaW5nIGVsc2UgaGVyZT8gKi8KKwkJcmV0dXJuKE5VTEwpOworCQl9CisJZWxzZSBpZiAoYWxnX2EgJiBTU0xfYUdPU1Q5NCkgCisJCWk9U1NMX1BLRVlfR09TVDk0OworCWVsc2UgaWYgKGFsZ19hICYgU1NMX2FHT1NUMDEpCisJCWk9U1NMX1BLRVlfR09TVDAxOworCWVsc2UgLyogaWYgKGFsZ19hICYgU1NMX2FOVUxMKSAqLworCQl7CisJCVNTTGVycihTU0xfRl9TU0xfR0VUX1NFUlZFUl9TRU5EX0NFUlQsRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQlyZXR1cm4oTlVMTCk7CisJCX0KKwlpZiAoYy0+cGtleXNbaV0ueDUwOSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisKKwlyZXR1cm4oYy0+cGtleXNbaV0ueDUwOSk7CisJfQorCitFVlBfUEtFWSAqc3NsX2dldF9zaWduX3BrZXkoU1NMICpzLGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcikKKwl7CisJdW5zaWduZWQgbG9uZyBhbGdfYTsKKwlDRVJUICpjOworCisJYWxnX2EgPSBjaXBoZXItPmFsZ29yaXRobV9hdXRoOworCWM9cy0+Y2VydDsKKworCWlmICgoYWxnX2EgJiBTU0xfYURTUykgJiYKKwkJKGMtPnBrZXlzW1NTTF9QS0VZX0RTQV9TSUdOXS5wcml2YXRla2V5ICE9IE5VTEwpKQorCQlyZXR1cm4oYy0+cGtleXNbU1NMX1BLRVlfRFNBX1NJR05dLnByaXZhdGVrZXkpOworCWVsc2UgaWYgKGFsZ19hICYgU1NMX2FSU0EpCisJCXsKKwkJaWYgKGMtPnBrZXlzW1NTTF9QS0VZX1JTQV9TSUdOXS5wcml2YXRla2V5ICE9IE5VTEwpCisJCQlyZXR1cm4oYy0+cGtleXNbU1NMX1BLRVlfUlNBX1NJR05dLnByaXZhdGVrZXkpOworCQllbHNlIGlmIChjLT5wa2V5c1tTU0xfUEtFWV9SU0FfRU5DXS5wcml2YXRla2V5ICE9IE5VTEwpCisJCQlyZXR1cm4oYy0+cGtleXNbU1NMX1BLRVlfUlNBX0VOQ10ucHJpdmF0ZWtleSk7CisJCWVsc2UKKwkJCXJldHVybihOVUxMKTsKKwkJfQorCWVsc2UgaWYgKChhbGdfYSAmIFNTTF9hRUNEU0EpICYmCisJICAgICAgICAgKGMtPnBrZXlzW1NTTF9QS0VZX0VDQ10ucHJpdmF0ZWtleSAhPSBOVUxMKSkKKwkJcmV0dXJuKGMtPnBrZXlzW1NTTF9QS0VZX0VDQ10ucHJpdmF0ZWtleSk7CisJZWxzZSAvKiBpZiAoYWxnX2EgJiBTU0xfYU5VTEwpICovCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9HRVRfU0lHTl9QS0VZLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJcmV0dXJuKE5VTEwpOworCQl9CisJfQorCit2b2lkIHNzbF91cGRhdGVfY2FjaGUoU1NMICpzLGludCBtb2RlKQorCXsKKwlpbnQgaTsKKworCS8qIElmIHRoZSBzZXNzaW9uX2lkX2xlbmd0aCBpcyAwLCB3ZSBhcmUgbm90IHN1cHBvc2VkIHRvIGNhY2hlIGl0LAorCSAqIGFuZCBpdCB3b3VsZCBiZSByYXRoZXIgaGFyZCB0byBkbyBhbnl3YXkgOi0pICovCisJaWYgKHMtPnNlc3Npb24tPnNlc3Npb25faWRfbGVuZ3RoID09IDApIHJldHVybjsKKworCWk9cy0+c2Vzc2lvbl9jdHgtPnNlc3Npb25fY2FjaGVfbW9kZTsKKwlpZiAoKGkgJiBtb2RlKSAmJiAoIXMtPmhpdCkKKwkJJiYgKChpICYgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUpCisJCSAgICB8fCBTU0xfQ1RYX2FkZF9zZXNzaW9uKHMtPnNlc3Npb25fY3R4LHMtPnNlc3Npb24pKQorCQkmJiAocy0+c2Vzc2lvbl9jdHgtPm5ld19zZXNzaW9uX2NiICE9IE5VTEwpKQorCQl7CisJCUNSWVBUT19hZGQoJnMtPnNlc3Npb24tPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19TU0xfU0VTU0lPTik7CisJCWlmICghcy0+c2Vzc2lvbl9jdHgtPm5ld19zZXNzaW9uX2NiKHMscy0+c2Vzc2lvbikpCisJCQlTU0xfU0VTU0lPTl9mcmVlKHMtPnNlc3Npb24pOworCQl9CisKKwkvKiBhdXRvIGZsdXNoIGV2ZXJ5IDI1NSBjb25uZWN0aW9ucyAqLworCWlmICgoIShpICYgU1NMX1NFU1NfQ0FDSEVfTk9fQVVUT19DTEVBUikpICYmCisJCSgoaSAmIG1vZGUpID09IG1vZGUpKQorCQl7CisJCWlmICggICgoKG1vZGUgJiBTU0xfU0VTU19DQUNIRV9DTElFTlQpCisJCQk/cy0+c2Vzc2lvbl9jdHgtPnN0YXRzLnNlc3NfY29ubmVjdF9nb29kCisJCQk6cy0+c2Vzc2lvbl9jdHgtPnN0YXRzLnNlc3NfYWNjZXB0X2dvb2QpICYgMHhmZikgPT0gMHhmZikKKwkJCXsKKwkJCVNTTF9DVFhfZmx1c2hfc2Vzc2lvbnMocy0+c2Vzc2lvbl9jdHgsKHVuc2lnbmVkIGxvbmcpdGltZShOVUxMKSk7CisJCQl9CisJCX0KKwl9CisKK2NvbnN0IFNTTF9NRVRIT0QgKlNTTF9nZXRfc3NsX21ldGhvZChTU0wgKnMpCisJeworCXJldHVybihzLT5tZXRob2QpOworCX0KKworaW50IFNTTF9zZXRfc3NsX21ldGhvZChTU0wgKnMsIGNvbnN0IFNTTF9NRVRIT0QgKm1ldGgpCisJeworCWludCBjb25uPSAtMTsKKwlpbnQgcmV0PTE7CisKKwlpZiAocy0+bWV0aG9kICE9IG1ldGgpCisJCXsKKwkJaWYgKHMtPmhhbmRzaGFrZV9mdW5jICE9IE5VTEwpCisJCQljb25uPShzLT5oYW5kc2hha2VfZnVuYyA9PSBzLT5tZXRob2QtPnNzbF9jb25uZWN0KTsKKworCQlpZiAocy0+bWV0aG9kLT52ZXJzaW9uID09IG1ldGgtPnZlcnNpb24pCisJCQlzLT5tZXRob2Q9bWV0aDsKKwkJZWxzZQorCQkJeworCQkJcy0+bWV0aG9kLT5zc2xfZnJlZShzKTsKKwkJCXMtPm1ldGhvZD1tZXRoOworCQkJcmV0PXMtPm1ldGhvZC0+c3NsX25ldyhzKTsKKwkJCX0KKworCQlpZiAoY29ubiA9PSAxKQorCQkJcy0+aGFuZHNoYWtlX2Z1bmM9bWV0aC0+c3NsX2Nvbm5lY3Q7CisJCWVsc2UgaWYgKGNvbm4gPT0gMCkKKwkJCXMtPmhhbmRzaGFrZV9mdW5jPW1ldGgtPnNzbF9hY2NlcHQ7CisJCX0KKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBTU0xfZ2V0X2Vycm9yKGNvbnN0IFNTTCAqcyxpbnQgaSkKKwl7CisJaW50IHJlYXNvbjsKKwl1bnNpZ25lZCBsb25nIGw7CisJQklPICpiaW87CisKKwlpZiAoaSA+IDApIHJldHVybihTU0xfRVJST1JfTk9ORSk7CisKKwkvKiBNYWtlIHRoaW5ncyByZXR1cm4gU1NMX0VSUk9SX1NZU0NBTEwgd2hlbiBkb2luZyBTU0xfZG9faGFuZHNoYWtlCisJICogZXRjLCB3aGVyZSB3ZSBkbyBlbmNvZGUgdGhlIGVycm9yICovCisJaWYgKChsPUVSUl9wZWVrX2Vycm9yKCkpICE9IDApCisJCXsKKwkJaWYgKEVSUl9HRVRfTElCKGwpID09IEVSUl9MSUJfU1lTKQorCQkJcmV0dXJuKFNTTF9FUlJPUl9TWVNDQUxMKTsKKwkJZWxzZQorCQkJcmV0dXJuKFNTTF9FUlJPUl9TU0wpOworCQl9CisKKwlpZiAoKGkgPCAwKSAmJiBTU0xfd2FudF9yZWFkKHMpKQorCQl7CisJCWJpbz1TU0xfZ2V0X3JiaW8ocyk7CisJCWlmIChCSU9fc2hvdWxkX3JlYWQoYmlvKSkKKwkJCXJldHVybihTU0xfRVJST1JfV0FOVF9SRUFEKTsKKwkJZWxzZSBpZiAoQklPX3Nob3VsZF93cml0ZShiaW8pKQorCQkJLyogVGhpcyBvbmUgZG9lc24ndCBtYWtlIHRvbyBtdWNoIHNlbnNlIC4uLiBXZSBuZXZlciB0cnkKKwkJCSAqIHRvIHdyaXRlIHRvIHRoZSByYmlvLCBhbmQgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB3aGVyZQorCQkJICogcmJpbyBhbmQgd2JpbyBhcmUgc2VwYXJhdGUgY291bGRuJ3QgZXZlbiBrbm93IHdoYXQgaXQKKwkJCSAqIHNob3VsZCB3YWl0IGZvci4KKwkJCSAqIEhvd2V2ZXIgaWYgd2UgZXZlciBzZXQgcy0+cndzdGF0ZSBpbmNvcnJlY3RseQorCQkJICogKHNvIHRoYXQgd2UgaGF2ZSBTU0xfd2FudF9yZWFkKHMpIGluc3RlYWQgb2YKKwkJCSAqIFNTTF93YW50X3dyaXRlKHMpKSBhbmQgcmJpbyBhbmQgd2JpbyAqYXJlKiB0aGUgc2FtZSwKKwkJCSAqIHRoaXMgdGVzdCB3b3JrcyBhcm91bmQgdGhhdCBidWc7IHNvIGl0IG1pZ2h0IGJlIHNhZmVyCisJCQkgKiB0byBrZWVwIGl0LiAqLworCQkJcmV0dXJuKFNTTF9FUlJPUl9XQU5UX1dSSVRFKTsKKwkJZWxzZSBpZiAoQklPX3Nob3VsZF9pb19zcGVjaWFsKGJpbykpCisJCQl7CisJCQlyZWFzb249QklPX2dldF9yZXRyeV9yZWFzb24oYmlvKTsKKwkJCWlmIChyZWFzb24gPT0gQklPX1JSX0NPTk5FQ1QpCisJCQkJcmV0dXJuKFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QpOworCQkJZWxzZSBpZiAocmVhc29uID09IEJJT19SUl9BQ0NFUFQpCisJCQkJcmV0dXJuKFNTTF9FUlJPUl9XQU5UX0FDQ0VQVCk7CisJCQllbHNlCisJCQkJcmV0dXJuKFNTTF9FUlJPUl9TWVNDQUxMKTsgLyogdW5rbm93biAqLworCQkJfQorCQl9CisKKwlpZiAoKGkgPCAwKSAmJiBTU0xfd2FudF93cml0ZShzKSkKKwkJeworCQliaW89U1NMX2dldF93YmlvKHMpOworCQlpZiAoQklPX3Nob3VsZF93cml0ZShiaW8pKQorCQkJcmV0dXJuKFNTTF9FUlJPUl9XQU5UX1dSSVRFKTsKKwkJZWxzZSBpZiAoQklPX3Nob3VsZF9yZWFkKGJpbykpCisJCQkvKiBTZWUgYWJvdmUgKFNTTF93YW50X3JlYWQocykgd2l0aCBCSU9fc2hvdWxkX3dyaXRlKGJpbykpICovCisJCQlyZXR1cm4oU1NMX0VSUk9SX1dBTlRfUkVBRCk7CisJCWVsc2UgaWYgKEJJT19zaG91bGRfaW9fc3BlY2lhbChiaW8pKQorCQkJeworCQkJcmVhc29uPUJJT19nZXRfcmV0cnlfcmVhc29uKGJpbyk7CisJCQlpZiAocmVhc29uID09IEJJT19SUl9DT05ORUNUKQorCQkJCXJldHVybihTU0xfRVJST1JfV0FOVF9DT05ORUNUKTsKKwkJCWVsc2UgaWYgKHJlYXNvbiA9PSBCSU9fUlJfQUNDRVBUKQorCQkJCXJldHVybihTU0xfRVJST1JfV0FOVF9BQ0NFUFQpOworCQkJZWxzZQorCQkJCXJldHVybihTU0xfRVJST1JfU1lTQ0FMTCk7CisJCQl9CisJCX0KKwlpZiAoKGkgPCAwKSAmJiBTU0xfd2FudF94NTA5X2xvb2t1cChzKSkKKwkJeworCQlyZXR1cm4oU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVApOworCQl9CisKKwlpZiAoaSA9PSAwKQorCQl7CisJCWlmIChzLT52ZXJzaW9uID09IFNTTDJfVkVSU0lPTikKKwkJCXsKKwkJCS8qIGFzc3VtZSBpdCBpcyB0aGUgc29ja2V0IGJlaW5nIGNsb3NlZCAqLworCQkJcmV0dXJuKFNTTF9FUlJPUl9aRVJPX1JFVFVSTik7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmICgocy0+c2h1dGRvd24gJiBTU0xfUkVDRUlWRURfU0hVVERPV04pICYmCisJCQkJKHMtPnMzLT53YXJuX2FsZXJ0ID09IFNTTF9BRF9DTE9TRV9OT1RJRlkpKQorCQkJCXJldHVybihTU0xfRVJST1JfWkVST19SRVRVUk4pOworCQkJfQorCQl9CisJcmV0dXJuKFNTTF9FUlJPUl9TWVNDQUxMKTsKKwl9CisKK2ludCBTU0xfZG9faGFuZHNoYWtlKFNTTCAqcykKKwl7CisJaW50IHJldD0xOworCisJaWYgKHMtPmhhbmRzaGFrZV9mdW5jID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9ET19IQU5EU0hBS0UsU1NMX1JfQ09OTkVDVElPTl9UWVBFX05PVF9TRVQpOworCQlyZXR1cm4oLTEpOworCQl9CisKKwlzLT5tZXRob2QtPnNzbF9yZW5lZ290aWF0ZV9jaGVjayhzKTsKKworCWlmIChTU0xfaW5faW5pdChzKSB8fCBTU0xfaW5fYmVmb3JlKHMpKQorCQl7CisJCXJldD1zLT5oYW5kc2hha2VfZnVuYyhzKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworLyogRm9yIHRoZSBuZXh0IDIgZnVuY3Rpb25zLCBTU0xfY2xlYXIoKSBzZXRzIHNodXRkb3duIGFuZCBzbworICogb25lIG9mIHRoZXNlIGNhbGxzIHdpbGwgcmVzZXQgaXQgKi8KK3ZvaWQgU1NMX3NldF9hY2NlcHRfc3RhdGUoU1NMICpzKQorCXsKKwlzLT5zZXJ2ZXI9MTsKKwlzLT5zaHV0ZG93bj0wOworCXMtPnN0YXRlPVNTTF9TVF9BQ0NFUFR8U1NMX1NUX0JFRk9SRTsKKwlzLT5oYW5kc2hha2VfZnVuYz1zLT5tZXRob2QtPnNzbF9hY2NlcHQ7CisJLyogY2xlYXIgdGhlIGN1cnJlbnQgY2lwaGVyICovCisJc3NsX2NsZWFyX2NpcGhlcl9jdHgocyk7CisJc3NsX2NsZWFyX2hhc2hfY3R4KCZzLT5yZWFkX2hhc2gpOworCXNzbF9jbGVhcl9oYXNoX2N0eCgmcy0+d3JpdGVfaGFzaCk7CisJfQorCit2b2lkIFNTTF9zZXRfY29ubmVjdF9zdGF0ZShTU0wgKnMpCisJeworCXMtPnNlcnZlcj0wOworCXMtPnNodXRkb3duPTA7CisJcy0+c3RhdGU9U1NMX1NUX0NPTk5FQ1R8U1NMX1NUX0JFRk9SRTsKKwlzLT5oYW5kc2hha2VfZnVuYz1zLT5tZXRob2QtPnNzbF9jb25uZWN0OworCS8qIGNsZWFyIHRoZSBjdXJyZW50IGNpcGhlciAqLworCXNzbF9jbGVhcl9jaXBoZXJfY3R4KHMpOworCXNzbF9jbGVhcl9oYXNoX2N0eCgmcy0+cmVhZF9oYXNoKTsKKwlzc2xfY2xlYXJfaGFzaF9jdHgoJnMtPndyaXRlX2hhc2gpOworCX0KKworaW50IHNzbF91bmRlZmluZWRfZnVuY3Rpb24oU1NMICpzKQorCXsKKwlTU0xlcnIoU1NMX0ZfU1NMX1VOREVGSU5FRF9GVU5DVElPTixFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCXJldHVybigwKTsKKwl9CisKK2ludCBzc2xfdW5kZWZpbmVkX3ZvaWRfZnVuY3Rpb24odm9pZCkKKwl7CisJU1NMZXJyKFNTTF9GX1NTTF9VTkRFRklORURfVk9JRF9GVU5DVElPTixFUlJfUl9TSE9VTERfTk9UX0hBVkVfQkVFTl9DQUxMRUQpOworCXJldHVybigwKTsKKwl9CisKK2ludCBzc2xfdW5kZWZpbmVkX2NvbnN0X2Z1bmN0aW9uKGNvbnN0IFNTTCAqcykKKwl7CisJU1NMZXJyKFNTTF9GX1NTTF9VTkRFRklORURfQ09OU1RfRlVOQ1RJT04sRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwlyZXR1cm4oMCk7CisJfQorCitTU0xfTUVUSE9EICpzc2xfYmFkX21ldGhvZChpbnQgdmVyKQorCXsKKwlTU0xlcnIoU1NMX0ZfU1NMX0JBRF9NRVRIT0QsRVJSX1JfU0hPVUxEX05PVF9IQVZFX0JFRU5fQ0FMTEVEKTsKKwlyZXR1cm4oTlVMTCk7CisJfQorCitjb25zdCBjaGFyICpTU0xfZ2V0X3ZlcnNpb24oY29uc3QgU1NMICpzKQorCXsKKwlpZiAocy0+dmVyc2lvbiA9PSBUTFMxX1ZFUlNJT04pCisJCXJldHVybigiVExTdjEiKTsKKwllbHNlIGlmIChzLT52ZXJzaW9uID09IFNTTDNfVkVSU0lPTikKKwkJcmV0dXJuKCJTU0x2MyIpOworCWVsc2UgaWYgKHMtPnZlcnNpb24gPT0gU1NMMl9WRVJTSU9OKQorCQlyZXR1cm4oIlNTTHYyIik7CisJZWxzZQorCQlyZXR1cm4oInVua25vd24iKTsKKwl9CisKK1NTTCAqU1NMX2R1cChTU0wgKnMpCisJeworCVNUQUNLX09GKFg1MDlfTkFNRSkgKnNrOworCVg1MDlfTkFNRSAqeG47CisJU1NMICpyZXQ7CisJaW50IGk7CisJCisJaWYgKChyZXQ9U1NMX25ldyhTU0xfZ2V0X1NTTF9DVFgocykpKSA9PSBOVUxMKQorCSAgICByZXR1cm4oTlVMTCk7CisKKwlyZXQtPnZlcnNpb24gPSBzLT52ZXJzaW9uOworCXJldC0+dHlwZSA9IHMtPnR5cGU7CisJcmV0LT5tZXRob2QgPSBzLT5tZXRob2Q7CisKKwlpZiAocy0+c2Vzc2lvbiAhPSBOVUxMKQorCQl7CisJCS8qIFRoaXMgY29waWVzIHNlc3Npb24taWQsIFNTTF9NRVRIT0QsIHNpZF9jdHgsIGFuZCAnY2VydCcgKi8KKwkJU1NMX2NvcHlfc2Vzc2lvbl9pZChyZXQscyk7CisJCX0KKwllbHNlCisJCXsKKwkJLyogTm8gc2Vzc2lvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZCB5ZXQsIHNvIHdlIGhhdmUgdG8gZXhwZWN0CisJCSAqIHRoYXQgcy0+Y2VydCBvciByZXQtPmNlcnQgd2lsbCBiZSBjaGFuZ2VkIGxhdGVyIC0tCisJCSAqIHRoZXkgc2hvdWxkIG5vdCBib3RoIHBvaW50IHRvIHRoZSBzYW1lIG9iamVjdCwKKwkJICogYW5kIHRodXMgd2UgY2FuJ3QgdXNlIFNTTF9jb3B5X3Nlc3Npb25faWQuICovCisKKwkJcmV0LT5tZXRob2QtPnNzbF9mcmVlKHJldCk7CisJCXJldC0+bWV0aG9kID0gcy0+bWV0aG9kOworCQlyZXQtPm1ldGhvZC0+c3NsX25ldyhyZXQpOworCisJCWlmIChzLT5jZXJ0ICE9IE5VTEwpCisJCQl7CisJCQlpZiAocmV0LT5jZXJ0ICE9IE5VTEwpCisJCQkJeworCQkJCXNzbF9jZXJ0X2ZyZWUocmV0LT5jZXJ0KTsKKwkJCQl9CisJCQlyZXQtPmNlcnQgPSBzc2xfY2VydF9kdXAocy0+Y2VydCk7CisJCQlpZiAocmV0LT5jZXJ0ID09IE5VTEwpCisJCQkJZ290byBlcnI7CisJCQl9CisJCQkJCisJCVNTTF9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0KHJldCwKKwkJCXMtPnNpZF9jdHgsIHMtPnNpZF9jdHhfbGVuZ3RoKTsKKwkJfQorCisJcmV0LT5vcHRpb25zPXMtPm9wdGlvbnM7CisJcmV0LT5tb2RlPXMtPm1vZGU7CisJU1NMX3NldF9tYXhfY2VydF9saXN0KHJldCxTU0xfZ2V0X21heF9jZXJ0X2xpc3QocykpOworCVNTTF9zZXRfcmVhZF9haGVhZChyZXQsU1NMX2dldF9yZWFkX2FoZWFkKHMpKTsKKwlyZXQtPm1zZ19jYWxsYmFjayA9IHMtPm1zZ19jYWxsYmFjazsKKwlyZXQtPm1zZ19jYWxsYmFja19hcmcgPSBzLT5tc2dfY2FsbGJhY2tfYXJnOworCVNTTF9zZXRfdmVyaWZ5KHJldCxTU0xfZ2V0X3ZlcmlmeV9tb2RlKHMpLAorCQlTU0xfZ2V0X3ZlcmlmeV9jYWxsYmFjayhzKSk7CisJU1NMX3NldF92ZXJpZnlfZGVwdGgocmV0LFNTTF9nZXRfdmVyaWZ5X2RlcHRoKHMpKTsKKwlyZXQtPmdlbmVyYXRlX3Nlc3Npb25faWQgPSBzLT5nZW5lcmF0ZV9zZXNzaW9uX2lkOworCisJU1NMX3NldF9pbmZvX2NhbGxiYWNrKHJldCxTU0xfZ2V0X2luZm9fY2FsbGJhY2socykpOworCQorCXJldC0+ZGVidWc9cy0+ZGVidWc7CisKKwkvKiBjb3B5IGFwcCBkYXRhLCBhIGxpdHRsZSBkYW5nZXJvdXMgcGVyaGFwcyAqLworCWlmICghQ1JZUFRPX2R1cF9leF9kYXRhKENSWVBUT19FWF9JTkRFWF9TU0wsICZyZXQtPmV4X2RhdGEsICZzLT5leF9kYXRhKSkKKwkJZ290byBlcnI7CisKKwkvKiBzZXR1cCByYmlvLCBhbmQgd2JpbyAqLworCWlmIChzLT5yYmlvICE9IE5VTEwpCisJCXsKKwkJaWYgKCFCSU9fZHVwX3N0YXRlKHMtPnJiaW8sKGNoYXIgKikmcmV0LT5yYmlvKSkKKwkJCWdvdG8gZXJyOworCQl9CisJaWYgKHMtPndiaW8gIT0gTlVMTCkKKwkJeworCQlpZiAocy0+d2JpbyAhPSBzLT5yYmlvKQorCQkJeworCQkJaWYgKCFCSU9fZHVwX3N0YXRlKHMtPndiaW8sKGNoYXIgKikmcmV0LT53YmlvKSkKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJZWxzZQorCQkJcmV0LT53YmlvPXJldC0+cmJpbzsKKwkJfQorCXJldC0+cndzdGF0ZSA9IHMtPnJ3c3RhdGU7CisJcmV0LT5pbl9oYW5kc2hha2UgPSBzLT5pbl9oYW5kc2hha2U7CisJcmV0LT5oYW5kc2hha2VfZnVuYyA9IHMtPmhhbmRzaGFrZV9mdW5jOworCXJldC0+c2VydmVyID0gcy0+c2VydmVyOworCXJldC0+bmV3X3Nlc3Npb24gPSBzLT5uZXdfc2Vzc2lvbjsKKwlyZXQtPnF1aWV0X3NodXRkb3duID0gcy0+cXVpZXRfc2h1dGRvd247CisJcmV0LT5zaHV0ZG93bj1zLT5zaHV0ZG93bjsKKwlyZXQtPnN0YXRlPXMtPnN0YXRlOyAvKiBTU0xfZHVwIGRvZXMgbm90IHJlYWxseSB3b3JrIGF0IGFueSBzdGF0ZSwgdGhvdWdoICovCisJcmV0LT5yc3RhdGU9cy0+cnN0YXRlOworCXJldC0+aW5pdF9udW0gPSAwOyAvKiB3b3VsZCBoYXZlIHRvIGNvcHkgcmV0LT5pbml0X2J1ZiwgcmV0LT5pbml0X21zZywgcmV0LT5pbml0X251bSwgcmV0LT5pbml0X29mZiAqLworCXJldC0+aGl0PXMtPmhpdDsKKworCVg1MDlfVkVSSUZZX1BBUkFNX2luaGVyaXQocmV0LT5wYXJhbSwgcy0+cGFyYW0pOworCisJLyogZHVwIHRoZSBjaXBoZXJfbGlzdCBhbmQgY2lwaGVyX2xpc3RfYnlfaWQgc3RhY2tzICovCisJaWYgKHMtPmNpcGhlcl9saXN0ICE9IE5VTEwpCisJCXsKKwkJaWYgKChyZXQtPmNpcGhlcl9saXN0PXNrX1NTTF9DSVBIRVJfZHVwKHMtPmNpcGhlcl9saXN0KSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQl9CisJaWYgKHMtPmNpcGhlcl9saXN0X2J5X2lkICE9IE5VTEwpCisJCWlmICgocmV0LT5jaXBoZXJfbGlzdF9ieV9pZD1za19TU0xfQ0lQSEVSX2R1cChzLT5jaXBoZXJfbGlzdF9ieV9pZCkpCisJCQk9PSBOVUxMKQorCQkJZ290byBlcnI7CisKKwkvKiBEdXAgdGhlIGNsaWVudF9DQSBsaXN0ICovCisJaWYgKHMtPmNsaWVudF9DQSAhPSBOVUxMKQorCQl7CisJCWlmICgoc2s9c2tfWDUwOV9OQU1FX2R1cChzLT5jbGllbnRfQ0EpKSA9PSBOVUxMKSBnb3RvIGVycjsKKwkJcmV0LT5jbGllbnRfQ0E9c2s7CisJCWZvciAoaT0wOyBpPHNrX1g1MDlfTkFNRV9udW0oc2spOyBpKyspCisJCQl7CisJCQl4bj1za19YNTA5X05BTUVfdmFsdWUoc2ssaSk7CisJCQlpZiAoc2tfWDUwOV9OQU1FX3NldChzayxpLFg1MDlfTkFNRV9kdXAoeG4pKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlYNTA5X05BTUVfZnJlZSh4bik7CisJCQkJZ290byBlcnI7CisJCQkJfQorCQkJfQorCQl9CisKKwlpZiAoMCkKKwkJeworZXJyOgorCQlpZiAocmV0ICE9IE5VTEwpIFNTTF9mcmVlKHJldCk7CisJCXJldD1OVUxMOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCit2b2lkIHNzbF9jbGVhcl9jaXBoZXJfY3R4KFNTTCAqcykKKwl7CisJaWYgKHMtPmVuY19yZWFkX2N0eCAhPSBOVUxMKQorCQl7CisJCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAocy0+ZW5jX3JlYWRfY3R4KTsKKwkJT1BFTlNTTF9mcmVlKHMtPmVuY19yZWFkX2N0eCk7CisJCXMtPmVuY19yZWFkX2N0eD1OVUxMOworCQl9CisJaWYgKHMtPmVuY193cml0ZV9jdHggIT0gTlVMTCkKKwkJeworCQlFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKHMtPmVuY193cml0ZV9jdHgpOworCQlPUEVOU1NMX2ZyZWUocy0+ZW5jX3dyaXRlX2N0eCk7CisJCXMtPmVuY193cml0ZV9jdHg9TlVMTDsKKwkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKwlpZiAocy0+ZXhwYW5kICE9IE5VTEwpCisJCXsKKwkJQ09NUF9DVFhfZnJlZShzLT5leHBhbmQpOworCQlzLT5leHBhbmQ9TlVMTDsKKwkJfQorCWlmIChzLT5jb21wcmVzcyAhPSBOVUxMKQorCQl7CisJCUNPTVBfQ1RYX2ZyZWUocy0+Y29tcHJlc3MpOworCQlzLT5jb21wcmVzcz1OVUxMOworCQl9CisjZW5kaWYKKwl9CisKKy8qIEZpeCB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgaXQgdGFrZXMgYW4gb3B0aW9uYWwgdHlwZSBwYXJhbWV0ZXIgKi8KK1g1MDkgKlNTTF9nZXRfY2VydGlmaWNhdGUoY29uc3QgU1NMICpzKQorCXsKKwlpZiAocy0+Y2VydCAhPSBOVUxMKQorCQlyZXR1cm4ocy0+Y2VydC0+a2V5LT54NTA5KTsKKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKKy8qIEZpeCB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgaXQgdGFrZXMgYW4gb3B0aW9uYWwgdHlwZSBwYXJhbWV0ZXIgKi8KK0VWUF9QS0VZICpTU0xfZ2V0X3ByaXZhdGVrZXkoU1NMICpzKQorCXsKKwlpZiAocy0+Y2VydCAhPSBOVUxMKQorCQlyZXR1cm4ocy0+Y2VydC0+a2V5LT5wcml2YXRla2V5KTsKKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKK2NvbnN0IFNTTF9DSVBIRVIgKlNTTF9nZXRfY3VycmVudF9jaXBoZXIoY29uc3QgU1NMICpzKQorCXsKKwlpZiAoKHMtPnNlc3Npb24gIT0gTlVMTCkgJiYgKHMtPnNlc3Npb24tPmNpcGhlciAhPSBOVUxMKSkKKwkJcmV0dXJuKHMtPnNlc3Npb24tPmNpcGhlcik7CisJcmV0dXJuKE5VTEwpOworCX0KKyNpZmRlZiBPUEVOU1NMX05PX0NPTVAKK2NvbnN0IHZvaWQgKlNTTF9nZXRfY3VycmVudF9jb21wcmVzc2lvbihTU0wgKnMpCisJeworCXJldHVybiBOVUxMOworCX0KK2NvbnN0IHZvaWQgKlNTTF9nZXRfY3VycmVudF9leHBhbnNpb24oU1NMICpzKQorCXsKKwlyZXR1cm4gTlVMTDsKKwl9CisjZWxzZQorCitjb25zdCBDT01QX01FVEhPRCAqU1NMX2dldF9jdXJyZW50X2NvbXByZXNzaW9uKFNTTCAqcykKKwl7CisJaWYgKHMtPmNvbXByZXNzICE9IE5VTEwpCisJCXJldHVybihzLT5jb21wcmVzcy0+bWV0aCk7CisJcmV0dXJuKE5VTEwpOworCX0KKworY29uc3QgQ09NUF9NRVRIT0QgKlNTTF9nZXRfY3VycmVudF9leHBhbnNpb24oU1NMICpzKQorCXsKKwlpZiAocy0+ZXhwYW5kICE9IE5VTEwpCisJCXJldHVybihzLT5leHBhbmQtPm1ldGgpOworCXJldHVybihOVUxMKTsKKwl9CisjZW5kaWYKKworaW50IHNzbF9pbml0X3diaW9fYnVmZmVyKFNTTCAqcyxpbnQgcHVzaCkKKwl7CisJQklPICpiYmlvOworCisJaWYgKHMtPmJiaW8gPT0gTlVMTCkKKwkJeworCQliYmlvPUJJT19uZXcoQklPX2ZfYnVmZmVyKCkpOworCQlpZiAoYmJpbyA9PSBOVUxMKSByZXR1cm4oMCk7CisJCXMtPmJiaW89YmJpbzsKKwkJfQorCWVsc2UKKwkJeworCQliYmlvPXMtPmJiaW87CisJCWlmIChzLT5iYmlvID09IHMtPndiaW8pCisJCQlzLT53YmlvPUJJT19wb3Aocy0+d2Jpbyk7CisJCX0KKwkodm9pZClCSU9fcmVzZXQoYmJpbyk7CisvKglpZiAoIUJJT19zZXRfd3JpdGVfYnVmZmVyX3NpemUoYmJpbywxNioxMDI0KSkgKi8KKwlpZiAoIUJJT19zZXRfcmVhZF9idWZmZXJfc2l6ZShiYmlvLDEpKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfSU5JVF9XQklPX0JVRkZFUixFUlJfUl9CVUZfTElCKTsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKHB1c2gpCisJCXsKKwkJaWYgKHMtPndiaW8gIT0gYmJpbykKKwkJCXMtPndiaW89QklPX3B1c2goYmJpbyxzLT53YmlvKTsKKwkJfQorCWVsc2UKKwkJeworCQlpZiAocy0+d2JpbyA9PSBiYmlvKQorCQkJcy0+d2Jpbz1CSU9fcG9wKGJiaW8pOworCQl9CisJcmV0dXJuKDEpOworCX0KKwordm9pZCBzc2xfZnJlZV93YmlvX2J1ZmZlcihTU0wgKnMpCisJeworCWlmIChzLT5iYmlvID09IE5VTEwpIHJldHVybjsKKworCWlmIChzLT5iYmlvID09IHMtPndiaW8pCisJCXsKKwkJLyogcmVtb3ZlIGJ1ZmZlcmluZyAqLworCQlzLT53YmlvPUJJT19wb3Aocy0+d2Jpbyk7CisjaWZkZWYgUkVGX0NIRUNLIC8qIG5vdCB0aGUgdXN1YWwgUkVGX0NIRUNLLCBidXQgdGhpcyBhdm9pZHMgYWRkaW5nIG9uZSBtb3JlIHByZXByb2Nlc3NvciBzeW1ib2wgKi8KKwkJYXNzZXJ0KHMtPndiaW8gIT0gTlVMTCk7CisjZW5kaWYKKwl9CisJQklPX2ZyZWUocy0+YmJpbyk7CisJcy0+YmJpbz1OVUxMOworCX0KKwkKK3ZvaWQgU1NMX0NUWF9zZXRfcXVpZXRfc2h1dGRvd24oU1NMX0NUWCAqY3R4LGludCBtb2RlKQorCXsKKwljdHgtPnF1aWV0X3NodXRkb3duPW1vZGU7CisJfQorCitpbnQgU1NMX0NUWF9nZXRfcXVpZXRfc2h1dGRvd24oY29uc3QgU1NMX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4oY3R4LT5xdWlldF9zaHV0ZG93bik7CisJfQorCit2b2lkIFNTTF9zZXRfcXVpZXRfc2h1dGRvd24oU1NMICpzLGludCBtb2RlKQorCXsKKwlzLT5xdWlldF9zaHV0ZG93bj1tb2RlOworCX0KKworaW50IFNTTF9nZXRfcXVpZXRfc2h1dGRvd24oY29uc3QgU1NMICpzKQorCXsKKwlyZXR1cm4ocy0+cXVpZXRfc2h1dGRvd24pOworCX0KKwordm9pZCBTU0xfc2V0X3NodXRkb3duKFNTTCAqcyxpbnQgbW9kZSkKKwl7CisJcy0+c2h1dGRvd249bW9kZTsKKwl9CisKK2ludCBTU0xfZ2V0X3NodXRkb3duKGNvbnN0IFNTTCAqcykKKwl7CisJcmV0dXJuKHMtPnNodXRkb3duKTsKKwl9CisKK2ludCBTU0xfdmVyc2lvbihjb25zdCBTU0wgKnMpCisJeworCXJldHVybihzLT52ZXJzaW9uKTsKKwl9CisKK1NTTF9DVFggKlNTTF9nZXRfU1NMX0NUWChjb25zdCBTU0wgKnNzbCkKKwl7CisJcmV0dXJuKHNzbC0+Y3R4KTsKKwl9CisKK1NTTF9DVFggKlNTTF9zZXRfU1NMX0NUWChTU0wgKnNzbCwgU1NMX0NUWCogY3R4KQorCXsKKwlpZiAoc3NsLT5jdHggPT0gY3R4KQorCQlyZXR1cm4gc3NsLT5jdHg7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKGN0eCA9PSBOVUxMKQorCQljdHggPSBzc2wtPmluaXRpYWxfY3R4OworI2VuZGlmCisJaWYgKHNzbC0+Y2VydCAhPSBOVUxMKQorCQlzc2xfY2VydF9mcmVlKHNzbC0+Y2VydCk7CisJc3NsLT5jZXJ0ID0gc3NsX2NlcnRfZHVwKGN0eC0+Y2VydCk7CisJQ1JZUFRPX2FkZCgmY3R4LT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJaWYgKHNzbC0+Y3R4ICE9IE5VTEwpCisJCVNTTF9DVFhfZnJlZShzc2wtPmN0eCk7IC8qIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnQgKi8KKwlzc2wtPmN0eCA9IGN0eDsKKwlyZXR1cm4oc3NsLT5jdHgpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1NURElPCitpbnQgU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoU1NMX0NUWCAqY3R4KQorCXsKKwlyZXR1cm4oWDUwOV9TVE9SRV9zZXRfZGVmYXVsdF9wYXRocyhjdHgtPmNlcnRfc3RvcmUpKTsKKwl9CisKK2ludCBTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKkNBZmlsZSwKKwkJY29uc3QgY2hhciAqQ0FwYXRoKQorCXsKKwlyZXR1cm4oWDUwOV9TVE9SRV9sb2FkX2xvY2F0aW9ucyhjdHgtPmNlcnRfc3RvcmUsQ0FmaWxlLENBcGF0aCkpOworCX0KKyNlbmRpZgorCit2b2lkIFNTTF9zZXRfaW5mb19jYWxsYmFjayhTU0wgKnNzbCwKKwl2b2lkICgqY2IpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpKQorCXsKKwlzc2wtPmluZm9fY2FsbGJhY2s9Y2I7CisJfQorCisvKiBPbmUgY29tcGlsZXIgKERpYWIgRENDKSBkb2Vzbid0IGxpa2UgYXJndW1lbnQgbmFtZXMgaW4gcmV0dXJuZWQKKyAgIGZ1bmN0aW9uIHBvaW50ZXIuICAqLwordm9pZCAoKlNTTF9nZXRfaW5mb19jYWxsYmFjayhjb25zdCBTU0wgKnNzbCkpKGNvbnN0IFNTTCAqIC8qc3NsKi8saW50IC8qdHlwZSovLGludCAvKnZhbCovKQorCXsKKwlyZXR1cm4gc3NsLT5pbmZvX2NhbGxiYWNrOworCX0KKworaW50IFNTTF9zdGF0ZShjb25zdCBTU0wgKnNzbCkKKwl7CisJcmV0dXJuKHNzbC0+c3RhdGUpOworCX0KKwordm9pZCBTU0xfc2V0X3ZlcmlmeV9yZXN1bHQoU1NMICpzc2wsbG9uZyBhcmcpCisJeworCXNzbC0+dmVyaWZ5X3Jlc3VsdD1hcmc7CisJfQorCitsb25nIFNTTF9nZXRfdmVyaWZ5X3Jlc3VsdChjb25zdCBTU0wgKnNzbCkKKwl7CisJcmV0dXJuKHNzbC0+dmVyaWZ5X3Jlc3VsdCk7CisJfQorCitpbnQgU1NMX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLHZvaWQgKmFyZ3AsQ1JZUFRPX0VYX25ldyAqbmV3X2Z1bmMsCisJCQkgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKwl7CisJcmV0dXJuIENSWVBUT19nZXRfZXhfbmV3X2luZGV4KENSWVBUT19FWF9JTkRFWF9TU0wsIGFyZ2wsIGFyZ3AsCisJCQkJbmV3X2Z1bmMsIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworCX0KKworaW50IFNTTF9zZXRfZXhfZGF0YShTU0wgKnMsaW50IGlkeCx2b2lkICphcmcpCisJeworCXJldHVybihDUllQVE9fc2V0X2V4X2RhdGEoJnMtPmV4X2RhdGEsaWR4LGFyZykpOworCX0KKwordm9pZCAqU1NMX2dldF9leF9kYXRhKGNvbnN0IFNTTCAqcyxpbnQgaWR4KQorCXsKKwlyZXR1cm4oQ1JZUFRPX2dldF9leF9kYXRhKCZzLT5leF9kYXRhLGlkeCkpOworCX0KKworaW50IFNTTF9DVFhfZ2V0X2V4X25ld19pbmRleChsb25nIGFyZ2wsdm9pZCAqYXJncCxDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkJCSAgICAgQ1JZUFRPX0VYX2R1cCAqZHVwX2Z1bmMsQ1JZUFRPX0VYX2ZyZWUgKmZyZWVfZnVuYykKKwl7CisJcmV0dXJuIENSWVBUT19nZXRfZXhfbmV3X2luZGV4KENSWVBUT19FWF9JTkRFWF9TU0xfQ1RYLCBhcmdsLCBhcmdwLAorCQkJCW5ld19mdW5jLCBkdXBfZnVuYywgZnJlZV9mdW5jKTsKKwl9CisKK2ludCBTU0xfQ1RYX3NldF9leF9kYXRhKFNTTF9DVFggKnMsaW50IGlkeCx2b2lkICphcmcpCisJeworCXJldHVybihDUllQVE9fc2V0X2V4X2RhdGEoJnMtPmV4X2RhdGEsaWR4LGFyZykpOworCX0KKwordm9pZCAqU1NMX0NUWF9nZXRfZXhfZGF0YShjb25zdCBTU0xfQ1RYICpzLGludCBpZHgpCisJeworCXJldHVybihDUllQVE9fZ2V0X2V4X2RhdGEoJnMtPmV4X2RhdGEsaWR4KSk7CisJfQorCitpbnQgc3NsX29rKFNTTCAqcykKKwl7CisJcmV0dXJuKDEpOworCX0KKworWDUwOV9TVE9SRSAqU1NMX0NUWF9nZXRfY2VydF9zdG9yZShjb25zdCBTU0xfQ1RYICpjdHgpCisJeworCXJldHVybihjdHgtPmNlcnRfc3RvcmUpOworCX0KKwordm9pZCBTU0xfQ1RYX3NldF9jZXJ0X3N0b3JlKFNTTF9DVFggKmN0eCxYNTA5X1NUT1JFICpzdG9yZSkKKwl7CisJaWYgKGN0eC0+Y2VydF9zdG9yZSAhPSBOVUxMKQorCQlYNTA5X1NUT1JFX2ZyZWUoY3R4LT5jZXJ0X3N0b3JlKTsKKwljdHgtPmNlcnRfc3RvcmU9c3RvcmU7CisJfQorCitpbnQgU1NMX3dhbnQoY29uc3QgU1NMICpzKQorCXsKKwlyZXR1cm4ocy0+cndzdGF0ZSk7CisJfQorCisvKiEKKyAqIFxicmllZiBTZXQgdGhlIGNhbGxiYWNrIGZvciBnZW5lcmF0aW5nIHRlbXBvcmFyeSBSU0Ega2V5cy4KKyAqIFxwYXJhbSBjdHggdGhlIFNTTCBjb250ZXh0LgorICogXHBhcmFtIGNiIHRoZSBjYWxsYmFjaworICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK3ZvaWQgU1NMX0NUWF9zZXRfdG1wX3JzYV9jYWxsYmFjayhTU0xfQ1RYICpjdHgsUlNBICooKmNiKShTU0wgKnNzbCwKKwkJCQkJCQkgIGludCBpc19leHBvcnQsCisJCQkJCQkJICBpbnQga2V5bGVuZ3RoKSkKKyAgICB7CisgICAgU1NMX0NUWF9jYWxsYmFja19jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfVE1QX1JTQV9DQiwodm9pZCAoKikodm9pZCkpY2IpOworICAgIH0KKwordm9pZCBTU0xfc2V0X3RtcF9yc2FfY2FsbGJhY2soU1NMICpzc2wsUlNBICooKmNiKShTU0wgKnNzbCwKKwkJCQkJCSAgaW50IGlzX2V4cG9ydCwKKwkJCQkJCSAgaW50IGtleWxlbmd0aCkpCisgICAgeworICAgIFNTTF9jYWxsYmFja19jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVE1QX1JTQV9DQiwodm9pZCAoKikodm9pZCkpY2IpOworICAgIH0KKyNlbmRpZgorCisjaWZkZWYgRE9YWUdFTgorLyohCisgKiBcYnJpZWYgVGhlIFJTQSB0ZW1wb3Jhcnkga2V5IGNhbGxiYWNrIGZ1bmN0aW9uLgorICogXHBhcmFtIHNzbCB0aGUgU1NMIHNlc3Npb24uCisgKiBccGFyYW0gaXNfZXhwb3J0IFxjIFRSVUUgaWYgdGhlIHRlbXAgUlNBIGtleSBpcyBmb3IgYW4gZXhwb3J0IGNpcGhlcnN1aXRlLgorICogXHBhcmFtIGtleWxlbmd0aCBpZiBcYyBpc19leHBvcnQgaXMgXGMgVFJVRSwgdGhlbiBcYyBrZXlsZW5ndGggaXMgdGhlIHNpemUKKyAqIG9mIHRoZSByZXF1aXJlZCBrZXkgaW4gYml0cy4KKyAqIFxyZXR1cm4gdGhlIHRlbXBvcmFyeSBSU0Ega2V5LgorICogXHNhIFNTTF9DVFhfc2V0X3RtcF9yc2FfY2FsbGJhY2ssIFNTTF9zZXRfdG1wX3JzYV9jYWxsYmFjaworICovCisKK1JTQSAqY2IoU1NMICpzc2wsaW50IGlzX2V4cG9ydCxpbnQga2V5bGVuZ3RoKQorICAgIHt9CisjZW5kaWYKKworLyohCisgKiBcYnJpZWYgU2V0IHRoZSBjYWxsYmFjayBmb3IgZ2VuZXJhdGluZyB0ZW1wb3JhcnkgREgga2V5cy4KKyAqIFxwYXJhbSBjdHggdGhlIFNTTCBjb250ZXh0LgorICogXHBhcmFtIGRoIHRoZSBjYWxsYmFjaworICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAordm9pZCBTU0xfQ1RYX3NldF90bXBfZGhfY2FsbGJhY2soU1NMX0NUWCAqY3R4LERIICooKmRoKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5bGVuZ3RoKSkKKwl7CisJU1NMX0NUWF9jYWxsYmFja19jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfVE1QX0RIX0NCLCh2b2lkICgqKSh2b2lkKSlkaCk7CisJfQorCit2b2lkIFNTTF9zZXRfdG1wX2RoX2NhbGxiYWNrKFNTTCAqc3NsLERIICooKmRoKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleWxlbmd0aCkpCisJeworCVNTTF9jYWxsYmFja19jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVE1QX0RIX0NCLCh2b2lkICgqKSh2b2lkKSlkaCk7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICit2b2lkIFNTTF9DVFhfc2V0X3RtcF9lY2RoX2NhbGxiYWNrKFNTTF9DVFggKmN0eCxFQ19LRVkgKigqZWNkaCkoU1NMICpzc2wsaW50IGlzX2V4cG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5bGVuZ3RoKSkKKwl7CisJU1NMX0NUWF9jYWxsYmFja19jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfVE1QX0VDREhfQ0IsKHZvaWQgKCopKHZvaWQpKWVjZGgpOworCX0KKwordm9pZCBTU0xfc2V0X3RtcF9lY2RoX2NhbGxiYWNrKFNTTCAqc3NsLEVDX0tFWSAqKCplY2RoKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5bGVuZ3RoKSkKKwl7CisJU1NMX2NhbGxiYWNrX2N0cmwoc3NsLFNTTF9DVFJMX1NFVF9UTVBfRUNESF9DQiwodm9pZCAoKikodm9pZCkpZWNkaCk7CisJfQorI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKK2ludCBTU0xfQ1RYX3VzZV9wc2tfaWRlbnRpdHlfaGludChTU0xfQ1RYICpjdHgsIGNvbnN0IGNoYXIgKmlkZW50aXR5X2hpbnQpCisJeworCWlmIChpZGVudGl0eV9oaW50ICE9IE5VTEwgJiYgc3RybGVuKGlkZW50aXR5X2hpbnQpID4gUFNLX01BWF9JREVOVElUWV9MRU4pCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX1BTS19JREVOVElUWV9ISU5ULCBTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORyk7CisJCXJldHVybiAwOworCQl9CisJaWYgKGN0eC0+cHNrX2lkZW50aXR5X2hpbnQgIT0gTlVMTCkKKwkJT1BFTlNTTF9mcmVlKGN0eC0+cHNrX2lkZW50aXR5X2hpbnQpOworCWlmIChpZGVudGl0eV9oaW50ICE9IE5VTEwpCisJCXsKKwkJY3R4LT5wc2tfaWRlbnRpdHlfaGludCA9IEJVRl9zdHJkdXAoaWRlbnRpdHlfaGludCk7CisJCWlmIChjdHgtPnBza19pZGVudGl0eV9oaW50ID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJfQorCWVsc2UKKwkJY3R4LT5wc2tfaWRlbnRpdHlfaGludCA9IE5VTEw7CisJcmV0dXJuIDE7CisJfQorCitpbnQgU1NMX3VzZV9wc2tfaWRlbnRpdHlfaGludChTU0wgKnMsIGNvbnN0IGNoYXIgKmlkZW50aXR5X2hpbnQpCisJeworCWlmIChzID09IE5VTEwpCisJCXJldHVybiAwOworCisJaWYgKHMtPnNlc3Npb24gPT0gTlVMTCkKKwkJcmV0dXJuIDE7IC8qIHNlc3Npb24gbm90IGNyZWF0ZWQgeWV0LCBpZ25vcmVkICovCisKKwlpZiAoaWRlbnRpdHlfaGludCAhPSBOVUxMICYmIHN0cmxlbihpZGVudGl0eV9oaW50KSA+IFBTS19NQVhfSURFTlRJVFlfTEVOKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfVVNFX1BTS19JREVOVElUWV9ISU5ULCBTU0xfUl9EQVRBX0xFTkdUSF9UT09fTE9ORyk7CisJCXJldHVybiAwOworCQl9CisJaWYgKHMtPnNlc3Npb24tPnBza19pZGVudGl0eV9oaW50ICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHlfaGludCk7CisJaWYgKGlkZW50aXR5X2hpbnQgIT0gTlVMTCkKKwkJeworCQlzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHlfaGludCA9IEJVRl9zdHJkdXAoaWRlbnRpdHlfaGludCk7CisJCWlmIChzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHlfaGludCA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CisJCX0KKwllbHNlCisJCXMtPnNlc3Npb24tPnBza19pZGVudGl0eV9oaW50ID0gTlVMTDsKKwlyZXR1cm4gMTsKKwl9CisKK2NvbnN0IGNoYXIgKlNTTF9nZXRfcHNrX2lkZW50aXR5X2hpbnQoY29uc3QgU1NMICpzKQorCXsKKwlpZiAocyA9PSBOVUxMIHx8IHMtPnNlc3Npb24gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuKHMtPnNlc3Npb24tPnBza19pZGVudGl0eV9oaW50KTsKKwl9CisKK2NvbnN0IGNoYXIgKlNTTF9nZXRfcHNrX2lkZW50aXR5KGNvbnN0IFNTTCAqcykKKwl7CisJaWYgKHMgPT0gTlVMTCB8fCBzLT5zZXNzaW9uID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybihzLT5zZXNzaW9uLT5wc2tfaWRlbnRpdHkpOworCX0KKwordm9pZCBTU0xfc2V0X3Bza19jbGllbnRfY2FsbGJhY2soU1NMICpzLAorICAgIHVuc2lnbmVkIGludCAoKmNiKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqaWRlbnRpdHksIHVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLCB1bnNpZ25lZCBjaGFyICpwc2ssCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXhfcHNrX2xlbikpCisJeworCXMtPnBza19jbGllbnRfY2FsbGJhY2sgPSBjYjsKKwl9CisKK3ZvaWQgU1NMX0NUWF9zZXRfcHNrX2NsaWVudF9jYWxsYmFjayhTU0xfQ1RYICpjdHgsCisgICAgdW5zaWduZWQgaW50ICgqY2IpKFNTTCAqc3NsLCBjb25zdCBjaGFyICpoaW50LAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICppZGVudGl0eSwgdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sIHVuc2lnbmVkIGNoYXIgKnBzaywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSkKKwl7CisJY3R4LT5wc2tfY2xpZW50X2NhbGxiYWNrID0gY2I7CisJfQorCit2b2lkIFNTTF9zZXRfcHNrX3NlcnZlcl9jYWxsYmFjayhTU0wgKnMsCisgICAgdW5zaWduZWQgaW50ICgqY2IpKFNTTCAqc3NsLCBjb25zdCBjaGFyICppZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcHNrLCB1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pKQorCXsKKwlzLT5wc2tfc2VydmVyX2NhbGxiYWNrID0gY2I7CisJfQorCit2b2lkIFNTTF9DVFhfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soU1NMX0NUWCAqY3R4LAorICAgIHVuc2lnbmVkIGludCAoKmNiKShTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKSkKKwl7CisJY3R4LT5wc2tfc2VydmVyX2NhbGxiYWNrID0gY2I7CisJfQorI2VuZGlmCisKK3ZvaWQgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrKFNTTF9DVFggKmN0eCwgdm9pZCAoKmNiKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykpCisJeworCVNTTF9DVFhfY2FsbGJhY2tfY3RybChjdHgsIFNTTF9DVFJMX1NFVF9NU0dfQ0FMTEJBQ0ssICh2b2lkICgqKSh2b2lkKSljYik7CisJfQordm9pZCBTU0xfc2V0X21zZ19jYWxsYmFjayhTU0wgKnNzbCwgdm9pZCAoKmNiKShpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykpCisJeworCVNTTF9jYWxsYmFja19jdHJsKHNzbCwgU1NMX0NUUkxfU0VUX01TR19DQUxMQkFDSywgKHZvaWQgKCopKHZvaWQpKWNiKTsKKwl9CisKK2ludCBTU0xfY3V0dGhyb3VnaF9jb21wbGV0ZShjb25zdCBTU0wgKnMpCisJeworCXJldHVybiAoIXMtPnNlcnZlciAmJiAgICAgICAgICAgICAgICAgLyogY3V0dGhyb3VnaCBvbmx5IGFwcGxpZXMgdG8gY2xpZW50cyAqLworCQkhcy0+aGl0ICYmICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVsbC1oYW5kc2hha2UgKi8KKwkJcy0+dmVyc2lvbiA+PSBTU0wzX1ZFUlNJT04gJiYKKwkJcy0+czMtPmluX3JlYWRfYXBwX2RhdGEgPT0gMCAmJiAgIC8qIGN1dHRocm91Z2ggb25seSBhcHBsaWVzIHRvIHdyaXRlKCkgKi8KKwkJKFNTTF9nZXRfbW9kZSgoU1NMKilzKSAmIFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIKSAmJiAgLyogY3V0dGhyb3VnaCBlbmFibGVkICovCisJCVNTTF9nZXRfY2lwaGVyX2JpdHMocywgTlVMTCkgPj0gMTI4ICYmICAgICAgICAgICAgICAgICAgICAgIC8qIHN0cm9uZyBjaXBoZXIgY2hvb3NlbiAqLworCQlzLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkX2xlbiA9PSAwICYmICAgICAgICAgICAgICAgICAvKiBub3QgYSByZW5lZ290aWF0aW9uIGhhbmRzaGFrZSAqLworCQkocy0+c3RhdGUgPT0gU1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9BIHx8ICAgICAgICAgICAgICAgICAvKiByZWFkeSB0byB3cml0ZSBhcHAtZGF0YSovCisJCQlzLT5zdGF0ZSA9PSBTU0wzX1NUX0NSX0ZJTklTSEVEX0EpKTsKKwl9CisKKy8qIEFsbG9jYXRlcyBuZXcgRVZQX01EX0NUWCBhbmQgc2V0cyBwb2ludGVyIHRvIGl0IGludG8gZ2l2ZW4gcG9pbnRlcgorICogdmFpcmFibGUsIGZyZWVpbmcgIEVWUF9NRF9DVFggcHJldmlvdXNseSBzdG9yZWQgaW4gdGhhdCB2YXJpYWJsZSwgaWYKKyAqIGFueS4gSWYgRVZQX01EIHBvaW50ZXIgaXMgcGFzc2VkLCBpbml0aWFsaXplcyBjdHggd2l0aCB0aGlzIG1kCisgKiBSZXR1cm5zIG5ld2x5IGFsbG9jYXRlZCBjdHg7CisgKi8KKworRVZQX01EX0NUWCAqc3NsX3JlcGxhY2VfaGFzaChFVlBfTURfQ1RYICoqaGFzaCxjb25zdCBFVlBfTUQgKm1kKSAKK3sKKwlzc2xfY2xlYXJfaGFzaF9jdHgoaGFzaCk7CisJKmhhc2ggPSBFVlBfTURfQ1RYX2NyZWF0ZSgpOworCWlmIChtZCkgRVZQX0RpZ2VzdEluaXRfZXgoKmhhc2gsbWQsTlVMTCk7CisJcmV0dXJuICpoYXNoOworfQordm9pZCBzc2xfY2xlYXJfaGFzaF9jdHgoRVZQX01EX0NUWCAqKmhhc2gpIAoreworCisJaWYgKCpoYXNoKSBFVlBfTURfQ1RYX2Rlc3Ryb3koKmhhc2gpOworCSpoYXNoPU5VTEw7Cit9CisKKyNpZiBkZWZpbmVkKF9XSU5ETEwpICYmIGRlZmluZWQoT1BFTlNTTF9TWVNfV0lOMTYpCisjaW5jbHVkZSAiLi4vY3J5cHRvL2Jpby9ic3NfZmlsZS5jIgorI2VuZGlmCisKK0lNUExFTUVOVF9TVEFDS19PRihTU0xfQ0lQSEVSKQorSU1QTEVNRU5UX1NUQUNLX09GKFNTTF9DT01QKQorSU1QTEVNRU5UX09CSl9CU0VBUkNIX0dMT0JBTF9DTVBfRk4oU1NMX0NJUEhFUiwgU1NMX0NJUEhFUiwKKwkJCQkgICAgc3NsX2NpcGhlcl9pZCk7CisKZGlmZiAtLWdpdCBhL2xpYi9vcGVuc3NsL3NzbC9zc2xfbG9jbC5oIGIvbGliL29wZW5zc2wvc3NsL3NzbF9sb2NsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkMjI5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zc2xfbG9jbC5oCkBAIC0wLDAgKzEsMTA3OSBAQAorLyogc3NsL3NzbF9sb2NsLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNyBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIEVDQyBjaXBoZXIgc3VpdGUgc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNSBOb2tpYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgcG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgaXMgZGV2ZWxvcGVkIGJ5CisgKiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiwgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mCisgKiBOb2tpYSBDb3Jwb3JhdGlvbiwgY29uc2lzdHMgb2YgdGhlICJQU0siIChQcmUtU2hhcmVkIEtleSkgY2lwaGVyc3VpdGVzCisgKiBzdXBwb3J0IChzZWUgUkZDIDQyNzkpIHRvIE9wZW5TU0wuCisgKgorICogTm8gcGF0ZW50IGxpY2Vuc2VzIG9yIG90aGVyIHJpZ2h0cyBleGNlcHQgdGhvc2UgZXhwcmVzc2x5IHN0YXRlZCBpbgorICogdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UgbGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgZ3JhbnRlZCBvciByZWNlaXZlZAorICogZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwsIG9yIG90aGVyd2lzZS4KKyAqCisgKiBObyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBOb2tpYSB0aGF0IHRoZSBDb250cmlidXRpb24gZG9lcyBub3QKKyAqIGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgdGhpcmQKKyAqIHBhcnR5IG9yIHRoYXQgdGhlIGxpY2Vuc2UgcHJvdmlkZXMgeW91IHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgcmlnaHRzCisgKiB0byBtYWtlIHVzZSBvZiB0aGUgQ29udHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQuIElOCisgKiBBRERJVElPTiBUTyBUSEUgRElTQ0xBSU1FUlMgSU5DTFVERUQgSU4gVEhFIExJQ0VOU0UsIE5PS0lBCisgKiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgRk9SIENMQUlNUyBCUk9VR0hUIEJZIFlPVSBPUiBBTlkKKyAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgorICogT1RIRVJXSVNFLgorICovCisKKyNpZm5kZWYgSEVBREVSX1NTTF9MT0NMX0gKKyNkZWZpbmUgSEVBREVSX1NTTF9MT0NMX0gKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgImVfb3MuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorI2luY2x1ZGUgPG9wZW5zc2wvY29tcC5oPgorI2VuZGlmCisjaW5jbHVkZSA8b3BlbnNzbC9iaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3N0YWNrLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxvcGVuc3NsL2Vyci5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9zeW1oYWNrcy5oPgorCisjaWZkZWYgT1BFTlNTTF9CVUlMRF9TSExJQlNTTAorIyB1bmRlZiBPUEVOU1NMX0VYVEVSTgorIyBkZWZpbmUgT1BFTlNTTF9FWFRFUk4gT1BFTlNTTF9FWFBPUlQKKyNlbmRpZgorCisjZGVmaW5lIFBLQ1MxX0NIRUNLCisKKyNkZWZpbmUgYzJsKGMsbCkJKGwgPSAoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSkgICAgICwgXAorCQkJIGx8PSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PCA4KSwgXAorCQkJIGx8PSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PDE2KSwgXAorCQkJIGx8PSgoKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PDI0KSkKKworLyogTk9URSAtIGMgaXMgbm90IGluY3JlbWVudGVkIGFzIHBlciBjMmwgKi8KKyNkZWZpbmUgYzJsbihjLGwxLGwyLG4pCXsgXAorCQkJYys9bjsgXAorCQkJbDE9bDI9MDsgXAorCQkJc3dpdGNoIChuKSB7IFwKKwkJCWNhc2UgODogbDIgPSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MjQ7IFwKKwkJCWNhc2UgNzogbDJ8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MTY7IFwKKwkJCWNhc2UgNjogbDJ8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8IDg7IFwKKwkJCWNhc2UgNTogbDJ8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTsgICAgIFwKKwkJCWNhc2UgNDogbDEgPSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MjQ7IFwKKwkJCWNhc2UgMzogbDF8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8MTY7IFwKKwkJCWNhc2UgMjogbDF8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTw8IDg7IFwKKwkJCWNhc2UgMTogbDF8PSgodW5zaWduZWQgbG9uZykoKigtLShjKSkpKTsgICAgIFwKKwkJCQl9IFwKKwkJCX0KKworI2RlZmluZSBsMmMobCxjKQkoKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCkgICAgKSYweGZmKSwgXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4gOCkmMHhmZiksIFwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MTYpJjB4ZmYpLCBcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjI0KSYweGZmKSkKKworI2RlZmluZSBuMmwoYyxsKQkobCA9KCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpPDwyNCwgXAorCQkJIGx8PSgodW5zaWduZWQgbG9uZykoKigoYykrKykpKTw8MTYsIFwKKwkJCSBsfD0oKHVuc2lnbmVkIGxvbmcpKCooKGMpKyspKSk8PCA4LCBcCisJCQkgbHw9KCh1bnNpZ25lZCBsb25nKSgqKChjKSsrKSkpKQorCisjZGVmaW5lIGwybihsLGMpCSgqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MjQpJjB4ZmYpLCBcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjE2KSYweGZmKSwgXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4gOCkmMHhmZiksIFwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKSAgICApJjB4ZmYpKQorCisjZGVmaW5lIGwybjYobCxjKQkoKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjQwKSYweGZmKSwgXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4zMikmMHhmZiksIFwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKT4+MjQpJjB4ZmYpLCBcCisJCQkgKigoYykrKyk9KHVuc2lnbmVkIGNoYXIpKCgobCk+PjE2KSYweGZmKSwgXAorCQkJICooKGMpKyspPSh1bnNpZ25lZCBjaGFyKSgoKGwpPj4gOCkmMHhmZiksIFwKKwkJCSAqKChjKSsrKT0odW5zaWduZWQgY2hhcikoKChsKSAgICApJjB4ZmYpKQorCisjZGVmaW5lIG4ybDYoYyxsKQkobCA9KChCTl9VTExPTkcpKCooKGMpKyspKSk8PDQwLCBcCisJCQkgbHw9KChCTl9VTExPTkcpKCooKGMpKyspKSk8PDMyLCBcCisJCQkgbHw9KChCTl9VTExPTkcpKCooKGMpKyspKSk8PDI0LCBcCisJCQkgbHw9KChCTl9VTExPTkcpKCooKGMpKyspKSk8PDE2LCBcCisJCQkgbHw9KChCTl9VTExPTkcpKCooKGMpKyspKSk8PCA4LCBcCisJCQkgbHw9KChCTl9VTExPTkcpKCooKGMpKyspKSkpCisKKy8qIE5PVEUgLSBjIGlzIG5vdCBpbmNyZW1lbnRlZCBhcyBwZXIgbDJjICovCisjZGVmaW5lIGwyY24obDEsbDIsYyxuKQl7IFwKKwkJCWMrPW47IFwKKwkJCXN3aXRjaCAobikgeyBcCisJCQljYXNlIDg6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+MjQpJjB4ZmYpOyBcCisJCQljYXNlIDc6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+MTYpJjB4ZmYpOyBcCisJCQljYXNlIDY6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKT4+IDgpJjB4ZmYpOyBcCisJCQljYXNlIDU6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwyKSAgICApJjB4ZmYpOyBcCisJCQljYXNlIDQ6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+MjQpJjB4ZmYpOyBcCisJCQljYXNlIDM6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+MTYpJjB4ZmYpOyBcCisJCQljYXNlIDI6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKT4+IDgpJjB4ZmYpOyBcCisJCQljYXNlIDE6ICooLS0oYykpPSh1bnNpZ25lZCBjaGFyKSgoKGwxKSAgICApJjB4ZmYpOyBcCisJCQkJfSBcCisJCQl9CisKKyNkZWZpbmUgbjJzKGMscykJKChzPSgoKHVuc2lnbmVkIGludCkoY1swXSkpPDwgOCl8IFwKKwkJCSAgICAoKCh1bnNpZ25lZCBpbnQpKGNbMV0pKSAgICApKSxjKz0yKQorI2RlZmluZSBzMm4ocyxjKQkoKGNbMF09KHVuc2lnbmVkIGNoYXIpKCgocyk+PiA4KSYweGZmKSwgXAorCQkJICBjWzFdPSh1bnNpZ25lZCBjaGFyKSgoKHMpICAgICkmMHhmZikpLGMrPTIpCisKKyNkZWZpbmUgbjJsMyhjLGwpCSgobCA9KCgodW5zaWduZWQgbG9uZykoY1swXSkpPDwxNil8IFwKKwkJCSAgICAgKCgodW5zaWduZWQgbG9uZykoY1sxXSkpPDwgOCl8IFwKKwkJCSAgICAgKCgodW5zaWduZWQgbG9uZykoY1syXSkpICAgICkpLGMrPTMpCisKKyNkZWZpbmUgbDJuMyhsLGMpCSgoY1swXT0odW5zaWduZWQgY2hhcikoKChsKT4+MTYpJjB4ZmYpLCBcCisJCQkgIGNbMV09KHVuc2lnbmVkIGNoYXIpKCgobCk+PiA4KSYweGZmKSwgXAorCQkJICBjWzJdPSh1bnNpZ25lZCBjaGFyKSgoKGwpICAgICkmMHhmZikpLGMrPTMpCisKKy8qIExPQ0FMIFNUVUZGICovCisKKyNkZWZpbmUgU1NMX0RFQ1JZUFQJMAorI2RlZmluZSBTU0xfRU5DUllQVAkxCisKKyNkZWZpbmUgVFdPX0JZVEVfQklUCTB4ODAKKyNkZWZpbmUgU0VDX0VTQ19CSVQJMHg0MAorI2RlZmluZSBUV09fQllURV9NQVNLCTB4N2ZmZgorI2RlZmluZSBUSFJFRV9CWVRFX01BU0sJMHgzZmZmCisKKyNkZWZpbmUgSU5DMzIoYSkJKChhKT0oKGEpKzEpJjB4ZmZmZmZmZmZMKQorI2RlZmluZSBERUMzMihhKQkoKGEpPSgoYSktMSkmMHhmZmZmZmZmZkwpCisjZGVmaW5lIE1BWF9NQUNfU0laRQkyMCAvKiB1cCBmcm9tIDE2IGZvciBTU0x2MyAqLworCisvKgorICogRGVmaW5lIHRoZSBCaXRtYXNrcyBmb3IgU1NMX0NJUEhFUi5hbGdvcml0aG1zLgorICogVGhpcyBiaXRzIGFyZSB1c2VkIHBhY2tlZCBhcyBkZW5zZSBhcyBwb3NzaWJsZS4gSWYgbmV3IG1ldGhvZHMvY2lwaGVycworICogZXRjIHdpbGwgYmUgYWRkZWQsIHRoZSBiaXRzIGEgbGlrZWx5IHRvIGNoYW5nZSwgc28gdGhpcyBpbmZvcm1hdGlvbgorICogaXMgZm9yIGludGVybmFsIGxpYnJhcnkgdXNlIG9ubHksIGV2ZW4gdGhvdWdoIFNTTF9DSVBIRVIuYWxnb3JpdGhtcworICogY2FuIGJlIHB1YmxpY2x5IGFjY2Vzc2VkLgorICogVXNlIHRoZSBhY2NvcmRpbmcgZnVuY3Rpb25zIGZvciBjaXBoZXIgbWFuYWdlbWVudCBpbnN0ZWFkLgorICoKKyAqIFRoZSBiaXQgbWFzayBoYW5kbGluZyBpbiB0aGUgc2VsZWN0aW9uIGFuZCBzb3J0aW5nIHNjaGVtZSBpbgorICogc3NsX2NyZWF0ZV9jaXBoZXJfbGlzdCgpIGhhcyBvbmx5IGxpbWl0ZWQgY2FwYWJpbGl0aWVzLCByZWZsZWN0aW5nCisgKiB0aGF0IHRoZSBkaWZmZXJlbnQgZW50aXRpZXMgd2l0aGluIGFyZSBtdXR1YWxseSBleGNsdXNpdmU6CisgKiBPTkxZIE9ORSBCSVQgUEVSIE1BU0sgQ0FOIEJFIFNFVCBBVCBBIFRJTUUuCisgKi8KKworLyogQml0cyBmb3IgYWxnb3JpdGhtX21rZXkgKGtleSBleGNoYW5nZSBhbGdvcml0aG0pICovCisjZGVmaW5lIFNTTF9rUlNBCQkweDAwMDAwMDAxTCAvKiBSU0Ega2V5IGV4Y2hhbmdlICovCisjZGVmaW5lIFNTTF9rREhyCQkweDAwMDAwMDAyTCAvKiBESCBjZXJ0LCBSU0EgQ0EgY2VydCAqLyAvKiBubyBzdWNoIGNpcGhlcnN1aXRlcyBzdXBwb3J0ZWQhICovCisjZGVmaW5lIFNTTF9rREhkCQkweDAwMDAwMDA0TCAvKiBESCBjZXJ0LCBEU0EgQ0EgY2VydCAqLyAvKiBubyBzdWNoIGNpcGhlcnN1aXRlIHN1cHBvcnRlZCEgKi8KKyNkZWZpbmUgU1NMX2tFREgJCTB4MDAwMDAwMDhMIC8qIHRtcCBESCBrZXkgbm8gREggY2VydCAqLworI2RlZmluZSBTU0xfa0tSQjUJCTB4MDAwMDAwMTBMIC8qIEtlcmJlcm9zNSBrZXkgZXhjaGFuZ2UgKi8KKyNkZWZpbmUgU1NMX2tFQ0RIcgkJMHgwMDAwMDAyMEwgLyogRUNESCBjZXJ0LCBSU0EgQ0EgY2VydCAqLworI2RlZmluZSBTU0xfa0VDREhlCQkweDAwMDAwMDQwTCAvKiBFQ0RIIGNlcnQsIEVDRFNBIENBIGNlcnQgKi8KKyNkZWZpbmUgU1NMX2tFRUNESAkJMHgwMDAwMDA4MEwgLyogZXBoZW1lcmFsIEVDREggKi8KKyNkZWZpbmUgU1NMX2tQU0sJCTB4MDAwMDAxMDBMIC8qIFBTSyAqLworI2RlZmluZSBTU0xfa0dPU1QgICAgICAgMHgwMDAwMDIwMEwgLyogR09TVCBrZXkgZXhjaGFuZ2UgKi8KKworLyogQml0cyBmb3IgYWxnb3JpdGhtX2F1dGggKHNlcnZlciBhdXRoZW50aWNhdGlvbikgKi8KKyNkZWZpbmUgU1NMX2FSU0EJCTB4MDAwMDAwMDFMIC8qIFJTQSBhdXRoICovCisjZGVmaW5lIFNTTF9hRFNTIAkJMHgwMDAwMDAwMkwgLyogRFNTIGF1dGggKi8KKyNkZWZpbmUgU1NMX2FOVUxMIAkJMHgwMDAwMDAwNEwgLyogbm8gYXV0aCAoaS5lLiB1c2UgQURIIG9yIEFFQ0RIKSAqLworI2RlZmluZSBTU0xfYURIIAkJMHgwMDAwMDAwOEwgLyogRml4ZWQgREggYXV0aCAoa0RIZCBvciBrREhyKSAqLyAvKiBubyBzdWNoIGNpcGhlcnN1aXRlcyBzdXBwb3J0ZWQhICovCisjZGVmaW5lIFNTTF9hRUNESCAJCTB4MDAwMDAwMTBMIC8qIEZpeGVkIEVDREggYXV0aCAoa0VDREhlIG9yIGtFQ0RIcikgKi8KKyNkZWZpbmUgU1NMX2FLUkI1ICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwgLyogS1JCNSBhdXRoICovCisjZGVmaW5lIFNTTF9hRUNEU0EgICAgICAgICAgICAgIDB4MDAwMDAwNDBMIC8qIEVDRFNBIGF1dGgqLworI2RlZmluZSBTU0xfYVBTSyAgICAgICAgICAgICAgICAweDAwMDAwMDgwTCAvKiBQU0sgYXV0aCAqLworI2RlZmluZSBTU0xfYUdPU1Q5NAkJCQkweDAwMDAwMTAwTCAvKiBHT1NUIFIgMzQuMTAtOTQgc2lnbmF0dXJlIGF1dGggKi8KKyNkZWZpbmUgU1NMX2FHT1NUMDEgCQkJMHgwMDAwMDIwMEwgLyogR09TVCBSIDM0LjEwLTIwMDEgc2lnbmF0dXJlIGF1dGggKi8KKworCisvKiBCaXRzIGZvciBhbGdvcml0aG1fZW5jIChzeW1tZXRyaWMgZW5jcnlwdGlvbikgKi8KKyNkZWZpbmUgU1NMX0RFUwkJCTB4MDAwMDAwMDFMCisjZGVmaW5lIFNTTF8zREVTCQkweDAwMDAwMDAyTAorI2RlZmluZSBTU0xfUkM0CQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgU1NMX1JDMgkJCTB4MDAwMDAwMDhMCisjZGVmaW5lIFNTTF9JREVBCQkweDAwMDAwMDEwTAorI2RlZmluZSBTU0xfZU5VTEwJCTB4MDAwMDAwMjBMCisjZGVmaW5lIFNTTF9BRVMxMjgJCTB4MDAwMDAwNDBMCisjZGVmaW5lIFNTTF9BRVMyNTYJCTB4MDAwMDAwODBMCisjZGVmaW5lIFNTTF9DQU1FTExJQTEyOAkJMHgwMDAwMDEwMEwKKyNkZWZpbmUgU1NMX0NBTUVMTElBMjU2CQkweDAwMDAwMjAwTAorI2RlZmluZSBTU0xfZUdPU1QyODE0Nzg5Q05UCTB4MDAwMDA0MDBMCisjZGVmaW5lIFNTTF9TRUVECQkweDAwMDAwODAwTAorCisjZGVmaW5lIFNTTF9BRVMgICAgICAgIAkJKFNTTF9BRVMxMjh8U1NMX0FFUzI1NikKKyNkZWZpbmUgU1NMX0NBTUVMTElBCQkoU1NMX0NBTUVMTElBMTI4fFNTTF9DQU1FTExJQTI1NikKKworCisvKiBCaXRzIGZvciBhbGdvcml0aG1fbWFjIChzeW1tZXRyaWMgYXV0aGVudGljYXRpb24pICovCisjZGVmaW5lIFNTTF9NRDUJCQkweDAwMDAwMDAxTAorI2RlZmluZSBTU0xfU0hBMQkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgU1NMX0dPU1Q5NCAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIFNTTF9HT1NUODlNQUMgICAweDAwMDAwMDA4TAorCisvKiBCaXRzIGZvciBhbGdvcml0aG1fc3NsIChwcm90b2NvbCB2ZXJzaW9uKSAqLworI2RlZmluZSBTU0xfU1NMVjIJCTB4MDAwMDAwMDFMCisjZGVmaW5lIFNTTF9TU0xWMwkJMHgwMDAwMDAwMkwKKyNkZWZpbmUgU1NMX1RMU1YxCQlTU0xfU1NMVjMJLyogZm9yIG5vdyAqLworCisKKy8qIEJpdHMgZm9yIGFsZ29yaXRobTIgKGhhbmRzaGFrZSBkaWdlc3RzIGFuZCBvdGhlciBleHRyYSBmbGFncykgKi8KKworI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19NRDUgMHgxMAorI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19TSEEgMHgyMAorI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19HT1NUOTQgMHg0MAorI2RlZmluZSBTU0xfSEFORFNIQUtFX01BQ19ERUZBVUxUIChTU0xfSEFORFNIQUtFX01BQ19NRDUgfCBTU0xfSEFORFNIQUtFX01BQ19TSEEpCisKKy8qIFdoZW4gYWRkaW5nIG5ldyBkaWdlc3QgaW4gdGhlIHNzbF9jaXBoLmMgYW5kIGluY3JlbWVudCBTU01fTURfTlVNX0lEWAorICogbWFrZSBzdXJlIHRvIHVwZGF0ZSB0aGlzIGNvbnN0YW50IHRvbyAqLworI2RlZmluZSBTU0xfTUFYX0RJR0VTVCA0CisKKyNkZWZpbmUgVExTMV9QUkZfREdTVF9TSElGVCA4CisjZGVmaW5lIFRMUzFfUFJGX01ENSAoU1NMX0hBTkRTSEFLRV9NQUNfTUQ1IDw8IFRMUzFfUFJGX0RHU1RfU0hJRlQpCisjZGVmaW5lIFRMUzFfUFJGX1NIQTEgKFNTTF9IQU5EU0hBS0VfTUFDX1NIQSA8PCBUTFMxX1BSRl9ER1NUX1NISUZUKQorI2RlZmluZSBUTFMxX1BSRl9HT1NUOTQgKFNTTF9IQU5EU0hBS0VfTUFDX0dPU1Q5NCA8PCBUTFMxX1BSRl9ER1NUX1NISUZUKQorI2RlZmluZSBUTFMxX1BSRiAoVExTMV9QUkZfTUQ1IHwgVExTMV9QUkZfU0hBMSkKKworLyogU3RyZWFtIE1BQyBmb3IgR09TVCBjaXBoZXJzdWl0ZXMgZnJvbSBjcnlwdG9wcm8gZHJhZnQKKyAqIChjdXJyZW50bHkgdGhpcyBhbHNvIGdvZXMgaW50byBhbGdvcml0aG0yKSAqLworI2RlZmluZSBUTFMxX1NUUkVBTV9NQUMgMHgwNAorCisKKworLyoKKyAqIEV4cG9ydCBhbmQgY2lwaGVyIHN0cmVuZ3RoIGluZm9ybWF0aW9uLiBGb3IgZWFjaCBjaXBoZXIgd2UgaGF2ZSB0byBkZWNpZGUKKyAqIHdoZXRoZXIgaXQgaXMgZXhwb3J0YWJsZSBvciBub3QuIFRoaXMgaW5mb3JtYXRpb24gaXMgbGlrZWx5IHRvIGNoYW5nZQorICogb3ZlciB0aW1lLCBzaW5jZSB0aGUgZXhwb3J0IGNvbnRyb2wgcnVsZXMgYXJlIG5vIHN0YXRpYyB0ZWNobmljYWwgaXNzdWUuCisgKgorICogSW5kZXBlbmRlbnQgb2YgdGhlIGV4cG9ydCBmbGFnIHRoZSBjaXBoZXIgc3RyZW5ndGggaXMgc29ydGVkIGludG8gY2xhc3Nlcy4KKyAqIFNTTF9FWFA0MCB3YXMgZGVub3RpbmcgdGhlIDQwYml0IFVTIGV4cG9ydCBsaW1pdCBvZiBwYXN0IHRpbWVzLCB3aGljaCBub3cKKyAqIGlzIGF0IDU2Yml0IChTU0xfRVhQNTYpLiBJZiB0aGUgZXhwb3J0YWJsZSBjaXBoZXIgY2xhc3MgaXMgZ29pbmcgdG8gY2hhbmdlCisgKiBhZ2FpbiAoZWcuIHRvIDY0Yml0KSB0aGUgdXNlIG9mICJTU0xfRVhQKiIgYmVjb21lcyBibHVycmVkIGV2ZW4gbW9yZSwKKyAqIHNpbmNlIFNTTF9FWFA2NCBjb3VsZCBiZSBzaW1pbGFyIHRvIFNTTF9MT1cuCisgKiBGb3IgdGhpcyByZWFzb24gU1NMX01JQ1JPIGFuZCBTU0xfTUlOSSBtYWNyb3MgYXJlIGluY2x1ZGVkIHRvIHdpZGVuIHRoZQorICogbmFtZXNwYWNlIG9mIFNTTF9MT1ctU1NMX0hJR0ggdG8gbG93ZXIgdmFsdWVzLiBBcyBkZXZlbG9wbWVudCBvZiBzcGVlZAorICogYW5kIGNpcGhlcnMgZ29lcywgYW5vdGhlciBleHRlbnNpb24gdG8gU1NMX1NVUEVSIGFuZC9vciBTU0xfVUxUUkEgd291bGQKKyAqIGJlIHBvc3NpYmxlLgorICovCisjZGVmaW5lIFNTTF9FWFBfTUFTSwkJMHgwMDAwMDAwM0wKKyNkZWZpbmUgU1NMX1NUUk9OR19NQVNLCQkweDAwMDAwMWZjTAorCisjZGVmaW5lIFNTTF9OT1RfRVhQCQkweDAwMDAwMDAxTAorI2RlZmluZSBTU0xfRVhQT1JUCQkweDAwMDAwMDAyTAorCisjZGVmaW5lIFNTTF9TVFJPTkdfTk9ORQkJMHgwMDAwMDAwNEwKKyNkZWZpbmUgU1NMX0VYUDQwCQkweDAwMDAwMDA4TAorI2RlZmluZSBTU0xfTUlDUk8JCShTU0xfRVhQNDApCisjZGVmaW5lIFNTTF9FWFA1NgkJMHgwMDAwMDAxMEwKKyNkZWZpbmUgU1NMX01JTkkJCShTU0xfRVhQNTYpCisjZGVmaW5lIFNTTF9MT1cJCQkweDAwMDAwMDIwTAorI2RlZmluZSBTU0xfTUVESVVNCQkweDAwMDAwMDQwTAorI2RlZmluZSBTU0xfSElHSAkJMHgwMDAwMDA4MEwKKyNkZWZpbmUgU1NMX0ZJUFMJCTB4MDAwMDAxMDBMCisKKy8qIHdlIGhhdmUgdXNlZCAwMDAwMDFmZiAtIDIzIGJpdHMgbGVmdCB0byBnbyAqLworCisvKgorICogTWFjcm9zIHRvIGNoZWNrIHRoZSBleHBvcnQgc3RhdHVzIGFuZCBjaXBoZXIgc3RyZW5ndGggZm9yIGV4cG9ydCBjaXBoZXJzLgorICogRXZlbiB0aG91Z2ggdGhlIG1hY3JvcyBmb3IgRVhQT1JUIGFuZCBFWFBPUlQ0MC81NiBoYXZlIHNpbWlsYXIgbmFtZXMsCisgKiB0aGVpciBtZWFuaW5nIGlzIGRpZmZlcmVudDoKKyAqICpfRVhQT1JUIG1hY3JvcyBjaGVjayB0aGUgJ2V4cG9ydGFibGUnIHN0YXR1cy4KKyAqICpfRVhQT1JUNDAvNTYgbWFjcm9zIGFyZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBjZXJ0YWluIGNpcGhlciBzdHJlbmd0aAorICogICAgICAgICAgaXMgZ2l2ZW4uCisgKiBTaW5jZSB0aGUgU1NMX0lTX0VYUE9SVCogYW5kIFNTTF9FWFBPUlQqIG1hY3JvcyBkZXBlbmQgb24gdGhlIGNvcnJlY3QKKyAqIGFsZ29yaXRobSBzdHJ1Y3R1cmUgZWxlbWVudCB0byBiZSBwYXNzZWQgKGFsZ29yaXRobXMsIGFsZ29fc3RyZW5ndGgpIGFuZCBubworICogdHlwZWNoZWNraW5nIGNhbiBiZSBkb25lIGFzIHRoZXkgYXJlIGFsbCBvZiB0eXBlIHVuc2lnbmVkIGxvbmcsIHRoZWlyCisgKiBkaXJlY3QgdXNhZ2UgaXMgZGlzY291cmFnZWQuCisgKiBVc2UgdGhlIFNTTF9DXyogbWFjcm9zIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgU1NMX0lTX0VYUE9SVChhKQkoKGEpJlNTTF9FWFBPUlQpCisjZGVmaW5lIFNTTF9JU19FWFBPUlQ1NihhKQkoKGEpJlNTTF9FWFA1NikKKyNkZWZpbmUgU1NMX0lTX0VYUE9SVDQwKGEpCSgoYSkmU1NMX0VYUDQwKQorI2RlZmluZSBTU0xfQ19JU19FWFBPUlQoYykJU1NMX0lTX0VYUE9SVCgoYyktPmFsZ29fc3RyZW5ndGgpCisjZGVmaW5lIFNTTF9DX0lTX0VYUE9SVDU2KGMpCVNTTF9JU19FWFBPUlQ1NigoYyktPmFsZ29fc3RyZW5ndGgpCisjZGVmaW5lIFNTTF9DX0lTX0VYUE9SVDQwKGMpCVNTTF9JU19FWFBPUlQ0MCgoYyktPmFsZ29fc3RyZW5ndGgpCisKKyNkZWZpbmUgU1NMX0VYUE9SVF9LRVlMRU5HVEgoYSxzKQkoU1NMX0lTX0VYUE9SVDQwKHMpID8gNSA6IFwKKwkJCQkgKGEpID09IFNTTF9ERVMgPyA4IDogNykKKyNkZWZpbmUgU1NMX0VYUE9SVF9QS0VZTEVOR1RIKGEpIChTU0xfSVNfRVhQT1JUNDAoYSkgPyA1MTIgOiAxMDI0KQorI2RlZmluZSBTU0xfQ19FWFBPUlRfS0VZTEVOR1RIKGMpCVNTTF9FWFBPUlRfS0VZTEVOR1RIKChjKS0+YWxnb3JpdGhtX2VuYywgXAorCQkJCShjKS0+YWxnb19zdHJlbmd0aCkKKyNkZWZpbmUgU1NMX0NfRVhQT1JUX1BLRVlMRU5HVEgoYykJU1NMX0VYUE9SVF9QS0VZTEVOR1RIKChjKS0+YWxnb19zdHJlbmd0aCkKKworCisKKworLyogTW9zdGx5IGZvciBTU0x2MyAqLworI2RlZmluZSBTU0xfUEtFWV9SU0FfRU5DCTAKKyNkZWZpbmUgU1NMX1BLRVlfUlNBX1NJR04JMQorI2RlZmluZSBTU0xfUEtFWV9EU0FfU0lHTgkyCisjZGVmaW5lIFNTTF9QS0VZX0RIX1JTQQkJMworI2RlZmluZSBTU0xfUEtFWV9ESF9EU0EJCTQKKyNkZWZpbmUgU1NMX1BLRVlfRUNDICAgICAgICAgICAgNQorI2RlZmluZSBTU0xfUEtFWV9HT1NUOTQJCTYKKyNkZWZpbmUgU1NMX1BLRVlfR09TVDAxCQk3CisjZGVmaW5lIFNTTF9QS0VZX05VTQkJOAorCisvKiBTU0xfa1JTQSA8LSBSU0FfRU5DIHwgKFJTQV9UTVAgJiBSU0FfU0lHTikgfAorICogCSAgICA8LSAoRVhQT1JUICYgKFJTQV9FTkMgfCBSU0FfVE1QKSAmIFJTQV9TSUdOKQorICogU1NMX2tESCAgPC0gREhfRU5DICYgKFJTQV9FTkMgfCBSU0FfU0lHTiB8IERTQV9TSUdOKQorICogU1NMX2tFREggPC0gUlNBX0VOQyB8IFJTQV9TSUdOIHwgRFNBX1NJR04KKyAqIFNTTF9hUlNBIDwtIFJTQV9FTkMgfCBSU0FfU0lHTgorICogU1NMX2FEU1MgPC0gRFNBX1NJR04KKyAqLworCisvKgorI2RlZmluZSBDRVJUX0lOVkFMSUQJCTAKKyNkZWZpbmUgQ0VSVF9QVUJMSUNfS0VZCQkxCisjZGVmaW5lIENFUlRfUFJJVkFURV9LRVkJMgorKi8KKworI2lmbmRlZiBPUEVOU1NMX05PX0VDCisvKiBGcm9tIEVDQy1UTFMgZHJhZnQsIHVzZWQgaW4gZW5jb2RpbmcgdGhlIGN1cnZlIHR5cGUgaW4gCisgKiBFQ1BhcmFtZXRlcnMKKyAqLworI2RlZmluZSBFWFBMSUNJVF9QUklNRV9DVVJWRV9UWVBFICAxICAgCisjZGVmaW5lIEVYUExJQ0lUX0NIQVIyX0NVUlZFX1RZUEUgIDIKKyNkZWZpbmUgTkFNRURfQ1VSVkVfVFlQRSAgICAgICAgICAgMworI2VuZGlmICAvKiBPUEVOU1NMX05PX0VDICovCisKK3R5cGVkZWYgc3RydWN0IGNlcnRfcGtleV9zdAorCXsKKwlYNTA5ICp4NTA5OworCVNUQUNLX09GKFg1MDkpICpjZXJ0X2NoYWluOworCUVWUF9QS0VZICpwcml2YXRla2V5OworCX0gQ0VSVF9QS0VZOworCit0eXBlZGVmIHN0cnVjdCBjZXJ0X3N0CisJeworCS8qIEN1cnJlbnQgYWN0aXZlIHNldCAqLworCUNFUlRfUEtFWSAqa2V5OyAvKiBBTFdBWVMgcG9pbnRzIHRvIGFuIGVsZW1lbnQgb2YgdGhlIHBrZXlzIGFycmF5CisJCQkgKiBQcm9iYWJseSBpdCB3b3VsZCBtYWtlIG1vcmUgc2Vuc2UgdG8gc3RvcmUKKwkJCSAqIGFuIGluZGV4LCBub3QgYSBwb2ludGVyLiAqLworIAorCS8qIFRoZSBmb2xsb3dpbmcgbWFza3MgYXJlIGZvciB0aGUga2V5IGFuZCBhdXRoCisJICogYWxnb3JpdGhtcyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGNlcnRzIGJlbG93ICovCisJaW50IHZhbGlkOworCXVuc2lnbmVkIGxvbmcgbWFza19rOworCXVuc2lnbmVkIGxvbmcgbWFza19hOworCXVuc2lnbmVkIGxvbmcgZXhwb3J0X21hc2tfazsKKwl1bnNpZ25lZCBsb25nIGV4cG9ydF9tYXNrX2E7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJUlNBICpyc2FfdG1wOworCVJTQSAqKCpyc2FfdG1wX2NiKShTU0wgKnNzbCxpbnQgaXNfZXhwb3J0LGludCBrZXlzaXplKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RICisJREggKmRoX3RtcDsKKwlESCAqKCpkaF90bXBfY2IpKFNTTCAqc3NsLGludCBpc19leHBvcnQsaW50IGtleXNpemUpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCUVDX0tFWSAqZWNkaF90bXA7CisJLyogQ2FsbGJhY2sgZm9yIGdlbmVyYXRpbmcgZXBoZW1lcmFsIEVDREgga2V5cyAqLworCUVDX0tFWSAqKCplY2RoX3RtcF9jYikoU1NMICpzc2wsaW50IGlzX2V4cG9ydCxpbnQga2V5c2l6ZSk7CisjZW5kaWYKKworCUNFUlRfUEtFWSBwa2V5c1tTU0xfUEtFWV9OVU1dOworCisJaW50IHJlZmVyZW5jZXM7IC8qID4xIG9ubHkgaWYgU1NMX2NvcHlfc2Vzc2lvbl9pZCBpcyB1c2VkICovCisJfSBDRVJUOworCisKK3R5cGVkZWYgc3RydWN0IHNlc3NfY2VydF9zdAorCXsKKwlTVEFDS19PRihYNTA5KSAqY2VydF9jaGFpbjsgLyogYXMgcmVjZWl2ZWQgZnJvbSBwZWVyIChub3QgZm9yIFNTTDIpICovCisKKwkvKiBUaGUgJ3BlZXJfLi4uJyBtZW1iZXJzIGFyZSB1c2VkIG9ubHkgYnkgY2xpZW50cy4gKi8KKwlpbnQgcGVlcl9jZXJ0X3R5cGU7CisKKwlDRVJUX1BLRVkgKnBlZXJfa2V5OyAvKiBwb2ludHMgdG8gYW4gZWxlbWVudCBvZiBwZWVyX3BrZXlzIChuZXZlciBOVUxMISkgKi8KKwlDRVJUX1BLRVkgcGVlcl9wa2V5c1tTU0xfUEtFWV9OVU1dOworCS8qIE9idmlvdXNseSB3ZSBkb24ndCBoYXZlIHRoZSBwcml2YXRlIGtleXMgb2YgdGhlc2UsCisJICogc28gbWF5YmUgd2Ugc2hvdWxkbid0IGV2ZW4gdXNlIHRoZSBDRVJUX1BLRVkgdHlwZSBoZXJlLiAqLworCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJUlNBICpwZWVyX3JzYV90bXA7IC8qIG5vdCB1c2VkIGZvciBTU0wgMiAqLworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwlESCAqcGVlcl9kaF90bXA7IC8qIG5vdCB1c2VkIGZvciBTU0wgMiAqLworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCUVDX0tFWSAqcGVlcl9lY2RoX3RtcDsKKyNlbmRpZgorCisJaW50IHJlZmVyZW5jZXM7IC8qIGFjdHVhbGx5IGFsd2F5cyAxIGF0IHRoZSBtb21lbnQgKi8KKwl9IFNFU1NfQ0VSVDsKKworCisvKiNkZWZpbmUgTUFDX0RFQlVHCSovCisKKy8qI2RlZmluZSBFUlJfREVCVUcJKi8KKy8qI2RlZmluZSBBQk9SVF9ERUJVRwkqLworLyojZGVmaW5lIFBLVF9ERUJVRyAxICAgKi8KKy8qI2RlZmluZSBERVNfREVCVUcJKi8KKy8qI2RlZmluZSBERVNfT0ZCX0RFQlVHCSovCisvKiNkZWZpbmUgU1NMX0RFQlVHCSovCisvKiNkZWZpbmUgUlNBX0RFQlVHCSovIAorLyojZGVmaW5lIElERUFfREVCVUcJKi8gCisKKyNkZWZpbmUgRlBfSUNDICAoaW50ICgqKShjb25zdCB2b2lkICosY29uc3Qgdm9pZCAqKSkKKyNkZWZpbmUgc3NsX3B1dF9jaXBoZXJfYnlfY2hhcihzc2wsY2lwaCxwdHIpIFwKKwkJKChzc2wpLT5tZXRob2QtPnB1dF9jaXBoZXJfYnlfY2hhcigoY2lwaCksKHB0cikpKQorI2RlZmluZSBzc2xfZ2V0X2NpcGhlcl9ieV9jaGFyKHNzbCxwdHIpIFwKKwkJKChzc2wpLT5tZXRob2QtPmdldF9jaXBoZXJfYnlfY2hhcihwdHIpKQorCisvKiBUaGlzIGlzIGZvciB0aGUgU1NMdjMvVExTdjEuMCBkaWZmZXJlbmNlcyBpbiBjcnlwdG8vaGFzaCBzdHVmZgorICogSXQgaXMgYSBiaXQgb2YgYSBtZXNzIG9mIGZ1bmN0aW9ucywgYnV0IGhlbGwsIHRoaW5rIG9mIGl0IGFzCisgKiBhbiBvcGFxdWUgc3RydWN0dXJlIDotKSAqLwordHlwZWRlZiBzdHJ1Y3Qgc3NsM19lbmNfbWV0aG9kCisJeworCWludCAoKmVuYykoU1NMICosIGludCk7CisJaW50ICgqbWFjKShTU0wgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOworCWludCAoKnNldHVwX2tleV9ibG9jaykoU1NMICopOworCWludCAoKmdlbmVyYXRlX21hc3Rlcl9zZWNyZXQpKFNTTCAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50KTsKKwlpbnQgKCpjaGFuZ2VfY2lwaGVyX3N0YXRlKShTU0wgKiwgaW50KTsKKwlpbnQgKCpmaW5hbF9maW5pc2hfbWFjKShTU0wgKiwgIGNvbnN0IGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyICopOworCWludCBmaW5pc2hfbWFjX2xlbmd0aDsKKwlpbnQgKCpjZXJ0X3ZlcmlmeV9tYWMpKFNTTCAqLCBpbnQsIHVuc2lnbmVkIGNoYXIgKik7CisJY29uc3QgY2hhciAqY2xpZW50X2ZpbmlzaGVkX2xhYmVsOworCWludCBjbGllbnRfZmluaXNoZWRfbGFiZWxfbGVuOworCWNvbnN0IGNoYXIgKnNlcnZlcl9maW5pc2hlZF9sYWJlbDsKKwlpbnQgc2VydmVyX2ZpbmlzaGVkX2xhYmVsX2xlbjsKKwlpbnQgKCphbGVydF92YWx1ZSkoaW50KTsKKwl9IFNTTDNfRU5DX01FVEhPRDsKKworI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKy8qIFVzZWQgZm9yIGhvbGRpbmcgdGhlIHJlbGV2YW50IGNvbXByZXNzaW9uIG1ldGhvZHMgbG9hZGVkIGludG8gU1NMX0NUWCAqLwordHlwZWRlZiBzdHJ1Y3Qgc3NsM19jb21wX3N0CisJeworCWludCBjb21wX2lkOwkvKiBUaGUgaWRlbnRpZmllciBieXRlIGZvciB0aGlzIGNvbXByZXNzaW9uIHR5cGUgKi8KKwljaGFyICpuYW1lOwkvKiBUZXh0IG5hbWUgdXNlZCBmb3IgdGhlIGNvbXByZXNzaW9uIHR5cGUgKi8KKwlDT01QX01FVEhPRCAqbWV0aG9kOyAvKiBUaGUgbWV0aG9kIDotKSAqLworCX0gU1NMM19DT01QOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19CVUZfRlJFRUxJU1RTCit0eXBlZGVmIHN0cnVjdCBzc2wzX2J1Zl9mcmVlbGlzdF9zdAorCXsKKwlzaXplX3QgY2h1bmtsZW47CisJdW5zaWduZWQgaW50IGxlbjsKKwlzdHJ1Y3Qgc3NsM19idWZfZnJlZWxpc3RfZW50cnlfc3QgKmhlYWQ7CisJfSBTU0wzX0JVRl9GUkVFTElTVDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3NsM19idWZfZnJlZWxpc3RfZW50cnlfc3QKKwl7CisJc3RydWN0IHNzbDNfYnVmX2ZyZWVsaXN0X2VudHJ5X3N0ICpuZXh0OworCX0gU1NMM19CVUZfRlJFRUxJU1RfRU5UUlk7CisjZW5kaWYKKworZXh0ZXJuIFNTTDNfRU5DX01FVEhPRCBzc2wzX3VuZGVmX2VuY19tZXRob2Q7CitPUEVOU1NMX0VYVEVSTiBjb25zdCBTU0xfQ0lQSEVSIHNzbDJfY2lwaGVyc1tdOworT1BFTlNTTF9FWFRFUk4gU1NMX0NJUEhFUiBzc2wzX2NpcGhlcnNbXTsKKworCitTU0xfTUVUSE9EICpzc2xfYmFkX21ldGhvZChpbnQgdmVyKTsKKworZXh0ZXJuIFNTTDNfRU5DX01FVEhPRCBUTFN2MV9lbmNfZGF0YTsKK2V4dGVybiBTU0wzX0VOQ19NRVRIT0QgU1NMdjNfZW5jX2RhdGE7CitleHRlcm4gU1NMM19FTkNfTUVUSE9EIERUTFN2MV9lbmNfZGF0YTsKKworI2RlZmluZSBJTVBMRU1FTlRfdGxzMV9tZXRoX2Z1bmMoZnVuY19uYW1lLCBzX2FjY2VwdCwgc19jb25uZWN0LCBzX2dldF9tZXRoKSBcCitjb25zdCBTU0xfTUVUSE9EICpmdW5jX25hbWUodm9pZCkgIFwKKwl7IFwKKwlzdGF0aWMgY29uc3QgU1NMX01FVEhPRCBmdW5jX25hbWUjI19kYXRhPSB7IFwKKwkJVExTMV9WRVJTSU9OLCBcCisJCXRsczFfbmV3LCBcCisJCXRsczFfY2xlYXIsIFwKKwkJdGxzMV9mcmVlLCBcCisJCXNfYWNjZXB0LCBcCisJCXNfY29ubmVjdCwgXAorCQlzc2wzX3JlYWQsIFwKKwkJc3NsM19wZWVrLCBcCisJCXNzbDNfd3JpdGUsIFwKKwkJc3NsM19zaHV0ZG93biwgXAorCQlzc2wzX3JlbmVnb3RpYXRlLCBcCisJCXNzbDNfcmVuZWdvdGlhdGVfY2hlY2ssIFwKKwkJc3NsM19nZXRfbWVzc2FnZSwgXAorCQlzc2wzX3JlYWRfYnl0ZXMsIFwKKwkJc3NsM193cml0ZV9ieXRlcywgXAorCQlzc2wzX2Rpc3BhdGNoX2FsZXJ0LCBcCisJCXNzbDNfY3RybCwgXAorCQlzc2wzX2N0eF9jdHJsLCBcCisJCXNzbDNfZ2V0X2NpcGhlcl9ieV9jaGFyLCBcCisJCXNzbDNfcHV0X2NpcGhlcl9ieV9jaGFyLCBcCisJCXNzbDNfcGVuZGluZywgXAorCQlzc2wzX251bV9jaXBoZXJzLCBcCisJCXNzbDNfZ2V0X2NpcGhlciwgXAorCQlzX2dldF9tZXRoLCBcCisJCXRsczFfZGVmYXVsdF90aW1lb3V0LCBcCisJCSZUTFN2MV9lbmNfZGF0YSwgXAorCQlzc2xfdW5kZWZpbmVkX3ZvaWRfZnVuY3Rpb24sIFwKKwkJc3NsM19jYWxsYmFja19jdHJsLCBcCisJCXNzbDNfY3R4X2NhbGxiYWNrX2N0cmwsIFwKKwl9OyBcCisJcmV0dXJuICZmdW5jX25hbWUjI19kYXRhOyBcCisJfQorCisjZGVmaW5lIElNUExFTUVOVF9zc2wzX21ldGhfZnVuYyhmdW5jX25hbWUsIHNfYWNjZXB0LCBzX2Nvbm5lY3QsIHNfZ2V0X21ldGgpIFwKK2NvbnN0IFNTTF9NRVRIT0QgKmZ1bmNfbmFtZSh2b2lkKSAgXAorCXsgXAorCXN0YXRpYyBjb25zdCBTU0xfTUVUSE9EIGZ1bmNfbmFtZSMjX2RhdGE9IHsgXAorCQlTU0wzX1ZFUlNJT04sIFwKKwkJc3NsM19uZXcsIFwKKwkJc3NsM19jbGVhciwgXAorCQlzc2wzX2ZyZWUsIFwKKwkJc19hY2NlcHQsIFwKKwkJc19jb25uZWN0LCBcCisJCXNzbDNfcmVhZCwgXAorCQlzc2wzX3BlZWssIFwKKwkJc3NsM193cml0ZSwgXAorCQlzc2wzX3NodXRkb3duLCBcCisJCXNzbDNfcmVuZWdvdGlhdGUsIFwKKwkJc3NsM19yZW5lZ290aWF0ZV9jaGVjaywgXAorCQlzc2wzX2dldF9tZXNzYWdlLCBcCisJCXNzbDNfcmVhZF9ieXRlcywgXAorCQlzc2wzX3dyaXRlX2J5dGVzLCBcCisJCXNzbDNfZGlzcGF0Y2hfYWxlcnQsIFwKKwkJc3NsM19jdHJsLCBcCisJCXNzbDNfY3R4X2N0cmwsIFwKKwkJc3NsM19nZXRfY2lwaGVyX2J5X2NoYXIsIFwKKwkJc3NsM19wdXRfY2lwaGVyX2J5X2NoYXIsIFwKKwkJc3NsM19wZW5kaW5nLCBcCisJCXNzbDNfbnVtX2NpcGhlcnMsIFwKKwkJc3NsM19nZXRfY2lwaGVyLCBcCisJCXNfZ2V0X21ldGgsIFwKKwkJc3NsM19kZWZhdWx0X3RpbWVvdXQsIFwKKwkJJlNTTHYzX2VuY19kYXRhLCBcCisJCXNzbF91bmRlZmluZWRfdm9pZF9mdW5jdGlvbiwgXAorCQlzc2wzX2NhbGxiYWNrX2N0cmwsIFwKKwkJc3NsM19jdHhfY2FsbGJhY2tfY3RybCwgXAorCX07IFwKKwlyZXR1cm4gJmZ1bmNfbmFtZSMjX2RhdGE7IFwKKwl9CisKKyNkZWZpbmUgSU1QTEVNRU5UX3NzbDIzX21ldGhfZnVuYyhmdW5jX25hbWUsIHNfYWNjZXB0LCBzX2Nvbm5lY3QsIHNfZ2V0X21ldGgpIFwKK2NvbnN0IFNTTF9NRVRIT0QgKmZ1bmNfbmFtZSh2b2lkKSAgXAorCXsgXAorCXN0YXRpYyBjb25zdCBTU0xfTUVUSE9EIGZ1bmNfbmFtZSMjX2RhdGE9IHsgXAorCVRMUzFfVkVSU0lPTiwgXAorCXRsczFfbmV3LCBcCisJdGxzMV9jbGVhciwgXAorCXRsczFfZnJlZSwgXAorCXNfYWNjZXB0LCBcCisJc19jb25uZWN0LCBcCisJc3NsMjNfcmVhZCwgXAorCXNzbDIzX3BlZWssIFwKKwlzc2wyM193cml0ZSwgXAorCXNzbF91bmRlZmluZWRfZnVuY3Rpb24sIFwKKwlzc2xfdW5kZWZpbmVkX2Z1bmN0aW9uLCBcCisJc3NsX29rLCBcCisJc3NsM19nZXRfbWVzc2FnZSwgXAorCXNzbDNfcmVhZF9ieXRlcywgXAorCXNzbDNfd3JpdGVfYnl0ZXMsIFwKKwlzc2wzX2Rpc3BhdGNoX2FsZXJ0LCBcCisJc3NsM19jdHJsLCBcCisJc3NsM19jdHhfY3RybCwgXAorCXNzbDIzX2dldF9jaXBoZXJfYnlfY2hhciwgXAorCXNzbDIzX3B1dF9jaXBoZXJfYnlfY2hhciwgXAorCXNzbF91bmRlZmluZWRfY29uc3RfZnVuY3Rpb24sIFwKKwlzc2wyM19udW1fY2lwaGVycywgXAorCXNzbDIzX2dldF9jaXBoZXIsIFwKKwlzX2dldF9tZXRoLCBcCisJc3NsMjNfZGVmYXVsdF90aW1lb3V0LCBcCisJJnNzbDNfdW5kZWZfZW5jX21ldGhvZCwgXAorCXNzbF91bmRlZmluZWRfdm9pZF9mdW5jdGlvbiwgXAorCXNzbDNfY2FsbGJhY2tfY3RybCwgXAorCXNzbDNfY3R4X2NhbGxiYWNrX2N0cmwsIFwKKwl9OyBcCisJcmV0dXJuICZmdW5jX25hbWUjI19kYXRhOyBcCisJfQorCisjZGVmaW5lIElNUExFTUVOVF9zc2wyX21ldGhfZnVuYyhmdW5jX25hbWUsIHNfYWNjZXB0LCBzX2Nvbm5lY3QsIHNfZ2V0X21ldGgpIFwKK2NvbnN0IFNTTF9NRVRIT0QgKmZ1bmNfbmFtZSh2b2lkKSAgXAorCXsgXAorCXN0YXRpYyBjb25zdCBTU0xfTUVUSE9EIGZ1bmNfbmFtZSMjX2RhdGE9IHsgXAorCQlTU0wyX1ZFUlNJT04sIFwKKwkJc3NsMl9uZXcsCS8qIGxvY2FsICovIFwKKwkJc3NsMl9jbGVhciwJLyogbG9jYWwgKi8gXAorCQlzc2wyX2ZyZWUsCS8qIGxvY2FsICovIFwKKwkJc19hY2NlcHQsIFwKKwkJc19jb25uZWN0LCBcCisJCXNzbDJfcmVhZCwgXAorCQlzc2wyX3BlZWssIFwKKwkJc3NsMl93cml0ZSwgXAorCQlzc2wyX3NodXRkb3duLCBcCisJCXNzbF9vaywJLyogTlVMTCAtIHJlbmVnb3RpYXRlICovIFwKKwkJc3NsX29rLAkvKiBOVUxMIC0gY2hlY2sgcmVuZWdvdGlhdGUgKi8gXAorCQlOVUxMLCAvKiBOVUxMIC0gc3NsX2dldF9tZXNzYWdlICovIFwKKwkJTlVMTCwgLyogTlVMTCAtIHNzbF9nZXRfcmVjb3JkICovIFwKKwkJTlVMTCwgLyogTlVMTCAtIHNzbF93cml0ZV9ieXRlcyAqLyBcCisJCU5VTEwsIC8qIE5VTEwgLSBkaXNwYXRjaF9hbGVydCAqLyBcCisJCXNzbDJfY3RybCwJLyogbG9jYWwgKi8gXAorCQlzc2wyX2N0eF9jdHJsLAkvKiBsb2NhbCAqLyBcCisJCXNzbDJfZ2V0X2NpcGhlcl9ieV9jaGFyLCBcCisJCXNzbDJfcHV0X2NpcGhlcl9ieV9jaGFyLCBcCisJCXNzbDJfcGVuZGluZywgXAorCQlzc2wyX251bV9jaXBoZXJzLCBcCisJCXNzbDJfZ2V0X2NpcGhlciwgXAorCQlzX2dldF9tZXRoLCBcCisJCXNzbDJfZGVmYXVsdF90aW1lb3V0LCBcCisJCSZzc2wzX3VuZGVmX2VuY19tZXRob2QsIFwKKwkJc3NsX3VuZGVmaW5lZF92b2lkX2Z1bmN0aW9uLCBcCisJCXNzbDJfY2FsbGJhY2tfY3RybCwJLyogbG9jYWwgKi8gXAorCQlzc2wyX2N0eF9jYWxsYmFja19jdHJsLAkvKiBsb2NhbCAqLyBcCisJfTsgXAorCXJldHVybiAmZnVuY19uYW1lIyNfZGF0YTsgXAorCX0KKworI2RlZmluZSBJTVBMRU1FTlRfZHRsczFfbWV0aF9mdW5jKGZ1bmNfbmFtZSwgc19hY2NlcHQsIHNfY29ubmVjdCwgc19nZXRfbWV0aCkgXAorY29uc3QgU1NMX01FVEhPRCAqZnVuY19uYW1lKHZvaWQpICBcCisJeyBcCisJc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgZnVuY19uYW1lIyNfZGF0YT0geyBcCisJCURUTFMxX1ZFUlNJT04sIFwKKwkJZHRsczFfbmV3LCBcCisJCWR0bHMxX2NsZWFyLCBcCisJCWR0bHMxX2ZyZWUsIFwKKwkJc19hY2NlcHQsIFwKKwkJc19jb25uZWN0LCBcCisJCXNzbDNfcmVhZCwgXAorCQlzc2wzX3BlZWssIFwKKwkJc3NsM193cml0ZSwgXAorCQlzc2wzX3NodXRkb3duLCBcCisJCXNzbDNfcmVuZWdvdGlhdGUsIFwKKwkJc3NsM19yZW5lZ290aWF0ZV9jaGVjaywgXAorCQlkdGxzMV9nZXRfbWVzc2FnZSwgXAorCQlkdGxzMV9yZWFkX2J5dGVzLCBcCisJCWR0bHMxX3dyaXRlX2FwcF9kYXRhX2J5dGVzLCBcCisJCWR0bHMxX2Rpc3BhdGNoX2FsZXJ0LCBcCisJCWR0bHMxX2N0cmwsIFwKKwkJc3NsM19jdHhfY3RybCwgXAorCQlzc2wzX2dldF9jaXBoZXJfYnlfY2hhciwgXAorCQlzc2wzX3B1dF9jaXBoZXJfYnlfY2hhciwgXAorCQlzc2wzX3BlbmRpbmcsIFwKKwkJc3NsM19udW1fY2lwaGVycywgXAorCQlkdGxzMV9nZXRfY2lwaGVyLCBcCisJCXNfZ2V0X21ldGgsIFwKKwkJZHRsczFfZGVmYXVsdF90aW1lb3V0LCBcCisJCSZEVExTdjFfZW5jX2RhdGEsIFwKKwkJc3NsX3VuZGVmaW5lZF92b2lkX2Z1bmN0aW9uLCBcCisJCXNzbDNfY2FsbGJhY2tfY3RybCwgXAorCQlzc2wzX2N0eF9jYWxsYmFja19jdHJsLCBcCisJfTsgXAorCXJldHVybiAmZnVuY19uYW1lIyNfZGF0YTsgXAorCX0KKwordm9pZCBzc2xfY2xlYXJfY2lwaGVyX2N0eChTU0wgKnMpOworaW50IHNzbF9jbGVhcl9iYWRfc2Vzc2lvbihTU0wgKnMpOworQ0VSVCAqc3NsX2NlcnRfbmV3KHZvaWQpOworQ0VSVCAqc3NsX2NlcnRfZHVwKENFUlQgKmNlcnQpOworaW50IHNzbF9jZXJ0X2luc3QoQ0VSVCAqKm8pOwordm9pZCBzc2xfY2VydF9mcmVlKENFUlQgKmMpOworU0VTU19DRVJUICpzc2xfc2Vzc19jZXJ0X25ldyh2b2lkKTsKK3ZvaWQgc3NsX3Nlc3NfY2VydF9mcmVlKFNFU1NfQ0VSVCAqc2MpOworaW50IHNzbF9zZXRfcGVlcl9jZXJ0X3R5cGUoU0VTU19DRVJUICpjLCBpbnQgdHlwZSk7CitpbnQgc3NsX2dldF9uZXdfc2Vzc2lvbihTU0wgKnMsIGludCBzZXNzaW9uKTsKK2ludCBzc2xfZ2V0X3ByZXZfc2Vzc2lvbihTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKnNlc3Npb24saW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqbGltaXQpOworaW50IHNzbF9jaXBoZXJfaWRfY21wKGNvbnN0IFNTTF9DSVBIRVIgKmEsY29uc3QgU1NMX0NJUEhFUiAqYik7CitERUNMQVJFX09CSl9CU0VBUkNIX0dMT0JBTF9DTVBfRk4oU1NMX0NJUEhFUiwgU1NMX0NJUEhFUiwKKwkJCQkgIHNzbF9jaXBoZXJfaWQpOworaW50IHNzbF9jaXBoZXJfcHRyX2lkX2NtcChjb25zdCBTU0xfQ0lQSEVSICogY29uc3QgKmFwLAorCQkJY29uc3QgU1NMX0NJUEhFUiAqIGNvbnN0ICpicCk7CitTVEFDS19PRihTU0xfQ0lQSEVSKSAqc3NsX2J5dGVzX3RvX2NpcGhlcl9saXN0KFNTTCAqcyx1bnNpZ25lZCBjaGFyICpwLGludCBudW0sCisJCQkJCSAgICAgICBTVEFDS19PRihTU0xfQ0lQSEVSKSAqKnNrcCk7CitpbnQgc3NsX2NpcGhlcl9saXN0X3RvX2J5dGVzKFNTTCAqcyxTVEFDS19PRihTU0xfQ0lQSEVSKSAqc2ssdW5zaWduZWQgY2hhciAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqcHV0X2NiKShjb25zdCBTU0xfQ0lQSEVSICosIHVuc2lnbmVkIGNoYXIgKikpOworU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoY29uc3QgU1NMX01FVEhPRCAqbWV0aCwKKwkJCQkJICAgICBTVEFDS19PRihTU0xfQ0lQSEVSKSAqKnByZWYsCisJCQkJCSAgICAgU1RBQ0tfT0YoU1NMX0NJUEhFUikgKipzb3J0ZWQsCisJCQkJCSAgICAgY29uc3QgY2hhciAqcnVsZV9zdHIpOwordm9pZCBzc2xfdXBkYXRlX2NhY2hlKFNTTCAqcywgaW50IG1vZGUpOworaW50IHNzbF9jaXBoZXJfZ2V0X2V2cChjb25zdCBTU0xfU0VTU0lPTiAqcyxjb25zdCBFVlBfQ0lQSEVSICoqZW5jLAorCQkgICAgICAgY29uc3QgRVZQX01EICoqbWQsaW50ICptYWNfcGtleV90eXBlLGludCAqbWFjX3NlY3JldF9zaXplLCBTU0xfQ09NUCAqKmNvbXApOworaW50IHNzbF9nZXRfaGFuZHNoYWtlX2RpZ2VzdChpbnQgaSxsb25nICptYXNrLGNvbnN0IEVWUF9NRCAqKm1kKTsJCQkgICAKK2ludCBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oU1NMICpzLFNUQUNLX09GKFg1MDkpICpzayk7CitpbnQgc3NsX3VuZGVmaW5lZF9mdW5jdGlvbihTU0wgKnMpOworaW50IHNzbF91bmRlZmluZWRfdm9pZF9mdW5jdGlvbih2b2lkKTsKK2ludCBzc2xfdW5kZWZpbmVkX2NvbnN0X2Z1bmN0aW9uKGNvbnN0IFNTTCAqcyk7CitYNTA5ICpzc2xfZ2V0X3NlcnZlcl9zZW5kX2NlcnQoU1NMICopOworRVZQX1BLRVkgKnNzbF9nZXRfc2lnbl9wa2V5KFNTTCAqLGNvbnN0IFNTTF9DSVBIRVIgKik7CitpbnQgc3NsX2NlcnRfdHlwZShYNTA5ICp4LEVWUF9QS0VZICpwa2V5KTsKK3ZvaWQgc3NsX3NldF9jZXJ0X21hc2tzKENFUlQgKmMsIGNvbnN0IFNTTF9DSVBIRVIgKmNpcGhlcik7CitTVEFDS19PRihTU0xfQ0lQSEVSKSAqc3NsX2dldF9jaXBoZXJzX2J5X2lkKFNTTCAqcyk7CitpbnQgc3NsX3ZlcmlmeV9hbGFybV90eXBlKGxvbmcgdHlwZSk7Cit2b2lkIHNzbF9sb2FkX2NpcGhlcnModm9pZCk7CisKK2ludCBzc2wyX2VuY19pbml0KFNTTCAqcywgaW50IGNsaWVudCk7CitpbnQgc3NsMl9nZW5lcmF0ZV9rZXlfbWF0ZXJpYWwoU1NMICpzKTsKK3ZvaWQgc3NsMl9lbmMoU1NMICpzLGludCBzZW5kX2RhdGEpOwordm9pZCBzc2wyX21hYyhTU0wgKnMsdW5zaWduZWQgY2hhciAqbWFjLGludCBzZW5kX2RhdGEpOworY29uc3QgU1NMX0NJUEhFUiAqc3NsMl9nZXRfY2lwaGVyX2J5X2NoYXIoY29uc3QgdW5zaWduZWQgY2hhciAqcCk7CitpbnQgc3NsMl9wdXRfY2lwaGVyX2J5X2NoYXIoY29uc3QgU1NMX0NJUEhFUiAqYyx1bnNpZ25lZCBjaGFyICpwKTsKK2ludCBzc2wyX3BhcnRfcmVhZChTU0wgKnMsIHVuc2lnbmVkIGxvbmcgZiwgaW50IGkpOworaW50IHNzbDJfZG9fd3JpdGUoU1NMICpzKTsKK2ludCBzc2wyX3NldF9jZXJ0aWZpY2F0ZShTU0wgKnMsIGludCB0eXBlLCBpbnQgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhKTsKK3ZvaWQgc3NsMl9yZXR1cm5fZXJyb3IoU1NMICpzLGludCByZWFzb24pOwordm9pZCBzc2wyX3dyaXRlX2Vycm9yKFNTTCAqcyk7CitpbnQgc3NsMl9udW1fY2lwaGVycyh2b2lkKTsKK2NvbnN0IFNTTF9DSVBIRVIgKnNzbDJfZ2V0X2NpcGhlcih1bnNpZ25lZCBpbnQgdSk7CitpbnQJc3NsMl9uZXcoU1NMICpzKTsKK3ZvaWQJc3NsMl9mcmVlKFNTTCAqcyk7CitpbnQJc3NsMl9hY2NlcHQoU1NMICpzKTsKK2ludAlzc2wyX2Nvbm5lY3QoU1NMICpzKTsKK2ludAlzc2wyX3JlYWQoU1NMICpzLCB2b2lkICpidWYsIGludCBsZW4pOworaW50CXNzbDJfcGVlayhTU0wgKnMsIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitpbnQJc3NsMl93cml0ZShTU0wgKnMsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbik7CitpbnQJc3NsMl9zaHV0ZG93bihTU0wgKnMpOwordm9pZAlzc2wyX2NsZWFyKFNTTCAqcyk7Citsb25nCXNzbDJfY3RybChTU0wgKnMsaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKK2xvbmcJc3NsMl9jdHhfY3RybChTU0xfQ1RYICpzLGludCBjbWQsIGxvbmcgbGFyZywgdm9pZCAqcGFyZyk7Citsb25nCXNzbDJfY2FsbGJhY2tfY3RybChTU0wgKnMsaW50IGNtZCwgdm9pZCAoKmZwKSh2b2lkKSk7Citsb25nCXNzbDJfY3R4X2NhbGxiYWNrX2N0cmwoU1NMX0NUWCAqcyxpbnQgY21kLCB2b2lkICgqZnApKHZvaWQpKTsKK2ludAlzc2wyX3BlbmRpbmcoY29uc3QgU1NMICpzKTsKK2xvbmcJc3NsMl9kZWZhdWx0X3RpbWVvdXQodm9pZCApOworCitjb25zdCBTU0xfQ0lQSEVSICpzc2wzX2dldF9jaXBoZXJfYnlfY2hhcihjb25zdCB1bnNpZ25lZCBjaGFyICpwKTsKK2ludCBzc2wzX3B1dF9jaXBoZXJfYnlfY2hhcihjb25zdCBTU0xfQ0lQSEVSICpjLHVuc2lnbmVkIGNoYXIgKnApOwordm9pZCBzc2wzX2luaXRfZmluaXNoZWRfbWFjKFNTTCAqcyk7CitpbnQgc3NsM19zZW5kX3NlcnZlcl9jZXJ0aWZpY2F0ZShTU0wgKnMpOworaW50IHNzbDNfc2VuZF9uZXdzZXNzaW9uX3RpY2tldChTU0wgKnMpOworaW50IHNzbDNfc2VuZF9jZXJ0X3N0YXR1cyhTU0wgKnMpOworaW50IHNzbDNfZ2V0X2ZpbmlzaGVkKFNTTCAqcyxpbnQgc3RhdGVfYSxpbnQgc3RhdGVfYik7CitpbnQgc3NsM19zZXR1cF9rZXlfYmxvY2soU1NMICpzKTsKK2ludCBzc2wzX3NlbmRfY2hhbmdlX2NpcGhlcl9zcGVjKFNTTCAqcyxpbnQgc3RhdGVfYSxpbnQgc3RhdGVfYik7CitpbnQgc3NsM19jaGFuZ2VfY2lwaGVyX3N0YXRlKFNTTCAqcyxpbnQgd2hpY2gpOwordm9pZCBzc2wzX2NsZWFudXBfa2V5X2Jsb2NrKFNTTCAqcyk7CitpbnQgc3NsM19kb193cml0ZShTU0wgKnMsaW50IHR5cGUpOworaW50IHNzbDNfc2VuZF9hbGVydChTU0wgKnMsaW50IGxldmVsLCBpbnQgZGVzYyk7CitpbnQgc3NsM19nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqb3V0LAorCXVuc2lnbmVkIGNoYXIgKnAsIGludCBsZW4pOworaW50IHNzbDNfZ2V0X3JlcV9jZXJ0X3R5cGUoU1NMICpzLHVuc2lnbmVkIGNoYXIgKnApOworbG9uZyBzc2wzX2dldF9tZXNzYWdlKFNTTCAqcywgaW50IHN0MSwgaW50IHN0biwgaW50IG10LCBsb25nIG1heCwgaW50ICpvayk7CitpbnQgc3NsM19zZW5kX2ZpbmlzaGVkKFNTTCAqcywgaW50IGEsIGludCBiLCBjb25zdCBjaGFyICpzZW5kZXIsaW50IHNsZW4pOworaW50IHNzbDNfbnVtX2NpcGhlcnModm9pZCk7Citjb25zdCBTU0xfQ0lQSEVSICpzc2wzX2dldF9jaXBoZXIodW5zaWduZWQgaW50IHUpOworaW50IHNzbDNfcmVuZWdvdGlhdGUoU1NMICpzc2wpOyAKK2ludCBzc2wzX3JlbmVnb3RpYXRlX2NoZWNrKFNTTCAqc3NsKTsgCitpbnQgc3NsM19kaXNwYXRjaF9hbGVydChTU0wgKnMpOworaW50IHNzbDNfcmVhZF9ieXRlcyhTU0wgKnMsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sIGludCBwZWVrKTsKK2ludCBzc2wzX3dyaXRlX2J5dGVzKFNTTCAqcywgaW50IHR5cGUsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbik7CitpbnQgc3NsM19maW5hbF9maW5pc2hfbWFjKFNTTCAqcywgY29uc3QgY2hhciAqc2VuZGVyLCBpbnQgc2xlbix1bnNpZ25lZCBjaGFyICpwKTsKK2ludCBzc2wzX2NlcnRfdmVyaWZ5X21hYyhTU0wgKnMsIGludCBtZF9uaWQsIHVuc2lnbmVkIGNoYXIgKnApOwordm9pZCBzc2wzX2ZpbmlzaF9tYWMoU1NMICpzLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworaW50IHNzbDNfZW5jKFNTTCAqcywgaW50IHNlbmRfZGF0YSk7CitpbnQgbl9zc2wzX21hYyhTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqbWQsIGludCBzZW5kX2RhdGEpOwordm9pZCBzc2wzX2ZyZWVfZGlnZXN0X2xpc3QoU1NMICpzKTsKK3Vuc2lnbmVkIGxvbmcgc3NsM19vdXRwdXRfY2VydF9jaGFpbihTU0wgKnMsIFg1MDkgKngpOworU1NMX0NJUEhFUiAqc3NsM19jaG9vc2VfY2lwaGVyKFNTTCAqc3NsLFNUQUNLX09GKFNTTF9DSVBIRVIpICpjbG50LAorCQkJICAgICAgIFNUQUNLX09GKFNTTF9DSVBIRVIpICpzcnZyKTsKK2ludAlzc2wzX3NldHVwX2J1ZmZlcnMoU1NMICpzKTsKK2ludAlzc2wzX3NldHVwX3JlYWRfYnVmZmVyKFNTTCAqcyk7CitpbnQJc3NsM19zZXR1cF93cml0ZV9idWZmZXIoU1NMICpzKTsKK2ludAlzc2wzX3JlbGVhc2VfcmVhZF9idWZmZXIoU1NMICpzKTsKK2ludAlzc2wzX3JlbGVhc2Vfd3JpdGVfYnVmZmVyKFNTTCAqcyk7CitpbnQJc3NsM19kaWdlc3RfY2FjaGVkX3JlY29yZHMoU1NMICpzKTsKK2ludAlzc2wzX25ldyhTU0wgKnMpOwordm9pZAlzc2wzX2ZyZWUoU1NMICpzKTsKK2ludAlzc2wzX2FjY2VwdChTU0wgKnMpOworaW50CXNzbDNfY29ubmVjdChTU0wgKnMpOworaW50CXNzbDNfcmVhZChTU0wgKnMsIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitpbnQJc3NsM19wZWVrKFNTTCAqcywgdm9pZCAqYnVmLCBpbnQgbGVuKTsKK2ludAlzc2wzX3dyaXRlKFNTTCAqcywgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKTsKK2ludAlzc2wzX3NodXRkb3duKFNTTCAqcyk7Cit2b2lkCXNzbDNfY2xlYXIoU1NMICpzKTsKK2xvbmcJc3NsM19jdHJsKFNTTCAqcyxpbnQgY21kLCBsb25nIGxhcmcsIHZvaWQgKnBhcmcpOworbG9uZwlzc2wzX2N0eF9jdHJsKFNTTF9DVFggKnMsaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKK2xvbmcJc3NsM19jYWxsYmFja19jdHJsKFNTTCAqcyxpbnQgY21kLCB2b2lkICgqZnApKHZvaWQpKTsKK2xvbmcJc3NsM19jdHhfY2FsbGJhY2tfY3RybChTU0xfQ1RYICpzLGludCBjbWQsIHZvaWQgKCpmcCkodm9pZCkpOworaW50CXNzbDNfcGVuZGluZyhjb25zdCBTU0wgKnMpOworCit2b2lkIHNzbDNfcmVjb3JkX3NlcXVlbmNlX3VwZGF0ZSh1bnNpZ25lZCBjaGFyICpzZXEpOworaW50IHNzbDNfZG9fY2hhbmdlX2NpcGhlcl9zcGVjKFNTTCAqc3NsKTsKK2xvbmcgc3NsM19kZWZhdWx0X3RpbWVvdXQodm9pZCApOworCitpbnQgc3NsMjNfbnVtX2NpcGhlcnModm9pZCApOworY29uc3QgU1NMX0NJUEhFUiAqc3NsMjNfZ2V0X2NpcGhlcih1bnNpZ25lZCBpbnQgdSk7CitpbnQgc3NsMjNfcmVhZChTU0wgKnMsIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitpbnQgc3NsMjNfcGVlayhTU0wgKnMsIHZvaWQgKmJ1ZiwgaW50IGxlbik7CitpbnQgc3NsMjNfd3JpdGUoU1NMICpzLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pOworaW50IHNzbDIzX3B1dF9jaXBoZXJfYnlfY2hhcihjb25zdCBTU0xfQ0lQSEVSICpjLCB1bnNpZ25lZCBjaGFyICpwKTsKK2NvbnN0IFNTTF9DSVBIRVIgKnNzbDIzX2dldF9jaXBoZXJfYnlfY2hhcihjb25zdCB1bnNpZ25lZCBjaGFyICpwKTsKK2xvbmcgc3NsMjNfZGVmYXVsdF90aW1lb3V0KHZvaWQgKTsKKworbG9uZyB0bHMxX2RlZmF1bHRfdGltZW91dCh2b2lkKTsKK2ludCBkdGxzMV9kb193cml0ZShTU0wgKnMsaW50IHR5cGUpOworaW50IHNzbDNfcmVhZF9uKFNTTCAqcywgaW50IG4sIGludCBtYXgsIGludCBleHRlbmQpOworaW50IGR0bHMxX3JlYWRfYnl0ZXMoU1NMICpzLCBpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuLCBpbnQgcGVlayk7CitpbnQgc3NsM19kb19jb21wcmVzcyhTU0wgKnNzbCk7CitpbnQgc3NsM19kb191bmNvbXByZXNzKFNTTCAqc3NsKTsKK2ludCBzc2wzX3dyaXRlX3BlbmRpbmcoU1NMICpzLCBpbnQgdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCXVuc2lnbmVkIGludCBsZW4pOwordW5zaWduZWQgY2hhciAqZHRsczFfc2V0X21lc3NhZ2VfaGVhZGVyKFNTTCAqcywgCisJdW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgY2hhciBtdCwJdW5zaWduZWQgbG9uZyBsZW4sIAorCXVuc2lnbmVkIGxvbmcgZnJhZ19vZmYsIHVuc2lnbmVkIGxvbmcgZnJhZ19sZW4pOworCitpbnQgZHRsczFfd3JpdGVfYXBwX2RhdGFfYnl0ZXMoU1NMICpzLCBpbnQgdHlwZSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKTsKK2ludCBkdGxzMV93cml0ZV9ieXRlcyhTU0wgKnMsIGludCB0eXBlLCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pOworCitpbnQgZHRsczFfc2VuZF9jaGFuZ2VfY2lwaGVyX3NwZWMoU1NMICpzLCBpbnQgYSwgaW50IGIpOworaW50IGR0bHMxX3NlbmRfZmluaXNoZWQoU1NMICpzLCBpbnQgYSwgaW50IGIsIGNvbnN0IGNoYXIgKnNlbmRlciwgaW50IHNsZW4pOwordW5zaWduZWQgbG9uZyBkdGxzMV9vdXRwdXRfY2VydF9jaGFpbihTU0wgKnMsIFg1MDkgKngpOworaW50IGR0bHMxX3JlYWRfZmFpbGVkKFNTTCAqcywgaW50IGNvZGUpOworaW50IGR0bHMxX2J1ZmZlcl9tZXNzYWdlKFNTTCAqcywgaW50IGNjcyk7CitpbnQgZHRsczFfcmV0cmFuc21pdF9tZXNzYWdlKFNTTCAqcywgdW5zaWduZWQgc2hvcnQgc2VxLCAKKwl1bnNpZ25lZCBsb25nIGZyYWdfb2ZmLCBpbnQgKmZvdW5kKTsKK2ludCBkdGxzMV9nZXRfcXVldWVfcHJpb3JpdHkodW5zaWduZWQgc2hvcnQgc2VxLCBpbnQgaXNfY2NzKTsKK2ludCBkdGxzMV9yZXRyYW5zbWl0X2J1ZmZlcmVkX21lc3NhZ2VzKFNTTCAqcyk7Cit2b2lkIGR0bHMxX2NsZWFyX3JlY29yZF9idWZmZXIoU1NMICpzKTsKK3ZvaWQgZHRsczFfZ2V0X21lc3NhZ2VfaGVhZGVyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHN0cnVjdCBobV9oZWFkZXJfc3QgKm1zZ19oZHIpOwordm9pZCBkdGxzMV9nZXRfY2NzX2hlYWRlcih1bnNpZ25lZCBjaGFyICpkYXRhLCBzdHJ1Y3QgY2NzX2hlYWRlcl9zdCAqY2NzX2hkcik7Cit2b2lkIGR0bHMxX3Jlc2V0X3NlcV9udW1iZXJzKFNTTCAqcywgaW50IHJ3KTsKK2xvbmcgZHRsczFfZGVmYXVsdF90aW1lb3V0KHZvaWQpOworc3RydWN0IHRpbWV2YWwqIGR0bHMxX2dldF90aW1lb3V0KFNTTCAqcywgc3RydWN0IHRpbWV2YWwqIHRpbWVsZWZ0KTsKK2ludCBkdGxzMV9oYW5kbGVfdGltZW91dChTU0wgKnMpOworY29uc3QgU1NMX0NJUEhFUiAqZHRsczFfZ2V0X2NpcGhlcih1bnNpZ25lZCBpbnQgdSk7Cit2b2lkIGR0bHMxX3N0YXJ0X3RpbWVyKFNTTCAqcyk7Cit2b2lkIGR0bHMxX3N0b3BfdGltZXIoU1NMICpzKTsKK2ludCBkdGxzMV9pc190aW1lcl9leHBpcmVkKFNTTCAqcyk7Cit2b2lkIGR0bHMxX2RvdWJsZV90aW1lb3V0KFNTTCAqcyk7CitpbnQgZHRsczFfc2VuZF9uZXdzZXNzaW9uX3RpY2tldChTU0wgKnMpOworCisvKiBzb21lIGNsaWVudC1vbmx5IGZ1bmN0aW9ucyAqLworaW50IHNzbDNfY2xpZW50X2hlbGxvKFNTTCAqcyk7CitpbnQgc3NsM19nZXRfc2VydmVyX2hlbGxvKFNTTCAqcyk7CitpbnQgc3NsM19nZXRfY2VydGlmaWNhdGVfcmVxdWVzdChTU0wgKnMpOworaW50IHNzbDNfZ2V0X25ld19zZXNzaW9uX3RpY2tldChTU0wgKnMpOworaW50IHNzbDNfZ2V0X2NlcnRfc3RhdHVzKFNTTCAqcyk7CitpbnQgc3NsM19nZXRfc2VydmVyX2RvbmUoU1NMICpzKTsKK2ludCBzc2wzX3NlbmRfY2xpZW50X3ZlcmlmeShTU0wgKnMpOworaW50IHNzbDNfc2VuZF9jbGllbnRfY2VydGlmaWNhdGUoU1NMICpzKTsKK2ludCBzc2xfZG9fY2xpZW50X2NlcnRfY2IoU1NMICpzLCBYNTA5ICoqcHg1MDksIEVWUF9QS0VZICoqcHBrZXkpOworaW50IHNzbDNfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlKFNTTCAqcyk7CitpbnQgc3NsM19nZXRfa2V5X2V4Y2hhbmdlKFNTTCAqcyk7CitpbnQgc3NsM19nZXRfc2VydmVyX2NlcnRpZmljYXRlKFNTTCAqcyk7CitpbnQgc3NsM19jaGVja19jZXJ0X2FuZF9hbGdvcml0aG0oU1NMICpzKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK2ludCBzc2wzX2NoZWNrX2ZpbmlzaGVkKFNTTCAqcyk7CisjZW5kaWYKKworaW50IGR0bHMxX2NsaWVudF9oZWxsbyhTU0wgKnMpOworaW50IGR0bHMxX3NlbmRfY2xpZW50X2NlcnRpZmljYXRlKFNTTCAqcyk7CitpbnQgZHRsczFfc2VuZF9jbGllbnRfa2V5X2V4Y2hhbmdlKFNTTCAqcyk7CitpbnQgZHRsczFfc2VuZF9jbGllbnRfdmVyaWZ5KFNTTCAqcyk7CisKKy8qIHNvbWUgc2VydmVyLW9ubHkgZnVuY3Rpb25zICovCitpbnQgc3NsM19nZXRfY2xpZW50X2hlbGxvKFNTTCAqcyk7CitpbnQgc3NsM19zZW5kX3NlcnZlcl9oZWxsbyhTU0wgKnMpOworaW50IHNzbDNfc2VuZF9oZWxsb19yZXF1ZXN0KFNTTCAqcyk7CitpbnQgc3NsM19zZW5kX3NlcnZlcl9rZXlfZXhjaGFuZ2UoU1NMICpzKTsKK2ludCBzc2wzX3NlbmRfY2VydGlmaWNhdGVfcmVxdWVzdChTU0wgKnMpOworaW50IHNzbDNfc2VuZF9zZXJ2ZXJfZG9uZShTU0wgKnMpOworaW50IHNzbDNfY2hlY2tfY2xpZW50X2hlbGxvKFNTTCAqcyk7CitpbnQgc3NsM19nZXRfY2xpZW50X2NlcnRpZmljYXRlKFNTTCAqcyk7CitpbnQgc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZShTU0wgKnMpOworaW50IHNzbDNfZ2V0X2NlcnRfdmVyaWZ5KFNTTCAqcyk7CisKK2ludCBkdGxzMV9zZW5kX2hlbGxvX3JlcXVlc3QoU1NMICpzKTsKK2ludCBkdGxzMV9zZW5kX3NlcnZlcl9oZWxsbyhTU0wgKnMpOworaW50IGR0bHMxX3NlbmRfc2VydmVyX2NlcnRpZmljYXRlKFNTTCAqcyk7CitpbnQgZHRsczFfc2VuZF9zZXJ2ZXJfa2V5X2V4Y2hhbmdlKFNTTCAqcyk7CitpbnQgZHRsczFfc2VuZF9jZXJ0aWZpY2F0ZV9yZXF1ZXN0KFNTTCAqcyk7CitpbnQgZHRsczFfc2VuZF9zZXJ2ZXJfZG9uZShTU0wgKnMpOworCisKKworaW50IHNzbDIzX2FjY2VwdChTU0wgKnMpOworaW50IHNzbDIzX2Nvbm5lY3QoU1NMICpzKTsKK2ludCBzc2wyM19yZWFkX2J5dGVzKFNTTCAqcywgaW50IG4pOworaW50IHNzbDIzX3dyaXRlX2J5dGVzKFNTTCAqcyk7CisKK2ludCB0bHMxX25ldyhTU0wgKnMpOwordm9pZCB0bHMxX2ZyZWUoU1NMICpzKTsKK3ZvaWQgdGxzMV9jbGVhcihTU0wgKnMpOworbG9uZyB0bHMxX2N0cmwoU1NMICpzLGludCBjbWQsIGxvbmcgbGFyZywgdm9pZCAqcGFyZyk7Citsb25nIHRsczFfY2FsbGJhY2tfY3RybChTU0wgKnMsaW50IGNtZCwgdm9pZCAoKmZwKSh2b2lkKSk7CisKK2ludCBkdGxzMV9uZXcoU1NMICpzKTsKK2ludAlkdGxzMV9hY2NlcHQoU1NMICpzKTsKK2ludAlkdGxzMV9jb25uZWN0KFNTTCAqcyk7Cit2b2lkIGR0bHMxX2ZyZWUoU1NMICpzKTsKK3ZvaWQgZHRsczFfY2xlYXIoU1NMICpzKTsKK2xvbmcgZHRsczFfY3RybChTU0wgKnMsaW50IGNtZCwgbG9uZyBsYXJnLCB2b2lkICpwYXJnKTsKKworbG9uZyBkdGxzMV9nZXRfbWVzc2FnZShTU0wgKnMsIGludCBzdDEsIGludCBzdG4sIGludCBtdCwgbG9uZyBtYXgsIGludCAqb2spOworaW50IGR0bHMxX2dldF9yZWNvcmQoU1NMICpzKTsKK2ludCBkb19kdGxzMV93cml0ZShTU0wgKnMsIGludCB0eXBlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCisJdW5zaWduZWQgaW50IGxlbiwgaW50IGNyZWF0ZV9lbXB0eV9mcmFnZW1lbnQpOworaW50IGR0bHMxX2Rpc3BhdGNoX2FsZXJ0KFNTTCAqcyk7CitpbnQgZHRsczFfZW5jKFNTTCAqcywgaW50IHNuZCk7CisKK2ludCBzc2xfaW5pdF93YmlvX2J1ZmZlcihTU0wgKnMsIGludCBwdXNoKTsKK3ZvaWQgc3NsX2ZyZWVfd2Jpb19idWZmZXIoU1NMICpzKTsKKworaW50IHRsczFfY2hhbmdlX2NpcGhlcl9zdGF0ZShTU0wgKnMsIGludCB3aGljaCk7CitpbnQgdGxzMV9zZXR1cF9rZXlfYmxvY2soU1NMICpzKTsKK2ludCB0bHMxX2VuYyhTU0wgKnMsIGludCBzbmQpOworaW50IHRsczFfZmluYWxfZmluaXNoX21hYyhTU0wgKnMsCisJY29uc3QgY2hhciAqc3RyLCBpbnQgc2xlbiwgdW5zaWduZWQgY2hhciAqcCk7CitpbnQgdGxzMV9jZXJ0X3ZlcmlmeV9tYWMoU1NMICpzLCBpbnQgbWRfbmlkLCB1bnNpZ25lZCBjaGFyICpwKTsKK2ludCB0bHMxX21hYyhTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqbWQsIGludCBzbmQpOworaW50IHRsczFfZ2VuZXJhdGVfbWFzdGVyX3NlY3JldChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKm91dCwKKwl1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKTsKK2ludCB0bHMxX2FsZXJ0X2NvZGUoaW50IGNvZGUpOworaW50IHNzbDNfYWxlcnRfY29kZShpbnQgY29kZSk7CitpbnQgc3NsX29rKFNTTCAqcyk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICitpbnQgc3NsX2NoZWNrX3NydnJfZWNjX2NlcnRfYW5kX2FsZyhYNTA5ICp4LCBjb25zdCBTU0xfQ0lQSEVSICpjcyk7CisjZW5kaWYKKworU1NMX0NPTVAgKnNzbDNfY29tcF9maW5kKFNUQUNLX09GKFNTTF9DT01QKSAqc2ssIGludCBuKTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0VDCitpbnQgdGxzMV9lY19jdXJ2ZV9pZDJuaWQoaW50IGN1cnZlX2lkKTsKK2ludCB0bHMxX2VjX25pZDJjdXJ2ZV9pZChpbnQgbmlkKTsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK3Vuc2lnbmVkIGNoYXIgKnNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgY2hhciAqbGltaXQpOyAKK3Vuc2lnbmVkIGNoYXIgKnNzbF9hZGRfc2VydmVyaGVsbG9fdGxzZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgY2hhciAqbGltaXQpOyAKK2ludCBzc2xfcGFyc2VfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBuLCBpbnQgKmFsKTsKK2ludCBzc2xfcGFyc2Vfc2VydmVyaGVsbG9fdGxzZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBuLCBpbnQgKmFsKTsKK2ludCBzc2xfcHJlcGFyZV9jbGllbnRoZWxsb190bHNleHQoU1NMICpzKTsKK2ludCBzc2xfcHJlcGFyZV9zZXJ2ZXJoZWxsb190bHNleHQoU1NMICpzKTsKK2ludCBzc2xfY2hlY2tfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcyk7CitpbnQgc3NsX2NoZWNrX3NlcnZlcmhlbGxvX3Rsc2V4dChTU0wgKnMpOworCisjaWZkZWYgT1BFTlNTTF9OT19TSEEyNTYKKyNkZWZpbmUgdGxzZXh0X3RpY2tfbWQJRVZQX3NoYTEKKyNlbHNlCisjZGVmaW5lIHRsc2V4dF90aWNrX21kCUVWUF9zaGEyNTYKKyNlbmRpZgoraW50IHRsczFfcHJvY2Vzc190aWNrZXQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpzZXNzaW9uX2lkLCBpbnQgbGVuLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpbWl0LCBTU0xfU0VTU0lPTiAqKnJldCk7CisjZW5kaWYKK0VWUF9NRF9DVFgqIHNzbF9yZXBsYWNlX2hhc2goRVZQX01EX0NUWCAqKmhhc2gsY29uc3QgRVZQX01EICptZCkgOwordm9pZCBzc2xfY2xlYXJfaGFzaF9jdHgoRVZQX01EX0NUWCAqKmhhc2gpOworaW50IHNzbF9hZGRfc2VydmVyaGVsbG9fcmVuZWdvdGlhdGVfZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqcCwgaW50ICpsZW4sCisJCQkJCWludCBtYXhsZW4pOworaW50IHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuLAorCQkJCQkgIGludCAqYWwpOworaW50IHNzbF9hZGRfY2xpZW50aGVsbG9fcmVuZWdvdGlhdGVfZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqcCwgaW50ICpsZW4sCisJCQkJCWludCBtYXhsZW4pOworaW50IHNzbF9wYXJzZV9jbGllbnRoZWxsb19yZW5lZ290aWF0ZV9leHQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuLAorCQkJCQkgIGludCAqYWwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvc3NsX3JzYS5jIGIvbGliL29wZW5zc2wvc3NsL3NzbF9yc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNmM2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbF9yc2EuYwpAQCAtMCwwICsxLDgxNSBAQAorLyogc3NsL3NzbF9yc2EuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYmlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3BlbS5oPgorCitzdGF0aWMgaW50IHNzbF9zZXRfY2VydChDRVJUICpjLCBYNTA5ICp4NTA5KTsKK3N0YXRpYyBpbnQgc3NsX3NldF9wa2V5KENFUlQgKmMsIEVWUF9QS0VZICpwa2V5KTsKK2ludCBTU0xfdXNlX2NlcnRpZmljYXRlKFNTTCAqc3NsLCBYNTA5ICp4KQorCXsKKwlpZiAoeCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybigwKTsKKwkJfQorCWlmICghc3NsX2NlcnRfaW5zdCgmc3NsLT5jZXJ0KSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybigwKTsKKwkJfQorCXJldHVybihzc2xfc2V0X2NlcnQoc3NsLT5jZXJ0LHgpKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworaW50IFNTTF91c2VfY2VydGlmaWNhdGVfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCisJeworCWludCBqOworCUJJTyAqaW47CisJaW50IHJldD0wOworCVg1MDkgKng9TlVMTDsKKworCWluPUJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKTsKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURV9GSUxFLEVSUl9SX0JVRl9MSUIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGZpbGUpIDw9IDApCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9VU0VfQ0VSVElGSUNBVEVfRklMRSxFUlJfUl9TWVNfTElCKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfQVNOMSkKKwkJeworCQlqPUVSUl9SX0FTTjFfTElCOworCQl4PWQyaV9YNTA5X2JpbyhpbixOVUxMKTsKKwkJfQorCWVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkKKwkJeworCQlqPUVSUl9SX1BFTV9MSUI7CisJCXg9UEVNX3JlYWRfYmlvX1g1MDkoaW4sTlVMTCxzc2wtPmN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2ssc3NsLT5jdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKKwkJfQorCWVsc2UKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURV9GSUxFLFNTTF9SX0JBRF9TU0xfRklMRVRZUEUpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKHggPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURV9GSUxFLGopOworCQlnb3RvIGVuZDsKKwkJfQorCisJcmV0PVNTTF91c2VfY2VydGlmaWNhdGUoc3NsLHgpOworZW5kOgorCWlmICh4ICE9IE5VTEwpIFg1MDlfZnJlZSh4KTsKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCXJldHVybihyZXQpOworCX0KKyNlbmRpZgorCitpbnQgU1NMX3VzZV9jZXJ0aWZpY2F0ZV9BU04xKFNTTCAqc3NsLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuKQorCXsKKwlYNTA5ICp4OworCWludCByZXQ7CisKKwl4PWQyaV9YNTA5KE5VTEwsJmQsKGxvbmcpbGVuKTsKKwlpZiAoeCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfVVNFX0NFUlRJRklDQVRFX0FTTjEsRVJSX1JfQVNOMV9MSUIpOworCQlyZXR1cm4oMCk7CisJCX0KKworCXJldD1TU0xfdXNlX2NlcnRpZmljYXRlKHNzbCx4KTsKKwlYNTA5X2ZyZWUoeCk7CisJcmV0dXJuKHJldCk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitpbnQgU1NMX3VzZV9SU0FQcml2YXRlS2V5KFNTTCAqc3NsLCBSU0EgKnJzYSkKKwl7CisJRVZQX1BLRVkgKnBrZXk7CisJaW50IHJldDsKKworCWlmIChyc2EgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybigwKTsKKwkJfQorCWlmICghc3NsX2NlcnRfaW5zdCgmc3NsLT5jZXJ0KSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKChwa2V5PUVWUF9QS0VZX25ldygpKSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfVVNFX1JTQVBSSVZBVEVLRVksRVJSX1JfRVZQX0xJQik7CisJCXJldHVybigwKTsKKwkJfQorCisJUlNBX3VwX3JlZihyc2EpOworCUVWUF9QS0VZX2Fzc2lnbl9SU0EocGtleSxyc2EpOworCisJcmV0PXNzbF9zZXRfcGtleShzc2wtPmNlcnQscGtleSk7CisJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYKKworc3RhdGljIGludCBzc2xfc2V0X3BrZXkoQ0VSVCAqYywgRVZQX1BLRVkgKnBrZXkpCisJeworCWludCBpOworCisJaT1zc2xfY2VydF90eXBlKE5VTEwscGtleSk7CisJaWYgKGkgPCAwKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfU0VUX1BLRVksU1NMX1JfVU5LTk9XTl9DRVJUSUZJQ0FURV9UWVBFKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlpZiAoYy0+cGtleXNbaV0ueDUwOSAhPSBOVUxMKQorCQl7CisJCUVWUF9QS0VZICpwa3RtcDsKKwkJcGt0bXAgPQlYNTA5X2dldF9wdWJrZXkoYy0+cGtleXNbaV0ueDUwOSk7CisJCUVWUF9QS0VZX2NvcHlfcGFyYW1ldGVycyhwa3RtcCxwa2V5KTsKKwkJRVZQX1BLRVlfZnJlZShwa3RtcCk7CisJCUVSUl9jbGVhcl9lcnJvcigpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJCS8qIERvbid0IGNoZWNrIHRoZSBwdWJsaWMvcHJpdmF0ZSBrZXksIHRoaXMgaXMgbW9zdGx5CisJCSAqIGZvciBzbWFydCBjYXJkcy4gKi8KKwkJaWYgKChwa2V5LT50eXBlID09IEVWUF9QS0VZX1JTQSkgJiYKKwkJCShSU0FfZmxhZ3MocGtleS0+cGtleS5yc2EpICYgUlNBX01FVEhPRF9GTEFHX05PX0NIRUNLKSkKKwkJCTsKKwkJZWxzZQorI2VuZGlmCisJCWlmICghWDUwOV9jaGVja19wcml2YXRlX2tleShjLT5wa2V5c1tpXS54NTA5LHBrZXkpKQorCQkJeworCQkJWDUwOV9mcmVlKGMtPnBrZXlzW2ldLng1MDkpOworCQkJYy0+cGtleXNbaV0ueDUwOSA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJaWYgKGMtPnBrZXlzW2ldLnByaXZhdGVrZXkgIT0gTlVMTCkKKwkJRVZQX1BLRVlfZnJlZShjLT5wa2V5c1tpXS5wcml2YXRla2V5KTsKKwlDUllQVE9fYWRkKCZwa2V5LT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfRVZQX1BLRVkpOworCWMtPnBrZXlzW2ldLnByaXZhdGVrZXk9cGtleTsKKwljLT5rZXk9ICYoYy0+cGtleXNbaV0pOworCisJYy0+dmFsaWQ9MDsKKwlyZXR1cm4oMSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaWZuZGVmIE9QRU5TU0xfTk9fU1RESU8KK2ludCBTU0xfdXNlX1JTQVByaXZhdGVLZXlfZmlsZShTU0wgKnNzbCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCisJeworCWludCBqLHJldD0wOworCUJJTyAqaW47CisJUlNBICpyc2E9TlVMTDsKKworCWluPUJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKTsKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZX0ZJTEUsRVJSX1JfQlVGX0xJQik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4sZmlsZSkgPD0gMCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZX0ZJTEUsRVJSX1JfU1lTX0xJQik7CisJCWdvdG8gZW5kOworCQl9CisJaWYJKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX0FTTjEpCisJCXsKKwkJaj1FUlJfUl9BU04xX0xJQjsKKwkJcnNhPWQyaV9SU0FQcml2YXRlS2V5X2JpbyhpbixOVUxMKTsKKwkJfQorCWVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX1BFTSkKKwkJeworCQlqPUVSUl9SX1BFTV9MSUI7CisJCXJzYT1QRU1fcmVhZF9iaW9fUlNBUHJpdmF0ZUtleShpbixOVUxMLAorCQkJc3NsLT5jdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLHNzbC0+Y3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSk7CisJCX0KKwllbHNlCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9VU0VfUlNBUFJJVkFURUtFWV9GSUxFLFNTTF9SX0JBRF9TU0xfRklMRVRZUEUpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmIChyc2EgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9SU0FQUklWQVRFS0VZX0ZJTEUsaik7CisJCWdvdG8gZW5kOworCQl9CisJcmV0PVNTTF91c2VfUlNBUHJpdmF0ZUtleShzc2wscnNhKTsKKwlSU0FfZnJlZShyc2EpOworZW5kOgorCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKK2ludCBTU0xfdXNlX1JTQVByaXZhdGVLZXlfQVNOMShTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqZCwgbG9uZyBsZW4pCisJeworCWludCByZXQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlSU0EgKnJzYTsKKworCXA9ZDsKKwlpZiAoKHJzYT1kMmlfUlNBUHJpdmF0ZUtleShOVUxMLCZwLChsb25nKWxlbikpID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9VU0VfUlNBUFJJVkFURUtFWV9BU04xLEVSUl9SX0FTTjFfTElCKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlyZXQ9U1NMX3VzZV9SU0FQcml2YXRlS2V5KHNzbCxyc2EpOworCVJTQV9mcmVlKHJzYSk7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmIC8qICFPUEVOU1NMX05PX1JTQSAqLworCitpbnQgU1NMX3VzZV9Qcml2YXRlS2V5KFNTTCAqc3NsLCBFVlBfUEtFWSAqcGtleSkKKwl7CisJaW50IHJldDsKKworCWlmIChwa2V5ID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWSxFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoIXNzbF9jZXJ0X2luc3QoJnNzbC0+Y2VydCkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWSxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCXJldHVybigwKTsKKwkJfQorCXJldD1zc2xfc2V0X3BrZXkoc3NsLT5jZXJ0LHBrZXkpOworCXJldHVybihyZXQpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1NURElPCitpbnQgU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUoU1NMICpzc2wsIGNvbnN0IGNoYXIgKmZpbGUsIGludCB0eXBlKQorCXsKKwlpbnQgaixyZXQ9MDsKKwlCSU8gKmluOworCUVWUF9QS0VZICpwa2V5PU5VTEw7CisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGVfaW50ZXJuYWwoKSk7CisJaWYgKGluID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWV9GSUxFLEVSUl9SX0JVRl9MSUIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGZpbGUpIDw9IDApCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9VU0VfUFJJVkFURUtFWV9GSUxFLEVSUl9SX1NZU19MSUIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9QRU0pCisJCXsKKwkJaj1FUlJfUl9QRU1fTElCOworCQlwa2V5PVBFTV9yZWFkX2Jpb19Qcml2YXRlS2V5KGluLE5VTEwsCisJCQlzc2wtPmN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2ssc3NsLT5jdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKKwkJfQorCWVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX0FTTjEpCisJCXsKKwkJaiA9IEVSUl9SX0FTTjFfTElCOworCQlwa2V5ID0gZDJpX1ByaXZhdGVLZXlfYmlvKGluLE5VTEwpOworCQl9CisJZWxzZQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfVVNFX1BSSVZBVEVLRVlfRklMRSxTU0xfUl9CQURfU1NMX0ZJTEVUWVBFKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAocGtleSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfVVNFX1BSSVZBVEVLRVlfRklMRSxqKTsKKwkJZ290byBlbmQ7CisJCX0KKwlyZXQ9U1NMX3VzZV9Qcml2YXRlS2V5KHNzbCxwa2V5KTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworZW5kOgorCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKK2ludCBTU0xfdXNlX1ByaXZhdGVLZXlfQVNOMShpbnQgdHlwZSwgU1NMICpzc2wsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmQsIGxvbmcgbGVuKQorCXsKKwlpbnQgcmV0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJRVZQX1BLRVkgKnBrZXk7CisKKwlwPWQ7CisJaWYgKChwa2V5PWQyaV9Qcml2YXRlS2V5KHR5cGUsTlVMTCwmcCwobG9uZylsZW4pKSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfVVNFX1BSSVZBVEVLRVlfQVNOMSxFUlJfUl9BU04xX0xJQik7CisJCXJldHVybigwKTsKKwkJfQorCisJcmV0PVNTTF91c2VfUHJpdmF0ZUtleShzc2wscGtleSk7CisJRVZQX1BLRVlfZnJlZShwa2V5KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKK2ludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZShTU0xfQ1RYICpjdHgsIFg1MDkgKngpCisJeworCWlmICh4ID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX0NFUlRJRklDQVRFLEVSUl9SX1BBU1NFRF9OVUxMX1BBUkFNRVRFUik7CisJCXJldHVybigwKTsKKwkJfQorCWlmICghc3NsX2NlcnRfaW5zdCgmY3R4LT5jZXJ0KSkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9VU0VfQ0VSVElGSUNBVEUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwlyZXR1cm4oc3NsX3NldF9jZXJ0KGN0eC0+Y2VydCwgeCkpOworCX0KKworc3RhdGljIGludCBzc2xfc2V0X2NlcnQoQ0VSVCAqYywgWDUwOSAqeCkKKwl7CisJRVZQX1BLRVkgKnBrZXk7CisJaW50IGk7CisKKwlwa2V5PVg1MDlfZ2V0X3B1YmtleSh4KTsKKwlpZiAocGtleSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfU0VUX0NFUlQsU1NMX1JfWDUwOV9MSUIpOworCQlyZXR1cm4oMCk7CisJCX0KKworCWk9c3NsX2NlcnRfdHlwZSh4LHBrZXkpOworCWlmIChpIDwgMCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1NFVF9DRVJULFNTTF9SX1VOS05PV05fQ0VSVElGSUNBVEVfVFlQRSk7CisJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCXJldHVybigwKTsKKwkJfQorCisJaWYgKGMtPnBrZXlzW2ldLnByaXZhdGVrZXkgIT0gTlVMTCkKKwkJeworCQlFVlBfUEtFWV9jb3B5X3BhcmFtZXRlcnMocGtleSxjLT5wa2V5c1tpXS5wcml2YXRla2V5KTsKKwkJRVJSX2NsZWFyX2Vycm9yKCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwkJLyogRG9uJ3QgY2hlY2sgdGhlIHB1YmxpYy9wcml2YXRlIGtleSwgdGhpcyBpcyBtb3N0bHkKKwkJICogZm9yIHNtYXJ0IGNhcmRzLiAqLworCQlpZiAoKGMtPnBrZXlzW2ldLnByaXZhdGVrZXktPnR5cGUgPT0gRVZQX1BLRVlfUlNBKSAmJgorCQkJKFJTQV9mbGFncyhjLT5wa2V5c1tpXS5wcml2YXRla2V5LT5wa2V5LnJzYSkgJgorCQkJIFJTQV9NRVRIT0RfRkxBR19OT19DSEVDSykpCisJCQkgOworCQllbHNlCisjZW5kaWYgLyogT1BFTlNTTF9OT19SU0EgKi8KKwkJaWYgKCFYNTA5X2NoZWNrX3ByaXZhdGVfa2V5KHgsYy0+cGtleXNbaV0ucHJpdmF0ZWtleSkpCisJCQl7CisJCQkvKiBkb24ndCBmYWlsIGZvciBhIGNlcnQva2V5IG1pc21hdGNoLCBqdXN0IGZyZWUKKwkJCSAqIGN1cnJlbnQgcHJpdmF0ZSBrZXkgKHdoZW4gc3dpdGNoaW5nIHRvIGEgZGlmZmVyZW50CisJCQkgKiBjZXJ0ICYga2V5LCBmaXJzdCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkLAorCQkJICogdGhlbiBzc2xfc2V0X3BrZXkgKi8KKwkJCUVWUF9QS0VZX2ZyZWUoYy0+cGtleXNbaV0ucHJpdmF0ZWtleSk7CisJCQljLT5wa2V5c1tpXS5wcml2YXRla2V5PU5VTEw7CisJCQkvKiBjbGVhciBlcnJvciBxdWV1ZSAqLworCQkJRVJSX2NsZWFyX2Vycm9yKCk7CisJCQl9CisJCX0KKworCUVWUF9QS0VZX2ZyZWUocGtleSk7CisKKwlpZiAoYy0+cGtleXNbaV0ueDUwOSAhPSBOVUxMKQorCQlYNTA5X2ZyZWUoYy0+cGtleXNbaV0ueDUwOSk7CisJQ1JZUFRPX2FkZCgmeC0+cmVmZXJlbmNlcywxLENSWVBUT19MT0NLX1g1MDkpOworCWMtPnBrZXlzW2ldLng1MDk9eDsKKwljLT5rZXk9ICYoYy0+cGtleXNbaV0pOworCisJYy0+dmFsaWQ9MDsKKwlyZXR1cm4oMSk7CisJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fU1RESU8KK2ludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCisJeworCWludCBqOworCUJJTyAqaW47CisJaW50IHJldD0wOworCVg1MDkgKng9TlVMTDsKKworCWluPUJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKTsKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9VU0VfQ0VSVElGSUNBVEVfRklMRSxFUlJfUl9CVUZfTElCKTsKKwkJZ290byBlbmQ7CisJCX0KKworCWlmIChCSU9fcmVhZF9maWxlbmFtZShpbixmaWxlKSA8PSAwKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURV9GSUxFLEVSUl9SX1NZU19MSUIpOworCQlnb3RvIGVuZDsKKwkJfQorCWlmICh0eXBlID09IFNTTF9GSUxFVFlQRV9BU04xKQorCQl7CisJCWo9RVJSX1JfQVNOMV9MSUI7CisJCXg9ZDJpX1g1MDlfYmlvKGluLE5VTEwpOworCQl9CisJZWxzZSBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfUEVNKQorCQl7CisJCWo9RVJSX1JfUEVNX0xJQjsKKwkJeD1QRU1fcmVhZF9iaW9fWDUwOShpbixOVUxMLGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2ssY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSk7CisJCX0KKwllbHNlCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX0NFUlRJRklDQVRFX0ZJTEUsU1NMX1JfQkFEX1NTTF9GSUxFVFlQRSk7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoeCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURV9GSUxFLGopOworCQlnb3RvIGVuZDsKKwkJfQorCisJcmV0PVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGN0eCx4KTsKK2VuZDoKKwlpZiAoeCAhPSBOVUxMKSBYNTA5X2ZyZWUoeCk7CisJaWYgKGluICE9IE5VTEwpIEJJT19mcmVlKGluKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYKKworaW50IFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX0FTTjEoU1NMX0NUWCAqY3R4LCBpbnQgbGVuLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkKQorCXsKKwlYNTA5ICp4OworCWludCByZXQ7CisKKwl4PWQyaV9YNTA5KE5VTEwsJmQsKGxvbmcpbGVuKTsKKwlpZiAoeCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURV9BU04xLEVSUl9SX0FTTjFfTElCKTsKKwkJcmV0dXJuKDApOworCQl9CisKKwlyZXQ9U1NMX0NUWF91c2VfY2VydGlmaWNhdGUoY3R4LHgpOworCVg1MDlfZnJlZSh4KTsKKwlyZXR1cm4ocmV0KTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK2ludCBTU0xfQ1RYX3VzZV9SU0FQcml2YXRlS2V5KFNTTF9DVFggKmN0eCwgUlNBICpyc2EpCisJeworCWludCByZXQ7CisJRVZQX1BLRVkgKnBrZXk7CisKKwlpZiAocnNhID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX1JTQVBSSVZBVEVLRVksRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKCFzc2xfY2VydF9pbnN0KCZjdHgtPmNlcnQpKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9SU0FQUklWQVRFS0VZLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKChwa2V5PUVWUF9QS0VZX25ldygpKSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9SU0FQUklWQVRFS0VZLEVSUl9SX0VWUF9MSUIpOworCQlyZXR1cm4oMCk7CisJCX0KKworCVJTQV91cF9yZWYocnNhKTsKKwlFVlBfUEtFWV9hc3NpZ25fUlNBKHBrZXkscnNhKTsKKworCXJldD1zc2xfc2V0X3BrZXkoY3R4LT5jZXJ0LCBwa2V5KTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCXJldHVybihyZXQpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1NURElPCitpbnQgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCisJeworCWludCBqLHJldD0wOworCUJJTyAqaW47CisJUlNBICpyc2E9TlVMTDsKKworCWluPUJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKTsKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9VU0VfUlNBUFJJVkFURUtFWV9GSUxFLEVSUl9SX0JVRl9MSUIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGZpbGUpIDw9IDApCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX1JTQVBSSVZBVEVLRVlfRklMRSxFUlJfUl9TWVNfTElCKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZgkodHlwZSA9PSBTU0xfRklMRVRZUEVfQVNOMSkKKwkJeworCQlqPUVSUl9SX0FTTjFfTElCOworCQlyc2E9ZDJpX1JTQVByaXZhdGVLZXlfYmlvKGluLE5VTEwpOworCQl9CisJZWxzZSBpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfUEVNKQorCQl7CisJCWo9RVJSX1JfUEVNX0xJQjsKKwkJcnNhPVBFTV9yZWFkX2Jpb19SU0FQcml2YXRlS2V5KGluLE5VTEwsCisJCQljdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrLGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEpOworCQl9CisJZWxzZQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9SU0FQUklWQVRFS0VZX0ZJTEUsU1NMX1JfQkFEX1NTTF9GSUxFVFlQRSk7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKHJzYSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9SU0FQUklWQVRFS0VZX0ZJTEUsaik7CisJCWdvdG8gZW5kOworCQl9CisJcmV0PVNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXkoY3R4LHJzYSk7CisJUlNBX2ZyZWUocnNhKTsKK2VuZDoKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCXJldHVybihyZXQpOworCX0KKyNlbmRpZgorCitpbnQgU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9BU04xKFNTTF9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqZCwgbG9uZyBsZW4pCisJeworCWludCByZXQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcDsKKwlSU0EgKnJzYTsKKworCXA9ZDsKKwlpZiAoKHJzYT1kMmlfUlNBUHJpdmF0ZUtleShOVUxMLCZwLChsb25nKWxlbikpID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX1JTQVBSSVZBVEVLRVlfQVNOMSxFUlJfUl9BU04xX0xJQik7CisJCXJldHVybigwKTsKKwkJfQorCisJcmV0PVNTTF9DVFhfdXNlX1JTQVByaXZhdGVLZXkoY3R4LHJzYSk7CisJUlNBX2ZyZWUocnNhKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYgLyogIU9QRU5TU0xfTk9fUlNBICovCisKK2ludCBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KFNTTF9DVFggKmN0eCwgRVZQX1BLRVkgKnBrZXkpCisJeworCWlmIChwa2V5ID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX1BSSVZBVEVLRVksRVJSX1JfUEFTU0VEX05VTExfUEFSQU1FVEVSKTsKKwkJcmV0dXJuKDApOworCQl9CisJaWYgKCFzc2xfY2VydF9pbnN0KCZjdHgtPmNlcnQpKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9QUklWQVRFS0VZLEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJcmV0dXJuKDApOworCQl9CisJcmV0dXJuKHNzbF9zZXRfcGtleShjdHgtPmNlcnQscGtleSkpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1NURElPCitpbnQgU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSwgaW50IHR5cGUpCisJeworCWludCBqLHJldD0wOworCUJJTyAqaW47CisJRVZQX1BLRVkgKnBrZXk9TlVMTDsKKworCWluPUJJT19uZXcoQklPX3NfZmlsZV9pbnRlcm5hbCgpKTsKKwlpZiAoaW4gPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9VU0VfUFJJVkFURUtFWV9GSUxFLEVSUl9SX0JVRl9MSUIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKEJJT19yZWFkX2ZpbGVuYW1lKGluLGZpbGUpIDw9IDApCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX1BSSVZBVEVLRVlfRklMRSxFUlJfUl9TWVNfTElCKTsKKwkJZ290byBlbmQ7CisJCX0KKwlpZiAodHlwZSA9PSBTU0xfRklMRVRZUEVfUEVNKQorCQl7CisJCWo9RVJSX1JfUEVNX0xJQjsKKwkJcGtleT1QRU1fcmVhZF9iaW9fUHJpdmF0ZUtleShpbixOVUxMLAorCQkJY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjayxjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKKwkJfQorCWVsc2UgaWYgKHR5cGUgPT0gU1NMX0ZJTEVUWVBFX0FTTjEpCisJCXsKKwkJaiA9IEVSUl9SX0FTTjFfTElCOworCQlwa2V5ID0gZDJpX1ByaXZhdGVLZXlfYmlvKGluLE5VTEwpOworCQl9CisJZWxzZQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9QUklWQVRFS0VZX0ZJTEUsU1NMX1JfQkFEX1NTTF9GSUxFVFlQRSk7CisJCWdvdG8gZW5kOworCQl9CisJaWYgKHBrZXkgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9VU0VfUFJJVkFURUtFWV9GSUxFLGopOworCQlnb3RvIGVuZDsKKwkJfQorCXJldD1TU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KGN0eCxwa2V5KTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworZW5kOgorCWlmIChpbiAhPSBOVUxMKSBCSU9fZnJlZShpbik7CisJcmV0dXJuKHJldCk7CisJfQorI2VuZGlmCisKK2ludCBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X0FTTjEoaW50IHR5cGUsIFNTTF9DVFggKmN0eCwgY29uc3QgdW5zaWduZWQgY2hhciAqZCwKKwkgICAgIGxvbmcgbGVuKQorCXsKKwlpbnQgcmV0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJRVZQX1BLRVkgKnBrZXk7CisKKwlwPWQ7CisJaWYgKChwa2V5PWQyaV9Qcml2YXRlS2V5KHR5cGUsTlVMTCwmcCwobG9uZylsZW4pKSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9QUklWQVRFS0VZX0FTTjEsRVJSX1JfQVNOMV9MSUIpOworCQlyZXR1cm4oMCk7CisJCX0KKworCXJldD1TU0xfQ1RYX3VzZV9Qcml2YXRlS2V5KGN0eCxwa2V5KTsKKwlFVlBfUEtFWV9mcmVlKHBrZXkpOworCXJldHVybihyZXQpOworCX0KKworCitpbnQgU1NMX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbihTU0wgKnNzbCwgU1RBQ0tfT0YoWDUwOSkgKmNlcnRfY2hhaW4pCisJeworCWlmIChzc2wgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURV9DSEFJTixFUlJfUl9QQVNTRURfTlVMTF9QQVJBTUVURVIpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoc3NsLT5jZXJ0ID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9VU0VfQ0VSVElGSUNBVEVfQ0hBSU4sU1NMX1JfTk9fQ0VSVElGSUNBVEVfQVNTSUdORUQpOworCQlyZXR1cm4oMCk7CisJCX0KKwlpZiAoc3NsLT5jZXJ0LT5rZXkgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX1VTRV9DRVJUSUZJQ0FURV9DSEFJTixTU0xfUl9OT19DRVJUSUZJQ0FURV9BU1NJR05FRCk7CisJCXJldHVybigwKTsKKwkJfQorCXNzbC0+Y2VydC0+a2V5LT5jZXJ0X2NoYWluID0gY2VydF9jaGFpbjsKKwlyZXR1cm4oMSk7CisJfQorCitTVEFDS19PRihYNTA5KSAqU1NMX2dldF9jZXJ0aWZpY2F0ZV9jaGFpbihTU0wgKnNzbCwgWDUwOSAqeCkKKwl7CisJaW50IGk7CisJaWYgKHggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNzbCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc3NsLT5jZXJ0ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBTU0xfUEtFWV9OVU07IGkrKykKKwkJaWYgKHNzbC0+Y2VydC0+cGtleXNbaV0ueDUwOSA9PSB4KQorCQkJcmV0dXJuIHNzbC0+Y2VydC0+cGtleXNbaV0uY2VydF9jaGFpbjsKKwlyZXR1cm4gTlVMTDsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19TVERJTworLyogUmVhZCBhIGZpbGUgdGhhdCBjb250YWlucyBvdXIgY2VydGlmaWNhdGUgaW4gIlBFTSIgZm9ybWF0LAorICogcG9zc2libHkgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiBDQSBjZXJ0aWZpY2F0ZXMgdGhhdCBzaG91bGQgYmUKKyAqIHNlbnQgdG8gdGhlIHBlZXIgaW4gdGhlIENlcnRpZmljYXRlIG1lc3NhZ2UuCisgKi8KK2ludCBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKFNTTF9DVFggKmN0eCwgY29uc3QgY2hhciAqZmlsZSkKKwl7CisJQklPICppbjsKKwlpbnQgcmV0PTA7CisJWDUwOSAqeD1OVUxMOworCisJRVJSX2NsZWFyX2Vycm9yKCk7IC8qIGNsZWFyIGVycm9yIHN0YWNrIGZvciBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZSgpICovCisKKwlpbj1CSU9fbmV3KEJJT19zX2ZpbGVfaW50ZXJuYWwoKSk7CisJaWYgKGluID09IE5VTEwpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfVVNFX0NFUlRJRklDQVRFX0NIQUlOX0ZJTEUsRVJSX1JfQlVGX0xJQik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoQklPX3JlYWRfZmlsZW5hbWUoaW4sZmlsZSkgPD0gMCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfU1NMX0NUWF9VU0VfQ0VSVElGSUNBVEVfQ0hBSU5fRklMRSxFUlJfUl9TWVNfTElCKTsKKwkJZ290byBlbmQ7CisJCX0KKworCXg9UEVNX3JlYWRfYmlvX1g1MDlfQVVYKGluLE5VTEwsY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjayxjdHgtPmRlZmF1bHRfcGFzc3dkX2NhbGxiYWNrX3VzZXJkYXRhKTsKKwlpZiAoeCA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1VTRV9DRVJUSUZJQ0FURV9DSEFJTl9GSUxFLEVSUl9SX1BFTV9MSUIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJcmV0PVNTTF9DVFhfdXNlX2NlcnRpZmljYXRlKGN0eCx4KTsKKwlpZiAoRVJSX3BlZWtfZXJyb3IoKSAhPSAwKQorCQlyZXQgPSAwOyAgLyogS2V5L2NlcnRpZmljYXRlIG1pc21hdGNoIGRvZXNuJ3QgaW1wbHkgcmV0PT0wIC4uLiAqLworCWlmIChyZXQpCisJCXsKKwkJLyogSWYgd2UgY291bGQgc2V0IHVwIG91ciBjZXJ0aWZpY2F0ZSwgbm93IHByb2NlZWQgdG8KKwkJICogdGhlIENBIGNlcnRpZmljYXRlcy4KKwkJICovCisJCVg1MDkgKmNhOworCQlpbnQgcjsKKwkJdW5zaWduZWQgbG9uZyBlcnI7CisJCQorCQlpZiAoY3R4LT5leHRyYV9jZXJ0cyAhPSBOVUxMKSAKKwkJCXsKKwkJCXNrX1g1MDlfcG9wX2ZyZWUoY3R4LT5leHRyYV9jZXJ0cywgWDUwOV9mcmVlKTsKKwkJCWN0eC0+ZXh0cmFfY2VydHMgPSBOVUxMOworCQkJfQorCisJCXdoaWxlICgoY2EgPSBQRU1fcmVhZF9iaW9fWDUwOShpbixOVUxMLGN0eC0+ZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2ssY3R4LT5kZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YSkpCisJCQkhPSBOVUxMKQorCQkJeworCQkJciA9IFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoY3R4LCBjYSk7CisJCQlpZiAoIXIpIAorCQkJCXsKKwkJCQlYNTA5X2ZyZWUoY2EpOworCQkJCXJldCA9IDA7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJLyogTm90ZSB0aGF0IHdlIG11c3Qgbm90IGZyZWUgciBpZiBpdCB3YXMgc3VjY2Vzc2Z1bGx5CisJCQkgKiBhZGRlZCB0byB0aGUgY2hhaW4gKHdoaWxlIHdlIG11c3QgZnJlZSB0aGUgbWFpbgorCQkJICogY2VydGlmaWNhdGUsIHNpbmNlIGl0cyByZWZlcmVuY2UgY291bnQgaXMgaW5jcmVhc2VkCisJCQkgKiBieSBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZSkuICovCisJCQl9CisJCS8qIFdoZW4gdGhlIHdoaWxlIGxvb3AgZW5kcywgaXQncyB1c3VhbGx5IGp1c3QgRU9GLiAqLworCQllcnIgPSBFUlJfcGVla19sYXN0X2Vycm9yKCk7CisJCWlmIChFUlJfR0VUX0xJQihlcnIpID09IEVSUl9MSUJfUEVNICYmIEVSUl9HRVRfUkVBU09OKGVycikgPT0gUEVNX1JfTk9fU1RBUlRfTElORSkKKwkJCUVSUl9jbGVhcl9lcnJvcigpOworCQllbHNlIAorCQkJcmV0ID0gMDsgLyogc29tZSByZWFsIGVycm9yICovCisJCX0KKworZW5kOgorCWlmICh4ICE9IE5VTEwpIFg1MDlfZnJlZSh4KTsKKwlpZiAoaW4gIT0gTlVMTCkgQklPX2ZyZWUoaW4pOworCXJldHVybihyZXQpOworCX0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3NzbF9zZXNzLmMgYi9saWIvb3BlbnNzbC9zc2wvc3NsX3Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk1NGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbF9zZXNzLmMKQEAgLTAsMCArMSwxMTAyIEBACisvKiBzc2wvc3NsX3Nlc3MuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA2IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDUgTm9raWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIHBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGlzIGRldmVsb3BlZCBieQorICogTm9raWEgQ29ycG9yYXRpb24gYW5kIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlLgorICoKKyAqIFRoZSBDb250cmlidXRpb24sIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZgorICogTm9raWEgQ29ycG9yYXRpb24sIGNvbnNpc3RzIG9mIHRoZSAiUFNLIiAoUHJlLVNoYXJlZCBLZXkpIGNpcGhlcnN1aXRlcworICogc3VwcG9ydCAoc2VlIFJGQyA0Mjc5KSB0byBPcGVuU1NMLgorICoKKyAqIE5vIHBhdGVudCBsaWNlbnNlcyBvciBvdGhlciByaWdodHMgZXhjZXB0IHRob3NlIGV4cHJlc3NseSBzdGF0ZWQgaW4KKyAqIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlIGxpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIGdyYW50ZWQgb3IgcmVjZWl2ZWQKKyAqIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsLCBvciBvdGhlcndpc2UuCisgKgorICogTm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgTm9raWEgdGhhdCB0aGUgQ29udHJpYnV0aW9uIGRvZXMgbm90CisgKiBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IHRoaXJkCisgKiBwYXJ0eSBvciB0aGF0IHRoZSBsaWNlbnNlIHByb3ZpZGVzIHlvdSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHJpZ2h0cworICogdG8gbWFrZSB1c2Ugb2YgdGhlIENvbnRyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELiBJTgorICogQURESVRJT04gVE8gVEhFIERJU0NMQUlNRVJTIElOQ0xVREVEIElOIFRIRSBMSUNFTlNFLCBOT0tJQQorICogU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIEZPUiBDTEFJTVMgQlJPVUdIVCBCWSBZT1UgT1IgQU5ZCisgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKKyAqIE9USEVSV0lTRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2xoYXNoLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisKK3N0YXRpYyB2b2lkIFNTTF9TRVNTSU9OX2xpc3RfcmVtb3ZlKFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnMpOworc3RhdGljIHZvaWQgU1NMX1NFU1NJT05fbGlzdF9hZGQoU1NMX0NUWCAqY3R4LFNTTF9TRVNTSU9OICpzKTsKK3N0YXRpYyBpbnQgcmVtb3ZlX3Nlc3Npb25fbG9jayhTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpjLCBpbnQgbGNrKTsKKworU1NMX1NFU1NJT04gKlNTTF9nZXRfc2Vzc2lvbihjb25zdCBTU0wgKnNzbCkKKy8qIGFrYSBTU0xfZ2V0MF9zZXNzaW9uOyBnZXRzIDAgb2JqZWN0cywganVzdCByZXR1cm5zIGEgY29weSBvZiB0aGUgcG9pbnRlciAqLworCXsKKwlyZXR1cm4oc3NsLT5zZXNzaW9uKTsKKwl9CisKK1NTTF9TRVNTSU9OICpTU0xfZ2V0MV9zZXNzaW9uKFNTTCAqc3NsKQorLyogdmFyaWFudCBvZiBTU0xfZ2V0X3Nlc3Npb246IGNhbGxlciByZWFsbHkgZ2V0cyBzb21ldGhpbmcgKi8KKwl7CisJU1NMX1NFU1NJT04gKnNlc3M7CisJLyogTmVlZCB0byBsb2NrIHRoaXMgYWxsIHVwIHJhdGhlciB0aGFuIGp1c3QgdXNlIENSWVBUT19hZGQgc28gdGhhdAorCSAqIHNvbWVib2R5IGRvZXNuJ3QgZnJlZSBzc2wtPnNlc3Npb24gYmV0d2VlbiB3aGVuIHdlIGNoZWNrIGl0J3MKKwkgKiBub24tbnVsbCBhbmQgd2hlbiB3ZSB1cCB0aGUgcmVmZXJlbmNlIGNvdW50LiAqLworCUNSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfU1NMX1NFU1NJT04pOworCXNlc3MgPSBzc2wtPnNlc3Npb247CisJaWYoc2VzcykKKwkJc2Vzcy0+cmVmZXJlbmNlcysrOworCUNSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19TU0xfU0VTU0lPTik7CisJcmV0dXJuKHNlc3MpOworCX0KKworaW50IFNTTF9TRVNTSU9OX2dldF9leF9uZXdfaW5kZXgobG9uZyBhcmdsLCB2b2lkICphcmdwLCBDUllQVE9fRVhfbmV3ICpuZXdfZnVuYywKKwkgICAgIENSWVBUT19FWF9kdXAgKmR1cF9mdW5jLCBDUllQVE9fRVhfZnJlZSAqZnJlZV9mdW5jKQorCXsKKwlyZXR1cm4gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoQ1JZUFRPX0VYX0lOREVYX1NTTF9TRVNTSU9OLCBhcmdsLCBhcmdwLAorCQkJbmV3X2Z1bmMsIGR1cF9mdW5jLCBmcmVlX2Z1bmMpOworCX0KKworaW50IFNTTF9TRVNTSU9OX3NldF9leF9kYXRhKFNTTF9TRVNTSU9OICpzLCBpbnQgaWR4LCB2b2lkICphcmcpCisJeworCXJldHVybihDUllQVE9fc2V0X2V4X2RhdGEoJnMtPmV4X2RhdGEsaWR4LGFyZykpOworCX0KKwordm9pZCAqU1NMX1NFU1NJT05fZ2V0X2V4X2RhdGEoY29uc3QgU1NMX1NFU1NJT04gKnMsIGludCBpZHgpCisJeworCXJldHVybihDUllQVE9fZ2V0X2V4X2RhdGEoJnMtPmV4X2RhdGEsaWR4KSk7CisJfQorCitTU0xfU0VTU0lPTiAqU1NMX1NFU1NJT05fbmV3KHZvaWQpCisJeworCVNTTF9TRVNTSU9OICpzczsKKworCXNzPShTU0xfU0VTU0lPTiAqKU9QRU5TU0xfbWFsbG9jKHNpemVvZihTU0xfU0VTU0lPTikpOworCWlmIChzcyA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfU0VTU0lPTl9ORVcsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlyZXR1cm4oMCk7CisJCX0KKwltZW1zZXQoc3MsMCxzaXplb2YoU1NMX1NFU1NJT04pKTsKKworCXNzLT52ZXJpZnlfcmVzdWx0ID0gMTsgLyogYXZvaWQgMCAoPSBYNTA5X1ZfT0spIGp1c3QgaW4gY2FzZSAqLworCXNzLT5yZWZlcmVuY2VzPTE7CisJc3MtPnRpbWVvdXQ9NjAqNSs0OyAvKiA1IG1pbnV0ZSB0aW1lb3V0IGJ5IGRlZmF1bHQgKi8KKwlzcy0+dGltZT0odW5zaWduZWQgbG9uZyl0aW1lKE5VTEwpOworCXNzLT5wcmV2PU5VTEw7CisJc3MtPm5leHQ9TlVMTDsKKwlzcy0+Y29tcHJlc3NfbWV0aD0wOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCXNzLT50bHNleHRfaG9zdG5hbWUgPSBOVUxMOyAKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCXNzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoID0gMDsKKwlzcy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ID0gTlVMTDsKKwlzcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA9IDA7CisJc3MtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCA9IE5VTEw7CisjZW5kaWYKKyNlbmRpZgorCUNSWVBUT19uZXdfZXhfZGF0YShDUllQVE9fRVhfSU5ERVhfU1NMX1NFU1NJT04sIHNzLCAmc3MtPmV4X2RhdGEpOworI2lmbmRlZiBPUEVOU1NMX05PX1BTSworCXNzLT5wc2tfaWRlbnRpdHlfaGludD1OVUxMOworCXNzLT5wc2tfaWRlbnRpdHk9TlVMTDsKKyNlbmRpZgorCXJldHVybihzcyk7CisJfQorCitjb25zdCB1bnNpZ25lZCBjaGFyICpTU0xfU0VTU0lPTl9nZXRfaWQoY29uc3QgU1NMX1NFU1NJT04gKnMsIHVuc2lnbmVkIGludCAqbGVuKQorCXsKKwlpZihsZW4pCisJCSpsZW4gPSBzLT5zZXNzaW9uX2lkX2xlbmd0aDsKKwlyZXR1cm4gcy0+c2Vzc2lvbl9pZDsKKwl9CisKKy8qIEV2ZW4gd2l0aCBTU0x2Miwgd2UgaGF2ZSAxNiBieXRlcyAoMTI4IGJpdHMpIG9mIHNlc3Npb24gSUQgc3BhY2UuIFNTTHYzL1RMU3YxCisgKiBoYXMgMzIgYnl0ZXMgKDI1NiBiaXRzKS4gQXMgc3VjaCwgZmlsbGluZyB0aGUgSUQgd2l0aCByYW5kb20gZ3VuayByZXBlYXRlZGx5CisgKiB1bnRpbCB3ZSBoYXZlIG5vIGNvbmZsaWN0IGlzIGdvaW5nIHRvIGNvbXBsZXRlIGluIG9uZSBpdGVyYXRpb24gcHJldHR5IG11Y2gKKyAqICJtb3N0IiBvZiB0aGUgdGltZSAoYnR3OiB1bmRlcnN0YXRlbWVudCkuIFNvLCBpZiBpdCB0YWtlcyB1cyAxMCBpdGVyYXRpb25zCisgKiBhbmQgd2Ugc3RpbGwgY2FuJ3QgYXZvaWQgYSBjb25mbGljdCAtIHdlbGwgdGhhdCdzIGEgcmVhc29uYWJsZSBwb2ludCB0byBjYWxsCisgKiBpdCBxdWl0cy4gRWl0aGVyIHRoZSBSQU5EIGNvZGUgaXMgYnJva2VuIG9yIHNvbWVvbmUgaXMgdHJ5aW5nIHRvIG9wZW4gcm91Z2hseQorICogdmVyeSBjbG9zZSB0byAyXjEyOCAob3IgMl4yNTYpIFNTTCBzZXNzaW9ucyB0byBvdXIgc2VydmVyLiBIb3cgeW91IG1pZ2h0CisgKiBzdG9yZSB0aGF0IG1hbnkgc2Vzc2lvbnMgaXMgcGVyaGFwcyBhIG1vcmUgaW50ZXJlc3RpbmcgcXVlc3Rpb24gLi4uICovCisKKyNkZWZpbmUgTUFYX1NFU1NfSURfQVRURU1QVFMgMTAKK3N0YXRpYyBpbnQgZGVmX2dlbmVyYXRlX3Nlc3Npb25faWQoY29uc3QgU1NMICpzc2wsIHVuc2lnbmVkIGNoYXIgKmlkLAorCQkJCXVuc2lnbmVkIGludCAqaWRfbGVuKQoreworCXVuc2lnbmVkIGludCByZXRyeSA9IDA7CisJZG8KKwkJaWYgKFJBTkRfcHNldWRvX2J5dGVzKGlkLCAqaWRfbGVuKSA8PSAwKQorCQkJcmV0dXJuIDA7CisJd2hpbGUoU1NMX2hhc19tYXRjaGluZ19zZXNzaW9uX2lkKHNzbCwgaWQsICppZF9sZW4pICYmCisJCSgrK3JldHJ5IDwgTUFYX1NFU1NfSURfQVRURU1QVFMpKTsKKwlpZihyZXRyeSA8IE1BWF9TRVNTX0lEX0FUVEVNUFRTKQorCQlyZXR1cm4gMTsKKwkvKiBlbHNlIC0gd29vcHMgYSBzZXNzaW9uX2lkIG1hdGNoICovCisJLyogWFhYIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBleHRlcm5hbCBjYWNoZSAtLQorCSAqIGJ1dCB0aGUgcHJvYmFiaWxpdHkgb2YgYSBjb2xsaXNpb24gaXMgbmVnbGlnaWJsZSwgYW5kCisJICogd2UgY291bGQgbm90IHByZXZlbnQgdGhlIGNvbmN1cnJlbnQgY3JlYXRpb24gb2Ygc2Vzc2lvbnMKKwkgKiB3aXRoIGlkZW50aWNhbCBJRHMgc2luY2Ugd2UgY3VycmVudGx5IGRvbid0IGhhdmUgbWVhbnMKKwkgKiB0byBhdG9taWNhbGx5IGNoZWNrIHdoZXRoZXIgYSBzZXNzaW9uIElEIGFscmVhZHkgZXhpc3RzCisJICogYW5kIG1ha2UgYSByZXNlcnZhdGlvbiBmb3IgaXQgaWYgaXQgZG9lcyBub3QKKwkgKiAodGhpcyBwcm9ibGVtIGFwcGxpZXMgdG8gdGhlIGludGVybmFsIGNhY2hlIGFzIHdlbGwpLgorCSAqLworCXJldHVybiAwOworfQorCit2b2lkIFNTTF9zZXRfc2Vzc2lvbl9jcmVhdGlvbl9lbmFibGVkIChTU0wgKnMsIGludCBjcmVhdGlvbl9lbmFibGVkKQorCXsKKwlzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQgPSBjcmVhdGlvbl9lbmFibGVkOworCX0KKworaW50IHNzbF9nZXRfbmV3X3Nlc3Npb24oU1NMICpzLCBpbnQgc2Vzc2lvbikKKwl7CisJLyogVGhpcyBnZXRzIHVzZWQgYnkgY2xpZW50cyBhbmQgc2VydmVycy4gKi8KKworCXVuc2lnbmVkIGludCB0bXA7CisJU1NMX1NFU1NJT04gKnNzPU5VTEw7CisJR0VOX1NFU1NJT05fQ0IgY2IgPSBkZWZfZ2VuZXJhdGVfc2Vzc2lvbl9pZDsKKworCS8qIGNhbGxlciBzaG91bGQgY2hlY2sgdGhpcyBpZiB0aGV5IGNhbiBkbyBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcgKi8KKyAgICAgICAgaWYgKCFzLT5zZXNzaW9uX2NyZWF0aW9uX2VuYWJsZWQpIHJldHVybigwKTsKKwlpZiAoKHNzPVNTTF9TRVNTSU9OX25ldygpKSA9PSBOVUxMKSByZXR1cm4oMCk7CisKKwkvKiBJZiB0aGUgY29udGV4dCBoYXMgYSBkZWZhdWx0IHRpbWVvdXQsIHVzZSBpdCAqLworCWlmIChzLT5zZXNzaW9uX2N0eC0+c2Vzc2lvbl90aW1lb3V0ID09IDApCisJCXNzLT50aW1lb3V0PVNTTF9nZXRfZGVmYXVsdF90aW1lb3V0KHMpOworCWVsc2UKKwkJc3MtPnRpbWVvdXQ9cy0+c2Vzc2lvbl9jdHgtPnNlc3Npb25fdGltZW91dDsKKworCWlmIChzLT5zZXNzaW9uICE9IE5VTEwpCisJCXsKKwkJU1NMX1NFU1NJT05fZnJlZShzLT5zZXNzaW9uKTsKKwkJcy0+c2Vzc2lvbj1OVUxMOworCQl9CisKKwlpZiAoc2Vzc2lvbikKKwkJeworCQlpZiAocy0+dmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pCisJCQl7CisJCQlzcy0+c3NsX3ZlcnNpb249U1NMMl9WRVJTSU9OOworCQkJc3MtPnNlc3Npb25faWRfbGVuZ3RoPVNTTDJfU1NMX1NFU1NJT05fSURfTEVOR1RIOworCQkJfQorCQllbHNlIGlmIChzLT52ZXJzaW9uID09IFNTTDNfVkVSU0lPTikKKwkJCXsKKwkJCXNzLT5zc2xfdmVyc2lvbj1TU0wzX1ZFUlNJT047CisJCQlzcy0+c2Vzc2lvbl9pZF9sZW5ndGg9U1NMM19TU0xfU0VTU0lPTl9JRF9MRU5HVEg7CisJCQl9CisJCWVsc2UgaWYgKHMtPnZlcnNpb24gPT0gVExTMV9WRVJTSU9OKQorCQkJeworCQkJc3MtPnNzbF92ZXJzaW9uPVRMUzFfVkVSU0lPTjsKKwkJCXNzLT5zZXNzaW9uX2lkX2xlbmd0aD1TU0wzX1NTTF9TRVNTSU9OX0lEX0xFTkdUSDsKKwkJCX0KKwkJZWxzZSBpZiAocy0+dmVyc2lvbiA9PSBEVExTMV9CQURfVkVSKQorCQkJeworCQkJc3MtPnNzbF92ZXJzaW9uPURUTFMxX0JBRF9WRVI7CisJCQlzcy0+c2Vzc2lvbl9pZF9sZW5ndGg9U1NMM19TU0xfU0VTU0lPTl9JRF9MRU5HVEg7CisJCQl9CisJCWVsc2UgaWYgKHMtPnZlcnNpb24gPT0gRFRMUzFfVkVSU0lPTikKKwkJCXsKKwkJCXNzLT5zc2xfdmVyc2lvbj1EVExTMV9WRVJTSU9OOworCQkJc3MtPnNlc3Npb25faWRfbGVuZ3RoPVNTTDNfU1NMX1NFU1NJT05fSURfTEVOR1RIOworCQkJfQorCQllbHNlCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMX0dFVF9ORVdfU0VTU0lPTixTU0xfUl9VTlNVUFBPUlRFRF9TU0xfVkVSU0lPTik7CisJCQlTU0xfU0VTU0lPTl9mcmVlKHNzKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJLyogSWYgUkZDNDUwNyB0aWNrZXQgdXNlIGVtcHR5IHNlc3Npb24gSUQgKi8KKwkJaWYgKHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQpCisJCQl7CisJCQlzcy0+c2Vzc2lvbl9pZF9sZW5ndGggPSAwOworCQkJZ290byBzZXNzX2lkX2RvbmU7CisJCQl9CisjZW5kaWYKKwkJLyogQ2hvb3NlIHdoaWNoIGNhbGxiYWNrIHdpbGwgc2V0IHRoZSBzZXNzaW9uIElEICovCisJCUNSWVBUT19yX2xvY2soQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJCWlmKHMtPmdlbmVyYXRlX3Nlc3Npb25faWQpCisJCQljYiA9IHMtPmdlbmVyYXRlX3Nlc3Npb25faWQ7CisJCWVsc2UgaWYocy0+c2Vzc2lvbl9jdHgtPmdlbmVyYXRlX3Nlc3Npb25faWQpCisJCQljYiA9IHMtPnNlc3Npb25fY3R4LT5nZW5lcmF0ZV9zZXNzaW9uX2lkOworCQlDUllQVE9fcl91bmxvY2soQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJCS8qIENob29zZSBhIHNlc3Npb24gSUQgKi8KKwkJdG1wID0gc3MtPnNlc3Npb25faWRfbGVuZ3RoOworCQlpZighY2Iocywgc3MtPnNlc3Npb25faWQsICZ0bXApKQorCQkJeworCQkJLyogVGhlIGNhbGxiYWNrIGZhaWxlZCAqLworCQkJU1NMZXJyKFNTTF9GX1NTTF9HRVRfTkVXX1NFU1NJT04sCisJCQkJU1NMX1JfU1NMX1NFU1NJT05fSURfQ0FMTEJBQ0tfRkFJTEVEKTsKKwkJCVNTTF9TRVNTSU9OX2ZyZWUoc3MpOworCQkJcmV0dXJuKDApOworCQkJfQorCQkvKiBEb24ndCBhbGxvdyB0aGUgY2FsbGJhY2sgdG8gc2V0IHRoZSBzZXNzaW9uIGxlbmd0aCB0byB6ZXJvLgorCQkgKiBub3Igc2V0IGl0IGhpZ2hlciB0aGFuIGl0IHdhcy4gKi8KKwkJaWYoIXRtcCB8fCAodG1wID4gc3MtPnNlc3Npb25faWRfbGVuZ3RoKSkKKwkJCXsKKwkJCS8qIFRoZSBjYWxsYmFjayBzZXQgYW4gaWxsZWdhbCBsZW5ndGggKi8KKwkJCVNTTGVycihTU0xfRl9TU0xfR0VUX05FV19TRVNTSU9OLAorCQkJCVNTTF9SX1NTTF9TRVNTSU9OX0lEX0hBU19CQURfTEVOR1RIKTsKKwkJCVNTTF9TRVNTSU9OX2ZyZWUoc3MpOworCQkJcmV0dXJuKDApOworCQkJfQorCQkvKiBJZiB0aGUgc2Vzc2lvbiBsZW5ndGggd2FzIHNocnVuayBhbmQgd2UncmUgU1NMdjIsIHBhZCBpdCAqLworCQlpZigodG1wIDwgc3MtPnNlc3Npb25faWRfbGVuZ3RoKSAmJiAocy0+dmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pKQorCQkJbWVtc2V0KHNzLT5zZXNzaW9uX2lkICsgdG1wLCAwLCBzcy0+c2Vzc2lvbl9pZF9sZW5ndGggLSB0bXApOworCQllbHNlCisJCQlzcy0+c2Vzc2lvbl9pZF9sZW5ndGggPSB0bXA7CisJCS8qIEZpbmFsbHksIGNoZWNrIGZvciBhIGNvbmZsaWN0ICovCisJCWlmKFNTTF9oYXNfbWF0Y2hpbmdfc2Vzc2lvbl9pZChzLCBzcy0+c2Vzc2lvbl9pZCwKKwkJCQkJCXNzLT5zZXNzaW9uX2lkX2xlbmd0aCkpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMX0dFVF9ORVdfU0VTU0lPTiwKKwkJCQlTU0xfUl9TU0xfU0VTU0lPTl9JRF9DT05GTElDVCk7CisJCQlTU0xfU0VTU0lPTl9mcmVlKHNzKTsKKwkJCXJldHVybigwKTsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwkJc2Vzc19pZF9kb25lOgorCQlpZiAocy0+dGxzZXh0X2hvc3RuYW1lKSB7CisJCQlzcy0+dGxzZXh0X2hvc3RuYW1lID0gQlVGX3N0cmR1cChzLT50bHNleHRfaG9zdG5hbWUpOworCQkJaWYgKHNzLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCkgeworCQkJCVNTTGVycihTU0xfRl9TU0xfR0VUX05FV19TRVNTSU9OLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCQkJU1NMX1NFU1NJT05fZnJlZShzcyk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0VDCisJCWlmIChzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QpCisJCQl7CisJCQlpZiAoc3MtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoc3MtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CisJCQlpZiAoKHNzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgPSBPUEVOU1NMX21hbGxvYyhzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKSkgPT0gTlVMTCkKKwkJCQl7CisJCQkJU1NMZXJyKFNTTF9GX1NTTF9HRVRfTkVXX1NFU1NJT04sIEVSUl9SX01BTExPQ19GQUlMVVJFKTsKKwkJCQlTU0xfU0VTU0lPTl9mcmVlKHNzKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlzcy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA9IHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGg7CisJCQltZW1jcHkoc3MtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCwgcy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0LCBzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKTsKKwkJCX0KKwkJaWYgKHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCkKKwkJCXsKKwkJCWlmIChzcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0ICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0KTsKKwkJCWlmICgoc3MtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCA9IE9QRU5TU0xfbWFsbG9jKHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGgpKSA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfU1NMX0dFVF9ORVdfU0VTU0lPTiwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCVNTTF9TRVNTSU9OX2ZyZWUoc3MpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCXNzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoID0gcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aDsKKwkJCW1lbWNweShzcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0LCBzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QsIHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGgpOworCQkJfQorI2VuZGlmCisjZW5kaWYKKwkJfQorCWVsc2UKKwkJeworCQlzcy0+c2Vzc2lvbl9pZF9sZW5ndGg9MDsKKwkJfQorCisJaWYgKHMtPnNpZF9jdHhfbGVuZ3RoID4gc2l6ZW9mIHNzLT5zaWRfY3R4KQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfR0VUX05FV19TRVNTSU9OLCBFUlJfUl9JTlRFUk5BTF9FUlJPUik7CisJCVNTTF9TRVNTSU9OX2ZyZWUoc3MpOworCQlyZXR1cm4gMDsKKwkJfQorCW1lbWNweShzcy0+c2lkX2N0eCxzLT5zaWRfY3R4LHMtPnNpZF9jdHhfbGVuZ3RoKTsKKwlzcy0+c2lkX2N0eF9sZW5ndGg9cy0+c2lkX2N0eF9sZW5ndGg7CisJcy0+c2Vzc2lvbj1zczsKKwlzcy0+c3NsX3ZlcnNpb249cy0+dmVyc2lvbjsKKwlzcy0+dmVyaWZ5X3Jlc3VsdCA9IFg1MDlfVl9PSzsKKworCXJldHVybigxKTsKKwl9CisKK2ludCBzc2xfZ2V0X3ByZXZfc2Vzc2lvbihTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKnNlc3Npb25faWQsIGludCBsZW4sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpsaW1pdCkKKwl7CisJLyogVGhpcyBpcyB1c2VkIG9ubHkgYnkgc2VydmVycy4gKi8KKworCVNTTF9TRVNTSU9OICpyZXQ9TlVMTDsKKwlpbnQgZmF0YWwgPSAwOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCWludCByOworI2VuZGlmCisKKwlpZiAobGVuID4gU1NMX01BWF9TU0xfU0VTU0lPTl9JRF9MRU5HVEgpCisJCWdvdG8gZXJyOworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAorCXIgPSB0bHMxX3Byb2Nlc3NfdGlja2V0KHMsIHNlc3Npb25faWQsIGxlbiwgbGltaXQsICZyZXQpOworCWlmIChyID09IC0xKQorCQl7CisJCWZhdGFsID0gMTsKKwkJZ290byBlcnI7CisJCX0KKwllbHNlIGlmIChyID09IDAgfHwgKCFyZXQgJiYgIWxlbikpCisJCWdvdG8gZXJyOworCWVsc2UgaWYgKCFyZXQgJiYgIShzLT5zZXNzaW9uX2N0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlICYgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQKSkKKyNlbHNlCisJaWYgKGxlbiA9PSAwKQorCQlnb3RvIGVycjsKKwlpZiAoIShzLT5zZXNzaW9uX2N0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlICYgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQKSkKKyNlbmRpZgorCQl7CisJCVNTTF9TRVNTSU9OIGRhdGE7CisJCWRhdGEuc3NsX3ZlcnNpb249cy0+dmVyc2lvbjsKKwkJZGF0YS5zZXNzaW9uX2lkX2xlbmd0aD1sZW47CisJCWlmIChsZW4gPT0gMCkKKwkJCXJldHVybiAwOworCQltZW1jcHkoZGF0YS5zZXNzaW9uX2lkLHNlc3Npb25faWQsbGVuKTsKKwkJQ1JZUFRPX3JfbG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKwkJcmV0PWxoX1NTTF9TRVNTSU9OX3JldHJpZXZlKHMtPnNlc3Npb25fY3R4LT5zZXNzaW9ucywmZGF0YSk7CisJCWlmIChyZXQgIT0gTlVMTCkKKwkJICAgIC8qIGRvbid0IGFsbG93IG90aGVyIHRocmVhZHMgdG8gc3RlYWwgaXQ6ICovCisJCSAgICBDUllQVE9fYWRkKCZyZXQtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19TU0xfU0VTU0lPTik7CisJCUNSWVBUT19yX3VubG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKwkJfQorCisJaWYgKHJldCA9PSBOVUxMKQorCQl7CisJCWludCBjb3B5PTE7CisJCisJCXMtPnNlc3Npb25fY3R4LT5zdGF0cy5zZXNzX21pc3MrKzsKKwkJcmV0PU5VTEw7CisJCWlmIChzLT5zZXNzaW9uX2N0eC0+Z2V0X3Nlc3Npb25fY2IgIT0gTlVMTAorCQkgICAgJiYgKHJldD1zLT5zZXNzaW9uX2N0eC0+Z2V0X3Nlc3Npb25fY2IocyxzZXNzaW9uX2lkLGxlbiwmY29weSkpCisJCSAgICAgICAhPSBOVUxMKQorCQkJeworCQkJcy0+c2Vzc2lvbl9jdHgtPnN0YXRzLnNlc3NfY2JfaGl0Kys7CisKKwkJCS8qIEluY3JlbWVudCByZWZlcmVuY2UgY291bnQgbm93IGlmIHRoZSBzZXNzaW9uIGNhbGxiYWNrCisJCQkgKiBhc2tzIHVzIHRvIGRvIHNvIChub3RlIHRoYXQgaWYgdGhlIHNlc3Npb24gc3RydWN0dXJlcworCQkJICogcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGFyZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzLAorCQkJICogaXQgbXVzdCBoYW5kbGUgdGhlIHJlZmVyZW5jZSBjb3VudCBpdHNlbGYgW2kuZS4gY29weSA9PSAwXSwKKwkJCSAqIG9yIHRoaW5ncyB3b24ndCBiZSB0aHJlYWQtc2FmZSkuICovCisJCQlpZiAoY29weSkKKwkJCQlDUllQVE9fYWRkKCZyZXQtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19TU0xfU0VTU0lPTik7CisKKwkJCS8qIEFkZCB0aGUgZXh0ZXJuYWxseSBjYWNoZWQgc2Vzc2lvbiB0byB0aGUgaW50ZXJuYWwKKwkJCSAqIGNhY2hlIGFzIHdlbGwgaWYgYW5kIG9ubHkgaWYgd2UgYXJlIHN1cHBvc2VkIHRvLiAqLworCQkJaWYoIShzLT5zZXNzaW9uX2N0eC0+c2Vzc2lvbl9jYWNoZV9tb2RlICYgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUpKQorCQkJCS8qIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCByZXR1cm4gMSwgb3RoZXJ3aXNlLAorCQkJCSAqIHRoaW5ncyBhcmUgdmVyeSBzdHJhbmdlICovCisJCQkJU1NMX0NUWF9hZGRfc2Vzc2lvbihzLT5zZXNzaW9uX2N0eCxyZXQpOworCQkJfQorCQlpZiAocmV0ID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJfQorCisJLyogTm93IHJldCBpcyBub24tTlVMTCwgYW5kIHdlIG93biBvbmUgb2YgaXRzIHJlZmVyZW5jZSBjb3VudHMuICovCisKKwlpZiAocmV0LT5zaWRfY3R4X2xlbmd0aCAhPSBzLT5zaWRfY3R4X2xlbmd0aAorCSAgICB8fCBtZW1jbXAocmV0LT5zaWRfY3R4LHMtPnNpZF9jdHgscmV0LT5zaWRfY3R4X2xlbmd0aCkpCisJCXsKKwkJLyogV2UndmUgZm91bmQgdGhlIHNlc3Npb24gbmFtZWQgYnkgdGhlIGNsaWVudCwgYnV0IHdlIGRvbid0CisJCSAqIHdhbnQgdG8gdXNlIGl0IGluIHRoaXMgY29udGV4dC4gKi8KKworI2lmIDAgLyogVGhlIGNsaWVudCBjYW5ub3QgYWx3YXlzIGtub3cgd2hlbiBhIHNlc3Npb24gaXMgbm90IGFwcHJvcHJpYXRlLAorICAgICAgICogc28gd2Ugc2hvdWxkbid0IGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UuICovCisKKwkJU1NMZXJyKFNTTF9GX1NTTF9HRVRfUFJFVl9TRVNTSU9OLFNTTF9SX0FUVEVNUFRfVE9fUkVVU0VfU0VTU0lPTl9JTl9ESUZGRVJFTlRfQ09OVEVYVCk7CisjZW5kaWYKKwkJZ290byBlcnI7IC8qIHRyZWF0IGxpa2UgY2FjaGUgbWlzcyAqLworCQl9CisJCisJaWYoKHMtPnZlcmlmeV9tb2RlICYgU1NMX1ZFUklGWV9QRUVSKSAmJiBzLT5zaWRfY3R4X2xlbmd0aCA9PSAwKQorCQl7CisJCS8qIFdlIGNhbid0IGJlIHN1cmUgaWYgdGhpcyBzZXNzaW9uIGlzIGJlaW5nIHVzZWQgb3V0IG9mCisJCSAqIGNvbnRleHQsIHdoaWNoIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciBTU0xfVkVSSUZZX1BFRVIuCisJCSAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgaGF2ZSB1c2VkIFNTTFtfQ1RYXV9zZXRfc2Vzc2lvbl9pZF9jb250ZXh0LgorCQkgKgorCQkgKiBGb3IgdGhpcyBlcnJvciBjYXNlLCB3ZSBnZW5lcmF0ZSBhbiBlcnJvciBpbnN0ZWFkIG9mIHRyZWF0aW5nCisJCSAqIHRoZSBldmVudCBsaWtlIGEgY2FjaGUgbWlzcyAob3RoZXJ3aXNlIGl0IHdvdWxkIGJlIGVhc3kgZm9yCisJCSAqIGFwcGxpY2F0aW9ucyB0byBlZmZlY3RpdmVseSBkaXNhYmxlIHRoZSBzZXNzaW9uIGNhY2hlIGJ5CisJCSAqIGFjY2lkZW50IHdpdGhvdXQgYW55b25lIG5vdGljaW5nKS4KKwkJICovCisJCQorCQlTU0xlcnIoU1NMX0ZfU1NMX0dFVF9QUkVWX1NFU1NJT04sU1NMX1JfU0VTU0lPTl9JRF9DT05URVhUX1VOSU5JVElBTElaRUQpOworCQlmYXRhbCA9IDE7CisJCWdvdG8gZXJyOworCQl9CisKKwlpZiAocmV0LT5jaXBoZXIgPT0gTlVMTCkKKwkJeworCQl1bnNpZ25lZCBjaGFyIGJ1Zls1XSwqcDsKKwkJdW5zaWduZWQgbG9uZyBsOworCisJCXA9YnVmOworCQlsPXJldC0+Y2lwaGVyX2lkOworCQlsMm4obCxwKTsKKwkJaWYgKChyZXQtPnNzbF92ZXJzaW9uPj44KSA+PSBTU0wzX1ZFUlNJT05fTUFKT1IpCisJCQlyZXQtPmNpcGhlcj1zc2xfZ2V0X2NpcGhlcl9ieV9jaGFyKHMsJihidWZbMl0pKTsKKwkJZWxzZSAKKwkJCXJldC0+Y2lwaGVyPXNzbF9nZXRfY2lwaGVyX2J5X2NoYXIocywmKGJ1ZlsxXSkpOworCQlpZiAocmV0LT5jaXBoZXIgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQl9CisKKworI2lmIDAgLyogVGhpcyBpcyB3YXkgdG9vIGxhdGUuICovCisKKwkvKiBJZiBhIHRocmVhZCBnb3QgdGhlIHNlc3Npb24sIHRoZW4gJ3N3YXBlZCcsIGFuZCBhbm90aGVyIGdvdAorCSAqIGl0IGFuZCB0aGVuIGR1ZSB0byBhIHRpbWUtb3V0IGRlY2lkZWQgdG8gJ09QRU5TU0xfZnJlZScgaXQgd2UgY291bGQKKwkgKiBiZSBpbiB0cm91YmxlLiAgU28gSSdsbCBpbmNyZW1lbnQgaXQgbm93LCB0aGVuIGRvdWJsZSBkZWNyZW1lbnQKKwkgKiBsYXRlciAtIGFtIEkgc3BlYWtpbmcgcnViYmlzaD8uICovCisJQ1JZUFRPX2FkZCgmcmV0LT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfU1NMX1NFU1NJT04pOworI2VuZGlmCisKKwlpZiAocmV0LT50aW1lb3V0IDwgKGxvbmcpKHRpbWUoTlVMTCkgLSByZXQtPnRpbWUpKSAvKiB0aW1lb3V0ICovCisJCXsKKwkJcy0+c2Vzc2lvbl9jdHgtPnN0YXRzLnNlc3NfdGltZW91dCsrOworCQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgY2FjaGUgKi8KKwkJU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbihzLT5zZXNzaW9uX2N0eCxyZXQpOworCQlnb3RvIGVycjsKKwkJfQorCisJcy0+c2Vzc2lvbl9jdHgtPnN0YXRzLnNlc3NfaGl0Kys7CisKKwkvKiByZXQtPnRpbWU9dGltZShOVUxMKTsgKi8gLyogcmV6ZXJvIHRpbWVvdXQ/ICovCisJLyogYWdhaW4sIGp1c3QgbGVhdmUgdGhlIHNlc3Npb24gCisJICogaWYgaXQgaXMgdGhlIHNhbWUgc2Vzc2lvbiwgd2UgaGF2ZSBqdXN0IGluY3JlbWVudGVkIGFuZAorCSAqIHRoZW4gZGVjcmVtZW50ZWQgdGhlIHJlZmVyZW5jZSBjb3VudCA6LSkgKi8KKwlpZiAocy0+c2Vzc2lvbiAhPSBOVUxMKQorCQlTU0xfU0VTU0lPTl9mcmVlKHMtPnNlc3Npb24pOworCXMtPnNlc3Npb249cmV0OworCXMtPnZlcmlmeV9yZXN1bHQgPSBzLT5zZXNzaW9uLT52ZXJpZnlfcmVzdWx0OworCXJldHVybigxKTsKKworIGVycjoKKwlpZiAocmV0ICE9IE5VTEwpCisJCVNTTF9TRVNTSU9OX2ZyZWUocmV0KTsKKwlpZiAoZmF0YWwpCisJCXJldHVybiAtMTsKKwllbHNlCisJCXJldHVybiAwOworCX0KKworaW50IFNTTF9DVFhfYWRkX3Nlc3Npb24oU1NMX0NUWCAqY3R4LCBTU0xfU0VTU0lPTiAqYykKKwl7CisJaW50IHJldD0wOworCVNTTF9TRVNTSU9OICpzOworCisJLyogYWRkIGp1c3QgMSByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBTU0xfQ1RYJ3Mgc2Vzc2lvbiBjYWNoZQorCSAqIGV2ZW4gdGhvdWdoIGl0IGhhcyB0d28gd2F5cyBvZiBhY2Nlc3M6IGVhY2ggc2Vzc2lvbiBpcyBpbiBhCisJICogZG91Ymx5IGxpbmtlZCBsaXN0IGFuZCBhbiBsaGFzaCAqLworCUNSWVBUT19hZGQoJmMtPnJlZmVyZW5jZXMsMSxDUllQVE9fTE9DS19TU0xfU0VTU0lPTik7CisJLyogaWYgc2Vzc2lvbiBjIGlzIGluIGFscmVhZHkgaW4gY2FjaGUsIHdlIHRha2UgYmFjayB0aGUgaW5jcmVtZW50IGxhdGVyICovCisKKwlDUllQVE9fd19sb2NrKENSWVBUT19MT0NLX1NTTF9DVFgpOworCXM9bGhfU1NMX1NFU1NJT05faW5zZXJ0KGN0eC0+c2Vzc2lvbnMsYyk7CisJCisJLyogcyAhPSBOVUxMIGlmZiB3ZSBhbHJlYWR5IGhhZCBhIHNlc3Npb24gd2l0aCB0aGUgZ2l2ZW4gUElELgorCSAqIEluIHRoaXMgY2FzZSwgcyA9PSBjIHNob3VsZCBob2xkICh0aGVuIHdlIGRpZCBub3QgcmVhbGx5IG1vZGlmeQorCSAqIGN0eC0+c2Vzc2lvbnMpLCBvciB3ZSdyZSBpbiB0cm91YmxlLiAqLworCWlmIChzICE9IE5VTEwgJiYgcyAhPSBjKQorCQl7CisJCS8qIFdlICphcmUqIGluIHRyb3VibGUgLi4uICovCisJCVNTTF9TRVNTSU9OX2xpc3RfcmVtb3ZlKGN0eCxzKTsKKwkJU1NMX1NFU1NJT05fZnJlZShzKTsKKwkJLyogLi4uIHNvIHByZXRlbmQgdGhlIG90aGVyIHNlc3Npb24gZGlkIG5vdCBleGlzdCBpbiBjYWNoZQorCQkgKiAod2UgY2Fubm90IGhhbmRsZSB0d28gU1NMX1NFU1NJT04gc3RydWN0dXJlcyB3aXRoIGlkZW50aWNhbAorCQkgKiBzZXNzaW9uIElEIGluIHRoZSBzYW1lIGNhY2hlLCB3aGljaCBjb3VsZCBoYXBwZW4gZS5nLiB3aGVuCisJCSAqIHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseSBvYnRhaW4gdGhlIHNhbWUgc2Vzc2lvbiBmcm9tIGFuIGV4dGVybmFsCisJCSAqIGNhY2hlKSAqLworCQlzID0gTlVMTDsKKwkJfQorCisgCS8qIFB1dCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgdW5sZXNzIGl0IGlzIGFscmVhZHkgaW4gdGhlIGNhY2hlICovCisJaWYgKHMgPT0gTlVMTCkKKwkJU1NMX1NFU1NJT05fbGlzdF9hZGQoY3R4LGMpOworCisJaWYgKHMgIT0gTlVMTCkKKwkJeworCQkvKiBleGlzdGluZyBjYWNoZSBlbnRyeSAtLSBkZWNyZW1lbnQgcHJldmlvdXNseSBpbmNyZW1lbnRlZCByZWZlcmVuY2UKKwkJICogY291bnQgYmVjYXVzZSBpdCBhbHJlYWR5IHRha2VzIGludG8gYWNjb3VudCB0aGUgY2FjaGUgKi8KKworCQlTU0xfU0VTU0lPTl9mcmVlKHMpOyAvKiBzID09IGMgKi8KKwkJcmV0PTA7CisJCX0KKwllbHNlCisJCXsKKwkJLyogbmV3IGNhY2hlIGVudHJ5IC0tIHJlbW92ZSBvbGQgb25lcyBpZiBjYWNoZSBoYXMgYmVjb21lIHRvbyBsYXJnZSAqLworCQkKKwkJcmV0PTE7CisKKwkJaWYgKFNTTF9DVFhfc2Vzc19nZXRfY2FjaGVfc2l6ZShjdHgpID4gMCkKKwkJCXsKKwkJCXdoaWxlIChTU0xfQ1RYX3Nlc3NfbnVtYmVyKGN0eCkgPgorCQkJCVNTTF9DVFhfc2Vzc19nZXRfY2FjaGVfc2l6ZShjdHgpKQorCQkJCXsKKwkJCQlpZiAoIXJlbW92ZV9zZXNzaW9uX2xvY2soY3R4LAorCQkJCQljdHgtPnNlc3Npb25fY2FjaGVfdGFpbCwgMCkpCisJCQkJCWJyZWFrOworCQkJCWVsc2UKKwkJCQkJY3R4LT5zdGF0cy5zZXNzX2NhY2hlX2Z1bGwrKzsKKwkJCQl9CisJCQl9CisJCX0KKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJcmV0dXJuKHJldCk7CisJfQorCitpbnQgU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbihTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpjKQoreworCXJldHVybiByZW1vdmVfc2Vzc2lvbl9sb2NrKGN0eCwgYywgMSk7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3Nlc3Npb25fbG9jayhTU0xfQ1RYICpjdHgsIFNTTF9TRVNTSU9OICpjLCBpbnQgbGNrKQorCXsKKwlTU0xfU0VTU0lPTiAqcjsKKwlpbnQgcmV0PTA7CisKKwlpZiAoKGMgIT0gTlVMTCkgJiYgKGMtPnNlc3Npb25faWRfbGVuZ3RoICE9IDApKQorCQl7CisJCWlmKGxjaykgQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKwkJaWYgKChyID0gbGhfU1NMX1NFU1NJT05fcmV0cmlldmUoY3R4LT5zZXNzaW9ucyxjKSkgPT0gYykKKwkJCXsKKwkJCXJldD0xOworCQkJcj1saF9TU0xfU0VTU0lPTl9kZWxldGUoY3R4LT5zZXNzaW9ucyxjKTsKKwkJCVNTTF9TRVNTSU9OX2xpc3RfcmVtb3ZlKGN0eCxjKTsKKwkJCX0KKworCQlpZihsY2spIENSWVBUT193X3VubG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKworCQlpZiAocmV0KQorCQkJeworCQkJci0+bm90X3Jlc3VtYWJsZT0xOworCQkJaWYgKGN0eC0+cmVtb3ZlX3Nlc3Npb25fY2IgIT0gTlVMTCkKKwkJCQljdHgtPnJlbW92ZV9zZXNzaW9uX2NiKGN0eCxyKTsKKwkJCVNTTF9TRVNTSU9OX2ZyZWUocik7CisJCQl9CisJCX0KKwllbHNlCisJCXJldD0wOworCXJldHVybihyZXQpOworCX0KKwordm9pZCBTU0xfU0VTU0lPTl9mcmVlKFNTTF9TRVNTSU9OICpzcykKKwl7CisJaW50IGk7CisKKwlpZihzcyA9PSBOVUxMKQorCSAgICByZXR1cm47CisKKwlpPUNSWVBUT19hZGQoJnNzLT5yZWZlcmVuY2VzLC0xLENSWVBUT19MT0NLX1NTTF9TRVNTSU9OKTsKKyNpZmRlZiBSRUZfUFJJTlQKKwlSRUZfUFJJTlQoIlNTTF9TRVNTSU9OIixzcyk7CisjZW5kaWYKKwlpZiAoaSA+IDApIHJldHVybjsKKyNpZmRlZiBSRUZfQ0hFQ0sKKwlpZiAoaSA8IDApCisJCXsKKwkJZnByaW50ZihzdGRlcnIsIlNTTF9TRVNTSU9OX2ZyZWUsIGJhZCByZWZlcmVuY2UgY291bnRcbiIpOworCQlhYm9ydCgpOyAvKiBvayAqLworCQl9CisjZW5kaWYKKworCUNSWVBUT19mcmVlX2V4X2RhdGEoQ1JZUFRPX0VYX0lOREVYX1NTTF9TRVNTSU9OLCBzcywgJnNzLT5leF9kYXRhKTsKKworCU9QRU5TU0xfY2xlYW5zZShzcy0+a2V5X2FyZyxzaXplb2Ygc3MtPmtleV9hcmcpOworCU9QRU5TU0xfY2xlYW5zZShzcy0+bWFzdGVyX2tleSxzaXplb2Ygc3MtPm1hc3Rlcl9rZXkpOworCU9QRU5TU0xfY2xlYW5zZShzcy0+c2Vzc2lvbl9pZCxzaXplb2Ygc3MtPnNlc3Npb25faWQpOworCWlmIChzcy0+c2Vzc19jZXJ0ICE9IE5VTEwpIHNzbF9zZXNzX2NlcnRfZnJlZShzcy0+c2Vzc19jZXJ0KTsKKwlpZiAoc3MtPnBlZXIgIT0gTlVMTCkgWDUwOV9mcmVlKHNzLT5wZWVyKTsKKwlpZiAoc3MtPmNpcGhlcnMgIT0gTlVMTCkgc2tfU1NMX0NJUEhFUl9mcmVlKHNzLT5jaXBoZXJzKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKKwlpZiAoc3MtPnRsc2V4dF9ob3N0bmFtZSAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoc3MtPnRsc2V4dF9ob3N0bmFtZSk7CisJaWYgKHNzLT50bHNleHRfdGljayAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoc3MtPnRsc2V4dF90aWNrKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCXNzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoID0gMDsKKwlpZiAoc3MtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUoc3MtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCk7CisJc3MtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGggPSAwOworCWlmIChzcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0ICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0KTsKKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwlpZiAoc3MtPnBza19pZGVudGl0eV9oaW50ICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShzcy0+cHNrX2lkZW50aXR5X2hpbnQpOworCWlmIChzcy0+cHNrX2lkZW50aXR5ICE9IE5VTEwpCisJCU9QRU5TU0xfZnJlZShzcy0+cHNrX2lkZW50aXR5KTsKKyNlbmRpZgorCU9QRU5TU0xfY2xlYW5zZShzcyxzaXplb2YoKnNzKSk7CisJT1BFTlNTTF9mcmVlKHNzKTsKKwl9CisKK2ludCBTU0xfc2V0X3Nlc3Npb24oU1NMICpzLCBTU0xfU0VTU0lPTiAqc2Vzc2lvbikKKwl7CisJaW50IHJldD0wOworCWNvbnN0IFNTTF9NRVRIT0QgKm1ldGg7CisKKwlpZiAoc2Vzc2lvbiAhPSBOVUxMKQorCQl7CisJCW1ldGg9cy0+Y3R4LT5tZXRob2QtPmdldF9zc2xfbWV0aG9kKHNlc3Npb24tPnNzbF92ZXJzaW9uKTsKKwkJaWYgKG1ldGggPT0gTlVMTCkKKwkJCW1ldGg9cy0+bWV0aG9kLT5nZXRfc3NsX21ldGhvZChzZXNzaW9uLT5zc2xfdmVyc2lvbik7CisJCWlmIChtZXRoID09IE5VTEwpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMX1NFVF9TRVNTSU9OLFNTTF9SX1VOQUJMRV9UT19GSU5EX1NTTF9NRVRIT0QpOworCQkJcmV0dXJuKDApOworCQkJfQorCisJCWlmIChtZXRoICE9IHMtPm1ldGhvZCkKKwkJCXsKKwkJCWlmICghU1NMX3NldF9zc2xfbWV0aG9kKHMsbWV0aCkpCisJCQkJcmV0dXJuKDApOworCQkJaWYgKHMtPmN0eC0+c2Vzc2lvbl90aW1lb3V0ID09IDApCisJCQkJc2Vzc2lvbi0+dGltZW91dD1TU0xfZ2V0X2RlZmF1bHRfdGltZW91dChzKTsKKwkJCWVsc2UKKwkJCQlzZXNzaW9uLT50aW1lb3V0PXMtPmN0eC0+c2Vzc2lvbl90aW1lb3V0OworCQkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorICAgICAgICAgICAgICAgIGlmIChzLT5rc3NsX2N0eCAmJiAhcy0+a3NzbF9jdHgtPmNsaWVudF9wcmluYyAmJgorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5rcmI1X2NsaWVudF9wcmluY19sZW4gPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+a3NzbF9jdHgtPmNsaWVudF9wcmluYyA9IChjaGFyICopT1BFTlNTTF9tYWxsb2Moc2Vzc2lvbi0+a3JiNV9jbGllbnRfcHJpbmNfbGVuICsgMSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5rc3NsX2N0eC0+Y2xpZW50X3ByaW5jLHNlc3Npb24tPmtyYjVfY2xpZW50X3ByaW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmtyYjVfY2xpZW50X3ByaW5jX2xlbik7CisgICAgICAgICAgICAgICAgICAgIHMtPmtzc2xfY3R4LT5jbGllbnRfcHJpbmNbc2Vzc2lvbi0+a3JiNV9jbGllbnRfcHJpbmNfbGVuXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fS1JCNSAqLworCisJCS8qIENSWVBUT193X2xvY2soQ1JZUFRPX0xPQ0tfU1NMKTsqLworCQlDUllQVE9fYWRkKCZzZXNzaW9uLT5yZWZlcmVuY2VzLDEsQ1JZUFRPX0xPQ0tfU1NMX1NFU1NJT04pOworCQlpZiAocy0+c2Vzc2lvbiAhPSBOVUxMKQorCQkJU1NMX1NFU1NJT05fZnJlZShzLT5zZXNzaW9uKTsKKwkJcy0+c2Vzc2lvbj1zZXNzaW9uOworCQlzLT52ZXJpZnlfcmVzdWx0ID0gcy0+c2Vzc2lvbi0+dmVyaWZ5X3Jlc3VsdDsKKwkJLyogQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1NTTCk7Ki8KKwkJcmV0PTE7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKHMtPnNlc3Npb24gIT0gTlVMTCkKKwkJCXsKKwkJCVNTTF9TRVNTSU9OX2ZyZWUocy0+c2Vzc2lvbik7CisJCQlzLT5zZXNzaW9uPU5VTEw7CisJCQl9CisKKwkJbWV0aD1zLT5jdHgtPm1ldGhvZDsKKwkJaWYgKG1ldGggIT0gcy0+bWV0aG9kKQorCQkJeworCQkJaWYgKCFTU0xfc2V0X3NzbF9tZXRob2QocyxtZXRoKSkKKwkJCQlyZXR1cm4oMCk7CisJCQl9CisJCXJldD0xOworCQl9CisJcmV0dXJuKHJldCk7CisJfQorCitsb25nIFNTTF9TRVNTSU9OX3NldF90aW1lb3V0KFNTTF9TRVNTSU9OICpzLCBsb25nIHQpCisJeworCWlmIChzID09IE5VTEwpIHJldHVybigwKTsKKwlzLT50aW1lb3V0PXQ7CisJcmV0dXJuKDEpOworCX0KKworbG9uZyBTU0xfU0VTU0lPTl9nZXRfdGltZW91dChjb25zdCBTU0xfU0VTU0lPTiAqcykKKwl7CisJaWYgKHMgPT0gTlVMTCkgcmV0dXJuKDApOworCXJldHVybihzLT50aW1lb3V0KTsKKwl9CisKK2xvbmcgU1NMX1NFU1NJT05fZ2V0X3RpbWUoY29uc3QgU1NMX1NFU1NJT04gKnMpCisJeworCWlmIChzID09IE5VTEwpIHJldHVybigwKTsKKwlyZXR1cm4ocy0+dGltZSk7CisJfQorCitsb25nIFNTTF9TRVNTSU9OX3NldF90aW1lKFNTTF9TRVNTSU9OICpzLCBsb25nIHQpCisJeworCWlmIChzID09IE5VTEwpIHJldHVybigwKTsKKwlzLT50aW1lPXQ7CisJcmV0dXJuKHQpOworCX0KKworbG9uZyBTU0xfQ1RYX3NldF90aW1lb3V0KFNTTF9DVFggKnMsIGxvbmcgdCkKKwl7CisJbG9uZyBsOworCWlmIChzID09IE5VTEwpIHJldHVybigwKTsKKwlsPXMtPnNlc3Npb25fdGltZW91dDsKKwlzLT5zZXNzaW9uX3RpbWVvdXQ9dDsKKwlyZXR1cm4obCk7CisJfQorCitsb25nIFNTTF9DVFhfZ2V0X3RpbWVvdXQoY29uc3QgU1NMX0NUWCAqcykKKwl7CisJaWYgKHMgPT0gTlVMTCkgcmV0dXJuKDApOworCXJldHVybihzLT5zZXNzaW9uX3RpbWVvdXQpOworCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX1RMU0VYVAoraW50IFNTTF9zZXRfc2Vzc2lvbl9zZWNyZXRfY2IoU1NMICpzLCBpbnQgKCp0bHNfc2Vzc2lvbl9zZWNyZXRfY2IpKFNTTCAqcywgdm9pZCAqc2VjcmV0LCBpbnQgKnNlY3JldF9sZW4sCisJU1RBQ0tfT0YoU1NMX0NJUEhFUikgKnBlZXJfY2lwaGVycywgU1NMX0NJUEhFUiAqKmNpcGhlciwgdm9pZCAqYXJnKSwgdm9pZCAqYXJnKQorCXsKKwlpZiAocyA9PSBOVUxMKSByZXR1cm4oMCk7CisJcy0+dGxzX3Nlc3Npb25fc2VjcmV0X2NiID0gdGxzX3Nlc3Npb25fc2VjcmV0X2NiOworCXMtPnRsc19zZXNzaW9uX3NlY3JldF9jYl9hcmcgPSBhcmc7CisJcmV0dXJuKDEpOworCX0KKworaW50IFNTTF9zZXRfc2Vzc2lvbl90aWNrZXRfZXh0X2NiKFNTTCAqcywgdGxzX3Nlc3Npb25fdGlja2V0X2V4dF9jYl9mbiBjYiwKKwkJCQkgIHZvaWQgKmFyZykKKwl7CisJaWYgKHMgPT0gTlVMTCkgcmV0dXJuKDApOworCXMtPnRsc19zZXNzaW9uX3RpY2tldF9leHRfY2IgPSBjYjsKKwlzLT50bHNfc2Vzc2lvbl90aWNrZXRfZXh0X2NiX2FyZyA9IGFyZzsKKwlyZXR1cm4oMSk7CisJfQorCitpbnQgU1NMX3NldF9zZXNzaW9uX3RpY2tldF9leHQoU1NMICpzLCB2b2lkICpleHRfZGF0YSwgaW50IGV4dF9sZW4pCisJeworCWlmIChzLT52ZXJzaW9uID49IFRMUzFfVkVSU0lPTikKKwkJeworCQlpZiAocy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0KQorCQkJeworCQkJT1BFTlNTTF9mcmVlKHMtPnRsc2V4dF9zZXNzaW9uX3RpY2tldCk7CisJCQlzLT50bHNleHRfc2Vzc2lvbl90aWNrZXQgPSBOVUxMOworCQkJfQorCisJCXMtPnRsc2V4dF9zZXNzaW9uX3RpY2tldCA9IE9QRU5TU0xfbWFsbG9jKHNpemVvZihUTFNfU0VTU0lPTl9USUNLRVRfRVhUKSArIGV4dF9sZW4pOworCQlpZiAoIXMtPnRsc2V4dF9zZXNzaW9uX3RpY2tldCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0xfU0VUX1NFU1NJT05fVElDS0VUX0VYVCwgRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJaWYgKGV4dF9kYXRhKQorCQkJeworCQkJcy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0LT5sZW5ndGggPSBleHRfbGVuOworCQkJcy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0LT5kYXRhID0gcy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0ICsgMTsKKwkJCW1lbWNweShzLT50bHNleHRfc2Vzc2lvbl90aWNrZXQtPmRhdGEsIGV4dF9kYXRhLCBleHRfbGVuKTsKKwkJCX0KKwkJZWxzZQorCQkJeworCQkJcy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0LT5sZW5ndGggPSAwOworCQkJcy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0LT5kYXRhID0gTlVMTDsKKwkJCX0KKworCQlyZXR1cm4gMTsKKwkJfQorCisJcmV0dXJuIDA7CisJfQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisKK3R5cGVkZWYgc3RydWN0IHRpbWVvdXRfcGFyYW1fc3QKKwl7CisJU1NMX0NUWCAqY3R4OworCWxvbmcgdGltZTsKKwlMSEFTSF9PRihTU0xfU0VTU0lPTikgKmNhY2hlOworCX0gVElNRU9VVF9QQVJBTTsKKworc3RhdGljIHZvaWQgdGltZW91dF9kb2FsbF9hcmcoU1NMX1NFU1NJT04gKnMsIFRJTUVPVVRfUEFSQU0gKnApCisJeworCWlmICgocC0+dGltZSA9PSAwKSB8fCAocC0+dGltZSA+IChzLT50aW1lK3MtPnRpbWVvdXQpKSkgLyogdGltZW91dCAqLworCQl7CisJCS8qIFRoZSByZWFzb24gd2UgZG9uJ3QgY2FsbCBTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uKCkgaXMgdG8KKwkJICogc2F2ZSBvbiBsb2NraW5nIG92ZXJoZWFkICovCisJCSh2b2lkKWxoX1NTTF9TRVNTSU9OX2RlbGV0ZShwLT5jYWNoZSxzKTsKKwkJU1NMX1NFU1NJT05fbGlzdF9yZW1vdmUocC0+Y3R4LHMpOworCQlzLT5ub3RfcmVzdW1hYmxlPTE7CisJCWlmIChwLT5jdHgtPnJlbW92ZV9zZXNzaW9uX2NiICE9IE5VTEwpCisJCQlwLT5jdHgtPnJlbW92ZV9zZXNzaW9uX2NiKHAtPmN0eCxzKTsKKwkJU1NMX1NFU1NJT05fZnJlZShzKTsKKwkJfQorCX0KKworc3RhdGljIElNUExFTUVOVF9MSEFTSF9ET0FMTF9BUkdfRk4odGltZW91dCwgU1NMX1NFU1NJT04sIFRJTUVPVVRfUEFSQU0pCisKK3ZvaWQgU1NMX0NUWF9mbHVzaF9zZXNzaW9ucyhTU0xfQ1RYICpzLCBsb25nIHQpCisJeworCXVuc2lnbmVkIGxvbmcgaTsKKwlUSU1FT1VUX1BBUkFNIHRwOworCisJdHAuY3R4PXM7CisJdHAuY2FjaGU9cy0+c2Vzc2lvbnM7CisJaWYgKHRwLmNhY2hlID09IE5VTEwpIHJldHVybjsKKwl0cC50aW1lPXQ7CisJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKwlpPUNIRUNLRURfTEhBU0hfT0YoU1NMX1NFU1NJT04sIHRwLmNhY2hlKS0+ZG93bl9sb2FkOworCUNIRUNLRURfTEhBU0hfT0YoU1NMX1NFU1NJT04sIHRwLmNhY2hlKS0+ZG93bl9sb2FkPTA7CisJbGhfU1NMX1NFU1NJT05fZG9hbGxfYXJnKHRwLmNhY2hlLCBMSEFTSF9ET0FMTF9BUkdfRk4odGltZW91dCksCisJCQkJIFRJTUVPVVRfUEFSQU0sICZ0cCk7CisJQ0hFQ0tFRF9MSEFTSF9PRihTU0xfU0VTU0lPTiwgdHAuY2FjaGUpLT5kb3duX2xvYWQ9aTsKKwlDUllQVE9fd191bmxvY2soQ1JZUFRPX0xPQ0tfU1NMX0NUWCk7CisJfQorCitpbnQgc3NsX2NsZWFyX2JhZF9zZXNzaW9uKFNTTCAqcykKKwl7CisJaWYgKAkocy0+c2Vzc2lvbiAhPSBOVUxMKSAmJgorCQkhKHMtPnNodXRkb3duICYgU1NMX1NFTlRfU0hVVERPV04pICYmCisJCSEoU1NMX2luX2luaXQocykgfHwgU1NMX2luX2JlZm9yZShzKSkpCisJCXsKKwkJU1NMX0NUWF9yZW1vdmVfc2Vzc2lvbihzLT5jdHgscy0+c2Vzc2lvbik7CisJCXJldHVybigxKTsKKwkJfQorCWVsc2UKKwkJcmV0dXJuKDApOworCX0KKworLyogbG9ja2VkIGJ5IFNTTF9DVFggaW4gdGhlIGNhbGxpbmcgZnVuY3Rpb24gKi8KK3N0YXRpYyB2b2lkIFNTTF9TRVNTSU9OX2xpc3RfcmVtb3ZlKFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnMpCisJeworCWlmICgocy0+bmV4dCA9PSBOVUxMKSB8fCAocy0+cHJldiA9PSBOVUxMKSkgcmV0dXJuOworCisJaWYgKHMtPm5leHQgPT0gKFNTTF9TRVNTSU9OICopJihjdHgtPnNlc3Npb25fY2FjaGVfdGFpbCkpCisJCXsgLyogbGFzdCBlbGVtZW50IGluIGxpc3QgKi8KKwkJaWYgKHMtPnByZXYgPT0gKFNTTF9TRVNTSU9OICopJihjdHgtPnNlc3Npb25fY2FjaGVfaGVhZCkpCisJCQl7IC8qIG9ubHkgb25lIGVsZW1lbnQgaW4gbGlzdCAqLworCQkJY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQ9TlVMTDsKKwkJCWN0eC0+c2Vzc2lvbl9jYWNoZV90YWlsPU5VTEw7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWN0eC0+c2Vzc2lvbl9jYWNoZV90YWlsPXMtPnByZXY7CisJCQlzLT5wcmV2LT5uZXh0PShTU0xfU0VTU0lPTiAqKSYoY3R4LT5zZXNzaW9uX2NhY2hlX3RhaWwpOworCQkJfQorCQl9CisJZWxzZQorCQl7CisJCWlmIChzLT5wcmV2ID09IChTU0xfU0VTU0lPTiAqKSYoY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQpKQorCQkJeyAvKiBmaXJzdCBlbGVtZW50IGluIGxpc3QgKi8KKwkJCWN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkPXMtPm5leHQ7CisJCQlzLT5uZXh0LT5wcmV2PShTU0xfU0VTU0lPTiAqKSYoY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQpOworCQkJfQorCQllbHNlCisJCQl7IC8qIG1pZGRsZSBvZiBsaXN0ICovCisJCQlzLT5uZXh0LT5wcmV2PXMtPnByZXY7CisJCQlzLT5wcmV2LT5uZXh0PXMtPm5leHQ7CisJCQl9CisJCX0KKwlzLT5wcmV2PXMtPm5leHQ9TlVMTDsKKwl9CisKK3N0YXRpYyB2b2lkIFNTTF9TRVNTSU9OX2xpc3RfYWRkKFNTTF9DVFggKmN0eCwgU1NMX1NFU1NJT04gKnMpCisJeworCWlmICgocy0+bmV4dCAhPSBOVUxMKSAmJiAocy0+cHJldiAhPSBOVUxMKSkKKwkJU1NMX1NFU1NJT05fbGlzdF9yZW1vdmUoY3R4LHMpOworCisJaWYgKGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkID09IE5VTEwpCisJCXsKKwkJY3R4LT5zZXNzaW9uX2NhY2hlX2hlYWQ9czsKKwkJY3R4LT5zZXNzaW9uX2NhY2hlX3RhaWw9czsKKwkJcy0+cHJldj0oU1NMX1NFU1NJT04gKikmKGN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkKTsKKwkJcy0+bmV4dD0oU1NMX1NFU1NJT04gKikmKGN0eC0+c2Vzc2lvbl9jYWNoZV90YWlsKTsKKwkJfQorCWVsc2UKKwkJeworCQlzLT5uZXh0PWN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkOworCQlzLT5uZXh0LT5wcmV2PXM7CisJCXMtPnByZXY9KFNTTF9TRVNTSU9OICopJihjdHgtPnNlc3Npb25fY2FjaGVfaGVhZCk7CisJCWN0eC0+c2Vzc2lvbl9jYWNoZV9oZWFkPXM7CisJCX0KKwl9CisKK3ZvaWQgU1NMX0NUWF9zZXNzX3NldF9uZXdfY2IoU1NMX0NUWCAqY3R4LAorCWludCAoKmNiKShzdHJ1Y3Qgc3NsX3N0ICpzc2wsU1NMX1NFU1NJT04gKnNlc3MpKQorCXsKKwljdHgtPm5ld19zZXNzaW9uX2NiPWNiOworCX0KKworaW50ICgqU1NMX0NUWF9zZXNzX2dldF9uZXdfY2IoU1NMX0NUWCAqY3R4KSkoU1NMICpzc2wsIFNTTF9TRVNTSU9OICpzZXNzKQorCXsKKwlyZXR1cm4gY3R4LT5uZXdfc2Vzc2lvbl9jYjsKKwl9CisKK3ZvaWQgU1NMX0NUWF9zZXNzX3NldF9yZW1vdmVfY2IoU1NMX0NUWCAqY3R4LAorCXZvaWQgKCpjYikoU1NMX0NUWCAqY3R4LFNTTF9TRVNTSU9OICpzZXNzKSkKKwl7CisJY3R4LT5yZW1vdmVfc2Vzc2lvbl9jYj1jYjsKKwl9CisKK3ZvaWQgKCpTU0xfQ1RYX3Nlc3NfZ2V0X3JlbW92ZV9jYihTU0xfQ1RYICpjdHgpKShTU0xfQ1RYICogY3R4LFNTTF9TRVNTSU9OICpzZXNzKQorCXsKKwlyZXR1cm4gY3R4LT5yZW1vdmVfc2Vzc2lvbl9jYjsKKwl9CisKK3ZvaWQgU1NMX0NUWF9zZXNzX3NldF9nZXRfY2IoU1NMX0NUWCAqY3R4LAorCVNTTF9TRVNTSU9OICooKmNiKShzdHJ1Y3Qgc3NsX3N0ICpzc2wsCisJICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSxpbnQgbGVuLGludCAqY29weSkpCisJeworCWN0eC0+Z2V0X3Nlc3Npb25fY2I9Y2I7CisJfQorCitTU0xfU0VTU0lPTiAqICgqU1NMX0NUWF9zZXNzX2dldF9nZXRfY2IoU1NMX0NUWCAqY3R4KSkoU1NMICpzc2wsCisJICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSxpbnQgbGVuLGludCAqY29weSkKKwl7CisJcmV0dXJuIGN0eC0+Z2V0X3Nlc3Npb25fY2I7CisJfQorCit2b2lkIFNTTF9DVFhfc2V0X2luZm9fY2FsbGJhY2soU1NMX0NUWCAqY3R4LCAKKwl2b2lkICgqY2IpKGNvbnN0IFNTTCAqc3NsLGludCB0eXBlLGludCB2YWwpKQorCXsKKwljdHgtPmluZm9fY2FsbGJhY2s9Y2I7CisJfQorCit2b2lkICgqU1NMX0NUWF9nZXRfaW5mb19jYWxsYmFjayhTU0xfQ1RYICpjdHgpKShjb25zdCBTU0wgKnNzbCxpbnQgdHlwZSxpbnQgdmFsKQorCXsKKwlyZXR1cm4gY3R4LT5pbmZvX2NhbGxiYWNrOworCX0KKwordm9pZCBTU0xfQ1RYX3NldF9jbGllbnRfY2VydF9jYihTU0xfQ1RYICpjdHgsCisJaW50ICgqY2IpKFNTTCAqc3NsLCBYNTA5ICoqeDUwOSwgRVZQX1BLRVkgKipwa2V5KSkKKwl7CisJY3R4LT5jbGllbnRfY2VydF9jYj1jYjsKKwl9CisKK2ludCAoKlNTTF9DVFhfZ2V0X2NsaWVudF9jZXJ0X2NiKFNTTF9DVFggKmN0eCkpKFNTTCAqIHNzbCwgWDUwOSAqKiB4NTA5ICwgRVZQX1BLRVkgKipwa2V5KQorCXsKKwlyZXR1cm4gY3R4LT5jbGllbnRfY2VydF9jYjsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FTkdJTkUKK2ludCBTU0xfQ1RYX3NldF9jbGllbnRfY2VydF9lbmdpbmUoU1NMX0NUWCAqY3R4LCBFTkdJTkUgKmUpCisJeworCWlmICghRU5HSU5FX2luaXQoZSkpCisJCXsKKwkJU1NMZXJyKFNTTF9GX1NTTF9DVFhfU0VUX0NMSUVOVF9DRVJUX0VOR0lORSwgRVJSX1JfRU5HSU5FX0xJQik7CisJCXJldHVybiAwOworCQl9CisJaWYoIUVOR0lORV9nZXRfc3NsX2NsaWVudF9jZXJ0X2Z1bmN0aW9uKGUpKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfQ1RYX1NFVF9DTElFTlRfQ0VSVF9FTkdJTkUsIFNTTF9SX05PX0NMSUVOVF9DRVJUX01FVEhPRCk7CisJCUVOR0lORV9maW5pc2goZSk7CisJCXJldHVybiAwOworCQl9CisJY3R4LT5jbGllbnRfY2VydF9lbmdpbmUgPSBlOworCXJldHVybiAxOworCX0KKyNlbmRpZgorCit2b2lkIFNTTF9DVFhfc2V0X2Nvb2tpZV9nZW5lcmF0ZV9jYihTU0xfQ1RYICpjdHgsCisJaW50ICgqY2IpKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICpjb29raWUsIHVuc2lnbmVkIGludCAqY29va2llX2xlbikpCisJeworCWN0eC0+YXBwX2dlbl9jb29raWVfY2I9Y2I7CisJfQorCit2b2lkIFNTTF9DVFhfc2V0X2Nvb2tpZV92ZXJpZnlfY2IoU1NMX0NUWCAqY3R4LAorCWludCAoKmNiKShTU0wgKnNzbCwgdW5zaWduZWQgY2hhciAqY29va2llLCB1bnNpZ25lZCBpbnQgY29va2llX2xlbikpCisJeworCWN0eC0+YXBwX3ZlcmlmeV9jb29raWVfY2I9Y2I7CisJfQorCitJTVBMRU1FTlRfUEVNX3J3KFNTTF9TRVNTSU9OLCBTU0xfU0VTU0lPTiwgUEVNX1NUUklOR19TU0xfU0VTU0lPTiwgU1NMX1NFU1NJT04pCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvc3NsX3N0YXQuYyBiL2xpYi9vcGVuc3NsL3NzbC9zc2xfc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGI4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvc3NsX3N0YXQuYwpAQCAtMCwwICsxLDU2NyBAQAorLyogc3NsL3NzbF9zdGF0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNSBOb2tpYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgcG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgaXMgZGV2ZWxvcGVkIGJ5CisgKiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiwgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mCisgKiBOb2tpYSBDb3Jwb3JhdGlvbiwgY29uc2lzdHMgb2YgdGhlICJQU0siIChQcmUtU2hhcmVkIEtleSkgY2lwaGVyc3VpdGVzCisgKiBzdXBwb3J0IChzZWUgUkZDIDQyNzkpIHRvIE9wZW5TU0wuCisgKgorICogTm8gcGF0ZW50IGxpY2Vuc2VzIG9yIG90aGVyIHJpZ2h0cyBleGNlcHQgdGhvc2UgZXhwcmVzc2x5IHN0YXRlZCBpbgorICogdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UgbGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgZ3JhbnRlZCBvciByZWNlaXZlZAorICogZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwsIG9yIG90aGVyd2lzZS4KKyAqCisgKiBObyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBOb2tpYSB0aGF0IHRoZSBDb250cmlidXRpb24gZG9lcyBub3QKKyAqIGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgdGhpcmQKKyAqIHBhcnR5IG9yIHRoYXQgdGhlIGxpY2Vuc2UgcHJvdmlkZXMgeW91IHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgcmlnaHRzCisgKiB0byBtYWtlIHVzZSBvZiB0aGUgQ29udHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQuIElOCisgKiBBRERJVElPTiBUTyBUSEUgRElTQ0xBSU1FUlMgSU5DTFVERUQgSU4gVEhFIExJQ0VOU0UsIE5PS0lBCisgKiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgRk9SIENMQUlNUyBCUk9VR0hUIEJZIFlPVSBPUiBBTlkKKyAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgorICogT1RIRVJXSVNFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisKK2NvbnN0IGNoYXIgKlNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhjb25zdCBTU0wgKnMpCisJeworCWNvbnN0IGNoYXIgKnN0cjsKKworCXN3aXRjaCAocy0+c3RhdGUpCisJCXsKK2Nhc2UgU1NMX1NUX0JFRk9SRTogc3RyPSJiZWZvcmUgU1NMIGluaXRpYWxpemF0aW9uIjsgYnJlYWs7CitjYXNlIFNTTF9TVF9BQ0NFUFQ6IHN0cj0iYmVmb3JlIGFjY2VwdCBpbml0aWFsaXphdGlvbiI7IGJyZWFrOworY2FzZSBTU0xfU1RfQ09OTkVDVDogc3RyPSJiZWZvcmUgY29ubmVjdCBpbml0aWFsaXphdGlvbiI7IGJyZWFrOworY2FzZSBTU0xfU1RfT0s6IHN0cj0iU1NMIG5lZ290aWF0aW9uIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSI7IGJyZWFrOworY2FzZSBTU0xfU1RfUkVORUdPVElBVEU6CXN0cj0iU1NMIHJlbmVnb3RpYXRlIGNpcGhlcnMiOyBicmVhazsKK2Nhc2UgU1NMX1NUX0JFRk9SRXxTU0xfU1RfQ09OTkVDVDogc3RyPSJiZWZvcmUvY29ubmVjdCBpbml0aWFsaXphdGlvbiI7IGJyZWFrOworY2FzZSBTU0xfU1RfT0t8U1NMX1NUX0NPTk5FQ1Q6IHN0cj0ib2svY29ubmVjdCBTU0wgaW5pdGlhbGl6YXRpb24iOyBicmVhazsKK2Nhc2UgU1NMX1NUX0JFRk9SRXxTU0xfU1RfQUNDRVBUOiBzdHI9ImJlZm9yZS9hY2NlcHQgaW5pdGlhbGl6YXRpb24iOyBicmVhazsKK2Nhc2UgU1NMX1NUX09LfFNTTF9TVF9BQ0NFUFQ6IHN0cj0ib2svYWNjZXB0IFNTTCBpbml0aWFsaXphdGlvbiI7IGJyZWFrOworI2lmbmRlZiBPUEVOU1NMX05PX1NTTDIKK2Nhc2UgU1NMMl9TVF9DTElFTlRfU1RBUlRfRU5DUllQVElPTjogc3RyPSJTU0x2MiBjbGllbnQgc3RhcnQgZW5jcnlwdGlvbiI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFUlZFUl9TVEFSVF9FTkNSWVBUSU9OOiBzdHI9IlNTTHYyIHNlcnZlciBzdGFydCBlbmNyeXB0aW9uIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9DTElFTlRfSEVMTE9fQTogc3RyPSJTU0x2MiB3cml0ZSBjbGllbnQgaGVsbG8gQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0hFTExPX0I6IHN0cj0iU1NMdjIgd3JpdGUgY2xpZW50IGhlbGxvIEIiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9HRVRfU0VSVkVSX0hFTExPX0E6IHN0cj0iU1NMdjIgcmVhZCBzZXJ2ZXIgaGVsbG8gQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9TRVJWRVJfSEVMTE9fQjogc3RyPSJTU0x2MiByZWFkIHNlcnZlciBoZWxsbyBCIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9DTElFTlRfTUFTVEVSX0tFWV9BOiBzdHI9IlNTTHYyIHdyaXRlIGNsaWVudCBtYXN0ZXIga2V5IEEiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9NQVNURVJfS0VZX0I6IHN0cj0iU1NMdjIgd3JpdGUgY2xpZW50IG1hc3RlciBrZXkgQiI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0ZJTklTSEVEX0E6IHN0cj0iU1NMdjIgd3JpdGUgY2xpZW50IGZpbmlzaGVkIEEiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9GSU5JU0hFRF9COiBzdHI9IlNTTHYyIHdyaXRlIGNsaWVudCBmaW5pc2hlZCBCIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9DTElFTlRfQ0VSVElGSUNBVEVfQTogc3RyPSJTU0x2MiB3cml0ZSBjbGllbnQgY2VydGlmaWNhdGUgQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0I6IHN0cj0iU1NMdjIgd3JpdGUgY2xpZW50IGNlcnRpZmljYXRlIEIiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9DRVJUSUZJQ0FURV9DOiBzdHI9IlNTTHYyIHdyaXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSBDIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9DTElFTlRfQ0VSVElGSUNBVEVfRDogc3RyPSJTU0x2MiB3cml0ZSBjbGllbnQgY2VydGlmaWNhdGUgRCI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9TRVJWRVJfVkVSSUZZX0E6IHN0cj0iU1NMdjIgcmVhZCBzZXJ2ZXIgdmVyaWZ5IEEiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9HRVRfU0VSVkVSX1ZFUklGWV9COiBzdHI9IlNTTHYyIHJlYWQgc2VydmVyIHZlcmlmeSBCIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX1NFUlZFUl9GSU5JU0hFRF9BOiBzdHI9IlNTTHYyIHJlYWQgc2VydmVyIGZpbmlzaGVkIEEiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9HRVRfU0VSVkVSX0ZJTklTSEVEX0I6IHN0cj0iU1NMdjIgcmVhZCBzZXJ2ZXIgZmluaXNoZWQgQiI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQTogc3RyPSJTU0x2MiByZWFkIGNsaWVudCBoZWxsbyBBIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9IRUxMT19COiBzdHI9IlNTTHYyIHJlYWQgY2xpZW50IGhlbGxvIEIiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9HRVRfQ0xJRU5UX0hFTExPX0M6IHN0cj0iU1NMdjIgcmVhZCBjbGllbnQgaGVsbG8gQyI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfU0VSVkVSX0hFTExPX0E6IHN0cj0iU1NMdjIgd3JpdGUgc2VydmVyIGhlbGxvIEEiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19COiBzdHI9IlNTTHYyIHdyaXRlIHNlcnZlciBoZWxsbyBCIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9NQVNURVJfS0VZX0E6IHN0cj0iU1NMdjIgcmVhZCBjbGllbnQgbWFzdGVyIGtleSBBIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9NQVNURVJfS0VZX0I6IHN0cj0iU1NMdjIgcmVhZCBjbGllbnQgbWFzdGVyIGtleSBCIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0E6IHN0cj0iU1NMdjIgd3JpdGUgc2VydmVyIHZlcmlmeSBBIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0I6IHN0cj0iU1NMdjIgd3JpdGUgc2VydmVyIHZlcmlmeSBCIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0M6IHN0cj0iU1NMdjIgd3JpdGUgc2VydmVyIHZlcmlmeSBDIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9GSU5JU0hFRF9BOiBzdHI9IlNTTHYyIHJlYWQgY2xpZW50IGZpbmlzaGVkIEEiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9HRVRfQ0xJRU5UX0ZJTklTSEVEX0I6IHN0cj0iU1NMdjIgcmVhZCBjbGllbnQgZmluaXNoZWQgQiI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfU0VSVkVSX0ZJTklTSEVEX0E6IHN0cj0iU1NMdjIgd3JpdGUgc2VydmVyIGZpbmlzaGVkIEEiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9GSU5JU0hFRF9COiBzdHI9IlNTTHYyIHdyaXRlIHNlcnZlciBmaW5pc2hlZCBCIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0E6IHN0cj0iU1NMdjIgd3JpdGUgcmVxdWVzdCBjZXJ0aWZpY2F0ZSBBIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0I6IHN0cj0iU1NMdjIgd3JpdGUgcmVxdWVzdCBjZXJ0aWZpY2F0ZSBCIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0M6IHN0cj0iU1NMdjIgd3JpdGUgcmVxdWVzdCBjZXJ0aWZpY2F0ZSBDIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9SRVFVRVNUX0NFUlRJRklDQVRFX0Q6IHN0cj0iU1NMdjIgd3JpdGUgcmVxdWVzdCBjZXJ0aWZpY2F0ZSBEIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfWDUwOV9HRVRfU0VSVkVSX0NFUlRJRklDQVRFOiBzdHI9IlNTTHYyIFg1MDkgcmVhZCBzZXJ2ZXIgY2VydGlmaWNhdGUiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9YNTA5X0dFVF9DTElFTlRfQ0VSVElGSUNBVEU6IHN0cj0iU1NMdjIgWDUwOSByZWFkIGNsaWVudCBjZXJ0aWZpY2F0ZSI7IGJyZWFrOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisvKiBTU0x2MyBhZGRpdGlvbnMgKi8KK2Nhc2UgU1NMM19TVF9DV19DTE5UX0hFTExPX0E6CXN0cj0iU1NMdjMgd3JpdGUgY2xpZW50IGhlbGxvIEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19DTE5UX0hFTExPX0I6CXN0cj0iU1NMdjMgd3JpdGUgY2xpZW50IGhlbGxvIEIiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9TUlZSX0hFTExPX0E6CXN0cj0iU1NMdjMgcmVhZCBzZXJ2ZXIgaGVsbG8gQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NSX1NSVlJfSEVMTE9fQjoJc3RyPSJTU0x2MyByZWFkIHNlcnZlciBoZWxsbyBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1JfQ0VSVF9BOgkJc3RyPSJTU0x2MyByZWFkIHNlcnZlciBjZXJ0aWZpY2F0ZSBBIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1JfQ0VSVF9COgkJc3RyPSJTU0x2MyByZWFkIHNlcnZlciBjZXJ0aWZpY2F0ZSBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1JfS0VZX0VYQ0hfQToJc3RyPSJTU0x2MyByZWFkIHNlcnZlciBrZXkgZXhjaGFuZ2UgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NSX0tFWV9FWENIX0I6CXN0cj0iU1NMdjMgcmVhZCBzZXJ2ZXIga2V5IGV4Y2hhbmdlIEIiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9DRVJUX1JFUV9BOglzdHI9IlNTTHYzIHJlYWQgc2VydmVyIGNlcnRpZmljYXRlIHJlcXVlc3QgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NSX0NFUlRfUkVRX0I6CXN0cj0iU1NMdjMgcmVhZCBzZXJ2ZXIgY2VydGlmaWNhdGUgcmVxdWVzdCBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1JfU0VTU0lPTl9USUNLRVRfQTogc3RyPSJTU0x2MyByZWFkIHNlcnZlciBzZXNzaW9uIHRpY2tldCBBIjticmVhazsKK2Nhc2UgU1NMM19TVF9DUl9TRVNTSU9OX1RJQ0tFVF9COiBzdHI9IlNTTHYzIHJlYWQgc2VydmVyIHNlc3Npb24gdGlja2V0IEIiO2JyZWFrOworY2FzZSBTU0wzX1NUX0NSX1NSVlJfRE9ORV9BOglzdHI9IlNTTHYzIHJlYWQgc2VydmVyIGRvbmUgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NSX1NSVlJfRE9ORV9COglzdHI9IlNTTHYzIHJlYWQgc2VydmVyIGRvbmUgQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NXX0NFUlRfQToJCXN0cj0iU1NMdjMgd3JpdGUgY2xpZW50IGNlcnRpZmljYXRlIEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19DRVJUX0I6CQlzdHI9IlNTTHYzIHdyaXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1dfQ0VSVF9DOgkJc3RyPSJTU0x2MyB3cml0ZSBjbGllbnQgY2VydGlmaWNhdGUgQyI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NXX0NFUlRfRDoJCXN0cj0iU1NMdjMgd3JpdGUgY2xpZW50IGNlcnRpZmljYXRlIEQiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19LRVlfRVhDSF9BOglzdHI9IlNTTHYzIHdyaXRlIGNsaWVudCBrZXkgZXhjaGFuZ2UgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NXX0tFWV9FWENIX0I6CXN0cj0iU1NMdjMgd3JpdGUgY2xpZW50IGtleSBleGNoYW5nZSBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0E6CXN0cj0iU1NMdjMgd3JpdGUgY2VydGlmaWNhdGUgdmVyaWZ5IEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19DRVJUX1ZSRllfQjoJc3RyPSJTU0x2MyB3cml0ZSBjZXJ0aWZpY2F0ZSB2ZXJpZnkgQiI7IGJyZWFrOworCitjYXNlIFNTTDNfU1RfQ1dfQ0hBTkdFX0E6CitjYXNlIFNTTDNfU1RfU1dfQ0hBTkdFX0E6CXN0cj0iU1NMdjMgd3JpdGUgY2hhbmdlIGNpcGhlciBzcGVjIEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19DSEFOR0VfQjoJCitjYXNlIFNTTDNfU1RfU1dfQ0hBTkdFX0I6CXN0cj0iU1NMdjMgd3JpdGUgY2hhbmdlIGNpcGhlciBzcGVjIEIiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19GSU5JU0hFRF9BOgkKK2Nhc2UgU1NMM19TVF9TV19GSU5JU0hFRF9BOglzdHI9IlNTTHYzIHdyaXRlIGZpbmlzaGVkIEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19GSU5JU0hFRF9COgkKK2Nhc2UgU1NMM19TVF9TV19GSU5JU0hFRF9COglzdHI9IlNTTHYzIHdyaXRlIGZpbmlzaGVkIEIiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9DSEFOR0VfQToJCitjYXNlIFNTTDNfU1RfU1JfQ0hBTkdFX0E6CXN0cj0iU1NMdjMgcmVhZCBjaGFuZ2UgY2lwaGVyIHNwZWMgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NSX0NIQU5HRV9COgkKK2Nhc2UgU1NMM19TVF9TUl9DSEFOR0VfQjoJc3RyPSJTU0x2MyByZWFkIGNoYW5nZSBjaXBoZXIgc3BlYyBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1JfRklOSVNIRURfQToJCitjYXNlIFNTTDNfU1RfU1JfRklOSVNIRURfQToJc3RyPSJTU0x2MyByZWFkIGZpbmlzaGVkIEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9GSU5JU0hFRF9COgkKK2Nhc2UgU1NMM19TVF9TUl9GSU5JU0hFRF9COglzdHI9IlNTTHYzIHJlYWQgZmluaXNoZWQgQiI7IGJyZWFrOworCitjYXNlIFNTTDNfU1RfQ1dfRkxVU0g6CitjYXNlIFNTTDNfU1RfU1dfRkxVU0g6CQlzdHI9IlNTTHYzIGZsdXNoIGRhdGEiOyBicmVhazsKKworY2FzZSBTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQToJc3RyPSJTU0x2MyByZWFkIGNsaWVudCBoZWxsbyBBIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1JfQ0xOVF9IRUxMT19COglzdHI9IlNTTHYzIHJlYWQgY2xpZW50IGhlbGxvIEIiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TUl9DTE5UX0hFTExPX0M6CXN0cj0iU1NMdjMgcmVhZCBjbGllbnQgaGVsbG8gQyI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9BOglzdHI9IlNTTHYzIHdyaXRlIGhlbGxvIHJlcXVlc3QgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9COglzdHI9IlNTTHYzIHdyaXRlIGhlbGxvIHJlcXVlc3QgQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9DOglzdHI9IlNTTHYzIHdyaXRlIGhlbGxvIHJlcXVlc3QgQyI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQToJc3RyPSJTU0x2MyB3cml0ZSBzZXJ2ZXIgaGVsbG8gQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQjoJc3RyPSJTU0x2MyB3cml0ZSBzZXJ2ZXIgaGVsbG8gQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0NFUlRfQToJCXN0cj0iU1NMdjMgd3JpdGUgY2VydGlmaWNhdGUgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0NFUlRfQjoJCXN0cj0iU1NMdjMgd3JpdGUgY2VydGlmaWNhdGUgQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0tFWV9FWENIX0E6CXN0cj0iU1NMdjMgd3JpdGUga2V5IGV4Y2hhbmdlIEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TV19LRVlfRVhDSF9COglzdHI9IlNTTHYzIHdyaXRlIGtleSBleGNoYW5nZSBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1dfQ0VSVF9SRVFfQToJc3RyPSJTU0x2MyB3cml0ZSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TV19DRVJUX1JFUV9COglzdHI9IlNTTHYzIHdyaXRlIGNlcnRpZmljYXRlIHJlcXVlc3QgQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0E6IHN0cj0iU1NMdjMgd3JpdGUgc2Vzc2lvbiB0aWNrZXQgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX1NFU1NJT05fVElDS0VUX0I6IHN0cj0iU1NMdjMgd3JpdGUgc2Vzc2lvbiB0aWNrZXQgQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX1NSVlJfRE9ORV9BOglzdHI9IlNTTHYzIHdyaXRlIHNlcnZlciBkb25lIEEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TV19TUlZSX0RPTkVfQjoJc3RyPSJTU0x2MyB3cml0ZSBzZXJ2ZXIgZG9uZSBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1JfQ0VSVF9BOgkJc3RyPSJTU0x2MyByZWFkIGNsaWVudCBjZXJ0aWZpY2F0ZSBBIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1JfQ0VSVF9COgkJc3RyPSJTU0x2MyByZWFkIGNsaWVudCBjZXJ0aWZpY2F0ZSBCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1JfS0VZX0VYQ0hfQToJc3RyPSJTU0x2MyByZWFkIGNsaWVudCBrZXkgZXhjaGFuZ2UgQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NSX0tFWV9FWENIX0I6CXN0cj0iU1NMdjMgcmVhZCBjbGllbnQga2V5IGV4Y2hhbmdlIEIiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TUl9DRVJUX1ZSRllfQToJc3RyPSJTU0x2MyByZWFkIGNlcnRpZmljYXRlIHZlcmlmeSBBIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1JfQ0VSVF9WUkZZX0I6CXN0cj0iU1NMdjMgcmVhZCBjZXJ0aWZpY2F0ZSB2ZXJpZnkgQiI7IGJyZWFrOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykKKy8qIFNTTHYyL3YzIGNvbXBhdGliaWxpdHkgc3RhdGVzICovCisvKiBjbGllbnQgKi8KK2Nhc2UgU1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19BOglzdHI9IlNTTHYyL3YzIHdyaXRlIGNsaWVudCBoZWxsbyBBIjsgYnJlYWs7CitjYXNlIFNTTDIzX1NUX0NXX0NMTlRfSEVMTE9fQjoJc3RyPSJTU0x2Mi92MyB3cml0ZSBjbGllbnQgaGVsbG8gQiI7IGJyZWFrOworY2FzZSBTU0wyM19TVF9DUl9TUlZSX0hFTExPX0E6CXN0cj0iU1NMdjIvdjMgcmVhZCBzZXJ2ZXIgaGVsbG8gQSI7IGJyZWFrOworY2FzZSBTU0wyM19TVF9DUl9TUlZSX0hFTExPX0I6CXN0cj0iU1NMdjIvdjMgcmVhZCBzZXJ2ZXIgaGVsbG8gQiI7IGJyZWFrOworLyogc2VydmVyICovCitjYXNlIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQToJc3RyPSJTU0x2Mi92MyByZWFkIGNsaWVudCBoZWxsbyBBIjsgYnJlYWs7CitjYXNlIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQjoJc3RyPSJTU0x2Mi92MyByZWFkIGNsaWVudCBoZWxsbyBCIjsgYnJlYWs7CisjZW5kaWYKKworLyogRFRMUyAqLworY2FzZSBEVExTMV9TVF9DUl9IRUxMT19WRVJJRllfUkVRVUVTVF9BOiBzdHI9IkRUTFMxIHJlYWQgaGVsbG8gdmVyaWZ5IHJlcXVlc3QgQSI7IGJyZWFrOworY2FzZSBEVExTMV9TVF9DUl9IRUxMT19WRVJJRllfUkVRVUVTVF9COiBzdHI9IkRUTFMxIHJlYWQgaGVsbG8gdmVyaWZ5IHJlcXVlc3QgQiI7IGJyZWFrOworY2FzZSBEVExTMV9TVF9TV19IRUxMT19WRVJJRllfUkVRVUVTVF9BOiBzdHI9IkRUTFMxIHdyaXRlIGhlbGxvIHZlcmlmeSByZXF1ZXN0IEEiOyBicmVhazsKK2Nhc2UgRFRMUzFfU1RfU1dfSEVMTE9fVkVSSUZZX1JFUVVFU1RfQjogc3RyPSJEVExTMSB3cml0ZSBoZWxsbyB2ZXJpZnkgcmVxdWVzdCBCIjsgYnJlYWs7CisKK2RlZmF1bHQ6CXN0cj0idW5rbm93biBzdGF0ZSI7IGJyZWFrOworCQl9CisJcmV0dXJuKHN0cik7CisJfQorCitjb25zdCBjaGFyICpTU0xfcnN0YXRlX3N0cmluZ19sb25nKGNvbnN0IFNTTCAqcykKKwl7CisJY29uc3QgY2hhciAqc3RyOworCisJc3dpdGNoIChzLT5yc3RhdGUpCisJCXsKKwljYXNlIFNTTF9TVF9SRUFEX0hFQURFUjogc3RyPSJyZWFkIGhlYWRlciI7IGJyZWFrOworCWNhc2UgU1NMX1NUX1JFQURfQk9EWTogc3RyPSJyZWFkIGJvZHkiOyBicmVhazsKKwljYXNlIFNTTF9TVF9SRUFEX0RPTkU6IHN0cj0icmVhZCBkb25lIjsgYnJlYWs7CisJZGVmYXVsdDogc3RyPSJ1bmtub3duIjsgYnJlYWs7CisJCX0KKwlyZXR1cm4oc3RyKTsKKwl9CisKK2NvbnN0IGNoYXIgKlNTTF9zdGF0ZV9zdHJpbmcoY29uc3QgU1NMICpzKQorCXsKKwljb25zdCBjaGFyICpzdHI7CisKKwlzd2l0Y2ggKHMtPnN0YXRlKQorCQl7CitjYXNlIFNTTF9TVF9CRUZPUkU6CQkJCXN0cj0iUElOSVQgIjsgYnJlYWs7CitjYXNlIFNTTF9TVF9BQ0NFUFQ6CQkJCXN0cj0iQUlOSVQgIjsgYnJlYWs7CitjYXNlIFNTTF9TVF9DT05ORUNUOgkJCQlzdHI9IkNJTklUICI7IGJyZWFrOworY2FzZSBTU0xfU1RfT0s6CQkJIAkJc3RyPSJTU0xPSyAiOyBicmVhazsKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCitjYXNlIFNTTDJfU1RfQ0xJRU5UX1NUQVJUX0VOQ1JZUFRJT046CQlzdHI9IjJDU0VOQyI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFUlZFUl9TVEFSVF9FTkNSWVBUSU9OOgkJc3RyPSIyU1NFTkMiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9IRUxMT19BOgkJc3RyPSIyU0NIX0EiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9IRUxMT19COgkJc3RyPSIyU0NIX0IiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9HRVRfU0VSVkVSX0hFTExPX0E6CQlzdHI9IjJHU0hfQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9TRVJWRVJfSEVMTE9fQjoJCXN0cj0iMkdTSF9CIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9DTElFTlRfTUFTVEVSX0tFWV9BOgkJc3RyPSIyU0NNS0EiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX0NMSUVOVF9NQVNURVJfS0VZX0I6CQlzdHI9IjJTQ01LQiI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0ZJTklTSEVEX0E6CQlzdHI9IjJTQ0ZfQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0ZJTklTSEVEX0I6CQlzdHI9IjJTQ0ZfQiI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0E6CQlzdHI9IjJTQ0NfQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0I6CQlzdHI9IjJTQ0NfQiI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0M6CQlzdHI9IjJTQ0NfQyI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfQ0xJRU5UX0NFUlRJRklDQVRFX0Q6CQlzdHI9IjJTQ0NfRCI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9TRVJWRVJfVkVSSUZZX0E6CQlzdHI9IjJHU1ZfQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9TRVJWRVJfVkVSSUZZX0I6CQlzdHI9IjJHU1ZfQiI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9TRVJWRVJfRklOSVNIRURfQToJCXN0cj0iMkdTRl9BIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX1NFUlZFUl9GSU5JU0hFRF9COgkJc3RyPSIyR1NGX0IiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9HRVRfQ0xJRU5UX0hFTExPX0E6CQlzdHI9IjJHQ0hfQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9DTElFTlRfSEVMTE9fQjoJCXN0cj0iMkdDSF9CIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9IRUxMT19DOgkJc3RyPSIyR0NIX0MiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19BOgkJc3RyPSIyU1NIX0EiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9IRUxMT19COgkJc3RyPSIyU1NIX0IiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9HRVRfQ0xJRU5UX01BU1RFUl9LRVlfQToJCXN0cj0iMkdDTUtBIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9NQVNURVJfS0VZX0I6CQlzdHI9IjJHQ01LQSI7IGJyZWFrOworY2FzZSBTU0wyX1NUX1NFTkRfU0VSVkVSX1ZFUklGWV9BOgkJc3RyPSIyU1NWX0EiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9WRVJJRllfQjoJCXN0cj0iMlNTVl9CIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfU0VORF9TRVJWRVJfVkVSSUZZX0M6CQlzdHI9IjJTU1ZfQyI7IGJyZWFrOworY2FzZSBTU0wyX1NUX0dFVF9DTElFTlRfRklOSVNIRURfQToJCXN0cj0iMkdDRl9BIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfR0VUX0NMSUVOVF9GSU5JU0hFRF9COgkJc3RyPSIyR0NGX0IiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9GSU5JU0hFRF9BOgkJc3RyPSIyU1NGX0EiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1NFUlZFUl9GSU5JU0hFRF9COgkJc3RyPSIyU1NGX0IiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQToJc3RyPSIyU1JDX0EiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQjoJc3RyPSIyU1JDX0IiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfQzoJc3RyPSIyU1JDX0MiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9TRU5EX1JFUVVFU1RfQ0VSVElGSUNBVEVfRDoJc3RyPSIyU1JDX0QiOyBicmVhazsKK2Nhc2UgU1NMMl9TVF9YNTA5X0dFVF9TRVJWRVJfQ0VSVElGSUNBVEU6CXN0cj0iMlg5R1NDIjsgYnJlYWs7CitjYXNlIFNTTDJfU1RfWDUwOV9HRVRfQ0xJRU5UX0NFUlRJRklDQVRFOglzdHI9IjJYOUdDQyI7IGJyZWFrOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisvKiBTU0x2MyBhZGRpdGlvbnMgKi8KK2Nhc2UgU1NMM19TVF9TV19GTFVTSDoKK2Nhc2UgU1NMM19TVF9DV19GTFVTSDoJCQkJc3RyPSIzRkxVU0giOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19DTE5UX0hFTExPX0E6CQkJc3RyPSIzV0NIX0EiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19DTE5UX0hFTExPX0I6CQkJc3RyPSIzV0NIX0IiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9TUlZSX0hFTExPX0E6CQkJc3RyPSIzUlNIX0EiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9TUlZSX0hFTExPX0I6CQkJc3RyPSIzUlNIX0IiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9DRVJUX0E6CQkJCXN0cj0iM1JTQ19BIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1JfQ0VSVF9COgkJCQlzdHI9IjNSU0NfQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NSX0tFWV9FWENIX0E6CQkJc3RyPSIzUlNLRUEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9LRVlfRVhDSF9COgkJCXN0cj0iM1JTS0VCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1JfQ0VSVF9SRVFfQToJCQlzdHI9IjNSQ1JfQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NSX0NFUlRfUkVRX0I6CQkJc3RyPSIzUkNSX0IiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DUl9TUlZSX0RPTkVfQToJCQlzdHI9IjNSU0RfQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NSX1NSVlJfRE9ORV9COgkJCXN0cj0iM1JTRF9CIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1dfQ0VSVF9BOgkJCQlzdHI9IjNXQ0NfQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NXX0NFUlRfQjoJCQkJc3RyPSIzV0NDX0IiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19DRVJUX0M6CQkJCXN0cj0iM1dDQ19DIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1dfQ0VSVF9EOgkJCQlzdHI9IjNXQ0NfRCI7IGJyZWFrOworY2FzZSBTU0wzX1NUX0NXX0tFWV9FWENIX0E6CQkJc3RyPSIzV0NLRUEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19LRVlfRVhDSF9COgkJCXN0cj0iM1dDS0VCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfQ1dfQ0VSVF9WUkZZX0E6CQkJc3RyPSIzV0NWX0EiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9DV19DRVJUX1ZSRllfQjoJCQlzdHI9IjNXQ1ZfQiI7IGJyZWFrOworCitjYXNlIFNTTDNfU1RfU1dfQ0hBTkdFX0E6CitjYXNlIFNTTDNfU1RfQ1dfQ0hBTkdFX0E6CQkJc3RyPSIzV0NDU0EiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TV19DSEFOR0VfQjoKK2Nhc2UgU1NMM19TVF9DV19DSEFOR0VfQjoJCQlzdHI9IjNXQ0NTQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0ZJTklTSEVEX0E6CitjYXNlIFNTTDNfU1RfQ1dfRklOSVNIRURfQToJCQlzdHI9IjNXRklOQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0ZJTklTSEVEX0I6CitjYXNlIFNTTDNfU1RfQ1dfRklOSVNIRURfQjoJCQlzdHI9IjNXRklOQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NSX0NIQU5HRV9BOgorY2FzZSBTU0wzX1NUX0NSX0NIQU5HRV9BOgkJCXN0cj0iM1JDQ1NBIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1JfQ0hBTkdFX0I6CitjYXNlIFNTTDNfU1RfQ1JfQ0hBTkdFX0I6CQkJc3RyPSIzUkNDU0IiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TUl9GSU5JU0hFRF9BOgorY2FzZSBTU0wzX1NUX0NSX0ZJTklTSEVEX0E6CQkJc3RyPSIzUkZJTkEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TUl9GSU5JU0hFRF9COgorY2FzZSBTU0wzX1NUX0NSX0ZJTklTSEVEX0I6CQkJc3RyPSIzUkZJTkIiOyBicmVhazsKKworY2FzZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9BOgkJCXN0cj0iM1dIUl9BIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1dfSEVMTE9fUkVRX0I6CQkJc3RyPSIzV0hSX0IiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TV19IRUxMT19SRVFfQzoJCQlzdHI9IjNXSFJfQyI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQToJCQlzdHI9IjNSQ0hfQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQjoJCQlzdHI9IjNSQ0hfQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NSX0NMTlRfSEVMTE9fQzoJCQlzdHI9IjNSQ0hfQyI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQToJCQlzdHI9IjNXU0hfQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX1NSVlJfSEVMTE9fQjoJCQlzdHI9IjNXU0hfQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0NFUlRfQToJCQkJc3RyPSIzV1NDX0EiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TV19DRVJUX0I6CQkJCXN0cj0iM1dTQ19CIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1dfS0VZX0VYQ0hfQToJCQlzdHI9IjNXU0tFQSI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX0tFWV9FWENIX0I6CQkJc3RyPSIzV1NLRUIiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TV19DRVJUX1JFUV9BOgkJCXN0cj0iM1dDUl9BIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1dfQ0VSVF9SRVFfQjoJCQlzdHI9IjNXQ1JfQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NXX1NSVlJfRE9ORV9BOgkJCXN0cj0iM1dTRF9BIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1dfU1JWUl9ET05FX0I6CQkJc3RyPSIzV1NEX0IiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TUl9DRVJUX0E6CQkJCXN0cj0iM1JDQ19BIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1JfQ0VSVF9COgkJCQlzdHI9IjNSQ0NfQiI7IGJyZWFrOworY2FzZSBTU0wzX1NUX1NSX0tFWV9FWENIX0E6CQkJc3RyPSIzUkNLRUEiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TUl9LRVlfRVhDSF9COgkJCXN0cj0iM1JDS0VCIjsgYnJlYWs7CitjYXNlIFNTTDNfU1RfU1JfQ0VSVF9WUkZZX0E6CQkJc3RyPSIzUkNWX0EiOyBicmVhazsKK2Nhc2UgU1NMM19TVF9TUl9DRVJUX1ZSRllfQjoJCQlzdHI9IjNSQ1ZfQiI7IGJyZWFrOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDIpICYmICFkZWZpbmVkKE9QRU5TU0xfTk9fU1NMMykKKy8qIFNTTHYyL3YzIGNvbXBhdGliaWxpdHkgc3RhdGVzICovCisvKiBjbGllbnQgKi8KK2Nhc2UgU1NMMjNfU1RfQ1dfQ0xOVF9IRUxMT19BOgkJCXN0cj0iMjNXQ0hBIjsgYnJlYWs7CitjYXNlIFNTTDIzX1NUX0NXX0NMTlRfSEVMTE9fQjoJCQlzdHI9IjIzV0NIQiI7IGJyZWFrOworY2FzZSBTU0wyM19TVF9DUl9TUlZSX0hFTExPX0E6CQkJc3RyPSIyM1JTSEEiOyBicmVhazsKK2Nhc2UgU1NMMjNfU1RfQ1JfU1JWUl9IRUxMT19COgkJCXN0cj0iMjNSU0hBIjsgYnJlYWs7CisvKiBzZXJ2ZXIgKi8KK2Nhc2UgU1NMMjNfU1RfU1JfQ0xOVF9IRUxMT19BOgkJCXN0cj0iMjNSQ0hBIjsgYnJlYWs7CitjYXNlIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQjoJCQlzdHI9IjIzUkNIQiI7IGJyZWFrOworI2VuZGlmCisvKiBEVExTICovCitjYXNlIERUTFMxX1NUX0NSX0hFTExPX1ZFUklGWV9SRVFVRVNUX0E6IHN0cj0iRFJDSFZBIjsgYnJlYWs7CitjYXNlIERUTFMxX1NUX0NSX0hFTExPX1ZFUklGWV9SRVFVRVNUX0I6IHN0cj0iRFJDSFZCIjsgYnJlYWs7CitjYXNlIERUTFMxX1NUX1NXX0hFTExPX1ZFUklGWV9SRVFVRVNUX0E6IHN0cj0iRFdDSFZBIjsgYnJlYWs7CitjYXNlIERUTFMxX1NUX1NXX0hFTExPX1ZFUklGWV9SRVFVRVNUX0I6IHN0cj0iRFdDSFZCIjsgYnJlYWs7CisKK2RlZmF1bHQ6CQkJCQlzdHI9IlVOS1dOICI7IGJyZWFrOworCQl9CisJcmV0dXJuKHN0cik7CisJfQorCitjb25zdCBjaGFyICpTU0xfYWxlcnRfdHlwZV9zdHJpbmdfbG9uZyhpbnQgdmFsdWUpCisJeworCXZhbHVlPj49ODsKKwlpZiAodmFsdWUgPT0gU1NMM19BTF9XQVJOSU5HKQorCQlyZXR1cm4oIndhcm5pbmciKTsKKwllbHNlIGlmICh2YWx1ZSA9PSBTU0wzX0FMX0ZBVEFMKQorCQlyZXR1cm4oImZhdGFsIik7CisJZWxzZQorCQlyZXR1cm4oInVua25vd24iKTsKKwl9CisKK2NvbnN0IGNoYXIgKlNTTF9hbGVydF90eXBlX3N0cmluZyhpbnQgdmFsdWUpCisJeworCXZhbHVlPj49ODsKKwlpZiAodmFsdWUgPT0gU1NMM19BTF9XQVJOSU5HKQorCQlyZXR1cm4oIlciKTsKKwllbHNlIGlmICh2YWx1ZSA9PSBTU0wzX0FMX0ZBVEFMKQorCQlyZXR1cm4oIkYiKTsKKwllbHNlCisJCXJldHVybigiVSIpOworCX0KKworY29uc3QgY2hhciAqU1NMX2FsZXJ0X2Rlc2Nfc3RyaW5nKGludCB2YWx1ZSkKKwl7CisJY29uc3QgY2hhciAqc3RyOworCisJc3dpdGNoICh2YWx1ZSAmIDB4ZmYpCisJCXsKKwljYXNlIFNTTDNfQURfQ0xPU0VfTk9USUZZOgkJc3RyPSJDTiI7IGJyZWFrOworCWNhc2UgU1NMM19BRF9VTkVYUEVDVEVEX01FU1NBR0U6CXN0cj0iVU0iOyBicmVhazsKKwljYXNlIFNTTDNfQURfQkFEX1JFQ09SRF9NQUM6CQlzdHI9IkJNIjsgYnJlYWs7CisJY2FzZSBTU0wzX0FEX0RFQ09NUFJFU1NJT05fRkFJTFVSRToJc3RyPSJERiI7IGJyZWFrOworCWNhc2UgU1NMM19BRF9IQU5EU0hBS0VfRkFJTFVSRToJCXN0cj0iSEYiOyBicmVhazsKKwljYXNlIFNTTDNfQURfTk9fQ0VSVElGSUNBVEU6CQlzdHI9Ik5DIjsgYnJlYWs7CisJY2FzZSBTU0wzX0FEX0JBRF9DRVJUSUZJQ0FURToJCXN0cj0iQkMiOyBicmVhazsKKwljYXNlIFNTTDNfQURfVU5TVVBQT1JURURfQ0VSVElGSUNBVEU6CXN0cj0iVUMiOyBicmVhazsKKwljYXNlIFNTTDNfQURfQ0VSVElGSUNBVEVfUkVWT0tFRDoJc3RyPSJDUiI7IGJyZWFrOworCWNhc2UgU1NMM19BRF9DRVJUSUZJQ0FURV9FWFBJUkVEOglzdHI9IkNFIjsgYnJlYWs7CisJY2FzZSBTU0wzX0FEX0NFUlRJRklDQVRFX1VOS05PV046CXN0cj0iQ1UiOyBicmVhazsKKwljYXNlIFNTTDNfQURfSUxMRUdBTF9QQVJBTUVURVI6CQlzdHI9IklQIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX0RFQ1JZUFRJT05fRkFJTEVEOgkJc3RyPSJEQyI7IGJyZWFrOworCWNhc2UgVExTMV9BRF9SRUNPUkRfT1ZFUkZMT1c6CQlzdHI9IlJPIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX1VOS05PV05fQ0E6CQlzdHI9IkNBIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX0FDQ0VTU19ERU5JRUQ6CQlzdHI9IkFEIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX0RFQ09ERV9FUlJPUjoJCXN0cj0iREUiOyBicmVhazsKKwljYXNlIFRMUzFfQURfREVDUllQVF9FUlJPUjoJCXN0cj0iQ1kiOyBicmVhazsKKwljYXNlIFRMUzFfQURfRVhQT1JUX1JFU1RSSUNUSU9OOglzdHI9IkVSIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX1BST1RPQ09MX1ZFUlNJT046CQlzdHI9IlBWIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX0lOU1VGRklDSUVOVF9TRUNVUklUWToJc3RyPSJJUyI7IGJyZWFrOworCWNhc2UgVExTMV9BRF9JTlRFUk5BTF9FUlJPUjoJCXN0cj0iSUUiOyBicmVhazsKKwljYXNlIFRMUzFfQURfVVNFUl9DQU5DRUxMRUQ6CQlzdHI9IlVTIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX05PX1JFTkVHT1RJQVRJT046CQlzdHI9Ik5SIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX1VOU1VQUE9SVEVEX0VYVEVOU0lPTjoJc3RyPSJVRSI7IGJyZWFrOworCWNhc2UgVExTMV9BRF9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEU6CXN0cj0iQ08iOyBicmVhazsKKwljYXNlIFRMUzFfQURfVU5SRUNPR05JWkVEX05BTUU6CQlzdHI9IlVOIjsgYnJlYWs7CisJY2FzZSBUTFMxX0FEX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0U6IHN0cj0iQlIiOyBicmVhazsKKwljYXNlIFRMUzFfQURfQkFEX0NFUlRJRklDQVRFX0hBU0hfVkFMVUU6IHN0cj0iQkgiOyBicmVhazsKKwljYXNlIFRMUzFfQURfVU5LTk9XTl9QU0tfSURFTlRJVFk6CXN0cj0iVVAiOyBicmVhazsKKwlkZWZhdWx0OgkJCQlzdHI9IlVLIjsgYnJlYWs7CisJCX0KKwlyZXR1cm4oc3RyKTsKKwl9CisKK2NvbnN0IGNoYXIgKlNTTF9hbGVydF9kZXNjX3N0cmluZ19sb25nKGludCB2YWx1ZSkKKwl7CisJY29uc3QgY2hhciAqc3RyOworCisJc3dpdGNoICh2YWx1ZSAmIDB4ZmYpCisJCXsKKwljYXNlIFNTTDNfQURfQ0xPU0VfTk9USUZZOgorCQlzdHI9ImNsb3NlIG5vdGlmeSI7CisJCWJyZWFrOworCWNhc2UgU1NMM19BRF9VTkVYUEVDVEVEX01FU1NBR0U6CisJCXN0cj0idW5leHBlY3RlZF9tZXNzYWdlIjsKKwkJYnJlYWs7CisJY2FzZSBTU0wzX0FEX0JBRF9SRUNPUkRfTUFDOgorCQlzdHI9ImJhZCByZWNvcmQgbWFjIjsKKwkJYnJlYWs7CisJY2FzZSBTU0wzX0FEX0RFQ09NUFJFU1NJT05fRkFJTFVSRToKKwkJc3RyPSJkZWNvbXByZXNzaW9uIGZhaWx1cmUiOworCQlicmVhazsKKwljYXNlIFNTTDNfQURfSEFORFNIQUtFX0ZBSUxVUkU6CisJCXN0cj0iaGFuZHNoYWtlIGZhaWx1cmUiOworCQlicmVhazsKKwljYXNlIFNTTDNfQURfTk9fQ0VSVElGSUNBVEU6CisJCXN0cj0ibm8gY2VydGlmaWNhdGUiOworCQlicmVhazsKKwljYXNlIFNTTDNfQURfQkFEX0NFUlRJRklDQVRFOgorCQlzdHI9ImJhZCBjZXJ0aWZpY2F0ZSI7CisJCWJyZWFrOworCWNhc2UgU1NMM19BRF9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURToKKwkJc3RyPSJ1bnN1cHBvcnRlZCBjZXJ0aWZpY2F0ZSI7CisJCWJyZWFrOworCWNhc2UgU1NMM19BRF9DRVJUSUZJQ0FURV9SRVZPS0VEOgorCQlzdHI9ImNlcnRpZmljYXRlIHJldm9rZWQiOworCQlicmVhazsKKwljYXNlIFNTTDNfQURfQ0VSVElGSUNBVEVfRVhQSVJFRDoKKwkJc3RyPSJjZXJ0aWZpY2F0ZSBleHBpcmVkIjsKKwkJYnJlYWs7CisJY2FzZSBTU0wzX0FEX0NFUlRJRklDQVRFX1VOS05PV046CisJCXN0cj0iY2VydGlmaWNhdGUgdW5rbm93biI7CisJCWJyZWFrOworCWNhc2UgU1NMM19BRF9JTExFR0FMX1BBUkFNRVRFUjoKKwkJc3RyPSJpbGxlZ2FsIHBhcmFtZXRlciI7CisJCWJyZWFrOworCWNhc2UgVExTMV9BRF9ERUNSWVBUSU9OX0ZBSUxFRDoKKwkJc3RyPSJkZWNyeXB0aW9uIGZhaWxlZCI7CisJCWJyZWFrOworCWNhc2UgVExTMV9BRF9SRUNPUkRfT1ZFUkZMT1c6CisJCXN0cj0icmVjb3JkIG92ZXJmbG93IjsKKwkJYnJlYWs7CisJY2FzZSBUTFMxX0FEX1VOS05PV05fQ0E6CisJCXN0cj0idW5rbm93biBDQSI7CisJCWJyZWFrOworCWNhc2UgVExTMV9BRF9BQ0NFU1NfREVOSUVEOgorCQlzdHI9ImFjY2VzcyBkZW5pZWQiOworCQlicmVhazsKKwljYXNlIFRMUzFfQURfREVDT0RFX0VSUk9SOgorCQlzdHI9ImRlY29kZSBlcnJvciI7CisJCWJyZWFrOworCWNhc2UgVExTMV9BRF9ERUNSWVBUX0VSUk9SOgorCQlzdHI9ImRlY3J5cHQgZXJyb3IiOworCQlicmVhazsKKwljYXNlIFRMUzFfQURfRVhQT1JUX1JFU1RSSUNUSU9OOgorCQlzdHI9ImV4cG9ydCByZXN0cmljdGlvbiI7CisJCWJyZWFrOworCWNhc2UgVExTMV9BRF9QUk9UT0NPTF9WRVJTSU9OOgorCQlzdHI9InByb3RvY29sIHZlcnNpb24iOworCQlicmVhazsKKwljYXNlIFRMUzFfQURfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorCQlzdHI9Imluc3VmZmljaWVudCBzZWN1cml0eSI7CisJCWJyZWFrOworCWNhc2UgVExTMV9BRF9JTlRFUk5BTF9FUlJPUjoKKwkJc3RyPSJpbnRlcm5hbCBlcnJvciI7CisJCWJyZWFrOworCWNhc2UgVExTMV9BRF9VU0VSX0NBTkNFTExFRDoKKwkJc3RyPSJ1c2VyIGNhbmNlbGVkIjsKKwkJYnJlYWs7CisJY2FzZSBUTFMxX0FEX05PX1JFTkVHT1RJQVRJT046CisJCXN0cj0ibm8gcmVuZWdvdGlhdGlvbiI7CisJCWJyZWFrOworCWNhc2UgVExTMV9BRF9VTlNVUFBPUlRFRF9FWFRFTlNJT046CisJCXN0cj0idW5zdXBwb3J0ZWQgZXh0ZW5zaW9uIjsKKwkJYnJlYWs7CisJY2FzZSBUTFMxX0FEX0NFUlRJRklDQVRFX1VOT0JUQUlOQUJMRToKKwkJc3RyPSJjZXJ0aWZpY2F0ZSB1bm9idGFpbmFibGUiOworCQlicmVhazsKKwljYXNlIFRMUzFfQURfVU5SRUNPR05JWkVEX05BTUU6CisJCXN0cj0idW5yZWNvZ25pemVkIG5hbWUiOworCQlicmVhazsKKwljYXNlIFRMUzFfQURfQkFEX0NFUlRJRklDQVRFX1NUQVRVU19SRVNQT05TRToKKwkJc3RyPSJiYWQgY2VydGlmaWNhdGUgc3RhdHVzIHJlc3BvbnNlIjsKKwkJYnJlYWs7CisJY2FzZSBUTFMxX0FEX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFOgorCQlzdHI9ImJhZCBjZXJ0aWZpY2F0ZSBoYXNoIHZhbHVlIjsKKwkJYnJlYWs7CisJY2FzZSBUTFMxX0FEX1VOS05PV05fUFNLX0lERU5USVRZOgorCQlzdHI9InVua25vd24gUFNLIGlkZW50aXR5IjsKKwkJYnJlYWs7CisJZGVmYXVsdDogc3RyPSJ1bmtub3duIjsgYnJlYWs7CisJCX0KKwlyZXR1cm4oc3RyKTsKKwl9CisKK2NvbnN0IGNoYXIgKlNTTF9yc3RhdGVfc3RyaW5nKGNvbnN0IFNTTCAqcykKKwl7CisJY29uc3QgY2hhciAqc3RyOworCisJc3dpdGNoIChzLT5yc3RhdGUpCisJCXsKKwljYXNlIFNTTF9TVF9SRUFEX0hFQURFUjpzdHI9IlJIIjsgYnJlYWs7CisJY2FzZSBTU0xfU1RfUkVBRF9CT0RZOglzdHI9IlJCIjsgYnJlYWs7CisJY2FzZSBTU0xfU1RfUkVBRF9ET05FOglzdHI9IlJEIjsgYnJlYWs7CisJZGVmYXVsdDogc3RyPSJ1bmtub3duIjsgYnJlYWs7CisJCX0KKwlyZXR1cm4oc3RyKTsKKwl9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvc3NsX3Rhc2suYyBiL2xpYi9vcGVuc3NsL3NzbC9zc2xfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Y2U0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvc3NsX3Rhc2suYwpAQCAtMCwwICsxLDM2OSBAQAorLyogc3NsL3NzbF90YXNrLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKworLyogVk1TICovCisvKgorICogREVDbmV0IG9iamVjdCBmb3Igc2VydmljaW5nIFNTTC4gIFdlIGFjY2VwdCB0aGUgaW5ib3VuZCBhbmQgc3BlYWsgYQorICogc2ltcGxlIHByb3RvY29sIGZvciBtdWx0aXBsZXhpbmcgdGhlIDIgZGF0YSBzdHJlYW1zIChhcHBsaWNhdGlvbiBhbmQKKyAqIHNzbCBkYXRhKSBvdmVyIHRoaXMgbG9naWNhbCBsaW5rLgorICoKKyAqIExvZ2ljYWwgbmFtZXM6CisgKiAgICBTU0xfQ0lQSEVSCURlZmluZXMgYSBsaXN0IG9mIGNpcGhlciBzcGVjaWZpY2F0aW9ucyB0aGUgc2VydmVyCisgKgkJCXdpbGwgc3VwcG9ydCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgorICogICAgU1NMX1NFUlZFUl9DRVJUSUZJQ0FURQorICoJCQlQb2ludHMgdG8gUEVNIChwcml2YWN5IGVuaGFuY2VkIG1haWwpIGZpbGUgdGhhdAorICoJCQljb250YWlucyB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIHBhc3N3b3JkLgorICogICAgU1lTJE5FVAkJTG9naWNhbCBjcmVhdGVkIGJ5IG5ldHNlcnZlci5leGUgYXMgaG9vayBmb3IgY29tcGxldGluZworICoJCQlERUNuZXQgbG9naWNhbCBsaW5rLgorICoKKyAqIEVhY2ggTlNQIG1lc3NhZ2Ugc2VudCBvdmVyIHRoZSBERUNuZXQgbGluayBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgKiAgICBzdHJ1Y3QgcnBjX21zZyB7IAorICogICAgICBjaGFyIGNoYW5uZWw7CisgKiAgICAgIGNoYXIgZnVuY3Rpb247CisgKiAgICAgIHNob3J0IGxlbmd0aDsKKyAqICAgICAgY2hhciBkYXRhW01BWF9EQVRBXTsKKyAqICAgIH0gbXNnOworICoKKyAqIFRoZSBjaGFubmVsIGZpZWxkIGRlc2lnbmF0ZXMgdGhlIHZpcnR1YWwgZGF0YSBzdHJlYW0gdGhpcyBtZXNzYWdlIGFwcGxpZXMKKyAqIHRvIGFuZCBpcyBvbmUgb2Y6CisgKiAgIEEgLSBBcHBsaWNhdGlvbiBkYXRhIChwYXlsb2FkKS4KKyAqICAgUiAtIFJlbW90ZSBjbGllbnQgY29ubmVjdGlvbiB0aGF0IGluaXRpYXRlZCB0aGUgU1NMIGNvbm5lY3Rpb24uICBFbmNyeXB0ZWQKKyAqICAgICAgIGRhdGEgaXMgc2VudCBvdmVyIHRoaXMgY29ubmVjdGlvbi4KKyAqICAgRyAtIEdlbmVyYWwgZGF0YSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCisgKgorICogVGhlIGRhdGEgc3RyZWFtcyBhcmUgaGFsZi1kdXBsZXggcmVhZC93cml0ZSBhbmQgaGF2ZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICogICBHIC0gR2V0LCByZXF1ZXN0cyB0aGF0IHVwIHRvIG1zZy5sZW5ndGggYnl0ZXMgb2YgZGF0YSBiZSByZXR1cm5lZC4gIFRoZQorICogICAgICAgZGF0YSBpcyByZXR1cm5lZCBpbiB0aGUgbmV4dCAnQycgZnVuY3Rpb24gcmVzcG9uc2UgdGhhdCBtYXRjaGVzIHRoZQorICogICAgICAgcmVxdWVzdGluZyBjaGFubmVsLgorICogICBQIC0gUHV0LCByZXF1ZXN0cyB0aGF0IHRoZSBmaXJzdCBtc2cubGVuZ3RoIGJ5dGVzIG9mIG1zZy5kYXRhIGJlIGFwcGVuZGVkCisgKiAgICAgICB0byB0aGUgZGVzaWduYXRlZCBzdHJlYW0uCisgKiAgIEMgLSBDb25maXJtcyBhIGdldCBvciBwdXQuICBFdmVyeSBnZXQgYW5kIHB1dCB3aWxsIGdldCBhIGNvbmZpcm0gcmVzcG9uc2UsCisgKiAgICAgICB5b3UgY2Fubm90IGluaXRpYXRlIGFub3RoZXIgZnVuY3Rpb24gb24gYSBjaGFubmVsIHVudGlsIHRoZSBwcmV2aW91cworICogICAgICAgb3BlcmF0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4KKyAqCisgKiAgVGhlIDIgY2hhbm5lbHMgbWF5IGludGVybGVhdmUgdGhlaXIgb3BlcmF0aW9ucywgZm9yIGV4YW1wbGU6CisgKiAgICAgICAgU2VydmVyIG1zZyAgICAgICAgICAgQ2xpZW50IG1zZworICogICAgICAgICBBLCBHZXQsIDQwOTIgICAgICAgICAgLS0tLT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tICBSLCBnZXQsIDQwOTIKKyAqICAgICAgICAgUiwgQ29uZmlybSwge2hlbGxvfSAgIC0tLS0+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LS0tLSAgUiwgcHV0LCB7c3J2IGhlbGxvfQorICogICAgICAgICBSLCBDb25maXJtLCAwICAgICAgICAgLS0tLT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4JCShTU0wgaGFuZHNoYWtlIGNvbXBsZXRlZCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gICAgICAgICAgICAgIChyZWFkIGZpcnN0IGFwcCBkYXRhKS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tICBBLCBjb25maXJtLCB7aHR0cCBkYXRhfQorICogICAgICAgICBBLCBQdXQsIHtodHRwIGRhdGF9ICAgLS0tLT4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtLS0tICBBLCBjb25maXJtLCAwCisgKgorICogIFRoZSBsZW5ndGggZmllbGQgaXMgbm90IHBlcm1pdHRlZCB0byBiZSBsYXJnZXIgdGhhdCA0MDkyIGJ5dGVzLgorICoKKyAqIEF1dGhvcjogRGF2ZSBKb25lcworICogRGF0ZTogICAyMi1KVUwtMTk5NgorICovCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxpb2RlZi5oPgkJLyogVk1TIElPJF8gZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxkZXNjcmlwLmg+CQkvKiBWTVMgc3RyaW5nIGRlc2NyaXB0b3JzICovCitleHRlcm4gaW50IFNZUyRRSU9XKCksIFNZUyRBU1NJR04oKTsKK2ludCBMSUIkSU5JVF9USU1FUigpLCBMSUIkU0hPV19USU1FUigpOworCisjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmcm9tIHNzbHRlc3QuYyAqLworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJlX29zLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9lcnIuaD4KKworaW50IE1TX0NBTExCQUNLIHZlcmlmeV9jYWxsYmFjayhpbnQgb2ssIFg1MDkgKnhzLCBYNTA5ICp4aSwgaW50IGRlcHRoLAorCWludCBlcnJvcik7CitCSU8gKmJpb19lcnI9TlVMTDsKK0JJTyAqYmlvX3N0ZG91dD1OVUxMOworQklPX01FVEhPRCAqQklPX3NfcnRjcCgpOworCitzdGF0aWMgY2hhciAqY2lwaGVyPU5VTEw7CitpbnQgdmVyYm9zZT0xOworI2lmZGVmIEZJT05CSU8KK3N0YXRpYyBpbnQgc19uYmlvPTA7CisjZW5kaWYKKyNkZWZpbmUgVEVTVF9TRVJWRVJfQ0VSVCAiU1NMX1NFUlZFUl9DRVJUSUZJQ0FURSIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RydWN0IHJwY19tc2cgewkJLyogU2hvdWxkIGhhdmUgbWVtYmVyIGFsaWdubWVudCBpbmhpYml0ZWQgKi8KKyAgIGNoYXIgY2hhbm5lbDsJCS8qICdBJy1hcHAgZGF0YS4gJ1InLXJlbW90ZSBjbGllbnQgJ0cnLWdsb2JhbCAqLworICAgY2hhciBmdW5jdGlvbjsJCS8qICdHJy1nZXQsICdQJy1wdXQsICdDJy1jb25maXJtLCAnWCctY2xvc2UgKi8KKyAgIHVuc2lnbmVkIHNob3J0IGludCBsZW5ndGg7CS8qIEFtb3VudCBvZiBkYXRhIHJldHVybmVkIG9yIG1heCB0byByZXR1cm4gKi8KKyAgIGNoYXIgZGF0YVs0MDkyXTsJCS8qIHZhcmlhYmxlIGRhdGEgKi8KK307CisjZGVmaW5lIFJQQ19IRFJfU0laRSAoc2l6ZW9mKHN0cnVjdCBycGNfbXNnKSAtIDQwOTIpCisKK3N0YXRpYyAkREVTQ1JJUFRPUihzeXNuZXQsICJTWVMkTkVUIik7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGlvX2NoYW5uZWw7CisKK3N0cnVjdCBpb19zdGF0dXMgeworICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIHN0c3ZhbDsKK307CitpbnQgZG9pdChpb19jaGFubmVsIGNoYW4sIFNTTF9DVFggKnNfY3R4ICk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBEZWNuZXQgSS9PIHJvdXRpbmVzLgorICovCitzdGF0aWMgaW50IGdldCAoIGlvX2NoYW5uZWwgY2hhbiwgY2hhciAqYnVmZmVyLCBpbnQgbWF4bGVuLCBpbnQgKmxlbmd0aCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBzdHJ1Y3QgaW9fc3RhdHVzIGlvc2I7CisgICAgc3RhdHVzID0gU1lTJFFJT1cgKCAwLCBjaGFuLCBJTyRfUkVBRFZCTEssICZpb3NiLCAwLCAwLAorCWJ1ZmZlciwgbWF4bGVuLCAwLCAwLCAwLCAwICk7CisgICAgaWYgKCAoc3RhdHVzJjEpID09IDEgKSBzdGF0dXMgPSBpb3NiLnN0YXR1czsKKyAgICBpZiAoIChzdGF0dXMmMSkgPT0gMSApICpsZW5ndGggPSBpb3NiLmNvdW50OworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgcHV0ICggaW9fY2hhbm5lbCBjaGFuLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGggKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RydWN0IGlvX3N0YXR1cyBpb3NiOworICAgIHN0YXR1cyA9IFNZUyRRSU9XICggMCwgY2hhbiwgSU8kX1dSSVRFVkJMSywgJmlvc2IsIDAsIDAsCisJYnVmZmVyLCBsZW5ndGgsIDAsIDAsIDAsIDAgKTsKKyAgICBpZiAoIChzdGF0dXMmMSkgPT0gMSApIHN0YXR1cyA9IGlvc2Iuc3RhdHVzOworICAgIHJldHVybiBzdGF0dXM7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSGFuZGxlIG9wZXJhdGlvbnMgb24gdGhlICdHJyBjaGFubmVsLgorICovCitzdGF0aWMgaW50IGdlbmVyYWxfcmVxdWVzdCAoIGlvX2NoYW5uZWwgY2hhbiwgc3RydWN0IHJwY19tc2cgKm1zZywgaW50IGxlbmd0aCApCit7CisgICAgcmV0dXJuIDQ4OworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBtYWluICggaW50IGFyZ2MsIGNoYXIgKiphcmd2ICkKK3sKKyAgICBpbnQgc3RhdHVzLCBsZW5ndGg7CisgICAgaW9fY2hhbm5lbCBjaGFuOworICAgIHN0cnVjdCBycGNfbXNnIG1zZzsKKworCWNoYXIgKkNBcGF0aD1OVUxMLCpDQWZpbGU9TlVMTDsKKwlpbnQgYmFkb3A9MDsKKwlpbnQgcmV0PTE7CisJaW50IGNsaWVudF9hdXRoPTA7CisJaW50IHNlcnZlcl9hdXRoPTA7CisJU1NMX0NUWCAqc19jdHg9TlVMTDsKKyAgICAvKgorICAgICAqIENvbmZpcm0gbG9naWNhbCBsaW5rIHdpdGggaW5pdGlhdGluZyBjbGllbnQuCisgICAgICovCisgICAgTElCJElOSVRfVElNRVIoKTsKKyAgICBzdGF0dXMgPSBTWVMkQVNTSUdOICggJnN5c25ldCwgJmNoYW4sIDAsIDAsIDAgKTsKKyAgICBwcmludGYoInN0YXR1cyBvZiBhc3NpZ24gdG8gU1lTJE5FVDogJWRcbiIsIHN0YXR1cyApOworICAgIC8qCisgICAgICogSW5pdGlhbGl6ZSBzdGFuZGFyZCBvdXQgYW5kIGVycm9yIGZpbGVzLgorICAgICAqLworCWlmIChiaW9fZXJyID09IE5VTEwpCisJCWlmICgoYmlvX2Vycj1CSU9fbmV3KEJJT19zX2ZpbGUoKSkpICE9IE5VTEwpCisJCQlCSU9fc2V0X2ZwKGJpb19lcnIsc3RkZXJyLEJJT19OT0NMT1NFKTsKKwlpZiAoYmlvX3N0ZG91dCA9PSBOVUxMKQorCQlpZiAoKGJpb19zdGRvdXQ9QklPX25ldyhCSU9fc19maWxlKCkpKSAhPSBOVUxMKQorCQkJQklPX3NldF9mcChiaW9fc3Rkb3V0LHN0ZG91dCxCSU9fTk9DTE9TRSk7CisgICAgLyoKKyAgICAgKiBnZXQgdGhlIHByZWZlcnJlZCBjaXBoZXIgbGlzdCBhbmQgb3RoZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgKi8KKwlpZiAoY2lwaGVyID09IE5VTEwpIGNpcGhlcj1nZXRlbnYoIlNTTF9DSVBIRVIiKTsKKwlwcmludGYoImNpcGhlciBsaXN0OiAlc1xuIiwgY2lwaGVyID8gY2lwaGVyIDogInt1bmRlZmluZWR9IiApOworCisJU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworCU9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCk7CisKKy8qIERSTSwgdGhpcyB3YXMgdGhlIG9yaWdpbmFsLCBidXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBTU0x2MigpCisJc19jdHg9U1NMX0NUWF9uZXcoU1NMdjIoKSk7CisqLworCXNfY3R4PVNTTF9DVFhfbmV3KFNTTHYyX3NlcnZlcl9tZXRob2QoKSk7CisKKwlpZiAoc19jdHggPT0gTlVMTCkgZ290byBlbmQ7CisKKwlTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9maWxlKHNfY3R4LFRFU1RfU0VSVkVSX0NFUlQsU1NMX0ZJTEVUWVBFX1BFTSk7CisJU1NMX0NUWF91c2VfUlNBUHJpdmF0ZUtleV9maWxlKHNfY3R4LFRFU1RfU0VSVkVSX0NFUlQsU1NMX0ZJTEVUWVBFX1BFTSk7CisJcHJpbnRmKCJMb2FkZWQgc2VydmVyIGNlcnRpZmljYXRlOiAnJXMnXG4iLCBURVNUX1NFUlZFUl9DRVJUICk7CisKKyAgICAvKgorICAgICAqIFRha2UgY29tbWFuZHMgZnJvbSBjbGllbnQgdW50aWwgYmFkIHN0YXR1cy4KKyAgICAgKi8KKyAgICBMSUIkU0hPV19USU1FUigpOworICAgIHN0YXR1cyA9IGRvaXQgKCBjaGFuLCBzX2N0eCApOworICAgIExJQiRTSE9XX1RJTUVSKCk7CisgICAgLyoKKyAgICAgKiBkbyBmaW5hbCBjbGVhbnVwIGFuZCBleGl0LgorICAgICAqLworZW5kOgorCWlmIChzX2N0eCAhPSBOVUxMKSBTU0xfQ1RYX2ZyZWUoc19jdHgpOworICAgIExJQiRTSE9XX1RJTUVSKCk7CisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBkb2l0KGlvX2NoYW5uZWwgY2hhbiwgU1NMX0NUWCAqc19jdHggKQoreworICAgIGludCBzdGF0dXMsIGxlbmd0aCwgbGlua19zdGF0ZTsKKyAgICAgc3RydWN0IHJwY19tc2cgbXNnOworCisJU1NMICpzX3NzbD1OVUxMOworCUJJTyAqY190b19zPU5VTEw7CisJQklPICpzX3RvX2M9TlVMTDsKKwlCSU8gKmNfYmlvPU5VTEw7CisJQklPICpzX2Jpbz1OVUxMOworCWludCBpOworCWludCBkb25lPTA7CisKKwlzX3NzbD1TU0xfbmV3KHNfY3R4KTsKKwlpZiAoc19zc2wgPT0gTlVMTCkgZ290byBlcnI7CisKKwljX3RvX3M9QklPX25ldyhCSU9fc19ydGNwKCkpOworCXNfdG9fYz1CSU9fbmV3KEJJT19zX3J0Y3AoKSk7CisJaWYgKChzX3RvX2MgPT0gTlVMTCkgfHwgKGNfdG9fcyA9PSBOVUxMKSkgZ290byBlcnI7CisvKiBvcmlnaW5hbCwgRFJNIDI0LVNFUC0xOTk3CisJQklPX3NldF9mZCAoIGNfdG9fcywgIiIsIGNoYW4gKTsKKwlCSU9fc2V0X2ZkICggc190b19jLCAiIiwgY2hhbiApOworKi8KKwlCSU9fc2V0X2ZkICggY190b19zLCAwLCBjaGFuICk7CisJQklPX3NldF9mZCAoIHNfdG9fYywgMCwgY2hhbiApOworCisJY19iaW89QklPX25ldyhCSU9fZl9zc2woKSk7CisJc19iaW89QklPX25ldyhCSU9fZl9zc2woKSk7CisJaWYgKChjX2JpbyA9PSBOVUxMKSB8fCAoc19iaW8gPT0gTlVMTCkpIGdvdG8gZXJyOworCisJU1NMX3NldF9hY2NlcHRfc3RhdGUoc19zc2wpOworCVNTTF9zZXRfYmlvKHNfc3NsLGNfdG9fcyxzX3RvX2MpOworCUJJT19zZXRfc3NsKHNfYmlvLHNfc3NsLEJJT19DTE9TRSk7CisKKwkvKiBXZSBjYW4gYWx3YXlzIGRvIHdyaXRlcyAqLworCXByaW50ZigiQmVnaW4gZG9pdCBtYWluIGxvb3BcbiIpOworCS8qCisJICogTGluayBzdGF0ZXM6IDAtaWRsZSwgMS1yZWFkIHBlbmRpbmcsIDItd3JpdGUgcGVuZGluZywgMy1jbG9zZWQuCisJICovCisJZm9yIChsaW5rX3N0YXRlID0gMDsgbGlua19zdGF0ZSA8IDM7ICkgeworCSAgICAvKgorCSAgICAgKiBXYWl0IGZvciByZW1vdGUgZW5kIHRvIHJlcXVlc3QgZGF0YSBhY3Rpb24gb24gQSBjaGFubmVsLgorCSAgICAgKi8KKwkgICAgd2hpbGUgKCBsaW5rX3N0YXRlID09IDAgKSB7CisJCXN0YXR1cyA9IGdldCAoIGNoYW4sIChjaGFyICopICZtc2csIHNpemVvZihtc2cpLCAmbGVuZ3RoICk7CisJCWlmICggKHN0YXR1cyYxKSA9PSAwICkgeworCQkgICAgcHJpbnRmKCJFcnJvciBpbiBtYWluIGxvb3AgZ2V0OiAlZFxuIiwgc3RhdHVzICk7CisJCSAgICBsaW5rX3N0YXRlID0gMzsKKwkJICAgIGJyZWFrOworCQl9CisJICAgCWlmICggbGVuZ3RoIDwgUlBDX0hEUl9TSVpFICkgeworCQkgICAgcHJpbnRmKCJFcnJvciBpbiBtYWluIGxvb3AgZ2V0IHNpemU6ICVkXG4iLCBsZW5ndGggKTsKKwkJICAgIGJyZWFrOworCQkgICAgbGlua19zdGF0ZSA9IDM7CisJCX0KKwkgICAJaWYgKCBtc2cuY2hhbm5lbCAhPSAnQScgKSB7CisJCSAgICBwcmludGYoIkVycm9yIGluIG1haW4gbG9vcCwgdW5leHBlY3RlZCBjaGFubmVsOiAlY1xuIiwgCisJCQltc2cuY2hhbm5lbCApOworCQkgICAgYnJlYWs7CisJCSAgICBsaW5rX3N0YXRlID0gMzsKKwkJfQorCQlpZiAoIG1zZy5mdW5jdGlvbiA9PSAnRycgKSB7CisJCSAgICBsaW5rX3N0YXRlID0gMTsKKwkJfSBlbHNlIGlmICggbXNnLmZ1bmN0aW9uID09ICdQJyApIHsKKwkJICAgIGxpbmtfc3RhdGUgPSAyOwkvKiB3cml0ZSBwZW5kaW5nICovCisJCX0gZWxzZSBpZiAoIG1zZy5mdW5jdGlvbiA9PSAnWCcgKSB7CisJCSAgICBsaW5rX3N0YXRlID0gMzsKKwkJfSBlbHNlIHsKKwkJICAgIGxpbmtfc3RhdGUgPSAzOworCQl9CisJICAgIH0KKwkgICAgaWYgKCBsaW5rX3N0YXRlID09IDEgKSB7CisJCWkgPSBCSU9fcmVhZCAoIHNfYmlvLCBtc2cuZGF0YSwgbXNnLmxlbmd0aCApOworCQlpZiAoIGkgPCAwICkgbGlua19zdGF0ZSA9IDM7CisJCWVsc2UgeworCQkgICAgbXNnLmNoYW5uZWwgPSAnQSc7CisJCSAgICBtc2cuZnVuY3Rpb24gPSAnQyc7CQkvKiBjb25maXJtICovCisJCSAgICBtc2cubGVuZ3RoID0gaTsKKwkJICAgIHN0YXR1cyA9IHB1dCAoIGNoYW4sIChjaGFyICopICZtc2csIGkrUlBDX0hEUl9TSVpFICk7CisJCSAgICBpZiAoIChzdGF0dXMmMSkgPT0gMCApIGJyZWFrOworCQkgICAgbGlua19zdGF0ZSA9IDA7CisJCX0KKwkgICAgfSBlbHNlIGlmICggbGlua19zdGF0ZSA9PSAyICkgeworCQlpID0gQklPX3dyaXRlICggc19iaW8sIG1zZy5kYXRhLCBtc2cubGVuZ3RoICk7CisJCWlmICggaSA8IDAgKSBsaW5rX3N0YXRlID0gMzsKKwkJZWxzZSB7CisJCSAgICBtc2cuY2hhbm5lbCA9ICdBJzsKKwkJICAgIG1zZy5mdW5jdGlvbiA9ICdDJzsJCS8qIGNvbmZpcm0gKi8KKwkJICAgIG1zZy5sZW5ndGggPSAwOworCQkgICAgc3RhdHVzID0gcHV0ICggY2hhbiwgKGNoYXIgKikgJm1zZywgUlBDX0hEUl9TSVpFICk7CisJCSAgICBpZiAoIChzdGF0dXMmMSkgPT0gMCApIGJyZWFrOworCQkgICAgbGlua19zdGF0ZSA9IDA7CisJCX0KKwkgICAgfQorCX0KKwlmcHJpbnRmKHN0ZG91dCwiRE9ORVxuIik7CitlcnI6CisJLyogV2UgaGF2ZSB0byBzZXQgdGhlIEJJTydzIHRvIE5VTEwgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZQorCSAqIGZyZWUoKWVkIHR3aWNlLiAgT25jZSB3aGVuIHRoIHNfc3NsIGlzIFNTTF9mcmVlKCllZCBhbmQKKwkgKiBhZ2FpbiB3aGVuIGNfc3NsIGlzIFNTTF9mcmVlKCllZC4KKwkgKiBUaGlzIGlzIGEgaGFjayByZXF1aXJlZCBiZWNhdXNlIHNfc3NsIGFuZCBjX3NzbCBhcmUgc2hhcmluZyB0aGUgc2FtZQorCSAqIEJJTyBzdHJ1Y3R1cmUgYW5kIFNTTF9zZXRfYmlvKCkgYW5kIFNTTF9mcmVlKCkgYXV0b21hdGljYWxseQorCSAqIEJJT19mcmVlIG5vbiBOVUxMIGVudHJpZXMuCisJICogWW91IHNob3VsZCBub3Qgbm9ybWFsbHkgZG8gdGhpcyBvciBiZSByZXF1aXJlZCB0byBkbyB0aGlzICovCisJc19zc2wtPnJiaW89TlVMTDsKKwlzX3NzbC0+d2Jpbz1OVUxMOworCisJaWYgKGNfdG9fcyAhPSBOVUxMKSBCSU9fZnJlZShjX3RvX3MpOworCWlmIChzX3RvX2MgIT0gTlVMTCkgQklPX2ZyZWUoc190b19jKTsKKwlpZiAoY19iaW8gIT0gTlVMTCkgQklPX2ZyZWUoY19iaW8pOworCWlmIChzX2JpbyAhPSBOVUxMKSBCSU9fZnJlZShzX2Jpbyk7CisJcmV0dXJuKDApOworfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3NzbF90eHQuYyBiL2xpYi9vcGVuc3NsL3NzbC9zc2xfdHh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyMjQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC9zc2xfdHh0LmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qIHNzbC9zc2xfdHh0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNSBOb2tpYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgcG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgaXMgZGV2ZWxvcGVkIGJ5CisgKiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiwgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mCisgKiBOb2tpYSBDb3Jwb3JhdGlvbiwgY29uc2lzdHMgb2YgdGhlICJQU0siIChQcmUtU2hhcmVkIEtleSkgY2lwaGVyc3VpdGVzCisgKiBzdXBwb3J0IChzZWUgUkZDIDQyNzkpIHRvIE9wZW5TU0wuCisgKgorICogTm8gcGF0ZW50IGxpY2Vuc2VzIG9yIG90aGVyIHJpZ2h0cyBleGNlcHQgdGhvc2UgZXhwcmVzc2x5IHN0YXRlZCBpbgorICogdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UgbGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgZ3JhbnRlZCBvciByZWNlaXZlZAorICogZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwsIG9yIG90aGVyd2lzZS4KKyAqCisgKiBObyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBOb2tpYSB0aGF0IHRoZSBDb250cmlidXRpb24gZG9lcyBub3QKKyAqIGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgdGhpcmQKKyAqIHBhcnR5IG9yIHRoYXQgdGhlIGxpY2Vuc2UgcHJvdmlkZXMgeW91IHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgcmlnaHRzCisgKiB0byBtYWtlIHVzZSBvZiB0aGUgQ29udHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQuIElOCisgKiBBRERJVElPTiBUTyBUSEUgRElTQ0xBSU1FUlMgSU5DTFVERUQgSU4gVEhFIExJQ0VOU0UsIE5PS0lBCisgKiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgRk9SIENMQUlNUyBCUk9VR0hUIEJZIFlPVSBPUiBBTlkKKyAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgorICogT1RIRVJXSVNFLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKworI2lmbmRlZiBPUEVOU1NMX05PX0ZQX0FQSQoraW50IFNTTF9TRVNTSU9OX3ByaW50X2ZwKEZJTEUgKmZwLCBjb25zdCBTU0xfU0VTU0lPTiAqeCkKKwl7CisJQklPICpiOworCWludCByZXQ7CisKKwlpZiAoKGI9QklPX25ldyhCSU9fc19maWxlX2ludGVybmFsKCkpKSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9TU0xfU0VTU0lPTl9QUklOVF9GUCxFUlJfUl9CVUZfTElCKTsKKwkJcmV0dXJuKDApOworCQl9CisJQklPX3NldF9mcChiLGZwLEJJT19OT0NMT1NFKTsKKwlyZXQ9U1NMX1NFU1NJT05fcHJpbnQoYix4KTsKKwlCSU9fZnJlZShiKTsKKwlyZXR1cm4ocmV0KTsKKwl9CisjZW5kaWYKKworaW50IFNTTF9TRVNTSU9OX3ByaW50KEJJTyAqYnAsIGNvbnN0IFNTTF9TRVNTSU9OICp4KQorCXsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpzOworCisJaWYgKHggPT0gTlVMTCkgZ290byBlcnI7CisJaWYgKEJJT19wdXRzKGJwLCJTU0wtU2Vzc2lvbjpcbiIpIDw9IDApIGdvdG8gZXJyOworCWlmICh4LT5zc2xfdmVyc2lvbiA9PSBTU0wyX1ZFUlNJT04pCisJCXM9IlNTTHYyIjsKKwllbHNlIGlmICh4LT5zc2xfdmVyc2lvbiA9PSBTU0wzX1ZFUlNJT04pCisJCXM9IlNTTHYzIjsKKwllbHNlIGlmICh4LT5zc2xfdmVyc2lvbiA9PSBUTFMxX1ZFUlNJT04pCisJCXM9IlRMU3YxIjsKKwllbHNlIGlmICh4LT5zc2xfdmVyc2lvbiA9PSBEVExTMV9WRVJTSU9OKQorCQlzPSJEVExTdjEiOworCWVsc2UgaWYgKHgtPnNzbF92ZXJzaW9uID09IERUTFMxX0JBRF9WRVIpCisJCXM9IkRUTFN2MS1iYWQiOworCWVsc2UKKwkJcz0idW5rbm93biI7CisJaWYgKEJJT19wcmludGYoYnAsIiAgICBQcm90b2NvbCAgOiAlc1xuIixzKSA8PSAwKSBnb3RvIGVycjsKKworCWlmICh4LT5jaXBoZXIgPT0gTlVMTCkKKwkJeworCQlpZiAoKCh4LT5jaXBoZXJfaWQpICYgMHhmZjAwMDAwMCkgPT0gMHgwMjAwMDAwMCkKKwkJCXsKKwkJCWlmIChCSU9fcHJpbnRmKGJwLCIgICAgQ2lwaGVyICAgIDogJTA2bFhcbiIseC0+Y2lwaGVyX2lkJjB4ZmZmZmZmKSA8PSAwKQorCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlCisJCQl7CisJCQlpZiAoQklPX3ByaW50ZihicCwiICAgIENpcGhlciAgICA6ICUwNGxYXG4iLHgtPmNpcGhlcl9pZCYweGZmZmYpIDw9IDApCisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEJJT19wcmludGYoYnAsIiAgICBDaXBoZXIgICAgOiAlc1xuIiwoKHgtPmNpcGhlciA9PSBOVUxMKT8idW5rbm93biI6eC0+Y2lwaGVyLT5uYW1lKSkgPD0gMCkKKwkJCWdvdG8gZXJyOworCQl9CisJaWYgKEJJT19wdXRzKGJwLCIgICAgU2Vzc2lvbi1JRDogIikgPD0gMCkgZ290byBlcnI7CisJZm9yIChpPTA7IGk8eC0+c2Vzc2lvbl9pZF9sZW5ndGg7IGkrKykKKwkJeworCQlpZiAoQklPX3ByaW50ZihicCwiJTAyWCIseC0+c2Vzc2lvbl9pZFtpXSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZiAoQklPX3B1dHMoYnAsIlxuICAgIFNlc3Npb24tSUQtY3R4OiAiKSA8PSAwKSBnb3RvIGVycjsKKwlmb3IgKGk9MDsgaTx4LT5zaWRfY3R4X2xlbmd0aDsgaSsrKQorCQl7CisJCWlmIChCSU9fcHJpbnRmKGJwLCIlMDJYIix4LT5zaWRfY3R4W2ldKSA8PSAwKQorCQkJZ290byBlcnI7CisJCX0KKwlpZiAoQklPX3B1dHMoYnAsIlxuICAgIE1hc3Rlci1LZXk6ICIpIDw9IDApIGdvdG8gZXJyOworCWZvciAoaT0wOyBpPCh1bnNpZ25lZCBpbnQpeC0+bWFzdGVyX2tleV9sZW5ndGg7IGkrKykKKwkJeworCQlpZiAoQklPX3ByaW50ZihicCwiJTAyWCIseC0+bWFzdGVyX2tleVtpXSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZiAoQklPX3B1dHMoYnAsIlxuICAgIEtleS1BcmcgICA6ICIpIDw9IDApIGdvdG8gZXJyOworCWlmICh4LT5rZXlfYXJnX2xlbmd0aCA9PSAwKQorCQl7CisJCWlmIChCSU9fcHV0cyhicCwiTm9uZSIpIDw9IDApIGdvdG8gZXJyOworCQl9CisJZWxzZQorCQlmb3IgKGk9MDsgaTx4LT5rZXlfYXJnX2xlbmd0aDsgaSsrKQorCQkJeworCQkJaWYgKEJJT19wcmludGYoYnAsIiUwMlgiLHgtPmtleV9hcmdbaV0pIDw9IDApIGdvdG8gZXJyOworCQkJfQorI2lmbmRlZiBPUEVOU1NMX05PX0tSQjUKKyAgICAgICBpZiAoQklPX3B1dHMoYnAsIlxuICAgIEtyYjUgUHJpbmNpcGFsOiAiKSA8PSAwKSBnb3RvIGVycjsKKyAgICAgICAgICAgIGlmICh4LT5rcmI1X2NsaWVudF9wcmluY19sZW4gPT0gMCkKKyAgICAgICAgICAgIHsKKwkJaWYgKEJJT19wdXRzKGJwLCJOb25lIikgPD0gMCkgZ290byBlcnI7CisJCX0KKwllbHNlCisJCWZvciAoaT0wOyBpPHgtPmtyYjVfY2xpZW50X3ByaW5jX2xlbjsgaSsrKQorCQkJeworCQkJaWYgKEJJT19wcmludGYoYnAsIiUwMlgiLHgtPmtyYjVfY2xpZW50X3ByaW5jW2ldKSA8PSAwKSBnb3RvIGVycjsKKwkJCX0KKyNlbmRpZiAvKiBPUEVOU1NMX05PX0tSQjUgKi8KKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwlpZiAoQklPX3B1dHMoYnAsIlxuICAgIFBTSyBpZGVudGl0eTogIikgPD0gMCkgZ290byBlcnI7CisJaWYgKEJJT19wcmludGYoYnAsICIlcyIsIHgtPnBza19pZGVudGl0eSA/IHgtPnBza19pZGVudGl0eSA6ICJOb25lIikgPD0gMCkgZ290byBlcnI7CisJaWYgKEJJT19wdXRzKGJwLCJcbiAgICBQU0sgaWRlbnRpdHkgaGludDogIikgPD0gMCkgZ290byBlcnI7CisJaWYgKEJJT19wcmludGYoYnAsICIlcyIsIHgtPnBza19pZGVudGl0eV9oaW50ID8geC0+cHNrX2lkZW50aXR5X2hpbnQgOiAiTm9uZSIpIDw9IDApIGdvdG8gZXJyOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKHgtPnRsc2V4dF90aWNrX2xpZmV0aW1lX2hpbnQpCisJCXsKKwkJaWYgKEJJT19wcmludGYoYnAsCisJCQkiXG4gICAgVExTIHNlc3Npb24gdGlja2V0IGxpZmV0aW1lIGhpbnQ6ICVsZCAoc2Vjb25kcykiLAorCQkJeC0+dGxzZXh0X3RpY2tfbGlmZXRpbWVfaGludCkgPD0wKQorCQkJZ290byBlcnI7CisJCX0KKwlpZiAoeC0+dGxzZXh0X3RpY2spCisJCXsKKwkJaWYgKEJJT19wdXRzKGJwLCAiXG4gICAgVExTIHNlc3Npb24gdGlja2V0OlxuIikgPD0gMCkgZ290byBlcnI7CisJCWlmIChCSU9fZHVtcF9pbmRlbnQoYnAsIChjaGFyICopeC0+dGxzZXh0X3RpY2ssIHgtPnRsc2V4dF90aWNrbGVuLCA0KSA8PSAwKQorCQkJZ290byBlcnI7CisJCX0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCWlmICh4LT5jb21wcmVzc19tZXRoICE9IDApCisJCXsKKwkJU1NMX0NPTVAgKmNvbXAgPSBOVUxMOworCisJCXNzbF9jaXBoZXJfZ2V0X2V2cCh4LE5VTEwsTlVMTCxOVUxMLE5VTEwsJmNvbXApOworCQlpZiAoY29tcCA9PSBOVUxMKQorCQkJeworCQkJaWYgKEJJT19wcmludGYoYnAsIlxuICAgIENvbXByZXNzaW9uOiAlZCIseC0+Y29tcHJlc3NfbWV0aCkgPD0gMCkgZ290byBlcnI7CisJCQl9CisJCWVsc2UKKwkJCXsKKwkJCWlmIChCSU9fcHJpbnRmKGJwLCJcbiAgICBDb21wcmVzc2lvbjogJWQgKCVzKSIsIGNvbXAtPmlkLGNvbXAtPm1ldGhvZC0+bmFtZSkgPD0gMCkgZ290byBlcnI7CisJCQl9CisJCX0JCisjZW5kaWYKKwlpZiAoeC0+dGltZSAhPSAwTCkKKwkJeworCQlpZiAoQklPX3ByaW50ZihicCwgIlxuICAgIFN0YXJ0IFRpbWU6ICVsZCIseC0+dGltZSkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZiAoeC0+dGltZW91dCAhPSAwTCkKKwkJeworCQlpZiAoQklPX3ByaW50ZihicCwgIlxuICAgIFRpbWVvdXQgICA6ICVsZCAoc2VjKSIseC0+dGltZW91dCkgPD0gMCkgZ290byBlcnI7CisJCX0KKwlpZiAoQklPX3B1dHMoYnAsIlxuIikgPD0gMCkgZ290byBlcnI7CisKKwlpZiAoQklPX3B1dHMoYnAsICIgICAgVmVyaWZ5IHJldHVybiBjb2RlOiAiKSA8PSAwKSBnb3RvIGVycjsKKwlpZiAoQklPX3ByaW50ZihicCwgIiVsZCAoJXMpXG4iLCB4LT52ZXJpZnlfcmVzdWx0LAorCQlYNTA5X3ZlcmlmeV9jZXJ0X2Vycm9yX3N0cmluZyh4LT52ZXJpZnlfcmVzdWx0KSkgPD0gMCkgZ290byBlcnI7CisJCQorCXJldHVybigxKTsKK2VycjoKKwlyZXR1cm4oMCk7CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvc3NsdGVzdC5jIGIvbGliL29wZW5zc2wvc3NsL3NzbHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFlYmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3NzbHRlc3QuYwpAQCAtMCwwICsxLDI1MDYgQEAKKy8qIHNzbC9zc2x0ZXN0LmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMCBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqIEVDQyBjaXBoZXIgc3VpdGUgc3VwcG9ydCBpbiBPcGVuU1NMIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGNvbnRyaWJ1dGVkIHRvIHRoZSBPcGVuU1NMIHByb2plY3QuCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgMjAwNSBOb2tpYS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgcG9ydGlvbnMgb2YgdGhlIGF0dGFjaGVkIHNvZnR3YXJlICgiQ29udHJpYnV0aW9uIikgaXMgZGV2ZWxvcGVkIGJ5CisgKiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQgaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UuCisgKgorICogVGhlIENvbnRyaWJ1dGlvbiwgb3JpZ2luYWxseSB3cml0dGVuIGJ5IE1pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mCisgKiBOb2tpYSBDb3Jwb3JhdGlvbiwgY29uc2lzdHMgb2YgdGhlICJQU0siIChQcmUtU2hhcmVkIEtleSkgY2lwaGVyc3VpdGVzCisgKiBzdXBwb3J0IChzZWUgUkZDIDQyNzkpIHRvIE9wZW5TU0wuCisgKgorICogTm8gcGF0ZW50IGxpY2Vuc2VzIG9yIG90aGVyIHJpZ2h0cyBleGNlcHQgdGhvc2UgZXhwcmVzc2x5IHN0YXRlZCBpbgorICogdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UgbGljZW5zZSBzaGFsbCBiZSBkZWVtZWQgZ3JhbnRlZCBvciByZWNlaXZlZAorICogZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwsIG9yIG90aGVyd2lzZS4KKyAqCisgKiBObyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBOb2tpYSB0aGF0IHRoZSBDb250cmlidXRpb24gZG9lcyBub3QKKyAqIGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgdGhpcmQKKyAqIHBhcnR5IG9yIHRoYXQgdGhlIGxpY2Vuc2UgcHJvdmlkZXMgeW91IHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgcmlnaHRzCisgKiB0byBtYWtlIHVzZSBvZiB0aGUgQ29udHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQuIElOCisgKiBBRERJVElPTiBUTyBUSEUgRElTQ0xBSU1FUlMgSU5DTFVERUQgSU4gVEhFIExJQ0VOU0UsIE5PS0lBCisgKiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBMSUFCSUxJVFkgRk9SIENMQUlNUyBCUk9VR0hUIEJZIFlPVSBPUiBBTlkKKyAqIE9USEVSIEVOVElUWSBCQVNFRCBPTiBJTkZSSU5HRU1FTlQgT0YgSU5URUxMRUNUVUFMIFBST1BFUlRZIFJJR0hUUyBPUgorICogT1RIRVJXSVNFLgorICovCisKKyNkZWZpbmUgX0JTRF9TT1VSQ0UgMQkJLyogT3IgZ2V0aG9zdG5hbWUgd29uJ3QgYmUgZGVjbGFyZWQgcHJvcGVybHkKKwkJCQkgICBvbiBMaW51eCBhbmQgR05VIHBsYXRmb3Jtcy4gKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNkZWZpbmUgVVNFX1NPQ0tFVFMKKyNpbmNsdWRlICJlX29zLmgiCisKKyNpZmRlZiBPUEVOU1NMX1NZU19WTVMKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA1MDAJLyogT3IgaXNhc2NpaSB3b24ndCBiZSBkZWNsYXJlZCBwcm9wZXJseSBvbgorCQkJCSAgIFZNUyAoYXQgbGVhc3Qgd2l0aCBERUNvbXBIUCBDKS4gICovCisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxvcGVuc3NsL2Jpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvY3J5cHRvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDkuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3g1MDl2My5oPgorI2luY2x1ZGUgPG9wZW5zc2wvc3NsLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fRU5HSU5FCisjaW5jbHVkZSA8b3BlbnNzbC9lbmdpbmUuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisjaW5jbHVkZSA8b3BlbnNzbC9yc2EuaD4KKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0RTQQorI2luY2x1ZGUgPG9wZW5zc2wvZHNhLmg+CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19ESAorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KKworI2RlZmluZSBfWE9QRU5fU09VUkNFX0VYVEVOREVECTEgLyogT3IgZ2V0aG9zdG5hbWUgd29uJ3QgYmUgZGVjbGFyZWQgcHJvcGVybHkKKwkJCQkgICAgIG9uIENvbXBhcSBwbGF0Zm9ybXMgKGF0IGxlYXN0IHdpdGggREVDIEMpLgorCQkJCSAgICAgRG8gbm90IHRyeSB0byBwdXQgaXQgZWFybGllciwgb3IgSVB2NiBpbmNsdWRlcworCQkJCSAgICAgZ2V0IHNjcmV3ZWQuLi4KKwkJCQkgICovCisKKyNpZmRlZiBPUEVOU1NMX1NZU19XSU5ET1dTCisjaW5jbHVkZSA8d2luc29jay5oPgorI2Vsc2UKKyNpbmNsdWRlIE9QRU5TU0xfVU5JU1RECisjZW5kaWYKKworI2lmZGVmIE9QRU5TU0xfU1lTX1ZNUworIyAgZGVmaW5lIFRFU1RfU0VSVkVSX0NFUlQgIlNZUyRESVNLOlstLkFQUFNdU0VSVkVSLlBFTSIKKyMgIGRlZmluZSBURVNUX0NMSUVOVF9DRVJUICJTWVMkRElTSzpbLS5BUFBTXUNMSUVOVC5QRU0iCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX1dJTkNFKQorIyAgZGVmaW5lIFRFU1RfU0VSVkVSX0NFUlQgIlxcT3BlblNTTFxcc2VydmVyLnBlbSIKKyMgIGRlZmluZSBURVNUX0NMSUVOVF9DRVJUICJcXE9wZW5TU0xcXGNsaWVudC5wZW0iCisjZWxpZiBkZWZpbmVkKE9QRU5TU0xfU1lTX05FVFdBUkUpCisjICBkZWZpbmUgVEVTVF9TRVJWRVJfQ0VSVCAiXFxvcGVuc3NsXFxhcHBzXFxzZXJ2ZXIucGVtIgorIyAgZGVmaW5lIFRFU1RfQ0xJRU5UX0NFUlQgIlxcb3BlbnNzbFxcYXBwc1xcY2xpZW50LnBlbSIKKyNlbHNlCisjICBkZWZpbmUgVEVTVF9TRVJWRVJfQ0VSVCAiLi4vYXBwcy9zZXJ2ZXIucGVtIgorIyAgZGVmaW5lIFRFU1RfQ0xJRU5UX0NFUlQgIi4uL2FwcHMvY2xpZW50LnBlbSIKKyNlbmRpZgorCisvKiBUaGVyZSBpcyByZWFsbHkgbm8gc3RhbmRhcmQgZm9yIHRoaXMsIHNvIGxldCdzIGFzc2lnbiBzb21lIHRlbnRhdGl2ZQorICAgbnVtYmVycy4gIEluIGFueSBjYXNlLCB0aGVzZSBudW1iZXJzIGFyZSBvbmx5IGZvciB0aGlzIHRlc3QgKi8KKyNkZWZpbmUgQ09NUF9STEUJMjU1CisjZGVmaW5lIENPTVBfWkxJQgkxCisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKmN0eCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCitzdGF0aWMgUlNBIE1TX0NBTExCQUNLICp0bXBfcnNhX2NiKFNTTCAqcywgaW50IGlzX2V4cG9ydCxpbnQga2V5bGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGZyZWVfdG1wX3JzYSh2b2lkKTsKKyNlbmRpZgorc3RhdGljIGludCBNU19DQUxMQkFDSyBhcHBfdmVyaWZ5X2NhbGxiYWNrKFg1MDlfU1RPUkVfQ1RYICpjdHgsIHZvaWQgKmFyZyk7CisjZGVmaW5lIEFQUF9DQUxMQkFDS19TVFJJTkcgIlRlc3QgQ2FsbGJhY2sgQXJndW1lbnQiCitzdHJ1Y3QgYXBwX3ZlcmlmeV9hcmcKKwl7CisJY2hhciAqc3RyaW5nOworCWludCBhcHBfdmVyaWZ5OworCWludCBhbGxvd19wcm94eV9jZXJ0czsKKwljaGFyICpwcm94eV9hdXRoOworCWNoYXIgKnByb3h5X2NvbmQ7CisJfTsKKworI2lmbmRlZiBPUEVOU1NMX05PX0RICitzdGF0aWMgREggKmdldF9kaDUxMih2b2lkKTsKK3N0YXRpYyBESCAqZ2V0X2RoMTAyNCh2b2lkKTsKK3N0YXRpYyBESCAqZ2V0X2RoMTAyNGRzYSh2b2lkKTsKKyNlbmRpZgorCisKK3N0YXRpYyBjaGFyICpwc2tfa2V5PU5VTEw7IC8qIGJ5IGRlZmF1bHQgUFNLIGlzIG5vdCB1c2VkICovCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCitzdGF0aWMgdW5zaWduZWQgaW50IHBza19jbGllbnRfY2FsbGJhY2soU1NMICpzc2wsIGNvbnN0IGNoYXIgKmhpbnQsIGNoYXIgKmlkZW50aXR5LAorCXVuc2lnbmVkIGludCBtYXhfaWRlbnRpdHlfbGVuLCB1bnNpZ25lZCBjaGFyICpwc2ssCisJdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHNrX3NlcnZlcl9jYWxsYmFjayhTU0wgKnNzbCwgY29uc3QgY2hhciAqaWRlbnRpdHksIHVuc2lnbmVkIGNoYXIgKnBzaywKKwl1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pOworI2VuZGlmCisKK3N0YXRpYyBCSU8gKmJpb19lcnI9TlVMTDsKK3N0YXRpYyBCSU8gKmJpb19zdGRvdXQ9TlVMTDsKKworc3RhdGljIGNoYXIgKmNpcGhlcj1OVUxMOworc3RhdGljIGludCB2ZXJib3NlPTA7CitzdGF0aWMgaW50IGRlYnVnPTA7CisjaWYgMAorLyogTm90IHVzZWQgeWV0LiAqLworI2lmZGVmIEZJT05CSU8KK3N0YXRpYyBpbnQgc19uYmlvPTA7CisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBybmRfc2VlZFtdID0gInN0cmluZyB0byBtYWtlIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB0aGluayBpdCBoYXMgZW50cm9weSI7CisKK2ludCBkb2l0X2Jpb3BhaXIoU1NMICpzX3NzbCxTU0wgKmNfc3NsLGxvbmcgYnl0ZXMsY2xvY2tfdCAqc190aW1lLGNsb2NrX3QgKmNfdGltZSk7CitpbnQgZG9pdChTU0wgKnNfc3NsLFNTTCAqY19zc2wsbG9uZyBieXRlcyk7CitzdGF0aWMgaW50IGRvX3Rlc3RfY2lwaGVybGlzdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHN2X3VzYWdlKHZvaWQpCisJeworCWZwcmludGYoc3RkZXJyLCJ1c2FnZTogc3NsdGVzdCBbYXJncyAuLi5dXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1zZXJ2ZXJfYXV0aCAgLSBjaGVjayBzZXJ2ZXIgY2VydGlmaWNhdGVcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLWNsaWVudF9hdXRoICAtIGRvIGNsaWVudCBhdXRoZW50aWNhdGlvblxuIik7CisJZnByaW50ZihzdGRlcnIsIiAtcHJveHkgICAgICAgIC0gYWxsb3cgcHJveHkgY2VydGlmaWNhdGVzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1wcm94eV9hdXRoIDx2YWw+IC0gc2V0IHByb3h5IHBvbGljeSByaWdodHNcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLXByb3h5X2NvbmQgPHZhbD4gLSBleHBlcnNzaW9uIHRvIHRlc3QgcHJveHkgcG9saWN5IHJpZ2h0c1xuIik7CisJZnByaW50ZihzdGRlcnIsIiAtdiAgICAgICAgICAgIC0gbW9yZSBvdXRwdXRcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLWQgICAgICAgICAgICAtIGRlYnVnIG91dHB1dFxuIik7CisJZnByaW50ZihzdGRlcnIsIiAtcmV1c2UgICAgICAgIC0gdXNlIHNlc3Npb24taWQgcmV1c2VcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLW51bSA8dmFsPiAgICAtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0byBwZXJmb3JtXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1ieXRlcyA8dmFsPiAgLSBudW1iZXIgb2YgYnl0ZXMgdG8gc3dhcCBiZXR3ZWVuIGNsaWVudC9zZXJ2ZXJcbiIpOworI2lmbmRlZiBPUEVOU1NMX05PX0RICisJZnByaW50ZihzdGRlcnIsIiAtZGhlMTAyNCAgICAgIC0gdXNlIDEwMjQgYml0IGtleSAoc2FmZSBwcmltZSkgZm9yIERIRVxuIik7CisJZnByaW50ZihzdGRlcnIsIiAtZGhlMTAyNGRzYSAgIC0gdXNlIDEwMjQgYml0IGtleSAod2l0aCAxNjAtYml0IHN1YnByaW1lKSBmb3IgREhFXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1ub19kaGUgICAgICAgLSBkaXNhYmxlIERIRVxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJZnByaW50ZihzdGRlcnIsIiAtbm9fZWNkaGUgICAgIC0gZGlzYWJsZSBFQ0RIRVxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwlmcHJpbnRmKHN0ZGVyciwiIC1wc2sgYXJnICAgICAgLSBQU0sgaW4gaGV4ICh3aXRob3V0IDB4KVxuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wyCisJZnByaW50ZihzdGRlcnIsIiAtc3NsMiAgICAgICAgIC0gdXNlIFNTTHYyXG4iKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX1NTTDMKKwlmcHJpbnRmKHN0ZGVyciwiIC1zc2wzICAgICAgICAgLSB1c2UgU1NMdjNcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTMQorCWZwcmludGYoc3RkZXJyLCIgLXRsczEgICAgICAgICAtIHVzZSBUTFN2MVxuIik7CisjZW5kaWYKKwlmcHJpbnRmKHN0ZGVyciwiIC1DQXBhdGggYXJnICAgLSBQRU0gZm9ybWF0IGRpcmVjdG9yeSBvZiBDQSdzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1DQWZpbGUgYXJnICAgLSBQRU0gZm9ybWF0IGZpbGUgb2YgQ0Enc1xuIik7CisJZnByaW50ZihzdGRlcnIsIiAtY2VydCBhcmcgICAgIC0gU2VydmVyIGNlcnRpZmljYXRlIGZpbGVcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLWtleSBhcmcgICAgICAtIFNlcnZlciBrZXkgZmlsZSAoZGVmYXVsdDogc2FtZSBhcyAtY2VydClcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLWNfY2VydCBhcmcgICAtIENsaWVudCBjZXJ0aWZpY2F0ZSBmaWxlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1jX2tleSBhcmcgICAgLSBDbGllbnQga2V5IGZpbGUgKGRlZmF1bHQ6IHNhbWUgYXMgLWNfY2VydClcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLWNpcGhlciBhcmcgICAtIFRoZSBjaXBoZXIgbGlzdFxuIik7CisJZnByaW50ZihzdGRlcnIsIiAtYmlvX3BhaXIgICAgIC0gVXNlIEJJTyBwYWlyc1xuIik7CisJZnByaW50ZihzdGRlcnIsIiAtZiAgICAgICAgICAgIC0gVGVzdCBldmVuIGNhc2VzIHRoYXQgY2FuJ3Qgd29ya1xuIik7CisJZnByaW50ZihzdGRlcnIsIiAtdGltZSAgICAgICAgIC0gbWVhc3VyZSBwcm9jZXNzb3IgdGltZSB1c2VkIGJ5IGNsaWVudCBhbmQgc2VydmVyXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC16bGliICAgICAgICAgLSB1c2UgemxpYiBjb21wcmVzc2lvblxuIik7CisJZnByaW50ZihzdGRlcnIsIiAtcmxlICAgICAgICAgIC0gdXNlIHJsZSBjb21wcmVzc2lvblxuIik7CisjaWZuZGVmIE9QRU5TU0xfTk9fRUNESAorCWZwcmludGYoc3RkZXJyLCIgLW5hbWVkX2N1cnZlIGFyZyAgLSBFbGxpcHRpYyBjdXJ2ZSBuYW1lIHRvIHVzZSBmb3IgZXBoZW1lcmFsIEVDREgga2V5cy5cbiIgXAorCSAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIFVzZSBcIm9wZW5zc2wgZWNwYXJhbSAtbGlzdF9jdXJ2ZXNcIiBmb3IgYWxsIG5hbWVzXG4iICBcCisJICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgKGRlZmF1bHQgaXMgc2VjdDE2M3IyKS5cbiIpOworI2VuZGlmCisJZnByaW50ZihzdGRlcnIsIiAtdGVzdF9jaXBoZXJsaXN0IC0gdmVyaWZpZXMgdGhlIG9yZGVyIG9mIHRoZSBzc2wgY2lwaGVyIGxpc3RzXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwiIC1jX3NtYWxsX3JlY29yZHMgLSBlbmFibGUgY2xpZW50IHNpZGUgdXNlIG9mIHNtYWxsIFNTTCByZWNvcmQgYnVmZmVyc1xuIik7CisJZnByaW50ZihzdGRlcnIsIiAtc19zbWFsbF9yZWNvcmRzIC0gZW5hYmxlIHNlcnZlciBzaWRlIHVzZSBvZiBzbWFsbCBTU0wgcmVjb3JkIGJ1ZmZlcnNcbiIpOworCWZwcmludGYoc3RkZXJyLCIgLWN1dHRocm91Z2ggICAgICAtIGVuYWJsZSAxLVJUVCBmdWxsLWhhbmRzaGFrZSBmb3Igc3Ryb25nIGNpcGhlcnNcbiIpOworCX0KKworc3RhdGljIHZvaWQgcHJpbnRfZGV0YWlscyhTU0wgKmNfc3NsLCBjb25zdCBjaGFyICpwcmVmaXgpCisJeworCWNvbnN0IFNTTF9DSVBIRVIgKmNpcGg7CisJWDUwOSAqY2VydDsKKwkJCisJY2lwaD1TU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKGNfc3NsKTsKKwlCSU9fcHJpbnRmKGJpb19zdGRvdXQsIiVzJXMsIGNpcGhlciAlcyAlcyIsCisJCXByZWZpeCwKKwkJU1NMX2dldF92ZXJzaW9uKGNfc3NsKSwKKwkJU1NMX0NJUEhFUl9nZXRfdmVyc2lvbihjaXBoKSwKKwkJU1NMX0NJUEhFUl9nZXRfbmFtZShjaXBoKSk7CisJY2VydD1TU0xfZ2V0X3BlZXJfY2VydGlmaWNhdGUoY19zc2wpOworCWlmIChjZXJ0ICE9IE5VTEwpCisJCXsKKwkJRVZQX1BLRVkgKnBrZXkgPSBYNTA5X2dldF9wdWJrZXkoY2VydCk7CisJCWlmIChwa2V5ICE9IE5VTEwpCisJCQl7CisJCQlpZiAoMCkgCisJCQkJOworI2lmbmRlZiBPUEVOU1NMX05PX1JTQQorCQkJZWxzZSBpZiAocGtleS0+dHlwZSA9PSBFVlBfUEtFWV9SU0EgJiYgcGtleS0+cGtleS5yc2EgIT0gTlVMTAorCQkJCSYmIHBrZXktPnBrZXkucnNhLT5uICE9IE5VTEwpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX3N0ZG91dCwgIiwgJWQgYml0IFJTQSIsCisJCQkJCUJOX251bV9iaXRzKHBrZXktPnBrZXkucnNhLT5uKSk7CisJCQkJfQorI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fRFNBCisJCQllbHNlIGlmIChwa2V5LT50eXBlID09IEVWUF9QS0VZX0RTQSAmJiBwa2V5LT5wa2V5LmRzYSAhPSBOVUxMCisJCQkJJiYgcGtleS0+cGtleS5kc2EtPnAgIT0gTlVMTCkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fc3Rkb3V0LCAiLCAlZCBiaXQgRFNBIiwKKwkJCQkJQk5fbnVtX2JpdHMocGtleS0+cGtleS5kc2EtPnApKTsKKwkJCQl9CisjZW5kaWYKKwkJCUVWUF9QS0VZX2ZyZWUocGtleSk7CisJCQl9CisJCVg1MDlfZnJlZShjZXJ0KTsKKwkJfQorCS8qIFRoZSBTU0wgQVBJIGRvZXMgbm90IGFsbG93IHVzIHRvIGxvb2sgYXQgdGVtcG9yYXJ5IFJTQS9ESCBrZXlzLAorCSAqIG90aGVyd2lzZSB3ZSBzaG91bGQgcHJpbnQgdGhlaXIgbGVuZ3RocyB0b28gKi8KKwlCSU9fcHJpbnRmKGJpb19zdGRvdXQsIlxuIik7CisJfQorCitzdGF0aWMgdm9pZCBsb2NrX2RiZ19jYihpbnQgbW9kZSwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQorCXsKKwlzdGF0aWMgaW50IG1vZGVzW0NSWVBUT19OVU1fTE9DS1NdOyAvKiA9IHswLCAwLCAuLi4gfSAqLworCWNvbnN0IGNoYXIgKmVycnN0ciA9IE5VTEw7CisJaW50IHJ3OworCQorCXJ3ID0gbW9kZSAmIChDUllQVE9fUkVBRHxDUllQVE9fV1JJVEUpOworCWlmICghKChydyA9PSBDUllQVE9fUkVBRCkgfHwgKHJ3ID09IENSWVBUT19XUklURSkpKQorCQl7CisJCWVycnN0ciA9ICJpbnZhbGlkIG1vZGUiOworCQlnb3RvIGVycjsKKwkJfQorCisJaWYgKHR5cGUgPCAwIHx8IHR5cGUgPj0gQ1JZUFRPX05VTV9MT0NLUykKKwkJeworCQllcnJzdHIgPSAidHlwZSBvdXQgb2YgYm91bmRzIjsKKwkJZ290byBlcnI7CisJCX0KKworCWlmIChtb2RlICYgQ1JZUFRPX0xPQ0spCisJCXsKKwkJaWYgKG1vZGVzW3R5cGVdKQorCQkJeworCQkJZXJyc3RyID0gImFscmVhZHkgbG9ja2VkIjsKKwkJCS8qIG11c3Qgbm90IGhhcHBlbiBpbiBhIHNpbmdsZS10aHJlYWRlZCBwcm9ncmFtCisJCQkgKiAod291bGQgZGVhZGxvY2spICovCisJCQlnb3RvIGVycjsKKwkJCX0KKworCQltb2Rlc1t0eXBlXSA9IHJ3OworCQl9CisJZWxzZSBpZiAobW9kZSAmIENSWVBUT19VTkxPQ0spCisJCXsKKwkJaWYgKCFtb2Rlc1t0eXBlXSkKKwkJCXsKKwkJCWVycnN0ciA9ICJub3QgbG9ja2VkIjsKKwkJCWdvdG8gZXJyOworCQkJfQorCQkKKwkJaWYgKG1vZGVzW3R5cGVdICE9IHJ3KQorCQkJeworCQkJZXJyc3RyID0gKHJ3ID09IENSWVBUT19SRUFEKSA/CisJCQkJIkNSWVBUT19yX3VubG9jayBvbiB3cml0ZSBsb2NrIiA6CisJCQkJIkNSWVBUT193X3VubG9jayBvbiByZWFkIGxvY2siOworCQkJfQorCisJCW1vZGVzW3R5cGVdID0gMDsKKwkJfQorCWVsc2UKKwkJeworCQllcnJzdHIgPSAiaW52YWxpZCBtb2RlIjsKKwkJZ290byBlcnI7CisJCX0KKworIGVycjoKKwlpZiAoZXJyc3RyKQorCQl7CisJCS8qIHdlIGNhbm5vdCB1c2UgYmlvX2VyciBoZXJlICovCisJCWZwcmludGYoc3RkZXJyLCAib3BlbnNzbCAobG9ja19kYmdfY2IpOiAlcyAobW9kZT0lZCwgdHlwZT0lZCkgYXQgJXM6JWRcbiIsCisJCQllcnJzdHIsIG1vZGUsIHR5cGUsIGZpbGUsIGxpbmUpOworCQl9CisJfQorCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorc3RydWN0IGNiX2luZm9fc3QgeyB2b2lkICppbnB1dDsgc2l6ZV90IGxlbjsgaW50IHJldDsgfTsKK3N0cnVjdCBjYl9pbmZvX3N0IGNvMSA9IHsgIkMiLCAxLCAxIH07IC8qIHRyeSB0byBuZWdvdGlhdGUgb3FhcXVlIFBSRiBpbnB1dCAqLworc3RydWN0IGNiX2luZm9fc3QgY28yID0geyAiQyIsIDEsIDIgfTsgLyogaW5zaXN0IG9uIG9xYXF1ZSBQUkYgaW5wdXQgKi8KK3N0cnVjdCBjYl9pbmZvX3N0IHNvMSA9IHsgIlMiLCAxLCAxIH07IC8qIHRyeSB0byBuZWdvdGlhdGUgb3FhcXVlIFBSRiBpbnB1dCAqLworc3RydWN0IGNiX2luZm9fc3Qgc28yID0geyAiUyIsIDEsIDIgfTsgLyogaW5zaXN0IG9uIG9xYXF1ZSBQUkYgaW5wdXQgKi8KKworaW50IG9wYXF1ZV9wcmZfaW5wdXRfY2IoU1NMICpzc2wsIHZvaWQgKnBlZXJpbnB1dCwgc2l6ZV90IGxlbiwgdm9pZCAqYXJnXykKKwl7CisJc3RydWN0IGNiX2luZm9fc3QgKmFyZyA9IGFyZ187CisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiAxOworCQorCWlmICghU1NMX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dChzc2wsIGFyZy0+aW5wdXQsIGFyZy0+bGVuKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGFyZy0+cmV0OworCX0KKyNlbmRpZgorCWludCBzc2xfbW9kZSA9IDA7CisJaW50IGNfc21hbGxfcmVjb3Jkcz0wOworCWludCBzX3NtYWxsX3JlY29yZHM9MDsKKwlpbnQgY3V0dGhyb3VnaCA9IDA7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCisJeworCWNoYXIgKkNBcGF0aD1OVUxMLCpDQWZpbGU9TlVMTDsKKwlpbnQgYmFkb3A9MDsKKwlpbnQgYmlvX3BhaXI9MDsKKwlpbnQgZm9yY2U9MDsKKwlpbnQgdGxzMT0wLHNzbDI9MCxzc2wzPTAscmV0PTE7CisJaW50IGNsaWVudF9hdXRoPTA7CisJaW50IHNlcnZlcl9hdXRoPTAsaTsKKwlzdHJ1Y3QgYXBwX3ZlcmlmeV9hcmcgYXBwX3ZlcmlmeV9hcmcgPQorCQl7IEFQUF9DQUxMQkFDS19TVFJJTkcsIDAsIDAsIE5VTEwsIE5VTEwgfTsKKwljaGFyICpzZXJ2ZXJfY2VydD1URVNUX1NFUlZFUl9DRVJUOworCWNoYXIgKnNlcnZlcl9rZXk9TlVMTDsKKwljaGFyICpjbGllbnRfY2VydD1URVNUX0NMSUVOVF9DRVJUOworCWNoYXIgKmNsaWVudF9rZXk9TlVMTDsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJY2hhciAqbmFtZWRfY3VydmUgPSBOVUxMOworI2VuZGlmCisJU1NMX0NUWCAqc19jdHg9TlVMTDsKKwlTU0xfQ1RYICpjX2N0eD1OVUxMOworCWNvbnN0IFNTTF9NRVRIT0QgKm1ldGg9TlVMTDsKKwlTU0wgKmNfc3NsLCpzX3NzbDsKKwlpbnQgbnVtYmVyPTEscmV1c2U9MDsKKwlsb25nIGJ5dGVzPTI1Nkw7CisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwlESCAqZGg7CisJaW50IGRoZTEwMjQgPSAwLCBkaGUxMDI0ZHNhID0gMDsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VDREgKKwlFQ19LRVkgKmVjZGggPSBOVUxMOworI2VuZGlmCisJaW50IG5vX2RoZSA9IDA7CisJaW50IG5vX2VjZGhlID0gMDsKKwlpbnQgbm9fcHNrID0gMDsKKwlpbnQgcHJpbnRfdGltZSA9IDA7CisJY2xvY2tfdCBzX3RpbWUgPSAwLCBjX3RpbWUgPSAwOworCWludCBjb21wID0gMDsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJQ09NUF9NRVRIT0QgKmNtID0gTlVMTDsKKyNlbmRpZgorCVNUQUNLX09GKFNTTF9DT01QKSAqc3NsX2NvbXBfbWV0aG9kcyA9IE5VTEw7CisJaW50IHRlc3RfY2lwaGVybGlzdCA9IDA7CisKKwl2ZXJib3NlID0gMDsKKwlkZWJ1ZyA9IDA7CisJY2lwaGVyID0gMDsKKworCWJpb19lcnI9QklPX25ld19mcChzdGRlcnIsQklPX05PQ0xPU0V8QklPX0ZQX1RFWFQpOwkKKworCUNSWVBUT19zZXRfbG9ja2luZ19jYWxsYmFjayhsb2NrX2RiZ19jYik7CisKKwkvKiBlbmFibGUgbWVtb3J5IGxlYWsgY2hlY2tpbmcgdW5sZXNzIGV4cGxpY2l0bHkgZGlzYWJsZWQgKi8KKwlpZiAoISgoZ2V0ZW52KCJPUEVOU1NMX0RFQlVHX01FTU9SWSIpICE9IE5VTEwpICYmICgwID09IHN0cmNtcChnZXRlbnYoIk9QRU5TU0xfREVCVUdfTUVNT1JZIiksICJvZmYiKSkpKQorCQl7CisJCUNSWVBUT19tYWxsb2NfZGVidWdfaW5pdCgpOworCQlDUllQVE9fc2V0X21lbV9kZWJ1Z19vcHRpb25zKFZfQ1JZUFRPX01ERUJVR19BTEwpOworCQl9CisJZWxzZQorCQl7CisJCS8qIE9QRU5TU0xfREVCVUdfTUVNT1JZPW9mZiAqLworCQlDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoMCwgMCwgMCwgMCwgMCk7CisJCX0KKwlDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PTik7CisKKwlSQU5EX3NlZWQocm5kX3NlZWQsIHNpemVvZiBybmRfc2VlZCk7CisKKwliaW9fc3Rkb3V0PUJJT19uZXdfZnAoc3Rkb3V0LEJJT19OT0NMT1NFfEJJT19GUF9URVhUKTsKKworCWFyZ2MtLTsKKwlhcmd2Kys7CisKKwl3aGlsZSAoYXJnYyA+PSAxKQorCQl7CisJCWlmCShzdHJjbXAoKmFyZ3YsIi1zZXJ2ZXJfYXV0aCIpID09IDApCisJCQlzZXJ2ZXJfYXV0aD0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jbGllbnRfYXV0aCIpID09IDApCisJCQljbGllbnRfYXV0aD0xOworCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi1wcm94eV9hdXRoIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCWFwcF92ZXJpZnlfYXJnLnByb3h5X2F1dGg9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCItcHJveHlfY29uZCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlhcHBfdmVyaWZ5X2FyZy5wcm94eV9jb25kPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXYiKSA9PSAwKQorCQkJdmVyYm9zZT0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1kIikgPT0gMCkKKwkJCWRlYnVnPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXJldXNlIikgPT0gMCkKKwkJCXJldXNlPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWRoZTEwMjQiKSA9PSAwKQorCQkJeworI2lmbmRlZiBPUEVOU1NMX05PX0RICisJCQlkaGUxMDI0PTE7CisjZWxzZQorCQkJZnByaW50ZihzdGRlcnIsImlnbm9yaW5nIC1kaGUxMDI0LCBzaW5jZSBJJ20gY29tcGlsZWQgd2l0aG91dCBESFxuIik7CisjZW5kaWYKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItZGhlMTAyNGRzYSIpID09IDApCisJCQl7CisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKwkJCWRoZTEwMjRkc2E9MTsKKyNlbHNlCisJCQlmcHJpbnRmKHN0ZGVyciwiaWdub3JpbmcgLWRoZTEwMjQsIHNpbmNlIEknbSBjb21waWxlZCB3aXRob3V0IERIXG4iKTsKKyNlbmRpZgorCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1ub19kaGUiKSA9PSAwKQorCQkJbm9fZGhlPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLW5vX2VjZGhlIikgPT0gMCkKKwkJCW5vX2VjZGhlPTE7CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwiLXBzayIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlwc2tfa2V5PSooKythcmd2KTsKKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwkJCWlmIChzdHJzcG4ocHNrX2tleSwgImFiY2RlZkFCQ0RFRjEyMzQ1Njc4OTAiKSAhPSBzdHJsZW4ocHNrX2tleSkpCisJCQkJeworCQkJCUJJT19wcmludGYoYmlvX2VyciwiTm90IGEgaGV4IG51bWJlciAnJXMnXG4iLCphcmd2KTsKKwkJCQlnb3RvIGJhZDsKKwkJCQl9CisjZWxzZQorCQkJbm9fcHNrPTE7CisjZW5kaWYKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItc3NsMiIpID09IDApCisJCQlzc2wyPTE7CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXRsczEiKSA9PSAwKQorCQkJdGxzMT0xOworCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zc2wzIikgPT0gMCkKKwkJCXNzbDM9MTsKKwkJZWxzZSBpZgkoc3RybmNtcCgqYXJndiwiLW51bSIsNCkgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCW51bWJlcj0gYXRvaSgqKCsrYXJndikpOworCQkJaWYgKG51bWJlciA9PSAwKSBudW1iZXI9MTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItYnl0ZXMiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJYnl0ZXM9IGF0b2woKigrK2FyZ3YpKTsKKwkJCWlmIChieXRlcyA9PSAwTCkgYnl0ZXM9MUw7CisJCQlpPXN0cmxlbihhcmd2WzBdKTsKKwkJCWlmIChhcmd2WzBdW2ktMV0gPT0gJ2snKSBieXRlcyo9MTAyNEw7CisJCQlpZiAoYXJndlswXVtpLTFdID09ICdtJykgYnl0ZXMqPTEwMjRMKjEwMjRMOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jZXJ0IikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCXNlcnZlcl9jZXJ0PSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXNfY2VydCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzZXJ2ZXJfY2VydD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1rZXkiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJc2VydmVyX2tleT0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1zX2tleSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQlzZXJ2ZXJfa2V5PSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWNfY2VydCIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQljbGllbnRfY2VydD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1jX2tleSIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQljbGllbnRfa2V5PSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWNpcGhlciIpID09IDApCisJCQl7CisJCQlpZiAoLS1hcmdjIDwgMSkgZ290byBiYWQ7CisJCQljaXBoZXI9ICooKythcmd2KTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItQ0FwYXRoIikgPT0gMCkKKwkJCXsKKwkJCWlmICgtLWFyZ2MgPCAxKSBnb3RvIGJhZDsKKwkJCUNBcGF0aD0gKigrK2FyZ3YpOworCQkJfQorCQllbHNlIGlmCShzdHJjbXAoKmFyZ3YsIi1DQWZpbGUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworCQkJQ0FmaWxlPSAqKCsrYXJndik7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLWJpb19wYWlyIikgPT0gMCkKKwkJCXsKKwkJCWJpb19wYWlyID0gMTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItZiIpID09IDApCisJCQl7CisJCQlmb3JjZSA9IDE7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXRpbWUiKSA9PSAwKQorCQkJeworCQkJcHJpbnRfdGltZSA9IDE7CisJCQl9CisJCWVsc2UgaWYJKHN0cmNtcCgqYXJndiwiLXpsaWIiKSA9PSAwKQorCQkJeworCQkJY29tcCA9IENPTVBfWkxJQjsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcmxlIikgPT0gMCkKKwkJCXsKKwkJCWNvbXAgPSBDT01QX1JMRTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItbmFtZWRfY3VydmUiKSA9PSAwKQorCQkJeworCQkJaWYgKC0tYXJnYyA8IDEpIGdvdG8gYmFkOworI2lmbmRlZiBPUEVOU1NMX05PX0VDREgJCQorCQkJbmFtZWRfY3VydmUgPSAqKCsrYXJndik7CisjZWxzZQorCQkJZnByaW50ZihzdGRlcnIsImlnbm9yaW5nIC1uYW1lZF9jdXJ2ZSwgc2luY2UgSSdtIGNvbXBpbGVkIHdpdGhvdXQgRUNESFxuIik7CisJCQkrK2FyZ3Y7CisjZW5kaWYKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItYXBwX3ZlcmlmeSIpID09IDApCisJCQl7CisJCQlhcHBfdmVyaWZ5X2FyZy5hcHBfdmVyaWZ5ID0gMTsKKwkJCX0KKwkJZWxzZSBpZgkoc3RyY21wKCphcmd2LCItcHJveHkiKSA9PSAwKQorCQkJeworCQkJYXBwX3ZlcmlmeV9hcmcuYWxsb3dfcHJveHlfY2VydHMgPSAxOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsIi10ZXN0X2NpcGhlcmxpc3QiKSA9PSAwKQorCQkJeworCQkJdGVzdF9jaXBoZXJsaXN0ID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiLWNfc21hbGxfcmVjb3JkcyIpID09IDApCisJCQl7CisJCQljX3NtYWxsX3JlY29yZHMgPSAxOworCQkJfQorCQllbHNlIGlmIChzdHJjbXAoKmFyZ3YsICItc19zbWFsbF9yZWNvcmRzIikgPT0gMCkKKwkJCXsKKwkJCXNfc21hbGxfcmVjb3JkcyA9IDE7CisJCQl9CisJCWVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIi1jdXR0aHJvdWdoIikgPT0gMCkKKwkJCXsKKwkJCWN1dHRocm91Z2ggPSAxOworCQkJfQorCQllbHNlCisJCQl7CisJCQlmcHJpbnRmKHN0ZGVyciwidW5rbm93biBvcHRpb24gJXNcbiIsKmFyZ3YpOworCQkJYmFkb3A9MTsKKwkJCWJyZWFrOworCQkJfQorCQlhcmdjLS07CisJCWFyZ3YrKzsKKwkJfQorCWlmIChiYWRvcCkKKwkJeworYmFkOgorCQlzdl91c2FnZSgpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKHRlc3RfY2lwaGVybGlzdCA9PSAxKQorCQl7CisJCS8qIGVuc3VyZSB0aGF0IHRoZSBjaXBoZXIgbGlzdCBhcmUgY29ycmVjdGx5IHNvcnRlZCBhbmQgZXhpdCAqLworCQlpZiAoZG9fdGVzdF9jaXBoZXJsaXN0KCkgPT0gMCkKKwkJCUVYSVQoMSk7CisJCXJldCA9IDA7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoIXNzbDIgJiYgIXNzbDMgJiYgIXRsczEgJiYgbnVtYmVyID4gMSAmJiAhcmV1c2UgJiYgIWZvcmNlKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCAiVGhpcyBjYXNlIGNhbm5vdCB3b3JrLiAgVXNlIC1mIHRvIHBlcmZvcm0gIgorCQkJInRoZSB0ZXN0IGFueXdheSAoYW5kXG4tZCB0byBzZWUgd2hhdCBoYXBwZW5zKSwgIgorCQkJIm9yIGFkZCBvbmUgb2YgLXNzbDIsIC1zc2wzLCAtdGxzMSwgLXJldXNlXG4iCisJCQkidG8gYXZvaWQgcHJvdG9jb2wgbWlzbWF0Y2guXG4iKTsKKwkJRVhJVCgxKTsKKwkJfQorCisJaWYgKHByaW50X3RpbWUpCisJCXsKKwkJaWYgKCFiaW9fcGFpcikKKwkJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiVXNpbmcgQklPIHBhaXIgKC1iaW9fcGFpcilcbiIpOworCQkJYmlvX3BhaXIgPSAxOworCQkJfQorCQlpZiAobnVtYmVyIDwgNTAgJiYgIWZvcmNlKQorCQkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBGb3IgYWNjdXJhdGUgdGltaW5ncywgdXNlIG1vcmUgY29ubmVjdGlvbnMgKGUuZy4gLW51bSAxMDAwKVxuIik7CisJCX0KKworLyoJaWYgKGNpcGhlciA9PSBOVUxMKSBjaXBoZXI9Z2V0ZW52KCJTU0xfQ0lQSEVSIik7ICovCisKKwlTU0xfbGlicmFyeV9pbml0KCk7CisJU1NMX2xvYWRfZXJyb3Jfc3RyaW5ncygpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCWlmIChjb21wID09IENPTVBfWkxJQikgY20gPSBDT01QX3psaWIoKTsKKwlpZiAoY29tcCA9PSBDT01QX1JMRSkgY20gPSBDT01QX3JsZSgpOworCWlmIChjbSAhPSBOVUxMKQorCQl7CisJCWlmIChjbS0+dHlwZSAhPSBOSURfdW5kZWYpCisJCQl7CisJCQlpZiAoU1NMX0NPTVBfYWRkX2NvbXByZXNzaW9uX21ldGhvZChjb21wLCBjbSkgIT0gMCkKKwkJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJGYWlsZWQgdG8gYWRkIGNvbXByZXNzaW9uIG1ldGhvZFxuIik7CisJCQkJRVJSX3ByaW50X2Vycm9yc19mcChzdGRlcnIpOworCQkJCX0KKwkJCX0KKwkJZWxzZQorCQkJeworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIldhcm5pbmc6ICVzIGNvbXByZXNzaW9uIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJKGNvbXAgPT0gQ09NUF9STEUgPyAicmxlIiA6CisJCQkJCShjb21wID09IENPTVBfWkxJQiA/ICJ6bGliIiA6CisJCQkJCQkidW5rbm93biIpKSk7CisJCQlFUlJfcHJpbnRfZXJyb3JzX2ZwKHN0ZGVycik7CisJCQl9CisJCX0KKwlzc2xfY29tcF9tZXRob2RzID0gU1NMX0NPTVBfZ2V0X2NvbXByZXNzaW9uX21ldGhvZHMoKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkF2YWlsYWJsZSBjb21wcmVzc2lvbiBtZXRob2RzOlxuIik7CisJeworCWludCBqLCBuID0gc2tfU1NMX0NPTVBfbnVtKHNzbF9jb21wX21ldGhvZHMpOworCWlmIChuID09IDApCisJCWZwcmludGYoc3RkZXJyLCAiICBOT05FXG4iKTsKKwllbHNlCisJCWZvciAoaiA9IDA7IGogPCBuOyBqKyspCisJCQl7CisJCQlTU0xfQ09NUCAqYyA9IHNrX1NTTF9DT01QX3ZhbHVlKHNzbF9jb21wX21ldGhvZHMsIGopOworCQkJZnByaW50ZihzdGRlcnIsICIgICVkOiAlc1xuIiwgYy0+aWQsIGMtPm5hbWUpOworCQkJfQorCX0KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoT1BFTlNTTF9OT19TU0wyKSAmJiAhZGVmaW5lZChPUEVOU1NMX05PX1NTTDMpCisJaWYgKHNzbDIpCisJCW1ldGg9U1NMdjJfbWV0aG9kKCk7CisJZWxzZSAKKwlpZiAodGxzMSkKKwkJbWV0aD1UTFN2MV9tZXRob2QoKTsKKwllbHNlCisJaWYgKHNzbDMpCisJCW1ldGg9U1NMdjNfbWV0aG9kKCk7CisJZWxzZQorCQltZXRoPVNTTHYyM19tZXRob2QoKTsKKyNlbHNlCisjaWZkZWYgT1BFTlNTTF9OT19TU0wyCisJbWV0aD1TU0x2M19tZXRob2QoKTsKKyNlbHNlCisJbWV0aD1TU0x2Ml9tZXRob2QoKTsKKyNlbmRpZgorI2VuZGlmCisKKwljX2N0eD1TU0xfQ1RYX25ldyhtZXRoKTsKKwlzX2N0eD1TU0xfQ1RYX25ldyhtZXRoKTsKKwlpZiAoKGNfY3R4ID09IE5VTEwpIHx8IChzX2N0eCA9PSBOVUxMKSkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVuZDsKKwkJfQorCisJaWYgKGNpcGhlciAhPSBOVUxMKQorCQl7CisJCVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGNfY3R4LGNpcGhlcik7CisJCVNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KHNfY3R4LGNpcGhlcik7CisJCX0KKworCXNzbF9tb2RlID0gMDsKKwlpZiAoY19zbWFsbF9yZWNvcmRzKQorCQl7CisJCXNzbF9tb2RlID0gU1NMX0NUWF9nZXRfbW9kZShjX2N0eCk7CisJCXNzbF9tb2RlIHw9IFNTTF9NT0RFX1NNQUxMX0JVRkZFUlM7CisJCVNTTF9DVFhfc2V0X21vZGUoY19jdHgsIHNzbF9tb2RlKTsKKwkJfQorCXNzbF9tb2RlID0gMDsKKwlpZiAoc19zbWFsbF9yZWNvcmRzKQorCQl7CisJCXNzbF9tb2RlID0gU1NMX0NUWF9nZXRfbW9kZShzX2N0eCk7CisJCXNzbF9tb2RlIHw9IFNTTF9NT0RFX1NNQUxMX0JVRkZFUlM7CisJCVNTTF9DVFhfc2V0X21vZGUoc19jdHgsIHNzbF9tb2RlKTsKKwkJfQorCXNzbF9tb2RlID0gMDsKKwlpZiAoY3V0dGhyb3VnaCkKKwkJeworCQlzc2xfbW9kZSA9IFNTTF9DVFhfZ2V0X21vZGUoY19jdHgpOworCQlzc2xfbW9kZSA9IFNTTF9NT0RFX0hBTkRTSEFLRV9DVVRUSFJPVUdIOworCQlTU0xfQ1RYX3NldF9tb2RlKGNfY3R4LCBzc2xfbW9kZSk7CisJCX0KKworI2lmbmRlZiBPUEVOU1NMX05PX0RICisJaWYgKCFub19kaGUpCisJCXsKKwkJaWYgKGRoZTEwMjRkc2EpCisJCQl7CisJCQkvKiB1c2UgU1NMX09QX1NJTkdMRV9ESF9VU0UgdG8gYXZvaWQgc21hbGwgc3ViZ3JvdXAgYXR0YWNrcyAqLworCQkJU1NMX0NUWF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOworCQkJZGg9Z2V0X2RoMTAyNGRzYSgpOworCQkJfQorCQllbHNlIGlmIChkaGUxMDI0KQorCQkJZGg9Z2V0X2RoMTAyNCgpOworCQllbHNlCisJCQlkaD1nZXRfZGg1MTIoKTsKKwkJU1NMX0NUWF9zZXRfdG1wX2RoKHNfY3R4LGRoKTsKKwkJREhfZnJlZShkaCk7CisJCX0KKyNlbHNlCisJKHZvaWQpbm9fZGhlOworI2VuZGlmCisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQ0RICisJaWYgKCFub19lY2RoZSkKKwkJeworCQlpbnQgbmlkOworCisJCWlmIChuYW1lZF9jdXJ2ZSAhPSBOVUxMKQorCQkJeworCQkJbmlkID0gT0JKX3NuMm5pZChuYW1lZF9jdXJ2ZSk7CisJCQlpZiAobmlkID09IDApCisJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCAidW5rbm93biBjdXJ2ZSBuYW1lICglcylcbiIsIG5hbWVkX2N1cnZlKTsKKwkJCQlnb3RvIGVuZDsKKwkJCQl9CisJCQl9CisJCWVsc2UKKwkJCW5pZCA9IE5JRF9zZWN0MTYzcjI7CisKKwkJZWNkaCA9IEVDX0tFWV9uZXdfYnlfY3VydmVfbmFtZShuaWQpOworCQlpZiAoZWNkaCA9PSBOVUxMKQorCQkJeworCQkJQklPX3ByaW50ZihiaW9fZXJyLCAidW5hYmxlIHRvIGNyZWF0ZSBjdXJ2ZVxuIik7CisJCQlnb3RvIGVuZDsKKwkJCX0KKworCQlTU0xfQ1RYX3NldF90bXBfZWNkaChzX2N0eCwgZWNkaCk7CisJCVNTTF9DVFhfc2V0X29wdGlvbnMoc19jdHgsIFNTTF9PUF9TSU5HTEVfRUNESF9VU0UpOworCQlFQ19LRVlfZnJlZShlY2RoKTsKKwkJfQorI2Vsc2UKKwkodm9pZClub19lY2RoZTsKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUlNBCisJU1NMX0NUWF9zZXRfdG1wX3JzYV9jYWxsYmFjayhzX2N0eCx0bXBfcnNhX2NiKTsKKyNlbmRpZgorCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorCVNTTF9DVFhfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrKGNfY3R4LCBvcGFxdWVfcHJmX2lucHV0X2NiKTsKKwlTU0xfQ1RYX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFjayhzX2N0eCwgb3BhcXVlX3ByZl9pbnB1dF9jYik7CisJU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnKGNfY3R4LCAmY28xKTsgLyogb3IgJmNvMiBvciBOVUxMICovCisJU1NMX0NUWF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnKHNfY3R4LCAmc28xKTsgLyogb3IgJnNvMiBvciBOVUxMICovCisjZW5kaWYKKworCWlmICghU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShzX2N0eCxzZXJ2ZXJfY2VydCxTU0xfRklMRVRZUEVfUEVNKSkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQl9CisJZWxzZSBpZiAoIVNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZShzX2N0eCwKKwkJKHNlcnZlcl9rZXk/c2VydmVyX2tleTpzZXJ2ZXJfY2VydCksIFNTTF9GSUxFVFlQRV9QRU0pKQorCQl7CisJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCWdvdG8gZW5kOworCQl9CisKKwlpZiAoY2xpZW50X2F1dGgpCisJCXsKKwkJU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZShjX2N0eCxjbGllbnRfY2VydCwKKwkJCVNTTF9GSUxFVFlQRV9QRU0pOworCQlTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoY19jdHgsCisJCQkoY2xpZW50X2tleT9jbGllbnRfa2V5OmNsaWVudF9jZXJ0KSwKKwkJCVNTTF9GSUxFVFlQRV9QRU0pOworCQl9CisKKwlpZiAoCSghU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc19jdHgsQ0FmaWxlLENBcGF0aCkpIHx8CisJCSghU1NMX0NUWF9zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoc19jdHgpKSB8fAorCQkoIVNTTF9DVFhfbG9hZF92ZXJpZnlfbG9jYXRpb25zKGNfY3R4LENBZmlsZSxDQXBhdGgpKSB8fAorCQkoIVNTTF9DVFhfc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKGNfY3R4KSkpCisJCXsKKwkJLyogZnByaW50ZihzdGRlcnIsIlNTTF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnNcbiIpOyAqLworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkvKiBnb3RvIGVuZDsgKi8KKwkJfQorCisJaWYgKGNsaWVudF9hdXRoKQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiY2xpZW50IGF1dGhlbnRpY2F0aW9uXG4iKTsKKwkJU1NMX0NUWF9zZXRfdmVyaWZ5KHNfY3R4LAorCQkJU1NMX1ZFUklGWV9QRUVSfFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQsCisJCQl2ZXJpZnlfY2FsbGJhY2spOworCQlTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjayhzX2N0eCwgYXBwX3ZlcmlmeV9jYWxsYmFjaywgJmFwcF92ZXJpZnlfYXJnKTsKKwkJfQorCWlmIChzZXJ2ZXJfYXV0aCkKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsInNlcnZlciBhdXRoZW50aWNhdGlvblxuIik7CisJCVNTTF9DVFhfc2V0X3ZlcmlmeShjX2N0eCxTU0xfVkVSSUZZX1BFRVIsCisJCQl2ZXJpZnlfY2FsbGJhY2spOworCQlTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjayhjX2N0eCwgYXBwX3ZlcmlmeV9jYWxsYmFjaywgJmFwcF92ZXJpZnlfYXJnKTsKKwkJfQorCQorCXsKKwkJaW50IHNlc3Npb25faWRfY29udGV4dCA9IDA7CisJCVNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dChzX2N0eCwgKHZvaWQgKikmc2Vzc2lvbl9pZF9jb250ZXh0LCBzaXplb2Ygc2Vzc2lvbl9pZF9jb250ZXh0KTsKKwl9CisKKwkvKiBVc2UgUFNLIG9ubHkgaWYgUFNLIGtleSBpcyBnaXZlbiAqLworCWlmIChwc2tfa2V5ICE9IE5VTEwpCisJCXsKKwkJLyogbm9fcHNrIGlzIHVzZWQgdG8gYXZvaWQgcHV0dGluZyBwc2sgY29tbWFuZCB0byBvcGVuc3NsIHRvb2wgKi8KKwkJaWYgKG5vX3BzaykKKwkJCXsKKwkJCS8qIGlmIFBTSyBpcyBub3QgY29tcGlsZWQgaW4gYW5kIHBzayBrZXkgaXMKKwkJCSAqIGdpdmVuLCBkbyBub3RoaW5nIGFuZCBleGl0IHN1Y2Nlc3NmdWxseSAqLworCQkJcmV0PTA7CisJCQlnb3RvIGVuZDsKKwkJCX0KKyNpZm5kZWYgT1BFTlNTTF9OT19QU0sKKwkJU1NMX0NUWF9zZXRfcHNrX2NsaWVudF9jYWxsYmFjayhjX2N0eCwgcHNrX2NsaWVudF9jYWxsYmFjayk7CisJCVNTTF9DVFhfc2V0X3Bza19zZXJ2ZXJfY2FsbGJhY2soc19jdHgsIHBza19zZXJ2ZXJfY2FsbGJhY2spOworCQlpZiAoZGVidWcpCisJCQlCSU9fcHJpbnRmKGJpb19lcnIsInNldHRpbmcgUFNLIGlkZW50aXR5IGhpbnQgdG8gc19jdHhcbiIpOworCQlpZiAoIVNTTF9DVFhfdXNlX3Bza19pZGVudGl0eV9oaW50KHNfY3R4LCAiY3R4IHNlcnZlciBpZGVudGl0eV9oaW50IikpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsImVycm9yIHNldHRpbmcgUFNLIGlkZW50aXR5IGhpbnQgdG8gc19jdHhcbiIpOworCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCWdvdG8gZW5kOworCQkJfQorI2VuZGlmCisJCX0KKworCWNfc3NsPVNTTF9uZXcoY19jdHgpOworCXNfc3NsPVNTTF9uZXcoc19jdHgpOworCisjaWZuZGVmIE9QRU5TU0xfTk9fS1JCNQorCWlmIChjX3NzbCAgJiYgIGNfc3NsLT5rc3NsX2N0eCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhcglsb2NhbGhvc3RbTUFYSE9TVE5BTUVMRU4rMl07CisKKwkJaWYgKGdldGhvc3RuYW1lKGxvY2FsaG9zdCwgc2l6ZW9mIGxvY2FsaG9zdC0xKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgeworCQkJbG9jYWxob3N0W3NpemVvZiBsb2NhbGhvc3QtMV09J1wwJzsKKwkJCWlmKHN0cmxlbihsb2NhbGhvc3QpID09IHNpemVvZiBsb2NhbGhvc3QtMSkKKwkJCQl7CisJCQkJQklPX3ByaW50ZihiaW9fZXJyLCJsb2NhbGhvc3QgbmFtZSB0b28gbG9uZ1xuIik7CisJCQkJZ290byBlbmQ7CisJCQkJfQorCQkJa3NzbF9jdHhfc2V0c3RyaW5nKGNfc3NsLT5rc3NsX2N0eCwgS1NTTF9TRVJWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsaG9zdCk7CisJCQl9CisJCX0KKyNlbmRpZiAgICAvKiBPUEVOU1NMX05PX0tSQjUgICovCisKKwlmb3IgKGk9MDsgaTxudW1iZXI7IGkrKykKKwkJeworCQlpZiAoIXJldXNlKSBTU0xfc2V0X3Nlc3Npb24oY19zc2wsTlVMTCk7CisJCWlmIChiaW9fcGFpcikKKwkJCXJldD1kb2l0X2Jpb3BhaXIoc19zc2wsY19zc2wsYnl0ZXMsJnNfdGltZSwmY190aW1lKTsKKwkJZWxzZQorCQkJcmV0PWRvaXQoc19zc2wsY19zc2wsYnl0ZXMpOworCQl9CisKKwlpZiAoIXZlcmJvc2UpCisJCXsKKwkJcHJpbnRfZGV0YWlscyhjX3NzbCwgIiIpOworCQl9CisJaWYgKChudW1iZXIgPiAxKSB8fCAoYnl0ZXMgPiAxTCkpCisJCUJJT19wcmludGYoYmlvX3N0ZG91dCwgIiVkIGhhbmRzaGFrZXMgb2YgJWxkIGJ5dGVzIGRvbmVcbiIsbnVtYmVyLGJ5dGVzKTsKKwlpZiAocHJpbnRfdGltZSkKKwkJeworI2lmZGVmIENMT0NLU19QRVJfU0VDCisJCS8qICJUbyBkZXRlcm1pbmUgdGhlIHRpbWUgaW4gc2Vjb25kcywgdGhlIHZhbHVlIHJldHVybmVkCisJCSAqIGJ5IHRoZSBjbG9jayBmdW5jdGlvbiBzaG91bGQgYmUgZGl2aWRlZCBieSB0aGUgdmFsdWUKKwkJICogb2YgdGhlIG1hY3JvIENMT0NLU19QRVJfU0VDLiIKKwkJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBJU08vSUVDIDk4OTkgKi8KKwkJQklPX3ByaW50ZihiaW9fc3Rkb3V0LCAiQXBwcm94aW1hdGUgdG90YWwgc2VydmVyIHRpbWU6ICU2LjJmIHNcbiIKKwkJCSJBcHByb3hpbWF0ZSB0b3RhbCBjbGllbnQgdGltZTogJTYuMmYgc1xuIiwKKwkJCShkb3VibGUpc190aW1lL0NMT0NLU19QRVJfU0VDLAorCQkJKGRvdWJsZSljX3RpbWUvQ0xPQ0tTX1BFUl9TRUMpOworI2Vsc2UKKwkJLyogImBDTE9DS1NfUEVSX1NFQycgdW5kZWNsYXJlZCAoZmlyc3QgdXNlIHRoaXMgZnVuY3Rpb24pIgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBjYyBvbiBOZVhUc3RlcC9PcGVuU3RlcCAqLworCQlCSU9fcHJpbnRmKGJpb19zdGRvdXQsCisJCQkiQXBwcm94aW1hdGUgdG90YWwgc2VydmVyIHRpbWU6ICU2LjJmIHVuaXRzXG4iCisJCQkiQXBwcm94aW1hdGUgdG90YWwgY2xpZW50IHRpbWU6ICU2LjJmIHVuaXRzXG4iLAorCQkJKGRvdWJsZSlzX3RpbWUsCisJCQkoZG91YmxlKWNfdGltZSk7CisjZW5kaWYKKwkJfQorCisJU1NMX2ZyZWUoc19zc2wpOworCVNTTF9mcmVlKGNfc3NsKTsKKworZW5kOgorCWlmIChzX2N0eCAhPSBOVUxMKSBTU0xfQ1RYX2ZyZWUoc19jdHgpOworCWlmIChjX2N0eCAhPSBOVUxMKSBTU0xfQ1RYX2ZyZWUoY19jdHgpOworCisJaWYgKGJpb19zdGRvdXQgIT0gTlVMTCkgQklPX2ZyZWUoYmlvX3N0ZG91dCk7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKKwlmcmVlX3RtcF9yc2EoKTsKKyNlbmRpZgorI2lmbmRlZiBPUEVOU1NMX05PX0VOR0lORQorCUVOR0lORV9jbGVhbnVwKCk7CisjZW5kaWYKKwlDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpOworCUVSUl9mcmVlX3N0cmluZ3MoKTsKKwlFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShOVUxMKTsKKwlFVlBfY2xlYW51cCgpOworCUNSWVBUT19tZW1fbGVha3MoYmlvX2Vycik7CisJaWYgKGJpb19lcnIgIT0gTlVMTCkgQklPX2ZyZWUoYmlvX2Vycik7CisJRVhJVChyZXQpOworCXJldHVybiByZXQ7CisJfQorCitpbnQgZG9pdF9iaW9wYWlyKFNTTCAqc19zc2wsIFNTTCAqY19zc2wsIGxvbmcgY291bnQsCisJY2xvY2tfdCAqc190aW1lLCBjbG9ja190ICpjX3RpbWUpCisJeworCWxvbmcgY3dfbnVtID0gY291bnQsIGNyX251bSA9IGNvdW50LCBzd19udW0gPSBjb3VudCwgc3JfbnVtID0gY291bnQ7CisJQklPICpzX3NzbF9iaW8gPSBOVUxMLCAqY19zc2xfYmlvID0gTlVMTDsKKwlCSU8gKnNlcnZlciA9IE5VTEwsICpzZXJ2ZXJfaW8gPSBOVUxMLCAqY2xpZW50ID0gTlVMTCwgKmNsaWVudF9pbyA9IE5VTEw7CisJaW50IHJldCA9IDE7CisJCisJc2l6ZV90IGJ1ZnNpeiA9IDI1NjsgLyogc21hbGwgYnVmZmVyIGZvciB0ZXN0aW5nICovCisKKwlpZiAoIUJJT19uZXdfYmlvX3BhaXIoJnNlcnZlciwgYnVmc2l6LCAmc2VydmVyX2lvLCBidWZzaXopKQorCQlnb3RvIGVycjsKKwlpZiAoIUJJT19uZXdfYmlvX3BhaXIoJmNsaWVudCwgYnVmc2l6LCAmY2xpZW50X2lvLCBidWZzaXopKQorCQlnb3RvIGVycjsKKwkKKwlzX3NzbF9iaW8gPSBCSU9fbmV3KEJJT19mX3NzbCgpKTsKKwlpZiAoIXNfc3NsX2JpbykKKwkJZ290byBlcnI7CisKKwljX3NzbF9iaW8gPSBCSU9fbmV3KEJJT19mX3NzbCgpKTsKKwlpZiAoIWNfc3NsX2JpbykKKwkJZ290byBlcnI7CisKKwlTU0xfc2V0X2Nvbm5lY3Rfc3RhdGUoY19zc2wpOworCVNTTF9zZXRfYmlvKGNfc3NsLCBjbGllbnQsIGNsaWVudCk7CisJKHZvaWQpQklPX3NldF9zc2woY19zc2xfYmlvLCBjX3NzbCwgQklPX05PQ0xPU0UpOworCisJU1NMX3NldF9hY2NlcHRfc3RhdGUoc19zc2wpOworCVNTTF9zZXRfYmlvKHNfc3NsLCBzZXJ2ZXIsIHNlcnZlcik7CisJKHZvaWQpQklPX3NldF9zc2woc19zc2xfYmlvLCBzX3NzbCwgQklPX05PQ0xPU0UpOworCisJZG8KKwkJeworCQkvKiBjX3NzbF9iaW86ICAgICAgICAgIFNTTCBmaWx0ZXIgQklPCisJCSAqCisJCSAqIGNsaWVudDogICAgICAgICAgICAgcHNldWRvLUkvTyBmb3IgU1NMIGxpYnJhcnkKKwkJICoKKwkJICogY2xpZW50X2lvOiAgICAgICAgICBjbGllbnQncyBTU0wgY29tbXVuaWNhdGlvbjsgdXN1YWxseSB0byBiZQorCQkgKiAgICAgICAgICAgICAgICAgICAgIHJlbGF5ZWQgb3ZlciBzb21lIEkvTyBmYWNpbGl0eSwgYnV0IGluIHRoaXMKKwkJICogICAgICAgICAgICAgICAgICAgICB0ZXN0IHByb2dyYW0sIHdlJ3JlIHRoZSBzZXJ2ZXIsIHRvbzoKKwkJICoKKwkJICogc2VydmVyX2lvOiAgICAgICAgICBzZXJ2ZXIncyBTU0wgY29tbXVuaWNhdGlvbgorCQkgKgorCQkgKiBzZXJ2ZXI6ICAgICAgICAgICAgIHBzZXVkby1JL08gZm9yIFNTTCBsaWJyYXJ5CisJCSAqCisJCSAqIHNfc3NsX2JpbzogICAgICAgICAgU1NMIGZpbHRlciBCSU8KKwkJICoKKwkJICogVGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBlYWNoIGVtcGxveSBhICJCSU8gcGFpciI6CisJCSAqIGNsaWVudCArIGNsaWVudF9pbywgc2VydmVyICsgc2VydmVyX2lvLgorCQkgKiBCSU8gcGFpcnMgYXJlIHN5bW1ldHJpYy4gIEEgQklPIHBhaXIgYmVoYXZlcyBzaW1pbGFyCisJCSAqIHRvIGEgbm9uLWJsb2NraW5nIHNvY2tldHBhaXIgKGJ1dCBib3RoIGVuZHBvaW50cyBtdXN0CisJCSAqIGJlIGhhbmRsZWQgYnkgdGhlIHNhbWUgdGhyZWFkKS4KKwkJICogW0hlcmUgd2UgY291bGQgY29ubmVjdCBjbGllbnQgYW5kIHNlcnZlciB0byB0aGUgZW5kcworCQkgKiBvZiBhIHNpbmdsZSBCSU8gcGFpciwgYnV0IHRoZW4gdGhpcyBjb2RlIHdvdWxkIGJlIGxlc3MKKwkJICogc3VpdGFibGUgYXMgYW4gZXhhbXBsZSBmb3IgQklPIHBhaXJzIGluIGdlbmVyYWwuXQorCQkgKgorCQkgKiBVc2VmdWwgZnVuY3Rpb25zIGZvciBxdWVyeWluZyB0aGUgc3RhdGUgb2YgQklPIHBhaXIgZW5kcG9pbnRzOgorCQkgKgorCQkgKiBCSU9fY3RybF9wZW5kaW5nKGJpbykgICAgICAgICAgICAgIG51bWJlciBvZiBieXRlcyB3ZSBjYW4gcmVhZCBub3cKKwkJICogQklPX2N0cmxfZ2V0X3JlYWRfcmVxdWVzdChiaW8pICAgICBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGZ1bGZpbAorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgc2lkZSdzIHJlYWQgYXR0ZW1wdAorCQkgKiBCSU9fY3RybF9nZXRfd3JpdGVfZ3VhcmFudGVlKGJpbykgICBudW1iZXIgb2YgYnl0ZXMgd2UgY2FuIHdyaXRlIG5vdworCQkgKgorCQkgKiAuLi5fcmVhZF9yZXF1ZXN0IGlzIG5ldmVyIG1vcmUgdGhhbiAuLi5fd3JpdGVfZ3VhcmFudGVlOworCQkgKiBpdCBkZXBlbmRzIG9uIHRoZSBhcHBsaWNhdGlvbiB3aGljaCBvbmUgeW91IHNob3VsZCB1c2UuCisJCSAqLworCisJCS8qIFdlIGhhdmUgbm9uLWJsb2NraW5nIGJlaGF2aW91ciB0aHJvdWdob3V0IHRoaXMgdGVzdCBwcm9ncmFtLCBidXQKKwkJICogY2FuIGJlIHN1cmUgdGhhdCB0aGVyZSBpcyAqc29tZSogcHJvZ3Jlc3MgaW4gZWFjaCBpdGVyYXRpb247IHNvCisJCSAqIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgLi4uX1NIT1VMRF9SRUFEIG9yIC4uLl9TSE9VTERfV1JJVEUKKwkJICogLS0gd2UganVzdCB0cnkgZXZlcnl0aGluZyBpbiBlYWNoIGl0ZXJhdGlvbgorCQkgKi8KKworCQkJeworCQkJLyogQ0xJRU5UICovCisJCQorCQkJTVNfU1RBVElDIGNoYXIgY2J1ZlsxMDI0KjhdOworCQkJaW50IGksIHI7CisJCQljbG9ja190IGNfY2xvY2sgPSBjbG9jaygpOworCisJCQltZW1zZXQoY2J1ZiwgMCwgc2l6ZW9mKGNidWYpKTsKKworCQkJaWYgKGRlYnVnKQorCQkJCWlmIChTU0xfaW5faW5pdChjX3NzbCkpCisJCQkJCXByaW50ZigiY2xpZW50IHdhaXRpbmcgaW4gU1NMX2Nvbm5lY3QgLSAlc1xuIiwKKwkJCQkJCVNTTF9zdGF0ZV9zdHJpbmdfbG9uZyhjX3NzbCkpOworCisJCQlpZiAoY3dfbnVtID4gMCkKKwkJCQl7CisJCQkJLyogV3JpdGUgdG8gc2VydmVyLiAqLworCQkJCQorCQkJCWlmIChjd19udW0gPiAobG9uZylzaXplb2YgY2J1ZikKKwkJCQkJaSA9IHNpemVvZiBjYnVmOworCQkJCWVsc2UKKwkJCQkJaSA9IChpbnQpY3dfbnVtOworCQkJCXIgPSBCSU9fd3JpdGUoY19zc2xfYmlvLCBjYnVmLCBpKTsKKwkJCQlpZiAociA8IDApCisJCQkJCXsKKwkJCQkJaWYgKCFCSU9fc2hvdWxkX3JldHJ5KGNfc3NsX2JpbykpCisJCQkJCQl7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwiRVJST1IgaW4gQ0xJRU5UXG4iKTsKKwkJCQkJCWdvdG8gZXJyOworCQkJCQkJfQorCQkJCQkvKiBCSU9fc2hvdWxkX3JldHJ5KC4uLikgY2FuIGp1c3QgYmUgaWdub3JlZCBoZXJlLgorCQkJCQkgKiBUaGUgbGlicmFyeSBleHBlY3RzIHVzIHRvIGNhbGwgQklPX3dyaXRlIHdpdGgKKwkJCQkJICogdGhlIHNhbWUgYXJndW1lbnRzIGFnYWluLCBhbmQgdGhhdCdzIHdoYXQgd2Ugd2lsbAorCQkJCQkgKiBkbyBpbiB0aGUgbmV4dCBpdGVyYXRpb24uICovCisJCQkJCX0KKwkJCQllbHNlIGlmIChyID09IDApCisJCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsIlNTTCBDTElFTlQgU1RBUlRVUCBGQUlMRURcbiIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoZGVidWcpCisJCQkJCQlwcmludGYoImNsaWVudCB3cm90ZSAlZFxuIiwgcik7CisJCQkJCWN3X251bSAtPSByOwkJCQkKKwkJCQkJfQorCQkJCX0KKworCQkJaWYgKGNyX251bSA+IDApCisJCQkJeworCQkJCS8qIFJlYWQgZnJvbSBzZXJ2ZXIuICovCisKKwkJCQlyID0gQklPX3JlYWQoY19zc2xfYmlvLCBjYnVmLCBzaXplb2YoY2J1ZikpOworCQkJCWlmIChyIDwgMCkKKwkJCQkJeworCQkJCQlpZiAoIUJJT19zaG91bGRfcmV0cnkoY19zc2xfYmlvKSkKKwkJCQkJCXsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCJFUlJPUiBpbiBDTElFTlRcbiIpOworCQkJCQkJZ290byBlcnI7CisJCQkJCQl9CisJCQkJCS8qIEFnYWluLCAiQklPX3Nob3VsZF9yZXRyeSIgY2FuIGJlIGlnbm9yZWQuICovCisJCQkJCX0KKwkJCQllbHNlIGlmIChyID09IDApCisJCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsIlNTTCBDTElFTlQgU1RBUlRVUCBGQUlMRURcbiIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoZGVidWcpCisJCQkJCQlwcmludGYoImNsaWVudCByZWFkICVkXG4iLCByKTsKKwkJCQkJY3JfbnVtIC09IHI7CisJCQkJCX0KKwkJCQl9CisKKwkJCS8qIGNfdGltZSBhbmQgc190aW1lIGluY3JlbWVudHMgd2lsbCB0eXBpY2FsbHkgYmUgdmVyeSBzbWFsbAorCQkJICogKGRlcGVuZGluZyBvbiBtYWNoaW5lIHNwZWVkIGFuZCBjbG9jayB0aWNrIGludGVydmFscyksCisJCQkgKiBidXQgc2FtcGxpbmcgb3ZlciBhIGxhcmdlIG51bWJlciBvZiBjb25uZWN0aW9ucyBzaG91bGQKKwkJCSAqIHJlc3VsdCBpbiBmYWlybHkgYWNjdXJhdGUgZmlndXJlcy4gIFdlIGNhbm5vdCBndWFyYW50ZWUKKwkJCSAqIGEgbG90LCBob3dldmVyIC0tIGlmIGVhY2ggY29ubmVjdGlvbiBsYXN0cyBmb3IgZXhhY3RseQorCQkJICogb25lIGNsb2NrIHRpY2ssIGl0IHdpbGwgYmUgY291bnRlZCBvbmx5IGZvciB0aGUgY2xpZW50CisJCQkgKiBvciBvbmx5IGZvciB0aGUgc2VydmVyIG9yIGV2ZW4gbm90IGF0IGFsbC4KKwkJCSAqLworCQkJKmNfdGltZSArPSAoY2xvY2soKSAtIGNfY2xvY2spOworCQkJfQorCisJCQl7CisJCQkvKiBTRVJWRVIgKi8KKwkJCisJCQlNU19TVEFUSUMgY2hhciBzYnVmWzEwMjQqOF07CisJCQlpbnQgaSwgcjsKKwkJCWNsb2NrX3Qgc19jbG9jayA9IGNsb2NrKCk7CisKKwkJCW1lbXNldChzYnVmLCAwLCBzaXplb2Yoc2J1ZikpOworCisJCQlpZiAoZGVidWcpCisJCQkJaWYgKFNTTF9pbl9pbml0KHNfc3NsKSkKKwkJCQkJcHJpbnRmKCJzZXJ2ZXIgd2FpdGluZyBpbiBTU0xfYWNjZXB0IC0gJXNcbiIsCisJCQkJCQlTU0xfc3RhdGVfc3RyaW5nX2xvbmcoc19zc2wpKTsKKworCQkJaWYgKHN3X251bSA+IDApCisJCQkJeworCQkJCS8qIFdyaXRlIHRvIGNsaWVudC4gKi8KKwkJCQkKKwkJCQlpZiAoc3dfbnVtID4gKGxvbmcpc2l6ZW9mIHNidWYpCisJCQkJCWkgPSBzaXplb2Ygc2J1ZjsKKwkJCQllbHNlCisJCQkJCWkgPSAoaW50KXN3X251bTsKKwkJCQlyID0gQklPX3dyaXRlKHNfc3NsX2Jpbywgc2J1ZiwgaSk7CisJCQkJaWYgKHIgPCAwKQorCQkJCQl7CisJCQkJCWlmICghQklPX3Nob3VsZF9yZXRyeShzX3NzbF9iaW8pKQorCQkJCQkJeworCQkJCQkJZnByaW50ZihzdGRlcnIsIkVSUk9SIGluIFNFUlZFUlxuIik7CisJCQkJCQlnb3RvIGVycjsKKwkJCQkJCX0KKwkJCQkJLyogSWdub3JlICJCSU9fc2hvdWxkX3JldHJ5Ii4gKi8KKwkJCQkJfQorCQkJCWVsc2UgaWYgKHIgPT0gMCkKKwkJCQkJeworCQkJCQlmcHJpbnRmKHN0ZGVyciwiU1NMIFNFUlZFUiBTVEFSVFVQIEZBSUxFRFxuIik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmIChkZWJ1ZykKKwkJCQkJCXByaW50Zigic2VydmVyIHdyb3RlICVkXG4iLCByKTsKKwkJCQkJc3dfbnVtIC09IHI7CQkJCQorCQkJCQl9CisJCQkJfQorCisJCQlpZiAoc3JfbnVtID4gMCkKKwkJCQl7CisJCQkJLyogUmVhZCBmcm9tIGNsaWVudC4gKi8KKworCQkJCXIgPSBCSU9fcmVhZChzX3NzbF9iaW8sIHNidWYsIHNpemVvZihzYnVmKSk7CisJCQkJaWYgKHIgPCAwKQorCQkJCQl7CisJCQkJCWlmICghQklPX3Nob3VsZF9yZXRyeShzX3NzbF9iaW8pKQorCQkJCQkJeworCQkJCQkJZnByaW50ZihzdGRlcnIsIkVSUk9SIGluIFNFUlZFUlxuIik7CisJCQkJCQlnb3RvIGVycjsKKwkJCQkJCX0KKwkJCQkJLyogYmxhaCwgYmxhaCAqLworCQkJCQl9CisJCQkJZWxzZSBpZiAociA9PSAwKQorCQkJCQl7CisJCQkJCWZwcmludGYoc3RkZXJyLCJTU0wgU0VSVkVSIFNUQVJUVVAgRkFJTEVEXG4iKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKGRlYnVnKQorCQkJCQkJcHJpbnRmKCJzZXJ2ZXIgcmVhZCAlZFxuIiwgcik7CisJCQkJCXNyX251bSAtPSByOworCQkJCQl9CisJCQkJfQorCisJCQkqc190aW1lICs9IChjbG9jaygpIC0gc19jbG9jayk7CisJCQl9CisJCQkKKwkJCXsKKwkJCS8qICJJL08iIEJFVFdFRU4gQ0xJRU5UIEFORCBTRVJWRVIuICovCisKKwkJCXNpemVfdCByMSwgcjI7CisJCQlCSU8gKmlvMSA9IHNlcnZlcl9pbywgKmlvMiA9IGNsaWVudF9pbzsKKwkJCS8qIHdlIHVzZSB0aGUgbm9uLWNvcHlpbmcgaW50ZXJmYWNlIGZvciBpbzEKKwkJCSAqIGFuZCB0aGUgc3RhbmRhcmQgQklPX3dyaXRlL0JJT19yZWFkIGludGVyZmFjZSBmb3IgaW8yCisJCQkgKi8KKwkJCQorCQkJc3RhdGljIGludCBwcmV2X3Byb2dyZXNzID0gMTsKKwkJCWludCBwcm9ncmVzcyA9IDA7CisJCQkKKwkJCS8qIGlvMSB0byBpbzIgKi8KKwkJCWRvCisJCQkJeworCQkJCXNpemVfdCBudW07CisJCQkJaW50IHI7CisKKwkJCQlyMSA9IEJJT19jdHJsX3BlbmRpbmcoaW8xKTsKKwkJCQlyMiA9IEJJT19jdHJsX2dldF93cml0ZV9ndWFyYW50ZWUoaW8yKTsKKworCQkJCW51bSA9IHIxOworCQkJCWlmIChyMiA8IG51bSkKKwkJCQkJbnVtID0gcjI7CisJCQkJaWYgKG51bSkKKwkJCQkJeworCQkJCQljaGFyICpkYXRhcHRyOworCisJCQkJCWlmIChJTlRfTUFYIDwgbnVtKSAvKiB5ZWFoLCByaWdodCAqLworCQkJCQkJbnVtID0gSU5UX01BWDsKKwkJCQkJCisJCQkJCXIgPSBCSU9fbnJlYWQoaW8xLCAmZGF0YXB0ciwgKGludCludW0pOworCQkJCQlhc3NlcnQociA+IDApOworCQkJCQlhc3NlcnQociA8PSAoaW50KW51bSk7CisJCQkJCS8qIHBvc3NpYmx5IHIgPCBudW0gKG5vbi1jb250aWd1b3VzIGRhdGEpICovCisJCQkJCW51bSA9IHI7CisJCQkJCXIgPSBCSU9fd3JpdGUoaW8yLCBkYXRhcHRyLCAoaW50KW51bSk7CisJCQkJCWlmIChyICE9IChpbnQpbnVtKSAvKiBjYW4ndCBoYXBwZW4gKi8KKwkJCQkJCXsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEJJT193cml0ZSBjb3VsZCBub3Qgd3JpdGUgIgorCQkJCQkJCSJCSU9fY3RybF9nZXRfd3JpdGVfZ3VhcmFudGVlKCkgYnl0ZXMiKTsKKwkJCQkJCWdvdG8gZXJyOworCQkJCQkJfQorCQkJCQlwcm9ncmVzcyA9IDE7CisKKwkJCQkJaWYgKGRlYnVnKQorCQkJCQkJcHJpbnRmKChpbzEgPT0gY2xpZW50X2lvKSA/CisJCQkJCQkJIkMtPlMgcmVsYXlpbmc6ICVkIGJ5dGVzXG4iIDoKKwkJCQkJCQkiUy0+QyByZWxheWluZzogJWQgYnl0ZXNcbiIsCisJCQkJCQkJKGludCludW0pOworCQkJCQl9CisJCQkJfQorCQkJd2hpbGUgKHIxICYmIHIyKTsKKworCQkJLyogaW8yIHRvIGlvMSAqLworCQkJeworCQkJCXNpemVfdCBudW07CisJCQkJaW50IHI7CisKKwkJCQlyMSA9IEJJT19jdHJsX3BlbmRpbmcoaW8yKTsKKwkJCQlyMiA9IEJJT19jdHJsX2dldF9yZWFkX3JlcXVlc3QoaW8xKTsKKwkJCQkvKiBoZXJlIHdlIGNvdWxkIHVzZSAuLi5fZ2V0X3dyaXRlX2d1YXJhbnRlZSBpbnN0ZWFkIG9mCisJCQkJICogLi4uX2dldF9yZWFkX3JlcXVlc3QsIGJ1dCBieSB1c2luZyB0aGUgbGF0dGVyCisJCQkJICogd2UgdGVzdCByZXN0YXJ0YWJpbGl0eSBvZiB0aGUgU1NMIGltcGxlbWVudGF0aW9uCisJCQkJICogbW9yZSB0aG9yb3VnaGx5ICovCisJCQkJbnVtID0gcjE7CisJCQkJaWYgKHIyIDwgbnVtKQorCQkJCQludW0gPSByMjsKKwkJCQlpZiAobnVtKQorCQkJCQl7CisJCQkJCWNoYXIgKmRhdGFwdHI7CisJCQkJCQorCQkJCQlpZiAoSU5UX01BWCA8IG51bSkKKwkJCQkJCW51bSA9IElOVF9NQVg7CisKKwkJCQkJaWYgKG51bSA+IDEpCisJCQkJCQktLW51bTsgLyogdGVzdCByZXN0YXJ0YWJpbGl0eSBldmVuIG1vcmUgdGhvcm91Z2hseSAqLworCQkJCQkKKwkJCQkJciA9IEJJT19ud3JpdGUwKGlvMSwgJmRhdGFwdHIpOworCQkJCQlhc3NlcnQociA+IDApOworCQkJCQlpZiAociA8IChpbnQpbnVtKQorCQkJCQkJbnVtID0gcjsKKwkJCQkJciA9IEJJT19yZWFkKGlvMiwgZGF0YXB0ciwgKGludCludW0pOworCQkJCQlpZiAociAhPSAoaW50KW51bSkgLyogY2FuJ3QgaGFwcGVuICovCisJCQkJCQl7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBCSU9fcmVhZCBjb3VsZCBub3QgcmVhZCAiCisJCQkJCQkJIkJJT19jdHJsX3BlbmRpbmcoKSBieXRlcyIpOworCQkJCQkJZ290byBlcnI7CisJCQkJCQl9CisJCQkJCXByb2dyZXNzID0gMTsKKwkJCQkJciA9IEJJT19ud3JpdGUoaW8xLCAmZGF0YXB0ciwgKGludCludW0pOworCQkJCQlpZiAociAhPSAoaW50KW51bSkgLyogY2FuJ3QgaGFwcGVuICovCisJCQkJCQl7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBCSU9fbndyaXRlKCkgZGlkIG5vdCBhY2NlcHQgIgorCQkJCQkJCSJCSU9fbndyaXRlMCgpIGJ5dGVzIik7CisJCQkJCQlnb3RvIGVycjsKKwkJCQkJCX0KKwkJCQkJCisJCQkJCWlmIChkZWJ1ZykKKwkJCQkJCXByaW50ZigoaW8yID09IGNsaWVudF9pbykgPworCQkJCQkJCSJDLT5TIHJlbGF5aW5nOiAlZCBieXRlc1xuIiA6CisJCQkJCQkJIlMtPkMgcmVsYXlpbmc6ICVkIGJ5dGVzXG4iLAorCQkJCQkJCShpbnQpbnVtKTsKKwkJCQkJfQorCQkJfSAvKiBubyBsb29wLCBCSU9fY3RybF9nZXRfcmVhZF9yZXF1ZXN0IG5vdyByZXR1cm5zIDAgYW55d2F5ICovCisKKwkJCWlmICghcHJvZ3Jlc3MgJiYgIXByZXZfcHJvZ3Jlc3MpCisJCQkJaWYgKGN3X251bSA+IDAgfHwgY3JfbnVtID4gMCB8fCBzd19udW0gPiAwIHx8IHNyX251bSA+IDApCisJCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogZ290IHN0dWNrXG4iKTsKKwkJCQkJaWYgKHN0cmNtcCgiU1NMdjIiLCBTU0xfZ2V0X3ZlcnNpb24oY19zc2wpKSA9PSAwKQorCQkJCQkJeworCQkJCQkJZnByaW50ZihzdGRlcnIsICJUaGlzIGNhbiBoYXBwZW4gZm9yIFNTTDIgYmVjYXVzZSAiCisJCQkJCQkJIkNMSUVOVC1GSU5JU0hFRCBhbmQgU0VSVkVSLVZFUklGWSBhcmUgd3JpdHRlbiBcbiIKKwkJCQkJCQkiY29uY3VycmVudGx5IC4uLiIpOworCQkJCQkJaWYgKHN0cm5jbXAoIjJTQ0YiLCBTU0xfc3RhdGVfc3RyaW5nKGNfc3NsKSwgNCkgPT0gMAorCQkJCQkJCSYmIHN0cm5jbXAoIjJTU1YiLCBTU0xfc3RhdGVfc3RyaW5nKHNfc3NsKSwgNCkgPT0gMCkKKwkJCQkJCQl7CisJCQkJCQkJZnByaW50ZihzdGRlcnIsICIgb2suXG4iKTsKKwkJCQkJCQlnb3RvIGVuZDsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCWZwcmludGYoc3RkZXJyLCAiIEVSUk9SLlxuIik7CisJCQkJCWdvdG8gZXJyOworCQkJCQl9CisJCQlwcmV2X3Byb2dyZXNzID0gcHJvZ3Jlc3M7CisJCQl9CisJCX0KKwl3aGlsZSAoY3dfbnVtID4gMCB8fCBjcl9udW0gPiAwIHx8IHN3X251bSA+IDAgfHwgc3JfbnVtID4gMCk7CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRfZGV0YWlscyhjX3NzbCwgIkRPTkUgdmlhIEJJTyBwYWlyOiAiKTsKK2VuZDoKKwlyZXQgPSAwOworCisgZXJyOgorCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCisJaWYgKHNlcnZlcikKKwkJQklPX2ZyZWUoc2VydmVyKTsKKwlpZiAoc2VydmVyX2lvKQorCQlCSU9fZnJlZShzZXJ2ZXJfaW8pOworCWlmIChjbGllbnQpCisJCUJJT19mcmVlKGNsaWVudCk7CisJaWYgKGNsaWVudF9pbykKKwkJQklPX2ZyZWUoY2xpZW50X2lvKTsKKwlpZiAoc19zc2xfYmlvKQorCQlCSU9fZnJlZShzX3NzbF9iaW8pOworCWlmIChjX3NzbF9iaW8pCisJCUJJT19mcmVlKGNfc3NsX2Jpbyk7CisKKwlyZXR1cm4gcmV0OworCX0KKworCisjZGVmaW5lIFdfUkVBRAkxCisjZGVmaW5lIFdfV1JJVEUJMgorI2RlZmluZSBDX0RPTkUJMQorI2RlZmluZSBTX0RPTkUJMgorCitpbnQgZG9pdChTU0wgKnNfc3NsLCBTU0wgKmNfc3NsLCBsb25nIGNvdW50KQorCXsKKwlNU19TVEFUSUMgY2hhciBjYnVmWzEwMjQqOF0sc2J1ZlsxMDI0KjhdOworCWxvbmcgY3dfbnVtPWNvdW50LGNyX251bT1jb3VudDsKKwlsb25nIHN3X251bT1jb3VudCxzcl9udW09Y291bnQ7CisJaW50IHJldD0xOworCUJJTyAqY190b19zPU5VTEw7CisJQklPICpzX3RvX2M9TlVMTDsKKwlCSU8gKmNfYmlvPU5VTEw7CisJQklPICpzX2Jpbz1OVUxMOworCWludCBjX3IsY193LHNfcixzX3c7CisJaW50IGNfd2FudCxzX3dhbnQ7CisJaW50IGksajsKKwlpbnQgZG9uZT0wOworCWludCBjX3dyaXRlLHNfd3JpdGU7CisJaW50IGRvX3NlcnZlcj0wLGRvX2NsaWVudD0wOworCisJbWVtc2V0KGNidWYsMCxzaXplb2YoY2J1ZikpOworCW1lbXNldChzYnVmLDAsc2l6ZW9mKHNidWYpKTsKKworCWNfdG9fcz1CSU9fbmV3KEJJT19zX21lbSgpKTsKKwlzX3RvX2M9QklPX25ldyhCSU9fc19tZW0oKSk7CisJaWYgKChzX3RvX2MgPT0gTlVMTCkgfHwgKGNfdG9fcyA9PSBOVUxMKSkKKwkJeworCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQlnb3RvIGVycjsKKwkJfQorCisJY19iaW89QklPX25ldyhCSU9fZl9zc2woKSk7CisJc19iaW89QklPX25ldyhCSU9fZl9zc2woKSk7CisJaWYgKChjX2JpbyA9PSBOVUxMKSB8fCAoc19iaW8gPT0gTlVMTCkpCisJCXsKKwkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJZ290byBlcnI7CisJCX0KKworCVNTTF9zZXRfY29ubmVjdF9zdGF0ZShjX3NzbCk7CisJU1NMX3NldF9iaW8oY19zc2wsc190b19jLGNfdG9fcyk7CisJQklPX3NldF9zc2woY19iaW8sY19zc2wsQklPX05PQ0xPU0UpOworCisJU1NMX3NldF9hY2NlcHRfc3RhdGUoc19zc2wpOworCVNTTF9zZXRfYmlvKHNfc3NsLGNfdG9fcyxzX3RvX2MpOworCUJJT19zZXRfc3NsKHNfYmlvLHNfc3NsLEJJT19OT0NMT1NFKTsKKworCWNfcj0wOyBzX3I9MTsKKwljX3c9MTsgc193PTA7CisJY193YW50PVdfV1JJVEU7CisJc193YW50PTA7CisJY193cml0ZT0xLHNfd3JpdGU9MDsKKworCS8qIFdlIGNhbiBhbHdheXMgZG8gd3JpdGVzICovCisJZm9yICg7OykKKwkJeworCQlkb19zZXJ2ZXI9MDsKKwkJZG9fY2xpZW50PTA7CisKKwkJaT0oaW50KUJJT19wZW5kaW5nKHNfYmlvKTsKKwkJaWYgKChpICYmIHNfcikgfHwgc193KSBkb19zZXJ2ZXI9MTsKKworCQlpPShpbnQpQklPX3BlbmRpbmcoY19iaW8pOworCQlpZiAoKGkgJiYgY19yKSB8fCBjX3cpIGRvX2NsaWVudD0xOworCisJCWlmIChkb19zZXJ2ZXIgJiYgZGVidWcpCisJCQl7CisJCQlpZiAoU1NMX2luX2luaXQoc19zc2wpKQorCQkJCXByaW50Zigic2VydmVyIHdhaXRpbmcgaW4gU1NMX2FjY2VwdCAtICVzXG4iLAorCQkJCQlTU0xfc3RhdGVfc3RyaW5nX2xvbmcoc19zc2wpKTsKKy8qCQkJZWxzZSBpZiAoc193cml0ZSkKKwkJCQlwcmludGYoInNlcnZlcjpTU0xfd3JpdGUoKVxuIik7CisJCQllbHNlCisJCQkJcHJpbnRmKCJzZXJ2ZXI6U1NMX3JlYWQoKVxuIik7ICovCisJCQl9CisKKwkJaWYgKGRvX2NsaWVudCAmJiBkZWJ1ZykKKwkJCXsKKwkJCWlmIChTU0xfaW5faW5pdChjX3NzbCkpCisJCQkJcHJpbnRmKCJjbGllbnQgd2FpdGluZyBpbiBTU0xfY29ubmVjdCAtICVzXG4iLAorCQkJCQlTU0xfc3RhdGVfc3RyaW5nX2xvbmcoY19zc2wpKTsKKy8qCQkJZWxzZSBpZiAoY193cml0ZSkKKwkJCQlwcmludGYoImNsaWVudDpTU0xfd3JpdGUoKVxuIik7CisJCQllbHNlCisJCQkJcHJpbnRmKCJjbGllbnQ6U1NMX3JlYWQoKVxuIik7ICovCisJCQl9CisKKwkJaWYgKCFkb19jbGllbnQgJiYgIWRvX3NlcnZlcikKKwkJCXsKKwkJCWZwcmludGYoc3Rkb3V0LCJFUlJPUiBJTiBTVEFSVFVQXG4iKTsKKwkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQlicmVhazsKKwkJCX0KKwkJaWYgKGRvX2NsaWVudCAmJiAhKGRvbmUgJiBDX0RPTkUpKQorCQkJeworCQkJaWYgKGNfd3JpdGUpCisJCQkJeworCQkJCWogPSAoY3dfbnVtID4gKGxvbmcpc2l6ZW9mKGNidWYpKSA/CisJCQkJCShpbnQpc2l6ZW9mKGNidWYpIDogKGludCljd19udW07CisJCQkJaT1CSU9fd3JpdGUoY19iaW8sY2J1ZixqKTsKKwkJCQlpZiAoaSA8IDApCisJCQkJCXsKKwkJCQkJY19yPTA7CisJCQkJCWNfdz0wOworCQkJCQlpZiAoQklPX3Nob3VsZF9yZXRyeShjX2JpbykpCisJCQkJCQl7CisJCQkJCQlpZiAoQklPX3Nob3VsZF9yZWFkKGNfYmlvKSkKKwkJCQkJCQljX3I9MTsKKwkJCQkJCWlmIChCSU9fc2hvdWxkX3dyaXRlKGNfYmlvKSkKKwkJCQkJCQljX3c9MTsKKwkJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJZnByaW50ZihzdGRlcnIsIkVSUk9SIGluIENMSUVOVFxuIik7CisJCQkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCQkJZ290byBlcnI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlIGlmIChpID09IDApCisJCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsIlNTTCBDTElFTlQgU1RBUlRVUCBGQUlMRURcbiIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoZGVidWcpCisJCQkJCQlwcmludGYoImNsaWVudCB3cm90ZSAlZFxuIixpKTsKKwkJCQkJLyogb2sgKi8KKwkJCQkJc19yPTE7CisJCQkJCWNfd3JpdGU9MDsKKwkJCQkJY3dfbnVtLT1pOworCQkJCQl9CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlpPUJJT19yZWFkKGNfYmlvLGNidWYsc2l6ZW9mKGNidWYpKTsKKwkJCQlpZiAoaSA8IDApCisJCQkJCXsKKwkJCQkJY19yPTA7CisJCQkJCWNfdz0wOworCQkJCQlpZiAoQklPX3Nob3VsZF9yZXRyeShjX2JpbykpCisJCQkJCQl7CisJCQkJCQlpZiAoQklPX3Nob3VsZF9yZWFkKGNfYmlvKSkKKwkJCQkJCQljX3I9MTsKKwkJCQkJCWlmIChCSU9fc2hvdWxkX3dyaXRlKGNfYmlvKSkKKwkJCQkJCQljX3c9MTsKKwkJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJZnByaW50ZihzdGRlcnIsIkVSUk9SIGluIENMSUVOVFxuIik7CisJCQkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCQkJZ290byBlcnI7CisJCQkJCQl9CisJCQkJCX0KKwkJCQllbHNlIGlmIChpID09IDApCisJCQkJCXsKKwkJCQkJZnByaW50ZihzdGRlcnIsIlNTTCBDTElFTlQgU1RBUlRVUCBGQUlMRURcbiIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoZGVidWcpCisJCQkJCQlwcmludGYoImNsaWVudCByZWFkICVkXG4iLGkpOworCQkJCQljcl9udW0tPWk7CisJCQkJCWlmIChzd19udW0gPiAwKQorCQkJCQkJeworCQkJCQkJc193cml0ZT0xOworCQkJCQkJc193PTE7CisJCQkJCQl9CisJCQkJCWlmIChjcl9udW0gPD0gMCkKKwkJCQkJCXsKKwkJCQkJCXNfd3JpdGU9MTsKKwkJCQkJCXNfdz0xOworCQkJCQkJZG9uZT1TX0RPTkV8Q19ET05FOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCisJCWlmIChkb19zZXJ2ZXIgJiYgIShkb25lICYgU19ET05FKSkKKwkJCXsKKwkJCWlmICghc193cml0ZSkKKwkJCQl7CisJCQkJaT1CSU9fcmVhZChzX2JpbyxzYnVmLHNpemVvZihjYnVmKSk7CisJCQkJaWYgKGkgPCAwKQorCQkJCQl7CisJCQkJCXNfcj0wOworCQkJCQlzX3c9MDsKKwkJCQkJaWYgKEJJT19zaG91bGRfcmV0cnkoc19iaW8pKQorCQkJCQkJeworCQkJCQkJaWYgKEJJT19zaG91bGRfcmVhZChzX2JpbykpCisJCQkJCQkJc19yPTE7CisJCQkJCQlpZiAoQklPX3Nob3VsZF93cml0ZShzX2JpbykpCisJCQkJCQkJc193PTE7CisJCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCJFUlJPUiBpbiBTRVJWRVJcbiIpOworCQkJCQkJRVJSX3ByaW50X2Vycm9ycyhiaW9fZXJyKTsKKwkJCQkJCWdvdG8gZXJyOworCQkJCQkJfQorCQkJCQl9CisJCQkJZWxzZSBpZiAoaSA9PSAwKQorCQkJCQl7CisJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJCWZwcmludGYoc3RkZXJyLCJTU0wgU0VSVkVSIFNUQVJUVVAgRkFJTEVEIGluIFNTTF9yZWFkXG4iKTsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQllbHNlCisJCQkJCXsKKwkJCQkJaWYgKGRlYnVnKQorCQkJCQkJcHJpbnRmKCJzZXJ2ZXIgcmVhZCAlZFxuIixpKTsKKwkJCQkJc3JfbnVtLT1pOworCQkJCQlpZiAoY3dfbnVtID4gMCkKKwkJCQkJCXsKKwkJCQkJCWNfd3JpdGU9MTsKKwkJCQkJCWNfdz0xOworCQkJCQkJfQorCQkJCQlpZiAoc3JfbnVtIDw9IDApCisJCQkJCQl7CisJCQkJCQlzX3dyaXRlPTE7CisJCQkJCQlzX3c9MTsKKwkJCQkJCWNfd3JpdGU9MDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCWVsc2UKKwkJCQl7CisJCQkJaiA9IChzd19udW0gPiAobG9uZylzaXplb2Yoc2J1ZikpID8KKwkJCQkJKGludClzaXplb2Yoc2J1ZikgOiAoaW50KXN3X251bTsKKwkJCQlpPUJJT193cml0ZShzX2JpbyxzYnVmLGopOworCQkJCWlmIChpIDwgMCkKKwkJCQkJeworCQkJCQlzX3I9MDsKKwkJCQkJc193PTA7CisJCQkJCWlmIChCSU9fc2hvdWxkX3JldHJ5KHNfYmlvKSkKKwkJCQkJCXsKKwkJCQkJCWlmIChCSU9fc2hvdWxkX3JlYWQoc19iaW8pKQorCQkJCQkJCXNfcj0xOworCQkJCQkJaWYgKEJJT19zaG91bGRfd3JpdGUoc19iaW8pKQorCQkJCQkJCXNfdz0xOworCQkJCQkJfQorCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwiRVJST1IgaW4gU0VSVkVSXG4iKTsKKwkJCQkJCUVSUl9wcmludF9lcnJvcnMoYmlvX2Vycik7CisJCQkJCQlnb3RvIGVycjsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWVsc2UgaWYgKGkgPT0gMCkKKwkJCQkJeworCQkJCQlFUlJfcHJpbnRfZXJyb3JzKGJpb19lcnIpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwiU1NMIFNFUlZFUiBTVEFSVFVQIEZBSUxFRCBpbiBTU0xfd3JpdGVcbiIpOworCQkJCQlnb3RvIGVycjsKKwkJCQkJfQorCQkJCWVsc2UKKwkJCQkJeworCQkJCQlpZiAoZGVidWcpCisJCQkJCQlwcmludGYoInNlcnZlciB3cm90ZSAlZFxuIixpKTsKKwkJCQkJc3dfbnVtLT1pOworCQkJCQlzX3dyaXRlPTA7CisJCQkJCWNfcj0xOworCQkJCQlpZiAoc3dfbnVtIDw9IDApCisJCQkJCQlkb25lfD1TX0RPTkU7CisJCQkJCX0KKwkJCQl9CisJCQl9CisKKwkJaWYgKChkb25lICYgU19ET05FKSAmJiAoZG9uZSAmIENfRE9ORSkpIGJyZWFrOworCQl9CisKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRfZGV0YWlscyhjX3NzbCwgIkRPTkU6ICIpOworCXJldD0wOworZXJyOgorCS8qIFdlIGhhdmUgdG8gc2V0IHRoZSBCSU8ncyB0byBOVUxMIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUKKwkgKiBPUEVOU1NMX2ZyZWUoKWVkIHR3aWNlLiAgT25jZSB3aGVuIHRoIHNfc3NsIGlzIFNTTF9mcmVlKCllZCBhbmQKKwkgKiBhZ2FpbiB3aGVuIGNfc3NsIGlzIFNTTF9mcmVlKCllZC4KKwkgKiBUaGlzIGlzIGEgaGFjayByZXF1aXJlZCBiZWNhdXNlIHNfc3NsIGFuZCBjX3NzbCBhcmUgc2hhcmluZyB0aGUgc2FtZQorCSAqIEJJTyBzdHJ1Y3R1cmUgYW5kIFNTTF9zZXRfYmlvKCkgYW5kIFNTTF9mcmVlKCkgYXV0b21hdGljYWxseQorCSAqIEJJT19mcmVlIG5vbiBOVUxMIGVudHJpZXMuCisJICogWW91IHNob3VsZCBub3Qgbm9ybWFsbHkgZG8gdGhpcyBvciBiZSByZXF1aXJlZCB0byBkbyB0aGlzICovCisJaWYgKHNfc3NsICE9IE5VTEwpCisJCXsKKwkJc19zc2wtPnJiaW89TlVMTDsKKwkJc19zc2wtPndiaW89TlVMTDsKKwkJfQorCWlmIChjX3NzbCAhPSBOVUxMKQorCQl7CisJCWNfc3NsLT5yYmlvPU5VTEw7CisJCWNfc3NsLT53YmlvPU5VTEw7CisJCX0KKworCWlmIChjX3RvX3MgIT0gTlVMTCkgQklPX2ZyZWUoY190b19zKTsKKwlpZiAoc190b19jICE9IE5VTEwpIEJJT19mcmVlKHNfdG9fYyk7CisJaWYgKGNfYmlvICE9IE5VTEwpIEJJT19mcmVlX2FsbChjX2Jpbyk7CisJaWYgKHNfYmlvICE9IE5VTEwpIEJJT19mcmVlX2FsbChzX2Jpbyk7CisJcmV0dXJuKHJldCk7CisJfQorCitzdGF0aWMgaW50IGdldF9wcm94eV9hdXRoX2V4X2RhdGFfaWR4KHZvaWQpCisJeworCXN0YXRpYyB2b2xhdGlsZSBpbnQgaWR4ID0gLTE7CisJaWYgKGlkeCA8IDApCisJCXsKKwkJQ1JZUFRPX3dfbG9jayhDUllQVE9fTE9DS19TU0xfQ1RYKTsKKwkJaWYgKGlkeCA8IDApCisJCQl7CisJCQlpZHggPSBYNTA5X1NUT1JFX0NUWF9nZXRfZXhfbmV3X2luZGV4KDAsCisJCQkJIlNTTHRlc3QgZm9yIHZlcmlmeSBjYWxsYmFjayIsIE5VTEwsTlVMTCxOVUxMKTsKKwkJCX0KKwkJQ1JZUFRPX3dfdW5sb2NrKENSWVBUT19MT0NLX1NTTF9DVFgpOworCQl9CisJcmV0dXJuIGlkeDsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgdmVyaWZ5X2NhbGxiYWNrKGludCBvaywgWDUwOV9TVE9SRV9DVFggKmN0eCkKKwl7CisJY2hhciAqcyxidWZbMjU2XTsKKworCXM9WDUwOV9OQU1FX29uZWxpbmUoWDUwOV9nZXRfc3ViamVjdF9uYW1lKGN0eC0+Y3VycmVudF9jZXJ0KSxidWYsCisJCQkgICAgc2l6ZW9mIGJ1Zik7CisJaWYgKHMgIT0gTlVMTCkKKwkJeworCQlpZiAob2spCisJCQlmcHJpbnRmKHN0ZGVyciwiZGVwdGg9JWQgJXNcbiIsCisJCQkJY3R4LT5lcnJvcl9kZXB0aCxidWYpOworCQllbHNlCisJCQl7CisJCQlmcHJpbnRmKHN0ZGVyciwiZGVwdGg9JWQgZXJyb3I9JWQgJXNcbiIsCisJCQkJY3R4LT5lcnJvcl9kZXB0aCxjdHgtPmVycm9yLGJ1Zik7CisJCQl9CisJCX0KKworCWlmIChvayA9PSAwKQorCQl7CisJCWZwcmludGYoc3RkZXJyLCJFcnJvciBzdHJpbmc6ICVzXG4iLAorCQkJWDUwOV92ZXJpZnlfY2VydF9lcnJvcl9zdHJpbmcoY3R4LT5lcnJvcikpOworCQlzd2l0Y2ggKGN0eC0+ZXJyb3IpCisJCQl7CisJCWNhc2UgWDUwOV9WX0VSUl9DRVJUX05PVF9ZRVRfVkFMSUQ6CisJCWNhc2UgWDUwOV9WX0VSUl9DRVJUX0hBU19FWFBJUkVEOgorCQljYXNlIFg1MDlfVl9FUlJfREVQVEhfWkVST19TRUxGX1NJR05FRF9DRVJUOgorCQkJZnByaW50ZihzdGRlcnIsIiAgLi4uIGlnbm9yZWQuXG4iKTsKKwkJCW9rPTE7CisJCQl9CisJCX0KKworCWlmIChvayA9PSAxKQorCQl7CisJCVg1MDkgKnhzID0gY3R4LT5jdXJyZW50X2NlcnQ7CisjaWYgMAorCQlYNTA5ICp4aSA9IGN0eC0+Y3VycmVudF9pc3N1ZXI7CisjZW5kaWYKKworCQlpZiAoeHMtPmV4X2ZsYWdzICYgRVhGTEFHX1BST1hZKQorCQkJeworCQkJdW5zaWduZWQgaW50ICpsZXR0ZXJzID0KKwkJCQlYNTA5X1NUT1JFX0NUWF9nZXRfZXhfZGF0YShjdHgsCisJCQkJCWdldF9wcm94eV9hdXRoX2V4X2RhdGFfaWR4KCkpOworCisJCQlpZiAobGV0dGVycykKKwkJCQl7CisJCQkJaW50IGZvdW5kX2FueSA9IDA7CisJCQkJaW50IGk7CisJCQkJUFJPWFlfQ0VSVF9JTkZPX0VYVEVOU0lPTiAqcGNpID0KKwkJCQkJWDUwOV9nZXRfZXh0X2QyaSh4cywgTklEX3Byb3h5Q2VydEluZm8sCisJCQkJCQlOVUxMLCBOVUxMKTsKKworCQkJCXN3aXRjaCAoT0JKX29iajJuaWQocGNpLT5wcm94eVBvbGljeS0+cG9saWN5TGFuZ3VhZ2UpKQorCQkJCQl7CisJCQkJY2FzZSBOSURfSW5kZXBlbmRlbnQ6CisJCQkJCS8qIENvbXBsZXRlbHkgbWVhbmluZ2xlc3MgaW4gdGhpcworCQkJCQkgICBwcm9ncmFtLCBhcyB0aGVyZSdzIG5vIHdheSB0bworCQkJCQkgICBncmFudCBleHBsaWNpdCByaWdodHMgdG8gYQorCQkJCQkgICBzcGVjaWZpYyBQckMuICBCYXNpY2FsbHksIHVzaW5nCisJCQkJCSAgIGlkLXBwbC1JbmRlcGVuZGVudCBpcyB0aGUgcGVyZmVjdAorCQkJCQkgICB3YXkgdG8gZ3JhbnQgbm8gcmlnaHRzIGF0IGFsbC4gKi8KKwkJCQkJZnByaW50ZihzdGRlcnIsICIgIEluZGVwZW5kZW50IHByb3h5IGNlcnRpZmljYXRlIik7CisJCQkJCWZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQorCQkJCQkJbGV0dGVyc1tpXSA9IDA7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgTklEX2lkX3BwbF9pbmhlcml0QWxsOgorCQkJCQkvKiBUaGlzIGlzIGJhc2ljYWxseSBhIE5PUCwgd2UKKwkJCQkJICAgc2ltcGx5IGxldCB0aGUgY3VycmVudCByaWdodHMKKwkJCQkJICAgc3RhbmQgYXMgdGhleSBhcmUuICovCisJCQkJCWZwcmludGYoc3RkZXJyLCAiICBQcm94eSBjZXJ0aWZpY2F0ZSBpbmhlcml0cyBhbGwiKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcyA9IChjaGFyICopCisJCQkJCQlwY2ktPnByb3h5UG9saWN5LT5wb2xpY3ktPmRhdGE7CisJCQkJCWkgPSBwY2ktPnByb3h5UG9saWN5LT5wb2xpY3ktPmxlbmd0aDsKKworCQkJCQkvKiBUaGUgYWxnb3JpdGhtIHdvcmtzIGFzIGZvbGxvd3M6CisJCQkJCSAgIGl0IGlzIGFzc3VtZWQgdGhhdCBwcmV2aW91cworCQkJCQkgICBpdGVyYXRpb25zIG9yIHRoZSBpbml0aWFsIGdyYW50ZWQKKwkJCQkJICAgcmlnaHRzIGhhcyBhbHJlYWR5IHNldCBzb21lIGVsZW1lbnRzCisJCQkJCSAgIG9mIGBsZXR0ZXJzJy4gIFdoYXQgd2UgbmVlZCB0byBkbyBpcworCQkJCQkgICB0byBjbGVhciB0aG9zZSB0aGF0IHdlcmVuJ3QgZ3JhbnRlZAorCQkJCQkgICBieSB0aGUgY3VycmVudCBQckMgYXMgd2VsbC4gIFRoZQorCQkJCQkgICBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGFkZCAxCisJCQkJCSAgIHRvIGFsbCB0aGUgZWxlbWVudHMgd2hvc2UgbGV0dGVycworCQkJCQkgICBhcmUgZ2l2ZW4gd2l0aCB0aGUgY3VycmVudCBwb2xpY3kuCisJCQkJCSAgIFRoYXQgd2F5LCBhbGwgZWxlbWVudHMgdGhhdCBhcmUgc2V0CisJCQkJCSAgIGJ5IHRoZSBjdXJyZW50IHBvbGljeSBhbmQgd2VyZQorCQkJCQkgICBhbHJlYWR5IHNldCBieSBlYXJsaWVyIHBvbGljaWVzIGFuZAorCQkJCQkgICB0aHJvdWdoIHRoZSBvcmlnaW5hbCBncmFudCBvZiByaWdodHMKKwkJCQkJICAgd2lsbCBnZXQgdGhlIHZhbHVlIDIgb3IgaGlnaGVyLgorCQkJCQkgICBUaGUgbGFzdCB0aGluZyB0byBkbyBpcyB0byBzd2VlcAorCQkJCQkgICB0aHJvdWdoIGBsZXR0ZXJzJyBhbmQga2VlcCB0aGUKKwkJCQkJICAgZWxlbWVudHMgaGF2aW5nIHRoZSB2YWx1ZSAyIGFzIHNldCwKKwkJCQkJICAgYW5kIGNsZWFyIGFsbCB0aGUgb3RoZXJzLiAqLworCisJCQkJCWZwcmludGYoc3RkZXJyLCAiICBDZXJ0aWZpY2F0ZSBwcm94eSByaWdodHMgPSAlKi4qcyIsIGksIGksIHMpOworCQkJCQl3aGlsZShpLS0gPiAwKQorCQkJCQkJeworCQkJCQkJaW50IGMgPSAqcysrOworCQkJCQkJaWYgKGlzYXNjaWkoYykgJiYgaXNhbHBoYShjKSkKKwkJCQkJCQl7CisJCQkJCQkJaWYgKGlzbG93ZXIoYykpCisJCQkJCQkJCWMgPSB0b3VwcGVyKGMpOworCQkJCQkJCWxldHRlcnNbYyAtICdBJ10rKzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCWZvciAoaSA9IDA7IGkgPCAyNjsgaSsrKQorCQkJCQkJaWYgKGxldHRlcnNbaV0gPCAyKQorCQkJCQkJCWxldHRlcnNbaV0gPSAwOworCQkJCQkJZWxzZQorCQkJCQkJCWxldHRlcnNbaV0gPSAxOworCQkJCQl9CisKKwkJCQlmb3VuZF9hbnkgPSAwOworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiLCByZXN1bHRpbmcgcHJveHkgcmlnaHRzID0gIik7CisJCQkJZm9yKGkgPSAwOyBpIDwgMjY7IGkrKykKKwkJCQkJaWYgKGxldHRlcnNbaV0pCisJCQkJCQl7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVjIiwgaSArICdBJyk7CisJCQkJCQlmb3VuZF9hbnkgPSAxOworCQkJCQkJfQorCQkJCWlmICghZm91bmRfYW55KQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIm5vbmUiKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKwkJCQlQUk9YWV9DRVJUX0lORk9fRVhURU5TSU9OX2ZyZWUocGNpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCXJldHVybihvayk7CisJfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzX3Byb3h5X2RlYnVnKGludCBpbmRlbnQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCXsKKwlzdGF0aWMgY29uc3QgY2hhciBpbmRlbnRhdGlvbltdID0KKwkJIj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4iCisJCSI+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+IjsgLyogVGhhdCdzIDgwID4gKi8KKwljaGFyIG15X2Zvcm1hdFsyNTZdOworCXZhX2xpc3QgYXJnczsKKworCUJJT19zbnByaW50ZihteV9mb3JtYXQsIHNpemVvZihteV9mb3JtYXQpLCAiJSouKnMgJXMiLAorCQlpbmRlbnQsIGluZGVudCwgaW5kZW50YXRpb24sIGZvcm1hdCk7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCXZmcHJpbnRmKHN0ZGVyciwgbXlfZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJfQorLyogUHJpb3JpdHkgbGV2ZWxzOgorICAgMAlbIV12YXIsICgpCisgICAxCSYgXgorICAgMgl8CisqLworc3RhdGljIGludCBwcm9jZXNzX3Byb3h5X2NvbmRfYWRkZXJzKHVuc2lnbmVkIGludCBsZXR0ZXJzWzI2XSwKKwljb25zdCBjaGFyICpjb25kLCBjb25zdCBjaGFyICoqY29uZF9lbmQsIGludCAqcG9zLCBpbnQgaW5kZW50KTsKK3N0YXRpYyBpbnQgcHJvY2Vzc19wcm94eV9jb25kX3ZhbCh1bnNpZ25lZCBpbnQgbGV0dGVyc1syNl0sCisJY29uc3QgY2hhciAqY29uZCwgY29uc3QgY2hhciAqKmNvbmRfZW5kLCBpbnQgKnBvcywgaW50IGluZGVudCkKKwl7CisJaW50IGM7CisJaW50IG9rID0gMTsKKwlpbnQgbmVnYXRlID0gMDsKKworCXdoaWxlKGlzc3BhY2UoKGludCkqY29uZCkpCisJCXsKKwkJY29uZCsrOyAoKnBvcykrKzsKKwkJfQorCWMgPSAqY29uZDsKKworCWlmIChkZWJ1ZykKKwkJcHJvY2Vzc19wcm94eV9kZWJ1ZyhpbmRlbnQsCisJCQkiU3RhcnQgcHJvY2Vzc19wcm94eV9jb25kX3ZhbCBhdCBwb3NpdGlvbiAlZDogJXNcbiIsCisJCQkqcG9zLCBjb25kKTsKKworCXdoaWxlKGMgPT0gJyEnKQorCQl7CisJCW5lZ2F0ZSA9ICFuZWdhdGU7CisJCWNvbmQrKzsgKCpwb3MpKys7CisJCXdoaWxlKGlzc3BhY2UoKGludCkqY29uZCkpCisJCQl7CisJCQljb25kKys7ICgqcG9zKSsrOworCQkJfQorCQljID0gKmNvbmQ7CisJCX0KKworCWlmIChjID09ICcoJykKKwkJeworCQljb25kKys7ICgqcG9zKSsrOworCQlvayA9IHByb2Nlc3NfcHJveHlfY29uZF9hZGRlcnMobGV0dGVycywgY29uZCwgY29uZF9lbmQsIHBvcywKKwkJCWluZGVudCArIDEpOworCQljb25kID0gKmNvbmRfZW5kOworCQlpZiAob2sgPCAwKQorCQkJZ290byBlbmQ7CisJCXdoaWxlKGlzc3BhY2UoKGludCkqY29uZCkpCisJCQl7CisJCQljb25kKys7ICgqcG9zKSsrOworCQkJfQorCQljID0gKmNvbmQ7CisJCWlmIChjICE9ICcpJykKKwkJCXsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJXZWlyZCBjb25kaXRpb24gY2hhcmFjdGVyIGluIHBvc2l0aW9uICVkOiAiCisJCQkJIiVjXG4iLCAqcG9zLCBjKTsKKwkJCW9rID0gLTE7CisJCQlnb3RvIGVuZDsKKwkJCX0KKwkJY29uZCsrOyAoKnBvcykrKzsKKwkJfQorCWVsc2UgaWYgKGlzYXNjaWkoYykgJiYgaXNhbHBoYShjKSkKKwkJeworCQlpZiAoaXNsb3dlcihjKSkKKwkJCWMgPSB0b3VwcGVyKGMpOworCQlvayA9IGxldHRlcnNbYyAtICdBJ107CisJCWNvbmQrKzsgKCpwb3MpKys7CisJCX0KKwllbHNlCisJCXsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiV2VpcmQgY29uZGl0aW9uIGNoYXJhY3RlciBpbiBwb3NpdGlvbiAlZDogIgorCQkJIiVjXG4iLCAqcG9zLCBjKTsKKwkJb2sgPSAtMTsKKwkJZ290byBlbmQ7CisJCX0KKyBlbmQ6CisJKmNvbmRfZW5kID0gY29uZDsKKwlpZiAob2sgPj0gMCAmJiBuZWdhdGUpCisJCW9rID0gIW9rOworCisJaWYgKGRlYnVnKQorCQlwcm9jZXNzX3Byb3h5X2RlYnVnKGluZGVudCwKKwkJCSJFbmQgcHJvY2Vzc19wcm94eV9jb25kX3ZhbCBhdCBwb3NpdGlvbiAlZDogJXMsIHJldHVybmluZyAlZFxuIiwKKwkJCSpwb3MsIGNvbmQsIG9rKTsKKworCXJldHVybiBvazsKKwl9CitzdGF0aWMgaW50IHByb2Nlc3NfcHJveHlfY29uZF9tdWx0aXBsaWVycyh1bnNpZ25lZCBpbnQgbGV0dGVyc1syNl0sCisJY29uc3QgY2hhciAqY29uZCwgY29uc3QgY2hhciAqKmNvbmRfZW5kLCBpbnQgKnBvcywgaW50IGluZGVudCkKKwl7CisJaW50IG9rOworCWNoYXIgYzsKKworCWlmIChkZWJ1ZykKKwkJcHJvY2Vzc19wcm94eV9kZWJ1ZyhpbmRlbnQsCisJCQkiU3RhcnQgcHJvY2Vzc19wcm94eV9jb25kX211bHRpcGxpZXJzIGF0IHBvc2l0aW9uICVkOiAlc1xuIiwKKwkJCSpwb3MsIGNvbmQpOworCisJb2sgPSBwcm9jZXNzX3Byb3h5X2NvbmRfdmFsKGxldHRlcnMsIGNvbmQsIGNvbmRfZW5kLCBwb3MsIGluZGVudCArIDEpOworCWNvbmQgPSAqY29uZF9lbmQ7CisJaWYgKG9rIDwgMCkKKwkJZ290byBlbmQ7CisKKwl3aGlsZShvayA+PSAwKQorCQl7CisJCXdoaWxlKGlzc3BhY2UoKGludCkqY29uZCkpCisJCQl7CisJCQljb25kKys7ICgqcG9zKSsrOworCQkJfQorCQljID0gKmNvbmQ7CisKKwkJc3dpdGNoKGMpCisJCQl7CisJCWNhc2UgJyYnOgorCQljYXNlICdeJzoKKwkJCXsKKwkJCWludCBzYXZlX29rID0gb2s7CisKKwkJCWNvbmQrKzsgKCpwb3MpKys7CisJCQlvayA9IHByb2Nlc3NfcHJveHlfY29uZF92YWwobGV0dGVycywKKwkJCQljb25kLCBjb25kX2VuZCwgcG9zLCBpbmRlbnQgKyAxKTsKKwkJCWNvbmQgPSAqY29uZF9lbmQ7CisJCQlpZiAob2sgPCAwKQorCQkJCWJyZWFrOworCisJCQlzd2l0Y2goYykKKwkJCQl7CisJCQljYXNlICcmJzoKKwkJCQlvayAmPSBzYXZlX29rOworCQkJCWJyZWFrOworCQkJY2FzZSAnXic6CisJCQkJb2sgXj0gc2F2ZV9vazsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZnByaW50ZihzdGRlcnIsICJTT01FVEhJTkcgSVMgU0VSSU9VU0xZIFdST05HISIKKwkJCQkJIiBTVE9QUElOR1xuIik7CisJCQkJRVhJVCgxKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisgZW5kOgorCWlmIChkZWJ1ZykKKwkJcHJvY2Vzc19wcm94eV9kZWJ1ZyhpbmRlbnQsCisJCQkiRW5kIHByb2Nlc3NfcHJveHlfY29uZF9tdWx0aXBsaWVycyBhdCBwb3NpdGlvbiAlZDogJXMsIHJldHVybmluZyAlZFxuIiwKKwkJCSpwb3MsIGNvbmQsIG9rKTsKKworCSpjb25kX2VuZCA9IGNvbmQ7CisJcmV0dXJuIG9rOworCX0KK3N0YXRpYyBpbnQgcHJvY2Vzc19wcm94eV9jb25kX2FkZGVycyh1bnNpZ25lZCBpbnQgbGV0dGVyc1syNl0sCisJY29uc3QgY2hhciAqY29uZCwgY29uc3QgY2hhciAqKmNvbmRfZW5kLCBpbnQgKnBvcywgaW50IGluZGVudCkKKwl7CisJaW50IG9rOworCWNoYXIgYzsKKworCWlmIChkZWJ1ZykKKwkJcHJvY2Vzc19wcm94eV9kZWJ1ZyhpbmRlbnQsCisJCQkiU3RhcnQgcHJvY2Vzc19wcm94eV9jb25kX2FkZGVycyBhdCBwb3NpdGlvbiAlZDogJXNcbiIsCisJCQkqcG9zLCBjb25kKTsKKworCW9rID0gcHJvY2Vzc19wcm94eV9jb25kX211bHRpcGxpZXJzKGxldHRlcnMsIGNvbmQsIGNvbmRfZW5kLCBwb3MsCisJCWluZGVudCArIDEpOworCWNvbmQgPSAqY29uZF9lbmQ7CisJaWYgKG9rIDwgMCkKKwkJZ290byBlbmQ7CisKKwl3aGlsZShvayA+PSAwKQorCQl7CisJCXdoaWxlKGlzc3BhY2UoKGludCkqY29uZCkpCisJCQl7CisJCQljb25kKys7ICgqcG9zKSsrOworCQkJfQorCQljID0gKmNvbmQ7CisKKwkJc3dpdGNoKGMpCisJCQl7CisJCWNhc2UgJ3wnOgorCQkJeworCQkJaW50IHNhdmVfb2sgPSBvazsKKworCQkJY29uZCsrOyAoKnBvcykrKzsKKwkJCW9rID0gcHJvY2Vzc19wcm94eV9jb25kX211bHRpcGxpZXJzKGxldHRlcnMsCisJCQkJY29uZCwgY29uZF9lbmQsIHBvcywgaW5kZW50ICsgMSk7CisJCQljb25kID0gKmNvbmRfZW5kOworCQkJaWYgKG9rIDwgMCkKKwkJCQlicmVhazsKKworCQkJc3dpdGNoKGMpCisJCQkJeworCQkJY2FzZSAnfCc6CisJCQkJb2sgfD0gc2F2ZV9vazsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZnByaW50ZihzdGRlcnIsICJTT01FVEhJTkcgSVMgU0VSSU9VU0xZIFdST05HISIKKwkJCQkJIiBTVE9QUElOR1xuIik7CisJCQkJRVhJVCgxKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZW5kOworCQkJfQorCQl9CisgZW5kOgorCWlmIChkZWJ1ZykKKwkJcHJvY2Vzc19wcm94eV9kZWJ1ZyhpbmRlbnQsCisJCQkiRW5kIHByb2Nlc3NfcHJveHlfY29uZF9hZGRlcnMgYXQgcG9zaXRpb24gJWQ6ICVzLCByZXR1cm5pbmcgJWRcbiIsCisJCQkqcG9zLCBjb25kLCBvayk7CisKKwkqY29uZF9lbmQgPSBjb25kOworCXJldHVybiBvazsKKwl9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19wcm94eV9jb25kKHVuc2lnbmVkIGludCBsZXR0ZXJzWzI2XSwKKwljb25zdCBjaGFyICpjb25kLCBjb25zdCBjaGFyICoqY29uZF9lbmQpCisJeworCWludCBwb3MgPSAxOworCXJldHVybiBwcm9jZXNzX3Byb3h5X2NvbmRfYWRkZXJzKGxldHRlcnMsIGNvbmQsIGNvbmRfZW5kLCAmcG9zLCAxKTsKKwl9CisKK3N0YXRpYyBpbnQgTVNfQ0FMTEJBQ0sgYXBwX3ZlcmlmeV9jYWxsYmFjayhYNTA5X1NUT1JFX0NUWCAqY3R4LCB2b2lkICphcmcpCisJeworCWludCBvaz0xOworCXN0cnVjdCBhcHBfdmVyaWZ5X2FyZyAqY2JfYXJnID0gYXJnOworCXVuc2lnbmVkIGludCBsZXR0ZXJzWzI2XTsgLyogb25seSB1c2VkIHdpdGggcHJveHlfYXV0aCAqLworCisJaWYgKGNiX2FyZy0+YXBwX3ZlcmlmeSkKKwkJeworCQljaGFyICpzID0gTlVMTCxidWZbMjU2XTsKKworCQlmcHJpbnRmKHN0ZGVyciwgIkluIGFwcF92ZXJpZnlfY2FsbGJhY2ssIGFsbG93aW5nIGNlcnQuICIpOworCQlmcHJpbnRmKHN0ZGVyciwgIkFyZyBpczogJXNcbiIsIGNiX2FyZy0+c3RyaW5nKTsKKwkJZnByaW50ZihzdGRlcnIsICJGaW5pc2hlZCBwcmludGluZyBkbyB3ZSBoYXZlIGEgY29udGV4dD8gMHglcCBhIGNlcnQ/IDB4JXBcbiIsCisJCQkodm9pZCAqKWN0eCwgKHZvaWQgKiljdHgtPmNlcnQpOworCQlpZiAoY3R4LT5jZXJ0KQorCQkJcz1YNTA5X05BTUVfb25lbGluZShYNTA5X2dldF9zdWJqZWN0X25hbWUoY3R4LT5jZXJ0KSxidWYsMjU2KTsKKwkJaWYgKHMgIT0gTlVMTCkKKwkJCXsKKwkJCWZwcmludGYoc3RkZXJyLCJjZXJ0IGRlcHRoPSVkICVzXG4iLGN0eC0+ZXJyb3JfZGVwdGgsYnVmKTsKKwkJCX0KKwkJcmV0dXJuKDEpOworCQl9CisJaWYgKGNiX2FyZy0+cHJveHlfYXV0aCkKKwkJeworCQlpbnQgZm91bmRfYW55ID0gMCwgaTsKKwkJY2hhciAqc3A7CisKKwkJZm9yKGkgPSAwOyBpIDwgMjY7IGkrKykKKwkJCWxldHRlcnNbaV0gPSAwOworCQlmb3Ioc3AgPSBjYl9hcmctPnByb3h5X2F1dGg7ICpzcDsgc3ArKykKKwkJCXsKKwkJCWludCBjID0gKnNwOworCQkJaWYgKGlzYXNjaWkoYykgJiYgaXNhbHBoYShjKSkKKwkJCQl7CisJCQkJaWYgKGlzbG93ZXIoYykpCisJCQkJCWMgPSB0b3VwcGVyKGMpOworCQkJCWxldHRlcnNbYyAtICdBJ10gPSAxOworCQkJCX0KKwkJCX0KKworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSIgIEluaXRpYWwgcHJveHkgcmlnaHRzID0gIik7CisJCWZvcihpID0gMDsgaSA8IDI2OyBpKyspCisJCQlpZiAobGV0dGVyc1tpXSkKKwkJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsICIlYyIsIGkgKyAnQScpOworCQkJCWZvdW5kX2FueSA9IDE7CisJCQkJfQorCQlpZiAoIWZvdW5kX2FueSkKKwkJCWZwcmludGYoc3RkZXJyLCAibm9uZSIpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKwkJWDUwOV9TVE9SRV9DVFhfc2V0X2V4X2RhdGEoY3R4LAorCQkJZ2V0X3Byb3h5X2F1dGhfZXhfZGF0YV9pZHgoKSxsZXR0ZXJzKTsKKwkJfQorCWlmIChjYl9hcmctPmFsbG93X3Byb3h5X2NlcnRzKQorCQl7CisJCVg1MDlfU1RPUkVfQ1RYX3NldF9mbGFncyhjdHgsIFg1MDlfVl9GTEFHX0FMTE9XX1BST1hZX0NFUlRTKTsKKwkJfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fWDUwOV9WRVJJRlkKKyMgaWZkZWYgT1BFTlNTTF9GSVBTCisJaWYocy0+dmVyc2lvbiA9PSBUTFMxX1ZFUlNJT04pCisJCUZJUFNfYWxsb3dfbWQ1KDEpOworIyBlbmRpZgorCW9rID0gWDUwOV92ZXJpZnlfY2VydChjdHgpOworIyBpZmRlZiBPUEVOU1NMX0ZJUFMKKwlpZihzLT52ZXJzaW9uID09IFRMUzFfVkVSU0lPTikKKwkJRklQU19hbGxvd19tZDUoMCk7CisjIGVuZGlmCisjZW5kaWYKKworCWlmIChjYl9hcmctPnByb3h5X2F1dGgpCisJCXsKKwkJaWYgKG9rID4gMCkKKwkJCXsKKwkJCWNvbnN0IGNoYXIgKmNvbmRfZW5kID0gTlVMTDsKKworCQkJb2sgPSBwcm9jZXNzX3Byb3h5X2NvbmQobGV0dGVycywKKwkJCQljYl9hcmctPnByb3h5X2NvbmQsICZjb25kX2VuZCk7CisKKwkJCWlmIChvayA8IDApCisJCQkJRVhJVCgzKTsKKwkJCWlmICgqY29uZF9lbmQpCisJCQkJeworCQkJCWZwcmludGYoc3RkZXJyLCAiU3RvcHBlZCBwcm9jZXNzaW5nIGNvbmRpdGlvbiBiZWZvcmUgaXQncyBlbmQuXG4iKTsKKwkJCQlvayA9IDA7CisJCQkJfQorCQkJaWYgKCFvaykKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlByb3h5IHJpZ2h0cyBjaGVjayB3aXRoIGNvbmRpdGlvbiAnJXMnIHByb3ZlZCBpbnZhbGlkXG4iLAorCQkJCQljYl9hcmctPnByb3h5X2NvbmQpOworCQkJZWxzZQorCQkJCWZwcmludGYoc3RkZXJyLCAiUHJveHkgcmlnaHRzIGNoZWNrIHdpdGggY29uZGl0aW9uICclcycgcHJvdmVkIHZhbGlkXG4iLAorCQkJCQljYl9hcmctPnByb3h5X2NvbmQpOworCQkJfQorCQl9CisJcmV0dXJuKG9rKTsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19SU0EKK3N0YXRpYyBSU0EgKnJzYV90bXA9TlVMTDsKKworc3RhdGljIFJTQSBNU19DQUxMQkFDSyAqdG1wX3JzYV9jYihTU0wgKnMsIGludCBpc19leHBvcnQsIGludCBrZXlsZW5ndGgpCisJeworCUJJR05VTSAqYm4gPSBOVUxMOworCWlmIChyc2FfdG1wID09IE5VTEwpCisJCXsKKwkJYm4gPSBCTl9uZXcoKTsKKwkJcnNhX3RtcCA9IFJTQV9uZXcoKTsKKwkJaWYoIWJuIHx8ICFyc2FfdG1wIHx8ICFCTl9zZXRfd29yZChibiwgUlNBX0Y0KSkKKwkJCXsKKwkJCUJJT19wcmludGYoYmlvX2VyciwgIk1lbW9yeSBlcnJvci4uLiIpOworCQkJZ290byBlbmQ7CisJCQl9CisJCUJJT19wcmludGYoYmlvX2VyciwiR2VuZXJhdGluZyB0ZW1wICglZCBiaXQpIFJTQSBrZXkuLi4iLGtleWxlbmd0aCk7CisJCSh2b2lkKUJJT19mbHVzaChiaW9fZXJyKTsKKwkJaWYoIVJTQV9nZW5lcmF0ZV9rZXlfZXgocnNhX3RtcCxrZXlsZW5ndGgsYm4sTlVMTCkpCisJCQl7CisJCQlCSU9fcHJpbnRmKGJpb19lcnIsICJFcnJvciBnZW5lcmF0aW5nIGtleS4iKTsKKwkJCVJTQV9mcmVlKHJzYV90bXApOworCQkJcnNhX3RtcCA9IE5VTEw7CisJCQl9CitlbmQ6CisJCUJJT19wcmludGYoYmlvX2VyciwiXG4iKTsKKwkJKHZvaWQpQklPX2ZsdXNoKGJpb19lcnIpOworCQl9CisJaWYoYm4pIEJOX2ZyZWUoYm4pOworCXJldHVybihyc2FfdG1wKTsKKwl9CisKK3N0YXRpYyB2b2lkIGZyZWVfdG1wX3JzYSh2b2lkKQorCXsKKwlpZiAocnNhX3RtcCAhPSBOVUxMKQorCQl7CisJCVJTQV9mcmVlKHJzYV90bXApOworCQlyc2FfdG1wID0gTlVMTDsKKwkJfQorCX0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fREgKKy8qIFRoZXNlIERIIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgorICogICAgJCBvcGVuc3NsIGRocGFyYW0gLUMgLW5vb3V0IDUxMgorICogICAgJCBvcGVuc3NsIGRocGFyYW0gLUMgLW5vb3V0IDEwMjQKKyAqICAgICQgb3BlbnNzbCBkaHBhcmFtIC1DIC1ub291dCAtZHNhcGFyYW0gMTAyNAorICogKFRoZSB0aGlyZCBmdW5jdGlvbiBoYXMgYmVlbiByZW5hbWVkIHRvIGF2b2lkIG5hbWUgY29uZmxpY3RzLikKKyAqLworc3RhdGljIERIICpnZXRfZGg1MTIoKQorCXsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBkaDUxMl9wW109eworCQkweENCLDB4QzgsMHhFMSwweDg2LDB4RDAsMHgxRiwweDk0LDB4MTcsMHhBNiwweDk5LDB4RjAsMHhDNiwKKwkJMHgxRiwweDBELDB4QUMsMHhCNiwweDI1LDB4M0UsMHgwNiwweDM5LDB4Q0EsMHg3MiwweDA0LDB4QjAsCisJCTB4NkUsMHhEQSwweEMwLDB4NjEsMHhFNiwweDdBLDB4NzcsMHgyNSwweEU4LDB4M0IsMHhCOSwweDVGLAorCQkweDlBLDB4QjYsMHhCNSwweEZFLDB4OTksMHgwQiwweEExLDB4OTMsMHg0RSwweDM1LDB4MzMsMHhCOCwKKwkJMHhFMSwweEYxLDB4MTMsMHg0RiwweDU5LDB4MUEsMHhEMiwweDU3LDB4QzAsMHgyNiwweDIxLDB4MzMsCisJCTB4MDIsMHhDNSwweEFFLDB4MjMsCisJCX07CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgZGg1MTJfZ1tdPXsKKwkJMHgwMiwKKwkJfTsKKwlESCAqZGg7CisKKwlpZiAoKGRoPURIX25ldygpKSA9PSBOVUxMKSByZXR1cm4oTlVMTCk7CisJZGgtPnA9Qk5fYmluMmJuKGRoNTEyX3Asc2l6ZW9mKGRoNTEyX3ApLE5VTEwpOworCWRoLT5nPUJOX2JpbjJibihkaDUxMl9nLHNpemVvZihkaDUxMl9nKSxOVUxMKTsKKwlpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKKwkJeyBESF9mcmVlKGRoKTsgcmV0dXJuKE5VTEwpOyB9CisJcmV0dXJuKGRoKTsKKwl9CisKK3N0YXRpYyBESCAqZ2V0X2RoMTAyNCgpCisJeworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMTAyNF9wW109eworCQkweEY4LDB4ODEsMHg4OSwweDdELDB4MTQsMHgyNCwweEM1LDB4RDEsMHhFNiwweEY3LDB4QkYsMHgzQSwKKwkJMHhFNCwweDkwLDB4RjQsMHhGQywweDczLDB4RkIsMHgzNCwweEI1LDB4RkEsMHg0QywweDU2LDB4QTIsCisJCTB4RUEsMHhBNywweEU5LDB4QzAsMHhDMCwweENFLDB4ODksMHhFMSwweEZBLDB4NjMsMHgzRiwweEIwLAorCQkweDZCLDB4MzIsMHg2NiwweEYxLDB4RDEsMHg3QiwweEIwLDB4MDAsMHg4RiwweENBLDB4ODcsMHhDMiwKKwkJMHhBRSwweDk4LDB4ODksMHgyNiwweDE3LDB4QzIsMHgwNSwweEQyLDB4RUMsMHgwOCwweEQwLDB4OEMsCisJCTB4RkYsMHgxNywweDUyLDB4OEMsMHhDNSwweDA3LDB4OTMsMHgwMywweEIxLDB4RjYsMHgyRiwweEI4LAorCQkweDFDLDB4NTIsMHg0NywweDI3LDB4MUIsMHhEQiwweEQxLDB4OEQsMHg5RCwweDY5LDB4MUQsMHg1MiwKKwkJMHg0QiwweDMyLDB4ODEsMHhBQSwweDdGLDB4MDAsMHhDOCwweERDLDB4RTYsMHhEOSwweENDLDB4QzEsCisJCTB4MTEsMHgyRCwweDM3LDB4MzQsMHg2QywweEVBLDB4MDIsMHg5NywweDRCLDB4MEUsMHhCQiwweEIxLAorCQkweDcxLDB4MzMsMHgwOSwweDE1LDB4RkQsMHhERCwweDIzLDB4ODcsMHgwNywweDVFLDB4ODksMHhBQiwKKwkJMHg2QiwweDdDLDB4NUYsMHhFQywweEE2LDB4MjQsMHhEQywweDUzLAorCQl9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMTAyNF9nW109eworCQkweDAyLAorCQl9OworCURIICpkaDsKKworCWlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlkaC0+cD1CTl9iaW4yYm4oZGgxMDI0X3Asc2l6ZW9mKGRoMTAyNF9wKSxOVUxMKTsKKwlkaC0+Zz1CTl9iaW4yYm4oZGgxMDI0X2csc2l6ZW9mKGRoMTAyNF9nKSxOVUxMKTsKKwlpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKKwkJeyBESF9mcmVlKGRoKTsgcmV0dXJuKE5VTEwpOyB9CisJcmV0dXJuKGRoKTsKKwl9CisKK3N0YXRpYyBESCAqZ2V0X2RoMTAyNGRzYSgpCisJeworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMTAyNF9wW109eworCQkweEM4LDB4MDAsMHhGNywweDA4LDB4MDcsMHg4OSwweDRELDB4OTAsMHg1MywweEYzLDB4RDUsMHgwMCwKKwkJMHgyMSwweDFCLDB4RjcsMHgzMSwweEE2LDB4QTIsMHhEQSwweDIzLDB4OUEsMHhDNywweDg3LDB4MTksCisJCTB4M0IsMHg0NywweEI2LDB4OEMsMHgwNCwweDZGLDB4RkYsMHhDNiwweDlCLDB4QjgsMHg2NSwweEQyLAorCQkweEMyLDB4NUYsMHgzMSwweDgzLDB4NEEsMHhBNywweDVGLDB4MkYsMHg4OCwweDM4LDB4QjYsMHg1NSwKKwkJMHhDRiwweEQ5LDB4ODcsMHg2RCwweDZGLDB4OUYsMHhEQSwweEFDLDB4QTYsMHg0OCwweEFGLDB4RkMsCisJCTB4MzMsMHg4NCwweDM3LDB4NUIsMHg4MiwweDRBLDB4MzEsMHg1RCwweEU3LDB4QkQsMHg1MiwweDk3LAorCQkweEExLDB4NzcsMHhCRiwweDEwLDB4OUUsMHgzNywweEVBLDB4NjQsMHhGQSwweENBLDB4MjgsMHg4RCwKKwkJMHg5RCwweDNCLDB4RDIsMHg2RSwweDA5LDB4NUMsMHg2OCwweEM3LDB4NDUsMHg5MCwweEZELDB4QkIsCisJCTB4NzAsMHhDOSwweDNBLDB4QkIsMHhERiwweEQ0LDB4MjEsMHgwRiwweEM0LDB4NkEsMHgzQywweEY2LAorCQkweDYxLDB4Q0YsMHgzRiwweEQ2LDB4MTMsMHhGMSwweDVGLDB4QkMsMHhDRiwweEJDLDB4MjYsMHg5RSwKKwkJMHhCQywweDBCLDB4QkQsMHhBQiwweDVELDB4QzksMHg1NCwweDM5LAorCQl9OworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGRoMTAyNF9nW109eworCQkweDNCLDB4NDAsMHg4NiwweEU3LDB4RjMsMHg2QywweERFLDB4NjcsMHgxQywweENDLDB4ODAsMHgwNSwKKwkJMHg1QSwweERGLDB4RkUsMHhCRCwweDIwLDB4MjcsMHg3NCwweDZDLDB4MjQsMHhDOSwweDAzLDB4RjMsCisJCTB4RTEsMHg4RCwweEMzLDB4N0QsMHg5OCwweDI3LDB4NDAsMHgwOCwweEI4LDB4OEMsMHg2QSwweEU5LAorCQkweEJCLDB4MUEsMHgzQSwweEQ2LDB4ODYsMHg4MywweDVFLDB4NzIsMHg0MSwweENFLDB4ODUsMHgzQywKKwkJMHhEMiwweEIzLDB4RkMsMHgxMywweENFLDB4MzcsMHg4MSwweDlFLDB4NEMsMHgxQywweDdCLDB4NjUsCisJCTB4RDMsMHhFNiwweEE2LDB4MDAsMHhGNSwweDVBLDB4OTUsMHg0MywweDVFLDB4ODEsMHhDRiwweDYwLAorCQkweEEyLDB4MjMsMHhGQywweDM2LDB4QTcsMHg1RCwweDdBLDB4NEMsMHgwNiwweDkxLDB4NkUsMHhGNiwKKwkJMHg1NywweEVFLDB4MzYsMHhDQiwweDA2LDB4RUEsMHhGNSwweDNELDB4OTUsMHg0OSwweENCLDB4QTcsCisJCTB4REQsMHg4MSwweERGLDB4ODAsMHgwOSwweDRBLDB4OTcsMHg0RCwweEE4LDB4MjIsMHg3MiwweEExLAorCQkweDdGLDB4QzQsMHg3MCwweDU2LDB4NzAsMHhFOCwweDIwLDB4MTAsMHgxOCwweDhGLDB4MkUsMHg2MCwKKwkJMHgwNywweEU3LDB4NjgsMHgxQSwweDgyLDB4NUQsMHgzMiwweEEyLAorCQl9OworCURIICpkaDsKKworCWlmICgoZGg9REhfbmV3KCkpID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlkaC0+cD1CTl9iaW4yYm4oZGgxMDI0X3Asc2l6ZW9mKGRoMTAyNF9wKSxOVUxMKTsKKwlkaC0+Zz1CTl9iaW4yYm4oZGgxMDI0X2csc2l6ZW9mKGRoMTAyNF9nKSxOVUxMKTsKKwlpZiAoKGRoLT5wID09IE5VTEwpIHx8IChkaC0+ZyA9PSBOVUxMKSkKKwkJeyBESF9mcmVlKGRoKTsgcmV0dXJuKE5VTEwpOyB9CisJZGgtPmxlbmd0aCA9IDE2MDsKKwlyZXR1cm4oZGgpOworCX0KKyNlbmRpZgorCisjaWZuZGVmIE9QRU5TU0xfTk9fUFNLCisvKiBjb252ZXJ0IHRoZSBQU0sga2V5IChwc2tfa2V5KSBpbiBhc2NpaSB0byBiaW5hcnkgKHBzaykgKi8KK3N0YXRpYyBpbnQgcHNrX2tleTJibihjb25zdCBjaGFyICpwc2trZXksIHVuc2lnbmVkIGNoYXIgKnBzaywKKwl1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pCisJeworCWludCByZXQ7CisJQklHTlVNICpibiA9IE5VTEw7CisKKwlyZXQgPSBCTl9oZXgyYm4oJmJuLCBwc2trZXkpOworCWlmICghcmV0KQorCQl7CisJCUJJT19wcmludGYoYmlvX2VyciwiQ291bGQgbm90IGNvbnZlcnQgUFNLIGtleSAnJXMnIHRvIEJJR05VTVxuIiwgcHNra2V5KTsgCisJCWlmIChibikKKwkJCUJOX2ZyZWUoYm4pOworCQlyZXR1cm4gMDsKKwkJfQorCWlmIChCTl9udW1fYnl0ZXMoYm4pID4gKGludCltYXhfcHNrX2xlbikKKwkJeworCQlCSU9fcHJpbnRmKGJpb19lcnIsInBzayBidWZmZXIgb2YgY2FsbGJhY2sgaXMgdG9vIHNtYWxsICglZCkgZm9yIGtleSAoJWQpXG4iLAorCQkJbWF4X3Bza19sZW4sIEJOX251bV9ieXRlcyhibikpOworCQlCTl9mcmVlKGJuKTsKKwkJcmV0dXJuIDA7CisJCX0KKwlyZXQgPSBCTl9ibjJiaW4oYm4sIHBzayk7CisJQk5fZnJlZShibik7CisJcmV0dXJuIHJldDsKKwl9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHNrX2NsaWVudF9jYWxsYmFjayhTU0wgKnNzbCwgY29uc3QgY2hhciAqaGludCwgY2hhciAqaWRlbnRpdHksCisJdW5zaWduZWQgaW50IG1heF9pZGVudGl0eV9sZW4sIHVuc2lnbmVkIGNoYXIgKnBzaywKKwl1bnNpZ25lZCBpbnQgbWF4X3Bza19sZW4pCisJeworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHBza19sZW4gPSAwOworCisJcmV0ID0gQklPX3NucHJpbnRmKGlkZW50aXR5LCBtYXhfaWRlbnRpdHlfbGVuLCAiQ2xpZW50X2lkZW50aXR5Iik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2VycjsKKwlpZiAoZGVidWcpCisJCWZwcmludGYoc3RkZXJyLCAiY2xpZW50OiBjcmVhdGVkIGlkZW50aXR5ICclcycgbGVuPSVkXG4iLCBpZGVudGl0eSwgcmV0KTsKKwlyZXQgPSBwc2tfa2V5MmJuKHBza19rZXksIHBzaywgbWF4X3Bza19sZW4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9lcnI7CisJcHNrX2xlbiA9IHJldDsKK291dF9lcnI6CisJcmV0dXJuIHBza19sZW47CisJfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBza19zZXJ2ZXJfY2FsbGJhY2soU1NMICpzc2wsIGNvbnN0IGNoYXIgKmlkZW50aXR5LAorCXVuc2lnbmVkIGNoYXIgKnBzaywgdW5zaWduZWQgaW50IG1heF9wc2tfbGVuKQorCXsKKwl1bnNpZ25lZCBpbnQgcHNrX2xlbj0wOworCisJaWYgKHN0cmNtcChpZGVudGl0eSwgIkNsaWVudF9pZGVudGl0eSIpICE9IDApCisJCXsKKwkJQklPX3ByaW50ZihiaW9fZXJyLCAic2VydmVyOiBQU0sgZXJyb3I6IGNsaWVudCBpZGVudGl0eSBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwkJfQorCXBza19sZW49cHNrX2tleTJibihwc2tfa2V5LCBwc2ssIG1heF9wc2tfbGVuKTsKKwlyZXR1cm4gcHNrX2xlbjsKKwl9CisjZW5kaWYKKworc3RhdGljIGludCBkb190ZXN0X2NpcGhlcmxpc3Qodm9pZCkKKwl7CisJaW50IGkgPSAwOworCWNvbnN0IFNTTF9NRVRIT0QgKm1ldGg7CisJY29uc3QgU1NMX0NJUEhFUiAqY2ksICp0Y2kgPSBOVUxMOworCisjaWZuZGVmIE9QRU5TU0xfTk9fU1NMMgorCWZwcmludGYoc3RkZXJyLCAidGVzdGluZyBTU0x2MiBjaXBoZXIgbGlzdCBvcmRlcjogIik7CisJbWV0aCA9IFNTTHYyX21ldGhvZCgpOworCXdoaWxlICgoY2kgPSBtZXRoLT5nZXRfY2lwaGVyKGkrKykpICE9IE5VTEwpCisJCXsKKwkJaWYgKHRjaSAhPSBOVUxMKQorCQkJaWYgKGNpLT5pZCA+PSB0Y2ktPmlkKQorCQkJCXsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCAlbHggdnMuICVseFxuIiwgY2ktPmlkLCB0Y2ktPmlkKTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCXRjaSA9IGNpOworCQl9CisJZnByaW50ZihzdGRlcnIsICJva1xuIik7CisjZW5kaWYKKyNpZm5kZWYgT1BFTlNTTF9OT19TU0wzCisJZnByaW50ZihzdGRlcnIsICJ0ZXN0aW5nIFNTTHYzIGNpcGhlciBsaXN0IG9yZGVyOiAiKTsKKwltZXRoID0gU1NMdjNfbWV0aG9kKCk7CisJdGNpID0gTlVMTDsKKwl3aGlsZSAoKGNpID0gbWV0aC0+Z2V0X2NpcGhlcihpKyspKSAhPSBOVUxMKQorCQl7CisJCWlmICh0Y2kgIT0gTlVMTCkKKwkJCWlmIChjaS0+aWQgPj0gdGNpLT5pZCkKKwkJCQl7CisJCQkJZnByaW50ZihzdGRlcnIsICJmYWlsZWQgJWx4IHZzLiAlbHhcbiIsIGNpLT5pZCwgdGNpLT5pZCk7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQl0Y2kgPSBjaTsKKwkJfQorCWZwcmludGYoc3RkZXJyLCAib2tcbiIpOworI2VuZGlmCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTMQorCWZwcmludGYoc3RkZXJyLCAidGVzdGluZyBUTFN2MSBjaXBoZXIgbGlzdCBvcmRlcjogIik7CisJbWV0aCA9IFRMU3YxX21ldGhvZCgpOworCXRjaSA9IE5VTEw7CisJd2hpbGUgKChjaSA9IG1ldGgtPmdldF9jaXBoZXIoaSsrKSkgIT0gTlVMTCkKKwkJeworCQlpZiAodGNpICE9IE5VTEwpCisJCQlpZiAoY2ktPmlkID49IHRjaS0+aWQpCisJCQkJeworCQkJCWZwcmludGYoc3RkZXJyLCAiZmFpbGVkICVseCB2cy4gJWx4XG4iLCBjaS0+aWQsIHRjaS0+aWQpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJdGNpID0gY2k7CisJCX0KKwlmcHJpbnRmKHN0ZGVyciwgIm9rXG4iKTsKKyNlbmRpZgorCisJcmV0dXJuIDE7CisJfQpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3QxX2NsbnQuYyBiL2xpYi9vcGVuc3NsL3NzbC90MV9jbG50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3YWYxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC90MV9jbG50LmMKQEAgLTAsMCArMSw3OSBAQAorLyogc3NsL3QxX2NsbnQuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2luY2x1ZGUgPG9wZW5zc2wvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KKworc3RhdGljIGNvbnN0IFNTTF9NRVRIT0QgKnRsczFfZ2V0X2NsaWVudF9tZXRob2QoaW50IHZlcik7CitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqdGxzMV9nZXRfY2xpZW50X21ldGhvZChpbnQgdmVyKQorCXsKKwlpZiAodmVyID09IFRMUzFfVkVSU0lPTikKKwkJcmV0dXJuKFRMU3YxX2NsaWVudF9tZXRob2QoKSk7CisJZWxzZQorCQlyZXR1cm4oTlVMTCk7CisJfQorCitJTVBMRU1FTlRfdGxzMV9tZXRoX2Z1bmMoVExTdjFfY2xpZW50X21ldGhvZCwKKwkJCXNzbF91bmRlZmluZWRfZnVuY3Rpb24sCisJCQlzc2wzX2Nvbm5lY3QsCisJCQl0bHMxX2dldF9jbGllbnRfbWV0aG9kKQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvdDFfZW5jLmMgYi9saWIvb3BlbnNzbC9zc2wvdDFfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxOTU0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC90MV9lbmMuYwpAQCAtMCwwICsxLDEwNTEgQEAKKy8qIHNzbC90MV9lbmMuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDUgTm9raWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIHBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGlzIGRldmVsb3BlZCBieQorICogTm9raWEgQ29ycG9yYXRpb24gYW5kIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlLgorICoKKyAqIFRoZSBDb250cmlidXRpb24sIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZgorICogTm9raWEgQ29ycG9yYXRpb24sIGNvbnNpc3RzIG9mIHRoZSAiUFNLIiAoUHJlLVNoYXJlZCBLZXkpIGNpcGhlcnN1aXRlcworICogc3VwcG9ydCAoc2VlIFJGQyA0Mjc5KSB0byBPcGVuU1NMLgorICoKKyAqIE5vIHBhdGVudCBsaWNlbnNlcyBvciBvdGhlciByaWdodHMgZXhjZXB0IHRob3NlIGV4cHJlc3NseSBzdGF0ZWQgaW4KKyAqIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlIGxpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIGdyYW50ZWQgb3IgcmVjZWl2ZWQKKyAqIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsLCBvciBvdGhlcndpc2UuCisgKgorICogTm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgTm9raWEgdGhhdCB0aGUgQ29udHJpYnV0aW9uIGRvZXMgbm90CisgKiBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IHRoaXJkCisgKiBwYXJ0eSBvciB0aGF0IHRoZSBsaWNlbnNlIHByb3ZpZGVzIHlvdSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHJpZ2h0cworICogdG8gbWFrZSB1c2Ugb2YgdGhlIENvbnRyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELiBJTgorICogQURESVRJT04gVE8gVEhFIERJU0NMQUlNRVJTIElOQ0xVREVEIElOIFRIRSBMSUNFTlNFLCBOT0tJQQorICogU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIEZPUiBDTEFJTVMgQlJPVUdIVCBCWSBZT1UgT1IgQU5ZCisgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKKyAqIE9USEVSV0lTRS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzc2xfbG9jbC5oIgorI2lmbmRlZiBPUEVOU1NMX05PX0NPTVAKKyNpbmNsdWRlIDxvcGVuc3NsL2NvbXAuaD4KKyNlbmRpZgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KKyNpZmRlZiBLU1NMX0RFQlVHCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKyNlbmRpZgorCisvKiBzZWVkMSB0aHJvdWdoIHNlZWQ1IGFyZSB2aXJ0dWFsbHkgY29uY2F0ZW5hdGVkICovCitzdGF0aWMgaW50IHRsczFfUF9oYXNoKGNvbnN0IEVWUF9NRCAqbWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYywKKwkJCWludCBzZWNfbGVuLAorCQkJY29uc3Qgdm9pZCAqc2VlZDEsIGludCBzZWVkMV9sZW4sCisJCQljb25zdCB2b2lkICpzZWVkMiwgaW50IHNlZWQyX2xlbiwKKwkJCWNvbnN0IHZvaWQgKnNlZWQzLCBpbnQgc2VlZDNfbGVuLAorCQkJY29uc3Qgdm9pZCAqc2VlZDQsIGludCBzZWVkNF9sZW4sCisJCQljb25zdCB2b2lkICpzZWVkNSwgaW50IHNlZWQ1X2xlbiwKKwkJCXVuc2lnbmVkIGNoYXIgKm91dCwgaW50IG9sZW4pCisJeworCWludCBjaHVuayxuOworCXVuc2lnbmVkIGludCBqOworCUhNQUNfQ1RYIGN0eDsKKwlITUFDX0NUWCBjdHhfdG1wOworCXVuc2lnbmVkIGNoYXIgQTFbRVZQX01BWF9NRF9TSVpFXTsKKwl1bnNpZ25lZCBpbnQgQTFfbGVuOworCWludCByZXQgPSAwOworCQorCWNodW5rPUVWUF9NRF9zaXplKG1kKTsKKwlPUEVOU1NMX2Fzc2VydChjaHVuayA+PSAwKTsKKworCUhNQUNfQ1RYX2luaXQoJmN0eCk7CisJSE1BQ19DVFhfaW5pdCgmY3R4X3RtcCk7CisJaWYgKCFITUFDX0luaXRfZXgoJmN0eCxzZWMsc2VjX2xlbixtZCwgTlVMTCkpCisJCWdvdG8gZXJyOworCWlmICghSE1BQ19Jbml0X2V4KCZjdHhfdG1wLHNlYyxzZWNfbGVuLG1kLCBOVUxMKSkKKwkJZ290byBlcnI7CisJaWYgKHNlZWQxICE9IE5VTEwgJiYgIUhNQUNfVXBkYXRlKCZjdHgsc2VlZDEsc2VlZDFfbGVuKSkKKwkJZ290byBlcnI7CisJaWYgKHNlZWQyICE9IE5VTEwgJiYgIUhNQUNfVXBkYXRlKCZjdHgsc2VlZDIsc2VlZDJfbGVuKSkKKwkJZ290byBlcnI7CisJaWYgKHNlZWQzICE9IE5VTEwgJiYgIUhNQUNfVXBkYXRlKCZjdHgsc2VlZDMsc2VlZDNfbGVuKSkKKwkJZ290byBlcnI7CisJaWYgKHNlZWQ0ICE9IE5VTEwgJiYgIUhNQUNfVXBkYXRlKCZjdHgsc2VlZDQsc2VlZDRfbGVuKSkKKwkJZ290byBlcnI7CisJaWYgKHNlZWQ1ICE9IE5VTEwgJiYgIUhNQUNfVXBkYXRlKCZjdHgsc2VlZDUsc2VlZDVfbGVuKSkKKwkJZ290byBlcnI7CisJaWYgKCFITUFDX0ZpbmFsKCZjdHgsQTEsJkExX2xlbikpCisJCWdvdG8gZXJyOworCisJbj0wOworCWZvciAoOzspCisJCXsKKwkJaWYgKCFITUFDX0luaXRfZXgoJmN0eCxOVUxMLDAsTlVMTCxOVUxMKSkgLyogcmUtaW5pdCAqLworCQkJZ290byBlcnI7CisJCWlmICghSE1BQ19Jbml0X2V4KCZjdHhfdG1wLE5VTEwsMCxOVUxMLE5VTEwpKSAvKiByZS1pbml0ICovCisJCQlnb3RvIGVycjsKKwkJaWYgKCFITUFDX1VwZGF0ZSgmY3R4LEExLEExX2xlbikpCisJCQlnb3RvIGVycjsKKwkJaWYgKCFITUFDX1VwZGF0ZSgmY3R4X3RtcCxBMSxBMV9sZW4pKQorCQkJZ290byBlcnI7CisJCWlmIChzZWVkMSAhPSBOVUxMICYmICFITUFDX1VwZGF0ZSgmY3R4LHNlZWQxLHNlZWQxX2xlbikpCisJCQlnb3RvIGVycjsKKwkJaWYgKHNlZWQyICE9IE5VTEwgJiYgIUhNQUNfVXBkYXRlKCZjdHgsc2VlZDIsc2VlZDJfbGVuKSkKKwkJCWdvdG8gZXJyOworCQlpZiAoc2VlZDMgIT0gTlVMTCAmJiAhSE1BQ19VcGRhdGUoJmN0eCxzZWVkMyxzZWVkM19sZW4pKQorCQkJZ290byBlcnI7CisJCWlmIChzZWVkNCAhPSBOVUxMICYmICFITUFDX1VwZGF0ZSgmY3R4LHNlZWQ0LHNlZWQ0X2xlbikpCisJCQlnb3RvIGVycjsKKwkJaWYgKHNlZWQ1ICE9IE5VTEwgJiYgIUhNQUNfVXBkYXRlKCZjdHgsc2VlZDUsc2VlZDVfbGVuKSkKKwkJCWdvdG8gZXJyOworCisJCWlmIChvbGVuID4gY2h1bmspCisJCQl7CisJCQlpZiAoIUhNQUNfRmluYWwoJmN0eCxvdXQsJmopKQorCQkJCWdvdG8gZXJyOworCQkJb3V0Kz1qOworCQkJb2xlbi09ajsKKwkJCWlmICghSE1BQ19GaW5hbCgmY3R4X3RtcCxBMSwmQTFfbGVuKSkgLyogY2FsYyB0aGUgbmV4dCBBMSB2YWx1ZSAqLworCQkJCWdvdG8gZXJyOworCQkJfQorCQllbHNlCS8qIGxhc3Qgb25lICovCisJCQl7CisJCQlpZiAoIUhNQUNfRmluYWwoJmN0eCxBMSwmQTFfbGVuKSkKKwkJCQlnb3RvIGVycjsKKwkJCW1lbWNweShvdXQsQTEsb2xlbik7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCXJldCA9IDE7CitlcnI6CisJSE1BQ19DVFhfY2xlYW51cCgmY3R4KTsKKwlITUFDX0NUWF9jbGVhbnVwKCZjdHhfdG1wKTsKKwlPUEVOU1NMX2NsZWFuc2UoQTEsc2l6ZW9mKEExKSk7CisJcmV0dXJuIHJldDsKKwl9CisKKy8qIHNlZWQxIHRocm91Z2ggc2VlZDUgYXJlIHZpcnR1YWxseSBjb25jYXRlbmF0ZWQgKi8KK3N0YXRpYyBpbnQgdGxzMV9QUkYobG9uZyBkaWdlc3RfbWFzaywKKwkJICAgICBjb25zdCB2b2lkICpzZWVkMSwgaW50IHNlZWQxX2xlbiwKKwkJICAgICBjb25zdCB2b2lkICpzZWVkMiwgaW50IHNlZWQyX2xlbiwKKwkJICAgICBjb25zdCB2b2lkICpzZWVkMywgaW50IHNlZWQzX2xlbiwKKwkJICAgICBjb25zdCB2b2lkICpzZWVkNCwgaW50IHNlZWQ0X2xlbiwKKwkJICAgICBjb25zdCB2b2lkICpzZWVkNSwgaW50IHNlZWQ1X2xlbiwKKwkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzZWMsIGludCBzbGVuLAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKm91dDEsCisJCSAgICAgdW5zaWduZWQgY2hhciAqb3V0MiwgaW50IG9sZW4pCisJeworCWludCBsZW4saSxpZHgsY291bnQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqUzE7CisJbG9uZyBtOworCWNvbnN0IEVWUF9NRCAqbWQ7CisJaW50IHJldCA9IDA7CisKKwkvKiBDb3VudCBudW1iZXIgb2YgZGlnZXN0cyBhbmQgcGFydGl0aW9uIHNlYyBldmVubHkgKi8KKwljb3VudD0wOworCWZvciAoaWR4PTA7c3NsX2dldF9oYW5kc2hha2VfZGlnZXN0KGlkeCwmbSwmbWQpO2lkeCsrKSB7CisJCWlmICgobTw8VExTMV9QUkZfREdTVF9TSElGVCkgJiBkaWdlc3RfbWFzaykgY291bnQrKzsKKwl9CQorCWxlbj1zbGVuL2NvdW50OworCVMxPXNlYzsKKwltZW1zZXQob3V0MSwwLG9sZW4pOworCWZvciAoaWR4PTA7c3NsX2dldF9oYW5kc2hha2VfZGlnZXN0KGlkeCwmbSwmbWQpO2lkeCsrKSB7CisJCWlmICgobTw8VExTMV9QUkZfREdTVF9TSElGVCkgJiBkaWdlc3RfbWFzaykgeworCQkJaWYgKCFtZCkgeworCQkJCVNTTGVycihTU0xfRl9UTFMxX1BSRiwKKwkJCQlTU0xfUl9VTlNVUFBPUlRFRF9ESUdFU1RfVFlQRSk7CisJCQkJZ290byBlcnI7CQkJCQorCQkJfQorCQkJaWYgKCF0bHMxX1BfaGFzaChtZCAsUzEsbGVuKyhzbGVuJjEpLAorCQkJCQlzZWVkMSxzZWVkMV9sZW4sc2VlZDIsc2VlZDJfbGVuLHNlZWQzLHNlZWQzX2xlbixzZWVkNCxzZWVkNF9sZW4sc2VlZDUsc2VlZDVfbGVuLAorCQkJCQlvdXQyLG9sZW4pKQorCQkJCWdvdG8gZXJyOworCQkJUzErPWxlbjsKKwkJCWZvciAoaT0wOyBpPG9sZW47IGkrKykKKwkJCXsKKwkJCQlvdXQxW2ldXj1vdXQyW2ldOworCQkJfQorCQl9CisJfQorCXJldCA9IDE7CitlcnI6CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBpbnQgdGxzMV9nZW5lcmF0ZV9rZXlfYmxvY2soU1NMICpzLCB1bnNpZ25lZCBjaGFyICprbSwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKnRtcCwgaW50IG51bSkKKwl7CisJaW50IHJldDsKKwlyZXQgPSB0bHMxX1BSRihzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobTIsCisJCSBUTFNfTURfS0VZX0VYUEFOU0lPTl9DT05TVCxUTFNfTURfS0VZX0VYUEFOU0lPTl9DT05TVF9TSVpFLAorCQkgcy0+czMtPnNlcnZlcl9yYW5kb20sU1NMM19SQU5ET01fU0laRSwKKwkJIHMtPnMzLT5jbGllbnRfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUsCisJCSBOVUxMLDAsTlVMTCwwLAorCQkgcy0+c2Vzc2lvbi0+bWFzdGVyX2tleSxzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5X2xlbmd0aCwKKwkJIGttLHRtcCxudW0pOworI2lmZGVmIEtTU0xfREVCVUcKKwlwcmludGYoInRsczFfZ2VuZXJhdGVfa2V5X2Jsb2NrKCkgPT0+ICVkIGJ5dGUgbWFzdGVyX2tleSA9XG5cdCIsCisgICAgICAgICAgICAgICAgcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGgpOworCXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaT0wOyBpIDwgcy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlMDJYIiwgcy0+c2Vzc2lvbi0+bWFzdGVyX2tleVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7ICB9CisjZW5kaWYgICAgLyogS1NTTF9ERUJVRyAqLworCXJldHVybiByZXQ7CisJfQorCitpbnQgdGxzMV9jaGFuZ2VfY2lwaGVyX3N0YXRlKFNTTCAqcywgaW50IHdoaWNoKQorCXsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBlbXB0eVtdPSIiOworCXVuc2lnbmVkIGNoYXIgKnAsKmtleV9ibG9jaywqbWFjX3NlY3JldDsKKwl1bnNpZ25lZCBjaGFyICpleHBfbGFiZWw7CisJdW5zaWduZWQgY2hhciB0bXAxW0VWUF9NQVhfS0VZX0xFTkdUSF07CisJdW5zaWduZWQgY2hhciB0bXAyW0VWUF9NQVhfS0VZX0xFTkdUSF07CisJdW5zaWduZWQgY2hhciBpdjFbRVZQX01BWF9JVl9MRU5HVEgqMl07CisJdW5zaWduZWQgY2hhciBpdjJbRVZQX01BWF9JVl9MRU5HVEgqMl07CisJdW5zaWduZWQgY2hhciAqbXMsKmtleSwqaXYsKmVyMSwqZXIyOworCWludCBjbGllbnRfd3JpdGU7CisJRVZQX0NJUEhFUl9DVFggKmRkOworCWNvbnN0IEVWUF9DSVBIRVIgKmM7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCWNvbnN0IFNTTF9DT01QICpjb21wOworI2VuZGlmCisJY29uc3QgRVZQX01EICptOworCWludCBtYWNfdHlwZTsKKwlpbnQgKm1hY19zZWNyZXRfc2l6ZTsKKwlFVlBfTURfQ1RYICptYWNfY3R4OworCUVWUF9QS0VZICptYWNfa2V5OworCWludCBpc19leHBvcnQsbixpLGosayxleHBfbGFiZWxfbGVuLGNsOworCWludCByZXVzZV9kZCA9IDA7CisKKwlpc19leHBvcnQ9U1NMX0NfSVNfRVhQT1JUKHMtPnMzLT50bXAubmV3X2NpcGhlcik7CisJYz1zLT5zMy0+dG1wLm5ld19zeW1fZW5jOworCW09cy0+czMtPnRtcC5uZXdfaGFzaDsKKwltYWNfdHlwZSA9IHMtPnMzLT50bXAubmV3X21hY19wa2V5X3R5cGU7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCWNvbXA9cy0+czMtPnRtcC5uZXdfY29tcHJlc3Npb247CisjZW5kaWYKKwlrZXlfYmxvY2s9cy0+czMtPnRtcC5rZXlfYmxvY2s7CisKKyNpZmRlZiBLU1NMX0RFQlVHCisJcHJpbnRmKCJ0bHMxX2NoYW5nZV9jaXBoZXJfc3RhdGUod2hpY2g9ICVkKSB3L1xuIiwgd2hpY2gpOworCXByaW50ZigiXHRhbGc9ICVsZC8lbGQsIGNvbXA9ICVwXG4iLAorCSAgICAgICBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5LAorCSAgICAgICBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoLAorCSAgICAgICBjb21wKTsKKwlwcmludGYoIlx0ZXZwX2NpcGhlciA9PSAlcCA9PT8gJmRfY2JjX2VkZV9jaXBoZXIzXG4iLCBjKTsKKwlwcmludGYoIlx0ZXZwX2NpcGhlcjogbmlkLCBibGtzej0gJWQsICVkLCBrZXlsZW49JWQsIGl2bGVuPSVkXG4iLAorICAgICAgICAgICAgICAgIGMtPm5pZCxjLT5ibG9ja19zaXplLGMtPmtleV9sZW4sYy0+aXZfbGVuKTsKKwlwcmludGYoIlx0a2V5X2Jsb2NrOiBsZW49ICVkLCBkYXRhPSAiLCBzLT5zMy0+dG1wLmtleV9ibG9ja19sZW5ndGgpOworCXsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaT0wOyBpPHMtPnMzLT50bXAua2V5X2Jsb2NrX2xlbmd0aDsgaSsrKQorCQlwcmludGYoIiUwMngiLCBrZXlfYmxvY2tbaV0pOyAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCisJaWYgKHdoaWNoICYgU1NMM19DQ19SRUFEKQorCQl7CisJCWlmIChzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobTIgJiBUTFMxX1NUUkVBTV9NQUMpCisJCQlzLT5tYWNfZmxhZ3MgfD0gU1NMX01BQ19GTEFHX1JFQURfTUFDX1NUUkVBTTsKKwkJCWVsc2UKKwkJCXMtPm1hY19mbGFncyAmPSB+U1NMX01BQ19GTEFHX1JFQURfTUFDX1NUUkVBTTsKKworCQlpZiAocy0+ZW5jX3JlYWRfY3R4ICE9IE5VTEwpCisJCQlyZXVzZV9kZCA9IDE7CisJCWVsc2UgaWYgKChzLT5lbmNfcmVhZF9jdHg9T1BFTlNTTF9tYWxsb2Moc2l6ZW9mKEVWUF9DSVBIRVJfQ1RYKSkpID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwkJZWxzZQorCQkJLyogbWFrZSBzdXJlIGl0J3MgaW50aWFsaXplZCBpbiBjYXNlIHdlIGV4aXQgbGF0ZXIgd2l0aCBhbiBlcnJvciAqLworCQkJRVZQX0NJUEhFUl9DVFhfaW5pdChzLT5lbmNfcmVhZF9jdHgpOworCQlkZD0gcy0+ZW5jX3JlYWRfY3R4OworCQltYWNfY3R4PXNzbF9yZXBsYWNlX2hhc2goJnMtPnJlYWRfaGFzaCxOVUxMKTsKKyNpZm5kZWYgT1BFTlNTTF9OT19DT01QCisJCWlmIChzLT5leHBhbmQgIT0gTlVMTCkKKwkJCXsKKwkJCUNPTVBfQ1RYX2ZyZWUocy0+ZXhwYW5kKTsKKwkJCXMtPmV4cGFuZD1OVUxMOworCQkJfQorCQlpZiAoY29tcCAhPSBOVUxMKQorCQkJeworCQkJcy0+ZXhwYW5kPUNPTVBfQ1RYX25ldyhjb21wLT5tZXRob2QpOworCQkJaWYgKHMtPmV4cGFuZCA9PSBOVUxMKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfVExTMV9DSEFOR0VfQ0lQSEVSX1NUQVRFLFNTTF9SX0NPTVBSRVNTSU9OX0xJQlJBUllfRVJST1IpOworCQkJCWdvdG8gZXJyMjsKKwkJCQl9CisJCQlpZiAocy0+czMtPnJyZWMuY29tcCA9PSBOVUxMKQorCQkJCXMtPnMzLT5ycmVjLmNvbXA9KHVuc2lnbmVkIGNoYXIgKikKKwkJCQkJT1BFTlNTTF9tYWxsb2MoU1NMM19SVF9NQVhfRU5DUllQVEVEX0xFTkdUSCk7CisJCQlpZiAocy0+czMtPnJyZWMuY29tcCA9PSBOVUxMKQorCQkJCWdvdG8gZXJyOworCQkJfQorI2VuZGlmCisJCS8qIHRoaXMgaXMgZG9uZSBieSBkdGxzMV9yZXNldF9zZXFfbnVtYmVycyBmb3IgRFRMUzFfVkVSU0lPTiAqLworIAkJaWYgKHMtPnZlcnNpb24gIT0gRFRMUzFfVkVSU0lPTikKKwkJCW1lbXNldCgmKHMtPnMzLT5yZWFkX3NlcXVlbmNlWzBdKSwwLDgpOworCQltYWNfc2VjcmV0PSAmKHMtPnMzLT5yZWFkX21hY19zZWNyZXRbMF0pOworCQltYWNfc2VjcmV0X3NpemU9JihzLT5zMy0+cmVhZF9tYWNfc2VjcmV0X3NpemUpOworCQl9CisJZWxzZQorCQl7CisJCWlmIChzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobTIgJiBUTFMxX1NUUkVBTV9NQUMpCisJCQlzLT5tYWNfZmxhZ3MgfD0gU1NMX01BQ19GTEFHX1dSSVRFX01BQ19TVFJFQU07CisJCQllbHNlCisJCQlzLT5tYWNfZmxhZ3MgJj0gflNTTF9NQUNfRkxBR19XUklURV9NQUNfU1RSRUFNOworCQlpZiAocy0+ZW5jX3dyaXRlX2N0eCAhPSBOVUxMKQorCQkJcmV1c2VfZGQgPSAxOworCQllbHNlIGlmICgocy0+ZW5jX3dyaXRlX2N0eD1PUEVOU1NMX21hbGxvYyhzaXplb2YoRVZQX0NJUEhFUl9DVFgpKSkgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQllbHNlCisJCQkvKiBtYWtlIHN1cmUgaXQncyBpbnRpYWxpemVkIGluIGNhc2Ugd2UgZXhpdCBsYXRlciB3aXRoIGFuIGVycm9yICovCisJCQlFVlBfQ0lQSEVSX0NUWF9pbml0KHMtPmVuY193cml0ZV9jdHgpOworCQlkZD0gcy0+ZW5jX3dyaXRlX2N0eDsKKwkJbWFjX2N0eCA9IHNzbF9yZXBsYWNlX2hhc2goJnMtPndyaXRlX2hhc2gsTlVMTCk7CisjaWZuZGVmIE9QRU5TU0xfTk9fQ09NUAorCQlpZiAocy0+Y29tcHJlc3MgIT0gTlVMTCkKKwkJCXsKKwkJCUNPTVBfQ1RYX2ZyZWUocy0+Y29tcHJlc3MpOworCQkJcy0+Y29tcHJlc3M9TlVMTDsKKwkJCX0KKwkJaWYgKGNvbXAgIT0gTlVMTCkKKwkJCXsKKwkJCXMtPmNvbXByZXNzPUNPTVBfQ1RYX25ldyhjb21wLT5tZXRob2QpOworCQkJaWYgKHMtPmNvbXByZXNzID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9UTFMxX0NIQU5HRV9DSVBIRVJfU1RBVEUsU1NMX1JfQ09NUFJFU1NJT05fTElCUkFSWV9FUlJPUik7CisJCQkJZ290byBlcnIyOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkvKiB0aGlzIGlzIGRvbmUgYnkgZHRsczFfcmVzZXRfc2VxX251bWJlcnMgZm9yIERUTFMxX1ZFUlNJT04gKi8KKyAJCWlmIChzLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04pCisJCQltZW1zZXQoJihzLT5zMy0+d3JpdGVfc2VxdWVuY2VbMF0pLDAsOCk7CisJCW1hY19zZWNyZXQ9ICYocy0+czMtPndyaXRlX21hY19zZWNyZXRbMF0pOworCQltYWNfc2VjcmV0X3NpemUgPSAmKHMtPnMzLT53cml0ZV9tYWNfc2VjcmV0X3NpemUpOworCQl9CisKKwlpZiAocmV1c2VfZGQpCisJCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoZGQpOworCisJcD1zLT5zMy0+dG1wLmtleV9ibG9jazsKKwlpPSptYWNfc2VjcmV0X3NpemU9cy0+czMtPnRtcC5uZXdfbWFjX3NlY3JldF9zaXplOworCisJY2w9RVZQX0NJUEhFUl9rZXlfbGVuZ3RoKGMpOworCWo9aXNfZXhwb3J0ID8gKGNsIDwgU1NMX0NfRVhQT1JUX0tFWUxFTkdUSChzLT5zMy0+dG1wLm5ld19jaXBoZXIpID8KKwkgICAgICAgICAgICAgICBjbCA6IFNTTF9DX0VYUE9SVF9LRVlMRU5HVEgocy0+czMtPnRtcC5uZXdfY2lwaGVyKSkgOiBjbDsKKwkvKiBXYXMgaj0oZXhwKT81OkVWUF9DSVBIRVJfa2V5X2xlbmd0aChjKTsgKi8KKwlrPUVWUF9DSVBIRVJfaXZfbGVuZ3RoKGMpOworCWVyMT0gJihzLT5zMy0+Y2xpZW50X3JhbmRvbVswXSk7CisJZXIyPSAmKHMtPnMzLT5zZXJ2ZXJfcmFuZG9tWzBdKTsKKwlpZiAoCSh3aGljaCA9PSBTU0wzX0NIQU5HRV9DSVBIRVJfQ0xJRU5UX1dSSVRFKSB8fAorCQkod2hpY2ggPT0gU1NMM19DSEFOR0VfQ0lQSEVSX1NFUlZFUl9SRUFEKSkKKwkJeworCQltcz0gICYocFsgMF0pOyBuPWkraTsKKwkJa2V5PSAmKHBbIG5dKTsgbis9aitqOworCQlpdj0gICYocFsgbl0pOyBuKz1rK2s7CisJCWV4cF9sYWJlbD0odW5zaWduZWQgY2hhciAqKVRMU19NRF9DTElFTlRfV1JJVEVfS0VZX0NPTlNUOworCQlleHBfbGFiZWxfbGVuPVRMU19NRF9DTElFTlRfV1JJVEVfS0VZX0NPTlNUX1NJWkU7CisJCWNsaWVudF93cml0ZT0xOworCQl9CisJZWxzZQorCQl7CisJCW49aTsKKwkJbXM9ICAmKHBbIG5dKTsgbis9aStqOworCQlrZXk9ICYocFsgbl0pOyBuKz1qK2s7CisJCWl2PSAgJihwWyBuXSk7IG4rPWs7CisJCWV4cF9sYWJlbD0odW5zaWduZWQgY2hhciAqKVRMU19NRF9TRVJWRVJfV1JJVEVfS0VZX0NPTlNUOworCQlleHBfbGFiZWxfbGVuPVRMU19NRF9TRVJWRVJfV1JJVEVfS0VZX0NPTlNUX1NJWkU7CisJCWNsaWVudF93cml0ZT0wOworCQl9CisKKwlpZiAobiA+IHMtPnMzLT50bXAua2V5X2Jsb2NrX2xlbmd0aCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfVExTMV9DSEFOR0VfQ0lQSEVSX1NUQVRFLEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJZ290byBlcnIyOworCQl9CisKKwltZW1jcHkobWFjX3NlY3JldCxtcyxpKTsKKwltYWNfa2V5ID0gRVZQX1BLRVlfbmV3X21hY19rZXkobWFjX3R5cGUsIE5VTEwsCisJCQltYWNfc2VjcmV0LCptYWNfc2VjcmV0X3NpemUpOworCUVWUF9EaWdlc3RTaWduSW5pdChtYWNfY3R4LE5VTEwsbSxOVUxMLG1hY19rZXkpOworCUVWUF9QS0VZX2ZyZWUobWFjX2tleSk7CisjaWZkZWYgVExTX0RFQlVHCitwcmludGYoIndoaWNoID0gJTA0WFxubWFjIGtleT0iLHdoaWNoKTsKK3sgaW50IHo7IGZvciAoej0wOyB6PGk7IHorKykgcHJpbnRmKCIlMDJYJWMiLG1zW3pdLCgoeisxKSUxNik/JyAnOidcbicpOyB9CisjZW5kaWYKKwlpZiAoaXNfZXhwb3J0KQorCQl7CisJCS8qIEluIGhlcmUgSSBzZXQgYm90aCB0aGUgcmVhZCBhbmQgd3JpdGUga2V5L2l2IHRvIHRoZQorCQkgKiBzYW1lIHZhbHVlIHNpbmNlIG9ubHkgdGhlIGNvcnJlY3Qgb25lIHdpbGwgYmUgdXNlZCA6LSkuCisJCSAqLworCQlpZiAoIXRsczFfUFJGKHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtMiwKKwkJCQlleHBfbGFiZWwsZXhwX2xhYmVsX2xlbiwKKwkJCQlzLT5zMy0+Y2xpZW50X3JhbmRvbSxTU0wzX1JBTkRPTV9TSVpFLAorCQkJCXMtPnMzLT5zZXJ2ZXJfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUsCisJCQkJTlVMTCwwLE5VTEwsMCwKKwkJCQlrZXksaix0bXAxLHRtcDIsRVZQX0NJUEhFUl9rZXlfbGVuZ3RoKGMpKSkKKwkJCWdvdG8gZXJyMjsKKwkJa2V5PXRtcDE7CisKKwkJaWYgKGsgPiAwKQorCQkJeworCQkJaWYgKCF0bHMxX1BSRihzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobTIsCisJCQkJCVRMU19NRF9JVl9CTE9DS19DT05TVCxUTFNfTURfSVZfQkxPQ0tfQ09OU1RfU0laRSwKKwkJCQkJcy0+czMtPmNsaWVudF9yYW5kb20sU1NMM19SQU5ET01fU0laRSwKKwkJCQkJcy0+czMtPnNlcnZlcl9yYW5kb20sU1NMM19SQU5ET01fU0laRSwKKwkJCQkJTlVMTCwwLE5VTEwsMCwKKwkJCQkJZW1wdHksMCxpdjEsaXYyLGsqMikpCisJCQkJZ290byBlcnIyOworCQkJaWYgKGNsaWVudF93cml0ZSkKKwkJCQlpdj1pdjE7CisJCQllbHNlCisJCQkJaXY9ICYoaXYxW2tdKTsKKwkJCX0KKwkJfQorCisJcy0+c2Vzc2lvbi0+a2V5X2FyZ19sZW5ndGg9MDsKKyNpZmRlZiBLU1NMX0RFQlVHCisJeworICAgICAgICBpbnQgaTsKKwlwcmludGYoIkVWUF9DaXBoZXJJbml0X2V4KGRkLGMsa2V5PSxpdj0sd2hpY2gpXG4iKTsKKwlwcmludGYoIlx0a2V5PSAiKTsgZm9yIChpPTA7IGk8Yy0+a2V5X2xlbjsgaSsrKSBwcmludGYoIiUwMngiLCBrZXlbaV0pOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoIlx0IGl2PSAiKTsgZm9yIChpPTA7IGk8Yy0+aXZfbGVuOyBpKyspIHByaW50ZigiJTAyeCIsIGl2W2ldKTsKKwlwcmludGYoIlxuIik7CisJfQorI2VuZGlmCS8qIEtTU0xfREVCVUcgKi8KKworCUVWUF9DaXBoZXJJbml0X2V4KGRkLGMsTlVMTCxrZXksaXYsKHdoaWNoICYgU1NMM19DQ19XUklURSkpOworI2lmZGVmIFRMU19ERUJVRworcHJpbnRmKCJ3aGljaCA9ICUwNFhcbmtleT0iLHdoaWNoKTsKK3sgaW50IHo7IGZvciAoej0wOyB6PEVWUF9DSVBIRVJfa2V5X2xlbmd0aChjKTsgeisrKSBwcmludGYoIiUwMlglYyIsa2V5W3pdLCgoeisxKSUxNik/JyAnOidcbicpOyB9CitwcmludGYoIlxuaXY9Iik7Cit7IGludCB6OyBmb3IgKHo9MDsgejxrOyB6KyspIHByaW50ZigiJTAyWCVjIixpdlt6XSwoKHorMSklMTYpPycgJzonXG4nKTsgfQorcHJpbnRmKCJcbiIpOworI2VuZGlmCisKKwlPUEVOU1NMX2NsZWFuc2UodG1wMSxzaXplb2YodG1wMSkpOworCU9QRU5TU0xfY2xlYW5zZSh0bXAyLHNpemVvZih0bXAxKSk7CisJT1BFTlNTTF9jbGVhbnNlKGl2MSxzaXplb2YoaXYxKSk7CisJT1BFTlNTTF9jbGVhbnNlKGl2MixzaXplb2YoaXYyKSk7CisJcmV0dXJuKDEpOworZXJyOgorCVNTTGVycihTU0xfRl9UTFMxX0NIQU5HRV9DSVBIRVJfU1RBVEUsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworZXJyMjoKKwlyZXR1cm4oMCk7CisJfQorCitpbnQgdGxzMV9zZXR1cF9rZXlfYmxvY2soU1NMICpzKQorCXsKKwl1bnNpZ25lZCBjaGFyICpwMSwqcDI9TlVMTDsKKwljb25zdCBFVlBfQ0lQSEVSICpjOworCWNvbnN0IEVWUF9NRCAqaGFzaDsKKwlpbnQgbnVtOworCVNTTF9DT01QICpjb21wOworCWludCBtYWNfdHlwZT0gTklEX3VuZGVmLG1hY19zZWNyZXRfc2l6ZT0wOworCWludCByZXQ9MDsKKworI2lmZGVmIEtTU0xfREVCVUcKKwlwcmludGYgKCJ0bHMxX3NldHVwX2tleV9ibG9jaygpXG4iKTsKKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisKKwlpZiAocy0+czMtPnRtcC5rZXlfYmxvY2tfbGVuZ3RoICE9IDApCisJCXJldHVybigxKTsKKworCWlmICghc3NsX2NpcGhlcl9nZXRfZXZwKHMtPnNlc3Npb24sJmMsJmhhc2gsJm1hY190eXBlLCZtYWNfc2VjcmV0X3NpemUsJmNvbXApKQorCQl7CisJCVNTTGVycihTU0xfRl9UTFMxX1NFVFVQX0tFWV9CTE9DSyxTU0xfUl9DSVBIRVJfT1JfSEFTSF9VTkFWQUlMQUJMRSk7CisJCXJldHVybigwKTsKKwkJfQorCisJcy0+czMtPnRtcC5uZXdfc3ltX2VuYz1jOworCXMtPnMzLT50bXAubmV3X2hhc2g9aGFzaDsKKwlzLT5zMy0+dG1wLm5ld19tYWNfcGtleV90eXBlID0gbWFjX3R5cGU7CisJcy0+czMtPnRtcC5uZXdfbWFjX3NlY3JldF9zaXplID0gbWFjX3NlY3JldF9zaXplOworCW51bT1FVlBfQ0lQSEVSX2tleV9sZW5ndGgoYykrbWFjX3NlY3JldF9zaXplK0VWUF9DSVBIRVJfaXZfbGVuZ3RoKGMpOworCW51bSo9MjsKKworCXNzbDNfY2xlYW51cF9rZXlfYmxvY2socyk7CisKKwlpZiAoKHAxPSh1bnNpZ25lZCBjaGFyICopT1BFTlNTTF9tYWxsb2MobnVtKSkgPT0gTlVMTCkKKwkJeworCQlTU0xlcnIoU1NMX0ZfVExTMV9TRVRVUF9LRVlfQkxPQ0ssRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQlnb3RvIGVycjsKKwkJfQorCisJcy0+czMtPnRtcC5rZXlfYmxvY2tfbGVuZ3RoPW51bTsKKwlzLT5zMy0+dG1wLmtleV9ibG9jaz1wMTsKKworCWlmICgocDI9KHVuc2lnbmVkIGNoYXIgKilPUEVOU1NMX21hbGxvYyhudW0pKSA9PSBOVUxMKQorCQl7CisJCVNTTGVycihTU0xfRl9UTFMxX1NFVFVQX0tFWV9CTE9DSyxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCWdvdG8gZXJyOworCQl9CisKKyNpZmRlZiBUTFNfREVCVUcKK3ByaW50ZigiY2xpZW50IHJhbmRvbVxuIik7Cit7IGludCB6OyBmb3IgKHo9MDsgejxTU0wzX1JBTkRPTV9TSVpFOyB6KyspIHByaW50ZigiJTAyWCVjIixzLT5zMy0+Y2xpZW50X3JhbmRvbVt6XSwoKHorMSklMTYpPycgJzonXG4nKTsgfQorcHJpbnRmKCJzZXJ2ZXIgcmFuZG9tXG4iKTsKK3sgaW50IHo7IGZvciAoej0wOyB6PFNTTDNfUkFORE9NX1NJWkU7IHorKykgcHJpbnRmKCIlMDJYJWMiLHMtPnMzLT5zZXJ2ZXJfcmFuZG9tW3pdLCgoeisxKSUxNik/JyAnOidcbicpOyB9CitwcmludGYoInByZS1tYXN0ZXJcbiIpOworeyBpbnQgejsgZm9yICh6PTA7IHo8cy0+c2Vzc2lvbi0+bWFzdGVyX2tleV9sZW5ndGg7IHorKykgcHJpbnRmKCIlMDJYJWMiLHMtPnNlc3Npb24tPm1hc3Rlcl9rZXlbel0sKCh6KzEpJTE2KT8nICc6J1xuJyk7IH0KKyNlbmRpZgorCWlmICghdGxzMV9nZW5lcmF0ZV9rZXlfYmxvY2socyxwMSxwMixudW0pKQorCQlnb3RvIGVycjsKKyNpZmRlZiBUTFNfREVCVUcKK3ByaW50ZigiXG5rZXkgYmxvY2tcbiIpOworeyBpbnQgejsgZm9yICh6PTA7IHo8bnVtOyB6KyspIHByaW50ZigiJTAyWCVjIixwMVt6XSwoKHorMSklMTYpPycgJzonXG4nKTsgfQorI2VuZGlmCisKKwlpZiAoIShzLT5vcHRpb25zICYgU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUykpCisJCXsKKwkJLyogZW5hYmxlIHZ1bG5lcmFiaWxpdHkgY291bnRlcm1lYXN1cmUgZm9yIENCQyBjaXBoZXJzIHdpdGgKKwkJICoga25vd24tSVYgcHJvYmxlbSAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+Ym9kby90bHMtY2JjLnR4dCkKKwkJICovCisJCXMtPnMzLT5uZWVkX2VtcHR5X2ZyYWdtZW50cyA9IDE7CisKKwkJaWYgKHMtPnNlc3Npb24tPmNpcGhlciAhPSBOVUxMKQorCQkJeworCQkJaWYgKHMtPnNlc3Npb24tPmNpcGhlci0+YWxnb3JpdGhtX2VuYyA9PSBTU0xfZU5VTEwpCisJCQkJcy0+czMtPm5lZWRfZW1wdHlfZnJhZ21lbnRzID0gMDsKKwkJCQorI2lmbmRlZiBPUEVOU1NMX05PX1JDNAorCQkJaWYgKHMtPnNlc3Npb24tPmNpcGhlci0+YWxnb3JpdGhtX2VuYyA9PSBTU0xfUkM0KQorCQkJCXMtPnMzLT5uZWVkX2VtcHR5X2ZyYWdtZW50cyA9IDA7CisjZW5kaWYKKwkJCX0KKwkJfQorCQkKKwlyZXQgPSAxOworZXJyOgorCWlmIChwMikKKwkJeworCQlPUEVOU1NMX2NsZWFuc2UocDIsbnVtKTsKKwkJT1BFTlNTTF9mcmVlKHAyKTsKKwkJfQorCXJldHVybihyZXQpOworCX0KKworaW50IHRsczFfZW5jKFNTTCAqcywgaW50IHNlbmQpCisJeworCVNTTDNfUkVDT1JEICpyZWM7CisJRVZQX0NJUEhFUl9DVFggKmRzOworCXVuc2lnbmVkIGxvbmcgbDsKKwlpbnQgYnMsaSxpaSxqLGssbj0wOworCWNvbnN0IEVWUF9DSVBIRVIgKmVuYzsKKworCWlmIChzZW5kKQorCQl7CisJCWlmIChFVlBfTURfQ1RYX21kKHMtPndyaXRlX2hhc2gpKQorCQkJeworCQkJbj1FVlBfTURfQ1RYX3NpemUocy0+d3JpdGVfaGFzaCk7CisJCQlPUEVOU1NMX2Fzc2VydChuID49IDApOworCQkJfQorCQlkcz1zLT5lbmNfd3JpdGVfY3R4OworCQlyZWM9ICYocy0+czMtPndyZWMpOworCQlpZiAocy0+ZW5jX3dyaXRlX2N0eCA9PSBOVUxMKQorCQkJZW5jPU5VTEw7CisJCWVsc2UKKwkJCWVuYz1FVlBfQ0lQSEVSX0NUWF9jaXBoZXIocy0+ZW5jX3dyaXRlX2N0eCk7CisJCX0KKwllbHNlCisJCXsKKwkJaWYgKEVWUF9NRF9DVFhfbWQocy0+cmVhZF9oYXNoKSkKKwkJCXsKKwkJCW49RVZQX01EX0NUWF9zaXplKHMtPnJlYWRfaGFzaCk7CisJCQlPUEVOU1NMX2Fzc2VydChuID49IDApOworCQkJfQorCQlkcz1zLT5lbmNfcmVhZF9jdHg7CisJCXJlYz0gJihzLT5zMy0+cnJlYyk7CisJCWlmIChzLT5lbmNfcmVhZF9jdHggPT0gTlVMTCkKKwkJCWVuYz1OVUxMOworCQllbHNlCisJCQllbmM9RVZQX0NJUEhFUl9DVFhfY2lwaGVyKHMtPmVuY19yZWFkX2N0eCk7CisJCX0KKworI2lmZGVmIEtTU0xfREVCVUcKKwlwcmludGYoInRsczFfZW5jKCVkKVxuIiwgc2VuZCk7CisjZW5kaWYgICAgLyogS1NTTF9ERUJVRyAqLworCisJaWYgKChzLT5zZXNzaW9uID09IE5VTEwpIHx8IChkcyA9PSBOVUxMKSB8fAorCQkoZW5jID09IE5VTEwpKQorCQl7CisJCW1lbW1vdmUocmVjLT5kYXRhLHJlYy0+aW5wdXQscmVjLT5sZW5ndGgpOworCQlyZWMtPmlucHV0PXJlYy0+ZGF0YTsKKwkJfQorCWVsc2UKKwkJeworCQlsPXJlYy0+bGVuZ3RoOworCQlicz1FVlBfQ0lQSEVSX2Jsb2NrX3NpemUoZHMtPmNpcGhlcik7CisKKwkJaWYgKChicyAhPSAxKSAmJiBzZW5kKQorCQkJeworCQkJaT1icy0oKGludClsJWJzKTsKKworCQkJLyogQWRkIHdlaXJkIHBhZGRpbmcgb2YgdXB0byAyNTYgYnl0ZXMgKi8KKworCQkJLyogd2UgbmVlZCB0byBhZGQgJ2knIHBhZGRpbmcgYnl0ZXMgb2YgdmFsdWUgaiAqLworCQkJaj1pLTE7CisJCQlpZiAocy0+b3B0aW9ucyAmIFNTTF9PUF9UTFNfQkxPQ0tfUEFERElOR19CVUcpCisJCQkJeworCQkJCWlmIChzLT5zMy0+ZmxhZ3MgJiBUTFMxX0ZMQUdTX1RMU19QQURESU5HX0JVRykKKwkJCQkJaisrOworCQkJCX0KKwkJCWZvciAoaz0oaW50KWw7IGs8KGludCkobCtpKTsgaysrKQorCQkJCXJlYy0+aW5wdXRba109ajsKKwkJCWwrPWk7CisJCQlyZWMtPmxlbmd0aCs9aTsKKwkJCX0KKworI2lmZGVmIEtTU0xfREVCVUcKKwkJeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdWk7CisJCXByaW50ZigiRVZQX0NpcGhlcihkcz0lcCxyZWMtPmRhdGE9JXAscmVjLT5pbnB1dD0lcCxsPSVsZCkgPT0+XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZHMscmVjLT5kYXRhLHJlYy0+aW5wdXQsbCk7CisJCXByaW50ZigiXHRFVlBfQ0lQSEVSX0NUWDogJWQgYnVmX2xlbiwgJWQga2V5X2xlbiBbJWQgJWRdLCAlZCBpdl9sZW5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkcy0+YnVmX2xlbiwgZHMtPmNpcGhlci0+a2V5X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERFU19LRVlfU1osIERFU19TQ0hFRFVMRV9TWiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzLT5jaXBoZXItPml2X2xlbik7CisJCXByaW50ZigiXHRcdElWOiAiKTsKKwkJZm9yIChpPTA7IGk8ZHMtPmNpcGhlci0+aXZfbGVuOyBpKyspIHByaW50ZigiJTAyWCIsIGRzLT5pdltpXSk7CisJCXByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCJcdHJlYy0+aW5wdXQ9Iik7CisJCWZvciAodWk9MDsgdWk8bDsgdWkrKykgcHJpbnRmKCIgJTAyeCIsIHJlYy0+aW5wdXRbdWldKTsKKwkJcHJpbnRmKCJcbiIpOworCQl9CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCisJCWlmICghc2VuZCkKKwkJCXsKKwkJCWlmIChsID09IDAgfHwgbCVicyAhPSAwKQorCQkJCXsKKwkJCQlTU0xlcnIoU1NMX0ZfVExTMV9FTkMsU1NMX1JfQkxPQ0tfQ0lQSEVSX1BBRF9JU19XUk9ORyk7CisJCQkJc3NsM19zZW5kX2FsZXJ0KHMsU1NMM19BTF9GQVRBTCxTU0xfQURfREVDUllQVElPTl9GQUlMRUQpOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCisJCUVWUF9DaXBoZXIoZHMscmVjLT5kYXRhLHJlYy0+aW5wdXQsbCk7CisKKyNpZmRlZiBLU1NMX0RFQlVHCisJCXsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcdHJlYy0+ZGF0YT0iKTsKKwkJZm9yIChpPTA7IGk8bDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgJTAyeCIsIHJlYy0+ZGF0YVtpXSk7ICBwcmludGYoIlxuIik7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCS8qIEtTU0xfREVCVUcgKi8KKworCQlpZiAoKGJzICE9IDEpICYmICFzZW5kKQorCQkJeworCQkJaWk9aT1yZWMtPmRhdGFbbC0xXTsgLyogcGFkZGluZ19sZW5ndGggKi8KKwkJCWkrKzsKKwkJCS8qIE5COiBpZiBjb21wcmVzc2lvbiBpcyBpbiBvcGVyYXRpb24gdGhlIGZpcnN0IHBhY2tldAorCQkJICogbWF5IG5vdCBiZSBvZiBldmVuIGxlbmd0aCBzbyB0aGUgcGFkZGluZyBidWcgY2hlY2sKKwkJCSAqIGNhbm5vdCBiZSBwZXJmb3JtZWQuIFRoaXMgYnVnIHdvcmthcm91bmQgaGFzIGJlZW4KKwkJCSAqIGFyb3VuZCBzaW5jZSBTU0xlYXkgc28gaG9wZWZ1bGx5IGl0IGlzIGVpdGhlciBmaXhlZAorCQkJICogbm93IG9yIG5vIGJ1Z2d5IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGNvbXByZXNzaW9uIAorCQkJICogW3N0ZXZlXQorCQkJICovCisJCQlpZiAoIChzLT5vcHRpb25zJlNTTF9PUF9UTFNfQkxPQ0tfUEFERElOR19CVUcpCisJCQkJJiYgIXMtPmV4cGFuZCkKKwkJCQl7CisJCQkJLyogRmlyc3QgcGFja2V0IGlzIGV2ZW4gaW4gc2l6ZSwgc28gY2hlY2sgKi8KKwkJCQlpZiAoKG1lbWNtcChzLT5zMy0+cmVhZF9zZXF1ZW5jZSwKKwkJCQkJIlwwXDBcMFwwXDBcMFwwXDAiLDgpID09IDApICYmICEoaWkgJiAxKSkKKwkJCQkJcy0+czMtPmZsYWdzfD1UTFMxX0ZMQUdTX1RMU19QQURESU5HX0JVRzsKKwkJCQlpZiAocy0+czMtPmZsYWdzICYgVExTMV9GTEFHU19UTFNfUEFERElOR19CVUcpCisJCQkJCWktLTsKKwkJCQl9CisJCQkvKiBUTFMgMS4wIGRvZXMgbm90IGJvdW5kIHRoZSBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBieSB0aGUgYmxvY2sgc2l6ZS4KKwkJCSAqIEFsbCBvZiB0aGVtIG11c3QgaGF2ZSB2YWx1ZSAncGFkZGluZ19sZW5ndGgnLiAqLworCQkJaWYgKGkgPiAoaW50KXJlYy0+bGVuZ3RoKQorCQkJCXsKKwkJCQkvKiBJbmNvcnJlY3QgcGFkZGluZy4gU1NMZXJyKCkgYW5kIHNzbDNfYWxlcnQgYXJlIGRvbmUKKwkJCQkgKiBieSBjYWxsZXI6IHdlIGRvbid0IHdhbnQgdG8gcmV2ZWFsIHdoZXRoZXIgdGhpcyBpcworCQkJCSAqIGEgZGVjcnlwdGlvbiBlcnJvciBvciBhIE1BQyB2ZXJpZmljYXRpb24gZmFpbHVyZQorCQkJCSAqIChzZWUgaHR0cDovL3d3dy5vcGVuc3NsLm9yZy9+Ym9kby90bHMtY2JjLnR4dCkgKi8KKwkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJZm9yIChqPShpbnQpKGwtaSk7IGo8KGludClsOyBqKyspCisJCQkJeworCQkJCWlmIChyZWMtPmRhdGFbal0gIT0gaWkpCisJCQkJCXsKKwkJCQkJLyogSW5jb3JyZWN0IHBhZGRpbmcgKi8KKwkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJcmVjLT5sZW5ndGgtPWk7CisJCQl9CisJCX0KKwlyZXR1cm4oMSk7CisJfQoraW50IHRsczFfY2VydF92ZXJpZnlfbWFjKFNTTCAqcywgaW50IG1kX25pZCwgdW5zaWduZWQgY2hhciAqb3V0KQorCXsKKwl1bnNpZ25lZCBpbnQgcmV0OworCUVWUF9NRF9DVFggY3R4LCAqZD1OVUxMOworCWludCBpOworCisJaWYgKHMtPnMzLT5oYW5kc2hha2VfYnVmZmVyKSAKKwkJaWYgKCFzc2wzX2RpZ2VzdF9jYWNoZWRfcmVjb3JkcyhzKSkKKwkJCXJldHVybiAwOworCisJZm9yIChpPTA7aTxTU0xfTUFYX0RJR0VTVDtpKyspIAorCQl7CisJCSAgaWYgKHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSYmRVZQX01EX0NUWF90eXBlKHMtPnMzLT5oYW5kc2hha2VfZGdzdFtpXSk9PW1kX25pZCkgCisJCSAgCXsKKwkJICAJZD1zLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaV07CisJCQlicmVhazsKKwkJCX0KKwkJfQorCWlmICghZCkgeworCQlTU0xlcnIoU1NMX0ZfVExTMV9DRVJUX1ZFUklGWV9NQUMsU1NMX1JfTk9fUkVRVUlSRURfRElHRVNUKTsKKwkJcmV0dXJuIDA7CisJfQkKKworCUVWUF9NRF9DVFhfaW5pdCgmY3R4KTsKKwlFVlBfTURfQ1RYX2NvcHlfZXgoJmN0eCxkKTsKKwlFVlBfRGlnZXN0RmluYWxfZXgoJmN0eCxvdXQsJnJldCk7CisJRVZQX01EX0NUWF9jbGVhbnVwKCZjdHgpOworCXJldHVybigoaW50KXJldCk7CisJfQorCitpbnQgdGxzMV9maW5hbF9maW5pc2hfbWFjKFNTTCAqcywKKwkgICAgIGNvbnN0IGNoYXIgKnN0ciwgaW50IHNsZW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKKwl7CisJdW5zaWduZWQgaW50IGk7CisJRVZQX01EX0NUWCBjdHg7CisJdW5zaWduZWQgY2hhciBidWZbMipFVlBfTUFYX01EX1NJWkVdOworCXVuc2lnbmVkIGNoYXIgKnEsYnVmMlsxMl07CisJaW50IGlkeDsKKwlsb25nIG1hc2s7CisJaW50IGVycj0wOworCWNvbnN0IEVWUF9NRCAqbWQ7IAorCisJcT1idWY7CisKKwlpZiAocy0+czMtPmhhbmRzaGFrZV9idWZmZXIpIAorCQlpZiAoIXNzbDNfZGlnZXN0X2NhY2hlZF9yZWNvcmRzKHMpKQorCQkJcmV0dXJuIDA7CisKKwlFVlBfTURfQ1RYX2luaXQoJmN0eCk7CisKKwlmb3IgKGlkeD0wO3NzbF9nZXRfaGFuZHNoYWtlX2RpZ2VzdChpZHgsJm1hc2ssJm1kKTtpZHgrKykKKwkJeworCQlpZiAobWFzayAmIHMtPnMzLT50bXAubmV3X2NpcGhlci0+YWxnb3JpdGhtMikKKwkJCXsKKwkJCWludCBoYXNoc2l6ZSA9IEVWUF9NRF9zaXplKG1kKTsKKwkJCWlmIChoYXNoc2l6ZSA8IDAgfHwgaGFzaHNpemUgPiAoaW50KShzaXplb2YgYnVmIC0gKHNpemVfdCkocS1idWYpKSkKKwkJCQl7CisJCQkJLyogaW50ZXJuYWwgZXJyb3I6ICdidWYnIGlzIHRvbyBzbWFsbCBmb3IgdGhpcyBjaXBlcnN1aXRlISAqLworCQkJCWVyciA9IDE7CisJCQkJfQorCQkJZWxzZQorCQkJCXsKKwkJCQlFVlBfTURfQ1RYX2NvcHlfZXgoJmN0eCxzLT5zMy0+aGFuZHNoYWtlX2Rnc3RbaWR4XSk7CisJCQkJRVZQX0RpZ2VzdEZpbmFsX2V4KCZjdHgscSwmaSk7CisJCQkJaWYgKGkgIT0gKHVuc2lnbmVkIGludCloYXNoc2l6ZSkgLyogY2FuJ3QgcmVhbGx5IGhhcHBlbiAqLworCQkJCQllcnIgPSAxOworCQkJCXErPWk7CisJCQkJfQorCQkJfQorCQl9CisJCQorCWlmICghdGxzMV9QUkYocy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG0yLAorCQkJc3RyLHNsZW4sIGJ1ZiwoaW50KShxLWJ1ZiksIE5VTEwsMCwgTlVMTCwwLCBOVUxMLDAsCisJCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LHMtPnNlc3Npb24tPm1hc3Rlcl9rZXlfbGVuZ3RoLAorCQkJb3V0LGJ1ZjIsc2l6ZW9mIGJ1ZjIpKQorCQllcnIgPSAxOworCUVWUF9NRF9DVFhfY2xlYW51cCgmY3R4KTsKKworCWlmIChlcnIpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIHNpemVvZiBidWYyOworCX0KKworaW50IHRsczFfbWFjKFNTTCAqc3NsLCB1bnNpZ25lZCBjaGFyICptZCwgaW50IHNlbmQpCisJeworCVNTTDNfUkVDT1JEICpyZWM7CisJdW5zaWduZWQgY2hhciAqbWFjX3NlYywqc2VxOworCUVWUF9NRF9DVFggKmhhc2g7CisJc2l6ZV90IG1kX3NpemU7CisJaW50IGk7CisJRVZQX01EX0NUWCBobWFjLCAqbWFjX2N0eDsKKwl1bnNpZ25lZCBjaGFyIGJ1Zls1XTsgCisJaW50IHN0cmVhbV9tYWMgPSAoc2VuZD8oc3NsLT5tYWNfZmxhZ3MgJiBTU0xfTUFDX0ZMQUdfV1JJVEVfTUFDX1NUUkVBTSk6KHNzbC0+bWFjX2ZsYWdzJlNTTF9NQUNfRkxBR19SRUFEX01BQ19TVFJFQU0pKTsKKwlpbnQgdDsKKworCWlmIChzZW5kKQorCQl7CisJCXJlYz0gJihzc2wtPnMzLT53cmVjKTsKKwkJbWFjX3NlYz0gJihzc2wtPnMzLT53cml0ZV9tYWNfc2VjcmV0WzBdKTsKKwkJc2VxPSAmKHNzbC0+czMtPndyaXRlX3NlcXVlbmNlWzBdKTsKKwkJaGFzaD1zc2wtPndyaXRlX2hhc2g7CisJCX0KKwllbHNlCisJCXsKKwkJcmVjPSAmKHNzbC0+czMtPnJyZWMpOworCQltYWNfc2VjPSAmKHNzbC0+czMtPnJlYWRfbWFjX3NlY3JldFswXSk7CisJCXNlcT0gJihzc2wtPnMzLT5yZWFkX3NlcXVlbmNlWzBdKTsKKwkJaGFzaD1zc2wtPnJlYWRfaGFzaDsKKwkJfQorCisJdD1FVlBfTURfQ1RYX3NpemUoaGFzaCk7CisJT1BFTlNTTF9hc3NlcnQodCA+PSAwKTsKKwltZF9zaXplPXQ7CisKKwlidWZbMF09cmVjLT50eXBlOworCWJ1ZlsxXT0odW5zaWduZWQgY2hhcikoc3NsLT52ZXJzaW9uPj44KTsKKwlidWZbMl09KHVuc2lnbmVkIGNoYXIpKHNzbC0+dmVyc2lvbik7CisJYnVmWzNdPXJlYy0+bGVuZ3RoPj44OworCWJ1Zls0XT1yZWMtPmxlbmd0aCYweGZmOworCisJLyogSSBzaG91bGQgZml4IHRoaXMgdXAgVExTIFRMUyBUTFMgVExTIFRMUyBYWFhYWFhYWCAqLworCWlmIChzdHJlYW1fbWFjKSAKKwkJeworCQkJbWFjX2N0eCA9IGhhc2g7CisJCX0KKwkJZWxzZQorCQl7CisJCQlFVlBfTURfQ1RYX2NvcHkoJmhtYWMsaGFzaCk7CisJCQltYWNfY3R4ID0gJmhtYWM7CisJCX0KKworCWlmIChzc2wtPnZlcnNpb24gPT0gRFRMUzFfVkVSU0lPTiB8fCBzc2wtPnZlcnNpb24gPT0gRFRMUzFfQkFEX1ZFUikKKwkJeworCQl1bnNpZ25lZCBjaGFyIGR0bHNzZXFbOF0sKnA9ZHRsc3NlcTsKKworCQlzMm4oc2VuZD9zc2wtPmQxLT53X2Vwb2NoOnNzbC0+ZDEtPnJfZXBvY2gsIHApOworCQltZW1jcHkgKHAsJnNlcVsyXSw2KTsKKworCQlFVlBfRGlnZXN0U2lnblVwZGF0ZShtYWNfY3R4LGR0bHNzZXEsOCk7CisJCX0KKwllbHNlCisJCUVWUF9EaWdlc3RTaWduVXBkYXRlKG1hY19jdHgsc2VxLDgpOworCisJRVZQX0RpZ2VzdFNpZ25VcGRhdGUobWFjX2N0eCxidWYsNSk7CisJRVZQX0RpZ2VzdFNpZ25VcGRhdGUobWFjX2N0eCxyZWMtPmlucHV0LHJlYy0+bGVuZ3RoKTsKKwl0PUVWUF9EaWdlc3RTaWduRmluYWwobWFjX2N0eCxtZCwmbWRfc2l6ZSk7CisJT1BFTlNTTF9hc3NlcnQodCA+IDApOworCQkKKwlpZiAoIXN0cmVhbV9tYWMpIEVWUF9NRF9DVFhfY2xlYW51cCgmaG1hYyk7CisjaWZkZWYgVExTX0RFQlVHCitwcmludGYoInNlYz0iKTsKK3t1bnNpZ25lZCBpbnQgejsgZm9yICh6PTA7IHo8bWRfc2l6ZTsgeisrKSBwcmludGYoIiUwMlggIixtYWNfc2VjW3pdKTsgcHJpbnRmKCJcbiIpOyB9CitwcmludGYoInNlcT0iKTsKK3tpbnQgejsgZm9yICh6PTA7IHo8ODsgeisrKSBwcmludGYoIiUwMlggIixzZXFbel0pOyBwcmludGYoIlxuIik7IH0KK3ByaW50ZigiYnVmPSIpOwore2ludCB6OyBmb3IgKHo9MDsgejw1OyB6KyspIHByaW50ZigiJTAyWCAiLGJ1Zlt6XSk7IHByaW50ZigiXG4iKTsgfQorcHJpbnRmKCJyZWM9Iik7Cit7dW5zaWduZWQgaW50IHo7IGZvciAoej0wOyB6PHJlYy0+bGVuZ3RoOyB6KyspIHByaW50ZigiJTAyWCAiLGJ1Zlt6XSk7IHByaW50ZigiXG4iKTsgfQorI2VuZGlmCisKKwlpZiAoc3NsLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04gJiYgc3NsLT52ZXJzaW9uICE9IERUTFMxX0JBRF9WRVIpCisJCXsKKwkJZm9yIChpPTc7IGk+PTA7IGktLSkKKwkJCXsKKwkJCSsrc2VxW2ldOworCQkJaWYgKHNlcVtpXSAhPSAwKSBicmVhazsgCisJCQl9CisJCX0KKworI2lmZGVmIFRMU19ERUJVRwore3Vuc2lnbmVkIGludCB6OyBmb3IgKHo9MDsgejxtZF9zaXplOyB6KyspIHByaW50ZigiJTAyWCAiLG1kW3pdKTsgcHJpbnRmKCJcbiIpOyB9CisjZW5kaWYKKwlyZXR1cm4obWRfc2l6ZSk7CisJfQorCitpbnQgdGxzMV9nZW5lcmF0ZV9tYXN0ZXJfc2VjcmV0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICpwLAorCSAgICAgaW50IGxlbikKKwl7CisJdW5zaWduZWQgY2hhciBidWZmW1NTTF9NQVhfTUFTVEVSX0tFWV9MRU5HVEhdOworCWNvbnN0IHZvaWQgKmNvID0gTlVMTCwgKnNvID0gTlVMTDsKKwlpbnQgY29sID0gMCwgc29sID0gMDsKKworI2lmZGVmIEtTU0xfREVCVUcKKwlwcmludGYgKCJ0bHMxX2dlbmVyYXRlX21hc3Rlcl9zZWNyZXQoJXAsJXAsICVwLCAlZClcbiIsIHMsb3V0LCBwLGxlbik7CisjZW5kaWYJLyogS1NTTF9ERUJVRyAqLworCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorCWlmIChzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCAmJiBzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCAmJgorCSAgICBzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXRfbGVuID4gMCAmJgorCSAgICBzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXRfbGVuID09IHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dF9sZW4pCisJCXsKKwkJY28gPSBzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQ7CisJCWNvbCA9IHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dF9sZW47CisJCXNvID0gcy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0OworCQlzb2wgPSBzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXRfbGVuOyAvKiBtdXN0IGJlIHNhbWUgYXMgY29sIChzZWUgZHJhZnQtcmVzY29ybGEtdGxzLW9wYXF1ZS1wcmYtaW5wdXQtMDAudHh0LCBzZWN0aW9uIDMuMSkgKi8KKwkJfQorI2VuZGlmCisKKwl0bHMxX1BSRihzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobTIsCisJCVRMU19NRF9NQVNURVJfU0VDUkVUX0NPTlNULFRMU19NRF9NQVNURVJfU0VDUkVUX0NPTlNUX1NJWkUsCisJCXMtPnMzLT5jbGllbnRfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUsCisJCWNvLCBjb2wsCisJCXMtPnMzLT5zZXJ2ZXJfcmFuZG9tLFNTTDNfUkFORE9NX1NJWkUsCisJCXNvLCBzb2wsCisJCXAsbGVuLAorCQlzLT5zZXNzaW9uLT5tYXN0ZXJfa2V5LGJ1ZmYsc2l6ZW9mIGJ1ZmYpOworCisjaWZkZWYgS1NTTF9ERUJVRworCXByaW50ZiAoInRsczFfZ2VuZXJhdGVfbWFzdGVyX3NlY3JldCgpIGNvbXBsZXRlXG4iKTsKKyNlbmRpZgkvKiBLU1NMX0RFQlVHICovCisJcmV0dXJuKFNTTDNfTUFTVEVSX1NFQ1JFVF9TSVpFKTsKKwl9CisKK2ludCB0bHMxX2FsZXJ0X2NvZGUoaW50IGNvZGUpCisJeworCXN3aXRjaCAoY29kZSkKKwkJeworCWNhc2UgU1NMX0FEX0NMT1NFX05PVElGWToJcmV0dXJuKFNTTDNfQURfQ0xPU0VfTk9USUZZKTsKKwljYXNlIFNTTF9BRF9VTkVYUEVDVEVEX01FU1NBR0U6CXJldHVybihTU0wzX0FEX1VORVhQRUNURURfTUVTU0FHRSk7CisJY2FzZSBTU0xfQURfQkFEX1JFQ09SRF9NQUM6CXJldHVybihTU0wzX0FEX0JBRF9SRUNPUkRfTUFDKTsKKwljYXNlIFNTTF9BRF9ERUNSWVBUSU9OX0ZBSUxFRDoJcmV0dXJuKFRMUzFfQURfREVDUllQVElPTl9GQUlMRUQpOworCWNhc2UgU1NMX0FEX1JFQ09SRF9PVkVSRkxPVzoJcmV0dXJuKFRMUzFfQURfUkVDT1JEX09WRVJGTE9XKTsKKwljYXNlIFNTTF9BRF9ERUNPTVBSRVNTSU9OX0ZBSUxVUkU6cmV0dXJuKFNTTDNfQURfREVDT01QUkVTU0lPTl9GQUlMVVJFKTsKKwljYXNlIFNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRToJcmV0dXJuKFNTTDNfQURfSEFORFNIQUtFX0ZBSUxVUkUpOworCWNhc2UgU1NMX0FEX05PX0NFUlRJRklDQVRFOglyZXR1cm4oLTEpOworCWNhc2UgU1NMX0FEX0JBRF9DRVJUSUZJQ0FURToJcmV0dXJuKFNTTDNfQURfQkFEX0NFUlRJRklDQVRFKTsKKwljYXNlIFNTTF9BRF9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURTpyZXR1cm4oU1NMM19BRF9VTlNVUFBPUlRFRF9DRVJUSUZJQ0FURSk7CisJY2FzZSBTU0xfQURfQ0VSVElGSUNBVEVfUkVWT0tFRDpyZXR1cm4oU1NMM19BRF9DRVJUSUZJQ0FURV9SRVZPS0VEKTsKKwljYXNlIFNTTF9BRF9DRVJUSUZJQ0FURV9FWFBJUkVEOnJldHVybihTU0wzX0FEX0NFUlRJRklDQVRFX0VYUElSRUQpOworCWNhc2UgU1NMX0FEX0NFUlRJRklDQVRFX1VOS05PV046cmV0dXJuKFNTTDNfQURfQ0VSVElGSUNBVEVfVU5LTk9XTik7CisJY2FzZSBTU0xfQURfSUxMRUdBTF9QQVJBTUVURVI6CXJldHVybihTU0wzX0FEX0lMTEVHQUxfUEFSQU1FVEVSKTsKKwljYXNlIFNTTF9BRF9VTktOT1dOX0NBOgkJcmV0dXJuKFRMUzFfQURfVU5LTk9XTl9DQSk7CisJY2FzZSBTU0xfQURfQUNDRVNTX0RFTklFRDoJcmV0dXJuKFRMUzFfQURfQUNDRVNTX0RFTklFRCk7CisJY2FzZSBTU0xfQURfREVDT0RFX0VSUk9SOglyZXR1cm4oVExTMV9BRF9ERUNPREVfRVJST1IpOworCWNhc2UgU1NMX0FEX0RFQ1JZUFRfRVJST1I6CXJldHVybihUTFMxX0FEX0RFQ1JZUFRfRVJST1IpOworCWNhc2UgU1NMX0FEX0VYUE9SVF9SRVNUUklDVElPTjoJcmV0dXJuKFRMUzFfQURfRVhQT1JUX1JFU1RSSUNUSU9OKTsKKwljYXNlIFNTTF9BRF9QUk9UT0NPTF9WRVJTSU9OOglyZXR1cm4oVExTMV9BRF9QUk9UT0NPTF9WRVJTSU9OKTsKKwljYXNlIFNTTF9BRF9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6cmV0dXJuKFRMUzFfQURfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZKTsKKwljYXNlIFNTTF9BRF9JTlRFUk5BTF9FUlJPUjoJcmV0dXJuKFRMUzFfQURfSU5URVJOQUxfRVJST1IpOworCWNhc2UgU1NMX0FEX1VTRVJfQ0FOQ0VMTEVEOglyZXR1cm4oVExTMV9BRF9VU0VSX0NBTkNFTExFRCk7CisJY2FzZSBTU0xfQURfTk9fUkVORUdPVElBVElPTjoJcmV0dXJuKFRMUzFfQURfTk9fUkVORUdPVElBVElPTik7CisJY2FzZSBTU0xfQURfVU5TVVBQT1JURURfRVhURU5TSU9OOiByZXR1cm4oVExTMV9BRF9VTlNVUFBPUlRFRF9FWFRFTlNJT04pOworCWNhc2UgU1NMX0FEX0NFUlRJRklDQVRFX1VOT0JUQUlOQUJMRTogcmV0dXJuKFRMUzFfQURfQ0VSVElGSUNBVEVfVU5PQlRBSU5BQkxFKTsKKwljYXNlIFNTTF9BRF9VTlJFQ09HTklaRURfTkFNRToJcmV0dXJuKFRMUzFfQURfVU5SRUNPR05JWkVEX05BTUUpOworCWNhc2UgU1NMX0FEX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0U6IHJldHVybihUTFMxX0FEX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0UpOworCWNhc2UgU1NMX0FEX0JBRF9DRVJUSUZJQ0FURV9IQVNIX1ZBTFVFOiByZXR1cm4oVExTMV9BRF9CQURfQ0VSVElGSUNBVEVfSEFTSF9WQUxVRSk7CisJY2FzZSBTU0xfQURfVU5LTk9XTl9QU0tfSURFTlRJVFk6cmV0dXJuKFRMUzFfQURfVU5LTk9XTl9QU0tfSURFTlRJVFkpOworI2lmIDAgLyogbm90IGFwcHJvcHJpYXRlIGZvciBUTFMsIG5vdCB1c2VkIGZvciBEVExTICovCisJY2FzZSBEVExTMV9BRF9NSVNTSU5HX0hBTkRTSEFLRV9NRVNTQUdFOiByZXR1cm4gCisJCQkJCSAgKERUTFMxX0FEX01JU1NJTkdfSEFORFNIQUtFX01FU1NBR0UpOworI2VuZGlmCisJZGVmYXVsdDoJCQlyZXR1cm4oLTEpOworCQl9CisJfQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvdDFfbGliLmMgYi9saWIvb3BlbnNzbC9zc2wvdDFfbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjMmRlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC90MV9saWIuYwpAQCAtMCwwICsxLDE3MzkgQEAKKy8qIHNzbC90MV9saWIuYyAqLworLyogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcGFja2FnZSBpcyBhbiBTU0wgaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pLgorICogVGhlIGltcGxlbWVudGF0aW9uIHdhcyB3cml0dGVuIHNvIGFzIHRvIGNvbmZvcm0gd2l0aCBOZXRzY2FwZXMgU1NMLgorICogCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBmb3IgY29tbWVyY2lhbCBhbmQgbm9uLWNvbW1lcmNpYWwgdXNlIGFzIGxvbmcgYXMKKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgYWhlYXJlZCB0by4gIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXBwbHkgdG8gYWxsIGNvZGUgZm91bmQgaW4gdGhpcyBkaXN0cmlidXRpb24sIGJlIGl0IHRoZSBSQzQsIFJTQSwKKyAqIGxoYXNoLCBERVMsIGV0Yy4sIGNvZGU7IG5vdCBqdXN0IHRoZSBTU0wgY29kZS4gIFRoZSBTU0wgZG9jdW1lbnRhdGlvbgorICogaW5jbHVkZWQgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbiBpcyBjb3ZlcmVkIGJ5IHRoZSBzYW1lIGNvcHlyaWdodCB0ZXJtcworICogZXhjZXB0IHRoYXQgdGhlIGhvbGRlciBpcyBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKiAKKyAqIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCisgKiB0aGUgY29kZSBhcmUgbm90IHRvIGJlIHJlbW92ZWQuCisgKiBJZiB0aGlzIHBhY2thZ2UgaXMgdXNlZCBpbiBhIHByb2R1Y3QsIEVyaWMgWW91bmcgc2hvdWxkIGJlIGdpdmVuIGF0dHJpYnV0aW9uCisgKiBhcyB0aGUgYXV0aG9yIG9mIHRoZSBwYXJ0cyBvZiB0aGUgbGlicmFyeSB1c2VkLgorICogVGhpcyBjYW4gYmUgaW4gdGhlIGZvcm0gb2YgYSB0ZXh0dWFsIG1lc3NhZ2UgYXQgcHJvZ3JhbSBzdGFydHVwIG9yCisgKiBpbiBkb2N1bWVudGF0aW9uIChvbmxpbmUgb3IgdGV4dHVhbCkgcHJvdmlkZWQgd2l0aCB0aGUgcGFja2FnZS4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5CisgKiAgICAgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIgorICogICAgVGhlIHdvcmQgJ2NyeXB0b2dyYXBoaWMnIGNhbiBiZSBsZWZ0IG91dCBpZiB0aGUgcm91aW5lcyBmcm9tIHRoZSBsaWJyYXJ5CisgKiAgICBiZWluZyB1c2VkIGFyZSBub3QgY3J5cHRvZ3JhcGhpYyByZWxhdGVkIDotKS4KKyAqIDQuIElmIHlvdSBpbmNsdWRlIGFueSBXaW5kb3dzIHNwZWNpZmljIGNvZGUgKG9yIGEgZGVyaXZhdGl2ZSB0aGVyZW9mKSBmcm9tIAorICogICAgdGhlIGFwcHMgZGlyZWN0b3J5IChhcHBsaWNhdGlvbiBjb2RlKSB5b3UgbXVzdCBpbmNsdWRlIGFuIGFja25vd2xlZGdlbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0gSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkiCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRVJJQyBZT1VORyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqIAorICogVGhlIGxpY2VuY2UgYW5kIGRpc3RyaWJ1dGlvbiB0ZXJtcyBmb3IgYW55IHB1YmxpY2FsbHkgYXZhaWxhYmxlIHZlcnNpb24gb3IKKyAqIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiAgaS5lLiB0aGlzIGNvZGUgY2Fubm90IHNpbXBseSBiZQorICogY29waWVkIGFuZCBwdXQgdW5kZXIgYW5vdGhlciBkaXN0cmlidXRpb24gbGljZW5jZQorICogW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbmNlLl0KKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAoYykgMTk5OC0yMDA3IFRoZSBPcGVuU1NMIFByb2plY3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICoKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKKyAqICAgIHNvZnR3YXJlIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgUHJvamVjdAorICogICAgZm9yIHVzZSBpbiB0aGUgT3BlblNTTCBUb29sa2l0LiAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIDQuIFRoZSBuYW1lcyAiT3BlblNTTCBUb29sa2l0IiBhbmQgIk9wZW5TU0wgUHJvamVjdCIgbXVzdCBub3QgYmUgdXNlZCB0bworICogICAgZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4gcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QKKyAqICAgIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KKyAqCisgKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiT3BlblNTTCIKKyAqICAgIG5vciBtYXkgIk9wZW5TU0wiIGFwcGVhciBpbiB0aGVpciBuYW1lcyB3aXRob3V0IHByaW9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24gb2YgdGhlIE9wZW5TU0wgUHJvamVjdC4KKyAqCisgKiA2LiBSZWRpc3RyaWJ1dGlvbnMgb2YgYW55IGZvcm0gd2hhdHNvZXZlciBtdXN0IHJldGFpbiB0aGUgZm9sbG93aW5nCisgKiAgICBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdCAoaHR0cDovL3d3dy5vcGVuc3NsLm9yZy8pIgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIE9wZW5TU0wgUFJPSkVDVCBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIE9wZW5TU0wgUFJPSkVDVCBPUgorICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VECisgKiBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZworICogKGVheUBjcnlwdHNvZnQuY29tKS4gIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbQorICogSHVkc29uICh0amhAY3J5cHRzb2Z0LmNvbSkuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9obWFjLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vY3NwLmg+CisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKworY29uc3QgY2hhciB0bHMxX3ZlcnNpb25fc3RyW109IlRMU3YxIiBPUEVOU1NMX1ZFUlNJT05fUFRFWFQ7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK3N0YXRpYyBpbnQgdGxzX2RlY3J5cHRfdGlja2V0KFNTTCAqcywgY29uc3QgdW5zaWduZWQgY2hhciAqdGljaywgaW50IHRpY2tsZW4sCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2Vzc19pZCwgaW50IHNlc3NsZW4sCisJCQkJU1NMX1NFU1NJT04gKipwc2Vzcyk7CisjZW5kaWYKKworU1NMM19FTkNfTUVUSE9EIFRMU3YxX2VuY19kYXRhPXsKKwl0bHMxX2VuYywKKwl0bHMxX21hYywKKwl0bHMxX3NldHVwX2tleV9ibG9jaywKKwl0bHMxX2dlbmVyYXRlX21hc3Rlcl9zZWNyZXQsCisJdGxzMV9jaGFuZ2VfY2lwaGVyX3N0YXRlLAorCXRsczFfZmluYWxfZmluaXNoX21hYywKKwlUTFMxX0ZJTklTSF9NQUNfTEVOR1RILAorCXRsczFfY2VydF92ZXJpZnlfbWFjLAorCVRMU19NRF9DTElFTlRfRklOSVNIX0NPTlNULFRMU19NRF9DTElFTlRfRklOSVNIX0NPTlNUX1NJWkUsCisJVExTX01EX1NFUlZFUl9GSU5JU0hfQ09OU1QsVExTX01EX1NFUlZFUl9GSU5JU0hfQ09OU1RfU0laRSwKKwl0bHMxX2FsZXJ0X2NvZGUsCisJfTsKKworbG9uZyB0bHMxX2RlZmF1bHRfdGltZW91dCh2b2lkKQorCXsKKwkvKiAyIGhvdXJzLCB0aGUgMjQgaG91cnMgbWVudGlvbmVkIGluIHRoZSBUTFN2MSBzcGVjCisJICogaXMgd2F5IHRvbyBsb25nIGZvciBodHRwLCB0aGUgY2FjaGUgd291bGQgb3ZlciBmaWxsICovCisJcmV0dXJuKDYwKjYwKjIpOworCX0KKworaW50IHRsczFfbmV3KFNTTCAqcykKKwl7CisJaWYgKCFzc2wzX25ldyhzKSkgcmV0dXJuKDApOworCXMtPm1ldGhvZC0+c3NsX2NsZWFyKHMpOworCXJldHVybigxKTsKKwl9CisKK3ZvaWQgdGxzMV9mcmVlKFNTTCAqcykKKwl7CisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisJaWYgKHMtPnRsc2V4dF9zZXNzaW9uX3RpY2tldCkKKwkJeworCQlPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0KTsKKwkJfQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fVExTRVhUICovCisJc3NsM19mcmVlKHMpOworCX0KKwordm9pZCB0bHMxX2NsZWFyKFNTTCAqcykKKwl7CisJc3NsM19jbGVhcihzKTsKKwlzLT52ZXJzaW9uPVRMUzFfVkVSU0lPTjsKKwl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworc3RhdGljIGludCBuaWRfbGlzdFtdID0KKwl7CisJCU5JRF9zZWN0MTYzazEsIC8qIHNlY3QxNjNrMSAoMSkgKi8KKwkJTklEX3NlY3QxNjNyMSwgLyogc2VjdDE2M3IxICgyKSAqLworCQlOSURfc2VjdDE2M3IyLCAvKiBzZWN0MTYzcjIgKDMpICovCisJCU5JRF9zZWN0MTkzcjEsIC8qIHNlY3QxOTNyMSAoNCkgKi8gCisJCU5JRF9zZWN0MTkzcjIsIC8qIHNlY3QxOTNyMiAoNSkgKi8gCisJCU5JRF9zZWN0MjMzazEsIC8qIHNlY3QyMzNrMSAoNikgKi8KKwkJTklEX3NlY3QyMzNyMSwgLyogc2VjdDIzM3IxICg3KSAqLyAKKwkJTklEX3NlY3QyMzlrMSwgLyogc2VjdDIzOWsxICg4KSAqLyAKKwkJTklEX3NlY3QyODNrMSwgLyogc2VjdDI4M2sxICg5KSAqLworCQlOSURfc2VjdDI4M3IxLCAvKiBzZWN0MjgzcjEgKDEwKSAqLyAKKwkJTklEX3NlY3Q0MDlrMSwgLyogc2VjdDQwOWsxICgxMSkgKi8gCisJCU5JRF9zZWN0NDA5cjEsIC8qIHNlY3Q0MDlyMSAoMTIpICovCisJCU5JRF9zZWN0NTcxazEsIC8qIHNlY3Q1NzFrMSAoMTMpICovIAorCQlOSURfc2VjdDU3MXIxLCAvKiBzZWN0NTcxcjEgKDE0KSAqLyAKKwkJTklEX3NlY3AxNjBrMSwgLyogc2VjcDE2MGsxICgxNSkgKi8KKwkJTklEX3NlY3AxNjByMSwgLyogc2VjcDE2MHIxICgxNikgKi8gCisJCU5JRF9zZWNwMTYwcjIsIC8qIHNlY3AxNjByMiAoMTcpICovIAorCQlOSURfc2VjcDE5MmsxLCAvKiBzZWNwMTkyazEgKDE4KSAqLworCQlOSURfWDlfNjJfcHJpbWUxOTJ2MSwgLyogc2VjcDE5MnIxICgxOSkgKi8gCisJCU5JRF9zZWNwMjI0azEsIC8qIHNlY3AyMjRrMSAoMjApICovIAorCQlOSURfc2VjcDIyNHIxLCAvKiBzZWNwMjI0cjEgKDIxKSAqLworCQlOSURfc2VjcDI1NmsxLCAvKiBzZWNwMjU2azEgKDIyKSAqLyAKKwkJTklEX1g5XzYyX3ByaW1lMjU2djEsIC8qIHNlY3AyNTZyMSAoMjMpICovIAorCQlOSURfc2VjcDM4NHIxLCAvKiBzZWNwMzg0cjEgKDI0KSAqLworCQlOSURfc2VjcDUyMXIxICAvKiBzZWNwNTIxcjEgKDI1KSAqLwkKKwl9OworCQoraW50IHRsczFfZWNfY3VydmVfaWQybmlkKGludCBjdXJ2ZV9pZCkKKwl7CisJLyogRUNDIGN1cnZlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQgKE9jdC4gMTcsIDIwMDUpICovCisJaWYgKChjdXJ2ZV9pZCA8IDEpIHx8ICgodW5zaWduZWQgaW50KWN1cnZlX2lkID4KKwkJCQlzaXplb2YobmlkX2xpc3QpL3NpemVvZihuaWRfbGlzdFswXSkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbmlkX2xpc3RbY3VydmVfaWQtMV07CisJfQorCitpbnQgdGxzMV9lY19uaWQyY3VydmVfaWQoaW50IG5pZCkKKwl7CisJLyogRUNDIGN1cnZlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQgKE9jdC4gMTcsIDIwMDUpICovCisJc3dpdGNoIChuaWQpCisJCXsKKwljYXNlIE5JRF9zZWN0MTYzazE6IC8qIHNlY3QxNjNrMSAoMSkgKi8KKwkJcmV0dXJuIDE7CisJY2FzZSBOSURfc2VjdDE2M3IxOiAvKiBzZWN0MTYzcjEgKDIpICovCisJCXJldHVybiAyOworCWNhc2UgTklEX3NlY3QxNjNyMjogLyogc2VjdDE2M3IyICgzKSAqLworCQlyZXR1cm4gMzsKKwljYXNlIE5JRF9zZWN0MTkzcjE6IC8qIHNlY3QxOTNyMSAoNCkgKi8gCisJCXJldHVybiA0OworCWNhc2UgTklEX3NlY3QxOTNyMjogLyogc2VjdDE5M3IyICg1KSAqLyAKKwkJcmV0dXJuIDU7CisJY2FzZSBOSURfc2VjdDIzM2sxOiAvKiBzZWN0MjMzazEgKDYpICovCisJCXJldHVybiA2OworCWNhc2UgTklEX3NlY3QyMzNyMTogLyogc2VjdDIzM3IxICg3KSAqLyAKKwkJcmV0dXJuIDc7CisJY2FzZSBOSURfc2VjdDIzOWsxOiAvKiBzZWN0MjM5azEgKDgpICovIAorCQlyZXR1cm4gODsKKwljYXNlIE5JRF9zZWN0MjgzazE6IC8qIHNlY3QyODNrMSAoOSkgKi8KKwkJcmV0dXJuIDk7CisJY2FzZSBOSURfc2VjdDI4M3IxOiAvKiBzZWN0MjgzcjEgKDEwKSAqLyAKKwkJcmV0dXJuIDEwOworCWNhc2UgTklEX3NlY3Q0MDlrMTogLyogc2VjdDQwOWsxICgxMSkgKi8gCisJCXJldHVybiAxMTsKKwljYXNlIE5JRF9zZWN0NDA5cjE6IC8qIHNlY3Q0MDlyMSAoMTIpICovCisJCXJldHVybiAxMjsKKwljYXNlIE5JRF9zZWN0NTcxazE6IC8qIHNlY3Q1NzFrMSAoMTMpICovIAorCQlyZXR1cm4gMTM7CisJY2FzZSBOSURfc2VjdDU3MXIxOiAvKiBzZWN0NTcxcjEgKDE0KSAqLyAKKwkJcmV0dXJuIDE0OworCWNhc2UgTklEX3NlY3AxNjBrMTogLyogc2VjcDE2MGsxICgxNSkgKi8KKwkJcmV0dXJuIDE1OworCWNhc2UgTklEX3NlY3AxNjByMTogLyogc2VjcDE2MHIxICgxNikgKi8gCisJCXJldHVybiAxNjsKKwljYXNlIE5JRF9zZWNwMTYwcjI6IC8qIHNlY3AxNjByMiAoMTcpICovIAorCQlyZXR1cm4gMTc7CisJY2FzZSBOSURfc2VjcDE5MmsxOiAvKiBzZWNwMTkyazEgKDE4KSAqLworCQlyZXR1cm4gMTg7CisJY2FzZSBOSURfWDlfNjJfcHJpbWUxOTJ2MTogLyogc2VjcDE5MnIxICgxOSkgKi8gCisJCXJldHVybiAxOTsKKwljYXNlIE5JRF9zZWNwMjI0azE6IC8qIHNlY3AyMjRrMSAoMjApICovIAorCQlyZXR1cm4gMjA7CisJY2FzZSBOSURfc2VjcDIyNHIxOiAvKiBzZWNwMjI0cjEgKDIxKSAqLworCQlyZXR1cm4gMjE7CisJY2FzZSBOSURfc2VjcDI1NmsxOiAvKiBzZWNwMjU2azEgKDIyKSAqLyAKKwkJcmV0dXJuIDIyOworCWNhc2UgTklEX1g5XzYyX3ByaW1lMjU2djE6IC8qIHNlY3AyNTZyMSAoMjMpICovIAorCQlyZXR1cm4gMjM7CisJY2FzZSBOSURfc2VjcDM4NHIxOiAvKiBzZWNwMzg0cjEgKDI0KSAqLworCQlyZXR1cm4gMjQ7CisJY2FzZSBOSURfc2VjcDUyMXIxOiAgLyogc2VjcDUyMXIxICgyNSkgKi8JCisJCXJldHVybiAyNTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCisKKyNpZm5kZWYgT1BFTlNTTF9OT19UTFNFWFQKK3Vuc2lnbmVkIGNoYXIgKnNzbF9hZGRfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgY2hhciAqbGltaXQpCisJeworCWludCBleHRkYXRhbGVuPTA7CisJdW5zaWduZWQgY2hhciAqcmV0ID0gcDsKKworCS8qIGRvbid0IGFkZCBleHRlbnNpb25zIGZvciBTU0x2MyB1bmxlc3MgZG9pbmcgc2VjdXJlIHJlbmVnb3RpYXRpb24gKi8KKwlpZiAocy0+Y2xpZW50X3ZlcnNpb24gPT0gU1NMM19WRVJTSU9OCisJCQkJCSYmICFzLT5zMy0+c2VuZF9jb25uZWN0aW9uX2JpbmRpbmcpCisJCXJldHVybiBwOworCisJcmV0Kz0yOworCisJaWYgKHJldD49bGltaXQpIHJldHVybiBOVUxMOyAvKiB0aGlzIHJlYWxseSBuZXZlciBvY2N1cnMsIGJ1dCAuLi4gKi8KKworIAlpZiAocy0+dGxzZXh0X2hvc3RuYW1lICE9IE5VTEwpCisJCXsgCisJCS8qIEFkZCBUTFMgZXh0ZW5zaW9uIHNlcnZlcm5hbWUgdG8gdGhlIENsaWVudCBIZWxsbyBtZXNzYWdlICovCisJCXVuc2lnbmVkIGxvbmcgc2l6ZV9zdHI7CisJCWxvbmcgbGVubWF4OyAKKworCQkvKiBjaGVjayBmb3IgZW5vdWdoIHNwYWNlLgorCQkgICA0IGZvciB0aGUgc2VydmVybmFtZSB0eXBlIGFuZCBlbnRlbnNpb24gbGVuZ3RoCisJCSAgIDIgZm9yIHNlcnZlcm5hbWVsaXN0IGxlbmd0aAorCQkgICAxIGZvciB0aGUgaG9zdG5hbWUgdHlwZQorCQkgICAyIGZvciBob3N0bmFtZSBsZW5ndGgKKwkJICAgKyBob3N0bmFtZSBsZW5ndGggCisJCSovCisJCSAgIAorCQlpZiAoKGxlbm1heCA9IGxpbWl0IC0gcmV0IC0gOSkgPCAwIAorCQkgICAgfHwgKHNpemVfc3RyID0gc3RybGVuKHMtPnRsc2V4dF9ob3N0bmFtZSkpID4gKHVuc2lnbmVkIGxvbmcpbGVubWF4KSAKKwkJCXJldHVybiBOVUxMOworCQkJCisJCS8qIGV4dGVuc2lvbiB0eXBlIGFuZCBsZW5ndGggKi8KKwkJczJuKFRMU0VYVF9UWVBFX3NlcnZlcl9uYW1lLHJldCk7IAorCQlzMm4oc2l6ZV9zdHIrNSxyZXQpOworCQkKKwkJLyogbGVuZ3RoIG9mIHNlcnZlcm5hbWUgbGlzdCAqLworCQlzMm4oc2l6ZV9zdHIrMyxyZXQpOworCQorCQkvKiBob3N0bmFtZSB0eXBlLCBsZW5ndGggYW5kIGhvc3RuYW1lICovCisJCSoocmV0KyspID0gKHVuc2lnbmVkIGNoYXIpIFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWU7CisJCXMybihzaXplX3N0cixyZXQpOworCQltZW1jcHkocmV0LCBzLT50bHNleHRfaG9zdG5hbWUsIHNpemVfc3RyKTsKKwkJcmV0Kz1zaXplX3N0cjsKKwkJfQorCisgICAgICAgIC8qIEFkZCBSSSBpZiByZW5lZ290aWF0aW5nICovCisgICAgICAgIGlmIChzLT5uZXdfc2Vzc2lvbikKKyAgICAgICAgICB7CisgICAgICAgICAgaW50IGVsOworICAgICAgICAgIAorICAgICAgICAgIGlmKCFzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dChzLCAwLCAmZWwsIDApKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0xfQUREX0NMSUVOVEhFTExPX1RMU0VYVCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgaWYoKGxpbWl0IC0gcCAtIDQgLSBlbCkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAKKyAgICAgICAgICBzMm4oVExTRVhUX1RZUEVfcmVuZWdvdGlhdGUscmV0KTsKKyAgICAgICAgICBzMm4oZWwscmV0KTsKKworICAgICAgICAgIGlmKCFzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dChzLCByZXQsICZlbCwgZWwpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgIFNTTGVycihTU0xfRl9TU0xfQUREX0NMSUVOVEhFTExPX1RMU0VYVCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgfQorCisgICAgICAgICAgcmV0ICs9IGVsOworICAgICAgICB9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCWlmIChzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgIT0gTlVMTCAmJgorCSAgICBzLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04pCisJCXsKKwkJLyogQWRkIFRMUyBleHRlbnNpb24gRUNQb2ludEZvcm1hdHMgdG8gdGhlIENsaWVudEhlbGxvIG1lc3NhZ2UgKi8KKwkJbG9uZyBsZW5tYXg7IAorCisJCWlmICgobGVubWF4ID0gbGltaXQgLSByZXQgLSA1KSA8IDApIHJldHVybiBOVUxMOyAKKwkJaWYgKHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPiAodW5zaWduZWQgbG9uZylsZW5tYXgpIHJldHVybiBOVUxMOworCQlpZiAocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA+IDI1NSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0xfQUREX0NMSUVOVEhFTExPX1RMU0VYVCwgRVJSX1JfSU5URVJOQUxfRVJST1IpOworCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQorCQlzMm4oVExTRVhUX1RZUEVfZWNfcG9pbnRfZm9ybWF0cyxyZXQpOworCQlzMm4ocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCArIDEscmV0KTsKKwkJKihyZXQrKykgPSAodW5zaWduZWQgY2hhcikgcy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aDsKKwkJbWVtY3B5KHJldCwgcy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0LCBzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKTsKKwkJcmV0Kz1zLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworCQl9CisJaWYgKHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCAhPSBOVUxMICYmCisJICAgIHMtPnZlcnNpb24gIT0gRFRMUzFfVkVSU0lPTikKKwkJeworCQkvKiBBZGQgVExTIGV4dGVuc2lvbiBFbGxpcHRpY0N1cnZlcyB0byB0aGUgQ2xpZW50SGVsbG8gbWVzc2FnZSAqLworCQlsb25nIGxlbm1heDsgCisKKwkJaWYgKChsZW5tYXggPSBsaW1pdCAtIHJldCAtIDYpIDwgMCkgcmV0dXJuIE5VTEw7IAorCQlpZiAocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA+ICh1bnNpZ25lZCBsb25nKWxlbm1heCkgcmV0dXJuIE5VTEw7CisJCWlmIChzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoID4gNjU1MzIpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMX0FERF9DTElFTlRIRUxMT19UTFNFWFQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQkKKwkJczJuKFRMU0VYVF9UWVBFX2VsbGlwdGljX2N1cnZlcyxyZXQpOworCQlzMm4ocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCArIDIsIHJldCk7CisKKwkJLyogTkI6IGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQgdXNlcyBhIG9uZS1ieXRlIHByZWZpeCBmb3IKKwkJICogZWxsaXB0aWNfY3VydmVfbGlzdCwgYnV0IHRoZSBleGFtcGxlcyB1c2UgdHdvIGJ5dGVzLgorCQkgKiBodHRwOi8vd3d3MS5pZXRmLm9yZy9tYWlsLWFyY2hpdmUvd2ViL3Rscy9jdXJyZW50L21zZzAwNTM4Lmh0bWwKKwkJICogcmVzb2x2ZXMgdGhpcyB0byB0d28gYnl0ZXMuCisJCSAqLworCQlzMm4ocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCwgcmV0KTsKKwkJbWVtY3B5KHJldCwgcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0LCBzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoKTsKKwkJcmV0Kz1zLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoOworCQl9CisjZW5kaWYgLyogT1BFTlNTTF9OT19FQyAqLworCisJaWYgKCEoU1NMX2dldF9vcHRpb25zKHMpICYgU1NMX09QX05PX1RJQ0tFVCkpCisJCXsKKwkJaW50IHRpY2tsZW47CisJCWlmICghcy0+bmV3X3Nlc3Npb24gJiYgcy0+c2Vzc2lvbiAmJiBzLT5zZXNzaW9uLT50bHNleHRfdGljaykKKwkJCXRpY2tsZW4gPSBzLT5zZXNzaW9uLT50bHNleHRfdGlja2xlbjsKKwkJZWxzZSBpZiAocy0+c2Vzc2lvbiAmJiBzLT50bHNleHRfc2Vzc2lvbl90aWNrZXQgJiYKKwkJCSBzLT50bHNleHRfc2Vzc2lvbl90aWNrZXQtPmRhdGEpCisJCQl7CisJCQl0aWNrbGVuID0gcy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0LT5sZW5ndGg7CisJCQlzLT5zZXNzaW9uLT50bHNleHRfdGljayA9IE9QRU5TU0xfbWFsbG9jKHRpY2tsZW4pOworCQkJaWYgKCFzLT5zZXNzaW9uLT50bHNleHRfdGljaykKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCW1lbWNweShzLT5zZXNzaW9uLT50bHNleHRfdGljaywKKwkJCSAgICAgICBzLT50bHNleHRfc2Vzc2lvbl90aWNrZXQtPmRhdGEsCisJCQkgICAgICAgdGlja2xlbik7CisJCQlzLT5zZXNzaW9uLT50bHNleHRfdGlja2xlbiA9IHRpY2tsZW47CisJCQl9CisJCWVsc2UKKwkJCXRpY2tsZW4gPSAwOworCQlpZiAodGlja2xlbiA9PSAwICYmIHMtPnRsc2V4dF9zZXNzaW9uX3RpY2tldCAmJgorCQkgICAgcy0+dGxzZXh0X3Nlc3Npb25fdGlja2V0LT5kYXRhID09IE5VTEwpCisJCQlnb3RvIHNraXBfZXh0OworCQkvKiBDaGVjayBmb3IgZW5vdWdoIHJvb20gMiBmb3IgZXh0ZW5zaW9uIHR5cGUsIDIgZm9yIGxlbgorIAkJICogcmVzdCBmb3IgdGlja2V0CisgIAkJICovCisJCWlmICgobG9uZykobGltaXQgLSByZXQgLSA0IC0gdGlja2xlbikgPCAwKSByZXR1cm4gTlVMTDsKKwkJczJuKFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0LHJldCk7IAorCQlzMm4odGlja2xlbixyZXQpOworCQlpZiAodGlja2xlbikKKwkJCXsKKwkJCW1lbWNweShyZXQsIHMtPnNlc3Npb24tPnRsc2V4dF90aWNrLCB0aWNrbGVuKTsKKwkJCXJldCArPSB0aWNrbGVuOworCQkJfQorCQl9CisJCXNraXBfZXh0OgorCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorCWlmIChzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCAmJgorCSAgICBzLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04pCisJCXsKKwkJc2l6ZV90IGNvbCA9IHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dF9sZW47CisJCQorCQlpZiAoKGxvbmcpKGxpbWl0IC0gcmV0IC0gNiAtIGNvbCA8IDApKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChjb2wgPiAweEZGRkQpIC8qIGNhbid0IGhhcHBlbiAqLworCQkJcmV0dXJuIE5VTEw7CisKKwkJczJuKFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQsIHJldCk7IAorCQlzMm4oY29sICsgMiwgcmV0KTsKKwkJczJuKGNvbCwgcmV0KTsKKwkJbWVtY3B5KHJldCwgcy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0LCBjb2wpOworCQlyZXQgKz0gY29sOworCQl9CisjZW5kaWYKKworCWlmIChzLT50bHNleHRfc3RhdHVzX3R5cGUgPT0gVExTRVhUX1NUQVRVU1RZUEVfb2NzcCAmJgorCSAgICBzLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04pCisJCXsKKwkJaW50IGk7CisJCWxvbmcgZXh0bGVuLCBpZGxlbiwgaXRtcDsKKwkJT0NTUF9SRVNQSUQgKmlkOworCisJCWlkbGVuID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHNrX09DU1BfUkVTUElEX251bShzLT50bHNleHRfb2NzcF9pZHMpOyBpKyspCisJCQl7CisJCQlpZCA9IHNrX09DU1BfUkVTUElEX3ZhbHVlKHMtPnRsc2V4dF9vY3NwX2lkcywgaSk7CisJCQlpdG1wID0gaTJkX09DU1BfUkVTUElEKGlkLCBOVUxMKTsKKwkJCWlmIChpdG1wIDw9IDApCisJCQkJcmV0dXJuIE5VTEw7CisJCQlpZGxlbiArPSBpdG1wICsgMjsKKwkJCX0KKworCQlpZiAocy0+dGxzZXh0X29jc3BfZXh0cykKKwkJCXsKKwkJCWV4dGxlbiA9IGkyZF9YNTA5X0VYVEVOU0lPTlMocy0+dGxzZXh0X29jc3BfZXh0cywgTlVMTCk7CisJCQlpZiAoZXh0bGVuIDwgMCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJZWxzZQorCQkJZXh0bGVuID0gMDsKKwkJCQorCQlpZiAoKGxvbmcpKGxpbWl0IC0gcmV0IC0gNyAtIGV4dGxlbiAtIGlkbGVuKSA8IDApIHJldHVybiBOVUxMOworCQlzMm4oVExTRVhUX1RZUEVfc3RhdHVzX3JlcXVlc3QsIHJldCk7CisJCWlmIChleHRsZW4gKyBpZGxlbiA+IDB4RkZGMCkKKwkJCXJldHVybiBOVUxMOworCQlzMm4oZXh0bGVuICsgaWRsZW4gKyA1LCByZXQpOworCQkqKHJldCsrKSA9IFRMU0VYVF9TVEFUVVNUWVBFX29jc3A7CisJCXMybihpZGxlbiwgcmV0KTsKKwkJZm9yIChpID0gMDsgaSA8IHNrX09DU1BfUkVTUElEX251bShzLT50bHNleHRfb2NzcF9pZHMpOyBpKyspCisJCQl7CisJCQkvKiBzYXZlIHBvc2l0aW9uIG9mIGlkIGxlbiAqLworCQkJdW5zaWduZWQgY2hhciAqcSA9IHJldDsKKwkJCWlkID0gc2tfT0NTUF9SRVNQSURfdmFsdWUocy0+dGxzZXh0X29jc3BfaWRzLCBpKTsKKwkJCS8qIHNraXAgb3ZlciBpZCBsZW4gKi8KKwkJCXJldCArPSAyOworCQkJaXRtcCA9IGkyZF9PQ1NQX1JFU1BJRChpZCwgJnJldCk7CisJCQkvKiB3cml0ZSBpZCBsZW4gKi8KKwkJCXMybihpdG1wLCBxKTsKKwkJCX0KKwkJczJuKGV4dGxlbiwgcmV0KTsKKwkJaWYgKGV4dGxlbiA+IDApCisJCQlpMmRfWDUwOV9FWFRFTlNJT05TKHMtPnRsc2V4dF9vY3NwX2V4dHMsICZyZXQpOworCQl9CisKKwlpZiAoKGV4dGRhdGFsZW4gPSByZXQtcC0yKT09IDApIAorCQlyZXR1cm4gcDsKKworCXMybihleHRkYXRhbGVuLHApOworCXJldHVybiByZXQ7CisJfQorCit1bnNpZ25lZCBjaGFyICpzc2xfYWRkX3NlcnZlcmhlbGxvX3Rsc2V4dChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKnAsIHVuc2lnbmVkIGNoYXIgKmxpbWl0KQorCXsKKwlpbnQgZXh0ZGF0YWxlbj0wOworCXVuc2lnbmVkIGNoYXIgKnJldCA9IHA7CisKKwkvKiBkb24ndCBhZGQgZXh0ZW5zaW9ucyBmb3IgU1NMdjMsIHVubGVzcyBkb2luZyBzZWN1cmUgcmVuZWdvdGlhdGlvbiAqLworCWlmIChzLT52ZXJzaW9uID09IFNTTDNfVkVSU0lPTiAmJiAhcy0+czMtPnNlbmRfY29ubmVjdGlvbl9iaW5kaW5nKQorCQlyZXR1cm4gcDsKKwkKKwlyZXQrPTI7CisJaWYgKHJldD49bGltaXQpIHJldHVybiBOVUxMOyAvKiB0aGlzIHJlYWxseSBuZXZlciBvY2N1cnMsIGJ1dCAuLi4gKi8KKworCWlmICghcy0+aGl0ICYmIHMtPnNlcnZlcm5hbWVfZG9uZSA9PSAxICYmIHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSAhPSBOVUxMKQorCQl7IAorCQlpZiAoKGxvbmcpKGxpbWl0IC0gcmV0IC0gNCkgPCAwKSByZXR1cm4gTlVMTDsgCisKKwkJczJuKFRMU0VYVF9UWVBFX3NlcnZlcl9uYW1lLHJldCk7CisJCXMybigwLHJldCk7CisJCX0KKworCWlmKHMtPnMzLT5zZW5kX2Nvbm5lY3Rpb25fYmluZGluZykKKyAgICAgICAgeworICAgICAgICAgIGludCBlbDsKKyAgICAgICAgICAKKyAgICAgICAgICBpZighc3NsX2FkZF9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQocywgMCwgJmVsLCAwKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMX0FERF9TRVJWRVJIRUxMT19UTFNFWFQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgIGlmKChsaW1pdCAtIHAgLSA0IC0gZWwpIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgICAgICAgCisgICAgICAgICAgczJuKFRMU0VYVF9UWVBFX3JlbmVnb3RpYXRlLHJldCk7CisgICAgICAgICAgczJuKGVsLHJldCk7CisKKyAgICAgICAgICBpZighc3NsX2FkZF9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQocywgcmV0LCAmZWwsIGVsKSkKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMX0FERF9TRVJWRVJIRUxMT19UTFNFWFQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgIHJldCArPSBlbDsKKyAgICAgICAgfQorCisjaWZuZGVmIE9QRU5TU0xfTk9fRUMKKwlpZiAocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ICE9IE5VTEwgJiYKKwkgICAgcy0+dmVyc2lvbiAhPSBEVExTMV9WRVJTSU9OKQorCQl7CisJCS8qIEFkZCBUTFMgZXh0ZW5zaW9uIEVDUG9pbnRGb3JtYXRzIHRvIHRoZSBTZXJ2ZXJIZWxsbyBtZXNzYWdlICovCisJCWxvbmcgbGVubWF4OyAKKworCQlpZiAoKGxlbm1heCA9IGxpbWl0IC0gcmV0IC0gNSkgPCAwKSByZXR1cm4gTlVMTDsgCisJCWlmIChzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoID4gKHVuc2lnbmVkIGxvbmcpbGVubWF4KSByZXR1cm4gTlVMTDsKKwkJaWYgKHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPiAyNTUpCisJCQl7CisJCQlTU0xlcnIoU1NMX0ZfU1NMX0FERF9TRVJWRVJIRUxMT19UTFNFWFQsIEVSUl9SX0lOVEVSTkFMX0VSUk9SKTsKKwkJCXJldHVybiBOVUxMOworCQkJfQorCQkKKwkJczJuKFRMU0VYVF9UWVBFX2VjX3BvaW50X2Zvcm1hdHMscmV0KTsKKwkJczJuKHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggKyAxLHJldCk7CisJCSoocmV0KyspID0gKHVuc2lnbmVkIGNoYXIpIHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGg7CisJCW1lbWNweShyZXQsIHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCwgcy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCk7CisJCXJldCs9cy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aDsKKworCQl9CisJLyogQ3VycmVudGx5IHRoZSBzZXJ2ZXIgc2hvdWxkIG5vdCByZXNwb25kIHdpdGggYSBTdXBwb3J0ZWRDdXJ2ZXMgZXh0ZW5zaW9uICovCisjZW5kaWYgLyogT1BFTlNTTF9OT19FQyAqLworCisJaWYgKHMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQKKwkJJiYgIShTU0xfZ2V0X29wdGlvbnMocykgJiBTU0xfT1BfTk9fVElDS0VUKSkgCisJCXsgCisJCWlmICgobG9uZykobGltaXQgLSByZXQgLSA0KSA8IDApIHJldHVybiBOVUxMOyAKKwkJczJuKFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0LHJldCk7CisJCXMybigwLHJldCk7CisJCX0KKworCWlmIChzLT50bHNleHRfc3RhdHVzX2V4cGVjdGVkKQorCQl7IAorCQlpZiAoKGxvbmcpKGxpbWl0IC0gcmV0IC0gNCkgPCAwKSByZXR1cm4gTlVMTDsgCisJCXMybihUTFNFWFRfVFlQRV9zdGF0dXNfcmVxdWVzdCxyZXQpOworCQlzMm4oMCxyZXQpOworCQl9CisKKyNpZmRlZiBUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0CisJaWYgKHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dCAhPSBOVUxMICYmCisJICAgIHMtPnZlcnNpb24gIT0gRFRMUzFfVkVSU0lPTikKKwkJeworCQlzaXplX3Qgc29sID0gcy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0X2xlbjsKKwkJCisJCWlmICgobG9uZykobGltaXQgLSByZXQgLSA2IC0gc29sKSA8IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJaWYgKHNvbCA+IDB4RkZGRCkgLyogY2FuJ3QgaGFwcGVuICovCisJCQlyZXR1cm4gTlVMTDsKKworCQlzMm4oVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dCwgcmV0KTsgCisJCXMybihzb2wgKyAyLCByZXQpOworCQlzMm4oc29sLCByZXQpOworCQltZW1jcHkocmV0LCBzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQsIHNvbCk7CisJCXJldCArPSBzb2w7CisJCX0KKyNlbmRpZgorCWlmICgoKHMtPnMzLT50bXAubmV3X2NpcGhlci0+aWQgJiAweEZGRkYpPT0weDgwIHx8IChzLT5zMy0+dG1wLm5ld19jaXBoZXItPmlkICYgMHhGRkZGKT09MHg4MSkgCisJCSYmIChTU0xfZ2V0X29wdGlvbnMocykgJiBTU0xfT1BfQ1JZUFRPUFJPX1RMU0VYVF9CVUcpKQorCQl7IGNvbnN0IHVuc2lnbmVkIGNoYXIgY3J5cHRvcHJvX2V4dFszNl0gPSB7CisJCQkweGZkLCAweGU4LCAvKjY1MDAwKi8KKwkJCTB4MDAsIDB4MjAsIC8qMzIgYnl0ZXMgbGVuZ3RoKi8KKwkJCTB4MzAsIDB4MWUsIDB4MzAsIDB4MDgsIDB4MDYsIDB4MDYsIDB4MmEsIDB4ODUsIAorCQkJMHgwMywgICAweDAyLCAweDAyLCAweDA5LCAweDMwLCAweDA4LCAweDA2LCAweDA2LCAKKwkJCTB4MmEsIDB4ODUsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MTYsIDB4MzAsIDB4MDgsIAorCQkJMHgwNiwgMHgwNiwgMHgyYSwgMHg4NSwgMHgwMywgMHgwMiwgMHgwMiwgMHgxN307CisJCQlpZiAobGltaXQtcmV0PDM2KSByZXR1cm4gTlVMTDsKKwkJCW1lbWNweShyZXQsY3J5cHRvcHJvX2V4dCwzNik7CisJCQlyZXQrPTM2OworCisJCX0KKworCWlmICgoZXh0ZGF0YWxlbiA9IHJldC1wLTIpPT0gMCkgCisJCXJldHVybiBwOworCisJczJuKGV4dGRhdGFsZW4scCk7CisJcmV0dXJuIHJldDsKKwl9CisKK2ludCBzc2xfcGFyc2VfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcywgdW5zaWduZWQgY2hhciAqKnAsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBuLCBpbnQgKmFsKQorCXsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCXVuc2lnbmVkIHNob3J0IHNpemU7CisJdW5zaWduZWQgc2hvcnQgbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSAqcDsKKwlpbnQgcmVuZWdvdGlhdGVfc2VlbiA9IDA7CisKKwlzLT5zZXJ2ZXJuYW1lX2RvbmUgPSAwOworCXMtPnRsc2V4dF9zdGF0dXNfdHlwZSA9IC0xOworCisJaWYgKGRhdGEgPj0gKGQrbi0yKSkKKwkJZ290byByaV9jaGVjazsKKwluMnMoZGF0YSxsZW4pOworCisJaWYgKGRhdGEgPiAoZCtuLWxlbikpIAorCQlnb3RvIHJpX2NoZWNrOworCisJd2hpbGUgKGRhdGEgPD0gKGQrbi00KSkKKwkJeworCQluMnMoZGF0YSx0eXBlKTsKKwkJbjJzKGRhdGEsc2l6ZSk7CisKKwkJaWYgKGRhdGErc2l6ZSA+IChkK24pKQorCSAgIAkJZ290byByaV9jaGVjazsKKyNpZiAwCisJCWZwcmludGYoc3RkZXJyLCJSZWNlaXZlZCBleHRlbnNpb24gdHlwZSAlZCBzaXplICVkXG4iLHR5cGUsc2l6ZSk7CisjZW5kaWYKKwkJaWYgKHMtPnRsc2V4dF9kZWJ1Z19jYikKKwkJCXMtPnRsc2V4dF9kZWJ1Z19jYihzLCAwLCB0eXBlLCBkYXRhLCBzaXplLAorCQkJCQkJcy0+dGxzZXh0X2RlYnVnX2FyZyk7CisvKiBUaGUgc2VydmVybmFtZSBleHRlbnNpb24gaXMgdHJlYXRlZCBhcyBmb2xsb3dzOgorCisgICAtIE9ubHkgdGhlIGhvc3RuYW1lIHR5cGUgaXMgc3VwcG9ydGVkIHdpdGggYSBtYXhpbXVtIGxlbmd0aCBvZiAyNTUuCisgICAtIFRoZSBzZXJ2ZXJuYW1lIGlzIHJlamVjdGVkIGlmIHRvbyBsb25nIG9yIGlmIGl0IGNvbnRhaW5zIHplcm9zLAorICAgICBpbiB3aGljaCBjYXNlIGFuIGZhdGFsIGFsZXJ0IGlzIGdlbmVyYXRlZC4KKyAgIC0gVGhlIHNlcnZlcm5hbWUgZmllbGQgaXMgbWFpbnRhaW5lZCB0b2dldGhlciB3aXRoIHRoZSBzZXNzaW9uIGNhY2hlLgorICAgLSBXaGVuIGEgc2Vzc2lvbiBpcyByZXN1bWVkLCB0aGUgc2VydmVybmFtZSBjYWxsIGJhY2sgaW52b2tlZCBpbiBvcmRlcgorICAgICB0byBhbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gcG9zaXRpb24gaXRzZWxmIHRvIHRoZSByaWdodCBjb250ZXh0LiAKKyAgIC0gVGhlIHNlcnZlcm5hbWUgaXMgYWNrbm93bGVkZ2VkIGlmIGl0IGlzIG5ldyBmb3IgYSBzZXNzaW9uIG9yIHdoZW4gCisgICAgIGl0IGlzIGlkZW50aWNhbCB0byBhIHByZXZpb3VzbHkgdXNlZCBmb3IgdGhlIHNhbWUgc2Vzc2lvbi4gCisgICAgIEFwcGxpY2F0aW9ucyBjYW4gY29udHJvbCB0aGUgYmVoYXZpb3VyLiAgVGhleSBjYW4gYXQgYW55IHRpbWUKKyAgICAgc2V0IGEgJ2Rlc2lyYWJsZScgc2VydmVybmFtZSBmb3IgYSBuZXcgU1NMIG9iamVjdC4gVGhpcyBjYW4gYmUgdGhlCisgICAgIGNhc2UgZm9yIGV4YW1wbGUgd2l0aCBIVFRQUyB3aGVuIGEgSG9zdDogaGVhZGVyIGZpZWxkIGlzIHJlY2VpdmVkIGFuZAorICAgICBhIHJlbmVnb3RpYXRpb24gaXMgcmVxdWVzdGVkLiBJbiB0aGlzIGNhc2UsIGEgcG9zc2libGUgc2VydmVybmFtZQorICAgICBwcmVzZW50ZWQgaW4gdGhlIG5ldyBjbGllbnQgaGVsbG8gaXMgb25seSBhY2tub3dsZWRnZWQgaWYgaXQgbWF0Y2hlcworICAgICB0aGUgdmFsdWUgb2YgdGhlIEhvc3Q6IGZpZWxkLiAKKyAgIC0gQXBwbGljYXRpb25zIG11c3QgIHVzZSBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04KKyAgICAgaWYgdGhleSBwcm92aWRlIGZvciBjaGFuZ2luZyBhbiBleHBsaWNpdCBzZXJ2ZXJuYW1lIGNvbnRleHQgZm9yIHRoZSBzZXNzaW9uLAorICAgICBpLmUuIHdoZW4gdGhlIHNlc3Npb24gaGFzIGJlZW4gZXN0YWJsaXNoZWQgd2l0aCBhIHNlcnZlcm5hbWUgZXh0ZW5zaW9uLiAKKyAgIC0gT24gc2Vzc2lvbiByZWNvbm5lY3QsIHRoZSBzZXJ2ZXJuYW1lIGV4dGVuc2lvbiBtYXkgYmUgYWJzZW50LiAKKworKi8gICAgICAKKworCQlpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9zZXJ2ZXJfbmFtZSkKKwkJCXsKKwkJCXVuc2lnbmVkIGNoYXIgKnNkYXRhOworCQkJaW50IHNlcnZuYW1lX3R5cGU7CisJCQlpbnQgZHNpemU7IAorCQkKKwkJCWlmIChzaXplIDwgMikgCisJCQkJeworCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJbjJzKGRhdGEsZHNpemUpOyAgCisJCQlzaXplIC09IDI7CisJCQlpZiAoZHNpemUgPiBzaXplICApIAorCQkJCXsKKwkJCQkqYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOworCQkJCXJldHVybiAwOworCQkJCX0gCisKKwkJCXNkYXRhID0gZGF0YTsKKwkJCXdoaWxlIChkc2l6ZSA+IDMpIAorCQkJCXsKKwkgCQkJc2Vydm5hbWVfdHlwZSA9ICooc2RhdGErKyk7IAorCQkJCW4ycyhzZGF0YSxsZW4pOworCQkJCWRzaXplIC09IDM7CisKKwkJCQlpZiAobGVuID4gZHNpemUpIAorCQkJCQl7CisJCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJaWYgKHMtPnNlcnZlcm5hbWVfZG9uZSA9PSAwKQorCQkJCXN3aXRjaCAoc2Vydm5hbWVfdHlwZSkKKwkJCQkJeworCQkJCWNhc2UgVExTRVhUX05BTUVUWVBFX2hvc3RfbmFtZToKKwkJCQkJaWYgKCFzLT5oaXQpCisJCQkJCQl7CisJCQkJCQlpZihzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUpCisJCQkJCQkJeworCQkJCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJCQkJcmV0dXJuIDA7CisJCQkJCQkJfQorCQkJCQkJaWYgKGxlbiA+IFRMU0VYVF9NQVhMRU5faG9zdF9uYW1lKQorCQkJCQkJCXsKKwkJCQkJCQkqYWwgPSBUTFMxX0FEX1VOUkVDT0dOSVpFRF9OQU1FOworCQkJCQkJCXJldHVybiAwOworCQkJCQkJCX0KKwkJCQkJCWlmICgocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lID0gT1BFTlNTTF9tYWxsb2MobGVuKzEpKSA9PSBOVUxMKQorCQkJCQkJCXsKKwkJCQkJCQkqYWwgPSBUTFMxX0FEX0lOVEVSTkFMX0VSUk9SOworCQkJCQkJCXJldHVybiAwOworCQkJCQkJCX0KKwkJCQkJCW1lbWNweShzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUsIHNkYXRhLCBsZW4pOworCQkJCQkJcy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lW2xlbl09J1wwJzsKKwkJCQkJCWlmIChzdHJsZW4ocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKSAhPSBsZW4pIHsKKwkJCQkJCQlPUEVOU1NMX2ZyZWUocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKTsKKwkJCQkJCQlzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPSBOVUxMOworCQkJCQkJCSphbCA9IFRMUzFfQURfVU5SRUNPR05JWkVEX05BTUU7CisJCQkJCQkJcmV0dXJuIDA7CisJCQkJCQl9CisJCQkJCQlzLT5zZXJ2ZXJuYW1lX2RvbmUgPSAxOyAKKworCQkJCQkJfQorCQkJCQllbHNlIAorCQkJCQkJcy0+c2VydmVybmFtZV9kb25lID0gcy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lCisJCQkJCQkJJiYgc3RybGVuKHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSkgPT0gbGVuIAorCQkJCQkJCSYmIHN0cm5jbXAocy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lLCAoY2hhciAqKXNkYXRhLCBsZW4pID09IDA7CisJCQkJCQorCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJIAorCQkJCWRzaXplIC09IGxlbjsKKwkJCQl9CisJCQlpZiAoZHNpemUgIT0gMCkgCisJCQkJeworCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCQllbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX2VjX3BvaW50X2Zvcm1hdHMgJiYKKwkgICAgICAgICAgICAgcy0+dmVyc2lvbiAhPSBEVExTMV9WRVJTSU9OKQorCQkJeworCQkJdW5zaWduZWQgY2hhciAqc2RhdGEgPSBkYXRhOworCQkJaW50IGVjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA9ICooc2RhdGErKyk7CisKKwkJCWlmIChlY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggIT0gc2l6ZSAtIDEpCisJCQkJeworCQkJCSphbCA9IFRMUzFfQURfREVDT0RFX0VSUk9SOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWlmICghcy0+aGl0KQorCQkJCXsKKwkJCQlpZihzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QpCisJCQkJCXsKKwkJCQkJKmFsID0gVExTMV9BRF9ERUNPREVfRVJST1I7CisJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJcy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA9IDA7CisJCQkJaWYgKChzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgPSBPUEVOU1NMX21hbGxvYyhlY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGgpKSA9PSBOVUxMKQorCQkJCQl7CisJCQkJCSphbCA9IFRMUzFfQURfSU5URVJOQUxfRVJST1I7CisJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJcy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA9IGVjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aDsKKwkJCQltZW1jcHkocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0LCBzZGF0YSwgZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKTsKKwkJCQl9CisjaWYgMAorCQkJZnByaW50ZihzdGRlcnIsInNzbF9wYXJzZV9jbGllbnRoZWxsb190bHNleHQgcy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0IChsZW5ndGg9JWkpICIsIHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGgpOworCQkJc2RhdGEgPSBzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3Q7CisJCQlmb3IgKGkgPSAwOyBpIDwgcy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aDsgaSsrKQorCQkJCWZwcmludGYoc3RkZXJyLCIlaSAiLCooc2RhdGErKykpOworCQkJZnByaW50ZihzdGRlcnIsIlxuIik7CisjZW5kaWYKKwkJCX0KKwkJZWxzZSBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9lbGxpcHRpY19jdXJ2ZXMgJiYKKwkgICAgICAgICAgICAgcy0+dmVyc2lvbiAhPSBEVExTMV9WRVJTSU9OKQorCQkJeworCQkJdW5zaWduZWQgY2hhciAqc2RhdGEgPSBkYXRhOworCQkJaW50IGVsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA9ICgqKHNkYXRhKyspIDw8IDgpOworCQkJZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoICs9ICgqKHNkYXRhKyspKTsKKworCQkJaWYgKGVsbGlwdGljY3VydmVsaXN0X2xlbmd0aCAhPSBzaXplIC0gMikKKwkJCQl7CisJCQkJKmFsID0gVExTMV9BRF9ERUNPREVfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJaWYgKCFzLT5oaXQpCisJCQkJeworCQkJCWlmKHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCkKKwkJCQkJeworCQkJCQkqYWwgPSBUTFMxX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQlzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoID0gMDsKKwkJCQlpZiAoKHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCA9IE9QRU5TU0xfbWFsbG9jKGVsbGlwdGljY3VydmVsaXN0X2xlbmd0aCkpID09IE5VTEwpCisJCQkJCXsKKwkJCQkJKmFsID0gVExTMV9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQlzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoID0gZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoOworCQkJCW1lbWNweShzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QsIHNkYXRhLCBlbGxpcHRpY2N1cnZlbGlzdF9sZW5ndGgpOworCQkJCX0KKyNpZiAwCisJCQlmcHJpbnRmKHN0ZGVyciwic3NsX3BhcnNlX2NsaWVudGhlbGxvX3Rsc2V4dCBzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3QgKGxlbmd0aD0laSkgIiwgcy0+c2Vzc2lvbi0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCk7CisJCQlzZGF0YSA9IHMtPnNlc3Npb24tPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdDsKKwkJCWZvciAoaSA9IDA7IGkgPCBzLT5zZXNzaW9uLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoOyBpKyspCisJCQkJZnByaW50ZihzdGRlcnIsIiVpICIsKihzZGF0YSsrKSk7CisJCQlmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyNlbmRpZgorCQkJfQorI2VuZGlmIC8qIE9QRU5TU0xfTk9fRUMgKi8KKyNpZmRlZiBUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0CisJCWVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dCAmJgorCSAgICAgICAgICAgICBzLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04pCisJCQl7CisJCQl1bnNpZ25lZCBjaGFyICpzZGF0YSA9IGRhdGE7CisKKwkJCWlmIChzaXplIDwgMikKKwkJCQl7CisJCQkJKmFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQluMnMoc2RhdGEsIHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dF9sZW4pOworCQkJaWYgKHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dF9sZW4gIT0gc2l6ZSAtIDIpCisJCQkJeworCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQlpZiAocy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpIC8qIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuICovCisJCQkJT1BFTlNTTF9mcmVlKHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dCk7CisJCQlpZiAocy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0X2xlbiA9PSAwKQorCQkJCXMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dCA9IE9QRU5TU0xfbWFsbG9jKDEpOyAvKiBkdW1teSBieXRlIGp1c3QgdG8gZ2V0IG5vbi1OVUxMICovCisJCQllbHNlCisJCQkJcy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0ID0gQlVGX21lbWR1cChzZGF0YSwgcy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0X2xlbik7CisJCQlpZiAocy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0ID09IE5VTEwpCisJCQkJeworCQkJCSphbCA9IFRMUzFfQURfSU5URVJOQUxfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorI2VuZGlmCisJCWVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfc2Vzc2lvbl90aWNrZXQpCisJCQl7CisJCQlpZiAocy0+dGxzX3Nlc3Npb25fdGlja2V0X2V4dF9jYiAmJgorCQkJICAgICFzLT50bHNfc2Vzc2lvbl90aWNrZXRfZXh0X2NiKHMsIGRhdGEsIHNpemUsIHMtPnRsc19zZXNzaW9uX3RpY2tldF9leHRfY2JfYXJnKSkKKwkJCQl7CisJCQkJKmFsID0gVExTMV9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCWVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfcmVuZWdvdGlhdGUpCisJCQl7CisJCQlpZighc3NsX3BhcnNlX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dChzLCBkYXRhLCBzaXplLCBhbCkpCisJCQkJcmV0dXJuIDA7CisJCQlyZW5lZ290aWF0ZV9zZWVuID0gMTsKKwkJCX0KKwkJZWxzZSBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9zdGF0dXNfcmVxdWVzdCAmJgorCQkgICAgICAgICBzLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04gJiYgcy0+Y3R4LT50bHNleHRfc3RhdHVzX2NiKQorCQkJeworCQkKKwkJCWlmIChzaXplIDwgNSkgCisJCQkJeworCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQlzLT50bHNleHRfc3RhdHVzX3R5cGUgPSAqZGF0YSsrOworCQkJc2l6ZS0tOworCQkJaWYgKHMtPnRsc2V4dF9zdGF0dXNfdHlwZSA9PSBUTFNFWFRfU1RBVFVTVFlQRV9vY3NwKQorCQkJCXsKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZGF0YTsKKwkJCQlpbnQgZHNpemU7CisJCQkJLyogUmVhZCBpbiByZXNwb25kZXJfaWRfbGlzdCAqLworCQkJCW4ycyhkYXRhLGRzaXplKTsKKwkJCQlzaXplIC09IDI7CisJCQkJaWYgKGRzaXplID4gc2l6ZSAgKSAKKwkJCQkJeworCQkJCQkqYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOworCQkJCQlyZXR1cm4gMDsKKwkJCQkJfQorCQkJCXdoaWxlIChkc2l6ZSA+IDApCisJCQkJCXsKKwkJCQkJT0NTUF9SRVNQSUQgKmlkOworCQkJCQlpbnQgaWRzaXplOworCQkJCQlpZiAoZHNpemUgPCA0KQorCQkJCQkJeworCQkJCQkJKmFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQkJCXJldHVybiAwOworCQkJCQkJfQorCQkJCQluMnMoZGF0YSwgaWRzaXplKTsKKwkJCQkJZHNpemUgLT0gMiArIGlkc2l6ZTsKKwkJCQkJaWYgKGRzaXplIDwgMCkKKwkJCQkJCXsKKwkJCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJCX0KKwkJCQkJc2RhdGEgPSBkYXRhOworCQkJCQlkYXRhICs9IGlkc2l6ZTsKKwkJCQkJaWQgPSBkMmlfT0NTUF9SRVNQSUQoTlVMTCwKKwkJCQkJCQkJJnNkYXRhLCBpZHNpemUpOworCQkJCQlpZiAoIWlkKQorCQkJCQkJeworCQkJCQkJKmFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQkJCXJldHVybiAwOworCQkJCQkJfQorCQkJCQlpZiAoZGF0YSAhPSBzZGF0YSkKKwkJCQkJCXsKKwkJCQkJCU9DU1BfUkVTUElEX2ZyZWUoaWQpOworCQkJCQkJKmFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQkJCXJldHVybiAwOworCQkJCQkJfQorCQkJCQlpZiAoIXMtPnRsc2V4dF9vY3NwX2lkcworCQkJCQkJJiYgIShzLT50bHNleHRfb2NzcF9pZHMgPQorCQkJCQkJc2tfT0NTUF9SRVNQSURfbmV3X251bGwoKSkpCisJCQkJCQl7CisJCQkJCQlPQ1NQX1JFU1BJRF9mcmVlKGlkKTsKKwkJCQkJCSphbCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCQkJCXJldHVybiAwOworCQkJCQkJfQorCQkJCQlpZiAoIXNrX09DU1BfUkVTUElEX3B1c2goCisJCQkJCQkJcy0+dGxzZXh0X29jc3BfaWRzLCBpZCkpCisJCQkJCQl7CisJCQkJCQlPQ1NQX1JFU1BJRF9mcmVlKGlkKTsKKwkJCQkJCSphbCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCQkJCXJldHVybiAwOworCQkJCQkJfQorCQkJCQl9CisKKwkJCQkvKiBSZWFkIGluIHJlcXVlc3RfZXh0ZW5zaW9ucyAqLworCQkJCW4ycyhkYXRhLGRzaXplKTsKKwkJCQlzaXplIC09IDI7CisJCQkJaWYgKGRzaXplID4gc2l6ZSkgCisJCQkJCXsKKwkJCQkJKmFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQlzZGF0YSA9IGRhdGE7CisJCQkJaWYgKGRzaXplID4gMCkKKwkJCQkJeworCQkJCQlzLT50bHNleHRfb2NzcF9leHRzID0KKwkJCQkJCWQyaV9YNTA5X0VYVEVOU0lPTlMoTlVMTCwKKwkJCQkJCQkmc2RhdGEsIGRzaXplKTsKKwkJCQkJaWYgKCFzLT50bHNleHRfb2NzcF9leHRzCisJCQkJCQl8fCAoZGF0YSArIGRzaXplICE9IHNkYXRhKSkKKwkJCQkJCXsKKwkJCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBXZSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCBhbnkgb3RoZXIgdHlwZQorIAkJCSAJKiBzbyBpZ25vcmUgaXQuCisgCQkJIAkqLworCQkJCWVsc2UKKwkJCQkJcy0+dGxzZXh0X3N0YXR1c190eXBlID0gLTE7CisJCQl9CisKKwkJLyogc2Vzc2lvbiB0aWNrZXQgcHJvY2Vzc2VkIGVhcmxpZXIgKi8KKwkJZGF0YSs9c2l6ZTsKKwkJfQorCQkJCQorCSpwID0gZGF0YTsKKworCXJpX2NoZWNrOgorCisJLyogTmVlZCBSSSBpZiByZW5lZ290aWF0aW5nICovCisKKwlpZiAoIXJlbmVnb3RpYXRlX3NlZW4gJiYgcy0+bmV3X3Nlc3Npb24gJiYKKwkJIShzLT5vcHRpb25zICYgU1NMX09QX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTikpCisJCXsKKwkJKmFsID0gU1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworCSAJU1NMZXJyKFNTTF9GX1NTTF9QQVJTRV9DTElFTlRIRUxMT19UTFNFWFQsCisJCQkJU1NMX1JfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OX0RJU0FCTEVEKTsKKwkJcmV0dXJuIDA7CisJCX0KKworCXJldHVybiAxOworCX0KKworaW50IHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb190bHNleHQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICoqcCwgdW5zaWduZWQgY2hhciAqZCwgaW50IG4sIGludCAqYWwpCisJeworCXVuc2lnbmVkIHNob3J0IHR5cGU7CisJdW5zaWduZWQgc2hvcnQgc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBsZW47ICAKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gKnA7CisJaW50IHRsc2V4dF9zZXJ2ZXJuYW1lID0gMDsKKwlpbnQgcmVuZWdvdGlhdGVfc2VlbiA9IDA7CisKKwlpZiAoZGF0YSA+PSAoZCtuLTIpKQorCQlnb3RvIHJpX2NoZWNrOworCisJbjJzKGRhdGEsbGVuKTsKKworCXdoaWxlKGRhdGEgPD0gKGQrbi00KSkKKwkJeworCQluMnMoZGF0YSx0eXBlKTsKKwkJbjJzKGRhdGEsc2l6ZSk7CisKKwkJaWYgKGRhdGErc2l6ZSA+IChkK24pKQorCSAgIAkJZ290byByaV9jaGVjazsKKworCQlpZiAocy0+dGxzZXh0X2RlYnVnX2NiKQorCQkJcy0+dGxzZXh0X2RlYnVnX2NiKHMsIDEsIHR5cGUsIGRhdGEsIHNpemUsCisJCQkJCQlzLT50bHNleHRfZGVidWdfYXJnKTsKKworCQlpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9zZXJ2ZXJfbmFtZSkKKwkJCXsKKwkJCWlmIChzLT50bHNleHRfaG9zdG5hbWUgPT0gTlVMTCB8fCBzaXplID4gMCkKKwkJCQl7CisJCQkJKmFsID0gVExTMV9BRF9VTlJFQ09HTklaRURfTkFNRTsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl0bHNleHRfc2VydmVybmFtZSA9IDE7ICAgCisJCQl9CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCQllbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX2VjX3BvaW50X2Zvcm1hdHMgJiYKKwkgICAgICAgICAgICAgcy0+dmVyc2lvbiAhPSBEVExTMV9WRVJTSU9OKQorCQkJeworCQkJdW5zaWduZWQgY2hhciAqc2RhdGEgPSBkYXRhOworCQkJaW50IGVjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA9ICooc2RhdGErKyk7CisKKwkJCWlmIChlY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggIT0gc2l6ZSAtIDEpCisJCQkJeworCQkJCSphbCA9IFRMUzFfQURfREVDT0RFX0VSUk9SOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCXMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPSAwOworCQkJaWYgKHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0KTsKKwkJCWlmICgocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ID0gT1BFTlNTTF9tYWxsb2MoZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoKSkgPT0gTlVMTCkKKwkJCQl7CisJCQkJKmFsID0gVExTMV9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoID0gZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOworCQkJbWVtY3B5KHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCwgc2RhdGEsIGVjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCk7CisjaWYgMAorCQkJZnByaW50ZihzdGRlcnIsInNzbF9wYXJzZV9zZXJ2ZXJoZWxsb190bHNleHQgcy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ICIpOworCQkJc2RhdGEgPSBzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3Q7CisJCQlmb3IgKGkgPSAwOyBpIDwgcy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aDsgaSsrKQorCQkJCWZwcmludGYoc3RkZXJyLCIlaSAiLCooc2RhdGErKykpOworCQkJZnByaW50ZihzdGRlcnIsIlxuIik7CisjZW5kaWYKKwkJCX0KKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCisKKwkJZWxzZSBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9zZXNzaW9uX3RpY2tldCkKKwkJCXsKKwkJCWlmIChzLT50bHNfc2Vzc2lvbl90aWNrZXRfZXh0X2NiICYmCisJCQkgICAgIXMtPnRsc19zZXNzaW9uX3RpY2tldF9leHRfY2IocywgZGF0YSwgc2l6ZSwgcy0+dGxzX3Nlc3Npb25fdGlja2V0X2V4dF9jYl9hcmcpKQorCQkJCXsKKwkJCQkqYWwgPSBUTFMxX0FEX0lOVEVSTkFMX0VSUk9SOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCWlmICgoU1NMX2dldF9vcHRpb25zKHMpICYgU1NMX09QX05PX1RJQ0tFVCkKKwkJCQl8fCAoc2l6ZSA+IDApKQorCQkJCXsKKwkJCQkqYWwgPSBUTFMxX0FEX1VOU1VQUE9SVEVEX0VYVEVOU0lPTjsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQlzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkID0gMTsKKwkJCX0KKyNpZmRlZiBUTFNFWFRfVFlQRV9vcGFxdWVfcHJmX2lucHV0CisJCWVsc2UgaWYgKHR5cGUgPT0gVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dCAmJgorCSAgICAgICAgICAgICBzLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04pCisJCQl7CisJCQl1bnNpZ25lZCBjaGFyICpzZGF0YSA9IGRhdGE7CisKKwkJCWlmIChzaXplIDwgMikKKwkJCQl7CisJCQkJKmFsID0gU1NMX0FEX0RFQ09ERV9FUlJPUjsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQluMnMoc2RhdGEsIHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dF9sZW4pOworCQkJaWYgKHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dF9sZW4gIT0gc2l6ZSAtIDIpCisJCQkJeworCQkJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCisJCQlpZiAocy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpIC8qIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuICovCisJCQkJT1BFTlNTTF9mcmVlKHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dCk7CisJCQlpZiAocy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0X2xlbiA9PSAwKQorCQkJCXMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dCA9IE9QRU5TU0xfbWFsbG9jKDEpOyAvKiBkdW1teSBieXRlIGp1c3QgdG8gZ2V0IG5vbi1OVUxMICovCisJCQllbHNlCisJCQkJcy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0ID0gQlVGX21lbWR1cChzZGF0YSwgcy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0X2xlbik7CisKKwkJCWlmIChzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQgPT0gTlVMTCkKKwkJCQl7CisJCQkJKmFsID0gVExTMV9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAodHlwZSA9PSBUTFNFWFRfVFlQRV9zdGF0dXNfcmVxdWVzdCAmJgorCQkgICAgICAgICBzLT52ZXJzaW9uICE9IERUTFMxX1ZFUlNJT04pCisJCQl7CisJCQkvKiBNVVNUIGJlIGVtcHR5IGFuZCBvbmx5IHNlbnQgaWYgd2UndmUgcmVxdWVzdGVkCisJCQkgKiBhIHN0YXR1cyByZXF1ZXN0IG1lc3NhZ2UuCisJCQkgKi8gCisJCQlpZiAoKHMtPnRsc2V4dF9zdGF0dXNfdHlwZSA9PSAtMSkgfHwgKHNpemUgPiAwKSkKKwkJCQl7CisJCQkJKmFsID0gVExTMV9BRF9VTlNVUFBPUlRFRF9FWFRFTlNJT047CisJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJLyogU2V0IGZsYWcgdG8gZXhwZWN0IENlcnRpZmljYXRlU3RhdHVzIG1lc3NhZ2UgKi8KKwkJCXMtPnRsc2V4dF9zdGF0dXNfZXhwZWN0ZWQgPSAxOworCQkJfQorCQllbHNlIGlmICh0eXBlID09IFRMU0VYVF9UWVBFX3JlbmVnb3RpYXRlKQorCQkJeworCQkJaWYoIXNzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQocywgZGF0YSwgc2l6ZSwgYWwpKQorCQkJCXJldHVybiAwOworCQkJcmVuZWdvdGlhdGVfc2VlbiA9IDE7CisJCQl9CisJCWRhdGErPXNpemU7CQkKKwkJfQorCisJaWYgKGRhdGEgIT0gZCtuKQorCQl7CisJCSphbCA9IFNTTF9BRF9ERUNPREVfRVJST1I7CisJCXJldHVybiAwOworCQl9CisKKwlpZiAoIXMtPmhpdCAmJiB0bHNleHRfc2VydmVybmFtZSA9PSAxKQorCQl7CisgCQlpZiAocy0+dGxzZXh0X2hvc3RuYW1lKQorCQkJeworCQkJaWYgKHMtPnNlc3Npb24tPnRsc2V4dF9ob3N0bmFtZSA9PSBOVUxMKQorCQkJCXsKKwkJCQlzLT5zZXNzaW9uLT50bHNleHRfaG9zdG5hbWUgPSBCVUZfc3RyZHVwKHMtPnRsc2V4dF9ob3N0bmFtZSk7CQorCQkJCWlmICghcy0+c2Vzc2lvbi0+dGxzZXh0X2hvc3RuYW1lKQorCQkJCQl7CisJCQkJCSphbCA9IFNTTF9BRF9VTlJFQ09HTklaRURfTkFNRTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQl9CisJCQllbHNlIAorCQkJCXsKKwkJCQkqYWwgPSBTU0xfQURfREVDT0RFX0VSUk9SOworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCisJKnAgPSBkYXRhOworCisJcmlfY2hlY2s6CisKKwkvKiBEZXRlcm1pbmUgaWYgd2UgbmVlZCB0byBzZWUgUkkuIFN0cmljdGx5IHNwZWFraW5nIGlmIHdlIHdhbnQgdG8KKwkgKiBhdm9pZCBhbiBhdHRhY2sgd2Ugc2hvdWxkICphbHdheXMqIHNlZSBSSSBldmVuIG9uIGluaXRpYWwgc2VydmVyCisJICogaGVsbG8gYmVjYXVzZSB0aGUgY2xpZW50IGRvZXNuJ3Qgc2VlIGFueSByZW5lZ290aWF0aW9uIGR1cmluZyBhbgorCSAqIGF0dGFjay4gSG93ZXZlciB0aGlzIHdvdWxkIG1lYW4gd2UgY291bGQgbm90IGNvbm5lY3QgdG8gYW55IHNlcnZlcgorCSAqIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBSSSBzbyBmb3IgdGhlIGltbWVkaWF0ZSBmdXR1cmUgdG9sZXJhdGUgUkkKKwkgKiBhYnNlbmNlIG9uIGluaXRpYWwgY29ubmVjdCBvbmx5LgorCSAqLworCWlmICghcmVuZWdvdGlhdGVfc2VlbgorCQkmJiAhKHMtPm9wdGlvbnMgJiBTU0xfT1BfTEVHQUNZX1NFUlZFUl9DT05ORUNUKQorCQkmJiAhKHMtPm9wdGlvbnMgJiBTU0xfT1BfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OKSkKKwkJeworCQkqYWwgPSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCVNTTGVycihTU0xfRl9TU0xfUEFSU0VfU0VSVkVSSEVMTE9fVExTRVhULAorCQkJCVNTTF9SX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTl9ESVNBQkxFRCk7CisJCXJldHVybiAwOworCQl9CisKKwlyZXR1cm4gMTsKKwl9CisKKworaW50IHNzbF9wcmVwYXJlX2NsaWVudGhlbGxvX3Rsc2V4dChTU0wgKnMpCisJeworI2lmbmRlZiBPUEVOU1NMX05PX0VDCisJLyogSWYgd2UgYXJlIGNsaWVudCBhbmQgdXNpbmcgYW4gZWxsaXB0aWMgY3VydmUgY3J5cHRvZ3JhcGh5IGNpcGhlciBzdWl0ZSwgc2VuZCB0aGUgcG9pbnQgZm9ybWF0cyAKKwkgKiBhbmQgZWxsaXB0aWMgY3VydmVzIHdlIHN1cHBvcnQuCisJICovCisJaW50IHVzaW5nX2VjYyA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqajsKKwl1bnNpZ25lZCBsb25nIGFsZ19rLCBhbGdfYTsKKwlTVEFDS19PRihTU0xfQ0lQSEVSKSAqY2lwaGVyX3N0YWNrID0gU1NMX2dldF9jaXBoZXJzKHMpOworCisJZm9yIChpID0gMDsgaSA8IHNrX1NTTF9DSVBIRVJfbnVtKGNpcGhlcl9zdGFjayk7IGkrKykKKwkJeworCQlTU0xfQ0lQSEVSICpjID0gc2tfU1NMX0NJUEhFUl92YWx1ZShjaXBoZXJfc3RhY2ssIGkpOworCisJCWFsZ19rID0gYy0+YWxnb3JpdGhtX21rZXk7CisJCWFsZ19hID0gYy0+YWxnb3JpdGhtX2F1dGg7CisJCWlmICgoYWxnX2sgJiAoU1NMX2tFRUNESHxTU0xfa0VDREhyfFNTTF9rRUNESGUpIHx8IChhbGdfYSAmIFNTTF9hRUNEU0EpKSkKKwkJCXsKKwkJCXVzaW5nX2VjYyA9IDE7CisJCQlicmVhazsKKwkJCX0KKwkJfQorCXVzaW5nX2VjYyA9IHVzaW5nX2VjYyAmJiAocy0+dmVyc2lvbiA9PSBUTFMxX1ZFUlNJT04pOworCWlmICh1c2luZ19lY2MpCisJCXsKKwkJaWYgKHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0KTsKKwkJaWYgKChzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgPSBPUEVOU1NMX21hbGxvYygzKSkgPT0gTlVMTCkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0xfUFJFUEFSRV9DTElFTlRIRUxMT19UTFNFWFQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoID0gMzsKKwkJcy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0WzBdID0gVExTRVhUX0VDUE9JTlRGT1JNQVRfdW5jb21wcmVzc2VkOworCQlzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RbMV0gPSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9hbnNpWDk2Ml9jb21wcmVzc2VkX3ByaW1lOworCQlzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RbMl0gPSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9hbnNpWDk2Ml9jb21wcmVzc2VkX2NoYXIyOworCisJCS8qIHdlIHN1cHBvcnQgYWxsIG5hbWVkIGVsbGlwdGljIGN1cnZlcyBpbiBkcmFmdC1pZXRmLXRscy1lY2MtMTIgKi8KKwkJaWYgKHMtPnRsc2V4dF9lbGxpcHRpY2N1cnZlbGlzdCAhPSBOVUxMKSBPUEVOU1NMX2ZyZWUocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0KTsKKwkJcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCA9IHNpemVvZihuaWRfbGlzdCkvc2l6ZW9mKG5pZF9saXN0WzBdKSAqIDI7CisJCWlmICgocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0ID0gT1BFTlNTTF9tYWxsb2Mocy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0X2xlbmd0aCkpID09IE5VTEwpCisJCQl7CisJCQlzLT50bHNleHRfZWxsaXB0aWNjdXJ2ZWxpc3RfbGVuZ3RoID0gMDsKKwkJCVNTTGVycihTU0xfRl9TU0xfUFJFUEFSRV9DTElFTlRIRUxMT19UTFNFWFQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJcmV0dXJuIC0xOworCQkJfQorCQlmb3IgKGkgPSAxLCBqID0gcy0+dGxzZXh0X2VsbGlwdGljY3VydmVsaXN0OyAodW5zaWduZWQgaW50KWkgPD0KKwkJCQlzaXplb2YobmlkX2xpc3QpL3NpemVvZihuaWRfbGlzdFswXSk7IGkrKykKKwkJCXMybihpLGopOworCQl9CisjZW5kaWYgLyogT1BFTlNTTF9OT19FQyAqLworCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorIAl7CisJCWludCByID0gMTsKKwkKKwkJaWYgKHMtPmN0eC0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2sgIT0gMCkKKwkJCXsKKwkJCXIgPSBzLT5jdHgtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrKHMsIE5VTEwsIDAsIHMtPmN0eC0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfY2FsbGJhY2tfYXJnKTsKKwkJCWlmICghcikKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJaWYgKHMtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpCisJCQl7CisJCQlpZiAocy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpIC8qIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuICovCisJCQkJT1BFTlNTTF9mcmVlKHMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dCk7CisKKwkJCWlmIChzLT50bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9sZW4gPT0gMCkKKwkJCQlzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQgPSBPUEVOU1NMX21hbGxvYygxKTsgLyogZHVtbXkgYnl0ZSBqdXN0IHRvIGdldCBub24tTlVMTCAqLworCQkJZWxzZQorCQkJCXMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dCA9IEJVRl9tZW1kdXAocy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQsIHMtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2xlbik7CisJCQlpZiAocy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0ID09IE5VTEwpCisJCQkJeworCQkJCVNTTGVycihTU0xfRl9TU0xfUFJFUEFSRV9DTElFTlRIRUxMT19UTFNFWFQsRVJSX1JfTUFMTE9DX0ZBSUxVUkUpOworCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQlzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXRfbGVuID0gcy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfbGVuOworCQkJfQorCisJCWlmIChyID09IDIpCisJCQkvKiBhdCBjYWxsYmFjaydzIHJlcXVlc3QsIGluc2lzdCBvbiByZWNlaXZpbmcgYW4gYXBwcm9wcmlhdGUgc2VydmVyIG9wYXF1ZSBQUkYgaW5wdXQgKi8KKwkJCXMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dF9sZW4gPSBzLT50bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9sZW47CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBzc2xfcHJlcGFyZV9zZXJ2ZXJoZWxsb190bHNleHQoU1NMICpzKQorCXsKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCS8qIElmIHdlIGFyZSBzZXJ2ZXIgYW5kIHVzaW5nIGFuIEVDQyBjaXBoZXIgc3VpdGUsIHNlbmQgdGhlIHBvaW50IGZvcm1hdHMgd2Ugc3VwcG9ydCAKKwkgKiBpZiB0aGUgY2xpZW50IHNlbnQgdXMgYW4gRUNQb2ludHNGb3JtYXQgZXh0ZW5zaW9uLiAgTm90ZSB0aGF0IHRoZSBzZXJ2ZXIgaXMgbm90CisJICogc3VwcG9zZWQgdG8gc2VuZCBhbiBFbGxpcHRpY0N1cnZlcyBleHRlbnNpb24uCisJICovCisKKwl1bnNpZ25lZCBsb25nIGFsZ19rID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fbWtleTsKKwl1bnNpZ25lZCBsb25nIGFsZ19hID0gcy0+czMtPnRtcC5uZXdfY2lwaGVyLT5hbGdvcml0aG1fYXV0aDsKKwlpbnQgdXNpbmdfZWNjID0gKGFsZ19rICYgKFNTTF9rRUVDREh8U1NMX2tFQ0RIcnxTU0xfa0VDREhlKSkgfHwgKGFsZ19hICYgU1NMX2FFQ0RTQSk7CisJdXNpbmdfZWNjID0gdXNpbmdfZWNjICYmIChzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QgIT0gTlVMTCk7CisJCisJaWYgKHVzaW5nX2VjYykKKwkJeworCQlpZiAocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ICE9IE5VTEwpIE9QRU5TU0xfZnJlZShzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3QpOworCQlpZiAoKHMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCA9IE9QRU5TU0xfbWFsbG9jKDMpKSA9PSBOVUxMKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTF9QUkVQQVJFX1NFUlZFUkhFTExPX1RMU0VYVCxFUlJfUl9NQUxMT0NfRkFJTFVSRSk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCXMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdF9sZW5ndGggPSAzOworCQlzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RbMF0gPSBUTFNFWFRfRUNQT0lOVEZPUk1BVF91bmNvbXByZXNzZWQ7CisJCXMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdFsxXSA9IFRMU0VYVF9FQ1BPSU5URk9STUFUX2Fuc2lYOTYyX2NvbXByZXNzZWRfcHJpbWU7CisJCXMtPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdFsyXSA9IFRMU0VYVF9FQ1BPSU5URk9STUFUX2Fuc2lYOTYyX2NvbXByZXNzZWRfY2hhcjI7CisJCX0KKyNlbmRpZiAvKiBPUEVOU1NMX05PX0VDICovCisKKwlyZXR1cm4gMTsKKwl9CisKK2ludCBzc2xfY2hlY2tfY2xpZW50aGVsbG9fdGxzZXh0KFNTTCAqcykKKwl7CisJaW50IHJldD1TU0xfVExTRVhUX0VSUl9OT0FDSzsKKwlpbnQgYWwgPSBTU0xfQURfVU5SRUNPR05JWkVEX05BTUU7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCS8qIFRoZSBoYW5kbGluZyBvZiB0aGUgRUNQb2ludEZvcm1hdHMgZXh0ZW5zaW9uIGlzIGRvbmUgZWxzZXdoZXJlLCBuYW1lbHkgaW4gCisJICogc3NsM19jaG9vc2VfY2lwaGVyIGluIHMzX2xpYi5jLgorCSAqLworCS8qIFRoZSBoYW5kbGluZyBvZiB0aGUgRWxsaXB0aWNDdXJ2ZXMgZXh0ZW5zaW9uIGlzIGRvbmUgZWxzZXdoZXJlLCBuYW1lbHkgaW4gCisJICogc3NsM19jaG9vc2VfY2lwaGVyIGluIHMzX2xpYi5jLgorCSAqLworI2VuZGlmCisKKwlpZiAocy0+Y3R4ICE9IE5VTEwgJiYgcy0+Y3R4LT50bHNleHRfc2VydmVybmFtZV9jYWxsYmFjayAhPSAwKSAKKwkJcmV0ID0gcy0+Y3R4LT50bHNleHRfc2VydmVybmFtZV9jYWxsYmFjayhzLCAmYWwsIHMtPmN0eC0+dGxzZXh0X3NlcnZlcm5hbWVfYXJnKTsKKwllbHNlIGlmIChzLT5pbml0aWFsX2N0eCAhPSBOVUxMICYmIHMtPmluaXRpYWxfY3R4LT50bHNleHRfc2VydmVybmFtZV9jYWxsYmFjayAhPSAwKSAJCQorCQlyZXQgPSBzLT5pbml0aWFsX2N0eC0+dGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2socywgJmFsLCBzLT5pbml0aWFsX2N0eC0+dGxzZXh0X3NlcnZlcm5hbWVfYXJnKTsKKworCS8qIElmIHN0YXR1cyByZXF1ZXN0IHRoZW4gYXNrIGNhbGxiYWNrIHdoYXQgdG8gZG8uCisgCSAqIE5vdGU6IHRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgc2VydmVybmFtZSBjYWxsYmFja3MgaW4gY2FzZSAKKyAJICogdGhlIGNlcnRpZmljYXRlIGhhcyBjaGFuZ2VkLgorIAkgKi8KKwlpZiAoKHMtPnRsc2V4dF9zdGF0dXNfdHlwZSAhPSAtMSkgJiYgcy0+Y3R4ICYmIHMtPmN0eC0+dGxzZXh0X3N0YXR1c19jYikKKwkJeworCQlpbnQgcjsKKwkJciA9IHMtPmN0eC0+dGxzZXh0X3N0YXR1c19jYihzLCBzLT5jdHgtPnRsc2V4dF9zdGF0dXNfYXJnKTsKKwkJc3dpdGNoIChyKQorCQkJeworCQkJLyogV2UgZG9uJ3Qgd2FudCB0byBzZW5kIGEgc3RhdHVzIHJlcXVlc3QgcmVzcG9uc2UgKi8KKwkJCWNhc2UgU1NMX1RMU0VYVF9FUlJfTk9BQ0s6CisJCQkJcy0+dGxzZXh0X3N0YXR1c19leHBlY3RlZCA9IDA7CisJCQkJYnJlYWs7CisJCQkvKiBzdGF0dXMgcmVxdWVzdCByZXNwb25zZSBzaG91bGQgYmUgc2VudCAqLworCQkJY2FzZSBTU0xfVExTRVhUX0VSUl9PSzoKKwkJCQlpZiAocy0+dGxzZXh0X29jc3BfcmVzcCkKKwkJCQkJcy0+dGxzZXh0X3N0YXR1c19leHBlY3RlZCA9IDE7CisJCQkJZWxzZQorCQkJCQlzLT50bHNleHRfc3RhdHVzX2V4cGVjdGVkID0gMDsKKwkJCQlicmVhazsKKwkJCS8qIHNvbWV0aGluZyBiYWQgaGFwcGVuZWQgKi8KKwkJCWNhc2UgU1NMX1RMU0VYVF9FUlJfQUxFUlRfRkFUQUw6CisJCQkJcmV0ID0gU1NMX1RMU0VYVF9FUlJfQUxFUlRfRkFUQUw7CisJCQkJYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwllbHNlCisJCXMtPnRsc2V4dF9zdGF0dXNfZXhwZWN0ZWQgPSAwOworCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorIAl7CisJCS8qIFRoaXMgc29ydCBvZiBiZWxvbmdzIGludG8gc3NsX3ByZXBhcmVfc2VydmVyaGVsbG9fdGxzZXh0KCksCisJCSAqIGJ1dCB3ZSBtaWdodCBiZSBzZW5kaW5nIGFuIGFsZXJ0IGluIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgaGVsbG8sCisJCSAqIHNvIHRoaXMgaGFzIHRvIGhhcHBlbiBoZXJlIGluIHNzbF9jaGVja19jbGllbnRoZWxsb190bHNleHQoKS4gKi8KKworCQlpbnQgciA9IDE7CisJCisJCWlmIChzLT5jdHgtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrICE9IDApCisJCQl7CisJCQlyID0gcy0+Y3R4LT50bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFjayhzLCBOVUxMLCAwLCBzLT5jdHgtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrX2FyZyk7CisJCQlpZiAoIXIpCisJCQkJeworCQkJCXJldCA9IFNTTF9UTFNFWFRfRVJSX0FMRVJUX0ZBVEFMOworCQkJCWFsID0gU1NMX0FEX0lOVEVSTkFMX0VSUk9SOworCQkJCWdvdG8gZXJyOworCQkJCX0KKwkJCX0KKworCQlpZiAocy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0ICE9IE5VTEwpIC8qIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuICovCisJCQlPUEVOU1NMX2ZyZWUocy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0KTsKKwkJcy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0ID0gTlVMTDsKKworCQlpZiAocy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCkKKwkJCXsKKwkJCWlmIChzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQgIT0gTlVMTCAmJgorCQkJCXMtPnMzLT5jbGllbnRfb3BhcXVlX3ByZl9pbnB1dF9sZW4gPT0gcy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfbGVuKQorCQkJCXsKKwkJCQkvKiBjYW4gb25seSB1c2UgdGhpcyBleHRlbnNpb24gaWYgd2UgaGF2ZSBhIHNlcnZlciBvcGFxdWUgUFJGIGlucHV0CisJCQkJICogb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBjbGllbnQgb3BhcXVlIFBSRiBpbnB1dCEgKi8KKworCQkJCWlmIChzLT50bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9sZW4gPT0gMCkKKwkJCQkJcy0+czMtPnNlcnZlcl9vcGFxdWVfcHJmX2lucHV0ID0gT1BFTlNTTF9tYWxsb2MoMSk7IC8qIGR1bW15IGJ5dGUganVzdCB0byBnZXQgbm9uLU5VTEwgKi8KKwkJCQllbHNlCisJCQkJCXMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dCA9IEJVRl9tZW1kdXAocy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQsIHMtPnRsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2xlbik7CisJCQkJaWYgKHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dCA9PSBOVUxMKQorCQkJCQl7CisJCQkJCXJldCA9IFNTTF9UTFNFWFRfRVJSX0FMRVJUX0ZBVEFMOworCQkJCQlhbCA9IFNTTF9BRF9JTlRFUk5BTF9FUlJPUjsKKwkJCQkJZ290byBlcnI7CisJCQkJCX0KKwkJCQlzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXRfbGVuID0gcy0+dGxzZXh0X29wYXF1ZV9wcmZfaW5wdXRfbGVuOworCQkJCX0KKwkJCX0KKworCQlpZiAociA9PSAyICYmIHMtPnMzLT5zZXJ2ZXJfb3BhcXVlX3ByZl9pbnB1dCA9PSBOVUxMKQorCQkJeworCQkJLyogVGhlIGNhbGxiYWNrIHdhbnRzIHRvIGVuZm9yY2UgdXNlIG9mIHRoZSBleHRlbnNpb24sCisJCQkgKiBidXQgd2UgY2FuJ3QgZG8gdGhhdCB3aXRoIHRoZSBjbGllbnQgb3BhcXVlIFBSRiBpbnB1dDsKKwkJCSAqIGFib3J0IHRoZSBoYW5kc2hha2UuCisJCQkgKi8KKwkJCXJldCA9IFNTTF9UTFNFWFRfRVJSX0FMRVJUX0ZBVEFMOworCQkJYWwgPSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQl9CisJfQorCisjZW5kaWYKKyBlcnI6CisJc3dpdGNoIChyZXQpCisJCXsKKwkJY2FzZSBTU0xfVExTRVhUX0VSUl9BTEVSVF9GQVRBTDoKKwkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsYWwpOyAKKwkJCXJldHVybiAtMTsKKworCQljYXNlIFNTTF9UTFNFWFRfRVJSX0FMRVJUX1dBUk5JTkc6CisJCQlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX1dBUk5JTkcsYWwpOworCQkJcmV0dXJuIDE7IAorCQkJCQkKKwkJY2FzZSBTU0xfVExTRVhUX0VSUl9OT0FDSzoKKwkJCXMtPnNlcnZlcm5hbWVfZG9uZT0wOworCQkJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJCX0KKwl9CisKK2ludCBzc2xfY2hlY2tfc2VydmVyaGVsbG9fdGxzZXh0KFNTTCAqcykKKwl7CisJaW50IHJldD1TU0xfVExTRVhUX0VSUl9OT0FDSzsKKwlpbnQgYWwgPSBTU0xfQURfVU5SRUNPR05JWkVEX05BTUU7CisKKyNpZm5kZWYgT1BFTlNTTF9OT19FQworCS8qIElmIHdlIGFyZSBjbGllbnQgYW5kIHVzaW5nIGFuIGVsbGlwdGljIGN1cnZlIGNyeXB0b2dyYXBoeSBjaXBoZXIgc3VpdGUsIHRoZW4gc2VydmVyCisJICogbXVzdCByZXR1cm4gYSBhbiBFQyBwb2ludCBmb3JtYXRzIGxpc3RzIGNvbnRhaW5pbmcgdW5jb21wcmVzc2VkLgorCSAqLworCXVuc2lnbmVkIGxvbmcgYWxnX2sgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9ta2V5OworCXVuc2lnbmVkIGxvbmcgYWxnX2EgPSBzLT5zMy0+dG1wLm5ld19jaXBoZXItPmFsZ29yaXRobV9hdXRoOworCWlmICgocy0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0ICE9IE5VTEwpICYmIChzLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoID4gMCkgJiYgCisJICAgICgoYWxnX2sgJiAoU1NMX2tFRUNESHxTU0xfa0VDREhyfFNTTF9rRUNESGUpKSB8fCAoYWxnX2EgJiBTU0xfYUVDRFNBKSkpCisJCXsKKwkJLyogd2UgYXJlIHVzaW5nIGFuIEVDQyBjaXBoZXIgKi8KKwkJc2l6ZV90IGk7CisJCXVuc2lnbmVkIGNoYXIgKmxpc3Q7CisJCWludCBmb3VuZF91bmNvbXByZXNzZWQgPSAwOworCQlpZiAoKHMtPnNlc3Npb24tPnRsc2V4dF9lY3BvaW50Zm9ybWF0bGlzdCA9PSBOVUxMKSB8fCAocy0+c2Vzc2lvbi0+dGxzZXh0X2VjcG9pbnRmb3JtYXRsaXN0X2xlbmd0aCA9PSAwKSkKKwkJCXsKKwkJCVNTTGVycihTU0xfRl9TU0xfQ0hFQ0tfU0VSVkVSSEVMTE9fVExTRVhULFNTTF9SX1RMU19JTlZBTElEX0VDUE9JTlRGT1JNQVRfTElTVCk7CisJCQlyZXR1cm4gLTE7CisJCQl9CisJCWxpc3QgPSBzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3Q7CisJCWZvciAoaSA9IDA7IGkgPCBzLT5zZXNzaW9uLT50bHNleHRfZWNwb2ludGZvcm1hdGxpc3RfbGVuZ3RoOyBpKyspCisJCQl7CisJCQlpZiAoKihsaXN0KyspID09IFRMU0VYVF9FQ1BPSU5URk9STUFUX3VuY29tcHJlc3NlZCkKKwkJCQl7CisJCQkJZm91bmRfdW5jb21wcmVzc2VkID0gMTsKKwkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCWlmICghZm91bmRfdW5jb21wcmVzc2VkKQorCQkJeworCQkJU1NMZXJyKFNTTF9GX1NTTF9DSEVDS19TRVJWRVJIRUxMT19UTFNFWFQsU1NMX1JfVExTX0lOVkFMSURfRUNQT0lOVEZPUk1BVF9MSVNUKTsKKwkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCXJldCA9IFNTTF9UTFNFWFRfRVJSX09LOworI2VuZGlmIC8qIE9QRU5TU0xfTk9fRUMgKi8KKworCWlmIChzLT5jdHggIT0gTlVMTCAmJiBzLT5jdHgtPnRsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrICE9IDApIAorCQlyZXQgPSBzLT5jdHgtPnRsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKHMsICZhbCwgcy0+Y3R4LT50bHNleHRfc2VydmVybmFtZV9hcmcpOworCWVsc2UgaWYgKHMtPmluaXRpYWxfY3R4ICE9IE5VTEwgJiYgcy0+aW5pdGlhbF9jdHgtPnRsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrICE9IDApIAkJCisJCXJldCA9IHMtPmluaXRpYWxfY3R4LT50bHNleHRfc2VydmVybmFtZV9jYWxsYmFjayhzLCAmYWwsIHMtPmluaXRpYWxfY3R4LT50bHNleHRfc2VydmVybmFtZV9hcmcpOworCisjaWZkZWYgVExTRVhUX1RZUEVfb3BhcXVlX3ByZl9pbnB1dAorCWlmIChzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXRfbGVuID4gMCkKKwkJeworCQkvKiBUaGlzIGNhc2UgbWF5IGluZGljYXRlIHRoYXQgd2UsIGFzIGEgY2xpZW50LCB3YW50IHRvIGluc2lzdCBvbiB1c2luZyBvcGFxdWUgUFJGIGlucHV0cy4KKwkJICogU28gZmlyc3QgdmVyaWZ5IHRoYXQgd2UgcmVhbGx5IGhhdmUgYSB2YWx1ZSBmcm9tIHRoZSBzZXJ2ZXIgdG9vLiAqLworCisJCWlmIChzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXQgPT0gTlVMTCkKKwkJCXsKKwkJCXJldCA9IFNTTF9UTFNFWFRfRVJSX0FMRVJUX0ZBVEFMOworCQkJYWwgPSBTU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisJCQl9CisJCQorCQkvKiBBbnl0aW1lIHRoZSBzZXJ2ZXIgKmhhcyogc2VudCBhbiBvcGFxdWUgUFJGIGlucHV0LCB3ZSBuZWVkIHRvIGNoZWNrCisJCSAqIHRoYXQgd2UgaGF2ZSBhIGNsaWVudCBvcGFxdWUgUFJGIGlucHV0IG9mIHRoZSBzYW1lIHNpemUuICovCisJCWlmIChzLT5zMy0+Y2xpZW50X29wYXF1ZV9wcmZfaW5wdXQgPT0gTlVMTCB8fAorCQkgICAgcy0+czMtPmNsaWVudF9vcGFxdWVfcHJmX2lucHV0X2xlbiAhPSBzLT5zMy0+c2VydmVyX29wYXF1ZV9wcmZfaW5wdXRfbGVuKQorCQkJeworCQkJcmV0ID0gU1NMX1RMU0VYVF9FUlJfQUxFUlRfRkFUQUw7CisJCQlhbCA9IFNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkvKiBJZiB3ZSd2ZSByZXF1ZXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzIGFuZCB3ZSB3b250IGdldCBvbmUKKyAJICogdGVsbCB0aGUgY2FsbGJhY2sKKyAJICovCisJaWYgKChzLT50bHNleHRfc3RhdHVzX3R5cGUgIT0gLTEpICYmICEocy0+dGxzZXh0X3N0YXR1c19leHBlY3RlZCkKKwkJCSYmIHMtPmN0eCAmJiBzLT5jdHgtPnRsc2V4dF9zdGF0dXNfY2IpCisJCXsKKwkJaW50IHI7CisJCS8qIFNldCByZXNwIHRvIE5VTEwsIHJlc3BsZW4gdG8gLTEgc28gY2FsbGJhY2sga25vd3MKKyAJCSAqIHRoZXJlIGlzIG5vIHJlc3BvbnNlLgorIAkJICovCisJCWlmIChzLT50bHNleHRfb2NzcF9yZXNwKQorCQkJeworCQkJT1BFTlNTTF9mcmVlKHMtPnRsc2V4dF9vY3NwX3Jlc3ApOworCQkJcy0+dGxzZXh0X29jc3BfcmVzcCA9IE5VTEw7CisJCQl9CisJCXMtPnRsc2V4dF9vY3NwX3Jlc3BsZW4gPSAtMTsKKwkJciA9IHMtPmN0eC0+dGxzZXh0X3N0YXR1c19jYihzLCBzLT5jdHgtPnRsc2V4dF9zdGF0dXNfYXJnKTsKKwkJaWYgKHIgPT0gMCkKKwkJCXsKKwkJCWFsID0gU1NMX0FEX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0U7CisJCQlyZXQgPSBTU0xfVExTRVhUX0VSUl9BTEVSVF9GQVRBTDsKKwkJCX0KKwkJaWYgKHIgPCAwKQorCQkJeworCQkJYWwgPSBTU0xfQURfSU5URVJOQUxfRVJST1I7CisJCQlyZXQgPSBTU0xfVExTRVhUX0VSUl9BTEVSVF9GQVRBTDsKKwkJCX0KKwkJfQorCisJc3dpdGNoIChyZXQpCisJCXsKKwkJY2FzZSBTU0xfVExTRVhUX0VSUl9BTEVSVF9GQVRBTDoKKwkJCXNzbDNfc2VuZF9hbGVydChzLFNTTDNfQUxfRkFUQUwsYWwpOyAKKwkJCXJldHVybiAtMTsKKworCQljYXNlIFNTTF9UTFNFWFRfRVJSX0FMRVJUX1dBUk5JTkc6CisJCQlzc2wzX3NlbmRfYWxlcnQocyxTU0wzX0FMX1dBUk5JTkcsYWwpOworCQkJcmV0dXJuIDE7IAorCQkJCQkKKwkJY2FzZSBTU0xfVExTRVhUX0VSUl9OT0FDSzoKKwkJCXMtPnNlcnZlcm5hbWVfZG9uZT0wOworCQkJZGVmYXVsdDoKKwkJcmV0dXJuIDE7CisJCX0KKwl9CisKKy8qIFNpbmNlIHRoZSBzZXJ2ZXIgY2FjaGUgbG9va3VwIGlzIGRvbmUgZWFybHkgb24gaW4gdGhlIHByb2Nlc3Npbmcgb2YgY2xpZW50CisgKiBoZWxsbyBhbmQgb3RoZXIgb3BlcmF0aW9ucyBkZXBlbmQgb24gdGhlIHJlc3VsdCB3ZSBuZWVkIHRvIGhhbmRsZSBhbnkgVExTCisgKiBzZXNzaW9uIHRpY2tldCBleHRlbnNpb24gYXQgdGhlIHNhbWUgdGltZS4KKyAqLworCitpbnQgdGxzMV9wcm9jZXNzX3RpY2tldChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKnNlc3Npb25faWQsIGludCBsZW4sCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqbGltaXQsIFNTTF9TRVNTSU9OICoqcmV0KQorCXsKKwkvKiBQb2ludCBhZnRlciBzZXNzaW9uIElEIGluIGNsaWVudCBoZWxsbyAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBzZXNzaW9uX2lkICsgbGVuOworCXVuc2lnbmVkIHNob3J0IGk7CisKKwkvKiBJZiB0aWNrZXRzIGRpc2FibGVkIGJlaGF2ZSBhcyBpZiBubyB0aWNrZXQgcHJlc2VudAorIAkgKiB0byBwZXJtaXQgc3RhdGVmdWwgcmVzdW1wdGlvbi4KKyAJICovCisJaWYgKFNTTF9nZXRfb3B0aW9ucyhzKSAmIFNTTF9PUF9OT19USUNLRVQpCisJCXJldHVybiAxOworCisJaWYgKChzLT52ZXJzaW9uIDw9IFNTTDNfVkVSU0lPTikgfHwgIWxpbWl0KQorCQlyZXR1cm4gMTsKKwlpZiAocCA+PSBsaW1pdCkKKwkJcmV0dXJuIC0xOworCS8qIFNraXAgcGFzdCBEVExTIGNvb2tpZSAqLworCWlmIChzLT52ZXJzaW9uID09IERUTFMxX1ZFUlNJT04gfHwgcy0+dmVyc2lvbiA9PSBEVExTMV9CQURfVkVSKQorCQl7CisJCWkgPSAqKHArKyk7CisJCXArPSBpOworCQlpZiAocCA+PSBsaW1pdCkKKwkJCXJldHVybiAtMTsKKwkJfQorCS8qIFNraXAgcGFzdCBjaXBoZXIgbGlzdCAqLworCW4ycyhwLCBpKTsKKwlwKz0gaTsKKwlpZiAocCA+PSBsaW1pdCkKKwkJcmV0dXJuIC0xOworCS8qIFNraXAgcGFzdCBjb21wcmVzc2lvbiBhbGdvcml0aG0gbGlzdCAqLworCWkgPSAqKHArKyk7CisJcCArPSBpOworCWlmIChwID4gbGltaXQpCisJCXJldHVybiAtMTsKKwkvKiBOb3cgYXQgc3RhcnQgb2YgZXh0ZW5zaW9ucyAqLworCWlmICgocCArIDIpID49IGxpbWl0KQorCQlyZXR1cm4gMTsKKwluMnMocCwgaSk7CisJd2hpbGUgKChwICsgNCkgPD0gbGltaXQpCisJCXsKKwkJdW5zaWduZWQgc2hvcnQgdHlwZSwgc2l6ZTsKKwkJbjJzKHAsIHR5cGUpOworCQluMnMocCwgc2l6ZSk7CisJCWlmIChwICsgc2l6ZSA+IGxpbWl0KQorCQkJcmV0dXJuIDE7CisJCWlmICh0eXBlID09IFRMU0VYVF9UWVBFX3Nlc3Npb25fdGlja2V0KQorCQkJeworCQkJLyogSWYgdGlja2V0cyBkaXNhYmxlZCBpbmRpY2F0ZSBjYWNoZSBtaXNzIHdoaWNoIHdpbGwKKyAJCQkgKiB0cmlnZ2VyIGEgZnVsbCBoYW5kc2hha2UKKyAJCQkgKi8KKwkJCWlmIChTU0xfZ2V0X29wdGlvbnMocykgJiBTU0xfT1BfTk9fVElDS0VUKQorCQkJCXJldHVybiAxOworCQkJLyogSWYgemVybyBsZW5ndGggbm90ZSBjbGllbnQgd2lsbCBhY2NlcHQgYSB0aWNrZXQKKyAJCQkgKiBhbmQgaW5kaWNhdGUgY2FjaGUgbWlzcyB0byB0cmlnZ2VyIGZ1bGwgaGFuZHNoYWtlCisgCQkJICovCisJCQlpZiAoc2l6ZSA9PSAwKQorCQkJCXsKKwkJCQlzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkID0gMTsKKwkJCQlyZXR1cm4gMDsJLyogQ2FjaGUgbWlzcyAqLworCQkJCX0KKwkJCWlmIChzLT50bHNfc2Vzc2lvbl9zZWNyZXRfY2IpCisJCQkJeworCQkJCS8qIEluZGljYXRlIGNhY2hlIG1pc3MgaGVyZSBhbmQgaW5zdGVhZCBvZgorCQkJCSAqIGdlbmVyYXRpbmcgdGhlIHNlc3Npb24gZnJvbSB0aWNrZXQgbm93LAorCQkJCSAqIHRyaWdnZXIgYWJicmV2aWF0ZWQgaGFuZHNoYWtlIGJhc2VkIG9uCisJCQkJICogZXh0ZXJuYWwgbWVjaGFuaXNtIHRvIGNhbGN1bGF0ZSB0aGUgbWFzdGVyCisJCQkJICogc2VjcmV0IGxhdGVyLiAqLworCQkJCXJldHVybiAwOworCQkJCX0KKwkJCXJldHVybiB0bHNfZGVjcnlwdF90aWNrZXQocywgcCwgc2l6ZSwgc2Vzc2lvbl9pZCwgbGVuLAorCQkJCQkJCQkJcmV0KTsKKwkJCX0KKwkJcCArPSBzaXplOworCQl9CisJcmV0dXJuIDE7CisJfQorCitzdGF0aWMgaW50IHRsc19kZWNyeXB0X3RpY2tldChTU0wgKnMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmV0aWNrLCBpbnQgZXRpY2tsZW4sCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2Vzc19pZCwgaW50IHNlc3NsZW4sCisJCQkJU1NMX1NFU1NJT04gKipwc2VzcykKKwl7CisJU1NMX1NFU1NJT04gKnNlc3M7CisJdW5zaWduZWQgY2hhciAqc2RlYzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwOworCWludCBzbGVuLCBtbGVuLCByZW5ld190aWNrZXQgPSAwOworCXVuc2lnbmVkIGNoYXIgdGlja19obWFjW0VWUF9NQVhfTURfU0laRV07CisJSE1BQ19DVFggaGN0eDsKKwlFVlBfQ0lQSEVSX0NUWCBjdHg7CisJU1NMX0NUWCAqdGN0eCA9IHMtPmluaXRpYWxfY3R4OworCS8qIE5lZWQgYXQgbGVhc3Qga2V5bmFtZSArIGl2ICsgc29tZSBlbmNyeXB0ZWQgZGF0YSAqLworCWlmIChldGlja2xlbiA8IDQ4KQorCQlnb3RvIHRpY2tlcnI7CisJLyogSW5pdGlhbGl6ZSBzZXNzaW9uIHRpY2tldCBlbmNyeXB0aW9uIGFuZCBITUFDIGNvbnRleHRzICovCisJSE1BQ19DVFhfaW5pdCgmaGN0eCk7CisJRVZQX0NJUEhFUl9DVFhfaW5pdCgmY3R4KTsKKwlpZiAodGN0eC0+dGxzZXh0X3RpY2tldF9rZXlfY2IpCisJCXsKKwkJdW5zaWduZWQgY2hhciAqbmN0aWNrID0gKHVuc2lnbmVkIGNoYXIgKilldGljazsKKwkJaW50IHJ2ID0gdGN0eC0+dGxzZXh0X3RpY2tldF9rZXlfY2IocywgbmN0aWNrLCBuY3RpY2sgKyAxNiwKKwkJCQkJCQkmY3R4LCAmaGN0eCwgMCk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gLTE7CisJCWlmIChydiA9PSAwKQorCQkJZ290byB0aWNrZXJyOworCQlpZiAocnYgPT0gMikKKwkJCXJlbmV3X3RpY2tldCA9IDE7CisJCX0KKwllbHNlCisJCXsKKwkJLyogQ2hlY2sga2V5IG5hbWUgbWF0Y2hlcyAqLworCQlpZiAobWVtY21wKGV0aWNrLCB0Y3R4LT50bHNleHRfdGlja19rZXlfbmFtZSwgMTYpKQorCQkJZ290byB0aWNrZXJyOworCQlITUFDX0luaXRfZXgoJmhjdHgsIHRjdHgtPnRsc2V4dF90aWNrX2htYWNfa2V5LCAxNiwKKwkJCQkJdGxzZXh0X3RpY2tfbWQoKSwgTlVMTCk7CisJCUVWUF9EZWNyeXB0SW5pdF9leCgmY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwKKwkJCQl0Y3R4LT50bHNleHRfdGlja19hZXNfa2V5LCBldGljayArIDE2KTsKKwkJfQorCS8qIEF0dGVtcHQgdG8gcHJvY2VzcyBzZXNzaW9uIHRpY2tldCwgZmlyc3QgY29uZHVjdCBzYW5pdHkgYW5kCisgCSAqIGludGVncml0eSBjaGVja3Mgb24gdGlja2V0LgorIAkgKi8KKwltbGVuID0gSE1BQ19zaXplKCZoY3R4KTsKKwlpZiAobWxlbiA8IDApCisJCXsKKwkJRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmY3R4KTsKKwkJcmV0dXJuIC0xOworCQl9CisJZXRpY2tsZW4gLT0gbWxlbjsKKwkvKiBDaGVjayBITUFDIG9mIGVuY3J5cHRlZCB0aWNrZXQgKi8KKwlITUFDX1VwZGF0ZSgmaGN0eCwgZXRpY2ssIGV0aWNrbGVuKTsKKwlITUFDX0ZpbmFsKCZoY3R4LCB0aWNrX2htYWMsIE5VTEwpOworCUhNQUNfQ1RYX2NsZWFudXAoJmhjdHgpOworCWlmIChtZW1jbXAodGlja19obWFjLCBldGljayArIGV0aWNrbGVuLCBtbGVuKSkKKwkJZ290byB0aWNrZXJyOworCS8qIEF0dGVtcHQgdG8gZGVjcnlwdCBzZXNzaW9uIGRhdGEgKi8KKwkvKiBNb3ZlIHAgYWZ0ZXIgSVYgdG8gc3RhcnQgb2YgZW5jcnlwdGVkIHRpY2tldCwgdXBkYXRlIGxlbmd0aCAqLworCXAgPSBldGljayArIDE2ICsgRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKCZjdHgpOworCWV0aWNrbGVuIC09IDE2ICsgRVZQX0NJUEhFUl9DVFhfaXZfbGVuZ3RoKCZjdHgpOworCXNkZWMgPSBPUEVOU1NMX21hbGxvYyhldGlja2xlbik7CisJaWYgKCFzZGVjKQorCQl7CisJCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisJCXJldHVybiAtMTsKKwkJfQorCUVWUF9EZWNyeXB0VXBkYXRlKCZjdHgsIHNkZWMsICZzbGVuLCBwLCBldGlja2xlbik7CisJaWYgKEVWUF9EZWNyeXB0RmluYWwoJmN0eCwgc2RlYyArIHNsZW4sICZtbGVuKSA8PSAwKQorCQlnb3RvIHRpY2tlcnI7CisJc2xlbiArPSBtbGVuOworCUVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoJmN0eCk7CisJcCA9IHNkZWM7CisJCQorCXNlc3MgPSBkMmlfU1NMX1NFU1NJT04oTlVMTCwgJnAsIHNsZW4pOworCU9QRU5TU0xfZnJlZShzZGVjKTsKKwlpZiAoc2VzcykKKwkJeworCQkvKiBUaGUgc2Vzc2lvbiBJRCBpZiBub24tZW1wdHkgaXMgdXNlZCBieSBzb21lIGNsaWVudHMgdG8KKyAJCSAqIGRldGVjdCB0aGF0IHRoZSB0aWNrZXQgaGFzIGJlZW4gYWNjZXB0ZWQuIFNvIHdlIGNvcHkgaXQgdG8KKyAJCSAqIHRoZSBzZXNzaW9uIHN0cnVjdHVyZS4gSWYgaXQgaXMgZW1wdHkgc2V0IGxlbmd0aCB0byB6ZXJvCisgCQkgKiBhcyByZXF1aXJlZCBieSBzdGFuZGFyZC4KKyAJCSAqLworCQlpZiAoc2Vzc2xlbikKKwkJCW1lbWNweShzZXNzLT5zZXNzaW9uX2lkLCBzZXNzX2lkLCBzZXNzbGVuKTsKKwkJc2Vzcy0+c2Vzc2lvbl9pZF9sZW5ndGggPSBzZXNzbGVuOworCQkqcHNlc3MgPSBzZXNzOworCQlzLT50bHNleHRfdGlja2V0X2V4cGVjdGVkID0gcmVuZXdfdGlja2V0OworCQlyZXR1cm4gMTsKKwkJfQorCS8qIElmIHNlc3Npb24gZGVjcnlwdCBmYWlsdXJlIGluZGljYXRlIGEgY2FjaGUgbWlzcyBhbmQgc2V0IHN0YXRlIHRvCisgCSAqIHNlbmQgYSBuZXcgdGlja2V0CisgCSAqLworCXRpY2tlcnI6CQorCXMtPnRsc2V4dF90aWNrZXRfZXhwZWN0ZWQgPSAxOworCXJldHVybiAwOworCX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvdDFfbWV0aC5jIGIvbGliL29wZW5zc2wvc3NsL3QxX21ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U3YzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3QxX21ldGguYwpAQCAtMCwwICsxLDc2IEBACisvKiBzc2wvdDFfbWV0aC5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9wZW5zc2wvb2JqZWN0cy5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICp0bHMxX2dldF9tZXRob2QoaW50IHZlcik7CitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqdGxzMV9nZXRfbWV0aG9kKGludCB2ZXIpCisJeworCWlmICh2ZXIgPT0gVExTMV9WRVJTSU9OKQorCQlyZXR1cm4oVExTdjFfbWV0aG9kKCkpOworCWVsc2UKKwkJcmV0dXJuKE5VTEwpOworCX0KKworSU1QTEVNRU5UX3RsczFfbWV0aF9mdW5jKFRMU3YxX21ldGhvZCwKKwkJCXNzbDNfYWNjZXB0LAorCQkJc3NsM19jb25uZWN0LAorCQkJdGxzMV9nZXRfbWV0aG9kKQorCmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvdDFfcmVuZWcuYyBiL2xpYi9vcGVuc3NsL3NzbC90MV9yZW5lZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMmNjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvb3BlbnNzbC9zc2wvdDFfcmVuZWcuYwpAQCAtMCwwICsxLDI5MiBAQAorLyogc3NsL3QxX3JlbmVnLmMgKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwOSBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3BlbnNzbC9vYmplY3RzLmg+CisjaW5jbHVkZSAic3NsX2xvY2wuaCIKKworLyogQWRkIHRoZSBjbGllbnQncyByZW5lZ290aWF0aW9uIGJpbmRpbmcgKi8KK2ludCBzc2xfYWRkX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKnAsIGludCAqbGVuLAorCQkJCQlpbnQgbWF4bGVuKQorICAgIHsKKyAgICBpZihwKQorICAgICAgICB7CisJaWYoKHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuKzEpID4gbWF4bGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9BRERfQ0xJRU5USEVMTE9fUkVORUdPVElBVEVfRVhULFNTTF9SX1JFTkVHT1RJQVRFX0VYVF9UT09fTE9ORyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAvKiBMZW5ndGggYnl0ZSAqLworCSpwID0gcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW47CisgICAgICAgIHArKzsKKworICAgICAgICBtZW1jcHkocCwgcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZCwKKwkgICAgICAgcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4pOworI2lmZGVmIE9QRU5TU0xfUklfREVCVUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIFJJIGV4dGVuc2lvbiBzZW50IGJ5IGNsaWVudFxuIiwKKwkJcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4gPyAiTm9uLWVtcHR5IiA6ICJFbXB0eSIpOworI2VuZGlmCisgICAgICAgIH0KKyAgICAKKyAgICAqbGVuPXMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuICsgMTsKKworIAorICAgIHJldHVybiAxOworICAgIH0KKworLyogUGFyc2UgdGhlIGNsaWVudCdzIHJlbmVnb3RpYXRpb24gYmluZGluZyBhbmQgYWJvcnQgaWYgaXQncyBub3QKKyAgIHJpZ2h0ICovCitpbnQgc3NsX3BhcnNlX2NsaWVudGhlbGxvX3JlbmVnb3RpYXRlX2V4dChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKmQsIGludCBsZW4sCisJCQkJCSAgaW50ICphbCkKKyAgICB7CisgICAgaW50IGlsZW47CisKKyAgICAvKiBQYXJzZSB0aGUgbGVuZ3RoIGJ5dGUgKi8KKyAgICBpZihsZW4gPCAxKQorICAgICAgICB7CisgICAgICAgIFNTTGVycihTU0xfRl9TU0xfUEFSU0VfQ0xJRU5USEVMTE9fUkVORUdPVElBVEVfRVhULFNTTF9SX1JFTkVHT1RJQVRJT05fRU5DT0RJTkdfRVJSKTsKKyAgICAgICAgKmFsPVNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICBpbGVuID0gKmQ7CisgICAgZCsrOworCisgICAgLyogQ29uc2lzdGVuY3kgY2hlY2sgKi8KKyAgICBpZigoaWxlbisxKSAhPSBsZW4pCisgICAgICAgIHsKKyAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9QQVJTRV9DTElFTlRIRUxMT19SRU5FR09USUFURV9FWFQsU1NMX1JfUkVORUdPVElBVElPTl9FTkNPRElOR19FUlIpOworICAgICAgICAqYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgLyogQ2hlY2sgdGhhdCB0aGUgZXh0ZW5zaW9uIG1hdGNoZXMgKi8KKyAgICBpZihpbGVuICE9IHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuKQorICAgICAgICB7CisgICAgICAgIFNTTGVycihTU0xfRl9TU0xfUEFSU0VfQ0xJRU5USEVMTE9fUkVORUdPVElBVEVfRVhULFNTTF9SX1JFTkVHT1RJQVRJT05fTUlTTUFUQ0gpOworICAgICAgICAqYWw9U1NMX0FEX0hBTkRTSEFLRV9GQUlMVVJFOworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIAorICAgIGlmKG1lbWNtcChkLCBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkLAorCSAgICAgIHMtPnMzLT5wcmV2aW91c19jbGllbnRfZmluaXNoZWRfbGVuKSkKKyAgICAgICAgeworICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMX1BBUlNFX0NMSUVOVEhFTExPX1JFTkVHT1RJQVRFX0VYVCxTU0xfUl9SRU5FR09USUFUSU9OX01JU01BVENIKTsKKyAgICAgICAgKmFsPVNTTF9BRF9IQU5EU0hBS0VfRkFJTFVSRTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyNpZmRlZiBPUEVOU1NMX1JJX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICIlcyBSSSBleHRlbnNpb24gcmVjZWl2ZWQgYnkgc2VydmVyXG4iLAorCQkJCWlsZW4gPyAiTm9uLWVtcHR5IiA6ICJFbXB0eSIpOworI2VuZGlmCisKKyAgICBzLT5zMy0+c2VuZF9jb25uZWN0aW9uX2JpbmRpbmc9MTsKKworICAgIHJldHVybiAxOworICAgIH0KKworLyogQWRkIHRoZSBzZXJ2ZXIncyByZW5lZ290aWF0aW9uIGJpbmRpbmcgKi8KK2ludCBzc2xfYWRkX3NlcnZlcmhlbGxvX3JlbmVnb3RpYXRlX2V4dChTU0wgKnMsIHVuc2lnbmVkIGNoYXIgKnAsIGludCAqbGVuLAorCQkJCQlpbnQgbWF4bGVuKQorICAgIHsKKyAgICBpZihwKQorICAgICAgICB7CisgICAgICAgIGlmKChzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbiArCisgICAgICAgICAgICBzLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkX2xlbiArIDEpID4gbWF4bGVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9BRERfU0VSVkVSSEVMTE9fUkVORUdPVElBVEVfRVhULFNTTF9SX1JFTkVHT1RJQVRFX0VYVF9UT09fTE9ORyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIExlbmd0aCBieXRlICovCisgICAgICAgICpwID0gcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4gKyBzLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkX2xlbjsKKyAgICAgICAgcCsrOworCisgICAgICAgIG1lbWNweShwLCBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkLAorCSAgICAgICBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbik7CisgICAgICAgIHAgKz0gcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW47CisKKyAgICAgICAgbWVtY3B5KHAsIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWQsCisJICAgICAgIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuKTsKKyNpZmRlZiBPUEVOU1NMX1JJX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICIlcyBSSSBleHRlbnNpb24gc2VudCBieSBzZXJ2ZXJcbiIsCisgICAgCQlzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbiA/ICJOb24tZW1wdHkiIDogIkVtcHR5Iik7CisjZW5kaWYKKyAgICAgICAgfQorICAgIAorICAgICpsZW49cy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4KKwkrIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuICsgMTsKKyAgICAKKyAgICByZXR1cm4gMTsKKyAgICB9CisKKy8qIFBhcnNlIHRoZSBzZXJ2ZXIncyByZW5lZ290aWF0aW9uIGJpbmRpbmcgYW5kIGFib3J0IGlmIGl0J3Mgbm90CisgICByaWdodCAqLworaW50IHNzbF9wYXJzZV9zZXJ2ZXJoZWxsb19yZW5lZ290aWF0ZV9leHQoU1NMICpzLCB1bnNpZ25lZCBjaGFyICpkLCBpbnQgbGVuLAorCQkJCQkgIGludCAqYWwpCisgICAgeworICAgIGludCBleHBlY3RlZF9sZW49cy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4KKwkrIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuOworICAgIGludCBpbGVuOworCisgICAgLyogQ2hlY2sgZm9yIGxvZ2ljIGVycm9ycyAqLworICAgIE9QRU5TU0xfYXNzZXJ0KCFleHBlY3RlZF9sZW4gfHwgcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZF9sZW4pOworICAgIE9QRU5TU0xfYXNzZXJ0KCFleHBlY3RlZF9sZW4gfHwgcy0+czMtPnByZXZpb3VzX3NlcnZlcl9maW5pc2hlZF9sZW4pOworICAgIAorICAgIC8qIFBhcnNlIHRoZSBsZW5ndGggYnl0ZSAqLworICAgIGlmKGxlbiA8IDEpCisgICAgICAgIHsKKyAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9QQVJTRV9TRVJWRVJIRUxMT19SRU5FR09USUFURV9FWFQsU1NMX1JfUkVORUdPVElBVElPTl9FTkNPRElOR19FUlIpOworICAgICAgICAqYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIGlsZW4gPSAqZDsKKyAgICBkKys7CisKKyAgICAvKiBDb25zaXN0ZW5jeSBjaGVjayAqLworICAgIGlmKGlsZW4rMSAhPSBsZW4pCisgICAgICAgIHsKKyAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9QQVJTRV9TRVJWRVJIRUxMT19SRU5FR09USUFURV9FWFQsU1NMX1JfUkVORUdPVElBVElPTl9FTkNPRElOR19FUlIpOworICAgICAgICAqYWw9U1NMX0FEX0lMTEVHQUxfUEFSQU1FVEVSOworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIAorICAgIC8qIENoZWNrIHRoYXQgdGhlIGV4dGVuc2lvbiBtYXRjaGVzICovCisgICAgaWYoaWxlbiAhPSBleHBlY3RlZF9sZW4pCisgICAgICAgIHsKKyAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9QQVJTRV9TRVJWRVJIRUxMT19SRU5FR09USUFURV9FWFQsU1NMX1JfUkVORUdPVElBVElPTl9NSVNNQVRDSCk7CisgICAgICAgICphbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICBpZihtZW1jbXAoZCwgcy0+czMtPnByZXZpb3VzX2NsaWVudF9maW5pc2hlZCwKKwkgICAgICBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbikpCisgICAgICAgIHsKKyAgICAgICAgU1NMZXJyKFNTTF9GX1NTTF9QQVJTRV9TRVJWRVJIRUxMT19SRU5FR09USUFURV9FWFQsU1NMX1JfUkVORUdPVElBVElPTl9NSVNNQVRDSCk7CisgICAgICAgICphbD1TU0xfQURfSEFORFNIQUtFX0ZBSUxVUkU7CisgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgZCArPSBzLT5zMy0+cHJldmlvdXNfY2xpZW50X2ZpbmlzaGVkX2xlbjsKKworICAgIGlmKG1lbWNtcChkLCBzLT5zMy0+cHJldmlvdXNfc2VydmVyX2ZpbmlzaGVkLAorCSAgICAgIHMtPnMzLT5wcmV2aW91c19zZXJ2ZXJfZmluaXNoZWRfbGVuKSkKKyAgICAgICAgeworICAgICAgICBTU0xlcnIoU1NMX0ZfU1NMX1BBUlNFX1NFUlZFUkhFTExPX1JFTkVHT1RJQVRFX0VYVCxTU0xfUl9SRU5FR09USUFUSU9OX01JU01BVENIKTsKKyAgICAgICAgKmFsPVNTTF9BRF9JTExFR0FMX1BBUkFNRVRFUjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyNpZmRlZiBPUEVOU1NMX1JJX0RFQlVHCisgICAgZnByaW50ZihzdGRlcnIsICIlcyBSSSBleHRlbnNpb24gcmVjZWl2ZWQgYnkgY2xpZW50XG4iLAorCQkJCWlsZW4gPyAiTm9uLWVtcHR5IiA6ICJFbXB0eSIpOworI2VuZGlmCisgICAgcy0+czMtPnNlbmRfY29ubmVjdGlvbl9iaW5kaW5nPTE7CisKKyAgICByZXR1cm4gMTsKKyAgICB9CmRpZmYgLS1naXQgYS9saWIvb3BlbnNzbC9zc2wvdDFfc3J2ci5jIGIvbGliL29wZW5zc2wvc3NsL3QxX3NydnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjUyNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL29wZW5zc2wvc3NsL3QxX3NydnIuYwpAQCAtMCwwICsxLDgwIEBACisvKiBzc2wvdDFfc3J2ci5jICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwYWNrYWdlIGlzIGFuIFNTTCBpbXBsZW1lbnRhdGlvbiB3cml0dGVuCisgKiBieSBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybSB3aXRoIE5ldHNjYXBlcyBTU0wuCisgKiAKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcworICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBhaGVhcmVkIHRvLiAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiwgYmUgaXQgdGhlIFJDNCwgUlNBLAorICogbGhhc2gsIERFUywgZXRjLiwgY29kZTsgbm90IGp1c3QgdGhlIFNTTCBjb2RlLiAgVGhlIFNTTCBkb2N1bWVudGF0aW9uCisgKiBpbmNsdWRlZCB3aXRoIHRoaXMgZGlzdHJpYnV0aW9uIGlzIGNvdmVyZWQgYnkgdGhlIHNhbWUgY29weXJpZ2h0IHRlcm1zCisgKiBleGNlcHQgdGhhdCB0aGUgaG9sZGVyIGlzIFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKS4KKyAqIAorICogQ29weXJpZ2h0IHJlbWFpbnMgRXJpYyBZb3VuZydzLCBhbmQgYXMgc3VjaCBhbnkgQ29weXJpZ2h0IG5vdGljZXMgaW4KKyAqIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4KKyAqIElmIHRoaXMgcGFja2FnZSBpcyB1c2VkIGluIGEgcHJvZHVjdCwgRXJpYyBZb3VuZyBzaG91bGQgYmUgZ2l2ZW4gYXR0cmlidXRpb24KKyAqIGFzIHRoZSBhdXRob3Igb2YgdGhlIHBhcnRzIG9mIHRoZSBsaWJyYXJ5IHVzZWQuCisgKiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtIHN0YXJ0dXAgb3IKKyAqIGluIGRvY3VtZW50YXRpb24gKG9ubGluZSBvciB0ZXh0dWFsKSBwcm92aWRlZCB3aXRoIHRoZSBwYWNrYWdlLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBjcnlwdG9ncmFwaGljIHNvZnR3YXJlIHdyaXR0ZW4gYnkKKyAqICAgICBFcmljIFlvdW5nIChlYXlAY3J5cHRzb2Z0LmNvbSkiCisgKiAgICBUaGUgd29yZCAnY3J5cHRvZ3JhcGhpYycgY2FuIGJlIGxlZnQgb3V0IGlmIHRoZSByb3VpbmVzIGZyb20gdGhlIGxpYnJhcnkKKyAqICAgIGJlaW5nIHVzZWQgYXJlIG5vdCBjcnlwdG9ncmFwaGljIHJlbGF0ZWQgOi0pLgorICogNC4gSWYgeW91IGluY2x1ZGUgYW55IFdpbmRvd3Mgc3BlY2lmaWMgY29kZSAob3IgYSBkZXJpdmF0aXZlIHRoZXJlb2YpIGZyb20gCisgKiAgICB0aGUgYXBwcyBkaXJlY3RvcnkgKGFwcGxpY2F0aW9uIGNvZGUpIHlvdSBtdXN0IGluY2x1ZGUgYW4gYWNrbm93bGVkZ2VtZW50OgorICogICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSB3cml0dGVuIGJ5IFRpbSBIdWRzb24gKHRqaEBjcnlwdHNvZnQuY29tKSIKKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogCisgKiBUaGUgbGljZW5jZSBhbmQgZGlzdHJpYnV0aW9uIHRlcm1zIGZvciBhbnkgcHVibGljYWxseSBhdmFpbGFibGUgdmVyc2lvbiBvcgorICogZGVyaXZhdGl2ZSBvZiB0aGlzIGNvZGUgY2Fubm90IGJlIGNoYW5nZWQuICBpLmUuIHRoaXMgY29kZSBjYW5ub3Qgc2ltcGx5IGJlCisgKiBjb3BpZWQgYW5kIHB1dCB1bmRlciBhbm90aGVyIGRpc3RyaWJ1dGlvbiBsaWNlbmNlCisgKiBbaW5jbHVkaW5nIHRoZSBHTlUgUHVibGljIExpY2VuY2UuXQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInNzbF9sb2NsLmgiCisjaW5jbHVkZSA8b3BlbnNzbC9idWZmZXIuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL29iamVjdHMuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2V2cC5oPgorI2luY2x1ZGUgPG9wZW5zc2wveDUwOS5oPgorCitzdGF0aWMgY29uc3QgU1NMX01FVEhPRCAqdGxzMV9nZXRfc2VydmVyX21ldGhvZChpbnQgdmVyKTsKK3N0YXRpYyBjb25zdCBTU0xfTUVUSE9EICp0bHMxX2dldF9zZXJ2ZXJfbWV0aG9kKGludCB2ZXIpCisJeworCWlmICh2ZXIgPT0gVExTMV9WRVJTSU9OKQorCQlyZXR1cm4oVExTdjFfc2VydmVyX21ldGhvZCgpKTsKKwllbHNlCisJCXJldHVybihOVUxMKTsKKwl9CisKK0lNUExFTUVOVF90bHMxX21ldGhfZnVuYyhUTFN2MV9zZXJ2ZXJfbWV0aG9kLAorCQkJc3NsM19hY2NlcHQsCisJCQlzc2xfdW5kZWZpbmVkX2Z1bmN0aW9uLAorCQkJdGxzMV9nZXRfc2VydmVyX21ldGhvZCkKKwpkaWZmIC0tZ2l0IGEvbGliL29wZW5zc2wvc3NsL3RsczEuaCBiL2xpYi9vcGVuc3NsL3NzbC90bHMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjYzhmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9vcGVuc3NsL3NzbC90bHMxLmgKQEAgLTAsMCArMSw1MzIgQEAKKy8qIHNzbC90bHMxLmggKi8KKy8qIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHBhY2thZ2UgaXMgYW4gU1NMIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4KKyAqIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKS4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgd3JpdHRlbiBzbyBhcyB0byBjb25mb3JtIHdpdGggTmV0c2NhcGVzIFNTTC4KKyAqIAorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgZm9yIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsIHVzZSBhcyBsb25nIGFzCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uICBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFwcGx5IHRvIGFsbCBjb2RlIGZvdW5kIGluIHRoaXMgZGlzdHJpYnV0aW9uLCBiZSBpdCB0aGUgUkM0LCBSU0EsCisgKiBsaGFzaCwgREVTLCBldGMuLCBjb2RlOyBub3QganVzdCB0aGUgU1NMIGNvZGUuICBUaGUgU1NMIGRvY3VtZW50YXRpb24KKyAqIGluY2x1ZGVkIHdpdGggdGhpcyBkaXN0cmlidXRpb24gaXMgY292ZXJlZCBieSB0aGUgc2FtZSBjb3B5cmlnaHQgdGVybXMKKyAqIGV4Y2VwdCB0aGF0IHRoZSBob2xkZXIgaXMgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICogCisgKiBDb3B5cmlnaHQgcmVtYWlucyBFcmljIFlvdW5nJ3MsIGFuZCBhcyBzdWNoIGFueSBDb3B5cmlnaHQgbm90aWNlcyBpbgorICogdGhlIGNvZGUgYXJlIG5vdCB0byBiZSByZW1vdmVkLgorICogSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LCBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbgorICogYXMgdGhlIGF1dGhvciBvZiB0aGUgcGFydHMgb2YgdGhlIGxpYnJhcnkgdXNlZC4KKyAqIFRoaXMgY2FuIGJlIGluIHRoZSBmb3JtIG9mIGEgdGV4dHVhbCBtZXNzYWdlIGF0IHByb2dyYW0gc3RhcnR1cCBvcgorICogaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlIHBhY2thZ2UuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIGNyeXB0b2dyYXBoaWMgc29mdHdhcmUgd3JpdHRlbiBieQorICogICAgIEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKSIKKyAqICAgIFRoZSB3b3JkICdjcnlwdG9ncmFwaGljJyBjYW4gYmUgbGVmdCBvdXQgaWYgdGhlIHJvdWluZXMgZnJvbSB0aGUgbGlicmFyeQorICogICAgYmVpbmcgdXNlZCBhcmUgbm90IGNyeXB0b2dyYXBoaWMgcmVsYXRlZCA6LSkuCisgKiA0LiBJZiB5b3UgaW5jbHVkZSBhbnkgV2luZG93cyBzcGVjaWZpYyBjb2RlIChvciBhIGRlcml2YXRpdmUgdGhlcmVvZikgZnJvbSAKKyAqICAgIHRoZSBhcHBzIGRpcmVjdG9yeSAoYXBwbGljYXRpb24gY29kZSkgeW91IG11c3QgaW5jbHVkZSBhbiBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIHdyaXR0ZW4gYnkgVGltIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pIgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEVSSUMgWU9VTkcgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKiAKKyAqIFRoZSBsaWNlbmNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZSB2ZXJzaW9uIG9yCisgKiBkZXJpdmF0aXZlIG9mIHRoaXMgY29kZSBjYW5ub3QgYmUgY2hhbmdlZC4gIGkuZS4gdGhpcyBjb2RlIGNhbm5vdCBzaW1wbHkgYmUKKyAqIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJpYnV0aW9uIGxpY2VuY2UKKyAqIFtpbmNsdWRpbmcgdGhlIEdOVSBQdWJsaWMgTGljZW5jZS5dCisgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNiBUaGUgT3BlblNTTCBQcm9qZWN0LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCisgKiAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKKyAqICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBPcGVuU1NMIFByb2plY3QKKyAqICAgIGZvciB1c2UgaW4gdGhlIE9wZW5TU0wgVG9vbGtpdC4gKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiA0LiBUaGUgbmFtZXMgIk9wZW5TU0wgVG9vbGtpdCIgYW5kICJPcGVuU1NMIFByb2plY3QiIG11c3Qgbm90IGJlIHVzZWQgdG8KKyAqICAgIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0CisgKiAgICBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCisgKgorICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIk9wZW5TU0wiCisgKiAgICBub3IgbWF5ICJPcGVuU1NMIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgd2l0aG91dCBwcmlvciB3cml0dGVuCisgKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBPcGVuU1NMIFByb2plY3QuCisgKgorICogNi4gUmVkaXN0cmlidXRpb25zIG9mIGFueSBmb3JtIHdoYXRzb2V2ZXIgbXVzdCByZXRhaW4gdGhlIGZvbGxvd2luZworICogICAgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgT3BlblNTTCBQcm9qZWN0CisgKiAgICBmb3IgdXNlIGluIHRoZSBPcGVuU1NMIFRvb2xraXQgKGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvKSIKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBPcGVuU1NMIFBST0pFQ1QgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1NFRCBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPcGVuU1NMIFBST0pFQ1QgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRAorICogT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB3cml0dGVuIGJ5IEVyaWMgWW91bmcKKyAqIChlYXlAY3J5cHRzb2Z0LmNvbSkuICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgd3JpdHRlbiBieSBUaW0KKyAqIEh1ZHNvbiAodGpoQGNyeXB0c29mdC5jb20pLgorICoKKyAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvcHlyaWdodCAyMDAyIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQUxMIFJJR0hUUyBSRVNFUlZFRC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGUgYXR0YWNoZWQgc29mdHdhcmUgKCJDb250cmlidXRpb24iKSBhcmUgZGV2ZWxvcGVkIGJ5IAorICogU1VOIE1JQ1JPU1lTVEVNUywgSU5DLiwgYW5kIGFyZSBjb250cmlidXRlZCB0byB0aGUgT3BlblNTTCBwcm9qZWN0LgorICoKKyAqIFRoZSBDb250cmlidXRpb24gaXMgbGljZW5zZWQgcHVyc3VhbnQgdG8gdGhlIE9wZW5TU0wgb3BlbiBzb3VyY2UKKyAqIGxpY2Vuc2UgcHJvdmlkZWQgYWJvdmUuCisgKgorICogRUNDIGNpcGhlciBzdWl0ZSBzdXBwb3J0IGluIE9wZW5TU0wgb3JpZ2luYWxseSB3cml0dGVuIGJ5CisgKiBWaXB1bCBHdXB0YSBhbmQgU3VtaXQgR3VwdGEgb2YgU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMuCisgKgorICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weXJpZ2h0IDIwMDUgTm9raWEuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhlIHBvcnRpb25zIG9mIHRoZSBhdHRhY2hlZCBzb2Z0d2FyZSAoIkNvbnRyaWJ1dGlvbiIpIGlzIGRldmVsb3BlZCBieQorICogTm9raWEgQ29ycG9yYXRpb24gYW5kIGlzIGxpY2Vuc2VkIHB1cnN1YW50IHRvIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlCisgKiBsaWNlbnNlLgorICoKKyAqIFRoZSBDb250cmlidXRpb24sIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBNaWthIEtvdXNhIGFuZCBQYXNpIEVyb25lbiBvZgorICogTm9raWEgQ29ycG9yYXRpb24sIGNvbnNpc3RzIG9mIHRoZSAiUFNLIiAoUHJlLVNoYXJlZCBLZXkpIGNpcGhlcnN1aXRlcworICogc3VwcG9ydCAoc2VlIFJGQyA0Mjc5KSB0byBPcGVuU1NMLgorICoKKyAqIE5vIHBhdGVudCBsaWNlbnNlcyBvciBvdGhlciByaWdodHMgZXhjZXB0IHRob3NlIGV4cHJlc3NseSBzdGF0ZWQgaW4KKyAqIHRoZSBPcGVuU1NMIG9wZW4gc291cmNlIGxpY2Vuc2Ugc2hhbGwgYmUgZGVlbWVkIGdyYW50ZWQgb3IgcmVjZWl2ZWQKKyAqIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsLCBvciBvdGhlcndpc2UuCisgKgorICogTm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgTm9raWEgdGhhdCB0aGUgQ29udHJpYnV0aW9uIGRvZXMgbm90CisgKiBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IHRoaXJkCisgKiBwYXJ0eSBvciB0aGF0IHRoZSBsaWNlbnNlIHByb3ZpZGVzIHlvdSB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IHJpZ2h0cworICogdG8gbWFrZSB1c2Ugb2YgdGhlIENvbnRyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELiBJTgorICogQURESVRJT04gVE8gVEhFIERJU0NMQUlNRVJTIElOQ0xVREVEIElOIFRIRSBMSUNFTlNFLCBOT0tJQQorICogU1BFQ0lGSUNBTExZIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIEZPUiBDTEFJTVMgQlJPVUdIVCBCWSBZT1UgT1IgQU5ZCisgKiBPVEhFUiBFTlRJVFkgQkFTRUQgT04gSU5GUklOR0VNRU5UIE9GIElOVEVMTEVDVFVBTCBQUk9QRVJUWSBSSUdIVFMgT1IKKyAqIE9USEVSV0lTRS4KKyAqLworCisjaWZuZGVmIEhFQURFUl9UTFMxX0ggCisjZGVmaW5lIEhFQURFUl9UTFMxX0ggCisKKyNpbmNsdWRlIDxvcGVuc3NsL2J1ZmZlci5oPgorCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFRMUzFfQUxMT1dfRVhQRVJJTUVOVEFMX0NJUEhFUlNVSVRFUwkwCisKKyNkZWZpbmUgVExTMV9WRVJTSU9OCQkJMHgwMzAxCisjZGVmaW5lIFRMUzFfVkVSU0lPTl9NQUpPUgkJMHgwMworI2RlZmluZSBUTFMxX1ZFUlNJT05fTUlOT1IJCTB4MDEKKworI2RlZmluZSBUTFMxX0FEX0RFQ1JZUFRJT05fRkFJTEVECTIxCisjZGVmaW5lIFRMUzFfQURfUkVDT1JEX09WRVJGTE9XCQkyMgorI2RlZmluZSBUTFMxX0FEX1VOS05PV05fQ0EJCTQ4CS8qIGZhdGFsICovCisjZGVmaW5lIFRMUzFfQURfQUNDRVNTX0RFTklFRAkJNDkJLyogZmF0YWwgKi8KKyNkZWZpbmUgVExTMV9BRF9ERUNPREVfRVJST1IJCTUwCS8qIGZhdGFsICovCisjZGVmaW5lIFRMUzFfQURfREVDUllQVF9FUlJPUgkJNTEKKyNkZWZpbmUgVExTMV9BRF9FWFBPUlRfUkVTVFJJQ1RJT04JNjAJLyogZmF0YWwgKi8KKyNkZWZpbmUgVExTMV9BRF9QUk9UT0NPTF9WRVJTSU9OCTcwCS8qIGZhdGFsICovCisjZGVmaW5lIFRMUzFfQURfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZCTcxCS8qIGZhdGFsICovCisjZGVmaW5lIFRMUzFfQURfSU5URVJOQUxfRVJST1IJCTgwCS8qIGZhdGFsICovCisjZGVmaW5lIFRMUzFfQURfVVNFUl9DQU5DRUxMRUQJCTkwCisjZGVmaW5lIFRMUzFfQURfTk9fUkVORUdPVElBVElPTgkxMDAKKy8qIGNvZGVzIDExMC0xMTQgYXJlIGZyb20gUkZDMzU0NiAqLworI2RlZmluZSBUTFMxX0FEX1VOU1VQUE9SVEVEX0VYVEVOU0lPTgkxMTAKKyNkZWZpbmUgVExTMV9BRF9DRVJUSUZJQ0FURV9VTk9CVEFJTkFCTEUgMTExCisjZGVmaW5lIFRMUzFfQURfVU5SRUNPR05JWkVEX05BTUUgCTExMgorI2RlZmluZSBUTFMxX0FEX0JBRF9DRVJUSUZJQ0FURV9TVEFUVVNfUkVTUE9OU0UgMTEzCisjZGVmaW5lIFRMUzFfQURfQkFEX0NFUlRJRklDQVRFX0hBU0hfVkFMVUUgMTE0CisjZGVmaW5lIFRMUzFfQURfVU5LTk9XTl9QU0tfSURFTlRJVFkJMTE1CS8qIGZhdGFsICovCisKKy8qIEV4dGVuc2lvblR5cGUgdmFsdWVzIGZyb20gUkZDMzU0NiAvIFJGQzQzNjYgKi8KKyNkZWZpbmUgVExTRVhUX1RZUEVfc2VydmVyX25hbWUJCQkwCisjZGVmaW5lIFRMU0VYVF9UWVBFX21heF9mcmFnbWVudF9sZW5ndGgJCTEKKyNkZWZpbmUgVExTRVhUX1RZUEVfY2xpZW50X2NlcnRpZmljYXRlX3VybAkyCisjZGVmaW5lIFRMU0VYVF9UWVBFX3RydXN0ZWRfY2Ffa2V5cwkJMworI2RlZmluZSBUTFNFWFRfVFlQRV90cnVuY2F0ZWRfaG1hYwkJNAorI2RlZmluZSBUTFNFWFRfVFlQRV9zdGF0dXNfcmVxdWVzdAkJNQorLyogRXh0ZW5zaW9uVHlwZSB2YWx1ZXMgZnJvbSBSRkM0NDkyICovCisjZGVmaW5lIFRMU0VYVF9UWVBFX2VsbGlwdGljX2N1cnZlcwkJMTAKKyNkZWZpbmUgVExTRVhUX1RZUEVfZWNfcG9pbnRfZm9ybWF0cwkJMTEKKyNkZWZpbmUgVExTRVhUX1RZUEVfc2Vzc2lvbl90aWNrZXQJCTM1CisvKiBFeHRlbnNpb25UeXBlIHZhbHVlIGZyb20gZHJhZnQtcmVzY29ybGEtdGxzLW9wYXF1ZS1wcmYtaW5wdXQtMDAudHh0ICovCisjaWYgMCAvKiB3aWxsIGhhdmUgdG8gYmUgcHJvdmlkZWQgZXh0ZXJuYWxseSBmb3Igbm93ICwKKyAgICAgICAqIGkuZS4gYnVpbGQgd2l0aCAtRFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQ9MzgxODMKKyAgICAgICAqIHVzaW5nIHdoYXRldmVyIGV4dGVuc2lvbiBudW1iZXIgeW91J2QgbGlrZSB0byB0cnkgKi8KKyMgZGVmaW5lIFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQJCT8/ICovCisjZW5kaWYKKworLyogVGVtcG9yYXJ5IGV4dGVuc2lvbiB0eXBlICovCisjZGVmaW5lIFRMU0VYVF9UWVBFX3JlbmVnb3RpYXRlICAgICAgICAgICAgICAgICAweGZmMDEKKworLyogTmFtZVR5cGUgdmFsdWUgZnJvbSBSRkMgMzU0NiAqLworI2RlZmluZSBUTFNFWFRfTkFNRVRZUEVfaG9zdF9uYW1lIDAKKy8qIHN0YXR1cyByZXF1ZXN0IHZhbHVlIGZyb20gUkZDIDM1NDYgKi8KKyNkZWZpbmUgVExTRVhUX1NUQVRVU1RZUEVfb2NzcCAxCisKKy8qIEVDUG9pbnRGb3JtYXQgdmFsdWVzIGZyb20gZHJhZnQtaWV0Zi10bHMtZWNjLTEyICovCisjZGVmaW5lIFRMU0VYVF9FQ1BPSU5URk9STUFUX2ZpcnN0CQkJMAorI2RlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF91bmNvbXByZXNzZWQJCTAKKyNkZWZpbmUgVExTRVhUX0VDUE9JTlRGT1JNQVRfYW5zaVg5NjJfY29tcHJlc3NlZF9wcmltZQkxCisjZGVmaW5lIFRMU0VYVF9FQ1BPSU5URk9STUFUX2Fuc2lYOTYyX2NvbXByZXNzZWRfY2hhcjIJMgorI2RlZmluZSBUTFNFWFRfRUNQT0lOVEZPUk1BVF9sYXN0CQkJMgorCisjaWZuZGVmIE9QRU5TU0xfTk9fVExTRVhUCisKKyNkZWZpbmUgVExTRVhUX01BWExFTl9ob3N0X25hbWUgMjU1CisKK2NvbnN0IGNoYXIgKlNTTF9nZXRfc2VydmVybmFtZShjb25zdCBTU0wgKnMsIGNvbnN0IGludCB0eXBlKSA7CitpbnQgU1NMX2dldF9zZXJ2ZXJuYW1lX3R5cGUoY29uc3QgU1NMICpzKSA7CisKKyNkZWZpbmUgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKHMsbmFtZSkgXAorU1NMX2N0cmwocyxTU0xfQ1RSTF9TRVRfVExTRVhUX0hPU1ROQU1FLFRMU0VYVF9OQU1FVFlQRV9ob3N0X25hbWUsKGNoYXIgKiluYW1lKQorCisjZGVmaW5lIFNTTF9zZXRfdGxzZXh0X2RlYnVnX2NhbGxiYWNrKHNzbCwgY2IpIFwKK1NTTF9jYWxsYmFja19jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVExTRVhUX0RFQlVHX0NCLCh2b2lkICgqKSh2b2lkKSljYikKKworI2RlZmluZSBTU0xfc2V0X3Rsc2V4dF9kZWJ1Z19hcmcoc3NsLCBhcmcpIFwKK1NTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVExTRVhUX0RFQlVHX0FSRywwLCAodm9pZCAqKWFyZykKKworI2RlZmluZSBTU0xfc2V0X3Rsc2V4dF9zdGF0dXNfdHlwZShzc2wsIHR5cGUpIFwKK1NTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfVFlQRSx0eXBlLCBOVUxMKQorCisjZGVmaW5lIFNTTF9nZXRfdGxzZXh0X3N0YXR1c19leHRzKHNzbCwgYXJnKSBcCitTU0xfY3RybChzc2wsU1NMX0NUUkxfR0VUX1RMU0VYVF9TVEFUVVNfUkVRX0VYVFMsMCwgKHZvaWQgKilhcmcpCisKKyNkZWZpbmUgU1NMX3NldF90bHNleHRfc3RhdHVzX2V4dHMoc3NsLCBhcmcpIFwKK1NTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfRVhUUywwLCAodm9pZCAqKWFyZykKKworI2RlZmluZSBTU0xfZ2V0X3Rsc2V4dF9zdGF0dXNfaWRzKHNzbCwgYXJnKSBcCitTU0xfY3RybChzc2wsU1NMX0NUUkxfR0VUX1RMU0VYVF9TVEFUVVNfUkVRX0lEUywwLCAodm9pZCAqKWFyZykKKworI2RlZmluZSBTU0xfc2V0X3Rsc2V4dF9zdGF0dXNfaWRzKHNzbCwgYXJnKSBcCitTU0xfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RMU0VYVF9TVEFUVVNfUkVRX0lEUywwLCAodm9pZCAqKWFyZykKKworI2RlZmluZSBTU0xfZ2V0X3Rsc2V4dF9zdGF0dXNfb2NzcF9yZXNwKHNzbCwgYXJnKSBcCitTU0xfY3RybChzc2wsU1NMX0NUUkxfR0VUX1RMU0VYVF9TVEFUVVNfUkVRX09DU1BfUkVTUCwwLCAodm9pZCAqKWFyZykKKworI2RlZmluZSBTU0xfc2V0X3Rsc2V4dF9zdGF0dXNfb2NzcF9yZXNwKHNzbCwgYXJnLCBhcmdsZW4pIFwKK1NTTF9jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfT0NTUF9SRVNQLGFyZ2xlbiwgKHZvaWQgKilhcmcpCisKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfY2FsbGJhY2soY3R4LCBjYikgXAorU1NMX0NUWF9jYWxsYmFja19jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQ0IsKHZvaWQgKCopKHZvaWQpKWNiKQorCisjZGVmaW5lIFNTTF9UTFNFWFRfRVJSX09LIDAKKyNkZWZpbmUgU1NMX1RMU0VYVF9FUlJfQUxFUlRfV0FSTklORyAxCisjZGVmaW5lIFNTTF9UTFNFWFRfRVJSX0FMRVJUX0ZBVEFMIDIKKyNkZWZpbmUgU1NMX1RMU0VYVF9FUlJfTk9BQ0sgMworCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2FyZyhjdHgsIGFyZykgXAorU1NMX0NUWF9jdHJsKGN0eCxTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQVJHLDAsICh2b2lkICopYXJnKQorCisjZGVmaW5lIFNTTF9DVFhfZ2V0X3Rsc2V4dF90aWNrZXRfa2V5cyhjdHgsIGtleXMsIGtleWxlbikgXAorCVNTTF9DVFhfY3RybCgoY3R4KSxTU0xfQ1RSTF9HRVRfVExTRVhUX1RJQ0tFVF9LRVlTLChrZXlsZW4pLChrZXlzKSkKKyNkZWZpbmUgU1NMX0NUWF9zZXRfdGxzZXh0X3RpY2tldF9rZXlzKGN0eCwga2V5cywga2V5bGVuKSBcCisJU1NMX0NUWF9jdHJsKChjdHgpLFNTTF9DVFJMX1NFVF9UTFNFWFRfVElDS0VUX0tFWVMsKGtleWxlbiksKGtleXMpKQorCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF9zdGF0dXNfY2Ioc3NsLCBjYikgXAorU1NMX0NUWF9jYWxsYmFja19jdHJsKHNzbCxTU0xfQ1RSTF9TRVRfVExTRVhUX1NUQVRVU19SRVFfQ0IsKHZvaWQgKCopKHZvaWQpKWNiKQorCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF9zdGF0dXNfYXJnKHNzbCwgYXJnKSBcCitTU0xfQ1RYX2N0cmwoc3NsLFNTTF9DVFJMX1NFVF9UTFNFWFRfU1RBVFVTX1JFUV9DQl9BUkcsMCwgKHZvaWQgKilhcmcpCisKKyNkZWZpbmUgU1NMX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dChzLCBzcmMsIGxlbikgXAorU1NMX2N0cmwocyxTU0xfQ1RSTF9TRVRfVExTRVhUX09QQVFVRV9QUkZfSU5QVVQsIGxlbiwgc3JjKQorI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFjayhjdHgsIGNiKSBcCitTU0xfQ1RYX2NhbGxiYWNrX2N0cmwoY3R4LFNTTF9DVFJMX1NFVF9UTFNFWFRfT1BBUVVFX1BSRl9JTlBVVF9DQiwgKHZvaWQgKCopKHZvaWQpKWNiKQorI2RlZmluZSBTU0xfQ1RYX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFja19hcmcoY3R4LCBhcmcpIFwKK1NTTF9DVFhfY3RybChjdHgsU1NMX0NUUkxfU0VUX1RMU0VYVF9PUEFRVUVfUFJGX0lOUFVUX0NCX0FSRywgMCwgYXJnKQorCisjZGVmaW5lIFNTTF9DVFhfc2V0X3Rsc2V4dF90aWNrZXRfa2V5X2NiKHNzbCwgY2IpIFwKK1NTTF9DVFhfY2FsbGJhY2tfY3RybChzc2wsU1NMX0NUUkxfU0VUX1RMU0VYVF9USUNLRVRfS0VZX0NCLCh2b2lkICgqKSh2b2lkKSljYikKKworI2VuZGlmCisKKy8qIFBTSyBjaXBoZXJzdWl0ZXMgZnJvbSA0Mjc5ICovCisjZGVmaW5lIFRMUzFfQ0tfUFNLX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwOEEKKyNkZWZpbmUgVExTMV9DS19QU0tfV0lUSF8zREVTX0VERV9DQkNfU0hBICAgICAgICAgICAgICAgMHgwMzAwMDA4QgorI2RlZmluZSBUTFMxX0NLX1BTS19XSVRIX0FFU18xMjhfQ0JDX1NIQSAgICAgICAgICAgICAgICAweDAzMDAwMDhDCisjZGVmaW5lIFRMUzFfQ0tfUFNLX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgICAgICAgIDB4MDMwMDAwOEQKKworLyogQWRkaXRpb25hbCBUTFMgY2lwaGVyc3VpdGVzIGZyb20gZXhwaXJlZCBJbnRlcm5ldCBEcmFmdAorICogZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wMS50eHQKKyAqIChhdmFpbGFibGUgaWYgVExTMV9BTExPV19FWFBFUklNRU5UQUxfQ0lQSEVSU1VJVEVTIGlzIGRlZmluZWQsIHNlZQorICogczNfbGliLmMpLiAgV2UgYWN0dWFsbHkgdHJlYXQgdGhlbSBsaWtlIFNTTCAzLjAgY2lwaGVycywgd2hpY2ggd2UgcHJvYmFibHkKKyAqIHNob3VsZG4ndC4gIE5vdGUgdGhhdCB0aGUgZmlyc3QgdHdvIGFyZSBhY3R1YWxseSBub3QgaW4gdGhlIElEcy4gKi8KKyNkZWZpbmUgVExTMV9DS19SU0FfRVhQT1JUMTAyNF9XSVRIX1JDNF81Nl9NRDUJCTB4MDMwMDAwNjAgLyogbm90IGluIElEICovCisjZGVmaW5lIFRMUzFfQ0tfUlNBX0VYUE9SVDEwMjRfV0lUSF9SQzJfQ0JDXzU2X01ENQkweDAzMDAwMDYxIC8qIG5vdCBpbiBJRCAqLworI2RlZmluZSBUTFMxX0NLX1JTQV9FWFBPUlQxMDI0X1dJVEhfREVTX0NCQ19TSEEJCTB4MDMwMDAwNjIKKyNkZWZpbmUgVExTMV9DS19ESEVfRFNTX0VYUE9SVDEwMjRfV0lUSF9ERVNfQ0JDX1NIQQkweDAzMDAwMDYzCisjZGVmaW5lIFRMUzFfQ0tfUlNBX0VYUE9SVDEwMjRfV0lUSF9SQzRfNTZfU0hBCQkweDAzMDAwMDY0CisjZGVmaW5lIFRMUzFfQ0tfREhFX0RTU19FWFBPUlQxMDI0X1dJVEhfUkM0XzU2X1NIQQkweDAzMDAwMDY1CisjZGVmaW5lIFRMUzFfQ0tfREhFX0RTU19XSVRIX1JDNF8xMjhfU0hBCQkweDAzMDAwMDY2CisKKy8qIEFFUyBjaXBoZXJzdWl0ZXMgZnJvbSBSRkMzMjY4ICovCisKKyNkZWZpbmUgVExTMV9DS19SU0FfV0lUSF9BRVNfMTI4X1NIQQkJCTB4MDMwMDAwMkYKKyNkZWZpbmUgVExTMV9DS19ESF9EU1NfV0lUSF9BRVNfMTI4X1NIQQkJCTB4MDMwMDAwMzAKKyNkZWZpbmUgVExTMV9DS19ESF9SU0FfV0lUSF9BRVNfMTI4X1NIQQkJCTB4MDMwMDAwMzEKKyNkZWZpbmUgVExTMV9DS19ESEVfRFNTX1dJVEhfQUVTXzEyOF9TSEEJCTB4MDMwMDAwMzIKKyNkZWZpbmUgVExTMV9DS19ESEVfUlNBX1dJVEhfQUVTXzEyOF9TSEEJCTB4MDMwMDAwMzMKKyNkZWZpbmUgVExTMV9DS19BREhfV0lUSF9BRVNfMTI4X1NIQQkJCTB4MDMwMDAwMzQKKworI2RlZmluZSBUTFMxX0NLX1JTQV9XSVRIX0FFU18yNTZfU0hBCQkJMHgwMzAwMDAzNQorI2RlZmluZSBUTFMxX0NLX0RIX0RTU19XSVRIX0FFU18yNTZfU0hBCQkJMHgwMzAwMDAzNgorI2RlZmluZSBUTFMxX0NLX0RIX1JTQV9XSVRIX0FFU18yNTZfU0hBCQkJMHgwMzAwMDAzNworI2RlZmluZSBUTFMxX0NLX0RIRV9EU1NfV0lUSF9BRVNfMjU2X1NIQQkJMHgwMzAwMDAzOAorI2RlZmluZSBUTFMxX0NLX0RIRV9SU0FfV0lUSF9BRVNfMjU2X1NIQQkJMHgwMzAwMDAzOQorI2RlZmluZSBUTFMxX0NLX0FESF9XSVRIX0FFU18yNTZfU0hBCQkJMHgwMzAwMDAzQQorCisvKiBDYW1lbGxpYSBjaXBoZXJzdWl0ZXMgZnJvbSBSRkM0MTMyICovCisjZGVmaW5lIFRMUzFfQ0tfUlNBX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJCTB4MDMwMDAwNDEKKyNkZWZpbmUgVExTMV9DS19ESF9EU1NfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkweDAzMDAwMDQyCisjZGVmaW5lIFRMUzFfQ0tfREhfUlNBX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJMHgwMzAwMDA0MworI2RlZmluZSBUTFMxX0NLX0RIRV9EU1NfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkweDAzMDAwMDQ0CisjZGVmaW5lIFRMUzFfQ0tfREhFX1JTQV9XSVRIX0NBTUVMTElBXzEyOF9DQkNfU0hBCTB4MDMwMDAwNDUKKyNkZWZpbmUgVExTMV9DS19BREhfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkJMHgwMzAwMDA0NgorCisjZGVmaW5lIFRMUzFfQ0tfUlNBX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJCTB4MDMwMDAwODQKKyNkZWZpbmUgVExTMV9DS19ESF9EU1NfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQQkweDAzMDAwMDg1CisjZGVmaW5lIFRMUzFfQ0tfREhfUlNBX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJMHgwMzAwMDA4NgorI2RlZmluZSBUTFMxX0NLX0RIRV9EU1NfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQQkweDAzMDAwMDg3CisjZGVmaW5lIFRMUzFfQ0tfREhFX1JTQV9XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBCTB4MDMwMDAwODgKKyNkZWZpbmUgVExTMV9DS19BREhfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQQkJMHgwMzAwMDA4OQorCisvKiBTRUVEIGNpcGhlcnN1aXRlcyBmcm9tIFJGQzQxNjIgKi8KKyNkZWZpbmUgVExTMV9DS19SU0FfV0lUSF9TRUVEX1NIQSAgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwMDA5NgorI2RlZmluZSBUTFMxX0NLX0RIX0RTU19XSVRIX1NFRURfU0hBICAgICAgICAgICAgICAgICAgICAweDAzMDAwMDk3CisjZGVmaW5lIFRMUzFfQ0tfREhfUlNBX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwOTgKKyNkZWZpbmUgVExTMV9DS19ESEVfRFNTX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgICAgMHgwMzAwMDA5OQorI2RlZmluZSBUTFMxX0NLX0RIRV9SU0FfV0lUSF9TRUVEX1NIQSAgICAgICAgICAgICAgICAgICAweDAzMDAwMDlBCisjZGVmaW5lIFRMUzFfQ0tfQURIX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgCTB4MDMwMDAwOUIKKworLyogRUNDIGNpcGhlcnN1aXRlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQgd2l0aCBjaGFuZ2VzIHNvb24gdG8gYmUgaW4gZHJhZnQgMTMgKi8KKyNkZWZpbmUgVExTMV9DS19FQ0RIX0VDRFNBX1dJVEhfTlVMTF9TSEEgICAgICAgICAgICAgICAgMHgwMzAwQzAwMQorI2RlZmluZSBUTFMxX0NLX0VDREhfRUNEU0FfV0lUSF9SQzRfMTI4X1NIQSAgICAgICAgICAgICAweDAzMDBDMDAyCisjZGVmaW5lIFRMUzFfQ0tfRUNESF9FQ0RTQV9XSVRIX0RFU18xOTJfQ0JDM19TSEEgICAgICAgIDB4MDMwMEMwMDMKKyNkZWZpbmUgVExTMV9DS19FQ0RIX0VDRFNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBICAgICAgICAgMHgwMzAwQzAwNAorI2RlZmluZSBUTFMxX0NLX0VDREhfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgICAgICAgICAweDAzMDBDMDA1CisKKyNkZWZpbmUgVExTMV9DS19FQ0RIRV9FQ0RTQV9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAgMHgwMzAwQzAwNgorI2RlZmluZSBUTFMxX0NLX0VDREhFX0VDRFNBX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICAweDAzMDBDMDA3CisjZGVmaW5lIFRMUzFfQ0tfRUNESEVfRUNEU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBICAgICAgIDB4MDMwMEMwMDgKKyNkZWZpbmUgVExTMV9DS19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSAgICAgICAgMHgwMzAwQzAwOQorI2RlZmluZSBUTFMxX0NLX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAweDAzMDBDMDBBCisKKyNkZWZpbmUgVExTMV9DS19FQ0RIX1JTQV9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAgICAgMHgwMzAwQzAwQgorI2RlZmluZSBUTFMxX0NLX0VDREhfUlNBX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICAgICAweDAzMDBDMDBDCisjZGVmaW5lIFRMUzFfQ0tfRUNESF9SU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBICAgICAgICAgIDB4MDMwMEMwMEQKKyNkZWZpbmUgVExTMV9DS19FQ0RIX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSAgICAgICAgICAgMHgwMzAwQzAwRQorI2RlZmluZSBUTFMxX0NLX0VDREhfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgICAweDAzMDBDMDBGCisKKyNkZWZpbmUgVExTMV9DS19FQ0RIRV9SU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICAgMHgwMzAwQzAxMAorI2RlZmluZSBUTFMxX0NLX0VDREhFX1JTQV9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICAweDAzMDBDMDExCisjZGVmaW5lIFRMUzFfQ0tfRUNESEVfUlNBX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSAgICAgICAgIDB4MDMwMEMwMTIKKyNkZWZpbmUgVExTMV9DS19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICAgMHgwMzAwQzAxMworI2RlZmluZSBUTFMxX0NLX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgICAweDAzMDBDMDE0CisKKyNkZWZpbmUgVExTMV9DS19FQ0RIX2Fub25fV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICAgMHgwMzAwQzAxNQorI2RlZmluZSBUTFMxX0NLX0VDREhfYW5vbl9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICAweDAzMDBDMDE2CisjZGVmaW5lIFRMUzFfQ0tfRUNESF9hbm9uX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSAgICAgICAgIDB4MDMwMEMwMTcKKyNkZWZpbmUgVExTMV9DS19FQ0RIX2Fub25fV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICAgMHgwMzAwQzAxOAorI2RlZmluZSBUTFMxX0NLX0VDREhfYW5vbl9XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgICAweDAzMDBDMDE5CisKKy8qIFhYWAorICogSW5jb25zaXN0ZW5jeSBhbGVydDoKKyAqIFRoZSBPcGVuU1NMIG5hbWVzIG9mIGNpcGhlcnMgd2l0aCBlcGhlbWVyYWwgREggaGVyZSBpbmNsdWRlIHRoZSBzdHJpbmcKKyAqICJESEUiLCB3aGlsZSBlbHNld2hlcmUgaXQgaGFzIGFsd2F5cyBiZWVuICJFREgiLgorICogKFRoZSBhbGlhcyBmb3IgdGhlIGxpc3Qgb2YgYWxsIHN1Y2ggY2lwaGVycyBhbHNvIGlzICJFREgiLikKKyAqIFRoZSBzcGVjaWZpY2F0aW9ucyBzcGVhayBvZiAiRURIIjsgbWF5YmUgd2Ugc2hvdWxkIGFsbG93IGJvdGggZm9ybXMKKyAqIGZvciBldmVyeXRoaW5nLiAqLworI2RlZmluZSBUTFMxX1RYVF9SU0FfRVhQT1JUMTAyNF9XSVRIX1JDNF81Nl9NRDUJCSJFWFAxMDI0LVJDNC1NRDUiCisjZGVmaW5lIFRMUzFfVFhUX1JTQV9FWFBPUlQxMDI0X1dJVEhfUkMyX0NCQ181Nl9NRDUJIkVYUDEwMjQtUkMyLUNCQy1NRDUiCisjZGVmaW5lIFRMUzFfVFhUX1JTQV9FWFBPUlQxMDI0X1dJVEhfREVTX0NCQ19TSEEJIkVYUDEwMjQtREVTLUNCQy1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9EU1NfRVhQT1JUMTAyNF9XSVRIX0RFU19DQkNfU0hBCSJFWFAxMDI0LURIRS1EU1MtREVTLUNCQy1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX1JTQV9FWFBPUlQxMDI0X1dJVEhfUkM0XzU2X1NIQQkJIkVYUDEwMjQtUkM0LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhFX0RTU19FWFBPUlQxMDI0X1dJVEhfUkM0XzU2X1NIQQkiRVhQMTAyNC1ESEUtRFNTLVJDNC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9EU1NfV0lUSF9SQzRfMTI4X1NIQQkJIkRIRS1EU1MtUkM0LVNIQSIKKworLyogQUVTIGNpcGhlcnN1aXRlcyBmcm9tIFJGQzMyNjggKi8KKyNkZWZpbmUgVExTMV9UWFRfUlNBX1dJVEhfQUVTXzEyOF9TSEEJCQkiQUVTMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhfRFNTX1dJVEhfQUVTXzEyOF9TSEEJCSJESC1EU1MtQUVTMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhfUlNBX1dJVEhfQUVTXzEyOF9TSEEJCSJESC1SU0EtQUVTMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhFX0RTU19XSVRIX0FFU18xMjhfU0hBCQkiREhFLURTUy1BRVMxMjgtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfUlNBX1dJVEhfQUVTXzEyOF9TSEEJCSJESEUtUlNBLUFFUzEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0FESF9XSVRIX0FFU18xMjhfU0hBCQkJIkFESC1BRVMxMjgtU0hBIgorCisjZGVmaW5lIFRMUzFfVFhUX1JTQV9XSVRIX0FFU18yNTZfU0hBCQkJIkFFUzI1Ni1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX0RTU19XSVRIX0FFU18yNTZfU0hBCQkiREgtRFNTLUFFUzI1Ni1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX1JTQV9XSVRIX0FFU18yNTZfU0hBCQkiREgtUlNBLUFFUzI1Ni1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9EU1NfV0lUSF9BRVNfMjU2X1NIQQkJIkRIRS1EU1MtQUVTMjU2LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhFX1JTQV9XSVRIX0FFU18yNTZfU0hBCQkiREhFLVJTQS1BRVMyNTYtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9BREhfV0lUSF9BRVNfMjU2X1NIQQkJCSJBREgtQUVTMjU2LVNIQSIKKworLyogRUNDIGNpcGhlcnN1aXRlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0wMS50eHQgKE1hciAxNSwgMjAwMSkgKi8KKyNkZWZpbmUgVExTMV9UWFRfRUNESF9FQ0RTQV9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAgIkVDREgtRUNEU0EtTlVMTC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfRUNEU0FfV0lUSF9SQzRfMTI4X1NIQSAgICAgICAgICAgICJFQ0RILUVDRFNBLVJDNC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfRUNEU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBICAgICAgICJFQ0RILUVDRFNBLURFUy1DQkMzLVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESF9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSAgICAgICAgIkVDREgtRUNEU0EtQUVTMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESF9FQ0RTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSAgICAgICAgIkVDREgtRUNEU0EtQUVTMjU2LVNIQSIKKworI2RlZmluZSBUTFMxX1RYVF9FQ0RIRV9FQ0RTQV9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAiRUNESEUtRUNEU0EtTlVMTC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhFX0VDRFNBX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICJFQ0RIRS1FQ0RTQS1SQzQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIRV9FQ0RTQV9XSVRIX0RFU18xOTJfQ0JDM19TSEEgICAgICAiRUNESEUtRUNEU0EtREVTLUNCQzMtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSAgICAgICAiRUNESEUtRUNEU0EtQUVTMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgICAgICAgIkVDREhFLUVDRFNBLUFFUzI1Ni1TSEEiCisKKyNkZWZpbmUgVExTMV9UWFRfRUNESF9SU0FfV0lUSF9OVUxMX1NIQSAgICAgICAgICAgICAgICAgIkVDREgtUlNBLU5VTEwtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIX1JTQV9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICAiRUNESC1SU0EtUkM0LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESF9SU0FfV0lUSF9ERVNfMTkyX0NCQzNfU0hBICAgICAgICAgIkVDREgtUlNBLURFUy1DQkMzLVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESF9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgICAgICAgICAgIkVDREgtUlNBLUFFUzEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgICJFQ0RILVJTQS1BRVMyNTYtU0hBIgorCisjZGVmaW5lIFRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAgICJFQ0RIRS1SU0EtTlVMTC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX1JDNF8xMjhfU0hBICAgICAgICAgICAgICJFQ0RIRS1SU0EtUkM0LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESEVfUlNBX1dJVEhfREVTXzE5Ml9DQkMzX1NIQSAgICAgICAgIkVDREhFLVJTQS1ERVMtQ0JDMy1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSAgICAgICAgICJFQ0RIRS1SU0EtQUVTMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBICAgICAgICAgIkVDREhFLVJTQS1BRVMyNTYtU0hBIgorCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfYW5vbl9XSVRIX05VTExfU0hBICAgICAgICAgICAgICAgICJBRUNESC1OVUxMLVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfRUNESF9hbm9uX1dJVEhfUkM0XzEyOF9TSEEgICAgICAgICAgICAgIkFFQ0RILVJDNC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfYW5vbl9XSVRIX0RFU18xOTJfQ0JDM19TSEEgICAgICAgICJBRUNESC1ERVMtQ0JDMy1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0VDREhfYW5vbl9XSVRIX0FFU18xMjhfQ0JDX1NIQSAgICAgICAgICJBRUNESC1BRVMxMjgtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9FQ0RIX2Fub25fV0lUSF9BRVNfMjU2X0NCQ19TSEEgICAgICAgICAiQUVDREgtQUVTMjU2LVNIQSIKKworLyogUFNLIGNpcGhlcnN1aXRlcyBmcm9tIFJGQyA0Mjc5ICovCisjZGVmaW5lIFRMUzFfVFhUX1BTS19XSVRIX1JDNF8xMjhfU0hBCQkJIlBTSy1SQzQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9QU0tfV0lUSF8zREVTX0VERV9DQkNfU0hBCQkiUFNLLTNERVMtRURFLUNCQy1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX1BTS19XSVRIX0FFU18xMjhfQ0JDX1NIQQkJIlBTSy1BRVMxMjgtQ0JDLVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfUFNLX1dJVEhfQUVTXzI1Nl9DQkNfU0hBCQkiUFNLLUFFUzI1Ni1DQkMtU0hBIgorCisvKiBDYW1lbGxpYSBjaXBoZXJzdWl0ZXMgZnJvbSBSRkM0MTMyICovCisjZGVmaW5lIFRMUzFfVFhUX1JTQV9XSVRIX0NBTUVMTElBXzEyOF9DQkNfU0hBCQkiQ0FNRUxMSUExMjgtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESF9EU1NfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkiREgtRFNTLUNBTUVMTElBMTI4LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhfUlNBX1dJVEhfQ0FNRUxMSUFfMTI4X0NCQ19TSEEJIkRILVJTQS1DQU1FTExJQTEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9EU1NfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkiREhFLURTUy1DQU1FTExJQTEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9SU0FfV0lUSF9DQU1FTExJQV8xMjhfQ0JDX1NIQQkiREhFLVJTQS1DQU1FTExJQTEyOC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0FESF9XSVRIX0NBTUVMTElBXzEyOF9DQkNfU0hBCQkiQURILUNBTUVMTElBMTI4LVNIQSIKKworI2RlZmluZSBUTFMxX1RYVF9SU0FfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQQkJIkNBTUVMTElBMjU2LVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfREhfRFNTX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJIkRILURTUy1DQU1FTExJQTI1Ni1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX1JTQV9XSVRIX0NBTUVMTElBXzI1Nl9DQkNfU0hBCSJESC1SU0EtQ0FNRUxMSUEyNTYtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfRFNTX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJIkRIRS1EU1MtQ0FNRUxMSUEyNTYtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfUlNBX1dJVEhfQ0FNRUxMSUFfMjU2X0NCQ19TSEEJIkRIRS1SU0EtQ0FNRUxMSUEyNTYtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9BREhfV0lUSF9DQU1FTExJQV8yNTZfQ0JDX1NIQQkJIkFESC1DQU1FTExJQTI1Ni1TSEEiCisKKy8qIFNFRUQgY2lwaGVyc3VpdGVzIGZyb20gUkZDNDE2MiAqLworI2RlZmluZSBUTFMxX1RYVF9SU0FfV0lUSF9TRUVEX1NIQSAgICAgICAgICAgICAgICAgICAgICAiU0VFRC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX0RTU19XSVRIX1NFRURfU0hBICAgICAgICAgICAgICAgICAgICJESC1EU1MtU0VFRC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIX1JTQV9XSVRIX1NFRURfU0hBICAgICAgICAgICAgICAgICAgICJESC1SU0EtU0VFRC1TSEEiCisjZGVmaW5lIFRMUzFfVFhUX0RIRV9EU1NfV0lUSF9TRUVEX1NIQSAgICAgICAgICAgICAgICAgICJESEUtRFNTLVNFRUQtU0hBIgorI2RlZmluZSBUTFMxX1RYVF9ESEVfUlNBX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgICAiREhFLVJTQS1TRUVELVNIQSIKKyNkZWZpbmUgVExTMV9UWFRfQURIX1dJVEhfU0VFRF9TSEEgICAgICAgICAgICAgICAgICAgICAgIkFESC1TRUVELVNIQSIKKworCisjZGVmaW5lIFRMU19DVF9SU0FfU0lHTgkJCTEKKyNkZWZpbmUgVExTX0NUX0RTU19TSUdOCQkJMgorI2RlZmluZSBUTFNfQ1RfUlNBX0ZJWEVEX0RICQkzCisjZGVmaW5lIFRMU19DVF9EU1NfRklYRURfREgJCTQKKyNkZWZpbmUgVExTX0NUX0VDRFNBX1NJR04JCTY0CisjZGVmaW5lIFRMU19DVF9SU0FfRklYRURfRUNESAkJNjUKKyNkZWZpbmUgVExTX0NUX0VDRFNBX0ZJWEVEX0VDREggCTY2CisjZGVmaW5lIFRMU19DVF9HT1NUOTRfU0lHTgkJMjEKKyNkZWZpbmUgVExTX0NUX0dPU1QwMV9TSUdOCQkyMgorLyogd2hlbiBjb3JyZWN0aW5nIHRoaXMgbnVtYmVyLCBjb3JyZWN0IGFsc28gU1NMM19DVF9OVU1CRVIgaW4gc3NsMy5oIChzZWUKKyAqIGNvbW1lbnQgdGhlcmUpICovCisjZGVmaW5lIFRMU19DVF9OVU1CRVIJCQk5CisKKyNkZWZpbmUgVExTMV9GSU5JU0hfTUFDX0xFTkdUSAkJMTIKKworI2RlZmluZSBUTFNfTURfTUFYX0NPTlNUX1NJWkUJCQkyMAorI2RlZmluZSBUTFNfTURfQ0xJRU5UX0ZJTklTSF9DT05TVAkJImNsaWVudCBmaW5pc2hlZCIKKyNkZWZpbmUgVExTX01EX0NMSUVOVF9GSU5JU0hfQ09OU1RfU0laRQkJMTUKKyNkZWZpbmUgVExTX01EX1NFUlZFUl9GSU5JU0hfQ09OU1QJCSJzZXJ2ZXIgZmluaXNoZWQiCisjZGVmaW5lIFRMU19NRF9TRVJWRVJfRklOSVNIX0NPTlNUX1NJWkUJCTE1CisjZGVmaW5lIFRMU19NRF9TRVJWRVJfV1JJVEVfS0VZX0NPTlNUCQkic2VydmVyIHdyaXRlIGtleSIKKyNkZWZpbmUgVExTX01EX1NFUlZFUl9XUklURV9LRVlfQ09OU1RfU0laRQkxNgorI2RlZmluZSBUTFNfTURfS0VZX0VYUEFOU0lPTl9DT05TVAkJImtleSBleHBhbnNpb24iCisjZGVmaW5lIFRMU19NRF9LRVlfRVhQQU5TSU9OX0NPTlNUX1NJWkUJCTEzCisjZGVmaW5lIFRMU19NRF9DTElFTlRfV1JJVEVfS0VZX0NPTlNUCQkiY2xpZW50IHdyaXRlIGtleSIKKyNkZWZpbmUgVExTX01EX0NMSUVOVF9XUklURV9LRVlfQ09OU1RfU0laRQkxNgorI2RlZmluZSBUTFNfTURfU0VSVkVSX1dSSVRFX0tFWV9DT05TVAkJInNlcnZlciB3cml0ZSBrZXkiCisjZGVmaW5lIFRMU19NRF9TRVJWRVJfV1JJVEVfS0VZX0NPTlNUX1NJWkUJMTYKKyNkZWZpbmUgVExTX01EX0lWX0JMT0NLX0NPTlNUCQkJIklWIGJsb2NrIgorI2RlZmluZSBUTFNfTURfSVZfQkxPQ0tfQ09OU1RfU0laRQkJOAorI2RlZmluZSBUTFNfTURfTUFTVEVSX1NFQ1JFVF9DT05TVAkJIm1hc3RlciBzZWNyZXQiCisjZGVmaW5lIFRMU19NRF9NQVNURVJfU0VDUkVUX0NPTlNUX1NJWkUJCTEzCisKKyNpZmRlZiBDSEFSU0VUX0VCQ0RJQworI3VuZGVmIFRMU19NRF9DTElFTlRfRklOSVNIX0NPTlNUCisjZGVmaW5lIFRMU19NRF9DTElFTlRfRklOSVNIX0NPTlNUICAgICJceDYzXHg2Y1x4NjlceDY1XHg2ZVx4NzRceDIwXHg2Nlx4NjlceDZlXHg2OVx4NzNceDY4XHg2NVx4NjQiICAvKmNsaWVudCBmaW5pc2hlZCovCisjdW5kZWYgVExTX01EX1NFUlZFUl9GSU5JU0hfQ09OU1QKKyNkZWZpbmUgVExTX01EX1NFUlZFUl9GSU5JU0hfQ09OU1QgICAgIlx4NzNceDY1XHg3Mlx4NzZceDY1XHg3Mlx4MjBceDY2XHg2OVx4NmVceDY5XHg3M1x4NjhceDY1XHg2NCIgIC8qc2VydmVyIGZpbmlzaGVkKi8KKyN1bmRlZiBUTFNfTURfU0VSVkVSX1dSSVRFX0tFWV9DT05TVAorI2RlZmluZSBUTFNfTURfU0VSVkVSX1dSSVRFX0tFWV9DT05TVCAiXHg3M1x4NjVceDcyXHg3Nlx4NjVceDcyXHgyMFx4NzdceDcyXHg2OVx4NzRceDY1XHgyMFx4NmJceDY1XHg3OSIgIC8qc2VydmVyIHdyaXRlIGtleSovCisjdW5kZWYgVExTX01EX0tFWV9FWFBBTlNJT05fQ09OU1QKKyNkZWZpbmUgVExTX01EX0tFWV9FWFBBTlNJT05fQ09OU1QgICAgIlx4NmJceDY1XHg3OVx4MjBceDY1XHg3OFx4NzBceDYxXHg2ZVx4NzNceDY5XHg2Zlx4NmUiICAvKmtleSBleHBhbnNpb24qLworI3VuZGVmIFRMU19NRF9DTElFTlRfV1JJVEVfS0VZX0NPTlNUCisjZGVmaW5lIFRMU19NRF9DTElFTlRfV1JJVEVfS0VZX0NPTlNUICJceDYzXHg2Y1x4NjlceDY1XHg2ZVx4NzRceDIwXHg3N1x4NzJceDY5XHg3NFx4NjVceDIwXHg2Ylx4NjVceDc5IiAgLypjbGllbnQgd3JpdGUga2V5Ki8KKyN1bmRlZiBUTFNfTURfU0VSVkVSX1dSSVRFX0tFWV9DT05TVAorI2RlZmluZSBUTFNfTURfU0VSVkVSX1dSSVRFX0tFWV9DT05TVCAiXHg3M1x4NjVceDcyXHg3Nlx4NjVceDcyXHgyMFx4NzdceDcyXHg2OVx4NzRceDY1XHgyMFx4NmJceDY1XHg3OSIgIC8qc2VydmVyIHdyaXRlIGtleSovCisjdW5kZWYgVExTX01EX0lWX0JMT0NLX0NPTlNUCisjZGVmaW5lIFRMU19NRF9JVl9CTE9DS19DT05TVCAgICAgICAgICJceDQ5XHg1Nlx4MjBceDYyXHg2Y1x4NmZceDYzXHg2YiIgIC8qSVYgYmxvY2sqLworI3VuZGVmIFRMU19NRF9NQVNURVJfU0VDUkVUX0NPTlNUCisjZGVmaW5lIFRMU19NRF9NQVNURVJfU0VDUkVUX0NPTlNUICAgICJceDZkXHg2MVx4NzNceDc0XHg2NVx4NzJceDIwXHg3M1x4NjVceDYzXHg3Mlx4NjVceDc0IiAgLyptYXN0ZXIgc2VjcmV0Ki8KKyNlbmRpZgorCisvKiBUTFMgU2Vzc2lvbiBUaWNrZXQgZXh0ZW5zaW9uIHN0cnVjdCAqLworc3RydWN0IHRsc19zZXNzaW9uX3RpY2tldF9leHRfc3QKKwl7CisJdW5zaWduZWQgc2hvcnQgbGVuZ3RoOworCXZvaWQgKmRhdGE7CisJfTsKKworI2lmZGVmICBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYK